[
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n*  text=auto\n\n# Explicitly declaring text files we want to always be normalized and converted \n# to native line endings on checkout.\n\n*.cs     text \n*.java   text \n*.html   text \n*.css    text\n*.js     text\n*.sql    text\n*.cpp    text\n*.h      text\n*.rm     text\n*.pro    text\n*.pri    text\n*.txt    text \n*.md     text\n\n# Declare files that will always have CRLF line endings (Windows) on checkout.\n\n*.bat    text eol=crlf\n\n# Declare files that will always have LF line endings (Unix) on checkout.\n\n*.sh     text eol=lf\n\n#\n# Binary files\n# \n\n*.png   binary\n*.so    binary\n*.jpg   binary\n*.gif   binary\n*.dll   binary\n*.exe   binary\n*.doc   binary\n*.docx  binary\n*.lib   binary"
  },
  {
    "path": ".gitignore",
    "content": "# Robomongo-specific\n\nCMakeLists.txt.user*\n\n.sconsign.dblite\n.sconf_temp\n.scons\n\n*.kate-swp\n*.swp\n\ntarget/\ntarget-debug/\ntarget-release/\nlibs/\n\n/build\n/build2\n\n/src/robomongo/robomongo.pro.user.1.3\n\n.idea/\n\n# Created by http://www.gitignore.io\n\n### C++ ###\n# Compiled Object files\n*.slo\n*.lo\n*.o\n*.obj\n\n# Compiled Dynamic libraries\n*.so\n*.so.*\n*.dylib\n*.dll\n\n# Compiled Static libraries\n*.lai\n*.la\n*.a\n*.lib\n\n# Executables\n*.exe\n*.out\n*.app\n\n### Linux ###\n*~\n\n# KDE directory preferences\n.directory\n\n\n### OSX ###\n.DS_Store\n.AppleDouble\n.LSOverride\n\n### Qt ###\n# C++ objects and libs\n\n*.slo\n*.lo\n*.o\n*.a\n*.la\n*.lai\n*.so\n*.dll\n*.dylib\n\n# Qt-es\n\n/.qmake.cache\n/.qmake.stash\n*.pro.user\n*.pro.user.*\n*.moc\n\n# QtCreator\n\n*.autosave\n*.creator.user\n\n\n### Windows ###\n# Windows image file caches\nThumbs.db\nehthumbs.db\n\n# Folder config file\nDesktop.ini\n\n# Recycle Bin used on file shares\n$RECYCLE.BIN/\n.vscode/settings.json\n.vs/\n"
  },
  {
    "path": ".travis.yml",
    "content": "os:\n  - linux\n  # - osx\n  # - windows\n\ndist: xenial\nsudo: require\nlanguage: cpp\n\nscript:\n  - bash bin/clean\n  - bash bin/configure \n  # - bash bin/build\n  # - bash bin/run-unit-tests \n\n# end of file\n"
  },
  {
    "path": "CHANGELOG",
    "content": "\nDownload latest version: \nhttps://robomongo.org/download\n\nRobo 3T 1.4.4 (Aug/2021)\n  New Features:\n  - Support for Standard Connection String Format (Mongo URI)\n  Fixes:\n  - Fix Welcome Tab not loading the new content issue by disable/bypass HTTP cache\n\nRobo 3T 1.4.3 (Jan/2021)\n  New Features:\n  - macOS Big Sur support \n  - New Welcome Tab - embeds Chromium using QtWebEngine (Windows, macOS only)\n  - Database explorer section has smaller default width (#1556)\n  - Remember size of database explorer section\n  - Import keys from old version: autoExpand, lineNumbers, debugMode and shellTimeoutSec\n\n  Fixes:\n  - Disable unsupported SSH tab for replica set connections (#1285 #1340)\n  - Fix crash when new shell tab executed in server unreachable case\n  - Fix crash when paging used in tabbed result window (#1661)\n  - Fix broken F2, F3, F4 shortcuts for tabbed result view\n  - One time re-order limit per new connections window to prevent data loss (macOS, #1790)\n  - Fix previously broken IPv6 support from command line: robo3t --ipv6\n\nRobo 3T 1.4.2 (Oct/2020)\n  Fixes:\n  - Fix broken paging in DocumentDB (#1694)\n\nRobo 3T 1.4.1 (Sep/2020)\n  Fixes:\n  - Force light mode on macOS (#1761, #1768, #1771)  \n  - Fix broken macOS native theme/look (#1766)\n  - Fix broken Windows native theme/look  \n\nRobo 3T 1.4.0 (Aug/2020)\nblog.robomongo.org/robo-3t-1-4/\n\n  New Features:\n  - Mongo shell 4.2 upgrade\n  - Support for Ubuntu 20.04 and macOS 10.15 (Catalina)  \n  - SSH: ECDSA and Ed25519 keys support on Windows & macOS (#1719, #1530, #1590)\n  - Manually specify visible databases (#1696, #1368, #389)\n\n  Improvements:\n  - Qt Upgrade (v5.12.8 - Apr/2020, Windows & macOS only)\n  - OpenSSL upgrade (v1.1.1f - Mar/2020, Windows & macOS only)\n  - libssh2 upgrade (v1.9.0 - Jun/2019, Windows & macOS only)\n\n  Fixes:\n  - Authentication database option isn't used properly (#1696)\n  - Add/Edit index ops fixed (re-written) (#1692) \n  - Crash when expanding admin users (#1728) \n  - Unable to run query after shell timeout reached (#1529)\n\nRobo 3T 1.3.1 (Apr, 2019)\nhttp://blog.robomongo.org/robo-3t-1-3\n\n  New Features:\n  - Biggest change in this version is Mongo Shell version upgrade from 3.4 to 4.0.5.\n  - Support for importing from DNS SRV based MongoDB connection strings\n  - Query results windows now supports tabbed output #1591 #1403\n  - Adding support for SCRAM-SHA-256 auth mechanism #1569\n  - Support for Ubuntu 18.04 and Mac 10.14.\n  - Support for creating version 4 UUID #1554\n\n  Improvements:\n    - Encrypted passwords are used in config. file instead of clear text passwords \n    - Showing much better error reason string from Mongo drivers for connection failures\n\n  Fixes:\n    - Broken create/edit/view user features fixed and updated #638 #1041\n    - Attempt to fix #1547: Crash when right click on existing results plus a new long running query\n    - Fix for application crash when adding index with invalid JSON\n    - 'Repair Database' in Robo3T needs a confirm dialog box #1568\n    - Robo 3T the input space causes connection failure #1551\n    - Crash when loading results + right click #1547\n    - Attempt to fix major connection problems seen with the second edit/add/remove document operation after MongoDB 4.0 upgrade #1603\n    - Attempt to fix #1581: For CRUD ops showing progress bar and disabling context menu while waiting for edit op to finish\n    - Fixing UI issue where Functions folder freezing with \"Functions...\" when fails to refresh\n    - Fix for #1529: Pagination does not work when the aggregation queries have dotted fields\n\nRobo 3T 1.3.0 Beta (16 Feb, 2019)\nDetails: https://github.com/Studio3T/robomongo/releases/tag/v1.3.0-beta\n\nRobo 3T 1.2.1 (19 Feb, 2018)   \nhttp://blog.robomongo.org/robo-3t-1-2\n    \n  Fixes:\n    - Aggregate query results are not pagaeble \n    - Big double numbers are showing incorrectly #1447\n    - Editing a document from a projection causes data loss (override) (#881)\n    - Error: Resources temporarily unavailable. Error when starting up SSH session: -8 #1426\n    - robo3t 1.1 failed to start on Ubuntu 17.04 #1385\n    - Robo 3T is not opening on MacOS High Sierra (#1412)\n    - Cannot load list of indexes #1454\n    - Robo 3T is not buildable on latest MacOS High Sierra\n\t\n  Improvements \n    - Qt version upgraded from Qt 5.7.0 to Qt 5.9.3\n    - Auto switch to HTTP from HTTPS if the program crashes due to HTTPS related operations \n    - Improvements for Robo 3T is crashing constantly on High Sierra #1412\n    - PR: Improved query time formatting (#1358) #1455\n            \nRobo 3T 1.2.0 Beta (18 Dec, 2017)   \nhttps://github.com/Studio3T/robomongo/releases/tag/v1.2.0-beta\n    \n  Improvements & Fixes:\n    - Qt version upgraded from Qt 5.7.0 to Qt 5.9.3\n    - Fix for \"Cannot load list of indexes #1454\"\n    - Improvements for Robo 3T is crashing constantly on High Sierra #1412\n    - PR: Improved query time formatting (#1358) #1455\n    - Fix for \"Robo 3T is not buildable on latest MacOS vesion High Sierra\"\n    - Fix attempt for \"Error: Resources temporarily unavailable. Error when starting up SSH session: -8 #1426\"\n    - Fix for \"robo3t 1.1 failed to start on Ubuntu 17.04 #1385\"      \n      \nRobo 3T 1.1 (13 June, 2017)\nhttp://blog.robomongo.org/robomongo-1-1/\n\n  New Features:\n    - MongoDB 3.4 support\n    - New NumberDecimal (Decimal128) data type support\n    - ECMAScript 2015 aka ES6 Support (Modernized JavaScript Implementation)\n    - Re-naming from Robomongo to Robo 3T\n\n  Improvements & Fixes:\n    - Stability Improvements: Fix included to prevent a crash on MACOS Sierra\n    - Shell timeout is configurable on UI now 'Options->Change Shell Timeout'\n    - Fix for Robomongo Shell Timeout Issue (silently, prematurely finishing long lasting scripts) \n    - Security Improvements: OpenSSL version upgrade to openssl-1.0.1u (22-Sep-2016)\n    - Tool chain upgrades: Modern C++14 features are enabled and usable for developers\n              \nRobomongo 1.1 Beta (12 May, 2017)   \nhttps://github.com/Studio3T/robomongo/releases/tag/v1.1.0-beta\n    \n  New Features:\n    - MongoDB 3.4 Support \n    - New NumberDecimal (Decimal128) data type support\n    - ECMAScript 2015 (Modernized JavaScript Implementation aka ES6) Support  \n      \n  Improvements:\n    - Security Improvements: OpenSSL version upgrade to openssl-1.0.1u (22-Sep-2016)\n    - Tool Chain Improvements: Modern C++14 features are enabled \n\nRobomongo 1.0 (21 Apr, 2017)\nhttp://blog.robomongo.org/robomongo-1-0\n    \n  New Features:\n    - Update Notifications Bar\n    - Welcome Tab\n    - Welcome Wizard\n\n  Improvements:\n    - Replica set name configurable on UI\n    - Configuration file system location change\n    - \"About Robomongo\" dialog changes\n  \n  Fixes:\n    - Fix to avoid the same set name problem (https://github.com/Studio3T/robomongo/issues/1302)\n    - Timestamp value is represented incorrectly (https://github.com/Studio3T/robomongo/issues/1159)\n    - Local Timezone shows wrong date (https://github.com/Studio3T/robomongo/issues/501)\n    - Time zone shown as \"000:00\" when UTC +00:00 is used as local timezone(https://github.com/Studio3T/robomongo/issues/1309)\n  \nRobomongo 1.0-RC1 (1 Feb, 2017)\nhttp://blog.robomongo.org/robomongo-1-rc1/\n    \n  New Features:\n    - Replica set support.\n    - New 'Attributes' column in connections list window showing connection properties such as 'Replica Set', 'SSL' and 'SSH'.  \n    - New operation logging for almost all operations.\n\n  Improvements:\n    - Improved error handling (no double error windows) for all fail and success conditions for the following operations:\n      . Create, Drop Database\n      . Create, Edit User\n      . Create, Drop, Duplicate, Rename Collection\n      . Insert Document\n      . Remove document, Delete document, Remove all documents (triggered both from explorer and from result widget)\n      . Refresh Users\n      . Refresh Functions\n      . Refresh Collections\n      . Connection establish & refresh server fail and success cases.\n    - Windows size is saved and restored for Edit, View and Insert Document dialogs.\n    - Connections are automatically imported from the latest Robomongo version.\n    - Better error reporting/handling and logging have been added for the operations below:\n      . Create, Drop Function\n      . Drop User\n    - More informative and adjusted log level prefix strings haven added for log window. (Error, Warn, Info etc..).\n    - After a new connection is created, now the focus goes to the newly created connection (end of list) instead of the \n      beginning of connections list. And when Robomongo is opened, the focus goes to the end of the connection list instead \n      of beginning. \n    - Error messages added and error handling for 'remove document', 'remove all documents' operations triggered explorer \n      and single or multi 'delete document' from results window have been re-implemented and improved.\n    - Relevant errors are shown for the following cases now:        \n      . Drop attempt of non-existing collection.\n      . Duplicating a collection with a collection name which already exists finishes silently.\n  \n  Fixes:\n    - Fix for the problem where the connections list comes empty if the Robomongo config file or it's directory do not exist.\n    - Fix for the problem where 'in-progress bar' widget was not centered on main window for \"Update Documents/Remove Documents\" \n      operations. https://github.com/paralect/robomongo/issues/1256\n    - Fix for two problems where the operations 'insert or update documents' in one tab was causing auto reloading of other \n      unrelated tabs and also multiple error windows to popup. https://github.com/paralect/robomongo/issues/1236\n    - Fix for the problem where the operations 'remove document', 'remove all documents' triggered explorer and single or \n      multi 'delete document' from results window were causing auto reloading of other unrelated tabs.\n        \n      \nRobomongo 0.9:\n  Major Features: \n    - Support for MongoDB 3.x and WiredTiger engine. Robomongo now embeds MongoDB 3.2 shell. \n      (Ability to use the latest shell functionality)\n    - SSH tunnel support for connections\n    - SSL support \n    - MongoDB Atlas (Cloud MongoDB) support\n    - Both MONGODB-CR and SCRAM-SHA-1 authentication mechanisms are supported. \n    - Allow direct connections to Replica Set members and support IPv6 protocol. \n    - Loading of huge list of collections is now faster.\n    - Create Collection dialog is now expandable to support all advanced options.\n      (Supporting all major mongoDB versions 3.2, 3.0, 2.6 and all storage engine types (WiredTiger \n      and MMAPV1) is added.) \n    - Windows High DPI support.\n    - Full size editor with dockable output window.\n    \n  Fixed:\n    - Incorrect representation of floating-point numbers (fixed since RC3). This bug was a reason of a big number of issues:\n      #910, #748, #697, #699, #760, #815, #870, #892, \n      #894, #905, #945, #974, #978, #990, #831, #842\n    - SSH connection failure to servers on Ubuntu and OS X with the following error:\n      \"Resource temporarily unavailable. Error when starting up SSH session: -8\"  (#1090)     \n      \n  What's new in 0.9.0 Final (30 Sep, 2016)\n  http://blog.robomongo.org/robomongo-0-9-0-final/\n  \n    New Features:\n      - Full size editor with dockable output window.\n      - New JSON object context menu items: \"Copy Name\" and \"Copy Path\" are added.\n      - New database context menu items: \"Current Operations\" and \"Kill Operation\" are added.\n      - Minimize to Tray Icon for Windows.\n        \n    Other Changes\n      - Cloud platforms Compose, mLab and Amazon EC2 were tested and added as supported platforms.\n      - Maximize/Restore result button behavior and icon have been improved.\n      - For better code quality and code reviews, Robomongo Code Quality and Robomongo Code Review pages have been created.\n        https://github.com/paralect/robomongo/wiki/Robomongo-Code-Review\n        https://github.com/paralect/robomongo/wiki/Robomongo-Code-Quality\n \n  What's new in RC10 (Aug 8, 2016)\n  http://blog.robomongo.org/robomongo-rc10/\n  \n    New Features:\n      - SSL connections with advanced options are now supported.\n      - MongoDB Atlas (Cloud MongoDB) is supported.\n      - Cross Platform High DPI enhancements. \n    \n    Enhancements:\n      - For better security, OpenSSL has been upgraded to OpenSSL 1.0.1p.\n      - Qt has been updated from Qt 5.5 to latest Qt 5.7. With this update there are many \n        enhancements including cross platform High DPI support.\n\n  What's new in RC9 (May 30, 2016)\n  http://blog.robomongo.org/robomongo-rc9/\n  \n    New Features:\n      - Create Collection dialog with advanced options.\n      - New feature has been added to save/restore window sizes. (#1102)\n      - Connection settings from previous versions of Robomongo are \n        now automatically imported starting from Robomongo 0.9.0 RC9. (#1086)\n      - Support for querying documents by UUIDs is added, both in legacy and new encoding. (#432)\n       \n    Fixed:\n      - SSH connection failure to servers on Ubuntu and OS X with the following error:\n        \"Resource temporarily unavailable. Error when starting up SSH session: -8\"  (#1090)\n      - Correct handling of create/drop of databases and collections. (#1083)\n    \n  What's new in RC8 (April 14, 2016)\n  http://blog.robomongo.org/robomongo-rc8/\n     \n  What's new in RC7 (March 4, 2016)\n  http://blog.robomongo.org/robomongo-rc7\n\n  What's new in RC6 (February 13, 2016)\n  http://blog.robomongo.org/ipv6-protocol\n\n  What's new in RC5 (February 8, 2016)\n  http://blog.robomongo.org/campaign-is-over-robomongo-is-not/\n\n  What's new in RC4 (February 1, 2016)\n  http://blog.robomongo.org/robomongo-rc4\n\n  What's new in RC3 (January 29, 2016)\n  http://blog.robomongo.org/robomongo-0-9-0-rc3-released\n\n  What's new in RC2 (January 26, 2016)\n  http://blog.robomongo.org/robomongo-rc2-for-windows-mac-os-x-and-linux\n  \n  What's new in RC1 (January 17, 2016)\n  http://blog.robomongo.org/robomongo-rc1-with-full-support-for-mongodb-3\n\n\n0.8.5 / March 10, 2015\n\n  Release 0.8.5 is now deprecated because of a critical bug, that is\n  described here: http://blog.robomongo.org/robomongo-0-9-0-rc3-released\n\n  We recommend to use Robomongo 0.9.0 or newer.\n\n  * [Stephen Steneker]\n    - OS X build fixes for XCode 5 / libc++ (#524)\n    - OS X specific keyboard shortcut tips (#505)\n    - View documents fail if collection name is \"group\" (#414)\n    - Problem with slash in collection names (#404)\n    - Add shortcut to open JS file (#408)\n    - Fullscreen mode not working on OS X (#519)\n    - Usability request - add initial curly braces to command bar (#506)\n    - TTL index should allow expiry of 0 seconds (#500)\n    - Add line numbers to JSON editing windows on OS X (#449)\n    - Add user preference to have line numbers displayed by default (#564)\n    - Space after document causes validation error (#544)\n    - Expand current server as soon as you connect to it (#405)\n    - Switching tabs using standard keys on OS X (#87)\n    - Cannot make the Edit Document Window smaller (#548)\n    - Consistent numbering for tree/table/text view items (#421)\n    - Reload Query with keyboard shortcut doesn't work (#551)\n    - Rename \"Reload\" to \"Re-execute query\" (#447)\n    - Add \"Copy Timestamp from ObjectId\" to context menu for ObjectId fields (#559)\n    - Bug: Type of Double changed to Int32 on save document (#622)\n    - \"Duplicate Query In New Tab\": add to Window menu with keyboard shortcut (#631)\n    - No errors logged if settings directory cannot be created or settings file cannot be written to (#636)\n    - Show execution time for operations that don't return results (#455)\n    - Disable broken \"Copy Collection to Database\" misfeature (#398)\n  * [Vladimir Belozyorov]\n    - View mode reset to default after no results (#509)\n    - Comment / uncomment selected code in the shell (#467)\n    - Passphrase and password should be hidden in authentication tab (#433)\n    - Cursor initialization - place between curly brackets for default find({}) query (#592)\n    - Include full date/time for log entries (#596)\n    - Option to disable selected code autoexecution when opening a new tab (#514)\n    - Tooltip fixes to match current keyboard shortcuts (#598)\n    - Expand/collapse multiple selections (#591)\n    - Changes in toolbars visibility are saved in config file (#457)\n    - Include connection name under shell tabs (#47)\n  * [Sergey Gavruk]\n    - SettingsManager typo (#558)\n    - Ability to disable autocompletion (#512)\n  * [Kanstantsin Kamkou]\n    - Increase display width for limit & offset input fields (#458)\n  * [volans-]\n    - CreateUserDialog.cpp: fixed typo in warning message\n  * [Andres Kievsky]\n    - Added new app icon in a variety of png and iDraw formats (#693)\n  * [Michael Steinacher]\n    - Retina text display support (#724)\n\n0.8.4 / November 27, 2013\n\n  Read about updates in this version here:\n  http://robomongo.org/whats-new-in/robomongo-0.8.4.html\n\n  RC1:\n  \n  * SSH support (#117)\n  * SSL support (first steps) (#100)\n  * Create or edit index problem (#341)\n  * Regexp error (with non-latin symbols) (#351)\n  * Support for latin characters in edit document console (#347)\n  * Robomongo fails to execute shell \"comments\" if the comment contains a non-latin character! (#334)\n  * Crash when add ISODate field (#350)\n  * Crash at executing several disconnections in a row (#290)  \n  * Deleting multiple documents prompts for each document (#386)\n  * Connection context menu appears independently of position of Robomongo instance.\n  * Crash at pressing \"Ctrl+T\" without any connection.  \n  \n  RC2:\n  \n  * SSH now works on Mac OS X Mavericks (#401)\n  * Fixed crash when parsing date (#356)\n  \n  Final:\n  \n  * Selected view mode of result panels now preserved between executions. Implemented by Vladimir Belozyorov (github.com/VBelozyorov) (#402)\n\n\n0.8.3 / October 1, 2013\n\n  Read about updates in this version here:\n  http://robomongo.org/whats-new-in/robomongo-0.8.3.html\n  \n  * Enable query logging (#108)\n  * Inserting multiple documents from UI (#173)\n  * Removing multiple documents from UI (#174)\n  * Retain current view mode when running search (#93, #79)\n  * Left panel collections/functions/users navigation doesn't work when authenticating against the DB (#282)\n  * A way to disable Alt + number shortcut (#192)\n  * Support mongodb 2.4.x style users (#139)\n  * Add \"Copy JSON\" menu item to context menu (#298)\n  * JSON list validation (#246)\n  * Crash creating new Database (#291)\n  * Incorrect handling of TTL Indexes (#313)\n  * Add the document _id in the tree view (#142)\n  * BSON Undefined type doesn't rendered to string correctly (#306)\n  * Entering incorrect symbols as database name isn't handled properly (#262)\n  * Ability to select UI theme\n  * We now show number of fields (inside objects) and number of items (inside arrays) in Tree View.\n  * Support for Mac OS X 10.6 (#287)\n  * Support for Mac OS X 10.9 (#254)\n\n  \n0.8.2 / September 13, 2013\n\n  Read about updates in this version here:\n  http://robomongo.org/whats-new-in/robomongo-0.8.2.html  \n\n\n0.8.1 / September 6, 2013\n\n  Read about updates in this version here:\n  http://robomongo.org/whats-new-in/robomongo-0.8.1.html\n\n  * Table Mode (in this version, only for the first-level fields in documents) (#72)\n  * Paging Widget tweaks (#247, #203, #244, #243)\n  * ~/.robomongorc.js file is loaded automatically when new shell is opened \n    (c:\\Users\\Name\\.robomongorc.js for Windows)\n  * \"Load .mongorc.js\" menu item in \"Options\" top-level now allow to enable/disable loading\n    of ~/.mongorc.js file. By default it will not load this file.\n  * Batch Size now configurable (in this version only manually via ~/.config/robomongo.json)\n  * JSON parser doesn't correctly parse numbers when locale isn't en_EN (#246, #253)\n  * \"Display Dates In\" options doesn't saved/loaded correctly (#261)\n  * [Linux] Support for CentOS\n  * [Linux] Linux packages now takes 2x less space (10mb instead of 20mb)\n  * [Windows] Desktop icon isn't created despite corresponding checkbox was checked at installation. (#260)\n  * [Windows] Invalid symbols in installer for Windows if display language of system isn't English (#259)\n  \n  \n0.8.0 / August 23, 2013\n\n  Read about updates in this version here:\n  http://robomongo.org/whats-new-in/robomongo-0.8.0.html\n\n  * Ability to save and load files for currently opened shell (#96)\n  * MongoDB Index management (#74)\n  * Expand all children recursively  (#106)\n  * Ability to toggle line numbers (press F11) for any editor in Robomongo  (#112)\n  * View Mode settings is persisted now (thanks, Luke Thompson!) (#114)\n  * Search capability for any editor in Robomongo - press (Ctrl + F) (#32)\n  * Timezone support: UTC or Local (#224)\n  * Auto-complete on \"Tab\" (#95)\n  * Fixed incorrect handling of Dates (#111)\n  * Fixed incorrect handling of collections with leading underscore (_) symbol (#109)\n  * Fixed incorrect rendering of float numbers (#115)\n  * Fixed incorrect handling of Int64 numbers (#157)\n  * Fixed incorrect parsing of DBRef sub-objects (#113)\n  * New build system, based on CMake. Greatly simplified build and package process.\n  * Qt updated to 5.1 version.\n  * QScintilla updated to 2.7.2 version.\n\n\n0.7.1 / April 13, 2013\n\n  * Fixed crash when right-clicking on non-primitive elements in Tree View (#85)\n  * Alt + Cmd + Arrow for switching tabs on Mac (#82)\n  * Several minor bugs fixed (including #82)\n\n\n0.7.0 / April 4, 2013\n\n  * Support for UUIDs (read more: http://robomongo.org/articles/uuids.html)\n\n\n0.6.9 / April 3, 2013\n\n  * Password is hidden by default (#65)\n  * Fixed incorrect rendering of large values for the db.stats() results (#70)\n  * Collection names with invalid (for JS var name) characters now rendered correctly (#71)\n\n\n0.6.8 / April 1, 2013\n\n  * Support for '~/.mongorc.js'\n  * Various Mac OS X UI fixes\n  * Fixed crash when pressing Ctrl + W (#60)\n  * \"Copy Value\" context menu item for documents in Tree View\n\n\n0.6.7 / March 26, 2013\n\n  * Fixed creation of new tabs based on the current one. Before this fix initial \n    database for new tab wasn't identical to the \"parent\". (#56)\n  * Support for collections that starts from digits (#54)\n  * [Sergey Gavruk] Duplicate Collection feature (Collection -> Duplicate Collection\n  * Collection -> Reindex  will not run immediately, as before\n  * Fixed incorrect disposing of tabs resources (connections etc.) (#42)\n  * [Stephen Steneker] Fixed KeepAlive invalid commands, when not authorised (#41) \n  * [Sergey Gavruk] Various Mac OS X UI fixes.\n\n\n0.6.6 / March 23, 2013\n\n  * Fixed possible crash when viewing results in text mode (#34)\n  * Fixed possible crash when testing connection (Diagnostic window)\n  * Memory leak in explorer's database tree fixed.\n\n\n0.6.5 / March 17, 2013\n\n  * Fixed \"Dropped connection\" issue (#28).\n  * Windows Installer now be used to destribute Robomongo.\n\n\n0.6.4 / March 10, 2013\n\n  * Support for JS functions. Create/Edit/Remove/View.\n  * Loading indicators (three dots for now) for Server, Collections, Functions and Users.\n  * Count indicators for Server (number of databases), Collections, Functions and Users.\n  * No need to type \"functionName.toString()\". You can output source of function \n    by simply typing its name (like in the shell).\n  * Support for RegEx, Code and CodeWScope bson elements. But you still cannot edit \n    documents which contains Code or CodeWScope bson elements.\n  * About dialog added.  \n\n\n0.6.3 / March 5, 2013\n\n  * Script execution can be stopped (this works only for JS code in SpiderMonkey VM) (#23)\n  * Toolbar buttons shown only if needed (#21, #20)\n  * MongoDB Connections window opens when application starts.\n  * Some changes in menu items locations (#25, #26)\n  * View Mode buttons moved to Options menu.\n  * Full Screen and Logs functionality hidden right now (postponed for versions after Robomongo 1.0)\n  \n\n0.6.2 / March 4, 2013\n\n  * \"Users\" folder now shows list of users.\n  * User can be added (Database -> Add User)\n  * User can be edited (User -> Edit User)\n  * User can be removed (User -> Remove Users)\n  * Users can be refreshed (Users (folder) -> Refresh Users)\n  * List of users can be viewed in the shell (Users (folder) -> View Users)\n\n\n0.6.1 / March 2, 2013\n\n  * Minor script editor and viewer tweaks\n  \n\n0.6.0 / Feb 28, 2013\n\n  * Database can be created from UI (Server -> Create Database)\n  * Database can be dropped from UI (Database -> Drop Database)\n  * Collection can be created from UI (Database -> Create Collection)\n  * Collection can be dropped from UI (Collection -> Drop Collection)\n  * Collection can be renamed from UI (Collection -> Rename Collection)\n  * All documents can be removed from UI (Collection -> Remove All Documents)\n  * Minor tweaks in naming of context menu items.\n\n\n0.5.7 / Feb 27, 2013\n\n  * Support for Custom View Modes. First custom view implemented for \"db.printCollectionStats()\" query. You \n    still can view multiple output results, even if one of them presented in custom mode.\n  * \"Show Log\" context menu item for servers in Explorer.\n\n\n0.5.6 / Feb 26, 2013\n\n  * Support for one-line MongoDB commands (\"show dbs\", \"show collection\", \"use somedb\" etc.). This commands can\n    be repearted (this will result in multiple output results) or they can be used together with ordinary JavaScript.\n    The only rule: this command should be the only text on the line, starting from the very beginning of the line. \n  * Refresh of databases and collections via \"Refresh\" context menu item.\n  * This version of Robomongo is the first version compiled in release mode. It works much more faster and uses lower \n    amount of memory.\n    \n\n0.5.5 / Feb 22, 2013\n\n  * New document can be added in a more user friendly way. There are two ways to do it:\n    1) Right-click on collection in Explorer and select \"Insert Document\"\n    2) Right-click at any place of Tree View and select \"Insert Document\"\n  * Better formatting of JSON with correct indention.\n  * Support for ISODate(...) factory function in JSON parser and builder. Date in JSON mode now always \n    displayed as ISODate(...), like in the shell. Document Editor accepts dates in two forms:\n    as \"new Date(<millisecs>)\" and \"ISODate(<iso_8601_date_string>)\" (this behaviour identical to MongoDB shell behaviour)\n  * Document editor implemented. Right-click on document in Tree View and select \"Edit\".\n  * Document viwer implemented. Right-click on document in Tree View and select \"View\".\n  * You can delete selected document in Tree View. (Right-click and select \"Delete\")\n  * Validation of JSON in Document Editor/Viewer with error report, highlighting of errors and \n    cursor positioning just where error is.\n  * Fixed problem with \"signed\" dates (dates before Unix Epoch) (#5)\n  * Fixed problem with UTF-8 (#17)\n  * Fixed problem with loading indicator in Explorer (#18)\n\n\n0.5.2 / Jan 26, 2013\n  \n  In this version autocompletion in Robomongo becomes mostly usable.\n\n  * AutoCompletion box now placed just near text you typed (in correct line and column)\n  * AutoCompletion now works in the middle of the text (not only at the end of line, as before)\n  * Ctrl + Space will trigger autocompletion for symbols under cursor. \n  * If you select function in autocompletion box, their open parenthesis will overwrite existing in the text, if such available.\n\n\n0.5.1 / Jan 24, 2013\n\n  * Several autocompletion tweaks.\n\n\n0.5.0 / Jan 24, 2013\n\n  * AutoCompletion. First version.\n  * Progress indicator for shells.\n  * Shell result panels now have equal size, if this is possible.\n  * Code cleanuped a bit.\n\n\n0.4.6 / Jan 11, 2013\n\n  * Tooltip for collections with count and size.\n\n\n0.4.5 / Jan 8, 2013\n\n  * WARNING: configuration file schema changed. Some properties will be \n    empty in Connection Settings Dialog. Please fill them again.\n\n  * Connection test (diagnostic) implemented.\n  * Indicators in the shell: current server, database and collection (if available)\n    This indicators are \"real\" - they respect your actual query.\n  * Execution time measurement. Displayed for each individual output result.\n  * Paging for each output result with respect to filtering, ordering, fields, \n    limit, skip etc. of actual text query (pilot version).\n  * Connection cloning support in Connections Dialog.  \n  * Databases and collections now displayed in sorted order.\n  * Batch size extended to 50 documents.\n  * New shape of Shells.  \n  * New shape of Connection Settings Dialog\n  * New shape of Connections Dialog.  \n\n\n0.4.0 / Dec 26, 2012\n\n  * No more \"type 'it' for more results\" when we have more than 20 objects in collection.\n  * Two global modes added - text and tree modes. Switch between them using F3 and F4.\n  * Two local modes added - text and tree modes. Switch between them using small \n    icons on Output panels for each resultset.\n  * Improved performance of json creation (from list of documents). \n  * Tooltips for tool buttons added.\n  * Maximization of output panel implemented (via small icon at the top right of output panel) \n    Click second time to restore back.\n  * Fix for not working Ctrl-O key shortcut (that opens Connections menu).\n  \n\n0.3.5 / Dec 25, 2012\n\n  * Context menu for server, database and collection.\n  * Tab management (Ctrl+Tab, Ctrl+Shift+Tab, Ctrl+T, Ctrl+F4)\n  * Context menu for tab\n  * Submenu for Connect button with connections.\n  * Hotkeys for first 9 connections (Alt+1, ..., Alt+9)\n  * Connections reordering via drag'n'drop in Connections dialog.\n  * Correct focus placement when opening new connection and switching tabs.\n  * Bonus: F12 - opens connections menu from any place.\n  * Memory leaks fix.\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.8.0)\nproject(Robomongo)\n\n# Where to look first for CMake modules, before \"${CMAKE_ROOT}/Modules\" is checked\nlist(APPEND CMAKE_MODULE_PATH \"${CMAKE_CURRENT_LIST_DIR}/cmake\")\n\n# Project version\nset(PROJECT_VERSION_MAJOR \"1\")\nset(PROJECT_VERSION_MINOR \"4\")\nset(PROJECT_VERSION_PATCH \"4\")\nset(PROJECT_VERSION_BUILD \"\")\nset(PROJECT_VERSION \"${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${PROJECT_VERSION_BUILD}\")\n\n# Enable C++17 features \nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\n# Modules\ninclude(RobomongoPrintUtils)\ninclude(RobomongoCMakeDefaults)\ninclude(RobomongoDefaults)\ninclude(RobomongoCommon)\ninclude(RobomongoTrashSymbols)\ninclude(RobomongoTargetArch)\ninclude(RobomongoInstallQt)\ninclude(RobomongoPackage)\n\n# Search for dependencies\nfind_package(Threading REQUIRED)    # Wrapper arround CMake \"Threads\" module\nfind_package(Qt5Core REQUIRED)\nfind_package(Qt5Gui REQUIRED)\nfind_package(Qt5Widgets REQUIRED)\nfind_package(Qt5PrintSupport REQUIRED)\nfind_package(Qt5Network REQUIRED)\nfind_package(Qt5Xml REQUIRED)\nif(NOT SYSTEM_LINUX)\n    find_package(Qt5WebEngineWidgets REQUIRED)\nendif()\nfind_package(MongoDB REQUIRED)\nfind_package(OpenSSL REQUIRED)\n\nif (SYSTEM_MACOSX)\n    set(CMAKE_OSX_DEPLOYMENT_TARGET 10.14)\n    find_package(Qt5MacExtras REQUIRED)\nendif()\n\n# Projects\nset(LIBSSH2_VERSION 1.9.0)\nif(SYSTEM_LINUX)\n    set(LIBSSH2_VERSION 1.7.0)\nendif()\nset(LIBSSH2_DIR src/third-party/libssh2-${LIBSSH2_VERSION})\nset(QJSON_VERSION 0.8.1)\nset(QJSON_DIR src/third-party/qjson-${QJSON_VERSION})\nset(QSCINTILLA_VERSION 2.8.4)\nset(QSCINTILLA_DIR src/third-party/qscintilla-${QSCINTILLA_VERSION})\nset(ESPRIMA_VERSION 2.7.3)\nset(ESPRIMA_DIR src/third-party/esprima-${ESPRIMA_VERSION})\n# todo: Use equivalent vars from googletest cmake files. Currently they are somehow not working.\nset(GOOGLE_TEST_VERSION 1.8.1)\nset(GOOGLE_TEST_DIR src/third-party/googletest-${GOOGLE_TEST_VERSION})\nadd_subdirectory(${LIBSSH2_DIR})\nadd_subdirectory(src/robomongo/ssh)\nadd_subdirectory(${QJSON_DIR})\nadd_subdirectory(${QSCINTILLA_DIR})\nadd_subdirectory(${GOOGLE_TEST_DIR})\nadd_subdirectory(src/robomongo)\nadd_subdirectory(src/robomongo-unit-tests)\n\n# Show configuration summary\ninclude(RobomongoConfigurationSummary)\n"
  },
  {
    "path": "COPYRIGHT",
    "content": "Robo 3T, shell-centric cross-platform MongoDB management tool.\n\nCopyright 2014-2017 3T Software Labs Ltd.\n\nThe Robo 3T is released under the terms of the GNU General Public\nLicense, version 3.\n\nThe Robo 3T Project includes files written by third parties\nand used with permission or subject to their respective license\nagreements.\n\n"
  },
  {
    "path": "DESCRIPTION",
    "content": "Robo 3T is a shell-centric cross-platform open source MongoDB management\ntool (i.e. Admin GUI). Robomongo embeds the same JavaScript engine that\npowers MongoDB's mongo shell.\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "## Important\n\nIf you are using Studio 3T, please file any feedback on the [Studio 3T Feedback](https://studio3t.com/feedback/) page. If you are using Studio 3T Free, there is the [3T Community](https://community.studio3t.com/) for discussions with a [dedicated Free section](https://community.studio3t.com/c/studio-3t-free/13). Studio 3T does not monitor this repository for Studio 3T issues.\n\n# End of Robo 3T Development\n\nRobo 3T is no longer being developed by Studio 3T. Studio 3T recommends users looking for a MongoDB GUI client try [Studio 3T Free](https://studio3t.com/free), a free-forever edition of the Studio 3T tools.\n\nRead more about the changes on the [Robo 3T Blog](https://blog.robomongo.org/studio3t-free/).\n\nThe last release of Robo 3T is version 1.4.4, downloadable from the following links: \n\n* [Robo 3T Windows .zip](https://download.studio3t.com/robomongo/windows/robo3t-1.4.4-windows-x86_64-e6ac9ec5.zip)\n\n* [Robo 3T Windows .exe](https://download.studio3t.com/robomongo/windows/robo3t-1.4.4-windows-x86_64-e6ac9ec5.exe)\n\n* [Robo 3T Mac](https://download.studio3t.com/robomongo/mac/robo3t-1.4.4-darwin-x86_64-e6ac9ec.dmg)\n\n* [Robo 3T Linux](https://download.studio3t.com/robomongo/linux/robo3t-1.4.4-linux-x86_64-e6ac9ec.tar.gz)\n\nAnd the source code from [Robo 3T repository](https://github.com/Studio3T/robomongo/latest).\n\nStudio 3T would like to thank the Robo 3T community who used and supported the application, since it was acquired in 2017. This repository, the website and blog will be left online and available to maintain a record of what was one of the most influential MongoDB clients of its time.\n\n\nAbout Robo 3T\n===============\n\n[Robo 3T](http://www.robomongo.org) (formerly Robomongo *) is a shell-centric cross-platform MongoDB management tool. Unlike most other MongoDB admin UI tools, Robo 3T embeds the actual `mongo` shell in a tabbed interface with access to a shell command line as well as GUI interaction.\n\nThe latest stable release **Robo 3T 1.4** embeds **MongoDB 4.2** shell.   \n\nBlog:     http://blog.robomongo.org/robo-3t-1-4/  \nDownload: https://robomongo.org/download  \nAll Releases: https://github.com/Studio3T/robomongo/releases  \nWatch: [Robo 3T Youtube channel](https://www.youtube.com/channel/UCM_7WAseRWeeiBikExppstA)  \nFollow: https://twitter.com/Robomongo\n\n**Embedded MongoDB shell history:**  \nRobo 3T 1.4 -> MongoDB 4.2     \nRobo 3T 1.3 -> MongoDB 4.0     \nRobo 3T 1.1 -> MongoDB 3.4    \nRobo 3T 0.9 -> MongoDB 3.2  \nRobo 3T 0.8.x -> MongoDB 2.4.0  \n\n\\* [Robomongo has been acquired by 3T](https://studio3t.com/press/3t-software-labs-acquires-robomongo-the-most-widely-used-mongodb-tool/)\n\nWhat's new in latest Robo 3T 1.4?\n====================================\n\nNew Features:   \n  - Mongo shell 4.2 upgrade  \n  - Support for Ubuntu 20.04, macOS Big Sur and  macOS 10.15 (Catalina)   \n  - SSH: ECDSA and Ed25519 keys support on Windows & macOS (issues #1719, #1530, #1590)  \n  - Manually specify visible databases (issues #1696, #1368, #389)  \n  - New Welcome Tab - embeds Chromium using QtWebEngine (Windows, macOS only)  \n  - Import keys from old version: autoExpand, lineNumbers, debugMode and shellTimeoutSec  \n   \nImprovements:  \n  - Qt Upgrade (v5.12.8 - Apr/2020, Windows & macOS only)  \n  - OpenSSL upgrade (v1.1.1f - Mar/2020, Windows & macOS only)  \n  - libssh2 upgrade (v1.9.0 - Jun/2019, Windows & macOS only)  \n  - Database explorer section has smaller default width (#1556)\n  - Remember database explorer section size   \n\nFixes:  \n  - Fix previously broken IPv6 support from command line: robo3t --ipv6\n  - Fix crash when paging used in tabbed result window (#1661)\n  - Fix broken paging in DocumentDB (#1694)\n  - Authentication database option isn't used properly (#1696)  \n  - Add/Edit index ops fixed (re-written) (#1692)   \n  - Crash when expanding admin users (#1728)   \n  - Unable to run query after shell timeout reached (#1529)  \n  - Fix broken F2, F3, F4 shortcuts for tabbed result view\n  - One time re-order limit per new connections window to prevent data loss (macOS, #1790)  \n  - Fix crash when new shell tab executed in server unreachable case  \n\nSupported Platforms\n===============\n\nNote: This sections is for Robo 3T and it directly depends on what MongoDB suppports  \n(See: https://docs.mongodb.com/manual/administration/production-notes/#prod-notes-supported-platforms)\n\n| MongoDB Versions      | MongoDB Cloud Platforms |\n| :-------------------- | :--------------------   | \n| 4.2                   | Mongo Atlas             |\n| 4.0                   |\n| 3.6                   |\n\n| Windows                |   Mac                            | Linux                       |        \n|:---------------------- | :--------------------------------| :---------------------------|\n| Windows 64-bit 10      |  Mac OS X 11    (Big Sur)     \t  | Linux Ubuntu 20.04 64-bit  |\n  Windows 64-bit 8.1     |  Mac OS X 10.15 (Catalina)           | Linux Ubuntu 18.04 64-bit  |\n| Windows 64-bit 7       |  Mac OS X 10.14 (Mojave)      |   |\n\n\nContribute!\n===========\n\n### Code Contributions\n\nSee all docs here: https://github.com/Studio3T/robomongo/wiki  \n\n**Some important docs:**  \n- [Build Diagram](https://github.com/Studio3T/robomongo/wiki/Robo-3T-Schematics:-Build,-Class-and-UI-Diagrams#1-build-diagram)\n- [Static Code Analysis](https://github.com/Studio3T/robomongo/wiki/Static-Code-Analysis)\n- [Robo 3T Feature Specisification](https://github.com/Studio3T/robomongo/wiki/Feature-Spec)\n- [Debugging](https://github.com/Studio3T/robomongo/blob/master/docs/Debug.md)\n- [Schematics](https://github.com/Studio3T/robomongo/tree/master/schematics)\n\nCode contributions are always welcome! Just try to follow our pre-commit checks and coding style: \n- [Robo 3T Code Quality](https://github.com/paralect/robomongo/wiki/Robomongo-Code-Quality)\n- [Robo 3T C++11/14 Transition Guide](https://github.com/Studio3T/robomongo/wiki/Robomongo-Cplusplus-11,-14-Transition-Guide)\n- [Robo 3T Coding Style](https://github.com/paralect/robomongo/wiki/Robomongo-Coding-Style)\n\nIf you plan to contribute, please create a Github issue (or comment on the relevant existing issue) so we can help coordinate with upcoming release plans.\n\nPull requests (PRs) should generally be for discrete issues (i.e. one issue per PR please) and be clean to merge against the current master branch. It would also be helpful if you can confirm what testing has been done (specific O/S targets and MongoDB versions if applicable).\n\nA usual naming approach for feature branches is `issue-###`. Include the issue number in your commit message / pull request description to link the PR to the original issue.\n\nFor example:\n```#248: updated QScintilla to 2.4.8 for retina display support\".```\n\n### Testing\n\n- [Unit-Tests](https://github.com/Studio3T/robomongo/wiki/Unit-Tests)  \n- [Manual Tests](wiki/Tests)\n- See all docs here: https://github.com/Studio3T/robomongo/wiki  \n\n### Suggest Features\n\nNew feature suggestions or UI improvements are always welcome.\n[Create a new feature request on github](https://github.com/paralect/robomongo/issues/new)\n\nThis project is powered by open source volunteers, so we have a limited amount of development resource to address all requests. We will certainly make best efforts to progress (particularly for those with strong community upvotes).\n\n\nDownload\n========\n\nYou can download tested installer packages for macOS, Windows, and Linux from our site: [www.robomongo.org](http://www.robomongo.org).\n\nSupport\n=======\n\nRobo 3T is an open source project driven by volunteers. We'll try to get to your questions as soon as we can, but please be patient :).\n\nYou can:\n\n - [Create a new issue in the Github issue queue](https://github.com/paralect/robomongo/issues)\n\n - [Join developer discussion on Gitter](https://gitter.im/paralect/robomongo)\n\n\nLicense\n=======\n\nCopyright 2014-2021 [3T Software Labs Ltd](https://studio3t.com/). All rights reserved.\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License version 3 as \npublished by the Free Software Foundation.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see <http://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "bin/README.md",
    "content": "Bash fronted for CMake\n======================\n\nIf you want to use this scripts, you need to set single environment variable:\n\nE.g.:\n\n    export ROBOMONGO_CMAKE_PREFIX_PATH=\"/path/to/qt-5/5.5/gcc_64;/path/to/robomongo-shell\"\n\nBuild Robomongo:\n\n    $ bin/configure\n    $ bin/build\n    \nInstall Robomongo:\n\n    $ bin/install\n    \nRun Robomongo:\n\n    $ bin/run    \n    \nPack Robomongo:\n\n    $ bin/pack\n\nMore: \n- [Build Robo 3T - Mac OS X and Linux](https://github.com/paralect/robomongo/blob/master/docs/BuildRobo3TOnMacAndLinux.md) \n- [Build Robo 3T - Windows](https://github.com/paralect/robomongo/blob/master/docs/BuildRobo3TOnWindows.md)\n- [Unit Tests](wiki/Unit-Tests)\n- [Static Code Analysis](wiki/Static-Code-Analysis)\n"
  },
  {
    "path": "bin/build",
    "content": "#!/usr/bin/env bash\n\nBIN_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"       # Get directory of this file\nPROJECT_DIR=$(dirname $BIN_DIR)                                   # Get root directory of project\nsource $BIN_DIR/common/setup $1 # $1: release or debug\n\ncd $BUILD_DIR\ncmake --build . \"${@:2}\" -- -j8"
  },
  {
    "path": "bin/build-and-run-tests",
    "content": "#!/usr/bin/env bash\n\nBIN_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"       # Get directory of this file\nPROJECT_DIR=$(dirname $BIN_DIR)                                   # Get root directory of project\n\nsource $BIN_DIR/build || exit $?\nsource $BIN_DIR/run-tests $1"
  },
  {
    "path": "bin/build-and-run-tests.bat",
    "content": "@echo off\r\nsetlocal enableextensions enabledelayedexpansion\r\n\r\nrem Path to bin and project folder\r\nset BIN_DIR_WITH_BACKSLASH=%~dp0%\r\nset BIN_DIR=%BIN_DIR_WITH_BACKSLASH:~0,-1%\r\nset PROJECT_DIR=%BIN_DIR%\\..\r\n\r\nrem Run build\r\ncall \"%BIN_DIR%\\build.bat\" %*\r\nif %ERRORLEVEL% neq 0 (exit /b 1)\r\n\r\nrem Run tests\r\ncall \"%BIN_DIR%\\run-tests.bat\" %*\r\nif %ERRORLEVEL% neq 0 (exit /b 1)"
  },
  {
    "path": "bin/build.bat",
    "content": "@echo off\r\nsetlocal enableextensions enabledelayedexpansion\r\n\r\nrem Path to bin and project folder\r\nset BIN_DIR_WITH_BACKSLASH=%~dp0%\r\nset BIN_DIR=%BIN_DIR_WITH_BACKSLASH:~0,-1%\r\nset PROJECT_DIR=%BIN_DIR%\\..\r\n\r\nrem Run common setup code\r\ncall \"%BIN_DIR%\\common\\setup.bat\" %*\r\nif %ERRORLEVEL% neq 0 (exit /b 1)\r\n\r\nrem Run build\r\ncd \"%BUILD_DIR%\"\r\ncmake --build . --config %BUILD_TYPE%\r\n\r\nrem Install debug *.dll files\r\nif \"%BUILD_TYPE%\" == \"Debug\" (\r\n  call \"%BIN_DIR%\\install-debug-dlls.bat\" %*\r\n)"
  },
  {
    "path": "bin/clang-checks.txt",
    "content": "bugprone-*\ncert-*\nclang-analyzer-*\ncppcoreguidelines-*\nconcurrency-*\nhicpp-*\nllvm-*\nmisc-*\nperformance-*\nreadability-*"
  },
  {
    "path": "bin/clang-tidy.xml",
    "content": "  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <EnableClangTidyCodeAnalysis>true</EnableClangTidyCodeAnalysis>\n    <ClangTidyChecks></ClangTidyChecks>\n  </PropertyGroup>\n"
  },
  {
    "path": "bin/clean",
    "content": "#!/usr/bin/env bash\n\nBIN_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"       # Get directory of this file\nPROJECT_DIR=$(dirname $BIN_DIR)                                   # Get root directory of project\nsource $BIN_DIR/common/setup $1\n\ncd $VARIANT_DIR && rm -rf $BUILD_DIR_NAME\n"
  },
  {
    "path": "bin/clean.bat",
    "content": "@echo off\r\nsetlocal enableextensions enabledelayedexpansion\r\n\r\nrem Path to bin and project folder\r\nset BIN_DIR_WITH_BACKSLASH=%~dp0%\r\nset BIN_DIR=%BIN_DIR_WITH_BACKSLASH:~0,-1%\r\nset PROJECT_DIR=%BIN_DIR%\\..\r\n\r\nrem Run common setup code\r\ncall \"%BIN_DIR%\\common\\setup.bat\" %*\r\nif %ERRORLEVEL% neq 0 (exit /b 1)\r\n\r\nrem Clear build directory\r\ncd \"%VARIANT_DIR%\"\r\nrmdir /s /q \"%BUILD_DIR_NAME%\"\r\n"
  },
  {
    "path": "bin/common/setup",
    "content": "#!/usr/bin/env bash\n\nif [ \"$1\" == \"debug\" ]; then\n  BUILD_TYPE=Debug\nelse\n  BUILD_TYPE=Release\n\n  # Prepend \"release\" in front of $@\n  set -- release \"$@\"\nfi\n\n# Build dir name is a lowercase of BUILD_TYPE\n# i.e. debug\nBUILD_DIR_NAME=\"$(echo $BUILD_TYPE | tr '[A-Z]' '[a-z]')\"\n\n# i.e. /path/to/robomongo/build\nVARIANT_DIR=$PROJECT_DIR/build\n\n# i.e. /path/to/robomongo/build/debug\nBUILD_DIR=$VARIANT_DIR/$BUILD_DIR_NAME\n\n# i.e. /path/to/robomongo/build/debug/install\nINSTALL_PREFIX=$BUILD_DIR/install\n\n# i.e. /path/to/robomongo/build/debug/package\nPACK_PREFIX=$BUILD_DIR/package\n\nPREFIX_PATH=$ROBOMONGO_CMAKE_PREFIX_PATH\n\nmkdir -p $BUILD_DIR"
  },
  {
    "path": "bin/common/setup.bat",
    "content": "rem Check that ROBOMONGO_CMAKE_PREFIX_PATH is set\r\nif not defined ROBOMONGO_CMAKE_PREFIX_PATH (\r\n  echo Set environment variable ROBOMONGO_CMAKE_PREFIX_PATH in order to use this script\r\n  echo.\r\n  echo For example, execute the following command:\r\n  echo    setx ROBOMONGO_CMAKE_PREFIX_PATH \"c:\\Qt-5\\5.5\\msvc2013_64;c:\\robomongo-shell\"\r\n  echo.\r\n  echo You also need to reopen your Windows Command Prompt.\r\n  exit /b 1\r\n)\r\n\r\nrem Check for debug build type\r\nif %1. == debug. (\r\n  set BUILD_TYPE=Debug\r\n) else (\r\n    rem If build type wasn't specified - Release mode assumed\r\n    if %1. ==. (\r\n      set BUILD_TYPE=Release\r\n    ) else (\r\n        echo Invalid build type \"%1\". Supported build types: debug or release.\r\n        exit /b 1\r\n    )\r\n)\r\n\r\nrem Build dir name (i.e. Release)\r\nset BUILD_DIR_NAME=%BUILD_TYPE%\r\n\r\nrem i.e. /path/to/robomongo/build\r\nset VARIANT_DIR=%PROJECT_DIR%\\build\r\n\r\nrem i.e. /path/to/robomongo/build/debug\r\nset BUILD_DIR=%VARIANT_DIR%\\%BUILD_DIR_NAME%\r\n\r\nrem i.e. /path/to/robomongo/build/debug/install\r\nset INSTALL_PREFIX=%BUILD_DIR%\\install\r\n\r\nrem i.e. /path/to/robomongo/build/debug/package\r\nset PACK_PREFIX=%BUILD_DIR%/package\r\n\r\nrem Get value from environment variable\r\nset PREFIX_PATH=%ROBOMONGO_CMAKE_PREFIX_PATH%\r\n\r\nrem Create BUILD_DIR if it is not exists already\r\nif not exist \"%BUILD_DIR%\" (\r\n  md \"%BUILD_DIR%\"\r\n)\r\n\r\n\r\n"
  },
  {
    "path": "bin/configure",
    "content": "#!/usr/bin/env bash\n\nBIN_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"       # Get directory of this file\nPROJECT_DIR=$(dirname $BIN_DIR)                                   # Get root directory of project\nsource $BIN_DIR/common/setup $1 # $1: release or debug\n\ncd $BUILD_DIR\n# $BUILD_TYPE: Release or Debug\ncmake -D \"CMAKE_PREFIX_PATH=$PREFIX_PATH\" -D \"CMAKE_BUILD_TYPE=$BUILD_TYPE\" -D \"CMAKE_INSTALL_PREFIX=$INSTALL_PREFIX\" \"${@:2}\" $PROJECT_DIR"
  },
  {
    "path": "bin/configure.bat",
    "content": "@echo off \r\nsetlocal enableextensions enabledelayedexpansion\r\n\r\nrem Path to bin and project folder\r\nset BIN_DIR_WITH_BACKSLASH=%~dp0%\r\nset BIN_DIR=%BIN_DIR_WITH_BACKSLASH:~0,-1%\r\nset PROJECT_DIR=%BIN_DIR%\\..\r\n\r\nrem Run common setup code\r\ncall \"%BIN_DIR%\\common\\setup.bat\" %*\r\nif %ERRORLEVEL% neq 0 (exit /b 1)\r\n\r\nrem Run CMake configuration step\r\nrem BUILD_TYPE: Release or Debug\r\ncd \"%BUILD_DIR%\"\r\ncmake -G \"Visual Studio 15 2017 Win64\" -D \"CMAKE_PREFIX_PATH=%PREFIX_PATH%\" -D \"CMAKE_BUILD_TYPE=%BUILD_TYPE%\" -D \"CMAKE_INSTALL_PREFIX=%INSTALL_PREFIX%\" %PROJECT_DIR%\r\n\r\n@REM echo ___________________________________________________________________\r\n@REM rem Enable Clang Tidy for Visual Studio 2019 IDE ...\r\n@REM set ROBO_PROJ_FILE=%BUILD_DIR%/src/robomongo/robomongo.vcxproj\r\n@REM python %BIN_DIR%\\enable-visual-studio-clang-tidy.py %ROBO_PROJ_FILE% %BIN_DIR%"
  },
  {
    "path": "bin/enable-visual-studio-clang-tidy.py",
    "content": "import sys\nfrom lxml import etree\n\nprint('\\nEnabling Clang Tidy for Visual Studio 2019')\n\nrobo_proj_xml = sys.argv[1]\nclang_tidy_xml = sys.argv[2] + '/clang-tidy.xml'\nclang_checks_txt = sys.argv[2] + '/clang-checks.txt'\nprint(sys.argv[0] + \":\\nProcessing: \" + sys.argv[1])\n\n## Read clang checks\nclang_checks = None\nwith open(clang_checks_txt, \"r\") as file:\n    clang_checks = file.read().replace('\\n', ',')\n\n## \ntree = etree.parse(robo_proj_xml)\nns = {'ns':'http://schemas.microsoft.com/developer/msbuild/2003'}\nif(tree.find('//ns:EnableClangTidyCodeAnalysis', namespaces=ns) is not None):    \n    tree.find('//ns:ClangTidyChecks', namespaces=ns).text = clang_checks\n    tree.write(robo_proj_xml)    \n    print('Finished')\n    sys.exit()\n\n## Append clang_tidy_xml  -  Todo: refactor using etree\nwith open(robo_proj_xml, \"r\") as in_file:\n    buf = in_file.readlines()\n\nwith open(clang_tidy_xml, \"r\") as in_file:\n    clang_tidy_xml_buf = in_file.read()\n\nappended = False\nwith open(robo_proj_xml, \"w\") as out_file:\n    for line in buf:\n        if \"</ItemGroup>\" in line and appended == False:\n            line = line + clang_tidy_xml_buf\n            appended = True\n        out_file.write(line)\n\n## Add clang checks           \ntree = etree.parse(robo_proj_xml)\ntree.find('//ns:ClangTidyChecks', namespaces=ns).text = clang_checks\ntree.write(robo_proj_xml)\nprint('Finished')"
  },
  {
    "path": "bin/install",
    "content": "#!/usr/bin/env bash\n\nBIN_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"       # Get directory of this file\nPROJECT_DIR=$(dirname $BIN_DIR)                                   # Get root directory of project\nsource $BIN_DIR/common/setup $1\n\ncd $BUILD_DIR\ncmake --build . --target install/strip \"${@:2}\"\n"
  },
  {
    "path": "bin/install-debug-dlls.bat",
    "content": "@echo off\r\nsetlocal enableextensions enabledelayedexpansion\r\n\r\nrem // This script installs debug *.dll files\r\nrem -------------------------------------------\r\n\r\nset INSTALL_DIR=%BUILD_DIR%\\src\\robomongo\\Debug\\\r\nif not exist %INSTALL_DIR%*.dll (\r\n  echo ----------------------------------------\r\n  echo Installing debug *.dll files ...  \r\n  echo INSTALL_DIR: %INSTALL_DIR%\r\n  echo ----------------------------------------  \r\n)\r\n\r\nrem // Find OpenSSL and Qt paths\r\nfor %%i in (%ROBOMONGO_CMAKE_PREFIX_PATH%) do (\r\n  set xx=%%i\r\n  if not \"!xx!\"==\"!xx:ssl=!\" ( set OPENSSL_DIR=!xx! )\r\n  if not \"!xx!\"==\"!xx:qt=!\" ( set Qt_DIR=!xx! )\r\n)\r\nset OPENSSL_DIR=%OPENSSL_DIR: =%\r\nset Qt_DIR=%Qt_DIR: =%\r\n\r\nrem // Copy dll files\r\nfor /d %%a in (\r\n  \"%VS140COMNTOOLS%\\..\\..\\VC\\redist\\debug_nonredist\\x64\\Microsoft.VC140.DebugCRT\\msvcp140d.dll\"\r\n  \"%VS140COMNTOOLS%\\..\\..\\VC\\redist\\debug_nonredist\\x64\\Microsoft.VC140.DebugCRT\\vcruntime140d.dll\"\r\n  \"%OPENSSL_DIR%\\libssl-1_1-x64.dll\"\r\n  \"%OPENSSL_DIR%\\libcrypto-1_1-x64.dll\"\r\n  \"%Qt_DIR%\\bin\\Qt5Cored.dll\"\r\n  \"%Qt_DIR%\\bin\\Qt5Guid.dll\"\r\n  \"%Qt_DIR%\\bin\\Qt5Networkd.dll\"\r\n  \"%Qt_DIR%\\bin\\Qt5Widgetsd.dll\"\r\n  \"%Qt_DIR%\\bin\\Qt5Positioningd.dll\"\r\n  \"%Qt_DIR%\\bin\\Qt5Qmld.dll\"\r\n  \"%Qt_DIR%\\bin\\Qt5Quickd.dll\"\r\n  \"%Qt_DIR%\\bin\\Qt5QuickWidgetsd.dll\"\r\n  \"%Qt_DIR%\\bin\\Qt5WebChanneld.dll\"\r\n  \"%Qt_DIR%\\bin\\Qt5WebEngineCored.dll\"\r\n  \"%Qt_DIR%\\bin\\Qt5WebEngineWidgetsd.dll\"\r\n  \"%Qt_DIR%\\bin\\Qt5PrintSupportd.dll\"  \r\n) do (\r\n  if not exist !INSTALL_DIR!%%~NXa (\r\n    xcopy %%a !INSTALL_DIR! /d /y\r\n  )\r\n)\r\n\r\nif not exist %INSTALL_DIR%\\imageformats\\qgifd.dll (\r\n  xcopy /s \"%Qt_DIR%\\plugins\\imageformats\" %INSTALL_DIR%\\imageformats\\ /d /y\r\n)\r\n\r\nif not exist %INSTALL_DIR%\\platforms\\qminimald.dll (\r\n  xcopy /s \"%Qt_DIR%\\plugins\\platforms\" %INSTALL_DIR%\\platforms\\ /d /y\r\n)"
  },
  {
    "path": "bin/install.bat",
    "content": "@echo off\r\nsetlocal enableextensions enabledelayedexpansion\r\n\r\nrem Path to bin and project folder\r\nset BIN_DIR_WITH_BACKSLASH=%~dp0%\r\nset BIN_DIR=%BIN_DIR_WITH_BACKSLASH:~0,-1%\r\nset PROJECT_DIR=%BIN_DIR%\\..\r\n\r\nrem Run common setup code\r\ncall \"%BIN_DIR%\\common\\setup.bat\" %*\r\nif %ERRORLEVEL% neq 0 (exit /b 1)\r\n\r\nrem Run install\r\ncd \"%BUILD_DIR%\"\r\ncmake --build . --config %BUILD_TYPE% --target install\r\n"
  },
  {
    "path": "bin/pack",
    "content": "#!/usr/bin/env bash\n\nBIN_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"       # Get directory of this file\nPROJECT_DIR=$(dirname $BIN_DIR)                                   # Get root directory of project\nsource $BIN_DIR/common/setup $1\n\ncd $BUILD_DIR\ncmake --build . --target package \"${@:2}\"\n"
  },
  {
    "path": "bin/pack.bat",
    "content": "@echo off\r\nsetlocal enableextensions enabledelayedexpansion\r\n\r\nrem Path to bin and project folder\r\nset BIN_DIR_WITH_BACKSLASH=%~dp0%\r\nset BIN_DIR=%BIN_DIR_WITH_BACKSLASH:~0,-1%\r\nset PROJECT_DIR=%BIN_DIR%\\..\r\n\r\nrem Run common setup code\r\ncall \"%BIN_DIR%\\common\\setup.bat\" %*\r\nif %ERRORLEVEL% neq 0 (exit /b 1)\r\n\r\nrem Run install\r\ncd \"%BUILD_DIR%\"\r\ncmake --build . --config %BUILD_TYPE% --target package\r\n"
  },
  {
    "path": "bin/rebuild.bat",
    "content": "@echo off\r\nsetlocal enableextensions enabledelayedexpansion\r\n\r\ncall \"clean.bat\" %*\r\ncall \"configure.bat\" %*\r\ncall \"build.bat\" %*"
  },
  {
    "path": "bin/run",
    "content": "#!/usr/bin/env bash\n\nBIN_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"       # Get directory of this file\nPROJECT_DIR=$(dirname $BIN_DIR)                                   # Get root directory of project\nsource $BIN_DIR/common/setup $1\n\necho \"Note: ./install must be executed before this script.\"\nif [ \"$(uname -s)\" == \"Darwin\" ]; then\n    echo \"Starting $BUILD_DIR/install/Robo 3T.app/Contents/MacOS/Robo 3T\"\n    \"$BUILD_DIR/install/Robo 3T.app/Contents/MacOS/Robo 3T\"\nelse\n    echo \"Starting $BUILD_DIR/install/bin/robo3t\"\n    \"$BUILD_DIR/install/bin/robo3t\"    \nfi"
  },
  {
    "path": "bin/run-clang-tidy",
    "content": "#!/usr/bin/env bash\n\n### Common Setup\nBIN_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"       # Get directory of this file\nPROJECT_DIR=$(dirname $BIN_DIR)                                   # Get root directory of project\nsource $BIN_DIR/common/setup $1 # $1: release or debug\n\n### Setup\nCLANG_TIDY_BUILD_DIR=$PROJECT_DIR/build/clang-tidy-$BUILD_TYPE\nrm -rf $CLANG_TIDY_BUILD_DIR\nmkdir -p $CLANG_TIDY_BUILD_DIR && cd $CLANG_TIDY_BUILD_DIR\n\n### Configure cmake\n# Info: $BUILD_TYPE == Release or Debug\ncmake -D \"CMAKE_EXPORT_COMPILE_COMMANDS=ON\" -D \"CMAKE_PREFIX_PATH=$PREFIX_PATH\" -D \"CMAKE_BUILD_TYPE=$BUILD_TYPE\" -D \"CMAKE_INSTALL_PREFIX=$INSTALL_PREFIX\" \"${@:2}\" $PROJECT_DIR\necho -e \"\\n------------------------------------------------\"\necho \"clang-tidy configured. Mode: $BUILD_TYPE\"\necho -e \"------------------------------------------------\\n\"\n\n### Run clang-tidy\nFILE_OR_PATH=/opt/robo/src/robomongo/   # or MainWindow.cpp\nCHECKS=clang-analyzer-*,readability-implicit-bool-conversion\n# All Checks: https://clang.llvm.org/extra/clang-tidy/checks/list.html\n\n# e.g. $BIN_DIR/run-clang-tidy.py -checks=clang-analyzer-*,readability-implicit-bool-conversion /opt/robo/src/robomongo/\n$BIN_DIR/run-clang-tidy.py -checks=$CHECKS $FILE_OR_PATH\n\necho -e \"\\n------------------------------------------------\"\necho \"clang-tidy finished\"\necho \"Mode                : $BUILD_TYPE\"\necho \"CLANG_TIDY_BUILD_DIR: $CLANG_TIDY_BUILD_DIR\"\necho \"Command executed    : $BIN_DIR/run-clang-tidy.py -checks=$CHECKS $FILE_OR_PATH\"\necho -e \"------------------------------------------------\\n\""
  },
  {
    "path": "bin/run-clang-tidy.py",
    "content": "#!/usr/bin/env python\n#\n#===- run-clang-tidy.py - Parallel clang-tidy runner ---------*- python -*--===#\n#\n# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.\n# See https://llvm.org/LICENSE.txt for license information.\n# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception\n#\n#===------------------------------------------------------------------------===#\n# FIXME: Integrate with clang-tidy-diff.py\n\n\"\"\"\nParallel clang-tidy runner\n==========================\n\nRuns clang-tidy over all files in a compilation database. Requires clang-tidy\nand clang-apply-replacements in $PATH.\n\nExample invocations.\n- Run clang-tidy on all files in the current working directory with a default\n  set of checks and show warnings in the cpp files and all project headers.\n    run-clang-tidy.py $PWD\n\n- Fix all header guards.\n    run-clang-tidy.py -fix -checks=-*,llvm-header-guard\n\n- Fix all header guards included from clang-tidy and header guards\n  for clang-tidy headers.\n    run-clang-tidy.py -fix -checks=-*,llvm-header-guard extra/clang-tidy \\\n                      -header-filter=extra/clang-tidy\n\nCompilation database setup:\nhttp://clang.llvm.org/docs/HowToSetupToolingForLLVM.html\n\"\"\"\n\nfrom __future__ import print_function\n\nimport argparse\nimport glob\nimport json\nimport multiprocessing\nimport os\nimport re\nimport shutil\nimport subprocess\nimport sys\nimport tempfile\nimport threading\nimport traceback\n\ntry:\n  import yaml\nexcept ImportError:\n  yaml = None\n\nis_py2 = sys.version[0] == '2'\n\nif is_py2:\n    import Queue as queue\nelse:\n    import queue as queue\n\ndef find_compilation_database(path):\n  \"\"\"Adjusts the directory until a compilation database is found.\"\"\"\n  result = './'\n  while not os.path.isfile(os.path.join(result, path)):\n    if os.path.realpath(result) == '/':\n      print('Error: could not find compilation database.')\n      sys.exit(1)\n    result += '../'\n  return os.path.realpath(result)\n\n\ndef make_absolute(f, directory):\n  if os.path.isabs(f):\n    return f\n  return os.path.normpath(os.path.join(directory, f))\n\n\ndef get_tidy_invocation(f, clang_tidy_binary, checks, tmpdir, build_path,\n                        header_filter, extra_arg, extra_arg_before, quiet,\n                        config):\n  \"\"\"Gets a command line for clang-tidy.\"\"\"\n  start = [clang_tidy_binary]\n  if header_filter is not None:\n    start.append('-header-filter=' + header_filter)\n  if checks:\n    start.append('-checks=' + checks)\n  if tmpdir is not None:\n    start.append('-export-fixes')\n    # Get a temporary file. We immediately close the handle so clang-tidy can\n    # overwrite it.\n    (handle, name) = tempfile.mkstemp(suffix='.yaml', dir=tmpdir)\n    os.close(handle)\n    start.append(name)\n  for arg in extra_arg:\n      start.append('-extra-arg=%s' % arg)\n  for arg in extra_arg_before:\n      start.append('-extra-arg-before=%s' % arg)\n  start.append('-p=' + build_path)\n  if quiet:\n      start.append('-quiet')\n  if config:\n      start.append('-config=' + config)\n  start.append(f)\n  return start\n\n\ndef merge_replacement_files(tmpdir, mergefile):\n  \"\"\"Merge all replacement files in a directory into a single file\"\"\"\n  # The fixes suggested by clang-tidy >= 4.0.0 are given under\n  # the top level key 'Diagnostics' in the output yaml files\n  mergekey=\"Diagnostics\"\n  merged=[]\n  for replacefile in glob.iglob(os.path.join(tmpdir, '*.yaml')):\n    content = yaml.safe_load(open(replacefile, 'r'))\n    if not content:\n      continue # Skip empty files.\n    merged.extend(content.get(mergekey, []))\n\n  if merged:\n    # MainSourceFile: The key is required by the definition inside\n    # include/clang/Tooling/ReplacementsYaml.h, but the value\n    # is actually never used inside clang-apply-replacements,\n    # so we set it to '' here.\n    output = { 'MainSourceFile': '', mergekey: merged }\n    with open(mergefile, 'w') as out:\n      yaml.safe_dump(output, out)\n  else:\n    # Empty the file:\n    open(mergefile, 'w').close()\n\n\ndef check_clang_apply_replacements_binary(args):\n  \"\"\"Checks if invoking supplied clang-apply-replacements binary works.\"\"\"\n  try:\n    subprocess.check_call([args.clang_apply_replacements_binary, '--version'])\n  except:\n    print('Unable to run clang-apply-replacements. Is clang-apply-replacements '\n          'binary correctly specified?', file=sys.stderr)\n    traceback.print_exc()\n    sys.exit(1)\n\n\ndef apply_fixes(args, tmpdir):\n  \"\"\"Calls clang-apply-fixes on a given directory.\"\"\"\n  invocation = [args.clang_apply_replacements_binary]\n  if args.format:\n    invocation.append('-format')\n  if args.style:\n    invocation.append('-style=' + args.style)\n  invocation.append(tmpdir)\n  subprocess.call(invocation)\n\n\ndef run_tidy(args, tmpdir, build_path, queue, lock, failed_files):\n  \"\"\"Takes filenames out of queue and runs clang-tidy on them.\"\"\"\n  while True:\n    name = queue.get()\n    invocation = get_tidy_invocation(name, args.clang_tidy_binary, args.checks,\n                                     tmpdir, build_path, args.header_filter,\n                                     args.extra_arg, args.extra_arg_before,\n                                     args.quiet, args.config)\n\n    proc = subprocess.Popen(invocation, stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n    output, err = proc.communicate()\n    if proc.returncode != 0:\n      failed_files.append(name)\n    with lock:\n      sys.stdout.write(' '.join(invocation) + '\\n' + output.decode('utf-8'))\n      if len(err) > 0:\n        sys.stdout.flush()\n        sys.stderr.write(err.decode('utf-8'))\n    queue.task_done()\n\n\ndef main():\n  parser = argparse.ArgumentParser(description='Runs clang-tidy over all files '\n                                   'in a compilation database. Requires '\n                                   'clang-tidy and clang-apply-replacements in '\n                                   '$PATH.')\n  parser.add_argument('-clang-tidy-binary', metavar='PATH',\n                      default='clang-tidy',\n                      help='path to clang-tidy binary')\n  parser.add_argument('-clang-apply-replacements-binary', metavar='PATH',\n                      default='clang-apply-replacements',\n                      help='path to clang-apply-replacements binary')\n  parser.add_argument('-checks', default=None,\n                      help='checks filter, when not specified, use clang-tidy '\n                      'default')\n  parser.add_argument('-config', default=None,\n                      help='Specifies a configuration in YAML/JSON format: '\n                      '  -config=\"{Checks: \\'*\\', '\n                      '                       CheckOptions: [{key: x, '\n                      '                                       value: y}]}\" '\n                      'When the value is empty, clang-tidy will '\n                      'attempt to find a file named .clang-tidy for '\n                      'each source file in its parent directories.')\n  parser.add_argument('-header-filter', default=None,\n                      help='regular expression matching the names of the '\n                      'headers to output diagnostics from. Diagnostics from '\n                      'the main file of each translation unit are always '\n                      'displayed.')\n  if yaml:\n    parser.add_argument('-export-fixes', metavar='filename', dest='export_fixes',\n                        help='Create a yaml file to store suggested fixes in, '\n                        'which can be applied with clang-apply-replacements.')\n  parser.add_argument('-j', type=int, default=0,\n                      help='number of tidy instances to be run in parallel.')\n  parser.add_argument('files', nargs='*', default=['.*'],\n                      help='files to be processed (regex on path)')\n  parser.add_argument('-fix', action='store_true', help='apply fix-its')\n  parser.add_argument('-format', action='store_true', help='Reformat code '\n                      'after applying fixes')\n  parser.add_argument('-style', default='file', help='The style of reformat '\n                      'code after applying fixes')\n  parser.add_argument('-p', dest='build_path',\n                      help='Path used to read a compile command database.')\n  parser.add_argument('-extra-arg', dest='extra_arg',\n                      action='append', default=[],\n                      help='Additional argument to append to the compiler '\n                      'command line.')\n  parser.add_argument('-extra-arg-before', dest='extra_arg_before',\n                      action='append', default=[],\n                      help='Additional argument to prepend to the compiler '\n                      'command line.')\n  parser.add_argument('-quiet', action='store_true',\n                      help='Run clang-tidy in quiet mode')\n  args = parser.parse_args()\n\n  db_path = 'compile_commands.json'\n\n  if args.build_path is not None:\n    build_path = args.build_path\n  else:\n    # Find our database\n    build_path = find_compilation_database(db_path)\n\n  try:\n    invocation = [args.clang_tidy_binary, '-list-checks']\n    invocation.append('-p=' + build_path)\n    if args.checks:\n      invocation.append('-checks=' + args.checks)\n    invocation.append('-')\n    if args.quiet:\n      # Even with -quiet we still want to check if we can call clang-tidy.\n      with open(os.devnull, 'w') as dev_null:\n        subprocess.check_call(invocation, stdout=dev_null)\n    else:\n      subprocess.check_call(invocation)\n  except:\n    print(\"Unable to run clang-tidy.\", file=sys.stderr)\n    sys.exit(1)\n\n  # Load the database and extract all files.\n  database = json.load(open(os.path.join(build_path, db_path)))\n  files = [make_absolute(entry['file'], entry['directory'])\n           for entry in database]\n\n  max_task = args.j\n  if max_task == 0:\n    max_task = multiprocessing.cpu_count()\n\n  tmpdir = None\n  if args.fix or (yaml and args.export_fixes):\n    check_clang_apply_replacements_binary(args)\n    tmpdir = tempfile.mkdtemp()\n\n  # Build up a big regexy filter from all command line arguments.\n  file_name_re = re.compile('|'.join(args.files))\n\n  return_code = 0\n  try:\n    # Spin up a bunch of tidy-launching threads.\n    task_queue = queue.Queue(max_task)\n    # List of files with a non-zero return code.\n    failed_files = []\n    lock = threading.Lock()\n    for _ in range(max_task):\n      t = threading.Thread(target=run_tidy,\n                           args=(args, tmpdir, build_path, task_queue, lock, failed_files))\n      t.daemon = True\n      t.start()\n\n    # Fill the queue with files.\n    for name in files:\n      if file_name_re.search(name):\n        task_queue.put(name)\n\n    # Wait for all threads to be done.\n    task_queue.join()\n    if len(failed_files):\n      return_code = 1\n\n  except KeyboardInterrupt:\n    # This is a sad hack. Unfortunately subprocess goes\n    # bonkers with ctrl-c and we start forking merrily.\n    print('\\nCtrl-C detected, goodbye.')\n    if tmpdir:\n      shutil.rmtree(tmpdir)\n    os.kill(0, 9)\n\n  if yaml and args.export_fixes:\n    print('Writing fixes to ' + args.export_fixes + ' ...')\n    try:\n      merge_replacement_files(tmpdir, args.export_fixes)\n    except:\n      print('Error exporting fixes.\\n', file=sys.stderr)\n      traceback.print_exc()\n      return_code=1\n\n  if args.fix:\n    print('Applying fixes ...')\n    try:\n      apply_fixes(args, tmpdir)\n    except:\n      print('Error applying fixes.\\n', file=sys.stderr)\n      traceback.print_exc()\n      return_code=1\n\n  if tmpdir:\n    shutil.rmtree(tmpdir)\n  sys.exit(return_code)\n\nif __name__ == '__main__':\n  main()\n"
  },
  {
    "path": "bin/run-cppcheck.bat",
    "content": "@echo off\r\nsetlocal enableextensions enabledelayedexpansion\r\n\r\nset CPP_VER=c++17\r\n\r\nset FILE_OR_DIR=..\\src\\robomongo\\\r\nset PARAM_1=%1\r\nif not \"%PARAM_1%\" == \"\" (\r\n  set FILE_OR_DIR=%PARAM_1%\r\n)\r\n\r\nrem Run analysis\r\necho.\r\necho ---------------------- Running cppcheck ----------------------\r\necho.\r\ncall cppcheck %FILE_OR_DIR% --enable=all --std=%CPP_VER%\r\necho.\r\necho ---------------------- End of cppcheck ----------------------\r\necho.\r\necho ---------------------- Info ----------------------\r\ncall cppcheck --version\r\necho Command called: cppcheck %FILE_OR_DIR% --enable=all --std=%CPP_VER%"
  },
  {
    "path": "bin/run-scan-build",
    "content": "#!/usr/bin/env bash\n\nBIN_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"       # Get directory of this file\nPROJECT_DIR=$(dirname $BIN_DIR)                                   # Get root directory of project\nsource $BIN_DIR/common/setup $1 # $1: release or debug\n\nmkdir -p ../scan-build && cd ../scan-build\n# $BUILD_TYPE: Release or Debug\n# Hint: Use \"--use-analyzer /usr/local/opt/llvm/bin/clang++\" after \"-v\"\nscan-build -v cmake -D \"CMAKE_PREFIX_PATH=$PREFIX_PATH\" -D \"CMAKE_BUILD_TYPE=$BUILD_TYPE\" -D \"CMAKE_INSTALL_PREFIX=$INSTALL_PREFIX\" \"${@:2}\" $PROJECT_DIR\necho -e \"\\n------------------------------------------------\"\necho \"Configured with scan-build in $BUILD_TYPE mode\"\necho -e \"------------------------------------------------\\n\"\nscan-build cmake --build . \"${@:2}\" -- -j8\necho -e \"\\n------------------------------------------------\"\necho \"Built with scan-build in $BUILD_TYPE mode\"\necho -e \"------------------------------------------------\\n\""
  },
  {
    "path": "bin/run-tests",
    "content": "#!/usr/bin/env bash\n\nBIN_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"       # Get directory of this file\nPROJECT_DIR=$(dirname $BIN_DIR)                                   # Get root directory of project\nsource $BIN_DIR/common/setup $1\n\necho \necho \"*******************  Running unit tests in $BUILD_TYPE mode *******************\"\necho \n\nif [ \"$(uname -s)\" == \"Darwin\" ]; then\n    EXE=\"$BUILD_DIR/src/robomongo-unit-tests/robo_unit_tests\"\n    echo \"Running file: $EXE\"\n    \"$EXE\"\nelse # Linux\n    echo \"Error: Currently unit testing is disabled for Linux due to MongoDB linking problem\"\n    exit 0\n    EXE=\"$BUILD_DIR/src/robomongo-unit-tests/robo_unit_tests\"\n    echo \"Running file: $EXE\"\n    \"$EXE\"\nfi "
  },
  {
    "path": "bin/run-tests.bat",
    "content": "@echo off\r\nsetlocal enableextensions enabledelayedexpansion\r\n\r\nrem Path to bin and project folder\r\nset BIN_DIR_WITH_BACKSLASH=%~dp0%\r\nset BIN_DIR=%BIN_DIR_WITH_BACKSLASH:~0,-1%\r\nset PROJECT_DIR=%BIN_DIR%\\..\r\n\r\nrem Run common setup code\r\ncall \"%BIN_DIR%\\common\\setup.bat\" %*\r\nif %ERRORLEVEL% neq 0 (exit /b 1)\r\n\r\nrem Run tests\r\necho.\r\necho *******************  Running unit tests ******************* \r\necho Mode: %BUILD_TYPE%\r\nset TEST_EXE_DIR=%PROJECT_DIR%\\\\build\\%BUILD_TYPE%\\src\\robomongo-unit-tests\\%BUILD_TYPE%\r\necho Run : %TEST_EXE_DIR%\\robo_unit_tests.exe\r\necho.\r\ncall \"%TEST_EXE_DIR%\\robo_unit_tests.exe\" %*"
  },
  {
    "path": "bin/run-vs-code-analysis.bat",
    "content": "@echo off\r\nsetlocal enableextensions enabledelayedexpansion\r\n\r\nrem Path to bin and project folder\r\nset BIN_DIR_WITH_BACKSLASH=%~dp0%\r\nset BIN_DIR=%BIN_DIR_WITH_BACKSLASH:~0,-1%\r\nset PROJECT_DIR=%BIN_DIR%\\..\r\n\r\nrem Run common setup code\r\ncall \"%BIN_DIR%\\common\\setup.bat\" %*\r\nif %ERRORLEVEL% neq 0 (exit /b 1)\r\n\r\nrem Run Visual Studio with RunCodeAnalysis\r\ncd \"%BUILD_DIR%\"\r\nset RULE_SET=\"/p:CodeAnalysisRuleSet=NativeRecommendedRules.ruleset\"\r\nset OUT_FILE=vs-code-analysis-%BUILD_TYPE%.txt\r\n\r\necho ------------- Running Visual Studio with RunCodeAnalysis -------------\r\necho Result will be written into file \"%OUT_FILE%\" in the end.\r\necho ...\r\ncmake --build . --config %BUILD_TYPE% -- \"/p:RunCodeAnalysis=true\" %RULE_SET% > %BIN_DIR%\\%OUT_FILE%\r\n  rem Rules: C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Team Tools\\Static Analysis Tools\\Rule Sets\r\n  rem        https://docs.microsoft.com/en-us/visualstudio/code-quality/rule-set-reference?view=vs-2019\r\n\r\necho ------------- End of RunCodeAnalysis -------------\r\necho.\r\necho ------------- Info -------------\r\necho Mode    : %BUILD_TYPE%\r\necho RULE_SET: %RULE_SET% (see the script comments for more info)"
  },
  {
    "path": "bin/set-mongo-warning-level-3.py",
    "content": "import os\nfrom os.path import join\n\n### \ndef force_warning_level_3(file):\n    with open(file, \"r\") as in_file:\n        buf = in_file.readlines()\n\n    push = '#pragma warning(push, 3)\\n'\n    pop  = '#pragma warning(pop)\\n'\n\n    last_line_has_mongo = False\n    with open(file, \"w\") as out_file:\n        for line in buf:            \n            if line.startswith(('#include <mongo', '#include \"mongo')):\n                if last_line_has_mongo: \n                    pass # line = line + pop\n                else:\n                    line = push + line\n\n                last_line_has_mongo = True\n            else:\n                if last_line_has_mongo: \n                    line = pop + line\n\n                last_line_has_mongo = False          \n\n            out_file.write(line)\n\n\n### main\nroot_dir = 'E:\\\\robo\\\\src\\\\robomongo\\\\'\n# root_dir = 'E:\\\\robo\\\\src\\\\robomongo\\\\shell\\\\bson\\\\'    # for testing\nprint('Processing all source files in root & sub directories...')\nprint('Root Dir:', root_dir)\nprint('---------------------------------------------------------')\nfor path, subdirs, files in os.walk(root_dir):\n    for name in files:\n        if name.endswith(('.h', '.cpp')):\n            file = os.path.join(path, name)\n            print(file)\n            force_warning_level_3(file)"
  },
  {
    "path": "bin/tag",
    "content": "#!/usr/bin/env bash\n\nBIN_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"       # Get directory of this file\nPROJECT_DIR=$(dirname $BIN_DIR)                                   # Get root directory of project\n\nVERSION=\"$(echo $1 | tr '[A-Z]' '[a-z]')\"\nif [ -z \"$VERSION\" ]; then\n    echo \"Usage: tag <name>\"\n    echo \"Example: tag 0.9.0-rc9\"\n    exit\nfi\n\nif [ \"$(git rev-parse --abbrev-ref HEAD)\" != \"master\" ]; then\n    echo \"Error: You are not on master branch\"\n    exit\nfi\n\ncd $PROJECT_DIR\ngit tag -a \"v${VERSION}\" -m \"${VERSION}\"\ngit push --tags\n"
  },
  {
    "path": "cmake/FindMongoDB.cmake",
    "content": "#\n# Find the MongoDB libraries\n#\n# This module defines the following variables:\n#      MongoDB_FOUND\n#      MongoDB_LIBS\n#      MongoDB_INCLUDE_DIRS\n#      MongoDB_DEFINITIONS\n#\n# Imported target \"mongodb\" is created\n#\n# We assume, that at least \"mongo\" target was build by the following command:\n#    $ scons mongo\n#\n#\n\n# Try to find MongoDB directory (uses CMAKE_PREFIX_PATH locations)\nfind_path(\n    MongoDB_DIR src/mongo/config.h.in\n    DOC \"Path to MongoDB (github.com/robomongo-shell) root directory\"\n)\n\n# Find relative path to build directory\nif(BUILD_RELEASE OR BUILD_RELWITHDEBINFO OR BUILD_MINSIZEREL)\n    set(MongoDB_RELATIVE_BUILD_DIR build/opt)\n    set(MongoDB_OBJECT_LIST_BUILD_TYPE_PART release)\nelseif(BUILD_DEBUG)\n    set(MongoDB_RELATIVE_BUILD_DIR build/debug)\n    set(MongoDB_OBJECT_LIST_BUILD_TYPE_PART debug)\nendif()\n\n# Set absolute path to build directory\nset(MongoDB_BUILD_DIR ${MongoDB_DIR}/${MongoDB_RELATIVE_BUILD_DIR})\n\n# Set commong compiler definitons\nset(MongoDB_DEFINITIONS\n    PCRE_STATIC\n    BOOST_THREAD_VERSION=4\n    BOOST_THREAD_DONT_PROVIDE_VARIADIC_THREAD\n    BOOST_THREAD_NO_DEPRECATED\n    BOOST_THREAD_DONT_PROVIDE_INTERRUPTIONS\n    BOOST_THREAD_HAS_BUG\n    MONGO_CONFIG_HAVE_HEADER_UNISTD_H\n    # Suppress \"warning C4996: std::allocator...\" from third_party\\abseil-cpp-master\n\t_SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING \n    # Suppress \"warning C4996: std::iterator...\" from third_party\\mozjs-60\n    _SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING\n)\n\n# Set common compiler include directories\nset(MOZJS_VER mozjs-60)\nset(MongoDB_INCLUDE_DIRS\n    ${MongoDB_DIR}/src    \n    ${MongoDB_DIR}/src/third_party/abseil-cpp-master/abseil-cpp\n    ${MongoDB_DIR}/src/third_party/boost-1.70.0    \n    ${MongoDB_DIR}/src/third_party/fmt/dist/include\n    ${MongoDB_DIR}/src/third_party/${MOZJS_VER}/include\n    ${MongoDB_DIR}/src/third_party/${MOZJS_VER}/mongo_sources\n    ${MongoDB_DIR}/src/third_party/pcre-8.42\n    ${MongoDB_DIR}/src/third_party/SafeInt\n    ${MongoDB_BUILD_DIR}\n)\n\nif(SYSTEM_LINUX)\n    set(MongoDB_OBJECT_LIST_PLATFORM_PART linux)\n    list(APPEND MongoDB_INCLUDE_DIRS\n        ${MongoDB_DIR}/src/third_party/${MOZJS_VER}/platform/x86_64/linux/include)\nelseif(SYSTEM_WINDOWS)\n    set(MongoDB_OBJECT_LIST_PLATFORM_PART windows)\n    list(APPEND MongoDB_INCLUDE_DIRS\n        ${MongoDB_DIR}/src/third_party/${MOZJS_VER}/platform/x86_64/windows/include)\nelseif(SYSTEM_MACOSX)\n    set(MongoDB_OBJECT_LIST_PLATFORM_PART macosx)\n    list(APPEND MongoDB_INCLUDE_DIRS\n        ${MongoDB_DIR}/src/third_party/${MOZJS_VER}/platform/x86_64/macOS/include)\nelseif(SYSTEM_FREEBSD)\n    set(MongoDB_OBJECT_LIST_PLATFORM_PART freebsd)\n    list(APPEND MongoDB_INCLUDE_DIRS\n        ${MongoDB_DIR}/src/third_party/${MOZJS_VER}/platform/x86_64/freebsd/include)\nelseif(SYSTEM_OPENBSD)\n    set(MongoDB_OBJECT_LIST_PLATFORM_PART openbsd)\n    list(APPEND MongoDB_INCLUDE_DIRS\n        ${MongoDB_DIR}/src/third_party/${MOZJS_VER}/platform/x86_64/openbsd/include)\nendif()\n\n# Read list of object files\n# See \"mongodb/README.md\" file (relative to the current folder) for more information.\nfile(READ\n    ${CMAKE_CURRENT_LIST_DIR}/mongodb/${MongoDB_OBJECT_LIST_PLATFORM_PART}-${MongoDB_OBJECT_LIST_BUILD_TYPE_PART}.objects\n    MongoDB_RELATIVE_LIBS)\n\nstring(STRIP \"${MongoDB_RELATIVE_LIBS}\" MongoDB_RELATIVE_LIBS)\n\n# Convert string to list\nstring(REPLACE \" \" \";\" MongoDB_RELATIVE_LIBS ${MongoDB_RELATIVE_LIBS})\n\n# todo: Find a better solution\n# Robo 1.4: Added as workaround fix for build error: \n# fatal error LNK1170: line in command file contains 131071 or more characters\n# Happens when the path of robo-shell is a long string (e.g. \"E:/user/code/robomongo-shell\")\nset(MongoDB_OBJECTS_DIR_ENV $ENV{MongoDB_OBJECTS})\nif(MongoDB_OBJECTS_DIR_ENV)\n  set(MongoDB_OBJECTS_DIR ${MongoDB_OBJECTS_DIR_ENV})\nelse()\n  set(MongoDB_OBJECTS_DIR ${MongoDB_DIR})\nendif()\n\n# Convert to absolute path\nforeach(lib ${MongoDB_RELATIVE_LIBS})\n  list(APPEND MongoDB_LIBS ${MongoDB_OBJECTS_DIR}/${lib})\nendforeach()\n\nif(SYSTEM_WINDOWS)\n  list(APPEND MongoDB_LIBS Crypt32.lib Secur32.lib Dnsapi.lib winhttp.lib) \nelseif(SYSTEM_MACOSX)\n  list(APPEND MongoDB_LIBS -lcurl) \nelseif(SYSTEM_LINUX)  \n  list(APPEND MongoDB_LIBS -lresolv -lcurl) \nendif()\n\n# Get MongoDB repository recent tag\nexecute_process(\n    COMMAND git describe --abbrev=0 --tags\n    WORKING_DIRECTORY ${MongoDB_DIR}\n    OUTPUT_VARIABLE MongoDB_RECENT_TAG\n    OUTPUT_STRIP_TRAILING_WHITESPACE\n)\n\n# Handle the QUIETLY and REQUIRED arguments and set ALSA_FOUND to TRUE if\n# all listed variables are TRUE\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(MongoDB\n    FOUND_VAR MongoDB_FOUND     # When using CMake 3.0 MONGODB_FOUND variable will be created.\n                                # Make it explicit that variable name is MongoDB_FOUND.\n    REQUIRED_VARS MongoDB_DIR MongoDB_BUILD_DIR\n    VERSION_VAR MongoDB_RECENT_TAG\n    FAIL_MESSAGE \"Could not find Robomongo Shell (MongoDB fork). Make sure that CMAKE_PREFIX_PATH points to Robomongo Shell project root.\\n\")\n\nif(MongoDB_FOUND)\n    set(MongoDB_VERSION ${MongoDB_RECENT_TAG})\n\n    # Original MongoDB link command has the following in the end: m rt dl\n    set(MongoDB_LIBS\n        ${LINK_WHOLE_ARCHIVE_START}   # Linux: -Wl,--whole-archive\n        ${LINK_LIBGROUP_START}        # Linux: -Wl,--start-group\n        ${MongoDB_LIBS}\n        ${LINK_LIBGROUP_END}          # Linux: -Wl,--end-group\n        ${LINK_WHOLE_ARCHIVE_END}     # Linux: -Wl,--no-whole-archive\n        ${CMAKE_DL_LIBS}              # Linux: dl\n    )\n\n    # Add imported target\n    add_library(mongodb INTERFACE IMPORTED)\n\n    # Specify INTERFACE properties for this target\n    set_target_properties(mongodb PROPERTIES\n        INTERFACE_LINK_LIBRARIES      \"${MongoDB_LIBS}\"\n        INTERFACE_COMPILE_DEFINITIONS \"${MongoDB_DEFINITIONS}\"\n        INTERFACE_INCLUDE_DIRECTORIES \"${MongoDB_INCLUDE_DIRS}\"\n    )\n\nendif()\n\n# Cleanup\nunset(MongoDB_OBJECT_LIST_BUILD_TYPE_PART)\nunset(MongoDB_OBJECT_LIST_PLATFORM_PART)\nunset(MongoDB_RELATIVE_BUILD_DIR)\nunset(MongoDB_RELATIVE_LIBS)\nunset(MongoDB_RECENT_TAG)\n"
  },
  {
    "path": "cmake/FindOpenSSL.cmake",
    "content": "##################################################\n# Find and Add OpenSSL shared (dynamic) library \n# \n# - This module defines the following variables:\n#   OpenSSL_DIR\n#   OPENSSL_VERSION\n#\n# - Imported shared(dynamic) libraries \"ssl\" and \"crypto\" are created.\n#\n# - It is assumed that OpenSSL has been built and path to OpenSSL build directory is \n#   added into system(environment) variable ROBOMONGO_CMAKE_PREFIX_PATH.\n#\n##################################################\n\n# Try to find OpenSSL directory (uses CMAKE_PREFIX_PATH locations)\n#-------------------------------------------\nfind_path(\n    OpenSSL_DIR include/openssl/ssl.h\n    DOC \"Path to OpenSSL (github.com/openssl/openssl) root directory\"\n)\n\n# Find OpenSSL version\n#-------------------------------------------\nset (OPENSSL_INCLUDE_DIR \"${OpenSSL_DIR}/include\")\n\nfunction(from_hex HEX DEC)\n  string(TOUPPER \"${HEX}\" HEX)\n  set(_res 0)\n  string(LENGTH \"${HEX}\" _strlen)\n\n  while (_strlen GREATER 0)\n    math(EXPR _res \"${_res} * 16\")\n    string(SUBSTRING \"${HEX}\" 0 1 NIBBLE)\n    string(SUBSTRING \"${HEX}\" 1 -1 HEX)\n    if (NIBBLE STREQUAL \"A\")\n      math(EXPR _res \"${_res} + 10\")\n    elseif (NIBBLE STREQUAL \"B\")\n      math(EXPR _res \"${_res} + 11\")\n    elseif (NIBBLE STREQUAL \"C\")\n      math(EXPR _res \"${_res} + 12\")\n    elseif (NIBBLE STREQUAL \"D\")\n      math(EXPR _res \"${_res} + 13\")\n    elseif (NIBBLE STREQUAL \"E\")\n      math(EXPR _res \"${_res} + 14\")\n    elseif (NIBBLE STREQUAL \"F\")\n      math(EXPR _res \"${_res} + 15\")\n    else()\n      math(EXPR _res \"${_res} + ${NIBBLE}\")\n    endif()\n\n    string(LENGTH \"${HEX}\" _strlen)\n  endwhile()\n\n  set(${DEC} ${_res} PARENT_SCOPE)\nendfunction()\n\nif (OPENSSL_INCLUDE_DIR)\n  if(OPENSSL_INCLUDE_DIR AND EXISTS \"${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h\")\n    file(STRINGS \"${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h\" openssl_version_str\n         REGEX \"^#[\\t ]*define[\\t ]+OPENSSL_VERSION_NUMBER[\\t ]+0x([0-9a-fA-F])+.*\")\n\n    # The version number is encoded as 0xMNNFFPPS: major minor fix patch status\n    # The status gives if this is a developer or prerelease and is ignored here.\n    # Major, minor, and fix directly translate into the version numbers shown in\n    # the string. The patch field translates to the single character suffix that\n    # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so\n    # on.\n\n    string(REGEX REPLACE \"^.*OPENSSL_VERSION_NUMBER[\\t ]+0x([0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F]).*$\"\n           \"\\\\1;\\\\2;\\\\3;\\\\4;\\\\5\" OPENSSL_VERSION_LIST \"${openssl_version_str}\")\n    list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR)\n    list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR)\n    from_hex(\"${OPENSSL_VERSION_MINOR}\" OPENSSL_VERSION_MINOR)\n    list(GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX)\n    from_hex(\"${OPENSSL_VERSION_FIX}\" OPENSSL_VERSION_FIX)\n    list(GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH)\n\n    if (NOT OPENSSL_VERSION_PATCH STREQUAL \"00\")\n      from_hex(\"${OPENSSL_VERSION_PATCH}\" _tmp)\n      # 96 is the ASCII code of 'a' minus 1\n      math(EXPR OPENSSL_VERSION_PATCH_ASCII \"${_tmp} + 96\")\n      unset(_tmp)\n      # Once anyone knows how OpenSSL would call the patch versions beyond 'z'\n      # this should be updated to handle that, too. This has not happened yet\n      # so it is simply ignored here for now.\n      string(ASCII \"${OPENSSL_VERSION_PATCH_ASCII}\" OPENSSL_VERSION_PATCH_STRING)\n    endif ()\n\n    set(OPENSSL_VERSION \"${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}\")\n  endif ()\nendif ()\n\n\n# Add imported ssl and crypto libraries\n#-------------------------------------------\n    \n# Add imported target ssl (ssleay32)\nadd_library(ssl SHARED IMPORTED)\n\n# Add imported target for crypto (libeay32)\nadd_library(crypto SHARED IMPORTED)\n    \n# todo: refactor\nif(SYSTEM_WINDOWS)\n    set_target_properties(ssl PROPERTIES\n        INTERFACE_INCLUDE_DIRECTORIES   \"${OpenSSL_DIR}/include\"\n        IMPORTED_IMPLIB                 \"${OpenSSL_DIR}/libssl.lib\"\n    )\n    set_target_properties(crypto PROPERTIES\n        INTERFACE_INCLUDE_DIRECTORIES   \"${OpenSSL_DIR}/include\"\n        IMPORTED_IMPLIB                 \"${OpenSSL_DIR}/libcrypto.lib\"\n    )\nelse()\n  if(SYSTEM_MACOSX)\n    SET(EXT \"dylib\")\n  elseif(SYSTEM_LINUX)\n    SET(EXT \"so\")\n  endif()\n  set_target_properties(ssl PROPERTIES\n      INTERFACE_INCLUDE_DIRECTORIES   \"${OpenSSL_DIR}/include\"\n      IMPORTED_LOCATION               \"${OpenSSL_DIR}/libssl.${EXT}\"\n  )\n  set_target_properties(crypto PROPERTIES\n      INTERFACE_INCLUDE_DIRECTORIES   \"${OpenSSL_DIR}/include\"\n      IMPORTED_LOCATION               \"${OpenSSL_DIR}/libcrypto.${EXT}\"\n  )  \nendif()\n\n# End of file"
  },
  {
    "path": "cmake/FindThreading.cmake",
    "content": "# This wrapper is created in order to support CMake 3.0\n# Only starting from CMake 3.1 \"Threads\" module exports\n# \"Threads::Threads\" target.\n\nfind_package(Threads REQUIRED)\n\n# Support for CMake 3.0\n# Export \"Threads::Threads\" imported target if it wasn't exported.\n# This lines are taken from the \"FindThreads.cmake\" of CMake 3.1:\n# https://github.com/Kitware/CMake/blob/v3.1.0/Modules/FindThreads.cmake\nif(THREADS_FOUND AND NOT TARGET Threads::Threads)\n    add_library(Threads::Threads INTERFACE IMPORTED)\n\n    if(THREADS_HAVE_PTHREAD_ARG)\n        set_property(TARGET Threads::Threads PROPERTY INTERFACE_COMPILE_OPTIONS \"-pthread\")\n    endif()\n\n    if(CMAKE_THREAD_LIBS_INIT)\n        set_property(TARGET Threads::Threads PROPERTY INTERFACE_LINK_LIBRARIES \"${CMAKE_THREAD_LIBS_INIT}\")\n    endif()\nendif()\n"
  },
  {
    "path": "cmake/RobomongoCMakeDefaults.cmake",
    "content": "# Put the include dirs which are in the source or build tree\n# before all other include dirs, so the headers in the sources\n# are prefered over the already installed ones\n# Since cmake 2.4.1\nset(CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON)\n\n# Use colored output\n# Since cmake 2.4.0\nset(CMAKE_COLOR_MAKEFILE ON)\n\n# MongoDB compiled with this option\nset(CMAKE_POSITION_INDEPENDENT_CODE ON)\n\n# This variable is used by CMake \"FindThreads\" module\n# From documentation to FindThreads module:\n#   > Please note that the compiler flag can only be\n#   > used with the imported target. Use of both the imported\n#   > target as well as this switch is highly recommended for new code.\nset(THREADS_PREFER_PTHREAD_FLAG ON)\n\n# Set the default build type to release with debug info\nif(NOT CMAKE_BUILD_TYPE)\n    set(CMAKE_BUILD_TYPE RelWithDebInfo\n        CACHE STRING \"Choose the type of build, options are: Debug, Release, RelWithDebInfo, MinSizeRel and None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used)\"\n        FORCE)\nendif()\n\n# Do not use Qt moc, uic and rcc by default\n# Since CMake 2.8.6\nset(CMAKE_AUTOMOC OFF)\nset(CMAKE_AUTORCC OFF)\nset(CMAKE_AUTOUIC OFF)\n"
  },
  {
    "path": "cmake/RobomongoCommon.cmake",
    "content": "\nset(ROBOMONGO_DISPLAY_NAME \"Robo 3T\")\nset(ROBOMONGO_DISPLAY_FULL_NAME \"Robo 3T ${PROJECT_VERSION}\")\n"
  },
  {
    "path": "cmake/RobomongoConfigurationSummary.cmake",
    "content": "# Set MONGO_BUILD_FOLDER\nset(MONGO_BUILD_FOLDER \"build/opt\")  # Release\nif(CMAKE_BUILD_TYPE STREQUAL \"Debug\") \n    set(MONGO_BUILD_FOLDER \"build/debug\") \nendif()\n\n# Show configuration summary and build tip\nmessage(\"\")\nmessage(\" _______________[ Robo 3T configuration summary ]________________\")\nmessage(\"| \")\nmessage(\"|-- Dependencies:\")\nmessage(\"| \")\nmessage(\"|   Qt5 Core:           ${Qt5Core_VERSION}    ${Qt5Core_DIR}\")\nmessage(\"|   Qt5 Gui:            ${Qt5Gui_VERSION}    ${Qt5Gui_DIR}\")\nmessage(\"|   Qt5 Widgets:        ${Qt5Widgets_VERSION}    ${Qt5Widgets_DIR}\")\nmessage(\"|   Qt5 PrintSupport:   ${Qt5Widgets_VERSION}    ${Qt5PrintSupport_DIR}\")\nmessage(\"|   Qt5 Network:        ${Qt5Network_VERSION}    ${Qt5Network_DIR}\")\nmessage(\"|   Qt5 Xml:            ${Qt5Xml_VERSION}    ${Qt5Xml_DIR}\")\nif(NOT SYSTEM_LINUX)\n    message(\"|   Qt5 WebEng*Widgets: ${Qt5WebEngineWidgets_VERSION}    ${Qt5WebEngineWidgets_DIR}\")\nendif()\nmessage(\"|   MongoDB:            ${MongoDB_VERSION}    ${MongoDB_DIR}\")\nmessage(\"|   MongoDB Objects:    ${MongoDB_VERSION}    ${MongoDB_OBJECTS_DIR}/${MONGO_BUILD_FOLDER}\")\nmessage(\"|   OpenSSL:            ${OPENSSL_VERSION}    ${OpenSSL_DIR}\")\nmessage(\"|   libssh2:            ${LIBSSH2_VERSION}     ${LIBSSH2_DIR}\")\nmessage(\"|   QJson:              ${QJSON_VERSION}     ${QJSON_DIR}\")\nmessage(\"|   QScintilla:         ${QSCINTILLA_VERSION}     ${QSCINTILLA_DIR}\")\nmessage(\"|   Google Test:        ${GOOGLE_TEST_VERSION}     ${GOOGLE_TEST_DIR}\")\nmessage(\"|   ESPRIMA:            ${ESPRIMA_VERSION}     ${ESPRIMA_DIR}\")\nmessage(\"|\")\nmessage(\"|-- Summary:\")\nmessage(\"|\")\nmessage(\"|   Version:            ${PROJECT_VERSION}\")\nmessage(\"|   System:             ${CMAKE_SYSTEM_NAME}\")\nif (SYSTEM_MACOSX)\n    message(\"|   Target SDK:         ${CMAKE_OSX_DEPLOYMENT_TARGET}\")\nendif()\nmessage(\"|   Build type:         ${CMAKE_BUILD_TYPE}\")\nmessage(\"|   Commit:             ${BUILD_NUMBER}\")\nmessage(\"|   Install path:       ${CMAKE_INSTALL_PREFIX}\")\nmessage(\"|\")\nmessage(\"|-- Build, Run and Install:\")\nmessage(\"| \")\nmessage(\"|     $ bin/build\")\nmessage(\"|     $ bin/run\")\nmessage(\"|     $ bin/install\")\nmessage(\"|\")\nmessage(\"|-- Run Unit Tests:\")\nmessage(\"| \")\nmessage(\"|     $ bin/build-and-run-tests\")\nmessage(\"|     $ bin/run-tests\")\nmessage(\"|\")\nmessage(\"|-- Run Static Code Analysis:\")\nmessage(\"|\")\nif (SYSTEM_WINDOWS)\n    message(\"|     $ bin/run-cppcheck <FILE_PATH OR DIR> (Default: /src/robomongo/)\")\n    message(\"|     $ bin/run-vs-code-analysis\")\nelse()\n    message(\"|     $ bin/run-clang-tidy\")\n    message(\"|     $ bin/run-scan-build\")\nendif()\nmessage(\"|__________________________________________________________________\")\nmessage(\"\")"
  },
  {
    "path": "cmake/RobomongoDefaults.cmake",
    "content": "# This files defines:\n#\n# 1) Platform checks\n#\n#    SYSTEM_MACOSX\n#    SYSTEM_WINDOWS\n#    SYSTEM_LINUX\n#    SYSTEM_FREEBSD\n#    SYSTEM_OPENBSD\n#    SYSTEM_NETBSD\n#\n# 2) Build types checks\n#\n#    BUILD_DEBUG\n#    BUILD_RELEASE\n#    BUILD_RELWITHDEBINFO\n#    BUILD_MINSIZEREL\n#\n# 3) Link \"lib groups\" and \"whole-archive\" options\n#\n#    LINK_LIBGROUP_START\n#    LINK_LIBGROUP_END\n#    LINK_WHOLE_ARCHIVE_START\n#    LINK_WHOLE_ARCHIVE_END\n\n# Platform checks\nif(CMAKE_SYSTEM_NAME MATCHES \"Darwin\")\n    set(SYSTEM_MACOSX TRUE)\nelseif(CMAKE_SYSTEM_NAME MATCHES \"Windows\")\n    set(SYSTEM_WINDOWS TRUE)\nelseif(CMAKE_SYSTEM_NAME MATCHES \"Linux\")\n    set(SYSTEM_LINUX TRUE)\nelseif(CMAKE_SYSTEM_NAME MATCHES \"FreeBSD\")\n    set(SYSTEM_FREEBSD TRUE)\n    set(SYSTEM_BSD TRUE)\nelseif(CMAKE_SYSTEM_NAME MATCHES \"OpenBSD\")\n    set(SYSTEM_OPENBSD TRUE)\n    set(SYSTEM_BSD TRUE)\nelseif(CMAKE_SYSTEM_NAME MATCHES \"NetBSD\")\n    set(SYSTEM_NETBSD TRUE)\n    set(SYSTEM_BSD TRUE)\nendif()\n\n# Build types\nif(\"${CMAKE_BUILD_TYPE}\" MATCHES \"Debug\")\n    set(BUILD_DEBUG TRUE)\nelseif(\"${CMAKE_BUILD_TYPE}\" MATCHES \"Release\")\n    set(BUILD_RELEASE TRUE)\nelseif(\"${CMAKE_BUILD_TYPE}\" MATCHES \"RelWithDebInfo\")\n    set(BUILD_RELWITHDEBINFO TRUE)\nelseif(\"${CMAKE_BUILD_TYPE}\" MATCHES \"MinSizeRel\")\n    set(BUILD_MINSIZEREL TRUE)\nendif()\n\n# Compiler checks\n# We check Clang using MATCH instead of strict equality, because as of CMake 3.0.0 the\n# CMAKE_<LANG>_COMPILER_ID value for Apple-provided Clang is AppleClang. To test\n# for both the Apple-provided Clang and the regular Clang we use MATCH.\nif(CMAKE_CXX_COMPILER_ID MATCHES \"Clang\")\n    set(COMPILER_CLANG TRUE)\nelseif(CMAKE_CXX_COMPILER_ID MATCHES \"^GNU$\")\n    set(COMPILER_GCC TRUE)\nelseif(CMAKE_CXX_COMPILER_ID MATCHES \"^MSVC$\")\n    set(COMPILER_MSVC TRUE)\nendif()\n\n# Link \"groups\" and \"whole-archive\" options\nif(SYSTEM_LINUX OR SYSTEM_FREEBSD OR SYSTEM_OPENBSD)\n    set(LINK_LIBGROUP_START        -Wl,--start-group)\n    set(LINK_LIBGROUP_END          -Wl,--end-group)\n    set(LINK_WHOLE_ARCHIVE_START   -Wl,--whole-archive)\n    set(LINK_WHOLE_ARCHIVE_END     -Wl,--no-whole-archive)\nelseif(SYSTEM_MACOSX)\n    set(LINK_LIBGROUP_START        \"\")\n    set(LINK_LIBGROUP_END          \"\")\n    set(LINK_WHOLE_ARCHIVE_START   -Wl,-all_load)\n    set(LINK_WHOLE_ARCHIVE_END     -Wl,-noall_load)\nendif()\n"
  },
  {
    "path": "cmake/RobomongoInstall.cmake",
    "content": "# Note for maintainers\n# --------------------\n#\n# Do not use absolute paths in DESTINATION arguments for install() command.\n# Because the same install code will be executed again by CPack. And CPack will\n# change internally CMAKE_INSTALL_PREFIX to point to some temporary folder\n# for package content.\n#\n#\n\n\n# Temporary change\nset(CMAKE_INSTALL_PREFIX \"${CMAKE_BINARY_DIR}/install\"\n    CACHE STRING \"Install path prefix, prepended onto install directories\"\n    FORCE)\n\nif(SYSTEM_LINUX)\n    set(bin_dir             bin)\n    set(lib_dir             lib)\n    set(resources_dir       share)\n    set(license_dir         .)\n\n    set(qt_plugins_dir      ${lib_dir})\n    set(qt_conf_dir         ${bin_dir})\n    set(qt_conf_plugins     \"../lib\")\nelseif(SYSTEM_MACOSX)\n    set(bundle_name         \"Robo 3T.app\")\n    set(contents_path       ${bundle_name}/Contents)\n\n    set(bin_dir             ${contents_path}/MacOS)\n    set(styles_dir          ${contents_path}/MacOS/styles)\n    set(lib_dir             ${contents_path}/Frameworks)\n    set(resources_dir       ${contents_path}/Resources)\n    set(license_dir         ${resources_dir})\n\n    set(qt_plugins_dir      ${contents_path}/PlugIns/Qt)\n    set(qt_conf_dir         ${resources_dir})\n    set(qt_conf_plugins     \"PlugIns/Qt\")\nelseif(SYSTEM_WINDOWS)\n    set(bin_dir             .)\n    set(styles_dir          ${bin_dir}/styles)\n    set(lib_dir             .)\n    set(resources_dir       ./resources)\n    set(license_dir         .)\n\n    set(qt_plugins_dir      ${lib_dir})\n    set(qt_conf_dir         ${bin_dir})\n    set(qt_conf_plugins     .)\nendif()\n\n# Generate qt.conf file\nconfigure_file(\n    \"${CMAKE_SOURCE_DIR}/install/qt.conf.in\"\n    \"${CMAKE_BINARY_DIR}/qt.conf\")\n\n# Install qt.conf file\ninstall(\n    FILES       \"${CMAKE_BINARY_DIR}/qt.conf\"\n    DESTINATION \"${qt_conf_dir}\")\n\n# Install OpenSSL dynamic lib files\nif(SYSTEM_WINDOWS)\n    install(\n        FILES \n        \"${OpenSSL_DIR}/libssl-1_1-x64.dll\"\n        \"${OpenSSL_DIR}/libcrypto-1_1-x64.dll\"\n        DESTINATION ${bin_dir})\nelseif(SYSTEM_MACOSX)\n    install(\n        FILES \n        \"${OpenSSL_DIR}/libssl.1.1.dylib\"\n        \"${OpenSSL_DIR}/libcrypto.1.1.dylib\"\n        DESTINATION ${lib_dir}/lib)\nelseif(SYSTEM_LINUX)\n    install(\n        FILES \n        \"${OpenSSL_DIR}/libssl.so\"\n        \"${OpenSSL_DIR}/libssl.so.1.0.0\"        \n        \"${OpenSSL_DIR}/libcrypto.so\"        \n        \"${OpenSSL_DIR}/libcrypto.so.1.0.0\"\n        DESTINATION ${lib_dir})         \nendif()\n\n# Install binary\ninstall(\n    TARGETS robomongo\n    RUNTIME DESTINATION ${bin_dir}\n    BUNDLE DESTINATION .)\n\n# Install license, copyright and changelogs files\ninstall(\n    FILES\n        ${CMAKE_SOURCE_DIR}/LICENSE\n        ${CMAKE_SOURCE_DIR}/COPYRIGHT\n        ${CMAKE_SOURCE_DIR}/CHANGELOG\n        ${CMAKE_SOURCE_DIR}/DESCRIPTION\n    DESTINATION ${license_dir})\n\n# Install common dependencies\nSET(QT_LIBS Core Gui Widgets PrintSupport Network Xml)\nif(NOT SYSTEM_LINUX)\n    SET(QT_LIBS ${QT_LIBS} WebEngineWidgets WebEngineCore Quick \n                           QuickWidgets WebChannel Qml Positioning)\nendif()\ninstall_qt_lib(${QT_LIBS})\ninstall_qt_plugins(QGifPlugin QICOPlugin)\ninstall_icu_libs()\nset(QT_STYLES_DIR ${Qt5Core_DIR}/../../../plugins/styles/)\nset(QT_BIN_DIR ${Qt5Core_DIR}/../../../bin/)\nset(QT_RESOURCES_DIR ${Qt5Core_DIR}/../../../resources/)\n\nif(SYSTEM_LINUX)\n    install_qt_lib(XcbQpa DBus)\n    install_qt_plugins(\n        QXcbIntegrationPlugin)\n        \n    install(\n        FILES\n            \"/usr/lib/x86_64-linux-gnu/libstdc++.so.6\"\n            \"/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28\"              \n        DESTINATION ${lib_dir})\nelseif(SYSTEM_MACOSX)\n    install_qt_lib(MacExtras DBus)\n    install_qt_plugins(\n        QCocoaIntegrationPlugin\n        QMinimalIntegrationPlugin\n        QOffscreenIntegrationPlugin)\n\n    # Install icon\n    install(\n        FILES       \"${CMAKE_SOURCE_DIR}/install/macosx/robomongo.icns\"\n        DESTINATION \"${resources_dir}\")\n\n    # Install styles    \n    install(FILES \"${QT_STYLES_DIR}/libqmacstyle.dylib\" DESTINATION ${styles_dir})\nelseif(SYSTEM_WINDOWS)\n    install_qt_plugins(\n        QWindowsIntegrationPlugin\n        QMinimalIntegrationPlugin\n        QOffscreenIntegrationPlugin)\n\n    # Qt WebEngine dependencies\n    install(DIRECTORY ${QT_RESOURCES_DIR} DESTINATION ${resources_dir})\n    install(FILES \n                \"${QT_BIN_DIR}/libEGL.dll\"\n                \"${QT_BIN_DIR}/libGLESv2.dll\" \n                \"${QT_BIN_DIR}/opengl32sw.dll\" \n                \"${QT_BIN_DIR}/QtWebEngineProcess.exe\" \n            DESTINATION ${bin_dir})\n\n    # Install Styles\n    install(FILES \"${QT_STYLES_DIR}/qwindowsvistastyle.dll\" DESTINATION ${styles_dir})\n\n    # Install runtime libraries:\n    # msvcp120.dll\n    # msvcr120.dll\n    set(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION .)\n    include(InstallRequiredSystemLibraries)\nendif()\n"
  },
  {
    "path": "cmake/RobomongoInstallQt.cmake",
    "content": "function(install_qt_lib)\n    foreach(module ${ARGV})\n        set(target_name Qt5::${module})\n        set(module_name Qt5${module})\n\n        # Get full path to some known Qt library (i.e. /path/to/lib/libQt5Widgets.so.5.5.1)\n        get_target_property(target_path Qt5::Core LOCATION)\n\n        # Get folder path of library (i.e. /path/to/lib)\n        get_filename_component(qt_lib_dir ${target_path} DIRECTORY)\n\n        if (SYSTEM_LINUX)\n            # Not very good solution, but we simply take all files with *Qt5<module>* in names (including symlinks)\n            file(GLOB module_libs ${qt_lib_dir}/${CMAKE_SHARED_LIBRARY_PREFIX}${module_name}*)\n\n            # Install to \"lib\" folder\n            install(FILES ${module_libs}\n                DESTINATION ${lib_dir})\n        endif()\n\n        if(SYSTEM_MACOSX)\n            set(module_name Qt${module})\n\n            # On Mac OS we are still located in .framework folder,\n            # and we need to go one level up\n            get_filename_component(qt_lib_dir ${qt_lib_dir} DIRECTORY)\n\n            install(\n                DIRECTORY ${qt_lib_dir}/${module_name}.framework\n                DESTINATION ${lib_dir}\n                USE_SOURCE_PERMISSIONS\n                PATTERN \"*_debug\" EXCLUDE      # Exclude debug libraries\n                PATTERN \"Headers\" EXCLUDE)     # Exclude Headers folders\n        endif()\n\n        if (SYSTEM_WINDOWS)\n            # Install single DLL to lib directory\n            install(FILES ${qt_lib_dir}/${module_name}${CMAKE_SHARED_LIBRARY_SUFFIX}\n                    DESTINATION ${lib_dir})\n        endif()\n\n    endforeach()\nendfunction()\n\nfunction(install_icu_libs)\n    # We are trying to get 'lib' folder of Qt installation.\n    # For this we take some known target (Qt5::Core in this case)\n    # and taking path to this library.\n\n    # Get full path to known library (i.e. /path/to/lib/libQt5Core.so.5.5.1)\n    get_target_property(target_path Qt5::Core LOCATION)\n\n    # Get absolute path to 'lib' folder (which is a parent folder of 'known' library)\n    get_filename_component(qt_lib_dir ${target_path} DIRECTORY)\n\n    # Not very good solution, but we simply take all files with *icu* in names (including symlinks)\n    file(GLOB icu_libs ${qt_lib_dir}/${CMAKE_SHARED_LIBRARY_PREFIX}icu*)\n\n    # Install to \"lib\" folder\n    install(FILES ${icu_libs}\n        DESTINATION ${lib_dir})\nendfunction()\n\n# Installs Qt5 plugins. Uses value of global variable \"qt_plugins_dir\" as\n# absolute path to where install plugins.\n#\n# You can find list of plugin names by examing this variable: Qt5<Module>_PLUGINS\n# For example, Qt5Gui_PLUGINS.\n#\n# Debug plugins, running application in this way:\n# QT_DEBUG_PLUGINS=1 ./yourapp\n#\n# Some examples of plugin names:\n# QGifPlugin, QGtk2ThemePlugin, QIbusPlatformInputContextPlugin\n#\n# Sample:\n#    install_qt_plugins(QGifPlugin QGtk2ThemePlugin QIbusPlatformInputContextPlugin)\n#\nfunction(install_qt_plugins)\n    foreach(name ${ARGV})\n        set(target_name Qt5::${name})\n\n        # We are trying to get 'plugins' folder of Qt installation.\n\n        # Get full path to plugin library (i.e. /path/to/plugins/imageformats/libqgif.so)\n        get_target_property(target_path ${target_name} LOCATION)\n\n        # Get absolute path to parent folder (i.e. /path/to/plugins/imageformats for Qt5::QGifPlugin)\n        get_filename_component(plugin_dir ${target_path} DIRECTORY)\n\n        # Get plugin parent directory (i.e. \"imageformats\" for Qt5::QGifPlugin)\n        get_filename_component(plugin_dir_name ${plugin_dir} NAME)\n\n        # Get plugin file name (i.e. \"libqgif.so\" for Qt5::QGifPlugin)\n        get_filename_component(plugin_file_name ${target_path} NAME)\n\n        # Get absolute path to plugins folder (i.e. /path/to/plugins)\n        get_filename_component(plugins_dir ${plugin_dir} DIRECTORY)\n\n        # Install to \"lib\" folder\n        install(\n            FILES ${target_path}\n            DESTINATION ${qt_plugins_dir}/${plugin_dir_name})\n    endforeach()\nendfunction()\n\n"
  },
  {
    "path": "cmake/RobomongoPackage.cmake",
    "content": "# Notes for maintainers.\n#\n# 1. Make sure that we use only lowercase letters in file name of outputed\n#    package for all platforms and package types.\n#\n\n# Get last commit hash\nexecute_process(\n    COMMAND git rev-parse --short HEAD\n    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}\n    OUTPUT_VARIABLE git_hash\n    OUTPUT_STRIP_TRAILING_WHITESPACE)\n\n# Timestamp (not used for now)\nstring(TIMESTAMP timestamp \"%Y-%m-%d\")\n\n# Package name (as it should appear in UI)\nset(CPACK_PACKAGE_NAME robo3t)\n\n# Version of the package\nset(CPACK_PACKAGE_VERSION_MAJOR     ${PROJECT_VERSION_MAJOR})\nset(CPACK_PACKAGE_VERSION_MINOR     ${PROJECT_VERSION_MINOR})\nset(CPACK_PACKAGE_VERSION_PATCH     ${PROJECT_VERSION_PATCH})\nset(CPACK_PACKAGE_VERSION           ${PROJECT_VERSION})\n\n# Where to put generated package\nset(CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR}/package)\n\n# Disables the component-based install process for installers\n# that support it (NSIS, for instance)\nset(CPACK_MONOLITHIC_INSTALL ON)\n\n# Strip debug information on platforms that support it\nset(CPACK_STRIP_FILES ON)\n\n# Additional information\nset(CPACK_PACKAGE_VENDOR \"3T Software Labs Ltd\")\nset(CPACK_PACKAGE_CONTACT robo3t@3t.io)\nset(CPACK_PACKAGE_DESCRIPTION \"Shell-centric cross-platform MongoDB management tool.\")\nset(CPACK_PACKAGE_DESCRIPTION_SUMMARY \"Robo 3T is a shell-centric cross-platform MongoDB management tool.\")\n\n# Use lowercase for system name and package file name\nstring(TOLOWER ${CMAKE_SYSTEM_NAME} system_name)\nstring(TOLOWER ${CPACK_PACKAGE_NAME} package_file_name)\nstring(TOLOWER ${CPACK_PACKAGE_VERSION} package_file_version)\n\n# We use function from TargetArch.cmake module\n# Returns string with target architecture value\n# Output for common architectures is: i386 or x86_64\ntarget_architecture(target_arch)\n\n# Package file name\nset(CPACK_PACKAGE_FILE_NAME ${package_file_name}-${package_file_version}-${system_name}-${target_arch}-${git_hash})\n\nif(SYSTEM_LINUX)\n    set(CPACK_GENERATOR TGZ)\n\n\nelseif(SYSTEM_MACOSX)\n    set(CPACK_GENERATOR DragNDrop)\n    set(CPACK_DMG_DS_STORE ${CMAKE_SOURCE_DIR}/install/macosx/DMG_DS_Store)\n\nelseif(SYSTEM_WINDOWS)\n    set(files_dir \"${CMAKE_SOURCE_DIR}/install/windows\")\n    set(exe_name \"robo3t.exe\")\n\n    set(CPACK_GENERATOR NSIS ZIP)\n    set(CPACK_PACKAGE_DESCRIPTION_FILE \"${CMAKE_SOURCE_DIR}/DESCRIPTION\")\n\n    # License file will be shown in the installation wizard\n    set(CPACK_RESOURCE_FILE_LICENSE \"${CMAKE_SOURCE_DIR}/LICENSE\")\n\n    # Default installation directory (not full path), just the path after\n    # default \"c:\\Program Files\"\n    set(CPACK_PACKAGE_INSTALL_DIRECTORY \"${ROBOMONGO_DISPLAY_FULL_NAME}\")\n\n    # A path to the executable inside installed package that contains icon\n    # This icon is used in Windows \"Add or remove programs\" control panel\n    set(CPACK_NSIS_INSTALLED_ICON_NAME \"\\\\\\\\${exe_name}\")\n\n    # Create shortcuts on desktop and start-up menu\n    set(CPACK_NSIS_CREATE_ICONS_EXTRA \"\n        CreateShortCut '$SMPROGRAMS\\\\\\\\$STARTMENU_FOLDER\\\\\\\\${ROBOMONGO_DISPLAY_FULL_NAME}.lnk' '$INSTDIR\\\\\\\\${exe_name}'\n        CreateShortCut '$DESKTOP\\\\\\\\${ROBOMONGO_DISPLAY_FULL_NAME}.lnk' '$INSTDIR\\\\\\\\${exe_name}'\n    \")\n\n    # Cleanup during uninstallation. This cleanup is required because shortcuts\n    # will not be deleted automatically.\n    # Without line '!insertmacro...' shortcut in start menu will not be removed\n    # (i.e. it doesn't work when we referece '$STARTMENU_FOLDER' that is used\n    # when creating shortcuts). This solution was found somewhere in internet.\n    set(CPACK_NSIS_DELETE_ICONS_EXTRA \"\n        !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP\n        Delete '$DESKTOP\\\\\\\\${ROBOMONGO_DISPLAY_FULL_NAME}.lnk'\n        Delete '$SMPROGRAMS\\\\\\\\$MUI_TEMP\\\\\\\\${ROBOMONGO_DISPLAY_FULL_NAME}.lnk'\n    \")\n\n    # The title displayed at the top of the installer\n    set(CPACK_NSIS_PACKAGE_NAME \"${ROBOMONGO_DISPLAY_FULL_NAME}\")\n\n    # Installer images (for sidebar and topbar)\n    set(CPACK_PACKAGE_ICON \"${files_dir}\\\\\\\\nsis-topbar.bmp\")\n    set(CPACK_NSIS_INSTALLER_MUI_ICON_CODE \"!define MUI_WELCOMEFINISHPAGE_BITMAP \\\\\\\"${files_dir}\\\\\\\\nsis-sidebar.bmp\\\\\\\"\")\n\n    # URL to a web site providing more information about application\n    # This url was noticed at least in \"Add or remove programs\" control\n    # panel.\n    set(CPACK_NSIS_URL_INFO_ABOUT \"www.robomongo.org\")\n\n    # Specify an executable to add an option to run on the finish\n    # page of the NSIS installer. Without \"..\\\\\\\\\" it dowsn't work for NSIS 2.5\n    set(CPACK_NSIS_MUI_FINISHPAGE_RUN \"..\\\\\\\\${exe_name}\")\n\n    # Trying to set for installer and uninstaller, but this is\n    # doesn't work and default icons are still used...\n    set(CPACK_NSIS_MUI_ICON \"${files_dir}\\\\\\\\robomongo.ico\")\n    set(CPACK_NSIS_MUI_UNIICON \"${files_dir}\\\\\\\\robomongo.ico\")\nendif()\n\ninclude(CPack)\n"
  },
  {
    "path": "cmake/RobomongoPrintUtils.cmake",
    "content": "###\n# Prints CMake variables.\n#\n# Print all variables in the current scope:\n#\n# print_vars()\n# print_vars(\"\")           # the same result, as previous line\n#\n# Print all variables with names, matching regex, case insensitive:\n#\n# print_vars(\"SOMEVAR\")\n# print_vars(\"someVar\")    # the same result, as previous line\n# print_vars(\"^CMAKE\")       # print all variables, that starts from \"CMAKE\"\n# print_vars(\"VAR$\")       # ends by \"VAR\"\n# print_vars(\"^VAR$\")      # exact match\n#\nfunction(print_vars)\n    if(ARGV0)\n        set(regex ${ARGV0})\n    endif()\n    get_cmake_property(names VARIABLES)\n    foreach(name ${names})\n        # Make lowercase variants for case-insensitive comparing\n        string(TOLOWER \"${name}\" lc_name)\n        string(TOLOWER \"${regex}\" lc_regex)\n\n        if(lc_name MATCHES \"${lc_regex}\")\n            message(\"${name}=${${name}}\")\n        endif()\n    endforeach()\nendfunction()\n\n\n###\n# Print content of variable.\n#\n# print_var(PROJECT_NAME)\n# print_var(\"PROJECT_NAME\")   # the same result as previous line\n#\nfunction(print_var name)\n\n    # Show nice output for not defined or empty variables\n    if(NOT DEFINED ${name})\n        set(value \" is not defined.\")\n    elseif(\"${${name}}\" STREQUAL \"\")\n        set(value \" is defined but empty.\")\n    else()\n        set(value \"=${${name}}\")\n    endif()\n\n    message(\"${name}${value}\")\nendfunction()\n\n###\n# Prints included directories\n#\nfunction(print_include_dirs)\n    get_property(dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)\n    foreach(dir ${dirs})\n        message(\"${dir}\")\n    endforeach()\nendfunction()\n\n###\n# Prints link directories\n#\nfunction(print_link_dirs)\n    get_property(dirs DIRECTORY PROPERTY LINK_DIRECTORIES)\n    foreach(dir ${dirs})\n        message(\"${dir}\")\n    endforeach()\nendfunction()\n\n###\n# Prints compile definitions\n#\nfunction(print_compile_definitions)\n    get_property(defs DIRECTORY PROPERTY COMPILE_DEFINITIONS)\n    foreach(def ${defs})\n        message(\"${def}\")\n    endforeach()\nendfunction()\n\n\n###\n# Prints target include directories\n#\nfunction(print_target_include_dirs target)\n    get_property(dirs TARGET ${target} PROPERTY INTERFACE_INCLUDE_DIRECTORIES)\n    foreach(dir ${dirs})\n        message(\"${dir}\")\n    endforeach()\nendfunction()\n\n###\n# Prints target compile definitions\n#\nfunction(print_target_compile_definitions target)\n    get_property(defs TARGET ${target} PROPERTY INTERFACE_COMPILE_DEFINITIONS)\n    foreach(def ${defs})\n        message(\"${def}\")\n    endforeach()\nendfunction()\n\n###\n# Prints target link libraries\n#\nfunction(print_target_link_libraries target)\n    get_property(defs TARGET ${target} PROPERTY INTERFACE_LINK_LIBRARIES)\n    foreach(def ${defs})\n        message(\"${def}\")\n    endforeach()\nendfunction()\n\n###\n# Prints Qt5 module plugins\n#\nfunction(print_qt_module_plugins module)\n    foreach(plugin ${Qt5${module}_PLUGINS})\n        get_target_property(loc ${plugin} LOCATION)\n        message(\"Plugin ${plugin} is at location ${loc}\")\n    endforeach()\nendfunction()\n"
  },
  {
    "path": "cmake/RobomongoTargetArch.cmake",
    "content": "# Copyright (c) 2012 Petroules Corporation. All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the\n# following conditions are met:\n#\n# Redistributions of source code must retain the above copyright notice, this list of conditions and the following\n# disclaimer.\n#\n# Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following\n# disclaimer in the documentation and/or other materials provided with the distribution.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED\n# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n# POSSIBILITY OF SUCH DAMAGE.\n\n# Based on the Qt 5 processor detection code, so should be very accurate\n# https://qt.gitorious.org/qt/qtbase/blobs/master/src/corelib/global/qprocessordetection.h\n# Currently handles arm (v5, v6, v7), x86 (32/64), ia64, and ppc (32/64)\n\n# Regarding POWER/PowerPC, just as is noted in the Qt source,\n# \"There are many more known variants/revisions that we do not handle/detect.\"\n\nset(archdetect_c_code \"\n#if defined(__arm__) || defined(__TARGET_ARCH_ARM)\n    #if defined(__ARM_ARCH_7__) \\\\\n        || defined(__ARM_ARCH_7A__) \\\\\n        || defined(__ARM_ARCH_7R__) \\\\\n        || defined(__ARM_ARCH_7M__) \\\\\n        || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 7)\n        #error cmake_ARCH armv7\n    #elif defined(__ARM_ARCH_6__) \\\\\n        || defined(__ARM_ARCH_6J__) \\\\\n        || defined(__ARM_ARCH_6T2__) \\\\\n        || defined(__ARM_ARCH_6Z__) \\\\\n        || defined(__ARM_ARCH_6K__) \\\\\n        || defined(__ARM_ARCH_6ZK__) \\\\\n        || defined(__ARM_ARCH_6M__) \\\\\n        || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 6)\n        #error cmake_ARCH armv6\n    #elif defined(__ARM_ARCH_5TEJ__) \\\\\n        || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 5)\n        #error cmake_ARCH armv5\n    #else\n        #error cmake_ARCH arm\n    #endif\n#elif defined(__i386) || defined(__i386__) || defined(_M_IX86)\n    #error cmake_ARCH i386\n#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64)\n    #error cmake_ARCH x86_64\n#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)\n    #error cmake_ARCH ia64\n#elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \\\\\n      || defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC)  \\\\\n      || defined(_M_MPPC) || defined(_M_PPC)\n    #if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__)\n        #error cmake_ARCH ppc64\n    #else\n        #error cmake_ARCH ppc\n    #endif\n#endif\n\n#error cmake_ARCH unknown\n\")\n\n# Set ppc_support to TRUE before including this file or ppc and ppc64\n# will be treated as invalid architectures since they are no longer supported by Apple\n\nfunction(target_architecture output_var)\n    if(APPLE AND CMAKE_OSX_ARCHITECTURES)\n        # On OS X we use CMAKE_OSX_ARCHITECTURES *if* it was set\n        # First let's normalize the order of the values\n\n        # Note that it's not possible to compile PowerPC applications if you are using\n        # the OS X SDK version 10.6 or later - you'll need 10.4/10.5 for that, so we\n        # disable it by default\n        # See this page for more information:\n        # http://stackoverflow.com/questions/5333490/how-can-we-restore-ppc-ppc64-as-well-as-full-10-4-10-5-sdk-support-to-xcode-4\n\n        # Architecture defaults to i386 or ppc on OS X 10.5 and earlier, depending on the CPU type detected at runtime.\n        # On OS X 10.6+ the default is x86_64 if the CPU supports it, i386 otherwise.\n\n        foreach(osx_arch ${CMAKE_OSX_ARCHITECTURES})\n            if(\"${osx_arch}\" STREQUAL \"ppc\" AND ppc_support)\n                set(osx_arch_ppc TRUE)\n            elseif(\"${osx_arch}\" STREQUAL \"i386\")\n                set(osx_arch_i386 TRUE)\n            elseif(\"${osx_arch}\" STREQUAL \"x86_64\")\n                set(osx_arch_x86_64 TRUE)\n            elseif(\"${osx_arch}\" STREQUAL \"ppc64\" AND ppc_support)\n                set(osx_arch_ppc64 TRUE)\n            else()\n                message(FATAL_ERROR \"Invalid OS X arch name: ${osx_arch}\")\n            endif()\n        endforeach()\n\n        # Now add all the architectures in our normalized order\n        if(osx_arch_ppc)\n            list(APPEND ARCH ppc)\n        endif()\n\n        if(osx_arch_i386)\n            list(APPEND ARCH i386)\n        endif()\n\n        if(osx_arch_x86_64)\n            list(APPEND ARCH x86_64)\n        endif()\n\n        if(osx_arch_ppc64)\n            list(APPEND ARCH ppc64)\n        endif()\n    else()\n        file(WRITE \"${CMAKE_BINARY_DIR}/arch.c\" \"${archdetect_c_code}\")\n\n        enable_language(C)\n\n        # Detect the architecture in a rather creative way...\n        # This compiles a small C program which is a series of ifdefs that selects a\n        # particular #error preprocessor directive whose message string contains the\n        # target architecture. The program will always fail to compile (both because\n        # file is not a valid C program, and obviously because of the presence of the\n        # #error preprocessor directives... but by exploiting the preprocessor in this\n        # way, we can detect the correct target architecture even when cross-compiling,\n        # since the program itself never needs to be run (only the compiler/preprocessor)\n        try_run(\n            run_result_unused\n            compile_result_unused\n            \"${CMAKE_BINARY_DIR}\"\n            \"${CMAKE_BINARY_DIR}/arch.c\"\n            COMPILE_OUTPUT_VARIABLE ARCH\n            CMAKE_FLAGS CMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}\n        )\n\n        # Parse the architecture name from the compiler output\n        string(REGEX MATCH \"cmake_ARCH ([a-zA-Z0-9_]+)\" ARCH \"${ARCH}\")\n\n        # Get rid of the value marker leaving just the architecture name\n        string(REPLACE \"cmake_ARCH \" \"\" ARCH \"${ARCH}\")\n\n        # If we are compiling with an unknown architecture this variable should\n        # already be set to \"unknown\" but in the case that it's empty (i.e. due\n        # to a typo in the code), then set it to unknown\n        if (NOT ARCH)\n            set(ARCH unknown)\n        endif()\n    endif()\n\n    set(${output_var} \"${ARCH}\" PARENT_SCOPE)\nendfunction()"
  },
  {
    "path": "cmake/RobomongoTrashSymbols.cmake",
    "content": "if(SYSTEM_LINUX OR SYSTEM_MACOSX)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -std=c++11\")\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -std=gnu99\")\nelseif(SYSTEM_WINDOWS)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -D_UNICODE -DUNICODE -DWIN32 -D_WIN32 -D_CRT_SECURE_NO_WARNINGS -DBOOST_ALL_NO_LIB\")\n\n    # Do not show some warnings. We turned off the same warnings as MongoDB do\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351\")\n\n    # The /MP option can reduce the total time to compile the source files. This option\n    # causes the compiler to create one or more copies of itself, each in a separate process.\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} /MP\")\n    set(CMAKE_C_FLAGS \"${CMAKE_CXX_FLAGS} /MP\")\n\n    set(CMAKE_CXX_STANDARD_LIBRARIES \"${CMAKE_CXX_STANDARD_LIBRARIES} psapi.lib bcrypt.lib Iphlpapi.lib dbghelp.lib ws2_32.lib winmm.lib version.lib\")\nendif()\n\nset(PROJECT_NAME \"Robo 3T\")\nset(PROJECT_NAME_TITLE ${PROJECT_NAME})\nset(PROJECT_DOMAIN \"www.robomongo.org\")\nset(PROJECT_COMPANYNAME \"3T Software Labs Ltd\")\nset(PROJECT_COPYRIGHT \"Copyright (C) 2014-2017 ${PROJECT_COMPANYNAME} All Rights Reserved.\")\nset(PROJECT_COMPANYNAME_DOMAIN \"https://studio3t.com/\")\nset(PROJECT_GITHUB_FORK \"www.github.com/Studio3T/robomongo\")\nset(PROJECT_GITHUB_ISSUES \"www.github.com/Studio3T/robomongo/issues\")\n\nstring(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWERCASE)\n"
  },
  {
    "path": "cmake/mongodb/README.md",
    "content": "\nSee these docs for the latest info about this topic:\n-------------\n- [Build Robo 3T - Mac OS X and Linux](https://github.com/paralect/robomongo/blob/master/docs/BuildRobo3TOnMacAndLinux.md) \n- [Build Robo 3T - Windows](https://github.com/paralect/robomongo/blob/master/docs/BuildRobo3TOnWindows.md)\n\n------------------------------------  \n\nWhat is this? \n-------------\n\nFiles in this folder are read by FindMongoDB.cmake script.\n\nWe link with MongoDB shell using objects instead of static libs, because:\n\n> We require the use of the 'object' mode for release builds because it is the only linking\n> model that works across all of our platforms. We would like to ensure that all of our\n> released artifacts are built with the same known-good-everywhere model.\n\nThis is a quote from root SConstruct file in MongoDB repository. \n\nIt is possible to build MongoDB shell in the following way:\n\n    $ scons mongo --link-model=static\n    \nThan we will have produced static libs that we can link with. But in release mode MongoDB \nSConstruct file do not support static link mode by default. This command will *not* work:\n\n    $ scons mongo --release --link-model=static\n    \nWe decided to use object link mode even for debug builds, in order to use single mode across \nall platforms and configurations. \n\nHow did you receive content for this files?\n-------------------------------------------\n\nFirst we build MongoDB shell with the following command:\n\n    $ scons mongo -j8 --release\n    \nThan we remove compiled `mongo` and run the same command again to see only final link command:\n\n    $ rm build/opt/mongo/mongo\n    $ scons mongo -j8 --release > release-link-command.txt\n    \nAnd finally we manually copy/paste list of objects to `<platform>-release.objects` file. Make sure \nthat they are single-line files. \n\nAlmost the same steps we are doing for debug builds:\n\n    $ scons mongo -j8 --dbg\n    $ rm build/debug/mongo/mongo\n    $ scons mongo -j8 --dbg > debug-link-command.txt\n    \nAnd list of objects is copied to `<platform>-debug.objects` file.\n\nWe found, that on Linux (Ubuntu 14.10), list of debug objects differ from list of release objects only \nby two files. File `debugallocation.o` is linked in debug mode, but not in release. \nFile `debugallocation.o` is linked in release mode, but not in debug. Both are located \nin `third_party/gperftools-2.2/src` folder. In any way, we keep separate lists of object files \nfor both configurations. Still we need to test that objects are the same even across different \nversions of Linux.\n\n"
  },
  {
    "path": "cmake/mongodb/linux-debug.objects",
    "content": "build/debug/third_party/icu4c-57.1/source/i18n/nfrs.o build/debug/mongo/db/index/expression_keys_private.o build/debug/third_party/gperftools-2.7/dist/src/emergency_malloc_for_stacktrace.o build/debug/third_party/icu4c-57.1/source/i18n/pluralaffix.o build/debug/third_party/icu4c-57.1/source/i18n/translit.o build/debug/mongo/shell/bench.o build/debug/third_party/boost-1.70.0/libs/program_options/src/winmain.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_finnish.o build/debug/mongo/util/net/hostandport.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_lround.o build/debug/mongo/db/pipeline/aggregation_request.o build/debug/mongo/s/request_types/create_collection_gen.o build/debug/third_party/s2/s2regioncoverer.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_log2.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/strtod32.o build/debug/mongo/util/net/ssl_parameters_gen.o build/debug/third_party/icu4c-57.1/source/common/ucnv_bld.o build/debug/mongo/db/matcher/extensions_callback_noop.o build/debug/third_party/icu4c-57.1/source/i18n/coleitr.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_next.o build/debug/third_party/yaml-cpp-0.6.2/src/contrib/graphbuilderadapter.o build/debug/mongo/client/dbclient_cursor.o build/debug/mongo/s/request_types/add_shard_to_zone_request_type.o build/debug/third_party/mozjs-60/extract/mozglue/misc/Printf.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_int8.o build/debug/third_party/icu4c-57.1/source/i18n/vtzone.o build/debug/mongo/transport/message_compressor_manager.o build/debug/mongo/s/request_types/add_shard_request_type.o build/debug/third_party/icu4c-57.1/source/i18n/tztrans.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_logb.o build/debug/mongo/crypto/symmetric_key.o build/debug/mongo/crypto/symmetric_crypto_openssl.o build/debug/mongo/crypto/symmetric_crypto.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_lazy.o build/debug/mongo/util/errno_util.o build/debug/mongo/scripting/mozjs/mongohelpers_js.o build/debug/third_party/icu4c-57.1/source/i18n/tzfmt.o build/debug/mongo/db/matcher/expression_with_placeholder.o build/debug/third_party/zstandard-1.3.7/zstd/lib/common/zstd_common.o build/debug/mongo/db/fts/fts_matcher.o build/debug/third_party/boost-1.70.0/libs/program_options/src/utf8_codecvt_facet.o build/debug/third_party/boost-1.70.0/libs/program_options/src/parsers.o build/debug/third_party/boost-1.70.0/libs/program_options/src/options_description.o build/debug/third_party/boost-1.70.0/libs/program_options/src/split.o build/debug/third_party/boost-1.70.0/libs/program_options/src/variables_map.o build/debug/third_party/boost-1.70.0/libs/program_options/src/cmdline.o build/debug/third_party/boost-1.70.0/libs/program_options/src/config_file.o build/debug/third_party/boost-1.70.0/libs/program_options/src/value_semantic.o build/debug/third_party/boost-1.70.0/libs/program_options/src/convert.o build/debug/third_party/boost-1.70.0/libs/program_options/src/positional_options.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src27.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_acos.o build/debug/third_party/icu4c-57.1/source/common/ucnv.o build/debug/mongo/s/request_types/balance_chunk_request_type.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_asin.o build/debug/third_party/mozjs-60/extract/js/src/jit/x86-shared/Disassembler-x86-shared.o build/debug/mongo/base/global_initializer_registerer.o build/debug/third_party/gperftools-2.7/dist/src/thread_cache.o build/debug/third_party/icu4c-57.1/source/i18n/uregion.o build/debug/third_party/yaml-cpp-0.6.2/src/node.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_int32.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/wcstod32.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_rem.o build/debug/mongo/s/catalog/type_locks.o build/debug/mongo/executor/network_interface_tl.o build/debug/mongo/util/net/private/socket_poll.o build/debug/mongo/util/net/sock.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_trig.o build/debug/third_party/icu4c-57.1/source/common/unistr_case.o build/debug/mongo/s/catalog/type_config_version.o build/debug/mongo/db/auth/address_restriction.o build/debug/mongo/db/auth/address_restriction_gen.o build/debug/third_party/s2/s2loop.o build/debug/mongo/scripting/mozjs/db.o build/debug/mongo/db/commands/test_commands_enabled.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_uint32.o build/debug/mongo/db/query/collation/collation_index_key.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_exp.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src29.o build/debug/mongo/rpc/metadata/impersonated_user_metadata_gen.o build/debug/third_party/icu4c-57.1/source/common/uarrsort.o build/debug/mongo/util/net/http_client_curl.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_quantexpd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_compare.o build/debug/third_party/yaml-cpp-0.6.2/src/exceptions.o build/debug/mongo/db/commands/test_commands_enabled_gen.o build/debug/third_party/icu4c-57.1/source/i18n/utf16collationiterator.o build/debug/mongo/db/repl/repl_settings_gen.o build/debug/third_party/icu4c-57.1/source/i18n/rbt_pars.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_fma.o build/debug/mongo/client/replica_set_change_notifier.o build/debug/mongo/db/server_options_helpers_gen.o build/debug/third_party/icu4c-57.1/source/common/servls.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_atanh.o build/debug/mongo/transport/message_compressor_registry.o build/debug/mongo/transport/message_compressor_metrics.o build/debug/mongo/transport/message_compressor_snappy.o build/debug/mongo/transport/message_compressor_zstd.o build/debug/mongo/transport/message_compressor_zlib.o build/debug/third_party/icu4c-57.1/source/i18n/fphdlimp.o build/debug/third_party/pcre-8.42/pcre_scanner.o build/debug/mongo/scripting/mozjs/maxkey.o build/debug/mongo/bson/bson_comparator_interface_base.o build/debug/mongo/db/catalog/index_catalog.o build/debug/third_party/icu4c-57.1/source/i18n/rbtz.o build/debug/third_party/pcre-8.42/pcre_globals.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_exp2.o build/debug/mongo/util/concurrency/thread_name.o build/debug/third_party/yaml-cpp-0.6.2/src/emitter.o build/debug/third_party/icu4c-57.1/source/common/dtintrv.o build/debug/mongo/util/periodic_runner.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_lgamma.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src16.o build/debug/mongo/db/repl_set_member_in_standalone_mode.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_atanh.o build/debug/mongo/db/query/datetime/date_time_support.o build/debug/mongo/scripting/mozjs/session.o build/debug/mongo/rpc/object_check.o build/debug/third_party/icu4c-57.1/source/common/ustr_cnv.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_asin.o build/debug/mongo/util/fail_point.o build/debug/mongo/db/query/hint_gen.o build/debug/mongo/scripting/mozjs/proxyscope.o build/debug/mongo/platform/decimal128.o build/debug/mongo/s/request_types/get_database_version_gen.o build/debug/mongo/platform/posix_fadvise.o build/debug/third_party/icu4c-57.1/source/i18n/sortkey.o build/debug/mongo/scripting/mozjs/status.o build/debug/third_party/icu4c-57.1/source/i18n/csrsbcs.o build/debug/mongo/shell/shell_options_gen.o build/debug/mongo/rpc/metadata/repl_set_metadata.o build/debug/third_party/yaml-cpp-0.6.2/src/convert.o build/debug/mongo/db/fts/unicode/codepoints_delimiter_list.o build/debug/mongo/db/pipeline/exchange_spec_gen.o build/debug/third_party/zlib-1.2.11/inftrees.o build/debug/mongo/db/dbmessage.o build/debug/third_party/fmt/dist/src/posix.o build/debug/third_party/fmt/dist/src/format.o build/debug/mongo/s/request_types/clone_collection_options_from_primary_shard_gen.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_hungarian.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_porter.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_dutch.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_russian.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_romanian.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_danish.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_portuguese.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_french.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_italian.o build/debug/third_party/libstemmer_c/runtime/api.o build/debug/third_party/libstemmer_c/libstemmer/libstemmer_utf8.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_swedish.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_german.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_spanish.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_norwegian.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_turkish.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_english.o build/debug/mongo/db/matcher/schema/expression_internal_schema_str_length.o build/debug/third_party/icu4c-57.1/source/i18n/msgfmt.o build/debug/third_party/abseil-cpp-master/abseil-cpp/absl/hash/internal/city.o build/debug/mongo/util/net/hostandport_gen.o build/debug/mongo/transport/transport_layer.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_log10.o build/debug/third_party/s2/s1angle.o build/debug/mongo/util/debugger.o build/debug/mongo/db/repl/bson_extract_optime.o build/debug/third_party/icu4c-57.1/source/i18n/collationfastlatin.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_uint64.o build/debug/third_party/icu4c-57.1/source/common/ucharstriebuilder.o build/debug/third_party/icu4c-57.1/source/i18n/search.o build/debug/mongo/util/background.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_fdimd.o build/debug/mongo/s/catalog/mongo_version_range.o build/debug/third_party/icu4c-57.1/source/i18n/regextxt.o build/debug/mongo/util/secure_compare_memory.o build/debug/mongo/logger/component_message_log_domain.o build/debug/third_party/icu4c-57.1/source/i18n/affixpatternparser.o build/debug/third_party/icu4c-57.1/source/i18n/collationdatawriter.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_fdimd.o build/debug/mongo/db/commands/server_status.o build/debug/mongo/scripting/mozjs/engine.o build/debug/third_party/icu4c-57.1/source/common/usetiter.o build/debug/third_party/icu4c-57.1/source/common/locdispnames.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_from_int.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_cbrt.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src0.o build/debug/mongo/util/options_parser/value.o build/debug/third_party/icu4c-57.1/source/i18n/rulebasedcollator.o build/debug/mongo/db/index/sort_key_generator.o build/debug/third_party/icu4c-57.1/source/common/uniset.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_tan.o build/debug/mongo/db/fts/fts_unicode_tokenizer.o build/debug/third_party/icu4c-57.1/source/i18n/region.o build/debug/third_party/icu4c-57.1/source/i18n/tridpars.o build/debug/third_party/icu4c-57.1/source/i18n/tmunit.o build/debug/third_party/icu4c-57.1/source/common/servslkf.o build/debug/third_party/pcre-8.42/pcre_get.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_string.o build/debug/third_party/asio-master/asio/src/asio.o build/debug/mongo/s/request_types/remove_shard_from_zone_request_type.o build/debug/third_party/timelib-2018.01/parse_iso_intervals.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_bid128.o build/debug/third_party/mozjs-60/extract/js/src/vm/JSAtom.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_frexp.o build/debug/third_party/icu4c-57.1/source/i18n/collationbuilder.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src40.o build/debug/mongo/base/data_type_terminated.o build/debug/third_party/icu4c-57.1/source/i18n/repattrn.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src45.o build/debug/mongo/util/platform_init.o build/debug/mongo/db/auth/authorization_session.o build/debug/mongo/db/auth/role_name.o build/debug/mongo/db/auth/auth_decorations.o build/debug/mongo/db/auth/authorization_manager.o build/debug/mongo/db/auth/user_name.o build/debug/mongo/db/keys_collection_document.o build/debug/third_party/icu4c-57.1/source/i18n/uspoof.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_scalb.o build/debug/mongo/db/commands/server_status_internal.o build/debug/mongo/db/logical_clock_gen.o build/debug/mongo/db/logical_clock.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_rem.o build/debug/mongo/util/net/socket_exception.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_log1p.o build/debug/third_party/icu4c-57.1/source/common/normalizer2.o build/debug/mongo/util/net/hostname_canonicalization.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_expm1.o build/debug/third_party/icu4c-57.1/source/i18n/coll.o build/debug/mongo/db/baton.o build/debug/mongo/db/operation_context.o build/debug/mongo/db/unclean_shutdown.o build/debug/mongo/db/server_recovery.o build/debug/mongo/db/service_context.o build/debug/mongo/db/default_baton.o build/debug/mongo/db/client.o build/debug/mongo/db/operation_context_group.o build/debug/mongo/db/query/getmore_request.o build/debug/third_party/icu4c-57.1/source/common/pluralmap.o build/debug/mongo/db/matcher/expression_array.o build/debug/third_party/icu4c-57.1/source/i18n/collationdata.o build/debug/third_party/shim_timelib.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src20.o build/debug/third_party/icu4c-57.1/source/common/uhash.o build/debug/third_party/icu4c-57.1/source/common/cmemory.o build/debug/mongo/db/keypattern.o build/debug/third_party/icu4c-57.1/source/i18n/digitgrouping.o build/debug/third_party/icu4c-57.1/source/i18n/tmutfmt.o build/debug/third_party/icu4c-57.1/source/i18n/tznames.o build/debug/mongo/s/request_types/move_primary_gen.o build/debug/mongo/util/fail_point_server_parameter_gen.o build/debug/mongo/s/request_types/set_shard_version_request.o build/debug/third_party/icu4c-57.1/source/i18n/collationfcd.o build/debug/third_party/mozjs-60/extract/mozglue/misc/Mutex_posix.o build/debug/third_party/icu4c-57.1/source/common/bytestream.o build/debug/third_party/icu4c-57.1/source/i18n/csdetect.o build/debug/mongo/scripting/mozjs/object.o build/debug/mongo/db/matcher/matcher.o build/debug/third_party/pcre-8.42/pcre_version.o build/debug/mongo/db/fts/unicode/string.o build/debug/mongo/db/ops/write_ops_parsers.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_int32.o build/debug/third_party/zstandard-1.3.7/zstd/lib/common/xxhash.o build/debug/third_party/icu4c-57.1/source/common/unistr_cnv.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src9.o build/debug/mongo/db/repl/replication_consistency_markers.o build/debug/mongo/db/repl/replication_process.o build/debug/mongo/db/auth/impersonation_session.o build/debug/third_party/icu4c-57.1/source/i18n/fmtable.o build/debug/mongo/db/matcher/matcher_type_set.o build/debug/mongo/scripting/mozjs/idwrapper.o build/debug/mongo/util/background_thread_clock_source.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_ops_64.o build/debug/third_party/icu4c-57.1/source/common/unifilt.o build/debug/mongo/base/data_range_cursor.o build/debug/mongo/s/request_types/create_database_gen.o build/debug/mongo/scripting/mozjs/mongohelpers.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_log2.o build/debug/mongo/db/repl/is_master_response.o build/debug/third_party/yaml-cpp-0.6.2/src/contrib/graphbuilder.o build/debug/mongo/util/concurrency/ticketholder.o build/debug/third_party/icu4c-57.1/source/i18n/utrans.o build/debug/third_party/boost-1.70.0/libs/filesystem/src/utf8_codecvt_facet.o build/debug/third_party/icu4c-57.1/source/common/ulistformatter.o build/debug/mongo/util/net/socket_utils.o build/debug/mongo/db/command_generic_argument.o build/debug/mongo/db/logical_session_id_helpers.o build/debug/mongo/scripting/deadline_monitor.o build/debug/mongo/s/request_types/split_chunk_request_type.o build/debug/third_party/icu4c-57.1/source/i18n/regexst.o build/debug/third_party/s2/s2pointregion.o build/debug/mongo/util/md5.o build/debug/third_party/icu4c-57.1/source/common/bytestrie.o build/debug/mongo/transport/service_executor_synchronous.o build/debug/mongo/s/request_types/merge_chunk_request_type.o build/debug/mongo/rpc/metadata/tracking_metadata.o build/debug/third_party/icu4c-57.1/source/i18n/gregocal.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_string.o build/debug/third_party/icu4c-57.1/source/i18n/tolowtrn.o build/debug/third_party/pcre-8.42/pcre_refcount.o build/debug/third_party/yaml-cpp-0.6.2/src/binary.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_double_fast.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_nexttowardd.o build/debug/mongo/util/exit.o build/debug/third_party/yaml-cpp-0.6.2/src/tag.o build/debug/third_party/yaml-cpp-0.6.2/src/directives.o build/debug/third_party/yaml-cpp-0.6.2/src/simplekey.o build/debug/third_party/yaml-cpp-0.6.2/src/scantag.o build/debug/third_party/yaml-cpp-0.6.2/src/singledocparser.o build/debug/third_party/yaml-cpp-0.6.2/src/nodeevents.o build/debug/third_party/yaml-cpp-0.6.2/src/memory.o build/debug/third_party/yaml-cpp-0.6.2/src/ostream_wrapper.o build/debug/third_party/yaml-cpp-0.6.2/src/emitfromevents.o build/debug/third_party/yaml-cpp-0.6.2/src/regex_yaml.o build/debug/third_party/yaml-cpp-0.6.2/src/scanscalar.o build/debug/third_party/yaml-cpp-0.6.2/src/stream.o build/debug/third_party/yaml-cpp-0.6.2/src/emitterutils.o build/debug/third_party/yaml-cpp-0.6.2/src/exp.o build/debug/third_party/yaml-cpp-0.6.2/src/nodebuilder.o build/debug/third_party/yaml-cpp-0.6.2/src/scantoken.o build/debug/third_party/yaml-cpp-0.6.2/src/null.o build/debug/third_party/yaml-cpp-0.6.2/src/parser.o build/debug/third_party/yaml-cpp-0.6.2/src/parse.o build/debug/third_party/yaml-cpp-0.6.2/src/scanner.o build/debug/third_party/yaml-cpp-0.6.2/src/emitterstate.o build/debug/third_party/yaml-cpp-0.6.2/src/emit.o build/debug/third_party/yaml-cpp-0.6.2/src/node_data.o build/debug/mongo/db/query/killcursors_request.o build/debug/mongo/db/pipeline/field_path.o build/debug/third_party/icu4c-57.1/source/i18n/zrule.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_quantize.o build/debug/mongo/platform/shared_library_posix.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_nearbyint.o build/debug/third_party/icu4c-57.1/source/i18n/digitinterval.o build/debug/mongo/db/storage/duplicate_key_error_info.o build/debug/third_party/icu4c-57.1/source/common/ucharstrieiterator.o build/debug/third_party/pcre-8.42/pcre_stringpiece.o build/debug/third_party/icu4c-57.1/source/i18n/csr2022.o build/debug/mongo/db/auth/action_set.o build/debug/third_party/mozjs-60/extract/mozglue/misc/ConditionVariable_posix.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_nearbyintd.o build/debug/mongo/db/catalog/index_key_validate.o build/debug/third_party/gperftools-2.7/dist/src/internal_logging.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_sin.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_acos.o build/debug/mongo/bson/timestamp.o build/debug/mongo/db/global_settings.o build/debug/third_party/icu4c-57.1/source/i18n/sharedbreakiterator.o build/debug/third_party/icu4c-57.1/source/common/ures_cnv.o build/debug/third_party/s2/util/math/mathutil.o build/debug/mongo/util/time_support.o build/debug/third_party/wiredtiger/src/checksum/x86/crc32-x86-alt.o build/debug/third_party/s2/strings/strutil.o build/debug/third_party/icu4c-57.1/source/i18n/measure.o build/debug/mongo/s/request_types/update_zone_key_range_request_type.o build/debug/mongo/db/pipeline/expression_context.o build/debug/mongo/db/repl/rollback_gen.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_lrintd.o build/debug/third_party/mozjs-60/extract/js/src/frontend/Parser.o build/debug/mongo/util/net/ssl_options_client.o build/debug/third_party/gperftools-2.7/dist/src/debugallocation.o build/debug/mongo/rpc/metadata/egress_metadata_hook_list.o build/debug/mongo/rpc/metadata/config_server_metadata.o build/debug/mongo/rpc/metadata.o build/debug/mongo/rpc/metadata/logical_time_metadata.o build/debug/mongo/rpc/metadata/oplog_query_metadata.o build/debug/mongo/rpc/metadata/sharding_metadata.o build/debug/third_party/icu4c-57.1/source/i18n/digitformatter.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src22.o build/debug/third_party/icu4c-57.1/source/i18n/decimalformatpattern.o build/debug/mongo/db/namespace_string.o build/debug/mongo/executor/connection_pool_tl.o build/debug/mongo/db/keys_collection_client_sharded.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_tan.o build/debug/mongo/db/query/explain_options.o build/debug/third_party/icu4c-57.1/source/i18n/ucol_sit.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src37.o build/debug/mongo/shell/shell_options_init.o build/debug/mongo/db/index_names.o build/debug/mongo/db/bson/dotted_path_support.o build/debug/third_party/icu4c-57.1/source/common/ucase.o build/debug/mongo/db/matcher/expression_parser.o build/debug/third_party/kms-message/src/sort.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_lgamma.o build/debug/mongo/db/repl/repl_set_heartbeat_response.o build/debug/third_party/icu4c-57.1/source/common/ucnv_u16.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_truncf.o build/debug/mongo/db/fts/stop_words.o build/debug/mongo/s/catalog/type_chunk.o build/debug/third_party/gperftools-2.7/dist/src/base/elf_mem_image.o build/debug/third_party/zlib-1.2.11/deflate.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/zstdmt_compress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/common/pool.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_opt.o build/debug/third_party/zstandard-1.3.7/zstd/lib/deprecated/zbuff_compress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/decompress/huf_decompress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/common/entropy_common.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_ldm.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/fse_compress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/huf_compress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/dictBuilder/divsufsort.o build/debug/third_party/zstandard-1.3.7/zstd/lib/dictBuilder/zdict.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/hist.o build/debug/third_party/zstandard-1.3.7/zstd/lib/common/threading.o build/debug/third_party/zstandard-1.3.7/zstd/lib/dictBuilder/fastcover.o build/debug/third_party/zstandard-1.3.7/zstd/lib/deprecated/zbuff_common.o build/debug/third_party/zstandard-1.3.7/zstd/lib/decompress/zstd_decompress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/common/error_private.o build/debug/third_party/zstandard-1.3.7/zstd/lib/deprecated/zbuff_decompress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_fast.o build/debug/third_party/zstandard-1.3.7/zstd/lib/common/fse_decompress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/dictBuilder/cover.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_compress.o build/debug/third_party/icu4c-57.1/source/i18n/plurfmt.o build/debug/mongo/s/request_types/flush_database_cache_updates_gen.o build/debug/mongo/db/catalog/collection.o build/debug/mongo/db/repl/optime.o build/debug/mongo/base/init.o build/debug/third_party/gperftools-2.7/dist/src/base/logging.o build/debug/third_party/icu4c-57.1/source/common/uiter.o build/debug/third_party/icu4c-57.1/source/common/ustrtrns.o build/debug/mongo/util/winutil.o build/debug/third_party/shim_asio.o build/debug/third_party/icu4c-57.1/source/common/ubidi_props.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_uint64.o build/debug/third_party/icu4c-57.1/source/i18n/anytrans.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src28.o build/debug/mongo/shell/mongo.o build/debug/mongo/s/request_types/flush_routing_table_cache_updates_gen.o build/debug/mongo/s/catalog/type_mongos.o build/debug/mongo/s/catalog/type_collection.o build/debug/mongo/s/catalog/type_chunk_base_gen.o build/debug/mongo/s/shard_id.o build/debug/mongo/s/request_types/wait_for_fail_point_gen.o build/debug/mongo/s/catalog/type_shard_database.o build/debug/mongo/s/request_types/clear_jumbo_flag_gen.o build/debug/mongo/s/database_version_gen.o build/debug/mongo/s/catalog/type_shard_collection.o build/debug/mongo/s/catalog/type_lockpings.o build/debug/mongo/s/catalog/type_tags.o build/debug/mongo/s/request_types/shard_collection_gen.o build/debug/mongo/s/request_types/clone_catalog_data_gen.o build/debug/mongo/s/cannot_implicitly_create_collection_info.o build/debug/mongo/s/would_change_owning_shard_exception.o build/debug/mongo/s/request_types/migration_secondary_throttle_options.o build/debug/mongo/s/chunk_version_gen.o build/debug/mongo/s/request_types/commit_chunk_migration_request_type.o build/debug/mongo/s/catalog/type_changelog.o build/debug/mongo/s/catalog/type_database.o build/debug/mongo/s/chunk_version.o build/debug/mongo/s/catalog/type_shard.o build/debug/mongo/s/stale_exception.o build/debug/mongo/s/database_version_helpers.o build/debug/mongo/s/request_types/move_chunk_request.o build/debug/mongo/db/query/tailable_mode_gen.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_exp10.o build/debug/mongo/util/assert_util.o build/debug/mongo/shell/linenoise.o build/debug/mongo/shell/shell_utils_extended.o build/debug/mongo/shell/shell_options.o build/debug/mongo/shell/shell_utils.o build/debug/mongo/shell/shell_utils_launcher.o build/debug/mongo/shell/mk_wcwidth.o build/debug/mongo/shell/mongo-server.o build/debug/mongo/client/authenticate.o build/debug/mongo/util/signal_handlers.o build/debug/mongo/platform/strcasestr.o build/debug/mongo/util/password_digest.o build/debug/mongo/scripting/mozjs/cursor.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_hypot.o build/debug/third_party/icu4c-57.1/source/common/unistr_titlecase_brkiter.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_minmax.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_fdimd.o build/debug/mongo/db/logical_session_id_gen.o build/debug/mongo/db/write_concern_options.o build/debug/third_party/icu4c-57.1/source/common/ustrcase.o build/debug/mongo/db/catalog/collection_catalog.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_llrintd.o build/debug/third_party/icu4c-57.1/source/i18n/uspoof_build.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_next.o build/debug/mongo/base/parse_number.o build/debug/mongo/util/boost_assert_shim.o build/debug/third_party/s2/s2r2rect.o build/debug/mongo/util/clock_source.o build/debug/mongo/util/fast_clock_source_factory.o build/debug/mongo/db/pipeline/document_source_merge_spec.o build/debug/third_party/icu4c-57.1/source/i18n/csrucode.o build/debug/mongo/db/pipeline/dependencies.o build/debug/third_party/icu4c-57.1/source/common/uniset_props.o build/debug/third_party/icu4c-57.1/source/common/ucnv_lmb.o build/debug/mongo/db/fts/fts_spec_legacy.o build/debug/third_party/icu4c-57.1/source/common/ucnvdisp.o build/debug/mongo/platform/strnlen.o build/debug/mongo/db/logical_session_id.o build/debug/mongo/db/matcher/schema/expression_internal_schema_allowed_properties.o build/debug/mongo/db/repl/storage_interface.o build/debug/third_party/shim_yaml.o build/debug/mongo/scripting/mozjs/valuereader.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_sub.o build/debug/mongo/db/matcher/matchable.o build/debug/third_party/icu4c-57.1/source/common/rbbitblb.o build/debug/third_party/snappy-1.1.7/snappy.o build/debug/third_party/snappy-1.1.7/snappy-sinksource.o build/debug/third_party/snappy-1.1.7/snappy-c.o build/debug/third_party/icu4c-57.1/source/i18n/funcrepl.o build/debug/third_party/icu4c-57.1/source/i18n/collationfastlatinbuilder.o build/debug/mongo/bson/simple_bsonelement_comparator.o build/debug/third_party/s2/s1interval.o build/debug/third_party/kms-message/src/kms_crypto_openssl.o build/debug/third_party/icu4c-57.1/source/common/uresbund.o build/debug/mongo/db/storage/storage_parameters_gen.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src1.o build/debug/mongo/util/fail_point_registry.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_flag_operations.o build/debug/third_party/icu4c-57.1/source/i18n/hebrwcal.o build/debug/mongo/util/icu.o build/debug/third_party/s2/base/stringprintf.o build/debug/mongo/client/global_conn_pool_gen.o build/debug/mongo/util/file.o build/debug/mongo/crypto/aead_encryption.o build/debug/third_party/icu4c-57.1/source/common/ucnvhz.o build/debug/mongo/scripting/deadline_monitor_gen.o build/debug/third_party/icu4c-57.1/source/i18n/brktrans.o build/debug/mongo/db/pipeline/document_path_support.o build/debug/third_party/icu4c-57.1/source/common/rbbinode.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/strtod128.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src10.o build/debug/third_party/pcre-8.42/pcre_xclass.o build/debug/third_party/s2/strings/stringprintf.o build/debug/mongo/db/fts/fts_query_noop.o build/debug/third_party/s2/s2cellid.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src44.o build/debug/third_party/icu4c-57.1/source/common/dictionarydata.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_round_integral.o build/debug/mongo/scripting/mozjs/jsthread.o build/debug/mongo/transport/service_executor_adaptive.o build/debug/mongo/db/multi_key_path_tracker.o build/debug/third_party/icu4c-57.1/source/common/uenum.o build/debug/third_party/icu4c-57.1/source/common/parsepos.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_ceil.o build/debug/third_party/mozjs-60/extract/js/src/perf/pm_stub.o build/debug/third_party/mozjs-60/extract/js/src/vm/Interpreter.o build/debug/third_party/icu4c-57.1/source/i18n/cecal.o build/debug/mongo/scripting/mozjs/bson.o build/debug/third_party/gperftools-2.7/dist/src/malloc_extension.o build/debug/third_party/icu4c-57.1/source/common/ucnv_err.o build/debug/third_party/icu4c-57.1/source/i18n/valueformatter.o build/debug/third_party/icu4c-57.1/source/i18n/curramt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_atan.o build/debug/third_party/gperftools-2.7/dist/src/base/spinlock.o build/debug/third_party/icu4c-57.1/source/common/cwchar.o build/debug/third_party/shim_snappy.o build/debug/mongo/db/fts/fts_spec.o build/debug/mongo/util/startup_test.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_mod.o build/debug/mongo/util/net/sockaddr.o build/debug/mongo/db/concurrency/lock_manager.o build/debug/mongo/scripting/mozjs/base.o build/debug/mongo/util/system_clock_source.o build/debug/third_party/icu4c-57.1/source/i18n/ucln_in.o build/debug/mongo/db/stats/counters.o build/debug/mongo/db/wire_version.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_uint8.o build/debug/third_party/s2/util/coding/coder.o build/debug/mongo/db/repl/read_concern_args.o build/debug/mongo/db/pipeline/variables.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_log.o build/debug/third_party/gperftools-2.7/dist/src/memfs_malloc.o build/debug/third_party/icu4c-57.1/source/common/unistr.o build/debug/third_party/icu4c-57.1/source/i18n/measfmt.o build/debug/mongo/db/fts/fts_basic_tokenizer.o build/debug/third_party/icu4c-57.1/source/i18n/csmatch.o build/debug/mongo/util/intrusive_counter.o build/debug/third_party/icu4c-57.1/source/i18n/ucal.o build/debug/mongo/db/pipeline/parsed_aggregation_projection_node.o build/debug/mongo/rpc/legacy_request.o build/debug/mongo/util/concurrency/idle_thread_block.o build/debug/third_party/gperftools-2.7/dist/src/stack_trace_table.o build/debug/third_party/shim_zlib.o build/debug/third_party/shim_icu.o build/debug/mongo/scripting/engine.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_log.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src15.o build/debug/third_party/mozjs-60/extract/js/src/builtin/RegExp.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src4.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src23.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_atan.o build/debug/third_party/mozjs-60/extract/js/src/jsarray.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_sinh.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src6.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_atanh.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_floorf.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src12.o build/debug/third_party/mozjs-60/extract/mfbt/lz4.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_fabs.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/k_exp.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_floor.o build/debug/third_party/mozjs-60/extract/js/src/util/DoubleToString.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_ceilf.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src2.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src39.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_trunc.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_sqrt.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src7.o build/debug/third_party/mozjs-60/extract/js/src/mfbt/Unified_cpp_mfbt0.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src43.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_pow.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src31.o build/debug/third_party/mozjs-60/mongo_sources/freeOpToJSContext.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src13.o build/debug/third_party/mozjs-60/mongo_sources/mongoErrorReportToString.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src19.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src18.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_asinh.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src30.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src14.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src34.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src42.o build/debug/third_party/mozjs-60/extract/js/src/gc/StoreBuffer.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src26.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src8.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src25.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_tanh.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_rint.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_atan2.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src36.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src17.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src33.o build/debug/third_party/mozjs-60/extract/mozglue/misc/TimeStamp.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src5.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src3.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src24.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src35.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src21.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_copysign.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_acosh.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src11.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_rintf.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src38.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_expm1.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_cbrt.o build/debug/third_party/mozjs-60/extract/js/src/jsmath.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_scalbn.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src32.o build/debug/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src41.o build/debug/third_party/mozjs-60/extract/mfbt/Compression.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_log1p.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_asin.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_cosh.o build/debug/third_party/mozjs-60/extract/mfbt/double-conversion/double-conversion/strtod.o build/debug/third_party/mozjs-60/extract/mozglue/misc/TimeStamp_posix.o build/debug/third_party/mozjs-60/extract/mozglue/misc/StackWalk.o build/debug/third_party/shim_intel_decimal128.o build/debug/third_party/s2/base/strtoint.o build/debug/third_party/s2/s2latlngrect.o build/debug/third_party/icu4c-57.1/source/i18n/rbt_data.o build/debug/mongo/crypto/sha256_block.o build/debug/third_party/icu4c-57.1/source/i18n/indiancal.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_expm1.o build/debug/mongo/client/native_sasl_client_session.o build/debug/mongo/db/field_ref_set.o build/debug/third_party/icu4c-57.1/source/i18n/decfmtst.o build/debug/mongo/db/matcher/expression_algo.o build/debug/third_party/kms-message/src/kms_response.o build/debug/third_party/kms-message/src/hexlify.o build/debug/third_party/kms-message/src/kms_request_opt.o build/debug/third_party/kms-message/src/kms_b64.o build/debug/third_party/kms-message/src/kms_message.o build/debug/third_party/kms-message/src/kms_encrypt_request.o build/debug/third_party/kms-message/src/kms_kv_list.o build/debug/third_party/kms-message/src/kms_request.o build/debug/third_party/kms-message/src/kms_response_parser.o build/debug/third_party/kms-message/src/kms_decrypt_request.o build/debug/third_party/kms-message/src/kms_request_str.o build/debug/mongo/db/fts/unicode/codepoints_casefold.o build/debug/mongo/db/ops/write_ops_gen.o build/debug/third_party/icu4c-57.1/source/i18n/csrutf8.o build/debug/mongo/db/matcher/schema/encrypt_schema_types.o build/debug/third_party/s2/s2cellunion.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_acosh.o build/debug/mongo/util/net/ssl_options.o build/debug/third_party/icu4c-57.1/source/i18n/uni2name.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_pow.o build/debug/third_party/icu4c-57.1/source/i18n/ulocdata.o build/debug/third_party/icu4c-57.1/source/common/loclikely.o build/debug/third_party/s2/s2.o build/debug/third_party/timelib-2018.01/interval.o build/debug/mongo/db/matcher/rewrite_expr.o build/debug/mongo/db/matcher/schema/expression_internal_schema_eq.o build/debug/mongo/db/pipeline/document.o build/debug/third_party/icu4c-57.1/source/common/resbund_cnv.o build/debug/mongo/base/secure_allocator.o build/debug/mongo/bson/oid.o build/debug/third_party/boost-1.70.0/libs/filesystem/src/operations.o build/debug/third_party/boost-1.70.0/libs/filesystem/src/windows_file_codecvt.o build/debug/third_party/boost-1.70.0/libs/filesystem/src/codecvt_error_category.o build/debug/third_party/boost-1.70.0/libs/filesystem/src/path_traits.o build/debug/third_party/boost-1.70.0/libs/filesystem/src/portability.o build/debug/third_party/boost-1.70.0/libs/filesystem/src/path.o build/debug/third_party/boost-1.70.0/libs/filesystem/src/unique_path.o build/debug/third_party/icu4c-57.1/source/common/uts46.o build/debug/mongo/db/repl/split_horizon.o build/debug/third_party/icu4c-57.1/source/common/uset.o build/debug/third_party/shim_allocator.o build/debug/third_party/pcre-8.42/pcre_ucd.o build/debug/mongo/bson/bson_depth.o build/debug/third_party/s2/base/int128.o build/debug/third_party/pcre-8.42/pcre_maketables.o build/debug/mongo/db/catalog/disable_index_spec_namespace_generation_gen.o build/debug/third_party/icu4c-57.1/source/common/ushape.o build/debug/third_party/gperftools-2.7/dist/src/sampler.o build/debug/mongo/util/net/private/ssl_expiration.o build/debug/mongo/util/timer.o build/debug/mongo/db/server_options_helpers.o build/debug/mongo/logger/log_severity.o build/debug/mongo/db/fts/unicode/codepoints_diacritic_map.o build/debug/mongo/base/transaction_error.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_lrintd.o build/debug/mongo/executor/remote_command_request.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_sin.o build/debug/mongo/rpc/metadata/client_metadata.o build/debug/mongo/rpc/metadata/client_metadata_ismaster.o build/debug/mongo/shell/linenoise_utf8.o build/debug/mongo/util/net/cidr.o build/debug/third_party/icu4c-57.1/source/common/usc_impl.o build/debug/third_party/icu4c-57.1/source/i18n/dayperiodrules.o build/debug/third_party/icu4c-57.1/source/common/ucharstrie.o build/debug/mongo/db/repl/update_position_args.o build/debug/mongo/scripting/mozjs/code.o build/debug/mongo/bson/bsonobjbuilder.o build/debug/third_party/boost-1.70.0/libs/system/src/error_code.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_tgamma.o build/debug/mongo/db/server_options.o build/debug/third_party/icu4c-57.1/source/common/propname.o build/debug/mongo/rpc/metadata/impersonated_user_metadata.o build/debug/mongo/db/index/index_descriptor.o build/debug/mongo/db/matcher/expression.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_asin.o build/debug/third_party/pcre-8.42/pcre_string_utils.o build/debug/third_party/icu4c-57.1/source/common/ucol_swp.o build/debug/third_party/icu4c-57.1/source/common/propsvec.o build/debug/mongo/db/matcher/schema/expression_internal_schema_num_properties.o build/debug/mongo/db/fts/fts_util.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_lgamma.o build/debug/third_party/zlib-1.2.11/trees.o build/debug/mongo/db/fts/fts_element_iterator.o build/debug/mongo/util/net/ssl_parameters.o build/debug/mongo/util/net/ssl_manager_openssl.o build/debug/mongo/util/net/ssl_manager.o build/debug/mongo/util/net/ssl_stream.o build/debug/third_party/icu4c-57.1/source/common/ucnv_cnv.o build/debug/mongo/crypto/sha1_block.o build/debug/mongo/rpc/object_check_gen.o build/debug/mongo/db/repl/repl_set_config_gen.o build/debug/third_party/icu4c-57.1/source/i18n/rbnf.o build/debug/third_party/icu4c-57.1/source/i18n/collationweights.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_expm1.o build/debug/mongo/scripting/mozjs/regexp.o build/debug/mongo/util/processinfo_linux.o build/debug/mongo/db/pipeline/document_source_merge_gen.o build/debug/third_party/icu4c-57.1/source/i18n/digitlst.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_uint64.o build/debug/mongo/db/key_generator.o build/debug/third_party/icu4c-57.1/source/i18n/uitercollationiterator.o build/debug/third_party/icu4c-57.1/source/common/ustrfmt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_log.o build/debug/third_party/icu4c-57.1/source/i18n/nfrule.o build/debug/third_party/s2/s2region.o build/debug/mongo/db/auth/privilege.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_atan2.o build/debug/third_party/boost-1.70.0/libs/iostreams/src/file_descriptor.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_fegetexceptflag.o build/debug/mongo/db/server_options_general_gen.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_tanh.o build/debug/mongo/db/query/killcursors_response.o build/debug/mongo/db/query/view_response_formatter.o build/debug/mongo/db/query/cursor_response.o build/debug/mongo/db/query/find_and_modify_request.o build/debug/mongo/db/query/count_command_as_aggregation_command.o build/debug/mongo/db/query/count_command_gen.o build/debug/mongo/db/query/cursor_request.o build/debug/mongo/db/query/count_request.o build/debug/mongo/db/pipeline/value.o build/debug/mongo/base/system_error.o build/debug/third_party/icu4c-57.1/source/i18n/upluralrules.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_minmax.o build/debug/mongo/rpc/legacy_reply_builder.o build/debug/mongo/transport/session.o build/debug/mongo/transport/service_entry_point_utils.o build/debug/mongo/rpc/legacy_reply.o build/debug/third_party/icu4c-57.1/source/common/uset_props.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_decimal_globals.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_logbd.o build/debug/third_party/icu4c-57.1/source/common/uinvchar.o build/debug/mongo/db/traffic_reader.o build/debug/mongo/client/sasl_client_authenticate_impl.o build/debug/mongo/client/sasl_plain_client_conversation.o build/debug/mongo/client/sasl_scram_client_conversation.o build/debug/mongo/client/sasl_client_session.o build/debug/mongo/client/sasl_client_conversation.o build/debug/mongo/client/sasl_client_authenticate.o build/debug/third_party/icu4c-57.1/source/i18n/taiwncal.o build/debug/mongo/db/fts/fts_basic_phrase_matcher.o build/debug/third_party/icu4c-57.1/source/common/serv.o build/debug/third_party/icu4c-57.1/source/common/locdspnm.o build/debug/mongo/db/repl/replication_coordinator_noop.o build/debug/mongo/db/repl/repl_client_info.o build/debug/mongo/db/repl/replication_coordinator.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_add.o build/debug/mongo/db/pipeline/value_comparator.o build/debug/third_party/icu4c-57.1/source/common/uchriter.o build/debug/mongo/s/is_mongos.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_int64.o build/debug/third_party/icu4c-57.1/source/common/util.o build/debug/third_party/murmurhash3/MurmurHash3.o build/debug/third_party/icu4c-57.1/source/common/uobject.o build/debug/mongo/util/password_params_gen.o build/debug/mongo/util/version.o build/debug/third_party/icu4c-57.1/source/i18n/uspoof_impl.o build/debug/third_party/icu4c-57.1/source/i18n/inputext.o build/debug/third_party/s2/s2cell.o build/debug/third_party/icu4c-57.1/source/i18n/ucol_res.o build/debug/third_party/icu4c-57.1/source/i18n/precision.o build/debug/mongo/util/fail_point_service.o build/debug/third_party/pcre-8.42/pcre_study.o build/debug/mongo/scripting/jsexception.o build/debug/mongo/scripting/mozjs/internedstring.o build/debug/third_party/s2/base/logging.o build/debug/mongo/shell/mongodbcr.o build/debug/mongo/db/fts/unicode/codepoints_diacritic_list.o build/debug/third_party/icu4c-57.1/source/common/brkiter.o build/debug/mongo/client/index_spec.o build/debug/mongo/util/icu_init.o build/debug/mongo/scripting/mozjs/exception.o build/debug/third_party/icu4c-57.1/source/i18n/transreg.o build/debug/mongo/db/server_options_nongeneral_gen.o build/debug/third_party/icu4c-57.1/source/common/umath.o build/debug/third_party/icu4c-57.1/source/i18n/plurrule.o build/debug/mongo/db/storage/key_string.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_inv_trig.o build/debug/mongo/base/initializer.o build/debug/third_party/timelib-2018.01/parse_zoneinfo.o build/debug/third_party/timelib-2018.01/timelib.o build/debug/third_party/timelib-2018.01/parse_tz.o build/debug/third_party/timelib-2018.01/parse_date.o build/debug/third_party/timelib-2018.01/unixtime2tm.o build/debug/third_party/timelib-2018.01/dow.o build/debug/third_party/timelib-2018.01/astro.o build/debug/third_party/timelib-2018.01/tm2unixtime.o build/debug/mongo/db/auth/restriction_environment.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_ldexp.o build/debug/mongo/platform/process_id.o build/debug/third_party/icu4c-57.1/source/common/ucnvbocu.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/strtod64.o build/debug/mongo/util/hex.o build/debug/third_party/icu4c-57.1/source/i18n/windtfmt.o build/debug/third_party/icu4c-57.1/source/i18n/collation.o build/debug/mongo/db/pipeline/document_source_merge_modes_gen.o build/debug/mongo/rpc/message.o build/debug/third_party/icu4c-57.1/source/common/unistr_case_locale.o build/debug/third_party/s2/strings/split.o build/debug/third_party/icu4c-57.1/source/common/schriter.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_pow.o build/debug/third_party/icu4c-57.1/source/common/errorcode.o build/debug/third_party/icu4c-57.1/source/common/ubidi.o build/debug/mongo/client/connection_string.o build/debug/third_party/icu4c-57.1/source/i18n/ufieldpositer.o build/debug/third_party/icu4c-57.1/source/common/chariter.o build/debug/mongo/db/pipeline/parsed_inclusion_projection.o build/debug/mongo/scripting/mozjs/uri.o build/debug/mongo/db/fts/fts_unicode_phrase_matcher.o build/debug/third_party/icu4c-57.1/source/i18n/gregoimp.o build/debug/mongo/logger/rotatable_file_writer.o build/debug/third_party/icu4c-57.1/source/common/locbased.o build/debug/mongo/scripting/mozjs/nativefunction.o build/debug/mongo/db/matcher/expression_geo.o build/debug/mongo/db/matcher/expression_expr.o build/debug/third_party/gperftools-2.7/dist/src/stacktrace.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_lgamma.o build/debug/mongo/db/matcher/schema/encrypt_schema_gen.o build/debug/mongo/db/concurrency/flow_control_ticketholder.o build/debug/mongo/db/audit.o build/debug/third_party/icu4c-57.1/source/common/loadednormalizer2impl.o build/debug/mongo/logger/rotatable_file_manager.o build/debug/mongo/util/signal_win32.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_sqrt.o build/debug/mongo/client/connection_string_connect.o build/debug/mongo/client/connpool.o build/debug/mongo/client/dbclient_connection.o build/debug/mongo/client/mongo_uri_connect.o build/debug/mongo/client/replica_set_monitor.o build/debug/mongo/client/dbclient_rs.o build/debug/mongo/client/replica_set_monitor_manager.o build/debug/mongo/client/global_conn_pool.o build/debug/mongo/base/error_codes.o build/debug/mongo/logger/message_event_utf8_encoder.o build/debug/mongo/scripting/mozjs/bindata.o build/debug/third_party/icu4c-57.1/source/common/utrie2.o build/debug/mongo/db/repl/last_vote.o build/debug/third_party/icu4c-57.1/source/i18n/visibledigits.o build/debug/third_party/icu4c-57.1/source/common/putil.o build/debug/third_party/zlib-1.2.11/uncompr.o build/debug/mongo/db/concurrency/replication_state_transition_lock_guard.o build/debug/mongo/rpc/factory.o build/debug/mongo/rpc/reply_builder_interface.o build/debug/mongo/rpc/legacy_request_builder.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_exp.o build/debug/third_party/abseil-cpp-master/abseil-cpp/absl/container/internal/raw_hash_set.o build/debug/third_party/s2/s2polyline.o build/debug/third_party/icu4c-57.1/source/i18n/unesctrn.o build/debug/third_party/icu4c-57.1/source/common/rbbisetb.o build/debug/third_party/gperftools-2.7/dist/src/base/spinlock_internal.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_erfc.o build/debug/mongo/bson/mutable/element.o build/debug/third_party/icu4c-57.1/source/common/uvectr64.o build/debug/mongo/db/matcher/expression_text_base.o build/debug/third_party/boost-1.70.0/libs/iostreams/src/mapped_file.o build/debug/third_party/icu4c-57.1/source/common/utrie.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_pow.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_decimal_data.o build/debug/third_party/icu4c-57.1/source/i18n/udateintervalformat.o build/debug/third_party/icu4c-57.1/source/common/udata.o build/debug/mongo/db/keys_collection_cache.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_add.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_erfc.o build/debug/third_party/icu4c-57.1/source/i18n/nfsubs.o build/debug/third_party/icu4c-57.1/source/i18n/gender.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_scalbl.o build/debug/third_party/pcre-8.42/pcre_newline.o build/debug/third_party/icu4c-57.1/source/common/uresdata.o build/debug/mongo/shell/kms.o build/debug/third_party/icu4c-57.1/source/common/filteredbrk.o build/debug/third_party/icu4c-57.1/source/common/rbbirb.o build/debug/third_party/icu4c-57.1/source/common/ucnv_io.o build/debug/third_party/wiredtiger/src/checksum/software/checksum.o build/debug/third_party/icu4c-57.1/source/common/ucnvscsu.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_int64.o build/debug/mongo/scripting/mozjs/mongo.o build/debug/mongo/db/fts/stop_words_list.o build/debug/mongo/transport/service_executor_reserved.o build/debug/mongo/shell/kms_aws.o build/debug/mongo/idl/idl_parser.o build/debug/third_party/icu4c-57.1/source/i18n/datefmt.o build/debug/third_party/icu4c-57.1/source/common/uvector.o build/debug/mongo/scripting/mozjs/objectwrapper.o build/debug/third_party/icu4c-57.1/source/common/stringpiece.o build/debug/mongo/db/matcher/schema/expression_internal_schema_fmod.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_mul.o build/debug/mongo/logger/redaction.o build/debug/third_party/icu4c-57.1/source/i18n/usearch.o build/debug/mongo/base/data_type.o build/debug/mongo/util/secure_zero_memory.o build/debug/third_party/icu4c-57.1/source/common/unames.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/sqrt_tab_t.o build/debug/third_party/icu4c-57.1/source/common/utypes.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_tgamma.o build/debug/mongo/util/duration.o build/debug/third_party/icu4c-57.1/source/common/listformatter.o build/debug/third_party/icu4c-57.1/source/i18n/wintzimpl.o build/debug/mongo/client/read_preference.o build/debug/mongo/util/stacktrace_posix.o build/debug/mongo/db/matcher/expression_leaf.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_cosh.o build/debug/third_party/icu4c-57.1/source/common/ucnvisci.o build/debug/mongo/db/index/s2_common.o build/debug/third_party/icu4c-57.1/source/common/uloc_tag.o build/debug/third_party/s2/util/coding/varint.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_nexttowardd.o build/debug/mongo/base/data_range.o build/debug/mongo/db/query/query_knobs_gen.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_scalbl.o build/debug/third_party/pcre-8.42/pcre_tables.o build/debug/third_party/zlib-1.2.11/infback.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_int32.o build/debug/mongo/logger/log_manager.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_uint16.o build/debug/mongo/db/logical_time_validator.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_pow.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_fetestexcept.o build/debug/third_party/gperftools-2.7/dist/src/base/vdso_support.o build/debug/third_party/icu4c-57.1/source/common/utext.o build/debug/third_party/icu4c-57.1/source/common/ubidiwrt.o build/debug/mongo/db/concurrency/d_concurrency.o build/debug/third_party/s2/s2regionunion.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_compare.o build/debug/mongo/shell/kms_shell.o build/debug/mongo/util/version_impl.o build/debug/third_party/icu4c-57.1/source/common/servlk.o build/debug/mongo/client/query.o build/debug/mongo/util/options_parser/options_parser.o build/debug/mongo/logger/ramlog.o build/debug/third_party/icu4c-57.1/source/i18n/smpdtfst.o build/debug/mongo/db/index/wildcard_key_generator.o build/debug/mongo/db/index/btree_key_generator.o build/debug/third_party/icu4c-57.1/source/common/uidna.o build/debug/mongo/util/options_parser/startup_option_init.o build/debug/third_party/icu4c-57.1/source/common/unistr_props.o build/debug/mongo/db/matcher/match_details.o build/debug/mongo/platform/mutex.o build/debug/third_party/icu4c-57.1/source/common/normalizer2impl.o build/debug/mongo/client/async_client.o build/debug/mongo/db/server_options_server_helpers.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_quantexpd.o build/debug/mongo/transport/transport_layer_manager.o build/debug/mongo/shell/fle_shell_options_gen.o build/debug/mongo/util/regex_util.o build/debug/third_party/icu4c-57.1/source/common/locmap.o build/debug/third_party/zlib-1.2.11/inflate.o build/debug/third_party/icu4c-57.1/source/i18n/persncal.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_logb.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_noncomp.o build/debug/mongo/client/dbclient_base.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_log10.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_ldexp.o build/debug/mongo/scripting/utils.o build/debug/third_party/icu4c-57.1/source/i18n/collationtailoring.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_bid128.o build/debug/third_party/icu4c-57.1/source/common/ulist.o build/debug/third_party/shim_zstd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_lrintd.o build/debug/mongo/db/fts/fts_language.o build/debug/mongo/db/repl/repl_set_tag.o build/debug/mongo/db/views/resolved_view.o build/debug/third_party/icu4c-57.1/source/i18n/bocsu.o build/debug/mongo/executor/egress_tag_closer_manager.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_cosh.o build/debug/third_party/icu4c-57.1/source/i18n/decContext.o build/debug/third_party/shim_mozjs.o build/debug/third_party/icu4c-57.1/source/common/locavailable.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_logb.o build/debug/third_party/gperftools-2.7/dist/src/page_heap.o build/debug/mongo/shell/shell_options_storage.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_frexp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_hypot.o build/debug/third_party/pcre-8.42/pcre_dfa_exec.o build/debug/third_party/icu4c-57.1/source/common/ucnv_u8.o build/debug/mongo/base/global_initializer.o build/debug/third_party/icu4c-57.1/source/i18n/csrecog.o build/debug/mongo/scripting/mozjs/PosixNSPR.o build/debug/mongo/rpc/write_concern_error_detail.o build/debug/third_party/icu4c-57.1/source/common/resource.o build/debug/mongo/scripting/mozjs/engine_gen.o build/debug/mongo/shell/encrypted_dbclient_base.o build/debug/third_party/gperftools-2.7/dist/src/base/dynamic_annotations.o build/debug/third_party/icu4c-57.1/source/i18n/alphaindex.o build/debug/mongo/util/exception_filter_win32.o build/debug/third_party/icu4c-57.1/source/common/servnotf.o build/debug/third_party/icu4c-57.1/source/i18n/ucsdet.o build/debug/third_party/icu4c-57.1/source/common/uscript_props.o build/debug/third_party/icu4c-57.1/source/i18n/collationruleparser.o build/debug/mongo/db/pipeline/document_source_list_sessions_gen.o build/debug/mongo/db/auth/user_management_commands_parser.o build/debug/third_party/shim_stemmer.o build/debug/third_party/icu4c-57.1/source/i18n/utmscale.o build/debug/mongo/db/pipeline/runtime_constants_gen.o build/debug/third_party/shim_kms_message.o build/debug/third_party/icu4c-57.1/source/common/cstring.o build/debug/mongo/db/storage/storage_options.o build/debug/mongo/db/pipeline/resume_token.o build/debug/mongo/db/matcher/schema/expression_internal_schema_cond.o build/debug/mongo/bson/bsonmisc.o build/debug/third_party/abseil-cpp-master/abseil-cpp/absl/hash/internal/hash.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_four_over_pi.o build/debug/mongo/util/safe_num.o build/debug/third_party/icu4c-57.1/source/common/locutil.o build/debug/third_party/gperftools-2.7/dist/src/span.o build/debug/third_party/icu4c-57.1/source/common/dictbe.o build/debug/third_party/icu4c-57.1/source/common/ucnvmbcs.o build/debug/third_party/icu4c-57.1/source/common/ucln_cmn.o build/debug/mongo/util/net/ssl_types.o build/debug/mongo/logger/logstream_builder.o build/debug/third_party/icu4c-57.1/source/i18n/regexcmp.o build/debug/mongo/executor/network_interface.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_log10.o build/debug/third_party/icu4c-57.1/source/i18n/zonemeta.o build/debug/mongo/db/commands/server_status_metric.o build/debug/third_party/icu4c-57.1/source/common/stringtriebuilder.o build/debug/third_party/icu4c-57.1/source/i18n/uspoof_conf.o build/debug/mongo/scripting/mozjs/cursor_handle.o build/debug/third_party/icu4c-57.1/source/i18n/decNumber.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/wcstod64.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_uint16.o build/debug/mongo/util/options_parser/options_parser_init.o build/debug/third_party/icu4c-57.1/source/i18n/choicfmt.o build/debug/mongo/db/geo/big_polygon.o build/debug/mongo/db/geo/r2_region_coverer.o build/debug/mongo/db/geo/hash.o build/debug/mongo/db/geo/shapes.o build/debug/mongo/db/matcher/schema/expression_internal_schema_unique_items.o build/debug/third_party/icu4c-57.1/source/i18n/islamcal.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_nearbyintd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_minmax.o build/debug/mongo/bson/bson_validate.o build/debug/mongo/db/pipeline/value_gen.o build/debug/third_party/icu4c-57.1/source/i18n/udatpg.o build/debug/third_party/icu4c-57.1/source/i18n/compactdecimalformat.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_compare.o build/debug/third_party/wiredtiger/src/checksum/x86/crc32-x86.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_quantexpd.o build/debug/mongo/db/pipeline/document_source_change_stream_gen.o build/debug/mongo/db/pipeline/document_source_replace_root_gen.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_erf.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_fmod.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_acosh.o build/debug/mongo/db/query/collation/collator_interface.o build/debug/mongo/db/query/collation/collation_spec.o build/debug/third_party/icu4c-57.1/source/common/ustr_wcs.o build/debug/mongo/util/quick_exit.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_cos.o build/debug/third_party/icu4c-57.1/source/i18n/timezone.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_erf.o build/debug/third_party/icu4c-57.1/source/i18n/rbt_rule.o build/debug/third_party/icu4c-57.1/source/common/uloc.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_exp2.o build/debug/mongo/db/commands.o build/debug/mongo/executor/remote_command_response.o build/debug/third_party/icu4c-57.1/source/common/sharedobject.o build/debug/third_party/icu4c-57.1/source/common/unifiedcache.o build/debug/mongo/scripting/mozjs/scripting_util_gen.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_rem.o build/debug/mongo/platform/stack_locator.o build/debug/mongo/base/error_extra_info.o build/debug/mongo/db/fts/fts_query_parser.o build/debug/third_party/icu4c-57.1/source/i18n/currunit.o build/debug/mongo/db/operation_time_tracker.o build/debug/mongo/db/logical_time.o build/debug/mongo/idl/server_parameter.o build/debug/mongo/logger/message_log_domain.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_div.o build/debug/mongo/scripting/mozjs/timestamp.o build/debug/third_party/icu4c-57.1/source/common/filterednormalizer2.o build/debug/mongo/util/log.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_add.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_hypot.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_log10.o build/debug/mongo/db/matcher/schema/expression_internal_schema_root_doc_eq.o build/debug/mongo/scripting/mozjs/valuewriter.o build/debug/third_party/icu4c-57.1/source/common/simpleformatter.o build/debug/third_party/icu4c-57.1/source/i18n/tmutamt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_nearbyintd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_acosh.o build/debug/third_party/icu4c-57.1/source/i18n/collationcompare.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_atan2.o build/debug/third_party/icu4c-57.1/source/common/uchar.o build/debug/mongo/db/pipeline/expression.o build/debug/mongo/db/exec/projection_exec_agg.o build/debug/third_party/pcre-8.42/pcrecpp.o build/debug/third_party/icu4c-57.1/source/i18n/simpletz.o build/debug/mongo/util/uuid.o build/debug/third_party/zlib-1.2.11/zutil.o build/debug/third_party/zlib-1.2.11/inffast.o build/debug/third_party/zlib-1.2.11/crc32.o build/debug/third_party/zlib-1.2.11/compress.o build/debug/third_party/zlib-1.2.11/adler32.o build/debug/mongo/db/query/query_request.o build/debug/mongo/db/query/collation/collator_factory_interface.o build/debug/mongo/bson/mutable/document.o build/debug/mongo/scripting/mozjs/minkey.o build/debug/third_party/icu4c-57.1/source/i18n/quant.o build/debug/mongo/rpc/protocol.o build/debug/third_party/icu4c-57.1/source/i18n/rbt_set.o build/debug/third_party/icu4c-57.1/source/stubdata/stubdata.o build/debug/mongo/logger/logger.o build/debug/mongo/db/fts/fts_query_impl.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_erfc.o build/debug/third_party/icu4c-57.1/source/i18n/coptccal.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_fma.o build/debug/mongo/scripting/mozjs/dbcollection.o build/debug/third_party/icu4c-57.1/source/common/unormcmp.o build/debug/mongo/util/net/ssl_options_client_gen.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_mul.o build/debug/third_party/icu4c-57.1/source/i18n/cpdtrans.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_binarydecimal.o build/debug/third_party/pcre-8.42/pcre_config.o build/debug/third_party/icu4c-57.1/source/common/ucasemap.o build/debug/third_party/icu4c-57.1/source/i18n/quantityformatter.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_modf.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_round_integral.o build/debug/third_party/icu4c-57.1/source/i18n/japancal.o build/debug/mongo/db/auth/action_type.o build/debug/mongo/db/auth/privilege_parser.o build/debug/mongo/db/auth/resource_pattern.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_cos.o build/debug/mongo/db/pipeline/expression_trigonometric.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_feraiseexcept.o build/debug/mongo/db/index/expression_params.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_noncomp.o build/debug/mongo/shell/kms_gen.o build/debug/mongo/db/cluster_auth_mode_option_gen.o build/debug/third_party/icu4c-57.1/source/common/uprops.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_log.o build/debug/third_party/icu4c-57.1/source/common/cstr.o build/debug/third_party/icu4c-57.1/source/i18n/collationsets.o build/debug/third_party/icu4c-57.1/source/common/ubrk.o build/debug/third_party/icu4c-57.1/source/i18n/collationroot.o build/debug/third_party/icu4c-57.1/source/i18n/dangical.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_asinh.o build/debug/mongo/scripting/mozjs/jscustomallocator.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_acos.o build/debug/mongo/scripting/mozjs/error.o build/debug/mongo/base/status.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_sinh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_nexttowardd.o build/debug/mongo/db/matcher/expression_where_noop.o build/debug/third_party/icu4c-57.1/source/i18n/collationdatabuilder.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_sqrt.o build/debug/third_party/icu4c-57.1/source/common/utrace.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_asinh.o build/debug/mongo/util/processinfo.o build/debug/third_party/s2/s2polygon.o build/debug/mongo/bson/bsonobj.o build/debug/mongo/base/string_data.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_int.o build/debug/mongo/db/pipeline/parsed_exclusion_projection.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_next.o build/debug/mongo/db/hasher.o build/debug/mongo/util/stacktrace.o build/debug/third_party/icu4c-57.1/source/i18n/basictz.o build/debug/third_party/icu4c-57.1/source/i18n/decimfmtimpl.o build/debug/third_party/shim_abseil.o build/debug/mongo/executor/network_interface_thread_pool.o build/debug/third_party/icu4c-57.1/source/i18n/collationsettings.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_int64.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_quantize.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_atanh.o build/debug/third_party/shim_pcrecpp.o build/debug/third_party/icu4c-57.1/source/common/locid.o build/debug/third_party/icu4c-57.1/source/i18n/winnmfmt.o build/debug/mongo/idl/server_parameter_with_storage.o build/debug/third_party/icu4c-57.1/source/i18n/vzone.o build/debug/third_party/gperftools-2.7/dist/src/central_freelist.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_round.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_exception.o build/debug/third_party/icu4c-57.1/source/common/punycode.o build/debug/third_party/icu4c-57.1/source/common/ucnv_cb.o build/debug/third_party/icu4c-57.1/source/i18n/digitaffixesandpadding.o build/debug/mongo/db/repl/member_config.o build/debug/third_party/icu4c-57.1/source/i18n/identifier_info.o build/debug/third_party/icu4c-57.1/source/i18n/tzgnames.o build/debug/mongo/executor/connection_pool_stats.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_scalb.o build/debug/mongo/transport/message_compressor_options_client_gen.o build/debug/third_party/icu4c-57.1/source/common/unisetspan.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_convert_data.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_lround.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_exp10.o build/debug/third_party/icu4c-57.1/source/i18n/fmtable_cnv.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_asinh.o build/debug/mongo/base/validate_locale.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_sinh.o build/debug/mongo/db/catalog/index_catalog_entry.o build/debug/third_party/gperftools-2.7/dist/src/maybe_threads.o build/debug/mongo/bson/bsonelement.o build/debug/third_party/icu4c-57.1/source/common/util_props.o build/debug/mongo/bson/simple_bsonobj_comparator.o build/debug/third_party/icu4c-57.1/source/i18n/titletrn.o build/debug/third_party/icu4c-57.1/source/common/udataswp.o build/debug/mongo/db/matcher/schema/expression_internal_schema_match_array_index.o build/debug/third_party/icu4c-57.1/source/i18n/currpinf.o build/debug/third_party/icu4c-57.1/source/i18n/astro.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_2_str_tables.o build/debug/third_party/icu4c-57.1/source/i18n/fpositer.o build/debug/mongo/util/itoa.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_int16.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_tgamma.o build/debug/third_party/icu4c-57.1/source/common/unorm.o build/debug/mongo/db/concurrency/lock_stats.o build/debug/mongo/db/concurrency/lock_state.o build/debug/third_party/icu4c-57.1/source/common/utf_impl.o build/debug/third_party/icu4c-57.1/source/i18n/collationdatareader.o build/debug/third_party/icu4c-57.1/source/i18n/rbt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_fma.o build/debug/third_party/icu4c-57.1/source/common/uloc_keytype.o build/debug/third_party/icu4c-57.1/source/i18n/uspoof_wsconf.o build/debug/mongo/bson/util/bson_extract.o build/debug/mongo/scripting/mozjs/numberdecimal.o build/debug/mongo/logger/log_component.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_scalb.o build/debug/third_party/icu4c-57.1/source/common/uinit.o build/debug/third_party/icu4c-57.1/source/i18n/scientificnumberformatter.o build/debug/third_party/gperftools-2.7/dist/src/system-alloc.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_llrintd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_tan.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_cbrt.o build/debug/mongo/crypto/sha_block_openssl.o build/debug/mongo/db/matcher/schema/expression_internal_schema_all_elem_match_from_index.o build/debug/mongo/db/matcher/expression_tree.o build/debug/mongo/db/matcher/schema/expression_internal_schema_xor.o build/debug/mongo/db/matcher/schema/expression_internal_schema_object_match.o build/debug/mongo/db/matcher/schema/json_pointer.o build/debug/mongo/db/matcher/schema/json_schema_parser.o build/debug/mongo/db/matcher/expression_internal_expr_eq.o build/debug/mongo/db/matcher/expression_text_noop.o build/debug/mongo/db/matcher/expression_where_base.o build/debug/mongo/db/matcher/extensions_callback.o build/debug/mongo/db/matcher/schema/expression_internal_schema_num_array_items.o build/debug/third_party/icu4c-57.1/source/i18n/strmatch.o build/debug/mongo/bson/json.o build/debug/mongo/transport/service_executor_gen.o build/debug/third_party/icu4c-57.1/source/i18n/ucoleitr.o build/debug/mongo/db/fts/fts_index_format.o build/debug/third_party/icu4c-57.1/source/common/resbund.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_acos.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_fmod.o build/debug/third_party/icu4c-57.1/source/common/ustack.o build/debug/third_party/icu4c-57.1/source/i18n/chnsecal.o build/debug/mongo/db/repl/repl_set_heartbeat_args_v1.o build/debug/third_party/icu4c-57.1/source/common/ruleiter.o build/debug/mongo/bson/bsontypes.o build/debug/third_party/icu4c-57.1/source/common/unifunct.o build/debug/mongo/util/concurrency/spin_lock.o build/debug/mongo/scripting/dbdirectclient_factory.o build/debug/third_party/icu4c-57.1/source/i18n/collationrootelements.o build/debug/third_party/icu4c-57.1/source/i18n/strrepl.o build/debug/mongo/db/keys_collection_manager.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_log2.o build/debug/third_party/icu4c-57.1/source/common/ustrenum.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_log2.o build/debug/third_party/icu4c-57.1/source/common/patternprops.o build/debug/mongo/shell/kms_local.o build/debug/third_party/icu4c-57.1/source/i18n/collationkeys.o build/debug/third_party/icu4c-57.1/source/common/ucnv_u7.o build/debug/mongo/db/time_proof_service.o build/debug/mongo/transport/transport_layer_asio.o build/debug/mongo/scripting/mozjs/numberint.o build/debug/mongo/scripting/mozjs/jsstringwrapper.o build/debug/mongo/scripting/mozjs/global.o build/debug/mongo/scripting/mozjs/countdownlatch.o build/debug/mongo/scripting/mozjs/dbpointer.o build/debug/mongo/scripting/mozjs/dbref.o build/debug/mongo/scripting/mozjs/numberlong.o build/debug/mongo/scripting/mozjs/oid.o build/debug/mongo/scripting/mozjs/implscope.o build/debug/mongo/scripting/mozjs/dbquery.o build/debug/third_party/pcre-8.42/pcre_valid_utf8.o build/debug/third_party/icu4c-57.1/source/i18n/collationiterator.o build/debug/third_party/icu4c-57.1/source/i18n/calendar.o build/debug/third_party/icu4c-57.1/source/common/messagepattern.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_log1p.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_erf.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_inv_hyper.o build/debug/third_party/icu4c-57.1/source/i18n/format.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_cos.o build/debug/mongo/base/simple_string_data_comparator.o build/debug/third_party/icu4c-57.1/source/common/normlzr.o build/debug/mongo/db/pipeline/document_comparator.o build/debug/mongo/db/query/tailable_mode.o build/debug/mongo/db/log_process_details.o build/debug/third_party/icu4c-57.1/source/common/ubidiln.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_logbd.o build/debug/third_party/gperftools-2.7/dist/src/base/sysinfo.o build/debug/mongo/db/server_options_base_gen.o build/debug/third_party/icu4c-57.1/source/common/ucnv_ext.o build/debug/mongo/util/dns_query.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_tanh.o build/debug/mongo/db/matcher/path.o build/debug/third_party/icu4c-57.1/source/common/utrie2_builder.o build/debug/third_party/s2/s2latlng.o build/debug/third_party/icu4c-57.1/source/i18n/ucol.o build/debug/third_party/icu4c-57.1/source/i18n/casetrn.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_hypot.o build/debug/mongo/executor/thread_pool_task_executor.o build/debug/mongo/db/fts/tokenizer.o build/debug/mongo/db/fts/stemmer.o build/debug/third_party/s2/s2edgeutil.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_fesetexceptflag.o build/debug/third_party/icu4c-57.1/source/i18n/remtrans.o build/debug/mongo/db/server_options_base.o build/debug/mongo/util/password.o build/debug/mongo/db/keyfile_option_gen.o build/debug/third_party/icu4c-57.1/source/i18n/dtitvinf.o build/debug/third_party/gperftools-2.7/dist/src/static_vars.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_exp.o build/debug/third_party/icu4c-57.1/source/i18n/esctrn.o build/debug/third_party/icu4c-57.1/source/i18n/scriptset.o build/debug/mongo/db/repl/repl_set_config.o build/debug/mongo/db/repl/repl_set_request_votes_args.o build/debug/mongo/util/options_parser/startup_options.o build/debug/third_party/icu4c-57.1/source/i18n/nultrans.o build/debug/third_party/icu4c-57.1/source/i18n/reldtfmt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_exp.o build/debug/mongo/db/keys_collection_manager_gen.o build/debug/third_party/icu4c-57.1/source/common/ucat.o build/debug/third_party/icu4c-57.1/source/i18n/utf8collationiterator.o build/debug/mongo/rpc/op_msg.o build/debug/mongo/db/repl/repl_settings.o build/debug/mongo/logger/console.o build/debug/mongo/db/geo/geometry_container.o build/debug/mongo/db/geo/geoparser.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_sqrt.o build/debug/mongo/util/allocator.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_int16.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_logbd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_frexp.o build/debug/third_party/icu4c-57.1/source/common/servlkf.o build/debug/third_party/icu4c-57.1/source/i18n/tzrule.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_uint32.o build/debug/third_party/icu4c-57.1/source/common/icuplug.o build/debug/third_party/icu4c-57.1/source/common/appendable.o build/debug/mongo/client/mongo_uri.o build/debug/mongo/scripting/bson_template_evaluator.o build/debug/mongo/rpc/get_status_from_command_result.o build/debug/third_party/icu4c-57.1/source/common/caniter.o build/debug/third_party/icu4c-57.1/source/i18n/smpdtfmt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_div.o build/debug/third_party/s2/s2regionintersection.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_bid.o build/debug/third_party/icu4c-57.1/source/i18n/dtfmtsym.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_round_integral.o build/debug/mongo/util/str.o build/debug/third_party/icu4c-57.1/source/common/ucnvsel.o build/debug/third_party/icu4c-57.1/source/i18n/dtptngen.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_ldexp.o build/debug/third_party/icu4c-57.1/source/common/ucnv_ct.o build/debug/mongo/util/options_parser/constraints.o build/debug/third_party/icu4c-57.1/source/common/icudataver.o build/debug/third_party/icu4c-57.1/source/common/wintz.o build/debug/third_party/icu4c-57.1/source/common/rbbidata.o build/debug/third_party/icu4c-57.1/source/common/bmpset.o build/debug/third_party/icu4c-57.1/source/common/usprep.o build/debug/third_party/icu4c-57.1/source/common/ucnv_u32.o build/debug/third_party/icu4c-57.1/source/common/locresdata.o build/debug/third_party/icu4c-57.1/source/common/ucurr.o build/debug/third_party/icu4c-57.1/source/common/servrbf.o build/debug/third_party/icu4c-57.1/source/common/rbbiscan.o build/debug/third_party/icu4c-57.1/source/common/bytestriebuilder.o build/debug/third_party/icu4c-57.1/source/common/ucmndata.o build/debug/third_party/icu4c-57.1/source/common/ucnv_set.o build/debug/third_party/icu4c-57.1/source/common/ustr_titlecase_brkiter.o build/debug/third_party/icu4c-57.1/source/common/ustring.o build/debug/third_party/icu4c-57.1/source/common/ucasemap_titlecase_brkiter.o build/debug/third_party/icu4c-57.1/source/common/umutex.o build/debug/third_party/icu4c-57.1/source/common/ucnvlat1.o build/debug/third_party/icu4c-57.1/source/common/ustrcase_locale.o build/debug/third_party/icu4c-57.1/source/common/uhash_us.o build/debug/third_party/icu4c-57.1/source/common/uniset_closure.o build/debug/third_party/icu4c-57.1/source/common/charstr.o build/debug/third_party/icu4c-57.1/source/common/uscript.o build/debug/third_party/icu4c-57.1/source/common/rbbistbl.o build/debug/third_party/icu4c-57.1/source/common/ucnv2022.o build/debug/third_party/icu4c-57.1/source/common/udatamem.o build/debug/third_party/icu4c-57.1/source/common/rbbi.o build/debug/third_party/icu4c-57.1/source/common/brkeng.o build/debug/third_party/icu4c-57.1/source/common/uvectr32.o build/debug/third_party/icu4c-57.1/source/common/umapfile.o build/debug/third_party/icu4c-57.1/source/common/bytestrieiterator.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_sinh.o build/debug/mongo/db/storage/write_unit_of_work.o build/debug/third_party/shim_fmt.o build/debug/third_party/pcre-8.42/pcre_compile.o build/debug/third_party/pcre-8.42/pcre_chartables.o build/debug/third_party/pcre-8.42/pcre_exec.o build/debug/third_party/pcre-8.42/pcre_ord2utf8.o build/debug/third_party/pcre-8.42/pcre_fullinfo.o build/debug/third_party/pcre-8.42/pcre_byte_order.o build/debug/mongo/s/catalog/sharding_catalog_client.o build/debug/third_party/icu4c-57.1/source/i18n/selfmt.o build/debug/third_party/icu4c-57.1/source/i18n/currfmt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/wcstod128.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_cosh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_dpd.o build/debug/third_party/icu4c-57.1/source/i18n/toupptrn.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_modf.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_log.o build/debug/mongo/util/system_tick_source.o build/debug/mongo/db/pipeline/parsed_aggregation_projection.o build/debug/mongo/util/options_parser/option_section.o build/debug/third_party/icu4c-57.1/source/i18n/csrmbcs.o build/debug/mongo/util/boost_assert_impl.o build/debug/third_party/icu4c-57.1/source/i18n/buddhcal.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_mul.o build/debug/third_party/icu4c-57.1/source/i18n/tznames_impl.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_noncomp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_bid64.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_int16.o build/debug/mongo/db/pipeline/parsed_add_fields.o build/debug/mongo/platform/random.o build/debug/third_party/icu4c-57.1/source/i18n/nortrans.o build/debug/mongo/executor/connection_pool.o build/debug/third_party/gperftools-2.7/dist/src/symbolize.o build/debug/third_party/gperftools-2.7/dist/src/common.o build/debug/third_party/gperftools-2.7/dist/src/malloc_hook.o build/debug/mongo/util/options_parser/option_description.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_quantize.o build/debug/mongo/platform/stack_locator_linux.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_div.o build/debug/mongo/util/text.o build/debug/third_party/icu4c-57.1/source/i18n/reldatefmt.o build/debug/third_party/s2/s2edgeindex.o build/debug/mongo/logger/log_component_settings.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_scalbl.o build/debug/mongo/executor/network_interface_factory.o build/debug/third_party/icu4c-57.1/source/i18n/rematch.o build/debug/mongo/util/summation.o build/debug/mongo/db/signed_logical_time.o build/debug/third_party/icu4c-57.1/source/i18n/name2uni.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_string.o build/debug/third_party/s2/s2polygonbuilder.o build/debug/third_party/s2/s2cap.o build/debug/third_party/shim_boost.o build/debug/mongo/executor/task_executor.o build/debug/mongo/db/field_ref.o build/debug/third_party/icu4c-57.1/source/i18n/dcfmtsym.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_bessel.o build/debug/mongo/platform/shared_library.o build/debug/third_party/icu4c-57.1/source/i18n/regeximp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_exp2.o build/debug/third_party/icu4c-57.1/source/i18n/decimfmt.o build/debug/mongo/util/options_parser/environment.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_uint8.o build/debug/third_party/icu4c-57.1/source/i18n/dtitvfmt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_log1p.o build/debug/mongo/base/data_type_string_data.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_modf.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_uint32.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_llrintd.o build/debug/third_party/icu4c-57.1/source/i18n/numsys.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_cbrt.o build/debug/mongo/util/shell_exec.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_powi.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_sin.o build/debug/mongo/base/shim.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_feclearexcept.o build/debug/third_party/icu4c-57.1/source/i18n/udat.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_atan.o build/debug/mongo/db/query/hint_parser.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_lround.o build/debug/third_party/icu4c-57.1/source/i18n/measunit.o build/debug/mongo/db/field_parser.o build/debug/third_party/icu4c-57.1/source/i18n/dtrule.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_exp10.o build/debug/third_party/icu4c-57.1/source/i18n/olsontz.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_fmod.o build/debug/third_party/icu4c-57.1/source/i18n/umsg.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_tanh.o build/debug/mongo/util/cmdline_utils/censor_cmdline.o build/debug/mongo/base/make_string_vector.o build/debug/third_party/icu4c-57.1/source/i18n/stsearch.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_ops.o build/debug/mongo/db/matcher/path_internal.o build/debug/mongo/util/signal_handlers_synchronous.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_int8.o build/debug/third_party/icu4c-57.1/source/i18n/numfmt.o build/debug/third_party/icu4c-57.1/source/i18n/digitaffix.o build/debug/third_party/icu4c-57.1/source/i18n/standardplural.o build/debug/third_party/icu4c-57.1/source/i18n/uregex.o build/debug/third_party/icu4c-57.1/source/i18n/smallintformatter.o build/debug/third_party/icu4c-57.1/source/i18n/uregexc.o build/debug/third_party/icu4c-57.1/source/i18n/unumsys.o build/debug/third_party/icu4c-57.1/source/i18n/ztrans.o build/debug/third_party/icu4c-57.1/source/i18n/unum.o build/debug/third_party/icu4c-57.1/source/i18n/ethpccal.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_uint8.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_atan.o build/debug/mongo/util/base64.o build/debug/mongo/base/initializer_dependency_graph.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_sqrt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_cbrt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_erf.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_uint16.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_atan2.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_exp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_int8.o "
  },
  {
    "path": "cmake/mongodb/linux-release.objects",
    "content": "build/opt/third_party/mozjs-60/extract/mfbt/double-conversion/double-conversion/strtod.o build/opt/third_party/zstandard-1.3.7/zstd/lib/common/zstd_common.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src4.o build/opt/third_party/icu4c-57.1/source/common/ucol_swp.o build/opt/third_party/gperftools-2.7/dist/src/memfs_malloc.o build/opt/mongo/s/stale_exception.o build/opt/mongo/util/exception_filter_win32.o build/opt/mongo/s/catalog/type_changelog.o build/opt/mongo/transport/message_compressor_manager.o build/opt/third_party/s2/strings/stringprintf.o build/opt/mongo/scripting/bson_template_evaluator.o build/opt/mongo/scripting/mozjs/base.o build/opt/mongo/db/concurrency/flow_control_ticketholder.o build/opt/third_party/icu4c-57.1/source/i18n/rbtz.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_sqrt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_nearbyintd.o build/opt/mongo/util/system_tick_source.o build/opt/third_party/icu4c-57.1/source/i18n/unesctrn.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_norwegian.o build/opt/third_party/icu4c-57.1/source/stubdata/stubdata.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_sqrt.o build/opt/mongo/db/matcher/matcher_type_set.o build/opt/third_party/icu4c-57.1/source/i18n/collationsettings.o build/opt/mongo/client/replica_set_monitor_manager.o build/opt/third_party/icu4c-57.1/source/common/normlzr.o build/opt/mongo/db/pipeline/value_gen.o build/opt/mongo/db/keys_collection_manager_gen.o build/opt/mongo/db/keys_collection_cache.o build/opt/mongo/db/keys_collection_manager.o build/opt/mongo/db/key_generator.o build/opt/mongo/db/signed_logical_time.o build/opt/third_party/shim_asio.o build/opt/third_party/icu4c-57.1/source/common/stringpiece.o build/opt/mongo/db/query/collation/collator_factory_interface.o build/opt/mongo/util/concurrency/idle_thread_block.o build/opt/mongo/db/fts/fts_element_iterator.o build/opt/mongo/client/replica_set_change_notifier.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_ldexp.o build/opt/mongo/shell/linenoise.o build/opt/third_party/yaml-cpp-0.6.2/src/binary.o build/opt/third_party/yaml-cpp-0.6.2/src/exp.o build/opt/third_party/yaml-cpp-0.6.2/src/ostream_wrapper.o build/opt/third_party/yaml-cpp-0.6.2/src/contrib/graphbuilder.o build/opt/third_party/yaml-cpp-0.6.2/src/memory.o build/opt/third_party/yaml-cpp-0.6.2/src/contrib/graphbuilderadapter.o build/opt/third_party/yaml-cpp-0.6.2/src/regex_yaml.o build/opt/third_party/yaml-cpp-0.6.2/src/scantoken.o build/opt/third_party/yaml-cpp-0.6.2/src/parse.o build/opt/third_party/yaml-cpp-0.6.2/src/emitter.o build/opt/third_party/yaml-cpp-0.6.2/src/emit.o build/opt/third_party/yaml-cpp-0.6.2/src/node_data.o build/opt/third_party/yaml-cpp-0.6.2/src/null.o build/opt/third_party/yaml-cpp-0.6.2/src/node.o build/opt/third_party/yaml-cpp-0.6.2/src/nodebuilder.o build/opt/third_party/yaml-cpp-0.6.2/src/singledocparser.o build/opt/third_party/yaml-cpp-0.6.2/src/scanscalar.o build/opt/third_party/yaml-cpp-0.6.2/src/convert.o build/opt/third_party/yaml-cpp-0.6.2/src/scanner.o build/opt/third_party/yaml-cpp-0.6.2/src/nodeevents.o build/opt/third_party/yaml-cpp-0.6.2/src/scantag.o build/opt/third_party/yaml-cpp-0.6.2/src/exceptions.o build/opt/third_party/yaml-cpp-0.6.2/src/emitfromevents.o build/opt/third_party/yaml-cpp-0.6.2/src/emitterstate.o build/opt/third_party/yaml-cpp-0.6.2/src/stream.o build/opt/third_party/yaml-cpp-0.6.2/src/directives.o build/opt/third_party/yaml-cpp-0.6.2/src/parser.o build/opt/third_party/yaml-cpp-0.6.2/src/tag.o build/opt/third_party/yaml-cpp-0.6.2/src/emitterutils.o build/opt/third_party/yaml-cpp-0.6.2/src/simplekey.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_atanh.o build/opt/third_party/icu4c-57.1/source/i18n/csrutf8.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src37.o build/opt/mongo/rpc/legacy_request.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_ldm.o build/opt/mongo/db/repl/is_master_response.o build/opt/mongo/db/repl/last_vote.o build/opt/mongo/db/repl/repl_set_request_votes_args.o build/opt/mongo/db/repl/repl_set_config_gen.o build/opt/mongo/db/repl/repl_set_config.o build/opt/mongo/db/repl/update_position_args.o build/opt/mongo/db/repl/repl_set_tag.o build/opt/mongo/db/repl/repl_set_heartbeat_response.o build/opt/mongo/db/repl/repl_set_heartbeat_args_v1.o build/opt/mongo/db/repl/member_config.o build/opt/mongo/db/fts/stop_words_list.o build/opt/third_party/shim_intel_decimal128.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src15.o build/opt/mongo/base/status.o build/opt/third_party/icu4c-57.1/source/i18n/collationbuilder.o build/opt/mongo/util/concurrency/ticketholder.o build/opt/mongo/db/views/resolved_view.o build/opt/third_party/boost-1.70.0/libs/filesystem/src/path.o build/opt/mongo/scripting/utils.o build/opt/mongo/scripting/engine.o build/opt/mongo/scripting/deadline_monitor_gen.o build/opt/mongo/scripting/jsexception.o build/opt/mongo/scripting/deadline_monitor.o build/opt/mongo/scripting/dbdirectclient_factory.o build/opt/third_party/mozjs-60/extract/js/src/gc/StoreBuffer.o build/opt/third_party/zlib-1.2.11/trees.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_ldexp.o build/opt/third_party/icu4c-57.1/source/i18n/reldtfmt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_asinh.o build/opt/mongo/s/catalog/type_database.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_cosh.o build/opt/third_party/icu4c-57.1/source/common/filterednormalizer2.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_div.o build/opt/mongo/db/logical_clock.o build/opt/third_party/icu4c-57.1/source/common/dtintrv.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_english.o build/opt/third_party/pcre-8.42/pcre_ord2utf8.o build/opt/mongo/client/connection_string_connect.o build/opt/mongo/client/connpool.o build/opt/mongo/client/dbclient_rs.o build/opt/mongo/client/global_conn_pool.o build/opt/mongo/client/replica_set_monitor.o build/opt/mongo/client/dbclient_connection.o build/opt/mongo/client/mongo_uri_connect.o build/opt/mongo/client/global_conn_pool_gen.o build/opt/mongo/db/fts/stemmer.o build/opt/third_party/icu4c-57.1/source/common/unisetspan.o build/opt/mongo/db/repl/read_concern_args.o build/opt/mongo/db/matcher/matcher.o build/opt/third_party/icu4c-57.1/source/i18n/csrucode.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_atanh.o build/opt/mongo/util/summation.o build/opt/mongo/db/matcher/expression_where_base.o build/opt/third_party/icu4c-57.1/source/common/locresdata.o build/opt/mongo/db/logical_session_id_helpers.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_scalb.o build/opt/third_party/icu4c-57.1/source/i18n/esctrn.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_uint8.o build/opt/third_party/icu4c-57.1/source/i18n/gregocal.o build/opt/mongo/util/intrusive_counter.o build/opt/mongo/db/server_options_server_helpers.o build/opt/mongo/util/log.o build/opt/third_party/icu4c-57.1/source/i18n/selfmt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_tanh.o build/opt/mongo/util/signal_handlers_synchronous.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_expm1.o build/opt/mongo/db/catalog/collection.o build/opt/mongo/db/auth/action_type.o build/opt/third_party/icu4c-57.1/source/i18n/regexst.o build/opt/third_party/icu4c-57.1/source/i18n/measure.o build/opt/mongo/db/matcher/schema/expression_internal_schema_object_match.o build/opt/mongo/rpc/write_concern_error_detail.o build/opt/mongo/rpc/get_status_from_command_result.o build/opt/mongo/scripting/mozjs/bson.o build/opt/mongo/client/read_preference.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src42.o build/opt/third_party/icu4c-57.1/source/i18n/collationtailoring.o build/opt/third_party/icu4c-57.1/source/i18n/csrecog.o build/opt/mongo/db/logical_time_validator.o build/opt/mongo/db/matcher/expression_array.o build/opt/third_party/icu4c-57.1/source/common/ulistformatter.o build/opt/mongo/db/fts/fts_matcher.o build/opt/third_party/wiredtiger/src/checksum/x86/crc32-x86-alt.o build/opt/mongo/db/concurrency/d_concurrency.o build/opt/third_party/icu4c-57.1/source/i18n/ucol_sit.o build/opt/third_party/pcre-8.42/pcre_version.o build/opt/mongo/executor/thread_pool_task_executor.o build/opt/third_party/icu4c-57.1/source/common/ustrcase_locale.o build/opt/mongo/scripting/mozjs/proxyscope.o build/opt/mongo/db/log_process_details.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_asin.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/hist.o build/opt/third_party/wiredtiger/src/checksum/x86/crc32-x86.o build/opt/mongo/util/net/ssl_manager_openssl.o build/opt/third_party/s2/base/stringprintf.o build/opt/mongo/db/matcher/schema/encrypt_schema_gen.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_atan.o build/opt/mongo/db/field_ref_set.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_modf.o build/opt/mongo/db/query/datetime/date_time_support.o build/opt/mongo/db/query/hint_parser.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_ldexp.o build/opt/third_party/zlib-1.2.11/uncompr.o build/opt/mongo/db/query/hint_gen.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_bid128.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_nexttowardd.o build/opt/third_party/icu4c-57.1/source/common/rbbisetb.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_fegetexceptflag.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_fmod.o build/opt/third_party/icu4c-57.1/source/common/locdspnm.o build/opt/mongo/db/keys_collection_document.o build/opt/third_party/icu4c-57.1/source/common/unifunct.o build/opt/third_party/boost-1.70.0/libs/program_options/src/convert.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_log.o build/opt/third_party/icu4c-57.1/source/common/udatamem.o build/opt/third_party/abseil-cpp-master/abseil-cpp/absl/container/internal/raw_hash_set.o build/opt/mongo/scripting/mozjs/uri.o build/opt/third_party/icu4c-57.1/source/common/ucase.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_exception.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src21.o build/opt/mongo/db/fts/fts_query_noop.o build/opt/mongo/db/pipeline/document_source_merge_spec.o build/opt/mongo/client/index_spec.o build/opt/third_party/s2/s2polyline.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_rint.o build/opt/third_party/icu4c-57.1/source/i18n/calendar.o build/opt/third_party/icu4c-57.1/source/i18n/regeximp.o build/opt/mongo/db/concurrency/lock_manager.o build/opt/third_party/s2/util/coding/coder.o build/opt/mongo/db/repl/optime.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_minmax.o build/opt/mongo/s/catalog/sharding_catalog_client.o build/opt/third_party/pcre-8.42/pcre_maketables.o build/opt/mongo/db/bson/dotted_path_support.o build/opt/third_party/icu4c-57.1/source/i18n/simpletz.o build/opt/third_party/icu4c-57.1/source/common/listformatter.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_sin.o build/opt/third_party/icu4c-57.1/source/common/uarrsort.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src33.o build/opt/third_party/icu4c-57.1/source/common/umapfile.o build/opt/mongo/shell/shell_utils_extended.o build/opt/mongo/s/request_types/add_shard_to_zone_request_type.o build/opt/third_party/s2/s2r2rect.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_sinh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_dpd.o build/opt/third_party/boost-1.70.0/libs/filesystem/src/unique_path.o build/opt/mongo/db/auth/address_restriction.o build/opt/mongo/db/auth/address_restriction_gen.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_asinh.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src32.o build/opt/third_party/snappy-1.1.7/snappy-c.o build/opt/third_party/snappy-1.1.7/snappy-sinksource.o build/opt/third_party/snappy-1.1.7/snappy.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_portuguese.o build/opt/mongo/db/index_names.o build/opt/third_party/icu4c-57.1/source/common/unistr_cnv.o build/opt/mongo/db/query/collation/collation_index_key.o build/opt/mongo/db/query/collation/collator_interface.o build/opt/mongo/db/query/collation/collation_spec.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_round.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_lgamma.o build/opt/mongo/util/options_parser/environment.o build/opt/mongo/util/fast_clock_source_factory.o build/opt/mongo/util/background_thread_clock_source.o build/opt/mongo/util/clock_source.o build/opt/third_party/zlib-1.2.11/infback.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_log1p.o build/opt/third_party/shim_pcrecpp.o build/opt/mongo/util/text.o build/opt/mongo/db/pipeline/runtime_constants_gen.o build/opt/mongo/scripting/mozjs/dbcollection.o build/opt/mongo/shell/linenoise_utf8.o build/opt/third_party/icu4c-57.1/source/common/uvectr64.o build/opt/third_party/icu4c-57.1/source/common/unifiedcache.o build/opt/mongo/util/net/ssl_options_client_gen.o build/opt/third_party/boost-1.70.0/libs/program_options/src/winmain.o build/opt/mongo/db/matcher/expression_text_noop.o build/opt/third_party/icu4c-57.1/source/common/brkeng.o build/opt/third_party/zlib-1.2.11/crc32.o build/opt/mongo/db/repl_set_member_in_standalone_mode.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_string.o build/opt/third_party/icu4c-57.1/source/common/ucharstriebuilder.o build/opt/mongo/scripting/mozjs/dbpointer.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_ops.o build/opt/mongo/util/timer.o build/opt/mongo/db/pipeline/aggregation_request.o build/opt/third_party/icu4c-57.1/source/common/utrie2.o build/opt/third_party/icu4c-57.1/source/i18n/collationdata.o build/opt/mongo/util/options_parser/startup_option_init.o build/opt/mongo/util/allocator.o build/opt/third_party/icu4c-57.1/source/common/uvector.o build/opt/third_party/shim_allocator.o build/opt/third_party/icu4c-57.1/source/i18n/dtptngen.o build/opt/mongo/db/keys_collection_client_sharded.o build/opt/mongo/db/matcher/schema/expression_internal_schema_xor.o build/opt/third_party/icu4c-57.1/source/common/parsepos.o build/opt/mongo/db/matcher/schema/expression_internal_schema_all_elem_match_from_index.o build/opt/mongo/s/request_types/commit_chunk_migration_request_type.o build/opt/mongo/db/repl/replication_process.o build/opt/mongo/db/repl/replication_consistency_markers.o build/opt/third_party/libstemmer_c/runtime/api.o build/opt/third_party/s2/base/strtoint.o build/opt/third_party/icu4c-57.1/source/i18n/rematch.o build/opt/third_party/boost-1.70.0/libs/filesystem/src/codecvt_error_category.o build/opt/third_party/icu4c-57.1/source/common/ustr_cnv.o build/opt/mongo/bson/json.o build/opt/mongo/db/dbmessage.o build/opt/third_party/icu4c-57.1/source/i18n/measfmt.o build/opt/mongo/shell/shell_options.o build/opt/mongo/db/logical_session_id.o build/opt/mongo/db/repl/split_horizon.o build/opt/mongo/logger/message_log_domain.o build/opt/mongo/db/query/getmore_request.o build/opt/third_party/icu4c-57.1/source/i18n/sortkey.o build/opt/mongo/util/net/ssl_types.o build/opt/mongo/platform/random.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_tanh.o build/opt/mongo/db/hasher.o build/opt/third_party/icu4c-57.1/source/i18n/fpositer.o build/opt/third_party/icu4c-57.1/source/i18n/digitaffixesandpadding.o build/opt/third_party/icu4c-57.1/source/i18n/csmatch.o build/opt/third_party/icu4c-57.1/source/i18n/tmunit.o build/opt/third_party/icu4c-57.1/source/i18n/curramt.o build/opt/third_party/icu4c-57.1/source/i18n/wintzimpl.o build/opt/third_party/icu4c-57.1/source/i18n/nultrans.o build/opt/third_party/icu4c-57.1/source/i18n/dayperiodrules.o build/opt/third_party/icu4c-57.1/source/i18n/decfmtst.o build/opt/third_party/icu4c-57.1/source/i18n/dangical.o build/opt/third_party/icu4c-57.1/source/i18n/regexcmp.o build/opt/third_party/icu4c-57.1/source/i18n/collationweights.o build/opt/third_party/icu4c-57.1/source/i18n/digitinterval.o build/opt/third_party/icu4c-57.1/source/i18n/buddhcal.o build/opt/third_party/icu4c-57.1/source/i18n/remtrans.o build/opt/third_party/icu4c-57.1/source/i18n/brktrans.o build/opt/third_party/icu4c-57.1/source/i18n/rbnf.o build/opt/third_party/icu4c-57.1/source/i18n/tzfmt.o build/opt/third_party/icu4c-57.1/source/i18n/regextxt.o build/opt/third_party/icu4c-57.1/source/i18n/cpdtrans.o build/opt/third_party/icu4c-57.1/source/i18n/timezone.o build/opt/third_party/icu4c-57.1/source/i18n/digitgrouping.o build/opt/third_party/icu4c-57.1/source/i18n/dtfmtsym.o build/opt/third_party/icu4c-57.1/source/i18n/alphaindex.o build/opt/third_party/icu4c-57.1/source/i18n/unum.o build/opt/third_party/icu4c-57.1/source/i18n/rbt_data.o build/opt/third_party/icu4c-57.1/source/i18n/uspoof_conf.o build/opt/third_party/icu4c-57.1/source/i18n/udatpg.o build/opt/third_party/icu4c-57.1/source/i18n/csdetect.o build/opt/third_party/icu4c-57.1/source/i18n/scientificnumberformatter.o build/opt/third_party/icu4c-57.1/source/i18n/tolowtrn.o build/opt/third_party/icu4c-57.1/source/i18n/astro.o build/opt/third_party/icu4c-57.1/source/i18n/uspoof_build.o build/opt/third_party/icu4c-57.1/source/i18n/translit.o build/opt/third_party/icu4c-57.1/source/i18n/smallintformatter.o build/opt/third_party/icu4c-57.1/source/i18n/plurrule.o build/opt/third_party/icu4c-57.1/source/i18n/plurfmt.o build/opt/third_party/icu4c-57.1/source/i18n/utmscale.o build/opt/third_party/icu4c-57.1/source/i18n/tridpars.o build/opt/third_party/icu4c-57.1/source/i18n/olsontz.o build/opt/third_party/icu4c-57.1/source/i18n/nfsubs.o build/opt/third_party/icu4c-57.1/source/i18n/titletrn.o build/opt/third_party/icu4c-57.1/source/i18n/collationcompare.o build/opt/third_party/icu4c-57.1/source/i18n/collationfastlatin.o build/opt/third_party/icu4c-57.1/source/i18n/valueformatter.o build/opt/third_party/icu4c-57.1/source/i18n/digitaffix.o build/opt/third_party/icu4c-57.1/source/i18n/tznames_impl.o build/opt/third_party/icu4c-57.1/source/i18n/collationruleparser.o build/opt/third_party/icu4c-57.1/source/i18n/currfmt.o build/opt/third_party/icu4c-57.1/source/i18n/decContext.o build/opt/third_party/icu4c-57.1/source/i18n/toupptrn.o build/opt/third_party/icu4c-57.1/source/i18n/tzrule.o build/opt/third_party/icu4c-57.1/source/i18n/ucol_res.o build/opt/third_party/icu4c-57.1/source/i18n/rbt_rule.o build/opt/third_party/icu4c-57.1/source/i18n/inputext.o build/opt/third_party/icu4c-57.1/source/i18n/numsys.o build/opt/third_party/icu4c-57.1/source/i18n/tznames.o build/opt/third_party/icu4c-57.1/source/i18n/collationsets.o build/opt/third_party/icu4c-57.1/source/i18n/uitercollationiterator.o build/opt/third_party/icu4c-57.1/source/i18n/uspoof_wsconf.o build/opt/third_party/icu4c-57.1/source/i18n/unumsys.o build/opt/third_party/icu4c-57.1/source/i18n/fphdlimp.o build/opt/third_party/icu4c-57.1/source/i18n/uregex.o build/opt/third_party/icu4c-57.1/source/i18n/sharedbreakiterator.o build/opt/third_party/icu4c-57.1/source/i18n/tmutfmt.o build/opt/third_party/icu4c-57.1/source/i18n/coptccal.o build/opt/third_party/icu4c-57.1/source/i18n/quant.o build/opt/third_party/icu4c-57.1/source/i18n/region.o build/opt/third_party/icu4c-57.1/source/i18n/decimfmt.o build/opt/third_party/icu4c-57.1/source/i18n/windtfmt.o build/opt/third_party/icu4c-57.1/source/i18n/uni2name.o build/opt/third_party/icu4c-57.1/source/i18n/uspoof_impl.o build/opt/third_party/icu4c-57.1/source/i18n/anytrans.o build/opt/third_party/icu4c-57.1/source/i18n/standardplural.o build/opt/third_party/icu4c-57.1/source/i18n/dtitvfmt.o build/opt/third_party/icu4c-57.1/source/i18n/ucal.o build/opt/third_party/icu4c-57.1/source/i18n/ulocdata.o build/opt/third_party/icu4c-57.1/source/i18n/usearch.o build/opt/third_party/icu4c-57.1/source/i18n/nfrs.o build/opt/third_party/icu4c-57.1/source/i18n/vzone.o build/opt/third_party/icu4c-57.1/source/i18n/uregexc.o build/opt/third_party/icu4c-57.1/source/i18n/zonemeta.o build/opt/third_party/icu4c-57.1/source/i18n/visibledigits.o build/opt/third_party/icu4c-57.1/source/i18n/ufieldpositer.o build/opt/third_party/icu4c-57.1/source/i18n/collation.o build/opt/third_party/icu4c-57.1/source/i18n/collationdatabuilder.o build/opt/third_party/icu4c-57.1/source/i18n/uregion.o build/opt/third_party/icu4c-57.1/source/i18n/taiwncal.o build/opt/third_party/icu4c-57.1/source/i18n/uspoof.o build/opt/third_party/icu4c-57.1/source/i18n/choicfmt.o build/opt/third_party/icu4c-57.1/source/i18n/collationdatareader.o build/opt/third_party/icu4c-57.1/source/i18n/casetrn.o build/opt/third_party/icu4c-57.1/source/i18n/fmtable.o build/opt/third_party/icu4c-57.1/source/i18n/ucoleitr.o build/opt/third_party/icu4c-57.1/source/i18n/tztrans.o build/opt/third_party/icu4c-57.1/source/i18n/coll.o build/opt/third_party/icu4c-57.1/source/i18n/vtzone.o build/opt/third_party/icu4c-57.1/source/i18n/utf8collationiterator.o build/opt/third_party/icu4c-57.1/source/i18n/collationiterator.o build/opt/third_party/icu4c-57.1/source/i18n/udateintervalformat.o build/opt/third_party/icu4c-57.1/source/i18n/ethpccal.o build/opt/third_party/icu4c-57.1/source/i18n/collationrootelements.o build/opt/third_party/icu4c-57.1/source/i18n/japancal.o build/opt/third_party/icu4c-57.1/source/i18n/rulebasedcollator.o build/opt/third_party/icu4c-57.1/source/i18n/tmutamt.o build/opt/third_party/icu4c-57.1/source/i18n/measunit.o build/opt/third_party/icu4c-57.1/source/i18n/fmtable_cnv.o build/opt/third_party/icu4c-57.1/source/i18n/currunit.o build/opt/third_party/icu4c-57.1/source/i18n/gregoimp.o build/opt/third_party/icu4c-57.1/source/i18n/udat.o build/opt/third_party/icu4c-57.1/source/i18n/rbt.o build/opt/third_party/icu4c-57.1/source/i18n/scriptset.o build/opt/third_party/icu4c-57.1/source/i18n/search.o build/opt/third_party/icu4c-57.1/source/i18n/transreg.o build/opt/third_party/icu4c-57.1/source/i18n/format.o build/opt/third_party/icu4c-57.1/source/i18n/smpdtfmt.o build/opt/third_party/icu4c-57.1/source/i18n/umsg.o build/opt/third_party/icu4c-57.1/source/i18n/persncal.o build/opt/third_party/icu4c-57.1/source/i18n/upluralrules.o build/opt/third_party/icu4c-57.1/source/i18n/numfmt.o build/opt/third_party/icu4c-57.1/source/i18n/digitlst.o build/opt/third_party/icu4c-57.1/source/i18n/bocsu.o build/opt/third_party/icu4c-57.1/source/i18n/repattrn.o build/opt/third_party/icu4c-57.1/source/i18n/csrsbcs.o build/opt/third_party/icu4c-57.1/source/i18n/currpinf.o build/opt/third_party/icu4c-57.1/source/i18n/collationkeys.o build/opt/third_party/icu4c-57.1/source/i18n/chnsecal.o build/opt/third_party/icu4c-57.1/source/i18n/msgfmt.o build/opt/third_party/icu4c-57.1/source/i18n/affixpatternparser.o build/opt/third_party/icu4c-57.1/source/i18n/decNumber.o build/opt/third_party/icu4c-57.1/source/i18n/digitformatter.o build/opt/third_party/icu4c-57.1/source/i18n/pluralaffix.o build/opt/third_party/icu4c-57.1/source/i18n/utf16collationiterator.o build/opt/third_party/icu4c-57.1/source/i18n/name2uni.o build/opt/third_party/icu4c-57.1/source/i18n/ucln_in.o build/opt/third_party/icu4c-57.1/source/i18n/winnmfmt.o build/opt/third_party/icu4c-57.1/source/i18n/identifier_info.o build/opt/third_party/icu4c-57.1/source/i18n/reldatefmt.o build/opt/third_party/icu4c-57.1/source/i18n/tzgnames.o build/opt/third_party/icu4c-57.1/source/i18n/islamcal.o build/opt/third_party/icu4c-57.1/source/i18n/strmatch.o build/opt/third_party/icu4c-57.1/source/i18n/basictz.o build/opt/third_party/icu4c-57.1/source/i18n/collationfastlatinbuilder.o build/opt/third_party/icu4c-57.1/source/i18n/nortrans.o build/opt/third_party/icu4c-57.1/source/i18n/collationroot.o build/opt/third_party/icu4c-57.1/source/i18n/decimfmtimpl.o build/opt/third_party/icu4c-57.1/source/i18n/ztrans.o build/opt/third_party/icu4c-57.1/source/i18n/collationfcd.o build/opt/third_party/icu4c-57.1/source/i18n/zrule.o build/opt/third_party/icu4c-57.1/source/i18n/dcfmtsym.o build/opt/third_party/icu4c-57.1/source/i18n/coleitr.o build/opt/third_party/icu4c-57.1/source/i18n/csr2022.o build/opt/third_party/icu4c-57.1/source/i18n/funcrepl.o build/opt/third_party/icu4c-57.1/source/i18n/datefmt.o build/opt/third_party/icu4c-57.1/source/i18n/ucsdet.o build/opt/third_party/icu4c-57.1/source/i18n/utrans.o build/opt/third_party/icu4c-57.1/source/i18n/ucol.o build/opt/third_party/icu4c-57.1/source/i18n/csrmbcs.o build/opt/third_party/icu4c-57.1/source/i18n/indiancal.o build/opt/third_party/icu4c-57.1/source/i18n/dtitvinf.o build/opt/third_party/icu4c-57.1/source/i18n/nfrule.o build/opt/third_party/icu4c-57.1/source/i18n/rbt_set.o build/opt/third_party/icu4c-57.1/source/i18n/collationdatawriter.o build/opt/third_party/icu4c-57.1/source/i18n/gender.o build/opt/third_party/icu4c-57.1/source/i18n/smpdtfst.o build/opt/third_party/icu4c-57.1/source/i18n/hebrwcal.o build/opt/third_party/icu4c-57.1/source/i18n/rbt_pars.o build/opt/third_party/icu4c-57.1/source/i18n/decimalformatpattern.o build/opt/third_party/icu4c-57.1/source/i18n/precision.o build/opt/third_party/icu4c-57.1/source/i18n/stsearch.o build/opt/third_party/icu4c-57.1/source/i18n/cecal.o build/opt/third_party/icu4c-57.1/source/i18n/quantityformatter.o build/opt/third_party/icu4c-57.1/source/i18n/strrepl.o build/opt/third_party/icu4c-57.1/source/i18n/dtrule.o build/opt/third_party/icu4c-57.1/source/i18n/compactdecimalformat.o build/opt/third_party/s2/base/int128.o build/opt/third_party/s2/base/logging.o build/opt/third_party/mozjs-60/extract/mfbt/Compression.o build/opt/third_party/icu4c-57.1/source/common/unistr_case_locale.o build/opt/mongo/util/dns_query.o build/opt/mongo/crypto/sha1_block.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src7.o build/opt/mongo/db/pipeline/parsed_aggregation_projection.o build/opt/mongo/s/request_types/create_database_gen.o build/opt/third_party/pcre-8.42/pcre_dfa_exec.o build/opt/third_party/icu4c-57.1/source/common/dictbe.o build/opt/mongo/db/ops/write_ops_gen.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_ceil.o build/opt/mongo/client/native_sasl_client_session.o build/opt/mongo/db/geo/geoparser.o build/opt/mongo/db/geo/geometry_container.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_from_int.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_trig.o build/opt/mongo/db/catalog/index_catalog_entry.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_hypot.o build/opt/mongo/base/data_type_string_data.o build/opt/mongo/client/sasl_plain_client_conversation.o build/opt/third_party/pcre-8.42/pcre_valid_utf8.o build/opt/mongo/platform/process_id.o build/opt/third_party/shim_fmt.o build/opt/mongo/shell/bench.o build/opt/third_party/icu4c-57.1/source/common/ustrtrns.o build/opt/third_party/icu4c-57.1/source/common/umath.o build/opt/mongo/s/database_version_gen.o build/opt/mongo/transport/message_compressor_registry.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_int32.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_next.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_noncomp.o build/opt/mongo/util/errno_util.o build/opt/third_party/pcre-8.42/pcre_stringpiece.o build/opt/third_party/s2/util/coding/varint.o build/opt/mongo/db/matcher/schema/expression_internal_schema_str_length.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_pow.o build/opt/third_party/icu4c-57.1/source/common/patternprops.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_rem.o build/opt/mongo/rpc/op_msg.o build/opt/mongo/s/catalog/type_locks.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_bessel.o build/opt/mongo/shell/kms_gen.o build/opt/mongo/util/md5.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_int8.o build/opt/third_party/zstandard-1.3.7/zstd/lib/dictBuilder/fastcover.o build/opt/third_party/timelib-2018.01/timelib.o build/opt/mongo/db/commands/server_status_internal.o build/opt/mongo/db/auth/restriction_environment.o build/opt/third_party/abseil-cpp-master/abseil-cpp/absl/hash/internal/hash.o build/opt/third_party/abseil-cpp-master/abseil-cpp/absl/hash/internal/city.o build/opt/mongo/bson/bsontypes.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_fetestexcept.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_erf.o build/opt/mongo/base/secure_allocator.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_compress.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_double_fast.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_mul.o build/opt/third_party/pcre-8.42/pcre_ucd.o build/opt/third_party/icu4c-57.1/source/common/unames.o build/opt/third_party/icu4c-57.1/source/common/ustr_wcs.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_tan.o build/opt/mongo/s/chunk_version.o build/opt/mongo/db/server_options_base.o build/opt/third_party/gperftools-2.7/dist/src/base/dynamic_annotations.o build/opt/mongo/db/query/count_command_gen.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_acosh.o build/opt/mongo/transport/service_executor_reserved.o build/opt/mongo/base/make_string_vector.o build/opt/mongo/db/pipeline/document_source_merge_gen.o build/opt/mongo/db/index/index_descriptor.o build/opt/third_party/icu4c-57.1/source/common/bytestream.o build/opt/third_party/mozjs-60/extract/js/src/vm/JSAtom.o build/opt/third_party/kms-message/src/kms_request.o build/opt/third_party/icu4c-57.1/source/common/utrace.o build/opt/third_party/icu4c-57.1/source/common/resource.o build/opt/mongo/util/shell_exec.o build/opt/mongo/platform/strnlen.o build/opt/mongo/logger/message_event_utf8_encoder.o build/opt/mongo/db/auth/resource_pattern.o build/opt/third_party/kms-message/src/kms_encrypt_request.o build/opt/third_party/kms-message/src/kms_response.o build/opt/third_party/kms-message/src/kms_request_opt.o build/opt/third_party/kms-message/src/sort.o build/opt/third_party/kms-message/src/kms_kv_list.o build/opt/third_party/kms-message/src/hexlify.o build/opt/third_party/kms-message/src/kms_message.o build/opt/third_party/kms-message/src/kms_response_parser.o build/opt/third_party/kms-message/src/kms_decrypt_request.o build/opt/third_party/kms-message/src/kms_b64.o build/opt/third_party/kms-message/src/kms_crypto_openssl.o build/opt/third_party/kms-message/src/kms_request_str.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_asin.o build/opt/mongo/logger/logstream_builder.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_tan.o build/opt/mongo/util/background.o build/opt/mongo/db/fts/fts_language.o build/opt/mongo/db/fts/fts_spec_legacy.o build/opt/mongo/db/fts/tokenizer.o build/opt/mongo/db/fts/fts_basic_tokenizer.o build/opt/mongo/db/fts/stop_words.o build/opt/mongo/db/fts/fts_basic_phrase_matcher.o build/opt/mongo/db/fts/fts_query_parser.o build/opt/mongo/db/fts/fts_index_format.o build/opt/mongo/db/fts/fts_unicode_phrase_matcher.o build/opt/mongo/db/fts/fts_query_impl.o build/opt/mongo/db/fts/fts_util.o build/opt/mongo/db/fts/fts_spec.o build/opt/mongo/db/fts/fts_unicode_tokenizer.o build/opt/third_party/libstemmer_c/libstemmer/libstemmer_utf8.o build/opt/third_party/timelib-2018.01/parse_iso_intervals.o build/opt/mongo/transport/message_compressor_options_client_gen.o build/opt/mongo/scripting/mozjs/db.o build/opt/mongo/s/catalog/type_lockpings.o build/opt/third_party/icu4c-57.1/source/common/cstr.o build/opt/third_party/icu4c-57.1/source/common/wintz.o build/opt/mongo/util/quick_exit.o build/opt/third_party/icu4c-57.1/source/common/ucnv_err.o build/opt/mongo/db/server_options_helpers_gen.o build/opt/mongo/db/pipeline/dependencies.o build/opt/third_party/icu4c-57.1/source/common/dictionarydata.o build/opt/mongo/db/storage/key_string.o build/opt/mongo/db/catalog/disable_index_spec_namespace_generation_gen.o build/opt/mongo/logger/component_message_log_domain.o build/opt/mongo/util/net/hostandport_gen.o build/opt/third_party/s2/s2cap.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_int64.o build/opt/third_party/icu4c-57.1/source/common/uhash_us.o build/opt/third_party/boost-1.70.0/libs/iostreams/src/file_descriptor.o build/opt/mongo/scripting/mozjs/mongohelpers_js.o build/opt/third_party/boost-1.70.0/libs/iostreams/src/mapped_file.o build/opt/mongo/db/logical_session_id_gen.o build/opt/mongo/rpc/protocol.o build/opt/third_party/pcre-8.42/pcre_scanner.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_decimal_globals.o build/opt/third_party/icu4c-57.1/source/common/ures_cnv.o build/opt/mongo/db/repl/repl_settings_gen.o build/opt/third_party/boost-1.70.0/libs/filesystem/src/windows_file_codecvt.o build/opt/third_party/icu4c-57.1/source/common/resbund_cnv.o build/opt/mongo/logger/log_component_settings.o build/opt/mongo/db/geo/hash.o build/opt/third_party/pcre-8.42/pcre_compile.o build/opt/mongo/db/query/cursor_response.o build/opt/mongo/db/repl/replication_coordinator_noop.o build/opt/mongo/db/stats/counters.o build/opt/third_party/s2/s2polygon.o build/opt/mongo/util/net/ssl_options_client.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_2_str_tables.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src39.o build/opt/third_party/icu4c-57.1/source/common/cwchar.o build/opt/mongo/bson/bson_validate.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src18.o build/opt/third_party/icu4c-57.1/source/common/bmpset.o build/opt/mongo/util/fail_point.o build/opt/mongo/shell/shell_options_storage.o build/opt/mongo/client/authenticate.o build/opt/mongo/db/pipeline/document_comparator.o build/opt/third_party/icu4c-57.1/source/common/ucnv_bld.o build/opt/third_party/icu4c-57.1/source/common/icudataver.o build/opt/third_party/icu4c-57.1/source/common/brkiter.o build/opt/third_party/icu4c-57.1/source/common/ucnvhz.o build/opt/third_party/icu4c-57.1/source/common/ucasemap.o build/opt/third_party/icu4c-57.1/source/common/uchar.o build/opt/third_party/icu4c-57.1/source/common/uloc_keytype.o build/opt/third_party/icu4c-57.1/source/common/pluralmap.o build/opt/third_party/icu4c-57.1/source/common/ucnv_u8.o build/opt/third_party/icu4c-57.1/source/common/ubidi.o build/opt/third_party/icu4c-57.1/source/common/usetiter.o build/opt/third_party/icu4c-57.1/source/common/loclikely.o build/opt/third_party/icu4c-57.1/source/common/rbbitblb.o build/opt/third_party/icu4c-57.1/source/common/normalizer2.o build/opt/third_party/icu4c-57.1/source/common/ustring.o build/opt/third_party/icu4c-57.1/source/common/ucnv_ct.o build/opt/third_party/icu4c-57.1/source/common/cmemory.o build/opt/third_party/icu4c-57.1/source/common/uchriter.o build/opt/third_party/icu4c-57.1/source/common/uniset.o build/opt/third_party/icu4c-57.1/source/common/ucnv_set.o build/opt/third_party/icu4c-57.1/source/common/locutil.o build/opt/third_party/icu4c-57.1/source/common/ucnvscsu.o build/opt/third_party/icu4c-57.1/source/common/unistr.o build/opt/third_party/icu4c-57.1/source/common/charstr.o build/opt/third_party/icu4c-57.1/source/common/ulist.o build/opt/third_party/icu4c-57.1/source/common/ucnv2022.o build/opt/third_party/icu4c-57.1/source/common/normalizer2impl.o build/opt/third_party/icu4c-57.1/source/common/schriter.o build/opt/third_party/icu4c-57.1/source/common/ucnvlat1.o build/opt/third_party/icu4c-57.1/source/common/ucurr.o build/opt/third_party/icu4c-57.1/source/common/uniset_closure.o build/opt/third_party/icu4c-57.1/source/common/uscript_props.o build/opt/third_party/icu4c-57.1/source/common/ucnv_lmb.o build/opt/third_party/icu4c-57.1/source/common/ucnv.o build/opt/third_party/icu4c-57.1/source/common/uresdata.o build/opt/third_party/icu4c-57.1/source/common/utf_impl.o build/opt/third_party/icu4c-57.1/source/common/bytestrie.o build/opt/third_party/icu4c-57.1/source/common/utypes.o build/opt/third_party/icu4c-57.1/source/common/chariter.o build/opt/third_party/icu4c-57.1/source/common/servls.o build/opt/third_party/icu4c-57.1/source/common/ucnvdisp.o build/opt/third_party/icu4c-57.1/source/common/ucat.o build/opt/third_party/icu4c-57.1/source/common/uenum.o build/opt/third_party/icu4c-57.1/source/common/uinvchar.o build/opt/third_party/icu4c-57.1/source/common/uloc_tag.o build/opt/third_party/icu4c-57.1/source/common/simpleformatter.o build/opt/third_party/icu4c-57.1/source/common/ucnvmbcs.o build/opt/third_party/icu4c-57.1/source/common/locmap.o build/opt/third_party/icu4c-57.1/source/common/uts46.o build/opt/third_party/icu4c-57.1/source/common/bytestriebuilder.o build/opt/third_party/icu4c-57.1/source/common/uset_props.o build/opt/third_party/icu4c-57.1/source/common/icuplug.o build/opt/third_party/icu4c-57.1/source/common/ushape.o build/opt/third_party/icu4c-57.1/source/common/rbbirb.o build/opt/third_party/icu4c-57.1/source/common/ucnv_io.o build/opt/third_party/icu4c-57.1/source/common/unistr_props.o build/opt/third_party/icu4c-57.1/source/common/util_props.o build/opt/third_party/icu4c-57.1/source/common/rbbistbl.o build/opt/third_party/icu4c-57.1/source/common/unormcmp.o build/opt/third_party/icu4c-57.1/source/common/rbbinode.o build/opt/third_party/icu4c-57.1/source/common/servnotf.o build/opt/third_party/icu4c-57.1/source/common/ucnv_u32.o build/opt/third_party/icu4c-57.1/source/common/ucnv_u7.o build/opt/third_party/icu4c-57.1/source/common/loadednormalizer2impl.o build/opt/third_party/icu4c-57.1/source/common/ubidi_props.o build/opt/third_party/icu4c-57.1/source/common/sharedobject.o build/opt/third_party/icu4c-57.1/source/common/ucmndata.o build/opt/third_party/icu4c-57.1/source/common/utrie.o build/opt/third_party/icu4c-57.1/source/common/ucnvbocu.o build/opt/third_party/icu4c-57.1/source/common/locavailable.o build/opt/third_party/icu4c-57.1/source/common/uset.o build/opt/third_party/icu4c-57.1/source/common/udataswp.o build/opt/third_party/icu4c-57.1/source/common/serv.o build/opt/third_party/icu4c-57.1/source/common/unistr_case.o build/opt/third_party/icu4c-57.1/source/common/ruleiter.o build/opt/third_party/icu4c-57.1/source/common/util.o build/opt/third_party/icu4c-57.1/source/common/ucharstrie.o build/opt/third_party/icu4c-57.1/source/common/messagepattern.o build/opt/third_party/icu4c-57.1/source/common/umutex.o build/opt/third_party/icu4c-57.1/source/common/ucasemap_titlecase_brkiter.o build/opt/third_party/icu4c-57.1/source/common/propname.o build/opt/third_party/icu4c-57.1/source/common/bytestrieiterator.o build/opt/third_party/icu4c-57.1/source/common/utrie2_builder.o build/opt/third_party/icu4c-57.1/source/common/uprops.o build/opt/third_party/icu4c-57.1/source/common/cstring.o build/opt/third_party/icu4c-57.1/source/common/ustrfmt.o build/opt/third_party/icu4c-57.1/source/common/ustack.o build/opt/third_party/icu4c-57.1/source/common/errorcode.o build/opt/third_party/icu4c-57.1/source/common/servlkf.o build/opt/third_party/icu4c-57.1/source/common/uiter.o build/opt/third_party/icu4c-57.1/source/common/caniter.o build/opt/third_party/icu4c-57.1/source/common/ubrk.o build/opt/third_party/icu4c-57.1/source/common/locid.o build/opt/third_party/icu4c-57.1/source/common/unistr_titlecase_brkiter.o build/opt/third_party/icu4c-57.1/source/common/ucnvsel.o build/opt/third_party/icu4c-57.1/source/common/uvectr32.o build/opt/third_party/icu4c-57.1/source/common/ubidiln.o build/opt/third_party/icu4c-57.1/source/common/uinit.o build/opt/third_party/icu4c-57.1/source/common/servrbf.o build/opt/third_party/icu4c-57.1/source/common/usc_impl.o build/opt/third_party/icu4c-57.1/source/common/uhash.o build/opt/third_party/icu4c-57.1/source/common/ucln_cmn.o build/opt/third_party/icu4c-57.1/source/common/unorm.o build/opt/third_party/icu4c-57.1/source/common/ustr_titlecase_brkiter.o build/opt/third_party/icu4c-57.1/source/common/utext.o build/opt/third_party/icu4c-57.1/source/common/ucnv_cnv.o build/opt/third_party/icu4c-57.1/source/common/resbund.o build/opt/third_party/icu4c-57.1/source/common/uidna.o build/opt/third_party/icu4c-57.1/source/common/servlk.o build/opt/third_party/icu4c-57.1/source/common/uniset_props.o build/opt/third_party/icu4c-57.1/source/common/udata.o build/opt/third_party/icu4c-57.1/source/common/usprep.o build/opt/third_party/icu4c-57.1/source/common/ucnvisci.o build/opt/third_party/icu4c-57.1/source/common/punycode.o build/opt/third_party/icu4c-57.1/source/common/rbbiscan.o build/opt/third_party/icu4c-57.1/source/common/appendable.o build/opt/third_party/icu4c-57.1/source/common/ubidiwrt.o build/opt/third_party/icu4c-57.1/source/common/ucharstrieiterator.o build/opt/third_party/icu4c-57.1/source/common/uscript.o build/opt/third_party/icu4c-57.1/source/common/unifilt.o build/opt/third_party/icu4c-57.1/source/common/uloc.o build/opt/third_party/icu4c-57.1/source/common/ustrcase.o build/opt/third_party/icu4c-57.1/source/common/stringtriebuilder.o build/opt/third_party/icu4c-57.1/source/common/locbased.o build/opt/third_party/icu4c-57.1/source/common/uobject.o build/opt/third_party/icu4c-57.1/source/common/servslkf.o build/opt/third_party/icu4c-57.1/source/common/rbbidata.o build/opt/third_party/icu4c-57.1/source/common/locdispnames.o build/opt/third_party/icu4c-57.1/source/common/rbbi.o build/opt/third_party/icu4c-57.1/source/common/putil.o build/opt/third_party/icu4c-57.1/source/common/ucnv_u16.o build/opt/third_party/icu4c-57.1/source/common/ucnv_ext.o build/opt/third_party/icu4c-57.1/source/common/ustrenum.o build/opt/third_party/icu4c-57.1/source/common/propsvec.o build/opt/third_party/icu4c-57.1/source/common/filteredbrk.o build/opt/third_party/icu4c-57.1/source/common/ucnv_cb.o build/opt/third_party/icu4c-57.1/source/common/uresbund.o build/opt/mongo/db/concurrency/lock_state.o build/opt/mongo/base/error_extra_info.o build/opt/mongo/bson/bsonobj.o build/opt/mongo/rpc/metadata/repl_set_metadata.o build/opt/third_party/shim_abseil.o build/opt/mongo/db/pipeline/expression_trigonometric.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_quantize.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_convert_data.o build/opt/mongo/transport/transport_layer.o build/opt/mongo/s/would_change_owning_shard_exception.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src20.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_floorf.o build/opt/mongo/db/matcher/rewrite_expr.o build/opt/mongo/db/catalog/index_key_validate.o build/opt/mongo/util/fail_point_server_parameter_gen.o build/opt/mongo/util/fail_point_registry.o build/opt/mongo/util/fail_point_service.o build/opt/mongo/util/net/cidr.o build/opt/mongo/util/net/socket_utils.o build/opt/mongo/util/net/hostname_canonicalization.o build/opt/mongo/util/net/socket_exception.o build/opt/mongo/util/net/hostandport.o build/opt/mongo/util/net/sockaddr.o build/opt/third_party/s2/util/math/mathutil.o build/opt/third_party/wiredtiger/src/checksum/software/checksum.o build/opt/mongo/scripting/mozjs/session.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_acosh.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src40.o build/opt/mongo/db/concurrency/replication_state_transition_lock_guard.o build/opt/mongo/base/initializer.o build/opt/mongo/idl/server_parameter.o build/opt/mongo/client/query.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_logb.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src11.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_next.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_lround.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_rem.o build/opt/mongo/db/query/count_command_as_aggregation_command.o build/opt/mongo/rpc/metadata/config_server_metadata.o build/opt/mongo/db/multi_key_path_tracker.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_modf.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_frexp.o build/opt/mongo/db/auth/user_management_commands_parser.o build/opt/mongo/scripting/mozjs/numberint.o build/opt/mongo/db/auth/role_name.o build/opt/mongo/db/query/explain_options.o build/opt/mongo/scripting/mozjs/timestamp.o build/opt/mongo/scripting/mozjs/object.o build/opt/mongo/executor/network_interface_factory.o build/opt/mongo/util/options_parser/startup_options.o build/opt/mongo/shell/mongo-server.o build/opt/mongo/db/matcher/schema/expression_internal_schema_num_array_items.o build/opt/mongo/platform/stack_locator_linux.o build/opt/third_party/gperftools-2.7/dist/src/tcmalloc.o build/opt/third_party/zstandard-1.3.7/zstd/lib/dictBuilder/cover.o build/opt/mongo/db/pipeline/expression_context.o build/opt/mongo/db/pipeline/variables.o build/opt/mongo/util/net/ssl_stream.o build/opt/mongo/db/traffic_reader.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_danish.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_compare.o build/opt/mongo/util/secure_zero_memory.o build/opt/third_party/shim_kms_message.o build/opt/mongo/db/repl/repl_settings.o build/opt/mongo/util/version_impl.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_expm1.o build/opt/mongo/db/geo/r2_region_coverer.o build/opt/third_party/boost-1.70.0/libs/filesystem/src/portability.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_sin.o build/opt/third_party/zstandard-1.3.7/zstd/lib/deprecated/zbuff_common.o build/opt/mongo/client/async_client.o build/opt/mongo/s/catalog/type_collection.o build/opt/mongo/executor/network_interface_thread_pool.o build/opt/third_party/pcre-8.42/pcre_fullinfo.o build/opt/mongo/util/version.o build/opt/mongo/util/icu_init.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_porter.o build/opt/mongo/db/commands.o build/opt/third_party/zstandard-1.3.7/zstd/lib/decompress/zstd_decompress.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_mul.o build/opt/mongo/bson/bson_depth.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/huf_compress.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_int8.o build/opt/mongo/rpc/object_check.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_atanh.o build/opt/mongo/shell/kms_shell.o build/opt/mongo/util/boost_assert_shim.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_powi.o build/opt/mongo/db/query/cursor_request.o build/opt/mongo/scripting/mozjs/numberdecimal.o build/opt/mongo/client/sasl_scram_client_conversation.o build/opt/mongo/util/assert_util.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_quantize.o build/opt/mongo/util/net/http_client_curl.o build/opt/mongo/logger/rotatable_file_manager.o build/opt/third_party/mozjs-60/extract/js/src/mfbt/Unified_cpp_mfbt0.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src45.o build/opt/mongo/db/pipeline/document_source_merge_modes_gen.o build/opt/third_party/mozjs-60/extract/mozglue/misc/Printf.o build/opt/third_party/mozjs-60/extract/mozglue/misc/ConditionVariable_posix.o build/opt/mongo/client/dbclient_base.o build/opt/mongo/s/request_types/migration_secondary_throttle_options.o build/opt/mongo/s/catalog/type_chunk.o build/opt/mongo/s/catalog/type_config_version.o build/opt/mongo/s/cannot_implicitly_create_collection_info.o build/opt/mongo/s/request_types/update_zone_key_range_request_type.o build/opt/mongo/s/catalog/type_tags.o build/opt/mongo/s/request_types/shard_collection_gen.o build/opt/mongo/s/database_version_helpers.o build/opt/mongo/s/request_types/flush_database_cache_updates_gen.o build/opt/mongo/s/request_types/merge_chunk_request_type.o build/opt/mongo/s/request_types/balance_chunk_request_type.o build/opt/mongo/s/request_types/split_chunk_request_type.o build/opt/mongo/s/catalog/mongo_version_range.o build/opt/mongo/s/catalog/type_shard.o build/opt/mongo/s/catalog/type_chunk_base_gen.o build/opt/mongo/s/request_types/clear_jumbo_flag_gen.o build/opt/mongo/s/request_types/set_shard_version_request.o build/opt/mongo/s/request_types/wait_for_fail_point_gen.o build/opt/mongo/s/request_types/get_database_version_gen.o build/opt/mongo/s/request_types/remove_shard_from_zone_request_type.o build/opt/mongo/s/catalog/type_mongos.o build/opt/mongo/s/request_types/clone_collection_options_from_primary_shard_gen.o build/opt/mongo/s/catalog/type_shard_database.o build/opt/mongo/s/request_types/add_shard_request_type.o build/opt/mongo/s/request_types/create_collection_gen.o build/opt/mongo/s/catalog/type_shard_collection.o build/opt/mongo/s/request_types/clone_catalog_data_gen.o build/opt/mongo/s/request_types/move_chunk_request.o build/opt/mongo/s/chunk_version_gen.o build/opt/mongo/s/request_types/flush_routing_table_cache_updates_gen.o build/opt/mongo/s/request_types/move_primary_gen.o build/opt/mongo/s/shard_id.o build/opt/mongo/db/repl/repl_client_info.o build/opt/mongo/logger/log_manager.o build/opt/mongo/rpc/metadata/impersonated_user_metadata_gen.o build/opt/mongo/rpc/metadata/impersonated_user_metadata.o build/opt/mongo/base/parse_number.o build/opt/mongo/scripting/mozjs/regexp.o build/opt/mongo/shell/shell_utils.o build/opt/mongo/base/initializer_dependency_graph.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_exp.o build/opt/third_party/mozjs-60/extract/js/src/vm/Interpreter.o build/opt/mongo/db/pipeline/parsed_aggregation_projection_node.o build/opt/mongo/db/pipeline/parsed_add_fields.o build/opt/mongo/db/pipeline/parsed_exclusion_projection.o build/opt/mongo/db/pipeline/parsed_inclusion_projection.o build/opt/mongo/transport/message_compressor_zlib.o build/opt/mongo/transport/message_compressor_zstd.o build/opt/mongo/transport/message_compressor_metrics.o build/opt/mongo/transport/message_compressor_snappy.o build/opt/mongo/db/ops/write_ops_parsers.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src27.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_rintf.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src1.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_atan.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_fabs.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/k_exp.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src31.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src5.o build/opt/third_party/mozjs-60/extract/js/src/perf/pm_stub.o build/opt/third_party/mozjs-60/extract/js/src/frontend/Parser.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src30.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src25.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src13.o build/opt/third_party/mozjs-60/extract/js/src/jsmath.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_ceilf.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src10.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src3.o build/opt/third_party/mozjs-60/extract/js/src/builtin/RegExp.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src23.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src26.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_atan2.o build/opt/third_party/mozjs-60/extract/js/src/jsarray.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src43.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src16.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_acos.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src29.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src8.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src12.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src28.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src2.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_log2.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_hypot.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src24.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src17.o build/opt/third_party/mozjs-60/extract/mozglue/misc/StackWalk.o build/opt/third_party/mozjs-60/mongo_sources/mongoErrorReportToString.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_nearbyint.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src41.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src6.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_scalbn.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src35.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src36.o build/opt/third_party/mozjs-60/extract/js/src/jit/x86-shared/Disassembler-x86-shared.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src22.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_log.o build/opt/third_party/mozjs-60/extract/mfbt/lz4.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src44.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src0.o build/opt/third_party/mozjs-60/extract/mozglue/misc/Mutex_posix.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src34.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_truncf.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src19.o build/opt/third_party/mozjs-60/extract/js/src/util/DoubleToString.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_pow.o build/opt/third_party/mozjs-60/mongo_sources/freeOpToJSContext.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_copysign.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_trunc.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_tanh.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_log10.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_asin.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_exp.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src9.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_cosh.o build/opt/third_party/mozjs-60/extract/mozglue/misc/TimeStamp_posix.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_floor.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_sinh.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src14.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_asinh.o build/opt/third_party/mozjs-60/extract/mozglue/misc/TimeStamp.o build/opt/third_party/mozjs-60/platform/x86_64/linux/build/Unified_cpp_js_src38.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_cbrt.o build/opt/mongo/db/fts/unicode/codepoints_casefold.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_lgamma.o build/opt/third_party/boost-1.70.0/libs/program_options/src/positional_options.o build/opt/mongo/executor/remote_command_response.o build/opt/mongo/executor/remote_command_request.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_romanian.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_spanish.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_quantexpd.o build/opt/mongo/db/command_generic_argument.o build/opt/third_party/zstandard-1.3.7/zstd/lib/common/xxhash.o build/opt/mongo/db/fts/unicode/codepoints_delimiter_list.o build/opt/mongo/db/matcher/schema/expression_internal_schema_allowed_properties.o build/opt/mongo/crypto/sha_block_openssl.o build/opt/third_party/gperftools-2.7/dist/src/maybe_threads.o build/opt/third_party/pcre-8.42/pcrecpp.o build/opt/mongo/scripting/mozjs/jsthread.o build/opt/third_party/pcre-8.42/pcre_globals.o build/opt/third_party/shim_icu.o build/opt/mongo/db/global_settings.o build/opt/mongo/db/field_ref.o build/opt/third_party/s2/s2edgeutil.o build/opt/third_party/shim_boost.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_italian.o build/opt/third_party/shim_yaml.o build/opt/third_party/zlib-1.2.11/zutil.o build/opt/mongo/shell/shell_options_gen.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_acosh.o build/opt/third_party/pcre-8.42/pcre_refcount.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_fma.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_turkish.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_uint16.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_exp.o build/opt/mongo/db/operation_context_group.o build/opt/mongo/transport/transport_layer_manager.o build/opt/mongo/bson/bsonobjbuilder.o build/opt/mongo/transport/service_executor_synchronous.o build/opt/mongo/util/options_parser/constraints.o build/opt/third_party/gperftools-2.7/dist/src/common.o build/opt/mongo/db/catalog/index_catalog.o build/opt/mongo/db/fts/unicode/string.o build/opt/mongo/db/exec/projection_exec_agg.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_div.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_atan.o build/opt/third_party/s2/s2cellunion.o build/opt/mongo/util/password_params_gen.o build/opt/mongo/util/password.o build/opt/mongo/db/query/tailable_mode.o build/opt/mongo/db/query/query_request.o build/opt/mongo/db/query/tailable_mode_gen.o build/opt/third_party/timelib-2018.01/dow.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_sqrt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/wcstod128.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/wcstod64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_pow.o build/opt/third_party/shim_zstd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_scalbl.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_erfc.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_int32.o build/opt/mongo/util/cmdline_utils/censor_cmdline.o build/opt/mongo/shell/fle_shell_options_gen.o build/opt/mongo/util/password_digest.o build/opt/mongo/db/concurrency/lock_stats.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/strtod32.o build/opt/mongo/rpc/reply_builder_interface.o build/opt/third_party/s2/s2regionintersection.o build/opt/mongo/db/matcher/extensions_callback_noop.o build/opt/mongo/platform/stack_locator.o build/opt/mongo/util/options_parser/option_section.o build/opt/mongo/bson/bson_comparator_interface_base.o build/opt/mongo/bson/mutable/element.o build/opt/mongo/util/options_parser/option_description.o build/opt/mongo/util/signal_win32.o build/opt/mongo/util/signal_handlers.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_minmax.o build/opt/mongo/db/auth/action_set.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_log.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_string.o build/opt/mongo/rpc/metadata/tracking_metadata.o build/opt/mongo/db/pipeline/expression.o build/opt/third_party/gperftools-2.7/dist/src/emergency_malloc_for_stacktrace.o build/opt/mongo/rpc/object_check_gen.o build/opt/mongo/util/startup_test.o build/opt/mongo/db/fts/unicode/codepoints_diacritic_list.o build/opt/mongo/db/repl/replication_coordinator.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_string.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_compare.o build/opt/third_party/boost-1.70.0/libs/program_options/src/config_file.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_uint64.o build/opt/mongo/util/concurrency/thread_name.o build/opt/third_party/s2/s2cellid.o build/opt/third_party/shim_zlib.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_uint8.o build/opt/third_party/boost-1.70.0/libs/filesystem/src/operations.o build/opt/third_party/pcre-8.42/pcre_string_utils.o build/opt/mongo/db/auth/authorization_session.o build/opt/third_party/zlib-1.2.11/inflate.o build/opt/mongo/db/service_context.o build/opt/mongo/platform/shared_library.o build/opt/mongo/db/cluster_auth_mode_option_gen.o build/opt/mongo/db/matcher/schema/expression_internal_schema_match_array_index.o build/opt/mongo/db/operation_context.o build/opt/mongo/util/net/ssl_options.o build/opt/mongo/shell/kms_local.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_llrintd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_uint32.o build/opt/mongo/util/boost_assert_impl.o build/opt/mongo/base/string_data.o build/opt/mongo/util/duration.o build/opt/mongo/base/data_type.o build/opt/mongo/base/data_type_terminated.o build/opt/mongo/base/validate_locale.o build/opt/mongo/logger/redaction.o build/opt/mongo/util/time_support.o build/opt/mongo/util/stacktrace_posix.o build/opt/mongo/bson/simple_bsonobj_comparator.o build/opt/mongo/bson/timestamp.o build/opt/mongo/base/data_range.o build/opt/mongo/util/file.o build/opt/mongo/util/uuid.o build/opt/mongo/logger/log_severity.o build/opt/mongo/bson/bsonelement.o build/opt/mongo/platform/shared_library_posix.o build/opt/mongo/bson/oid.o build/opt/mongo/logger/rotatable_file_writer.o build/opt/mongo/base/data_range_cursor.o build/opt/mongo/logger/logger.o build/opt/mongo/base/transaction_error.o build/opt/mongo/base/shim.o build/opt/mongo/util/itoa.o build/opt/mongo/base/simple_string_data_comparator.o build/opt/mongo/base/error_codes.o build/opt/mongo/logger/log_component.o build/opt/mongo/platform/posix_fadvise.o build/opt/mongo/util/exit.o build/opt/mongo/bson/simple_bsonelement_comparator.o build/opt/mongo/util/stacktrace.o build/opt/mongo/platform/decimal128.o build/opt/mongo/platform/mutex.o build/opt/mongo/util/system_clock_source.o build/opt/mongo/util/hex.o build/opt/mongo/logger/console.o build/opt/mongo/bson/bsonmisc.o build/opt/mongo/logger/ramlog.o build/opt/mongo/util/base64.o build/opt/mongo/base/global_initializer.o build/opt/mongo/util/platform_init.o build/opt/mongo/base/global_initializer_registerer.o build/opt/mongo/util/str.o build/opt/mongo/base/init.o build/opt/mongo/platform/strcasestr.o build/opt/mongo/executor/network_interface_tl.o build/opt/mongo/scripting/mozjs/countdownlatch.o build/opt/mongo/scripting/mozjs/cursor_handle.o build/opt/mongo/scripting/mozjs/bindata.o build/opt/mongo/scripting/mozjs/error.o build/opt/mongo/scripting/mozjs/mongohelpers.o build/opt/mongo/scripting/mozjs/jscustomallocator.o build/opt/mongo/scripting/mozjs/internedstring.o build/opt/mongo/scripting/mozjs/numberlong.o build/opt/mongo/scripting/mozjs/code.o build/opt/mongo/scripting/mozjs/global.o build/opt/mongo/scripting/mozjs/objectwrapper.o build/opt/mongo/scripting/mozjs/idwrapper.o build/opt/mongo/scripting/mozjs/dbref.o build/opt/mongo/scripting/mozjs/maxkey.o build/opt/mongo/scripting/mozjs/minkey.o build/opt/mongo/scripting/mozjs/engine.o build/opt/mongo/scripting/mozjs/mongo.o build/opt/mongo/scripting/mozjs/PosixNSPR.o build/opt/mongo/scripting/mozjs/cursor.o build/opt/mongo/scripting/mozjs/oid.o build/opt/mongo/scripting/mozjs/exception.o build/opt/mongo/scripting/mozjs/engine_gen.o build/opt/mongo/scripting/mozjs/valuereader.o build/opt/mongo/scripting/mozjs/scripting_util_gen.o build/opt/mongo/scripting/mozjs/valuewriter.o build/opt/mongo/scripting/mozjs/implscope.o build/opt/mongo/scripting/mozjs/status.o build/opt/mongo/scripting/mozjs/jsstringwrapper.o build/opt/mongo/scripting/mozjs/nativefunction.o build/opt/mongo/scripting/mozjs/dbquery.o build/opt/mongo/util/net/private/ssl_expiration.o build/opt/mongo/util/net/sock.o build/opt/mongo/util/net/private/socket_poll.o build/opt/mongo/transport/transport_layer_asio.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_bid64.o build/opt/mongo/shell/kms.o build/opt/third_party/boost-1.70.0/libs/program_options/src/options_description.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_exp10.o build/opt/mongo/db/server_options_helpers.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_nearbyintd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_nearbyintd.o build/opt/third_party/zlib-1.2.11/adler32.o build/opt/mongo/db/auth/impersonation_session.o build/opt/mongo/db/auth/privilege_parser.o build/opt/mongo/db/auth/privilege.o build/opt/third_party/murmurhash3/MurmurHash3.o build/opt/mongo/idl/server_parameter_with_storage.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_erf.o build/opt/third_party/gperftools-2.7/dist/src/stack_trace_table.o build/opt/mongo/db/repl/bson_extract_optime.o build/opt/mongo/db/baton.o build/opt/mongo/db/operation_time_tracker.o build/opt/mongo/db/logical_time.o build/opt/third_party/zstandard-1.3.7/zstd/lib/common/error_private.o build/opt/third_party/zstandard-1.3.7/zstd/lib/dictBuilder/zdict.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_sqrt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_bid.o build/opt/mongo/db/default_baton.o build/opt/mongo/db/unclean_shutdown.o build/opt/mongo/db/client.o build/opt/mongo/db/server_recovery.o build/opt/mongo/db/matcher/expression.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_sqrt.o build/opt/mongo/db/keypattern.o build/opt/third_party/gperftools-2.7/dist/src/static_vars.o build/opt/third_party/gperftools-2.7/dist/src/malloc_extension.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_log10.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_log1p.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_frexp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_fdimd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_quantexpd.o build/opt/mongo/db/fts/unicode/codepoints_diacritic_map.o build/opt/third_party/boost-1.70.0/libs/filesystem/src/path_traits.o build/opt/mongo/db/pipeline/resume_token.o build/opt/mongo/idl/idl_parser.o build/opt/third_party/boost-1.70.0/libs/program_options/src/value_semantic.o build/opt/third_party/boost-1.70.0/libs/program_options/src/parsers.o build/opt/third_party/boost-1.70.0/libs/program_options/src/variables_map.o build/opt/third_party/boost-1.70.0/libs/program_options/src/cmdline.o build/opt/third_party/boost-1.70.0/libs/program_options/src/split.o build/opt/third_party/boost-1.70.0/libs/program_options/src/utf8_codecvt_facet.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_int8.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_logb.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_llrintd.o build/opt/mongo/db/pipeline/document_path_support.o build/opt/mongo/executor/network_interface.o build/opt/mongo/util/net/ssl_manager.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_lgamma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_acos.o build/opt/mongo/executor/connection_pool.o build/opt/mongo/db/pipeline/value.o build/opt/third_party/timelib-2018.01/parse_date.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_tan.o build/opt/mongo/db/wire_version.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_exp.o build/opt/third_party/gperftools-2.7/dist/src/span.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_noncomp.o build/opt/third_party/fmt/dist/src/posix.o build/opt/mongo/db/namespace_string.o build/opt/third_party/gperftools-2.7/dist/src/base/spinlock.o build/opt/mongo/shell/kms_aws.o build/opt/mongo/db/query/killcursors_request.o build/opt/mongo/util/safe_num.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_mod.o build/opt/mongo/db/matcher/path.o build/opt/third_party/gperftools-2.7/dist/src/central_freelist.o build/opt/third_party/s2/s2polygonbuilder.o build/opt/third_party/s2/s2.o build/opt/third_party/s2/s2edgeindex.o build/opt/third_party/s2/s2latlngrect.o build/opt/third_party/s2/s1angle.o build/opt/third_party/s2/s2cell.o build/opt/third_party/s2/s2regionunion.o build/opt/third_party/s2/s2latlng.o build/opt/third_party/s2/s1interval.o build/opt/third_party/s2/s2region.o build/opt/third_party/s2/s2pointregion.o build/opt/third_party/s2/s2regioncoverer.o build/opt/third_party/s2/s2loop.o build/opt/mongo/rpc/metadata/sharding_metadata.o build/opt/third_party/gperftools-2.7/dist/src/sampler.o build/opt/third_party/gperftools-2.7/dist/src/internal_logging.o build/opt/third_party/gperftools-2.7/dist/src/symbolize.o build/opt/third_party/gperftools-2.7/dist/src/malloc_hook.o build/opt/third_party/gperftools-2.7/dist/src/base/vdso_support.o build/opt/third_party/gperftools-2.7/dist/src/base/sysinfo.o build/opt/third_party/gperftools-2.7/dist/src/stacktrace.o build/opt/third_party/gperftools-2.7/dist/src/base/spinlock_internal.o build/opt/third_party/gperftools-2.7/dist/src/base/elf_mem_image.o build/opt/third_party/gperftools-2.7/dist/src/page_heap.o build/opt/third_party/gperftools-2.7/dist/src/system-alloc.o build/opt/third_party/gperftools-2.7/dist/src/thread_cache.o build/opt/third_party/gperftools-2.7/dist/src/base/logging.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_log2.o build/opt/mongo/db/query/query_knobs_gen.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_compare.o build/opt/mongo/util/icu.o build/opt/mongo/db/write_concern_options.o build/opt/mongo/db/commands/test_commands_enabled.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_sin.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_int16.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_decimal_data.o build/opt/mongo/util/secure_compare_memory.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_lround.o build/opt/mongo/db/server_options_general_gen.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_feclearexcept.o build/opt/third_party/boost-1.70.0/libs/system/src/error_code.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_cbrt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_log2.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_logbd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_nexttowardd.o build/opt/third_party/fmt/dist/src/format.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_swedish.o build/opt/mongo/db/index/wildcard_key_generator.o build/opt/mongo/bson/mutable/document.o build/opt/mongo/db/keyfile_option_gen.o build/opt/mongo/db/matcher/matchable.o build/opt/mongo/util/regex_util.o build/opt/mongo/util/options_parser/options_parser.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_atan.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_scalbl.o build/opt/mongo/db/index/expression_keys_private.o build/opt/mongo/db/index/btree_key_generator.o build/opt/mongo/db/index/sort_key_generator.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_int32.o build/opt/mongo/rpc/metadata.o build/opt/mongo/rpc/legacy_reply_builder.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_binarydecimal.o build/opt/mongo/shell/mongo.o build/opt/mongo/db/storage/storage_parameters_gen.o build/opt/third_party/shim_timelib.o build/opt/mongo/db/field_parser.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_feraiseexcept.o build/opt/mongo/rpc/metadata/logical_time_metadata.o build/opt/third_party/zstandard-1.3.7/zstd/lib/common/pool.o build/opt/mongo/client/sasl_client_authenticate.o build/opt/mongo/client/mongo_uri.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_expm1.o build/opt/mongo/shell/encrypted_dbclient_base.o build/opt/third_party/shim_snappy.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_quantize.o build/opt/mongo/db/catalog/collection_catalog.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_sub.o build/opt/mongo/db/server_options.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_inv_hyper.o build/opt/mongo/db/server_options_base_gen.o build/opt/mongo/crypto/symmetric_crypto_openssl.o build/opt/mongo/db/server_options_nongeneral_gen.o build/opt/mongo/db/matcher/expression_text_base.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_cos.o build/opt/mongo/shell/shell_utils_launcher.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_log10.o build/opt/mongo/db/auth/user_name.o build/opt/mongo/bson/util/bson_extract.o build/opt/mongo/db/matcher/schema/encrypt_schema_types.o build/opt/third_party/pcre-8.42/pcre_config.o build/opt/mongo/db/matcher/schema/json_schema_parser.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/wcstod32.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_exp2.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/zstdmt_compress.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/fse_compress.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_lround.o build/opt/third_party/shim_stemmer.o build/opt/mongo/db/storage/storage_options.o build/opt/third_party/pcre-8.42/pcre_newline.o build/opt/mongo/util/options_parser/value.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_uint32.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_cos.o build/opt/mongo/db/matcher/expression_parser.o build/opt/third_party/zstandard-1.3.7/zstd/lib/common/fse_decompress.o build/opt/mongo/db/storage/write_unit_of_work.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_atan2.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_exp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_int16.o build/opt/mongo/db/pipeline/exchange_spec_gen.o build/opt/mongo/shell/mk_wcwidth.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_hungarian.o build/opt/third_party/zlib-1.2.11/compress.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_modf.o build/opt/mongo/executor/connection_pool_stats.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_fma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_int16.o build/opt/mongo/db/commands/server_status.o build/opt/mongo/util/processinfo_linux.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_quantexpd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_log2.o build/opt/mongo/db/pipeline/field_path.o build/opt/mongo/db/matcher/expression_internal_expr_eq.o build/opt/mongo/db/matcher/schema/expression_internal_schema_fmod.o build/opt/mongo/db/matcher/schema/expression_internal_schema_unique_items.o build/opt/mongo/db/matcher/schema/json_pointer.o build/opt/mongo/db/matcher/extensions_callback.o build/opt/mongo/db/matcher/expression_algo.o build/opt/mongo/db/matcher/expression_geo.o build/opt/mongo/db/matcher/expression_where_noop.o build/opt/mongo/db/matcher/expression_with_placeholder.o build/opt/mongo/db/matcher/schema/expression_internal_schema_num_properties.o build/opt/mongo/db/matcher/expression_tree.o build/opt/mongo/db/matcher/schema/expression_internal_schema_cond.o build/opt/mongo/db/matcher/expression_leaf.o build/opt/mongo/db/matcher/schema/expression_internal_schema_root_doc_eq.o build/opt/mongo/db/matcher/schema/expression_internal_schema_eq.o build/opt/mongo/db/matcher/match_details.o build/opt/mongo/db/matcher/expression_expr.o build/opt/mongo/rpc/message.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_lrintd.o build/opt/mongo/executor/task_executor.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_erf.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_acosh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_cosh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_acos.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_llrintd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_noncomp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_add.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_acos.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_cbrt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_log.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_fesetexceptflag.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_erf.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_fdimd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_logbd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/strtod128.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_log.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_sinh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_int64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_next.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_sinh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_cosh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_erfc.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_scalb.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_fmod.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_add.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_asinh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_tanh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_round_integral.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_scalbl.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_scalb.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_cbrt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_lrintd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_div.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_add.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_exp2.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_uint64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_erfc.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_lgamma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_atanh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_atan2.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_lrintd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_hypot.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_tgamma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_exp10.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_rem.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_expm1.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_round_integral.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_four_over_pi.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_log1p.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_int64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_uint64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_exp10.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_cos.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_nexttowardd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_mul.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_atan2.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_logbd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_fma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_uint8.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_log1p.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_pow.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_int.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_fdimd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_round_integral.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_asin.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_ops_64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_exp2.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_tgamma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_flag_operations.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_tgamma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_bid128.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_cbrt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_uint16.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_uint32.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_uint16.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_fmod.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_minmax.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_hypot.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_inv_trig.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/strtod64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_log10.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_frexp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_pow.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_logb.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/sqrt_tab_t.o build/opt/mongo/db/pipeline/value_comparator.o build/opt/mongo/util/net/ssl_parameters.o build/opt/mongo/util/net/ssl_parameters_gen.o build/opt/mongo/util/processinfo.o build/opt/mongo/base/system_error.o build/opt/mongo/rpc/metadata/client_metadata.o build/opt/mongo/rpc/metadata/client_metadata_ismaster.o build/opt/mongo/transport/service_executor_adaptive.o build/opt/mongo/transport/service_executor_gen.o build/opt/mongo/db/auth/auth_decorations.o build/opt/third_party/zstandard-1.3.7/zstd/lib/common/entropy_common.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_lazy.o build/opt/third_party/zstandard-1.3.7/zstd/lib/common/threading.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_fast.o build/opt/third_party/zstandard-1.3.7/zstd/lib/dictBuilder/divsufsort.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_opt.o build/opt/third_party/zstandard-1.3.7/zstd/lib/decompress/huf_decompress.o build/opt/third_party/zstandard-1.3.7/zstd/lib/deprecated/zbuff_compress.o build/opt/third_party/zstandard-1.3.7/zstd/lib/deprecated/zbuff_decompress.o build/opt/mongo/db/auth/authorization_manager.o build/opt/mongo/crypto/sha256_block.o build/opt/third_party/shim_mozjs.o build/opt/mongo/client/sasl_client_session.o build/opt/mongo/client/sasl_client_conversation.o build/opt/mongo/client/sasl_client_authenticate_impl.o build/opt/mongo/shell/shell_options_init.o build/opt/mongo/db/query/view_response_formatter.o build/opt/mongo/db/index/expression_params.o build/opt/mongo/db/index/s2_common.o build/opt/mongo/db/query/find_and_modify_request.o build/opt/mongo/rpc/factory.o build/opt/mongo/rpc/legacy_reply.o build/opt/mongo/rpc/legacy_request_builder.o build/opt/mongo/util/winutil.o build/opt/mongo/util/periodic_runner.o build/opt/third_party/boost-1.70.0/libs/filesystem/src/utf8_codecvt_facet.o build/opt/third_party/timelib-2018.01/parse_zoneinfo.o build/opt/third_party/timelib-2018.01/tm2unixtime.o build/opt/third_party/timelib-2018.01/unixtime2tm.o build/opt/third_party/timelib-2018.01/astro.o build/opt/third_party/timelib-2018.01/parse_tz.o build/opt/third_party/timelib-2018.01/interval.o build/opt/mongo/rpc/metadata/oplog_query_metadata.o build/opt/mongo/rpc/metadata/egress_metadata_hook_list.o build/opt/mongo/s/is_mongos.o build/opt/mongo/transport/service_entry_point_utils.o build/opt/mongo/db/time_proof_service.o build/opt/mongo/db/pipeline/document_source_list_sessions_gen.o build/opt/mongo/util/debugger.o build/opt/mongo/db/repl/rollback_gen.o build/opt/third_party/asio-master/asio/src/asio.o build/opt/third_party/zlib-1.2.11/inffast.o build/opt/third_party/zlib-1.2.11/inftrees.o build/opt/third_party/zlib-1.2.11/deflate.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_dutch.o build/opt/third_party/pcre-8.42/pcre_get.o build/opt/third_party/pcre-8.42/pcre_tables.o build/opt/third_party/pcre-8.42/pcre_byte_order.o build/opt/third_party/pcre-8.42/pcre_exec.o build/opt/third_party/pcre-8.42/pcre_study.o build/opt/third_party/pcre-8.42/pcre_xclass.o build/opt/third_party/pcre-8.42/pcre_chartables.o build/opt/mongo/executor/connection_pool_tl.o build/opt/third_party/s2/strings/split.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_russian.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_german.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_finnish.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_french.o build/opt/mongo/db/logical_clock_gen.o build/opt/mongo/crypto/aead_encryption.o build/opt/mongo/db/pipeline/document.o build/opt/mongo/crypto/symmetric_key.o build/opt/third_party/s2/strings/strutil.o build/opt/mongo/db/query/count_request.o build/opt/mongo/client/connection_string.o build/opt/mongo/db/query/killcursors_response.o build/opt/mongo/db/commands/test_commands_enabled_gen.o build/opt/mongo/db/audit.o build/opt/mongo/shell/mongodbcr.o build/opt/mongo/util/options_parser/options_parser_init.o build/opt/mongo/client/dbclient_cursor.o build/opt/mongo/db/storage/duplicate_key_error_info.o build/opt/mongo/db/commands/server_status_metric.o build/opt/mongo/db/repl/storage_interface.o build/opt/mongo/db/geo/shapes.o build/opt/mongo/db/geo/big_polygon.o build/opt/mongo/util/concurrency/spin_lock.o build/opt/mongo/transport/session.o build/opt/mongo/db/matcher/path_internal.o build/opt/mongo/executor/egress_tag_closer_manager.o build/opt/mongo/db/pipeline/document_source_change_stream_gen.o build/opt/mongo/db/pipeline/document_source_replace_root_gen.o build/opt/mongo/crypto/symmetric_crypto.o "
  },
  {
    "path": "cmake/mongodb/macosx-debug.objects",
    "content": "build/debug/third_party/boost-1.70.0/libs/system/src/error_code.o build/debug/third_party/zlib-1.2.11/inffast.o build/debug/third_party/zlib-1.2.11/deflate.o build/debug/third_party/zlib-1.2.11/crc32.o build/debug/mongo/client/sasl_client_authenticate_impl.o build/debug/mongo/util/signal_handlers.o build/debug/mongo/client/sasl_client_authenticate.o build/debug/mongo/util/clock_source.o build/debug/mongo/db/query/hint_parser.o build/debug/mongo/util/fast_clock_source_factory.o build/debug/mongo/util/background_thread_clock_source.o build/debug/mongo/util/signal_win32.o build/debug/mongo/client/sasl_client_session.o build/debug/mongo/client/sasl_scram_client_conversation.o build/debug/mongo/db/dbmessage.o build/debug/mongo/client/sasl_plain_client_conversation.o build/debug/mongo/client/native_sasl_client_session.o build/debug/mongo/db/query/hint_gen.o build/debug/mongo/client/sasl_client_conversation.o build/debug/third_party/zlib-1.2.11/inftrees.o build/debug/third_party/zlib-1.2.11/infback.o build/debug/third_party/zlib-1.2.11/adler32.o build/debug/third_party/zlib-1.2.11/compress.o build/debug/third_party/zlib-1.2.11/trees.o build/debug/third_party/zlib-1.2.11/zutil.o build/debug/third_party/zlib-1.2.11/uncompr.o build/debug/third_party/zlib-1.2.11/inflate.o build/debug/mongo/client/mongo_uri.o build/debug/mongo/client/connection_string.o build/debug/mongo/util/icu.o build/debug/mongo/db/hasher.o build/debug/mongo/util/cmdline_utils/censor_cmdline.o build/debug/mongo/idl/idl_parser.o build/debug/mongo/rpc/protocol.o build/debug/mongo/rpc/op_msg.o build/debug/mongo/rpc/message.o build/debug/mongo/util/md5.o build/debug/mongo/util/password_digest.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_russian.o build/debug/third_party/libstemmer_c/runtime/api.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_finnish.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_porter.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_french.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_english.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_portuguese.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_swedish.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_hungarian.o build/debug/third_party/libstemmer_c/libstemmer/libstemmer_utf8.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_danish.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_turkish.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_german.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_romanian.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_dutch.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_italian.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_spanish.o build/debug/third_party/libstemmer_c/src_c/stem_UTF_8_norwegian.o build/debug/mongo/util/quick_exit.o build/debug/mongo/crypto/sha1_block.o build/debug/mongo/db/bson/dotted_path_support.o build/debug/mongo/db/repl/repl_settings_gen.o build/debug/mongo/db/auth/authorization_session.o build/debug/mongo/db/auth/role_name.o build/debug/mongo/db/auth/user_name.o build/debug/mongo/db/auth/auth_decorations.o build/debug/mongo/db/repl/repl_settings.o build/debug/mongo/db/auth/authorization_manager.o build/debug/mongo/db/query/collation/collator_factory_interface.o build/debug/mongo/client/replica_set_monitor_manager.o build/debug/mongo/client/replica_set_change_notifier.o build/debug/mongo/client/connpool.o build/debug/mongo/client/dbclient_rs.o build/debug/mongo/client/connection_string_connect.o build/debug/mongo/client/global_conn_pool_gen.o build/debug/mongo/client/replica_set_monitor.o build/debug/mongo/client/global_conn_pool.o build/debug/mongo/client/mongo_uri_connect.o build/debug/mongo/client/dbclient_connection.o build/debug/mongo/executor/connection_pool_tl.o build/debug/mongo/executor/network_interface_tl.o build/debug/mongo/db/index_names.o build/debug/mongo/scripting/jsexception.o build/debug/mongo/scripting/engine.o build/debug/mongo/scripting/dbdirectclient_factory.o build/debug/mongo/scripting/deadline_monitor_gen.o build/debug/mongo/scripting/utils.o build/debug/mongo/scripting/deadline_monitor.o build/debug/mongo/db/catalog/index_key_validate.o build/debug/mongo/db/pipeline/variables.o build/debug/mongo/rpc/object_check.o build/debug/mongo/db/pipeline/expression_context.o build/debug/mongo/rpc/legacy_reply_builder.o build/debug/mongo/rpc/object_check_gen.o build/debug/mongo/rpc/reply_builder_interface.o build/debug/mongo/rpc/legacy_reply.o build/debug/mongo/rpc/factory.o build/debug/mongo/rpc/legacy_request.o build/debug/mongo/rpc/legacy_request_builder.o build/debug/mongo/transport/transport_layer_asio.o build/debug/mongo/s/is_mongos.o build/debug/mongo/db/query/query_knobs_gen.o build/debug/third_party/asio-master/asio/src/asio.o build/debug/mongo/db/signed_logical_time.o build/debug/mongo/db/repl/optime.o build/debug/mongo/db/repl/bson_extract_optime.o build/debug/mongo/db/matcher/path.o build/debug/mongo/db/matcher/path_internal.o build/debug/third_party/snappy-1.1.7/snappy-sinksource.o build/debug/third_party/snappy-1.1.7/snappy-c.o build/debug/third_party/snappy-1.1.7/snappy.o build/debug/mongo/db/keys_collection_client_sharded.o build/debug/mongo/executor/task_executor.o build/debug/mongo/db/catalog/collection_catalog.o build/debug/mongo/bson/mutable/element.o build/debug/mongo/bson/mutable/document.o build/debug/mongo/db/commands/server_status.o build/debug/mongo/db/query/explain_options.o build/debug/mongo/db/fts/fts_util.o build/debug/mongo/db/fts/fts_spec.o build/debug/mongo/db/fts/stop_words.o build/debug/mongo/db/fts/fts_spec_legacy.o build/debug/mongo/db/fts/fts_unicode_phrase_matcher.o build/debug/mongo/db/fts/fts_element_iterator.o build/debug/mongo/db/fts/fts_unicode_tokenizer.o build/debug/mongo/db/fts/fts_matcher.o build/debug/mongo/db/fts/fts_query_parser.o build/debug/mongo/db/fts/stop_words_list.o build/debug/mongo/db/fts/fts_index_format.o build/debug/mongo/db/fts/stemmer.o build/debug/mongo/db/fts/fts_query_impl.o build/debug/mongo/db/fts/fts_language.o build/debug/mongo/db/fts/tokenizer.o build/debug/mongo/db/fts/fts_basic_tokenizer.o build/debug/mongo/db/fts/fts_basic_phrase_matcher.o build/debug/mongo/db/query/datetime/date_time_support.o build/debug/third_party/shim_zstd.o build/debug/third_party/shim_pcrecpp.o build/debug/third_party/icu4c-57.1/source/common/uresdata.o build/debug/mongo/db/logical_session_id_helpers.o build/debug/third_party/icu4c-57.1/source/common/uniset.o build/debug/third_party/icu4c-57.1/source/common/unistr_cnv.o build/debug/third_party/icu4c-57.1/source/common/ubidi.o build/debug/third_party/icu4c-57.1/source/common/rbbitblb.o build/debug/third_party/icu4c-57.1/source/common/ucnv_cb.o build/debug/third_party/icu4c-57.1/source/common/ucasemap.o build/debug/third_party/icu4c-57.1/source/common/uresbund.o build/debug/third_party/icu4c-57.1/source/common/messagepattern.o build/debug/third_party/icu4c-57.1/source/common/dictbe.o build/debug/third_party/icu4c-57.1/source/common/uvectr64.o build/debug/third_party/icu4c-57.1/source/common/cwchar.o build/debug/third_party/icu4c-57.1/source/common/ushape.o build/debug/third_party/icu4c-57.1/source/common/errorcode.o build/debug/third_party/icu4c-57.1/source/common/patternprops.o build/debug/third_party/icu4c-57.1/source/common/ucmndata.o build/debug/third_party/icu4c-57.1/source/common/ucnv_set.o build/debug/third_party/icu4c-57.1/source/common/servslkf.o build/debug/third_party/icu4c-57.1/source/common/ucln_cmn.o build/debug/third_party/icu4c-57.1/source/common/cstring.o build/debug/third_party/icu4c-57.1/source/common/filteredbrk.o build/debug/third_party/icu4c-57.1/source/common/uidna.o build/debug/third_party/icu4c-57.1/source/common/rbbirb.o build/debug/third_party/icu4c-57.1/source/common/ucasemap_titlecase_brkiter.o build/debug/third_party/icu4c-57.1/source/common/listformatter.o build/debug/third_party/icu4c-57.1/source/common/unormcmp.o build/debug/third_party/icu4c-57.1/source/common/unames.o build/debug/third_party/icu4c-57.1/source/common/uset.o build/debug/third_party/icu4c-57.1/source/common/brkiter.o build/debug/third_party/icu4c-57.1/source/common/ustr_wcs.o build/debug/third_party/icu4c-57.1/source/common/ucnvisci.o build/debug/third_party/icu4c-57.1/source/common/locresdata.o build/debug/third_party/icu4c-57.1/source/common/bytestrie.o build/debug/third_party/icu4c-57.1/source/common/ucharstriebuilder.o build/debug/third_party/icu4c-57.1/source/common/wintz.o build/debug/third_party/icu4c-57.1/source/common/unistr_case.o build/debug/third_party/icu4c-57.1/source/common/ucnv_cnv.o build/debug/third_party/icu4c-57.1/source/common/rbbinode.o build/debug/third_party/icu4c-57.1/source/common/ucnv_u16.o build/debug/third_party/icu4c-57.1/source/common/ucat.o build/debug/third_party/icu4c-57.1/source/common/putil.o build/debug/third_party/icu4c-57.1/source/common/utrace.o build/debug/third_party/icu4c-57.1/source/common/uiter.o build/debug/third_party/icu4c-57.1/source/common/caniter.o build/debug/third_party/icu4c-57.1/source/common/utrie2_builder.o build/debug/third_party/icu4c-57.1/source/common/stringpiece.o build/debug/third_party/icu4c-57.1/source/common/servls.o build/debug/third_party/icu4c-57.1/source/common/normlzr.o build/debug/third_party/icu4c-57.1/source/common/ustr_cnv.o build/debug/third_party/icu4c-57.1/source/common/ucnvhz.o build/debug/third_party/icu4c-57.1/source/common/usc_impl.o build/debug/third_party/icu4c-57.1/source/common/umapfile.o build/debug/third_party/icu4c-57.1/source/common/unistr_case_locale.o build/debug/third_party/icu4c-57.1/source/common/ucol_swp.o build/debug/third_party/icu4c-57.1/source/common/dictionarydata.o build/debug/third_party/icu4c-57.1/source/common/ucnv_bld.o build/debug/third_party/icu4c-57.1/source/common/loadednormalizer2impl.o build/debug/third_party/icu4c-57.1/source/common/ucnv_err.o build/debug/third_party/icu4c-57.1/source/common/locdspnm.o build/debug/third_party/icu4c-57.1/source/common/locdispnames.o build/debug/third_party/icu4c-57.1/source/common/uloc_tag.o build/debug/third_party/icu4c-57.1/source/common/uchriter.o build/debug/third_party/icu4c-57.1/source/common/stringtriebuilder.o build/debug/third_party/icu4c-57.1/source/common/uscript_props.o build/debug/third_party/icu4c-57.1/source/common/parsepos.o build/debug/third_party/icu4c-57.1/source/common/dtintrv.o build/debug/third_party/icu4c-57.1/source/common/uchar.o build/debug/third_party/icu4c-57.1/source/common/rbbidata.o build/debug/third_party/icu4c-57.1/source/common/bytestriebuilder.o build/debug/third_party/icu4c-57.1/source/common/ucnv_ct.o build/debug/third_party/icu4c-57.1/source/common/ubidiwrt.o build/debug/third_party/icu4c-57.1/source/common/uloc.o build/debug/third_party/icu4c-57.1/source/common/bytestrieiterator.o build/debug/third_party/icu4c-57.1/source/common/ucnv_ext.o build/debug/third_party/icu4c-57.1/source/common/ucnv_lmb.o build/debug/third_party/icu4c-57.1/source/common/ustrfmt.o build/debug/third_party/icu4c-57.1/source/common/utf_impl.o build/debug/third_party/icu4c-57.1/source/common/cmemory.o build/debug/third_party/icu4c-57.1/source/common/uniset_props.o build/debug/third_party/icu4c-57.1/source/common/appendable.o build/debug/third_party/icu4c-57.1/source/common/ustrenum.o build/debug/third_party/icu4c-57.1/source/common/unifilt.o build/debug/third_party/icu4c-57.1/source/common/umath.o build/debug/third_party/icu4c-57.1/source/common/loclikely.o build/debug/third_party/icu4c-57.1/source/common/cstr.o build/debug/third_party/icu4c-57.1/source/common/udataswp.o build/debug/third_party/icu4c-57.1/source/common/normalizer2impl.o build/debug/third_party/icu4c-57.1/source/common/bytestream.o build/debug/third_party/icu4c-57.1/source/common/ucnv_io.o build/debug/third_party/icu4c-57.1/source/common/ubidi_props.o build/debug/third_party/icu4c-57.1/source/common/util.o build/debug/third_party/icu4c-57.1/source/common/locmap.o build/debug/third_party/icu4c-57.1/source/common/simpleformatter.o build/debug/third_party/icu4c-57.1/source/common/charstr.o build/debug/third_party/icu4c-57.1/source/common/locavailable.o build/debug/third_party/icu4c-57.1/source/common/utrie.o build/debug/third_party/icu4c-57.1/source/common/ucnvsel.o build/debug/third_party/icu4c-57.1/source/common/utypes.o build/debug/third_party/icu4c-57.1/source/common/ubrk.o build/debug/third_party/icu4c-57.1/source/common/uarrsort.o build/debug/third_party/icu4c-57.1/source/common/rbbistbl.o build/debug/third_party/icu4c-57.1/source/common/ucase.o build/debug/third_party/icu4c-57.1/source/common/serv.o build/debug/third_party/icu4c-57.1/source/common/usprep.o build/debug/third_party/icu4c-57.1/source/common/chariter.o build/debug/third_party/icu4c-57.1/source/common/unifunct.o build/debug/third_party/icu4c-57.1/source/common/ustrcase.o build/debug/third_party/icu4c-57.1/source/common/uprops.o build/debug/third_party/icu4c-57.1/source/common/uset_props.o build/debug/third_party/icu4c-57.1/source/common/usetiter.o build/debug/third_party/icu4c-57.1/source/common/schriter.o build/debug/third_party/icu4c-57.1/source/common/brkeng.o build/debug/third_party/icu4c-57.1/source/common/ruleiter.o build/debug/third_party/icu4c-57.1/source/common/udatamem.o build/debug/third_party/icu4c-57.1/source/common/umutex.o build/debug/third_party/icu4c-57.1/source/common/unisetspan.o build/debug/third_party/icu4c-57.1/source/common/icuplug.o build/debug/third_party/icu4c-57.1/source/common/ucnv2022.o build/debug/third_party/icu4c-57.1/source/common/locutil.o build/debug/third_party/icu4c-57.1/source/common/ustrtrns.o build/debug/third_party/icu4c-57.1/source/common/rbbi.o build/debug/third_party/icu4c-57.1/source/common/servlk.o build/debug/third_party/icu4c-57.1/source/common/ulist.o build/debug/third_party/icu4c-57.1/source/common/uhash_us.o build/debug/third_party/icu4c-57.1/source/common/propname.o build/debug/third_party/icu4c-57.1/source/common/servnotf.o build/debug/third_party/icu4c-57.1/source/common/ucnvmbcs.o build/debug/third_party/icu4c-57.1/source/common/uvector.o build/debug/third_party/icu4c-57.1/source/common/servlkf.o build/debug/third_party/icu4c-57.1/source/common/icudataver.o build/debug/third_party/icu4c-57.1/source/common/unistr_props.o build/debug/third_party/icu4c-57.1/source/common/uloc_keytype.o build/debug/third_party/icu4c-57.1/source/common/ucnv_u7.o build/debug/third_party/icu4c-57.1/source/common/ucnvbocu.o build/debug/third_party/icu4c-57.1/source/common/uinvchar.o build/debug/third_party/icu4c-57.1/source/common/ustring.o build/debug/third_party/icu4c-57.1/source/common/ustrcase_locale.o build/debug/third_party/icu4c-57.1/source/common/ustack.o build/debug/third_party/icu4c-57.1/source/common/ucnvscsu.o build/debug/third_party/icu4c-57.1/source/common/pluralmap.o build/debug/third_party/icu4c-57.1/source/common/uts46.o build/debug/third_party/icu4c-57.1/source/common/ucnv.o build/debug/third_party/icu4c-57.1/source/common/ubidiln.o build/debug/third_party/icu4c-57.1/source/common/filterednormalizer2.o build/debug/third_party/icu4c-57.1/source/common/bmpset.o build/debug/third_party/icu4c-57.1/source/common/ulistformatter.o build/debug/third_party/icu4c-57.1/source/common/ucnvlat1.o build/debug/third_party/icu4c-57.1/source/common/rbbiscan.o build/debug/third_party/icu4c-57.1/source/common/punycode.o build/debug/third_party/icu4c-57.1/source/common/propsvec.o build/debug/third_party/icu4c-57.1/source/common/utext.o build/debug/third_party/icu4c-57.1/source/common/udata.o build/debug/third_party/icu4c-57.1/source/common/ucurr.o build/debug/third_party/icu4c-57.1/source/common/unistr_titlecase_brkiter.o build/debug/third_party/icu4c-57.1/source/common/ucnvdisp.o build/debug/third_party/icu4c-57.1/source/common/unistr.o build/debug/third_party/icu4c-57.1/source/common/locid.o build/debug/third_party/icu4c-57.1/source/common/resbund.o build/debug/third_party/icu4c-57.1/source/common/uinit.o build/debug/third_party/icu4c-57.1/source/common/utrie2.o build/debug/third_party/icu4c-57.1/source/common/uniset_closure.o build/debug/third_party/icu4c-57.1/source/common/ustr_titlecase_brkiter.o build/debug/third_party/icu4c-57.1/source/common/uenum.o build/debug/third_party/icu4c-57.1/source/common/rbbisetb.o build/debug/third_party/icu4c-57.1/source/common/util_props.o build/debug/third_party/icu4c-57.1/source/common/resbund_cnv.o build/debug/third_party/icu4c-57.1/source/common/sharedobject.o build/debug/third_party/icu4c-57.1/source/common/ucnv_u32.o build/debug/third_party/icu4c-57.1/source/common/uvectr32.o build/debug/third_party/icu4c-57.1/source/common/normalizer2.o build/debug/third_party/icu4c-57.1/source/common/ucharstrie.o build/debug/third_party/icu4c-57.1/source/common/unifiedcache.o build/debug/third_party/icu4c-57.1/source/common/locbased.o build/debug/third_party/icu4c-57.1/source/common/resource.o build/debug/third_party/icu4c-57.1/source/common/ures_cnv.o build/debug/third_party/icu4c-57.1/source/common/ucharstrieiterator.o build/debug/third_party/icu4c-57.1/source/common/unorm.o build/debug/third_party/icu4c-57.1/source/common/uscript.o build/debug/third_party/icu4c-57.1/source/common/uobject.o build/debug/third_party/icu4c-57.1/source/common/ucnv_u8.o build/debug/third_party/icu4c-57.1/source/common/servrbf.o build/debug/third_party/icu4c-57.1/source/common/uhash.o build/debug/mongo/db/concurrency/flow_control_ticketholder.o build/debug/third_party/s2/strings/split.o build/debug/third_party/s2/strings/stringprintf.o build/debug/third_party/s2/strings/strutil.o build/debug/third_party/boost-1.70.0/libs/filesystem/src/codecvt_error_category.o build/debug/third_party/boost-1.70.0/libs/filesystem/src/operations.o build/debug/third_party/boost-1.70.0/libs/filesystem/src/path.o build/debug/third_party/boost-1.70.0/libs/filesystem/src/utf8_codecvt_facet.o build/debug/third_party/boost-1.70.0/libs/filesystem/src/path_traits.o build/debug/third_party/boost-1.70.0/libs/filesystem/src/portability.o build/debug/third_party/boost-1.70.0/libs/filesystem/src/windows_file_codecvt.o build/debug/third_party/boost-1.70.0/libs/filesystem/src/unique_path.o build/debug/mongo/util/version_impl.o build/debug/mongo/crypto/sha256_block.o build/debug/mongo/db/pipeline/document_path_support.o build/debug/mongo/db/pipeline/value.o build/debug/mongo/db/pipeline/document_comparator.o build/debug/mongo/db/pipeline/value_comparator.o build/debug/mongo/db/pipeline/document.o build/debug/mongo/shell/shell_options_gen.o build/debug/third_party/abseil-cpp-master/abseil-cpp/absl/hash/internal/hash.o build/debug/third_party/abseil-cpp-master/abseil-cpp/absl/hash/internal/city.o build/debug/mongo/db/storage/write_unit_of_work.o build/debug/mongo/client/index_spec.o build/debug/mongo/client/dbclient_cursor.o build/debug/mongo/client/dbclient_base.o build/debug/mongo/db/pipeline/runtime_constants_gen.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_tanh.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src15.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src5.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src26.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src17.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src30.o build/debug/third_party/mozjs-60/extract/js/src/perf/pm_stub.o build/debug/third_party/mozjs-60/extract/mfbt/Compression.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src40.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_asin.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src25.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src1.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_rint.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src32.o build/debug/third_party/mozjs-60/extract/mozglue/misc/ConditionVariable_posix.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src28.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src16.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src45.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_expm1.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_exp.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src35.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src37.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_asinh.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_scalbn.o build/debug/third_party/mozjs-60/extract/mozglue/misc/TimeStamp.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_truncf.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_log1p.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/k_exp.o build/debug/third_party/mozjs-60/extract/js/src/vm/JSAtom.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src29.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src38.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_trunc.o build/debug/third_party/mozjs-60/extract/mfbt/double-conversion/double-conversion/strtod.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src41.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src43.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_copysign.o build/debug/third_party/mozjs-60/extract/js/src/util/DoubleToString.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src24.o build/debug/third_party/mozjs-60/extract/mfbt/lz4.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src10.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src6.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src0.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_fabs.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src20.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_atan.o build/debug/third_party/mozjs-60/extract/mozglue/misc/StackWalk.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src9.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src31.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src12.o build/debug/third_party/mozjs-60/extract/js/src/jsarray.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_ceil.o build/debug/third_party/mozjs-60/extract/mozglue/misc/Mutex_posix.o build/debug/third_party/mozjs-60/extract/js/src/vm/Interpreter.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src34.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src39.o build/debug/third_party/mozjs-60/extract/js/src/builtin/RegExp.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src3.o build/debug/third_party/mozjs-60/extract/js/src/jsmath.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_cosh.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_log2.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_log10.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src13.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_log.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_hypot.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_atanh.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_pow.o build/debug/third_party/mozjs-60/extract/js/src/gc/StoreBuffer.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src22.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_acos.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_ceilf.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src4.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src8.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src42.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src7.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src23.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src36.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src11.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_acosh.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_nearbyint.o build/debug/third_party/mozjs-60/mongo_sources/mongoErrorReportToString.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_cbrt.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_sqrt.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src27.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src33.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_floor.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src44.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src21.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_rintf.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/s_floorf.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src18.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src19.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src2.o build/debug/third_party/mozjs-60/extract/js/src/jit/x86-shared/Disassembler-x86-shared.o build/debug/third_party/mozjs-60/extract/js/src/mfbt/Unified_cpp_mfbt0.o build/debug/third_party/mozjs-60/mongo_sources/freeOpToJSContext.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_sinh.o build/debug/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src14.o build/debug/third_party/mozjs-60/extract/js/src/frontend/Parser.o build/debug/third_party/mozjs-60/extract/modules/fdlibm/e_atan2.o build/debug/third_party/mozjs-60/extract/mozglue/misc/Printf.o build/debug/third_party/mozjs-60/extract/mozglue/misc/TimeStamp_posix.o build/debug/mongo/db/repl/read_concern_args.o build/debug/mongo/util/fail_point_service.o build/debug/mongo/util/fail_point_registry.o build/debug/mongo/util/fail_point_server_parameter_gen.o build/debug/mongo/util/fail_point.o build/debug/third_party/boost-1.70.0/libs/iostreams/src/file_descriptor.o build/debug/third_party/boost-1.70.0/libs/iostreams/src/mapped_file.o build/debug/mongo/util/background.o build/debug/mongo/bson/util/bson_extract.o build/debug/mongo/db/commands/test_commands_enabled.o build/debug/mongo/db/commands/test_commands_enabled_gen.o build/debug/mongo/util/net/ssl_options_client.o build/debug/mongo/util/net/ssl_options_client_gen.o build/debug/mongo/db/server_options_base_gen.o build/debug/mongo/db/server_options_base.o build/debug/mongo/db/keyfile_option_gen.o build/debug/mongo/db/server_options_general_gen.o build/debug/mongo/db/cluster_auth_mode_option_gen.o build/debug/mongo/db/server_options_nongeneral_gen.o build/debug/third_party/shim_stemmer.o build/debug/mongo/executor/connection_pool.o build/debug/mongo/db/operation_context.o build/debug/mongo/db/repl_set_member_in_standalone_mode.o build/debug/mongo/db/unclean_shutdown.o build/debug/mongo/db/server_recovery.o build/debug/mongo/db/service_context.o build/debug/mongo/db/default_baton.o build/debug/mongo/db/client.o build/debug/mongo/db/operation_context_group.o build/debug/mongo/db/baton.o build/debug/mongo/util/winutil.o build/debug/mongo/db/server_options.o build/debug/mongo/shell/kms_shell.o build/debug/mongo/executor/network_interface_thread_pool.o build/debug/mongo/db/index/expression_params.o build/debug/mongo/db/index/s2_common.o build/debug/mongo/s/request_types/split_chunk_request_type.o build/debug/mongo/s/request_types/clone_catalog_data_gen.o build/debug/mongo/s/chunk_version_gen.o build/debug/mongo/s/request_types/migration_secondary_throttle_options.o build/debug/mongo/s/shard_id.o build/debug/mongo/s/catalog/type_lockpings.o build/debug/mongo/s/cannot_implicitly_create_collection_info.o build/debug/mongo/s/request_types/merge_chunk_request_type.o build/debug/mongo/s/catalog/type_shard.o build/debug/mongo/s/request_types/shard_collection_gen.o build/debug/mongo/s/request_types/flush_routing_table_cache_updates_gen.o build/debug/mongo/s/stale_exception.o build/debug/mongo/s/catalog/type_locks.o build/debug/mongo/s/request_types/wait_for_fail_point_gen.o build/debug/mongo/s/database_version_gen.o build/debug/mongo/s/catalog/type_changelog.o build/debug/mongo/s/catalog/type_tags.o build/debug/mongo/s/request_types/flush_database_cache_updates_gen.o build/debug/mongo/s/request_types/create_database_gen.o build/debug/mongo/s/request_types/add_shard_to_zone_request_type.o build/debug/mongo/s/catalog/type_mongos.o build/debug/mongo/s/catalog/type_database.o build/debug/mongo/s/request_types/move_chunk_request.o build/debug/mongo/s/catalog/type_shard_collection.o build/debug/mongo/s/request_types/create_collection_gen.o build/debug/mongo/s/catalog/type_collection.o build/debug/mongo/s/catalog/type_chunk.o build/debug/mongo/s/request_types/update_zone_key_range_request_type.o build/debug/mongo/s/request_types/add_shard_request_type.o build/debug/mongo/s/request_types/commit_chunk_migration_request_type.o build/debug/mongo/s/request_types/move_primary_gen.o build/debug/mongo/s/catalog/type_config_version.o build/debug/mongo/s/request_types/remove_shard_from_zone_request_type.o build/debug/mongo/s/request_types/balance_chunk_request_type.o build/debug/mongo/s/catalog/type_chunk_base_gen.o build/debug/mongo/s/chunk_version.o build/debug/mongo/s/would_change_owning_shard_exception.o build/debug/mongo/s/request_types/clear_jumbo_flag_gen.o build/debug/mongo/s/catalog/mongo_version_range.o build/debug/mongo/s/database_version_helpers.o build/debug/mongo/s/catalog/type_shard_database.o build/debug/mongo/s/request_types/set_shard_version_request.o build/debug/mongo/s/request_types/get_database_version_gen.o build/debug/mongo/s/request_types/clone_collection_options_from_primary_shard_gen.o build/debug/mongo/crypto/symmetric_key.o build/debug/mongo/crypto/symmetric_crypto.o build/debug/mongo/transport/message_compressor_options_client_gen.o build/debug/mongo/crypto/symmetric_crypto_apple.o build/debug/mongo/db/server_options_server_helpers.o build/debug/mongo/base/data_type.o build/debug/mongo/bson/bsonobjbuilder.o build/debug/mongo/bson/simple_bsonobj_comparator.o build/debug/mongo/platform/decimal128.o build/debug/mongo/util/uuid.o build/debug/mongo/util/assert_util.o build/debug/mongo/base/init.o build/debug/mongo/base/validate_locale.o build/debug/mongo/logger/log_severity.o build/debug/mongo/bson/bson_comparator_interface_base.o build/debug/mongo/util/str.o build/debug/mongo/bson/bsonmisc.o build/debug/mongo/util/exception_filter_win32.o build/debug/mongo/base/global_initializer_registerer.o build/debug/mongo/base/error_codes.o build/debug/mongo/bson/bson_validate.o build/debug/mongo/logger/log_component_settings.o build/debug/mongo/logger/logger.o build/debug/mongo/util/hex.o build/debug/mongo/base/string_data.o build/debug/mongo/base/status.o build/debug/mongo/platform/strcasestr.o build/debug/mongo/bson/bsonobj.o build/debug/mongo/util/stacktrace_posix.o build/debug/mongo/util/allocator.o build/debug/mongo/platform/shared_library.o build/debug/mongo/base/make_string_vector.o build/debug/mongo/util/log.o build/debug/mongo/logger/console.o build/debug/mongo/base/shim.o build/debug/mongo/util/boost_assert_impl.o build/debug/mongo/bson/json.o build/debug/mongo/util/itoa.o build/debug/mongo/util/stacktrace.o build/debug/mongo/logger/message_log_domain.o build/debug/mongo/util/duration.o build/debug/mongo/base/simple_string_data_comparator.o build/debug/mongo/platform/stack_locator.o build/debug/mongo/bson/simple_bsonelement_comparator.o build/debug/mongo/logger/rotatable_file_writer.o build/debug/mongo/logger/redaction.o build/debug/mongo/util/file.o build/debug/mongo/logger/ramlog.o build/debug/mongo/bson/bsontypes.o build/debug/mongo/base/data_type_string_data.o build/debug/mongo/util/time_support.o build/debug/mongo/util/system_tick_source.o build/debug/mongo/base/data_range_cursor.o build/debug/mongo/platform/stack_locator_macOS.o build/debug/mongo/util/errno_util.o build/debug/mongo/platform/posix_fadvise.o build/debug/mongo/logger/logstream_builder.o build/debug/mongo/base/initializer_dependency_graph.o build/debug/mongo/base/transaction_error.o build/debug/mongo/platform/random.o build/debug/mongo/base/data_range.o build/debug/mongo/util/startup_test.o build/debug/mongo/logger/log_manager.o build/debug/mongo/platform/strnlen.o build/debug/mongo/util/timer.o build/debug/mongo/bson/bsonelement.o build/debug/mongo/base/global_initializer.o build/debug/mongo/bson/timestamp.o build/debug/mongo/platform/shared_library_posix.o build/debug/mongo/util/text.o build/debug/mongo/util/version.o build/debug/mongo/util/signal_handlers_synchronous.o build/debug/mongo/logger/message_event_utf8_encoder.o build/debug/mongo/base/data_type_terminated.o build/debug/mongo/base/error_extra_info.o build/debug/mongo/util/exit.o build/debug/mongo/util/shell_exec.o build/debug/mongo/base/parse_number.o build/debug/mongo/util/concurrency/idle_thread_block.o build/debug/mongo/util/base64.o build/debug/mongo/logger/component_message_log_domain.o build/debug/mongo/platform/process_id.o build/debug/mongo/logger/rotatable_file_manager.o build/debug/mongo/bson/oid.o build/debug/mongo/util/concurrency/thread_name.o build/debug/mongo/logger/log_component.o build/debug/mongo/util/platform_init.o build/debug/mongo/bson/bson_depth.o build/debug/mongo/util/system_clock_source.o build/debug/mongo/base/initializer.o build/debug/mongo/platform/mutex.o build/debug/mongo/db/pipeline/expression_trigonometric.o build/debug/mongo/db/pipeline/expression.o build/debug/mongo/db/traffic_reader.o build/debug/mongo/shell/shell_options_init.o build/debug/mongo/executor/connection_pool_stats.o build/debug/mongo/rpc/metadata/impersonated_user_metadata.o build/debug/mongo/db/storage/storage_parameters_gen.o build/debug/mongo/rpc/metadata/impersonated_user_metadata_gen.o build/debug/mongo/db/storage/storage_options.o build/debug/mongo/util/dns_query.o build/debug/mongo/db/catalog/index_catalog.o build/debug/third_party/boost-1.70.0/libs/program_options/src/split.o build/debug/third_party/boost-1.70.0/libs/program_options/src/cmdline.o build/debug/third_party/boost-1.70.0/libs/program_options/src/positional_options.o build/debug/third_party/boost-1.70.0/libs/program_options/src/value_semantic.o build/debug/third_party/boost-1.70.0/libs/program_options/src/parsers.o build/debug/third_party/boost-1.70.0/libs/program_options/src/winmain.o build/debug/third_party/boost-1.70.0/libs/program_options/src/config_file.o build/debug/third_party/boost-1.70.0/libs/program_options/src/utf8_codecvt_facet.o build/debug/third_party/boost-1.70.0/libs/program_options/src/variables_map.o build/debug/third_party/boost-1.70.0/libs/program_options/src/options_description.o build/debug/third_party/boost-1.70.0/libs/program_options/src/convert.o build/debug/mongo/shell/shell_options_storage.o build/debug/third_party/shim_icu.o build/debug/mongo/db/geo/geoparser.o build/debug/mongo/db/geo/geometry_container.o build/debug/mongo/db/index/index_descriptor.o build/debug/mongo/util/options_parser/startup_option_init.o build/debug/mongo/util/options_parser/option_section.o build/debug/mongo/util/options_parser/constraints.o build/debug/mongo/util/options_parser/environment.o build/debug/mongo/util/options_parser/startup_options.o build/debug/mongo/util/options_parser/value.o build/debug/mongo/util/options_parser/option_description.o build/debug/mongo/util/options_parser/options_parser.o build/debug/third_party/yaml-cpp-0.6.2/src/nodeevents.o build/debug/third_party/yaml-cpp-0.6.2/src/exceptions.o build/debug/third_party/yaml-cpp-0.6.2/src/scanscalar.o build/debug/third_party/yaml-cpp-0.6.2/src/node.o build/debug/third_party/yaml-cpp-0.6.2/src/scantag.o build/debug/third_party/yaml-cpp-0.6.2/src/scantoken.o build/debug/third_party/yaml-cpp-0.6.2/src/emitfromevents.o build/debug/third_party/yaml-cpp-0.6.2/src/emitterstate.o build/debug/third_party/yaml-cpp-0.6.2/src/exp.o build/debug/third_party/yaml-cpp-0.6.2/src/emit.o build/debug/third_party/yaml-cpp-0.6.2/src/simplekey.o build/debug/third_party/yaml-cpp-0.6.2/src/regex_yaml.o build/debug/third_party/yaml-cpp-0.6.2/src/binary.o build/debug/third_party/yaml-cpp-0.6.2/src/emitter.o build/debug/third_party/yaml-cpp-0.6.2/src/contrib/graphbuilderadapter.o build/debug/third_party/yaml-cpp-0.6.2/src/stream.o build/debug/third_party/yaml-cpp-0.6.2/src/node_data.o build/debug/third_party/yaml-cpp-0.6.2/src/parser.o build/debug/third_party/yaml-cpp-0.6.2/src/scanner.o build/debug/third_party/yaml-cpp-0.6.2/src/nodebuilder.o build/debug/third_party/yaml-cpp-0.6.2/src/parse.o build/debug/third_party/yaml-cpp-0.6.2/src/memory.o build/debug/third_party/yaml-cpp-0.6.2/src/null.o build/debug/third_party/yaml-cpp-0.6.2/src/ostream_wrapper.o build/debug/third_party/yaml-cpp-0.6.2/src/singledocparser.o build/debug/third_party/yaml-cpp-0.6.2/src/tag.o build/debug/third_party/yaml-cpp-0.6.2/src/contrib/graphbuilder.o build/debug/third_party/yaml-cpp-0.6.2/src/directives.o build/debug/third_party/yaml-cpp-0.6.2/src/convert.o build/debug/third_party/yaml-cpp-0.6.2/src/emitterutils.o build/debug/mongo/db/log_process_details.o build/debug/mongo/db/repl/replication_consistency_markers.o build/debug/mongo/executor/remote_command_request.o build/debug/mongo/executor/remote_command_response.o build/debug/mongo/db/repl/replication_process.o build/debug/mongo/db/auth/restriction_environment.o build/debug/third_party/wiredtiger/src/checksum/x86/crc32-x86-alt.o build/debug/third_party/wiredtiger/src/checksum/x86/crc32-x86.o build/debug/third_party/wiredtiger/src/checksum/software/checksum.o build/debug/mongo/db/wire_version.o build/debug/mongo/db/commands/server_status_internal.o build/debug/mongo/db/commands/server_status_metric.o build/debug/third_party/pcre-8.42/pcre_newline.o build/debug/third_party/pcre-8.42/pcre_scanner.o build/debug/third_party/pcre-8.42/pcre_tables.o build/debug/third_party/pcre-8.42/pcre_valid_utf8.o build/debug/third_party/pcre-8.42/pcre_stringpiece.o build/debug/third_party/pcre-8.42/pcre_string_utils.o build/debug/third_party/pcre-8.42/pcre_ucd.o build/debug/third_party/pcre-8.42/pcre_exec.o build/debug/third_party/pcre-8.42/pcre_ord2utf8.o build/debug/third_party/pcre-8.42/pcre_version.o build/debug/third_party/pcre-8.42/pcre_compile.o build/debug/third_party/pcre-8.42/pcre_get.o build/debug/third_party/pcre-8.42/pcre_byte_order.o build/debug/third_party/pcre-8.42/pcre_study.o build/debug/third_party/pcre-8.42/pcre_fullinfo.o build/debug/third_party/pcre-8.42/pcre_refcount.o build/debug/third_party/pcre-8.42/pcre_xclass.o build/debug/third_party/pcre-8.42/pcre_globals.o build/debug/third_party/pcre-8.42/pcre_maketables.o build/debug/third_party/pcre-8.42/pcre_dfa_exec.o build/debug/third_party/pcre-8.42/pcre_chartables.o build/debug/third_party/pcre-8.42/pcre_config.o build/debug/third_party/pcre-8.42/pcrecpp.o build/debug/third_party/shim_timelib.o build/debug/mongo/db/server_options_helpers.o build/debug/mongo/db/server_options_helpers_gen.o build/debug/mongo/db/audit.o build/debug/mongo/db/write_concern_options.o build/debug/mongo/rpc/metadata/logical_time_metadata.o build/debug/mongo/shell/encrypted_dbclient_base.o build/debug/mongo/shell/fle_shell_options_gen.o build/debug/mongo/rpc/metadata/tracking_metadata.o build/debug/mongo/rpc/metadata/config_server_metadata.o build/debug/mongo/rpc/metadata.o build/debug/mongo/rpc/metadata/repl_set_metadata.o build/debug/mongo/rpc/metadata/egress_metadata_hook_list.o build/debug/mongo/rpc/metadata/sharding_metadata.o build/debug/mongo/rpc/metadata/oplog_query_metadata.o build/debug/mongo/db/field_ref.o build/debug/mongo/db/field_parser.o build/debug/mongo/db/field_ref_set.o build/debug/mongo/db/keypattern.o build/debug/third_party/icu4c-57.1/source/i18n/smallintformatter.o build/debug/third_party/icu4c-57.1/source/i18n/remtrans.o build/debug/third_party/icu4c-57.1/source/i18n/dayperiodrules.o build/debug/third_party/icu4c-57.1/source/i18n/standardplural.o build/debug/third_party/icu4c-57.1/source/i18n/windtfmt.o build/debug/third_party/icu4c-57.1/source/i18n/selfmt.o build/debug/third_party/icu4c-57.1/source/i18n/casetrn.o build/debug/third_party/icu4c-57.1/source/i18n/strrepl.o build/debug/third_party/icu4c-57.1/source/i18n/vzone.o build/debug/third_party/icu4c-57.1/source/i18n/ztrans.o build/debug/third_party/icu4c-57.1/source/i18n/calendar.o build/debug/third_party/icu4c-57.1/source/i18n/tzfmt.o build/debug/third_party/icu4c-57.1/source/i18n/ethpccal.o build/debug/third_party/icu4c-57.1/source/i18n/utf16collationiterator.o build/debug/third_party/icu4c-57.1/source/i18n/rbtz.o build/debug/third_party/icu4c-57.1/source/i18n/translit.o build/debug/third_party/icu4c-57.1/source/i18n/compactdecimalformat.o build/debug/third_party/icu4c-57.1/source/i18n/rulebasedcollator.o build/debug/third_party/icu4c-57.1/source/i18n/uregion.o build/debug/third_party/icu4c-57.1/source/i18n/digitinterval.o build/debug/third_party/icu4c-57.1/source/i18n/collationdatareader.o build/debug/third_party/icu4c-57.1/source/i18n/anytrans.o build/debug/third_party/icu4c-57.1/source/i18n/tznames.o build/debug/third_party/icu4c-57.1/source/i18n/rematch.o build/debug/third_party/icu4c-57.1/source/i18n/simpletz.o build/debug/third_party/icu4c-57.1/source/i18n/ucln_in.o build/debug/third_party/icu4c-57.1/source/i18n/uspoof_impl.o build/debug/third_party/icu4c-57.1/source/i18n/vtzone.o build/debug/third_party/icu4c-57.1/source/i18n/indiancal.o build/debug/third_party/icu4c-57.1/source/i18n/nultrans.o build/debug/third_party/icu4c-57.1/source/i18n/regextxt.o build/debug/third_party/icu4c-57.1/source/i18n/smpdtfst.o build/debug/third_party/icu4c-57.1/source/i18n/collationbuilder.o build/debug/third_party/icu4c-57.1/source/i18n/rbt.o build/debug/third_party/icu4c-57.1/source/i18n/smpdtfmt.o build/debug/third_party/icu4c-57.1/source/i18n/nfrule.o build/debug/third_party/icu4c-57.1/source/i18n/decContext.o build/debug/third_party/icu4c-57.1/source/i18n/udat.o build/debug/third_party/icu4c-57.1/source/i18n/alphaindex.o build/debug/third_party/icu4c-57.1/source/i18n/dtfmtsym.o build/debug/third_party/icu4c-57.1/source/i18n/usearch.o build/debug/third_party/icu4c-57.1/source/i18n/digitformatter.o build/debug/third_party/icu4c-57.1/source/i18n/uspoof_conf.o build/debug/third_party/icu4c-57.1/source/i18n/nortrans.o build/debug/third_party/icu4c-57.1/source/i18n/nfrs.o build/debug/third_party/icu4c-57.1/source/i18n/digitgrouping.o build/debug/third_party/icu4c-57.1/source/i18n/rbt_set.o build/debug/third_party/icu4c-57.1/source/i18n/plurrule.o build/debug/third_party/icu4c-57.1/source/i18n/fmtable.o build/debug/third_party/icu4c-57.1/source/i18n/identifier_info.o build/debug/third_party/icu4c-57.1/source/i18n/pluralaffix.o build/debug/third_party/icu4c-57.1/source/i18n/collationsettings.o build/debug/third_party/icu4c-57.1/source/i18n/uspoof_build.o build/debug/third_party/icu4c-57.1/source/i18n/valueformatter.o build/debug/third_party/icu4c-57.1/source/i18n/measure.o build/debug/third_party/icu4c-57.1/source/i18n/winnmfmt.o build/debug/third_party/icu4c-57.1/source/i18n/wintzimpl.o build/debug/third_party/icu4c-57.1/source/i18n/dangical.o build/debug/third_party/icu4c-57.1/source/i18n/bocsu.o build/debug/third_party/icu4c-57.1/source/i18n/udateintervalformat.o build/debug/third_party/icu4c-57.1/source/i18n/ucoleitr.o build/debug/third_party/icu4c-57.1/source/i18n/dtitvfmt.o build/debug/third_party/icu4c-57.1/source/i18n/currpinf.o build/debug/third_party/icu4c-57.1/source/i18n/msgfmt.o build/debug/third_party/icu4c-57.1/source/i18n/curramt.o build/debug/third_party/icu4c-57.1/source/i18n/format.o build/debug/third_party/icu4c-57.1/source/i18n/decNumber.o build/debug/third_party/icu4c-57.1/source/i18n/sharedbreakiterator.o build/debug/third_party/icu4c-57.1/source/i18n/collationkeys.o build/debug/third_party/icu4c-57.1/source/i18n/titletrn.o build/debug/third_party/icu4c-57.1/source/i18n/ucol.o build/debug/third_party/icu4c-57.1/source/i18n/umsg.o build/debug/third_party/icu4c-57.1/source/i18n/collationrootelements.o build/debug/third_party/icu4c-57.1/source/i18n/collation.o build/debug/third_party/icu4c-57.1/source/i18n/dtrule.o build/debug/third_party/icu4c-57.1/source/i18n/chnsecal.o build/debug/third_party/icu4c-57.1/source/i18n/unesctrn.o build/debug/third_party/icu4c-57.1/source/i18n/measunit.o build/debug/third_party/icu4c-57.1/source/i18n/sortkey.o build/debug/third_party/icu4c-57.1/source/i18n/collationsets.o build/debug/third_party/icu4c-57.1/source/i18n/unumsys.o build/debug/third_party/icu4c-57.1/source/i18n/affixpatternparser.o build/debug/third_party/icu4c-57.1/source/i18n/uspoof.o build/debug/third_party/icu4c-57.1/source/i18n/taiwncal.o build/debug/third_party/icu4c-57.1/source/i18n/reldtfmt.o build/debug/third_party/icu4c-57.1/source/i18n/cecal.o build/debug/third_party/icu4c-57.1/source/i18n/regeximp.o build/debug/third_party/icu4c-57.1/source/i18n/csrucode.o build/debug/third_party/icu4c-57.1/source/i18n/esctrn.o build/debug/third_party/icu4c-57.1/source/i18n/collationroot.o build/debug/third_party/icu4c-57.1/source/i18n/tolowtrn.o build/debug/third_party/icu4c-57.1/source/i18n/collationweights.o build/debug/third_party/icu4c-57.1/source/i18n/ufieldpositer.o build/debug/third_party/icu4c-57.1/source/i18n/ucal.o build/debug/third_party/icu4c-57.1/source/i18n/csrutf8.o build/debug/third_party/icu4c-57.1/source/i18n/tmunit.o build/debug/third_party/icu4c-57.1/source/i18n/decimfmtimpl.o build/debug/third_party/icu4c-57.1/source/i18n/zrule.o build/debug/third_party/icu4c-57.1/source/i18n/collationdatawriter.o build/debug/third_party/icu4c-57.1/source/i18n/tztrans.o build/debug/third_party/icu4c-57.1/source/i18n/precision.o build/debug/third_party/icu4c-57.1/source/i18n/stsearch.o build/debug/third_party/icu4c-57.1/source/i18n/choicfmt.o build/debug/third_party/icu4c-57.1/source/i18n/plurfmt.o build/debug/third_party/icu4c-57.1/source/i18n/ulocdata.o build/debug/third_party/icu4c-57.1/source/i18n/buddhcal.o build/debug/third_party/icu4c-57.1/source/i18n/udatpg.o build/debug/third_party/icu4c-57.1/source/i18n/olsontz.o build/debug/third_party/icu4c-57.1/source/i18n/datefmt.o build/debug/third_party/icu4c-57.1/source/i18n/nfsubs.o build/debug/third_party/icu4c-57.1/source/i18n/coleitr.o build/debug/third_party/icu4c-57.1/source/i18n/tzrule.o build/debug/third_party/icu4c-57.1/source/i18n/utmscale.o build/debug/third_party/icu4c-57.1/source/i18n/strmatch.o build/debug/third_party/icu4c-57.1/source/i18n/region.o build/debug/third_party/icu4c-57.1/source/i18n/rbt_rule.o build/debug/third_party/icu4c-57.1/source/i18n/uregexc.o build/debug/third_party/icu4c-57.1/source/i18n/cpdtrans.o build/debug/third_party/icu4c-57.1/source/i18n/gregocal.o build/debug/third_party/icu4c-57.1/source/i18n/name2uni.o build/debug/third_party/icu4c-57.1/source/i18n/rbt_data.o build/debug/third_party/icu4c-57.1/source/i18n/decfmtst.o build/debug/third_party/icu4c-57.1/source/i18n/collationtailoring.o build/debug/third_party/icu4c-57.1/source/i18n/currfmt.o build/debug/third_party/icu4c-57.1/source/i18n/digitlst.o build/debug/third_party/icu4c-57.1/source/i18n/dtitvinf.o build/debug/third_party/icu4c-57.1/source/i18n/ucol_res.o build/debug/third_party/icu4c-57.1/source/i18n/dtptngen.o build/debug/third_party/icu4c-57.1/source/i18n/hebrwcal.o build/debug/third_party/icu4c-57.1/source/i18n/measfmt.o build/debug/third_party/icu4c-57.1/source/i18n/islamcal.o build/debug/third_party/icu4c-57.1/source/i18n/coptccal.o build/debug/third_party/icu4c-57.1/source/i18n/brktrans.o build/debug/third_party/icu4c-57.1/source/i18n/scriptset.o build/debug/third_party/icu4c-57.1/source/i18n/japancal.o build/debug/third_party/icu4c-57.1/source/i18n/dcfmtsym.o build/debug/third_party/icu4c-57.1/source/i18n/quantityformatter.o build/debug/third_party/icu4c-57.1/source/i18n/digitaffixesandpadding.o build/debug/third_party/icu4c-57.1/source/i18n/fpositer.o build/debug/third_party/icu4c-57.1/source/i18n/toupptrn.o build/debug/third_party/icu4c-57.1/source/i18n/collationdatabuilder.o build/debug/third_party/icu4c-57.1/source/i18n/csdetect.o build/debug/third_party/icu4c-57.1/source/i18n/basictz.o build/debug/third_party/icu4c-57.1/source/i18n/zonemeta.o build/debug/third_party/icu4c-57.1/source/i18n/transreg.o build/debug/third_party/icu4c-57.1/source/i18n/decimfmt.o build/debug/third_party/icu4c-57.1/source/i18n/ucsdet.o build/debug/third_party/icu4c-57.1/source/i18n/utrans.o build/debug/third_party/icu4c-57.1/source/i18n/tzgnames.o build/debug/third_party/icu4c-57.1/source/i18n/upluralrules.o build/debug/third_party/icu4c-57.1/source/i18n/astro.o build/debug/third_party/icu4c-57.1/source/i18n/csrsbcs.o build/debug/third_party/icu4c-57.1/source/i18n/funcrepl.o build/debug/third_party/icu4c-57.1/source/i18n/search.o build/debug/third_party/icu4c-57.1/source/i18n/currunit.o build/debug/third_party/icu4c-57.1/source/i18n/fmtable_cnv.o build/debug/third_party/icu4c-57.1/source/i18n/numfmt.o build/debug/third_party/icu4c-57.1/source/i18n/tmutamt.o build/debug/third_party/icu4c-57.1/source/i18n/rbt_pars.o build/debug/third_party/icu4c-57.1/source/i18n/uregex.o build/debug/third_party/icu4c-57.1/source/i18n/inputext.o build/debug/third_party/icu4c-57.1/source/i18n/collationcompare.o build/debug/third_party/icu4c-57.1/source/i18n/ucol_sit.o build/debug/third_party/icu4c-57.1/source/i18n/collationfastlatinbuilder.o build/debug/third_party/icu4c-57.1/source/i18n/collationiterator.o build/debug/third_party/icu4c-57.1/source/i18n/numsys.o build/debug/third_party/icu4c-57.1/source/i18n/tznames_impl.o build/debug/third_party/icu4c-57.1/source/i18n/csrecog.o build/debug/third_party/icu4c-57.1/source/i18n/csrmbcs.o build/debug/third_party/icu4c-57.1/source/i18n/collationdata.o build/debug/third_party/icu4c-57.1/source/i18n/collationfcd.o build/debug/third_party/icu4c-57.1/source/i18n/scientificnumberformatter.o build/debug/third_party/icu4c-57.1/source/i18n/collationfastlatin.o build/debug/third_party/icu4c-57.1/source/i18n/gregoimp.o build/debug/third_party/icu4c-57.1/source/i18n/regexcmp.o build/debug/third_party/icu4c-57.1/source/i18n/reldatefmt.o build/debug/third_party/icu4c-57.1/source/i18n/collationruleparser.o build/debug/third_party/icu4c-57.1/source/i18n/gender.o build/debug/third_party/icu4c-57.1/source/i18n/coll.o build/debug/third_party/icu4c-57.1/source/i18n/uspoof_wsconf.o build/debug/third_party/icu4c-57.1/source/i18n/quant.o build/debug/third_party/icu4c-57.1/source/i18n/tmutfmt.o build/debug/third_party/icu4c-57.1/source/i18n/csmatch.o build/debug/third_party/icu4c-57.1/source/i18n/uitercollationiterator.o build/debug/third_party/icu4c-57.1/source/i18n/regexst.o build/debug/third_party/icu4c-57.1/source/i18n/unum.o build/debug/third_party/icu4c-57.1/source/i18n/csr2022.o build/debug/third_party/icu4c-57.1/source/i18n/timezone.o build/debug/third_party/icu4c-57.1/source/i18n/digitaffix.o build/debug/third_party/icu4c-57.1/source/i18n/uni2name.o build/debug/third_party/icu4c-57.1/source/i18n/utf8collationiterator.o build/debug/third_party/icu4c-57.1/source/i18n/tridpars.o build/debug/third_party/icu4c-57.1/source/i18n/repattrn.o build/debug/third_party/icu4c-57.1/source/i18n/rbnf.o build/debug/third_party/icu4c-57.1/source/i18n/decimalformatpattern.o build/debug/third_party/icu4c-57.1/source/i18n/fphdlimp.o build/debug/third_party/icu4c-57.1/source/i18n/visibledigits.o build/debug/third_party/icu4c-57.1/source/i18n/persncal.o build/debug/mongo/db/keys_collection_document.o build/debug/mongo/db/keys_collection_cache.o build/debug/mongo/db/key_generator.o build/debug/mongo/db/catalog/collection.o build/debug/mongo/util/secure_zero_memory.o build/debug/third_party/s2/util/math/mathutil.o build/debug/mongo/db/keys_collection_manager_gen.o build/debug/mongo/db/keys_collection_manager.o build/debug/mongo/db/global_settings.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_minmax.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_bid64.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_log10.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_exp2.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_fma.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_int16.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_flag_operations.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_exp10.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_mul.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_sqrt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_add.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_scalb.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_fegetexceptflag.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_lrintd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_cos.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_scalb.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_sinh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_tgamma.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_int64.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_atan.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_uint8.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_lgamma.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_fdimd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_fma.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/wcstod64.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_quantize.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_int16.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_bid128.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_scalbl.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_quantexpd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_frexp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_cbrt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_frexp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_quantexpd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_pow.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_tan.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_acos.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_erf.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_lgamma.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_ldexp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_log1p.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_expm1.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_scalb.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_compare.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_acosh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_int16.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_inv_trig.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_four_over_pi.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_fdimd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_asin.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_atanh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_llrintd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_int.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_from_int.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_round.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_erfc.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_expm1.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_feraiseexcept.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_div.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_log1p.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_mul.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_tgamma.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_logbd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_sqrt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_trig.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_logb.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_cosh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/strtod64.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_modf.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_sqrt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_exp2.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_int8.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_acosh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_tgamma.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_sinh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_acosh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_int8.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_uint8.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_cosh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_add.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_noncomp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_tanh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_scalbl.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_exception.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_fetestexcept.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_log10.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_cos.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_cbrt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_quantize.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_atan2.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_fdimd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_atanh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_ldexp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_llrintd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_mod.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_string.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_nearbyintd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_uint64.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_bid.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_cosh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_uint8.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_fma.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_sqrt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_logbd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_noncomp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_llrintd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_uint16.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_div.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_log2.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_sin.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_log1p.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_round_integral.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_lgamma.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_lround.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_quantize.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_tan.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_atan2.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_uint32.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_nexttowardd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_inv_hyper.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_powi.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_log2.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_binarydecimal.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_decimal_data.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_erfc.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_next.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_fmod.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_erf.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_fesetexceptflag.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/sqrt_tab_t.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_log10.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_atan.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_lgamma.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_nearbyintd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_uint32.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_exp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_erf.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_asinh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_uint64.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_asin.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_uint32.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_uint16.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_uint16.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_uint64.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_exp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_sin.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_int64.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_asinh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_convert_data.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_div.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_erf.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_cbrt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_rem.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_expm1.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_asinh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_exp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_log.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_nexttowardd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_frexp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_next.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_logb.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_int8.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_lrintd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_log2.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_quantexpd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_pow.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_ldexp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_asin.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/wcstod32.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_logbd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_bid128.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_round_integral.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_exp2.o build/debug/third_party/IntelRDFPMathLib20U1/dpml_log1p_t.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_minmax.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_next.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_int32.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_erfc.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_sub.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_string.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_tan.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_mul.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_int32.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_ops.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_lround.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_hypot.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_pow.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_lround.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_lrintd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_atan.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_log.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_compare.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_exp10.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_scalbl.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_2_str_tables.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_nexttowardd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_cbrt.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_log.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_exp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_minmax.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_atan2.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_rem.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_feclearexcept.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_round_integral.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/strtod32.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_add.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_rem.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_noncomp.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_int32.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_int64.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_logb.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_hypot.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_string.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_hypot.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_log.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_acos.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_acos.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_bessel.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_nearbyintd.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_ops_64.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_exp10.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_cos.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_compare.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_tanh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/strtod128.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_modf.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_modf.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_atanh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_pow.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_fmod.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_fmod.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_sinh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/wcstod128.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_sin.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_decimal_globals.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_tanh.o build/debug/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_dpd.o build/debug/mongo/db/storage/duplicate_key_error_info.o build/debug/third_party/shim_intel_decimal128.o build/debug/mongo/util/net/sockaddr.o build/debug/mongo/util/net/cidr.o build/debug/mongo/util/net/hostandport.o build/debug/mongo/util/net/socket_exception.o build/debug/mongo/util/net/hostname_canonicalization.o build/debug/mongo/util/net/hostandport_gen.o build/debug/mongo/util/net/socket_utils.o build/debug/mongo/db/repl/rollback_gen.o build/debug/mongo/shell/shell_utils_extended.o build/debug/mongo/shell/shell_utils.o build/debug/mongo/shell/linenoise.o build/debug/mongo/shell/shell_options.o build/debug/mongo/shell/shell_utils_launcher.o build/debug/mongo/shell/mongo-server.o build/debug/mongo/shell/mk_wcwidth.o build/debug/mongo/db/catalog/disable_index_spec_namespace_generation_gen.o build/debug/mongo/db/repl/split_horizon.o build/debug/mongo/util/options_parser/options_parser_init.o build/debug/mongo/executor/network_interface.o build/debug/mongo/db/auth/address_restriction_gen.o build/debug/mongo/db/auth/address_restriction.o build/debug/mongo/executor/network_interface_factory.o build/debug/mongo/db/index/btree_key_generator.o build/debug/mongo/db/index/sort_key_generator.o build/debug/mongo/db/index/expression_keys_private.o build/debug/mongo/db/index/wildcard_key_generator.o build/debug/mongo/util/periodic_runner.o build/debug/third_party/kms-message/src/kms_request_str.o build/debug/third_party/kms-message/src/kms_message.o build/debug/third_party/kms-message/src/kms_kv_list.o build/debug/third_party/kms-message/src/kms_request_opt.o build/debug/third_party/kms-message/src/kms_encrypt_request.o build/debug/third_party/kms-message/src/kms_response.o build/debug/third_party/kms-message/src/kms_b64.o build/debug/third_party/kms-message/src/sort.o build/debug/third_party/kms-message/src/kms_response_parser.o build/debug/third_party/kms-message/src/kms_crypto_apple.o build/debug/third_party/kms-message/src/kms_request.o build/debug/third_party/kms-message/src/hexlify.o build/debug/third_party/kms-message/src/kms_decrypt_request.o build/debug/mongo/db/exec/projection_exec_agg.o build/debug/mongo/db/repl/member_config.o build/debug/mongo/db/repl/update_position_args.o build/debug/mongo/db/repl/repl_set_request_votes_args.o build/debug/mongo/db/repl/repl_set_config_gen.o build/debug/mongo/db/repl/is_master_response.o build/debug/mongo/db/repl/last_vote.o build/debug/mongo/db/repl/repl_set_heartbeat_args_v1.o build/debug/mongo/db/repl/repl_set_heartbeat_response.o build/debug/mongo/db/repl/repl_set_tag.o build/debug/mongo/db/repl/repl_set_config.o build/debug/mongo/db/pipeline/dependencies.o build/debug/third_party/s2/base/strtoint.o build/debug/third_party/s2/base/int128.o build/debug/third_party/s2/base/stringprintf.o build/debug/third_party/s2/base/logging.o build/debug/mongo/transport/transport_layer.o build/debug/mongo/transport/service_entry_point_utils.o build/debug/mongo/transport/session.o build/debug/mongo/util/intrusive_counter.o build/debug/mongo/db/multi_key_path_tracker.o build/debug/mongo/base/system_error.o build/debug/third_party/timelib-2018.01/interval.o build/debug/third_party/timelib-2018.01/parse_iso_intervals.o build/debug/third_party/timelib-2018.01/parse_date.o build/debug/third_party/timelib-2018.01/parse_zoneinfo.o build/debug/third_party/timelib-2018.01/timelib.o build/debug/third_party/timelib-2018.01/tm2unixtime.o build/debug/third_party/timelib-2018.01/astro.o build/debug/third_party/timelib-2018.01/parse_tz.o build/debug/third_party/timelib-2018.01/unixtime2tm.o build/debug/third_party/timelib-2018.01/dow.o build/debug/mongo/executor/thread_pool_task_executor.o build/debug/third_party/s2/util/coding/varint.o build/debug/third_party/s2/util/coding/coder.o build/debug/mongo/rpc/metadata/client_metadata_ismaster.o build/debug/mongo/rpc/metadata/client_metadata.o build/debug/mongo/shell/kms.o build/debug/mongo/shell/kms_local.o build/debug/mongo/shell/kms_gen.o build/debug/mongo/shell/kms_aws.o build/debug/mongo/util/regex_util.o build/debug/mongo/rpc/get_status_from_command_result.o build/debug/mongo/rpc/write_concern_error_detail.o build/debug/mongo/db/concurrency/lock_manager.o build/debug/mongo/db/concurrency/d_concurrency.o build/debug/mongo/db/concurrency/lock_state.o build/debug/mongo/db/concurrency/replication_state_transition_lock_guard.o build/debug/mongo/db/concurrency/lock_stats.o build/debug/mongo/db/command_generic_argument.o build/debug/mongo/db/logical_session_id.o build/debug/mongo/db/logical_session_id_gen.o build/debug/mongo/shell/mongodbcr.o build/debug/third_party/shim_abseil.o build/debug/third_party/s2/s2pointregion.o build/debug/third_party/s2/s2regionintersection.o build/debug/third_party/s2/s2regionunion.o build/debug/third_party/s2/s1angle.o build/debug/third_party/s2/s2region.o build/debug/third_party/s2/s2cap.o build/debug/third_party/s2/s2polyline.o build/debug/third_party/s2/s2latlngrect.o build/debug/third_party/s2/s1interval.o build/debug/third_party/s2/s2loop.o build/debug/third_party/s2/s2edgeindex.o build/debug/third_party/s2/s2edgeutil.o build/debug/third_party/s2/s2cellid.o build/debug/third_party/s2/s2polygonbuilder.o build/debug/third_party/s2/s2.o build/debug/third_party/s2/s2regioncoverer.o build/debug/third_party/s2/s2cellunion.o build/debug/third_party/s2/s2polygon.o build/debug/third_party/s2/s2latlng.o build/debug/third_party/s2/s2r2rect.o build/debug/third_party/s2/s2cell.o build/debug/mongo/util/concurrency/ticketholder.o build/debug/mongo/client/query.o build/debug/mongo/util/debugger.o build/debug/mongo/db/query/collation/collation_index_key.o build/debug/mongo/db/query/collation/collation_spec.o build/debug/mongo/db/logical_clock.o build/debug/mongo/db/logical_clock_gen.o build/debug/mongo/db/query/collation/collator_interface.o build/debug/mongo/db/pipeline/resume_token.o build/debug/mongo/db/pipeline/exchange_spec_gen.o build/debug/mongo/db/pipeline/document_source_change_stream_gen.o build/debug/mongo/db/pipeline/value_gen.o build/debug/mongo/db/pipeline/document_source_list_sessions_gen.o build/debug/mongo/db/pipeline/document_source_merge_gen.o build/debug/mongo/db/pipeline/document_source_replace_root_gen.o build/debug/mongo/db/pipeline/document_source_merge_spec.o build/debug/mongo/db/pipeline/document_source_merge_modes_gen.o build/debug/mongo/db/geo/hash.o build/debug/mongo/db/geo/shapes.o build/debug/mongo/db/geo/big_polygon.o build/debug/mongo/db/geo/r2_region_coverer.o build/debug/mongo/db/fts/unicode/string.o build/debug/mongo/db/fts/unicode/codepoints_diacritic_list.o build/debug/mongo/db/fts/unicode/codepoints_casefold.o build/debug/mongo/db/fts/unicode/codepoints_delimiter_list.o build/debug/mongo/db/fts/unicode/codepoints_diacritic_map.o build/debug/mongo/db/repl/storage_interface.o build/debug/mongo/base/secure_allocator.o build/debug/mongo/db/ops/write_ops_parsers.o build/debug/mongo/db/ops/write_ops_gen.o build/debug/mongo/db/stats/counters.o build/debug/third_party/shim_allocator.o build/debug/mongo/util/net/ssl_types.o build/debug/mongo/db/logical_time_validator.o build/debug/mongo/util/secure_compare_memory.o build/debug/mongo/util/safe_num.o build/debug/mongo/db/storage/key_string.o build/debug/mongo/util/net/ssl_manager_apple.o build/debug/mongo/util/net/ssl_manager.o build/debug/mongo/util/net/ssl_stream.o build/debug/mongo/util/net/ssl_parameters_gen.o build/debug/mongo/util/net/ssl_parameters.o build/debug/mongo/util/net/private/ssl_expiration.o build/debug/mongo/util/net/private/socket_poll.o build/debug/mongo/util/net/sock.o build/debug/mongo/transport/service_executor_gen.o build/debug/mongo/transport/service_executor_reserved.o build/debug/mongo/transport/service_executor_adaptive.o build/debug/mongo/transport/service_executor_synchronous.o build/debug/mongo/db/query/count_command_gen.o build/debug/mongo/db/query/killcursors_request.o build/debug/mongo/db/query/killcursors_response.o build/debug/mongo/db/query/find_and_modify_request.o build/debug/mongo/db/query/view_response_formatter.o build/debug/mongo/db/query/cursor_response.o build/debug/mongo/db/query/count_command_as_aggregation_command.o build/debug/mongo/db/query/count_request.o build/debug/mongo/db/query/cursor_request.o build/debug/mongo/db/query/getmore_request.o build/debug/mongo/client/authenticate.o build/debug/mongo/db/namespace_string.o build/debug/mongo/util/summation.o build/debug/mongo/util/processinfo_macOS.o build/debug/mongo/util/processinfo.o build/debug/third_party/shim_kms_message.o build/debug/third_party/shim_zlib.o build/debug/mongo/db/logical_time.o build/debug/mongo/db/operation_time_tracker.o build/debug/third_party/shim_asio.o build/debug/mongo/scripting/bson_template_evaluator.o build/debug/mongo/shell/bench.o build/debug/third_party/shim_mozjs.o build/debug/third_party/abseil-cpp-master/abseil-cpp/absl/container/internal/raw_hash_set.o build/debug/third_party/icu4c-57.1/source/stubdata/stubdata.o build/debug/mongo/client/read_preference.o build/debug/mongo/db/time_proof_service.o build/debug/mongo/crypto/sha_block_apple.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_lazy.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/huf_compress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/hist.o build/debug/third_party/zstandard-1.3.7/zstd/lib/common/fse_decompress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/deprecated/zbuff_common.o build/debug/third_party/zstandard-1.3.7/zstd/lib/deprecated/zbuff_compress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/decompress/huf_decompress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/dictBuilder/zdict.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_fast.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/zstdmt_compress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/common/xxhash.o build/debug/third_party/zstandard-1.3.7/zstd/lib/common/pool.o build/debug/third_party/zstandard-1.3.7/zstd/lib/dictBuilder/cover.o build/debug/third_party/zstandard-1.3.7/zstd/lib/common/zstd_common.o build/debug/third_party/zstandard-1.3.7/zstd/lib/dictBuilder/divsufsort.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_opt.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_double_fast.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_compress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/decompress/zstd_decompress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/common/entropy_common.o build/debug/third_party/zstandard-1.3.7/zstd/lib/deprecated/zbuff_decompress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/dictBuilder/fastcover.o build/debug/third_party/zstandard-1.3.7/zstd/lib/common/error_private.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_ldm.o build/debug/third_party/zstandard-1.3.7/zstd/lib/compress/fse_compress.o build/debug/third_party/zstandard-1.3.7/zstd/lib/common/threading.o build/debug/third_party/murmurhash3/MurmurHash3.o build/debug/mongo/db/pipeline/aggregation_request.o build/debug/third_party/shim_yaml.o build/debug/mongo/util/net/http_client_curl.o build/debug/mongo/util/net/ssl_options.o build/debug/mongo/db/views/resolved_view.o build/debug/mongo/s/catalog/sharding_catalog_client.o build/debug/mongo/util/concurrency/spin_lock.o build/debug/mongo/util/password_params_gen.o build/debug/mongo/util/password.o build/debug/mongo/db/matcher/expression_where_base.o build/debug/mongo/db/matcher/expression.o build/debug/mongo/db/matcher/expression_array.o build/debug/mongo/db/matcher/schema/json_schema_parser.o build/debug/mongo/db/matcher/schema/expression_internal_schema_fmod.o build/debug/mongo/db/matcher/schema/expression_internal_schema_num_array_items.o build/debug/mongo/db/matcher/rewrite_expr.o build/debug/mongo/db/matcher/schema/expression_internal_schema_eq.o build/debug/mongo/db/matcher/extensions_callback.o build/debug/mongo/db/matcher/expression_text_base.o build/debug/mongo/db/matcher/expression_internal_expr_eq.o build/debug/mongo/db/matcher/schema/expression_internal_schema_cond.o build/debug/mongo/db/matcher/schema/expression_internal_schema_unique_items.o build/debug/mongo/db/matcher/expression_algo.o build/debug/mongo/db/matcher/expression_text_noop.o build/debug/mongo/db/matcher/expression_tree.o build/debug/mongo/db/matcher/expression_geo.o build/debug/mongo/db/matcher/extensions_callback_noop.o build/debug/mongo/db/matcher/schema/encrypt_schema_types.o build/debug/mongo/db/matcher/schema/expression_internal_schema_all_elem_match_from_index.o build/debug/mongo/db/matcher/expression_expr.o build/debug/mongo/db/matcher/expression_leaf.o build/debug/mongo/db/matcher/expression_parser.o build/debug/mongo/db/matcher/schema/expression_internal_schema_root_doc_eq.o build/debug/mongo/db/matcher/expression_where_noop.o build/debug/mongo/db/matcher/schema/expression_internal_schema_object_match.o build/debug/mongo/db/matcher/schema/expression_internal_schema_xor.o build/debug/mongo/db/matcher/matchable.o build/debug/mongo/db/matcher/schema/expression_internal_schema_str_length.o build/debug/mongo/db/matcher/schema/expression_internal_schema_allowed_properties.o build/debug/mongo/db/matcher/expression_with_placeholder.o build/debug/mongo/db/matcher/matcher.o build/debug/mongo/db/matcher/schema/expression_internal_schema_match_array_index.o build/debug/mongo/db/matcher/matcher_type_set.o build/debug/mongo/db/matcher/schema/encrypt_schema_gen.o build/debug/mongo/db/matcher/match_details.o build/debug/mongo/db/matcher/schema/json_pointer.o build/debug/mongo/db/matcher/schema/expression_internal_schema_num_properties.o build/debug/mongo/db/query/tailable_mode_gen.o build/debug/mongo/db/query/query_request.o build/debug/mongo/db/query/tailable_mode.o build/debug/mongo/util/icu_init.o build/debug/mongo/client/async_client.o build/debug/mongo/idl/server_parameter_with_storage.o build/debug/mongo/idl/server_parameter.o build/debug/mongo/db/pipeline/parsed_add_fields.o build/debug/mongo/db/pipeline/parsed_exclusion_projection.o build/debug/mongo/db/pipeline/parsed_inclusion_projection.o build/debug/mongo/db/pipeline/parsed_aggregation_projection.o build/debug/mongo/db/pipeline/parsed_aggregation_projection_node.o build/debug/third_party/shim_snappy.o build/debug/mongo/db/auth/user_management_commands_parser.o build/debug/mongo/db/auth/action_set.o build/debug/mongo/db/auth/resource_pattern.o build/debug/mongo/db/auth/action_type.o build/debug/mongo/db/auth/privilege_parser.o build/debug/mongo/db/auth/impersonation_session.o build/debug/mongo/db/auth/privilege.o build/debug/mongo/util/boost_assert_shim.o build/debug/third_party/shim_boost.o build/debug/mongo/db/commands.o build/debug/mongo/transport/message_compressor_manager.o build/debug/mongo/transport/message_compressor_zstd.o build/debug/mongo/transport/message_compressor_metrics.o build/debug/mongo/transport/message_compressor_snappy.o build/debug/mongo/transport/message_compressor_zlib.o build/debug/mongo/transport/message_compressor_registry.o build/debug/mongo/crypto/aead_encryption.o build/debug/mongo/db/pipeline/field_path.o build/debug/mongo/db/repl/repl_client_info.o build/debug/mongo/db/repl/replication_coordinator_noop.o build/debug/mongo/db/repl/replication_coordinator.o build/debug/mongo/scripting/mozjs/cursor.o build/debug/mongo/scripting/mozjs/countdownlatch.o build/debug/mongo/scripting/mozjs/engine.o build/debug/mongo/scripting/mozjs/code.o build/debug/mongo/scripting/mozjs/regexp.o build/debug/mongo/scripting/mozjs/timestamp.o build/debug/mongo/scripting/mozjs/internedstring.o build/debug/mongo/scripting/mozjs/numberdecimal.o build/debug/mongo/scripting/mozjs/cursor_handle.o build/debug/mongo/scripting/mozjs/session.o build/debug/mongo/scripting/mozjs/nativefunction.o build/debug/mongo/scripting/mozjs/error.o build/debug/mongo/scripting/mozjs/scripting_util_gen.o build/debug/mongo/scripting/mozjs/dbquery.o build/debug/mongo/scripting/mozjs/global.o build/debug/mongo/scripting/mozjs/valuewriter.o build/debug/mongo/scripting/mozjs/db.o build/debug/mongo/scripting/mozjs/idwrapper.o build/debug/mongo/scripting/mozjs/base.o build/debug/mongo/scripting/mozjs/jsstringwrapper.o build/debug/mongo/scripting/mozjs/mongohelpers.o build/debug/mongo/scripting/mozjs/proxyscope.o build/debug/mongo/scripting/mozjs/bson.o build/debug/mongo/scripting/mozjs/implscope.o build/debug/mongo/scripting/mozjs/jsthread.o build/debug/mongo/scripting/mozjs/PosixNSPR.o build/debug/mongo/scripting/mozjs/oid.o build/debug/mongo/scripting/mozjs/uri.o build/debug/mongo/scripting/mozjs/engine_gen.o build/debug/mongo/scripting/mozjs/mongo.o build/debug/mongo/scripting/mozjs/maxkey.o build/debug/mongo/scripting/mozjs/status.o build/debug/mongo/scripting/mozjs/object.o build/debug/mongo/scripting/mozjs/numberint.o build/debug/mongo/scripting/mozjs/dbcollection.o build/debug/mongo/scripting/mozjs/jscustomallocator.o build/debug/mongo/scripting/mozjs/bindata.o build/debug/mongo/scripting/mozjs/dbref.o build/debug/mongo/scripting/mozjs/valuereader.o build/debug/mongo/scripting/mozjs/objectwrapper.o build/debug/mongo/scripting/mozjs/exception.o build/debug/mongo/scripting/mozjs/numberlong.o build/debug/mongo/scripting/mozjs/dbpointer.o build/debug/mongo/scripting/mozjs/mongohelpers_js.o build/debug/mongo/scripting/mozjs/minkey.o build/debug/third_party/fmt/dist/src/posix.o build/debug/third_party/fmt/dist/src/format.o build/debug/mongo/shell/mongo.o build/debug/mongo/db/fts/fts_query_noop.o build/debug/third_party/shim_fmt.o build/debug/mongo/executor/egress_tag_closer_manager.o build/debug/mongo/transport/transport_layer_manager.o build/debug/mongo/shell/linenoise_utf8.o build/debug/mongo/db/catalog/index_catalog_entry.o "
  },
  {
    "path": "cmake/mongodb/macosx-release.objects",
    "content": "build/opt/third_party/shim_asio.o build/opt/mongo/db/keys_collection_manager.o build/opt/mongo/crypto/aead_encryption.o build/opt/mongo/crypto/sha256_block.o build/opt/mongo/db/keys_collection_cache.o build/opt/mongo/db/key_generator.o build/opt/mongo/shell/mongodbcr.o build/opt/mongo/db/operation_time_tracker.o build/opt/mongo/db/keys_collection_manager_gen.o build/opt/mongo/db/logical_time.o build/opt/mongo/db/logical_clock.o build/opt/mongo/db/logical_clock_gen.o build/opt/mongo/db/query/tailable_mode_gen.o build/opt/mongo/db/query/tailable_mode.o build/opt/mongo/db/query/query_request.o build/opt/mongo/db/server_options.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_romanian.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_portuguese.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_italian.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_norwegian.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_english.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_german.o build/opt/third_party/libstemmer_c/runtime/api.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_hungarian.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_dutch.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_porter.o build/opt/third_party/libstemmer_c/libstemmer/libstemmer_utf8.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_russian.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_spanish.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_danish.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_finnish.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_swedish.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_turkish.o build/opt/third_party/libstemmer_c/src_c/stem_UTF_8_french.o build/opt/mongo/db/field_ref.o build/opt/mongo/db/field_parser.o build/opt/mongo/db/field_ref_set.o build/opt/mongo/db/keypattern.o build/opt/mongo/util/concurrency/ticketholder.o build/opt/mongo/db/dbmessage.o build/opt/third_party/boost-1.70.0/libs/iostreams/src/file_descriptor.o build/opt/third_party/boost-1.70.0/libs/iostreams/src/mapped_file.o build/opt/mongo/db/auth/restriction_environment.o build/opt/mongo/shell/kms_shell.o build/opt/mongo/rpc/metadata/oplog_query_metadata.o build/opt/mongo/rpc/metadata/logical_time_metadata.o build/opt/mongo/rpc/metadata/sharding_metadata.o build/opt/mongo/rpc/metadata/repl_set_metadata.o build/opt/mongo/rpc/metadata/egress_metadata_hook_list.o build/opt/mongo/rpc/metadata/tracking_metadata.o build/opt/mongo/rpc/metadata/config_server_metadata.o build/opt/mongo/rpc/metadata.o build/opt/mongo/util/net/private/socket_poll.o build/opt/mongo/db/logical_session_id_helpers.o build/opt/mongo/util/net/sock.o build/opt/mongo/db/pipeline/aggregation_request.o build/opt/mongo/db/query/query_knobs_gen.o build/opt/mongo/bson/mutable/element.o build/opt/mongo/bson/mutable/document.o build/opt/mongo/shell/encrypted_dbclient_base.o build/opt/mongo/db/matcher/expression.o build/opt/mongo/db/matcher/matchable.o build/opt/mongo/shell/fle_shell_options_gen.o build/opt/mongo/db/matcher/schema/expression_internal_schema_cond.o build/opt/mongo/db/matcher/schema/expression_internal_schema_eq.o build/opt/mongo/db/matcher/expression_geo.o build/opt/mongo/db/matcher/schema/encrypt_schema_types.o build/opt/mongo/db/matcher/expression_algo.o build/opt/mongo/db/matcher/expression_with_placeholder.o build/opt/mongo/db/matcher/expression_where_base.o build/opt/mongo/db/matcher/schema/expression_internal_schema_all_elem_match_from_index.o build/opt/mongo/db/matcher/schema/expression_internal_schema_allowed_properties.o build/opt/mongo/db/matcher/expression_tree.o build/opt/mongo/db/matcher/schema/encrypt_schema_gen.o build/opt/mongo/db/matcher/extensions_callback_noop.o build/opt/mongo/db/matcher/schema/expression_internal_schema_str_length.o build/opt/mongo/db/matcher/schema/expression_internal_schema_match_array_index.o build/opt/mongo/db/matcher/schema/json_schema_parser.o build/opt/mongo/db/matcher/schema/expression_internal_schema_xor.o build/opt/mongo/db/matcher/schema/expression_internal_schema_fmod.o build/opt/mongo/db/matcher/schema/json_pointer.o build/opt/mongo/db/matcher/schema/expression_internal_schema_root_doc_eq.o build/opt/mongo/db/matcher/matcher.o build/opt/mongo/db/matcher/schema/expression_internal_schema_object_match.o build/opt/mongo/db/matcher/expression_array.o build/opt/mongo/db/matcher/extensions_callback.o build/opt/mongo/db/matcher/schema/expression_internal_schema_unique_items.o build/opt/mongo/db/matcher/rewrite_expr.o build/opt/mongo/db/matcher/schema/expression_internal_schema_num_array_items.o build/opt/mongo/db/matcher/expression_internal_expr_eq.o build/opt/mongo/db/matcher/expression_text_noop.o build/opt/mongo/db/matcher/expression_expr.o build/opt/mongo/db/matcher/schema/expression_internal_schema_num_properties.o build/opt/mongo/db/matcher/expression_text_base.o build/opt/mongo/db/matcher/matcher_type_set.o build/opt/mongo/db/matcher/expression_leaf.o build/opt/mongo/db/matcher/expression_parser.o build/opt/mongo/db/matcher/expression_where_noop.o build/opt/mongo/db/matcher/match_details.o build/opt/third_party/shim_icu.o build/opt/mongo/client/mongo_uri_connect.o build/opt/mongo/client/global_conn_pool.o build/opt/mongo/client/replica_set_monitor.o build/opt/mongo/client/replica_set_monitor_manager.o build/opt/mongo/client/replica_set_change_notifier.o build/opt/mongo/client/global_conn_pool_gen.o build/opt/mongo/client/connection_string_connect.o build/opt/mongo/client/dbclient_connection.o build/opt/mongo/client/connpool.o build/opt/mongo/client/dbclient_rs.o build/opt/mongo/db/wire_version.o build/opt/third_party/yaml-cpp-0.6.2/src/ostream_wrapper.o build/opt/third_party/yaml-cpp-0.6.2/src/emitter.o build/opt/third_party/yaml-cpp-0.6.2/src/emitterstate.o build/opt/third_party/yaml-cpp-0.6.2/src/scanner.o build/opt/third_party/yaml-cpp-0.6.2/src/directives.o build/opt/third_party/yaml-cpp-0.6.2/src/singledocparser.o build/opt/third_party/yaml-cpp-0.6.2/src/stream.o build/opt/third_party/yaml-cpp-0.6.2/src/contrib/graphbuilderadapter.o build/opt/third_party/yaml-cpp-0.6.2/src/regex_yaml.o build/opt/third_party/yaml-cpp-0.6.2/src/exceptions.o build/opt/third_party/yaml-cpp-0.6.2/src/exp.o build/opt/third_party/yaml-cpp-0.6.2/src/convert.o build/opt/third_party/yaml-cpp-0.6.2/src/emitterutils.o build/opt/third_party/yaml-cpp-0.6.2/src/simplekey.o build/opt/third_party/yaml-cpp-0.6.2/src/contrib/graphbuilder.o build/opt/third_party/yaml-cpp-0.6.2/src/scanscalar.o build/opt/third_party/yaml-cpp-0.6.2/src/nodeevents.o build/opt/third_party/yaml-cpp-0.6.2/src/scantag.o build/opt/third_party/yaml-cpp-0.6.2/src/node_data.o build/opt/third_party/yaml-cpp-0.6.2/src/scantoken.o build/opt/third_party/yaml-cpp-0.6.2/src/binary.o build/opt/third_party/yaml-cpp-0.6.2/src/parser.o build/opt/third_party/yaml-cpp-0.6.2/src/emit.o build/opt/third_party/yaml-cpp-0.6.2/src/memory.o build/opt/third_party/yaml-cpp-0.6.2/src/parse.o build/opt/third_party/yaml-cpp-0.6.2/src/node.o build/opt/third_party/yaml-cpp-0.6.2/src/null.o build/opt/third_party/yaml-cpp-0.6.2/src/nodebuilder.o build/opt/third_party/yaml-cpp-0.6.2/src/emitfromevents.o build/opt/third_party/yaml-cpp-0.6.2/src/tag.o build/opt/mongo/db/repl/replication_consistency_markers.o build/opt/mongo/db/fts/unicode/codepoints_delimiter_list.o build/opt/mongo/db/fts/unicode/codepoints_diacritic_map.o build/opt/mongo/db/repl/replication_process.o build/opt/mongo/db/fts/unicode/codepoints_diacritic_list.o build/opt/mongo/db/fts/unicode/codepoints_casefold.o build/opt/mongo/db/fts/unicode/string.o build/opt/mongo/util/clock_source.o build/opt/mongo/util/background_thread_clock_source.o build/opt/mongo/util/fast_clock_source_factory.o build/opt/third_party/boost-1.70.0/libs/system/src/error_code.o build/opt/mongo/client/read_preference.o build/opt/third_party/s2/util/math/mathutil.o build/opt/mongo/db/traffic_reader.o build/opt/mongo/util/regex_util.o build/opt/mongo/db/concurrency/lock_state.o build/opt/mongo/db/concurrency/lock_stats.o build/opt/mongo/db/concurrency/lock_manager.o build/opt/mongo/db/concurrency/replication_state_transition_lock_guard.o build/opt/mongo/db/concurrency/d_concurrency.o build/opt/mongo/crypto/sha_block_apple.o build/opt/mongo/util/winutil.o build/opt/mongo/db/catalog/collection_catalog.o build/opt/mongo/util/password.o build/opt/mongo/util/password_params_gen.o build/opt/third_party/s2/util/coding/coder.o build/opt/third_party/s2/util/coding/varint.o build/opt/mongo/db/repl/read_concern_args.o build/opt/mongo/executor/task_executor.o build/opt/mongo/transport/transport_layer_asio.o build/opt/mongo/db/audit.o build/opt/mongo/rpc/protocol.o build/opt/mongo/rpc/op_msg.o build/opt/mongo/rpc/message.o build/opt/mongo/util/signal_win32.o build/opt/mongo/util/signal_handlers.o build/opt/third_party/murmurhash3/MurmurHash3.o build/opt/mongo/executor/network_interface_factory.o build/opt/mongo/db/pipeline/expression_trigonometric.o build/opt/mongo/db/pipeline/expression.o build/opt/mongo/db/global_settings.o build/opt/mongo/db/geo/geometry_container.o build/opt/mongo/db/geo/geoparser.o build/opt/mongo/executor/connection_pool_stats.o build/opt/mongo/util/background.o build/opt/mongo/db/namespace_string.o build/opt/mongo/db/repl/replication_coordinator.o build/opt/mongo/db/repl/repl_client_info.o build/opt/mongo/db/repl/replication_coordinator_noop.o build/opt/mongo/util/secure_compare_memory.o build/opt/third_party/shim_abseil.o build/opt/mongo/util/options_parser/environment.o build/opt/mongo/util/options_parser/constraints.o build/opt/mongo/util/options_parser/value.o build/opt/mongo/util/options_parser/options_parser.o build/opt/mongo/util/options_parser/option_description.o build/opt/mongo/util/options_parser/startup_option_init.o build/opt/mongo/util/options_parser/startup_options.o build/opt/mongo/util/options_parser/option_section.o build/opt/third_party/zlib-1.2.11/inftrees.o build/opt/third_party/zlib-1.2.11/compress.o build/opt/third_party/zlib-1.2.11/deflate.o build/opt/third_party/zlib-1.2.11/crc32.o build/opt/third_party/zlib-1.2.11/infback.o build/opt/third_party/zlib-1.2.11/inflate.o build/opt/third_party/zlib-1.2.11/inffast.o build/opt/third_party/zlib-1.2.11/zutil.o build/opt/third_party/zlib-1.2.11/adler32.o build/opt/third_party/zlib-1.2.11/trees.o build/opt/third_party/zlib-1.2.11/uncompr.o build/opt/mongo/db/pipeline/field_path.o build/opt/third_party/shim_zstd.o build/opt/mongo/base/system_error.o build/opt/mongo/transport/message_compressor_options_client_gen.o build/opt/mongo/shell/mongo.o build/opt/mongo/shell/shell_options_init.o build/opt/mongo/util/safe_num.o build/opt/mongo/util/secure_zero_memory.o build/opt/mongo/db/query/collation/collator_factory_interface.o build/opt/third_party/s2/s2cap.o build/opt/third_party/s2/s2cellid.o build/opt/third_party/s2/s2cell.o build/opt/third_party/s2/s2regioncoverer.o build/opt/third_party/s2/s1interval.o build/opt/third_party/s2/s2edgeindex.o build/opt/third_party/s2/s2.o build/opt/third_party/s2/s2latlng.o build/opt/third_party/s2/s2loop.o build/opt/third_party/s2/s2pointregion.o build/opt/third_party/s2/s2latlngrect.o build/opt/third_party/s2/s2r2rect.o build/opt/third_party/s2/s2region.o build/opt/third_party/s2/s2cellunion.o build/opt/third_party/s2/s1angle.o build/opt/third_party/s2/s2polyline.o build/opt/third_party/s2/s2regionintersection.o build/opt/third_party/s2/s2edgeutil.o build/opt/third_party/s2/s2polygonbuilder.o build/opt/third_party/s2/s2regionunion.o build/opt/third_party/s2/s2polygon.o build/opt/mongo/rpc/object_check_gen.o build/opt/mongo/rpc/factory.o build/opt/mongo/rpc/legacy_request_builder.o build/opt/mongo/rpc/legacy_reply_builder.o build/opt/mongo/rpc/legacy_reply.o build/opt/mongo/rpc/reply_builder_interface.o build/opt/mongo/rpc/legacy_request.o build/opt/mongo/rpc/object_check.o build/opt/mongo/db/commands/server_status_metric.o build/opt/mongo/db/commands/server_status_internal.o build/opt/mongo/client/sasl_client_authenticate.o build/opt/mongo/client/sasl_client_session.o build/opt/mongo/client/sasl_scram_client_conversation.o build/opt/mongo/client/sasl_client_authenticate_impl.o build/opt/mongo/client/sasl_plain_client_conversation.o build/opt/mongo/client/sasl_client_conversation.o build/opt/mongo/client/native_sasl_client_session.o build/opt/mongo/db/unclean_shutdown.o build/opt/mongo/db/operation_context_group.o build/opt/mongo/db/repl_set_member_in_standalone_mode.o build/opt/mongo/db/baton.o build/opt/mongo/db/client.o build/opt/mongo/db/server_recovery.o build/opt/mongo/db/operation_context.o build/opt/mongo/db/service_context.o build/opt/mongo/db/default_baton.o build/opt/mongo/db/pipeline/document_path_support.o build/opt/mongo/db/pipeline/value_comparator.o build/opt/mongo/db/pipeline/value.o build/opt/mongo/db/pipeline/document.o build/opt/mongo/db/pipeline/document_comparator.o build/opt/third_party/shim_timelib.o build/opt/mongo/client/dbclient_cursor.o build/opt/mongo/client/index_spec.o build/opt/mongo/client/dbclient_base.o build/opt/mongo/idl/idl_parser.o build/opt/mongo/db/repl/optime.o build/opt/mongo/db/repl/bson_extract_optime.o build/opt/third_party/s2/strings/strutil.o build/opt/third_party/s2/strings/stringprintf.o build/opt/third_party/s2/strings/split.o build/opt/mongo/bson/util/bson_extract.o build/opt/mongo/db/matcher/path_internal.o build/opt/mongo/db/matcher/path.o build/opt/mongo/shell/linenoise_utf8.o build/opt/third_party/shim_kms_message.o build/opt/mongo/db/repl/member_config.o build/opt/mongo/db/repl/repl_set_heartbeat_args_v1.o build/opt/mongo/db/repl/last_vote.o build/opt/mongo/db/repl/repl_set_heartbeat_response.o build/opt/mongo/db/repl/update_position_args.o build/opt/mongo/db/repl/repl_set_request_votes_args.o build/opt/mongo/db/repl/repl_set_config.o build/opt/mongo/db/repl/repl_set_config_gen.o build/opt/mongo/db/repl/is_master_response.o build/opt/mongo/db/repl/repl_set_tag.o build/opt/mongo/db/repl/split_horizon.o build/opt/mongo/db/query/collation/collator_interface.o build/opt/mongo/db/query/collation/collation_spec.o build/opt/mongo/db/query/collation/collation_index_key.o build/opt/mongo/executor/connection_pool.o build/opt/mongo/util/summation.o build/opt/mongo/db/index/s2_common.o build/opt/mongo/db/index/expression_params.o build/opt/mongo/util/processinfo.o build/opt/mongo/util/processinfo_macOS.o build/opt/mongo/db/commands/test_commands_enabled_gen.o build/opt/mongo/db/commands/test_commands_enabled.o build/opt/mongo/util/dns_query.o build/opt/mongo/util/boost_assert_shim.o build/opt/mongo/db/catalog/disable_index_spec_namespace_generation_gen.o build/opt/mongo/crypto/sha1_block.o build/opt/mongo/db/commands/server_status.o build/opt/mongo/db/ops/write_ops_parsers.o build/opt/mongo/db/ops/write_ops_gen.o build/opt/third_party/asio-master/asio/src/asio.o build/opt/mongo/db/repl/rollback_gen.o build/opt/mongo/db/auth/authorization_manager.o build/opt/mongo/db/auth/user_name.o build/opt/mongo/db/auth/authorization_session.o build/opt/mongo/db/auth/role_name.o build/opt/mongo/db/auth/auth_decorations.o build/opt/third_party/shim_intel_decimal128.o build/opt/mongo/db/multi_key_path_tracker.o build/opt/mongo/util/version_impl.o build/opt/mongo/executor/thread_pool_task_executor.o build/opt/mongo/util/net/ssl_types.o build/opt/mongo/util/net/ssl_manager_apple.o build/opt/mongo/util/net/private/ssl_expiration.o build/opt/mongo/util/net/ssl_stream.o build/opt/mongo/util/net/ssl_parameters_gen.o build/opt/mongo/util/net/ssl_parameters.o build/opt/mongo/util/net/ssl_manager.o build/opt/third_party/shim_yaml.o build/opt/mongo/executor/remote_command_request.o build/opt/mongo/executor/remote_command_response.o build/opt/mongo/db/server_options_server_helpers.o build/opt/mongo/client/async_client.o build/opt/third_party/kms-message/src/kms_encrypt_request.o build/opt/third_party/kms-message/src/kms_message.o build/opt/third_party/kms-message/src/sort.o build/opt/third_party/kms-message/src/kms_request_str.o build/opt/third_party/kms-message/src/kms_response.o build/opt/third_party/kms-message/src/kms_b64.o build/opt/third_party/kms-message/src/kms_crypto_apple.o build/opt/third_party/kms-message/src/kms_decrypt_request.o build/opt/third_party/kms-message/src/kms_request_opt.o build/opt/third_party/kms-message/src/hexlify.o build/opt/third_party/kms-message/src/kms_request.o build/opt/third_party/kms-message/src/kms_response_parser.o build/opt/third_party/kms-message/src/kms_kv_list.o build/opt/third_party/icu4c-57.1/source/i18n/zrule.o build/opt/third_party/icu4c-57.1/source/i18n/rematch.o build/opt/third_party/icu4c-57.1/source/i18n/affixpatternparser.o build/opt/third_party/icu4c-57.1/source/i18n/quant.o build/opt/third_party/icu4c-57.1/source/i18n/format.o build/opt/third_party/icu4c-57.1/source/i18n/olsontz.o build/opt/third_party/icu4c-57.1/source/i18n/ucol_res.o build/opt/third_party/icu4c-57.1/source/i18n/bocsu.o build/opt/third_party/icu4c-57.1/source/i18n/regextxt.o build/opt/third_party/icu4c-57.1/source/i18n/region.o build/opt/third_party/icu4c-57.1/source/i18n/rbt_rule.o build/opt/third_party/icu4c-57.1/source/i18n/scientificnumberformatter.o build/opt/third_party/icu4c-57.1/source/i18n/sortkey.o build/opt/third_party/icu4c-57.1/source/i18n/tznames_impl.o build/opt/third_party/icu4c-57.1/source/i18n/dangical.o build/opt/third_party/icu4c-57.1/source/i18n/digitaffix.o build/opt/third_party/icu4c-57.1/source/i18n/funcrepl.o build/opt/third_party/icu4c-57.1/source/i18n/strmatch.o build/opt/third_party/icu4c-57.1/source/i18n/rulebasedcollator.o build/opt/third_party/icu4c-57.1/source/i18n/precision.o build/opt/third_party/icu4c-57.1/source/i18n/ethpccal.o build/opt/third_party/icu4c-57.1/source/i18n/indiancal.o build/opt/third_party/icu4c-57.1/source/i18n/tridpars.o build/opt/third_party/icu4c-57.1/source/i18n/rbt.o build/opt/third_party/icu4c-57.1/source/i18n/udateintervalformat.o build/opt/third_party/icu4c-57.1/source/i18n/collationruleparser.o build/opt/third_party/icu4c-57.1/source/i18n/tmutfmt.o build/opt/third_party/icu4c-57.1/source/i18n/decNumber.o build/opt/third_party/icu4c-57.1/source/i18n/rbtz.o build/opt/third_party/icu4c-57.1/source/i18n/hebrwcal.o build/opt/third_party/icu4c-57.1/source/i18n/ulocdata.o build/opt/third_party/icu4c-57.1/source/i18n/identifier_info.o build/opt/third_party/icu4c-57.1/source/i18n/timezone.o build/opt/third_party/icu4c-57.1/source/i18n/nultrans.o build/opt/third_party/icu4c-57.1/source/i18n/vtzone.o build/opt/third_party/icu4c-57.1/source/i18n/curramt.o build/opt/third_party/icu4c-57.1/source/i18n/stsearch.o build/opt/third_party/icu4c-57.1/source/i18n/collationdatabuilder.o build/opt/third_party/icu4c-57.1/source/i18n/fmtable.o build/opt/third_party/icu4c-57.1/source/i18n/tmunit.o build/opt/third_party/icu4c-57.1/source/i18n/tzfmt.o build/opt/third_party/icu4c-57.1/source/i18n/measfmt.o build/opt/third_party/icu4c-57.1/source/i18n/fmtable_cnv.o build/opt/third_party/icu4c-57.1/source/i18n/casetrn.o build/opt/third_party/icu4c-57.1/source/i18n/msgfmt.o build/opt/third_party/icu4c-57.1/source/i18n/translit.o build/opt/third_party/icu4c-57.1/source/i18n/persncal.o build/opt/third_party/icu4c-57.1/source/i18n/rbt_pars.o build/opt/third_party/icu4c-57.1/source/i18n/dcfmtsym.o build/opt/third_party/icu4c-57.1/source/i18n/collation.o build/opt/third_party/icu4c-57.1/source/i18n/calendar.o build/opt/third_party/icu4c-57.1/source/i18n/decimalformatpattern.o build/opt/third_party/icu4c-57.1/source/i18n/rbnf.o build/opt/third_party/icu4c-57.1/source/i18n/taiwncal.o build/opt/third_party/icu4c-57.1/source/i18n/collationfcd.o build/opt/third_party/icu4c-57.1/source/i18n/choicfmt.o build/opt/third_party/icu4c-57.1/source/i18n/smpdtfst.o build/opt/third_party/icu4c-57.1/source/i18n/gender.o build/opt/third_party/icu4c-57.1/source/i18n/zonemeta.o build/opt/third_party/icu4c-57.1/source/i18n/standardplural.o build/opt/third_party/icu4c-57.1/source/i18n/ucln_in.o build/opt/third_party/icu4c-57.1/source/i18n/collationbuilder.o build/opt/third_party/icu4c-57.1/source/i18n/collationroot.o build/opt/third_party/icu4c-57.1/source/i18n/usearch.o build/opt/third_party/icu4c-57.1/source/i18n/uitercollationiterator.o build/opt/third_party/icu4c-57.1/source/i18n/dtptngen.o build/opt/third_party/icu4c-57.1/source/i18n/japancal.o build/opt/third_party/icu4c-57.1/source/i18n/decimfmt.o build/opt/third_party/icu4c-57.1/source/i18n/regexst.o build/opt/third_party/icu4c-57.1/source/i18n/uni2name.o build/opt/third_party/icu4c-57.1/source/i18n/utmscale.o build/opt/third_party/icu4c-57.1/source/i18n/udat.o build/opt/third_party/icu4c-57.1/source/i18n/compactdecimalformat.o build/opt/third_party/icu4c-57.1/source/i18n/digitgrouping.o build/opt/third_party/icu4c-57.1/source/i18n/collationiterator.o build/opt/third_party/icu4c-57.1/source/i18n/selfmt.o build/opt/third_party/icu4c-57.1/source/i18n/basictz.o build/opt/third_party/icu4c-57.1/source/i18n/collationrootelements.o build/opt/third_party/icu4c-57.1/source/i18n/dayperiodrules.o build/opt/third_party/icu4c-57.1/source/i18n/decimfmtimpl.o build/opt/third_party/icu4c-57.1/source/i18n/tztrans.o build/opt/third_party/icu4c-57.1/source/i18n/upluralrules.o build/opt/third_party/icu4c-57.1/source/i18n/collationdatareader.o build/opt/third_party/icu4c-57.1/source/i18n/smpdtfmt.o build/opt/third_party/icu4c-57.1/source/i18n/csrucode.o build/opt/third_party/icu4c-57.1/source/i18n/plurrule.o build/opt/third_party/icu4c-57.1/source/i18n/csrsbcs.o build/opt/third_party/icu4c-57.1/source/i18n/windtfmt.o build/opt/third_party/icu4c-57.1/source/i18n/vzone.o build/opt/third_party/icu4c-57.1/source/i18n/regexcmp.o build/opt/third_party/icu4c-57.1/source/i18n/numsys.o build/opt/third_party/icu4c-57.1/source/i18n/tznames.o build/opt/third_party/icu4c-57.1/source/i18n/tzrule.o build/opt/third_party/icu4c-57.1/source/i18n/dtitvfmt.o build/opt/third_party/icu4c-57.1/source/i18n/utf8collationiterator.o build/opt/third_party/icu4c-57.1/source/i18n/collationdatawriter.o build/opt/third_party/icu4c-57.1/source/i18n/collationweights.o build/opt/third_party/icu4c-57.1/source/i18n/brktrans.o build/opt/third_party/icu4c-57.1/source/i18n/toupptrn.o build/opt/third_party/icu4c-57.1/source/i18n/transreg.o build/opt/third_party/icu4c-57.1/source/i18n/visibledigits.o build/opt/third_party/icu4c-57.1/source/i18n/ucal.o build/opt/third_party/icu4c-57.1/source/i18n/smallintformatter.o build/opt/third_party/icu4c-57.1/source/i18n/search.o build/opt/third_party/icu4c-57.1/source/i18n/islamcal.o build/opt/third_party/icu4c-57.1/source/i18n/coll.o build/opt/third_party/icu4c-57.1/source/i18n/datefmt.o build/opt/third_party/icu4c-57.1/source/i18n/regeximp.o build/opt/third_party/icu4c-57.1/source/i18n/coleitr.o build/opt/third_party/icu4c-57.1/source/i18n/titletrn.o build/opt/third_party/icu4c-57.1/source/i18n/dtfmtsym.o build/opt/third_party/icu4c-57.1/source/i18n/inputext.o build/opt/third_party/icu4c-57.1/source/i18n/valueformatter.o build/opt/third_party/icu4c-57.1/source/i18n/decContext.o build/opt/third_party/icu4c-57.1/source/i18n/currpinf.o build/opt/third_party/icu4c-57.1/source/i18n/gregoimp.o build/opt/third_party/icu4c-57.1/source/i18n/anytrans.o build/opt/third_party/icu4c-57.1/source/i18n/tzgnames.o build/opt/third_party/icu4c-57.1/source/i18n/ucoleitr.o build/opt/third_party/icu4c-57.1/source/i18n/nfrule.o build/opt/third_party/icu4c-57.1/source/i18n/sharedbreakiterator.o build/opt/third_party/icu4c-57.1/source/i18n/cecal.o build/opt/third_party/icu4c-57.1/source/i18n/quantityformatter.o build/opt/third_party/icu4c-57.1/source/i18n/collationfastlatinbuilder.o build/opt/third_party/icu4c-57.1/source/i18n/unumsys.o build/opt/third_party/icu4c-57.1/source/i18n/ufieldpositer.o build/opt/third_party/icu4c-57.1/source/i18n/uspoof_build.o build/opt/third_party/icu4c-57.1/source/i18n/dtitvinf.o build/opt/third_party/icu4c-57.1/source/i18n/decfmtst.o build/opt/third_party/icu4c-57.1/source/i18n/nfsubs.o build/opt/third_party/icu4c-57.1/source/i18n/umsg.o build/opt/third_party/icu4c-57.1/source/i18n/collationsets.o build/opt/third_party/icu4c-57.1/source/i18n/strrepl.o build/opt/third_party/icu4c-57.1/source/i18n/csrmbcs.o build/opt/third_party/icu4c-57.1/source/i18n/ucol.o build/opt/third_party/icu4c-57.1/source/i18n/nfrs.o build/opt/third_party/icu4c-57.1/source/i18n/measure.o build/opt/third_party/icu4c-57.1/source/i18n/uspoof.o build/opt/third_party/icu4c-57.1/source/i18n/rbt_set.o build/opt/third_party/icu4c-57.1/source/i18n/csrecog.o build/opt/third_party/icu4c-57.1/source/i18n/reldatefmt.o build/opt/third_party/icu4c-57.1/source/i18n/utrans.o build/opt/third_party/icu4c-57.1/source/i18n/reldtfmt.o build/opt/third_party/icu4c-57.1/source/i18n/digitformatter.o build/opt/third_party/icu4c-57.1/source/i18n/buddhcal.o build/opt/third_party/icu4c-57.1/source/i18n/chnsecal.o build/opt/third_party/icu4c-57.1/source/i18n/numfmt.o build/opt/third_party/icu4c-57.1/source/i18n/collationsettings.o build/opt/third_party/icu4c-57.1/source/i18n/udatpg.o build/opt/third_party/icu4c-57.1/source/i18n/ucol_sit.o build/opt/third_party/icu4c-57.1/source/i18n/uspoof_impl.o build/opt/third_party/icu4c-57.1/source/i18n/digitinterval.o build/opt/third_party/icu4c-57.1/source/i18n/csmatch.o build/opt/third_party/icu4c-57.1/source/i18n/gregocal.o build/opt/third_party/icu4c-57.1/source/i18n/collationkeys.o build/opt/third_party/icu4c-57.1/source/i18n/rbt_data.o build/opt/third_party/icu4c-57.1/source/i18n/collationtailoring.o build/opt/third_party/icu4c-57.1/source/i18n/uregexc.o build/opt/third_party/icu4c-57.1/source/i18n/dtrule.o build/opt/third_party/icu4c-57.1/source/i18n/coptccal.o build/opt/third_party/icu4c-57.1/source/i18n/csdetect.o build/opt/third_party/icu4c-57.1/source/i18n/plurfmt.o build/opt/third_party/icu4c-57.1/source/i18n/astro.o build/opt/third_party/icu4c-57.1/source/i18n/fpositer.o build/opt/third_party/icu4c-57.1/source/i18n/simpletz.o build/opt/third_party/icu4c-57.1/source/i18n/measunit.o build/opt/third_party/icu4c-57.1/source/i18n/uregion.o build/opt/third_party/icu4c-57.1/source/i18n/uspoof_conf.o build/opt/third_party/icu4c-57.1/source/i18n/uspoof_wsconf.o build/opt/third_party/icu4c-57.1/source/i18n/currfmt.o build/opt/third_party/icu4c-57.1/source/i18n/pluralaffix.o build/opt/third_party/icu4c-57.1/source/i18n/collationcompare.o build/opt/third_party/icu4c-57.1/source/i18n/csrutf8.o build/opt/third_party/icu4c-57.1/source/i18n/collationfastlatin.o build/opt/third_party/icu4c-57.1/source/i18n/name2uni.o build/opt/third_party/icu4c-57.1/source/i18n/nortrans.o build/opt/third_party/icu4c-57.1/source/i18n/unum.o build/opt/third_party/icu4c-57.1/source/i18n/digitlst.o build/opt/third_party/icu4c-57.1/source/i18n/fphdlimp.o build/opt/third_party/icu4c-57.1/source/i18n/collationdata.o build/opt/third_party/icu4c-57.1/source/i18n/csr2022.o build/opt/third_party/icu4c-57.1/source/i18n/ztrans.o build/opt/third_party/icu4c-57.1/source/i18n/currunit.o build/opt/third_party/icu4c-57.1/source/i18n/ucsdet.o build/opt/third_party/icu4c-57.1/source/i18n/utf16collationiterator.o build/opt/third_party/icu4c-57.1/source/i18n/digitaffixesandpadding.o build/opt/third_party/icu4c-57.1/source/i18n/tmutamt.o build/opt/third_party/icu4c-57.1/source/i18n/esctrn.o build/opt/third_party/icu4c-57.1/source/i18n/tolowtrn.o build/opt/third_party/icu4c-57.1/source/i18n/repattrn.o build/opt/third_party/icu4c-57.1/source/i18n/wintzimpl.o build/opt/third_party/icu4c-57.1/source/i18n/alphaindex.o build/opt/third_party/icu4c-57.1/source/i18n/cpdtrans.o build/opt/third_party/icu4c-57.1/source/i18n/uregex.o build/opt/third_party/icu4c-57.1/source/i18n/unesctrn.o build/opt/third_party/icu4c-57.1/source/i18n/winnmfmt.o build/opt/third_party/icu4c-57.1/source/i18n/remtrans.o build/opt/third_party/icu4c-57.1/source/i18n/scriptset.o build/opt/mongo/util/periodic_runner.o build/opt/third_party/shim_stemmer.o build/opt/mongo/db/keys_collection_client_sharded.o build/opt/mongo/db/repl/storage_interface.o build/opt/mongo/db/auth/privilege.o build/opt/mongo/db/auth/action_type.o build/opt/mongo/db/auth/privilege_parser.o build/opt/mongo/db/auth/address_restriction_gen.o build/opt/mongo/db/auth/address_restriction.o build/opt/mongo/db/auth/action_set.o build/opt/mongo/db/auth/impersonation_session.o build/opt/mongo/db/auth/resource_pattern.o build/opt/mongo/db/auth/user_management_commands_parser.o build/opt/third_party/fmt/dist/src/posix.o build/opt/third_party/fmt/dist/src/format.o build/opt/mongo/db/fts/fts_query_noop.o build/opt/third_party/pcre-8.42/pcre_string_utils.o build/opt/third_party/pcre-8.42/pcre_byte_order.o build/opt/third_party/pcre-8.42/pcre_chartables.o build/opt/third_party/pcre-8.42/pcre_ord2utf8.o build/opt/third_party/pcre-8.42/pcre_tables.o build/opt/third_party/pcre-8.42/pcre_newline.o build/opt/third_party/pcre-8.42/pcre_globals.o build/opt/third_party/pcre-8.42/pcre_compile.o build/opt/third_party/pcre-8.42/pcre_dfa_exec.o build/opt/third_party/pcre-8.42/pcre_ucd.o build/opt/third_party/pcre-8.42/pcre_scanner.o build/opt/third_party/pcre-8.42/pcre_exec.o build/opt/third_party/pcre-8.42/pcre_valid_utf8.o build/opt/third_party/pcre-8.42/pcre_stringpiece.o build/opt/third_party/pcre-8.42/pcre_get.o build/opt/third_party/pcre-8.42/pcre_refcount.o build/opt/third_party/pcre-8.42/pcre_version.o build/opt/third_party/pcre-8.42/pcre_maketables.o build/opt/third_party/pcre-8.42/pcrecpp.o build/opt/third_party/pcre-8.42/pcre_xclass.o build/opt/third_party/pcre-8.42/pcre_study.o build/opt/third_party/pcre-8.42/pcre_config.o build/opt/third_party/pcre-8.42/pcre_fullinfo.o build/opt/mongo/idl/server_parameter_with_storage.o build/opt/mongo/idl/server_parameter.o build/opt/mongo/executor/network_interface_thread_pool.o build/opt/third_party/shim_pcrecpp.o build/opt/third_party/shim_allocator.o build/opt/third_party/zstandard-1.3.7/zstd/lib/deprecated/zbuff_decompress.o build/opt/third_party/zstandard-1.3.7/zstd/lib/dictBuilder/divsufsort.o build/opt/third_party/zstandard-1.3.7/zstd/lib/common/pool.o build/opt/third_party/zstandard-1.3.7/zstd/lib/dictBuilder/fastcover.o build/opt/third_party/zstandard-1.3.7/zstd/lib/common/error_private.o build/opt/third_party/zstandard-1.3.7/zstd/lib/decompress/huf_decompress.o build/opt/third_party/zstandard-1.3.7/zstd/lib/deprecated/zbuff_common.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/hist.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_compress.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/huf_compress.o build/opt/third_party/zstandard-1.3.7/zstd/lib/dictBuilder/cover.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_ldm.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_opt.o build/opt/third_party/zstandard-1.3.7/zstd/lib/common/fse_decompress.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_fast.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/fse_compress.o build/opt/third_party/zstandard-1.3.7/zstd/lib/common/entropy_common.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_double_fast.o build/opt/third_party/zstandard-1.3.7/zstd/lib/common/zstd_common.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/zstdmt_compress.o build/opt/third_party/zstandard-1.3.7/zstd/lib/decompress/zstd_decompress.o build/opt/third_party/zstandard-1.3.7/zstd/lib/dictBuilder/zdict.o build/opt/third_party/zstandard-1.3.7/zstd/lib/common/threading.o build/opt/third_party/zstandard-1.3.7/zstd/lib/compress/zstd_lazy.o build/opt/third_party/zstandard-1.3.7/zstd/lib/common/xxhash.o build/opt/third_party/zstandard-1.3.7/zstd/lib/deprecated/zbuff_compress.o build/opt/mongo/db/pipeline/exchange_spec_gen.o build/opt/mongo/db/pipeline/document_source_merge_modes_gen.o build/opt/mongo/db/pipeline/resume_token.o build/opt/mongo/db/pipeline/document_source_list_sessions_gen.o build/opt/mongo/db/pipeline/document_source_merge_gen.o build/opt/mongo/db/pipeline/document_source_replace_root_gen.o build/opt/mongo/db/pipeline/value_gen.o build/opt/mongo/db/pipeline/document_source_change_stream_gen.o build/opt/third_party/boost-1.70.0/libs/program_options/src/value_semantic.o build/opt/mongo/db/pipeline/document_source_merge_spec.o build/opt/third_party/boost-1.70.0/libs/program_options/src/config_file.o build/opt/third_party/boost-1.70.0/libs/program_options/src/winmain.o build/opt/third_party/boost-1.70.0/libs/program_options/src/parsers.o build/opt/third_party/boost-1.70.0/libs/program_options/src/positional_options.o build/opt/third_party/boost-1.70.0/libs/program_options/src/utf8_codecvt_facet.o build/opt/third_party/boost-1.70.0/libs/program_options/src/options_description.o build/opt/third_party/boost-1.70.0/libs/program_options/src/variables_map.o build/opt/third_party/boost-1.70.0/libs/program_options/src/cmdline.o build/opt/third_party/boost-1.70.0/libs/program_options/src/split.o build/opt/third_party/boost-1.70.0/libs/program_options/src/convert.o build/opt/mongo/shell/bench.o build/opt/mongo/shell/kms_aws.o build/opt/mongo/shell/kms_gen.o build/opt/mongo/shell/kms.o build/opt/mongo/shell/kms_local.o build/opt/mongo/client/connection_string.o build/opt/mongo/client/mongo_uri.o build/opt/mongo/util/intrusive_counter.o build/opt/mongo/s/catalog/sharding_catalog_client.o build/opt/mongo/shell/shell_utils_launcher.o build/opt/mongo/shell/shell_options.o build/opt/mongo/shell/shell_utils.o build/opt/mongo/shell/mk_wcwidth.o build/opt/mongo/shell/linenoise.o build/opt/mongo/shell/shell_utils_extended.o build/opt/mongo/shell/mongo-server.o build/opt/mongo/db/catalog/index_catalog.o build/opt/mongo/util/debugger.o build/opt/mongo/db/geo/big_polygon.o build/opt/mongo/db/geo/hash.o build/opt/mongo/db/geo/shapes.o build/opt/mongo/db/geo/r2_region_coverer.o build/opt/mongo/db/query/explain_options.o build/opt/mongo/scripting/bson_template_evaluator.o build/opt/third_party/s2/base/strtoint.o build/opt/third_party/s2/base/logging.o build/opt/third_party/s2/base/int128.o build/opt/third_party/s2/base/stringprintf.o build/opt/mongo/db/signed_logical_time.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_lround.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_log.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_sinh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_modf.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_nearbyintd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_modf.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_nexttowardd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_mod.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_erf.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_log10.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_exp2.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_lgamma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_frexp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_log1p.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_log2.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_next.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_powi.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_next.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_pow.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_uint32.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_log.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_string.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_rem.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/wcstod32.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_round.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_logb.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_expm1.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_sin.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_acos.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/strtod128.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_noncomp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_bid.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_scalb.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_cos.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_exp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_int8.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_exp10.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_fetestexcept.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_tan.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_cos.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_atan.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_acosh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_lgamma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_binarydecimal.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_logbd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_compare.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_exp2.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_erfc.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_logb.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_llrintd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_lround.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_scalb.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_expm1.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_scalb.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_minmax.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_mul.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_fma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_lgamma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_tanh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_string.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_atan2.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_trig.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_dpd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_uint16.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_round_integral.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_lrintd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_erf.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_acosh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_logbd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_tgamma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_lround.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_sqrt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_quantexpd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_2_str_tables.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_lrintd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_asinh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_add.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_int8.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_asinh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_exp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_logbd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_fdimd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_erf.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_tan.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_next.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_sinh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_sqrt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_log10.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_cbrt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_uint16.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_ops.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_noncomp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_atanh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_cbrt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_sqrt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_rem.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/strtod64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_round_integral.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_fmod.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_fma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_erfc.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_pow.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_fesetexceptflag.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_atanh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_feraiseexcept.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_fdimd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_tgamma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_minmax.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_decimal_data.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_add.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_exception.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_sub.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_string.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_lrintd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_bessel.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_inv_hyper.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_convert_data.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_ldexp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_atan2.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_asin.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_erfc.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_cosh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_frexp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_sin.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_scalbl.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_llrintd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_hypot.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_int32.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_fdimd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_hypot.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_log2.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_atan.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_div.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_div.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_modf.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_int32.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_int.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_logb.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_fmod.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_rem.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_frexp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_sinh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_quantize.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_log.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_ldexp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/wcstod64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_log1p.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_lgamma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_inv_trig.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_asin.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_int64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_uint32.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_int64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_tgamma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_int32.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_ops_64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_uint64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_feclearexcept.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_ux_exp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_pow.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_cos.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_log10.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_uint64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_quantexpd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_scalbl.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_tanh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_uint64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_log.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_mul.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_int16.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_sqrt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_exp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_nexttowardd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/sqrt_tab_t.o build/opt/third_party/IntelRDFPMathLib20U1/dpml_log1p_t.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_atan.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_nexttowardd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_div.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_uint16.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_asin.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_uint8.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_acosh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_round_integral.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_flag_operations.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_cosh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_expm1.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_exp10.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_add.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_atanh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_cbrt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_minmax.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_int16.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_fma.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_uint8.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_nearbyintd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_asinh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_cosh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_acos.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_uint32.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_mul.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_exp2.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_hypot.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_int64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_quantexpd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_int8.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_quantize.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_scalbl.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_fmod.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/float128/dpml_four_over_pi.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_tan.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_log1p.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_compare.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_acos.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_noncomp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_from_int.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_bid128.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_erf.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_decimal_globals.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_uint8.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_exp10.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_ldexp.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_to_bid64.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_cbrt.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/strtod32.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_to_bid128.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_log2.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid_fegetexceptflag.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_tanh.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_quantize.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_nearbyintd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_llrintd.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/wcstod128.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid64_pow.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_to_int16.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid32_sin.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_atan2.o build/opt/third_party/IntelRDFPMathLib20U1/LIBRARY/src/bid128_compare.o build/opt/mongo/db/log_process_details.o build/opt/mongo/db/cluster_auth_mode_option_gen.o build/opt/mongo/db/keyfile_option_gen.o build/opt/mongo/db/server_options_base.o build/opt/mongo/db/server_options_general_gen.o build/opt/mongo/db/server_options_base_gen.o build/opt/mongo/db/server_options_nongeneral_gen.o build/opt/mongo/db/write_concern_options.o build/opt/mongo/base/secure_allocator.o build/opt/mongo/client/authenticate.o build/opt/mongo/db/index_names.o build/opt/mongo/util/options_parser/options_parser_init.o build/opt/mongo/db/query/datetime/date_time_support.o build/opt/mongo/client/query.o build/opt/mongo/db/views/resolved_view.o build/opt/mongo/util/icu.o build/opt/mongo/db/pipeline/variables.o build/opt/mongo/db/pipeline/expression_context.o build/opt/mongo/db/stats/counters.o build/opt/third_party/shim_zlib.o build/opt/mongo/util/fail_point.o build/opt/mongo/util/fail_point_service.o build/opt/mongo/util/icu_init.o build/opt/mongo/scripting/jsexception.o build/opt/mongo/util/fail_point_registry.o build/opt/mongo/util/fail_point_server_parameter_gen.o build/opt/mongo/scripting/utils.o build/opt/mongo/scripting/engine.o build/opt/mongo/scripting/deadline_monitor.o build/opt/mongo/scripting/deadline_monitor_gen.o build/opt/mongo/scripting/dbdirectclient_factory.o build/opt/mongo/rpc/get_status_from_command_result.o build/opt/mongo/rpc/write_concern_error_detail.o build/opt/mongo/executor/egress_tag_closer_manager.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_acosh.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_atan2.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_sinh.o build/opt/third_party/mozjs-60/extract/mozglue/misc/StackWalk.o build/opt/third_party/mozjs-60/mongo_sources/freeOpToJSContext.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_asinh.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_pow.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src32.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_copysign.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src36.o build/opt/third_party/mozjs-60/extract/js/src/gc/StoreBuffer.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_log2.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src21.o build/opt/third_party/mozjs-60/extract/mozglue/misc/TimeStamp_posix.o build/opt/third_party/mozjs-60/extract/js/src/util/DoubleToString.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src7.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_asin.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_cosh.o build/opt/third_party/mozjs-60/extract/js/src/jsarray.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_truncf.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src22.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_ceil.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_acos.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src30.o build/opt/third_party/mozjs-60/extract/mfbt/lz4.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_floor.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src42.o build/opt/third_party/mozjs-60/extract/js/src/jsmath.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src6.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src23.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src39.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src13.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_rintf.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_fabs.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src9.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src40.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src2.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src20.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src27.o build/opt/third_party/mozjs-60/extract/mozglue/misc/ConditionVariable_posix.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src15.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_log.o build/opt/third_party/mozjs-60/mongo_sources/mongoErrorReportToString.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src14.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src3.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src25.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src8.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_log1p.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src10.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_expm1.o build/opt/third_party/mozjs-60/extract/js/src/perf/pm_stub.o build/opt/third_party/mozjs-60/extract/js/src/builtin/RegExp.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_cbrt.o build/opt/third_party/mozjs-60/extract/js/src/vm/JSAtom.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_floorf.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_log10.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src17.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src44.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src38.o build/opt/third_party/mozjs-60/extract/mfbt/Compression.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src16.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src35.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src28.o build/opt/third_party/mozjs-60/extract/js/src/jit/x86-shared/Disassembler-x86-shared.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src12.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_hypot.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_ceilf.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_atan.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src24.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src37.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_trunc.o build/opt/third_party/mozjs-60/extract/mozglue/misc/Printf.o build/opt/third_party/mozjs-60/extract/mfbt/double-conversion/double-conversion/strtod.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_tanh.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/k_exp.o build/opt/third_party/mozjs-60/extract/js/src/mfbt/Unified_cpp_mfbt0.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_atanh.o build/opt/third_party/mozjs-60/extract/mozglue/misc/TimeStamp.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src0.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src29.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src18.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src45.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_exp.o build/opt/third_party/mozjs-60/extract/js/src/vm/Interpreter.o build/opt/third_party/mozjs-60/extract/mozglue/misc/Mutex_posix.o build/opt/third_party/mozjs-60/extract/js/src/frontend/Parser.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src31.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src33.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_rint.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/e_sqrt.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src11.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src41.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_scalbn.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src1.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src34.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src43.o build/opt/third_party/mozjs-60/extract/modules/fdlibm/s_nearbyint.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src4.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src19.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src5.o build/opt/third_party/mozjs-60/platform/x86_64/macOS/build/Unified_cpp_js_src26.o build/opt/mongo/db/fts/stop_words_list.o build/opt/mongo/db/fts/fts_basic_tokenizer.o build/opt/mongo/db/fts/fts_language.o build/opt/mongo/db/fts/stop_words.o build/opt/mongo/db/fts/fts_query_parser.o build/opt/mongo/db/fts/fts_unicode_phrase_matcher.o build/opt/mongo/db/fts/fts_matcher.o build/opt/mongo/db/fts/stemmer.o build/opt/mongo/db/fts/tokenizer.o build/opt/mongo/db/fts/fts_unicode_tokenizer.o build/opt/mongo/db/fts/fts_util.o build/opt/mongo/db/fts/fts_element_iterator.o build/opt/mongo/db/fts/fts_index_format.o build/opt/mongo/db/fts/fts_spec.o build/opt/mongo/db/fts/fts_query_impl.o build/opt/mongo/db/fts/fts_spec_legacy.o build/opt/mongo/db/fts/fts_basic_phrase_matcher.o build/opt/third_party/timelib-2018.01/parse_zoneinfo.o build/opt/third_party/timelib-2018.01/timelib.o build/opt/third_party/timelib-2018.01/parse_iso_intervals.o build/opt/third_party/timelib-2018.01/unixtime2tm.o build/opt/third_party/timelib-2018.01/parse_date.o build/opt/third_party/timelib-2018.01/tm2unixtime.o build/opt/third_party/timelib-2018.01/parse_tz.o build/opt/third_party/timelib-2018.01/astro.o build/opt/third_party/timelib-2018.01/dow.o build/opt/third_party/timelib-2018.01/interval.o build/opt/mongo/db/command_generic_argument.o build/opt/third_party/shim_boost.o build/opt/mongo/db/concurrency/flow_control_ticketholder.o build/opt/mongo/db/time_proof_service.o build/opt/mongo/db/storage/duplicate_key_error_info.o build/opt/third_party/abseil-cpp-master/abseil-cpp/absl/hash/internal/hash.o build/opt/third_party/abseil-cpp-master/abseil-cpp/absl/hash/internal/city.o build/opt/mongo/util/quick_exit.o build/opt/third_party/icu4c-57.1/source/stubdata/stubdata.o build/opt/mongo/scripting/mozjs/dbquery.o build/opt/mongo/scripting/mozjs/jscustomallocator.o build/opt/mongo/scripting/mozjs/db.o build/opt/mongo/scripting/mozjs/bindata.o build/opt/mongo/scripting/mozjs/engine.o build/opt/mongo/scripting/mozjs/numberlong.o build/opt/mongo/scripting/mozjs/timestamp.o build/opt/mongo/scripting/mozjs/object.o build/opt/mongo/scripting/mozjs/objectwrapper.o build/opt/mongo/scripting/mozjs/global.o build/opt/mongo/scripting/mozjs/dbcollection.o build/opt/mongo/scripting/mozjs/cursor.o build/opt/mongo/scripting/mozjs/PosixNSPR.o build/opt/mongo/scripting/mozjs/uri.o build/opt/mongo/scripting/mozjs/internedstring.o build/opt/mongo/scripting/mozjs/session.o build/opt/mongo/scripting/mozjs/base.o build/opt/mongo/scripting/mozjs/exception.o build/opt/mongo/scripting/mozjs/proxyscope.o build/opt/mongo/scripting/mozjs/jsthread.o build/opt/mongo/scripting/mozjs/mongohelpers_js.o build/opt/mongo/scripting/mozjs/error.o build/opt/mongo/scripting/mozjs/numberdecimal.o build/opt/mongo/scripting/mozjs/code.o build/opt/mongo/scripting/mozjs/mongo.o build/opt/mongo/scripting/mozjs/nativefunction.o build/opt/mongo/scripting/mozjs/jsstringwrapper.o build/opt/mongo/scripting/mozjs/engine_gen.o build/opt/mongo/scripting/mozjs/numberint.o build/opt/mongo/scripting/mozjs/maxkey.o build/opt/mongo/scripting/mozjs/dbref.o build/opt/mongo/scripting/mozjs/mongohelpers.o build/opt/mongo/scripting/mozjs/bson.o build/opt/mongo/scripting/mozjs/regexp.o build/opt/mongo/scripting/mozjs/idwrapper.o build/opt/mongo/scripting/mozjs/status.o build/opt/mongo/scripting/mozjs/cursor_handle.o build/opt/mongo/scripting/mozjs/oid.o build/opt/mongo/scripting/mozjs/valuewriter.o build/opt/mongo/scripting/mozjs/minkey.o build/opt/mongo/scripting/mozjs/dbpointer.o build/opt/mongo/scripting/mozjs/implscope.o build/opt/mongo/scripting/mozjs/scripting_util_gen.o build/opt/mongo/scripting/mozjs/valuereader.o build/opt/mongo/scripting/mozjs/countdownlatch.o build/opt/mongo/util/concurrency/spin_lock.o build/opt/third_party/snappy-1.1.7/snappy.o build/opt/third_party/snappy-1.1.7/snappy-sinksource.o build/opt/third_party/snappy-1.1.7/snappy-c.o build/opt/mongo/db/bson/dotted_path_support.o build/opt/third_party/icu4c-57.1/source/common/resbund_cnv.o build/opt/third_party/icu4c-57.1/source/common/ucase.o build/opt/third_party/icu4c-57.1/source/common/uprops.o build/opt/third_party/icu4c-57.1/source/common/punycode.o build/opt/third_party/icu4c-57.1/source/common/uvectr32.o build/opt/third_party/icu4c-57.1/source/common/uinit.o build/opt/third_party/icu4c-57.1/source/common/ustrcase.o build/opt/third_party/icu4c-57.1/source/common/unormcmp.o build/opt/third_party/icu4c-57.1/source/common/utrie2_builder.o build/opt/third_party/icu4c-57.1/source/common/unames.o build/opt/third_party/icu4c-57.1/source/common/uts46.o build/opt/third_party/icu4c-57.1/source/common/uloc_keytype.o build/opt/third_party/icu4c-57.1/source/common/uhash.o build/opt/third_party/icu4c-57.1/source/common/ucnv_ext.o build/opt/third_party/icu4c-57.1/source/common/bytestriebuilder.o build/opt/third_party/icu4c-57.1/source/common/cstring.o build/opt/third_party/icu4c-57.1/source/common/ures_cnv.o build/opt/third_party/icu4c-57.1/source/common/filterednormalizer2.o build/opt/third_party/icu4c-57.1/source/common/wintz.o build/opt/third_party/icu4c-57.1/source/common/ucnv_u7.o build/opt/third_party/icu4c-57.1/source/common/cmemory.o build/opt/third_party/icu4c-57.1/source/common/utrace.o build/opt/third_party/icu4c-57.1/source/common/parsepos.o build/opt/third_party/icu4c-57.1/source/common/charstr.o build/opt/third_party/icu4c-57.1/source/common/locdispnames.o build/opt/third_party/icu4c-57.1/source/common/unifunct.o build/opt/third_party/icu4c-57.1/source/common/uarrsort.o build/opt/third_party/icu4c-57.1/source/common/ustack.o build/opt/third_party/icu4c-57.1/source/common/ucnv.o build/opt/third_party/icu4c-57.1/source/common/locid.o build/opt/third_party/icu4c-57.1/source/common/normlzr.o build/opt/third_party/icu4c-57.1/source/common/umath.o build/opt/third_party/icu4c-57.1/source/common/brkiter.o build/opt/third_party/icu4c-57.1/source/common/uscript.o build/opt/third_party/icu4c-57.1/source/common/icudataver.o build/opt/third_party/icu4c-57.1/source/common/ucnv_cb.o build/opt/third_party/icu4c-57.1/source/common/ubidi_props.o build/opt/third_party/icu4c-57.1/source/common/unistr_props.o build/opt/third_party/icu4c-57.1/source/common/ubidiln.o build/opt/third_party/icu4c-57.1/source/common/rbbiscan.o build/opt/third_party/icu4c-57.1/source/common/ucnv_err.o build/opt/third_party/icu4c-57.1/source/common/stringtriebuilder.o build/opt/third_party/icu4c-57.1/source/common/util.o build/opt/third_party/icu4c-57.1/source/common/ucnvsel.o build/opt/third_party/icu4c-57.1/source/common/uresbund.o build/opt/third_party/icu4c-57.1/source/common/ulist.o build/opt/third_party/icu4c-57.1/source/common/servls.o build/opt/third_party/icu4c-57.1/source/common/udatamem.o build/opt/third_party/icu4c-57.1/source/common/stringpiece.o build/opt/third_party/icu4c-57.1/source/common/ubrk.o build/opt/third_party/icu4c-57.1/source/common/messagepattern.o build/opt/third_party/icu4c-57.1/source/common/ucasemap.o build/opt/third_party/icu4c-57.1/source/common/uloc.o build/opt/third_party/icu4c-57.1/source/common/ucnvhz.o build/opt/third_party/icu4c-57.1/source/common/ustr_titlecase_brkiter.o build/opt/third_party/icu4c-57.1/source/common/ushape.o build/opt/third_party/icu4c-57.1/source/common/bytestrie.o build/opt/third_party/icu4c-57.1/source/common/ucnv_io.o build/opt/third_party/icu4c-57.1/source/common/ucnv_u32.o build/opt/third_party/icu4c-57.1/source/common/serv.o build/opt/third_party/icu4c-57.1/source/common/sharedobject.o build/opt/third_party/icu4c-57.1/source/common/uniset.o build/opt/third_party/icu4c-57.1/source/common/unistr_titlecase_brkiter.o build/opt/third_party/icu4c-57.1/source/common/normalizer2.o build/opt/third_party/icu4c-57.1/source/common/uvector.o build/opt/third_party/icu4c-57.1/source/common/unistr_case_locale.o build/opt/third_party/icu4c-57.1/source/common/brkeng.o build/opt/third_party/icu4c-57.1/source/common/ustr_cnv.o build/opt/third_party/icu4c-57.1/source/common/ucnv2022.o build/opt/third_party/icu4c-57.1/source/common/ucharstrieiterator.o build/opt/third_party/icu4c-57.1/source/common/servlkf.o build/opt/third_party/icu4c-57.1/source/common/umutex.o build/opt/third_party/icu4c-57.1/source/common/servnotf.o build/opt/third_party/icu4c-57.1/source/common/rbbi.o build/opt/third_party/icu4c-57.1/source/common/ucharstriebuilder.o build/opt/third_party/icu4c-57.1/source/common/dtintrv.o build/opt/third_party/icu4c-57.1/source/common/ucol_swp.o build/opt/third_party/icu4c-57.1/source/common/cstr.o build/opt/third_party/icu4c-57.1/source/common/unistr_cnv.o build/opt/third_party/icu4c-57.1/source/common/rbbisetb.o build/opt/third_party/icu4c-57.1/source/common/uhash_us.o build/opt/third_party/icu4c-57.1/source/common/ucnvlat1.o build/opt/third_party/icu4c-57.1/source/common/ustrfmt.o build/opt/third_party/icu4c-57.1/source/common/listformatter.o build/opt/third_party/icu4c-57.1/source/common/usc_impl.o build/opt/third_party/icu4c-57.1/source/common/uenum.o build/opt/third_party/icu4c-57.1/source/common/propsvec.o build/opt/third_party/icu4c-57.1/source/common/unifilt.o build/opt/third_party/icu4c-57.1/source/common/uobject.o build/opt/third_party/icu4c-57.1/source/common/uniset_props.o build/opt/third_party/icu4c-57.1/source/common/uniset_closure.o build/opt/third_party/icu4c-57.1/source/common/uresdata.o build/opt/third_party/icu4c-57.1/source/common/servrbf.o build/opt/third_party/icu4c-57.1/source/common/ruleiter.o build/opt/third_party/icu4c-57.1/source/common/resbund.o build/opt/third_party/icu4c-57.1/source/common/ucnv_u16.o build/opt/third_party/icu4c-57.1/source/common/pluralmap.o build/opt/third_party/icu4c-57.1/source/common/ucnv_set.o build/opt/third_party/icu4c-57.1/source/common/dictionarydata.o build/opt/third_party/icu4c-57.1/source/common/cwchar.o build/opt/third_party/icu4c-57.1/source/common/locresdata.o build/opt/third_party/icu4c-57.1/source/common/simpleformatter.o build/opt/third_party/icu4c-57.1/source/common/unistr.o build/opt/third_party/icu4c-57.1/source/common/ustrcase_locale.o build/opt/third_party/icu4c-57.1/source/common/umapfile.o build/opt/third_party/icu4c-57.1/source/common/usetiter.o build/opt/third_party/icu4c-57.1/source/common/rbbitblb.o build/opt/third_party/icu4c-57.1/source/common/ulistformatter.o build/opt/third_party/icu4c-57.1/source/common/ucat.o build/opt/third_party/icu4c-57.1/source/common/ucharstrie.o build/opt/third_party/icu4c-57.1/source/common/uset.o build/opt/third_party/icu4c-57.1/source/common/locutil.o build/opt/third_party/icu4c-57.1/source/common/ubidi.o build/opt/third_party/icu4c-57.1/source/common/ustrtrns.o build/opt/third_party/icu4c-57.1/source/common/ucnvbocu.o build/opt/third_party/icu4c-57.1/source/common/udataswp.o build/opt/third_party/icu4c-57.1/source/common/ucnvscsu.o build/opt/third_party/icu4c-57.1/source/common/utypes.o build/opt/third_party/icu4c-57.1/source/common/caniter.o build/opt/third_party/icu4c-57.1/source/common/filteredbrk.o build/opt/third_party/icu4c-57.1/source/common/bytestream.o build/opt/third_party/icu4c-57.1/source/common/udata.o build/opt/third_party/icu4c-57.1/source/common/usprep.o build/opt/third_party/icu4c-57.1/source/common/ucnv_ct.o build/opt/third_party/icu4c-57.1/source/common/uchar.o build/opt/third_party/icu4c-57.1/source/common/bmpset.o build/opt/third_party/icu4c-57.1/source/common/bytestrieiterator.o build/opt/third_party/icu4c-57.1/source/common/util_props.o build/opt/third_party/icu4c-57.1/source/common/patternprops.o build/opt/third_party/icu4c-57.1/source/common/unisetspan.o build/opt/third_party/icu4c-57.1/source/common/ucnv_bld.o build/opt/third_party/icu4c-57.1/source/common/ucnv_u8.o build/opt/third_party/icu4c-57.1/source/common/utrie.o build/opt/third_party/icu4c-57.1/source/common/uidna.o build/opt/third_party/icu4c-57.1/source/common/ucnvisci.o build/opt/third_party/icu4c-57.1/source/common/schriter.o build/opt/third_party/icu4c-57.1/source/common/unorm.o build/opt/third_party/icu4c-57.1/source/common/utrie2.o build/opt/third_party/icu4c-57.1/source/common/ucnvmbcs.o build/opt/third_party/icu4c-57.1/source/common/ustr_wcs.o build/opt/third_party/icu4c-57.1/source/common/errorcode.o build/opt/third_party/icu4c-57.1/source/common/ucnv_cnv.o build/opt/third_party/icu4c-57.1/source/common/ustrenum.o build/opt/third_party/icu4c-57.1/source/common/unistr_case.o build/opt/third_party/icu4c-57.1/source/common/propname.o build/opt/third_party/icu4c-57.1/source/common/ucasemap_titlecase_brkiter.o build/opt/third_party/icu4c-57.1/source/common/locdspnm.o build/opt/third_party/icu4c-57.1/source/common/putil.o build/opt/third_party/icu4c-57.1/source/common/ubidiwrt.o build/opt/third_party/icu4c-57.1/source/common/dictbe.o build/opt/third_party/icu4c-57.1/source/common/utf_impl.o build/opt/third_party/icu4c-57.1/source/common/locavailable.o build/opt/third_party/icu4c-57.1/source/common/uset_props.o build/opt/third_party/icu4c-57.1/source/common/loadednormalizer2impl.o build/opt/third_party/icu4c-57.1/source/common/uinvchar.o build/opt/third_party/icu4c-57.1/source/common/icuplug.o build/opt/third_party/icu4c-57.1/source/common/uvectr64.o build/opt/third_party/icu4c-57.1/source/common/ucln_cmn.o build/opt/third_party/icu4c-57.1/source/common/ustring.o build/opt/third_party/icu4c-57.1/source/common/unifiedcache.o build/opt/third_party/icu4c-57.1/source/common/servlk.o build/opt/third_party/icu4c-57.1/source/common/ucnv_lmb.o build/opt/third_party/icu4c-57.1/source/common/uscript_props.o build/opt/third_party/icu4c-57.1/source/common/ucnvdisp.o build/opt/third_party/icu4c-57.1/source/common/uiter.o build/opt/third_party/icu4c-57.1/source/common/uchriter.o build/opt/third_party/icu4c-57.1/source/common/appendable.o build/opt/third_party/icu4c-57.1/source/common/utext.o build/opt/third_party/icu4c-57.1/source/common/locbased.o build/opt/third_party/icu4c-57.1/source/common/ucmndata.o build/opt/third_party/icu4c-57.1/source/common/uloc_tag.o build/opt/third_party/icu4c-57.1/source/common/rbbirb.o build/opt/third_party/icu4c-57.1/source/common/rbbistbl.o build/opt/third_party/icu4c-57.1/source/common/servslkf.o build/opt/third_party/icu4c-57.1/source/common/chariter.o build/opt/third_party/icu4c-57.1/source/common/locmap.o build/opt/third_party/icu4c-57.1/source/common/resource.o build/opt/third_party/icu4c-57.1/source/common/normalizer2impl.o build/opt/third_party/icu4c-57.1/source/common/rbbinode.o build/opt/third_party/icu4c-57.1/source/common/loclikely.o build/opt/third_party/icu4c-57.1/source/common/ucurr.o build/opt/third_party/icu4c-57.1/source/common/rbbidata.o build/opt/mongo/transport/message_compressor_zstd.o build/opt/mongo/transport/message_compressor_registry.o build/opt/mongo/transport/message_compressor_metrics.o build/opt/mongo/transport/message_compressor_manager.o build/opt/mongo/transport/message_compressor_zlib.o build/opt/mongo/transport/message_compressor_snappy.o build/opt/mongo/db/catalog/index_catalog_entry.o build/opt/mongo/util/net/http_client_curl.o build/opt/mongo/db/keys_collection_document.o build/opt/mongo/db/pipeline/parsed_aggregation_projection_node.o build/opt/mongo/db/pipeline/parsed_inclusion_projection.o build/opt/mongo/db/pipeline/parsed_aggregation_projection.o build/opt/mongo/db/pipeline/parsed_exclusion_projection.o build/opt/mongo/db/pipeline/parsed_add_fields.o build/opt/mongo/crypto/symmetric_crypto.o build/opt/mongo/crypto/symmetric_crypto_apple.o build/opt/mongo/crypto/symmetric_key.o build/opt/mongo/db/logical_session_id_gen.o build/opt/mongo/db/logical_session_id.o build/opt/mongo/util/net/ssl_options.o build/opt/third_party/boost-1.70.0/libs/filesystem/src/path_traits.o build/opt/third_party/boost-1.70.0/libs/filesystem/src/utf8_codecvt_facet.o build/opt/third_party/boost-1.70.0/libs/filesystem/src/portability.o build/opt/third_party/boost-1.70.0/libs/filesystem/src/unique_path.o build/opt/third_party/boost-1.70.0/libs/filesystem/src/windows_file_codecvt.o build/opt/third_party/boost-1.70.0/libs/filesystem/src/operations.o build/opt/third_party/boost-1.70.0/libs/filesystem/src/codecvt_error_category.o build/opt/third_party/boost-1.70.0/libs/filesystem/src/path.o build/opt/mongo/util/concurrency/thread_name.o build/opt/mongo/util/exception_filter_win32.o build/opt/mongo/platform/stack_locator_macOS.o build/opt/mongo/base/error_codes.o build/opt/mongo/platform/shared_library_posix.o build/opt/mongo/bson/simple_bsonobj_comparator.o build/opt/mongo/util/base64.o build/opt/mongo/base/string_data.o build/opt/mongo/bson/bson_depth.o build/opt/mongo/platform/stack_locator.o build/opt/mongo/logger/logger.o build/opt/mongo/base/transaction_error.o build/opt/mongo/base/shim.o build/opt/mongo/logger/ramlog.o build/opt/mongo/base/data_type.o build/opt/mongo/base/initializer.o build/opt/mongo/util/time_support.o build/opt/mongo/base/global_initializer.o build/opt/mongo/util/file.o build/opt/mongo/util/boost_assert_impl.o build/opt/mongo/base/init.o build/opt/mongo/logger/message_event_utf8_encoder.o build/opt/mongo/base/data_type_string_data.o build/opt/mongo/bson/bsonmisc.o build/opt/mongo/util/startup_test.o build/opt/mongo/logger/rotatable_file_writer.o build/opt/mongo/util/errno_util.o build/opt/mongo/platform/shared_library.o build/opt/mongo/util/duration.o build/opt/mongo/logger/component_message_log_domain.o build/opt/mongo/platform/random.o build/opt/mongo/util/hex.o build/opt/mongo/bson/bson_validate.o build/opt/mongo/platform/strcasestr.o build/opt/mongo/util/signal_handlers_synchronous.o build/opt/mongo/platform/posix_fadvise.o build/opt/mongo/logger/console.o build/opt/mongo/bson/json.o build/opt/mongo/logger/message_log_domain.o build/opt/mongo/platform/process_id.o build/opt/mongo/util/stacktrace.o build/opt/mongo/util/log.o build/opt/mongo/logger/log_component_settings.o build/opt/mongo/base/validate_locale.o build/opt/mongo/base/initializer_dependency_graph.o build/opt/mongo/bson/bsontypes.o build/opt/mongo/logger/rotatable_file_manager.o build/opt/mongo/bson/bsonobj.o build/opt/mongo/bson/simple_bsonelement_comparator.o build/opt/mongo/util/system_tick_source.o build/opt/mongo/base/error_extra_info.o build/opt/mongo/util/itoa.o build/opt/mongo/base/global_initializer_registerer.o build/opt/mongo/platform/strnlen.o build/opt/mongo/platform/mutex.o build/opt/mongo/base/data_range_cursor.o build/opt/mongo/base/make_string_vector.o build/opt/mongo/util/stacktrace_posix.o build/opt/mongo/base/parse_number.o build/opt/mongo/util/timer.o build/opt/mongo/bson/timestamp.o build/opt/mongo/logger/logstream_builder.o build/opt/mongo/util/allocator.o build/opt/mongo/util/str.o build/opt/mongo/logger/log_severity.o build/opt/mongo/util/uuid.o build/opt/mongo/base/data_range.o build/opt/mongo/util/platform_init.o build/opt/mongo/util/system_clock_source.o build/opt/mongo/logger/redaction.o build/opt/mongo/util/concurrency/idle_thread_block.o build/opt/mongo/logger/log_component.o build/opt/mongo/util/exit.o build/opt/mongo/util/assert_util.o build/opt/mongo/bson/oid.o build/opt/mongo/base/data_type_terminated.o build/opt/mongo/platform/decimal128.o build/opt/mongo/util/text.o build/opt/mongo/bson/bson_comparator_interface_base.o build/opt/mongo/logger/log_manager.o build/opt/mongo/bson/bsonelement.o build/opt/mongo/util/version.o build/opt/mongo/util/shell_exec.o build/opt/mongo/base/simple_string_data_comparator.o build/opt/mongo/bson/bsonobjbuilder.o build/opt/mongo/base/status.o build/opt/mongo/rpc/metadata/client_metadata_ismaster.o build/opt/mongo/rpc/metadata/client_metadata.o build/opt/mongo/db/query/killcursors_response.o build/opt/mongo/db/query/cursor_response.o build/opt/mongo/db/query/count_command_gen.o build/opt/mongo/db/query/killcursors_request.o build/opt/mongo/db/query/count_command_as_aggregation_command.o build/opt/mongo/db/query/cursor_request.o build/opt/mongo/db/query/view_response_formatter.o build/opt/mongo/db/query/getmore_request.o build/opt/mongo/db/query/find_and_modify_request.o build/opt/mongo/db/query/count_request.o build/opt/mongo/db/storage/storage_options.o build/opt/mongo/db/exec/projection_exec_agg.o build/opt/mongo/db/storage/storage_parameters_gen.o build/opt/mongo/db/storage/write_unit_of_work.o build/opt/mongo/db/pipeline/dependencies.o build/opt/mongo/db/logical_time_validator.o build/opt/mongo/db/index/expression_keys_private.o build/opt/mongo/db/index/sort_key_generator.o build/opt/mongo/db/index/btree_key_generator.o build/opt/mongo/db/index/wildcard_key_generator.o build/opt/mongo/util/net/cidr.o build/opt/mongo/util/net/socket_utils.o build/opt/mongo/util/net/hostandport.o build/opt/mongo/util/net/hostname_canonicalization.o build/opt/mongo/util/net/sockaddr.o build/opt/mongo/util/net/hostandport_gen.o build/opt/mongo/util/net/socket_exception.o build/opt/mongo/util/password_digest.o build/opt/mongo/util/md5.o build/opt/mongo/executor/connection_pool_tl.o build/opt/mongo/executor/network_interface_tl.o build/opt/mongo/transport/transport_layer_manager.o build/opt/third_party/wiredtiger/src/checksum/software/checksum.o build/opt/third_party/wiredtiger/src/checksum/x86/crc32-x86.o build/opt/third_party/wiredtiger/src/checksum/x86/crc32-x86-alt.o build/opt/mongo/db/index/index_descriptor.o build/opt/third_party/abseil-cpp-master/abseil-cpp/absl/container/internal/raw_hash_set.o build/opt/mongo/db/pipeline/runtime_constants_gen.o build/opt/mongo/db/server_options_helpers.o build/opt/mongo/db/server_options_helpers_gen.o build/opt/mongo/db/query/hint_parser.o build/opt/mongo/db/query/hint_gen.o build/opt/mongo/shell/shell_options_gen.o build/opt/mongo/transport/service_executor_adaptive.o build/opt/mongo/transport/service_executor_reserved.o build/opt/mongo/transport/service_executor_synchronous.o build/opt/mongo/transport/service_executor_gen.o build/opt/mongo/transport/service_entry_point_utils.o build/opt/mongo/transport/transport_layer.o build/opt/mongo/transport/session.o build/opt/mongo/db/storage/key_string.o build/opt/third_party/shim_fmt.o build/opt/third_party/shim_snappy.o build/opt/mongo/rpc/metadata/impersonated_user_metadata.o build/opt/mongo/rpc/metadata/impersonated_user_metadata_gen.o build/opt/mongo/s/is_mongos.o build/opt/mongo/db/catalog/index_key_validate.o build/opt/mongo/shell/shell_options_storage.o build/opt/mongo/db/catalog/collection.o build/opt/mongo/db/hasher.o build/opt/mongo/util/cmdline_utils/censor_cmdline.o build/opt/mongo/s/database_version_gen.o build/opt/mongo/s/catalog/type_chunk_base_gen.o build/opt/mongo/s/catalog/type_database.o build/opt/mongo/s/request_types/split_chunk_request_type.o build/opt/mongo/s/shard_id.o build/opt/mongo/s/request_types/add_shard_request_type.o build/opt/mongo/s/catalog/type_changelog.o build/opt/mongo/s/catalog/type_shard_collection.o build/opt/mongo/s/request_types/add_shard_to_zone_request_type.o build/opt/mongo/s/request_types/remove_shard_from_zone_request_type.o build/opt/mongo/s/stale_exception.o build/opt/mongo/s/request_types/clone_catalog_data_gen.o build/opt/mongo/s/catalog/mongo_version_range.o build/opt/mongo/s/catalog/type_mongos.o build/opt/mongo/s/request_types/create_database_gen.o build/opt/mongo/s/chunk_version.o build/opt/mongo/s/request_types/shard_collection_gen.o build/opt/mongo/s/request_types/get_database_version_gen.o build/opt/mongo/s/would_change_owning_shard_exception.o build/opt/mongo/s/request_types/set_shard_version_request.o build/opt/mongo/s/request_types/move_chunk_request.o build/opt/mongo/s/catalog/type_collection.o build/opt/mongo/s/catalog/type_chunk.o build/opt/mongo/s/request_types/commit_chunk_migration_request_type.o build/opt/mongo/s/catalog/type_locks.o build/opt/mongo/s/request_types/flush_database_cache_updates_gen.o build/opt/mongo/s/catalog/type_lockpings.o build/opt/mongo/s/request_types/wait_for_fail_point_gen.o build/opt/mongo/s/request_types/migration_secondary_throttle_options.o build/opt/mongo/s/request_types/clear_jumbo_flag_gen.o build/opt/mongo/s/database_version_helpers.o build/opt/mongo/s/request_types/balance_chunk_request_type.o build/opt/mongo/s/catalog/type_shard_database.o build/opt/mongo/s/catalog/type_config_version.o build/opt/mongo/s/request_types/merge_chunk_request_type.o build/opt/mongo/s/request_types/flush_routing_table_cache_updates_gen.o build/opt/mongo/s/request_types/create_collection_gen.o build/opt/mongo/s/request_types/update_zone_key_range_request_type.o build/opt/mongo/s/catalog/type_tags.o build/opt/mongo/s/catalog/type_shard.o build/opt/mongo/s/cannot_implicitly_create_collection_info.o build/opt/mongo/s/chunk_version_gen.o build/opt/mongo/s/request_types/move_primary_gen.o build/opt/mongo/executor/network_interface.o build/opt/mongo/s/request_types/clone_collection_options_from_primary_shard_gen.o build/opt/mongo/db/commands.o build/opt/mongo/util/net/ssl_options_client.o build/opt/mongo/util/net/ssl_options_client_gen.o build/opt/mongo/db/repl/repl_settings_gen.o build/opt/mongo/db/repl/repl_settings.o build/opt/third_party/shim_mozjs.o"
  },
  {
    "path": "cmake/mongodb/windows-debug.objects",
    "content": "build\\debug\\mongo\\util\\net\\ssl_options_client.obj build\\debug\\mongo\\util\\net\\ssl_options_client_gen.obj build\\debug\\mongo\\transport\\message_compressor_options_client_gen.obj build\\debug\\mongo\\shell\\kms_shell.obj build\\debug\\mongo\\shell\\linenoise.obj build\\debug\\mongo\\shell\\mk_wcwidth.obj build\\debug\\mongo\\shell\\mongo-server.obj build\\debug\\mongo\\shell\\shell_options.obj build\\debug\\mongo\\shell\\shell_utils.obj build\\debug\\mongo\\shell\\shell_utils_extended.obj build\\debug\\mongo\\shell\\shell_utils_launcher.obj build\\debug\\mongo\\util\\version_impl.obj build\\debug\\mongo\\util\\signal_handlers.obj build\\debug\\mongo\\util\\signal_win32.obj build\\debug\\mongo\\db\\log_process_details.obj build\\debug\\mongo\\db\\server_options_server_helpers.obj build\\debug\\mongo\\db\\server_options_base.obj build\\debug\\mongo\\db\\cluster_auth_mode_option_gen.obj build\\debug\\mongo\\db\\keyfile_option_gen.obj build\\debug\\mongo\\db\\server_options_base_gen.obj build\\debug\\mongo\\db\\server_options_general_gen.obj build\\debug\\mongo\\db\\server_options_nongeneral_gen.obj build\\debug\\mongo\\db\\repl\\is_master_response.obj build\\debug\\mongo\\db\\repl\\member_config.obj build\\debug\\mongo\\db\\repl\\repl_set_config.obj build\\debug\\mongo\\db\\repl\\repl_set_heartbeat_args_v1.obj build\\debug\\mongo\\db\\repl\\repl_set_heartbeat_response.obj build\\debug\\mongo\\db\\repl\\repl_set_request_votes_args.obj build\\debug\\mongo\\db\\repl\\repl_set_tag.obj build\\debug\\mongo\\db\\repl\\update_position_args.obj build\\debug\\mongo\\db\\repl\\last_vote.obj build\\debug\\mongo\\db\\repl\\repl_set_config_gen.obj build\\debug\\mongo\\db\\repl\\split_horizon.obj build\\debug\\mongo\\db\\concurrency\\d_concurrency.obj build\\debug\\mongo\\db\\concurrency\\lock_manager.obj build\\debug\\mongo\\db\\concurrency\\lock_state.obj build\\debug\\mongo\\db\\concurrency\\lock_stats.obj build\\debug\\mongo\\db\\concurrency\\replication_state_transition_lock_guard.obj build\\debug\\mongo\\util\\concurrency\\ticketholder.obj build\\debug\\mongo\\db\\concurrency\\flow_control_ticketholder.obj build\\debug\\mongo\\util\\password.obj build\\debug\\mongo\\util\\password_params_gen.obj build\\debug\\mongo\\util\\options_parser\\options_parser_init.obj build\\debug\\mongo\\shell\\bench.obj build\\debug\\mongo\\db\\traffic_reader.obj build\\debug\\mongo\\db\\logical_session_id_helpers.obj build\\debug\\mongo\\db\\catalog\\index_key_validate.obj build\\debug\\mongo\\db\\index\\btree_key_generator.obj build\\debug\\mongo\\db\\index\\expression_keys_private.obj build\\debug\\mongo\\db\\index\\sort_key_generator.obj build\\debug\\mongo\\db\\index\\wildcard_key_generator.obj build\\debug\\mongo\\db\\exec\\projection_exec_agg.obj build\\debug\\mongo\\db\\pipeline\\parsed_aggregation_projection.obj build\\debug\\mongo\\db\\pipeline\\parsed_aggregation_projection_node.obj build\\debug\\mongo\\db\\pipeline\\parsed_exclusion_projection.obj build\\debug\\mongo\\db\\pipeline\\parsed_inclusion_projection.obj build\\debug\\mongo\\db\\pipeline\\parsed_add_fields.obj build\\debug\\mongo\\db\\index\\expression_params.obj build\\debug\\mongo\\db\\index\\s2_common.obj build\\debug\\mongo\\db\\hasher.obj build\\debug\\mongo\\db\\fts\\fts_index_format.obj build\\debug\\mongo\\db\\fts\\fts_matcher.obj build\\debug\\mongo\\db\\fts\\fts_query_impl.obj build\\debug\\mongo\\db\\fts\\fts_query_parser.obj build\\debug\\mongo\\db\\fts\\fts_spec.obj build\\debug\\mongo\\db\\fts\\fts_spec_legacy.obj build\\debug\\mongo\\db\\fts\\fts_language.obj build\\debug\\mongo\\db\\fts\\fts_basic_phrase_matcher.obj build\\debug\\mongo\\db\\fts\\fts_basic_tokenizer.obj build\\debug\\mongo\\db\\fts\\fts_unicode_phrase_matcher.obj build\\debug\\mongo\\db\\fts\\fts_unicode_tokenizer.obj build\\debug\\mongo\\db\\fts\\fts_util.obj build\\debug\\mongo\\db\\fts\\fts_element_iterator.obj build\\debug\\mongo\\db\\fts\\stemmer.obj build\\debug\\mongo\\db\\fts\\stop_words.obj build\\debug\\mongo\\db\\fts\\stop_words_list.obj build\\debug\\mongo\\db\\fts\\tokenizer.obj build\\debug\\third_party\\shim_stemmer.obj build\\debug\\third_party\\libstemmer_c\\runtime\\api.obj build\\debug\\third_party\\libstemmer_c\\libstemmer\\libstemmer_utf8.obj build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_dutch.obj build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_german.obj build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_porter.obj build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_spanish.obj build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_english.obj build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_hungarian.obj build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_portuguese.obj build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_swedish.obj build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_finnish.obj build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_italian.obj build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_romanian.obj build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_turkish.obj build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_danish.obj build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_french.obj build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_norwegian.obj build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_russian.obj build\\debug\\mongo\\db\\fts\\unicode\\codepoints_casefold.obj build\\debug\\mongo\\db\\fts\\unicode\\codepoints_delimiter_list.obj build\\debug\\mongo\\db\\fts\\unicode\\codepoints_diacritic_list.obj build\\debug\\mongo\\db\\fts\\unicode\\codepoints_diacritic_map.obj build\\debug\\mongo\\db\\fts\\unicode\\string.obj build\\debug\\mongo\\shell\\linenoise_utf8.obj build\\debug\\mongo\\db\\index\\index_descriptor.obj build\\debug\\mongo\\db\\catalog\\index_catalog.obj build\\debug\\mongo\\db\\catalog\\index_catalog_entry.obj build\\debug\\mongo\\db\\catalog\\disable_index_spec_namespace_generation_gen.obj build\\debug\\mongo\\shell\\encrypted_dbclient_base.obj build\\debug\\mongo\\shell\\fle_shell_options_gen.obj build\\debug\\mongo\\shell\\shell_options_gen.obj build\\debug\\mongo\\shell\\shell_options_storage.obj build\\debug\\mongo\\shell\\kms.obj build\\debug\\mongo\\shell\\kms_aws.obj build\\debug\\mongo\\shell\\kms_local.obj build\\debug\\mongo\\shell\\kms_gen.obj build\\debug\\third_party\\shim_kms_message.obj build\\debug\\third_party\\kms-message\\src\\hexlify.obj build\\debug\\third_party\\kms-message\\src\\kms_b64.obj build\\debug\\third_party\\kms-message\\src\\kms_decrypt_request.obj build\\debug\\third_party\\kms-message\\src\\kms_encrypt_request.obj build\\debug\\third_party\\kms-message\\src\\kms_kv_list.obj build\\debug\\third_party\\kms-message\\src\\kms_message.obj build\\debug\\third_party\\kms-message\\src\\kms_request.obj build\\debug\\third_party\\kms-message\\src\\kms_request_opt.obj build\\debug\\third_party\\kms-message\\src\\kms_request_str.obj build\\debug\\third_party\\kms-message\\src\\kms_response.obj build\\debug\\third_party\\kms-message\\src\\kms_response_parser.obj build\\debug\\third_party\\kms-message\\src\\sort.obj build\\debug\\third_party\\kms-message\\src\\kms_crypto_windows.obj build\\debug\\mongo\\scripting\\mozjs\\base.obj build\\debug\\mongo\\scripting\\mozjs\\bindata.obj build\\debug\\mongo\\scripting\\mozjs\\bson.obj build\\debug\\mongo\\scripting\\mozjs\\code.obj build\\debug\\mongo\\scripting\\mozjs\\countdownlatch.obj build\\debug\\mongo\\scripting\\mozjs\\cursor.obj build\\debug\\mongo\\scripting\\mozjs\\cursor_handle.obj build\\debug\\mongo\\scripting\\mozjs\\db.obj build\\debug\\mongo\\scripting\\mozjs\\dbcollection.obj build\\debug\\mongo\\scripting\\mozjs\\dbpointer.obj build\\debug\\mongo\\scripting\\mozjs\\dbquery.obj build\\debug\\mongo\\scripting\\mozjs\\dbref.obj build\\debug\\mongo\\scripting\\mozjs\\engine.obj build\\debug\\mongo\\scripting\\mozjs\\error.obj build\\debug\\mongo\\scripting\\mozjs\\exception.obj build\\debug\\mongo\\scripting\\mozjs\\global.obj build\\debug\\mongo\\scripting\\mozjs\\idwrapper.obj build\\debug\\mongo\\scripting\\mozjs\\implscope.obj build\\debug\\mongo\\scripting\\mozjs\\internedstring.obj build\\debug\\mongo\\scripting\\mozjs\\jscustomallocator.obj build\\debug\\mongo\\scripting\\mozjs\\jsstringwrapper.obj build\\debug\\mongo\\scripting\\mozjs\\jsthread.obj build\\debug\\mongo\\scripting\\mozjs\\maxkey.obj build\\debug\\mongo\\scripting\\mozjs\\minkey.obj build\\debug\\mongo\\scripting\\mozjs\\mongo.obj build\\debug\\mongo\\scripting\\mozjs\\mongohelpers.obj build\\debug\\mongo\\scripting\\mozjs\\mongohelpers_js.obj build\\debug\\mongo\\scripting\\mozjs\\nativefunction.obj build\\debug\\mongo\\scripting\\mozjs\\numberdecimal.obj build\\debug\\mongo\\scripting\\mozjs\\numberint.obj build\\debug\\mongo\\scripting\\mozjs\\numberlong.obj build\\debug\\mongo\\scripting\\mozjs\\object.obj build\\debug\\mongo\\scripting\\mozjs\\objectwrapper.obj build\\debug\\mongo\\scripting\\mozjs\\oid.obj build\\debug\\mongo\\scripting\\mozjs\\PosixNSPR.obj build\\debug\\mongo\\scripting\\mozjs\\proxyscope.obj build\\debug\\mongo\\scripting\\mozjs\\regexp.obj build\\debug\\mongo\\scripting\\mozjs\\session.obj build\\debug\\mongo\\scripting\\mozjs\\status.obj build\\debug\\mongo\\scripting\\mozjs\\timestamp.obj build\\debug\\mongo\\scripting\\mozjs\\uri.obj build\\debug\\mongo\\scripting\\mozjs\\valuereader.obj build\\debug\\mongo\\scripting\\mozjs\\valuewriter.obj build\\debug\\mongo\\scripting\\mozjs\\engine_gen.obj build\\debug\\mongo\\scripting\\mozjs\\scripting_util_gen.obj build\\debug\\third_party\\shim_mozjs.obj build\\debug\\third_party\\mozjs-60\\mongo_sources\\mongoErrorReportToString.obj build\\debug\\third_party\\mozjs-60\\mongo_sources\\freeOpToJSContext.obj build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\builtin\\RegExp.obj build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\frontend\\Parser.obj build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\gc\\StoreBuffer.obj build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\jsarray.obj build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\jsmath.obj build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\mfbt\\Unified_cpp_mfbt0.obj build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\perf\\pm_stub.obj build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\util\\DoubleToString.obj build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\vm\\Interpreter.obj build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\vm\\JSAtom.obj build\\debug\\third_party\\mozjs-60\\extract\\mfbt\\Compression.obj build\\debug\\third_party\\mozjs-60\\extract\\mfbt\\double-conversion\\double-conversion\\strtod.obj build\\debug\\third_party\\mozjs-60\\extract\\mfbt\\lz4.obj build\\debug\\third_party\\mozjs-60\\extract\\mozglue\\misc\\Printf.obj build\\debug\\third_party\\mozjs-60\\extract\\mozglue\\misc\\TimeStamp.obj build\\debug\\third_party\\mozjs-60\\extract\\mozglue\\misc\\StackWalk.obj build\\debug\\third_party\\mozjs-60\\extract\\mozglue\\misc\\ConditionVariable_windows.obj build\\debug\\third_party\\mozjs-60\\extract\\mozglue\\misc\\Mutex_windows.obj build\\debug\\third_party\\mozjs-60\\extract\\mozglue\\misc\\TimeStamp_windows.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_acos.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_acosh.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_asin.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_atan2.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_atanh.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_cosh.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_exp.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_hypot.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_log.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_log10.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_log2.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_pow.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_sinh.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_sqrt.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\k_exp.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_asinh.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_atan.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_cbrt.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_ceil.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_ceilf.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_copysign.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_expm1.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_fabs.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_floor.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_floorf.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_log1p.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_nearbyint.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_rint.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_rintf.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_scalbn.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_tanh.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_trunc.obj build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_truncf.obj build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\jit\\x86-shared\\Disassembler-x86-shared.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src0.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src1.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src10.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src11.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src12.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src13.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src14.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src15.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src16.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src17.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src18.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src19.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src2.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src20.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src21.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src22.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src23.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src24.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src25.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src26.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src27.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src28.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src29.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src3.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src30.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src31.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src32.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src33.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src34.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src35.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src36.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src37.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src38.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src39.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src4.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src40.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src41.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src42.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src43.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src44.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src5.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src6.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src7.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src8.obj build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src9.obj build\\debug\\mongo\\scripting\\deadline_monitor.obj build\\debug\\mongo\\scripting\\deadline_monitor_gen.obj build\\debug\\mongo\\scripting\\dbdirectclient_factory.obj build\\debug\\mongo\\scripting\\engine.obj build\\debug\\mongo\\scripting\\jsexception.obj build\\debug\\mongo\\scripting\\utils.obj build\\debug\\mongo\\shell\\mongo.obj build\\debug\\mongo\\scripting\\bson_template_evaluator.obj build\\debug\\mongo\\crypto\\aead_encryption.obj build\\debug\\mongo\\db\\matcher\\expression.obj build\\debug\\mongo\\db\\matcher\\expression_algo.obj build\\debug\\mongo\\db\\matcher\\expression_array.obj build\\debug\\mongo\\db\\matcher\\expression_expr.obj build\\debug\\mongo\\db\\matcher\\expression_geo.obj build\\debug\\mongo\\db\\matcher\\expression_internal_expr_eq.obj build\\debug\\mongo\\db\\matcher\\expression_leaf.obj build\\debug\\mongo\\db\\matcher\\expression_parser.obj build\\debug\\mongo\\db\\matcher\\expression_text_base.obj build\\debug\\mongo\\db\\matcher\\expression_text_noop.obj build\\debug\\mongo\\db\\matcher\\expression_tree.obj build\\debug\\mongo\\db\\matcher\\expression_where_base.obj build\\debug\\mongo\\db\\matcher\\expression_where_noop.obj build\\debug\\mongo\\db\\matcher\\expression_with_placeholder.obj build\\debug\\mongo\\db\\matcher\\extensions_callback.obj build\\debug\\mongo\\db\\matcher\\extensions_callback_noop.obj build\\debug\\mongo\\db\\matcher\\match_details.obj build\\debug\\mongo\\db\\matcher\\matchable.obj build\\debug\\mongo\\db\\matcher\\matcher.obj build\\debug\\mongo\\db\\matcher\\matcher_type_set.obj build\\debug\\mongo\\db\\matcher\\rewrite_expr.obj build\\debug\\mongo\\db\\matcher\\schema\\encrypt_schema_types.obj build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_all_elem_match_from_index.obj build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_allowed_properties.obj build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_cond.obj build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_eq.obj build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_fmod.obj build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_match_array_index.obj build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_num_array_items.obj build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_num_properties.obj build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_object_match.obj build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_root_doc_eq.obj build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_str_length.obj build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_unique_items.obj build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_xor.obj build\\debug\\mongo\\db\\matcher\\schema\\json_pointer.obj build\\debug\\mongo\\db\\matcher\\schema\\json_schema_parser.obj build\\debug\\mongo\\db\\matcher\\schema\\encrypt_schema_gen.obj build\\debug\\mongo\\db\\query\\query_knobs_gen.obj build\\debug\\mongo\\db\\pipeline\\expression.obj build\\debug\\mongo\\db\\pipeline\\expression_trigonometric.obj build\\debug\\mongo\\util\\summation.obj build\\debug\\mongo\\util\\regex_util.obj build\\debug\\mongo\\db\\pipeline\\expression_context.obj build\\debug\\mongo\\db\\pipeline\\variables.obj build\\debug\\mongo\\db\\query\\collation\\collator_factory_interface.obj build\\debug\\mongo\\db\\query\\collation\\collation_index_key.obj build\\debug\\mongo\\db\\query\\collation\\collation_spec.obj build\\debug\\mongo\\db\\query\\collation\\collator_interface.obj build\\debug\\mongo\\db\\pipeline\\aggregation_request.obj build\\debug\\mongo\\db\\query\\explain_options.obj build\\debug\\mongo\\db\\pipeline\\document_source_change_stream_gen.obj build\\debug\\mongo\\db\\pipeline\\document_source_list_sessions_gen.obj build\\debug\\mongo\\db\\pipeline\\document_source_merge_gen.obj build\\debug\\mongo\\db\\pipeline\\document_source_merge_modes_gen.obj build\\debug\\mongo\\db\\pipeline\\document_source_replace_root_gen.obj build\\debug\\mongo\\db\\pipeline\\exchange_spec_gen.obj build\\debug\\mongo\\db\\pipeline\\value_gen.obj build\\debug\\mongo\\db\\pipeline\\document_source_merge_spec.obj build\\debug\\mongo\\db\\pipeline\\resume_token.obj build\\debug\\mongo\\db\\storage\\key_string.obj build\\debug\\mongo\\db\\pipeline\\dependencies.obj build\\debug\\mongo\\db\\pipeline\\document.obj build\\debug\\mongo\\db\\pipeline\\document_comparator.obj build\\debug\\mongo\\db\\pipeline\\document_path_support.obj build\\debug\\mongo\\db\\pipeline\\value.obj build\\debug\\mongo\\db\\pipeline\\value_comparator.obj build\\debug\\mongo\\util\\intrusive_counter.obj build\\debug\\mongo\\db\\query\\datetime\\date_time_support.obj build\\debug\\third_party\\shim_timelib.obj build\\debug\\third_party\\timelib-2018.01\\astro.obj build\\debug\\third_party\\timelib-2018.01\\dow.obj build\\debug\\third_party\\timelib-2018.01\\interval.obj build\\debug\\third_party\\timelib-2018.01\\parse_date.obj build\\debug\\third_party\\timelib-2018.01\\parse_iso_intervals.obj build\\debug\\third_party\\timelib-2018.01\\parse_tz.obj build\\debug\\third_party\\timelib-2018.01\\parse_zoneinfo.obj build\\debug\\third_party\\timelib-2018.01\\timelib.obj build\\debug\\third_party\\timelib-2018.01\\tm2unixtime.obj build\\debug\\third_party\\timelib-2018.01\\unixtime2tm.obj build\\debug\\mongo\\db\\pipeline\\field_path.obj build\\debug\\mongo\\db\\matcher\\path.obj build\\debug\\mongo\\db\\matcher\\path_internal.obj build\\debug\\mongo\\db\\geo\\geoparser.obj build\\debug\\mongo\\db\\geo\\geometry_container.obj build\\debug\\mongo\\db\\geo\\hash.obj build\\debug\\mongo\\db\\geo\\shapes.obj build\\debug\\mongo\\db\\geo\\big_polygon.obj build\\debug\\mongo\\db\\geo\\r2_region_coverer.obj build\\debug\\third_party\\s2\\s1angle.obj build\\debug\\third_party\\s2\\s2.obj build\\debug\\third_party\\s2\\s2cellid.obj build\\debug\\third_party\\s2\\s2latlng.obj build\\debug\\third_party\\s2\\s1interval.obj build\\debug\\third_party\\s2\\s2cap.obj build\\debug\\third_party\\s2\\s2cell.obj build\\debug\\third_party\\s2\\s2cellunion.obj build\\debug\\third_party\\s2\\s2edgeindex.obj build\\debug\\third_party\\s2\\s2edgeutil.obj build\\debug\\third_party\\s2\\s2latlngrect.obj build\\debug\\third_party\\s2\\s2loop.obj build\\debug\\third_party\\s2\\s2pointregion.obj build\\debug\\third_party\\s2\\s2polygon.obj build\\debug\\third_party\\s2\\s2polygonbuilder.obj build\\debug\\third_party\\s2\\s2polyline.obj build\\debug\\third_party\\s2\\s2r2rect.obj build\\debug\\third_party\\s2\\s2region.obj build\\debug\\third_party\\s2\\s2regioncoverer.obj build\\debug\\third_party\\s2\\s2regionintersection.obj build\\debug\\third_party\\s2\\s2regionunion.obj build\\debug\\third_party\\s2\\util\\math\\mathutil.obj build\\debug\\third_party\\s2\\util\\coding\\coder.obj build\\debug\\third_party\\s2\\util\\coding\\varint.obj build\\debug\\third_party\\s2\\strings\\split.obj build\\debug\\third_party\\s2\\strings\\stringprintf.obj build\\debug\\third_party\\s2\\strings\\strutil.obj build\\debug\\third_party\\s2\\base\\int128.obj build\\debug\\third_party\\s2\\base\\logging.obj build\\debug\\third_party\\s2\\base\\stringprintf.obj build\\debug\\third_party\\s2\\base\\strtoint.obj build\\debug\\mongo\\db\\fts\\fts_query_noop.obj build\\debug\\mongo\\crypto\\symmetric_crypto.obj build\\debug\\mongo\\crypto\\symmetric_crypto_windows.obj build\\debug\\mongo\\crypto\\symmetric_key.obj build\\debug\\mongo\\db\\views\\resolved_view.obj build\\debug\\mongo\\db\\storage\\duplicate_key_error_info.obj build\\debug\\mongo\\client\\connection_string_connect.obj build\\debug\\mongo\\client\\mongo_uri_connect.obj build\\debug\\mongo\\client\\connpool.obj build\\debug\\mongo\\client\\dbclient_connection.obj build\\debug\\mongo\\client\\dbclient_rs.obj build\\debug\\mongo\\client\\global_conn_pool.obj build\\debug\\mongo\\client\\global_conn_pool_gen.obj build\\debug\\mongo\\client\\replica_set_change_notifier.obj build\\debug\\mongo\\client\\replica_set_monitor.obj build\\debug\\mongo\\client\\replica_set_monitor_manager.obj build\\debug\\mongo\\executor\\thread_pool_task_executor.obj build\\debug\\mongo\\executor\\network_interface_thread_pool.obj build\\debug\\mongo\\executor\\network_interface_factory.obj build\\debug\\mongo\\executor\\connection_pool_tl.obj build\\debug\\mongo\\executor\\network_interface_tl.obj build\\debug\\mongo\\transport\\transport_layer_manager.obj build\\debug\\mongo\\transport\\service_executor_adaptive.obj build\\debug\\mongo\\transport\\service_executor_reserved.obj build\\debug\\mongo\\transport\\service_executor_synchronous.obj build\\debug\\mongo\\transport\\service_executor_gen.obj build\\debug\\mongo\\transport\\transport_layer_asio.obj build\\debug\\mongo\\base\\system_error.obj build\\debug\\mongo\\client\\async_client.obj build\\debug\\mongo\\transport\\message_compressor_manager.obj build\\debug\\mongo\\transport\\message_compressor_metrics.obj build\\debug\\mongo\\transport\\message_compressor_registry.obj build\\debug\\mongo\\transport\\message_compressor_snappy.obj build\\debug\\mongo\\transport\\message_compressor_zlib.obj build\\debug\\mongo\\transport\\message_compressor_zstd.obj build\\debug\\third_party\\shim_zstd.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\entropy_common.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\fse_decompress.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\threading.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\pool.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\zstd_common.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\error_private.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\xxhash.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\hist.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\fse_compress.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\huf_compress.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_compress.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstdmt_compress.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_fast.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_double_fast.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_lazy.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_opt.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_ldm.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\decompress\\huf_decompress.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\decompress\\zstd_decompress.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\cover.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\fastcover.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\divsufsort.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\zdict.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\deprecated\\zbuff_common.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\deprecated\\zbuff_compress.obj build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\deprecated\\zbuff_decompress.obj build\\debug\\third_party\\shim_zlib.obj build\\debug\\third_party\\zlib-1.2.11\\adler32.obj build\\debug\\third_party\\zlib-1.2.11\\crc32.obj build\\debug\\third_party\\zlib-1.2.11\\compress.obj build\\debug\\third_party\\zlib-1.2.11\\deflate.obj build\\debug\\third_party\\zlib-1.2.11\\infback.obj build\\debug\\third_party\\zlib-1.2.11\\inffast.obj build\\debug\\third_party\\zlib-1.2.11\\inflate.obj build\\debug\\third_party\\zlib-1.2.11\\inftrees.obj build\\debug\\third_party\\zlib-1.2.11\\trees.obj build\\debug\\third_party\\zlib-1.2.11\\uncompr.obj build\\debug\\third_party\\zlib-1.2.11\\zutil.obj build\\debug\\third_party\\shim_snappy.obj build\\debug\\third_party\\snappy-1.1.7\\snappy-c.obj build\\debug\\third_party\\snappy-1.1.7\\snappy.obj build\\debug\\third_party\\snappy-1.1.7\\snappy-sinksource.obj build\\debug\\mongo\\executor\\network_interface.obj build\\debug\\mongo\\executor\\task_executor.obj build\\debug\\mongo\\executor\\connection_pool.obj build\\debug\\mongo\\executor\\egress_tag_closer_manager.obj build\\debug\\mongo\\executor\\connection_pool_stats.obj build\\debug\\mongo\\client\\dbclient_base.obj build\\debug\\mongo\\client\\dbclient_cursor.obj build\\debug\\mongo\\client\\index_spec.obj build\\debug\\mongo\\util\\net\\private\\ssl_expiration.obj build\\debug\\mongo\\util\\net\\ssl_manager.obj build\\debug\\mongo\\util\\net\\ssl_parameters.obj build\\debug\\mongo\\util\\net\\ssl_manager_windows.obj build\\debug\\mongo\\util\\net\\ssl_stream.obj build\\debug\\mongo\\util\\net\\ssl_parameters_gen.obj build\\debug\\third_party\\shim_asio.obj build\\debug\\third_party\\asio-master\\asio\\src\\asio.obj build\\debug\\mongo\\util\\net\\ssl_types.obj build\\debug\\mongo\\util\\net\\ssl_options.obj build\\debug\\mongo\\util\\net\\private\\socket_poll.obj build\\debug\\mongo\\util\\net\\sock.obj build\\debug\\mongo\\util\\background.obj build\\debug\\mongo\\db\\commands\\server_status.obj build\\debug\\mongo\\db\\stats\\counters.obj build\\debug\\mongo\\db\\commands.obj build\\debug\\mongo\\db\\audit.obj build\\debug\\mongo\\db\\query\\count_command_as_aggregation_command.obj build\\debug\\mongo\\db\\query\\count_request.obj build\\debug\\mongo\\db\\query\\cursor_request.obj build\\debug\\mongo\\db\\query\\cursor_response.obj build\\debug\\mongo\\db\\query\\find_and_modify_request.obj build\\debug\\mongo\\db\\query\\getmore_request.obj build\\debug\\mongo\\db\\query\\killcursors_request.obj build\\debug\\mongo\\db\\query\\killcursors_response.obj build\\debug\\mongo\\db\\query\\view_response_formatter.obj build\\debug\\mongo\\db\\query\\count_command_gen.obj build\\debug\\mongo\\rpc\\factory.obj build\\debug\\mongo\\rpc\\object_check.obj build\\debug\\mongo\\rpc\\legacy_request.obj build\\debug\\mongo\\rpc\\legacy_request_builder.obj build\\debug\\mongo\\rpc\\legacy_reply.obj build\\debug\\mongo\\rpc\\legacy_reply_builder.obj build\\debug\\mongo\\rpc\\reply_builder_interface.obj build\\debug\\mongo\\rpc\\object_check_gen.obj build\\debug\\mongo\\s\\catalog\\mongo_version_range.obj build\\debug\\mongo\\s\\catalog\\type_changelog.obj build\\debug\\mongo\\s\\catalog\\type_chunk.obj build\\debug\\mongo\\s\\catalog\\type_collection.obj build\\debug\\mongo\\s\\catalog\\type_config_version.obj build\\debug\\mongo\\s\\catalog\\type_database.obj build\\debug\\mongo\\s\\catalog\\type_lockpings.obj build\\debug\\mongo\\s\\catalog\\type_locks.obj build\\debug\\mongo\\s\\catalog\\type_mongos.obj build\\debug\\mongo\\s\\catalog\\type_shard_collection.obj build\\debug\\mongo\\s\\catalog\\type_shard_database.obj build\\debug\\mongo\\s\\catalog\\type_shard.obj build\\debug\\mongo\\s\\catalog\\type_tags.obj build\\debug\\mongo\\s\\request_types\\add_shard_request_type.obj build\\debug\\mongo\\s\\request_types\\add_shard_to_zone_request_type.obj build\\debug\\mongo\\s\\request_types\\balance_chunk_request_type.obj build\\debug\\mongo\\s\\request_types\\commit_chunk_migration_request_type.obj build\\debug\\mongo\\s\\request_types\\merge_chunk_request_type.obj build\\debug\\mongo\\s\\request_types\\migration_secondary_throttle_options.obj build\\debug\\mongo\\s\\request_types\\move_chunk_request.obj build\\debug\\mongo\\s\\request_types\\remove_shard_from_zone_request_type.obj build\\debug\\mongo\\s\\request_types\\set_shard_version_request.obj build\\debug\\mongo\\s\\request_types\\split_chunk_request_type.obj build\\debug\\mongo\\s\\request_types\\update_zone_key_range_request_type.obj build\\debug\\mongo\\s\\cannot_implicitly_create_collection_info.obj build\\debug\\mongo\\s\\chunk_version.obj build\\debug\\mongo\\s\\database_version_helpers.obj build\\debug\\mongo\\s\\shard_id.obj build\\debug\\mongo\\s\\stale_exception.obj build\\debug\\mongo\\s\\would_change_owning_shard_exception.obj build\\debug\\mongo\\s\\catalog\\type_chunk_base_gen.obj build\\debug\\mongo\\s\\chunk_version_gen.obj build\\debug\\mongo\\s\\database_version_gen.obj build\\debug\\mongo\\s\\request_types\\clone_catalog_data_gen.obj build\\debug\\mongo\\s\\request_types\\clear_jumbo_flag_gen.obj build\\debug\\mongo\\s\\request_types\\create_collection_gen.obj build\\debug\\mongo\\s\\request_types\\create_database_gen.obj build\\debug\\mongo\\s\\request_types\\flush_database_cache_updates_gen.obj build\\debug\\mongo\\s\\request_types\\flush_routing_table_cache_updates_gen.obj build\\debug\\mongo\\s\\request_types\\get_database_version_gen.obj build\\debug\\mongo\\s\\request_types\\move_primary_gen.obj build\\debug\\mongo\\s\\request_types\\shard_collection_gen.obj build\\debug\\mongo\\s\\request_types\\clone_collection_options_from_primary_shard_gen.obj build\\debug\\mongo\\s\\request_types\\wait_for_fail_point_gen.obj build\\debug\\mongo\\rpc\\message.obj build\\debug\\mongo\\rpc\\op_msg.obj build\\debug\\mongo\\rpc\\protocol.obj build\\debug\\third_party\\wiredtiger\\src\\checksum\\software\\checksum.obj build\\debug\\third_party\\wiredtiger\\src\\checksum\\x86\\crc32-x86.obj build\\debug\\third_party\\wiredtiger\\src\\checksum\\x86\\crc32-x86-alt.obj build\\debug\\mongo\\db\\wire_version.obj build\\debug\\mongo\\db\\bson\\dotted_path_support.obj build\\debug\\mongo\\db\\query\\query_request.obj build\\debug\\mongo\\db\\query\\tailable_mode.obj build\\debug\\mongo\\db\\query\\tailable_mode_gen.obj build\\debug\\mongo\\db\\repl\\read_concern_args.obj build\\debug\\mongo\\db\\catalog\\collection_catalog.obj build\\debug\\mongo\\db\\catalog\\collection.obj build\\debug\\mongo\\db\\ops\\write_ops_parsers.obj build\\debug\\mongo\\db\\ops\\write_ops_gen.obj build\\debug\\mongo\\db\\query\\hint_parser.obj build\\debug\\mongo\\db\\query\\hint_gen.obj build\\debug\\mongo\\db\\pipeline\\runtime_constants_gen.obj build\\debug\\mongo\\db\\dbmessage.obj build\\debug\\mongo\\client\\connection_string.obj build\\debug\\mongo\\client\\mongo_uri.obj build\\debug\\mongo\\util\\dns_query.obj build\\debug\\mongo\\client\\query.obj build\\debug\\mongo\\client\\authenticate.obj build\\debug\\mongo\\client\\native_sasl_client_session.obj build\\debug\\mongo\\client\\sasl_client_authenticate.obj build\\debug\\mongo\\client\\sasl_client_authenticate_impl.obj build\\debug\\mongo\\client\\sasl_client_conversation.obj build\\debug\\mongo\\client\\sasl_client_session.obj build\\debug\\mongo\\client\\sasl_plain_client_conversation.obj build\\debug\\mongo\\client\\sasl_scram_client_conversation.obj build\\debug\\mongo\\util\\md5.obj build\\debug\\mongo\\util\\password_digest.obj build\\debug\\mongo\\util\\icu.obj build\\debug\\mongo\\util\\icu_init.obj build\\debug\\third_party\\shim_icu.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\affixpatternparser.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\alphaindex.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\anytrans.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\astro.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\basictz.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\bocsu.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\brktrans.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\buddhcal.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\calendar.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\casetrn.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\cecal.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\chnsecal.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\choicfmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\coleitr.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\coll.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collation.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationbuilder.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationcompare.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationdata.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationdatabuilder.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationdatareader.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationdatawriter.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationfastlatin.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationfastlatinbuilder.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationfcd.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationiterator.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationkeys.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationroot.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationrootelements.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationruleparser.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationsets.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationsettings.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationtailoring.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationweights.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\compactdecimalformat.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\coptccal.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\cpdtrans.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\csdetect.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\csmatch.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\csr2022.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\csrecog.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\csrmbcs.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\csrsbcs.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\csrucode.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\csrutf8.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\curramt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\currfmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\currpinf.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\currunit.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\dangical.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\datefmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\dayperiodrules.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\dcfmtsym.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\decContext.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\decNumber.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\decfmtst.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\decimalformatpattern.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\decimfmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\decimfmtimpl.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\digitaffix.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\digitaffixesandpadding.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\digitformatter.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\digitgrouping.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\digitinterval.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\digitlst.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\dtfmtsym.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\dtitvfmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\dtitvinf.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\dtptngen.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\dtrule.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\esctrn.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ethpccal.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\fmtable.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\fmtable_cnv.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\format.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\fphdlimp.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\fpositer.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\funcrepl.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\gender.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\gregocal.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\gregoimp.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\hebrwcal.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\identifier_info.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\indiancal.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\inputext.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\islamcal.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\japancal.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\measfmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\measunit.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\measure.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\msgfmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\name2uni.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\nfrs.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\nfrule.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\nfsubs.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\nortrans.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\nultrans.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\numfmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\numsys.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\olsontz.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\persncal.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\pluralaffix.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\plurfmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\plurrule.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\precision.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\quant.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\quantityformatter.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rbnf.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rbt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rbt_data.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rbt_pars.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rbt_rule.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rbt_set.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rbtz.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\regexcmp.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\regeximp.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\regexst.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\regextxt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\region.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\reldatefmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\reldtfmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rematch.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\remtrans.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\repattrn.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rulebasedcollator.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\scientificnumberformatter.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\scriptset.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\search.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\selfmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\sharedbreakiterator.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\simpletz.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\smallintformatter.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\smpdtfmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\smpdtfst.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\sortkey.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\standardplural.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\strmatch.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\strrepl.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\stsearch.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\taiwncal.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\timezone.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\titletrn.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tmunit.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tmutamt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tmutfmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tolowtrn.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\toupptrn.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\translit.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\transreg.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tridpars.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tzfmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tzgnames.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tznames.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tznames_impl.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tzrule.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tztrans.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ucal.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ucln_in.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ucol.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ucol_res.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ucol_sit.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ucoleitr.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ucsdet.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\udat.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\udateintervalformat.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\udatpg.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ufieldpositer.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uitercollationiterator.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ulocdata.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\umsg.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\unesctrn.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uni2name.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\unum.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\unumsys.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\upluralrules.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uregex.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uregexc.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uregion.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\usearch.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uspoof.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_build.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_conf.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_impl.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_wsconf.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\utf16collationiterator.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\utf8collationiterator.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\utmscale.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\utrans.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\valueformatter.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\visibledigits.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\vtzone.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\vzone.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\windtfmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\winnmfmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\wintzimpl.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\zonemeta.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\zrule.obj build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ztrans.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\appendable.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\bmpset.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\brkeng.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\brkiter.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\bytestream.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\bytestrie.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\bytestriebuilder.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\bytestrieiterator.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\caniter.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\chariter.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\charstr.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\cmemory.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\cstr.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\cstring.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\cwchar.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\dictbe.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\dictionarydata.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\dtintrv.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\errorcode.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\filteredbrk.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\filterednormalizer2.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\icudataver.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\icuplug.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\listformatter.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\loadednormalizer2impl.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\locavailable.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\locbased.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\locdispnames.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\locdspnm.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\locid.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\loclikely.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\locmap.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\locresdata.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\locutil.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\messagepattern.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\normalizer2.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\normalizer2impl.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\normlzr.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\parsepos.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\patternprops.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\pluralmap.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\propname.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\propsvec.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\punycode.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\putil.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\rbbi.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\rbbidata.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\rbbinode.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\rbbirb.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\rbbiscan.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\rbbisetb.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\rbbistbl.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\rbbitblb.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\resbund.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\resbund_cnv.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\resource.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ruleiter.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\schriter.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\serv.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\servlk.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\servlkf.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\servls.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\servnotf.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\servrbf.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\servslkf.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\sharedobject.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\simpleformatter.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\stringpiece.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\stringtriebuilder.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uarrsort.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ubidi.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ubidi_props.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ubidiln.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ubidiwrt.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ubrk.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucase.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucasemap.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucasemap_titlecase_brkiter.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucat.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uchar.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucharstrie.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucharstriebuilder.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucharstrieiterator.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uchriter.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucln_cmn.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucmndata.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv2022.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_bld.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_cb.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_cnv.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_ct.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_err.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_ext.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_io.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_lmb.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_set.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_u16.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_u32.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_u7.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_u8.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnvbocu.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnvdisp.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnvhz.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnvisci.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnvlat1.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnvmbcs.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnvscsu.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnvsel.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucol_swp.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucurr.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\udata.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\udatamem.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\udataswp.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uenum.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uhash.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uhash_us.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uidna.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uinit.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uinvchar.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uiter.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ulist.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ulistformatter.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uloc.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uloc_keytype.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uloc_tag.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\umapfile.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\umath.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\umutex.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\unames.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\unifiedcache.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\unifilt.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\unifunct.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uniset.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uniset_closure.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uniset_props.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\unisetspan.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\unistr.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\unistr_case.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\unistr_case_locale.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\unistr_cnv.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\unistr_props.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\unistr_titlecase_brkiter.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\unorm.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\unormcmp.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uobject.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uprops.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ures_cnv.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uresbund.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uresdata.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\usc_impl.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uscript.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uscript_props.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uset.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uset_props.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\usetiter.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ushape.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\usprep.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustack.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustr_cnv.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustr_titlecase_brkiter.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustr_wcs.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustrcase.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustrcase_locale.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustrenum.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustrfmt.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustring.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustrtrns.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\utext.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\utf_impl.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\util.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\util_props.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\utrace.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\utrie.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\utrie2.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\utrie2_builder.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uts46.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\utypes.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uvector.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uvectr32.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\uvectr64.obj build\\debug\\third_party\\icu4c-57.1\\source\\common\\wintz.obj build\\debug\\third_party\\icu4c-57.1\\source\\stubdata\\stubdata.obj build\\debug\\mongo\\rpc\\get_status_from_command_result.obj build\\debug\\mongo\\rpc\\write_concern_error_detail.obj build\\debug\\mongo\\executor\\remote_command_request.obj build\\debug\\mongo\\executor\\remote_command_response.obj build\\debug\\mongo\\rpc\\metadata.obj build\\debug\\mongo\\rpc\\metadata\\config_server_metadata.obj build\\debug\\mongo\\rpc\\metadata\\egress_metadata_hook_list.obj build\\debug\\mongo\\rpc\\metadata\\logical_time_metadata.obj build\\debug\\mongo\\rpc\\metadata\\sharding_metadata.obj build\\debug\\mongo\\rpc\\metadata\\repl_set_metadata.obj build\\debug\\mongo\\rpc\\metadata\\oplog_query_metadata.obj build\\debug\\mongo\\rpc\\metadata\\tracking_metadata.obj build\\debug\\mongo\\rpc\\metadata\\client_metadata.obj build\\debug\\mongo\\rpc\\metadata\\client_metadata_ismaster.obj build\\debug\\mongo\\transport\\service_entry_point_utils.obj build\\debug\\mongo\\transport\\session.obj build\\debug\\mongo\\transport\\transport_layer.obj build\\debug\\mongo\\s\\is_mongos.obj build\\debug\\mongo\\db\\logical_time_validator.obj build\\debug\\mongo\\db\\signed_logical_time.obj build\\debug\\mongo\\db\\keys_collection_manager_gen.obj build\\debug\\mongo\\db\\keys_collection_manager.obj build\\debug\\mongo\\db\\keys_collection_cache.obj build\\debug\\mongo\\db\\key_generator.obj build\\debug\\mongo\\db\\repl\\repl_client_info.obj build\\debug\\mongo\\db\\repl\\replication_coordinator.obj build\\debug\\mongo\\db\\repl\\replication_coordinator_noop.obj build\\debug\\mongo\\db\\repl\\replication_consistency_markers.obj build\\debug\\mongo\\db\\repl\\replication_process.obj build\\debug\\mongo\\db\\repl\\storage_interface.obj build\\debug\\mongo\\db\\repl\\rollback_gen.obj build\\debug\\mongo\\db\\namespace_string.obj build\\debug\\mongo\\db\\repl\\bson_extract_optime.obj build\\debug\\mongo\\db\\repl\\optime.obj build\\debug\\mongo\\db\\keys_collection_client_sharded.obj build\\debug\\mongo\\s\\catalog\\sharding_catalog_client.obj build\\debug\\mongo\\db\\logical_clock.obj build\\debug\\mongo\\db\\logical_clock_gen.obj build\\debug\\mongo\\db\\global_settings.obj build\\debug\\mongo\\db\\repl\\repl_settings.obj build\\debug\\mongo\\db\\repl\\repl_settings_gen.obj build\\debug\\mongo\\db\\keys_collection_document.obj build\\debug\\mongo\\db\\time_proof_service.obj build\\debug\\mongo\\db\\logical_time.obj build\\debug\\mongo\\db\\operation_time_tracker.obj build\\debug\\mongo\\db\\auth\\action_set.obj build\\debug\\mongo\\db\\auth\\action_type.obj build\\debug\\mongo\\db\\auth\\impersonation_session.obj build\\debug\\mongo\\db\\auth\\privilege.obj build\\debug\\mongo\\db\\auth\\privilege_parser.obj build\\debug\\mongo\\db\\auth\\resource_pattern.obj build\\debug\\mongo\\db\\auth\\user_management_commands_parser.obj build\\debug\\mongo\\rpc\\metadata\\impersonated_user_metadata.obj build\\debug\\mongo\\rpc\\metadata\\impersonated_user_metadata_gen.obj build\\debug\\mongo\\db\\server_options_helpers.obj build\\debug\\mongo\\db\\server_options_helpers_gen.obj build\\debug\\mongo\\util\\cmdline_utils\\censor_cmdline.obj build\\debug\\mongo\\db\\field_ref.obj build\\debug\\mongo\\db\\field_ref_set.obj build\\debug\\mongo\\db\\field_parser.obj build\\debug\\mongo\\db\\keypattern.obj build\\debug\\mongo\\db\\write_concern_options.obj build\\debug\\mongo\\db\\index_names.obj build\\debug\\mongo\\db\\commands\\test_commands_enabled.obj build\\debug\\mongo\\db\\commands\\test_commands_enabled_gen.obj build\\debug\\mongo\\db\\commands\\server_status_internal.obj build\\debug\\mongo\\db\\commands\\server_status_metric.obj build\\debug\\mongo\\db\\auth\\address_restriction.obj build\\debug\\mongo\\db\\auth\\address_restriction_gen.obj build\\debug\\mongo\\db\\auth\\restriction_environment.obj build\\debug\\mongo\\bson\\mutable\\document.obj build\\debug\\mongo\\bson\\mutable\\element.obj build\\debug\\mongo\\util\\safe_num.obj build\\debug\\mongo\\db\\auth\\authorization_manager.obj build\\debug\\mongo\\db\\auth\\authorization_session.obj build\\debug\\mongo\\db\\auth\\auth_decorations.obj build\\debug\\mongo\\db\\auth\\user_name.obj build\\debug\\mongo\\db\\auth\\role_name.obj build\\debug\\mongo\\client\\read_preference.obj build\\debug\\mongo\\db\\baton.obj build\\debug\\mongo\\db\\client.obj build\\debug\\mongo\\db\\default_baton.obj build\\debug\\mongo\\db\\operation_context.obj build\\debug\\mongo\\db\\operation_context_group.obj build\\debug\\mongo\\db\\service_context.obj build\\debug\\mongo\\db\\server_recovery.obj build\\debug\\mongo\\db\\unclean_shutdown.obj build\\debug\\mongo\\db\\repl_set_member_in_standalone_mode.obj build\\debug\\mongo\\util\\periodic_runner.obj build\\debug\\mongo\\util\\background_thread_clock_source.obj build\\debug\\mongo\\util\\clock_source.obj build\\debug\\mongo\\util\\fast_clock_source_factory.obj build\\debug\\mongo\\db\\storage\\write_unit_of_work.obj build\\debug\\mongo\\util\\fail_point.obj build\\debug\\mongo\\util\\fail_point_registry.obj build\\debug\\mongo\\util\\fail_point_service.obj build\\debug\\mongo\\util\\fail_point_server_parameter_gen.obj build\\debug\\mongo\\db\\storage\\storage_options.obj build\\debug\\mongo\\db\\storage\\storage_parameters_gen.obj build\\debug\\mongo\\db\\multi_key_path_tracker.obj build\\debug\\mongo\\db\\logical_session_id.obj build\\debug\\mongo\\db\\logical_session_id_gen.obj build\\debug\\mongo\\idl\\server_parameter.obj build\\debug\\mongo\\idl\\server_parameter_with_storage.obj build\\debug\\mongo\\util\\options_parser\\constraints.obj build\\debug\\mongo\\util\\options_parser\\environment.obj build\\debug\\mongo\\util\\options_parser\\option_description.obj build\\debug\\mongo\\util\\options_parser\\option_section.obj build\\debug\\mongo\\util\\options_parser\\options_parser.obj build\\debug\\mongo\\util\\options_parser\\startup_option_init.obj build\\debug\\mongo\\util\\options_parser\\startup_options.obj build\\debug\\mongo\\util\\options_parser\\value.obj build\\debug\\third_party\\shim_yaml.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\binary.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\contrib\\graphbuilder.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\contrib\\graphbuilderadapter.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\convert.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\directives.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\emit.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\emitfromevents.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\emitter.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\emitterstate.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\emitterutils.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\exceptions.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\exp.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\memory.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\node.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\node_data.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\nodebuilder.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\nodeevents.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\null.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\ostream_wrapper.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\parse.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\parser.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\regex_yaml.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\scanner.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\scanscalar.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\scantag.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\scantoken.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\simplekey.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\singledocparser.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\stream.obj build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\tag.obj build\\debug\\mongo\\util\\net\\cidr.obj build\\debug\\mongo\\util\\net\\hostandport.obj build\\debug\\mongo\\util\\net\\hostname_canonicalization.obj build\\debug\\mongo\\util\\net\\sockaddr.obj build\\debug\\mongo\\util\\net\\socket_exception.obj build\\debug\\mongo\\util\\net\\socket_utils.obj build\\debug\\mongo\\util\\net\\hostandport_gen.obj build\\debug\\mongo\\util\\winutil.obj build\\debug\\mongo\\util\\concurrency\\spin_lock.obj build\\debug\\mongo\\util\\net\\http_client_winhttp.obj build\\debug\\mongo\\idl\\idl_parser.obj build\\debug\\mongo\\db\\command_generic_argument.obj build\\debug\\mongo\\crypto\\sha_block_windows.obj build\\debug\\mongo\\crypto\\sha1_block.obj build\\debug\\mongo\\crypto\\sha256_block.obj build\\debug\\mongo\\util\\secure_compare_memory.obj build\\debug\\mongo\\base\\secure_allocator.obj build\\debug\\mongo\\util\\secure_zero_memory.obj build\\debug\\mongo\\util\\processinfo.obj build\\debug\\mongo\\util\\processinfo_windows.obj build\\debug\\mongo\\db\\server_options.obj build\\debug\\mongo\\bson\\util\\bson_extract.obj build\\debug\\mongo\\base\\data_range.obj build\\debug\\mongo\\base\\data_range_cursor.obj build\\debug\\mongo\\base\\data_type.obj build\\debug\\mongo\\base\\data_type_string_data.obj build\\debug\\mongo\\base\\data_type_terminated.obj build\\debug\\mongo\\base\\error_codes.obj build\\debug\\mongo\\base\\error_extra_info.obj build\\debug\\mongo\\base\\global_initializer.obj build\\debug\\mongo\\base\\global_initializer_registerer.obj build\\debug\\mongo\\base\\init.obj build\\debug\\mongo\\base\\initializer.obj build\\debug\\mongo\\base\\initializer_dependency_graph.obj build\\debug\\mongo\\base\\make_string_vector.obj build\\debug\\mongo\\base\\parse_number.obj build\\debug\\mongo\\base\\shim.obj build\\debug\\mongo\\base\\simple_string_data_comparator.obj build\\debug\\mongo\\base\\status.obj build\\debug\\mongo\\base\\string_data.obj build\\debug\\mongo\\base\\transaction_error.obj build\\debug\\mongo\\base\\validate_locale.obj build\\debug\\mongo\\bson\\bson_comparator_interface_base.obj build\\debug\\mongo\\bson\\bson_depth.obj build\\debug\\mongo\\bson\\bson_validate.obj build\\debug\\mongo\\bson\\bsonelement.obj build\\debug\\mongo\\bson\\bsonmisc.obj build\\debug\\mongo\\bson\\bsonobj.obj build\\debug\\mongo\\bson\\bsonobjbuilder.obj build\\debug\\mongo\\bson\\bsontypes.obj build\\debug\\mongo\\bson\\json.obj build\\debug\\mongo\\bson\\oid.obj build\\debug\\mongo\\bson\\simple_bsonelement_comparator.obj build\\debug\\mongo\\bson\\simple_bsonobj_comparator.obj build\\debug\\mongo\\bson\\timestamp.obj build\\debug\\mongo\\logger\\component_message_log_domain.obj build\\debug\\mongo\\logger\\console.obj build\\debug\\mongo\\logger\\log_component.obj build\\debug\\mongo\\logger\\log_component_settings.obj build\\debug\\mongo\\logger\\log_manager.obj build\\debug\\mongo\\logger\\log_severity.obj build\\debug\\mongo\\logger\\logger.obj build\\debug\\mongo\\logger\\logstream_builder.obj build\\debug\\mongo\\logger\\message_event_utf8_encoder.obj build\\debug\\mongo\\logger\\message_log_domain.obj build\\debug\\mongo\\logger\\ramlog.obj build\\debug\\mongo\\logger\\redaction.obj build\\debug\\mongo\\logger\\rotatable_file_manager.obj build\\debug\\mongo\\logger\\rotatable_file_writer.obj build\\debug\\mongo\\platform\\decimal128.obj build\\debug\\mongo\\platform\\mutex.obj build\\debug\\mongo\\platform\\posix_fadvise.obj build\\debug\\mongo\\platform\\process_id.obj build\\debug\\mongo\\platform\\random.obj build\\debug\\mongo\\platform\\shared_library.obj build\\debug\\mongo\\platform\\shared_library_windows.obj build\\debug\\mongo\\platform\\stack_locator.obj build\\debug\\mongo\\platform\\stack_locator_windows.obj build\\debug\\mongo\\platform\\strcasestr.obj build\\debug\\mongo\\platform\\strnlen.obj build\\debug\\mongo\\util\\allocator.obj build\\debug\\mongo\\util\\assert_util.obj build\\debug\\mongo\\util\\base64.obj build\\debug\\mongo\\util\\boost_assert_impl.obj build\\debug\\mongo\\util\\concurrency\\idle_thread_block.obj build\\debug\\mongo\\util\\concurrency\\thread_name.obj build\\debug\\mongo\\util\\duration.obj build\\debug\\mongo\\util\\errno_util.obj build\\debug\\mongo\\util\\exception_filter_win32.obj build\\debug\\mongo\\util\\exit.obj build\\debug\\mongo\\util\\file.obj build\\debug\\mongo\\util\\hex.obj build\\debug\\mongo\\util\\itoa.obj build\\debug\\mongo\\util\\log.obj build\\debug\\mongo\\util\\platform_init.obj build\\debug\\mongo\\util\\shell_exec.obj build\\debug\\mongo\\util\\signal_handlers_synchronous.obj build\\debug\\mongo\\util\\stacktrace.obj build\\debug\\mongo\\util\\stacktrace_windows.obj build\\debug\\mongo\\util\\startup_test.obj build\\debug\\mongo\\util\\str.obj build\\debug\\mongo\\util\\system_clock_source.obj build\\debug\\mongo\\util\\system_tick_source.obj build\\debug\\mongo\\util\\text.obj build\\debug\\mongo\\util\\time_support.obj build\\debug\\mongo\\util\\timer.obj build\\debug\\mongo\\util\\uuid.obj build\\debug\\mongo\\util\\version.obj build\\debug\\third_party\\shim_pcrecpp.obj build\\debug\\third_party\\pcre-8.42\\pcre_byte_order.obj build\\debug\\third_party\\pcre-8.42\\pcre_compile.obj build\\debug\\third_party\\pcre-8.42\\pcre_config.obj build\\debug\\third_party\\pcre-8.42\\pcre_dfa_exec.obj build\\debug\\third_party\\pcre-8.42\\pcre_exec.obj build\\debug\\third_party\\pcre-8.42\\pcre_fullinfo.obj build\\debug\\third_party\\pcre-8.42\\pcre_get.obj build\\debug\\third_party\\pcre-8.42\\pcre_globals.obj build\\debug\\third_party\\pcre-8.42\\pcre_maketables.obj build\\debug\\third_party\\pcre-8.42\\pcre_newline.obj build\\debug\\third_party\\pcre-8.42\\pcre_ord2utf8.obj build\\debug\\third_party\\pcre-8.42\\pcre_refcount.obj build\\debug\\third_party\\pcre-8.42\\pcre_string_utils.obj build\\debug\\third_party\\pcre-8.42\\pcre_study.obj build\\debug\\third_party\\pcre-8.42\\pcre_tables.obj build\\debug\\third_party\\pcre-8.42\\pcre_ucd.obj build\\debug\\third_party\\pcre-8.42\\pcre_valid_utf8.obj build\\debug\\third_party\\pcre-8.42\\pcre_version.obj build\\debug\\third_party\\pcre-8.42\\pcre_xclass.obj build\\debug\\third_party\\pcre-8.42\\pcre_chartables.obj build\\debug\\third_party\\pcre-8.42\\pcrecpp.obj build\\debug\\third_party\\pcre-8.42\\pcre_scanner.obj build\\debug\\third_party\\pcre-8.42\\pcre_stringpiece.obj build\\debug\\third_party\\shim_intel_decimal128.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_exception.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_four_over_pi.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_bessel.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_bid.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_cbrt.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_erf.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_exp.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_int.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_inv_hyper.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_inv_trig.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_lgamma.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_log.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_mod.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_ops.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_ops_64.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_pow.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_powi.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_sqrt.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_trig.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\sqrt_tab_t.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_2_str_tables.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_acos.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_acosh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_add.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_asin.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_asinh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_atan.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_atan2.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_atanh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_cbrt.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_compare.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_cos.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_cosh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_div.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_erf.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_erfc.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_exp.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_exp10.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_exp2.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_expm1.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_fdimd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_fma.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_fmod.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_frexp.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_hypot.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_ldexp.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_lgamma.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_llrintd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log10.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log1p.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log2.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_logb.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_logbd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_lrintd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_lround.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_minmax.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_modf.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_mul.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_nearbyintd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_next.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_nexttowardd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_noncomp.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_pow.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_quantexpd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_quantize.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_rem.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_round_integral.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_scalb.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_scalbl.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_sin.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_sinh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_sqrt.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_string.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_tan.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_tanh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_tgamma.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int16.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int32.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int64.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int8.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint16.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint32.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint64.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint8.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_acos.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_acosh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_add.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_asin.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_asinh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_atan.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_atan2.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_atanh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_cbrt.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_compare.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_cos.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_cosh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_div.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_erf.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_erfc.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_exp.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_exp10.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_exp2.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_expm1.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_fdimd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_fma.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_fmod.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_frexp.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_hypot.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_ldexp.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_lgamma.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_llrintd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log10.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log1p.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log2.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_logb.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_logbd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_lrintd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_lround.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_minmax.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_modf.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_mul.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_nearbyintd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_next.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_nexttowardd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_noncomp.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_pow.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_quantexpd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_quantize.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_rem.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_round_integral.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_scalb.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_scalbl.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sin.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sinh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sqrt.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_string.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sub.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_tan.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_tanh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_tgamma.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_bid128.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_bid64.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int16.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int32.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int64.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int8.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint16.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint32.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint64.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint8.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_acos.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_acosh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_add.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_asin.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_asinh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_atan.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_atan2.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_atanh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_cbrt.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_compare.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_cos.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_cosh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_div.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_erf.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_erfc.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_exp.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_exp10.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_exp2.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_expm1.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_fdimd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_fma.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_fmod.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_frexp.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_hypot.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_ldexp.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_lgamma.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_llrintd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log10.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log1p.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log2.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_logb.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_logbd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_lrintd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_lround.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_minmax.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_modf.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_mul.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_nearbyintd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_next.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_nexttowardd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_noncomp.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_pow.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_quantexpd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_quantize.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_rem.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_round_integral.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_scalb.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_scalbl.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_sin.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_sinh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_sqrt.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_string.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_tan.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_tanh.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_tgamma.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_bid128.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int16.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int32.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int64.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int8.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint16.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint32.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint64.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint8.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_binarydecimal.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_convert_data.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_decimal_data.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_decimal_globals.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_dpd.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_feclearexcept.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_fegetexceptflag.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_feraiseexcept.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_fesetexceptflag.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_fetestexcept.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_flag_operations.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_from_int.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_round.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\strtod128.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\strtod32.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\strtod64.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\wcstod128.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\wcstod32.obj build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\wcstod64.obj build\\debug\\third_party\\shim_fmt.obj build\\debug\\third_party\\fmt\\dist\\src\\format.obj build\\debug\\third_party\\fmt\\dist\\src\\posix.obj build\\debug\\third_party\\shim_boost.obj build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\cmdline.obj build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\config_file.obj build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\convert.obj build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\options_description.obj build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\parsers.obj build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\positional_options.obj build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\split.obj build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\utf8_codecvt_facet.obj build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\value_semantic.obj build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\variables_map.obj build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\winmain.obj build\\debug\\third_party\\boost-1.70.0\\libs\\iostreams\\src\\file_descriptor.obj build\\debug\\third_party\\boost-1.70.0\\libs\\iostreams\\src\\mapped_file.obj build\\debug\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\codecvt_error_category.obj build\\debug\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\operations.obj build\\debug\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\path.obj build\\debug\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\path_traits.obj build\\debug\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\portability.obj build\\debug\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\unique_path.obj build\\debug\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\utf8_codecvt_facet.obj build\\debug\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\windows_file_codecvt.obj build\\debug\\third_party\\boost-1.70.0\\libs\\system\\src\\error_code.obj build\\debug\\third_party\\shim_abseil.obj build\\debug\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.obj build\\debug\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\hash\\internal\\city.obj build\\debug\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\hash\\internal\\hash.obj build\\debug\\third_party\\murmurhash3\\MurmurHash3.obj build\\debug\\mongo\\util\\quick_exit.obj build\\debug\\third_party\\shim_allocator.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\base\\dynamic_annotations.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\base\\elf_mem_image.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\base\\logging.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\base\\spinlock.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\base\\spinlock_internal.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\base\\sysinfo.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\base\\vdso_support.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\central_freelist.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\common.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\internal_logging.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\malloc_extension.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\malloc_hook.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\memfs_malloc.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\page_heap.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\sampler.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\span.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\stack_trace_table.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\stacktrace.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\static_vars.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\symbolize.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\thread_cache.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\tcmalloc.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\windows\\port.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\windows\\system-alloc.obj build\\debug\\third_party\\gperftools-2.7\\dist\\src\\fake_stacktrace_scope.obj build\\debug\\mongo\\util\\debugger.obj build\\debug\\mongo\\util\\boost_assert_shim.obj build\\debug\\mongo\\shell\\mongodbcr.obj build\\debug\\mongo\\shell\\shell_options_init.obj "
  },
  {
    "path": "cmake/mongodb/windows-release.objects",
    "content": "build\\opt\\mongo\\util\\net\\ssl_options_client.obj build\\opt\\mongo\\util\\net\\ssl_options_client_gen.obj build\\opt\\mongo\\transport\\message_compressor_options_client_gen.obj build\\opt\\mongo\\shell\\kms_shell.obj build\\opt\\mongo\\shell\\linenoise.obj build\\opt\\mongo\\shell\\mk_wcwidth.obj build\\opt\\mongo\\shell\\mongo-server.obj build\\opt\\mongo\\shell\\shell_options.obj build\\opt\\mongo\\shell\\shell_utils.obj build\\opt\\mongo\\shell\\shell_utils_extended.obj build\\opt\\mongo\\shell\\shell_utils_launcher.obj build\\opt\\mongo\\util\\version_impl.obj build\\opt\\mongo\\util\\signal_handlers.obj build\\opt\\mongo\\util\\signal_win32.obj build\\opt\\mongo\\db\\log_process_details.obj build\\opt\\mongo\\db\\server_options_server_helpers.obj build\\opt\\mongo\\db\\server_options_base.obj build\\opt\\mongo\\db\\cluster_auth_mode_option_gen.obj build\\opt\\mongo\\db\\keyfile_option_gen.obj build\\opt\\mongo\\db\\server_options_base_gen.obj build\\opt\\mongo\\db\\server_options_general_gen.obj build\\opt\\mongo\\db\\server_options_nongeneral_gen.obj build\\opt\\mongo\\db\\repl\\is_master_response.obj build\\opt\\mongo\\db\\repl\\member_config.obj build\\opt\\mongo\\db\\repl\\repl_set_config.obj build\\opt\\mongo\\db\\repl\\repl_set_heartbeat_args_v1.obj build\\opt\\mongo\\db\\repl\\repl_set_heartbeat_response.obj build\\opt\\mongo\\db\\repl\\repl_set_request_votes_args.obj build\\opt\\mongo\\db\\repl\\repl_set_tag.obj build\\opt\\mongo\\db\\repl\\update_position_args.obj build\\opt\\mongo\\db\\repl\\last_vote.obj build\\opt\\mongo\\db\\repl\\repl_set_config_gen.obj build\\opt\\mongo\\db\\repl\\split_horizon.obj build\\opt\\mongo\\db\\concurrency\\d_concurrency.obj build\\opt\\mongo\\db\\concurrency\\lock_manager.obj build\\opt\\mongo\\db\\concurrency\\lock_state.obj build\\opt\\mongo\\db\\concurrency\\lock_stats.obj build\\opt\\mongo\\db\\concurrency\\replication_state_transition_lock_guard.obj build\\opt\\mongo\\util\\concurrency\\ticketholder.obj build\\opt\\mongo\\db\\concurrency\\flow_control_ticketholder.obj build\\opt\\mongo\\util\\password.obj build\\opt\\mongo\\util\\password_params_gen.obj build\\opt\\mongo\\util\\options_parser\\options_parser_init.obj build\\opt\\mongo\\shell\\bench.obj build\\opt\\mongo\\db\\traffic_reader.obj build\\opt\\mongo\\db\\logical_session_id_helpers.obj build\\opt\\mongo\\db\\catalog\\index_key_validate.obj build\\opt\\mongo\\db\\index\\btree_key_generator.obj build\\opt\\mongo\\db\\index\\expression_keys_private.obj build\\opt\\mongo\\db\\index\\sort_key_generator.obj build\\opt\\mongo\\db\\index\\wildcard_key_generator.obj build\\opt\\mongo\\db\\exec\\projection_exec_agg.obj build\\opt\\mongo\\db\\pipeline\\parsed_aggregation_projection.obj build\\opt\\mongo\\db\\pipeline\\parsed_aggregation_projection_node.obj build\\opt\\mongo\\db\\pipeline\\parsed_exclusion_projection.obj build\\opt\\mongo\\db\\pipeline\\parsed_inclusion_projection.obj build\\opt\\mongo\\db\\pipeline\\parsed_add_fields.obj build\\opt\\mongo\\db\\index\\expression_params.obj build\\opt\\mongo\\db\\index\\s2_common.obj build\\opt\\mongo\\db\\hasher.obj build\\opt\\mongo\\db\\fts\\fts_index_format.obj build\\opt\\mongo\\db\\fts\\fts_matcher.obj build\\opt\\mongo\\db\\fts\\fts_query_impl.obj build\\opt\\mongo\\db\\fts\\fts_query_parser.obj build\\opt\\mongo\\db\\fts\\fts_spec.obj build\\opt\\mongo\\db\\fts\\fts_spec_legacy.obj build\\opt\\mongo\\db\\fts\\fts_language.obj build\\opt\\mongo\\db\\fts\\fts_basic_phrase_matcher.obj build\\opt\\mongo\\db\\fts\\fts_basic_tokenizer.obj build\\opt\\mongo\\db\\fts\\fts_unicode_phrase_matcher.obj build\\opt\\mongo\\db\\fts\\fts_unicode_tokenizer.obj build\\opt\\mongo\\db\\fts\\fts_util.obj build\\opt\\mongo\\db\\fts\\fts_element_iterator.obj build\\opt\\mongo\\db\\fts\\stemmer.obj build\\opt\\mongo\\db\\fts\\stop_words.obj build\\opt\\mongo\\db\\fts\\stop_words_list.obj build\\opt\\mongo\\db\\fts\\tokenizer.obj build\\opt\\third_party\\shim_stemmer.obj build\\opt\\third_party\\libstemmer_c\\runtime\\api.obj build\\opt\\third_party\\libstemmer_c\\libstemmer\\libstemmer_utf8.obj build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_dutch.obj build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_german.obj build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_porter.obj build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_spanish.obj build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_english.obj build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_hungarian.obj build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_portuguese.obj build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_swedish.obj build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_finnish.obj build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_italian.obj build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_romanian.obj build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_turkish.obj build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_danish.obj build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_french.obj build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_norwegian.obj build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_russian.obj build\\opt\\mongo\\db\\fts\\unicode\\codepoints_casefold.obj build\\opt\\mongo\\db\\fts\\unicode\\codepoints_delimiter_list.obj build\\opt\\mongo\\db\\fts\\unicode\\codepoints_diacritic_list.obj build\\opt\\mongo\\db\\fts\\unicode\\codepoints_diacritic_map.obj build\\opt\\mongo\\db\\fts\\unicode\\string.obj build\\opt\\mongo\\shell\\linenoise_utf8.obj build\\opt\\mongo\\db\\index\\index_descriptor.obj build\\opt\\mongo\\db\\catalog\\index_catalog.obj build\\opt\\mongo\\db\\catalog\\index_catalog_entry.obj build\\opt\\mongo\\db\\catalog\\disable_index_spec_namespace_generation_gen.obj build\\opt\\mongo\\shell\\encrypted_dbclient_base.obj build\\opt\\mongo\\shell\\fle_shell_options_gen.obj build\\opt\\mongo\\shell\\shell_options_gen.obj build\\opt\\mongo\\shell\\shell_options_storage.obj build\\opt\\mongo\\shell\\kms.obj build\\opt\\mongo\\shell\\kms_aws.obj build\\opt\\mongo\\shell\\kms_local.obj build\\opt\\mongo\\shell\\kms_gen.obj build\\opt\\third_party\\shim_kms_message.obj build\\opt\\third_party\\kms-message\\src\\hexlify.obj build\\opt\\third_party\\kms-message\\src\\kms_b64.obj build\\opt\\third_party\\kms-message\\src\\kms_decrypt_request.obj build\\opt\\third_party\\kms-message\\src\\kms_encrypt_request.obj build\\opt\\third_party\\kms-message\\src\\kms_kv_list.obj build\\opt\\third_party\\kms-message\\src\\kms_message.obj build\\opt\\third_party\\kms-message\\src\\kms_request.obj build\\opt\\third_party\\kms-message\\src\\kms_request_opt.obj build\\opt\\third_party\\kms-message\\src\\kms_request_str.obj build\\opt\\third_party\\kms-message\\src\\kms_response.obj build\\opt\\third_party\\kms-message\\src\\kms_response_parser.obj build\\opt\\third_party\\kms-message\\src\\sort.obj build\\opt\\third_party\\kms-message\\src\\kms_crypto_windows.obj build\\opt\\mongo\\scripting\\mozjs\\base.obj build\\opt\\mongo\\scripting\\mozjs\\bindata.obj build\\opt\\mongo\\scripting\\mozjs\\bson.obj build\\opt\\mongo\\scripting\\mozjs\\code.obj build\\opt\\mongo\\scripting\\mozjs\\countdownlatch.obj build\\opt\\mongo\\scripting\\mozjs\\cursor.obj build\\opt\\mongo\\scripting\\mozjs\\cursor_handle.obj build\\opt\\mongo\\scripting\\mozjs\\db.obj build\\opt\\mongo\\scripting\\mozjs\\dbcollection.obj build\\opt\\mongo\\scripting\\mozjs\\dbpointer.obj build\\opt\\mongo\\scripting\\mozjs\\dbquery.obj build\\opt\\mongo\\scripting\\mozjs\\dbref.obj build\\opt\\mongo\\scripting\\mozjs\\engine.obj build\\opt\\mongo\\scripting\\mozjs\\error.obj build\\opt\\mongo\\scripting\\mozjs\\exception.obj build\\opt\\mongo\\scripting\\mozjs\\global.obj build\\opt\\mongo\\scripting\\mozjs\\idwrapper.obj build\\opt\\mongo\\scripting\\mozjs\\implscope.obj build\\opt\\mongo\\scripting\\mozjs\\internedstring.obj build\\opt\\mongo\\scripting\\mozjs\\jscustomallocator.obj build\\opt\\mongo\\scripting\\mozjs\\jsstringwrapper.obj build\\opt\\mongo\\scripting\\mozjs\\jsthread.obj build\\opt\\mongo\\scripting\\mozjs\\maxkey.obj build\\opt\\mongo\\scripting\\mozjs\\minkey.obj build\\opt\\mongo\\scripting\\mozjs\\mongo.obj build\\opt\\mongo\\scripting\\mozjs\\mongohelpers.obj build\\opt\\mongo\\scripting\\mozjs\\mongohelpers_js.obj build\\opt\\mongo\\scripting\\mozjs\\nativefunction.obj build\\opt\\mongo\\scripting\\mozjs\\numberdecimal.obj build\\opt\\mongo\\scripting\\mozjs\\numberint.obj build\\opt\\mongo\\scripting\\mozjs\\numberlong.obj build\\opt\\mongo\\scripting\\mozjs\\object.obj build\\opt\\mongo\\scripting\\mozjs\\objectwrapper.obj build\\opt\\mongo\\scripting\\mozjs\\oid.obj build\\opt\\mongo\\scripting\\mozjs\\PosixNSPR.obj build\\opt\\mongo\\scripting\\mozjs\\proxyscope.obj build\\opt\\mongo\\scripting\\mozjs\\regexp.obj build\\opt\\mongo\\scripting\\mozjs\\session.obj build\\opt\\mongo\\scripting\\mozjs\\status.obj build\\opt\\mongo\\scripting\\mozjs\\timestamp.obj build\\opt\\mongo\\scripting\\mozjs\\uri.obj build\\opt\\mongo\\scripting\\mozjs\\valuereader.obj build\\opt\\mongo\\scripting\\mozjs\\valuewriter.obj build\\opt\\mongo\\scripting\\mozjs\\engine_gen.obj build\\opt\\mongo\\scripting\\mozjs\\scripting_util_gen.obj build\\opt\\third_party\\shim_mozjs.obj build\\opt\\third_party\\mozjs-60\\mongo_sources\\mongoErrorReportToString.obj build\\opt\\third_party\\mozjs-60\\mongo_sources\\freeOpToJSContext.obj build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\builtin\\RegExp.obj build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\frontend\\Parser.obj build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\gc\\StoreBuffer.obj build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\jsarray.obj build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\jsmath.obj build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\mfbt\\Unified_cpp_mfbt0.obj build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\perf\\pm_stub.obj build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\util\\DoubleToString.obj build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\vm\\Interpreter.obj build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\vm\\JSAtom.obj build\\opt\\third_party\\mozjs-60\\extract\\mfbt\\Compression.obj build\\opt\\third_party\\mozjs-60\\extract\\mfbt\\double-conversion\\double-conversion\\strtod.obj build\\opt\\third_party\\mozjs-60\\extract\\mfbt\\lz4.obj build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\Printf.obj build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\TimeStamp.obj build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\StackWalk.obj build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\ConditionVariable_windows.obj build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\Mutex_windows.obj build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\TimeStamp_windows.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_acos.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_acosh.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_asin.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_atan2.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_atanh.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_cosh.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_exp.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_hypot.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_log.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_log10.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_log2.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_pow.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_sinh.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_sqrt.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\k_exp.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_asinh.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_atan.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_cbrt.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_ceil.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_ceilf.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_copysign.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_expm1.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_fabs.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_floor.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_floorf.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_log1p.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_nearbyint.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_rint.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_rintf.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_scalbn.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_tanh.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_trunc.obj build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_truncf.obj build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\jit\\x86-shared\\Disassembler-x86-shared.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src0.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src1.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src10.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src11.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src12.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src13.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src14.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src15.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src16.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src17.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src18.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src19.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src2.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src20.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src21.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src22.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src23.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src24.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src25.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src26.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src27.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src28.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src29.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src3.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src30.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src31.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src32.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src33.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src34.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src35.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src36.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src37.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src38.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src39.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src4.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src40.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src41.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src42.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src43.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src44.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src5.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src6.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src7.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src8.obj build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src9.obj build\\opt\\mongo\\scripting\\deadline_monitor.obj build\\opt\\mongo\\scripting\\deadline_monitor_gen.obj build\\opt\\mongo\\scripting\\dbdirectclient_factory.obj build\\opt\\mongo\\scripting\\engine.obj build\\opt\\mongo\\scripting\\jsexception.obj build\\opt\\mongo\\scripting\\utils.obj build\\opt\\mongo\\shell\\mongo.obj build\\opt\\mongo\\scripting\\bson_template_evaluator.obj build\\opt\\mongo\\crypto\\aead_encryption.obj build\\opt\\mongo\\db\\matcher\\expression.obj build\\opt\\mongo\\db\\matcher\\expression_algo.obj build\\opt\\mongo\\db\\matcher\\expression_array.obj build\\opt\\mongo\\db\\matcher\\expression_expr.obj build\\opt\\mongo\\db\\matcher\\expression_geo.obj build\\opt\\mongo\\db\\matcher\\expression_internal_expr_eq.obj build\\opt\\mongo\\db\\matcher\\expression_leaf.obj build\\opt\\mongo\\db\\matcher\\expression_parser.obj build\\opt\\mongo\\db\\matcher\\expression_text_base.obj build\\opt\\mongo\\db\\matcher\\expression_text_noop.obj build\\opt\\mongo\\db\\matcher\\expression_tree.obj build\\opt\\mongo\\db\\matcher\\expression_where_base.obj build\\opt\\mongo\\db\\matcher\\expression_where_noop.obj build\\opt\\mongo\\db\\matcher\\expression_with_placeholder.obj build\\opt\\mongo\\db\\matcher\\extensions_callback.obj build\\opt\\mongo\\db\\matcher\\extensions_callback_noop.obj build\\opt\\mongo\\db\\matcher\\match_details.obj build\\opt\\mongo\\db\\matcher\\matchable.obj build\\opt\\mongo\\db\\matcher\\matcher.obj build\\opt\\mongo\\db\\matcher\\matcher_type_set.obj build\\opt\\mongo\\db\\matcher\\rewrite_expr.obj build\\opt\\mongo\\db\\matcher\\schema\\encrypt_schema_types.obj build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_all_elem_match_from_index.obj build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_allowed_properties.obj build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_cond.obj build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_eq.obj build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_fmod.obj build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_match_array_index.obj build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_num_array_items.obj build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_num_properties.obj build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_object_match.obj build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_root_doc_eq.obj build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_str_length.obj build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_unique_items.obj build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_xor.obj build\\opt\\mongo\\db\\matcher\\schema\\json_pointer.obj build\\opt\\mongo\\db\\matcher\\schema\\json_schema_parser.obj build\\opt\\mongo\\db\\matcher\\schema\\encrypt_schema_gen.obj build\\opt\\mongo\\db\\query\\query_knobs_gen.obj build\\opt\\mongo\\db\\pipeline\\expression.obj build\\opt\\mongo\\db\\pipeline\\expression_trigonometric.obj build\\opt\\mongo\\util\\summation.obj build\\opt\\mongo\\util\\regex_util.obj build\\opt\\mongo\\db\\pipeline\\expression_context.obj build\\opt\\mongo\\db\\pipeline\\variables.obj build\\opt\\mongo\\db\\query\\collation\\collator_factory_interface.obj build\\opt\\mongo\\db\\query\\collation\\collation_index_key.obj build\\opt\\mongo\\db\\query\\collation\\collation_spec.obj build\\opt\\mongo\\db\\query\\collation\\collator_interface.obj build\\opt\\mongo\\db\\pipeline\\aggregation_request.obj build\\opt\\mongo\\db\\query\\explain_options.obj build\\opt\\mongo\\db\\pipeline\\document_source_change_stream_gen.obj build\\opt\\mongo\\db\\pipeline\\document_source_list_sessions_gen.obj build\\opt\\mongo\\db\\pipeline\\document_source_merge_gen.obj build\\opt\\mongo\\db\\pipeline\\document_source_merge_modes_gen.obj build\\opt\\mongo\\db\\pipeline\\document_source_replace_root_gen.obj build\\opt\\mongo\\db\\pipeline\\exchange_spec_gen.obj build\\opt\\mongo\\db\\pipeline\\value_gen.obj build\\opt\\mongo\\db\\pipeline\\document_source_merge_spec.obj build\\opt\\mongo\\db\\pipeline\\resume_token.obj build\\opt\\mongo\\db\\storage\\key_string.obj build\\opt\\mongo\\db\\pipeline\\dependencies.obj build\\opt\\mongo\\db\\pipeline\\document.obj build\\opt\\mongo\\db\\pipeline\\document_comparator.obj build\\opt\\mongo\\db\\pipeline\\document_path_support.obj build\\opt\\mongo\\db\\pipeline\\value.obj build\\opt\\mongo\\db\\pipeline\\value_comparator.obj build\\opt\\mongo\\util\\intrusive_counter.obj build\\opt\\mongo\\db\\query\\datetime\\date_time_support.obj build\\opt\\third_party\\shim_timelib.obj build\\opt\\third_party\\timelib-2018.01\\astro.obj build\\opt\\third_party\\timelib-2018.01\\dow.obj build\\opt\\third_party\\timelib-2018.01\\interval.obj build\\opt\\third_party\\timelib-2018.01\\parse_date.obj build\\opt\\third_party\\timelib-2018.01\\parse_iso_intervals.obj build\\opt\\third_party\\timelib-2018.01\\parse_tz.obj build\\opt\\third_party\\timelib-2018.01\\parse_zoneinfo.obj build\\opt\\third_party\\timelib-2018.01\\timelib.obj build\\opt\\third_party\\timelib-2018.01\\tm2unixtime.obj build\\opt\\third_party\\timelib-2018.01\\unixtime2tm.obj build\\opt\\mongo\\db\\pipeline\\field_path.obj build\\opt\\mongo\\db\\matcher\\path.obj build\\opt\\mongo\\db\\matcher\\path_internal.obj build\\opt\\mongo\\db\\geo\\geoparser.obj build\\opt\\mongo\\db\\geo\\geometry_container.obj build\\opt\\mongo\\db\\geo\\hash.obj build\\opt\\mongo\\db\\geo\\shapes.obj build\\opt\\mongo\\db\\geo\\big_polygon.obj build\\opt\\mongo\\db\\geo\\r2_region_coverer.obj build\\opt\\third_party\\s2\\s1angle.obj build\\opt\\third_party\\s2\\s2.obj build\\opt\\third_party\\s2\\s2cellid.obj build\\opt\\third_party\\s2\\s2latlng.obj build\\opt\\third_party\\s2\\s1interval.obj build\\opt\\third_party\\s2\\s2cap.obj build\\opt\\third_party\\s2\\s2cell.obj build\\opt\\third_party\\s2\\s2cellunion.obj build\\opt\\third_party\\s2\\s2edgeindex.obj build\\opt\\third_party\\s2\\s2edgeutil.obj build\\opt\\third_party\\s2\\s2latlngrect.obj build\\opt\\third_party\\s2\\s2loop.obj build\\opt\\third_party\\s2\\s2pointregion.obj build\\opt\\third_party\\s2\\s2polygon.obj build\\opt\\third_party\\s2\\s2polygonbuilder.obj build\\opt\\third_party\\s2\\s2polyline.obj build\\opt\\third_party\\s2\\s2r2rect.obj build\\opt\\third_party\\s2\\s2region.obj build\\opt\\third_party\\s2\\s2regioncoverer.obj build\\opt\\third_party\\s2\\s2regionintersection.obj build\\opt\\third_party\\s2\\s2regionunion.obj build\\opt\\third_party\\s2\\util\\math\\mathutil.obj build\\opt\\third_party\\s2\\util\\coding\\coder.obj build\\opt\\third_party\\s2\\util\\coding\\varint.obj build\\opt\\third_party\\s2\\strings\\split.obj build\\opt\\third_party\\s2\\strings\\stringprintf.obj build\\opt\\third_party\\s2\\strings\\strutil.obj build\\opt\\third_party\\s2\\base\\int128.obj build\\opt\\third_party\\s2\\base\\logging.obj build\\opt\\third_party\\s2\\base\\stringprintf.obj build\\opt\\third_party\\s2\\base\\strtoint.obj build\\opt\\mongo\\db\\fts\\fts_query_noop.obj build\\opt\\mongo\\crypto\\symmetric_crypto.obj build\\opt\\mongo\\crypto\\symmetric_crypto_windows.obj build\\opt\\mongo\\crypto\\symmetric_key.obj build\\opt\\mongo\\db\\views\\resolved_view.obj build\\opt\\mongo\\db\\storage\\duplicate_key_error_info.obj build\\opt\\mongo\\client\\connection_string_connect.obj build\\opt\\mongo\\client\\mongo_uri_connect.obj build\\opt\\mongo\\client\\connpool.obj build\\opt\\mongo\\client\\dbclient_connection.obj build\\opt\\mongo\\client\\dbclient_rs.obj build\\opt\\mongo\\client\\global_conn_pool.obj build\\opt\\mongo\\client\\global_conn_pool_gen.obj build\\opt\\mongo\\client\\replica_set_change_notifier.obj build\\opt\\mongo\\client\\replica_set_monitor.obj build\\opt\\mongo\\client\\replica_set_monitor_manager.obj build\\opt\\mongo\\executor\\thread_pool_task_executor.obj build\\opt\\mongo\\executor\\network_interface_thread_pool.obj build\\opt\\mongo\\executor\\network_interface_factory.obj build\\opt\\mongo\\executor\\connection_pool_tl.obj build\\opt\\mongo\\executor\\network_interface_tl.obj build\\opt\\mongo\\transport\\transport_layer_manager.obj build\\opt\\mongo\\transport\\service_executor_adaptive.obj build\\opt\\mongo\\transport\\service_executor_reserved.obj build\\opt\\mongo\\transport\\service_executor_synchronous.obj build\\opt\\mongo\\transport\\service_executor_gen.obj build\\opt\\mongo\\transport\\transport_layer_asio.obj build\\opt\\mongo\\base\\system_error.obj build\\opt\\mongo\\client\\async_client.obj build\\opt\\mongo\\transport\\message_compressor_manager.obj build\\opt\\mongo\\transport\\message_compressor_metrics.obj build\\opt\\mongo\\transport\\message_compressor_registry.obj build\\opt\\mongo\\transport\\message_compressor_snappy.obj build\\opt\\mongo\\transport\\message_compressor_zlib.obj build\\opt\\mongo\\transport\\message_compressor_zstd.obj build\\opt\\third_party\\shim_zstd.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\entropy_common.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\fse_decompress.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\threading.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\pool.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\zstd_common.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\error_private.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\xxhash.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\hist.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\fse_compress.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\huf_compress.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_compress.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstdmt_compress.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_fast.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_double_fast.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_lazy.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_opt.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_ldm.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\decompress\\huf_decompress.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\decompress\\zstd_decompress.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\cover.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\fastcover.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\divsufsort.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\zdict.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\deprecated\\zbuff_common.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\deprecated\\zbuff_compress.obj build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\deprecated\\zbuff_decompress.obj build\\opt\\third_party\\shim_zlib.obj build\\opt\\third_party\\zlib-1.2.11\\adler32.obj build\\opt\\third_party\\zlib-1.2.11\\crc32.obj build\\opt\\third_party\\zlib-1.2.11\\compress.obj build\\opt\\third_party\\zlib-1.2.11\\deflate.obj build\\opt\\third_party\\zlib-1.2.11\\infback.obj build\\opt\\third_party\\zlib-1.2.11\\inffast.obj build\\opt\\third_party\\zlib-1.2.11\\inflate.obj build\\opt\\third_party\\zlib-1.2.11\\inftrees.obj build\\opt\\third_party\\zlib-1.2.11\\trees.obj build\\opt\\third_party\\zlib-1.2.11\\uncompr.obj build\\opt\\third_party\\zlib-1.2.11\\zutil.obj build\\opt\\third_party\\shim_snappy.obj build\\opt\\third_party\\snappy-1.1.7\\snappy-c.obj build\\opt\\third_party\\snappy-1.1.7\\snappy.obj build\\opt\\third_party\\snappy-1.1.7\\snappy-sinksource.obj build\\opt\\mongo\\executor\\network_interface.obj build\\opt\\mongo\\executor\\task_executor.obj build\\opt\\mongo\\executor\\connection_pool.obj build\\opt\\mongo\\executor\\egress_tag_closer_manager.obj build\\opt\\mongo\\executor\\connection_pool_stats.obj build\\opt\\mongo\\client\\dbclient_base.obj build\\opt\\mongo\\client\\dbclient_cursor.obj build\\opt\\mongo\\client\\index_spec.obj build\\opt\\mongo\\util\\net\\private\\ssl_expiration.obj build\\opt\\mongo\\util\\net\\ssl_manager.obj build\\opt\\mongo\\util\\net\\ssl_parameters.obj build\\opt\\mongo\\util\\net\\ssl_manager_windows.obj build\\opt\\mongo\\util\\net\\ssl_stream.obj build\\opt\\mongo\\util\\net\\ssl_parameters_gen.obj build\\opt\\third_party\\shim_asio.obj build\\opt\\third_party\\asio-master\\asio\\src\\asio.obj build\\opt\\mongo\\util\\net\\ssl_types.obj build\\opt\\mongo\\util\\net\\ssl_options.obj build\\opt\\mongo\\util\\net\\private\\socket_poll.obj build\\opt\\mongo\\util\\net\\sock.obj build\\opt\\mongo\\util\\background.obj build\\opt\\mongo\\db\\commands\\server_status.obj build\\opt\\mongo\\db\\stats\\counters.obj build\\opt\\mongo\\db\\commands.obj build\\opt\\mongo\\db\\audit.obj build\\opt\\mongo\\db\\query\\count_command_as_aggregation_command.obj build\\opt\\mongo\\db\\query\\count_request.obj build\\opt\\mongo\\db\\query\\cursor_request.obj build\\opt\\mongo\\db\\query\\cursor_response.obj build\\opt\\mongo\\db\\query\\find_and_modify_request.obj build\\opt\\mongo\\db\\query\\getmore_request.obj build\\opt\\mongo\\db\\query\\killcursors_request.obj build\\opt\\mongo\\db\\query\\killcursors_response.obj build\\opt\\mongo\\db\\query\\view_response_formatter.obj build\\opt\\mongo\\db\\query\\count_command_gen.obj build\\opt\\mongo\\rpc\\factory.obj build\\opt\\mongo\\rpc\\object_check.obj build\\opt\\mongo\\rpc\\legacy_request.obj build\\opt\\mongo\\rpc\\legacy_request_builder.obj build\\opt\\mongo\\rpc\\legacy_reply.obj build\\opt\\mongo\\rpc\\legacy_reply_builder.obj build\\opt\\mongo\\rpc\\reply_builder_interface.obj build\\opt\\mongo\\rpc\\object_check_gen.obj build\\opt\\mongo\\s\\catalog\\mongo_version_range.obj build\\opt\\mongo\\s\\catalog\\type_changelog.obj build\\opt\\mongo\\s\\catalog\\type_chunk.obj build\\opt\\mongo\\s\\catalog\\type_collection.obj build\\opt\\mongo\\s\\catalog\\type_config_version.obj build\\opt\\mongo\\s\\catalog\\type_database.obj build\\opt\\mongo\\s\\catalog\\type_lockpings.obj build\\opt\\mongo\\s\\catalog\\type_locks.obj build\\opt\\mongo\\s\\catalog\\type_mongos.obj build\\opt\\mongo\\s\\catalog\\type_shard_collection.obj build\\opt\\mongo\\s\\catalog\\type_shard_database.obj build\\opt\\mongo\\s\\catalog\\type_shard.obj build\\opt\\mongo\\s\\catalog\\type_tags.obj build\\opt\\mongo\\s\\request_types\\add_shard_request_type.obj build\\opt\\mongo\\s\\request_types\\add_shard_to_zone_request_type.obj build\\opt\\mongo\\s\\request_types\\balance_chunk_request_type.obj build\\opt\\mongo\\s\\request_types\\commit_chunk_migration_request_type.obj build\\opt\\mongo\\s\\request_types\\merge_chunk_request_type.obj build\\opt\\mongo\\s\\request_types\\migration_secondary_throttle_options.obj build\\opt\\mongo\\s\\request_types\\move_chunk_request.obj build\\opt\\mongo\\s\\request_types\\remove_shard_from_zone_request_type.obj build\\opt\\mongo\\s\\request_types\\set_shard_version_request.obj build\\opt\\mongo\\s\\request_types\\split_chunk_request_type.obj build\\opt\\mongo\\s\\request_types\\update_zone_key_range_request_type.obj build\\opt\\mongo\\s\\cannot_implicitly_create_collection_info.obj build\\opt\\mongo\\s\\chunk_version.obj build\\opt\\mongo\\s\\database_version_helpers.obj build\\opt\\mongo\\s\\shard_id.obj build\\opt\\mongo\\s\\stale_exception.obj build\\opt\\mongo\\s\\would_change_owning_shard_exception.obj build\\opt\\mongo\\s\\catalog\\type_chunk_base_gen.obj build\\opt\\mongo\\s\\chunk_version_gen.obj build\\opt\\mongo\\s\\database_version_gen.obj build\\opt\\mongo\\s\\request_types\\clone_catalog_data_gen.obj build\\opt\\mongo\\s\\request_types\\clear_jumbo_flag_gen.obj build\\opt\\mongo\\s\\request_types\\create_collection_gen.obj build\\opt\\mongo\\s\\request_types\\create_database_gen.obj build\\opt\\mongo\\s\\request_types\\flush_database_cache_updates_gen.obj build\\opt\\mongo\\s\\request_types\\flush_routing_table_cache_updates_gen.obj build\\opt\\mongo\\s\\request_types\\get_database_version_gen.obj build\\opt\\mongo\\s\\request_types\\move_primary_gen.obj build\\opt\\mongo\\s\\request_types\\shard_collection_gen.obj build\\opt\\mongo\\s\\request_types\\clone_collection_options_from_primary_shard_gen.obj build\\opt\\mongo\\s\\request_types\\wait_for_fail_point_gen.obj build\\opt\\mongo\\rpc\\message.obj build\\opt\\mongo\\rpc\\op_msg.obj build\\opt\\mongo\\rpc\\protocol.obj build\\opt\\third_party\\wiredtiger\\src\\checksum\\software\\checksum.obj build\\opt\\third_party\\wiredtiger\\src\\checksum\\x86\\crc32-x86.obj build\\opt\\third_party\\wiredtiger\\src\\checksum\\x86\\crc32-x86-alt.obj build\\opt\\mongo\\db\\wire_version.obj build\\opt\\mongo\\db\\bson\\dotted_path_support.obj build\\opt\\mongo\\db\\query\\query_request.obj build\\opt\\mongo\\db\\query\\tailable_mode.obj build\\opt\\mongo\\db\\query\\tailable_mode_gen.obj build\\opt\\mongo\\db\\repl\\read_concern_args.obj build\\opt\\mongo\\db\\catalog\\collection_catalog.obj build\\opt\\mongo\\db\\catalog\\collection.obj build\\opt\\mongo\\db\\ops\\write_ops_parsers.obj build\\opt\\mongo\\db\\ops\\write_ops_gen.obj build\\opt\\mongo\\db\\query\\hint_parser.obj build\\opt\\mongo\\db\\query\\hint_gen.obj build\\opt\\mongo\\db\\pipeline\\runtime_constants_gen.obj build\\opt\\mongo\\db\\dbmessage.obj build\\opt\\mongo\\client\\connection_string.obj build\\opt\\mongo\\client\\mongo_uri.obj build\\opt\\mongo\\util\\dns_query.obj build\\opt\\mongo\\client\\query.obj build\\opt\\mongo\\client\\authenticate.obj build\\opt\\mongo\\client\\native_sasl_client_session.obj build\\opt\\mongo\\client\\sasl_client_authenticate.obj build\\opt\\mongo\\client\\sasl_client_authenticate_impl.obj build\\opt\\mongo\\client\\sasl_client_conversation.obj build\\opt\\mongo\\client\\sasl_client_session.obj build\\opt\\mongo\\client\\sasl_plain_client_conversation.obj build\\opt\\mongo\\client\\sasl_scram_client_conversation.obj build\\opt\\mongo\\util\\md5.obj build\\opt\\mongo\\util\\password_digest.obj build\\opt\\mongo\\util\\icu.obj build\\opt\\mongo\\util\\icu_init.obj build\\opt\\third_party\\shim_icu.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\affixpatternparser.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\alphaindex.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\anytrans.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\astro.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\basictz.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\bocsu.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\brktrans.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\buddhcal.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\calendar.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\casetrn.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\cecal.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\chnsecal.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\choicfmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\coleitr.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\coll.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collation.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationbuilder.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationcompare.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationdata.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationdatabuilder.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationdatareader.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationdatawriter.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationfastlatin.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationfastlatinbuilder.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationfcd.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationiterator.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationkeys.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationroot.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationrootelements.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationruleparser.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationsets.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationsettings.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationtailoring.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationweights.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\compactdecimalformat.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\coptccal.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\cpdtrans.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csdetect.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csmatch.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csr2022.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csrecog.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csrmbcs.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csrsbcs.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csrucode.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csrutf8.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\curramt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\currfmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\currpinf.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\currunit.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dangical.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\datefmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dayperiodrules.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dcfmtsym.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decContext.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decNumber.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decfmtst.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decimalformatpattern.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decimfmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decimfmtimpl.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitaffix.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitaffixesandpadding.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitformatter.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitgrouping.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitinterval.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitlst.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dtfmtsym.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dtitvfmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dtitvinf.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dtptngen.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dtrule.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\esctrn.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ethpccal.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\fmtable.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\fmtable_cnv.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\format.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\fphdlimp.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\fpositer.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\funcrepl.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\gender.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\gregocal.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\gregoimp.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\hebrwcal.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\identifier_info.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\indiancal.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\inputext.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\islamcal.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\japancal.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\measfmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\measunit.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\measure.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\msgfmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\name2uni.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\nfrs.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\nfrule.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\nfsubs.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\nortrans.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\nultrans.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\numfmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\numsys.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\olsontz.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\persncal.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\pluralaffix.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\plurfmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\plurrule.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\precision.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\quant.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\quantityformatter.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbnf.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbt_data.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbt_pars.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbt_rule.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbt_set.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbtz.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\regexcmp.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\regeximp.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\regexst.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\regextxt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\region.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\reldatefmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\reldtfmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rematch.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\remtrans.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\repattrn.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rulebasedcollator.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\scientificnumberformatter.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\scriptset.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\search.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\selfmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\sharedbreakiterator.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\simpletz.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\smallintformatter.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\smpdtfmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\smpdtfst.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\sortkey.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\standardplural.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\strmatch.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\strrepl.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\stsearch.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\taiwncal.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\timezone.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\titletrn.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tmunit.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tmutamt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tmutfmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tolowtrn.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\toupptrn.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\translit.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\transreg.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tridpars.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tzfmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tzgnames.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tznames.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tznames_impl.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tzrule.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tztrans.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucal.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucln_in.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucol.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucol_res.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucol_sit.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucoleitr.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucsdet.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\udat.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\udateintervalformat.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\udatpg.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ufieldpositer.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uitercollationiterator.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ulocdata.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\umsg.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\unesctrn.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uni2name.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\unum.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\unumsys.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\upluralrules.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uregex.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uregexc.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uregion.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\usearch.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uspoof.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_build.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_conf.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_impl.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_wsconf.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\utf16collationiterator.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\utf8collationiterator.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\utmscale.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\utrans.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\valueformatter.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\visibledigits.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\vtzone.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\vzone.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\windtfmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\winnmfmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\wintzimpl.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\zonemeta.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\zrule.obj build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ztrans.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\appendable.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\bmpset.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\brkeng.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\brkiter.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\bytestream.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\bytestrie.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\bytestriebuilder.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\bytestrieiterator.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\caniter.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\chariter.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\charstr.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\cmemory.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\cstr.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\cstring.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\cwchar.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\dictbe.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\dictionarydata.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\dtintrv.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\errorcode.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\filteredbrk.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\filterednormalizer2.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\icudataver.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\icuplug.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\listformatter.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\loadednormalizer2impl.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\locavailable.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\locbased.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\locdispnames.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\locdspnm.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\locid.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\loclikely.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\locmap.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\locresdata.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\locutil.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\messagepattern.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\normalizer2.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\normalizer2impl.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\normlzr.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\parsepos.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\patternprops.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\pluralmap.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\propname.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\propsvec.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\punycode.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\putil.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbi.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbidata.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbinode.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbirb.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbiscan.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbisetb.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbistbl.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbitblb.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\resbund.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\resbund_cnv.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\resource.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ruleiter.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\schriter.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\serv.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\servlk.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\servlkf.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\servls.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\servnotf.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\servrbf.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\servslkf.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\sharedobject.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\simpleformatter.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\stringpiece.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\stringtriebuilder.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uarrsort.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ubidi.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ubidi_props.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ubidiln.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ubidiwrt.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ubrk.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucase.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucasemap.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucasemap_titlecase_brkiter.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucat.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uchar.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucharstrie.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucharstriebuilder.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucharstrieiterator.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uchriter.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucln_cmn.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucmndata.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv2022.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_bld.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_cb.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_cnv.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_ct.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_err.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_ext.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_io.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_lmb.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_set.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_u16.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_u32.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_u7.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_u8.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvbocu.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvdisp.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvhz.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvisci.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvlat1.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvmbcs.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvscsu.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvsel.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucol_swp.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucurr.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\udata.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\udatamem.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\udataswp.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uenum.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uhash.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uhash_us.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uidna.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uinit.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uinvchar.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uiter.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ulist.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ulistformatter.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uloc.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uloc_keytype.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uloc_tag.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\umapfile.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\umath.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\umutex.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\unames.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\unifiedcache.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\unifilt.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\unifunct.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uniset.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uniset_closure.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uniset_props.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\unisetspan.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr_case.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr_case_locale.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr_cnv.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr_props.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr_titlecase_brkiter.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\unorm.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\unormcmp.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uobject.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uprops.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ures_cnv.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uresbund.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uresdata.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\usc_impl.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uscript.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uscript_props.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uset.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uset_props.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\usetiter.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ushape.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\usprep.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustack.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustr_cnv.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustr_titlecase_brkiter.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustr_wcs.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustrcase.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustrcase_locale.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustrenum.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustrfmt.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustring.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustrtrns.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\utext.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\utf_impl.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\util.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\util_props.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\utrace.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\utrie.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\utrie2.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\utrie2_builder.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uts46.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\utypes.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uvector.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uvectr32.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\uvectr64.obj build\\opt\\third_party\\icu4c-57.1\\source\\common\\wintz.obj build\\opt\\third_party\\icu4c-57.1\\source\\stubdata\\stubdata.obj build\\opt\\mongo\\rpc\\get_status_from_command_result.obj build\\opt\\mongo\\rpc\\write_concern_error_detail.obj build\\opt\\mongo\\executor\\remote_command_request.obj build\\opt\\mongo\\executor\\remote_command_response.obj build\\opt\\mongo\\rpc\\metadata.obj build\\opt\\mongo\\rpc\\metadata\\config_server_metadata.obj build\\opt\\mongo\\rpc\\metadata\\egress_metadata_hook_list.obj build\\opt\\mongo\\rpc\\metadata\\logical_time_metadata.obj build\\opt\\mongo\\rpc\\metadata\\sharding_metadata.obj build\\opt\\mongo\\rpc\\metadata\\repl_set_metadata.obj build\\opt\\mongo\\rpc\\metadata\\oplog_query_metadata.obj build\\opt\\mongo\\rpc\\metadata\\tracking_metadata.obj build\\opt\\mongo\\rpc\\metadata\\client_metadata.obj build\\opt\\mongo\\rpc\\metadata\\client_metadata_ismaster.obj build\\opt\\mongo\\transport\\service_entry_point_utils.obj build\\opt\\mongo\\transport\\session.obj build\\opt\\mongo\\transport\\transport_layer.obj build\\opt\\mongo\\s\\is_mongos.obj build\\opt\\mongo\\db\\logical_time_validator.obj build\\opt\\mongo\\db\\signed_logical_time.obj build\\opt\\mongo\\db\\keys_collection_manager_gen.obj build\\opt\\mongo\\db\\keys_collection_manager.obj build\\opt\\mongo\\db\\keys_collection_cache.obj build\\opt\\mongo\\db\\key_generator.obj build\\opt\\mongo\\db\\repl\\repl_client_info.obj build\\opt\\mongo\\db\\repl\\replication_coordinator.obj build\\opt\\mongo\\db\\repl\\replication_coordinator_noop.obj build\\opt\\mongo\\db\\repl\\replication_consistency_markers.obj build\\opt\\mongo\\db\\repl\\replication_process.obj build\\opt\\mongo\\db\\repl\\storage_interface.obj build\\opt\\mongo\\db\\repl\\rollback_gen.obj build\\opt\\mongo\\db\\namespace_string.obj build\\opt\\mongo\\db\\repl\\bson_extract_optime.obj build\\opt\\mongo\\db\\repl\\optime.obj build\\opt\\mongo\\db\\keys_collection_client_sharded.obj build\\opt\\mongo\\s\\catalog\\sharding_catalog_client.obj build\\opt\\mongo\\db\\logical_clock.obj build\\opt\\mongo\\db\\logical_clock_gen.obj build\\opt\\mongo\\db\\global_settings.obj build\\opt\\mongo\\db\\repl\\repl_settings.obj build\\opt\\mongo\\db\\repl\\repl_settings_gen.obj build\\opt\\mongo\\db\\keys_collection_document.obj build\\opt\\mongo\\db\\time_proof_service.obj build\\opt\\mongo\\db\\logical_time.obj build\\opt\\mongo\\db\\operation_time_tracker.obj build\\opt\\mongo\\db\\auth\\action_set.obj build\\opt\\mongo\\db\\auth\\action_type.obj build\\opt\\mongo\\db\\auth\\impersonation_session.obj build\\opt\\mongo\\db\\auth\\privilege.obj build\\opt\\mongo\\db\\auth\\privilege_parser.obj build\\opt\\mongo\\db\\auth\\resource_pattern.obj build\\opt\\mongo\\db\\auth\\user_management_commands_parser.obj build\\opt\\mongo\\rpc\\metadata\\impersonated_user_metadata.obj build\\opt\\mongo\\rpc\\metadata\\impersonated_user_metadata_gen.obj build\\opt\\mongo\\db\\server_options_helpers.obj build\\opt\\mongo\\db\\server_options_helpers_gen.obj build\\opt\\mongo\\util\\cmdline_utils\\censor_cmdline.obj build\\opt\\mongo\\db\\field_ref.obj build\\opt\\mongo\\db\\field_ref_set.obj build\\opt\\mongo\\db\\field_parser.obj build\\opt\\mongo\\db\\keypattern.obj build\\opt\\mongo\\db\\write_concern_options.obj build\\opt\\mongo\\db\\index_names.obj build\\opt\\mongo\\db\\commands\\test_commands_enabled.obj build\\opt\\mongo\\db\\commands\\test_commands_enabled_gen.obj build\\opt\\mongo\\db\\commands\\server_status_internal.obj build\\opt\\mongo\\db\\commands\\server_status_metric.obj build\\opt\\mongo\\db\\auth\\address_restriction.obj build\\opt\\mongo\\db\\auth\\address_restriction_gen.obj build\\opt\\mongo\\db\\auth\\restriction_environment.obj build\\opt\\mongo\\bson\\mutable\\document.obj build\\opt\\mongo\\bson\\mutable\\element.obj build\\opt\\mongo\\util\\safe_num.obj build\\opt\\mongo\\db\\auth\\authorization_manager.obj build\\opt\\mongo\\db\\auth\\authorization_session.obj build\\opt\\mongo\\db\\auth\\auth_decorations.obj build\\opt\\mongo\\db\\auth\\user_name.obj build\\opt\\mongo\\db\\auth\\role_name.obj build\\opt\\mongo\\client\\read_preference.obj build\\opt\\mongo\\db\\baton.obj build\\opt\\mongo\\db\\client.obj build\\opt\\mongo\\db\\default_baton.obj build\\opt\\mongo\\db\\operation_context.obj build\\opt\\mongo\\db\\operation_context_group.obj build\\opt\\mongo\\db\\service_context.obj build\\opt\\mongo\\db\\server_recovery.obj build\\opt\\mongo\\db\\unclean_shutdown.obj build\\opt\\mongo\\db\\repl_set_member_in_standalone_mode.obj build\\opt\\mongo\\util\\periodic_runner.obj build\\opt\\mongo\\util\\background_thread_clock_source.obj build\\opt\\mongo\\util\\clock_source.obj build\\opt\\mongo\\util\\fast_clock_source_factory.obj build\\opt\\mongo\\db\\storage\\write_unit_of_work.obj build\\opt\\mongo\\util\\fail_point.obj build\\opt\\mongo\\util\\fail_point_registry.obj build\\opt\\mongo\\util\\fail_point_service.obj build\\opt\\mongo\\util\\fail_point_server_parameter_gen.obj build\\opt\\mongo\\db\\storage\\storage_options.obj build\\opt\\mongo\\db\\storage\\storage_parameters_gen.obj build\\opt\\mongo\\db\\multi_key_path_tracker.obj build\\opt\\mongo\\db\\logical_session_id.obj build\\opt\\mongo\\db\\logical_session_id_gen.obj build\\opt\\mongo\\idl\\server_parameter.obj build\\opt\\mongo\\idl\\server_parameter_with_storage.obj build\\opt\\mongo\\util\\options_parser\\constraints.obj build\\opt\\mongo\\util\\options_parser\\environment.obj build\\opt\\mongo\\util\\options_parser\\option_description.obj build\\opt\\mongo\\util\\options_parser\\option_section.obj build\\opt\\mongo\\util\\options_parser\\options_parser.obj build\\opt\\mongo\\util\\options_parser\\startup_option_init.obj build\\opt\\mongo\\util\\options_parser\\startup_options.obj build\\opt\\mongo\\util\\options_parser\\value.obj build\\opt\\third_party\\shim_yaml.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\binary.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\contrib\\graphbuilder.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\contrib\\graphbuilderadapter.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\convert.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\directives.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\emit.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\emitfromevents.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\emitter.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\emitterstate.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\emitterutils.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\exceptions.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\exp.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\memory.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\node.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\node_data.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\nodebuilder.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\nodeevents.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\null.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\ostream_wrapper.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\parse.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\parser.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\regex_yaml.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\scanner.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\scanscalar.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\scantag.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\scantoken.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\simplekey.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\singledocparser.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\stream.obj build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\tag.obj build\\opt\\mongo\\util\\net\\cidr.obj build\\opt\\mongo\\util\\net\\hostandport.obj build\\opt\\mongo\\util\\net\\hostname_canonicalization.obj build\\opt\\mongo\\util\\net\\sockaddr.obj build\\opt\\mongo\\util\\net\\socket_exception.obj build\\opt\\mongo\\util\\net\\socket_utils.obj build\\opt\\mongo\\util\\net\\hostandport_gen.obj build\\opt\\mongo\\util\\winutil.obj build\\opt\\mongo\\util\\concurrency\\spin_lock.obj build\\opt\\mongo\\util\\net\\http_client_winhttp.obj build\\opt\\mongo\\idl\\idl_parser.obj build\\opt\\mongo\\db\\command_generic_argument.obj build\\opt\\mongo\\crypto\\sha_block_windows.obj build\\opt\\mongo\\crypto\\sha1_block.obj build\\opt\\mongo\\crypto\\sha256_block.obj build\\opt\\mongo\\util\\secure_compare_memory.obj build\\opt\\mongo\\base\\secure_allocator.obj build\\opt\\mongo\\util\\secure_zero_memory.obj build\\opt\\mongo\\util\\processinfo.obj build\\opt\\mongo\\util\\processinfo_windows.obj build\\opt\\mongo\\db\\server_options.obj build\\opt\\mongo\\bson\\util\\bson_extract.obj build\\opt\\mongo\\base\\data_range.obj build\\opt\\mongo\\base\\data_range_cursor.obj build\\opt\\mongo\\base\\data_type.obj build\\opt\\mongo\\base\\data_type_string_data.obj build\\opt\\mongo\\base\\data_type_terminated.obj build\\opt\\mongo\\base\\error_codes.obj build\\opt\\mongo\\base\\error_extra_info.obj build\\opt\\mongo\\base\\global_initializer.obj build\\opt\\mongo\\base\\global_initializer_registerer.obj build\\opt\\mongo\\base\\init.obj build\\opt\\mongo\\base\\initializer.obj build\\opt\\mongo\\base\\initializer_dependency_graph.obj build\\opt\\mongo\\base\\make_string_vector.obj build\\opt\\mongo\\base\\parse_number.obj build\\opt\\mongo\\base\\shim.obj build\\opt\\mongo\\base\\simple_string_data_comparator.obj build\\opt\\mongo\\base\\status.obj build\\opt\\mongo\\base\\string_data.obj build\\opt\\mongo\\base\\transaction_error.obj build\\opt\\mongo\\base\\validate_locale.obj build\\opt\\mongo\\bson\\bson_comparator_interface_base.obj build\\opt\\mongo\\bson\\bson_depth.obj build\\opt\\mongo\\bson\\bson_validate.obj build\\opt\\mongo\\bson\\bsonelement.obj build\\opt\\mongo\\bson\\bsonmisc.obj build\\opt\\mongo\\bson\\bsonobj.obj build\\opt\\mongo\\bson\\bsonobjbuilder.obj build\\opt\\mongo\\bson\\bsontypes.obj build\\opt\\mongo\\bson\\json.obj build\\opt\\mongo\\bson\\oid.obj build\\opt\\mongo\\bson\\simple_bsonelement_comparator.obj build\\opt\\mongo\\bson\\simple_bsonobj_comparator.obj build\\opt\\mongo\\bson\\timestamp.obj build\\opt\\mongo\\logger\\component_message_log_domain.obj build\\opt\\mongo\\logger\\console.obj build\\opt\\mongo\\logger\\log_component.obj build\\opt\\mongo\\logger\\log_component_settings.obj build\\opt\\mongo\\logger\\log_manager.obj build\\opt\\mongo\\logger\\log_severity.obj build\\opt\\mongo\\logger\\logger.obj build\\opt\\mongo\\logger\\logstream_builder.obj build\\opt\\mongo\\logger\\message_event_utf8_encoder.obj build\\opt\\mongo\\logger\\message_log_domain.obj build\\opt\\mongo\\logger\\ramlog.obj build\\opt\\mongo\\logger\\redaction.obj build\\opt\\mongo\\logger\\rotatable_file_manager.obj build\\opt\\mongo\\logger\\rotatable_file_writer.obj build\\opt\\mongo\\platform\\decimal128.obj build\\opt\\mongo\\platform\\mutex.obj build\\opt\\mongo\\platform\\posix_fadvise.obj build\\opt\\mongo\\platform\\process_id.obj build\\opt\\mongo\\platform\\random.obj build\\opt\\mongo\\platform\\shared_library.obj build\\opt\\mongo\\platform\\shared_library_windows.obj build\\opt\\mongo\\platform\\stack_locator.obj build\\opt\\mongo\\platform\\stack_locator_windows.obj build\\opt\\mongo\\platform\\strcasestr.obj build\\opt\\mongo\\platform\\strnlen.obj build\\opt\\mongo\\util\\allocator.obj build\\opt\\mongo\\util\\assert_util.obj build\\opt\\mongo\\util\\base64.obj build\\opt\\mongo\\util\\boost_assert_impl.obj build\\opt\\mongo\\util\\concurrency\\idle_thread_block.obj build\\opt\\mongo\\util\\concurrency\\thread_name.obj build\\opt\\mongo\\util\\duration.obj build\\opt\\mongo\\util\\errno_util.obj build\\opt\\mongo\\util\\exception_filter_win32.obj build\\opt\\mongo\\util\\exit.obj build\\opt\\mongo\\util\\file.obj build\\opt\\mongo\\util\\hex.obj build\\opt\\mongo\\util\\itoa.obj build\\opt\\mongo\\util\\log.obj build\\opt\\mongo\\util\\platform_init.obj build\\opt\\mongo\\util\\shell_exec.obj build\\opt\\mongo\\util\\signal_handlers_synchronous.obj build\\opt\\mongo\\util\\stacktrace.obj build\\opt\\mongo\\util\\stacktrace_windows.obj build\\opt\\mongo\\util\\startup_test.obj build\\opt\\mongo\\util\\str.obj build\\opt\\mongo\\util\\system_clock_source.obj build\\opt\\mongo\\util\\system_tick_source.obj build\\opt\\mongo\\util\\text.obj build\\opt\\mongo\\util\\time_support.obj build\\opt\\mongo\\util\\timer.obj build\\opt\\mongo\\util\\uuid.obj build\\opt\\mongo\\util\\version.obj build\\opt\\third_party\\shim_pcrecpp.obj build\\opt\\third_party\\pcre-8.42\\pcre_byte_order.obj build\\opt\\third_party\\pcre-8.42\\pcre_compile.obj build\\opt\\third_party\\pcre-8.42\\pcre_config.obj build\\opt\\third_party\\pcre-8.42\\pcre_dfa_exec.obj build\\opt\\third_party\\pcre-8.42\\pcre_exec.obj build\\opt\\third_party\\pcre-8.42\\pcre_fullinfo.obj build\\opt\\third_party\\pcre-8.42\\pcre_get.obj build\\opt\\third_party\\pcre-8.42\\pcre_globals.obj build\\opt\\third_party\\pcre-8.42\\pcre_maketables.obj build\\opt\\third_party\\pcre-8.42\\pcre_newline.obj build\\opt\\third_party\\pcre-8.42\\pcre_ord2utf8.obj build\\opt\\third_party\\pcre-8.42\\pcre_refcount.obj build\\opt\\third_party\\pcre-8.42\\pcre_string_utils.obj build\\opt\\third_party\\pcre-8.42\\pcre_study.obj build\\opt\\third_party\\pcre-8.42\\pcre_tables.obj build\\opt\\third_party\\pcre-8.42\\pcre_ucd.obj build\\opt\\third_party\\pcre-8.42\\pcre_valid_utf8.obj build\\opt\\third_party\\pcre-8.42\\pcre_version.obj build\\opt\\third_party\\pcre-8.42\\pcre_xclass.obj build\\opt\\third_party\\pcre-8.42\\pcre_chartables.obj build\\opt\\third_party\\pcre-8.42\\pcrecpp.obj build\\opt\\third_party\\pcre-8.42\\pcre_scanner.obj build\\opt\\third_party\\pcre-8.42\\pcre_stringpiece.obj build\\opt\\third_party\\shim_intel_decimal128.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_exception.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_four_over_pi.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_bessel.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_bid.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_cbrt.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_erf.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_exp.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_int.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_inv_hyper.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_inv_trig.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_lgamma.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_log.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_mod.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_ops.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_ops_64.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_pow.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_powi.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_sqrt.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_trig.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\sqrt_tab_t.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_2_str_tables.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_acos.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_acosh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_add.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_asin.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_asinh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_atan.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_atan2.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_atanh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_cbrt.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_compare.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_cos.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_cosh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_div.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_erf.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_erfc.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_exp.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_exp10.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_exp2.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_expm1.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_fdimd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_fma.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_fmod.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_frexp.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_hypot.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_ldexp.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_lgamma.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_llrintd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log10.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log1p.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log2.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_logb.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_logbd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_lrintd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_lround.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_minmax.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_modf.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_mul.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_nearbyintd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_next.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_nexttowardd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_noncomp.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_pow.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_quantexpd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_quantize.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_rem.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_round_integral.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_scalb.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_scalbl.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_sin.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_sinh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_sqrt.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_string.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_tan.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_tanh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_tgamma.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int16.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int32.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int64.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int8.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint16.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint32.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint64.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint8.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_acos.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_acosh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_add.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_asin.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_asinh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_atan.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_atan2.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_atanh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_cbrt.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_compare.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_cos.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_cosh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_div.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_erf.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_erfc.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_exp.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_exp10.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_exp2.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_expm1.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_fdimd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_fma.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_fmod.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_frexp.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_hypot.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_ldexp.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_lgamma.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_llrintd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log10.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log1p.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log2.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_logb.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_logbd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_lrintd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_lround.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_minmax.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_modf.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_mul.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_nearbyintd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_next.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_nexttowardd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_noncomp.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_pow.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_quantexpd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_quantize.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_rem.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_round_integral.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_scalb.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_scalbl.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sin.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sinh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sqrt.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_string.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sub.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_tan.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_tanh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_tgamma.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_bid128.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_bid64.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int16.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int32.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int64.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int8.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint16.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint32.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint64.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint8.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_acos.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_acosh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_add.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_asin.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_asinh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_atan.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_atan2.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_atanh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_cbrt.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_compare.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_cos.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_cosh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_div.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_erf.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_erfc.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_exp.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_exp10.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_exp2.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_expm1.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_fdimd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_fma.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_fmod.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_frexp.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_hypot.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_ldexp.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_lgamma.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_llrintd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log10.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log1p.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log2.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_logb.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_logbd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_lrintd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_lround.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_minmax.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_modf.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_mul.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_nearbyintd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_next.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_nexttowardd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_noncomp.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_pow.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_quantexpd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_quantize.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_rem.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_round_integral.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_scalb.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_scalbl.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_sin.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_sinh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_sqrt.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_string.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_tan.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_tanh.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_tgamma.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_bid128.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int16.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int32.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int64.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int8.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint16.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint32.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint64.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint8.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_binarydecimal.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_convert_data.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_decimal_data.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_decimal_globals.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_dpd.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_feclearexcept.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_fegetexceptflag.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_feraiseexcept.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_fesetexceptflag.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_fetestexcept.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_flag_operations.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_from_int.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_round.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\strtod128.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\strtod32.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\strtod64.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\wcstod128.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\wcstod32.obj build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\wcstod64.obj build\\opt\\third_party\\shim_fmt.obj build\\opt\\third_party\\fmt\\dist\\src\\format.obj build\\opt\\third_party\\fmt\\dist\\src\\posix.obj build\\opt\\third_party\\shim_boost.obj build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\cmdline.obj build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\config_file.obj build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\convert.obj build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\options_description.obj build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\parsers.obj build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\positional_options.obj build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\split.obj build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\utf8_codecvt_facet.obj build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\value_semantic.obj build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\variables_map.obj build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\winmain.obj build\\opt\\third_party\\boost-1.70.0\\libs\\iostreams\\src\\file_descriptor.obj build\\opt\\third_party\\boost-1.70.0\\libs\\iostreams\\src\\mapped_file.obj build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\codecvt_error_category.obj build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\operations.obj build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\path.obj build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\path_traits.obj build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\portability.obj build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\unique_path.obj build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\utf8_codecvt_facet.obj build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\windows_file_codecvt.obj build\\opt\\third_party\\boost-1.70.0\\libs\\system\\src\\error_code.obj build\\opt\\third_party\\shim_abseil.obj build\\opt\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.obj build\\opt\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\hash\\internal\\city.obj build\\opt\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\hash\\internal\\hash.obj build\\opt\\third_party\\murmurhash3\\MurmurHash3.obj build\\opt\\mongo\\util\\quick_exit.obj build\\opt\\third_party\\shim_allocator.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\dynamic_annotations.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\elf_mem_image.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\logging.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\spinlock.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\spinlock_internal.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\sysinfo.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\vdso_support.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\central_freelist.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\common.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\internal_logging.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\malloc_extension.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\malloc_hook.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\memfs_malloc.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\page_heap.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\sampler.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\span.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\stack_trace_table.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\stacktrace.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\static_vars.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\symbolize.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\thread_cache.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\tcmalloc.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\windows\\port.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\windows\\system-alloc.obj build\\opt\\third_party\\gperftools-2.7\\dist\\src\\fake_stacktrace_scope.obj build\\opt\\mongo\\util\\debugger.obj build\\opt\\mongo\\util\\boost_assert_shim.obj build\\opt\\mongo\\shell\\mongodbcr.obj build\\opt\\mongo\\shell\\shell_options_init.obj"
  },
  {
    "path": "cmake/readme.md",
    "content": "Quick reference to CMake\n========================\n\n    if(<constant>)\n    \nTrue if the constant is `1`, `ON`, `YES`, `TRUE`, `Y`, or a non-zero number. \nFalse if the constant is `0`, `OFF`, `NO`, `FALSE`, `N`, `IGNORE`, `NOTFOUND`, \nthe empty string, or ends in the suffix `-NOTFOUND`. Named boolean constants \nare case-insensitive. If the argument is not one of these constants, it is \ntreated as a variable.\n\n    if(<variable>)\n\nTrue if the variable is defined to a value that is not a false constant. False otherwise. \n(Note macro arguments are not variables.)\n\n    if(DEFINED <variable>)\n\nTrue if the given variable is defined. It does not matter if the variable is \ntrue or false just if it has been set. (Note macro arguments are not variables.)\n"
  },
  {
    "path": "docs/BuildRobo3TOnMacAndLinux.md",
    "content": "Building Robo 3T (macOS and Linux)  \n==================\n\nA. Prerequisites\n-------------\n\n1. Modern Compiler\nA modern and complete C++17 compiler:  \n```\nGCC 8.0 or newer\nClang 7 (or Apple XCode 10 Clang) or newer\nOn Linux and macOS, the libcurl library and header is required. macOS includes libcurl.\n  Fedora/RHEL - dnf install libcurl-devel\n  Ubuntu/Debian - apt-get install libcurl-dev\nPython 3.7\n```\n\nFor details see: https://github.com/mongodb/mongo/wiki/Build-Mongodb-From-Source  \n\n2. Install CMake (3.10.0 or later) \n\nExample:  \n```\nsudo apt-get install build-essential\n// or \nwget http://www.cmake.org/files/v3.10/cmake-3.10.0.tar.gz\ntar xf cmake-3.10.0.tar.gz\ncd cmake-3.10.0\n./configure // macos: env CC=gcc ./bootstrap\nmake\nsudo make install\n(sudo make uninstall)\n```\n\n3. Install [Scons](http://scons.org/tag/releases.html) (3.1.2 or later) \n\n```\ncd scons-**\npython setup.py install\n```\n   \n4. Install Qt \n\nmacOS: Qt 5.12.8   \nLinux: Qt 5.9.3  \n\n  ```sh\nExample installation for macOS and Ubuntu:\n    Go to http://download.qt.io/archive/qt/5.x/5.x.y/\n    Download, run and install \n      qt-opensource-mac-x64-clang-5.x.y.dmg (for macOS) \n      qt-opensource-linux-x64-5.x.y.run (for Linux)\n    After successful installation you should have \n      /path/to/qt-5.x.y/5.x/clang_64 (for macOS)\n      /path/to/qt-5.x.y/5.x/gcc_64 (for Linux)\n\nMore information for installing on Ubuntu:\nhttps://wiki.qt.io/Install_Qt_5_on_Ubuntu\n```\n\n5. Download and Build OpenSSL - (explained below in section B) \n\nB. Building Robo 3T and Dependencies\n-------------\nRef: https://wiki.openssl.org/index.php/Compilation_and_Installation#OS_X  \n\n#### 1. Build OpenSSL \n\n(Todo: Can we find pre-built OpenSSL? To check => https://wiki.openssl.org/index.php/Binaries)\n\nVersion 1.1.1f (Mar/2020) on macOS  \nVersion 1.0.2o (Mar/2018) on Linux  \n\n**macOS:**  \n```sh\nwget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1f.tar.gz\ntar -xf openssl-1.1.1f.tar.gz\ncd /opt/openssl-1.1.1f\n\n(make clean) \n./Configure darwin64-x86_64-cc shared no-ssl2 no-ssl3 no-comp -mmacosx-version-min=xy.zt\n    // Notes: \n    // 1. Change -mmacosx-version same as CMAKE_OSX_DEPLOYMENT_TARGET in \n    //    https://github.com/Studio3T/robomongo/blob/master/CMakeLists.txt\n    // 2. With openssl version 1.1.1, configure command with rpath stopped working  \n    // Last working configure command with rpath was: \n    // ./Configure darwin64-x86_64-cc shared --openssldir=\"@rpath\"\n\nmake (or sudo make)  \n\n// Verify libssl.dylib and libcrypto.dylib files are created \nll lib*.dylib\n\n// Due to broken './Configure' command with rpath above, these extra steps are also required:\ninstall_name_tool -id \"@rpath/lib/libssl.1.1.dylib\" libssl.1.1.dylib\ninstall_name_tool -change /usr/local/lib/libcrypto.1.1.dylib @rpath/lib/libcrypto.1.1.dylib libssl.1.1.dylib\ninstall_name_tool -id \"@rpath/lib/libcrypto.1.1.dylib\" libcrypto.1.1.dylib\n// Finally, we should have this output using otool:\notool -L libssl.1.1.dylib \nlibssl.dylib:\n\t@rpath/lib/libssl.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)\n\t@rpath/lib/libcrypto.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)\n\t/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1)\n\notool -L libcrypto.1.1.dylib \nlibcrypto.dylib:\n\t@rpath/lib/libcrypto.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)\n\t/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1)\n\t\n// For robo-unit-test dependency:\nmkdir lib/\ncp lib*.dylib/lib/\t\n```\n\n\n**Linux:**\n\n  ```sh\nwget https://www.openssl.org/source/old/1.0.2/openssl-1.0.2o.tar.gz\ntar -xf openssl-1.0.2o.tar.gz\ncd /opt/openssl-1.0.2o\n(make clean)\n./config shared\nmake\n// Verify libssl.so and libcrypto.so are created\n```\n\n#### 2. Build Robo 3T Shell (fork of MongoDB)\n\nClone Robo 3T Shell and make sure you are on latest branch:\n\n  ```sh\n  $ git clone https://github.com/paralect/robomongo-shell.git\n  $ cd robomongo-shell\n  $ git branch   // \"roboshell-v4.2\"\n  ```\n\nSet special environment variable `ROBOMONGO_CMAKE_PREFIX_PATH` to point to a set of \ndirectories:\n\n1. Location of Qt 5 SDK  \n2. Location of Robo 3T Shell  \n3. Location of OpenSSL  \n\nSeparate directories by semicolon `;` (not colon):\n\n    // macOS example:\n    export ROBOMONGO_CMAKE_PREFIX_PATH=\"/path/to/qt-5.x.y/5.x/clang_64;/opt/robo-shell;/opt/openssl-x.y.z\"\n    \n    // Ubuntu example:\n    export ROBOMONGO_CMAKE_PREFIX_PATH=\"/home/<user>/Qt5.x.y/5.x.y/gcc_64/;/opt/<user>/robo-shell;/opt/openssl-x.y.z\"\n\nInstall pip requirements\n\n```\n// macOS / Linux\npip3 install --user -r etc/pip/compile-requirements.txt\npip3 install --user -r etc/pip/dev-requirements.txt\n```\n\n```\n// For ubuntu, the followings might be needed\nsudo aptitude install libcurl-dev\n\nsudo pip3 install Typing\nsudo pip3 install Cheetah\n```\n\nBuild Robo 3T Shell (in release mode by default):\n\n  ```sh\n  $ bin/build\n  ```\n\nBuild Robo 3T Shell in debug mode:\n\n  ```sh\n  $ bin/build debug\n  ```\n  \nClean build files for release mode:\n  ```sh\n  $ bin/clean\n  ```\n\nClean build files for debug mode:\n  ```sh\n  $ bin/clean debug\n  ```\n  \nFor more information refer to [Building Robo 3T Shell](BuildRobo3TShell.md) \n\n#### 3. Build Robo 3T\n\nDownload Robo 3T: \n\n    $ git clone https://github.com/Studio3T/robomongo\n    $ cd robomongo\n\nRun configuration step:\n    \n    $ bin/configure \n    \nAnd finally, build Robo 3T:\n    \n    $ bin/build \n\nTo run robomongo:\n\n    $ bin/run\n    \n\n**Debug mode**\n\nFor debug mode append `debug` for each command\ne.g. `bin/configure debug` or  `bin/build debug` etc..\n\n**Helper commands**\n    \nClean build files (in order to start build from scratch):\n\n    $ bin/clean\n    \nInstall Robo 3T to `build/release/install` folder:\n\n    $ bin/install\n    \nCreate package for your OS in `build/release/package` folder:\n\n    $ bin/pack\n\n**Important Notes**\n- For macOS builds, it might be needed to patch QScintilla with `QScintilla-2.9.3-xcode8.patch` found at robomongo repository's root.\n\n- For Ubuntu 16.04 builds, it has been reported that Robo 3T /bin/configure step might fail and installing `mesa-common-dev` package solves it. Details: https://github.com/paralect/robomongo/issues/1268 \n\n- For Centos builds, Robo 3T /bin/configure step might fail due to error: `failed to find gl/gl.h`. In this case, the following packages must be installed:\n\n```sh\n$ sudo yum install mesa-libGL\n$ sudo yum install mesa-libGL-devel\n  ```\n\n"
  },
  {
    "path": "docs/BuildRobo3TOnWindows.md",
    "content": "Building Robo 3T (Windows)\n==============================\n\nA. Prerequisites\n-------------\n\n#### 0. Git\n\n Download Git installer from http://git-scm.com (we are using Git-2.7.0-64-bit).\n  \n When you'll see \"Adjusting your PATH environment\" wizard page, select\n \"Use Git from the Windows Command Prompt\" option. This will allow to \n execute Git from both Windows Command Prompt and Bash. This is required,\n because both MongoDB and Robo 3T uses `git` command during build process\n which must be perfomed from Windows Command Prompt (not Bash).\n \n On \"Configuring the line ending conversion\" wizard page, select \"Checkout\n Windows-style, commit Unix-style line ending\" option. This is a common mode\n for cross-platform projects and required by both MongoDB and Robo 3T.\n  \n All other Git installer options are not important (use defaults).\n \n If you are using SSH clone url, start SSH agent and add your private key\n with this commands in Git Bash:\n \n    $ eval `ssh-agent`       # starts ssh agent\n    $ ssh-add ~/.ssh/mykey   # add your key (which can be in any folder)\n  \n#### 1. Visual Studio 2017 version 15.9 or newer (complete C++17 compiler)\n\n We use Visual Studio 2017 version 15.9.22, and recommend to use this version to save\n time for Qt compilation. Currently prebuilt binaries for Qt are available \n from official Qt site. But you can use any newer version and compile Qt library\n yourself.\n\n#### 2. ActivePython 3.7.4\n   \n Download ActivePython from http://www.activestate.com/activepython/downloads\n   \n Download MSI x64 version. Use default settings in installation wizard. \n This installer will add path to `python.exe` to your `PATH` variable.\n\n#### 3. SCons 3.1.2 or newer\n\nWe use SCons 3.1.2\n\n Download Scons from http://scons.org/tag/releases.html\n   \n Use ZIP archive, not MSI\n   \n Open Command Prompt, navigate to Scons directory and run:\n   \n    $ setup.py install\n    \n This command will make `scons` command accessible from Command Prompt\n\n#### 4. CMake \nWe use CMake 3.10.0\n Download CMake from https://cmake.org/download\n \n Use installer package, it will allow you to configure your PATH variable and `cmake`\n command will be available from Command Prompt. For this set \"Add CMake to the system\n PATH for current user\" in the installer wizard page. \n   \n#### 5. Qt 5.12.8\n\n Download and install Qt from http://download.qt.io/archive/qt \n Run the installer and select only 'msvc2017 64-bit'\n\n#### 6. OpenSSL (1.1.1f)\nDownload openssl from https://www.openssl.org/source/old/1.1.1/openssl-1.1.1f.tar.gz  \n\nB. Building Robo 3T and Dependencies\n-------------  \n\n#### 1. Build OpenSSL\n\n(Todo: Can we find pre-built OpenSSL? To check => https://wiki.openssl.org/index.php/Binaries)\n\nSteps to build OpenSSL on windows:  \n- Ensure you have perl installed on your machine (e.g. ActiveState or Strawberry), and available on your %PATH%  \n- Ensure you have NASM installed on your machine, and available on your %PATH%  \n\n```sh\nOpen Visual Studio tool x64 Cross Tools Command prompt\ncd to the directory where you have openssl sources cd c:\\myPath\\openssl\nperl Configure VC-WIN64A\n(nmake clean)\nnmake\n// Verify these files are created: \nlibcrypto-1_1x64.dll, libssl-1_1-x64.dll (with all the build additionals such as .pdb .lik or static .lib)\n```  \n\nRefer to OpenSSL documentation for more information:  \nhttps://wiki.openssl.org/index.php/Compilation_and_Installation#OpenSSL_1.1.0  \n\n#### 2. Build Robo 3T Shell (fork of MongoDB)\n\nClone Robo 3T Shell and make sure to be at `roboshell-v4.2` branch:\n\n  ```sh\n  $ git clone https://github.com/paralect/robomongo-shell.git\n  $ cd robomongo-shell\n  $ git branch  // roboshell-v4.2\n  ```\n\nSet environment variable `ROBOMONGO_CMAKE_PREFIX_PATH`, required by Robo 3T-Shell and Robo 3T build scripts, needs to be set according to the following directories:\n\n1. Location of Qt SDK\n2. Location of Robo 3T Shell\n3. Location of OpenSSL\n\n**Important:**   \nMake sure to move all your repos (robo, openssl, robo-shell etc..) into root directory of your drives (e.g. e:\\robo-shell) and keep short repo names (e.g. robo-shell instead of robomongo-shell) otherwise you might end up with this error `If you see fatal error LNK1170: line in command file contains 131071 or more characters`\n\nSeparate directories by semicolon `;` (not colon). You can do this in Command Prompt:\n\n    > setx ROBOMONGO_CMAKE_PREFIX_PATH \"e:\\Qt\\Qt5.9.3\\5.9.3\\msvc2015_64;e:\\robo-shell;e:\\openssl-x.y.z\"  \n\nOpen '**a new**' VS2017 x64 Native Tools Command Prompt and navigate to `robomongo-shell` folder.\n\n\n**Note:**  \n\nRun \n`pip3 install --user -r ../etc/pip/dev-requirements.txt`  \n\nIf you have this type of errors:  \n\n```\n// 1st error\nImportError: No module named typing\n// Solution: \npip install Typing\npip install Cheetah\n\n// 2nd error: shell: cheetah module not found\n// Solution: \ncopy C:\\Users\\<user>\\AppData\\Roaming\\Python\\Python27\\site-packages\nto C:\\Python27\\Lib\\site-packages \n\n```\n\nBuild shell in release mode:\n\n    > bin\\build\n    \nBuild shell in debug mode:\n\n    > bin\\build debug \n    \nNote that backslash is used (`\\`), and not forward slash (`/`).\n\nClean build files for release mode:\n\n    > bin\\clean\n\nClean build files for debug mode:\n\n    > bin\\clean debug\n\nRefer to MongoDB documentation for additional information:\nhttps://docs.mongodb.org/manual/contributors/tutorial/build-mongodb-from-source/#windows-specific-instructions\n\n\n#### 3. Build Robo 3T   \n\nClone Robo 3T:\n\n  ```sh\n  $ git clone https://github.com/paralect/robomongo.git\n  ```\n  \nOpen VS2017 x64 Native Tools Command Prompt and navigate to `robomongo` folder.\n \nRun configuration step:\n    \n    > bin\\configure \n    \nAnd finally, build Robo 3T:\n    \n    > bin\\build \n\n```\n// If you see fatal error LNK1170: line in command file contains 131071 or more characters\nSolution-1: \n1. Move all your repos (robo, openssl, robo-shell etc..) into root directory of your drives.\n2. Use short names e.g. robo-shell instead of robomongo-shell.\n3. Update ROBOMONGO_CMAKE_PREFIX_PATH env. variable and try a fresh (clean) build.\n\nSolution-2: \n1. Create environment variable MongoDB_OBJECTS, set a short path e.g. \"C:/\"\n2. Open a new VS2017 x64 Native Tools Command Prompt and build Robo 3T Shell \n3. Robo 3T Shell build script will copy the object files into MongoDB_OBJECTS directory\n4. Build Robo 3T again (clean build might be needed)\n```\n\n**Run Robo 3T**\n\nInstall Robo 3T to `build\\Release\\install` folder:\n\n    > bin\\install\n   \nAnd run Robo 3T\n\n    > \\robomongo\\build\\Release\\install\\robo3t.exe\n\n**Package Robo 3T**\n\nInstall Robo 3T to `build\\Release\\install` folder:\n\n    > bin\\pack\n\nNote: nsis-2.46-setup.exe with Full setup must be present.\n\n\n**Debug mode**\n\nFor debug mode append `debug` for each command\ne.g. `bin\\configure debug` or  `bin\\build debug` etc..\n\n**Helper commands**\n\nClean build files (in order to start build from scratch):\n\n    > bin\\clean\n    \n\n   \n"
  },
  {
    "path": "docs/BuildRobo3TShell.md",
    "content": "\nBuilding Robo 3T Shell\n========================\n\nRobo 3T uses [modified version](https://github.com/paralect/robomongo-shell/tree/roboshell-v3.4) of MongoDB that we call Robo 3T Shell.  \nBefore you can build Robo 3T, you have to build Robo 3T Shell. The following instructions are applicable only for Mac OS X and Linux. For Windows instructions please check [Building Robo 3T on Windows](BuildRobo3TOnWindows.md).\n\nBuild for Mac OS X or Linux\n---------------------------\n\n#### Prerequisites\n\n1. Install [Scons](http://scons.org/tag/releases.html) (2.3.5 or newer)\n\n\n2. Clone Robo 3T Shell and checkout to `roboshell-v3.4` branch:\n\n  ```sh\n  $ git clone https://github.com/paralect/robomongo-shell.git\n  $ cd robomongo-shell\n  $ git checkout roboshell-v3.4\n  ```\n\n3. Build Robo 3T Shell:\n\n  ```sh\n  $ bin/build\n  ```\n\nDone! Now you can continue with building Robo 3T \nwith embedded MongoDB 3.4 shell (that you've just built).\n\n\n<br/>\n#### Advanced helper commands\n\nThe following commands are needed only if you are planning to develop or deeper understand\nRobo 3T or Robo 3T Shell build processes.\n\nClean build files for release mode (folder `build/opt` will be removed):\n\n    $ bin/clean\n\nHere is a command that is executed by `bin/build` script:\n\n    $ scons mongo -j8 --release --osx-version-min=10.9\n    \nArgument `--osx-version-min` is required only for Mac OS.\n    \nBuild MongoDB shell in debug mode:\n\n    $ scons mongo -j8 --dbg\n\nClear builds:\n\n    $ scons -c mongo        # clears release build\n    $ scons -c --dbg mongo  # clears debug build\n"
  },
  {
    "path": "docs/BuildingMongoDB.md",
    "content": "Building Robomongo Shell (Old Document)\n========================\n\n**Important Note:**  \nThis document is for versions 1.0 and earlier and for MongoDB 3.2.  \nSee latest documents here: https://github.com/Studio3T/robomongo/wiki\n\nRobomongo uses [modified version](https://github.com/paralect/robomongo-shell/tree/roboshell-v3.2) of MongoDB that we call Robomongo Shell. Before you can build Robomongo, you have to build Robomongo Shell. The following instructions are applicable only for Mac OS X and Linux. For Windows instructions please check [Building Robomongo on Windows](BuildingRobomongoOnWindows.md).\n\nBuild for Mac OS X or Linux\n---------------------------\n\n#### Prerequisites\n\n1. Install [Scons](http://scons.org/tag/releases.html) (2.4 or later)\n\n\n2. Clone Robomongo Shell and checkout to `roboshell-v3.2` branch:\n\n  ```sh\n  $ git clone https://github.com/paralect/robomongo-shell.git\n  $ cd robomongo-shell\n  $ git checkout roboshell-v3.2\n  ```\n\n3. Build Robomongo Shell:\n\n  ```sh\n  $ bin/build\n  ```\n\nDone! Now you can continue with [Step 2](BuildingRobomongo.md#step-2) and build Robomongo \nwith embedded MongoDB 3.2 shell (that you've just built).\n\n\n<br/>\n#### Advanced helper commands\n\nThe following commands are needed only if you are planning to develop or deeper understand\nRobomongo or Robomongo Shell build processes.\n\nClean build files for release mode (folder `build/opt` will be removed):\n\n    $ bin/clean\n\nHere is a command that is executed by `bin/build` script:\n\n    $ scons mongo -j8 --release --osx-version-min=10.9\n    \nArgument `--osx-version-min` is required only for Mac OS.\n    \nBuild MongoDB shell in debug mode:\n\n    $ scons mongo -j8 --dbg\n\nClear builds:\n\n    $ scons -c mongo        # clears release build\n    $ scons -c --dbg mongo  # clears debug build\n"
  },
  {
    "path": "docs/BuildingRobomongo.md",
    "content": "Building Robomongo (Mac OS X and Linux)\n==================\n\n**Important Note:**  \nThis document is for versions 1.0 and earlier and for MongoDB 3.2.  \nSee latest documents here: https://github.com/Studio3T/robomongo/wiki\n\nA. Prerequisites\n-------------\n\n1. Install CMake (3.2 or later)\n2. Install [Scons](http://scons.org/tag/releases.html) (2.4 or later)\n3. Install Qt 5.7\n\n  ```sh\nExample installation for MAC OSX and Ubuntu:\n    Go to http://download.qt.io/archive/qt/5.7/5.7.0/\n    Download, run and install \n      qt-opensource-mac-x64-clang-5.7.0.dmg (for MAC OSX) \n      qt-opensource-linux-x64-5.7.0.run (for Linux)\n    After successful installation you should have \n      /path/to/qt-5.7.0/5.7/clang_64 (for MAC OSX)\n      /path/to/qt-5.7.0/5.7/gcc_64 (for Linux)\n\nMore information for installing on Ubuntu:\nhttps://wiki.qt.io/Install_Qt_5_on_Ubuntu\n```\n\n4. Download and Build OpenSSL (1.0.1p) - (explained below in section B)\n\nB. Building Robomongo and Dependencies\n-------------\n\n#### Step 1. Build OpenSSL (1.0.1p)\n\nSteps to build OpenSSL on MAC:\n\n  ```sh\nDownload openssl-1.0.1p (ftp://ftp.openssl.org/source/old/1.0.1/openssl-1.0.1p.tar.gz)\ntar -xvzf openssl-1.0.1p.tar.gz\ncd /Users/<user>/Downloads/openssl-1.0.1p\n./Configure darwin64-x86_64-cc shared --openssldir=\"@rpath\"\nmake (or sudo make)\nmkdir lib\ncp libssl.1.0.0.dylib libcrypto.1.0.0.dylib lib/\n```\nHelper Commands\n  ```sh\n// to start fresh build\nmake clean\n```\n\n\nSteps to build OpenSSL on Linux:\n\n  ```sh\nDownload openssl-1.0.1p (ftp://ftp.openssl.org/source/old/1.0.1/openssl-1.0.1p.tar.gz)\ntar -xvzf openssl-1.0.1p.tar.gz\ncd /home/<user>/Downloads/openssl-1.0.1p\n./config shared\nmake\nmkdir lib\ncp libssl* libcrypto* lib/\n```\n\n#### Step 2. Build Robomongo Shell (fork of MongoDB)\n\nClone Robomongo Shell and checkout to `roboshell-v3.2` branch:\n\n  ```sh\n  $ git clone https://github.com/paralect/robomongo-shell.git\n  $ cd robomongo-shell\n  $ git checkout roboshell-v3.2\n  ```\n\nSet special environment variable `ROBOMONGO_CMAKE_PREFIX_PATH` to point to a set of \ndirectories:\n\n1. Location of Qt 5 SDK  \n2. Location of Robomongo Shell  \n3. Location of OpenSSL  \n\nSeparate directories by semicolon `;` (not colon):\n\n    // MAC OSX example:\n    $ export ROBOMONGO_CMAKE_PREFIX_PATH=\"/path/to/qt-5.7.0/5.7/clang_64;/path/to/robomongo-shell;/path/to/openssl-1.0.1p\"\n    // Ubuntu example:\n    $ export ROBOMONGO_CMAKE_PREFIX_PATH=\"/path/to/qt-5.7.0/5.7/gcc_64;/path/to/robomongo-shell;/path/to/openssl-1.0.1p\"\n\n\nBuild Robomongo Shell:\n\n  ```sh\n  $ bin/build\n  ```\n\nFor more information refer to [Building Robomongo Shell](BuildingMongoDB.md) \n\n#### Step 3. Build Robomongo\n\nDownload Robomongo: \n\n    $ git clone https://github.com/paralect/robomongo\n    $ cd robomongo\n\nRun configuration step:\n    \n    $ bin/configure \n    \nAnd finally, build Robomongo:\n    \n    $ bin/build \n\nTo run robomongo:\n\n    $ bin/run\n    \n\n**Helper commands**\n    \nClean build files (in order to start build from scratch):\n\n    $ bin/clean\n    \nInstall Robomongo to `build/release/install` folder:\n\n    $ bin/install\n    \nCreate package for your OS in `build/release/package` folder:\n\n    $ bin/pack\n\n**Important Notes**\n- For Ubuntu 16.04 builds, it has been reported that Robomongo /bin/configure step might fail and installing mesa-common-dev package solves it. Details: https://github.com/paralect/robomongo/issues/1268 \n\n- For Centos builds, Robomongo /bin/configure step might fail due to error: `failed to find gl/gl.h`. In this case, the following packages must be installed:\n\n```sh\n$ sudo yum install mesa-libGL\n$ sudo yum install mesa-libGL-devel\n  ```\n\n\n"
  },
  {
    "path": "docs/BuildingRobomongoOnWindows.md",
    "content": "Building Robomongo (Windows)\n==============================\n\n**Important Note:**  \nThis document is for versions 1.0 and earlier and for MongoDB 3.2.  \nSee latest documents here: https://github.com/Studio3T/robomongo/wiki\n\nA. Prerequisites\n-------------\n\n#### 0. Git\n\n Download Git installer from http://git-scm.com (we are using Git-2.7.0-64-bit).\n  \n When you'll see \"Adjusting your PATH environment\" wizard page, select\n \"Use Git from the Windows Command Prompt\" option. This will allow to \n execute Git from both Windows Command Prompt and Bash. This is required,\n because both MongoDB and Robomongo uses `git` command during build process\n which must be perfomed from Windows Command Prompt (not Bash).\n \n On \"Configuring the line ending conversion\" wizard page, select \"Checkout\n Windows-style, commit Unix-style line ending\" option. This is a common mode\n for cross-platform projects and required by both MongoDB and Robomongo.\n  \n All other Git installer options are not important (use defaults).\n \n If you are using SSH clone url, start SSH agent and add your private key\n with this commands in Git Bash:\n \n    $ eval `ssh-agent`       # starts ssh agent\n    $ ssh-add ~/.ssh/mykey   # add your key (which can be in any folder)\n  \n#### 1. Visual Studio 2013 (i.e. MSVC12) Update 4 or newer\n\n We use Visual Studio 2013 Update 5, and recommend to use this version to save\n time for Qt compilation. Currently prebuilt binaries for Qt are available \n from official Qt site. But you can use any newer version and compile Qt library\n yourself.\n \n If you already have VS2013, you can download Update 5 here: \n https://www.microsoft.com/en-us/download/details.aspx?id=48129\n \n Update 4 or newer version is required to compile MongoDB.\n\n#### 2. ActivePython 2.7 \n   \n Download ActivePython from http://www.activestate.com/activepython/downloads\n   \n Download MSI x64 version. Use default settings in installation wizard. \n This installer will add path to `python.exe` to your `PATH` variable.\n\n#### 3. Scons 2.3.4 \n\n Download Scons from http://scons.org/tag/releases.html\n   \n Use ZIP archive, not MSI (we use scons-2.3.4.zip)\n   \n Open Command Prompt, navigate to Scons directory and run:\n   \n    $ setup.py install\n    \n This command will make `scons` command accessible from Command Prompt\n\n#### 4. CMake \n Download CMake from https://cmake.org/download (we use cmake-3.3.2-win32-x86.exe)\n \n Use installer package, it will allow you to configure your PATH variable and `cmake`\n command will be available from Command Prompt. For this set \"Add CMake to the system\n PATH for current user\" in the installer wizard page. \n   \n#### 5. Qt 5.7\n\n Download Qt from http://www.qt.io/download-open-source/ (we use Qt Online installer)\n   \n When installing Qt, only one component is required by Robomongo: \n   \n    Qt 5.7 \n      [x] msvc2013 64-bit.\n    \n This components contains prebuilt 64-bit binaries for Visual Studio 2013. \n   \n You may uncheck all other components to download as little as possible. \n\n#### 6. OpenSSL (1.0.1p)\nDownload openssl-1.0.1p (ftp://ftp.openssl.org/source/old/1.0.1/openssl-1.0.1p.tar.gz)\n  \n  \n\nB. Building Robomongo and Dependencies\n-------------\n\n#### 1. Build OpenSSL (1.0.1p)\n\nSteps to build OpenSSL on windows:\n  ```sh\nOpen Visual Studio tool x64 Cross Tools Command prompt\ncd to the directory where you have openssl sources cd c:\\myPath\\openssl\nperl Configure VC-WIN64A\nms\\do_win64a\nnmake -f ms\\ntdll.mak\n```\n\n**Check Point:**\nAfter successful build, newly created sub directory out32dll should contain dynamic lib files libeay32.lib (and libeay32.dll) and ssleay32.lib (and ssleay32.dll); and associated include files will be in newly created folder \"inc32\".\n\nHelper Commands:\n  ```sh\n// clean to start fresh build\nnmake -f ms\\ntdll.mak clean\n```\n\nRefer to OpenSSL documentation for more information:  \nhttps://wiki.openssl.org/index.php/Compilation_and_Installation#W64\n\n#### 2. Build Robomongo Shell (fork of MongoDB)\n\nClone Robomongo Shell and checkout to roboshell-v3.2 branch:\n\n  ```sh\n  $ git clone https://github.com/paralect/robomongo-shell.git\n  $ cd robomongo-shell\n  $ git checkout roboshell-v3.2\n  ```\n\nSet environment variable `ROBOMONGO_CMAKE_PREFIX_PATH`, required by Robomongo-Shell and Robomongo build scripts, needs to be set according to the following directories:\n\n1. Location of Qt SDK\n2. Location of Robomongo Shell\n3. Location of OpenSSL\n\nSeparate directories by semicolon `;` (not colon). You can do this in Command Prompt:\n\n    > setx ROBOMONGO_CMAKE_PREFIX_PATH \"d:\\Qt-5\\5.7\\msvc2013_64;d:\\Projects\\robomongo-shell;c:\\myPath\\openssl-1.0.1p\"\n\n\nOpen VS2013 x64 Native Tools Command Prompt and navigate to `robomongo-shell` folder.\n\nBuild shell:\n\n    > bin\\build\n    \nNote that backslash is used (`\\`), and not forward slash (`/`).\n\nClean build files:\n\n    > bin\\clean\n\nRefer to MongoDB documentation for additional information:\nhttps://docs.mongodb.org/manual/contributors/tutorial/build-mongodb-from-source/#windows-specific-instructions\n\n\n#### 3. Build Robomongo   \n\nClone Robomongo:\n\n  ```sh\n  $ git clone https://github.com/paralect/robomongo.git\n  ```\n  \nOpen VS2013 x64 Native Tools Command Prompt and navigate to `robomongo` folder.\n \nRun configuration step:\n    \n    > bin\\configure \n    \nAnd finally, build Robomongo:\n    \n    > bin\\build \n \n\n**Run Robomongo**\n\nInstall Robomongo to `build\\Release\\install` folder:\n\n    > bin\\install\n   \nAnd run Robomongo\n\n    > \\robomongo\\build\\Release\\install\\Robomongo.exe\n\n**Helper commands**\n    \nClean build files (in order to start build from scratch):\n\n    > bin\\clean\n    \n\n   \n"
  },
  {
    "path": "docs/Debug.md",
    "content": "Runtime Dependencies\n====================\n\nThis information is for maintainers. If you want to just use Robomongo - download \nprebuild packages for your platform.\n\nRuntime dependencies that are not privided by platforms but required by Robomongo are:\n\n1. Qt libraries\n2. Qt plugins\n\nDiagnostic of dependencies\n--------------------------\n\n### Windows \n\nGUI: http://dependencywalker.com/\n\nCMD LINE:   \nOpen Visual Studio Native command prompt  \n`dumpbin /dependents robo3t.exe`\n\n### Linux\n\n#### a. View dependencies of executable or shared library: \n\n    $ ldd robomongo\n    $ readelf -d robomongo\n\n#### b. View dependency tree of executable or shared library:  \n\n    $ lddtree robomongo\n    $ ldd -v robomongo\n\n#### c. View RPATH or RUNPATH records of executable or shared library:\n\n    $ objdump -x bin/robomongo | grep \"RPATH\\|RUNPATH\"\n    $ readelf -d bin/robomongo | grep RPATH     \n    \nFor Robomongo binary it should be `$ORIGIN/../lib`\n\n#### d. Enable extensive logging for run-time shared library search \n\n    $ export LD_DEBUG=files\n    $ bin/robomongo\n    \nSource: \nhttp://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html\n\n#### e. Modify RPATH using `chrpath` and the dynamic linker and RPATH using paths `patchelf`\n    \n    $ patchelf --set-rpath '$ORIGIN/../lib' robo\n    \nMore: https://nixos.org/patchelf.html\n\n    $ chrpath -r \"/somepath/lib/\" robomongo\n\nMore:\nhttps://linux.die.net/man/1/chrpath\nhttp://www.programering.com/a/MTOwcDNwATU.html\t// examples\n\n#### f. Show symbols of shared lib file\n\nError: \n```\n/opt/robo-shell/src/mongo/util/net/ssl_manager_openssl.cpp:667: \nundefined reference to `SSL_library_init'\n```\n\nHow to debug:\n```\nopenssl-1.1.1f: nm -gD libssl.so | grep SSL_library_init  \n  // not found, since SSL_library_init() is deprecated in 1.1.1\n   \nopenssl-1.0.2o: nm -gD libssl.so | grep SSL_library_init\n0000000000055520 T SSL_library_init\n```  \n\n#### g. Update path of a dependency of an executable\n\n```\nldd exec_file | grep libcurlpp\n\tlibcurlpp.so.1 => not found\n\npatchelf --replace-needed libcurlpp.so.1 /foo/bar/libcurlpp.so.1 exec_file\n```\n\nAnother example (libcrypto.so.1.1 => not found):  \n\n```\ncd /opt/openssl-1.1.1f\nldd libssl.so\n\tlinux-vdso.so.1 =>  (0x00007ffcaf911000)\n\tlibcrypto.so.1.1 => not found\n\tlibpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd4087b4000)\n\tlibc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd4083ea000)\n\t/lib64/ld-linux-x86-64.so.2 (0x00007fd408c65000)\n\nsudo cp libcrypto.so.1.1 /lib/x86_64-linux-gnu/\n\nldd libssl.so\n\tlinux-vdso.so.1 =>  (0x00007fff0f5d8000)\n\tlibcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007fd3dcc1e000)\n\tlibc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd3dc854000)\n\tlibdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd3dc650000)\n\t/lib64/ld-linux-x86-64.so.2 (0x00007fd3dd2d6000)\n\n```\n\n### Mac OS X\n\n#### a. Show dependencies of executable or shared library:\n\nShow dependencies of executable or shared library:\n\n    $ otool -L robomongo\n\nView LC_RPATH records of executable or shared library:\n\n    $ otool -l robomongo | grep -C2 RPATH\n    \n(option `-C2` asks grep to output 2 context lines before and after the match)\n\nFor Robomongo binary it should be `$executable_path/../Frameworks`\n\nMore about `otool -l`\n\n```\t\t\t\t\n$ otool -l /opt/robo/build/release/src/robomongo/Robo\\ 3T.app/Contents/MacOS/Robo\\ 3T \n....\nLoad command 23\n          cmd LC_LOAD_DYLIB\n      cmdsize 56\n         name @rpath/lib/libssl.1.1.dylib (offset 24)\n   time stamp 2 Thu Jan  1 03:00:02 1970\n      current version 1.1.0\ncompatibility version 1.1.0\nLoad command 24\n          cmd LC_LOAD_DYLIB\n      cmdsize 56\n         name @rpath/lib/libcrypto.1.1.dylib (offset 24)\n   time stamp 2 Thu Jan  1 03:00:02 1970\n      current version 1.1.0\ncompatibility version 1.1.0\n....\nLoad command 27\n          cmd LC_RPATH\n      cmdsize 48\n         path /opt/Qt5.9.3/5.9.3/clang_64/lib (offset 12)\nLoad command 28\n          cmd LC_RPATH\n      cmdsize 32\n         path /opt/openssl-1.1.1f (offset 12)\n```\t \n\n#### b. Edit dependencies of executable or shared library:\n```\n// Before \notool -L libssl.dylib \nlibssl.dylib:\n\t/usr/local/lib/libssl.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)\n\t/usr/local/lib/libcrypto.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)\n\t/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1)\n    \n// Edit\ninstall_name_tool -id \"@rpath/lib/libssl.1.1.dylib\" libssl.dylib\ninstall_name_tool -change /usr/local/lib/libcrypto.1.1.dylib @rpath/lib/libcrypto.1.1.dylib libssl.dylib\n\n// After\notool -L libssl.dylib \nlibssl.dylib:\n\t@rpath/lib/libssl.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)\n\t@rpath/lib/libcrypto.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)\n\t/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1)    \n```    \n\n\nDiagnostic of Qt plugins\n------------------------\n\nRun Robomongo in the following way to see how plugins are resolved:\n\n    $ QT_DEBUG_PLUGINS=1 ./robomongo\n    \n\n"
  },
  {
    "path": "install/linux/robomongo.sh",
    "content": "#!/bin/bash\n\n#ROBO_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"\n\nSOURCE=\"${BASH_SOURCE[0]}\"\nwhile [ -h \"$SOURCE\" ]; do # resolve $SOURCE until the file is no longer a symlink\n  DIR=\"$( cd -P \"$( dirname \"$SOURCE\" )\" && pwd )\"\n  SOURCE=\"$(readlink \"$SOURCE\")\"\n  [[ $SOURCE != /* ]] && SOURCE=\"$DIR/$SOURCE\" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located\ndone\nROBO_DIR=\"$( cd -P \"$( dirname \"$SOURCE\" )\" && pwd )\"\n\nexport LD_LIBRARY_PATH=\"$ROBO_DIR/../lib:$LD_LIBRARY_PATH\"\nexport QT_PLUGIN_PATH=\"$ROBO_DIR/../lib:$QT_PLUGIN_PATH\"\nexport QT_XKB_CONFIG_ROOT=/usr/share/X11/xkb\nexport XKB_DEFAULT_RULES=base\n\n\"$ROBO_DIR/robomongo\"\n"
  },
  {
    "path": "install/macosx/Info.plist.in",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>Robo 3T</string>\n\t<key>CFBundleGetInfoString</key>\n\t<string>${MACOSX_BUNDLE_INFO_STRING}</string>\n\t<key>CFBundleIconFile</key>\n\t<string>${MACOSX_BUNDLE_ICON_FILE}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleLongVersionString</key>\n\t<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>\n\t<key>CFBundleName</key>\n\t<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>\n\t<key>CSResourcesFileMapped</key>\n\t<true/>\n\t<key>LSRequiresCarbon</key>\n\t<true/>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>${MACOSX_BUNDLE_COPYRIGHT}</string>\n\t<key>NSHighResolutionCapable</key>\n\t<string>True</string>\n\t<key>NSRequiresAquaSystemAppearance</key>\n\t<true/>\t\n</dict>\n</plist>\n"
  },
  {
    "path": "install/macosx/README.md",
    "content": "How to generate \"icns\" icon file\n================================\n\nIn this directory run:\n\n    $ iconutil -c icns Robomongo.iconset\n\nFile `Robomongo.icns` will be generated.\n"
  },
  {
    "path": "install/macosx/qt.conf",
    "content": "[Paths]\nPlugins = PlugIns/Qt\n"
  },
  {
    "path": "install/qt.conf.in",
    "content": "[Paths]\nPlugins = @qt_conf_plugins@\n"
  },
  {
    "path": "install/windows/README.md",
    "content": "How to generate ICO file from the set of PNGs\n=============================================\n\nInstall ImageMagick (http://www.imagemagick.org/). Make sure that you\nhave added its utils to your PATH (installer will give you such an option)\n\nIn `icon-set` directory run:\n\n    > convert 256x256.png 128x128.png 64x64.png 48x48.png 40x40.png 32x32.png 24x24.png 20x20.png 16x16.png robomongo.ico\n    \nFile `robomongo.ico` will be generated.\n\n\nWhich icon sizes are used on Windows?\n=====================================\n\nThe most important sizes are the one that is small. Robo 3T should include \n16, 20, 24, 40, 48. The bigger sizes are usually scaled well, without notable\ndegrading in quality. \n\nThe following statistic was provided in this answer:\nhttp://stackoverflow.com/a/12283978/407599\n\n> After some testing with an icon with 8, 16, 20, 24, 32, 40, 48, 64, 96, 128 \n> and 256 pixels (256 in PNG) in Windows 7:\n>\n> At 100% resolution: \n>  Explorer uses 16, 40, 48, and 256. Windows Photo Viewer uses 96. Paint uses 256.\n>  \n> At 125% resolution: \n>  Explorer uses 20, 40, and 256. Windows Photo Viewer uses 96. Paint uses 256.\n>  \n> At 150% resolution: \n>  Explorer uses 24, 48, and 256. Windows Photo Viewer uses 96. Paint uses 256.\n>  \n> At 200% resolution: \n>  Explorer uses 40, 64, 96, and 256. Windows Photo Viewer uses 128. Paint uses 256.\n>\n> So 8, 32 were never used (it's strange to me for 32) and 128 only by Windows Photo \n>  Viewer with a very high dpi screen, i.e. almost never used.\n> \n> It means your icon should at least provide 16, 48 and 256 for Windows 7. For supporting \n> newer screens with high resolutions, you should provide 16, 20, 24, 40, 48, 64, 96, and 256. \n> For Windows 7, all pictures can be compressed using PNG but for backward compatibility with \n> Windows XP, 16 to 48 should not be compressed.\n\n"
  },
  {
    "path": "install/windows/winres.rc.in",
    "content": "#include \"verrsrc.h\"\n\nIDI_ICON1               ICON        \"@windows_icon@\"\n\n\n#define VER_FILEVERSION             @PROJECT_VERSION_MAJOR@,@PROJECT_VERSION_MINOR@,@PROJECT_VERSION_PATCH@\n#define VER_FILEVERSION_STR         \"@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@\\0\"\n\n#define VER_PRODUCTVERSION          @PROJECT_VERSION_MAJOR@,@PROJECT_VERSION_MINOR@,@PROJECT_VERSION_PATCH@\n#define VER_PRODUCTVERSION_STR     \t\"@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@\\0\"\n\n1 VERSIONINFO\n FILEVERSION VER_FILEVERSION\n PRODUCTVERSION VER_PRODUCTVERSION\n FILEFLAGSMASK 0x3fL\n#ifdef _DEBUG\n FILEFLAGS 0x1L\n#else\n FILEFLAGS 0x0L\n#endif\n FILEOS VOS_NT_WINDOWS32\n FILETYPE VFT_APP\n FILESUBTYPE 0x0L\n BEGIN\n\tBLOCK \"StringFileInfo\"\n\tBEGIN\n\t\tBLOCK \"040904e4\"\n\t\tBEGIN\n\t\t\tVALUE \"CompanyName\", \"3T Software Labs Ltd\\0\"\n\t\t\tVALUE \"FileDescription\", \"Robo 3T, MongoDB management tool\\0\"\n\t\t\tVALUE \"FileVersion\", VER_FILEVERSION_STR\n\t\t\tVALUE \"LegalCopyright\", \"Copyright 3T Software Labs Ltd, 2014 - 2017\\0\"\n\t\t\tVALUE \"ProductName\", \"Robo 3T\\0\"\n\t\t\tVALUE \"ProductVersion\", VER_PRODUCTVERSION_STR\n\t\t\tVALUE \"OriginalFilename\", \"robo3t.exe\\0\"\n\t\t\tVALUE \"InternalName\", \"Robo 3T\\0\"\n\t\tEND\n\tEND\n\tBLOCK \"VarFileInfo\"\n\tBEGIN\n\t\t/* The following line should only be modified for localized versions.     */\n\t\t/* It consists of any number of WORD,WORD pairs, with each pair           */\n\t\t/* describing a language,codepage combination supported by the file.      */\n\t\t/*                                                                        */\n\t\t/* For example, a file might have values \"0x409,1252\" indicating that it  */\n\t\t/* supports English language (0x409) in the Windows ANSI codepage (1252). */\n\n\t\tVALUE \"Translation\", 0x409, 1252\n\tEND\n END\n"
  },
  {
    "path": "shortcuts.txt",
    "content": "Robomongo shortcut key reference\n================================\n\"3T\", \"Robomongo\"\n### Windows/Linux users\n\n   Ctrl+Enter or F5 or Ctrl+R\n      Execute query on current tab. If you have selection in query text,\n      only selected text will be executed.\n\n   Ctrl+M\n      Minimize Robomongo Window\n\n   Ctrl+N\n      Open new connection dialog.\n\n   Ctrl+O\n      Open a Javascript file and load contents into active shell console\n      (without executing).\n\n   Ctrl+S\n      Save contents of active shell console into a .js file. Note: updates\n      existing file if contents were loaded via \"Open\", otherwise will confirm\n      filename via \"Save As\" dialog.\n\n   Shift+Ctrl+S\n      Save contents of active shell console (prompts for filename).\n\n   Shift+Ctrl+C or Ctrl+/\n      Toggle comment/uncomment mode for selected lines (or current line,\n      if none are selected)\n\n   Ctrl+T or Ctrl+Shift+Enter\n      Open new tab, based on current (the same server and database). If you\n      have selection in query text, selected text will be executed in new tab.\n\n   Ctrl+Shift+T\n      Open duplicate shell tab (same server, database, and query)\n\n   Ctrl+F4 or Ctrl+W\n      Closes current tab.\n\n   Ctrl+L\n      Toggle log window.\n\n   Alt+1, Alt+2, ..., Alt+9\n      Connect to server with 'this' number (you can reorder connections in\n      Connections menu via drag'n'drop)\n\n   F2\n      Enter Tree Mode. Current tab will be immediately displayed in tree mode\n      and all subsequent requests will be in tree mode.\n\n   F3\n      Enter Table Mode. Current tab will be immediately displayed in table mode\n      and all subsequent requests will be in table mode.\n\n   F4\n      Enter Text Mode. Current tab will be immediately displayed in text mode\n      and all subsequent requests will be in text mode.\n\n   F5 or Ctrl+Enter\n      Execute query on current tab. If you have selection in query text, only\n      selected text will be executed.\n\n   F6\n      Stop execution of currently running script.\n\n   F10\n      Toggle result orientation (between vertical and horizontal) for two or\n      more result panes.\n\n   F11\n      Toggle fullscreen mode.\n\n   Ctrl+F11\n      Toggle line numbers in Javascript editing views\n\n   Ctrl+Tab\n      Select next tab\n\n   Ctrl+Shift+Tab\n      Select previous tab\n\n   F12\n      Opens connection popup menu.\n\n### OS X users\n\n   Cmd+Enter or F5 or Cmd+R\n      Execute query on current tab. If you have selection in query text, only\n      selected text will be executed.\n\n   Cmd+M\n      Minimize Robomongo Window\n\n   Cmd+N\n      Open new connection dialog.\n\n   Cmd+O\n      Open a Javascript (.js) file and load contents into active shell console\n      (without executing)\n\n   Cmd+S\n      Save contents of active shell console into a .js file. Note: updates\n      existing file if contents were loaded via \"Open\", otherwise will confirm\n      filename via \"Save As\" dialog.\n\n   Shift+Cmd+S\n      Save contents of active shell console (prompts for filename).\n\n   Shift+Ctrl+C or Ctrl+/\n      Toggle comment/uncomment mode for selected lines (or current line,\n      if none are selected)\n\n   Cmd+T or Cmd+Shift+Enter\n      Open new tab, based on current (the same server and database). If you have\n      selection in query text, selected text will be executed in new tab.\n\n   Cmd+Shift+T\n      Open duplicate shell tab (same server, database, and query)\n\n   Cmd+W or Cmd+F4\n      Closes current tab.\n\n   Cmd+L\n      Toggle log window.\n\n   F2\n      Enter Tree Mode. Current tab will be immediately displayed in tree mode\n      and all subsequent requests will be in tree mode.\n\n   F3\n      Enter Table Mode. Current tab will be immediately displayed in table mode\n      and all subsequent requests will be in table mode.\n\n   F4\n      Enter Text Mode. Current tab will be immediately displayed in text mode\n      and all subsequent requests will be in text mode.\n\n   F5 or Cmd+Enter\n      Execute query on current tab. If you have selection in query text, only\n      selected text will be executed.\n\n   F6\n      Stop execution of currently running script.\n\n   F10\n      Toggle result orientation (between vertical and horizontal) for two or\n      more result panes.\n\n   Cmd+F11\n      Toggle fullscreen mode.\n\n   Cmd+} or Opt+Cmd+RightArrow\n      Select next tab\n\n   Cmd+{ or Opt+Cmd+LeftArrow\n      Select previous tab\n\n   Ctrl+F11\n      Toggle line numbers in Javascript editing views\n\n   Cmd + Up/Down arrow\n      Move to start/end of text in editing window\n\n   Cmd + Left/Right arrow\n      Move to start/end of current line in editing window\n"
  },
  {
    "path": "src/robomongo/.clang-format",
    "content": "# BasedOnStyle:  Google\nAccessModifierOffset: -4\nAlignOperands: false\nAlignAfterOpenBracket: true\nAlignEscapedNewlinesLeft: true\nAlignTrailingComments: true\nAllowAllParametersOfDeclarationOnNextLine: true\nAllowShortBlocksOnASingleLine: false\nAllowShortCaseLabelsOnASingleLine: false\nAllowShortFunctionsOnASingleLine: Empty\nAllowShortIfStatementsOnASingleLine: false\nAllowShortLoopsOnASingleLine: false\nAlwaysBreakAfterDefinitionReturnType: false\nAlwaysBreakBeforeMultilineStrings: true\nAlwaysBreakTemplateDeclarations: true\nBinPackArguments: false\nBinPackParameters: false\nBreakBeforeBinaryOperators: None\nBreakBeforeBraces: Attach\nBreakBeforeTernaryOperators: true\nBreakConstructorInitializersBeforeComma: false\nColumnLimit:     100\nCommentPragmas:  ''\nConstructorInitializerAllOnOneLineOrOnePerLine: true\nConstructorInitializerIndentWidth: 4\nContinuationIndentWidth: 4\nCpp11BracedListStyle: true\nDerivePointerAlignment: false\nDisableFormat:   false\nExperimentalAutoDetectBinPacking: false\nForEachMacros:   [ foreach, Q_FOREACH, BOOST_FOREACH ]\nIndentCaseLabels: true\nIndentFunctionDeclarationAfterType: false\nIndentWidth:     4\nIndentWrappedFunctionNames: false\nKeepEmptyLinesAtTheStartOfBlocks: false\nLanguage:        Cpp\nMaxEmptyLinesToKeep: 2\nNamespaceIndentation: None\nObjCSpaceAfterProperty: false\nObjCSpaceBeforeProtocolList: false\nPenaltyBreakBeforeFirstCallParameter: 19\nPenaltyBreakComment: 300\nPenaltyBreakFirstLessLess: 120\nPenaltyBreakString: 1000\nPenaltyExcessCharacter: 1000000\nPenaltyReturnTypeOnItsOwnLine: 200\nPointerAlignment: Left\nSpaceAfterCStyleCast: false\nSpaceBeforeAssignmentOperators: true\nSpaceBeforeParens: ControlStatements\nSpaceInEmptyParentheses: false\nSpacesBeforeTrailingComments: 2\nSpacesInAngles:  false\nSpacesInCStyleCastParentheses: false\nSpacesInContainerLiterals: true\nSpacesInParentheses: false\nSpacesInSquareBrackets: false\nStandard:        Cpp11\nTabWidth:        4\nUseTab:          Never\n"
  },
  {
    "path": "src/robomongo/CMakeLists.txt",
    "content": "\n# Automatically generate code for Qt moc, uic and rcc files\n# Since CMake 2.8.6\nset(CMAKE_AUTOMOC ON)\nset(CMAKE_AUTORCC ON)\nset(CMAKE_AUTOUIC ON)\n\n#set(sanitize \"-fsanitize=address\")\n#set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} ${sanitize}\")\n#set(CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} ${sanitize}\")\n\nset(SOURCES\n    # Isolated Scope #1\n    core/utils/QtUtils.cpp\n    core/utils/StdUtils.cpp\n    core/utils/Logger.cpp\n    core/HexUtils.cpp\n    core/utils/BsonUtils.cpp\n    core/settings/CredentialSettings.cpp\n    core/settings/ConnectionSettings.cpp\n    core/Event.cpp\n    core/Enums.cpp\n    core/EventError.cpp\n    core/EventBusSubscriber.cpp\n    core/EventBusDispatcher.cpp\n    core/EventWrapper.cpp\n    core/EventBus.cpp\n    core/KeyboardManager.cpp\n    core/domain/MongoNamespace.cpp\n    core/domain/MongoFunction.cpp\n    core/domain/MongoUtils.cpp\n    core/domain/MongoCollection.cpp\n    core/domain/MongoCollectionInfo.cpp\n    core/domain/MongoQueryInfo.cpp\n    core/domain/CursorPosition.cpp\n    core/domain/ScriptInfo.cpp\n    core/events/MongoEventsInfo.cpp\n    shell/db/ptimeutil.cpp\n    shell/bson/json.cpp\n\n    # Isolated Scope #2\n    core/engine/ScriptEngine.cpp\n    core/events/MongoEvents.cpp\n    core/domain/MongoDocument.cpp\n    gui/AppStyle.cpp\n    core/domain/MongoServer.cpp\n    core/domain/MongoShell.cpp\n    core/domain/MongoDatabase.cpp\n    core/domain/App.cpp\n    core/mongodb/MongoClient.cpp\n    core/mongodb/MongoWorker.cpp\n    core/mongodb/ReplicaSet.cpp\n    core/settings/SettingsManager.cpp\n    core/AppRegistry.cpp\n    utils/StringOperations.cpp\n    utils/common.cpp\n    utils/SimpleCrypt.cpp\n    utils/RoboCrypt.cpp\n\n    # Isolated Scope #3\n    gui/GuiRegistry.cpp\n    gui/dialogs/AboutDialog.cpp\n    gui/dialogs/EulaDialog.cpp\n    gui/dialogs/ConnectionAdvancedTab.cpp\n    gui/dialogs/ConnectionAuthTab.cpp\n    gui/dialogs/ConnectionBasicTab.cpp\n    gui/dialogs/ConnectionDiagnosticDialog.cpp\n    gui/dialogs/ConnectionDialog.cpp\n    gui/dialogs/CopyCollectionDialog.cpp\n    gui/widgets/workarea/IndicatorLabel.cpp\n    gui/dialogs/CreateCollectionDialog.cpp\n    gui/dialogs/CreateDatabaseDialog.cpp\n    gui/dialogs/CreateUserDialog.cpp\n    gui/utils/ComboBoxUtils.cpp\n    gui/utils/DialogUtils.cpp\n\n    # Isolated scope #4\n    gui/dialogs/PreferencesDialog.cpp\n    gui/dialogs/ConnectionsDialog.cpp\n    gui/dialogs/ExportDialog.cpp\n    gui/dialogs/ChangeShellTimeoutDialog.cpp\n\n    # Isolated scope #5\n    gui/editors/PlainJavaScriptEditor.cpp\n    gui/editors/JSLexer.cpp\n    gui/editors/FindFrame.cpp\n    gui/widgets/explorer/AddEditIndexDialog.cpp\n    gui/widgets/workarea/ScriptWidget.cpp\n\n    # Isolated scope #6\n    gui/widgets/explorer/ExplorerCollectionTreeItem.cpp\n    gui/widgets/explorer/ExplorerCollectionIndexesDir.cpp\n    gui/widgets/explorer/ExplorerCollectionIndexItem.cpp\n    gui/widgets/explorer/ExplorerTreeItem.cpp\n    gui/widgets/explorer/ExplorerReplicaSetFolderItem.cpp\n    gui/widgets/explorer/ExplorerReplicaSetTreeItem.cpp\n    gui/widgets/explorer/ExplorerDatabaseTreeItem.cpp\n    gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.cpp\n    gui/widgets/explorer/ExplorerUserTreeItem.cpp\n    gui/widgets/explorer/ExplorerFunctionTreeItem.cpp\n    gui/dialogs/DocumentTextEditor.cpp\n    gui/dialogs/FunctionTextEditor.cpp\n\n    # Isolated scope #7\n    gui/widgets/explorer/ExplorerServerTreeItem.cpp\n    gui/widgets/explorer/ExplorerTreeWidget.cpp\n    gui/widgets/explorer/ExplorerWidget.cpp\n    gui/widgets/workarea/BsonTableModel.cpp\n    gui/widgets/workarea/BsonTableView.cpp\n    gui/widgets/workarea/BsonTreeItem.cpp\n    gui/widgets/workarea/BsonTreeModel.cpp\n    gui/widgets/workarea/BsonTreeView.cpp\n    core/domain/Notifier.cpp\n\n    # Isolated scope #8\n    gui/widgets/workarea/CollectionStatsTreeItem.cpp\n    gui/widgets/workarea/CollectionStatsTreeWidget.cpp\n    gui/widgets/workarea/JsonPrepareThread.cpp\n    gui/widgets/workarea/OutputItemContentWidget.cpp\n    gui/widgets/workarea/OutputItemHeaderWidget.cpp\n    gui/widgets/workarea/OutputWidget.cpp\n    gui/widgets/workarea/PagingWidget.cpp\n    gui/widgets/workarea/ProgressBarPopup.cpp\n    gui/widgets/workarea/QueryWidget.cpp\n    gui/widgets/workarea/WorkAreaTabBar.cpp\n    gui/widgets/workarea/WorkAreaTabWidget.cpp\n    gui/widgets/workarea/WelcomeTab.cpp\n\n    # Final scope\n    gui/widgets/LogWidget.cpp\n    gui/MainWindow.cpp\n\n    gui/dialogs/SSHTunnelTab.cpp\n    gui/dialogs/SSLTab.cpp\n    core/settings/SshSettings.cpp\n    core/settings/SslSettings.cpp\n    core/settings/ReplicaSetSettings.cpp\n    core/mongodb/SshTunnelWorker.cpp\n\n    resources/robo.qrc\n    gui/resources/gui.qrc\n)\n\n# Robomongo target\nadd_executable(robomongo MACOSX_BUNDLE WIN32 app/main.cpp ${SOURCES})\n\n# Disable WebEngineWidgets for Linux\nSET(WebEngineWidgets \"Qt5::WebEngineWidgets\") \nif(SYSTEM_LINUX)\n   SET(WebEngineWidgets)  \nendif()\n \ntarget_link_libraries(robomongo\n    PRIVATE\n        Qt5::Widgets\n        Qt5::Network\n        Qt5::Xml\n        ${WebEngineWidgets}\n        qjson\n        qscintilla\n        mongodb\n        ssh\n        Threads::Threads)   # Target from FindThreads CMake module\n\nif(APPLE)\n  find_library(SECURITY NAMES Security)\n  find_library(CORE_FOUNDATION NAMES CoreFoundation)\n  set(SSL_LIBRARIES ${SECURITY} ${CORE_FOUNDATION})\n  \n  target_link_libraries(robomongo\n    PRIVATE\n        ${SSL_LIBRARIES}\n        -lresolv)\nendif(APPLE)\n\ntarget_include_directories(robomongo\n    PRIVATE\n        ${CMAKE_HOME_DIRECTORY}/src)\n\n# Get build number\nfind_package(Git)\nif(GIT_FOUND)\n    execute_process(\n        COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD\n        WORKING_DIRECTORY \"${CMAKE_CURRENT_SOURCE_DIR}\"\n        OUTPUT_VARIABLE BUILD_NUMBER   \n        OUTPUT_STRIP_TRAILING_WHITESPACE\n    )    \nelse(GIT_FOUND)\n    MESSAGE( FATAL_ERROR \"Unable to find Git\" )\n    set(BUILD_NUMBER 0)\nendif(GIT_FOUND)\n\nif(BUILD_NUMBER STREQUAL \"\")\n   MESSAGE( FATAL_ERROR \"Failed to get BUILD_NUMBER\" )\nendif()\n\nset(BUILD_NUMBER ${BUILD_NUMBER} CACHE INTERNAL \"\")\n\ntarget_compile_definitions(robomongo\n    PRIVATE\n        BUILDING_ROBO\n        PROJECT_NAME=\"${PROJECT_NAME}\"\n        PROJECT_NAME_TITLE=\"${PROJECT_NAME_TITLE}\"\n        PROJECT_COPYRIGHT=\"${PROJECT_COPYRIGHT}\"\n        PROJECT_DOMAIN=\"${PROJECT_DOMAIN}\"\n        PROJECT_COMPANYNAME=\"${PROJECT_COMPANYNAME}\"\n        PROJECT_COMPANYNAME_DOMAIN=\"${PROJECT_COMPANYNAME_DOMAIN}\"\n        PROJECT_GITHUB_FORK=\"${PROJECT_GITHUB_FORK}\"\n        PROJECT_GITHUB_ISSUES=\"${PROJECT_GITHUB_ISSUES}\"\n        PROJECT_VERSION=\"${PROJECT_VERSION}\"\n        PROJECT_VERSION_SHORT=\"${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}\"\n        BUILD_NUMBER=\"${BUILD_NUMBER}\"\n        PROJECT_NAME_LOWERCASE=\"${PROJECT_NAME_LOWERCASE}\"\n        PROJECT_QT_VERSION=\"${Qt5Core_VERSION}\"        \n        MongoDB_VERSION=\"${MongoDB_VERSION}\"\n        OPENSSL_VERSION=\"${OPENSSL_VERSION}\"\n        LIBSSH2_VERSION=\"${LIBSSH2_VERSION}\"\n        QJSON_VERSION=\"${QJSON_VERSION}\"\n        GOOGLE_TEST_VERSION=\"${GOOGLE_TEST_VERSION}\"\n        ESPRIMA_VERSION=\"${ESPRIMA_VERSION}\"\n)\n\nif(SYSTEM_WINDOWS)\n    # Create Windows Resource file\n    set(windows_icon \"${CMAKE_SOURCE_DIR}/install/windows/robomongo.ico\")\n    configure_file(\n        \"${CMAKE_SOURCE_DIR}/install/windows/winres.rc.in\"\n        \"${CMAKE_BINARY_DIR}/winres.rc\")\n    unset(windows_icon)\n\n    # Add additional source file to \"robomongo\" target\n    target_sources(robomongo PRIVATE \"${CMAKE_BINARY_DIR}/winres.rc\")\n\n    # Rename output name for Windows\n    set_target_properties(robomongo PROPERTIES OUTPUT_NAME \"robo3t\")\n\n    # Suppress \"warning C4477: 'sprintf'...\" from robomongo\\shell\\db\\ptimeutil.cpp\n    # Suppress \"warning C4291: ...no matching operator delete found\" from third_party\\mozjs-60\n    set_target_properties(robomongo PROPERTIES COMPILE_FLAGS \"/wd4477 /wd4291\")\n\n    # Start debug program with console\n    set_target_properties(robomongo PROPERTIES LINK_FLAGS_DEBUG \"/SUBSYSTEM:CONSOLE\")\n\n    # Seems that we do not need to do this with recent versions of Qt\n    target_link_libraries(robomongo PRIVATE Qt5::WinMain)\n\nelseif(SYSTEM_MACOSX)\n    string(TIMESTAMP CURRENT_YEAR \"%Y\")\n    set_target_properties(robomongo PROPERTIES\n        INSTALL_RPATH \"@executable_path/../Frameworks\"\n        OUTPUT_NAME \"Robo 3T\"\n        MACOSX_BUNDLE_INFO_PLIST \"${CMAKE_SOURCE_DIR}/install/macosx/Info.plist.in\"\n        MACOSX_BUNDLE_BUNDLE_NAME \"Robo 3T\"\n        MACOSX_BUNDLE_GUI_IDENTIFIER \"com.3tsoftwarelabs.robo3t\"\n        MACOSX_BUNDLE_INFO_STRING \"Robo 3T ${PROJECT_VERSION}. Copyright 3T Software Labs Ltd, 2014 - ${CURRENT_YEAR}\"\n        MACOSX_BUNDLE_SHORT_VERSION \"${PROJECT_VERSION}\"\n        MACOSX_BUNDLE_LONG_VERSION \"${PROJECT_VERSION}\"\n        MACOSX_BUNDLE_BUNDLE_VERSION \"${PROJECT_VERSION}\"\n        MACOSX_BUNDLE_COPYRIGHT \"Copyright 3T Software Labs Ltd, 2014 - ${CURRENT_YEAR}\"\n        MACOSX_BUNDLE_ICON_FILE \"robomongo\")\n\nelseif(SYSTEM_LINUX)\n    set_target_properties(robomongo PROPERTIES\n        INSTALL_RPATH \"$ORIGIN/../lib\"\n        OUTPUT_NAME \"robo3t\")\nendif()\n\n# Install\ninclude(RobomongoInstall)\n\n#\n# Tests targets (code below should be moved to separate file)\nadd_executable(tests WIN32 EXCLUDE_FROM_ALL app/main_test.cpp gui/editors/JSLexer.cpp)\ntarget_link_libraries(tests Qt5::Widgets qjson qscintilla mongodb Threads::Threads)\ntarget_include_directories(tests\n    PRIVATE\n        ${CMAKE_HOME_DIRECTORY}/src)\n\n# Target that creates original MongoDB shell\n# Used to test compilation and linking\nadd_executable(shell EXCLUDE_FROM_ALL shell/shell/dbshell.cpp)\ntarget_link_libraries(shell\n    mongodb\n    Threads::Threads)       # Target from FindThreads CMake module\n"
  },
  {
    "path": "src/robomongo/app/main.cpp",
    "content": "#include <QApplication>\n#include <QDesktopWidget>\n\n#include <locale.h>\n\n// Header \"mongo/util/net/sock\" is needed for mongo::enableIPv6()\n// Header \"mongo/platform/basic\" is required by \"sock.h\" under Windows\n#include <mongo/platform/basic.h>\n#include <mongo/util/net/socket_utils.h>\n#include <mongo/base/initializer.h>\n#include <mongo/util/net/ssl_options.h>\n#include <mongo/db/service_context.h>\n#include <mongo/transport/transport_layer_asio.h>\n#include <mongo/shell/shell_options.h>\n#include <mongo/db/storage/storage_engine_init.h>\n\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/core/utils/Logger.h\"       \n#include \"robomongo/gui/MainWindow.h\"\n#include \"robomongo/gui/AppStyle.h\"\n#include \"robomongo/gui/dialogs/EulaDialog.h\"\n#include \"robomongo/ssh/ssh.h\"\n#include \"robomongo/utils/RoboCrypt.h\"       \n\nint main(int argc, char *argv[], char** envp)\n{\n    if (rbm_ssh_init()) \n        return 1;\n\n    // Please check, do we really need envp for other OSes?\n#ifdef Q_OS_WIN\n    envp = NULL;\n#endif\n\n    // Support for IPv6 is disabled by default. Enable it.\n    mongo::enableIPv6(true);\n\n    // Perform SSL-enabled mongo initialization\n    mongo::sslGlobalParams.sslMode.store(mongo::SSLParams::SSLMode_allowSSL);\n\n    // Cross Platform High DPI support - Qt 5.7\n    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);\n\n    // Initialization routine for MongoDB shell\n    mongo::runGlobalInitializersOrDie(argc, argv, envp);\n    mongo::setGlobalServiceContext(mongo::ServiceContext::make());\n    // Todo from mongo repo: This should use a TransportLayerManager or TransportLayerFactory\n    auto serviceContext = mongo::getGlobalServiceContext();\n    mongo::transport::TransportLayerASIO::Options opts;\n    // When true, it breaks connection to localhost, github #1757\n    opts.enableIPv6 = mongo::shellGlobalParams.enableIPv6;\n    opts.mode = mongo::transport::TransportLayerASIO::Options::kEgress;\n    serviceContext->setTransportLayer(\n        std::make_unique<mongo::transport::TransportLayerASIO>(opts, nullptr)\n    );\n    auto tlPtr = serviceContext->getTransportLayer();\n    uassertStatusOK(tlPtr->setup());\n    uassertStatusOK(tlPtr->start());    \n\n    // Initialize Qt application\n    QApplication app(argc, argv);\n\n    // On Unix/Linux Qt is configured to use the system locale settings by default.\n    // This can cause a conflict when using POSIX functions, for instance, when\n    // converting between data types such as floats and strings, since the notation\n    // may differ between locales. To get around this problem, call the POSIX\n    // function setlocale(LC_NUMERIC, \"C\") right after initializing QApplication or\n    // QCoreApplication to reset the locale that is used for number formatting to \"C\"-locale.\n    // (http://doc.qt.io/qt-5/qcoreapplication.html#locale-settings)\n    setlocale(LC_NUMERIC, \"C\");\n\n#ifdef Q_OS_MAC\n    app.setAttribute(Qt::AA_UseHighDpiPixmaps);\n#endif\n     \n    // EULA License Agreement\n    auto const& settings { Robomongo::AppRegistry::instance().settingsManager() };\n    if (!settings->acceptedEulaVersions().contains(PROJECT_VERSION)) {\n        bool const showFormPage { settings->programExitedNormally() && !settings->disableHttpsFeatures() };\n        Robomongo::EulaDialog eulaDialog(showFormPage);\n        settings->setProgramExitedNormally(false);\n        settings->save();\n        int const result = eulaDialog.exec();\n        settings->setProgramExitedNormally(true);\n        settings->save();\n        if (QDialog::Rejected == result) {\n            rbm_ssh_cleanup();\n            return 1;\n        }\n        // EULA accepted\n        settings->addAcceptedEulaVersion(PROJECT_VERSION);\n        settings->save();\n    }  \n\n    // Init GUI style\n    Robomongo::AppStyleUtils::initStyle();\n\n    // To be set true at normal program exit\n    settings->setProgramExitedNormally(false);\n    settings->save();\n\n    // Application main window\n    Robomongo::MainWindow mainWindow;\n    mainWindow.show();\n\n    for(auto const& msgAndSeverity : Robomongo::RoboCrypt::roboCryptLogs())\n        Robomongo::LOG_MSG(msgAndSeverity.first, msgAndSeverity.second);\n\n    int rc = app.exec();\n    rbm_ssh_cleanup();\n    return rc;\n}\n"
  },
  {
    "path": "src/robomongo/app/main_mongo.cpp",
    "content": "#include <QApplication>\n#include <QDesktopWidget>\n#include <QDebug>\n\n#include <locale.h>\n#include <mongo/bson/bsonobjbuilder.h>\n#include <robomongo/core/utils/BsonUtils.h>\n\nusing namespace Robomongo;\n\nint main(int argc, char *argv[])\n{\n    QApplication app(argc, argv);\n    \n    mongo::BSONObjBuilder m;\n    m.append(\"test\", 56);\n    const mongo::BSONObj &obj = m.obj();\n\n    std::string str = BsonUtils::jsonString(obj, mongo::TenGen, 1, DefaultEncoding, Utc);\n\n    qDebug() << \"Hello!\";\n    qDebug() << QString::fromStdString(str);\n\n    return app.exec();\n}\n\n"
  },
  {
    "path": "src/robomongo/app/main_test.cpp",
    "content": "#undef NDEBUG\n\n#include <sstream>\n#include <iostream>\n#include <assert.h>\n#include <limits>\n#include <mongo/util/exit_code.h>\n#include <mongo/util/net/hostandport.h>\n\nnamespace mongo {\n    extern bool isShell;\n    void logProcessDetailsForLogRotate() {}\n    void exitCleanly(ExitCode code) {}\n}\n\nvoid testHostAndPort() {\n    mongo::HostAndPort hp = mongo::HostAndPort(\"127.0.0.1\", 20017);\n    assert(hp.toString() == \"127.0.0.1:20017\");\n\n    hp = mongo::HostAndPort(\"2a03:b0c0:3:d0::f3:1001\", 20017);\n    assert(hp.toString() == \"[2a03:b0c0:3:d0::f3:1001]:20017\");\n\n    // toString() will wrap IPv6 address in brackets even if they\n    // are already exist. This is true at least for MongoDB 3.2\n    hp = mongo::HostAndPort(\"[2a03:b0c0:3:d0::f3:1001]\", 20017);\n    assert(hp.toString() == \"[[2a03:b0c0:3:d0::f3:1001]]:20017\");\n\n    hp = mongo::HostAndPort(\"[2a03:b0c0:3:d0::f3:1001\", 20017);\n    assert(hp.toString() == \"[[2a03:b0c0:3:d0::f3:1001]:20017\");\n}\n\nvoid precisionAssert(const std::string &text, double d) {\n    std::stringstream s;\n    s.precision(std::numeric_limits<double>::digits10);\n    s << d;\n    if (d == (long long)d)\n        s << \".0\";\n    std::cout << \"Checking \" << text << \" - \";\n    assert(text == s.str());\n    std::cout << \"Correct. \" << std::endl;\n}\n\nvoid testPrecision() {\n    precisionAssert(\"-9.987654321\", -9.987654321);\n    precisionAssert(\"-1.0\", -1.0);\n    precisionAssert(\"-0.0\", -0.0);\n    precisionAssert(\"0.0\", 0.0);\n    precisionAssert(\"9.0\", 9.0);\n    precisionAssert(\"9.8\", 9.8);\n    precisionAssert(\"9.9\", 9.9);\n    precisionAssert(\"9.98\", 9.98);\n    precisionAssert(\"9.987\", 9.987);\n    precisionAssert(\"9.9876\", 9.9876);\n    precisionAssert(\"9.98765\", 9.98765);\n    precisionAssert(\"9.987654\", 9.987654);\n    precisionAssert(\"9.9876543\", 9.9876543);\n    precisionAssert(\"9.98765432\", 9.98765432);\n    precisionAssert(\"9.987654321\", 9.987654321);\n    precisionAssert(\"9.987654321\", 9.9876543210);\n    precisionAssert(\"9.98765432109\", 9.98765432109);\n    precisionAssert(\"9.987654321098\", 9.987654321098);\n    precisionAssert(\"9.9876543210987\", 9.9876543210987);\n    precisionAssert(\"9.98765432109876\", 9.98765432109876);\n    precisionAssert(\"9.98765432109876\", 9.987654321098765);\n    precisionAssert(\"9.98765432109877\", 9.9876543210987654);\n    precisionAssert(\"3.1415\", 3.1415);\n    precisionAssert(\"1.1\", 1.1);\n    precisionAssert(\"9.7\", 9.7);\n}\n\nint main(int argc, char *argv[], char** envp)\n{\n    testHostAndPort();\n    testPrecision();\n    return 0;\n}\n"
  },
  {
    "path": "src/robomongo/core/AppRegistry.cpp",
    "content": "#include \"robomongo/core/AppRegistry.h\"\n\n#include \"robomongo/core/EventBus.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/core/domain/App.h\"\n\nnamespace Robomongo\n{\n    AppRegistry::AppRegistry() :\n        _bus(new EventBus()),\n        _settingsManager(new SettingsManager()),\n        _app(new App(_bus.get()))\n    {\n    }\n\n    AppRegistry::~AppRegistry()\n    {   \n    }\n}\n\n"
  },
  {
    "path": "src/robomongo/core/AppRegistry.h",
    "content": "#pragma once\n\n#include \"robomongo/core/Core.h\"\n#include \"robomongo/core/utils/SingletonPattern.hpp\"\n\nnamespace Robomongo\n{\n    class SettingsManager;\n\n    class AppRegistry: public Patterns::LazySingleton<AppRegistry>\n    {\n        friend class Patterns::LazySingleton<AppRegistry>;\n    public:\n\n        SettingsManager *const settingsManager() const { return _settingsManager.get(); }\n        App *const app() const { return _app.get(); }\n        EventBus *const bus() const { return _bus.get(); }\n\n    private:\n        AppRegistry();\n        ~AppRegistry();\n\n        const EventBusScopedPtr _bus;\n        const SettingsManagerScopedPtr _settingsManager;\n        const AppScopedPtr _app;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/Core.h",
    "content": "#pragma once\n\n#include <boost/scoped_ptr.hpp>\n#include <boost/shared_ptr.hpp>\n\nnamespace mongo\n{\n    class DBClientConnection;\n}\n\n/*\n** Smart pointers for Mongo* staff\n*/\nnamespace Robomongo\n{\n    class AppRegistry;\n    typedef boost::scoped_ptr<AppRegistry> AppRegistryScopedPtr;\n\n    class SettingsManager;\n    typedef boost::scoped_ptr<SettingsManager> SettingsManagerScopedPtr;\n\n    class App;\n    typedef boost::scoped_ptr<App> AppScopedPtr;\n\n    class EventBus;\n    typedef boost::scoped_ptr<EventBus> EventBusScopedPtr;\n\n    class MongoCollection;\n    typedef boost::shared_ptr<MongoCollection> MongoCollectionPtr;\n\n    class MongoDocument;\n    typedef boost::shared_ptr<MongoDocument> MongoDocumentPtr;\n\n    // todo: Use enum class\n    enum ConnectionType {\n        // This type of connection is shown in Explorer and also opens SSH tunnel for secondary \n        // connections (if needed)\n        ConnectionPrimary      = 0,\n\n        // Never shown in Explorer and uses SSH tunnel from primary connection (if needed)\n        ConnectionSecondary    = 1,\n\n        // The same as Primary, but is specifically for testing connections.\n        ConnectionTest         = 2,\n\n        // Never shown in Explorer and can be used to refresh (via reconnecting) current connection view \n        // (i.e. db version, storage engine, current replica set primary, status of replica set etc...)\n        ConnectionRefresh      = 3\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/Enums.cpp",
    "content": "#include \"robomongo/core/Enums.h\"\n#include <string.h>\n\nnamespace\n{\n    const char *viewModeAsoc[Robomongo::Custom+1] = {\"Text mode\", \"Tree mode\", \"Table mode\", \"Custom mode\"};\n    const char *timesAsoc[Robomongo::LocalTime+1] = {\"UTC\", \"Local Timezone\"};\n    const char *uuidAsoc[Robomongo::PythonLegacy+1] = {\"Default encoding\", \"Java encoding\", \"CSharp encoding\", \"Python encoding\"};\n\n    template<typename type, int size>\n    inline type findTypeInArray(const char *(&arr)[size], const char *text)\n    {\n        for (int i = 0; i < size; ++i )\n        {\n            if (strcmp(text, arr[i]) == 0)\n            {\n                return static_cast<type>(i);\n            }\n        }\n        return static_cast<type>(0);\n    }\n}\n\nnamespace Robomongo\n{\n    const char *convertUUIDEncodingToString(UUIDEncoding uuidCode)\n    {\n       return uuidAsoc[uuidCode];\n    }\n\n    UUIDEncoding convertStringToUUIDEncoding(const char *text)\n    {\n        return findTypeInArray<UUIDEncoding>(uuidAsoc, text);\n    }\n\n    const char *convertTimesToString(SupportedTimes time)\n    {\n        return timesAsoc[time];\n    }\n\n    SupportedTimes convertStringToTimes(const char *text)\n    {\n        return findTypeInArray<SupportedTimes>(timesAsoc, text);\n    }\n\n    const char *convertViewModeToString(ViewMode mode)\n    {\n        return viewModeAsoc[mode];\n    }\n\n    ViewMode convertStringToViewMode(const char *text)\n    {\n        return findTypeInArray<ViewMode>(viewModeAsoc, text);\n    }\n}\n\n"
  },
  {
    "path": "src/robomongo/core/Enums.h",
    "content": "#pragma once\n\nnamespace Robomongo\n{\n    enum UUIDEncoding\n    {\n        DefaultEncoding = 0,\n        JavaLegacy      = 1,\n        CSharpLegacy    = 2,\n        PythonLegacy    = 3\n    };\n\n    enum SupportedTimes\n    {\n        Utc       = 0,\n        LocalTime = 1\n    };\n\n    enum ViewMode\n    {\n        Text = 0,\n        Tree = 1,\n        Table = 2,\n        Custom = 3\n    };\n\n    enum AutocompletionMode\n    {\n        AutocompleteNone = 0,\n        AutocompleteAll = 1,\n        AutocompleteNoCollectionNames = 2\n    };\n\n    const char *convertUUIDEncodingToString(UUIDEncoding uuidCode);\n    UUIDEncoding convertStringToUUIDEncoding(const char *text);\n\n    const char *convertTimesToString(SupportedTimes time);\n    SupportedTimes convertStringToTimes(const char *text);\n\n    const char *convertViewModeToString(ViewMode mode);\n    ViewMode convertStringToViewMode(const char *text);\n}\n\n"
  },
  {
    "path": "src/robomongo/core/Event.cpp",
    "content": "#include \"robomongo/core/Event.h\"\n\n"
  },
  {
    "path": "src/robomongo/core/Event.h",
    "content": "#pragma once\n\n#include <QObject>\n#include <QString>\n#include <QEvent>\n#include <QMetaType>\n\n#include \"robomongo/core/EventError.h\"\n\nnamespace Robomongo\n{\n    /**\n     * @brief Abstract base class for all events in Robomongo.\n     */\n    class Event\n    {\n    public:\n        /**\n         * @brief Creates \"non-error\" event.\n         */\n        Event(QObject *sender) :\n            _sender(sender) {}\n\n        /**\n         * @brief Creates \"error-event\" that highlights that state of this\n         * event is invalid because of error.\n         */\n        Event(QObject *sender, const EventError &error) :\n            _sender(sender),\n            _error(error) { }\n\n        virtual ~Event() { }\n\n        /**\n         * @brief Type identifier of event. We are using QEvent::Type in order to\n         * support usage of events as QEvent with the help of EventWrapper.\n         */\n        virtual QEvent::Type type() = 0;\n\n        /**\n         * @brief typeString\n         * @return\n         */\n        virtual const char *typeString() = 0;\n\n        /**\n         * @brief Sender that emits this event.\n         */\n        QObject *sender() const { return _sender; }\n\n        /**\n         * @brief Tests whether this event is \"error-event\".\n         */\n        bool isError() const { return !_error.isNull(); }\n\n        /**\n         * @brief Returns Error object.\n         */\n        const EventError &error() const { return _error; }\n\n    private:\n        /**\n         * @brief Sender that emits this event.\n         */\n        QObject *_sender;\n\n        /**\n         * @brief Possible error.\n         */\n        const EventError _error;\n    };\n}\n\n/**\n * @brief R_EVENT macro declares several event's members that are used by\n * Robomongo event subsystem. It should be used like Q_OBJECT macro:\n *\n *  class SampleEvent : public Event\n *  {\n *      R_EVENT\n *\n *      SampleEvent(QObject *sender, const QString &text) :\n *          Event(sender),\n *          server(server) { }\n *\n *      QString text;\n *  };\n *\n * Warning: for convinience, this macro makes all subsequent declarations to\n * be public by default.\n */\n#define R_EVENT                           \\\n    public:                               \\\n        const static QEvent::Type Type;   \\\n        const static int metatype;        \\\n        virtual const char *typeString(); \\\n        virtual QEvent::Type type();\n\n\n/**\n * @brief R_REGISTER_EVENT macro defines several event's members that are used\n * by Robomongo simple event subsystem. This macro should be placed in *.cpp file.\n * @param EVENT_CLASS: class name of Event.\n *\n * For SampleEvent shown above, registration will look like this:\n * R_REGISTER_EVENT(SampleEvent)\n */\n#define R_REGISTER_EVENT(EVENT_CLASS)                                                               \\\n    const QEvent::Type EVENT_CLASS::Type = static_cast<QEvent::Type>(QEvent::registerEventType());  \\\n    const char *EVENT_CLASS::typeString() { return #EVENT_CLASS\"*\"; }                                \\\n    QEvent::Type EVENT_CLASS::type() { return EVENT_CLASS::Type; }                                   \\\n    const int EVENT_CLASS::metatype = qRegisterMetaType<EVENT_CLASS*>(#EVENT_CLASS\"*\");\n"
  },
  {
    "path": "src/robomongo/core/EventBus.cpp",
    "content": "#include \"robomongo/core/EventBus.h\"\n\n#include <QObject>\n#include <QCoreApplication>\n#include <QThread>\n#include <QMutexLocker>\n\n#include \"robomongo/core/EventBusDispatcher.h\"\n#include \"robomongo/core/EventBusSubscriber.h\"\n#include \"robomongo/core/Event.h\"\n#include \"robomongo/core/EventWrapper.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace\n{\n    struct RemoveIfReciver\n    {\n        RemoveIfReciver(QObject *receiver) : _receiver(receiver) {}\n\n        bool operator()(const Robomongo::EventBus::EventTypeAndSubscriber& item) const {\n            if (item.second->receiver == _receiver) {\n                delete item.second;\n                return true;\n            }\n            return false;\n        }\n\n        QObject *_receiver;\n    };\n\n    struct FindIfReciver\n    {\n        FindIfReciver(QThread *thread) : _thread(thread) {}\n        bool operator()(const Robomongo::EventBus::ThreadAndDispatcher &item) const {\n            if (item.first == _thread) \n                return true;\n            \n            return false;\n        }\n        QThread *_thread;\n    };\n}\n\nnamespace Robomongo\n{\n    EventBus::EventBus() : QObject(),\n        _lock(QMutex::Recursive)\n    {\n    }\n\n    EventBus::~EventBus()\n    {\n        for (auto const& dispatchersByThread : _dispatchersByThread)\n            delete dispatchersByThread.second;\n    }\n\n    void EventBus::publish(Event *event)\n    {\n        QMutexLocker lock(&_lock);\n        QList<QObject*> theReceivers;\n        EventBusDispatcher *dis = nullptr;\n        for (auto const& item : _subscribersByEventType) {            \n            if (event->type() == item.first) {\n                EventBusSubscriber *subscriber = item.second;\n                if (!subscriber->sender || subscriber->sender == event->sender()) {\n                    theReceivers.append(subscriber->receiver);\n\n                    if (dis && dis != subscriber->dispatcher)\n                        throw \"You cannot publish events to subscribers from more than one thread.\";\n\n                    dis = subscriber->dispatcher;\n                }\n            }\n        }\n\n        if (dis)\n            sendEvent(dis, new EventWrapper(event, theReceivers));\n    }\n\n    void EventBus::send(QObject *receiver, Event *event)\n    {\n        QMutexLocker lock(&_lock);\n\n        if (!receiver)\n            return;\n\n        QThread *thread = receiver->thread();\n        EventBusDispatcher *dis = dispatcher(thread);\n\n        sendEvent(dis, new EventWrapper(event, receiver));\n    }\n\n    void EventBus::send(QList<QObject *> receivers, Event *event)\n    {\n        QMutexLocker lock(&_lock);\n\n        if (receivers.count() == 0)\n            return;\n\n        QThread *thread = receivers.last()->thread();\n        EventBusDispatcher *dis = dispatcher(thread);\n\n        sendEvent(dis, new EventWrapper(event, receivers));\n    }\n\n    void EventBus::subscribe(QObject *receiver, QEvent::Type type, QObject *sender /* = NULL */)\n    {\n        QMutexLocker lock(&_lock);\n\n        QThread *currentThread = QThread::currentThread();\n        EventBusDispatcher *dis = dispatcher(currentThread);\n\n        // subscribe to destroyed signal in order to remove\n        // listener (receiver) from list of subscribers\n        VERIFY(connect(receiver, SIGNAL(destroyed(QObject*)), this, SLOT(unsubscibe(QObject*))));\n\n        // add subscriber\n        _subscribersByEventType.push_back(EventTypeAndSubscriber(type, new EventBusSubscriber(dis, receiver, sender)));\n    }\n\n    void EventBus::unsubscibe(QObject *receiver)\n    {\n        QMutexLocker lock(&_lock);\n        _subscribersByEventType.erase(std::remove_if(_subscribersByEventType.begin(), _subscribersByEventType.end(),\n            RemoveIfReciver(receiver)), _subscribersByEventType.end());\n    }\n\n    /**\n     * @brief Returns dispatcher for specified thread. If there is no dispatcher\n     * for this thread registered, it will be created and moved to 'thread' thread.\n     */\n    EventBusDispatcher *EventBus::dispatcher(QThread *thread)\n    {\n        auto const& disIt = std::find_if(\n            _dispatchersByThread.begin(), _dispatchersByThread.end(), FindIfReciver(thread)\n        );\n       \n        if (disIt != _dispatchersByThread.end()) {\n            return (*disIt).second;\n        }\n        else {\n            EventBusDispatcher *dis = new EventBusDispatcher();\n            dis->moveToThread(thread);\n            _dispatchersByThread.push_back(ThreadAndDispatcher(thread, dis));\n            return dis;\n        }        \n    }\n\n    /**\n     * @brief Sends event synchronousely, if current thread and dispatcher thread are\n     * the same. Sends asynchronousely, if this is cross-thread communication;\n     */\n    void EventBus::sendEvent(EventBusDispatcher *dispatcher, EventWrapper *wrapper)\n    {\n        if (dispatcher->thread() == QThread::currentThread()) {\n            QCoreApplication::sendEvent(dispatcher, wrapper);\n            delete wrapper;\n        }\n        else {\n            QCoreApplication::postEvent(dispatcher, wrapper);\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/robomongo/core/EventBus.h",
    "content": "#pragma once\n\n#include <QObject>\n#include <QEvent>\n#include <QMutex>\n#include <vector>\n\nnamespace Robomongo\n{\n    class Event;\n    class EventWrapper;\n    class EventBusDispatcher;\n    struct EventBusSubscriber;\n\n    /**\n     * @brief The EventBus class\n     * @threadsafe\n     */\n    class EventBus : public QObject\n    {\n        Q_OBJECT\n\n    public:\n        typedef std::pair<QEvent::Type, EventBusSubscriber *> EventTypeAndSubscriber;\n        typedef std::pair<QThread *, EventBusDispatcher *> ThreadAndDispatcher;\n\n        EventBus();\n        ~EventBus();\n\n        /**\n         * @brief Publishes specified event.\n         * @param sender - object, that emits this event\n         */\n        void publish(Event *event);\n\n        /**\n         * @brief Sends 'event' to 'receiver'.\n         */\n        void send(QObject *receiver, Event *event);\n\n        /**\n         * @brief Sends 'event' to list of 'receivers'.\n         */\n        void send(QList<QObject *> receivers, Event *event);\n\n        /**\n         * @brief Subscribes 'receiver' to event of specified 'type'.\n         * Optionally you can specify exact send\n         */\n        void subscribe(QObject *receiver, QEvent::Type type, QObject *sender = NULL);\n\n    public Q_SLOTS:\n        void unsubscibe(QObject *receiver);\n\n    private:\n        /**\n         * @brief Returns dispatcher for specified thread. If there is no dispatcher\n         * for this thread registered, new dispatcher will be created and moved\n         * to 'thread' thread.\n         */\n        EventBusDispatcher *dispatcher(QThread *thread);\n\n        void sendEvent(EventBusDispatcher *dispatcher, EventWrapper *wrapper);\n\n    private:\n        QMutex _lock;\n        std::vector<EventTypeAndSubscriber> _subscribersByEventType;\n        std::vector<ThreadAndDispatcher> _dispatchersByThread;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/EventBusDispatcher.cpp",
    "content": "#include \"robomongo/core/EventBusDispatcher.h\"\n#include \"robomongo/core/EventWrapper.h\"\n\nnamespace Robomongo\n{\n\n    EventBusDispatcher::EventBusDispatcher(QObject *parent) :\n        QObject(parent)\n    {\n\n    }\n\n    bool EventBusDispatcher::event(QEvent *qevent)\n    {\n        EventWrapper *wrapper = dynamic_cast<EventWrapper *>(qevent);\n\n        if (!wrapper)\n            return false;\n\n        Event *event = wrapper->event();\n\n        const char *typeName = event->typeString();\n        const QList<QObject*> &recivers = wrapper->receivers();\n        for (QList<QObject*>::const_iterator it = recivers.begin(); it != recivers.end(); ++it) {\n            QMetaObject::invokeMethod(*it, \"handle\", QGenericArgument(typeName, &event));\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/EventBusDispatcher.h",
    "content": "#pragma once\n#include <QObject>\n\nnamespace Robomongo\n{\n    /**\n     * @brief The EventBusDispatcher class\n     */\n    class EventBusDispatcher : public QObject\n    {\n        Q_OBJECT\n    public:\n        EventBusDispatcher(QObject *parent = 0);\n    protected:\n        virtual bool event(QEvent *qevent);\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/EventBusSubscriber.cpp",
    "content": "#include \"robomongo/core/EventBusSubscriber.h\"\n#include \"robomongo/core/EventBusDispatcher.h\"\n\nnamespace Robomongo\n{\n    EventBusSubscriber::EventBusSubscriber(EventBusDispatcher *dispatcher, QObject *receiver, QObject *sender) :\n        receiver(receiver),\n        dispatcher(dispatcher),\n        sender(sender) {}\n}\n"
  },
  {
    "path": "src/robomongo/core/EventBusSubscriber.h",
    "content": "#pragma once\n\n#include <QObject>\n\nnamespace Robomongo\n{\n    class EventBusDispatcher;\n    struct EventBusSubscriber\n    {\n        EventBusSubscriber(EventBusDispatcher *dispatcher, QObject *receiver, QObject *sender = 0);\n        EventBusDispatcher *const dispatcher;\n        QObject *const receiver;\n        QObject *const sender;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/EventError.cpp",
    "content": "#include \"robomongo/core/EventError.h\"\n\n#include \"robomongo/utils/StringOperations.h\"\n\nnamespace Robomongo\n{\n    EventError::EventError() :\n        _isNull(true) {}\n\n    EventError::EventError(const std::string &errorMessage, ErrorCode errorCode /*= Unknown*/,\n                           bool showErrorWindow /* = true */) :\n        _errorMessage(captilizeFirstChar(errorMessage)),\n        _errorCode(errorCode),\n        _showErrorWindow(showErrorWindow),\n        _isNull(false) {}\n\n    EventError::EventError(const std::string &errorMessage, ReplicaSet const& replicaSetInfo, \n                           bool showErrorWindow /* = true */ ) :\n        _errorMessage(errorMessage), \n        _errorCode(SetPrimaryUnreachable),\n        _replicaSetInfo(replicaSetInfo),\n        _showErrorWindow(showErrorWindow),\n        _isNull(false) {}\n\n    bool EventError::isNull() const\n    {\n        return _isNull;\n    }\n\n    const std::string &EventError::errorMessage() const \n    {\n        return _errorMessage;\n    }\n\n}\n"
  },
  {
    "path": "src/robomongo/core/EventError.h",
    "content": "#pragma once\n#include <string>\n\n#include \"robomongo/core/mongodb/ReplicaSet.h\"\n\nnamespace Robomongo\n{\n    /**\n     * @brief Error object is a part of every Event in Robomongo. Before the\n     * use of any event you should check whether error is detected by\n     * calling Event::isError() method.\n     */\n    class EventError\n    {\n\n    public:\n\n        enum ErrorCode { Unknown, SetPrimaryUnreachable, ServerHasDifferentMembers };\n\n        /**\n         * @brief Creates \"null\" (or, in other words, empty) error.\n         * Subsequent call of isNull() on this object will return true.\n         */\n        EventError();\n\n        /**\n         * @brief Creates error object with specified error message.\n         * Subsequent call of isNull() on this object will return false.\n         */\n        explicit EventError(const std::string &errorMessage, ErrorCode errorCode = Unknown, \n                            bool showErrorWindow = true);\n        \n        /**\n        * @brief Creates error object only for replica set connection failures\n        */\n        explicit EventError(const std::string &errorMessage, ReplicaSet const& replicaSetInfo, \n                            bool showErrorWindow = true);\n\n        /**\n         * @brief Tests whether error is \"null\" (or, in other words, empty).\n         * Because Error object should be created on stack, this is the only\n         * way to support \"null\" semantic for value objects.\n         * @return true, if null or false otherwise.\n         */\n        bool isNull() const;\n\n        /**\n         * @brief Returns error message that describes this error.\n         */\n        const std::string &errorMessage() const;\n        \n        ErrorCode errorCode() const { return _errorCode; }\n        ReplicaSet replicaSetInfo() const { return _replicaSetInfo; }\n        bool showErrorWindow() const { return _showErrorWindow; }\n\n    private:\n        /**\n         * @brief Error message\n         */\n        std::string const _errorMessage;\n        ErrorCode const _errorCode = Unknown;\n        ReplicaSet const _replicaSetInfo;\n        bool const _showErrorWindow = true;\n        bool const _isNull;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/EventWrapper.cpp",
    "content": "#include \"robomongo/core/EventWrapper.h\"\nnamespace Robomongo\n{\n    EventWrapper::EventWrapper(Event *event, QList<QObject *> receivers) \n        : QEvent(event->type()), _event(event), _receivers(receivers) {}\n\n    EventWrapper::EventWrapper(Event *event, QObject * receiver)\n        : QEvent(event->type()), _event(event), _receivers(QList<QObject *>() << receiver ) {}\n\n    Event *EventWrapper::event() const \n    {\n        return _event.get(); \n    }\n\n    const QList<QObject *> &EventWrapper::receivers() const \n    {\n        return _receivers;\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/EventWrapper.h",
    "content": "#pragma once\n#include <boost/scoped_ptr.hpp>\n#include \"robomongo/core/Event.h\"\n\nnamespace Robomongo\n{\n    class EventWrapper : public QEvent\n    {\n    public:\n        EventWrapper(Event *event, QList<QObject *> receivers);\n        EventWrapper(Event *event, QObject * receiver);\n        Event *event() const;\n        const QList<QObject *> &receivers() const;\n\n    private:\n        const boost::scoped_ptr<Event> _event;\n        const QList<QObject *> _receivers;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/HexUtils.cpp",
    "content": "#include \"robomongo/core/HexUtils.h\"\n\n#include <mongo/util/hex.h>\n#include <pcrecpp.h>\n#include <iostream>\n\nnamespace Robomongo\n{\n    namespace HexUtils\n    {\n        bool isHexString(const std::string &str)\n        {\n            std::size_t i;\n            for (i = 0; i < str.size(); i++) {\n                if (!isxdigit(str[i])) {\n                    return false;\n                }\n            }\n            return true;\n        }\n\n        std::string toStdHexLower(const char *raw, int len)\n        {\n            const void* in = reinterpret_cast<const void*>(raw);\n            std::string stdstr = mongo::toHexLower(in, len);\n            return stdstr;\n        }\n\n        const char *fromHex(const std::string &s, int *outBytes)\n        {\n            const int size = s.size();\n            if (size % 2 != 0)\n                return NULL;\n\n            const int bytes = size / 2; // number of bytes\n            char *data = new char[bytes];\n\n            const char *p = s.c_str();\n            for (size_t i = 0; i < bytes; i++) {\n                data[i] = mongo::fromHex(p).getValue();\n                p += 2;\n            }\n\n            *outBytes = bytes;\n            return data;\n        }\n\n        std::string hexToUuid(const std::string &hex, UUIDEncoding encoding)\n        {\n            switch(encoding) {\n            case DefaultEncoding: return hexToUuid(hex);\n            case JavaLegacy:      return hexToJavaUuid(hex);\n            case CSharpLegacy:    return hexToCSharpUuid(hex);\n            case PythonLegacy:    return hexToPythonUuid(hex);\n            default:              return hexToUuid(hex);\n            }\n        }\n\n        std::string hexToUuid(const std::string &hex)\n        {\n            std::string uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);\n            return uuid;\n        }\n\n        std::string hexToCSharpUuid(const std::string &hex)\n        {\n            std::string a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2);\n            std::string b = hex.substr(10, 2) + hex.substr(8, 2);\n            std::string c = hex.substr(14, 2) + hex.substr(12, 2);\n            std::string d = hex.substr(16, 16);\n            std::string temp = a + b + c + d;\n            std::string uuid = temp.substr(0, 8) + '-' + temp.substr(8, 4) + '-' + temp.substr(12, 4) + '-' + temp.substr(16, 4) + '-' + temp.substr(20, 12);\n            return uuid;\n        }\n\n        std::string hexToJavaUuid(const std::string &hex)\n        {\n            std::string msb = hex.substr(0, 16);\n            std::string lsb = hex.substr(16, 16);\n            msb = msb.substr(14, 2) + msb.substr(12, 2) + msb.substr(10, 2) + msb.substr(8, 2) + msb.substr(6, 2) + msb.substr(4, 2) + msb.substr(2, 2) + msb.substr(0, 2);\n            lsb = lsb.substr(14, 2) + lsb.substr(12, 2) + lsb.substr(10, 2) + lsb.substr(8, 2) + lsb.substr(6, 2) + lsb.substr(4, 2) + lsb.substr(2, 2) + lsb.substr(0, 2);\n            std::string temp = msb + lsb;\n            std::string uuid = temp.substr(0, 8) + '-' + temp.substr(8, 4) + '-' + temp.substr(12, 4) + '-' + temp.substr(16, 4) + '-' + temp.substr(20, 12);\n            return uuid;\n        }\n\n        std::string hexToPythonUuid(const std::string &hex)\n        {\n            return hexToUuid(hex);\n        }\n\n        std::string uuidToHex(const std::string &uuid, Robomongo::UUIDEncoding encoding)\n        {\n            switch(encoding) {\n            case DefaultEncoding: return uuidToHex(uuid);\n            case JavaLegacy:      return javaUuidToHex(uuid);\n            case CSharpLegacy:    return csharpUuidToHex(uuid);\n            case PythonLegacy:    return pythonUuidToHex(uuid);\n            default:              return uuidToHex(uuid);\n            }\n        }\n\n        std::string uuidToHex(const std::string &uuid)\n        {\n            // remove extra characters\n            std::string hex = uuid;\n            pcrecpp::RE re(\"[{}-]\");\n            re.GlobalReplace(\"\", &hex);\n\n            if (hex.size() != 32)\n                return \"\";\n\n            return hex;\n        }\n\n        std::string csharpUuidToHex(const std::string &uuid)\n        {\n            // remove extra characters\n            std::string hex = uuid;\n            pcrecpp::RE re(\"[{}-]\");\n            re.GlobalReplace(\"\", &hex);\n\n            if (hex.size() != 32)\n                return \"\";\n\n            std::string a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2);\n            std::string b = hex.substr(10, 2) + hex.substr(8, 2);\n            std::string c = hex.substr(14, 2) + hex.substr(12, 2);\n            std::string d = hex.substr(16, 16);\n            std::string result = a + b + c + d;\n            return result;\n        }\n\n        std::string javaUuidToHex(const std::string &uuid)\n        {\n            // remove extra characters\n            std::string hex = uuid;\n            pcrecpp::RE re(\"[{}-]\");\n            re.GlobalReplace(\"\", &hex);\n\n            if (hex.size() != 32)\n                return \"\";\n\n            std::string msb = hex.substr(0, 16);\n            std::string lsb = hex.substr(16, 16);\n            msb = msb.substr(14, 2) + msb.substr(12, 2) + msb.substr(10, 2) + msb.substr(8, 2) + msb.substr(6, 2) + msb.substr(4, 2) + msb.substr(2, 2) + msb.substr(0, 2);\n            lsb = lsb.substr(14, 2) + lsb.substr(12, 2) + lsb.substr(10, 2) + lsb.substr(8, 2) + lsb.substr(6, 2) + lsb.substr(4, 2) + lsb.substr(2, 2) + lsb.substr(0, 2);\n            std::string result = msb + lsb;\n            return result;\n        }\n\n        std::string pythonUuidToHex(const std::string &uuid)\n        {\n            return uuidToHex(uuid);\n        }\n\n        std::string formatUuid(const mongo::BSONElement &element, Robomongo::UUIDEncoding encoding)\n        {\n            mongo::BinDataType binType = element.binDataType();\n\n            if (binType != mongo::newUUID && binType != mongo::bdtUUID)\n                throw std::invalid_argument(\"Binary subtype should be 3 (bdtUUID) or 4 (newUUID)\");\n\n            int len;\n            const char *data = element.binData(len);\n            std::string hex = HexUtils::toStdHexLower(data, len);\n\n            if (binType == mongo::bdtUUID) {\n                std::string uuid = HexUtils::hexToUuid(hex, encoding);\n\n                switch(encoding) {\n                case DefaultEncoding: return \"LUUID(\\\"\" + uuid + \"\\\")\";\n                case JavaLegacy:      return \"JUUID(\\\"\" + uuid + \"\\\")\";\n                case CSharpLegacy:    return \"NUUID(\\\"\" + uuid + \"\\\")\";\n                case PythonLegacy:    return \"PYUUID(\\\"\" + uuid + \"\\\")\";\n                default:              return \"LUUID(\\\"\" + uuid + \"\\\")\";\n                }\n            } else {\n                std::string uuid = HexUtils::hexToUuid(hex, DefaultEncoding);\n                return \"UUID(\\\"\" + uuid + \"\\\")\";\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/HexUtils.h",
    "content": "#pragma once\n#include \"robomongo/core/Enums.h\"\n#include <mongo/bson/bsonelement.h>\n\nnamespace Robomongo\n{\n\n    /**\n     * @brief HexUtils\n     *\n     *  Usage:\n     *\n     *  std::string csuuid = HexUtils::hexToCSharpUuid(hex.toStdString());\n     *  std::string cshex  = HexUtils::csharpUuidToHex(csuuid);\n     *\n     *  std::string juuid = HexUtils::hexToJavaUuid(hex.toStdString());\n     *  std::string jhex  = HexUtils::javaUuidToHex(juuid);\n     *\n     *  std::string puuid = HexUtils::hexToPythonUuid(hex.toStdString());\n     *  std::string phex  = HexUtils::pythonUuidToHex(puuid);*\n     *\n     */\n    namespace HexUtils\n    {\n        bool isHexString(const std::string &hex);\n        std::string toStdHexLower(const char *raw, int len);\n        /**\n         * @param str: data in hex format.\n         * @param outBytes: out param - number of bytes in array.\n         * @return array of bytes, with \"outBytes\" length.\n         */\n        const char *fromHex(const std::string &str, int *outBytes);\n        std::string hexToUuid(const std::string &hex, UUIDEncoding encoding);\n        std::string hexToUuid(const std::string &hex);\n        std::string hexToCSharpUuid(const std::string &hex);\n        std::string hexToJavaUuid(const std::string &hex);\n        std::string hexToPythonUuid(const std::string &hex);\n        /**\n         * @return empty string, if invalid UUID.\n         */\n        std::string uuidToHex(const std::string &uuid, UUIDEncoding encoding);\n        std::string uuidToHex(const std::string &uuid);\n        std::string csharpUuidToHex(const std::string &uuid);\n        std::string javaUuidToHex(const std::string &uuid);\n        std::string pythonUuidToHex(const std::string &uuid);\n        std::string formatUuid(const mongo::BSONElement &element, UUIDEncoding encoding);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/HexUtils_test.cpp",
    "content": "#include \"gtest/gtest.h\"\n#include \"HexUtils.h\"\n\n#include <string>\n\n/* Example Test:\n*\n* TEST( [Test_Case_Name], [Test_Name] )\n* TEST( [Test_Case_Name], [UnitOfWorkName_ScenarioUnderTest_ExpectedBehavior] )\n* TEST( StringParserTests, NumberLeftOf_StringWithoutNumber_ReturnsFalse) {\n// ...\n}\n*/\n\nTEST(hex_utils_tests, test_1)\n{\n    EXPECT_TRUE(Robomongo::HexUtils::isHexString(\"a\"));\n}\n\n"
  },
  {
    "path": "src/robomongo/core/KeyboardManager.cpp",
    "content": "#include \"robomongo/core/KeyboardManager.h\"\n\nnamespace Robomongo\n{\n    bool KeyboardManager::isNewTabShortcut(QKeyEvent *keyEvent)\n    {\n        bool ctrlShiftReturn = (keyEvent->modifiers() & Qt::ControlModifier) &&\n            (keyEvent->modifiers() & Qt::ShiftModifier) &&\n            (keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter);\n\n        // TODO: compare with QKeySequence::AddTab rather than Ctrl+T\n        bool ctrlT = (keyEvent->modifiers() & Qt::ControlModifier) && !(keyEvent->modifiers() & Qt::ShiftModifier) && (keyEvent->key() == Qt::Key_T);\n\n        return ctrlShiftReturn || ctrlT;\n    }\n\n    bool KeyboardManager::isDuplicateTabShortcut(QKeyEvent *keyEvent)\n    {\n        bool ctrlShiftT = (keyEvent->modifiers() & Qt::ControlModifier) &&\n            (keyEvent->modifiers() & Qt::ShiftModifier) &&\n            (keyEvent->key() == Qt::Key_T);\n\n        return ctrlShiftT;\n    }\n\n    bool KeyboardManager::isSetFocusOnQueryLineShortcut(QKeyEvent *keyEvent)\n    {\n        return keyEvent->key() == Qt::Key_F6;\n    }\n\n    bool KeyboardManager::isExecuteScriptShortcut(QKeyEvent *keyEvent)\n    {\n        return (keyEvent->modifiers() & Qt::ControlModifier)\n            &&\n            (keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter);\n    }\n\n    bool KeyboardManager::isAutoCompleteShortcut(QKeyEvent *keyEvent)\n    {\n        return (keyEvent->modifiers() & Qt::ControlModifier)\n            &&\n            (keyEvent->key() == Qt::Key_Space);\n    }\n\n    bool KeyboardManager::isHideAutoCompleteShortcut(QKeyEvent *keyEvent)\n    {\n        return (keyEvent->key() == Qt::Key_Escape);\n    }\n\n    bool KeyboardManager::isNextTabShortcut(QKeyEvent *keyEvent)\n    {\n        return (keyEvent->modifiers() & Qt::ControlModifier)\n            && (keyEvent->modifiers() & Qt::AltModifier)\n            && (keyEvent->key() == Qt::Key_Right);\n    }\n\n    bool KeyboardManager::isPreviousTabShortcut(QKeyEvent *keyEvent)\n    {\n        return (keyEvent->modifiers() & Qt::ControlModifier)\n            && (keyEvent->modifiers() & Qt::AltModifier)\n            && (keyEvent->key() == Qt::Key_Left);\n    }\n    \n    bool KeyboardManager::isToggleCommentsShortcut(QKeyEvent *keyEvent)\n    {\n        return ((keyEvent->modifiers() & Qt::ControlModifier)\n               && (keyEvent->key() == Qt::Key_Slash))\n            ||\n               ((keyEvent->modifiers() & Qt::ControlModifier)\n               && (keyEvent->modifiers() & Qt::ShiftModifier)\n               && (keyEvent->key() == Qt::Key_C));\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/KeyboardManager.h",
    "content": "#pragma once\n\n#include <QKeyEvent>\n\nnamespace Robomongo\n{\n    namespace KeyboardManager\n    {\n        bool isNewTabShortcut(QKeyEvent *keyEvent);\n        bool isDuplicateTabShortcut(QKeyEvent *keyEvent);\n        bool isSetFocusOnQueryLineShortcut(QKeyEvent *keyEvent);\n        bool isExecuteScriptShortcut(QKeyEvent *keyEvent);\n        bool isAutoCompleteShortcut(QKeyEvent *keyEvent);\n        bool isHideAutoCompleteShortcut(QKeyEvent *keyEvent);\n        bool isNextTabShortcut(QKeyEvent *keyEvent);\n        bool isPreviousTabShortcut(QKeyEvent *keyEvent);\n        bool isToggleCommentsShortcut(QKeyEvent *keyEvent);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/App.cpp",
    "content": "#include \"robomongo/core/domain/App.h\"\n\n#include <QHash>\n#include <QInputDialog>\n#include <QMessageBox>\n\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/domain/MongoShell.h\"\n#include \"robomongo/core/domain/MongoCollection.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/settings/ReplicaSetSettings.h\"\n#include \"robomongo/core/settings/SshSettings.h\"\n#include \"robomongo/core/settings/SslSettings.h\"\n#include \"robomongo/core/mongodb/SshTunnelWorker.h\"\n#include \"robomongo/core/EventBus.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/utils/StdUtils.h\"\n#include \"robomongo/core/utils/Logger.h\"\n\nnamespace Robomongo\n{\n    namespace detail\n    {\n        QString buildCollectionQuery(const std::string &collectionName, const QString &postfix)\n        {\n            QString qCollectionName = QtUtils::toQString(collectionName);\n\n            QString pattern;\n\n            // Use db.getCollection() to avoid having to enumerate and special case \"reserved\" names\n            pattern = \"db.getCollection(\\'%1\\').%2\";\n\n            // Escape '\\' symbol\n            qCollectionName.replace(QChar('\\\\'), \"\\\\\\\\\");\n\n            return pattern.arg(qCollectionName).arg(postfix);\n        }\n    }\n\n    App::~App()\n    {}\n\n    App::App(EventBus *const bus) : QObject(),\n        _bus(bus), _lastServerHandle(0) {\n        _bus->subscribe(this, EstablishSshConnectionResponse::Type);\n        _bus->subscribe(this, ListenSshConnectionResponse::Type);\n        _bus->subscribe(this, LogEvent::Type);\n    }\n\n    std::unique_ptr<MongoServer>\n    App::continueOpenServer(int serverHandle, ConnectionSettings* connSettings, \n                            ConnectionType type, int localport)\n    {\n        ConnectionSettings* connSettingsClone = connSettings->clone();\n\n        // Modify connection settings when SSH tunnel is used\n        if ((type == ConnectionPrimary || type == ConnectionTest)\n            && !connSettingsClone->isReplicaSet()\n            && connSettingsClone->sshSettings()->enabled()\n        ) {\n            connSettingsClone->setServerHost(\"127.0.0.1\");\n            connSettingsClone->setServerPort(localport);\n        }\n\n        auto server { std::make_unique<MongoServer>(serverHandle, connSettingsClone, type) };\n        server->runWorkerThread();\n\n        auto replicaSetStr = QString::fromStdString(connSettings->connectionName()) + \" [Replica Set]\";\n        replicaSetStr = (connSettings->replicaSetSettings()->members().size() > 0)\n            ? replicaSetStr + QString::fromStdString(connSettings->replicaSetSettings()->members()[0])\n            : replicaSetStr + \"\";\n\n        QString serverAddress = connSettings->isReplicaSet()\n            ? replicaSetStr\n            : QString::fromStdString(connSettings->getFullAddress());\n\n        LOG_MSG(QString(\"Connecting to %1...\").arg(serverAddress), mongo::logger::LogSeverity::Info());\n        server->tryConnect();\n        return server;\n    }\n\n    /**\n    * Creates and opens new server connection.\n    * @param connection: ConnectionSettings, that will be owned by MongoServer.\n    * @param visible: should this server be visible in UI (explorer) or not.\n    */\n    std::unique_ptr<MongoServer> \n    App::openServerInternal(ConnectionSettings* connSettings, ConnectionType type) \n    {\n        ++_lastServerHandle;\n\n        if (type == ConnectionPrimary)\n            _bus->publish(new ConnectingEvent(this));\n\n        // When connection is SECONDARY or SSH not enabled or replica set,\n        // then continue without SSH Tunnel\n        if (type == ConnectionSecondary || !connSettings->sshSettings()->enabled() \n            || connSettings->isReplicaSet() \n        ) {\n            return continueOpenServer(_lastServerHandle, connSettings, type);\n        }\n\n        // Open SSH channel and only after that open connection\n        LOG_MSG(QString(\"Creating SSH tunnel to %1:%2...\")\n            .arg(QtUtils::toQString(connSettings->sshSettings()->host()))\n            .arg(connSettings->sshSettings()->port()), mongo::logger::LogSeverity::Info());\n\n        ConnectionSettings* settingsCopy = connSettings->clone();\n        SshTunnelWorker* sshWorker = new SshTunnelWorker(settingsCopy);\n        _bus->send(sshWorker, new EstablishSshConnectionRequest(this, _lastServerHandle, sshWorker, settingsCopy, type));\n        return nullptr;\n    }\n\n    bool App::openServer(ConnectionSettings *connection, ConnectionType type) \n    {\n        SshSettings *ssh = connection->sshSettings();\n\n        if (!connection->isReplicaSet() && ssh->enabled() && ssh->askPassword() &&\n            (type == ConnectionPrimary || type == ConnectionTest)) {\n            bool ok = false;\n\n            bool isByKey = ssh->authMethod() == \"publickey\";\n            std::string passText = isByKey ? \"passphrase\" : \"password\";\n\n            std::stringstream s;\n            s << \"In order to continue, please provide the \" << passText;\n\n            if (isByKey)\n                s << \" for the key file\";\n\n            s << \".\" << std::endl << std::endl;\n\n            if (ssh->authMethod() == \"publickey\")\n                s << \"Private Key:  \" << ssh->privateKeyFile() << std::endl;\n\n            s << \"Server: \" << ssh->host() << std::endl;\n            s << \"User: \" << ssh->userName() << std::endl;\n\n\n            s << std::endl << \"Enter your \" << passText << \" that will never be stored:\";\n\n            QString userInput = QInputDialog::getText(NULL, tr(\"SSH Authentication\"),\n                QtUtils::toQString(s.str()),\n                QLineEdit::Password, \"\", &ok);\n\n            if (!ok)\n                return false;\n\n            ssh->setAskedPassword(QtUtils::toStdString(userInput));\n        }\n\n        SslSettings *sslSettings = connection->sslSettings();\n\n        if (sslSettings->sslEnabled() && sslSettings->usePemFile() && sslSettings->askPassphrase() \n            && (type == ConnectionPrimary || type == ConnectionTest)) \n        {\n            if (!askSslPassphrasePromptDialog(connection))\n            {\n                return false;\n            }\n        }\n\n        _servers.push_back(move(openServerInternal(connection, type)));\n        return true;\n    }\n\n    /**\n     * @brief Closes MongoServer connection and frees all resources, owned\n     * by MongoServer. Finally, specified MongoServer will also be deleted.\n     */\n    void App::closeServer(MongoServer *server)\n    {\n        _servers.erase(std::remove_if(_servers.begin(), _servers.end(), \n            [&](auto const& el) { return el.get() == server; }), _servers.end());\n    }\n\n    void App::openShell(MongoCollection *collection, const QString &filePathToSave)\n    {\n        ConnectionSettings *connection = collection->database()->server()->connectionRecord();\n        auto const& dbname = collection->database()->name();\n        connection->setDefaultDatabase(dbname);\n        QString const& script = detail::buildCollectionQuery(collection->name(), \"find({})\");\n        openShell(collection->database()->server(), connection, \n            ScriptInfo(script, true, dbname, CursorPosition(0, -2), QtUtils::toQString(dbname), filePathToSave)\n        );\n    }\n\n    void App::openShell(MongoServer *server, const QString &script, const std::string &dbName,\n                        bool execute, const QString &shellName,\n                        const CursorPosition &cursorPosition, const QString &filePathToSave)\n    {\n        ConnectionSettings *connection = server->connectionRecord();\n\n        if (!dbName.empty())\n            connection->setDefaultDatabase(dbName);\n\n        openShell(server, connection, \n            ScriptInfo(script, execute, dbName, cursorPosition, shellName, filePathToSave)\n        );\n    }\n\n    void App::openShell(MongoDatabase *database, const QString &script,\n                               bool execute, const QString &shellName,\n                               const CursorPosition &cursorPosition, const QString &filePathToSave)\n    {\n        ConnectionSettings *connection = database->server()->connectionRecord();\n        connection->setDefaultDatabase(database->name());\n        openShell(database->server(), connection, ScriptInfo(script, execute, database->name(), \n                                                             cursorPosition, shellName, filePathToSave));\n    }\n\n    void App::openShell(MongoServer* server, ConnectionSettings* connection, const ScriptInfo &scriptInfo)\n    {\n        auto serverClone{ openServerInternal(connection, ConnectionSecondary) };\n        if (!serverClone || !server)\n            return;\n\n        auto shell{ std::make_unique<MongoShell>(serverClone.get(), scriptInfo) };\n        _servers.push_back(move(serverClone));\n        // Connection between explorer's server and tab's MongoShells\n        _bus->subscribe(server, ReplicaSetRefreshed::Type, shell.get()); \n        _bus->publish(new OpeningShellEvent(this, shell.get()));\n        shell->execute();\n        _shells.push_back(move(shell));\n        return;\n    }\n\n    /**\n     * @brief Closes MongoShell and frees all resources, owned by specified MongoShell.\n     * Finally, specified MongoShell will also be deleted.\n     */\n    void App::closeShell(MongoShell *shell)\n    {\n        auto const itr = std::find_if(_shells.begin(), _shells.end(), \n            [&](auto const& el) { return el.get() == shell; }\n        );\n        \n        // Do nothing, if this shell not owned by this App.\n        if (itr == _shells.end())\n            return;\n\n        closeServer(shell->server());\n        _shells.erase(itr);\n    }\n\n    void App::handle(EstablishSshConnectionResponse *event) {\n        if (event->isError()) {\n            _bus->publish(new ConnectionFailedEvent(\n                this, event->serverHandle, event->connectionType, event->error().errorMessage(),\n                ConnectionFailedEvent::SshConnection));\n            return;\n        }\n\n        LOG_MSG(QString(\"SSH tunnel created successfully\"), mongo::logger::LogSeverity::Info());\n\n        _servers.push_back(move(\n            continueOpenServer(event->serverHandle, event->settings, event->connectionType, event->localport)\n        ));\n        _bus->send(event->worker, new ListenSshConnectionRequest(this, event->serverHandle, event->connectionType));\n    }\n\n    void App::handle(LogEvent *event) {\n        LOG_MSG(event->message, event->mongoLogSeverity());\n\n        if (!event->informUser)\n            return;\n\n        QMessageBox(\n            event->qMessageBoxIcon(),\n            QString::fromStdString(event->severity()),\n            QtUtils::toQString(event->severity() + \": \" + event->message)\n        ).exec();\n    }\n\n    void App::handle(ListenSshConnectionResponse *event) {\n        if (event->isError()) {\n            _bus->publish(\n                new ConnectionFailedEvent(this, event->serverHandle, event->connectionType, \n                    event->error().errorMessage(), ConnectionFailedEvent::SshChannel)\n            );\n            return;\n        }\n\n        LOG_MSG(QString(\"SSH tunnel closed.\"), mongo::logger::LogSeverity::Error());\n    }\n\n    void App::fireConnectionFailedEvent(int serverHandle, ConnectionType type, std::string errormsg,\n                                        ConnectionFailedEvent::Reason reason) {\n        _bus->publish(new ConnectionFailedEvent(this, serverHandle, type, errormsg, reason));\n    }\n\n    bool App::askSslPassphrasePromptDialog(ConnectionSettings *connSettings) const\n    {\n        auto sslSettings = connSettings->sslSettings();\n        bool ok = false;\n\n        std::stringstream s;\n        s << \"In order to continue, please provide the passphrase\";\n        s << \".\" << std::endl << std::endl;\n\n        s << \"Server: \" << connSettings->serverHost() << \":\" << connSettings->serverPort() << std::endl;\n        s << \"PEM file: \" << sslSettings->pemKeyFile() << std::endl;\n\n        s << std::endl << \"Enter your PEM key passphrase (will never be stored):\";\n\n        QString userInput = QInputDialog::getText(NULL, tr(\"TLS Authentication\"),\n            QtUtils::toQString(s.str()),\n            QLineEdit::Password, \"\", &ok);\n\n        if (!ok)\n        {\n            return false;\n        }\n\n        sslSettings->setPemPassPhrase(QtUtils::toStdString(userInput));\n        return ok;\n    }\n\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/App.h",
    "content": "#pragma once\n#include <QObject>\n#include <vector>\n#include <robomongo/core/events/MongoEvents.h>\n\n#include \"robomongo/core/domain/ScriptInfo.h\"\n\nnamespace Robomongo\n{\n    class EventBus;\n    class MongoServer;\n    class ConnectionSettings;\n    class MongoCollection;\n    class MongoShell;\n    class MongoDatabase;\n    class EstablishSshConnectionResponse;\n    class LogEvent;\n\n    namespace detail\n    {\n        /**\n         * @brief Builds single collection query (i.e. db.my_col.find()) from\n         *  string that doesn't contain \"db.my_col.\" prefix.\n         *\n         *  If you'll call buildCollectionQuery(\"test\", \"find()\") you'll receive:\n         *  db.test.find()\n         *\n         *  If you'll call buildCollectionQuery(\"1234\", \"find()\") you'll receive:\n         *  db['1234'].find()\n         *\n         * @param script: query part (without \"db.my_col.\" prefix\"\n         */\n        QString buildCollectionQuery(const std::string &collectionName, const QString &postfix);\n    }\n\n    class App : public QObject\n    {\n        Q_OBJECT\n\n    public:\n        App(EventBus *const bus);\n        ~App();\n\n        /**\n         * @brief Creates and opens new server connection.\n         * @param connection: ConnectionSettings, that will be owned by MongoServer.\n         * @param visible: should this server be visible in UI (explorer) or not.\n         * @return Succeeded or not\n         */\n        bool openServer(ConnectionSettings *connection, ConnectionType type);\n\n        /**\n         * @brief Closes MongoServer connection and frees all resources, owned\n         * by specified MongoServer. Finally, specified MongoServer will also be deleted.\n         */\n        void closeServer(MongoServer *server);\n\n        /**\n         * @brief Open new shell based on specified collection\n         */\n        void openShell(MongoCollection *collection, const QString &filePathToSave = QString());\n\n        void openShell(MongoServer *server, const QString &script, const std::string &dbName = std::string(),\n                       bool execute = true, const QString &shellName = QString(),\n                       const CursorPosition &cursorPosition = CursorPosition(), const QString &file = QString());\n\n        void openShell(MongoDatabase *database, const QString &script,\n                       bool execute = true, const QString &shellName = QString(),\n                       const CursorPosition &cursorPosition = CursorPosition(), \n                       const QString &filePathToSave = QString());\n\n        /**\n        * @brief Open new shell using explorer's MongoServer (ExplorerServerTreeItem's _server)\n        */\n        void openShell(MongoServer* server, ConnectionSettings* connSettings, const ScriptInfo &scriptInfo);\n\n        auto const& getServers() const { return _servers; };\n\n        /**\n         * @brief Closes MongoShell and frees all resources, owned by specified MongoShell.\n         * Finally, specified MongoShell will also be deleted.\n         */\n        void closeShell(MongoShell *shell);\n\n        void fireConnectionFailedEvent(int serverHandle, ConnectionType type, std::string errormsg, \n            ConnectionFailedEvent::Reason reason);\n\n        int getLastServerHandle() const { return _lastServerHandle; };\n\n    public Q_SLOTS:\n        void handle(EstablishSshConnectionResponse *event);\n        void handle(ListenSshConnectionResponse *event);\n        void handle(LogEvent *event);\n\n    private:\n        std::unique_ptr<MongoServer> openServerInternal(ConnectionSettings* connSettings, ConnectionType type);\n        \n        std::unique_ptr<MongoServer> \n        continueOpenServer(int serverHandle, ConnectionSettings* connSettings, ConnectionType type, int localport = 0);\n\n        /**\n        * @brief Create prompt dialog to enter SSL PEM key passphrase and save passphrase into SSL settings\n        * @param connection Pointer to active connection settings\n        * @return true on success, false otherwise\n        */\n        bool askSslPassphrasePromptDialog(ConnectionSettings *connSettings) const;\n\n        /**\n         * MongoServers, owned by this App.\n         */\n        std::vector<std::unique_ptr<MongoServer>> _servers;\n\n        /**\n         * MongoShells, owned by this App.\n         */\n        std::vector<std::unique_ptr<MongoShell>> _shells;\n\n        EventBus *const _bus;\n\n        // Increase monotonically when new MongoServer is created\n        // Never decreases.\n        int _lastServerHandle;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/CursorPosition.cpp",
    "content": "#include \"robomongo/core/domain/CursorPosition.h\"\n\nnamespace Robomongo\n{\n    CursorPosition::CursorPosition() :\n        _isNull(true),\n        _line(-1),\n        _column(-1) {}\n\n    CursorPosition::CursorPosition(int line, int column) :\n        _isNull(false),\n        _line(line),\n        _column(column) {}\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/CursorPosition.h",
    "content": "#pragma once\n\nnamespace Robomongo\n{\n    class CursorPosition\n    {\n    public:\n        CursorPosition();\n        CursorPosition(int line, int column);\n\n        bool isNull() const { return _isNull; }\n        int line() const { return _line; }\n        int column() const { return _column; }\n\n    private:\n        const bool _isNull;\n        const int _line;\n        const int _column;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoAggregateInfo.h",
    "content": "#pragma once\n\nnamespace Robomongo\n{\n    struct AggrInfo\n    {\n        AggrInfo() {}\n\n        AggrInfo(const std::string& collectionName, int skip, int batchSize, \n                 mongo::BSONObj const& pipeline, mongo::BSONObj const& options, int resultIndex) :\n            collectionName(collectionName), skip(skip), batchSize(batchSize), pipeline(pipeline), \n            options(options), isValid(true), resultIndex(resultIndex)\n        {}\n\n        std::string collectionName = \"\";\n        int skip = 0;\n        int batchSize = 0;   \n        mongo::BSONObj pipeline;\n        mongo::BSONObj options;\n        bool isValid = false;\n        int resultIndex = -1;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoCollection.cpp",
    "content": "#include \"robomongo/core/domain/MongoCollection.h\"\n#include \"robomongo/core/domain/MongoUtils.h\"\n\nnamespace Robomongo\n{\n    MongoCollection::MongoCollection(MongoDatabase *database, const MongoCollectionInfo &info) :\n        _ns(info.ns()),\n        _database(database),\n        _info(info),\n        _system(false)\n    {\n        // System databases starts from system.*\n        std::string collectionName = _ns.collectionName();\n        std::string prefix = \"system.\";\n\n        // Checking whether `collectionName` starts from `system`\n        if (collectionName.compare(0, prefix.length(), prefix) == 0)\n            _system = true;\n    }\n\n/*    std::string MongoCollection::sizeString() const\n    {\n        return MongoUtils::buildNiceSizeString(_info.sizeBytes()).toStdString();\n    }\n\n    QString MongoCollection::storageSizeString() const\n    {\n        return MongoUtils::buildNiceSizeString(_info.storageSizeBytes());\n    }*/\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoCollection.h",
    "content": "#pragma once\n\n#include \"robomongo/core/domain/MongoDatabase.h\"\n#include \"robomongo/core/domain/MongoCollectionInfo.h\"\n\nnamespace Robomongo\n{\n    class MongoCollection\n    {\n    public:\n        MongoCollection(MongoDatabase *database, const MongoCollectionInfo &info);\n\n        bool isSystem() const { return _system; }\n\n        std::string name() const { return _ns.collectionName(); }\n        const MongoCollectionInfo info() const { return _info; }\n        std::string fullName() const { return _ns.toString(); }\n        MongoDatabase *database() const { return _database; }\n\n//        std::string sizeString() const;\n//        QString storageSizeString() const;\n\n    private:\n\n        MongoDatabase *_database;\n        bool _system;\n        MongoCollectionInfo _info;\n        MongoNamespace _ns;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoCollectionInfo.cpp",
    "content": "#include \"MongoCollectionInfo.h\"\n#include \"robomongo/core/utils/BsonUtils.h\"\n#include <mongo/client/dbclient_base.h>\n\nnamespace Robomongo\n{\n    MongoCollectionInfo::MongoCollectionInfo(const std::string &ns) : _ns(ns) {}\n\n/*    MongoCollectionInfo::MongoCollectionInfo(mongo::BSONObj stats) : _ns(stats.getStringField(\"ns\"))\n    {\n        // if \"size\" and \"storageSize\" are of type Int32 or Int64, they\n        // will be converted to double by \"numberDouble()\" function.\n        _sizeBytes = BsonUtils::getField<mongo::NumberDouble>(stats,\"size\");\n        _storageSizeBytes = BsonUtils::getField<mongo::NumberDouble>(stats,\"storageSize\");\n\n        // NumberLong because of mongodb can have very big collections\n        _count = BsonUtils::getField<mongo::NumberLong>(stats,\"count\");\n    }*/\n}\n\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoCollectionInfo.h",
    "content": "#pragma once\n#include <mongo/bson/bsonobj.h>\n#include \"robomongo/core/domain/MongoNamespace.h\"\n\nnamespace Robomongo\n{\n    class MongoCollectionInfo\n    {\n    public:\n        MongoCollectionInfo() {}\n        MongoCollectionInfo(const std::string &ns);\n//        MongoCollectionInfo(mongo::BSONObj stats);\n\n        std::string name() const { return _ns.collectionName(); }\n        std::string fullName() const { return _ns.toString(); }\n        MongoNamespace ns() const { return _ns; }\n\n        /**\n         * @brief Size in bytes\n         * It is double, because db.stats()'s \"size\" field may be double\n         * for large values, while Int32 for small.\n         */\n//        double sizeBytes() const { return _sizeBytes; }\n\n        /**\n         * @brief Storage size in bytes\n         * It is double, because db.stats()'s \"storageSize\" field may be double\n         * for large values, while Int32 for small.\n         */\n//        double storageSizeBytes() const { return _storageSizeBytes; }\n\n//        long long count() const { return _count; }\n\n    private:\n        MongoNamespace _ns;\n\n        /**\n         * @brief Size in bytes\n         * It is double, because db.stats()'s \"size\" field may be double\n         * for large values, while Int32 for small.\n         */\n        double _sizeBytes;\n\n        /**\n         * @brief Storage size in bytes\n         * It is double, because db.stats()'s \"storageSize\" field may be double\n         * for large values, while Int32 for small.\n         */\n        double _storageSizeBytes;\n\n        long long _count;\n    };\n}\n\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoDatabase.cpp",
    "content": "#include \"robomongo/core/domain/MongoDatabase.h\"\n\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/domain/MongoCollection.h\"\n#include \"robomongo/core/mongodb/MongoWorker.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/EventBus.h\"\n#include \"robomongo/core/utils/Logger.h\"\n#include \"robomongo/utils/common.h\"\n\nnamespace Robomongo\n{\n    R_REGISTER_EVENT(MongoDatabaseCollectionListLoadedEvent)\n    R_REGISTER_EVENT(MongoDatabaseUsersLoadedEvent)\n    R_REGISTER_EVENT(MongoDatabaseFunctionsLoadedEvent)\n    R_REGISTER_EVENT(MongoDatabaseUsersLoadingEvent)\n    R_REGISTER_EVENT(MongoDatabaseFunctionsLoadingEvent)\n    R_REGISTER_EVENT(MongoDatabaseCollectionsLoadingEvent)\n\n    const std::string MongoDatabase::StorageEngineType::WIRED_TIGER = \"wiredTiger\";\n    const std::string MongoDatabase::StorageEngineType::MMAPV1      = \"mmapv1\";\n \n    const float MongoDatabase::DBVersion::MONGODB_2_6 = 2.6f;\n    const float MongoDatabase::DBVersion::MONGODB_3_0 = 3.0f;\n    const float MongoDatabase::DBVersion::MONGODB_3_2 = 3.2f;\n\n    MongoDatabase::MongoDatabase(MongoServer *server, const std::string &name) :\n        QObject(),\n        _system(name == \"admin\" || name == \"local\"),\n        _server(server),\n        _bus(AppRegistry::instance().bus()),\n        _name(name) {}\n\n    MongoDatabase::~MongoDatabase()\n    {\n        clearCollections();\n    }\n\n    void MongoDatabase::loadCollections()\n    {\n        _bus->publish(new MongoDatabaseCollectionsLoadingEvent(this));\n        _bus->send(_server->worker(), new LoadCollectionNamesRequest(this, _name));\n    }\n\n    void MongoDatabase::loadUsers()\n    {\n        _bus->publish(new MongoDatabaseUsersLoadingEvent(this));\n        _bus->send(_server->worker(), new LoadUsersRequest(this, _name));\n    }\n\n    void MongoDatabase::loadFunctions()\n    {\n        _bus->publish(new MongoDatabaseFunctionsLoadingEvent(this));\n        _bus->send(_server->worker(), new LoadFunctionsRequest(this, _name));\n    }\n\n    void MongoDatabase::createCollection(const std::string &collection, long long size, bool capped, int maxDocNum, const mongo::BSONObj& extraOptions)\n    {\n        _bus->send(_server->worker(), \n            new CreateCollectionRequest(this, MongoNamespace(_name, collection), extraOptions, size, capped, maxDocNum));\n    }\n\n    void MongoDatabase::dropCollection(const std::string &collection)\n    {\n        _bus->send(_server->worker(), new DropCollectionRequest(this, MongoNamespace(_name, collection)));\n    }\n\n    void MongoDatabase::renameCollection(const std::string &collection, const std::string &newCollection)\n    {\n        _bus->send(_server->worker(), new RenameCollectionRequest(this, MongoNamespace(_name, collection), \n                                                                  newCollection));\n    }\n\n    void MongoDatabase::duplicateCollection(const std::string &collection, const std::string &newCollection)\n    {\n        _bus->send(_server->worker(), new DuplicateCollectionRequest(this, MongoNamespace(_name, collection), newCollection));\n    }\n\n    void MongoDatabase::copyCollection(MongoServer *server, const std::string &sourceDatabase, const std::string &collection)\n    {\n        _bus->send(_server->worker(), new CopyCollectionToDiffServerRequest(this, server->worker(), sourceDatabase, collection, _name));\n    }\n\n    void MongoDatabase::createUser(const MongoUser &user)\n    {\n        _bus->send(_server->worker(), new CreateUserRequest(this, _name, user));\n    }\n\n    void MongoDatabase::dropUser(std::string const& userName)\n    {\n        _bus->send(_server->worker(), new DropUserRequest(this, _name, userName));\n    }\n\n    void MongoDatabase::createFunction(const MongoFunction &fun)\n    {\n        _bus->send(_server->worker(), new CreateFunctionRequest(this, _name, _server->version(), fun));\n    }\n\n    void MongoDatabase::updateFunction(const std::string &name, const MongoFunction &fun)\n    {\n        _bus->send(_server->worker(), new CreateFunctionRequest(this, _name, _server->version(), fun, name));\n    }\n\n    void MongoDatabase::dropFunction(const std::string &name)\n    {\n        _bus->send(_server->worker(), new DropFunctionRequest(this, _name, _server->version(), name));\n    }\n\n    void MongoDatabase::handle(LoadCollectionNamesResponse *event)\n    {\n        if (event->isError()) {\n            _bus->publish(new MongoDatabaseCollectionListLoadedEvent(this, event->error()));            \n            genericEventErrorHandler(event, \"Failed to refresh 'Collections'.\", _bus, this);\n            return;\n        }\n\n        clearCollections();\n\n        for (auto const& collectionInfo : event->collectionInfos())\n            addCollection(new MongoCollection(this, collectionInfo));\n\n        _bus->publish(new MongoDatabaseCollectionListLoadedEvent(this, _collections));\n        LOG_MSG(\"'Collections' refreshed.\", mongo::logger::LogSeverity::Info());\n    }\n\n    void MongoDatabase::handle(CreateFunctionResponse *event)\n    {\n        if (event->isError()) {\n            handleIfReplicaSetUnreachable(event);\n            genericEventErrorHandler(event, \"Failed to create function \\'\" + event->functionName + \"\\'.\", _bus, this);\n        }\n        else {\n            loadFunctions();\n            LOG_MSG(\"Function \\'\" + event->functionName + \"\\' created.\", mongo::logger::LogSeverity::Info());\n        }\n    }\n\n    void MongoDatabase::handle(CreateUserResponse *event)\n    {\n        if (event->isError()) {\n            handleIfReplicaSetUnreachable(event);\n            genericEventErrorHandler(event, \"Failed to create user \\'\" + event->userName + \"\\'.\", _bus, this);\n        }\n        else {\n            loadUsers();\n            LOG_MSG(\"User \\'\" + event->userName + \"\\' created.\", mongo::logger::LogSeverity::Info());\n        }\n    }\n\n    void MongoDatabase::handle(LoadUsersResponse *event)\n    {\n        if (event->isError()) {\n            _bus->publish(new MongoDatabaseUsersLoadedEvent(this, event->error()));\n\n            if (_server->connectionRecord()->isReplicaSet()) // replica set\n                handleIfReplicaSetUnreachable(event);           \n\n            genericEventErrorHandler(event, \"Failed to refresh 'Users'.\", _bus, this);\n            return;\n        }\n\n        _bus->publish(new MongoDatabaseUsersLoadedEvent(this, this, event->users()));\n        LOG_MSG(\"'Users' refreshed.\", mongo::logger::LogSeverity::Info());\n    }\n\n    void MongoDatabase::handle(LoadFunctionsResponse *event)\n    {\n        if (event->isError()) {\n            _bus->publish(new MongoDatabaseFunctionsLoadedEvent(this, event->error()));\n\n            if (_server->connectionRecord()->isReplicaSet()) // replica set\n                handleIfReplicaSetUnreachable(event);           \n\n            genericEventErrorHandler(event, \"Failed to refresh 'Functions'.\", _bus, this);\n            return;\n        }\n\n        _bus->publish(new MongoDatabaseFunctionsLoadedEvent(this, this, event->functions()));\n        LOG_MSG(\"'Functions' refreshed.\", mongo::logger::LogSeverity::Info());\n    }\n\n    void MongoDatabase::clearCollections()\n    {\n        qDeleteAll(_collections);\n        _collections.clear();\n    }\n\n    void MongoDatabase::addCollection(MongoCollection *collection)\n    {\n        _collections.push_back(collection);\n    }\n\n    void MongoDatabase::handle(CreateCollectionResponse *event) \n    {\n        if (event->isError()) {\n            handleIfReplicaSetUnreachable(event);\n            genericEventErrorHandler(event, \"Failed to create collection \\'\" + event->collection + \"\\'.\", _bus, this);\n        }\n        else {\n            loadCollections();\n            LOG_MSG(\"Collection \\'\" + event->collection + \"\\' created.\", mongo::logger::LogSeverity::Info());\n        }\n    }\n\n    void MongoDatabase::handle(DropCollectionResponse *event) \n    {\n        if (event->isError()) {\n            handleIfReplicaSetUnreachable(event);\n            genericEventErrorHandler(event, \"Failed to drop collection \\'\" + event->collection + \"\\'.\", _bus, this);\n        }\n        else {\n            loadCollections();\n            LOG_MSG(\"Collection \\'\" + event->collection + \"\\' dropped\", mongo::logger::LogSeverity::Info());\n        }\n    }\n\n    \n    void MongoDatabase::handle(DropFunctionResponse *event)\n    {\n        if (event->isError()) {\n            handleIfReplicaSetUnreachable(event);\n            genericEventErrorHandler(event, \"Failed to remove function \\'\" + event->functionName + \"\\'.\", _bus, this);\n        }\n        else {\n            loadFunctions();\n            LOG_MSG(\"Function \\'\" + event->functionName + \"\\' removed\", mongo::logger::LogSeverity::Info());\n        }\n    }\n\n    void MongoDatabase::handle(DropUserResponse *event)\n    {\n        if (event->isError()) {\n            handleIfReplicaSetUnreachable(event);\n            genericEventErrorHandler(event, \"Failed to drop user \\'\" + event->username + \"\\'.\", _bus, this);\n        }\n        else {\n            loadUsers();\n            LOG_MSG(\"User \\'\" + event->username + \"\\' dropped\", mongo::logger::LogSeverity::Info());\n        }\n    }\n\n    void MongoDatabase::handle(RenameCollectionResponse *event)\n    {\n        if (event->isError()) {\n            handleIfReplicaSetUnreachable(event);\n            genericEventErrorHandler(event, \"Failed to rename collection.\", _bus, this);\n        }\n        else {\n            loadCollections();\n            LOG_MSG(\"Collection \\'\" + event->oldCollection + \"\\' renamed to \\'\" + \n                    event->newCollection +\"\\'.\" , mongo::logger::LogSeverity::Info());\n        }\n    }\n\n    void MongoDatabase::handle(DuplicateCollectionResponse *event)\n    {\n        if (event->isError()) {\n            handleIfReplicaSetUnreachable(event);\n            genericEventErrorHandler(event, \"Failed to duplicate collection \\'\" + event->sourceCollection + \"\\'.\", \n                                   _bus, this);\n        }\n        else {\n            loadCollections();\n            LOG_MSG(\"Collection \\'\" + event->sourceCollection + \"\\' duplicated as \\'\" +\n                    event->duplicateCollection + \"\\'.\", mongo::logger::LogSeverity::Info());\n        }\n    }\n\n    void MongoDatabase::handleIfReplicaSetUnreachable(Event *event)\n    {\n        if (!_server->connectionRecord()->isReplicaSet())\n            return;\n\n        if (EventError::SetPrimaryUnreachable == event->error().errorCode()) {\n            auto refreshEvent = ReplicaSetRefreshed(this, event->error(), event->error().replicaSetInfo());\n            _server->handle(&refreshEvent);\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoDatabase.h",
    "content": "#pragma once\n\n#include <QObject>\n#include <mongo/bson/bsonobj.h>\n\n#include \"robomongo/core/Core.h\"\n#include \"robomongo/core/events/MongoEvents.h\"\n\nnamespace Robomongo\n{\n    class EventBus;\n\n    /**\n     * @brief Represents MongoDB database.\n     */\n    class MongoDatabase : public QObject\n    {\n        Q_OBJECT\n\n    public:\n        /**\n        * @brief Database storage engine type\n        */\n        struct StorageEngineType\n        {\n            static const std::string WIRED_TIGER;\n            static const std::string MMAPV1;\n        };\n\n        /**\n        * @brief MongoDB version\n        */\n        struct DBVersion \n        {\n            static const float MONGODB_2_6;\n            static const float MONGODB_3_0;\n            static const float MONGODB_3_2;\n        };\n\n        /**\n         * @brief MongoDatabase\n         * @param server: pointer to parent MongoServer\n         */\n        MongoDatabase(MongoServer *server, const std::string &name);\n        ~MongoDatabase();\n\n        /**\n         * @brief Initiate listCollection asynchronous operation.\n         */\n        void loadCollections();\n\n        /**\n         * @brief Initiate loadUsers asynchronous operation.\n         */\n        void loadUsers();\n\n        void loadFunctions();\n\n        void createCollection(const std::string &collection, long long size, bool capped, int maxDocNum, const mongo::BSONObj& extraOptions);\n        void dropCollection(const std::string &collection);\n        void renameCollection(const std::string &collection, const std::string &newCollection);\n        void duplicateCollection(const std::string &collection, const std::string &newCollection);\n        void copyCollection(MongoServer *server, const std::string &sourceDatabase, const std::string &collection);\n\n        void createUser(const MongoUser &user);\n        void dropUser(std::string const& userName);\n\n        void createFunction(const MongoFunction &fun);\n        void updateFunction(const std::string &name, const MongoFunction &fun);\n        void dropFunction(const std::string &name);\n\n        const std::string &name() const { return _name; }\n\n        /**\n         * @brief Checks that this is a system database.\n         * @return true if system, false otherwise.\n         */\n        bool isSystem() const { return _system; }\n\n        MongoServer *server() const { return _server; }\n\n    protected Q_SLOTS:\n        void handle(LoadCollectionNamesResponse *event);\n        void handle(LoadUsersResponse *event);\n        void handle(LoadFunctionsResponse *event);\n        void handle(CreateFunctionResponse *event);\n        void handle(CreateUserResponse *event);\n        void handle(CreateCollectionResponse *event);\n        void handle(DropCollectionResponse *event);\n        void handle(DropFunctionResponse *event);\n        void handle(DropUserResponse *event);\n        void handle(RenameCollectionResponse *event);\n        void handle(DuplicateCollectionResponse *event);\n\n    private:\n        void clearCollections();\n        void addCollection(MongoCollection *collection);\n        void handleIfReplicaSetUnreachable(Event *event);\n\n    private:\n        MongoServer *_server;\n        std::vector<MongoCollection *> _collections;\n        const std::string _name;\n        const bool _system;\n        EventBus *_bus;\n    };\n\n    class MongoDatabaseCollectionListLoadedEvent : public Event\n    {\n        R_EVENT\n\n        MongoDatabaseCollectionListLoadedEvent(QObject *sender, const std::vector<MongoCollection *> &list) :\n            Event(sender),\n            collections(list) { }\n\n        MongoDatabaseCollectionListLoadedEvent(QObject *sender, const EventError &error) :\n            Event(sender, error) {}\n\n        std::vector<MongoCollection *> collections;\n    };\n\n    class MongoDatabaseUsersLoadedEvent : public Event\n    {\n        R_EVENT\n\n        MongoDatabaseUsersLoadedEvent(QObject *sender, MongoDatabase *database, const std::vector<MongoUser> &list) :\n            Event(sender),\n            _users(list),\n            _database(database) {}\n\n        MongoDatabaseUsersLoadedEvent(QObject *sender, const EventError &error) :\n            Event(sender, error) {}\n\n        std::vector<MongoUser> users() const { return _users; }\n        MongoDatabase *database() const { return _database; }\n\n    private:\n        std::vector<MongoUser> _users;\n        MongoDatabase *_database;\n    };\n\n    class MongoDatabaseFunctionsLoadedEvent : public Event\n    {\n        R_EVENT\n\n        MongoDatabaseFunctionsLoadedEvent(QObject *sender, MongoDatabase *database, const std::vector<MongoFunction> &list) :\n            Event(sender),\n            _functions(list),\n            _database(database) {}\n\n        MongoDatabaseFunctionsLoadedEvent(QObject *sender, const EventError &error) :\n            Event(sender, error) {}\n\n        std::vector<MongoFunction> functions() const { return _functions; }\n        MongoDatabase *database() const { return _database; }\n\n    private:\n        std::vector<MongoFunction> _functions;\n        MongoDatabase *_database;\n    };\n\n    class MongoDatabaseUsersLoadingEvent : public Event\n    {\n        R_EVENT\n        MongoDatabaseUsersLoadingEvent(QObject *sender) : Event(sender) {}\n    };\n\n    class MongoDatabaseFunctionsLoadingEvent : public Event\n    {\n        R_EVENT\n        MongoDatabaseFunctionsLoadingEvent(QObject *sender) : Event(sender) {}\n    };\n\n    class MongoDatabaseCollectionsLoadingEvent : public Event\n    {\n        R_EVENT\n        MongoDatabaseCollectionsLoadingEvent(QObject *sender) : Event(sender) {}\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoDocument.cpp",
    "content": "#include \"robomongo/core/domain/MongoDocument.h\"\n\n#include <mongo/client/dbclient_base.h>\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/utils/BsonUtils.h\"\n\nnamespace Robomongo\n{\n    MongoDocument::MongoDocument()\n    {\n\n    }\n\n    MongoDocument::~MongoDocument()\n    {\n    }\n\n    /*\n    ** Create MongoDocument from BsonObj. It will take owned version of BSONObj\n    */\n    MongoDocument::MongoDocument(mongo::BSONObj bsonObj) :_bsonObj(bsonObj)\n    {\n    }\n\n    /*\n    ** Create MongoDocument from BsonObj. It will take owned version of BSONObj\n    */ \n    MongoDocumentPtr MongoDocument::fromBsonObj(const mongo::BSONObj &bsonObj)\n    {\n        MongoDocument *doc = new MongoDocument(bsonObj);\n        return MongoDocumentPtr(doc);\n    }\n\n    /*\n    ** Create list of MongoDocuments from QList<BsonObj>. It will take owned version of BSONObj\n    */ \n    std::vector<MongoDocumentPtr> MongoDocument::fromBsonObj(const std::vector<mongo::BSONObj> &bsonObjs)\n    {\n        std::vector<MongoDocumentPtr> list;\n        for (std::vector<mongo::BSONObj>::const_iterator it = bsonObjs.begin(); it != bsonObjs.end(); ++it) {\n            list.push_back(fromBsonObj(*it));\n        }\n\n        return list;\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoDocument.h",
    "content": "#pragma once\n\n#include <QStringList>\n#include <mongo/bson/bsonobj.h>\n\n#include \"robomongo/core/Core.h\"\n\nnamespace Robomongo\n{\n    /*\n    ** Represents MongoDB object.\n    */\n    class MongoDocument\n    {\n        /*\n        ** Owned BSONObj\n        */\n        const mongo::BSONObj _bsonObj;\n    public:\n        /*\n        ** Constructs empty Document, i.e. { }\n        */\n        MongoDocument();\n        ~MongoDocument();\n\n        /*\n        ** Create MongoDocument from BsonObj. It will take owned version of BSONObj\n        */\n        MongoDocument(mongo::BSONObj bsonObj);\n\n        /*\n        ** Create MongoDocument from BsonObj. It will take owned version of BSONObj\n        */ \n        static MongoDocumentPtr fromBsonObj(const mongo::BSONObj &bsonObj);\n\n        /*\n        ** Create list of MongoDocuments from QList<BsonObj>. It will take owned version of BSONObj\n        */ \n        static std::vector<MongoDocumentPtr> fromBsonObj(const std::vector<mongo::BSONObj> &bsonObj);\n\n        /*\n        ** Return \"native\" BSONObj\n        */\n        mongo::BSONObj bsonObj() const { return _bsonObj; }\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoFunction.cpp",
    "content": "#include \"robomongo/core/domain/MongoFunction.h\"\n#include \"robomongo/core/utils/BsonUtils.h\"\n#include <mongo/client/dbclient_base.h>\n\nnamespace Robomongo\n{\n    MongoFunction::MongoFunction(const mongo::BSONObj &obj)\n    {\n        _name = BsonUtils::getField<mongo::String>(obj, \"_id\");\n        _code = obj.getField(\"value\")._asCode();\n    }\n\n    mongo::BSONObj MongoFunction::toBson() const\n    {\n        mongo::BSONObjBuilder builder;\n\n        mongo::BSONCode code = mongo::BSONCode(_code);\n        builder.append(\"_id\", _name);\n        builder.append(\"value\", code);\n        mongo::BSONObj obj = builder.obj();\n        return obj;\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoFunction.h",
    "content": "#pragma once\n\n#include <mongo/bson/bsonobj.h>\n\nnamespace Robomongo\n{\n    class MongoFunction\n    {\n    public:\n        /**\n         * @brief Creates function from \"system.js\" document\n         */\n        MongoFunction(const mongo::BSONObj &obj);\n\n        /**\n         * @brief Creates new function with empty attributes\n         */\n        MongoFunction() {}\n\n        std::string name() const { return _name; }\n        std::string code() const { return _code; }\n\n        void setCode(const std::string &code) { _code = code; }\n        void setName(const std::string &name) { _name = name; }\n\n        mongo::BSONObj toBson() const;\n\n    private:\n        std::string _name;\n        std::string _code;\n    };\n\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoNamespace.cpp",
    "content": "#include \"robomongo/core/domain/MongoNamespace.h\"\n\n#include <stdio.h>\n\nnamespace Robomongo\n{\n    MongoNamespace::MongoNamespace(const std::string &ns) :\n        _ns(ns)\n    {\n        size_t dot = ns.find_first_of('.');\n        _collectionName = ns.substr(dot + 1);\n        _databaseName = ns.substr(0, dot);\n    }\n\n    MongoNamespace::MongoNamespace(const std::string &database, const std::string &collection) :\n        _databaseName(database),\n        _collectionName(collection)\n    {\n        _ns = _databaseName + \".\";\n        _ns += _collectionName;\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoNamespace.h",
    "content": "#pragma once\n\n#include <string>\n\nnamespace Robomongo\n{\n    class MongoNamespace\n    {\n    public:\n        MongoNamespace(const std::string &ns);\n        MongoNamespace(const std::string &database, const std::string &collection);\n        MongoNamespace() {}\n        std::string toString() const { return _ns; }\n        std::string databaseName() const { return _databaseName; }\n        std::string collectionName() const { return _collectionName; }\n        bool isValid() const { return !_ns.empty(); }\n    private:\n        std::string _ns;\n        std::string _databaseName;\n        std::string _collectionName;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoQueryInfo.cpp",
    "content": "#include \"robomongo/core/domain/MongoQueryInfo.h\"\n\n#include <mongo/client/dbclient_base.h>\n\nnamespace Robomongo\n{\n    namespace detail\n    {\n        std::string prepareServerAddress(const std::string &address)\n        {\n            size_t pos = address.find_first_of(\"{\");\n            if (pos != std::string::npos) {\n                return address.substr(0, pos);\n            }       \n            return address;\n        }\n    }\n\n    CollectionInfo::CollectionInfo() {}\n\n    CollectionInfo::CollectionInfo(const std::string &server, const std::string &database, const std::string &collection)\n        :_serverAddress(server),\n        _ns(database, collection)\n    {}\n\n    bool CollectionInfo::isValid() const\n    {\n        return !_serverAddress.empty() && _ns.isValid();\n    }\n\n    MongoQueryInfo::MongoQueryInfo() {}\n\n    MongoQueryInfo::MongoQueryInfo(const CollectionInfo &info,\n              mongo::BSONObj query, mongo::BSONObj fields, int limit, int skip, int batchSize,\n              int options, bool special) :\n        _info(info),\n        _query(query),\n        _fields(fields),\n        _limit(limit),\n        _skip(skip),\n        _batchSize(batchSize),\n        _options(options),\n        _special(special)\n        {}\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoQueryInfo.h",
    "content": "#pragma once\n\n#include <mongo/bson/bsonobj.h>\n#include \"robomongo/core/domain/MongoNamespace.h\"\n\nnamespace Robomongo\n{\n    namespace detail\n    {\n        std::string prepareServerAddress(const std::string &address);\n    }\n\n    struct CollectionInfo\n    {\n        CollectionInfo();\n        CollectionInfo(const std::string &server, const std::string &database, const std::string &collection);\n        bool isValid() const;\n\n        std::string _serverAddress;\n        MongoNamespace _ns;\n    };\n\n    struct MongoQueryInfo\n    {\n        MongoQueryInfo();\n\n        MongoQueryInfo(const CollectionInfo &info,\n                  mongo::BSONObj query, mongo::BSONObj fields, int limit, int skip, int batchSize,\n                  int options, bool special);\n\n        CollectionInfo _info;\n        mongo::BSONObj _query;\n        mongo::BSONObj _fields;\n        int _limit;\n        int _skip;\n        int _batchSize;\n        int _options;\n        bool _special; // flag, indicating that `query` contains special fields on\n                      // first level, and query data in `query` field.\n        \n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoServer.cpp",
    "content": "#include \"robomongo/core/domain/MongoServer.h\"\n\n#include \"robomongo/core/domain/MongoDatabase.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/settings/SshSettings.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/core/settings/ReplicaSetSettings.h\"\n#include \"robomongo/core/mongodb/MongoWorker.h\"\n#include \"robomongo/core/mongodb/SshTunnelWorker.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/EventBus.h\"\n#include \"robomongo/core/events/MongoEventsInfo.h\"\n#include \"robomongo/core/utils/Logger.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/gui/MainWindow.h\"\n#include \"robomongo/utils/common.h\"\n#include \"robomongo/utils/StringOperations.h\"\n\n#include <QApplication>\n\nnamespace Robomongo {\n    R_REGISTER_EVENT(MongoServerLoadingDatabasesEvent)\n\n    MongoServer::MongoServer(int handle, ConnectionSettings *settings, ConnectionType connectionType) \n        : QObject(),\n        _version(0.0f),\n        _connectionType(connectionType),\n        _worker(nullptr),\n        _isConnected(false),\n        _connSettings(settings),\n        _handle(handle),\n        _bus(AppRegistry::instance().bus()),\n        _app(AppRegistry::instance().app()),\n        _replicaSetInfo(nullptr)\n    {}\n\n    bool MongoServer::isConnected() const {\n        return _isConnected;\n    }\n\n    ConnectionSettings *MongoServer::connectionRecord() const {\n        return _connSettings.get();\n    }\n\n    MongoServer::~MongoServer() {\n        clearDatabases();\n\n        if (_worker) {\n            _worker->stopAndDelete();\n        }\n\n        // MongoWorker \"_worker\" is not deleted here, because it is now owned by\n        // another thread (call to moveToThread() made in MongoWorker constructor).\n        // It will be deleted by this thread by means of \"deleteLater()\", which\n        // is also specified in MongoWorker constructor.\n    }\n\n    void MongoServer::tryConnect() \n    {\n        _bus->send(_worker, new EstablishConnectionRequest(this, _connectionType, _connSettings->uuid().toStdString()));\n    }\n\n    void MongoServer::tryRefresh() \n    {\n        _bus->send(_worker, new EstablishConnectionRequest(this, ConnectionRefresh, _connSettings->uuid().toStdString()));\n    }\n\n    void MongoServer::tryRefreshReplicaSetConnection()\n    {\n        _bus->send(_worker, new EstablishConnectionRequest(this, ConnectionRefresh, _connSettings->uuid().toStdString()));\n    }\n    \n    void MongoServer::tryRefreshReplicaSetFolder(bool expanded, bool showLoading /*= true*/)\n    {\n        if (!_connSettings->isReplicaSet())\n            return;\n\n        if (showLoading)\n            _bus->publish(new ReplicaSetFolderLoading(this));\n\n        _bus->send(_worker, new RefreshReplicaSetFolderRequest(this, expanded));\n    }\n\n    QStringList MongoServer::getDatabasesNames() const \n    {\n        QStringList result;\n        for (QList<MongoDatabase *>::const_iterator it = _databases.begin(); it != _databases.end(); ++it) {\n            MongoDatabase *datab = *it;\n            result.append(QtUtils::toQString(datab->name()));\n        }\n        return result;\n    }\n\n    void MongoServer::addDatabase(MongoDatabase *database) {\n        _databases.append(database);\n    }\n\n    void MongoServer::createDatabase(const std::string &dbName) \n    {\n        _bus->send(_worker, new CreateDatabaseRequest(this, dbName));\n    }\n\n    MongoDatabase *MongoServer::findDatabaseByName(const std::string &dbName) const \n    {\n        for (QList<MongoDatabase *>::const_iterator it = _databases.begin(); it != _databases.end(); ++it) {\n            MongoDatabase *datab = *it;\n            if (datab->name() == dbName) {\n                return datab;\n            }\n        }\n        return NULL;\n    }\n\n    void MongoServer::dropDatabase(const std::string &dbName) {\n        _bus->send(_worker, new DropDatabaseRequest(this, dbName));\n    }\n\n    void MongoServer::insertDocuments(const std::vector<mongo::BSONObj> &objCont,\n                                      const MongoNamespace &ns) {\n        for (std::vector<mongo::BSONObj>::const_iterator it = objCont.begin(); it != objCont.end(); it++) {\n            insertDocument(*it, ns);\n        }\n    }\n\n    void MongoServer::insertDocument(const mongo::BSONObj &obj, const MongoNamespace &ns) {\n        _bus->send(_worker, new InsertDocumentRequest(this, obj, ns));\n    }\n\n    void MongoServer::saveDocuments(const std::vector<mongo::BSONObj> &objCont, const MongoNamespace &ns) {\n        for (std::vector<mongo::BSONObj>::const_iterator it = objCont.begin(); it != objCont.end(); it++) {\n            saveDocument(*it, ns);\n        }\n    }\n\n    void MongoServer::saveDocument(const mongo::BSONObj &obj, const MongoNamespace &ns) {\n        _bus->send(_worker, new InsertDocumentRequest(this, obj, ns, true));\n    }\n\n    void MongoServer::removeDocuments(mongo::Query query, const MongoNamespace &ns, \n                                      RemoveDocumentCount removeCount, int index) \n    {\n        _bus->send(_worker, new RemoveDocumentRequest(this, query, ns, removeCount, index));\n    }\n\n    void MongoServer::loadDatabases() \n    {\n        _bus->publish(new MongoServerLoadingDatabasesEvent(this));\n        if (_connSettings->isReplicaSet()) {\n            tryRefreshReplicaSetConnection();\n        }\n        else {  // single server\n            _bus->send(_worker, new LoadDatabaseNamesRequest(this));\n        }\n    }\n\n    void MongoServer::clearDatabases() \n    {\n        qDeleteAll(_databases);\n        _databases.clear();\n    }\n\n    void MongoServer::handle(EstablishConnectionResponse *event) \n    {\n        _connectionType = event->connectionType;\n\n        // In any case, replica set info must be updated, there might be reachable secondary(ies).\n        // Also cached set name must be updated or cleared for failed connections.\n        updateReplicaSetSettings(event);\n\n        // --- Connection Failed\n        if (event->isError()) {\n            handleConnectionFailure(event);\n            return;\n        }\n\n        // --- Connections Successful\n        // Save various information after successful connection\n        const ConnectionInfo &info = event->info;\n        _version = info._version;\n        _storageEngineType = info._storageEngineType;\n        _isConnected = true;\n\n        // ConnectionRefresh is used just to update connection view (_version, _storageEngineType, _repPrimary etc..)\n        // So we return here after updating(refreshing) information related to connection view.\n        if (ConnectionRefresh == event->connectionType) {\n            if (_connSettings->isReplicaSet()) {\n                // If it is replica set connection, do not return yet.\n                LOG_MSG(\"Replica set refreshed. [\" + _connSettings->connectionName() + ']', \n                         mongo::logger::LogSeverity::Info());\n            }\n            else {  // single server\n                LOG_MSG(\"Server refreshed.\", mongo::logger::LogSeverity::Info());\n                return;\n            }\n        }\n\n        // Only for single servers\n        if (!_connSettings->isReplicaSet()) {\n            _bus->publish(new ConnectionEstablishedEvent(this, _connectionType, info));\n            // Do nothing if this is not a \"primary\" connection\n            if (ConnectionPrimary != _connectionType)\n                return;\n        }\n\n        if (ConnectionPrimary == _connectionType)\n            LOG_MSG(\"Establish connection successful. Connection: \" + _connSettings->connectionName(),\n                     mongo::logger::LogSeverity::Info());\n\n        clearDatabases();\n        for (auto const& dbname : info._databases) {\n            MongoDatabase *db  = new MongoDatabase(this, dbname);\n            addDatabase(db);    // todo: serverClones for replica sets should not do this\n        }\n\n        if (_connSettings->isReplicaSet()) {\n            _bus->publish(new ConnectionEstablishedEvent(this, event->connectionType, info));\n            // In order to do first connection much faster, time consuming refresh \n            // \"repSetMonitor->startOrContinueRefresh(). refreshAll()\" is being requested after \n            // successful connection.\n            if (ConnectionPrimary == event->connectionType)\n                _bus->send(_worker, new RefreshReplicaSetFolderRequest(this, false));\n        }\n\n        // Save connected db version if not saved before and if this is primary connection.\n        QString const versionStr = QString::fromStdString(info._dbVersionStr);\n        auto const& settingsManager = AppRegistry::instance().settingsManager();\n        if (ConnectionPrimary == _connectionType &&\n            !settingsManager->dbVersionsConnected().contains(versionStr)) {\n            settingsManager->addDbVersionConnected(versionStr);\n            settingsManager->save();\n        }\n\n    }\n\n    void MongoServer::handle(RefreshReplicaSetFolderResponse *event)\n    {\n        handleReplicaSetRefreshEvents(event->isError(), event->error(), event->replicaSet, event->expanded);\n    }\n\n    void MongoServer::handle(LoadDatabaseNamesResponse *event) \n    {\n        if (event->isError()) {\n            _bus->publish(new DatabaseListLoadedEvent(this, event->error()));\n            return;\n        }\n\n        clearDatabases();\n\n        for (auto const& dbname : event->databaseNames) \n            addDatabase(new MongoDatabase(this, dbname));\n\n        _bus->publish(new DatabaseListLoadedEvent(this, _databases));\n        LOG_MSG(\"Database list refreshed. Connection: \" + _connSettings->connectionName(), \n                 mongo::logger::LogSeverity::Info());\n    }\n\n    void MongoServer::handle(InsertDocumentResponse *event) \n    {\n        if (event->isError()) {\n            hideProgressBar();\n            if (_connSettings->isReplicaSet()) {\n                if (ConnectionPrimary == _connectionType) { // Insert document from explorer context menu\n                    if (EventError::SetPrimaryUnreachable == event->error().errorCode()) {\n                        auto refreshEvent = ReplicaSetRefreshed(this, event->error(), event->error().replicaSetInfo());\n                        handle(&refreshEvent);\n                    }\n                }\n                else {  // Insert document from tab results window (Notifier, OutputWindow widget)\n                    _bus->publish(new InsertDocumentResponse(this, event->error()));\n                }\n            }\n            genericEventErrorHandler(event, \"Failed to insert document.\", _bus, this);\n        }\n        else {\n            _bus->publish(new InsertDocumentResponse(this, event->error()));\n            LOG_MSG(\"Document inserted.\", mongo::logger::LogSeverity::Info());\n        }\n    }\n\n    void MongoServer::handle(RemoveDocumentResponse *event) \n    {        \n        if (event->removeCount == RemoveDocumentCount::MULTI && event->index > 0)\n            return;\n\n        std::string subStr;\n        switch (event->removeCount) {\n            case RemoveDocumentCount::ONE:    subStr = \"document.\"; break;\n            case RemoveDocumentCount::MULTI:  subStr = \"documents.\"; break;\n            case RemoveDocumentCount::ALL:    subStr = \"all documents.\"; break;\n            default:                          subStr = \"(logic error).\"; break;\n        }\n\n        if (event->isError()) {\n            hideProgressBar();\n            if (_connSettings->isReplicaSet() &&\n                EventError::SetPrimaryUnreachable == event->error().errorCode()) {\n                auto refreshEvent = ReplicaSetRefreshed(this, event->error(), event->error().replicaSetInfo());\n                handle(&refreshEvent);\n            }\n            genericEventErrorHandler(event, \"Failed to remove \" + subStr, _bus, this);\n        }\n        else {  // success\n            _bus->publish(new RemoveDocumentResponse(this, event->error(), event->removeCount, event->index));\n            LOG_MSG(\"Removed \" + subStr, mongo::logger::LogSeverity::Info());\n        }\n    }\n\n    void MongoServer::runWorkerThread() \n    {\n        _worker = new MongoWorker(_connSettings->clone(),\n                                  AppRegistry::instance().settingsManager()->loadMongoRcJs(),\n                                  AppRegistry::instance().settingsManager()->batchSize(),\n                                  AppRegistry::instance().settingsManager()->mongoTimeoutSec(),\n                                  AppRegistry::instance().settingsManager()->shellTimeoutSec());\n    }\n\n    void MongoServer::handle(CreateDatabaseResponse *event) \n    {\n        if (event->isError()) {\n            if (_connSettings->isReplicaSet() &&\n                EventError::SetPrimaryUnreachable == event->error().errorCode()) {\n                auto refreshEvent = ReplicaSetRefreshed(this, event->error(), event->error().replicaSetInfo());\n                handle(&refreshEvent);\n            }\n            genericEventErrorHandler(event, \"Failed to create database \\'\" + event->database + \"\\'.\", _bus, this);\n        }\n        else {\n            loadDatabases();\n            LOG_MSG(\"Database \\'\" + event->database + \"\\' created.\", mongo::logger::LogSeverity::Info());\n        }\n    }\n\n    void MongoServer::handle(DropDatabaseResponse *event) \n    {\n        if (event->isError()) {\n            if (_connSettings->isReplicaSet() &&\n                EventError::SetPrimaryUnreachable == event->error().errorCode()) {\n                auto refreshEvent = ReplicaSetRefreshed(this, event->error(), event->error().replicaSetInfo());\n                handle(&refreshEvent);\n            }\n            genericEventErrorHandler(event, \"Failed to drop database \\'\" + event->database + \"\\'.\", _bus, this);\n        }\n        else {\n            loadDatabases();\n            LOG_MSG(\"Database \\'\" + event->database + \"\\' dropped.\", mongo::logger::LogSeverity::Info());\n        }\n    }\n\n    void MongoServer::handle(ReplicaSetRefreshed *event) \n    {\n        handleReplicaSetRefreshEvents(event->isError(), event->error(), event->replicaSet, false);\n    }\n\n    void MongoServer::changeWorkerShellTimeout(int newTimeout)\n    {\n        _worker->changeTimeout(newTimeout);\n    }\n\n    void MongoServer::handleReplicaSetRefreshEvents(bool isError, EventError eventError, \n                                                    ReplicaSet const& replicaSet, bool expanded)\n    {\n        if (isError) { // Primary is unreachable\n            _replicaSetInfo.reset(new ReplicaSet(replicaSet));\n            LOG_MSG(\"Replica set folder refreshed with error. \" + eventError.errorMessage() +\n                    \". Connection: \" + _connSettings->connectionName(), mongo::logger::LogSeverity::Error());\n            _bus->publish(new ReplicaSetFolderRefreshed(this, eventError, true));\n            return;\n        }\n\n        // Primary is reachable\n        // Update replica set settings and mongo server _replicaSetInfo \n        _replicaSetInfo.reset(new ReplicaSet(replicaSet));\n        _connSettings->setServerHost(_replicaSetInfo->primary.host());\n        _connSettings->setServerPort(_replicaSetInfo->primary.port());\n        _connSettings->replicaSetSettings()->setCachedSetName(\n            _connSettings->replicaSetSettings()->setNameUserEntered().empty() ? _replicaSetInfo->setName : \"\");\n\n        LOG_MSG(\"Replica set folder refreshed. Connection: \" + _connSettings->connectionName(),\n                 mongo::logger::LogSeverity::Info());\n        _bus->publish(new ReplicaSetFolderRefreshed(this, expanded));\n    }\n\n    void MongoServer::updateReplicaSetSettings(EstablishConnectionResponse* event)\n    {\n        if (!_connSettings->isReplicaSet())\n            return;\n\n        _replicaSetInfo.reset(new ReplicaSet(event->replicaSet));\n        _connSettings->setServerHost(_replicaSetInfo->primary.host());\n        _connSettings->setServerPort(_replicaSetInfo->primary.port());\n        _connSettings->replicaSetSettings()->setCachedSetName(\n            _connSettings->replicaSetSettings()->setNameUserEntered().empty() ? _replicaSetInfo->setName : \"\");\n\n        if (_connSettings->replicaSetSettings()->setNameUserEntered().empty()) {\n            // Cache replica set name for 2 times faster first connection \n            if (ConnectionPrimary == _connectionType) {\n                ConnectionSettings* originalConnSettings = AppRegistry::instance().settingsManager()\n                    ->getConnectionSettingsByUuid(event->info._uuid);\n                if (originalConnSettings) {\n                    auto setName = event->isError() ? \"\" : _replicaSetInfo->setName;\n                    originalConnSettings->replicaSetSettings()->setCachedSetName(setName);\n                    AppRegistry::instance().settingsManager()->save();\n                    LOG_MSG(\"Replica set name cached as \\\"\" + setName + \"\\\".\", mongo::logger::LogSeverity::Info());\n                }\n                else\n                    LOG_MSG(\"Failed to cache the replica set name.\", mongo::logger::LogSeverity::Warning());\n            }\n        }\n        else { // User entered set name is not empty, clear cached set name just in case\n            ConnectionSettings* originalConnSettings = AppRegistry::instance().settingsManager()\n                ->getConnectionSettingsByUuid(event->info._uuid);\n            if (originalConnSettings) {\n                originalConnSettings->replicaSetSettings()->setCachedSetName(\"\");\n                AppRegistry::instance().settingsManager()->save();\n                LOG_MSG(\"Replica set's cached set name cleared. Using user entered set name.\", \n                        mongo::logger::LogSeverity::Info());\n            }\n        }\n    }\n\n    void MongoServer::handleConnectionFailure(EstablishConnectionResponse* event)\n    {\n        _isConnected = false;\n\n        std::stringstream ss(\"Unknown error\");\n        auto eventErrorReason = event->errorReason;\n\n        if (_connSettings->isReplicaSet())\n        {\n            ss.clear();\n            std::string server = \"\";\n            if (_connSettings->replicaSetSettings()->members().size() > 0)\n                server = \"[\" + _connSettings->replicaSetSettings()->members().front() + \"]\";\n\n            if (event->error().errorCode() == EventError::ErrorCode::ServerHasDifferentMembers) {\n                ss << \"Cannot connect to replica set \\\"\" << _connSettings->connectionName() << \"\\\"\" << server\n                   << \". \\n\\nA primary with different host name [\" << event->replicaSet.primary << \n                   \"] found in server side. \"\n                   \"Please double check if same host names and ports are used as in server's replica set\"\n                   \" configuration. \\nIf same set name is used for different replica sets, this configuration\"\n                   \" is supported only on different instances of Robomongo. \"\n                   \" Please open a new Robomongo instance for each replica set which has the same set name.\"\n                   \"\\n\\nReason:\\n\" << event->error().errorMessage();\n            }\n            else {\n                ss << \"Cannot connect to replica set \\\"\" << _connSettings->connectionName() << \"\\\"\" << server\n                   << \". \\nSet's primary is unreachable.\\n\\nReason:\\n\" << event->error().errorMessage();\n            }\n\n            _bus->publish(new ConnectionFailedEvent(this, _handle, event->connectionType, ss.str(),\n                ConnectionFailedEvent::MongoConnection));\n            _app->fireConnectionFailedEvent(_handle, event->connectionType, ss.str(),\n                ConnectionFailedEvent::MongoConnection);\n            LOG_MSG(\"Establish connection failed. \" + event->error().errorMessage() + \". Connection: \"\n                + _connSettings->connectionName(), mongo::logger::LogSeverity::Error());\n        }\n        else    // single server \n        {\n            if (EstablishConnectionResponse::ErrorReason::MongoSslConnection == eventErrorReason)\n            {\n                auto reason = ConnectionFailedEvent::SslConnection;\n                ss.clear();\n                ss << \"Cannot connect to the MongoDB at \" << connectionRecord()->getFullAddress()\n                    << \".\\n\\nError:\\n\" << \"TLS connection failure: \" << event->error().errorMessage();\n                _app->fireConnectionFailedEvent(_handle, _connectionType, ss.str(), reason);\n            }\n            else\n            {\n                auto reason = (EstablishConnectionResponse::ErrorReason::MongoAuth == eventErrorReason) ?\n                    ConnectionFailedEvent::MongoAuth : ConnectionFailedEvent::MongoConnection;\n                ss.clear();\n                ss << \"Cannot connect to the MongoDB at \" << connectionRecord()->getFullAddress()\n                    << \".\\n\\nError:\\n\" << event->error().errorMessage();\n                _app->fireConnectionFailedEvent(_handle, _connectionType, ss.str(), reason);\n            }\n\n            // When connection cannot be established, we should cleanup this instance of MongoServer if it wasn't\n            // shown in UI (i.e. it is not a Secondary connection that is used for shells tab)\n            if (_connectionType == ConnectionPrimary || _connectionType == ConnectionTest) \n            {\n                LOG_MSG(\"Establish connection failed. \" + event->error().errorMessage() +\n                        \". Connection: \" + _connSettings->connectionName(), \n                        mongo::logger::LogSeverity::Error());\n                _app->closeServer(this);\n            }\n        }\n    }\n\n    void MongoServer::hideProgressBar() const\n    {\n        MainWindow* mainWindow = nullptr;\n        for (auto wid : QApplication::topLevelWidgets()) {\n            if ((mainWindow = qobject_cast<MainWindow*>(wid)))\n                break;\n        }\n\n        if(mainWindow)\n            mainWindow->hideQueryWidgetProgressBar();\n    }\n\n}   // namespace Robomongo\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoServer.h",
    "content": "#pragma once\n#include <QObject>\n\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/events/MongoEvents.h\"\n\nnamespace Robomongo\n{\n    class MongoWorker;\n    class MongoDatabase;\n    class EventBus;\n    class App;\n\n    // Messages\n    struct EstablishConnectionResponse;\n    struct RefreshReplicaSetFolderResponse;\n    class LoadDatabaseNamesResponse;\n    class InsertDocumentResponse;\n    struct CreateDatabaseResponse;\n    struct DropDatabaseResponse;\n\n    /**\n     * @brief MongoServer represents active connection to MongoDB server.\n     * MongoServer is an Aggregate Root, that manages three internal entities:\n     * MongoDatabase, MongoCollection and MongoWorker.\n     */\n    class MongoServer : public QObject\n    {\n        Q_OBJECT\n\n    public:\n        /**\n         * @brief MongoServer\n         * @param connectionRecord: MongoServer will own this ConnectionSettings.\n         * @param visible\n         * @param defaultDatabase\n         */\n        MongoServer(int handle, ConnectionSettings *connectionRecord, ConnectionType connectionType);\n        ~MongoServer();\n\n        void runWorkerThread();\n\n        /**\n         * @brief Try to connect to MongoDB single server or replica set.\n         * @throws MongoException, if fails\n         */\n        void tryConnect();\n\n        /**\n        * @brief Try to re-connect to MongoDB server in order to refresh connection view.\n        *        Never shown in Explorer and can be used to refresh (via reconnecting) current connection view.\n        *        (i.e. db version, storage engine etc...)\n        * @throws MongoException, if fails\n        */\n        void tryRefresh();\n\n        /**\n        * @brief Try to re-connect to MongoDB replica set in order to refresh connection view.\n        *        It is used to refresh (via reconnecting) current connection view.\n        *        (i.e. db version, storage engine, current replica set primary, status of replica set etc...)\n        *        It will update Explorer widgets depending on replica set status (online if primary reachable and\n        *        offline otherwise)\n        */\n        void tryRefreshReplicaSetConnection();\n\n        /**\n        * @brief Try to re-connect to MongoDB replica set in order to refresh connection view.\n        *        It is used to refresh (via reconnecting) current connection view.\n        *        (i.e. db version, storage engine, current replica set primary, status of replica set etc...)\n        *        It will update only 'Replica Set' folder widgets depending on replica set status \n        *       (online if primary reachable and offline otherwise)\n        */\n        void tryRefreshReplicaSetFolder(bool expanded, bool showLoading = true);\n\n        bool isConnected() const;\n\n        void addDatabase(MongoDatabase *database);\n        void createDatabase(const std::string &dbName);\n        void dropDatabase(const std::string &dbName);\n        QStringList getDatabasesNames() const;\n        QList<MongoDatabase*> const& databases() const { return _databases; };\n        MongoDatabase *findDatabaseByName(const std::string &dbName) const;\n\n        void insertDocuments(const std::vector<mongo::BSONObj> &objCont, const MongoNamespace &ns);\n        void insertDocument(const mongo::BSONObj &obj, const MongoNamespace &ns);\n        void saveDocuments(const std::vector<mongo::BSONObj> &objCont, const MongoNamespace &ns);\n        void saveDocument(const mongo::BSONObj &obj, const MongoNamespace &ns);\n        void removeDocuments(mongo::Query query, const MongoNamespace &ns, RemoveDocumentCount removeCount, \n                             int index = 0);\n        float version() const{ return _version; }\n        const std::string& getStorageEngineType() const { return _storageEngineType; }\n\n        /**\n         * @brief Returns associated connection record\n         */\n        ConnectionSettings *connectionRecord() const;\n\n        /**\n         * @brief Loads databases of this server asynchronously.\n         */\n        void loadDatabases();\n        MongoWorker *const worker() const { return _worker; }\n\n        ReplicaSet* replicaSetInfo() const { return _replicaSetInfo.get(); }\n\n        void handle(ReplicaSetRefreshed *event);\n\n        void changeWorkerShellTimeout(int newTimeout);\n\n    protected Q_SLOTS:\n        void handle(EstablishConnectionResponse *event);\n        void handle(RefreshReplicaSetFolderResponse *event);\n        void handle(LoadDatabaseNamesResponse *event);\n        void handle(InsertDocumentResponse *event);\n        void handle(RemoveDocumentResponse *event);\n        void handle(CreateDatabaseResponse *event);\n        void handle(DropDatabaseResponse *event);\n\n    private:                 \n        void clearDatabases();\n        void handleReplicaSetRefreshEvents(bool isError, EventError eventError, ReplicaSet const& replicaSet,\n                                           bool expanded);\n        void updateReplicaSetSettings(EstablishConnectionResponse* event);\n        void handleConnectionFailure(EstablishConnectionResponse* event);\n        void hideProgressBar() const;\n\n        MongoWorker *_worker;\n        std::unique_ptr<ConnectionSettings> _connSettings;\n        EventBus *_bus;\n        App *_app;\n\n        float _version;\n        std::string _storageEngineType;\n        ConnectionType _connectionType;\n        bool _isConnected;\n        int _handle;\n\n        QList<MongoDatabase *> _databases;\n        std::unique_ptr<ReplicaSet> _replicaSetInfo;\n    };\n\n    class MongoServerLoadingDatabasesEvent : public Event\n    {\n        R_EVENT\n        MongoServerLoadingDatabasesEvent(QObject *sender) : Event(sender) {}\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoShell.cpp",
    "content": "#include \"robomongo/core/domain/MongoShell.h\"\n\n#include \"mongo/scripting/engine.h\"\n\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/mongodb/MongoWorker.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/EventBus.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/utils/Logger.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n\nnamespace Robomongo\n{  \n    auto const& eventBus = []() { return AppRegistry::instance().bus(); };\n\n    MongoShell::MongoShell(MongoServer *server, ScriptInfo scriptInfo) :\n        QObject(),\n        _scriptInfo(scriptInfo),\n        _server(server)      \n    {\n    }\n\n    void MongoShell::open(const std::string &script, const std::string &dbName)\n    {\n        eventBus()->publish(new ScriptExecutingEvent(this));\n        _scriptInfo.setScript(QtUtils::toQString(script));\n        eventBus()->send(_server->worker(), new ExecuteScriptRequest(this, query(), dbName));\n        LOG_MSG(_scriptInfo.script(), mongo::logger::LogSeverity::Info());\n    }\n\n    std::string MongoShell::query() const \n    {\n        return QtUtils::toStdString(_scriptInfo.script()); \n    }\n\n    void MongoShell::execute(const std::string &script /* = \"\" */, \n                             const std::string &dbName /* = \"\" */)\n    {\n        if (!_scriptInfo.execute())\n            return;\n\n        std::string const finalScript = script.empty() ? query() : script;\n        eventBus()->publish(new ScriptExecutingEvent(this));\n        eventBus()->send(_server->worker(), \n            new ExecuteScriptRequest(this, finalScript, dbName, _aggrInfo));\n        if (!_scriptInfo.script().isEmpty())\n            LOG_MSG(_scriptInfo.script(), mongo::logger::LogSeverity::Info());\n    }\n\n    void MongoShell::query(int resultIndex, const MongoQueryInfo &info)\n    {\n        eventBus()->send(_server->worker(), new ExecuteQueryRequest(this, resultIndex, info));\n    }\n\n    void MongoShell::autocomplete(const std::string &prefix)\n    {\n        AutocompletionMode autocompletionMode {\n            AppRegistry::instance().settingsManager()->autocompletionMode()\n        };\n        if (autocompletionMode == AutocompleteNone)\n            return;\n\n        eventBus()->send(_server->worker(), \n            new AutocompleteRequest(this, prefix, autocompletionMode)\n        );\n    }\n\n    void MongoShell::stop()\n    {\n        // _server->worker()->interrupt();\n        // mongo::Scope::setInterruptFlag(true);\n    }\n\n    bool MongoShell::loadFromFile()\n    {\n        return _scriptInfo.loadFromFile();\n    }\n\n    bool MongoShell::saveToFileAs()\n    {\n        return _scriptInfo.saveToFileAs();\n    }\n\n    bool MongoShell::saveToFile()\n    {\n        return _scriptInfo.saveToFile();\n    }\n\n    void MongoShell::handle(ExecuteQueryResponse *event)\n    {\n        if (event->isError()) {\n            eventBus()->publish(new DocumentListLoadedEvent(this, event->error()));\n            return;\n        }\n\n        eventBus()->publish(\n            new DocumentListLoadedEvent(this, \n                event->resultIndex, event->queryInfo, query(), event->documents)\n        );\n    }\n\n    void MongoShell::handle(ExecuteScriptResponse *event)\n    {\n        if (!event->isError()) {\n            eventBus()->publish(\n                new ScriptExecutedEvent(this, event->result, event->empty, event->timeoutReached())\n            );\n            return;\n        }\n\n        if (_server->connectionRecord()->isReplicaSet()) {\n            eventBus()->publish(\n                new ReplicaSetRefreshed(this, event->error(), event->error().replicaSetInfo())\n            );\n\n            eventBus()->publish(\n                new ScriptExecutedEvent(this, event->error(), event->timeoutReached())\n            );\n            return;\n        }\n        else {  // single server\n            eventBus()->publish(\n                new ScriptExecutedEvent(this, event->error(), event->timeoutReached())\n            );\n            return;\n        }\n    }\n\n    void MongoShell::handle(AutocompleteResponse *event)\n    {\n        if (event->isError()) {\n            eventBus()->publish(new AutocompleteResponse(this, event->error()));\n            return;\n        }\n\n        eventBus()->publish(new AutocompleteResponse(this, event->list, event->prefix));\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoShell.h",
    "content": "#pragma once\n#include <QObject>\n#include \"robomongo/core/events/MongoEvents.h\"\n#include \"robomongo/core/domain/ScriptInfo.h\"\n#include \"robomongo/core/domain/MongoAggregateInfo.h\"\n\nnamespace Robomongo\n{\n    struct AggrInfo;\n\n    class MongoShell : public QObject\n    {\n        Q_OBJECT\n\n    public:\n        MongoShell(MongoServer *server, ScriptInfo scriptInfo);\n\n        void open(const std::string &script, const std::string &dbName = std::string());\n        void query(int resultIndex, const MongoQueryInfo &info);\n        void autocomplete(const std::string &prefix);\n        void stop();\n        MongoServer *server() const { return _server; }\n        std::string query() const;\n        void execute(const std::string &script = \"\", const std::string &dbName = \"\");\n        bool isExecutable() const { return _scriptInfo.execute(); }\n        const QString &title() const { return _scriptInfo.title(); }\n        std::string dbname() const { return _scriptInfo.dbname(); }\n        const CursorPosition &cursor() const { return _scriptInfo.cursor(); }\n        void setScript(const QString &script) { return _scriptInfo.setScript(script); }\n        void setScriptExecutable(bool execute) { _scriptInfo.setExecutable(execute); }\n        void setAggrInfo(AggrInfo const& aggrInfo) { _aggrInfo = aggrInfo; }\n        QString filePath() const { return _scriptInfo.filePath(); }\n\n        bool saveToFile();\n        bool saveToFileAs();\n        bool loadFromFile();\n\n    protected Q_SLOTS:\n        void handle(ExecuteQueryResponse *event);\n        void handle(ExecuteScriptResponse *event);\n        void handle(AutocompleteResponse *event);\n\n    private:        \n        ScriptInfo _scriptInfo;\n        AggrInfo _aggrInfo;\n        MongoServer *_server;\n    };\n\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoShellResult.h",
    "content": "#pragma once\n#include \"robomongo/core/domain/MongoQueryInfo.h\"\n#include \"robomongo/core/domain/MongoAggregateInfo.h\"\n#include \"robomongo/core/domain/MongoDocument.h\"\n\nnamespace Robomongo\n{\n    /* --------------  MongoShellResult Class --------- */\n    class MongoShellResult\n    {\n    public:\n        MongoShellResult(\n            const std::string &type, const std::string &response,\n            const std::vector<MongoDocumentPtr> &documents,\n            const MongoQueryInfo &queryInfo, const std::string &statement,\n            qint64 elapsedms, AggrInfo aggrInfo = AggrInfo()) :\n            _type(type),\n            _response(response),\n            _documents(documents),\n            _queryInfo(queryInfo),\n            _statement(statement),\n            _elapsedms(elapsedms),\n            _aggrInfo(aggrInfo)\n        { }\n\n        std::string response() const { return _response; }\n        std::string type() const { return _type; }\n        std::vector<MongoDocumentPtr> documents() const { return _documents; }\n        MongoQueryInfo queryInfo() const { return _queryInfo; }\n        std::string statement() const { return _statement; }\n        std::string statementShort() const {\n            std::size_t const LEN = _statement.size() < 10 ? _statement.size() : 10;\n            std::string statementShort { _statement, 0, LEN };\n            statementShort.append((_statement.size() > 10) ? \"..\" : \"\");\n            return statementShort;\n        }\n\n        qint64 elapsedMs() const { return _elapsedms; }\n        AggrInfo const& aggrInfo() const { return _aggrInfo; }\n\n    private:\n        std::string _type;\n        std::string _response;\n        std::vector<MongoDocumentPtr> _documents;\n        MongoQueryInfo _queryInfo;\n        std::string const _statement;\n        qint64 _elapsedms;\n        AggrInfo _aggrInfo = AggrInfo();\n    };\n\n    /* --------------  MongoShellExecResult Class --------- */\n    class MongoShellExecResult\n    {\n    public:\n        MongoShellExecResult() { }\n\n        MongoShellExecResult(\n            const std::vector<MongoShellResult> &results,\n            const std::string &currentServer, bool isCurrentServerValid,\n            const std::string &currentDatabase, bool isCurrentDatabaseValid,\n            bool timeoutReached = false) :\n            _results(results),\n            _currentServer(currentServer),\n            _currentDatabase(currentDatabase),\n            _isCurrentServerValid(isCurrentServerValid),\n            _isCurrentDatabaseValid(isCurrentDatabaseValid),\n            _timeoutReached(timeoutReached)\n        { }\n\n        MongoShellExecResult(bool error, std::string const& errorMsg = \"\", bool timeoutReached = false) : \n            _error(error), _errorMessage(errorMsg), _timeoutReached(timeoutReached) { }\n\n        std::vector<MongoShellResult> const& results() const { return _results; }\n        std::string currentServer() const { return _currentServer; }\n        void setCurrentServer(std::string const& server) { _currentServer = server; }\n        std::string currentDatabase() const { return _currentDatabase; }        \n        bool isCurrentServerValid() const { return _isCurrentServerValid; }\n        bool isCurrentDatabaseValid() const { return _isCurrentDatabaseValid; }\n        std::string errorMessage() const { return _errorMessage; }\n        bool error() const { return _error; }\n        bool timeoutReached() const { return _timeoutReached; }\n\n    private:\n        std::vector<MongoShellResult> _results;\n        std::string _currentServer;\n        std::string _currentDatabase;\n        bool _isCurrentServerValid;\n        bool _isCurrentDatabaseValid;\n        std::string _errorMessage;\n        bool _error = false;\n        bool _timeoutReached = false;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoUser.cpp",
    "content": ""
  },
  {
    "path": "src/robomongo/core/domain/MongoUser.h",
    "content": "#pragma once\n#include <mongo/bson/bsonobj.h>\n#include <mongo/bson/bsonelement.h>\n\n#include \"robomongo/core/utils/BsonUtils.h\"\n\nnamespace Robomongo\n{\n    class MongoUser\n    {\n    public:\n        typedef std::vector<std::string> RolesVector;\n\n        explicit MongoUser(const float version, const mongo::BSONObj &obj) :\n            _version(version), _readOnly(false),\n            _name(BsonUtils::getField<mongo::String>(obj, \"user\"))\n        {};\n\n        // Creates new user with empty attributes\n        MongoUser(const float version) :\n             _version(version), _readOnly(false), _roles() {}\n\n        std::string name() const { return _name; }\n        std::string password() const { return _password; }\n        std::vector<std::string> roles() const { return _roles; }\n\n        void setName(const std::string &name) { _name = name; }\n        void setPassword(const std::string &pwd) { _password = pwd; }\n        void setRoles(const std::vector<std::string> &roles) { _roles = roles; }\n\n        std::string userSource() const { return _userSource; }\n        void setUserSource(const std::string &source) { _userSource = source; }\n        bool readOnly() const { return _readOnly; }\n        void setReadOnly(bool readonly) { _readOnly = readonly; }\n\n        float version() const { return _version; }\n        static constexpr float minimumSupportedVersion = 2.4f;\n    private:\n        float _version;\n        std::string _name;\n        bool _readOnly;\n        RolesVector _roles;\n        std::string _password;\n        std::string _userSource;\n    };\n}"
  },
  {
    "path": "src/robomongo/core/domain/MongoUtils.cpp",
    "content": "#include \"robomongo/core/domain/MongoUtils.h\"\n#include <mongo/db/json.h>\nusing namespace std;\n#include \"mongo/util/md5.hpp\"\n\nnamespace Robomongo\n{\n    namespace MongoUtils\n    {\n        QString buildNiceSizeString(double sizeBytes)\n        {\n            if (sizeBytes < 1024 * 100) {\n                double kb = ((double) sizeBytes) / 1024;\n                return QString(\"%1 kb\").arg(kb, 2, 'f', 2);\n            }\n\n            double mb = ((double) sizeBytes) / 1024 / 1024;\n            return QString(\"%1 mb\").arg(mb, 2, 'f', 2);\n        }\n\n        std::string buildPasswordHash(const std::string &username, const std::string &password)\n        {\n            std::string sum = username + \":mongo:\" + password;\n            const char * s = sum.c_str();\n\n            mongo::md5digest d;\n            md5_state_t st;\n            md5_init(&st);\n            md5_append( &st , (const md5_byte_t*)s , strlen( s ) );\n            md5_finish(&st, d);\n\n            return mongo::digestToString(d);\n        }\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/MongoUtils.h",
    "content": "#pragma once\n\n#include <QString>\n\nnamespace Robomongo\n{\n    namespace MongoUtils\n    {\n        QString buildNiceSizeString(double sizeBytes);\n        std::string buildPasswordHash(const std::string &username, const std::string &password);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/Notifier.cpp",
    "content": "#include \"robomongo/core/domain/Notifier.h\"\n\n#include <thread>\n#include <chrono>\n\n#include <QAction>\n#include <QClipboard>\n#include <QApplication>\n#include <QMenu>\n\n#include \"robomongo/core/domain/MongoShell.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/utils/BsonUtils.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/events/MongoEvents.h\"\n\n#include \"robomongo/shell/db/ptimeutil.h\"\n\n#include \"robomongo/gui/MainWindow.h\"\n#include \"robomongo/gui/widgets/workarea/BsonTreeItem.h\"\n#include \"robomongo/gui/dialogs/DocumentTextEditor.h\"\n#include \"robomongo/gui/utils/DialogUtils.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/core/EventBus.h\"\n\nnamespace Robomongo\n{\n    namespace detail\n    {\n        bool isSimpleType(Robomongo::BsonTreeItem const *item)\n        {\n            return BsonUtils::isSimpleType(item->type()) ||\n                   BsonUtils::isUuidType(item->type(), item->binType());\n        }\n\n        bool isObjectIdType(Robomongo::BsonTreeItem *item)\n        {\n            return mongo::jstOID == item->type();\n        }\n\n        bool isMultiSelection(const QModelIndexList &indexes)\n        {\n            return indexes.count() > 1;\n        }\n\n        bool isDocumentType(BsonTreeItem const *item)\n        {\n            return BsonUtils::isDocument(item->type());\n        }\n\n        bool isArrayChild(BsonTreeItem const *item)\n        {\n            return BsonUtils::isArray(dynamic_cast<BsonTreeItem*>(item->parent())->type());\n        }\n\n        bool isDocumentRoot(BsonTreeItem const *item)\n        {\n            return ( item == item->superParent() );\n        }\n\n        /**\n         * \n         * @param QModelIndexList indexes\n         * @param bool returnSuperParents If TRUE, only indexes of super-parents will be in result list\n         * @return QModelIndexList\n         */\n        QModelIndexList uniqueRows(QModelIndexList indexes, bool returnSuperParents)\n        {\n            QModelIndexList result;\n            for (QModelIndexList::const_iterator it = indexes.begin(); it != indexes.end(); ++it)\n            {\n                QModelIndex isUnique = *it;\n                Robomongo::BsonTreeItem *item = Robomongo::QtUtils::item<Robomongo::BsonTreeItem*>(isUnique);\n                if (item) {\n                    for (QModelIndexList::const_iterator jt = result.begin(); jt != result.end(); ++jt)\n                    {\n                        Robomongo::BsonTreeItem *jItem = Robomongo::QtUtils::item<Robomongo::BsonTreeItem*>(*jt);\n                        if (jItem && jItem->superParent() == item->superParent()) {\n                            isUnique = QModelIndex();\n                            break;\n                        }\n                    }\n                    if (isUnique.isValid()) {\n                        if (returnSuperParents) {\n                            // Move index onto \"super parent\" element before pushing it into result set\n                            QModelIndex parent = isUnique.parent();\n                            while (parent != QModelIndex()) {\n                                isUnique = parent;\n                                parent = parent.parent();\n                            }\n                        }\n                        result.append(isUnique);\n                    }\n                }\n            }        \n            return result;\n        }\n    }\n\n    Notifier::Notifier(INotifierObserver *const observer, MongoShell *shell, const MongoQueryInfo &queryInfo, QObject *parent) :\n        BaseClass(parent),\n        _observer(observer),\n        _shell(shell),\n        _queryInfo(queryInfo)\n    {\n        QWidget *wid = dynamic_cast<QWidget*>(_observer);\n        AppRegistry::instance().bus()->subscribe(this, InsertDocumentResponse::Type, _shell->server());\n        AppRegistry::instance().bus()->subscribe(this, RemoveDocumentResponse::Type, _shell->server());\n\n        _deleteDocumentAction = new QAction(\"Delete Document...\", wid);\n        VERIFY(connect(_deleteDocumentAction, SIGNAL(triggered()), SLOT(onDeleteDocument())));\n\n        _deleteDocumentsAction = new QAction(\"Delete Documents...\", wid);\n        VERIFY(connect(_deleteDocumentsAction, SIGNAL(triggered()), SLOT(onDeleteDocuments())));\n\n        _editDocumentAction = new QAction(\"Edit Document...\", wid);\n        VERIFY(connect(_editDocumentAction, SIGNAL(triggered()), SLOT(onEditDocument())));\n\n        _viewDocumentAction = new QAction(\"View Document...\", wid);\n        VERIFY(connect(_viewDocumentAction, SIGNAL(triggered()), SLOT(onViewDocument())));\n\n        _insertDocumentAction = new QAction(\"Insert Document...\", wid);\n        VERIFY(connect(_insertDocumentAction, SIGNAL(triggered()), SLOT(onInsertDocument())));\n\n        _copyValueAction = new QAction(\"Copy Value\", wid);\n        VERIFY(connect(_copyValueAction, SIGNAL(triggered()), SLOT(onCopyDocument())));\n\n        _copyValueNameAction = new QAction(\"Copy Name\", wid);\n        VERIFY(connect(_copyValueNameAction, SIGNAL(triggered()), SLOT(onCopyNameDocument())));\n\n        _copyValuePathAction = new QAction(\"Copy Path\", wid);\n        VERIFY(connect(_copyValuePathAction, SIGNAL(triggered()), SLOT(onCopyPathDocument())));\n\n        _copyTimestampAction = new QAction(\"Copy Timestamp from ObjectId\", wid);\n        VERIFY(connect(_copyTimestampAction, SIGNAL(triggered()), SLOT(onCopyTimestamp())));\n\n        _copyJsonAction = new QAction(\"Copy JSON\", wid);\n        VERIFY(connect(_copyJsonAction, SIGNAL(triggered()), SLOT(onCopyJson())));        \n    }\n\n    void Notifier::initMenu(QMenu *const menu, BsonTreeItem *const item)\n    {\n        bool const isProjection = !_queryInfo._fields.isEmpty();\n        bool const isEditable = _queryInfo._info.isValid() && !isProjection;\n        bool const onItem = item ? true : false;\n        \n        bool isSimple = false;\n        bool isDocument = false;\n        bool isObjectId = false;\n        bool isNotArrayChild = false;\n        bool isRoot = false;\n\n        if (item) {\n            isSimple = detail::isSimpleType(item);\n            isDocument = detail::isDocumentType(item);\n            isObjectId = detail::isObjectIdType(item);\n            isNotArrayChild = !detail::isArrayChild(item);\n            isRoot = detail::isDocumentRoot(item);\n        }\n\n        if (onItem && isEditable) menu->addAction(_editDocumentAction);\n        if (onItem)               menu->addAction(_viewDocumentAction);\n        if (isEditable)           menu->addAction(_insertDocumentAction);\n        if (onItem && (isSimple || isDocument)) menu->addSeparator();\n        if (onItem && isSimple)   menu->addAction(_copyValueAction);\n\n        if (onItem && (isSimple || isDocument) && isNotArrayChild && !isRoot)\n            menu->addAction(_copyValueNameAction);\n\n        if (onItem && (isSimple || isDocument) && !isRoot)\n            menu->addAction(_copyValuePathAction);\n\n        if (onItem && isObjectId) menu->addAction(_copyTimestampAction);\n        if (onItem && isDocument) menu->addAction(_copyJsonAction);\n        if (onItem && isEditable) menu->addSeparator();\n        if (onItem && isEditable) menu->addAction(_deleteDocumentAction);\n    }\n\n    void Notifier::initMultiSelectionMenu(QMenu *const menu)\n    {\n        bool isEditable = _queryInfo._info.isValid();\n\n        if (isEditable) menu->addAction(_insertDocumentAction);\n        if (isEditable) menu->addAction(_deleteDocumentsAction);\n    }\n\n    void Notifier::deleteDocuments(std::vector<BsonTreeItem*> const& items, bool force)\n    {\n        bool isNeededRefresh = false;\n\n        int index = 0;\n        for (auto const * const documentItem : items) {\n            if (!documentItem)\n                break;\n\n            mongo::BSONObj obj = documentItem->superRoot();\n            mongo::BSONElement id = obj.getField(\"_id\");\n\n            if (id.eoo()) {\n                QMessageBox::warning(dynamic_cast<QWidget*>(_observer), \"Cannot delete\", \n                    \"Selected document doesn't have _id field. \\n\"\n                    \"Maybe this is a system document that should be managed in a special way?\");\n                break;\n            }\n\n            mongo::BSONObjBuilder builder;\n            builder.append(id);\n            mongo::BSONObj bsonQuery = builder.obj();\n            mongo::Query query(bsonQuery);\n\n            if (!force) {\n                // Ask user\n                int answer = utils::questionDialog(dynamic_cast<QWidget*>(_observer), \"Delete\",\n                    \"Document\", \"%1 %2 with id:<br><b>%3</b>?\", QtUtils::toQString(id.toString(false)));\n\n                if (answer != QMessageBox::Yes)\n                    break;\n            }\n\n            isNeededRefresh = true;\n\n            RemoveDocumentCount removeCount = items.size() == 1 ? RemoveDocumentCount::ONE :  \n                                                                  RemoveDocumentCount::MULTI;\n            _shell->server()->removeDocuments(query, _queryInfo._info._ns, removeCount, index);\n            ++index;\n            mainWindow()->showQueryWidgetProgressBar();\n        }\n    }\n\n    void Notifier::handle(InsertDocumentResponse *event)\n    {\n        if (event->isError()) { // Error\n            mainWindow()->hideQueryWidgetProgressBar();        \n            if (_shell->server()->connectionRecord()->isReplicaSet()) {\n                // Insert document from tab results window (Notifier, OutputWindow widget)\n                if (EventError::SetPrimaryUnreachable == event->error().errorCode()) {\n                    AppRegistry::instance().bus()->publish(\n                        new ReplicaSetRefreshed(_shell, event->error(), event->error().replicaSetInfo()));\n                }\n            }\n            else  // single server\n                QMessageBox::warning(NULL, \"Database Error\", QString::fromStdString(event->error().errorMessage()));\n\n            return;\n        }\n\n        // Success\n        std::this_thread::sleep_for(std::chrono::milliseconds(100));\n        _shell->query(0, _queryInfo);\n    }\n\n    void Notifier::handle(RemoveDocumentResponse *event)\n    {\n       if (event->isError()) {\n            if (!(event->removeCount == RemoveDocumentCount::MULTI && event->index > 0))\n                QMessageBox::warning(NULL, \"Database Error\", QString::fromStdString(event->error().errorMessage()));\n       }\n       else {   // Success\n           std::this_thread::sleep_for(std::chrono::milliseconds(100));\n           _shell->query(0, _queryInfo);\n       }\n    }\n\n    void Notifier::onCopyNameDocument()\n    {\n        QModelIndex const& selectedInd = _observer->selectedIndex();\n        if (!selectedInd.isValid())\n            return;\n\n        BsonTreeItem const *documentItem = QtUtils::item<BsonTreeItem*>(selectedInd);\n        if (!documentItem)\n            return;\n\n        if (!(detail::isSimpleType(documentItem) || detail::isDocumentType(documentItem) ||\n            !detail::isArrayChild(documentItem) || !detail::isDocumentRoot(documentItem)))\n            return;\n\n        QClipboard *clipboard = QApplication::clipboard();\n        clipboard->setText(QString::fromStdString(documentItem->fieldName()));\n    }\n\n    void Notifier::onCopyPathDocument()\n    {\n        QModelIndex const& selectedInd = _observer->selectedIndex();\n        if (!selectedInd.isValid())\n            return;\n\n        BsonTreeItem const *documentItem = QtUtils::item<BsonTreeItem*>(selectedInd);\n        if (!documentItem)\n            return;\n\n        if (!(detail::isSimpleType(documentItem) || detail::isDocumentType(documentItem) ||\n            !detail::isDocumentRoot(documentItem)))\n            return;\n\n        QStringList namesList;\n        BsonTreeItem const *documentItemHelper = documentItem;\n\n        while (!detail::isDocumentRoot(documentItemHelper)) {\n            if (!detail::isArrayChild(documentItemHelper)) {\n                namesList.push_front(QString::fromStdString(documentItemHelper->fieldName()));\n            }\n\n            documentItemHelper = dynamic_cast<BsonTreeItem*>(documentItemHelper->parent());\n        }\n\n        QClipboard *clipboard = QApplication::clipboard();\n        clipboard->setText(namesList.join(\".\"));\n    }\n\n    MainWindow* Notifier::mainWindow() const\n    {\n        MainWindow* mainWindow;\n        for (auto wid : QApplication::topLevelWidgets()) {\n            if ((mainWindow = qobject_cast<MainWindow*>(wid)))\n                break;\n        }\n        return mainWindow;\n    }\n\n    void Notifier::handleDeleteCommand()\n    {\n        if (_observer->selectedIndexes().count() > 1) \n            onDeleteDocuments();\n        else \n            onDeleteDocument();        \n    }\n\n    void Notifier::onDeleteDocuments()\n    {\n        if (!_queryInfo._info.isValid())\n            return;\n\n        QModelIndexList selectedIndexes = _observer->selectedIndexes();\n        if (!detail::isMultiSelection(selectedIndexes))\n            return;\n\n        int const answer = QMessageBox::question(dynamic_cast<QWidget*>(_observer), \"Delete\", \n                                           QString(\"Do you want to delete %1 selected documents?\").\n                                           arg(selectedIndexes.count()));\n\n        if (QMessageBox::Yes == answer) {\n            std::vector<BsonTreeItem*> items;\n            for (auto index : selectedIndexes) \n                items.push_back(QtUtils::item<BsonTreeItem*>(index));\n            \n            deleteDocuments(items, true);\n        }\n    }\n\n    void Notifier::onDeleteDocument()\n    {\n        if (!_queryInfo._info.isValid())\n            return;\n\n        QModelIndex selectedIndex = _observer->selectedIndex();\n        if (!selectedIndex.isValid())\n            return;\n\n        BsonTreeItem *documentItem = QtUtils::item<BsonTreeItem*>(selectedIndex);\n        std::vector<BsonTreeItem*> vec;\n        vec.push_back(documentItem);\n        return deleteDocuments(vec, false);\n    }\n\n    void Notifier::onEditDocument()\n    {\n        if (!_queryInfo._info.isValid())\n            return;\n\n        QModelIndex selectedInd = _observer->selectedIndex();\n        if (!selectedInd.isValid())\n            return;\n\n        BsonTreeItem *documentItem = QtUtils::item<BsonTreeItem*>(selectedInd);\n        if (!documentItem)\n            return;\n\n        std::string str = BsonUtils::jsonString(documentItem->superRoot(), mongo::TenGen, 1,\n                                                AppRegistry::instance().settingsManager()->uuidEncoding(),\n                                                AppRegistry::instance().settingsManager()->timeZone());\n\n        const QString &json = QtUtils::toQString(str);\n\n        DocumentTextEditor editor(_queryInfo._info, json, false, dynamic_cast<QWidget*>(_observer));\n\n        editor.setWindowTitle(\"Edit Document\");\n        int result = editor.exec();\n\n        if (result == QDialog::Accepted) {\n            _shell->server()->saveDocuments(editor.bsonObj(), _queryInfo._info._ns);\n            mainWindow()->showQueryWidgetProgressBar();\n        }\n    }\n\n    void Notifier::onViewDocument()\n    {\n        QModelIndex selectedIndex = _observer->selectedIndex();\n        if (!selectedIndex.isValid())\n            return;\n\n        BsonTreeItem *documentItem = QtUtils::item<BsonTreeItem*>(selectedIndex);\n        if (!documentItem)\n            return;\n\n        mongo::BSONObj obj = documentItem->superRoot();\n\n        std::string str = BsonUtils::jsonString(obj, mongo::TenGen, 1,\n            AppRegistry::instance().settingsManager()->uuidEncoding(),\n            AppRegistry::instance().settingsManager()->timeZone());\n\n        const QString &json = QtUtils::toQString(str);\n\n        DocumentTextEditor *editor = new DocumentTextEditor(_queryInfo._info,\n            json, true, dynamic_cast<QWidget*>(_observer));\n\n        editor->setWindowTitle(\"View Document\");\n        editor->show();\n    }\n\n    void Notifier::onInsertDocument()\n    {\n        if (!_queryInfo._info.isValid())\n            return;\n\n        DocumentTextEditor editor(_queryInfo._info,\n            \"{\\n    \\n}\", false, dynamic_cast<QWidget*>(_observer));\n\n        editor.setCursorPosition(1, 4);\n        editor.setWindowTitle(\"Insert Document\");\n\n        int result = editor.exec();\n        if (result != QDialog::Accepted)\n            return;\n\n        DocumentTextEditor::ReturnType obj = editor.bsonObj();\n        for (DocumentTextEditor::ReturnType::const_iterator it = obj.begin(); it != obj.end(); ++it) {\n            _shell->server()->insertDocument(*it, _queryInfo._info._ns);\n            mainWindow()->showQueryWidgetProgressBar();\n        }\n    }\n\n    void Notifier::onCopyDocument()\n    {\n        QModelIndex selectedInd = _observer->selectedIndex();\n        if (!selectedInd.isValid())\n            return;\n\n        BsonTreeItem *documentItem = QtUtils::item<BsonTreeItem*>(selectedInd);\n        if (!documentItem)\n            return;\n\n        if (!detail::isSimpleType(documentItem))\n            return;\n\n        QClipboard *clipboard = QApplication::clipboard();\n        clipboard->setText(documentItem->value());\n    }\n\n    void Notifier::onCopyTimestamp()\n    {\n        QModelIndex selectedInd = _observer->selectedIndex();\n        if (!selectedInd.isValid())\n            return;\n\n        BsonTreeItem *documentItem = QtUtils::item<BsonTreeItem*>(selectedInd);\n        if (!documentItem)\n            return;\n\n        if (!detail::isObjectIdType(documentItem))\n            return;\n\n        QClipboard *clipboard = QApplication::clipboard();\n\n        // new Date(parseInt(this.valueOf().slice(0,8), 16)*1000);\n        QString hexTimestamp = documentItem->value().mid(10, 8);\n        bool ok;\n        long long milliTimestamp = (long long)hexTimestamp.toLongLong(&ok, 16)*1000;\n\n        bool isSupportedDate = (miutil::minDate < milliTimestamp) && (milliTimestamp < miutil::maxDate);\n\n        boost::posix_time::ptime epoch(boost::gregorian::date(1970, 1, 1));\n        boost::posix_time::time_duration diff = boost::posix_time::millisec(milliTimestamp);\n        boost::posix_time::ptime time = epoch + diff;\n\n        if (isSupportedDate)\n        {\n            std::string date = miutil::isotimeString(time, false, false);\n            clipboard->setText(\"ISODate(\\\"\"+QString::fromStdString(date)+\"\\\")\");\n        }\n        else {\n            clipboard->setText(\"Error extracting ISODate()\");\n        }\n    }\n\n     void Notifier::onCopyJson()\n     {\n         QModelIndex selectedInd = _observer->selectedIndex();\n         if (!selectedInd.isValid())\n             return;\n\n         BsonTreeItem *documentItem = QtUtils::item<BsonTreeItem*>(selectedInd);\n         if (!documentItem)\n             return;\n\n         if (!detail::isDocumentType(documentItem))\n             return;\n\n         QClipboard *clipboard = QApplication::clipboard();\n         mongo::BSONObj obj = documentItem->root();\n         if (documentItem != documentItem->superParent()) {\n             obj = obj[documentItem->fieldName()].Obj();\n         }\n         bool isArray = BsonUtils::isArray(documentItem->type());\n         std::string str = BsonUtils::jsonString(obj, mongo::TenGen, 1,\n                 AppRegistry::instance().settingsManager()->uuidEncoding(),\n                 AppRegistry::instance().settingsManager()->timeZone(), isArray);\n\n         const QString &json = QtUtils::toQString(str);\n         clipboard->setText(json);\n     }\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/Notifier.h",
    "content": "#pragma once\n\n#include <QModelIndex>\n\n#include \"robomongo/core/domain/MongoQueryInfo.h\"\n\nQT_BEGIN_NAMESPACE\nclass QAction;\nclass QMenu;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class MainWindow;\n    class MongoShell;\n    class BsonTreeItem;\n    class InsertDocumentResponse;\n    struct RemoveDocumentResponse;\n\n    namespace detail\n    {\n        bool isSimpleType(BsonTreeItem const *item);\n        bool isObjectIdType(BsonTreeItem *item);\n        bool isMultiSelection(const QModelIndexList &indexes);\n        bool isDocumentType(BsonTreeItem const *item);\n        QModelIndexList uniqueRows(QModelIndexList indexes, bool returnSuperParents = false);\n    }\n\n    class INotifierObserver\n    {\n    public:\n        virtual QModelIndex selectedIndex() const = 0;\n        virtual QModelIndexList selectedIndexes() const = 0;\n\n    protected:\n        INotifierObserver() {}\n    };\n\n    class Notifier : public QObject\n    {\n        Q_OBJECT\n\n    public:\n        typedef QObject BaseClass;\n        Notifier(INotifierObserver *const observer, MongoShell *shell, const MongoQueryInfo &queryInfo, QObject *parent = NULL);\n        void initMenu(QMenu *const menu, BsonTreeItem *const item);\n        void initMultiSelectionMenu(QMenu *const menu);\n\n        void deleteDocuments(std::vector<BsonTreeItem*> const& items, bool force);\n        void handleDeleteCommand();\n\n    public Q_SLOTS:\n        void onDeleteDocument();\n        void onDeleteDocuments();\n        void onEditDocument();\n        void onViewDocument();\n        void onInsertDocument();\n        void onCopyDocument();\n        void onCopyTimestamp();\n        void onCopyJson();\n        void handle(InsertDocumentResponse *event);\n        void handle(RemoveDocumentResponse *event);\n\n    private Q_SLOTS:\n        void onCopyNameDocument();\n        void onCopyPathDocument();\n\n    private:\n        MainWindow* mainWindow() const;\n\n        QAction *_deleteDocumentAction;\n        QAction *_deleteDocumentsAction;\n        QAction *_editDocumentAction;\n        QAction *_viewDocumentAction;\n        QAction *_insertDocumentAction;\n        QAction *_copyValueAction;\n        QAction *_copyValueNameAction;\n        QAction *_copyValuePathAction;\n        QAction *_copyTimestampAction;\n        QAction *_copyJsonAction;\n        const MongoQueryInfo _queryInfo;\n\n        MongoShell *_shell;\n        INotifierObserver *const _observer;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/ScriptInfo.cpp",
    "content": "#include \"robomongo/core/domain/ScriptInfo.h\"\n\n#include <QTextStream>\n#include <QApplication>\n#include <QMessageBox>\n#include <QFileDialog>\n\nnamespace\n{\n    const QString filterForScripts = QObject::tr(\"JavaScript (*.js);; All Files (*.*)\");\n\n    bool loadFromFileText(const QString &filePath, QString &text)\n    {\n        bool result = false;\n        QFile file(filePath);\n        if (file.open(QFile::ReadOnly | QFile::Text)) {\n            QTextStream in(&file);\n            QApplication::setOverrideCursor(Qt::WaitCursor);\n            text = in.readAll();\n            QApplication::restoreOverrideCursor();\n            result = true;\n        }\n        else {\n            QMessageBox::critical(QApplication::activeWindow(), QString(\"Error\"),\n                QObject::tr(PROJECT_NAME\" can't read from %1:\\n%2.\")\n                    .arg(filePath)\n                    .arg(file.errorString()));\n        }\n\n        return result;\n    }\n\n    bool saveToFileText(QString filePath, const QString &text)\n    {\n        if (filePath.isEmpty())\n            return false;\n\n#ifdef Q_OS_LINUX\n        if (QFileInfo(filePath).suffix().isEmpty()) {\n            filePath += \".js\";\n        }\n#endif\n        bool result = false;\n        QFile file(filePath);\n        if (file.open(QFile::WriteOnly | QFile::Text)) {\n            QTextStream out(&file);\n            QApplication::setOverrideCursor(Qt::WaitCursor);\n            out << text;\n            QApplication::restoreOverrideCursor();\n            result = true;\n        }\n        else {\n            QMessageBox::critical(QApplication::activeWindow(), QString(\"Error\"),\n                QObject::tr(PROJECT_NAME\" can't save to %1:\\n%2.\")\n                    .arg(filePath)\n                    .arg(file.errorString()));\n        }\n\n        return result;\n    }\n}\n\nnamespace Robomongo\n{\n    ScriptInfo::ScriptInfo(const QString &script, bool execute, const std::string &dbname, \n                           const CursorPosition &position, const QString &title, const QString &filePath) :\n        _script(script),\n        _execute(execute),\n        _dbname(dbname),\n        _title(title),\n        _cursor(position),\n        _filePath(filePath) {}\n\n    bool ScriptInfo::loadFromFile(const QString &filePath)\n    {\n        bool result = false;\n        QString filepath = QFileDialog::getOpenFileName(QApplication::activeWindow(), filePath, QString(), filterForScripts);\n        if (!filepath.isEmpty()) {\n            QString out;\n            if (loadFromFileText(filepath, out)) {\n                _script = out;\n                _filePath = filepath;\n                result = true;\n            }\n        }\n        return result;\n    }\n\n    bool ScriptInfo::loadFromFile()\n    {\n        return loadFromFile(_filePath);\n    }\n\n    bool ScriptInfo::saveToFileAs()\n    {\n        QString filepath = QFileDialog::getSaveFileName(QApplication::activeWindow(),\n            QObject::tr(\"Save As\"), _filePath, filterForScripts);\n\n        if (saveToFileText(filepath, _script)) {\n            _filePath = filepath;\n            return true;\n        }\n        return false;\n    }\n\n    bool ScriptInfo::saveToFile()\n    {\n        return _filePath.isEmpty() ? saveToFileAs() : saveToFileText(_filePath, _script);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/domain/ScriptInfo.h",
    "content": "#pragma once\n\n#include <QString>\n\n#include \"robomongo/core/domain/CursorPosition.h\"\n\nnamespace Robomongo\n{\n    class ScriptInfo\n    {\n    public:\n         ScriptInfo(const QString &script, bool execute = false, const std::string &dbname = \"\",\n                   const CursorPosition &position = CursorPosition(),\n                   const QString &title = QString(), const QString &filePath = QString());\n\n        bool execute() const { return _execute; }\n        void setExecutable(bool execute) { _execute = execute; }\n        QString script() const { return _script; }\n        std::string dbname() const { return _dbname; }\n        const QString &title() const { return _title; }\n        const CursorPosition &cursor() const { return _cursor; }\n        void setScript(const QString &script) { _script = script; }\n        QString filePath() const { return _filePath; }\n        bool loadFromFile(const QString &filePath);\n        bool loadFromFile();\n        bool saveToFileAs();\n        bool saveToFile();\n\n    private:\n        QString _script;\n        std::string _dbname;\n        bool _execute;\n        const QString _title;\n        const CursorPosition _cursor;\n        QString _filePath;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/engine/ScriptEngine.cpp",
    "content": "#include \"robomongo/core/engine/ScriptEngine.h\"\n\n#include <QVector> // unable to put this include below. doesn't compile on GCC 4.7.2 and Qt 4.8\n#include <QDir>\n#include <QStringList>\n#include <QRegExp>\n#include <QTextStream>\n#include <QFile>\n#include <QElapsedTimer>\n\n// v0.9\n//#include <third_party/js-1.7/jsapi.h>\n//#include <third_party/js-1.7/jsparse.h>\n//#include <third_party/js-1.7/jsscan.h>\n//#include <third_party/js-1.7/jsstr.h>\n\n#include <mongo/util/assert_util.h>\n#include <mongo/util/exit_code.h>\n#include <mongo/scripting/engine.h>\n\n// v0.9\n//#include <mongo/scripting/engine_spidermonkey.h>\n#include <mongo/scripting/mozjs/engine.h>\n\n#include <mongo/shell/shell_utils.h>\n#include <mongo/base/string_data.h>\n#include <mongo/client/dbclient_base.h>\n#include <pcrecpp.h>\n\n#include \"robomongo/core/events/MongoEvents.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/settings/CredentialSettings.h\"\n#include \"robomongo/core/domain/MongoDocument.h\"\n#include \"robomongo/core/utils/Logger.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace\n{\n    std::vector<std::string> split(const std::string &s, char seperator)\n    {\n        std::vector<std::string> output;\n        std::string::size_type prev_pos = 0, pos = 0;\n        while ((pos = s.find(seperator, pos)) != std::string::npos) {\n            std::string substring(s.substr(prev_pos, pos-prev_pos));\n            output.push_back(substring);\n            prev_pos = ++pos;\n        }\n        output.push_back(s.substr(prev_pos, pos-prev_pos)); // Last word\n        return output;\n    }\n}\n\nnamespace mongo {\n    extern bool isShell;\n    void logProcessDetailsForLogRotate() {}\n}\n\nnamespace Robomongo\n{\n    ScriptEngine::ScriptEngine(ConnectionSettings *connection, int timeoutSec) :\n        _connection(connection),\n        _scope(nullptr),\n        _engine(NULL),\n        _timeoutSec(timeoutSec),\n        _initialized(false),\n        _mutex(QMutex::Recursive) { }\n\n    ScriptEngine::~ScriptEngine()\n    {\n    }\n\n    void ScriptEngine::init(bool isLoadMongoRcJs, const std::string& serverAddr, const std::string& dbName)\n    {\n        QMutexLocker lock(&_mutex);\n\n        std::string connectDatabase = dbName.empty() ? \"test\" : dbName;\n\n        if (_connection->hasEnabledPrimaryCredential())\n            connectDatabase = _connection->primaryCredential()->databaseName();\n\n        std::stringstream ss;\n        auto hostAndPort = serverAddr.empty() ? _connection->hostAndPort().toString() : serverAddr;\n        ss << \"db = connect('\" << hostAndPort << \"/\" << connectDatabase;\n\n//        v0.9\n//        ss << \"db = connect('\" << _connection->serverHost() << \":\" << _connection->serverPort() << _connection->sslInfo() << _connection->sshInfo() << \"/\" << connectDatabase;\n\n        if (!_connection->hasEnabledPrimaryCredential())\n            ss << \"')\";\n        else\n            ss << \"', '\"\n               << _connection->primaryCredential()->userName() << \"', '\"\n               << _connection->primaryCredential()->userPassword() << \"')\";\n\n        {\n            mongo::shell_utils::dbConnect = ss.str();\n\n            // v0.9\n            // mongo::isShell = true;\n\n            mongo::ScriptEngine::setConnectCallback( mongo::shell_utils::onConnect );\n            mongo::ScriptEngine::setup();            \n            mongo::getGlobalScriptEngine()->setScopeInitCallback(mongo::shell_utils::initScope);\n            mongo::getGlobalScriptEngine()->enableJIT(true);\n\n            _scope.reset(mongo::getGlobalScriptEngine()->newScope());\n            _engine = mongo::getGlobalScriptEngine();\n\n            // Load '.mongorc.js' from user's home directory\n            if (isLoadMongoRcJs) {\n                QString mongorcPath = QString(\"%1/.mongorc.js\").arg(QDir::homePath());\n                if (QFile::exists(mongorcPath)) {\n                    _scope->execFile(QtUtils::toStdString(mongorcPath), false, false);\n                }\n            }\n\n            // Load '.robomongorc.js'\n            QString robomongorcPath = QString(\"%1/.robomongorc.js\").arg(QDir::homePath());\n            if (QFile::exists(robomongorcPath)) {\n                _scope->execFile(QtUtils::toStdString(robomongorcPath), false, false);\n            }\n            _failedScope = false;\n        }\n\n        // Esprima ECMAScript parser: http://esprima.org/\n        std::string esprima = loadFile(\":/robomongo/scripts/esprima.js\", true);\n        _scope->exec(esprima, \"(esprima)\", false, true, true);\n\n        // UUID helpers\n        std::string uuidhelpers = loadFile(\":/robomongo/scripts/uuidhelpers.js\", true);\n        _scope->exec(uuidhelpers, \"(uuidhelpers)\", false, true, true);\n\n        // Enable verbose shell reporting\n        _scope->exec(\"_verboseShell = true;\", \"(verboseShell)\", false, false, false);\n\n        // Save original autocomplete function so it can be restored if overwritten by user preference\n        _scope->exec(\"DB.autocompleteOriginal = DB.autocomplete;\", \"(saveOriginalAutocomplete)\", false, false, false);\n\n        // Cache result of original \"DB.autocomplete\"\n        // Cache invalidated by the invalidateDbCollectionsCache() method.\n        std::string const cacheAutocompletion =\n            \"__robomongoAutocompletionCache = null;\"\n            \"DB.autocompleteCached = function(obj) { \"\n            \"   if (__robomongoAutocompletionCache == null) {\"\n            \"       __robomongoAutocompletionCache = DB.autocompleteOriginal(obj);\"\n            \"   }\"\n            \"   return __robomongoAutocompletionCache;\"\n            \"}\";\n\n        _scope->exec(cacheAutocompletion, \"\", false, false, false);\n\n        // Capture aggregate parameters: pipeline, options\n        std::string const aggregateInterceptor =\n            \"__robomongoAggregateUsed = false;\"\n            \"__robomongoAggregate = DBCollection.prototype.aggregate;\"\n            \"__robomongoAggregatePipeline = null;\"\n            \"__robomongoAggregateOptions = null;\"\n            \"DBCollection.prototype.aggregate = function(pipeline, options) { \"\n            \"   __robomongoAggregateUsed = true;\"\n            \"   __robomongoAggregatePipeline = pipeline;\"\n            \"   __robomongoAggregateOptions = options;\"\n            \"   return __robomongoAggregate.call(this, pipeline, options);\"\n            \"}\";\n\n        _scope->exec(aggregateInterceptor, \"\", false, false, false);\n\n        _initialized = true;\n    }\n\n    MongoShellExecResult ScriptEngine::exec(const std::string &originalScript, const std::string &dbName, \n                                            AggrInfo aggrInfo /* = AggrInfo() */)\n    {\n        QMutexLocker lock(&_mutex);\n\n        if (!_scope) {\n            _failedScope = true;\n            return MongoShellExecResult(true, \"Connection error. Uninitialized mongo scope.\");\n        }\n\n        // robomongo shell timeout\n        bool timeoutReached = false;\n\n        /*\n         * Replace all commands ('show dbs', 'use db' etc.) with call\n         * to shellHelper('show', 'dbs') and so on.\n         */\n        std::string stdstr(originalScript);\n\n        pcrecpp::RE re(\"^(show|use|set) (\\\\w+)$\",\n            pcrecpp::RE_Options(PCRE_CASELESS|PCRE_MULTILINE|PCRE_NEWLINE_ANYCRLF));\n\n        re.GlobalReplace(\"shellHelper('\\\\1', '\\\\2');\", &stdstr);\n\n        /*\n         * Statementize (i.e. extract all JavaScript statements from script) and\n         * execute each statement one by one\n         */\n        std::vector<std::string> statements;\n        std::string error;\n        bool result = statementize(stdstr, statements, error);\n\n        if (!result && statements.size() == 0)\n            statements.push_back(\"print(__robomongoResult.error)\");\n\n        std::vector<MongoShellResult> results;\n\n        use(dbName);\n\n        for (auto const& statement : statements) {\n            // clear global objects\n            __objects.clear();\n            __type = \"\";\n            __finished = false;\n            __logs.str(\"\");\n\n            if (true /* ! wascmd */) {\n                try {\n                    bool failed = false;\n                    QElapsedTimer timer;\n                    timer.start();\n                    if ( _scope->exec( statement , \"(shell)\" , false , true , false, _timeoutSec * 1000) ) {\n                         _scope->exec( \"__robomongoLastRes = __lastres__; shellPrintHelper( __lastres__ );\", \n                                      \"(shell2)\" , true , true , false, _timeoutSec * 1000);\n                    }\n                    else   // failed to run script \n                        failed = true;                               \n\n                    qint64 elapsed = timer.elapsed();   // milliseconds \n\n                    if (elapsed > _timeoutSec * 1000)\n                        timeoutReached = true;\n\n                    std::string logs = __logs.str();\n                    std::string answer = logs.c_str();\n                    std::string type = __type.c_str();\n\n                    if (failed && !timeoutReached)\n                        return MongoShellExecResult(true, answer);\n\n                    std::vector<MongoDocumentPtr> docs = MongoDocument::fromBsonObj(__objects);\n\n                    if (!answer.empty() || docs.size() > 0)\n                        results.push_back(\n                            prepareResult(type, answer, docs, elapsed, statement, aggrInfo)\n                        );\n                }\n                catch (const std::exception &e) {\n                    std::cout << \"error:\" << e.what() << std::endl;\n                }\n            }\n        }\n\n        return prepareExecResult(results, timeoutReached);\n    }\n\n    void ScriptEngine::interrupt()\n    {\n        // This operation crash Robomongo\n        // static_cast<mongo::mozjs::MozJSImplScope*>(_scope)->kill();\n\n        // v0.9\n        //mongo::Scope::_interruptFlag = true;\n    }\n\n    void ScriptEngine::use(const std::string &dbName)\n    {\n        QMutexLocker lock(&_mutex);\n\n        if (!dbName.empty()) {\n            std::stringstream ss;\n\n            // Switch to database\n            ss << \"shellHelper.use('\" << dbName << \"');\" << std::endl;\n\n            // Always allow to read from slave\n            ss << \"rs.slaveOk();\" << std::endl;\n\n            _scope->exec(ss.str(), \"(usedb)\", false, true, false);\n        }\n    }\n\n    void ScriptEngine::setBatchSize(int batchSize)\n    {\n        QMutexLocker lock(&_mutex);\n\n        char buff[64] = {0};\n        sprintf(buff, \"DBQuery.shellBatchSize = %d\", batchSize);\n\n        _scope->exec(buff, \"(shellBatchSize)\", false, true, true);\n    }\n\n    void ScriptEngine::ping()\n    {\n        if (!_scope)\n            return;\n\n        QMutexLocker lock(&_mutex);\n        _scope->exec(\"if (db) { db.runCommand({ping:1}); }\", \"(ping)\", false, false, false, 3000);\n    }\n\n    QStringList ScriptEngine::complete(const std::string &prefix, const AutocompletionMode mode)\n    {\n        //if ( prefix.find( '\"' ) != string::npos )\n        //    return;\n\n        try {\n            if (mode == AutocompleteAll)\n                _scope->exec(\"DB.autocomplete = DB.autocompleteCached;\", \"\", false, false, false);\n            else if (mode == AutocompleteNoCollectionNames)\n                _scope->exec(\"DB.autocomplete = function(obj){return [];}\", \"\", false, false, false);\n\n            QStringList results;\n            mongo::BSONObj args = BSON( \"0\" << prefix );\n\n            _scope->invokeSafe( \"function callShellAutocomplete(x) {shellAutocomplete(x)}\", &args, 0, 1000 );\n            mongo::BSONObjBuilder b;\n            _scope->append( b , \"\" , \"__autocomplete__\" );\n            mongo::BSONObj res = b.obj();\n            mongo::BSONObj arr = res.firstElement().Obj();\n\n            mongo::BSONObjIterator i( arr );\n            while ( i.more() ) {\n                mongo::BSONElement e = i.next();\n                results.append(QtUtils::toQString(e.String()));\n            }\n            return results;\n        }\n        catch ( ... ) {\n            return QStringList();\n        }\n        return QStringList();\n    }\n\n    MongoShellResult ScriptEngine::prepareResult(const std::string &type, const std::string &output,\n                                                 const std::vector<MongoDocumentPtr> &objects, qint64 elapsedms,\n                                                 const std::string &statement, AggrInfo aggrInfo /*= AggrInfo()*/)\n    {\n        const char *script =\n            \"__robomongoQuery = false; \\n\"\n            \"__robomongoIsAggregate = false; \\n\"\n            \"__robomongoDbName = '[invalid database]'; \\n\"\n            \"__robomongoServerAddress = '[invalid connection]'; \\n\"\n            \"__robomongoCollectionName = '[invalid collection]'; \\n\"\n            \"if (typeof __robomongoLastRes == 'object' && __robomongoLastRes != null \\n\"\n            \"    && __robomongoLastRes instanceof DBQuery) { \\n\"\n            \"    __robomongoQuery = true; \\n\"\n            \"    __robomongoDbName = __robomongoLastRes._db.getName();\\n \"\n            \"    __robomongoServerAddress = __robomongoLastRes._mongo.host; \\n\"\n            \"    __robomongoCollectionName = __robomongoLastRes._collection._shortName; \\n\"\n            \"    __robomongoQuery = __robomongoLastRes._query; \\n\"\n            \"    __robomongoFields = __robomongoLastRes._fields; \\n\"\n            \"    __robomongoLimit = __robomongoLastRes._limit; \\n\"\n            \"    __robomongoSkip = __robomongoLastRes._skip; \\n\"\n            \"    __robomongoBatchSize = __robomongoLastRes._batchSize; \\n\"\n            \"    __robomongoOptions = __robomongoLastRes._options; \\n\"\n            \"    __robomongoSpecial = __robomongoLastRes._special; \\n\"\n            \"} \\n\"\n            \"else if (typeof __robomongoLastRes == 'object' && __robomongoLastRes != null \\n\"\n            \"         && __robomongoLastRes instanceof DBCommandCursor \\n\"\n            \"         && __robomongoAggregateUsed) { \\n\"\n            \"    __robomongoAggregateUsed = false; \\n\"    \n            \"    __robomongoIsAggregate = true; \\n\"\n            \"    __robomongoDbName = __robomongoLastRes._db.getName();\\n \"\n            \"    __robomongoServerAddress = __robomongoLastRes._db._mongo.host; \\n\"\n            \"    __robomongoCollectionName = __robomongoLastRes._collName; \\n\"\n            \"} \\n\"\n            ;\n\n        _scope->exec(script, \"(getresultinfo)\", false, false, false);\n        bool const isQuery = _scope->getBoolean(\"__robomongoQuery\");\n        bool const isAggregate = _scope->getBoolean(\"__robomongoIsAggregate\");\n\n        if (isQuery) {\n            std::string serverAddress = getString(\"__robomongoServerAddress\");\n            std::string dbName = getString(\"__robomongoDbName\");\n            std::string collectionName = getString(\"__robomongoCollectionName\");\n               \n            mongo::BSONObj query = _scope->getObject(\"__robomongoQuery\");\n            mongo::BSONObj fields = _scope->getObject(\"__robomongoFields\");\n\n            int limit = _scope->getNumberInt(\"__robomongoLimit\");\n            int skip = _scope->getNumberInt(\"__robomongoSkip\");\n            int batchSize = _scope->getNumberInt(\"__robomongoBatchSize\");\n            int options = _scope->getNumberInt(\"__robomongoOptions\");\n\n            bool special = _scope->getBoolean(\"__robomongoSpecial\");\n\n            MongoQueryInfo const info{ CollectionInfo(serverAddress, dbName, collectionName),\n                                       query, fields, limit, skip, batchSize, options, special };\n            return MongoShellResult(type, output, objects, info, statement, elapsedms);\n        }\n        else if (isAggregate) {\n            std::string const serverAddress = getString(\"__robomongoServerAddress\");\n            std::string const dbName = getString(\"__robomongoDbName\");\n            std::string const collectionName = getString(\"__robomongoCollectionName\");\n            mongo::BSONObj const pipeline = _scope->getObject(\"__robomongoAggregatePipeline\");\n            mongo::BSONObj const options = _scope->getObject(\"__robomongoAggregateOptions\");\n\n            // This query can be paging of an original aggr. query, we store the original/unpaged \n            // pipeline object here.\n            mongo::BSONObj const origPipeline = aggrInfo.isValid ? aggrInfo.pipeline : pipeline;\n            int const skip = aggrInfo.isValid ? aggrInfo.skip : 0;\n            int const batchSize = aggrInfo.isValid ? aggrInfo.batchSize : 50;\n            int const resultIndex = aggrInfo.isValid ? aggrInfo.resultIndex : -1;\n\n            AggrInfo const newAggrInfo { collectionName, skip, batchSize, origPipeline, options, resultIndex };\n            return MongoShellResult(type, output, objects, MongoQueryInfo(), statement, elapsedms, newAggrInfo);\n        }\n        return MongoShellResult(type, output, objects, MongoQueryInfo(), statement, elapsedms);\n    }\n\n    MongoShellExecResult ScriptEngine::prepareExecResult(const std::vector<MongoShellResult> &results, \n                                                         bool timeoutReached /* = false */)\n    {\n        const char *script =\n            \"__robomongoServerAddress = '[invalid connection]'; \\n\"\n            \"__robomongoServerIsValid = false; \\n\"\n            \"__robomongoDbName = '[invalid database]'; \\n\"\n            \"__robomongoDbIsValid = false; \\n\"\n            \"if (typeof db == 'object' && db != null && db instanceof DB) { \\n\"\n            \"    __robomongoServerAddress = db.getMongo().host; \\n\"\n            \"    __robomongoServerIsValid = true; \\n\"\n            \"    __robomongoDbName = db.getName();\\n \"\n            \"    __robomongoDbIsValid = true; \\n \"\n            \"} \\n\";\n\n        _scope->exec(script, \"(getdbname)\", false, false, false);\n\n        std::string serverName = getString(\"__robomongoServerAddress\");\n        bool serverIsValid = _scope->getBoolean(\"__robomongoServerIsValid\");\n\n        std::string dbName = getString(\"__robomongoDbName\");\n        bool dbIsValid = _scope->getBoolean(\"__robomongoDbIsValid\");\n\n        return MongoShellExecResult(results, serverName, serverIsValid, dbName, dbIsValid, timeoutReached);\n    }\n\n    std::string ScriptEngine::getString(const char *fieldName)\n    {\n        return _scope->getString(fieldName);\n    }\n\n    bool ScriptEngine::statementize(\n        const std::string &script, std::vector<std::string> &outVec, std::string &outError)\n    {\n        _scope->setString(\"__robomongoEsprima\", script.c_str());\n\n        mongo::StringData const data {\n            \"var __robomongoResult = {};\"\n            \"try {\"\n                \"__robomongoResult.result = esprima.parse(__robomongoEsprima, { range: true, loc : true });\"\n            \"} catch(e) {\"\n                \"__robomongoResult.error = e.name + ': ' + e.message;\"\n            \"}\"\n            \"__robomongoResult;\"\n        };\n\n        if(!_scope->exec(data, \"(esprima2)\", false, true, false)) {\n            sendLog(this, LogEvent::RBM_ERROR, \"ScriptEngine: Scope failed. Resetting scope.\");\n            _scope->reset();\n            sendLog(this, LogEvent::RBM_INFO, \"ScriptEngine: Scope reset complete.\");\n            _scope->exec(data, \"(esprima2)\", false, true, false);\n        }\n\n        mongo::BSONObj const obj = _scope->getObject(\"__lastres__\");\n        if (obj.hasField(\"error\")) {\n            outError = obj.getField(\"error\");\n            return false;\n        }\n\n        for (auto const& bsonElem : obj.getField(\"result\").Obj().getField(\"body\").Array())\n        {\n            mongo::BSONObj const item = bsonElem.Obj();\n            std::vector<mongo::BSONElement> const range = item.getField(\"range\").Array();\n            auto const from = static_cast<int>(range.at(0).number());\n            auto const till = static_cast<int>(range.at(1).number());\n\n            QString const qScript = QtUtils::toQString(script);\n            std::string statement = qScript.mid(from, till - from).toStdString();\n            outVec.push_back(statement);\n        }\n\n        return true;\n    }\n\n    void ScriptEngine::invalidateDbCollectionsCache() {\n        if (!_initialized)\n            return;\n\n        _scope->exec(\"__robomongoAutocompletionCache = null;\", \"\", false, false, false);\n    }\n\n    std::string ScriptEngine::loadFile(const QString &path, bool throwOnError) {\n        QFile file(path);\n        if (!file.open(QIODevice::ReadOnly)) {\n            if (throwOnError)\n                throw std::runtime_error(\"Unable to load file\");\n\n            return \"\";\n        }\n\n        QTextStream in(&file);\n        QString content = in.readAll();\n        return QtUtils::toStdString(content);\n    }\n}\n\n"
  },
  {
    "path": "src/robomongo/core/engine/ScriptEngine.h",
    "content": "#pragma once\n\n#include <QObject>\n#include <QMutex>\n#include <mongo/scripting/engine.h>\n//#include <third_party/js-1.7/jsparse.h>\n\n#include \"robomongo/core/domain/MongoShellResult.h\"\n#include \"robomongo/core/Enums.h\"\n\nnamespace Robomongo\n{\n    class ConnectionSettings;\n\n    class ScriptEngine : public QObject\n    {\n        Q_OBJECT\n\n    public:\n        ScriptEngine(ConnectionSettings *connection, int timeoutSec);\n        ~ScriptEngine();\n\n        void init(bool isLoadMongoJs, const std::string& serverAddr = \"\", const std::string& dbName = \"\");\n        MongoShellExecResult exec(const std::string &script, const std::string &dbName = std::string(),\n                                  AggrInfo aggrInfo = AggrInfo());\n        void interrupt();\n\n        void use(const std::string &dbName);\n        void setBatchSize(int batchSize);\n        void ping();\n        QStringList complete(const std::string &prefix, const AutocompletionMode mode);\n\n        void invalidateDbCollectionsCache();\n\n        bool failedScope() const { return _failedScope; }\n\n        void changeTimeout(int newTimeout) { _timeoutSec = newTimeout; }\n\n    private:\n        ConnectionSettings *_connection;\n\n        MongoShellResult prepareResult(const std::string &type, const std::string &output, \n                                       const std::vector<MongoDocumentPtr> &objects, qint64 elapsedms,\n                                       const std::string &statement, AggrInfo aggrInfo = AggrInfo());\n\n        MongoShellExecResult prepareExecResult(\n            const std::vector<MongoShellResult> &results, bool timeoutReached = false);\n\n        std::string loadFile(const QString &path, bool throwOnError);\n        std::string getString(const char *fieldName);\n        bool statementize(\n            const std::string &script, std::vector<std::string> &outVec, std::string &outError);\n\n        int _timeoutSec;\n        mongo::ScriptEngine *_engine;\n        std::unique_ptr<mongo::Scope> _scope; // MozJSProxyScope\n        bool _failedScope = false;\n        QMutex _mutex;\n        bool _initialized;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/events/MongoEvents.cpp",
    "content": "#include \"robomongo/core/events/MongoEvents.h\"\n#include \"robomongo/core/Core.h\"\n\nnamespace Robomongo\n{\n    R_REGISTER_EVENT(EstablishConnectionRequest)\n    R_REGISTER_EVENT(EstablishConnectionResponse)\n    R_REGISTER_EVENT(ReplicaSetRefreshed)\n    R_REGISTER_EVENT(RefreshReplicaSetFolderRequest)\n    R_REGISTER_EVENT(RefreshReplicaSetFolderResponse)\n    R_REGISTER_EVENT(ReplicaSetFolderLoading)\n    R_REGISTER_EVENT(ReplicaSetFolderRefreshed)\n    R_REGISTER_EVENT(LoadDatabaseNamesRequest)\n    R_REGISTER_EVENT(LoadDatabaseNamesResponse)\n    R_REGISTER_EVENT(LoadCollectionNamesRequest)\n    R_REGISTER_EVENT(LoadCollectionNamesResponse)\n    R_REGISTER_EVENT(LoadUsersRequest)\n    R_REGISTER_EVENT(LoadCollectionIndexesRequest)\n    R_REGISTER_EVENT(LoadCollectionIndexesResponse)\n    R_REGISTER_EVENT(AddEditIndexRequest)\n    R_REGISTER_EVENT(AddEditIndexResponse)\n    R_REGISTER_EVENT(DropCollectionIndexRequest)\n    R_REGISTER_EVENT(DropCollectionIndexResponse)\n    R_REGISTER_EVENT(LoadUsersResponse)\n    R_REGISTER_EVENT(LoadFunctionsRequest)\n    R_REGISTER_EVENT(LoadFunctionsResponse)\n    R_REGISTER_EVENT(ConnectingEvent)\n    R_REGISTER_EVENT(ConnectionFailedEvent)\n    R_REGISTER_EVENT(ConnectionEstablishedEvent)\n    R_REGISTER_EVENT(DatabaseListLoadedEvent)\n    R_REGISTER_EVENT(OpeningShellEvent)\n    R_REGISTER_EVENT(ExecuteQueryRequest)\n    R_REGISTER_EVENT(ExecuteQueryResponse)\n    R_REGISTER_EVENT(DocumentListLoadedEvent)\n    R_REGISTER_EVENT(ExecuteScriptRequest)\n    R_REGISTER_EVENT(ExecuteScriptResponse)\n    R_REGISTER_EVENT(AutocompleteRequest)\n    R_REGISTER_EVENT(AutocompleteResponse)\n    R_REGISTER_EVENT(ScriptExecutedEvent)\n    R_REGISTER_EVENT(ScriptExecutingEvent)\n    R_REGISTER_EVENT(InsertDocumentRequest)\n    R_REGISTER_EVENT(InsertDocumentResponse)\n    R_REGISTER_EVENT(RemoveDocumentRequest)\n    R_REGISTER_EVENT(RemoveDocumentResponse)\n    R_REGISTER_EVENT(CreateDatabaseRequest)\n    R_REGISTER_EVENT(CreateDatabaseResponse)\n    R_REGISTER_EVENT(DropDatabaseRequest)\n    R_REGISTER_EVENT(DropDatabaseResponse)\n    R_REGISTER_EVENT(CreateCollectionRequest)\n    R_REGISTER_EVENT(CreateCollectionResponse)\n    R_REGISTER_EVENT(DropCollectionRequest)\n    R_REGISTER_EVENT(DropCollectionResponse)\n    R_REGISTER_EVENT(RenameCollectionRequest)\n    R_REGISTER_EVENT(RenameCollectionResponse)\n    R_REGISTER_EVENT(DuplicateCollectionRequest)\n    R_REGISTER_EVENT(DuplicateCollectionResponse)\n    R_REGISTER_EVENT(CopyCollectionToDiffServerRequest)\n    R_REGISTER_EVENT(CopyCollectionToDiffServerResponse)\n    R_REGISTER_EVENT(CreateUserRequest)\n    R_REGISTER_EVENT(CreateUserResponse)\n    R_REGISTER_EVENT(DropUserRequest)\n    R_REGISTER_EVENT(DropUserResponse)\n    R_REGISTER_EVENT(CreateFunctionRequest)\n    R_REGISTER_EVENT(CreateFunctionResponse)\n    R_REGISTER_EVENT(DropFunctionRequest)\n    R_REGISTER_EVENT(DropFunctionResponse)\n    R_REGISTER_EVENT(QueryWidgetUpdatedEvent)\n    R_REGISTER_EVENT(EstablishSshConnectionRequest)\n    R_REGISTER_EVENT(EstablishSshConnectionResponse)\n    R_REGISTER_EVENT(ListenSshConnectionRequest)\n    R_REGISTER_EVENT(ListenSshConnectionResponse)\n    R_REGISTER_EVENT(LogEvent)\n    R_REGISTER_EVENT(StopScriptRequest)\n    R_REGISTER_EVENT(OperationFailedEvent)\n}\n"
  },
  {
    "path": "src/robomongo/core/events/MongoEvents.h",
    "content": "#pragma once\n\n#include <QMessageBox>\n#include <QString>\n#include <QStringList>\n#include <QEvent>\n#include <mongo/client/dbclient_base.h>\n\n#include \"robomongo/core/domain/MongoShellResult.h\"\n#include \"robomongo/core/domain/CursorPosition.h\"\n#include \"robomongo/core/domain/MongoUser.h\"\n#include \"robomongo/core/domain/MongoFunction.h\"\n#include \"robomongo/core/events/MongoEventsInfo.h\"\n#include \"robomongo/core/domain/MongoAggregateInfo.h\"\n#include \"robomongo/core/Event.h\"\n#include \"robomongo/core/Enums.h\"\n#include \"robomongo/core/mongodb/ReplicaSet.h\"\n\nnamespace Robomongo\n{\n    class MongoServer;\n    class MongoShell;\n    class MongoDatabase;\n    class MongoWorker;\n    class ConnectionSettings;\n    class SshTunnelWorker;\n\n    /**\n     * @brief EstablishConnection\n     */\n\n    struct EstablishConnectionRequest : public Event\n    {\n        R_EVENT\n\n            EstablishConnectionRequest(QObject *sender, ConnectionType connectionType, std::string const& uuid) :\n            Event(sender),\n            connectionType(connectionType),\n            uuid(uuid) {}\n\n        ConnectionType const connectionType;\n        std::string const uuid;\n    };\n\n    struct EstablishConnectionResponse : public Event\n    {\n        R_EVENT\n\n        enum ErrorReason {\n            NoError             = 0,\n            MongoConnection     = 1,\n            MongoAuth           = 2,\n            MongoSslConnection  = 3\n        };\n\n        EstablishConnectionResponse(QObject *sender, const ConnectionInfo &info, ConnectionType connectionType, \n                                    const ReplicaSet& replicaSet) :\n            Event(sender),\n            info(info),\n            connectionType(connectionType),\n            replicaSet(replicaSet)\n            {}\n\n        EstablishConnectionResponse(QObject *sender, const EventError &error, ConnectionType connectionType, \n                                    ConnectionInfo const& info, const ReplicaSet& replicaSet, ErrorReason errorReason) :\n            Event(sender, error),\n            info(info),\n            connectionType(connectionType),\n            errorReason(errorReason),\n            replicaSet(replicaSet)\n        {}\n\n        ConnectionInfo const info;\n        ConnectionType const connectionType;\n        ErrorReason const errorReason = NoError;\n        ReplicaSet const replicaSet;\n    };\n\n    struct ReplicaSetRefreshed : public Event\n    {\n        R_EVENT\n\n        ReplicaSetRefreshed(QObject *sender) :\n            Event(sender) {}\n\n        ReplicaSetRefreshed(QObject *sender, const EventError &error, ReplicaSet const& replicaSet) :\n            Event(sender, error), replicaSet(replicaSet) {}\n\n        ReplicaSet const replicaSet;\n    };\n\n    struct RefreshReplicaSetFolderRequest : public Event\n    {\n        R_EVENT\n\n        RefreshReplicaSetFolderRequest(QObject *sender, bool expanded) :\n            Event(sender), expanded(expanded) {}\n\n        bool const expanded = false;\n    };\n\n    struct RefreshReplicaSetFolderResponse : public Event\n    {\n        R_EVENT\n\n        // Primary is reachable\n        RefreshReplicaSetFolderResponse(QObject *sender, ReplicaSet const& replicaSet, bool expanded) :\n            Event(sender), replicaSet(replicaSet), expanded(expanded) {}\n        \n        // Primary is unreachable, secondary(ies) might be reachable\n        RefreshReplicaSetFolderResponse(QObject *sender, ReplicaSet const&  replicaSet, bool expanded,\n                                        const EventError &error) :\n            Event(sender, error), replicaSet(replicaSet), expanded(expanded) {}\n\n        ReplicaSet const replicaSet;\n        bool const expanded = false;\n    };\n\n    struct ReplicaSetFolderLoading : public Event\n    {\n        R_EVENT\n\n            ReplicaSetFolderLoading(QObject *sender) :\n            Event(sender) {}\n    };\n\n    struct ReplicaSetFolderRefreshed : public Event\n    {\n        R_EVENT\n\n        ReplicaSetFolderRefreshed(QObject *sender, bool expanded) :\n            Event(sender), expanded(expanded) {}\n\n        ReplicaSetFolderRefreshed(QObject *sender, const EventError &error, bool expanded) :\n            Event(sender, error), expanded(expanded) {}\n\n        ReplicaSetFolderRefreshed(QObject *sender, const EventError &error, ReplicaSet const& replicaSet,\n                                  bool expanded) :\n            Event(sender, error), replicaSet(replicaSet), expanded(expanded) {}\n\n        ReplicaSet const replicaSet;\n        bool const expanded = false;\n    };\n\n    /**\n     * @brief LoadDatabaseNames\n     */\n\n    class LoadDatabaseNamesRequest : public Event\n    {\n        R_EVENT\n\n        LoadDatabaseNamesRequest(QObject *sender) :\n            Event(sender) {}\n    };\n\n    class LoadDatabaseNamesResponse : public Event\n    {\n        R_EVENT\n\n        LoadDatabaseNamesResponse(QObject *sender, const std::vector<std::string> &databaseNames) :\n            Event(sender),\n            databaseNames(databaseNames) {}\n\n        LoadDatabaseNamesResponse(QObject *sender, const EventError &error) :\n            Event(sender, error) {}\n\n        std::vector<std::string> databaseNames;\n    };\n\n\n    /**\n     * @brief LoadCollectionNames\n     */\n\n    class LoadCollectionNamesRequest : public Event\n    {\n        R_EVENT\n\n    public:\n        LoadCollectionNamesRequest(QObject *sender, const std::string &databaseName) :\n            Event(sender),\n            _databaseName(databaseName) {}\n\n        std::string databaseName() const { return _databaseName; }\n\n    private:\n        std::string _databaseName;\n    };\n\n    class LoadCollectionNamesResponse : public Event\n    {\n        R_EVENT\n\n    public:\n        LoadCollectionNamesResponse(QObject *sender, const std::string &databaseName,\n                                    const std::vector<MongoCollectionInfo> &collectionInfos) :\n            Event(sender),\n            _databaseName(databaseName),\n            _collectionInfos(collectionInfos) { }\n\n        LoadCollectionNamesResponse(QObject *sender, const EventError &error) :\n            Event(sender, error) {}\n\n        std::string databaseName() const { return _databaseName; }\n        std::vector<MongoCollectionInfo> collectionInfos() const { return _collectionInfos; }\n\n    private:\n        std::string _databaseName;\n        std::vector<MongoCollectionInfo> _collectionInfos;\n    };\n\n    class LoadCollectionIndexesRequest : public Event\n    {\n        R_EVENT\n    public:\n        LoadCollectionIndexesRequest(QObject *sender, const MongoCollectionInfo &collection) :\n        Event(sender), _collection(collection) {}\n        MongoCollectionInfo collection() const { return _collection; }\n    private:\n        const MongoCollectionInfo _collection;\n    };\n\n    class LoadCollectionIndexesResponse : public Event\n    {\n        R_EVENT\n    public:\n        LoadCollectionIndexesResponse(QObject *sender, const std::vector<IndexInfo> &indexes) :\n            Event(sender), _indexes(indexes) {}\n\n        LoadCollectionIndexesResponse(QObject *sender, const EventError &error) :\n            Event(sender, error) {}\n        std::vector<IndexInfo> indexes() const { return _indexes; }\n    private:\n        std::vector<IndexInfo> _indexes;\n    };\n\n    class AddEditIndexRequest : public Event\n    {\n        R_EVENT\n            AddEditIndexRequest(QObject *sender, const IndexInfo &oldInfo, const IndexInfo &newInfo)\n            : Robomongo::Event(sender), oldInfo_(oldInfo), newInfo_(newInfo) {}\n        const IndexInfo &oldInfo() const\n        {\n            return oldInfo_;\n        }\n        const IndexInfo &newInfo() const\n        {\n            return newInfo_;\n        }\n    private:\n        const IndexInfo oldInfo_;\n        const IndexInfo newInfo_;\n    };\n\n    struct AddEditIndexResponse : public Event\n    {\n        R_EVENT\n    \n        AddEditIndexResponse(QObject *sender, const IndexInfo &oldIndex, const IndexInfo &newIndex)\n            : Event(sender), oldIndex_(oldIndex), newIndex_(newIndex)\n        {}\n\n        AddEditIndexResponse(QObject *sender, const EventError &error, \n            const IndexInfo &oldIndex, const IndexInfo &newIndex) \n            : Event(sender, error), oldIndex_(oldIndex), newIndex_(newIndex)\n        {}\n    \n        const IndexInfo oldIndex_;\n        const IndexInfo newIndex_;\n    };\n\n    class DropCollectionIndexRequest : public Event\n    {\n        R_EVENT\n    public:\n        DropCollectionIndexRequest(QObject *sender, const MongoCollectionInfo &collection, \n            const std::string &index) \n            : Event(sender), _collection(collection), _index(index) \n        {}\n\n        MongoCollectionInfo collection() const { return _collection; }\n        std::string index() const { return _index; }\n    private:\n        const MongoCollectionInfo _collection;\n        std::string _index;  // todo: rename to index\n    };\n\n    class DropCollectionIndexResponse: public Event\n    {\n        R_EVENT\n    public:\n        DropCollectionIndexResponse(QObject *sender, const MongoCollectionInfo &collection, \n                                    const std::string &index) \n            : Event(sender), _collection(collection), _index(index) \n        {}\n\n        DropCollectionIndexResponse(QObject *sender, const EventError &error, \n                                    const std::string &index)\n            : Event(sender, error), _index(index) \n        {}\n\n        MongoCollectionInfo collection() const { return _collection; }\n        std::string index() const { return _index; }\n    private:\n        MongoCollectionInfo _collection;\n        std::string _index;\n    };\n\n    /**\n     * @brief Load Users\n     */\n\n    class LoadUsersRequest : public Event\n    {\n        R_EVENT\n\n    public:\n        LoadUsersRequest(QObject *sender, const std::string &databaseName) :\n            Event(sender),\n            _databaseName(databaseName) {}\n\n        std::string databaseName() const { return _databaseName; }\n\n    private:\n        std::string _databaseName;\n    };\n\n    class LoadUsersResponse : public Event\n    {\n        R_EVENT\n\n    public:\n        LoadUsersResponse(QObject *sender, const std::string &databaseName,\n                                    const std::vector<MongoUser> &users) :\n            Event(sender),\n            _databaseName(databaseName),\n            _users(users) { }\n\n        LoadUsersResponse(QObject *sender, const EventError &error) :\n            Event(sender, error) {}\n\n        std::string databaseName() const { return _databaseName; }\n        std::vector<MongoUser> users() const { return _users; }\n\n    private:\n        std::string _databaseName;\n        std::vector<MongoUser> _users;\n    };\n\n\n    /**\n     * @brief Load Functions\n     */\n\n    class LoadFunctionsRequest : public Event\n    {\n        R_EVENT\n\n    public:\n        LoadFunctionsRequest(QObject *sender, const std::string &databaseName) :\n            Event(sender),\n            _databaseName(databaseName) {}\n\n        std::string databaseName() const { return _databaseName; }\n\n    private:\n        std::string _databaseName;\n    };\n\n    class LoadFunctionsResponse : public Event\n    {\n        R_EVENT\n\n    public:\n        LoadFunctionsResponse(QObject *sender, const std::string &databaseName,\n                                    const std::vector<MongoFunction> &functions) :\n            Event(sender),\n            _databaseName(databaseName),\n            _functions(functions) { }\n\n        LoadFunctionsResponse(QObject *sender, const EventError &error) :\n            Event(sender, error) {}\n\n        std::string databaseName() const { return _databaseName; }\n        std::vector<MongoFunction> functions() const { return _functions; }\n\n    private:\n        std::string _databaseName;\n        std::vector<MongoFunction> _functions;\n    };\n\n    /**\n     * @brief InsertDocument\n     */\n\n    class InsertDocumentRequest : public Event\n    {\n        R_EVENT\n\n    public:\n        InsertDocumentRequest(QObject *sender, const mongo::BSONObj &obj, const MongoNamespace &ns, bool overwrite = false) :\n            Event(sender),\n            _obj(obj),\n            _ns(ns),\n            _overwrite(overwrite) {}\n\n        mongo::BSONObj obj() const { return _obj; }\n        MongoNamespace ns() const { return _ns; }\n        bool overwrite() const { return _overwrite; }\n\n    private:\n        mongo::BSONObj _obj;\n        const MongoNamespace _ns;\n        bool _overwrite;\n    };\n\n    class InsertDocumentResponse : public Event\n    {\n        R_EVENT\n\n    public:\n        InsertDocumentResponse(QObject *sender) :\n            Event(sender) {}\n\n        InsertDocumentResponse(QObject *sender, EventError const& error) :\n            Event(sender, error) {}\n    };\n\n    /**\n     * @brief Remove Document\n     */\n\n    enum class RemoveDocumentCount { ONE, MULTI, ALL };\n\n    class RemoveDocumentRequest : public Event\n    {\n        R_EVENT\n\n    public:\n        RemoveDocumentRequest(QObject *sender, mongo::Query query, const MongoNamespace &ns, \n                              RemoveDocumentCount removeCount, int index) :\n            Event(sender),\n            _query(query),\n            _ns(ns),\n            _removeCount(removeCount),\n            _index(index) {}\n\n        mongo::Query query() const { return _query; }\n        MongoNamespace ns() const { return _ns; }\n        RemoveDocumentCount removeCount() const { return _removeCount; }\n        int index() const { return _index; }\n\n    private:\n        mongo::Query const _query;\n        MongoNamespace const _ns;\n        RemoveDocumentCount const _removeCount;\n        // if this is a multi remove, this is the index of current document deleted. 0 for first document.\n        int const _index;     \n    };\n\n    struct RemoveDocumentResponse : public Event\n    {\n        R_EVENT\n\n        RemoveDocumentResponse(QObject *sender, RemoveDocumentCount removeCount, int index) :\n            Event(sender), removeCount(removeCount), index(index) {}\n\n        RemoveDocumentResponse(QObject *sender, const EventError &error, RemoveDocumentCount removeCount, int index) :\n            Event(sender, error), removeCount(removeCount), index(index) {}\n\n        RemoveDocumentCount const removeCount;\n        int const index;\n    };\n\n    /**\n     * @brief Create Database\n     */\n\n    class CreateDatabaseRequest : public Event\n    {\n        R_EVENT\n\n    public:\n        CreateDatabaseRequest(QObject *sender, const std::string &database) :\n            Event(sender),\n            _database(database) {}\n\n        std::string database() const { return _database; }\n\n    private:\n        std::string const _database;\n    };\n\n    struct CreateDatabaseResponse : public Event\n    {\n        R_EVENT\n\n        CreateDatabaseResponse(QObject *sender, const std::string &database) :\n            Event(sender), database(database) {}\n\n        CreateDatabaseResponse(QObject *sender, const std::string &database, const EventError &error) :\n            Event(sender, error), database(database) {}\n\n        std::string const database;\n    };\n\n\n    /**\n     * @brief Drop Database\n     */\n\n    struct DropDatabaseRequest : public Event\n    {\n        R_EVENT\n\n        DropDatabaseRequest(QObject *sender, const std::string &database) :\n            Event(sender), database(database) {}\n\n        std::string const database;\n    };\n\n    struct DropDatabaseResponse : public Event\n    {\n        R_EVENT\n\n    public:\n        DropDatabaseResponse(QObject *sender, const std::string &database) :\n            Event(sender), database(database) {}\n\n        DropDatabaseResponse(QObject *sender, const std::string &database, const EventError &error) :\n            Event(sender, error), database(database) {}\n\n        std::string const database;\n    };\n\n    /**\n     * @brief Create Collection\n     */\n\n    class CreateCollectionRequest : public Event\n    {\n        R_EVENT\n\n    public:\n        CreateCollectionRequest(QObject *sender, const MongoNamespace &ns, \n                                                 const mongo::BSONObj& extraOptions,\n                                                 long long size = 0,\n                                                 bool capped = false,\n                                                 int maxDocNum = 0\n                                                 ) :\n            Event(sender), _ns(ns), _extraOptions(extraOptions),\n            _size(size), _capped(capped), _maxDocNum(maxDocNum) {}\n\n        MongoNamespace ns() const { return _ns; }\n        long long getSize() const { return _size; }\n        bool getCapped() const { return _capped; }\n        int getMaxDocNum() const { return _maxDocNum; }\n        const mongo::BSONObj getExtraOptions() const { return _extraOptions; }\n\n    private:\n        MongoNamespace const _ns;\n        long long const _size;\n        bool const _capped;\n        int const _maxDocNum;\n        mongo::BSONObj const _extraOptions;\n    };\n\n    struct CreateCollectionResponse : public Event\n    {\n        R_EVENT\n\n        CreateCollectionResponse(QObject *sender, std::string const& collection) :\n        Event(sender), collection(collection) {}\n\n        CreateCollectionResponse(QObject *sender, std::string const& collection, const EventError &error) :\n            Event(sender, error), collection(collection) {}\n\n        std::string const collection;\n    };\n\n\n\n    /**\n     * @brief Drop Collection\n     */\n\n    class DropCollectionRequest : public Event\n    {\n        R_EVENT\n\n    public:\n        DropCollectionRequest(QObject *sender, const MongoNamespace &ns) :\n            Event(sender),\n            _ns(ns) {}\n\n        MongoNamespace ns() const { return _ns; }\n\n    private:\n        MongoNamespace _ns;\n    };\n\n    struct DropCollectionResponse : public Event\n    {\n        R_EVENT\n\n    public:\n        DropCollectionResponse(QObject *sender, std::string const& collection) :\n            Event(sender), collection(collection) {}\n\n        DropCollectionResponse(QObject *sender, std::string const& collection, const EventError &error) :\n            Event(sender, error), collection(collection) {}\n\n        std::string const collection;\n    };\n\n    /**\n     * @brief Rename Collection\n     */\n\n    class RenameCollectionRequest : public Event\n    {\n        R_EVENT\n\n    public:\n        RenameCollectionRequest(QObject *sender, const MongoNamespace &ns, const std::string &newCollection) :\n            Event(sender),\n            _ns(ns),\n            _newCollection(newCollection) {}\n\n        MongoNamespace ns() const { return _ns; }\n        std::string newCollection() const { return _newCollection; }\n\n    private:\n        MongoNamespace const _ns;\n        std::string const _newCollection;\n    };\n\n    struct RenameCollectionResponse : public Event\n    {\n        R_EVENT\n\n            RenameCollectionResponse(QObject *sender, std::string const& oldCollection, \n                                     std::string const& newCollection) :\n            Event(sender), oldCollection(oldCollection), newCollection(newCollection) {}\n\n        RenameCollectionResponse(QObject *sender, const EventError &error) :\n            Event(sender, error) {}\n\n        std::string const oldCollection;\n        std::string const newCollection;\n    };\n\n    /**\n     * @brief Clone Collection\n     */\n\n    class DuplicateCollectionRequest : public Event\n    {\n        R_EVENT\n\n    public:\n        DuplicateCollectionRequest(QObject *sender, const MongoNamespace &ns, const std::string &newCollection) :\n            Event(sender),\n            _ns(ns),\n            _newCollection(newCollection) {}\n\n        MongoNamespace ns() const { return _ns; }\n        std::string newCollection() const { return _newCollection; }\n\n    private:\n        MongoNamespace const _ns;\n        std::string const _newCollection;\n    };\n\n    struct DuplicateCollectionResponse : public Event\n    {\n        R_EVENT\n\n    public:\n        DuplicateCollectionResponse(QObject *sender, std::string const& sourceCollection,\n                                    std::string const& duplicateCollection) :\n            Event(sender), sourceCollection(sourceCollection), duplicateCollection(duplicateCollection) {}\n\n        DuplicateCollectionResponse(QObject *sender, std::string const& sourceCollection, const EventError &error) :\n            Event(sender, error), sourceCollection(sourceCollection) {}\n\n        std::string const sourceCollection;\n        std::string const duplicateCollection;\n    };\n\n     /**\n     * @brief Copy collection to diffrent server\n     */\n\n    class CopyCollectionToDiffServerRequest : public Event\n    {\n        R_EVENT\n\n    public:\n        CopyCollectionToDiffServerRequest(QObject *sender, MongoWorker *worker, const std::string &databaseFrom,\n            const std::string &collection, const std::string &databaseTo) :\n        Event(sender),\n            _worker(worker),\n            _from(databaseFrom, collection),\n            _to(databaseTo, collection) {}\n\n        MongoWorker *worker() const { return _worker; }\n        MongoNamespace from() const { return _from; }\n        MongoNamespace to() const { return _to; }\n    private:\n        MongoWorker *_worker;\n        const MongoNamespace _from;\n        const MongoNamespace _to;\n    };\n\n    class CopyCollectionToDiffServerResponse : public Event\n    {\n        R_EVENT\n\n    public:\n        CopyCollectionToDiffServerResponse(QObject *sender) :\n            Event(sender) {}\n\n        CopyCollectionToDiffServerResponse(QObject *sender, const EventError &error) :\n            Event(sender, error) {}\n    };\n\n    /**\n     * @brief Create User\n     */\n\n    class CreateUserRequest : public Event\n    {\n        R_EVENT\n\n    public:\n        CreateUserRequest(QObject *sender, const std::string &database, const MongoUser &user) :\n            Event(sender),\n            _database(database),\n            _user(user) {}\n\n        std::string database() const { return _database; }\n        MongoUser user() const { return _user; }\n\n    private:\n        std::string _database;\n        MongoUser _user;\n    };\n\n    struct CreateUserResponse : public Event\n    {\n        R_EVENT\n\n        CreateUserResponse(QObject *sender, std::string const& userName) :\n            Event(sender), userName(userName) {}\n\n        CreateUserResponse(QObject *sender, std::string const& userName, const EventError &error) :\n            Event(sender, error), userName(userName) {}\n\n        std::string const userName;\n    };\n\n\n    /**\n     * @brief Drop User\n     */\n\n    class DropUserRequest : public Event\n    {\n        R_EVENT\n\n    public:\n        DropUserRequest(QObject *sender, const std::string &database, std::string const& username) :\n            Event(sender), _database(database), _username(username) {}\n\n        std::string database() const { return _database; }\n        std::string username() const { return _username; }\n\n    private:\n        std::string _database;\n        std::string const _username;\n    };\n\n    struct DropUserResponse : public Event\n    {\n        R_EVENT\n\n        DropUserResponse(QObject *sender, std::string const& username) :\n            Event(sender), username(username) {}\n\n        DropUserResponse(QObject *sender, std::string const& username, const EventError &error) :\n            Event(sender, error), username(username) {}\n\n        std::string const username;\n    };\n\n\n    /**\n     * @brief Create Function\n     */\n\n    class CreateFunctionRequest : public Event\n    {\n        R_EVENT\n\n    public:\n        CreateFunctionRequest(QObject *sender, const std::string &database, float dbVersion, \n                              const MongoFunction &function, const std::string &existingFunctionName = std::string(), \n                              bool overwrite = false) :\n            Event(sender),\n            _database(database),\n            _dbVersion(dbVersion),\n            _existingFunctionName(existingFunctionName),\n            _function(function),\n            _overwrite(overwrite) {}\n\n        std::string database() const { return _database; }\n        float dbVersion() const { return _dbVersion; }\n        std::string existingFunctionName() const { return _existingFunctionName; }\n        MongoFunction function() const { return _function; }\n        bool overwrite() const { return _overwrite; }\n\n    private:\n        std::string _database;\n        float const _dbVersion = 0.0f;\n        std::string _existingFunctionName;\n        MongoFunction _function;\n        bool _overwrite;\n    };\n\n    struct CreateFunctionResponse : public Event\n    {\n        R_EVENT\n        \n        enum Operation { NewFunction, NameUpdate, CodeUpdate }; // todo\n\n        CreateFunctionResponse(QObject *sender, std::string const& functionName) :\n            Event(sender), functionName(functionName) {}\n\n        CreateFunctionResponse(QObject *sender, std::string const& functionName, const EventError &error) :\n            Event(sender, error), functionName(functionName) {}\n\n        std::string const functionName;\n    };\n\n    /**\n     * @brief Drop Function\n     */\n\n    class DropFunctionRequest : public Event\n    {\n        R_EVENT\n\n    public:\n        DropFunctionRequest(QObject *sender, const std::string &database, float dbVersion, \n                            const std::string &funcName) :\n            Event(sender),\n            _database(database),\n            _dbVersion(dbVersion),\n            _functionName(funcName) {}\n\n        std::string database() const { return _database; }\n        float dbVersion() const { return _dbVersion; }\n        std::string functionName() const { return _functionName; }\n\n    private:\n        std::string _database;\n        float const _dbVersion = 0.0f;\n        std::string _functionName;\n    };\n\n    struct DropFunctionResponse : public Event\n    {\n        R_EVENT\n\n        DropFunctionResponse(QObject *sender, const std::string &functionName) :\n        Event(sender), functionName(functionName) {}\n\n        DropFunctionResponse(QObject *sender, const std::string &functionName, const EventError &error) :\n            Event(sender, error), functionName(functionName) {}\n\n        std::string const functionName;\n    };\n\n    /**\n     * @brief Query Mongodb\n     */\n\n    class ExecuteQueryRequest : public Event\n    {\n        R_EVENT\n\n    public:\n        ExecuteQueryRequest(QObject *sender, int resultIndex, const MongoQueryInfo &queryInfo) :\n            Event(sender),\n            _resultIndex(resultIndex),\n            _queryInfo(queryInfo) {}\n\n        int resultIndex() const { return _resultIndex; }\n        MongoQueryInfo queryInfo() const { return _queryInfo; }\n\n    private:\n        int _resultIndex; //external user data;\n        MongoQueryInfo _queryInfo;\n    };\n\n    class ExecuteQueryResponse : public Event\n    {\n        R_EVENT\n\n        ExecuteQueryResponse(QObject *sender, int resultIndex, const MongoQueryInfo &queryInfo, const std::vector<MongoDocumentPtr> &documents) :\n            Event(sender),\n            resultIndex(resultIndex),\n            queryInfo(queryInfo),\n            documents(documents) { }\n\n        ExecuteQueryResponse(QObject *sender, const EventError &error) :\n            Event(sender, error) {}\n\n        int resultIndex;\n        MongoQueryInfo queryInfo;\n        std::vector<MongoDocumentPtr> documents;\n    };\n\n    class AutocompleteRequest : public Event\n    {\n        R_EVENT\n\n        AutocompleteRequest(QObject *sender, const std::string &prefix, const AutocompletionMode mode) :\n            Event(sender),\n            prefix(prefix),\n            mode(mode) {}\n\n        std::string prefix;\n        AutocompletionMode mode;\n    };\n\n    class AutocompleteResponse : public Event\n    {\n        R_EVENT\n\n        AutocompleteResponse(QObject *sender, const QStringList &list, const std::string &prefix) :\n            Event(sender),\n            list(list),\n            prefix(prefix) {}\n\n        AutocompleteResponse(QObject *sender, const EventError &error) :\n            Event(sender, error) {}\n\n        QStringList list;\n        std::string prefix;\n    };\n\n\n    /**\n     * @brief ExecuteScript\n     */\n\n    class ExecuteScriptRequest : public Event\n    {\n        R_EVENT\n\n        ExecuteScriptRequest(QObject *sender, const std::string &script, const std::string &dbName, \n                             AggrInfo aggrInfo = AggrInfo(), int take = 0, int skip = 0) :\n            Event(sender),\n            script(script),\n            databaseName(dbName),\n            aggrInfo(aggrInfo),\n            take(take),\n            skip(skip)\n            {}\n\n        std::string script;\n        std::string databaseName;\n        int take; //\n        int skip;\n        AggrInfo const aggrInfo;\n    };\n\n    class ExecuteScriptResponse : public Event\n    {\n        R_EVENT\n\n        ExecuteScriptResponse(QObject *sender, const MongoShellExecResult &result, bool empty,\n                              bool timeoutReached = false) :\n            Event(sender), result(result), empty(empty), _timeoutReached(timeoutReached) {}\n\n        ExecuteScriptResponse(QObject *sender, const EventError &error, bool timeoutReached = false) :\n            Event(sender, error), _timeoutReached(timeoutReached) {}\n\n        bool timeoutReached() const { return _timeoutReached; }\n\n        MongoShellExecResult result;\n        bool empty;\n        bool const _timeoutReached = false;\n    };\n\n    class ConnectingEvent : public Event\n    {\n        R_EVENT\n\n        ConnectingEvent(QObject *sender) :\n            Event(sender) { }\n    };\n\n    class OpeningShellEvent : public Event\n    {\n        R_EVENT\n\n        OpeningShellEvent(QObject *sender, MongoShell *shell) :\n            Event(sender),\n            shell(shell) {}\n\n        MongoShell *shell;\n    };\n\n    class ConnectionFailedEvent : public Event\n    {\n        R_EVENT\n\n        enum Reason {\n            MongoConnection    = 1,\n            MongoAuth          = 2,\n            SshConnection      = 3,\n            SshChannel         = 4,\n            SslConnection      = 5\n        };\n\n        ConnectionFailedEvent(QObject *sender, int serverHandle, ConnectionType connectionType,\n                              const std::string& message, Reason reason) :\n            Event(sender),\n            message(message),\n            reason(reason),\n            serverHandle(serverHandle),\n            connectionType(connectionType) {}\n\n        std::string message;\n        Reason reason;\n        ConnectionType connectionType;\n        int serverHandle;\n    };\n\n//    class ScriptExecute\n\n    struct ConnectionEstablishedEvent : public Event\n    {\n        R_EVENT\n\n        ConnectionEstablishedEvent(MongoServer *server, ConnectionType type, ConnectionInfo connInfo) :\n            Event((QObject *)server),\n            server(server),\n            connectionType(type),\n            connInfo(connInfo) { }       \n\n        MongoServer *server;\n        ConnectionType const connectionType;\n        ConnectionInfo const connInfo;\n    };\n\n    class DatabaseListLoadedEvent : public Event\n    {\n        R_EVENT\n\n        DatabaseListLoadedEvent(QObject *sender, const QList<MongoDatabase *> &list) :\n            Event(sender),\n            list(list) { }\n\n        DatabaseListLoadedEvent(QObject *sender, const EventError &error) :\n            Event(sender, error) {}\n\n        QList<MongoDatabase *> list;\n    };\n\n    class DocumentListLoadedEvent : public Event\n    {\n        R_EVENT\n\n    public:\n        DocumentListLoadedEvent(QObject *sender, int resultIndex, const MongoQueryInfo &queryInfo, const std::string &query, const std::vector<MongoDocumentPtr> &docs) :\n            Event(sender),\n            _resultIndex(resultIndex),\n            _queryInfo(queryInfo),\n            _query(query),\n            _documents(docs) { }\n\n        DocumentListLoadedEvent(QObject *sender, const EventError &error) :\n            Event(sender, error) {}\n\n        int resultIndex() const { return _resultIndex; }\n        MongoQueryInfo queryInfo() const { return _queryInfo; }\n        std::vector<MongoDocumentPtr> documents() const { return _documents; }\n        std::string query() const { return _query; }\n\n    private:\n        int _resultIndex;\n        MongoQueryInfo _queryInfo;\n        std::vector<MongoDocumentPtr> _documents;\n        std::string _query;\n    };\n\n    class ScriptExecutedEvent : public Event\n    {\n        R_EVENT\n\n    public:\n        ScriptExecutedEvent(QObject *sender, const MongoShellExecResult &result, bool empty,\n                            bool timeoutReached = false) :\n            Event(sender), _result(result), _empty(empty), _timeoutReached(timeoutReached) {}\n\n        ScriptExecutedEvent(QObject *sender, const EventError &error, bool timeoutReached = false) :\n            Event(sender, error), _timeoutReached(timeoutReached) {}\n\n        MongoShellExecResult result() const { return _result; }\n        bool empty() const { return _empty; }\n        bool timeoutReached() const { return _timeoutReached; }\n\n    private:\n        MongoShellExecResult _result;\n        bool _empty;\n        bool const _timeoutReached = false;\n    };\n\n    class ScriptExecutingEvent : public Event\n    {\n        R_EVENT\n\n    public:\n        ScriptExecutingEvent(QObject *sender) :\n            Event(sender) { }\n    };\n\n    class OperationFailedEvent : public Event\n    {\n        R_EVENT\n\n    public:\n        OperationFailedEvent(QObject *sender, const std::string &technicalErrorMessage, const std::string &userFriendlyErrorMessage) :\n            technicalErrorMessage(technicalErrorMessage),\n            userFriendlyErrorMessage(userFriendlyErrorMessage),\n            Event(sender) { }\n\n        std::string technicalErrorMessage;\n        std::string userFriendlyErrorMessage;\n    };\n\n    class QueryWidgetUpdatedEvent : public Event\n    {\n        R_EVENT\n\n    public:\n        QueryWidgetUpdatedEvent(QObject *sender, int numOfResults) :\n            Event(sender),\n          _numOfResults(numOfResults) { }\n\n        int numOfResults() const { return _numOfResults; }\n\n    private:\n        int _numOfResults;\n    };\n\n    /**\n     * @brief Establish SSH Connection\n     */\n\n    class EstablishSshConnectionRequest : public Event\n    {\n    R_EVENT\n\n        EstablishSshConnectionRequest(QObject *sender, int serverHandle, SshTunnelWorker* worker, ConnectionSettings* settings, ConnectionType connectionType) :\n            Event(sender),\n            worker(worker),\n            settings(settings),\n            serverHandle(serverHandle),\n            connectionType(connectionType) {}\n\n        ConnectionSettings* settings;\n        ConnectionType connectionType;\n        SshTunnelWorker* worker;\n        int serverHandle;\n    };\n\n    class EstablishSshConnectionResponse : public Event\n    {\n    R_EVENT\n\n        EstablishSshConnectionResponse(QObject *sender, int serverHandle, SshTunnelWorker* worker, ConnectionSettings* settings, ConnectionType connectionType, int localport) :\n            Event(sender),\n            worker(worker),\n            settings(settings),\n            connectionType(connectionType),\n            serverHandle(serverHandle),\n            localport(localport) {}\n\n        EstablishSshConnectionResponse(QObject *sender, int serverHandle, const EventError &error, SshTunnelWorker* worker, ConnectionSettings* settings, ConnectionType connectionType) :\n            Event(sender, error),\n            worker(worker),\n            settings(settings),\n            serverHandle(serverHandle),\n            connectionType(connectionType) {}\n\n        ConnectionSettings* settings;\n        ConnectionType connectionType;\n        SshTunnelWorker* worker;\n        int localport;\n        int serverHandle;\n    };\n\n    /**\n     * @brief Start listening on all opened sockets (SSH tunnel)\n     */\n\n    class ListenSshConnectionRequest : public Event\n    {\n    R_EVENT\n\n        ListenSshConnectionRequest(QObject *sender, int serverHandle, ConnectionType connectionType) :\n            Event(sender),\n            serverHandle(serverHandle),\n            connectionType(connectionType) {}\n\n        ConnectionType connectionType;\n        int serverHandle;\n    };\n\n    class ListenSshConnectionResponse : public Event\n    {\n    R_EVENT\n\n        ListenSshConnectionResponse(QObject *sender, int serverHandle, ConnectionSettings* settings, ConnectionType connectionType) :\n            Event(sender),\n            settings(settings),\n            serverHandle(serverHandle),\n            connectionType(connectionType) {}\n\n        ListenSshConnectionResponse(QObject *sender, const EventError &error, int serverHandle, ConnectionSettings* settings, ConnectionType connectionType) :\n            Event(sender, error),\n            settings(settings),\n            serverHandle(serverHandle),\n            connectionType(connectionType) {}\n\n        ConnectionSettings* settings;\n        ConnectionType connectionType;\n        int serverHandle;\n    };\n\n    class LogEvent : public Event\n    {\n    R_EVENT\n\n        enum LogLevel {\n            RBM_ERROR  = 1,\n            RBM_WARN   = 2,\n            RBM_INFO   = 3,\n            RBM_DEBUG  = 100 // log as much as possible\n        };\n\n        LogEvent(QObject *sender, const std::string& message, LogLevel level, \n                 bool const informUser = false) \n            : Event(sender), message(message), level(level), informUser(informUser)\n        {}\n\n        std::string severity() const {\n            switch (level) {\n                case RBM_ERROR : return \"Error\";\n                case RBM_WARN  : return \"Warning\";\n                case RBM_INFO  : return \"Info\";\n                case RBM_DEBUG : return \"Debug\";\n                default: return \"Undefined\";\n            }\n        }\n\n        QMessageBox::Icon qMessageBoxIcon() const {\n            switch (level) {\n                case RBM_ERROR: return QMessageBox::Icon::Critical;\n                case RBM_WARN: return QMessageBox::Icon::Warning;\n                case RBM_INFO: return QMessageBox::Icon::Information;\n                case RBM_DEBUG: return QMessageBox::Icon::Information;\n                default: return QMessageBox::Icon::Information;\n            }\n        }\n\n        mongo::logger::LogSeverity mongoLogSeverity() const {\n            switch (level) {\n                case RBM_ERROR: return mongo::logger::LogSeverity::Error();\n                case RBM_WARN: return mongo::logger::LogSeverity::Warning();\n                case RBM_INFO: return mongo::logger::LogSeverity::Info();\n                case RBM_DEBUG: return mongo::logger::LogSeverity::Log();\n                default: return mongo::logger::LogSeverity::Info();\n            }\n        }\n\n        std::string message;\n        LogLevel level;\n        bool const informUser = false;\n    };\n\n    class StopScriptRequest : public Event\n    {\n    R_EVENT\n\n        StopScriptRequest(QObject *sender) :\n            Event(sender) {}\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/events/MongoEventsInfo.cpp",
    "content": "#include \"robomongo/core/events/MongoEventsInfo.h\"\n\nnamespace Robomongo\n{\n    IndexInfo::IndexInfo(\n        const MongoCollectionInfo &collection, const std::string &name, const std::string &keys,\n        bool isUnique, bool isBackGround, bool isSparce, int expireAfter,\n        const std::string &defaultLanguage, const std::string &languageOverride, const std::string &textWeights) :\n        _name(name),\n        _collection(collection),\n        _keys(keys),\n        _unique(isUnique),\n        _backGround(isBackGround),\n        _sparse(isSparce),\n        _ttl(expireAfter),\n        _defaultLanguage(defaultLanguage),\n        _languageOverride(languageOverride),\n        _textWeights(textWeights) {}\n\n        ConnectionInfo::ConnectionInfo(std::string const& uuid) :\n            _address(),\n            _databases(),\n            _version(0.0f),\n            _dbVersionStr(),\n            _uuid(uuid)\n        {}\n\n        ConnectionInfo::ConnectionInfo(const std::string &address, const std::vector<std::string> &databases, \n            float version, const std::string& dbVersionStr, const std::string& storageEngine,\n            std::string const& uuid) :\n           _address(address),\n           _databases(databases),\n           _version(version),\n            _dbVersionStr(dbVersionStr),\n           _storageEngineType(storageEngine),\n           _uuid(uuid)\n        {}\n}\n"
  },
  {
    "path": "src/robomongo/core/events/MongoEventsInfo.h",
    "content": "#pragma once\n#include <string>\n#include \"robomongo/core/domain/MongoCollectionInfo.h\"\n\nnamespace Robomongo\n{\n    struct IndexInfo\n    {\n        IndexInfo(\n            const MongoCollectionInfo &collection,\n            const std::string &name = std::string(),\n            const std::string &request = std::string(),\n            bool isUnique = false,\n            bool isBackGround = false,\n            bool isSparce = false,\n            int expireAfter = -1,\n            const std::string &defaultLanguage = std::string(),\n            const std::string &languageOverride = std::string(),\n            const std::string &textWeights = std::string());\n\n        MongoCollectionInfo _collection;\n        std::string _name;\n        std::string _keys;\n        bool _unique;\n        bool _backGround;\n        bool _sparse;\n        int _ttl;\n        std::string _defaultLanguage;\n        std::string _languageOverride;\n        std::string _textWeights;\n    };\n\n    struct ConnectionInfo\n    {\n        ConnectionInfo(std::string const& uuid);\n        ConnectionInfo(const std::string &address, const std::vector<std::string> &databases, float version, \n                       const std::string& dbVersionStr, const std::string& storageEngine, \n                       std::string const& uuid);\n        const std::string _address;\n        const std::vector<std::string> _databases;\n        const float _version;\n        const std::string _dbVersionStr;\n        const std::string _storageEngineType;\n        std::string const _uuid;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/mongodb/MongoClient.cpp",
    "content": "#include \"robomongo/core/mongodb/MongoClient.h\"\n\n#include \"mongo/db/namespace_string.h\"\n\n#include \"robomongo/core/domain/MongoDocument.h\"\n#include \"robomongo/core/utils/BsonUtils.h\"\n#include \"robomongo/shell/bson/json.h\"\n\nnamespace\n{\n    Robomongo::IndexInfo makeIndexInfoFromBsonObj(\n        const Robomongo::MongoCollectionInfo &collection,\n        const mongo::BSONObj &obj)\n    {\n        using namespace Robomongo::BsonUtils;\n        Robomongo::IndexInfo info(collection);\n        info._name = obj.getStringField(\"name\");\n        mongo::BSONObj keyObj = obj.getObjectField(\"key\");\n        if (keyObj.isValid()) \n            info._keys = jsonString(keyObj, mongo::TenGen, 1, Robomongo::DefaultEncoding, Robomongo::Utc);\n\n        info._unique = obj.getBoolField(\"unique\");\n        info._backGround = obj.getBoolField(\"background\");\n        info._sparse = obj.getBoolField(\"sparse\");\n        info._ttl = obj.getIntField(\"expireAfterSeconds\");\n        info._defaultLanguage = obj.getStringField(\"default_language\");\n        info._languageOverride = obj.getStringField(\"language_override\");\n        mongo::BSONObj weightsObj = obj.getObjectField(\"weights\");\n        if (weightsObj.isValid()) \n            info._textWeights = jsonString(weightsObj, mongo::TenGen, 1, Robomongo::DefaultEncoding, \n                                           Robomongo::Utc);\n\n        return info;\n    }\n}\n\nnamespace Robomongo\n{\n    MongoClient::MongoClient(mongo::DBClientBase *const dbclient) :\n        _dbclient(dbclient) { }\n\n    std::vector<std::string> MongoClient::getCollectionNamesWithDbname(const std::string &dbname) const\n    {\n        std::list<mongo::BSONObj> collList = _dbclient->getCollectionInfos(dbname);\n\n        std::vector<std::string> collNames;\t\n        for (auto const& coll : collList)\n            collNames.push_back(dbname + '.' + coll.getStringField(\"name\")); // todo: verify\n\n        std::sort(collNames.begin(), collNames.end());\n        return collNames;\n    }\n\n    // Warning: \n    // Use string version dbVersionStr(), version number is corrupted after conversion to float\n    // Todo: Remove this function\n    float MongoClient::getVersion() const\n    {\n        float result = 0.0f;\n        mongo::BSONObj resultObj;\n        _dbclient->runCommand(\"db\", BSON(\"buildInfo\" << \"1\"), resultObj);\n        std::string resultStr = BsonUtils::getField<mongo::String>(resultObj, \"version\");\n        result = atof(resultStr.c_str());\n        return result;\n    }\n\n    std::string MongoClient::dbVersionStr() const\n    {\n        mongo::BSONObj resultObj;\n        _dbclient->runCommand(\"db\", BSON(\"buildInfo\" << \"1\"), resultObj);\n        std::string const resultStr = BsonUtils::getField<mongo::String>(resultObj, \"version\");\n        return resultStr;\n    }\n\n    std::string MongoClient::getStorageEngineType() const\n    {\n        mongo::BSONObj resultObj;\n        _dbclient->runCommand(\"db\", BSON(\"serverStatus\" << \"1\"), resultObj);\n        return resultObj.getObjectField(\"storageEngine\").getStringField(\"name\");\n    }\n\n    std::vector<std::string> MongoClient::getDatabaseNames() const\n    {\n        std::list<std::string> const& dbs = _dbclient->getDatabaseNames();\n        std::vector<std::string> dbNames = {dbs.begin(), dbs.end()};\n        std::sort(dbNames.begin(), dbNames.end());\n        return dbNames;\n    }\n\n    std::vector<MongoUser> MongoClient::getUsers(const std::string &dbName)\n    {\n        mongo::BSONObjBuilder cmd;\n        cmd.append(\"usersInfo\", 1);\n\n        mongo::BSONObj result;\n        if (!_dbclient->runCommand(dbName, cmd.done(), result)) {\n            std::string errStr = result.getStringField(\"errmsg\");\n            if (errStr.empty())\n                errStr = \"Failed to get error message.\";\n\n            throw std::runtime_error(errStr);\n        }\n\n        std::vector<MongoUser> users;\n        for (auto const& usr : result.getField(\"users\").Array())\n            users.push_back(MongoUser(getVersion(), usr.embeddedObject()));\n\n        return users;\n    }\n\n    void MongoClient::createUser(const std::string &dbName, const MongoUser &user)\n    {\n        mongo::BSONObjBuilder cmd;\n        cmd.append(\"createUser\", user.name());\n        cmd.append(\"pwd\", user.password());\n        \n        mongo::BSONArrayBuilder roles;\n        auto const& rolesStrs = user.roles();\n        for (auto const& roleStr : rolesStrs) {\n            mongo::BSONObjBuilder role;\n            role.append(\"role\", roleStr).append(\"db\", user.userSource());\n            roles.append(role.done());\n        }\n        cmd.appendArray(\"roles\", roles.done());\n\n        mongo::BSONObj result;\n        if (!_dbclient->runCommand(dbName, cmd.done(), result)) {\n            std::string errStr = result.getStringField(\"errmsg\");\n            if (errStr.empty())\n                errStr = \"Failed to get error message.\";\n   \n            throw std::runtime_error(errStr);\n        }       \n    }\n\n    void MongoClient::dropUser(const std::string &dbName, const std::string &user)\n    {\n        mongo::BSONObjBuilder cmd;\n        cmd.append(\"dropUser\", user);\n\n        mongo::BSONObj result;\n        if (!_dbclient->runCommand(dbName, cmd.done(), result)) {\n            std::string errStr = result.getStringField(\"errmsg\");\n            if (errStr.empty())\n                errStr = \"Failed to get error message.\";\n\n            throw std::runtime_error(errStr);\n        }\n    }\n\n    std::vector<MongoFunction> MongoClient::getFunctions(const std::string &dbName) const\n    {\n        std::vector<MongoFunction> functions;\n\n        std::unique_ptr<mongo::DBClientCursor> cursor(\n            _dbclient->query(mongo::NamespaceString(dbName, \"system.js\"), mongo::Query().sort(\"_id\")));\n\n        // Cursor may be NULL, it means we have connectivity problem\n        if (!cursor)\n            throw std::runtime_error(\"Network error while attempting to load list of functions.\");\n\n        while (cursor->more()) {\n            mongo::BSONObj bsonObj = cursor->next();\n            try {\n                MongoFunction func(bsonObj);\n                functions.push_back(func);\n            } catch (const std::exception &) {\n                // skip invalid docs\n            }\n        }\n        return functions;\n    }\n\n    std::vector<IndexInfo> MongoClient::getIndexes(const MongoCollectionInfo &collection) const\n    {\n        std::vector<IndexInfo> result;\n        std::list<mongo::BSONObj> indexes = _dbclient->getIndexSpecs(collection.ns().toString());\n\n        for (std::list<mongo::BSONObj>::iterator it = indexes.begin(); it != indexes.end(); ++it) {\n            mongo::BSONObj bsonObj = *it;\n            result.push_back(makeIndexInfoFromBsonObj(collection, bsonObj));\n        }\n\n        return result;\n    }\n\n    void MongoClient::addEditIndex(const IndexInfo &oldInfo, const IndexInfo &newInfo) const\n    {   \n        bool const editIndex = !oldInfo._name.empty();\n\n        // 1.Step: Drop Index (if this is an Edit Index action).\n        // MongoDB docs: To modify an existing index, you need to drop and recreate the index.\n        std::string const ns = newInfo._collection.ns().toString();\n        if (editIndex)\n            _dbclient->dropIndex(ns, oldInfo._name);\n\n        // 2.Step: Add/Edit Index\n        auto const createIndexSpec = [](IndexInfo const& indexInfo) {\n            mongo::IndexSpec indexSpec;\n            indexSpec.name(indexInfo._name);\n            indexSpec.addKeys(mongo::Robomongo::fromjson(indexInfo._keys));\n\n            mongo::BSONObjBuilder optionsBuilder;\n\n            auto const addIfTrue = [&](auto const& keyValuePair) {\n                if (keyValuePair.second)\n                    optionsBuilder.appendBool(keyValuePair.first, true);\n            };\n\n            addIfTrue(std::pair{ \"unique\", indexInfo._unique });\n            addIfTrue(std::pair{ \"background\", indexInfo._backGround });\n            addIfTrue(std::pair{ \"sparse\", indexInfo._sparse });\n\n            if (!indexInfo._defaultLanguage.empty())\n                optionsBuilder.append(\"default_language\", indexInfo._defaultLanguage);\n\n            if (!indexInfo._languageOverride.empty())\n                optionsBuilder.append(\"language_override\", indexInfo._languageOverride);\n\n            if (!mongo::Robomongo::fromjson(indexInfo._textWeights).isEmpty())\n                optionsBuilder.append(\"weights\", mongo::Robomongo::fromjson(indexInfo._textWeights));\n\n            if (indexInfo._ttl > 0)\n                optionsBuilder.append(\"expireAfterSeconds\", indexInfo._ttl);\n\n            indexSpec.addOptions(optionsBuilder.obj());\n            return indexSpec;\n        };\n\n        try {\n            _dbclient->createIndex(ns, createIndexSpec(newInfo));\n        } \n        catch (std::exception const& /*ex*/) { // Logging of \"ex\" is done in upper scope\n            if (editIndex) {\n                // If we are here, index that is being edited, must have already been dropped and \n                // creation of new index failed. So, we try to at least recover the dropped (old) index\n                _dbclient->createIndex(ns, createIndexSpec(oldInfo));\n            }\n            throw;\n        }\n\n        std::string const errorStr = _dbclient->getLastError();\n        if (!errorStr.empty())\n            throw std::runtime_error(errorStr);\n    }\n\n    void MongoClient::renameIndexFromCollection(const MongoCollectionInfo &collection, const std::string &oldIndexName, const std::string &newIndexName) const\n    {\n        // This is simply an example of how to perform modifications of\n        // BSON objects. Because BSONObj is immutable, you need to create\n        // copy of this object, using BSONObjBuilder and BSONObjIterator.\n        //\n        // But we need to do not just simple renaming of Index name, we\n        // also should allow our users to fully modify Index\n        // (i.e. change name, keys, unique flag, sparse flag etc.)\n        //\n        // This should be done using the same dialog as for \"Add Index\".\n\n        MongoNamespace ns(collection.ns().databaseName(), \"system.indexes\");\n        std::string systemIndexesNs = ns.toString();\n\n        // Building this JSON: { \"name\" : \"oldIndexName\" }\n        mongo::BSONObj query(mongo::BSONObjBuilder()\n            .append(\"name\", oldIndexName)\n            .obj());\n\n        // Searching for index with \"oldIndexName\"\n        // with this query: db.system.indexes.find({ name : \"oldIndexName\"}\n        mongo::BSONObj indexBson = _dbclient->findOne(systemIndexesNs, mongo::Query(query));\n        if (indexBson.isEmpty())\n            return;\n\n        // Here we are building copy of \"indexBson\" object and\n        // changing \"name\" field's value from \"oldIndexText\" to \"newIndexText\":\n        mongo::BSONObjBuilder builder;\n        mongo::BSONObjIterator i(indexBson);\n        while (i.more()) {\n            mongo::BSONElement element = i.next();\n\n            if (mongo::StringData(element.fieldName()).compare(\"name\") == 0) {\n                builder.append(\"name\", newIndexName);\n                continue;\n            }\n\n            builder.append(element);\n        }\n        std::string collectionNs = collection.ns().toString();\n\n        _dbclient->dropIndex(collectionNs, oldIndexName);\n        _dbclient->insert(systemIndexesNs, builder.obj());\n    }\n\n    void MongoClient::dropIndexFromCollection(const MongoCollectionInfo &collection, const std::string &indexName) const\n    {\n        _dbclient->dropIndex(collection.ns().toString(), indexName);\n    }\n\n    void MongoClient::createFunction(const std::string &dbName, const MongoFunction &fun, \n                                     const std::string &existingFunctionName /* = QString() */)\n    {\n        MongoNamespace ns(dbName, \"system.js\");\n        mongo::BSONObj obj = fun.toBson();\n\n        if (existingFunctionName.empty()) { // create new function\n            _dbclient->insert(ns.toString(), obj);\n            std::string errorStr = _dbclient->getLastError();\n            if (!errorStr.empty())\n                throw std::runtime_error(errorStr/* , 0 */);\n        } else { // this is update\n\n            std::string name = fun.name();\n\n            if (existingFunctionName == name) { // update existing function code\n                mongo::BSONObjBuilder builder;\n                builder.append(\"_id\", name);\n                mongo::BSONObj bsonQuery = builder.obj();\n                mongo::Query query(bsonQuery);\n\n                _dbclient->update(ns.toString(), query, obj, true, false);\n                std::string errorStr = _dbclient->getLastError();\n                if (!errorStr.empty())\n                    throw std::runtime_error(errorStr);\n            } else {    // update function name (remove & insert)\n                _dbclient->insert(ns.toString(), obj);\n                std::string errorStr = _dbclient->getLastError();\n\n                // if no errors\n                if (errorStr.empty()) {\n                    mongo::BSONObjBuilder builder;\n                    builder.append(\"_id\", existingFunctionName);\n                    mongo::BSONObj bsonQuery = builder.obj();\n                    mongo::Query query(bsonQuery);\n                    _dbclient->remove(ns.toString(), query, true);\n                }\n                else {\n                    throw std::runtime_error(errorStr);\n                }\n            }\n        }\n    }\n\n    void MongoClient::dropFunction(const std::string &dbName, const std::string &name)\n    {\n        MongoNamespace ns(dbName, \"system.js\");\n\n        mongo::BSONObjBuilder builder;\n        builder.append(\"_id\", name);\n        mongo::BSONObj bsonQuery = builder.obj();\n        mongo::Query query(bsonQuery);\n\n        _dbclient->remove(ns.toString(), query, true);\n        std::string errorStr = _dbclient->getLastError();\n        if (!errorStr.empty())\n            throw std::runtime_error(errorStr);\n    }\n\n    void MongoClient::createDatabase(const std::string &dbName)\n    {\n        /*\n        *  Here we are going to insert temp document to \"<dbName>.temp\" collection.\n        *  This will create <dbName> database for us.\n        *  Finally we are dropping just created temporary collection.\n        */\n        MongoNamespace ns(dbName, \"temp\");\n\n        // If <dbName>.temp already exists, stop.\n        if (_dbclient->exists(ns.toString()))\n            throw std::runtime_error(dbName + \".temp already exists.\");\n\n        // Building { _id : \"temp\" } document\n        mongo::BSONObjBuilder builder;\n        builder.append(\"_id\", \"temp\");\n        mongo::BSONObj obj = builder.obj();\n\n        // Insert this document\n        _dbclient->insert(ns.toString(), obj);\n        std::string errorStr = _dbclient->getLastError();\n        if (!errorStr.empty())\n            throw std::runtime_error(errorStr);\n\n        // Drop temp collection\n        _dbclient->dropCollection(ns.toString());\n    }\n\n    void MongoClient::dropDatabase(const std::string &dbName)\n    {\n        mongo::BSONObj info;\n        if (!_dbclient->dropDatabase(dbName, mongo::WriteConcernOptions(), &info)) { // todo: do we catch errorStr via info - test it??\n            std::string errStr = info.toString();\n            if (errStr.empty())\n                errStr = \"Failed to get error message.\";\n\n            throw std::runtime_error(errStr);\n        }\n    }\n\n    void MongoClient::createCollection(const std::string& ns, long long size, bool capped, int max, \n                                       const mongo::BSONObj& extraOptions, mongo::BSONObj* info)\n    {\n        verify(!capped || size);\n        mongo::BSONObj o;\n        if (info == 0)\n            info = &o;\n        mongo::BSONObjBuilder b;\n        std::string db = mongo::nsToDatabase(ns);\n        b.append(\"create\", ns.c_str() + db.length() + 1);\n        if (size) {\n            b.append(\"size\", size);\n        }\n        if (capped) {\n            b.append(\"capped\", true);\n        }\n        if (max) {\n            b.append(\"max\", max);\n        }\n        b.appendElements(extraOptions);\n\n        if (!_dbclient->exists(ns)) {\n            mongo::BSONObj result;\n            if (!_dbclient->runCommand(db.c_str(), b.done(), result)) {\n                std::string errStr = result.getStringField(\"errmsg\");\n                if (errStr.empty())\n                    errStr = \"Failed to get error message.\";\n\n                throw std::runtime_error(errStr);\n            }\n        }\n        else {\n            throw std::runtime_error(\"Collection with same name already exists.\");\n        }\n    }\n\n    void MongoClient::renameCollection(const MongoNamespace &ns, const std::string &newCollectionName)\n    {\n        MongoNamespace from(ns);\n        MongoNamespace to(ns.databaseName(), newCollectionName);\n\n        // Building { renameCollection: <source-namespace>, to: <target-namespace> }\n        mongo::BSONObjBuilder command; // { collStats: \"db.collection\", scale : 1 }\n        command.append(\"renameCollection\", from.toString());\n        command.append(\"to\", to.toString());\n\n        mongo::BSONObj result;\n        if (!_dbclient->runCommand(\"admin\", command.obj(), result)) { // this command should be run against \"admin\" db\n            std::string errStr = result.getStringField(\"errmsg\");\n            if (errStr.empty())\n                errStr = \"Failed to get error message.\";\n\n            throw std::runtime_error(errStr);\n        }\n    }\n\n    void MongoClient::duplicateCollection(const MongoNamespace &ns, const std::string &newCollectionName)\n    {\n        MongoNamespace const newCollection(ns.databaseName(), newCollectionName);\n\n        if (!_dbclient->exists(newCollection.toString())) {\n            mongo::BSONObj result;\n            // todo: Issue #1258 : Duplicate Collection should support advanced collection options.\n            //       _dbclient->createCollection() should be called with properties of source collection\n            //       not with default parameters as below.\n            if (!_dbclient->createCollection(newCollection.toString(), 0, false, 0, &result)) {\n                std::string errStr = result.getStringField(\"errmsg\");\n                if (errStr.empty())\n                    errStr = \"Failed to get error message.\";\n\n                throw std::runtime_error(errStr);\n            }\n        }\n        else {\n            throw std::runtime_error(\"Collection with same name already exists.\");\n        }\n\n        std::unique_ptr<mongo::DBClientCursor> cursor {\n\t\t\t_dbclient->query(mongo::NamespaceString(ns.databaseName(), ns.collectionName()), mongo::Query()) \n\t\t};\n\n        // Cursor may be NULL, it means we have connectivity problem\n        if (!cursor)\n            throw std::runtime_error(\"Network error while attempting to run query\");\n\n        while (cursor->more()) {\n            mongo::BSONObj bsonObj = cursor->next();\n            _dbclient->insert(newCollection.toString(), bsonObj);\n        }\n    }\n\n    void MongoClient::copyCollectionToDiffServer(mongo::DBClientBase *const fromServ, const MongoNamespace &from, \n                                                 const MongoNamespace &to)\n    {\n        if (!_dbclient->exists(to.toString()))\n            _dbclient->createCollection(to.toString());\n\n        std::unique_ptr<mongo::DBClientCursor> cursor{fromServ->query(\n            mongo::NamespaceString(from.databaseName(), from.collectionName()),\n            mongo::Query()) \n\t\t};\n\n        // Cursor may be NULL, it means we have connectivity problem\n        if (!cursor)\n            throw std::runtime_error(\"Network error while attempting to run query\");\n\n        while (cursor->more()) {\n            mongo::BSONObj bsonObj = cursor->next();\n            _dbclient->insert(to.toString(), bsonObj);\n        }\n    }\n\n    void MongoClient::dropCollection(const MongoNamespace &ns)\n    {\n        if (_dbclient->exists(ns.toString())) {\n            mongo::BSONObj info;\n            if (!_dbclient->dropCollection(ns.toString(), mongo::WriteConcernOptions(), &info)) { \n                std::string errStr = info.toString();\n                if (errStr.empty())\n                    errStr = \"Failed to get error message.\";\n\n                throw std::runtime_error(errStr);\n            }\n        }\n        else {\n            throw std::runtime_error(\"Collection does not exist.\");\n        }\n    }\n\n    void MongoClient::insertDocument(const mongo::BSONObj &obj, const MongoNamespace &ns)\n    {\n        _dbclient->insert(ns.toString(), obj);\n        checkLastErrorAndThrow(ns.databaseName());\n    }\n\n    void MongoClient::saveDocument(const mongo::BSONObj &obj, const MongoNamespace &ns)\n    {\n        mongo::BSONElement id = obj.getField(\"_id\");\n        mongo::BSONObjBuilder builder;\n        builder.append(id);\n        mongo::BSONObj bsonQuery = builder.obj();\n        mongo::Query query(bsonQuery);\n\n        _dbclient->update(ns.toString(), query, obj, true, false);\n        checkLastErrorAndThrow(ns.databaseName());\n    }\n\n    void MongoClient::removeDocuments(const MongoNamespace &ns, mongo::Query query, bool justOne /*= true*/)\n    {\n        _dbclient->remove(ns.toString(), query, justOne);        \n        checkLastErrorAndThrow(ns.databaseName());\n    }\n\n    std::vector<MongoDocumentPtr> MongoClient::query(const MongoQueryInfo &info)\n    {\n        MongoNamespace ns(info._info._ns);\n\n        //int limit = (info.limit <= 0) ? 50 : info.limit;\n\n        std::vector<MongoDocumentPtr> docs;\n\n        if (info._limit == -1) // it means that we do not need to load any documents\n            return docs;\n\n        std::unique_ptr<mongo::DBClientCursor> cursor = _dbclient->query(\n\t\t\tmongo::NamespaceString(ns.databaseName(), ns.collectionName()),          \n\t\t\tinfo._query, info._limit, info._skip, info._fields.nFields() ? &info._fields : 0, \n\t\t\tinfo._options, info._batchSize\n\t\t);\n\n        // DBClientBase::query may return nullptr\n        if (!cursor)\n            throw std::runtime_error(\"Network error while attempting to run query\");\n\n        while (cursor->more()) {\n            mongo::BSONObj bsonObj = cursor->next();\n            MongoDocumentPtr doc(new MongoDocument(bsonObj.getOwned()));\n            docs.push_back(doc);\n        }\n\n        return docs;\n    }\n\n    MongoCollectionInfo MongoClient::runCollStatsCommand(const std::string &ns)\n    {\n        MongoCollectionInfo info(ns);\n        return info;\n\n/*      // Commented for now, to speedup load of collection names\n        MongoNamespace mongons(ns);\n\n        mongo::BSONObjBuilder command; // { collStats: \"db.collection\", scale : 1 }\n        command.append(\"collStats\", mongons.collectionName());\n        command.append(\"scale\", 1);\n\n        mongo::BSONObj result;\n        _dbclient->runCommand(mongons.databaseName(), command.obj(), result);\n        std::string isCV = result.toString();\n        MongoCollectionInfo newInfo(result);\n        return newInfo;\n        */\n    }\n\n    std::vector<MongoCollectionInfo> MongoClient::runCollStatsCommand(const std::vector<std::string> &namespaces)\n    {\n        std::vector<MongoCollectionInfo> infos;\n        for (auto const& ns : namespaces) {\n            MongoCollectionInfo info = runCollStatsCommand(ns);\n            if (info.ns().isValid()) \n                infos.push_back(info);\n        }\n        return infos;\n    }\n\n    void MongoClient::done()\n    {\n        // do nothing here, because we are not using ScopedDbConnection now\n        //_scopedConnection->done();\n    }\n\n    void MongoClient::checkLastErrorAndThrow(const std::string &db)\n    {\n        std::string const lastError = _dbclient->getLastError(db);        \n        if (lastError.empty())\n            return;\n\n        throw std::runtime_error(lastError/*, mongo::ErrorCodes::InternalError*/);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/mongodb/MongoClient.h",
    "content": "#pragma once\n\n#include <mongo/client/dbclient_base.h>\n#include <mongo/bson/bsonobj.h>\n\n#include \"robomongo/core/Core.h\"\n#include \"robomongo/core/domain/MongoQueryInfo.h\"\n#include \"robomongo/core/domain/MongoUser.h\"\n#include \"robomongo/core/domain/MongoFunction.h\"\n#include \"robomongo/core/events/MongoEventsInfo.h\"\n\nnamespace Robomongo\n{\n    class MongoClient\n    {\n    public:\n        MongoClient(mongo::DBClientBase *const scopedConnection);\n\n        std::vector<std::string> getCollectionNamesWithDbname(const std::string &dbname) const;\n        std::vector<std::string> getDatabaseNames() const;\n        float getVersion() const;\n        std::string dbVersionStr() const;\n        std::string getStorageEngineType() const;\n\n        std::vector<MongoUser> getUsers(const std::string &dbName);\n        void createUser(const std::string &dbName, const MongoUser &user);\n        void dropUser(const std::string &dbName, const std::string &user);\n\n        std::vector<MongoFunction> getFunctions(const std::string &dbName) const;\n        std::vector<IndexInfo> getIndexes(const MongoCollectionInfo &collection) const;\n        void dropIndexFromCollection(const MongoCollectionInfo &collection, const std::string &indexName) const;\n        void addEditIndex(const IndexInfo &oldInfo, const IndexInfo &newInfo) const;\n\n        void renameIndexFromCollection(const MongoCollectionInfo &collection, const std::string &oldIndexName,\n                                       const std::string &newIndexName) const;\n\n        void createFunction(const std::string &dbName, const MongoFunction &fun,\n                            const std::string &existingFunctionName = std::string());\n\n        void dropFunction(const std::string &dbName, const std::string &name);\n        void createDatabase(const std::string &dbName);\n        void dropDatabase(const std::string &dbName);\n\n        void createCollection(const std::string &ns, long long size, bool capped, int max, const mongo::BSONObj& extraOptions, mongo::BSONObj* info = nullptr);\n        void renameCollection(const MongoNamespace &ns, const std::string &newCollectionName);\n        void duplicateCollection(const MongoNamespace &ns, const std::string &newCollectionName);\n        void dropCollection(const MongoNamespace &ns);\n        void copyCollectionToDiffServer(mongo::DBClientBase *const, const MongoNamespace &from, const MongoNamespace &to);\n\n        void insertDocument(const mongo::BSONObj &obj, const MongoNamespace &ns);\n        void saveDocument(const mongo::BSONObj &obj, const MongoNamespace &ns);\n        void removeDocuments(const MongoNamespace &ns, mongo::Query query, bool justOne = true);\n        std::vector<MongoDocumentPtr> query(const MongoQueryInfo &info);\n\n        MongoCollectionInfo runCollStatsCommand(const std::string &ns);\n        std::vector<MongoCollectionInfo> runCollStatsCommand(const std::vector<std::string> &namespaces);\n\n        void done();\n\n    private:\n        mongo::DBClientBase *const _dbclient;\n        void checkLastErrorAndThrow(const std::string &db);\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/mongodb/MongoWorker.cpp",
    "content": "#include \"robomongo/core/mongodb/MongoWorker.h\"\n\n#include <algorithm>\n#include <exception>\n\n#include <QThread>\n\n#include <mongo/client/global_conn_pool.h>\n#include <mongo/client/replica_set_monitor.h>\n#include <mongo/util/net/ssl_manager.h>\n#include <mongo/util/net/ssl_options.h>\n\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/domain/MongoShellResult.h\"\n#include \"robomongo/core/domain/MongoCollectionInfo.h\"\n#include \"robomongo/core/events/MongoEvents.h\"\n#include \"robomongo/core/engine/ScriptEngine.h\"\n#include \"robomongo/core/EventBus.h\"\n#include \"robomongo/core/mongodb/MongoClient.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/settings/ReplicaSetSettings.h\"\n#include \"robomongo/core/settings/CredentialSettings.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/core/settings/SslSettings.h\"\n#include \"robomongo/core/utils/BsonUtils.h\"\n#include \"robomongo/core/utils/Logger.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/utils/StringOperations.h\"\n\nnamespace Robomongo\n{\n    std::string const APP_VERSION = PROJECT_VERSION;\n    std::string const APP_NAME_VERSION { \"robo3t-\" + APP_VERSION };\n\n    MongoWorker::MongoWorker(ConnectionSettings *connection, bool isLoadMongoRcJs, int batchSize,\n                             double mongoTimeoutSec, int shellTimeoutSec, QObject *parent) \n        : QObject(parent),\n        _scriptEngine(nullptr),\n        _isLoadMongoRcJs(isLoadMongoRcJs),\n        _batchSize(batchSize),\n        _timerId(-1),\n        _dbAutocompleteCacheTimerId(-1),\n        _mongoTimeoutSec(mongoTimeoutSec),\n        _shellTimeoutSec(shellTimeoutSec),\n        _isQuiting(0),\n        _dbclient(nullptr),\n        _dbclientRepSet(nullptr),\n        _connSettings(connection)\n    {\n        // Whitespace removed from the start and the end of host string\n        _connSettings->setServerHost(QString::fromStdString(_connSettings->serverHost()).trimmed().toStdString());\n        _thread = new QThread();\n        moveToThread(_thread);\n        VERIFY(connect( _thread, SIGNAL(finished()), _thread, SLOT(deleteLater()) ));\n        VERIFY(connect( _thread, SIGNAL(finished()), this, SLOT(deleteLater()) ));\n        _thread->start();\n    }\n\n    void MongoWorker::timerEvent(QTimerEvent *event)\n    {\n        if (_timerId == event->timerId()) {\n            keepAlive();\n            return;\n        }\n\n        if (_dbAutocompleteCacheTimerId == event->timerId() && !_scriptEngine) {\n            _scriptEngine->invalidateDbCollectionsCache();\n            return;\n        }\n    }\n\n    void MongoWorker::restartReplicaSetConnection()\n    {\n        if (!_connSettings->hasEnabledPrimaryCredential())\n            return;\n\n        CredentialSettings *credentials = _connSettings->primaryCredential();\n        mongo::BSONObj authParams {\n            mongo::BSONObjBuilder()\n            .append(\"user\", credentials->userName())\n            .append(\"db\", credentials->databaseName())\n            .append(\"pwd\", credentials->userPassword())\n            .append(\"mechanism\", credentials->mechanism())\n            .obj()\n        };\n\n        _dbclientRepSet.release();\n        if(mongo::DBClientBase *conn = getConnection(true).first)\n            conn->auth(authParams);\n    }\n\n    void MongoWorker::keepAlive()\n    {\n        try {\n            if (_dbclient)\n                pingDatabase(_dbclient.get());\n\n            if (_dbclientRepSet)\n                pingDatabase(_dbclientRepSet.get());\n\n            if (_scriptEngine)\n                _scriptEngine->ping();\n\n        } \n        catch(std::exception &ex) {\n            sendLog(this, LogEvent::RBM_WARN, \n                \"Failed to ping the server. \" + std::string(ex.what()));\n        }\n    }\n\n    void MongoWorker::init()\n    {        \n        try {\n            _scriptEngine.reset(new ScriptEngine(_connSettings, _shellTimeoutSec));\n            _scriptEngine->init(_isLoadMongoRcJs);\n            _scriptEngine->use(_connSettings->defaultDatabase());\n            _scriptEngine->setBatchSize(_batchSize);\n            constexpr int PING_INTERVAL_MSEC { 60 * 1000 };  // 60 seconds\n            _timerId = startTimer(PING_INTERVAL_MSEC);\n            _dbAutocompleteCacheTimerId = startTimer(30000);\n        } catch (const std::exception &ex) {\n            auto const msg { \"Failed to initialize MongoWorker. Reason: \"};\n            sendLog(this, LogEvent::RBM_ERROR, msg + std::string(ex.what()));\n            throw std::runtime_error(msg + std::string(ex.what()));\n        }\n    }\n\n    void MongoWorker::interrupt() {\n        try {\n            if (_isQuiting || !_scriptEngine)\n                return;\n\n            _scriptEngine->interrupt();\n        } catch(const std::exception &ex) {\n            sendLog(this, LogEvent::RBM_ERROR, std::string(ex.what()));\n        }\n    }\n\n    MongoWorker::~MongoWorker()\n    {\n        if (_timerId != -1)\n            killTimer(_timerId);\n\n        if (_dbAutocompleteCacheTimerId != -1)\n            killTimer(_dbAutocompleteCacheTimerId);\n\n        delete _connSettings;\n\n        // QThread \"_thread\" and MongoWorker itself will be deleted later\n        // (see MongoWorker() constructor)\n    }\n\n    void MongoWorker::stopAndDelete()\n    {\n        _isQuiting = 1;\n        _thread->quit();\n    }\n\n    void MongoWorker::changeTimeout(int newTimeout)\n    {\n        _scriptEngine->changeTimeout(newTimeout);\n    }\n\n    /**\n     * @brief Initiate connection to MongoDB\n     */\n    bool MongoWorker::handle(EstablishConnectionRequest *event)\n    {\n        QMutexLocker lock(&_firstConnectionMutex);\n\n        std::unique_ptr<ReplicaSet> repSetInfo(new ReplicaSet);\n        auto errorCode = EventError::ErrorCode::Unknown;\n\n        try {\n            auto const& connAndErrorStr = getConnection(true);\n            mongo::DBClientBase *conn = connAndErrorStr.first;           \n            \n            // --- Connection failed for single server & replica set (no member of the set is reachable)\n            if (!conn) \n            {\n                auto errorReason = std::string(\"Connection failure: Unknown error.\");\n                auto const& connErrorStr = connAndErrorStr.second;\n\n                if (_connSettings->sslSettings()->sslEnabled())\n                     errorReason = \n                         \"TLS tunnel failure: Network is unreachable or TLS connection rejected by server.\" + \n                          (connErrorStr.empty() ? \"\" : \" Reason: \" + connErrorStr);\n                else {  // Non-TLS connections\n                    if (_connSettings->isReplicaSet()) {\n                        errorReason = \"No member of the set is reachable.\" + \n                                      (connErrorStr.empty() ? \"\" : \" Reason: \" + connErrorStr);\n                        std::vector<std::pair<std::string, bool>> membersAndHealths;\n                        for (auto const& member : _connSettings->replicaSetSettings()->members())\n                            membersAndHealths.push_back({ member, false });\n                        \n                        repSetInfo.reset(new ReplicaSet(\"\", mongo::HostAndPort(), membersAndHealths, errorReason));\n                    }\n                    else    // single server\n                        errorReason = \"Network is unreachable.\" + (connErrorStr.empty() ? \"\" : \" Reason: \" + connErrorStr);\n                }\n                resetGlobalSSLparams();\n\n                reply(event->sender(), new EstablishConnectionResponse(this, EventError(errorReason, errorCode),             \n                      event->connectionType, event->uuid, *repSetInfo.release(), \n                      EstablishConnectionResponse::MongoConnection));\n\n                return false;\n            }\n            \n            // --- Single server: Connection successful \n            // --- Replica set:   Connection successful (primary reachable) or \n            //                    Connection failed (primary unreachable with at least one reachable member)\n            if (_connSettings->isReplicaSet()) {\n                ReplicaSet const& setInfo = getReplicaSetInfo();\n\n                // Check if same set name used with different members which is not supported\n                auto const& members = _connSettings->replicaSetSettings()->members();\n                if (std::find(members.cbegin(), members.cend(), setInfo.primary.toString()) == members.cend()) \n                {   // primary not found between user entered members\n                    std::string const errorStr { \n                        \"Different members found under same replica set name \\\"\" +\n                         setInfo.setName + \"\\\".\" \n                    };\n                    repSetInfo.reset(new ReplicaSet(setInfo));\n                    errorCode = EventError::ErrorCode::ServerHasDifferentMembers;\n                    sendLog(this, LogEvent::RBM_ERROR, errorStr);\n                    throw std::runtime_error(errorStr);\n                }\n\n                if (setInfo.primary.empty()) {  // No reachable primary\n                    // Pass possible reachable secondary(ies) info \n                    repSetInfo.reset(new ReplicaSet(setInfo)); \n                    sendLog(this, LogEvent::RBM_ERROR, setInfo.errorStr);\n                    throw std::runtime_error(setInfo.errorStr);\n                }\n                else {  // Primary is reachable, save setInfo and continue\n                    repSetInfo.reset(new ReplicaSet(setInfo));\n                }\n            }\n\n            if (_connSettings->hasEnabledPrimaryCredential()) {\n                CredentialSettings const * const credentials = _connSettings->primaryCredential();\n\n                // Building BSON object:\n                mongo::BSONObj const authParams { \n                    mongo::BSONObjBuilder()\n                    .append(\"user\", credentials->userName())\n                    .append(\"db\", credentials->databaseName())\n                    .append(\"pwd\", credentials->userPassword())\n                    .append(\"mechanism\", credentials->mechanism())\n                    .obj()\n                };\n\n                conn->auth(authParams);\n            }\n\n            boost::scoped_ptr<MongoClient> client(getClient());\n            std::vector<std::string> const dbNames = getDatabaseNamesSafe(event);\n\n            // If we do not have databases, it means that we are unable to\n            // execute \"listdatabases\" command and we have nothing to show.\n            if (dbNames.size() == 0)\n                throw std::runtime_error(\"Failed to execute \\\"listdatabases\\\" command.\");\n\n            if (!_connSettings->isReplicaSet())\n                init(); // Init MongoWorker for single server (for replica set connections early init is used)\n\n            resetGlobalSSLparams();\n\n            auto connInfo = ConnectionInfo(_connSettings->getFullAddress(), dbNames, client->getVersion(), \n                                           client->dbVersionStr(), client->getStorageEngineType(), event->uuid);\n\n            // todo: two ctors for rep.set and single server.\n            reply(event->sender(), new EstablishConnectionResponse(this, connInfo, event->connectionType, \n                                                                   *repSetInfo.release()));\n            return true;\n        } \n        catch(const std::exception &ex) {\n            resetGlobalSSLparams();\n            auto errorReason = _connSettings->sslSettings()->sslEnabled() ?\n                               EstablishConnectionResponse::ErrorReason::MongoSslConnection : \n                               EstablishConnectionResponse::ErrorReason::MongoAuth;\n\n            reply(event->sender(), new EstablishConnectionResponse(this, EventError(ex.what(), errorCode), \n                  event->connectionType, ConnectionInfo(event->uuid), *repSetInfo.release(), errorReason));\n            sendLog(this, LogEvent::RBM_ERROR, ex.what());  // todo: duplicate logging?\n        }\n\n        return false;\n    }\n\n    void MongoWorker::handle(RefreshReplicaSetFolderRequest *event)\n    {\n\t\tconfigureSSL();\n\n        try {\n            ReplicaSet const& replicaSetInfo = getReplicaSetInfo();\n            // Primary is unreachable, but there might be reachable secondary(ies)\n            if (replicaSetInfo.primary.empty()) {\n                reply(\n                    event->sender(), \n                    new RefreshReplicaSetFolderResponse(\n                        this, replicaSetInfo, event->expanded, EventError(replicaSetInfo.errorStr)\n                    )\n                );\n                sendLog(this, LogEvent::RBM_ERROR, replicaSetInfo.errorStr);\n                return;\n            }\n            else { // Primary is reachable\n                reply(event->sender(), \n                    new RefreshReplicaSetFolderResponse(this, replicaSetInfo, event->expanded));\n            }\n        }\n        catch (const std::exception &ex) {\n            reply(\n                event->sender(),\n                new RefreshReplicaSetFolderResponse(\n                    this, ReplicaSet(), event->expanded, EventError(ex.what())\n                )\n            );\n            sendLog(this, LogEvent::RBM_ERROR, ex.what());\n        }\n    }\n\n    std::string MongoWorker::getAuthBase() const\n    {\n        if (_connSettings->hasEnabledPrimaryCredential())\n            return _connSettings->primaryCredential()->databaseName();\n\n        return std::string();\n    }\n\n    std::vector<std::string> MongoWorker::getDatabaseNamesSafe(EstablishConnectionRequest* event /*= nullptr*/)\n    {\n        std::set<std::string> dbNames;\n        auto const primaryCredential { _connSettings->primaryCredential() };\n\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n            std::vector<std::string> dbNamesFetched { client->getDatabaseNames() };\n            dbNames = std::set<std::string> { dbNamesFetched.cbegin(), dbNamesFetched.cend() };\n        } \n        catch(const std::exception &ex) {\n#if defined(__clang__) \n#pragma clang diagnostic push    \n#pragma clang diagnostic ignored \"-Wlogical-op-parentheses\"\n#endif\n            bool const informUser {\n                event != nullptr &&\n                event->connectionType == ConnectionType::ConnectionPrimary &&\n                _connSettings->credentialCount() > 0 &&\n                !primaryCredential->useManuallyVisibleDbs() ||\n                primaryCredential->manuallyVisibleDbs().empty()\n            };\n#if defined(__clang__) \n#pragma clang diagnostic pop\n#endif\n            std::string const hint {\n                \"\\n\\nHint: If this user has access to a specific database, \"\n                \"please use \\\"Manually specify visible databases\\\" option in \"\n                \"Connection Settings window -> Authentication tab.\"\n            };\n            sendLog(this, LogEvent::RBM_WARN, ex.what() + hint, informUser);\n        }\n\n        if (_connSettings->credentialCount() > 0 &&\n            primaryCredential->useManuallyVisibleDbs() &&\n            !primaryCredential->manuallyVisibleDbs().empty()\n        )\n        {        \n            QString const manuallyVisibleDbs {\n                QString::fromStdString(primaryCredential->manuallyVisibleDbs())\n            };\n\n            for (auto const& db : manuallyVisibleDbs.split(',').toStdList())\n                dbNames.insert(db.toStdString());\n        }\n\n        std::string const authBase = getAuthBase();\n        if (!authBase.empty())\n            dbNames.insert(authBase);\n\n        return std::vector<std::string> { dbNames.cbegin(), dbNames.cend() };\n    }\n\n    /**\n     * @brief Load list of all database names\n     */\n    void MongoWorker::handle(LoadDatabaseNamesRequest *event)\n    {\n        try {\n            // If user not an admin - he doesn't have access to mongodb 'listDatabases' command\n            // Non admin user has access only to the single database he specified while performing auth.\n            std::vector<std::string> dbNames = getDatabaseNamesSafe();\n\n            // Remove from list of created databases existing databases\n            for (std::vector<std::string>::iterator it = dbNames.begin(); it != dbNames.end(); ++it) {\n                std::unordered_set<std::string>::const_iterator exists = _createdDbs.find(*it);\n                if (exists != _createdDbs.end()) {\n                    _createdDbs.erase(*it);\n                }\n            }\n\n            // Merge with list of created databases\n            for (std::unordered_set<std::string>::iterator it = _createdDbs.begin(); it != _createdDbs.end(); ++it) {\n                dbNames.push_back(*it);\n            }\n\n            if (dbNames.size()) {\n                reply(event->sender(), new LoadDatabaseNamesResponse(this, dbNames));\n            } else {\n                auto const errorStr{ \"Failed to execute \\\"listdatabases\\\" command.\" };\n                reply(event->sender(), new LoadDatabaseNamesResponse(this, EventError(errorStr)));\n            }\n        } catch(const std::exception &ex) {\n            reply(event->sender(), new LoadDatabaseNamesResponse(this, EventError(ex.what())));\n            sendLog(this, LogEvent::RBM_ERROR, ex.what());\n        }\n    }\n\n    /**\n     * @brief Load list of all collection names\n     */\n    void MongoWorker::handle(LoadCollectionNamesRequest *event)\n    {\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n            auto const& namespaces = client->getCollectionNamesWithDbname(event->databaseName());\n            std::vector<MongoCollectionInfo> const& collInfos = client->runCollStatsCommand(namespaces);\n            client->done();\n            reply(event->sender(), new LoadCollectionNamesResponse(this, event->databaseName(), collInfos));\n        } catch(const std::exception &ex) {\n            reply(event->sender(), new LoadCollectionNamesResponse(this, EventError(ex.what())));\n            // Logging handled in main thread\n        }\n    }\n\n    void MongoWorker::handle(LoadUsersRequest *event)\n    {\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n            const std::vector<MongoUser> &users = client->getUsers(event->databaseName());\n            client->done();\n\n            reply(event->sender(), new LoadUsersResponse(this, event->databaseName(), users));\n        } catch(const std::exception &ex) {\n            reply(event->sender(), new LoadUsersResponse(this, EventError(ex.what())));\n            // Logging handled in main thread\n        }\n    }\n\n    void MongoWorker::handle(LoadCollectionIndexesRequest *event)\n    {\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n            const std::vector<IndexInfo> &ind = client->getIndexes(event->collection());\n            client->done();\n\n            reply(event->sender(), new LoadCollectionIndexesResponse(this, ind));\n        } catch(const std::exception &ex) {\n            reply(event->sender(), new LoadCollectionIndexesResponse(this, EventError(ex.what())));\n            sendLog(this, LogEvent::RBM_ERROR, ex.what());\n        }\n    }\n\n    void MongoWorker::handle(AddEditIndexRequest *event)\n    {\n        const IndexInfo &newIndex = event->newInfo();\n        const IndexInfo &oldIndex = event->oldInfo();\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n            client->addEditIndex(oldIndex, newIndex);\n            client->done();\n            reply(event->sender(), new AddEditIndexResponse(this, oldIndex, newIndex));\n\n            std::vector<IndexInfo> const &indexes = client->getIndexes(newIndex._collection);\n            reply(event->sender(), new LoadCollectionIndexesResponse(this, indexes));\n        } catch(const std::exception &ex) {\n            reply(event->sender(), \n                new AddEditIndexResponse(this, EventError(ex.what()), oldIndex, newIndex)\n            );\n            // Logging handled in main thread\n        }\n    }\n\n    void MongoWorker::handle(DropCollectionIndexRequest *event)\n    {\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n            client->dropIndexFromCollection(event->collection(), event->index());\n            client->done();\n            reply(event->sender(), \n                new DropCollectionIndexResponse(this, event->collection(), event->index()));\n        } catch(const std::exception &ex) {\n            reply(event->sender(), \n                new DropCollectionIndexResponse(this, EventError(ex.what()), event->index()));\n            // Logging handled in main thread\n        }            \n    }\n\n    void MongoWorker::handle(LoadFunctionsRequest *event)\n    {\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n            const std::vector<MongoFunction> &funcs = client->getFunctions(event->databaseName());\n            client->done();\n\n            // If list of functions from client is empty, try getting it with script engine\n            if (funcs.empty()) {\n                MongoShellExecResult const& result = _scriptEngine->exec(\"db.system.js.find()\", event->databaseName());\n                std::vector<MongoFunction> functions;\n                if (!result.results().empty()) {\n                    auto const& resultDocs = result.results().front().documents();\n                    for (auto const res : resultDocs)\n                        functions.push_back(MongoFunction(res->bsonObj()));\n                }\n                reply(event->sender(), new LoadFunctionsResponse(this, event->databaseName(), functions));\n                return;\n            }\n\n            reply(event->sender(), new LoadFunctionsResponse(this, event->databaseName(), funcs));\n        } catch(const std::exception &ex) {\n            reply(event->sender(), new LoadFunctionsResponse(this, EventError(ex.what())));\n            // Logging handled in main thread\n        }\n    }\n\n    void MongoWorker::handle(InsertDocumentRequest *event)\n    {\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n    \n            if (event->overwrite())\n                client->saveDocument(event->obj(), event->ns());\n            else\n                client->insertDocument(event->obj(), event->ns());\n\n            client->done();\n            reply(event->sender(), new InsertDocumentResponse(this));\n        } \n        catch(const std::exception &ex) {\n            reply(event->sender(), new InsertDocumentResponse(this, EventError(ex.what())));\n            sendLog(this, LogEvent::RBM_ERROR, ex.what());\n        }\n    }\n\n    void MongoWorker::handle(RemoveDocumentRequest *event)\n    {\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n\n            client->removeDocuments(event->ns(), event->query(), \n                                    event->removeCount() == RemoveDocumentCount::ONE);\n            client->done();\n\n            reply(event->sender(), new RemoveDocumentResponse(this, event->removeCount(), event->index()));\n        } \n        catch(const std::exception &ex) {\n            reply(event->sender(), new RemoveDocumentResponse(this, EventError(ex.what()), \n                event->removeCount(), event->index()));\n            // Logging handled in main thread\n        }\n    }\n\n    void MongoWorker::handle(ExecuteQueryRequest *event)\n    {\n        auto const executeQuery = [&]() {\n            boost::scoped_ptr<MongoClient> client { getClient() };\n            std::vector<MongoDocumentPtr> docs = client->query(event->queryInfo());\n            client->done();\n            reply(event->sender(),\n                new ExecuteQueryResponse(this, event->resultIndex(), event->queryInfo(), docs)\n            );\n        };\n\n        try {\n            executeQuery();\n        } catch(const std::exception &ex) {\n            QString const NTORETURN_ERROR { \"unrecognized field: 'ntoreturn'\" };\n            bool const ntoreturnError { \n                QString(ex.what()).compare(NTORETURN_ERROR, Qt::CaseInsensitive) == 0 \n            };\n            // If we have this DocumentDB specific error, try again\n            if (ntoreturnError && _dbclient) {\n                sendLog(this, LogEvent::RBM_ERROR, std::string(ex.what()));\n                try {\n                    _dbclient->tagAsDocDb(true);\n                    executeQuery();\n                    return;\n                } \n                catch (const std::exception &ex) {\n                    sendLog(this, LogEvent::RBM_ERROR, \"Re-try: \" + std::string(ex.what()));\n                }\n            }\n\n            reply(event->sender(), new ExecuteQueryResponse(this, EventError(ex.what())));\n            sendLog(this, LogEvent::RBM_ERROR, std::string(ex.what()));\n        }\n    }\n\n    /**\n     * @brief Execute javascript\n     */\n    void MongoWorker::handle(ExecuteScriptRequest *event)\n    {        \n        try {           \n            if(!_scriptEngine ||\n               (_connSettings->isReplicaSet() && !_dbclientRepSet)) {\n                auto const error{\n                    EventError(\"MongoDB Shell was not initialized or connection failure\")\n                };\n                reply(event->sender(), new ExecuteScriptResponse(this, error));\n                return;\n            }\n\n            // Try to handle case where new shell (which was opened when server unreachable) \n            // was re-executed\n            if (_scriptEngine->failedScope()) {\n                try {\n                    _scriptEngine->init(_isLoadMongoRcJs);\n                }\n                catch (std::exception const& ex) {\n                    sendLog(this, LogEvent::RBM_ERROR, \n                        captilizeFirstChar(ex.what()) + \", cannot init mongo scope\");\n                }\n            }\n\n            // todo: should we use dbName from event or _connSettings? \n            MongoShellExecResult result {\n                _scriptEngine->exec(\n                    event->script, _connSettings->defaultDatabase(), event->aggrInfo\n                )\n            };\n\n            // To fix the problem where 'result' comes with old primary address.\n            if (_connSettings->isReplicaSet()) \n                result.setCurrentServer(\n                    _dbclientRepSet->getSuspectedPrimaryHostAndPort().toString()\n                );\n\n            if (!result.error()) {                \n                reply(\n                    event->sender(),\n                    new ExecuteScriptResponse(this, result, event->script.empty(), \n                        result.timeoutReached()) // todo: rename to shellTimeout...\n                );\n                return;\n            }\n\n            retry(event);\n        } \n        catch(const std::exception &ex) {\n            auto const error { EventError(ex.what(), EventError::Unknown) };\n            reply(event->sender(), new ExecuteScriptResponse(this, error));\n            sendLog(this, LogEvent::RBM_ERROR, ex.what());\n        }\n    }\n\n    void MongoWorker::retry(ExecuteScriptRequest * event)\n    {\n        mongo::DBClientBase* mongodbClient {\n            _dbclient ? _dbclient.get() :\n            dynamic_cast<mongo::DBClientBase*>(_dbclientRepSet.get())\n        };\n\n        if (!mongodbClient->isStillConnected())\n            mongodbClient->checkConnection();\n\n        MongoShellExecResult const result {\n            _scriptEngine->exec(event->script, _connSettings->defaultDatabase())\n        };\n        if (result.error()) {\n            auto const error { EventError(result.errorMessage()) };\n            reply(event->sender(), new ExecuteScriptResponse(this, error));\n        }\n        else {\n            reply(\n                event->sender(),\n                new ExecuteScriptResponse(this, result, event->script.empty(),\n                    result.timeoutReached())\n            );\n        }\n    }\n\n    /**\n     * @brief Interrupt javascript execution\n     */\n    void MongoWorker::handle(StopScriptRequest *)\n    {\n        try {\n            if (!_scriptEngine) {\n                return;\n            }\n\n            _scriptEngine->interrupt();\n        } catch(const std::exception &ex) {\n            sendLog(this, LogEvent::RBM_ERROR, std::string(ex.what()));\n        }\n    }\n\n    void MongoWorker::handle(AutocompleteRequest *event)\n    {\n        try {\n            if (!_scriptEngine) {\n                reply(event->sender(), \n                    new AutocompleteResponse(this, EventError(\"MongoDB Shell was not initialized\")));\n                return;\n            }\n\n            QStringList list = _scriptEngine->complete(event->prefix, event->mode);\n            reply(event->sender(), new AutocompleteResponse(this, list, event->prefix));\n        } catch(const std::exception &ex) {\n            reply(event->sender(), new AutocompleteResponse(this, EventError(ex.what())));\n            sendLog(this, LogEvent::RBM_ERROR, std::string(ex.what()));            \n        }\n    }\n\n    void MongoWorker::handle(CreateDatabaseRequest *event)\n    {\n        std::string dbname = event->database();\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n            client->createDatabase(dbname);\n\n            // Insert to list of created database. Read docs for this hashset in the header\n            _createdDbs.insert(dbname);\n\n            reply(event->sender(), new CreateDatabaseResponse(this, dbname));\n        } catch(const std::exception &ex) {\n            reply(event->sender(), new CreateDatabaseResponse(this, dbname, \n                EventError(ex.what()))\n            );\n            // Logging handled in main thread\n        }\n    }\n\n    void MongoWorker::handle(DropDatabaseRequest *event)\n    {\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n            client->dropDatabase(event->database);\n\n            // Remove from the list of created database, Read docs for this hashset in the header\n            _createdDbs.erase(event->database);\n\n            reply(event->sender(), new DropDatabaseResponse(this, event->database));\n        } \n        catch(const std::exception &ex) {\n            reply(event->sender(), \n                new DropDatabaseResponse(this, event->database, EventError(ex.what()))\n            );\n            // Logging handled in main thread\n        }\n    }\n\n    void MongoWorker::handle(CreateCollectionRequest *event)\n    {\n        std::string const& collection = event->ns().collectionName();\n\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n            client->createCollection(event->ns().toString(), event->getSize(), event->getCapped(),\n                event->getMaxDocNum(), event->getExtraOptions());\n            client->done();\n\n            reply(event->sender(), new CreateCollectionResponse(this, collection));\n        } catch(const std::exception &ex) {\n            reply(event->sender(), \n                new CreateCollectionResponse(this, collection, EventError(ex.what()))\n            );\n            // Logging handled in main thread\n        }\n    }\n\n    void MongoWorker::handle(DropCollectionRequest *event)\n    {\n        std::string const& collection = event->ns().collectionName();\n\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n            client->dropCollection(event->ns());\n            client->done();\n\n            reply(event->sender(), new DropCollectionResponse(this, collection));\n        } catch(const std::exception &ex) {\n            reply(event->sender(), \n                new DropCollectionResponse(this, collection, EventError(ex.what()))\n            );\n            // Logging handled in main thread\n        }\n    }\n\n    void MongoWorker::handle(RenameCollectionRequest *event)\n    {\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n            client->renameCollection(event->ns(), event->newCollection());\n            client->done();\n\n            reply(event->sender(), new RenameCollectionResponse(this, event->ns().collectionName(),\n                                                                event->newCollection()));\n        } catch(const std::exception &ex) {\n            reply(event->sender(), new RenameCollectionResponse(this, EventError(ex.what())));\n            // Logging handled in main thread\n        }\n    }\n\n    void MongoWorker::handle(DuplicateCollectionRequest *event)\n    {\n        std::string const& sourceCollection = event->ns().collectionName();\n\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n            client->duplicateCollection(event->ns(), event->newCollection());\n            client->done();\n\n            reply(event->sender(), \n                new DuplicateCollectionResponse(this, sourceCollection, event->newCollection())\n            );\n        }\n        catch (const std::exception &ex) {\n            reply(event->sender(), \n                new DuplicateCollectionResponse(this, sourceCollection, EventError(ex.what()))\n            );\n            // Logging handled in main thread\n        }\n    }\n    \n    void MongoWorker::handle(CopyCollectionToDiffServerRequest *event)\n    {\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n            MongoWorker *cl = event->worker();\n            client->copyCollectionToDiffServer(\n                cl->_dbclient.get(), event->from(), event->to()\n            );\n            client->done();\n\n            reply(event->sender(), new CopyCollectionToDiffServerResponse(this));\n        } catch(const std::exception &ex) {\n            reply(event->sender(), \n                new CopyCollectionToDiffServerResponse(this, EventError(ex.what()))\n            );\n            sendLog(this, LogEvent::RBM_ERROR, std::string(ex.what()));\n        }\n    }\n\n    void MongoWorker::handle(CreateUserRequest *event)\n    {\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n            client->createUser(event->database(), event->user());\n            client->done();\n\n            reply(event->sender(), new CreateUserResponse(this, event->user().name()));\n        } catch(const std::exception &ex) {\n            reply(event->sender(), \n                new CreateUserResponse(this, event->user().name(), EventError(ex.what()))\n            );\n            // Logging handled in main thread\n        }\n    }\n\n    void MongoWorker::handle(DropUserRequest *event)\n    {\n        try {\n            boost::scoped_ptr<MongoClient> client(getClient());\n            client->dropUser(event->database(), event->username());\n            client->done();\n\n            reply(event->sender(), new DropUserResponse(this, event->username()));\n        } catch(const std::exception &ex) {\n            reply(event->sender(), \n                new DropUserResponse(this, event->username(), EventError(ex.what()))\n            );\n            // Logging handled in main thread\n        }\n    }\n\n    void MongoWorker::handle(CreateFunctionRequest *event)\n    {\n        std::string const& functionName = event->function().name();\n\n        try {\n            if (event->dbVersion() >= 3.4) {\n                auto const cmd = \"db.system.js.save(\" + event->function().toBson().toString() + ')';\n                MongoShellExecResult const& result = _scriptEngine->exec(cmd, event->database());\n                if (result.error())\n                    throw std::runtime_error(result.errorMessage());\n            }\n            else {\n                boost::scoped_ptr<MongoClient> client(getClient());\n                client->createFunction(event->database(), event->function(), event->existingFunctionName());\n                client->done();\n            }\n\n            reply(event->sender(), new CreateFunctionResponse(this, functionName));\n        } catch(const std::exception &ex) {\n            reply(event->sender(), \n                new CreateFunctionResponse(this, functionName, EventError(ex.what()))\n            );\n            // Logging handled in main thread\n        }\n    }\n\n    void MongoWorker::handle(DropFunctionRequest *event)\n    {\n        try {\n            if (event->dbVersion() >= 3.4) {\n                auto const cmd = \"db.system.js.remove( { _id : \\\"\" + event->functionName() + \"\\\" } )\";\n                MongoShellExecResult const& result = _scriptEngine->exec(cmd, event->database());\n                if (result.error())\n                    throw std::runtime_error(result.errorMessage());\n            }\n            else {\n                boost::scoped_ptr<MongoClient> client(getClient());\n                client->dropFunction(event->database(), event->functionName());\n                client->done();\n            }\n\n            reply(event->sender(), new DropFunctionResponse(this, event->functionName()));\n        }\n        catch (const std::exception &ex) {\n            reply(event->sender(), \n                new DropFunctionResponse(this, event->functionName(), EventError(ex.what()))\n            );\n            // Logging handled in main thread\n        }\n    }\n\n    std::pair<mongo::DBClientBase*, std::string> MongoWorker::getConnection(bool mayReturnNull /* = false */)\n    {\n        configureSSL();\n\n        // --- Perform connection ---\n        if (_connSettings->isReplicaSet()) { // connection to replica set \n            if(_dbclientRepSet)\n                return { _dbclientRepSet.get(), \"\" };\n\n            init(); // Init mongoworker for early-use of _scriptEngine\n\n            // Step-1: Use user entered set name or retrieve set name from cache or from a reachable member\n            std::string setName = _connSettings->replicaSetSettings()->setNameUserEntered();\n            if (setName.empty()) {\n                setName = _connSettings->replicaSetSettings()->cachedSetName();\n                if (setName.empty()) // If there is no cached set name, get it from an on-line replica node\n                    setName = connectAndGetReplicaSetName();\n\n                if (setName.empty())   // It is not possible to continue with empty set name\n                    return { nullptr, \"It is not possible to continue with empty set name\" };\n            }\n\n            // Step-2: Try connect to replica set with set name\n            auto const& membersHostsAndPorts = _connSettings->replicaSetSettings()->membersToHostAndPort();\n            _dbclientRepSet.reset(new mongo::DBClientReplicaSet {\n                 setName, membersHostsAndPorts, APP_NAME_VERSION, _mongoTimeoutSec                 \n            });\n                \n            if (!_dbclientRepSet->connect()) \n                return { nullptr, \"Connect failed\" };\n            else \n                return { _dbclientRepSet.get(), \"\" };\n        }\n        else {  // connection to single server\n            if(_dbclient)\n                return { _dbclient.get(), \"\" };\n            \n            // Timeout for operations\n            // Connect timeout is fixed, but short, at 5 seconds (see headers for DBClientConnection)\n            _dbclient.reset(new mongo::DBClientConnection { true, _mongoTimeoutSec });\n            mongo::Status const& status = _dbclient->connect(_connSettings->hostAndPort(), APP_NAME_VERSION);\n            if (!status.isOK() && mayReturnNull) \n                return { nullptr, status.reason() };\n            else \n                return { _dbclient.get(), \"\" };\n        }\n    }\n\n    MongoClient *MongoWorker::getClient()\n    {\n        return new MongoClient(getConnection().first);\n    }\n\n    void MongoWorker::configureSSL()\n    {\n        // As a precaution reset SSL global params for any kind of connection request (SSL or non-SSL)\n        resetGlobalSSLparams();\n        // Update global SSL mode and global mongo SSL settings\n        if (_connSettings->sslSettings()->sslEnabled()) {\n            // Force SSL mode for outgoing connections\n            mongo::sslGlobalParams.sslMode.store(mongo::SSLParams::SSLMode_requireSSL);\n            updateGlobalSSLparams();\n        }\n        else {\n            // Disable forced SSL mode for outgoing connections\n            mongo::sslGlobalParams.sslMode.store(mongo::SSLParams::SSLMode_allowSSL);\n        }\n    }\n\n    void MongoWorker::updateGlobalSSLparams() const\n    {\n        resetGlobalSSLparams();\n        const SslSettings * const sslSettings = _connSettings->sslSettings();\n        mongo::sslGlobalParams.sslAllowInvalidCertificates = sslSettings->allowInvalidCertificates();\n        if (!mongo::sslGlobalParams.sslAllowInvalidCertificates)\n        {\n            mongo::sslGlobalParams.sslCAFile = sslSettings->caFile();\n        }\n        if (sslSettings->usePemFile())\n        {\n            mongo::sslGlobalParams.sslPEMKeyFile = sslSettings->pemKeyFile();\n            mongo::sslGlobalParams.sslPEMKeyPassword = sslSettings->pemPassPhrase();\n        }\n        if (sslSettings->useAdvancedOptions())\n        {\n            mongo::sslGlobalParams.sslCRLFile = sslSettings->crlFile();\n            mongo::sslGlobalParams.sslAllowInvalidHostnames = sslSettings->allowInvalidHostnames();\n        }\n    }\n\n    void MongoWorker::resetGlobalSSLparams() const\n    {\n        mongo::sslGlobalParams.sslAllowInvalidCertificates = false;\n        mongo::sslGlobalParams.sslCAFile = \"\";\n        mongo::sslGlobalParams.sslPEMKeyFile = \"\";\n        mongo::sslGlobalParams.sslPEMKeyPassword = \"\";\n        mongo::sslGlobalParams.sslCRLFile = \"\";\n        mongo::sslGlobalParams.sslAllowInvalidHostnames = false;\n    }\n\n    // todo: From 1.4, this function started to return incorrect member healths when set is unreachable. \n    //       Needs more investigation.\n    ReplicaSet MongoWorker::getReplicaSetInfo() const\n    {\n        std::string setName;\n        mongo::HostAndPort primary;\n        std::vector<std::pair<std::string, bool>> membersAndHealths;\n\n        // Refresh view of Replica Set Monitor to get live data\n        auto repSetMonitor = mongo::globalRSMonitorManager.getMonitor(_dbclientRepSet->getSetName());\n        \n        // Handle long lasting (e.g. overnight) connections which causes replica set monitor to be null\n        if (!repSetMonitor) {\n            mongo::ReplicaSetMonitor::createIfNeeded(_dbclientRepSet->getSetName(),\n                                                     _connSettings->replicaSetSettings()->membersToHostAndPortAsSet());\n            repSetMonitor = mongo::globalRSMonitorManager.getMonitor(_dbclientRepSet->getSetName());\n            if (!repSetMonitor) // if nullptr again even if the set is reachable, something went really wrong.\n                return ReplicaSet(setName, primary, membersAndHealths, \n                                  \"Unexpected error. Unable to get replica set monitor for set name: \" + \n                                  _dbclientRepSet->getSetName() + \"\\nPlease open a new connection.\");\n        }\n\n        setName = repSetMonitor->getName();\n        auto const readPrimaryOnly = mongo::ReadPreferenceSetting(mongo::ReadPreference::PrimaryOnly, mongo::TagSet());\n        auto const primaryFuture = \n            repSetMonitor->getHostOrRefresh(readPrimaryOnly, mongo::Milliseconds(2000)); \n\n        auto const& primaryStatus{ primaryFuture.waitNoThrow() };\n        if (primaryStatus.isOK())\n            primary = primaryFuture.get();\n\n        QStringList servers;\n        // i.e. setNameAndMembers: \"repset/localhost:27017,localhost:27018,localhost:27019\"\n        QString const setNameAndMembers = QString::fromStdString(repSetMonitor->getServerAddress());\n        QStringList const result = setNameAndMembers.split(\"/\");\n        if (result.size() > 1) \n            servers = result[1].split(\",\");\n\n        // Save address and health of replica members\n        for (QString const& server : servers) {\n            auto const hostAndPort = mongo::HostAndPort(mongo::StringData(server.toStdString()));\n            membersAndHealths.push_back({ server.toStdString(), repSetMonitor->isHostUp(hostAndPort) });\n        }\n\n        return ReplicaSet(setName, primary, membersAndHealths, primaryStatus.reason());\n    }\n\n    std::string MongoWorker::connectAndGetReplicaSetName() const\n    {\n        auto const dbclientTemp { std::make_unique<mongo::DBClientConnection>(true, 10) };\n        std::string setName = \"\";\n\n        // Try connecting to the nodes one by one until getting replica set name.\n        for (auto const& node : _connSettings->replicaSetSettings()->membersToHostAndPort())\n        {\n            if (!dbclientTemp->connect(node, APP_NAME_VERSION).isOK())\n                return \"\";\n\n            _scriptEngine->init(_isLoadMongoRcJs, node.toString());\n            MongoShellExecResult const& result = _scriptEngine->exec(\"rs.status()\", \"\");\n            if (!result.results().empty()) {\n                auto const& resultDocs = result.results().front().documents();\n                if (!resultDocs.empty()) {\n                    setName = resultDocs.front()->bsonObj().getStringField(\"set\");\n                    if (!setName.empty()) // We get the information, finish the loop\n                        break;\n                }\n            }\n        }\n\n        return setName;\n    }\n\n    /**\n     * @brief Send event to this MongoWorker\n     */\n    void MongoWorker::send(Event *event)\n    {\n        if (_isQuiting)\n            return;\n\n        AppRegistry::instance().bus()->send(this, event);\n    }\n\n    /**\n     * @brief Send reply event to object 'receiver'\n     */\n    void MongoWorker::reply(QObject *receiver, Event *event)\n    {\n        if (_isQuiting)\n            return;\n\n        AppRegistry::instance().bus()->send(receiver, event);\n    }\n\n    void MongoWorker::pingDatabase(mongo::DBClientBase *dbclient) const\n    {\n        // Building { ping: 1 }\n        mongo::BSONObjBuilder command;\n        command.append(\"ping\", 1);\n        mongo::BSONObj result;\n        std::string const authBase = getAuthBase();\n        dbclient->runCommand(authBase.empty() ? \"admin\" : authBase, command.obj(), result);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/mongodb/MongoWorker.h",
    "content": "#pragma once\n\n#include <QObject>\n#include <QMutex>\n#include <unordered_set>\n\n#include <mongo/client/dbclient_rs.h> \n\n#include \"robomongo/core/events/MongoEvents.h\"\n\nQT_BEGIN_NAMESPACE\nclass QThread;\nclass QTimer;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class MongoClient;\n    class ScriptEngine;\n    class ConnectionSettings;\n\n    class MongoWorker : public QObject\n    {\n        Q_OBJECT\n\n    public:        \n        explicit MongoWorker(ConnectionSettings *connection, bool isLoadMongoRcJs, int batchSize,\n                             double mongoTimeoutSec, int shellTimeoutSec, QObject *parent = nullptr);\n\n        ~MongoWorker();\n        void interrupt();\n        void stopAndDelete();\n        void changeTimeout(int newTimeout);\n\n    protected Q_SLOTS:\n\n        void init();\n\n        /**\n         * @brief Every minute we are issuing { ping : 1 } command to every used connection\n         * in order to avoid dropped connections.\n         */\n        void keepAlive();\n\n        /**\n         * @brief Initiate connection to MongoDB\n         */\n        bool handle(EstablishConnectionRequest *event);\n\n        /**\n        * @brief Try to re-connect to MongoDB replica set in order to refresh connection view.\n        *        For more details, see MongoServer::tryRefreshReplicaSetFolder()\n        */\n        void handle(RefreshReplicaSetFolderRequest *event);\n\n        /**\n         * @brief Load list of all database names\n         */\n        void handle(LoadDatabaseNamesRequest *event);\n\n        /**\n         * @brief Load list of all collection names\n         */\n        void handle(LoadCollectionNamesRequest *event);\n\n        /**\n         * @brief Load list of all users\n         */\n        void handle(LoadUsersRequest *event);\n\n        /**\n        * @brief Load indexes in collection\n        */\n        void handle(LoadCollectionIndexesRequest *event);\n\n        /**\n        * @brief Add/edit indexes in collection\n        */\n        void handle(AddEditIndexRequest *event);\n\n        /**\n        * @brief delete index from collection\n        */\n        void handle(DropCollectionIndexRequest *event);\n\n        /**\n         * @brief Load list of all JS functions\n         */\n        void handle(LoadFunctionsRequest *event);\n\n        /**\n         * @brief Inserts document\n         */\n        void handle(InsertDocumentRequest *event);\n\n        /**\n         * @brief Remove documents\n         */\n        void handle(RemoveDocumentRequest *event);\n\n        /**\n         * @brief Load list of all collection names\n         */\n        void handle(ExecuteQueryRequest *event);\n\n        /**\n         * @brief Execute javascript\n         */\n        void handle(ExecuteScriptRequest *event);\n        void retry(ExecuteScriptRequest *event);\n        void handle(StopScriptRequest *event);\n\n        void handle(AutocompleteRequest *event);\n        void handle(CreateDatabaseRequest *event);\n        void handle(DropDatabaseRequest *event);\n\n        void handle(CreateCollectionRequest *event);\n        void handle(DropCollectionRequest *event);\n        void handle(RenameCollectionRequest *event);\n        void handle(DuplicateCollectionRequest *event);       \n        void handle(CopyCollectionToDiffServerRequest *event); // todo: unused? remove\n \n        void handle(CreateUserRequest *event);\n        void handle(DropUserRequest *event);\n\n        void handle(CreateFunctionRequest *event);\n        void handle(DropFunctionRequest *event);\n\n    protected:\n        virtual void timerEvent(QTimerEvent *);\n\n    private:\n        // Added after Mongo 4.0 to fix connection failures seen after a first edit/add/remove doc. operation\n        void restartReplicaSetConnection();\n\n        /**\n         * @brief Send event to this MongoWorker\n         */\n        void send(Event *event);\n\n        std::vector<std::string> getDatabaseNamesSafe(EstablishConnectionRequest* event = nullptr);\n        std::string getAuthBase() const;\n\n        // Returns a pair of DBClientBase* connection and error string\n        std::pair<mongo::DBClientBase*, std::string> getConnection(bool mayReturnNull = false);\n        MongoClient *getClient();\n\n        /**\n        *@brief Reset and update global mongo SSL settings (mongo::sslGlobalParams)\n        */\n        void configureSSL();\n\n        /**\n        *@brief Update global mongo SSL settings (mongo::sslGlobalParams) according to active connection \n        *       request's SSL settings.\n        */\n        void updateGlobalSSLparams() const;\n\n        /**\n        *@brief Reset global mongo SSL settings (mongo::sslGlobalParams) into default zero state\n        */\n        void resetGlobalSSLparams() const;\n\n        /**\n        *@brief Update Replica Set related parameters/settings.\n        */\n        ReplicaSet getReplicaSetInfo() const;\n\n        std::string connectAndGetReplicaSetName() const;\n\n        /**\n         * @brief Send reply event to object 'obj'\n         */\n        void reply(QObject *receiver, Event *event);\n\n        /**\n        * @brief Send hear beat messages to database in order to keep connection alive\n        */\n        void pingDatabase(mongo::DBClientBase *dbclient) const;\n\n        QThread *_thread;\n        QMutex _firstConnectionMutex;\n\n        std::unique_ptr<ScriptEngine> _scriptEngine;\n\n        const bool _isLoadMongoRcJs;\n        const int _batchSize;\n        int _timerId;\n        int _dbAutocompleteCacheTimerId;\n        double _mongoTimeoutSec;\n        int _shellTimeoutSec;\n        QAtomicInteger<int> _isQuiting;\n\n        std::unique_ptr<mongo::DBClientConnection> _dbclient;\n        std::unique_ptr<mongo::DBClientReplicaSet> _dbclientRepSet;\n\n        ConnectionSettings *_connSettings;\n\n        // Collection of created databases.\n        // Starting from 3.0, MongoDB drops empty databases.\n        // It means, we did not find a way to create \"empty\" database.\n        // We save all created databases in this collection and merge with\n        // list of real databases returned from MongoDB server.\n        std::unordered_set<std::string> _createdDbs;\n    };\n\n}"
  },
  {
    "path": "src/robomongo/core/mongodb/ReplicaSet.cpp",
    "content": "\n#include \"robomongo/core/mongodb/ReplicaSet.h\"\n\nnamespace Robomongo\n{\n    ReplicaSet::ReplicaSet(std::string const& setName, const mongo::HostAndPort primary,\n                           std::vector<std::pair<std::string, bool>> const& membersAndHealths, \n                           std::string const& errorStr)\n                           : setName(setName), primary(primary), membersAndHealths(membersAndHealths), \n                           errorStr(errorStr)\n    {}\n}\n"
  },
  {
    "path": "src/robomongo/core/mongodb/ReplicaSet.h",
    "content": "#pragma once\n\n#include <mongo/util/net/hostandport.h>\n#include <vector>\n\nnamespace Robomongo\n{\n    /**\n    * @brief Struct to represent live information of a replica set.\n    */\n    struct ReplicaSet\n    {\n        ReplicaSet(std::string const& setName, const mongo::HostAndPort primary,\n                   std::vector<std::pair<std::string, bool>> const& membersAndHealths, std::string const& errorStr = \"\");\n\n        ReplicaSet() {};\n\n        std::string const setName;\n        mongo::HostAndPort const primary;        \n        std::string const errorStr;\n        \n        // pair: {HostNameAndPort, Health} \n        std::vector<std::pair<std::string, bool>> const membersAndHealths;  \n            // todo: make first element of pair type HostnameAndPort\n    };\n}"
  },
  {
    "path": "src/robomongo/core/mongodb/SshTunnelWorker.cpp",
    "content": "#include \"robomongo/core/mongodb/SshTunnelWorker.h\"\n\n#include <QThread>\n#include <QElapsedTimer>\n\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/utils/Logger.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/EventBus.h\"\n#include \"robomongo/core/settings/SshSettings.h\"\n#include \"robomongo/core/events/MongoEvents.h\"\n#include \"robomongo/ssh/ssh.h\"\n#include \"robomongo/core/domain/App.h\"\n\nnamespace Robomongo\n{\n    SshTunnelWorker::SshTunnelWorker(ConnectionSettings *settings) : QObject(),\n        _settings(settings),\n        _sshSession(NULL),\n        _configCreator(settings)\n    {\n        _thread = new QThread();\n        moveToThread(_thread);\n        VERIFY(connect(_thread, SIGNAL(finished()), _thread, SLOT(deleteLater())));\n        VERIFY(connect(_thread, SIGNAL(finished()), this, SLOT(deleteLater())));\n        _thread->start();\n    }\n\n    SshTunnelWorker::~SshTunnelWorker()\n    {\n        // QThread \"_thread\" and MongoWorker itself will be deleted later\n        // (see MongoWorker() constructor)\n\n        delete _settings;\n        printf(\"SSH tunnel closed.\\n\");\n    }\n\n    void SshTunnelWorker::stopAndDelete() {\n        _isQuiting = 1;\n        _thread->quit();\n    }\n\n    void SshTunnelWorker::handle(EstablishSshConnectionRequest *event) {\n        try {\n            if (_isQuiting)\n                return;\n\n            // Additionally configure \"rbm_ssh_tunnel_config\"\n            _configCreator.config()->logcontext = this;\n            _configCreator.config()->logcallback = &SshTunnelWorker::logCallbackHandler;\n            _configCreator.config()->loglevel = (rbm_ssh_log_type) _settings->sshSettings()->logLevel(); // RBM_SSH_LOG_TYPE_DEBUG;\n\n            if ((_sshSession = rbm_ssh_session_create(_configCreator.config())) == 0) {\n                // Not much we can say about this error\n                throw std::runtime_error(\"Failed to create SSH session\");\n            }\n\n            if (rbm_ssh_session_setup(_sshSession) == -1) {\n                // Prepare copy of error message (if any)\n                std::string error(_sshSession->lasterror);\n\n                std::stringstream ss;\n                ss << \"Failed to create SSH tunnel to \"\n                    << _settings->sshSettings()->host() << \":\"\n                    << _settings->sshSettings()->port() << \".\\n\\nError:\\n\"\n                    << error;\n\n                // Cleanup session\n                rbm_ssh_session_close(_sshSession);\n                _sshSession = NULL;\n\n                throw std::runtime_error(ss.str());\n            }\n\n            reply(event->sender(), new EstablishSshConnectionResponse(\n                    this, event->serverHandle, event->worker, event->settings, event->connectionType, _configCreator.config()->localport));\n\n        } catch (const std::exception& ex) {\n            reply(event->sender(),\n                new EstablishSshConnectionResponse(this, event->serverHandle, EventError(ex.what()),\n                event->worker, event->settings, event->connectionType));\n\n            // In case of error in connection, we should cleanup SshTunnelWorker\n            stopAndDelete();\n        }\n    }\n\n    void SshTunnelWorker::handle(ListenSshConnectionRequest *event) {\n        try {\n            if (_isQuiting)\n                return;\n\n            if (_sshSession == NULL)\n                return;\n\n            // We are running this timer in order to distinguish between two\n            // types of errors:\n            // 1) SSH tunnel wasn't successfully created\n            // 2) SSH tunnel was disconnected\n            // This is used now only for UI error message, that we show to user.\n            QElapsedTimer timer;\n            timer.start();\n\n            // This function will block until all TCP connections disconnects.\n            // Initially, it will wait for at least one such connection.\n            if (rbm_ssh_open_tunnel(_sshSession) != 0) {\n\n                qint64 elapsed = timer.elapsed();\n                bool wasDisconnected = elapsed > 20000; // More than 20 seconds passed\n\n                // Prepare copy of error message (if any)\n                std::string error(_sshSession->lasterror);\n\n                std::stringstream ss;\n\n                if (wasDisconnected) {\n                    ss << \"You are disconnected from SSH tunnel (\"\n                        << _settings->sshSettings()->host() << \":\"\n                        << _settings->sshSettings()->port() << \"). \"\n                        << \"Please initiate a new connection and reopen all tabs.\\n\\nError:\\n\"\n                        << error;\n                } else {\n                    ss << \"Cannot establish SSH tunnel (\"\n                        << _settings->sshSettings()->host() << \":\"\n                        << _settings->sshSettings()->port() << \"). \"\n                        << \"\\n\\nError:\\n\"\n                        << error;\n                }\n\n                // Cleanup session\n                rbm_ssh_session_close(_sshSession);\n                _sshSession = NULL;\n\n                throw std::runtime_error(ss.str());\n            }\n\n            log(\"SSH tunnel stopped normally.\", false);\n\n        } catch (const std::exception& ex) {\n            reply(event->sender(),\n                  new ListenSshConnectionResponse(this, EventError(ex.what()), event->serverHandle, _settings, event->connectionType));\n        }\n\n        // When we done with SSH (i.e. rbm_ssh_open_tunnel exits) regardless\n        // of the error or success state, we should cleanup SshTunnelWorker.\n        stopAndDelete();\n    }\n\n    /**\n     * @brief Send reply event to object 'receiver'\n     */\n    void SshTunnelWorker::reply(QObject *receiver, Event *event)\n    {\n        if (_isQuiting)\n            return;\n\n        AppRegistry::instance().bus()->send(receiver, event);\n    }\n\n    void SshTunnelWorker::log(const std::string &message, int level) {\n        if (_isQuiting)\n            return;\n\n        AppRegistry::instance().bus()->send(\n            AppRegistry::instance().app(),\n            new LogEvent(this, message, (LogEvent::LogLevel)level));\n    }\n\n    void SshTunnelWorker::logCallbackHandler(void *context, char *message, int level) {\n        static_cast<SshTunnelWorker*>(context)->log(message, level);\n    }\n\n    /*\n     * SshTunnelConfigCreator\n     */\n    SshTunnelConfigCreator::SshTunnelConfigCreator(ConnectionSettings *settings) {\n        SshSettings *ssh = settings->sshSettings();\n\n        // We are going to access raw char* buffers, so prepare copies\n        // of strings (and rest of the things for symmetry)\n        _sshhost = ssh->host();\n        _sshport = ssh->port();\n        _remotehost = settings->serverHost();\n        _remoteport = settings->serverPort();\n        _localip = \"127.0.0.1\";\n        _localport = 27040;\n\n        _userName = ssh->userName();\n        _userPassword = ssh->userPassword();\n        _privateKeyFile = ssh->privateKeyFile();\n        _publicKeyFile = ssh->publicKeyFile();\n        _passphrase = ssh->passphrase();\n        _authMethod = ssh->authMethod(); // \"password\" or \"publickey\"\n\n        // Use \"askedPassword\" for both passphrase and password if required\n        if (ssh->askPassword()) {\n            _passphrase = ssh->askedPassword();\n            _userPassword = ssh->askedPassword();\n        }\n\n        _sshConfig = new rbm_ssh_tunnel_config;\n        _sshConfig->sshserverhost = const_cast<char*>(_sshhost.c_str());\n        _sshConfig->sshserverport = static_cast<unsigned int>(_sshport);\n        _sshConfig->remotehost = const_cast<char*>(_remotehost.c_str());\n        _sshConfig->remoteport = static_cast<unsigned int>(_remoteport);\n        _sshConfig->localip = const_cast<char*>(_localip.c_str());\n        _sshConfig->localport = static_cast<unsigned int>(_localport);\n\n        _sshConfig->username = const_cast<char*>(_userName.c_str());\n        _sshConfig->password = const_cast<char*>(_userPassword.c_str());\n        _sshConfig->privatekeyfile = const_cast<char*>(_privateKeyFile.c_str());\n        _sshConfig->publickeyfile = _publicKeyFile.empty() ? NULL : const_cast<char*>(_publicKeyFile.c_str());\n        _sshConfig->passphrase = const_cast<char*>(_passphrase.c_str());\n        _sshConfig->authtype = (_authMethod == \"publickey\") ? RBM_SSH_AUTH_TYPE_PUBLICKEY : RBM_SSH_AUTH_TYPE_PASSWORD;\n\n        // Default settings\n        _sshConfig->logcontext = NULL;\n        _sshConfig->logcallback = NULL;\n        _sshConfig->loglevel = RBM_SSH_LOG_TYPE_ERROR;\n\n    }\n\n    SshTunnelConfigCreator::~SshTunnelConfigCreator() {\n        delete _sshConfig;\n    }\n}\n\n\n"
  },
  {
    "path": "src/robomongo/core/mongodb/SshTunnelWorker.h",
    "content": "#pragma once\n\n#include <QObject>\n\n#include <robomongo/ssh/ssh.h>\n#include \"robomongo/core/events/MongoEvents.h\"\n\nQT_BEGIN_NAMESPACE\nclass QThread;\nQT_END_NAMESPACE\n\nstruct rbm_ssh_tunnel_config;\nstruct rbm_ssh_session;\n\nnamespace Robomongo\n{\n    class ConnectionSettings;\n    class EstablishSshConnectionRequest;\n    class ListenSshConnectionRequest;\n\n    /*\n     * Helper class for creating rbm_ssh_tunnel_config from ConnectionSettings\n     * Automatically deletes allocated structure\n     */\n    class SshTunnelConfigCreator {\n    public:\n        explicit SshTunnelConfigCreator(ConnectionSettings *settings);\n        ~SshTunnelConfigCreator();\n        rbm_ssh_tunnel_config *config() { return _sshConfig; }\n\n    private:\n        std::string _sshhost;\n        int _sshport;\n        std::string _remotehost;\n        int _remoteport;\n        std::string _localip;\n        int _localport;\n\n        std::string _userName;\n        std::string _userPassword;\n        std::string _privateKeyFile;\n        std::string _publicKeyFile;\n        std::string _passphrase;\n        std::string _authMethod; // \"password\" or \"publickey\"\n\n        rbm_ssh_tunnel_config* _sshConfig;\n    };\n\n    class SshTunnelWorker : public QObject\n    {\n    Q_OBJECT\n\n    public:\n        explicit SshTunnelWorker(ConnectionSettings *settings);\n        ~SshTunnelWorker();\n\n        static void logCallbackHandler(void* context, char *message, int level);\n\n    protected:\n        void stopAndDelete();\n\n    protected Q_SLOTS: // handlers:\n        void handle(EstablishSshConnectionRequest *event);\n        void handle(ListenSshConnectionRequest *event);\n\n    private:\n        void reply(QObject *receiver, Event *event);\n        void log(const std::string& message, int level = 3);\n\n        QThread *_thread;\n        QAtomicInteger<int> _isQuiting;\n        ConnectionSettings* _settings;\n        rbm_ssh_session* _sshSession;\n\n        SshTunnelConfigCreator _configCreator;\n    };\n\n}\n"
  },
  {
    "path": "src/robomongo/core/settings/ConnectionSettings.cpp",
    "content": "#include \"robomongo/core/settings/ConnectionSettings.h\"\n\n#include <stdio.h>\n\n#include <QUuid>\n\n#include \"robomongo/core/settings/CredentialSettings.h\"\n#include \"robomongo/core/settings/ReplicaSetSettings.h\"\n#include \"robomongo/core/settings/SshSettings.h\"\n#include \"robomongo/core/settings/SslSettings.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\n#include <boost/algorithm/string.hpp>\n\nnamespace\n{\n    const unsigned port = 27017;\n    const char *defaultServerHost = \"localhost\";\n    const char *defaultNameConnection = \"New Connection\";\n\n    const int maxLength = 300;\n}\n\nnamespace Robomongo\n{\n    /**\n     * Creates ConnectionSettings with default values\n     */\n    ConnectionSettings::ConnectionSettings(bool isClone) : QObject(),\n        _connectionName(defaultNameConnection),\n        _host(defaultServerHost),\n        _port(port),\n        _imported(false),\n        _sshSettings(new SshSettings()),\n        _sslSettings(new SslSettings()),\n        _isReplicaSet(false),\n        _replicaSetSettings(new ReplicaSetSettings()),\n        _clone(isClone)\n    { }\n\n    ConnectionSettings::ConnectionSettings(const mongo::MongoURI& uri, bool isClone)  \n        : _connectionName(defaultNameConnection),\n        _host(defaultServerHost),\n        _port(port),\n        _imported(false),\n        _sshSettings(new SshSettings()),\n        _sslSettings(new SslSettings()),\n        _isReplicaSet((uri.type() == mongo::ConnectionString::ConnectionType::SET)),\n        _replicaSetSettings(new ReplicaSetSettings(uri)),\n        _clone(isClone)\n    {\n        // Disabling unfinished feature : Export / Import to / from MongoURI\n        /*\n        if (!uri.getServers().empty()) {\n            _host = uri.getServers().front().host();\n            _port = uri.getServers().front().port();\n        }\n\n        auto str = std::string(uri.getOptions().getStringField(\"ssl\"));\n        auto sslEnabled = (\"true\" == str);\n        if (sslEnabled) {\n            _sslSettings->enableSSL(true);\n            _sslSettings->setAllowInvalidCertificates(true);\n        }\n\n        auto credential = new CredentialSettings();\n        credential->setUserName(uri.getUser());\n        credential->setUserPassword(uri.getPassword());\n        credential->setDatabaseName(uri.getDatabase());\n        if (!credential->userName().empty() && !credential->userPassword().empty()) {   // todo:\n            credential->setEnabled(true);\n        }\n        addCredential(credential);\n        */\n    }\n\n    void ConnectionSettings::fromVariant(const QVariantMap &map) {\n        setConnectionName(QtUtils::toStdString(map.value(\"connectionName\").toString()));\n        setServerHost(QtUtils::toStdString(map.value(\"serverHost\").toString().left(maxLength)));\n        setServerPort(map.value(\"serverPort\").toInt());\n        setDefaultDatabase(QtUtils::toStdString(map.value(\"defaultDatabase\").toString()));\n        setReplicaSet(map.value(\"isReplicaSet\").toBool());       \n        \n        QVariantList list = map.value(\"credentials\").toList();\n        for (QVariantList::const_iterator it = list.begin(); it != list.end(); ++it) {\n            QVariant var = *it;\n            CredentialSettings *credential = new CredentialSettings(var.toMap());\n            addCredential(credential);\n        }\n\n        if (map.contains(\"ssh\")) {\n            _sshSettings->fromVariant(map.value(\"ssh\").toMap());\n        }\n\n        if (map.contains(\"ssl\")) {\n            _sslSettings->fromVariant(map.value(\"ssl\").toMap());\n        }\n\n        if (isReplicaSet()) {\n            _replicaSetSettings->fromVariant(map.value(\"replicaSet\").toMap());\n        }\n\n        // If UUID has never been created or is empty, create a new one. Otherwise load the existing.\n        if (!map.contains(\"uuid\") || map.value(\"uuid\").toString().isEmpty())\n            _uuid = QUuid::createUuid().toString();\n        else\n            _uuid = map.value(\"uuid\").toString();\n\n\n//#ifdef MONGO_SSL\n//      ,SSLInfo(map.value(\"sslEnabled\").toBool(),QtUtils::toStdString(map.value(\"sslPemKeyFile\").toString()))\n//#endif\n    }\n\n    /**\n     * Cleanup used resources\n     */\n    ConnectionSettings::~ConnectionSettings()\n    {\n        clearCredentials();\n    }\n\n    /**\n     * Creates completely new ConnectionSettings by cloning this record.\n     */\n    ConnectionSettings *ConnectionSettings::clone() const\n    {\n        auto settings = new ConnectionSettings(true);\n        settings->setUuid(_uuid);\n        settings->apply(this);\n        return settings;\n    }\n\n    /**\n     * Discards current state and applies state from 'source' ConnectionSettings.\n     */\n    void ConnectionSettings::apply(const ConnectionSettings *source)\n    {\n        setConnectionName(source->connectionName());\n        setServerHost(source->serverHost());\n        setServerPort(source->serverPort());\n        setDefaultDatabase(source->defaultDatabase());\n        setImported(source->imported());\n        setReplicaSet(source->isReplicaSet());\n\n        clearCredentials();\n        QList<CredentialSettings *> cred = source->credentials();\n        for (QList<CredentialSettings *>::iterator it = cred.begin(); it != cred.end(); ++it) {\n            addCredential((*it)->clone());\n        }\n\n        _sshSettings.reset(source->sshSettings()->clone());\n        _sslSettings.reset(source->sslSettings()->clone());\n        _replicaSetSettings.reset(source->_replicaSetSettings->clone());\n\n//#ifdef MONGO_SSL\n//        setSslInfo(source->sslInfo());\n//#endif\n    }\n\n    /**\n     * @brief Converts to QVariantMap\n     */\n    QVariant ConnectionSettings::toVariant() const\n    {\n        QVariantMap map;\n        map.insert(\"connectionName\", QtUtils::toQString(connectionName()));\n        map.insert(\"serverHost\", QtUtils::toQString(serverHost()));\n        map.insert(\"serverPort\", serverPort());\n        map.insert(\"defaultDatabase\", QtUtils::toQString(defaultDatabase()));\n        map.insert(\"isReplicaSet\", isReplicaSet());\n        if (isReplicaSet())\n            map.insert(\"replicaSet\", _replicaSetSettings->toVariant());\n\n#ifdef MONGO_SSL\n        SSLInfo infl = _info.sslInfo();\n        map.insert(\"sslEnabled\", infl._sslSupport);\n        map.insert(\"sslPemKeyFile\", QtUtils::toQString(infl._sslPEMKeyFile));\n#endif\n        QVariantList list;\n        for (auto const& cred : _credentials)\n            list.append(cred->toVariant());\n        \n        map.insert(\"credentials\", list);\n        map.insert(\"ssh\", _sshSettings->toVariant());\n        map.insert(\"ssl\", _sslSettings->toVariant());\n        map.insert(\"uuid\", _uuid); \n\n        return map;\n    }\n\n     CredentialSettings *ConnectionSettings::findCredential(const std::string &databaseName) const\n     {\n         CredentialSettings *result = nullptr;\n         for (QList<CredentialSettings *>::const_iterator it = _credentials.begin(); it != _credentials.end(); ++it) {\n             CredentialSettings *cred = *it;\n             if (cred->databaseName() == databaseName) {\n                 result = cred;\n                 break;\n             }\n         }\n         return result;\n     }\n\n    /**\n     * @brief Adds credential to this connection\n     */\n    void ConnectionSettings::addCredential(CredentialSettings *credential)\n    {\n        if (!findCredential(credential->databaseName()))\n            _credentials.append(credential);\n    }\n\n    /**\n     * @brief Checks whether this connection has primary credential\n     * which is also enabled.\n     */\n    bool ConnectionSettings::hasEnabledPrimaryCredential() const\n    {\n        if (_credentials.count() == 0)\n            return false;\n\n        return primaryCredential()->enabled();\n    }\n\n    /**\n     * @brief Returns primary credential\n     */\n    CredentialSettings *ConnectionSettings::primaryCredential() const\n    {\n        if (_credentials.count() == 0) {\n            _credentials.append(new CredentialSettings());\n        }\n\n        return _credentials.at(0);\n    }\n\n    /**\n     * @brief Clears and releases memory occupied by credentials\n     */\n    void ConnectionSettings::clearCredentials()\n    {\n        qDeleteAll(_credentials);\n        _credentials.clear();\n    }\n\n    std::string ConnectionSettings::getFullAddress() const\n    {\n        return hostAndPort().toString();\n    }\n\n    mongo::HostAndPort ConnectionSettings::hostAndPort() const \n    {\n        // If it doesn't look like IPv6 address,\n        // treat it like IPv4 or literal hostname\n        if (_host.find(':') == std::string::npos) {\n            return mongo::HostAndPort(_host, _port);\n        }\n\n        // The following code assumes, that it is IPv6 address\n        // If address contains square brackets (\"[\"), remove them:\n        std::string hostCopy = _host;\n        if (_host.find('[') != std::string::npos) {\n            boost::erase_all(hostCopy, \"[\");\n            boost::erase_all(hostCopy, \"]\");\n        }\n\n        return mongo::HostAndPort(hostCopy, _port);\n    }\n\n}\n"
  },
  {
    "path": "src/robomongo/core/settings/ConnectionSettings.h",
    "content": "#pragma once\n\n#include <QString>\n#include <QVariant>\n#include <QVariantMap>\n\n#include <mongo/client/dbclient_base.h>\n#include <mongo/client/mongo_uri.h>\n#include <mongo/util/net/hostandport.h>\n\nnamespace Robomongo\n{\n    class CredentialSettings;\n    class SshSettings;\n    class SslSettings;\n    class ReplicaSetSettings;\n\n    /**\n     * @brief Represents connection record\n     */\n    class ConnectionSettings : public QObject\n    {\n        Q_OBJECT\n\n    public:\n        /**\n         * @brief Creates ConnectionSettings with default values\n         */\n        ConnectionSettings(bool isClone);\n        \n        /**\n        * @brief Creates ConnectionSettings from mongo connection string URI\n        */\n        ConnectionSettings(const mongo::MongoURI& uri, bool isClone);\n\n        explicit ConnectionSettings(QVariantMap map, bool isClone);\n\n        /**\n         * @brief Cleanup used resources\n         */\n        ~ConnectionSettings();\n\n        /**\n         * @brief Creates completely new ConnectionSettings by cloning this record.\n         */\n        ConnectionSettings *clone() const;\n\n        /**\n         * @brief Discards current state and applies state from 'source' ConnectionSettings.\n         */\n        void apply(const ConnectionSettings *source);\n\n        /**\n         * @brief Converts to QVariantMap\n         */\n        QVariant toVariant() const;\n        void fromVariant(const QVariantMap &map);\n\n        /**\n         * @brief Name of connection\n         */\n        std::string connectionName() const { return _connectionName; }\n        void setConnectionName(const std::string &connectionName) { _connectionName = connectionName; }\n\n        /**\n         * @brief Server host\n         */\n        std::string serverHost() const { return _host; }\n        void setServerHost(const std::string &serverHost) { _host = serverHost; }\n\n        /**\n         * @brief Port of server\n         */\n        int serverPort() const { return _port; }\n        void setServerPort(const int port) { _port = port; }\n\n        /**\n         * @brief Default database\n         */\n        std::string defaultDatabase() const { return _defaultDatabase; }\n        void setDefaultDatabase(const std::string &defaultDatabase) { _defaultDatabase = defaultDatabase; }\n\n        /**\n         * Was this connection imported from somewhere?\n         */\n        bool imported() const { return _imported; }\n        void setImported(bool imported) { _imported = imported; }\n\n        /**\n         * @brief Adds credential to this connection\n         */\n        void addCredential(CredentialSettings *credential);\n\n        /**\n         * @brief Clears and releases memory occupied by credentials\n         */\n        void clearCredentials();\n\n        /**\n         * @brief Checks whether this connection has primary credential\n         * which is also enabled.\n         */\n        bool hasEnabledPrimaryCredential() const;\n\n        /**\n         * @brief Returns primary credential\n         */\n        CredentialSettings *primaryCredential() const;\n\n        /**\n         * @brief Returns number of credentials\n         */\n        int credentialCount() const { return _credentials.size(); }\n\n        /**\n         * @brief Returns all credentials\n         */\n        QList<CredentialSettings *> credentials() const { return _credentials; }\n\n        /**\n         * @brief Checks that auth required\n         */\n        /*bool isAuthNeeded() const {\n            bool userSpecified = !_userName.isEmpty();\n            bool passwordSpecified = !_userPassword.isEmpty();\n\n            return (userSpecified || passwordSpecified);\n        }*/\n\n        /**\n         * @brief Returns connection full address (i.e. locahost:8090)\n         */\n        std::string getFullAddress() const;\n\n        std::string getReadableName() const\n        {\n            if (_connectionName.empty())\n                return getFullAddress();\n\n            return _connectionName;\n        }\n\n        mongo::HostAndPort hostAndPort() const;\n        SshSettings *sshSettings() const { return _sshSettings.get(); }\n        SslSettings *sslSettings() const { return _sslSettings.get(); }\n        ReplicaSetSettings *replicaSetSettings() const { return _replicaSetSettings.get(); }\n\n        bool isReplicaSet() const { return _isReplicaSet; }\n        void setReplicaSet(bool flag) { _isReplicaSet = flag; }\n       \n        QString uuid() const { return _uuid; }\n        void setUuid(QString const& uuid) { _uuid = uuid; }\n\n    private:\n        CredentialSettings *findCredential(const std::string &databaseName) const;\n\n        std::string _connectionName;\n        std::string _host;\n        int _port;\n        std::string _defaultDatabase;\n        mutable QList<CredentialSettings *> _credentials;\n        std::unique_ptr<SshSettings> _sshSettings;\n        std::unique_ptr<SslSettings> _sslSettings;\n        bool _isReplicaSet;\n        std::unique_ptr<ReplicaSetSettings> _replicaSetSettings;\n        \n        // Was this connection imported from somewhere?\n        bool _imported;\n\n        // Flag to check if this is a clone(copy) or original ConnectionSettings\n        // Note: If this is not a clone connection settings, this object is original connection \n        //       ConnectionSettings object which is loaded/saved into Robomongo config. file.\n        bool _clone = false;\n\n        // If this is a clone connection settings, unique ID will be used to identify from which \n        // original connection settings this object is cloned.\n        // -1 for invalid(uninitialized) unique ID which should not be seen in theory\n        int _uniqueId = -1;\n\n        // UUID string taken from QUuid. \n        // It is used to identify the unique ID of a connection settings object\n        QString _uuid;\n    };\n}\n\nQ_DECLARE_METATYPE(Robomongo::ConnectionSettings *)\n"
  },
  {
    "path": "src/robomongo/core/settings/CredentialSettings.cpp",
    "content": "#include \"robomongo/core/settings/CredentialSettings.h\"\n\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/utils/RoboCrypt.h\"\n\nnamespace Robomongo\n{\n    CredentialSettings::CredentialSettings() :\n        _userName(),\n        _userPassword(),\n        _databaseName(),\n        _mechanism(),\n        _enabled(false),\n        _useManuallyVisibleDbs(false),\n        _manuallyVisibleDbs()\n    {\n\n    }\n    CredentialSettings::CredentialSettings(const QVariantMap &map) :\n        _userName(QtUtils::toStdString(map.value(\"userName\").toString())),\n        _databaseName(QtUtils::toStdString(map.value(\"databaseName\").toString())),\n        _mechanism(QtUtils::toStdString(map.value(\"mechanism\").toString())),\n        _useManuallyVisibleDbs(map.value(\"useManuallyVisibleDbs\").toBool()),\n        _manuallyVisibleDbs(QtUtils::toStdString(map.value(\"manuallyVisibleDbs\").toString())),\n        _enabled(map.value(\"enabled\").toBool())\n    {\n        // From version Robo 1.3 \"userPasswordEncrypted\" is used instead of \"userPassword\" in config. file\n        if(map.contains(\"userPassword\")) // Robo 1.2 and below\n            _userPassword = map.value(\"userPassword\").toString().toStdString();\n        else if(map.contains(\"userPasswordEncrypted\")) // From Robo 1.3\n            _userPassword = RoboCrypt::decrypt(map.value(\"userPasswordEncrypted\").toString().toStdString());\n    }\n\n    /**\n     * @brief Clones credential settings.\n     */\n    CredentialSettings *CredentialSettings::clone() const\n    {\n        CredentialSettings *cloned = new CredentialSettings(*this);\n        return cloned;\n    }\n\n    QVariant CredentialSettings::toVariant() const\n    {\n        QVariantMap map;\n        map.insert(\"userName\", QtUtils::toQString(userName()));\n        map.insert(\"userPasswordEncrypted\", userPassword().empty() ? \"\" :\n                                            QtUtils::toQString(RoboCrypt::encrypt(userPassword())));\n        map.insert(\"databaseName\", QtUtils::toQString(databaseName()));\n        map.insert(\"mechanism\", QtUtils::toQString(mechanism()));\n        map.insert(\"useManuallyVisibleDbs\", _useManuallyVisibleDbs);\n        map.insert(\"manuallyVisibleDbs\", QtUtils::toQString(_manuallyVisibleDbs));\n        map.insert(\"enabled\", enabled());\n        return map;\n    }\n}"
  },
  {
    "path": "src/robomongo/core/settings/CredentialSettings.h",
    "content": "#pragma once\n\n#include <QString>\n#include <QVariant>\n#include <QVariantMap>\n\nnamespace Robomongo\n{\n    class CredentialSettings\n    {\n    public:\n        CredentialSettings();\n        explicit CredentialSettings(const QVariantMap &map);\n\n        /**\n         * @brief Clones credential settings.\n         */\n        CredentialSettings *clone() const;\n\n        /**\n         * @brief Converts to QVariantMap\n         */\n        QVariant toVariant() const;\n\n        /**\n         * @brief User name\n         */\n        std::string userName() const { return _userName; }\n        void setUserName(const std::string &userName) { _userName = userName; }\n\n        /**\n         * @brief Password\n         */\n        std::string userPassword() const { return _userPassword; }\n        void setUserPassword(const std::string &userPassword) { _userPassword = userPassword; }\n\n        /**\n         * @brief Database name, on which authentication performed\n         */\n        std::string databaseName() const { return _databaseName.empty() ? \"admin\" : _databaseName; }\n        void setDatabaseName(const std::string &databaseName) { _databaseName = databaseName; }\n\n        /**\n         * @brief Authentication mechanism (SCRAM-SHA-1, SCRAM-SHA-256 or MONGODB-CR)\n         */\n        std::string mechanism() const { return _mechanism.empty() ? \"SCRAM-SHA-1\" : _mechanism; }\n        void setMechanism(const std::string &mechanism) { _mechanism = mechanism; }\n\n        /**\n         * @brief Flag, indecating whether we should use this\n         * credentials to perform authentication, or not.\n         */\n        bool enabled() const { return _enabled; }\n        void setEnabled(bool enabled) { _enabled = enabled; }\n\n        bool useManuallyVisibleDbs() const { return _useManuallyVisibleDbs; }\n        void setUseManuallyVisibleDbs(bool enabled) { _useManuallyVisibleDbs = enabled; }\n\n        std::string manuallyVisibleDbs() const { return _manuallyVisibleDbs; }\n        void setManuallyVisibleDbs(std::string const& dbs) { _manuallyVisibleDbs = dbs; }\n\n    private:\n        std::string _userName;\n        std::string _userPassword;  // clear text password (decrypted)\n        std::string _databaseName;\n        std::string _mechanism;     // authentication mechanism (SCRAM-SHA-1, SCRAM-SHA-256 or MONGODB-CR)\n        bool _useManuallyVisibleDbs;\n        std::string _manuallyVisibleDbs;\n\n        /**\n         * @brief Flag, indecating whether we should use this\n         * credentials to perform authentication, or not.\n         */\n        bool _enabled;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/settings/ReplicaSetSettings.cpp",
    "content": "#include \"robomongo/core/settings/ReplicaSetSettings.h\"\n\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace Robomongo\n{\n\n    ReplicaSetSettings::ReplicaSetSettings() \n        : _cachedSetName(\"\"), _members(), _readPreference(ReadPreference::PRIMARY)\n    {}\n\n    ReplicaSetSettings::ReplicaSetSettings(const mongo::MongoURI& uri)\n        : ReplicaSetSettings() \n    {\n        _cachedSetName = uri.getSetName();\n        for (auto const& server : uri.getServers()) {\n            _members.push_back(server.host() + \":\" + std::to_string(server.port()));\n        }\n    }\n\n    ReplicaSetSettings *ReplicaSetSettings::clone() const \n    {\n        ReplicaSetSettings *cloned = new ReplicaSetSettings(*this);\n        return cloned;\n    }\n\n    QVariant ReplicaSetSettings::toVariant() const \n    {\n        QVariantMap map;\n        map.insert(\"setNameUserEntered\", QString::fromStdString(_setNameUserEntered));\n        map.insert(\"cachedSetName\", QString::fromStdString(_cachedSetName));\n        int idx = 0;\n        for (std::string const& str : _members) {\n            map.insert(QString::number(idx), QtUtils::toQString(str));\n            ++idx;\n        }\n        map.insert(\"readPreference\", static_cast<int>(readPreference()));\n        return map;\n    }\n\n    void ReplicaSetSettings::fromVariant(const QVariantMap &map) \n    {\n        setSetNameUserEntered(map.value(\"setNameUserEntered\").toString().toStdString());\n        setCachedSetName(map.value(\"cachedSetName\").toString().toStdString());\n        // Extract and set replica members\n        std::vector<std::string> vec;\n        auto itr = map.begin();\n        int idx = 0;\n        do\n        {\n            itr = map.find(QString::number(idx));\n            if (map.end() == itr) break;\n            vec.push_back(itr->toString().toStdString());\n            ++idx;\n        } while (map.end() != itr);\n        setMembers(vec);\n        // Extract and set read reference\n        setReadPreference(static_cast<ReadPreference>(map.value(\"readPreference\").toInt()));\n    }\n    \n    void ReplicaSetSettings::setMembers(const std::vector<std::string>& members)\n    {\n        _members.clear();\n        for (auto const& member : members)\n            _members.push_back(member);\n    }\n\n    void ReplicaSetSettings::setMembers(const std::vector<std::pair<std::string, bool>>& membersAndHealts)\n    {\n        _members.clear();\n\n        for (auto const& memberAndHealth : membersAndHealts)\n            _members.push_back(memberAndHealth.first);\n    }\n\n    std::vector<mongo::HostAndPort> ReplicaSetSettings::membersToHostAndPort() const \n    {\n        std::vector<mongo::HostAndPort> membersHostAndPort;\n        for (auto const& member : _members)        \n            membersHostAndPort.push_back(mongo::HostAndPort(member));\n        \n        return membersHostAndPort;\n    }\n\n}\n"
  },
  {
    "path": "src/robomongo/core/settings/ReplicaSetSettings.h",
    "content": "#pragma once\n\n#include <QString>\n#include <QVariant>\n#include <QVariantMap>\n\n#include <mongo/util/net/hostandport.h>\n#include <mongo/client/mongo_uri.h>\n\nnamespace Robomongo\n{\n    class ReplicaSetSettings\n    {\n    public:\n        enum class ReadPreference\n        {\n            PRIMARY             = 0,\n            PRIMARY_PREFERRED   = 1\n            // todo: Add all supported read preferences\n        };\n\n        ReplicaSetSettings();\n        \n        ReplicaSetSettings(const mongo::MongoURI& uri);\n\n        /**\n         * Clones Replica Set settings.\n         */\n        ReplicaSetSettings* clone() const;\n\n        /**\n         * Converts to QVariantMap\n         */\n        QVariant toVariant() const;\n        void fromVariant(const QVariantMap &map);\n\n        // Getters\n        std::string const& setNameUserEntered() { return _setNameUserEntered; }\n        std::string const& cachedSetName() { return _cachedSetName; }\n        std::vector<std::string> const& members() const { return _members; }\n        std::vector<mongo::HostAndPort> membersToHostAndPort() const;\n\n        std::set<mongo::HostAndPort> membersToHostAndPortAsSet() const\n        {\n            auto const& members = membersToHostAndPort();\n            return std::set<mongo::HostAndPort>(members.begin(), members.end());\n        }\n        \n        ReadPreference readPreference() const { return _readPreference; }\n\n        // Setters\n        void setSetNameUserEntered(const std::string& setName) { _setNameUserEntered = setName; }\n        void setCachedSetName(const std::string& setName) { _cachedSetName = setName; }\n        void setMembers(const std::vector<std::string>& members);\n        void setMembers(const std::vector<std::pair<std::string,bool>>& membersAndHealts);\n        void deleteAllMembers() { _members.clear(); }\n        void setReadPreference(ReadPreference readPreference) { _readPreference = readPreference; }\n\n\n    private:\n        std::string _setNameUserEntered;\n        std::string _cachedSetName;\n        std::vector<std::string> _members;\n        ReadPreference _readPreference = ReadPreference::PRIMARY;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/settings/SettingsManager.cpp",
    "content": "#include \"robomongo/core/settings/SettingsManager.h\"\n\n#include <QDir>\n#include <QFile>\n#include <QVariantList>\n#include <QUuid>\n#include <QJsonArray>\n#include <QXmlStreamReader>\n#include <QDirIterator>\n\n#include <parser.h>\n#include <serializer.h>\n\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/settings/CredentialSettings.h\"\n#include \"robomongo/core/settings/SshSettings.h\"\n#include \"robomongo/core/settings/SslSettings.h\"\n#include \"robomongo/core/utils/Logger.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/utils/StdUtils.h\"\n#include \"robomongo/gui/AppStyle.h\"\n#include \"robomongo/utils/common.h\"\n#include \"robomongo/utils/qzip/qzipreader_p.h\"\n#include \"robomongo/utils/RoboCrypt.h\"\n\nnamespace Robomongo\n{\n    // 3T config files\n    auto const Studio3T_PropertiesDat {\n        QString(\"%1/.3T/studio-3t/properties.dat\").arg(QDir::homePath())\n    };\n    auto const DataMongodb_PropertiesDat { \n        QString(\"%1/.3T/data-man-mongodb/properties.dat\").arg(QDir::homePath())\n    };\n    auto const MongoChefPro_PropertiesDat {\n        QString(\"%1/.3T/mongochef-pro/properties.dat\").arg(QDir::homePath())\n    };\n    auto const MongoChefEnt_PropertiesDat {\n        QString(\"%1/.3T/mongochef-enterprise/properties.dat\").arg(QDir::homePath())\n    };\n\n    const std::vector<std::pair<QString, QString>> S_3T_ZipFile_And_ConfigFile_List\n    {\n        { Studio3T_PropertiesDat, \"Studio3T.properties\" },\n        { DataMongodb_PropertiesDat, \"3T.data-man-mongodb.properties\" },\n        { MongoChefPro_PropertiesDat, \"3T.mongochef-pro.properties\" },\n        { MongoChefEnt_PropertiesDat, \"3T.mongochef-enterprise.properties\" }\n    };\n\n    // Extract zipFile and find the value of \"anonymousID\" field in propFile\n    QString extractAnonymousIDFromZip(QString const& zipFile, QString const& propfile);\n\n    // Extract \"anonymousID\" from a config file\n    QString extractAnonymousID(QString const& configFile);\n\n    /**\n        * @brief Version of schema\n    */\n    const QString SchemaVersion = \"2.0\";\n\n    const auto CONFIG_FILE_0_8_5 {\n        QString(\"%1/.config/robomongo/robomongo.json\").arg(QDir::homePath())\n    };\n    const auto CONFIG_FILE_1_0_RC1 {\n        QString(\"%1/.config/robomongo/1.0/robomongo.json\").arg(QDir::homePath())\n    };\n    const auto CONFIG_FILE_1_1_0_BETA {\n        QString(\"%1/.3T/robomongo/1.1.0-Beta/robomongo.json\").arg(QDir::homePath())\n    };\n\n    /**\n    * @brief Robomongo config. files of old versions\n    */\n    // Important: In order to import connections from a version, config. file path must\n    //            be defined and placed into the vector initializer list below in order.\n    std::vector<QString> const SettingsManager::_configFilesOfOldVersions\n    {\n        QString(\"%1/.3T/robo-3t/1.4.3/robo3t.json\").arg(QDir::homePath()), // CONFIG_FILE_1_4_3\n        QString(\"%1/.3T/robo-3t/1.4.2/robo3t.json\").arg(QDir::homePath()), // CONFIG_FILE_1_4_2\n        QString(\"%1/.3T/robo-3t/1.4.1/robo3t.json\").arg(QDir::homePath()), // CONFIG_FILE_1_4_1\n        QString(\"%1/.3T/robo-3t/1.4.0/robo3t.json\").arg(QDir::homePath()), // CONFIG_FILE_1_4_0\n        QString(\"%1/.3T/robo-3t/1.3.1/robo3t.json\").arg(QDir::homePath()), // CONFIG_FILE_1_3_1\n        QString(\"%1/.3T/robo-3t/1.3.0/robo3t.json\").arg(QDir::homePath()), // CONFIG_FILE_1_3_0_BETA\n        QString(\"%1/.3T/robo-3t/1.2.1/robo3t.json\").arg(QDir::homePath()), // CONFIG_FILE_1_2_1\n        QString(\"%1/.3T/robo-3t/1.2.0/robo3t.json\").arg(QDir::homePath()), // CONFIG_FILE_1_2_0_BETA\n        QString(\"%1/.3T/robo-3t/1.1.1/robo3t.json\").arg(QDir::homePath()), // CONFIG_FILE_1_1_1\n        CONFIG_FILE_1_1_0_BETA,                                            // CONFIG_FILE_1_1_0_BETA \n        QString(\"%1/.3T/robomongo/1.0.0/robomongo.json\").arg(QDir::homePath()),   // CONFIG_FILE_1_0_0     \n        CONFIG_FILE_1_0_RC1,                                               // CONFIG_FILE_1_0_RC1\n        QString(\"%1/.config/robomongo/0.9/robomongo.json\").arg(QDir::homePath()), // CONFIG_FILE_0_9\n        CONFIG_FILE_0_8_5                                                  // CONFIG_FILE_0_8_5\n    };\n\n    std::vector<ConnectionSettings*>  SettingsManager::_connections;\n    \n    /**\n     * Creates SettingsManager for config file in default location\n     * ~/.config/robomongo/robomongo.json\n     */\n    SettingsManager::SettingsManager() :\n        _version(SchemaVersion),\n        _uuidEncoding(DefaultEncoding),\n        _timeZone(Utc),\n        _viewMode(Robomongo::Tree),\n        _autocompletionMode(AutocompleteAll),\n        _loadMongoRcJs(false),\n        _minimizeToTray(false),\n        _lineNumbers(false),\n        _disableConnectionShortcuts(false),\n        _batchSize(50),\n        _textFontFamily(\"\"),\n        _textFontPointSize(-1),\n        _mongoTimeoutSec(10),\n        _shellTimeoutSec(15),\n        _imported(false)        \n    {\n        if (!QDir().mkpath(ConfigDir))\n            LOG_MSG(\"ERROR: Could not create settings path: \" + ConfigDir, mongo::logger::LogSeverity::Error());\n\n        RoboCrypt::initKey();\n        if (!load()) {  // if load fails (probably due to non-existing config. file or directory)\n            save();     // create empty settings file\n            load();     // try loading again for the purpose of import from previous Robomongo versions\n        }\n\n        LOG_MSG(\"SettingsManager initialized in \" + ConfigFilePath, mongo::logger::LogSeverity::Info(), false);\n    }\n\n    SettingsManager::~SettingsManager()\n    {\n        std::for_each(_connections.begin(), _connections.end(), stdutils::default_delete<ConnectionSettings *>());\n    }\n\n    /**\n     * Load settings from config file.\n     * @return true if success, false otherwise\n     */\n    bool SettingsManager::load()\n    {\n        if (!QFile::exists(ConfigFilePath))\n            return false;\n\n        QFile f(ConfigFilePath);\n        if (!f.open(QIODevice::ReadOnly))\n            return false;\n\n        bool ok;\n        QJson::Parser parser;\n        QVariantMap map = parser.parse(f.readAll(), &ok).toMap();\n        if (!ok)\n            return false;\n\n        loadFromMap(map);\n\n        return true;\n    }\n\n    /**\n     * Saves all settings to config file.\n     * @return true if success, false otherwise\n     */\n    bool SettingsManager::save()\n    {\n        QVariantMap const& map = convertToMap();\n\n        QFile f(ConfigFilePath);\n        if (!f.open(QIODevice::WriteOnly | QIODevice::Truncate)) {\n            LOG_MSG(\"ERROR: Could not write settings to: \" + ConfigFilePath, mongo::logger::LogSeverity::Error());\n            return false;\n        }\n\n        bool ok;\n        QJson::Serializer s;\n        s.setIndentMode(QJson::IndentFull);\n        s.serialize(map, &f, &ok);\n\n        LOG_MSG(\"Settings saved to: \" + ConfigFilePath, mongo::logger::LogSeverity::Info());\n\n        return ok;\n    }\n\n    void SettingsManager::addCacheData(QString const& key, QVariant const& value)\n    {\n        _cacheData.insert(key, value);\n    }\n\n    QVariant SettingsManager::cacheData(QString const& key) const\n    {\n        return _cacheData.value(key);\n    }\n\n    /**\n     * Load settings from the map. Existings settings will be overwritten.\n     */\n    void SettingsManager::loadFromMap(QVariantMap &map)\n    {\n        // 1. Load version\n        _version = map.value(\"version\").toString();\n\n        // 2. Load UUID encoding\n        int encoding = map.value(\"uuidEncoding\").toInt();\n        if (encoding > 3 || encoding < 0)\n            encoding = 0;\n\n        _uuidEncoding = (UUIDEncoding)encoding;\n\n\n        // 3. Load view mode\n        if (map.contains(\"viewMode\")) {\n            int viewMode = map.value(\"viewMode\").toInt();\n            if (viewMode > 2 || viewMode < 0)\n                viewMode = Custom; // Default View Mode\n            _viewMode = (ViewMode)viewMode;\n        }\n        else {\n            _viewMode = Custom; // Default View Mode\n        }\n\n        _autoExpand = map.contains(\"autoExpand\") ? map.value(\"autoExpand\").toBool() : true;\n        _autoExec = map.contains(\"autoExec\") ? map.value(\"autoExec\").toBool() : true;\n        _minimizeToTray = map.contains(\"minimizeToTray\") ? map.value(\"minimizeToTray\").toBool() : false;\n        _lineNumbers = map.contains(\"lineNumbers\") ? map.value(\"lineNumbers\").toBool() : false;\n        _imported = map.contains(\"imported\") ? map.value(\"imported\").toBool() : false;\n        _programExitedNormally = map.contains(\"programExitedNormally\") ? \n                                 map.value(\"programExitedNormally\").toBool() : true;\n\n        _disableHttpsFeatures = map.contains(\"disableHttpsFeatures\") ? \n                                map.value(\"disableHttpsFeatures\").toBool() : false;\n\n        _debugMode = map.contains(\"debugMode\") ? map.value(\"debugMode\").toBool() : false;\n\n        // 4. Load TimeZone\n        int timeZone = map.value(\"timeZone\").toInt();\n        if (timeZone > 1 || timeZone < 0)\n            timeZone = 0;\n\n        _timeZone = (SupportedTimes)timeZone;\n        _loadMongoRcJs = map.value(\"loadMongoRcJs\").toBool();\n        _disableConnectionShortcuts = map.value(\"disableConnectionShortcuts\").toBool();\n        \n        if (map.contains(\"acceptedEulaVersions\")) \n            _acceptedEulaVersions = map.value(\"acceptedEulaVersions\").toStringList().toSet();\n        \n        if (map.contains(\"dbVersionsConnected\"))\n            _dbVersionsConnected = map.value(\"dbVersionsConnected\").toStringList().toSet();\n        \n        // Load anonymousID\n        _anonymousID = getOrCreateAnonymousID(map);\n\n        // Load AutocompletionMode\n        if (map.contains(\"autocompletionMode\")) {\n            int autocompletionMode = map.value(\"autocompletionMode\").toInt();\n            if (autocompletionMode < 0 || autocompletionMode > 2)\n                autocompletionMode = AutocompleteAll; // Default Mode\n            _autocompletionMode = (AutocompletionMode)autocompletionMode;\n        }\n        else {\n            _autocompletionMode = AutocompleteAll; // Default Mode\n        }\n\n        // Load Batch Size\n        _batchSize = map.value(\"batchSize\").toInt();\n        if (_batchSize == 0)\n            _batchSize = 50;\n\n        if (map.contains(\"checkForUpdates\"))\n            _checkForUpdates = map.value(\"checkForUpdates\").toBool();\n\n        _currentStyle = map.value(\"style\").toString();\n        if (_currentStyle.isEmpty()) {\n            _currentStyle = AppStyle::StyleName;\n        }\n\n        // Load font information\n        _textFontFamily = map.value(\"textFontFamily\").toString();\n        _textFontPointSize = map.value(\"textFontPointSize\").toInt();\n\n        if (map.contains(\"mongoTimeoutSec\")) {\n            _mongoTimeoutSec = map.value(\"mongoTimeoutSec\").toInt();\n        }\n\n        if (map.contains(\"shellTimeoutSec\")) {\n            _shellTimeoutSec = map.value(\"shellTimeoutSec\").toInt();\n        }\n\n        // 5. Load connections\n        _connections.clear();\n\n        QVariantList const& list = map.value(\"connections\").toList();\n        for (auto const& conn : list) {\n            auto connSettings = new ConnectionSettings(false);\n            connSettings->fromVariant(conn.toMap());\n            addConnection(connSettings);\n        }\n\n        _toolbars = map.value(\"toolbars\").toMap();\n        ToolbarSettingsContainerType::const_iterator it = _toolbars.find(\"connect\");\n        if (_toolbars.end() == it)\n            _toolbars[\"connect\"] = true;\n\n        it = _toolbars.find(\"open_save\");\n        if (_toolbars.end() == it)\n            _toolbars[\"open_save\"] = true;\n\n        it = _toolbars.find(\"exec\");\n        if (_toolbars.end() == it)\n            _toolbars[\"exec\"] = true;\n\n        it = _toolbars.find(\"explorer\");\n        if (_toolbars.end() == it)\n            _toolbars[\"explorer\"] = true;\n\n        it = _toolbars.find(\"logs\");\n        if (_toolbars.end() == it)\n            _toolbars[\"logs\"] = false;\n\n        _cacheData = map.value(\"cacheData\").toMap();\n\n        // Load connection settings from previous versions of Robomongo\n        importFromOldVersion();\n    }\n\n    /**\n     * Save all settings to map.\n     */\n    QVariantMap SettingsManager::convertToMap() const\n    {\n        QVariantMap map;\n\n        // 1. Save schema version\n        map.insert(\"version\", SchemaVersion);\n\n        // 2. Save UUID encoding\n        map.insert(\"uuidEncoding\", _uuidEncoding);\n\n        // 3. Save TimeZone encoding\n        map.insert(\"timeZone\", _timeZone);\n\n        // 4. Save view mode\n        map.insert(\"viewMode\", _viewMode);\n        map.insert(\"autoExpand\", _autoExpand);\n        map.insert(\"lineNumbers\", _lineNumbers);\n\n        // 5. Save Autocompletion mode\n        map.insert(\"autocompletionMode\", _autocompletionMode);\n\n        // 6. Save loadInitJs\n        map.insert(\"loadMongoRcJs\", _loadMongoRcJs);\n\n        // 7. Save disableConnectionShortcuts\n        map.insert(\"disableConnectionShortcuts\", _disableConnectionShortcuts);\n        \n        // 8. Save acceptedEulaVersions array\n        QJsonArray arr;\n        for (auto const& str : _acceptedEulaVersions)\n            arr.push_back(str);\n\n        map.insert(\"acceptedEulaVersions\", arr.toVariantList());\n\n        // x. Save unique set of db versions connected\n        QJsonArray dbVersionsArr;\n        for (auto const& version : _dbVersionsConnected)\n            dbVersionsArr.push_back(version);\n\n        map.insert(\"dbVersionsConnected\", dbVersionsArr.toVariantList());\n\n        // 9. Save batchSize\n        map.insert(\"batchSize\", _batchSize);\n        map.insert(\"checkForUpdates\", _checkForUpdates);\n        map.insert(\"mongoTimeoutSec\", _mongoTimeoutSec);\n        map.insert(\"shellTimeoutSec\", _shellTimeoutSec);\n\n        // 10. Save style\n        map.insert(\"style\", _currentStyle);\n\n        // 11. Save font information\n        map.insert(\"textFontFamily\", _textFontFamily);\n        map.insert(\"textFontPointSize\", _textFontPointSize);\n\n        // 12. Save connections\n        QVariantList list;\n        for (auto const conn : _connections) \n            list.append(conn->toVariant().toMap());\n\n        map.insert(\"connections\", list);\n        map.insert(\"autoExec\", _autoExec);\n        map.insert(\"minimizeToTray\", _minimizeToTray);\n        map.insert(\"toolbars\", _toolbars);\n        map.insert(\"imported\", _imported);\n        map.insert(\"anonymousID\", _anonymousID);\n        map.insert(\"cacheData\", _cacheData);\n        map.insert(\"programExitedNormally\", _programExitedNormally);\n        map.insert(\"disableHttpsFeatures\", _disableHttpsFeatures);\n        map.insert(\"debugMode\", _debugMode);\n        \n        return map;\n    }\n\n    QString SettingsManager::getOrCreateAnonymousID(QVariantMap const& map) const\n    {\n        QString anonymousID = \"\";\n\n        // If anonymousID has never been created or is empty, create a new one. Otherwise load the existing.\n        if (map.contains(\"anonymousID\")) {\n            QUuid id = map.value(\"anonymousID\").toString();\n            if (!id.isNull())\n                anonymousID = id.toString();\n        }\n\n        // Search and import \"anonymousID\" from other Studio 3T config files\n        for (auto const& zipFileAndConfigFile : S_3T_ZipFile_And_ConfigFile_List) {\n            if (!anonymousID.isEmpty())\n                break;\n\n            QUuid const& id = extractAnonymousIDFromZip(zipFileAndConfigFile.first, zipFileAndConfigFile.second);\n            if (!id.isNull())\n                anonymousID = id.toString();\n        }\n                 \n        // Search and import \"anonymousID\" from other Robo 3T old config files starting from latest\n        for (auto const& oldConfigFile : _configFilesOfOldVersions) {         \n            if (!anonymousID.isEmpty())\n                break;\n\n            // Don't import from 1.1-Beta due to a problem where Beta might have redundantly created new UUID \n            if (oldConfigFile == CONFIG_FILE_1_1_0_BETA)\n                continue;\n\n            // Stop searching in 1_0_RC1 or older versions, \"anonymousID\" is introduced in version 1.0\n            if (oldConfigFile == CONFIG_FILE_1_0_RC1)\n                break;\n\n            anonymousID = extractAnonymousID(oldConfigFile);\n        }\n\n        // Search and import \"anonymousID\" from any other (ideally newer version) Robo 3T config files \n        if (anonymousID.isEmpty()) {\n            auto const dir1 = QString(\"%1/.3T/robo-3t\").arg(QDir::homePath());\n            QDirIterator iter1 { dir1, QStringList() << \"robo*.json\", QDir::Files, \n                                 QDirIterator::Subdirectories };\n            while (iter1.hasNext()) {\n                anonymousID = extractAnonymousID(iter1.next());\n                if (!anonymousID.isEmpty())\n                    break;\n            }\n\n            if (anonymousID.isEmpty()) {\n                auto const dir2 = QString(\"%1/.3T/robomongo\").arg(QDir::homePath());\n                QDirIterator iter2 { dir2, QStringList() << \"robo*.json\", QDir::Files, \n                                     QDirIterator::Subdirectories };\n                while (iter2.hasNext()) {\n                    anonymousID = extractAnonymousID(iter2.next());\n                    if (!anonymousID.isEmpty())\n                        break;\n                }\n            }\n        }\n\n        // Couldn't find/import any, create a new anonymousID\n        if (anonymousID.isEmpty())\n            anonymousID = QUuid::createUuid().toString();\n\n        anonymousID.remove('{');\n        anonymousID.remove('}');\n\n        return anonymousID;\n    }\n\n    /**\n     * Adds connection to the end of list and set it's uniqueID\n     */\n    void SettingsManager::addConnection(ConnectionSettings *connection)\n    {\n        _connections.push_back(connection);\n    }\n\n    /**\n     * Removes connection by index\n     */\n    void SettingsManager::removeConnection(ConnectionSettings *connection)\n    {\n        ConnectionSettingsContainerType::iterator it = std::find(_connections.begin(), _connections.end(), connection);\n        if (it != _connections.end()) {\n            _connections.erase(it);\n            delete connection;\n        }\n    }\n\n    ConnectionSettings* SettingsManager::getConnectionSettingsByUuid(QString const& uuid) const\n    {\n        for (auto const connSettings : _connections){\n            if (connSettings->uuid() == uuid)\n                return connSettings;\n        }\n\n        LOG_MSG(\"Failed to find connection settings object by UUID.\", mongo::logger::LogSeverity::Warning());\n        return nullptr;\n    }\n\n    ConnectionSettings* SettingsManager::getConnectionSettingsByUuid(std::string const& uuid) const\n    {\n        return getConnectionSettingsByUuid(QString::fromStdString(uuid));\n    }\n\n    void SettingsManager::setCurrentStyle(const QString& style)\n    {\n        _currentStyle = style;\n    }\n\n    void SettingsManager::setTextFontFamily(const QString& fontFamily)\n    {\n        _textFontFamily = fontFamily;\n    }\n\n    void SettingsManager::setTextFontPointSize(int pointSize) {\n        _textFontPointSize = pointSize > 0 ? pointSize : -1;\n    }\n\n    void SettingsManager::reorderConnections(const ConnectionSettingsContainerType &connections)\n    {\n        _connections = connections;\n    }\n\n    void SettingsManager::setToolbarSettings(const QString toolbarName, const bool visible)\n    {\n        _toolbars[toolbarName] = visible;\n    }\n\n    void SettingsManager::importFromOldVersion()\n    {\n        if (_imported)\n            return;\n\n        // Import only from the latest version\n        for (auto const& configFile : _configFilesOfOldVersions) {\n            if (QFile::exists(configFile)) {\n                importFromFile(configFile);\n                setImported(true);\n                return;\n            }\n        }\n    }\n\n    bool SettingsManager::importConnectionsFrom_0_8_5()\n    {\n        // Load old configuration file (used till version 0.8.5)\n\n        if (!QFile::exists(CONFIG_FILE_0_8_5))\n            return false;\n\n        QFile oldConfigFile(CONFIG_FILE_0_8_5);\n        if (!oldConfigFile.open(QIODevice::ReadOnly))\n            return false;\n\n        bool ok;\n        QJson::Parser parser;\n        QVariantMap vmap = parser.parse(oldConfigFile.readAll(), &ok).toMap();\n        if (!ok)\n            return false;\n\n        QVariantList vconns = vmap.value(\"connections\").toList();\n        for (QVariantList::iterator itconn = vconns.begin(); itconn != vconns.end(); ++itconn)\n        {\n            QVariantMap vconn = (*itconn).toMap();\n\n            auto conn = new ConnectionSettings(false);\n            conn->setImported(true);\n            conn->setConnectionName(QtUtils::toStdString(vconn.value(\"connectionName\").toString()));\n            conn->setServerHost(QtUtils::toStdString(vconn.value(\"serverHost\").toString().left(300)));\n            conn->setServerPort(vconn.value(\"serverPort\").toInt());\n            conn->setDefaultDatabase(QtUtils::toStdString(vconn.value(\"defaultDatabase\").toString()));\n\n            // SSH settings\n            if (vconn.contains(\"sshAuthMethod\")) {\n                SshSettings *ssh = conn->sshSettings();\n                ssh->setHost(QtUtils::toStdString(vconn.value(\"sshHost\").toString()));\n                ssh->setUserName(QtUtils::toStdString(vconn.value(\"sshUserName\").toString()));\n                ssh->setPort(vconn.value(\"sshPort\").toInt());\n                ssh->setUserPassword(QtUtils::toStdString(vconn.value(\"sshUserPassword\").toString()));\n                ssh->setPublicKeyFile(QtUtils::toStdString(vconn.value(\"sshPublicKey\").toString()));\n                ssh->setPrivateKeyFile(QtUtils::toStdString(vconn.value(\"sshPrivateKey\").toString()));\n                ssh->setPassphrase(QtUtils::toStdString(vconn.value(\"sshPassphrase\").toString()));\n\n                int const auth = vconn.value(\"sshAuthMethod\").toInt();\n                ssh->setEnabled(auth == 1 || auth == 2);\n                ssh->setAuthMethod(auth == 2 ? \"publickey\" : \"password\");\n            }\n\n            // SSL settings\n            if (vconn.contains(\"sshEnabled\")) {\n                SslSettings *ssl = conn->sslSettings();\n                ssl->enableSSL(vconn.value(\"enabled\").toBool());\n                ssl->setPemKeyFile(QtUtils::toStdString(vconn.value(\"sslPemKeyFile\").toString()));\n            }\n\n            // Credentials\n            QVariantList vcreds = vconn.value(\"credentials\").toList();\n            for (QVariantList::const_iterator itcred = vcreds.begin(); itcred != vcreds.end(); ++itcred) {\n                QVariantMap vcred = (*itcred).toMap();\n\n                auto cred = new CredentialSettings();\n                cred->setUserName(vcred.value(\"userName\").toString().toStdString());\n                cred->setUserPassword(vcred.value(\"userPassword\").toString().toStdString());\n                cred->setDatabaseName(vcred.value(\"databaseName\").toString().toStdString());\n                cred->setMechanism(\"MONGODB-CR\");\n                cred->setUseManuallyVisibleDbs(vcred.value(\"useManuallyVisibleDbs\").toBool());\n                cred->setManuallyVisibleDbs(vcred.value(\"manuallyVisibleDbs\").toString().toStdString());\n                cred->setEnabled(vcred.value(\"enabled\").toBool());\n\n                conn->addCredential(cred);\n            }\n\n            // Check that we didn't have similar connection\n            bool matched = false;\n            for (std::vector<ConnectionSettings*>::const_iterator it = _connections.begin(); it != _connections.end(); ++it) {\n                ConnectionSettings *econn = *it;    // Existing connection\n\n                if (conn->serverPort() != econn->serverPort() ||\n                    conn->serverHost() != econn->serverHost() ||\n                    conn->defaultDatabase() != econn->defaultDatabase())\n                    continue;\n\n                CredentialSettings *cred = conn->primaryCredential();\n                CredentialSettings *ecred = econn->primaryCredential();\n                if (cred->databaseName() != ecred->databaseName() ||\n                    cred->userName() != ecred->userName() ||\n                    cred->userPassword() != ecred->userPassword() ||\n                    cred->enabled() != ecred->enabled())\n                    continue;\n\n                SshSettings *ssh = conn->sshSettings();\n                SshSettings *essh = econn->sshSettings();\n                if (ssh->enabled() != essh->enabled() ||\n                    ssh->port() != essh->port() ||\n                    ssh->host() != essh->host() ||\n                    ssh->privateKeyFile() != essh->privateKeyFile() ||\n                    ssh->userPassword() != essh->userPassword() ||\n                    ssh->userName() != essh->userName())\n                    continue;\n\n                matched = true;\n                break;\n            }\n\n            // Import connection only if we didn't find similar one\n            if (!matched)\n                addConnection(conn);\n        }\n\n        return true;\n    }\n\n    bool SettingsManager::importFromFile(QString const& oldConfigFilePath)\n    {\n        if (oldConfigFilePath == CONFIG_FILE_0_8_5) {\n            importConnectionsFrom_0_8_5();\n            return true;\n        }\n\n        if (!QFile::exists(oldConfigFilePath))\n            return false;\n\n        QFile oldConfigFile(oldConfigFilePath);\n        if (!oldConfigFile.open(QIODevice::ReadOnly))\n            return false;\n\n        bool ok;\n        QJson::Parser parser;\n        QVariantMap vmap = parser.parse(oldConfigFile.readAll(), &ok).toMap();\n        if (!ok)\n            return false;\n\n        //// Import keys\n        _autoExpand      = vmap.value(\"autoExpand\").toBool();\n        _lineNumbers     = vmap.value(\"lineNumbers\").toBool();\n        _debugMode       = vmap.value(\"debugMode\").toBool();\n        _shellTimeoutSec = vmap.value(\"shellTimeoutSec\").toInt();\n        \n        //// Import connections\n        for (auto const& vcon : vmap.value(\"connections\").toList()) {\n            QVariantMap const& vconn = vcon.toMap();\n            auto connSettings = new ConnectionSettings(false);\n            connSettings->fromVariant(vconn);\n            connSettings->setImported(true);\n            addConnection(connSettings);\n        }\n\n        return true;\n    }\n\n    int SettingsManager::importedConnectionsCount() {\n        return (std::count_if(_connections.cbegin(), _connections.cend(), \n            [](auto conn) { return conn->imported(); }\n        ));\n    }\n\n    QString extractAnonymousIDFromZip(QString const& zipFile, QString const& propfile)\n    {\n        QZipReader zipReader(zipFile);\n        if (!zipReader.exists() || !zipReader.isReadable()) \n            return QString(\"\");       \n\n        QXmlStreamReader reader(zipReader.fileData(propfile));\n        while (!reader.atEnd()) {\n            reader.readNext();\n            if (reader.text().toString() == \"AnonymousID\") {\n                reader.readNext();\n                reader.readNext();\n                reader.readNext();\n                reader.readNext();\n                return reader.text().toString();\n            }\n        }\n\n        return QString(\"\");\n    }\n\n    QString extractAnonymousID(QString const& configFilePath)\n    {\n        if (!QFile::exists(configFilePath))\n            return QString(\"\");\n\n        QFile oldConfigFile(configFilePath);\n        if (!oldConfigFile.open(QIODevice::ReadOnly))\n            return QString(\"\");\n\n        bool ok = false;\n        QJson::Parser parser;\n        QVariantMap const& map = parser.parse(oldConfigFile.readAll(), &ok).toMap();\n        if (!ok)\n            return QString(\"\");\n\n        QString anonymousID;\n        if (map.contains(\"anonymousID\")) {\n            QUuid const& id = map.value(\"anonymousID\").toString();\n            if (!id.isNull())\n                anonymousID = id.toString();\n        }\n\n        anonymousID.remove('{');\n        anonymousID.remove('}');\n\n        return anonymousID;\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/settings/SettingsManager.h",
    "content": "#pragma once\n\n#include <QString>\n#include <QVariantMap>\n#include <QSet>\n#include <QDir>\n\n#include <vector>\n#include <cstdlib>\n\n#include \"robomongo/core/Enums.h\"\n\nnamespace Robomongo\n{\n    class ConnectionSettings;\n    struct ConfigFileAndImportFunction;\n        \n    // Current cache directory\n    auto const CacheDir = QString(\"%1/.3T/robo-3t/%2/cache/\").arg(QDir::homePath())\n                                                             .arg(PROJECT_VERSION);\n    // Current config file\n    auto const ConfigFilePath = QString(\"%1/.3T/robo-3t/%2/robo3t.json\").arg(QDir::homePath())\n                                                                        .arg(PROJECT_VERSION);  \n    // Current config file directory\n    auto const ConfigDir = QString(\"%1/.3T/robo-3t/%2/\").arg(QDir::homePath())\n                                                        .arg(PROJECT_VERSION);  \n\n/* ----------------------------- SettingsManager ------------------------------ */\n\n    /**\n     * @brief SettingsManager gives you access to all settings, that is used\n     *        by Robomongo. It can load() and save() them. Config file usually\n     *        located here: ~/.config/robomongo/robomongo.json\n     *\n     *        You can access this manager via:\n     *        AppRegistry::instance().settingsManager()\n     *\n     * @threadsafe no\n     */\n    class SettingsManager\n    {\n    public:\n        typedef std::vector<ConnectionSettings *> ConnectionSettingsContainerType;\n        typedef QMap<QString, QVariant> ToolbarSettingsContainerType;\n\n        /**\n         * @brief Creates SettingsManager for config file in default location\n         *        (usually ~/.config/robomongo/robomongo.json)\n         */\n        SettingsManager();\n\n        /**\n         * @brief Cleanup owned objects\n         */\n        ~SettingsManager();\n\n        /**\n         * @brief Load settings from config file.\n         * @return true if success, false otherwise\n         */\n        bool load();\n\n        /**\n         * @brief Saves all settings to config file.\n         * @return true if success, false otherwise\n         */\n        bool save();\n\n        /**\n         * @brief Adds connection to the end of list.\n         * Connection now will be owned by SettingsManager.\n         */\n        static void addConnection(ConnectionSettings *connection);\n\n        /**\n         * @brief Removes connection by index\n         */\n        void removeConnection(ConnectionSettings *connection);\n\n\n        /**\n        * @brief  Finds and returns original (non-clone) connection settings which is \n        *         loaded/saved from/into Robomongo config. file.\n        * @return If uniqueID is valid returns original connection settings, \n        *         nullptr otherwise.\n        */\n        ConnectionSettings* getConnectionSettingsByUuid(QString const& uuid) const;\n        ConnectionSettings* getConnectionSettingsByUuid(std::string const& uuid) const;\n\n        void reorderConnections(const ConnectionSettingsContainerType &connections);\n\n        void setToolbarSettings(QString toolbarName, bool visible);\n\n        /**\n         * @brief Returns list of connections\n         */\n        ConnectionSettingsContainerType connections() const { return _connections; }\n        \n        ToolbarSettingsContainerType toolbars() const { return _toolbars; }\n\n        void setUuidEncoding(UUIDEncoding encoding) { _uuidEncoding = encoding; }\n        UUIDEncoding uuidEncoding() const { return _uuidEncoding; }\n\n        void setTimeZone(SupportedTimes timeZ) { _timeZone = timeZ; }\n        SupportedTimes timeZone() const { return _timeZone; }\n\n        void setViewMode(ViewMode viewMode) { _viewMode = viewMode; }\n        ViewMode viewMode() const { return _viewMode; }\n\n        void setAutocompletionMode(AutocompletionMode mode) { _autocompletionMode = mode; }\n        AutocompletionMode autocompletionMode() const { return _autocompletionMode; }\n\n        void setAutoExpand(bool isExpand) { _autoExpand = isExpand; }\n        bool autoExpand() const { return _autoExpand; }\n\n        void setAutoExec(bool isAutoExec) { _autoExec = isAutoExec; }\n        bool autoExec() const { return _autoExec; }\n\n        void setMinimizeToTray(bool isMinimizingToTray) { _minimizeToTray = isMinimizingToTray; }\n        bool minimizeToTray() const { return _minimizeToTray; }\n\n        void setLineNumbers(bool showLineNumbers) { _lineNumbers = showLineNumbers; }\n        bool lineNumbers() const { return _lineNumbers; }\n\n        void setLoadMongoRcJs(bool isLoadJs) { _loadMongoRcJs = isLoadJs; }\n        bool loadMongoRcJs() const { return _loadMongoRcJs; }\n\n        void setDisableConnectionShortcuts(bool isDisable) { _disableConnectionShortcuts = isDisable; }\n        bool disableConnectionShortcuts() const { return _disableConnectionShortcuts; }\n\n        void addAcceptedEulaVersion(QString const& version) { _acceptedEulaVersions.insert(version); }\n        QSet<QString> const& acceptedEulaVersions() const { return _acceptedEulaVersions; }\n\n        QSet<QString>::iterator addDbVersionConnected(QString const& version) { \n            return _dbVersionsConnected.insert(version); \n        }\n        QSet<QString> const& dbVersionsConnected() const { return _dbVersionsConnected; }\n\n        void setCheckForUpdates(bool checkForUpdates) { _checkForUpdates = checkForUpdates; }\n        bool checkForUpdates() const { return _checkForUpdates; }\n\n        void setBatchSize(int batchSize) { _batchSize = batchSize; }\n        int batchSize() const { return _batchSize; }\n\n        QString currentStyle() const { return _currentStyle; }\n        void setCurrentStyle(const QString& style);\n\n        QString textFontFamily() const { return _textFontFamily; }\n        void setTextFontFamily(const QString& fontFamily);\n\n        int textFontPointSize() const { return _textFontPointSize; }\n        void setTextFontPointSize(int pointSize);\n\n        int mongoTimeoutSec() const { return _mongoTimeoutSec; }\n        int shellTimeoutSec() const { return _shellTimeoutSec; }\n\n        void setShellTimeoutSec(int newValue) { _shellTimeoutSec = std::abs(newValue); }\n\n        // True when settings from previous versions of Robomongo are imported\n        void setImported(bool imported) { _imported = imported; }\n        bool imported() const { return _imported; }\n\n        QString anonymousID() const { return _anonymousID; }\n\n        void addCacheData(QString const& key, QVariant const& value);\n        QVariant cacheData(QString const& key) const;\n\n        void setProgramExitedNormally(bool value) { _programExitedNormally = value; }\n        bool programExitedNormally() const { return _programExitedNormally; }\n\n        // Designed to be set only by human users\n        bool disableHttpsFeatures() const { return _disableHttpsFeatures; }\n        bool debugMode() const { return _debugMode; }\n\n        /**\n         * Returns number of imported connections\n         */\n        int importedConnectionsCount();\n\n    private:\n\n        /**\n         * Load settings from the map. Existing settings will be overwritten.\n         */\n        void loadFromMap(QVariantMap &map);\n\n        /**\n         * Save all settings to map.\n         */\n        QVariantMap convertToMap() const;\n\n        // Find existing anonymousID from Robomongo and 3T config files, if not found create\n        // a new anonymousID.\n        QString getOrCreateAnonymousID(QVariantMap const& map) const;\n\n        /**\n         * Load connection settings from previous versions of Robomongo\n         */\n        void importFromOldVersion();\n\n        // Imports connections from oldConfigFilePath into current config file\n        bool importFromFile(QString const& oldConfigFilePath);\n        \n        static bool importConnectionsFrom_0_8_5();\n\n        /**\n         * @brief Version of settings schema currently loaded\n         */\n        QString _version;\n\n        UUIDEncoding _uuidEncoding;\n        SupportedTimes _timeZone;\n        ViewMode _viewMode;\n        AutocompletionMode _autocompletionMode;\n        bool _loadMongoRcJs;\n        bool _autoExpand;\n        bool _autoExec;\n        bool _minimizeToTray;\n        bool _lineNumbers;\n        bool _disableConnectionShortcuts;\n        bool _programExitedNormally = true;\n        bool _disableHttpsFeatures = false;\n        bool _debugMode = false;\n        QSet<QString> _acceptedEulaVersions;\n        QSet<QString> _dbVersionsConnected;\n        int _batchSize;\n        bool _checkForUpdates = true;\n        QString _currentStyle;\n        QString _textFontFamily;\n        int _textFontPointSize;\n\n        int _mongoTimeoutSec;\n        int _shellTimeoutSec;\n\n        // True when settings from previous versions of Robomongo are imported\n        bool _imported;\n        \n        /**\n        * @brief This is an anonymous string taken from QUuid that is generated when Robomongo \n        *        is first installed on a user's machine and then launched for the first time  \n        *        It stays the same throughout all upgrades.\n        */\n        QString _anonymousID;\n\n        // Various cache data\n        QMap<QString, QVariant> _cacheData;\n\n        /**\n         * @brief List of connections\n         */\n        static std::vector<ConnectionSettings*> _connections;\n\n        ToolbarSettingsContainerType _toolbars;\n\n        // List of config. file absolute paths of old versions\n        // Must be updated with care and with every new version. Details on cpp file.       \n        static std::vector<QString> const _configFilesOfOldVersions;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/settings/SshSettings.cpp",
    "content": "#include \"robomongo/core/settings/SshSettings.h\"\n\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/utils/RoboCrypt.h\"\n\nnamespace Robomongo\n{\n    SshSettings::SshSettings() :\n        _port(22),\n        _authMethod(\"publickey\"),\n        _enabled(false),\n        _askPassword(false),\n        _logLevel(1) {\n\n    }\n\n    SshSettings *SshSettings::clone() const {\n        SshSettings *cloned = new SshSettings(*this);\n        return cloned;\n    }\n\n    QVariant SshSettings::toVariant() const {\n        QVariantMap map;\n        map.insert(\"host\", QtUtils::toQString(host()));\n        map.insert(\"port\", port());\n        map.insert(\"userName\", QtUtils::toQString(userName()));\n        map.insert(\"userPasswordEncrypted\", userPassword().empty() ? \"\" : \n                                            QtUtils::toQString(RoboCrypt::encrypt(userPassword())));\n        map.insert(\"privateKeyFile\", QtUtils::toQString(privateKeyFile()));\n        map.insert(\"publicKeyFile\", QtUtils::toQString(publicKeyFile()));\n        map.insert(\"passphraseEncrypted\", passphrase().empty() ? \"\" : \n                                          QtUtils::toQString(RoboCrypt::encrypt(passphrase())));\n        map.insert(\"method\", QtUtils::toQString(authMethod()));\n        map.insert(\"enabled\", enabled());\n        map.insert(\"askPassword\", askPassword());\n        return map;\n    }\n\n    void SshSettings::fromVariant(const QVariantMap &map) {\n        setHost(QtUtils::toStdString(map.value(\"host\").toString()));\n        setPort(map.value(\"port\").toInt());\n        setUserName(QtUtils::toStdString(map.value(\"userName\").toString()));\n\n        // From version Robo 1.3 \"userPasswordEncrypted\" is used instead of \"userPassword\" in config. file\n        if (map.contains(\"userPassword\")) // Robo 1.2 and below\n            setUserPassword((map.value(\"userPassword\").toString().toStdString()));\n        else if (map.contains(\"userPasswordEncrypted\")) // From Robo 1.3\n            setUserPassword(RoboCrypt::decrypt((map.value(\"userPasswordEncrypted\").toString().toStdString())));\n\n        setPrivateKeyFile(QtUtils::toStdString(map.value(\"privateKeyFile\").toString()));\n        setPublicKeyFile(QtUtils::toStdString(map.value(\"publicKeyFile\").toString()));\n\n        // From version Robo 1.3 \"passphraseEncrypted\" is used instead of \"passphrase\" in config. file\n        if (map.contains(\"passphrase\")) // Robo 1.2 and below\n            setPassphrase((map.value(\"passphrase\").toString().toStdString()));\n        else if (map.contains(\"passphraseEncrypted\")) // From Robo 1.3\n            setPassphrase(RoboCrypt::decrypt((map.value(\"passphraseEncrypted\").toString().toStdString())));\n\n        setAuthMethod(QtUtils::toStdString(map.value(\"method\").toString()));\n        setEnabled(map.value(\"enabled\").toBool());\n        setAskPassword(map.value(\"askPassword\").toBool());\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/settings/SshSettings.h",
    "content": "#pragma once\n\n#include <QString>\n#include <QVariant>\n#include <QVariantMap>\n\nnamespace Robomongo\n{\n    class SshSettings\n    {\n    public:\n        SshSettings();\n\n        /**\n         * Clones credential settings.\n         */\n        SshSettings *clone() const;\n\n        /**\n         * Converts to QVariantMap\n         */\n        QVariant toVariant() const;\n        void fromVariant(const QVariantMap &map);\n\n        /*\n         * Domain or IPv4 or IPv6 address\n         */\n        std::string host() const { return _host; }\n        void setHost(const std::string &host) { _host = host; }\n\n        int port() const { return _port; }\n        void setPort(const int port) { _port = port; }\n\n        std::string userName() const { return _userName; }\n        void setUserName(const std::string &userName) { _userName = userName; }\n\n        std::string userPassword() const { return _userPassword; }\n        void setUserPassword(const std::string &userPassword) { _userPassword = userPassword; }\n\n        std::string privateKeyFile() const { return _privateKeyFile; }\n        void setPrivateKeyFile(const std::string &path) { _privateKeyFile = path; }\n\n        std::string publicKeyFile() const { return _publicKeyFile; }\n        void setPublicKeyFile(const std::string &path) { _publicKeyFile = path; }\n\n        std::string passphrase() const { return _passphrase; }\n        void setPassphrase(const std::string &passphrase) { _passphrase = passphrase; }\n\n        // \"password\" or \"publickey\"\n        std::string authMethod() const { return _authMethod.empty() ? \"publickey\" : _authMethod; }\n        void setAuthMethod(const std::string &method) { _authMethod = method; }\n\n        /**\n         * @brief Flag, indecating whether we should use this\n         * credentials to perform authentication, or not.\n         */\n        bool enabled() const { return _enabled; }\n        void setEnabled(bool enabled) { _enabled = enabled; }\n\n        bool askPassword() const { return _askPassword; }\n        void setAskPassword(bool ask) { _askPassword = ask; }\n\n        std::string askedPassword() const { return _askedPassword; }\n        void setAskedPassword(const std::string &asked) { _askedPassword = asked; }\n\n        int logLevel() const { return _logLevel; }\n        void setLogLevel(const int logLevel) { _logLevel = logLevel; }\n\n    private:\n        std::string _host;  // domain or IPv4/v6\n        int _port;\n        std::string _userName;\n        std::string _userPassword;      // clear text password (decrypted)\n        std::string _privateKeyFile;\n        std::string _publicKeyFile;\n        std::string _passphrase;        // clear text passphrase (decrypted)\n        std::string _authMethod; // \"password\" or \"publickey\"\n\n        // Should we ask user about password or passphrase\n        // each time when we try to connect\n        bool _askPassword;\n\n        /**\n         * Flag, indicating whether we should use\n         * this SSH tunnel or not.\n         */\n        bool _enabled;\n        int _logLevel;              // this property is not persisted\n        std::string _askedPassword; // this property is not persisted\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/settings/SslSettings.cpp",
    "content": "#include \"robomongo/core/settings/SslSettings.h\"\n\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/utils/RoboCrypt.h\"\n\nnamespace Robomongo\n{\n    SslSettings::SslSettings() :\n        _sslEnabled(false), _caFile(\"\"), _pemKeyFile(\"\"),  _pemPassPhrase(\"\"), _crlFile(\"\"), \n        _allowInvalidHostnames(false),  _allowInvalidCertificates(false), _usePemFile(false),\n        _useAdvancedOptions(false), _askPassphrase(false)\n    {}\n\n    SslSettings *SslSettings::clone() const \n    {\n        SslSettings *cloned = new SslSettings(*this);\n        return cloned;\n    }\n\n    QVariant SslSettings::toVariant() const \n    {\n        QVariantMap map;\n        map.insert(\"sslEnabled\", sslEnabled());\n        map.insert(\"caFile\", QtUtils::toQString(caFile()));\n        map.insert(\"usePemFile\", usePemFile());\n        map.insert(\"pemKeyFile\", QtUtils::toQString(pemKeyFile()));\n        map.insert(\"pemPassPhraseEncrypted\", pemPassPhrase().empty() ? \"\" :\n                                             QtUtils::toQString(RoboCrypt::encrypt(pemPassPhrase())));\n        map.insert(\"useAdvancedOptions\", useAdvancedOptions());\n        map.insert(\"crlFile\", QtUtils::toQString(crlFile()));\n        map.insert(\"allowInvalidHostnames\", allowInvalidHostnames());\n        map.insert(\"allowInvalidCertificates\", allowInvalidCertificates());\n        map.insert(\"askPassphrase\", askPassphrase());\n\n        return map;\n    }\n\n    void SslSettings::fromVariant(const QVariantMap &map) \n    {\n        enableSSL(map.value(\"sslEnabled\").toBool());\n        setCaFile(QtUtils::toStdString(map.value(\"caFile\").toString()));\n        setUsePemFile(map.value(\"usePemFile\").toBool());\n        setPemKeyFile(QtUtils::toStdString(map.value(\"pemKeyFile\").toString()));\n        \n        // From version Robo 1.3 \"pemPassPhraseEncrypted\" is used instead of \"pemPassPhrase\" in config. file\n        if (map.contains(\"pemPassPhrase\")) // Robo 1.2 and below\n            setPemPassPhrase((map.value(\"pemPassPhrase\").toString().toStdString()));\n        else if (map.contains(\"pemPassPhraseEncrypted\")) // From Robo 1.3\n            setPemPassPhrase(RoboCrypt::decrypt((map.value(\"pemPassPhraseEncrypted\").toString().toStdString())));\n\n        setUseAdvancedOptions(map.value(\"useAdvancedOptions\").toBool());\n        setCrlFile(QtUtils::toStdString(map.value(\"crlFile\").toString()));\n        setAllowInvalidHostnames(map.value(\"allowInvalidHostnames\").toBool());\n        setAllowInvalidCertificates(map.value(\"allowInvalidCertificates\").toBool());\n        setAskPassphrase(map.value(\"askPassphrase\").toBool());\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/settings/SslSettings.h",
    "content": "#pragma once\n\n#include <QString>\n#include <QVariant>\n#include <QVariantMap>\n\nnamespace Robomongo\n{\n    class SslSettings\n    {\n    public:\n        SslSettings();\n\n        /**\n         * Clones credential settings.\n         */\n        SslSettings *clone() const;\n\n        /**\n         * Converts to QVariantMap\n         */\n        QVariant toVariant() const;\n        void fromVariant(const QVariantMap &map);\n\n\n        // Getters for mongo:: SSLGlobalParams related settings\n        std::string pemKeyFile() const { return _pemKeyFile; }\n        std::string caFile() const { return _caFile; }\n        std::string pemPassPhrase() const { return _pemPassPhrase; }\n        std::string crlFile() const { return _crlFile; }\n        bool allowInvalidHostnames() const { return _allowInvalidHostnames; }\n        bool allowInvalidCertificates() const { return _allowInvalidCertificates; }\n \n        // Getters for helper SSL settings \n        bool usePemFile() const { return _usePemFile; }\n        bool useAdvancedOptions() const { return _useAdvancedOptions; }\n        bool askPassphrase() const { return _askPassphrase; }\n\n        // Setters for mongo:: SSLGlobalParams related settings\n        void setPemKeyFile(const std::string &path) { _pemKeyFile = path; }\n        void setCaFile(const std::string &path) { _caFile = path; }\n        void setPemPassPhrase(const std::string &pemPassPhrase) { _pemPassPhrase = pemPassPhrase; }\n        void setCrlFile(const std::string &path) { _crlFile = path; }\n        void setAllowInvalidHostnames(const bool state) { _allowInvalidHostnames = state; }\n        void setAllowInvalidCertificates(const bool state) { _allowInvalidCertificates = state; }\n\n        // Setters for helper SSL settings \n        void setUsePemFile(const bool state) { _usePemFile = state; }\n        void setUseAdvancedOptions(const bool state) { _useAdvancedOptions = state; }\n        void setAskPassphrase(const bool state) { _askPassphrase = state; }\n\n        /**\n         * Flag, indicating whether we should use\n         * this SSL settings or not.\n         */\n        bool sslEnabled() const { return _sslEnabled; }\n        void enableSSL(bool enabled) { _sslEnabled = enabled; }\n\n    private:\n\n        // mongo:: SSL Global params related settings\n        std::string _caFile;\n        std::string _pemKeyFile;\n        std::string _pemPassPhrase;\n        std::string _crlFile;\n        bool _allowInvalidHostnames;\n        bool _allowInvalidCertificates;\n\n        // Helper settings indirectly effecting what to pass to SSL global params\n        bool _usePemFile;\n        bool _useAdvancedOptions;\n        bool _askPassphrase;\n\n        /**\n         * Flag, indicating whether SSL enabled for related connection\n         */\n        bool _sslEnabled;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/core/utils/BsonUtils.cpp",
    "content": "#include \"robomongo/core/utils/BsonUtils.h\"\n\n#include <mongo/client/dbclient_base.h>\n//#include <mongo/bson/bsonobjiterator.h>\n#include \"mongo/util/base64.h\"\n#include \"mongo/util/str.h\"\n\n#include \"robomongo/core/utils/Logger.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/HexUtils.h\"\n\n// v0.9\n#include \"robomongo/shell/db/ptimeutil.h\"\n\nusing namespace mongo;\nnamespace Robomongo\n{\n    namespace BsonUtils\n    {\n        namespace detail\n        {\n            template<>\n            mongo::BSONObj getField<mongo::BSONObj>(const mongo::BSONElement &elem) \n            {\n                return elem.embeddedObject();\n            }\n\n            template<>\n            bool getField<bool>(const mongo::BSONElement &elem)\n            {\n                return elem.Bool();\n            }\n\n            template<>\n            std::string getField<std::string>(const mongo::BSONElement &elem)\n            {\n                return elem.String();\n            }\n\n            template<>\n            std::vector<BSONElement> getField<std::vector<BSONElement> >(const mongo::BSONElement &elem)\n            {\n                return elem.Array();\n            }\n\n            template<>\n            int getField<int>(const mongo::BSONElement &elem)\n            {\n                return elem.Int();\n            }\n\n            template<>\n            double getField<double>(const mongo::BSONElement &elem)\n            {\n                return elem.numberDouble();\n            }\n\n            template<>\n            long long getField<long long>(const mongo::BSONElement &elem)\n            {\n                return elem.safeNumberLong();\n            }\n        }\n\n        std::string jsonString(const BSONObj &obj, JsonStringFormat format, int pretty, UUIDEncoding uuidEncoding, SupportedTimes timeFormat, bool isArray)\n        {\n            using namespace std;\n\n            // Use of method, that is implemented in Robomongo Shell\n            // Method \"isArray()\" is not part of MongoDB.\n            // In order for this method to work, someone should\n            // explicetly call \"markAsArray()\" method on BSONObj.\n            // This is done in the Robomongo Shell (MongoDB fork)\n            if (obj.isArray()) {\n               isArray = true;\n            }\n\n            if ( obj.isEmpty() ) {\n                return isArray? \"[]\" : \"{}\";\n            }\n\n            StringBuilder s;\n            s << (isArray ? \"[\" : \"{\");\n            BSONObjIterator i(obj);\n            BSONElement e = i.next();\n\n            if ( !e.eoo() ) {\n                while ( 1 ) {\n                    if ( pretty ) {\n                        s << '\\n';\n                        for( int x = 0; x < pretty; x++ ) {\n                            s << \"    \";\n                        }\n                    }\n                    else {\n                        s << \" \";\n                    }\n\n                    s << jsonString(e, format, true, pretty ? pretty + 1 : 0, uuidEncoding, timeFormat, isArray);\n                    e = i.next();\n\n                    if (e.eoo()) {\n                        s << '\\n';\n                        for( int x = 0; x < pretty - 1; x++ ) {\n                            s << \"    \";\n                        }\n                        s << (isArray ? \"]\" : \"}\");\n                        break;\n                    }\n\n                    s << \",\";\n                }\n            }\n            return s.str();\n        }\n\n        std::string jsonString(const BSONElement &elem, JsonStringFormat format, bool includeFieldNames, \n                               int pretty, UUIDEncoding uuidEncoding, SupportedTimes timeFormat, bool isArray)\n        {\n            using namespace std;\n            BSONType t = elem.type();            \n\n            std::stringstream s;\n            if ( includeFieldNames && !isArray)\n                s << '\"' << mongo::str::escape(elem.fieldName()) << \"\\\" : \";\n\n            switch ( t ) {\n            case Undefined:\n                s << \"undefined\";\n                break;\n            case mongo::String:\n            case Symbol:\n                s << '\"' << mongo::str::escape(std::string(elem.valuestr(), elem.valuestrsize() - 1))\n                  << '\"';\n                break;\n            case NumberLong:\n                s << \"NumberLong(\" << elem._numberLong() << \")\";\n                break;\n            case NumberInt:\n                s << elem._numberInt();\n                break;\n            case NumberDouble:\n                {\n                    if ( elem.number() >= -std::numeric_limits< double >::max() &&\n                         elem.number() <= std::numeric_limits< double >::max() ) {\n                        std::stringstream ss;\n                        ss.precision(std::numeric_limits<double>::digits10);\n                        ss << elem.Double();\n                        std::string const str =\n                            reformatDoubleString(QString::fromStdString(ss.str()), elem.Double());\n\n                        s << (str);\n                    }\n                    else if (std::isnan(elem.number()) ) {                        \n                        s << \"NaN\";\n                    }\n                    else if (std::isinf(elem.number()) ) {\n                        s << (std::to_string(elem.number()) == \"inf\" ? \"Infinity\" : \"-Infinity\");\n                    }\n                    else {\n                        StringBuilder ss;\n                        ss << \"BsonUtils::jsonString(): Number \" << elem.number() \n                           << \" cannot be represented in JSON\";\n                        LOG_MSG(ss.str(), mongo::logger::LogSeverity::Error());\n                    }\n                    break;\n                }\n            case NumberDecimal:\n                s << \"NumberDecimal(\\\"\" << elem._numberDecimal().toString() << \"\\\")\";\n                break;\n            case mongo::Bool:\n                s << ( elem.boolean() ? \"true\" : \"false\" );\n                break;\n            case jstNULL:\n                s << \"null\";\n                break;\n            case Object: {\n                BSONObj obj = elem.embeddedObject();\n                s << jsonString(obj, format, pretty, uuidEncoding, timeFormat);\n                }\n                break;\n            case mongo::Array: {\n                if ( elem.embeddedObject().isEmpty() ) {\n                    s << \"[]\";\n                    break;\n                }\n                s << \"[ \";\n                BSONObjIterator i( elem.embeddedObject() );\n                BSONElement e = i.next();\n                if ( !e.eoo() ) {\n                    int count = 0;\n                    while ( 1 ) {\n                        if ( pretty ) {\n                            s << '\\n';\n                            for( int x = 0; x < pretty; x++ )\n                                s << \"    \";\n                        }\n\n                        if (strtol(e.fieldName(), 0, 10) > count) {\n                            s << \"undefined\";\n                        }\n                        else {\n                            s << jsonString(e, format, false, pretty ? pretty + 1 : 0, uuidEncoding, timeFormat, true);\n                            e = i.next();\n                        }\n                        count++;\n                        if ( e.eoo() ) {\n                            s << '\\n';\n                            for( int x = 0; x < pretty - 1; x++ )\n                                s << \"    \";\n                            s << \"]\";\n                            break;\n                        }\n                        s << \", \";\n                    }\n                }\n                //s << \" ]\";\n                break;\n            }\n            case DBRef: {\n                mongo::OID *x = (mongo::OID *) (elem.valuestr() + elem.valuestrsize());\n                if ( format == TenGen )\n                    s << \"DBRef(\";\n                else\n                    s << \"{ \\\"$ref\\\" : \";\n                s << '\"' << elem.valuestr() << \"\\\", \";\n                if ( format != TenGen )\n                    s << \"\\\"$id\\\" : \";\n                s << '\"' << *x << \"\\\"\";\n                if ( format == TenGen )\n                    s << ')';\n                else\n                    s << '}';\n                break;\n            }\n            case jstOID:\n                if ( format == TenGen ) {\n                    s << \"ObjectId(\";\n                }\n                else {\n                    s << \"{ \\\"$oid\\\" : \";\n                }\n                s << '\"' << elem.__oid() << '\"';\n                if ( format == TenGen ) {\n                    s << \")\";\n                }\n                else {\n                    s << \" }\";\n                }\n                break;\n            case BinData: {\n                int len = *(int *)( elem.value() );\n                BinDataType type = BinDataType( *(char *)( (int *)( elem.value() ) + 1 ) );\n\n                if (type == mongo::bdtUUID || type == mongo::newUUID) {\n                    s << HexUtils::formatUuid(elem, uuidEncoding);\n                    break;\n                }\n\n                s << \"{ \\\"$binary\\\" : \\\"\";\n                char *start = ( char * )( elem.value() ) + sizeof( int ) + 1;\n                base64::encode( s , start , len );\n                s << \"\\\", \\\"$type\\\" : \\\"\" << hex;\n                s.width( 2 );\n                s.fill( '0' );\n                s << type << dec;\n                s << \"\\\" }\";\n                break;\n            }\n            case mongo::Date:\n                {\n                    Date_t d = elem.date();\n                    long long ms = d.toMillisSinceEpoch(); //static_cast<long long>(d.millis);\n                    bool isSupportedDate = miutil::minDate < ms && ms < miutil::maxDate;\n\n                    if ( format == Strict )\n                        s << \"{ \\\"$date\\\" : \";\n                    else{\n                        if (isSupportedDate) {\n                            s << \"ISODate(\";\n                        }\n                        else{\n                            s << \"Date(\";\n                        }\n                    }\n\n                    if ( pretty && isSupportedDate) {\n                        boost::posix_time::ptime epoch(boost::gregorian::date(1970, 1, 1));\n                        boost::posix_time::time_duration diff = boost::posix_time::millisec(ms);\n                        boost::posix_time::ptime time = epoch + diff;\n                        std::string timestr = miutil::isotimeString(time, true, timeFormat == LocalTime);\n                        s << '\"' << timestr << '\"';\n                    }\n                    else\n                        s << ms;\n\n                    if ( format == Strict )\n                        s << \" }\";\n                    else\n                        s << \")\";\n                    break;\n                }\n            case RegEx:\n                if ( format == Strict ) {\n                    s << \"{ \\\"$regex\\\" : \\\"\" << mongo::str::escape(elem.regex());\n                    s << \"\\\", \\\"$options\\\" : \\\"\" << elem.regexFlags() << \"\\\" }\";\n                }\n                else {\n                    s << \"/\" << mongo::str::escape(elem.regex(), true) << \"/\";\n                    // FIXME Worry about alpha order?\n                    for ( const char *f = elem.regexFlags(); *f; ++f ) {\n                        switch ( *f ) {\n                        case 'g':\n                        case 'i':\n                        case 'm':\n                            s << *f;\n                        default:\n                            break;\n                        }\n                    }\n                }\n                break;\n\n            case CodeWScope: {\n                BSONObj scope = elem.codeWScopeObject();\n                if ( ! scope.isEmpty() ) {\n                    s << \"{ \\\"$code\\\" : \" << elem._asCode() << \" , \"\n                      << \" \\\"$scope\\\" : \" << scope.jsonString() << \" }\";\n                    break;\n                }\n            }\n\n            case Code:\n                s << elem._asCode();\n                break;\n\n            case bsonTimestamp:\n                if ( format == TenGen )\n                    s << \"Timestamp(\" << elem.timestamp().getSecs() << \", \" << elem.timestampInc() << \")\";\n                else \n                    s << \"{ \\\"$timestamp\\\" : { \\\"t\\\" : \" << elem.timestamp().getSecs() << \", \\\"i\\\" : \" \n                      << elem.timestampInc() << \" } }\";\n                break;\n\n            case MinKey:\n                s << \"{ \\\"$minKey\\\" : 1 }\";\n                break;\n\n            case MaxKey:\n                s << \"{ \\\"$maxKey\\\" : 1 }\";\n                break;\n\n            default:\n                StringBuilder ss;\n                ss << \"Cannot create a properly formatted JSON string with \"\n                   << \"element: \" << elem.toString() << \" of type: \" << elem.type();\n            }\n            return s.str();\n        }\n    \n        bool isArray(const mongo::BSONElement &elem)\n        {\n            return isArray(elem.type());\n        }\n\n        bool isArray(mongo::BSONType type)\n        {\n            return type == mongo::Array ; \n        }\n\n        bool isDocument(const mongo::BSONElement &elem)\n        {\n            return isDocument(elem.type());\n        }\n\n        bool isDocument(mongo::BSONType type)\n        {\n            switch( type ) {\n            case mongo::Object:\n            case mongo::Array:\n                return true;\n            default:\n                return false;\n            }\n        }\n\n        bool isSimpleType(const mongo::BSONType type)\n        {\n            switch( type ) {\n            case NumberLong:\n            case NumberDouble:\n            case NumberDecimal:\n            case NumberInt:\n            case mongo::String:\n            case mongo::Bool:\n            case mongo::Date:\n            case jstOID:\n                return true;\n            default:\n                return false;\n            }\n        }\n\n        bool isUuidType(const mongo::BSONType type, mongo::BinDataType binDataType)\n        {\n            if (type != mongo::BinData)\n                return false;\n\n            return (binDataType == mongo::newUUID || binDataType == mongo::bdtUUID);\n        }\n\n        bool isSimpleType(const mongo::BSONElement &elem) \n        {\n            return isSimpleType(elem.type()); \n        }\n\n        bool isUuidType(const mongo::BSONElement &elem) \n        {\n            if (elem.type() != mongo::BinData)\n                return false;\n\n            mongo::BinDataType binType = elem.binDataType();\n            return (binType == mongo::newUUID || binType == mongo::bdtUUID);\n        }\n\n        const char* BSONTypeToString(mongo::BSONType type, mongo::BinDataType binDataType, UUIDEncoding uuidEncoding)\n        {\n            switch (type)\n            {\n                /** double precision floating point value */\n            case NumberDouble:\n                {\n                    return \"Double\";\n                }\n                /** double precision floating point value */\n            case NumberDecimal:\n                {\n                    return \"Decimal128\";\n                }\n                /** character string, stored in utf8 */\n            case String:\n                {\n                    return \"String\";\n                }\n\n                /** an embedded object */\n            case Object:\n                {\n                    return \"Object\";\n                }\n                /** an embedded array */\n            case Array:\n                {\n                    return \"Array\";\n                }\n            case BinData:\n                {\n                    if (binDataType == mongo::newUUID) {\n                        return \"UUID\";\n                    } else if (binDataType == mongo::bdtUUID) {\n                        const char* type;\n                        switch(uuidEncoding) {\n                        case DefaultEncoding: type = \"Legacy UUID\"; break;\n                        case JavaLegacy:      type = \"Java UUID (Legacy)\"; break;\n                        case CSharpLegacy:    type = \".NET UUID (Legacy)\"; break;\n                        case PythonLegacy:    type = \"Python UUID (Legacy)\"; break;\n                        default:              type = \"Legacy UUID\"; break;\n                        }\n\n                        return type;\n                    } else {\n                        return \"Binary\";\n                    }\n                }\n\n                /** Undefined type */\n            case Undefined:\n                {\n                    return \"Undefined\";\n                }\n\n                /** ObjectId */\n            case jstOID:\n                {\n                    return \"ObjectId\";\n                }\n\n                /** boolean type */\n            case Bool:\n                {\n                    return \"Boolean\";\n                }\n\n                /** date type */\n            case Date:\n                {\n                    return \"Date\";\n                }\n\n                /** null type */\n            case jstNULL:\n                {\n                    return \"Null\";\n                }\n                break;\n\n                /** regular expression, a pattern with options */\n            case RegEx:\n                {\n                    return \"Regular Expression\";\n                }\n\n                /** deprecated / will be redesigned */\n            case DBRef:\n                {\n                    return \"DBRef\";\n                }\n\n                /** deprecated / use CodeWScope */\n            case Code:\n                {\n                    return \"Code\";\n                }\n                break;\n\n                /** a programming language (e.g., Python) symbol */\n            case Symbol:\n                {\n                    return \"Symbol\";\n                }\n\n                /** javascript code that can execute on the database server, with SavedContext */\n            case CodeWScope:\n                {\n                    return \"CodeWScope\";\n                }\n\n                /** 32 bit signed integer */\n            case NumberInt:\n                {\n                    return \"Int32\";\n                }\n\n                /** Updated to a Date with value next OpTime on insert */\n            case bsonTimestamp:\n                {\n                    return \"Timestamp\";\n                }\n\n                /** 64 bit integer */\n            case NumberLong:\n                {\n                    return \"Int64\";\n                }\n                break;\n\n            default:\n                {\n                    return \"Type is not supported\";\n                }\n            }\n        }\n\n        void buildJsonString(const mongo::BSONObj &obj, std::string &con, UUIDEncoding uuid, SupportedTimes tz)\n        {\n            mongo::BSONObjIterator iterator(obj);\n            con.append(\"{ \\n\");\n            while (iterator.more())\n            {\n                mongo::BSONElement e = iterator.next();\n                con.append(\"\\\"\");\n                con.append(e.fieldName());\n                con.append(\"\\\"\");\n                con.append(\" : \");\n                buildJsonString(e, con, uuid, tz);\n                con.append(\", \\n\");\n            }\n            con.append(\"\\n}\\n\\n\");\n        }\n\n        void buildJsonString(const mongo::BSONElement &elem, std::string &con, UUIDEncoding uuid, SupportedTimes tz)\n        {\n            switch (elem.type())\n            {\n            case NumberDouble:\n                {\n                    if (elem.number() >= -std::numeric_limits< double >::max() &&\n                        elem.number() <= std::numeric_limits< double >::max()) {\n                        std::stringstream ss;\n                        ss.precision(std::numeric_limits<double>::digits10);\n                        ss << elem.Double();          \n                        std::string const str = \n                            reformatDoubleString(QString::fromStdString(ss.str()), elem.Double());\n\n                        con.append(str);\n                    }\n                    else if (std::isnan(elem.number())) {\n                        con.append(\"NaN\");\n                    }\n                    else if (std::isinf(elem.number())) {\n                        con.append(std::to_string(elem.number()) == \"inf\" ? \"Infinity\" : \"-Infinity\");\n                    }\n                    else {\n                        StringBuilder ss;\n                        ss << \"BsonUtils::buildJsonString(): Number \" << elem.number() \n                           << \" cannot be represented in JSON\";\n                        LOG_MSG(ss.str(), mongo::logger::LogSeverity::Error());\n                    }\n                }\n                break;\n            case String:\n                {\n                    con.append(elem.valuestr(), elem.valuestrsize() - 1);\n                }\n                break;\n            case Object:\n                {\n                    buildJsonString(elem.Obj(), con, uuid, tz);\n                }\n                break;\n            case Array:\n                {\n                    buildJsonString(elem.Obj(), con, uuid, tz);\n                }\n                break;\n            case BinData:\n                {\n                    mongo::BinDataType binType = elem.binDataType();\n                    if (binType == mongo::newUUID || binType == mongo::bdtUUID) {\n                        std::string uu = HexUtils::formatUuid(elem, uuid);\n                        con.append(uu);\n                        break;\n                    }\n                    con.append(\"<binary>\");\n                }\n                break;\n            case Undefined:\n                con.append(\"undefined\");\n                break;\n            case jstOID:\n                {\n                    std::string idValue = elem.OID().toString();\n                    char buff[256] = {0};\n                    sprintf(buff, \"ObjectId(\\\"%s\\\")\", idValue.c_str());\n                    con.append(buff);\n                }\n                break;\n            case Bool:\n                con.append(elem.Bool() ? \"true\" : \"false\");\n                break;\n            case Date:\n                {\n                    long long ms = (long long) elem.Date().toMillisSinceEpoch();\n                    bool isSupportedDate = miutil::minDate < ms && ms < miutil::maxDate;\n\n                    boost::posix_time::ptime epoch(boost::gregorian::date(1970, 1, 1));\n                    boost::posix_time::time_duration diff = boost::posix_time::millisec(ms);\n                    boost::posix_time::ptime time = epoch + diff;\n\n                    std::string date;\n                    if (isSupportedDate)\n                        date = miutil::isotimeString(time, false, tz == LocalTime);\n                    else\n                        date = boost::lexical_cast<std::string>(ms);\n\n                    con.append(date);\n                    break;\n                }\n            case jstNULL:\n                con.append(\"null\");\n                break;\n\n            case RegEx:\n                {\n                    con.append(\"/\" + std::string(elem.regex()) + \"/\");\n\n                    for ( const char *f = elem.regexFlags(); *f; ++f ) {\n                        switch ( *f ) {\n                        case 'g':\n                        case 'i':\n                        case 'm':\n                            con += *f;\n                        default:\n                            break;\n                        }\n                    }\n                }\n                break;\n            case DBRef:\n                break;\n            case Code:\n                con.append(elem._asCode());\n                break;\n            case Symbol:\n                con.append(elem.valuestr(), elem.valuestrsize() - 1);\n                break;\n            case CodeWScope:\n                {\n                    mongo::BSONObj scope = elem.codeWScopeObject();\n                    if (!scope.isEmpty() ) {\n                        con.append(elem._asCode());\n                        break;\n                    }\n                }\n                break;\n            case NumberInt:\n                {\n                    char num[16] = {0};\n                    sprintf(num, \"%d\", elem.Int());\n                    con.append(num);\n                    break;\n                }           \n            case bsonTimestamp:\n                {\n                    Date_t date = elem.timestampTime();\n                    unsigned long long millis = date.toMillisSinceEpoch(); // millis;\n                    if ((long long)millis >= 0 &&\n                        ((long long)millis/1000) < (std::numeric_limits<time_t>::max)()) {\n                            con.append(date.toString());\n                    }\n                    break;\n                }\n            case NumberLong:\n                {\n                    char num[32] = {0};\n                    sprintf(num, \"%lld\", elem.Long());\n                    con.append(num);\n                    break; \n                }\n\t\t\tcase NumberDecimal:\n\t\t\t{\n\t\t\t\tcon.append(elem.numberDecimal().toString());\n\t\t\t\tbreak;\n\t\t\t}\n            default:\n                con.append(\"<unsupported>\");\n                break;\n            }\n        }\n\n        mongo::BSONElement indexOf(const mongo::BSONObj &doc, int index)\n        {\n            mongo::BSONObjIterator iterator(doc);\n            for (int i = 0; iterator.more(); ++i)\n            {\n                mongo::BSONElement element = iterator.next(); \n                if (i == index) {\n                    return element;\n                }\n            }\n            return mongo::BSONElement();\n        }\n\n        int elementsCount(const mongo::BSONObj &doc)\n        {\n            mongo::BSONObjIterator iterator(doc);\n            int i = 0;\n            for (; iterator.more(); ++i)\n            {\n                iterator.next();                \n            }\n            return i;\n        }\n\n        std::string reformatDoubleString(QString str, double elemDouble)\n        {\n            // Leave trailing zero if needed\n            if (!str.contains(\"e+\", Qt::CaseInsensitive) && \n                !str.contains(\"e-\", Qt::CaseInsensitive) && elemDouble == (long long)elemDouble)\n                str.append(\".0\");          \n            else if (str.endsWith(\"e+15\", Qt::CaseInsensitive) || \n                     str.endsWith(\"e+16\", Qt::CaseInsensitive)) {\n                // Disable scientific format\n                std::stringstream ss2;\n                ss2.precision(std::numeric_limits<double>::digits10);\n                ss2 << std::fixed << elemDouble;\n                str = QString::fromStdString(ss2.str());\n                while (str.contains('.') && str.endsWith(\"00\"))\n                    str.chop(1);\n            }\n\n            return str.toStdString();\n        }\n\n    } // BsonUtils\n} // Robomongo\n"
  },
  {
    "path": "src/robomongo/core/utils/BsonUtils.h",
    "content": "#pragma once\n\n#include <mongo/bson/bsonelement.h>\n#include <mongo/bson/bsonobj.h>\n\n#include \"robomongo/core/Enums.h\"\n\nclass QString;\n\nnamespace Robomongo\n{\n    namespace BsonUtils\n    {\n        namespace detail\n        {\n            template<mongo::BSONType BSONType_t>\n            struct bson_convert_traits\n            {\n                typedef mongo::BSONObj type;\n                enum { mongo_type = BSONType_t };\n            };\n\n            template<>\n            struct bson_convert_traits<mongo::Bool>\n            {\n                typedef bool type;\n                enum { mongo_type = mongo::Bool };\n            };\n\n            template<>\n            struct bson_convert_traits<mongo::String>\n            {\n                typedef std::string type;\n                enum { mongo_type = mongo::String };\n            };\n\n            template<>\n            struct bson_convert_traits<mongo::Array>\n            {\n                typedef std::vector<mongo::BSONElement> type;\n                enum { mongo_type = mongo::Array };\n            };\n\n            template<>\n            struct bson_convert_traits<mongo::NumberInt>\n            {\n                typedef int type;\n                enum { mongo_type = mongo::NumberInt };\n            };\n\n            template<>\n            struct bson_convert_traits<mongo::NumberDouble>\n            {\n                typedef double type;\n                enum { mongo_type = mongo::NumberDouble };\n            };\n\n            template<>\n            struct bson_convert_traits<mongo::NumberLong>\n            {\n                typedef long long type;\n                enum { mongo_type = mongo::NumberLong };\n            };\n\n            template<typename type_t>\n            type_t getField(const mongo::BSONElement &elem);                  \n        }\n\n        template<typename type_t>\n        type_t bsonelement_cast(const mongo::BSONElement &elem)\n        {\n            type_t result = type_t();\n            bool isEoo = !elem.eoo();\n            if (isEoo) {\n                result = detail::getField<type_t>(elem);\n            }\n            return result;\n        }\n\n        template<mongo::BSONType BSONType_t>\n        typename detail::bson_convert_traits<BSONType_t>::type getField(const mongo::BSONObj &obj, const char *data)\n        {\n            mongo::BSONElement elem = obj.getField(data);\n            return bsonelement_cast<typename detail::bson_convert_traits<BSONType_t>::type>(elem);\n        }\n\n        std::string jsonString(const mongo::BSONObj &obj, mongo::JsonStringFormat format, int pretty,\n            UUIDEncoding uuidEncoding, SupportedTimes timeFormat, bool isArray = false);\n\n        std::string jsonString(const mongo::BSONElement &elem, mongo::JsonStringFormat format, bool includeFieldNames, int pretty,\n            UUIDEncoding uuidEncoding, SupportedTimes timeFormat, bool isArray = false);\n\n        bool isArray(const mongo::BSONElement &elem);\n        bool isArray(mongo::BSONType type);\n        bool isDocument(const mongo::BSONElement &elem);\n        bool isDocument(mongo::BSONType type);\n\n        bool isSimpleType(const mongo::BSONType type);\n        bool isUuidType(const mongo::BSONType type, mongo::BinDataType binDataType);\n        bool isSimpleType(const mongo::BSONElement &elem);\n        bool isUuidType(const mongo::BSONElement &elem);\n\n        const char* BSONTypeToString(mongo::BSONType type, mongo::BinDataType binDataType, UUIDEncoding uuidEncoding);\n\n        void buildJsonString(const mongo::BSONObj &obj, std::string &con, UUIDEncoding uuid, SupportedTimes tz);\n        void buildJsonString(const mongo::BSONElement &elem, std::string &con, UUIDEncoding uuid, SupportedTimes tz);\n\n        mongo::BSONElement indexOf(const mongo::BSONObj &doc, int index);\n        int elementsCount(const mongo::BSONObj &doc);\n\n        std::string reformatDoubleString(QString str, double elemDouble);\n    }\n}\n\n"
  },
  {
    "path": "src/robomongo/core/utils/Logger.cpp",
    "content": "#include \"robomongo/core/utils/Logger.h\"\n\n#include <QDir>\n#include <QMetaType>\n\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/EventBus.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace Robomongo\n{\n    Logger::Logger()\n    {\n        QFile file {\n            QString(\"%1/\" PROJECT_NAME_LOWERCASE \".log\").arg(QDir::tempPath()) \n        }; \n        //delete file if it size more than 5mb\n        if (file.exists() && file.size() > 5 * 1024 * 1024)\n            file.remove();      \n    }\n\n    Logger::~Logger()\n    {   \n    }\n\n    void Logger::print(const char *mess, mongo::logger::LogSeverity level, bool notify)\n    {\n        print(std::string(mess), level, notify);\n    }\n\n    void Logger::print(const std::string &mess, mongo::logger::LogSeverity level, bool notify)\n    {       \n        print(QtUtils::toQString(mess), level, notify);\n    }\n\n    void Logger::print(const QString &msg, mongo::logger::LogSeverity level, bool notify)\n    {\n        if (!notify)\n            return;\n\n        // Make uniform log level strings e.g \"Error: \", \"Info: \" etc...\n        auto logLevelStr = QString::fromStdString(level.toStringData().toString());\n        if (!logLevelStr.isEmpty()) {\n            logLevelStr = logLevelStr.toLower();\n            logLevelStr[0] = logLevelStr[0].toUpper();\n            logLevelStr += \": \";\n        }\n        emit printed(logLevelStr + msg.simplified(), level);\n    }\n\n    void sendLog(\n        QObject *sender, LogEvent::LogLevel const& severity,\n        std::string const& msg, bool const informUser /*= false*/)\n    {\n        AppRegistry::instance().bus()->send(\n            AppRegistry::instance().app(),\n            new LogEvent(sender, msg, severity, informUser)\n        );\n    }\n\n    void debugLog(std::string_view msg) {\n        if (!AppRegistry::instance().settingsManager()->debugMode())\n            return;\n\n        std::cout << msg << std::endl;\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/utils/Logger.h",
    "content": "#pragma once\n\n#include <QObject>\n#include <QString>\n#include <string>\n\n#include <mongo/logger/log_severity.h>\n\n#include \"robomongo/core/events/MongoEvents.h\"\n#include \"robomongo/core/utils/SingletonPattern.hpp\"\n\nnamespace Robomongo\n{  \n    class Logger : public QObject, public Patterns::LazySingleton<Logger>\n    {\n        Q_OBJECT\n        friend class Patterns::LazySingleton<Logger>;\n\n    public:\n        void print(const char *msg, mongo::logger::LogSeverity level, bool notify);\n        void print(const std::string &msg, mongo::logger::LogSeverity level, bool notify);\n        void print(const QString &msg, mongo::logger::LogSeverity level, bool notify);\n\n    Q_SIGNALS:\n        void printed(const QString &msg, mongo::logger::LogSeverity level);\n\n    private:\n        Logger();\n        ~Logger();\n    };\n\n    // Use in main thread\n    template<typename T>\n    inline void LOG_MSG(const T &msg, mongo::logger::LogSeverity level, bool notify = true)\n    {\n        return Logger::instance().print(msg, level, notify);\n    }\n    \n    // Use in worker threads (e.g. MongoWorker) to log anything \n    // Sends LogEvent to main thread (App class) \n    void sendLog(\n        QObject *sender, LogEvent::LogLevel const& severity,\n        std::string const& msg, bool const informUser = false\n    );\n\n    void debugLog(std::string_view msg);\n}"
  },
  {
    "path": "src/robomongo/core/utils/QtUtils.cpp",
    "content": "#include \"robomongo/core/utils/QtUtils.h\"\n\n#include <QThread>\n#include <QTreeWidgetItem>\n\nnamespace Robomongo\n{\n    namespace QtUtils\n    {\n        template<>\n        QString toQString<std::string>(const std::string &value)\n        {\n            //static QTextCodec *LOCALECODEC = QTextCodec::codecForLocale();\n            return QString::fromUtf8(value.c_str(), value.size());\n        }\n\n        template<>\n        QString toQString<std::wstring>(const std::wstring &value)\n        {\n            return  QString((const QChar*)value.c_str(), value.length());\n        }\n\n        std::string toStdString(const QString &value)\n        {\n            QByteArray sUtf8 = value.toUtf8();\n            return std::string(sUtf8.constData(), sUtf8.length());\n        }\n\n        std::string toStdStringSafe(const QString &value)\n        {\n#ifdef Q_OS_WIN\n            QByteArray sUtf8 = value.toLocal8Bit();            \n#else\n            QByteArray sUtf8 = value.toUtf8();\n#endif    \n            return std::string(sUtf8.constData(), sUtf8.length());\n        }\n\n        void cleanUpThread(QThread *const thread)\n        {\n            if (thread && thread->isRunning()) {\n                //thread->stop();\n                thread->wait();\n            }\n        }\n\n        void clearChildItems(QTreeWidgetItem *const root)\n        {\n            int itemCount = root->childCount();\n            for (int i = 0; i < itemCount; ++i) {\n                QTreeWidgetItem *item = root->child(0);\n                root->removeChild(item);\n                delete item;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/utils/QtUtils.h",
    "content": "#pragma once\n#include <QString>\n#include <QModelIndex>\n\nQT_BEGIN_NAMESPACE\nclass QThread;\nclass QTreeWidgetItem;\nclass QAbstractItemModel;\nQT_END_NAMESPACE\n\n#ifdef QT_NO_DEBUG\n#define VERIFY(x) (x)\n#else //QT_NO_DEBUG\n#define VERIFY(x) Q_ASSERT(x)\n#endif //QT_NO_DEBUG\n\nnamespace Robomongo\n{\n    namespace QtUtils\n    {\n        template<typename T>\n        QString toQString(const T &value);\n\n        std::string toStdString(const QString &value);\n\n        std::string toStdStringSafe(const QString &value);\n\n        void cleanUpThread(QThread *const thread);\n\n        void clearChildItems(QTreeWidgetItem *root);\n\n        template<typename Type>\n        inline Type item(const QModelIndex &index)\n        {\n            return static_cast<Type>(index.internalPointer());\n        }\n\n        struct HackQModelIndex\n        {\n            int r, c;\n            void* i;\n            const QAbstractItemModel *m;\n        };\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/utils/SingletonPattern.hpp",
    "content": "#pragma once\nnamespace Patterns\n{\n    template <class T>\n    class Singleton\n    {\n      static T* _self;\n    public:\n      void freeInstance();\n      static T* instance();\n    protected:\n      virtual ~Singleton()\n      {\n          _self=NULL;\n      }\n      Singleton()\n      {\n      }\n    };\n    template <class T>\n    T*  Singleton<T>::_self = NULL;\n    template <class T>\n    T*  Singleton<T>::instance()\n    {\n      if(!_self)\n        _self=new T;\n      return _self;\n    }\n    template <class T>\n    void  Singleton<T>::freeInstance()\n    {\n        delete this;\n    }\n\n    template <class T>\n    class LazySingleton\n    {\n    public:\n      typedef LazySingleton<T> class_type;\n      static T &instance();\n    protected:\n      LazySingleton()\n      {\n      }\n      ~LazySingleton(){}\n    private:\n      LazySingleton(class_type const&);\n      LazySingleton& operator=(class_type const& rhs);\n    };\n    template <class T>\n    T &LazySingleton<T>::instance()\n    {\n      static T _self;\n      return _self;\n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/utils/StdUtils.cpp",
    "content": "#include \"robomongo/core/utils/StdUtils.h\"\n\nnamespace Robomongo\n{\n    namespace stdutils\n    {\n       \n    }\n}\n"
  },
  {
    "path": "src/robomongo/core/utils/StdUtils.h",
    "content": "#pragma once\n\n#include <algorithm>\n#include <functional>\n\nnamespace Robomongo\n{\n    namespace stdutils\n    {\n        template<typename T>\n        inline void destroy(T *&v)\n        {\n            delete v;\n            v = NULL;\n        }\n\n        template<typename T>\n        struct RemoveIfFound\n        {\n            RemoveIfFound(T whatSearch) : _whatSearch(whatSearch) {}\n\n            bool operator()(T item) const {\n                if (item == _whatSearch) {\n                    destroy(item);\n                    return true;\n                }\n                return false;\n            }\n\n            T _whatSearch;\n        };\n\n        template <typename T>\n        struct default_delete\n        {\n            inline void operator ()(T *ptr) const\n            {\n                  destroy(ptr);\n            }\n        };\n\n        template <typename T>\n        struct default_delete<T*>\n        {\n            inline void operator ()(T *ptr) const\n            {\n                  destroy(ptr);\n            }\n        };\n\n        template<typename T, unsigned int N>\n        struct default_delete<T[N]>\n        {\n            inline void operator ()(const T ptr) const\n            {\n                delete [] ptr;\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/AppStyle.cpp",
    "content": "#include \"robomongo/gui/AppStyle.h\"\n\n#include <QApplication>\n#include <QStyleFactory>\n\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n\nnamespace Robomongo\n{\n    const QString AppStyle::StyleName = \"Native\";\n\n    namespace AppStyleUtils\n    {\n        void applyStyle(const QString &styleName)\n        {\n            if (styleName == \"Native\") {\n                QApplication::setStyle(new AppStyle);\n                return;\n            }\n\n            QApplication::setStyle(QStyleFactory::create(styleName));\n        }\n\n        QStringList getSupportedStyles()\n        {\n            static QStringList result = QStringList() << AppStyle::StyleName << QStyleFactory::keys();\n            return result;\n        }\n\n        void initStyle()\n        {\n            AppRegistry::instance().settingsManager()->save();\n            QString style = AppRegistry::instance().settingsManager()->currentStyle();\n            applyStyle(style);\n        }\n    }\n\n    void AppStyle::drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const\n    {\n        return QProxyStyle::drawControl(element, option, painter, widget);\n    }\n\n    void AppStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const\n    {\n#ifdef Q_OS_WIN\n        if (element == QStyle::PE_FrameFocusRect)\n            return;\n#endif\n\n        return QProxyStyle::drawPrimitive(element, option, painter, widget);\n    }\n\n    QRect AppStyle::subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget /*= 0 */) const\n    {\n        return QProxyStyle::subElementRect(element, option, widget);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/AppStyle.h",
    "content": "#pragma once\n\n#include <QStyle>\n#include <QProxyStyle>\n\nnamespace Robomongo\n{\n    namespace AppStyleUtils\n    {\n        void initStyle();\n        void applyStyle(const QString &styleName);\n        QStringList getSupportedStyles();\n    }\n\n    class AppStyle : public QProxyStyle\n    {\n        Q_OBJECT\n\n    public:\n        static const QString StyleName;\n        virtual void drawControl(ControlElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget) const;\n        virtual void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const;\n        virtual QRect subElementRect( SubElement element, const QStyleOption * option, const QWidget * widget = 0 ) const;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/GuiRegistry.cpp",
    "content": "#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n\n#include <QApplication>\n#include <QStyle>\n#include <QIcon>\n\nnamespace Robomongo\n{\n\n    /**\n     * @brief This is a private constructor, because GuiRegistry is a singleton\n     */\n    GuiRegistry::GuiRegistry()\n    {\n    }\n\n    /**\n     * @brief Functions that provide access to various icons\n     */\n    void GuiRegistry::setAlternatingColor(QAbstractItemView *view)\n    {\n    #if defined(Q_OS_MAC)\n        view->setAlternatingRowColors(true);\n\n        QPalette p = view->palette();\n//        p.setColor(QPalette::AlternateBase, QColor(243, 246, 250));\n        p.setColor(QPalette::AlternateBase, QColor(245, 245, 245));\n        p.setColor(QPalette::Active, QPalette::Highlight, QColor(16, 108, 214));\n        view->setPalette(p);\n    #endif\n    }\n\n    const QIcon &GuiRegistry::serverIcon() const\n    {\n        static const QIcon serverIc = QIcon(\":/robomongo/icons/server_16x16.png\");\n        return serverIc;\n    }\n\n    const QIcon &GuiRegistry::serverImportedIcon() const\n    {\n        static const QIcon importedIcon = QIcon(\":/robomongo/icons/server_imported_16x16.png\");\n        return importedIcon;\n    }\n\n    const QIcon &GuiRegistry::serverPrimaryIcon() const\n    {\n        static const QIcon icon(\":/robomongo/icons/server_primary_16x16.png\");\n        return icon;\n    }\n\n    const QIcon &GuiRegistry::serverSecondaryIcon() const\n    {\n        static const QIcon icon(\":/robomongo/icons/server_secondary_16x16.png\");\n        return icon;\n    }\n\n    const QIcon &GuiRegistry::replicaSetIcon() const\n    {\n        static const QIcon replicaSetIc(\":/robomongo/icons/replica_set_16x16.png\");\n        return replicaSetIc;\n    }\n\n    const QIcon &GuiRegistry::replicaSetOfflineIcon() const\n    {\n        static const QIcon icon(\":/robomongo/icons/replica_set_offline_16x16.png\");\n        return icon;\n    }\n\n    const QIcon &GuiRegistry::openIcon() const\n    {\n        static const QIcon openIc = qApp->style()->standardIcon(QStyle::SP_DialogOpenButton);\n        //static const QIcon openIc = QIcon(\":/robomongo/icons/open_32x32.png\");\n        return openIc;\n    }\n\n    const QIcon &GuiRegistry::saveIcon() const\n    {\n        static const QIcon saveIc = qApp->style()->standardIcon(QStyle::SP_DialogSaveButton);\n        // static const QIcon saveIc = QIcon(\":/robomongo/icons/save_32x32.png\");\n        return saveIc;\n    }\n\n    const QIcon &GuiRegistry::databaseIcon() const\n    {\n        static const QIcon databaseIc = QIcon(\":/robomongo/icons/database_16x16.png\");\n        return databaseIc;\n    }\n\n    const QIcon &GuiRegistry::collectionIcon() const\n    {\n        static const QIcon collectionIc = QIcon(\":/robomongo/icons/collection_16x16.png\");\n        return collectionIc;\n    }\n\n    const QIcon &GuiRegistry::indexIcon() const\n    {\n        static const QIcon collectionIc = QIcon(\":/robomongo/icons/index_16x16.png\");\n        return collectionIc;\n    }\n\n    const QIcon &GuiRegistry::userIcon() const\n    {\n        static const QIcon userIc = QIcon(\":/robomongo/icons/user_16x16.png\");\n        return userIc;\n    }\n\n    const QIcon &GuiRegistry::functionIcon() const\n    {\n        static const QIcon functionIc = QIcon(\":/robomongo/icons/function_16x16.png\");\n        return functionIc;\n    }\n\n    const QIcon &GuiRegistry::maximizeIcon() const\n    {\n        static const QIcon maximizeIc(\":/robomongo/icons/maximize.png\");\n        return maximizeIc;\n    }\n\n    const QIcon &GuiRegistry::minimizeIcon() const\n    {\n        static const QIcon minimizeIc(\":/robomongo/icons/minimize.png\");\n        return minimizeIc;\n    }\n\n    const QIcon &GuiRegistry::undockIcon() const\n    {\n        static const QIcon undockIc(\":/robomongo/icons/undock.png\");\n        return undockIc;\n    }\n\n    const QIcon &GuiRegistry::dockIcon() const\n    {\n        static const QIcon dockIc(\":/robomongo/icons/dock.png\");\n        return dockIc;\n    }\n\n    const QIcon &GuiRegistry::textIcon() const\n    {\n        static const QIcon textIc = QIcon(\":/robomongo/icons/text_16x16.png\");\n        return textIc;\n    }\n\n    const QIcon &GuiRegistry::textHighlightedIcon() const\n    {\n        static const QIcon textHighlightedIc = QIcon(\":/robomongo/icons/text_highlighted_16x16.png\");\n        return textHighlightedIc;\n    }\n\n    const QIcon &GuiRegistry::treeIcon() const\n    {\n        static const QIcon treeIc = QIcon(\":/robomongo/icons/tree_16x16.png\");\n        return treeIc;\n    }\n\n    const QIcon &GuiRegistry::treeHighlightedIcon() const\n    {\n        static const QIcon treeHighlightedIc = QIcon(\":/robomongo/icons/tree_highlighted_16x16.png\");\n        return treeHighlightedIc;\n    }\n\n    const QIcon &GuiRegistry::tableIcon() const\n    {\n        static const QIcon treeIc = QIcon(\":/robomongo/icons/table_16x16.png\");\n        return treeIc;\n    }\n\n    const QIcon &GuiRegistry::tableHighlightedIcon() const\n    {\n        static const QIcon treeHighlightedIc = QIcon(\":/robomongo/icons/table_highlighted_16x16.png\");\n        return treeHighlightedIc;\n    }\n\n    const QIcon &GuiRegistry::customIcon() const\n    {\n        static const QIcon customIc = QIcon(\":/robomongo/icons/custom_16x16.png\");\n        return customIc;\n    }\n\n    const QIcon &GuiRegistry::customHighlightedIcon() const\n    {\n        static const QIcon customHighlightedIc = QIcon(\":/robomongo/icons/custom_highlighted_16x16.png\");\n        return customHighlightedIc;\n    }\n\n    const QIcon &GuiRegistry::rotateIcon() const\n    {\n        static const QIcon rotateIc = QIcon(\":/robomongo/icons/rotate_16x16.png\");\n        return rotateIc;\n    }\n\n    const QIcon &GuiRegistry::visualIcon() const\n    {\n        static const QIcon visualIc = QIcon(\":/robomongo/icons/visual_16x16.png\");\n        return visualIc;\n    }\n\n    const QIcon &GuiRegistry::circleIcon() const\n    {\n        static const QIcon circleIc = QIcon(\":/robomongo/icons/bson_unsupported_16x16.png\");\n        return circleIc;\n    }\n\n    const QIcon &GuiRegistry::bsonArrayIcon() const\n    {\n        static const QIcon bsonArrayIc = QIcon(\":/robomongo/icons/bson_array_16x16.png\");\n        return bsonArrayIc;\n    }\n\n\n    const QIcon &GuiRegistry::bsonObjectIcon() const\n    {\n        static const QIcon bsonObjectIc = QIcon(\":/robomongo/icons/bson_object_16x16.png\");\n        return bsonObjectIc;\n    }\n\n    const QIcon &GuiRegistry::bsonStringIcon() const\n    {\n        static const QIcon bsonStringIc = QIcon(\":/robomongo/icons/bson_string_16x16.png\");\n        return bsonStringIc;\n    }\n\n    const QIcon &GuiRegistry::folderIcon() const\n    {\n        static const QIcon folderIc = qApp->style()->standardIcon(QStyle::SP_DirClosedIcon);\n        return folderIc;\n    }\n\n    const QIcon &GuiRegistry::bsonIntegerIcon() const\n    {\n        static const QIcon bsonIntegerIc = QIcon(\":/robomongo/icons/bson_integer_16x16.png\");\n        return bsonIntegerIc;\n    }\n\n    const QIcon &GuiRegistry::bsonDoubleIcon() const\n    {\n        static const QIcon bsonDoubleIc = QIcon(\":/robomongo/icons/bson_double_16x16.png\");\n        return bsonDoubleIc;\n    }\n\n\tconst QIcon &GuiRegistry::bsonNumberDecimalIcon() const\n\t{\n\t\tstatic const QIcon icon(\":/robomongo/icons/bson_decimal128_16x16.png\");\n\t\treturn icon;\n\t}\n\n    const QIcon &GuiRegistry::bsonDateTimeIcon() const\n    {\n        static const QIcon bsonDateTimeIc = QIcon(\":/robomongo/icons/bson_datetime_16x16.png\");\n        return bsonDateTimeIc;\n    }\n\n    const QIcon &GuiRegistry::bsonBinaryIcon() const\n    {\n        static const QIcon bsonBinaryIc = QIcon(\":/robomongo/icons/bson_binary_16x16.png\");\n        return bsonBinaryIc;\n    }\n\n    const QIcon &GuiRegistry::bsonNullIcon() const\n    {\n        static const QIcon bsonNullIc = QIcon(\":/robomongo/icons/bson_null_16x16.png\");\n        return bsonNullIc;\n    }\n\n    const QIcon &GuiRegistry::bsonBooleanIcon() const\n    {\n        static const QIcon bsonBooleanIc = QIcon(\":/robomongo/icons/bson_bool_16x16.png\");\n        return bsonBooleanIc;\n    }\n\n    const QIcon &GuiRegistry::noMarkIcon() const\n    {\n        static const QIcon noMarkIc = QIcon(\":/robomongo/icons/no_mark_24x24.png\");\n        return noMarkIc;\n    }\n\n    const QIcon &GuiRegistry::yesMarkIcon() const\n    {\n        static const QIcon yesMarkIc = QIcon(\":/robomongo/icons/yes_mark_24x24.png\");\n        return yesMarkIc;\n    }\n\n    const QIcon &GuiRegistry::skipMarkIcon() const\n    {\n        static const QIcon skipMarkIc = QIcon(\":/robomongo/icons/skip_mark_24x24.png\");\n        return skipMarkIc;\n    }\n\n    const QIcon &GuiRegistry::questionMarkIcon() const\n    {\n        static const QIcon questionMarkIc = QIcon(\":/robomongo/icons/question_mark_24x24.png\");\n        return questionMarkIc;\n    }\n\n    const QIcon &GuiRegistry::timeIcon() const\n    {\n        static const QIcon timeIc = QIcon(\":/robomongo/icons/time_16x16.png\");\n        return timeIc;\n    }\n\n    const QIcon &GuiRegistry::keyIcon() const\n    {\n        static const QIcon keyIc = QIcon(\":/robomongo/icons/key_16x16.png\");\n        return keyIc;\n    }\n\n    const QIcon &GuiRegistry::showIcon() const\n    {\n        static const QIcon icon = QIcon(\":/robomongo/icons/show_64x64.png\");\n        return icon;\n    }\n\n    const QIcon &GuiRegistry::hideIcon() const\n    {\n        static const QIcon icon = QIcon(\":/robomongo/icons/hide_64x64.png\");\n        return icon;\n    }\n\n    const QIcon &GuiRegistry::plusIcon() const\n    {\n        static const QIcon icon {\":/robomongo/icons/plus_sign.png\"};\n        return icon;\n    }\n\n    const QIcon &GuiRegistry::minusIcon() const\n    {\n        static const QIcon icon {\":/robomongo/icons/minus_sign.png\"};\n        return icon;\n    }\n\n    const QBrush &GuiRegistry::typeBrush() const\n    {\n        static const QBrush typeBrush = QBrush(QColor(150, 150, 150));\n        return typeBrush;\n    }\n\n    const QIcon &GuiRegistry::leftIcon() const\n    {\n        static const QIcon leftIc = QIcon(\":/robomongo/icons/left_16x16.png\");\n        return leftIc;\n    }\n\n    const QIcon &GuiRegistry::rightIcon() const\n    {\n        static const QIcon rightIc = QIcon(\":/robomongo/icons/right_16x16.png\");\n\n        return rightIc;\n    }\n\n    const QIcon &GuiRegistry::mongodbIcon() const\n    {\n        static const QIcon mongodbIc = QIcon(\":/robomongo/icons/mongodb_16x16.png\");\n        return mongodbIc;\n    }\n    \n    const QIcon &GuiRegistry::mongodbIconForMAC() const\n    {\n        static const QIcon mongodbIc = QIcon(\":/robomongo/icons/mongodb_icon_for_MAC.png\");\n        return mongodbIc;\n    }\n\n    const QIcon &GuiRegistry::connectIcon() const\n    {\n        static const QIcon connectIc = QIcon(\":/robomongo/icons/connect_24x24.png\");\n        return connectIc;\n    }\n\n    const QIcon &GuiRegistry::executeIcon() const\n    {\n        static const QIcon executeIc = QIcon(\":/robomongo/icons/execute_24x24.png\");\n        return executeIc;\n    }\n\n    const QIcon &GuiRegistry::stopIcon() const\n    {\n        static const QIcon stopIc = QIcon(\":/robomongo/icons/stop_24x24.png\");\n        return stopIc;\n    }\n\n    const QIcon &GuiRegistry::exportIcon() const\n    {\n        static const QIcon exportIc = QIcon(\":/robomongo/icons/export_64x64.png\");\n        return exportIc;\n    }\n\n    const QIcon &GuiRegistry::importIcon() const\n    {\n        static const QIcon importIc = QIcon(\":/robomongo/icons/import_64x64.png\");\n        return importIc;\n    }\n\n    const QIcon &GuiRegistry::deleteIcon() const\n    {\n        static const QIcon icon(\":/robomongo/icons/delete.png\");\n        return icon;\n    }\n\n    const QIcon &GuiRegistry::deleteIconRed() const\n    {\n        static const QIcon icon(\":/robomongo/icons/delete_red_color.png\");\n        return icon;\n    }\n\n    const QIcon &GuiRegistry::deleteIconMouseHovered() const\n    {\n        static const QIcon icon(\":/robomongo/icons/delete_mouse_hovered.png\");\n        return icon;\n    }\n\n    const QIcon &GuiRegistry::mainWindowIcon() const\n    {\n        static const QIcon mainWindowIc = QIcon(\":/robomongo/icons/logo-256x256.png\");\n        return mainWindowIc;\n    }\n\n    const QIcon& GuiRegistry::welcomeTabIcon() const\n    {\n        static const QIcon icon(\":/robomongo/icons/welcome_tab_icon.png\");\n        return icon;\n    }\n\n    const QFont &GuiRegistry::font() const\n    {\n        QString family = AppRegistry::instance().settingsManager()->textFontFamily();\n        if (family.isEmpty()) {\n#if defined(Q_OS_MAC)\n            family = \"Monaco\";\n#elif defined(Q_OS_UNIX)\n            family = \"Monospace\";\n#elif defined(Q_OS_WIN)\n            family = \"Courier\";\n#endif\n        }\n\n        int pointSize = AppRegistry::instance().settingsManager()->textFontPointSize();\n        if (pointSize < 1) {\n#if defined(Q_OS_MAC)\n            pointSize = 12;\n#elif defined(Q_OS_UNIX)\n            pointSize = -1;\n#elif defined(Q_OS_WIN)\n            pointSize = 10;\n#endif\n        }\n\n\n        static QFont textFont = QFont(family, pointSize);\n#if defined(Q_OS_UNIX)\n        textFont.setFixedPitch(true);\n#endif\n\n        return textFont;\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/GuiRegistry.h",
    "content": "#pragma once\n\n#include <QIcon>\n#include <QBrush>\n#include <QAbstractItemView>\n\nnamespace Robomongo\n{\n    /**\n     * @brief GuiRegistry is a simple registry-like singleton, that provides access to\n     *        to another various singletons (including access to the data that is stored in\n     *        resources (i.e. gui.qrc) and caches it, if needed)\n     */\n    class GuiRegistry\n    {\n    public:\n        /**\n         * @brief Returns single instance of GuiRegistry\n         */\n        static GuiRegistry& instance()\n        {\n            static GuiRegistry _instance;\n            return _instance;\n        }\n\n        void setAlternatingColor(QAbstractItemView *view);\n\n        /**\n         * @brief Functions that provide access to various icons\n         */\n        const QIcon& serverIcon() const;\n        const QIcon& serverImportedIcon() const;\n        const QIcon& serverPrimaryIcon() const;\n        const QIcon& serverSecondaryIcon() const;\n        const QIcon& replicaSetIcon() const;\n        const QIcon& replicaSetOfflineIcon() const;\n        const QIcon& saveIcon() const;\n        const QIcon& openIcon() const;\n        const QIcon& databaseIcon() const;\n        const QIcon& collectionIcon() const;\n        const QIcon& indexIcon() const;\n        const QIcon& userIcon() const;\n        const QIcon& functionIcon() const;\n        const QIcon& maximizeIcon() const;\n        const QIcon& minimizeIcon() const;\n        const QIcon& undockIcon() const;\n        const QIcon& dockIcon() const;\n        const QIcon& textIcon() const;\n        const QIcon& textHighlightedIcon() const;\n        const QIcon& treeIcon() const;\n        const QIcon& treeHighlightedIcon() const;\n        const QIcon& tableIcon() const;\n        const QIcon& tableHighlightedIcon() const;\n        const QIcon& customIcon() const;\n        const QIcon& customHighlightedIcon() const;\n        const QIcon& rotateIcon() const;\n        const QIcon& visualIcon() const;\n        const QIcon& folderIcon() const;\n        const QIcon& circleIcon() const;\n        const QIcon& leftIcon() const;\n        const QIcon& rightIcon() const;\n        const QIcon& mongodbIcon() const;\n        const QIcon& mongodbIconForMAC() const;\n        const QIcon& connectIcon() const;\n        const QIcon& executeIcon() const;\n        const QIcon& stopIcon() const;\n        const QIcon& exportIcon() const;\n        const QIcon& importIcon() const;\n        const QIcon& deleteIcon() const;\n        const QIcon& deleteIconRed() const;\n        const QIcon& deleteIconMouseHovered() const;\n        const QIcon& mainWindowIcon() const;\n        const QIcon& bsonObjectIcon() const;\n        const QIcon& bsonArrayIcon() const;\n        const QIcon& bsonStringIcon() const;\n        const QIcon& bsonIntegerIcon() const;\n\t\tconst QIcon& bsonDoubleIcon() const;\n\t\tconst QIcon& bsonNumberDecimalIcon() const;\n        const QIcon& bsonDateTimeIcon() const;\n        const QIcon& bsonBinaryIcon() const;\n        const QIcon& bsonNullIcon() const;\n        const QIcon& bsonBooleanIcon() const;\n        const QIcon& noMarkIcon() const;\n        const QIcon& yesMarkIcon() const;\n        const QIcon& skipMarkIcon() const;\n        const QIcon& questionMarkIcon() const;\n        const QIcon& timeIcon() const;\n        const QIcon& keyIcon() const;\n        const QIcon& showIcon() const;\n        const QIcon& hideIcon() const;\n        const QIcon& plusIcon() const;\n        const QIcon& minusIcon() const;\n        const QIcon& welcomeTabIcon() const;\n\n        const QBrush& typeBrush() const;\n\n        const QFont& font() const;\n    private:\n        /**\n         * @brief Private, because this is singleton\n         */\n        GuiRegistry();\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/MainWindow.cpp",
    "content": "#include \"robomongo/gui/MainWindow.h\"\n\n#include <QApplication>\n#include <QToolButton>\n#include <QMessageBox>\n#include <QWidgetAction>\n#include <QMenuBar>\n#include <QMenu>\n#include <QKeyEvent>\n#include <QToolBar>\n#include <QToolTip>\n#include <QDockWidget>\n#include <QDesktopWidget>\n#include <QTimer>\n#include <QPushButton>\n#include <QLabel>\n#include <QStatusBar>\n#include <QHBoxLayout>\n#include <QSettings>\n#include <QSystemTrayIcon>\n#include <QNetworkAccessManager>\n#include <QNetworkRequest>\n#include <QNetworkReply>\n#include <QUrl>\n#include <QTextDocument>\n\n#include <mongo/logger/log_severity.h>\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/core/settings/SshSettings.h\"\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/EventBus.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/utils/Logger.h\"\n\n#include \"robomongo/gui/widgets/LogWidget.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerWidget.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerTreeWidget.h\"\n#include \"robomongo/gui/widgets/workarea/WorkAreaTabWidget.h\"\n#include \"robomongo/gui/widgets/workarea/QueryWidget.h\"\n#include \"robomongo/gui/widgets/workarea/QueryWidget.h\"\n#include \"robomongo/gui/widgets/workarea/WelcomeTab.h\"\n#include \"robomongo/gui/dialogs/ConnectionsDialog.h\"\n#include \"robomongo/gui/dialogs/AboutDialog.h\"\n#include \"robomongo/gui/dialogs/PreferencesDialog.h\"\n#include \"robomongo/gui/dialogs/ExportDialog.h\"\n#include \"robomongo/gui/dialogs/ChangeShellTimeoutDialog.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/AppStyle.h\"\n\nnamespace\n{\n    void setToolBarIconSize(QToolBar *toolBar)\n    {\n#if defined(Q_OS_MAC)\n        const int size = 20;\n#else\n        const int size = 24;\n#endif\n        toolBar->setIconSize(QSize(size, size));\n    }\n\n    void saveViewMode(Robomongo::ViewMode mode)\n    {\n        Robomongo::AppRegistry::instance().settingsManager()->setViewMode(mode);\n        Robomongo::AppRegistry::instance().settingsManager()->save();\n    }\n    \n    void saveAutoExpand(bool isExpand)\n    {\n        Robomongo::AppRegistry::instance().settingsManager()->setAutoExpand(isExpand);\n        Robomongo::AppRegistry::instance().settingsManager()->save();\n    }\n    \n    void saveAutoExec(bool isAutoExec)\n    {\n        Robomongo::AppRegistry::instance().settingsManager()->setAutoExec(isAutoExec);\n        Robomongo::AppRegistry::instance().settingsManager()->save();\n    }\n\n    void saveMinimizeToTraySettings(bool isMinimizingToTray)\n    {\n        Robomongo::AppRegistry::instance().settingsManager()->setMinimizeToTray(isMinimizingToTray);\n        Robomongo::AppRegistry::instance().settingsManager()->save();\n    }\n\n    void saveLineNumbers(bool showLineNumbers)\n    {\n        Robomongo::AppRegistry::instance().settingsManager()->setLineNumbers(showLineNumbers);\n        Robomongo::AppRegistry::instance().settingsManager()->save();\n    }\n\n\n} \n/* End of anonymous namespace */\n\n\nnamespace Robomongo\n{\n/* -------------------------------- ConnectionMenu ---------------------------- */\n    class ConnectionMenu : public QMenu\n    {\n    public:\n        ConnectionMenu(QWidget *parent) : QMenu(parent) {}\n    protected:\n        virtual void keyPressEvent(QKeyEvent *event) override\n        {\n            if (event->key() == Qt::Key_F12) {\n                hide();\n            }\n            else {\n                QMenu::keyPressEvent(event);\n            }\n        }\n    };\n\n/* -------------------------------- MainWindow --------------------------------- */\n\n    // In milliseconds\n    constexpr int ONE_HOUR = 3'600'000;     // (3'600'000 msec = 60 * 60 * 1000 msec)\n    constexpr int THIRTY_SECONDS = 30'000;\n    constexpr int ONE_SECOND = 1'000;\n\n    MainWindow::MainWindow()\n        : BaseClass(),\n        _logDock(nullptr), _workArea(nullptr), _explorer(nullptr), _app(AppRegistry::instance().app()), \n        _connectionsMenu(nullptr), _connectButton(nullptr), _viewMenu(nullptr), _toolbarsMenu(nullptr), \n        _connectAction(nullptr), _openAction(nullptr), _saveAction(nullptr), _saveAsAction(nullptr),\n        _executeAction(nullptr), _stopAction(nullptr), _orientationAction(nullptr), _execToolBar(nullptr),\n#if defined(Q_OS_WIN)\n        _trayIcon(nullptr),\n#endif\n        _allowExit(false)\n     {\n        QColor background = palette().window().color();\n        QString controlKey = \"Ctrl\";\n\n    #if defined(Q_OS_MAC)\n        QString explorerColor = \"#EFEFEF\"; // was #CED6DF\"\n        controlKey = QChar(0x2318); // \"Command\" key aka Cauliflower\n        setUnifiedTitleAndToolBarOnMac(true);\n    #elif defined(Q_OS_LINUX)\n        QString explorerColor = background.darker(103).name();\n    #else\n        QString explorerColor = background.lighter(103).name();\n    #endif\n\n        qApp->setStyleSheet(QString(\n            \"QWidget#queryWidget { background-color:#E7E5E4; margin: 0px; padding:0px; } \\n\"\n            \"Robomongo--ExplorerTreeWidget#explorerTree { padding: 1px 0px 0px 0px; background-color: %1; border: 0px; } \\n\"\n            \"QMainWindow::separator { background: #E7E5E4; width: 1px; } \\n\"\n            \"QMessageBox { messagebox-text-interaction-flags: 5; }\"  // Make QMessageBox text selectable\n        ).arg(explorerColor));\n        _openAction = new QAction(GuiRegistry::instance().openIcon(), tr(\"&Open...\"), this);\n        _openAction->setToolTip(QString(\"Load script from the file to the currently opened shell <b>(%1 + O)</b>\").arg(controlKey));\n        _openAction->setShortcuts(QKeySequence::Open);\n        VERIFY(connect(_openAction, SIGNAL(triggered()), this, SLOT(open())));\n\n        _saveAction = new QAction(GuiRegistry::instance().saveIcon(), tr(\"&Save\"), this);\n        _saveAction->setShortcuts(QKeySequence::Save);\n        _saveAction->setToolTip(QString(\"Save script of the currently opened shell to the file <b>(%1 + S)</b>\").arg(controlKey));\n        VERIFY(connect(_saveAction, SIGNAL(triggered()), this, SLOT(save())));\n\n        _saveAsAction = new QAction(tr(\"Save &As...\"), this);\n        _saveAsAction->setShortcuts(QKeySequence::SaveAs);\n        VERIFY(connect(_saveAsAction, SIGNAL(triggered()), this, SLOT(saveAs())));\n\n        // Exit action\n        QAction *exitAction = new QAction(\"&Exit\", this);\n        exitAction->setShortcuts(QKeySequence::Quit);\n        VERIFY(connect(exitAction, SIGNAL(triggered()), this, SLOT(exit())));\n\n        // Connect action\n        _connectAction = new QAction(\"&Connect...\", this);\n        _connectAction->setShortcuts(QKeySequence::New);\n        _connectAction->setIcon(GuiRegistry::instance().connectIcon());\n        _connectAction->setIconText(\"Connect\");\n        _connectAction->setToolTip(QString(\"Connect to local or remote MongoDB instance <b>(%1 + N)</b>\").arg(controlKey));\n        VERIFY(connect(_connectAction, SIGNAL(triggered()), this, SLOT(manageConnections())));\n\n        _connectionsMenu = new ConnectionMenu(this);\n        VERIFY(connect(_connectionsMenu, SIGNAL(triggered(QAction*)), this, SLOT(connectToServer(QAction*))));\n        updateConnectionsMenu();\n\n        _connectButton = new QToolButton();\n        _connectButton->setText(\"&Connect...\");\n        _connectButton->setIcon(GuiRegistry::instance().connectIcon());\n        _connectButton->setFocusPolicy(Qt::NoFocus);\n        _connectButton->setToolTip(QString(\"Connect to local or remote MongoDB instance <b>(%1 + N)</b>\").arg(controlKey));\n        _connectButton->setToolButtonStyle(Qt::ToolButtonIconOnly);\n        \n    #if !defined(Q_OS_MAC)\n        _connectButton->setMenu(_connectionsMenu);\n        _connectButton->setPopupMode(QToolButton::MenuButtonPopup);\n    #endif\n\n        VERIFY(connect(_connectButton, SIGNAL(clicked()), this, SLOT(manageConnections())));\n\n        QWidgetAction *connectButtonAction = new QWidgetAction(this);\n        connectButtonAction->setDefaultWidget(_connectButton);\n\n        // Tray icon\n    #if defined(Q_OS_WIN)\n        _trayIcon = new QSystemTrayIcon(GuiRegistry::instance().mainWindowIcon());\n        VERIFY(connect(_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), \n                       this, SLOT(trayActivated(QSystemTrayIcon::ActivationReason))));\n\n        auto trayMinimizeAction = new QAction(\"Minimize to Tray\", _trayIcon);\n        VERIFY(connect(trayMinimizeAction, SIGNAL(triggered()), this, SLOT(toggleMinimize())));\n\n        auto trayExitAction = new QAction(\"Exit\", _trayIcon);\n        VERIFY(connect(trayExitAction, SIGNAL(triggered()), this, SLOT(exit())));\n       \n        auto contextMenu = new QMenu();\n        contextMenu->addAction(trayMinimizeAction);\n        contextMenu->addSeparator();\n        contextMenu->addAction(trayExitAction);\n\n        _trayIcon->setContextMenu(contextMenu);\n    #endif\n\n        // Orientation action\n        _orientationAction = new QAction(\"&Rotate\", this);\n        _orientationAction->setShortcut(Qt::Key_F10);\n        _orientationAction->setIcon(GuiRegistry::instance().rotateIcon());\n        _orientationAction->setToolTip(\"Toggle orientation of results view <b>(F10)</b>\");\n        VERIFY(connect(_orientationAction, SIGNAL(triggered()), this, SLOT(toggleOrientation())));\n\n        // read view mode setting\n        ViewMode viewMode = AppRegistry::instance().settingsManager()->viewMode();\n\n        // Text mode action\n        auto textModeAction = new QAction(\"&Text Mode\", this);\n        textModeAction->setShortcut(Qt::Key_F4);\n        textModeAction->setIcon(GuiRegistry::instance().textHighlightedIcon());\n        textModeAction->setToolTip(\"Show current tab in text mode, and make this mode default for all subsequent queries <b>(F4)</b>\");\n        textModeAction->setCheckable(true);\n        textModeAction->setChecked(viewMode == Text);\n        VERIFY(connect(textModeAction, SIGNAL(triggered()), this, SLOT(enterTextMode())));\n\n        // Tree mode action\n        QAction *treeModeAction = new QAction(\"&Tree Mode\", this);\n        treeModeAction->setShortcut(Qt::Key_F2);\n        treeModeAction->setIcon(GuiRegistry::instance().treeHighlightedIcon());\n        treeModeAction->setToolTip(\"Show current tab in tree mode, and make this mode default for all subsequent queries <b>(F3)</b>\");\n        treeModeAction->setCheckable(true);\n        treeModeAction->setChecked(viewMode == Tree);\n        VERIFY(connect(treeModeAction, SIGNAL(triggered()), this, SLOT(enterTreeMode())));\n\n        // Tree mode action\n        QAction *tableModeAction = new QAction(\"T&able Mode\", this);\n        tableModeAction->setShortcut(Qt::Key_F3);\n        tableModeAction->setIcon(GuiRegistry::instance().tableHighlightedIcon());\n        tableModeAction->setToolTip(\"Show current tab in table mode, and make this mode default for all subsequent queries <b>(F3)</b>\");\n        tableModeAction->setCheckable(true);\n        tableModeAction->setChecked(viewMode == Table);\n        VERIFY(connect(tableModeAction, SIGNAL(triggered()), this, SLOT(enterTableMode())));\n\n        // Custom mode action\n        QAction *customModeAction = new QAction(\"&Custom Mode\", this);\n        //customModeAction->setShortcut(Qt::Key_F2);\n        customModeAction->setIcon(GuiRegistry::instance().customHighlightedIcon());\n        customModeAction->setToolTip(\"Show current tab in custom mode if possible, and make this mode default for all subsequent queries <b>(F2)</b>\");\n        customModeAction->setCheckable(true);\n        customModeAction->setChecked(viewMode == Custom);\n        VERIFY(connect(customModeAction, SIGNAL(triggered()), this, SLOT(enterCustomMode())));\n\n        // Execute action\n        _executeAction = new QAction(this);\n        _executeAction->setData(\"Execute\");\n        _executeAction->setIcon(GuiRegistry::instance().executeIcon());\n        _executeAction->setShortcut(Qt::Key_F5);\n        _executeAction->setToolTip(QString(\"Execute query for current tab. If you have some selection in query text - only selection will be executed <b>(F5 </b> or <b>%1 + Enter)</b>\").arg(controlKey));\n        VERIFY(connect(_executeAction, SIGNAL(triggered()), SLOT(executeScript())));\n\n        // Stop action\n        _stopAction = new QAction(this);\n        _stopAction->setData(\"Stop\");\n        _stopAction->setIcon(GuiRegistry::instance().stopIcon());\n        _stopAction->setShortcut(Qt::Key_F6);\n        _stopAction->setToolTip(\"Stop execution of currently running script. <b>(F6)</b>\");\n        _stopAction->setDisabled(true);\n        VERIFY(connect(_stopAction, SIGNAL(triggered()), SLOT(stopScript())));\n\n        // Refresh action\n        QAction *refreshAction = new QAction(\"Refresh\", this);\n        refreshAction->setIcon(qApp->style()->standardIcon(QStyle::SP_BrowserReload));\n        VERIFY(connect(refreshAction, SIGNAL(triggered()), this, SLOT(refreshConnections())));\n\n\n    /*** File menu ***/\n        QMenu *fileMenu = menuBar()->addMenu(\"File\");\n        fileMenu->addAction(_connectAction);\n        fileMenu->addSeparator();\n        fileMenu->addAction(_openAction);\n        fileMenu->addAction(_saveAction);\n        fileMenu->addAction(_saveAsAction);\n        fileMenu->addSeparator();\n        fileMenu->addAction(exitAction);\n\n\n    /*** View menu ***/\n        _viewMenu = menuBar()->addMenu(\"View\");\n        // adds option to toggle Explorer and Logs panels\n        createDatabaseExplorer();\n        _toolbarsMenu = _viewMenu->addMenu(tr(\"Toolbars\"));\n        // adds Themes submenu\n        createStylesMenu();\n\n\n    /*** Options menu ***/\n\n        QMenu *optionsMenu = menuBar()->addMenu(\"Options\");\n\n        // View Mode\n        QMenu *defaultViewModeMenu = optionsMenu->addMenu(\"Default View Mode\");\n        defaultViewModeMenu->addAction(customModeAction);\n        defaultViewModeMenu->addAction(treeModeAction);\n        defaultViewModeMenu->addAction(tableModeAction);\n        defaultViewModeMenu->addAction(textModeAction);\n        \n        optionsMenu->addSeparator();\n\n        QActionGroup *modeGroup = new QActionGroup(this);\n        modeGroup->addAction(textModeAction);\n        modeGroup->addAction(treeModeAction);\n        modeGroup->addAction(tableModeAction);\n        modeGroup->addAction(customModeAction);\n\n        // Time Zone\n        QAction *utcTime = new QAction(convertTimesToString(Utc), this);\n        utcTime->setCheckable(true);\n        utcTime->setChecked(AppRegistry::instance().settingsManager()->timeZone() == Utc);\n        VERIFY(connect(utcTime, SIGNAL(triggered()), this, SLOT(setUtcTimeZone())));\n\n        QAction *localTime = new QAction(convertTimesToString(LocalTime), this);\n        localTime->setCheckable(true);\n        localTime->setChecked(AppRegistry::instance().settingsManager()->timeZone() == LocalTime);\n        VERIFY(connect(localTime, SIGNAL(triggered()), this, SLOT(setLocalTimeZone())));\n\n        QMenu *timeMenu = optionsMenu->addMenu(\"Display Dates In...\");\n        timeMenu->addAction(utcTime);\n        timeMenu->addAction(localTime);\n\n        QActionGroup *timeZoneGroup = new QActionGroup(this);\n        timeZoneGroup->addAction(utcTime);\n        timeZoneGroup->addAction(localTime);\n\n        // UUID encoding\n        QAction *defaultEncodingAction = new QAction(\"Do not decode (show as is)\", this);\n        defaultEncodingAction->setCheckable(true);\n        defaultEncodingAction->setChecked(AppRegistry::instance().settingsManager()->uuidEncoding() == DefaultEncoding);\n        VERIFY(connect(defaultEncodingAction, SIGNAL(triggered()), this, SLOT(setDefaultUuidEncoding())));\n\n        QAction *javaLegacyEncodingAction = new QAction(\"Use Java Encoding\", this);\n        javaLegacyEncodingAction->setCheckable(true);\n        javaLegacyEncodingAction->setChecked(AppRegistry::instance().settingsManager()->uuidEncoding() == JavaLegacy);\n        VERIFY(connect(javaLegacyEncodingAction, SIGNAL(triggered()), this, SLOT(setJavaUuidEncoding())));\n\n        QAction *csharpLegacyEncodingAction = new QAction(\"Use .NET Encoding\", this);\n        csharpLegacyEncodingAction->setCheckable(true);\n        csharpLegacyEncodingAction->setChecked(AppRegistry::instance().settingsManager()->uuidEncoding() == CSharpLegacy);\n        VERIFY(connect(csharpLegacyEncodingAction, SIGNAL(triggered()), this, SLOT(setCSharpUuidEncoding())));\n\n        QAction *pythonEncodingAction = new QAction(\"Use Python Encoding\", this);\n        pythonEncodingAction->setCheckable(true);\n        pythonEncodingAction->setChecked(AppRegistry::instance().settingsManager()->uuidEncoding() == PythonLegacy);\n        VERIFY(connect(pythonEncodingAction, SIGNAL(triggered()), this, SLOT(setPythonUuidEncoding())));\n\n        QMenu *uuidMenu = optionsMenu->addMenu(\"Legacy UUID Encoding\");\n        uuidMenu->addAction(defaultEncodingAction);\n        uuidMenu->addAction(javaLegacyEncodingAction);\n        uuidMenu->addAction(csharpLegacyEncodingAction);\n        uuidMenu->addAction(pythonEncodingAction);\n\n        // Read Autocompletion Mode\n        AutocompletionMode autocompletionMode = AppRegistry::instance().settingsManager()->autocompletionMode();\n\n        // Autocompletion\n        QAction *autocompletionAllAction = new QAction(\"All\", this);\n        autocompletionAllAction->setCheckable(true);\n        autocompletionAllAction->setChecked(autocompletionMode == AutocompleteAll);\n        VERIFY(connect(autocompletionAllAction, SIGNAL(triggered()), this, SLOT(setShellAutocompletionAll())));\n\n        QAction *autocompletionNoCollectionNamesAction = new QAction(\"All (Except Collection Names)\", this);\n        autocompletionNoCollectionNamesAction->setCheckable(true);\n        autocompletionNoCollectionNamesAction->setChecked(autocompletionMode == AutocompleteNoCollectionNames);\n        VERIFY(connect(autocompletionNoCollectionNamesAction, SIGNAL(triggered()), this, SLOT(setShellAutocompletionNoCollectionNames())));\n\n        QAction *autocompletionNoneAction = new QAction(\"None\", this);\n        autocompletionNoneAction->setCheckable(true);\n        autocompletionNoneAction->setChecked(autocompletionMode == AutocompleteNone);\n        VERIFY(connect(autocompletionNoneAction, SIGNAL(triggered()), this, SLOT(setShellAutocompletionNone())));\n\n        QMenu *autocompletionMenu = optionsMenu->addMenu(\"Autocompletion Mode\");\n        autocompletionMenu->addAction(autocompletionAllAction);\n        autocompletionMenu->addAction(autocompletionNoCollectionNamesAction);\n        autocompletionMenu->addAction(autocompletionNoneAction);\n\n        QActionGroup *autocompletionGroup = new QActionGroup(this);\n        autocompletionGroup->addAction(autocompletionAllAction);\n        autocompletionGroup->addAction(autocompletionNoCollectionNamesAction);\n        autocompletionGroup->addAction(autocompletionNoneAction);\n\n        QAction *loadMongoRcJs = new QAction(\"Load .mongorc.js\", this);\n        loadMongoRcJs->setCheckable(true);\n        loadMongoRcJs->setChecked(AppRegistry::instance().settingsManager()->loadMongoRcJs());\n        VERIFY(connect(loadMongoRcJs, SIGNAL(triggered()), this, SLOT(setLoadMongoRcJs())));\n        optionsMenu->addSeparator();\n        optionsMenu->addAction(loadMongoRcJs);\n\n        optionsMenu->addSeparator();\n\n        QAction *autoExpand = new QAction(\"Auto Expand First Document\", this);\n        autoExpand->setCheckable(true);\n        autoExpand->setChecked(AppRegistry::instance().settingsManager()->autoExpand());\n        VERIFY(connect(autoExpand, SIGNAL(triggered()), this, SLOT(toggleAutoExpand())));\n        optionsMenu->addAction(autoExpand);\n\n        QAction *showLineNumbers = new QAction(\"Show Line Numbers By Default\", this);\n        showLineNumbers->setCheckable(true);\n        showLineNumbers->setChecked(AppRegistry::instance().settingsManager()->lineNumbers());\n        VERIFY(connect(showLineNumbers, SIGNAL(triggered()), this, SLOT(toggleLineNumbers())));\n        optionsMenu->addAction(showLineNumbers);\n\n        QAction *disabelConnectionShortcuts = new QAction(\"Disable Connection Shortcuts\", this);\n        disabelConnectionShortcuts->setCheckable(true);\n        disabelConnectionShortcuts->setChecked(AppRegistry::instance().settingsManager()->disableConnectionShortcuts());\n        VERIFY(connect(disabelConnectionShortcuts, SIGNAL(triggered()), this, SLOT(setDisableConnectionShortcuts())));\n        optionsMenu->addAction(disabelConnectionShortcuts);\n        \n        QAction *autoExec = new QAction(tr(\"Automatically execute code in new tab\"), this);\n        autoExec->setCheckable(true);\n        autoExec->setChecked(AppRegistry::instance().settingsManager()->autoExec());\n        VERIFY(connect(autoExec, SIGNAL(triggered()), this, SLOT(toggleAutoExec())));\n        optionsMenu->addAction(autoExec);\n\n    #if defined(Q_OS_WIN)\n        QAction *minimizeTray = new QAction(\"Close button should minimize to system tray\");\n        minimizeTray->setCheckable(true);\n        minimizeTray->setChecked(AppRegistry::instance().settingsManager()->minimizeToTray());\n        VERIFY(connect(minimizeTray, SIGNAL(triggered()), this, SLOT(toggleMinimizeToTray())));\n        optionsMenu->addAction(minimizeTray);\n    #endif\n\n        auto checkUpdates = new QAction(tr(\"Check For Updates\"), this);\n        checkUpdates->setCheckable(true);\n        checkUpdates->setChecked(AppRegistry::instance().settingsManager()->checkForUpdates());\n        VERIFY(connect(checkUpdates, SIGNAL(triggered()), this, SLOT(toggleCheckUpdates())));\n        optionsMenu->addAction(checkUpdates);\n\n        auto changeShellTimeout = new QAction(tr(\"Change Shell Timeout...\"), this);\n        VERIFY(connect(changeShellTimeout, SIGNAL(triggered()), this, SLOT(openShellTimeoutDialog())));\n        optionsMenu->addAction(changeShellTimeout);\n\n        QAction *preferencesAction = new QAction(\"Preferences\", this);\n        VERIFY(connect(preferencesAction, SIGNAL(triggered()), this, SLOT(openPreferences())));\n        preferencesAction->setVisible(false);\n        optionsMenu->addAction(preferencesAction);\n\n        QActionGroup *uuidEncodingGroup = new QActionGroup(this);\n        uuidEncodingGroup->addAction(defaultEncodingAction);\n        uuidEncodingGroup->addAction(javaLegacyEncodingAction);\n        uuidEncodingGroup->addAction(csharpLegacyEncodingAction);\n        uuidEncodingGroup->addAction(pythonEncodingAction);\n\n    /*** Window menu ***/\n        // Full screen action\n        QAction *fullScreenAction = new QAction(\"&Full Screen\", this);\n    #if !defined(Q_OS_MAC)\n        fullScreenAction->setShortcut(Qt::Key_F11);\n    #else\n        fullScreenAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_F11));\n    #endif\n        fullScreenAction->setVisible(true);\n        VERIFY(connect(fullScreenAction, SIGNAL(triggered()), this, SLOT(toggleFullScreen2())));\n\n        // Minimize window\n        QAction *minimizeAction = new QAction(\"&Minimize\", this);\n        minimizeAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_M));\n        minimizeAction->setVisible(true);\n        VERIFY(connect(minimizeAction, SIGNAL(triggered()), this, SLOT(showMinimized())));\n\n        // Next tab\n        QAction *nexttabAction = new QAction(\"Select Next Tab\", this);\n        nexttabAction->setShortcuts(QKeySequence::NextChild);\n        nexttabAction->setVisible(true);\n        VERIFY(connect(nexttabAction, SIGNAL(triggered()), this, SLOT(selectNextTab())));\n\n        // Previous tab\n        QAction *prevtabAction = new QAction(\"Select Previous Tab\", this);\n        prevtabAction->setShortcuts(QKeySequence::PreviousChild);\n        prevtabAction->setVisible(true);\n        VERIFY(connect(prevtabAction, SIGNAL(triggered()), this, SLOT(selectPrevTab())));\n\n        // Reload action (currently a re-execute, as does not \"reload\" files per issue #447)\n        QAction *reloadAction = new QAction(\"Re-execute Query in Current Tab\", this);\n        reloadAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_R));\n        reloadAction->setVisible(true);\n        VERIFY(connect(reloadAction, SIGNAL(triggered()), SLOT(executeScript())));\n\n        // Duplicate tab action\n        QAction *duplicateAction = new QAction(\"Duplicate Query in New Tab\", this);\n        duplicateAction->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_T);\n        duplicateAction->setVisible(true);\n        VERIFY(connect(duplicateAction, SIGNAL(triggered()), SLOT(duplicateTab())));\n\n        // Window menu\n        QMenu *windowMenu = menuBar()->addMenu(\"Window\");\n        //minimize\n        windowMenu->addAction(fullScreenAction);\n        windowMenu->addAction(minimizeAction);\n        windowMenu->addSeparator();\n        windowMenu->addAction(nexttabAction);\n        windowMenu->addAction(prevtabAction);\n        windowMenu->addSeparator();\n        windowMenu->addAction(reloadAction);\n        windowMenu->addAction(duplicateAction);\n        windowMenu->addSeparator();\n\n        auto const& settings { AppRegistry::instance().settingsManager() };\n        if (!settings->disableHttpsFeatures()) {\n            // Open welcome tab action\n            auto openWelcomeTabAction = new QAction(\"Open/Refresh Welcome Tab\", this);\n            openWelcomeTabAction->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_W);\n            openWelcomeTabAction->setVisible(true);\n            VERIFY(connect(openWelcomeTabAction, SIGNAL(triggered()), SLOT(openWelcomeTab())));\n            windowMenu->addAction(openWelcomeTabAction);\n        }        \n\n        auto toolbarsSettings = AppRegistry::instance().settingsManager()->toolbars();\n\n    /*** About menu ***/\n\n        QAction *aboutRobomongoAction = new QAction(\"&About Robo 3T...\", this);\n        VERIFY(connect(aboutRobomongoAction, SIGNAL(triggered()), this, SLOT(aboutRobomongo())));\n\n        // Options menu\n        QMenu *helpMenu = menuBar()->addMenu(\"Help\");\n        helpMenu->addAction(aboutRobomongoAction);\n\n        // Toolbar\n        QToolBar *connectToolBar = new QToolBar(tr(\"Connections Toolbar\"), this);\n        connectToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);\n        connectToolBar->addAction(connectButtonAction);\n        connectToolBar->setShortcutEnabled(1, true);\n        connectToolBar->setMovable(false);\n        connectToolBar->setVisible(true /*toolbarsSettings[\"connect\"].toBool()*/);\n        _toolbarsMenu->addAction(connectToolBar->toggleViewAction());\n        VERIFY(connect(connectToolBar->toggleViewAction(), SIGNAL(triggered(bool)), this, SLOT(onConnectToolbarVisibilityChanged(bool))));\n        setToolBarIconSize(connectToolBar);\n        addToolBar(connectToolBar);\n\n        QToolBar *openSaveToolBar = new QToolBar(tr(\"Open/Save Toolbar\"), this);\n        openSaveToolBar->addAction(_openAction);\n        openSaveToolBar->addAction(_saveAction);\n        openSaveToolBar->setMovable(false);\n        openSaveToolBar->setVisible(true /*toolbarsSettings[\"open_save\"].toBool()*/);\n        _toolbarsMenu->addAction(openSaveToolBar->toggleViewAction());\n        VERIFY(connect(openSaveToolBar->toggleViewAction(), SIGNAL(triggered(bool)), this, SLOT(onOpenSaveToolbarVisibilityChanged(bool))));\n        setToolBarIconSize(openSaveToolBar);\n        addToolBar(openSaveToolBar);\n\n        _execToolBar = new QToolBar(tr(\"Execution Toolbar\"), this);\n        _execToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);\n        _execToolBar->addAction(_executeAction);\n        _execToolBar->addAction(_stopAction);\n        _execToolBar->addAction(_orientationAction);\n        _execToolBar->setShortcutEnabled(1, true);\n        _execToolBar->setMovable(false);\n        _execToolBar->setVisible(true /*toolbarsSettings[\"exec\"].toBool()*/);\n        setToolBarIconSize(_execToolBar);\n        addToolBar(_execToolBar);\n\n        _updateLabel = new QLabel;\n        _updateLabel->setWordWrap(true);\n        _updateLabel->setOpenExternalLinks(true);\n        _updateLabel->setTextFormat(Qt::TextFormat::RichText);\n        _updateLabel->setIndent(_updateLabel->fontMetrics().width(\"T\"));\n\n        _closeButton = new QPushButton;\n        _closeButton->setIcon(QIcon(\":/robomongo/icons/close_hover_16x16.png\"));\n        _closeButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum);\n        _closeButton->setMouseTracking(true);\n        _closeButton->setAttribute(Qt::WA_Hover);\n        _closeButton->installEventFilter(this);\n        VERIFY(connect(_closeButton, SIGNAL(clicked()), this, SLOT(on_closeButton_clicked())));\n\n        auto updateBarLay = new QHBoxLayout;\n        updateBarLay->addWidget(_updateLabel);\n        updateBarLay->addWidget(_closeButton, Qt::AlignRight);\n        updateBarLay->setSpacing(0);\n        updateBarLay->setMargin(0);\n\n        auto updateBarWid = new QWidget;\n        updateBarWid->setLayout(updateBarLay);\n\n        _updateBar = new QToolBar(\"Updates Toolbar\");\n        _updateBar->addWidget(updateBarWid);\n        _updateBar->setStyleSheet(\"background-color: #b3e0ff; border: none;\");  // blue\n        addToolBarBreak();\n        addToolBar(_updateBar);\n        _updateBar->setHidden(true);\n        _updateBar->setMovable(false);\n\n        _toolbarsMenu->addAction(_execToolBar->toggleViewAction());\n        VERIFY(connect(_execToolBar->toggleViewAction(), SIGNAL(triggered(bool)), \n                       this, SLOT(onExecToolbarVisibilityChanged(bool))));\n\n        createTabs();\n        createStatusBar();\n        setWindowTitle(\"Robo 3T - \" + QString(PROJECT_VERSION_SHORT));\n        setWindowIcon(GuiRegistry::instance().mainWindowIcon());\n\n        QTimer::singleShot(0, this, SLOT(manageConnections()));       \n        updateMenus();\n        _updateMenusAtStart = false;\n\n        AppRegistry::instance().bus()->subscribe(this, ConnectionFailedEvent::Type);\n        AppRegistry::instance().bus()->subscribe(this, ScriptExecutedEvent::Type);\n        AppRegistry::instance().bus()->subscribe(this, ScriptExecutingEvent::Type);\n        AppRegistry::instance().bus()->subscribe(this, QueryWidgetUpdatedEvent::Type);\n        AppRegistry::instance().bus()->subscribe(this, OperationFailedEvent::Type);\n\n        restoreWindowSettings();\n\n        // Catch application windows focus changes\n        VERIFY(connect(qApp, SIGNAL(focusChanged(QWidget*, QWidget*)), this, SLOT(on_focusChanged())));\n\n        _networkAccessManager = new QNetworkAccessManager;\n        VERIFY(connect(_networkAccessManager, SIGNAL(finished(QNetworkReply*)),\n               this, SLOT(on_networkReply(QNetworkReply*))));\n\n        if (!settings->disableHttpsFeatures() && settings->checkForUpdates()) {\n            // First check for updates THIRTY_SECONDS after program start            \n            QTimer::singleShot(THIRTY_SECONDS, this, SLOT(checkUpdates()));\n\n            // Then, check for updates every 1 hour\n            auto const timer { new QTimer(this) };\n            VERIFY(connect(timer, SIGNAL(timeout()), this, SLOT(checkUpdates())));\n            timer->start(ONE_HOUR);\n        }\n\n        setUnifiedTitleAndToolBarOnMac(false); // https://bugreports.qt.io/browse/QTBUG-68946\n    }\n\n    void MainWindow::createStylesMenu()\n    {\n        _viewMenu->addSeparator();\n         QMenu *styles = _viewMenu->addMenu(\"Theme\");\n         QStringList supportedStyles = AppStyleUtils::getSupportedStyles();\n         QActionGroup *styleGroup = new QActionGroup(this);\n         VERIFY(connect(styleGroup, SIGNAL(triggered(QAction *)), this, SLOT(changeStyle(QAction *))));\n         const QString &currentStyle = AppRegistry::instance().settingsManager()->currentStyle();\n         for (QStringList::const_iterator it = supportedStyles.begin(); it != supportedStyles.end(); ++it) {\n             const QString &style = *it;\n             QAction *styleAction = new QAction(style, this);\n             styleAction->setCheckable(true);\n             styleAction->setChecked(style == currentStyle);\n             styleGroup->addAction(styleAction);\n             styles->addAction(styleAction);             \n         }\n    }\n\n    void MainWindow::createStatusBar()\n    {\n        QColor windowColor = palette().window().color();\n        QColor buttonBgColor = windowColor.lighter(105);\n        QColor buttonBorderBgColor = windowColor.darker(112);\n        QColor buttonPressedColor = windowColor.darker(102);\n\n        QToolButton *log = new QToolButton(this);\n        log->setText(\"Logs\");\n        log->setCheckable(true);\n        log->setDefaultAction(_logDock->toggleViewAction());\n        log->setStyleSheet(QString(\n            \"QToolButton {\"\n            \"   background-color: %1;\"\n            \"   border-style: outset;\"\n            \"   border-width: 1px;\"\n            \"   border-radius: 4px;\"\n            \"   border-color: %2;\"\n            \"   padding: 1px 10px 1px 10px;\"\n            \"} \\n\"\n            \"\"\n            \"QToolButton:checked, QToolButton:pressed {\"\n            \"   background-color: %3;\"\n            \"   border-style: inset;\"\n            \"}\")\n            .arg(buttonBgColor.name())\n            .arg(buttonBorderBgColor.name())\n            .arg(buttonPressedColor.name()));\n\n        statusBar()->insertWidget(0, log);\n        statusBar()->setStyleSheet(\"QStatusBar::item { border: 0px solid black };\");\n    }\n\n    void MainWindow::changeStyle(QAction *ac)\n    {\n        const QString &text = ac->text();\n        AppStyleUtils::applyStyle(text);\n        AppRegistry::instance().settingsManager()->setCurrentStyle(text);\n        AppRegistry::instance().settingsManager()->save();\n    }\n\n    void MainWindow::exit()\n    {\n        _allowExit = true;\n        close();\n    }\n\n    void MainWindow::restoreWindowSettings()\n    {\n        QSettings settings(\"3T\", \"Robomongo\");\n        // Restore settings if registery key exists, otherwise resize as app started for the first time.\n        if (settings.contains(\"MainWindow/geometry\"))\n        {\n            restoreGeometry(settings.value(\"MainWindow/geometry\").toByteArray());\n        }\n        else\n        {\n            // Resize main window. We are trying to keep it \"almost\" maximized.\n            QRect screenGeometry = QApplication::desktop()->availableGeometry();\n            int horizontalMargin = static_cast<int>(screenGeometry.width() * 0.1);\n            int verticalMargin = static_cast<int>(screenGeometry.height() * 0.1);\n            int _width = screenGeometry.width() - horizontalMargin;\n            int _height = screenGeometry.height() - verticalMargin;\n            resize(QSize(_width, _height));\n\n            // Center main window\n            int x = (screenGeometry.width() - width()) / 2;\n            int y = (screenGeometry.height() - height()) / 2;\n            move(x, y);\n        }\n    }\n\n    void MainWindow::saveWindowSettings() const\n    {\n        QSettings settings(\"3T\", \"Robomongo\");\n        settings.setValue(\"MainWindow/geometry\", saveGeometry());\n    }\n\n    void MainWindow::adjustUpdatesBarHeight()\n    {\n        if (!AppRegistry::instance().settingsManager()->checkForUpdates() || !_updateBar->isVisible())\n            return;\n\n        QTextDocument doc;\n        doc.setHtml(_updateLabel->text());\n        int const strWidth = _updateLabel->fontMetrics().width(doc.toPlainText());\n        int const lineHeight = _updateLabel->fontMetrics().height();\n        int const widthForUpdateStr = width() - _closeButton->width();\n\n        if (0 == widthForUpdateStr)\n            return;\n\n#ifdef __APPLE__\n        _updateLabel->setFixedHeight((strWidth / widthForUpdateStr + 1) * lineHeight * 1.3);\n#else\n        _updateLabel->setFixedHeight((strWidth / widthForUpdateStr + 1) * lineHeight);\n#endif\n    }\n\n    void MainWindow::open()\n    {\n        QueryWidget *wid = _workArea->currentQueryWidget();\n        if (wid) {\n            wid->openFile();\n        }\n        else {  // todo: currently this case not handled properly, since \"Open\" button is \n                // disabled when no tabs exist\n            auto connectionsCopy = AppRegistry::instance().settingsManager()->connections();\n            if (connectionsCopy.size() == 1) {\n                ScriptInfo inf = ScriptInfo(QString());\n                if (inf.loadFromFile()) {\n                    // todo: for now do not open new shell\n                    _app->openShell(nullptr, connectionsCopy.at(0), inf);\n                }\n            }\n        }\n    }\n\n    void MainWindow::save()\n    {\n        QueryWidget *wid = _workArea->currentQueryWidget();\n        if (wid) {\n            wid->saveToFile();\n        }\n    }\n\n    void MainWindow::saveAs()\n    {\n        QueryWidget *wid = _workArea->currentQueryWidget();\n        if (wid) {\n            wid->savebToFileAs();\n        }\n    }\n\n    void MainWindow::updateConnectionsMenu()\n    {\n        _connectionsMenu->clear();\n        int number = 1;\n        // Populate list with connections\n        SettingsManager::ConnectionSettingsContainerType connections = AppRegistry::instance().settingsManager()->connections();\n        for (SettingsManager::ConnectionSettingsContainerType::const_iterator it = connections.begin(); it != connections.end(); ++it) {\n            ConnectionSettings *connection = *it;\n            QAction *action = new QAction(QtUtils::toQString(connection->getReadableName()), this);\n            action->setData(QVariant::fromValue(connection));\n\n            if (number <= 9 && !AppRegistry::instance().settingsManager()->disableConnectionShortcuts()) {\n                action->setShortcut(QKeySequence(QString(\"Alt+\").append(QString::number(number))));\n            }\n\n            _connectionsMenu->addAction(action);\n            ++number;\n        }\n\n        if (AppRegistry::instance().settingsManager()->connections().size() > 0)\n            _connectionsMenu->addSeparator();\n\n        // Connect action\n        QAction *connectAction = new QAction(\"&Manage Connections...\", this);\n        connectAction->setIcon(GuiRegistry::instance().connectIcon());\n        connectAction->setToolTip(\"Connect to MongoDB\");\n        VERIFY(connect(connectAction, SIGNAL(triggered()), this, SLOT(manageConnections())));\n\n        _connectionsMenu->addAction(connectAction);\n    }\n\n    WelcomeTab* MainWindow::getWelcomeTab()\n    {\n        return _workArea->getWelcomeTab();\n    }\n\n    void MainWindow::showQueryWidgetProgressBar() const\n    {\n        if (QueryWidget *widget = _workArea->currentQueryWidget())\n            widget->showProgress();\n    }\n\n    void MainWindow::hideQueryWidgetProgressBar() const\n    {\n        if (QueryWidget *widget = _workArea->currentQueryWidget())\n            widget->hideProgress();\n    }\n    \n    void MainWindow::manageConnections()\n    {\n    #if defined(Q_OS_WIN)\n        _trayIcon->hide(); // hide the tray icon so the main window can't be hidden behind the connections dialog\n    #endif\n\n        static bool checkForImported = true;\n        ConnectionsDialog dialog(AppRegistry::instance().settingsManager(), checkForImported, this);\n        int result = dialog.exec();\n        checkForImported = false;\n\n        // save settings and update connection menu\n        AppRegistry::instance().settingsManager()->save();\n        updateConnectionsMenu();\n\n        if (result == QDialog::Accepted) {\n            ConnectionSettings *selected = dialog.selectedConnection();\n\n            selected->sshSettings()->setLogLevel(1);\n            if (QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ShiftModifier)) {\n                // Enable debug level of logging for SSH\n                if (selected->sshSettings()->enabled()) {\n                    selected->sshSettings()->setLogLevel(100);\n                }\n\n                // Show log pannel\n                toggleLogs(true);\n            }\n\n            try {\n                _app->openServer(selected, ConnectionPrimary);\n            } catch(const std::exception &) {\n                QString message = QString(\"Cannot connect to MongoDB (%1)\").arg(QtUtils::toQString(selected->getFullAddress()));\n                QMessageBox::information(this, \"Error\", message);\n            }\n        }\n\n    #if defined(Q_OS_WIN)\n        _trayIcon->show(); // show the tray icon once the connections dialog is gone\n    #endif\n\n        // on linux focus is lost - we need to activate main window back\n        activateWindow();\n    }\n\n    void MainWindow::toggleOrientation()\n    {\n        QueryWidget *widget = _workArea->currentQueryWidget();\n        if (!widget)\n            return;\n\n        widget->toggleOrientation();\n    }\n\n    void MainWindow::enterTextMode()\n    {\n        saveViewMode(Text);\n        QueryWidget *widget = _workArea->currentQueryWidget();\n        if (!widget)\n            return;\n\n        widget->enterTextMode();\n    }\n\n    void MainWindow::enterTreeMode()\n    {\n        saveViewMode(Tree);\n        QueryWidget *widget = _workArea->currentQueryWidget();\n        if (!widget)\n            return;\n\n        widget->enterTreeMode();\n    }\n\n    void MainWindow::enterTableMode()\n    {\n        saveViewMode(Table);\n        QueryWidget *widget = _workArea->currentQueryWidget();\n        if (!widget)\n            return;\n\n        widget->enterTableMode();\n    }\n\n    void MainWindow::enterCustomMode()\n    {\n        saveViewMode(Custom);\n        QueryWidget *widget = _workArea->currentQueryWidget();\n        if (!widget)\n            return;\n\n        widget->enterCustomMode();\n    }\n\n    void MainWindow::toggleAutoExpand()\n    {\n        QAction *send = qobject_cast<QAction*>(sender());\n        saveAutoExpand(send->isChecked());\n    }\n    \n    void MainWindow::toggleAutoExec()\n    {\n        QAction *send = qobject_cast<QAction*>(sender());\n        saveAutoExec(send->isChecked());\n    }\n\n    void MainWindow::toggleCheckUpdates()\n    {\n        auto action = qobject_cast<QAction*>(sender());\n        AppRegistry::instance().settingsManager()->setCheckForUpdates(action->isChecked());\n        AppRegistry::instance().settingsManager()->save();\n        QTimer::singleShot(ONE_SECOND, this, SLOT(checkUpdates()));\n    }\n\n    void MainWindow::openShellTimeoutDialog()\n    {\n        changeShellTimeoutDialog();\n    }\n\n    void MainWindow::toggleLineNumbers()\n    {\n        QAction *send = qobject_cast<QAction*>(sender());\n        saveLineNumbers(send->isChecked());\n    }\n    \n    void MainWindow::executeScript()\n    {\n        QueryWidget *widget = _workArea->currentQueryWidget();\n        if (!widget)\n            return;\n\n        widget->execute();\n    }\n\n    void MainWindow::stopScript()\n    {\n        QueryWidget *widget = _workArea->currentQueryWidget();\n        if (!widget)\n            return;\n\n        widget->stop();\n    }\n\n    void MainWindow::toggleFullScreen2()\n    {\n        if (windowState() == Qt::WindowFullScreen)\n            showNormal();\n        else\n            showFullScreen();\n    }\n\n    void MainWindow::selectNextTab()\n    {\n        _workArea->nextTab();\n    }\n\n    void MainWindow::selectPrevTab()\n    {\n        _workArea->previousTab();\n    }\n\n    void MainWindow::duplicateTab()\n    {\n        QueryWidget *widget = _workArea->currentQueryWidget();\n        if (!widget)\n            return;\n\n        widget->duplicate();\n    }\n\n    void MainWindow::refreshConnections()\n    {\n        QToolTip::showText(QPoint(0, 0),\n        QString(\"Refresh not working yet... : <br/>  <b>Ctrl+D</b> : push Button\"));\n    }\n\n    void MainWindow::aboutRobomongo()\n    {\n        AboutDialog dlg(this);\n        dlg.exec();\n    }\n\n    void MainWindow::openPreferences()\n    {\n        PreferencesDialog dlg(this);\n        dlg.exec();\n    }\n\n\n    void MainWindow::openWelcomeTab()\n    {\n        _workArea->openWelcomeTab();\n    }\n\n    void MainWindow::setDefaultUuidEncoding()\n    {\n        AppRegistry::instance().settingsManager()->setUuidEncoding(DefaultEncoding);\n        AppRegistry::instance().settingsManager()->save();\n    }\n\n    void MainWindow::setJavaUuidEncoding()\n    {\n        AppRegistry::instance().settingsManager()->setUuidEncoding(JavaLegacy);\n        AppRegistry::instance().settingsManager()->save();\n    }\n\n    void MainWindow::setCSharpUuidEncoding()\n    {\n        AppRegistry::instance().settingsManager()->setUuidEncoding(CSharpLegacy);\n        AppRegistry::instance().settingsManager()->save();\n    }\n\n    void MainWindow::setPythonUuidEncoding()\n    {\n        AppRegistry::instance().settingsManager()->setUuidEncoding(PythonLegacy);\n        AppRegistry::instance().settingsManager()->save();\n    }\n\n    void MainWindow::setShellAutocompletionAll()\n    {\n        AppRegistry::instance().settingsManager()->setAutocompletionMode(AutocompleteAll);\n        AppRegistry::instance().settingsManager()->save();\n    }\n\n    void MainWindow::setShellAutocompletionNoCollectionNames()\n    {\n        AppRegistry::instance().settingsManager()->setAutocompletionMode(AutocompleteNoCollectionNames);\n        AppRegistry::instance().settingsManager()->save();\n    }\n\n    void MainWindow::setShellAutocompletionNone()\n    {\n        AppRegistry::instance().settingsManager()->setAutocompletionMode(AutocompleteNone);\n        AppRegistry::instance().settingsManager()->save();\n    }\n\n    void MainWindow::setUtcTimeZone()\n    {\n        AppRegistry::instance().settingsManager()->setTimeZone(Utc);\n        AppRegistry::instance().settingsManager()->save();\n    }\n\n    void MainWindow::setLocalTimeZone()\n    {\n        AppRegistry::instance().settingsManager()->setTimeZone(LocalTime);\n        AppRegistry::instance().settingsManager()->save();\n    }\n\n    void MainWindow::setDisableConnectionShortcuts()\n    {\n        QAction *send = qobject_cast<QAction*>(sender());\n        AppRegistry::instance().settingsManager()->setDisableConnectionShortcuts(send->isChecked());\n        AppRegistry::instance().settingsManager()->save();\n        updateConnectionsMenu();\n    }\n\n    void MainWindow::setLoadMongoRcJs()\n    {\n        QAction *send = qobject_cast<QAction*>(sender());\n        AppRegistry::instance().settingsManager()->setLoadMongoRcJs(send->isChecked());\n        AppRegistry::instance().settingsManager()->save();\n    }\n\n    void MainWindow::toggleLogs(bool show)\n    {\n        _logDock->setVisible(show);\n    }\n\n    void MainWindow::connectToServer(QAction *connectionAction)\n    {\n        QVariant data = connectionAction->data();\n        ConnectionSettings *ptr = data.value<ConnectionSettings *>();\n        try {\n            _app->openServer(ptr, ConnectionPrimary);\n        }\n        catch(const std::exception &) {\n            QString message = QString(\"Cannot connect to the MongoDB at %1.\")\n                .arg(QtUtils::toQString(ptr->getFullAddress()));\n            QMessageBox::information(this, \"Error\", message);\n        }\n    }\n\n    void MainWindow::handle(ConnectionFailedEvent *event)\n    {\n        // Handle only Primary connections\n        if (event->connectionType != ConnectionPrimary)\n            return;\n\n        // Very temporary solution to prevent multiple connection error messages\n        // from both SshTunnelWorker and MongoWorker\n        static int lastServerHandle = -1;\n        if (event->serverHandle <= lastServerHandle)\n            return;\n\n        lastServerHandle = event->serverHandle;\n        QMessageBox::critical(this, \"Error\", QtUtils::toQString(event->message));\n    }\n\n    void MainWindow::handle(ScriptExecutingEvent *)\n    {\n        _stopAction->setDisabled(false);\n        _executeAction->setDisabled(true);\n    }\n\n    void MainWindow::handle(ScriptExecutedEvent *)\n    {\n        _stopAction->setDisabled(true);\n        _executeAction->setDisabled(false);\n    }\n\n    void MainWindow::handle(OperationFailedEvent *event)\n    {\n        std::stringstream ss;\n        ss << event->userFriendlyErrorMessage << std::endl << std::endl\n            << \"Error:\" << std::endl << event->technicalErrorMessage;\n\n        QMessageBox::critical(NULL, \"Operation failed\", QtUtils::toQString(ss.str()));\n    }\n\n    void MainWindow::keyPressEvent(QKeyEvent *event)\n    {\n        if (event->key() == Qt::Key_F12) {\n            _connectButton->showMenu();\n            return;\n        }\n\n        BaseClass::keyPressEvent(event);\n    }\n\n    void MainWindow::closeEvent(QCloseEvent *event)\n    {\n        AppRegistry::instance().settingsManager()->setProgramExitedNormally(true);\n        AppRegistry::instance().settingsManager()->save();\n        saveWindowSettings();\n    #if defined(Q_OS_WIN)\n        if (AppRegistry::instance().settingsManager()->minimizeToTray() && !_allowExit) {\n            event->ignore();\n            hide(); // hide the window because it can be reopened with the tray icon\n        }\n        else {\n            if (_trayIcon->isVisible())\n                _trayIcon->hide();\n\n            QMainWindow::closeEvent(event);\n        }\n    #else\n        QMainWindow::closeEvent(event);\n    #endif\n    }\n\n    void MainWindow::hideEvent(QHideEvent *event)\n    {\n#if defined(Q_OS_WIN)\n        if (_trayIcon->contextMenu()->actions().size() > 0 && isHidden()) {\n            _trayIcon->contextMenu()->actions().at(0)->setText(\"Show Robo 3T\");\n        }\n#endif\n    }\n    \n    void MainWindow::showEvent(QShowEvent *event)\n    {\n#if defined(Q_OS_WIN)\n        if (_trayIcon->contextMenu()->actions().size() > 0) {\n            _trayIcon->contextMenu()->actions().at(0)->setText(\"Minimize to Tray\");\n        }\n#endif\n    }\n\n    bool MainWindow::eventFilter(QObject *target, QEvent *event)\n    {\n        auto closeUpdatesBarButton = qobject_cast<QPushButton*>(target);\n        if (!closeUpdatesBarButton)\n            return false;\n\n        if (event->type() == QEvent::HoverEnter) {\n            closeUpdatesBarButton->setIcon(QIcon(\":/robomongo/icons/close_hover_16x16_original.png\"));\n            return true;\n        }\n        else  if (event->type() == QEvent::HoverLeave) {\n            closeUpdatesBarButton->setIcon(QIcon(\":/robomongo/icons/close_hover_16x16.png\"));\n            return true;\n        }\n\n        return QWidget::eventFilter(target, event);\n    }\n\n    void MainWindow::resizeEvent(QResizeEvent* event)\n    {\n        QMainWindow::resizeEvent(event);\n        adjustUpdatesBarHeight();\n    }\n\n    void MainWindow::handle(QueryWidgetUpdatedEvent *event)\n    {\n        _orientationAction->setEnabled(event->numOfResults() > 1);\n    }\n\n    void MainWindow::createDatabaseExplorer()\n    {\n        _explorer = new ExplorerWidget(this);\n        AppRegistry::instance().bus()->subscribe(_explorer, ConnectingEvent::Type);\n        AppRegistry::instance().bus()->subscribe(_explorer, ConnectionFailedEvent::Type);\n        AppRegistry::instance().bus()->subscribe(_explorer, ConnectionEstablishedEvent::Type);\n\n        QDockWidget *explorerDock = new QDockWidget(tr(\"Database Explorer\"));\n        explorerDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);\n        explorerDock->setWidget(_explorer);\n        explorerDock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable);\n\n        QWidget *titleWidget = new QWidget(this);         // this lines simply remove\n        explorerDock->setTitleBarWidget(titleWidget);     // title bar widget.\n        explorerDock->setVisible(true);\n\n        // Prior to v0.9 it was:\n        // explorerDock->setVisible(AppRegistry::instance().settingsManager()->toolbars()[\"explorer\"].toBool());\n        \n        QAction *actionExp = explorerDock->toggleViewAction();\n        // Adjust any parameter you want.  \n        actionExp->setText(QString(\"&Explorer\"));\n        actionExp->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_E));  \n        actionExp->setStatusTip(QString(\"Press to show/hide Database Explorer panel.\"));\n        actionExp->setChecked(explorerDock->isVisible());\n        VERIFY(connect(actionExp, SIGNAL(triggered(bool)), this, SLOT(onExplorerVisibilityChanged(bool))));\n        // Install action in the menu.  \n        _viewMenu->addAction(actionExp);\n\n        addDockWidget(Qt::LeftDockWidgetArea, explorerDock);\n\n        LogWidget *log = new LogWidget(this);        \n        VERIFY(connect(&Logger::instance(), SIGNAL(printed(const QString&, mongo::logger::LogSeverity)), \n            log, SLOT(addMessage(const QString&, mongo::logger::LogSeverity))));\n        _logDock = new QDockWidget(tr(\"Logs\"));\n        _logDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea | Qt::TopDockWidgetArea);\n        _logDock->setWidget(log);\n        _logDock->setFeatures(QDockWidget::DockWidgetClosable);\n        _logDock->setVisible(false);\n\n        QAction *action = _logDock->toggleViewAction();\n        action->setText(QString(\"&Logs\"));\n        action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_L));  \n        //action->setStatusTip(QString(\"Press to show/hide Logs panel.\"));  //commented for now because this message hides Logs button in status bar :)\n        action->setChecked(_logDock->isVisible());\n        // Install action in the menu.\n        _viewMenu->addAction(action);\n        \n        addDockWidget(Qt::BottomDockWidgetArea, _logDock);\n    }\n\n    void MainWindow::updateMenus()\n    {\n        if (!_workArea)\n            return;\n\n        bool isEnable = false;\n        if (_updateMenusAtStart)\n            isEnable = false;\n        else {\n            if (getWelcomeTab() && getWelcomeTab()->isVisible())\n                isEnable = false;\n            else if (_workArea->count() == 0)\n                isEnable = false;\n            else\n                isEnable = true;\n        }\n\n        _execToolBar->setEnabled(isEnable);\n        _openAction->setEnabled(isEnable);\n        _saveAction->setEnabled(isEnable);\n        _saveAsAction->setEnabled(isEnable);\n    }\n\n    void MainWindow::createTabs()\n    {\n        _workArea = new WorkAreaTabWidget(this);\n        AppRegistry::instance().bus()->subscribe(_workArea, OpeningShellEvent::Type);\n        VERIFY(connect(_workArea, SIGNAL(currentChanged(int)), this, SLOT(updateMenus())));\n        VERIFY(connect(_workArea, SIGNAL(currentChanged(int)), this, SLOT(on_tabChange())));\n\n        QHBoxLayout *hlayout = new QHBoxLayout;\n        hlayout->setContentsMargins(0, 3, 0, 0);\n        hlayout->addWidget(_workArea);\n        QWidget *window = new QWidget;\n        window->setLayout(hlayout);\n\n        setCentralWidget(window);\n    }\n    \n    void MainWindow::onConnectToolbarVisibilityChanged(bool isVisible)\n    {\n        AppRegistry::instance().settingsManager()->setToolbarSettings(\"connect\", isVisible);\n        AppRegistry::instance().settingsManager()->save();\n    }\n    \n    void MainWindow::onOpenSaveToolbarVisibilityChanged(bool isVisible)\n    {\n        AppRegistry::instance().settingsManager()->setToolbarSettings(\"open_save\", isVisible);\n        AppRegistry::instance().settingsManager()->save();\n    }\n    \n    void MainWindow::onExecToolbarVisibilityChanged(bool isVisible)\n    {\n        AppRegistry::instance().settingsManager()->setToolbarSettings(\"exec\", isVisible);\n        AppRegistry::instance().settingsManager()->save();\n    }\n    \n    void MainWindow::onExplorerVisibilityChanged(bool isVisible) \n    {\n        AppRegistry::instance().settingsManager()->setToolbarSettings(\"explorer\", isVisible);\n        AppRegistry::instance().settingsManager()->save();\n    }\n\n    void MainWindow::on_tabChange()\n    {\n        auto activeTab = dynamic_cast<QueryWidget*>(_workArea->currentWidget());\n        if (activeTab) {\n            activeTab->bringDockToFront();\n        }\n    }\n\n    void MainWindow::toggleMinimize()\n    {\n        if (isHidden()) {\n            show();\n        }\n        else {\n            hide();\n        }\n    }\n\n    void MainWindow::trayActivated(QSystemTrayIcon::ActivationReason reason)\n    {\n        if (QSystemTrayIcon::DoubleClick == reason && isHidden()) {\n            show();\n        }\n    }\n\n    void MainWindow::toggleMinimizeToTray()\n    {\n        QAction *send = qobject_cast<QAction*>(sender());\n        saveMinimizeToTraySettings(send->isChecked());\n    }\n\n    void MainWindow::on_focusChanged()\n    {\n        // If focus is on floating output window, make it's parent (which is a QueryWidget tab) as active tab\n        auto const activeDock = dynamic_cast<QueryWidget::CustomDockWidget*>(qApp->activeWindow());\n        if (activeDock) {\n            _workArea->setCurrentWidget(activeDock->getParentQueryWidget());\n        }\n    }\n\n    void MainWindow::on_networkReply(QNetworkReply* reply)\n    {\n        QString str(QUrl::fromPercentEncoding(reply->readAll()));\t\n\n        if (str.contains(\"NO-UPDATES\")\n            || reply->error() != QNetworkReply::NoError \n            || str.isEmpty()\n        ) {\n            _updateLabel->setText(\"\");\n            _updateBar->setVisible(false);\n            return;\n        }\n\n        str.replace('+', ' ');\n        str.remove(\"Update,\");\n\n        _updateLabel->setText(str);\n        _updateBar->setVisible(true);\n        adjustUpdatesBarHeight();\n    }\n\n    void MainWindow::on_closeButton_clicked()\n    {\n        _updateBar->setVisible(false);\n    }\n\n    void MainWindow::checkUpdates()\n    {\n        auto const& settings { AppRegistry::instance().settingsManager() };\n        if (!settings->checkForUpdates() || settings->disableHttpsFeatures())\n            return;\n\n#ifdef _WIN32\n        QString const OS = \"win\";\n#elif __APPLE__\n        QString const OS = \"osx\";\n#elif __linux__\n        QString const OS = \"linux\";\n#else\n        QString const OS = \"unknown\";\n#endif\n\n        // Build dbVersionsConnected in following format: \"3.4.3,2.6.0,...\"\n        QString dbVersionsConnected;\n        for (auto const& version : settings->dbVersionsConnected())\n            dbVersionsConnected.append(version + ',');\n        \n        if (dbVersionsConnected.endsWith(','))\n            dbVersionsConnected.chop(1);\n\n        // softwareId=8: Robomongo product ID \n        QUrl url(\"https://updates.3t.io/check.php?os=\" + OS + \"&softwareId=8&softwareVersion=\" +\n                  QString(PROJECT_VERSION) + \"&licenseInfo=FREE&setup=\" + settings->anonymousID() + \n                  \"&dbVersionsConnected=\" + dbVersionsConnected + \"&notify=true#\");\n\n        _networkAccessManager->get(QNetworkRequest(url));\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/MainWindow.h",
    "content": "#pragma once\n\n#include <QMainWindow>\n#include <QSystemTrayIcon>\n\nQT_BEGIN_NAMESPACE\nclass QLabel;\nclass QToolBar;\nclass QDockWidget;\nclass QToolButton;\nclass QPushButton;\nclass QTreeWidgetItem;\nclass QNetworkReply;\nclass QNetworkAccessManager;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class ConnectionFailedEvent;\n    class ScriptExecutingEvent;\n    class ScriptExecutedEvent;\n    class OperationFailedEvent;\n\n    class QueryWidgetUpdatedEvent;\n    class WorkAreaTabWidget;\n    class ConnectionMenu;\n    class App;\n    class ExplorerWidget;\n    class WelcomeTab;\n\n    class MainWindow : public QMainWindow\n    {\n        Q_OBJECT\n\n    public:\n        typedef QMainWindow BaseClass;\n        MainWindow();\n\n        WelcomeTab* getWelcomeTab();\n        void showQueryWidgetProgressBar() const;\n        void hideQueryWidgetProgressBar() const;\n\n    public Q_SLOTS:\n        void manageConnections();\n        void toggleOrientation();\n        void enterTextMode();\n        void enterTreeMode();\n        void enterTableMode();\n        void enterCustomMode();\n        void toggleAutoExpand();\n        void toggleAutoExec();\n        void toggleLineNumbers();\n        void executeScript();\n        void stopScript();\n        void toggleFullScreen2();\n        void selectNextTab();\n        void selectPrevTab();\n        void duplicateTab();\n        void refreshConnections();\n        void aboutRobomongo();\n        void open();\n        void save();\n        void saveAs();\n        void changeStyle(QAction *);\n        void exit();\n\n        void setDefaultUuidEncoding();\n        void setJavaUuidEncoding();\n        void setCSharpUuidEncoding();\n        void setPythonUuidEncoding();\n        void setShellAutocompletionAll();\n        void setShellAutocompletionNoCollectionNames();\n        void setShellAutocompletionNone();\n        void setLoadMongoRcJs();\n        void setDisableConnectionShortcuts();\n\n        void toggleLogs(bool show);\n        void connectToServer(QAction *action);\n        void handle(ConnectionFailedEvent *event);\n        void handle(ScriptExecutingEvent *event);\n        void handle(ScriptExecutedEvent *event);\n        void handle(QueryWidgetUpdatedEvent *event);\n        void handle(OperationFailedEvent *event);\n\n    protected:\n        void keyPressEvent(QKeyEvent *event) override;\n        void closeEvent(QCloseEvent *event) override;\n        void hideEvent(QHideEvent *event) override;\n        void showEvent(QShowEvent *event) override;\n        bool eventFilter(QObject *target, QEvent *event) override;\n        void resizeEvent(QResizeEvent* event) override;\n        \n    private Q_SLOTS:\n        void updateMenus();\n        void setUtcTimeZone();\n        void setLocalTimeZone();\n        void openPreferences();\n        void openWelcomeTab();\n\n        void onConnectToolbarVisibilityChanged(bool isVisisble);\n        void onOpenSaveToolbarVisibilityChanged(bool isVisisble);\n        void onExecToolbarVisibilityChanged(bool isVisisble);\n        void onExplorerVisibilityChanged(bool isVisisble);\n        void on_tabChange();\n\n        void toggleMinimize();\n        void trayActivated(QSystemTrayIcon::ActivationReason reason);\n        void toggleMinimizeToTray();\n\n        // On application focus changes\n        void on_focusChanged();\n\n        void on_networkReply(QNetworkReply* reply);\n        void on_closeButton_clicked();\n        \n        void checkUpdates();\n        void toggleCheckUpdates();\n        void openShellTimeoutDialog();\n\n    private:\n        void updateConnectionsMenu();\n        void createDatabaseExplorer();\n        void createTabs();\n        void createStylesMenu();\n        void createStatusBar();\n        void restoreWindowSettings();\n        void saveWindowSettings() const;\n        void adjustUpdatesBarHeight();\n\n        QDockWidget *_logDock;\n\n        WorkAreaTabWidget *_workArea;\n\n        ExplorerWidget* _explorer;\n\n        App *_app;\n\n        ConnectionMenu *_connectionsMenu;\n        QToolButton *_connectButton;\n        QMenu *_viewMenu;\n        QMenu *_toolbarsMenu;\n        QAction *_connectAction;\n        // Open/Save tool bar\n        QAction *_openAction;\n        QAction *_saveAction;\n        QAction *_saveAsAction;\n        // Execution tool bar\n        QAction *_executeAction;\n        QAction *_stopAction;\n        QAction *_orientationAction;\n        QToolBar *_execToolBar;\n        QToolBar *_updateBar;\n        QLabel *_updateLabel;\n        QPushButton* _closeButton;\n\n        QNetworkAccessManager *_networkAccessManager;\n\n#if defined(Q_OS_WIN)\n        QSystemTrayIcon *_trayIcon;\n#endif\n\n        bool _allowExit;\n        bool _updateMenusAtStart = true;\n    };\n\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/AboutDialog.cpp",
    "content": "#include \"robomongo/gui/dialogs/AboutDialog.h\"\n\n#include <QDate>\n#include <QDialogButtonBox>\n#include <QGridLayout>\n#include <QLabel>\n#include <QPushButton>\n#include <QTabWidget>\n#include <QTextBrowser>\n#include <QFile>\n#include <Qsci/qsciglobal.h>\n\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace\n{\n    auto const YEAR  { QString::number(QDate::currentDate().year()) };\n    auto const MONTH { QString::number(QDate::currentDate().month()) };\n\n    const QString description {\n        \"<h3>\" PROJECT_NAME_TITLE \" \" PROJECT_VERSION \n            \" (Build \" BUILD_NUMBER + QString(\" - \") + MONTH + \"/\" + YEAR + \")</h3>\"\n        \"Shell-centric MongoDB management tool.<br/>\"\n        \"<a href=\\\"https://\" PROJECT_GITHUB_ISSUES \"\\\">Submit</a> issues/proposals on GitHub.<br/>\"\n        \"<br/>\"\n\n        \"<a href=\\\"https://\" PROJECT_DOMAIN \"\\\">\" PROJECT_DOMAIN \"</a> <br/>\"\n        \"Copyright 2014-\" + YEAR +\n        \" <a href= \" PROJECT_COMPANYNAME_DOMAIN \" >\" PROJECT_COMPANYNAME \n        \"</a>. All rights reserved.<br/>\"\n        \"<br/>\"\n\n        \"The program is provided AS IS with NO WARRANTY OF ANY KIND, \"\n        \"INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A \"\n        \"PARTICULAR PURPOSE.<br/>\"\n        \"<br>\"\n\n        \"<b>Dependencies: <br></b>\"\n        \"Mongo-Shell \" MongoDB_VERSION \"<br>\"\n        \"Qt \" PROJECT_QT_VERSION \"<br>\"\n        \"OpenSSL \" \t   OPENSSL_VERSION \"<br>\"\n        \"libssh2 \" \t   LIBSSH2_VERSION \"<br>\"\n        \"QJson \"   \t   QJSON_VERSION \"<br>\"\n        \"QScintilla \"  QSCINTILLA_VERSION_STR \"<br>\"\n        \"Google Test \" GOOGLE_TEST_VERSION \"<br>\"\n        \"ESPRIMA \"      ESPRIMA_VERSION \"<br>\"\n        \"<br>\"\n\n        \"<b>Credits: <br/></b>\"\n        \"Some icons are designed by Freepik <a href=https://www.flaticon.com>www.flaticon.com</a>\"\n        \"<br/>\"\n    };        \n}\n\nnamespace Robomongo\n{\n    AboutDialog::AboutDialog(QWidget *parent)\n        : QDialog(parent)\n    {\n        setWindowTitle(\"About \" PROJECT_NAME_TITLE);\n\n        //// About tab\n        auto aboutTab = new QWidget;\n        aboutTab->setWindowIcon(GuiRegistry::instance().mainWindowIcon());\n        aboutTab->setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);\n        auto layout = new QGridLayout(this);\n        layout->setSizeConstraint(QLayout::SetFixedSize);\n\n        auto copyRightLabel = new QLabel(description);\n        copyRightLabel->setWordWrap(true);\n        copyRightLabel->setOpenExternalLinks(true);\n        copyRightLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);\n\n        QIcon icon = GuiRegistry::instance().mainWindowIcon();\n        QPixmap iconPixmap = icon.pixmap(128, 128);\n\n        auto logoLabel = new QLabel;\n        logoLabel->setPixmap(iconPixmap);\n        layout->addWidget(logoLabel, 0, 0, 1, 1);\n        layout->addWidget(copyRightLabel, 0, 1, 4, 4);\n        aboutTab->setLayout(layout);\n\n        //// License Agreement tab\n        auto licenseTab = new QWidget;\n        auto textBrowser = new QTextBrowser;\n        textBrowser->setOpenExternalLinks(true);\n        textBrowser->setOpenLinks(true);\n        QFile file(\":gnu_gpl3_license.html\");\n        if (file.open(QFile::ReadOnly | QFile::Text))\n            textBrowser->setText(file.readAll());\n        \n        auto licenseTabLay = new QVBoxLayout;\n        licenseTabLay->addWidget(textBrowser);\n        licenseTab->setLayout(licenseTabLay);\n\n        //// Button box\n        auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Close);\n        QPushButton *closeButton = buttonBox->button(QDialogButtonBox::Close);\n        buttonBox->addButton(closeButton, QDialogButtonBox::ButtonRole(QDialogButtonBox::RejectRole |\n                                                                       QDialogButtonBox::AcceptRole));\n        VERIFY(connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())));\n\n        //// Main layout\n        auto tabWidget = new QTabWidget;\n        tabWidget->addTab(aboutTab, \"About\");\n        tabWidget->addTab(licenseTab, \"License Agreement\");\n\n        auto mainLayout = new QVBoxLayout;\n        mainLayout->addWidget(tabWidget);\n        mainLayout->addWidget(buttonBox);\n        setLayout(mainLayout);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/AboutDialog.h",
    "content": "#pragma  once\n\n#include <QDialog>\n\nnamespace Robomongo\n{\n    class AboutDialog : public QDialog\n    {\n        Q_OBJECT\n\n    public:\n        explicit AboutDialog(QWidget *parent);\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/ChangeShellTimeoutDialog.cpp",
    "content": "\n#include \"robomongo/gui/dialogs/ChangeShellTimeoutDialog.h\"\n\n#include <QDialog>\n#include <QDialogButtonBox>\n#include <QLineEdit>\n#include <QObject>\n#include <QLabel>\n#include <QGridLayout>\n#include <QIntValidator>\n\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/utils/Logger.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n\nnamespace Robomongo\n{\n    void changeShellTimeoutDialog()\n    {\n        auto changeShellTimeoutDialog = new QDialog;\n        auto settingsManager = AppRegistry::instance().settingsManager();\n        auto currentShellTimeout = new QLabel(QString::number(settingsManager->shellTimeoutSec()));\n        auto newShellTimeout = new QLineEdit;\n        newShellTimeout->setValidator(new QIntValidator(0, 100000));\n        auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Cancel);\n        QObject::connect(buttonBox, SIGNAL(accepted()), changeShellTimeoutDialog, SLOT(accept()));\n        QObject::connect(buttonBox, SIGNAL(rejected()), changeShellTimeoutDialog, SLOT(reject()));\n        auto lay = new QGridLayout;\n        auto firstLabel = new QLabel(\"Enter new value for Robo 3T shell timeout in seconds:\\n\");\n        lay->addWidget(firstLabel,                      0, 0, 1, 2, Qt::AlignLeft);\n        lay->addWidget(new QLabel(\"Current Value: \"),   1, 0);\n        lay->addWidget(currentShellTimeout,             1, 1);\n        lay->addWidget(new QLabel(\"New Value: \"),       2, 0);\n        lay->addWidget(newShellTimeout,                 2, 1);\n        lay->addWidget(buttonBox,                       3, 0, 1, 2, Qt::AlignRight);\n        changeShellTimeoutDialog->setLayout(lay);\n        changeShellTimeoutDialog->setWindowTitle(\"Robo 3T\");\n\n        if (changeShellTimeoutDialog->exec()) {\n            settingsManager->setShellTimeoutSec(newShellTimeout->text().toInt());\n            settingsManager->save();\n            auto subStr = settingsManager->shellTimeoutSec() > 1 ? \" seconds.\" : \" second.\";\n            LOG_MSG(\"Shell timeout value changed from \" + currentShellTimeout->text() + \" to \" +\n                QString::number(settingsManager->shellTimeoutSec()) + subStr, mongo::logger::LogSeverity::Info());\n\n            for (auto const& server : AppRegistry::instance().app()->getServers())\n                server->changeWorkerShellTimeout(std::abs(newShellTimeout->text().toInt()));\n        }\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/ChangeShellTimeoutDialog.h",
    "content": "#pragma once\n\nnamespace Robomongo\n{\n    void changeShellTimeoutDialog();\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/ConnectionAdvancedTab.cpp",
    "content": "#include \"robomongo/gui/dialogs/ConnectionAdvancedTab.h\"\n\n#include <QLabel>\n#include <QGridLayout>\n#include <QLineEdit>\n/* --- Disabling unfinished export URI connection string feature \n#include <QPushButton>\n#include <QMessageBox>\n#include <QClipboard>\n#include <QApplication>\n#include <QCheckBox>\n#include <QToolTip>\n*/\n\n#include <mongo/client/mongo_uri.h>\n\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n/* --- Disabling unfinished export URI connection string feature \n#include \"robomongo/core/settings/CredentialSettings.h\"\n#include \"robomongo/core/settings/ReplicaSetSettings.h\"\n#include \"robomongo/core/settings/SslSettings.h\"\n#include \"robomongo/gui/utils/GuiConstants.h\"\n*/\n\nnamespace Robomongo\n{\n\n    ConnectionAdvancedTab::ConnectionAdvancedTab(ConnectionSettings *settings) :\n        _settings(settings)\n    {\n        /* --- Disabling unfinished export URI connection string feature\n        _uriString = new QLineEdit;\n        _uriString->setReadOnly(true);\n\n        _includePasswordCheckBox = new QCheckBox(\"Include passwords\");\n        VERIFY(connect(_includePasswordCheckBox, SIGNAL(toggled(bool)),\n        this, SLOT(on_includePasswordsCheckBox_toggle(bool))));\n\n        auto generateButton = new QPushButton(\"Generate\");\n        generateButton->setFixedWidth(70);\n        generateButton->setMaximumHeight(HighDpiConstants::WIN_HIGH_DPI_BUTTON_HEIGHT);\n        VERIFY(connect(generateButton, SIGNAL(clicked()), this, SLOT(on_generateButton_clicked())));\n\n        _copyButton = new QPushButton(\"Copy\");\n        _copyButton->setFixedWidth(50);\n        _copyButton->setMaximumHeight(HighDpiConstants::WIN_HIGH_DPI_BUTTON_HEIGHT);\n        VERIFY(connect(_copyButton, SIGNAL(clicked()), this, SLOT(on_copyButton_clicked())));\n\n        auto hlay = new QHBoxLayout;\n        hlay->addWidget(_includePasswordCheckBox);\n        hlay->addWidget(generateButton, Qt::AlignLeft);\n        hlay->addWidget(_copyButton, Qt::AlignLeft);\n        */\n\n        auto defaultDatabaseDescriptionLabel = new QLabel(\n            \"Database, that will be default (<code>db</code> shell variable will point to this database). \"\n            \"By default, default database will be the one you authenticate on, or <code>test</code> otherwise. \"\n            \"Leave this field empty, if you want default behavior.\");\n        defaultDatabaseDescriptionLabel->setWordWrap(true);\n        defaultDatabaseDescriptionLabel->setContentsMargins(0, -2, 0, 20);\n        _defaultDatabaseName = new QLineEdit(QtUtils::toQString(_settings->defaultDatabase()));\n        auto defaultDbLabel = new QLabel(\"Default Database:\");\n#ifdef _WIN32\n        defaultDbLabel->setMaximumWidth(100); // Win\n#elif __APPLE__\n        defaultDbLabel->setMaximumWidth(110); // MacOS\n#else\n        defaultDbLabel->setMaximumWidth(140); // Linux\n#endif\n\n        auto mainLayout = new QGridLayout;\n        mainLayout->setAlignment(Qt::AlignTop);\n        mainLayout->addWidget(defaultDbLabel,                           1, 0);\n        mainLayout->addWidget(_defaultDatabaseName,                     1, 1, 1, 2);\n        mainLayout->addWidget(defaultDatabaseDescriptionLabel,          2, 1, 1, 2);\n        /* --- Disabling unfinished export URI connection string feature\n        mainLayout->addWidget(new QLabel{ \"URI Connection String:\" },   3, 0);\n        mainLayout->addWidget(_uriString,                               3, 1);\n        mainLayout->addLayout(hlay,                                     4, 1);\n        */\n        setLayout(mainLayout);\n    }\n\n    void ConnectionAdvancedTab::accept()\n    {\n        _settings->setDefaultDatabase(QtUtils::toStdString(_defaultDatabaseName->text()));\n    }\n\n    void ConnectionAdvancedTab::setDefaultDb(const QString& defaultDb)\n    {\n        _defaultDatabaseName->setText(defaultDb);\n    }\n\n    /* --- Disabling unfinished export URI connection string feature\n    void ConnectionAdvancedTab::on_generateButton_clicked()\n    {\n        if (_settings->isReplicaSet()) {\n            // todo: \n            // handle set name will be empty initially. It will be available(cached) after first\n            // successful connection.\n            std::string connStr = { \"mongodb://\" };\n\n            // todo: which credential to use if there are more than one?\n            if (_settings->hasEnabledPrimaryCredential() && !_settings->credentials().isEmpty()) {\n                connStr.append(_settings->primaryCredential()->userName() + \":\");\n                connStr.append(_includePasswordCheckBox->isChecked() ? \n                    _settings->primaryCredential()->userPassword() : \"PASSWORD\");\n                connStr.append(\"@\");\n            }\n\n            for (auto const& member : _settings->replicaSetSettings()->membersToHostAndPort()) {\n                connStr.append(member.toString() + \",\");\n            }\n            connStr.pop_back(); // delete last \",\"\n\n            connStr.append(\"/admin?\");\n\n            connStr.append(\"replicaSet=\" + _settings->replicaSetSettings()->setName());\n\n            if (_settings->sslSettings()->sslEnabled())\n                connStr.append(\"&ssl=true\");\n\n            if (_settings->hasEnabledPrimaryCredential() && !_settings->credentials().isEmpty())\n                connStr.append(\"&authSource=\" + _settings->primaryCredential()->databaseName());\n\n            // todo: validate connStr\n            _uriString->setText(QString::fromStdString(connStr));\n            _uriString->setCursorPosition(QTextCursor::Start);\n\n        }\n        else { // standalone server\n            mongo::HostAndPort server = _settings->hostAndPort();\n            mongo::ConnectionString connStr{ server };\n            auto str1 = connStr.toString();\n\n            auto uriWithStatus = mongo::StatusWith<mongo::MongoURI>(mongo::MongoURI::parse(connStr.toString()));\n            auto str2 = uriWithStatus.getValue().toString();\n\n            _uriString->setText(QString::fromStdString(\"mongodb://\" + str1 + \"/admin\"));\n            _uriString->setCursorPosition(QTextCursor::Start);\n        }\n    }\n\n    void ConnectionAdvancedTab::on_copyButton_clicked()\n    {\n        if (_uriString->text().isEmpty())\n            return;\n\n        QClipboard *clipboard = qApp->clipboard();\n        clipboard->setText(_uriString->text());\n\n        auto posUnderGenerateButton = QPoint(_copyButton->pos().x()-100, _copyButton->y()+20);\n        QToolTip::showText(mapToGlobal(posUnderGenerateButton), \"Copied into clipboard\", nullptr, QRect(), 2000);\n    }\n\n    void ConnectionAdvancedTab::on_includePasswordsCheckBox_toggle(bool checked)\n    {\n        if (_uriString->text().isEmpty())\n            return;\n\n        on_generateButton_clicked();\n    }\n    */\n}\n\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/ConnectionAdvancedTab.h",
    "content": "#pragma once\n\n#include <QWidget>\n\nQT_BEGIN_NAMESPACE\nclass QLineEdit;\nclass QCheckBox;\nclass QPushButton;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class ConnectionSettings;\n\n    class ConnectionAdvancedTab : public QWidget\n    {\n        Q_OBJECT\n\n    public:\n        ConnectionAdvancedTab(ConnectionSettings *settings);\n        void accept();\n        void setDefaultDb(const QString& defaultDb);\n\n    /* --- Disabling unfinished export URI connection string feature\n    private Q_SLOTS :\n        void on_generateButton_clicked();\n        void on_copyButton_clicked();\n        void on_includePasswordsCheckBox_toggle(bool checked);\n    */\n\n    private:\n        QLineEdit *_defaultDatabaseName;\n\n        /* --- Disabling unfinished export URI connection string feature\n        QLineEdit *_uriString;\n        QCheckBox *_includePasswordCheckBox;\n        QPushButton *_copyButton;\n        */\n\n        ConnectionSettings *_settings;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/ConnectionAuthTab.cpp",
    "content": "#include \"robomongo/gui/dialogs/ConnectionAuthTab.h\"\n\n#include <QGridLayout>\n#include <QLineEdit>\n#include <QLabel>\n#include <QCheckBox>\n#include <QPushButton>\n#include <QComboBox>\n\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/settings/CredentialSettings.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n\nnamespace Robomongo\n{\n    ConnectionAuthTab::ConnectionAuthTab(ConnectionSettings *settings) :\n        _settings(settings)\n    {\n        _useAuth = new QCheckBox(\"Perform authentication\");\n        _useAuth->setStyleSheet(\"margin-bottom: 7px\");\n        VERIFY(connect(_useAuth, SIGNAL(toggled(bool)), this, SLOT(authChecked(bool))));\n\n        _databaseNameDescriptionLabel = new QLabel(\n            \"<nobr>The admin database is unique in MongoDB.</nobr> Users with normal access \"\n            \"to the admin database have read and write access to <b>all \"\n            \"databases</b>.\"\n        );\n        _databaseNameDescriptionLabel->setWordWrap(true);\n\n        _userName = new QLineEdit();\n        _userNameLabel = new QLabel(\"User Name\");\n        _mechanismLabel = new QLabel(\"Auth Mechanism\");\n        _userPassword = new QLineEdit();\n        _userPassword->setEchoMode(QLineEdit::Password);\n        _userPasswordLabel = new QLabel(\"Password\");\n        _databaseName = new QLineEdit(\"admin\");\n        _databaseNameLabel = new QLabel(\"Database\");\n\n        _mechanismComboBox = new QComboBox;\n        _mechanismComboBox->addItem(\"SCRAM-SHA-1\");\n        _mechanismComboBox->addItem(\"SCRAM-SHA-256\");\n        _mechanismComboBox->addItem(\"MONGODB-CR\");\n\n        _manuallyVisibleDbs = new QLineEdit;\n        _manuallyVisibleDbs->setPlaceholderText(\"Comma-separated e.g. products, users\");\n        _manuallyVisibleDbsLabel = new QLabel(\"Databases\");\n        _manuallyVisibleDbsInfo = new QLabel(\n            \"Some MongoDB users might not have the permission to get the list of\"\n            \" database names (<b>listDatabases</b> command). For this case, manually add\"\n            \" the name of the database(s) that this user has access to.\"\n        );\n        _manuallyVisibleDbsInfo->setWordWrap(true);\n\n        _useManuallyVisibleDbs = new QCheckBox(\"Manually specify visible databases\");\n        _useManuallyVisibleDbs->setStyleSheet(\"margin-bottom: 7px\");\n        VERIFY(connect(_useManuallyVisibleDbs, SIGNAL(toggled(bool)), \n                       this, SLOT(useManuallyVisibleDbsChecked(bool))));\n\n        _echoModeButton = new QPushButton;\n        _echoModeButton->setIcon(GuiRegistry::instance().hideIcon());\n#ifdef Q_OS_MAC\n        _echoModeButton->setMaximumWidth(50);\n#else\n        _echoModeButton->setMinimumWidth(50);\n#endif\n        // Attempt to fix the issue for Windows High DPI button height is slightly taller than other widgets \n#ifdef Q_OS_WIN\n        _echoModeButton->setMaximumHeight(HighDpiConstants::WIN_HIGH_DPI_BUTTON_HEIGHT);\n#endif\n        VERIFY(connect(_echoModeButton, SIGNAL(clicked()), this, SLOT(toggleEchoMode())));\n\n        _useAuth->setChecked(_settings->hasEnabledPrimaryCredential());\n        authChecked(_settings->hasEnabledPrimaryCredential());\n\n        if (_settings->credentialCount() > 0) {\n            CredentialSettings *primaryCredential = _settings->primaryCredential();\n            _userName->setText(QtUtils::toQString(primaryCredential->userName()));\n            _userPassword->setText(QtUtils::toQString(primaryCredential->userPassword()));\n            _databaseName->setText(QtUtils::toQString(primaryCredential->databaseName()));\n            _mechanismComboBox->setCurrentText(QtUtils::toQString(primaryCredential->mechanism()));\n            _useManuallyVisibleDbs->setChecked(_settings->primaryCredential()->useManuallyVisibleDbs());\n            _manuallyVisibleDbs->setText(QtUtils::toQString(primaryCredential->manuallyVisibleDbs()));\n        }\n        useManuallyVisibleDbsChecked(_useManuallyVisibleDbs->isChecked());\n\n        auto horline = new QFrame;\n        horline->setFrameShape(QFrame::HLine);\n        horline->setFrameShadow(QFrame::Sunken);\n\n        auto verSpacer { new QSpacerItem(0, 80, QSizePolicy::Minimum, QSizePolicy::Expanding) };\n\n        auto authLayout = new QGridLayout;\n        authLayout->addWidget(_useAuth,                      0, 0, 1, 3);\n        authLayout->addWidget(_databaseNameLabel,            1, 0);\n        authLayout->addWidget(_databaseName,                 1, 1, 1, 2);\n        authLayout->addWidget(_databaseNameDescriptionLabel, 2, 1, 1, 2);\n        authLayout->addWidget(new QLabel,                    3, 0);\n        authLayout->addWidget(_userNameLabel,                4, 0);\n        authLayout->addWidget(_userName,                     4, 1, 1, 2);\n        authLayout->addWidget(_userPasswordLabel,            5, 0);\n        authLayout->addWidget(_userPassword,                 5, 1);\n        authLayout->addWidget(_echoModeButton,               5, 2);\n        authLayout->addWidget(_mechanismLabel,               6, 0);\n        authLayout->addWidget(_mechanismComboBox,            6, 1, 1, 2);\n        authLayout->addWidget(new QLabel,                    7, 0);\n        authLayout->addWidget(horline,                       8, 0, 1, 3);\n        authLayout->addWidget(_useManuallyVisibleDbs,        9, 0, 1, 3);\n        authLayout->addWidget(_manuallyVisibleDbsLabel,     10, 0);\n        authLayout->addWidget(_manuallyVisibleDbs,          10, 1, 1, 2);\n        authLayout->addWidget(_manuallyVisibleDbsInfo,      11, 1, 1, 2);        \n        authLayout->addItem(verSpacer,                      12, 0, 1, 3); \n        \n        authLayout->setAlignment(Qt::AlignTop);\n        setLayout(authLayout);\n    }\n\n    void ConnectionAuthTab::accept()\n    {\n        _settings->clearCredentials();\n\n        // If all fields is empty - do nothing\n        if (_userName->text().isEmpty()     &&\n            _userPassword->text().isEmpty() &&\n            _databaseName->text().isEmpty())\n            return;       \n        \n        auto credential { new CredentialSettings };\n        credential->setEnabled(_useAuth->isChecked());\n        credential->setUserName(QtUtils::toStdString(_userName->text()));\n        credential->setUserPassword(QtUtils::toStdString(_userPassword->text()));\n        credential->setDatabaseName(QtUtils::toStdString(_databaseName->text()));\n        credential->setMechanism(QtUtils::toStdString(_mechanismComboBox->currentText()));\n        credential->setUseManuallyVisibleDbs(\n            _useManuallyVisibleDbs->isChecked() && !_manuallyVisibleDbs->text().isEmpty()\n        );\n        credential->setManuallyVisibleDbs(\n            _manuallyVisibleDbs->text().simplified().replace(' ', \"\").toStdString()\n        );\n        _settings->addCredential(credential);\n    }\n\n    void ConnectionAuthTab::setAuthTab(\n        QString const db, \n        QString const username, \n        QString const pwd, \n        AuthMechanism authMech\n    ) {    \n        _useAuth->setChecked(true);\n        _databaseName->setText(db);\n        _userName->setText(username);\n        _userPassword->setText(pwd);\n        _mechanismComboBox->setCurrentIndex(int(authMech));\n    }\n\n    void ConnectionAuthTab::clearTab()\n    {\n        _useAuth->setChecked(false);\n        _databaseName->clear();\n        _userName->clear();\n        _userPassword->clear();\n        _mechanismComboBox->setCurrentIndex(0);\n        _useManuallyVisibleDbs->setChecked(false);\n        _manuallyVisibleDbs->clear();        \n    }\n\n    void ConnectionAuthTab::toggleEchoMode()\n    {\n        bool isPassword = _userPassword->echoMode() == QLineEdit::Password;\n        _userPassword->setEchoMode(isPassword ? QLineEdit::Normal: QLineEdit::Password);\n        _echoModeButton->setIcon(isPassword ? GuiRegistry::instance().showIcon() : GuiRegistry::instance().hideIcon());\n    }\n\n    void ConnectionAuthTab::authChecked(bool checked)\n    {\n        _databaseName->setEnabled(checked);\n        _databaseNameLabel->setEnabled(checked);\n        _databaseNameDescriptionLabel->setEnabled(checked);\n        _userName->setEnabled(checked);\n        _userNameLabel->setEnabled(checked);\n        _userPassword->setEnabled(checked);\n        _userPasswordLabel->setEnabled(checked);\n        _echoModeButton->setEnabled(checked);\n        _mechanismLabel->setEnabled(checked);\n        _mechanismComboBox->setEnabled(checked);\n        _useManuallyVisibleDbs->setEnabled(checked);\n        _manuallyVisibleDbs->setEnabled(checked);\n        _manuallyVisibleDbsLabel->setEnabled(checked);\n        _manuallyVisibleDbsInfo->setEnabled(checked);\n\n        if (checked)\n            _databaseName->setFocus();\n    }\n    void ConnectionAuthTab::useManuallyVisibleDbsChecked(bool checked)\n    {\n        _manuallyVisibleDbs->setVisible(checked);\n        _manuallyVisibleDbsLabel->setVisible(checked);\n        _manuallyVisibleDbsInfo->setVisible(checked);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/ConnectionAuthTab.h",
    "content": "#pragma once\n\n#include <QWidget>\n\n#include \"robomongo/gui/utils/GuiConstants.h\"\n\nQT_BEGIN_NAMESPACE\nclass QLineEdit;\nclass QLabel;\nclass QCheckBox;\nclass QPushButton;\nclass QComboBox;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class ConnectionSettings;\n\n    class ConnectionAuthTab : public QWidget\n    {\n        Q_OBJECT\n\n    public:\n        ConnectionAuthTab(ConnectionSettings *settings);\n        void accept();\n        void setAuthTab(\n            QString const db, \n            QString const username, \n            QString const pwd, \n            AuthMechanism authMech\n        );\n        void clearTab();\n\n    private Q_SLOTS:\n        void toggleEchoMode();\n        void authChecked(bool checked);\n        void useManuallyVisibleDbsChecked(bool checked);\n\n    private:\n        QLineEdit *_userName;\n        QLabel    *_userNameLabel;\n        QLineEdit *_userPassword;\n        QLabel    *_userPasswordLabel;\n        QLineEdit *_databaseName;\n        QLabel    *_databaseNameLabel;\n        QLabel    *_databaseNameDescriptionLabel;\n        QCheckBox *_useAuth;\n        QPushButton *_echoModeButton;\n        QLabel    *_mechanismLabel;\n        QComboBox *_mechanismComboBox;\n        QCheckBox *_useManuallyVisibleDbs;\n        QLineEdit *_manuallyVisibleDbs;\n        QLabel    *_manuallyVisibleDbsLabel;\n        QLabel    *_manuallyVisibleDbsInfo;\n\n        ConnectionSettings *const _settings;        \n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/ConnectionBasicTab.cpp",
    "content": "﻿#include \"robomongo/gui/dialogs/ConnectionBasicTab.h\"\n\n#include <QLabel>\n#include <QLineEdit>\n#include <QGridLayout>\n#include <QRegExpValidator>\n#include <QCheckBox>\n#include <QPushButton>\n#include <QFileDialog>\n#include <QComboBox>\n#include <QTreeWidget>\n#include <QTreeWidgetItem>\n#include <QMessageBox>\n#include <QDialogButtonBox>\n#include <QApplication>\n#include <QDesktopWidget>\n\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/settings/ReplicaSetSettings.h\"\n#include \"robomongo/gui/dialogs/ConnectionDialog.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/utils/GuiConstants.h\"\n\n#include \"mongo/client/mongo_uri.h\"\n\nnamespace Robomongo\n{\n    ConnectionBasicTab::ConnectionBasicTab(ConnectionSettings *settings, ConnectionDialog *connectionDialog) :\n        _settings(settings), _connectionDialog(connectionDialog)\n    {\n        _typeLabel = new QLabel(\"Type:\");\n        _connectionType = new QComboBox;\n        _connectionType->addItem(tr(\"Direct Connection\"));\n        _connectionType->addItem(tr(\"Replica Set\")); \n        _connectionType->setCurrentIndex(static_cast<int>(_settings->isReplicaSet()));\n        VERIFY(connect(_connectionType, SIGNAL(currentIndexChanged(int)), \n                        this, SLOT(on_ConnectionTypeChange(int)))\n        );\n        \n        _nameLabel = new QLabel(\"Name:\"); \n        _connectionName = new QLineEdit(QtUtils::toQString(_settings->connectionName()));\n        _connInfoLabel = new QLabel(\"Choose any connection name that will help you to identify this connection.\");\n        _connInfoLabel->setWordWrap(true);\n\n        _addressLabel = new QLabel(\"Address:\");\n        _serverAddress = new QLineEdit(QtUtils::toQString(_settings->serverHost()));\n        _colon = new QLabel(\":\");\n        _serverPort = new QLineEdit(QString::number(_settings->serverPort()));\n        _serverPort->setFixedWidth(80);\n        QRegExp rx(\"\\\\d+\"); //(0-65554)\n        _serverPort->setValidator(new QRegExpValidator(rx, this)); \n        _addInfoLabel = new QLabel(\"Specify host and port of MongoDB server. Host can be either IPv4, IPv6 or domain name.\");\n        _addInfoLabel->setWordWrap(true);\n\n        _membersLabel = new QLabel(\"Members:\");\n        _membersLabel->setFixedWidth(_membersLabel->sizeHint().width());\n        _members = new QTreeWidget;\n        _members->setHeaderHidden(true);\n        _members->setIndentation(0);\n#ifdef _WIN32\n        auto lineHeight = _members->fontMetrics().height();\n        _members->setFixedHeight(lineHeight * 8);\n#endif\n        VERIFY(connect(_members, SIGNAL(itemChanged(QTreeWidgetItem*, int)), \n                       this, SLOT(on_replicaMemberItemEdit(QTreeWidgetItem*, int))));\n\n        if (_settings->isReplicaSet() && _settings->replicaSetSettings()->members().size() > 0) {\n            for (const std::string& str : _settings->replicaSetSettings()->members()) {\n                if (!str.empty()) {\n                    auto item = new QTreeWidgetItem;\n                    item->setText(0, QString::fromStdString(str));\n                    item->setFlags(item->flags() | Qt::ItemIsEditable);\n                    _members->addTopLevelItem(item);\n                }\n            }\n            // To fix strange MAC alignment issue\n#ifdef __APPLE__\n            auto lineHeight = _members->fontMetrics().height();\n            _members->setFixedHeight(lineHeight * 8);\n#endif\n        }\n        else {  // No members\n            auto item = new QTreeWidgetItem;\n            item->setText(0, \"localhost:27017\");\n            item->setFlags(item->flags() | Qt::ItemIsEditable);\n            _members->addTopLevelItem(item);\n        }\n\n        int const BUTTON_SIZE = 60;\n        _addButton = new QPushButton;\n        _addButton->setIcon(GuiRegistry::instance().plusIcon());\n        _removeButton = new QPushButton;\n        _removeButton->setIcon(GuiRegistry::instance().minusIcon());\n        VERIFY(connect(_addButton, SIGNAL(clicked()), this, SLOT(on_addButton_clicked())));\n        VERIFY(connect(_removeButton, SIGNAL(clicked()), this, SLOT(on_removeButton_clicked())));\n\n        _minusPlusButtonBox = new QDialogButtonBox(this);\n        _minusPlusButtonBox->setOrientation(Qt::Horizontal);\n#ifdef _WIN32\n        _minusPlusButtonBox->addButton(_addButton, QDialogButtonBox::NoRole);\n        _minusPlusButtonBox->addButton(_removeButton, QDialogButtonBox::NoRole);\n#else\n        _minusPlusButtonBox->addButton(_removeButton, QDialogButtonBox::NoRole);\n        _minusPlusButtonBox->addButton(_addButton, QDialogButtonBox::NoRole);\n#endif\n        _setNameLabel = new QLabel(\"Set Name:\");\n        _setNameEdit = new QLineEdit(QString::fromStdString(_settings->replicaSetSettings()->setNameUserEntered()));\n\n        auto fakeSpacer = new QLabel(\"\");\n        auto hline = new QFrame();\n        hline->setFrameShape(QFrame::HLine);\n        hline->setFrameShadow(QFrame::Sunken);\n        _uriEdit = new QLineEdit();\n        _uriEdit->setPlaceholderText(\"Import connection details from MongoDB URI connection string\");\n        _uriButton = new QPushButton(\"From URI\");\n#ifdef _WIN32\n        _uriButton->setMaximumHeight(HighDpiConstants::WIN_HIGH_DPI_BUTTON_HEIGHT);\n        _uriButton->setMinimumWidth(60);\n#else   // MacOS\n        _uriButton->setMaximumHeight(HighDpiConstants::MACOS_HIGH_DPI_BUTTON_HEIGHT);   \n        _uriButton->setMaximumWidth(90);\n#endif        \n        VERIFY(connect(_uriButton, SIGNAL(clicked()), this, SLOT(on_uriButton_clicked())));\n\n        auto connLayout = new QGridLayout;\n        connLayout->setVerticalSpacing(8);\n        connLayout->setAlignment(Qt::AlignTop);\n        connLayout->addWidget(_typeLabel,                     1, 0);\n        connLayout->addWidget(_connectionType,                1, 1, 1, 3);\n        connLayout->addWidget(_nameLabel,                     3, 0);\n        connLayout->addWidget(_connectionName,                3, 1, 1, 3);\n        connLayout->addWidget(_addressLabel,                  5, 0);\n        connLayout->addWidget(_serverAddress,                 5, 1);\n        connLayout->addWidget(_colon,                         5, 2);\n        connLayout->addWidget(_serverPort,                    5, 3);\n        connLayout->addWidget(_addInfoLabel,                  6, 1, 1, 3);\n        connLayout->addWidget(_membersLabel,                  7, 0, Qt::AlignTop);\n        connLayout->addWidget(_members,                       7, 1, 1, 3);\n        connLayout->addWidget(_minusPlusButtonBox,            8, 3, Qt::AlignRight | Qt::AlignTop);\n        connLayout->addWidget(_setNameLabel,                  9, 0);\n        connLayout->addWidget(_setNameEdit,                   9, 1, 1, 3, Qt::AlignTop);\n        connLayout->addWidget(fakeSpacer,                    10, 0);\n        connLayout->addWidget(hline,                         11, 0, 1, 4);\n        connLayout->addWidget(_uriButton,                    13, 0);\n        connLayout->addWidget(_uriEdit,                      13, 1, 1, 3);\n\n        connLayout->setRowStretch(10, 1);        \n#ifdef __APPLE__\n        connLayout->setRowMinimumHeight(11, 20);\n#endif\n\n        auto mainLayout = new QVBoxLayout;\n        mainLayout->addLayout(connLayout);\n        setLayout(mainLayout);\n#ifdef __APPLE__\n        mainLayout->setContentsMargins(-1, -1, -1, 10);\n#endif\n\n        _connectionName->setFocus();\n        on_ConnectionTypeChange(_connectionType->currentIndex());        \n    }\n\n    bool ConnectionBasicTab::accept()\n    {\n        _settings->setReplicaSet(static_cast<bool>(_connectionType->currentIndex()));\n        _settings->setConnectionName(QtUtils::toStdString(_connectionName->text()));\n\n        if (_settings->isReplicaSet() && _members->topLevelItemCount() == 0) {\n            QMessageBox::critical(this, \"Error\", \"Replica set members cannot be empty. \"  \n                                                 \"Please enter at least one member.\");\n            return false;\n        }\n        \n        // Check and warn if there is duplicate member or \n        // if any of the replica set member items does not contain \":\" character between hostname and port.\n        if (_settings->isReplicaSet() && _members->topLevelItemCount() > 1) {\n            QStringList members;\n            for (int i = 0; i < _members->topLevelItemCount(); ++i) {\n                QTreeWidgetItem const* item = _members->topLevelItem(i);\n                QStringList const hostAndPort = item->text(0).split(\":\");\n                if (hostAndPort.size() < 2) {\n                    QMessageBox::critical(this, \"Error\", \"Replica set member items must all contain ':' between\"\n                                                \" hostname and port.\");\n                    return false;\n                }\n                if (!item->text(0).isEmpty()) \n                    members.push_back(item->text(0));\n            }\n            if (members.size() > 1) {\n                if (members.removeDuplicates() > 0) {\n                    QMessageBox::critical(this, \"Error\", \"Please remove duplicate member, two replica\"\n                                                \" set members cannot have the same hostname and port.\");\n                    return false;\n                }\n            }\n        }\n\n        // Save to settings\n        if (_settings->isReplicaSet() && _members->topLevelItemCount() > 0) {\n            QStringList const hostAndPort = _members->topLevelItem(0)->text(0).split(\":\");\n            _settings->setServerHost(hostAndPort[0].toStdString());\n            _settings->setServerPort(hostAndPort[1].toInt());\n        }\n        else {  // Single server\n            _settings->setServerHost(QtUtils::toStdString(_serverAddress->text()));\n            _settings->setServerPort(_serverPort->text().toInt());\n        }\n\n        if (_settings->isReplicaSet()) {\n            // Save replica members\n            std::vector<std::string> members;\n            for (int i = 0; i < _members->topLevelItemCount(); ++i)\n            {\n                QTreeWidgetItem const* item = _members->topLevelItem(i);\n                if (!item->text(0).isEmpty()) \n                    members.push_back(item->text(0).toStdString());\n            }\n            _settings->replicaSetSettings()->setMembers(members);\n            _settings->replicaSetSettings()->setSetNameUserEntered(_setNameEdit->text().toStdString());\n            // Clear cached set name\n            _settings->replicaSetSettings()->setCachedSetName(\"\");\n        }\n\n        return true;\n    }\n\n    void ConnectionBasicTab::clearTab()\n    {\n        _connectionType->setCurrentIndex(0);\n        _connectionName->setText(\"New Connection\");\n        _serverAddress->clear();\n        _serverPort->clear();\n        _members->clear();\n        _setNameEdit->clear();\n    }\n\n    void ConnectionBasicTab::on_ConnectionTypeChange(int index)\n    {\n        bool const isReplica = static_cast<bool>(index);\n\n        _connectionDialog->toggleSshSupport(isReplica);\n        \n        // Replica set\n        _membersLabel->setVisible(isReplica);\n        _members->setVisible(isReplica);\n        _minusPlusButtonBox->setVisible(isReplica);\n        _setNameLabel->setVisible(isReplica);\n        _setNameEdit->setVisible(isReplica);\n            \n        // Direct Connection\n        _addressLabel->setVisible(!isReplica);\n        _serverAddress->setVisible(!isReplica);\n        _serverPort->setVisible(!isReplica);\n        _colon->setVisible(!isReplica);\n        _addInfoLabel->setVisible(!isReplica);\n    }\n\n    void ConnectionBasicTab::deleteItem()\n    {\n        delete _members->currentItem(); // todo: refactor\n    }\n\n    void ConnectionBasicTab::on_addButton_clicked()\n    {\n        auto item = new QTreeWidgetItem;\n\n        // Make member addition little smarter than expected\n        if (_members->topLevelItemCount() < 1) {\n            item->setText(0, \"localhost:27017\");\n        }\n        else {  // Add the next member using last entered hostname and incremented port by one\n            QString const& lastMember = _members->topLevelItem(_members->topLevelItemCount()-1)->text(0);\n            QStringList const& hostAndPort = lastMember.split(':');\n            if (hostAndPort.size() == 2) {  \n                auto const& hostName = hostAndPort[0];\n                auto const& port = hostAndPort[1].toInt();\n                item->setText(0, hostName + ':' + QString::number(port + 1));\n            }\n            else {  \n                item->setText(0, \"localhost:\" + QString::number(_members->topLevelItemCount() + 27017));\n            }\n        }\n\n        item->setFlags(item->flags() | Qt::ItemIsEditable);\n        _members->addTopLevelItem(item);\n    }\n\n    void ConnectionBasicTab::on_removeButton_clicked()\n    {\n        if (_members->topLevelItemCount() <= 0)\n            return;\n\n        if (_members->currentItem()) \n            delete _members->currentItem();\n        else\n            delete _members->topLevelItem(_members->topLevelItemCount() - 1);\n    }\n\n    void ConnectionBasicTab::on_replicaMemberItemEdit(QTreeWidgetItem* item, int column)\n    {\n        if (!item)\n            return;\n\n        auto str = item->text(0);\n\n        // Remove white spaces\n        str = str.simplified();\n        str.remove(\" \");\n\n        // Remove item from tree widget if it has empty text\n        if (str.isEmpty()) {\n            delete item;\n            return;\n        }\n\n        // Force port as integer\n        QStringList const& hostAndPort = str.split(':');\n        if (hostAndPort.size() >= 2) {\n            auto const& hostName = hostAndPort[0];\n            auto portStr = hostAndPort[1];\n            portStr.remove(QRegExp(\"[^\\\\d]\"));\n            str = hostName + ':' + QString::number(portStr.toInt());\n        }\n        else \n            str += \":27017\";\n\n        item->setText(0, str);\n    }\n\n    void ConnectionBasicTab::on_uriButton_clicked()\n    {\n        // Parse Mongo URI\n        QString uriStr = _uriEdit->text().simplified();\n        uriStr.replace(\" \", \"\");\n        auto const statusWithURI = mongo::MongoURI::parse(uriStr.toStdString());\n        if (!statusWithURI.isOK()) {\n            QMessageBox errorBox;\n            errorBox.critical(\n                this, \"Error\", (\"MongoDB URI:\\n\" + statusWithURI.getStatus().toString()).c_str()\n            );\n            errorBox.show();\n            return;\n        }\n        auto const mongoUri = statusWithURI.getValue();\n\n        // Clear tabs\n        clearTab();\n        _connectionDialog->clearConnAuthTab();\n        _connectionDialog->clearSslTab();\n\n        // Set Basic (this) Tab\n        auto const isReplicaSet = mongoUri.type() == mongo::ConnectionString::ConnectionType::SET;\n        if(isReplicaSet) {\n            _connectionType->setCurrentIndex(1);    // Switch to Replica Set\n            for (auto const& hostAndPort : mongoUri.getServers()) {\n                auto host = QString::fromStdString(hostAndPort.host());\n                host.endsWith('.') ? host.remove(host.size()-1, 1) : \"no-op\";\n                auto const newHostAndPort = host + ':' + QString::number(hostAndPort.port());\n                auto item = new QTreeWidgetItem;\n                item->setText(0, newHostAndPort);\n                item->setFlags(item->flags() | Qt::ItemIsEditable);\n                _members->addTopLevelItem(item);\n            }\n            _setNameEdit->setText(QString::fromStdString(mongoUri.getSetName()));\n        }\n        else {  // Standalone\n            _connectionType->setCurrentIndex(0);\n            _serverAddress->setText(QString::fromStdString(mongoUri.getServers()[0].host()));\n            _serverPort->setText(QString::number(mongoUri.getServers()[0].port()));\n        }\n        // Set Auth Tab\n        auto const user = QString::fromStdString(mongoUri.getUser());\n        auto const pwd = QString::fromStdString(mongoUri.getPassword());\n        auto const authDb = QString::fromStdString(mongoUri.getAuthenticationDatabase());\n        auto const authMechanism = mongoUri.getOption(\"authMechanism\").get_value_or(\"\");\n        if(!user.isEmpty()) _connectionDialog->setAuthTab(\n            authDb, user, pwd, authMechanismFromStr(authMechanism)\n        );\n        // Set SSL Tab\n        if(mongoUri.getSSLMode() == mongo::transport::ConnectSSLMode::kEnableSSL) {\n            auto tlsAllowInvalidCertificates = mongoUri.getOption(\"tlsAllowInvalidCertificates\");\n            int const authMethodIndex = tlsAllowInvalidCertificates.get_value_or(\"\") == \"true\" ? 0 : 1;\n            auto const caFile = mongoUri.getOption(\"tlsCAFile\").get_value_or(\"\");\n            auto const certKeyFile = mongoUri.getOption(\"tlsCertificateKeyFile\").get_value_or(\"\");\n            auto const certKeyFilePwd = \n                mongoUri.getOption(\"tlsCertificateKeyFilePassword\").get_value_or(\"\");\n            auto const allowInvalidHostnames = \n                mongoUri.getOption(\"tlsAllowInvalidHostnames\").get_value_or(\"\") == \"true\";\n\n            _connectionDialog->setSslTab(\n                authMethodIndex, allowInvalidHostnames, caFile, certKeyFile, certKeyFilePwd\n            );\n        }\n        // Advanced Tab\n        _connectionDialog->setDefaultDb(QString::fromStdString(mongoUri.getDatabase()));\n    }\n}"
  },
  {
    "path": "src/robomongo/gui/dialogs/ConnectionBasicTab.h",
    "content": "#pragma once\n\n#include <QWidget>\nQT_BEGIN_NAMESPACE\nclass QLineEdit;\nclass QLabel;\nclass QCheckBox;\nclass QPushButton;\nclass QComboBox;\nclass QTreeWidget;\nclass QTreeWidgetItem;\nclass QDialogButtonBox;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class ConnectionSettings;\n    class ConnectionDialog;\n\n    class ConnectionBasicTab : public QWidget\n    {\n        Q_OBJECT\n\n    public:\n        ConnectionBasicTab(ConnectionSettings *settings, ConnectionDialog *connectionDialog);\n        bool accept();\n        void clearTab();\n\n    private Q_SLOTS:\n        void on_ConnectionTypeChange(int index);\n        void deleteItem();\n        void on_addButton_clicked();\n        void on_removeButton_clicked();\n        void on_replicaMemberItemEdit(QTreeWidgetItem* item, int column);\n        void on_uriButton_clicked();\n\n    private:\n        QLabel *_typeLabel;\n        QComboBox *_connectionType;\n        QLabel *_nameLabel;\n        QLineEdit *_connectionName;\n        QLabel *_connInfoLabel;\n        QLabel *_addressLabel;\n        QLineEdit *_serverAddress;\n        QLabel *_colon;\n        QLineEdit *_serverPort;\n        QLabel *_addInfoLabel;\n        QLabel *_membersLabel;\n        QTreeWidget *_members;\n        QPushButton *_addButton;\n        QPushButton *_removeButton;\n        QDialogButtonBox *_minusPlusButtonBox;\n        QLabel *_setNameLabel;\n        QLineEdit *_setNameEdit;\n        QLineEdit *_uriEdit;\n        QPushButton *_uriButton;\n        QPushButton *_discoverButton;\n        QLabel *_readPrefLabel;\n        QComboBox *_readPreference;\n\n        ConnectionSettings *const _settings;\n        ConnectionDialog *_connectionDialog;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/ConnectionDiagnosticDialog.cpp",
    "content": "#include \"robomongo/gui/dialogs/ConnectionDiagnosticDialog.h\"\n\n#include <QGridLayout>\n#include <QApplication>\n#include <QLabel>\n#include <QPushButton>\n#include <QMovie>\n#include <QMessageBox>\n\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/settings/CredentialSettings.h\"\n#include \"robomongo/core/settings/SshSettings.h\"\n#include \"robomongo/core/settings/SslSettings.h\"\n#include \"robomongo/core/settings/ReplicaSetSettings.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/EventBus.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/mongodb/SshTunnelWorker.h\"\n\nnamespace Robomongo\n{\n    ConnectionDiagnosticDialog::ConnectionDiagnosticDialog(ConnectionSettings *connection, QWidget *parent) :\n        QDialog(parent),\n        _connSettings(connection->clone()),\n        _server(NULL),\n        _serverHandle(0),\n        _continueExec(true)\n    {\n        AppRegistry::instance().bus()->subscribe(this, ConnectionEstablishedEvent::Type);\n        AppRegistry::instance().bus()->subscribe(this, ConnectionFailedEvent::Type);\n\n        setWindowTitle(\"Diagnostic\");\n        setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); // Remove help button (?)\n\n        _yesIcon = GuiRegistry::instance().yesMarkIcon();\n        _noIcon = GuiRegistry::instance().noMarkIcon();\n        _questionIcon = GuiRegistry::instance().questionMarkIcon();\n        _yesPixmap = _yesIcon.pixmap(20, 20);\n        _noPixmap = _noIcon.pixmap(20, 20);\n        _questionPixmap = _questionIcon.pixmap(20, 20);\n\n        QPushButton *closeButton = new QPushButton(\"&Close\");\n        VERIFY(connect(closeButton, SIGNAL(clicked()), this, SLOT(accept())));\n        _connectionIconLabel = new QLabel;\n        _connectionLabel = new QLabel;\n        _authIconLabel = new QLabel;\n        _authLabel = new QLabel;\n        _sshIconLabel = new QLabel;\n        _sshLabel = new QLabel;\n        _listIconLabel = new QLabel;\n        _listLabel = new QLabel;\n\n        _viewErrorLink = new QLabel(\"<a href='error' style='color: #777777;'>Show error details</a>\");\n        VERIFY(connect(_viewErrorLink, SIGNAL(linkActivated(QString)), this, SLOT(errorLinkActivated(QString))));\n\n        _loadingMovie = new QMovie(\":robomongo/icons/loading_ticks_40x40.gif\", QByteArray(), this);\n        _loadingMovie->setScaledSize(QSize(20, 20));\n        _loadingMovie->start();\n\n        _connectionIconLabel->setMovie(_loadingMovie);\n        _sshIconLabel->setMovie(_loadingMovie);\n        _authIconLabel->setMovie(_loadingMovie);\n        _listIconLabel->setMovie(_loadingMovie);\n\n        QGridLayout *layout = new QGridLayout();\n        layout->setContentsMargins(20, 20, 20, 10);\n        layout->addWidget(_sshIconLabel,        0, 0);\n        layout->addWidget(_sshLabel,            0, 1, Qt::AlignLeft);\n        layout->addWidget(_connectionIconLabel, 1, 0);\n        layout->addWidget(_connectionLabel,     1, 1, Qt::AlignLeft);\n        layout->addWidget(_authIconLabel,       2, 0);\n        layout->addWidget(_authLabel,           2, 1, Qt::AlignLeft);\n        layout->addWidget(_listIconLabel,       3, 0);\n        layout->addWidget(_listLabel,           3, 1, Qt::AlignLeft);\n        layout->setColumnStretch(0, 0) ; // Give column 0 no stretch ability\n        layout->setColumnStretch(1, 1) ; // Give column 1 stretch ability of ratio 1\n\n        QHBoxLayout *hbox = new QHBoxLayout;\n        hbox->addSpacing(21);\n        hbox->addWidget(_viewErrorLink, 1, Qt::AlignLeft);\n        hbox->addWidget(closeButton, 0, Qt::AlignRight);\n\n        QVBoxLayout *box = new QVBoxLayout;\n        box->addLayout(layout);\n        box->addSpacing(10);\n        box->addLayout(hbox);\n        setLayout(box);\n\n        sshStatus(InitialState);\n        connectionStatus(InitialState);\n        authStatus(InitialState);\n        listStatus(InitialState);\n\n        _viewErrorLink->hide();\n\n        if (!AppRegistry::instance().app()->openServer(_connSettings, ConnectionTest)) {\n            _continueExec = false;\n            return;\n        }\n\n        _serverHandle = AppRegistry::instance().app()->getLastServerHandle();\n    }\n\n    ConnectionDiagnosticDialog::~ConnectionDiagnosticDialog() {\n        if (_server)\n            AppRegistry::instance().app()->closeServer(_server);\n    }\n\n    void ConnectionDiagnosticDialog::errorLinkActivated(const QString &link) {\n        if (_lastErrorMessage.empty())\n            return;\n\n        QMessageBox::information(this, \"Error details\", QtUtils::toQString(_lastErrorMessage));\n    }\n\n    void ConnectionDiagnosticDialog::sshStatus(State state)\n    {\n        if (!_connSettings->sshSettings()->enabled()) {\n            _sshIconLabel->setVisible(false);\n            _sshLabel->setVisible(false);\n            return;\n        }\n\n        if (state == InitialState) {\n            _sshIconLabel->setMovie(_loadingMovie);\n            _sshLabel->setText(QString(\"Connecting to SSH server at <b>%1:%2</b>...\")\n                .arg(QtUtils::toQString(_connSettings->sshSettings()->host()))\n                .arg(_connSettings->sshSettings()->port()));\n        } else if (state == CompletedState) {\n            _sshIconLabel->setPixmap(_yesPixmap);\n            _sshLabel->setText(QString(\"Connected to SSH server at <b>%1:%2</b>\")\n                .arg(QtUtils::toQString(_connSettings->sshSettings()->host()))\n                .arg(_connSettings->sshSettings()->port()));\n        } else if (state == FailedState) {\n            _sshIconLabel->setPixmap(_noPixmap);\n            _sshLabel->setText(QString(\"Unable to connect to SSH server at <b>%1:%2</b>\")\n                .arg(QtUtils::toQString(_connSettings->sshSettings()->host()))\n                .arg(_connSettings->sshSettings()->port()));\n        }\n    }\n\n    void ConnectionDiagnosticDialog::connectionStatus(State state)\n    {\n        // Add info about tunneling if SSH or SSL is used\n        QString tunnelNote(\"\");    // No tunnel info when neither SSH nor SSL enabled\n        if (_connSettings->sshSettings()->enabled()) \n            tunnelNote = \" via SSH tunnel\";\n        else if (_connSettings->sslSettings()->sslEnabled())\n            tunnelNote = \" via TLS tunnel\";\n        else\n            tunnelNote = \"\";\n         \n\n        auto replicaSetStr = QString::fromStdString(_connSettings->connectionName()) + \" [Replica Set]\";\n        replicaSetStr = (_connSettings->replicaSetSettings()->members().size() > 0) \n                        ? replicaSetStr + '(' + QString::fromStdString(\n                                                    _connSettings->replicaSetSettings()->members()[0]) + ')'\n                        : replicaSetStr + \"\";\n\n        QString const& serverAddress = _connSettings->isReplicaSet()\n                                       ? replicaSetStr\n                                       : QString::fromStdString(_connSettings->getFullAddress());\n\n        // Set main info text at dialog\n        if (state == InitialState) {\n            _connectionIconLabel->setMovie(_loadingMovie);\n            _connectionLabel->setText(QString(\"Connecting to <b>%1</b>%2...\").arg(serverAddress, tunnelNote));\n\n        } else if (state == CompletedState) {\n            _connectionIconLabel->setPixmap(_yesPixmap);\n            _connectionLabel->setText(QString(\"Connected to <b>%1</b>%2\").arg(serverAddress, tunnelNote));\n        } else if (state == FailedState) {\n            _connectionIconLabel->setPixmap(_noPixmap);\n            _connectionLabel->setText(QString(\"Failed to connect to <b>%1</b>%2\").arg(serverAddress, tunnelNote));\n        } else if (state == NotPerformedState) {\n            _connectionIconLabel->setPixmap(_questionPixmap);\n            _connectionLabel->setText(QString(\"No chance to try connection to <b>%1</b>%2\").\n                                               arg(serverAddress, tunnelNote));\n        }\n    }\n\n    void ConnectionDiagnosticDialog::authStatus(State state)\n    {\n        if (!_connSettings->hasEnabledPrimaryCredential()) {\n            _authIconLabel->setVisible(false);\n            _authLabel->setVisible(false);\n            return;\n        }\n\n        if (state == InitialState) {\n            _authIconLabel->setMovie(_loadingMovie);\n            _authLabel->setText(QString(\"Authorizing on <b>%1</b> database as <b>%2</b>...\")\n                .arg(QtUtils::toQString(_connSettings->primaryCredential()->databaseName()))\n                .arg(QtUtils::toQString(_connSettings->primaryCredential()->userName())));\n        } else if (state == CompletedState) {\n            _authIconLabel->setPixmap(_yesPixmap);\n            _authLabel->setText(QString(\"Authorized on <b>%1</b> database as <b>%2</b>\")\n                .arg(QtUtils::toQString(_connSettings->primaryCredential()->databaseName()))\n                .arg(QtUtils::toQString(_connSettings->primaryCredential()->userName())));\n        } else if (state == FailedState) {\n            _authIconLabel->setPixmap(_noPixmap);\n            _authLabel->setText(QString(\"Authorization failed on <b>%1</b> database as <b>%2</b>\")\n                .arg(QtUtils::toQString(_connSettings->primaryCredential()->databaseName()))\n                .arg(QtUtils::toQString(_connSettings->primaryCredential()->userName())));\n        } else if (state == NotPerformedState) {\n            _authIconLabel->setPixmap(_questionPixmap);\n            _authLabel->setText(QString(\"No chance to authorize\"));\n        }\n    }\n\n    void ConnectionDiagnosticDialog::listStatus(State state)\n    {\n        if (_connSettings->hasEnabledPrimaryCredential()) {\n            _listIconLabel->setVisible(false);\n            _listLabel->setVisible(false);\n            return;\n        }\n\n        if (state == InitialState) {\n            _listIconLabel->setMovie(_loadingMovie);\n            _listLabel->setText(QString(\"Loading list of databases...\"));\n        } else if (state == CompletedState) {\n            _listIconLabel->setPixmap(_yesPixmap);\n            _listLabel->setText(QString(\"Access to databases is available\"));\n        } else if (state == FailedState) {\n            _listIconLabel->setPixmap(_noPixmap);\n            _listLabel->setText(QString(\"Failed to load list of databases\"));\n        } else if (state == NotPerformedState) {\n            _listIconLabel->setPixmap(_questionPixmap);\n            _listLabel->setText(QString(\"No chance to load list of databases\"));\n        }\n    }\n\n    void ConnectionDiagnosticDialog::handle(ConnectionEstablishedEvent *event) {\n        if (event->connectionType != ConnectionTest)\n            return;\n\n        sshStatus(CompletedState);\n        connectionStatus(CompletedState);\n        authStatus(CompletedState);\n        listStatus(CompletedState);\n\n        // Remember in order to delete on dialog close\n        _server = static_cast<MongoServer*>(event->sender());\n    }\n\n    void ConnectionDiagnosticDialog::handle(ConnectionFailedEvent *event) {\n        if (event->connectionType != ConnectionTest || event->serverHandle != _serverHandle)\n            return;\n\n        sshStatus(CompletedState);\n        connectionStatus(CompletedState);\n        authStatus(CompletedState);\n        listStatus(CompletedState);\n\n        switch (event->reason) {\n        case ConnectionFailedEvent::SshConnection:\n            sshStatus(FailedState);\n            connectionStatus(NotPerformedState);\n            authStatus(NotPerformedState);\n            listStatus(NotPerformedState);\n            break;\n        case ConnectionFailedEvent::SshChannel:\n        case ConnectionFailedEvent::MongoConnection:\n            connectionStatus(FailedState);\n            authStatus(NotPerformedState);\n            listStatus(NotPerformedState);\n            break;\n        case ConnectionFailedEvent::MongoAuth:\n            authStatus(FailedState);\n            listStatus(FailedState);\n            break;\n        case ConnectionFailedEvent::SslConnection:\n            connectionStatus(FailedState);\n            authStatus(NotPerformedState);\n            listStatus(NotPerformedState);\n            break;\n        }\n\n        // Show link for additional error details\n        if (!event->message.empty()) {\n            _lastErrorMessage = event->message;\n            _viewErrorLink->show();\n        }\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/ConnectionDiagnosticDialog.h",
    "content": "#pragma once\n\n#include <QDialog>\n#include <QIcon>\n\nclass QLabel;\nclass QMovie;\n\nnamespace Robomongo\n{\n    struct ConnectionEstablishedEvent;\n    class ConnectionFailedEvent;\n    class ConnectionSettings;\n    class MongoServer;\n\n    class ConnectionDiagnosticDialog : public QDialog\n    {\n        Q_OBJECT\n    public:\n        ConnectionDiagnosticDialog(ConnectionSettings *connection, QWidget *parent = 0);\n        ~ConnectionDiagnosticDialog();\n\n        bool continueExec() const { return _continueExec; }\n\n    protected Q_SLOTS:\n        void handle(ConnectionEstablishedEvent *event);\n        void handle(ConnectionFailedEvent *event);\n        void errorLinkActivated(const QString &link);\n\n    private:\n\n        enum State \n        {\n            InitialState,\n            CompletedState,\n            FailedState,\n            NotPerformedState\n        };\n\n        void sshStatus(State state);\n        void connectionStatus(State state);\n        void authStatus(State state);\n        void listStatus(State state);\n\n        ConnectionSettings *_connSettings;\n        QIcon _yesIcon;\n        QIcon _noIcon;\n        QIcon _questionIcon;\n        QMovie *_loadingMovie;\n\n        QPixmap _yesPixmap;\n        QPixmap _noPixmap;\n        QPixmap _questionPixmap;\n\n        QLabel *_sshIconLabel;\n        QLabel *_sshLabel;\n        QLabel *_connectionIconLabel;\n        QLabel *_connectionLabel;\n        QLabel *_authIconLabel;\n        QLabel *_authLabel;\n        QLabel *_listIconLabel;  // List database names\n        QLabel *_listLabel;\n\n        QLabel *_viewErrorLink;\n        std::string _lastErrorMessage;\n\n        MongoServer *_server;\n        int _serverHandle;\n        bool _continueExec;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/ConnectionDialog.cpp",
    "content": "#include \"robomongo/gui/dialogs/ConnectionDialog.h\"\n\n#include <QPushButton>\n#include <QCloseEvent>\n#include <QHBoxLayout>\n#include <QVBoxLayout>\n#include <QMessageBox>\n#include <QApplication>\n#include <QDialogButtonBox>\n#include <QSettings>\n\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/dialogs/ConnectionAuthTab.h\"\n#include \"robomongo/gui/dialogs/ConnectionBasicTab.h\"\n#include \"robomongo/gui/dialogs/ConnectionAdvancedTab.h\"\n#include \"robomongo/gui/dialogs/SSHTunnelTab.h\"\n#include \"robomongo/gui/dialogs/SSLTab.h\"\n#include \"robomongo/gui/dialogs/ConnectionDiagnosticDialog.h\"\n\nnamespace Robomongo\n{\n    /**\n     * @brief Constructs dialog with specified connection\n     */\n    ConnectionDialog::ConnectionDialog(ConnectionSettings *connection, QWidget *parent /* = nullptr */)\n        : QDialog(parent), _connection(connection)\n    {\n        setWindowTitle(\"Connection Settings\");\n        setWindowIcon(GuiRegistry::instance().serverIcon());\n        setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); // Remove help button (?)\n\n        QPushButton *testButton = new QPushButton(\"&Test\");\n        testButton->setIcon(qApp->style()->standardIcon(QStyle::SP_MessageBoxInformation));\n        VERIFY(connect(testButton, SIGNAL(clicked()), this, SLOT(testConnection())));\n\n        QHBoxLayout *bottomLayout = new QHBoxLayout;\n        bottomLayout->addWidget(testButton, 1, Qt::AlignLeft);\n        QDialogButtonBox *buttonBox = new QDialogButtonBox(this);\n        buttonBox->setOrientation(Qt::Horizontal);\n        buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Save);\n        VERIFY(connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())));\n        VERIFY(connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())));\n        bottomLayout->addWidget(buttonBox);\n\n        QTabWidget *tabWidget = new QTabWidget;\n                \n        _basicTab    = new ConnectionBasicTab(_connection, this);\n        _authTab     = new ConnectionAuthTab(_connection);\n        _advancedTab = new ConnectionAdvancedTab(_connection);\n        _sshTab      = new SshTunnelTab(_connection);\n        _sslTab      = new SSLTab(_connection);\n\n        tabWidget->addTab(_basicTab,    \"Connection\");\n        tabWidget->addTab(_authTab,     \"Authentication\");\n        tabWidget->addTab(_sshTab,      \"SSH\");\n        tabWidget->addTab(_sslTab,      \"TLS\");\n        tabWidget->addTab(_advancedTab, \"Advanced\");\n\n        QVBoxLayout *mainLayout = new QVBoxLayout;\n        mainLayout->addWidget(tabWidget);\n        mainLayout->addLayout(bottomLayout);\n        setLayout(mainLayout);\n\n        _basicTab->setFocus();\n        adjustSize();\n\n#ifdef _WIN32\n        setMinimumWidth(500);\n#elif __APPLE__\n        setMinimumWidth(660);\n#elif __linux__        \n        setMinimumWidth(900);\n#endif\n\n        restoreWindowSettings();\n    }\n\n    /**\n     * @brief Accept() is called when user agree with entered data.\n     */\n    void ConnectionDialog::accept()\n    {\n        saveWindowSettings();\n\n        if (validateAndApply())\n            QDialog::accept();\n    }\n\n    void ConnectionDialog::reject()\n    {\n        saveWindowSettings();\n        QDialog::reject();\n    }\n\n    void ConnectionDialog::closeEvent(QCloseEvent *event)\n    {\n        saveWindowSettings();\n        QWidget::closeEvent(event);\n    }\n\n    void ConnectionDialog::setAuthTab(\n        QString const& db, \n        QString const& username, \n        QString const& pwd, \n        AuthMechanism authMech\n    ) {\n        _authTab->setAuthTab(db, username, pwd, authMech);\n    }\n\n    void ConnectionDialog::setDefaultDb(QString const& defaultDb)\n    {\n        _advancedTab->setDefaultDb(defaultDb);\n    }\n\n    void ConnectionDialog::toggleSshSupport(bool isReplicaSet)\n    {\n        if (!_sshTab) \n            return;\n        \n        _sshTab->setDisabled(isReplicaSet);\n        _sshTab->toggleSshCheckboxToolTip(isReplicaSet);\n    }\n\n    void ConnectionDialog::clearConnAuthTab()\n    {\n        _authTab->clearTab();\n    }\n\n    void ConnectionDialog::clearSslTab()\n    {\n        _sslTab->clearTab();\n    }\n\n    void ConnectionDialog::setSslTab(\n        int index,\n        bool allowInvalidHostnames,\n        std::string_view caFile,\n        std::string_view certPemFile,\n        std::string_view certPemFilePwd\n    ) {\n        _sslTab->setSslOptions(index, allowInvalidHostnames, caFile, certPemFile, certPemFilePwd);\n    }\n\n    void ConnectionDialog::restoreWindowSettings()\n    {\n        QSettings settings(\"3T\", \"Robomongo\");\n        resize(settings.value(\"ConnectionDialog/size\").toSize());\n    }\n\n    void ConnectionDialog::saveWindowSettings() const\n    {\n        QSettings settings(\"3T\", \"Robomongo\");\n        settings.setValue(\"ConnectionDialog/size\", size());\n    }\n\n    bool ConnectionDialog::validateAndApply()\n    {\n        _authTab->accept();\n        _advancedTab->accept();\n\n        if (!_basicTab->accept() || !_sshTab->accept() || !_sslTab->accept())\n            return false;\n\n        return true;\n    }\n\n    /**\n     * @brief Test current connection\n     */\n    void ConnectionDialog::testConnection()\n    {\n        if (!validateAndApply())\n            return;\n\n        ConnectionDiagnosticDialog diag(_connection, this);\n        if (!diag.continueExec())\n            return;\n\n        diag.exec();\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/ConnectionDialog.h",
    "content": "#pragma once\n\n#include <QDialog>\n\n#include \"robomongo/core/Core.h\"\n#include \"robomongo/gui/utils/GuiConstants.h\"\n\nnamespace Robomongo\n{\n    class ConnectionSettings;\n    class ConnectionAuthTab;\n    class ConnectionBasicTab;\n    class ConnectionAdvancedTab;\n    class SSLTab;\n    class SshTunnelTab;\n\n    /**\n     * @brief This Dialog allows to edit single connection\n     */\n    class ConnectionDialog : public QDialog\n    {\n        Q_OBJECT\n\n    public:\n        /**\n         * @brief Constructs dialog with specified connection\n         */\n        ConnectionDialog(ConnectionSettings *connection, QWidget *parent = nullptr);\n        \n        ConnectionSettings *const connection() const { return _connection; }        \n        void setAuthTab(\n            QString const& db, \n            QString const& username, \n            QString const& pwd, \n            AuthMechanism authMech\n        );\n        void setDefaultDb(QString const& defaultDb);\n        void toggleSshSupport(bool isReplicaSet);\n        void clearConnAuthTab();\n        \n        void clearSslTab();\n        void setSslTab(\n            int index,\n            bool allowInvalidHostnames,\n            std::string_view caFile,\n            std::string_view certPemFile,\n            std::string_view certPemFilePwd\n        );\n\n    public Q_SLOTS:\n        /**\n         * @brief Accept() is called when user agree with entered data.\n         */\n        virtual void accept();       \n        \n    private Q_SLOTS:\n        /**\n         * @brief Test current connection\n         */\n        void testConnection();\n\n    private:\n        void reject();\n        void closeEvent(QCloseEvent *event);\n        void restoreWindowSettings();\n        void saveWindowSettings() const;\n        bool validateAndApply();\n        \n        ConnectionAuthTab *_authTab = nullptr;\n        ConnectionBasicTab *_basicTab = nullptr;\n        ConnectionAdvancedTab *_advancedTab = nullptr;\n        SshTunnelTab *_sshTab = nullptr;\n        SSLTab *_sslTab = nullptr;\n\n#ifdef SSH_SUPPORT_ENABLED\n        SshTunnelTab *_sshTab;\n#endif\n        /**\n         * @brief Edited connection\n         */\n        ConnectionSettings *const _connection;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/ConnectionsDialog.cpp",
    "content": "#include \"robomongo/gui/dialogs/ConnectionsDialog.h\"\n\n#include <QPushButton>\n#include <QHBoxLayout>\n#include <QAction>\n#include <QMessageBox>\n#include <QLabel>\n#include <QHeaderView>\n#include <QDialogButtonBox>\n#include <QTreeWidgetItem>\n#include <QKeyEvent>\n#include <QApplication>\n#include <QSettings>\n#include <QUuid>\n\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/settings/ReplicaSetSettings.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/core/settings/SslSettings.h\"\n#include \"robomongo/core/settings/SshSettings.h\"\n#include \"robomongo/core/settings/CredentialSettings.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/dialogs/ConnectionDialog.h\"\n#include \"robomongo/gui/MainWindow.h\"\n#include \"robomongo/gui/widgets/workarea/WelcomeTab.h\"\n#include \"robomongo/utils/common.h\"\n\nnamespace Robomongo\n{\n    \n    /* ------------------------ ConnectionListWidgetItem ------------------------ */\n\n    /**\n     * @brief Simple ListWidgetItem that has several convenience methods.\n     */\n    class ConnectionListWidgetItem : public QTreeWidgetItem\n    {\n    public:\n        /**\n         * @brief Creates ConnectionListWidgetItem with specified ConnectionSettings\n         */\n        ConnectionListWidgetItem(ConnectionSettings *connection) { setConnection(connection); }\n\n        /**\n         * @brief Returns attached ConnectionSettings.\n         */\n        ConnectionSettings *connection() { return _connection; }\n\n        /**\n         * @brief Attach ConnectionSettings to this item\n         */\n        void setConnection(ConnectionSettings *connection)\n        {\n            _connection = connection;\n\n            if (_connection->isReplicaSet()) {\n                setIcon(0, GuiRegistry::instance().replicaSetIcon());\n                setText(0, QtUtils::toQString(_connection->connectionName()));\n                auto const repSetSize = _connection->replicaSetSettings()->members().size();\n                auto addrText = QString::number(repSetSize) + ((repSetSize > 1) ? \" nodes\" : \" node\");\n                if (!_connection->replicaSetSettings()->members().empty()) {\n                    addrText += QString::fromStdString(\" (\" + _connection->replicaSetSettings()->members().front() + \")\");\n                }\n                setText(1, addrText);\n            }\n            else {\n                setIcon(0, GuiRegistry::instance().serverIcon());\n                setText(0, QtUtils::toQString(_connection->connectionName()));\n                setText(1, QtUtils::toQString(_connection->getFullAddress()));\n            }\n\n            if (_connection->imported()) {\n                setIcon(0, GuiRegistry::instance().serverImportedIcon());\n            }\n\n            // Header \"Attributes\" (column[2])\n            setText(2, _connection->isReplicaSet() ? \"Replica Set\" : \"\");\n            \n            if (_connection->sslSettings()->sslEnabled())\n                setText(2, text(2) + (text(2).isEmpty() ? \"TLS\" : \", TLS\"));\n\n            if (!_connection->isReplicaSet() && _connection->sshSettings()->enabled())\n                setText(2, text(2) + (text(2).isEmpty() ? \"SSH\" : \", SSH\"));\n\n            // Header \"Auth. Database/User\" (column[3])\n            if (_connection->hasEnabledPrimaryCredential()) {\n                auto primaryCredential { _connection->primaryCredential() };\n                auto const authString = \n                    QString(\"%1 / %2\").arg(QtUtils::toQString(primaryCredential->databaseName()))\n                                      .arg(QtUtils::toQString(primaryCredential->userName()));\n                setText(3, authString + \"    \");\n                setIcon(3, GuiRegistry::instance().keyIcon());\n            }\n            else {\n                setIcon(3, QIcon());\n                setText(3, \"\");\n            }\n\n        }\n\n    private:\n        ConnectionSettings *_connection;\n    };\n\n\n\n    /* ------------------------ ConnectionsDialog ------------------------ */\n\n    /**\n     * @brief Creates dialog\n     */\n    ConnectionsDialog::ConnectionsDialog(SettingsManager *settingsManager, bool checkForImported, QWidget *parent)\n        : QDialog(parent), _settingsManager(settingsManager), _checkForImported(checkForImported)\n    {\n        setWindowIcon(GuiRegistry::instance().connectIcon());\n        setWindowTitle(\"MongoDB Connections\");\n\n        // Remove help button (?)\n        setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);\n\n        QAction *addAction = new QAction(\"&Add...\", this);\n        VERIFY(connect(addAction, SIGNAL(triggered()), this, SLOT(add())));\n\n        QAction *editAction = new QAction(\"&Edit...\", this);\n        VERIFY(connect(editAction, SIGNAL(triggered()), this, SLOT(edit())));\n\n        QAction *cloneAction = new QAction(\"&Clone...\", this);\n        VERIFY(connect(cloneAction, SIGNAL(triggered()), this, SLOT(clone())));\n\n        QAction *removeAction = new QAction(\"&Remove...\", this);\n        VERIFY(connect(removeAction, SIGNAL(triggered()), this, SLOT(remove())));\n\n        _listWidget = new ConnectionsTreeWidget;\n        GuiRegistry::instance().setAlternatingColor(_listWidget);\n#if defined(Q_OS_MAC)\n        _listWidget->setAttribute(Qt::WA_MacShowFocusRect, false);\n#endif\n        _listWidget->setIndentation(5);\n\n        QStringList colums;\n        colums << \"Name\" << \"Address\" << \"Attributes\" << \"Auth. Database / User\";\n        _listWidget->setHeaderLabels(colums);\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))\n        _listWidget->header()->setSectionResizeMode(0, QHeaderView::Stretch);\n        _listWidget->header()->setSectionResizeMode(1, QHeaderView::Stretch);\n        _listWidget->header()->setSectionResizeMode(2, QHeaderView::ResizeToContents);\n        _listWidget->header()->setSectionResizeMode(3, QHeaderView::ResizeToContents);\n#endif\n        //_listWidget->setViewMode(QListView::ListMode);\n        _listWidget->setContextMenuPolicy(Qt::ActionsContextMenu);\n        _listWidget->addAction(addAction);\n        _listWidget->addAction(editAction);\n        _listWidget->addAction(cloneAction);\n        _listWidget->addAction(removeAction);\n        _listWidget->setSelectionMode(QAbstractItemView::SingleSelection); // single item can be draged or droped\n        _listWidget->setDragEnabled(true);\n        _listWidget->setDragDropMode(QAbstractItemView::InternalMove);\n        _listWidget->setMinimumHeight(290);\n        _listWidget->setMinimumWidth(630);\n        VERIFY(connect(_listWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(accept())));\n        VERIFY(connect(_listWidget, SIGNAL(layoutChanged()), this, SLOT(listWidget_layoutChanged())));\n\n        QDialogButtonBox *buttonBox = new QDialogButtonBox(this);\n        buttonBox->setOrientation(Qt::Horizontal);\n        buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Save);\n        buttonBox->button(QDialogButtonBox::Save)->setIcon(GuiRegistry::instance().serverIcon());\n        buttonBox->button(QDialogButtonBox::Save)->setText(\"C&onnect\");\n        VERIFY(connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())));\n        VERIFY(connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())));\n\n        QHBoxLayout *bottomLayout = new QHBoxLayout;\n\n        // Information message is shown when connection\n        // settings are imported from previous version of Robomongo\n        int importedCount = _settingsManager->importedConnectionsCount();\n        if (_checkForImported && importedCount > 0) {\n            QIcon importIcon = qApp->style()->standardIcon(QStyle::SP_MessageBoxInformation);\n            QPixmap importPixmap = importIcon.pixmap(20, 20);\n            QLabel *importLabelIcon = new QLabel;\n            importLabelIcon->setPixmap(importPixmap);\n            QString importedRecords = importedCount > 1 ? \"records\" : \"record\";\n            QLabel *importLabelMessage = new QLabel(QString(\n                \"<span style='color: #777777;'>\"\n                \"Connection settings have been imported (%1 %2)\"\n                \"</span>\").arg(importedCount).arg(importedRecords));\n\n            bottomLayout->addWidget(importLabelIcon, 0, Qt::AlignLeft);\n            bottomLayout->addWidget(importLabelMessage, 1, Qt::AlignLeft);\n        }\n\n        bottomLayout->addWidget(buttonBox, 0, Qt::AlignRight);\n\n        QLabel *intro = new QLabel(QString(\n            \"<a style='color: %1' href='create'>Create</a>, \"\n            \"<a style='color: %1' href='edit'>edit</a>, \"\n            \"<a style='color: %1' href='remove'>remove</a>, \"\n            \"<a style='color: %1' href='clone'>clone</a> \"\n            \"or reorder connections via drag'n'drop.\").arg(\"#106CD6\"));\n        intro->setWordWrap(true);\n\n        VERIFY(connect(intro, SIGNAL(linkActivated(QString)), this, SLOT(linkActivated(QString))));\n\n        QVBoxLayout *firstColumnLayout = new QVBoxLayout;\n        firstColumnLayout->addWidget(intro);\n        firstColumnLayout->addWidget(_listWidget, 1);\n        firstColumnLayout->addLayout(bottomLayout);\n\n        QHBoxLayout *mainLayout = new QHBoxLayout(this);\n        mainLayout->addLayout(firstColumnLayout, 1);\n\n        // Populate list with connections\n        std::vector<ConnectionSettings*> connectionSettings = _settingsManager->connections();\n        for (auto const& connSetting : connectionSettings) {\n            ConnectionSettings *connectionModel { connSetting };\n            add(connectionModel);\n        }\n\n        // Highlight last item\n        if (_listWidget->topLevelItemCount() > 0)\n            _listWidget->setCurrentItem(_listWidget->topLevelItem(_listWidget->topLevelItemCount()-1));\n\n        _listWidget->setFocus();\n        resize(getSetting(\"ConnectionsDialog/size\").toSize());\n    }\n\n    /**\n     * @brief This function is called when user clicks on \"Connect\" button.\n     */\n    void ConnectionsDialog::accept()\n    {\n        auto currentItem = dynamic_cast<ConnectionListWidgetItem*>(_listWidget->currentItem());\n\n        // Do nothing if no item selected\n        if (!currentItem)\n            return;\n\n        _selectedConnection = currentItem->connection();\n\n        QDialog::accept();\n    }\n\n    void ConnectionsDialog::reject()\n    {\n        QDialog::reject();\n    }\n\n    ConnectionsDialog::~ConnectionsDialog() \n    {\n        saveSetting(\"ConnectionsDialog/size\", size());\n    }\n\n    void ConnectionsDialog::linkActivated(const QString &link)\n    {\n        if (link == \"create\")\n            add();\n        else if (link == \"edit\")\n            edit();\n        else if (link == \"remove\")\n            remove();\n        else if (link == \"clone\")\n            clone();\n    }\n\n    /**\n     * @brief Initiate 'add' action, usually when user clicked on Add button\n     */\n    void ConnectionsDialog::add()\n    {       \n        auto newConnSettings = std::unique_ptr<ConnectionSettings>(new ConnectionSettings(false));\n        ConnectionDialog editDialog(newConnSettings.get(), this);\n\n        // Do nothing if not accepted\n        if (editDialog.exec() != QDialog::Accepted) {\n            return;\n        }\n\n        add(newConnSettings.get());\n        _settingsManager->addConnection(newConnSettings.release());\n        \n        _listWidget->setFocus();\n    }\n\n    /**\n     * @brief Initiate 'edit' action, usually when user clicked on Edit button\n     */\n    void ConnectionsDialog::edit()\n    {\n        auto currentItem = dynamic_cast<ConnectionListWidgetItem*>(_listWidget->currentItem());\n\n        // Do nothing if no item selected\n        if (!currentItem)\n            return;\n\n        auto connection = currentItem->connection();\n        boost::scoped_ptr<ConnectionSettings> clonedConnection(connection->clone());\n        ConnectionDialog editDialog(clonedConnection.get(), this);\n\n        // Do nothing if not accepted\n        if (editDialog.exec() != QDialog::Accepted) {\n            // on linux focus is lost - we need to activate connections dialog\n            activateWindow();\n            return;\n        }\n\n        connection->apply(editDialog.connection());       \n\n        // on linux focus is lost - we need to activate connections dialog\n        activateWindow();\n\n        int size = _connectionItems.size();\n        for (int i = 0; i<size; ++i)\n        {\n            ConnectionListWidgetItem *item = _connectionItems[i];\n            if (_connectionItems[i]->connection() == connection) {\n                item->setConnection(connection);\n                break;\n            }\n        }        \n    }\n\n    /**\n     * @brief Initiate 'remove' action, usually when user clicked on Remove button\n     */\n    void ConnectionsDialog::remove()\n    {\n        auto currentItem = dynamic_cast<ConnectionListWidgetItem*>(_listWidget->currentItem());\n\n        // Do nothing if no item selected\n        if (!currentItem)\n            return;\n\n        ConnectionSettings *connSettings = currentItem->connection();\n\n        // Ask user\n        QString const question { \"Are you sure you want to delete \\\"%1\\\" connection?\" };\n        int const answer = QMessageBox::question(this,\n            \"Connections\",\n            question.arg(QtUtils::toQString(connSettings->getReadableName())),\n            QMessageBox::Yes, QMessageBox::No, QMessageBox::NoButton);\n\n        if (answer != QMessageBox::Yes)\n            return;\n\n        /* Temporarily disabling Recent Connections feature\n        _settingsManager->deleteRecentConnection(connSettings);\n        // Remove from WelcomeTab\n        for (auto widget : QApplication::topLevelWidgets()) {\n            if (auto mainWin = dynamic_cast<MainWindow*>(widget))\n                mainWin->getWelcomeTab()->removeRecentConnectionItem(connSettings);\n        }\n        */\n\n        _settingsManager->removeConnection(connSettings);\n\n        delete currentItem;\n    }\n\n    void ConnectionsDialog::clone()\n    {\n        auto currentItem = dynamic_cast<ConnectionListWidgetItem*>(_listWidget->currentItem());\n\n        // Do nothing if no item selected\n        if (!currentItem)\n            return;\n\n        // Clone connection\n        ConnectionSettings *connection = currentItem->connection()->clone();\n        // This is a special clone which will actually be a new connection and must have unique UUID\n        connection->setUuid(QUuid::createUuid().toString());    \n        std::string newConnectionName = \"Copy of \" + connection->connectionName();\n\n        connection->setConnectionName(newConnectionName);\n        connection->replicaSetSettings()->setCachedSetName(\"\");\n\n        ConnectionDialog editDialog(connection, this);\n\n        // Cleanup newly created connection and return, if not accepted.\n        if (editDialog.exec() != QDialog::Accepted) {\n            delete connection;\n            return;\n        }\n\n        // Now connection will be owned by SettingsManager\n        _settingsManager->addConnection(connection);\n        add(connection);\n    }\n\n    /**\n     * @brief Handles ListWidget layoutChanged() signal\n     */\n    void ConnectionsDialog::listWidget_layoutChanged()\n    {\n        // Make childrens toplevel again. This is a bad, but quickiest item reordering\n        // implementation.\n        for (int i = 0; i < _listWidget->topLevelItemCount(); i++)\n        {\n            auto item = (ConnectionListWidgetItem *) _listWidget->topLevelItem(i);\n            if (item->childCount() > 0) {\n                auto childItem = (ConnectionListWidgetItem *) item->child(0);\n                item->removeChild(childItem);\n                _listWidget->insertTopLevelItem(++i, childItem);\n                _listWidget->setCurrentItem(childItem);\n                break;\n            }\n        }\n\n        SettingsManager::ConnectionSettingsContainerType items;\n        for (int i = 0; i < _listWidget->topLevelItemCount(); i++)\n        {\n            auto item = (ConnectionListWidgetItem *) _listWidget->topLevelItem(i);\n            items.push_back(item->connection());\n        }\n\n        _settingsManager->reorderConnections(items);\n    }\n\n    /**\n     * @brief Add connection to the list widget\n     */\n    void ConnectionsDialog::add(ConnectionSettings *connection)\n    {\n        auto item = new ConnectionListWidgetItem(connection);\n        _listWidget->addTopLevelItem(item);\n        _listWidget->setCurrentItem(item);\n        _connectionItems.push_back(item);\n    }\n\n    void ConnectionsDialog::keyPressEvent(QKeyEvent *event) {\n\n        if (event->key() == Qt::Key_E && (event->modifiers() & Qt::ControlModifier)) {\n            edit();\n            return;\n        }\n\n        if (event->key() == Qt::Key_W && (event->modifiers() & Qt::ControlModifier)) {\n            close();\n            return;\n        }\n\n        // Shift + Return also accepts connection (this shortcut is handled\n        // to support DEBUG level logging)\n        if (event->key() == Qt::Key_Return && (event->modifiers() & Qt::ShiftModifier)) {\n            accept();\n            return;\n        }\n\n        QDialog::keyPressEvent(event);\n    }\n\n    ConnectionsTreeWidget::ConnectionsTreeWidget()\n    {\n        setDragDropMode(QAbstractItemView::InternalMove);\n        setSelectionMode(QAbstractItemView::SingleSelection);\n        setDragEnabled(true);\n        setAcceptDrops(true);\n    }\n\n    void ConnectionsTreeWidget::dropEvent(QDropEvent *event)\n    {\n#ifdef __APPLE__\n        if(_dragDropCount > 0)\n            return;\n#endif\n        QTreeWidget::dropEvent(event);\n        emit layoutChanged();\n#ifdef __APPLE__\n        ++_dragDropCount;\n#endif\n    }\n}"
  },
  {
    "path": "src/robomongo/gui/dialogs/ConnectionsDialog.h",
    "content": "#pragma once\n\n#include <QDialog>\n#include <QTreeWidget>\n\n#include \"robomongo/core/Core.h\"\n\nnamespace Robomongo\n{\n    class ConnectionListWidgetItem;\n    class SettingsManager;\n    class ConnectionSettings;\n\n    /**\n     * @brief Dialog allows select/edit/add/delete connections\n     */\n    class ConnectionsDialog : public QDialog\n    {\n        Q_OBJECT\n\n    public:\n        typedef std::vector<ConnectionListWidgetItem *> ConnectionListItemContainerType; \n\n        ConnectionsDialog(SettingsManager *manager, bool checkForImported, QWidget *parent = 0);\n        ~ConnectionsDialog();\n\n        /**\n         * @brief ConnectionSettings, that was selected after pressing on\n         * \"Connect\" button\n         */\n        ConnectionSettings *selectedConnection() const { return _selectedConnection; }\n\n    public Q_SLOTS:\n        /**\n         * @brief This function is called when user clicks on \"Connect\" button.\n         */\n        void accept() override;\n\n        /**\n        * @brief Called when \"Cancel\" button clicked.\n        */\n        void reject() override;\n\n        /**\n        * @brief Add connection to the list widget\n        */\n        void add(ConnectionSettings *connection);\n\n    private Q_SLOTS:\n        void linkActivated(const QString &link);\n\n        /**\n         * @brief Initiate 'add' action, usually when user clicked on Add button\n         */\n        void add();\n\n        /**\n         * @brief Initiate 'edit' action, usually when user clicked on Edit\n         * button\n         */\n        void edit();\n\n        /**\n         * @brief Initiate 'remove' action, usually when user clicked on Remove\n         * button\n         */\n        void remove();\n\n        /**\n         * @brief Initiate 'clone' action, usually when user clicked on Clone\n         * button\n         */\n        void clone();\n\n        /**\n         * @brief Handles ListWidget layoutChanged() signal\n         */\n        void listWidget_layoutChanged();\n\n        void keyPressEvent(QKeyEvent* event) override;\n\n    private:\n        /**\n         * @brief ConnectionSettings, that was selected after pressing on\n         * \"Connect\" button\n         */\n        ConnectionSettings *_selectedConnection;\n\n        /**\n         * @brief Main list widget\n         */\n        QTreeWidget *_listWidget;\n\n        /**\n         * @brief Settings manager\n         */\n        SettingsManager *_settingsManager;\n\n        /**\n         * @brief Hash that helps to connect ConnectionSettings with\n         * ConnectionListWidgetItem*\n         */\n        ConnectionListItemContainerType _connectionItems;\n\n        bool _checkForImported;\n    };    \n\n    class ConnectionsTreeWidget : public QTreeWidget\n    {\n        Q_OBJECT\n    public:\n        ConnectionsTreeWidget();\n\n    Q_SIGNALS:\n        void layoutChanged();\n\n    protected:\n        void dropEvent(QDropEvent *event);\n\n#ifdef __APPLE__\n    // macOS: Set one re-order limit per new connections window. \n    // Workaround for Qt bug came in Qt 5.12.8.\n    // https://github.com/Studio3T/robomongo/issues/1790\n    private:\n        int _dragDropCount = 0;    \n#endif\n    };\n}"
  },
  {
    "path": "src/robomongo/gui/dialogs/CopyCollectionDialog.cpp",
    "content": "#include \"robomongo/gui/dialogs/CopyCollectionDialog.h\"\n\n#include <QPushButton>\n#include <QHBoxLayout>\n#include <QVBoxLayout>\n#include <QLineEdit>\n#include <QComboBox>\n#include <QDialogButtonBox>\n#include <QLabel>\n\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/gui/widgets/workarea/IndicatorLabel.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n\n\nnamespace Robomongo\n{\n    const QSize CopyCollection::minimumSize = QSize(300, 150);\n\n    CopyCollection::CopyCollection(const QString &serverName, const QString &database,\n                                               const QString &collection, QWidget *parent) :\n        QDialog(parent),\n        _currentServerName(serverName),\n        _currentDatabase(database)\n    {\n        QSet<QString> uniqueConnectionsNames;\n        for (auto const& server : AppRegistry::instance().app()->getServers()) {\n             if (server->isConnected()) {\n                 _servers.push_back(server.get());\n                 uniqueConnectionsNames.insert(QtUtils::toQString(server->connectionRecord()->connectionName()));\n             }\n        }\n        \n        setWindowTitle(\"Copy Collection\");\n        setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); // Remove help button (?)\n        setMinimumSize(minimumSize);\n\n        Indicator *serverIndicator = new Indicator(GuiRegistry::instance().serverIcon(), _currentServerName);\n\n        QFrame *hline = new QFrame();\n        hline->setFrameShape(QFrame::HLine);\n        hline->setFrameShadow(QFrame::Sunken);\n\n        _buttonBox = new QDialogButtonBox(this);\n        _buttonBox->setOrientation(Qt::Horizontal);\n        _buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Save);\n        _buttonBox->button(QDialogButtonBox::Save)->setText(\"Copy\");\n        VERIFY(connect(_buttonBox, SIGNAL(accepted()), this, SLOT(accept())));\n        VERIFY(connect(_buttonBox, SIGNAL(rejected()), this, SLOT(reject())));\n\n        QHBoxLayout *hlayout = new QHBoxLayout();\n        hlayout->addStretch(1);\n        hlayout->addWidget(_buttonBox);\n\n        QHBoxLayout *vlayout = new QHBoxLayout();\n        vlayout->addWidget(serverIndicator, 0, Qt::AlignLeft);\n        vlayout->addWidget(new Indicator(GuiRegistry::instance().databaseIcon(), _currentDatabase), 0, Qt::AlignLeft);\n        vlayout->addWidget(new Indicator(GuiRegistry::instance().collectionIcon(), collection), 0, Qt::AlignLeft);\n\n        QVBoxLayout *serverlayout = new QVBoxLayout();\n        serverlayout->setContentsMargins(0, 3, 0, 0);\n        _serverComboBox = new QComboBox();\n        QLabel *serverLabel = new QLabel(\"Select server:\");\n        QLabel *description = new QLabel(\n            QString(\"Copy <b>%1</b> collection to database on this or another server. \"\n                \"You need to be already connected to destination server, in order to see this server in the list below. \"\n                \"This operation will <i>not</i> overwrite existing documents with the same _id.\")\n                .arg(collection));\n\n        description->setWordWrap(true);\n        serverlayout->addWidget(description);\n        serverlayout->addSpacing(14);\n        serverlayout->addWidget(serverLabel);\n        serverlayout->addWidget(_serverComboBox);\n\n        QVBoxLayout *databaselayout = new QVBoxLayout();\n        databaselayout->setContentsMargins(0, 8, 0, 7);\n        _databaseComboBox = new QComboBox();\n        QLabel *databaseLabel = new QLabel(\"Select database:\");\n        databaselayout->addWidget(databaseLabel);\n        databaselayout->addWidget(_databaseComboBox);        \n        VERIFY(connect(_serverComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateDatabaseComboBox(int))));\n\n        _serverComboBox->addItems(uniqueConnectionsNames.toList());\n        QVBoxLayout *layout = new QVBoxLayout();\n        layout->addLayout(vlayout);\n        layout->addWidget(hline);\n        layout->addLayout(serverlayout);\n        layout->addLayout(databaselayout);\n        layout->addLayout(hlayout);\n        setLayout(layout);\n    }\n\n    void CopyCollection::updateDatabaseComboBox(int index)\n    {\n        _databaseComboBox->clear();\n        const QString &curentServerName = _serverComboBox->currentText();\n        MongoServer *server = nullptr;\n        for (auto const& ser : _servers) {            \n            if (curentServerName == QtUtils::toQString(ser->connectionRecord()->connectionName())) {\n                server = ser;\n                break;\n            }\n        }  \n        if (!server) return;\n\n        _databaseComboBox->addItems(server->getDatabasesNames());\n        if (_currentServerName == QtUtils::toQString(server->connectionRecord()->getFullAddress())) {\n            _databaseComboBox->removeItem(_databaseComboBox->findText(_currentDatabase));\n        }\n    }\n\n    MongoDatabase *CopyCollection::selectedDatabase()\n    {\n        MongoDatabase *result = NULL;\n        const QString &serverName = _serverComboBox->currentText();\n        const QString &dataBaseName = _databaseComboBox->currentText();\n        if (!serverName.isEmpty() && !dataBaseName.isEmpty()) {\n            MongoServer *server = _servers[_serverComboBox->currentIndex()];\n            result = server->findDatabaseByName(QtUtils::toStdString(dataBaseName));\n        }\n        return result;\n    }\n\n    void CopyCollection::accept()\n    {\n        if (!selectedDatabase())\n            return;\n\n        QDialog::accept();\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/CopyCollectionDialog.h",
    "content": "#pragma once\n\n#include <QDialog>\n#include \"robomongo/core/domain/App.h\"\nQT_BEGIN_NAMESPACE\nclass QDialogButtonBox;\nclass QComboBox;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class MongoDatabase;\n\n    class CopyCollection : public QDialog\n    {\n        Q_OBJECT\n\n    public:\n        static const QSize minimumSize;\n\n        explicit CopyCollection(const QString &serverName,\n                                      const QString &database,\n                                      const QString &collection, QWidget *parent = 0);\n\n    public Q_SLOTS:\n        virtual void accept();\n        void updateDatabaseComboBox(int index);\n        MongoDatabase *selectedDatabase();\n    private:\n        std::vector<MongoServer*> _servers;\n        const QString _currentServerName;\n        const QString _currentDatabase;\n        QComboBox *_serverComboBox;\n        QComboBox *_databaseComboBox;\n        QDialogButtonBox *_buttonBox;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/CreateCollectionDialog.cpp",
    "content": "#include \"robomongo/gui/dialogs/CreateCollectionDialog.h\"\n\n#include <mongo/bson/bsonobjbuilder.h>\n#include <QApplication>\n#include <QCheckBox>\n#include <QComboBox>\n#include <QDialogButtonBox>\n#include <QHBoxLayout>\n#include <QLineEdit>\n#include <QLabel>\n#include <QMessageBox>\n#include <QPushButton>\n#include <QSettings>\n#include <Qsci/qscilexerjavascript.h>\n#include <Qsci/qsciscintilla.h>\n#include <QVBoxLayout>\n\n#include \"robomongo/gui/widgets/workarea/IndicatorLabel.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/core/domain/MongoDatabase.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/gui/editors/FindFrame.h\"\n#include \"robomongo/gui/editors/JSLexer.h\"\n#include \"robomongo/gui/editors/PlainJavaScriptEditor.h\"\n#include \"robomongo/shell/bson/json.h\"\n\nnamespace Robomongo\n{\n    enum\n    {\n        OPTIONS_TAB                 = 0,\n        STORAGE_ENGINE_TAB          = 1,\n        VALIDATOR_TAB               = 2,\n        INDEX_OPTION_DEFAULTS_TAB   = 3,\n    };\n\n    const QString CreateCollectionDialog::STORAGE_ENGINE_TAB_HINT = \"Option available for WiredTiger storage engine only and database version 3.0 and higher.\";\n    const QString CreateCollectionDialog::VALIDATOR_TAB_HINT = \"Option available for database version 3.2 and higher.\";\n    const QString CreateCollectionDialog::INDEX_OPTION_DEFAULTS_TAB_HINT = \"Option available for database version 3.2 and higher.\";\n    const QString CreateCollectionDialog::NO_PADDING_HINT = \"Option available for MMAPv1 storage engine only and database version 3.0 and higher.\";\n    const QString CreateCollectionDialog::USE_POWEROFTWO_HINT = \"Option available for MMAPv1 storage engine only and deprecated since database version 3.0\";\n    const QString CreateCollectionDialog::AUTO_INDEXID_HINT = \"Option deprecated since database version 3.2\";\n\n    CreateCollectionDialog::CreateCollectionDialog(const QString &serverName, const float dbVersion, const std::string& storageEngine, \n        const QString &database, const QString &collection, QWidget *parent) :\n        QDialog(parent), _dbVersion(dbVersion), _storageEngine(storageEngine), \n        _activeFrame(nullptr), _activeObj(&_storageEngineObj)\n    {\n        setWindowTitle(tr(\"Create Collection\"));\n        setMinimumSize(300,150);\n        Indicator *serverIndicator = new Indicator(GuiRegistry::instance().serverIcon(), serverName);\n\n        QFrame *hline = new QFrame();\n        hline->setFrameShape(QFrame::HLine);\n        hline->setFrameShadow(QFrame::Sunken);\n\n        _inputEdit = new QLineEdit();\n        _inputLabel = new QLabel(tr(\"Collection Name:\"));\n        _inputEdit->setMaxLength(60);\n\n        _buttonBox = new QDialogButtonBox(this);\n        _buttonBox->setOrientation(Qt::Horizontal);\n        _buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Save);\n        _buttonBox->button(QDialogButtonBox::Save)->setText(tr(\"C&reate\"));\n        _buttonBox->button(QDialogButtonBox::Save)->setEnabled(false);\n        VERIFY(connect(_buttonBox, SIGNAL(accepted()), this, SLOT(accept())));\n        VERIFY(connect(_buttonBox, SIGNAL(rejected()), this, SLOT(reject())));\n        VERIFY(connect(_inputEdit, SIGNAL(textChanged(const QString &)),\n            this, SLOT(enableCreateButton(const QString &))));\n\n        _validateJsonButton = new QPushButton(tr(\"Validate JSON\"));\n        _validateJsonButton->setIcon(qApp->style()->standardIcon(QStyle::SP_MessageBoxInformation));\n        _validateJsonButton->hide();\n        VERIFY(connect(_validateJsonButton, SIGNAL(clicked()), this, SLOT(onValidateButtonClicked())));\n\n        // Create advanced options tabs\n        _advancedOptions = new QTabWidget(this);\n        _advancedOptions->addTab(createOptionsTab(), tr(\"Options\"));\n        _advancedOptions->addTab(createStorageEngineTab(), tr(\"Storage Engine\"));\n        _advancedOptions->addTab(createValidatorTab(), tr(\"Validator\"));\n        _advancedOptions->addTab(createIndexOptionDefaultsTab(), tr(\"Index Option Defaults\"));\n        _advancedOptions->setTabsClosable(false);\n        VERIFY(connect(_advancedOptions, SIGNAL(currentChanged(int)), this, SLOT(onTabChanged(int))));\n        // Create Advanced Button\n        _advancedButton = new QPushButton(tr(\"Advanced\"));\n        _advancedButton->setCheckable(true);\n        VERIFY(connect(_advancedButton, SIGNAL(toggled(bool)), this, SLOT(onAdvancedButtonToggled(bool))));\n\n        // Check mongodb version and storage engine type to enable/disable UI options\n        disableUnsupportedOptions();\n\n        QHBoxLayout *buttomHlayout = new QHBoxLayout();\n        buttomHlayout->addWidget(_validateJsonButton);\n        buttomHlayout->addStretch(1);\n        buttomHlayout->addWidget(_buttonBox);\n        buttomHlayout->addWidget(_advancedButton);\n\n        QHBoxLayout *vlayout = new QHBoxLayout();\n        if (!serverName.isEmpty())\n            vlayout->addWidget(serverIndicator, 0, Qt::AlignLeft);\n        if (!database.isEmpty())\n            vlayout->addWidget(createDatabaseIndicator(database), 0, Qt::AlignLeft);\n        if (!collection.isEmpty())\n            vlayout->addWidget(createCollectionIndicator(collection), 0, Qt::AlignLeft);\n        vlayout->addStretch(1);\n\n        QVBoxLayout *namelayout = new QVBoxLayout();\n        namelayout->setContentsMargins(0, 7, 0, 7);\n        namelayout->addWidget(_inputLabel);\n        namelayout->addWidget(_inputEdit);\n        \n        QVBoxLayout *mainLayout = new QVBoxLayout();\n        mainLayout->addLayout(vlayout);\n        mainLayout->addWidget(hline);\n        mainLayout->addLayout(namelayout);\n        mainLayout->addWidget(_advancedOptions);\n        mainLayout->addLayout(buttomHlayout);\n        mainLayout->setSizeConstraint(QLayout::SetMaximumSize);\n        setLayout(mainLayout);\n\n        _advancedOptions->hide();\n        _inputEdit->setFocus();\n    }\n\n    const mongo::BSONObj CreateCollectionDialog::getExtraOptions() const\n    {\n        return _extraOptionsObj;\n    }\n\n    QString CreateCollectionDialog::getCollectionName() const\n    {\n        return _inputEdit->text();\n    }\n\n    bool CreateCollectionDialog::isCapped() const\n    {\n        return (_cappedCheckBox->checkState() == Qt::Checked);\n    }\n\n    long long CreateCollectionDialog::getSizeInputValue() const\n    {\n        return (_sizeInputEdit->text().toLongLong());\n    }\n\n    int CreateCollectionDialog::getMaxDocNumberInputValue() const\n    {\n        return (_maxDocNumberInputEdit->text().toInt());\n    }\n\n    bool CreateCollectionDialog::isCheckedAutoIndexid() const\n    {\n        return (_autoIndexCheckBox->checkState() == Qt::Checked);\n    }\n\n    bool CreateCollectionDialog::isCheckedUsePowerOfTwo() const\n    {\n        return (_usePowerOfTwoSizeCheckBox->checkState() == Qt::Checked);\n    }\n\n    bool CreateCollectionDialog::isCheckedNoPadding() const\n    {\n        return (_noPaddingCheckBox->checkState() == Qt::Checked);\n    }\n\n    void CreateCollectionDialog::accept()\n    {\n        if ( _inputEdit->text().isEmpty() \n            || !validateOptionDependencies()\n            || !validate(_storageEngineFrame, _storageEngineObj)\n            || !validate(_validatorFrame, _validatorObj) \n            || !validate(_indexOptionDefaultsFrame, _indexOptionDefaultsObj))\n        {\n            return;\n        }\n        \n        makeExtraOptionsObj();\n        saveWindowSettings();\n\n        QDialog::accept();\n    }\n\n    void CreateCollectionDialog::reject()\n    {\n        saveWindowSettings();\n        QDialog::reject();\n    }\n\n    void CreateCollectionDialog::closeEvent(QCloseEvent *event)\n    {\n        if (_advancedOptions->isVisible())\n        {\n            saveWindowSettings();\n        }\n        QWidget::closeEvent(event);\n    }\n\n    void CreateCollectionDialog::onFrameTextChanged()\n    {\n        _activeFrame->sciScintilla()->clearIndicatorRange(0, 0, _activeFrame->sciScintilla()->lines(), 40, 0);\n    }\n\n    void CreateCollectionDialog::onValidateButtonClicked()\n    {\n        validate(_activeFrame, *_activeObj, false);\n    }\n\n    void CreateCollectionDialog::enableCreateButton(const QString &text)\n    {\n        _buttonBox->button(QDialogButtonBox::Save)->setEnabled(!text.isEmpty());\n    }\n\n    void CreateCollectionDialog::onCappedCheckBoxChanged(int newState)\n    {\n        _sizeInputEdit->setEnabled((Qt::Checked == static_cast<Qt::CheckState>(newState)));\n        _maxDocNumberInputEdit->setEnabled((Qt::Checked == static_cast<Qt::CheckState>(newState)));\n    }\n\n    void CreateCollectionDialog::onTabChanged(int index)\n    {\n        if (OPTIONS_TAB == index) {    \n            _validateJsonButton->hide();\n        }\n        else {\n            _validateJsonButton->show();\n            if (STORAGE_ENGINE_TAB == index) {\n                _activeFrame = _storageEngineFrame;\n                _activeObj = &_storageEngineObj;\n            }\n            else if (VALIDATOR_TAB == index) {\n                _activeFrame = _validatorFrame;\n                _activeObj = &_validatorObj;\n            }\n            else if (INDEX_OPTION_DEFAULTS_TAB == index) {\n                _activeFrame = _indexOptionDefaultsFrame;\n                _activeObj = &_indexOptionDefaultsObj;\n            }\n        }\n    };\n\n    void CreateCollectionDialog::onAdvancedButtonToggled(bool state)\n    {\n        _advancedOptions->setVisible(state);\n        if (state)  // resize, dialog is expanding\n        {\n            setMinimumSize(560, 440);\n            _validateJsonButton->setHidden(_advancedOptions->currentIndex() == OPTIONS_TAB);\n            QSettings settings(\"3T\", \"Robomongo\");\n            if (settings.contains(\"CreateCollectionDialog/size\"))\n            {\n                restoreWindowSettings();\n            }\n            else\n            {\n                resize(560, 440);\n                adjustSize();\n            }\n        }\n        else        // resize, dialog is shrinking\n        {\n            saveWindowSettings();       // save expanded geometry first\n            _validateJsonButton->hide();\n            setFixedSize(300, 150);\n            adjustSize();\n        }\n    }\n\n    Indicator *CreateCollectionDialog::createDatabaseIndicator(const QString &database)\n    {\n        return new Indicator(GuiRegistry::instance().databaseIcon(), database);\n    }\n\n    Indicator *CreateCollectionDialog::createCollectionIndicator(const QString &collection)\n    {\n        return new Indicator(GuiRegistry::instance().collectionIcon(), collection);\n    }\n\n    QWidget* CreateCollectionDialog::createOptionsTab()\n    {\n        QWidget *optionsTab = new QWidget(this);\n\n        _cappedCheckBox = new QCheckBox(tr(\"Create capped collection\"), optionsTab);\n        _sizeInputLabel = new QLabel(tr(\"Maximum size in bytes: \"));\n        _sizeInputLabel->setContentsMargins(22, 0, 0, 0);\n        _sizeInputEdit = new QLineEdit();\n        _sizeInputEdit->setEnabled(false);\n        _maxDocNumberInputLabel = new QLabel(tr(\"Maximum number of documents: \"));\n        _maxDocNumberInputLabel->setContentsMargins(22, 0, 0, 0);\n        _maxDocNumberInputEdit = new QLineEdit();\n        _maxDocNumberInputEdit->setEnabled(false);\n        _autoIndexCheckBox = new QCheckBox(tr(\"Auto index _id\"), optionsTab);\n        _autoIndexCheckBox->setChecked(true);\n        _usePowerOfTwoSizeCheckBox = new QCheckBox(tr(\"Use power-of-2 sizes\"), optionsTab);\n        // Note: For mongodb 2.6 does not have storageEngine string due to the fact that it uses MMAPV1 only.\n        if (MongoDatabase::StorageEngineType::MMAPV1 == _storageEngine || \"\" == _storageEngine)\n        {\n            _usePowerOfTwoSizeCheckBox->setChecked(true);\n        }\n        _noPaddingCheckBox = new QCheckBox(tr(\"No Padding\"), optionsTab);\n\n        VERIFY(connect(_cappedCheckBox, SIGNAL(stateChanged(int)),\n            this, SLOT(onCappedCheckBoxChanged(int))));\n\n        QGridLayout *layout = new QGridLayout;\n        layout->addWidget(_cappedCheckBox, 0, 0, 1, 2);\n        layout->addWidget(_sizeInputLabel, 1, 0);\n        layout->addWidget(_sizeInputEdit, 1, 1);\n        layout->addWidget(_maxDocNumberInputLabel, 2, 0);\n        layout->addWidget(_maxDocNumberInputEdit, 2, 1);\n        layout->addWidget(_autoIndexCheckBox, 3, 0);\n        layout->addWidget(_usePowerOfTwoSizeCheckBox, 4, 0);\n        layout->addWidget(_noPaddingCheckBox, 5, 0);\n        layout->setAlignment(Qt::AlignTop);\n        optionsTab->setLayout(layout);\n\n        return optionsTab;\n    }\n\n    QWidget* CreateCollectionDialog::createStorageEngineTab()\n    {\n        QWidget *storageEngineTab = new QWidget(this);\n\n        _storageEngineFrameLabel = new QLabel(tr(\"Enter the configuration for the storage engine: \"));\n        _storageEngineFrame = new JSONFrame(this);\n        configureFrameText(_storageEngineFrame);\n        _storageEngineFrame->sciScintilla()->setText(\"{\\n    \\n}\");\n        // clear modification state after setting the content\n        _storageEngineFrame->sciScintilla()->setModified(false);\n        VERIFY(connect(_storageEngineFrame->sciScintilla(), SIGNAL(textChanged()),\n            this, SLOT(onFrameTextChanged())));\n\n        QGridLayout *layout = new QGridLayout;\n        layout->addWidget(_storageEngineFrameLabel, 0, 0);\n        layout->addWidget(_storageEngineFrame, 1, 0);\n        layout->setAlignment(Qt::AlignTop);\n        storageEngineTab->setLayout(layout);\n\n        return storageEngineTab;\n    }\n\n    QWidget* CreateCollectionDialog::createValidatorTab()\n    {\n        QWidget *validatorEngineTab = new QWidget(this);\n\n        _validatorLevelLabel = new QLabel(tr(\"Validation Level: \"));\n        _validatorLevelComboBox = new QComboBox();\n        _validatorLevelComboBox->addItem(tr(\"off\"));\n        _validatorLevelComboBox->addItem(tr(\"strict\"));\n        _validatorLevelComboBox->addItem(tr(\"moderate\"));\n        _validatorLevelComboBox->setCurrentIndex(1);\n\n        _validatorActionLabel = new QLabel(tr(\"Validation Action: \"));\n        _validatorActionComboBox = new QComboBox();\n        _validatorActionComboBox->addItem(tr(\"error\"));\n        _validatorActionComboBox->addItem(tr(\"warn\"));\n        _validatorActionComboBox->setCurrentIndex(0);\n\n        _validatorFrameLabel = new QLabel(tr(\"Enter the validator document for this collection: \"));\n        _validatorFrame = new JSONFrame(this);\n        configureFrameText(_validatorFrame);\n        _validatorFrame->sciScintilla()->setText(\"{\\n    \\n}\");\n        // clear modification state after setting the content\n        _validatorFrame->sciScintilla()->setModified(false);\n        VERIFY(connect(_validatorFrame->sciScintilla(), SIGNAL(textChanged()),\n            this, SLOT(onFrameTextChanged())));\n\n        QHBoxLayout *validationOptionslayout = new QHBoxLayout();\n        validationOptionslayout->addWidget(_validatorLevelLabel);\n        validationOptionslayout->addWidget(_validatorLevelComboBox, Qt::AlignLeft);\n        validationOptionslayout->addWidget(_validatorActionLabel);\n        validationOptionslayout->addWidget(_validatorActionComboBox, Qt::AlignLeft);\n\n        QVBoxLayout *vlayout = new QVBoxLayout();\n        vlayout->addWidget(_validatorFrameLabel);\n        vlayout->addWidget(_validatorFrame);\n\n        QVBoxLayout *layout = new QVBoxLayout();\n        layout->addLayout(validationOptionslayout);\n        layout->addLayout(vlayout);\n        validatorEngineTab->setLayout(layout);\n\n        return validatorEngineTab;\n    }\n\n    QWidget* CreateCollectionDialog::createIndexOptionDefaultsTab()\n    {\n        QWidget *indexOptionDefaultsTab = new QWidget(this);\n\n        _indexOptionDefaultsFrameLabel = new QLabel(tr(\"Enter a default configuration for indexes when creating a collection: \"));\n        _indexOptionDefaultsFrame = new JSONFrame(this);\n        configureFrameText(_indexOptionDefaultsFrame);\n        _indexOptionDefaultsFrame->sciScintilla()->setText(\"{\\n    \\n}\");\n        // clear modification state after setting the content\n        _indexOptionDefaultsFrame->sciScintilla()->setModified(false);\n        VERIFY(connect(_indexOptionDefaultsFrame->sciScintilla(), SIGNAL(textChanged()),\n            this, SLOT(onFrameTextChanged())));\n\n        QGridLayout *layout = new QGridLayout;\n        layout->addWidget(_indexOptionDefaultsFrameLabel, 0, 0);\n        layout->addWidget(_indexOptionDefaultsFrame, 1, 0);\n        layout->setAlignment(Qt::AlignTop);\n        indexOptionDefaultsTab->setLayout(layout);\n\n        return indexOptionDefaultsTab;\n    }\n\n    void CreateCollectionDialog::saveWindowSettings() const\n    {\n        QSettings settings(\"3T\", \"Robomongo\");\n        settings.setValue(\"CreateCollectionDialog/size\", size());\n    }\n\n    void CreateCollectionDialog::restoreWindowSettings()\n    {\n        QSettings settings(\"3T\", \"Robomongo\");\n        resize(settings.value(\"CreateCollectionDialog/size\").toSize());\n    }\n\n    void CreateCollectionDialog::configureFrameText(JSONFrame* frame)\n    {\n        QsciLexerJavaScript *javaScriptLexer = new JSLexer(this);\n        QFont font = GuiRegistry::instance().font();\n        javaScriptLexer->setFont(font);\n        frame->sciScintilla()->setBraceMatching(QsciScintilla::StrictBraceMatch);\n        frame->sciScintilla()->setFont(font);\n        frame->sciScintilla()->setPaper(QColor(255, 0, 0, 127));\n        frame->sciScintilla()->setLexer(javaScriptLexer);\n        frame->sciScintilla()->setWrapMode((QsciScintilla::WrapMode)QsciScintilla::SC_WRAP_WORD);\n        frame->sciScintilla()->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);\n        frame->sciScintilla()->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);\n        frame->sciScintilla()->setStyleSheet(\"QFrame { background-color: rgb(73, 76, 78); border: 1px solid #c7c5c4; border-radius: 4px; margin: 0px; padding: 0px;}\");\n    }\n\n    bool CreateCollectionDialog::validate(JSONFrame* frame, mongo::BSONObj& bsonObj, bool silentOnSuccess /* = true */)\n    {\n        try {\n            bsonObj = mongo::Robomongo::fromjson(jsonText(frame).toStdString());\n        }\n        catch (const mongo::Robomongo::ParseMsgAssertionException &ex) {\n            // v0.9\n            QString message = QtUtils::toQString(ex.reason());\n            int offset = ex.offset();\n\n            int line = 0, pos = 0;\n            frame->sciScintilla()->lineIndexFromPosition(offset, &line, &pos);\n            frame->sciScintilla()->setCursorPosition(line, pos);\n\n            int lineHeight = frame->sciScintilla()->lineLength(line);\n            frame->sciScintilla()->fillIndicatorRange(line, pos, line, lineHeight, 0);\n\n            message = QString(tr(\"Unable to parse JSON:<br /> <b>%1</b>, at (%2, %3).\"))\n                .arg(message).arg(line + 1).arg(pos + 1);\n\n            QMessageBox::critical(NULL, tr(\"Parsing error\"), message);\n            frame->setFocus();\n            activateWindow();\n            return false;\n        }\n\n        if (!silentOnSuccess) {\n            QMessageBox::information(NULL, tr(\"Validation\"), tr(\"JSON is valid!\"));\n            frame->setFocus();\n            activateWindow();\n        }\n\n        return true;\n    }\n\n    void CreateCollectionDialog::makeExtraOptionsObj()\n    {\n        mongo::BSONObjBuilder builder;\n\n        if (_autoIndexCheckBox->isEnabled()) builder.append(\"autoIndexId\", isCheckedAutoIndexid()); \n        if (_noPaddingCheckBox->isEnabled() && _usePowerOfTwoSizeCheckBox->isEnabled()) {\n            builder.append(\"flags\", (isCheckedNoPadding()*2 + isCheckedUsePowerOfTwo()*1));\n        }\n        else if (_noPaddingCheckBox->isEnabled()) {\n            builder.append(\"flags\", (isCheckedNoPadding()*2));\n        }\n        else if (_usePowerOfTwoSizeCheckBox->isEnabled()) {\n            builder.append(\"flags\", (isCheckedUsePowerOfTwo()*1));\n        }\n        if (_advancedOptions->isTabEnabled(STORAGE_ENGINE_TAB) ) {\n            validate(_storageEngineFrame, _storageEngineObj);\n            if(!_storageEngineObj.isEmpty()) builder.append(\"storageEngine\", _storageEngineObj);\n        }\n        if (_advancedOptions->isTabEnabled(VALIDATOR_TAB)) {\n            validate(_validatorFrame, _validatorObj);\n            if (!_validatorObj.isEmpty()) {\n                builder.append(\"validator\", _validatorObj);\n                builder.append(\"validationLevel\", _validatorLevelComboBox->currentText().toStdString());\n                builder.append(\"validationAction\", _validatorActionComboBox->currentText().toStdString());\n            }\n        }\n        if (_advancedOptions->isTabEnabled(INDEX_OPTION_DEFAULTS_TAB)) {\n            validate(_indexOptionDefaultsFrame, _indexOptionDefaultsObj);\n            if (!_indexOptionDefaultsObj.isEmpty()) builder.append(\"indexOptionDefaults\", _indexOptionDefaultsObj);\n        }\n        // Complete and get resulting BSONObj\n        _extraOptionsObj = builder.obj();\n    }\n\n    bool CreateCollectionDialog::validateOptionDependencies() const\n    {\n        bool result(false);\n        // Validate capped options\n        if (isCapped()) {\n            if (!(getSizeInputValue() > 0)) {\n                QMessageBox::critical(NULL, tr(\"Error\"), tr(\"Maximum size is required for capped collections\"));\n                return false;\n            }\n            result = true;\n        }\n        else {\n            result = true;\n        }\n\n        // Completed checking all dependendencies.\n        return result;\n    }\n    \n    void CreateCollectionDialog::disableUnsupportedOptions() const\n    {\n\n        // Handle WIRED_TIGER engine type\n        if (MongoDatabase::StorageEngineType::WIRED_TIGER == _storageEngine) {\n            disableOption(_usePowerOfTwoSizeCheckBox, USE_POWEROFTWO_HINT);\n            disableOption(_noPaddingCheckBox, NO_PADDING_HINT);\n            if (MongoDatabase::DBVersion::MONGODB_3_0 > _dbVersion) {\n                disableTab(STORAGE_ENGINE_TAB, STORAGE_ENGINE_TAB_HINT);\n            }\n        }\n        else {\n            disableTab(STORAGE_ENGINE_TAB, STORAGE_ENGINE_TAB_HINT);\n        }\n\n        // Handle MMAPV1 engine type\n        // Note: For mongodb 2.6 does not have storageEngine string due to the fact that it uses MMAPV1 only.\n        if (MongoDatabase::StorageEngineType::MMAPV1 == _storageEngine || \"\" == _storageEngine) {\n            if (MongoDatabase::DBVersion::MONGODB_3_0 < _dbVersion) {\n                _usePowerOfTwoSizeCheckBox->hide();\n            }\n            if (MongoDatabase::DBVersion::MONGODB_3_0 > _dbVersion) {\n                disableOption(_noPaddingCheckBox, NO_PADDING_HINT);\n            }\n        }\n\n        if (MongoDatabase::DBVersion::MONGODB_3_2 < _dbVersion) {\n            disableOption(_autoIndexCheckBox, AUTO_INDEXID_HINT);\n        }\n\n        if (MongoDatabase::DBVersion::MONGODB_3_0 > _dbVersion) {\n            disableTab(STORAGE_ENGINE_TAB, STORAGE_ENGINE_TAB_HINT);\n        }\n        if (MongoDatabase::DBVersion::MONGODB_3_2 > _dbVersion) {\n            disableTab(VALIDATOR_TAB, VALIDATOR_TAB_HINT);\n            disableTab(INDEX_OPTION_DEFAULTS_TAB, INDEX_OPTION_DEFAULTS_TAB_HINT);\n        }\n    }\n\n    void CreateCollectionDialog::disableOption(QWidget* option, const QString& hint) const\n    {\n        option->setDisabled(true);\n        option->setToolTip(hint);\n    }\n\n    void CreateCollectionDialog::disableTab(int index, const QString& hint) const\n    {\n        _advancedOptions->setTabEnabled(index, false);\n        _advancedOptions->setTabToolTip(index, hint);\n    }\n\n    void CreateCollectionDialog::setCursorPosition(int line, int column)\n    {\n        _activeFrame->sciScintilla()->setCursorPosition(line, column);\n    }\n\n    QString CreateCollectionDialog::jsonText(JSONFrame* frame) const\n    {\n        return frame->sciScintilla()->text().trimmed();\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/CreateCollectionDialog.h",
    "content": "#pragma once\n\n#include <mongo/bson/bsonobj.h>\n#include <QDialog>\n\nQT_BEGIN_NAMESPACE\nclass QLabel;\nclass QDialogButtonBox;\nclass QLineEdit;\nclass QTabWidget;\nclass QCheckBox;\nclass QComboBox;\nQT_END_NAMESPACE\nclass QsciScintilla;\n\nnamespace Robomongo\n{\n    class FindFrame;\n    class Indicator;\n\n    /**\n    * @brief This Dialog allows to create collection with selective options.\n    */\n    class CreateCollectionDialog : public QDialog\n    {\n        Q_OBJECT\n\n    public:\n        using JSONFrame = FindFrame;\n        \n        /**\n        * @brief Construct dialog with parameters\n        * @param serverName: Database name\n        * @param dbVersion: Database version\n        * @param storageEngine: Storage engine type\n        * @param database: Name of the database\n        * @param collection: Name of the collection\n        */\n        explicit CreateCollectionDialog(const QString &serverName, const float dbVersion, const std::string& storageEngine, \n            const QString &database = QString(), const QString &collection = QString(), QWidget *parent = 0);\n\n        /**\n        * @brief Used if dialog exec() method returns QDialog::Accepted \n        * @return Extra options as BSONObj\n        */\n        const mongo::BSONObj getExtraOptions() const;\n\n        /**\n        * @return Collection name\n        */\n        QString getCollectionName() const;\n\n        /**\n        * @return true if capped option checked, false otherwise\n        */\n        bool isCapped() const;\n\n        /**\n        * @return Size option input\n        */\n        long long getSizeInputValue() const;\n\n        /**\n        * @return Max number of documents option input\n        */\n        int getMaxDocNumberInputValue() const;\n\n        /**\n        * @return true if auto index_id option checked, false otherwise\n        */\n        bool isCheckedAutoIndexid() const;\n        \n        /**\n        * @return true if use power-of-2 sizes option checked, false otherwise\n        */\n        bool isCheckedUsePowerOfTwo() const;\n        \n        /**\n        * @return true if no padding option checked, false otherwise\n        */\n        bool isCheckedNoPadding() const;\n\n    public Q_SLOTS:\n        /**\n        * @brief Validate all input fields and make extraOptions object if all valid when create button clicked.\n        */\n        void accept() override;\n\n        /**\n        * @brief Called when \"Cancel\" button clicked.\n        */\n        void reject() override;\n\n    protected:\n        /**\n        * @brief Reimplementing closeEvent in order to do implement functionalities before close this dialog.\n        */\n        void closeEvent(QCloseEvent *event) override;\n\n    private Q_SLOTS:\n        /**\n        * @brief Set indicator position when active JSON frame text changed\n        */\n        void onFrameTextChanged();\n\n        /**\n        * @brief Validate active JSON frame text when validate button clicked\n        */\n        void onValidateButtonClicked();\n\n        /**\n        * @brief Enable create button if input edit has text\n        * @param text : string from _inputEdit widget\n        */\n        void enableCreateButton(const QString &text);\n\n        /**\n        * @brief Enable/disable capped options when capped checkbox state changed\n        * @param newState : New state of capped checkbox\n        */\n        void onCappedCheckBoxChanged(int newState);\n\n        /**\n        * @brief Show/hide validate JSON button, update active JSON frame and object according to active tab\n        * @param Index of active tab (i.e. index = 0 for the first tab)\n        */\n        void onTabChanged(int index);\n\n        /**\n        * @brief Show/hide advanced options menu (_tabwidget) when advancedButton toggled.\n        * @param state : true if dialog is expanding, false if shrinking.\n        */\n        void onAdvancedButtonToggled(bool state);\n\n    private:\n        /**\n        * @brief Tool tip strings for disabled options and tabs\n        */\n        static const QString STORAGE_ENGINE_TAB_HINT;\n        static const QString VALIDATOR_TAB_HINT;\n        static const QString INDEX_OPTION_DEFAULTS_TAB_HINT;\n        static const QString NO_PADDING_HINT;\n        static const QString USE_POWEROFTWO_HINT;\n        static const QString AUTO_INDEXID_HINT;\n\n        /**\n        * @brief Create database indicator widget\n        * @param database : Name of the database\n        * @return : Pointer to newly created Indicator\n        */\n        Indicator* createDatabaseIndicator(const QString &database);\n\n        /**\n        * @brief Create collection indicator widget\n        * @param database : Name of the collection\n        * @return : Pointer to newly created Indicator\n        */\n        Indicator* createCollectionIndicator(const QString &collection);\n\n        /**\n        * @brief Creators for the tabs\n        * @return : Pointer to newly created tab\n        */\n        QWidget* createOptionsTab();\n        QWidget* createStorageEngineTab();\n        QWidget* createValidatorTab();\n        QWidget* createIndexOptionDefaultsTab();\n\n        /**\n        * @brief Save windows settings into system registry\n        */\n        void saveWindowSettings() const;\n        /**\n        * @brief Restore windows settings from system registry\n        */\n        void restoreWindowSettings();\n\n        /**\n        * @brief Do initial configuration of given JSON frame.\n        * @param frame : Pointer to newly created tab\n        */\n        void configureFrameText(JSONFrame* frame);\n\n        /**\n        * @brief Build extraOptions BSON Object\n        */ \n        void makeExtraOptionsObj();\n        \n        /**\n        * @brief Validate dependencies and requirements between all inputs\n        * @return : true if all options valid, false at least one dependency not met\n        */\n        bool validateOptionDependencies() const;\n\n        /**\n        * @brief Disable options if they are not supported by database version or storage engine type\n        */\n        void disableUnsupportedOptions() const;\n\n        /**\n        * @brief Disable widget if unsupported\n        * @param option : Widget to disable\n        * @param hint : Hint string to be shown\n        */\n        void disableOption(QWidget* option, const QString& hint) const;\n        \n        /**\n        * @brief Disable tab if unsupported\n        * @param index : Tab index\n        * @param hint : Hint string to be shown\n        */\n        void disableTab(int index, const QString& hint) const;\n\n        /**\n        * @brief Set cursor position of the active JSON frame\n        * @param line :  Line number \n        * @param column : Column number\n        */\n        void setCursorPosition(int line, int column);\n\n        /**\n        * @return : String from given JSON frame\n        * @param frame : Pointer to JSON frame\n        */\n        QString jsonText(JSONFrame* frame) const;\n\n        /**\n        * @brief Do JSON validation/creation for given frame text\n        * @param frame : Pointer to JSON frame\n        * @param bsonObj : BSON object to be validated\n        * @param silentOnSuccess : true for silent validation, false for message box on validation\n        * @return true if text is valid JSON, false otherwise\n        */\n        bool validate(JSONFrame* frame, mongo::BSONObj& bsonObj, bool silentOnSuccess = true);\n\n        /**\n        * @brief Main Window \n        */\n        QLineEdit *_inputEdit;\n        QLabel *_inputLabel;\n        QTabWidget *_advancedOptions;\n        QPushButton *_validateJsonButton;\n        QDialogButtonBox *_buttonBox;\n        QPushButton *_advancedButton;\n\n        /**\n        * @brief Options Tab\n        */\n        QCheckBox *_cappedCheckBox;\n        QLabel *_sizeInputLabel;\n        QLineEdit *_sizeInputEdit;\n        QLabel *_maxDocNumberInputLabel;\n        QLineEdit *_maxDocNumberInputEdit;\n        QCheckBox *_autoIndexCheckBox;\n        QCheckBox *_usePowerOfTwoSizeCheckBox;\n        QCheckBox *_noPaddingCheckBox;\n        /**\n        * @brief Storage Engine Tab\n        */\n        JSONFrame *_storageEngineFrame;\n        QLabel * _storageEngineFrameLabel;\n        /**\n        * @brief Validator Tab\n        */\n        QLabel * _validatorLevelLabel;\n        QComboBox * _validatorLevelComboBox;\n        QLabel * _validatorActionLabel;\n        QComboBox * _validatorActionComboBox;\n        JSONFrame *_validatorFrame;\n        QLabel * _validatorFrameLabel;\n        /**\n        * @brief Index Options Defaults Tab\n        */\n        JSONFrame *_indexOptionDefaultsFrame;\n        QLabel * _indexOptionDefaultsFrameLabel;\n\n        /**\n        * @brief Pointer to active tab's frame\n        */\n        JSONFrame *_activeFrame;         \n\n        /**\n        * @brief Pointer to active tab's BSON obj.\n        */\n        mongo::BSONObj *_activeObj;\n\n        /**\n        * @brief Main BSON obj. with all extra options\n        */\n        mongo::BSONObj _extraOptionsObj;\n\n        /**\n        * @brief Sub objects for each JSON tab to create extraOptions object finally.\n        */\n        mongo::BSONObj _storageEngineObj;\n        mongo::BSONObj _validatorObj;\n        mongo::BSONObj _indexOptionDefaultsObj;\n\n        /**\n        * @brief Database version\n        */\n        const float _dbVersion;\n\n        /**\n        * @brief Storage engine type\n        */\n        const std::string _storageEngine;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp",
    "content": "#include \"robomongo/gui/dialogs/CreateDatabaseDialog.h\"\n\n#include <QPushButton>\n#include <QHBoxLayout>\n#include <QVBoxLayout>\n#include <QLineEdit>\n#include <QLabel>\n#include <QDialogButtonBox>\n\n#include \"robomongo/gui/widgets/workarea/IndicatorLabel.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace Robomongo\n{\n    const QSize CreateDatabaseDialog::dialogSize = QSize(300, 150);\n\n    CreateDatabaseDialog::CreateDatabaseDialog(const QString &serverName, const QString &database,\n                                               const QString &collection, QWidget *parent) :\n        QDialog(parent)\n    {\n        setWindowTitle(\"Create Database\");\n        setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); // Remove help button (?)\n        //setFixedSize(dialogSize);\n        setMinimumWidth(300);\n\n        Indicator *serverIndicator = new Indicator(GuiRegistry::instance().serverIcon(), serverName);\n\n        QFrame *hline = new QFrame();\n        hline->setFrameShape(QFrame::HLine);\n        hline->setFrameShadow(QFrame::Sunken);\n\n        _inputEdit = new QLineEdit();\n        _inputLabel = new QLabel(\"Database Name:\");\n        _inputEdit->setMaxLength(maxLenghtName);\n\n        _buttonBox = new QDialogButtonBox(this);\n        _buttonBox->setOrientation(Qt::Horizontal);\n        _buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Save);\n        _buttonBox->button(QDialogButtonBox::Save)->setText(\"C&reate\");\n        VERIFY(connect(_buttonBox, SIGNAL(accepted()), this, SLOT(accept())));\n        VERIFY(connect(_buttonBox, SIGNAL(rejected()), this, SLOT(reject())));\n\n        QHBoxLayout *hlayout = new QHBoxLayout();\n        hlayout->addStretch(1);\n        hlayout->addWidget(_buttonBox);\n\n        QHBoxLayout *vlayout = new QHBoxLayout();\n        if (!serverName.isEmpty())\n            vlayout->addWidget(serverIndicator, 0, Qt::AlignLeft);\n        if (!database.isEmpty())\n            vlayout->addWidget(createDatabaseIndicator(database), 0, Qt::AlignLeft);\n        if (!collection.isEmpty())\n            vlayout->addWidget(createCollectionIndicator(collection), 0, Qt::AlignLeft);\n\n        QVBoxLayout *namelayout = new QVBoxLayout();\n        namelayout->setContentsMargins(0, 7, 0, 7);\n        namelayout->addWidget(_inputLabel);\n        namelayout->addWidget(_inputEdit);\n\n        QVBoxLayout *layout = new QVBoxLayout();\n        layout->addLayout(vlayout);\n        layout->addWidget(hline);\n        layout->addLayout(namelayout);\n        layout->addLayout(hlayout);\n        setLayout(layout);\n\n        _inputEdit->setFocus();\n    }\n\n    QString CreateDatabaseDialog::databaseName() const\n    {\n        return _inputEdit->text();\n    }\n\n    void CreateDatabaseDialog::setOkButtonText(const QString &text)\n    {\n        _buttonBox->button(QDialogButtonBox::Save)->setText(text);\n    }\n\n    void CreateDatabaseDialog::setInputLabelText(const QString &text)\n    {\n        _inputLabel->setText(text);\n    }\n\n    void CreateDatabaseDialog::setInputText(const QString &text)\n    {\n        _inputEdit->setText(text);\n        _inputEdit->selectAll();\n    }\n\n    void CreateDatabaseDialog::accept()\n    {\n        if (_inputEdit->text().isEmpty())\n            return;\n\n        QDialog::accept();\n    }\n\n    Indicator *CreateDatabaseDialog::createDatabaseIndicator(const QString &database)\n    {\n        return new Indicator(GuiRegistry::instance().databaseIcon(), database);\n    }\n\n    Indicator *CreateDatabaseDialog::createCollectionIndicator(const QString &collection)\n    {\n        return new Indicator(GuiRegistry::instance().collectionIcon(), collection);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/CreateDatabaseDialog.h",
    "content": "#pragma once\n\n#include <QDialog>\nQT_BEGIN_NAMESPACE\nclass QLabel;\nclass QDialogButtonBox;\nclass QLineEdit;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class Indicator;\n\n    class CreateDatabaseDialog : public QDialog\n    {\n        Q_OBJECT\n\n    public:\n        explicit CreateDatabaseDialog(const QString &serverName,\n                                      const QString &database = QString(),\n                                      const QString &collection = QString(), QWidget *parent = 0);\n        QString databaseName() const;\n        void setOkButtonText(const QString &text);\n        void setInputLabelText(const QString &text);\n        void setInputText(const QString &text);\n        enum { maxLenghtName = 60 };\n        const static QSize dialogSize;\n\n    public Q_SLOTS:\n        virtual void accept();\n\n    private:\n        Indicator *createDatabaseIndicator(const QString &database);\n        Indicator *createCollectionIndicator(const QString &collection);\n        QLineEdit *_inputEdit;\n        QLabel *_inputLabel;\n        QDialogButtonBox *_buttonBox;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/CreateUserDialog.cpp",
    "content": "#include \"robomongo/gui/dialogs/CreateUserDialog.h\"\n\n#include <QHBoxLayout>\n#include <QPushButton>\n#include <QCheckBox>\n#include <QDialogButtonBox>\n#include <QLabel>\n#include <QLineEdit>\n#include <QMessageBox>\n#include <QComboBox>\n\n#include \"robomongo/gui/widgets/workarea/IndicatorLabel.h\"\n#include \"robomongo/gui/utils/ComboBoxUtils.h\"\n#include \"robomongo/core/domain/MongoUtils.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n\nnamespace Robomongo\n{\n    const char * rolesText[CreateUserDialog::RolesCount] = {\n        \"read\",\n        \"readWrite\",\n        \"dbAdmin\",\n        \"userAdmin\",\n        \"clusterAdmin\",\n        \"readAnyDatabase\",\n        \"readWriteAnyDatabase\",\n        \"userAdminAnyDatabase\",\n        \"dbAdminAnyDatabase\"\n    };\n\n    const QSize CreateUserDialog::minimumSize = QSize(400, 200);\n\n    bool containsWord(const std::string& sentence, const std::string& word)\n    {\n        size_t pos = 0;\n        while ((pos = sentence.substr(pos).find(word)) != std::string::npos) {\n            if (pos + word.size() < sentence.size()) {\n                char c = sentence[pos + word.size()];\n                bool isLastAlpha = isalpha(c);\n                bool isFirstAlpha = false;\n                if (pos) {\n                    isFirstAlpha = isalpha(sentence[pos - 1]);\n                }\n                if (!isFirstAlpha && !isLastAlpha)\n                    return true;\n            }\n            pos++;\n        }\n        return false;\n    }\n\n    CreateUserDialog::CreateUserDialog(const QStringList &databases, const QString &serverName,\n                                       const QString &database, const MongoUser &user,\n                                       QWidget *parent) : QDialog(parent),\n        _user(user)\n    {\n        setWindowTitle(\"Add User\");\n        setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); // Remove help button (?)\n        setMinimumSize(minimumSize);\n\n        Indicator *serverIndicator = new Indicator(GuiRegistry::instance().serverIcon(), serverName);\n        Indicator *databaseIndicator = new Indicator(GuiRegistry::instance().databaseIcon(), database);\n\n        QFrame *hline = new QFrame();\n        hline->setFrameShape(QFrame::HLine);\n        hline->setFrameShadow(QFrame::Sunken);\n\n        _userNameLabel = new QLabel(\"Name:\");\n        _userNameEdit = new QLineEdit();\n        _userNameEdit->setText(QtUtils::toQString(user.name()));\n        _userPassLabel = new QLabel(\"Password:\");\n        _userPassEdit = new QLineEdit();\n        _userPassEdit->setEchoMode(QLineEdit::Password);\n        _userSourceLabel = new QLabel(\"UserSource:\");\n        _userSourceComboBox = new QComboBox();\n        _userSourceComboBox->addItems(QStringList() << databases); //setText(QtUtils::toQString(user.userSource()));    \n        _userSourceComboBox->setCurrentIndex(databases.indexOf(database));\n        utils::setCurrentText(_userSourceComboBox, QtUtils::toQString(user.userSource()));\n\n        QGridLayout *gridRoles = new QGridLayout();\n        MongoUser::RolesVector userRoles = user.roles();\n        for (unsigned i = 0; i<RolesCount; ++i)\n        {\n            int row = i%3;\n            int col = i/3;\n            _rolesArray[i] = new QCheckBox(rolesText[i], this);\n            MongoUser::RolesVector::const_iterator it = std::find(userRoles.begin(), userRoles.end(), rolesText[i]);\n            _rolesArray[i]->setChecked(it!= userRoles.end());\n            gridRoles->addWidget(_rolesArray[i], row, col);\n        }\n\n        QDialogButtonBox *buttonBox = new QDialogButtonBox(this);\n        buttonBox->setOrientation(Qt::Horizontal);\n        buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Save);\n        VERIFY(connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())));\n        VERIFY(connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())));\n\n        QHBoxLayout *hlayout = new QHBoxLayout();\n        hlayout->addStretch(1);\n        hlayout->addWidget(buttonBox);\n\n        QHBoxLayout *vlayout = new QHBoxLayout();\n        vlayout->addWidget(serverIndicator, 0, Qt::AlignLeft);\n        vlayout->addWidget(databaseIndicator, 0, Qt::AlignLeft);\n        vlayout->addStretch(1);\n\n        QGridLayout *namelayout = new QGridLayout();\n        namelayout->setContentsMargins(0, 7, 0, 7);\n        namelayout->addWidget(_userNameLabel, 0, 0);\n        namelayout->addWidget(_userNameEdit,  0, 1);\n        namelayout->addWidget(_userPassLabel, 1, 0);\n        namelayout->addWidget(_userPassEdit,  1, 1);\n        namelayout->addWidget(_userSourceLabel, 2, 0);\n        namelayout->addWidget(_userSourceComboBox,  2, 1);\n        namelayout->addLayout(gridRoles,  3, 1);\n\n        QVBoxLayout *layout = new QVBoxLayout();\n        layout->addLayout(vlayout);\n        layout->addWidget(hline);\n        layout->addLayout(namelayout);\n        layout->addLayout(hlayout);\n        setLayout(layout);\n\n        _userNameEdit->setFocus();\n    }\n\n    CreateUserDialog::CreateUserDialog(const QString &serverName,\n        const QString &database, const MongoUser &user,\n        QWidget *parent) : QDialog(parent),\n        _user(user)\n    {\n        setWindowTitle(\"Add User\");\n        setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); // Remove help button (?)\n        setMinimumSize(minimumSize);\n\n        Indicator *serverIndicator = new Indicator(GuiRegistry::instance().serverIcon(), serverName);\n        Indicator *databaseIndicator = new Indicator(GuiRegistry::instance().databaseIcon(), database);\n\n        QFrame *hline = new QFrame();\n        hline->setFrameShape(QFrame::HLine);\n        hline->setFrameShadow(QFrame::Sunken);\n\n        _userNameLabel = new QLabel(\"Name:\");\n        _userNameEdit = new QLineEdit();\n        _userNameEdit->setText(QtUtils::toQString(user.name()));\n        _userPassLabel= new QLabel(\"Password:\");\n        _userPassEdit = new QLineEdit();\n        _userPassEdit->setEchoMode(QLineEdit::Password);\n        _readOnlyCheckBox = new QCheckBox(\"Read Only\");\n        _readOnlyCheckBox->setChecked(user.readOnly());\n\n        QDialogButtonBox *buttonBox = new QDialogButtonBox(this);\n        buttonBox->setOrientation(Qt::Horizontal);\n        buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Save);\n        VERIFY(connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())));\n        VERIFY(connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())));\n\n        QHBoxLayout *hlayout = new QHBoxLayout();\n        hlayout->addStretch(1);\n        hlayout->addWidget(buttonBox);\n\n        QHBoxLayout *vlayout = new QHBoxLayout();\n        vlayout->addWidget(serverIndicator, 0, Qt::AlignLeft);\n        vlayout->addWidget(databaseIndicator, 0, Qt::AlignLeft);\n        vlayout->addStretch(1);\n\n        QGridLayout *namelayout = new QGridLayout();\n        namelayout->setContentsMargins(0, 7, 0, 7);\n        namelayout->addWidget(_userNameLabel, 0, 0);\n        namelayout->addWidget(_userNameEdit, 0, 1);\n        namelayout->addWidget(_userPassLabel, 1, 0);\n        namelayout->addWidget(_userPassEdit, 1, 1);\n        namelayout->addWidget(_readOnlyCheckBox, 2, 1);\n\n        QVBoxLayout *layout = new QVBoxLayout();\n        layout->addLayout(vlayout);\n        layout->addWidget(hline);\n        layout->addLayout(namelayout);\n        layout->addLayout(hlayout);\n        setLayout(layout);\n\n        _userNameEdit->setFocus();\n    }\n\n    void CreateUserDialog::setUserPasswordLabelText(const QString &text)\n    {\n        _userPassLabel->setText(text);\n    }\n\n    void CreateUserDialog::accept()\n    {\n        std::string username = QtUtils::toStdString(_userNameEdit->text());\n        std::string pass = QtUtils::toStdString(_userPassEdit->text());\n        if (_user.version() < MongoUser::minimumSupportedVersion) {\n            if (username.empty() || pass.empty())\n                return;\n\n            _user.setName(username);\n            _user.setPassword(pass);\n            _user.setReadOnly(_readOnlyCheckBox->isChecked());\n        }\n        else {\n            std::string userSource = QtUtils::toStdString(_userSourceComboBox->currentText());\n\n            if (username.empty())\n                return;\n\n            if (userSource.empty() && pass.empty())\n                return;\n\n            _user.setName(username);        \n            _user.setPassword(pass);\n            _user.setUserSource(userSource);\n\n            MongoUser::RolesVector roles;\n            for (unsigned i = 0; i < RolesCount; ++i) {\n                if (_rolesArray[i]->isChecked()) {\n                    roles.push_back(rolesText[i]);\n                }\n            }\n            _user.setRoles(roles);\n        }\n\n        QDialog::accept();\n    }\n    \n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/CreateUserDialog.h",
    "content": "#pragma once\n\n#include <QDialog>\nQT_BEGIN_NAMESPACE\nclass QTextEdit;\nclass QLabel;\nclass QCheckBox;\nclass QLineEdit;\nclass QComboBox;\nQT_END_NAMESPACE\n\n#include \"robomongo/core/domain/MongoUser.h\"\n\nnamespace Robomongo\n{\n    class CreateUserDialog : public QDialog\n    {\n        Q_OBJECT\n\n    public:\n        static const QSize minimumSize;\n\n        CreateUserDialog(const QStringList &databases, const QString &serverName,\n                         const QString &database,\n                         const MongoUser &user,\n                         QWidget *parent = 0);\n\n        CreateUserDialog(const QString &serverName,\n            const QString &database,\n            const MongoUser &user,\n            QWidget *parent = 0);\n\n        MongoUser user() const { return _user; }\n        void setUserPasswordLabelText(const QString &text);\n        enum { RolesCount = 9};\n\n    public Q_SLOTS:\n        virtual void accept();\n\n    private:\n        MongoUser _user;\n\n        QLabel *_userNameLabel;\n        QLineEdit *_userNameEdit;\n        QLabel *_userPassLabel;\n        QLineEdit *_userPassEdit;\n        QLabel *_userSourceLabel;\n        QComboBox *_userSourceComboBox;\n        QCheckBox *_readOnlyCheckBox;\n        QCheckBox *_rolesArray[RolesCount];\n    };\n}\n\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/DocumentTextEditor.cpp",
    "content": "#include \"robomongo/gui/dialogs/DocumentTextEditor.h\"\n\n#include <QApplication>\n#include <QHBoxLayout>\n#include <QPushButton>\n#include <QMessageBox>\n#include <QDialogButtonBox>\n#include <QDesktopWidget>\n#include <QSettings>\n#include <Qsci/qscilexerjavascript.h>\n\n#include <mongo/client/dbclient_base.h>\n\n#include \"robomongo/gui/editors/JSLexer.h\"\n#include \"robomongo/gui/editors/FindFrame.h\"\n#include \"robomongo/gui/editors/PlainJavaScriptEditor.h\"\n#include \"robomongo/gui/widgets/workarea/IndicatorLabel.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/shell/bson/json.h\"\n\n\nnamespace Robomongo\n{\n    const QSize DocumentTextEditor::minimumSize = QSize(800, 400);\n\n    DocumentTextEditor::DocumentTextEditor(const CollectionInfo &info, const QString &json, bool readonly /* = false */, QWidget *parent) :\n        QDialog(parent),\n        _info(info),\n        _readonly(readonly)\n    {\n        QRect screenGeometry = QApplication::desktop()->availableGeometry();\n        int horizontalMargin = (int)(screenGeometry.width() * 0.35);\n        int verticalMargin = (int)(screenGeometry.height() * 0.20);\n        QSize size(screenGeometry.width() - horizontalMargin,\n                   screenGeometry.height() - verticalMargin);\n\n        QSettings settings(\"3T\", \"Robomongo\");\n        if (settings.contains(\"DocumentTextEditor/size\"))\n        {\n            restoreWindowSettings();\n        }\n        else\n        {\n            resize(size);\n        }\n\n        setWindowFlags(Qt::Window | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint);\n\n        Indicator *collectionIndicator = new Indicator(GuiRegistry::instance().collectionIcon(), QtUtils::toQString(_info._ns.collectionName()));\n        Indicator *databaseIndicator = new Indicator(GuiRegistry::instance().databaseIcon(), QtUtils::toQString(_info._ns.databaseName()));\n        Indicator *serverIndicator = new Indicator(GuiRegistry::instance().serverIcon(), QtUtils::toQString(detail::prepareServerAddress(_info._serverAddress)));\n\n        QPushButton *validate = new QPushButton(\"Validate\");\n        validate->setIcon(qApp->style()->standardIcon(QStyle::SP_MessageBoxInformation));\n        VERIFY(connect(validate, SIGNAL(clicked()), this, SLOT(onValidateButtonClicked())));\n\n        _queryText = new FindFrame(this);\n        _configureQueryText();\n        _queryText->sciScintilla()->setText(json);\n        // clear modification state after setting the content\n        _queryText->sciScintilla()->setModified(false);\n\n        VERIFY(connect(_queryText->sciScintilla(), SIGNAL(textChanged()), this, SLOT(onQueryTextChanged())));\n\n        QHBoxLayout *hlayout = new QHBoxLayout();\n        hlayout->setContentsMargins(2, 0, 5, 1);\n        hlayout->setSpacing(0);\n        hlayout->addWidget(serverIndicator, 0, Qt::AlignLeft);\n        hlayout->addWidget(databaseIndicator, 0, Qt::AlignLeft);\n        hlayout->addWidget(collectionIndicator, 0, Qt::AlignLeft);\n        hlayout->addStretch(1);\n\n        QDialogButtonBox *buttonBox = new QDialogButtonBox (this);\n        buttonBox->setOrientation(Qt::Horizontal);\n        buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Save);\n        VERIFY(connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())));\n        VERIFY(connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())));\n\n        QHBoxLayout *bottomlayout = new QHBoxLayout();\n        bottomlayout->addWidget(validate);\n        bottomlayout->addStretch(1);\n        bottomlayout->addWidget(buttonBox);\n\n        QVBoxLayout *layout = new QVBoxLayout();\n\n        // show top bar only if we have info for it\n        if (_info.isValid())\n            layout->addLayout(hlayout);\n\n        layout->addWidget(_queryText);\n        layout->addLayout(bottomlayout);\n        setLayout(layout);\n\n        if (_readonly) {\n            validate->hide();\n            buttonBox->button(QDialogButtonBox::Save)->hide();\n            _queryText->sciScintilla()->setReadOnly(true);\n        }\n    }\n\n    QString DocumentTextEditor::jsonText() const\n    {\n        return _queryText->sciScintilla()->text().trimmed();\n    }\n\n    void DocumentTextEditor::setCursorPosition(int line, int column)\n    {\n        _queryText->sciScintilla()->setCursorPosition(line, column);\n    }\n\n    void DocumentTextEditor::accept()\n    {\n        if (!validate())\n            return;\n\n        saveWindowSettings();\n\n        QDialog::accept();\n    }\n\n    void DocumentTextEditor::reject()\n    {\n        if (_queryText->sciScintilla()->isModified()) {\n            int ret = QMessageBox::warning(this, tr(\"Robo 3T\"),\n                               tr(\"The document has been modified.\\n\"\n                                  \"Do you want to save your changes?\"),\n                               QMessageBox::Save | QMessageBox::Discard\n                               | QMessageBox::Cancel,\n                               QMessageBox::Save);\n\n            if (ret == QMessageBox::Save) {\n                this->accept();\n            } else if (ret == QMessageBox::Discard) {\n                QDialog::reject();\n            }\n\n            return;\n        }\n\n        saveWindowSettings();\n\n        QDialog::reject();\n    }\n\n    bool DocumentTextEditor::validate(bool silentOnSuccess /* = true */)\n    {\n        QString text = jsonText();\n        int len = 0;\n        try {\n            std::string textString = QtUtils::toStdString(text);\n            const char *json = textString.c_str();\n            int jsonLen = textString.length();\n            int offset = 0;\n            _obj.clear();\n            while (offset != jsonLen)\n            {\n                mongo::BSONObj doc = mongo::Robomongo::fromjson(json+offset, &len);\n                _obj.push_back(doc);\n                offset += len;\n            }\n        } catch (const mongo::Robomongo::ParseMsgAssertionException &ex) {\n//            v0.9\n            QString message = QtUtils::toQString(ex.reason());\n            int offset = ex.offset();\n\n            int line = 0, pos = 0;\n            _queryText->sciScintilla()->lineIndexFromPosition(offset, &line, &pos);\n            _queryText->sciScintilla()->setCursorPosition(line, pos);\n\n            int lineHeight = _queryText->sciScintilla()->lineLength(line);\n            _queryText->sciScintilla()->fillIndicatorRange(line, pos, line, lineHeight, 0);\n\n            message = QString(\"Unable to parse JSON:<br /> <b>%1</b>, at (%2, %3).\")\n                .arg(message).arg(line + 1).arg(pos + 1);\n\n            QMessageBox::critical(NULL, \"Parsing error\", message);\n            _queryText->setFocus();\n            activateWindow();\n            return false;\n        }\n\n        if (!silentOnSuccess) {\n            QMessageBox::information(NULL, \"Validation\", \"JSON is valid!\");\n            _queryText->setFocus();\n            activateWindow();\n        }\n\n        return true;\n    }\n\n    void DocumentTextEditor::onQueryTextChanged()\n    {\n        _queryText->sciScintilla()->clearIndicatorRange(0, 0, _queryText->sciScintilla()->lines(), 40, 0);\n    }\n\n    void DocumentTextEditor::onValidateButtonClicked()\n    {\n        validate(false);\n    }\n\n    void DocumentTextEditor::closeEvent(QCloseEvent *event)\n    {\n        saveWindowSettings();\n        QWidget::closeEvent(event);\n    }\n\n    /*\n    ** Configure QsciScintilla query widget\n    */\n    void DocumentTextEditor::_configureQueryText()\n    {\n        QsciLexerJavaScript *javaScriptLexer = new JSLexer(this);\n        QFont font = GuiRegistry::instance().font();\n        javaScriptLexer->setFont(font);\n        _queryText->sciScintilla()->setAppropriateBraceMatching();\n        _queryText->sciScintilla()->setFont(font);\n        _queryText->sciScintilla()->setPaper(QColor(255, 0, 0, 127));\n        _queryText->sciScintilla()->setLexer(javaScriptLexer);\n        _queryText->sciScintilla()->setWrapMode((QsciScintilla::WrapMode)QsciScintilla::SC_WRAP_WORD);\n        _queryText->sciScintilla()->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);\n        _queryText->sciScintilla()->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);\n\n        _queryText->sciScintilla()->setStyleSheet(\"QFrame { background-color: rgb(73, 76, 78); border: 1px solid #c7c5c4; border-radius: 4px; margin: 0px; padding: 0px;}\");\n    }\n\n    void DocumentTextEditor::saveWindowSettings() const\n    {\n        QSettings settings(\"3T\", \"Robomongo\");\n        settings.setValue(\"DocumentTextEditor/size\", size());\n    }\n\n    void DocumentTextEditor::restoreWindowSettings()\n    {\n        QSettings settings(\"3T\", \"Robomongo\");\n        resize(settings.value(\"DocumentTextEditor/size\").toSize());\n    }\n\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/DocumentTextEditor.h",
    "content": "#pragma once\n\n#include <QDialog>\n#include <mongo/bson/bsonobj.h>\n#include \"robomongo/core/domain/MongoQueryInfo.h\"\n\nnamespace Robomongo\n{\n    class FindFrame;\n\n    class DocumentTextEditor : public QDialog\n    {\n        Q_OBJECT\n\n    public:\n        typedef std::vector<mongo::BSONObj> ReturnType;\n        static const QSize minimumSize;\n\n        explicit DocumentTextEditor(const CollectionInfo &info, const QString &json, bool readonly = false, QWidget *parent = 0);\n\n        QString jsonText() const;\n\n        /**\n         * @brief Use returned BSONObj only if Dialog exec() method returns QDialog::Accepted\n         */\n        ReturnType bsonObj() const { return _obj; }\n\n        void setCursorPosition(int line, int column);\n\n    public Q_SLOTS:\n        void accept() override;\n        void reject() override;\n        bool validate(bool silentOnSuccess = true);\n\n    private Q_SLOTS:\n        void onQueryTextChanged();\n        void onValidateButtonClicked();\n\n    protected:\n        /**\n        * @brief Reimplementing closeEvent in order to do some pre-close actions.\n        */\n        void closeEvent(QCloseEvent *event) override;\n\n    private:\n        void _configureQueryText();\n\n        /**\n        * @brief Restore window settings from system registry\n        */\n        void restoreWindowSettings();\n\n        /**\n        * @brief Save window settings into system registry\n        */\n        void saveWindowSettings() const;\n\n        const CollectionInfo _info;\n        FindFrame *_queryText;\n        bool _readonly;\n        ReturnType _obj;\n    };\n}\n\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/EulaDialog.cpp",
    "content": "#include \"robomongo/gui/dialogs/EulaDialog.h\"\n\n#include <QApplication>\n#include <QHBoxLayout>\n#include <QPushButton>\n#include <QMessageBox>\n#include <QDialogButtonBox>\n#include <QFile>\n#include <QSettings>\n#include <QLabel>\n#include <QTextBrowser>\n#include <QLineEdit>\n#include <QRadioButton>\n#include <QNetworkAccessManager>\n#include <QNetworkRequest>\n#include <QNetworkReply>\n#include <QUrlQuery>\n#include <QJsonObject>\n#include <QJsonDocument>\n#include <QDesktopWidget>\n#include <QTimeZone>\n\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/core/utils/Logger.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace Robomongo\n{\n    EulaDialog::EulaDialog(bool showFormPage, QWidget *parent)\n        : QWizard(parent), _showFormPage(showFormPage)\n    {\n        setWindowTitle(\"EULA\");\n\n        //// First page\n        auto firstPage = new QWizardPage;\n\n        auto agreeButton = new QRadioButton(\"I agree\");\n        VERIFY(connect(agreeButton, SIGNAL(clicked()),\n            this, SLOT(on_agreeButton_clicked())));\n\n        auto notAgreeButton = new QRadioButton(\"I don't agree\");\n        notAgreeButton->setChecked(true);\n        VERIFY(connect(notAgreeButton, SIGNAL(clicked()),\n            this, SLOT(on_notAgreeButton_clicked())));\n\n        auto radioButtonsLay = new QHBoxLayout;\n        radioButtonsLay->setAlignment(Qt::AlignHCenter);\n        radioButtonsLay->setSpacing(30);\n        radioButtonsLay->addWidget(agreeButton);\n        radioButtonsLay->addWidget(notAgreeButton);\n\n        auto textBrowser = new QTextBrowser;\n        textBrowser->setOpenExternalLinks(true);\n        textBrowser->setOpenLinks(true);\n        QFile file(\":gnu_gpl3_license.html\");\n        if (file.open(QFile::ReadOnly | QFile::Text))\n            textBrowser->setText(file.readAll());\n\n        auto hline = new QFrame();\n        hline->setFrameShape(QFrame::HLine);\n        hline->setFrameShadow(QFrame::Sunken);\n\n        auto mainLayout1 = new QVBoxLayout();\n        mainLayout1->addWidget(new QLabel(\"<h3>End-User License Agreement</h3>\"));\n        mainLayout1->addWidget(new QLabel(\"\"));\n        mainLayout1->addWidget(textBrowser);\n        mainLayout1->addWidget(new QLabel(\"\"));\n        mainLayout1->addLayout(radioButtonsLay, Qt::AlignCenter);\n        mainLayout1->addWidget(new QLabel(\"\"));\n        mainLayout1->addWidget(hline);\n\n        firstPage->setLayout(mainLayout1);\n\n        //// Second page\n        auto secondPage = new QWizardPage;\n\n        auto nameLabel = new QLabel(\"<b>First Name:</b>\");\n        _nameEdit = new QLineEdit;\n        auto lastNameLabel = new QLabel(\"<b>Last Name:</b>\");\n        _lastNameEdit = new QLineEdit;\n\n        auto emailLabel = new QLabel(\"<b>Email:</b>\");\n        _emailEdit = new QLineEdit;\n\n        _phone = new QLineEdit;\n        _company = new QLineEdit;\n\n        auto buttomLabel = new QLabel(\"By submitting this form I agree to 3T Software Labs \"\n            \"<a href='https://studio3t.com/privacy-policy'>Privacy Policy</a>.\");\n        buttomLabel->setOpenExternalLinks(true);\n\n        auto bodyLabel = new QLabel(\"\\nShare your email address with us and we'll keep you \"\n            \"up-to-date with updates from us and new features as they come out.\");\n        bodyLabel->setWordWrap(true);\n\n        auto mainLayout2 = new QGridLayout();\n        mainLayout2->addWidget(new QLabel,                      0, 0, 1, 2);\n        mainLayout2->addWidget(new QLabel(\"<h3>Thank you for choosing Robo 3T!</h3>\"), 1, 0, 1, 2);\n        mainLayout2->addWidget(bodyLabel,                       2, 0 , 1, 2);\n        mainLayout2->addWidget(new QLabel,                      3, 0, 1, 2);\n        mainLayout2->addWidget(nameLabel,                       4, 0);\n        mainLayout2->addWidget(_nameEdit,                       4, 1);\n        mainLayout2->addWidget(lastNameLabel,                   5, 0);\n        mainLayout2->addWidget(_lastNameEdit,                   5, 1);\n        mainLayout2->addWidget(emailLabel,                      6, 0);\n        mainLayout2->addWidget(_emailEdit,                      6, 1);\n        mainLayout2->addWidget(new QLabel(\"<b>Phone: </b>\"),    7, 0);\n        mainLayout2->addWidget(_phone,                          7, 1);\n        mainLayout2->addWidget(new QLabel(\"<b>Company:</b>\"),   8, 0);\n        mainLayout2->addWidget(_company,                        8, 1);\n        mainLayout2->addWidget(new QLabel,                      9, 0, 1, 2);\n        mainLayout2->addWidget(buttomLabel,                     10, 0, 1, 2);\n\n        secondPage->setLayout(mainLayout2);\n\n        addPage(firstPage);\n        if(_showFormPage)\n            addPage(secondPage);\n\n        //// Buttons\n        setButtonText(QWizard::CustomButton1, tr(\"Back\"));\n        setButtonText(QWizard::CustomButton2, tr(\"Next\"));\n        setButtonText(QWizard::CustomButton3, tr(\"Finish\"));\n\n        VERIFY(connect(button(QWizard::CustomButton1), SIGNAL(clicked()), this, SLOT(on_back_clicked())));\n        VERIFY(connect(button(QWizard::CustomButton2), SIGNAL(clicked()), this, SLOT(on_next_clicked())));\n        VERIFY(connect(button(QWizard::CustomButton3), SIGNAL(clicked()), this, SLOT(on_finish_clicked())));\n\n        setButtonLayout(QList<WizardButton>{ QWizard::Stretch, QWizard::CustomButton1, QWizard::CustomButton2,\n                                             QWizard::CancelButton, QWizard::CustomButton3});\n\n        button(QWizard::CustomButton1)->setDisabled(true);\n        button(QWizard::CustomButton2)->setDisabled(true);\n        button(QWizard::CustomButton2)->setHidden(!_showFormPage);\n        button(QWizard::CustomButton3)->setDisabled(true);\n\n        setWizardStyle(QWizard::ModernStyle);\n\n        QSettings const settings(\"3T\", \"Robomongo\");\n        if (settings.contains(\"EulaDialog/size\")) {\n            restoreWindowSettings();\n        }\n        else {\n            auto const desktop = QApplication::desktop();\n            auto const& mainScreenSize = desktop->availableGeometry(desktop->primaryScreen()).size();\n            resize(mainScreenSize.width()*0.5, mainScreenSize.height()*0.6);\n        }\n    }\n\n    void EulaDialog::accept()\n    {\n        saveWindowSettings();\n\n        if(_showFormPage) \n            postUserData();\n\n        QDialog::accept();\n    }\n\n    void EulaDialog::reject()\n    {\n        saveWindowSettings();\n        QDialog::reject();\n    }\n\n    void EulaDialog::closeEvent(QCloseEvent *event)\n    {\n        saveWindowSettings();\n        QWidget::closeEvent(event);\n    }\n\n    void EulaDialog::on_agreeButton_clicked()\n    {\n        if(_showFormPage)\n            button(QWizard::CustomButton2)->setEnabled(true);\n        else\n            button(QWizard::CustomButton3)->setEnabled(true);\n    }\n\n    void EulaDialog::on_notAgreeButton_clicked()\n    {\n        if (_showFormPage)\n            button(QWizard::CustomButton2)->setEnabled(false);\n        else\n            button(QWizard::CustomButton3)->setEnabled(false);\n    }\n\n    void EulaDialog::on_next_clicked()\n    {\n        next();\n        button(QWizard::CustomButton1)->setEnabled(true);\n        button(QWizard::CustomButton2)->setEnabled(false);\n        button(QWizard::CustomButton3)->setEnabled(true);\n    }\n\n    void EulaDialog::on_back_clicked()\n    {\n        back();\n        button(QWizard::CustomButton1)->setEnabled(false);\n        button(QWizard::CustomButton2)->setEnabled(true);\n        button(QWizard::CustomButton3)->setEnabled(false);\n    }\n\n    void EulaDialog::on_finish_clicked()\n    {\n        accept();\n    }\n\n    void EulaDialog::postUserData() const\n    {\n        if (_emailEdit->text().isEmpty() || \n            AppRegistry::instance().settingsManager()->disableHttpsFeatures()\n        )\n            return;\n\n        // OS string\n#ifdef _WIN32\n        QString const OS = \"win\";\n#elif __APPLE__\n        QString const OS = \"osx\";\n#elif __linux__\n        QString const OS = \"linux\";\n#else\n        QString const OS = \"unknown\";\n#endif\n\n        // Timezone string\n        QDateTime now = QDateTime::currentDateTime();\n        now.setOffsetFromUtc(now.offsetFromUtc());\n        QString dateAndTimezone = now.toString(Qt::ISODate);\n        QString const date = QDateTime::currentDateTime().toString(Qt::ISODate);\n        QString const timezone = \"UTC\" + dateAndTimezone.remove(date);\n\n        // Build post data and send\n        QJsonObject jsonStr {\n            { \"email\", _emailEdit->text() },\n            { \"firstName\", _nameEdit->text() },\n            { \"lastName\", _lastNameEdit->text() },\n            { \"phone\", _phone->text() },\n            { \"company\", _company->text() },\n            { \"os\", OS },\n            { \"timezone\", timezone }\n        };      \n\n        QJsonDocument jsonDoc(jsonStr);\n        QUrlQuery postData(jsonDoc.toJson());\n        postData = QUrlQuery(\"rd=\" + postData.toString(QUrl::FullyEncoded).toUtf8());\n      \n        QNetworkRequest request(QUrl(\"https://rm-form.3t.io/\"));\n        request.setHeader(QNetworkRequest::ContentTypeHeader, \"application/x-www-form-urlencoded\");\n\n        auto networkManager = new QNetworkAccessManager;\n        _reply = networkManager->post(request, postData.toString(QUrl::FullyEncoded).toUtf8());\n        debugLog(\"EulaDialog: Form posted\");\n    }\n\n    void EulaDialog::saveWindowSettings() const\n    {\n        QSettings settings(\"3T\", \"Robomongo\");\n        settings.setValue(\"EulaDialog/size\", size());\n    }\n\n    void EulaDialog::restoreWindowSettings()\n    {\n        QSettings settings(\"3T\", \"Robomongo\");\n        resize(settings.value(\"EulaDialog/size\").toSize());\n    }\n\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/EulaDialog.h",
    "content": "#pragma once\n\n#include <QWizard>\n\nQT_BEGIN_NAMESPACE\nclass QLabel;\nclass QLineEdit;\nclass QCheckBox;\nclass QPushButton;\nclass QDialogButtonBox;\nclass QComboBox;\nclass QNetworkReply;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n\n    class EulaDialog : public QWizard\n    {\n        Q_OBJECT\n\n    public:\n        static const QSize minimumSize;\n\n        explicit EulaDialog(bool showFormPage, QWidget *parent = nullptr);\n        \n    public Q_SLOTS:\n        void accept() override;\n        void reject() override;\n\n    protected:\n        void closeEvent(QCloseEvent *event) override;\n\n    private Q_SLOTS:\n        void on_agreeButton_clicked();\n        void on_notAgreeButton_clicked();\n        void on_next_clicked();\n        void on_back_clicked();\n        void on_finish_clicked();\n\n    private:\n\n        // Send name, last name and email data of user to home server\n        void postUserData() const;\n\n        /**\n        * @brief Restore window settings from system registry\n        */\n        void restoreWindowSettings();\n\n        /**\n        * @brief Save window settings into system registry\n        */\n        void saveWindowSettings() const;\n\n        QLineEdit* _nameEdit;\n        QLineEdit* _lastNameEdit;\n        QLineEdit* _emailEdit;\n        QLineEdit* _phone;\n        QLineEdit* _company;\n\n        QByteArray _postData;\n        mutable QNetworkReply* _reply;\n        bool _showFormPage = true;\n    };\n}\n\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/ExportDialog.cpp",
    "content": "#include \"robomongo/gui/dialogs/ExportDialog.h\"\n\n#include <QPushButton>\n#include <QHBoxLayout>\n#include <QVBoxLayout>\n#include <QLineEdit>\n#include <QTextEdit>\n#include <QLabel>\n#include <QDialogButtonBox>\n#include <QTreeWidget>\n#include <QComboBox>\n#include <QGroupBox>\n#include <QApplication>\n#include <QProcess>\n#include <QDir>\n#include <QFileDialog>\n#include <QDateTime>\n#include <QMessageBox>\n#include <QPlainTextEdit>\n#include <QFileInfo>\n#include <QSizePolicy>\n#include <QProgressDialog>\n\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/domain/MongoCollection.h\"\n#include \"robomongo/core/domain/MongoDatabase.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerServerTreeItem.h\"\n#include \"robomongo/gui/widgets/workarea/IndicatorLabel.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerWidget.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerTreeWidget.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerServerTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.h\"\n#include \"robomongo/gui/utils/GuiConstants.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n\nnamespace Robomongo\n{\n    namespace\n    {\n        const QString defaultDir = \"D:\\\\exports\\\\\";     // Default location\n\n        auto const AUTO_MODE_SIZE = QSize(500, 450);\n        auto const MANUAL_MODE_SIZE = QSize(500, 400);\n\n        auto const SHOW_DETAILS = \"<a href='error' style='color: #777777;'>Show details</a>\";\n        auto const HIDE_DETAILS = \"<a href='error' style='color: #777777;'>Hide details</a>\";\n\n        // This structure represents the arguments as in \"mongoexport.exe --help\"\n        // See http://docs.mongodb.org/manual/reference/program/mongoexport/ for more information\n        struct MongoExportArgs\n        {\n            static QString db(const QString& dbName) { return (\"--db\" + dbName); }\n            static QString collection(const QString& collection) { return (\"--collection\" + collection); }\n            \n            // i.e. absFilePath: \"/exports/coll1.json\"\n            static QString out(const QString& absFilePath) { return (\"--out \" + absFilePath); }  \n        };\n    }\n\n    ExportDialog::ExportDialog(QString const& dbName, QString const& collName, QWidget *parent) :\n        QDialog(parent), _mode(AUTO), _mongoExportArgs(), _activeProcess(nullptr)\n    {\n        setWindowTitle(\"Export Collection\");\n        setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); // Remove help button (?)\n        setMinimumSize(AUTO_MODE_SIZE);\n        //setFixedHeight(AUTO_MODE_SIZE.height());\n\n        _activeProcess = new QProcess(this);\n        //_activeProcess->setProcessChannelMode(QProcess::MergedChannels);\n        VERIFY(connect(_activeProcess, SIGNAL(finished(int, QProcess::ExitStatus)),\n            this, SLOT(on_exportFinished(int, QProcess::ExitStatus))));\n        VERIFY(connect(_activeProcess, SIGNAL(errorOccurred(QProcess::ProcessError)),\n            this, SLOT(on_processErrorOccurred(QProcess::ProcessError))));\n\n        // todo: move to a global location\n        // Enable copyable text for QMessageBox\n        qApp->setStyleSheet(\"QMessageBox { messagebox-text-interaction-flags: 5; }\");\n\n        const QString serverName = \"localhost:20017\"; // todo: remove\n        Indicator *serverIndicator = new Indicator(GuiRegistry::instance().serverIcon(), serverName);\n\n        // Horizontal line\n        QFrame *horline = new QFrame();\n        horline->setFrameShape(QFrame::HLine);\n        horline->setFrameShadow(QFrame::Sunken);\n\n        // Widgets related to Input\n        auto dbNameLabel = new QLabel(\"Database Name:\");\n        auto dbNameLineEdit = new QLineEdit;\n        auto dbNameLay = new QHBoxLayout;\n        dbNameLay->addWidget(dbNameLabel);\n        dbNameLay->addWidget(dbNameLineEdit);\n\n        auto collNameLabel = new QLabel(\"Collection Name:\");\n        auto collNameLineEdit = new QLineEdit;\n        auto collNameLay = new QHBoxLayout;\n        collNameLay->addWidget(collNameLabel);\n        collNameLay->addWidget(collNameLineEdit);\n\n        auto selectedCollLay = new QGridLayout;\n        selectedCollLay->setAlignment(Qt::AlignTop);\n        selectedCollLay->setColumnStretch(2, 1);\n\n        auto serverIcon = new QLabel(\"<html><img src=':/robomongo/icons/server_16x16.png'></html>\");\n        auto dbIcon = new QLabel(\"<html><img src=':/robomongo/icons/database_16x16.png'></html>\");\n        auto collIcon = new QLabel(\"<html><img src=':/robomongo/icons/collection_16x16.png'></html>\");\n\n        selectedCollLay->addWidget(serverIcon,                      1, 0);\n        selectedCollLay->addWidget(new QLabel(\"Server: \"),          1, 1);\n        selectedCollLay->addWidget(new QLabel(\"local_(2)\"),         1, 2);\n        selectedCollLay->addWidget(dbIcon,                          2, 0);\n        selectedCollLay->addWidget(new QLabel(\"Database: \"),        2, 1);\n        selectedCollLay->addWidget(new QLabel(dbName),              2, 2);\n        selectedCollLay->addWidget(collIcon,                        3, 0);\n        selectedCollLay->addWidget(new QLabel(\"Collection: \"),      3, 1);\n        selectedCollLay->addWidget(new QLabel(collName),            3, 2);\n\n        // Widgets related to Output \n        _formatComboBox = new QComboBox;\n        _formatComboBox->addItem(\"JSON\");\n        _formatComboBox->addItem(\"CSV\");\n        VERIFY(connect(_formatComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(on_formatComboBox_change(int))));\n\n        _fieldsLabel = new QLabel(\"Fields:\");\n        _fields = new QLineEdit; // todo: use textedit\n        // Initially hidden\n        _fieldsLabel->setHidden(true);\n        _fields->setHidden(true);\n\n        _query = new QLineEdit(\"{}\"); // todo: JSON frame can be used\n        _outputFileName = new QLineEdit;\n        _outputDir = new QLineEdit;\n        _browseButton = new QPushButton(\"...\");\n        _browseButton->setMaximumWidth(50);\n        VERIFY(connect(_browseButton, SIGNAL(clicked()), this, SLOT(on_browseButton_clicked())));\n\n        // Export summary widgets\n        _exportOutput = new QTextEdit;\n        QFontMetrics font(_exportOutput->font());\n        _exportOutput->setFixedHeight((4+1.5) * (font.lineSpacing()));  // 4-line text edit\n        _exportOutput->setReadOnly(true);\n\n        _mongoExportOutput = new QTextEdit;\n        _mongoExportOutput->setFixedHeight(4 * (font.lineSpacing() + 8));  // 4-line text edit\n        _mongoExportOutput->setReadOnly(true);\n        _mongoExportOutput->setHidden(true);\n\n        // Attempt to fix issue for Windows High DPI button height is slightly taller than other widgets \n#ifdef Q_OS_WIN\n        _browseButton->setMaximumHeight(HighDpiConstants::WIN_HIGH_DPI_BUTTON_HEIGHT);\n#endif\n        auto outputsInnerLay = new QGridLayout;\n        outputsInnerLay->addWidget(new QLabel(\"Format:\"),       0, 0);\n        outputsInnerLay->addWidget(_formatComboBox,             0, 1, 1, 2);\n        outputsInnerLay->addWidget(_fieldsLabel,                1, 0, Qt::AlignTop);\n        outputsInnerLay->addWidget(_fields,                     1, 1, 1, 2);\n        outputsInnerLay->addWidget(new QLabel(\"Query:\"),        2, 0);\n        outputsInnerLay->addWidget(_query,                      2, 1, 1, 2);\n        outputsInnerLay->addWidget(new QLabel(\"File Name:\"),    3, 0);\n        outputsInnerLay->addWidget(_outputFileName,             3, 1, 1, 2);\n        outputsInnerLay->addWidget(new QLabel(\"Directory:\"),    4, 0);\n        outputsInnerLay->addWidget(_outputDir,                  4, 1);\n        outputsInnerLay->addWidget(_browseButton,               4, 2);\n        //outputsInnerLay->addWidget(new QLabel(\"Result:\"),       5, 0, Qt::AlignTop);\n        //outputsInnerLay->addWidget(_exportOutput,           6, 0, 1, 3, Qt::AlignTop);\n\n        auto manualLayout = new QGridLayout;\n        auto cmdLabel = new QLabel(\"Command:\");\n        cmdLabel->setFixedHeight(cmdLabel->sizeHint().height());\n        _manualExportCmd = new QTextEdit;\n        QFontMetrics font1(_manualExportCmd->font());\n        _manualExportCmd->setFixedHeight(2 * (font1.lineSpacing()+8));  // 2-line text edit\n        manualLayout->addWidget(cmdLabel,                   0, 0, Qt::AlignTop);\n        manualLayout->addWidget(_manualExportCmd,           1, 0, Qt::AlignTop);\n\n        // Button box and Manual Mode button\n        _modeButton = new QPushButton(\"Manual Mode\");\n        VERIFY(connect(_modeButton, SIGNAL(clicked()), this, SLOT(on_modeButton_clicked())));\n        _buttonBox = new QDialogButtonBox(this);\n        _buttonBox->setOrientation(Qt::Horizontal);\n        _buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Save);\n        _buttonBox->button(QDialogButtonBox::Save)->setText(\"E&xport\");\n        _buttonBox->button(QDialogButtonBox::Save)->setMaximumWidth(70);\n        _buttonBox->button(QDialogButtonBox::Cancel)->setMaximumWidth(70);\n        VERIFY(connect(_buttonBox, SIGNAL(accepted()), this, SLOT(accept())));\n        VERIFY(connect(_buttonBox, SIGNAL(rejected()), this, SLOT(reject())));\n\n        // Sub layouts\n        auto serverIndicatorlayout = new QHBoxLayout();\n        if (!serverName.isEmpty()) {\n            serverIndicatorlayout->addWidget(serverIndicator, 0, Qt::AlignLeft);\n        }\n\n        // Input layout\n        _inputsGroupBox = new QGroupBox(\"Selected Collection\");\n        _inputsGroupBox->setLayout(selectedCollLay);\n        _inputsGroupBox->setStyleSheet(\"QGroupBox::title { left: 0px }\");\n        _inputsGroupBox->setFixedHeight(_inputsGroupBox->sizeHint().height());\n\n        // Outputs\n        _autoOutputsGroup = new QGroupBox(\"Output Properties\");\n        _autoOutputsGroup->setLayout(outputsInnerLay);\n        _autoOutputsGroup->setStyleSheet(\"QGroupBox::title { left: 0px }\");\n        _autoOutputsGroup->setFixedHeight(_autoOutputsGroup->sizeHint().height());\n\n        // Manual Groupbox\n        _manualGroupBox = new QGroupBox(\"Manual Export\");\n        _manualGroupBox->setLayout(manualLayout);\n        _manualGroupBox->setStyleSheet(\"QGroupBox::title { left: 0px }\");\n        _manualGroupBox->setHidden(true);\n\n        // Export Summary\n        auto exportSummaryGroup = new QGroupBox(\"Export Summary\");\n        exportSummaryGroup->setStyleSheet(\"QGroupBox::title { left: 0px }\");\n        _viewOutputLink = new QLabel(SHOW_DETAILS);\n        VERIFY(connect(_viewOutputLink, SIGNAL(linkActivated(QString)), this, SLOT(on_viewOutputLink(QString))));\n        _viewOutputLink->setFixedHeight(_viewOutputLink->sizeHint().height());\n        auto tempLayout = new QVBoxLayout();\n        //tempLayout->setSizeConstraint(QLayout::SetFixedSize);\n        tempLayout->addWidget(_exportOutput, Qt::AlignTop);\n        tempLayout->addWidget(_viewOutputLink, Qt::AlignLeft | Qt::AlignTop);\n        //tempLayout->addWidget(_mongoExportOutput);\n        exportSummaryGroup->setLayout(tempLayout);\n        exportSummaryGroup->setFixedHeight(exportSummaryGroup->sizeHint().height());\n\n        // Buttonbox layout\n        auto hButtonBoxlayout = new QHBoxLayout();\n        hButtonBoxlayout->addStretch(1);\n        hButtonBoxlayout->addWidget(_buttonBox);\n        hButtonBoxlayout->addWidget(_modeButton);\n\n        // Main Layout\n        auto layout = new QVBoxLayout();\n        layout->addWidget(_inputsGroupBox, Qt::AlignTop);\n        //layout->addWidget(horline, Qt::AlignTop);\n        layout->addWidget(_autoOutputsGroup, Qt::AlignTop);\n        layout->addWidget(_manualGroupBox);\n        layout->addWidget(exportSummaryGroup, Qt::AlignTop);\n        layout->addLayout(hButtonBoxlayout);\n        setLayout(layout);\n\n        // todo: move to a function\n        // Help user filling inputs automatically\n        auto date = QDateTime::currentDateTime().toString(\"dd.MM.yyyy\");\n        auto time = QDateTime::currentDateTime().toString(\"hh.mm.ss\");\n        auto timeStamp = date + \"_\" + time;\n        auto format = _formatComboBox->currentIndex() == 0 ? \"json\" : \"csv\";\n\n        _outputFileName->setText(dbName + \".\" + collName + \"_\" + timeStamp + \".\" + format);\n        _outputDir->setText(defaultDir);\n        _manualExportCmd->setText(\"mongoexport --db \" + dbName + \" --collection \" + collName +\n                                             \" --out \" + _outputDir->text() + _outputFileName->text());\n\n        // todo: setExportArgs()\n        // First set db and coll \n        _mongoExportArgs = \" --db \" + dbName + \" --collection \" + collName;\n\n        _outputFileName->setFocus();\n    }\n\n    void ExportDialog::setOkButtonText(const QString &text)\n    {\n        _buttonBox->button(QDialogButtonBox::Save)->setText(text);\n    }\n\n    // todo: remove\n    void ExportDialog::setInputLabelText(const QString &text)\n    {\n        //_inputLabel->setText(text);\n    }\n\n    void ExportDialog::accept()\n    {\n        QString mongoExport = \"D:\\\\mongo_export\\\\bin\\\\mongoexport.exe\";\n        \n        bool disable = false;\n        enableDisableWidgets(disable);\n\n        if (AUTO == _mode)\n        {\n            _exportOutput->clear();\n            _exportOutput->setText(\"Exporting...\");\n\n            // If CSV append output format and fields\n            if (_formatComboBox->currentIndex() == 1) {\n                if (_fields->text().isEmpty()) {\n                    QMessageBox::critical(this, \"Error\", \"\\\"Fields\\\" option is required in CSV mode.\");\n                    return;\n                }\n                _mongoExportArgs.append(\" --type=csv\");\n                _mongoExportArgs.append(\" --fields \" + _fields->text().replace(\" \", \"\"));\n            }\n\n            if (!_query->text().isEmpty() && _query->text() != \"{}\") {\n                _mongoExportArgs.append(\" --query \" + _query->text());\n            }\n\n            // Append file path and name\n            auto absFilePath = _outputDir->text() + _outputFileName->text();\n            _mongoExportArgs.append(\" --out \" + absFilePath);\n\n            // Start mongoexport non-blocking\n            _activeProcess->start(mongoExport + _mongoExportArgs);\n        }\n        else if (MANUAL == _mode)\n        {\n            _exportOutput->clear();\n            _exportOutput->setText(\"Exporting...\");\n\n            // todo: check if _activeProcess->state() is QProcess::NotRunning\n            // Start mongoexport non-blocking\n            _activeProcess->start(\"D:\\\\mongo_export\\\\bin\\\\\" + _manualExportCmd->toPlainText());\n        }\n    }\n\n    void ExportDialog::ui_itemExpanded(QTreeWidgetItem *item)\n    {\n        auto categoryItem = dynamic_cast<ExplorerDatabaseCategoryTreeItem *>(item);\n        if (categoryItem) {\n            categoryItem->expand();\n            return;\n        }\n\n        ExplorerServerTreeItem *serverItem = dynamic_cast<ExplorerServerTreeItem *>(item);\n        if (serverItem) {\n            serverItem->expand();\n            return;\n        }\n\n        auto dirItem = dynamic_cast<ExplorerCollectionIndexesDir *>(item);\n        if (dirItem) {\n            dirItem->expand();\n        }\n    }\n\n    void ExportDialog::ui_itemDoubleClicked(QTreeWidgetItem *item, int column)\n    {\n        // todo\n    }\n\n    void ExportDialog::on_browseButton_clicked()\n    {\n        // Select output directory\n        QString origDir = QFileDialog::getExistingDirectory(this, tr(\"Select Directory\"), defaultDir,\n                                             QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);\n        auto dir = QDir::toNativeSeparators(origDir);\n\n        QApplication::activeModalWidget()->raise();\n        QApplication::activeModalWidget()->activateWindow();\n\n        if (dir.isNull())\n            return;\n\n        _outputDir->setText(dir + \"\\\\\");\n    }\n\n    void ExportDialog::on_formatComboBox_change(int index)\n    {\n        bool const isCsv = static_cast<bool>(index);\n        _fieldsLabel->setVisible(isCsv);\n        _fields->setVisible(isCsv);\n        \n        // todo: divide ui_itemClicked()\n        //ui_itemClicked(_treeWidget->currentItem());\n    }\n\n    void ExportDialog::on_modeButton_clicked()\n    {\n        _exportOutput->clear();\n        _mode = (AUTO == _mode ? MANUAL : AUTO);\n        _modeButton->setText(AUTO == _mode ? \"Manual Mode\" : \"Auto Mode\");\n        _autoOutputsGroup->setVisible(AUTO == _mode);\n        _manualGroupBox->setVisible(MANUAL == _mode);\n        setMinimumSize(AUTO == _mode ? AUTO_MODE_SIZE : MANUAL_MODE_SIZE);\n        _inputsGroupBox->setTitle(AUTO == _mode ? \"Selected Collection\" : \"Selected Server\");\n        adjustSize();\n    }\n\n    void ExportDialog::on_exportFinished(int exitCode, QProcess::ExitStatus exitStatus)\n    {\n        bool enable = true;\n        enableDisableWidgets(enable);\n\n        // Extract absolute file path\n        QString absFilePath;\n        if (AUTO == _mode) \n        {\n            absFilePath = _outputDir->text() + _outputFileName->text();\n        }\n        else if (MANUAL == _mode)\n        {\n            // extract absolute file path string\n            QStringList strlist1 = _manualExportCmd->toPlainText().split(\"--out\");\n            if (strlist1.size() > 1) {\n                QString str1 = strlist1[1];\n                QStringList strlist2 = str1.split(\"--\");\n                if (strlist2.size() > 1) {\n                    absFilePath = strlist2[0];\n                }\n                else {\n                    absFilePath = str1;\n                }\n            }\n        }\n        absFilePath.replace(\" \", \"\");  // todo: handle paths with white spaces\n\n        // todo: also check process exit code\n        // Check exported file exists and mongoexport output does not contain error\n        QFileInfo const file(absFilePath);\n        _mongoExportOutputStr = _activeProcess->readAllStandardError(); // Extract mongoexport command output\n        if (file.exists() && file.isFile() && _mongoExportOutputStr.contains(\"exported\")) {\n            QStringList splitA = _mongoExportOutputStr.split(\"exported\");\n            QStringList splitB = splitA[1].split(\"records\");\n            _exportResult = \"Export Successful: \\n\" \n                            \"Exported file: \" + absFilePath + \"\\n\"\n                            \"Number of records exported:\" + splitB[0];\n            _exportOutput->setText(_exportResult);\n        }\n        else {\n            _exportOutput->setText(\"Export Failed.\\n\");\n            _exportOutput->append(\"Output:\\n\" + _mongoExportOutputStr);\n        }\n\n        _exportOutput->moveCursor(QTextCursor::Start);\n    }\n\n    void ExportDialog::on_processErrorOccurred(QProcess::ProcessError error)\n    {\n        bool enable = true;\n        enableDisableWidgets(enable);\n\n        if (QProcess::FailedToStart == error) {\n            _exportOutput->setText(\"Error: \\\"mongoexport\\\" process failed to start. Either the \"\n                \"invoked program is missing, or you may have insufficient permissions to invoke the program.\");\n        }\n        else if (QProcess::Crashed == error) {\n            _exportOutput->setText(\"Error: \\\"mongoexport\\\" process crashed some time after starting\"\n                \" successfully..\");\n        }\n        else {\n            _exportOutput->setText(\"Error: \\\"mongoexport\\\" process failed. Error code: \"\n                + QString::number(error));\n        }\n\n        _exportOutput->moveCursor(QTextCursor::Start);\n    }\n\n    void ExportDialog::on_viewOutputLink(QString)\n    {\n        QMessageBox::information(this, \"Details\", _mongoExportOutputStr);\n    }\n    \n    Indicator *ExportDialog::createDatabaseIndicator(const QString &database)\n    {\n        return new Indicator(GuiRegistry::instance().databaseIcon(), database);\n    }\n\n    Indicator *ExportDialog::createCollectionIndicator(const QString &collection)\n    {\n        return new Indicator(GuiRegistry::instance().collectionIcon(), collection);\n    }\n\n    void ExportDialog::enableDisableWidgets(bool enable) const\n    {\n        // Auto mode widgets\n        //_treeWidget->setEnabled(enable);\n        _formatComboBox->setEnabled(enable);\n        _fieldsLabel->setEnabled(enable);\n        _fields->setEnabled(enable);\n        _query->setEnabled(enable);\n        _outputFileName->setEnabled(enable);\n        _outputDir->setEnabled(enable);\n        _browseButton->setEnabled(enable);\n        _buttonBox->button(QDialogButtonBox::Save)->setEnabled(enable);\n        _modeButton->setEnabled(enable);\n\n        // Manual mode widgets\n        //_treeWidget->setEnabled(enable);\n        _manualExportCmd->setEnabled(enable);\n        _buttonBox->button(QDialogButtonBox::Save)->setEnabled(enable);\n        _modeButton->setEnabled(enable);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/ExportDialog.h",
    "content": "#pragma once\n\n#include <QDialog>\n#include <QProcess>\n\nQT_BEGIN_NAMESPACE\nclass QLabel;\nclass QDialogButtonBox;\nclass QLineEdit;\nclass QTreeWidgetItem;\nclass QTreeWidget;\nclass QComboBox;\nclass QPushButton;\nclass QGroupBox;\nclass QTextEdit;\nclass QProcess;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class Indicator;\n\n    /**\n    * @brief This class is not finished, it is still under development.\n    *        Currently export is disabled in the GUI. If enabled in GUI, export \n    *        will work with current code. However, the code is unfinished; \n    *        it needs to finished, reviewed and tested.\n    *        Currently, there is support for simultaneous export which can be done \n    *        on multiple export dialogs without blocking each other or main window. \n    *        So user can still work while multiple export dialogs are doing export. \n    *        This achieved by the assumption that there will be usable export executable for \n    *        Robomongo to use. Currently, this location is hard coded as \n    *        \"D:\\\\mongo_export\\\\bin\\\\mongoexport.exe\". One of the next actions will be \n    *        to design the location of mongoexport which should be cross-platform, \n    *        generic and not hard coded.\n    */\n    class ExportDialog : public QDialog\n    {\n        Q_OBJECT\n\n        enum MODE \n        {\n            AUTO = 0,\n            MANUAL = 1\n        };\n\n    public:\n        explicit ExportDialog(QString const& dbName, QString const& collName, QWidget *parent = 0);\n        void setOkButtonText(const QString &text);\n        void setInputLabelText(const QString &text);\n        void setInputText(const QString &text);\n        enum { maxLenghtName = 60 };\n\n    public Q_SLOTS:\n        virtual void accept();\n\n    private Q_SLOTS:\n        void ui_itemExpanded(QTreeWidgetItem *item);\n        void ui_itemDoubleClicked(QTreeWidgetItem *item, int column);\n        void on_browseButton_clicked();\n        void on_formatComboBox_change(int index);\n        void on_modeButton_clicked();\n        void on_exportFinished(int exitCode, QProcess::ExitStatus exitStatus);\n        void on_processErrorOccurred(QProcess::ProcessError);\n        void on_viewOutputLink(QString);\n\n    private:\n        // todo: remove if unused\n        Indicator *createDatabaseIndicator(const QString &database);\n        Indicator *createCollectionIndicator(const QString &collection);\n\n        // Enable/Disable widgets during/after export operation\n        // @param enable: true to enable, false to disable widgets\n        void enableDisableWidgets(bool enable) const;\n\n        // Auto Mode\n        QGroupBox* _inputsGroupBox;\n        QComboBox* _formatComboBox;\n        QLabel* _fieldsLabel;\n        QLineEdit* _fields;\n        QLineEdit* _query;\n        QLineEdit* _outputFileName;\n        QLineEdit* _outputDir;\n        QPushButton* _browseButton;\n        QGroupBox* _autoOutputsGroup;\n        QTextEdit* _exportOutput;\n        QLabel* _viewOutputLink;\n        //\n        QTextEdit* _mongoExportOutput;\n\n        // Manual Mode\n        QTextEdit* _manualExportCmd;\n        QPushButton* _modeButton;\n        QGroupBox* _manualGroupBox;\n        // Common\n        QDialogButtonBox* _buttonBox;\n\n        MODE _mode;\n        QString _dbName;\n        QString _collName;\n        QString _mongoExportArgs;\n        QString _exportResult;\n        QString _mongoExportOutputStr;\n        QProcess* _activeProcess;          // pointer to running/finished process\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/FunctionTextEditor.cpp",
    "content": "#include \"robomongo/gui/dialogs/FunctionTextEditor.h\"\n\n#include <QApplication>\n#include <QHBoxLayout>\n#include <QLineEdit>\n#include <QPushButton>\n#include <QMessageBox>\n#include <QLabel>\n#include <QDialogButtonBox>\n#include <Qsci/qscilexerjavascript.h>\n#include <Qsci/qsciscintilla.h>\n\n#include \"robomongo/gui/editors/JSLexer.h\"\n#include \"robomongo/gui/editors/FindFrame.h\"\n#include \"robomongo/gui/editors/PlainJavaScriptEditor.h\"\n#include \"robomongo/gui/widgets/workarea/IndicatorLabel.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace Robomongo\n{\n    FunctionTextEditor::FunctionTextEditor(const QString &server, const QString &database,\n                                           const MongoFunction &function, QWidget *parent) :\n        QDialog(parent),\n        _function(function)\n    {\n        setMinimumWidth(700);\n        setMinimumHeight(550);\n\n        Indicator *databaseIndicator = new Indicator(GuiRegistry::instance().databaseIcon(), database);\n        Indicator *serverIndicator = new Indicator(GuiRegistry::instance().serverIcon(), server);\n\n        _nameEdit = new QLineEdit(QtUtils::toQString(function.name()));\n\n        _queryText = new FindFrame(this);\n        _configureQueryText();\n        _queryText->sciScintilla()->setText(QtUtils::toQString(_function.code()));\n\n        QFrame *hline = new QFrame(this);\n        hline->setFrameShape(QFrame::HLine);\n        hline->setFrameShadow(QFrame::Sunken);\n\n        QHBoxLayout *hlayout = new QHBoxLayout();\n        hlayout->setContentsMargins(2, 0, 5, 1);\n        hlayout->setSpacing(0);\n        hlayout->addWidget(serverIndicator, 0, Qt::AlignLeft);\n        hlayout->addWidget(databaseIndicator, 0, Qt::AlignLeft);\n        hlayout->addStretch(1);\n\n        QDialogButtonBox *buttonBox = new QDialogButtonBox(this);\n        buttonBox->setOrientation(Qt::Horizontal);\n        buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Save);\n        VERIFY(connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())));\n        VERIFY(connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())));\n\n        QHBoxLayout *bottomlayout = new QHBoxLayout();\n        bottomlayout->addStretch(1);\n        bottomlayout->addWidget(buttonBox);\n\n        QVBoxLayout *layout = new QVBoxLayout();\n        layout->addLayout(hlayout);\n        layout->addWidget(hline);\n        layout->addWidget(new QLabel(\"Name:\"));\n        layout->addWidget(_nameEdit);\n        layout->addWidget(new QLabel(\"Code:\"));\n        layout->addWidget(_queryText);\n        layout->addLayout(bottomlayout);\n        setLayout(layout);\n\n        _nameEdit->setFocus();\n    }\n\n    void FunctionTextEditor::setCursorPosition(int line, int column)\n    {\n        _queryText->sciScintilla()->setCursorPosition(line, column);\n    }\n\n    void FunctionTextEditor::setCode(const QString &code)\n    {\n        _queryText->sciScintilla()->setText(code);\n    }\n\n    void FunctionTextEditor::accept()\n    {\n        if (_nameEdit->text().isEmpty() && _queryText->sciScintilla()->text().isEmpty())\n            return;\n\n        _function.setName(QtUtils::toStdString(_nameEdit->text()));\n        _function.setCode(QtUtils::toStdString(_queryText->sciScintilla()->text()));\n\n        BaseClass::accept();\n    }\n\n    /*\n    ** Configure QsciScintilla query widget\n    */\n    void FunctionTextEditor::_configureQueryText()\n    {\n        const QFont &textFont = GuiRegistry::instance().font();\n        QsciLexerJavaScript *javaScriptLexer = new JSLexer(this);\n        javaScriptLexer->setFont(textFont);        \n        _queryText->sciScintilla()->setAppropriateBraceMatching();\n        _queryText->sciScintilla()->setFont(textFont);\n        _queryText->sciScintilla()->setPaper(QColor(255, 0, 0, 127));\n        _queryText->sciScintilla()->setLexer(javaScriptLexer);\n        _queryText->sciScintilla()->setWrapMode((QsciScintilla::WrapMode)QsciScintilla::SC_WRAP_WORD);\n        _queryText->sciScintilla()->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);\n        _queryText->sciScintilla()->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);\n\n        _queryText->sciScintilla()->setStyleSheet(\"QFrame { background-color: rgb(73, 76, 78); border: 1px solid #c7c5c4; border-radius: 4px; margin: 0px; padding: 0px;}\");\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/FunctionTextEditor.h",
    "content": "#pragma once\n\n#include <QDialog>\nQT_BEGIN_NAMESPACE\nclass QLineEdit;\nclass QLabel;\nQT_END_NAMESPACE\n\n#include \"robomongo/core/domain/MongoFunction.h\"\n\nnamespace Robomongo\n{\n    class FindFrame;\n\n    class FunctionTextEditor : public QDialog\n    {\n        Q_OBJECT\n\n    public:\n        typedef QDialog BaseClass;\n        explicit FunctionTextEditor(const QString &server, const QString &database,\n                                    const MongoFunction &code, QWidget *parent = 0);\n\n        MongoFunction function() const { return _function; }\n\n        void setCursorPosition(int line, int column);\n        void setCode(const QString &code);\n\n    public Q_SLOTS:\n        virtual void accept();\n\n    private:\n        void _configureQueryText();\n        QLineEdit *_nameEdit;\n        FindFrame *_queryText;\n        MongoFunction _function;\n    };\n}\n\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/PreferencesDialog.cpp",
    "content": "#include \"robomongo/gui/dialogs/PreferencesDialog.h\"\n\n#include <QDialogButtonBox>\n#include <QVBoxLayout>\n#include <QHBoxLayout>\n#include <QLabel>\n#include <QComboBox>\n#include <QPushButton>\n#include <QCheckBox>\n\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/AppStyle.h\"\n#include \"robomongo/gui/utils/ComboBoxUtils.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n\nnamespace Robomongo\n{\n    PreferencesDialog::PreferencesDialog(QWidget *parent)\n        : BaseClass(parent)\n    {\n        setWindowIcon(GuiRegistry::instance().mainWindowIcon());\n\n        setWindowTitle(\"Preferences \" PROJECT_NAME_TITLE);\n        setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);\n        setFixedSize(height, width);\n\n        QVBoxLayout *layout = new QVBoxLayout(this);\n\n        QHBoxLayout *defLayout = new QHBoxLayout(this);\n        QLabel *defDisplayModeLabel = new QLabel(\"Default display mode:\");\n        defLayout->addWidget(defDisplayModeLabel);\n        _defDisplayModeComboBox = new QComboBox();\n        QStringList modes;\n        for (int i = Text; i <= Custom; ++i)\n        {\n            modes.append(convertViewModeToString(static_cast<ViewMode>(i)));\n        }\n        _defDisplayModeComboBox->addItems(modes);\n        defLayout->addWidget(_defDisplayModeComboBox);\n        layout->addLayout(defLayout);\n\n        QHBoxLayout *timeZoneLayout = new QHBoxLayout(this);\n        QLabel *timeZoneLabel = new QLabel(\"Display Dates in:\");\n        timeZoneLayout->addWidget(timeZoneLabel);\n        _timeZoneComboBox = new QComboBox();\n        QStringList times;\n        for (int i = Utc; i <= LocalTime; ++i)\n        {\n            times.append(convertTimesToString(static_cast<SupportedTimes>(i)));\n        }\n        _timeZoneComboBox->addItems(times);\n        timeZoneLayout->addWidget(_timeZoneComboBox);\n        layout->addLayout(timeZoneLayout);\n\n        QHBoxLayout *uuidEncodingLayout = new QHBoxLayout(this);\n        QLabel *uuidEncodingLabel = new QLabel(\"Legacy UUID Encoding:\");\n        uuidEncodingLayout->addWidget(uuidEncodingLabel);\n        _uuidEncodingComboBox = new QComboBox();\n        QStringList uuids;\n        for (int i = DefaultEncoding; i <= PythonLegacy; ++i)\n        {\n            uuids.append(convertUUIDEncodingToString(static_cast<UUIDEncoding>(i)));\n        }\n        _uuidEncodingComboBox->addItems(uuids);\n        uuidEncodingLayout->addWidget(_uuidEncodingComboBox);\n        layout->addLayout(uuidEncodingLayout);        \n\n        _loadMongoRcJsCheckBox = new QCheckBox(\"Load .mongorc.js\");\n        layout->addWidget(_loadMongoRcJsCheckBox);\n\n        _disabelConnectionShortcutsCheckBox = new QCheckBox(\"Disable connection shortcuts\");\n        layout->addWidget(_disabelConnectionShortcutsCheckBox);\n\n        QHBoxLayout *stylesLayout = new QHBoxLayout(this);\n        QLabel *stylesLabel = new QLabel(\"Styles:\");\n        stylesLayout->addWidget(stylesLabel);\n        _stylesComboBox = new QComboBox();\n        _stylesComboBox->addItems(AppStyleUtils::getSupportedStyles());\n        stylesLayout->addWidget(_stylesComboBox);\n        layout->addLayout(stylesLayout);   \n\n        QDialogButtonBox *buttonBox = new QDialogButtonBox(this);\n        buttonBox->setOrientation(Qt::Horizontal);\n        buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Save);\n        VERIFY(connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())));\n        VERIFY(connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())));\n        layout->addWidget(buttonBox);\n        setLayout(layout);\n\n        syncWithSettings();\n    }\n\n    void PreferencesDialog::syncWithSettings()\n    {\n\n        utils::setCurrentText(_defDisplayModeComboBox, convertViewModeToString(Robomongo::AppRegistry::instance().settingsManager()->viewMode()));\n        utils::setCurrentText(_timeZoneComboBox, convertTimesToString(Robomongo::AppRegistry::instance().settingsManager()->timeZone()));\n        utils::setCurrentText(_uuidEncodingComboBox, convertUUIDEncodingToString(Robomongo::AppRegistry::instance().settingsManager()->uuidEncoding()));\n        _loadMongoRcJsCheckBox->setChecked(AppRegistry::instance().settingsManager()->loadMongoRcJs());\n        _disabelConnectionShortcutsCheckBox->setChecked(AppRegistry::instance().settingsManager()->disableConnectionShortcuts());\n        utils::setCurrentText(_stylesComboBox, Robomongo::AppRegistry::instance().settingsManager()->currentStyle());\n    }\n\n    void PreferencesDialog::accept()\n    {\n        ViewMode mode = convertStringToViewMode(QtUtils::toStdString(_defDisplayModeComboBox->currentText()).c_str());\n        Robomongo::AppRegistry::instance().settingsManager()->setViewMode(mode);\n\n        SupportedTimes time = convertStringToTimes(QtUtils::toStdString(_timeZoneComboBox->currentText()).c_str());\n        Robomongo::AppRegistry::instance().settingsManager()->setTimeZone(time);\n\n        UUIDEncoding uuidC = convertStringToUUIDEncoding(QtUtils::toStdString(_uuidEncodingComboBox->currentText()).c_str());\n        Robomongo::AppRegistry::instance().settingsManager()->setUuidEncoding(uuidC);\n\n        AppRegistry::instance().settingsManager()->setLoadMongoRcJs(_loadMongoRcJsCheckBox->isChecked());\n        AppRegistry::instance().settingsManager()->setDisableConnectionShortcuts(_disabelConnectionShortcutsCheckBox->isChecked());\n        Robomongo::AppRegistry::instance().settingsManager()->setCurrentStyle(_stylesComboBox->currentText());\n        AppStyleUtils::applyStyle(_stylesComboBox->currentText());\n        Robomongo::AppRegistry::instance().settingsManager()->save();\n\n        return BaseClass::accept();\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/PreferencesDialog.h",
    "content": "#pragma  once\n\n#include <QDialog>\nQT_BEGIN_NAMESPACE\nclass QComboBox;\nclass QCheckBox;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class PreferencesDialog : public QDialog\n    {\n        Q_OBJECT\n\n    public:\n        typedef QDialog BaseClass;\n        explicit PreferencesDialog(QWidget *parent);\n        enum { height = 640, width = 480};\n    public Q_SLOTS:\n        virtual void accept();\n    private:\n        void syncWithSettings();\n    private:\n        QComboBox *_defDisplayModeComboBox;\n        QComboBox *_timeZoneComboBox;\n        QComboBox *_uuidEncodingComboBox;\n        QCheckBox *_loadMongoRcJsCheckBox;\n        QCheckBox *_disabelConnectionShortcutsCheckBox;\n        QComboBox *_stylesComboBox;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/SSHTunnelTab.cpp",
    "content": "#include \"robomongo/gui/dialogs/SSHTunnelTab.h\"\n\n#include <QApplication>\n#include <QLabel>\n#include <QLineEdit>\n#include <QGridLayout>\n#include <QRegExpValidator>\n#include <QCheckBox>\n#include <QPushButton>\n#include <QFileDialog>\n#include <QComboBox>\n#include <QMessageBox>\n#include <QFileInfo>\n#include <QFrame>\n\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/utils/ComboBoxUtils.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/settings/SshSettings.h\"\n#include \"robomongo/gui/utils/GuiConstants.h\"\n\nnamespace {\n    const QString askPasswordText = \"Ask for password each time\";\n    const QString askPassphraseText = \"Ask for passphrase each time\";\n    bool isFileExists(const QString &path) {\n        QFileInfo fileInfo(path);\n        return fileInfo.exists() && fileInfo.isFile();\n    }\n}\n\nnamespace Robomongo\n{\n    SshTunnelTab::SshTunnelTab(ConnectionSettings *settings) :\n        _settings(settings)\n    {\n        SshSettings *info = settings->sshSettings();\n        _useSsh = new QCheckBox(\"Use SSH tunnel\");\n        _useSsh->setStyleSheet(\"margin-bottom: 7px\");\n        _useSsh->setChecked(info->enabled());\n\n        _askForPassword = new QCheckBox(askPasswordText);\n        _askForPassword->setChecked(info->askPassword());\n        VERIFY(connect(_askForPassword, SIGNAL(stateChanged(int)), this, SLOT(askForPasswordStateChanged(int))));\n\n        _sshHostName = new QLineEdit(QtUtils::toQString(info->host()));\n        _userName = new QLineEdit(QtUtils::toQString(info->userName()));\n\n        _sshPort = new QLineEdit(QString::number(info->port()));\n        _sshPort->setFixedWidth(40);\n        QRegExp rx(\"\\\\d+\"); //(0-65554)\n        _sshPort->setValidator(new QRegExpValidator(rx, this));        \n\n        _security = new QComboBox();\n        _security->addItems(QStringList() << \"Password\" << \"Private Key\");\n        VERIFY(connect(_security, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(securityChange(const QString&))));\n\n        _passwordBox = new QLineEdit(QtUtils::toQString(info->userPassword()));\n        _passwordBox->setEchoMode(QLineEdit::Password);\n        _passwordEchoModeButton = new QPushButton;\n        _passwordEchoModeButton->setIcon(GuiRegistry::instance().hideIcon());\n        VERIFY(connect(_passwordEchoModeButton, SIGNAL(clicked()), this, SLOT(togglePasswordEchoMode())));\n\n        _privateKeyBox = new QLineEdit(QtUtils::toQString(info->privateKeyFile()));\n        _privateKeyBox->setPlaceholderText(\n            \"DSA, RSA, and on Windows/macOS ECDSA, Ed25519 keys are supported.\"\n            \" PPK keys must be converted to OPENSSH format.\"\n        );\n\n        _passphraseBox = new QLineEdit(QtUtils::toQString(info->passphrase()));\n        _passphraseBox->setEchoMode(QLineEdit::Password);\n        _passphraseEchoModeButton = new QPushButton;\n        _passphraseEchoModeButton->setIcon(GuiRegistry::instance().hideIcon());\n        VERIFY(connect(_passphraseEchoModeButton, SIGNAL(clicked()), this, SLOT(togglePassphraseEchoMode())));\n\n        _passwordLabel = new QLabel(\"User Password:\");\n        _sshPrivateKeyLabel = new QLabel(\"Private key:\");\n        _sshPassphraseLabel = new QLabel(\"Passphrase:\");\n        _sshAddressLabel = new QLabel(\"SSH Address:\");\n        _sshUserNameLabel = new QLabel(\"SSH User Name:\");\n        _sshAuthMethodLabel = new QLabel(\"SSH Auth Method:\");\n\n/*\n// Commented because of this:\n// https://github.com/paralect/robomongo/issues/391\n\n#ifdef Q_OS_WIN\n        QRegExp pathx(\"([a-zA-Z]:)?([\\\\\\\\/][a-zA-Z0-9_.-]+)+[\\\\\\\\/]?\");\n#else\n        QRegExp pathx(\"^\\\\/?([\\\\d\\\\w\\\\.]+)(/([\\\\d\\\\w\\\\.]+))*\\\\/?$\");\n#endif // Q_OS_WIN\n        _publicKeyBox->setValidator(new QRegExpValidator(pathx, this));\n        _privateKeyBox->setValidator(new QRegExpValidator(pathx, this));\n*/\n\n        QHBoxLayout *hostAndPasswordLayout = new QHBoxLayout;\n        hostAndPasswordLayout->addWidget(_sshHostName);\n        hostAndPasswordLayout->addWidget(new QLabel(\":\"));\n        hostAndPasswordLayout->addWidget(_sshPort);\n\n        QGridLayout *connectionLayout = new QGridLayout;\n        connectionLayout->setAlignment(Qt::AlignTop);\n        connectionLayout->setColumnStretch(1, 1);\n        connectionLayout->setColumnMinimumWidth(0, _passwordLabel->sizeHint().width() + 5);\n\n        connectionLayout->addWidget(_sshAddressLabel ,             1, 0);\n        connectionLayout->addLayout(hostAndPasswordLayout,         1, 1, 1, 2);\n\n        connectionLayout->addWidget(_sshUserNameLabel,             2, 0);\n        connectionLayout->addWidget(_userName,                     2, 1, 1, 2);\n\n        connectionLayout->addWidget(_sshAuthMethodLabel,           4, 0);\n        connectionLayout->addWidget(_security,                     4, 1, 1, 2);\n\n        connectionLayout->addWidget(_passwordLabel,                5, 0);\n        connectionLayout->addWidget(_passwordBox,                  5, 1);\n        connectionLayout->addWidget(_passwordEchoModeButton,       5, 2);\n\n        _selectPrivateFileButton = new QPushButton(\"...\");\n        _selectPrivateFileButton->setMaximumWidth(50);\n\n        connectionLayout->addWidget(_sshPrivateKeyLabel,           7, 0);\n        connectionLayout->addWidget(_privateKeyBox,                7, 1);\n        connectionLayout->addWidget(_selectPrivateFileButton,      7, 2);\n\n        connectionLayout->addWidget(_sshPassphraseLabel,           8, 0);\n        connectionLayout->addWidget(_passphraseBox,                8, 1);\n        connectionLayout->addWidget(_passphraseEchoModeButton,     8, 2);\n        connectionLayout->addWidget(_askForPassword,               9, 1, 1, 2);\n\n        QVBoxLayout *mainLayout = new QVBoxLayout;\n        mainLayout->addWidget(_useSsh);\n        mainLayout->addLayout(connectionLayout);\n        setLayout(mainLayout);\n\n        if (info->authMethod() == \"publickey\") {\n            utils::setCurrentText(_security, \"Private Key\");\n        } else {\n            utils::setCurrentText(_security, \"Password\");\n        }\n\n        securityChange(_security->currentText());\n        VERIFY(connect(_selectPrivateFileButton, SIGNAL(clicked()), this, SLOT(setPrivateFile())));\n\n        sshSupportStateChange(_useSsh->checkState());\n        VERIFY(connect(_useSsh, SIGNAL(stateChanged(int)), this, SLOT(sshSupportStateChange(int))));\n\n        _sshHostName->setFocus();\n\n#ifdef Q_OS_MAC\n        _passwordEchoModeButton->setMaximumWidth(_selectPrivateFileButton->width());\n        _passphraseEchoModeButton->setMaximumWidth(_selectPrivateFileButton->width());\n#else\n        _passwordEchoModeButton->setMinimumWidth(_selectPrivateFileButton->width());\n        _passphraseEchoModeButton->setMinimumWidth(_selectPrivateFileButton->width());\n#endif\n        // Attempt to fix the issue for Windows High DPI button height is slightly taller than other widgets \n#ifdef Q_OS_WIN\n        _passwordEchoModeButton->setMaximumHeight(HighDpiConstants::WIN_HIGH_DPI_BUTTON_HEIGHT);\n        _passphraseEchoModeButton->setMaximumHeight(HighDpiConstants::WIN_HIGH_DPI_BUTTON_HEIGHT);\n        _selectPrivateFileButton->setMaximumHeight(HighDpiConstants::WIN_HIGH_DPI_BUTTON_HEIGHT);\n#endif\n\n        setDisabled(_settings->isReplicaSet());\n        toggleSshCheckboxToolTip(_settings->isReplicaSet());\n    }\n\n    void SshTunnelTab::toggleSshCheckboxToolTip(bool isReplicaSet)\n    {\n        _useSsh->setToolTip(!isReplicaSet ? \"\" :\n            \"SSH is currently not supported for Replica Set connections\");\n    }\n\n    void SshTunnelTab::setPasswordFieldsEnabled(bool enabled)\n    {\n        _sshPassphraseLabel->setEnabled(enabled);\n        _passphraseBox->setEnabled(enabled);\n        _passwordBox->setEnabled(enabled);\n        _passwordLabel->setEnabled(enabled);\n        _passphraseEchoModeButton->setEnabled(enabled);\n        _passwordEchoModeButton->setEnabled(enabled);\n    }\n\n    void SshTunnelTab::askForPasswordStateChanged(int state)\n    {\n        bool checked = state == Qt::Checked;\n        if (checked) {\n            _passphraseBox->setText(\"\");\n            _passwordBox->setText(\"\");\n        }\n\n        setPasswordFieldsEnabled(!checked && _useSsh->isChecked());\n    }\n\n    void SshTunnelTab::sshSupportStateChange(int state)\n    {\n        bool checked = state == Qt::Checked;\n        _sshHostName->setEnabled(checked);\n        _userName->setEnabled(checked);\n        _sshPort->setEnabled(checked);\n        _security->setEnabled(checked);\n\n        _sshPrivateKeyLabel->setEnabled(checked);\n        _privateKeyBox->setEnabled(checked);\n        _selectPrivateFileButton->setEnabled(checked);\n        _sshAddressLabel->setEnabled(checked);\n        _sshUserNameLabel->setEnabled(checked);\n        _sshAuthMethodLabel->setEnabled(checked);\n\n        _askForPassword->setEnabled(checked);\n\n        askForPasswordStateChanged(_askForPassword->checkState());\n\n        if (checked)\n            _sshHostName->setFocus();\n    }\n\n    void SshTunnelTab::securityChange(const QString& method)\n    {\n        bool isKey = method == \"Private Key\";\n\n        _sshPrivateKeyLabel->setVisible(isKey);\n        _privateKeyBox->setVisible(isKey);\n        _selectPrivateFileButton->setVisible(isKey);\n\n        _sshPassphraseLabel->setVisible(isKey);\n        _passphraseBox->setVisible(isKey);\n        _passphraseEchoModeButton->setVisible(isKey);\n        \n        _passwordBox->setVisible(!isKey);\n        _passwordLabel->setVisible(!isKey);\n        _passwordEchoModeButton->setVisible(!isKey);\n        _askForPassword->setText(isKey ? askPassphraseText : askPasswordText);\n    }\n\n    void SshTunnelTab::setPrivateFile()\n    {\n        // Default location\n        QString sshDir = QString(\"%1/.ssh\").arg(QDir::homePath());\n\n        QString filepath = QFileDialog::getOpenFileName(this, \"Select private key file\",\n            sshDir, QObject::tr(\"Private key files (*)\"));\n\n        // Some strange behaviour at least on Mac happens when you\n        // close QFileDialog. Focus switched to a different modal\n        // dialog, not the one that was active before openning QFileDialog.\n        // http://stackoverflow.com/questions/17998811/window-modal-qfiledialog-pushing-parent-to-background-after-exec\n        QApplication::activeModalWidget()->raise();\n        QApplication::activeModalWidget()->activateWindow();\n\n        if (filepath.isNull())\n            return;\n\n        _privateKeyBox->setText(filepath);\n    }\n\n//    SSHInfo::SupportedAuthenticationMetods SshTunnelTab::selectedAuthMethod()\n//    {\n//        if (_security->currentText() == \"Private Key\")\n//            return SSHInfo::PUBLICKEY;\n//\n//        return SSHInfo::PASSWORD;\n//    }\n\n    bool SshTunnelTab::accept()\n    {\n        bool const sshEnabled = this->isEnabled() && _useSsh->isChecked();\n        QString authMethod = _security->currentText() == \"Private Key\" ? \"publickey\" : \"password\";\n\n        // Check for existence of the private key file name\n        // and try to expand \"~\" character when needed\n        QString privateKey = _privateKeyBox->text();\n        if (sshEnabled && authMethod == \"publickey\" &&  !isFileExists(privateKey)) {\n            bool failed = true;\n\n            // Try to expand \"~\" if available\n            if (privateKey.startsWith (\"~/\")) {\n                privateKey.replace (0, 1, QDir::homePath());\n                if (isFileExists(privateKey)) {\n                    failed = false;\n                }\n            }\n\n            if (failed) {\n                QString message = QString(\"Private key file \\\"%1\\\" doesn't exist\").arg(privateKey);\n                QMessageBox::information(this, \"Settings are incomplete\", message);\n                return false;\n            }\n        }\n\n        SshSettings *info = _settings->sshSettings();\n        info->setHost(QtUtils::toStdString(_sshHostName->text()));\n        info->setPort(_sshPort->text().toInt());\n        info->setUserName(QtUtils::toStdString(_userName->text()));\n        info->setUserPassword(QtUtils::toStdString(_passwordBox->text()));\n        info->setAskPassword(_askForPassword->isChecked());\n        info->setPrivateKeyFile(QtUtils::toStdString(privateKey));\n        info->setPassphrase(QtUtils::toStdString(_passphraseBox->text()));\n        info->setAuthMethod(QtUtils::toStdString(authMethod));\n        info->setEnabled(sshEnabled);\n        return true;\n    }\n    \n    void SshTunnelTab::togglePasswordEchoMode()\n    {\n        bool isPassword = _passwordBox->echoMode() == QLineEdit::Password;\n        _passwordBox->setEchoMode(isPassword ? QLineEdit::Normal: QLineEdit::Password);\n        _passwordEchoModeButton->setIcon(isPassword ? GuiRegistry::instance().showIcon() : GuiRegistry::instance().hideIcon());\n    }\n    \n    void SshTunnelTab::togglePassphraseEchoMode()\n    {\n        bool isPassword = _passphraseBox->echoMode() == QLineEdit::Password;\n        _passphraseBox->setEchoMode(isPassword ? QLineEdit::Normal: QLineEdit::Password);\n        _passphraseEchoModeButton->setIcon(isPassword ? GuiRegistry::instance().showIcon() : GuiRegistry::instance().hideIcon());\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/SSHTunnelTab.h",
    "content": "#pragma once\n\n#include <QWidget>\n\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n\nQT_BEGIN_NAMESPACE\nclass QLabel;\nclass QLineEdit;\nclass QCheckBox;\nclass QPushButton;\nclass QComboBox;\nclass QFrame;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class ConnectionSettings;\n\n    class SshTunnelTab : public QWidget\n    {\n        Q_OBJECT\n\n    public:\n        SshTunnelTab(ConnectionSettings *settings);\n        bool accept();\n        void toggleSshCheckboxToolTip(bool isReplicaSet);\n\n    private Q_SLOTS:\n        void sshSupportStateChange(int checked);\n        void askForPasswordStateChanged(int checked);\n        void securityChange(const QString& val);\n        void setPrivateFile();\n        void togglePasswordEchoMode();\n        void togglePassphraseEchoMode();\n\n    private:\n        void setPasswordFieldsEnabled(bool enabled);\n\n    private:        \n        QCheckBox *_useSsh;\n        QCheckBox *_askForPassword;\n        QLineEdit *_sshHostName;\n        QLineEdit *_userName;\n        QLineEdit *_sshPort;\n        QComboBox *_security;\n        QLabel *_sshPrivateKeyLabel;\n        QLabel *_sshPassphraseLabel;\n        QLabel *_sshAddressLabel;\n        QLabel *_sshUserNameLabel;\n        QLabel *_sshAuthMethodLabel;\n\n        QPushButton *_selectPrivateFileButton;\n\n        QLineEdit *_passwordBox;\n        QLabel *_passwordLabel;\n        QPushButton *_passwordEchoModeButton;\n\n        QLineEdit *_privateKeyBox; \n        QLineEdit *_passphraseBox;\n        QPushButton *_passphraseEchoModeButton;\n\n        ConnectionSettings *const _settings;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/dialogs/SSLTab.cpp",
    "content": "#include \"robomongo/gui/dialogs/SSLTab.h\"\n\n#include <QApplication>\n#include <QLabel>\n#include <QLineEdit>\n#include <QGridLayout>\n#include <QCheckBox>\n#include <QPushButton>\n#include <QFileDialog>\n#include <QComboBox>\n#include <QRadioButton>\n#include <QFileInfo>\n#include <QMessageBox>\n\n#include <mongo/util/net/ssl_options.h>\n#include <mongo/util/net/ssl_manager.h>\n\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/settings/SshSettings.h\"\n#include \"robomongo/core/settings/SslSettings.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/utils/ComboBoxUtils.h\"\n#include \"robomongo/gui/utils/GuiConstants.h\"\n\nnamespace \n{\n    // Helper function: Check file existence, return true if file exists, false otherwise\n    bool fileExists(const QString &path) \n    {\n        QFileInfo fileInfo(path);\n        return (fileInfo.exists() && fileInfo.isFile());\n    }\n\n    // Helper hint strings\n    QString const CA_FILE_HINT  = \" mongo --tlsCAFile : Certificate Authority file for TLS\";\n    QString const PEM_FILE_HINT = \" mongo --tlsCertificateKeyFile : PEM certificate/key file for TLS\";\n    QString const PEM_PASS_HINT = \" mongo --tlsCertificateKeyFilePassword : Password for key in PEM file for TLS\";\n    QString const ALLOW_INVALID_HOSTNAME_HINT     = \" mongo --tlsAllowInvalidHostnames : Allow connections \"\n                                                    \"to servers with non-matching hostnames\";\n    QString const ALLOW_INVALID_CERTIFICATES_HINT = \" mongo --tlsAllowInvalidCertificates : Allow connections \"\n                                                    \"to servers with invalid certificates\";\n    QString const CRL_FILE_HINT = \" mongo --tlsCRLFile : Certificate Revocation List file for TLS\";\n}\n\nnamespace Robomongo\n{\n    SSLTab::SSLTab(ConnectionSettings *connSettings) \n        : _connSettings(connSettings)\n    {\n        const SslSettings* const sslSettings = _connSettings->sslSettings();\n\n        // Use TLS section\n        _useSslCheckBox = new QCheckBox(\"Use TLS protocol\");\n        _useSslCheckBox->setStyleSheet(\"margin-bottom: 7px\");\n        VERIFY(connect(_useSslCheckBox, SIGNAL(stateChanged(int)), this, SLOT(useSslCheckBoxStateChange(int))));\n\n        // Auth. Method section\n        _authMethodLabel = new QLabel(\"Authentication Method: \");\n        _authMethodComboBox = new QComboBox;\n        _authMethodComboBox->addItem(\"Self-signed Certificate\");\n        _authMethodComboBox->addItem(\"Use CA Certificate\");\n        _authMethodComboBox->setItemData(0, ALLOW_INVALID_CERTIFICATES_HINT, Qt::ToolTipRole);\n        _authMethodComboBox->setItemData(1, CA_FILE_HINT, Qt::ToolTipRole);\n        _selfSignedInfoStr = new QLabel(\"In general, avoid using self-signed certificates unless the network is trusted. \"\n            \"If self-signed certificate is used, the communications channel will be encrypted however there will be \"\n            \"no validation of server identity.\");\n        _selfSignedInfoStr->setWordWrap(true);\n        _selfSignedInfoStr->setToolTip(ALLOW_INVALID_CERTIFICATES_HINT);\n        _caFileLabel = new QLabel(\"CA Certificate:\");\n        _caFileLabel->setToolTip(CA_FILE_HINT);\n        _caFilePathLineEdit = new QLineEdit;\n        _caFileBrowseButton = new QPushButton(\"...\");\n        _caFileBrowseButton->setMaximumWidth(50);\n        VERIFY(connect(_caFileBrowseButton, SIGNAL(clicked()), this, SLOT(on_caFileBrowseButton_clicked())));\n        VERIFY(connect(_authMethodComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(on_authModeComboBox_change(int))));\n\n        // PEM file section\n        _usePemFileCheckBox = new QCheckBox(\"Use PEM Cert./Key: \");\n        _usePemFileCheckBox->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);\n        _pemFileInfoStr = \n            new QLabel(\"Enable this option to connect to a MongoDB that requires CA-signed client certificates/key file.\");\n        _pemFileInfoStr->setWordWrap(true);\n#ifdef Q_OS_WIN\n        _pemFileInfoStr->setContentsMargins(0,2,0,0);   // Top alignment adjustment required only for Windows\n#endif\n        _pemFileLabel = new QLabel(\"PEM Certificate/Key: \");\n        _pemFileLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);\n        _pemFileLabel->setToolTip(PEM_FILE_HINT);\n        _pemFilePathLineEdit = new QLineEdit;\n        _pemFileBrowseButton = new QPushButton(\"...\");\n        _pemFileBrowseButton->setMaximumWidth(50);\n        VERIFY(connect(_usePemFileCheckBox, SIGNAL(toggled(bool)), this, SLOT(on_usePemFileCheckBox_toggle(bool))));\n        VERIFY(connect(_pemFileBrowseButton, SIGNAL(clicked()), this, SLOT(on_pemKeyFileBrowseButton_clicked())));\n        // PEM Passphrase section\n        _pemPassLabel = new QLabel(\"Passphrase: \");    \n        _pemPassLabel->setToolTip(PEM_PASS_HINT);\n        _pemPassLineEdit = new QLineEdit;\n        _pemPassShowButton = new QPushButton;\n        // Fix for MAC OSX: PEM pass show button was created bigger, making it same size as other pushbuttons\n        _pemPassShowButton->setMaximumWidth(_pemFileBrowseButton->width());\n        VERIFY(connect(_pemPassShowButton, SIGNAL(clicked()), this, SLOT(togglePassphraseShowMode())));\n        togglePassphraseShowMode();\n        _askPemPassCheckBox = new QCheckBox(\"Ask for passphrase each time\");\n        _askPemPassCheckBox->setChecked(sslSettings->askPassphrase());\n        VERIFY(connect(_askPemPassCheckBox, SIGNAL(toggled(bool)), this, SLOT(on_askPemPassCheckBox_toggle(bool))));\n\n        // Advanced options\n        _useAdvancedOptionsCheckBox = new QCheckBox(\"Advanced Options\");\n        _useAdvancedOptionsCheckBox->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);\n        VERIFY(connect(_useAdvancedOptionsCheckBox, SIGNAL(toggled(bool)), this, SLOT(on_useAdvancedOptionsCheckBox_toggle(bool))));\n        _crlFileLabel = new QLabel(\"CRL (Revocation List): \");\n        _crlFileLabel->setToolTip(CRL_FILE_HINT);\n        _crlFilePathLineEdit = new QLineEdit;\n        _crlFileBrowseButton = new QPushButton(\"...\");\n        _crlFileBrowseButton->setMaximumWidth(50);\n        VERIFY(connect(_crlFileBrowseButton, SIGNAL(clicked()), this, SLOT(on_crlFileBrowseButton_clicked())));\n        _allowInvalidHostnamesLabel = new QLabel(\"Invalid Hostnames: \");\n        _allowInvalidHostnamesLabel->setToolTip(ALLOW_INVALID_HOSTNAME_HINT);\n        _allowInvalidHostnamesComboBox = new QComboBox;\n        _allowInvalidHostnamesComboBox->addItem(\"Not Allowed\");\n        _allowInvalidHostnamesComboBox->addItem(\"Allowed\");\n        _allowInvalidHostnamesComboBox->setCurrentIndex(sslSettings->allowInvalidHostnames());\n\n        // Layouts\n        // Auth. method section\n        QGridLayout* gridLayout = new QGridLayout;\n        gridLayout->addWidget(_authMethodLabel,                 0 ,0);\n        gridLayout->addWidget(_authMethodComboBox,              0 ,1, 1, 2);\n        gridLayout->addWidget(_selfSignedInfoStr,               1, 1, 1, 2);\n        gridLayout->addWidget(_caFileLabel,                     2, 0);\n        gridLayout->addWidget(_caFilePathLineEdit,              2, 1);\n        gridLayout->addWidget(_caFileBrowseButton,              2, 2);        \n#ifdef _WIN32\n        gridLayout->addWidget(new QLabel(\"\"),                   3, 0);\n#endif\n        // PEM File Section\n        gridLayout->addWidget(_usePemFileCheckBox,              4, 0, Qt::AlignTop);\n        gridLayout->addWidget(_pemFileInfoStr,                  4, 1, 1, 2);\n        gridLayout->addWidget(_pemFileLabel,                    5, 0);\n        gridLayout->addWidget(_pemFilePathLineEdit,             5, 1);\n        gridLayout->addWidget(_pemFileBrowseButton,             5, 2);\n        gridLayout->addWidget(_pemPassLabel,                    6, 0);\n        gridLayout->addWidget(_pemPassLineEdit,                 6, 1);\n        gridLayout->addWidget(_pemPassShowButton,               6, 2);\n        gridLayout->addWidget(_askPemPassCheckBox,              7, 1, 1, 2);\n#ifdef _WIN32\n        gridLayout->addWidget(new QLabel(\"\"),                   8, 0);        \n#endif\n        // Advanced section\n        gridLayout->addWidget(_useAdvancedOptionsCheckBox,      9, 0, Qt::AlignTop);\n        gridLayout->addWidget(_crlFileLabel,                    10, 0);\n        gridLayout->addWidget(_crlFilePathLineEdit,             10, 1);\n        gridLayout->addWidget(_crlFileBrowseButton,             10, 2);\n        gridLayout->addWidget(_allowInvalidHostnamesLabel,      11, 0);\n        gridLayout->addWidget(_allowInvalidHostnamesComboBox,   11, 1, Qt::AlignLeft);\n\n        auto mainLayout = new QVBoxLayout;\n        mainLayout->setAlignment(Qt::AlignTop);\n        mainLayout->addWidget(_useSslCheckBox);\n        mainLayout->addLayout(gridLayout);\n        setLayout(mainLayout);\n\n        // Load SSL settings to update UI states\n        _useSslCheckBox->setChecked(sslSettings->sslEnabled());\n        _authMethodComboBox->setCurrentIndex(!sslSettings->allowInvalidCertificates());\n        _caFilePathLineEdit->setText(QString::fromStdString(sslSettings->caFile()));\n        _usePemFileCheckBox->setChecked(sslSettings->usePemFile());\n        _pemFilePathLineEdit->setText(QString::fromStdString(sslSettings->pemKeyFile()));\n        _askPemPassCheckBox->setChecked(sslSettings->askPassphrase());\n        // Load passphrase only if askPassphrase is false\n        if (!sslSettings->askPassphrase())\n        {\n            _pemPassLineEdit->setText(QString::fromStdString(sslSettings->pemPassPhrase()));\n        }\n        _useAdvancedOptionsCheckBox->setChecked(sslSettings->useAdvancedOptions());\n        _allowInvalidHostnamesComboBox->setCurrentIndex(sslSettings->allowInvalidHostnames());\n        _crlFilePathLineEdit->setText(QString::fromStdString(sslSettings->crlFile()));\n\n        // Update UI inter-connected (signal-slot) widget states\n        on_authModeComboBox_change(_authMethodComboBox->currentIndex());\n        on_usePemFileCheckBox_toggle(_usePemFileCheckBox->isChecked());\n        on_askPemPassCheckBox_toggle(_askPemPassCheckBox->isChecked());\n        on_useAdvancedOptionsCheckBox_toggle(_useAdvancedOptionsCheckBox->isChecked());\n\n        // Enable/disable all SSL tab widgets\n        useSslCheckBoxStateChange(_useSslCheckBox->checkState());\n\n        // Attempt to fix issue for Windows High DPI button height is slightly taller than other widgets \n#ifdef Q_OS_WIN\n        _caFileBrowseButton->setMaximumHeight(HighDpiConstants::WIN_HIGH_DPI_BUTTON_HEIGHT);\n        _pemFileBrowseButton->setMaximumHeight(HighDpiConstants::WIN_HIGH_DPI_BUTTON_HEIGHT);\n        _pemPassShowButton->setMaximumHeight(HighDpiConstants::WIN_HIGH_DPI_BUTTON_HEIGHT);\n        _crlFileBrowseButton->setMaximumHeight(HighDpiConstants::WIN_HIGH_DPI_BUTTON_HEIGHT);\n#endif\n\n    }\n\n    bool SSLTab::accept()\n    {\n        saveSslSettings();\n        return validate();\n    }\n\n    bool SSLTab::sslEnabled() const \n    { \n        return _useSslCheckBox->isChecked(); \n    }\n\n    void SSLTab::clearTab()\n    {\n        _authMethodComboBox->setCurrentIndex(1);\n        _caFilePathLineEdit->clear();\n        _usePemFileCheckBox->setChecked(false);\n        _pemFilePathLineEdit->clear();\n        _pemPassLineEdit->clear();\n        _useAdvancedOptionsCheckBox->setChecked(false);\n        _allowInvalidHostnamesComboBox->setCurrentIndex(0);\n    }\n\n    void SSLTab::setSslOptions(\n        int index,\n        bool allowInvalidHostnames,\n        std::string_view caFile,\n        std::string_view certPemFile,\n        std::string_view certPemFilePwd\n    ) {\n        _useSslCheckBox->setChecked(true);\n        _authMethodComboBox->setCurrentIndex(index);\n        _caFilePathLineEdit->setText(QString::fromStdString(std::string(caFile)));\n\n        if(!certPemFile.empty()) _usePemFileCheckBox->setChecked(true);\n        _pemFilePathLineEdit->setText(QString::fromStdString(std::string(certPemFile)));\n        _pemPassLineEdit->setText(QString::fromStdString(std::string(certPemFilePwd)));\n\n        if (allowInvalidHostnames) _useAdvancedOptionsCheckBox->setChecked(true);\n        _allowInvalidHostnamesComboBox->setCurrentIndex(allowInvalidHostnames);\n    }\n\n    void SSLTab::useSslCheckBoxStateChange(int state)\n    {\n        bool isChecked = static_cast<bool>(state);\n        _authMethodLabel->setDisabled(!isChecked);\n        _authMethodComboBox->setDisabled(!isChecked);\n        _selfSignedInfoStr->setDisabled(!isChecked);\n        _caFileLabel->setDisabled(!isChecked);\n        _caFilePathLineEdit->setDisabled(!isChecked);\n        _caFileBrowseButton->setDisabled(!isChecked);\n        _usePemFileCheckBox->setDisabled(!isChecked);\n        _pemFileInfoStr->setDisabled(!isChecked);\n        _pemFileLabel->setDisabled(!isChecked);\n        _pemFilePathLineEdit->setDisabled(!isChecked);\n        _pemFileBrowseButton->setDisabled(!isChecked);\n        _pemPassLabel->setDisabled(!isChecked);\n        _pemPassLineEdit->setDisabled(!isChecked);\n        _pemPassShowButton->setDisabled(!isChecked);\n        _askPemPassCheckBox->setDisabled(!isChecked);\n        _useAdvancedOptionsCheckBox->setDisabled(!isChecked);\n        _crlFileLabel->setDisabled(!isChecked);\n        _crlFilePathLineEdit->setDisabled(!isChecked);\n        _crlFileBrowseButton->setDisabled(!isChecked);\n        _allowInvalidHostnamesLabel->setDisabled(!isChecked);\n        _allowInvalidHostnamesComboBox->setDisabled(!isChecked);\n        if (isChecked)  // Update some widgets only if SSL enabled\n        {\n            on_usePemFileCheckBox_toggle(_usePemFileCheckBox->isChecked());\n            on_askPemPassCheckBox_toggle(_askPemPassCheckBox->isChecked());\n        }\n    }\n\n    void SSLTab::on_authModeComboBox_change(int index)\n    {\n        bool const isCaSigned = static_cast<bool>(index);\n        _selfSignedInfoStr->setVisible(!isCaSigned);\n        _caFileLabel->setVisible(isCaSigned);\n        _caFilePathLineEdit->setVisible(isCaSigned);\n        _caFileBrowseButton->setVisible(isCaSigned);\n    }\n\n    void SSLTab::on_usePemFileCheckBox_toggle(bool isChecked)\n    {\n        _pemFileInfoStr->setVisible(!isChecked);\n        _pemFileLabel->setVisible(isChecked);\n        _pemFilePathLineEdit->setVisible(isChecked);\n        _pemFileBrowseButton->setVisible(isChecked);\n        _pemPassLabel->setVisible(isChecked);\n        _pemPassLineEdit->setVisible(isChecked);\n        _pemPassShowButton->setVisible(isChecked);\n        _askPemPassCheckBox->setVisible(isChecked);\n    }\n\n    void SSLTab::on_useAdvancedOptionsCheckBox_toggle(bool isChecked)\n    {\n        _crlFileLabel->setVisible(isChecked);\n        _crlFilePathLineEdit->setVisible(isChecked);\n        _crlFileBrowseButton->setVisible(isChecked);\n        _allowInvalidHostnamesLabel->setVisible(isChecked);\n        _allowInvalidHostnamesComboBox->setVisible(isChecked);\n    }\n\n    void SSLTab::on_caFileBrowseButton_clicked()\n    {\n        QString const& fileName = openFileBrowseDialog(_caFilePathLineEdit->text());\n        if (!fileName.isEmpty()) {\n            _caFilePathLineEdit->setText(fileName);\n        }\n    }\n\n    void SSLTab::on_pemKeyFileBrowseButton_clicked()\n    {\n        QString const& fileName = openFileBrowseDialog(_pemFilePathLineEdit->text());\n        if (!fileName.isEmpty()) {\n            _pemFilePathLineEdit->setText(fileName);\n        }\n    }\n\n    void SSLTab::on_crlFileBrowseButton_clicked()\n    {\n        QString const& fileName = openFileBrowseDialog(_crlFilePathLineEdit->text());\n        if (!fileName.isEmpty()) {\n            _crlFilePathLineEdit->setText(fileName);\n        }\n    }\n\n    void SSLTab::togglePassphraseShowMode()\n    {\n        bool isPassword = _pemPassLineEdit->echoMode() == QLineEdit::Password;\n        _pemPassLineEdit->setEchoMode(isPassword ? QLineEdit::Normal : QLineEdit::Password);\n        _pemPassShowButton->setIcon(isPassword ? GuiRegistry::instance().showIcon() : GuiRegistry::instance().hideIcon());\n    }\n\n    void SSLTab::on_askPemPassCheckBox_toggle(bool checked)\n    {\n        //if (_usePemFileCheckBox->isChecked())\n        //{\n            _pemPassLabel->setDisabled(checked);\n            _pemPassLineEdit->setDisabled(checked);\n            _pemPassShowButton->setDisabled(checked);\n            if (checked)\n            {\n                _pemPassLineEdit->setText(\"\");  // clear passphrase on UI\n            }\n        //}\n    }\n\n    bool SSLTab::validate()\n    {\n        // Validate existence of files\n        auto const& resultAndFileName = checkExistenseOfFiles();\n        if (!resultAndFileName.first)\n        {\n            QString const& nonExistingFile = resultAndFileName.second;\n            QMessageBox errorBox;\n            errorBox.critical(this, \"Error\", (\"Error: \" + nonExistingFile + \" file does not exist\"));\n            errorBox.adjustSize();\n            return false;\n        }\n\n        return true;\n    }\n\n    std::pair<bool,QString> SSLTab::checkExistenseOfFiles() const\n    {\n        if (_caFilePathLineEdit->isEnabled() && _caFilePathLineEdit->isVisible()) {\n            if (!fileExists(_caFilePathLineEdit->text())) {\n                return {false, \"CA-signed certificate\"};\n            }\n        }\n\n        if (_pemFilePathLineEdit->isVisible() && _pemFilePathLineEdit->isEnabled()) {\n            if (!fileExists(_pemFilePathLineEdit->text())) {\n                return {false, \"PEM Certificate/Key\"};\n            }\n        }\n\n        if (!_crlFilePathLineEdit->text().isEmpty()) {\n            if (!fileExists(_crlFilePathLineEdit->text())) {\n                return {false, \"CRL (Revocation List)\"};\n            }\n        }\n        return {true, \"\"};\n    }\n\n    void SSLTab::saveSslSettings() const\n    {\n        SslSettings* sslSettings = _connSettings->sslSettings();\n        sslSettings->enableSSL(_useSslCheckBox->isChecked());\n        sslSettings->setAllowInvalidCertificates(!static_cast<bool>(_authMethodComboBox->currentIndex()));\n        sslSettings->setCaFile(QtUtils::toStdString(_caFilePathLineEdit->text()));\n        sslSettings->setUsePemFile(_usePemFileCheckBox->isChecked());\n        sslSettings->setPemKeyFile(QtUtils::toStdString(_pemFilePathLineEdit->text()));\n        sslSettings->setAskPassphrase(_askPemPassCheckBox->isChecked());\n        // save passphrase only if _askPemPassCheckBox is not checked; otherwise don't save and clear saved passphrase\n        if (!_askPemPassCheckBox->isChecked())\n        {\n            sslSettings->setPemPassPhrase(QtUtils::toStdString(_pemPassLineEdit->text()));\n        }\n        else\n        {\n            sslSettings->setPemPassPhrase(\"\");\n        }\n        sslSettings->setUseAdvancedOptions(_useAdvancedOptionsCheckBox->isChecked());\n        sslSettings->setCrlFile(QtUtils::toStdString(_crlFilePathLineEdit->text()));\n        sslSettings->setAllowInvalidHostnames(static_cast<bool>(_allowInvalidHostnamesComboBox->currentIndex()));\n    }\n\n    QString SSLTab::openFileBrowseDialog(const QString& initialPath)\n    {\n        QString filePath = initialPath;\n        // If user has previously selected a file, initialize file dialog with that file's \n        // path and name; otherwise, use user's home directory.\n        if (filePath.isEmpty())\n        {\n            filePath = QDir::homePath();\n        }\n        QString fileName = QFileDialog::getOpenFileName(this, tr(\"Choose File\"), filePath);\n\n        // Some strange behaviour at least on Mac happens when you close QFileDialog. Focus switched to a different modal\n        // dialog, not the one that was active before openning QFileDialog.\n        // http://stackoverflow.com/questions/17998811/window-modal-qfiledialog-pushing-parent-to-background-after-exec\n        QApplication::activeModalWidget()->raise();\n        QApplication::activeModalWidget()->activateWindow();\n\n        return QDir::toNativeSeparators(fileName);\n    }\n}"
  },
  {
    "path": "src/robomongo/gui/dialogs/SSLTab.h",
    "content": "#pragma once\n\n#include <QWidget>\n\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n\nQT_BEGIN_NAMESPACE\nclass QLabel;\nclass QLineEdit;\nclass QCheckBox;\nclass QPushButton;\nclass QRadioButton;\nclass QComboBox;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class ConnectionSettings;\n\n    class SSLTab : public QWidget\n    {\n        Q_OBJECT\n\n    public:\n        /**\n        * @brief Construct SSL tab of ConnectionDialog\n        * @param settings: Pointer to active connection's ConnectionsSettings member\n        */\n        SSLTab(ConnectionSettings *settings);\n        \n        /**\n        * @brief  Save dialog input into connection's ssl settings\n        * @return true on success, false otherwise\n        */\n        bool accept();\n\n        /**\n        * @return true if use SSL checkbox is checked, false otherwise\n        */\n        bool sslEnabled() const;\n\n        void clearTab();\n        void setSslOptions(\n            int index,\n            bool allowInvalidHostnames,\n            std::string_view caFile,\n            std::string_view certPemFile,\n            std::string_view certPemFilePwd \n         );\n\n    private Q_SLOTS :\n        \n        /**\n        * @brief Disable/enable widgets according to SSL check box state\n        */ \n        void useSslCheckBoxStateChange(int checked);\n        \n        /**\n        * @brief Disable/enable widgets according to state of authentication method combo box\n        */\n        void on_authModeComboBox_change(int index);\n\n        /**\n        * @brief Disable/enable widgets according to state of use PEM file combo box\n        */\n        void on_usePemFileCheckBox_toggle(bool checked);\n\n        /**\n        * @brief Disable/enable widgets according to state of advanced options combo box\n        */\n        void on_useAdvancedOptionsCheckBox_toggle(bool checked);\n        \n        /**\n        * @brief File browsers for SSL related cert/key files\n        */\n        void on_caFileBrowseButton_clicked();\n        void on_pemKeyFileBrowseButton_clicked();\n        void on_crlFileBrowseButton_clicked();\n        \n        /**\n        * @brief Show/hide client cert's passphrase on Show/Hide button pressed\n        */\n        void togglePassphraseShowMode();\n\n        /**\n        * @brief Enable/disable/clean PEM passphrase widgets section\n        */\n        void on_askPemPassCheckBox_toggle(bool checked);\n\n    private:\n\n        /**\n        * @brief Do validation according to user input in UI\n        * @return true on success, false otherwise\n        */\n        bool validate();\n\n        /**\n        * @brief  Check existence of files: CA cert, Client Cert and CRL file\n        * @return true if all files exist, false any of them does not exist\n        * @return QString Lable of file which does not exist, empty string if all files exist\n        */\n        std::pair<bool, QString> checkExistenseOfFiles() const;\n\n        /**\n        * @brief Save dialog input into connection's ssl settings\n        */\n        void saveSslSettings() const;\n\n        /**\n        * @brief \n        * @param initialPath Previously selected file path\n        * @return Selected file absolute path and file name\n        */\n        QString openFileBrowseDialog(const QString& initialPath);\n\n        /**\n        * @brief Main checkbox to disable/enable all other SSL tab widgets\n        */\n        QCheckBox *_useSslCheckBox;\n        \n        /**\n        * @brief Auth. Method widgets\n        */\n        QLabel *_authMethodLabel;\n        QComboBox *_authMethodComboBox;\n        QLabel *_selfSignedInfoStr;\n        QLabel *_caFileLabel;\n        QLineEdit *_caFilePathLineEdit;\n        QPushButton *_caFileBrowseButton;\n\n        /**\n        * @brief PEM file widgets\n        */\n        QCheckBox* _usePemFileCheckBox;\n        QLabel* _pemFileInfoStr;\n        QLabel* _pemFileLabel;\n        QLineEdit *_pemFilePathLineEdit;\n        QPushButton *_pemFileBrowseButton;\n        QLabel* _pemPassLabel;\n        QLineEdit* _pemPassLineEdit;\n        QPushButton* _pemPassShowButton;\n        QCheckBox* _askPemPassCheckBox;\n\n        /**\n        * @brief Advanced options widgets\n        */\n        QCheckBox* _useAdvancedOptionsCheckBox;\n        QLabel *_crlFileLabel;\n        QLineEdit *_crlFilePathLineEdit;\n        QPushButton *_crlFileBrowseButton;\n        QLabel *_allowInvalidHostnamesLabel;\n        QComboBox *_allowInvalidHostnamesComboBox;\n\n        /**\n        * @brief Pointer to active connection's settings\n        */\n        ConnectionSettings *const _connSettings;\n    };\n} /* end of Robomongo namespace */\n"
  },
  {
    "path": "src/robomongo/gui/editors/FindFrame.cpp",
    "content": "#include \"robomongo/gui/editors/FindFrame.h\"\n\n#include <QVBoxLayout>\n#include <QHBoxLayout>\n#include <QLineEdit>\n#include <QPushButton>\n#include <QCheckBox>\n#include <QToolButton>\n#include <Qsci/qsciscintilla.h>\n#include <QMessageBox>\n#include <QKeyEvent>\n\n#include \"robomongo/gui/editors/PlainJavaScriptEditor.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/KeyboardManager.h\"\n#include \"robomongo/gui/widgets/workarea/ScriptWidget.h\"\n\nnamespace Robomongo\n{\n    FindFrame::FindFrame(QWidget *parent) : \n        BaseClass(parent),\n        _parent(parent),\n        _scin(new RoboScintilla()),\n        _findPanel(new QFrame(this)),\n        _close(new QToolButton(this)),\n        _findLine(new QLineEdit(this)),\n        _next(new QPushButton(\"Next\", this)),\n        _prev(new QPushButton(\"Previous\", this)),\n        _caseSensitive(new QCheckBox(\"Match case\", this)),\n        _commentSign(\"// \"),\n        _commentSignLength(3)\n    {\n        _close->setIcon(QIcon(\":/robomongo/icons/close_2_16x16.png\"));\n        _close->setToolButtonStyle(Qt::ToolButtonIconOnly);\n        _close->setIconSize(QSize(16, 16));\n        _close->hide(); // We do not need close button because ESC works\n\n        _findLine->setAlignment(Qt::AlignLeft | Qt::AlignAbsolute);\n\n        QHBoxLayout *layout = new QHBoxLayout();\n        layout->setContentsMargins(2, 0, 6, 0);\n        layout->setSpacing(7);\n        layout->addWidget(_findLine);\n        layout->addWidget(_next);\n        layout->addWidget(_prev);\n        layout->addWidget(_caseSensitive);\n\n        _findPanel->setFixedHeight(HeightFindPanel);\n        _findPanel->setLayout(layout);\n\n        QVBoxLayout *mainLayout = new QVBoxLayout();\n        mainLayout->setContentsMargins(0, 0, 0, 0);\n        mainLayout->setSpacing(0);\n        mainLayout->addWidget(_scin, 1);\n        mainLayout->addWidget(_findPanel, 0, Qt::AlignBottom);\n        setLayout(mainLayout);\n\n        _findPanel->hide();\n\n        VERIFY(connect(_close, SIGNAL(clicked()), _findPanel, SLOT(hide())));\n        VERIFY(connect(_next, SIGNAL(clicked()), this, SLOT(goToNextElement())));\n        VERIFY(connect(_prev, SIGNAL(clicked()), this, SLOT(goToPrevElement())));\n    }\n\n    void FindFrame::wheelEvent(QWheelEvent *e)\n    {\n        return BaseClass::wheelEvent(e);\n    }\n\n    void FindFrame::keyPressEvent(QKeyEvent *keyEvent)\n    {\n        bool isFocusScin = _scin->isActiveWindow();\n        bool isShowFind = _findPanel->isVisible();\n        if (Qt::Key_Escape == keyEvent->key() && isFocusScin && isShowFind) {\n            // Hide & Show of Scintilla widget solves problem of UI blinking\n            _scin->hide();\n            _findPanel->hide();\n            _scin->setFocus();\n            _scin->show();\n            return keyEvent->accept();\n        } else if (Qt::Key_Return == keyEvent->key() && (keyEvent->modifiers() & Qt::ShiftModifier) && isFocusScin && isShowFind) {\n            goToPrevElement();\n        } else if (Qt::Key_Return == keyEvent->key() && isFocusScin && isShowFind) {\n            goToNextElement();\n        } else if (((keyEvent->modifiers() & Qt::ControlModifier) && keyEvent->key() == Qt::Key_F) && isFocusScin) {\n            _findPanel->show();\n            _findLine->setFocus();\n            _findLine->selectAll();\n            return keyEvent->accept();\n        } else if (KeyboardManager::isToggleCommentsShortcut(keyEvent)) {\n            toggleComments();\n            return keyEvent->accept();\n        } else {\n            return BaseClass::keyPressEvent(keyEvent);\n        }\n    }\n\n    void FindFrame::goToNextElement()\n    {\n        findElement(true);\n    }\n\n    void FindFrame::goToPrevElement()\n    {\n        findElement(false);\n    }\n\n    void FindFrame::findElement(bool forward)\n    {\n        const QString &text = _findLine->text();\n        if (!text.isEmpty()) {\n            bool re = false;\n            bool wo = false;\n            bool looped = true;\n            int index = 0;\n            int line = 0;\n            _scin->getCursorPosition(&line, &index);\n\n            if (!forward)\n               index -= _scin->selectedText().length();\n\n            _scin->setCursorPosition(line, 0);\n            bool isFounded = _scin->findFirst(text, re, _caseSensitive->checkState() == Qt::Checked, wo, looped, forward, line, index);\n\n            if (isFounded) {\n                _scin->ensureCursorVisible(); \n            }\n            else {\n                QMessageBox::warning(this, tr(\"Search\"), tr(\"The specified text was not found.\"));\n            }            \n        }\n    }\n    \n    void FindFrame::toggleComments()\n    {\n        int lineFrom, indexFrom, lineTo, indexTo;\n        QString line;\n        ScriptWidget *container;\n        bool commentOut, is_textAndCursorNotificationsDisabled;\n                \n        _scin->getSelection(&lineFrom, &indexFrom, &lineTo, &indexTo);\n        if (-1 == indexTo) {\n            // There is no selection. Get cursor position\n            _scin->getCursorPosition(&lineFrom, &indexFrom);\n            lineTo = lineFrom;\n        }\n        // Define what action should be done for each selected line        \n        line = _scin->text(lineFrom);\n        if (line.startsWith(_commentSign)) {\n            // Remove comment sign\n            commentOut = false;\n        } else {\n            // Add comment sign\n            commentOut = true;\n        }\n        \n        // To prevent displaying of autocomplete menu\n        container = dynamic_cast<ScriptWidget*>(_parent);\n        if (NULL != container) {\n            is_textAndCursorNotificationsDisabled = container->getDisableTextAndCursorNotifications();\n            container->setDisableTextAndCursorNotifications(true);\n        }\n\n        for (int lineIndex = lineFrom; lineIndex <= lineTo; ++lineIndex) {\n            setLineComment(lineIndex, commentOut);\n        }\n        \n        /** \n         * Changing cursor position cancels the selection, so restoring original position of the cursor is done \n         * only if there was no selection at the beginning of the operation\n         */\n        if (-1 == indexTo) {\n            // No selection, set original cursor position\n            if (commentOut) {\n                _scin->setCursorPosition(lineFrom, indexFrom + _commentSignLength);\n            } else {\n                _scin->setCursorPosition(lineFrom, indexFrom - _commentSignLength);\n            }\n        } else {\n            // Restore original selection\n            if (commentOut) {\n                _scin->setSelection(lineFrom, indexFrom + _commentSignLength, lineTo, indexTo + _commentSignLength);\n            } else {\n                _scin->setSelection(lineFrom, indexFrom - _commentSignLength, lineTo, indexTo - _commentSignLength);\n            }\n        }\n        \n        if (NULL != container) {\n            container->setDisableTextAndCursorNotifications(is_textAndCursorNotificationsDisabled);\n        }\n    }\n    \n    void FindFrame::setLineComment(const int lineIndex, const bool commentOut)\n    {\n        QString line;\n        line = _scin->text(lineIndex);\n        if (commentOut) {\n            // Add comment sign\n            _scin->insertAt(_commentSign, lineIndex, 0);\n        } else if (line.startsWith(_commentSign)) {\n            // Remove comment sign\n            _scin->setSelection(lineIndex, 0, lineIndex, _commentSignLength);\n            _scin->removeSelectedText();\n        }\n    }\n\n    FindFrame::~FindFrame()\n    {\n        delete _scin;\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/editors/FindFrame.h",
    "content": "#pragma once\n\n#include <QFrame>\n\nQT_BEGIN_NAMESPACE\nclass QTextEdit;\nclass QPushButton;\nclass QToolButton;\nclass QCheckBox;\nclass QLineEdit;\nQT_END_NAMESPACE\nclass QsciScintilla;\n\nnamespace Robomongo\n{\n    class RoboScintilla;\n\n    class FindFrame : public QFrame\n    {\n        Q_OBJECT\n    public:\n        enum\n        {\n            HeightFindPanel = 38\n        };\n        typedef QFrame BaseClass;\n        explicit FindFrame(QWidget *parent);\n        RoboScintilla *const sciScintilla() const\n        {\n            return _scin;\n        }\n        void toggleComments();\n        virtual ~FindFrame();\n    protected:\n        virtual void wheelEvent(QWheelEvent *e);\n        virtual void keyPressEvent(QKeyEvent *e);\n\n    private Q_SLOTS:\n        void goToNextElement();\n        void goToPrevElement();\n\n    private:\n        void findElement(bool forward);\n        void setLineComment(const int lineIndex, const bool commentOut);\n        RoboScintilla *const _scin;\n        QFrame *const _findPanel;\n        QLineEdit *const _findLine;\n        QToolButton *const _close;\n        QPushButton *const _next;\n        QPushButton *const _prev;\n        QCheckBox *const  _caseSensitive;\n        const char *_commentSign;\n        const int _commentSignLength;\n        QWidget *_parent;\n    };\n}\n\n"
  },
  {
    "path": "src/robomongo/gui/editors/JSLexer.cpp",
    "content": "#include \"robomongo/gui/editors/JSLexer.h\"\n\n#include <Qsci/qscilexerjavascript.h>\n\nnamespace Robomongo\n{\n    JSLexer::JSLexer(QObject *parent) : QsciLexerJavaScript(parent)\n    {\n    }\n\n    QColor JSLexer::defaultPaper(int style) const\n    {\n        return QColor(73, 76, 78);\n        //return QColor(48, 10, 36); // Ubuntu-style background\n    }\n\n    QColor JSLexer::defaultColor(int style) const\n    {\n        switch (style)\n        {\n        case Default:\n            return QColor(\"#FFFFFF\");\n\n        case Comment:\n        case CommentLine:\n            return QColor(\"#999999\");\n\n        case CommentDoc:\n        case CommentLineDoc:\n            return QColor(\"#999999\");\n\n        case Number:\n            //return QColor(\"#DBF76C\");\n            return QColor(\"#FFA09E\");\n\n        case Keyword:\n            //return QColor(\"#FDE15D\");\n            return QColor(\"#BEE5FF\");\n\n        case DoubleQuotedString:\n        case SingleQuotedString:\n        case RawString:\n            //return QColor(\"#5ED363\");\n            return QColor(\"#C6F079\");\n\n        case PreProcessor:\n            return QColor(\"#00FF00\");\n\n        case Operator:\n        case UnclosedString:\n            //return QColor(\"#FF7729\");\n            //return QColor(\"#AFBED4\");\n            return QColor(\"#FFD14D\");\n\n\n        case Regex:\n            return QColor(\"#FFFFFF\");\n\n        case CommentDocKeyword:\n            return QColor(\"#FFFFFF\");\n\n        case CommentDocKeywordError:\n            return QColor(\"#FFFFFF\");\n\n        case InactiveDefault:\n        case InactiveUUID:\n        case InactiveCommentLineDoc:\n        case InactiveKeywordSet2:\n        case InactiveCommentDocKeyword:\n        case InactiveCommentDocKeywordError:\n            return QColor(\"#FFFFFF\");\n\n        case InactiveComment:\n        case InactiveCommentLine:\n        case InactiveNumber:\n            return QColor(\"#FFFFFF\");\n\n        case InactiveCommentDoc:\n            return QColor(\"#FFFFFF\");\n\n        case InactiveKeyword:\n            return QColor(\"#FFFFFF\");\n\n        case InactiveDoubleQuotedString:\n        case InactiveSingleQuotedString:\n        case InactiveRawString:\n            return QColor(\"#FFFFFF\");\n\n        case InactivePreProcessor:\n            return QColor(\"#FFFFFF\");\n\n        case InactiveOperator:\n        case InactiveIdentifier:\n        case InactiveGlobalClass:\n            return QColor(\"#FFFFFF\");\n\n        case InactiveUnclosedString:\n            return QColor(\"#FFFFFF\");\n\n        case InactiveVerbatimString:\n            return QColor(\"#FFFFFF\");\n\n        case InactiveRegex:\n            return QColor(\"#FFFFFF\");\n        }\n\n        return QColor(\"#FFFFFF\");\n        //    return QsciLexer::defaultColor(style);\n    }\n\n    const char *JSLexer::keywords(int set) const\n    {\n        if (set == 1)\n            return\n                \"abstract boolean break byte case catch char class const continue \"\n                \"debugger default delete do double else enum export extends final \"\n                \"finally float for function goto if implements import in instanceof \"\n                \"int interface long native new package private protected public \"\n                \"return short static super switch synchronized this throw throws \"\n                \"transient try typeof var void volatile while with \"\n                \"ISODate ObjectId Mongo Date NumberInt Number NumberLong Timestamp _id null false true \"\n                \"UUID LUUID PYUUID CSUUID JUUID NUUID \";\n\n        return 0;\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/editors/JSLexer.h",
    "content": "#pragma once\n\n#include <QObject>\n#include <QColor>\n#include <Qsci/qscilexerjavascript.h>\n\nnamespace Robomongo\n{\n    class JSLexer : public QsciLexerJavaScript\n    {\n        Q_OBJECT\n        // This Q_OBJECT macro produce the following error for VC, but works on GCC:\n        // unresolved external symbol \"public: static struct QMetaObject const...\n        // Q_OBJECT\n\n    public:\n        JSLexer(QObject *parent = 0);\n        QColor defaultPaper(int style) const;\n        QColor defaultColor(int style) const;\n        const char *keywords(int set) const;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/editors/PlainJavaScriptEditor.cpp",
    "content": "#include \"robomongo/gui/editors/PlainJavaScriptEditor.h\"\n\n#include <QPainter>\n#include <QApplication>\n#include <QKeyEvent>\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace\n{\n    /**\n    * @brief Returns the number of digits in an 32-bit integer\n    * http://stackoverflow.com/questions/1489830/efficient-way-to-determine-number-of-digits-in-an-integer\n    */\n    int getNumberOfDigits(int x)\n    {\n        if (x < 0) return getNumberOfDigits(-x) + 1;\n\n        if (x >= 10000) {\n            if (x >= 10000000) {\n                if (x >= 100000000) {\n                    if (x >= 1000000000)\n                        return 10;\n                    return 9;\n                }\n                return 8;\n            }\n            if (x >= 100000) {\n                if (x >= 1000000)\n                    return 7;\n                return 6;\n            }\n            return 5;\n        }\n        if (x >= 100) {\n            if (x >= 1000)\n                return 4;\n            return 3;\n        }\n        if (x >= 10)\n            return 2;\n        return 1;\n    }\n}\n\nnamespace Robomongo\n{\n    const QColor RoboScintilla::marginsBackgroundColor = QColor(73, 76, 78);\n    const QColor RoboScintilla::caretForegroundColor = QColor(\"#FFFFFF\");\n    const QColor RoboScintilla::matchedBraceForegroundColor = QColor(\"#FF8861\");\n\n    RoboScintilla::RoboScintilla(QWidget *parent) : QsciScintilla(parent),\n        _ignoreEnterKey(false),\n        _ignoreTabKey(false),\n        _lineNumberDigitWidth(0),\n        _lineNumberMarginWidth(0)\n    {\n        setAutoIndent(true);\n        setIndentationsUseTabs(false);\n        setIndentationWidth(indentationWidth);\n        setUtf8(true);\n        setMarginWidth(1, 0);\n        setCaretForegroundColor(caretForegroundColor);\n        setMatchedBraceForegroundColor(matchedBraceForegroundColor); //1AB0A6\n        setMatchedBraceBackgroundColor(marginsBackgroundColor);\n        setContentsMargins(0, 0, 0, 0);\n        setViewportMargins(3, 3, 3, 3);\n        QFont ourFont = GuiRegistry::instance().font();\n        setMarginsFont(ourFont);\n        setMarginLineNumbers(0, true);\n        setMarginsBackgroundColor(QColor(53, 56, 58));\n        setMarginsForegroundColor(QColor(173, 176, 178));\n\n        SendScintilla(QsciScintilla::SCI_STYLESETFONT, 1, ourFont.family().data());\n        SendScintilla(QsciScintilla::SCI_SETHSCROLLBAR, 0);\n\n        setWrapMode((QsciScintilla::WrapMode)QsciScintilla::SC_WRAP_NONE);\n        setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); \n        setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); \n\n        // Cache width of one digit\n#ifdef Q_OS_WIN\n        _lineNumberDigitWidth = rowNumberWidth;\n#else\n        _lineNumberDigitWidth = textWidth(STYLE_LINENUMBER, \"0\");\n#endif\n        updateLineNumbersMarginWidth();\n\n        setLineNumbers(AppRegistry::instance().settingsManager()->lineNumbers());\n        setUtf8(true);\n        VERIFY(connect(this, SIGNAL(linesChanged()), this, SLOT(updateLineNumbersMarginWidth())));\n    }\n\n    int RoboScintilla::lineNumberMarginWidth() const\n    {\n        return marginWidth(0);\n    }\n\n    int RoboScintilla::textWidth(int style, const QString &text)\n    {\n        const char *byteArray = (text.toUtf8()).constData();\n        return SendScintilla(SCI_TEXTWIDTH, style, byteArray);\n    }\n\n    void RoboScintilla::wheelEvent(QWheelEvent *e)\n    {\n        if (this->isActiveWindow()) {\n            QsciScintilla::wheelEvent(e);\n        }\n        else {\n            qApp->sendEvent(parentWidget(), e);\n            e->accept();\n        }\n    }\n\n    void RoboScintilla::setLineNumbers(bool displayNumbers)\n    {\n        if (displayNumbers) {\n            setMarginWidth(0, _lineNumberMarginWidth);\n        }\n        else {\n            setMarginWidth(0, 0);\n        }\n    }\n\n    void RoboScintilla::toggleLineNumbers()\n    {\n        setLineNumbers(!lineNumberMarginWidth());\n    }\n\n    void RoboScintilla::keyPressEvent(QKeyEvent *keyEvent)\n    {\n        if (_ignoreEnterKey) {\n            if (keyEvent->key() == Qt::Key_Return) {\n                keyEvent->ignore();\n                _ignoreEnterKey = false;\n                return;\n            }\n        }\n\n        if (_ignoreTabKey) {\n            if (keyEvent->key() == Qt::Key_Tab) {\n                keyEvent->ignore();\n                _ignoreTabKey = false;\n                return;\n            }\n        }\n\n        if (keyEvent->key() == Qt::Key_F11) {\n            keyEvent->ignore();\n            toggleLineNumbers();\n            return;\n        }\n\n        if (((keyEvent->modifiers() & Qt::ControlModifier) &&\n            (keyEvent->key() == Qt::Key_F4 || keyEvent->key() == Qt::Key_W ||\n             keyEvent->key() == Qt::Key_T || keyEvent->key() == Qt::Key_Space ||\n             keyEvent->key() == Qt::Key_F || keyEvent->key() == Qt::Key_Slash))\n            || keyEvent->key() == Qt::Key_Escape /*|| keyEvent->key() == Qt::Key_Return*/\n            || ((keyEvent->modifiers() & Qt::ControlModifier) && (keyEvent->modifiers() & Qt::AltModifier) && keyEvent->key() == Qt::Key_Left)\n            || ((keyEvent->modifiers() & Qt::ControlModifier) && (keyEvent->modifiers() & Qt::AltModifier) && keyEvent->key() == Qt::Key_Right)\n            || ((keyEvent->modifiers() & Qt::ControlModifier) && (keyEvent->modifiers() & Qt::ShiftModifier) && keyEvent->key() == Qt::Key_C)\n           )\n        {\n            keyEvent->ignore();\n        }\n        else\n        {\n            BaseClass::keyPressEvent(keyEvent);\n        }\n    }\n\n    void RoboScintilla::updateLineNumbersMarginWidth()\n    {\n        int numberOfDigits = getNumberOfDigits(lines());\n        _lineNumberMarginWidth = numberOfDigits * _lineNumberDigitWidth + rowNumberWidth;\n\n        // If line numbers margin already displayed, update its width\n        if (lineNumberMarginWidth()) {\n            setMarginWidth(0, _lineNumberMarginWidth);\n        }\n    }\n\n    void RoboScintilla::setAppropriateBraceMatching() {\n#ifdef Q_OS_MAC\n        // On Mac OS when brace matching is enabled, text\n        // will blink when you move cursor to some brace or\n        // when inside braces. This behaviour is not fully fixed\n        // in QScintilla 2.9.1 and 2.8.4\n        setBraceMatching(QsciScintilla::NoBraceMatch);\n#else\n        setBraceMatching(QsciScintilla::StrictBraceMatch);\n#endif\n    }\n\n\n}\n"
  },
  {
    "path": "src/robomongo/gui/editors/PlainJavaScriptEditor.h",
    "content": "#pragma once\n\n#include <Qsci/qsciscintilla.h>\n\nnamespace Robomongo\n{\n    class RoboScintilla : public QsciScintilla\n    {\n        Q_OBJECT\n    public:\n        typedef QsciScintilla BaseClass;\n        enum { rowNumberWidth = 6, indentationWidth = 4 };\n        static const QColor marginsBackgroundColor;\n        static const QColor caretForegroundColor;\n        static const QColor matchedBraceForegroundColor;\n\n        RoboScintilla(QWidget *parent = NULL);\n        void setIgnoreEnterKey(bool ignore) { _ignoreEnterKey = ignore; }\n        void setIgnoreTabKey(bool ignore) { _ignoreTabKey = ignore; }\n        int lineNumberMarginWidth() const;\n        int textWidth(int style, const QString &text);\n        void setAppropriateBraceMatching();\n\n    protected:\n        void wheelEvent(QWheelEvent *e);\n        void keyPressEvent(QKeyEvent *e);\n\n    private Q_SLOTS:\n        void updateLineNumbersMarginWidth();\n\n    private:\n        void setLineNumbers(bool displayNumbers);\n        void toggleLineNumbers();\n        bool _ignoreEnterKey;\n        bool _ignoreTabKey;\n        int _lineNumberMarginWidth;\n        int _lineNumberDigitWidth;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/resources/gui.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/robomongo\">\n        <file>icons/collection_16x16.png</file>\n        <file>icons/server_16x16.gif</file>\n        <file>icons/left_16x16.png</file>\n        <file>icons/right_16x16.png</file>\n        <file>icons/bson_binary_16x16.png</file>\n        <file>icons/bson_bool_16x16.png</file>\n        <file>icons/bson_datetime_16x16.png</file>\n        <file>icons/bson_double_16x16.png</file>\n        <file>icons/bson_decimal128_16x16.png</file>\n        <file>icons/bson_integer_16x16.png</file>\n        <file>icons/bson_null_16x16.png</file>\n        <file>icons/bson_string_16x16.png</file>\n        <file>icons/bson_unsupported_16x16.png</file>\n        <file>icons/bson_array_16x16.png</file>\n        <file>icons/bson_object_16x16.png</file>\n        <file>icons/database_16x16.png</file>\n        <file>icons/loading.gif</file>\n        <file>icons/loading_ticks_40x40.gif</file>\n        <file>scripts/esprima.js</file>\n        <file>scripts/uuidhelpers.js</file>\n        <file>icons/maximize.gif</file>\n        <file>icons/undock.png</file>\n        <file>icons/dock.png</file>\n        <file>icons/maximize.png</file>\n        <file>icons/minimize.png</file>\n        <file>icons/text_16x16.png</file>\n        <file>icons/tree_16x16.png</file>\n        <file>icons/rotate_16x16.png</file>\n        <file>icons/close_16x16.png</file>\n        <file>icons/close_hover_16x16.png</file>\n        <file>icons/close_2_16x16.png</file>\n        <file>icons/close_2_Mac_16x16.png</file>\n        <file>icons/close_hover_16x16_original.png</file>\n        <file>icons/text2_16x16.png</file>\n        <file>icons/mongodb_16x16.png</file>\n        <file>icons/mongodb_icon_for_MAC.png</file>\n        <file>icons/connect_24x24.png</file>\n        <file>icons/server_16x16.png</file>\n        <file>icons/server_primary_16x16.png</file>\n        <file>icons/server_secondary_16x16.png</file>\n        <file>icons/server_imported_16x16.png</file>\n        <file>icons/replica_set_16x16.png</file>\n        <file>icons/replica_set_offline_16x16.png</file>\n        <file>icons/execute_24x24.png</file>\n        <file>icons/main_window_icon_old.png</file>\n        <file>icons/logo-256x256.png</file>\n        <file>icons/logo-20x20.png</file>\n        <file>icons/handsup-20x20.png</file>\n        <file>icons/text_highlighted_16x16.png</file>\n        <file>icons/tree_highlighted_16x16.png</file>\n        <file>icons/maximize_highlighted_16x16.png</file>\n        <file>icons/table_16x16.png</file>\n        <file>icons/table_highlighted_16x16.png</file>\n        <file>icons/no_mark_24x24.png</file>\n        <file>icons/no_mark_24x24@2x.png</file>\n        <file>icons/yes_mark_24x24.png</file>\n        <file>icons/yes_mark_24x24@2x.png</file>\n        <file>icons/skip_mark_24x24.png</file>\n        <file>icons/skip_mark_24x24@2x.png</file>\n        <file>icons/question_mark_24x24.png</file>\n        <file>icons/question_mark_24x24@2x.png</file>\n        <file>icons/time_16x16.png</file>\n        <file>icons/key_16x16.png</file>\n        <file>icons/progress_bar.gif</file>\n        <file>icons/custom_16x16.gif</file>\n        <file>icons/custom_16x16.png</file>\n        <file>icons/custom_highlighted_16x16.png</file>\n        <file>icons/user_16x16.png</file>\n        <file>icons/stop_24x24.png</file>\n        <file>icons/function_16x16.png</file>\n        <file>icons/index_16x16.png</file>\n        <file>icons/hide_64x64.png</file>\n        <file>icons/show_64x64.png</file>\n        <file>icons/export_64x64.png</file>\n        <file>icons/import_64x64.png</file>\n        <file>icons/plus_sign.png</file>\n        <file>icons/minus_sign.png</file>\n        <file>icons/delete.png</file>\n        <file>icons/delete_red_color.png</file>\n        <file>icons/delete_mouse_hovered.png</file>\n        <file>icons/welcome_tab_icon.png</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "src/robomongo/gui/resources/scripts/esprima.js",
    "content": "﻿/*\n  Copyright (c) jQuery Foundation, Inc. and Contributors, All Rights Reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/* Robomongo\n   - esprima.js version 2.7.3 added to support ES6 features.\n     https://cdn.rawgit.com/jquery/esprima/2.7.3/esprima.js  \n     https://github.com/jquery/esprima/blob/master/ChangeLog\n     http://esprima.org/\n*/\n\n(function (root, factory) {\n    'use strict';\n\n    // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js,\n    // Rhino, and plain browser loading.\n\n    /* istanbul ignore next */\n    if (typeof define === 'function' && define.amd) {\n        define(['exports'], factory);\n    } else if (typeof exports !== 'undefined') {\n        factory(exports);\n    } else {\n        factory((root.esprima = {}));\n    }\n}(this, function (exports) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        FnExprTokens,\n        Syntax,\n        PlaceHolders,\n        Messages,\n        Regex,\n        source,\n        strict,\n        index,\n        lineNumber,\n        lineStart,\n        hasLineTerminator,\n        lastIndex,\n        lastLineNumber,\n        lastLineStart,\n        startIndex,\n        startLineNumber,\n        startLineStart,\n        scanning,\n        length,\n        lookahead,\n        state,\n        extra,\n        isBindingElement,\n        isAssignmentTarget,\n        firstCoverInitializedNameError;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8,\n        RegularExpression: 9,\n        Template: 10\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n    TokenName[Token.RegularExpression] = 'RegularExpression';\n    TokenName[Token.Template] = 'Template';\n\n    // A function following one of those tokens is an expression.\n    FnExprTokens = ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new',\n                    'return', 'case', 'delete', 'throw', 'void',\n                    // assignment operators\n                    '=', '+=', '-=', '*=', '/=', '%=', '<<=', '>>=', '>>>=',\n                    '&=', '|=', '^=', ',',\n                    // binary/unary operators\n                    '+', '-', '*', '/', '%', '++', '--', '<<', '>>', '>>>', '&',\n                    '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=',\n                    '<=', '<', '>', '!=', '!=='];\n\n    Syntax = {\n        AssignmentExpression: 'AssignmentExpression',\n        AssignmentPattern: 'AssignmentPattern',\n        ArrayExpression: 'ArrayExpression',\n        ArrayPattern: 'ArrayPattern',\n        ArrowFunctionExpression: 'ArrowFunctionExpression',\n        BlockStatement: 'BlockStatement',\n        BinaryExpression: 'BinaryExpression',\n        BreakStatement: 'BreakStatement',\n        CallExpression: 'CallExpression',\n        CatchClause: 'CatchClause',\n        ClassBody: 'ClassBody',\n        ClassDeclaration: 'ClassDeclaration',\n        ClassExpression: 'ClassExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        ContinueStatement: 'ContinueStatement',\n        DoWhileStatement: 'DoWhileStatement',\n        DebuggerStatement: 'DebuggerStatement',\n        EmptyStatement: 'EmptyStatement',\n        ExportAllDeclaration: 'ExportAllDeclaration',\n        ExportDefaultDeclaration: 'ExportDefaultDeclaration',\n        ExportNamedDeclaration: 'ExportNamedDeclaration',\n        ExportSpecifier: 'ExportSpecifier',\n        ExpressionStatement: 'ExpressionStatement',\n        ForStatement: 'ForStatement',\n        ForOfStatement: 'ForOfStatement',\n        ForInStatement: 'ForInStatement',\n        FunctionDeclaration: 'FunctionDeclaration',\n        FunctionExpression: 'FunctionExpression',\n        Identifier: 'Identifier',\n        IfStatement: 'IfStatement',\n        ImportDeclaration: 'ImportDeclaration',\n        ImportDefaultSpecifier: 'ImportDefaultSpecifier',\n        ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',\n        ImportSpecifier: 'ImportSpecifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        MetaProperty: 'MetaProperty',\n        MethodDefinition: 'MethodDefinition',\n        NewExpression: 'NewExpression',\n        ObjectExpression: 'ObjectExpression',\n        ObjectPattern: 'ObjectPattern',\n        Program: 'Program',\n        Property: 'Property',\n        RestElement: 'RestElement',\n        ReturnStatement: 'ReturnStatement',\n        SequenceExpression: 'SequenceExpression',\n        SpreadElement: 'SpreadElement',\n        Super: 'Super',\n        SwitchCase: 'SwitchCase',\n        SwitchStatement: 'SwitchStatement',\n        TaggedTemplateExpression: 'TaggedTemplateExpression',\n        TemplateElement: 'TemplateElement',\n        TemplateLiteral: 'TemplateLiteral',\n        ThisExpression: 'ThisExpression',\n        ThrowStatement: 'ThrowStatement',\n        TryStatement: 'TryStatement',\n        UnaryExpression: 'UnaryExpression',\n        UpdateExpression: 'UpdateExpression',\n        VariableDeclaration: 'VariableDeclaration',\n        VariableDeclarator: 'VariableDeclarator',\n        WhileStatement: 'WhileStatement',\n        WithStatement: 'WithStatement',\n        YieldExpression: 'YieldExpression'\n    };\n\n    PlaceHolders = {\n        ArrowParameterPlaceHolder: 'ArrowParameterPlaceHolder'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken: 'Unexpected token %0',\n        UnexpectedNumber: 'Unexpected number',\n        UnexpectedString: 'Unexpected string',\n        UnexpectedIdentifier: 'Unexpected identifier',\n        UnexpectedReserved: 'Unexpected reserved word',\n        UnexpectedTemplate: 'Unexpected quasi %0',\n        UnexpectedEOS: 'Unexpected end of input',\n        NewlineAfterThrow: 'Illegal newline after throw',\n        InvalidRegExp: 'Invalid regular expression',\n        UnterminatedRegExp: 'Invalid regular expression: missing /',\n        InvalidLHSInAssignment: 'Invalid left-hand side in assignment',\n        InvalidLHSInForIn: 'Invalid left-hand side in for-in',\n        InvalidLHSInForLoop: 'Invalid left-hand side in for-loop',\n        MultipleDefaultsInSwitch: 'More than one default clause in switch statement',\n        NoCatchOrFinally: 'Missing catch or finally after try',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared',\n        IllegalContinue: 'Illegal continue statement',\n        IllegalBreak: 'Illegal break statement',\n        IllegalReturn: 'Illegal return statement',\n        StrictModeWith: 'Strict mode code may not include a with statement',\n        StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',\n        StrictVarName: 'Variable name may not be eval or arguments in strict mode',\n        StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',\n        StrictParamDupe: 'Strict mode function may not have duplicate parameter names',\n        StrictFunctionName: 'Function name may not be eval or arguments in strict mode',\n        StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',\n        StrictDelete: 'Delete of an unqualified identifier in strict mode.',\n        StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',\n        StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',\n        StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',\n        StrictReservedWord: 'Use of future reserved word in strict mode',\n        TemplateOctalLiteral: 'Octal literals are not allowed in template strings.',\n        ParameterAfterRestParameter: 'Rest parameter must be last formal parameter',\n        DefaultRestParameter: 'Unexpected token =',\n        ObjectPatternAsRestParameter: 'Unexpected token {',\n        DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals',\n        ConstructorSpecialMethod: 'Class constructor may not be an accessor',\n        DuplicateConstructor: 'A class may only have one constructor',\n        StaticPrototype: 'Classes may not have static property named prototype',\n        MissingFromClause: 'Unexpected token',\n        NoAsAfterImportNamespace: 'Unexpected token',\n        InvalidModuleSpecifier: 'Unexpected token',\n        IllegalImportDeclaration: 'Unexpected token',\n        IllegalExportDeclaration: 'Unexpected token',\n        DuplicateBinding: 'Duplicate binding %0'\n    };\n\n    // See also tools/generate-unicode-regex.js.\n    Regex = {\n        // ECMAScript 6/Unicode v7.0.0 NonAsciiIdentifierStart:\n        NonAsciiIdentifierStart: /[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B2\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309B-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF5D-\\uDF61]|\\uD805[\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF98]|\\uD809[\\uDC00-\\uDC6E]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D]|\\uD87E[\\uDC00-\\uDE1D]/,\n\n        // ECMAScript 6/Unicode v7.0.0 NonAsciiIdentifierPart:\n        NonAsciiIdentifierPart: /[\\xAA\\xB5\\xB7\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u08A0-\\u08B2\\u08E4-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58\\u0C59\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C81-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D60-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1369-\\u1371\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1CD0-\\u1CD2\\u1CD4-\\u1CF6\\u1CF8\\u1CF9\\u1D00-\\u1DF5\\u1DFC-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u200C\\u200D\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA69D\\uA69F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C4\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2D\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDD0-\\uDDDA\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF01-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF98]|\\uD809[\\uDC00-\\uDC6E]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF]/\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        /* istanbul ignore if */\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 0x30 && ch <= 0x39);   // 0..9\n    }\n\n    function isHexDigit(ch) {\n        return '0123456789abcdefABCDEF'.indexOf(ch) >= 0;\n    }\n\n    function isOctalDigit(ch) {\n        return '01234567'.indexOf(ch) >= 0;\n    }\n\n    function octalToDecimal(ch) {\n        // \\0 is not octal escape sequence\n        var octal = (ch !== '0'), code = '01234567'.indexOf(ch);\n\n        if (index < length && isOctalDigit(source[index])) {\n            octal = true;\n            code = code * 8 + '01234567'.indexOf(source[index++]);\n\n            // 3 digits are only allowed when string starts\n            // with 0, 1, 2, 3\n            if ('0123'.indexOf(ch) >= 0 &&\n                    index < length &&\n                    isOctalDigit(source[index])) {\n                code = code * 8 + '01234567'.indexOf(source[index++]);\n            }\n        }\n\n        return {\n            code: code,\n            octal: octal\n        };\n    }\n\n    // ECMA-262 11.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 0x20) || (ch === 0x09) || (ch === 0x0B) || (ch === 0x0C) || (ch === 0xA0) ||\n            (ch >= 0x1680 && [0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(ch) >= 0);\n    }\n\n    // ECMA-262 11.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 0x0A) || (ch === 0x0D) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // ECMA-262 11.6 Identifier Names and Identifiers\n\n    function fromCodePoint(cp) {\n        return (cp < 0x10000) ? String.fromCharCode(cp) :\n            String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) +\n            String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023));\n    }\n\n    function isIdentifierStart(ch) {\n        return (ch === 0x24) || (ch === 0x5F) ||  // $ (dollar) and _ (underscore)\n            (ch >= 0x41 && ch <= 0x5A) ||         // A..Z\n            (ch >= 0x61 && ch <= 0x7A) ||         // a..z\n            (ch === 0x5C) ||                      // \\ (backslash)\n            ((ch >= 0x80) && Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)));\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 0x24) || (ch === 0x5F) ||  // $ (dollar) and _ (underscore)\n            (ch >= 0x41 && ch <= 0x5A) ||         // A..Z\n            (ch >= 0x61 && ch <= 0x7A) ||         // a..z\n            (ch >= 0x30 && ch <= 0x39) ||         // 0..9\n            (ch === 0x5C) ||                      // \\ (backslash)\n            ((ch >= 0x80) && Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)));\n    }\n\n    // ECMA-262 11.6.2.2 Future Reserved Words\n\n    function isFutureReservedWord(id) {\n        switch (id) {\n            case 'enum':\n            case 'export':\n            case 'import':\n            case 'super':\n                return true;\n            default:\n                return false;\n        }\n    }\n\n    function isStrictModeReservedWord(id) {\n        switch (id) {\n            case 'implements':\n            case 'interface':\n            case 'package':\n            case 'private':\n            case 'protected':\n            case 'public':\n            case 'static':\n            case 'yield':\n            case 'let':\n                return true;\n            default:\n                return false;\n        }\n    }\n\n    function isRestrictedWord(id) {\n        return id === 'eval' || id === 'arguments';\n    }\n\n    // ECMA-262 11.6.2.1 Keywords\n\n    function isKeyword(id) {\n        switch (id.length) {\n            case 2:\n                return (id === 'if') || (id === 'in') || (id === 'do');\n            case 3:\n                return (id === 'var') || (id === 'for') || (id === 'new') ||\n                    (id === 'try') || (id === 'let');\n            case 4:\n                return (id === 'this') || (id === 'else') || (id === 'case') ||\n                    (id === 'void') || (id === 'with') || (id === 'enum');\n            case 5:\n                return (id === 'while') || (id === 'break') || (id === 'catch') ||\n                    (id === 'throw') || (id === 'const') || (id === 'yield') ||\n                    (id === 'class') || (id === 'super');\n            case 6:\n                return (id === 'return') || (id === 'typeof') || (id === 'delete') ||\n                    (id === 'switch') || (id === 'export') || (id === 'import');\n            case 7:\n                return (id === 'default') || (id === 'finally') || (id === 'extends');\n            case 8:\n                return (id === 'function') || (id === 'continue') || (id === 'debugger');\n            case 10:\n                return (id === 'instanceof');\n            default:\n                return false;\n        }\n    }\n\n    // ECMA-262 11.4 Comments\n\n    function addComment(type, value, start, end, loc) {\n        var comment;\n\n        assert(typeof start === 'number', 'Comment must have valid position');\n\n        state.lastCommentStart = start;\n\n        comment = {\n            type: type,\n            value: value\n        };\n        if (extra.range) {\n            comment.range = [start, end];\n        }\n        if (extra.loc) {\n            comment.loc = loc;\n        }\n        extra.comments.push(comment);\n        if (extra.attachComment) {\n            extra.leadingComments.push(comment);\n            extra.trailingComments.push(comment);\n        }\n        if (extra.tokenize) {\n            comment.type = comment.type + 'Comment';\n            if (extra.delegate) {\n                comment = extra.delegate(comment);\n            }\n            extra.tokens.push(comment);\n        }\n    }\n\n    function skipSingleLineComment(offset) {\n        var start, loc, ch, comment;\n\n        start = index - offset;\n        loc = {\n            start: {\n                line: lineNumber,\n                column: index - lineStart - offset\n            }\n        };\n\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            ++index;\n            if (isLineTerminator(ch)) {\n                hasLineTerminator = true;\n                if (extra.comments) {\n                    comment = source.slice(start + offset, index - 1);\n                    loc.end = {\n                        line: lineNumber,\n                        column: index - lineStart - 1\n                    };\n                    addComment('Line', comment, start, index - 1, loc);\n                }\n                if (ch === 13 && source.charCodeAt(index) === 10) {\n                    ++index;\n                }\n                ++lineNumber;\n                lineStart = index;\n                return;\n            }\n        }\n\n        if (extra.comments) {\n            comment = source.slice(start + offset, index);\n            loc.end = {\n                line: lineNumber,\n                column: index - lineStart\n            };\n            addComment('Line', comment, start, index, loc);\n        }\n    }\n\n    function skipMultiLineComment() {\n        var start, loc, ch, comment;\n\n        if (extra.comments) {\n            start = index - 2;\n            loc = {\n                start: {\n                    line: lineNumber,\n                    column: index - lineStart - 2\n                }\n            };\n        }\n\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isLineTerminator(ch)) {\n                if (ch === 0x0D && source.charCodeAt(index + 1) === 0x0A) {\n                    ++index;\n                }\n                hasLineTerminator = true;\n                ++lineNumber;\n                ++index;\n                lineStart = index;\n            } else if (ch === 0x2A) {\n                // Block comment ends with '*/'.\n                if (source.charCodeAt(index + 1) === 0x2F) {\n                    ++index;\n                    ++index;\n                    if (extra.comments) {\n                        comment = source.slice(start + 2, index - 2);\n                        loc.end = {\n                            line: lineNumber,\n                            column: index - lineStart\n                        };\n                        addComment('Block', comment, start, index, loc);\n                    }\n                    return;\n                }\n                ++index;\n            } else {\n                ++index;\n            }\n        }\n\n        // Ran off the end of the file - the whole thing is a comment\n        if (extra.comments) {\n            loc.end = {\n                line: lineNumber,\n                column: index - lineStart\n            };\n            comment = source.slice(start + 2, index);\n            addComment('Block', comment, start, index, loc);\n        }\n        tolerateUnexpectedToken();\n    }\n\n    function skipComment() {\n        var ch, start;\n        hasLineTerminator = false;\n\n        start = (index === 0);\n        while (index < length) {\n            ch = source.charCodeAt(index);\n\n            if (isWhiteSpace(ch)) {\n                ++index;\n            } else if (isLineTerminator(ch)) {\n                hasLineTerminator = true;\n                ++index;\n                if (ch === 0x0D && source.charCodeAt(index) === 0x0A) {\n                    ++index;\n                }\n                ++lineNumber;\n                lineStart = index;\n                start = true;\n            } else if (ch === 0x2F) { // U+002F is '/'\n                ch = source.charCodeAt(index + 1);\n                if (ch === 0x2F) {\n                    ++index;\n                    ++index;\n                    skipSingleLineComment(2);\n                    start = true;\n                } else if (ch === 0x2A) {  // U+002A is '*'\n                    ++index;\n                    ++index;\n                    skipMultiLineComment();\n                } else {\n                    break;\n                }\n            } else if (start && ch === 0x2D) { // U+002D is '-'\n                // U+003E is '>'\n                if ((source.charCodeAt(index + 1) === 0x2D) && (source.charCodeAt(index + 2) === 0x3E)) {\n                    // '-->' is a single-line comment\n                    index += 3;\n                    skipSingleLineComment(3);\n                } else {\n                    break;\n                }\n            } else if (ch === 0x3C) { // U+003C is '<'\n                if (source.slice(index + 1, index + 4) === '!--') {\n                    ++index; // `<`\n                    ++index; // `!`\n                    ++index; // `-`\n                    ++index; // `-`\n                    skipSingleLineComment(4);\n                } else {\n                    break;\n                }\n            } else {\n                break;\n            }\n        }\n    }\n\n    function scanHexEscape(prefix) {\n        var i, len, ch, code = 0;\n\n        len = (prefix === 'u') ? 4 : 2;\n        for (i = 0; i < len; ++i) {\n            if (index < length && isHexDigit(source[index])) {\n                ch = source[index++];\n                code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase());\n            } else {\n                return '';\n            }\n        }\n        return String.fromCharCode(code);\n    }\n\n    function scanUnicodeCodePointEscape() {\n        var ch, code;\n\n        ch = source[index];\n        code = 0;\n\n        // At least, one hex digit is required.\n        if (ch === '}') {\n            throwUnexpectedToken();\n        }\n\n        while (index < length) {\n            ch = source[index++];\n            if (!isHexDigit(ch)) {\n                break;\n            }\n            code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase());\n        }\n\n        if (code > 0x10FFFF || ch !== '}') {\n            throwUnexpectedToken();\n        }\n\n        return fromCodePoint(code);\n    }\n\n    function codePointAt(i) {\n        var cp, first, second;\n\n        cp = source.charCodeAt(i);\n        if (cp >= 0xD800 && cp <= 0xDBFF) {\n            second = source.charCodeAt(i + 1);\n            if (second >= 0xDC00 && second <= 0xDFFF) {\n                first = cp;\n                cp = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n            }\n        }\n\n        return cp;\n    }\n\n    function getComplexIdentifier() {\n        var cp, ch, id;\n\n        cp = codePointAt(index);\n        id = fromCodePoint(cp);\n        index += id.length;\n\n        // '\\u' (U+005C, U+0075) denotes an escaped character.\n        if (cp === 0x5C) {\n            if (source.charCodeAt(index) !== 0x75) {\n                throwUnexpectedToken();\n            }\n            ++index;\n            if (source[index] === '{') {\n                ++index;\n                ch = scanUnicodeCodePointEscape();\n            } else {\n                ch = scanHexEscape('u');\n                cp = ch.charCodeAt(0);\n                if (!ch || ch === '\\\\' || !isIdentifierStart(cp)) {\n                    throwUnexpectedToken();\n                }\n            }\n            id = ch;\n        }\n\n        while (index < length) {\n            cp = codePointAt(index);\n            if (!isIdentifierPart(cp)) {\n                break;\n            }\n            ch = fromCodePoint(cp);\n            id += ch;\n            index += ch.length;\n\n            // '\\u' (U+005C, U+0075) denotes an escaped character.\n            if (cp === 0x5C) {\n                id = id.substr(0, id.length - 1);\n                if (source.charCodeAt(index) !== 0x75) {\n                    throwUnexpectedToken();\n                }\n                ++index;\n                if (source[index] === '{') {\n                    ++index;\n                    ch = scanUnicodeCodePointEscape();\n                } else {\n                    ch = scanHexEscape('u');\n                    cp = ch.charCodeAt(0);\n                    if (!ch || ch === '\\\\' || !isIdentifierPart(cp)) {\n                        throwUnexpectedToken();\n                    }\n                }\n                id += ch;\n            }\n        }\n\n        return id;\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (ch === 0x5C) {\n                // Blackslash (U+005C) marks Unicode escape sequence.\n                index = start;\n                return getComplexIdentifier();\n            } else if (ch >= 0xD800 && ch < 0xDFFF) {\n                // Need to handle surrogate pairs.\n                index = start;\n                return getComplexIdentifier();\n            }\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        // Backslash (U+005C) starts an escaped character.\n        id = (source.charCodeAt(index) === 0x5C) ? getComplexIdentifier() : getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            lineNumber: lineNumber,\n            lineStart: lineStart,\n            start: start,\n            end: index\n        };\n    }\n\n\n    // ECMA-262 11.7 Punctuators\n\n    function scanPunctuator() {\n        var token, str;\n\n        token = {\n            type: Token.Punctuator,\n            value: '',\n            lineNumber: lineNumber,\n            lineStart: lineStart,\n            start: index,\n            end: index\n        };\n\n        // Check for most common single-character punctuators.\n        str = source[index];\n        switch (str) {\n\n            case '(':\n                if (extra.tokenize) {\n                    extra.openParenToken = extra.tokenValues.length;\n                }\n                ++index;\n                break;\n\n            case '{':\n                if (extra.tokenize) {\n                    extra.openCurlyToken = extra.tokenValues.length;\n                }\n                state.curlyStack.push('{');\n                ++index;\n                break;\n\n            case '.':\n                ++index;\n                if (source[index] === '.' && source[index + 1] === '.') {\n                    // Spread operator: ...\n                    index += 2;\n                    str = '...';\n                }\n                break;\n\n            case '}':\n                ++index;\n                state.curlyStack.pop();\n                break;\n            case ')':\n            case ';':\n            case ',':\n            case '[':\n            case ']':\n            case ':':\n            case '?':\n            case '~':\n                ++index;\n                break;\n\n            default:\n                // 4-character punctuator.\n                str = source.substr(index, 4);\n                if (str === '>>>=') {\n                    index += 4;\n                } else {\n\n                    // 3-character punctuators.\n                    str = str.substr(0, 3);\n                    if (str === '===' || str === '!==' || str === '>>>' ||\n                        str === '<<=' || str === '>>=') {\n                        index += 3;\n                    } else {\n\n                        // 2-character punctuators.\n                        str = str.substr(0, 2);\n                        if (str === '&&' || str === '||' || str === '==' || str === '!=' ||\n                            str === '+=' || str === '-=' || str === '*=' || str === '/=' ||\n                            str === '++' || str === '--' || str === '<<' || str === '>>' ||\n                            str === '&=' || str === '|=' || str === '^=' || str === '%=' ||\n                            str === '<=' || str === '>=' || str === '=>') {\n                            index += 2;\n                        } else {\n\n                            // 1-character punctuators.\n                            str = source[index];\n                            if ('<>=!+-*%&|^/'.indexOf(str) >= 0) {\n                                ++index;\n                            }\n                        }\n                    }\n                }\n        }\n\n        if (index === token.start) {\n            throwUnexpectedToken();\n        }\n\n        token.end = index;\n        token.value = str;\n        return token;\n    }\n\n    // ECMA-262 11.8.3 Numeric Literals\n\n    function scanHexLiteral(start) {\n        var number = '';\n\n        while (index < length) {\n            if (!isHexDigit(source[index])) {\n                break;\n            }\n            number += source[index++];\n        }\n\n        if (number.length === 0) {\n            throwUnexpectedToken();\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwUnexpectedToken();\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseInt('0x' + number, 16),\n            lineNumber: lineNumber,\n            lineStart: lineStart,\n            start: start,\n            end: index\n        };\n    }\n\n    function scanBinaryLiteral(start) {\n        var ch, number;\n\n        number = '';\n\n        while (index < length) {\n            ch = source[index];\n            if (ch !== '0' && ch !== '1') {\n                break;\n            }\n            number += source[index++];\n        }\n\n        if (number.length === 0) {\n            // only 0b or 0B\n            throwUnexpectedToken();\n        }\n\n        if (index < length) {\n            ch = source.charCodeAt(index);\n            /* istanbul ignore else */\n            if (isIdentifierStart(ch) || isDecimalDigit(ch)) {\n                throwUnexpectedToken();\n            }\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseInt(number, 2),\n            lineNumber: lineNumber,\n            lineStart: lineStart,\n            start: start,\n            end: index\n        };\n    }\n\n    function scanOctalLiteral(prefix, start) {\n        var number, octal;\n\n        if (isOctalDigit(prefix)) {\n            octal = true;\n            number = '0' + source[index++];\n        } else {\n            octal = false;\n            ++index;\n            number = '';\n        }\n\n        while (index < length) {\n            if (!isOctalDigit(source[index])) {\n                break;\n            }\n            number += source[index++];\n        }\n\n        if (!octal && number.length === 0) {\n            // only 0o or 0O\n            throwUnexpectedToken();\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) {\n            throwUnexpectedToken();\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseInt(number, 8),\n            octal: octal,\n            lineNumber: lineNumber,\n            lineStart: lineStart,\n            start: start,\n            end: index\n        };\n    }\n\n    function isImplicitOctalLiteral() {\n        var i, ch;\n\n        // Implicit octal, unless there is a non-octal digit.\n        // (Annex B.1.1 on Numeric Literals)\n        for (i = index + 1; i < length; ++i) {\n            ch = source[i];\n            if (ch === '8' || ch === '9') {\n                return false;\n            }\n            if (!isOctalDigit(ch)) {\n                return true;\n            }\n        }\n\n        return true;\n    }\n\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            // Octal number in ES6 starts with '0o'.\n            // Binary number in ES6 starts with '0b'.\n            if (number === '0') {\n                if (ch === 'x' || ch === 'X') {\n                    ++index;\n                    return scanHexLiteral(start);\n                }\n                if (ch === 'b' || ch === 'B') {\n                    ++index;\n                    return scanBinaryLiteral(start);\n                }\n                if (ch === 'o' || ch === 'O') {\n                    return scanOctalLiteral(ch, start);\n                }\n\n                if (isOctalDigit(ch)) {\n                    if (isImplicitOctalLiteral()) {\n                        return scanOctalLiteral(ch, start);\n                    }\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwUnexpectedToken();\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwUnexpectedToken();\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            lineNumber: lineNumber,\n            lineStart: lineStart,\n            start: start,\n            end: index\n        };\n    }\n\n    // ECMA-262 11.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, unescaped, octToDec, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                        case 'u':\n                        case 'x':\n                            if (source[index] === '{') {\n                                ++index;\n                                str += scanUnicodeCodePointEscape();\n                            } else {\n                                unescaped = scanHexEscape(ch);\n                                if (!unescaped) {\n                                    throw throwUnexpectedToken();\n                                }\n                                str += unescaped;\n                            }\n                            break;\n                        case 'n':\n                            str += '\\n';\n                            break;\n                        case 'r':\n                            str += '\\r';\n                            break;\n                        case 't':\n                            str += '\\t';\n                            break;\n                        case 'b':\n                            str += '\\b';\n                            break;\n                        case 'f':\n                            str += '\\f';\n                            break;\n                        case 'v':\n                            str += '\\x0B';\n                            break;\n                        case '8':\n                        case '9':\n                            str += ch;\n                            tolerateUnexpectedToken();\n                            break;\n\n                        default:\n                            if (isOctalDigit(ch)) {\n                                octToDec = octalToDecimal(ch);\n\n                                octal = octToDec.octal || octal;\n                                str += String.fromCharCode(octToDec.code);\n                            } else {\n                                str += ch;\n                            }\n                            break;\n                    }\n                } else {\n                    ++lineNumber;\n                    if (ch === '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                    lineStart = index;\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            index = start;\n            throwUnexpectedToken();\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            lineNumber: startLineNumber,\n            lineStart: startLineStart,\n            start: start,\n            end: index\n        };\n    }\n\n    // ECMA-262 11.8.6 Template Literal Lexical Components\n\n    function scanTemplate() {\n        var cooked = '', ch, start, rawOffset, terminated, head, tail, restore, unescaped;\n\n        terminated = false;\n        tail = false;\n        start = index;\n        head = (source[index] === '`');\n        rawOffset = 2;\n\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n            if (ch === '`') {\n                rawOffset = 1;\n                tail = true;\n                terminated = true;\n                break;\n            } else if (ch === '$') {\n                if (source[index] === '{') {\n                    state.curlyStack.push('${');\n                    ++index;\n                    terminated = true;\n                    break;\n                }\n                cooked += ch;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                        case 'n':\n                            cooked += '\\n';\n                            break;\n                        case 'r':\n                            cooked += '\\r';\n                            break;\n                        case 't':\n                            cooked += '\\t';\n                            break;\n                        case 'u':\n                        case 'x':\n                            if (source[index] === '{') {\n                                ++index;\n                                cooked += scanUnicodeCodePointEscape();\n                            } else {\n                                restore = index;\n                                unescaped = scanHexEscape(ch);\n                                if (unescaped) {\n                                    cooked += unescaped;\n                                } else {\n                                    index = restore;\n                                    cooked += ch;\n                                }\n                            }\n                            break;\n                        case 'b':\n                            cooked += '\\b';\n                            break;\n                        case 'f':\n                            cooked += '\\f';\n                            break;\n                        case 'v':\n                            cooked += '\\v';\n                            break;\n\n                        default:\n                            if (ch === '0') {\n                                if (isDecimalDigit(source.charCodeAt(index))) {\n                                    // Illegal: \\01 \\02 and so on\n                                    throwError(Messages.TemplateOctalLiteral);\n                                }\n                                cooked += '\\0';\n                            } else if (isOctalDigit(ch)) {\n                                // Illegal: \\1 \\2\n                                throwError(Messages.TemplateOctalLiteral);\n                            } else {\n                                cooked += ch;\n                            }\n                            break;\n                    }\n                } else {\n                    ++lineNumber;\n                    if (ch === '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                    lineStart = index;\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                ++lineNumber;\n                if (ch === '\\r' && source[index] === '\\n') {\n                    ++index;\n                }\n                lineStart = index;\n                cooked += '\\n';\n            } else {\n                cooked += ch;\n            }\n        }\n\n        if (!terminated) {\n            throwUnexpectedToken();\n        }\n\n        if (!head) {\n            state.curlyStack.pop();\n        }\n\n        return {\n            type: Token.Template,\n            value: {\n                cooked: cooked,\n                raw: source.slice(start + 1, index - rawOffset)\n            },\n            head: head,\n            tail: tail,\n            lineNumber: lineNumber,\n            lineStart: lineStart,\n            start: start,\n            end: index\n        };\n    }\n\n    // ECMA-262 11.8.5 Regular Expression Literals\n\n    function testRegExp(pattern, flags) {\n        // The BMP character to use as a replacement for astral symbols when\n        // translating an ES6 \"u\"-flagged pattern to an ES5-compatible\n        // approximation.\n        // Note: replacing with '\\uFFFF' enables false positives in unlikely\n        // scenarios. For example, `[\\u{1044f}-\\u{10440}]` is an invalid\n        // pattern that would not be detected by this substitution.\n        var astralSubstitute = '\\uFFFF',\n            tmp = pattern;\n\n        if (flags.indexOf('u') >= 0) {\n            tmp = tmp\n                // Replace every Unicode escape sequence with the equivalent\n                // BMP character or a constant ASCII code point in the case of\n                // astral symbols. (See the above note on `astralSubstitute`\n                // for more information.)\n                .replace(/\\\\u\\{([0-9a-fA-F]+)\\}|\\\\u([a-fA-F0-9]{4})/g, function ($0, $1, $2) {\n                    var codePoint = parseInt($1 || $2, 16);\n                    if (codePoint > 0x10FFFF) {\n                        throwUnexpectedToken(null, Messages.InvalidRegExp);\n                    }\n                    if (codePoint <= 0xFFFF) {\n                        return String.fromCharCode(codePoint);\n                    }\n                    return astralSubstitute;\n                })\n                // Replace each paired surrogate with a single ASCII symbol to\n                // avoid throwing on regular expressions that are only valid in\n                // combination with the \"u\" flag.\n                .replace(\n                    /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g,\n                    astralSubstitute\n                );\n        }\n\n        // First, detect invalid regular expressions.\n        try {\n            RegExp(tmp);\n        } catch (e) {\n            throwUnexpectedToken(null, Messages.InvalidRegExp);\n        }\n\n        // Return a regular expression object for this pattern-flag pair, or\n        // `null` in case the current environment doesn't support the flags it\n        // uses.\n        try {\n            return new RegExp(pattern, flags);\n        } catch (exception) {\n            /* istanbul ignore next */\n            return null;\n        }\n    }\n\n    function scanRegExpBody() {\n        var ch, str, classMarker, terminated, body;\n\n        ch = source[index];\n        assert(ch === '/', 'Regular expression literal must start with a slash');\n        str = source[index++];\n\n        classMarker = false;\n        terminated = false;\n        while (index < length) {\n            ch = source[index++];\n            str += ch;\n            if (ch === '\\\\') {\n                ch = source[index++];\n                // ECMA-262 7.8.5\n                if (isLineTerminator(ch.charCodeAt(0))) {\n                    throwUnexpectedToken(null, Messages.UnterminatedRegExp);\n                }\n                str += ch;\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                throwUnexpectedToken(null, Messages.UnterminatedRegExp);\n            } else if (classMarker) {\n                if (ch === ']') {\n                    classMarker = false;\n                }\n            } else {\n                if (ch === '/') {\n                    terminated = true;\n                    break;\n                } else if (ch === '[') {\n                    classMarker = true;\n                }\n            }\n        }\n\n        if (!terminated) {\n            throwUnexpectedToken(null, Messages.UnterminatedRegExp);\n        }\n\n        // Exclude leading and trailing slash.\n        body = str.substr(1, str.length - 2);\n        return {\n            value: body,\n            literal: str\n        };\n    }\n\n    function scanRegExpFlags() {\n        var ch, str, flags, restore;\n\n        str = '';\n        flags = '';\n        while (index < length) {\n            ch = source[index];\n            if (!isIdentifierPart(ch.charCodeAt(0))) {\n                break;\n            }\n\n            ++index;\n            if (ch === '\\\\' && index < length) {\n                ch = source[index];\n                if (ch === 'u') {\n                    ++index;\n                    restore = index;\n                    ch = scanHexEscape('u');\n                    if (ch) {\n                        flags += ch;\n                        for (str += '\\\\u'; restore < index; ++restore) {\n                            str += source[restore];\n                        }\n                    } else {\n                        index = restore;\n                        flags += 'u';\n                        str += '\\\\u';\n                    }\n                    tolerateUnexpectedToken();\n                } else {\n                    str += '\\\\';\n                    tolerateUnexpectedToken();\n                }\n            } else {\n                flags += ch;\n                str += ch;\n            }\n        }\n\n        return {\n            value: flags,\n            literal: str\n        };\n    }\n\n    function scanRegExp() {\n        var start, body, flags, value;\n        scanning = true;\n\n        lookahead = null;\n        skipComment();\n        start = index;\n\n        body = scanRegExpBody();\n        flags = scanRegExpFlags();\n        value = testRegExp(body.value, flags.value);\n        scanning = false;\n        if (extra.tokenize) {\n            return {\n                type: Token.RegularExpression,\n                value: value,\n                regex: {\n                    pattern: body.value,\n                    flags: flags.value\n                },\n                lineNumber: lineNumber,\n                lineStart: lineStart,\n                start: start,\n                end: index\n            };\n        }\n\n        return {\n            literal: body.literal + flags.literal,\n            value: value,\n            regex: {\n                pattern: body.value,\n                flags: flags.value\n            },\n            start: start,\n            end: index\n        };\n    }\n\n    function collectRegex() {\n        var pos, loc, regex, token;\n\n        skipComment();\n\n        pos = index;\n        loc = {\n            start: {\n                line: lineNumber,\n                column: index - lineStart\n            }\n        };\n\n        regex = scanRegExp();\n\n        loc.end = {\n            line: lineNumber,\n            column: index - lineStart\n        };\n\n        /* istanbul ignore next */\n        if (!extra.tokenize) {\n            // Pop the previous token, which is likely '/' or '/='\n            if (extra.tokens.length > 0) {\n                token = extra.tokens[extra.tokens.length - 1];\n                if (token.range[0] === pos && token.type === 'Punctuator') {\n                    if (token.value === '/' || token.value === '/=') {\n                        extra.tokens.pop();\n                    }\n                }\n            }\n\n            extra.tokens.push({\n                type: 'RegularExpression',\n                value: regex.literal,\n                regex: regex.regex,\n                range: [pos, index],\n                loc: loc\n            });\n        }\n\n        return regex;\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    // Using the following algorithm:\n    // https://github.com/mozilla/sweet.js/wiki/design\n\n    function advanceSlash() {\n        var regex, previous, check;\n\n        function testKeyword(value) {\n            return value && (value.length > 1) && (value[0] >= 'a') && (value[0] <= 'z');\n        }\n\n        previous = extra.tokenValues[extra.tokenValues.length - 1];\n        regex = (previous !== null);\n\n        switch (previous) {\n            case 'this':\n            case ']':\n                regex = false;\n                break;\n\n            case ')':\n                check = extra.tokenValues[extra.openParenToken - 1];\n                regex = (check === 'if' || check === 'while' || check === 'for' || check === 'with');\n                break;\n\n            case '}':\n                // Dividing a function by anything makes little sense,\n                // but we have to check for that.\n                regex = false;\n                if (testKeyword(extra.tokenValues[extra.openCurlyToken - 3])) {\n                    // Anonymous function, e.g. function(){} /42\n                    check = extra.tokenValues[extra.openCurlyToken - 4];\n                    regex = check ? (FnExprTokens.indexOf(check) < 0) : false;\n                } else if (testKeyword(extra.tokenValues[extra.openCurlyToken - 4])) {\n                    // Named function, e.g. function f(){} /42/\n                    check = extra.tokenValues[extra.openCurlyToken - 5];\n                    regex = check ? (FnExprTokens.indexOf(check) < 0) : true;\n                }\n        }\n\n        return regex ? collectRegex() : scanPunctuator();\n    }\n\n    function advance() {\n        var cp, token;\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                lineNumber: lineNumber,\n                lineStart: lineStart,\n                start: index,\n                end: index\n            };\n        }\n\n        cp = source.charCodeAt(index);\n\n        if (isIdentifierStart(cp)) {\n            token = scanIdentifier();\n            if (strict && isStrictModeReservedWord(token.value)) {\n                token.type = Token.Keyword;\n            }\n            return token;\n        }\n\n        // Very common: ( and ) and ;\n        if (cp === 0x28 || cp === 0x29 || cp === 0x3B) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (U+0027) or double quote (U+0022).\n        if (cp === 0x27 || cp === 0x22) {\n            return scanStringLiteral();\n        }\n\n        // Dot (.) U+002E can also start a floating-point number, hence the need\n        // to check the next character.\n        if (cp === 0x2E) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(cp)) {\n            return scanNumericLiteral();\n        }\n\n        // Slash (/) U+002F can also start a regex.\n        if (extra.tokenize && cp === 0x2F) {\n            return advanceSlash();\n        }\n\n        // Template literals start with ` (U+0060) for template head\n        // or } (U+007D) for template middle or template tail.\n        if (cp === 0x60 || (cp === 0x7D && state.curlyStack[state.curlyStack.length - 1] === '${')) {\n            return scanTemplate();\n        }\n\n        // Possible identifier start in a surrogate pair.\n        if (cp >= 0xD800 && cp < 0xDFFF) {\n            cp = codePointAt(index);\n            if (isIdentifierStart(cp)) {\n                return scanIdentifier();\n            }\n        }\n\n        return scanPunctuator();\n    }\n\n    function collectToken() {\n        var loc, token, value, entry;\n\n        loc = {\n            start: {\n                line: lineNumber,\n                column: index - lineStart\n            }\n        };\n\n        token = advance();\n        loc.end = {\n            line: lineNumber,\n            column: index - lineStart\n        };\n\n        if (token.type !== Token.EOF) {\n            value = source.slice(token.start, token.end);\n            entry = {\n                type: TokenName[token.type],\n                value: value,\n                range: [token.start, token.end],\n                loc: loc\n            };\n            if (token.regex) {\n                entry.regex = {\n                    pattern: token.regex.pattern,\n                    flags: token.regex.flags\n                };\n            }\n            if (extra.tokenValues) {\n                extra.tokenValues.push((entry.type === 'Punctuator' || entry.type === 'Keyword') ? entry.value : null);\n            }\n            if (extra.tokenize) {\n                if (!extra.range) {\n                    delete entry.range;\n                }\n                if (!extra.loc) {\n                    delete entry.loc;\n                }\n                if (extra.delegate) {\n                    entry = extra.delegate(entry);\n                }\n            }\n            extra.tokens.push(entry);\n        }\n\n        return token;\n    }\n\n    function lex() {\n        var token;\n        scanning = true;\n\n        lastIndex = index;\n        lastLineNumber = lineNumber;\n        lastLineStart = lineStart;\n\n        skipComment();\n\n        token = lookahead;\n\n        startIndex = index;\n        startLineNumber = lineNumber;\n        startLineStart = lineStart;\n\n        lookahead = (typeof extra.tokens !== 'undefined') ? collectToken() : advance();\n        scanning = false;\n        return token;\n    }\n\n    function peek() {\n        scanning = true;\n\n        skipComment();\n\n        lastIndex = index;\n        lastLineNumber = lineNumber;\n        lastLineStart = lineStart;\n\n        startIndex = index;\n        startLineNumber = lineNumber;\n        startLineStart = lineStart;\n\n        lookahead = (typeof extra.tokens !== 'undefined') ? collectToken() : advance();\n        scanning = false;\n    }\n\n    function Position() {\n        this.line = startLineNumber;\n        this.column = startIndex - startLineStart;\n    }\n\n    function SourceLocation() {\n        this.start = new Position();\n        this.end = null;\n    }\n\n    function WrappingSourceLocation(startToken) {\n        this.start = {\n            line: startToken.lineNumber,\n            column: startToken.start - startToken.lineStart\n        };\n        this.end = null;\n    }\n\n    function Node() {\n        if (extra.range) {\n            this.range = [startIndex, 0];\n        }\n        if (extra.loc) {\n            this.loc = new SourceLocation();\n        }\n    }\n\n    function WrappingNode(startToken) {\n        if (extra.range) {\n            this.range = [startToken.start, 0];\n        }\n        if (extra.loc) {\n            this.loc = new WrappingSourceLocation(startToken);\n        }\n    }\n\n    WrappingNode.prototype = Node.prototype = {\n\n        processComment: function () {\n            var lastChild,\n                innerComments,\n                leadingComments,\n                trailingComments,\n                bottomRight = extra.bottomRightStack,\n                i,\n                comment,\n                last = bottomRight[bottomRight.length - 1];\n\n            if (this.type === Syntax.Program) {\n                if (this.body.length > 0) {\n                    return;\n                }\n            }\n            /**\n             * patch innnerComments for properties empty block\n             * `function a() {/** comments **\\/}`\n             */\n\n            if (this.type === Syntax.BlockStatement && this.body.length === 0) {\n                innerComments = [];\n                for (i = extra.leadingComments.length - 1; i >= 0; --i) {\n                    comment = extra.leadingComments[i];\n                    if (this.range[1] >= comment.range[1]) {\n                        innerComments.unshift(comment);\n                        extra.leadingComments.splice(i, 1);\n                        extra.trailingComments.splice(i, 1);\n                    }\n                }\n                if (innerComments.length) {\n                    this.innerComments = innerComments;\n                    //bottomRight.push(this);\n                    return;\n                }\n            }\n\n            if (extra.trailingComments.length > 0) {\n                trailingComments = [];\n                for (i = extra.trailingComments.length - 1; i >= 0; --i) {\n                    comment = extra.trailingComments[i];\n                    if (comment.range[0] >= this.range[1]) {\n                        trailingComments.unshift(comment);\n                        extra.trailingComments.splice(i, 1);\n                    }\n                }\n                extra.trailingComments = [];\n            } else {\n                if (last && last.trailingComments && last.trailingComments[0].range[0] >= this.range[1]) {\n                    trailingComments = last.trailingComments;\n                    delete last.trailingComments;\n                }\n            }\n\n            // Eating the stack.\n            while (last && last.range[0] >= this.range[0]) {\n                lastChild = bottomRight.pop();\n                last = bottomRight[bottomRight.length - 1];\n            }\n\n            if (lastChild) {\n                if (lastChild.leadingComments) {\n                    leadingComments = [];\n                    for (i = lastChild.leadingComments.length - 1; i >= 0; --i) {\n                        comment = lastChild.leadingComments[i];\n                        if (comment.range[1] <= this.range[0]) {\n                            leadingComments.unshift(comment);\n                            lastChild.leadingComments.splice(i, 1);\n                        }\n                    }\n\n                    if (!lastChild.leadingComments.length) {\n                        lastChild.leadingComments = undefined;\n                    }\n                }\n            } else if (extra.leadingComments.length > 0) {\n                leadingComments = [];\n                for (i = extra.leadingComments.length - 1; i >= 0; --i) {\n                    comment = extra.leadingComments[i];\n                    if (comment.range[1] <= this.range[0]) {\n                        leadingComments.unshift(comment);\n                        extra.leadingComments.splice(i, 1);\n                    }\n                }\n            }\n\n\n            if (leadingComments && leadingComments.length > 0) {\n                this.leadingComments = leadingComments;\n            }\n            if (trailingComments && trailingComments.length > 0) {\n                this.trailingComments = trailingComments;\n            }\n\n            bottomRight.push(this);\n        },\n\n        finish: function () {\n            if (extra.range) {\n                this.range[1] = lastIndex;\n            }\n            if (extra.loc) {\n                this.loc.end = {\n                    line: lastLineNumber,\n                    column: lastIndex - lastLineStart\n                };\n                if (extra.source) {\n                    this.loc.source = extra.source;\n                }\n            }\n\n            if (extra.attachComment) {\n                this.processComment();\n            }\n        },\n\n        finishArrayExpression: function (elements) {\n            this.type = Syntax.ArrayExpression;\n            this.elements = elements;\n            this.finish();\n            return this;\n        },\n\n        finishArrayPattern: function (elements) {\n            this.type = Syntax.ArrayPattern;\n            this.elements = elements;\n            this.finish();\n            return this;\n        },\n\n        finishArrowFunctionExpression: function (params, defaults, body, expression) {\n            this.type = Syntax.ArrowFunctionExpression;\n            this.id = null;\n            this.params = params;\n            this.defaults = defaults;\n            this.body = body;\n            this.generator = false;\n            this.expression = expression;\n            this.finish();\n            return this;\n        },\n\n        finishAssignmentExpression: function (operator, left, right) {\n            this.type = Syntax.AssignmentExpression;\n            this.operator = operator;\n            this.left = left;\n            this.right = right;\n            this.finish();\n            return this;\n        },\n\n        finishAssignmentPattern: function (left, right) {\n            this.type = Syntax.AssignmentPattern;\n            this.left = left;\n            this.right = right;\n            this.finish();\n            return this;\n        },\n\n        finishBinaryExpression: function (operator, left, right) {\n            this.type = (operator === '||' || operator === '&&') ? Syntax.LogicalExpression : Syntax.BinaryExpression;\n            this.operator = operator;\n            this.left = left;\n            this.right = right;\n            this.finish();\n            return this;\n        },\n\n        finishBlockStatement: function (body) {\n            this.type = Syntax.BlockStatement;\n            this.body = body;\n            this.finish();\n            return this;\n        },\n\n        finishBreakStatement: function (label) {\n            this.type = Syntax.BreakStatement;\n            this.label = label;\n            this.finish();\n            return this;\n        },\n\n        finishCallExpression: function (callee, args) {\n            this.type = Syntax.CallExpression;\n            this.callee = callee;\n            this.arguments = args;\n            this.finish();\n            return this;\n        },\n\n        finishCatchClause: function (param, body) {\n            this.type = Syntax.CatchClause;\n            this.param = param;\n            this.body = body;\n            this.finish();\n            return this;\n        },\n\n        finishClassBody: function (body) {\n            this.type = Syntax.ClassBody;\n            this.body = body;\n            this.finish();\n            return this;\n        },\n\n        finishClassDeclaration: function (id, superClass, body) {\n            this.type = Syntax.ClassDeclaration;\n            this.id = id;\n            this.superClass = superClass;\n            this.body = body;\n            this.finish();\n            return this;\n        },\n\n        finishClassExpression: function (id, superClass, body) {\n            this.type = Syntax.ClassExpression;\n            this.id = id;\n            this.superClass = superClass;\n            this.body = body;\n            this.finish();\n            return this;\n        },\n\n        finishConditionalExpression: function (test, consequent, alternate) {\n            this.type = Syntax.ConditionalExpression;\n            this.test = test;\n            this.consequent = consequent;\n            this.alternate = alternate;\n            this.finish();\n            return this;\n        },\n\n        finishContinueStatement: function (label) {\n            this.type = Syntax.ContinueStatement;\n            this.label = label;\n            this.finish();\n            return this;\n        },\n\n        finishDebuggerStatement: function () {\n            this.type = Syntax.DebuggerStatement;\n            this.finish();\n            return this;\n        },\n\n        finishDoWhileStatement: function (body, test) {\n            this.type = Syntax.DoWhileStatement;\n            this.body = body;\n            this.test = test;\n            this.finish();\n            return this;\n        },\n\n        finishEmptyStatement: function () {\n            this.type = Syntax.EmptyStatement;\n            this.finish();\n            return this;\n        },\n\n        finishExpressionStatement: function (expression) {\n            this.type = Syntax.ExpressionStatement;\n            this.expression = expression;\n            this.finish();\n            return this;\n        },\n\n        finishForStatement: function (init, test, update, body) {\n            this.type = Syntax.ForStatement;\n            this.init = init;\n            this.test = test;\n            this.update = update;\n            this.body = body;\n            this.finish();\n            return this;\n        },\n\n        finishForOfStatement: function (left, right, body) {\n            this.type = Syntax.ForOfStatement;\n            this.left = left;\n            this.right = right;\n            this.body = body;\n            this.finish();\n            return this;\n        },\n\n        finishForInStatement: function (left, right, body) {\n            this.type = Syntax.ForInStatement;\n            this.left = left;\n            this.right = right;\n            this.body = body;\n            this.each = false;\n            this.finish();\n            return this;\n        },\n\n        finishFunctionDeclaration: function (id, params, defaults, body, generator) {\n            this.type = Syntax.FunctionDeclaration;\n            this.id = id;\n            this.params = params;\n            this.defaults = defaults;\n            this.body = body;\n            this.generator = generator;\n            this.expression = false;\n            this.finish();\n            return this;\n        },\n\n        finishFunctionExpression: function (id, params, defaults, body, generator) {\n            this.type = Syntax.FunctionExpression;\n            this.id = id;\n            this.params = params;\n            this.defaults = defaults;\n            this.body = body;\n            this.generator = generator;\n            this.expression = false;\n            this.finish();\n            return this;\n        },\n\n        finishIdentifier: function (name) {\n            this.type = Syntax.Identifier;\n            this.name = name;\n            this.finish();\n            return this;\n        },\n\n        finishIfStatement: function (test, consequent, alternate) {\n            this.type = Syntax.IfStatement;\n            this.test = test;\n            this.consequent = consequent;\n            this.alternate = alternate;\n            this.finish();\n            return this;\n        },\n\n        finishLabeledStatement: function (label, body) {\n            this.type = Syntax.LabeledStatement;\n            this.label = label;\n            this.body = body;\n            this.finish();\n            return this;\n        },\n\n        finishLiteral: function (token) {\n            this.type = Syntax.Literal;\n            this.value = token.value;\n            this.raw = source.slice(token.start, token.end);\n            if (token.regex) {\n                this.regex = token.regex;\n            }\n            this.finish();\n            return this;\n        },\n\n        finishMemberExpression: function (accessor, object, property) {\n            this.type = Syntax.MemberExpression;\n            this.computed = accessor === '[';\n            this.object = object;\n            this.property = property;\n            this.finish();\n            return this;\n        },\n\n        finishMetaProperty: function (meta, property) {\n            this.type = Syntax.MetaProperty;\n            this.meta = meta;\n            this.property = property;\n            this.finish();\n            return this;\n        },\n\n        finishNewExpression: function (callee, args) {\n            this.type = Syntax.NewExpression;\n            this.callee = callee;\n            this.arguments = args;\n            this.finish();\n            return this;\n        },\n\n        finishObjectExpression: function (properties) {\n            this.type = Syntax.ObjectExpression;\n            this.properties = properties;\n            this.finish();\n            return this;\n        },\n\n        finishObjectPattern: function (properties) {\n            this.type = Syntax.ObjectPattern;\n            this.properties = properties;\n            this.finish();\n            return this;\n        },\n\n        finishPostfixExpression: function (operator, argument) {\n            this.type = Syntax.UpdateExpression;\n            this.operator = operator;\n            this.argument = argument;\n            this.prefix = false;\n            this.finish();\n            return this;\n        },\n\n        finishProgram: function (body, sourceType) {\n            this.type = Syntax.Program;\n            this.body = body;\n            this.sourceType = sourceType;\n            this.finish();\n            return this;\n        },\n\n        finishProperty: function (kind, key, computed, value, method, shorthand) {\n            this.type = Syntax.Property;\n            this.key = key;\n            this.computed = computed;\n            this.value = value;\n            this.kind = kind;\n            this.method = method;\n            this.shorthand = shorthand;\n            this.finish();\n            return this;\n        },\n\n        finishRestElement: function (argument) {\n            this.type = Syntax.RestElement;\n            this.argument = argument;\n            this.finish();\n            return this;\n        },\n\n        finishReturnStatement: function (argument) {\n            this.type = Syntax.ReturnStatement;\n            this.argument = argument;\n            this.finish();\n            return this;\n        },\n\n        finishSequenceExpression: function (expressions) {\n            this.type = Syntax.SequenceExpression;\n            this.expressions = expressions;\n            this.finish();\n            return this;\n        },\n\n        finishSpreadElement: function (argument) {\n            this.type = Syntax.SpreadElement;\n            this.argument = argument;\n            this.finish();\n            return this;\n        },\n\n        finishSwitchCase: function (test, consequent) {\n            this.type = Syntax.SwitchCase;\n            this.test = test;\n            this.consequent = consequent;\n            this.finish();\n            return this;\n        },\n\n        finishSuper: function () {\n            this.type = Syntax.Super;\n            this.finish();\n            return this;\n        },\n\n        finishSwitchStatement: function (discriminant, cases) {\n            this.type = Syntax.SwitchStatement;\n            this.discriminant = discriminant;\n            this.cases = cases;\n            this.finish();\n            return this;\n        },\n\n        finishTaggedTemplateExpression: function (tag, quasi) {\n            this.type = Syntax.TaggedTemplateExpression;\n            this.tag = tag;\n            this.quasi = quasi;\n            this.finish();\n            return this;\n        },\n\n        finishTemplateElement: function (value, tail) {\n            this.type = Syntax.TemplateElement;\n            this.value = value;\n            this.tail = tail;\n            this.finish();\n            return this;\n        },\n\n        finishTemplateLiteral: function (quasis, expressions) {\n            this.type = Syntax.TemplateLiteral;\n            this.quasis = quasis;\n            this.expressions = expressions;\n            this.finish();\n            return this;\n        },\n\n        finishThisExpression: function () {\n            this.type = Syntax.ThisExpression;\n            this.finish();\n            return this;\n        },\n\n        finishThrowStatement: function (argument) {\n            this.type = Syntax.ThrowStatement;\n            this.argument = argument;\n            this.finish();\n            return this;\n        },\n\n        finishTryStatement: function (block, handler, finalizer) {\n            this.type = Syntax.TryStatement;\n            this.block = block;\n            this.guardedHandlers = [];\n            this.handlers = handler ? [handler] : [];\n            this.handler = handler;\n            this.finalizer = finalizer;\n            this.finish();\n            return this;\n        },\n\n        finishUnaryExpression: function (operator, argument) {\n            this.type = (operator === '++' || operator === '--') ? Syntax.UpdateExpression : Syntax.UnaryExpression;\n            this.operator = operator;\n            this.argument = argument;\n            this.prefix = true;\n            this.finish();\n            return this;\n        },\n\n        finishVariableDeclaration: function (declarations) {\n            this.type = Syntax.VariableDeclaration;\n            this.declarations = declarations;\n            this.kind = 'var';\n            this.finish();\n            return this;\n        },\n\n        finishLexicalDeclaration: function (declarations, kind) {\n            this.type = Syntax.VariableDeclaration;\n            this.declarations = declarations;\n            this.kind = kind;\n            this.finish();\n            return this;\n        },\n\n        finishVariableDeclarator: function (id, init) {\n            this.type = Syntax.VariableDeclarator;\n            this.id = id;\n            this.init = init;\n            this.finish();\n            return this;\n        },\n\n        finishWhileStatement: function (test, body) {\n            this.type = Syntax.WhileStatement;\n            this.test = test;\n            this.body = body;\n            this.finish();\n            return this;\n        },\n\n        finishWithStatement: function (object, body) {\n            this.type = Syntax.WithStatement;\n            this.object = object;\n            this.body = body;\n            this.finish();\n            return this;\n        },\n\n        finishExportSpecifier: function (local, exported) {\n            this.type = Syntax.ExportSpecifier;\n            this.exported = exported || local;\n            this.local = local;\n            this.finish();\n            return this;\n        },\n\n        finishImportDefaultSpecifier: function (local) {\n            this.type = Syntax.ImportDefaultSpecifier;\n            this.local = local;\n            this.finish();\n            return this;\n        },\n\n        finishImportNamespaceSpecifier: function (local) {\n            this.type = Syntax.ImportNamespaceSpecifier;\n            this.local = local;\n            this.finish();\n            return this;\n        },\n\n        finishExportNamedDeclaration: function (declaration, specifiers, src) {\n            this.type = Syntax.ExportNamedDeclaration;\n            this.declaration = declaration;\n            this.specifiers = specifiers;\n            this.source = src;\n            this.finish();\n            return this;\n        },\n\n        finishExportDefaultDeclaration: function (declaration) {\n            this.type = Syntax.ExportDefaultDeclaration;\n            this.declaration = declaration;\n            this.finish();\n            return this;\n        },\n\n        finishExportAllDeclaration: function (src) {\n            this.type = Syntax.ExportAllDeclaration;\n            this.source = src;\n            this.finish();\n            return this;\n        },\n\n        finishImportSpecifier: function (local, imported) {\n            this.type = Syntax.ImportSpecifier;\n            this.local = local || imported;\n            this.imported = imported;\n            this.finish();\n            return this;\n        },\n\n        finishImportDeclaration: function (specifiers, src) {\n            this.type = Syntax.ImportDeclaration;\n            this.specifiers = specifiers;\n            this.source = src;\n            this.finish();\n            return this;\n        },\n\n        finishYieldExpression: function (argument, delegate) {\n            this.type = Syntax.YieldExpression;\n            this.argument = argument;\n            this.delegate = delegate;\n            this.finish();\n            return this;\n        }\n    };\n\n\n    function recordError(error) {\n        var e, existing;\n\n        for (e = 0; e < extra.errors.length; e++) {\n            existing = extra.errors[e];\n            // Prevent duplicated error.\n            /* istanbul ignore next */\n            if (existing.index === error.index && existing.message === error.message) {\n                return;\n            }\n        }\n\n        extra.errors.push(error);\n    }\n\n    function constructError(msg, column) {\n        var error = new Error(msg);\n        try {\n            throw error;\n        } catch (base) {\n            /* istanbul ignore else */\n            if (Object.create && Object.defineProperty) {\n                error = Object.create(base);\n                Object.defineProperty(error, 'column', { value: column });\n            }\n        } finally {\n            return error;\n        }\n    }\n\n    function createError(line, pos, description) {\n        var msg, column, error;\n\n        msg = 'Line ' + line + ': ' + description;\n        column = pos - (scanning ? lineStart : lastLineStart) + 1;\n        error = constructError(msg, column);\n        error.lineNumber = line;\n        error.description = description;\n        error.index = pos;\n        return error;\n    }\n\n    // Throw an exception\n\n    function throwError(messageFormat) {\n        var args, msg;\n\n        args = Array.prototype.slice.call(arguments, 1);\n        msg = messageFormat.replace(/%(\\d)/g,\n            function (whole, idx) {\n                assert(idx < args.length, 'Message reference must be in range');\n                return args[idx];\n            }\n        );\n\n        throw createError(lastLineNumber, lastIndex, msg);\n    }\n\n    function tolerateError(messageFormat) {\n        var args, msg, error;\n\n        args = Array.prototype.slice.call(arguments, 1);\n        /* istanbul ignore next */\n        msg = messageFormat.replace(/%(\\d)/g,\n            function (whole, idx) {\n                assert(idx < args.length, 'Message reference must be in range');\n                return args[idx];\n            }\n        );\n\n        error = createError(lineNumber, lastIndex, msg);\n        if (extra.errors) {\n            recordError(error);\n        } else {\n            throw error;\n        }\n    }\n\n    // Throw an exception because of the token.\n\n    function unexpectedTokenError(token, message) {\n        var value, msg = message || Messages.UnexpectedToken;\n\n        if (token) {\n            if (!message) {\n                msg = (token.type === Token.EOF) ? Messages.UnexpectedEOS :\n                    (token.type === Token.Identifier) ? Messages.UnexpectedIdentifier :\n                    (token.type === Token.NumericLiteral) ? Messages.UnexpectedNumber :\n                    (token.type === Token.StringLiteral) ? Messages.UnexpectedString :\n                    (token.type === Token.Template) ? Messages.UnexpectedTemplate :\n                    Messages.UnexpectedToken;\n\n                if (token.type === Token.Keyword) {\n                    if (isFutureReservedWord(token.value)) {\n                        msg = Messages.UnexpectedReserved;\n                    } else if (strict && isStrictModeReservedWord(token.value)) {\n                        msg = Messages.StrictReservedWord;\n                    }\n                }\n            }\n\n            value = (token.type === Token.Template) ? token.value.raw : token.value;\n        } else {\n            value = 'ILLEGAL';\n        }\n\n        msg = msg.replace('%0', value);\n\n        return (token && typeof token.lineNumber === 'number') ?\n            createError(token.lineNumber, token.start, msg) :\n            createError(scanning ? lineNumber : lastLineNumber, scanning ? index : lastIndex, msg);\n    }\n\n    function throwUnexpectedToken(token, message) {\n        throw unexpectedTokenError(token, message);\n    }\n\n    function tolerateUnexpectedToken(token, message) {\n        var error = unexpectedTokenError(token, message);\n        if (extra.errors) {\n            recordError(error);\n        } else {\n            throw error;\n        }\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpectedToken(token);\n        }\n    }\n\n    /**\n     * @name expectCommaSeparator\n     * @description Quietly expect a comma when in tolerant mode, otherwise delegates\n     * to <code>expect(value)</code>\n     * @since 2.0\n     */\n    function expectCommaSeparator() {\n        var token;\n\n        if (extra.errors) {\n            token = lookahead;\n            if (token.type === Token.Punctuator && token.value === ',') {\n                lex();\n            } else if (token.type === Token.Punctuator && token.value === ';') {\n                lex();\n                tolerateUnexpectedToken(token);\n            } else {\n                tolerateUnexpectedToken(token, Messages.UnexpectedToken);\n            }\n        } else {\n            expect(',');\n        }\n    }\n\n    // Expect the next token to match the specified keyword.\n    // If not, an exception will be thrown.\n\n    function expectKeyword(keyword) {\n        var token = lex();\n        if (token.type !== Token.Keyword || token.value !== keyword) {\n            throwUnexpectedToken(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    // Return true if the next token matches the specified contextual keyword\n    // (where an identifier is sometimes a keyword depending on the context)\n\n    function matchContextualKeyword(keyword) {\n        return lookahead.type === Token.Identifier && lookahead.value === keyword;\n    }\n\n    // Return true if the next token is an assignment operator\n\n    function matchAssign() {\n        var op;\n\n        if (lookahead.type !== Token.Punctuator) {\n            return false;\n        }\n        op = lookahead.value;\n        return op === '=' ||\n            op === '*=' ||\n            op === '/=' ||\n            op === '%=' ||\n            op === '+=' ||\n            op === '-=' ||\n            op === '<<=' ||\n            op === '>>=' ||\n            op === '>>>=' ||\n            op === '&=' ||\n            op === '^=' ||\n            op === '|=';\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (U+003B).\n        if (source.charCodeAt(startIndex) === 0x3B || match(';')) {\n            lex();\n            return;\n        }\n\n        if (hasLineTerminator) {\n            return;\n        }\n\n        // FIXME(ikarienator): this is seemingly an issue in the previous location info convention.\n        lastIndex = startIndex;\n        lastLineNumber = startLineNumber;\n        lastLineStart = startLineStart;\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpectedToken(lookahead);\n        }\n    }\n\n    // Cover grammar support.\n    //\n    // When an assignment expression position starts with an left parenthesis, the determination of the type\n    // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead)\n    // or the first comma. This situation also defers the determination of all the expressions nested in the pair.\n    //\n    // There are three productions that can be parsed in a parentheses pair that needs to be determined\n    // after the outermost pair is closed. They are:\n    //\n    //   1. AssignmentExpression\n    //   2. BindingElements\n    //   3. AssignmentTargets\n    //\n    // In order to avoid exponential backtracking, we use two flags to denote if the production can be\n    // binding element or assignment target.\n    //\n    // The three productions have the relationship:\n    //\n    //   BindingElements ⊆ AssignmentTargets ⊆ AssignmentExpression\n    //\n    // with a single exception that CoverInitializedName when used directly in an Expression, generates\n    // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the\n    // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair.\n    //\n    // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not\n    // effect the current flags. This means the production the parser parses is only used as an expression. Therefore\n    // the CoverInitializedName check is conducted.\n    //\n    // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates\n    // the flags outside of the parser. This means the production the parser parses is used as a part of a potential\n    // pattern. The CoverInitializedName check is deferred.\n    function isolateCoverGrammar(parser) {\n        var oldIsBindingElement = isBindingElement,\n            oldIsAssignmentTarget = isAssignmentTarget,\n            oldFirstCoverInitializedNameError = firstCoverInitializedNameError,\n            result;\n        isBindingElement = true;\n        isAssignmentTarget = true;\n        firstCoverInitializedNameError = null;\n        result = parser();\n        if (firstCoverInitializedNameError !== null) {\n            throwUnexpectedToken(firstCoverInitializedNameError);\n        }\n        isBindingElement = oldIsBindingElement;\n        isAssignmentTarget = oldIsAssignmentTarget;\n        firstCoverInitializedNameError = oldFirstCoverInitializedNameError;\n        return result;\n    }\n\n    function inheritCoverGrammar(parser) {\n        var oldIsBindingElement = isBindingElement,\n            oldIsAssignmentTarget = isAssignmentTarget,\n            oldFirstCoverInitializedNameError = firstCoverInitializedNameError,\n            result;\n        isBindingElement = true;\n        isAssignmentTarget = true;\n        firstCoverInitializedNameError = null;\n        result = parser();\n        isBindingElement = isBindingElement && oldIsBindingElement;\n        isAssignmentTarget = isAssignmentTarget && oldIsAssignmentTarget;\n        firstCoverInitializedNameError = oldFirstCoverInitializedNameError || firstCoverInitializedNameError;\n        return result;\n    }\n\n    // ECMA-262 13.3.3 Destructuring Binding Patterns\n\n    function parseArrayPattern(params, kind) {\n        var node = new Node(), elements = [], rest, restNode;\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                if (match('...')) {\n                    restNode = new Node();\n                    lex();\n                    params.push(lookahead);\n                    rest = parseVariableIdentifier(kind);\n                    elements.push(restNode.finishRestElement(rest));\n                    break;\n                } else {\n                    elements.push(parsePatternWithDefault(params, kind));\n                }\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n\n        }\n\n        expect(']');\n\n        return node.finishArrayPattern(elements);\n    }\n\n    function parsePropertyPattern(params, kind) {\n        var node = new Node(), key, keyToken, computed = match('['), init;\n        if (lookahead.type === Token.Identifier) {\n            keyToken = lookahead;\n            key = parseVariableIdentifier();\n            if (match('=')) {\n                params.push(keyToken);\n                lex();\n                init = parseAssignmentExpression();\n\n                return node.finishProperty(\n                    'init', key, false,\n                    new WrappingNode(keyToken).finishAssignmentPattern(key, init), false, true);\n            } else if (!match(':')) {\n                params.push(keyToken);\n                return node.finishProperty('init', key, false, key, false, true);\n            }\n        } else {\n            key = parseObjectPropertyKey();\n        }\n        expect(':');\n        init = parsePatternWithDefault(params, kind);\n        return node.finishProperty('init', key, computed, init, false, false);\n    }\n\n    function parseObjectPattern(params, kind) {\n        var node = new Node(), properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parsePropertyPattern(params, kind));\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        lex();\n\n        return node.finishObjectPattern(properties);\n    }\n\n    function parsePattern(params, kind) {\n        if (match('[')) {\n            return parseArrayPattern(params, kind);\n        } else if (match('{')) {\n            return parseObjectPattern(params, kind);\n        } else if (matchKeyword('let')) {\n            if (kind === 'const' || kind === 'let') {\n                tolerateUnexpectedToken(lookahead, Messages.UnexpectedToken);\n            }\n        }\n\n        params.push(lookahead);\n        return parseVariableIdentifier(kind);\n    }\n\n    function parsePatternWithDefault(params, kind) {\n        var startToken = lookahead, pattern, previousAllowYield, right;\n        pattern = parsePattern(params, kind);\n        if (match('=')) {\n            lex();\n            previousAllowYield = state.allowYield;\n            state.allowYield = true;\n            right = isolateCoverGrammar(parseAssignmentExpression);\n            state.allowYield = previousAllowYield;\n            pattern = new WrappingNode(startToken).finishAssignmentPattern(pattern, right);\n        }\n        return pattern;\n    }\n\n    // ECMA-262 12.2.5 Array Initializer\n\n    function parseArrayInitializer() {\n        var elements = [], node = new Node(), restSpread;\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else if (match('...')) {\n                restSpread = new Node();\n                lex();\n                restSpread.finishSpreadElement(inheritCoverGrammar(parseAssignmentExpression));\n\n                if (!match(']')) {\n                    isAssignmentTarget = isBindingElement = false;\n                    expect(',');\n                }\n                elements.push(restSpread);\n            } else {\n                elements.push(inheritCoverGrammar(parseAssignmentExpression));\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        lex();\n\n        return node.finishArrayExpression(elements);\n    }\n\n    // ECMA-262 12.2.6 Object Initializer\n\n    function parsePropertyFunction(node, paramInfo, isGenerator) {\n        var previousStrict, body;\n\n        isAssignmentTarget = isBindingElement = false;\n\n        previousStrict = strict;\n        body = isolateCoverGrammar(parseFunctionSourceElements);\n\n        if (strict && paramInfo.firstRestricted) {\n            tolerateUnexpectedToken(paramInfo.firstRestricted, paramInfo.message);\n        }\n        if (strict && paramInfo.stricted) {\n            tolerateUnexpectedToken(paramInfo.stricted, paramInfo.message);\n        }\n\n        strict = previousStrict;\n        return node.finishFunctionExpression(null, paramInfo.params, paramInfo.defaults, body, isGenerator);\n    }\n\n    function parsePropertyMethodFunction() {\n        var params, method, node = new Node(),\n            previousAllowYield = state.allowYield;\n\n        state.allowYield = false;\n        params = parseParams();\n        state.allowYield = previousAllowYield;\n\n        state.allowYield = false;\n        method = parsePropertyFunction(node, params, false);\n        state.allowYield = previousAllowYield;\n\n        return method;\n    }\n\n    function parseObjectPropertyKey() {\n        var token, node = new Node(), expr;\n\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n\n        switch (token.type) {\n            case Token.StringLiteral:\n            case Token.NumericLiteral:\n                if (strict && token.octal) {\n                    tolerateUnexpectedToken(token, Messages.StrictOctalLiteral);\n                }\n                return node.finishLiteral(token);\n            case Token.Identifier:\n            case Token.BooleanLiteral:\n            case Token.NullLiteral:\n            case Token.Keyword:\n                return node.finishIdentifier(token.value);\n            case Token.Punctuator:\n                if (token.value === '[') {\n                    expr = isolateCoverGrammar(parseAssignmentExpression);\n                    expect(']');\n                    return expr;\n                }\n                break;\n        }\n        throwUnexpectedToken(token);\n    }\n\n    function lookaheadPropertyName() {\n        switch (lookahead.type) {\n            case Token.Identifier:\n            case Token.StringLiteral:\n            case Token.BooleanLiteral:\n            case Token.NullLiteral:\n            case Token.NumericLiteral:\n            case Token.Keyword:\n                return true;\n            case Token.Punctuator:\n                return lookahead.value === '[';\n        }\n        return false;\n    }\n\n    // This function is to try to parse a MethodDefinition as defined in 14.3. But in the case of object literals,\n    // it might be called at a position where there is in fact a short hand identifier pattern or a data property.\n    // This can only be determined after we consumed up to the left parentheses.\n    //\n    // In order to avoid back tracking, it returns `null` if the position is not a MethodDefinition and the caller\n    // is responsible to visit other options.\n    function tryParseMethodDefinition(token, key, computed, node) {\n        var value, options, methodNode, params,\n            previousAllowYield = state.allowYield;\n\n        if (token.type === Token.Identifier) {\n            // check for `get` and `set`;\n\n            if (token.value === 'get' && lookaheadPropertyName()) {\n                computed = match('[');\n                key = parseObjectPropertyKey();\n                methodNode = new Node();\n                expect('(');\n                expect(')');\n\n                state.allowYield = false;\n                value = parsePropertyFunction(methodNode, {\n                    params: [],\n                    defaults: [],\n                    stricted: null,\n                    firstRestricted: null,\n                    message: null\n                }, false);\n                state.allowYield = previousAllowYield;\n\n                return node.finishProperty('get', key, computed, value, false, false);\n            } else if (token.value === 'set' && lookaheadPropertyName()) {\n                computed = match('[');\n                key = parseObjectPropertyKey();\n                methodNode = new Node();\n                expect('(');\n\n                options = {\n                    params: [],\n                    defaultCount: 0,\n                    defaults: [],\n                    firstRestricted: null,\n                    paramSet: {}\n                };\n                if (match(')')) {\n                    tolerateUnexpectedToken(lookahead);\n                } else {\n                    state.allowYield = false;\n                    parseParam(options);\n                    state.allowYield = previousAllowYield;\n                    if (options.defaultCount === 0) {\n                        options.defaults = [];\n                    }\n                }\n                expect(')');\n\n                state.allowYield = false;\n                value = parsePropertyFunction(methodNode, options, false);\n                state.allowYield = previousAllowYield;\n\n                return node.finishProperty('set', key, computed, value, false, false);\n            }\n        } else if (token.type === Token.Punctuator && token.value === '*' && lookaheadPropertyName()) {\n            computed = match('[');\n            key = parseObjectPropertyKey();\n            methodNode = new Node();\n\n            state.allowYield = true;\n            params = parseParams();\n            state.allowYield = previousAllowYield;\n\n            state.allowYield = false;\n            value = parsePropertyFunction(methodNode, params, true);\n            state.allowYield = previousAllowYield;\n\n            return node.finishProperty('init', key, computed, value, true, false);\n        }\n\n        if (key && match('(')) {\n            value = parsePropertyMethodFunction();\n            return node.finishProperty('init', key, computed, value, true, false);\n        }\n\n        // Not a MethodDefinition.\n        return null;\n    }\n\n    function parseObjectProperty(hasProto) {\n        var token = lookahead, node = new Node(), computed, key, maybeMethod, proto, value;\n\n        computed = match('[');\n        if (match('*')) {\n            lex();\n        } else {\n            key = parseObjectPropertyKey();\n        }\n        maybeMethod = tryParseMethodDefinition(token, key, computed, node);\n        if (maybeMethod) {\n            return maybeMethod;\n        }\n\n        if (!key) {\n            throwUnexpectedToken(lookahead);\n        }\n\n        // Check for duplicated __proto__\n        if (!computed) {\n            proto = (key.type === Syntax.Identifier && key.name === '__proto__') ||\n                (key.type === Syntax.Literal && key.value === '__proto__');\n            if (hasProto.value && proto) {\n                tolerateError(Messages.DuplicateProtoProperty);\n            }\n            hasProto.value |= proto;\n        }\n\n        if (match(':')) {\n            lex();\n            value = inheritCoverGrammar(parseAssignmentExpression);\n            return node.finishProperty('init', key, computed, value, false, false);\n        }\n\n        if (token.type === Token.Identifier) {\n            if (match('=')) {\n                firstCoverInitializedNameError = lookahead;\n                lex();\n                value = isolateCoverGrammar(parseAssignmentExpression);\n                return node.finishProperty('init', key, computed,\n                    new WrappingNode(token).finishAssignmentPattern(key, value), false, true);\n            }\n            return node.finishProperty('init', key, computed, key, false, true);\n        }\n\n        throwUnexpectedToken(lookahead);\n    }\n\n    function parseObjectInitializer() {\n        var properties = [], hasProto = { value: false }, node = new Node();\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty(hasProto));\n\n            if (!match('}')) {\n                expectCommaSeparator();\n            }\n        }\n\n        expect('}');\n\n        return node.finishObjectExpression(properties);\n    }\n\n    function reinterpretExpressionAsPattern(expr) {\n        var i;\n        switch (expr.type) {\n            case Syntax.Identifier:\n            case Syntax.MemberExpression:\n            case Syntax.RestElement:\n            case Syntax.AssignmentPattern:\n                break;\n            case Syntax.SpreadElement:\n                expr.type = Syntax.RestElement;\n                reinterpretExpressionAsPattern(expr.argument);\n                break;\n            case Syntax.ArrayExpression:\n                expr.type = Syntax.ArrayPattern;\n                for (i = 0; i < expr.elements.length; i++) {\n                    if (expr.elements[i] !== null) {\n                        reinterpretExpressionAsPattern(expr.elements[i]);\n                    }\n                }\n                break;\n            case Syntax.ObjectExpression:\n                expr.type = Syntax.ObjectPattern;\n                for (i = 0; i < expr.properties.length; i++) {\n                    reinterpretExpressionAsPattern(expr.properties[i].value);\n                }\n                break;\n            case Syntax.AssignmentExpression:\n                expr.type = Syntax.AssignmentPattern;\n                reinterpretExpressionAsPattern(expr.left);\n                break;\n            default:\n                // Allow other node type for tolerant parsing.\n                break;\n        }\n    }\n\n    // ECMA-262 12.2.9 Template Literals\n\n    function parseTemplateElement(option) {\n        var node, token;\n\n        if (lookahead.type !== Token.Template || (option.head && !lookahead.head)) {\n            throwUnexpectedToken();\n        }\n\n        node = new Node();\n        token = lex();\n\n        return node.finishTemplateElement({ raw: token.value.raw, cooked: token.value.cooked }, token.tail);\n    }\n\n    function parseTemplateLiteral() {\n        var quasi, quasis, expressions, node = new Node();\n\n        quasi = parseTemplateElement({ head: true });\n        quasis = [quasi];\n        expressions = [];\n\n        while (!quasi.tail) {\n            expressions.push(parseExpression());\n            quasi = parseTemplateElement({ head: false });\n            quasis.push(quasi);\n        }\n\n        return node.finishTemplateLiteral(quasis, expressions);\n    }\n\n    // ECMA-262 12.2.10 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr, expressions, startToken, i, params = [];\n\n        expect('(');\n\n        if (match(')')) {\n            lex();\n            if (!match('=>')) {\n                expect('=>');\n            }\n            return {\n                type: PlaceHolders.ArrowParameterPlaceHolder,\n                params: [],\n                rawParams: []\n            };\n        }\n\n        startToken = lookahead;\n        if (match('...')) {\n            expr = parseRestElement(params);\n            expect(')');\n            if (!match('=>')) {\n                expect('=>');\n            }\n            return {\n                type: PlaceHolders.ArrowParameterPlaceHolder,\n                params: [expr]\n            };\n        }\n\n        isBindingElement = true;\n        expr = inheritCoverGrammar(parseAssignmentExpression);\n\n        if (match(',')) {\n            isAssignmentTarget = false;\n            expressions = [expr];\n\n            while (startIndex < length) {\n                if (!match(',')) {\n                    break;\n                }\n                lex();\n\n                if (match('...')) {\n                    if (!isBindingElement) {\n                        throwUnexpectedToken(lookahead);\n                    }\n                    expressions.push(parseRestElement(params));\n                    expect(')');\n                    if (!match('=>')) {\n                        expect('=>');\n                    }\n                    isBindingElement = false;\n                    for (i = 0; i < expressions.length; i++) {\n                        reinterpretExpressionAsPattern(expressions[i]);\n                    }\n                    return {\n                        type: PlaceHolders.ArrowParameterPlaceHolder,\n                        params: expressions\n                    };\n                }\n\n                expressions.push(inheritCoverGrammar(parseAssignmentExpression));\n            }\n\n            expr = new WrappingNode(startToken).finishSequenceExpression(expressions);\n        }\n\n\n        expect(')');\n\n        if (match('=>')) {\n            if (expr.type === Syntax.Identifier && expr.name === 'yield') {\n                return {\n                    type: PlaceHolders.ArrowParameterPlaceHolder,\n                    params: [expr]\n                };\n            }\n\n            if (!isBindingElement) {\n                throwUnexpectedToken(lookahead);\n            }\n\n            if (expr.type === Syntax.SequenceExpression) {\n                for (i = 0; i < expr.expressions.length; i++) {\n                    reinterpretExpressionAsPattern(expr.expressions[i]);\n                }\n            } else {\n                reinterpretExpressionAsPattern(expr);\n            }\n\n            expr = {\n                type: PlaceHolders.ArrowParameterPlaceHolder,\n                params: expr.type === Syntax.SequenceExpression ? expr.expressions : [expr]\n            };\n        }\n        isBindingElement = false;\n        return expr;\n    }\n\n\n    // ECMA-262 12.2 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr, node;\n\n        if (match('(')) {\n            isBindingElement = false;\n            return inheritCoverGrammar(parseGroupExpression);\n        }\n\n        if (match('[')) {\n            return inheritCoverGrammar(parseArrayInitializer);\n        }\n\n        if (match('{')) {\n            return inheritCoverGrammar(parseObjectInitializer);\n        }\n\n        type = lookahead.type;\n        node = new Node();\n\n        if (type === Token.Identifier) {\n            if (state.sourceType === 'module' && lookahead.value === 'await') {\n                tolerateUnexpectedToken(lookahead);\n            }\n            expr = node.finishIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            isAssignmentTarget = isBindingElement = false;\n            if (strict && lookahead.octal) {\n                tolerateUnexpectedToken(lookahead, Messages.StrictOctalLiteral);\n            }\n            expr = node.finishLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (!strict && state.allowYield && matchKeyword('yield')) {\n                return parseNonComputedProperty();\n            }\n            if (!strict && matchKeyword('let')) {\n                return node.finishIdentifier(lex().value);\n            }\n            isAssignmentTarget = isBindingElement = false;\n            if (matchKeyword('function')) {\n                return parseFunctionExpression();\n            }\n            if (matchKeyword('this')) {\n                lex();\n                return node.finishThisExpression();\n            }\n            if (matchKeyword('class')) {\n                return parseClassExpression();\n            }\n            throwUnexpectedToken(lex());\n        } else if (type === Token.BooleanLiteral) {\n            isAssignmentTarget = isBindingElement = false;\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = node.finishLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            isAssignmentTarget = isBindingElement = false;\n            token = lex();\n            token.value = null;\n            expr = node.finishLiteral(token);\n        } else if (match('/') || match('/=')) {\n            isAssignmentTarget = isBindingElement = false;\n            index = startIndex;\n\n            if (typeof extra.tokens !== 'undefined') {\n                token = collectRegex();\n            } else {\n                token = scanRegExp();\n            }\n            lex();\n            expr = node.finishLiteral(token);\n        } else if (type === Token.Template) {\n            expr = parseTemplateLiteral();\n        } else {\n            throwUnexpectedToken(lex());\n        }\n\n        return expr;\n    }\n\n    // ECMA-262 12.3 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [], expr;\n\n        expect('(');\n\n        if (!match(')')) {\n            while (startIndex < length) {\n                if (match('...')) {\n                    expr = new Node();\n                    lex();\n                    expr.finishSpreadElement(isolateCoverGrammar(parseAssignmentExpression));\n                } else {\n                    expr = isolateCoverGrammar(parseAssignmentExpression);\n                }\n                args.push(expr);\n                if (match(')')) {\n                    break;\n                }\n                expectCommaSeparator();\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token, node = new Node();\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpectedToken(token);\n        }\n\n        return node.finishIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = isolateCoverGrammar(parseExpression);\n\n        expect(']');\n\n        return expr;\n    }\n\n    // ECMA-262 12.3.3 The new Operator\n\n    function parseNewExpression() {\n        var callee, args, node = new Node();\n\n        expectKeyword('new');\n\n        if (match('.')) {\n            lex();\n            if (lookahead.type === Token.Identifier && lookahead.value === 'target') {\n                if (state.inFunctionBody) {\n                    lex();\n                    return node.finishMetaProperty('new', 'target');\n                }\n            }\n            throwUnexpectedToken(lookahead);\n        }\n\n        callee = isolateCoverGrammar(parseLeftHandSideExpression);\n        args = match('(') ? parseArguments() : [];\n\n        isAssignmentTarget = isBindingElement = false;\n\n        return node.finishNewExpression(callee, args);\n    }\n\n    // ECMA-262 12.3.4 Function Calls\n\n    function parseLeftHandSideExpressionAllowCall() {\n        var quasi, expr, args, property, startToken, previousAllowIn = state.allowIn;\n\n        startToken = lookahead;\n        state.allowIn = true;\n\n        if (matchKeyword('super') && state.inFunctionBody) {\n            expr = new Node();\n            lex();\n            expr = expr.finishSuper();\n            if (!match('(') && !match('.') && !match('[')) {\n                throwUnexpectedToken(lookahead);\n            }\n        } else {\n            expr = inheritCoverGrammar(matchKeyword('new') ? parseNewExpression : parsePrimaryExpression);\n        }\n\n        for (; ;) {\n            if (match('.')) {\n                isBindingElement = false;\n                isAssignmentTarget = true;\n                property = parseNonComputedMember();\n                expr = new WrappingNode(startToken).finishMemberExpression('.', expr, property);\n            } else if (match('(')) {\n                isBindingElement = false;\n                isAssignmentTarget = false;\n                args = parseArguments();\n                expr = new WrappingNode(startToken).finishCallExpression(expr, args);\n            } else if (match('[')) {\n                isBindingElement = false;\n                isAssignmentTarget = true;\n                property = parseComputedMember();\n                expr = new WrappingNode(startToken).finishMemberExpression('[', expr, property);\n            } else if (lookahead.type === Token.Template && lookahead.head) {\n                quasi = parseTemplateLiteral();\n                expr = new WrappingNode(startToken).finishTaggedTemplateExpression(expr, quasi);\n            } else {\n                break;\n            }\n        }\n        state.allowIn = previousAllowIn;\n\n        return expr;\n    }\n\n    // ECMA-262 12.3 Left-Hand-Side Expressions\n\n    function parseLeftHandSideExpression() {\n        var quasi, expr, property, startToken;\n        assert(state.allowIn, 'callee of new expression always allow in keyword.');\n\n        startToken = lookahead;\n\n        if (matchKeyword('super') && state.inFunctionBody) {\n            expr = new Node();\n            lex();\n            expr = expr.finishSuper();\n            if (!match('[') && !match('.')) {\n                throwUnexpectedToken(lookahead);\n            }\n        } else {\n            expr = inheritCoverGrammar(matchKeyword('new') ? parseNewExpression : parsePrimaryExpression);\n        }\n\n        for (; ;) {\n            if (match('[')) {\n                isBindingElement = false;\n                isAssignmentTarget = true;\n                property = parseComputedMember();\n                expr = new WrappingNode(startToken).finishMemberExpression('[', expr, property);\n            } else if (match('.')) {\n                isBindingElement = false;\n                isAssignmentTarget = true;\n                property = parseNonComputedMember();\n                expr = new WrappingNode(startToken).finishMemberExpression('.', expr, property);\n            } else if (lookahead.type === Token.Template && lookahead.head) {\n                quasi = parseTemplateLiteral();\n                expr = new WrappingNode(startToken).finishTaggedTemplateExpression(expr, quasi);\n            } else {\n                break;\n            }\n        }\n        return expr;\n    }\n\n    // ECMA-262 12.4 Postfix Expressions\n\n    function parsePostfixExpression() {\n        var expr, token, startToken = lookahead;\n\n        expr = inheritCoverGrammar(parseLeftHandSideExpressionAllowCall);\n\n        if (!hasLineTerminator && lookahead.type === Token.Punctuator) {\n            if (match('++') || match('--')) {\n                // ECMA-262 11.3.1, 11.3.2\n                if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {\n                    tolerateError(Messages.StrictLHSPostfix);\n                }\n\n                if (!isAssignmentTarget) {\n                    tolerateError(Messages.InvalidLHSInAssignment);\n                }\n\n                isAssignmentTarget = isBindingElement = false;\n\n                token = lex();\n                expr = new WrappingNode(startToken).finishPostfixExpression(token.value, expr);\n            }\n        }\n\n        return expr;\n    }\n\n    // ECMA-262 12.5 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr, startToken;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('++') || match('--')) {\n            startToken = lookahead;\n            token = lex();\n            expr = inheritCoverGrammar(parseUnaryExpression);\n            // ECMA-262 11.4.4, 11.4.5\n            if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {\n                tolerateError(Messages.StrictLHSPrefix);\n            }\n\n            if (!isAssignmentTarget) {\n                tolerateError(Messages.InvalidLHSInAssignment);\n            }\n            expr = new WrappingNode(startToken).finishUnaryExpression(token.value, expr);\n            isAssignmentTarget = isBindingElement = false;\n        } else if (match('+') || match('-') || match('~') || match('!')) {\n            startToken = lookahead;\n            token = lex();\n            expr = inheritCoverGrammar(parseUnaryExpression);\n            expr = new WrappingNode(startToken).finishUnaryExpression(token.value, expr);\n            isAssignmentTarget = isBindingElement = false;\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            startToken = lookahead;\n            token = lex();\n            expr = inheritCoverGrammar(parseUnaryExpression);\n            expr = new WrappingNode(startToken).finishUnaryExpression(token.value, expr);\n            if (strict && expr.operator === 'delete' && expr.argument.type === Syntax.Identifier) {\n                tolerateError(Messages.StrictDelete);\n            }\n            isAssignmentTarget = isBindingElement = false;\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token, allowIn) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n            case '||':\n                prec = 1;\n                break;\n\n            case '&&':\n                prec = 2;\n                break;\n\n            case '|':\n                prec = 3;\n                break;\n\n            case '^':\n                prec = 4;\n                break;\n\n            case '&':\n                prec = 5;\n                break;\n\n            case '==':\n            case '!=':\n            case '===':\n            case '!==':\n                prec = 6;\n                break;\n\n            case '<':\n            case '>':\n            case '<=':\n            case '>=':\n            case 'instanceof':\n                prec = 7;\n                break;\n\n            case 'in':\n                prec = allowIn ? 7 : 0;\n                break;\n\n            case '<<':\n            case '>>':\n            case '>>>':\n                prec = 8;\n                break;\n\n            case '+':\n            case '-':\n                prec = 9;\n                break;\n\n            case '*':\n            case '/':\n            case '%':\n                prec = 11;\n                break;\n\n            default:\n                break;\n        }\n\n        return prec;\n    }\n\n    // ECMA-262 12.6 Multiplicative Operators\n    // ECMA-262 12.7 Additive Operators\n    // ECMA-262 12.8 Bitwise Shift Operators\n    // ECMA-262 12.9 Relational Operators\n    // ECMA-262 12.10 Equality Operators\n    // ECMA-262 12.11 Binary Bitwise Operators\n    // ECMA-262 12.12 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var marker, markers, expr, token, prec, stack, right, operator, left, i;\n\n        marker = lookahead;\n        left = inheritCoverGrammar(parseUnaryExpression);\n\n        token = lookahead;\n        prec = binaryPrecedence(token, state.allowIn);\n        if (prec === 0) {\n            return left;\n        }\n        isAssignmentTarget = isBindingElement = false;\n        token.prec = prec;\n        lex();\n\n        markers = [marker, lookahead];\n        right = isolateCoverGrammar(parseUnaryExpression);\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead, state.allowIn)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                markers.pop();\n                expr = new WrappingNode(markers[markers.length - 1]).finishBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            markers.push(lookahead);\n            expr = isolateCoverGrammar(parseUnaryExpression);\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        markers.pop();\n        while (i > 1) {\n            expr = new WrappingNode(markers.pop()).finishBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // ECMA-262 12.13 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, previousAllowIn, consequent, alternate, startToken;\n\n        startToken = lookahead;\n\n        expr = inheritCoverGrammar(parseBinaryExpression);\n        if (match('?')) {\n            lex();\n            previousAllowIn = state.allowIn;\n            state.allowIn = true;\n            consequent = isolateCoverGrammar(parseAssignmentExpression);\n            state.allowIn = previousAllowIn;\n            expect(':');\n            alternate = isolateCoverGrammar(parseAssignmentExpression);\n\n            expr = new WrappingNode(startToken).finishConditionalExpression(expr, consequent, alternate);\n            isAssignmentTarget = isBindingElement = false;\n        }\n\n        return expr;\n    }\n\n    // ECMA-262 14.2 Arrow Function Definitions\n\n    function parseConciseBody() {\n        if (match('{')) {\n            return parseFunctionSourceElements();\n        }\n        return isolateCoverGrammar(parseAssignmentExpression);\n    }\n\n    function checkPatternParam(options, param) {\n        var i;\n        switch (param.type) {\n            case Syntax.Identifier:\n                validateParam(options, param, param.name);\n                break;\n            case Syntax.RestElement:\n                checkPatternParam(options, param.argument);\n                break;\n            case Syntax.AssignmentPattern:\n                checkPatternParam(options, param.left);\n                break;\n            case Syntax.ArrayPattern:\n                for (i = 0; i < param.elements.length; i++) {\n                    if (param.elements[i] !== null) {\n                        checkPatternParam(options, param.elements[i]);\n                    }\n                }\n                break;\n            case Syntax.YieldExpression:\n                break;\n            default:\n                assert(param.type === Syntax.ObjectPattern, 'Invalid type');\n                for (i = 0; i < param.properties.length; i++) {\n                    checkPatternParam(options, param.properties[i].value);\n                }\n                break;\n        }\n    }\n    function reinterpretAsCoverFormalsList(expr) {\n        var i, len, param, params, defaults, defaultCount, options, token;\n\n        defaults = [];\n        defaultCount = 0;\n        params = [expr];\n\n        switch (expr.type) {\n            case Syntax.Identifier:\n                break;\n            case PlaceHolders.ArrowParameterPlaceHolder:\n                params = expr.params;\n                break;\n            default:\n                return null;\n        }\n\n        options = {\n            paramSet: {}\n        };\n\n        for (i = 0, len = params.length; i < len; i += 1) {\n            param = params[i];\n            switch (param.type) {\n                case Syntax.AssignmentPattern:\n                    params[i] = param.left;\n                    if (param.right.type === Syntax.YieldExpression) {\n                        if (param.right.argument) {\n                            throwUnexpectedToken(lookahead);\n                        }\n                        param.right.type = Syntax.Identifier;\n                        param.right.name = 'yield';\n                        delete param.right.argument;\n                        delete param.right.delegate;\n                    }\n                    defaults.push(param.right);\n                    ++defaultCount;\n                    checkPatternParam(options, param.left);\n                    break;\n                default:\n                    checkPatternParam(options, param);\n                    params[i] = param;\n                    defaults.push(null);\n                    break;\n            }\n        }\n\n        if (strict || !state.allowYield) {\n            for (i = 0, len = params.length; i < len; i += 1) {\n                param = params[i];\n                if (param.type === Syntax.YieldExpression) {\n                    throwUnexpectedToken(lookahead);\n                }\n            }\n        }\n\n        if (options.message === Messages.StrictParamDupe) {\n            token = strict ? options.stricted : options.firstRestricted;\n            throwUnexpectedToken(token, options.message);\n        }\n\n        if (defaultCount === 0) {\n            defaults = [];\n        }\n\n        return {\n            params: params,\n            defaults: defaults,\n            stricted: options.stricted,\n            firstRestricted: options.firstRestricted,\n            message: options.message\n        };\n    }\n\n    function parseArrowFunctionExpression(options, node) {\n        var previousStrict, previousAllowYield, body;\n\n        if (hasLineTerminator) {\n            tolerateUnexpectedToken(lookahead);\n        }\n        expect('=>');\n\n        previousStrict = strict;\n        previousAllowYield = state.allowYield;\n        state.allowYield = true;\n\n        body = parseConciseBody();\n\n        if (strict && options.firstRestricted) {\n            throwUnexpectedToken(options.firstRestricted, options.message);\n        }\n        if (strict && options.stricted) {\n            tolerateUnexpectedToken(options.stricted, options.message);\n        }\n\n        strict = previousStrict;\n        state.allowYield = previousAllowYield;\n\n        return node.finishArrowFunctionExpression(options.params, options.defaults, body, body.type !== Syntax.BlockStatement);\n    }\n\n    // ECMA-262 14.4 Yield expression\n\n    function parseYieldExpression() {\n        var argument, expr, delegate, previousAllowYield;\n\n        argument = null;\n        expr = new Node();\n        delegate = false;\n\n        expectKeyword('yield');\n\n        if (!hasLineTerminator) {\n            previousAllowYield = state.allowYield;\n            state.allowYield = false;\n            delegate = match('*');\n            if (delegate) {\n                lex();\n                argument = parseAssignmentExpression();\n            } else {\n                if (!match(';') && !match('}') && !match(')') && lookahead.type !== Token.EOF) {\n                    argument = parseAssignmentExpression();\n                }\n            }\n            state.allowYield = previousAllowYield;\n        }\n\n        return expr.finishYieldExpression(argument, delegate);\n    }\n\n    // ECMA-262 12.14 Assignment Operators\n\n    function parseAssignmentExpression() {\n        var token, expr, right, list, startToken;\n\n        startToken = lookahead;\n        token = lookahead;\n\n        if (!state.allowYield && matchKeyword('yield')) {\n            return parseYieldExpression();\n        }\n\n        expr = parseConditionalExpression();\n\n        if (expr.type === PlaceHolders.ArrowParameterPlaceHolder || match('=>')) {\n            isAssignmentTarget = isBindingElement = false;\n            list = reinterpretAsCoverFormalsList(expr);\n\n            if (list) {\n                firstCoverInitializedNameError = null;\n                return parseArrowFunctionExpression(list, new WrappingNode(startToken));\n            }\n\n            return expr;\n        }\n\n        if (matchAssign()) {\n            if (!isAssignmentTarget) {\n                tolerateError(Messages.InvalidLHSInAssignment);\n            }\n\n            // ECMA-262 12.1.1\n            if (strict && expr.type === Syntax.Identifier) {\n                if (isRestrictedWord(expr.name)) {\n                    tolerateUnexpectedToken(token, Messages.StrictLHSAssignment);\n                }\n                if (isStrictModeReservedWord(expr.name)) {\n                    tolerateUnexpectedToken(token, Messages.StrictReservedWord);\n                }\n            }\n\n            if (!match('=')) {\n                isAssignmentTarget = isBindingElement = false;\n            } else {\n                reinterpretExpressionAsPattern(expr);\n            }\n\n            token = lex();\n            right = isolateCoverGrammar(parseAssignmentExpression);\n            expr = new WrappingNode(startToken).finishAssignmentExpression(token.value, expr, right);\n            firstCoverInitializedNameError = null;\n        }\n\n        return expr;\n    }\n\n    // ECMA-262 12.15 Comma Operator\n\n    function parseExpression() {\n        var expr, startToken = lookahead, expressions;\n\n        expr = isolateCoverGrammar(parseAssignmentExpression);\n\n        if (match(',')) {\n            expressions = [expr];\n\n            while (startIndex < length) {\n                if (!match(',')) {\n                    break;\n                }\n                lex();\n                expressions.push(isolateCoverGrammar(parseAssignmentExpression));\n            }\n\n            expr = new WrappingNode(startToken).finishSequenceExpression(expressions);\n        }\n\n        return expr;\n    }\n\n    // ECMA-262 13.2 Block\n\n    function parseStatementListItem() {\n        if (lookahead.type === Token.Keyword) {\n            switch (lookahead.value) {\n                case 'export':\n                    if (state.sourceType !== 'module') {\n                        tolerateUnexpectedToken(lookahead, Messages.IllegalExportDeclaration);\n                    }\n                    return parseExportDeclaration();\n                case 'import':\n                    if (state.sourceType !== 'module') {\n                        tolerateUnexpectedToken(lookahead, Messages.IllegalImportDeclaration);\n                    }\n                    return parseImportDeclaration();\n                case 'const':\n                    return parseLexicalDeclaration({ inFor: false });\n                case 'function':\n                    return parseFunctionDeclaration(new Node());\n                case 'class':\n                    return parseClassDeclaration();\n            }\n        }\n\n        if (matchKeyword('let') && isLexicalDeclaration()) {\n            return parseLexicalDeclaration({ inFor: false });\n        }\n\n        return parseStatement();\n    }\n\n    function parseStatementList() {\n        var list = [];\n        while (startIndex < length) {\n            if (match('}')) {\n                break;\n            }\n            list.push(parseStatementListItem());\n        }\n\n        return list;\n    }\n\n    function parseBlock() {\n        var block, node = new Node();\n\n        expect('{');\n\n        block = parseStatementList();\n\n        expect('}');\n\n        return node.finishBlockStatement(block);\n    }\n\n    // ECMA-262 13.3.2 Variable Statement\n\n    function parseVariableIdentifier(kind) {\n        var token, node = new Node();\n\n        token = lex();\n\n        if (token.type === Token.Keyword && token.value === 'yield') {\n            if (strict) {\n                tolerateUnexpectedToken(token, Messages.StrictReservedWord);\n            } if (!state.allowYield) {\n                throwUnexpectedToken(token);\n            }\n        } else if (token.type !== Token.Identifier) {\n            if (strict && token.type === Token.Keyword && isStrictModeReservedWord(token.value)) {\n                tolerateUnexpectedToken(token, Messages.StrictReservedWord);\n            } else {\n                if (strict || token.value !== 'let' || kind !== 'var') {\n                    throwUnexpectedToken(token);\n                }\n            }\n        } else if (state.sourceType === 'module' && token.type === Token.Identifier && token.value === 'await') {\n            tolerateUnexpectedToken(token);\n        }\n\n        return node.finishIdentifier(token.value);\n    }\n\n    function parseVariableDeclaration(options) {\n        var init = null, id, node = new Node(), params = [];\n\n        id = parsePattern(params, 'var');\n\n        // ECMA-262 12.2.1\n        if (strict && isRestrictedWord(id.name)) {\n            tolerateError(Messages.StrictVarName);\n        }\n\n        if (match('=')) {\n            lex();\n            init = isolateCoverGrammar(parseAssignmentExpression);\n        } else if (id.type !== Syntax.Identifier && !options.inFor) {\n            expect('=');\n        }\n\n        return node.finishVariableDeclarator(id, init);\n    }\n\n    function parseVariableDeclarationList(options) {\n        var opt, list;\n\n        opt = { inFor: options.inFor };\n        list = [parseVariableDeclaration(opt)];\n\n        while (match(',')) {\n            lex();\n            list.push(parseVariableDeclaration(opt));\n        }\n\n        return list;\n    }\n\n    function parseVariableStatement(node) {\n        var declarations;\n\n        expectKeyword('var');\n\n        declarations = parseVariableDeclarationList({ inFor: false });\n\n        consumeSemicolon();\n\n        return node.finishVariableDeclaration(declarations);\n    }\n\n    // ECMA-262 13.3.1 Let and Const Declarations\n\n    function parseLexicalBinding(kind, options) {\n        var init = null, id, node = new Node(), params = [];\n\n        id = parsePattern(params, kind);\n\n        // ECMA-262 12.2.1\n        if (strict && id.type === Syntax.Identifier && isRestrictedWord(id.name)) {\n            tolerateError(Messages.StrictVarName);\n        }\n\n        if (kind === 'const') {\n            if (!matchKeyword('in') && !matchContextualKeyword('of')) {\n                expect('=');\n                init = isolateCoverGrammar(parseAssignmentExpression);\n            }\n        } else if ((!options.inFor && id.type !== Syntax.Identifier) || match('=')) {\n            expect('=');\n            init = isolateCoverGrammar(parseAssignmentExpression);\n        }\n\n        return node.finishVariableDeclarator(id, init);\n    }\n\n    function parseBindingList(kind, options) {\n        var list = [parseLexicalBinding(kind, options)];\n\n        while (match(',')) {\n            lex();\n            list.push(parseLexicalBinding(kind, options));\n        }\n\n        return list;\n    }\n\n\n    function tokenizerState() {\n        return {\n            index: index,\n            lineNumber: lineNumber,\n            lineStart: lineStart,\n            hasLineTerminator: hasLineTerminator,\n            lastIndex: lastIndex,\n            lastLineNumber: lastLineNumber,\n            lastLineStart: lastLineStart,\n            startIndex: startIndex,\n            startLineNumber: startLineNumber,\n            startLineStart: startLineStart,\n            lookahead: lookahead,\n            tokenCount: extra.tokens ? extra.tokens.length : 0\n        };\n    }\n\n    function resetTokenizerState(ts) {\n        index = ts.index;\n        lineNumber = ts.lineNumber;\n        lineStart = ts.lineStart;\n        hasLineTerminator = ts.hasLineTerminator;\n        lastIndex = ts.lastIndex;\n        lastLineNumber = ts.lastLineNumber;\n        lastLineStart = ts.lastLineStart;\n        startIndex = ts.startIndex;\n        startLineNumber = ts.startLineNumber;\n        startLineStart = ts.startLineStart;\n        lookahead = ts.lookahead;\n        if (extra.tokens) {\n            extra.tokens.splice(ts.tokenCount, extra.tokens.length);\n        }\n    }\n\n    function isLexicalDeclaration() {\n        var lexical, ts;\n\n        ts = tokenizerState();\n\n        lex();\n        lexical = (lookahead.type === Token.Identifier) || match('[') || match('{') ||\n            matchKeyword('let') || matchKeyword('yield');\n\n        resetTokenizerState(ts);\n\n        return lexical;\n    }\n\n    function parseLexicalDeclaration(options) {\n        var kind, declarations, node = new Node();\n\n        kind = lex().value;\n        assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const');\n\n        declarations = parseBindingList(kind, options);\n\n        consumeSemicolon();\n\n        return node.finishLexicalDeclaration(declarations, kind);\n    }\n\n    function parseRestElement(params) {\n        var param, node = new Node();\n\n        lex();\n\n        if (match('{')) {\n            throwError(Messages.ObjectPatternAsRestParameter);\n        }\n\n        params.push(lookahead);\n\n        param = parseVariableIdentifier();\n\n        if (match('=')) {\n            throwError(Messages.DefaultRestParameter);\n        }\n\n        if (!match(')')) {\n            throwError(Messages.ParameterAfterRestParameter);\n        }\n\n        return node.finishRestElement(param);\n    }\n\n    // ECMA-262 13.4 Empty Statement\n\n    function parseEmptyStatement(node) {\n        expect(';');\n        return node.finishEmptyStatement();\n    }\n\n    // ECMA-262 12.4 Expression Statement\n\n    function parseExpressionStatement(node) {\n        var expr = parseExpression();\n        consumeSemicolon();\n        return node.finishExpressionStatement(expr);\n    }\n\n    // ECMA-262 13.6 If statement\n\n    function parseIfStatement(node) {\n        var test, consequent, alternate;\n\n        expectKeyword('if');\n\n        expect('(');\n\n        test = parseExpression();\n\n        expect(')');\n\n        consequent = parseStatement();\n\n        if (matchKeyword('else')) {\n            lex();\n            alternate = parseStatement();\n        } else {\n            alternate = null;\n        }\n\n        return node.finishIfStatement(test, consequent, alternate);\n    }\n\n    // ECMA-262 13.7 Iteration Statements\n\n    function parseDoWhileStatement(node) {\n        var body, test, oldInIteration;\n\n        expectKeyword('do');\n\n        oldInIteration = state.inIteration;\n        state.inIteration = true;\n\n        body = parseStatement();\n\n        state.inIteration = oldInIteration;\n\n        expectKeyword('while');\n\n        expect('(');\n\n        test = parseExpression();\n\n        expect(')');\n\n        if (match(';')) {\n            lex();\n        }\n\n        return node.finishDoWhileStatement(body, test);\n    }\n\n    function parseWhileStatement(node) {\n        var test, body, oldInIteration;\n\n        expectKeyword('while');\n\n        expect('(');\n\n        test = parseExpression();\n\n        expect(')');\n\n        oldInIteration = state.inIteration;\n        state.inIteration = true;\n\n        body = parseStatement();\n\n        state.inIteration = oldInIteration;\n\n        return node.finishWhileStatement(test, body);\n    }\n\n    function parseForStatement(node) {\n        var init, forIn, initSeq, initStartToken, test, update, left, right, kind, declarations,\n            body, oldInIteration, previousAllowIn = state.allowIn;\n\n        init = test = update = null;\n        forIn = true;\n\n        expectKeyword('for');\n\n        expect('(');\n\n        if (match(';')) {\n            lex();\n        } else {\n            if (matchKeyword('var')) {\n                init = new Node();\n                lex();\n\n                state.allowIn = false;\n                declarations = parseVariableDeclarationList({ inFor: true });\n                state.allowIn = previousAllowIn;\n\n                if (declarations.length === 1 && matchKeyword('in')) {\n                    init = init.finishVariableDeclaration(declarations);\n                    lex();\n                    left = init;\n                    right = parseExpression();\n                    init = null;\n                } else if (declarations.length === 1 && declarations[0].init === null && matchContextualKeyword('of')) {\n                    init = init.finishVariableDeclaration(declarations);\n                    lex();\n                    left = init;\n                    right = parseAssignmentExpression();\n                    init = null;\n                    forIn = false;\n                } else {\n                    init = init.finishVariableDeclaration(declarations);\n                    expect(';');\n                }\n            } else if (matchKeyword('const') || matchKeyword('let')) {\n                init = new Node();\n                kind = lex().value;\n\n                if (!strict && lookahead.value === 'in') {\n                    init = init.finishIdentifier(kind);\n                    lex();\n                    left = init;\n                    right = parseExpression();\n                    init = null;\n                } else {\n                    state.allowIn = false;\n                    declarations = parseBindingList(kind, { inFor: true });\n                    state.allowIn = previousAllowIn;\n\n                    if (declarations.length === 1 && declarations[0].init === null && matchKeyword('in')) {\n                        init = init.finishLexicalDeclaration(declarations, kind);\n                        lex();\n                        left = init;\n                        right = parseExpression();\n                        init = null;\n                    } else if (declarations.length === 1 && declarations[0].init === null && matchContextualKeyword('of')) {\n                        init = init.finishLexicalDeclaration(declarations, kind);\n                        lex();\n                        left = init;\n                        right = parseAssignmentExpression();\n                        init = null;\n                        forIn = false;\n                    } else {\n                        consumeSemicolon();\n                        init = init.finishLexicalDeclaration(declarations, kind);\n                    }\n                }\n            } else {\n                initStartToken = lookahead;\n                state.allowIn = false;\n                init = inheritCoverGrammar(parseAssignmentExpression);\n                state.allowIn = previousAllowIn;\n\n                if (matchKeyword('in')) {\n                    if (!isAssignmentTarget) {\n                        tolerateError(Messages.InvalidLHSInForIn);\n                    }\n\n                    lex();\n                    reinterpretExpressionAsPattern(init);\n                    left = init;\n                    right = parseExpression();\n                    init = null;\n                } else if (matchContextualKeyword('of')) {\n                    if (!isAssignmentTarget) {\n                        tolerateError(Messages.InvalidLHSInForLoop);\n                    }\n\n                    lex();\n                    reinterpretExpressionAsPattern(init);\n                    left = init;\n                    right = parseAssignmentExpression();\n                    init = null;\n                    forIn = false;\n                } else {\n                    if (match(',')) {\n                        initSeq = [init];\n                        while (match(',')) {\n                            lex();\n                            initSeq.push(isolateCoverGrammar(parseAssignmentExpression));\n                        }\n                        init = new WrappingNode(initStartToken).finishSequenceExpression(initSeq);\n                    }\n                    expect(';');\n                }\n            }\n        }\n\n        if (typeof left === 'undefined') {\n\n            if (!match(';')) {\n                test = parseExpression();\n            }\n            expect(';');\n\n            if (!match(')')) {\n                update = parseExpression();\n            }\n        }\n\n        expect(')');\n\n        oldInIteration = state.inIteration;\n        state.inIteration = true;\n\n        body = isolateCoverGrammar(parseStatement);\n\n        state.inIteration = oldInIteration;\n\n        return (typeof left === 'undefined') ?\n                node.finishForStatement(init, test, update, body) :\n                forIn ? node.finishForInStatement(left, right, body) :\n                    node.finishForOfStatement(left, right, body);\n    }\n\n    // ECMA-262 13.8 The continue statement\n\n    function parseContinueStatement(node) {\n        var label = null, key;\n\n        expectKeyword('continue');\n\n        // Optimize the most common form: 'continue;'.\n        if (source.charCodeAt(startIndex) === 0x3B) {\n            lex();\n\n            if (!state.inIteration) {\n                throwError(Messages.IllegalContinue);\n            }\n\n            return node.finishContinueStatement(null);\n        }\n\n        if (hasLineTerminator) {\n            if (!state.inIteration) {\n                throwError(Messages.IllegalContinue);\n            }\n\n            return node.finishContinueStatement(null);\n        }\n\n        if (lookahead.type === Token.Identifier) {\n            label = parseVariableIdentifier();\n\n            key = '$' + label.name;\n            if (!Object.prototype.hasOwnProperty.call(state.labelSet, key)) {\n                throwError(Messages.UnknownLabel, label.name);\n            }\n        }\n\n        consumeSemicolon();\n\n        if (label === null && !state.inIteration) {\n            throwError(Messages.IllegalContinue);\n        }\n\n        return node.finishContinueStatement(label);\n    }\n\n    // ECMA-262 13.9 The break statement\n\n    function parseBreakStatement(node) {\n        var label = null, key;\n\n        expectKeyword('break');\n\n        // Catch the very common case first: immediately a semicolon (U+003B).\n        if (source.charCodeAt(lastIndex) === 0x3B) {\n            lex();\n\n            if (!(state.inIteration || state.inSwitch)) {\n                throwError(Messages.IllegalBreak);\n            }\n\n            return node.finishBreakStatement(null);\n        }\n\n        if (hasLineTerminator) {\n            if (!(state.inIteration || state.inSwitch)) {\n                throwError(Messages.IllegalBreak);\n            }\n        } else if (lookahead.type === Token.Identifier) {\n            label = parseVariableIdentifier();\n\n            key = '$' + label.name;\n            if (!Object.prototype.hasOwnProperty.call(state.labelSet, key)) {\n                throwError(Messages.UnknownLabel, label.name);\n            }\n        }\n\n        consumeSemicolon();\n\n        if (label === null && !(state.inIteration || state.inSwitch)) {\n            throwError(Messages.IllegalBreak);\n        }\n\n        return node.finishBreakStatement(label);\n    }\n\n    // ECMA-262 13.10 The return statement\n\n    function parseReturnStatement(node) {\n        var argument = null;\n\n        expectKeyword('return');\n\n        if (!state.inFunctionBody) {\n            tolerateError(Messages.IllegalReturn);\n        }\n\n        // 'return' followed by a space and an identifier is very common.\n        if (source.charCodeAt(lastIndex) === 0x20) {\n            if (isIdentifierStart(source.charCodeAt(lastIndex + 1))) {\n                argument = parseExpression();\n                consumeSemicolon();\n                return node.finishReturnStatement(argument);\n            }\n        }\n\n        if (hasLineTerminator) {\n            // HACK\n            return node.finishReturnStatement(null);\n        }\n\n        if (!match(';')) {\n            if (!match('}') && lookahead.type !== Token.EOF) {\n                argument = parseExpression();\n            }\n        }\n\n        consumeSemicolon();\n\n        return node.finishReturnStatement(argument);\n    }\n\n    // ECMA-262 13.11 The with statement\n\n    function parseWithStatement(node) {\n        var object, body;\n\n        if (strict) {\n            tolerateError(Messages.StrictModeWith);\n        }\n\n        expectKeyword('with');\n\n        expect('(');\n\n        object = parseExpression();\n\n        expect(')');\n\n        body = parseStatement();\n\n        return node.finishWithStatement(object, body);\n    }\n\n    // ECMA-262 13.12 The switch statement\n\n    function parseSwitchCase() {\n        var test, consequent = [], statement, node = new Node();\n\n        if (matchKeyword('default')) {\n            lex();\n            test = null;\n        } else {\n            expectKeyword('case');\n            test = parseExpression();\n        }\n        expect(':');\n\n        while (startIndex < length) {\n            if (match('}') || matchKeyword('default') || matchKeyword('case')) {\n                break;\n            }\n            statement = parseStatementListItem();\n            consequent.push(statement);\n        }\n\n        return node.finishSwitchCase(test, consequent);\n    }\n\n    function parseSwitchStatement(node) {\n        var discriminant, cases, clause, oldInSwitch, defaultFound;\n\n        expectKeyword('switch');\n\n        expect('(');\n\n        discriminant = parseExpression();\n\n        expect(')');\n\n        expect('{');\n\n        cases = [];\n\n        if (match('}')) {\n            lex();\n            return node.finishSwitchStatement(discriminant, cases);\n        }\n\n        oldInSwitch = state.inSwitch;\n        state.inSwitch = true;\n        defaultFound = false;\n\n        while (startIndex < length) {\n            if (match('}')) {\n                break;\n            }\n            clause = parseSwitchCase();\n            if (clause.test === null) {\n                if (defaultFound) {\n                    throwError(Messages.MultipleDefaultsInSwitch);\n                }\n                defaultFound = true;\n            }\n            cases.push(clause);\n        }\n\n        state.inSwitch = oldInSwitch;\n\n        expect('}');\n\n        return node.finishSwitchStatement(discriminant, cases);\n    }\n\n    // ECMA-262 13.14 The throw statement\n\n    function parseThrowStatement(node) {\n        var argument;\n\n        expectKeyword('throw');\n\n        if (hasLineTerminator) {\n            throwError(Messages.NewlineAfterThrow);\n        }\n\n        argument = parseExpression();\n\n        consumeSemicolon();\n\n        return node.finishThrowStatement(argument);\n    }\n\n    // ECMA-262 13.15 The try statement\n\n    function parseCatchClause() {\n        var param, params = [], paramMap = {}, key, i, body, node = new Node();\n\n        expectKeyword('catch');\n\n        expect('(');\n        if (match(')')) {\n            throwUnexpectedToken(lookahead);\n        }\n\n        param = parsePattern(params);\n        for (i = 0; i < params.length; i++) {\n            key = '$' + params[i].value;\n            if (Object.prototype.hasOwnProperty.call(paramMap, key)) {\n                tolerateError(Messages.DuplicateBinding, params[i].value);\n            }\n            paramMap[key] = true;\n        }\n\n        // ECMA-262 12.14.1\n        if (strict && isRestrictedWord(param.name)) {\n            tolerateError(Messages.StrictCatchVariable);\n        }\n\n        expect(')');\n        body = parseBlock();\n        return node.finishCatchClause(param, body);\n    }\n\n    function parseTryStatement(node) {\n        var block, handler = null, finalizer = null;\n\n        expectKeyword('try');\n\n        block = parseBlock();\n\n        if (matchKeyword('catch')) {\n            handler = parseCatchClause();\n        }\n\n        if (matchKeyword('finally')) {\n            lex();\n            finalizer = parseBlock();\n        }\n\n        if (!handler && !finalizer) {\n            throwError(Messages.NoCatchOrFinally);\n        }\n\n        return node.finishTryStatement(block, handler, finalizer);\n    }\n\n    // ECMA-262 13.16 The debugger statement\n\n    function parseDebuggerStatement(node) {\n        expectKeyword('debugger');\n\n        consumeSemicolon();\n\n        return node.finishDebuggerStatement();\n    }\n\n    // 13 Statements\n\n    function parseStatement() {\n        var type = lookahead.type,\n            expr,\n            labeledBody,\n            key,\n            node;\n\n        if (type === Token.EOF) {\n            throwUnexpectedToken(lookahead);\n        }\n\n        if (type === Token.Punctuator && lookahead.value === '{') {\n            return parseBlock();\n        }\n        isAssignmentTarget = isBindingElement = true;\n        node = new Node();\n\n        if (type === Token.Punctuator) {\n            switch (lookahead.value) {\n                case ';':\n                    return parseEmptyStatement(node);\n                case '(':\n                    return parseExpressionStatement(node);\n                default:\n                    break;\n            }\n        } else if (type === Token.Keyword) {\n            switch (lookahead.value) {\n                case 'break':\n                    return parseBreakStatement(node);\n                case 'continue':\n                    return parseContinueStatement(node);\n                case 'debugger':\n                    return parseDebuggerStatement(node);\n                case 'do':\n                    return parseDoWhileStatement(node);\n                case 'for':\n                    return parseForStatement(node);\n                case 'function':\n                    return parseFunctionDeclaration(node);\n                case 'if':\n                    return parseIfStatement(node);\n                case 'return':\n                    return parseReturnStatement(node);\n                case 'switch':\n                    return parseSwitchStatement(node);\n                case 'throw':\n                    return parseThrowStatement(node);\n                case 'try':\n                    return parseTryStatement(node);\n                case 'var':\n                    return parseVariableStatement(node);\n                case 'while':\n                    return parseWhileStatement(node);\n                case 'with':\n                    return parseWithStatement(node);\n                default:\n                    break;\n            }\n        }\n\n        expr = parseExpression();\n\n        // ECMA-262 12.12 Labelled Statements\n        if ((expr.type === Syntax.Identifier) && match(':')) {\n            lex();\n\n            key = '$' + expr.name;\n            if (Object.prototype.hasOwnProperty.call(state.labelSet, key)) {\n                throwError(Messages.Redeclaration, 'Label', expr.name);\n            }\n\n            state.labelSet[key] = true;\n            labeledBody = parseStatement();\n            delete state.labelSet[key];\n            return node.finishLabeledStatement(expr, labeledBody);\n        }\n\n        consumeSemicolon();\n\n        return node.finishExpressionStatement(expr);\n    }\n\n    // ECMA-262 14.1 Function Definition\n\n    function parseFunctionSourceElements() {\n        var statement, body = [], token, directive, firstRestricted,\n            oldLabelSet, oldInIteration, oldInSwitch, oldInFunctionBody,\n            node = new Node();\n\n        expect('{');\n\n        while (startIndex < length) {\n            if (lookahead.type !== Token.StringLiteral) {\n                break;\n            }\n            token = lookahead;\n\n            statement = parseStatementListItem();\n            body.push(statement);\n            if (statement.expression.type !== Syntax.Literal) {\n                // this is not directive\n                break;\n            }\n            directive = source.slice(token.start + 1, token.end - 1);\n            if (directive === 'use strict') {\n                strict = true;\n                if (firstRestricted) {\n                    tolerateUnexpectedToken(firstRestricted, Messages.StrictOctalLiteral);\n                }\n            } else {\n                if (!firstRestricted && token.octal) {\n                    firstRestricted = token;\n                }\n            }\n        }\n\n        oldLabelSet = state.labelSet;\n        oldInIteration = state.inIteration;\n        oldInSwitch = state.inSwitch;\n        oldInFunctionBody = state.inFunctionBody;\n\n        state.labelSet = {};\n        state.inIteration = false;\n        state.inSwitch = false;\n        state.inFunctionBody = true;\n\n        while (startIndex < length) {\n            if (match('}')) {\n                break;\n            }\n            body.push(parseStatementListItem());\n        }\n\n        expect('}');\n\n        state.labelSet = oldLabelSet;\n        state.inIteration = oldInIteration;\n        state.inSwitch = oldInSwitch;\n        state.inFunctionBody = oldInFunctionBody;\n\n        return node.finishBlockStatement(body);\n    }\n\n    function validateParam(options, param, name) {\n        var key = '$' + name;\n        if (strict) {\n            if (isRestrictedWord(name)) {\n                options.stricted = param;\n                options.message = Messages.StrictParamName;\n            }\n            if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {\n                options.stricted = param;\n                options.message = Messages.StrictParamDupe;\n            }\n        } else if (!options.firstRestricted) {\n            if (isRestrictedWord(name)) {\n                options.firstRestricted = param;\n                options.message = Messages.StrictParamName;\n            } else if (isStrictModeReservedWord(name)) {\n                options.firstRestricted = param;\n                options.message = Messages.StrictReservedWord;\n            } else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {\n                options.stricted = param;\n                options.message = Messages.StrictParamDupe;\n            }\n        }\n        options.paramSet[key] = true;\n    }\n\n    function parseParam(options) {\n        var token, param, params = [], i, def;\n\n        token = lookahead;\n        if (token.value === '...') {\n            param = parseRestElement(params);\n            validateParam(options, param.argument, param.argument.name);\n            options.params.push(param);\n            options.defaults.push(null);\n            return false;\n        }\n\n        param = parsePatternWithDefault(params);\n        for (i = 0; i < params.length; i++) {\n            validateParam(options, params[i], params[i].value);\n        }\n\n        if (param.type === Syntax.AssignmentPattern) {\n            def = param.right;\n            param = param.left;\n            ++options.defaultCount;\n        }\n\n        options.params.push(param);\n        options.defaults.push(def);\n\n        return !match(')');\n    }\n\n    function parseParams(firstRestricted) {\n        var options;\n\n        options = {\n            params: [],\n            defaultCount: 0,\n            defaults: [],\n            firstRestricted: firstRestricted\n        };\n\n        expect('(');\n\n        if (!match(')')) {\n            options.paramSet = {};\n            while (startIndex < length) {\n                if (!parseParam(options)) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        if (options.defaultCount === 0) {\n            options.defaults = [];\n        }\n\n        return {\n            params: options.params,\n            defaults: options.defaults,\n            stricted: options.stricted,\n            firstRestricted: options.firstRestricted,\n            message: options.message\n        };\n    }\n\n    function parseFunctionDeclaration(node, identifierIsOptional) {\n        var id = null, params = [], defaults = [], body, token, stricted, tmp, firstRestricted, message, previousStrict,\n            isGenerator, previousAllowYield;\n\n        previousAllowYield = state.allowYield;\n\n        expectKeyword('function');\n\n        isGenerator = match('*');\n        if (isGenerator) {\n            lex();\n        }\n\n        if (!identifierIsOptional || !match('(')) {\n            token = lookahead;\n            id = parseVariableIdentifier();\n            if (strict) {\n                if (isRestrictedWord(token.value)) {\n                    tolerateUnexpectedToken(token, Messages.StrictFunctionName);\n                }\n            } else {\n                if (isRestrictedWord(token.value)) {\n                    firstRestricted = token;\n                    message = Messages.StrictFunctionName;\n                } else if (isStrictModeReservedWord(token.value)) {\n                    firstRestricted = token;\n                    message = Messages.StrictReservedWord;\n                }\n            }\n        }\n\n        state.allowYield = !isGenerator;\n        tmp = parseParams(firstRestricted);\n        params = tmp.params;\n        defaults = tmp.defaults;\n        stricted = tmp.stricted;\n        firstRestricted = tmp.firstRestricted;\n        if (tmp.message) {\n            message = tmp.message;\n        }\n\n\n        previousStrict = strict;\n        body = parseFunctionSourceElements();\n        if (strict && firstRestricted) {\n            throwUnexpectedToken(firstRestricted, message);\n        }\n        if (strict && stricted) {\n            tolerateUnexpectedToken(stricted, message);\n        }\n\n        strict = previousStrict;\n        state.allowYield = previousAllowYield;\n\n        return node.finishFunctionDeclaration(id, params, defaults, body, isGenerator);\n    }\n\n    function parseFunctionExpression() {\n        var token, id = null, stricted, firstRestricted, message, tmp,\n            params = [], defaults = [], body, previousStrict, node = new Node(),\n            isGenerator, previousAllowYield;\n\n        previousAllowYield = state.allowYield;\n\n        expectKeyword('function');\n\n        isGenerator = match('*');\n        if (isGenerator) {\n            lex();\n        }\n\n        state.allowYield = !isGenerator;\n        if (!match('(')) {\n            token = lookahead;\n            id = (!strict && !isGenerator && matchKeyword('yield')) ? parseNonComputedProperty() : parseVariableIdentifier();\n            if (strict) {\n                if (isRestrictedWord(token.value)) {\n                    tolerateUnexpectedToken(token, Messages.StrictFunctionName);\n                }\n            } else {\n                if (isRestrictedWord(token.value)) {\n                    firstRestricted = token;\n                    message = Messages.StrictFunctionName;\n                } else if (isStrictModeReservedWord(token.value)) {\n                    firstRestricted = token;\n                    message = Messages.StrictReservedWord;\n                }\n            }\n        }\n\n        tmp = parseParams(firstRestricted);\n        params = tmp.params;\n        defaults = tmp.defaults;\n        stricted = tmp.stricted;\n        firstRestricted = tmp.firstRestricted;\n        if (tmp.message) {\n            message = tmp.message;\n        }\n\n        previousStrict = strict;\n        body = parseFunctionSourceElements();\n        if (strict && firstRestricted) {\n            throwUnexpectedToken(firstRestricted, message);\n        }\n        if (strict && stricted) {\n            tolerateUnexpectedToken(stricted, message);\n        }\n        strict = previousStrict;\n        state.allowYield = previousAllowYield;\n\n        return node.finishFunctionExpression(id, params, defaults, body, isGenerator);\n    }\n\n    // ECMA-262 14.5 Class Definitions\n\n    function parseClassBody() {\n        var classBody, token, isStatic, hasConstructor = false, body, method, computed, key;\n\n        classBody = new Node();\n\n        expect('{');\n        body = [];\n        while (!match('}')) {\n            if (match(';')) {\n                lex();\n            } else {\n                method = new Node();\n                token = lookahead;\n                isStatic = false;\n                computed = match('[');\n                if (match('*')) {\n                    lex();\n                } else {\n                    key = parseObjectPropertyKey();\n                    if (key.name === 'static' && (lookaheadPropertyName() || match('*'))) {\n                        token = lookahead;\n                        isStatic = true;\n                        computed = match('[');\n                        if (match('*')) {\n                            lex();\n                        } else {\n                            key = parseObjectPropertyKey();\n                        }\n                    }\n                }\n                method = tryParseMethodDefinition(token, key, computed, method);\n                if (method) {\n                    method['static'] = isStatic; // jscs:ignore requireDotNotation\n                    if (method.kind === 'init') {\n                        method.kind = 'method';\n                    }\n                    if (!isStatic) {\n                        if (!method.computed && (method.key.name || method.key.value.toString()) === 'constructor') {\n                            if (method.kind !== 'method' || !method.method || method.value.generator) {\n                                throwUnexpectedToken(token, Messages.ConstructorSpecialMethod);\n                            }\n                            if (hasConstructor) {\n                                throwUnexpectedToken(token, Messages.DuplicateConstructor);\n                            } else {\n                                hasConstructor = true;\n                            }\n                            method.kind = 'constructor';\n                        }\n                    } else {\n                        if (!method.computed && (method.key.name || method.key.value.toString()) === 'prototype') {\n                            throwUnexpectedToken(token, Messages.StaticPrototype);\n                        }\n                    }\n                    method.type = Syntax.MethodDefinition;\n                    delete method.method;\n                    delete method.shorthand;\n                    body.push(method);\n                } else {\n                    throwUnexpectedToken(lookahead);\n                }\n            }\n        }\n        lex();\n        return classBody.finishClassBody(body);\n    }\n\n    function parseClassDeclaration(identifierIsOptional) {\n        var id = null, superClass = null, classNode = new Node(), classBody, previousStrict = strict;\n        strict = true;\n\n        expectKeyword('class');\n\n        if (!identifierIsOptional || lookahead.type === Token.Identifier) {\n            id = parseVariableIdentifier();\n        }\n\n        if (matchKeyword('extends')) {\n            lex();\n            superClass = isolateCoverGrammar(parseLeftHandSideExpressionAllowCall);\n        }\n        classBody = parseClassBody();\n        strict = previousStrict;\n\n        return classNode.finishClassDeclaration(id, superClass, classBody);\n    }\n\n    function parseClassExpression() {\n        var id = null, superClass = null, classNode = new Node(), classBody, previousStrict = strict;\n        strict = true;\n\n        expectKeyword('class');\n\n        if (lookahead.type === Token.Identifier) {\n            id = parseVariableIdentifier();\n        }\n\n        if (matchKeyword('extends')) {\n            lex();\n            superClass = isolateCoverGrammar(parseLeftHandSideExpressionAllowCall);\n        }\n        classBody = parseClassBody();\n        strict = previousStrict;\n\n        return classNode.finishClassExpression(id, superClass, classBody);\n    }\n\n    // ECMA-262 15.2 Modules\n\n    function parseModuleSpecifier() {\n        var node = new Node();\n\n        if (lookahead.type !== Token.StringLiteral) {\n            throwError(Messages.InvalidModuleSpecifier);\n        }\n        return node.finishLiteral(lex());\n    }\n\n    // ECMA-262 15.2.3 Exports\n\n    function parseExportSpecifier() {\n        var exported, local, node = new Node(), def;\n        if (matchKeyword('default')) {\n            // export {default} from 'something';\n            def = new Node();\n            lex();\n            local = def.finishIdentifier('default');\n        } else {\n            local = parseVariableIdentifier();\n        }\n        if (matchContextualKeyword('as')) {\n            lex();\n            exported = parseNonComputedProperty();\n        }\n        return node.finishExportSpecifier(local, exported);\n    }\n\n    function parseExportNamedDeclaration(node) {\n        var declaration = null,\n            isExportFromIdentifier,\n            src = null, specifiers = [];\n\n        // non-default export\n        if (lookahead.type === Token.Keyword) {\n            // covers:\n            // export var f = 1;\n            switch (lookahead.value) {\n                case 'let':\n                case 'const':\n                    declaration = parseLexicalDeclaration({ inFor: false });\n                    return node.finishExportNamedDeclaration(declaration, specifiers, null);\n                case 'var':\n                case 'class':\n                case 'function':\n                    declaration = parseStatementListItem();\n                    return node.finishExportNamedDeclaration(declaration, specifiers, null);\n            }\n        }\n\n        expect('{');\n        while (!match('}')) {\n            isExportFromIdentifier = isExportFromIdentifier || matchKeyword('default');\n            specifiers.push(parseExportSpecifier());\n            if (!match('}')) {\n                expect(',');\n                if (match('}')) {\n                    break;\n                }\n            }\n        }\n        expect('}');\n\n        if (matchContextualKeyword('from')) {\n            // covering:\n            // export {default} from 'foo';\n            // export {foo} from 'foo';\n            lex();\n            src = parseModuleSpecifier();\n            consumeSemicolon();\n        } else if (isExportFromIdentifier) {\n            // covering:\n            // export {default}; // missing fromClause\n            throwError(lookahead.value ?\n                    Messages.UnexpectedToken : Messages.MissingFromClause, lookahead.value);\n        } else {\n            // cover\n            // export {foo};\n            consumeSemicolon();\n        }\n        return node.finishExportNamedDeclaration(declaration, specifiers, src);\n    }\n\n    function parseExportDefaultDeclaration(node) {\n        var declaration = null,\n            expression = null;\n\n        // covers:\n        // export default ...\n        expectKeyword('default');\n\n        if (matchKeyword('function')) {\n            // covers:\n            // export default function foo () {}\n            // export default function () {}\n            declaration = parseFunctionDeclaration(new Node(), true);\n            return node.finishExportDefaultDeclaration(declaration);\n        }\n        if (matchKeyword('class')) {\n            declaration = parseClassDeclaration(true);\n            return node.finishExportDefaultDeclaration(declaration);\n        }\n\n        if (matchContextualKeyword('from')) {\n            throwError(Messages.UnexpectedToken, lookahead.value);\n        }\n\n        // covers:\n        // export default {};\n        // export default [];\n        // export default (1 + 2);\n        if (match('{')) {\n            expression = parseObjectInitializer();\n        } else if (match('[')) {\n            expression = parseArrayInitializer();\n        } else {\n            expression = parseAssignmentExpression();\n        }\n        consumeSemicolon();\n        return node.finishExportDefaultDeclaration(expression);\n    }\n\n    function parseExportAllDeclaration(node) {\n        var src;\n\n        // covers:\n        // export * from 'foo';\n        expect('*');\n        if (!matchContextualKeyword('from')) {\n            throwError(lookahead.value ?\n                    Messages.UnexpectedToken : Messages.MissingFromClause, lookahead.value);\n        }\n        lex();\n        src = parseModuleSpecifier();\n        consumeSemicolon();\n\n        return node.finishExportAllDeclaration(src);\n    }\n\n    function parseExportDeclaration() {\n        var node = new Node();\n        if (state.inFunctionBody) {\n            throwError(Messages.IllegalExportDeclaration);\n        }\n\n        expectKeyword('export');\n\n        if (matchKeyword('default')) {\n            return parseExportDefaultDeclaration(node);\n        }\n        if (match('*')) {\n            return parseExportAllDeclaration(node);\n        }\n        return parseExportNamedDeclaration(node);\n    }\n\n    // ECMA-262 15.2.2 Imports\n\n    function parseImportSpecifier() {\n        // import {<foo as bar>} ...;\n        var local, imported, node = new Node();\n\n        imported = parseNonComputedProperty();\n        if (matchContextualKeyword('as')) {\n            lex();\n            local = parseVariableIdentifier();\n        }\n\n        return node.finishImportSpecifier(local, imported);\n    }\n\n    function parseNamedImports() {\n        var specifiers = [];\n        // {foo, bar as bas}\n        expect('{');\n        while (!match('}')) {\n            specifiers.push(parseImportSpecifier());\n            if (!match('}')) {\n                expect(',');\n                if (match('}')) {\n                    break;\n                }\n            }\n        }\n        expect('}');\n        return specifiers;\n    }\n\n    function parseImportDefaultSpecifier() {\n        // import <foo> ...;\n        var local, node = new Node();\n\n        local = parseNonComputedProperty();\n\n        return node.finishImportDefaultSpecifier(local);\n    }\n\n    function parseImportNamespaceSpecifier() {\n        // import <* as foo> ...;\n        var local, node = new Node();\n\n        expect('*');\n        if (!matchContextualKeyword('as')) {\n            throwError(Messages.NoAsAfterImportNamespace);\n        }\n        lex();\n        local = parseNonComputedProperty();\n\n        return node.finishImportNamespaceSpecifier(local);\n    }\n\n    function parseImportDeclaration() {\n        var specifiers = [], src, node = new Node();\n\n        if (state.inFunctionBody) {\n            throwError(Messages.IllegalImportDeclaration);\n        }\n\n        expectKeyword('import');\n\n        if (lookahead.type === Token.StringLiteral) {\n            // import 'foo';\n            src = parseModuleSpecifier();\n        } else {\n\n            if (match('{')) {\n                // import {bar}\n                specifiers = specifiers.concat(parseNamedImports());\n            } else if (match('*')) {\n                // import * as foo\n                specifiers.push(parseImportNamespaceSpecifier());\n            } else if (isIdentifierName(lookahead) && !matchKeyword('default')) {\n                // import foo\n                specifiers.push(parseImportDefaultSpecifier());\n                if (match(',')) {\n                    lex();\n                    if (match('*')) {\n                        // import foo, * as foo\n                        specifiers.push(parseImportNamespaceSpecifier());\n                    } else if (match('{')) {\n                        // import foo, {bar}\n                        specifiers = specifiers.concat(parseNamedImports());\n                    } else {\n                        throwUnexpectedToken(lookahead);\n                    }\n                }\n            } else {\n                throwUnexpectedToken(lex());\n            }\n\n            if (!matchContextualKeyword('from')) {\n                throwError(lookahead.value ?\n                        Messages.UnexpectedToken : Messages.MissingFromClause, lookahead.value);\n            }\n            lex();\n            src = parseModuleSpecifier();\n        }\n\n        consumeSemicolon();\n        return node.finishImportDeclaration(specifiers, src);\n    }\n\n    // ECMA-262 15.1 Scripts\n\n    function parseScriptBody() {\n        var statement, body = [], token, directive, firstRestricted;\n\n        while (startIndex < length) {\n            token = lookahead;\n            if (token.type !== Token.StringLiteral) {\n                break;\n            }\n\n            statement = parseStatementListItem();\n            body.push(statement);\n            if (statement.expression.type !== Syntax.Literal) {\n                // this is not directive\n                break;\n            }\n            directive = source.slice(token.start + 1, token.end - 1);\n            if (directive === 'use strict') {\n                strict = true;\n                if (firstRestricted) {\n                    tolerateUnexpectedToken(firstRestricted, Messages.StrictOctalLiteral);\n                }\n            } else {\n                if (!firstRestricted && token.octal) {\n                    firstRestricted = token;\n                }\n            }\n        }\n\n        while (startIndex < length) {\n            statement = parseStatementListItem();\n            /* istanbul ignore if */\n            if (typeof statement === 'undefined') {\n                break;\n            }\n            body.push(statement);\n        }\n        return body;\n    }\n\n    function parseProgram() {\n        var body, node;\n\n        peek();\n        node = new Node();\n\n        body = parseScriptBody();\n        return node.finishProgram(body, state.sourceType);\n    }\n\n    function filterTokenLocation() {\n        var i, entry, token, tokens = [];\n\n        for (i = 0; i < extra.tokens.length; ++i) {\n            entry = extra.tokens[i];\n            token = {\n                type: entry.type,\n                value: entry.value\n            };\n            if (entry.regex) {\n                token.regex = {\n                    pattern: entry.regex.pattern,\n                    flags: entry.regex.flags\n                };\n            }\n            if (extra.range) {\n                token.range = entry.range;\n            }\n            if (extra.loc) {\n                token.loc = entry.loc;\n            }\n            tokens.push(token);\n        }\n\n        extra.tokens = tokens;\n    }\n\n    function tokenize(code, options, delegate) {\n        var toString,\n            tokens;\n\n        toString = String;\n        if (typeof code !== 'string' && !(code instanceof String)) {\n            code = toString(code);\n        }\n\n        source = code;\n        index = 0;\n        lineNumber = (source.length > 0) ? 1 : 0;\n        lineStart = 0;\n        startIndex = index;\n        startLineNumber = lineNumber;\n        startLineStart = lineStart;\n        length = source.length;\n        lookahead = null;\n        state = {\n            allowIn: true,\n            allowYield: true,\n            labelSet: {},\n            inFunctionBody: false,\n            inIteration: false,\n            inSwitch: false,\n            lastCommentStart: -1,\n            curlyStack: []\n        };\n\n        extra = {};\n\n        // Options matching.\n        options = options || {};\n\n        // Of course we collect tokens here.\n        options.tokens = true;\n        extra.tokens = [];\n        extra.tokenValues = [];\n        extra.tokenize = true;\n        extra.delegate = delegate;\n\n        // The following two fields are necessary to compute the Regex tokens.\n        extra.openParenToken = -1;\n        extra.openCurlyToken = -1;\n\n        extra.range = (typeof options.range === 'boolean') && options.range;\n        extra.loc = (typeof options.loc === 'boolean') && options.loc;\n\n        if (typeof options.comment === 'boolean' && options.comment) {\n            extra.comments = [];\n        }\n        if (typeof options.tolerant === 'boolean' && options.tolerant) {\n            extra.errors = [];\n        }\n\n        try {\n            peek();\n            if (lookahead.type === Token.EOF) {\n                return extra.tokens;\n            }\n\n            lex();\n            while (lookahead.type !== Token.EOF) {\n                try {\n                    lex();\n                } catch (lexError) {\n                    if (extra.errors) {\n                        recordError(lexError);\n                        // We have to break on the first error\n                        // to avoid infinite loops.\n                        break;\n                    } else {\n                        throw lexError;\n                    }\n                }\n            }\n\n            tokens = extra.tokens;\n            if (typeof extra.errors !== 'undefined') {\n                tokens.errors = extra.errors;\n            }\n        } catch (e) {\n            throw e;\n        } finally {\n            extra = {};\n        }\n        return tokens;\n    }\n\n    function parse(code, options) {\n        var program, toString;\n\n        toString = String;\n        if (typeof code !== 'string' && !(code instanceof String)) {\n            code = toString(code);\n        }\n\n        source = code;\n        index = 0;\n        lineNumber = (source.length > 0) ? 1 : 0;\n        lineStart = 0;\n        startIndex = index;\n        startLineNumber = lineNumber;\n        startLineStart = lineStart;\n        length = source.length;\n        lookahead = null;\n        state = {\n            allowIn: true,\n            allowYield: true,\n            labelSet: {},\n            inFunctionBody: false,\n            inIteration: false,\n            inSwitch: false,\n            lastCommentStart: -1,\n            curlyStack: [],\n            sourceType: 'script'\n        };\n        strict = false;\n\n        extra = {};\n        if (typeof options !== 'undefined') {\n            extra.range = (typeof options.range === 'boolean') && options.range;\n            extra.loc = (typeof options.loc === 'boolean') && options.loc;\n            extra.attachComment = (typeof options.attachComment === 'boolean') && options.attachComment;\n\n            if (extra.loc && options.source !== null && options.source !== undefined) {\n                extra.source = toString(options.source);\n            }\n\n            if (typeof options.tokens === 'boolean' && options.tokens) {\n                extra.tokens = [];\n            }\n            if (typeof options.comment === 'boolean' && options.comment) {\n                extra.comments = [];\n            }\n            if (typeof options.tolerant === 'boolean' && options.tolerant) {\n                extra.errors = [];\n            }\n            if (extra.attachComment) {\n                extra.range = true;\n                extra.comments = [];\n                extra.bottomRightStack = [];\n                extra.trailingComments = [];\n                extra.leadingComments = [];\n            }\n            if (options.sourceType === 'module') {\n                // very restrictive condition for now\n                state.sourceType = options.sourceType;\n                strict = true;\n            }\n        }\n\n        try {\n            program = parseProgram();\n            if (typeof extra.comments !== 'undefined') {\n                program.comments = extra.comments;\n            }\n            if (typeof extra.tokens !== 'undefined') {\n                filterTokenLocation();\n                program.tokens = extra.tokens;\n            }\n            if (typeof extra.errors !== 'undefined') {\n                program.errors = extra.errors;\n            }\n        } catch (e) {\n            throw e;\n        } finally {\n            extra = {};\n        }\n\n        return program;\n    }\n\n    // Sync with *.json manifests.\n    exports.version = '2.7.3';\n\n    exports.tokenize = tokenize;\n\n    exports.parse = parse;\n\n    // Deep copy.\n    /* istanbul ignore next */\n    exports.Syntax = (function () {\n        var name, types = {};\n\n        if (typeof Object.create === 'function') {\n            types = Object.create(null);\n        }\n\n        for (name in Syntax) {\n            if (Syntax.hasOwnProperty(name)) {\n                types[name] = Syntax[name];\n            }\n        }\n\n        if (typeof Object.freeze === 'function') {\n            Object.freeze(types);\n        }\n\n        return types;\n    }());\n\n}));\n/* vim: set sw=4 ts=4 et tw=80 : */"
  },
  {
    "path": "src/robomongo/gui/resources/scripts/uuidhelpers.js",
    "content": "// Javascript helper functions for parsing and displaying UUIDs in the MongoDB shell.\n// This is a temporary solution until SERVER-3153 is implemented.\n// To create BinData values corresponding to the various driver encodings use:\n//      var s = \"{00112233-4455-6677-8899-aabbccddeeff}\";\n//      var uuid = UUID(s); // new Standard encoding\n//      var juuid = JUUID(s); // JavaLegacy encoding\n//      var nuuid = NUUID(s); // CSharpLegacy encoding\n//      var pyuuid = PYUUID(s); // PythonLegacy encoding\n\nfunction HexToBase64(hex) {\n    var base64Digits = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    var base64 = \"\";\n    var group;\n    for (var i = 0; i < 30; i += 6) {\n        group = parseInt(hex.substr(i, 6), 16);\n        base64 += base64Digits[(group >> 18) & 0x3f];\n        base64 += base64Digits[(group >> 12) & 0x3f];\n        base64 += base64Digits[(group >> 6) & 0x3f];\n        base64 += base64Digits[group & 0x3f];\n    }\n    group = parseInt(hex.substr(30, 2), 16);\n    base64 += base64Digits[(group >> 2) & 0x3f];\n    base64 += base64Digits[(group << 4) & 0x3f];\n    base64 += \"==\";\n    return base64;\n}\n\nfunction Base64ToHex(base64) {\n    var base64Digits = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n    var hexDigits = \"0123456789abcdef\";\n    var hex = \"\";\n    for (var i = 0; i < 24; ) {\n        var e1 = base64Digits.indexOf(base64[i++]);\n        var e2 = base64Digits.indexOf(base64[i++]);\n        var e3 = base64Digits.indexOf(base64[i++]);\n        var e4 = base64Digits.indexOf(base64[i++]);\n        var c1 = (e1 << 2) | (e2 >> 4);\n        var c2 = ((e2 & 15) << 4) | (e3 >> 2);\n        var c3 = ((e3 & 3) << 6) | e4;\n        hex += hexDigits[c1 >> 4];\n        hex += hexDigits[c1 & 15];\n        if (e3 != 64) {\n            hex += hexDigits[c2 >> 4];\n            hex += hexDigits[c2 & 15];\n        }\n        if (e4 != 64) {\n            hex += hexDigits[c3 >> 4];\n            hex += hexDigits[c3 & 15];\n        }\n    }\n    return hex;\n}\n\n// Legacy UUID in unspecified encoding\nfunction LUUID(uuid) {\n    var hex = uuid.replace(/[{}-]/g, \"\"); // remove extra characters\n    var base64 = HexToBase64(hex);\n    return new BinData(3, base64);\n}\n\nfunction JUUID(uuid) {\n    var hex = uuid.replace(/[{}-]/g, \"\"); // remove extra characters\n    var msb = hex.substr(0, 16);\n    var lsb = hex.substr(16, 16);\n    msb = msb.substr(14, 2) + msb.substr(12, 2) + msb.substr(10, 2) + msb.substr(8, 2) + msb.substr(6, 2) + msb.substr(4, 2) + msb.substr(2, 2) + msb.substr(0, 2);\n    lsb = lsb.substr(14, 2) + lsb.substr(12, 2) + lsb.substr(10, 2) + lsb.substr(8, 2) + lsb.substr(6, 2) + lsb.substr(4, 2) + lsb.substr(2, 2) + lsb.substr(0, 2);\n    hex = msb + lsb;\n    var base64 = HexToBase64(hex);\n    return new BinData(3, base64);\n}\n\nfunction NUUID(uuid) {\n    var hex = uuid.replace(/[{}-]/g, \"\"); // remove extra characters\n    var a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2);\n    var b = hex.substr(10, 2) + hex.substr(8, 2);\n    var c = hex.substr(14, 2) + hex.substr(12, 2);\n    var d = hex.substr(16, 16);\n    hex = a + b + c + d;\n    var base64 = HexToBase64(hex);\n    return new BinData(3, base64);\n}\n\nfunction PYUUID(uuid) {\n    var hex = uuid.replace(/[{}-]/g, \"\"); // remove extra characters\n    var base64 = HexToBase64(hex);\n    return new BinData(3, base64);\n}\n"
  },
  {
    "path": "src/robomongo/gui/utils/ComboBoxUtils.cpp",
    "content": "#include \"robomongo/gui/utils/ComboBoxUtils.h\"\n\nnamespace Robomongo\n{\n    namespace utils\n    {\n        /**\n         * @brief This function behaves identically to Qt5 QComboBox::setCurrentText().\n         * We are using this function in order to support Qt4\n         */\n        void setCurrentText(QComboBox *comboBox, const QString &text)\n        {\n            if (comboBox->isEditable()) {\n                comboBox->setEditText(text);\n            } else {\n                const int i = comboBox->findText(text);\n                if (i > -1)\n                    comboBox->setCurrentIndex(i);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/utils/ComboBoxUtils.h",
    "content": "#pragma once\n\n#include <QComboBox>\n\nnamespace Robomongo\n{\n    namespace utils\n    {\n        /**\n         * @brief This function behaves identically to Qt5 QComboBox::setCurrentText().\n         * We are using this function in order to support Qt4\n         */\n        void setCurrentText(QComboBox *comboBox, const QString &text);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/utils/DialogUtils.cpp",
    "content": "#include \"robomongo/gui/utils/DialogUtils.h\"\n\nnamespace Robomongo\n{\n    namespace utils\n    {\n        namespace\n        {\n            const QString titleTemaple = QString(\"%1 %2\");\n            const QString textTemaple = QString(\"%1 <b>%3</b> %2?\");\n        }\n\n        int questionDialog(QWidget *parent, const QString &actionText, const QString &itemText, const QString& valueText)\n        {\n            return questionDialog(parent, actionText, itemText, textTemaple, valueText);\n        }\n\n        int questionDialog(QWidget *parent, const QString &actionText, const QString &itemText, const QString &templateText, const QString &valueText)\n        {\n            return QMessageBox::question(parent, titleTemaple.arg(actionText).arg(itemText), templateText.arg(actionText).arg(itemText.toLower()).arg(valueText), QMessageBox::Yes, QMessageBox::No, QMessageBox::NoButton);\n        }\n    }\n}"
  },
  {
    "path": "src/robomongo/gui/utils/DialogUtils.h",
    "content": "#pragma once\n\n#include <QMessageBox>\n\nnamespace Robomongo\n{\n    namespace utils\n    {\n        int questionDialog(QWidget *parent, const QString &actionText, const QString &itemText, const QString &valueText);\n\n        int questionDialog(QWidget *parent, const QString &actionText, const QString &itemText, const QString &templateText, const QString &valueText);\n    }\n}\n\n"
  },
  {
    "path": "src/robomongo/gui/utils/GuiConstants.h",
    "content": "#pragma once\n\nnamespace Robomongo\n{\n    namespace HighDpiConstants\n    {\n        int const WIN_HIGH_DPI_BUTTON_HEIGHT = 23;\n        int const MACOS_HIGH_DPI_BUTTON_HEIGHT = 34;\n    }\n\n    enum AuthMechanism {\n        SCRAM_SHA_1,\n        SCRAM_SHA_256,\n        MONGODB_CR\n    };\n\n    inline AuthMechanism authMechanismFromStr(std::string_view str) {\n        if      (str == \"SCRAM-SHA-1\")   return SCRAM_SHA_1;\n        else if (str == \"SCRAM-SHA-256\") return SCRAM_SHA_256;\n        else if (str == \"MONGODB-CR\")    return MONGODB_CR;\n        else                             return SCRAM_SHA_1;\n    }\n\n} /* end of Robomongo namespace */"
  },
  {
    "path": "src/robomongo/gui/widgets/LogWidget.cpp",
    "content": "#include \"robomongo/gui/widgets/LogWidget.h\"\n\n#include <QHBoxLayout>\n#include <QScrollBar>\n#include <QMenu>\n#include <QTime>\n#include <QAction>\n#include <QPlainTextEdit>\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace Robomongo\n{\n    LogWidget::LogWidget(QWidget* parent) \n        : BaseClass(parent), _logTextEdit(new QTextEdit(this))\n    {\n        _logTextEdit->setReadOnly(true);\n        _logTextEdit->setContextMenuPolicy(Qt::CustomContextMenu);\n        VERIFY(connect(_logTextEdit, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showContextMenu(const QPoint &))));\n        QHBoxLayout *hlayout = new QHBoxLayout;\n        hlayout->setContentsMargins(0, 0, 0, 0);\n        hlayout->addWidget(_logTextEdit);\n        _clear = new QAction(\"Clear All\", this);\n        VERIFY(connect(_clear, SIGNAL(triggered()), _logTextEdit, SLOT(clear())));\n        setLayout(hlayout);      \n    }\n\n    void LogWidget::showContextMenu(const QPoint &pt)\n    {\n        QMenu *menu = _logTextEdit->createStandardContextMenu();\n        menu->addAction(_clear);\n        _clear->setEnabled(!_logTextEdit->toPlainText().isEmpty());\n\n        menu->exec(_logTextEdit->mapToGlobal(pt));\n        delete menu;\n    }\n\n    void LogWidget::addMessage(const QString &message, mongo::logger::LogSeverity level)\n    {\n        // Print time\n        QTime time = QTime::currentTime();\n        _logTextEdit->moveCursor (QTextCursor::End);\n        _logTextEdit->setTextColor(QColor(\"#aaaaaa\"));\n        _logTextEdit->insertPlainText(time.toString(\"h:mm:ss AP\") + \"\\t\");\n\n        // Print message\n        _logTextEdit->moveCursor (QTextCursor::End);\n\n        // Nice color for the future: \"#CD9800\" :)\n\n        QColor textColor = QColor(Qt::black);\n\n        if (level == mongo::logger::LogSeverity::Error())\n            textColor = QColor(\"#CD0000\");\n        else if (level == mongo::logger::LogSeverity::Log())\n            textColor = QColor(\"#777777\");\n        else if (level == mongo::logger::LogSeverity::Warning())\n            textColor = QColor(\"#CD9800\");\n\n        _logTextEdit->setTextColor(textColor);\n\n        const int maxLength = 500;\n        if (message.length() <= maxLength) {\n            _logTextEdit->insertPlainText(message.trimmed() + \"\\n\");\n        } else {\n            _logTextEdit->insertPlainText(QString(\"(truncated) \") + message.left(maxLength).trimmed() + \"...\\n\");\n        }\n\n        // Scroll to the bottom\n        QScrollBar *sb = _logTextEdit->verticalScrollBar();\n        sb->setValue(sb->maximum());\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/LogWidget.h",
    "content": "#pragma once\n\n\n#include <QWidget>\n#include <mongo/logger/log_severity.h>\nQT_BEGIN_NAMESPACE\nclass QTextEdit;\nclass QAction;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class LogWidget : public QWidget\n    {\n        Q_OBJECT\n\n    public:\n        typedef QWidget BaseClass;\n        LogWidget(QWidget* parent = 0);        \n\n    public Q_SLOTS:\n        void addMessage(const QString &message, mongo::logger::LogSeverity level);\n\n    private Q_SLOTS:\n        void showContextMenu(const QPoint &pt);\n\n    private:        \n        QTextEdit *const _logTextEdit;\n        QAction *_clear;\n    };\n\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/AddEditIndexDialog.cpp",
    "content": "#include \"robomongo/gui/widgets/explorer/AddEditIndexDialog.h\"\n\n#include <QTabWidget>\n#include <QTabBar>\n#include <QVBoxLayout>\n#include <QHBoxLayout>\n#include <QDialogButtonBox>\n#include <QLineEdit>\n#include <QTextEdit>\n#include <QLabel>\n#include <QCheckBox>\n#include <QMessageBox>\n#include <Qsci/qsciscintilla.h>\n\n#include \"robomongo/gui/widgets/workarea/IndicatorLabel.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.h\"\n#include \"robomongo/gui/editors/JSLexer.h\"\n#include \"robomongo/gui/editors/FindFrame.h\"\n#include \"robomongo/gui/editors/PlainJavaScriptEditor.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/core/domain/MongoCollection.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include <robomongo/shell/bson/json.h>\n\nnamespace\n{\n    bool isValidJson(const QString &text)\n    {\n        bool result = false;\n        if (!text.isEmpty()) {\n            try {\n                mongo::Robomongo::fromjson(text.toUtf8());\n                result = true;\n            }\n            catch (const std::exception &) {\n            }\n        }\n        return result;\n    }\n\n    QLabel *createHelpLabel(const QString &text, int marginLeft = 0, int marginTop = 0,\n                            int marginRight = 0, int marginBottom = 0)\n    {\n        QLabel *helpLabel = new QLabel(text);\n        helpLabel->setWordWrap(true);\n        helpLabel->setContentsMargins(marginLeft, marginTop, marginRight, marginBottom);\n\n        QPalette palette = helpLabel->palette();\n        palette.setColor(QPalette::WindowText, QColor(110, 110, 110));\n        helpLabel->setPalette(palette);\n\n        return helpLabel;\n    }\n\n    Robomongo::FindFrame *createFindFrame(QWidget *parent = NULL, const QString &text = QString())\n    {\n        const QFont &textFont = Robomongo::GuiRegistry::instance().font();\n        QsciLexerJavaScript *javaScriptLexer = new Robomongo::JSLexer(parent);\n        javaScriptLexer->setFont(textFont);\n        Robomongo::FindFrame *findFrame = new Robomongo::FindFrame(parent);\n        findFrame->sciScintilla()->setLexer(javaScriptLexer);\n        findFrame->sciScintilla()->setTabWidth(4);\n        findFrame->sciScintilla()->setAppropriateBraceMatching();\n        findFrame->sciScintilla()->setFont(textFont);\n        findFrame->sciScintilla()->setStyleSheet(\"QFrame {background-color: rgb(73, 76, 78); border: 1px solid #c7c5c4; border-radius: 4px; margin: 0px; padding: 0px;}\");\n        findFrame->sciScintilla()->setText(text);\n        findFrame->setMaximumHeight(120);\n        return findFrame;\n    }\n}\n\nnamespace Robomongo\n{\n    AddEditIndexDialog::AddEditIndexDialog(\n        const IndexInfo &info, const QString &databaseName, const QString &serverAdress, \n        bool const isAddIndex, QWidget *parent)\n        : BaseClass(parent), _info(info), _isAddIndex(isAddIndex)\n    {        \n        setWindowTitle(\"Index Properties\");\n        Indicator *serverIndicator = new Indicator(GuiRegistry::instance().serverIcon(), serverAdress);\n        Indicator *collectionIndicator = new Indicator(GuiRegistry::instance().collectionIcon(), QtUtils::toQString(_info._collection.name()));\n        Indicator *databaseIndicator = new Indicator(GuiRegistry::instance().databaseIcon(), databaseName);\n\n        QHBoxLayout *hlayout = new QHBoxLayout;\n        hlayout->setContentsMargins(2, 0, 5, 1);\n        hlayout->setSpacing(0);\n        hlayout->addWidget(serverIndicator, 0, Qt::AlignLeft);\n        hlayout->addWidget(databaseIndicator, 0, Qt::AlignLeft);\n        hlayout->addWidget(collectionIndicator, 0, Qt::AlignLeft);\n        hlayout->addStretch(1);\n\n        QTabWidget *mainTab = new QTabWidget(this);\n\n        mainTab->addTab(createBasicTab(), tr(\"Basic\"));\n        mainTab->addTab(createAdvancedTab(), tr(\"Advanced\"));\n        mainTab->addTab(createTextSearchTab(), tr(\"Text Search\"));\n        mainTab->setTabsClosable(false);\n\n        QDialogButtonBox *buttonBox = new QDialogButtonBox (this);\n        buttonBox->setOrientation(Qt::Horizontal);\n        buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Save);\n        VERIFY(connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())));\n        VERIFY(connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())));\n\n        QVBoxLayout *vlayout = new QVBoxLayout;\n        vlayout->addLayout(hlayout);\n        vlayout->addSpacing(5);\n        vlayout->addWidget(mainTab);\n        vlayout->addWidget(buttonBox);\n\n        setLayout(vlayout);\n        _nameLineEdit->setFocus();\n    }\n\n    QWidget* AddEditIndexDialog::createBasicTab()\n    {\n        QWidget *basicTab = new QWidget(this);\n        _nameLineEdit = new QLineEdit(QtUtils::toQString(_info._name), basicTab);\n        _nameLineEdit->setFocus();\n        _jsonText = createFindFrame(basicTab, QtUtils::toQString(_info._keys));\n        _uniqueCheckBox = new QCheckBox(tr(\"Unique\"));\n        _uniqueCheckBox->setChecked(_info._unique);\n\n        QLabel *nameHelpLabel = createHelpLabel(\n            \"Choose any name that will help you to identify this index.\",\n            0, -2, 0, 15);\n\n        QLabel *keyHelpLabel = createHelpLabel(\n            \"Document that contains pairs with the name of the field or fields to index \"\n            \"and order of the index. A 1 specifies ascending and a -1 specifies descending.\",\n            0, -2, 0, 20);\n\n        QLabel *uniqueHelpLabel = createHelpLabel(\n            \"If set, creates a unique index so that the collection will not accept insertion \"\n            \"of documents where the index key or keys match an existing value in the index.\",\n            20, -2, 0, 20);\n\n        QGridLayout *layout = new QGridLayout;\n        layout->addWidget(new QLabel(\"Name:   \"),       0, 0);\n        layout->addWidget(_nameLineEdit,                0, 1);\n        layout->addWidget(nameHelpLabel,                1, 1, Qt::AlignTop);\n        layout->addWidget(new QLabel(\"Keys:   \"),       2, 0, Qt::AlignTop);\n        layout->addWidget(_jsonText,                    2, 1, Qt::AlignTop);\n        layout->addWidget(keyHelpLabel,                 3, 1, Qt::AlignTop);\n        layout->addWidget(_uniqueCheckBox,              4, 0, 1, 2);\n        layout->addWidget(uniqueHelpLabel,              5, 0, 1, 2, Qt::AlignTop);\n        layout->setAlignment(Qt::AlignTop);\n        basicTab->setLayout(layout);\n        return basicTab;\n    }\n\n    void AddEditIndexDialog::expireStateChanged(int value)\n    {\n        _expireAfterLineEdit->setEnabled(value);\n        if (!value) {\n            _expireAfterLineEdit->setText(\"\");\n        }\n    }\n\n    QWidget* AddEditIndexDialog::createAdvancedTab()\n    {\n        QWidget *advanced = new QWidget(this);\n\n        _sparceCheckBox = new QCheckBox(tr(\"Sparse\"), advanced);\n        _sparceCheckBox->setChecked(_info._sparse);\n        _backGroundCheckBox = new QCheckBox(tr(\"Create index in background\"), advanced);\n        _backGroundCheckBox->setChecked(_info._backGround);\n\n        QHBoxLayout *expireLayout = new QHBoxLayout;\n        _expireAfterLineEdit = new QLineEdit(advanced);\n        _expireAfterLineEdit->setMaximumWidth(150);\n        QRegExp rx(\"\\\\d+\");\n        _expireAfterLineEdit->setValidator(new QRegExpValidator(rx, this));\n\n        QLabel *secLabel = new QLabel(tr(\"seconds\"), advanced);\n        expireLayout->addWidget(_expireAfterLineEdit);\n        expireLayout->addWidget(secLabel);\n        expireLayout->addStretch(1);\n\n        QCheckBox *expireCheckBox = new QCheckBox(tr(\"Expire after\"));\n        expireCheckBox->setChecked(false);\n        if (_info._ttl >= 0) {\n            expireCheckBox->setChecked(true);\n            _expireAfterLineEdit->setText(QString(\"%1\").arg(_info._ttl));\n        }\n        expireStateChanged(expireCheckBox->checkState());\n        VERIFY(connect(expireCheckBox, SIGNAL(stateChanged(int)), this, SLOT(expireStateChanged(int))));\n\n        QLabel *sparseHelpLabel = createHelpLabel(\n            \"If set, the index only references documents with the specified field. \"\n            \"These indexes use less space but behave differently in some situations (particularly sorts).\",\n            20, -2, 0, 20);\n\n        QLabel *backgroundHelpLabel = createHelpLabel(\n            \"Builds the index in the background so that building an index does not block other database activities.\",\n            20, -2, 0, 20);\n\n        QLabel *expireHelpLabel = createHelpLabel(\n            \"Specifies a <i>time to live</i>, in seconds, to control how long MongoDB retains documents in this collection\",\n            20, -2, 0, 20);\n\n        QGridLayout *layout = new QGridLayout;\n        layout->addWidget(_sparceCheckBox,           0, 0, 1, 2);\n        layout->addWidget(sparseHelpLabel,           1, 0, 1, 2);\n        layout->addWidget(_backGroundCheckBox,       2, 0, 1, 2);\n        layout->addWidget(backgroundHelpLabel,       3, 0, 1, 2);\n        layout->addWidget(expireCheckBox,            4, 0);\n        layout->addLayout(expireLayout,              4, 1);\n        layout->addWidget(expireHelpLabel,           5, 0, 1, 2);\n        layout->setAlignment(Qt::AlignTop);\n        advanced->setLayout(layout);\n\n        return advanced;\n    }\n\n    QWidget* AddEditIndexDialog::createTextSearchTab()\n    {\n        QWidget *textSearch = new QWidget(this);\n\n        _defaultLanguageLineEdit = new QLineEdit(QtUtils::toQString(_info._defaultLanguage), textSearch);\n        _languageOverrideLineEdit = new QLineEdit(QtUtils::toQString(_info._languageOverride), textSearch);\n        _textWeightsLineEdit = createFindFrame(textSearch, QtUtils::toQString(_info._textWeights));\n\n        QLabel *defaultLanguageHelpLabel = createHelpLabel(\n            \"For a <i>text</i> index, the language that determines the list of stop words and the rules for the stemmer and tokenizer. The default value is <b>english</b>\",\n            0, -2, 0, 20);\n\n        QLabel *languageOverrideHelpLabel = createHelpLabel(\n            \"For a <i>text</i> index, specify the name of the field in the document that contains, for that document, the language to override the default language. The default value is <b>language</b>\",\n            0, -2, 0, 20);\n\n        QLabel *textWeightsHelpLabel = createHelpLabel(\n            \"Document that contains field and weight pairs. The weight is a number ranging from 1 to 99,999 \"\n            \"and denotes the significance of the field relative to the other indexed fields. \",\n            0, -2, 0, 20);\n\n        QGridLayout *layout = new QGridLayout;\n        layout->addWidget(new QLabel(tr(\"Default language:\")),          0, 0);\n        layout->addWidget(_defaultLanguageLineEdit,                     0, 1);\n        layout->addWidget(defaultLanguageHelpLabel,                     1, 1);\n        layout->addWidget(new QLabel(tr(\"Language override:\")),         2, 0, Qt::AlignTop);\n        layout->addWidget(_languageOverrideLineEdit,                    2, 1);\n        layout->addWidget(languageOverrideHelpLabel,                    3, 1);\n        layout->addWidget(new QLabel(tr(\"Text weights\")),               4, 0, Qt::AlignTop);\n        layout->addWidget(_textWeightsLineEdit,                         4, 1, Qt::AlignTop);\n        layout->addWidget(textWeightsHelpLabel,                         5, 1);\n        layout->setAlignment(Qt::AlignTop);\n        textSearch->setLayout(layout);\n\n        return textSearch;\n    }\n\n    IndexInfo AddEditIndexDialog::info() const\n    {\n        const QString &expAft = _expireAfterLineEdit->text();\n        int expAftInt = _info._ttl;\n        if (!expAft.isEmpty()) {\n           expAftInt = _expireAfterLineEdit->text().toInt();\n        }\n        return IndexInfo(\n            _info._collection,\n            _nameLineEdit->text().toStdString(),\n            _jsonText->sciScintilla()->text().toStdString(),                \n            _uniqueCheckBox->checkState() == Qt::Checked,\n            _backGroundCheckBox->checkState() == Qt::Checked,\n            _sparceCheckBox->checkState() == Qt::Checked,\n            expAftInt,\n            QtUtils::toStdString(_defaultLanguageLineEdit->text()),\n            QtUtils::toStdString(_languageOverrideLineEdit->text()),\n            QtUtils::toStdString(_textWeightsLineEdit->sciScintilla()->text()));\n    }\n\n    void AddEditIndexDialog::accept()\n    {\n        if (isValidJson(_jsonText->sciScintilla()->text())) {\n            const QString &weightText = _textWeightsLineEdit->sciScintilla()->text();\n            if (!weightText.isEmpty() && !isValidJson(weightText)) {\n                QMessageBox::warning(this, \"Invalid json\", \"Please check json text.\\n\");\n                _textWeightsLineEdit->setFocus();\n                return ;\n            }\n\n            if (!_isAddIndex) {\n                // Ask user\n                int const answer = QMessageBox::question(this, \"Warning\",\n                    QString(\"MongoDB does not support direct (one step) edit index. \"\n                        \"\\nTo edit an existing index, the index must be dropped and recreated. \"\n                        \"This means if the recreate step fails, the index being edited might \"\n                        \"have already been dropped. \"\n                        \"In this case, Robo 3T will try to recover (recreate) the index being edited. \"\n                        \"Please consider backing up your index first. \"\n                        \"\\n\\nAre you sure you want to proceed?\"\n                    ),\n                    QMessageBox::Yes, QMessageBox::No, QMessageBox::NoButton\n                );\n\n                if (answer == QMessageBox::No)\n                    return;\n            }\n\n            return BaseClass::accept();\n        }\n        else {\n            QMessageBox::warning(this, \"Invalid json\", \"Please check json text.\\n\");\n            _jsonText->setFocus();\n        }\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/AddEditIndexDialog.h",
    "content": "#pragma once\n#include <QDialog>\nQT_BEGIN_NAMESPACE\nclass QLineEdit;\nclass QCheckBox;\nclass QTextEdit;\nQT_END_NAMESPACE\n#include \"robomongo/core/events/MongoEventsInfo.h\"\n\nnamespace Robomongo\n{\n    class FindFrame;\n    class AddEditIndexDialog: public QDialog\n    {\n        Q_OBJECT\n    public:\n        typedef QDialog BaseClass;\n        enum {\n            HeightWidget = 320,\n            WidthWidget = 480\n        };\n        explicit AddEditIndexDialog(\n            const IndexInfo &info, const QString &databaseName, \n            const QString &serverAdress, bool const isAddIndex,\n            QWidget *parent = nullptr\n        );\n        IndexInfo info() const;\n\n    public Q_SLOTS:\n        virtual void accept();\n        void expireStateChanged(int value);\n\n    private:\n       QWidget *createBasicTab();\n       QWidget *createAdvancedTab();\n       QWidget *createTextSearchTab();\n\n       bool const _isAddIndex;\n       IndexInfo const _info;\n       QLineEdit *_nameLineEdit;\n       FindFrame *_jsonText;\n       QCheckBox *_uniqueCheckBox;\n\n       QCheckBox *_backGroundCheckBox;\n       QCheckBox *_sparceCheckBox;\n       QLineEdit *_expireAfterLineEdit;\n\n       QLineEdit *_defaultLanguageLineEdit;\n       QLineEdit *_languageOverrideLineEdit;\n       FindFrame *_textWeightsLineEdit;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexItem.cpp",
    "content": "#include \"ExplorerCollectionIndexItem.h\"\n\n#include <QAction>\n#include <QMenu>\n\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/utils/DialogUtils.h\"\n#include \"robomongo/gui/widgets/explorer/AddEditIndexDialog.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.h\"\n\nnamespace Robomongo\n{\n    ExplorerCollectionIndexItem::ExplorerCollectionIndexItem(\n        ExplorerCollectionIndexesDir *parent, const IndexInfo &info)\n        : BaseClass(parent), _info(info)\n    {\n        auto dropIndex = new QAction(\"Drop Index...\", this);\n        connect(dropIndex, SIGNAL(triggered()), SLOT(ui_dropIndex()));\n        auto editIndex = new QAction(\"Edit Index...\", this);\n        connect(editIndex, SIGNAL(triggered()), SLOT(ui_edit()));\n\n        BaseClass::_contextMenu->addAction(editIndex);\n        BaseClass::_contextMenu->addAction(dropIndex);\n\n        setText(0, QtUtils::toQString(_info._name));\n        setIcon(0, Robomongo::GuiRegistry::instance().indexIcon());\n    }\n\n    void ExplorerCollectionIndexItem::ui_dropIndex()\n    {\n        // Ask user\n        auto const answer = utils::questionDialog(treeWidget(), \"Drop\", \"Index\", text(0));\n        if (answer != QMessageBox::Yes)\n            return;\n\n        auto const par = dynamic_cast<ExplorerCollectionIndexesDir *>(parent());\n        if (!par)\n            return;\n        \n        auto const grandParent = dynamic_cast<ExplorerCollectionTreeItem *>(par->parent());\n        if (!grandParent)\n            return;\n\n        grandParent->dropIndex(this);\n    }\n\n    void ExplorerCollectionIndexItem::ui_edit()\n    {\n        auto const par = dynamic_cast<ExplorerCollectionIndexesDir *>(parent());\n        if (par) {\n            auto const grPar = dynamic_cast<ExplorerCollectionTreeItem *const>(par->parent());\n            if (!grPar)\n                return;\n\n            auto const& db { grPar->databaseItem()->database() };\n            AddEditIndexDialog dlg {\n                _info, \n                QtUtils::toQString(db->name()), \n                QtUtils::toQString(db->server()->connectionRecord()->getFullAddress()),\n                false,\n                treeWidget()\n            };\n\n            auto const result = dlg.exec();\n            if (result != QDialog::Accepted)\n                return;\n\n            auto const databaseTreeItem = dynamic_cast<ExplorerDatabaseTreeItem *>(grPar->databaseItem());\n            if (!databaseTreeItem)\n                return;\n\n            databaseTreeItem->addEditIndex(grPar, _info, dlg.info());\n        }\n    }\n}"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexItem.h",
    "content": "#pragma once\n\n#include \"robomongo/core/events/MongoEventsInfo.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerTreeItem.h\"\n\nnamespace Robomongo\n{\n    class ExplorerCollectionIndexesDir;\n\n    class ExplorerCollectionIndexItem : public ExplorerTreeItem\n    {\n        Q_OBJECT\n\n    public:\n        using BaseClass = ExplorerTreeItem ;\n        explicit ExplorerCollectionIndexItem(\n            ExplorerCollectionIndexesDir *parent, const IndexInfo &info);\n\n    private Q_SLOTS:\n        void ui_dropIndex();\n        void ui_edit();\n\n    private:\n        IndexInfo _info;\n    };\n}"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.cpp",
    "content": "#include \"ExplorerCollectionIndexesDir.h\"\n\n#include <QAction>\n#include <QMenu>\n\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/widgets/explorer/AddEditIndexDialog.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.h\"\n\nnamespace Robomongo\n{\n    ExplorerCollectionIndexesDir::ExplorerCollectionIndexesDir(QTreeWidgetItem *parent)\n        :BaseClass(parent)\n    {\n        QAction *addIndex = new QAction(\"Add Index...\", this);\n        VERIFY(connect(addIndex, SIGNAL(triggered()), SLOT(ui_addIndex())));\n\n        QAction *reIndex = new QAction(\"Rebuild Indexes...\", this);\n        VERIFY(connect(reIndex, SIGNAL(triggered()), SLOT(ui_reIndex())));\n\n        QAction *viewIndex = new QAction(\"View Indexes\", this);\n        VERIFY(connect(viewIndex, SIGNAL(triggered()), SLOT(ui_viewIndex())));\n\n        QAction *refreshIndex = new QAction(\"Refresh\", this);\n        VERIFY(connect(refreshIndex, SIGNAL(triggered()), SLOT(ui_refreshIndex())));\n\n        BaseClass::_contextMenu->addAction(viewIndex);\n        BaseClass::_contextMenu->addAction(addIndex);\n        BaseClass::_contextMenu->addAction(reIndex);\n        BaseClass::_contextMenu->addSeparator();\n        BaseClass::_contextMenu->addAction(refreshIndex);\n\n        setText(0, \"Indexes\");\n        setIcon(0, Robomongo::GuiRegistry::instance().folderIcon());\n\n        setExpanded(false);\n        setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);\n    }\n\n    void ExplorerCollectionIndexesDir::expand()\n    {\n        auto const par = dynamic_cast<ExplorerCollectionTreeItem *>(parent());\n        if (!par)\n            return;\n\n        par->expand();\n    }\n\n    void ExplorerCollectionIndexesDir::ui_viewIndex()\n    {\n        auto const par = dynamic_cast<ExplorerCollectionTreeItem *>(parent());\n        if (par)\n            par->openCurrentCollectionShell(\"getIndexes()\");        \n    }\n\n    void ExplorerCollectionIndexesDir::ui_refreshIndex()\n    {\n        auto const par = dynamic_cast<ExplorerCollectionTreeItem *>(parent());\n        if (par)\n            par->expand();\n    }\n\n    void ExplorerCollectionIndexesDir::ui_addIndex()\n    {\n        auto par = dynamic_cast<ExplorerCollectionTreeItem *const>(parent());\n        if (!par)\n            return;\n\n        IndexInfo const fakeInfo(par->collection()->info(), \"\");\n        auto const& db { par->databaseItem()->database() };\n        AddEditIndexDialog dlg {\n            fakeInfo,\n            QtUtils::toQString(db->name()),\n            QtUtils::toQString(db->server()->connectionRecord()->getFullAddress()),\n            true,\n            treeWidget()\n        };\n        auto const result = dlg.exec();\n        if (result != QDialog::Accepted)\n            return;\n\n        auto const databaseTreeItem = dynamic_cast<ExplorerDatabaseTreeItem *>(par->databaseItem());\n        if (!databaseTreeItem)\n            return;\n\n        databaseTreeItem->addEditIndex(par, fakeInfo, dlg.info());\n    }\n\n    void ExplorerCollectionIndexesDir::ui_reIndex()\n    {\n        auto const par = dynamic_cast<ExplorerCollectionTreeItem *>(parent());\n        if (par)\n            par->openCurrentCollectionShell(\"reIndex()\", false);\n    }\n}"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.h",
    "content": "#pragma once\n\n#include \"robomongo/gui/widgets/explorer/ExplorerTreeItem.h\"\n\nnamespace Robomongo\n{\n    class ExplorerCollectionIndexesDir : public ExplorerTreeItem\n    {\n        Q_OBJECT\n    public:\n        using BaseClass = ExplorerTreeItem;\n        static const QString labelText;\n        explicit ExplorerCollectionIndexesDir(QTreeWidgetItem *parent);\n        void expand();\n\n    private Q_SLOTS:\n        void ui_addIndex();\n        void ui_reIndex();\n        void ui_viewIndex();\n        void ui_refreshIndex();\n    };\n\n}"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.cpp",
    "content": "#include \"robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.h\"\n\n#include <QAction>\n#include <QMenu>\n\n#include \"robomongo/gui/widgets/explorer/AddEditIndexDialog.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerCollectionIndexItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.h\"\n#include \"robomongo/gui/dialogs/CreateDatabaseDialog.h\"\n#include \"robomongo/gui/dialogs/CopyCollectionDialog.h\"\n#include \"robomongo/gui/dialogs/DocumentTextEditor.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/utils/DialogUtils.h\"\n\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/domain/MongoCollection.h\"\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/utils/Logger.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/EventBus.h\"\n\nnamespace\n{\n    const char *tooltipTemplate =\n        \"%s \"\n        \"<table>\"\n        \"<tr><td>Count:</td> <td><b>&nbsp;&nbsp;%lld</b></td></tr>\"\n        \"<tr><td>Size:</td><td><b>&nbsp;&nbsp;%s</b></td></tr>\"\n        \"</table>\"\n        ;\n}\n\nnamespace Robomongo\n{\n    R_REGISTER_EVENT(CollectionIndexesLoadingEvent)      \n\n    ExplorerCollectionTreeItem::ExplorerCollectionTreeItem(\n        QTreeWidgetItem *parent, ExplorerDatabaseTreeItem *databaseItem, MongoCollection *collection) \n        : BaseClass(parent), _collection(collection), _databaseItem(databaseItem)\n    {\n        QAction *addDocument = new QAction(\"Insert Document...\", this);\n        VERIFY(connect(addDocument, SIGNAL(triggered()), SLOT(ui_addDocument())));\n\n        QAction *updateDocument = new QAction(\"Update Documents...\", this);\n        VERIFY(connect(updateDocument, SIGNAL(triggered()), SLOT(ui_updateDocument())));\n        QAction *removeDocument = new QAction(\"Remove Documents...\", this);\n        VERIFY(connect(removeDocument, SIGNAL(triggered()), SLOT(ui_removeDocument())));\n\n        QAction *removeAllDocuments = new QAction(\"Remove All Documents...\", this);\n        VERIFY(connect(removeAllDocuments, SIGNAL(triggered()), SLOT(ui_removeAllDocuments())));\n\n        QAction *collectionStats = new QAction(\"Statistics\", this);\n        VERIFY(connect(collectionStats, SIGNAL(triggered()), SLOT(ui_collectionStatistics())));\n\n        QAction *storageSize = new QAction(\"Storage Size\", this);\n        VERIFY(connect(storageSize, SIGNAL(triggered()), SLOT(ui_storageSize())));\n\n        QAction *totalIndexSize = new QAction(\"Total Index Size\", this);\n        VERIFY(connect(totalIndexSize, SIGNAL(triggered()), SLOT(ui_totalIndexSize())));\n\n        QAction *totalSize = new QAction(\"Total Size\", this);\n        VERIFY(connect(totalSize, SIGNAL(triggered()), SLOT(ui_totalSize())));\n        QAction *shardVersion = new QAction(\"Shard Version\", this);\n        VERIFY(connect(shardVersion, SIGNAL(triggered()), SLOT(ui_shardVersion())));\n\n        QAction *shardDistribution = new QAction(\"Shard Distribution\", this);\n        VERIFY(connect(shardDistribution, SIGNAL(triggered()), SLOT(ui_shardDistribution())));\n\n        QAction *dropCollection = new QAction(\"Drop Collection...\", this);\n        VERIFY(connect(dropCollection, SIGNAL(triggered()), SLOT(ui_dropCollection())));\n\n        QAction *renameCollection = new QAction(\"Rename Collection...\", this);\n        VERIFY(connect(renameCollection, SIGNAL(triggered()), SLOT(ui_renameCollection())));\n        QAction *duplicateCollection = new QAction(\"Duplicate Collection...\", this);\n        VERIFY(connect(duplicateCollection, SIGNAL(triggered()), SLOT(ui_duplicateCollection())));\n\n        // Disabling for 0.8.5 release as this is currently a broken misfeature (see discussion on issue #398)\n        // QAction *copyCollectionToDiffrentServer = new QAction(\"Copy Collection to Database...\", this);\n        // VERIFY(connect(copyCollectionToDiffrentServer, SIGNAL(triggered()), SLOT(ui_copyToCollectionToDiffrentServer())));\n\n        QAction *viewCollection = new QAction(\"View Documents\", this);\n        VERIFY(connect(viewCollection, SIGNAL(triggered()), SLOT(ui_viewCollection())));\n\n        BaseClass::_contextMenu->addAction(viewCollection);\n        BaseClass::_contextMenu->addSeparator();\n        BaseClass::_contextMenu->addAction(addDocument);\n        BaseClass::_contextMenu->addAction(updateDocument);\n        BaseClass::_contextMenu->addAction(removeDocument);\n        BaseClass::_contextMenu->addAction(removeAllDocuments);\n        BaseClass::_contextMenu->addSeparator();\n        BaseClass::_contextMenu->addAction(renameCollection);\n        BaseClass::_contextMenu->addAction(duplicateCollection);\n        // Disabling for 0.8.5 release as this is currently a broken misfeature (see discussion on issue #398)\n        // BaseClass::_contextMenu->addAction(copyCollectionToDiffrentServer);\n        BaseClass::_contextMenu->addAction(dropCollection);\n        BaseClass::_contextMenu->addSeparator();\n        BaseClass::_contextMenu->addAction(collectionStats);\n        BaseClass::_contextMenu->addSeparator();\n        BaseClass::_contextMenu->addAction(shardVersion);\n        BaseClass::_contextMenu->addAction(shardDistribution);\n\n        AppRegistry::instance().bus()->subscribe(_databaseItem, LoadCollectionIndexesResponse::Type, this);\n        AppRegistry::instance().bus()->subscribe(_databaseItem, AddEditIndexResponse::Type, this);\n        AppRegistry::instance().bus()->subscribe(_databaseItem, DropCollectionIndexResponse::Type, this);\n        AppRegistry::instance().bus()->subscribe(this, CollectionIndexesLoadingEvent::Type, this);\n\n        setText(0, QtUtils::toQString(_collection->name()));\n        setIcon(0, GuiRegistry::instance().collectionIcon());\n\n        _indexDir = new ExplorerCollectionIndexesDir(this);\n        addChild(_indexDir);\n\n        setExpanded(false);\n        setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);\n    }\n\n    void ExplorerCollectionTreeItem::handle(LoadCollectionIndexesResponse *event)\n    {\n        if (event->isError()) {\n            _indexDir->setText(0, \"Indexes\");\n            _indexDir->setExpanded(false);\n            QtUtils::clearChildItems(_indexDir);\n\n            std::stringstream ss;\n            ss << \"Cannot load list of indexes.\\n\\nError:\\n\" << event->error().errorMessage();\n\n            QMessageBox::information(NULL, \"Error\", QtUtils::toQString(ss.str()));\n            return;\n        }\n\n        QtUtils::clearChildItems(_indexDir);\n        const std::vector<IndexInfo> &indexes = event->indexes();\n\n        // Do not expand, when we do not have functions\n        if (indexes.size() == 0)\n            _indexDir->setExpanded(false);\n\n        for (std::vector<IndexInfo>::const_iterator it = indexes.begin(); it != indexes.end(); ++it) {\n            _indexDir->addChild(new ExplorerCollectionIndexItem(_indexDir, *it));\n        }\n        _indexDir->setText(0, detail::buildName(\"Indexes\", _indexDir->childCount()));\n    }\n\n    void ExplorerCollectionTreeItem::handle(AddEditIndexResponse *event)\n    {\n        bool const isAddIndex{ event->oldIndex_._name.empty() };\n        QString const action{ isAddIndex ? \"add\" : \"edit\" };\n        auto const index{ QString::fromStdString(\n           isAddIndex ? event->newIndex_._name : event->oldIndex_._name\n        )};\n        if (event->isError()) {\n            QString const header{ \"Operation failed\" };\n            QString const msg{ \"Failed to \" + action + \" index \\\"\" + index + '\\\"'};\n            auto const err{ QString::fromStdString(event->error().errorMessage()) };\n            LOG_MSG((msg + \". \" + err).toStdString(), mongo::logger::LogSeverity::Error());\n            QMessageBox::critical(nullptr, \"Error: \" + header, msg + \"\\n\\n\" + err);\n            return;\n        }\n        LOG_MSG((\"Succeeded to \" + action + \" index \\\"\" + index + '\\\"').toStdString(), \n            mongo::logger::LogSeverity::Info());\n    }\n\n    void ExplorerCollectionTreeItem::handle(DropCollectionIndexResponse *event)\n    {\n        if (event->isError()) {\n            QString const header{\"Operation failed\"};\n            QString const msg{ \n                \"Failed to drop index \\\"\" + QString::fromStdString(event->index()) + '\\\"' \n            };\n            auto const err{ \"Reason: \" + QString::fromStdString(event->error().errorMessage()) };\n            LOG_MSG((msg + \". \" + err).toStdString(), mongo::logger::LogSeverity::Error());\n            QMessageBox::critical(nullptr, \"Error: \" + header, msg + \"\\n\\n\" + err);\n            return;\n        }\n\n        for (int i = 0; i < _indexDir->childCount(); ++i) {\n            QTreeWidgetItem *item = _indexDir->child(i);\n            if (item->text(0) == QString::fromStdString(event->index())) {\n                removeChild(item);\n                delete item;\n                break;\n            }\n        }        \n\n        LOG_MSG(\"Succeeded to drop index \\\"\" + event->index() + '\\\"', \n            mongo::logger::LogSeverity::Info());\n\n        _indexDir->setText(0, detail::buildName(\"Indexes\", _indexDir->childCount()));\n    }\n\n    void ExplorerCollectionTreeItem::handle(CollectionIndexesLoadingEvent *event)\n    {\n        _indexDir->setText(0, detail::buildName(\"Indexes\", -1));\n    }\n\n    void ExplorerCollectionTreeItem::expand()\n    {\n         AppRegistry::instance().bus()->publish(new CollectionIndexesLoadingEvent(this));\n         if (_databaseItem) {\n             _databaseItem->expandColection(this);\n         }\n    }\n\n    void ExplorerCollectionTreeItem::dropIndex(const QTreeWidgetItem * const ind)\n    {\n        if (!_databaseItem)\n            return;\n\n        _databaseItem->dropIndexFromCollection(this, QtUtils::toStdString(ind->text(0)));\n    }\n\n    QString ExplorerCollectionTreeItem::buildToolTip(MongoCollection *collection)\n    {\n        // This function does not used now\n        char buff[2048] = {0};\n//        sprintf(buff,tooltipTemplate,collection->name().c_str(),collection->info().count(),collection->sizeString().c_str());\n        return buff;\n    }\n\n    void ExplorerCollectionTreeItem::ui_addDocument()\n    {\n        MongoDatabase *database = _collection->database();\n        MongoServer *server = database->server();\n        ConnectionSettings *settings = server->connectionRecord();\n\n        DocumentTextEditor editor(CollectionInfo(settings->getFullAddress(), database->name(), _collection->name()), \"{\\n    \\n}\");\n\n        editor.setCursorPosition(1, 4);\n        editor.setWindowTitle(\"Insert Document\");\n        int result = editor.exec();\n\n        treeWidget()->activateWindow();\n\n        if (result == QDialog::Accepted) {\n            server->insertDocuments(editor.bsonObj(), MongoNamespace(database->name(), _collection->name()) );\n        }\n    }\n\n    void ExplorerCollectionTreeItem::ui_removeDocument()\n    {\n        openCurrentCollectionShell(\n            \"remove({ '' : '' });\"\n            , false, CursorPosition(0, -10));\n    }\n\n    void ExplorerCollectionTreeItem::ui_removeAllDocuments()\n    {\n        MongoDatabase *database = _collection->database();\n        // Ask user\n        int answer = QMessageBox::question(treeWidget(),\n            \"Remove All Documents\",\n            QString(\"Remove all documents from <b>%1</b> collection?\").arg(QtUtils::toQString(_collection->name())),\n            QMessageBox::Yes, QMessageBox::No, QMessageBox::NoButton);\n\n        if (answer == QMessageBox::Yes) {\n            MongoServer *server = database->server();\n            mongo::BSONObjBuilder builder;\n            mongo::BSONObj bsonQuery = builder.obj();\n            mongo::Query query(bsonQuery);\n            server->removeDocuments(query, MongoNamespace(database->name(), _collection->name()), \n                                    RemoveDocumentCount::ALL);\n        }\n    }\n\n    void ExplorerCollectionTreeItem::ui_updateDocument()\n    {\n        openCurrentCollectionShell(\n            \"update(\\n\"\n            \"    // query \\n\"\n            \"    {\\n\"\n            \"        \\\"key\\\" : \\\"value\\\"\\n\"\n            \"    },\\n\"\n            \"    \\n\"\n            \"    // update \\n\"\n            \"    {\\n\"\n            \"    },\\n\"\n            \"    \\n\"\n            \"    // options \\n\"\n            \"    {\\n\"\n            \"        \\\"multi\\\" : false,  // update only one document \\n\"\n            \"        \\\"upsert\\\" : false  // insert a new document, if no existing document match the query \\n\"\n            \"    }\\n\"\n            \");\", false);\n    }\n\n    void ExplorerCollectionTreeItem::ui_collectionStatistics()\n    {\n        openCurrentCollectionShell(\"stats()\");\n    }\n\n    void ExplorerCollectionTreeItem::ui_dropCollection()\n    {\n        // Ask user\n        int answer = utils::questionDialog(treeWidget(), \"Drop\", \"collection\", QtUtils::toQString(_collection->name()));\n\n        if (answer == QMessageBox::Yes) {\n            MongoDatabase *database = _collection->database();\n            database->dropCollection(_collection->name());\n        }\n    }\n\n    void ExplorerCollectionTreeItem::ui_duplicateCollection()\n    {\n        MongoDatabase *database = _collection->database();\n        MongoServer *server = database->server();\n        ConnectionSettings *settings = server->connectionRecord();\n\n        CreateDatabaseDialog dlg(QtUtils::toQString(settings->getFullAddress()),\n            QtUtils::toQString(database->name()),\n            QtUtils::toQString(_collection->name()), treeWidget());\n        dlg.setWindowTitle(\"Duplicate Collection\");\n        dlg.setOkButtonText(\"&Duplicate\");\n        dlg.setInputLabelText(\"New Collection Name:\");\n        dlg.setInputText(QtUtils::toQString(_collection->name() + \"_copy\"));\n        int result = dlg.exec();\n\n        if (result == QDialog::Accepted) {\n            database->duplicateCollection(_collection->name(), QtUtils::toStdString(dlg.databaseName()));\n        }\n    }\n\n    void ExplorerCollectionTreeItem::ui_copyToCollectionToDiffrentServer()\n    {\n        MongoDatabase *databaseFrom = _collection->database();\n        MongoServer *server = databaseFrom->server();\n        ConnectionSettings *settings = server->connectionRecord();\n\n        CopyCollection dlg(QtUtils::toQString(settings->getFullAddress()), QtUtils::toQString(databaseFrom->name()), QtUtils::toQString(_collection->name()) );\n        int result = dlg.exec();\n\n        if (result == QDialog::Accepted) {\n            MongoDatabase *databaseTo = dlg.selectedDatabase();\n            databaseTo->copyCollection(server, databaseFrom->name(), _collection->name());\n            databaseTo->loadCollections();\n        }\n    }\n\n    void ExplorerCollectionTreeItem::ui_renameCollection()\n    {\n        MongoDatabase *database = _collection->database();\n        MongoServer *server = database->server();\n        ConnectionSettings *connSettings = server->connectionRecord();\n\n        CreateDatabaseDialog dlg(QtUtils::toQString(connSettings->getFullAddress()),\n            QtUtils::toQString(database->name()),\n            QtUtils::toQString(_collection->name()), treeWidget());\n        dlg.setWindowTitle(\"Rename Collection\");\n        dlg.setOkButtonText(\"&Rename\");\n        dlg.setInputLabelText(\"New Collection Name:\");\n        dlg.setInputText(QtUtils::toQString(_collection->name()));\n        int result = dlg.exec();\n\n        if (result == QDialog::Accepted) {\n            database->renameCollection(_collection->name(), QtUtils::toStdString(dlg.databaseName()));\n        }\n    }\n\n    void ExplorerCollectionTreeItem::ui_viewCollection()\n    {\n        CursorPosition cp(0, -2);\n        openCurrentCollectionShell(\"find({})\", true, cp);\n    }\n\n    void ExplorerCollectionTreeItem::ui_storageSize()\n    {\n        openCurrentCollectionShell(\"storageSize()\");\n    }\n\n    void ExplorerCollectionTreeItem::ui_totalIndexSize()\n    {\n        openCurrentCollectionShell(\"totalIndexSize()\");\n    }\n\n    void ExplorerCollectionTreeItem::ui_totalSize()\n    {\n        openCurrentCollectionShell(\"totalSize()\");\n    }\n\n    void ExplorerCollectionTreeItem::ui_shardVersion()\n    {\n        openCurrentCollectionShell(\"getShardVersion()\");\n    }\n\n    void ExplorerCollectionTreeItem::ui_shardDistribution()\n    {\n        openCurrentCollectionShell(\"getShardDistribution()\");\n    }\n\n    void ExplorerCollectionTreeItem::openCurrentCollectionShell(const QString &script, bool execute, const CursorPosition &cursor)\n    {\n        QString query = detail::buildCollectionQuery(_collection->name(), script);\n        AppRegistry::instance().app()->openShell(_collection->database(), query, execute, QtUtils::toQString(_collection->name()), cursor);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.h",
    "content": "#pragma once\n\n#include \"robomongo/core/Event.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.h\"\n#include \"robomongo/core/domain/CursorPosition.h\"\n#include \"robomongo/core/events/MongoEventsInfo.h\"\n#include \"robomongo/core/domain/MongoCollection.h\"\n\nnamespace Robomongo\n{\n    class LoadCollectionIndexesResponse;\n    struct AddEditIndexResponse;\n    class DropCollectionIndexResponse;\n    class ExplorerCollectionIndexesDir;\n    class ExplorerDatabaseTreeItem;\n\n    class CollectionIndexesLoadingEvent : public Event\n    {\n        R_EVENT\n            CollectionIndexesLoadingEvent(QObject *sender) : Event(sender) {}\n    };\n\n    class ExplorerCollectionTreeItem: public ExplorerTreeItem\n    {\n        Q_OBJECT\n    public:\n        typedef ExplorerTreeItem BaseClass;\n        ExplorerCollectionTreeItem(QTreeWidgetItem *parent, ExplorerDatabaseTreeItem *databaseItem, MongoCollection *collection);\n        MongoCollection *collection() const { return _collection; }\n        void expand();\n        void dropIndex(const QTreeWidgetItem * const ind);\n        void openCurrentCollectionShell(const QString &script, bool execute = true, const CursorPosition &cursor = CursorPosition());\n        ExplorerDatabaseTreeItem *const databaseItem() const { return _databaseItem; }\n\n    public Q_SLOTS:\n        void handle(LoadCollectionIndexesResponse *event);\n        void handle(AddEditIndexResponse *event);\n        void handle(DropCollectionIndexResponse *event);\n        void handle(CollectionIndexesLoadingEvent *event);\n\n    private Q_SLOTS:\n        void ui_addDocument();\n        void ui_removeDocument();\n        void ui_updateDocument();\n        void ui_collectionStatistics();\n        void ui_removeAllDocuments();\n        void ui_storageSize();\n        void ui_totalIndexSize();\n        void ui_totalSize();\n        void ui_shardVersion();\n        void ui_shardDistribution();\n        void ui_dropCollection();\n        void ui_renameCollection();\n        void ui_duplicateCollection();\n        void ui_copyToCollectionToDiffrentServer();\n        void ui_viewCollection();\n\n    private:\n        QString buildToolTip(MongoCollection *collection);\n        ExplorerCollectionIndexesDir *_indexDir;\n        MongoCollection *const _collection;\n        ExplorerDatabaseTreeItem *const _databaseItem;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.cpp",
    "content": "#include \"robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.h\"\n\n#include <QAction>\n#include <QMenu>\n\n#include \"robomongo/gui/dialogs/FunctionTextEditor.h\"\n#include \"robomongo/gui/dialogs/CreateUserDialog.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.h\"\n#include \"robomongo/gui/dialogs/CreateCollectionDialog.h\"\n#include \"robomongo/gui/dialogs/CreateDatabaseDialog.h\"\n\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/domain/MongoDatabase.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\n\nnamespace Robomongo\n{\n\n    void openDatabaseShell(MongoDatabase *database, const QString &script, \n                           bool execute = true, const CursorPosition &cursor = CursorPosition())\n    {\n        AppRegistry::instance().app()->openShell(database, script, execute, \n            QtUtils::toQString(database->name()), cursor);\n    }\n\n    ExplorerDatabaseCategoryTreeItem::ExplorerDatabaseCategoryTreeItem(\n        ExplorerDatabaseTreeItem *databaseItem, ExplorerDatabaseCategory category) \n        : BaseClass(databaseItem), _category(category)\n    {\n        if (_category == Collections) {\n            QAction *createCollection = new QAction(\"Create Collection...\", this);\n            VERIFY(connect(createCollection, SIGNAL(triggered()), SLOT(ui_createCollection())));\n\n            QAction *dbCollectionsStats = new QAction(\"Collections Statistics\", this);\n            VERIFY(connect(dbCollectionsStats, SIGNAL(triggered()), SLOT(ui_dbCollectionsStatistics())));\n\n            QAction *refreshCollections = new QAction(\"Refresh\", this);\n            VERIFY(connect(refreshCollections, SIGNAL(triggered()), SLOT(ui_refreshCollections())));\n\n            BaseClass::_contextMenu->addAction(dbCollectionsStats);\n            BaseClass::_contextMenu->addAction(createCollection);\n            BaseClass::_contextMenu->addSeparator();\n            BaseClass::_contextMenu->addAction(refreshCollections);\n        }\n        else if (_category == Users) {\n\n            QAction *refreshUsers = new QAction(\"Refresh\", this);\n            VERIFY(connect(refreshUsers, SIGNAL(triggered()), SLOT(ui_refreshUsers())));\n\n            QAction *viewUsers = new QAction(\"View Users\", this);\n            VERIFY(connect(viewUsers, SIGNAL(triggered()), SLOT(ui_viewUsers())));\n\n            QAction *addUser = new QAction(\"Add User...\", this);\n            VERIFY(connect(addUser, SIGNAL(triggered()), SLOT(ui_addUser())));\n\n            BaseClass::_contextMenu->addAction(viewUsers);\n            BaseClass::_contextMenu->addAction(addUser);\n            BaseClass::_contextMenu->addSeparator();\n            BaseClass::_contextMenu->addAction(refreshUsers);\n        }\n        else if (_category == Functions) {\n\n            QAction *refreshFunctions = new QAction(\"Refresh\", this);\n            VERIFY(connect(refreshFunctions, SIGNAL(triggered()), SLOT(ui_refreshFunctions())));\n\n            QAction *viewFunctions = new QAction(\"View Functions\", this);\n            VERIFY(connect(viewFunctions, SIGNAL(triggered()), SLOT(ui_viewFunctions())));\n\n            QAction *addFunction = new QAction(\"Add Function...\", this);\n            VERIFY(connect(addFunction, SIGNAL(triggered()), SLOT(ui_addFunction())));\n\n            BaseClass::_contextMenu->addAction(viewFunctions);\n            BaseClass::_contextMenu->addAction(addFunction);\n            BaseClass::_contextMenu->addSeparator();\n            BaseClass::_contextMenu->addAction(refreshFunctions);\n        }\n\n        setExpanded(false);\n        setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);\n    }\n    \n    void ExplorerDatabaseCategoryTreeItem::expand()\n    {\n        ExplorerDatabaseTreeItem *databaseItem = ExplorerDatabaseCategoryTreeItem::databaseItem();\n        if (!databaseItem)\n            return;\n\n        switch(_category) {\n        case Collections:\n            databaseItem->expandCollections();\n            break;\n        case Files:\n             break;\n        case Functions:\n            databaseItem->expandFunctions();\n            break;\n        case Users:\n            databaseItem->expandUsers();\n            break;\n        }\n    }\n\n    ExplorerDatabaseTreeItem *ExplorerDatabaseCategoryTreeItem::databaseItem() const \n    { \n        return static_cast<ExplorerDatabaseTreeItem*>(parent()); \n    }\n\n    void ExplorerDatabaseCategoryTreeItem::ui_dbCollectionsStatistics()\n    {\n        ExplorerDatabaseTreeItem *databaseItem = ExplorerDatabaseCategoryTreeItem::databaseItem();\n        if (databaseItem) {\n            openDatabaseShell(databaseItem->database(), \"db.printCollectionStats()\");\n        }\n    } \n\n    void ExplorerDatabaseCategoryTreeItem::ui_refreshUsers()\n    {\n        ExplorerDatabaseTreeItem *databaseItem = ExplorerDatabaseCategoryTreeItem::databaseItem();\n        if (databaseItem) {\n            databaseItem->expandUsers();\n        }\n    }\n\n    void ExplorerDatabaseCategoryTreeItem::ui_refreshFunctions()\n    {\n        ExplorerDatabaseTreeItem *databaseItem = ExplorerDatabaseCategoryTreeItem::databaseItem();\n        if (databaseItem) {\n            databaseItem->expandFunctions();\n        }\n    }\n\n    void ExplorerDatabaseCategoryTreeItem::ui_viewUsers()\n    {\n        ExplorerDatabaseTreeItem *databaseItem = ExplorerDatabaseCategoryTreeItem::databaseItem();\n        if (databaseItem) {\n            openDatabaseShell(databaseItem->database(), \"db.getUsers()\");\n        }\n    }\n\n    void ExplorerDatabaseCategoryTreeItem::ui_viewFunctions()\n    {\n        ExplorerDatabaseTreeItem *databaseItem = ExplorerDatabaseCategoryTreeItem::databaseItem();\n        if (databaseItem) {\n            openDatabaseShell(databaseItem->database(), \"db.system.js.find()\");\n        }\n    }\n\n    void ExplorerDatabaseCategoryTreeItem::ui_createCollection()\n    {\n        ExplorerDatabaseTreeItem *databaseItem = ExplorerDatabaseCategoryTreeItem::databaseItem();\n        if (!databaseItem)\n            return;\n\n        const float dbVersion = databaseItem->database()->server()->version();\n        const std::string& engineName = databaseItem->database()->server()->getStorageEngineType();\n        const QString& serverName = QtUtils::toQString(databaseItem->database()->server()->connectionRecord()->getFullAddress());\n        const QString& dbName = QtUtils::toQString(databaseItem->database()->name());\n\n        CreateCollectionDialog dlg(serverName, dbVersion, engineName, dbName, QString(), treeWidget());\n        int result = dlg.exec();\n        if (result != QDialog::Accepted)\n            return;\n        std::string collectionName = QtUtils::toStdString(dlg.getCollectionName());\n        databaseItem->database()->createCollection(collectionName, \n            dlg.getSizeInputValue(), dlg.isCapped(), dlg.getMaxDocNumberInputValue(), dlg.getExtraOptions());\n    }\n\n    void ExplorerDatabaseCategoryTreeItem::ui_addUser()\n    {\n        ExplorerDatabaseTreeItem *databaseItem = ExplorerDatabaseCategoryTreeItem::databaseItem();\n        if (!databaseItem)\n            return;\n\n        std::unique_ptr<CreateUserDialog> dlg = nullptr;\n\n        float const version = databaseItem->database()->server()->version();\n        if (version < MongoUser::minimumSupportedVersion) {\n            dlg.reset(new CreateUserDialog(\n                QtUtils::toQString(databaseItem->database()->server()->connectionRecord()->getFullAddress()),\n                QtUtils::toQString(databaseItem->database()->name()), MongoUser(version), treeWidget()));\n        }\n        else {\n            dlg.reset(new CreateUserDialog(databaseItem->database()->server()->getDatabasesNames(), \n                QtUtils::toQString(databaseItem->database()->server()->connectionRecord()->getFullAddress()),\n                QtUtils::toQString(databaseItem->database()->name()), MongoUser(version), treeWidget()));\n        }\n\n        if (dlg->exec() != QDialog::Accepted)\n            return;\n\n        MongoUser user = dlg->user();\n        databaseItem->database()->createUser(user);\n    }\n\n    void ExplorerDatabaseCategoryTreeItem::ui_addFunction()\n    {\n        ExplorerDatabaseTreeItem *databaseItem = ExplorerDatabaseCategoryTreeItem::databaseItem();\n        if (!databaseItem)\n            return;\n\n        FunctionTextEditor dlg(\n            QtUtils::toQString(databaseItem->database()->server()->connectionRecord()->getFullAddress()), \n            QtUtils::toQString(databaseItem->database()->name()), MongoFunction());\n\n        dlg.setWindowTitle(\"Create Function\");\n        dlg.setCode(\n            \"function() {\\n\"\n            \"    // write your code here\\n\"\n            \"}\");\n        \n        if (dlg.exec() != QDialog::Accepted)\n            return;\n\n        MongoFunction function = dlg.function();\n        databaseItem->database()->createFunction(function);\n    }\n\n    void ExplorerDatabaseCategoryTreeItem::ui_refreshCollections()\n    {\n        ExplorerDatabaseTreeItem *databaseItem = ExplorerDatabaseCategoryTreeItem::databaseItem();\n        if (databaseItem) \n            databaseItem->expandCollections();\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.h",
    "content": "#pragma once\n\n#include \"robomongo/gui/widgets/explorer/ExplorerTreeItem.h\"\n\nnamespace Robomongo\n{\n    class ExplorerDatabaseTreeItem;\n\n    enum ExplorerDatabaseCategory\n    {\n        Collections,\n        Functions,\n        Files,\n        Users\n    };\n\n    /*\n    ** Database category Tree Item (looks like folder in the UI)\n    */\n    class ExplorerDatabaseCategoryTreeItem : public ExplorerTreeItem\n    {\n        Q_OBJECT\n    public:\n        typedef ExplorerTreeItem BaseClass;\n        ExplorerDatabaseCategoryTreeItem(ExplorerDatabaseTreeItem *databaseItem, ExplorerDatabaseCategory category);\n        void expand();\n\n    private Q_SLOTS:\n        void ui_createCollection();\n        void ui_addUser();\n        void ui_addFunction();\n        void ui_refreshCollections();    \n        void ui_dbCollectionsStatistics();\n        void ui_refreshUsers();\n        void ui_refreshFunctions();\n        void ui_viewUsers();\n        void ui_viewFunctions();\n\n    private:\n        ExplorerDatabaseTreeItem *databaseItem() const;\n        const ExplorerDatabaseCategory _category;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.cpp",
    "content": "#include \"robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.h\"\n\n#include <QMessageBox>\n#include <QAction>\n#include <QMenu>\n\n#include \"robomongo/core/domain/MongoDatabase.h\"\n#include \"robomongo/core/domain/MongoCollection.h\"\n#include \"robomongo/core/domain/MongoUser.h\"\n#include \"robomongo/core/domain/MongoFunction.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/mongodb/MongoWorker.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/EventBus.h\"\n\n#include \"robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerUserTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerFunctionTreeItem.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n\n\nnamespace\n{\n    void openCurrentDatabaseShell(Robomongo::MongoDatabase *database, const QString &script, bool execute = true, \n                                  const Robomongo::CursorPosition &cursor = Robomongo::CursorPosition())\n    {\n        Robomongo::AppRegistry::instance().app()->openShell(database, script, execute, \n                                                            Robomongo::QtUtils::toQString(database->name()), cursor);\n    }\n}\n\nnamespace Robomongo\n{\n    namespace detail\n    {\n        QString buildName(const QString& text, int count)\n        {\n            if (count == -1)\n                return QString(\"%1 ...\").arg(text);\n\n            return QString(\"%1 (%2)\").arg(text).arg(count);\n        }\n    }\n    ExplorerDatabaseTreeItem::ExplorerDatabaseTreeItem(QTreeWidgetItem *parent, MongoDatabase *const database) :\n        BaseClass(parent),\n        _database(database),\n        _bus(AppRegistry::instance().bus()),\n        _collectionSystemFolderItem(NULL)\n    {\n        auto openDbShellAction = new QAction(\"Open Shell\", this);\n#ifdef __APPLE__\n        openDbShellAction->setIcon(GuiRegistry::instance().mongodbIconForMAC());\n#else\n        openDbShellAction->setIcon(GuiRegistry::instance().mongodbIcon());\n#endif\n        VERIFY(connect(openDbShellAction, SIGNAL(triggered()), SLOT(ui_dbOpenShell())));\n\n        QAction *dbStats = new QAction(\"Database Statistics\", this);\n        VERIFY(connect(dbStats, SIGNAL(triggered()), SLOT(ui_dbStatistics())));\n\n        QAction *dbCurrOps = new QAction(\"Current Operations\", this);\n        VERIFY(connect(dbCurrOps, SIGNAL(triggered()), SLOT(ui_dbCurrentOps())));\n\n        QAction *dbKillOp = new QAction(\"Kill Operation...\", this);\n        VERIFY(connect(dbKillOp, SIGNAL(triggered()), SLOT(ui_dbKillOp())));\n\n        QAction *dbDrop = new QAction(\"Drop Database...\", this);\n        VERIFY(connect(dbDrop, SIGNAL(triggered()), SLOT(ui_dbDrop())));\n\n        QAction *dbRepair = new QAction(\"Repair Database...\", this);\n        VERIFY(connect(dbRepair, SIGNAL(triggered()), SLOT(ui_dbRepair())));\n\n        QAction *refreshDatabase = new QAction(\"Refresh\", this);\n        VERIFY(connect(refreshDatabase, SIGNAL(triggered()), SLOT(ui_refreshDatabase())));\n\n        BaseClass::_contextMenu->addAction(openDbShellAction);\n        BaseClass::_contextMenu->addAction(refreshDatabase);\n        BaseClass::_contextMenu->addSeparator();\n        BaseClass::_contextMenu->addAction(dbStats);\n        BaseClass::_contextMenu->addSeparator();\n        BaseClass::_contextMenu->addAction(dbCurrOps);\n        BaseClass::_contextMenu->addAction(dbKillOp);\n        BaseClass::_contextMenu->addSeparator();\n        BaseClass::_contextMenu->addAction(dbRepair);\n        BaseClass::_contextMenu->addAction(dbDrop);\n\n        _bus->subscribe(this, MongoDatabaseCollectionListLoadedEvent::Type, _database);\n        _bus->subscribe(this, MongoDatabaseUsersLoadedEvent::Type, _database);\n        _bus->subscribe(this, MongoDatabaseFunctionsLoadedEvent::Type, _database);\n        _bus->subscribe(this, MongoDatabaseCollectionsLoadingEvent::Type, _database);\n        _bus->subscribe(this, MongoDatabaseFunctionsLoadingEvent::Type, _database);\n        _bus->subscribe(this, MongoDatabaseUsersLoadingEvent::Type, _database);\n        \n        setText(0, QtUtils::toQString(_database->name()));\n        setIcon(0, GuiRegistry::instance().databaseIcon());\n        setExpanded(false);\n        setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);\n\n        _collectionFolderItem = new ExplorerDatabaseCategoryTreeItem(this, Collections);\n        _collectionFolderItem->setText(0, \"Collections\");\n        _collectionFolderItem->setIcon(0, GuiRegistry::instance().folderIcon());\n        addChild(_collectionFolderItem);\n\n        _functionsFolderItem = new ExplorerDatabaseCategoryTreeItem(this, Functions);\n        _functionsFolderItem->setText(0, \"Functions\");\n        _functionsFolderItem->setIcon(0, GuiRegistry::instance().folderIcon());\n        addChild(_functionsFolderItem);\n\n        _usersFolderItem = new ExplorerDatabaseCategoryTreeItem(this, Users);\n        _usersFolderItem->setText(0, \"Users\");\n        _usersFolderItem->setIcon(0, GuiRegistry::instance().folderIcon());\n        addChild(_usersFolderItem);\n\n        setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);\n    }\n\n    void ExplorerDatabaseTreeItem::expandCollections() { _database->loadCollections(); }\n\n    void ExplorerDatabaseTreeItem::expandUsers() { _database->loadUsers(); }\n\n    void ExplorerDatabaseTreeItem::expandColection(ExplorerCollectionTreeItem *const item)\n    {        \n         _bus->send(_database->server()->worker(), new LoadCollectionIndexesRequest(item, item->collection()->info()));\n    }\n\n    void ExplorerDatabaseTreeItem::dropIndexFromCollection(ExplorerCollectionTreeItem *const item, const std::string &indexName)\n    {\n        _bus->send(_database->server()->worker(), new DropCollectionIndexRequest(item, item->collection()->info(), indexName));\n    }\n\n    void ExplorerDatabaseTreeItem::addEditIndex(\n        ExplorerCollectionTreeItem *const item, const IndexInfo &oldInfo, const IndexInfo &newInfo) const\n    {\n        _bus->send(_database->server()->worker(), new AddEditIndexRequest(item, oldInfo, newInfo));\n    }\n\n    void ExplorerDatabaseTreeItem::expandFunctions()\n    {\n        _database->loadFunctions();\n    }\n\n    void ExplorerDatabaseTreeItem::handle(MongoDatabaseCollectionListLoadedEvent *event)\n    {\n        if (event->isError()) {\n            _collectionFolderItem->setText(0, \"Collections\");\n            _collectionFolderItem->setExpanded(false);\n            return;\n        }\n\n        std::vector<MongoCollection *> collections = event->collections;\n        int count = collections.size();\n        _collectionFolderItem->setText(0, detail::buildName(\"Collections\", count));\n        QtUtils::clearChildItems(_collectionFolderItem);\n\n        // Do not expand, when we do not have collections\n        if (count == 0) {\n            _collectionFolderItem->setExpanded(false);\n            return;\n        }\n\n        _collectionSystemFolderItem = new ExplorerTreeItem(_collectionFolderItem);\n        _collectionSystemFolderItem->setIcon(0, GuiRegistry::instance().folderIcon());\n        _collectionSystemFolderItem->setText(0, \"System\");\n        _collectionFolderItem->addChild(_collectionSystemFolderItem);\n\n        for (int i = 0; i < collections.size(); ++i) {\n            MongoCollection *collection = collections[i];\n\n            if (collection->isSystem()) {\n                addSystemCollectionItem(collection);\n            } else {\n                addCollectionItem(collection);\n            }\n        }\n\n        showCollectionSystemFolderIfNeeded();\n    }\n\n    void ExplorerDatabaseTreeItem::handle(MongoDatabaseUsersLoadedEvent *event)\n    {\n        if (event->isError()) {\n            _usersFolderItem->setText(0, \"Users\");\n            _usersFolderItem->setExpanded(false);\n            return;\n        }\n\n        auto const& users = event->users();\n        _usersFolderItem->setText(0, detail::buildName(\"Users\", users.size()));\n\n        // Do not expand, when we do not have any users\n        if (users.size() == 0)\n            _usersFolderItem->setExpanded(false);\n\n        QtUtils::clearChildItems(_usersFolderItem);\n\n        for(auto const& user : users)\n            addUserItem(event->database(), user);\n    }\n\n    void ExplorerDatabaseTreeItem::handle(MongoDatabaseFunctionsLoadedEvent *event)\n    {\n        if (event->isError()) {\n            _functionsFolderItem->setText(0, \"Functions\");\n            _functionsFolderItem->setExpanded(false);\n            return;\n        }\n\n        std::vector<MongoFunction> functions = event->functions();\n        int count = functions.size();\n        _functionsFolderItem->setText(0,  detail::buildName(\"Functions\", count));\n\n        // Do not expand, when we do not have functions\n        if (count == 0)\n            _functionsFolderItem->setExpanded(false);\n\n        QtUtils::clearChildItems(_functionsFolderItem);\n\n        for (int i = 0; i < functions.size(); ++i) {\n            MongoFunction fun = functions[i];\n            addFunctionItem(event->database(), fun);\n        }\n    }\n\n    void ExplorerDatabaseTreeItem::handle(MongoDatabaseCollectionsLoadingEvent *event)\n    {\n        _collectionFolderItem->setText(0, detail::buildName(\"Collections\", -1));\n    }\n\n    void ExplorerDatabaseTreeItem::handle(MongoDatabaseFunctionsLoadingEvent *event)\n    {\n        _functionsFolderItem->setText(0, detail::buildName(\"Functions\", -1));\n    }\n\n    void ExplorerDatabaseTreeItem::handle(MongoDatabaseUsersLoadingEvent *event)\n    {\n        _usersFolderItem->setText(0, detail::buildName(\"Users\", -1));\n    }\n\n    void ExplorerDatabaseTreeItem::addCollectionItem(MongoCollection *collection)\n    {\n        auto collectionItem = new ExplorerCollectionTreeItem(_collectionFolderItem, this, collection);\n        collectionItem->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);\n        _collectionFolderItem->addChild(collectionItem);\n    }\n\n    void ExplorerDatabaseTreeItem::addSystemCollectionItem(MongoCollection *collection)\n    {\n        auto collectionItem = new ExplorerCollectionTreeItem(_collectionSystemFolderItem, this, collection);\n        collectionItem->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);\n        _collectionSystemFolderItem->addChild(collectionItem);\n    }\n\n    void ExplorerDatabaseTreeItem::showCollectionSystemFolderIfNeeded()\n    {\n        _collectionSystemFolderItem->setHidden(_collectionSystemFolderItem->childCount() == 0);\n    }\n\n    void ExplorerDatabaseTreeItem::addUserItem(MongoDatabase *database, const MongoUser &user)\n    {\n        ExplorerUserTreeItem *userItem = new ExplorerUserTreeItem(_usersFolderItem, database, user);\n        _usersFolderItem->addChild(userItem);\n    }\n\n    void ExplorerDatabaseTreeItem::addFunctionItem(MongoDatabase *database, const MongoFunction &function)\n    {\n        ExplorerFunctionTreeItem *functionItem = new ExplorerFunctionTreeItem(_functionsFolderItem, database, function);\n        _functionsFolderItem->addChild(functionItem);\n    }\n\n    void ExplorerDatabaseTreeItem::ui_refreshDatabase()\n    {\n        expandCollections();\n    }\n\n    void ExplorerDatabaseTreeItem::ui_dbStatistics()\n    {\n        openCurrentDatabaseShell(_database, \"db.stats()\");\n    }\n\n    void ExplorerDatabaseTreeItem::ui_dbCurrentOps()\n    {\n        openCurrentDatabaseShell(_database, \"db.currentOp()\");\n    }\n\n    void ExplorerDatabaseTreeItem::ui_dbKillOp()\n    {\n        openCurrentDatabaseShell(_database, \"db.killOp()\", false, CursorPosition(0, -1));\n    }\n\n    void ExplorerDatabaseTreeItem::ui_dbDrop()\n    {\n        auto const& buff = QString(\"Drop <b>%1</b> database?\").arg(QtUtils::toQString(_database->name()));\n        int const answer = QMessageBox::question(treeWidget(), \"Drop Database\", buff, \n                                                 QMessageBox::Yes, QMessageBox::No, QMessageBox::NoButton);\n        if (answer != QMessageBox::Yes)\n            return;\n\n        _database->server()->dropDatabase(_database->name());\n    }\n\n    void ExplorerDatabaseTreeItem::ui_dbRepair()\n    {\n        auto const& buff = QString(\"Repair <b>%1</b> database?\").arg(QtUtils::toQString(_database->name()));\n        int const answer = QMessageBox::question(treeWidget(), \"Repair Database\", buff,\n                                                 QMessageBox::Yes, QMessageBox::No, QMessageBox::NoButton);\n        if (answer != QMessageBox::Yes)\n            return;\n\n        openCurrentDatabaseShell(_database, \"db.repairDatabase()\", false);\n    }\n\n    void ExplorerDatabaseTreeItem::ui_dbOpenShell()\n    {\n        openCurrentDatabaseShell(_database, \"\");\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.h",
    "content": "#pragma once\n\n#include \"robomongo/gui/widgets/explorer/ExplorerTreeItem.h\"\n\nnamespace Robomongo\n{\n    namespace detail\n    {\n        QString buildName(const QString& text, int count);\n    }\n\n    class ExplorerCollectionTreeItem;\n    class ExplorerDatabaseCategoryTreeItem;\n    class EventBus;\n    class MongoDatabaseCollectionListLoadedEvent;\n    class MongoDatabaseUsersLoadedEvent;\n    class MongoDatabaseFunctionsLoadedEvent;\n    class MongoDatabaseCollectionsLoadingEvent;\n    class MongoDatabaseFunctionsLoadingEvent;\n    class MongoDatabaseUsersLoadingEvent;\n    class MongoDatabase;\n    class MongoUser;\n    class MongoFunction;\n    class MongoCollection;\n    struct IndexInfo;\n\n    class ExplorerDatabaseTreeItem : public ExplorerTreeItem\n    {\n        Q_OBJECT\n\n    public:\n        typedef ExplorerTreeItem BaseClass;\n        ExplorerDatabaseTreeItem(QTreeWidgetItem *parent, MongoDatabase *const database);\n\n        MongoDatabase *database() const { return _database; }\n        void expandCollections();\n        void expandUsers();\n        void expandFunctions();\n        void expandColection(ExplorerCollectionTreeItem *const item);\n        void dropIndexFromCollection(ExplorerCollectionTreeItem *const item, const std::string &indexName);\n        void addEditIndex(ExplorerCollectionTreeItem *const item, \n                          const IndexInfo &oldInfo, const IndexInfo &newInfo) const;\n\n    public Q_SLOTS:\n        void handle(MongoDatabaseCollectionListLoadedEvent *event);\n        void handle(MongoDatabaseUsersLoadedEvent *event);\n        void handle(MongoDatabaseFunctionsLoadedEvent *event);\n        void handle(MongoDatabaseCollectionsLoadingEvent *event);\n        void handle(MongoDatabaseFunctionsLoadingEvent *event);\n        void handle(MongoDatabaseUsersLoadingEvent *event);\n\n    private Q_SLOTS:\n        void ui_dbStatistics();\n        void ui_dbCurrentOps();\n        void ui_dbKillOp();\n        void ui_dbDrop();\n        void ui_dbRepair();\n        void ui_dbOpenShell();\n        void ui_refreshDatabase();\n\n    private:\n        void addCollectionItem(MongoCollection *collection);\n        void addSystemCollectionItem(MongoCollection *collection);\n        void showCollectionSystemFolderIfNeeded();\n\n        void addUserItem(MongoDatabase *database, const MongoUser &user);\n        void addFunctionItem(MongoDatabase *database, const MongoFunction &function);\n\n        EventBus *_bus;\n        ExplorerDatabaseCategoryTreeItem *_collectionFolderItem;\n        ExplorerDatabaseCategoryTreeItem *_functionsFolderItem;\n        ExplorerDatabaseCategoryTreeItem *_usersFolderItem;\n        ExplorerTreeItem *_collectionSystemFolderItem;\n        MongoDatabase *const _database;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerFunctionTreeItem.cpp",
    "content": "#include \"robomongo/gui/widgets/explorer/ExplorerFunctionTreeItem.h\"\n\n#include <QAction>\n#include <QMenu>\n\n#include \"robomongo/gui/dialogs/FunctionTextEditor.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/utils/DialogUtils.h\"\n\n#include \"robomongo/core/domain/MongoDatabase.h\"\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace Robomongo\n{\n\n    ExplorerFunctionTreeItem::ExplorerFunctionTreeItem(QTreeWidgetItem *parent, MongoDatabase *database, \n                                                       const MongoFunction &function) :\n        BaseClass(parent),\n        _function(function),\n        _database(database)\n    {\n        QAction *dropFunction = new QAction(\"Remove Function\", this);\n        VERIFY(connect(dropFunction, SIGNAL(triggered()), SLOT(ui_dropFunction())));\n\n        QAction *editFunction = new QAction(\"Edit Function\", this);\n        VERIFY(connect(editFunction, SIGNAL(triggered()), SLOT(ui_editFunction())));\n\n        BaseClass::_contextMenu->addAction(editFunction);\n        BaseClass::_contextMenu->addAction(dropFunction);\n\n        setText(0, QtUtils::toQString(_function.name()));\n        setIcon(0, GuiRegistry::instance().functionIcon());\n        setToolTip(0, buildToolTip(_function));\n        setExpanded(false);\n    }\n\n    QString ExplorerFunctionTreeItem::buildToolTip(const MongoFunction &function)\n    {\n        return QString(\"%0\").arg(QtUtils::toQString(function.name()));\n    }\n\n    void ExplorerFunctionTreeItem::ui_editFunction()\n    {\n        std::string name = _function.name();\n\n        FunctionTextEditor dlg(QString::fromStdString(_database->server()->connectionRecord()->getFullAddress()),\n                               QString::fromStdString(_database->name()), _function);\n        dlg.setWindowTitle(\"Edit Function\");\n\n        if (dlg.exec() == QDialog::Accepted) {\n            MongoFunction editedFunction = dlg.function();\n            _database->updateFunction(name, editedFunction);\n        }\n    }\n\n    void ExplorerFunctionTreeItem::ui_dropFunction()\n    {\n        // Ask user\n        int answer = utils::questionDialog(treeWidget(), \"Drop\", \"Function\", QtUtils::toQString(_function.name()));\n\n        if (answer != QMessageBox::Yes)\n            return;\n\n        _database->dropFunction(_function.name());\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerFunctionTreeItem.h",
    "content": "#pragma once\n\n#include \"robomongo/core/domain/MongoFunction.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerTreeItem.h\"\n\nnamespace Robomongo\n{\n    class MongoDatabase;\n\n    class ExplorerFunctionTreeItem :public ExplorerTreeItem\n    {\n        Q_OBJECT\n    public:\n        typedef ExplorerTreeItem BaseClass;\n        ExplorerFunctionTreeItem(QTreeWidgetItem *parent, MongoDatabase *database, const MongoFunction &function);\n        MongoFunction function() const { return _function; }\n        MongoDatabase *database() const { return _database; }\n\n    private Q_SLOTS:\n        void ui_editFunction();        \n        void ui_dropFunction();\n\n    private:\n        QString buildToolTip(const MongoFunction &function);\n        MongoFunction _function;\n        MongoDatabase *_database;\n    };\n}\n\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerReplicaSetFolderItem.cpp",
    "content": "#include \"robomongo/gui/widgets/explorer/ExplorerReplicaSetFolderItem.h\"\n\n#include <QAction>\n#include <QMenu>\n\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/settings/ReplicaSetSettings.h\"\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/EventBus.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/utils/Logger.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n\nnamespace\n{\n    void openCurrentServerShell(Robomongo::MongoServer *const server, const QString &script, bool execute = true, \n                                const Robomongo::CursorPosition &cursor = Robomongo::CursorPosition())\n    {\n        Robomongo::AppRegistry::instance().app()->openShell(server, script, std::string(), execute, \n            Robomongo::QtUtils::toQString(server->connectionRecord()->getReadableName()), cursor);\n    }\n\n    void openCurrentServerShell(Robomongo::MongoServer* server, Robomongo::ConnectionSettings* connSettings,\n                                const QString &script)\n    {\n        Robomongo::AppRegistry::instance().app()->openShell(server, connSettings, Robomongo::ScriptInfo(script, true));\n    }\n}\n\nnamespace Robomongo\n{\n\n    ExplorerReplicaSetFolderItem::ExplorerReplicaSetFolderItem(ExplorerTreeItem *parent, MongoServer *const server) :\n        BaseClass(parent), _server(server)\n    {\n        auto repSetStatus = new QAction(\"Status of Replica Set\", this);\n        VERIFY(connect(repSetStatus, SIGNAL(triggered()), SLOT(on_repSetStatus())));\n\n        auto refresh = new QAction(\"Refresh\", this);\n        VERIFY(connect(refresh, SIGNAL(triggered()), SLOT(on_refresh())));\n\n        BaseClass::_contextMenu->addAction(repSetStatus);\n        BaseClass::_contextMenu->addSeparator();\n        BaseClass::_contextMenu->addAction(refresh);\n\n        AppRegistry::instance().bus()->subscribe(this, ReplicaSetFolderLoading::Type, _server);\n\n        setIcon(0, GuiRegistry::instance().folderIcon());\n        setText(0, \"Replica Set (\" + QString::number(_server->replicaSetInfo()->membersAndHealths.size()) + \" nodes)\");\n\n        setExpanded(false);\n        setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);\n    }\n\n    void ExplorerReplicaSetFolderItem::updateText()\n    {\n        setText(0, \"Replica Set (\" + QString::number(_server->replicaSetInfo()->membersAndHealths.size()) + \" nodes)\");\n    }\n\n    void ExplorerReplicaSetFolderItem::disableSomeContextMenuActions()\n    {\n        if (BaseClass::_contextMenu->actions().size() < 1)\n            return;\n\n        // Find out if there is at least one reachable member  \n        mongo::HostAndPort onlineMember;\n        for (auto const& member : _server->replicaSetInfo()->membersAndHealths) {\n            if (member.second) {\n                onlineMember = mongo::HostAndPort(member.first);\n                break;\n            }\n        }\n\n        // Show menu item \"Status of Replica Set\" only if there is at least one reachable member\n        // If there is no reachable member, disable it.\n        BaseClass::_contextMenu->actions().at(0)->setDisabled(onlineMember.empty());\n    }\n\n    void ExplorerReplicaSetFolderItem::expand()\n    {\n        if (!_refreshFlag) {\n            _refreshFlag = true;\n            return;\n        }\n\n        _server->tryRefreshReplicaSetFolder(true);\n    }\n\n    void ExplorerReplicaSetFolderItem::on_repSetStatus()\n    {\n        if (!_server->replicaSetInfo()->primary.empty()) {\n            openCurrentServerShell(_server, \"rs.status()\");\n        }\n        else // Primary is unreachable, try to find and run rs.status on a reachable secondary\n        {\n            mongo::HostAndPort onlineMember;\n            for (auto const& member : _server->replicaSetInfo()->membersAndHealths) {\n                if (member.second) {\n                    onlineMember = mongo::HostAndPort(member.first);\n                    break;\n                }\n            }\n\n            if (onlineMember.empty()) {\n                LOG_MSG(\"Unable to find a reachable replica set member to run rs.status().\", \n                        mongo::logger::LogSeverity::Error());\n                return;\n            }\n\n            auto connSetting = std::unique_ptr<ConnectionSettings>(_server->connectionRecord()->clone());\n            // Set connection settings of this replica member\n            connSetting->setConnectionName(onlineMember.toString() + \n                                           \" [member of \" + connSetting->connectionName() + \"]\");\n            connSetting->setServerHost(onlineMember.host());\n            connSetting->setServerPort(onlineMember.port());\n            connSetting->setReplicaSet(false);\n            connSetting->replicaSetSettings()->setMembers(std::vector<std::string>()); \n\n            openCurrentServerShell(_server, connSetting.get(), \"rs.status()\");\n        }\n    }\n\n    void ExplorerReplicaSetFolderItem::handle(ReplicaSetFolderLoading *event)\n    {\n        setText(0, \"Replica Set ...\");\n    }\n\n    void ExplorerReplicaSetFolderItem::on_refresh()\n    {\n        _server->tryRefreshReplicaSetFolder(true);\n    }\n}\n\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerReplicaSetFolderItem.h",
    "content": "#pragma once\n\n#include \"robomongo/gui/widgets/explorer/ExplorerTreeItem.h\"\n\nnamespace Robomongo\n{\n    class MongoServer;\n    struct ReplicaSetFolderLoading;\n\n    class ExplorerReplicaSetFolderItem : public ExplorerTreeItem\n    {\n        Q_OBJECT\n\n    public:\n        using BaseClass = ExplorerTreeItem;\n\n        ExplorerReplicaSetFolderItem(ExplorerTreeItem *item, MongoServer *const server);\n\n        void updateText();\n        void disableSomeContextMenuActions();\n        void expand();\n        void setRefreshFlag(bool state) { _refreshFlag = state; }\n        bool refreshFlag() const { return _refreshFlag; }\n\n    private Q_SLOTS:\n        void on_refresh();\n        void on_repSetStatus();\n\n        void handle(ReplicaSetFolderLoading *event);\n\n    private:\n        MongoServer *const _server = nullptr;\n        bool _refreshFlag = true;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.cpp",
    "content": "#include \"robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.h\"\n\n#include <QAction>\n#include <QMenu>\n#include <QMessageBox>\n#include <QString>\n\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/domain/MongoDatabase.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/settings/ReplicaSetSettings.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/EventBus.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.h\"\n#include \"robomongo/gui/dialogs/CreateDatabaseDialog.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n\n\nnamespace\n{\n     void openCurrentServerShell(Robomongo::MongoServer* server, Robomongo::ConnectionSettings* connSettings, \n                                 const QString &script)\n     {\n         auto const scriptStr = Robomongo::ScriptInfo(script, true);\n         Robomongo::AppRegistry::instance().app()->openShell(server, connSettings, scriptStr);\n     }\n}\n\nnamespace Robomongo\n{\n    ExplorerReplicaSetTreeItem::ExplorerReplicaSetTreeItem(QTreeWidgetItem *parent, MongoServer *const server, \n        const mongo::HostAndPort& repMemberHostAndPort, const bool isPrimary, const bool isUp)\n        : \n        BaseClass(parent),\n        _repMemberHostAndPort(repMemberHostAndPort),\n        _isPrimary(isPrimary),\n        _isUp(isUp),\n        _server(server),\n        _connSettings(server->connectionRecord()->clone()),\n        _bus(AppRegistry::instance().bus())\n    { \n        // Set connection settings of this replica member\n        _connSettings->setConnectionName(_repMemberHostAndPort.toString() + \" [member of \" + _connSettings->connectionName() + \"]\");\n        _connSettings->setServerHost(_repMemberHostAndPort.host());\n        _connSettings->setServerPort(_repMemberHostAndPort.port());\n        _connSettings->setReplicaSet(false);  \n        _connSettings->replicaSetSettings()->deleteAllMembers();\n\n        // Add Actions\n        auto openShellAction = new QAction(\"Open Shell\", this);\n#ifdef __APPLE__\n        openShellAction->setIcon(GuiRegistry::instance().mongodbIconForMAC());\n#else\n        openShellAction->setIcon(GuiRegistry::instance().mongodbIcon());\n#endif\n        VERIFY(connect(openShellAction, SIGNAL(triggered()), SLOT(ui_openShell())));\n\n        auto openDirectConnection = new QAction(\"Open Direct Connection\", this);\n        VERIFY(connect(openDirectConnection, SIGNAL(triggered()), SLOT(ui_openDirectConnection())));\n\n        auto serverStatus = new QAction(\"Server Status\", this);\n        VERIFY(connect(serverStatus, SIGNAL(triggered()), SLOT(ui_serverStatus())));\n\n        auto serverVersion = new QAction(\"MongoDB Version\", this);\n        VERIFY(connect(serverVersion, SIGNAL(triggered()), SLOT(ui_serverVersion())));\n\n        auto serverHostInfo = new QAction(\"Host Info\", this);\n        VERIFY(connect(serverHostInfo, SIGNAL(triggered()), SLOT(ui_serverHostInfo())));        \n\n        auto showLog = new QAction(\"Show Log\", this);\n        VERIFY(connect(showLog, SIGNAL(triggered()), SLOT(ui_showLog()))); \n\n        BaseClass::_contextMenu->addAction(openShellAction);\n        BaseClass::_contextMenu->addAction(openDirectConnection);\n        BaseClass::_contextMenu->addSeparator();\n        BaseClass::_contextMenu->addAction(serverStatus);\n        BaseClass::_contextMenu->addAction(serverHostInfo);\n        BaseClass::_contextMenu->addAction(serverVersion);\n        BaseClass::_contextMenu->addSeparator();\n        BaseClass::_contextMenu->addAction(showLog);\n\n        updateTextAndIcon(_isUp, _isPrimary);\n\n        setExpanded(true);\n        setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicator);\n    }\n\n    void ExplorerReplicaSetTreeItem::updateTextAndIcon(bool isUp, bool isPrimary)\n    {\n        _isUp = isUp;\n        _isPrimary = isPrimary;\n\n        QString stateStr(\"[Unknown]\");\n        if (_isUp)\n            stateStr = _isPrimary ? \"[Primary]\" : \"[Secondary]\";\n        else\n            stateStr = \"[Not Reachable]\";\n\n        setDisabled(_isUp ? false : true);\n        setText(0, QString::fromStdString(_repMemberHostAndPort.toString()) + \" \" + stateStr);\n        setIcon(0, _isPrimary ? GuiRegistry::instance().serverPrimaryIcon()                               \n                              : GuiRegistry::instance().serverSecondaryIcon());\n    }\n\n    void ExplorerReplicaSetTreeItem::ui_serverHostInfo()\n    {\n        openCurrentServerShell(_server, _connSettings.get(), \"db.hostInfo()\");\n    }\n\n    void ExplorerReplicaSetTreeItem::ui_serverStatus()\n    {\n        openCurrentServerShell(_server, _connSettings.get(), \"db.serverStatus()\");\n    }\n\n    void ExplorerReplicaSetTreeItem::ui_serverVersion()\n    {\n        openCurrentServerShell(_server, _connSettings.get(), \"db.version()\");\n    }\n\n    void ExplorerReplicaSetTreeItem::ui_showLog()\n    {\n        openCurrentServerShell(_server, _connSettings.get(), \"show log\");\n    }\n\n    void ExplorerReplicaSetTreeItem::ui_openShell()\n    {\n        openCurrentServerShell(_server, _connSettings.get(), \"\");\n    }\n\n    void ExplorerReplicaSetTreeItem::ui_openDirectConnection()\n    {\n        AppRegistry::instance().app()->openServer(_connSettings.get(), ConnectionPrimary);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.h",
    "content": "#pragma once\n\n#include \"robomongo/core/events/MongoEvents.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerTreeItem.h\"\n\nnamespace Robomongo\n{\n    class EventBus;\n    class MongoServerLoadingDatabasesEvent;\n\n    class ExplorerReplicaSetTreeItem : public ExplorerTreeItem\n    {\n        Q_OBJECT\n\n    public:\n        using BaseClass = ExplorerTreeItem;\n\n        /*\n        ** Constructs ExplorerReplicaSetTreeItem\n        */\n        ExplorerReplicaSetTreeItem(QTreeWidgetItem *parent, MongoServer *const server, const mongo::HostAndPort& repMemberHostAndPort,\n                                   const bool isPrimary, const bool isUp);\n\n        /**\n        * @brief Updates this widget's text and icon\n        * @param isUp: true if this set member is reachable, false otherwise\n        * @param isPrimary: true if this set member is primary, false otherwise\n        */\n        void updateTextAndIcon(bool isUp, bool isPrimary);\n\n        // Getters\n        ConnectionSettings* connectionSettings() { return _connSettings.get(); }\n        bool isUp() const { return _isUp; }\n        MongoServer* server() const { return _server; }\n\n    private Q_SLOTS:\n        void ui_openShell();\n        void ui_openDirectConnection();\n        void ui_serverHostInfo();\n        void ui_serverStatus();\n        void ui_serverVersion();\n        void ui_showLog();\n\n    private:\n        mongo::HostAndPort _repMemberHostAndPort;\n        \n        bool _isPrimary;    // true if this set member is primary, false otherwise\n        bool _isUp;         // true if this set member is reachable, false otherwise\n\n        MongoServer *const _server;\n        std::unique_ptr<ConnectionSettings> _connSettings;\n        EventBus *_bus; // todo: remove?\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerServerTreeItem.cpp",
    "content": "#include \"robomongo/gui/widgets/explorer/ExplorerServerTreeItem.h\"\n\n#include <QAction>\n#include <QMenu>\n#include <QMessageBox>\n\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/domain/MongoDatabase.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/settings/ReplicaSetSettings.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/EventBus.h\"\n#include \"robomongo/core/utils/Logger.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerReplicaSetFolderItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.h\"\n#include \"robomongo/gui/dialogs/CreateDatabaseDialog.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n\n\nnamespace\n{\n     void openCurrentServerShell(Robomongo::MongoServer *const server, const QString &script, bool execute = true, \n                                 const Robomongo::CursorPosition &cursor = Robomongo::CursorPosition())\n     {\n         QString const connName = Robomongo::QtUtils::toQString(server->connectionRecord()->getReadableName());\n         Robomongo::AppRegistry::instance().app()->openShell(server, script, std::string(), execute, connName, cursor);\n     }\n}\n\nnamespace Robomongo\n{\n    ExplorerServerTreeItem::ExplorerServerTreeItem(QTreeWidget *view, MongoServer *const server, ConnectionInfo connInfo)\n        : BaseClass(view), _server(server), _bus(AppRegistry::instance().bus()), _replicaSetFolder(nullptr),\n        _primaryWasUnreachable(false), _systemFolder(nullptr)\n    {\n        auto openShellAction = new QAction(\"Open Shell\", this);        \n#ifdef __APPLE__\n        openShellAction->setIcon(GuiRegistry::instance().mongodbIconForMAC());\n#else\n        openShellAction->setIcon(GuiRegistry::instance().mongodbIcon());\n#endif\n        VERIFY(connect(openShellAction, SIGNAL(triggered()), SLOT(ui_openShell())));\n\n        QAction *refreshServer = new QAction(\"Refresh\", this);\n        VERIFY(connect(refreshServer, SIGNAL(triggered()), SLOT(ui_refreshServer())));\n\n        QAction *createDatabase = new QAction(\"Create Database\", this);\n        VERIFY(connect(createDatabase, SIGNAL(triggered()), SLOT(ui_createDatabase())));\n\n        QAction *serverStatus = new QAction(\"Server Status\", this);\n        VERIFY(connect(serverStatus, SIGNAL(triggered()), SLOT(ui_serverStatus())));\n\n        QAction *serverVersion = new QAction(\"MongoDB Version\", this);\n        VERIFY(connect(serverVersion, SIGNAL(triggered()), SLOT(ui_serverVersion())));\n\n        QAction *serverHostInfo = new QAction(\"Host Info\", this);\n        VERIFY(connect(serverHostInfo, SIGNAL(triggered()), SLOT(ui_serverHostInfo())));\n\n        QAction *showLog = new QAction(\"Show Log\", this);\n        VERIFY(connect(showLog, SIGNAL(triggered()), SLOT(ui_showLog())));\n\n        QAction *disconnectAction = new QAction(\"Disconnect\", this);\n        disconnectAction->setIconText(\"Disconnect\");\n        VERIFY(connect(disconnectAction, SIGNAL(triggered()), SLOT(ui_disconnectServer())));\n\n        BaseClass::_contextMenu->addAction(openShellAction);\n        BaseClass::_contextMenu->addAction(refreshServer);\n        BaseClass::_contextMenu->addSeparator();\n        BaseClass::_contextMenu->addAction(createDatabase);\n        BaseClass::_contextMenu->addAction(serverStatus);\n        BaseClass::_contextMenu->addAction(serverHostInfo);\n        BaseClass::_contextMenu->addAction(serverVersion);\n        BaseClass::_contextMenu->addSeparator();\n        BaseClass::_contextMenu->addAction(showLog);\n        BaseClass::_contextMenu->addAction(disconnectAction);\n\n        _bus->subscribe(this, DatabaseListLoadedEvent::Type, _server);\n        _bus->subscribe(this, MongoServerLoadingDatabasesEvent::Type, _server);\n        _bus->subscribe(this, ReplicaSetFolderRefreshed::Type, _server);\n        _bus->subscribe(this, ConnectionEstablishedEvent::Type, _server);\n        _bus->subscribe(this, ConnectionFailedEvent::Type, _server);\n\n        setText(0, buildServerName());\n        setIcon(0, _server->connectionRecord()->isReplicaSet() ? GuiRegistry::instance().replicaSetIcon()\n                                                               : GuiRegistry::instance().serverIcon());\n        setExpanded(true);\n        setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);\n\n        if (_server->connectionRecord()->isReplicaSet()) {\n            buildReplicaSetFolder(false);\n            buildDatabaseItems();\n        }\n    }\n\n    void ExplorerServerTreeItem::expand()\n    {\n        if (_server->connectionRecord()->isReplicaSet()) {\n            // do nothing since replica set refresh/reload can take very long times.\n        }\n        else {  // single server\n            _server->loadDatabases();\n        }\n    }\n\n    void ExplorerServerTreeItem::disableSomeContextMenuActions(bool disable)\n    {\n        if (BaseClass::_contextMenu->actions().size() < 10 || \n            !_server->connectionRecord()->isReplicaSet())\n            return;\n\n        // [1]:Refresh and [9]:Disconnect are always enabled\n        BaseClass::_contextMenu->actions().at(0)->setDisabled(disable);\n        BaseClass::_contextMenu->actions().at(2)->setDisabled(disable);\n        BaseClass::_contextMenu->actions().at(3)->setDisabled(disable);\n        BaseClass::_contextMenu->actions().at(4)->setDisabled(disable);\n        BaseClass::_contextMenu->actions().at(5)->setDisabled(disable);\n        BaseClass::_contextMenu->actions().at(6)->setDisabled(disable);\n        BaseClass::_contextMenu->actions().at(8)->setDisabled(disable);\n    }\n\n    void ExplorerServerTreeItem::databaseRefreshed(const QList<MongoDatabase *> &dbs)\n    {\n        int count = dbs.count();\n        setText(0, buildServerName(&count));\n\n        // Delete system folder and database items\n        QtUtils::clearChildItems(this);\n\n        // Add 'System' folder\n        QIcon folderIcon = GuiRegistry::instance().folderIcon();\n        _systemFolder = new ExplorerTreeItem(this);\n        _systemFolder->setIcon(0, folderIcon);\n        _systemFolder->setText(0, \"System\");\n        addChild(_systemFolder);\n\n        for (int i = 0; i < dbs.size(); i++)\n        {\n            MongoDatabase *database = dbs.at(i);\n\n            if (database->isSystem()) {\n                auto dbItem = new ExplorerDatabaseTreeItem(_systemFolder, database);\n                _systemFolder->addChild(dbItem);\n                continue;\n            }\n\n            auto dbItem = new ExplorerDatabaseTreeItem(this, database);\n            addChild(dbItem);\n        }\n\n        // Show 'System' folder only if it has items\n        _systemFolder->setHidden(_systemFolder->childCount() == 0);\n    }\n\n    void ExplorerServerTreeItem::handle(DatabaseListLoadedEvent *event)\n    {\n        if (event->isError()) {\n            setText(0, buildServerName(0));     // Restore normal name (without \"...\")\n\n            if (!_server->connectionRecord()->isReplicaSet())\n                setExpanded(false);                 // Collapse\n\n            // We should clear all child items, but we are not\n            // doing this, because of incorrect \"senders\" for messages\n            // that are going to Worker thread. Yes, some guy specified UI objects\n            // as senders. If we delete these UI objects, response will crash the app\n            // (because QObject::thread() is used to get thread of the QObject)\n            // QtUtils::clearChildItems(this);\n\n            std::stringstream ss;\n            ss << \"Cannot load list of databases.\\n\\nError:\\n\"\n                << event->error().errorMessage();\n\n            QMessageBox::information(NULL, \"Error\", QtUtils::toQString(ss.str()));\n            return;\n        }\n\n        databaseRefreshed(event->list);\n    }\n\n    void ExplorerServerTreeItem::handle(MongoServerLoadingDatabasesEvent *event)\n    {\n        int count = -1;\n        setText(0, buildServerName(&count));\n    }\n\n    void ExplorerServerTreeItem::handle(ReplicaSetFolderRefreshed *event)\n    {\n        buildReplicaSetFolder(event->expanded);    // Rebuild replica set folder in any case\n\n        // ---Primary is unreachable\n        if (event->isError()) {\n            replicaSetPrimaryUnreachable();\n            disableSomeContextMenuActions(true);\n\n            if (event->error().showErrorWindow()) {\n                std::string const errorStr = \"Replica set's primary is unreachable.\\n\\nReason:\\n\"\n                                             \"Connection failure. \" + event->error().errorMessage();\n                QMessageBox::critical(nullptr, \"Error\", QString::fromStdString(errorStr));\n            }\n            return;\n        }\n\n        // --- Primary is reachable\n        if (_primaryWasUnreachable)    // Rebuild db items only when primary was unreachable previously.\n            _server->loadDatabases();\n\n        replicaSetPrimaryReachable();\n    }\n\n    void ExplorerServerTreeItem::handle(ConnectionEstablishedEvent *event)\n    {\n        if (!_server->connectionRecord()->isReplicaSet() || \n            ConnectionType::ConnectionRefresh != event->connectionType)\n            return;\n\n        if (_primaryWasUnreachable)\n            replicaSetPrimaryReachable();\n\n        setIcon(0, GuiRegistry::instance().replicaSetIcon());\n        buildReplicaSetServerItem();\n    }\n\n    void ExplorerServerTreeItem::handle(ConnectionFailedEvent *event)\n    {\n        if (!_server->connectionRecord()->isReplicaSet() ||\n            ConnectionType::ConnectionRefresh != event->connectionType)\n            return;\n\n        buildReplicaSetFolder(true);\n        replicaSetPrimaryUnreachable();\n\n        QMessageBox::critical(nullptr, \"Error\", QString::fromStdString(event->message));\n    }\n\n    QString ExplorerServerTreeItem::buildServerName(int *count /* = NULL */, bool online /* = true*/)\n    {\n        QString name = QtUtils::toQString(_server->connectionRecord()->getReadableName());\n\n        if (!count)\n            return name;\n\n        if (*count == -1)\n            return name + \" ...\";\n\n        return online ? QString(\"%1 (%2)\").arg(name).arg(*count) \n                      : QString(\"%1\").arg(name) + \" [Offline]\";\n    }\n\n    void ExplorerServerTreeItem::ui_serverHostInfo()\n    {\n        openCurrentServerShell(_server, \"db.hostInfo()\");\n    }\n\n    void ExplorerServerTreeItem::ui_serverStatus()\n    {\n        openCurrentServerShell(_server, \"db.serverStatus()\");\n    }\n\n    void ExplorerServerTreeItem::ui_serverVersion()\n    {\n        openCurrentServerShell(_server, \"db.version()\");\n    }\n\n    void ExplorerServerTreeItem::ui_showLog()\n    {\n        openCurrentServerShell(_server, \"show log\");\n    }\n\n    void ExplorerServerTreeItem::ui_openShell()\n    {\n        openCurrentServerShell(_server, \"\");\n    }\n\n    void ExplorerServerTreeItem::ui_disconnectServer()\n    {\n        auto *view = dynamic_cast<QTreeWidget *>(BaseClass::treeWidget());\n        if (!view)\n            return;\n\n        int index = view->indexOfTopLevelItem(this);\n        if (index == -1)\n            return;\n\n        QTreeWidgetItem *removedItem = view->takeTopLevelItem(index);\n        if (!removedItem)\n            return;\n\n        AppRegistry::instance().app()->closeServer(_server);\n        delete removedItem;\n    }\n\n    void ExplorerServerTreeItem::ui_refreshServer()\n    {\n        if (_server->connectionRecord()->isReplicaSet()) {\n            int count = -1;\n            setText(0, buildServerName(&count));    // Append \"...\" into root item text\n            _server->tryRefreshReplicaSetConnection();\n        }\n        else {  // single server\n            expand();\n        }\n    }\n\n    void ExplorerServerTreeItem::ui_createDatabase()\n    {\n        CreateDatabaseDialog dlg(QString::fromStdString(_server->connectionRecord()->getFullAddress()),\n                                 QString(), QString(), treeWidget());\n        dlg.setOkButtonText(\"&Create\");\n        dlg.setInputLabelText(\"Database Name:\");\n\n        if (dlg.exec() == QDialog::Accepted) {\n            if (_server->connectionRecord()->isReplicaSet()) {  // Replica Set\n                auto newDb = new MongoDatabase(_server, dlg.databaseName().toStdString());\n                _server->addDatabase(newDb);\n                int dbCount = _server->databases().count();\n                setText(0, buildServerName(&dbCount));\n                auto dbItem = new ExplorerDatabaseTreeItem(this, newDb);\n                addChild(dbItem);\n                LOG_MSG(\"Database \\'\" + newDb->name() + \"\\' created.\", mongo::logger::LogSeverity::Info());\n            }\n            else {  // single server\n                _server->createDatabase(QtUtils::toStdStringSafe(dlg.databaseName()));\n            }\n        }\n    }\n    \n    void ExplorerServerTreeItem::buildReplicaSetServerItem()\n    {\n        // Delete all children (replica set folder, system folder and database items)\n        QtUtils::clearChildItems(this);  \n        _replicaSetFolder = nullptr;\n\n        buildReplicaSetFolder(false);\n        buildDatabaseItems();\n    }\n    \n    void ExplorerServerTreeItem::buildReplicaSetFolder(bool expanded)\n    {\n        if (_replicaSetFolder) {    // delete and rebuild existing folder child items\n            if (_replicaSetFolder->childCount() > 0)\n                QtUtils::clearChildItems(_replicaSetFolder);\n\n            _replicaSetFolder->updateText();\n        }\n        else {                      // build folder from scratch\n            _replicaSetFolder = new ExplorerReplicaSetFolderItem(this, _server);\n            addChild(_replicaSetFolder);\n        }\n\n        // Add replica set members\n        bool isPrimary;\n        for (auto const& memberAndHealth : _server->replicaSetInfo()->membersAndHealths)\n        {\n            isPrimary = _server->replicaSetInfo()->primary.toString() == memberAndHealth.first;\n            auto const& hostAndPort = mongo::HostAndPort(mongo::StringData(memberAndHealth.first));\n            _replicaSetFolder->addChild(new ExplorerReplicaSetTreeItem(_replicaSetFolder, _server, hostAndPort,\n                                                                        isPrimary, memberAndHealth.second));\n        }\n\n        _replicaSetFolder->setRefreshFlag(false);\n        _replicaSetFolder->setExpanded(expanded);\n        _replicaSetFolder->setRefreshFlag(true);\n    }\n\n    void ExplorerServerTreeItem::buildDatabaseItems()\n    {\n        int dbCount = _server->databases().count();\n        setText(0, buildServerName(&dbCount));\n\n        // Add 'System' folder\n        _systemFolder = new ExplorerTreeItem(this);\n        _systemFolder->setIcon(0, GuiRegistry::instance().folderIcon());\n        _systemFolder->setText(0, \"System\");\n        addChild(_systemFolder);\n\n        for (auto const& database : _server->databases()) {\n            if (database->isSystem()) {\n                auto dbItem = new ExplorerDatabaseTreeItem(_systemFolder, database);\n                _systemFolder->addChild(dbItem);\n                continue;\n            }\n\n            auto dbItem = new ExplorerDatabaseTreeItem(this, database);\n            addChild(dbItem);\n        }\n\n        // Show 'System' folder only if it has items\n        _systemFolder->setHidden(_systemFolder->childCount() == 0);\n    }\n\n    void ExplorerServerTreeItem::replicaSetPrimaryReachable()\n    {\n        _primaryWasUnreachable = false;\n        disableSomeContextMenuActions(false);\n        _replicaSetFolder->disableSomeContextMenuActions();\n    }\n\n    void ExplorerServerTreeItem::replicaSetPrimaryUnreachable()\n    {\n        _primaryWasUnreachable = true;\n        disableSomeContextMenuActions(true);\n        _replicaSetFolder->disableSomeContextMenuActions();\n\n        int dbCount = 0;\n        setText(0, buildServerName(&dbCount, false));\n        setIcon(0, GuiRegistry::instance().replicaSetOfflineIcon());\n\n        // For system folder and database items - delete children then set disable\n        QtUtils::clearChildItems(_systemFolder);\n        _systemFolder->setDisabled(true);\n        for (int i = 0; i < childCount(); ++i)  {\n            auto dbItem = dynamic_cast<ExplorerDatabaseTreeItem*>(child(i));\n            if (dbItem) {\n                QtUtils::clearChildItems(dbItem);\n                dbItem->setDisabled(true);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerServerTreeItem.h",
    "content": "#pragma once\n\n#include \"robomongo/core/events/MongoEvents.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerTreeItem.h\"\n\nnamespace Robomongo\n{\n    class EventBus;\n    class MongoServerLoadingDatabasesEvent;\n    class ExplorerReplicaSetFolderItem;\n    class ExplorerTreeItem;\n\n    class ExplorerServerTreeItem : public ExplorerTreeItem\n    {\n        Q_OBJECT\n\n    public:\n        typedef ExplorerTreeItem BaseClass;\n\n        /*\n        ** Constructs ExplorerServerTreeItem\n        */\n        ExplorerServerTreeItem(QTreeWidget *view, MongoServer *const server, ConnectionInfo connInfo);\n\n        /*\n        ** Expand server tree item;\n        */\n        void expand();\n\n        // Disable/enable menu items, except [1]:Refresh and [9]:Disconnect which are \n        // always enabled, according to replica set status (online or offline).\n        void disableSomeContextMenuActions(bool disable);\n\n    public Q_SLOTS:\n        void databaseRefreshed(const QList<MongoDatabase *> &dbs);\n        void handle(DatabaseListLoadedEvent *event);\n        void handle(MongoServerLoadingDatabasesEvent *event);\n        void handle(ReplicaSetFolderRefreshed *event);\n\n        // Special handle for server refresh events for replica set connections only\n        void handle(ConnectionEstablishedEvent *event);\n\n        // Special handle for server refresh events for replica set connections only\n        void handle(ConnectionFailedEvent *event);\n\n    private Q_SLOTS:\n        void ui_showLog();\n        void ui_openShell();\n        void ui_disconnectServer();\n        void ui_refreshServer();\n        void ui_createDatabase();\n        void ui_serverHostInfo();\n        void ui_serverStatus();\n        void ui_serverVersion();\n\n    private:\n\n        // Build all items for a root replica set server item, only used in refresh events\n        // (not designed to be used in primary connection)\n        void buildReplicaSetServerItem();\n\n        // Build only replica set folder and member items\n        void buildReplicaSetFolder(bool expanded);\n\n        // This function assumes there is no existing db items (system folder and other db tree items), \n        // so existing db items should be deleted before calling this function.\n        void buildDatabaseItems();  \n\n        void replicaSetPrimaryReachable();\n        void replicaSetPrimaryUnreachable();\n\n        /**\n         * @brief Builds server\n         * @param count: Number of databases.\n         *               If NULL - name will be without count of databases.\n         *               If -1   - name will contain \"...\" at the end.\n         */\n        QString buildServerName(int *count = NULL, bool isOnline = true);\n\n        ExplorerReplicaSetFolderItem *_replicaSetFolder;\n        ExplorerTreeItem *_systemFolder;\n\n        MongoServer *const _server;\n        EventBus *_bus;\n\n        // Flag to track last replica set connection's primary status\n        bool _primaryWasUnreachable = false;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerTreeItem.cpp",
    "content": "#include \"robomongo/gui/widgets/explorer/ExplorerTreeItem.h\"\n\n#include <QMenu>\n\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace Robomongo\n{\n    ExplorerTreeItem::ExplorerTreeItem(QTreeWidgetItem *parent)\n        :QObject(), BaseClass(parent), _contextMenu(new QMenu(treeWidget()) )\n    {\n\n    }\n\n    ExplorerTreeItem::ExplorerTreeItem(QTreeWidget *view)\n        :QObject(view), BaseClass(view), _contextMenu(new QMenu(view) )\n    {\n\n    }\n\n    void ExplorerTreeItem::showContextMenuAtPos(const QPoint &pos)\n    {\n        _contextMenu->exec(pos);\n    }\n\n    ExplorerTreeItem::~ExplorerTreeItem()\n    {\n        _contextMenu->deleteLater();\n        QtUtils::clearChildItems(this);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h",
    "content": "#pragma once\n\n#include <QTreeWidgetItem>\nQT_BEGIN_NAMESPACE\nclass QMenu;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class ExplorerTreeItem :public QObject, public QTreeWidgetItem\n    {\n        Q_OBJECT\n    public:\n        typedef QTreeWidgetItem BaseClass;\n        explicit ExplorerTreeItem(QTreeWidget *view);\n        explicit ExplorerTreeItem(QTreeWidgetItem *parent);\n        virtual void showContextMenuAtPos(const QPoint &pos);\n        using BaseClass::parent;\n        virtual ~ExplorerTreeItem();\n\n    protected:\n        QMenu *const _contextMenu;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerTreeWidget.cpp",
    "content": "#include \"robomongo/gui/widgets/explorer/ExplorerTreeWidget.h\"\n\n#include \"robomongo/gui/widgets/explorer/ExplorerTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.h\"\n#include <QContextMenuEvent>\n#include <robomongo/gui/GuiRegistry.h>\n\nnamespace Robomongo\n{\n    ExplorerTreeWidget::ExplorerTreeWidget(QWidget *parent) : QTreeWidget(parent)\n    {\n    #if defined(Q_OS_MAC)\n        setAttribute(Qt::WA_MacShowFocusRect, false);\n        QPalette palet = palette();\n        palet.setColor(QPalette::Active, QPalette::Highlight, QColor(16, 108, 214));\n        setPalette(palet);\n    #endif\n        setContextMenuPolicy(Qt::DefaultContextMenu);\n        setObjectName(\"explorerTree\");\n        setIndentation(15);\n        setHeaderHidden(true);\n        setSelectionMode(QAbstractItemView::SingleSelection);\n        setExpandsOnDoubleClick(false);\n    }\n\n    void ExplorerTreeWidget::contextMenuEvent(QContextMenuEvent *event)\n    {\n        QTreeWidgetItem *item = itemAt(event->pos());\n       \n        // If the replica set item is not reachable, do not show context menu\n        auto replicaSetItem = dynamic_cast<ExplorerReplicaSetTreeItem*>(item);\n        if (replicaSetItem && !replicaSetItem->isUp())\n            return;\n\n        // If the database set item is disabled, do not show context menu\n        auto dbItem = dynamic_cast<ExplorerDatabaseTreeItem*>(item);\n        if (dbItem && dbItem->isDisabled()) \n            return;\n\n        if (item) {\n            auto explorerItem = dynamic_cast<ExplorerTreeItem *>(item);\n            if (explorerItem) \n                explorerItem->showContextMenuAtPos(mapToGlobal(event->pos()));\n        }\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerTreeWidget.h",
    "content": "#pragma once\n\n#include <QTreeWidget>\n\nnamespace Robomongo\n{\n    class ExplorerTreeWidget : public QTreeWidget\n    {\n        Q_OBJECT\n    public:\n        explicit ExplorerTreeWidget(QWidget *parent = 0);\n    protected:\n        virtual void contextMenuEvent(QContextMenuEvent *event);\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerUserTreeItem.cpp",
    "content": "#include \"robomongo/gui/widgets/explorer/ExplorerUserTreeItem.h\"\n\n#include <QAction>\n#include <QMenu>\n\n#include \"robomongo/gui/dialogs/CreateUserDialog.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/utils/DialogUtils.h\"\n\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/domain/MongoDatabase.h\"\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace Robomongo\n{\n    ExplorerUserTreeItem::ExplorerUserTreeItem(\n        QTreeWidgetItem *parent, MongoDatabase *const database, const MongoUser &user) \n        : BaseClass(parent), _user(user), _database(database)\n    {\n        auto const dropUser { new QAction(\"Drop User\", this) };\n        VERIFY(connect(dropUser, SIGNAL(triggered()), SLOT(ui_dropUser())));\n\n        auto const viewUser { new QAction(\"View User\", this) };\n        VERIFY(connect(viewUser, SIGNAL(triggered()), SLOT(ui_viewUser())));\n\n        BaseClass::_contextMenu->addAction(viewUser);\n        BaseClass::_contextMenu->addAction(dropUser);\n\n        setText(0, QtUtils::toQString(_user.name()));\n        setIcon(0, GuiRegistry::instance().userIcon());\n        setExpanded(false);\n    }\n\n    void ExplorerUserTreeItem::ui_dropUser()\n    {\n        // Ask user\n        int const answer {\n            utils::questionDialog(\n                treeWidget(), \"Drop\", \"User\", QtUtils::toQString(_user.name())\n            )\n        };\n\n        if (answer == QMessageBox::Yes)\n            _database->dropUser(_user.name());\n    }\n\n    void ExplorerUserTreeItem::ui_viewUser()\n    {\n        auto const& app { Robomongo::AppRegistry::instance().app() };\n        app->openShell(\n            _database, QString::fromStdString(\"db.getUser(\\\"\" + _user.name() + \"\\\")\"), true,\n            QtUtils::toQString(_database->name()), CursorPosition()\n        );\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerUserTreeItem.h",
    "content": "#pragma once\n\n#include \"robomongo/core/domain/MongoUser.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerTreeItem.h\"\n\nnamespace Robomongo\n{\n    class MongoDatabase;\n\n    class ExplorerUserTreeItem : public ExplorerTreeItem\n    {\n        Q_OBJECT\n    public:\n        typedef ExplorerTreeItem BaseClass;\n        ExplorerUserTreeItem(QTreeWidgetItem *parent, MongoDatabase *const database, const MongoUser &user);\n\n    public Q_SLOTS:\n        void ui_dropUser();\n        void ui_viewUser();\n\n    private:\n        const MongoUser _user;\n        MongoDatabase *_database;\n    };\n}\n\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerWidget.cpp",
    "content": "#include \"robomongo/gui/widgets/explorer/ExplorerWidget.h\"\n\n#include <QHBoxLayout>\n#include <QLabel>\n#include <QMovie>\n#include <QKeyEvent>\n\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/gui/MainWindow.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerTreeWidget.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerServerTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerReplicaSetFolderItem.h\"\n#include \"robomongo/gui/widgets/explorer/ExplorerUserTreeItem.h\"\n#include \"robomongo/utils/common.h\"\n\nnamespace Robomongo\n{\n\n    ExplorerWidget::ExplorerWidget(MainWindow *parentMainWindow) : BaseClass(parentMainWindow),\n        _progress(0)\n    {\n        _treeWidget = new ExplorerTreeWidget(this);\n\n        QHBoxLayout *vlaout = new QHBoxLayout();\n        vlaout->setMargin(0);\n        vlaout->addWidget(_treeWidget, Qt::AlignJustify);\n\n        VERIFY(connect(_treeWidget, SIGNAL(itemExpanded(QTreeWidgetItem *)), this, SLOT(ui_itemExpanded(QTreeWidgetItem *))));\n        VERIFY(connect(_treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), \n                       this, SLOT(ui_itemDoubleClicked(QTreeWidgetItem *, int))));\n\n        setLayout(vlaout);\n\n        QMovie *movie = new QMovie(\":robomongo/icons/loading.gif\", QByteArray(), this);\n        _progressLabel = new QLabel(this);\n        _progressLabel->setMovie(movie);\n        _progressLabel->hide();\n        movie->start();        \n    }\n\n    ExplorerWidget::~ExplorerWidget()\n    {\n        saveSetting(\"ExplorerWidget/size\", size());\n    }\n\n    QTreeWidgetItem* ExplorerWidget::getSelectedTreeItem() const\n    {\n        return _treeWidget->currentItem();\n    }\n\n    void ExplorerWidget::keyPressEvent(QKeyEvent *event)\n    {\n        if ((event->key() == Qt::Key_Return) || (event->key() == Qt::Key_Enter))\n        {\n            QList<QTreeWidgetItem*> items = _treeWidget->selectedItems();\n\n            if (items.count() != 1) {\n                BaseClass::keyPressEvent(event);\n                return;\n            }\n\n            QTreeWidgetItem *item = items[0];\n\n            if (!item) {\n                BaseClass::keyPressEvent(event);\n                return;\n            }\n\n            ui_itemDoubleClicked(item, 0);\n\n            return;\n        }\n\n        BaseClass::keyPressEvent(event);\n    }\n\n    QSize ExplorerWidget::sizeHint() const\n    {\n        auto size { getSetting(\"ExplorerWidget/size\").toSize() };        \n        if(QSize(-1, -1) == size)\n           size = QSize(180, -1);\n\n        return(size);\n    }\n\n    void ExplorerWidget::increaseProgress()\n    {\n        ++_progress;\n        _progressLabel->move(width() / 2 - 8, height() / 2 - 8);\n        _progressLabel->show();\n    }\n\n    void ExplorerWidget::decreaseProgress()\n    {\n        --_progress;\n\n        if (_progress < 0)\n            _progress = 0;\n\n        if (!_progress)\n            _progressLabel->hide();\n    }\n\n    void ExplorerWidget::handle(ConnectingEvent *event)\n    {\n        increaseProgress();\n    }\n\n    void ExplorerWidget::handle(ConnectionEstablishedEvent *event)\n    {\n        // Do not make UI changes for non PRIMARY connections\n        if (event->connectionType != ConnectionPrimary)\n            return;\n\n        decreaseProgress();\n\n        auto item = new ExplorerServerTreeItem(_treeWidget, event->server, event->connInfo);\n        _treeWidget->addTopLevelItem(item);\n        _treeWidget->setCurrentItem(item);\n        _treeWidget->setFocus();\n    }\n\n    void ExplorerWidget::handle(ConnectionFailedEvent *event)\n    {\n        decreaseProgress();\n    }\n\n    void ExplorerWidget::ui_itemExpanded(QTreeWidgetItem *item)\n    {\n        auto categoryItem = dynamic_cast<ExplorerDatabaseCategoryTreeItem *>(item);\n        if (categoryItem) {\n            categoryItem->expand();\n            return;\n        }\n\n        auto serverItem = dynamic_cast<ExplorerServerTreeItem *>(item);\n        if (serverItem) {\n            serverItem->expand();\n            return;\n        }\n\n        auto replicaSetFolder = dynamic_cast<ExplorerReplicaSetFolderItem *>(item);\n        if (replicaSetFolder) {\n            replicaSetFolder->expand();\n            return;\n        }\n       \n        auto dirItem = dynamic_cast<ExplorerCollectionIndexesDir *>(item);\n        if (dirItem) {\n            dirItem->expand();\n        }\n    }\n\n    void ExplorerWidget::ui_itemDoubleClicked(QTreeWidgetItem *item, int column)\n    {        \n        if (auto collectionItem = dynamic_cast<ExplorerCollectionTreeItem *>(item)) {\n            AppRegistry::instance().app()->openShell(collectionItem->collection());\n            return;\n        }\n\n        if (auto userItem = dynamic_cast<ExplorerUserTreeItem *>(item)) {\n            userItem->ui_viewUser();\n            return;\n        }\n\n        auto replicaMemberItem = dynamic_cast<ExplorerReplicaSetTreeItem*>(item);\n        if (replicaMemberItem && replicaMemberItem->isUp()) {\n            AppRegistry::instance().app()->openShell(replicaMemberItem->server(), \n                replicaMemberItem->connectionSettings(), ScriptInfo(\"\", true));\n            return;\n        }\n\n        // Toggle expanded state\n        item->setExpanded(!item->isExpanded());\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/explorer/ExplorerWidget.h",
    "content": "#pragma once\n\n#include <QWidget>\nQT_BEGIN_NAMESPACE\nclass QTreeWidget;\nclass QTreeWidgetItem;\nclass QLabel;\nQT_END_NAMESPACE\n\n#include \"robomongo/core/events/MongoEvents.h\"\n\nnamespace Robomongo\n{\n    class MainWindow;\n\n    /**\n     * @brief Explorer widget (usually you'll see it at the left of main window)\n     */\n    class ExplorerWidget : public QWidget\n    {\n        Q_OBJECT\n\n    public:\n        typedef QWidget BaseClass;\n        ExplorerWidget(MainWindow *parent);\n        ~ExplorerWidget();\n\n        QTreeWidgetItem* getSelectedTreeItem() const;\n\n    protected Q_SLOTS:\n        void handle(ConnectingEvent *event);\n        void handle(ConnectionEstablishedEvent *event);\n        void handle(ConnectionFailedEvent *event);\n    private Q_SLOTS:\n        void ui_itemExpanded(QTreeWidgetItem *item);\n        void ui_itemDoubleClicked(QTreeWidgetItem *item, int column);\n\n    protected:\n        void keyPressEvent(QKeyEvent *event) override;   \n\n    private:\n        QSize sizeHint() const override;\n\n        int _progress;\n        void increaseProgress();\n        void decreaseProgress();\n        QLabel *_progressLabel;\n        QTreeWidget *_treeWidget;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/BsonTableModel.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/BsonTableModel.h\"\n\n#include <QBrush>\n#include <QIcon>\n\n#include \"robomongo/gui/widgets/workarea/BsonTreeItem.h\"\n#include \"robomongo/gui/widgets/workarea/BsonTreeModel.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace Robomongo\n{\n    BsonTableModelProxy::BsonTableModelProxy(QObject *parent) \n        : BaseClass(parent)\n    {\n       \n    }\n\n    int BsonTableModelProxy::rowCount(const QModelIndex &parent) const\n    {\n        int count = sourceModel()->rowCount(parent);\n        return count;\n    }\n\n    QModelIndex BsonTableModelProxy::parent( const QModelIndex& index ) const\n    {\n        QModelIndex sourceParent = sourceModel()->parent( mapToSource(index) );\n        return sourceParent;\n    }\n\n    int BsonTableModelProxy::columnCount(const QModelIndex &parent) const\n    {\n        return _columns.size();\n    }\n\n    QModelIndex BsonTableModelProxy::mapFromSource( const QModelIndex & sourceIndex ) const\n    {\n        int row = sourceIndex.row();\n        int col = sourceIndex.column();\n\n        BsonTreeItem *node = QtUtils::item<BsonTreeItem *>(sourceIndex);\n        if (!node || _columns.size() <= col)\n            return QModelIndex();\n\n        BsonTreeItem *child = node->childByKey(_columns[col]);\n\n        return createIndex( row, col, child );\n    }\n\n    QModelIndex BsonTableModelProxy::sibling(int row, int column, const QModelIndex &idx) const\n    {\n        return BaseClass::sibling(row, 0, idx);\n    }\n\n    QModelIndex BsonTableModelProxy::index( int row, int col, const QModelIndex& parent ) const\n    {\n        BsonTreeItem *node = QtUtils::item<BsonTreeItem *>(sourceModel()->index(row, 0, parent));\n        if (!node || _columns.size() <= col)\n            return QModelIndex();\n\n        BsonTreeItem *child = node->childByKey(_columns[col]);\n\n        return createIndex( row, col, child );\n    }\n\n    QModelIndex BsonTableModelProxy::mapToSource( const QModelIndex &proxyIndex ) const\n    {\n        if ( !proxyIndex.isValid() )\n            return QModelIndex();\n\n        Q_ASSERT( proxyIndex.model() == this );\n\n        QModelIndex sourceIndex;\n        BsonTreeItem *child = static_cast<BsonTreeItem *>(proxyIndex.internalPointer());\n        if (child) {\n            QtUtils::HackQModelIndex* hack = reinterpret_cast<QtUtils::HackQModelIndex*>(&sourceIndex);\n            BsonTreeItem *parent = static_cast<BsonTreeItem *>(child->parent());\n            hack->r = proxyIndex.row();\n            hack->c = proxyIndex.column();\n            hack->i = parent;\n            hack->m = sourceModel();\n        }\n        return sourceIndex;\n    }\n\n    void BsonTableModelProxy::setSourceModel( QAbstractItemModel* model )\n    {\n        if (model) {\n            BsonTreeItem *child = QtUtils::item<BsonTreeItem *>(model->index(0, 0));\n            if (child) {\n                _root = qobject_cast<BsonTreeItem *>(child->parent());\n                if (_root) {\n                    int count = _root->childrenCount();\n                    for (int i = 0; i < count; ++i) {\n                        BsonTreeItem *child = _root->child(i);\n                        int countc = child->childrenCount();\n                        for (int j = 0; j < countc; ++j) {\n                            addColumn(child->child(j)->key());\n                        }\n                    }\n                }\n            }\n        }\n        return BaseClass::setSourceModel(model);\n    }\n\n    QVariant BsonTableModelProxy::data(const QModelIndex &index, int role) const\n    {\n        QVariant result;\n\n        if (!index.isValid())\n            return result;\n\n        BsonTreeItem *node = QtUtils::item<BsonTreeItem *>(index);\n\n        if (!node) {\n            if (role == Qt::BackgroundRole) {\n                return QBrush(\"#f5f3f2\");\n            }\n            return result;\n        }\n\n        if (role == Qt::DisplayRole || role == Qt::ToolTipRole) {\n            bool isCut = node->type() == mongo::String ||  node->type() == mongo::Code || node->type() == mongo::CodeWScope;  \n            if (role == Qt::ToolTipRole) {\n                result = isCut ? node->value() : node->value().left(500); \n            }\n            else{\n                result = isCut ? node->value() : node->value().simplified().left(300); \n            }\n        }\n        else if (role == Qt::DecorationRole) {\n            return BsonTreeModel::getIcon(node);\n        }\n\n        return result;\n    }\n\n    QVariant BsonTableModelProxy::headerData(int section, Qt::Orientation orientation, int role) const\n    {\n        if (role != Qt::DisplayRole)\n            return QVariant();\n\n        if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {\n            return column(section); \n        } else {\n            return QString(\"%1\").arg(section + 1);\n        }\n    }\n\n    QString BsonTableModelProxy::column(int col) const\n    {\n        return _columns[col];\n    }\n\n    size_t BsonTableModelProxy::findIndexColumn(const QString &col) const\n    {\n        for (int i = 0; i < _columns.size(); ++i) {\n            if (_columns[i] == col) {\n                return i;\n            }\n        }\n        return _columns.size();\n    }\n\n    size_t BsonTableModelProxy::addColumn(const QString &col)\n    {\n        size_t column = findIndexColumn(col);\n        if (column == _columns.size()) {\n            _columns.push_back(col);\n        }\n        return column;\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/BsonTableModel.h",
    "content": "#pragma once\n#include <vector>\n\n#include <QAbstractProxyModel>\n\nnamespace Robomongo\n{\n    class BsonTreeItem;\n\n    class BsonTableModelProxy : public QAbstractProxyModel\n    {\n        Q_OBJECT\n\n    public:\n        typedef QAbstractProxyModel BaseClass;\n        typedef std::vector<QString> ColumnsValuesType;\n\n        explicit BsonTableModelProxy(QObject *parent = 0);\n        QVariant data(const QModelIndex &index, int role) const;\n\n        int rowCount(const QModelIndex &parent = QModelIndex()) const;\n        int columnCount(const QModelIndex &parent) const;\n\n        QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;\n        QModelIndex index( int row, int col, const QModelIndex& index ) const;\n        virtual QModelIndex mapFromSource( const QModelIndex & sourceIndex ) const;\n        virtual QModelIndex mapToSource( const QModelIndex &proxyIndex ) const;\n        virtual void setSourceModel( QAbstractItemModel* model );\n        virtual QModelIndex parent( const QModelIndex& index ) const;\n        virtual QModelIndex sibling(int row, int column, const QModelIndex &idx) const;\n    private:\n        QString column(int col) const;\n        size_t addColumn(const QString &col);\n        size_t findIndexColumn(const QString &col) const;\n\n        ColumnsValuesType _columns;\n        BsonTreeItem *_root;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/BsonTableView.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/BsonTableView.h\"\n\n#include <QHeaderView>\n#include <QAction>\n#include <QMenu>\n#include <QKeyEvent>\n\n#include \"robomongo/gui/widgets/workarea/BsonTreeItem.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace Robomongo\n{\n    BsonTableView::BsonTableView(MongoShell *shell, const MongoQueryInfo &queryInfo, QWidget *parent) \n        :BaseClass(parent), _notifier(this, shell, queryInfo)\n    {\n#if defined(Q_OS_MAC)\n        setAttribute(Qt::WA_MacShowFocusRect, false);\n#endif\n        GuiRegistry::instance().setAlternatingColor(this);\n\n        verticalHeader()->setDefaultAlignment(Qt::AlignLeft);\n        horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);\n        setStyleSheet(\"QTableView { border-left: 1px solid #c7c5c4; border-top: 1px solid #c7c5c4; gridline-color: #edebea;}\");\n\n        setSelectionMode(QAbstractItemView::ExtendedSelection);\n        setSelectionBehavior(QAbstractItemView::SelectItems);\n        setContextMenuPolicy(Qt::CustomContextMenu);\n        VERIFY(connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showContextMenu(const QPoint&))));\n    }\n\n    void BsonTableView::keyPressEvent(QKeyEvent *event)\n    {\n        if (event->key() == Qt::Key_Delete) {\n            _notifier.onDeleteDocuments();\n        }\n        return BaseClass::keyPressEvent(event);\n    }\n\n    QModelIndex BsonTableView::selectedIndex() const\n    {\n        QModelIndexList indexes = detail::uniqueRows(selectionModel()->selectedIndexes());\n\n        if (indexes.count() != 1)\n            return QModelIndex();\n\n        return indexes[0];\n    }\n\n    QModelIndexList BsonTableView::selectedIndexes() const\n    {\n        return detail::uniqueRows(selectionModel()->selectedIndexes());\n    }\n\n    void BsonTableView::showContextMenu( const QPoint &point )\n    {\n        QPoint menuPoint = mapToGlobal(point);\n        menuPoint.setY(menuPoint.y() + horizontalHeader()->height());\n        menuPoint.setX(menuPoint.x() + verticalHeader()->width());\n\n        QModelIndexList indexes = selectedIndexes();\n        if (detail::isMultiSelection(indexes)) {\n            QMenu menu(this);\n            _notifier.initMultiSelectionMenu(&menu);\n            menu.exec(menuPoint);\n        }\n        else{\n            QModelIndex selectedInd = selectedIndex();\n            BsonTreeItem *documentItem = QtUtils::item<BsonTreeItem*>(selectedInd);\n            QMenu menu(this);\n            _notifier.initMenu(&menu, documentItem);\n            menu.exec(menuPoint);\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/BsonTableView.h",
    "content": "#pragma once\n#include <QTableView>\n\n#include \"robomongo/core/domain/Notifier.h\"\n\nnamespace Robomongo\n{\n    class BsonTableView : public QTableView , public INotifierObserver\n    {\n        Q_OBJECT\n    public:\n        typedef QTableView BaseClass;\n        explicit BsonTableView(MongoShell *shell, const MongoQueryInfo &queryInfo, QWidget *parent = 0);     \n        virtual QModelIndex selectedIndex() const;\n        virtual QModelIndexList selectedIndexes() const;\n\n    public Q_SLOTS:\n        void showContextMenu(const QPoint &point);\n\n    protected:\n        virtual void keyPressEvent(QKeyEvent *event);\n\n    private:\n        Notifier _notifier;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/BsonTreeItem.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/BsonTreeItem.h\"\n#include <mongo/client/dbclient_base.h>\n\nusing namespace mongo;\nnamespace\n{\n    struct removeIfFound\n    {\n        removeIfFound(Robomongo::BsonTreeItem *item) :_whatSearch(item) {}\n        bool operator()(const Robomongo::BsonTreeItem* item) const\n        {\n            if (item == _whatSearch) {\n                delete _whatSearch;\n                return true;\n            }\n            return false;\n        }\n        const Robomongo::BsonTreeItem *const _whatSearch;\n    };\n\n    const Robomongo::BsonTreeItem *findSuperRoot(const Robomongo::BsonTreeItem *const item)\n    {\n        Robomongo::BsonTreeItem *parent = qobject_cast<Robomongo::BsonTreeItem *>(item->parent());\n        if (parent) {\n            Robomongo::BsonTreeItem *grParent = qobject_cast<Robomongo::BsonTreeItem *>(parent->parent());\n            if (grParent) {\n               return findSuperRoot(parent);\n            }\n        }\n        return item;\n    }\n}\nnamespace Robomongo\n{\n    BsonTreeItem::BsonTreeItem(QObject *parent) \n        :BaseClass(parent)\n    {\n       \n    }\n\n    BsonTreeItem::BsonTreeItem(const mongo::BSONObj &bsonObjRoot, QObject *parent)\n        :BaseClass(parent),\n        _root(bsonObjRoot)\n    {\n\n    }\n\n    unsigned BsonTreeItem::childrenCount() const\n    {\n        return _items.size();\n    }\n\n    void BsonTreeItem::clear()\n    {\n        _items.clear();\n    }\n\n    void BsonTreeItem::addChild(BsonTreeItem *item)\n    {\n        _items.push_back(item);\n    }\n\n    BsonTreeItem* BsonTreeItem::child(unsigned pos) const\n    {\n        return _items[pos];\n    }\n\n    BsonTreeItem* BsonTreeItem::childSafe(unsigned pos) const\n    {\n        if (childrenCount() > pos) {\n            return _items[pos];\n        }\n        else {\n            return NULL;\n        }\n    }\n\n    BsonTreeItem* BsonTreeItem::childByKey(const QString &val)\n    {\n        for (unsigned i = 0; i < _items.size(); ++i) {\n            if (_items[i]->key() == val) {\n                return _items[i];\n            }\n        }\n        return NULL;\n    }\n\n    const BsonTreeItem *BsonTreeItem::superParent() const\n    {\n        return findSuperRoot(this);\n    }\n\n    mongo::BSONObj BsonTreeItem::superRoot() const\n    {\n        return superParent()->root();\n    }\n\n    mongo::BSONObj BsonTreeItem::root() const\n    {\n        return _root;\n    }\n\n    int BsonTreeItem::indexOf(BsonTreeItem *item) const\n    {\n        for (unsigned i = 0; i < _items.size(); ++i) {\n            if (item == _items[i]) {\n                return i;\n            }\n        }\n        return -1;\n    }\n\n    QString BsonTreeItem::key() const\n    {\n        return _fields._key;\n    }\n\n    QString BsonTreeItem::value() const\n    {\n        return _fields._value;\n    }\n\n    mongo::BSONType BsonTreeItem::type() const\n    {\n        return _fields._type;\n    }\n\n    void BsonTreeItem::setKey(const QString &key)\n    {\n        _fields._key = key;\n    }\n\n    void BsonTreeItem::setValue(const QString &value)\n    {\n        _fields._value = value;\n    }\n\n    void BsonTreeItem::setType(mongo::BSONType type)\n    {\n       _fields._type = type;\n    }\n\n    mongo::BinDataType BsonTreeItem::binType() const\n    {\n        return _fields._binType;\n    }\n\n    void BsonTreeItem::setBinType(mongo::BinDataType type)\n    {\n        _fields._binType = type;\n    }\n\n    void BsonTreeItem::removeChild(BsonTreeItem *item)\n    {\n        _items.erase(std::remove_if(_items.begin(), _items.end(), removeIfFound(item)), _items.end());\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/BsonTreeItem.h",
    "content": "#pragma once\n\n#include <vector>\n#include <QObject>\n#include <mongo/bson/bsonobj.h>\n#include <mongo/bson/bsonelement.h>\n\nnamespace Robomongo\n{\n    /**\n     * @brief BSON tree item (represents array or object)\n     */\n    struct BsonItemFields\n    {\n        QString _key;\n        QString _value;\n        mongo::BSONType _type;\n        mongo::BinDataType _binType;\n    };\n\n    class BsonTreeItem : public QObject\n    {\n        Q_OBJECT\n    public:\n        enum eColumn\n        {\n            eKey = 0,\n            eValue = 1,\n            eType = 2,\n            eCountColumns = 3\n        };\n\n        typedef QObject BaseClass;\n        typedef std::vector<BsonTreeItem*> ChildContainerType;\n\n        explicit BsonTreeItem(QObject *parent = 0);\n        explicit BsonTreeItem(const mongo::BSONObj &bsonObjRoot, QObject *parent = 0);\n\n        unsigned childrenCount() const;\n        void clear();\n        void addChild(BsonTreeItem *item);\n        void removeChild(BsonTreeItem *item);\n        BsonTreeItem* child(unsigned pos) const;\n        BsonTreeItem* childSafe(unsigned pos) const;\n        BsonTreeItem* childByKey(const QString &val);\n        int indexOf(BsonTreeItem *item) const;\n\n        const BsonTreeItem* superParent() const;\n        mongo::BSONObj root() const;\n        mongo::BSONObj superRoot() const;\n\n        std::string fieldName() const { return _fieldName; };\n        void setFieldName(const std::string &fieldName) { _fieldName = fieldName; };\n\n        QString key() const;\n        void setKey(const QString &key);\n\n        QString value() const;\n        void setValue(const QString &value);\n\n        mongo::BSONType type() const;\n        void setType(mongo::BSONType type);\n\n        mongo::BinDataType binType() const;\n        void setBinType(mongo::BinDataType type);\n\n    protected:\n\n        const mongo::BSONObj _root;\n        ChildContainerType _items;\n        BsonItemFields _fields;\n        std::string _fieldName;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/BsonTreeModel.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/BsonTreeModel.h\"\n\n#include <mongo/client/dbclient_base.h>\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/utils/BsonUtils.h\"\n#include \"robomongo/core/domain/MongoDocument.h\"\n#include \"robomongo/gui/widgets/workarea/BsonTreeItem.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n\nnamespace\n{\n    using namespace Robomongo;\n\n    QString arrayValue(int itemsCount) {\n        QString elements = itemsCount == 1 ? \"element\" : \"elements\";\n        return QString(\"[ %1 %2 ]\").arg(itemsCount).arg(elements);\n    }\n\n    QString objectValue(int itemsCount) {\n        QString fields = itemsCount == 1 ? \"field\" : \"fields\";\n        return QString(\"{ %1 %2 }\").arg(itemsCount).arg(fields);\n    }\n\n    void parseDocument(BsonTreeItem *root, const mongo::BSONObj &doc, bool isArray)\n    {            \n            mongo::BSONObjIterator iterator(doc);\n            while (iterator.more())\n            {\n                mongo::BSONElement element = iterator.next();                \n                BsonTreeItem *childItemInner = new BsonTreeItem(doc, root);\n                std::string fieldName = std::string(element.fieldName());\n                childItemInner->setFieldName(fieldName);\n\n                QString uiFieldName = QtUtils::toQString(fieldName);\n                childItemInner->setKey(uiFieldName);\n\n                if (isArray) {\n                    // When we iterate array, show field names in square brackets\n                    // In this case field names are numeric, starting from 0.\n                    childItemInner->setKey(\"[\" + uiFieldName + \"]\");\n                }\n\n                if (BsonUtils::isArray(element)) {\n                    int itemsCount = element.Array().size();\n                    childItemInner->setValue(arrayValue(itemsCount));\n                }\n                else if (BsonUtils::isDocument(element)) {\n                    int count = BsonUtils::elementsCount(element.Obj());\n                    childItemInner->setValue(objectValue(count));\n                }\n                else {\n                    std::string result;\n                    BsonUtils::buildJsonString(element, result, AppRegistry::instance().settingsManager()->uuidEncoding(), AppRegistry::instance().settingsManager()->timeZone());\n                    childItemInner->setValue(QtUtils::toQString(result));\n                }\n                childItemInner->setType(element.type());\n                if (element.type() == mongo::BinData) {\n                    childItemInner->setBinType(element.binDataType());\n                }\n                root->addChild(childItemInner);\n                //root->setValue(QString(\"{ %1 fields }\").arg(root->childrenCount()));\n            }            \n    }\n}\n\nnamespace Robomongo\n{\n    BsonTreeModel::BsonTreeModel(const std::vector<MongoDocumentPtr> &documents, QObject *parent) :\n        BaseClass(parent),\n        _root(new BsonTreeItem(this))\n    {\n        for (int i = 0; i < documents.size(); ++i) {\n            MongoDocumentPtr doc = documents[i]; \n            BsonTreeItem *child = new BsonTreeItem(doc->bsonObj(), _root);\n            parseDocument(child, doc->bsonObj(), doc->bsonObj().isArray());\n\n            QString idValue;\n            BsonTreeItem *idItem = child->childByKey(\"_id\");\n            if (idItem) {\n                idValue = idItem->value();\n            }\n\n            child->setKey(QString(\"(%1) %2\").arg(i + 1).arg(idValue));\n\n            int count = BsonUtils::elementsCount(doc->bsonObj());\n\n            if (doc->bsonObj().isArray()) {\n                child->setValue(arrayValue(count));\n                child->setType(mongo::Array);\n            } else {\n                child->setValue(objectValue(count));\n                child->setType(mongo::Object);\n            }\n            _root->addChild(child);\n        }\n    }\n\n    void BsonTreeModel::fetchMore(const QModelIndex &parent)\n    {\n        BsonTreeItem *node = QtUtils::item<BsonTreeItem*>(parent);\n        if (node) {\n            mongo::BSONElement elem = BsonUtils::indexOf(node->root(), parent.row());\n            if (!elem.isNull() && elem.isABSONObj()) {\n                parseDocument(node, elem.Obj(), elem.type() == mongo::Array);\n            }            \n        }\n        return BaseClass::fetchMore(parent);\n    }\n\n    bool BsonTreeModel::canFetchMore(const QModelIndex &parent) const\n    {\n        BsonTreeItem *node = QtUtils::item<BsonTreeItem*>(parent);\n        if (node && !node->childrenCount()) {\n            return BsonUtils::isDocument(node->type());\n        }\n        return false;\n    }\n\n    bool BsonTreeModel::hasChildren(const QModelIndex &parent) const\n    {\n        BsonTreeItem *node = QtUtils::item<BsonTreeItem*>(parent);\n        if (node) {\n            return BsonUtils::isDocument(node->type());\n        }\n        return true;\n    }\n\n    const QIcon &BsonTreeModel::getIcon(BsonTreeItem *item)\n    {\n        switch(item->type()) {\n        case mongo::NumberDouble: return GuiRegistry::instance().bsonDoubleIcon();\n        case mongo::NumberDecimal: return GuiRegistry::instance().bsonNumberDecimalIcon();\n        case mongo::String: return GuiRegistry::instance().bsonStringIcon();\n        case mongo::Object: return GuiRegistry::instance().bsonObjectIcon();\n        case mongo::Array: return GuiRegistry::instance().bsonArrayIcon();\n        case mongo::BinData: return GuiRegistry::instance().bsonBinaryIcon();\n        case mongo::Undefined: return GuiRegistry::instance().circleIcon();\n        case mongo::jstOID: return GuiRegistry::instance().circleIcon();\n        case mongo::Bool: return GuiRegistry::instance().bsonBooleanIcon();\n        case mongo::Date: return GuiRegistry::instance().bsonDateTimeIcon();\n        case mongo::jstNULL: return GuiRegistry::instance().bsonNullIcon();\n        case mongo::RegEx: return GuiRegistry::instance().circleIcon();\n        case mongo::DBRef: return GuiRegistry::instance().circleIcon();\n        case mongo::Code: case mongo::CodeWScope: return GuiRegistry::instance().circleIcon();\n        case mongo::NumberInt: return GuiRegistry::instance().bsonIntegerIcon();\n        case mongo::bsonTimestamp: return GuiRegistry::instance().bsonDateTimeIcon();\n        case mongo::NumberLong: return GuiRegistry::instance().bsonIntegerIcon();\n        default: return GuiRegistry::instance().circleIcon();\n        }\n    }\n\n    QVariant BsonTreeModel::data(const QModelIndex &index, int role) const\n    {\n        QVariant result;\n\n        if (!index.isValid())\n            return result;\n\n        BsonTreeItem *node = QtUtils::item<BsonTreeItem*>(index);\n\n        if (!node)\n            return result;  \n\n        int col = index.column();        \n\n        if (role == Qt::DecorationRole && col == BsonTreeItem::eKey ) {\n            return getIcon(node);\n        }\n\n        if (role == Qt::TextColorRole && col == BsonTreeItem::eType) {\n            return QColor(Qt::gray);\n        }\n\n        if (role == Qt::DisplayRole || role == Qt::ToolTipRole) {\n            if (col == BsonTreeItem::eKey) {\n                if (role == Qt::DisplayRole) {\n                    result = node->key();\n                }\n            }\n            else if (col == BsonTreeItem::eValue) {\n                bool isCut = node->type() == mongo::String ||  node->type() == mongo::Code || node->type() == mongo::CodeWScope;  \n                if (role == Qt::ToolTipRole) {\n                    result = isCut ? node->value().left(500) : node->value(); \n                }\n                else{\n                    result = isCut ? node->value().simplified().left(300) : node->value(); \n                }\n            }\n            else if (col == BsonTreeItem::eType) {\n                result = BsonUtils::BSONTypeToString(node->type(), node->binType(), AppRegistry::instance().settingsManager()->uuidEncoding());\n            }\n        }       \n\n        return result;\n    }\n\n    Qt::ItemFlags BsonTreeModel::flags(const QModelIndex &index) const\n    {\n        Qt::ItemFlags result = 0;\n        if (index.isValid()) {\n            result = Qt::ItemIsSelectable | Qt::ItemIsEnabled;\n        }\n        return result;\n    }\n\n    int BsonTreeModel::rowCount(const QModelIndex &parent) const\n    {\n        const BsonTreeItem *parentItem = NULL;\n        if (parent.isValid())\n            parentItem = QtUtils::item<BsonTreeItem*>(parent);\n        else\n            parentItem = _root;\n\n        return parentItem->childrenCount();\n    }\n\n    int BsonTreeModel::columnCount(const QModelIndex &parent) const\n    {\n        return BsonTreeItem::eCountColumns;\n    }\n\n    QVariant BsonTreeModel::headerData(int section, Qt::Orientation orientation, int role) const\n    {\n        if (role != Qt::DisplayRole)\n            return QVariant();\n\n        if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {\n            if (section == BsonTreeItem::eKey) {\n                return \"Key\";\n            }\n            else if (section == BsonTreeItem::eValue) {\n                return \"Value\";\n            }\n            else {\n                return \"Type\";\n            }\n        }\n\n        return BaseClass::headerData(section, orientation, role);\n    }\n\n    QModelIndex BsonTreeModel::parent(const QModelIndex& index) const\n    {\n        QModelIndex result;\n        if (index.isValid()) {\n            BsonTreeItem *const childItem = QtUtils::item<BsonTreeItem*const>(index);\n            BsonTreeItem *const parentItem = static_cast<BsonTreeItem*const>(childItem->parent());\n            if (parentItem && parentItem != _root) {\n                BsonTreeItem *const grandParent = static_cast<BsonTreeItem*const>(parentItem->parent());\n                int row = grandParent->indexOf(parentItem);\n                result = createIndex(row, 0, parentItem);\n            }\n        }\n        return result;\n    }\n\n    QModelIndex BsonTreeModel::index(int row, int column, const QModelIndex &parent) const\n    {\n        QModelIndex index;\n        if (hasIndex(row, column, parent)) {\n            const BsonTreeItem * parentItem = NULL;\n            if (!parent.isValid()) {\n                parentItem = _root;\n            } else {\n                parentItem = QtUtils::item<BsonTreeItem*>(parent);\n            }\n\n            BsonTreeItem *childItem = parentItem->child(row);\n            if (childItem) {\n                index = createIndex(row, column, childItem);\n            }\n        }\n        return index;\n    }\n\n    void BsonTreeModel::insertItem(BsonTreeItem *parent, BsonTreeItem *children)\n    {\n        QModelIndex index = createIndex(0, 0, parent);\n        unsigned child_count = parent->childrenCount();\n        beginInsertRows(index, child_count, child_count);\n        parent->addChild(children);\n        endInsertRows();\n    }\n\n    void BsonTreeModel::removeitem(BsonTreeItem *children)\n    {\n        BsonTreeItem *parent = static_cast<BsonTreeItem *>(children->parent());\n        if (parent) {\n            QModelIndex index = createIndex(0, 0, parent);\n            int row = parent->indexOf(children);\n            beginRemoveRows(index, row, row);\n            parent->removeChild(children);\n            endRemoveRows();\n        }\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/BsonTreeModel.h",
    "content": "#pragma once\n#include <vector>\n#include <QAbstractItemModel>\n#include \"robomongo/core/Core.h\"\n\nnamespace Robomongo\n{\n    class BsonTreeItem;\n\n    class BsonTreeModel : public QAbstractItemModel\n    {\n        Q_OBJECT\n\n    public:\n        typedef QAbstractItemModel BaseClass;\n        static const QIcon &getIcon(BsonTreeItem *item);\n        explicit BsonTreeModel(const std::vector<MongoDocumentPtr> &documents, QObject *parent = 0);\n        QVariant data(const QModelIndex &index, int role) const;\n\n        int rowCount(const QModelIndex &parent = QModelIndex()) const;\n        int columnCount(const QModelIndex &parent) const;\n\n        QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;\n        Qt::ItemFlags flags(const QModelIndex &index) const;\n        virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;\n        virtual QModelIndex parent(const QModelIndex& index) const;\n\n        void insertItem(BsonTreeItem *parent, BsonTreeItem *children);\n        void removeitem(BsonTreeItem *children);\n\n        virtual void fetchMore(const QModelIndex &parent);\n        virtual bool canFetchMore(const QModelIndex &parent) const;\n        virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const;\n    protected:\n        BsonTreeItem *const _root;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/BsonTreeView.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/BsonTreeView.h\"\n\n#include <QHeaderView>\n#include <QAction>\n#include <QMenu>\n#include <QKeyEvent>\n\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/widgets/workarea/BsonTreeItem.h\"\n#include \"robomongo/gui/widgets/workarea/OutputWidget.h\"\n\nnamespace Robomongo\n{\n    BsonTreeView::BsonTreeView(MongoShell *shell, const MongoQueryInfo &queryInfo, QWidget *parent)\n        : BaseClass(parent), _notifier(this, shell, queryInfo), \n          _outputItemContentWidget(dynamic_cast<const OutputItemContentWidget*>(parent))\n    {\n#if defined(Q_OS_MAC)\n        setAttribute(Qt::WA_MacShowFocusRect, false);\n#endif\n        GuiRegistry::instance().setAlternatingColor(this);\n        setSelectionMode(QAbstractItemView::ExtendedSelection);\n        setSelectionBehavior(QAbstractItemView::SelectRows);\n        setContextMenuPolicy(Qt::CustomContextMenu);\n        VERIFY(connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showContextMenu(const QPoint&))));\n\n        _expandRecursive = new QAction(\"Expand Recursively\", this);\n        _expandRecursive->setShortcut(QKeySequence(Qt::ALT + Qt::Key_Right));\n        VERIFY(connect(_expandRecursive, SIGNAL(triggered()), SLOT(onExpandRecursive())));\n        \n        _collapseRecursive = new QAction(tr(\"Collapse Recursively\"), this);\n        _collapseRecursive->setShortcut(QKeySequence(Qt::ALT + Qt::Key_Left));\n        VERIFY(connect(_collapseRecursive, SIGNAL(triggered()), SLOT(onCollapseRecursive())));\n\n        setStyleSheet(\"QTreeView { border-left: 1px solid #c7c5c4; border-top: 1px solid #c7c5c4; }\");\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))\n        header()->setSectionResizeMode(QHeaderView::Interactive);\n#endif\n    }\n\n    void BsonTreeView::showContextMenu(const QPoint &point)\n    {        \n        if (_outputItemContentWidget->outputWidget()->progressBarActive())\n            return;\n\n        QPoint menuPoint = mapToGlobal(point);\n        menuPoint.setY(menuPoint.y() + header()->height());\n\n        QModelIndexList indexes = selectedIndexes();\n        if (detail::isMultiSelection(indexes)) {\n            QMenu menu(this);\n            \n            menu.addAction(_expandRecursive);\n            menu.addAction(_collapseRecursive);\n            menu.addSeparator();\n            \n            _notifier.initMultiSelectionMenu(&menu);\n            menu.exec(menuPoint);\n        }\n        else {\n\n            QModelIndex selectedInd = selectedIndex();\n            BsonTreeItem *documentItem = QtUtils::item<BsonTreeItem*>(selectedInd);\n\n            QMenu menu(this);\n            bool isSimple = false;\n            if (documentItem) {\n                isSimple = detail::isSimpleType(documentItem);\n                if (detail::isDocumentType(documentItem)) {\n                    menu.addAction(_expandRecursive);\n                    menu.addAction(_collapseRecursive);\n                    menu.addSeparator();\n                }\n            }\n\n            _notifier.initMenu(&menu, documentItem);\n            menu.exec(menuPoint);\n        }\n    }\n\n    void BsonTreeView::resizeEvent(QResizeEvent *event)\n    {\n        BaseClass::resizeEvent(event);\n        header()->resizeSections(QHeaderView::Stretch);\n    }\n\n    void BsonTreeView::keyPressEvent(QKeyEvent *event)\n    {\n        switch (event->key()) {\n            case Qt::Key_Delete:\n                _notifier.handleDeleteCommand();\n                break;\n            case Qt::Key_Backspace:\n                // Cmd/Ctrl + Backspace\n                if (event->modifiers() & Qt::ControlModifier)\n                    _notifier.handleDeleteCommand();\n                break;\n            case Qt::Key_Right:\n                if (event->modifiers() & Qt::AltModifier)\n                    this->onExpandRecursive();\n                break;\n            case Qt::Key_Left:\n                if (event->modifiers() & Qt::AltModifier)\n                    this->onCollapseRecursive();\n                break;\n        }\n\n        return BaseClass::keyPressEvent(event);\n    }\n\n    void BsonTreeView::expandNode(const QModelIndex &index)\n    {\n        if (index.isValid()) {\n            BaseClass::expand(index);\n            BsonTreeItem *item = QtUtils::item<BsonTreeItem*>(index);\n            for (unsigned i = 0; i < item->childrenCount(); ++i) {\n                BsonTreeItem *tritem = item->child(i);\n                if (tritem && detail::isDocumentType(tritem)) {\n                    expandNode(model()->index(i, 0, index));\n                }\n            }\n        }\n    }\n    \n    void BsonTreeView::collapseNode(const QModelIndex &index)\n    {\n        if (index.isValid()) {\n            BaseClass::collapse(index);\n            BsonTreeItem *item = QtUtils::item<BsonTreeItem*>(index);\n            for (unsigned i = 0; i < item->childrenCount(); ++i) {\n                BsonTreeItem *tritem = item->child(i);\n                if (tritem && detail::isDocumentType(tritem)) {\n                    collapseNode(model()->index(i, 0, index));\n                }\n            }\n        }\n    }\n\n    void BsonTreeView::onExpandRecursive()\n    {\n        QModelIndexList indexes = selectedIndexes();\n        if (detail::isMultiSelection(indexes)) {\n            for (int i = 0; i<indexes.count(); ++i)\n                expandNode(indexes[i]);\n        } else {\n            expandNode(selectedIndex());\n        }\n    }\n\n    void BsonTreeView::onCollapseRecursive()\n    {\n        QModelIndexList indexes = selectedIndexes();\n        if (detail::isMultiSelection(indexes)) {\n            for (int i = 0; i<indexes.count(); ++i)\n                collapseNode(indexes[i]);\n        } else {\n            collapseNode(selectedIndex());\n        }\n    }\n\n    /**\n     * @returns selected BsonTreeItem, or NULL otherwise\n     */\n    QModelIndex BsonTreeView::selectedIndex() const\n    {\n        QModelIndexList indexes = detail::uniqueRows(selectionModel()->selectedRows());\n        int count = indexes.count();\n\n        if (indexes.count() != 1)\n            return QModelIndex();\n\n        return indexes[0];\n    }\n\n    QModelIndexList BsonTreeView::selectedIndexes() const\n    {\n        return detail::uniqueRows(selectionModel()->selectedRows(), true);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/BsonTreeView.h",
    "content": "#pragma once\n\n#include <QTreeView>\n\n#include \"robomongo/core/domain/Notifier.h\"\n#include \"robomongo/gui/widgets/workarea/OutputItemContentWidget.h\"\n\nnamespace Robomongo\n{\n    class InsertDocumentResponse;\n\n    class BsonTreeView : public QTreeView, public INotifierObserver\n    {\n        Q_OBJECT\n\n    public:\n        typedef QTreeView BaseClass;\n        BsonTreeView(MongoShell *shell, const MongoQueryInfo &queryInfo, QWidget *parent = NULL);\n        virtual QModelIndex selectedIndex() const;\n        virtual QModelIndexList selectedIndexes() const;\n        void expandNode(const QModelIndex &index);\n        void collapseNode(const QModelIndex &index);\n        \n    private Q_SLOTS:\n        void onExpandRecursive();\n        void onCollapseRecursive();\n        void showContextMenu(const QPoint &point);\n\n    protected:\n        virtual void resizeEvent(QResizeEvent *event);\n        virtual void keyPressEvent(QKeyEvent *event);\n        \n    private:\n        Notifier _notifier;\n        QAction *_expandRecursive;\n        QAction *_collapseRecursive;\n        const OutputItemContentWidget* _outputItemContentWidget;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/CollectionStatsTreeItem.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/CollectionStatsTreeItem.h\"\n\n#include <mongo/db/jsobj.h>\n#include <mongo/bson/bsonobj.h>\n\n#include \"robomongo/core/domain/MongoUtils.h\"\n#include \"robomongo/core/domain/MongoDocument.h\"\n#include \"robomongo/core/domain/MongoNamespace.h\"\n#include \"robomongo/core/utils/BsonUtils.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace \n{\n    QString prepareValue(const QString &data)\n    {\n        return data + \"     \"; // ugly yet simple way to extend size of columns\n    }\n}\n\nnamespace Robomongo\n{\n\n    CollectionStatsTreeItem::CollectionStatsTreeItem(MongoDocumentPtr document)\n    {\n        mongo::BSONObj _obj = document->bsonObj();\n\n        MongoNamespace ns(BsonUtils::getField<mongo::String>(_obj, \"ns\"));\n\n        setText(0, prepareValue(QtUtils::toQString(ns.collectionName())));\n        setIcon(0, GuiRegistry::instance().collectionIcon());\n        setText(1, prepareValue(QString::number(BsonUtils::getField<mongo::NumberLong>(_obj, \"count\"))));\n        setText(2, prepareValue(MongoUtils::buildNiceSizeString(BsonUtils::getField<mongo::NumberDouble>(_obj, \"size\"))));\n        setText(3, prepareValue(MongoUtils::buildNiceSizeString(BsonUtils::getField<mongo::NumberDouble>(_obj, \"storageSize\"))));\n        setText(4, prepareValue(MongoUtils::buildNiceSizeString(BsonUtils::getField<mongo::NumberDouble>(_obj, \"totalIndexSize\"))));\n        setText(5, prepareValue(MongoUtils::buildNiceSizeString(BsonUtils::getField<mongo::NumberDouble>(_obj, \"avgObjSize\"))));\n        setText(6, prepareValue(QString::number(BsonUtils::getField<mongo::NumberDouble>(_obj, \"paddingFactor\"))));\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/CollectionStatsTreeItem.h",
    "content": "#pragma once\n#include <QTreeWidgetItem>\n#include \"robomongo/core/Core.h\"\n\nnamespace Robomongo\n{\n    class CollectionStatsTreeItem : public QTreeWidgetItem\n    {\n    public:\n        CollectionStatsTreeItem(MongoDocumentPtr document);\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/CollectionStatsTreeWidget.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/CollectionStatsTreeWidget.h\"\n\n#include <QHeaderView>\n\n#include \"robomongo/gui/widgets/workarea/CollectionStatsTreeItem.h\"\n\nnamespace Robomongo\n{\n\n    CollectionStatsTreeWidget::CollectionStatsTreeWidget(const std::vector<MongoDocumentPtr> &documents, QWidget *parent) \n        : QTreeWidget(parent)\n    {\n        QStringList colums;\n        colums << \"Name\" << \"Count\" << \"Size\" << \"Storage\" << \"Index\" << \"Average Object\" << \"Padding\";\n        setHeaderLabels(colums);\n\n        setStyleSheet(\n            \"QTreeWidget { border-left: 1px solid #c7c5c4; border-top: 1px solid #c7c5c4; }\"\n        );\n\n        QList<QTreeWidgetItem *> items;\n        size_t documentsCount = documents.size();\n        for (int i = 0; i < documentsCount; i++) {\n            MongoDocumentPtr document = documents[i];\n            CollectionStatsTreeItem *item = new CollectionStatsTreeItem(document);\n            items.append(item);\n        }\n\n        addTopLevelItems(items);\n\n        header()->resizeSections(QHeaderView::ResizeToContents);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/CollectionStatsTreeWidget.h",
    "content": "#pragma once\n\n#include <QTreeWidget>\n\n#include \"robomongo/core/Core.h\"\n\nnamespace Robomongo\n{\n    class CollectionStatsTreeWidget : public QTreeWidget\n    {\n        Q_OBJECT\n    public:\n        CollectionStatsTreeWidget(const std::vector<MongoDocumentPtr> &documents, QWidget *parent = NULL);\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/IndicatorLabel.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/IndicatorLabel.h\"\n\n#include <QLabel>\n#include <QHBoxLayout>\n#include <QIcon>\n\nnamespace Robomongo\n{\n\n    Indicator::Indicator(const QIcon &icon, const QString &text)\n    {\n        QLabel *iconLabel = createLabelWithIcon(icon);\n        _label = new QLabel();\n\n        QHBoxLayout *layout = new QHBoxLayout();\n        layout->setSpacing(0);\n        layout->setContentsMargins(0, 0, 0, 0);\n        layout->addWidget(iconLabel);\n        layout->addSpacing(7);\n        layout->addWidget(_label);\n        layout->addSpacing(14);\n        setLayout(layout);\n\n        setText(text);\n    }\n\n    void Indicator::setText(const QString &text)\n    {\n        _label->setText(text);\n    }\n\n    QLabel *Indicator::createLabelWithIcon(const QIcon &icon)\n    {\n        QPixmap pixmap = icon.pixmap(16, 16);\n        QLabel *label = new QLabel;\n        label->setPixmap(pixmap);\n        return label;\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/IndicatorLabel.h",
    "content": "#pragma once\n\n#include <QWidget>\nQT_BEGIN_NAMESPACE\nclass QIcon;\nclass QLabel;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class Indicator : public QWidget\n    {\n        Q_OBJECT\n\n    public:\n        Indicator(const QIcon &icon, const QString &text = QString());\n        void setText(const QString &text);\n\n    private:\n        QLabel *createLabelWithIcon(const QIcon &icon);\n        QLabel *_label;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/JsonPrepareThread.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/JsonPrepareThread.h\"\n\n#include <QHBoxLayout>\n\n#include \"robomongo/core/domain/MongoDocument.h\"\n#include \"robomongo/core/utils/BsonUtils.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\nnamespace Robomongo\n{\n    JsonPrepareThread::JsonPrepareThread(const std::vector<MongoDocumentPtr> &bsonObjects, UUIDEncoding uuidEncoding, SupportedTimes timeZone)\n        :_bsonObjects(bsonObjects),\n        _uuidEncoding(uuidEncoding),\n        _timeZone(timeZone),\n        _stop(false)\n    {\n    }\n\n    void JsonPrepareThread::stop()\n    {\n        _stop = true;\n    }\n\n    void JsonPrepareThread::run()\n    {\n        int position = 1; // 1-based numbering to match tree & table views\n        for (std::vector<MongoDocumentPtr>::const_iterator it = _bsonObjects.begin(); it != _bsonObjects.end(); ++it)\n        {\n            MongoDocumentPtr doc = *it;\n            mongo::StringBuilder sb;\n            if (position == 1)\n                sb << \"/* 1 */\\n\";\n            else\n                sb << \"\\n\\n/* \" << position << \" */\\n\";\n\n            mongo::BSONObj obj = doc->bsonObj();\n            std::string stdJson = BsonUtils::jsonString(obj, mongo::TenGen, 1, _uuidEncoding, _timeZone);\n\n            if (_stop)\n                break;\n\n            sb << stdJson;\n            QString json = QtUtils::toQString(sb.str());\n\n            if (_stop)\n                break;\n\n            emit partReady(json);\n\n            position++;\n        }\n\n        emit done();\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/JsonPrepareThread.h",
    "content": "#pragma once\n\n#include <QThread>\n#include <vector>\n\n#include \"robomongo/core/Core.h\"\n\n#include \"robomongo/core/Enums.h\"\n\nnamespace Robomongo\n{\n    /*\n    ** In this thread we are running task to prepare JSON string from list of BSON objects\n    */\n    class JsonPrepareThread : public QThread\n    {\n        Q_OBJECT\n\n    public:\n        /*\n        ** Constructor\n        */\n        JsonPrepareThread(const std::vector<MongoDocumentPtr> &bsonObjects, UUIDEncoding uuidEncoding, SupportedTimes timeZone);\n        void stop();\n   Q_SIGNALS:\n        /**\n         * @brief Signals when all parts prepared\n         */\n        void done();\n\n        /**\n         * @brief Signals when json part is ready\n         */\n        void partReady(const QString &part);\n\n    protected:\n\n        /*\n        ** Overload function\n        */\n        virtual void run();\n    private:\n        /*\n        ** List of documents\n        */\n        const std::vector<MongoDocumentPtr> _bsonObjects;\n        const UUIDEncoding _uuidEncoding;\n        const SupportedTimes _timeZone;\n        volatile bool _stop;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/OutputItemContentWidget.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/OutputItemContentWidget.h\"\n\n#include <QVBoxLayout>\n#include <Qsci/qscilexerjavascript.h>\n\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/domain/MongoShell.h\"\n#include \"robomongo/core/domain/MongoAggregateInfo.h\"\n\n#include \"robomongo/gui/widgets/workarea/OutputWidget.h\"\n#include \"robomongo/gui/widgets/workarea/OutputItemHeaderWidget.h\"\n#include \"robomongo/gui/widgets/workarea/JsonPrepareThread.h\"\n#include \"robomongo/gui/widgets/workarea/BsonTreeView.h\"\n#include \"robomongo/gui/widgets/workarea/BsonTreeModel.h\"\n#include \"robomongo/gui/widgets/workarea/BsonTableView.h\"\n#include \"robomongo/gui/widgets/workarea/BsonTableModel.h\"\n#include \"robomongo/gui/editors/PlainJavaScriptEditor.h\"\n#include \"robomongo/gui/widgets/workarea/CollectionStatsTreeWidget.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/editors/JSLexer.h\"\n#include \"robomongo/gui/editors/FindFrame.h\"\n\nnamespace Robomongo\n{\n    OutputItemContentWidget::OutputItemContentWidget(ViewMode viewMode, MongoShell *shell, \n                                                     const QString &text, double secs, bool multipleResults, \n                                                     bool tabbedResults, bool firstItem, bool lastItem, \n                                                     AggrInfo aggrInfo, QWidget *parent) :\n        BaseClass(parent),\n        _textView(NULL),\n        _bsonTreeview(NULL),\n        _thread(NULL),\n        _bsonTable(NULL),\n        _isTextModeSupported(true),\n        _isTreeModeSupported(false),\n        _isTableModeSupported(false),\n        _isCustomModeSupported(false),\n        _isTextModeInitialized(false),\n        _isTreeModeInitialized(false),\n        _isCustomModeInitialized(false),\n        _isTableModeInitialized(false),\n        _isFirstPartRendered(false),\n        _text(text),\n        _shell(shell),\n        _outputWidget(dynamic_cast<OutputWidget*>(parentWidget())),\n        _initialSkip(0),\n        _initialLimit(0),\n        _mod(NULL),\n        _viewMode(viewMode),\n        _aggrInfo(aggrInfo)\n    {\n        setup(secs, multipleResults, tabbedResults, firstItem, lastItem);\n    }\n\n    OutputItemContentWidget::OutputItemContentWidget(ViewMode viewMode, MongoShell *shell, \n                                                     const QString &type, \n                                                     const std::vector<MongoDocumentPtr> &documents, \n                                                     const MongoQueryInfo &queryInfo, double secs, \n                                                     bool multipleResults, bool tabbedResults,\n                                                     bool firstItem, bool lastItem, AggrInfo aggrInfo,\n                                                     QWidget *parent) :\n        BaseClass(parent),\n        _textView(NULL),\n        _bsonTreeview(NULL),\n        _thread(NULL),\n        _bsonTable(NULL),\n        _isTextModeSupported(true),\n        _isTreeModeSupported(true),\n        _isTableModeSupported(true),\n        _isCustomModeSupported(!type.isEmpty()),\n        _isTextModeInitialized(false),\n        _isTreeModeInitialized(false),\n        _isCustomModeInitialized(false),\n        _isTableModeInitialized(false),\n        _isFirstPartRendered(false),\n        _documents(documents),\n        _queryInfo(queryInfo),\n        _type(type),\n        _shell(shell),\n        _initialSkip(queryInfo._skip),\n        _initialLimit(queryInfo._limit),\n        _outputWidget(dynamic_cast<OutputWidget*>(parentWidget())),\n        _mod(NULL),\n        _viewMode(viewMode),\n        _aggrInfo(aggrInfo)\n    {\n        setup(secs, multipleResults, tabbedResults, firstItem, lastItem);\n    }\n\n    void OutputItemContentWidget::setup(double secs, bool multipleResults, bool tabbedResults,\n                                        bool firstItem, bool lastItem)\n    {      \n        setContentsMargins(0, 0, 0, 0);\n        _header = new OutputItemHeaderWidget(this, multipleResults, tabbedResults, firstItem, lastItem);\n\n        if (_queryInfo._info.isValid()) {\n            _header->setCollection(QtUtils::toQString(_queryInfo._info._ns.collectionName()));\n            _header->paging()->setBatchSize(_queryInfo._batchSize);\n            _header->paging()->setSkip(_queryInfo._skip);\n            if (!_queryInfo._limit)\n                _queryInfo._limit = 50;\n        }\n        else if (_aggrInfo.isValid) {\n            _initialLimit = 0;\n            _initialSkip = 0;\n            _header->setCollection(QtUtils::toQString(_aggrInfo.collectionName));\n            _header->paging()->setBatchSize(_aggrInfo.batchSize);\n            _header->paging()->setSkip(_aggrInfo.skip);\n        }\n\n        _header->setTime(QString(\"%1 sec.\").arg(secs, 0, 'g', 3));\n\n        QVBoxLayout *layout = new QVBoxLayout();\n        layout->setContentsMargins(0, 0, 0, 0);\n        layout->setSpacing(0);\n        layout->addWidget(_header);\n        _stack = new QStackedWidget;\n        layout->addWidget(_stack);\n        setLayout(layout);\n        configureModel();\n\n        VERIFY(connect(_header->paging(), SIGNAL(refreshed(int, int)), this, SLOT(refresh(int, int))));\n        VERIFY(connect(_header->paging(), SIGNAL(leftClicked(int, int)), this, SLOT(paging_leftClicked(int, int))));\n        VERIFY(connect(_header->paging(), SIGNAL(rightClicked(int, int)), this, SLOT(paging_rightClicked(int, int))));\n        VERIFY(connect(_header, SIGNAL(maximizedPart()), this, SIGNAL(maximizedPart())));\n        VERIFY(connect(_header, SIGNAL(restoredSize()), this, SIGNAL(restoredSize())));\n\n        refreshOutputItem();\n    }\n\n    void OutputItemContentWidget::paging_leftClicked(int skip, int limit)\n    {\n        int s = skip - limit;\n\n        if (s < 0)\n            s = 0;\n\n        refresh(s, limit);\n    }\n\n    void OutputItemContentWidget::refreshOutputItem()\n    {\n        switch(_viewMode) {\n            case Text: showText(); break;\n            case Tree: showTree(); break;\n            case Table: showTable(); break;\n            case Custom: showCustom(); break;\n            default: showTree();\n        }\n    }\n\n    void OutputItemContentWidget::paging_rightClicked(int skip, int limit)\n    {\n        skip += limit;\n        refresh(skip, limit);\n    }\n\n    void OutputItemContentWidget::refresh(int skip, int batchSize)\n    {\n        // Cannot set skip lower than in the text query\n        if (skip <  _initialSkip) {\n            _header->paging()->setSkip(_initialSkip);\n            skip = _initialSkip;\n        }\n\n        int skipDelta = skip - _initialSkip;\n        int limit = batchSize;\n\n        // If limit is set to 0 it means UNLIMITED number of documents (limited only by batch size)\n        // This is according to MongoDB documentation.\n        if (_initialLimit != 0) {\n            limit = _initialLimit - skipDelta;\n            if (limit <= 0)\n                limit = -1; // It means that we do not need to load documents\n\n            if (limit > batchSize)\n                limit = batchSize;\n        }\n\n        MongoQueryInfo info(_queryInfo);\n        info._limit = limit;\n        info._skip = skip;\n        info._batchSize = batchSize;\n        _outputWidget->showProgress();\n                \n        _shell->setScriptExecutable(true);\n        if (_aggrInfo.isValid) {\n            // Build original pipeline object, and append extra skip and limit for paging\n            std::string pipelineModified = \"[\";\n            for (int i = 0; ; i++) {\n                auto const obj = mongo::tojson(_aggrInfo.pipeline.getObjectField(std::to_string(i)));\n                if (obj.empty() || \"{}\" == obj)\n                    break;\n\n                pipelineModified.append(obj + \",\");\n            }\n            pipelineModified.append(\"{$skip:\" + std::to_string(skip) + \"}, \" +\n                                    \"{$limit:\" + std::to_string(batchSize) + \"}\" + \n                                    \"]\");\n\n            std::string const query = \"db.getCollection('\" + _aggrInfo.collectionName + \"').aggregate(\" +\n                                      pipelineModified + \", \" + _aggrInfo.options.toString() + \")\";\n            \n            // Create aggr. info with new skip and batchsize\n            AggrInfo const aggrInfo { _aggrInfo.collectionName, skip, batchSize, _aggrInfo.pipeline, \n                                      _aggrInfo.options, _outputWidget->resultIndex(this) };\n            _shell->setAggrInfo(aggrInfo);\n            _shell->execute(query);\n        }\n        else\n            _shell->query(_outputWidget->resultIndex(this), info);\n    }\n\n    void OutputItemContentWidget::updateWithInfo(const MongoQueryInfo &inf, \n                                                 const std::vector<MongoDocumentPtr> &documents)\n    {\n        update(documents, inf._skip, inf._batchSize);\n    }\n\n    void OutputItemContentWidget::updateWithInfo(const AggrInfo &aggrInfo, \n                                                 const std::vector<MongoDocumentPtr> &documents)\n    {\n        update(documents, aggrInfo.skip, aggrInfo.batchSize);\n    }\n\n    void OutputItemContentWidget::update(const std::vector<MongoDocumentPtr> &documents, int skip, int batchSize)\n    {\n        _documents = documents;\n\n        _header->paging()->setSkip(skip);\n        _header->paging()->setBatchSize(batchSize);\n\n        _text.clear();\n        _isFirstPartRendered = false;\n        markUninitialized();\n\n        if (_bsonTable) {\n            _stack->removeWidget(_bsonTable);\n            delete _bsonTable;\n            _bsonTable = NULL;\n        }\n\n        if (_bsonTreeview) {\n            _stack->removeWidget(_bsonTreeview);\n            delete _bsonTreeview;\n            _bsonTreeview = NULL;\n        }\n\n        if (_textView) {\n            _stack->removeWidget(_textView);\n            delete _textView;\n            _textView = NULL;\n        }\n        configureModel();\n    }\n\n    void OutputItemContentWidget::showText()\n    {\n        _viewMode = Text;\n        _header->showText();\n        if (!_isTextModeSupported)\n            return;\n\n        if (!_isTextModeInitialized)\n        {\n            _textView = configureLogText();\n            if (!_text.isEmpty()) {\n                _textView->sciScintilla()->setText(_text);\n            }\n            else {\n                if (_documents.size() > 0) {\n                    _textView->sciScintilla()->setText(\"Loading...\");\n                    _thread = new JsonPrepareThread(_documents, AppRegistry::instance().settingsManager()->uuidEncoding(), AppRegistry::instance().settingsManager()->timeZone());\n                    VERIFY(connect(_thread, SIGNAL(partReady(const QString&)), this, SLOT(jsonPartReady(const QString&))));\n                    VERIFY(connect(_thread, SIGNAL(finished()), _thread, SLOT(deleteLater())));\n                    _thread->start();\n                }\n            }\n            _stack->addWidget(_textView);\n            _isTextModeInitialized = true;\n        }\n\n        _stack->setCurrentWidget(_textView);\n    }\n\n    void OutputItemContentWidget::showTree()\n    {\n        _viewMode = Tree;\n        _header->showTree();\n        if (!_isTreeModeSupported) {\n            // try to downgrade to text mode\n            showText();\n            _viewMode = Tree;\n            return;\n        }\n\n        if (!_isTreeModeInitialized) {\n            _bsonTreeview = new BsonTreeView(_shell, _queryInfo, this);\n            _bsonTreeview->setModel(_mod);\n            _stack->addWidget(_bsonTreeview);\n\n            if (true == AppRegistry::instance().settingsManager()->autoExpand())\n                // Expanding only one level, because on large\n                // documents it can take much time\n                _bsonTreeview->expand(_mod->index(0, 0, QModelIndex()));\n\n            _isTreeModeInitialized = true;\n        }\n\n        _stack->setCurrentWidget(_bsonTreeview);\n    }\n\n    void OutputItemContentWidget::showCustom()\n    {\n        _viewMode = Custom;\n        _header->showCustom();\n\n        if (!_isCustomModeSupported) {\n            // try to downgrade to tree mode\n            showTree();\n            _viewMode = Custom;\n            return;\n        }\n\n        if (!_isCustomModeInitialized) {\n\n            if (_type == \"collectionStats\") {\n                _collectionStats = new CollectionStatsTreeWidget(_documents, NULL);\n                _stack->addWidget(_collectionStats);\n            }               \n            _isCustomModeInitialized = true;\n        }\n\n        if (_collectionStats)\n            _stack->setCurrentWidget(_collectionStats);\n    }\n\n    void OutputItemContentWidget::showTable()\n    {\n        _viewMode = Table;\n        _header->showTable();\n        if (!_isTableModeSupported) {\n            // try to downgrade to text mode\n            showText();\n            _viewMode = Table;\n            return;\n        }\n\n        if (!_isTableModeInitialized) {\n            _bsonTable = new BsonTableView(_shell, _queryInfo);\n            BsonTableModelProxy *modp = new BsonTableModelProxy(_bsonTable);\n            modp->setSourceModel(_mod);\n            _bsonTable->setModel(modp);\n            _stack->addWidget(_bsonTable);\n            _isTableModeInitialized = true;\n        }\n\n        _stack->setCurrentWidget(_bsonTable);\n    }\n\n    void OutputItemContentWidget::markUninitialized()\n    {\n        _isTextModeInitialized = false;\n        _isTreeModeInitialized = false;\n        _isCustomModeInitialized = false;\n        _isTableModeInitialized = false;\n    }\n\n    void OutputItemContentWidget::applyDockUndockSettings(bool isDocking) const\n    {\n        _header->applyDockUndockSettings(isDocking);\n    }\n\n    void OutputItemContentWidget::toggleOrientation(Qt::Orientation orientation) const\n    {\n        _header->toggleOrientation(orientation);\n    }\n\n    void OutputItemContentWidget::jsonPartReady(const QString &json)\n    {\n        // check that this is our current thread\n        JsonPrepareThread *thread = qobject_cast<JsonPrepareThread *>(sender());\n        if (thread && thread != _thread)\n        {\n            // close previous thread\n            thread->stop();\n            thread->wait();\n        }\n        else\n        {\n            if (_textView)\n            {\n                if (_isFirstPartRendered)\n                    _textView->sciScintilla()->append(json);\n                else\n                    _textView->sciScintilla()->setText(json);\n                _isFirstPartRendered = true;\n            }\n        }\n    }\n    \n    BsonTreeModel *OutputItemContentWidget::configureModel()\n    {\n        delete _mod;\n        _mod = new BsonTreeModel(_documents, this);\n        return _mod;\n    }\n\n    FindFrame *Robomongo::OutputItemContentWidget::configureLogText()\n    {\n        const QFont &textFont = GuiRegistry::instance().font();\n\n        QsciLexerJavaScript *javaScriptLexer = new JSLexer(this);\n        javaScriptLexer->setFont(textFont);\n\n        FindFrame *_logText = new FindFrame(this);\n        _logText->sciScintilla()->setLexer(javaScriptLexer);\n        _logText->sciScintilla()->setTabWidth(4);        \n        _logText->sciScintilla()->setAppropriateBraceMatching();\n        _logText->sciScintilla()->setFont(textFont);\n        _logText->sciScintilla()->setReadOnly(true);\n        _logText->sciScintilla()->setWrapMode((QsciScintilla::WrapMode) QsciScintilla::SC_WRAP_NONE);\n        _logText->sciScintilla()->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);\n        _logText->sciScintilla()->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);\n        // Wrap mode turned off because it introduces huge performance problems\n        // even for medium size documents.    \n        _logText->sciScintilla()->setStyleSheet(\"QFrame {background-color: rgb(73, 76, 78); border: 1px solid #c7c5c4; border-radius: 0px; margin: 0px; padding: 0px;}\");\n        return _logText;\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/OutputItemContentWidget.h",
    "content": "#pragma once\n\n#include <QStackedWidget>\n\n#include \"robomongo/core/Core.h\"\n#include \"robomongo/core/domain/MongoQueryInfo.h\"\n#include \"robomongo/core/domain/MongoAggregateInfo.h\"\n#include \"robomongo/core/Enums.h\"\n#include <vector>\n\nnamespace Robomongo\n{\n    class FindFrame;\n    class BsonTreeView;\n    class BsonTableView;\n    class BsonTreeModel;\n    class JsonPrepareThread;\n    class CollectionStatsTreeWidget;\n    class MongoShell;\n    class OutputItemHeaderWidget;\n    class OutputWidget;\n\n    class OutputItemContentWidget : public QWidget\n    {\n        Q_OBJECT\n\n    public:\n        typedef QWidget BaseClass;\n        OutputItemContentWidget(ViewMode viewMode, MongoShell *shell, const QString &text, double secs,\n                                bool multipleResults, bool tabbedResults, bool firstItem, bool lastItem,\n                                AggrInfo aggrInfo, QWidget *parent);\n\n        OutputItemContentWidget(ViewMode viewMode, MongoShell *shell, const QString &type,\n                                const std::vector<MongoDocumentPtr> &documents, \n                                const MongoQueryInfo &queryInfo, double secs, bool multipleResults,\n                                bool tabbedResults, bool firstItem, bool lastItem, AggrInfo aggrInfo,\n                                QWidget *parent);\n        int _initialSkip;\n        int _initialLimit;\n        void updateWithInfo(const MongoQueryInfo &inf, const std::vector<MongoDocumentPtr> &documents);\n        void updateWithInfo(const AggrInfo &aggrInfo, const std::vector<MongoDocumentPtr> &documents);\n        void update(const std::vector<MongoDocumentPtr> &documents, int skip, int batchSize);\n        bool isTextModeSupported() const { return _isTextModeSupported; }\n        bool isTreeModeSupported() const { return _isTreeModeSupported; }\n        bool isCustomModeSupported() const { return _isCustomModeSupported; }\n        bool isTableModeSupported() const { return _isTableModeSupported; }\n        ViewMode viewMode() const { return _viewMode; }\n\n        void refreshOutputItem();\n        void markUninitialized();\n\n        void applyDockUndockSettings(bool isDocking) const;\n        void toggleOrientation(Qt::Orientation orientation) const;\n\n        const OutputWidget* outputWidget() const { return _outputWidget; }\n\n    Q_SIGNALS:\n        void restoredSize();\n        void maximizedPart();\n\n    public Q_SLOTS:\n        void showText();\n        void showTree();        \n        void showTable();\n        void showCustom();\n\n    private Q_SLOTS:\n        void jsonPartReady(const QString &json);\n        void refresh(int skip, int batchSize);\n        void paging_rightClicked(int skip, int batchSize);\n        void paging_leftClicked(int skip, int limit);      \n\n    private:\n        void setup(double secs, bool multipleResults, bool tabbedResults, bool firstItem, bool lastItem);\n        FindFrame *configureLogText();\n        BsonTreeModel *configureModel();\n\n        FindFrame *_textView;\n        BsonTreeView *_bsonTreeview;\n        BsonTableView *_bsonTable;\n        BsonTreeModel *_mod;\n        CollectionStatsTreeWidget *_collectionStats;\n\n        QString _text;\n        QString _type; // type of request\n        std::vector<MongoDocumentPtr> _documents;\n        MongoQueryInfo _queryInfo;\n        AggrInfo _aggrInfo;\n\n        QStackedWidget *_stack;\n        JsonPrepareThread *_thread;\n\n        MongoShell *_shell;\n        OutputItemHeaderWidget *_header;\n        OutputWidget *_outputWidget;\n        bool _isTextModeSupported;\n        bool _isTreeModeSupported;\n        bool _isTableModeSupported;\n        bool _isCustomModeSupported;\n\n        bool _isTextModeInitialized;\n        bool _isTreeModeInitialized;\n        bool _isTableModeInitialized;\n        bool _isCustomModeInitialized;\n\n        bool _isFirstPartRendered;\n        ViewMode _viewMode;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/OutputItemHeaderWidget.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/OutputItemHeaderWidget.h\"\n\n#include <QHBoxLayout>\n#include <QLabel>\n#include <QPushButton>\n#include <QSplitter>\n\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/widgets/workarea/QueryWidget.h\"\n#include \"robomongo/gui/widgets/workarea/OutputWidget.h\"\n#include \"robomongo/gui/widgets/workarea/OutputItemContentWidget.h\"\n#include \"robomongo/gui/widgets/workarea/IndicatorLabel.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n\nnamespace\n{\n    QFrame *createVerticalLine()\n    {\n        QFrame *vline = new QFrame();\n        vline->setFrameShape(QFrame::VLine);\n        vline->setFrameShadow(QFrame::Sunken);\n        vline->setFixedWidth(5);\n        return vline;\n    }\n}\n\nnamespace Robomongo\n{\n\n    OutputItemHeaderWidget::OutputItemHeaderWidget(\n            OutputItemContentWidget *outputItemContentWidget, bool multipleResults, \n            bool tabbedResults, bool firstItem, bool lastItem, QWidget *parent) :\n        QFrame(parent),\n        _maxButton(nullptr), _dockUndockButton(nullptr), _maximized(false), \n        _multipleResults(multipleResults), \n        _firstItem(firstItem), _lastItem(lastItem), _orientation(Qt::Vertical)\n    {\n        setContentsMargins(5, 0, 0, 0);\n\n        auto const* outputWidget = qobject_cast<OutputWidget*>(outputItemContentWidget->parentWidget());\n        _orientation = outputWidget->getOrientation();\n\n        // Text mode button\n        _textButton = new QPushButton(this);\n        _textButton->setIcon(GuiRegistry::instance().textIcon());\n        _textButton->setToolTip(\"View results in text mode\");\n        _textButton->setFixedSize(24, 24);\n        _textButton->setFlat(true);\n        _textButton->setCheckable(true);\n\n        // Tree mode button\n        _treeButton = new QPushButton(this);\n        _treeButton->hide();\n        _treeButton->setIcon(GuiRegistry::instance().treeIcon());\n        _treeButton->setToolTip(\"View results in tree mode\");\n        _treeButton->setFixedSize(24, 24);\n        _treeButton->setFlat(true);\n        _treeButton->setCheckable(true);\n        _treeButton->setChecked(true);     \n\n        // Table mode button\n        _tableButton = new QPushButton(this);\n        _tableButton->hide();\n        _tableButton->setIcon(GuiRegistry::instance().tableIcon());\n        _tableButton->setToolTip(\"View results in table mode\");\n        _tableButton->setFixedSize(24, 24);\n        _tableButton->setFlat(true);\n        _tableButton->setCheckable(true);\n        _tableButton->setChecked(true);       \n\n        // Custom mode button\n        _customButton = new QPushButton(this);\n        _customButton->hide();\n        _customButton->setIcon(GuiRegistry::instance().customIcon());\n        _customButton->setToolTip(\"View results in custom UI\");\n        _customButton->setFixedSize(24, 24);\n        _customButton->setFlat(true);\n        _customButton->setCheckable(true);\n\n        // Create maximize button only if there are multiple results\n        if (_multipleResults && !tabbedResults) {\n            _maxButton = new QPushButton;\n            _maxButton->setIcon(GuiRegistry::instance().maximizeIcon());\n            _maxButton->setToolTip(\"Maximize this output result (double-click on result's header)\");\n            _maxButton->setFixedSize(18, 18);\n            _maxButton->setFlat(true);\n            VERIFY(connect(_maxButton, SIGNAL(clicked()), this, SLOT(maximizeMinimizePart())));\n        }\n\n        auto dockWidget = qobject_cast<QueryWidget::CustomDockWidget*>(outputItemContentWidget->parentWidget()->parentWidget());\n        auto queryWidget = dockWidget->getParentQueryWidget();\n        \n        _dockUndockButton = new QPushButton;\n        _dockUndockButton->setFixedSize(18, 18);\n        _dockUndockButton->setFlat(true);\n        _dockUndockButton->setHidden(true);\n        applyDockUndockSettings(!dockWidget->isFloating());\n        VERIFY(connect(_dockUndockButton, SIGNAL(clicked()), queryWidget, SLOT(dockUndock())));\n\n        VERIFY(connect(_textButton, SIGNAL(clicked()), outputItemContentWidget, SLOT(showText())));\n        VERIFY(connect(_treeButton, SIGNAL(clicked()), outputItemContentWidget, SLOT(showTree())));\n        VERIFY(connect(_tableButton, SIGNAL(clicked()), outputItemContentWidget, SLOT(showTable())));\n        VERIFY(connect(_customButton, SIGNAL(clicked()), outputItemContentWidget, SLOT(showCustom())));\n\n        _collectionIndicator = new Indicator(GuiRegistry::instance().collectionIcon());\n        _timeIndicator = new Indicator(GuiRegistry::instance().timeIcon());\n        _paging = new PagingWidget();\n\n        _collectionIndicator->hide();\n        _timeIndicator->hide();\n        _paging->hide();\n\n        QHBoxLayout *layout = new QHBoxLayout();\n#ifdef __APPLE__\n        layout->setContentsMargins(2, 8, 5, 1);\n#else  \n        layout->setContentsMargins(2, 0, 5, 1);\n#endif\n        layout->setSpacing(0);\n        layout->addWidget(_collectionIndicator);\n        layout->addWidget(_timeIndicator);\n        QSpacerItem *hSpacer = new QSpacerItem(2000, 24, QSizePolicy::Preferred, QSizePolicy::Minimum);\n        layout->addSpacerItem(hSpacer);\n        layout->addWidget(_paging);\n        layout->addWidget(createVerticalLine());\n        layout->addSpacing(2);\n\n        if (outputItemContentWidget->isCustomModeSupported()) {\n            layout->addWidget(_customButton, 0, Qt::AlignRight);\n            _customButton->show();\n        }\n\n        if (outputItemContentWidget->isTreeModeSupported()) {\n            layout->addWidget(_treeButton, 0, Qt::AlignRight);\n            _treeButton->show();\n        }\n\n        if (outputItemContentWidget->isTableModeSupported()) {\n            layout->addWidget(_tableButton, 0, Qt::AlignRight);\n            _tableButton->show();\n        }\n\n        if (outputItemContentWidget->isTextModeSupported())\n            layout->addWidget(_textButton, 0, Qt::AlignRight);\n\n        if (_multipleResults)\n            layout->addWidget(_maxButton, 0, Qt::AlignRight);\n\n        layout->addSpacing(3);\n        _verticalLine = createVerticalLine();\n        _verticalLine->setHidden(true);\n        layout->addWidget(_verticalLine);\n        layout->addWidget(_dockUndockButton);\n\n        setLayout(layout);\n\n        // Update dock/undock button visibility\n        if (_multipleResults)\n            updateDockButtonOnToggleOrientation();\n        else {\n            _verticalLine->setVisible(true);\n            _dockUndockButton->setVisible(true);\n        }\n      \n        if(tabbedResults)\n            setStyleSheet(\"background-color: white\");\n    }\n\n    void OutputItemHeaderWidget::mouseDoubleClickEvent(QMouseEvent *)\n    {\n        maximizeMinimizePart();\n    }\n\n    void OutputItemHeaderWidget::showText()\n    {\n        _textButton->setIcon(GuiRegistry::instance().textHighlightedIcon());\n        _textButton->setChecked(true);\n        _treeButton->setIcon(GuiRegistry::instance().treeIcon());\n        _treeButton->setChecked(false);\n        _tableButton->setIcon(GuiRegistry::instance().tableIcon());\n        _tableButton->setChecked(false);\n        _customButton->setIcon(GuiRegistry::instance().customIcon());\n        _customButton->setChecked(false);\n    }\n\n    void OutputItemHeaderWidget::showTree()\n    {\n        _textButton->setIcon(GuiRegistry::instance().textIcon());\n        _textButton->setChecked(false);\n        _treeButton->setIcon(GuiRegistry::instance().treeHighlightedIcon());\n        _treeButton->setChecked(true);\n        _tableButton->setIcon(GuiRegistry::instance().tableIcon());\n        _tableButton->setChecked(false);\n        _customButton->setIcon(GuiRegistry::instance().customIcon());\n        _customButton->setChecked(false);\n    }\n\n    void OutputItemHeaderWidget::showTable()\n    {\n        _textButton->setIcon(GuiRegistry::instance().textIcon());\n        _textButton->setChecked(false);\n        _treeButton->setIcon(GuiRegistry::instance().treeIcon());\n        _treeButton->setChecked(false);\n        _tableButton->setIcon(GuiRegistry::instance().tableHighlightedIcon());\n        _tableButton->setChecked(true);\n        _customButton->setIcon(GuiRegistry::instance().customIcon());\n        _customButton->setChecked(false);\n    }\n\n    void OutputItemHeaderWidget::showCustom()\n    {\n        _textButton->setIcon(GuiRegistry::instance().textIcon());\n        _textButton->setChecked(false);\n        _treeButton->setIcon(GuiRegistry::instance().treeIcon());\n        _treeButton->setChecked(false);\n        _tableButton->setIcon(GuiRegistry::instance().tableIcon());\n        _tableButton->setChecked(false);\n        _customButton->setIcon(GuiRegistry::instance().customHighlightedIcon());\n        _customButton->setChecked(true);\n    }\n\n    void OutputItemHeaderWidget::applyDockUndockSettings(bool isDocking)\n    {\n        if (isDocking) {\n            _dockUndockButton->setIcon(GuiRegistry::instance().undockIcon());\n            _dockUndockButton->setToolTip(\"Undock into separate window\");\n        }\n        else {\n            _dockUndockButton->setIcon(GuiRegistry::instance().dockIcon());\n            _dockUndockButton->setToolTip(\"Dock into main window\");\n        }\n    }\n\n    void OutputItemHeaderWidget::toggleOrientation(Qt::Orientation orientation)\n    {\n        if (!_firstItem && !_lastItem) \n            return;\n\n        _orientation = orientation;\n        updateDockButtonOnToggleOrientation();\n    }\n\n    void OutputItemHeaderWidget::setTime(const QString &time)\n    {\n        _timeIndicator->setVisible(!time.isEmpty());\n        _timeIndicator->setText(time);\n    }\n\n    void OutputItemHeaderWidget::setCollection(const QString &collection)\n    {\n        _collectionIndicator->setVisible(!collection.isEmpty());\n        _collectionIndicator->setText(collection);\n    }\n\n    void OutputItemHeaderWidget::maximizeMinimizePart()\n    {\n        // No maximize/minimize behaviour if there is only one query result\n        if (!_multipleResults)\n            return;\n\n        if (_maximized) {   // restoring original size\n            emit restoredSize();\n            _maxButton->setIcon(GuiRegistry::instance().maximizeIcon());\n            _maxButton->setToolTip(\"Maximize this output result (double-click on result header)\");\n            updateDockButtonOnToggleOrientation();\n        }\n        else {              // maximizing\n            emit maximizedPart();\n            _maxButton->setIcon(GuiRegistry::instance().minimizeIcon());\n            _maxButton->setToolTip(\"Restore back to original size (double-click on result header)\");\n            _verticalLine->setVisible(true);\n            _dockUndockButton->setVisible(true);\n        }\n\n        _maximized = !_maximized;\n    }\n    \n    void OutputItemHeaderWidget::updateDockButtonOnToggleOrientation() const\n    {\n        if (!_multipleResults)\n            return;\n\n        if (_firstItem) {\n            _verticalLine->setVisible(Qt::Vertical == _orientation);\n            _dockUndockButton->setVisible(Qt::Vertical == _orientation);\n        }\n        else if (_lastItem) {\n            _verticalLine->setVisible(Qt::Horizontal == _orientation);\n            _dockUndockButton->setVisible(Qt::Horizontal == _orientation);\n        }\n        else {\n            _verticalLine->setVisible(false);\n            _dockUndockButton->setVisible(false);\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/OutputItemHeaderWidget.h",
    "content": "#pragma once\n\n#include <QWidget>\nQT_BEGIN_NAMESPACE\nclass QPushButton;\nQT_END_NAMESPACE\n\n#include \"robomongo/gui/editors/PlainJavaScriptEditor.h\"\n#include \"robomongo/core/domain/MongoShellResult.h\"\n#include \"robomongo/gui/widgets/workarea/PagingWidget.h\"\n\nnamespace Robomongo\n{\n    class OutputItemContentWidget;\n    class Indicator;\n\n    class OutputItemHeaderWidget : public QFrame\n    {\n        Q_OBJECT\n\n    public:\n        OutputItemHeaderWidget(OutputItemContentWidget *output, bool multipleResults, bool tabbedResults,\n                               bool firstItem, bool lastItem, QWidget *parent = nullptr);\n        PagingWidget *paging() const { return _paging; }\n        void showText();\n        void showTree();\n        void showTable();\n        void showCustom();\n        void applyDockUndockSettings(bool docking);\n        void toggleOrientation(Qt::Orientation orientation);\n\n    protected:\n        virtual void mouseDoubleClickEvent(QMouseEvent *);\n\n    Q_SIGNALS:\n        void restoredSize();\n        void maximizedPart();\n\n    public Q_SLOTS:        \n        void setTime(const QString &time);\n        void setCollection(const QString &collection);\n        void maximizeMinimizePart();\n\n    private:\n        void updateDockButtonOnToggleOrientation() const;\n\n        QPushButton *_textButton;\n        QPushButton *_treeButton;\n        QPushButton *_tableButton;\n        QPushButton *_customButton;\n        QPushButton *_maxButton;\n        QFrame *_verticalLine;\n        QPushButton *_dockUndockButton;\n        Indicator *_collectionIndicator;\n        Indicator *_timeIndicator;\n        PagingWidget *_paging;\n\n        bool _maximized;\n        bool _multipleResults;\n        bool _firstItem;\n        bool _lastItem;\n        Qt::Orientation _orientation;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/OutputWidget.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/OutputWidget.h\"\n\n#include <QHBoxLayout>\n#include <QSplitter>\n#include <QWidget>\n#include <QMouseEvent>\n\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/domain/MongoShell.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\n#include \"robomongo/gui/widgets/workarea/OutputItemContentWidget.h\"\n#include \"robomongo/gui/widgets/workarea/ProgressBarPopup.h\"\n#include \"robomongo/gui/widgets/workarea/WorkAreaTabBar.h\"\n\nnamespace Robomongo\n{\n    OutputWidget::OutputWidget(QWidget *parent) :\n        QTabWidget(parent), _splitter(new QSplitter), _tabbedResults(false)\n    {\n        _splitter->setOrientation(Qt::Vertical);\n        _splitter->setHandleWidth(1);\n        _splitter->setContentsMargins(0, 0, 0, 0);\n\n        QVBoxLayout *layout = new QVBoxLayout();\n        layout->setContentsMargins(0, 0, 0, 0);\n        layout->setSpacing(0);\n        layout->addWidget(_splitter);\n        setLayout(layout);\n\n        setTabsClosable(true);\n        setElideMode(Qt::ElideRight);\n        setMovable(true);\n#ifdef __APPLE__      \n        setDocumentMode(false);\n#else        \n        setDocumentMode(true);\n#endif        \n        setStyleSheet(buildStyleSheet());\n        VERIFY(connect(this, SIGNAL(tabCloseRequested(int)), SLOT(tabCloseRequested(int))));\n        \n        _progressBarPopup = new ProgressBarPopup(this);\n    }\n\n    void OutputWidget::present(MongoShell *shell, const std::vector<MongoShellResult> &results)\n    {\n        if (_prevResultsCount > 0)\n            clearAllParts();\n        \n        int const RESULTS_SIZE = _prevResultsCount = results.size();\n        bool const multipleResults = (RESULTS_SIZE > 1);\n        _tabbedResults = (RESULTS_SIZE > 2);\n        _splitter->setHidden(_tabbedResults ? true : false);\n        _outputItemContentWidgets.clear();        \n\n        while (count() > 0)\n            removeTab(count()-1);\n\n        for (int i = 0; i < RESULTS_SIZE; ++i) {\n            MongoShellResult shellResult = results[i];\n            double secs = shellResult.elapsedMs() / 1000.f;\n            ViewMode viewMode = AppRegistry::instance().settingsManager()->viewMode();\n            if (_prevViewModes.size()) {\n                viewMode = _prevViewModes.back();\n                _prevViewModes.pop_back();\n            }\n\n            bool const firstItem = (0 == i);\n            bool const lastItem = (RESULTS_SIZE-1 == i);\n\n            OutputItemContentWidget* item = nullptr;\n            if (shellResult.documents().size() > 0) {\n                item = new OutputItemContentWidget(viewMode, shell, QtUtils::toQString(shellResult.type()),\n                                                   shellResult.documents(), shellResult.queryInfo(), secs, \n                                                   multipleResults, _tabbedResults, firstItem, lastItem,\n                                                   shellResult.aggrInfo(), this);\n            } else {\n                item = new OutputItemContentWidget(viewMode, shell, QtUtils::toQString(shellResult.response()), \n                                                   secs, multipleResults, _tabbedResults, firstItem, lastItem,\n                                                   shellResult.aggrInfo(), this);\n            }\n            VERIFY(connect(item, SIGNAL(maximizedPart()), this, SLOT(maximizePart())));\n            VERIFY(connect(item, SIGNAL(restoredSize()), this, SLOT(restoreSize())));\n\n            if (_tabbedResults) {\n                addTab(item, QString::fromStdString(shellResult.statementShort()));\n                setTabToolTip(i, QString::fromStdString(shellResult.statement()));\n            }\n            else\n                _splitter->addWidget(item);\n             \n            _outputItemContentWidgets.push_back(item);\n        }\n        \n        tryToMakeAllPartsEqualInSize();\n    }\n\n    void OutputWidget::updatePart(int partIndex, const MongoQueryInfo &queryInfo, \n                                  const std::vector<MongoDocumentPtr> &documents)\n    {\n        if (!_tabbedResults && partIndex >= _splitter->count())\n            return;\n\n        OutputItemContentWidget* outputItemContentWidget = nullptr;\n        if(_tabbedResults)\n            outputItemContentWidget = qobject_cast<OutputItemContentWidget*>(currentWidget());\n        else\n            outputItemContentWidget = qobject_cast<OutputItemContentWidget*>(_splitter->widget(partIndex));\n        \n        outputItemContentWidget->updateWithInfo(queryInfo, documents);\n        outputItemContentWidget->refreshOutputItem();\n    }\n\n    void OutputWidget::updatePart(int partIndex, const AggrInfo &agrrInfo, \n                                  const std::vector<MongoDocumentPtr> &documents)\n    {\n        if (partIndex >= _splitter->count())\n            return;\n\n        auto outputItemContentWidget = qobject_cast<OutputItemContentWidget*>(_splitter->widget(partIndex));\n        outputItemContentWidget->updateWithInfo(agrrInfo, documents);\n        outputItemContentWidget->refreshOutputItem();\n    }\n\n    void OutputWidget::toggleOrientation()\n    {\n        bool const horizontal = _splitter->orientation() == Qt::Horizontal;\n        _splitter->setOrientation(horizontal ? Qt::Vertical : Qt::Horizontal);\n        int const COUNT = _splitter->count();\n        if (COUNT > 1) {\n            auto const* firstItem = qobject_cast<OutputItemContentWidget*>(_splitter->widget(0));\n            auto const* lastItem = qobject_cast<OutputItemContentWidget*>(_splitter->widget(COUNT-1));\n            firstItem->toggleOrientation(_splitter->orientation());\n            lastItem->toggleOrientation(_splitter->orientation());\n        }\n    }\n\n    void OutputWidget::switchMode(\n        std::function<void(OutputItemContentWidget*)> modeFunc\n    )\n    {\n        if (_tabbedResults) {\n            QWidget* currentTab { widget(currentIndex()) };\n            modeFunc(qobject_cast<OutputItemContentWidget*>(currentTab));\n        }\n        else {\n            for (int i = 0; i < _splitter->count(); i++) {\n                QWidget* widget { _splitter->widget(i) };\n                modeFunc(qobject_cast<OutputItemContentWidget*>(widget));\n            }\n        }\n    }\n\n    void OutputWidget::enterTreeMode() \n    {\n        switchMode(&OutputItemContentWidget::showTree);\n    }\n\n    void OutputWidget::enterTextMode() \n    {\n        switchMode(&OutputItemContentWidget::showText);\n    }\n\n    void OutputWidget::enterTableMode()\n    {\n        switchMode(&OutputItemContentWidget::showTable);\n    }\n\n    void OutputWidget::enterCustomMode()\n    {\n        switchMode(&OutputItemContentWidget::showCustom);\n    }\n\n    void OutputWidget::maximizePart()\n    {\n        OutputItemContentWidget *result = qobject_cast<OutputItemContentWidget *>(sender());\n        int count = _splitter->count();\n        for (int i = 0; i < count; i++) {\n            OutputItemContentWidget *widget = (OutputItemContentWidget *) _splitter->widget(i);\n\n            if (widget != result)\n                widget->hide();\n        }\n    }\n\n    void OutputWidget::tabCloseRequested(int index)\n    {\n        removeTab(index);\n    }\n\n    void OutputWidget::restoreSize()\n    {\n        int count = _splitter->count();\n        for (int i = 0; i < count; i++) {\n            OutputItemContentWidget *widget = (OutputItemContentWidget *) _splitter->widget(i);\n            widget->show();\n        }\n    }\n\n    int OutputWidget::resultIndex(OutputItemContentWidget *result)\n    {\n        return _splitter->indexOf(result);\n    }\n\n    void OutputWidget::showProgress()\n    {\n        QSize siz = size();\n        QPoint point(siz.width() / 2 - ProgressBarPopup::width/2, siz.height() / 2 - ProgressBarPopup::height/2);\n        _progressBarPopup->move(point);\n        _progressBarPopup->show();\n    }\n\n    void OutputWidget::hideProgress()\n    {\n        _progressBarPopup->hide();\n    }\n\n    bool OutputWidget::progressBarActive() const \n    {\n        return _progressBarPopup->isVisible();\n    }\n\n    void OutputWidget::applyDockUndockSettings(bool isDocking) const\n    {\n        for (auto const& item : _outputItemContentWidgets) {\n            item->applyDockUndockSettings(isDocking);\n        }\n    }\n\n    Qt::Orientation OutputWidget::getOrientation() const\n    {\n        return _splitter->orientation();\n    }\n\n    void OutputWidget::mouseReleaseEvent(QMouseEvent * event)\n    {\n        if (event->button() != Qt::MidButton)\n            return;\n\n        int const tabIndex = tabBar()->tabAt(event->pos());\n        removeTab(tabIndex);\n        QTabWidget::mouseReleaseEvent(event);\n    }\n\n    void OutputWidget::clearAllParts()\n    {\n        _prevViewModes.clear();\n        while (_splitter->count() > 0) {\n            OutputItemContentWidget *widget =  (OutputItemContentWidget *)_splitter->widget(_splitter->count()-1);\n            _prevViewModes.push_back(widget->viewMode());\n            widget->hide();\n            delete widget;\n        }\n    }\n\n    QString OutputWidget::buildStyleSheet()\n    {\n        QColor background = palette().window().color();\n        QColor gradientZero = QColor(\"#ffffff\"); //Qt::white;//.lighter(103);\n        QColor gradientOne = background.lighter(104); //Qt::white;//.lighter(103);\n        QColor gradientTwo = background.lighter(108); //.lighter(103);\n        QColor selectedBorder = background.darker(103);\n\n        QString aga1 = gradientOne.name();\n        QString aga2 = gradientTwo.name();\n        QString aga3 = background.name();\n\n#ifdef __APPLE__      \n        QString styles = QString(\n            \"QTabWidget::pane { background-color: white; }\"   // This style disables default styling under Mac\n            \"QTabWidget::tab-bar {\"\n                \"alignment: left;\"\n                \"border-top-left-radius: 2px;\"\n                \"border-top-right-radius: 2px;\"\n            \"}\"\n            \"QTabBar::close-button { \"\n                \"margin-top: 2px;\"              \n                \"image: url(:/robomongo/icons/close_2_Mac_16x16.png);\"\n                \"width: 10px;\"\n                \"height: 10px;\"\n                \"}\"\n            \"QTabBar::close-button:hover { \"\n                \"image: url(:/robomongo/icons/close_hover_16x16.png);\"\n                \"width: 15px;\"\n                \"height: 15px;\"\n            \"}\"\n            \"QTabBar::tab:selected { \"\n                \"background: white; /*#E1E1E1*/; \"\n                \"color: #282828;\"\n            \"} \"\n            \"QTabBar::tab {\"\n                \"color: #505050;\"\n                \"font-size: 11px;\"\n                \"background: %1;\"\n                \"border-top-left-radius: 2px;\"\n                \"border-top-right-radius: 2px;\"\n                \"border-right: 1px solid #aaaaaa;\"\n                \"padding: 8px 0px 5px 0px;\" // top r b l\n            \"}\"\n        ).arg(QWidget::palette().color(QWidget::backgroundRole()).darker(114).name());\n#else // Wind and Linux\n        QString styles = QString(\n            \"QTabBar::close-button { \"\n                \"image: url(:/robomongo/icons/close_2_16x16.png);\"\n                \"width: 10px;\"\n                \"height: 10px;\"\n            \"}\"\n            \"QTabBar::close-button:hover { \"\n                  \"image: url(:/robomongo/icons/close_hover_16x16.png);\"\n                  \"width: 15px;\"\n                  \"height: 15px;\"\n            \"}\"\n            \"QTabBar::tab {\"\n                \"background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,\"\n                                            \"stop: 0 #F0F0F0, stop: 0.4 #DEDEDE,\"\n                                            \"stop: 0.5 #E6E6E6, stop: 1.0 #E1E1E1);\"\n                \"border: 1px solid #C4C4C3;\"\n                \"border-bottom-color: #B8B7B6;\" // #C2C7CB same as the pane color\n                \"border-top-left-radius: 6px;\"\n                \"border-top-right-radius: 6px;\"\n                \"padding: 4px 4px 5px 8px;\"\n                \"max-width: 200px;\"\n                \"margin: 0px;\"\n                \"margin-left: 1px;\"\n                \"margin-right: -3px;\"  // it should be -(tab:first:margin-left + tab:last:margin-left) to fix incorrect text elidement                \n            \"}\"\n            \"QTabBar::tab:selected, QTabBar::tab:hover {\"\n                \"/* background: qlineargradient(x1: 0, y1: 1, x2: 0, y2: 0,\"\n                                \"stop: 0 %1, stop: 0.3 %2,\"    //#fafafa, #f4f4f4\n                                \"stop: 0.6 %3, stop: 1.0 %4); */\" //#e7e7e7, #fafafa            \n                \"background-color: white;\"\n            \"}\"\n            \"QTabBar::tab:selected {\"\n                \"margin-top: 1px;\"\n                \"border-color: #9B9B9B;\" //\n                \"border-bottom-color: %4;\" //#fafafa\n            \"}\"\n            \"QTabBar::tab:!selected {\"\n                \"margin-top: 2px;\" // make non-selected tabs look smaller\n            \"}\"\n        ).arg(gradientZero.name(), gradientOne.name(), gradientTwo.name(), \"#ffffff\");\n#endif            \n\n        return styles;\n    }\n\n    void OutputWidget::tryToMakeAllPartsEqualInSize()\n    {\n        int resultsCount = _splitter->count();\n\n        if (resultsCount <= 1)\n            return;\n\n        int dimension = _splitter->orientation() == Qt::Vertical ? _splitter->height() : _splitter->width();\n        int step = dimension / resultsCount;\n\n        QList<int> partSizes;\n        for (int i = 0; i < resultsCount; ++i) {\n            partSizes << step;\n        }\n\n        _splitter->setSizes(partSizes);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/OutputWidget.h",
    "content": "#pragma once\n\n#include <QTabWidget>\nQT_BEGIN_NAMESPACE\nclass QSplitter;\nQT_END_NAMESPACE\n\n#include \"robomongo/core/domain/MongoShellResult.h\"\n#include \"robomongo/core/Enums.h\"\n\nnamespace Robomongo\n{\n    class OutputItemContentWidget;\n    class ProgressBarPopup;\n    class MongoShell;\n\n    class OutputWidget : public QTabWidget\n    {\n        Q_OBJECT\n\n    public:\n        explicit OutputWidget(QWidget *parent);\n\n        void present(MongoShell *shell, const std::vector<MongoShellResult> &documents);\n        void updatePart(int partIndex, const MongoQueryInfo &queryInfo, \n                        const std::vector<MongoDocumentPtr> &documents);\n        void updatePart(int partIndex, const AggrInfo &agrrInfo,\n                        const std::vector<MongoDocumentPtr> &documents);\n        void toggleOrientation();\n\n        void switchMode(std::function<void(OutputItemContentWidget*)> modeFunc);\n        void enterTreeMode();\n        void enterTextMode();\n        void enterTableMode();\n        void enterCustomMode();\n\n        int resultIndex(OutputItemContentWidget *result);\n\n        void showProgress();\n        void hideProgress();\n        bool progressBarActive() const;\n\n        void applyDockUndockSettings(bool isDocking) const;\n        Qt::Orientation getOrientation() const;\n\n    private Q_SLOTS:\n        void restoreSize();\n        void maximizePart();\n        void tabCloseRequested(int);\n\n    private:\n        void mouseReleaseEvent(QMouseEvent *event);\n        void clearAllParts();\n        QString buildStyleSheet();\n        void tryToMakeAllPartsEqualInSize();\n\n        bool _tabbedResults;\n        std::vector<ViewMode> _prevViewModes;\n        int _prevResultsCount;\n        QSplitter *_splitter;\n        ProgressBarPopup *_progressBarPopup;\n        std::vector<OutputItemContentWidget*> _outputItemContentWidgets;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/PagingWidget.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/PagingWidget.h\"\n\n#include <QHBoxLayout>\n#include <QLineEdit>\n#include <QPushButton>\n\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n\nnamespace\n{\n    QPushButton *createButtonWithIcon(const QIcon &icon)\n    {\n        QPushButton *button = new QPushButton;\n        button->setIcon(icon);\n        button->setFixedSize(24, 24);\n        button->setFlat(true);\n        return button;\n    }\n}\n\nnamespace Robomongo\n{\n    PagingWidget::PagingWidget(QWidget *parent)\n        :BaseClass(parent)\n    {\n        _skipEdit = new QLineEdit;\n        _batchSizeEdit = new QLineEdit;\n        _skipEdit->setAlignment(Qt::AlignHCenter);\n        _skipEdit->setToolTip(\"Skip\");\n        _batchSizeEdit->setAlignment(Qt::AlignHCenter);\n        _batchSizeEdit->setToolTip(\"Batch Size (number of documents shown at once)\");\n\n        QFontMetrics metrics = _skipEdit->fontMetrics();\n        int width = metrics.boundingRect(\"00000000\").width();\n        QRegExp rx(\"\\\\d+\");\n        _skipEdit->setValidator(new QRegExpValidator(rx, this));\n        _batchSizeEdit->setValidator(new QRegExpValidator(rx, this));\n        _skipEdit->setFixedWidth(width);\n        _batchSizeEdit->setFixedWidth(width);\n\n        QPushButton *leftButton = createButtonWithIcon(GuiRegistry::instance().leftIcon());\n        QPushButton *rightButton = createButtonWithIcon(GuiRegistry::instance().rightIcon());\n        VERIFY(connect(leftButton, SIGNAL(clicked()), this, SLOT(leftButton_clicked())));\n        VERIFY(connect(rightButton, SIGNAL(clicked()), this, SLOT(rightButton_clicked())));\n\n        VERIFY(connect(_batchSizeEdit, SIGNAL(returnPressed()), this, SLOT(refresh())));\n        VERIFY(connect(_skipEdit, SIGNAL(returnPressed()), this, SLOT(refresh())));\n\n        QHBoxLayout *layout = new QHBoxLayout();\n        layout->setSpacing(0);\n        layout->setContentsMargins(0, 0, 0, 0);\n\n        layout->addWidget(leftButton);\n        layout->addSpacing(0);\n        layout->addWidget(_skipEdit);\n        layout->addSpacing(1);\n        layout->addWidget(_batchSizeEdit);\n        layout->addSpacing(0);\n        layout->addWidget(rightButton);\n        setLayout(layout);\n    }\n\n    void PagingWidget::setSkip(int skip)\n    {\n        _skipEdit->setText(QString::number(skip));\n        show();\n    }\n\n    void PagingWidget::setBatchSize(int batchSize)\n    {\n        if (batchSize <= 0)\n            batchSize = AppRegistry::instance().settingsManager()->batchSize();\n\n        _batchSizeEdit->setText(QString::number(batchSize));\n        show();\n    }\n\n    void PagingWidget::refresh()\n    {\n        int limit = _batchSizeEdit->text().toInt();\n        int skip = _skipEdit->text().toInt();\n        emit refreshed(skip, limit);\n    }\n\n    void PagingWidget::leftButton_clicked()\n    {\n        int limit = _batchSizeEdit->text().toInt();\n        int skip = _skipEdit->text().toInt();\n        emit leftClicked(skip, limit);\n    }\n\n    void PagingWidget::rightButton_clicked()\n    {\n        int limit = _batchSizeEdit->text().toInt();\n        int skip = _skipEdit->text().toInt();\n        emit rightClicked(skip, limit);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/PagingWidget.h",
    "content": "#pragma once\n\n#include <QWidget>\nQT_BEGIN_NAMESPACE\nclass QLineEdit;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class PagingWidget : public QWidget\n    {\n        Q_OBJECT\n\n    public:\n        typedef QWidget BaseClass;\n        enum {pageLimit = 50};\n        PagingWidget(QWidget *parent = NULL);\n        void setSkip(int skip);\n        void setBatchSize(int limit);\n\n    Q_SIGNALS:\n        void leftClicked(int skip, int limit);\n        void rightClicked(int skip, int limit);\n        void refreshed(int skip, int limit);\n\n    private Q_SLOTS:\n        void leftButton_clicked();\n        void rightButton_clicked();\n        void refresh();\n\n    private:\n        QLineEdit *_skipEdit;\n        QLineEdit *_batchSizeEdit;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/ProgressBarPopup.cpp",
    "content": "#include \"ProgressBarPopup.h\"\n\n#include <QLabel>\n#include <QMovie>\n#include <QVBoxLayout>\n\nnamespace Robomongo\n{\n\n    ProgressBarPopup::ProgressBarPopup(QWidget *parent) :\n        QFrame(parent)\n    {\n        setStyleSheet(\"QFrame {background-color: #e1e1e1; border: 0px solid #c7c5c4; border-radius: 6px;}\");\n\n        QMovie *movie = new QMovie(\":robomongo/icons/progress_bar.gif\", QByteArray(), this);\n        _progressLabel = new QLabel();\n        _progressLabel->setMovie(movie);\n        _progressLabel->setFixedWidth(widthProgress);\n        _progressLabel->setFixedHeight(heightProgress);\n        movie->start();\n\n        setFixedSize(width, height);\n\n        QVBoxLayout *layout = new QVBoxLayout();\n        layout->setContentsMargins((width-widthProgress)/2, (height-heightProgress)/2, (height-heightProgress)/2, (width-widthProgress)/2);\n        layout->setSpacing(0);\n        layout->addWidget(_progressLabel);\n        setLayout(layout);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/ProgressBarPopup.h",
    "content": "#pragma once\n#include <QFrame>\n\nQT_BEGIN_NAMESPACE\nclass QLabel;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    class ProgressBarPopup : public QFrame\n    {\n        Q_OBJECT\n\n    public:\n        ProgressBarPopup(QWidget *parent = NULL);\n        enum {heightProgress = 16, widthProgress = 164, height = heightProgress+20, width = widthProgress+20  };\n    private:\n        QLabel *_progressLabel;\n    };\n}\n\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/QueryWidget.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/QueryWidget.h\"\n\n#include <QObject>\n#include <QPushButton>\n#include <QApplication>\n#include <QLabel>\n#include <QFileInfo>\n#include <QVBoxLayout>\n#include <QMessageBox>\n#include <QMainWindow>\n#include <QDockWidget>\n#include <Qsci/qsciscintilla.h>\n#include <Qsci/qscilexerjavascript.h>\n#include <mongo/client/dbclient_base.h>\n\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/EventBus.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/domain/MongoCollection.h\"\n#include \"robomongo/core/domain/MongoDatabase.h\"\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/domain/MongoShell.h\"\n#include \"robomongo/core/domain/MongoAggregateInfo.h\"\n#include \"robomongo/core/events/MongoEvents.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/utils/Logger.h\"\n\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/widgets/workarea/OutputWidget.h\"\n#include \"robomongo/gui/widgets/workarea/ScriptWidget.h\"\n#include \"robomongo/gui/widgets/workarea/OutputItemContentWidget.h\"\n#include \"robomongo/gui/widgets/workarea/OutputItemHeaderWidget.h\"\n#include \"robomongo/gui/editors/PlainJavaScriptEditor.h\"\n#include \"robomongo/gui/editors/JSLexer.h\"\n#include \"robomongo/gui/dialogs/ChangeShellTimeoutDialog.h\"\n\nusing namespace mongo;\n\nnamespace Robomongo\n{\n    QueryWidget::QueryWidget(MongoShell *shell, QWidget *parent) :\n        QWidget(parent),\n        _shell(shell),\n        _viewer(nullptr),\n        _dock(nullptr),\n        _isTextChanged(false)\n    {\n        AppRegistry::instance().bus()->subscribe(this, DocumentListLoadedEvent::Type, shell);\n        AppRegistry::instance().bus()->subscribe(this, ScriptExecutedEvent::Type, shell);\n        AppRegistry::instance().bus()->subscribe(this, AutocompleteResponse::Type, shell);\n\n        // Make QMessageBox text selectable\n        // setStyleSheet(\"QMessageBox { messagebox-text-interaction-flags: 5; }\");\n\n        _scriptWidget = new ScriptWidget(_shell, this);\n        VERIFY(connect(_scriptWidget, SIGNAL(textChanged()), this, SLOT(textChange())));\n\n        // Need to use QMainWindow in order to make use of all features of docking.\n        // (Note: Qt full support for dock windows implemented only for QMainWindow)\n        _viewer = new OutputWidget(this);\n        _outputWindow = new QMainWindow;\n        _dock = new CustomDockWidget(this);\n        _dock->setAllowedAreas(Qt::NoDockWidgetArea);\n        _dock->setFeatures(QDockWidget::DockWidgetFloatable);\n        _dock->setWidget(_viewer);\n        _dock->setTitleBarWidget(new QWidget);\n        VERIFY(connect(_dock, SIGNAL(topLevelChanged(bool)), this, SLOT(on_dock_undock())));\n        _outputWindow->addDockWidget(Qt::BottomDockWidgetArea, _dock);\n\n        _outputLabel = new QLabel(this);\n        _outputLabel->setContentsMargins(0, 5, 0, 0);\n        _outputLabel->setVisible(false);\n\n        _line = new QFrame(this);\n        _line->setFrameShape(QFrame::HLine);\n        _line->setFrameShadow(QFrame::Raised);\n\n        _mainLayout = new QVBoxLayout;\n        _mainLayout->setSpacing(0);\n        _mainLayout->setContentsMargins(0, 0, 0, 0);\n        _mainLayout->addWidget(_scriptWidget); \n        _mainLayout->addWidget(_line);\n        _mainLayout->addWidget(_outputLabel, 0, Qt::AlignTop);\n        _mainLayout->addWidget(_outputWindow, 1);      \n        setLayout(_mainLayout);\n    }\n\n    void QueryWidget::setScriptFocus()\n    {\n        _scriptWidget->setScriptFocus();\n    }\n\n    void QueryWidget::showAutocompletion()\n    {\n        _scriptWidget->showAutocompletion();\n    }\n\n    void QueryWidget::hideAutocompletion()\n    {\n        _scriptWidget->hideAutocompletion();\n    }\n\n    void QueryWidget::setCurrentDatabase(const std::string & dbname)\n    {\n        _scriptWidget->setCurrentDatabase(dbname);\n    }\n\n    void QueryWidget::bringDockToFront()\n    {\n        _dock->raise(); // required for MAC only; possible Qt bug\n        _dock->activateWindow();\n    }\n\n    bool QueryWidget::outputWindowDocked() const\n    {\n        if (_dock) {\n            return !_dock->isFloating();\n        }\n        else {  // _dock is not initialized yet, but it will be docked when initialized\n            return true;\n        }\n    }\n\n    void QueryWidget::execute()\n    {\n        QString query = _scriptWidget->selectedText();\n\n        if (query.isEmpty())\n            query = _scriptWidget->text();\n\n        showProgress();\n        _shell->open(QtUtils::toStdString(query));\n    }\n\n    void QueryWidget::stop()\n    {\n        _shell->stop();\n    }\n\n    void QueryWidget::toggleOrientation()\n    {\n        _viewer->toggleOrientation();\n    }\n\n    void QueryWidget::openNewTab()\n    {\n        if (_shell) {\n            MongoServer *server = _shell->server();\n            QString query = _scriptWidget->selectedText();\n            AppRegistry::instance().app()->openShell(server, query, _currentResult.currentDatabase(), \n                AppRegistry::instance().settingsManager()->autoExec());\n        }\n    }\n\n    void QueryWidget::saveToFile()\n    {\n        if (_shell) {\n            _shell->setScript(_scriptWidget->text());\n            if (_shell->saveToFile()) {\n                _isTextChanged = false;\n                updateCurrentTab();\n            }\n        }\n    }\n\n    void QueryWidget::savebToFileAs()\n    {\n        if (_shell) {\n            _shell->setScript(_scriptWidget->text());\n            if (_shell->saveToFileAs()) {\n                _isTextChanged = false;\n                updateCurrentTab();\n            }\n        }        \n    }\n\n    void QueryWidget::openFile()\n    {\n        if (_shell && _shell->loadFromFile()) {\n            _scriptWidget->setText(QtUtils::toQString(_shell->query()));\n            _isTextChanged = false;\n            updateCurrentTab();\n        }\n    }\n\n    void QueryWidget::textChange()\n    {\n        _isTextChanged = true;\n        updateCurrentTab();\n    }\n\n    QueryWidget::~QueryWidget()\n    {\n        AppRegistry::instance().app()->closeShell(_shell);\n    }\n\n    void QueryWidget::reload()\n    {\n        execute();\n    }\n\n    void QueryWidget::duplicate()\n    {\n        _scriptWidget->selectAll();\n        openNewTab();\n    }\n\n    void QueryWidget::enterTreeMode()\n    {\n        _viewer->enterTreeMode();\n    }\n\n    void QueryWidget::enterTextMode()\n    {\n        _viewer->enterTextMode();\n    }\n\n    void QueryWidget::enterTableMode()\n    {\n        _viewer->enterTableMode();\n    }\n\n    void QueryWidget::enterCustomMode()\n    {\n        _viewer->enterCustomMode();\n    }\n\n    void QueryWidget::showProgress()\n    {\n        _viewer->showProgress();\n    }\n\n    void QueryWidget::dockUndock() \n    {\n        // Toggle between dock/undock\n        _dock->setFloating(!_dock->isFloating());\n    };\n    \n    void QueryWidget::changeShellTimeout() \n    {\n        changeShellTimeoutDialog();\n    }\n\n    void QueryWidget::hideProgress()\n    {\n        _viewer->hideProgress();\n    }\n\n    void QueryWidget::handle(DocumentListLoadedEvent *event)\n    {\n        hideProgress();\n\n        if (event->isError()) {\n            QString message = QString(\"Failed to load documents.\\n\\nError:\\n%1\")\n                .arg(QtUtils::toQString(event->error().errorMessage()));\n            QMessageBox::information(this, \"Error\", message);\n            return;\n        }\n\n        // this should be in viewer, subscribed to ScriptExecutedEvent\n        _viewer->updatePart(event->resultIndex(), event->queryInfo(), event->documents()); \n    }\n\n    void QueryWidget::handle(ScriptExecutedEvent *event)\n    {\n        hideProgress();        \n        _currentResult = event->result();\n\n        if (_currentResult.results().size() == 1) {\n            MongoShellResult const& result = _currentResult.results().front();\n            AggrInfo const& aggrInfo = result.aggrInfo();\n            if (aggrInfo.isValid && aggrInfo.resultIndex > -1) {\n                _viewer->updatePart(aggrInfo.resultIndex, aggrInfo, _currentResult.results().front().documents());\n                return;\n            }\n        }\n\n        updateCurrentTab();\n\n        displayData(event->result().results(), event->empty());\n        // this should be in ScriptWidget, which is subscribed to ScriptExecutedEvent              \n        _scriptWidget->setup(event->result()); \n        activateTabContent();\n\n        if (event->isError()) {\n            // For some cases, event error message already contains string \"Error:\"\n            QString const& subStr =\n                QString::fromStdString(event->error().errorMessage()).startsWith(\"Error\", Qt::CaseInsensitive) ?\n                \"\" : \"Error:\\n\";\n\n            QString const& message = \"Failed to execute script.\\n\\n\" + subStr +\n                QString::fromStdString((event->error().errorMessage()));\n\n            QMessageBox::critical(this, \"Error\", message);\n        }\n\n        if (event->timeoutReached()) {\n            auto const shellTimeoutSec = AppRegistry::instance().settingsManager()->shellTimeoutSec();\n            QString const subStr = _currentResult.results().size() > 1 ?\n                \"At least one of the scripts has reached shell timeout\" :\n                \"The script has reached shell timeout\";\n            QString const secondStr = (shellTimeoutSec > 1) ? \" seconds)\" : \" second)\";\n            QString messageShort = \"Failed to execute all of the script. \" + subStr + \" (\" +\n                                    QString::number(shellTimeoutSec) + secondStr + \" limit. \";\n            QString messageLong = messageShort + \n                                  \"\\n\\nPlease increase the value of shell timeout using button below \"\n                                  \"or from the main window menu \\\"Options->Change Shell Timeout\\\".\";\n            LOG_MSG(messageShort, mongo::logger::LogSeverity::Error());\n\n            auto errorDia = new QMessageBox(QMessageBox::Icon::Critical, \"Error\", messageLong);\n            auto but = new QPushButton(\"Change Shell Timeout\");\n            VERIFY(connect(but, SIGNAL(clicked()), this, SLOT(changeShellTimeout())));\n            errorDia->addButton(but, QMessageBox::NoRole);\n            errorDia->exec();\n        }\n    }\n\n    void QueryWidget::activateTabContent()\n    {\n        AppRegistry::instance().bus()->publish(new QueryWidgetUpdatedEvent(this, _currentResult.results().size()));\n        _scriptWidget->setScriptFocus();\n    }\n\n    void QueryWidget::handle(AutocompleteResponse *event)\n    {\n        if (event->isError()) {\n            // Do not show error message (error should be already logged)\n            return;\n        }\n\n        _scriptWidget->showAutocompletion(event->list, QtUtils::toQString(event->prefix) );\n    }\n\n    void QueryWidget::on_dock_undock()\n    {\n        if (!_dock->isFloating()) {    // If output window docked \n            // Settings to revert to docked mode\n            _scriptWidget->ui_queryLinesCountChanged();\n            _mainLayout->addWidget(_scriptWidget);                     \n            _mainLayout->addWidget(_line);\n            _mainLayout->addWidget(_outputWindow, 1);\n            _dock->setFeatures(QDockWidget::DockWidgetFloatable);\n            _dock->setTitleBarWidget(new QWidget);\n            _viewer->applyDockUndockSettings(true);\n        }\n        else {              // output window undocked(floating)\n            // Settings for query window in order to use maximum space\n            _scriptWidget->disableFixedHeight();\n            _mainLayout->addWidget(_scriptWidget, 1); \n            _mainLayout->addWidget(_line);\n            _mainLayout->addWidget(_outputWindow);\n            _dock->setFeatures(QDockWidget::DockWidgetClosable);\n            _dock->setTitleBarWidget(nullptr);\n            _viewer->applyDockUndockSettings(false);\n        }\n    }\n\n    void QueryWidget::updateCurrentTab()\n    {\n        const QString &shellQuery = QtUtils::toQString(_shell->query());\n        QString toolTipQuery = shellQuery.left(700);\n\n        QString tabTitle, toolTipText;\n        if (_shell) {\n            QFileInfo fileInfo(_shell->filePath());\n            if (fileInfo.isFile()) {\n                    tabTitle = fileInfo.fileName();\n                    toolTipText = fileInfo.filePath();\n            }\n        }\n\n        if (tabTitle.isEmpty() && shellQuery.isEmpty()) {\n            tabTitle = \"New Shell\";\n        }\n        else {\n\n            if (tabTitle.isEmpty()) {\n                tabTitle = shellQuery.left(41).replace(QRegExp(\"[\\n\\r\\t]\"), \" \");\n                toolTipText = QString(\"<pre>%1</pre>\").arg(toolTipQuery);\n            }\n            else {\n                //tabTitle = QString(\"%1 %2\").arg(tabTitle).arg(shellQuery);\n                toolTipText = QString(\"<b>%1</b><br/><pre>%2</pre>\").arg(toolTipText).arg(toolTipQuery);\n            }\n        }\n\n        if (_isTextChanged) {\n            tabTitle = \"* \" + tabTitle;\n        }\n\n        emit titleChanged(tabTitle);\n        emit toolTipChanged(toolTipText);\n    }\n\n    void QueryWidget::displayData(const std::vector<MongoShellResult> &results, bool empty)\n    {\n        if (!empty) {\n            bool isOutVisible = results.size() == 0 && !_scriptWidget->text().isEmpty();\n            if (isOutVisible) {\n                _outputLabel->setText(\"  Script executed successfully, but there are no results to show.\");\n            }\n            _outputLabel->setVisible(isOutVisible);\n        }\n\n        _viewer->present(_shell, results);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/QueryWidget.h",
    "content": "#pragma once\n\n#include <QWidget>\n#include <QDockWidget>\n#include <QCloseEvent>\n\nQT_BEGIN_NAMESPACE\nclass QLabel;\nclass QVBoxLayout;\nclass QMainWindow;\nclass QPushButton;\nclass QFrame;\nQT_END_NAMESPACE\n\n#include \"robomongo/core/Core.h\"\n#include \"robomongo/core/domain/MongoShellResult.h\"\n\nnamespace Robomongo\n{\n    class BsonWidget;\n    class DocumentListLoadedEvent;\n    class ScriptExecutedEvent;\n    class AutocompleteResponse;\n    class OutputWidget;\n    class ScriptWidget;\n    class MongoShell;\n\n    class QueryWidget : public QWidget\n    {\n        Q_OBJECT\n\n    public:\n        class CustomDockWidget;\n        typedef QWidget BaseClass;\n\n        QueryWidget(MongoShell *shell, QWidget *parent = NULL);\n        ~QueryWidget();\n\n        void toggleOrientation();\n        void activateTabContent();\n        void openNewTab();\n        void reload();\n        void duplicate();\n        void enterTreeMode();\n        void enterTextMode();\n        void enterTableMode();\n        void enterCustomMode();\n        void setScriptFocus();\n        void showAutocompletion();\n        void hideAutocompletion();\n        void setCurrentDatabase(const std::string &dbname);\n        \n        // Bring active tab's dock into front\n        void bringDockToFront();\n\n        // Get output window's dock status\n        bool outputWindowDocked() const;\n\n    Q_SIGNALS:\n        void titleChanged(const QString &text);\n        void toolTipChanged(const QString &text);\n\n    public Q_SLOTS:\n        void execute();\n        void stop();\n\n        void saveToFile();\n        void savebToFileAs();\n        void openFile();\n        void textChange();\n        void showProgress();\n        void hideProgress();\n\n        void handle(DocumentListLoadedEvent *event);\n        void handle(ScriptExecutedEvent *event);\n        void handle(AutocompleteResponse *event);\n\n    private Q_SLOTS:\n        // Make adjustments between output window dock/undock events\n        void on_dock_undock();\n\n        // Toggle output window between dock/undock status\n        void dockUndock();         \n        void changeShellTimeout();\n\n    private:        \n        void updateCurrentTab();\n        void displayData(const std::vector<MongoShellResult> &results, bool empty);\n\n        MongoShell *_shell;\n        OutputWidget *_viewer;\n        ScriptWidget *_scriptWidget;\n        QLabel *_outputLabel;\n        QDockWidget *_dock;\n        QMainWindow *_outputWindow;\n        QFrame *_line;\n        QVBoxLayout *_mainLayout;\n\n        MongoShellExecResult _currentResult;\n        bool _isTextChanged;\n    };\n\n    /* ------- class CustomDockWidget -------- */\n    /* Custom dock widget for output window */\n    class QueryWidget::CustomDockWidget : public QDockWidget\n    {\n        Q_OBJECT\n\n    public:\n        CustomDockWidget(QueryWidget* parent)\n            : _parent(parent)\n        {}\n\n        QueryWidget* getParentQueryWidget() const { return _parent; }\n\n    protected:\n        // Dock instead of close\n        void closeEvent(QCloseEvent *event) override\n        {\n            event->ignore();\n            setFloating(false);\n        }\n\n    private:\n        QueryWidget* _parent;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/ScriptWidget.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/ScriptWidget.h\"\n\n#include <QVBoxLayout>\n#include <QKeyEvent>\n#include <QCompleter>\n#include <QStringListModel>\n#include <Qsci/qscilexerjavascript.h>\n#include <Qsci/qsciscintilla.h>\n\n#include \"robomongo/core/domain/MongoShell.h\"\n#include \"robomongo/core/domain/MongoServer.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n\n#include \"robomongo/gui/widgets/workarea/IndicatorLabel.h\"\n#include \"robomongo/gui/widgets/workarea/QueryWidget.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/editors/JSLexer.h\"\n#include \"robomongo/gui/editors/FindFrame.h\"\n#include \"robomongo/gui/editors/PlainJavaScriptEditor.h\"\n\nnamespace\n{\n    bool isStopChar(const QChar &ch, bool direction)\n    {\n        if (ch == '='  ||  ch == ';'  ||\n            ch == '('  ||  ch == ')'  ||\n            ch == '{'  ||  ch == '}'  ||\n            ch == '-'  ||  ch == '/'  ||\n            ch == '+'  ||  ch == '*'  ||\n            ch == '\\r' ||  ch == '\\n' ||\n            ch == ' ' ) {\n                return true;\n        }\n\n        if (direction) { // right direction\n            if (ch == '.')\n                return true;\n        }\n\n        return false;\n    }\n\n    bool isForbiddenChar(const QChar &ch)\n    {\n        return ch == '\\\"' ||  ch == '\\'';\n    }\n}\n\nnamespace Robomongo\n{\n    ScriptWidget::ScriptWidget(MongoShell *shell, QueryWidget *parent) :\n        _shell(shell),\n        _parent(parent),\n        _textChanged(false),\n        _disableTextAndCursorNotifications(false)\n    {\n        setStyleSheet(\"QFrame {background-color: rgb(255, 255, 255); border: 0px solid #c7c5c4;\"\n                      \"border-radius: 0px; margin: 0px; padding: 0px;}\");\n\n        _queryText = new FindFrame(this);\n        _topStatusBar = new TopStatusBar(_shell->server()->connectionRecord()->connectionName(), \n                                         _shell->server()->connectionRecord()->getFullAddress(), \"loading...\");\n\n        QVBoxLayout *layout = new QVBoxLayout;\n        layout->setSpacing(0);\n        layout->setContentsMargins(5, 1, 5, 5);\n        layout->addWidget(_topStatusBar, 0, Qt::AlignTop);\n        layout->addWidget(_queryText);\n        setLayout(layout);\n\n        // Query text widget\n        configureQueryText();\n        _queryText->sciScintilla()->setFocus();\n\n        _queryText->sciScintilla()->installEventFilter(this);\n\n        _completer = new QCompleter(this);\n        _completer->setWidget(_queryText->sciScintilla());\n        _completer->setCompletionMode(QCompleter::PopupCompletion);\n        _completer->setCaseSensitivity(Qt::CaseInsensitive);\n        _completer->setMaxVisibleItems(20);\n        _completer->setWrapAround(false);\n        _completer->popup()->setFont(GuiRegistry::instance().font());\n        VERIFY(connect(_completer, SIGNAL(activated(const QString &)), this, SLOT(onCompletionActivated(const QString&))));\n\n        QStringListModel *model = new QStringListModel(_completer);\n        _completer->setModel(model);\n\n        setText(QtUtils::toQString(shell->query()));\n        setTextCursor(shell->cursor());\n    }\n\n    bool ScriptWidget::eventFilter(QObject *obj, QEvent *event)\n    {\n        if (obj == _queryText->sciScintilla()) {\n            if (event->type() == QEvent::KeyPress) {\n                QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);\n\n                if (keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter\n                        || keyEvent->key() == Qt::Key_Tab) {\n                    hideAutocompletion();\n                    return false;\n                }\n            }\n        }\n        return QFrame::eventFilter(obj, event);\n    }\n\n    void ScriptWidget::setup(const MongoShellExecResult &execResult)\n    {\n        setCurrentDatabase(execResult.currentDatabase(), execResult.isCurrentDatabaseValid());\n        setCurrentServer(execResult.currentServer(), execResult.isCurrentServerValid());\n    }\n\n    void ScriptWidget::setText(const QString &text)\n    {\n        _queryText->sciScintilla()->setText(text);\n    }\n\n    void ScriptWidget::setTextCursor(const CursorPosition &cursor)\n    {\n        if (cursor.isNull()) {\n            _queryText->sciScintilla()->setCursorPosition(15, 1000);\n            return;\n        }\n\n        int column = cursor.column();\n        if (column < 0) {\n            column = _queryText->sciScintilla()->text(cursor.line()).length() + column;\n        }\n\n        _queryText->sciScintilla()->setCursorPosition(cursor.line(), column);\n    }\n\n    QString ScriptWidget::text() const\n    {\n        return _queryText->sciScintilla()->text();\n    }\n\n    QString ScriptWidget::selectedText() const\n    {\n        return _queryText->sciScintilla()->selectedText();\n    }\n\n    void ScriptWidget::selectAll()\n    {\n        _queryText->sciScintilla()->selectAll();\n    }\n\n    void ScriptWidget::setScriptFocus()\n    {\n        _queryText->sciScintilla()->setFocus();\n    }\n\n    void ScriptWidget::setCurrentDatabase(const std::string &database, bool isValid)\n    {\n        _topStatusBar->setCurrentDatabase(database, isValid);\n    }\n\n    void ScriptWidget::setCurrentServer(const std::string &address, bool isValid)\n    {\n        _topStatusBar->setCurrentServer(address, isValid);\n    }\n\n    void ScriptWidget::showAutocompletion(const QStringList &list, const QString &prefix)\n    {\n        // do not show single autocompletion which is identical to existing prefix\n        // or if it identical to prefix + '('.\n        if (list.count() == 1) {\n            if (list.at(0) == prefix ||\n                list.at(0) == (prefix + \"(\")) {\n                return;\n            }\n        }\n\n        // update list of completions\n        QStringListModel * model = static_cast<QStringListModel *>(_completer->model());\n        model->setStringList(list);\n\n        int currentLine = 0;\n        int currentIndex = 0;\n        _queryText->sciScintilla()->getCursorPosition(&currentLine, &currentIndex);\n        int physicalLine = currentLine - _queryText->sciScintilla()->firstVisibleLine(); // \"physical\" line number in text editor (not logical)\n        int lineIndexLeft = _currentAutoCompletionInfo.lineIndexLeft();\n\n        QRect rect = _queryText->sciScintilla()->rect();\n        rect.setWidth(550);\n        rect.setHeight(editorHeight(physicalLine + 1));\n        rect.moveLeft(charWidth() * lineIndexLeft\n            + autocompletionBoxLeftPosition()\n            + _queryText->sciScintilla()->lineNumberMarginWidth());\n\n        _completer->complete(rect);\n        _completer->popup()->setCurrentIndex(_completer->completionModel()->index(0, 0));\n        RoboScintilla* scin = static_cast<RoboScintilla*>(_queryText->sciScintilla());\n        scin->setIgnoreEnterKey(true);\n        scin->setIgnoreTabKey(true);\n    }\n\n    void ScriptWidget::showAutocompletion()\n    {\n        _currentAutoCompletionInfo = sanitizeForAutocompletion();\n\n        if (_currentAutoCompletionInfo.isEmpty()) {\n            hideAutocompletion();\n            return;\n        }\n\n        _shell->autocomplete(QtUtils::toStdString(_currentAutoCompletionInfo.text()));\n    }\n\n    void ScriptWidget::hideAutocompletion()\n    {\n        _completer->popup()->hide();\n        RoboScintilla *scin = static_cast<RoboScintilla*>(_queryText->sciScintilla());\n        scin->setIgnoreEnterKey(false);\n        scin->setIgnoreTabKey(false);\n    }\n\n    void ScriptWidget::disableFixedHeight() const\n    {\n        _queryText->setMinimumSize(0, 0);\n        _queryText->setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);\n        _queryText->sciScintilla()->setMinimumSize(0, 0);\n        _queryText->sciScintilla()->setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);\n        _queryText->sciScintilla()->setFocus();\n    }\n\n    void ScriptWidget::ui_queryLinesCountChanged()\n    {\n        // Set fixed size only if output widget is docked\n        if (_parent->outputWindowDocked())\n        {\n            int lines = _queryText->sciScintilla()->lines();\n            int editorTotalHeight = editorHeight(lines);\n\n            int maxHeight = editorHeight(18);\n            if (editorTotalHeight > maxHeight) {\n                editorTotalHeight = maxHeight;\n            }\n            // Hide & Show solves problem of UI blinking\n            _queryText->hide();\n            _queryText->setFixedHeight(editorTotalHeight);\n            _queryText->sciScintilla()->setFixedHeight(editorTotalHeight);\n            _queryText->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);\n            _queryText->setMaximumHeight(editorTotalHeight + FindFrame::HeightFindPanel);\n            _queryText->sciScintilla()->setFocus();\n            _queryText->show();\n        }\n    }\n\n    void ScriptWidget::onTextChanged()\n    {\n        emit textChanged();\n        if (!_disableTextAndCursorNotifications)\n            _textChanged = true;\n    }\n\n    void ScriptWidget::onCursorPositionChanged(int line, int index)\n    {\n        if (!_disableTextAndCursorNotifications && _textChanged) {\n            showAutocompletion();\n            _textChanged = false;\n        }\n    }\n\n    void ScriptWidget::onCompletionActivated(const QString &text)\n    {\n        int row = _currentAutoCompletionInfo.line();\n        int colLeft = _currentAutoCompletionInfo.lineIndexLeft();\n        int colRight = _currentAutoCompletionInfo.lineIndexRight();\n        QString line = _queryText->sciScintilla()->text(row);\n\n        int selectionIndexRight = colRight + 1;\n\n        // overwrite open parenthesis, if it already exists in text\n        if (text.endsWith('(')) {\n            if (line.length() > colRight + 1) {\n                if (line.at(colRight + 1) == '(') {\n                    ++selectionIndexRight;\n                }\n            }\n        }\n\n        _disableTextAndCursorNotifications = true;\n\n        _queryText->sciScintilla()->setSelection(row, colLeft, row, selectionIndexRight);\n        _queryText->sciScintilla()->replaceSelectedText(text);\n\n        _disableTextAndCursorNotifications = false;\n    }\n\n    /*\n    ** Configure QsciScintilla query widget\n    */\n    void ScriptWidget::configureQueryText()\n    {\n        QsciLexerJavaScript *javaScriptLexer = new JSLexer(this);\n        javaScriptLexer->setFont(GuiRegistry::instance().font());\n        int height = editorHeight(1);\n        _queryText->sciScintilla()->setMinimumHeight(height);\n        _queryText->sciScintilla()->setFixedHeight(height);\n        _queryText->sciScintilla()->setAppropriateBraceMatching();\n        _queryText->sciScintilla()->setFont(GuiRegistry::instance().font());\n        _queryText->sciScintilla()->setPaper(QColor(255, 0, 0, 127));\n        _queryText->sciScintilla()->setLexer(javaScriptLexer);\n\n        _queryText->sciScintilla()->setStyleSheet(\"QFrame { background-color: rgb(73, 76, 78); border: 1px solid #c7c5c4; border-radius: 4px; margin: 0px; padding: 0px;}\");\n        VERIFY(connect(_queryText->sciScintilla(), SIGNAL(linesChanged()), SLOT(ui_queryLinesCountChanged())));\n        VERIFY(connect(_queryText->sciScintilla(), SIGNAL(textChanged()), SLOT(onTextChanged())));\n        VERIFY(connect(_queryText->sciScintilla(), SIGNAL(cursorPositionChanged(int, int)), SLOT(onCursorPositionChanged(int, int))));\n    }\n\n    /**\n     * @brief Calculates line height of text editor\n     */\n    int ScriptWidget::lineHeight() const\n    {  \n        return _queryText->sciScintilla()->textHeight(-1);\n    }\n\n    /**\n     * @brief Calculates char width of text editor\n     */\n    int ScriptWidget::charWidth()\n    {\n        QFontMetrics m(_queryText->sciScintilla()->font());\n        return m.averageCharWidth();\n    }\n\n    int ScriptWidget::autocompletionBoxLeftPosition()\n    {\n    #if defined(Q_OS_MAC)\n        return -1;\n    #endif\n        // for Linux and Windows it is the same for now\n        return 1;\n    }\n\n    /**\n     * @brief Calculates preferable editor height for specified number of lines\n     */\n    int ScriptWidget::editorHeight(int lines) const\n    {\n        return lines * lineHeight() + 8;\n    }\n\n    AutoCompletionInfo ScriptWidget::sanitizeForAutocompletion()\n    {\n        int row = 0;\n        int col = 0;\n        _queryText->sciScintilla()->getCursorPosition(&row, &col);\n        QString line = _queryText->sciScintilla()->text(row);\n\n        int leftStop = -1;\n        for (int i = col - 1; i >= 0; --i) {\n            const QChar ch = line.at(i);\n\n            if (isForbiddenChar(ch))\n                return AutoCompletionInfo();\n\n            if (isStopChar(ch, false)) {\n                leftStop = i;\n                break;\n            }\n        }\n\n        int rightStop = line.length() + 1;\n        for (int i = col; i < line.length(); ++i) {\n            const QChar ch = line.at(i);\n\n            if (isForbiddenChar(ch))\n                return AutoCompletionInfo();\n\n            if (isStopChar(ch, true)) {\n                rightStop = i;\n                break;\n            }\n        }\n\n        leftStop = leftStop + 1;\n        rightStop = rightStop - 1;\n        //int len = ondemand ? col - leftStop : rightStop - leftStop + 1;\n        int len = col - leftStop;\n\n        QString final = line.mid(leftStop, len);\n        return AutoCompletionInfo(final, row, leftStop, rightStop);\n    }\n\n    TopStatusBar::TopStatusBar(const std::string &connectionName, const std::string &serverName, const std::string &dbName)\n    {\n        setContentsMargins(0, 0, 0, 0);\n        _textColor = palette().text().color().lighter(200);\n\n        _currentConnectionLabel = new Indicator(GuiRegistry::instance().connectIcon(), \n            QString(\"<font color='%1'>%2</font>\").arg(_textColor.name()).arg(connectionName.c_str()));\n        _currentConnectionLabel->setDisabled(true);\n        \n        _currentServerLabel = new Indicator(GuiRegistry::instance().serverIcon(), \n            QString(\"<font color='%1'>%2</font>\").arg(_textColor.name()).arg(serverName.c_str()));\n        _currentServerLabel->setDisabled(true);\n\n        _currentDatabaseLabel = new Indicator(GuiRegistry::instance().databaseIcon(), \n            QString(\"<font color='%1'>%2</font>\").arg(_textColor.name()).arg(dbName.c_str()));\n        _currentDatabaseLabel->setDisabled(true);\n        \n        QHBoxLayout *topLayout = new QHBoxLayout;\n        topLayout->setSpacing(0);\n    #if defined(Q_OS_MAC)\n        topLayout->setContentsMargins(2, 3, 2, 3);\n    #else\n        topLayout->setContentsMargins(2, 7, 2, 3);\n    #endif\n        topLayout->addWidget(_currentConnectionLabel, 0, Qt::AlignLeft);\n        topLayout->addWidget(_currentServerLabel, 0, Qt::AlignLeft);\n        topLayout->addWidget(_currentDatabaseLabel, 0, Qt::AlignLeft);\n        topLayout->addStretch(1);\n\n        setLayout(topLayout);\n    }\n\n    void TopStatusBar::setCurrentDatabase(const std::string &database, bool isValid)\n    {\n        QString color = isValid ? _textColor.name() : \"red\";\n\n        QString text = QString(\"<font color='%1'>%2</font>\")\n                .arg(color)\n                .arg(database.c_str());\n\n        _currentDatabaseLabel->setText(text);\n    }\n\n    void TopStatusBar::setCurrentServer(const std::string &address, bool isValid)\n    {\n        QString color = isValid ? _textColor.name() : \"red\";\n\n        QString text = QString(\"<font color='%1'>%2</font>\")\n                .arg(color)\n                .arg(detail::prepareServerAddress(address).c_str());\n\n        _currentServerLabel->setText(text);\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/ScriptWidget.h",
    "content": "#pragma once\n\n#include <QFrame>\nQT_BEGIN_NAMESPACE\nclass QLabel;\nclass QCompleter;\nQT_END_NAMESPACE\n\n#include \"robomongo/core/domain/MongoShellResult.h\"\n#include \"robomongo/core/domain/CursorPosition.h\"\n\nnamespace Robomongo\n{\n    class FindFrame;\n    class TopStatusBar;\n    class MongoShell;\n    class Indicator;\n    class QueryWidget;\n\n    class AutoCompletionInfo\n    {\n    public:\n        AutoCompletionInfo() :\n            _text(\"\"),\n            _line(0),\n            _lineIndexLeft(0),\n            _lineIndexRight(0) {}\n\n        AutoCompletionInfo(const QString &text, int line, int lineIndexLeft, int lineIndexRight = 0) :\n            _text(text),\n            _line(line),\n            _lineIndexLeft(lineIndexLeft),\n            _lineIndexRight(lineIndexRight) {}\n\n        QString text() const { return _text; }\n        int line() const { return _line; }\n        int lineIndexLeft() const { return _lineIndexLeft; }\n        int lineIndexRight() const { return _lineIndexRight; }\n        bool isEmpty() const { return _text.isEmpty(); }\n\n    private:\n        QString _text;      // text, for which we are trying to find completions\n        int _line;          // line number in editor, where 'text' is located\n        int _lineIndexLeft; // index of first char in the line, where 'text' is started\n        int _lineIndexRight;// index of last char in the line, where 'text' is ended\n    };\n\n    class ScriptWidget : public QFrame\n    {\n        Q_OBJECT\n\n    public:\n        ScriptWidget(MongoShell *shell, QueryWidget* parent);\n\n        /**\n         * @reimp\n         */\n        bool eventFilter(QObject *obj, QEvent *e);\n\n        void setup(const MongoShellExecResult & execResult);\n        void setTextCursor(const CursorPosition &cursor = CursorPosition());\n        QString text() const;\n        QString selectedText() const;\n        void selectAll();\n        void setScriptFocus();\n        void setCurrentDatabase(const std::string &database, bool isValid = true);\n        void setCurrentServer(const std::string &address, bool isValid = true);\n        void showAutocompletion(const QStringList &list, const QString &prefix);\n        void showAutocompletion();\n        void hideAutocompletion();\n        bool getDisableTextAndCursorNotifications() { return _disableTextAndCursorNotifications; }\n        void setDisableTextAndCursorNotifications(const bool value) { _disableTextAndCursorNotifications = value; }\n\n        void disableFixedHeight() const;\n\n    Q_SIGNALS:\n        void textChanged();\n\n    public Q_SLOTS:\n        void setText(const QString &text);\n        void ui_queryLinesCountChanged();\n\n    private Q_SLOTS:\n        void onTextChanged();\n        void onCursorPositionChanged(int line, int index);\n        void onCompletionActivated(const QString&);\n\n    private:\n        void configureQueryText();\n\n        /**\n         * @brief Calculates line height of text editor\n         */\n        int lineHeight() const;\n\n        /**\n         * @brief Calculates char width of text editor\n         */\n        int charWidth();\n\n        /**\n         * @brief Because of different fonts, differents OSes etc. we didn't find\n         * a better way to find required position for autocompletion box.\n         * We just hardcoded it.\n         */\n        int autocompletionBoxLeftPosition();\n\n        /**\n         * @brief Calculates preferable editor height for specified number of lines\n         */\n        int editorHeight(int lines) const;\n        \n        AutoCompletionInfo sanitizeForAutocompletion();\n        FindFrame *_queryText;\n        TopStatusBar *_topStatusBar;\n        QCompleter *_completer;\n        MongoShell *_shell;\n        AutoCompletionInfo _currentAutoCompletionInfo;\n\n        QueryWidget *_parent;\n\n        bool _textChanged;\n        bool _disableTextAndCursorNotifications;\n    };\n\n    class TopStatusBar : public QFrame\n    {\n        Q_OBJECT\n\n    public:\n        TopStatusBar(const std::string &connectionName, const std::string &serverName, const std::string &dbName);\n        void setCurrentDatabase(const std::string &database, bool isValid = true);\n        void setCurrentServer(const std::string &address, bool isValid = true);\n        void showProgress();\n        void hideProgress();\n\n    private:\n        Indicator *_currentDatabaseLabel;\n        Indicator *_currentServerLabel;\n        Indicator *_currentConnectionLabel;\n        QColor _textColor;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/WelcomeTab.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/WelcomeTab.h\"\n\n#ifndef __linux__  // --------------------- Windows, macOS impl --------------------------// \n\n#include <QtWebEngineWidgets>\n#include <QDesktopServices>\n\nnamespace Robomongo {\n\n    // ------------------ WelcomeTab\n    WelcomeTab::WelcomeTab(QScrollArea *parent) :\n        QWidget(parent), _parent(parent)\n    {\n        auto webView = new QWebEngineView(this);\n        QUrl const URL {\n            \"http://files.studio3t.com/rm-feed_3t_io/1.4.3/index.html\"        \n        };\n        webView->setPage(new MyWebPage(this));\n        webView->page()->setUrl(URL);\n        webView->setContextMenuPolicy(Qt::NoContextMenu);\n        webView->page()->triggerAction(QWebEnginePage::WebAction::ReloadAndBypassCache);\n        webView->page()->profile()->setHttpCacheType(QWebEngineProfile::HttpCacheType::NoCache);\n\n        auto mainLayout = new QHBoxLayout;\n        mainLayout->setContentsMargins(-10, -10, -1, -1);\n        mainLayout->setSizeConstraint(QLayout::SetMinimumSize);\n        mainLayout->addWidget(webView);\n        setLayout(mainLayout);\n    }\n\n    // ------------------ MyWebPage\n    bool MyWebPage::acceptNavigationRequest(\n        QUrl const& url, NavigationType type, bool /*isMainFrame*/)\n    {\n        if (NavigationTypeLinkClicked == type) {\n            QDesktopServices::openUrl(url);\n            return false;\n        }\n        return true;\n    }\n\n}\n\n#else   // -------------------------------- Linux impl. ------------------------------------// \n\n#include <QObject>\n#include <QPushButton>\n#include <QApplication>\n#include <QLabel>\n#include <QVBoxLayout>\n#include <QPixmap>\n#include <QNetworkAccessManager>\n#include <QNetworkRequest>\n#include <QNetworkReply>\n#include <QDir>\n#include <QFile>\n#include <QFileInfo>\n#include <QDesktopServices>\n#include <QScrollArea>\n#include <QScrollBar>\n#include <QEvent>\n#include <QXmlStreamReader>\n#include <QMessageBox>\n#include <QToolButton>\n#include <QMenu>\n\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n#include \"robomongo/gui/MainWindow.h\"\n#include \"robomongo/core/domain/App.h\"\n#include \"robomongo/core/EventBus.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n#include \"robomongo/core/settings/ConnectionSettings.h\"\n#include \"robomongo/core/utils/Logger.h\"       \n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/utils/common.h\"\n\nnamespace Robomongo\n{\n    bool deleteOldCacheFile(QString const& absFilePath);\n\n    bool saveIntoCache(QString const& fileName, QString const& fileData,\n                       QString const& lastModifiedKey, QString const& lastModifiedDate);\n\n    bool saveIntoCache(QString const& fileName, QPixmap const& pixMap,\n                       QString const& lastModifiedKey, QString const& lastModifiedDate);\n\n    bool saveIntoCache(QString const& fileName, QByteArray* data,\n                       QString const& lastModifiedKey, QString const& lastModifiedDate);\n\n    /**\n    * @brief Container structure to hold data of a blog link\n    */\n    struct BlogInfo\n    {\n        BlogInfo(QString const& title, QString const& link, QString const& publishDate)\n            : title(title), link(link), publishDate(publishDate) {}\n\n        QString const title;\n        QString const link;\n        QString const publishDate;\n    };\n\n    /**\n    * @brief Custom label for identifying a blog link label\n    */\n    struct BlogLinkLabel : public QLabel\n    {\n        BlogLinkLabel(QString const& args) \n            : QLabel(args) {}\n    };\n\n    QString const WhatsNew = \"<p><h1><font color=\\\"#2d862d\\\">%1</h1></p>\";\n    QString const BlogsHeader = \"<p><h1><font color=\\\"#2d862d\\\">Blog Posts</h1></p>\";\n    QString const BlogLinkTemplate = \"<a style = 'color: #106CD6; text-decoration: none;'\"\n                                     \"href='%1'>%2</a>\";\n\n    // For info only. Starting from 1.2.1, PROJECT_VERSION is used.\n    // URL Folder number for Pic1 and Text1\n    enum {\n        URL_FOLDER_1_0_0      = 1,\n        URL_FOLDER_1_1_0_BETA = 2,\n        URL_FOLDER_1_1_1      = 3,\n        URL_FOLDER_1_2_0_BETA = 4,        \n        // Starting from 1.2.1, PROJECT_VERSION is used.\n    };\n\n    QString const IMAGE_PATH = QString(PROJECT_VERSION) + \"/image.png\";\n    QString const CONTENTS_PATH = QString(PROJECT_VERSION) + \"/contents.txt\";\n\n    QString const RssFileName = \"rss.xml\";\n\n    QString const Text1_LastModifiedDateKey(\"wtText1LastModifiedDate\");\n    QString const Image1_LastModifiedDateKey(\"wtImage1LastModifiedDate\");\n    QString const Rss_LastModifiedDateKey(\"wtRssLastModifiedDate\");\n\n    auto const TEXT_TO_TAB_RATIO = 0.6; \n    auto const IMAGE_TO_TAB_RATIO = 0.25;\n    auto const BLOG_TO_TAB_RATIO = 0.28;\n\n/* ------------------------------------- Welcome Tab --------------------------------------- */\n\n    WelcomeTab::WelcomeTab(QScrollArea *parent) :\n        QWidget(parent), _parent(parent)\n    {\n        _pic1_URL = \"https://files.studio3t.com/rm-feed_3t_io/\" + IMAGE_PATH;\n        _text1_URL = \"https://files.studio3t.com/rm-feed_3t_io/\" + CONTENTS_PATH;\n        _rss_URL = \"https://blog.robomongo.org/rss/\";\n\n#ifdef __APPLE__\n        constexpr int HEADER_POINT_SIZE = 10;\n#else \n        constexpr int HEADER_POINT_SIZE = 7;\n#endif                \n        //// What's new section\n        _whatsNewHeader = new QLabel;\n        _whatsNewHeader->setHidden(true);\n        QFont headerFont { _whatsNewHeader->font() };\n        headerFont.setPointSize(HEADER_POINT_SIZE);\n        _whatsNewHeader->setFont(headerFont);\n\n        // _whatsNewHeader->setFont\n        _whatsNewText = new QLabel;\n        _whatsNewText->setTextInteractionFlags(Qt::TextSelectableByMouse);\n        _whatsNewText->setTextFormat(Qt::RichText);\n        _whatsNewText->setTextInteractionFlags(Qt::TextBrowserInteraction);\n        _whatsNewText->setOpenExternalLinks(true);\n        _whatsNewText->setWordWrap(true);\n        _whatsNewText->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);\n\n        _pic1 = new QLabel;\n        _pic1->setTextInteractionFlags(Qt::TextSelectableByMouse);\n        _pic1->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);\n        _pic1->setScaledContents(true);\n\n        _blogsHeader = new QLabel(BlogsHeader);\n        _blogsHeader->setHidden(true);\n        _blogsHeader->setFont(headerFont);\n\n        //// --- Network Access Managers\n        if (!AppRegistry::instance().settingsManager()->disableHttpsFeatures()) {\n            auto text1Downloader = new QNetworkAccessManager;\n            VERIFY(connect(text1Downloader, SIGNAL(finished(QNetworkReply*)),\n                this, SLOT(on_downloadTextReply(QNetworkReply*))));\n            text1Downloader->head(QNetworkRequest(_text1_URL));\n\n            auto pic1Downloader = new QNetworkAccessManager;\n            VERIFY(connect(pic1Downloader, SIGNAL(finished(QNetworkReply*)),\n                this, SLOT(on_downloadPictureReply(QNetworkReply*))));\n            pic1Downloader->head(QNetworkRequest(_pic1_URL));\n\n            auto rssDownloader = new QNetworkAccessManager;\n            VERIFY(connect(rssDownloader, SIGNAL(finished(QNetworkReply*)),\n                this, SLOT(on_downloadRssReply(QNetworkReply*))));\n            rssDownloader->get(QNetworkRequest(_rss_URL));\n        }\n\n        //// --- Layouts\n        _allBlogsButton = new QPushButton(\"All Blog Posts\");\n        _allBlogsButton->setHidden(true);\n        _allBlogsButton->setStyleSheet(\"color: #106CD6\");\n        VERIFY(connect(_allBlogsButton, SIGNAL(clicked()), this, SLOT(on_allBlogsButton_clicked())));\n        _allBlogsButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);\n\n\n        _blogLinksLay = new QVBoxLayout;\n        _blogLinksLay->setAlignment(Qt::AlignLeft);\n\n        auto rightLayout = new QVBoxLayout;\n        rightLayout->setContentsMargins(20, -1, -1, -1);\n        rightLayout->addWidget(_blogsHeader, 0, Qt::AlignTop);\n        rightLayout->addLayout(_blogLinksLay);\n        rightLayout->addSpacing(15);\n        rightLayout->addWidget(_allBlogsButton, 0, Qt::AlignLeft);\n        rightLayout->addStretch();\n\n        auto leftLayout = new QVBoxLayout;\n        leftLayout->addWidget(_whatsNewHeader, 0, Qt::AlignTop);\n        leftLayout->addWidget(_pic1, 0, Qt::AlignTop);\n        leftLayout->addWidget(_whatsNewText, 0, Qt::AlignTop);\n        leftLayout->addStretch();\n        leftLayout->setSizeConstraint(QLayout::SetMinimumSize);\n\n        auto mainLayout = new QHBoxLayout;\n        mainLayout->setContentsMargins(20, 20, -1, -1);\n        mainLayout->addLayout(leftLayout);\n        mainLayout->addSpacing(20);\n        mainLayout->addLayout(rightLayout);\n        mainLayout->setSizeConstraint(QLayout::SetMinimumSize);\n\n        setLayout(mainLayout);\n    }\n\n    WelcomeTab::~WelcomeTab()\n    {\n\n    }\n\n    void WelcomeTab::on_downloadTextReply(QNetworkReply* reply)\n    {\n        auto hideOrShowWhatsNewHeader = [this]() {\n            if ((!_pic1->pixmap() || _pic1->pixmap()->isNull()) && _whatsNewText->text().isEmpty())\n                _whatsNewHeader->setHidden(true);\n            else \n                _whatsNewHeader->setVisible(true);\n        };\n\n        if (reply->operation() == QNetworkAccessManager::HeadOperation) {\n            if (reply->error() == QNetworkReply::NoError) { // No network error\n                QString const& createDate = reply->header(QNetworkRequest::LastModifiedHeader).toString();\n                if (createDate == AppRegistry::instance().settingsManager()->cacheData(Text1_LastModifiedDateKey)\n                    && fileExists(CacheDir + _text1_URL.fileName()))\n                {\n                    // Load from cache\n                    QFile file(CacheDir + _text1_URL.fileName());\n                    if (!file.open(QFile::ReadOnly | QFile::Text))\n                        return;\n\n                    QTextStream in(&file);\n                    QString str(in.readAll());\n                    setWhatsNewHeaderAndText(str);\n                    hideOrShowWhatsNewHeader();\n                    return;\n                }\n                else {  // Get from internet\n                    reply->manager()->get(QNetworkRequest(_text1_URL));\n                }\n            }\n            else {  // There is a network error \n                // Load from cache\n                QFile file(CacheDir + _text1_URL.fileName());\n                if (!file.open(QFile::ReadOnly | QFile::Text))\n                    return;\n\n                QTextStream in(&file);\n                QString str(in.readAll());\n                setWhatsNewHeaderAndText(str);\n                hideOrShowWhatsNewHeader();\n                return;\n            }\n        }\n        else if (reply->operation() == QNetworkAccessManager::GetOperation) {\n            // todo: handle get operation fails\n            QString str(QUrl::fromPercentEncoding(reply->readAll()));\n            if (str.isEmpty()) {\n                LOG_MSG(\"WelcomeTab: Failed to download text file from URL. Reason: \" + reply->errorString(),\n                    mongo::logger::LogSeverity::Warning());\n                hideOrShowWhatsNewHeader();\n                return;\n            }\n\n            setWhatsNewHeaderAndText(str);\n            hideOrShowWhatsNewHeader();\n            saveIntoCache(_text1_URL.fileName(), str, Text1_LastModifiedDateKey,\n                          reply->header(QNetworkRequest::LastModifiedHeader).toString());\n        }\n    }\n\n    void WelcomeTab::on_downloadPictureReply(QNetworkReply* reply)\n    {\n        auto const FIFTY_PERCENT_OF_TAB = _parent->width() * IMAGE_TO_TAB_RATIO;\n\n        QPixmap image;\n        auto hideOrShowWhatsNewHeader = [this]() {\n            if ((!_pic1->pixmap() || _pic1->pixmap()->isNull()) && _whatsNewText->text().isEmpty())\n                _whatsNewHeader->setHidden(true);\n            else\n                _whatsNewHeader->setVisible(true);\n        };\n\n        // Network error, load from cache\n        if (reply->error() != QNetworkReply::NoError) { \n            image = QPixmap(CacheDir + _pic1_URL.fileName());\n            if (image.isNull())\n                return;\n\n            _image = image;\n            _pic1->setPixmap(_image);\n\n            if (0 == _image.size().width())\n                return;\n\n            _pic1->setFixedSize(FIFTY_PERCENT_OF_TAB, (FIFTY_PERCENT_OF_TAB / _image.size().width()) * _image.size().height());\n            adjustSize();\n            hideOrShowWhatsNewHeader();\n            return;\n        }\n\n        // No network error\n        if (reply->operation() == QNetworkAccessManager::HeadOperation) {\n            QString const& createDate = reply->header(QNetworkRequest::LastModifiedHeader).toString();\n            // If the file in URL is not newer load from cache, otherwise get from internet\n            if (createDate == AppRegistry::instance().settingsManager()->cacheData(Image1_LastModifiedDateKey)\n                && fileExists(CacheDir + _pic1_URL.fileName())) \n            {\n                image = QPixmap(CacheDir + _pic1_URL.fileName());    // Load from cache\n            }\n            else {   // Get from internet\n                reply->manager()->get(QNetworkRequest(_pic1_URL));\n                return;\n            }\n        }\n        else if (reply->operation() == QNetworkAccessManager::GetOperation) {\n            image.loadFromData(reply->readAll());\n\n            if (image.isNull()) {\n                LOG_MSG(\"WelcomeTab: Failed to download image file from internet. Reason: \" + reply->errorString(),\n                         mongo::logger::LogSeverity::Warning());\n                image = QPixmap(CacheDir + _pic1_URL.fileName());\n            }\n            else {\n                saveIntoCache(_pic1_URL.fileName(), image, Image1_LastModifiedDateKey,\n                              reply->header(QNetworkRequest::LastModifiedHeader).toString());\n            }\n        }\n\n        // Set the image\n        if (image.isNull())\n            return;\n\n        _image = image;\n\n        if (0 == _image.size().width()) \n            return\n\n        hideOrShowWhatsNewHeader();\n        resize();\n    }\n\n    void WelcomeTab::on_downloadRssReply(QNetworkReply* reply)\n    {\n        auto const THIRTY_PERCENT_OF_TAB = _parent->width() * BLOG_TO_TAB_RATIO;\n\n        QByteArray data = reply->readAll();\n        if (data.isEmpty() || reply->error() != QNetworkReply::NoError) {\n            // Load from cache\n            QFile file(CacheDir + RssFileName);\n            if (!file.open(QFile::ReadOnly | QFile::Text))\n                return;\n\n            data = file.readAll();\n        }\n        \n        QXmlStreamReader xmlReader(data);\n\n        int count = 0;\n        int const MaxBlogCountShown = 10;\n        QString title, link, pubDate;\n        while (!xmlReader.atEnd()) {\n            xmlReader.readNext();\n            if (xmlReader.isStartElement()) {\n                if (xmlReader.name() == \"title\") \n                    title = xmlReader.readElementText();\n                else if (xmlReader.name() == \"link\")\n                    link = xmlReader.readElementText();\n                else if (xmlReader.name() == \"pubDate\")\n                    pubDate = xmlReader.readElementText().left(16);\n                \n                if (!pubDate.isEmpty()) {\n                    auto blogLink = new BlogLinkLabel(BlogLinkTemplate.arg(link, title));\n                    blogLink->setMouseTracking(true);\n                    blogLink->setAttribute(Qt::WA_Hover);\n                    blogLink->installEventFilter(this);\n                    blogLink->setTextInteractionFlags(Qt::TextBrowserInteraction);\n                    blogLink->setOpenExternalLinks(true);\n                    blogLink->setWordWrap(true);\n                    blogLink->setMinimumWidth(THIRTY_PERCENT_OF_TAB);\n                    _blogLinksLay->addWidget(blogLink);\n                    _blogLinksLay->addWidget(new QLabel(\"<font color='gray'>\" + pubDate + \"</font>\"));\n                    _blogLinksLay->addSpacing(_blogLinksLay->spacing());\n                    pubDate.clear();\n                    ++count;\n                    if (MaxBlogCountShown == count)\n                        break;\n                }\n            }\n        }\n\n        _blogsHeader->setVisible(true);\n        _allBlogsButton->setVisible(true);\n        adjustSize();\n\n        // Save into cache\n        saveIntoCache(RssFileName, data, Rss_LastModifiedDateKey, \"NotImplemented\");    // todo\n    }\n\n    void WelcomeTab::on_allBlogsButton_clicked()\n    {\n        QDesktopServices::openUrl(QUrl(\"https://blog.robomongo.org/\"));\n    }\n\n    void WelcomeTab::setWhatsNewHeaderAndText(QString const& str)\n    {\n        if (!str.contains(\"\\n\") || str.size() == 0)\n            return;\n\n        auto const firstNewLineIndex = str.indexOf(\"\\n\");\n        auto const leftOfStr = str.left(firstNewLineIndex);\n        auto const rightOfStr = str.right(str.size() - firstNewLineIndex - 7);\n        _whatsNewHeader->setText(WhatsNew.arg(leftOfStr));\n        _whatsNewText->setText(rightOfStr);\n        auto const SIXTY_PERCENT_OF_TAB = _parent->width() * TEXT_TO_TAB_RATIO;\n        _whatsNewText->setMaximumWidth(SIXTY_PERCENT_OF_TAB);\n        adjustSize();\n    }\n    \n    void WelcomeTab::resize()\n    {\n        auto const tabWidth = _parent->width();\n        auto const FIFTY_PERCENT_OF_TAB = _parent->width() * IMAGE_TO_TAB_RATIO;\n\n        _whatsNewText->setFixedWidth(tabWidth * TEXT_TO_TAB_RATIO);\n        _pic1->setPixmap(_image);\n\n        if (0 == _image.size().width())\n            return;\n\n        _pic1->setFixedSize(FIFTY_PERCENT_OF_TAB, (FIFTY_PERCENT_OF_TAB / _image.size().width())*_image.size().height());\n\n        _blogsHeader->setFixedWidth(tabWidth * BLOG_TO_TAB_RATIO);\n        for (int i = 0; i < _blogLinksLay->count(); ++i) {\n            if(auto wid = _blogLinksLay->itemAt(i)->widget())\n                wid->setFixedWidth(tabWidth * BLOG_TO_TAB_RATIO);\n        }\n\n        adjustSize();\n    }\n\n    bool WelcomeTab::eventFilter(QObject *target, QEvent *event)\n    {\n        auto blogLinkLabel = dynamic_cast<BlogLinkLabel*>(target);\n        // Make blog link underlined on mouse hover\n        if (blogLinkLabel) {\n            if (event->type() == QEvent::HoverEnter) {\n                blogLinkLabel->setText(blogLinkLabel->text().replace(\"text-decoration: none;\", \"text-decoration: ;\"));\n                setCursor(Qt::PointingHandCursor);\n                return true;\n            }\n            else  if (event->type() == QEvent::HoverLeave) {\n                blogLinkLabel->setText(blogLinkLabel->text().replace(\"text-decoration: ;\", \"text-decoration: none;\"));\n                setCursor(Qt::ArrowCursor);\n                return true;\n            }\n        }\n        return QWidget::eventFilter(target, event);\n    }\n\n    bool deleteOldCacheFile(QString const& absFilePath)\n    {\n        if (!fileExists(absFilePath))\n            return true;\n\n        if (!QFile::remove(absFilePath)) {\n            LOG_MSG(\"WelcomeTab: Failed to delete cached file at: \" + absFilePath,\n                     mongo::logger::LogSeverity::Warning());\n            return false;\n        }\n\n        return true;\n    }\n\n    bool saveIntoCache(QString const& fileName, QString const& fileData,\n                       QString const& lastModifiedKey, QString const& lastModifiedDate)\n    {\n        if (!QDir(CacheDir).exists())\n            QDir().mkdir(CacheDir);\n        else \n            deleteOldCacheFile(CacheDir + fileName);\n\n        QFile file(CacheDir + fileName);\n        if (!file.open(QIODevice::WriteOnly | QIODevice::Text))\n            return false;\n\n        QTextStream out(&file);\n        out << fileData;\n\n        // Save file's last modified date into settings\n        AppRegistry::instance().settingsManager()->addCacheData(lastModifiedKey, lastModifiedDate);\n        AppRegistry::instance().settingsManager()->save();\n        return true;\n    }\n\n    bool saveIntoCache(QString const& fileName, QPixmap const& pixMap,\n                       QString const& lastModifiedKey, QString const& lastModifiedDate)\n    {\n        if (!QDir(CacheDir).exists())\n            QDir().mkdir(CacheDir);\n        else \n            deleteOldCacheFile(CacheDir + fileName);\n\n        QFile file(CacheDir + fileName);\n        if (!file.open(QIODevice::WriteOnly | QIODevice::Text))\n            return false;\n\n        pixMap.save(CacheDir + fileName);\n\n        // Save file's last modified date into settings\n        AppRegistry::instance().settingsManager()->addCacheData(lastModifiedKey, lastModifiedDate);\n        AppRegistry::instance().settingsManager()->save();\n        return true;\n    }\n\n    bool saveIntoCache(QString const& fileName, QByteArray* data,\n                       QString const& lastModifiedKey, QString const& lastModifiedDate)\n    {\n        if (!QDir(CacheDir).exists())\n            QDir().mkdir(CacheDir);\n        else \n            deleteOldCacheFile(CacheDir + fileName);\n\n        QFile file(CacheDir + fileName);\n        if (!file.open(QIODevice::WriteOnly | QIODevice::Text))\n            return false;\n\n        file.write(*data);\n\n        // Save file's last modified date into settings\n        AppRegistry::instance().settingsManager()->addCacheData(lastModifiedKey, lastModifiedDate);\n        AppRegistry::instance().settingsManager()->save();\n        return true;\n    }\n\n}\n\n#endif // -------------------------------- end of Linux impl. ------------------------------------// \n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/WelcomeTab.h",
    "content": "#pragma once\n\n#ifndef __linux__  // ---------------------- Windows, macOS impl. --------------------------// \n\n#include <QWidget>\n#include <QWebEnginePage>\n\nQT_BEGIN_NAMESPACE\nclass QScrollArea;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    // ------------------ WelcomeTab\n    class WelcomeTab : public QWidget\n    {\n        Q_OBJECT\n    public:\n        WelcomeTab(QScrollArea* parent = nullptr);\n        QScrollArea* getParent() const { return _parent; }\n        void resize() { /* Not implemented for Windows and macOS */}\n\n    private:\n        QScrollArea* _parent;\n    };\n\n    // ------------------ MyWebPage\n    class MyWebPage : public QWebEnginePage\n    {\n        Q_OBJECT\n    public:\n        MyWebPage(QObject* parent = nullptr) : QWebEnginePage(parent) {}\n        bool acceptNavigationRequest(\n            QUrl const& url, NavigationType type, bool /*isMainFrame*/) override;\n    };\n}\n\n#else   // -------------------------------- Linux impl. ------------------------------------// \n\n#include <QWidget>\n#include <QUrl>\n\nQT_BEGIN_NAMESPACE\nclass QPushButton;\nclass QNetworkReply;\nclass QLabel;\nclass QVBoxLayout;\nclass QScrollArea;\nclass QEvent;\nclass QUrl;\nQT_END_NAMESPACE\n\nnamespace Robomongo\n{\n    struct ConnectionEstablishedEvent;\n    class ConnectionSettings;\n\n    class WelcomeTab : public QWidget\n    {\n        Q_OBJECT\n\n    public:\n        WelcomeTab(QScrollArea *parent = nullptr);\n        ~WelcomeTab();\n        QScrollArea* getParent() const { return _parent; }\n        void resize();\n\n    protected:\n        bool eventFilter(QObject *target, QEvent *event) override;\n\n    private Q_SLOTS:\n        void on_downloadTextReply(QNetworkReply* reply);\n        void on_downloadPictureReply(QNetworkReply* reply);\n        void on_downloadRssReply(QNetworkReply* reply);\n        void on_allBlogsButton_clicked();\n\n    private:\n        void setWhatsNewHeaderAndText(QString const& str);\n\n        QLabel* _pic1 = nullptr;\n        QLabel* _blogsSection;\n        QLabel* _blogsHeader;\n        QPushButton* _allBlogsButton = nullptr;\n        QVBoxLayout* _blogLinksLay;\n        QLabel* _whatsNewHeader;\n        QLabel* _whatsNewText;\n        QPushButton* _clearButton;\n        QScrollArea* _parent;\n        QPixmap _image;\n\n        QUrl _pic1_URL;\n        QUrl _text1_URL;\n        QUrl _rss_URL;\n    };\n\n}\n\n#endif // -------------------------------- end of Linux ------------------------------------// \n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/WorkAreaTabBar.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/WorkAreaTabBar.h\"\n\n#include <QMouseEvent>\n#include <QTabWidget>\n#include <QScrollArea>\n\nnamespace Robomongo\n{\n    /**\n     * @brief Creates WorkAreaTabBar, without parent widget. We are\n     * assuming, that tab bar will be installed to (and owned by)\n     * WorkAreaTabWidget, using QTabWidget::setTabBar().\n     */\n    WorkAreaTabBar::WorkAreaTabBar(QWidget *parent) \n        : QTabBar(parent)\n    {\n        setDrawBase(false);\n        setStyleSheet(buildStyleSheet());\n\n        _menu = new QMenu(this);\n        _newShellAction = new QAction(\"&New Shell\", _menu);\n        _newShellAction->setShortcut(QKeySequence(QKeySequence::AddTab));\n        _reloadShellAction = new QAction(\"&Re-execute Query\", _menu);\n        _reloadShellAction->setShortcut(Qt::CTRL + Qt::Key_R);\n        _duplicateShellAction = new QAction(\"&Duplicate Query In New Tab\", _menu);\n        _duplicateShellAction->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_T);\n        _pinShellAction = new QAction(\"&Pin Shell\", _menu);\n        _closeShellAction = new QAction(\"&Close Shell\", _menu);\n        _closeShellAction->setShortcut(Qt::CTRL + Qt::Key_W);\n        _closeOtherShellsAction = new QAction(\"Close &Other Shells\", _menu);\n        _closeShellsToTheRightAction = new QAction(\"Close Shells to the R&ight\", _menu);\n\n        _menu->addAction(_newShellAction);\n        _menu->addSeparator();\n        _menu->addAction(_reloadShellAction);\n        _menu->addAction(_duplicateShellAction);\n        _menu->addSeparator();\n        _menu->addAction(_closeShellAction);\n        _menu->addAction(_closeOtherShellsAction);\n        _menu->addAction(_closeShellsToTheRightAction);\n    }\n\n    /**\n     * @brief Overrides QTabBar::mouseReleaseEvent() in order to support\n     * middle-mouse tab close and to implement tab context menu.\n     */\n    void WorkAreaTabBar::mouseReleaseEvent(QMouseEvent *event)\n    {\n        if (event->button() == Qt::MidButton)\n            middleMouseReleaseEvent(event);\n        else if (event->button() == Qt::RightButton)\n            rightMouseReleaseEvent(event);\n\n        // always calling base event handler, even if we\n        // were interested by this event\n        QTabBar::mouseReleaseEvent(event);\n    }\n\n    void WorkAreaTabBar::mouseDoubleClickEvent(QMouseEvent *event)\n    {\n        int tabIndex = tabAt(event->pos());\n\n        // if tab was double-clicked, ignore this action\n        if (tabIndex >= 0)\n            return;\n\n        int currentTab = currentIndex();\n        if (currentTab < 0)\n            return;\n\n        emit newTabRequested(currentTab);\n        QTabBar::mouseDoubleClickEvent(event);\n    }\n\n    /**\n     * @brief Handles middle-mouse release event in order to close tab.\n     */\n    void WorkAreaTabBar::middleMouseReleaseEvent(QMouseEvent *event)\n    {\n        int tabIndex = tabAt(event->pos());\n        if (tabIndex < 0)\n            return;\n\n        emit tabCloseRequested(tabIndex);\n    }\n\n    /**\n     * @brief Handles right-mouse release event to show tab context menu.\n     */\n    void WorkAreaTabBar::rightMouseReleaseEvent(QMouseEvent *event)\n    {\n        int tabIndex = tabAt(event->pos());\n        if (tabIndex < 0)\n            return;\n\n        // If this is a Welcome tab, do not show right click menu. \n        // Note: Scroll area represents a WelcomeTab.\n        auto tabWidget = qobject_cast<QTabWidget*>(parentWidget());\n        if (qobject_cast<QScrollArea*>(tabWidget->widget(tabIndex)))\n            return;\n\n        QAction *selected = _menu->exec(QCursor::pos());\n        if (!selected)\n            return;\n\n        emitSignalForContextMenuAction(tabIndex, selected);\n    }\n\n    /**\n     * @brief Emits signal, based on specified action. Only actions\n     * specified in this class are supported. If we don't know specified\n     * action - no signal will be emited.\n     * @param tabIndex: index of tab, for which signal will be emited.\n     * @param action: context menu action.\n     */\n    void WorkAreaTabBar::emitSignalForContextMenuAction(int tabIndex, QAction *action)\n    {\n        if (action == _newShellAction)\n            emit newTabRequested(tabIndex);\n        else if (action == _reloadShellAction)\n            emit reloadTabRequested(tabIndex);\n        else if (action == _duplicateShellAction)\n            emit duplicateTabRequested(tabIndex);\n        else if (action == _pinShellAction)\n            emit pinTabRequested(tabIndex);\n        else if (action == _closeShellAction)\n            emit tabCloseRequested(tabIndex);\n        else if (action == _closeOtherShellsAction)\n            emit closeOtherTabsRequested(tabIndex);\n        else if (action == _closeShellsToTheRightAction)\n            emit closeTabsToTheRightRequested(tabIndex);\n    }\n\n    /**\n     * @brief Builds stylesheet for this WorkAreaTabBar widget.\n     */\n    QString WorkAreaTabBar::buildStyleSheet()\n    {\n        QColor background = palette().window().color();\n        QColor gradientZero = QColor(\"#ffffff\"); //Qt::white;//.lighter(103);\n        QColor gradientOne =  background.lighter(104); //Qt::white;//.lighter(103);\n        QColor gradientTwo =  background.lighter(108); //.lighter(103);\n        QColor selectedBorder = background.darker(103);\n\n        QString aga1 = gradientOne.name();\n        QString aga2 = gradientTwo.name();\n        QString aga3 = background.name();\n\n        QString styles = QString(\n            #ifndef __APPLE__\n            \"QTabBar::tab:first {\"\n                \"margin-left: 4px;\"\n            \"}  \"\n            \"QTabBar::tab:last {\"\n                \"margin-right: 1px;\"\n            \"}  \"\n            #endif\n            \"QTabBar::close-button { \"\n            #ifdef __APPLE__           \n                \"image: url(:/robomongo/icons/close_2_Mac_16x16.png);\"                \n            #else      \n                \"image: url(:/robomongo/icons/close_2_16x16.png);\"\n            #endif      \n                \"width: 10px;\"\n                \"height: 10px;\"\n            \"}\"\n            \"QTabBar::close-button:hover { \"\n                  \"image: url(:/robomongo/icons/close_hover_16x16.png);\"\n                  \"width: 15px;\"\n                  \"height: 15px;\"\n            \"}\"\n            \"QTabBar::tab {\"\n                \"background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,\"\n                                            \"stop: 0 #F0F0F0, stop: 0.4 #DEDEDE,\"\n                                            \"stop: 0.5 #E6E6E6, stop: 1.0 #E1E1E1);\"\n                \"border: 1px solid #C4C4C3;\"\n                \"border-bottom-color: #B8B7B6;\" // #C2C7CB same as the pane color\n                \"border-top-left-radius: 6px;\"\n                \"border-top-right-radius: 6px;\"\n                \"padding: 4px 0px 5px 0px;\"\n                #ifndef __APPLE__\n                \"max-width: 200px;\"\n                \"margin: 0px;\"\n                \"margin-left: 1px;\"\n                \"margin-right: -3px;\"  // it should be -(tab:first:margin-left + tab:last:margin-left) to fix incorrect text elidement                \n                #endif\n                \"}\"\n\n            \"QTabBar::tab:selected, QTabBar::tab:hover {\"\n                \"/* background: qlineargradient(x1: 0, y1: 1, x2: 0, y2: 0,\"\n                                            \"stop: 0 %1, stop: 0.3 %2,\"    //#fafafa, #f4f4f4\n                                            \"stop: 0.6 %3, stop: 1.0 %4); */\" //#e7e7e7, #fafafa\n                \"background-color: white;\"\n            \"}\"\n\n            \"QTabBar::tab:selected {\"\n                \"border-color: #9B9B9B;\" //\n                \"border-bottom-color: %4;\" //#fafafa\n            \"}\"\n\n            \"QTabBar::tab:!selected {\"\n                \"margin-top: 2px;\" // make non-selected tabs look smaller\n            \"}  \"\n            #ifndef __APPLE__\n            \"QTabBar::tab:only-one { margin-top: 2px; margin-left:4px; }\"\n            #endif\n        ).arg(gradientZero.name(), gradientOne.name(), gradientTwo.name(), \"#ffffff\");\n\n        QString aga = palette().window().color().name();\n\n        return styles;\n    }\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/WorkAreaTabBar.h",
    "content": "#pragma once\n\n#include <QTabBar>\n#include <QMenu>\n\nnamespace Robomongo\n{\n    /**\n     * @brief Tab bar for WorkAreaTabWidget.\n     */\n    class WorkAreaTabBar : public QTabBar\n    {\n        Q_OBJECT\n\n    public:\n        /**\n         * @brief Creates WorkAreaTabBar, without parent widget. We are\n         * assuming, that tab bar will be installed to (and owned by)\n         * WorkAreaTabWidget, using QTabWidget::setTabBar().\n         */\n        explicit WorkAreaTabBar(QWidget* parent = 0);\n\n    Q_SIGNALS:\n        /**\n         * @brief Emitted when user requests new tab creation.\n         * @param tabIndex: index of tab on which context menu was called.\n         */\n        void newTabRequested(int tabIndex);\n\n        /**\n         * @brief Emitted when user requests tab reload.\n         * @param tabIndex: index of tab on which context menu was called.\n         */\n        void reloadTabRequested(int tabIndex);\n\n        /**\n         * @brief Emitted when user requests tab duplication.\n         * @param tabIndex: index of tab on which context menu was called.\n         */\n        void duplicateTabRequested(int tabIndex);\n\n        /**\n         * @brief Emitted when user requests tab \"pinning\".\n         * @param tabIndex: index of tab on which context menu was called.\n         */\n        void pinTabRequested(int tabIndex);\n\n        /**\n         * @brief Emitted when user requests to close all other tabs.\n         * @param tabIndex: index of tab, that should be left opened.\n         */\n        void closeOtherTabsRequested(int tabIndex);\n\n        /**\n         * @brief Emitted when user requests to close all tabs to the right\n         * of tab with 'tabIndex' index\n         * @param tabIndex: index of tab on which context menu was called.\n         */\n        void closeTabsToTheRightRequested(int tabIndex);\n    protected:\n        /**\n         * @brief Overrides QTabBar::mouseReleaseEvent() in order to support\n         * middle-mouse tab close and to implement tab context menu.\n         */\n        void mouseReleaseEvent(QMouseEvent *event);\n\n        /**\n         * @brief Overrides QTabBar::mouseDoubleClickEvent() in order to\n         * open new shell.\n         */\n        void mouseDoubleClickEvent(QMouseEvent *);\n\n    private:\n        /**\n         * @brief Handles middle-mouse release event in order to close tab.\n         */\n        void middleMouseReleaseEvent(QMouseEvent *event);\n\n        /**\n         * @brief Handles right-mouse release event to show tab context menu.\n         */\n        void rightMouseReleaseEvent(QMouseEvent *event);\n\n        /**\n         * @brief Emits signal, based on specified action. Only actions\n         * specified in this class are supported. If we don't know specified\n         * action - no signal will be emited.\n         * @param tabIndex: index of tab, for which signal will be emited.\n         * @param action: context menu action.\n         */\n        void emitSignalForContextMenuAction(int tabIndex, QAction *action);\n\n        /**\n         * @brief Builds stylesheet for this WorkAreaTabBar widget.\n         */\n        QString buildStyleSheet();\n\n        /**\n         * @brief Tab's context menu.\n         */\n        QMenu *_menu;\n\n        /**\n         * @brief Tab's context menu actions.\n         */\n        QAction *_newShellAction;\n        QAction *_reloadShellAction;\n        QAction *_duplicateShellAction;\n        QAction *_pinShellAction;\n        QAction *_closeShellAction;\n        QAction *_closeOtherShellsAction;\n        QAction *_closeShellsToTheRightAction;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/WorkAreaTabWidget.cpp",
    "content": "#include \"robomongo/gui/widgets/workarea/WorkAreaTabWidget.h\"\n\n#include <QKeyEvent>\n#include <QScrollArea>\n\n#include \"robomongo/core/AppRegistry.h\"\n#include \"robomongo/core/utils/QtUtils.h\"\n#include \"robomongo/core/KeyboardManager.h\"\n#include \"robomongo/core/domain/MongoShell.h\"\n#include \"robomongo/core/settings/SettingsManager.h\"\n\n#include \"robomongo/gui/widgets/workarea/WorkAreaTabBar.h\"\n#include \"robomongo/gui/widgets/workarea/QueryWidget.h\"\n#include \"robomongo/gui/widgets/workarea/WelcomeTab.h\"\n#include \"robomongo/gui/GuiRegistry.h\"\n\nnamespace Robomongo\n{\n\n    /**\n     * @brief Creates WorkAreaTabWidget.\n     * @param workAreaWidget: WorkAreaWidget this tab belongs to.\n     */\n    WorkAreaTabWidget::WorkAreaTabWidget(QWidget *parent) :\n        QTabWidget(parent)\n    {\n        auto tab = new WorkAreaTabBar(this);\n        // This line (setTabBar()) should go before setTabsClosable(true)\n        setTabBar(tab);\n        setTabsClosable(true);\n        setElideMode(Qt::ElideRight);\n        setMovable(true);\n        setDocumentMode(true);\n\n#ifdef Q_OS_MAC\n        setDocumentMode(false);\n        QFont font = tab->font();\n        font.setPixelSize(12);\n        tab->setFont(font);\n        QString styles = QString(\n            \"QTabWidget::pane { background-color: white; }\"   // This style disables default styling under Mac\n            \"QTabWidget::tab-bar {\"\n                \"alignment: left;\"\n            \"}\"\n            \"QTabBar::tab:selected { \"\n                \"background: white; /*#E1E1E1*/; \"\n                \"color: #282828;\"\n            \"} \"\n            \"QTabBar::tab {\"\n                \"color: #505050;\"\n                \"font-size: 11px;\"\n                \"background: %1;\"\n                \"border-right: 1px solid #aaaaaa;\"\n                \"padding: 4px 5px 7px 5px;\"\n            \"}\"\n        ).arg(QWidget::palette().color(QWidget::backgroundRole()).darker(114).name());\n        setStyleSheet(styles);\n#endif\n\n        VERIFY(connect(this, SIGNAL(tabCloseRequested(int)), SLOT(tabBar_tabCloseRequested(int))));\n        VERIFY(connect(this, SIGNAL(currentChanged(int)), SLOT(ui_currentChanged(int))));\n\n        VERIFY(connect(tab, SIGNAL(newTabRequested(int)), SLOT(ui_newTabRequested(int))));\n        VERIFY(connect(tab, SIGNAL(reloadTabRequested(int)), SLOT(ui_reloadTabRequested(int))));\n        VERIFY(connect(tab, SIGNAL(duplicateTabRequested(int)), SLOT(ui_duplicateTabRequested(int))));\n        VERIFY(connect(tab, SIGNAL(closeOtherTabsRequested(int)), SLOT(ui_closeOtherTabsRequested(int))));\n        VERIFY(connect(tab, SIGNAL(closeTabsToTheRightRequested(int)), SLOT(ui_closeTabsToTheRightRequested(int))));\n\n        auto scrollArea = new QScrollArea;\n        _welcomeTab = new WelcomeTab(scrollArea);\n        scrollArea->setWidget(_welcomeTab);\n        scrollArea->setBackgroundRole(QPalette::Base);\n        scrollArea->setWidgetResizable(true);\n\n        if (!AppRegistry::instance().settingsManager()->disableHttpsFeatures()) {\n#ifdef __APPLE__\n            addTab(scrollArea, QIcon(), \"Welcome\");\n#else\n            addTab(scrollArea, GuiRegistry::instance().welcomeTabIcon(), \"Welcome\");\n#endif        \n        }\n        scrollArea->setFrameShape(QFrame::NoFrame);\n    }\n\n    void WorkAreaTabWidget::closeTab(int index)\n    {\n        if (index >= 0)\n        {\n            QueryWidget *tabWidget = queryWidget(index);\n            removeTab(index);\n            delete tabWidget;\n        }\n    }\n\n    void WorkAreaTabWidget::nextTab()\n    {\n        int index = currentIndex();\n        int tabsCount = count();\n        if (index == tabsCount - 1)\n        {\n            setCurrentIndex(0);\n            return;\n        }\n        if (index >= 0 && index < tabsCount - 1)\n        {\n            setCurrentIndex(index + 1);\n            return;\n        }\n    }\n\n    void WorkAreaTabWidget::previousTab()\n    {\n        int index = currentIndex();\n        if (index == 0)\n        {\n            setCurrentIndex(count() - 1);\n            return;\n        }\n        if (index > 0)\n        {\n            setCurrentIndex(index - 1);\n            return;\n        }\n    }\n\n    QueryWidget *WorkAreaTabWidget::currentQueryWidget()\n    {\n        return qobject_cast<QueryWidget *>(currentWidget());\n    }\n\n    QueryWidget *WorkAreaTabWidget::queryWidget(int index)\n    {\n        return qobject_cast<QueryWidget*>(widget(index));\n    }\n\n    WelcomeTab* WorkAreaTabWidget::getWelcomeTab()\n    {\n        return _welcomeTab;\n    }\n\n    void WorkAreaTabWidget::openWelcomeTab()\n    {\n        auto scrollArea = qobject_cast<QScrollArea*>(_welcomeTab->getParent());\n        if (!scrollArea)\n            return;\n\n        _welcomeTab = new WelcomeTab(scrollArea);\n        scrollArea->setWidget(_welcomeTab);\n        scrollArea->setBackgroundRole(QPalette::Base);\n\n#ifdef __APPLE__\n        QIcon icon;\n#else\n        QIcon const& icon = GuiRegistry::instance().welcomeTabIcon();\n#endif\n        // If welcome tab is closed open it as first tab otherwise refresh on \n        // it's current place.\n        if (indexOf(scrollArea) == -1)  // Welcome Tab is closed\n            insertTab(0, scrollArea, icon, \"Welcome\");\n        else \n            insertTab(indexOf(scrollArea), scrollArea, icon, \"Welcome\");\n\n        scrollArea->setFrameShape(QFrame::NoFrame);\n        setCurrentIndex(indexOf(scrollArea));\n    }\n\n    /**\n     * @brief Overrides QTabWidget::keyPressEvent() in order to intercept\n     * tab close key shortcuts (Ctrl+F4 and Ctrl+W)\n     */\n    void WorkAreaTabWidget::keyPressEvent(QKeyEvent *keyEvent)\n    {\n        if ((keyEvent->modifiers() & Qt::ControlModifier) &&\n            (keyEvent->key() == Qt::Key_F4 || keyEvent->key() == Qt::Key_W))\n        {\n            int index = currentIndex();\n            closeTab(index);\n            return;\n        }\n        QueryWidget *widget = currentQueryWidget();\n\n        if (KeyboardManager::isPreviousTabShortcut(keyEvent)) {\n            previousTab();\n            return;\n        } else if (KeyboardManager::isNextTabShortcut(keyEvent)) {\n            nextTab();\n            return;\n        } else if (KeyboardManager::isNewTabShortcut(keyEvent) && widget) {\n            widget->openNewTab();\n            return;\n        } else if (KeyboardManager::isDuplicateTabShortcut(keyEvent) && widget) {\n            widget->duplicate();\n            return;\n        } else if (KeyboardManager::isSetFocusOnQueryLineShortcut(keyEvent) && widget) {\n            widget->setScriptFocus();\n            return;\n        } else if (KeyboardManager::isExecuteScriptShortcut(keyEvent) && widget) {\n            widget->execute();\n            return;\n        } else if (KeyboardManager::isAutoCompleteShortcut(keyEvent) && widget) {\n            widget->showAutocompletion();\n            return;\n        } else if (KeyboardManager::isHideAutoCompleteShortcut(keyEvent) && widget) {\n            widget->hideAutocompletion();\n            return;\n        }\n\n        QTabWidget::keyPressEvent(keyEvent);\n    }\n\n    void WorkAreaTabWidget::resizeEvent(QResizeEvent* event)\n    {\n        QTabWidget::resizeEvent(event);\n\n        if (_welcomeTab && _welcomeTab->isVisible())\n            _welcomeTab->resize();\n    }\n\n    void WorkAreaTabWidget::tabBar_tabCloseRequested(int index)\n    {\n        closeTab(index);\n    }\n\n    void WorkAreaTabWidget::ui_newTabRequested(int index)\n    {\n        if (QueryWidget *query = queryWidget(index))\n            query->openNewTab();\n    }\n\n    void WorkAreaTabWidget::ui_reloadTabRequested(int index)\n    {\n        QueryWidget *query = queryWidget(index);\n\n        if (query)\n            query->reload();\n    }\n\n    void WorkAreaTabWidget::ui_duplicateTabRequested(int index)\n    {\n        QueryWidget *query = queryWidget(index);\n\n        if (query)\n            query->duplicate();\n    }\n\n    void WorkAreaTabWidget::ui_closeOtherTabsRequested(int index)\n    {\n        tabBar()->moveTab(index, 0);\n        while (count() > 1) {\n            closeTab(1); // close second tab\n        }\n    }\n\n    void WorkAreaTabWidget::ui_closeTabsToTheRightRequested(int index)\n    {\n        while (count() > index + 1) {\n            closeTab(index + 1); // close nearest tab\n        }\n    }\n\n    void WorkAreaTabWidget::ui_currentChanged(int index)\n    {\n        if (index < 0)\n            return;\n\n        QueryWidget *tabWidget = queryWidget(index);\n\n        if (tabWidget)\n            tabWidget->activateTabContent();\n    }\n\n    void WorkAreaTabWidget::tabTextChange(const QString &text)\n    {\n        QWidget *send = qobject_cast<QWidget*>(sender());\n        if (!send)\n            return;\n\n        setTabText(indexOf(send), text);        \n    }\n\n    void WorkAreaTabWidget::tooltipTextChange(const QString &text)\n    {\n        QWidget *send = qobject_cast<QWidget*>(sender());\n        if (!send)\n            return;\n\n        setTabToolTip(indexOf(send), text);\n    }\n\n    void WorkAreaTabWidget::handle(OpeningShellEvent *event)\n    {\n        const QString &title = event->shell->title();\n        QString shellName;\n        if (event->shell->isExecutable())\n            shellName = title.isEmpty() ? \" Loading...\" : title;\n        else\n            shellName = \"New Shell\";\n\n        auto queryWidget = new QueryWidget(event->shell, this);\n        VERIFY(connect(queryWidget, SIGNAL(titleChanged(const QString &)), \n                       this, SLOT(tabTextChange(const QString &))));\n        VERIFY(connect(queryWidget, SIGNAL(toolTipChanged(const QString &)), \n                       this, SLOT(tooltipTextChange(const QString &))));\n        \n        addTab(queryWidget, shellName);\n        setCurrentIndex(count() - 1);\n#if !defined(Q_OS_MAC)\n        setTabIcon(count() - 1, GuiRegistry::instance().mongodbIcon());\n#endif\n        if (!event->shell->isExecutable()) {\n            queryWidget->hideProgress();\n            queryWidget->setCurrentDatabase(event->shell->dbname());\n            return;\n        }\n\n        queryWidget->showProgress();\n    }\n}\n\n"
  },
  {
    "path": "src/robomongo/gui/widgets/workarea/WorkAreaTabWidget.h",
    "content": "#pragma once\n\n#include <QTabWidget>\n\nnamespace Robomongo\n{\n    class QueryWidget;\n    class OpeningShellEvent;\n    class WelcomeTab;\n\n    /**\n     * @brief WorkArea tab widget. Each tab represents MongoDB shell.\n     */\n    class WorkAreaTabWidget : public QTabWidget\n    {\n        Q_OBJECT\n\n    public:\n        /**\n         * @brief Creates WorkAreaTabWidget.\n         * @param workAreaWidget: WorkAreaWidget this tab belongs to.\n         */\n        explicit WorkAreaTabWidget(QWidget *parent = 0);\n\n        void closeTab(int index);\n        void nextTab();\n        void previousTab();\n\n        QueryWidget *currentQueryWidget();\n        QueryWidget *queryWidget(int index);\n        WelcomeTab *getWelcomeTab();\n        void openWelcomeTab();\n\n    public Q_SLOTS:\n        void handle(OpeningShellEvent *event);\n        void tabBar_tabCloseRequested(int index);\n        void ui_newTabRequested(int index);\n        void ui_reloadTabRequested(int index);\n        void ui_duplicateTabRequested(int index);\n        void ui_closeOtherTabsRequested(int index);\n        void ui_closeTabsToTheRightRequested(int index);\n        void ui_currentChanged(int index);\n\n        void tabTextChange(const QString &text);\n        void tooltipTextChange(const QString &text);\n\n    protected:\n        /**\n        * @brief Overrides QTabWidget::keyPressEvent() in order to intercept\n        * tab close key shortcuts (Ctrl+F4 and Ctrl+W)\n        */\n        virtual void keyPressEvent(QKeyEvent *event) override;\n        void resizeEvent(QResizeEvent* event) override;\n\n    private:\n        WelcomeTab* _welcomeTab;\n    };\n}\n"
  },
  {
    "path": "src/robomongo/resources/gnu_gpl3_license.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<!-- The license text is in English and appears broken in RTL as\n     Arabic, Farsi, etc.  Explicitly set the direction to override the\n     one defined in the translation. -->\n<div dir=\"ltr\">\n<h3 style=\"text-align: center;\">GNU GENERAL PUBLIC LICENSE</h3>\n<p style=\"text-align: center;\">Version 3, 29 June 2007</p>\n\n<p>Copyright © 2007 Free Software Foundation, Inc.\n &lt;<a href=\"http://fsf.org/\">http://fsf.org/</a>&gt;</p><p>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.</p>\n\n<h3><a name=\"preamble\"></a>Preamble</h3>\n\n<p>The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.</p>\n\n<p>The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.</p>\n\n<p>When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.</p>\n\n<p>To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.</p>\n\n<p>For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.</p>\n\n<p>Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.</p>\n\n<p>For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.</p>\n\n<p>Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.</p>\n\n<p>Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.</p>\n\n<p>The precise terms and conditions for copying, distribution and\nmodification follow.</p>\n\n<h3><a name=\"terms\"></a>TERMS AND CONDITIONS</h3>\n\n<h4><a name=\"section0\"></a>0. Definitions.</h4>\n\n<p>“This License” refers to version 3 of the GNU General Public License.</p>\n\n<p>“Copyright” also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.</p>\n \n<p>“The Program” refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as “you”.  “Licensees” and\n“recipients” may be individuals or organizations.</p>\n\n<p>To “modify” a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a “modified version” of the\nearlier work or a work “based on” the earlier work.</p>\n\n<p>A “covered work” means either the unmodified Program or a work based\non the Program.</p>\n\n<p>To “propagate” a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.</p>\n\n<p>To “convey” a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.</p>\n\n<p>An interactive user interface displays “Appropriate Legal Notices”\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.</p>\n\n<h4><a name=\"section1\"></a>1. Source Code.</h4>\n\n<p>The “source code” for a work means the preferred form of the work\nfor making modifications to it.  “Object code” means any non-source\nform of a work.</p>\n\n<p>A “Standard Interface” means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.</p>\n\n<p>The “System Libraries” of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n“Major Component”, in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.</p>\n\n<p>The “Corresponding Source” for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.</p>\n\n<p>The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.</p>\n\n<p>The Corresponding Source for a work in source code form is that\nsame work.</p>\n\n<h4><a name=\"section2\"></a>2. Basic Permissions.</h4>\n\n<p>All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.</p>\n\n<p>You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.</p>\n\n<p>Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.</p>\n\n<h4><a name=\"section3\"></a>3. Protecting Users' Legal Rights From Anti-Circumvention Law.</h4>\n\n<p>No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.</p>\n\n<p>When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.</p>\n\n<h4><a name=\"section4\"></a>4. Conveying Verbatim Copies.</h4>\n\n<p>You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.</p>\n\n<p>You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.</p>\n\n<h4><a name=\"section5\"></a>5. Conveying Modified Source Versions.</h4>\n\n<p>You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:</p>\n\n<ul>\n<li>a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.</li>\n\n<li>b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    “keep intact all notices”.</li>\n\n<li>c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.</li>\n\n<li>d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.</li>\n</ul>\n\n<p>A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n“aggregate” if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.</p>\n\n<h4><a name=\"section6\"></a>6. Conveying Non-Source Forms.</h4>\n\n<p>You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:</p>\n\n<ul>\n<li>a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.</li>\n\n<li>b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.</li>\n\n<li>c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.</li>\n\n<li>d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.</li>\n\n<li>e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.</li>\n</ul>\n\n<p>A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.</p>\n\n<p>A “User Product” is either (1) a “consumer product”, which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, “normally used” refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.</p>\n\n<p>“Installation Information” for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.</p>\n\n<p>If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).</p>\n\n<p>The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.</p>\n\n<p>Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.</p>\n\n<h4><a name=\"section7\"></a>7. Additional Terms.</h4>\n\n<p>“Additional permissions” are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.</p>\n\n<p>When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.</p>\n\n<p>Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:</p>\n\n<ul>\n<li>a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or</li>\n\n<li>b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or</li>\n\n<li>c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or</li>\n\n<li>d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or</li>\n\n<li>e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or</li>\n\n<li>f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.</li>\n</ul>\n\n<p>All other non-permissive additional terms are considered “further\nrestrictions” within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.</p>\n\n<p>If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.</p>\n\n<p>Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.</p>\n\n<h4><a name=\"section8\"></a>8. Termination.</h4>\n\n<p>You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).</p>\n\n<p>However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.</p>\n\n<p>Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.</p>\n\n<p>Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.</p>\n\n<h4><a name=\"section9\"></a>9. Acceptance Not Required for Having Copies.</h4>\n\n<p>You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.</p>\n\n<h4><a name=\"section10\"></a>10. Automatic Licensing of Downstream Recipients.</h4>\n\n<p>Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.</p>\n\n<p>An “entity transaction” is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.</p>\n\n<p>You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.</p>\n\n<h4><a name=\"section11\"></a>11. Patents.</h4>\n\n<p>A “contributor” is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's “contributor version”.</p>\n\n<p>A contributor's “essential patent claims” are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, “control” includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.</p>\n\n<p>Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.</p>\n\n<p>In the following three paragraphs, a “patent license” is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To “grant” such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.</p>\n\n<p>If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  “Knowingly relying” means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.</p>\n  \n<p>If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.</p>\n\n<p>A patent license is “discriminatory” if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.</p>\n\n<p>Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.</p>\n\n<h4><a name=\"section12\"></a>12. No Surrender of Others' Freedom.</h4>\n\n<p>If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.</p>\n\n<h4><a name=\"section13\"></a>13. Use with the GNU Affero General Public License.</h4>\n\n<p>Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.</p>\n\n<h4><a name=\"section14\"></a>14. Revised Versions of this License.</h4>\n\n<p>The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.</p>\n\n<p>Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License “or any later version” applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.</p>\n\n<p>If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.</p>\n\n<p>Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.</p>\n\n<h4><a name=\"section15\"></a>15. Disclaimer of Warranty.</h4>\n\n<p>THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.</p>\n\n<h4><a name=\"section16\"></a>16. Limitation of Liability.</h4>\n\n<p>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.</p>\n\n<h4><a name=\"section17\"></a>17. Interpretation of Sections 15 and 16.</h4>\n\n<p>If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.</p>\n\n<p>END OF TERMS AND CONDITIONS</p>\n\n</body></html>"
  },
  {
    "path": "src/robomongo/resources/robo.qrc",
    "content": "<RCC>\n    <qresource>\n        <file>gnu_gpl3_license.html</file>                \n    </qresource>\n</RCC>\n"
  },
  {
    "path": "src/robomongo/shell/bson/json.cpp",
    "content": "/*    Copyright 2009 10gen Inc.\n *\n *    This program is free software: you can redistribute it and/or  modify\n *    it under the terms of the GNU Affero General Public License, version 3,\n *    as published by the Free Software Foundation.\n *\n *    This program is distributed in the hope that it will be useful,\n *    but WITHOUT ANY WARRANTY; without even the implied warranty of\n *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *    GNU Affero General Public License for more details.\n *\n *    You should have received a copy of the GNU Affero General Public License\n *    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n *    As a special exception, the copyright holders give permission to link the\n *    code of portions of this program with the OpenSSL library under certain\n *    conditions as described in each individual source file and distribute\n *    linked combinations including the program with the OpenSSL library. You\n *    must comply with the GNU Affero General Public License in all respects\n *    for all of the code used other than as permitted herein. If you modify\n *    file(s) with this exception, you may extend this exception to your\n *    version of the file(s), but you are not obligated to do so. If you do not\n *    wish to do so, delete this exception statement from your version. If you\n *    delete this exception statement from all source files in the program,\n *    then also delete it in the license file.\n */\n\n#define MONGO_LOG_DEFAULT_COMPONENT ::mongo::logger::LogComponent::kDefault\n\n#include \"robomongo/shell/bson/json.h\"\n#include \"robomongo/shell/db/ptimeutil.h\"\n#include <boost/date_time/posix_time/posix_time.hpp>\n#include <boost/date_time/posix_time/posix_time_io.hpp>\n#include <boost/scoped_array.hpp>\n\n#include <cstdint>\n\n#include \"mongo/base/parse_number.h\"\n#include \"mongo/bson/json.h\"\n#include \"mongo/db/jsobj.h\"\n#include \"mongo/platform/decimal128.h\"\n#include \"mongo/platform/strtoll.h\"\n#include \"mongo/util/base64.h\"\n#include \"mongo/util/hex.h\"\n#include \"mongo/util/log.h\"\n#include \"mongo/util/str.h\"\n#include \"mongo/util/time_support.h\"\n#include \"robomongo/core/HexUtils.h\"\n\nnamespace mongo {\nnamespace Robomongo {\n\nusing std::unique_ptr;\nusing std::ostringstream;\nusing std::string;\n\n#if 0\n#define MONGO_JSON_DEBUG(message)                                                          \\\n    log() << \"JSON DEBUG @ \" << __FILE__ << \":\" << __LINE__ << \" \" << __FUNCTION__ << \": \" \\\n          << message << endl;\n#else\n#define MONGO_JSON_DEBUG(message)\n#endif\n\n#define ALPHA \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\n#define DIGIT \"0123456789\"\n#define CONTROL \"\\a\\b\\f\\n\\r\\t\\v\"\n#define JOPTIONS \"gims\"\n\n// Size hints given to char vectors\nenum {\n    ID_RESERVE_SIZE = 64,\n    PAT_RESERVE_SIZE = 4096,\n    OPT_RESERVE_SIZE = 64,\n    FIELD_RESERVE_SIZE = 4096,\n    STRINGVAL_RESERVE_SIZE = 4096,\n    BINDATA_RESERVE_SIZE = 4096,\n    BINDATATYPE_RESERVE_SIZE = 4096,\n    NS_RESERVE_SIZE = 64,\n    DB_RESERVE_SIZE = 64,\n    NUMBERLONG_RESERVE_SIZE = 64,\n    NUMBERDECIMAL_RESERVE_SIZE = 64,\n    DATE_RESERVE_SIZE = 64\n};\n\nstatic const char* LBRACE = \"{\", * RBRACE = \"}\", * LBRACKET = \"[\", * RBRACKET = \"]\", * LPAREN = \"(\",\n                   * RPAREN = \")\", * COLON = \":\", * COMMA = \",\", * FORWARDSLASH = \"/\",\n                   * SINGLEQUOTE = \"'\", * DOUBLEQUOTE = \"\\\"\";\n\nJParse::JParse(StringData str)\n    : _buf(str.rawData()), _input(_buf), _input_end(_input + str.size()) {}\n\nStatus JParse::parseError(StringData msg) {\n    std::ostringstream ossmsg;\n    ossmsg << msg;\n\n    // offset will be taken using public offset() method and passed to ParseMsgAssertionException\n    // ossmsg << \": offset:\";\n    // ossmsg << offset();\n    // ossmsg << \" of:\";\n    // ossmsg << _buf;\n\n    return Status(ErrorCodes::FailedToParse, ossmsg.str());\n}\n\nStatus JParse::value(StringData fieldName, BSONObjBuilder& builder) {\n    MONGO_JSON_DEBUG(\"fieldName: \" << fieldName);\n    if (peekToken(LBRACE)) {\n        Status ret = object(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (peekToken(LBRACKET)) {\n        Status ret = array(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (readToken(\"new\")) {\n        Status ret = constructor(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (readToken(\"Date\")) {\n        Status ret = date(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    }\n\n//#ifdef ROBOMONGO\n    else if (readToken(\"ISODate\")) {\n        Status ret = isodate(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    }\n    else if (readToken(\"UUID\")) {\n        Status ret = uuid(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    }\n    else if (readToken(\"LUUID\")) {\n        Status ret = luuid(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    }\n    else if (readToken(\"JUUID\")) {\n        Status ret = juuid(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    }\n    else if (readToken(\"NUUID\") || readToken(\"CSUUID\")) {\n        Status ret = nuuid(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    }\n    else if (readToken(\"PYUUID\")) {\n        Status ret = pyuuid(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    }\n//#endif\n\n    else if (readToken(\"Timestamp\")) {\n        Status ret = timestamp(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (readToken(\"ObjectId\")) {\n        Status ret = objectId(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (readToken(\"NumberLong\")) {\n        Status ret = numberLong(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (readToken(\"NumberInt\")) {\n        Status ret = numberInt(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (readToken(\"NumberDecimal\")) {\n        Status ret = numberDecimal(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (readToken(\"Dbref\") || readToken(\"DBRef\")) {\n        Status ret = dbRef(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (peekToken(FORWARDSLASH)) {\n        Status ret = regex(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (peekToken(DOUBLEQUOTE) || peekToken(SINGLEQUOTE)) {\n        std::string valueString;\n        valueString.reserve(STRINGVAL_RESERVE_SIZE);\n        Status ret = quotedString(&valueString);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n        builder.append(fieldName, valueString);\n    } else if (readToken(\"true\")) {\n        builder.append(fieldName, true);\n    } else if (readToken(\"false\")) {\n        builder.append(fieldName, false);\n    } else if (readToken(\"null\")) {\n        builder.appendNull(fieldName);\n    } else if (readToken(\"undefined\")) {\n        builder.appendUndefined(fieldName);\n    } else if (readToken(\"NaN\")) {\n        builder.append(fieldName, std::numeric_limits<double>::quiet_NaN());\n    } else if (readToken(\"Infinity\")) {\n        builder.append(fieldName, std::numeric_limits<double>::infinity());\n    } else if (readToken(\"-Infinity\")) {\n        builder.append(fieldName, -std::numeric_limits<double>::infinity());\n    } else {\n        Status ret = number(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    }\n    return Status::OK();\n}\n\nStatus JParse::parse(BSONObjBuilder& builder) {\n    return isArray() ? array(\"UNUSED\", builder, false) : object(\"UNUSED\", builder, false);\n}\n\nStatus JParse::object(StringData fieldName, BSONObjBuilder& builder, bool subObject) {\n    MONGO_JSON_DEBUG(\"fieldName: \" << fieldName);\n    if (!readToken(LBRACE)) {\n        return parseError(\"Expecting '{'\");\n    }\n\n    // Empty object\n    if (readToken(RBRACE)) {\n        if (subObject) {\n            BSONObjBuilder empty(builder.subobjStart(fieldName));\n            empty.done();\n        }\n        return Status::OK();\n    }\n\n    // Special object\n    std::string firstField;\n    firstField.reserve(FIELD_RESERVE_SIZE);\n    Status ret = field(&firstField);\n    if (ret != Status::OK()) {\n        return ret;\n    }\n\n    if (firstField == \"$oid\") {\n        if (!subObject) {\n            return parseError(\"Reserved field name in base object: $oid\");\n        }\n        Status ret = objectIdObject(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (firstField == \"$binary\") {\n        if (!subObject) {\n            return parseError(\"Reserved field name in base object: $binary\");\n        }\n        Status ret = binaryObject(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (firstField == \"$date\") {\n        if (!subObject) {\n            return parseError(\"Reserved field name in base object: $date\");\n        }\n        Status ret = dateObject(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (firstField == \"$timestamp\") {\n        if (!subObject) {\n            return parseError(\"Reserved field name in base object: $timestamp\");\n        }\n        Status ret = timestampObject(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (firstField == \"$regex\") {\n        if (!subObject) {\n            return parseError(\"Reserved field name in base object: $regex\");\n        }\n        Status ret = regexObject(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (firstField == \"$ref\") {\n        if (!subObject) {\n            return parseError(\"Reserved field name in base object: $ref\");\n        }\n        Status ret = dbRefObject(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (firstField == \"$undefined\") {\n        if (!subObject) {\n            return parseError(\"Reserved field name in base object: $undefined\");\n        }\n        Status ret = undefinedObject(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (firstField == \"$numberLong\") {\n        if (!subObject) {\n            return parseError(\"Reserved field name in base object: $numberLong\");\n        }\n        Status ret = numberLongObject(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (firstField == \"$numberDecimal\") {\n        if (!subObject) {\n            return parseError(\"Reserved field name in base object: $numberDecimal\");\n        }\n        Status ret = numberDecimalObject(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (firstField == \"$minKey\") {\n        if (!subObject) {\n            return parseError(\"Reserved field name in base object: $minKey\");\n        }\n        Status ret = minKeyObject(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else if (firstField == \"$maxKey\") {\n        if (!subObject) {\n            return parseError(\"Reserved field name in base object: $maxKey\");\n        }\n        Status ret = maxKeyObject(fieldName, builder);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n    } else {  // firstField != <reserved field name>\n        // Normal object\n\n        // Only create a sub builder if this is not the base object\n        BSONObjBuilder* objBuilder = &builder;\n        unique_ptr<BSONObjBuilder> subObjBuilder;\n        if (subObject) {\n            subObjBuilder.reset(new BSONObjBuilder(builder.subobjStart(fieldName)));\n            objBuilder = subObjBuilder.get();\n        }\n\n        if (!readToken(COLON)) {\n            return parseError(\"Expecting ':'\");\n        }\n        Status valueRet = value(firstField, *objBuilder);\n        if (valueRet != Status::OK()) {\n            return valueRet;\n        }\n        while (readToken(COMMA)) {\n            std::string fieldName;\n            fieldName.reserve(FIELD_RESERVE_SIZE);\n            Status fieldRet = field(&fieldName);\n            if (fieldRet != Status::OK()) {\n                return fieldRet;\n            }\n            if (!readToken(COLON)) {\n                return parseError(\"Expecting ':'\");\n            }\n            Status valueRet = value(fieldName, *objBuilder);\n            if (valueRet != Status::OK()) {\n                return valueRet;\n            }\n        }\n    }\n    if (!readToken(RBRACE)) {\n        return parseError(\"Expecting '}' or ','\");\n    }\n    return Status::OK();\n}\n\nStatus JParse::objectIdObject(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(COLON)) {\n        return parseError(\"Expected ':'\");\n    }\n    std::string id;\n    id.reserve(ID_RESERVE_SIZE);\n    Status ret = quotedString(&id);\n    if (ret != Status::OK()) {\n        return ret;\n    }\n    if (id.size() != 24) {\n        return parseError(\"Expecting 24 hex digits: \" + id);\n    }\n    if (!isHexString(id)) {\n        return parseError(\"Expecting hex digits: \" + id);\n    }\n    builder.append(fieldName, OID(id));\n    return Status::OK();\n}\n\nStatus JParse::binaryObject(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(COLON)) {\n        return parseError(\"Expected ':'\");\n    }\n    std::string binDataString;\n    binDataString.reserve(BINDATA_RESERVE_SIZE);\n    Status dataRet = quotedString(&binDataString);\n    if (dataRet != Status::OK()) {\n        return dataRet;\n    }\n    if (binDataString.size() % 4 != 0) {\n        return parseError(\"Invalid length base64 encoded string\");\n    }\n    if (!isBase64String(binDataString)) {\n        return parseError(\"Invalid character in base64 encoded string\");\n    }\n    const std::string& binData = base64::decode(binDataString);\n    if (!readToken(COMMA)) {\n        return parseError(\"Expected ','\");\n    }\n\n    if (!readField(\"$type\")) {\n        return parseError(\"Expected second field name: \\\"$type\\\", in \\\"$binary\\\" object\");\n    }\n    if (!readToken(COLON)) {\n        return parseError(\"Expected ':'\");\n    }\n    std::string binDataType;\n    binDataType.reserve(BINDATATYPE_RESERVE_SIZE);\n    Status typeRet = quotedString(&binDataType);\n    if (typeRet != Status::OK()) {\n        return typeRet;\n    }\n    if ((binDataType.size() != 2) || !isHexString(binDataType)) {\n        return parseError(\n            \"Argument of $type in $bindata object must be a hex string representation of a single \"\n            \"byte\");\n    }\n    builder.appendBinData(\n        fieldName, binData.length(), BinDataType(fromHex(binDataType).getValue()), binData.data());\n    return Status::OK();\n}\n\nStatus JParse::dateObject(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(COLON)) {\n        return parseError(\"Expected ':'\");\n    }\n    errno = 0;\n    char* endptr;\n    Date_t date;\n\n    if (peekToken(DOUBLEQUOTE)) {\n        std::string dateString;\n        dateString.reserve(DATE_RESERVE_SIZE);\n        Status ret = quotedString(&dateString);\n        if (!ret.isOK()) {\n            return ret;\n        }\n        StatusWith<Date_t> dateRet = dateFromISOString(dateString);\n        if (!dateRet.isOK()) {\n            return dateRet.getStatus();\n        }\n        date = dateRet.getValue();\n    } else if (readToken(LBRACE)) {\n        std::string fieldName;\n        fieldName.reserve(FIELD_RESERVE_SIZE);\n        Status ret = field(&fieldName);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n        if (fieldName != \"$numberLong\") {\n            return parseError(\"Expected field name: $numberLong for $date value object\");\n        }\n        if (!readToken(COLON)) {\n            return parseError(\"Expecting ':'\");\n        }\n\n        // The number must be a quoted string, since large long numbers could overflow a double\n        // and thus may not be valid JSON\n        std::string numberLongString;\n        numberLongString.reserve(NUMBERLONG_RESERVE_SIZE);\n        ret = quotedString(&numberLongString);\n        if (!ret.isOK()) {\n            return ret;\n        }\n\n        long long numberLong;\n        ret = parseNumberFromString(numberLongString, &numberLong);\n        if (!ret.isOK()) {\n            return ret;\n        }\n        date = Date_t::fromMillisSinceEpoch(numberLong);\n    } else {\n        // SERVER-11920: We should use parseNumberFromString here, but that function requires\n        // that we know ahead of time where the number ends, which is not currently the case.\n        date = Date_t::fromMillisSinceEpoch(strtoll(_input, &endptr, 10));\n        if (_input == endptr) {\n            return parseError(\"Date expecting integer milliseconds\");\n        }\n        if (errno == ERANGE) {\n            /* Need to handle this because jsonString outputs the value of Date_t as unsigned.\n            * See SERVER-8330 and SERVER-8573 */\n            errno = 0;\n            // SERVER-11920: We should use parseNumberFromString here, but that function\n            // requires that we know ahead of time where the number ends, which is not currently\n            // the case.\n            date =\n                Date_t::fromMillisSinceEpoch(static_cast<long long>(strtoull(_input, &endptr, 10)));\n            if (errno == ERANGE) {\n                return parseError(\"Date milliseconds overflow\");\n            }\n        }\n        _input = endptr;\n    }\n    builder.appendDate(fieldName, date);\n    return Status::OK();\n}\n\nStatus JParse::timestampObject(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(COLON)) {\n        return parseError(\"Expecting ':'\");\n    }\n    if (!readToken(LBRACE)) {\n        return parseError(\"Expecting '{' to start \\\"$timestamp\\\" object\");\n    }\n\n    if (!readField(\"t\")) {\n        return parseError(\"Expected field name \\\"t\\\" in \\\"$timestamp\\\" sub object\");\n    }\n\n    if (!readToken(COLON)) {\n        return parseError(\"Expecting ':'\");\n    }\n    if (readToken(\"-\")) {\n        return parseError(\"Negative seconds in \\\"$timestamp\\\"\");\n    }\n    errno = 0;\n    char* endptr;\n    // SERVER-11920: We should use parseNumberFromString here, but that function requires that\n    // we know ahead of time where the number ends, which is not currently the case.\n    uint32_t seconds = strtoul(_input, &endptr, 10);\n    if (errno == ERANGE) {\n        return parseError(\"Timestamp seconds overflow\");\n    }\n    if (_input == endptr) {\n        return parseError(\"Expecting unsigned integer seconds in \\\"$timestamp\\\"\");\n    }\n    _input = endptr;\n    if (!readToken(COMMA)) {\n        return parseError(\"Expecting ','\");\n    }\n\n    if (!readField(\"i\")) {\n        return parseError(\"Expected field name \\\"i\\\" in \\\"$timestamp\\\" sub object\");\n    }\n    if (!readToken(COLON)) {\n        return parseError(\"Expecting ':'\");\n    }\n    if (readToken(\"-\")) {\n        return parseError(\"Negative increment in \\\"$timestamp\\\"\");\n    }\n    errno = 0;\n    // SERVER-11920: We should use parseNumberFromString here, but that function requires that\n    // we know ahead of time where the number ends, which is not currently the case.\n    uint32_t count = strtoul(_input, &endptr, 10);\n    if (errno == ERANGE) {\n        return parseError(\"Timestamp increment overflow\");\n    }\n    if (_input == endptr) {\n        return parseError(\"Expecting unsigned integer increment in \\\"$timestamp\\\"\");\n    }\n    _input = endptr;\n\n    if (!readToken(RBRACE)) {\n        return parseError(\"Expecting '}'\");\n    }\n    builder.append(fieldName, Timestamp(seconds, count));\n    return Status::OK();\n}\n\nStatus JParse::regexObject(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(COLON)) {\n        return parseError(\"Expecting ':'\");\n    }\n    std::string pat;\n    pat.reserve(PAT_RESERVE_SIZE);\n    Status patRet = quotedString(&pat);\n    if (patRet != Status::OK()) {\n        return patRet;\n    }\n    if (readToken(COMMA)) {\n        if (!readField(\"$options\")) {\n            return parseError(\"Expected field name: \\\"$options\\\" in \\\"$regex\\\" object\");\n        }\n        if (!readToken(COLON)) {\n            return parseError(\"Expecting ':'\");\n        }\n        std::string opt;\n        opt.reserve(OPT_RESERVE_SIZE);\n        Status optRet = quotedString(&opt);\n        if (optRet != Status::OK()) {\n            return optRet;\n        }\n        Status optCheckRet = regexOptCheck(opt);\n        if (optCheckRet != Status::OK()) {\n            return optCheckRet;\n        }\n        builder.appendRegex(fieldName, pat, opt);\n    } else {\n        builder.appendRegex(fieldName, pat, \"\");\n    }\n    return Status::OK();\n}\n\nStatus JParse::dbRefObject(StringData fieldName, BSONObjBuilder& builder) {\n    BSONObjBuilder subBuilder(builder.subobjStart(fieldName));\n\n    if (!readToken(COLON)) {\n        return parseError(\"DBRef: Expecting ':'\");\n    }\n    std::string ns;\n    ns.reserve(NS_RESERVE_SIZE);\n    Status ret = quotedString(&ns);\n    if (ret != Status::OK()) {\n        return ret;\n    }\n    subBuilder.append(\"$ref\", ns);\n\n    if (!readToken(COMMA)) {\n        return parseError(\"DBRef: Expecting ','\");\n    }\n\n    if (!readField(\"$id\")) {\n        return parseError(\"DBRef: Expected field name: \\\"$id\\\" in \\\"$ref\\\" object\");\n    }\n    if (!readToken(COLON)) {\n        return parseError(\"DBRef: Expecting ':'\");\n    }\n    Status valueRet = value(\"$id\", subBuilder);\n    if (valueRet != Status::OK()) {\n        return valueRet;\n    }\n\n    if (readToken(COMMA)) {\n        if (!readField(\"$db\")) {\n            return parseError(\"DBRef: Expected field name: \\\"$db\\\" in \\\"$ref\\\" object\");\n        }\n        if (!readToken(COLON)) {\n            return parseError(\"DBRef: Expecting ':'\");\n        }\n        std::string db;\n        db.reserve(DB_RESERVE_SIZE);\n        ret = quotedString(&db);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n        subBuilder.append(\"$db\", db);\n    }\n\n    subBuilder.done();\n    return Status::OK();\n}\n\nStatus JParse::undefinedObject(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(COLON)) {\n        return parseError(\"Expecting ':'\");\n    }\n    if (!readToken(\"true\")) {\n        return parseError(\"Reserved field \\\"$undefined\\\" requires value of true\");\n    }\n    builder.appendUndefined(fieldName);\n    return Status::OK();\n}\n\nStatus JParse::numberLongObject(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(COLON)) {\n        return parseError(\"Expecting ':'\");\n    }\n\n    // The number must be a quoted string, since large long numbers could overflow a double and\n    // thus may not be valid JSON\n    std::string numberLongString;\n    numberLongString.reserve(NUMBERLONG_RESERVE_SIZE);\n    Status ret = quotedString(&numberLongString);\n    if (!ret.isOK()) {\n        return ret;\n    }\n\n    long long numberLong;\n    ret = parseNumberFromString(numberLongString, &numberLong);\n    if (!ret.isOK()) {\n        return ret;\n    }\n\n    builder.append(fieldName, numberLong);\n    return Status::OK();\n}\n\nStatus JParse::numberDecimalObject(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(COLON)) \n        return parseError(\"Expecting ':'\");\n    \n    // The number must be a quoted string, since large decimal numbers could overflow other types\n    // and thus may not be valid JSON\n    std::string numberDecimalString;\n    numberDecimalString.reserve(NUMBERDECIMAL_RESERVE_SIZE);\n    Status ret = quotedString(&numberDecimalString);\n    if (!ret.isOK()) \n        return ret;\n   \n    Decimal128 numberDecimal(numberDecimalString);\n\n    builder.appendNumber(fieldName, numberDecimal);\n    return Status::OK();\n}\n\nStatus JParse::minKeyObject(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(COLON)) {\n        return parseError(\"Expecting ':'\");\n    }\n    if (!readToken(\"1\")) {\n        return parseError(\"Reserved field \\\"$minKey\\\" requires value of 1\");\n    }\n    builder.appendMinKey(fieldName);\n    return Status::OK();\n}\n\nStatus JParse::maxKeyObject(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(COLON)) {\n        return parseError(\"Expecting ':'\");\n    }\n    if (!readToken(\"1\")) {\n        return parseError(\"Reserved field \\\"$maxKey\\\" requires value of 1\");\n    }\n    builder.appendMaxKey(fieldName);\n    return Status::OK();\n}\n\nStatus JParse::array(StringData fieldName, BSONObjBuilder& builder, bool subObject) {\n    MONGO_JSON_DEBUG(\"fieldName: \" << fieldName);\n    uint32_t index(0);\n    if (!readToken(LBRACKET)) {\n        return parseError(\"Expecting '['\");\n    }\n\n    BSONObjBuilder* arrayBuilder = &builder;\n    unique_ptr<BSONObjBuilder> subObjBuilder;\n    if (subObject) {\n        subObjBuilder.reset(new BSONObjBuilder(builder.subarrayStart(fieldName)));\n        arrayBuilder = subObjBuilder.get();\n    }\n\n    if (!peekToken(RBRACKET)) {\n        do {\n            Status ret = value(builder.numStr(index), *arrayBuilder);\n            if (ret != Status::OK()) {\n                return ret;\n            }\n            index++;\n        } while (readToken(COMMA));\n    }\n    arrayBuilder->done();\n    if (!readToken(RBRACKET)) {\n        return parseError(\"Expecting ']' or ','\");\n    }\n    return Status::OK();\n}\n\n/* NOTE: this could be easily modified to allow \"new\" before other\n * constructors, but for now it only allows \"new\" before Date().\n * Also note that unlike the interactive shell \"Date(x)\" and \"new Date(x)\"\n * have the same behavior.  XXX: this may not be desired. */\nStatus JParse::constructor(StringData fieldName, BSONObjBuilder& builder) {\n    if (readToken(\"Date\")) {\n// Robo 1.4: Disabling warning \"-Wunused-result\", this file comes from mongo code\n#if defined(__clang__) \n#pragma clang diagnostic push    \n#pragma clang diagnostic ignored \"-Wunused-result\"\n#elif defined(__GNUG__)  // gcc\n#pragma GCC diagnostic push    \n#pragma GCC diagnostic ignored \"-Wunused-result\"\n#endif         \n        date(fieldName, builder);\n#if defined(__clang__) \n#pragma clang diagnostic pop\n#elif defined(__GNUG__)  // gcc\n#pragma GCC diagnostic pop\n#endif         \n    } else {\n        return parseError(\"\\\"new\\\" keyword not followed by Date constructor\");\n    }\n    return Status::OK();\n}\n\nStatus JParse::date(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(LPAREN)) {\n        return parseError(\"Expecting '('\");\n    }\n    errno = 0;\n    char* endptr;\n    // SERVER-11920: We should use parseNumberFromString here, but that function requires that\n    // we know ahead of time where the number ends, which is not currently the case.\n    Date_t date = Date_t::fromMillisSinceEpoch(strtoll(_input, &endptr, 10));\n    if (_input == endptr) {\n        return parseError(\"Date expecting integer milliseconds\");\n    }\n    if (errno == ERANGE) {\n        /* Need to handle this because jsonString outputs the value of Date_t as unsigned.\n        * See SERVER-8330 and SERVER-8573 */\n        errno = 0;\n        // SERVER-11920: We should use parseNumberFromString here, but that function requires\n        // that we know ahead of time where the number ends, which is not currently the case.\n        date = Date_t::fromMillisSinceEpoch(static_cast<long long>(strtoull(_input, &endptr, 10)));\n        if (errno == ERANGE) {\n            return parseError(\"Date milliseconds overflow\");\n        }\n    }\n    _input = endptr;\n    if (!readToken(RPAREN)) {\n        return parseError(\"Expecting ')'\");\n    }\n    builder.appendDate(fieldName, date);\n    return Status::OK();\n}\n\n//#ifdef ROBOMONGO\n    Status JParse::isodate(const StringData fieldName, BSONObjBuilder& builder) {\n        if (!readToken(LPAREN)) {\n            return parseError(\"Expecting '('\");\n        }\n\n        std::string datestr;\n        Status ret = quotedString(&datestr);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n\n        // We cannot use built-in parser, because it doesn't support\n        // local times as of MongoDB 3.2\n        // StatusWith<Date_t> datet = dateFromISOString(datestr);\n        // if (!datet.isOK()) {\n        //    return parseError(\"Invalid date format\");\n        // }\n\n        bool isSuccessfull = false;\n        boost::posix_time::ptime isotime = miutil::ptimeFromIsoString(datestr, isSuccessfull);\n        if (!isSuccessfull) {\n            return parseError(\"Invalid date format\");\n        }\n\n        boost::posix_time::ptime epoch(boost::gregorian::date(1970, 1, 1));\n        boost::posix_time::time_duration diff = isotime - epoch;\n        int64_t millis = diff.total_milliseconds();\n        Date_t datet = Date_t::fromMillisSinceEpoch(millis);\n\n        if (!readToken(RPAREN)) {\n            return parseError(\"Expecting ')'\");\n        }\n        builder.appendDate(fieldName, datet);\n        return Status::OK();\n    }\n\n    Status JParse::uuid(const StringData fieldName, BSONObjBuilder &builder)\n    {\n        return parseUuid(fieldName, builder, newUUID, ::Robomongo::DefaultEncoding);\n    }\n\n    Status JParse::luuid(const StringData fieldName, BSONObjBuilder &builder)\n    {\n        return parseUuid(fieldName, builder, bdtUUID, ::Robomongo::DefaultEncoding);\n    }\n\n    Status JParse::juuid(const StringData fieldName, BSONObjBuilder &builder)\n    {\n        return parseUuid(fieldName, builder, bdtUUID, ::Robomongo::JavaLegacy);\n    }\n\n    Status JParse::nuuid(const StringData fieldName, BSONObjBuilder &builder)\n    {\n        return parseUuid(fieldName, builder, bdtUUID, ::Robomongo::CSharpLegacy);\n    }\n\n    Status JParse::pyuuid(const StringData fieldName, BSONObjBuilder &builder)\n    {\n        return parseUuid(fieldName, builder, bdtUUID, ::Robomongo::PythonLegacy);\n    }\n\n    Status JParse::parseUuid(const StringData fieldName, BSONObjBuilder &builder, BinDataType binType, ::Robomongo::UUIDEncoding uuidEncoding)\n    {\n        if (!readToken(LPAREN)) {\n            return parseError(\"Expecting '('\");\n        }\n\n        std::string datastr;\n        Status ret = quotedString(&datastr);\n        if (ret != Status::OK()) {\n            return ret;\n        }\n\n        std::string hex = ::Robomongo::HexUtils::uuidToHex(datastr, uuidEncoding);\n\n        if (hex.empty() || !::Robomongo::HexUtils::isHexString(hex)) {\n            return parseError(\"Invalid hex string for UUID\");\n        }\n\n        int len;\n        boost::scoped_array<const char> data(::Robomongo::HexUtils::fromHex(hex, &len));\n        if (data == NULL)\n            return parseError(\"Invalid UUID\");\n\n        if (!readToken(RPAREN))\n            return parseError(\"Expecting ')'\");\n\n        builder.appendBinData(fieldName, len,\n                binType,\n                data.get());\n\n        return Status::OK();\n    }\n// #endif\n\nStatus JParse::timestamp(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(LPAREN)) {\n        return parseError(\"Expecting '('\");\n    }\n    if (readToken(\"-\")) {\n        return parseError(\"Negative seconds in \\\"$timestamp\\\"\");\n    }\n    errno = 0;\n    char* endptr;\n    // SERVER-11920: We should use parseNumberFromString here, but that function requires that\n    // we know ahead of time where the number ends, which is not currently the case.\n    uint32_t seconds = strtoul(_input, &endptr, 10);\n    if (errno == ERANGE) {\n        return parseError(\"Timestamp seconds overflow\");\n    }\n    if (_input == endptr) {\n        return parseError(\"Expecting unsigned integer seconds in \\\"$timestamp\\\"\");\n    }\n    _input = endptr;\n    if (!readToken(COMMA)) {\n        return parseError(\"Expecting ','\");\n    }\n    if (readToken(\"-\")) {\n        return parseError(\"Negative seconds in \\\"$timestamp\\\"\");\n    }\n    errno = 0;\n    // SERVER-11920: We should use parseNumberFromString here, but that function requires that\n    // we know ahead of time where the number ends, which is not currently the case.\n    uint32_t count = strtoul(_input, &endptr, 10);\n    if (errno == ERANGE) {\n        return parseError(\"Timestamp increment overflow\");\n    }\n    if (_input == endptr) {\n        return parseError(\"Expecting unsigned integer increment in \\\"$timestamp\\\"\");\n    }\n    _input = endptr;\n    if (!readToken(RPAREN)) {\n        return parseError(\"Expecting ')'\");\n    }\n    builder.append(fieldName, Timestamp(seconds, count));\n    return Status::OK();\n}\n\nStatus JParse::objectId(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(LPAREN)) {\n        return parseError(\"Expecting '('\");\n    }\n    std::string id;\n    id.reserve(ID_RESERVE_SIZE);\n    Status ret = quotedString(&id);\n    if (ret != Status::OK()) {\n        return ret;\n    }\n    if (!readToken(RPAREN)) {\n        return parseError(\"Expecting ')'\");\n    }\n    if (id.size() != 24) {\n        return parseError(\"Expecting 24 hex digits: \" + id);\n    }\n    if (!isHexString(id)) {\n        return parseError(\"Expecting hex digits: \" + id);\n    }\n    builder.append(fieldName, OID(id));\n    return Status::OK();\n}\n\nStatus JParse::numberLong(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(LPAREN)) {\n        return parseError(\"Expecting '('\");\n    }\n    errno = 0;\n    char* endptr;\n    // SERVER-11920: We should use parseNumberFromString here, but that function requires that\n    // we know ahead of time where the number ends, which is not currently the case.\n    int64_t val = strtoll(_input, &endptr, 10);\n    if (errno == ERANGE) {\n        return parseError(\"NumberLong out of range\");\n    }\n    if (_input == endptr) {\n        return parseError(\"Expecting number in NumberLong\");\n    }\n    _input = endptr;\n    if (!readToken(RPAREN)) {\n        return parseError(\"Expecting ')'\");\n    }\n    builder.append(fieldName, static_cast<long long int>(val));\n    return Status::OK();\n}\n\nStatus JParse::numberDecimal(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(LPAREN)) \n        return parseError(\"Expecting '('\");\n    \n    std::string decString;\n    decString.reserve(NUMBERDECIMAL_RESERVE_SIZE);\n    Status ret = quotedString(&decString);\n    if (ret != Status::OK()) \n        return ret;\n    \n    Decimal128 val(decString);\n\n    if (!readToken(RPAREN)) \n        return parseError(\"Expecting ')'\");\n    \n    builder.appendNumber(fieldName, val);\n    return Status::OK();\n}\n\nStatus JParse::numberInt(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(LPAREN)) {\n        return parseError(\"Expecting '('\");\n    }\n    errno = 0;\n    char* endptr;\n    // SERVER-11920: We should use parseNumberFromString here, but that function requires that\n    // we know ahead of time where the number ends, which is not currently the case.\n    int32_t val = strtol(_input, &endptr, 10);\n    if (errno == ERANGE) {\n        return parseError(\"NumberInt out of range\");\n    }\n    if (_input == endptr) {\n        return parseError(\"Expecting unsigned number in NumberInt\");\n    }\n    _input = endptr;\n    if (!readToken(RPAREN)) {\n        return parseError(\"Expecting ')'\");\n    }\n    builder.appendNumber(fieldName, static_cast<int>(val));\n    return Status::OK();\n}\n\nStatus JParse::dbRef(StringData fieldName, BSONObjBuilder& builder) {\n    BSONObjBuilder subBuilder(builder.subobjStart(fieldName));\n\n    if (!readToken(LPAREN)) {\n        return parseError(\"Expecting '('\");\n    }\n    std::string ns;\n    ns.reserve(NS_RESERVE_SIZE);\n    Status refRet = quotedString(&ns);\n    if (refRet != Status::OK()) {\n        return refRet;\n    }\n    subBuilder.append(\"$ref\", ns);\n\n    if (!readToken(COMMA)) {\n        return parseError(\"Expecting ','\");\n    }\n\n    Status valueRet = value(\"$id\", subBuilder);\n    if (valueRet != Status::OK()) {\n        return valueRet;\n    }\n\n    if (readToken(COMMA)) {\n        std::string db;\n        db.reserve(DB_RESERVE_SIZE);\n        Status dbRet = quotedString(&db);\n        if (dbRet != Status::OK()) {\n            return dbRet;\n        }\n        subBuilder.append(\"$db\", db);\n    }\n\n    if (!readToken(RPAREN)) {\n        return parseError(\"Expecting ')'\");\n    }\n\n    subBuilder.done();\n    return Status::OK();\n}\n\nStatus JParse::regex(StringData fieldName, BSONObjBuilder& builder) {\n    if (!readToken(FORWARDSLASH)) {\n        return parseError(\"Expecting '/'\");\n    }\n    std::string pat;\n    pat.reserve(PAT_RESERVE_SIZE);\n    Status patRet = regexPat(&pat);\n    if (patRet != Status::OK()) {\n        return patRet;\n    }\n    if (!readToken(FORWARDSLASH)) {\n        return parseError(\"Expecting '/'\");\n    }\n    std::string opt;\n    opt.reserve(OPT_RESERVE_SIZE);\n    Status optRet = regexOpt(&opt);\n    if (optRet != Status::OK()) {\n        return optRet;\n    }\n    Status optCheckRet = regexOptCheck(opt);\n    if (optCheckRet != Status::OK()) {\n        return optCheckRet;\n    }\n    builder.appendRegex(fieldName, pat, opt);\n    return Status::OK();\n}\n\nStatus JParse::regexPat(std::string* result) {\n    MONGO_JSON_DEBUG(\"\");\n    return chars(result, \"/\");\n}\n\nStatus JParse::regexOpt(std::string* result) {\n    MONGO_JSON_DEBUG(\"\");\n    return chars(result, \"\", JOPTIONS);\n}\n\nStatus JParse::regexOptCheck(StringData opt) {\n    MONGO_JSON_DEBUG(\"opt: \" << opt);\n    std::size_t i;\n    for (i = 0; i < opt.size(); i++) {\n        if (!match(opt[i], JOPTIONS)) {\n            return parseError(string(\"Bad regex option: \") + opt[i]);\n        }\n    }\n    return Status::OK();\n}\n\nStatus JParse::number(StringData fieldName, BSONObjBuilder& builder) {\n    char* endptrll;\n    char* endptrd;\n    long long retll;\n    double retd;\n\n    // reset errno to make sure that we are getting it from strtod\n    errno = 0;\n    // SERVER-11920: We should use parseNumberFromString here, but that function requires that\n    // we know ahead of time where the number ends, which is not currently the case.\n    retd = strtod(_input, &endptrd);\n    // if pointer does not move, we found no digits\n    if (_input == endptrd) {\n        return parseError(\"Bad characters in value\");\n    }\n    if (errno == ERANGE) {\n        return parseError(\"Value cannot fit in double\");\n    }\n    // reset errno to make sure that we are getting it from strtoll\n    errno = 0;\n    // SERVER-11920: We should use parseNumberFromString here, but that function requires that\n    // we know ahead of time where the number ends, which is not currently the case.\n    retll = strtoll(_input, &endptrll, 10);\n    if (endptrll < endptrd || errno == ERANGE) {\n        // The number either had characters only meaningful for a double or\n        // could not fit in a 64 bit int\n        MONGO_JSON_DEBUG(\"Type: double\");\n        builder.append(fieldName, retd);\n    } else if (retll == static_cast<int>(retll)) {\n        // The number can fit in a 32 bit int\n        MONGO_JSON_DEBUG(\"Type: 32 bit int\");\n        builder.append(fieldName, static_cast<int>(retll));\n    } else {\n        // The number can fit in a 64 bit int\n        MONGO_JSON_DEBUG(\"Type: 64 bit int\");\n        builder.append(fieldName, retll);\n    }\n    _input = endptrd;\n    if (_input >= _input_end) {\n        return parseError(\"Trailing number at end of input\");\n    }\n    return Status::OK();\n}\n\nStatus JParse::field(std::string* result) {\n    MONGO_JSON_DEBUG(\"\");\n    if (peekToken(DOUBLEQUOTE) || peekToken(SINGLEQUOTE)) {\n        // Quoted key\n        // TODO: make sure quoted field names cannot contain null characters\n        return quotedString(result);\n    } else {\n        // Unquoted key\n        // 'isspace()' takes an 'int' (signed), so (default signed) 'char's get sign-extended\n        // and therefore 'corrupted' unless we force them to be unsigned ... 0x80 becomes\n        // 0xffffff80 as seen by isspace when sign-extended ... we want it to be 0x00000080\n        while (_input < _input_end && isspace(*reinterpret_cast<const unsigned char*>(_input))) {\n            ++_input;\n        }\n        if (_input >= _input_end) {\n            return parseError(\"Field name expected\");\n        }\n        if (!match(*_input, ALPHA \"_$\")) {\n            return parseError(\"First character in field must be [A-Za-z$_]\");\n        }\n        return chars(result, \"\", ALPHA DIGIT \"_$\");\n    }\n}\n\nStatus JParse::quotedString(std::string* result) {\n    MONGO_JSON_DEBUG(\"\");\n    if (readToken(DOUBLEQUOTE)) {\n        Status ret = chars(result, \"\\\"\");\n        if (ret != Status::OK()) {\n            return ret;\n        }\n        if (!readToken(DOUBLEQUOTE)) {\n            return parseError(\"Expecting '\\\"'\");\n        }\n    } else if (readToken(SINGLEQUOTE)) {\n        Status ret = chars(result, \"'\");\n        if (ret != Status::OK()) {\n            return ret;\n        }\n        if (!readToken(SINGLEQUOTE)) {\n            return parseError(\"Expecting '''\");\n        }\n    } else {\n        return parseError(\"Expecting quoted string\");\n    }\n    return Status::OK();\n}\n\n/*\n * terminalSet are characters that signal end of string (e.g.) [ :\\0]\n * allowedSet are the characters that are allowed, if this is set\n */\nStatus JParse::chars(std::string* result, const char* terminalSet, const char* allowedSet) {\n    MONGO_JSON_DEBUG(\"terminalSet: \" << terminalSet);\n    if (_input >= _input_end) {\n        return parseError(\"Unexpected end of input\");\n    }\n    const char* q = _input;\n    while (q < _input_end && !match(*q, terminalSet)) {\n        MONGO_JSON_DEBUG(\"q: \" << q);\n        if (allowedSet != NULL) {\n            if (!match(*q, allowedSet)) {\n                _input = q;\n                return Status::OK();\n            }\n        }\n        if (0x00 <= *q && *q <= 0x1F) {\n            return parseError(\"Invalid control character\");\n        }\n        if (*q == '\\\\' && q + 1 < _input_end) {\n            switch (*(++q)) {\n                // Escape characters allowed by the JSON spec\n                case '\"':\n                    result->push_back('\"');\n                    break;\n                case '\\'':\n                    result->push_back('\\'');\n                    break;\n                case '\\\\':\n                    result->push_back('\\\\');\n                    break;\n                case '/':\n                    result->push_back('/');\n                    break;\n                case 'b':\n                    result->push_back('\\b');\n                    break;\n                case 'f':\n                    result->push_back('\\f');\n                    break;\n                case 'n':\n                    result->push_back('\\n');\n                    break;\n                case 'r':\n                    result->push_back('\\r');\n                    break;\n                case 't':\n                    result->push_back('\\t');\n                    break;\n                case 'u': {  // expect 4 hexdigits\n                    // TODO: handle UTF-16 surrogate characters\n                    ++q;\n                    if (q + 4 >= _input_end) {\n                        return parseError(\"Expecting 4 hex digits\");\n                    }\n                    if (!isHexString(StringData(q, 4))) {\n                        return parseError(\"Expecting 4 hex digits\");\n                    }\n                    unsigned char first = fromHex(q).getValue();\n                    unsigned char second = fromHex(q += 2).getValue();\n                    const std::string& utf8str = encodeUTF8(first, second);\n                    for (unsigned int i = 0; i < utf8str.size(); i++) {\n                        result->push_back(utf8str[i]);\n                    }\n                    ++q;\n                    break;\n                }\n                // Vertical tab character.  Not in JSON spec but allowed in\n                // our implementation according to test suite.\n                case 'v':\n                    result->push_back('\\v');\n                    break;\n                // Escape characters we explicity disallow\n                case 'x':\n                    return parseError(\"Hex escape not supported\");\n                case '0':\n                case '1':\n                case '2':\n                case '3':\n                case '4':\n                case '5':\n                case '6':\n                case '7':\n                    return parseError(\"Octal escape not supported\");\n                // By default pass on the unescaped character\n                default:\n                    result->push_back(*q);\n                    break;\n                    // TODO: check for escaped control characters\n            }\n            ++q;\n        } else {\n            result->push_back(*q++);\n        }\n    }\n    if (q < _input_end) {\n        _input = q;\n        return Status::OK();\n    }\n    return parseError(\"Unexpected end of input\");\n}\n\nstd::string JParse::encodeUTF8(unsigned char first, unsigned char second) const {\n    std::ostringstream oss;\n    if (first == 0 && second < 0x80) {\n        oss << second;\n    } else if (first < 0x08) {\n        oss << char(0xc0 | (first << 2 | second >> 6));\n        oss << char(0x80 | (~0xc0 & second));\n    } else {\n        oss << char(0xe0 | (first >> 4));\n        oss << char(0x80 | (~0xc0 & (first << 2 | second >> 6)));\n        oss << char(0x80 | (~0xc0 & second));\n    }\n    return oss.str();\n}\n\ninline bool JParse::peekToken(const char* token) {\n    return readTokenImpl(token, false);\n}\n\ninline bool JParse::readToken(const char* token) {\n    return readTokenImpl(token, true);\n}\n\nbool JParse::readTokenImpl(const char* token, bool advance) {\n    MONGO_JSON_DEBUG(\"token: \" << token);\n    const char* check = _input;\n    if (token == NULL) {\n        return false;\n    }\n    // 'isspace()' takes an 'int' (signed), so (default signed) 'char's get sign-extended\n    // and therefore 'corrupted' unless we force them to be unsigned ... 0x80 becomes\n    // 0xffffff80 as seen by isspace when sign-extended ... we want it to be 0x00000080\n    while (check < _input_end && isspace(*reinterpret_cast<const unsigned char*>(check))) {\n        ++check;\n    }\n    while (*token != '\\0') {\n        if (check >= _input_end) {\n            return false;\n        }\n        if (*token++ != *check++) {\n            return false;\n        }\n    }\n    if (advance) {\n        _input = check;\n    }\n    return true;\n}\n\nbool JParse::readField(StringData expectedField) {\n    MONGO_JSON_DEBUG(\"expectedField: \" << expectedField);\n    std::string nextField;\n    nextField.reserve(FIELD_RESERVE_SIZE);\n    Status ret = field(&nextField);\n    if (ret != Status::OK()) {\n        return false;\n    }\n    if (expectedField != nextField) {\n        return false;\n    }\n    return true;\n}\n\ninline bool JParse::match(char matchChar, const char* matchSet) const {\n    if (matchSet == NULL) {\n        return true;\n    }\n    if (*matchSet == '\\0') {\n        return false;\n    }\n    return (strchr(matchSet, matchChar) != NULL);\n}\n\nbool JParse::isHexString(StringData str) const {\n    MONGO_JSON_DEBUG(\"str: \" << str);\n    std::size_t i;\n    for (i = 0; i < str.size(); i++) {\n        if (!isxdigit(str[i])) {\n            return false;\n        }\n    }\n    return true;\n}\n\nbool JParse::isBase64String(StringData str) const {\n    MONGO_JSON_DEBUG(\"str: \" << str);\n    return base64::validate(str);\n}\n\nbool JParse::isArray() {\n    return peekToken(LBRACKET);\n}\n\nBSONObj fromjson(const char* jsonString, int* len) {\n    MONGO_JSON_DEBUG(\"jsonString: \" << jsonString);\n    if (jsonString[0] == '\\0') {\n        if (len)\n            *len = 0;\n        return BSONObj();\n    }\n    JParse jparse(jsonString);\n    BSONObjBuilder builder;\n    Status ret = Status::OK();\n    try {\n        ret = jparse.parse(builder);\n    } catch (std::exception& e) {\n        std::ostringstream message;\n        message << \"caught exception from within JSON parser: \" << e.what();\n\n//        throw MsgAssertionException(17031, message.str());\n        throw ParseMsgAssertionException(17031, message.str(), jparse.offset(), ret.reason());\n    }\n\n    if (ret != Status::OK()) {\n        ostringstream message;\n        message << \"code \" << ret.code() << \": \" << ret.codeString() << \": \" << ret.reason();\n\n        //throw MsgAssertionException(16619, message.str());\n        throw ParseMsgAssertionException(16619, message.str(), jparse.offset(), ret.reason());\n    }\n    if (len)\n        *len = jparse.offset();\n    return builder.obj();\n}\n\nBSONObj fromjson(const std::string& str) {\n    return fromjson(str.c_str());\n}\n\nstd::string tojson(const BSONObj& obj, JsonStringFormat format, bool pretty) {\n    return obj.jsonString(format, pretty);\n}\n\nstd::string tojson(const BSONArray& arr, JsonStringFormat format, bool pretty) {\n    return arr.jsonString(format, pretty, true);\n}\n\nbool isArray(StringData str) {\n    JParse parser(str);\n    return parser.isArray();\n}\n\n} /* namespace Robomongo */\n} /* namespace mongo */\n"
  },
  {
    "path": "src/robomongo/shell/bson/json.h",
    "content": "/**\n*    Copyright (C) 2008 10gen Inc.\n*\n*    This program is free software: you can redistribute it and/or  modify\n*    it under the terms of the GNU Affero General Public License, version 3,\n*    as published by the Free Software Foundation.\n*\n*    This program is distributed in the hope that it will be useful,\n*    but WITHOUT ANY WARRANTY; without even the implied warranty of\n*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n*    GNU Affero General Public License for more details.\n*\n*    You should have received a copy of the GNU Affero General Public License\n*    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*\n*    As a special exception, the copyright holders give permission to link the\n*    code of portions of this program with the OpenSSL library under certain\n*    conditions as described in each individual source file and distribute\n*    linked combinations including the program with the OpenSSL library. You\n*    must comply with the GNU Affero General Public License in all respects for\n*    all of the code used other than as permitted herein. If you modify file(s)\n*    with this exception, you may extend this exception to your version of the\n*    file(s), but you are not obligated to do so. If you do not wish to do so,\n*    delete this exception statement from your version. If you delete this\n*    exception statement from all source files in the program, then also delete\n*    it in the license file.\n*/\n\n#pragma once\n\n#include <string>\n\n#include \"mongo/bson/bsonobj.h\"\n#include \"mongo/base/status.h\"\n#include \"robomongo/core/Enums.h\"\n\nnamespace mongo {\nnamespace Robomongo {\n\n/**\n * Create a BSONObj from a JSON <http://www.json.org>,\n * <http://www.ietf.org/rfc/rfc4627.txt> string.  In addition to the JSON\n * extensions extensions described here\n * <http://dochub.mongodb.org/core/mongodbextendedjson>, this function\n * accepts unquoted field names and allows single quotes to optionally be\n * used when specifying field names and std::string values instead of double\n * quotes.  JSON unicode escape sequences (of the form \\uXXXX) are\n * converted to utf8.\n *\n * @throws MsgAssertionException if parsing fails.  The message included with\n * this assertion includes the character offset where parsing failed.\n */\nBSONObj fromjson(const std::string& str);\n\n/** @param len will be size of JSON object in text chars. */\nBSONObj fromjson(const char* str, int* len = NULL);\n\n/**\n * Tests whether the JSON string is an Array.\n *\n * Useful for assigning the result of fromjson to the right object type. Either:\n *  BSONObj\n *  BSONArray\n *\n * @example Using the method to select the proper type.\n *  If this method returns true, the user could store the result of fromjson\n *  inside a BSONArray, rather than a BSONObj, in order to have it print as an\n *  array when passed to tojson.\n *\n * @param obj The JSON string to test.\n */\nbool isArray(StringData str);\n\n/**\n * Convert a BSONArray to a JSON string.\n *\n * @param arr The BSON Array.\n * @param format The JSON format (JS, TenGen, Strict).\n * @param pretty Enables pretty output.\n */\nstd::string tojson(const BSONArray& arr, JsonStringFormat format = Strict, bool pretty = false);\n\n/**\n * Convert a BSONObj to a JSON string.\n *\n * @param obj The BSON Object.\n * @param format The JSON format (JS, TenGen, Strict).\n * @param pretty Enables pretty output.\n */\nstd::string tojson(const BSONObj& obj, JsonStringFormat format = Strict, bool pretty = false);\n\n/**\n * Parser class.  A BSONObj is constructed incrementally by passing a\n * BSONObjBuilder to the recursive parsing methods.  The grammar for the\n * element parsed is described before each function.\n */\nclass JParse {\npublic:\n    explicit JParse(StringData str);\n\n    /*\n     * Notation: All-uppercase symbols denote non-terminals; all other\n     * symbols are literals.\n     */\n\n    /*\n     * VALUE :\n     *     STRING\n     *   | NUMBER\n     *   | NUMBERINT\n     *   | NUMBERLONG\n     *   | NUMBERDECIMAL\n     *   | OBJECT\n     *   | ARRAY\n     *\n     *   | true\n     *   | false\n     *   | null\n     *   | undefined\n     *\n     *   | NaN\n     *   | Infinity\n     *   | -Infinity\n     *\n     *   | DATE\n     *   | TIMESTAMP\n     *   | REGEX\n     *   | OBJECTID\n     *   | DBREF\n     *\n     *   | new CONSTRUCTOR\n     */\nprivate:\n    Status value(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     * OBJECT :\n     *     {}\n     *   | { MEMBERS }\n     *   | SPECIALOBJECT\n     *\n     * MEMBERS :\n     *     PAIR\n     *   | PAIR , MEMBERS\n     *\n     * PAIR :\n     *     FIELD : VALUE\n     *\n     * SPECIALOBJECT :\n     *     OIDOBJECT\n     *   | BINARYOBJECT\n     *   | DATEOBJECT\n     *   | TIMESTAMPOBJECT\n     *   | REGEXOBJECT\n     *   | REFOBJECT\n     *   | UNDEFINEDOBJECT\n     *   | NUMBERLONGOBJECT\n     *   | NUMBERDECIMALOBJECT\n     *   | MINKEYOBJECT\n     *   | MAXKEYOBJECT\n     *\n     */\npublic:\n    Status object(StringData fieldName, BSONObjBuilder&, bool subObj = true);\n    Status parse(BSONObjBuilder& builder);\n    bool isArray();\n\nprivate:\n    /* The following functions are called with the '{' and the first\n     * field already parsed since they are both implied given the\n     * context. */\n    /*\n     * OIDOBJECT :\n     *     { FIELD(\"$oid\") : <24 character hex std::string> }\n     */\n    Status objectIdObject(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     * BINARYOBJECT :\n     *     { FIELD(\"$binary\") : <base64 representation of a binary std::string>,\n     *          FIELD(\"$type\") : <hexadecimal representation of a single byte\n     *              indicating the data type> }\n     */\n    Status binaryObject(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     * DATEOBJECT :\n     *     { FIELD(\"$date\") : <64 bit signed integer for milliseconds since epoch> }\n     */\n    Status dateObject(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     * TIMESTAMPOBJECT :\n     *     { FIELD(\"$timestamp\") : {\n     *         FIELD(\"t\") : <32 bit unsigned integer for seconds since epoch>,\n     *         FIELD(\"i\") : <32 bit unsigned integer for the increment> } }\n     */\n    Status timestampObject(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     *     NOTE: the rules for the body of the regex are different here,\n     *     since it is quoted instead of surrounded by slashes.\n     * REGEXOBJECT :\n     *     { FIELD(\"$regex\") : <string representing body of regex> }\n     *   | { FIELD(\"$regex\") : <string representing body of regex>,\n     *          FIELD(\"$options\") : <string representing regex options> }\n     */\n    Status regexObject(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     * REFOBJECT :\n     *     { FIELD(\"$ref\") : <string representing collection name>,\n     *          FIELD(\"$id\") : <24 character hex std::string> }\n     *   | { FIELD(\"$ref\") : std::string , FIELD(\"$id\") : OBJECTID }\n     *   | { FIELD(\"$ref\") : std::string , FIELD(\"$id\") : OIDOBJECT }\n     */\n    Status dbRefObject(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     * UNDEFINEDOBJECT :\n     *     { FIELD(\"$undefined\") : true }\n     */\n    Status undefinedObject(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     * NUMBERLONGOBJECT :\n     *     { FIELD(\"$numberLong\") : \"<number>\" }\n     */\n    Status numberLongObject(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     * NUMBERDECIMALOBJECT :\n     *     { FIELD(\"$numberDecimal\") : \"<number>\" }\n     */\n    Status numberDecimalObject(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     * MINKEYOBJECT :\n     *     { FIELD(\"$minKey\") : 1 }\n     */\n    Status minKeyObject(StringData fieldName, BSONObjBuilder& builder);\n\n    /*\n     * MAXKEYOBJECT :\n     *     { FIELD(\"$maxKey\") : 1 }\n     */\n    Status maxKeyObject(StringData fieldName, BSONObjBuilder& builder);\n\n    /*\n     * ARRAY :\n     *     []\n     *   | [ ELEMENTS ]\n     *\n     * ELEMENTS :\n     *     VALUE\n     *   | VALUE , ELEMENTS\n     */\n    Status array(StringData fieldName, BSONObjBuilder&, bool subObj = true);\n\n    /*\n     * NOTE: Currently only Date can be preceded by the \"new\" keyword\n     * CONSTRUCTOR :\n     *     DATE\n     */\n    Status constructor(StringData fieldName, BSONObjBuilder&);\n\n    /* The following functions only parse the body of the constructor\n     * between the parentheses, not including the constructor name */\n    /*\n     * DATE :\n     *     Date( <64 bit signed integer for milliseconds since epoch> )\n     */\n    Status date(StringData fieldName, BSONObjBuilder&);\n\n// #ifdef ROBOMONGO\n    /* The following functions only parse the body of the ISODate function\n     * between the parentheses, not including the function name */\n    /*\n     * ISODATE :\n     *     ISODate( <date time string in ISO 8601 format> )\n     */\n    Status isodate(const StringData fieldName, BSONObjBuilder&);\n\n\n    /* UUIDs in different formats:\n     *     UUID(), LUUID(), JUUID(), NUUID(), PYUUID()\n     */\n    Status uuid(const StringData fieldName, BSONObjBuilder&);\n    Status luuid(const StringData fieldName, BSONObjBuilder&);\n    Status juuid(const StringData fieldName, BSONObjBuilder&);\n    Status nuuid(const StringData fieldName, BSONObjBuilder&);\n    Status pyuuid(const StringData fieldName, BSONObjBuilder&);\n\n    Status parseUuid(const StringData fieldName, BSONObjBuilder&, BinDataType binType, ::Robomongo::UUIDEncoding uuidEncoding);\n// #endif\n\n\n    /*\n     * TIMESTAMP :\n     *     Timestamp( <32 bit unsigned integer for seconds since epoch>,\n     *          <32 bit unsigned integer for the increment> )\n     */\n    Status timestamp(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     * OBJECTID :\n     *     ObjectId( <24 character hex std::string> )\n     */\n    Status objectId(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     * NUMBERLONG :\n     *     NumberLong( <number> )\n     */\n    Status numberLong(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     * NUMBERDECIMAL :\n     *     NumberDecimal( <number> )\n     */\n    Status numberDecimal(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     * NUMBERINT :\n     *     NumberInt( <number> )\n     */\n    Status numberInt(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     * DBREF :\n     *     Dbref( <namespace std::string> , <24 character hex std::string> )\n     */\n    Status dbRef(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     * REGEX :\n     *     / REGEXCHARS / REGEXOPTIONS\n     *\n     * REGEXCHARS :\n     *     REGEXCHAR\n     *   | REGEXCHAR REGEXCHARS\n     *\n     * REGEXCHAR :\n     *     any-Unicode-character-except-/-or-\\-or-CONTROLCHAR\n     *   | \\\"\n     *   | \\'\n     *   | \\\\\n     *   | \\/\n     *   | \\b\n     *   | \\f\n     *   | \\n\n     *   | \\r\n     *   | \\t\n     *   | \\v\n     *   | \\u HEXDIGIT HEXDIGIT HEXDIGIT HEXDIGIT\n     *   | \\any-Unicode-character-except-x-or-[0-7]\n     *\n     * REGEXOPTIONS :\n     *     REGEXOPTION\n     *   | REGEXOPTION REGEXOPTIONS\n     *\n     * REGEXOPTION :\n     *     g | i | m | s\n     */\n    Status regex(StringData fieldName, BSONObjBuilder&);\n    Status regexPat(std::string* result);\n    Status regexOpt(std::string* result);\n    Status regexOptCheck(StringData opt);\n\n    /*\n     * NUMBER :\n     *\n     * NOTE: Number parsing is based on standard library functions, not\n     * necessarily on the JSON numeric grammar.\n     *\n     * Number as value - strtoll and strtod\n     * Date - strtoll\n     * Timestamp - strtoul for both timestamp and increment and '-'\n     * before a number explicity disallowed\n     */\n    Status number(StringData fieldName, BSONObjBuilder&);\n\n    /*\n     * FIELD :\n     *     STRING\n     *   | [a-zA-Z$_] FIELDCHARS\n     *\n     * FIELDCHARS :\n     *     [a-zA-Z0-9$_]\n     *   | [a-zA-Z0-9$_] FIELDCHARS\n     */\n    Status field(std::string* result);\n\n    /*\n     * std::string :\n     *     \" \"\n     *   | ' '\n     *   | \" CHARS \"\n     *   | ' CHARS '\n     */\n    Status quotedString(std::string* result);\n\n    /*\n     * CHARS :\n     *     CHAR\n     *   | CHAR CHARS\n     *\n     * Note: \" or ' may be allowed depending on whether the std::string is\n     * double or single quoted\n     *\n     * CHAR :\n     *     any-Unicode-character-except-\"-or-'-or-\\-or-CONTROLCHAR\n     *   | \\\"\n     *   | \\'\n     *   | \\\\\n     *   | \\/\n     *   | \\b\n     *   | \\f\n     *   | \\n\n     *   | \\r\n     *   | \\t\n     *   | \\v\n     *   | \\u HEXDIGIT HEXDIGIT HEXDIGIT HEXDIGIT\n     *   | \\any-Unicode-character-except-x-or-[0-9]\n     *\n     * HEXDIGIT : [0..9a..fA..F]\n     *\n     * per http://www.ietf.org/rfc/rfc4627.txt, control characters are\n     * (U+0000 through U+001F).  U+007F is not mentioned as a control\n     * character.\n     * CONTROLCHAR : [0x00..0x1F]\n     *\n     * If there is not an error, result will contain a null terminated\n     * string, but there is no guarantee that it will not contain other\n     * null characters.\n     */\n    Status chars(std::string* result, const char* terminalSet, const char* allowedSet = NULL);\n\n    /**\n     * Converts the two byte Unicode code point to its UTF8 character\n     * encoding representation.  This function returns a std::string because\n     * UTF8 encodings for code points from 0x0000 to 0xFFFF can range\n     * from one to three characters.\n     */\n    std::string encodeUTF8(unsigned char first, unsigned char second) const;\n\n    /**\n     * @return true if the given token matches the next non whitespace\n     * sequence in our buffer, and false if the token doesn't match or\n     * we reach the end of our buffer.  Do not update the pointer to our\n     * buffer (same as calling readTokenImpl with advance=false).\n     */\n    inline bool peekToken(const char* token);\n\n    /**\n     * @return true if the given token matches the next non whitespace\n     * sequence in our buffer, and false if the token doesn't match or\n     * we reach the end of our buffer.  Updates the pointer to our\n     * buffer (same as calling readTokenImpl with advance=true).\n     */\n    inline bool readToken(const char* token);\n\n    /**\n     * @return true if the given token matches the next non whitespace\n     * sequence in our buffer, and false if the token doesn't match or\n     * we reach the end of our buffer.  Do not update the pointer to our\n     * buffer if advance is false.\n     */\n    bool readTokenImpl(const char* token, bool advance = true);\n\n    /**\n     * @return true if the next field in our stream matches field.\n     * Handles single quoted, double quoted, and unquoted field names\n     */\n    bool readField(StringData field);\n\n    /**\n     * @return true if matchChar is in matchSet\n     * @return true if matchSet is NULL and false if it is an empty string\n     */\n    bool match(char matchChar, const char* matchSet) const;\n\n    /**\n     * @return true if every character in the std::string is a hex digit\n     */\n    bool isHexString(StringData) const;\n\n    /**\n     * @return true if every character in the std::string is a valid base64\n     * character\n     */\n    bool isBase64String(StringData) const;\n\n    /**\n     * @return FailedToParse status with the given message and some\n     * additional context information\n     */\n    Status parseError(StringData msg);\n\npublic:\n    inline int offset() {\n        return (_input - _buf);\n    }\n\nprivate:\n    /*\n     * _buf - start of our input buffer\n     * _input - cursor we advance in our input buffer\n     * _input_end - sentinel for the end of our input buffer\n     *\n     * _buf is the null terminated buffer containing the JSON std::string we\n     * are parsing.  _input_end points to the null byte at the end of\n     * the buffer.  strtoll, strtol, and strtod will access the null\n     * byte at the end of the buffer because they are assuming a c-style\n     * string.\n     */\n    const char* const _buf;\n    const char* _input;\n    const char* const _input_end;\n};\n\n//#ifdef ROBOMONGO\n    class ParseMsgAssertionException : public std::exception {\n    public:\n        ParseMsgAssertionException(int c, const std::string& m, int offset, const std::string reason) :\n            _reason(reason),\n            _offset(offset) {}\n\n        virtual ~ParseMsgAssertionException() throw() { }\n        virtual bool severe() { return false; }\n\n        std::string reason() const { return _reason; }\n        int offset() const { return _offset; }\n\n    private:\n        std::string _reason;\n        int _offset;\n    };\n//#endif\n\n}  // namespace Robomongo\n}  // namespace mongo\n"
  },
  {
    "path": "src/robomongo/shell/db/ptimeutil.cpp",
    "content": "/*\n    wdb - weather and water data storage\n\n    Copyright (C) 2007 met.no\n\n    Contact information:\n    Norwegian Meteorological Institute\n    Box 43 Blindern\n    0313 OSLO\n    NORWAY\n    E-mail: wdb@met.no\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,\n    MA  02110-1301, USA\n*/\n#include \"ptimeutil.h\"\n#include <ctype.h>\n#include <iostream>\n#include <stdio.h>\n#include <string.h>\n//#include <trimstr.h>\n#include <sstream>\n\nnamespace\n{\n    int getInt( const std::string &timebuf, std::string::size_type &index, int numberOfChar, bool &isSuccessfull )\n    {\n        int nextN=0;\n        char buf[10]={0};\n        isSuccessfull = numberOfChar < 9;\n        assert(isSuccessfull);\t\t\n        while ( nextN < numberOfChar && isSuccessfull) {\n            isSuccessfull = index < timebuf.length() && isdigit( timebuf[index] );     \n            assert(isSuccessfull);\t\t\t\n            buf[nextN]=timebuf[index];\n            nextN++;\n            index++;\n        }\n        return atoi( buf );\n    }\n}\nnamespace miutil \n{\n    const long long minDate = -9218988800000; // \"1677-11-10T17:46:40.001Z\"\n    const long long maxDate = 9218988800000;  // \"2262-02-20T06:13:19.999Z\"\n\n    std::string rfc1123date( const boost::posix_time::ptime &pt )\n    {\n        const char *day = NULL;\n        const char *mon = NULL;\n\n        if( pt.is_special() )\n            return std::string();\n\n        boost::gregorian::date d( pt.date() );\n        boost::posix_time::time_duration t( pt.time_of_day() );\n\n        switch( d.day_of_week() ) {\n            using namespace boost::date_time;\n        case Sunday:    day=\"Sun\"; break;\n        case Monday:    day=\"Mon\"; break;\n        case Tuesday:   day=\"Tue\"; break;\n        case Wednesday: day=\"Wed\"; break;\n        case Thursday:  day=\"Thu\"; break;\n        case Friday:    day=\"Fri\"; break;\n        case Saturday:  day=\"Sat\"; break;\n        }\n\n        switch( d.month() ){\n            using namespace boost::date_time;\n        case Jan: mon=\"Jan\"; break;\n        case Feb: mon=\"Feb\"; break;\n        case Mar: mon=\"Mar\"; break;\n        case Apr: mon=\"Apr\"; break;\n        case May: mon=\"May\"; break;\n        case Jun: mon=\"Jun\"; break;\n        case Jul: mon=\"Jul\"; break;\n        case Aug: mon=\"Aug\"; break;\n        case Sep: mon=\"Sep\"; break;\n        case Oct: mon=\"Oct\"; break;\n        case Nov: mon=\"Nov\"; break;\n        case Dec: mon=\"Dec\"; break;\n        }\n\n        if( !day || !mon )\n            return std::string();\n\n        unsigned short year = d.year();\n        char buf[64] = {0};\n\n#if defined(__clang__) \n#pragma clang diagnostic push    \n#pragma clang diagnostic ignored \"-Wformat\"\n#elif defined(__GNUG__)  // gcc\n#pragma GCC diagnostic push    \n#pragma GCC diagnostic ignored \"-Wformat\"\n#endif         \n        sprintf( buf, \"%s, %02d %s %04d %02d:%02d:%02d GMT\", day, d.day().as_number(), mon, year, t.hours(), t.minutes(), t.seconds() );\n#if defined(__clang__) \n#pragma clang diagnostic pop\n#elif defined(__GNUG__)  // gcc\n#pragma GCC diagnostic pop\n#endif         \n\n        return buf;\n    }\n\n    boost::posix_time::ptime rfc1123date( const std::string &rfc1123 )\n    {\n        return rfc1123date( rfc1123.c_str() );\n    }\n\n    boost::posix_time::ptime rfc1123date( const char *rfc1123 )\n    {\n        char gmt[4];\n        char sday[4];\n        char smon[4];\n        int  day, mon, year, h, m, s;\n        int  weekDay;\n\n        if( !rfc1123 )\n            return boost::posix_time::ptime( boost::date_time::not_a_date_time );\n\n        if ( sscanf( rfc1123, \"%3s, %02d %3s %04d %02d:%02d:%02d %3s\", sday, &day, smon, &year,\n            &h, &m, &s, gmt) !=8 ) \n            return boost::posix_time::ptime( boost::date_time::not_a_date_time );\n\n        if( strcmp(gmt, \"GMT\")!=0 )\n            return boost::posix_time::ptime( boost::date_time::not_a_date_time );\n\n        if ( strcmp(smon, \"Jan\")==0 )\n            mon=1;\n        else if ( strcmp(smon, \"Feb\")==0 )\n            mon=2;\n        else if ( strcmp(smon, \"Mar\")==0 )\n            mon=3;\n        else if ( strcmp(smon, \"Apr\")==0 )\n            mon=4;\n        else if ( strcmp(smon, \"May\")==0 )\n            mon=5;\n        else if ( strcmp(smon, \"Jun\")==0 )\n            mon=6;\n        else if ( strcmp(smon, \"Jul\")==0 )\n            mon=7;\n        else if ( strcmp(smon, \"Aug\")==0 )\n            mon=8;\n        else if ( strcmp(smon, \"Sep\")==0 )\n            mon=9;\n        else if ( strcmp(smon, \"Oct\")==0 )\n            mon=10;\n        else if ( strcmp(smon, \"Nov\")==0 )\n            mon=11;\n        else if ( strcmp(smon, \"Dec\")==0 )\n            mon=12;\n        else\n            return boost::posix_time::ptime( boost::date_time::not_a_date_time );\n      \n        //The day chack is a consistent check that could be dropped.\n        if ( strcmp(sday, \"Sun\")==0 )\n            weekDay=0;\n        else if ( strcmp(sday, \"Mon\")==0 )\n            weekDay=1;\n        else if ( strcmp(sday, \"Tue\")==0 )\n            weekDay=2;\n        else if ( strcmp(sday, \"Wed\")==0 )\n            weekDay=3;\n        else if ( strcmp(sday, \"Thu\")==0 )\n            weekDay=4;\n        else if ( strcmp(sday, \"Fri\")==0 )\n            weekDay=5;\n        else if ( strcmp(sday, \"Sat\")==0 )\n            weekDay=6;\n        else\n            return boost::posix_time::ptime( boost::date_time::not_a_date_time );\n\n        if( day<0 || day>31 || h<0 || h>23 || m<0 || m>59 || s<0 || s>60 )\n            return boost::posix_time::ptime( boost::date_time::not_a_date_time );   \n\n        boost::posix_time::ptime date( boost::gregorian::date(year, mon, day) , \n            boost::posix_time::time_duration( h, m, s )  );\n   \n        //This is a consistent check. We could skip this test.\n        if( weekDay != date.date().day_of_week() )\n            return boost::posix_time::ptime( boost::date_time::not_a_date_time );\n\n        return date;\n    }\n\n    std::string isotimeString(const boost::posix_time::ptime &pt, bool useTseparator, bool isLocalFormat)\n    { \n        if( pt.is_special() )\n            return \"\";\n\n        char buf[64]={0};\n        char sep=' '; \n\n        if( useTseparator )\n            sep = 'T';\n\n        boost::gregorian::date d( pt.date() );\n        boost::posix_time::time_duration t( pt.time_of_day() );\n\n        if( !isLocalFormat ){\n#if defined(__clang__) \n#pragma clang diagnostic push    \n#pragma clang diagnostic ignored \"-Wformat\"\n#elif defined(__GNUG__)  // gcc\n#pragma GCC diagnostic push    \n#pragma GCC diagnostic ignored \"-Wformat\"\n#endif                    \n            sprintf( buf, \"%04d-%02d-%02d%c%02d:%02d:%02d.%03dZ\", \n                static_cast<int>(d.year()), d.month().as_number(), d.day().as_number(), sep,\n                t.hours(), t.minutes(), t.seconds(), (static_cast<int>(t.total_milliseconds()))%1000 );\n#if defined(__clang__) \n#pragma clang diagnostic pop\n#elif defined(__GNUG__)  // gcc\n#pragma GCC diagnostic pop\n#endif                         \n        }\n        else{\n            boost::posix_time::ptime timeP(d, t);\n            time_t rawtime;\n            time ( &rawtime );\n\n            struct tm *ptm = std::gmtime ( &rawtime );\n            int utcD = ptm->tm_mday;\n            int utcH = ptm->tm_hour;\n            int utcM = ptm->tm_min;\n\n            struct tm *timeinfo = std::localtime (&rawtime);\n            int diffH = timeinfo->tm_hour - utcH;\n            \n            // Time zone calculation\n            if (timeinfo->tm_mday < utcD && diffH > 0)\n                diffH -= 24;\n            else if (timeinfo->tm_mday > utcD && diffH < 0)\n                diffH += 24;\n\n            int diffM = timeinfo->tm_min - utcM;\n\n            boost::posix_time::time_duration diffT = boost::posix_time::time_duration(diffH, diffM, 0);\n            timeP += diffT;\n\n            d = timeP.date();\n            t = timeP.time_of_day();\n\n            char utc_buff[8]={0};\n\n#if defined(__clang__) \n#pragma clang diagnostic push    \n#pragma clang diagnostic ignored \"-Wformat\"\n#elif defined(__GNUG__)  // gcc\n#pragma GCC diagnostic push    \n#pragma GCC diagnostic ignored \"-Wformat\"\n#endif              \n            sprintf(utc_buff, (diffT.hours() >= 0) ? \"+%02d:%02d\" : \"%03d:%02d\", diffT.hours(), abs(diffM));\n            sprintf(buf, \"%04d-%02d-%02d%c%02d:%02d:%02d.%03d\",\n                static_cast<int>(d.year()), d.month().as_number(), d.day().as_number(), sep,\n                t.hours(), t.minutes(), t.seconds(), (static_cast<int>(t.total_milliseconds()))%1000);\n#if defined(__clang__) \n#pragma clang diagnostic pop\n#elif defined(__GNUG__)  // gcc\n#pragma GCC diagnostic pop\n#endif                         \n            strcat(buf, utc_buff);\n        }\n\n        return buf;   \n    }\n\n    boost::posix_time::ptime ptimeFromIsoString( const std::string &isoTime)\n    {\n        bool isSuccessfull=false;\n        return ptimeFromIsoString(isoTime, isSuccessfull);\n    }\n\n    boost::posix_time::ptime ptimeFromIsoString( const std::string &isoTime, bool &isSuccessfull)\n    {\n        struct DEF {\n            int number;\n            unsigned char numberOfChars;\n            const char *nextSep;\n        };\n\t\n        DEF def[] = {\n                        {0, 4, \"-\"},  //year\n                        {0, 2, \"-\"},  //Month\n                        {0, 2, \"T \"},//day\n                        {0, 2, \":\"}, //hour\n                        {0, 2, \":\"}, //minute\n                        {0, 2, \".Z\"}, //second\n                        {0, 3, \"+-Z\"}, //msecond\n                        {0, 0, 0}    //terminator\n                    };\n\n        isSuccessfull = true;\n\n        if( isoTime == \"infinity\" )\n            return boost::posix_time::ptime( boost::posix_time::pos_infin );\n        else if( isoTime == \"-infinity\" )\n            return boost::posix_time::ptime( boost::posix_time::neg_infin );\n        else if( isoTime == \"epoch\" )\n            return boost::posix_time::ptime( boost::gregorian::date( 1970, 1, 1 ),\n            boost::posix_time::time_duration( 0, 0, 0) );\n        else if( isoTime == \"now\" )\n            return boost::posix_time::second_clock::universal_time();\n        else if( isoTime == \"today\" ) {\n            boost::posix_time::ptime now( boost::posix_time::second_clock::universal_time() );\n            return boost::posix_time::ptime( now.date(), boost::posix_time::time_duration( 0, 0, 0) );\n        } else if( isoTime == \"tomorrow\" ) {\n            boost::posix_time::ptime now( boost::posix_time::second_clock::universal_time() );\n            now += boost::posix_time::hours(24);\n            return boost::posix_time::ptime( now.date(), boost::posix_time::time_duration( 0, 0, 0) );\n        } else if( isoTime == \"yesterday\" ) {\n            boost::posix_time::ptime now( boost::posix_time::second_clock::universal_time() );\n            now -= boost::posix_time::hours(24);\n            return boost::posix_time::ptime( now.date(), boost::posix_time::time_duration( 0, 0, 0) );\n        }\n\n        std::string::size_type iIsoTime = isoTime.find_first_not_of( \" \", 0 ); //Skip whitespace in front\n        isSuccessfull = iIsoTime != std::string::npos;\n        assert( isSuccessfull );\n\t\n        if( ! isdigit( (int)isoTime[iIsoTime] ) ) {\n        //We try to decode it as an rfc1123date.\n            boost::posix_time::ptime pt = rfc1123date( isoTime.c_str() );\n            isSuccessfull = !pt.is_special();\n            assert( isSuccessfull );\t\n            return pt;\n        }\n\t\n        //Decode the YYYY-MM-DDThh:mm:ss part\n        //Remeber -, T and : is optional.\n        for( unsigned short defIndex=0; def[defIndex].nextSep && iIsoTime < isoTime.length() && isSuccessfull; ++defIndex ) {\n            def[defIndex].number = getInt( isoTime, iIsoTime, def[defIndex].numberOfChars, isSuccessfull);\t\n            iIsoTime = isoTime.find_first_of( def[defIndex].nextSep, iIsoTime );\n            if(defIndex!=6)\n                ++iIsoTime;\n        }\n\n        if(!isSuccessfull){\n            return boost::posix_time::ptime();\n        } \n\n        int hourOffset=0;\n        int minuteOffset=0;\n        //Decode the UTC offset part of\n        //YYYY-MM-DDThh:mm:ssSHHMM part\n        //The UTC offset part is SHHMM\n        //Where S is the sign. + or -.\n        //      HH the hour offset, mandatory if we have an UTC offset part.\n        //      MM the minute offset, otional.\n        if( iIsoTime < isoTime.length() ) {\n            //We have a possible UTC offset.\n            //The format is SHHMM, where S is the sign.\n            char ch = isoTime[iIsoTime];\n\t\t\n            if( ch == '+' || ch == '-' || isdigit( ch ) ) {\n                int sign=1;\n\n                if( ! isdigit( ch ) ) {\n                    if( ch=='-' )\n                        sign=-1;\n                    isSuccessfull = isdigit( isoTime[++iIsoTime] )!=0;\n                    assert( isSuccessfull );\n                }\n                hourOffset = getInt( isoTime, iIsoTime, 2, isSuccessfull);\n                hourOffset*=sign;\n\n                if( iIsoTime < isoTime.length() && isdigit( isoTime[++iIsoTime] ) ) {\n                    minuteOffset = getInt( isoTime, iIsoTime, 2, isSuccessfull);\n                }\n            }\n        }\n\n        try{\n            boost::gregorian::date date(def[0].number, def[1].number, def[2].number);\n            boost::posix_time::time_duration td(def[3].number, def[4].number, def[5].number, def[6].number*1000);\n            boost::posix_time::ptime pt(date, td);\n            td = boost::posix_time::time_duration(hourOffset, minuteOffset, 0);\n            return pt - td;\n        }\n        catch(const std::out_of_range &)\n        {\n            isSuccessfull = false;\n            return boost::posix_time::ptime();\n        }\n    }\n\n}"
  },
  {
    "path": "src/robomongo/shell/db/ptimeutil.h",
    "content": "/*\n    wdb - weather and water data storage\n\n    Copyright (C) 2007 met.no\n\n    Contact information:\n    Norwegian Meteorological Institute\n    Box 43 Blindern\n    0313 OSLO\n    NORWAY\n    E-mail: wdb@met.no\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,\n    MA  02110-1301, USA\n*/\n\n#ifndef __RFC1123DATE_H__\n#define __RFC1123DATE_H__\n\n#include <string>\n#include <boost/date_time/posix_time/posix_time.hpp>\n\nnamespace miutil {\n\n    extern const long long minDate;\n    extern const long long maxDate;\n   /**\n    * Takes an ptime and convert it to a time string coded in\n    * the RFC 1123 format. This is the date format used by \n    * the HTTP protocol.\n    * \n    * \\b Ex. on RFC 1123 coded string\n    *     \n    *   Fri, 16 Mar 2007 08:13:37 GMT  \n    * \n    * @param t the time to convert to a RFC 1123 coded string representation.\n    * @return On success a string coded in the RFC 1123 format. On error an \n    * empty string is returned.\n    */\n   \n   std::string rfc1123date(const boost::posix_time::ptime &t);\n   \n   \n   /**\n    * Takes an RFC 1123 coded date string and return an boost::posix_time.\n    * \n    * \\b Ex. on RFC 1123 coded string\n    *     \n    *   Fri, 16 Mar 2007 08:13:37 GMT  \n    * \n    * @param rfc1123 coded data string.\n    * @return An valid ptime on success and not_a_date_time on failure.\n    */\n   boost::posix_time::ptime rfc1123date(const std::string &rfc1123);\n   \n   \n   /**\n    * Takes an RFC 1123 coded date string and return an boost::posix_time.\n    * \n    * \\b Ex. on RFC 1123 coded string\n    *     \n    *   Fri, 16 Mar 2007 08:13:37 GMT  \n    * \n    * @param rfc1123 coded data string.\n    * @return An valid ptime on success and not_a_date_time on failure.\n    */\n   boost::posix_time::ptime rfc1123date(const char *rfc1123);\n   \n   /**\n    * isotimeString generates a timeformatted string in one of two\n    * iso compatible formats.\n    * \n    *  - YYYY-MM-DD hh:mm:ss\n    *  - YYYY-MM-DDThh:mm:ss\n    * \n    * The second form separates the date part from the timepart with a T.\n    * \n    * If markAsZulu is true an Z is added to the end of the timestring.\n    * \n    * ex. 2008-02-15T18:00:00Z\n    * \n    * An empty string is returned if the \\em time is not a valid\n    * ptime, ie. the call to is_special return true.\n    * \n    * @param t the time to return as a string.\n    * @param useTseparator is true if we want the datepart and timepart separated with a T.\n    * @param markAsZulu Add an Z to the end of the timestring \n    * @return An iso compatible string on success or an empty string if \\em t is invalid.\n    */\n   std::string  isotimeString(const boost::posix_time::ptime &t, bool useTseparator=false, bool isLocalFormat=false);\n   \n   \n   /**\n    * ptimeFromIsoString decodes a time string on the followwing formates to a ptime.\n    *\n    * - YYYY-MM-DDThh:mm:ssZ\n    * - YYYY-MM-DDThh:mm:ssSHHMM \n    * - YYYYMMDDThhmmssSHHMM\n    * - Sun, 01 Apr 2007 09:51:04 GMT\n    *  \n    * Z is optional and means ZULU time (GMT).\n    * S in front of HHMM stands for - or +. HHMM is an offset to UTC.\n    * T is an optional separator it my bee an space.\n    * \n    * If the timestring is invallid an logic_error exception is thrown.\n    * \n    * @param isoTime A timestring.\n    * @return An ptime.\n    */\n   boost::posix_time::ptime ptimeFromIsoString( const std::string &isoTime);\n   boost::posix_time::ptime ptimeFromIsoString( const std::string &isoTime, bool &isSuccessfull);\n   \n}\n#endif \n"
  },
  {
    "path": "src/robomongo/shell/shell/dbshell.cpp",
    "content": "// dbshell.cpp\n/*\n *    Copyright 2010 10gen Inc.\n *\n *    This program is free software: you can redistribute it and/or  modify\n *    it under the terms of the GNU Affero General Public License, version 3,\n *    as published by the Free Software Foundation.\n *\n *    This program is distributed in the hope that it will be useful,\n *    but WITHOUT ANY WARRANTY; without even the implied warranty of\n *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *    GNU Affero General Public License for more details.\n *\n *    You should have received a copy of the GNU Affero General Public License\n *    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n *    As a special exception, the copyright holders give permission to link the\n *    code of portions of this program with the OpenSSL library under certain\n *    conditions as described in each individual source file and distribute\n *    linked combinations including the program with the OpenSSL library. You\n *    must comply with the GNU Affero General Public License in all respects\n *    for all of the code used other than as permitted herein. If you modify\n *    file(s) with this exception, you may extend this exception to your\n *    version of the file(s), but you are not obligated to do so. If you do not\n *    wish to do so, delete this exception statement from your version. If you\n *    delete this exception statement from all source files in the program,\n *    then also delete it in the license file.\n */\n\n#define MONGO_LOG_DEFAULT_COMPONENT ::mongo::logger::LogComponent::kDefault\n\n#include \"mongo/platform/basic.h\"\n\n#include <boost/filesystem/operations.hpp>\n#include <fstream>\n#include <iostream>\n#include <pcrecpp.h>\n#include <signal.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"mongo/base/initializer.h\"\n#include \"mongo/base/status.h\"\n#include \"mongo/client/dbclient_base.h\"\n#include \"mongo/client/sasl_client_authenticate.h\"\n#include \"mongo/db/client.h\"\n#include \"mongo/db/log_process_details.h\"\n#include \"mongo/db/server_options.h\"\n#include \"mongo/logger/console_appender.h\"\n#include \"mongo/logger/logger.h\"\n#include \"mongo/logger/message_event_utf8_encoder.h\"\n#include \"mongo/scripting/engine.h\"\n#include \"mongo/shell/linenoise.h\"\n#include \"mongo/shell/shell_options.h\"\n#include \"mongo/shell/shell_utils.h\"\n#include \"mongo/shell/shell_utils_launcher.h\"\n#include \"mongo/util/exit_code.h\"\n#include \"mongo/util/file.h\"\n#include \"mongo/util/log.h\"\n#include \"mongo/util/net/ssl_options.h\"\n#include \"mongo/util/password.h\"\n#include \"mongo/util/quick_exit.h\"\n#include \"mongo/util/scopeguard.h\"\n#include \"mongo/util/signal_handlers.h\"\n#include \"mongo/util/stacktrace.h\"\n#include \"mongo/util/startup_test.h\"\n#include \"mongo/util/static_observer.h\"\n#include \"mongo/util/text.h\"\n#include \"mongo/util/version.h\"\n\n#ifdef _WIN32\n#include <io.h>\n#include <shlobj.h>\n#define isatty _isatty\n#define fileno _fileno\n#else\n#include <unistd.h>\n#endif\n\nusing namespace std;\nusing namespace mongo;\n\nstring historyFile;\nbool gotInterrupted = false;\nbool inMultiLine = false;\nstatic volatile bool atPrompt = false;  // can eval before getting to prompt\n\nnamespace mongo {\n\nScope* shellMainScope;\n\nextern bool dbexitCalled;\n}\n\nvoid generateCompletions(const string& prefix, vector<string>& all) {\n    if (prefix.find('\"') != string::npos)\n        return;\n\n    try {\n        BSONObj args = BSON(\"0\" << prefix);\n        shellMainScope->invokeSafe(\n            \"function callShellAutocomplete(x) {shellAutocomplete(x)}\", &args, NULL);\n        BSONObjBuilder b;\n        shellMainScope->append(b, \"\", \"__autocomplete__\");\n        BSONObj res = b.obj();\n        BSONObj arr = res.firstElement().Obj();\n\n        BSONObjIterator i(arr);\n        while (i.more()) {\n            BSONElement e = i.next();\n            all.push_back(e.String());\n        }\n    } catch (...) {\n    }\n}\n\nvoid completionHook(const char* text, linenoiseCompletions* lc) {\n    vector<string> all;\n    generateCompletions(text, all);\n\n    for (unsigned i = 0; i < all.size(); ++i)\n        linenoiseAddCompletion(lc, (char*)all[i].c_str());\n}\n\nvoid shellHistoryInit() {\n    stringstream ss;\n    const char* h = shell_utils::getUserDir();\n    if (h)\n        ss << h << \"/\";\n    ss << \".dbshell\";\n    historyFile = ss.str();\n\n    linenoiseHistoryLoad(historyFile.c_str());\n    linenoiseSetCompletionCallback(completionHook);\n}\n\nvoid shellHistoryDone() {\n    linenoiseHistorySave(historyFile.c_str());\n    linenoiseHistoryFree();\n}\nvoid shellHistoryAdd(const char* line) {\n    if (line[0] == '\\0')\n        return;\n\n    // dont record duplicate lines\n    static string lastLine;\n    if (lastLine == line)\n        return;\n    lastLine = line;\n\n    // We don't want any .auth() or .createUser() shell helpers added, but we want to\n    // be able to add things like `.author`, so be smart about how this is\n    // detected by using regular expresions. This is so we can avoid storing passwords\n    // in the history file in plaintext.\n    static pcrecpp::RE hiddenHelpers(\n        \"\\\\.\\\\s*(auth|createUser|updateUser|changeUserPassword)\\\\s*\\\\(\");\n    // Also don't want the raw user management commands to show in the shell when run directly\n    // via runCommand.\n    static pcrecpp::RE hiddenCommands(\n        \"(run|admin)Command\\\\s*\\\\(\\\\s*{\\\\s*(createUser|updateUser)\\\\s*:\");\n    if (!hiddenHelpers.PartialMatch(line) && !hiddenCommands.PartialMatch(line)) {\n        linenoiseHistoryAdd(line);\n    }\n}\n\nvoid killOps() {\n    if (mongo::shell_utils::_nokillop)\n        return;\n\n    if (atPrompt)\n        return;\n\n    sleepmillis(10);  // give current op a chance to finish\n\n    mongo::shell_utils::connectionRegistry.killOperationsOnAllConnections(\n        !shellGlobalParams.autoKillOp);\n}\n\n// Stubs for signal_handlers.cpp\nnamespace mongo {\nvoid logProcessDetailsForLogRotate() {}\n\nvoid exitCleanly(ExitCode code) {\n    {\n        stdx::lock_guard<stdx::mutex> lk(mongo::shell_utils::mongoProgramOutputMutex);\n        mongo::dbexitCalled = true;\n    }\n\n    ::killOps();\n    ::shellHistoryDone();\n    quickExit(0);\n}\n}\n\nvoid quitNicely(int sig) {\n    exitCleanly(EXIT_CLEAN);\n}\n\n// the returned string is allocated with strdup() or malloc() and must be freed by calling free()\nchar* shellReadline(const char* prompt, int handlesigint = 0) {\n    atPrompt = true;\n\n    char* ret = linenoise(prompt);\n    if (!ret) {\n        gotInterrupted = true;  // got ^C, break out of multiline\n    }\n\n    atPrompt = false;\n    return ret;\n}\n\nvoid setupSignals() {\n    signal(SIGINT, quitNicely);\n}\n\nstring fixHost(const std::string& url, const std::string& host, const std::string& port) {\n    if (host.size() == 0 && port.size() == 0) {\n        if (url.find(\"/\") == string::npos) {\n            // check for ips\n            if (url.find(\".\") != string::npos)\n                return url + \"/test\";\n\n            if (url.rfind(\":\") != string::npos && isdigit(url[url.rfind(\":\") + 1]))\n                return url + \"/test\";\n        }\n        return url;\n    }\n\n    if (url.find(\"/\") != string::npos) {\n        cerr << \"url can't have host or port if you specify them individually\" << endl;\n        quickExit(-1);\n    }\n\n    string newurl((host.size() == 0) ? \"127.0.0.1\" : host);\n    if (port.size() > 0)\n        newurl += \":\" + port;\n    else if (host.find(':') == string::npos) {\n        // need to add port with IPv6 addresses\n        newurl += \":27017\";\n    }\n\n    newurl += \"/\" + url;\n\n    return newurl;\n}\n\nstatic string OpSymbols = \"~!%^&*-+=|:,<>/?.\";\n\nbool isOpSymbol(char c) {\n    for (size_t i = 0; i < OpSymbols.size(); i++)\n        if (OpSymbols[i] == c)\n            return true;\n    return false;\n}\n\nbool isUseCmd(const std::string& code) {\n    string cmd = code;\n    if (cmd.find(\" \") > 0)\n        cmd = cmd.substr(0, cmd.find(\" \"));\n    return cmd == \"use\";\n}\n\n/**\n * Skip over a quoted string, including quotes escaped with backslash\n *\n * @param code      String\n * @param start     Starting position within string, always > 0\n * @param quote     Quote character (single or double quote)\n * @return          Position of ending quote, or code.size() if no quote found\n */\nsize_t skipOverString(const std::string& code, size_t start, char quote) {\n    size_t pos = start;\n    while (pos < code.size()) {\n        pos = code.find(quote, pos);\n        if (pos == std::string::npos) {\n            return code.size();\n        }\n        // We want to break if the quote we found is not escaped, but we need to make sure\n        // that the escaping backslash is not itself escaped.  Comparisons of start and pos\n        // are to keep us from reading beyond the beginning of the quoted string.\n        //\n        if (start == pos || code[pos - 1] != '\\\\' ||  // previous char was backslash\n            start == pos - 1 ||\n            code[pos - 2] == '\\\\'  // char before backslash was not another\n            ) {\n            break;  // The quote we found was not preceded by an unescaped backslash; it is real\n        }\n        ++pos;  // The quote we found was escaped with backslash, so it doesn't count\n    }\n    return pos;\n}\n\nbool isBalanced(const std::string& code) {\n    if (isUseCmd(code))\n        return true;  // don't balance \"use <dbname>\" in case dbname contains special chars\n    int curlyBrackets = 0;\n    int squareBrackets = 0;\n    int parens = 0;\n    bool danglingOp = false;\n\n    for (size_t i = 0; i < code.size(); i++) {\n        switch (code[i]) {\n            case '/':\n                if (i + 1 < code.size() && code[i + 1] == '/') {\n                    while (i < code.size() && code[i] != '\\n')\n                        i++;\n                }\n                continue;\n            case '{':\n                curlyBrackets++;\n                break;\n            case '}':\n                if (curlyBrackets <= 0)\n                    return true;\n                curlyBrackets--;\n                break;\n            case '[':\n                squareBrackets++;\n                break;\n            case ']':\n                if (squareBrackets <= 0)\n                    return true;\n                squareBrackets--;\n                break;\n            case '(':\n                parens++;\n                break;\n            case ')':\n                if (parens <= 0)\n                    return true;\n                parens--;\n                break;\n            case '\"':\n            case '\\'':\n                i = skipOverString(code, i + 1, code[i]);\n                if (i >= code.size()) {\n                    return true;  // Do not let unterminated strings enter multi-line mode\n                }\n                break;\n            case '\\\\':\n                if (i + 1 < code.size() && code[i + 1] == '/')\n                    i++;\n                break;\n            case '+':\n            case '-':\n                if (i + 1 < code.size() && code[i + 1] == code[i]) {\n                    i++;\n                    continue;  // postfix op (++/--) can't be a dangling op\n                }\n                break;\n        }\n        if (i >= code.size()) {\n            danglingOp = false;\n            break;\n        }\n        if (isOpSymbol(code[i]))\n            danglingOp = true;\n        else if (!std::isspace(static_cast<unsigned char>(code[i])))\n            danglingOp = false;\n    }\n\n    return curlyBrackets == 0 && squareBrackets == 0 && parens == 0 && !danglingOp;\n}\n\nstruct BalancedTest : public mongo::StartupTest {\npublic:\n    void run() {\n        verify(isBalanced(\"x = 5\"));\n        verify(isBalanced(\"function(){}\"));\n        verify(isBalanced(\"function(){\\n}\"));\n        verify(!isBalanced(\"function(){\"));\n        verify(isBalanced(\"x = \\\"{\\\";\"));\n        verify(isBalanced(\"// {\"));\n        verify(!isBalanced(\"// \\n {\"));\n        verify(!isBalanced(\"\\\"//\\\" {\"));\n        verify(isBalanced(\"{x:/x\\\\//}\"));\n        verify(!isBalanced(\"{ \\\\/// }\"));\n        verify(isBalanced(\"x = 5 + y \"));\n        verify(!isBalanced(\"x = \"));\n        verify(!isBalanced(\"x = // hello\"));\n        verify(!isBalanced(\"x = 5 +\"));\n        verify(isBalanced(\" x ++\"));\n        verify(isBalanced(\"-- x\"));\n        verify(!isBalanced(\"a.\"));\n        verify(!isBalanced(\"a. \"));\n        verify(isBalanced(\"a.b\"));\n\n        // SERVER-5809 and related cases --\n        verify(isBalanced(\"a = {s:\\\"\\\\\\\"\\\"}\"));            // a = {s:\"\\\"\"}\n        verify(isBalanced(\"db.test.save({s:\\\"\\\\\\\"\\\"})\"));  // db.test.save({s:\"\\\"\"})\n        verify(isBalanced(\"printjson(\\\" \\\\\\\" \\\")\"));       // printjson(\" \\\" \") -- SERVER-8554\n        verify(isBalanced(\"var a = \\\"\\\\\\\\\\\";\"));           // var a = \"\\\\\";\n        verify(isBalanced(\"var a = (\\\"\\\\\\\\\\\") //\\\"\"));     // var a = (\"\\\\\") //\"\n        verify(isBalanced(\"var a = (\\\"\\\\\\\\\\\") //\\\\\\\"\"));   // var a = (\"\\\\\") //\\\"\n        verify(isBalanced(\"var a = (\\\"\\\\\\\\\\\") //\"));       // var a = (\"\\\\\") //\n        verify(isBalanced(\"var a = (\\\"\\\\\\\\\\\")\"));          // var a = (\"\\\\\")\n        verify(isBalanced(\"var a = (\\\"\\\\\\\\\\\\\\\"\\\")\"));      // var a = (\"\\\\\\\"\")\n        verify(!isBalanced(\"var a = (\\\"\\\\\\\\\\\" //\\\"\"));     // var a = (\"\\\\\" //\"\n        verify(!isBalanced(\"var a = (\\\"\\\\\\\\\\\" //\"));       // var a = (\"\\\\\" //\n        verify(!isBalanced(\"var a = (\\\"\\\\\\\\\\\"\"));          // var a = (\"\\\\\"\n    }\n} balanced_test;\n\nstring finishCode(string code) {\n    while (!isBalanced(code)) {\n        inMultiLine = true;\n        code += \"\\n\";\n        // cancel multiline if two blank lines are entered\n        if (code.find(\"\\n\\n\\n\") != string::npos)\n            return \";\";\n        char* line = shellReadline(\"... \", 1);\n        if (gotInterrupted) {\n            if (line)\n                free(line);\n            return \"\";\n        }\n        if (!line)\n            return \"\";\n\n        char* linePtr = line;\n        while (str::startsWith(linePtr, \"... \"))\n            linePtr += 4;\n\n        code += linePtr;\n        free(line);\n    }\n    return code;\n}\n\nbool execPrompt(mongo::Scope& scope, const char* promptFunction, string& prompt) {\n    string execStatement = string(\"__prompt__ = \") + promptFunction + \"();\";\n    scope.exec(\"delete __prompt__;\", \"\", false, false, false, 0);\n    scope.exec(execStatement, \"\", false, false, false, 0);\n    if (scope.type(\"__prompt__\") == String) {\n        prompt = scope.getString(\"__prompt__\");\n        return true;\n    }\n    return false;\n}\n\n/**\n * Edit a variable or input buffer text in an external editor -- EDITOR must be defined\n *\n * @param whatToEdit Name of JavaScript variable to be edited, or any text string\n */\nstatic void edit(const string& whatToEdit) {\n    // EDITOR may be defined in the JavaScript scope or in the environment\n    string editor;\n    if (shellMainScope->type(\"EDITOR\") == String) {\n        editor = shellMainScope->getString(\"EDITOR\");\n    } else {\n        static const char* editorFromEnv = getenv(\"EDITOR\");\n        if (editorFromEnv) {\n            editor = editorFromEnv;\n        }\n    }\n    if (editor.empty()) {\n        cout << \"please define EDITOR as a JavaScript string or as an environment variable\" << endl;\n        return;\n    }\n\n    // \"whatToEdit\" might look like a variable/property name\n    bool editingVariable = true;\n    for (const char* p = whatToEdit.c_str(); *p; ++p) {\n        if (!(isalnum(*p) || *p == '_' || *p == '.')) {\n            editingVariable = false;\n            break;\n        }\n    }\n\n    string js;\n    if (editingVariable) {\n        // If \"whatToEdit\" is undeclared or uninitialized, declare\n        int varType = shellMainScope->type(whatToEdit.c_str());\n        if (varType == Undefined) {\n            shellMainScope->exec(\"var \" + whatToEdit, \"(shell)\", false, true, false);\n        }\n\n        // Convert \"whatToEdit\" to JavaScript (JSON) text\n        if (!shellMainScope->exec(\n                \"__jsout__ = tojson(\" + whatToEdit + \")\", \"tojs\", false, false, false))\n            return;  // Error already printed\n\n        js = shellMainScope->getString(\"__jsout__\");\n\n        if (strstr(js.c_str(), \"[native code]\")) {\n            cout << \"can't edit native functions\" << endl;\n            return;\n        }\n    } else {\n        js = whatToEdit;\n    }\n\n    // Pick a name to use for the temp file\n    string filename;\n    const int maxAttempts = 10;\n    int i;\n    for (i = 0; i < maxAttempts; ++i) {\n        StringBuilder sb;\n#ifdef _WIN32\n        char tempFolder[MAX_PATH];\n        GetTempPathA(sizeof tempFolder, tempFolder);\n        sb << tempFolder << \"mongo_edit\" << time(0) + i << \".js\";\n#else\n        sb << \"/tmp/mongo_edit\" << time(0) + i << \".js\";\n#endif\n        filename = sb.str();\n        if (!::mongo::shell_utils::fileExists(filename))\n            break;\n    }\n    if (i == maxAttempts) {\n        cout << \"couldn't create unique temp file after \" << maxAttempts << \" attempts\" << endl;\n        return;\n    }\n\n    // Create the temp file\n    FILE* tempFileStream;\n    tempFileStream = fopen(filename.c_str(), \"wt\");\n    if (!tempFileStream) {\n        cout << \"couldn't create temp file (\" << filename << \"): \" << errnoWithDescription()\n             << endl;\n        return;\n    }\n\n    // Write JSON into the temp file\n    size_t fileSize = js.size();\n    if (fwrite(js.data(), sizeof(char), fileSize, tempFileStream) != fileSize) {\n        int systemErrno = errno;\n        cout << \"failed to write to temp file: \" << errnoWithDescription(systemErrno) << endl;\n        fclose(tempFileStream);\n        remove(filename.c_str());\n        return;\n    }\n    fclose(tempFileStream);\n\n    // Pass file to editor\n    StringBuilder sb;\n    sb << editor << \" \" << filename;\n    int ret = ::system(sb.str().c_str());\n    if (ret) {\n        if (ret == -1) {\n            int systemErrno = errno;\n            cout << \"failed to launch $EDITOR (\" << editor\n                 << \"): \" << errnoWithDescription(systemErrno) << endl;\n        } else\n            cout << \"editor exited with error (\" << ret << \"), not applying changes\" << endl;\n        remove(filename.c_str());\n        return;\n    }\n\n    // The editor gave return code zero, so read the file back in\n    tempFileStream = fopen(filename.c_str(), \"rt\");\n    if (!tempFileStream) {\n        cout << \"couldn't open temp file on return from editor: \" << errnoWithDescription() << endl;\n        remove(filename.c_str());\n        return;\n    }\n    sb.reset();\n    int bytes;\n    do {\n        char buf[1024];\n        bytes = fread(buf, sizeof(char), sizeof buf, tempFileStream);\n        if (ferror(tempFileStream)) {\n            cout << \"failed to read temp file: \" << errnoWithDescription() << endl;\n            fclose(tempFileStream);\n            remove(filename.c_str());\n            return;\n        }\n        sb.append(StringData(buf, bytes));\n    } while (bytes);\n\n    // Done with temp file, close and delete it\n    fclose(tempFileStream);\n    remove(filename.c_str());\n\n    if (editingVariable) {\n        // Try to execute assignment to copy edited value back into the variable\n        const string code = whatToEdit + string(\" = \") + sb.str();\n        if (!shellMainScope->exec(code, \"tojs\", false, true, false)) {\n            cout << \"error executing assignment: \" << code << endl;\n        }\n    } else {\n        linenoisePreloadBuffer(sb.str().c_str());\n    }\n}\n\nint _main(int argc, char* argv[], char** envp) {\n    setupSignalHandlers();\n    setupSignals();\n\n    mongo::shell_utils::RecordMyLocation(argv[0]);\n\n    shellGlobalParams.url = \"test\";\n\n    mongo::runGlobalInitializersOrDie(argc, argv, envp);\n\n    // hide password from ps output\n    for (int i = 0; i < (argc - 1); ++i) {\n        if (!strcmp(argv[i], \"-p\") || !strcmp(argv[i], \"--password\")) {\n            char* arg = argv[i + 1];\n            while (*arg) {\n                *arg++ = 'x';\n            }\n        }\n    }\n\n    if (!mongo::serverGlobalParams.quiet)\n        cout << \"MongoDB shell version: \" << mongo::versionString << endl;\n\n    mongo::StartupTest::runTests();\n\n    logger::globalLogManager()\n        ->getNamedDomain(\"javascriptOutput\")\n        ->attachAppender(logger::MessageLogDomain::AppenderAutoPtr(\n            new logger::ConsoleAppender<logger::MessageEventEphemeral>(\n                new logger::MessageEventUnadornedEncoder)));\n\n    if (!shellGlobalParams.nodb) {  // connect to db\n        stringstream ss;\n        if (mongo::serverGlobalParams.quiet)\n            ss << \"__quiet = true;\";\n        ss << \"db = connect( \\\"\"\n           << fixHost(shellGlobalParams.url, shellGlobalParams.dbhost, shellGlobalParams.port)\n           << \"\\\")\";\n\n        mongo::shell_utils::_dbConnect = ss.str();\n\n        if (shellGlobalParams.usingPassword && shellGlobalParams.password.empty()) {\n            shellGlobalParams.password = mongo::askPassword();\n        }\n    }\n\n    // Construct the authentication-related code to execute on shell startup.\n    //\n    // This constructs and immediately executes an anonymous function, to avoid\n    // the shell's default behavior of printing statement results to the console.\n    //\n    // It constructs a statement of the following form:\n    //\n    // (function() {\n    //    // Set default authentication mechanism and, maybe, authenticate.\n    //  }())\n    stringstream authStringStream;\n    authStringStream << \"(function() { \" << endl;\n    if (!shellGlobalParams.authenticationMechanism.empty()) {\n        authStringStream << \"DB.prototype._defaultAuthenticationMechanism = \\\"\"\n                         << escape(shellGlobalParams.authenticationMechanism) << \"\\\";\" << endl;\n    }\n\n    if (!shellGlobalParams.gssapiServiceName.empty()) {\n        authStringStream << \"DB.prototype._defaultGssapiServiceName = \\\"\"\n                         << escape(shellGlobalParams.gssapiServiceName) << \"\\\";\" << endl;\n    }\n\n    if (!shellGlobalParams.nodb && shellGlobalParams.username.size()) {\n        authStringStream << \"var username = \\\"\" << escape(shellGlobalParams.username) << \"\\\";\"\n                         << endl;\n        if (shellGlobalParams.usingPassword) {\n            authStringStream << \"var password = \\\"\" << escape(shellGlobalParams.password) << \"\\\";\"\n                             << endl;\n        }\n        if (shellGlobalParams.authenticationDatabase.empty()) {\n            authStringStream << \"var authDb = db;\" << endl;\n        } else {\n            authStringStream << \"var authDb = db.getSiblingDB(\\\"\"\n                             << escape(shellGlobalParams.authenticationDatabase) << \"\\\");\" << endl;\n        }\n        authStringStream << \"authDb._authOrThrow({ \" << saslCommandUserFieldName << \": username \";\n        if (shellGlobalParams.usingPassword) {\n            authStringStream << \", \" << saslCommandPasswordFieldName << \": password \";\n        }\n\n        if (!shellGlobalParams.gssapiHostName.empty()) {\n            authStringStream << \", \" << saslCommandServiceHostnameFieldName << \": \\\"\"\n                             << escape(shellGlobalParams.gssapiHostName) << '\"' << endl;\n        }\n        authStringStream << \"});\" << endl;\n    }\n    authStringStream << \"}())\";\n    mongo::shell_utils::_dbAuth = authStringStream.str();\n\n    mongo::ScriptEngine::setConnectCallback(mongo::shell_utils::onConnect);\n    mongo::ScriptEngine::setup();\n    mongo::globalScriptEngine->setScopeInitCallback(mongo::shell_utils::initScope);\n    mongo::globalScriptEngine->enableJIT(!shellGlobalParams.nojit);\n\n    auto poolGuard = MakeGuard([] { ScriptEngine::dropScopeCache(); });\n\n    unique_ptr<mongo::Scope> scope(mongo::globalScriptEngine->newScope());\n    shellMainScope = scope.get();\n\n    if (shellGlobalParams.runShell)\n        cout << \"type \\\"help\\\" for help\" << endl;\n\n    // Load and execute /etc/mongorc.js before starting shell\n    std::string rcGlobalLocation;\n#ifndef _WIN32\n    rcGlobalLocation = \"/etc/mongorc.js\";\n#else\n    wchar_t programDataPath[MAX_PATH];\n    if (S_OK == SHGetFolderPathW(NULL, CSIDL_COMMON_APPDATA, NULL, 0, programDataPath)) {\n        rcGlobalLocation = str::stream() << toUtf8String(programDataPath)\n                                         << \"\\\\MongoDB\\\\mongorc.js\";\n    }\n#endif\n    if (!rcGlobalLocation.empty() && ::mongo::shell_utils::fileExists(rcGlobalLocation)) {\n        if (!scope->execFile(rcGlobalLocation, false, true)) {\n            cout << \"The \\\"\" << rcGlobalLocation << \"\\\" file could not be executed\" << endl;\n        }\n    }\n\n    if (!shellGlobalParams.script.empty()) {\n        mongo::shell_utils::MongoProgramScope s;\n        if (!scope->exec(shellGlobalParams.script, \"(shell eval)\", false, true, false))\n            return -4;\n        scope->exec(\"shellPrintHelper( __lastres__ );\", \"(shell2 eval)\", true, true, false);\n    }\n\n    for (size_t i = 0; i < shellGlobalParams.files.size(); ++i) {\n        mongo::shell_utils::MongoProgramScope s;\n\n        if (shellGlobalParams.files.size() > 1)\n            cout << \"loading file: \" << shellGlobalParams.files[i] << endl;\n\n        if (!scope->execFile(shellGlobalParams.files[i], false, true)) {\n            cout << \"failed to load: \" << shellGlobalParams.files[i] << endl;\n            return -3;\n        }\n    }\n\n    if (shellGlobalParams.files.size() == 0 && shellGlobalParams.script.empty())\n        shellGlobalParams.runShell = true;\n\n    bool lastLineSuccessful = true;\n    if (shellGlobalParams.runShell) {\n        mongo::shell_utils::MongoProgramScope s;\n        // If they specify norc, assume it's not their first time\n        bool hasMongoRC = shellGlobalParams.norc;\n        string rcLocation;\n        if (!shellGlobalParams.norc) {\n#ifndef _WIN32\n            if (getenv(\"HOME\") != NULL)\n                rcLocation = str::stream() << getenv(\"HOME\") << \"/.mongorc.js\";\n#else\n            if (getenv(\"HOMEDRIVE\") != NULL && getenv(\"HOMEPATH\") != NULL)\n                rcLocation = str::stream() << toUtf8String(_wgetenv(L\"HOMEDRIVE\"))\n                                           << toUtf8String(_wgetenv(L\"HOMEPATH\"))\n                                           << \"\\\\.mongorc.js\";\n#endif\n            if (!rcLocation.empty() && ::mongo::shell_utils::fileExists(rcLocation)) {\n                hasMongoRC = true;\n                if (!scope->execFile(rcLocation, false, true)) {\n                    cout << \"The \\\".mongorc.js\\\" file located in your home folder could not be \"\n                            \"executed\" << endl;\n                    return -5;\n                }\n            }\n        }\n\n        if (!hasMongoRC && isatty(fileno(stdin))) {\n            cout\n                << \"Welcome to the MongoDB shell.\\n\"\n                   \"For interactive help, type \\\"help\\\".\\n\"\n                   \"For more comprehensive documentation, see\\n\\thttp://docs.mongodb.org/\\n\"\n                   \"Questions? Try the support group\\n\\thttp://groups.google.com/group/mongodb-user\"\n                << endl;\n            File f;\n            f.open(rcLocation.c_str(), false);  // Create empty .mongorc.js file\n        }\n\n        if (!shellGlobalParams.nodb && !mongo::serverGlobalParams.quiet && isatty(fileno(stdin))) {\n            scope->exec(\n                \"shellHelper( 'show', 'startupWarnings' )\", \"(shellwarnings\", false, true, false);\n        }\n\n        shellHistoryInit();\n\n        string prompt;\n        int promptType;\n\n        while (1) {\n            inMultiLine = false;\n            gotInterrupted = false;\n\n            promptType = scope->type(\"prompt\");\n            if (promptType == String) {\n                prompt = scope->getString(\"prompt\");\n            } else if ((promptType == Code) && execPrompt(*scope, \"prompt\", prompt)) {\n            } else if (execPrompt(*scope, \"defaultPrompt\", prompt)) {\n            } else {\n                prompt = \"> \";\n            }\n\n            char* line = shellReadline(prompt.c_str());\n\n            char* linePtr = line;  // can't clobber 'line', we need to free() it later\n            if (linePtr) {\n                while (linePtr[0] == ' ')\n                    ++linePtr;\n                int lineLen = strlen(linePtr);\n                while (lineLen > 0 && linePtr[lineLen - 1] == ' ')\n                    linePtr[--lineLen] = 0;\n            }\n\n            if (!linePtr || (strlen(linePtr) == 4 && strstr(linePtr, \"exit\"))) {\n                if (!mongo::serverGlobalParams.quiet)\n                    cout << \"bye\" << endl;\n                if (line)\n                    free(line);\n                break;\n            }\n\n            string code = linePtr;\n            if (code == \"exit\" || code == \"exit;\") {\n                free(line);\n                break;\n            }\n            if (code == \"cls\") {\n                free(line);\n                linenoiseClearScreen();\n                continue;\n            }\n\n            if (code.size() == 0) {\n                free(line);\n                continue;\n            }\n\n            if (str::startsWith(linePtr, \"edit \")) {\n                shellHistoryAdd(linePtr);\n\n                const char* s = linePtr + 5;  // skip \"edit \"\n                while (*s && isspace(*s))\n                    s++;\n\n                edit(s);\n                free(line);\n                continue;\n            }\n\n            gotInterrupted = false;\n            code = finishCode(code);\n            if (gotInterrupted) {\n                cout << endl;\n                free(line);\n                continue;\n            }\n\n            if (code.size() == 0) {\n                free(line);\n                break;\n            }\n\n            bool wascmd = false;\n            {\n                string cmd = linePtr;\n                string::size_type firstSpace;\n                if ((firstSpace = cmd.find(\" \")) != string::npos)\n                    cmd = cmd.substr(0, firstSpace);\n\n                if (cmd.find(\"\\\"\") == string::npos) {\n                    try {\n                        lastLineSuccessful =\n                            scope->exec((string) \"__iscmd__ = shellHelper[\\\"\" + cmd + \"\\\"];\",\n                                        \"(shellhelp1)\",\n                                        false,\n                                        true,\n                                        true);\n                        if (scope->getBoolean(\"__iscmd__\")) {\n                            lastLineSuccessful =\n                                scope->exec((string) \"shellHelper( \\\"\" + cmd + \"\\\" , \\\"\" +\n                                                code.substr(cmd.size()) + \"\\\");\",\n                                            \"(shellhelp2)\",\n                                            false,\n                                            true,\n                                            false);\n                            wascmd = true;\n                        }\n                    } catch (std::exception& e) {\n                        cout << \"error2:\" << e.what() << endl;\n                        wascmd = true;\n                        lastLineSuccessful = false;\n                    }\n                }\n            }\n\n            if (!wascmd) {\n                try {\n                    lastLineSuccessful = scope->exec(code.c_str(), \"(shell)\", false, true, false);\n                    if (lastLineSuccessful) {\n                        scope->exec(\n                            \"shellPrintHelper( __lastres__ );\", \"(shell2)\", true, true, false);\n                    }\n                } catch (std::exception& e) {\n                    cout << \"error:\" << e.what() << endl;\n                    lastLineSuccessful = false;\n                }\n            }\n\n            shellHistoryAdd(code.c_str());\n            free(line);\n        }\n\n        shellHistoryDone();\n    }\n\n    {\n        stdx::lock_guard<stdx::mutex> lk(mongo::shell_utils::mongoProgramOutputMutex);\n        mongo::dbexitCalled = true;\n    }\n    return (lastLineSuccessful ? 0 : 1);\n}\n\n#ifdef _WIN32\nint wmain(int argc, wchar_t* argvW[], wchar_t* envpW[]) {\n    static mongo::StaticObserver staticObserver;\n    int returnCode;\n    try {\n        WindowsCommandLine wcl(argc, argvW, envpW);\n        returnCode = _main(argc, wcl.argv(), wcl.envp());\n    } catch (mongo::DBException& e) {\n        cerr << \"exception: \" << e.what() << endl;\n        returnCode = 1;\n    }\n    quickExit(returnCode);\n}\n#else   // #ifdef _WIN32\nint main(int argc, char* argv[], char** envp) {\n    static mongo::StaticObserver staticObserver;\n    int returnCode;\n    try {\n        returnCode = _main(argc, argv, envp);\n    } catch (mongo::DBException& e) {\n        cerr << \"exception: \" << e.what() << endl;\n        returnCode = 1;\n    }\n    quickExit(returnCode);\n}\n#endif  // #ifdef _WIN32\n"
  },
  {
    "path": "src/robomongo/ssh/CMakeLists.txt",
    "content": "include(CheckIncludeFiles)\ninclude(CheckSymbolExists)\n\n## Platform checks\ncheck_include_files(inttypes.h HAVE_INTTYPES_H)\ncheck_include_files(unistd.h HAVE_UNISTD_H)\ncheck_include_files(stdlib.h HAVE_STDLIB_H)\ncheck_include_files(sys/select.h HAVE_SYS_SELECT_H)\ncheck_include_files(sys/socket.h HAVE_SYS_SOCKET_H)\ncheck_include_files(sys/time.h HAVE_SYS_TIME_H)\ncheck_include_files(arpa/inet.h HAVE_ARPA_INET_H)\ncheck_include_files(netinet/in.h HAVE_NETINET_IN_H)\ncheck_include_files(winsock2.h HAVE_WINSOCK2_H)\n\ncheck_symbol_exists(strcasecmp strings.h HAVE_STRCASECMP)\ncheck_symbol_exists(_stricmp string.h HAVE__STRICMP)\ncheck_symbol_exists(snprintf stdio.h HAVE_SNPRINTF)\ncheck_symbol_exists(_snprintf stdio.h HAVE__SNPRINTF)\ncheck_symbol_exists(__func__ \"\" HAVE___FUNC__)\ncheck_symbol_exists(__FUNCTION__ \"\" HAVE___FUNCTION__)\n\nconfigure_file(\n    ${CMAKE_CURRENT_SOURCE_DIR}/libssh2_config.h.in\n    ${CMAKE_CURRENT_BINARY_DIR}/libssh2_config.h)\n\n# Direct-tcpip sample\nadd_library(ssh ssh.c log.c array.c)\n\ntarget_link_libraries(ssh\n    PUBLIC\n        libssh2)\n\ntarget_include_directories(ssh\n    PUBLIC\n        ${CMAKE_BINARY_DIR}/src\n        ${CMAKE_SOURCE_DIR}/src)\n\n# Server\nadd_executable(server server.c)\n\ntarget_link_libraries(server\n    PRIVATE\n        ssh)\n\ntarget_include_directories(server\n    PRIVATE\n        ${CMAKE_BINARY_DIR}/src\n        ${CMAKE_SOURCE_DIR}/src)\n\n# Tests\nadd_executable(ssh_test test.c)\n\ntarget_link_libraries(ssh_test\n    PRIVATE\n        ssh)\n\ntarget_include_directories(ssh_test\n    PRIVATE\n        ${CMAKE_BINARY_DIR}/src\n        ${CMAKE_SOURCE_DIR}/src)\n"
  },
  {
    "path": "src/robomongo/ssh/README.md",
    "content": "SSH tunnel submodule\n====================\n\nImplemented in vanilla C99 and uses LIBSSH2 library.\n\nNotes\n-----\n\n1. Users of this module should include *only* `ssh.h`. Do not pollute it \nwith unnecessary includes or implementation specific declarations.\n1. Implementation files include `private.h`, which is also includes \n`ssh.h` automatically. \n1. The preferred use of `*` is adjacent to the data name or function name \nand not adjacent to the type name (i.e. `char *data`, not `char* data`)\n1. Public functions and types always should be prefixed with `rbm_ssh_`. \nIt means that all declarations in `ssh.h` should use this prefix.\n1. Private functions and types always should be prefixed with just \n`rbm_`. You may declare file-scoped objects without this prefix, but still\nprefer to always use `rbm_` prefix.\n\n"
  },
  {
    "path": "src/robomongo/ssh/array.c",
    "content": "#include \"robomongo/ssh/private.h\"\n#include <stdlib.h>\n\n/*\n * Adds pointer to array.\n * You should pass your array (sometype**) and size of it (int) by reference.\n * Array can be NULL, in this case new array will be allocated\n * @array Address of (void **) array\n * @currentsize Address of size\n * @data Pointer that should be added to array\n */\nint rbm_array_add(void ***array, int *currentsize, void *data) {\n    if (!*array && *currentsize)\n        return RBM_ERROR;\n\n    int newsize = *currentsize + 1;\n\n    // Acts like malloc when (*array == NULL)\n    void **newarray = realloc(*array, newsize * sizeof(void*));\n    if (!newarray)\n        return RBM_ERROR;\n\n    newarray[*currentsize] = data;\n    *array = newarray;\n    *currentsize = newsize;\n    return RBM_SUCCESS;\n}\n\nint rbm_array_remove(void ***array, int *currentsize, void *data) {\n    int newsize = *currentsize - 1;\n    void **newarray;\n\n    for (int i = 0; i < *currentsize; i++) {\n        if ((*array)[i] != data)\n            continue;\n\n        if (*currentsize == 1) {\n            newarray = NULL;\n        } else {\n            newarray = malloc(newsize * sizeof(void*));\n            if (!newarray)\n                return RBM_ERROR;\n\n            memcpy(newarray, *array, i * sizeof(void*));\n\n            if (i + 1 < *currentsize)\n                memcpy(newarray + i, *array + i + 1, (*currentsize - i - 1) * sizeof(void*));\n        }\n\n        free(*array);\n        *currentsize = newsize;\n        *array = newarray;\n        return RBM_SUCCESS;\n    }\n\n    return RBM_ERROR;\n}\n"
  },
  {
    "path": "src/robomongo/ssh/libssh2_config.h.in",
    "content": "/* Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* Headers */\n#cmakedefine HAVE_UNISTD_H\n#cmakedefine HAVE_INTTYPES_H\n#cmakedefine HAVE_STDLIB_H\n#cmakedefine HAVE_SYS_SELECT_H\n#cmakedefine HAVE_SYS_SOCKET_H\n#cmakedefine HAVE_SYS_TIME_H\n#cmakedefine HAVE_ARPA_INET_H\n#cmakedefine HAVE_NETINET_IN_H\n#cmakedefine HAVE_WINSOCK2_H\n\n/* Functions */\n#cmakedefine HAVE_STRCASECMP\n#cmakedefine HAVE__STRICMP\n#cmakedefine HAVE_SNPRINTF\n#cmakedefine HAVE__SNPRINTF\n\n/* Workaround for platforms without POSIX strcasecmp (e.g. Windows) */\n#ifndef HAVE_STRCASECMP\n# ifdef HAVE__STRICMP\n# define strcasecmp _stricmp\n# define HAVE_STRCASECMP\n# endif\n#endif\n\n/* Symbols */\n#cmakedefine HAVE___FUNC__\n#cmakedefine HAVE___FUNCTION__\n\n/* Workaround for platforms without C90 __func__ */\n#ifndef HAVE___FUNC__\n# ifdef HAVE___FUNCTION__\n# define __func__ __FUNCTION__\n# define HAVE___FUNC__\n# endif\n#endif\n"
  },
  {
    "path": "src/robomongo/ssh/log.c",
    "content": "#include \"robomongo/ssh/private.h\"\n\n#include <errno.h>\n#include <stdio.h>\n\nenum {BUF_SIZE = 1024 };\n\nint log_error(const char *format, ...)\n{\n    int errsave = errno;\n    char buf[BUF_SIZE];\n    va_list args;\n\n    va_start(args, format);\n    vsnprintf(buf, BUF_SIZE, format, args);\n\n    if (errsave) {\n        fprintf(stderr, \"Error (%d): %s. %s\\n\", errno, strerror(errsave), buf);\n    } else {\n        fprintf(stderr, \"Error: %s\\n\", buf);\n    }\n\n    va_end(args);\n    return 1;\n}\n\nint log_msg(const char *format, ...)\n{\n    char buf[BUF_SIZE];\n    va_list args;\n\n    va_start(args, format);\n    vsnprintf(buf, BUF_SIZE, format, args);\n\n    printf(\"%s\\n\", buf);\n\n    va_end(args);\n    return 1;\n}\n\n/*\n * errsave: use 0, if you are not logging errors (i.e. errno == 0).\n */\nvoid ssh_log_v(struct rbm_session* session, enum rbm_ssh_log_type type, const char *format, va_list args, int errsave) {\n    char buf[BUF_SIZE];\n    vsnprintf(buf, BUF_SIZE, format, args);\n\n    if (type == RBM_SSH_LOG_TYPE_ERROR ||\n        type == RBM_SSH_LOG_TYPE_WARN) {\n        if (errsave) {\n            sprintf(session->lasterror, \"%s. %s. (Error #%d)\", strerror(errsave), buf, errsave);\n        } else {\n            sprintf(session->lasterror, \"%s\", buf);\n        }\n\n        fprintf(stderr, \"%s\\n\", session->lasterror);\n        if (session->config->logcontext)\n            session->config->logcallback(session->config->logcontext, session->lasterror, type);\n        return;\n    }\n\n    if (type != RBM_SSH_LOG_TYPE_INFO &&\n        type != RBM_SSH_LOG_TYPE_DEBUG)\n        return;\n\n    if (type > session->config->loglevel)\n        return;\n\n    printf(\"%s\\n\", buf);\n    if (session->config->logcontext)\n        session->config->logcallback(session->config->logcontext, buf, type);\n}\n\nvoid ssh_log_msg(struct rbm_session* session, const char *format, ...) {\n    const int type = RBM_SSH_LOG_TYPE_INFO;\n\n    // For performance reasons, return as quick as possible,\n    // if this level of logging is not enabled\n    if (type > session->config->loglevel)\n        return;\n\n    va_list args;\n    va_start(args, format);\n    ssh_log_v(session, type, format, args, 0);\n    va_end(args);\n}\n\n// When you faced with an error that you are planning to overcome or handle,\n// log it as a warning. If you do not have plan how to proceed further, log\n// as an error.\nvoid ssh_log_warn(struct rbm_session* session, const char *format, ...) {\n    int errsave = errno;\n    const int type = RBM_SSH_LOG_TYPE_WARN;\n\n    // For performance reasons, return as quick as possible,\n    // if this level of logging is not enabled\n    if (type > session->config->loglevel)\n        return;\n\n    va_list args;\n    va_start(args, format);\n    ssh_log_v(session, type, format, args, errsave);\n    va_end(args);\n}\n\nvoid ssh_log_debug(struct rbm_session* session, const char *format, ...) {\n    const int type = RBM_SSH_LOG_TYPE_DEBUG;\n\n    // For performance reasons, return as quick as possible,\n    // if this level of logging is not enabled\n    if (type > session->config->loglevel)\n        return;\n\n    va_list args;\n    va_start(args, format);\n    ssh_log_v(session, type, format, args, 0);\n    va_end(args);\n}\n\nvoid ssh_log_error(struct rbm_session* session, const char *format, ...) {\n    int errsave = errno;\n    va_list args;\n    va_start(args, format);\n    ssh_log_v(session, RBM_SSH_LOG_TYPE_ERROR, format, args, errsave);\n    va_end(args);\n}\n"
  },
  {
    "path": "src/robomongo/ssh/private.h",
    "content": "#ifndef ROBOMONGO_SSH_PRIVATE_H\n#define ROBOMONGO_SSH_PRIVATE_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// We do not need to use IPv6 for local bind. But we do support IPv6 for remote connection.\n// It means we can ignore MSVC warning: \"Use inet_ntop() or InetNtop() instead\" of \"inet_ntoa\"\n#define _WINSOCK_DEPRECATED_NO_WARNINGS\n\n#include <libssh2.h>\n#include <stdarg.h>         // for va_list in log functions\n\n#include \"robomongo/ssh/ssh.h\"\n\n#ifdef _WIN32\n#include \"robomongo/ssh/win.h\"\n#else\n#include \"robomongo/ssh/unix.h\"\n#endif\n\n\n//===----------------------------------------------------------------------===//\n// Common constants\n//===----------------------------------------------------------------------===//\n\nenum {\n    RBM_SUCCESS = 0,\n    RBM_ERROR   = -1,\n    RBM_CHANNEL_CREATION_ERROR   = -10,\n    RBM_BUFSIZE = 16384, // Size of the in/out buffers\n};\n\n//===----------------------------------------------------------------------===//\n// Data structures\n//===----------------------------------------------------------------------===//\n\nstruct rbm_channel {\n    struct rbm_session* session;\n    LIBSSH2_CHANNEL *channel;\n    rbm_socket_t socket;\n    char *inbuf;\n    char *outbuf;\n    int bufmaxsize;\n};\n\nstruct rbm_session {\n    rbm_socket_t localsocket;\n    rbm_socket_t sshsocket;\n    LIBSSH2_SESSION *sshsession;\n    struct rbm_ssh_tunnel_config *config;\n\n    struct rbm_channel **channels;      // array of channels\n    int channelssize;                       // number of channels\n\n    struct rbm_ssh_session *publicsession;\n    char lasterror[2048];\n};\n\n\n// Channels\nstruct rbm_channel *rbm_channel_create(struct rbm_session* session, rbm_socket_t socket, LIBSSH2_CHANNEL *lchannel);\nvoid rbm_channel_close(struct rbm_channel *channel);\nstruct rbm_channel *rbm_channel_find_by_socket(struct rbm_session *session, rbm_socket_t socket);\n\nvoid rbm_session_cleanup(struct rbm_session *session);\nint rbm_open_tunnel(struct rbm_session *connection);\nint rbm_ssh_setup(struct rbm_session *session);\nstatic rbm_socket_t socket_connect(struct rbm_session* session, char *ip, int port);\nLIBSSH2_SESSION *ssh_connect(struct rbm_session *rsession, rbm_socket_t sock, enum rbm_ssh_auth_type type, char *username, char *password,\n                             char *publickeypath, char *privatekeypath, char *passphrase);\nrbm_socket_t socket_listen(struct rbm_session *rsession, char *ip, int *port);\n\n//===----------------------------------------------------------------------===//\n// Logging\n//===----------------------------------------------------------------------===//\n\nint log_error(const char *format, ...);\nint log_msg(const char *format, ...);\n\nvoid ssh_log_v(struct rbm_session *session, enum rbm_ssh_log_type type, const char *format, va_list args, int errsave);\nvoid ssh_log_msg(struct rbm_session *session, const char *format, ...);\nvoid ssh_log_warn(struct rbm_session *session, const char *format, ...);\nvoid ssh_log_debug(struct rbm_session *session, const char *format, ...);\nvoid ssh_log_error(struct rbm_session *session, const char *format, ...);\n\n\n//===----------------------------------------------------------------------===//\n// Utils\n//===----------------------------------------------------------------------===//\n\nint rbm_array_add(void ***array, int *currentsize, void *data);\nint rbm_array_remove(void ***array, int *currentsize, void *data);\n\n#ifdef __cplusplus\n}\n#endif\n#endif // ROBOMONGO_SSH_PRIVATE_H\n"
  },
  {
    "path": "src/robomongo/ssh/server.c",
    "content": "#include \"ssh.h\"\n\n#include <stdio.h>\n\nint main(int argc, char *argv[]) {\n    struct rbm_ssh_tunnel_config config;\n\n    config.authtype = RBM_SSH_AUTH_TYPE_PUBLICKEY;\n    config.localip = \"127.0.0.1\";\n    config.localport = 27040;\n    config.username = \"dmitry\";\n    config.password = \"\";\n\n#ifdef WIN32\n    config.privatekeyfile = \"d:\\\\ubuntik\";\n#else\n    config.privatekeyfile = \"/Users/dmitry/.ssh/ubuntik\";\n#endif\n\n    config.publickeyfile = NULL; //\"/Users/dmitry/.ssh/ubuntik.pub\";\n    config.passphrase = \"\";\n    config.sshserverhost = \"198.61.166.171\";\n    config.sshserverport = 22;\n    config.remotehost = \"localhost\";\n    config.remoteport = 27017;\n    config.logcontext = NULL;\n    config.loglevel = RBM_SSH_LOG_TYPE_DEBUG;\n\n    if (rbm_ssh_init())\n        return 1;\n\n    struct rbm_ssh_session *session = NULL;\n    session = rbm_ssh_session_create(&config);\n    if (!session) {\n        printf(\"Unable to create session. Shutdown\\n\");\n        return 1;\n    }\n\n//    rbm_ssh_session_close(session);\n    printf(\"II About to open tunnel...\\n\");\n\n    if (rbm_ssh_session_setup(session) == -1) {\n        printf(\"Setup failed. Shutdowning...\\n\");\n        rbm_ssh_session_close(session);\n        return 1;\n    }\n\n//    rbm_ssh_session_close(session);\n//\n    printf(\"About to open tunnel...\\n\");\n    if (rbm_ssh_open_tunnel(session) != 0) {\n        printf(\"Tunnel stopped because of error.\\n\");\n        return 1;\n    }\n//\n//    printf(\"Planned shutdown of the tunnel.\");\n    rbm_ssh_cleanup();\n    return 0;\n}\n"
  },
  {
    "path": "src/robomongo/ssh/ssh.c",
    "content": "#include \"robomongo/ssh/private.h\"\n#include \"robomongo/ssh/libssh2_config.h\"\n\n#ifdef WIN32\n#include <windows.h>\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#else\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <sys/time.h>\n#include <netdb.h>\n#endif\n\n#include <stdlib.h>\n#include <errno.h>\n\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n\n#include <signal.h>\n#include <stdio.h>\n\nstatic int handle_new_client_connections(struct rbm_session *connection, int *fdmax, fd_set *masterset);\nstatic int handle_ssh_connections(struct rbm_session *connection, fd_set *masterset);\nstatic int handle_client_connections(struct rbm_session *connection, rbm_socket_t i, fd_set *masterset);\n\nstatic void rbm_sleep_ms(int ms);\nstatic void rbm_socket_close(rbm_socket_t socket);\n\n//===----------------------------------------------------------------------===//\n// Public API\n//===----------------------------------------------------------------------===//\n\n/*\n * Initialize SSH submodule, should be called only once\n * Returns 0 if succeeded, or a negative value for error.\n */\nint rbm_ssh_init() {\n#ifndef WIN32\n    // Ignore SIGPIPE signal. If we will not do that, an attempt to send/write\n    // to the socket that do not have readers will force OS to generate SIGPIPE\n    // signal. Default handler for this signal is a termination of program.\n    // While signal is ignored, send/write will still return error code, that\n    // should be handled by the code.\n    signal(SIGPIPE, SIG_IGN);\n#endif\n\n    int err;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err) {\n        log_error(\"WSAStartup failed with error code: (%d)\", err);\n        return RBM_ERROR;\n    }\n#endif\n\n\n    err = libssh2_init(0);\n    if (err) {\n        log_error(\"Initialization of LIBSSH2 failed with error code: (%d)\", err);\n        return RBM_ERROR;\n    }\n\n    return RBM_SUCCESS;\n}\n\n/*\n * Cleanup SSH submodule, should be called only once\n */\nvoid rbm_ssh_cleanup() {\n    libssh2_exit();\n\n#ifdef WIN32\n    WSACleanup();\n#endif\n}\n\n/*\n * Returns NULL on error, valid rbm_ssh_session* if no errors\n */\nstruct rbm_ssh_session *rbm_ssh_session_create(struct rbm_ssh_tunnel_config *config) {\n    struct rbm_session *session = (struct rbm_session *) malloc(sizeof(struct rbm_session));\n    if (!session)\n        return NULL;\n\n    session->localsocket = rbm_socket_invalid;\n    session->sshsocket = rbm_socket_invalid;\n    session->sshsession = NULL;\n    session->config = config;\n    session->channels = NULL;\n    session->channelssize = 0;\n    session->lasterror[0] = '\\0';\n\n    // Check that loglevel is valid\n    if (config->loglevel != RBM_SSH_LOG_TYPE_ERROR &&\n        config->loglevel != RBM_SSH_LOG_TYPE_WARN &&\n        config->loglevel != RBM_SSH_LOG_TYPE_INFO &&\n        config->loglevel != RBM_SSH_LOG_TYPE_DEBUG) {\n        log_error(\"Invalid log level for SSH submodule\");\n        return NULL;\n    }\n\n    struct rbm_ssh_session *publicsession = (struct rbm_ssh_session *) malloc(sizeof(struct rbm_ssh_session));\n    if (!publicsession)\n        return NULL;\n\n    publicsession->lasterror = session->lasterror;\n\n    // Point to each other\n    publicsession->handle = session;\n    session->publicsession = publicsession;\n\n    return publicsession;\n}\n\n\nvoid rbm_ssh_session_close(struct rbm_ssh_session *sshsession) {\n    struct rbm_session *session = (struct rbm_session*)sshsession->handle;\n    if (session->localsocket != rbm_socket_invalid) {\n        ssh_log_debug(session, \"Closing local accept socket\");\n        rbm_socket_close(session->localsocket);\n        session->localsocket = rbm_socket_invalid;\n    }\n\n    rbm_session_cleanup(session);\n\n    ssh_log_debug(session, \"SSH tunnel successfully closed.\");\n    free(session);\n    free(sshsession);\n}\n\nint rbm_ssh_open_tunnel(struct rbm_ssh_session *sshsession) {\n    struct rbm_session *connection = (struct rbm_session*)sshsession->handle;\n    int rc = 0;\n\n    while (1) {\n        rc = rbm_open_tunnel(connection);\n        if (rc == 0)\n            break;\n\n        if (rc == RBM_CHANNEL_CREATION_ERROR)\n            return RBM_ERROR;\n\n        // Cleanup SSH connection we hope that local connection\n        // will not break so often\n        rbm_session_cleanup(connection);\n        ssh_log_warn(connection, \"Reconnecting SSH tunnel...\");\n\n        if (rbm_ssh_setup(connection) == -1)\n            return RBM_ERROR;\n    }\n\n    return RBM_SUCCESS;\n}\n\n\n// Returns -1 on error, 0 when otherwise\nint rbm_ssh_session_setup(struct rbm_ssh_session *sshsession) {\n    struct rbm_session *session = (struct rbm_session*)sshsession->handle;\n    struct rbm_ssh_tunnel_config *config = session->config;\n\n    if (rbm_ssh_setup(session) == -1)\n        return RBM_ERROR;\n\n    session->localsocket = socket_listen(session, config->localip, (int *) &config->localport);\n    if (session->localsocket == -1) {\n        session->localsocket = rbm_socket_invalid;\n        return RBM_ERROR; // errors are already logged by socket_listen\n    }\n\n    ssh_log_debug(session, \"Waiting for TCP connection on %s:%d...\", config->localip, config->localport);\n\n    return RBM_SUCCESS;\n}\n\n\n//===----------------------------------------------------------------------===//\n// Private API\n//===----------------------------------------------------------------------===//\n\n\n// Returns NULL on error, or valid rbm_ssh_channel otherwise.\nstruct rbm_channel *rbm_channel_create(struct rbm_session* session, rbm_socket_t socket, LIBSSH2_CHANNEL *lchannel) {\n    struct rbm_channel *channel = malloc(sizeof(struct rbm_channel));\n    if (!channel)\n        return NULL;\n\n    char *inbuf = malloc(sizeof(char) * RBM_BUFSIZE);\n    if (!inbuf)\n        return NULL;\n\n    char *outbuf = malloc(sizeof(char) * RBM_BUFSIZE);\n    if (!outbuf)\n        return NULL;\n\n    channel->session = session;\n    channel->channel = lchannel;\n    channel->socket = socket;\n    channel->inbuf = inbuf;\n    channel->outbuf = outbuf;\n    channel->bufmaxsize = RBM_BUFSIZE;\n\n    if (rbm_array_add((void ***)&session->channels, &session->channelssize, channel))\n        return NULL;\n\n    return channel;\n}\n\nvoid rbm_channel_close(struct rbm_channel *channel) {\n    struct rbm_session *session = channel->session;\n    if (rbm_array_remove((void ***)&session->channels, &session->channelssize, channel))\n        return;\n\n    // 3. Close socket\n    if (channel->socket != rbm_socket_invalid) {\n        rbm_socket_close(channel->socket);\n        channel->socket = rbm_socket_invalid;\n    }\n\n    // 1. Free libssh2 channel\n    if (channel->channel) {\n        libssh2_channel_free(channel->channel);\n        channel->channel = NULL;\n    }\n\n    // 2. Free input/output buffers\n    free(channel->inbuf);\n    free(channel->outbuf);\n    channel->inbuf = NULL;\n    channel->outbuf = NULL;\n\n    // 4. Free channel struct\n    free(channel);\n\n    ssh_log_debug(session, \"Channel closed\");\n}\n\n/*\n * Returns channel for specified socket, or NULL otherwise\n */\nstruct rbm_channel *rbm_channel_find_by_socket(struct rbm_session *session, rbm_socket_t socket) {\n    for (int i = 0; i < session->channelssize; i++)\n        if (session->channels[i]->socket == socket)\n            return session->channels[i];\n\n    return NULL;\n}\n\n// Returns -1 on error, 0 when otherwise\nint rbm_ssh_setup(struct rbm_session *session) {\n    struct rbm_ssh_tunnel_config *config = session->config;\n\n    ssh_log_debug(session, \"Connecting to SSH server (%s:%d)...\", config->sshserverhost, config->sshserverport);\n\n    session->sshsocket = socket_connect(session, config->sshserverhost, config->sshserverport);\n    if (session->sshsocket == -1) {\n        session->sshsocket = rbm_socket_invalid;\n        return RBM_ERROR; // errors are already logged by socket_connect\n    }\n\n    session->sshsession = ssh_connect(session, session->sshsocket, config->authtype, config->username, config->password,\n                                      config->publickeyfile, config->privatekeyfile, config->passphrase);\n    if (session->sshsession == 0) {\n        return RBM_ERROR; // errors are already logged by ssh_connect\n    }\n\n    // Must use non-blocking IO hereafter due to the current libssh3 API\n    libssh2_session_set_blocking(session->sshsession, 0);\n\n    return RBM_SUCCESS;\n}\n\nvoid rbm_session_cleanup(struct rbm_session *session) {\n    if (session == NULL)\n        return;\n\n    // Order is important:\n    // 1. free libssh2 channels (and client sockets)\n    // 2. free libssh2 session\n    // 3. close ssh socket\n\n    // 1.\n    ssh_log_debug(session, \"Closing channels\");\n    while (session->channelssize > 0) {\n        rbm_channel_close(session->channels[0]);\n    }\n\n    // 2.\n    if (session->sshsession) {\n        ssh_log_debug(session, \"Closing SSH session\");\n        libssh2_session_disconnect(session->sshsession, \"Client disconnecting normally\");\n        libssh2_session_free(session->sshsession);\n        session->sshsession = NULL;\n    }\n\n    // 3.\n    if (session->sshsocket != rbm_socket_invalid) {\n        ssh_log_debug(session, \"Closing SSH socket\");\n        rbm_socket_close(session->sshsocket);\n        session->sshsocket = rbm_socket_invalid;\n    }\n}\n\n\nint rbm_open_tunnel(struct rbm_session *connection) {\n    rbm_socket_t local_socket = connection->localsocket;\n    rbm_socket_t ssh_socket = connection->sshsocket;\n\n    const int maxerrors = 25;   // number of serial errors, when we probably should stop the loop\n    int errors = 0;             // counter for serial errors\n    int rc = 0;\n\n    int fdmax;       // maximum socket (file descriptor) number\n    int isocket;     // index for traversing sockets\n    fd_set masterset, readset;\n    FD_ZERO(&masterset);\n\n    // Add the listener to the master set\n    FD_SET(local_socket, &masterset);\n    FD_SET(ssh_socket, &masterset);\n\n    // Keep track of the biggest file descriptor\n    fdmax = local_socket > ssh_socket ? local_socket : ssh_socket;\n\n    while (errors < maxerrors) {\n\n        readset = masterset; // copy set\n\n        // If local (accept) socket is closed, it means that\n        // session is closed and we should stop our work\n        if (!FD_ISSET(local_socket, &readset))\n            break;\n\n        ssh_log_debug(connection, \"* Okay, we are ready to select.\");\n        if (select(fdmax + 1, &readset, NULL, NULL, NULL) == -1) {\n            ssh_log_error(connection, \"Error on select()\");\n            break;\n        }\n        ssh_log_debug(connection, \"* Selected!\");\n\n        // Run through the existing connections looking for data to read\n        for(isocket = 0; isocket <= fdmax; isocket++) {\n\n            // Skip connections that are not available for reading\n            if (!FD_ISSET(isocket, &readset))\n                continue;\n\n            if (isocket == local_socket) {\n                rc = handle_new_client_connections(connection, &fdmax, &masterset);\n                goto next;\n            }\n\n            if (isocket == ssh_socket) {\n                rc = handle_ssh_connections(connection, &masterset);\n                goto next;\n            }\n\n            rc = handle_client_connections(connection, isocket, &masterset);\n\n            next:\n            // Increment \"errors\" counter, if we found an error,\n            // or zero it, if not.\n            errors = (rc == -2) ? errors + 1 : 0;\n            if (errors > 0) {\n                ssh_log_warn(connection, \"*** COLLECTED %d AGAIN ***\", errors);\n            }\n\n            if (rc == -1) {\n                ssh_log_warn(connection, \"SSH tunnel shutdown because of error\");\n                return RBM_ERROR;\n            }\n\n            if (rc == RBM_CHANNEL_CREATION_ERROR) {\n                return RBM_CHANNEL_CREATION_ERROR;\n            }\n        }\n    }\n\n    if (errors >= maxerrors) {\n        ssh_log_warn(connection, \"SSH tunnel shutdown because of series of successive EAGAIN errors\");\n        return RBM_ERROR;\n    }\n\n    rbm_ssh_session_close(connection->publicsession);\n    return RBM_SUCCESS;\n}\n\n// Return -1 on error. 0 otherwise.\nstatic int handle_new_client_connections(struct rbm_session *connection, int *fdmax, fd_set *masterset) {\n    rbm_socket_t local_socket = connection->localsocket;\n    rbm_socket_t ssh_socket = connection->sshsocket;\n    LIBSSH2_SESSION* session = connection->sshsession;\n    struct rbm_ssh_tunnel_config* config = connection->config;\n    rbm_socket_t newfd = rbm_socket_invalid;\n\n    ssh_log_debug(connection, \"Data on accept socket is available\");\n\n    struct sockaddr_in remoteaddr;\n    socklen_t slen = sizeof(remoteaddr);\n\n    // handle new connections\n    if ((newfd = accept(local_socket, (struct sockaddr *) &remoteaddr, &slen)) == -1) {\n        ssh_log_error(connection, \"Error on accept()\");\n        return RBM_ERROR;\n    } else {\n        FD_SET(newfd, masterset); // add to master set\n\n        if (newfd > *fdmax) {       // keep track of the maximum\n            *fdmax = newfd;\n        }\n\n        ssh_log_debug(connection, \"New connection from %s on socket %d\", inet_ntoa(remoteaddr.sin_addr), newfd);\n    }\n\n    LIBSSH2_CHANNEL *channel = NULL;\n    int maxattempts = 25; //45;\n    int attempts = 0;\n    while (attempts < maxattempts) {\n        ++attempts;\n        channel = libssh2_channel_direct_tcpip_ex(session, config->remotehost, config->remoteport,\n                                                  config->localip, config->localport);\n\n        int errsave = errno;\n        if (!channel) {\n            int lerr = libssh2_session_last_error(connection->sshsession, NULL, NULL, 0);\n\n            ssh_log_warn(connection, \"Could not open the direct TCP/IP channel (%d)\", lerr);\n\n            // Error 35: Resource temporarily unavailable.\n            if (lerr == LIBSSH2_ERROR_EAGAIN) {\n                rbm_sleep_ms(200);\n//                usleep(200 * 1000);\n                continue;\n            }\n\n            break;\n        }\n\n        ssh_log_debug(connection, \"Channel successfully created!\");\n        break;\n    }\n\n    if (!channel) {\n        ssh_log_error(connection, \"Failed to create SSH channel\");\n        return RBM_CHANNEL_CREATION_ERROR;\n    }\n\n    if (rbm_channel_create(connection, newfd, channel) == NULL) {\n        return RBM_ERROR;\n    }\n\n    return RBM_SUCCESS;\n}\n\n//  0: success\n// -1:\nstatic int handle_ssh_connections(struct rbm_session *connection, fd_set *masterset) {\n    const int AGAIN = -2;\n    struct rbm_ssh_tunnel_config* config = connection->config;\n\n    ssh_log_debug(connection, \"Data on SSH socket is available\");\n    ssh_log_debug(connection, \"[%d]  <-  Number of channels\", connection->channelssize);\n\n    if (connection->channelssize == 0) {\n        FD_CLR(connection->localsocket, masterset); // remove from master set\n        FD_CLR(connection->sshsocket, masterset);   // remove from master set\n        return RBM_SUCCESS;\n    }\n\n    int s = 0;\n    int result = RBM_SUCCESS;\n    int eagain = 0;\n    while (s < connection->channelssize) {\n        struct rbm_channel *context = connection->channels[s];\n        ++s;\n\n        int firstflag = 1;\n        while (1) {\n            int len;\n            len = libssh2_channel_read(context->channel, context->outbuf, context->bufmaxsize);\n            if (len == LIBSSH2_ERROR_EAGAIN) {\n\n                if (firstflag) {\n                    ++eagain;\n\n                    if (eagain == connection->channelssize) {\n                        result = AGAIN;\n                        ssh_log_warn(connection, \"All channels are in a non ready state (EAGAIN)\");\n                    }\n                }\n\n                // Proceed with the next channel\n                break;\n            } else if (len < 0) {\n\n                // ETIMEDOUT (60) Connection timed out\n                // We need to reconnect\n                // if (errno == 60) {\n                //    return 2;\n                // }\n                // Endless cycle:\n                // Network is down. libssh2_channel_read: -43. (Error #50)\n\n                result = RBM_ERROR;\n                ssh_log_error(connection, \"libssh2_channel_read: %d\", len);\n                return RBM_ERROR;\n            }\n\n            firstflag = 0;\n            ssh_log_debug(connection, \"Received %d bytes from tunnel\", len);\n\n            int wr = 0;\n            int rc = 0; // result\n            while (wr < len) {\n                rc = send(context->socket, context->outbuf + wr, len - wr, 0);\n                if (rc <= 0) {\n                    result = RBM_ERROR;\n                    ssh_log_error(connection, \"Failure to write data to client\");\n                    break;\n                }\n                wr += rc;\n            }\n            if (libssh2_channel_eof(context->channel)) {\n                result = RBM_SUCCESS;\n                ssh_log_debug(connection, \"The server at %s:%d disconnected!\\n\",\n                              config->remotehost, config->remoteport);\n                break;\n            }\n        }\n    }\n\n    return result;\n}\n\nstatic int handle_client_connections(struct rbm_session *connection, rbm_socket_t i, fd_set *masterset) {\n    int result = RBM_SUCCESS;\n    ssh_log_debug(connection, \"Data on client socket is available\");\n\n    struct rbm_channel *context = rbm_channel_find_by_socket(connection, i);\n    if (!context) {\n        rbm_socket_close(i); // bye!\n        FD_CLR(i, masterset); // remove from master set\n        return RBM_ERROR;\n    }\n\n    // Read data from a client\n    int nbytes = recv(context->socket, context->inbuf, context->bufmaxsize, 0);\n    if (nbytes <= 0) {\n        if (nbytes == 0) {\n            // Normal situation\n            result = RBM_SUCCESS;\n            ssh_log_debug(connection, \"Client disconnected\");\n        } else {\n            // Got error\n            result = RBM_ERROR;\n            ssh_log_error(connection, \"Error when recv()\");\n        }\n\n        // In both these cases, close and cleanup connection\n//        rbm_socket_close(context->socket); // bye!\n        FD_CLR(context->socket, masterset); // remove from master set\n        rbm_channel_close(context);\n\n        if (connection->channelssize == 0) {\n            FD_CLR(connection->localsocket, masterset); // remove from master set\n            FD_CLR(connection->sshsocket, masterset);   // remove from master set\n        }\n\n        return result;\n    }\n    ssh_log_debug(connection, \"Received %d bytes from client\", nbytes);\n\n    // Write data to ssh tunnel\n    const int againmax = 100;\n    int again = 0;\n    int wr = 0;\n    int rc = 0; // result\n    while (wr < nbytes) {\n        rc = libssh2_channel_write(context->channel, context->inbuf + wr, nbytes - wr);\n        if (LIBSSH2_ERROR_EAGAIN == rc) {\n            ++again;\n\n            if (again > againmax) {\n                ssh_log_warn(connection, \"Number of attempts to libssh2_channel_write exсeed max value\");\n                return RBM_ERROR;\n            }\n\n            continue;\n        }\n        if (rc < 0) {\n            ssh_log_error(connection, \"Failed to write to SSH channel\");\n            return RBM_ERROR;\n        }\n        wr += rc;\n    }\n    ssh_log_debug(connection, \"Written %d bytes to tunnel\", wr);\n\n    return RBM_SUCCESS;\n}\n\n/*\n * Returns socket if succeed, otherwise -1 on error\n */\nstatic rbm_socket_t socket_connect(struct rbm_session* session, char *ip, int port) {\n    rbm_socket_t sock;\n    struct addrinfo hints, *res;\n    int err;\n    char cport[20];\n\n    // We need port as decimal chars for \"getaddrinfo\"\n    sprintf(cport, \"%d\", port);\n\n    memset(&hints, 0, sizeof(hints));\n    hints.ai_family = PF_UNSPEC;\n    hints.ai_socktype = SOCK_STREAM;\n    err = getaddrinfo(ip, cport, &hints, &res);\n    if (err) {\n        ssh_log_error(session, \"Failed to get address info\");\n        return -1;\n    }\n\n    sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);\n    if (sock == rbm_socket_invalid) {\n        ssh_log_error(session, \"Failed to open socket\");\n        return -1;\n    }\n\n    /* Connect to SSH server */\n    if (connect(sock, res->ai_addr, res->ai_addrlen) != 0) {\n        ssh_log_error(session, \"Failed to connect to %s:%d\", ip, port);\n        return -1;\n    }\n\n    freeaddrinfo(res);\n    return sock;\n}\n\n/*\n * Returns socket (binded and in listen state) if succeed, otherwise (rbm_socket_invalid) on error\n */\nrbm_socket_t socket_listen(struct rbm_session *rsession, char *ip, int *port) {\n    rbm_socket_t listensock;\n    struct sockaddr_in sin;\n\n#ifdef WIN32\n    char sockopt;\n#else\n    int sockopt;\n#endif\n\n    socklen_t sinlen;\n\n    listensock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);\n    if (listensock == rbm_socket_invalid) {\n        ssh_log_error(rsession, \"Failed to open socket\");\n        return rbm_socket_invalid;\n    }\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(0); // Bind to any available port (htons is not needed, but still it's here)\n    if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(ip))) {\n        ssh_log_error(rsession, \"inet_addr\");\n        return rbm_socket_invalid;\n    }\n\n    sockopt = 1;\n    setsockopt(listensock, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt));\n    sinlen = sizeof(sin);\n    if (-1 == bind(listensock, (struct sockaddr *)&sin, sinlen)) {\n        ssh_log_error(rsession, \"Cannot bind to port %d\", port);\n        return rbm_socket_invalid;\n    }\n\n    if (-1 == listen(listensock, 2)) {\n        ssh_log_error(rsession, \"Failed to listen opened socket\");\n        return rbm_socket_invalid;\n    }\n\n    if (getsockname(listensock, (struct sockaddr *)&sin, &sinlen) == -1) {\n        ssh_log_error(rsession, \"Failed to get socket address\");\n        return rbm_socket_invalid;\n    }\n\n    *port = ntohs(sin.sin_port);\n    return listensock;\n\n}\n\n/*\n * Returns 0 if error.\n */\nLIBSSH2_SESSION *ssh_connect(struct rbm_session *rsession, rbm_socket_t sock, enum rbm_ssh_auth_type type, char *username, char *password,\n                             char *publickeypath, char *privatekeypath, char *passphrase) {\n    int rc, auth = RBM_SSH_AUTH_TYPE_NONE;\n    LIBSSH2_SESSION *session;\n    const char *fingerprint;\n    char *userauthlist;\n\n    ssh_log_debug(rsession, \"ssh_connect: username: %s\", username);\n    ssh_log_debug(rsession, \"ssh_connect: privatekeyfile: %s\", privatekeypath);\n    ssh_log_debug(rsession, \"ssh_connect: publickeyfile: %s\", publickeypath);\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if (!session) {\n        ssh_log_error(rsession, \"Could not initialize SSH session\");\n        return 0;\n    }\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if (rc) {\n        ssh_log_error(rsession, \"Error when starting up SSH session: %d\\n\", rc);\n        return 0;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n\n    /*\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++)\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    fprintf(stderr, \"\\n\");\n    */\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    ssh_log_debug(rsession, \"Authentication methods: %s\", userauthlist);\n    if (strstr(userauthlist, \"password\"))\n        auth |= RBM_SSH_AUTH_TYPE_PASSWORD;\n    if (strstr(userauthlist, \"publickey\"))\n        auth |= RBM_SSH_AUTH_TYPE_PUBLICKEY;\n\n    // If authentication by password is available\n    // and was chosen by the user, then use it\n    if (auth & RBM_SSH_AUTH_TYPE_PASSWORD && type == RBM_SSH_AUTH_TYPE_PASSWORD) {\n        if (libssh2_userauth_password(session, username, password)) {\n            ssh_log_error(rsession, \"Authentication by password failed\");\n            return 0;\n        }\n        ssh_log_debug(rsession, \"Authentication by password succeeded.\");\n        // If authentication by key is available\n        // and was chosen by the user, then use it\n    } else if (auth & RBM_SSH_AUTH_TYPE_PUBLICKEY && type == RBM_SSH_AUTH_TYPE_PUBLICKEY) {\n        rc = libssh2_userauth_publickey_fromfile(session, username, publickeypath, privatekeypath, passphrase);\n        if (rc) {\n            ssh_log_error(rsession, \"Authentication by key (%s) failed (Error %d)\", privatekeypath, rc);\n            return 0;\n        }\n        ssh_log_debug(rsession, \"Authentication by key succeeded.\");\n    } else {\n        ssh_log_error(rsession, \"No supported authentication methods found\");\n        return 0;\n    }\n\n    return session;\n}\n\nstatic void rbm_sleep_ms(int ms) {\n#ifdef WIN32\n    Sleep(ms);\n#else\n    usleep(ms * 1000);\n#endif\n}\n\nstatic void rbm_socket_close(rbm_socket_t socket) {\n#ifdef WIN32\n    closesocket(socket);\n#else\n    close(socket);\n#endif\n}\n"
  },
  {
    "path": "src/robomongo/ssh/ssh.h",
    "content": "#ifndef ROBOMONGO_SSH_H\n#define ROBOMONGO_SSH_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nenum rbm_ssh_log_type {\n    RBM_SSH_LOG_TYPE_ERROR  = 1,\n    RBM_SSH_LOG_TYPE_WARN   = 2,\n    RBM_SSH_LOG_TYPE_INFO   = 3,\n    RBM_SSH_LOG_TYPE_DEBUG  = 100 // log as much as possible\n};\n\nenum rbm_ssh_auth_type {\n    RBM_SSH_AUTH_TYPE_NONE       = 0,\n    RBM_SSH_AUTH_TYPE_PASSWORD   = 1,\n    RBM_SSH_AUTH_TYPE_PUBLICKEY  = 2\n};\n\n/*\n * SSH Tunnel configuration\n */\nstruct rbm_ssh_tunnel_config {\n    enum rbm_ssh_auth_type authtype;\n\n    // Keys and optional passphrase\n    char *privatekeyfile;\n    char *publickeyfile;\n    char *passphrase;   // May be NULL or \"\"\n\n    // Local IP and port to bind and listen to\n    char *localip;\n    unsigned int localport;\n\n    // Remote host (domain or IPv4/v6) and port to connect to\n    char *remotehost;   // Resolved by the remote server\n    unsigned int remoteport;\n\n    // Username and password of remote user\n    char *username;\n    char *password;     // May be NULL or \"\"\n\n    // Remote host (domain or IPv4/v6)\n    char *sshserverhost;\n    unsigned int sshserverport;\n\n    // Logging facilities\n    enum rbm_ssh_log_type loglevel;\n    void *logcontext;   // Pointer to user-defined data (can be NULL)\n    void (*logcallback)(void *logcontext, char *message, int level);\n};\n\nstruct rbm_ssh_session {\n    char *lasterror;\n    void *handle;    // opaque pointer to rbm_session\n};\n\nint rbm_ssh_init();\nvoid rbm_ssh_cleanup();\n\nstruct rbm_ssh_session* rbm_ssh_session_create(struct rbm_ssh_tunnel_config *config);\nint rbm_ssh_open_tunnel(struct rbm_ssh_session *connection);\nint rbm_ssh_session_setup(struct rbm_ssh_session *session);\nvoid rbm_ssh_session_close(struct rbm_ssh_session *session);\n\n\n#ifdef __cplusplus\n}\n#endif\n#endif // ROBOMONGO_SSH_H\n"
  },
  {
    "path": "src/robomongo/ssh/temp/direct_tcpip.c",
    "content": "#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef WIN32\n#include <windows.h>\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#else\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <sys/time.h>\n#endif\n\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#include <sys/types.h>\n#ifdef HAVE_SYS_SELECT_H\n#include <sys/select.h>\n#endif\n\n#ifndef INADDR_NONE\n#define INADDR_NONE (in_addr_t)-1\n#endif\n\nconst char *keyfile1 = \"/Users/dmitry/.ssh/ubuntik.pub\";\nconst char *keyfile2 = \"/Users/dmitry/.ssh/ubuntik\";\nconst char *username = \"username\";\nconst char *password = \"\";\n\nconst char *server_ip = \"127.0.0.1\";\n\nconst char *local_listenip = \"127.0.0.1\";\nunsigned int local_listenport = 2222;\n\nconst char *remote_desthost = \"localhost\"; /* resolved by the server */\nunsigned int remote_destport = 22;\n\nenum {\n    AUTH_NONE = 0,\n    AUTH_PASSWORD,\n    AUTH_PUBLICKEY\n};\n\nint main(int argc, char *argv[])\n{\n    int rc, i, auth = AUTH_NONE;\n    struct sockaddr_in sin;\n    socklen_t sinlen;\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel = NULL;\n    const char *shost;\n    unsigned int sport;\n    fd_set fds;\n    struct timeval tv;\n    ssize_t len, wr;\n    char buf[16384];\n\n#ifdef WIN32\n    char sockopt;\n    SOCKET sock = INVALID_SOCKET;\n    SOCKET listensock = INVALID_SOCKET, forwardsock = INVALID_SOCKET;\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#else\n    int sockopt, sock = -1;\n    int listensock = -1, forwardsock = -1;\n#endif\n\n    if (argc > 1)\n        server_ip = argv[1];\n    if (argc > 2)\n        username = argv[2];\n    if (argc > 3)\n        password = argv[3];\n    if (argc > 4)\n        local_listenip = argv[4];\n    if (argc > 5)\n        local_listenport = atoi(argv[5]);\n    if (argc > 6)\n        remote_desthost = argv[6];\n    if (argc > 7)\n        remote_destport = atoi(argv[7]);\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Connect to SSH server */\n    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);\n#ifdef WIN32\n    if (sock == INVALID_SOCKET) {\n        fprintf(stderr, \"failed to open socket!\\n\");\n        return -1;\n    }\n#else\n    if (sock == -1) {\n        perror(\"socket\");\n        return -1;\n    }\n#endif\n\n    sin.sin_family = AF_INET;\n    if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(server_ip))) {\n        perror(\"inet_addr\");\n        return -1;\n    }\n    sin.sin_port = htons(22);\n    if (connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if(!session) {\n        fprintf(stderr, \"Could not initialize SSH session!\\n\");\n        return -1;\n    }\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Error when starting up SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++)\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    fprintf(stderr, \"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    fprintf(stderr, \"Authentication methods: %s\\n\", userauthlist);\n    if (strstr(userauthlist, \"password\"))\n        auth |= AUTH_PASSWORD;\n    if (strstr(userauthlist, \"publickey\"))\n        auth |= AUTH_PUBLICKEY;\n\n    /* check for options */\n    if(argc > 8) {\n        if ((auth & AUTH_PASSWORD) && !strcasecmp(argv[8], \"-p\"))\n            auth = AUTH_PASSWORD;\n        if ((auth & AUTH_PUBLICKEY) && !strcasecmp(argv[8], \"-k\"))\n            auth = AUTH_PUBLICKEY;\n    }\n\n    if (auth & AUTH_PASSWORD) {\n        if (libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else if (auth & AUTH_PUBLICKEY) {\n        fprintf(stderr, \"\\tPassword: %s\\n\", password);\n        if (libssh2_userauth_publickey_fromfile(session, username, keyfile1,\n                                                keyfile2, password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed!\\n\");\n            goto shutdown;\n        }\n        fprintf(stderr, \"\\tAuthentication by public key succeeded.\\n\");\n    } else {\n        fprintf(stderr, \"No supported authentication methods found!\\n\");\n        goto shutdown;\n    }\n\n    listensock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);\n#ifdef WIN32\n    if (listensock == INVALID_SOCKET) {\n        fprintf(stderr, \"failed to open listen socket!\\n\");\n        return -1;\n    }\n#else\n    if (listensock == -1) {\n        perror(\"socket\");\n        return -1;\n    }\n#endif\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(local_listenport);\n    if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(local_listenip))) {\n        perror(\"inet_addr\");\n        goto shutdown;\n    }\n    sockopt = 1;\n    setsockopt(listensock, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt));\n    sinlen=sizeof(sin);\n    if (-1 == bind(listensock, (struct sockaddr *)&sin, sinlen)) {\n        perror(\"bind\");\n        goto shutdown;\n    }\n    if (-1 == listen(listensock, 2)) {\n        perror(\"listen\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"Waiting for TCP connection on %s:%d...\\n\",\n        inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));\n\n    forwardsock = accept(listensock, (struct sockaddr *)&sin, &sinlen);\n#ifdef WIN32\n    if (forwardsock == INVALID_SOCKET) {\n        fprintf(stderr, \"failed to accept forward socket!\\n\");\n        goto shutdown;\n    }\n#else\n    if (forwardsock == -1) {\n        perror(\"accept\");\n        goto shutdown;\n    }\n#endif\n\n    shost = inet_ntoa(sin.sin_addr);\n    sport = local_listenport; // ntohs(sin.sin_port);\n\n    fprintf(stderr, \"Forwarding connection from %s:%d here to remote %s:%d\\n\",\n        shost, sport, remote_desthost, remote_destport);\n\n    channel = libssh2_channel_direct_tcpip_ex(session, remote_desthost,\n        remote_destport, shost, sport);\n    if (!channel) {\n        fprintf(stderr, \"Could not open the direct-tcpip channel!\\n\"\n                \"(Note that this can be a problem at the server!\"\n                \" Please review the server logs.)\\n\");\n        goto shutdown;\n    }\n\n    /* Must use non-blocking IO hereafter due to the current libssh2 API */\n    libssh2_session_set_blocking(session, 0);\n\n    while (1) {\n        FD_ZERO(&fds);\n        FD_SET(forwardsock, &fds);\n        tv.tv_sec = 0;\n        tv.tv_usec = 100000;\n        rc = select(forwardsock + 1, &fds, NULL, NULL, &tv);\n        if (-1 == rc) {\n            perror(\"select\");\n            goto shutdown;\n        }\n        if (rc && FD_ISSET(forwardsock, &fds)) {\n            len = recv(forwardsock, buf, sizeof(buf), 0);\n            if (len < 0) {\n                perror(\"read\");\n                goto shutdown;\n            } else if (0 == len) {\n                fprintf(stderr, \"The client at %s:%d disconnected!\\n\", shost,\n                    sport);\n                goto shutdown;\n            }\n            wr = 0;\n            while(wr < len) {\n                i = libssh2_channel_write(channel, buf + wr, len - wr);\n                if (LIBSSH2_ERROR_EAGAIN == i) {\n                    continue;\n                }\n                if (i < 0) {\n                    fprintf(stderr, \"libssh2_channel_write: %d\\n\", i);\n                    goto shutdown;\n                }\n                wr += i;\n            }\n        }\n        while (1) {\n            len = libssh2_channel_read(channel, buf, sizeof(buf));\n            if (LIBSSH2_ERROR_EAGAIN == len)\n                break;\n            else if (len < 0) {\n                fprintf(stderr, \"libssh2_channel_read: %d\", (int)len);\n                goto shutdown;\n            }\n            wr = 0;\n            while (wr < len) {\n                i = send(forwardsock, buf + wr, len - wr, 0);\n                if (i <= 0) {\n                    perror(\"write\");\n                    goto shutdown;\n                }\n                wr += i;\n            }\n            if (libssh2_channel_eof(channel)) {\n                fprintf(stderr, \"The server at %s:%d disconnected!\\n\",\n                    remote_desthost, remote_destport);\n                goto shutdown;\n            }\n        }\n    }\n\nshutdown:\n#ifdef WIN32\n    closesocket(forwardsock);\n    closesocket(listensock);\n#else\n    close(forwardsock);\n    close(listensock);\n#endif\n    if (channel)\n        libssh2_channel_free(channel);\n    libssh2_session_disconnect(session, \"Client disconnecting normally\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/robomongo/ssh/temp/internal.h",
    "content": "#include \"robomongo/ssh/ssh.h\"\n\n#include <stdarg.h>\n\nint log_error(const char *format, ...);\nint log_msg(const char *format, ...);\n\nvoid ssh_log_v(rbm_ssh_session* session, enum rbm_ssh_log_type type, const char *format, va_list args, int errsave);\nvoid ssh_log_msg(rbm_ssh_session* session, const char *format, ...);\nvoid ssh_log_warn(rbm_ssh_session* session, const char *format, ...);\nvoid ssh_log_debug(rbm_ssh_session* session, const char *format, ...);\nvoid ssh_log_error(rbm_ssh_session* session, const char *format, ...);\n"
  },
  {
    "path": "src/robomongo/ssh/temp/temp_ssh.c",
    "content": "#include \"robomongo/ssh/ssh.h\"\n#include \"robomongo/ssh/internal.h\"\n#include \"robomongo/ssh/libssh2_config.h\"\n\n#ifdef WIN32\n#include <windows.h>\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#else\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <sys/time.h>\n#endif\n\n#include <fcntl.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdio.h>\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#include <sys/types.h>\n#ifdef HAVE_SYS_SELECT_H\n#include <sys/select.h>\n#endif\n\n#ifndef INADDR_NONE\n#define INADDR_NONE (in_addr_t)-1\n#endif\n\n/*\n * Initialises Sockets and Libssh\n * Returns 0 if initialization succeeds\n */\nint rbm_ssh_init() {\n    int err;\n#ifdef WIN32\n    WSADATA wsadata;\n#endif\n\n#ifdef WIN32\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        log_error(\"WSAStartup failed with error: %d\", err);\n        return 1;\n    }\n#endif\n\n    err = libssh2_init (0);\n    if (err != 0) {\n        log_error(\"libssh2 initialization failed (%d)\", err);\n        return 1;\n    }\n\n    return 0;\n}\n\n/*\n * Cleanups Sockets and Libssh\n */\nvoid rbm_ssh_cleanup() {\n    libssh2_exit();\n\n#ifdef WIN32\n    WSACleanup();\n#endif\n}\n\n\n/*\n * Returns socket if succeed, otherwise -1 on error\n */\nstatic rbm_socket_t socket_connect(rbm_ssh_session* session, char *ip, int port) {\n    rbm_socket_t sock;\n    struct sockaddr_in sin;\n\n    /* Connect to SSH server */\n    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);\n    if (sock == rbm_socket_invalid) {\n        ssh_log_error(session, \"Failed to open socket\");\n        return -1;\n    }\n\n    sin.sin_family = AF_INET;\n    if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(ip))) {\n        ssh_log_error(session, \"Call to inet_addr failed\");\n        return -1;\n    }\n\n    sin.sin_port = htons(port);\n    if (connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) {\n        ssh_log_error(session, \"Failed to connect to %s:%d\", ip, port);\n        return -1;\n    }\n\n    return sock;\n}\n\n/*\n * Returns socket (binded and in listen state) if succeed, otherwise (rbm_socket_invalid) on error\n */\nrbm_socket_t socket_listen(rbm_ssh_session *rsession, char *ip, int *port) {\n    rbm_socket_t listensock;\n    struct sockaddr_in sin;\n    int sockopt;\n    socklen_t sinlen;\n\n    listensock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);\n    if (listensock == rbm_socket_invalid) {\n        ssh_log_error(rsession, \"Failed to open socket\");\n        return rbm_socket_invalid;\n    }\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(0); // Bind to any available port (htons is not needed, but still it's here)\n    if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(ip))) {\n        ssh_log_error(rsession, \"inet_addr\");\n        return rbm_socket_invalid;\n    }\n\n    sockopt = 1;\n    setsockopt(listensock, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt));\n    sinlen = sizeof(sin);\n    if (-1 == bind(listensock, (struct sockaddr *)&sin, sinlen)) {\n        ssh_log_error(rsession, \"Cannot bind to port %d\", port);\n        return rbm_socket_invalid;\n    }\n\n    if (-1 == listen(listensock, 2)) {\n        ssh_log_error(rsession, \"Failed to listen opened socket\");\n        return rbm_socket_invalid;\n    }\n\n    if (getsockname(listensock, (struct sockaddr *)&sin, &sinlen) == -1) {\n        ssh_log_error(rsession, \"Failed to get socket address\");\n        return rbm_socket_invalid;\n    }\n\n    *port = ntohs(sin.sin_port);\n    return listensock;\n\n}\n\n/*\n * Returns 0 if error.\n */\nLIBSSH2_SESSION *ssh_connect(rbm_ssh_session *rsession, rbm_socket_t sock, enum rbm_ssh_auth_type type, char *username, char *password,\n                             char *publickeypath, char *privatekeypath, char *passphrase) {\n    int rc, i, auth = RBM_SSH_AUTH_TYPE_NONE;\n    LIBSSH2_SESSION *session;\n    const char *fingerprint;\n    char *userauthlist;\n\n    ssh_log_debug(rsession, \"ssh_connect: username: %s\", username);\n    ssh_log_debug(rsession, \"ssh_connect: password: %s\", password);\n    ssh_log_debug(rsession, \"ssh_connect: privatekeyfile: %s\", privatekeypath);\n    ssh_log_debug(rsession, \"ssh_connect: publickeyfile: %s\", publickeypath);\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if (!session) {\n        ssh_log_error(rsession, \"Could not initialize SSH session\");\n        return 0;\n    }\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if (rc) {\n        ssh_log_error(rsession, \"Error when starting up SSH session: %d\\n\", rc);\n        return 0;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n\n    /*\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++)\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    fprintf(stderr, \"\\n\");\n    */\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    ssh_log_debug(rsession, \"Authentication methods: %s\", userauthlist);\n    if (strstr(userauthlist, \"password\"))\n        auth |= RBM_SSH_AUTH_TYPE_PASSWORD;\n    if (strstr(userauthlist, \"publickey\"))\n        auth |= RBM_SSH_AUTH_TYPE_PUBLICKEY;\n\n    // If authentication by password is available\n    // and was chosen by the user, then use it\n    if (auth & RBM_SSH_AUTH_TYPE_PASSWORD && type == RBM_SSH_AUTH_TYPE_PASSWORD) {\n        if (libssh2_userauth_password(session, username, password)) {\n            ssh_log_error(rsession, \"Authentication by password failed\");\n            return 0;\n        }\n        ssh_log_debug(rsession, \"Authentication by password succeeded.\");\n        // If authentication by key is available\n        // and was chosen by the user, then use it\n    } else if (auth & RBM_SSH_AUTH_TYPE_PUBLICKEY && type == RBM_SSH_AUTH_TYPE_PUBLICKEY) {\n        rc = libssh2_userauth_publickey_fromfile(session, username, publickeypath, privatekeypath, passphrase);\n        if (rc) {\n            ssh_log_error(rsession, \"Authentication by key (%s) failed (Error %d)\", privatekeypath, rc);\n            return 0;\n        }\n        ssh_log_debug(rsession, \"Authentication by key succeeded.\");\n    } else {\n        ssh_log_error(rsession, \"No supported authentication methods found\");\n        return 0;\n    }\n\n    return session;\n}\n\n\n// Returns NULL on error, or valid rbm_ssh_channel otherwise.\nrbm_ssh_channel *ssh_channel_create(rbm_ssh_session* session, rbm_socket_t socket, LIBSSH2_CHANNEL *lchannel) {\n    const int bufsize = 16384;\n    rbm_ssh_channel **channels;\n\n    rbm_ssh_channel *channel = malloc(sizeof(rbm_ssh_channel));\n    channel->session = session;\n    channel->channel = lchannel;\n    channel->socket = socket;\n    channel->inbuf = malloc(sizeof(char) * bufsize);\n    channel->outbuf = malloc(sizeof(char) * bufsize);\n    channel->bufmaxsize = bufsize;\n\n    channels = (rbm_ssh_channel**) realloc (session->channels, (session->channelssize + 1) * sizeof(rbm_ssh_channel*)); // acts like malloc when (session->channels == NULL)\n    if (!channels) {\n        ssh_log_error(session, \"Not enough memory (call to realloc)\");\n        return NULL;\n    }\n\n    channels[session->channelssize] = channel;\n\n    session->channels = channels;\n    ++session->channelssize;\n    return channel;\n}\n\nvoid ssh_channel_close(rbm_ssh_channel* channel) {\n    int i;\n    rbm_ssh_session* session;\n    rbm_ssh_channel** channels;\n\n    session = channel->session;\n\n    for (i = 0; i < session->channelssize; i++) {\n        if (session->channels[i] != channel) {\n            continue;\n        }\n\n        if (session->channelssize == 1) {\n            channels = NULL;\n        } else {\n            channels = (rbm_ssh_channel**) malloc((session->channelssize - 1) * sizeof(rbm_ssh_channel*));\n            memcpy(channels, session->channels, i * sizeof(rbm_ssh_channel*));\n\n            if (i + 1 < session->channelssize) {\n                memcpy(channels + i, session->channels + i + 1, (session->channelssize - i - 1) * sizeof(rbm_ssh_channel*));\n            }\n        }\n\n        free(session->channels);\n        session->channels = channels;\n        --session->channelssize;\n\n        // 1. Free libssh2 channel\n        if (channel->channel) {\n            libssh2_channel_free(channel->channel);\n            channel->channel = NULL;\n        }\n\n        // 2. Free input/output buffers\n        free(channel->inbuf);\n        channel->inbuf = NULL;\n        free(channel->outbuf);\n        channel->outbuf = NULL;\n\n        // 3. Close socket\n        if (channel->socket != rbm_socket_invalid) {\n            close(channel->socket);\n            channel->socket = rbm_socket_invalid;\n        }\n\n        // 4. Free channel struct\n        free(channel);\n\n        ssh_log_debug(session, \"Channel closed\");\n        break;\n    }\n}\n\nrbm_ssh_channel* ssh_channel_find_by_socket(rbm_ssh_session* session, rbm_socket_t socket) {\n    for (int i = 0; i < session->channelssize; i++) {\n        if (session->channels[i]->socket == socket) {\n            return session->channels[i];\n        }\n    }\n\n    return NULL;\n}\n\n// Return -1 on error. 0 otherwise.\nstatic int handle_new_client_connections(rbm_ssh_session *connection, int *fdmax, fd_set *masterset) {\n    rbm_socket_t local_socket = connection->localsocket;\n    rbm_socket_t ssh_socket = connection->sshsocket;\n    LIBSSH2_SESSION* session = connection->sshsession;\n    struct rbm_ssh_tunnel_config* config = connection->config;\n    rbm_socket_t newfd = rbm_socket_invalid;\n    const int ERROR = -1;\n    const int SUCCESS = 0;\n\n    ssh_log_debug(connection, \"Data on accept socket is available\");\n\n    struct sockaddr_in remoteaddr;\n    socklen_t slen = sizeof(remoteaddr);\n\n    // handle new connections\n    if ((newfd = accept(local_socket, (struct sockaddr *) &remoteaddr, &slen)) == -1) {\n        ssh_log_error(connection, \"Error on accept()\");\n        return ERROR;\n    } else {\n        FD_SET(newfd, masterset); // add to master set\n\n        if (newfd > *fdmax) {       // keep track of the maximum\n            *fdmax = newfd;\n        }\n\n        ssh_log_debug(connection, \"New connection from %s on socket %d\", inet_ntoa(remoteaddr.sin_addr), newfd);\n    }\n\n    LIBSSH2_CHANNEL *channel = NULL;\n    int maxattempts = 25; //45;\n    int attempts = 0;\n    while (attempts < maxattempts) {\n        ++attempts;\n        channel = libssh2_channel_direct_tcpip_ex(session, config->remotehost, config->remoteport,\n                                                  config->localip, config->localport);\n\n        int errsave = errno;\n        if (!channel) {\n            ssh_log_warn(connection, \"Could not open the direct TCP/IP channel (%d)\", channel);\n\n            // Error 35: Resource temporarily unavailable.\n            if (errsave == 35) {\n                usleep(200 * 1000);\n                continue;\n            }\n\n            break;\n        }\n\n        ssh_log_debug(connection, \"Channel successfully created!\");\n        break;\n    }\n\n    if (!channel) {\n        ssh_log_error(connection, \"Failed to create SSH channel\");\n        return ERROR;\n    }\n\n    if (ssh_channel_create(connection, newfd, channel) == NULL) {\n        return ERROR;\n    }\n\n    return SUCCESS;\n}\n\n//  0: success\n// -1:\nstatic int handle_ssh_connections(rbm_ssh_session *connection, fd_set *masterset) {\n    const int AGAIN = -2;\n    const int ERROR = -1;\n    const int SUCCESS = 0;\n    struct rbm_ssh_tunnel_config* config = connection->config;\n\n    ssh_log_debug(connection, \"Data on SSH socket is available\");\n    ssh_log_debug(connection, \"[%d]  <-  Number of channels\", connection->channelssize);\n\n    if (connection->channelssize == 0) {\n        FD_CLR(connection->localsocket, masterset); // remove from master set\n        FD_CLR(connection->sshsocket, masterset);   // remove from master set\n        return SUCCESS;\n    }\n\n    int s = 0;\n    int result = SUCCESS;\n    int eagain = 0;\n    while (s < connection->channelssize) {\n        rbm_ssh_channel *context = connection->channels[s];\n        ++s;\n\n        int firstflag = 1;\n        while (1) {\n            int len;\n            len = libssh2_channel_read(context->channel, context->outbuf, context->bufmaxsize);\n            if (len == LIBSSH2_ERROR_EAGAIN) {\n\n                if (firstflag) {\n                    ++eagain;\n\n                    if (eagain == connection->channelssize) {\n                        result = AGAIN;\n                        ssh_log_warn(connection, \"All channels are in a non ready state (EAGAIN)\");\n                    }\n                }\n\n                // Proceed with the next channel\n                break;\n            } else if (len < 0) {\n\n                // ETIMEDOUT (60) Connection timed out\n                // We need to reconnect\n                // if (errno == 60) {\n                //    return 2;\n                // }\n                // Endless cycle:\n                // Network is down. libssh2_channel_read: -43. (Error #50)\n\n                result = ERROR;\n                ssh_log_error(connection, \"libssh2_channel_read: %d\", len);\n                break;\n            }\n\n            firstflag = 0;\n            ssh_log_debug(connection, \"Received %d bytes from tunnel\", len);\n\n            int wr = 0;\n            int rc = 0; // result\n            while (wr < len) {\n                rc = send(context->socket, context->outbuf + wr, len - wr, 0);\n                if (rc <= 0) {\n                    result = ERROR;\n                    ssh_log_error(connection, \"Failure to write data to client\");\n                    break;\n                }\n                wr += rc;\n            }\n            if (libssh2_channel_eof(context->channel)) {\n                result = SUCCESS;\n                ssh_log_debug(connection, \"The server at %s:%d disconnected!\\n\",\n                    config->remotehost, config->remoteport);\n                break;\n            }\n        }\n    }\n\n    return result;\n}\n\nstatic int handle_client_connections(rbm_ssh_session *connection, rbm_socket_t i, fd_set *masterset) {\n    const int ERROR = -1;\n    const int SUCCESS = 0;\n    int result = SUCCESS;\n    ssh_log_debug(connection, \"Data on client socket is available\");\n\n    rbm_ssh_channel *context = ssh_channel_find_by_socket(connection, i);\n    if (!context) {\n        close(i); // bye!\n        FD_CLR(i, masterset); // remove from master set\n        return ERROR;\n    }\n\n    // Read data from a client\n    int nbytes = recv(context->socket, context->inbuf, context->bufmaxsize, 0);\n    if (nbytes <= 0) {\n        if (nbytes == 0) {\n            // Normal situation\n            result = SUCCESS;\n            ssh_log_debug(connection, \"Client disconnected\");\n        } else {\n            // Got error\n            result = ERROR;\n            ssh_log_error(connection, \"Error when recv()\");\n        }\n\n        // In both these cases, close and cleanup connection\n        close(context->socket); // bye!\n        FD_CLR(context->socket, masterset); // remove from master set\n        ssh_channel_close(context);\n\n        if (connection->channelssize == 0) {\n            FD_CLR(connection->localsocket, masterset); // remove from master set\n            FD_CLR(connection->sshsocket, masterset);   // remove from master set\n        }\n\n        return result;\n    }\n    ssh_log_debug(connection, \"Received %d bytes from client\", nbytes);\n\n    // Write data to ssh tunnel\n    const int againmax = 100;\n    int again = 0;\n    int wr = 0;\n    int rc = 0; // result\n    while (wr < nbytes) {\n        rc = libssh2_channel_write(context->channel, context->inbuf + wr, nbytes - wr);\n        if (LIBSSH2_ERROR_EAGAIN == rc) {\n            ++again;\n\n            if (again > againmax) {\n                ssh_log_warn(connection, \"Number of attempts to libssh2_channel_write exсeed max value\");\n                return ERROR;\n            }\n\n            continue;\n        }\n        if (rc < 0) {\n            ssh_log_error(connection, \"Failed to write to SSH channel\");\n            return ERROR;\n        }\n        wr += rc;\n    }\n    ssh_log_debug(connection, \"Written %d bytes to tunnel\", wr);\n\n    return SUCCESS;\n}\n\nint rbm_ssh_open_tunnel_ex(rbm_ssh_session *connection) {\n    const int ERROR = -1;\n    const int SUCCESS = 0;\n    rbm_socket_t local_socket = connection->localsocket;\n    rbm_socket_t ssh_socket = connection->sshsocket;\n\n    const int maxerrors = 25;   // number of serial errors, when we probably should stop the loop\n    int errors = 0;             // counter for serial errors\n    int rc = 0;\n\n    int fdmax;       // maximum socket (file descriptor) number\n    int isocket;     // index for traversing sockets\n    fd_set masterset, readset, clearset;\n    FD_ZERO(&masterset);\n    FD_ZERO(&clearset);\n\n    // Add the listener to the master set\n    FD_SET(local_socket, &masterset);\n    FD_SET(ssh_socket, &masterset);\n\n    // Keep track of the biggest file descriptor\n    fdmax = local_socket > ssh_socket ? local_socket : ssh_socket;\n\n    while (errors < maxerrors) {\n\n        readset = masterset; // copy set\n\n        // If readset has no descriptors, it means that\n        // session is closed and we should stop our work\n        if (!memcmp(&readset, &clearset, sizeof(fd_set)))\n            break;\n\n        ssh_log_debug(connection, \"* Okay, we are ready to select.\");\n        if (select(fdmax + 1, &readset, NULL, NULL, NULL) == -1) {\n            ssh_log_error(connection, \"Error on select()\");\n            break;\n        }\n        ssh_log_debug(connection, \"* Selected!\");\n\n        // Run through the existing connections looking for data to read\n        for(isocket = 0; isocket <= fdmax; isocket++) {\n\n            // Skip connections that are not available for reading\n            if (!FD_ISSET(isocket, &readset))\n                continue;\n\n            if (isocket == local_socket) {\n                rc = handle_new_client_connections(connection, &fdmax, &masterset);\n                goto next;\n            }\n\n            if (isocket == ssh_socket) {\n                rc = handle_ssh_connections(connection, &masterset);\n                goto next;\n            }\n\n            rc = handle_client_connections(connection, isocket, &masterset);\n\nnext:\n            // Increment \"errors\" counter, if we found an error,\n            // or zero it, if not.\n            errors = (rc == -2) ? errors + 1 : 0;\n            if (errors > 0) {\n                ssh_log_warn(connection, \"*** COLLECTED %d AGAIN ***\", errors);\n            }\n\n            if (rc == -1) {\n                ssh_log_warn(connection, \"SSH tunnel shutdown because of error\");\n                return ERROR;\n            }\n        }\n    }\n\n    if (errors >= maxerrors) {\n        ssh_log_warn(connection, \"SSH tunnel shutdown because of series of successive EAGAIN errors\");\n        return ERROR;\n    }\n\n    rbm_ssh_session_close(connection);\n    return SUCCESS;\n}\n\nvoid rbm_ssh_session_cleanup(rbm_ssh_session *session);\n\nint rbm_ssh_open_tunnel(rbm_ssh_session *connection) {\n    const int ERROR = -1;\n    const int SUCCESS = 0;\n    int rc = 0;\n\n    while (1) {\n        rc = rbm_ssh_open_tunnel_ex(connection);\n        if (rc == 0)\n            break;\n\n        // Cleanup SSH connection we hope that local connection\n        // will not break so often\n        rbm_ssh_session_cleanup(connection);\n        ssh_log_warn(connection, \"STARTING AGAIN!!!!!!!!!111\");\n\n        if (rbm_ssh_setup(connection) == -1) {\n            rbm_ssh_session_close(connection);\n            return ERROR;\n        }\n    }\n\n    return SUCCESS;\n}\n\nvoid rbm_ssh_session_cleanup(rbm_ssh_session *session) {\n    if (session == NULL) {\n        return;\n    }\n\n    // Order is important:\n    // 1. close accept socket\n    // 2. free libssh2 channels (and client sockets)\n    // 3. free libssh2 session\n    // 4. close ssh socket\n\n    // 2.\n    ssh_log_debug(session, \"Closing channels\");\n    while (session->channelssize > 0) {\n        ssh_channel_close(session->channels[0]);\n        ssh_log_debug(session, \"Channel closed\");\n    }\n\n    // 3.\n    if (session->sshsession) {\n        ssh_log_debug(session, \"Closing SSH session\");\n        libssh2_session_disconnect(session->sshsession, \"Client disconnecting normally\");\n        libssh2_session_free(session->sshsession);\n        session->sshsession = NULL;\n    }\n\n    // 4.\n    if (session->sshsocket != rbm_socket_invalid) {\n        ssh_log_debug(session, \"Closing SSH socket\");\n        close(session->sshsocket);\n        session->sshsocket = rbm_socket_invalid;\n    }\n}\n\nvoid rbm_ssh_session_close(rbm_ssh_session *session) {\n    if (session->localsocket != rbm_socket_invalid) {\n        ssh_log_debug(session, \"Closing local accept socket\");\n        close(session->localsocket);\n        session->localsocket = rbm_socket_invalid;\n    }\n\n    rbm_ssh_session_cleanup(session);\n\n    ssh_log_debug(session, \"SSH tunnel successfully closed.\");\n    free(session);\n}\n\n// Returns 0 on error, valid rbm_ssh_session* if no errors\nrbm_ssh_session* rbm_ssh_session_create(struct rbm_ssh_tunnel_config *config) {\n    rbm_ssh_session *session = (rbm_ssh_session *) malloc(sizeof(rbm_ssh_session));\n    if (!session) {\n        return NULL;\n    }\n    session->localsocket = rbm_socket_invalid;\n    session->sshsocket = rbm_socket_invalid;\n    session->sshsession = 0;\n    session->config = config;\n    session->channelssize = 0;\n    session->channels = NULL;\n    session->lasterror[0] = '\\0';\n\n    // Check that loglevel is valid\n    if (config->loglevel != RBM_SSH_LOG_TYPE_ERROR &&\n        config->loglevel != RBM_SSH_LOG_TYPE_WARN &&\n        config->loglevel != RBM_SSH_LOG_TYPE_INFO &&\n        config->loglevel != RBM_SSH_LOG_TYPE_DEBUG) {\n        log_error(\"Invalid log level for SSH submodule\");\n        return NULL;\n    }\n\n    return session;\n}\n\n// Returns -1 on error, 0 when otherwise\nint rbm_ssh_setup(rbm_ssh_session *session) {\n    const int ERROR = -1;\n    const int SUCCESS = 0;\n    rbm_ssh_tunnel_config *config = session->config;\n\n    ssh_log_debug(session, \"Connecting to SSH server (%s:%d)...\", config->sshserverip, config->sshserverport);\n\n    session->sshsocket = socket_connect(session, config->sshserverip, config->sshserverport);\n    if (session->sshsocket == -1) {\n        session->sshsocket = rbm_socket_invalid;\n        return ERROR; // errors are already logged by socket_connect\n    }\n\n    session->sshsession = ssh_connect(session, session->sshsocket, config->authtype, config->username, config->password,\n        config->publickeyfile, config->privatekeyfile, config->passphrase);\n    if (session->sshsession == 0) {\n        return ERROR; // errors are already logged by ssh_connect\n    }\n\n    // Must use non-blocking IO hereafter due to the current libssh3 API\n    libssh2_session_set_blocking(session->sshsession, 0);\n\n    return SUCCESS;\n}\n\n// Returns -1 on error, 0 when otherwise\nint rbm_ssh_session_setup(rbm_ssh_session *session) {\n    const int ERROR = -1;\n    const int SUCCESS = 0;\n    rbm_ssh_tunnel_config *config = session->config;\n\n    if (rbm_ssh_setup(session) == -1)\n        return ERROR;\n\n    session->localsocket = socket_listen(session, config->localip, (int *) &config->localport);\n    if (session->localsocket == -1) {\n        session->localsocket = rbm_socket_invalid;\n        return ERROR; // errors are already logged by socket_listen\n    }\n\n    ssh_log_debug(session, \"Waiting for TCP connection on %s:%d...\", config->localip, config->localport);\n\n    return SUCCESS;\n}\n\n\n"
  },
  {
    "path": "src/robomongo/ssh/temp/temp_ssh.h",
    "content": "#ifndef ROBOMONGO_SSH_H\n#define ROBOMONGO_SSH_H\n\n#include <libssh2.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef _WIN32\n#  define rbm_socket_t SOCKET\n#  define rbm_socket_invalid INVALID_SOCKET\n#else\n#  define rbm_socket_t int\n#  define rbm_socket_invalid (-1)\n#endif\n\nenum rbm_ssh_log_type {\n    RBM_SSH_LOG_TYPE_ERROR  = 1,\n    RBM_SSH_LOG_TYPE_WARN   = 2,\n    RBM_SSH_LOG_TYPE_INFO   = 3,\n    RBM_SSH_LOG_TYPE_DEBUG  = 100 // log as much as possible\n};\n\nenum rbm_ssh_auth_type {\n    RBM_SSH_AUTH_TYPE_NONE       = 0,\n    RBM_SSH_AUTH_TYPE_PASSWORD   = 1,\n    RBM_SSH_AUTH_TYPE_PUBLICKEY  = 2\n};\n\nstruct rbm_ssh_session;\n\n/*\n * SSH Tunnel configuration\n */\ntypedef struct rbm_ssh_tunnel_config {\n    enum rbm_ssh_auth_type authtype;\n    enum rbm_ssh_log_type loglevel;\n\n    // Keys and optional passphrase\n    char *privatekeyfile;\n    char *publickeyfile;\n    char *passphrase;   // May be NULL or \"\"\n\n    // Local IP and port to bind and listen to\n    char *localip;\n    unsigned int localport;\n\n    // Remote host and port to connect to\n    char *remotehost;   // Resolved by the remote server\n    unsigned int remoteport;\n\n    // Username and password of remote user\n    char *username;\n    char *password;     // May be NULL or \"\"\n\n    // Remote IP and (host, port) in remote network\n    char *sshserverip;\n    unsigned int sshserverport;  // SSH port\n\n    void *context; // pointer to user-defined data\n    void (*logcallback)(struct rbm_ssh_session* session, char *message, int level);\n} rbm_ssh_tunnel_config;\n\ntypedef struct rbm_ssh_channel {\n    struct rbm_ssh_session* session;\n    LIBSSH2_CHANNEL *channel;\n    rbm_socket_t socket;\n    char *inbuf;\n    char *outbuf;\n    int bufmaxsize;\n} rbm_ssh_channel;\n\ntypedef struct rbm_ssh_session {\n    rbm_socket_t localsocket;\n    rbm_socket_t sshsocket;\n    LIBSSH2_SESSION *sshsession;\n    rbm_ssh_tunnel_config *config;\n\n    rbm_ssh_channel **channels;\n    int channelssize; // number of channels\n\n    char lasterror[2048];\n} rbm_ssh_session;\n\nint rbm_ssh_init();\nvoid rbm_ssh_cleanup();\n\nrbm_ssh_session* rbm_ssh_session_create(struct rbm_ssh_tunnel_config *config);\nint rbm_ssh_session_setup(rbm_ssh_session *session);\nvoid rbm_ssh_session_close(rbm_ssh_session *session);\n\nint rbm_ssh_open_tunnel(struct rbm_ssh_session *connection);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // ROBOMONGO_SSH_H\n"
  },
  {
    "path": "src/robomongo/ssh/temp/temp_ssh_log.c",
    "content": "#include \"robomongo/ssh/internal.h\"\n\n#include <errno.h>\n#include <stdarg.h>\n#include <stdio.h>\n\nint log_error(const char *format, ...)\n{\n    int errsave = errno;\n    const int buf_size = 1024;\n    char buf[buf_size];\n    va_list args;\n\n    va_start(args, format);\n    vsnprintf(buf, buf_size, format, args);\n\n    if (errsave) {\n        fprintf(stderr, \"Error (%d): %s. %s\\n\", errno, strerror(errsave), buf);\n    } else {\n        fprintf(stderr, \"Error: %s\\n\", buf);\n    }\n\n    va_end(args);\n    return 1;\n}\n\nint log_msg(const char *format, ...)\n{\n    const int buf_size = 1024;\n    char buf[buf_size];\n    va_list args;\n\n    va_start(args, format);\n    vsnprintf(buf, buf_size, format, args);\n\n    printf(\"%s\\n\", buf);\n\n    va_end(args);\n    return 1;\n}\n\n/*\n * errsave: use 0, if you are not logging errors (i.e. errno == 0).\n */\nvoid ssh_log_v(rbm_ssh_session* session, enum rbm_ssh_log_type type, const char *format, va_list args, int errsave) {\n    const size_t bufsize = 2000;\n    char buf[bufsize];\n    vsnprintf(buf, bufsize, format, args);\n\n    if (type == RBM_SSH_LOG_TYPE_ERROR ||\n        type == RBM_SSH_LOG_TYPE_WARN) {\n        if (errsave) {\n            sprintf(session->lasterror, \"%s. %s. (Error #%d)\", strerror(errsave), buf, errsave);\n        } else {\n            sprintf(session->lasterror, \"%s\", buf);\n        }\n\n        fprintf(stderr, \"%s\\n\", session->lasterror);\n        session->config->logcallback(session, session->lasterror, type);\n        return;\n    }\n\n    if (type != RBM_SSH_LOG_TYPE_INFO &&\n        type != RBM_SSH_LOG_TYPE_DEBUG)\n        return;\n\n    if (type > session->config->loglevel)\n        return;\n\n    printf(\"%s\\n\", buf);\n    session->config->logcallback(session, buf, type);\n}\n\nvoid ssh_log_msg(rbm_ssh_session* session, const char *format, ...) {\n    const int type = RBM_SSH_LOG_TYPE_INFO;\n\n    // For performance reasons, return as quick as possible,\n    // if this level of logging is not enabled\n    if (type > session->config->loglevel)\n        return;\n\n    va_list args;\n    va_start(args, format);\n    ssh_log_v(session, type, format, args, 0);\n    va_end(args);\n}\n\n// When you faced with an error that you are planning to overcome or handle,\n// log it as a warning. If you do not have plan how to proceed further, log\n// as an error.\nvoid ssh_log_warn(rbm_ssh_session* session, const char *format, ...) {\n    int errsave = errno;\n    const int type = RBM_SSH_LOG_TYPE_WARN;\n\n    // For performance reasons, return as quick as possible,\n    // if this level of logging is not enabled\n    if (type > session->config->loglevel)\n        return;\n\n    va_list args;\n    va_start(args, format);\n    ssh_log_v(session, type, format, args, errsave);\n    va_end(args);\n}\n\nvoid ssh_log_debug(rbm_ssh_session* session, const char *format, ...) {\n    const int type = RBM_SSH_LOG_TYPE_DEBUG;\n\n    // For performance reasons, return as quick as possible,\n    // if this level of logging is not enabled\n    if (type > session->config->loglevel)\n        return;\n\n    va_list args;\n    va_start(args, format);\n    ssh_log_v(session, type, format, args, 0);\n    va_end(args);\n}\n\nvoid ssh_log_error(rbm_ssh_session* session, const char *format, ...) {\n    int errsave = errno;\n    va_list args;\n    va_start(args, format);\n    ssh_log_v(session, RBM_SSH_LOG_TYPE_ERROR, format, args, errsave);\n    va_end(args);\n}\n"
  },
  {
    "path": "src/robomongo/ssh/test.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <assert.h>\n\n#include \"robomongo/ssh/private.h\"\n\nstatic int *elem1;\nstatic int *elem2;\nstatic int *elem3;\nstatic int *elem4;\nstatic int *elem5;\n\nint add_one_element() {\n    int **array = NULL;\n    int size = 0;\n\n    rbm_array_add((void***)&array, &size, elem1);\n    assert(size == 1);\n    assert(array[0] == elem1);\n    assert(*array[0] == 100);\n    free(array);\n    return 0;\n}\n\nint add_two_elements() {\n    int **array = NULL;\n    int size = 0;\n\n    rbm_array_add((void***)&array, &size, elem1);\n    assert(size == 1);\n    rbm_array_add((void***)&array, &size, elem2);\n    assert(size == 2);\n    assert(array[0] == elem1);\n    assert(*array[0] == 100);\n    assert(array[1] == elem2);\n    assert(*array[1] == 200);\n    free(array);\n    return 0;\n}\n\nint array_remove_when_only_single() {\n    int **array = NULL;\n    int size = 0;\n\n    rbm_array_add((void***)&array, &size, elem1);\n    rbm_array_remove((void***)&array, &size, elem1);\n    assert(size == 0);\n    assert(*elem1 == 100);\n    free(array);\n    return 0;\n}\n\nint array_remove_when_only_two() {\n    int **array = NULL;\n    int size = 0;\n\n    rbm_array_add((void***)&array, &size, elem1);\n    rbm_array_add((void***)&array, &size, elem2);\n    rbm_array_remove((void***)&array, &size, elem1);\n    assert(size == 1);\n    assert(array[0] == elem2);\n    assert(*array[0] == 200);\n    free(array);\n    return 0;\n}\n\nint array_remove_when_only_two_variation() {\n    int **array = NULL;\n    int size = 0;\n\n    rbm_array_add((void***)&array, &size, elem1);\n    rbm_array_add((void***)&array, &size, elem2);\n    rbm_array_remove((void***)&array, &size, elem2);\n    assert(size == 1);\n    assert(array[0] == elem1);\n    assert(*array[0] == 100);\n    free(array);\n    return 0;\n}\n\nint array_remove_when_five_elements() {\n    int **array = NULL;\n    int size = 0;\n    rbm_array_add((void***)&array, &size, elem1);\n    rbm_array_add((void***)&array, &size, elem2);\n    rbm_array_add((void***)&array, &size, elem3);\n    rbm_array_add((void***)&array, &size, elem4);\n    rbm_array_add((void***)&array, &size, elem5);\n    assert(size == 5);\n\n    rbm_array_remove((void***)&array, &size, elem2);\n    rbm_array_remove((void***)&array, &size, elem4);\n    assert(size == 3);\n    assert(array[0] == elem1);\n    assert(array[1] == elem3);\n    assert(array[2] == elem5);\n    free(array);\n    return 0;\n}\n\nint remove_last_element() {\n    int **array = NULL;\n    int size = 0;\n    rbm_array_add((void***)&array, &size, elem1);\n    rbm_array_add((void***)&array, &size, elem2);\n    rbm_array_add((void***)&array, &size, elem3);\n    assert(size == 3);\n\n    rbm_array_remove((void***)&array, &size, elem3);\n    assert(size == 2);\n    assert(array[0] == elem1);\n    assert(array[1] == elem2);\n    free(array);\n    return 0;\n}\n\nint add_with_incorrect_params() {\n    int **array = NULL;\n    int size = 1;\n    int rc = rbm_array_add((void***)&array, &size, elem1);\n    assert(rc == -1);\n    assert(size == 1); // should not be modified\n    free(array);\n    return 0;\n}\n\nvoid init() {\n    elem1 = malloc(sizeof(int));\n    elem2 = malloc(sizeof(int));\n    elem3 = malloc(sizeof(int));\n    elem4 = malloc(sizeof(int));\n    elem5 = malloc(sizeof(int));\n    *elem1 = 100;\n    *elem2 = 200;\n    *elem3 = 300;\n    *elem4 = 400;\n    *elem5 = 500;\n}\n\nvoid cleanup() {\n    free(elem1);\n    free(elem2);\n    free(elem3);\n    free(elem4);\n    free(elem5);\n}\n\nint main(int argc, char *argv[]) {\n    init();\n    add_one_element();\n    add_two_elements();\n    array_remove_when_only_two();\n    array_remove_when_only_single();\n    array_remove_when_only_two_variation();\n    array_remove_when_five_elements();\n    remove_last_element();\n    add_with_incorrect_params();\n    cleanup();\n    printf(\"All tests completed successfully.\\n\");\n}\n"
  },
  {
    "path": "src/robomongo/ssh/unix.h",
    "content": "#define rbm_socket_t int\n#define rbm_socket_invalid (-1)\n"
  },
  {
    "path": "src/robomongo/ssh/valgrind/macosx-clang.supp",
    "content": "{\n   <insert_a_suppression_name_here>\n   Memcheck:Leak\n   match-leak-kinds: possible\n   fun:malloc_zone_malloc\n   fun:_objc_copyClassNamesForImage\n   fun:_ZL9protocolsv\n   fun:_Z9readClassP10objc_classbb\n   fun:gc_init\n   fun:_ZL33objc_initializeClassPair_internalP10objc_classPKcS0_S0_\n   fun:layout_string_create\n   fun:_ZL12realizeClassP10objc_class\n   fun:_ZL22copySwiftV1MangledNamePKcb\n   fun:_ZL22copySwiftV1MangledNamePKcb\n   fun:_ZL22copySwiftV1MangledNamePKcb\n   fun:_ZL22copySwiftV1MangledNamePKcb\n}\n\n{\n   insert_a_suppression_name_here_2\n   Memcheck:Param\n   socketcall.sendto(msg)\n   fun:sendto\n   ...\n   fun:_libssh2_send\n   fun:_libssh2_transport_send\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:BN_bin2bn\n   ...\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:BN_num_bits_word\n   ...\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Value8\n   fun:BN_num_bits_word\n   ...\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:BN_mod_exp_mont\n   ...\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:BN_mod_exp_mont_word\n   ...\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_platform_memcmp\n   ...\n   fun:int_rsa_verify\n   ...\n   fun:RSA_verify\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:aesni_ctr32_encrypt_blocks\n   fun:aes_ctr_cipher\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:CRYPTO_ctr128_encrypt_ctr32\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_libssh2_transport_read\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:malloc\n   fun:libssh2_default_alloc\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_require\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:decrypt\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_require\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:__memcpy_chk\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_require\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_platform_memmove$VARIANT$Haswell\n   fun:__memcpy_chk\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_require\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Value8\n   fun:_platform_memmove$VARIANT$Haswell\n   fun:__memcpy_chk\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_require\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   ...\n   fun:mac_method_hmac_sha2_256_hash\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Value8\n   ...\n   fun:mac_method_hmac_sha2_256_hash\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_platform_memcmp\n   fun:fullpacket\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_require\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Value8\n   fun:_platform_memcmp\n   fun:fullpacket\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_require\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_libssh2_packet_add\n   fun:fullpacket\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_require\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_libssh2_packet_require\n   fun:session_startup\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_libssh2_packet_ask\n   fun:_libssh2_packet_require\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:session_startup\n   fun:libssh2_session_handshake\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_platform_strncmp\n   fun:session_startup\n   fun:libssh2_session_handshake\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Param\n   recvfrom(buf)\n   fun:recvfrom\n   fun:_libssh2_recv\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_requirev\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Param\n   recvfrom(len)\n   fun:recvfrom\n   fun:_libssh2_recv\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_requirev\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:malloc\n   fun:libssh2_default_alloc\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_requirev\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:decrypt\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_requirev\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:__memcpy_chk\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_requirev\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_platform_memmove$VARIANT$Haswell\n   fun:__memcpy_chk\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_requirev\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Value8\n   fun:_platform_memmove$VARIANT$Haswell\n   fun:__memcpy_chk\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_requirev\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_platform_memcmp\n   ...\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_requirev\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Value8\n   fun:_platform_memcmp\n   ...\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_requirev\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   ...\n   fun:_libssh2_transport_read\n   fun:_libssh2_packet_requirev\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   ...\n   fun:_libssh2_packet_requirev\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   ...\n   fun:libssh2_userauth_list\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Value8\n   ...\n   fun:libssh2_userauth_list\n}\n\n\n{\n   name\n   Memcheck:Cond\n   obj:/usr/local/Cellar/openssl/1.0.2f/lib/libcrypto.1.0.0.dylib\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:strlen\n   fun:__vfprintf\n   fun:__v2printf\n   fun:_vsnprintf\n   fun:vsnprintf\n   fun:ssh_log_v\n   fun:ssh_log_debug\n   fun:ssh_connect\n   fun:rbm_ssh_setup\n   fun:rbm_ssh_session_setup\n   fun:main\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:strlen\n   fun:__vfprintf\n   fun:__v2printf\n   fun:vfprintf_l\n   fun:printf\n   fun:ssh_log_v\n   fun:ssh_log_debug\n   fun:ssh_connect\n   fun:rbm_ssh_setup\n   fun:rbm_ssh_session_setup\n   fun:main\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   ...\n   fun:strstr\n   fun:ssh_connect\n   fun:rbm_ssh_setup\n   fun:rbm_ssh_session_setup\n   fun:main\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Value8\n   fun:sha256_block_data_order_avx2\n   obj:*\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Cond\n   fun:_libssh2_userauth_publickey\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Value8\n   fun:bn_mul4x_mont\n   obj:*\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Value8\n   fun:bn_mul4x_mont\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Value8\n   fun:sqr8x_reduction\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Value8\n   fun:BN_from_montgomery_word\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Value8\n   fun:bn_mul_recursive\n}\n\n{\n   <insert_a_suppression_name_here>\n   Memcheck:Param\n   write(buf)\n   fun:write$NOCANCEL\n   fun:_swrite\n   fun:__sflush\n   fun:fflush\n   fun:_ZNSt3__111__stdoutbufIcE4syncEv\n   fun:_ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv\n   fun:_ZNSt3__18ios_base4InitD2Ev\n   fun:__cxa_finalize_ranges\n   fun:exit\n   fun:start\n}\n"
  },
  {
    "path": "src/robomongo/ssh/win.c",
    "content": "\n\nint ssh_win_init() {\n    WSADATA wsadata;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        log_error(\"WSAStartup failed with error: %d\", err);\n        return 1;\n    }\n}\n"
  },
  {
    "path": "src/robomongo/ssh/win.h",
    "content": "#define rbm_socket_t SOCKET\n#define rbm_socket_invalid INVALID_SOCKET\n"
  },
  {
    "path": "src/robomongo/utils/RoboCrypt.cpp",
    "content": "#include \"RoboCrypt.h\"\n\n#include \"robomongo/core/utils/Logger.h\"       \n\n#include <cmath>\n#include <iostream>\n#include <random>\n\n#include <QDir>\n#include <QFileInfo>\n#include <QIODevice>\n#include <QString>\n#include <QTextStream>\n\nnamespace Robomongo {\n\n    long long RoboCrypt::_KEY = 0;\n    std::vector<RoboCrypt::LogAndSeverity> RoboCrypt::_roboCryptLogs;\n\n    void RoboCrypt::initKey() \n    {\n        using MongoSeverity = mongo::logger::LogSeverity;\n        auto addToRoboCryptLogs = [](std::string msg, MongoSeverity severity) {\n            _roboCryptLogs.push_back({ msg, severity });\n        };\n\n        const auto KEY_FILE = QString(\"%1/.3T/robo-3t/robo3t.key\").arg(QDir::homePath()).toStdString();\n        QString fileContent;\n        QFileInfo const fileInfo{ QString::fromStdString(KEY_FILE) };\n        if (fileInfo.exists() && fileInfo.isFile()) {   // a) Read existing key from file\n            QFile keyFile{ QString::fromStdString(KEY_FILE) };\n            if (!keyFile.open(QIODevice::ReadOnly))\n                addToRoboCryptLogs(\"RoboCrypt: Failed to open key file: \" + KEY_FILE, MongoSeverity::Error());\n\n            QTextStream in{ &keyFile };\n            fileContent = in.readAll();\n            if(fileContent.isEmpty())\n                addToRoboCryptLogs(\"RoboCrypt: Key file is empty: \" + KEY_FILE, MongoSeverity::Error());\n\n            _KEY = fileContent.toLongLong();\n        }\n        else {  // b) Generate a new key and save it into file\n            addToRoboCryptLogs(\"RoboCrypt: No key found, generating a new key and saving it into file\", \n                                MongoSeverity::Warning());\n            // Generate a new key\n            std::random_device randomDevice;\n            std::mt19937_64 engine{ randomDevice() };\n            std::uniform_int_distribution<long long int> dist{ std::llround(std::pow(2,61)), \n                                                               std::llround(std::pow(2,62)) };\n            _KEY = dist(engine);\n            // Save the key into file\n            QFile file{ QString::fromStdString(KEY_FILE) };\n            if (!file.open(QIODevice::WriteOnly | QIODevice::Text))\n                addToRoboCryptLogs(\"RoboCrypt: Failed to save the key into file: \" + KEY_FILE, MongoSeverity::Error());\n                            \n            QTextStream out(&file);\n            out << QString::number(_KEY);\n        }\n    }\n\n}"
  },
  {
    "path": "src/robomongo/utils/RoboCrypt.h",
    "content": "#include \"SimpleCrypt.h\"\n\n#include <string>\n\n#include <mongo/logger/log_severity.h>\n\nnamespace Robomongo {\n    \n    class RoboCrypt {    \n        using LogAndSeverity = std::pair<std::string, mongo::logger::LogSeverity>;\n    public: \n        static SimpleCrypt& simpleCrypter() {\n            static SimpleCrypt simpleCrypt(_KEY);\n            return simpleCrypt;\n        }\n\n        static std::string encrypt(std::string passwd) {\n            return simpleCrypter().encryptToString(QString::fromStdString(passwd)).toStdString();\n        }\n\n        static std::string decrypt(std::string cryptedPasswd) {\n            return simpleCrypter().decryptToString(QString::fromStdString(cryptedPasswd)).toStdString();\n        }\n\n        // Read key from key file otherwise create a new key and save it into file\n        static void initKey();\n\n        static std::vector<LogAndSeverity> const& roboCryptLogs() {\n            return _roboCryptLogs;\n        }\n\n    private:\n        static long long _KEY;\n        static std::vector<LogAndSeverity> _roboCryptLogs;\n    };\n\n}"
  },
  {
    "path": "src/robomongo/utils/RoboCrypt_test.cpp",
    "content": "#include \"gtest/gtest.h\"\n#include \"robomongo/utils/RoboCrypt.h\"\n\n#include <string>\n\n/* Example Test:\n *\n * TEST( [Test_Case_Name], [Test_Name] )\n * TEST( [Test_Case_Name], [UnitOfWorkName_ScenarioUnderTest_ExpectedBehavior] )\n * TEST( StringParserTests, NumberLeftOf_StringWithoutNumber_ReturnsFalse) {\n    // ...\n   }\n*/\n\nTEST(RoboCrypt_CoreTests, encrypt_decrypt)\n{  \n    auto const pwds = {\n        \"Tyu_aBq\",\n        \"_?asdfghjkl;'piop[.,/\",\n        \".?/`_@~!#$%^^&&*)_)_+=-\",        \n        \"<>?/.,;':][p{}|\\\"\"\n    };\n    for (auto const& pwd : pwds) {\n        const std::string encryptedPwd = Robomongo::RoboCrypt::encrypt(pwd);\n        const std::string decryptedPwd = Robomongo::RoboCrypt::decrypt(encryptedPwd);\n        EXPECT_EQ(pwd, decryptedPwd);\n    }\n}"
  },
  {
    "path": "src/robomongo/utils/SimpleCrypt.cpp",
    "content": "/*\nCopyright (c) 2011, Andre Somers\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n* Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n* Neither the name of the Rathenau Instituut, Andre Somers nor the\nnames of its contributors may be used to endorse or promote products\nderived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL ANDRE SOMERS BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR #######; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#include \"SimpleCrypt.h\"\n#include <QByteArray>\n#include <QtDebug>\n#include <QtGlobal>\n#include <QDateTime>\n#include <QCryptographicHash>\n#include <QDataStream>\n\nSimpleCrypt::SimpleCrypt() :\n    m_key(0),\n    m_compressionMode(CompressionAuto),\n    m_protectionMode(ProtectionChecksum),\n    m_lastError(ErrorNoError)\n{\n    qsrand(uint(QDateTime::currentMSecsSinceEpoch() & 0xFFFF));\n}\n\nSimpleCrypt::SimpleCrypt(quint64 key) :\n    m_key(key),\n    m_compressionMode(CompressionAuto),\n    m_protectionMode(ProtectionChecksum),\n    m_lastError(ErrorNoError)\n{\n    qsrand(uint(QDateTime::currentMSecsSinceEpoch() & 0xFFFF));\n    splitKey();\n}\n\nvoid SimpleCrypt::setKey(quint64 key)\n{\n    m_key = key;\n    splitKey();\n}\n\nvoid SimpleCrypt::splitKey()\n{\n    m_keyParts.clear();\n    m_keyParts.resize(8);\n    for (int i = 0; i<8; i++) {\n        quint64 part = m_key;\n        for (int j = i; j>0; j--)\n            part = part >> 8;\n        part = part & 0xff;\n        m_keyParts[i] = static_cast<char>(part);\n    }\n}\n\nQByteArray SimpleCrypt::encryptToByteArray(const QString& plaintext)\n{\n    QByteArray plaintextArray = plaintext.toUtf8();\n    return encryptToByteArray(plaintextArray);\n}\n\nQByteArray SimpleCrypt::encryptToByteArray(QByteArray plaintext)\n{\n    if (m_keyParts.isEmpty()) {\n        qWarning() << \"No key set.\";\n        m_lastError = ErrorNoKeySet;\n        return QByteArray();\n    }\n\n\n    QByteArray ba = plaintext;\n\n    CryptoFlags flags = CryptoFlagNone;\n    if (m_compressionMode == CompressionAlways) {\n        ba = qCompress(ba, 9); //maximum compression\n        flags |= CryptoFlagCompression;\n    }\n    else if (m_compressionMode == CompressionAuto) {\n        QByteArray compressed = qCompress(ba, 9);\n        if (compressed.count() < ba.count()) {\n            ba = compressed;\n            flags |= CryptoFlagCompression;\n        }\n    }\n\n    QByteArray integrityProtection;\n    if (m_protectionMode == ProtectionChecksum) {\n        flags |= CryptoFlagChecksum;\n        QDataStream s(&integrityProtection, QIODevice::WriteOnly);\n        s << qChecksum(ba.constData(), ba.length());\n    }\n    else if (m_protectionMode == ProtectionHash) {\n        flags |= CryptoFlagHash;\n        QCryptographicHash hash(QCryptographicHash::Sha1);\n        hash.addData(ba);\n\n        integrityProtection += hash.result();\n    }\n\n    //prepend a random char to the string\n    char randomChar = char(qrand() & 0xFF);\n    ba = randomChar + integrityProtection + ba;\n\n    int pos(0);\n    char lastChar(0);\n\n    int cnt = ba.count();\n\n    while (pos < cnt) {\n        ba[pos] = ba.at(pos) ^ m_keyParts.at(pos % 8) ^ lastChar;\n        lastChar = ba.at(pos);\n        ++pos;\n    }\n\n    QByteArray resultArray;\n    resultArray.append(char(0x03));  //version for future updates to algorithm\n    resultArray.append(char(flags)); //encryption flags\n    resultArray.append(ba);\n\n    m_lastError = ErrorNoError;\n    return resultArray;\n}\n\nQString SimpleCrypt::encryptToString(const QString& plaintext)\n{\n    QByteArray plaintextArray = plaintext.toUtf8();\n    QByteArray cypher = encryptToByteArray(plaintextArray);\n    QString cypherString = QString::fromLatin1(cypher.toBase64());\n    return cypherString;\n}\n\nQString SimpleCrypt::encryptToString(QByteArray plaintext)\n{\n    QByteArray cypher = encryptToByteArray(plaintext);\n    QString cypherString = QString::fromLatin1(cypher.toBase64());\n    return cypherString;\n}\n\nQString SimpleCrypt::decryptToString(const QString &cyphertext)\n{\n    QByteArray cyphertextArray = QByteArray::fromBase64(cyphertext.toLatin1());\n    QByteArray plaintextArray = decryptToByteArray(cyphertextArray);\n    QString plaintext = QString::fromUtf8(plaintextArray, plaintextArray.size());\n\n    return plaintext;\n}\n\nQString SimpleCrypt::decryptToString(QByteArray cypher)\n{\n    QByteArray ba = decryptToByteArray(cypher);\n    QString plaintext = QString::fromUtf8(ba, ba.size());\n\n    return plaintext;\n}\n\nQByteArray SimpleCrypt::decryptToByteArray(const QString& cyphertext)\n{\n    QByteArray cyphertextArray = QByteArray::fromBase64(cyphertext.toLatin1());\n    QByteArray ba = decryptToByteArray(cyphertextArray);\n\n    return ba;\n}\n\nQByteArray SimpleCrypt::decryptToByteArray(QByteArray cypher)\n{\n    if (m_keyParts.isEmpty()) {\n        qWarning() << \"No key set.\";\n        m_lastError = ErrorNoKeySet;\n        return QByteArray();\n    }\n\n    QByteArray ba = cypher;\n\n    if (cypher.count() < 3)\n        return QByteArray();\n\n    char version = ba.at(0);\n\n    if (version != 3) {  //we only work with version 3\n        m_lastError = ErrorUnknownVersion;\n        qWarning() << \"Invalid version or not a cyphertext.\";\n        return QByteArray();\n    }\n\n    CryptoFlags flags = CryptoFlags(ba.at(1));\n\n    ba = ba.mid(2);\n    int pos(0);\n    int cnt(ba.count());\n    char lastChar = 0;\n\n    while (pos < cnt) {\n        char currentChar = ba[pos];\n        ba[pos] = ba.at(pos) ^ lastChar ^ m_keyParts.at(pos % 8);\n        lastChar = currentChar;\n        ++pos;\n    }\n\n    ba = ba.mid(1); //chop off the random number at the start\n\n    bool integrityOk(true);\n    if (flags.testFlag(CryptoFlagChecksum)) {\n        if (ba.length() < 2) {\n            m_lastError = ErrorIntegrityFailed;\n            return QByteArray();\n        }\n        quint16 storedChecksum;\n        {\n            QDataStream s(&ba, QIODevice::ReadOnly);\n            s >> storedChecksum;\n        }\n        ba = ba.mid(2);\n        quint16 checksum = qChecksum(ba.constData(), ba.length());\n        integrityOk = (checksum == storedChecksum);\n    }\n    else if (flags.testFlag(CryptoFlagHash)) {\n        if (ba.length() < 20) {\n            m_lastError = ErrorIntegrityFailed;\n            return QByteArray();\n        }\n        QByteArray storedHash = ba.left(20);\n        ba = ba.mid(20);\n        QCryptographicHash hash(QCryptographicHash::Sha1);\n        hash.addData(ba);\n        integrityOk = (hash.result() == storedHash);\n    }\n\n    if (!integrityOk) {\n        m_lastError = ErrorIntegrityFailed;\n        return QByteArray();\n    }\n\n    if (flags.testFlag(CryptoFlagCompression))\n        ba = qUncompress(ba);\n\n    m_lastError = ErrorNoError;\n    return ba;\n}"
  },
  {
    "path": "src/robomongo/utils/SimpleCrypt.h",
    "content": "/*\nCopyright (c) 2011, Andre Somers\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n* Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n* Neither the name of the Rathenau Instituut, Andre Somers nor the\nnames of its contributors may be used to endorse or promote products\nderived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL ANDRE SOMERS BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR #######; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef SIMPLECRYPT_H\n#define SIMPLECRYPT_H\n#include <QString>\n#include <QVector>\n#include <QFlags>\n\n/**\n@short Simple encryption and decryption of strings and byte arrays\n\nThis class provides a simple implementation of encryption and decryption\nof strings and byte arrays.\n\n@warning The encryption provided by this class is NOT strong encryption. It may\nhelp to shield things from curious eyes, but it will NOT stand up to someone\ndetermined to break the encryption. Don't say you were not warned.\n\nThe class uses a 64 bit key. Simply create an instance of the class, set the key,\nand use the encryptToString() method to calculate an encrypted version of the input string.\nTo decrypt that string again, use an instance of SimpleCrypt initialized with\nthe same key, and call the decryptToString() method with the encrypted string. If the key\nmatches, the decrypted version of the string will be returned again.\n\nIf you do not provide a key, or if something else is wrong, the encryption and\ndecryption function will return an empty string or will return a string containing nonsense.\nlastError() will return a value indicating if the method was succesful, and if not, why not.\n\nSimpleCrypt is prepared for the case that the encryption and decryption\nalgorithm is changed in a later version, by prepending a version identifier to the cypertext.\n*/\nclass SimpleCrypt\n{\npublic:\n    /**\n    CompressionMode describes if compression will be applied to the data to be\n    encrypted.\n    */\n    enum CompressionMode {\n        CompressionAuto,    /*!< Only apply compression if that results in a shorter plaintext. */\n        CompressionAlways,  /*!< Always apply compression. Note that for short inputs, a compression may result in longer data */\n        CompressionNever    /*!< Never apply compression. */\n    };\n    /**\n    IntegrityProtectionMode describes measures taken to make it possible to detect problems with the data\n    or wrong decryption keys.\n\n    Measures involve adding a checksum or a cryptograhpic hash to the data to be encrypted. This\n    increases the length of the resulting cypertext, but makes it possible to check if the plaintext\n    appears to be valid after decryption.\n    */\n    enum IntegrityProtectionMode {\n        ProtectionNone,    /*!< The integerity of the encrypted data is not protected. It is not really possible to detect a wrong key, for instance. */\n        ProtectionChecksum,/*!< A simple checksum is used to verify that the data is in order. If not, an empty string is returned. */\n        ProtectionHash     /*!< A cryptographic hash is used to verify the integrity of the data. This method produces a much stronger, but longer check */\n    };\n    /**\n    Error describes the type of error that occured.\n    */\n    enum Error {\n        ErrorNoError,         /*!< No error occurred. */\n        ErrorNoKeySet,        /*!< No key was set. You can not encrypt or decrypt without a valid key. */\n        ErrorUnknownVersion,  /*!< The version of this data is unknown, or the data is otherwise not valid. */\n        ErrorIntegrityFailed, /*!< The integrity check of the data failed. Perhaps the wrong key was used. */\n    };\n\n    /**\n    Constructor.\n\n    Constructs a SimpleCrypt instance without a valid key set on it.\n    */\n    SimpleCrypt();\n    /**\n    Constructor.\n\n    Constructs a SimpleCrypt instance and initializes it with the given @arg key.\n    */\n    explicit SimpleCrypt(quint64 key);\n\n\n    /* Robo 1.3 \n    */\n    void encrypt(std::string passwd);\n\n    /**\n    (Re-) initializes the key with the given @arg key.\n    */\n    void setKey(quint64 key);\n    /**\n    Returns true if SimpleCrypt has been initialized with a key.\n    */\n    bool hasKey() const { return !m_keyParts.isEmpty(); }\n\n    /**\n    Sets the compression mode to use when encrypting data. The default mode is Auto.\n\n    Note that decryption is not influenced by this mode, as the decryption recognizes\n    what mode was used when encrypting.\n    */\n    void setCompressionMode(CompressionMode mode) { m_compressionMode = mode; }\n    /**\n    Returns the CompressionMode that is currently in use.\n    */\n    CompressionMode compressionMode() const { return m_compressionMode; }\n\n    /**\n    Sets the integrity mode to use when encrypting data. The default mode is Checksum.\n\n    Note that decryption is not influenced by this mode, as the decryption recognizes\n    what mode was used when encrypting.\n    */\n    void setIntegrityProtectionMode(IntegrityProtectionMode mode) { m_protectionMode = mode; }\n    /**\n    Returns the IntegrityProtectionMode that is currently in use.\n    */\n    IntegrityProtectionMode integrityProtectionMode() const { return m_protectionMode; }\n\n    /**\n    Returns the last error that occurred.\n    */\n    Error lastError() const { return m_lastError; }\n\n    /**\n    Encrypts the @arg plaintext string with the key the class was initialized with, and returns\n    a cyphertext the result. The result is a base64 encoded version of the binary array that is the\n    actual result of the string, so it can be stored easily in a text format.\n    */\n    QString encryptToString(const QString& plaintext);\n    /**\n    Encrypts the @arg plaintext QByteArray with the key the class was initialized with, and returns\n    a cyphertext the result. The result is a base64 encoded version of the binary array that is the\n    actual result of the encryption, so it can be stored easily in a text format.\n    */\n    QString encryptToString(QByteArray plaintext);\n    /**\n    Encrypts the @arg plaintext string with the key the class was initialized with, and returns\n    a binary cyphertext in a QByteArray the result.\n\n    This method returns a byte array, that is useable for storing a binary format. If you need\n    a string you can store in a text file, use encryptToString() instead.\n    */\n    QByteArray encryptToByteArray(const QString& plaintext);\n    /**\n    Encrypts the @arg plaintext QByteArray with the key the class was initialized with, and returns\n    a binary cyphertext in a QByteArray the result.\n\n    This method returns a byte array, that is useable for storing a binary format. If you need\n    a string you can store in a text file, use encryptToString() instead.\n    */\n    QByteArray encryptToByteArray(QByteArray plaintext);\n\n    /**\n    Decrypts a cyphertext string encrypted with this class with the set key back to the\n    plain text version.\n\n    If an error occured, such as non-matching keys between encryption and decryption,\n    an empty string or a string containing nonsense may be returned.\n    */\n    QString decryptToString(const QString& cyphertext);\n    /**\n    Decrypts a cyphertext string encrypted with this class with the set key back to the\n    plain text version.\n\n    If an error occured, such as non-matching keys between encryption and decryption,\n    an empty string or a string containing nonsense may be returned.\n    */\n    QByteArray decryptToByteArray(const QString& cyphertext);\n    /**\n    Decrypts a cyphertext binary encrypted with this class with the set key back to the\n    plain text version.\n\n    If an error occured, such as non-matching keys between encryption and decryption,\n    an empty string or a string containing nonsense may be returned.\n    */\n    QString decryptToString(QByteArray cypher);\n    /**\n    Decrypts a cyphertext binary encrypted with this class with the set key back to the\n    plain text version.\n\n    If an error occured, such as non-matching keys between encryption and decryption,\n    an empty string or a string containing nonsense may be returned.\n    */\n    QByteArray decryptToByteArray(QByteArray cypher);\n\n    //enum to describe options that have been used for the encryption. Currently only one, but\n    //that only leaves room for future extensions like adding a cryptographic hash...\n    enum CryptoFlag {\n        CryptoFlagNone = 0,\n        CryptoFlagCompression = 0x01,\n        CryptoFlagChecksum = 0x02,\n        CryptoFlagHash = 0x04\n    };\n    Q_DECLARE_FLAGS(CryptoFlags, CryptoFlag);\nprivate:\n\n    void splitKey();\n\n    quint64 m_key;\n    QVector<char> m_keyParts;\n    CompressionMode m_compressionMode;\n    IntegrityProtectionMode m_protectionMode;\n    Error m_lastError;\n};\nQ_DECLARE_OPERATORS_FOR_FLAGS(SimpleCrypt::CryptoFlags)\n\n#endif // SimpleCrypt_H"
  },
  {
    "path": "src/robomongo/utils/StringOperations.cpp",
    "content": "#include \"robomongo/utils/StringOperations.h\"\n\nnamespace Robomongo\n{\n    std::string captilizeFirstChar(std::string str)\n    {\n        if (!str.empty())\n            str[0] = static_cast<char>(toupper(str[0]));\n\n        return str;\n    }\n\n}   // end of name space Robomongo"
  },
  {
    "path": "src/robomongo/utils/StringOperations.h",
    "content": "#pragma once\n\n#include <string>\n\nnamespace Robomongo\n{\n    // Capitalize first char (Mongo errors often come all lower case)\n    std::string captilizeFirstChar(std::string str);\n}\n"
  },
  {
    "path": "src/robomongo/utils/StringOperations_test.cpp",
    "content": "#include \"gtest/gtest.h\"\n#include \"robomongo/utils/StringOperations.h\"\n\n#include <string>\n\n/* Example Test:\n *\n * TEST( [Test_Case_Name], [Test_Name] )\n * TEST( [Test_Case_Name], [UnitOfWorkName_ScenarioUnderTest_ExpectedBehavior] )\n * TEST( StringParserTests, NumberLeftOf_StringWithoutNumber_ReturnsFalse) {\n    // ...\n   }\n*/\n\nTEST(StringOperationsTests, captilizeFirstChar)\n{\n    // EXPECT_EQ(\"Abcc\", Robomongo::captilizeFirstChar(\"abc\")); // Simulating failing test\n    EXPECT_EQ(\"Abc\", Robomongo::captilizeFirstChar(\"abc\")); // Simulating passing test\n}"
  },
  {
    "path": "src/robomongo/utils/common.cpp",
    "content": "#include \"robomongo/utils/common.h\"\n\n#include <QFileInfo>\n#include <QSettings>\n\n#include \"robomongo/core/events/MongoEvents.h\"\n#include \"robomongo/core/utils/Logger.h\"\n#include \"robomongo/core/EventBus.h\"\n#include \"robomongo/utils/StringOperations.h\"\n\nnamespace Robomongo\n{\n    void genericEventErrorHandler(Event *event, const std::string &userFriendlyMessage, EventBus* bus, \n                                  QObject* sender)\n    {\n        if (!event->isError())\n            return;\n\n        std::string errMsg = captilizeFirstChar(event->error().errorMessage());\n        LOG_MSG(userFriendlyMessage + \" \" + errMsg, mongo::logger::LogSeverity::Error());\n\n        if (bus && sender)\n            bus->publish(new OperationFailedEvent(sender, errMsg, userFriendlyMessage));\n        else\n            LOG_MSG(\"Failed to publish OperationFailedEvent.\", mongo::logger::LogSeverity::Error());\n    }\n\n    bool fileExists(const QString &filePath)\n    {\n        QFileInfo fileInfo(filePath);\n        return fileInfo.exists() && fileInfo.isFile();\n    }\n\n    template<typename T>\n    bool vectorContains(std::vector<T> const& vec, T const& value) {\n        return find(vec.cbegin(), vec.cend(), value) != vec.cend();\n    }\n\n    QVariant getSetting(QString const& key) {\n        return QSettings(\"3T\", \"Robomongo\").value(key).toSize();\n    }\n\n    void saveSetting(QString const& key, QVariant const& value) {\n        QSettings(\"3T\", \"Robomongo\").setValue(key, value);\n    }\n\n}   // end of name space Robomongo\n"
  },
  {
    "path": "src/robomongo/utils/common.h",
    "content": "#pragma once\n\n// todo: rename to utils.h\n\n#include <string>\n#include <QObject>\n\nnamespace Robomongo /* todo ::utils */\n{\n    class Event;\n    class EventBus;\n\n    // Special handler designed to be used in MongoDatanase and MongoServer classes and only for \n    // event->isError() is true case.\n    void genericEventErrorHandler(\n        Event *event, const std::string &userFriendlyMessage, EventBus* bus, QObject* sender);\n\n    bool fileExists(const QString& filePath);\n\n    template<typename T>\n    bool vectorContains(std::vector<T> const& vec, T const& value);\n\n    QVariant getSetting(QString const& key);\n    void saveSetting(QString const& key, QVariant const& value);\n}"
  },
  {
    "path": "src/robomongo/utils/qzip/qconfig_p.h",
    "content": "#define QT_FEATURE_alloca_h -1\n#define QT_FEATURE_alloca_malloc_h 1\n#define QT_FEATURE_alloca 1\n#define QT_FEATURE_android_style_assets -1\n#define QT_FEATURE_sse2 1\n#define QT_FEATURE_private_tests -1\n#define QT_FEATURE_dbus 1\n#define QT_FEATURE_dbus_linked -1\n#define QT_FEATURE_gui 1\n#define QT_FEATURE_libudev -1\n#define QT_FEATURE_network 1\n#define QT_FEATURE_posix_fallocate -1\n#define QT_FEATURE_qml_debug 1\n#define QT_FEATURE_reduce_exports -1\n#define QT_FEATURE_reduce_relocations -1\n#define QT_FEATURE_release_tools -1\n#define QT_FEATURE_sql 1\n#define QT_FEATURE_stack_protector_strong -1\n#define QT_FEATURE_system_zlib -1\n#define QT_FEATURE_testlib 1\n#define QT_FEATURE_widgets 1\n#define QT_FEATURE_xml 1\n"
  },
  {
    "path": "src/robomongo/utils/qzip/qglobal_p.h",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2015 Intel Corporation.\n** Contact: https://www.qt.io/licensing/\n**\n** This file is part of the QtCore module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see https://www.qt.io/terms-conditions. For further\n** information use the contact form at https://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or (at your option) the GNU General\n** Public license version 3 or any later version approved by the KDE Free\n** Qt Foundation. The licenses are as published by the Free Software\n** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3\n** included in the packaging of this file. Please review the following\n** information to ensure the GNU General Public License requirements will\n** be met: https://www.gnu.org/licenses/gpl-2.0.html and\n** https://www.gnu.org/licenses/gpl-3.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\n#ifndef QGLOBAL_P_H\n#define QGLOBAL_P_H\n\n//\n//  W A R N I N G\n//  -------------\n//\n// This file is not part of the Qt API.  It exists purely as an\n// implementation detail.  This header file may change from version to\n// version without notice, or even be removed.\n//\n// We mean it.\n//\n\n#include \"qglobal.h\"\n#include \"qglobal_p.h\"      // include self to avoid syncqt warning - no-op\n\n#ifndef QT_BOOTSTRAPPED\n#include \"qconfig_p.h\"\n#include \"qtcore-config_p.h\"\n#endif\n\n#endif // QGLOBAL_P_H\n\n"
  },
  {
    "path": "src/robomongo/utils/qzip/qtcore-config_p.h",
    "content": "#define QT_FEATURE_clock_gettime -1\n#define QT_FEATURE_datetimeparser 1\n#define QT_FEATURE_dlopen -1\n#define QT_FEATURE_doubleconversion 1\n#define QT_FEATURE_glib -1\n#define QT_FEATURE_gnu_libiconv -1\n#define QT_FEATURE_icu -1\n#define QT_FEATURE_posix_libiconv -1\n#define QT_FEATURE_iconv -1\n#define QT_FEATURE_inotify -1\n#define QT_FEATURE_journald -1\n#define QT_FEATURE_sha3_fast 1\n#define QT_FEATURE_slog2 -1\n#define QT_FEATURE_syslog -1\n#define QT_FEATURE_system_doubleconversion -1\n#define QT_FEATURE_system_pcre2 -1\n"
  },
  {
    "path": "src/robomongo/utils/qzip/qtgui-config_p.h",
    "content": "#define QT_FEATURE_xcb -1\n#define QT_FEATURE_accessibility_atspi_bridge -1\n#define QT_FEATURE_angle_d3d11_qdtd 1\n#define QT_FEATURE_direct2d 1\n#define QT_FEATURE_directfb -1\n#define QT_FEATURE_directwrite 1\n#define QT_FEATURE_directwrite2 1\n#define QT_FEATURE_egl 1\n#define QT_FEATURE_egl_x11 -1\n#define QT_FEATURE_eglfs -1\n#define QT_FEATURE_eglfs_brcm -1\n#define QT_FEATURE_eglfs_egldevice -1\n#define QT_FEATURE_eglfs_gbm -1\n#define QT_FEATURE_eglfs_mali -1\n#define QT_FEATURE_eglfs_viv -1\n#define QT_FEATURE_eglfs_viv_wl -1\n#define QT_FEATURE_evdev -1\n#define QT_FEATURE_fontconfig -1\n#define QT_FEATURE_freetype 1\n#define QT_FEATURE_gif 1\n#define QT_FEATURE_harfbuzz 1\n#define QT_FEATURE_ico 1\n#define QT_FEATURE_integrityfb -1\n#define QT_FEATURE_integrityhid -1\n#define QT_FEATURE_jpeg 1\n#define QT_FEATURE_kms -1\n#define QT_FEATURE_libinput -1\n#define QT_FEATURE_libinput_axis_api -1\n#define QT_FEATURE_linuxfb -1\n#define QT_FEATURE_mirclient -1\n#define QT_FEATURE_mtdev -1\n#define QT_FEATURE_multiprocess 1\n#define QT_FEATURE_png 1\n#define QT_FEATURE_system_freetype -1\n#define QT_FEATURE_system_harfbuzz -1\n#define QT_FEATURE_system_jpeg -1\n#define QT_FEATURE_system_png -1\n#define QT_FEATURE_system_xcb -1\n#define QT_FEATURE_tslib -1\n#define QT_FEATURE_vnc -1\n#define QT_FEATURE_xkbcommon_evdev -1\n#define QT_FEATURE_xlib -1\n"
  },
  {
    "path": "src/robomongo/utils/qzip/qtguiglobal_p.h",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2016 The Qt Company Ltd.\n** Contact: https://www.qt.io/licensing/\n**\n** This file is part of the QtGui module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see https://www.qt.io/terms-conditions. For further\n** information use the contact form at https://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or (at your option) the GNU General\n** Public license version 3 or any later version approved by the KDE Free\n** Qt Foundation. The licenses are as published by the Free Software\n** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3\n** included in the packaging of this file. Please review the following\n** information to ensure the GNU General Public License requirements will\n** be met: https://www.gnu.org/licenses/gpl-2.0.html and\n** https://www.gnu.org/licenses/gpl-3.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\n#ifndef QTGUIGLOBAL_P_H\n#define QTGUIGLOBAL_P_H\n\n//\n//  W A R N I N G\n//  -------------\n//\n// This file is not part of the Qt API.  It exists purely as an\n// implementation detail.  This header file may change from version to\n// version without notice, or even be removed.\n//\n// We mean it.\n//\n\n#include <QtGui/qtguiglobal.h>\n#include \"qglobal_p.h\"\n#include \"qtgui-config_p.h\"\n\n#endif // QTGUIGLOBAL_P_H\n"
  },
  {
    "path": "src/robomongo/utils/qzip/qzipreader_p.h",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2016 The Qt Company Ltd.\n** Contact: https://www.qt.io/licensing/\n**\n** This file is part of the QtGui module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see https://www.qt.io/terms-conditions. For further\n** information use the contact form at https://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or (at your option) the GNU General\n** Public license version 3 or any later version approved by the KDE Free\n** Qt Foundation. The licenses are as published by the Free Software\n** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3\n** included in the packaging of this file. Please review the following\n** information to ensure the GNU General Public License requirements will\n** be met: https://www.gnu.org/licenses/gpl-2.0.html and\n** https://www.gnu.org/licenses/gpl-3.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\n#ifndef QZIPREADER_H\n#define QZIPREADER_H\n\n#include \"qtguiglobal_p.h\"\n#include <QtCore/qglobal.h>\n\n#ifndef QT_NO_TEXTODFWRITER\n\n//\n//  W A R N I N G\n//  -------------\n//\n// This file is not part of the Qt API.  It exists for the convenience\n// of the QZipReader class.  This header file may change from\n// version to version without notice, or even be removed.\n//\n// We mean it.\n//\n\n#include <QtCore/qdatetime.h>\n#include <QtCore/qfile.h>\n#include <QtCore/qstring.h>\n\nQT_BEGIN_NAMESPACE\n\nclass QZipReaderPrivate;\n\nclass Q_GUI_EXPORT QZipReader\n{\npublic:\n    explicit QZipReader(const QString &fileName, QIODevice::OpenMode mode = QIODevice::ReadOnly );\n\n    explicit QZipReader(QIODevice *device);\n    ~QZipReader();\n\n    QIODevice* device() const;\n\n    bool isReadable() const;\n    bool exists() const;\n\n    struct FileInfo\n    {\n        FileInfo() Q_DECL_NOTHROW\n            : isDir(false), isFile(false), isSymLink(false), crc(0), size(0)\n        {}\n\n        bool isValid() const Q_DECL_NOTHROW { return isDir || isFile || isSymLink; }\n\n        QString filePath;\n        uint isDir : 1;\n        uint isFile : 1;\n        uint isSymLink : 1;\n        QFile::Permissions permissions;\n        uint crc;\n        qint64 size;\n        QDateTime lastModified;\n    };\n\n    QVector<FileInfo> fileInfoList() const;\n    int count() const;\n\n    FileInfo entryInfoAt(int index) const;\n    QByteArray fileData(const QString &fileName) const;\n    bool extractAll(const QString &destinationDir) const;\n\n    enum Status {\n        NoError,\n        FileReadError,\n        FileOpenError,\n        FilePermissionsError,\n        FileError\n    };\n\n    Status status() const;\n\n    void close();\n\nprivate:\n    QZipReaderPrivate *d;\n    Q_DISABLE_COPY(QZipReader)\n};\nQ_DECLARE_TYPEINFO(QZipReader::FileInfo, Q_MOVABLE_TYPE);\nQ_DECLARE_TYPEINFO(QZipReader::Status, Q_PRIMITIVE_TYPE);\n\nQT_END_NAMESPACE\n\n#endif // QT_NO_TEXTODFWRITER\n#endif // QZIPREADER_H\n"
  },
  {
    "path": "src/robomongo-unit-tests/CMakeLists.txt",
    "content": "#########################################\n###   Unit Testing with Google Test   ###\n#########################################\n\n### --- Important Note\nif (SYSTEM_LINUX)        \n    message(\"\\n *Note: Currently unit testing is disabled for Linux \" \n                \"due to MongoDB linking problems\")\n    return()\nendif()\n\n### --- Enable and setup gtest \nenable_testing()\ninclude_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})\nset(gtest_force_shared_crt ON CACHE BOOL \"\" FORCE)\n\n### --- Setup test source files\n# New test & source file pairs MUST have the following format: \n#  Test file:   /path/Foo_test.cpp\n#  Source file: /path/Foo.cpp or /path/Foo.h\nset(ROBO_SRC_DIR ${CMAKE_HOME_DIRECTORY}/src/robomongo)\nset(SOURCES_TEST\n    ${ROBO_SRC_DIR}/utils/RoboCrypt_test.cpp\n    ${ROBO_SRC_DIR}/utils/StringOperations_test.cpp\n    ${ROBO_SRC_DIR}/core/HexUtils_test.cpp\n)\n\n### --- Setup robo_unit_tests exec. & link ROBO_OBJ_FILES\nadd_executable(robo_unit_tests ${SOURCES_TEST})\nadd_dependencies(robo_unit_tests robomongo)\ntarget_include_directories(robo_unit_tests PRIVATE ${CMAKE_HOME_DIRECTORY}/src)\n\nget_target_property(ROBO_SOURCES robomongo SOURCES)\nlist(FILTER ROBO_SOURCES INCLUDE REGEX \"cpp\")\nlist(FILTER ROBO_SOURCES EXCLUDE REGEX \"main.cpp\")\n\nif(SYSTEM_WINDOWS)\n    set(OBJ_DIR ${CMAKE_BINARY_DIR}/src/robomongo/robomongo.dir/${CMAKE_BUILD_TYPE}/)\n    set(ROBO_OBJ_FILES \"${ROBO_OBJ_FILES}${OBJ_DIR}mocs_compilation.obj;\")\n    set(ROBO_OBJ_FILES \"${ROBO_OBJ_FILES}${OBJ_DIR}qrc_gui.obj;\")\n    set(ROBO_OBJ_FILES \"${ROBO_OBJ_FILES}${OBJ_DIR}qrc_robo.obj;\")\n    foreach(SRC_FILE ${ROBO_SOURCES})\n        get_filename_component(FILENAME ${SRC_FILE} NAME)\n        string(REPLACE \".cpp\" \".obj\" FILENAME ${FILENAME})\n        set(ROBO_OBJ_FILES \"${ROBO_OBJ_FILES}${OBJ_DIR}${FILENAME};\")        \n    endforeach()\nelseif(SYSTEM_MACOSX) \n    set(OBJ_DIR ${CMAKE_BINARY_DIR}/src/robomongo/CMakeFiles/robomongo.dir/)\n    set(ROBO_OBJ_FILES \"${ROBO_OBJ_FILES}${OBJ_DIR}/robomongo_autogen/mocs_compilation.cpp.o;\")\n    set(ROBO_OBJ_FILES \"${ROBO_OBJ_FILES}${OBJ_DIR}/robomongo_autogen/YHP5W5E6RA/qrc_gui.cpp.o;\")\n    set(ROBO_OBJ_FILES \"${ROBO_OBJ_FILES}${OBJ_DIR}/robomongo_autogen/3YJK5W5UP7/qrc_robo.cpp.o;\")\n    foreach(SRC_FILE ${ROBO_SOURCES})\n        string(REPLACE \".cpp\" \".cpp.o\" OBJ_FILE ${SRC_FILE})\n        set(ROBO_OBJ_FILES \"${ROBO_OBJ_FILES}${OBJ_DIR}${OBJ_FILE};\")        \n    endforeach()\n\n    find_library(SECURITY NAMES Security)\n    find_library(CORE_FOUNDATION NAMES CoreFoundation)\n    set(SSL_LIBRARIES ${SECURITY} ${CORE_FOUNDATION})\n    target_link_libraries(robo_unit_tests ${SSL_LIBRARIES} -lresolv)\n# elseif(SYSTEM_LINUX) \n#     set(OBJ_DIR ${CMAKE_BINARY_DIR}/src/robomongo/CMakeFiles/robomongo.dir/)\n#     message(\"--- OBJ_DIR: \" ${OBJ_DIR})\n#     set(ROBO_OBJ_FILES \"${ROBO_OBJ_FILES}${OBJ_DIR}/robomongo_automoc.cpp.o;\")\n#     set(ROBO_OBJ_FILES \"${ROBO_OBJ_FILES}${OBJ_DIR}/robomongo_automoc.dir/gui/resources/qrc_gui.cpp.o;\")\n#     set(ROBO_OBJ_FILES \"${ROBO_OBJ_FILES}${OBJ_DIR}/robomongo_automoc.dir/resources/qrc_robo.cpp.o;\")    \n#     foreach(SRC_FILE ${ROBO_SOURCES})\n#         string(REPLACE \".cpp\" \".cpp.o\" OBJ_FILE ${SRC_FILE})\n#         set(ROBO_OBJ_FILES \"${ROBO_OBJ_FILES}${OBJ_DIR}${OBJ_FILE};\")        \n#     endforeach()\nendif()\n\n# Disable WebEngineWidgets for Linux\nSET(WebEngineWidgets \"Qt5::WebEngineWidgets\") \nif(SYSTEM_LINUX)\n   SET(WebEngineWidgets)  \nendif()\n\ntarget_link_libraries(robo_unit_tests \n    gtest \n    gtest_main\n    Qt5::Widgets\n    Qt5::Network\n    Qt5::Xml\n    ${WebEngineWidgets}\n    qjson\n    qscintilla\n    mongodb\n    ssh\n    Threads::Threads\n    ${ROBO_OBJ_FILES}\n)\n\n### --- Install DLLs for Windows\nif(CMAKE_BUILD_TYPE STREQUAL \"Debug\") \n    set(D \"d\") \nendif()\n\nif(SYSTEM_WINDOWS)\n    get_target_property(target_path Qt5::Core LOCATION)\n    get_filename_component(qt_bin_dir ${target_path} DIRECTORY)\n    set(QT_BIN_FILES \"${QT_BIN_FILES}\" ${qt_bin_dir}/Qt5Core${D}${CMAKE_SHARED_LIBRARY_SUFFIX};)\n    set(QT_BIN_FILES \"${QT_BIN_FILES}\" ${qt_bin_dir}/Qt5Gui${D}${CMAKE_SHARED_LIBRARY_SUFFIX};)\n    set(QT_BIN_FILES \"${QT_BIN_FILES}\" ${qt_bin_dir}/Qt5Network${D}${CMAKE_SHARED_LIBRARY_SUFFIX};)\n    set(QT_BIN_FILES \"${QT_BIN_FILES}\" ${qt_bin_dir}/Qt5PrintSupport${D}${CMAKE_SHARED_LIBRARY_SUFFIX};)\n    set(QT_BIN_FILES \"${QT_BIN_FILES}\" ${qt_bin_dir}/Qt5Widgets${D}${CMAKE_SHARED_LIBRARY_SUFFIX};)\n    set(QT_BIN_FILES \"${QT_BIN_FILES}\" ${qt_bin_dir}/Qt5Xml${D}${CMAKE_SHARED_LIBRARY_SUFFIX};)\n    set(QT_BIN_FILES \"${QT_BIN_FILES}\" ${qt_bin_dir}/Qt5Positioning${D}${CMAKE_SHARED_LIBRARY_SUFFIX};)\n    set(QT_BIN_FILES \"${QT_BIN_FILES}\" ${qt_bin_dir}/Qt5Qml${D}${CMAKE_SHARED_LIBRARY_SUFFIX};)\n    set(QT_BIN_FILES \"${QT_BIN_FILES}\" ${qt_bin_dir}/Qt5Quick${D}${CMAKE_SHARED_LIBRARY_SUFFIX};)\n    set(QT_BIN_FILES \"${QT_BIN_FILES}\" ${qt_bin_dir}/Qt5QuickWidgets${D}${CMAKE_SHARED_LIBRARY_SUFFIX};)\n    set(QT_BIN_FILES \"${QT_BIN_FILES}\" ${qt_bin_dir}/Qt5WebChannel${D}${CMAKE_SHARED_LIBRARY_SUFFIX};)\n    set(QT_BIN_FILES \"${QT_BIN_FILES}\" ${qt_bin_dir}/Qt5WebEngineCore${D}${CMAKE_SHARED_LIBRARY_SUFFIX};)\n    set(QT_BIN_FILES \"${QT_BIN_FILES}\" ${qt_bin_dir}/Qt5WebEngineWidgets${D}${CMAKE_SHARED_LIBRARY_SUFFIX};)\n    set(QT_BIN_FILES \"${QT_BIN_FILES}\" ${qt_bin_dir}/Qt5PrintSupport${D}${CMAKE_SHARED_LIBRARY_SUFFIX};)\n\n    get_target_property(TESTS_BIN_DIR robo_unit_tests BINARY_DIR)\n    file(COPY ${QT_BIN_FILES} DESTINATION ${TESTS_BIN_DIR}/${CMAKE_BUILD_TYPE})\n    file(COPY \n        ${OpenSSL_DIR}/libssl-1_1-x64.dll\n        ${OpenSSL_DIR}/libcrypto-1_1-x64.dll\n        DESTINATION ${TESTS_BIN_DIR}/${CMAKE_BUILD_TYPE})\nendif()"
  },
  {
    "path": "src/robomongo-unit-tests/README.md",
    "content": "This is just a placeholder for `cmake`. \n\nTest source files are located in the same directory alongside the tested file in `robomongo/src/robomongo/` dir and sub-dirs.\n\ne.g. \n```\n...\nRoboCrypt.cpp\nRoboCrypt_test.cpp\n...\nStringOperations.cpp\nStringOperations_test.cpp\n...\n```\n"
  },
  {
    "path": "src/third-party/README.md",
    "content": "Third-party dependencies\n========================\n   \nRobomongo automatically compiles and statically links to the following\nlibraries:\n\n1. QJson \n2. QScintilla\n\nYou do not need to build them separately. \n"
  },
  {
    "path": "src/third-party/esprima-2.7.3/README.md",
    "content": "jquery/esprima\n----------------\nEsprima (esprima.org, BSD license) is a high performance, standard-compliant ECMAScript parser written in ECMAScript (also popularly known as JavaScript)\n\nOrigin:  \nhttps://github.com/jquery/esprima\n\nRobo path:  \nhttps://github.com/Studio3T/robomongo/blob/master/src/robomongo/gui/resources/scripts/esprima.js\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/.gitignore",
    "content": "# Ignore CI build directory\nbuild/\nxcuserdata\ncmake-build-debug/\n.idea/\nbazel-bin\nbazel-genfiles\nbazel-googletest\nbazel-out\nbazel-testlogs\n# python\n*.pyc\n\n# Visual Studio files\n*.sdf\n*.opensdf\n*.VC.opendb\n*.suo\n*.user\n_ReSharper.Caches/\nWin32-Debug/\nWin32-Release/\nx64-Debug/\nx64-Release/\n\n# Ignore autoconf / automake files\nMakefile.in\naclocal.m4\nconfigure\nbuild-aux/\nautom4te.cache/\ngoogletest/m4/libtool.m4\ngoogletest/m4/ltoptions.m4\ngoogletest/m4/ltsugar.m4\ngoogletest/m4/ltversion.m4\ngoogletest/m4/lt~obsolete.m4\n\n# Ignore generated directories.\ngooglemock/fused-src/\ngoogletest/fused-src/\n\n# macOS files\n.DS_Store\n\n# Ignore cmake generated directories and files.\nCMakeFiles\nCTestTestfile.cmake\nMakefile\ncmake_install.cmake\ngooglemock/CMakeFiles\ngooglemock/CTestTestfile.cmake\ngooglemock/Makefile\ngooglemock/cmake_install.cmake\ngooglemock/gtest\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/.travis.yml",
    "content": "# Build matrix / environment variable are explained on:\n# https://docs.travis-ci.com/user/customizing-the-build/\n# This file can be validated on:\n# http://lint.travis-ci.org/\n\nsudo: false\nlanguage: cpp\n\n# Define the matrix explicitly, manually expanding the combinations of (os, compiler, env).\n# It is more tedious, but grants us far more flexibility.\nmatrix:\n  include:\n    - os: linux\n      compiler: gcc\n      sudo : true\n      install: ./ci/install-linux.sh && ./ci/log-config.sh\n      script: ./ci/build-linux-bazel.sh\n    - os: linux\n      compiler: clang\n      sudo : true\n      install: ./ci/install-linux.sh && ./ci/log-config.sh\n      script: ./ci/build-linux-bazel.sh\n    - os: linux\n      group: deprecated-2017Q4\n      compiler: gcc\n      install: ./ci/install-linux.sh && ./ci/log-config.sh\n      script: ./ci/build-linux-autotools.sh\n    - os: linux\n      group: deprecated-2017Q4\n      compiler: gcc\n      env: BUILD_TYPE=Debug VERBOSE=1 CXX_FLAGS=-std=c++11\n    - os: linux\n      group: deprecated-2017Q4\n      compiler: clang\n      env: BUILD_TYPE=Debug VERBOSE=1\n    - os: linux\n      group: deprecated-2017Q4\n      compiler: clang\n      env: BUILD_TYPE=Release VERBOSE=1 CXX_FLAGS=-std=c++11\n    - os: linux\n      compiler: clang\n      env: BUILD_TYPE=Release VERBOSE=1 CXX_FLAGS=-std=c++11 NO_EXCEPTION=ON NO_RTTI=ON COMPILER_IS_GNUCXX=ON\n    - os: osx\n      compiler: gcc\n      env: BUILD_TYPE=Debug VERBOSE=1\n    - os: osx\n      compiler: gcc\n      env: BUILD_TYPE=Release VERBOSE=1 CXX_FLAGS=-std=c++11\n    - os: osx\n      compiler: clang\n      env: BUILD_TYPE=Debug VERBOSE=1\n      if: type != pull_request\n    - os: osx\n      env: BUILD_TYPE=Release VERBOSE=1 CXX_FLAGS=-std=c++11\n      if: type != pull_request\n\n# These are the install and build (script) phases for the most common entries in the matrix.  They could be included\n# in each entry in the matrix, but that is just repetitive.\ninstall:\n  - ./ci/install-${TRAVIS_OS_NAME}.sh\n  - . ./ci/env-${TRAVIS_OS_NAME}.sh\n  - ./ci/log-config.sh\n\nscript: ./ci/travis.sh\n\n# For sudo=false builds this section installs the necessary dependencies.\naddons:\n  apt:\n    # List of whitelisted in travis packages for ubuntu-precise can be found here:\n    #   https://github.com/travis-ci/apt-package-whitelist/blob/master/ubuntu-precise\n    # List of whitelisted in travis apt-sources:\n    #   https://github.com/travis-ci/apt-source-whitelist/blob/master/ubuntu.json\n    sources:\n    - ubuntu-toolchain-r-test\n    - llvm-toolchain-precise-3.9\n    packages:\n    - g++-4.9\n    - clang-3.9\n\nnotifications:\n  email: false\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/BUILD.bazel",
    "content": "# Copyright 2017 Google Inc.\n# All Rights Reserved.\n#\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n# Author: misterg@google.com (Gennadiy Civil)\n#\n#   Bazel Build for Google C++ Testing Framework(Google Test)\n\npackage(default_visibility = [\"//visibility:public\"])\n\nlicenses([\"notice\"])\n\nconfig_setting(\n    name = \"windows\",\n    values = {\"cpu\": \"x64_windows\"},\n)\n\nconfig_setting(\n    name = \"windows_msvc\",\n    values = {\"cpu\": \"x64_windows_msvc\"},\n)\n\nconfig_setting(\n    name = \"has_absl\",\n    values = {\"define\": \"absl=1\"},\n)\n\n# Google Test including Google Mock\ncc_library(\n    name = \"gtest\",\n    srcs = glob(\n        include = [\n            \"googletest/src/*.cc\",\n            \"googletest/src/*.h\",\n            \"googletest/include/gtest/**/*.h\",\n            \"googlemock/src/*.cc\",\n            \"googlemock/include/gmock/**/*.h\",\n        ],\n        exclude = [\n            \"googletest/src/gtest-all.cc\",\n            \"googletest/src/gtest_main.cc\",\n            \"googlemock/src/gmock-all.cc\",\n            \"googlemock/src/gmock_main.cc\",\n        ],\n    ),\n    hdrs = glob([\n        \"googletest/include/gtest/*.h\",\n        \"googlemock/include/gmock/*.h\",\n    ]),\n    copts = select(\n        {\n            \":windows\": [],\n            \":windows_msvc\": [],\n            \"//conditions:default\": [\"-pthread\"],\n        },\n    ),\n    defines = select(\n        {\n            \":has_absl\": [\n                \"GTEST_HAS_ABSL=1\",\n            ],\n            \"//conditions:default\": [],\n        },\n    ),\n    includes = [\n        \"googlemock\",\n        \"googlemock/include\",\n        \"googletest\",\n        \"googletest/include\",\n    ],\n    linkopts = select({\n        \":windows\": [],\n        \":windows_msvc\": [],\n        \"//conditions:default\": [\n            \"-pthread\",\n        ],\n    }),\n    deps = select(\n        {\n            \":has_absl\": [\n                \"@com_google_absl//absl/debugging:failure_signal_handler\",\n                \"@com_google_absl//absl/debugging:stacktrace\",\n                \"@com_google_absl//absl/debugging:symbolize\",\n                \"@com_google_absl//absl/strings\",\n                \"@com_google_absl//absl/types:optional\",\n                \"@com_google_absl//absl/types:variant\",\n            ],\n            \"//conditions:default\": [],\n        },\n    ),\n)\n\ncc_library(\n    name = \"gtest_main\",\n    srcs = [\n        \"googlemock/src/gmock_main.cc\",\n    ],\n    deps = [\":gtest\"],\n)\n\n# The following rules build samples of how to use gTest.\ncc_library(\n    name = \"gtest_sample_lib\",\n    srcs = [\n        \"googletest/samples/sample1.cc\",\n        \"googletest/samples/sample2.cc\",\n        \"googletest/samples/sample4.cc\",\n    ],\n    hdrs = [\n        \"googletest/samples/prime_tables.h\",\n        \"googletest/samples/sample1.h\",\n        \"googletest/samples/sample2.h\",\n        \"googletest/samples/sample3-inl.h\",\n        \"googletest/samples/sample4.h\",\n    ],\n)\n\ncc_test(\n    name = \"gtest_samples\",\n    size = \"small\",\n    #All Samples except:\n    #sample9 ( main )\n    #sample10 (main and takes a command line option and needs to be separate)\n    srcs = [\n        \"googletest/samples/sample1_unittest.cc\",\n        \"googletest/samples/sample2_unittest.cc\",\n        \"googletest/samples/sample3_unittest.cc\",\n        \"googletest/samples/sample4_unittest.cc\",\n        \"googletest/samples/sample5_unittest.cc\",\n        \"googletest/samples/sample6_unittest.cc\",\n        \"googletest/samples/sample7_unittest.cc\",\n        \"googletest/samples/sample8_unittest.cc\",\n    ],\n    deps = [\n        \"gtest_sample_lib\",\n        \":gtest_main\",\n    ],\n)\n\ncc_test(\n    name = \"sample9_unittest\",\n    size = \"small\",\n    srcs = [\"googletest/samples/sample9_unittest.cc\"],\n    deps = [\":gtest\"],\n)\n\ncc_test(\n    name = \"sample10_unittest\",\n    size = \"small\",\n    srcs = [\"googletest/samples/sample10_unittest.cc\"],\n    deps = [\n        \":gtest\",\n    ],\n)\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 2.8.8)\n\nif (POLICY CMP0048)\n  cmake_policy(SET CMP0048 NEW)\nendif (POLICY CMP0048)\n\nproject(googletest-distribution)\nset(GOOGLETEST_VERSION 1.9.0)\n\nenable_testing()\n\ninclude(CMakeDependentOption)\ninclude(GNUInstallDirs)\n\n#Note that googlemock target already builds googletest\noption(BUILD_GMOCK \"Builds the googlemock subproject\" ON)\noption(INSTALL_GTEST \"Enable installation of googletest. (Projects embedding googletest may want to turn this OFF.)\" ON)\n\nif(BUILD_GMOCK)\n  add_subdirectory( googlemock )\nelse()\n  add_subdirectory( googletest )\nendif()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/CONTRIBUTING.md",
    "content": "# How to become a contributor and submit your own code\n\n## Contributor License Agreements\n\nWe'd love to accept your patches! Before we can take them, we\nhave to jump a couple of legal hurdles.\n\nPlease fill out either the individual or corporate Contributor License Agreement\n(CLA).\n\n  * If you are an individual writing original source code and you're sure you\n    own the intellectual property, then you'll need to sign an\n    [individual CLA](https://developers.google.com/open-source/cla/individual).\n  * If you work for a company that wants to allow you to contribute your work,\n    then you'll need to sign a\n    [corporate CLA](https://developers.google.com/open-source/cla/corporate).\n\nFollow either of the two links above to access the appropriate CLA and\ninstructions for how to sign and return it. Once we receive it, we'll be able to\naccept your pull requests.\n\n## Are you a Googler?\nIf you are a Googler, you can either create an internal change or work on GitHub directly.\n\n\n## Contributing A Patch\n\n1. Submit an issue describing your proposed change to the\n   [issue tracker](https://github.com/google/googletest).\n1. Please don't mix more than one logical change per submittal,\n   because it makes the history hard to follow. If you want to make a\n   change that doesn't have a corresponding issue in the issue\n   tracker, please create one.\n1. Also, coordinate with team members that are listed on the issue in\n   question. This ensures that work isn't being duplicated and\n   communicating your plan early also generally leads to better\n   patches.\n1. If your proposed change is accepted, and you haven't already done so, sign a\n   Contributor License Agreement (see details above).\n1. Fork the desired repo, develop and test your code changes.\n1. Ensure that your code adheres to the existing style in the sample to which\n   you are contributing.\n1. Ensure that your code has an appropriate set of unit tests which all pass.\n1. Submit a pull request.\n\n## The Google Test and Google Mock Communities ##\n\nThe Google Test community exists primarily through the\n[discussion group](http://groups.google.com/group/googletestframework)\nand the GitHub repository.\nLikewise, the Google Mock community exists primarily through their own\n[discussion group](http://groups.google.com/group/googlemock).\nYou are definitely encouraged to contribute to the\ndiscussion and you can also help us to keep the effectiveness of the\ngroup high by following and promoting the guidelines listed here.\n\n### Please Be Friendly ###\n\nShowing courtesy and respect to others is a vital part of the Google\nculture, and we strongly encourage everyone participating in Google\nTest development to join us in accepting nothing less. Of course,\nbeing courteous is not the same as failing to constructively disagree\nwith each other, but it does mean that we should be respectful of each\nother when enumerating the 42 technical reasons that a particular\nproposal may not be the best choice. There's never a reason to be\nantagonistic or dismissive toward anyone who is sincerely trying to\ncontribute to a discussion.\n\nSure, C++ testing is serious business and all that, but it's also\na lot of fun. Let's keep it that way. Let's strive to be one of the\nfriendliest communities in all of open source.\n\nAs always, discuss Google Test in the official GoogleTest discussion group.\nYou don't have to actually submit code in order to sign up. Your participation\nitself is a valuable contribution.\n\n## Style\n\nTo keep the source consistent, readable, diffable and easy to merge,\nwe use a fairly rigid coding style, as defined by the [google-styleguide](https://github.com/google/styleguide) project.  All patches will be expected\nto conform to the style outlined [here](https://google.github.io/styleguide/cppguide.html).\n\n## Requirements for Contributors ###\n\nIf you plan to contribute a patch, you need to build Google Test,\nGoogle Mock, and their own tests from a git checkout, which has\nfurther requirements:\n\n  * [Python](https://www.python.org/) v2.3 or newer (for running some of\n    the tests and re-generating certain source files from templates)\n  * [CMake](https://cmake.org/) v2.6.4 or newer\n  * [GNU Build System](https://en.wikipedia.org/wiki/GNU_Build_System)\n    including automake (>= 1.9), autoconf (>= 2.59), and\n    libtool / libtoolize.\n\n## Developing Google Test ##\n\nThis section discusses how to make your own changes to Google Test.\n\n### Testing Google Test Itself ###\n\nTo make sure your changes work as intended and don't break existing\nfunctionality, you'll want to compile and run Google Test's own tests.\nFor that you can use CMake:\n\n    mkdir mybuild\n    cd mybuild\n    cmake -Dgtest_build_tests=ON ${GTEST_DIR}\n\nMake sure you have Python installed, as some of Google Test's tests\nare written in Python.  If the cmake command complains about not being\nable to find Python (`Could NOT find PythonInterp (missing:\nPYTHON_EXECUTABLE)`), try telling it explicitly where your Python\nexecutable can be found:\n\n    cmake -DPYTHON_EXECUTABLE=path/to/python -Dgtest_build_tests=ON ${GTEST_DIR}\n\nNext, you can build Google Test and all of its own tests.  On \\*nix,\nthis is usually done by 'make'.  To run the tests, do\n\n    make test\n\nAll tests should pass.\n\n### Regenerating Source Files ##\n\nSome of Google Test's source files are generated from templates (not\nin the C++ sense) using a script.\nFor example, the\nfile include/gtest/internal/gtest-type-util.h.pump is used to generate\ngtest-type-util.h in the same directory.\n\nYou don't need to worry about regenerating the source files\nunless you need to modify them.  You would then modify the\ncorresponding `.pump` files and run the '[pump.py](googletest/scripts/pump.py)'\ngenerator script.  See the [Pump Manual](googletest/docs/PumpManual.md).\n\n## Developing Google Mock ###\n\nThis section discusses how to make your own changes to Google Mock.\n\n#### Testing Google Mock Itself ####\n\nTo make sure your changes work as intended and don't break existing\nfunctionality, you'll want to compile and run Google Test's own tests.\nFor that you'll need Autotools.  First, make sure you have followed\nthe instructions above to configure Google Mock.\nThen, create a build output directory and enter it.  Next,\n\n    ${GMOCK_DIR}/configure  # try --help for more info\n\nOnce you have successfully configured Google Mock, the build steps are\nstandard for GNU-style OSS packages.\n\n    make        # Standard makefile following GNU conventions\n    make check  # Builds and runs all tests - all should pass.\n\nNote that when building your project against Google Mock, you are building\nagainst Google Test as well.  There is no need to configure Google Test\nseparately.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/LICENSE",
    "content": "Copyright 2008, Google Inc.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n    * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/Makefile.am",
    "content": "## Process this file with automake to produce Makefile.in\nACLOCAL_AMFLAGS = -I m4\n\nAUTOMAKE_OPTIONS = foreign\n\n# Build . before src so that our all-local and clean-local hooks kicks in at\n# the right time.\nSUBDIRS = googletest googlemock\n\nEXTRA_DIST = \\\n  BUILD.bazel \\\n  CMakeLists.txt \\\n  README.md \\\n  WORKSPACE\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/README.md",
    "content": "\n# Google Test #\n\n[![Build Status](https://travis-ci.org/google/googletest.svg?branch=master)](https://travis-ci.org/google/googletest)\n[![Build status](https://ci.appveyor.com/api/projects/status/4o38plt0xbo1ubc8/branch/master?svg=true)](https://ci.appveyor.com/project/GoogleTestAppVeyor/googletest/branch/master)\n\n**Future Plans**:\n* 1.8.x Release - the 1.8.x will be the last release that works with pre-C++11 compilers. The 1.8.x will not accept any requests for any new features and any bugfix requests will only be accepted if proven \"critical\"\n* Post 1.8.x - work to improve/cleanup/pay technical debt. When this work is completed there will be a 1.9.x tagged release\n* Post 1.9.x googletest will follow [Abseil Live at Head philosophy](https://abseil.io/about/philosophy)\n\n\nWelcome to **Google Test**, Google's C++ test framework!\n\nThis repository is a merger of the formerly separate GoogleTest and\nGoogleMock projects. These were so closely related that it makes sense to\nmaintain and release them together.\n\nPlease see the project page above for more information as well as the\nmailing list for questions, discussions, and development.  There is\nalso an IRC channel on [OFTC](https://webchat.oftc.net/) (irc.oftc.net) #gtest available.  Please\njoin us!\n\nGetting started information for **Google Test** is available in the\n[Google Test Primer](googletest/docs/primer.md) documentation.\n\n**Google Mock** is an extension to Google Test for writing and using C++ mock\nclasses.  See the separate [Google Mock documentation](googlemock/README.md).\n\nMore detailed documentation for googletest (including build instructions) are\nin its interior [googletest/README.md](googletest/README.md) file.\n\n## Features ##\n\n  * An [xUnit](https://en.wikipedia.org/wiki/XUnit) test framework.\n  * Test discovery.\n  * A rich set of assertions.\n  * User-defined assertions.\n  * Death tests.\n  * Fatal and non-fatal failures.\n  * Value-parameterized tests.\n  * Type-parameterized tests.\n  * Various options for running the tests.\n  * XML test report generation.\n\n## Platforms ##\n\nGoogle test has been used on a variety of platforms:\n\n  * Linux\n  * Mac OS X\n  * Windows\n  * Cygwin\n  * MinGW\n  * Windows Mobile\n  * Symbian\n\n## Who Is Using Google Test? ##\n\nIn addition to many internal projects at Google, Google Test is also used by\nthe following notable projects:\n\n  * The [Chromium projects](http://www.chromium.org/) (behind the Chrome\n    browser and Chrome OS).\n  * The [LLVM](http://llvm.org/) compiler.\n  * [Protocol Buffers](https://github.com/google/protobuf), Google's data\n    interchange format.\n  * The [OpenCV](http://opencv.org/) computer vision library.\n  * [tiny-dnn](https://github.com/tiny-dnn/tiny-dnn): header only, dependency-free deep learning framework in C++11.\n\n## Related Open Source Projects ##\n\n[GTest Runner](https://github.com/nholthaus/gtest-runner) is a Qt5 based automated test-runner and Graphical User Interface with powerful features for Windows and Linux platforms.\n\n[Google Test UI](https://github.com/ospector/gtest-gbar) is test runner that runs\nyour test binary, allows you to track its progress via a progress bar, and\ndisplays a list of test failures. Clicking on one shows failure text. Google\nTest UI is written in C#.\n\n[GTest TAP Listener](https://github.com/kinow/gtest-tap-listener) is an event\nlistener for Google Test that implements the\n[TAP protocol](https://en.wikipedia.org/wiki/Test_Anything_Protocol) for test\nresult output. If your test runner understands TAP, you may find it useful.\n\n[gtest-parallel](https://github.com/google/gtest-parallel) is a test runner that\nruns tests from your binary in parallel to provide significant speed-up.\n\n[GoogleTest Adapter](https://marketplace.visualstudio.com/items?itemName=DavidSchuldenfrei.gtest-adapter) is a VS Code extension allowing to view Google Tests in a tree view, and run/debug your tests.\n\n## Requirements ##\n\nGoogle Test is designed to have fairly minimal requirements to build\nand use with your projects, but there are some.  Currently, we support\nLinux, Windows, Mac OS X, and Cygwin.  We will also make our best\neffort to support other platforms (e.g. Solaris, AIX, and z/OS).\nHowever, since core members of the Google Test project have no access\nto these platforms, Google Test may have outstanding issues there.  If\nyou notice any problems on your platform, please notify\n[googletestframework@googlegroups.com](https://groups.google.com/forum/#!forum/googletestframework). Patches for fixing them are\neven more welcome!\n\n### Linux Requirements ###\n\nThese are the base requirements to build and use Google Test from a source\npackage (as described below):\n\n  * GNU-compatible Make or gmake\n  * POSIX-standard shell\n  * POSIX(-2) Regular Expressions (regex.h)\n  * A C++98-standard-compliant compiler\n\n### Windows Requirements ###\n\n  * Microsoft Visual C++ 2015 or newer\n\n### Cygwin Requirements ###\n\n  * Cygwin v1.5.25-14 or newer\n\n### Mac OS X Requirements ###\n\n  * Mac OS X v10.4 Tiger or newer\n  * Xcode Developer Tools\n\n## Contributing change\n\nPlease read the [`CONTRIBUTING.md`](CONTRIBUTING.md) for details on\nhow to contribute to this project.\n\nHappy testing!\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/WORKSPACE",
    "content": "workspace(name = \"com_google_googletest\")\n\n# Abseil\nhttp_archive(\n     name = \"com_google_absl\",\n     urls = [\"https://github.com/abseil/abseil-cpp/archive/master.zip\"],\n     strip_prefix = \"abseil-cpp-master\",\n)\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/appveyor.yml",
    "content": "version: '{build}'\n\nos: Visual Studio 2015\n\nenvironment:\n  matrix:\n    - compiler: msvc-15-seh\n      generator: \"Visual Studio 15 2017\"\n      APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017\n\n    - compiler: msvc-15-seh\n      generator: \"Visual Studio 15 2017 Win64\"\n      APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017\n      enabled_on_pr: yes\n\n    - compiler: msvc-14-seh\n      generator: \"Visual Studio 14 2015\"\n      enabled_on_pr: yes\n\n    - compiler: msvc-14-seh\n      generator: \"Visual Studio 14 2015 Win64\"\n\n    - compiler: gcc-5.3.0-posix\n      generator: \"MinGW Makefiles\"\n      cxx_path: 'C:\\mingw-w64\\i686-5.3.0-posix-dwarf-rt_v4-rev0\\mingw32\\bin'\n\n    - compiler: gcc-6.3.0-posix\n      generator: \"MinGW Makefiles\"\n      cxx_path: 'C:\\mingw-w64\\i686-6.3.0-posix-dwarf-rt_v5-rev1\\mingw32\\bin'\n\nconfiguration:\n  - Debug\n\nbuild:\n  verbosity: minimal\n\ninstall:\n- ps: |\n    Write-Output \"Compiler: $env:compiler\"\n    Write-Output \"Generator: $env:generator\"\n    if (-not (Test-Path env:APPVEYOR_PULL_REQUEST_NUMBER)) {\n      Write-Output \"This is *NOT* a pull request build\"\n    } else {\n      Write-Output \"This is a pull request build\"\n      if (-not (Test-Path env:enabled_on_pr) -or $env:enabled_on_pr -ne \"yes\") {\n        Write-Output \"PR builds are *NOT* explicitly enabled\"\n      }\n    }\n\n    # git bash conflicts with MinGW makefiles\n    if ($env:generator -eq \"MinGW Makefiles\") {\n        $env:path = $env:path.replace(\"C:\\Program Files\\Git\\usr\\bin;\", \"\")\n        if ($env:cxx_path -ne \"\") {\n            $env:path += \";$env:cxx_path\"\n        }\n    }\n\nbuild_script:\n- ps: |\n    # Only enable some builds for pull requests, the AppVeyor queue is too long.\n    if ((Test-Path env:APPVEYOR_PULL_REQUEST_NUMBER) -And (-not (Test-Path env:enabled_on_pr) -or $env:enabled_on_pr -ne \"yes\")) {\n      return\n    }\n    md _build -Force | Out-Null\n    cd _build\n\n    $conf = if ($env:generator -eq \"MinGW Makefiles\") {\"-DCMAKE_BUILD_TYPE=$env:configuration\"} else {\"-DCMAKE_CONFIGURATION_TYPES=Debug;Release\"}\n    # Disable test for MinGW (gtest tests fail, gmock tests can not build)\n    $gtest_build_tests = if ($env:generator -eq \"MinGW Makefiles\") {\"-Dgtest_build_tests=OFF\"} else {\"-Dgtest_build_tests=ON\"}\n    $gmock_build_tests = if ($env:generator -eq \"MinGW Makefiles\") {\"-Dgmock_build_tests=OFF\"} else {\"-Dgmock_build_tests=ON\"}\n    & cmake -G \"$env:generator\" $conf -Dgtest_build_samples=ON $gtest_build_tests $gmock_build_tests ..\n    if ($LastExitCode -ne 0) {\n        throw \"Exec: $ErrorMessage\"\n    }\n    $cmake_parallel = if ($env:generator -eq \"MinGW Makefiles\") {\"-j2\"} else  {\"/m\"}\n    & cmake --build . --config $env:configuration -- $cmake_parallel\n    if ($LastExitCode -ne 0) {\n        throw \"Exec: $ErrorMessage\"\n    }\n\n\nskip_commits:\n  files:\n    - '**/*.md'\n\ntest_script:\n- ps: |\n    # Only enable some builds for pull requests, the AppVeyor queue is too long.\n    if ((Test-Path env:APPVEYOR_PULL_REQUEST_NUMBER) -And (-not (Test-Path env:enabled_on_pr) -or $env:enabled_on_pr -ne \"yes\")) {\n      return\n    }\n    if ($env:generator -eq \"MinGW Makefiles\") {\n        return # No test available for MinGW\n    }\n    & ctest -C $env:configuration --timeout 600 --output-on-failure\n    if ($LastExitCode -ne 0) {\n        throw \"Exec: $ErrorMessage\"\n    }\n\nartifacts:\n  - path: '_build/CMakeFiles/*.log'\n    name: logs\n  - path: '_build/Testing/**/*.xml'\n    name: test_results\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/ci/build-linux-autotools.sh",
    "content": "#!/usr/bin/env bash\n# Copyright 2017 Google Inc.\n# All Rights Reserved.\n#\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nset -e\n\n. ci/get-nprocessors.sh\n\n# Create the configuration script\nautoreconf -i\n\n# Run in a subdirectory to keep the sources clean\nmkdir build || true\ncd build\n../configure\n\nmake -j ${NPROCESSORS:-2}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/ci/build-linux-bazel.sh",
    "content": "#!/usr/bin/env bash\n# Copyright 2017 Google Inc.\n# All Rights Reserved.\n#\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nset -e\n\nbazel build --curses=no //...:all\nbazel test --curses=no //...:all\nbazel test --curses=no //...:all --define absl=1\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/ci/env-linux.sh",
    "content": "#!/usr/bin/env bash\n# Copyright 2017 Google Inc.\n# All Rights Reserved.\n#\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#\n# This file should be sourced, and not executed as a standalone script.\n#\n\n# TODO() - we can check if this is being sourced using $BASH_VERSION and $BASH_SOURCE[0] != ${0}.\n\nif [ \"${TRAVIS_OS_NAME}\" = \"linux\" ]; then\n    if [ \"$CXX\" = \"g++\" ]; then export CXX=\"g++-4.9\" CC=\"gcc-4.9\"; fi\n    if [ \"$CXX\" = \"clang++\" ]; then export CXX=\"clang++-3.9\" CC=\"clang-3.9\"; fi\nfi\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/ci/env-osx.sh",
    "content": "#!/usr/bin/env bash\n# Copyright 2017 Google Inc.\n# All Rights Reserved.\n#\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#\n# This file should be sourced, and not executed as a standalone script.\n#\n\n# TODO() - we can check if this is being sourced using $BASH_VERSION and $BASH_SOURCE[0] != ${0}.\n\nif [ \"${TRAVIS_OS_NAME}\" = \"linux\" ]; then\n    if [ \"$CXX\" = \"clang++\" ]; then export CXX=\"clang++-3.9\" CC=\"clang-3.9\"; fi\nfi\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/ci/get-nprocessors.sh",
    "content": "#!/usr/bin/env bash\n# Copyright 2017 Google Inc.\n# All Rights Reserved.\n#\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n# This file is typically sourced by another script.\n# if possible, ask for the precise number of processors,\n# otherwise take 2 processors as reasonable default; see\n# https://docs.travis-ci.com/user/speeding-up-the-build/#Makefile-optimization\nif [ -x /usr/bin/getconf ]; then\n    NPROCESSORS=$(/usr/bin/getconf _NPROCESSORS_ONLN)\nelse\n    NPROCESSORS=2\nfi\n\n# as of 2017-09-04 Travis CI reports 32 processors, but GCC build\n# crashes if parallelized too much (maybe memory consumption problem),\n# so limit to 4 processors for the time being.\nif [ $NPROCESSORS -gt 4 ] ; then\n\techo \"$0:Note: Limiting processors to use by make from $NPROCESSORS to 4.\"\n\tNPROCESSORS=4\nfi\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/ci/install-linux.sh",
    "content": "#!/usr/bin/env bash\n# Copyright 2017 Google Inc.\n# All Rights Reserved.\n#\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nset -eu\n\nif [ \"${TRAVIS_OS_NAME}\" != linux ]; then\n    echo \"Not a Linux build; skipping installation\"\n    exit 0\nfi\n\n\nif [ \"${TRAVIS_SUDO}\" = \"true\" ]; then\n    echo \"deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8\" | \\\n        sudo tee /etc/apt/sources.list.d/bazel.list\n    curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -\n    sudo apt-get update && sudo apt-get install -y bazel gcc-4.9 g++-4.9 clang-3.9\nelif [ \"${CXX}\" = \"clang++\" ]; then\n    # Use ccache, assuming $HOME/bin is in the path, which is true in the Travis build environment.\n    ln -sf /usr/bin/ccache $HOME/bin/${CXX};\n    ln -sf /usr/bin/ccache $HOME/bin/${CC};\nfi\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/ci/install-osx.sh",
    "content": "#!/usr/bin/env bash\n# Copyright 2017 Google Inc.\n# All Rights Reserved.\n#\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nset -eu\n\nif [ \"${TRAVIS_OS_NAME}\" != \"osx\" ]; then\n    echo \"Not a macOS build; skipping installation\"\n    exit 0\nfi\n\nbrew install ccache\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/ci/log-config.sh",
    "content": "#!/usr/bin/env bash\n# Copyright 2017 Google Inc.\n# All Rights Reserved.\n#\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nset -e\n\n# ccache on OS X needs installation first\n# reset ccache statistics\nccache --zero-stats\n\necho PATH=${PATH}\n\necho \"Compiler configuration:\"\necho CXX=${CXX}\necho CC=${CC}\necho CXXFLAGS=${CXXFLAGS}\n\necho \"C++ compiler version:\"\n${CXX} --version || echo \"${CXX} does not seem to support the --version flag\"\n${CXX} -v || echo \"${CXX} does not seem to support the -v flag\"\n\necho \"C compiler version:\"\n${CC} --version || echo \"${CXX} does not seem to support the --version flag\"\n${CC} -v || echo \"${CXX} does not seem to support the -v flag\"\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/ci/travis.sh",
    "content": "#!/usr/bin/env sh\nset -evx\n\n. ci/get-nprocessors.sh\n\n# if possible, ask for the precise number of processors,\n# otherwise take 2 processors as reasonable default; see\n# https://docs.travis-ci.com/user/speeding-up-the-build/#Makefile-optimization\nif [ -x /usr/bin/getconf ]; then\n    NPROCESSORS=$(/usr/bin/getconf _NPROCESSORS_ONLN)\nelse\n    NPROCESSORS=2\nfi\n# as of 2017-09-04 Travis CI reports 32 processors, but GCC build\n# crashes if parallelized too much (maybe memory consumption problem),\n# so limit to 4 processors for the time being.\nif [ $NPROCESSORS -gt 4 ] ; then\n\techo \"$0:Note: Limiting processors to use by make from $NPROCESSORS to 4.\"\n\tNPROCESSORS=4\nfi\n# Tell make to use the processors. No preceding '-' required.\nMAKEFLAGS=\"j${NPROCESSORS}\"\nexport MAKEFLAGS\n\nenv | sort\n\n# Set default values to OFF for these variables if not specified.\n: \"${NO_EXCEPTION:=OFF}\"\n: \"${NO_RTTI:=OFF}\"\n: \"${COMPILER_IS_GNUCXX:=OFF}\"\n\nmkdir build || true\ncd build\ncmake -Dgtest_build_samples=ON \\\n      -Dgtest_build_tests=ON \\\n      -Dgmock_build_tests=ON \\\n      -Dcxx_no_exception=$NO_EXCEPTION \\\n      -Dcxx_no_rtti=$NO_RTTI \\\n      -DCMAKE_COMPILER_IS_GNUCXX=$COMPILER_IS_GNUCXX \\\n      -DCMAKE_CXX_FLAGS=$CXX_FLAGS \\\n      -DCMAKE_BUILD_TYPE=$BUILD_TYPE \\\n      ..\nmake\nCTEST_OUTPUT_ON_FAILURE=1 make test\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/configure.ac",
    "content": "AC_INIT([Google C++ Mocking and Testing Frameworks],\n        [1.8.0],\n        [googlemock@googlegroups.com],\n        [googletest])\n\n# Provide various options to initialize the Autoconf and configure processes.\nAC_PREREQ([2.59])\nAC_CONFIG_SRCDIR([./README.md])\nAC_CONFIG_AUX_DIR([build-aux])\nAC_CONFIG_FILES([Makefile])\nAC_CONFIG_SUBDIRS([googletest googlemock])\n\nAM_INIT_AUTOMAKE\n\n# Output the generated files. No further autoconf macros may be used.\nAC_OUTPUT\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/CHANGES",
    "content": "Changes for 1.7.0:\n\n* All new improvements in Google Test 1.7.0.\n* New feature: matchers DoubleNear(), FloatNear(),\n  NanSensitiveDoubleNear(), NanSensitiveFloatNear(),\n  UnorderedElementsAre(), UnorderedElementsAreArray(), WhenSorted(),\n  WhenSortedBy(), IsEmpty(), and SizeIs().\n* Improvement: Google Mock can now be built as a DLL.\n* Improvement: when compiled by a C++11 compiler, matchers AllOf()\n  and AnyOf() can accept an arbitrary number of matchers.\n* Improvement: when compiled by a C++11 compiler, matchers\n  ElementsAreArray() can accept an initializer list.\n* Improvement: when exceptions are enabled, a mock method with no\n  default action now throws instead crashing the test.\n* Improvement: added class testing::StringMatchResultListener to aid\n  definition of composite matchers.\n* Improvement: function return types used in MOCK_METHOD*() macros can\n  now contain unprotected commas.\n* Improvement (potentially breaking): EXPECT_THAT() and ASSERT_THAT()\n  are now more strict in ensuring that the value type and the matcher\n  type are compatible, catching potential bugs in tests.\n* Improvement: Pointee() now works on an optional<T>.\n* Improvement: the ElementsAreArray() matcher can now take a vector or\n  iterator range as input, and makes a copy of its input elements\n  before the conversion to a Matcher.\n* Improvement: the Google Mock Generator can now generate mocks for\n  some class templates.\n* Bug fix: mock object destruction triggerred by another mock object's\n  destruction no longer hangs.\n* Improvement: Google Mock Doctor works better with newer Clang and\n  GCC now.\n* Compatibility fixes.\n* Bug/warning fixes.\n\nChanges for 1.6.0:\n\n* Compilation is much faster and uses much less memory, especially\n  when the constructor and destructor of a mock class are moved out of\n  the class body.\n* New matchers: Pointwise(), Each().\n* New actions: ReturnPointee() and ReturnRefOfCopy().\n* CMake support.\n* Project files for Visual Studio 2010.\n* AllOf() and AnyOf() can handle up-to 10 arguments now.\n* Google Mock doctor understands Clang error messages now.\n* SetArgPointee<> now accepts string literals.\n* gmock_gen.py handles storage specifier macros and template return\n  types now.\n* Compatibility fixes.\n* Bug fixes and implementation clean-ups.\n* Potentially incompatible changes: disables the harmful 'make install'\n  command in autotools.\n\nPotentially breaking changes:\n\n* The description string for MATCHER*() changes from Python-style\n  interpolation to an ordinary C++ string expression.\n* SetArgumentPointee is deprecated in favor of SetArgPointee.\n* Some non-essential project files for Visual Studio 2005 are removed.\n\nChanges for 1.5.0:\n\n * New feature: Google Mock can be safely used in multi-threaded tests\n   on platforms having pthreads.\n * New feature: function for printing a value of arbitrary type.\n * New feature: function ExplainMatchResult() for easy definition of\n   composite matchers.\n * The new matcher API lets user-defined matchers generate custom\n   explanations more directly and efficiently.\n * Better failure messages all around.\n * NotNull() and IsNull() now work with smart pointers.\n * Field() and Property() now work when the matcher argument is a pointer\n   passed by reference.\n * Regular expression matchers on all platforms.\n * Added GCC 4.0 support for Google Mock Doctor.\n * Added gmock_all_test.cc for compiling most Google Mock tests\n   in a single file.\n * Significantly cleaned up compiler warnings.\n * Bug fixes, better test coverage, and implementation clean-ups.\n\n Potentially breaking changes:\n\n * Custom matchers defined using MatcherInterface or MakePolymorphicMatcher()\n   need to be updated after upgrading to Google Mock 1.5.0; matchers defined\n   using MATCHER or MATCHER_P* aren't affected.\n * Dropped support for 'make install'.\n\nChanges for 1.4.0 (we skipped 1.2.* and 1.3.* to match the version of\nGoogle Test):\n\n * Works in more environments: Symbian and minGW, Visual C++ 7.1.\n * Lighter weight: comes with our own implementation of TR1 tuple (no\n   more dependency on Boost!).\n * New feature: --gmock_catch_leaked_mocks for detecting leaked mocks.\n * New feature: ACTION_TEMPLATE for defining templatized actions.\n * New feature: the .After() clause for specifying expectation order.\n * New feature: the .With() clause for specifying inter-argument\n   constraints.\n * New feature: actions ReturnArg<k>(), ReturnNew<T>(...), and\n   DeleteArg<k>().\n * New feature: matchers Key(), Pair(), Args<...>(), AllArgs(), IsNull(),\n   and Contains().\n * New feature: utility class MockFunction<F>, useful for checkpoints, etc.\n * New feature: functions Value(x, m) and SafeMatcherCast<T>(m).\n * New feature: copying a mock object is rejected at compile time.\n * New feature: a script for fusing all Google Mock and Google Test\n   source files for easy deployment.\n * Improved the Google Mock doctor to diagnose more diseases.\n * Improved the Google Mock generator script.\n * Compatibility fixes for Mac OS X and gcc.\n * Bug fixes and implementation clean-ups.\n\nChanges for 1.1.0:\n\n * New feature: ability to use Google Mock with any testing framework.\n * New feature: macros for easily defining new matchers\n * New feature: macros for easily defining new actions.\n * New feature: more container matchers.\n * New feature: actions for accessing function arguments and throwing\n   exceptions.\n * Improved the Google Mock doctor script for diagnosing compiler errors.\n * Bug fixes and implementation clean-ups.\n\nChanges for 1.0.0:\n\n * Initial Open Source release of Google Mock\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/CMakeLists.txt",
    "content": "########################################################################\n# CMake build script for Google Mock.\n#\n# To run the tests for Google Mock itself on Linux, use 'make test' or\n# ctest.  You can select which tests to run using 'ctest -R regex'.\n# For more options, run 'ctest --help'.\n\noption(gmock_build_tests \"Build all of Google Mock's own tests.\" OFF)\n\n# A directory to find Google Test sources.\nif (EXISTS \"${CMAKE_CURRENT_SOURCE_DIR}/gtest/CMakeLists.txt\")\n  set(gtest_dir gtest)\nelse()\n  set(gtest_dir ../googletest)\nendif()\n\n# Defines pre_project_set_up_hermetic_build() and set_up_hermetic_build().\ninclude(\"${gtest_dir}/cmake/hermetic_build.cmake\" OPTIONAL)\n\nif (COMMAND pre_project_set_up_hermetic_build)\n  # Google Test also calls hermetic setup functions from add_subdirectory,\n  # although its changes will not affect things at the current scope.\n  pre_project_set_up_hermetic_build()\nendif()\n\n########################################################################\n#\n# Project-wide settings\n\n# Name of the project.\n#\n# CMake files in this project can refer to the root source directory\n# as ${gmock_SOURCE_DIR} and to the root binary directory as\n# ${gmock_BINARY_DIR}.\n# Language \"C\" is required for find_package(Threads).\nif (CMAKE_VERSION VERSION_LESS 3.0)\n  project(gmock CXX C)\nelse()\n  cmake_policy(SET CMP0048 NEW)\n  project(gmock VERSION ${GOOGLETEST_VERSION} LANGUAGES CXX C)\nendif()\ncmake_minimum_required(VERSION 2.6.4)\n\nif (COMMAND set_up_hermetic_build)\n  set_up_hermetic_build()\nendif()\n\n# Instructs CMake to process Google Test's CMakeLists.txt and add its\n# targets to the current scope.  We are placing Google Test's binary\n# directory in a subdirectory of our own as VC compilation may break\n# if they are the same (the default).\nadd_subdirectory(\"${gtest_dir}\" \"${gmock_BINARY_DIR}/gtest\")\n\n\n# These commands only run if this is the main project\nif(CMAKE_PROJECT_NAME STREQUAL \"gmock\" OR CMAKE_PROJECT_NAME STREQUAL \"googletest-distribution\")\n  # BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to\n  # make it prominent in the GUI.\n  option(BUILD_SHARED_LIBS \"Build shared libraries (DLLs).\" OFF)\nelse()\n  mark_as_advanced(gmock_build_tests)\nendif()\n\n# Although Google Test's CMakeLists.txt calls this function, the\n# changes there don't affect the current scope.  Therefore we have to\n# call it again here.\nconfig_compiler_and_linker()  # from ${gtest_dir}/cmake/internal_utils.cmake\n\n# Adds Google Mock's and Google Test's header directories to the search path.\nset(gmock_build_include_dirs\n  \"${gmock_SOURCE_DIR}/include\"\n  \"${gmock_SOURCE_DIR}\"\n  \"${gtest_SOURCE_DIR}/include\"\n  # This directory is needed to build directly from Google Test sources.\n  \"${gtest_SOURCE_DIR}\")\ninclude_directories(${gmock_build_include_dirs})\n\n# Summary of tuple support for Microsoft Visual Studio:\n# Compiler    version(MS)  version(cmake)  Support\n# ----------  -----------  --------------  -----------------------------\n# <= VS 2010  <= 10        <= 1600         Use Google Tests's own tuple.\n# VS 2012     11           1700            std::tr1::tuple + _VARIADIC_MAX=10\n# VS 2013     12           1800            std::tr1::tuple\n# VS 2015     14           1900            std::tuple\n# VS 2017     15           >= 1910         std::tuple\nif (MSVC AND MSVC_VERSION EQUAL 1700)\n  add_definitions(/D _VARIADIC_MAX=10)\nendif()\n\n########################################################################\n#\n# Defines the gmock & gmock_main libraries.  User tests should link\n# with one of them.\n\n# Google Mock libraries.  We build them using more strict warnings than what\n# are used for other targets, to ensure that Google Mock can be compiled by\n# a user aggressive about warnings.\nif (MSVC)\n  cxx_library(gmock\n              \"${cxx_strict}\"\n              \"${gtest_dir}/src/gtest-all.cc\"\n              src/gmock-all.cc)\n\n  cxx_library(gmock_main\n              \"${cxx_strict}\"\n              \"${gtest_dir}/src/gtest-all.cc\"\n              src/gmock-all.cc\n              src/gmock_main.cc)\nelse()\n  cxx_library(gmock \"${cxx_strict}\" src/gmock-all.cc)\n  target_link_libraries(gmock PUBLIC gtest)\n  cxx_library(gmock_main \"${cxx_strict}\" src/gmock_main.cc)\n  target_link_libraries(gmock_main PUBLIC gmock)\nendif()\n# If the CMake version supports it, attach header directory information\n# to the targets for when we are part of a parent build (ie being pulled\n# in via add_subdirectory() rather than being a standalone build).\nif (DEFINED CMAKE_VERSION AND NOT \"${CMAKE_VERSION}\" VERSION_LESS \"2.8.11\")\n  target_include_directories(gmock SYSTEM INTERFACE\n    \"$<BUILD_INTERFACE:${gmock_build_include_dirs}>\"\n    \"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>\")\n  target_include_directories(gmock_main SYSTEM INTERFACE\n    \"$<BUILD_INTERFACE:${gmock_build_include_dirs}>\"\n    \"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>\")\nendif()\n\n########################################################################\n#\n# Install rules\ninstall_project(gmock gmock_main)\n\n########################################################################\n#\n# Google Mock's own tests.\n#\n# You can skip this section if you aren't interested in testing\n# Google Mock itself.\n#\n# The tests are not built by default.  To build them, set the\n# gmock_build_tests option to ON.  You can do it by running ccmake\n# or specifying the -Dgmock_build_tests=ON flag when running cmake.\n\nif (gmock_build_tests)\n  # This must be set in the root directory for the tests to be run by\n  # 'make test' or ctest.\n  enable_testing()\n\n  ############################################################\n  # C++ tests built with standard compiler flags.\n\n  cxx_test(gmock-actions_test gmock_main)\n  cxx_test(gmock-cardinalities_test gmock_main)\n  cxx_test(gmock_ex_test gmock_main)\n  cxx_test(gmock-generated-actions_test gmock_main)\n  cxx_test(gmock-generated-function-mockers_test gmock_main)\n  cxx_test(gmock-generated-internal-utils_test gmock_main)\n  cxx_test(gmock-generated-matchers_test gmock_main)\n  cxx_test(gmock-internal-utils_test gmock_main)\n  cxx_test(gmock-matchers_test gmock_main)\n  cxx_test(gmock-more-actions_test gmock_main)\n  cxx_test(gmock-nice-strict_test gmock_main)\n  cxx_test(gmock-port_test gmock_main)\n  cxx_test(gmock-spec-builders_test gmock_main)\n  cxx_test(gmock_link_test gmock_main test/gmock_link2_test.cc)\n  cxx_test(gmock_test gmock_main)\n\n  if (DEFINED GTEST_HAS_PTHREAD)\n    cxx_test(gmock_stress_test gmock)\n  endif()\n\n  # gmock_all_test is commented to save time building and running tests.\n  # Uncomment if necessary.\n  # cxx_test(gmock_all_test gmock_main)\n\n  ############################################################\n  # C++ tests built with non-standard compiler flags.\n\n  if (MSVC)\n    cxx_library(gmock_main_no_exception \"${cxx_no_exception}\"\n      \"${gtest_dir}/src/gtest-all.cc\" src/gmock-all.cc src/gmock_main.cc)\n\n    cxx_library(gmock_main_no_rtti \"${cxx_no_rtti}\"\n      \"${gtest_dir}/src/gtest-all.cc\" src/gmock-all.cc src/gmock_main.cc)\n\n    if (MSVC_VERSION LESS 1600)  # 1600 is Visual Studio 2010.\n      # Visual Studio 2010, 2012, and 2013 define symbols in std::tr1 that\n      # conflict with our own definitions. Therefore using our own tuple does not\n      # work on those compilers.\n      cxx_library(gmock_main_use_own_tuple \"${cxx_use_own_tuple}\"\n        \"${gtest_dir}/src/gtest-all.cc\" src/gmock-all.cc src/gmock_main.cc)\n\n      cxx_test_with_flags(gmock_use_own_tuple_test \"${cxx_use_own_tuple}\"\n        gmock_main_use_own_tuple test/gmock-spec-builders_test.cc)\n    endif()\n  else()\n    cxx_library(gmock_main_no_exception \"${cxx_no_exception}\" src/gmock_main.cc)\n    target_link_libraries(gmock_main_no_exception PUBLIC gmock)\n\n    cxx_library(gmock_main_no_rtti \"${cxx_no_rtti}\" src/gmock_main.cc)\n    target_link_libraries(gmock_main_no_rtti PUBLIC gmock)\n\n    cxx_library(gmock_main_use_own_tuple \"${cxx_use_own_tuple}\" src/gmock_main.cc)\n    target_link_libraries(gmock_main_use_own_tuple PUBLIC gmock)\n  endif()\n  cxx_test_with_flags(gmock-more-actions_no_exception_test \"${cxx_no_exception}\"\n    gmock_main_no_exception test/gmock-more-actions_test.cc)\n\n  cxx_test_with_flags(gmock_no_rtti_test \"${cxx_no_rtti}\"\n    gmock_main_no_rtti test/gmock-spec-builders_test.cc)\n\n  cxx_shared_library(shared_gmock_main \"${cxx_default}\"\n    \"${gtest_dir}/src/gtest-all.cc\" src/gmock-all.cc src/gmock_main.cc)\n\n  # Tests that a binary can be built with Google Mock as a shared library.  On\n  # some system configurations, it may not possible to run the binary without\n  # knowing more details about the system configurations. We do not try to run\n  # this binary. To get a more robust shared library coverage, configure with\n  # -DBUILD_SHARED_LIBS=ON.\n  cxx_executable_with_flags(shared_gmock_test_ \"${cxx_default}\"\n    shared_gmock_main test/gmock-spec-builders_test.cc)\n  set_target_properties(shared_gmock_test_\n    PROPERTIES\n    COMPILE_DEFINITIONS \"GTEST_LINKED_AS_SHARED_LIBRARY=1\")\n\n  ############################################################\n  # Python tests.\n\n  cxx_executable(gmock_leak_test_ test gmock_main)\n  py_test(gmock_leak_test)\n\n  cxx_executable(gmock_output_test_ test gmock)\n  py_test(gmock_output_test)\nendif()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/CONTRIBUTORS",
    "content": "# This file contains a list of people who've made non-trivial\n# contribution to the Google C++ Mocking Framework project.  People\n# who commit code to the project are encouraged to add their names\n# here.  Please keep the list sorted by first names.\n\nBenoit Sigoure <tsuna@google.com>\nBogdan Piloca <boo@google.com>\nChandler Carruth <chandlerc@google.com>\nDave MacLachlan <dmaclach@gmail.com>\nDavid Anderson <danderson@google.com>\nDean Sturtevant\nGene Volovich <gv@cite.com>\nHal Burch <gmock@hburch.com>\nJeffrey Yasskin <jyasskin@google.com>\nJim Keller <jimkeller@google.com>\nJoe Walnes <joe@truemesh.com>\nJon Wray <jwray@google.com>\nKeir Mierle <mierle@gmail.com>\nKeith Ray <keith.ray@gmail.com>\nKostya Serebryany <kcc@google.com>\nLev Makhlis\nManuel Klimek <klimek@google.com>\nMario Tanev <radix@google.com>\nMark Paskin\nMarkus Heule <markus.heule@gmail.com>\nMatthew Simmons <simmonmt@acm.org>\nMike Bland <mbland@google.com>\nNeal Norwitz <nnorwitz@gmail.com>\nNermin Ozkiranartli <nermin@google.com>\nOwen Carlsen <ocarlsen@google.com>\nPaneendra Ba <paneendra@google.com>\nPaul Menage <menage@google.com>\nPiotr Kaminski <piotrk@google.com>\nRuss Rufer <russ@pentad.com>\nSverre Sundsdal <sundsdal@gmail.com>\nTakeshi Yoshino <tyoshino@google.com>\nVadim Berman <vadimb@google.com>\nVlad Losev <vladl@google.com>\nWolfgang Klier <wklier@google.com>\nZhanyong Wan <wan@google.com>\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/LICENSE",
    "content": "Copyright 2008, Google Inc.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n    * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/Makefile.am",
    "content": "# Automake file\n\n# Nonstandard package files for distribution.\nEXTRA_DIST = LICENSE\n\n# We may need to build our internally packaged gtest. If so, it will be\n# included in the 'subdirs' variable.\nSUBDIRS = $(subdirs)\n\n# This is generated by the configure script, so clean it for distribution.\nDISTCLEANFILES = scripts/gmock-config\n\n# We define the global AM_CPPFLAGS as everything we compile includes from these\n# directories.\nAM_CPPFLAGS = $(GTEST_CPPFLAGS) -I$(srcdir)/include\n\n# Modifies compiler and linker flags for pthreads compatibility.\nif HAVE_PTHREADS\n  AM_CXXFLAGS = @PTHREAD_CFLAGS@ -DGTEST_HAS_PTHREAD=1\n  AM_LIBS = @PTHREAD_LIBS@\nendif\n\n# Build rules for libraries.\nlib_LTLIBRARIES = lib/libgmock.la lib/libgmock_main.la\n\nlib_libgmock_la_SOURCES = src/gmock-all.cc\n\npkginclude_HEADERS = \\\n  include/gmock/gmock-actions.h \\\n  include/gmock/gmock-cardinalities.h \\\n  include/gmock/gmock-generated-actions.h \\\n  include/gmock/gmock-generated-function-mockers.h \\\n  include/gmock/gmock-generated-matchers.h \\\n  include/gmock/gmock-generated-nice-strict.h \\\n  include/gmock/gmock-matchers.h \\\n  include/gmock/gmock-more-actions.h \\\n  include/gmock/gmock-more-matchers.h \\\n  include/gmock/gmock-spec-builders.h \\\n  include/gmock/gmock.h\n\npkginclude_internaldir = $(pkgincludedir)/internal\npkginclude_internal_HEADERS = \\\n  include/gmock/internal/gmock-generated-internal-utils.h \\\n  include/gmock/internal/gmock-internal-utils.h \\\n  include/gmock/internal/gmock-port.h \\\n  include/gmock/internal/custom/gmock-generated-actions.h \\\n  include/gmock/internal/custom/gmock-matchers.h \\\n  include/gmock/internal/custom/gmock-port.h\n\nlib_libgmock_main_la_SOURCES = src/gmock_main.cc\nlib_libgmock_main_la_LIBADD = lib/libgmock.la\n\n# Build rules for tests. Automake's naming for some of these variables isn't\n# terribly obvious, so this is a brief reference:\n#\n# TESTS -- Programs run automatically by \"make check\"\n# check_PROGRAMS -- Programs built by \"make check\" but not necessarily run\n\nTESTS=\ncheck_PROGRAMS=\nAM_LDFLAGS = $(GTEST_LDFLAGS)\n\n# This exercises all major components of Google Mock.  It also\n# verifies that libgmock works.\nTESTS += test/gmock-spec-builders_test\ncheck_PROGRAMS += test/gmock-spec-builders_test\ntest_gmock_spec_builders_test_SOURCES = test/gmock-spec-builders_test.cc\ntest_gmock_spec_builders_test_LDADD = $(GTEST_LIBS) lib/libgmock.la\n\n# This tests using Google Mock in multiple translation units.  It also\n# verifies that libgmock_main and libgmock work.\nTESTS += test/gmock_link_test\ncheck_PROGRAMS += test/gmock_link_test\ntest_gmock_link_test_SOURCES = \\\n  test/gmock_link2_test.cc \\\n  test/gmock_link_test.cc \\\n  test/gmock_link_test.h\ntest_gmock_link_test_LDADD = $(GTEST_LIBS) lib/libgmock_main.la  lib/libgmock.la\n\nif HAVE_PYTHON\n  # Tests that fused gmock files compile and work.\n  TESTS += test/gmock_fused_test\n  check_PROGRAMS += test/gmock_fused_test\n  test_gmock_fused_test_SOURCES = \\\n    fused-src/gmock-gtest-all.cc \\\n    fused-src/gmock/gmock.h \\\n    fused-src/gmock_main.cc \\\n    fused-src/gtest/gtest.h \\\n    test/gmock_test.cc\n  test_gmock_fused_test_CPPFLAGS = -I\"$(srcdir)/fused-src\"\nendif\n\n# Google Mock source files that we don't compile directly.\nGMOCK_SOURCE_INGLUDES = \\\n  src/gmock-cardinalities.cc \\\n  src/gmock-internal-utils.cc \\\n  src/gmock-matchers.cc \\\n  src/gmock-spec-builders.cc \\\n  src/gmock.cc\n\nEXTRA_DIST += $(GMOCK_SOURCE_INGLUDES)\n\n# C++ tests that we don't compile using autotools.\nEXTRA_DIST += \\\n  test/gmock-actions_test.cc \\\n  test/gmock_all_test.cc \\\n  test/gmock-cardinalities_test.cc \\\n  test/gmock_ex_test.cc \\\n  test/gmock-generated-actions_test.cc \\\n  test/gmock-generated-function-mockers_test.cc \\\n  test/gmock-generated-internal-utils_test.cc \\\n  test/gmock-generated-matchers_test.cc \\\n  test/gmock-internal-utils_test.cc \\\n  test/gmock-matchers_test.cc \\\n  test/gmock-more-actions_test.cc \\\n  test/gmock-nice-strict_test.cc \\\n  test/gmock-port_test.cc \\\n  test/gmock_stress_test.cc\n\n# Python tests, which we don't run using autotools.\nEXTRA_DIST += \\\n  test/gmock_leak_test.py \\\n  test/gmock_leak_test_.cc \\\n  test/gmock_output_test.py \\\n  test/gmock_output_test_.cc \\\n  test/gmock_output_test_golden.txt \\\n  test/gmock_test_utils.py\n\n# Nonstandard package files for distribution.\nEXTRA_DIST += \\\n  CHANGES \\\n  CONTRIBUTORS \\\n  make/Makefile\n\n# Pump scripts for generating Google Mock headers.\n# TODO(chandlerc@google.com): automate the generation of *.h from *.h.pump.\nEXTRA_DIST += \\\n  include/gmock/gmock-generated-actions.h.pump \\\n  include/gmock/gmock-generated-function-mockers.h.pump \\\n  include/gmock/gmock-generated-matchers.h.pump \\\n  include/gmock/gmock-generated-nice-strict.h.pump \\\n  include/gmock/internal/gmock-generated-internal-utils.h.pump \\\n  include/gmock/internal/custom/gmock-generated-actions.h.pump\n\n# Script for fusing Google Mock and Google Test source files.\nEXTRA_DIST += scripts/fuse_gmock_files.py\n\n# The Google Mock Generator tool from the cppclean project.\nEXTRA_DIST += \\\n  scripts/generator/LICENSE \\\n  scripts/generator/README \\\n  scripts/generator/README.cppclean \\\n  scripts/generator/cpp/__init__.py \\\n  scripts/generator/cpp/ast.py \\\n  scripts/generator/cpp/gmock_class.py \\\n  scripts/generator/cpp/keywords.py \\\n  scripts/generator/cpp/tokenize.py \\\n  scripts/generator/cpp/utils.py \\\n  scripts/generator/gmock_gen.py\n\n# Script for diagnosing compiler errors in programs that use Google\n# Mock.\nEXTRA_DIST += scripts/gmock_doctor.py\n\n# CMake scripts.\nEXTRA_DIST += \\\n  CMakeLists.txt\n\n# Microsoft Visual Studio 2005 projects.\nEXTRA_DIST += \\\n  msvc/2005/gmock.sln \\\n  msvc/2005/gmock.vcproj \\\n  msvc/2005/gmock_config.vsprops \\\n  msvc/2005/gmock_main.vcproj \\\n  msvc/2005/gmock_test.vcproj\n\n# Microsoft Visual Studio 2010 projects.\nEXTRA_DIST += \\\n  msvc/2010/gmock.sln \\\n  msvc/2010/gmock.vcxproj \\\n  msvc/2010/gmock_config.props \\\n  msvc/2010/gmock_main.vcxproj \\\n  msvc/2010/gmock_test.vcxproj\n\nif HAVE_PYTHON\n# gmock_test.cc does not really depend on files generated by the\n# fused-gmock-internal rule.  However, gmock_test.o does, and it is\n# important to include test/gmock_test.cc as part of this rule in order to\n# prevent compiling gmock_test.o until all dependent files have been\n# generated.\n$(test_gmock_fused_test_SOURCES): fused-gmock-internal\n\n# TODO(vladl@google.com): Find a way to add Google Tests's sources here.\nfused-gmock-internal: $(pkginclude_HEADERS) $(pkginclude_internal_HEADERS) \\\n                      $(lib_libgmock_la_SOURCES) $(GMOCK_SOURCE_INGLUDES) \\\n                      $(lib_libgmock_main_la_SOURCES) \\\n                      scripts/fuse_gmock_files.py\n\tmkdir -p \"$(srcdir)/fused-src\"\n\tchmod -R u+w \"$(srcdir)/fused-src\"\n\trm -f \"$(srcdir)/fused-src/gtest/gtest.h\"\n\trm -f \"$(srcdir)/fused-src/gmock/gmock.h\"\n\trm -f \"$(srcdir)/fused-src/gmock-gtest-all.cc\"\n\t\"$(srcdir)/scripts/fuse_gmock_files.py\" \"$(srcdir)/fused-src\"\n\tcp -f \"$(srcdir)/src/gmock_main.cc\" \"$(srcdir)/fused-src\"\n\nmaintainer-clean-local:\n\trm -rf \"$(srcdir)/fused-src\"\nendif\n\n# Death tests may produce core dumps in the build directory. In case\n# this happens, clean them to keep distcleancheck happy.\nCLEANFILES = core\n\n# Disables 'make install' as installing a compiled version of Google\n# Mock can lead to undefined behavior due to violation of the\n# One-Definition Rule.\n\ninstall-exec-local:\n\techo \"'make install' is dangerous and not supported. Instead, see README for how to integrate Google Mock into your build system.\"\n\tfalse\n\ninstall-data-local:\n\techo \"'make install' is dangerous and not supported. Instead, see README for how to integrate Google Mock into your build system.\"\n\tfalse\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/README.md",
    "content": "## Google Mock ##\n\nThe Google C++ mocking framework.\n\n### Overview ###\n\nGoogle's framework for writing and using C++ mock classes.\nIt can help you derive better designs of your system and write better tests.\n\nIt is inspired by:\n\n  * [jMock](http://www.jmock.org/),\n  * [EasyMock](http://www.easymock.org/), and\n  * [Hamcrest](http://code.google.com/p/hamcrest/),\n\nand designed with C++'s specifics in mind.\n\nGoogle mock:\n\n  * lets you create mock classes trivially using simple macros.\n  * supports a rich set of matchers and actions.\n  * handles unordered, partially ordered, or completely ordered expectations.\n  * is extensible by users.\n\nWe hope you find it useful!\n\n### Features ###\n\n  * Provides a declarative syntax for defining mocks.\n  * Can easily define partial (hybrid) mocks, which are a cross of real\n    and mock objects.\n  * Handles functions of arbitrary types and overloaded functions.\n  * Comes with a rich set of matchers for validating function arguments.\n  * Uses an intuitive syntax for controlling the behavior of a mock.\n  * Does automatic verification of expectations (no record-and-replay needed).\n  * Allows arbitrary (partial) ordering constraints on\n    function calls to be expressed,.\n  * Lets an user extend it by defining new matchers and actions.\n  * Does not use exceptions.\n  * Is easy to learn and use.\n\nPlease see the project page above for more information as well as the\nmailing list for questions, discussions, and development.  There is\nalso an IRC channel on OFTC (irc.oftc.net) #gtest available.  Please\njoin us!\n\nPlease note that code under [scripts/generator](scripts/generator/) is\nfrom [cppclean](http://code.google.com/p/cppclean/) and released under\nthe Apache License, which is different from Google Mock's license.\n\n## Getting Started ##\n\nIf you are new to the project, we suggest that you read the user\ndocumentation in the following order:\n\n  * Learn the [basics](../../master/googletest/docs/primer.md) of\n    Google Test, if you choose to use Google Mock with it (recommended).\n  * Read [Google Mock for Dummies](../../master/googlemock/docs/ForDummies.md).\n  * Read the instructions below on how to build Google Mock.\n\nYou can also watch Zhanyong's [talk](http://www.youtube.com/watch?v=sYpCyLI47rM) on Google Mock's usage and implementation.\n\nOnce you understand the basics, check out the rest of the docs:\n\n  * [CheatSheet](../../master/googlemock/docs/CheatSheet.md) - all the commonly used stuff\n    at a glance.\n  * [CookBook](../../master/googlemock/docs/CookBook.md) - recipes for getting things done,\n    including advanced techniques.\n\nIf you need help, please check the\n[KnownIssues](docs/KnownIssues.md) and\n[FrequentlyAskedQuestions](docs/FrequentlyAskedQuestions.md) before\nposting a question on the\n[discussion group](http://groups.google.com/group/googlemock).\n\n\n### Using Google Mock Without Google Test ###\n\nGoogle Mock is not a testing framework itself.  Instead, it needs a\ntesting framework for writing tests.  Google Mock works seamlessly\nwith [Google Test](https://github.com/google/googletest), but\nyou can also use it with [any C++ testing framework](../../master/googlemock/docs/ForDummies.md#using-google-mock-with-any-testing-framework).\n\n### Requirements for End Users ###\n\nGoogle Mock is implemented on top of [Google Test](\nhttp://github.com/google/googletest/), and depends on it.\nYou must use the bundled version of Google Test when using Google Mock.\n\nYou can also easily configure Google Mock to work with another testing\nframework, although it will still need Google Test.  Please read\n[\"Using_Google_Mock_with_Any_Testing_Framework\"](\n    ../../master/googlemock/docs/ForDummies.md#using-google-mock-with-any-testing-framework)\nfor instructions.\n\nGoogle Mock depends on advanced C++ features and thus requires a more\nmodern compiler. The following are needed to use Google Mock:\n\n#### Linux Requirements ####\n\n  * GNU-compatible Make or \"gmake\"\n  * POSIX-standard shell\n  * POSIX(-2) Regular Expressions (regex.h)\n  * C++98-standard-compliant compiler (e.g. GCC 3.4 or newer)\n\n#### Windows Requirements ####\n\n  * Microsoft Visual C++ 8.0 SP1 or newer\n\n#### Mac OS X Requirements ####\n\n  * Mac OS X 10.4 Tiger or newer\n  * Developer Tools Installed\n\n### Requirements for Contributors ###\n\nWe welcome patches. If you plan to contribute a patch, you need to\nbuild Google Mock and its tests, which has further requirements:\n\n  * Automake version 1.9 or newer\n  * Autoconf version 2.59 or newer\n  * Libtool / Libtoolize\n  * Python version 2.3 or newer (for running some of the tests and\n    re-generating certain source files from templates)\n\n### Building Google Mock ###\n\n#### Using CMake ####\n\nIf you have CMake available, it is recommended that you follow the\n[build instructions][gtest_cmakebuild]\nas described for Google Test.\n\nIf are using Google Mock with an\nexisting CMake project, the section\n[Incorporating Into An Existing CMake Project][gtest_incorpcmake]\nmay be of particular interest.\nTo make it work for Google Mock you will need to change\n\n    target_link_libraries(example gtest_main)\n\nto\n\n    target_link_libraries(example gmock_main)\n\nThis works because `gmock_main` library is compiled with Google Test.\n\n#### Preparing to Build (Unix only) ####\n\nIf you are using a Unix system and plan to use the GNU Autotools build\nsystem to build Google Mock (described below), you'll need to\nconfigure it now.\n\nTo prepare the Autotools build system:\n\n    cd googlemock\n    autoreconf -fvi\n\nTo build Google Mock and your tests that use it, you need to tell your\nbuild system where to find its headers and source files.  The exact\nway to do it depends on which build system you use, and is usually\nstraightforward.\n\nThis section shows how you can integrate Google Mock into your\nexisting build system.\n\nSuppose you put Google Mock in directory `${GMOCK_DIR}` and Google Test\nin `${GTEST_DIR}` (the latter is `${GMOCK_DIR}/gtest` by default).  To\nbuild Google Mock, create a library build target (or a project as\ncalled by Visual Studio and Xcode) to compile\n\n    ${GTEST_DIR}/src/gtest-all.cc and ${GMOCK_DIR}/src/gmock-all.cc\n\nwith\n\n    ${GTEST_DIR}/include and ${GMOCK_DIR}/include\n\nin the system header search path, and\n\n    ${GTEST_DIR} and ${GMOCK_DIR}\n\nin the normal header search path.  Assuming a Linux-like system and gcc,\nsomething like the following will do:\n\n    g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} \\\n        -isystem ${GMOCK_DIR}/include -I${GMOCK_DIR} \\\n        -pthread -c ${GTEST_DIR}/src/gtest-all.cc\n    g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} \\\n        -isystem ${GMOCK_DIR}/include -I${GMOCK_DIR} \\\n        -pthread -c ${GMOCK_DIR}/src/gmock-all.cc\n    ar -rv libgmock.a gtest-all.o gmock-all.o\n\n(We need -pthread as Google Test and Google Mock use threads.)\n\nNext, you should compile your test source file with\n${GTEST\\_DIR}/include and ${GMOCK\\_DIR}/include in the header search\npath, and link it with gmock and any other necessary libraries:\n\n    g++ -isystem ${GTEST_DIR}/include -isystem ${GMOCK_DIR}/include \\\n        -pthread path/to/your_test.cc libgmock.a -o your_test\n\nAs an example, the make/ directory contains a Makefile that you can\nuse to build Google Mock on systems where GNU make is available\n(e.g. Linux, Mac OS X, and Cygwin).  It doesn't try to build Google\nMock's own tests.  Instead, it just builds the Google Mock library and\na sample test.  You can use it as a starting point for your own build\nscript.\n\nIf the default settings are correct for your environment, the\nfollowing commands should succeed:\n\n    cd ${GMOCK_DIR}/make\n    make\n    ./gmock_test\n\nIf you see errors, try to tweak the contents of\n[make/Makefile](make/Makefile) to make them go away.\n\n### Windows ###\n\nThe msvc/2005 directory contains VC++ 2005 projects and the msvc/2010\ndirectory contains VC++ 2010 projects for building Google Mock and\nselected tests.\n\nChange to the appropriate directory and run \"msbuild gmock.sln\" to\nbuild the library and tests (or open the gmock.sln in the MSVC IDE).\nIf you want to create your own project to use with Google Mock, you'll\nhave to configure it to use the `gmock_config` propety sheet.  For that:\n\n * Open the Property Manager window (View | Other Windows | Property Manager)\n * Right-click on your project and select \"Add Existing Property Sheet...\"\n * Navigate to `gmock_config.vsprops` or `gmock_config.props` and select it.\n * In Project Properties | Configuration Properties | General | Additional\n   Include Directories, type <path to Google Mock>/include.\n\n### Tweaking Google Mock ###\n\nGoogle Mock can be used in diverse environments.  The default\nconfiguration may not work (or may not work well) out of the box in\nsome environments.  However, you can easily tweak Google Mock by\ndefining control macros on the compiler command line.  Generally,\nthese macros are named like `GTEST_XYZ` and you define them to either 1\nor 0 to enable or disable a certain feature.\n\nWe list the most frequently used macros below.  For a complete list,\nsee file [${GTEST\\_DIR}/include/gtest/internal/gtest-port.h](\n../googletest/include/gtest/internal/gtest-port.h).\n\n### Choosing a TR1 Tuple Library ###\n\nGoogle Mock uses the C++ Technical Report 1 (TR1) tuple library\nheavily.  Unfortunately TR1 tuple is not yet widely available with all\ncompilers.  The good news is that Google Test 1.4.0+ implements a\nsubset of TR1 tuple that's enough for Google Mock's need.  Google Mock\nwill automatically use that implementation when the compiler doesn't\nprovide TR1 tuple.\n\nUsually you don't need to care about which tuple library Google Test\nand Google Mock use.  However, if your project already uses TR1 tuple,\nyou need to tell Google Test and Google Mock to use the same TR1 tuple\nlibrary the rest of your project uses, or the two tuple\nimplementations will clash.  To do that, add\n\n    -DGTEST_USE_OWN_TR1_TUPLE=0\n\nto the compiler flags while compiling Google Test, Google Mock, and\nyour tests.  If you want to force Google Test and Google Mock to use\ntheir own tuple library, just add\n\n    -DGTEST_USE_OWN_TR1_TUPLE=1\n\nto the compiler flags instead.\n\nIf you want to use Boost's TR1 tuple library with Google Mock, please\nrefer to the Boost website (http://www.boost.org/) for how to obtain\nit and set it up.\n\n### As a Shared Library (DLL) ###\n\nGoogle Mock is compact, so most users can build and link it as a static\nlibrary for the simplicity.  Google Mock can be used as a DLL, but the\nsame DLL must contain Google Test as well.  See\n[Google Test's README][gtest_readme]\nfor instructions on how to set up necessary compiler settings.\n\n### Tweaking Google Mock ###\n\nMost of Google Test's control macros apply to Google Mock as well.\nPlease see [Google Test's README][gtest_readme] for how to tweak them.\n\n### Upgrading from an Earlier Version ###\n\nWe strive to keep Google Mock releases backward compatible.\nSometimes, though, we have to make some breaking changes for the\nusers' long-term benefits.  This section describes what you'll need to\ndo if you are upgrading from an earlier version of Google Mock.\n\n#### Upgrading from 1.1.0 or Earlier ####\n\nYou may need to explicitly enable or disable Google Test's own TR1\ntuple library.  See the instructions in section \"[Choosing a TR1 Tuple\nLibrary](../googletest/#choosing-a-tr1-tuple-library)\".\n\n#### Upgrading from 1.4.0 or Earlier ####\n\nOn platforms where the pthread library is available, Google Test and\nGoogle Mock use it in order to be thread-safe.  For this to work, you\nmay need to tweak your compiler and/or linker flags.  Please see the\n\"[Multi-threaded Tests](../googletest#multi-threaded-tests\n)\" section in file Google Test's README for what you may need to do.\n\nIf you have custom matchers defined using `MatcherInterface` or\n`MakePolymorphicMatcher()`, you'll need to update their definitions to\nuse the new matcher API (\n[monomorphic](./docs/CookBook.md#writing-new-monomorphic-matchers),\n[polymorphic](./docs/CookBook.md#writing-new-polymorphic-matchers)).\nMatchers defined using `MATCHER()` or `MATCHER_P*()` aren't affected.\n\nHappy testing!\n\n[gtest_readme]: ../googletest/README.md \"googletest\"\n[gtest_cmakebuild]:  ../googletest/README.md#using-cmake \"Using CMake\"\n[gtest_incorpcmake]: ../googletest/README.md#incorporating-into-an-existing-cmake-project \"Incorporating Into An Existing CMake Project\"\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/cmake/gmock.pc.in",
    "content": "libdir=@CMAKE_INSTALL_FULL_LIBDIR@\nincludedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@\n\nName: gmock\nDescription: GoogleMock (without main() function)\nVersion: @PROJECT_VERSION@\nURL: https://github.com/google/googletest\nLibs: -L${libdir} -lgmock @CMAKE_THREAD_LIBS_INIT@\nCflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ @CMAKE_THREAD_LIBS_INIT@\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/cmake/gmock_main.pc.in",
    "content": "libdir=@CMAKE_INSTALL_FULL_LIBDIR@\nincludedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@\n\nName: gmock_main\nDescription: GoogleMock (with main() function)\nVersion: @PROJECT_VERSION@\nURL: https://github.com/google/googletest\nLibs: -L${libdir} -lgmock_main @CMAKE_THREAD_LIBS_INIT@\nCflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ @CMAKE_THREAD_LIBS_INIT@\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/configure.ac",
    "content": "m4_include(../googletest/m4/acx_pthread.m4)\n\nAC_INIT([Google C++ Mocking Framework],\n        [1.8.0],\n        [googlemock@googlegroups.com],\n        [gmock])\n\n# Provide various options to initialize the Autoconf and configure processes.\nAC_PREREQ([2.59])\nAC_CONFIG_SRCDIR([./LICENSE])\nAC_CONFIG_AUX_DIR([build-aux])\nAC_CONFIG_HEADERS([build-aux/config.h])\nAC_CONFIG_FILES([Makefile])\nAC_CONFIG_FILES([scripts/gmock-config], [chmod +x scripts/gmock-config])\n\n# Initialize Automake with various options. We require at least v1.9, prevent\n# pedantic complaints about package files, and enable various distribution\n# targets.\nAM_INIT_AUTOMAKE([1.9 dist-bzip2 dist-zip foreign subdir-objects])\n\n# Check for programs used in building Google Test.\nAC_PROG_CC\nAC_PROG_CXX\nAC_LANG([C++])\nAC_PROG_LIBTOOL\n\n# TODO(chandlerc@google.com): Currently we aren't running the Python tests\n# against the interpreter detected by AM_PATH_PYTHON, and so we condition\n# HAVE_PYTHON by requiring \"python\" to be in the PATH, and that interpreter's\n# version to be >= 2.3. This will allow the scripts to use a \"/usr/bin/env\"\n# hashbang.\nPYTHON=  # We *do not* allow the user to specify a python interpreter\nAC_PATH_PROG([PYTHON],[python],[:])\nAS_IF([test \"$PYTHON\" != \":\"],\n      [AM_PYTHON_CHECK_VERSION([$PYTHON],[2.3],[:],[PYTHON=\":\"])])\nAM_CONDITIONAL([HAVE_PYTHON],[test \"$PYTHON\" != \":\"])\n\n# TODO(chandlerc@google.com) Check for the necessary system headers.\n\n# Configure pthreads.\nAC_ARG_WITH([pthreads],\n            [AS_HELP_STRING([--with-pthreads],\n               [use pthreads (default is yes)])],\n            [with_pthreads=$withval],\n            [with_pthreads=check])\n\nhave_pthreads=no\nAS_IF([test \"x$with_pthreads\" != \"xno\"],\n      [ACX_PTHREAD(\n        [],\n        [AS_IF([test \"x$with_pthreads\" != \"xcheck\"],\n               [AC_MSG_FAILURE(\n                 [--with-pthreads was specified, but unable to be used])])])\n       have_pthreads=\"$acx_pthread_ok\"])\nAM_CONDITIONAL([HAVE_PTHREADS],[test \"x$have_pthreads\" == \"xyes\"])\nAC_SUBST(PTHREAD_CFLAGS)\nAC_SUBST(PTHREAD_LIBS)\n\n# GoogleMock currently has hard dependencies upon GoogleTest above and beyond\n# running its own test suite, so we both provide our own version in\n# a subdirectory and provide some logic to use a custom version or a system\n# installed version.\nAC_ARG_WITH([gtest],\n            [AS_HELP_STRING([--with-gtest],\n                            [Specifies how to find the gtest package. If no\n                            arguments are given, the default behavior, a\n                            system installed gtest will be used if present,\n                            and an internal version built otherwise. If a\n                            path is provided, the gtest built or installed at\n                            that prefix will be used.])],\n            [],\n            [with_gtest=yes])\nAC_ARG_ENABLE([external-gtest],\n              [AS_HELP_STRING([--disable-external-gtest],\n                              [Disables any detection or use of a system\n                              installed or user provided gtest. Any option to\n                              '--with-gtest' is ignored. (Default is enabled.)])\n              ], [], [enable_external_gtest=yes])\nAS_IF([test \"x$with_gtest\" == \"xno\"],\n      [AC_MSG_ERROR([dnl\nSupport for GoogleTest was explicitly disabled. Currently GoogleMock has a hard\ndependency upon GoogleTest to build, please provide a version, or allow\nGoogleMock to use any installed version and fall back upon its internal\nversion.])])\n\n# Setup various GTEST variables. TODO(chandlerc@google.com): When these are\n# used below, they should be used such that any pre-existing values always\n# trump values we set them to, so that they can be used to selectively override\n# details of the detection process.\nAC_ARG_VAR([GTEST_CONFIG],\n           [The exact path of Google Test's 'gtest-config' script.])\nAC_ARG_VAR([GTEST_CPPFLAGS],\n           [C-like preprocessor flags for Google Test.])\nAC_ARG_VAR([GTEST_CXXFLAGS],\n           [C++ compile flags for Google Test.])\nAC_ARG_VAR([GTEST_LDFLAGS],\n           [Linker path and option flags for Google Test.])\nAC_ARG_VAR([GTEST_LIBS],\n           [Library linking flags for Google Test.])\nAC_ARG_VAR([GTEST_VERSION],\n           [The version of Google Test available.])\nHAVE_BUILT_GTEST=\"no\"\n\nGTEST_MIN_VERSION=\"1.8.0\"\n\nAS_IF([test \"x${enable_external_gtest}\" = \"xyes\"],\n      [# Begin filling in variables as we are able.\n      AS_IF([test \"x${with_gtest}\" != \"xyes\"],\n            [AS_IF([test -x \"${with_gtest}/scripts/gtest-config\"],\n                   [GTEST_CONFIG=\"${with_gtest}/scripts/gtest-config\"],\n                   [GTEST_CONFIG=\"${with_gtest}/bin/gtest-config\"])\n            AS_IF([test -x \"${GTEST_CONFIG}\"], [],\n                  [AC_MSG_ERROR([dnl\nUnable to locate either a built or installed Google Test at '${with_gtest}'.])\n                  ])])\n\n      AS_IF([test -x \"${GTEST_CONFIG}\"], [],\n            [AC_PATH_PROG([GTEST_CONFIG], [gtest-config])])\n      AS_IF([test -x \"${GTEST_CONFIG}\"],\n            [AC_MSG_CHECKING([for Google Test version >= ${GTEST_MIN_VERSION}])\n            AS_IF([${GTEST_CONFIG} --min-version=${GTEST_MIN_VERSION}],\n                  [AC_MSG_RESULT([yes])\n                  HAVE_BUILT_GTEST=\"yes\"],\n                  [AC_MSG_RESULT([no])])])])\n\nAS_IF([test \"x${HAVE_BUILT_GTEST}\" = \"xyes\"],\n      [GTEST_CPPFLAGS=`${GTEST_CONFIG} --cppflags`\n      GTEST_CXXFLAGS=`${GTEST_CONFIG} --cxxflags`\n      GTEST_LDFLAGS=`${GTEST_CONFIG} --ldflags`\n      GTEST_LIBS=`${GTEST_CONFIG} --libs`\n      GTEST_VERSION=`${GTEST_CONFIG} --version`],\n      [\n      # GTEST_CONFIG needs to be executable both in a Makefile environment and\n      # in a shell script environment, so resolve an absolute path for it here.\n      GTEST_CONFIG=\"`pwd -P`/../googletest/scripts/gtest-config\"\n      GTEST_CPPFLAGS='-I$(top_srcdir)/../googletest/include'\n      GTEST_CXXFLAGS='-g'\n      GTEST_LDFLAGS=''\n      GTEST_LIBS='$(top_builddir)/../googletest/lib/libgtest.la'\n      GTEST_VERSION=\"${GTEST_MIN_VERSION}\"])\n\n# TODO(chandlerc@google.com) Check the types, structures, and other compiler\n# and architecture characteristics.\n\n# Output the generated files. No further autoconf macros may be used.\nAC_OUTPUT\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/docs/CheatSheet.md",
    "content": "\n\n# Defining a Mock Class #\n\n## Mocking a Normal Class ##\n\nGiven\n```\nclass Foo {\n  ...\n  virtual ~Foo();\n  virtual int GetSize() const = 0;\n  virtual string Describe(const char* name) = 0;\n  virtual string Describe(int type) = 0;\n  virtual bool Process(Bar elem, int count) = 0;\n};\n```\n(note that `~Foo()` **must** be virtual) we can define its mock as\n```\n#include \"gmock/gmock.h\"\n\nclass MockFoo : public Foo {\n  MOCK_CONST_METHOD0(GetSize, int());\n  MOCK_METHOD1(Describe, string(const char* name));\n  MOCK_METHOD1(Describe, string(int type));\n  MOCK_METHOD2(Process, bool(Bar elem, int count));\n};\n```\n\nTo create a \"nice\" mock object which ignores all uninteresting calls,\nor a \"strict\" mock object, which treats them as failures:\n```\nNiceMock<MockFoo> nice_foo;     // The type is a subclass of MockFoo.\nStrictMock<MockFoo> strict_foo; // The type is a subclass of MockFoo.\n```\n\n## Mocking a Class Template ##\n\nTo mock\n```\ntemplate <typename Elem>\nclass StackInterface {\n public:\n  ...\n  virtual ~StackInterface();\n  virtual int GetSize() const = 0;\n  virtual void Push(const Elem& x) = 0;\n};\n```\n(note that `~StackInterface()` **must** be virtual) just append `_T` to the `MOCK_*` macros:\n```\ntemplate <typename Elem>\nclass MockStack : public StackInterface<Elem> {\n public:\n  ...\n  MOCK_CONST_METHOD0_T(GetSize, int());\n  MOCK_METHOD1_T(Push, void(const Elem& x));\n};\n```\n\n## Specifying Calling Conventions for Mock Functions ##\n\nIf your mock function doesn't use the default calling convention, you\ncan specify it by appending `_WITH_CALLTYPE` to any of the macros\ndescribed in the previous two sections and supplying the calling\nconvention as the first argument to the macro. For example,\n```\n  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int n));\n  MOCK_CONST_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, Bar, int(double x, double y));\n```\nwhere `STDMETHODCALLTYPE` is defined by `<objbase.h>` on Windows.\n\n# Using Mocks in Tests #\n\nThe typical flow is:\n  1. Import the Google Mock names you need to use. All Google Mock names are in the `testing` namespace unless they are macros or otherwise noted.\n  1. Create the mock objects.\n  1. Optionally, set the default actions of the mock objects.\n  1. Set your expectations on the mock objects (How will they be called? What wil they do?).\n  1. Exercise code that uses the mock objects; if necessary, check the result using [Google Test](../../googletest/) assertions.\n  1. When a mock objects is destructed, Google Mock automatically verifies that all expectations on it have been satisfied.\n\nHere is an example:\n```\nusing ::testing::Return;                            // #1\n\nTEST(BarTest, DoesThis) {\n  MockFoo foo;                                    // #2\n\n  ON_CALL(foo, GetSize())                         // #3\n      .WillByDefault(Return(1));\n  // ... other default actions ...\n\n  EXPECT_CALL(foo, Describe(5))                   // #4\n      .Times(3)\n      .WillRepeatedly(Return(\"Category 5\"));\n  // ... other expectations ...\n\n  EXPECT_EQ(\"good\", MyProductionFunction(&foo));  // #5\n}                                                 // #6\n```\n\n# Setting Default Actions #\n\nGoogle Mock has a **built-in default action** for any function that\nreturns `void`, `bool`, a numeric value, or a pointer.\n\nTo customize the default action for functions with return type `T` globally:\n```\nusing ::testing::DefaultValue;\n\n// Sets the default value to be returned. T must be CopyConstructible.\nDefaultValue<T>::Set(value);\n// Sets a factory. Will be invoked on demand. T must be MoveConstructible.\n//   T MakeT();\nDefaultValue<T>::SetFactory(&MakeT);\n// ... use the mocks ...\n// Resets the default value.\nDefaultValue<T>::Clear();\n```\n\nTo customize the default action for a particular method, use `ON_CALL()`:\n```\nON_CALL(mock_object, method(matchers))\n    .With(multi_argument_matcher)  ?\n    .WillByDefault(action);\n```\n\n# Setting Expectations #\n\n`EXPECT_CALL()` sets **expectations** on a mock method (How will it be\ncalled? What will it do?):\n```\nEXPECT_CALL(mock_object, method(matchers))\n    .With(multi_argument_matcher)  ?\n    .Times(cardinality)            ?\n    .InSequence(sequences)         *\n    .After(expectations)           *\n    .WillOnce(action)              *\n    .WillRepeatedly(action)        ?\n    .RetiresOnSaturation();        ?\n```\n\nIf `Times()` is omitted, the cardinality is assumed to be:\n\n  * `Times(1)` when there is neither `WillOnce()` nor `WillRepeatedly()`;\n  * `Times(n)` when there are `n WillOnce()`s but no `WillRepeatedly()`, where `n` >= 1; or\n  * `Times(AtLeast(n))` when there are `n WillOnce()`s and a `WillRepeatedly()`, where `n` >= 0.\n\nA method with no `EXPECT_CALL()` is free to be invoked _any number of times_, and the default action will be taken each time.\n\n# Matchers #\n\nA **matcher** matches a _single_ argument.  You can use it inside\n`ON_CALL()` or `EXPECT_CALL()`, or use it to validate a value\ndirectly:\n\n| `EXPECT_THAT(value, matcher)` | Asserts that `value` matches `matcher`. |\n|:------------------------------|:----------------------------------------|\n| `ASSERT_THAT(value, matcher)` | The same as `EXPECT_THAT(value, matcher)`, except that it generates a **fatal** failure. |\n\nBuilt-in matchers (where `argument` is the function argument) are\ndivided into several categories:\n\n## Wildcard ##\n|`_`|`argument` can be any value of the correct type.|\n|:--|:-----------------------------------------------|\n|`A<type>()` or `An<type>()`|`argument` can be any value of type `type`.     |\n\n## Generic Comparison ##\n\n|`Eq(value)` or `value`|`argument == value`|\n|:---------------------|:------------------|\n|`Ge(value)`           |`argument >= value`|\n|`Gt(value)`           |`argument > value` |\n|`Le(value)`           |`argument <= value`|\n|`Lt(value)`           |`argument < value` |\n|`Ne(value)`           |`argument != value`|\n|`IsNull()`            |`argument` is a `NULL` pointer (raw or smart).|\n|`NotNull()`           |`argument` is a non-null pointer (raw or smart).|\n|`VariantWith<T>(m)`   |`argument` is `variant<>` that holds the alternative of\ntype T with a value matching `m`.|\n|`Ref(variable)`       |`argument` is a reference to `variable`.|\n|`TypedEq<type>(value)`|`argument` has type `type` and is equal to `value`. You may need to use this instead of `Eq(value)` when the mock function is overloaded.|\n\nExcept `Ref()`, these matchers make a _copy_ of `value` in case it's\nmodified or destructed later. If the compiler complains that `value`\ndoesn't have a public copy constructor, try wrap it in `ByRef()`,\ne.g. `Eq(ByRef(non_copyable_value))`. If you do that, make sure\n`non_copyable_value` is not changed afterwards, or the meaning of your\nmatcher will be changed.\n\n## Floating-Point Matchers ##\n\n|`DoubleEq(a_double)`|`argument` is a `double` value approximately equal to `a_double`, treating two NaNs as unequal.|\n|:-------------------|:----------------------------------------------------------------------------------------------|\n|`FloatEq(a_float)`  |`argument` is a `float` value approximately equal to `a_float`, treating two NaNs as unequal.  |\n|`NanSensitiveDoubleEq(a_double)`|`argument` is a `double` value approximately equal to `a_double`, treating two NaNs as equal.  |\n|`NanSensitiveFloatEq(a_float)`|`argument` is a `float` value approximately equal to `a_float`, treating two NaNs as equal.    |\n\nThe above matchers use ULP-based comparison (the same as used in\n[Google Test](../../googletest/)). They\nautomatically pick a reasonable error bound based on the absolute\nvalue of the expected value.  `DoubleEq()` and `FloatEq()` conform to\nthe IEEE standard, which requires comparing two NaNs for equality to\nreturn false. The `NanSensitive*` version instead treats two NaNs as\nequal, which is often what a user wants.\n\n|`DoubleNear(a_double, max_abs_error)`|`argument` is a `double` value close to `a_double` (absolute error <= `max_abs_error`), treating two NaNs as unequal.|\n|:------------------------------------|:--------------------------------------------------------------------------------------------------------------------|\n|`FloatNear(a_float, max_abs_error)`  |`argument` is a `float` value close to `a_float` (absolute error <= `max_abs_error`), treating two NaNs as unequal.  |\n|`NanSensitiveDoubleNear(a_double, max_abs_error)`|`argument` is a `double` value close to `a_double` (absolute error <= `max_abs_error`), treating two NaNs as equal.  |\n|`NanSensitiveFloatNear(a_float, max_abs_error)`|`argument` is a `float` value close to `a_float` (absolute error <= `max_abs_error`), treating two NaNs as equal.    |\n\n## String Matchers ##\n\nThe `argument` can be either a C string or a C++ string object:\n\n|`ContainsRegex(string)`|`argument` matches the given regular expression.|\n|:----------------------|:-----------------------------------------------|\n|`EndsWith(suffix)`     |`argument` ends with string `suffix`.           |\n|`HasSubstr(string)`    |`argument` contains `string` as a sub-string.   |\n|`MatchesRegex(string)` |`argument` matches the given regular expression with the match starting at the first character and ending at the last character.|\n|`StartsWith(prefix)`   |`argument` starts with string `prefix`.         |\n|`StrCaseEq(string)`    |`argument` is equal to `string`, ignoring case. |\n|`StrCaseNe(string)`    |`argument` is not equal to `string`, ignoring case.|\n|`StrEq(string)`        |`argument` is equal to `string`.                |\n|`StrNe(string)`        |`argument` is not equal to `string`.            |\n\n`ContainsRegex()` and `MatchesRegex()` use the regular expression\nsyntax defined\n[here](../../googletest/docs/advanced.md#regular-expression-syntax).\n`StrCaseEq()`, `StrCaseNe()`, `StrEq()`, and `StrNe()` work for wide\nstrings as well.\n\n## Container Matchers ##\n\nMost STL-style containers support `==`, so you can use\n`Eq(expected_container)` or simply `expected_container` to match a\ncontainer exactly.   If you want to write the elements in-line,\nmatch them more flexibly, or get more informative messages, you can use:\n\n| `ContainerEq(container)` | The same as `Eq(container)` except that the failure message also includes which elements are in one container but not the other. |\n|:-------------------------|:---------------------------------------------------------------------------------------------------------------------------------|\n| `Contains(e)`            | `argument` contains an element that matches `e`, which can be either a value or a matcher.                                       |\n| `Each(e)`                | `argument` is a container where _every_ element matches `e`, which can be either a value or a matcher.                           |\n| `ElementsAre(e0, e1, ..., en)` | `argument` has `n + 1` elements, where the i-th element matches `ei`, which can be a value or a matcher. 0 to 10 arguments are allowed. |\n| `ElementsAreArray({ e0, e1, ..., en })`, `ElementsAreArray(array)`, or `ElementsAreArray(array, count)` | The same as `ElementsAre()` except that the expected element values/matchers come from an initializer list, STL-style container, or C-style array. |\n| `IsEmpty()`              | `argument` is an empty container (`container.empty()`).                                                                          |\n| `Pointwise(m, container)` | `argument` contains the same number of elements as in `container`, and for all i, (the i-th element in `argument`, the i-th element in `container`) match `m`, which is a matcher on 2-tuples. E.g. `Pointwise(Le(), upper_bounds)` verifies that each element in `argument` doesn't exceed the corresponding element in `upper_bounds`. See more detail below. |\n| `SizeIs(m)`              | `argument` is a container whose size matches `m`. E.g. `SizeIs(2)` or `SizeIs(Lt(2))`.                                           |\n| `UnorderedElementsAre(e0, e1, ..., en)` | `argument` has `n + 1` elements, and under some permutation each element matches an `ei` (for a different `i`), which can be a value or a matcher. 0 to 10 arguments are allowed. |\n| `UnorderedElementsAreArray({ e0, e1, ..., en })`, `UnorderedElementsAreArray(array)`, or `UnorderedElementsAreArray(array, count)` | The same as `UnorderedElementsAre()` except that the expected element values/matchers come from an initializer list, STL-style container, or C-style array. |\n| `WhenSorted(m)`          | When `argument` is sorted using the `<` operator, it matches container matcher `m`. E.g. `WhenSorted(ElementsAre(1, 2, 3))` verifies that `argument` contains elements `1`, `2`, and `3`, ignoring order. |\n| `WhenSortedBy(comparator, m)` | The same as `WhenSorted(m)`, except that the given comparator instead of `<` is used to sort `argument`. E.g. `WhenSortedBy(std::greater<int>(), ElementsAre(3, 2, 1))`. |\n\nNotes:\n\n  * These matchers can also match:\n    1. a native array passed by reference (e.g. in `Foo(const int (&a)[5])`), and\n    1. an array passed as a pointer and a count (e.g. in `Bar(const T* buffer, int len)` -- see [Multi-argument Matchers](#Multiargument_Matchers.md)).\n  * The array being matched may be multi-dimensional (i.e. its elements can be arrays).\n  * `m` in `Pointwise(m, ...)` should be a matcher for `::testing::tuple<T, U>` where `T` and `U` are the element type of the actual container and the expected container, respectively. For example, to compare two `Foo` containers where `Foo` doesn't support `operator==` but has an `Equals()` method, one might write:\n\n```\nusing ::testing::get;\nMATCHER(FooEq, \"\") {\n  return get<0>(arg).Equals(get<1>(arg));\n}\n...\nEXPECT_THAT(actual_foos, Pointwise(FooEq(), expected_foos));\n```\n\n## Member Matchers ##\n\n|`Field(&class::field, m)`|`argument.field` (or `argument->field` when `argument` is a plain pointer) matches matcher `m`, where `argument` is an object of type _class_.|\n|:------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------|\n|`Key(e)`                 |`argument.first` matches `e`, which can be either a value or a matcher. E.g. `Contains(Key(Le(5)))` can verify that a `map` contains a key `<= 5`.|\n|`Pair(m1, m2)`           |`argument` is an `std::pair` whose `first` field matches `m1` and `second` field matches `m2`.                                                |\n|`Property(&class::property, m)`|`argument.property()` (or `argument->property()` when `argument` is a plain pointer) matches matcher `m`, where `argument` is an object of type _class_.|\n\n## Matching the Result of a Function or Functor ##\n\n|`ResultOf(f, m)`|`f(argument)` matches matcher `m`, where `f` is a function or functor.|\n|:---------------|:---------------------------------------------------------------------|\n\n## Pointer Matchers ##\n\n|`Pointee(m)`|`argument` (either a smart pointer or a raw pointer) points to a value that matches matcher `m`.|\n|:-----------|:-----------------------------------------------------------------------------------------------|\n|`WhenDynamicCastTo<T>(m)`| when `argument` is passed through `dynamic_cast<T>()`, it matches matcher `m`.                 |\n\n## Multiargument Matchers ##\n\nTechnically, all matchers match a _single_ value. A \"multi-argument\"\nmatcher is just one that matches a _tuple_. The following matchers can\nbe used to match a tuple `(x, y)`:\n\n|`Eq()`|`x == y`|\n|:-----|:-------|\n|`Ge()`|`x >= y`|\n|`Gt()`|`x > y` |\n|`Le()`|`x <= y`|\n|`Lt()`|`x < y` |\n|`Ne()`|`x != y`|\n\nYou can use the following selectors to pick a subset of the arguments\n(or reorder them) to participate in the matching:\n\n|`AllArgs(m)`|Equivalent to `m`. Useful as syntactic sugar in `.With(AllArgs(m))`.|\n|:-----------|:-------------------------------------------------------------------|\n|`Args<N1, N2, ..., Nk>(m)`|The tuple of the `k` selected (using 0-based indices) arguments matches `m`, e.g. `Args<1, 2>(Eq())`.|\n\n## Composite Matchers ##\n\nYou can make a matcher from one or more other matchers:\n\n|`AllOf(m1, m2, ..., mn)`|`argument` matches all of the matchers `m1` to `mn`.|\n|:-----------------------|:---------------------------------------------------|\n|`AnyOf(m1, m2, ..., mn)`|`argument` matches at least one of the matchers `m1` to `mn`.|\n|`Not(m)`                |`argument` doesn't match matcher `m`.               |\n\n## Adapters for Matchers ##\n\n|`MatcherCast<T>(m)`|casts matcher `m` to type `Matcher<T>`.|\n|:------------------|:--------------------------------------|\n|`SafeMatcherCast<T>(m)`| [safely casts](CookBook.md#casting-matchers) matcher `m` to type `Matcher<T>`. |\n|`Truly(predicate)` |`predicate(argument)` returns something considered by C++ to be true, where `predicate` is a function or functor.|\n\n## Matchers as Predicates ##\n\n|`Matches(m)(value)`|evaluates to `true` if `value` matches `m`. You can use `Matches(m)` alone as a unary functor.|\n|:------------------|:---------------------------------------------------------------------------------------------|\n|`ExplainMatchResult(m, value, result_listener)`|evaluates to `true` if `value` matches `m`, explaining the result to `result_listener`.       |\n|`Value(value, m)`  |evaluates to `true` if `value` matches `m`.                                                   |\n\n## Defining Matchers ##\n\n| `MATCHER(IsEven, \"\") { return (arg % 2) == 0; }` | Defines a matcher `IsEven()` to match an even number. |\n|:-------------------------------------------------|:------------------------------------------------------|\n| `MATCHER_P(IsDivisibleBy, n, \"\") { *result_listener << \"where the remainder is \" << (arg % n); return (arg % n) == 0; }` | Defines a macher `IsDivisibleBy(n)` to match a number divisible by `n`. |\n| `MATCHER_P2(IsBetween, a, b, std::string(negation ? \"isn't\" : \"is\") + \" between \" + PrintToString(a) + \" and \" + PrintToString(b)) { return a <= arg && arg <= b; }` | Defines a matcher `IsBetween(a, b)` to match a value in the range [`a`, `b`]. |\n\n**Notes:**\n\n  1. The `MATCHER*` macros cannot be used inside a function or class.\n  1. The matcher body must be _purely functional_ (i.e. it cannot have any side effect, and the result must not depend on anything other than the value being matched and the matcher parameters).\n  1. You can use `PrintToString(x)` to convert a value `x` of any type to a string.\n\n## Matchers as Test Assertions ##\n\n|`ASSERT_THAT(expression, m)`|Generates a [fatal failure](../../googletest/docs/primer.md#assertions) if the value of `expression` doesn't match matcher `m`.|\n|:---------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------|\n|`EXPECT_THAT(expression, m)`|Generates a non-fatal failure if the value of `expression` doesn't match matcher `m`.                                                          |\n\n# Actions #\n\n**Actions** specify what a mock function should do when invoked.\n\n## Returning a Value ##\n\n|`Return()`|Return from a `void` mock function.|\n|:---------|:----------------------------------|\n|`Return(value)`|Return `value`. If the type of `value` is different to the mock function's return type, `value` is converted to the latter type <i>at the time the expectation is set</i>, not when the action is executed.|\n|`ReturnArg<N>()`|Return the `N`-th (0-based) argument.|\n|`ReturnNew<T>(a1, ..., ak)`|Return `new T(a1, ..., ak)`; a different object is created each time.|\n|`ReturnNull()`|Return a null pointer.             |\n|`ReturnPointee(ptr)`|Return the value pointed to by `ptr`.|\n|`ReturnRef(variable)`|Return a reference to `variable`.  |\n|`ReturnRefOfCopy(value)`|Return a reference to a copy of `value`; the copy lives as long as the action.|\n\n## Side Effects ##\n\n|`Assign(&variable, value)`|Assign `value` to variable.|\n|:-------------------------|:--------------------------|\n| `DeleteArg<N>()`         | Delete the `N`-th (0-based) argument, which must be a pointer. |\n| `SaveArg<N>(pointer)`    | Save the `N`-th (0-based) argument to `*pointer`. |\n| `SaveArgPointee<N>(pointer)` | Save the value pointed to by the `N`-th (0-based) argument to `*pointer`. |\n| `SetArgReferee<N>(value)` |\tAssign value to the variable referenced by the `N`-th (0-based) argument. |\n|`SetArgPointee<N>(value)` |Assign `value` to the variable pointed by the `N`-th (0-based) argument.|\n|`SetArgumentPointee<N>(value)`|Same as `SetArgPointee<N>(value)`. Deprecated. Will be removed in v1.7.0.|\n|`SetArrayArgument<N>(first, last)`|Copies the elements in source range [`first`, `last`) to the array pointed to by the `N`-th (0-based) argument, which can be either a pointer or an iterator. The action does not take ownership of the elements in the source range.|\n|`SetErrnoAndReturn(error, value)`|Set `errno` to `error` and return `value`.|\n|`Throw(exception)`        |Throws the given exception, which can be any copyable value. Available since v1.1.0.|\n\n## Using a Function or a Functor as an Action ##\n\n|`Invoke(f)`|Invoke `f` with the arguments passed to the mock function, where `f` can be a global/static function or a functor.|\n|:----------|:-----------------------------------------------------------------------------------------------------------------|\n|`Invoke(object_pointer, &class::method)`|Invoke the {method on the object with the arguments passed to the mock function.                                  |\n|`InvokeWithoutArgs(f)`|Invoke `f`, which can be a global/static function or a functor. `f` must take no arguments.                       |\n|`InvokeWithoutArgs(object_pointer, &class::method)`|Invoke the method on the object, which takes no arguments.                                                        |\n|`InvokeArgument<N>(arg1, arg2, ..., argk)`|Invoke the mock function's `N`-th (0-based) argument, which must be a function or a functor, with the `k` arguments.|\n\nThe return value of the invoked function is used as the return value\nof the action.\n\nWhen defining a function or functor to be used with `Invoke*()`, you can declare any unused parameters as `Unused`:\n```\n  double Distance(Unused, double x, double y) { return sqrt(x*x + y*y); }\n  ...\n  EXPECT_CALL(mock, Foo(\"Hi\", _, _)).WillOnce(Invoke(Distance));\n```\n\nIn `InvokeArgument<N>(...)`, if an argument needs to be passed by reference, wrap it inside `ByRef()`. For example,\n```\n  InvokeArgument<2>(5, string(\"Hi\"), ByRef(foo))\n```\ncalls the mock function's #2 argument, passing to it `5` and `string(\"Hi\")` by value, and `foo` by reference.\n\n## Default Action ##\n\n|`DoDefault()`|Do the default action (specified by `ON_CALL()` or the built-in one).|\n|:------------|:--------------------------------------------------------------------|\n\n**Note:** due to technical reasons, `DoDefault()` cannot be used inside  a composite action - trying to do so will result in a run-time error.\n\n## Composite Actions ##\n\n|`DoAll(a1, a2, ..., an)`|Do all actions `a1` to `an` and return the result of `an` in each invocation. The first `n - 1` sub-actions must return void. |\n|:-----------------------|:-----------------------------------------------------------------------------------------------------------------------------|\n|`IgnoreResult(a)`       |Perform action `a` and ignore its result. `a` must not return void.                                                           |\n|`WithArg<N>(a)`         |Pass the `N`-th (0-based) argument of the mock function to action `a` and perform it.                                         |\n|`WithArgs<N1, N2, ..., Nk>(a)`|Pass the selected (0-based) arguments of the mock function to action `a` and perform it.                                      |\n|`WithoutArgs(a)`        |Perform action `a` without any arguments.                                                                                     |\n\n## Defining Actions ##\n\n| `ACTION(Sum) { return arg0 + arg1; }` | Defines an action `Sum()` to return the sum of the mock function's argument #0 and #1. |\n|:--------------------------------------|:---------------------------------------------------------------------------------------|\n| `ACTION_P(Plus, n) { return arg0 + n; }` | Defines an action `Plus(n)` to return the sum of the mock function's argument #0 and `n`. |\n| `ACTION_Pk(Foo, p1, ..., pk) { statements; }` | Defines a parameterized action `Foo(p1, ..., pk)` to execute the given `statements`.   |\n\nThe `ACTION*` macros cannot be used inside a function or class.\n\n# Cardinalities #\n\nThese are used in `Times()` to specify how many times a mock function will be called:\n\n|`AnyNumber()`|The function can be called any number of times.|\n|:------------|:----------------------------------------------|\n|`AtLeast(n)` |The call is expected at least `n` times.       |\n|`AtMost(n)`  |The call is expected at most `n` times.        |\n|`Between(m, n)`|The call is expected between `m` and `n` (inclusive) times.|\n|`Exactly(n) or n`|The call is expected exactly `n` times. In particular, the call should never happen when `n` is 0.|\n\n# Expectation Order #\n\nBy default, the expectations can be matched in _any_ order.  If some\nor all expectations must be matched in a given order, there are two\nways to specify it.  They can be used either independently or\ntogether.\n\n## The After Clause ##\n\n```\nusing ::testing::Expectation;\n...\nExpectation init_x = EXPECT_CALL(foo, InitX());\nExpectation init_y = EXPECT_CALL(foo, InitY());\nEXPECT_CALL(foo, Bar())\n    .After(init_x, init_y);\n```\nsays that `Bar()` can be called only after both `InitX()` and\n`InitY()` have been called.\n\nIf you don't know how many pre-requisites an expectation has when you\nwrite it, you can use an `ExpectationSet` to collect them:\n\n```\nusing ::testing::ExpectationSet;\n...\nExpectationSet all_inits;\nfor (int i = 0; i < element_count; i++) {\n  all_inits += EXPECT_CALL(foo, InitElement(i));\n}\nEXPECT_CALL(foo, Bar())\n    .After(all_inits);\n```\nsays that `Bar()` can be called only after all elements have been\ninitialized (but we don't care about which elements get initialized\nbefore the others).\n\nModifying an `ExpectationSet` after using it in an `.After()` doesn't\naffect the meaning of the `.After()`.\n\n## Sequences ##\n\nWhen you have a long chain of sequential expectations, it's easier to\nspecify the order using **sequences**, which don't require you to given\neach expectation in the chain a different name.  <i>All expected<br>\ncalls</i> in the same sequence must occur in the order they are\nspecified.\n\n```\nusing ::testing::Sequence;\nSequence s1, s2;\n...\nEXPECT_CALL(foo, Reset())\n    .InSequence(s1, s2)\n    .WillOnce(Return(true));\nEXPECT_CALL(foo, GetSize())\n    .InSequence(s1)\n    .WillOnce(Return(1));\nEXPECT_CALL(foo, Describe(A<const char*>()))\n    .InSequence(s2)\n    .WillOnce(Return(\"dummy\"));\n```\nsays that `Reset()` must be called before _both_ `GetSize()` _and_\n`Describe()`, and the latter two can occur in any order.\n\nTo put many expectations in a sequence conveniently:\n```\nusing ::testing::InSequence;\n{\n  InSequence dummy;\n\n  EXPECT_CALL(...)...;\n  EXPECT_CALL(...)...;\n  ...\n  EXPECT_CALL(...)...;\n}\n```\nsays that all expected calls in the scope of `dummy` must occur in\nstrict order. The name `dummy` is irrelevant.)\n\n# Verifying and Resetting a Mock #\n\nGoogle Mock will verify the expectations on a mock object when it is destructed, or you can do it earlier:\n```\nusing ::testing::Mock;\n...\n// Verifies and removes the expectations on mock_obj;\n// returns true iff successful.\nMock::VerifyAndClearExpectations(&mock_obj);\n...\n// Verifies and removes the expectations on mock_obj;\n// also removes the default actions set by ON_CALL();\n// returns true iff successful.\nMock::VerifyAndClear(&mock_obj);\n```\n\nYou can also tell Google Mock that a mock object can be leaked and doesn't\nneed to be verified:\n```\nMock::AllowLeak(&mock_obj);\n```\n\n# Mock Classes #\n\nGoogle Mock defines a convenient mock class template\n```\nclass MockFunction<R(A1, ..., An)> {\n public:\n  MOCK_METHODn(Call, R(A1, ..., An));\n};\n```\nSee this [recipe](CookBook.md#using-check-points) for one application of it.\n\n# Flags #\n\n| `--gmock_catch_leaked_mocks=0` | Don't report leaked mock objects as failures. |\n|:-------------------------------|:----------------------------------------------|\n| `--gmock_verbose=LEVEL`        | Sets the default verbosity level (`info`, `warning`, or `error`) of Google Mock messages. |\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/docs/CookBook.md",
    "content": "\n\nYou can find recipes for using Google Mock here. If you haven't yet,\nplease read the [ForDummies](ForDummies.md) document first to make sure you understand\nthe basics.\n\n**Note:** Google Mock lives in the `testing` name space. For\nreadability, it is recommended to write `using ::testing::Foo;` once in\nyour file before using the name `Foo` defined by Google Mock. We omit\nsuch `using` statements in this page for brevity, but you should do it\nin your own code.\n\n# Creating Mock Classes #\n\n## Mocking Private or Protected Methods ##\n\nYou must always put a mock method definition (`MOCK_METHOD*`) in a\n`public:` section of the mock class, regardless of the method being\nmocked being `public`, `protected`, or `private` in the base class.\nThis allows `ON_CALL` and `EXPECT_CALL` to reference the mock function\nfrom outside of the mock class.  (Yes, C++ allows a subclass to specify\na different access level than the base class on a virtual function.)\nExample:\n\n```\nclass Foo {\n public:\n  ...\n  virtual bool Transform(Gadget* g) = 0;\n\n protected:\n  virtual void Resume();\n\n private:\n  virtual int GetTimeOut();\n};\n\nclass MockFoo : public Foo {\n public:\n  ...\n  MOCK_METHOD1(Transform, bool(Gadget* g));\n\n  // The following must be in the public section, even though the\n  // methods are protected or private in the base class.\n  MOCK_METHOD0(Resume, void());\n  MOCK_METHOD0(GetTimeOut, int());\n};\n```\n\n## Mocking Overloaded Methods ##\n\nYou can mock overloaded functions as usual. No special attention is required:\n\n```\nclass Foo {\n  ...\n\n  // Must be virtual as we'll inherit from Foo.\n  virtual ~Foo();\n\n  // Overloaded on the types and/or numbers of arguments.\n  virtual int Add(Element x);\n  virtual int Add(int times, Element x);\n\n  // Overloaded on the const-ness of this object.\n  virtual Bar& GetBar();\n  virtual const Bar& GetBar() const;\n};\n\nclass MockFoo : public Foo {\n  ...\n  MOCK_METHOD1(Add, int(Element x));\n  MOCK_METHOD2(Add, int(int times, Element x);\n\n  MOCK_METHOD0(GetBar, Bar&());\n  MOCK_CONST_METHOD0(GetBar, const Bar&());\n};\n```\n\n**Note:** if you don't mock all versions of the overloaded method, the\ncompiler will give you a warning about some methods in the base class\nbeing hidden. To fix that, use `using` to bring them in scope:\n\n```\nclass MockFoo : public Foo {\n  ...\n  using Foo::Add;\n  MOCK_METHOD1(Add, int(Element x));\n  // We don't want to mock int Add(int times, Element x);\n  ...\n};\n```\n\n## Mocking Class Templates ##\n\nTo mock a class template, append `_T` to the `MOCK_*` macros:\n\n```\ntemplate <typename Elem>\nclass StackInterface {\n  ...\n  // Must be virtual as we'll inherit from StackInterface.\n  virtual ~StackInterface();\n\n  virtual int GetSize() const = 0;\n  virtual void Push(const Elem& x) = 0;\n};\n\ntemplate <typename Elem>\nclass MockStack : public StackInterface<Elem> {\n  ...\n  MOCK_CONST_METHOD0_T(GetSize, int());\n  MOCK_METHOD1_T(Push, void(const Elem& x));\n};\n```\n\n## Mocking Nonvirtual Methods ##\n\nGoogle Mock can mock non-virtual functions to be used in what we call _hi-perf\ndependency injection_.\n\nIn this case, instead of sharing a common base class with the real\nclass, your mock class will be _unrelated_ to the real class, but\ncontain methods with the same signatures.  The syntax for mocking\nnon-virtual methods is the _same_ as mocking virtual methods:\n\n```\n// A simple packet stream class.  None of its members is virtual.\nclass ConcretePacketStream {\n public:\n  void AppendPacket(Packet* new_packet);\n  const Packet* GetPacket(size_t packet_number) const;\n  size_t NumberOfPackets() const;\n  ...\n};\n\n// A mock packet stream class.  It inherits from no other, but defines\n// GetPacket() and NumberOfPackets().\nclass MockPacketStream {\n public:\n  MOCK_CONST_METHOD1(GetPacket, const Packet*(size_t packet_number));\n  MOCK_CONST_METHOD0(NumberOfPackets, size_t());\n  ...\n};\n```\n\nNote that the mock class doesn't define `AppendPacket()`, unlike the\nreal class. That's fine as long as the test doesn't need to call it.\n\nNext, you need a way to say that you want to use\n`ConcretePacketStream` in production code and to use `MockPacketStream`\nin tests.  Since the functions are not virtual and the two classes are\nunrelated, you must specify your choice at _compile time_ (as opposed\nto run time).\n\nOne way to do it is to templatize your code that needs to use a packet\nstream.  More specifically, you will give your code a template type\nargument for the type of the packet stream.  In production, you will\ninstantiate your template with `ConcretePacketStream` as the type\nargument.  In tests, you will instantiate the same template with\n`MockPacketStream`.  For example, you may write:\n\n```\ntemplate <class PacketStream>\nvoid CreateConnection(PacketStream* stream) { ... }\n\ntemplate <class PacketStream>\nclass PacketReader {\n public:\n  void ReadPackets(PacketStream* stream, size_t packet_num);\n};\n```\n\nThen you can use `CreateConnection<ConcretePacketStream>()` and\n`PacketReader<ConcretePacketStream>` in production code, and use\n`CreateConnection<MockPacketStream>()` and\n`PacketReader<MockPacketStream>` in tests.\n\n```\n  MockPacketStream mock_stream;\n  EXPECT_CALL(mock_stream, ...)...;\n  .. set more expectations on mock_stream ...\n  PacketReader<MockPacketStream> reader(&mock_stream);\n  ... exercise reader ...\n```\n\n## Mocking Free Functions ##\n\nIt's possible to use Google Mock to mock a free function (i.e. a\nC-style function or a static method).  You just need to rewrite your\ncode to use an interface (abstract class).\n\nInstead of calling a free function (say, `OpenFile`) directly,\nintroduce an interface for it and have a concrete subclass that calls\nthe free function:\n\n```\nclass FileInterface {\n public:\n  ...\n  virtual bool Open(const char* path, const char* mode) = 0;\n};\n\nclass File : public FileInterface {\n public:\n  ...\n  virtual bool Open(const char* path, const char* mode) {\n    return OpenFile(path, mode);\n  }\n};\n```\n\nYour code should talk to `FileInterface` to open a file.  Now it's\neasy to mock out the function.\n\nThis may seem much hassle, but in practice you often have multiple\nrelated functions that you can put in the same interface, so the\nper-function syntactic overhead will be much lower.\n\nIf you are concerned about the performance overhead incurred by\nvirtual functions, and profiling confirms your concern, you can\ncombine this with the recipe for [mocking non-virtual methods](#mocking-nonvirtual-methods).\n\n## The Nice, the Strict, and the Naggy ##\n\nIf a mock method has no `EXPECT_CALL` spec but is called, Google Mock\nwill print a warning about the \"uninteresting call\". The rationale is:\n\n  * New methods may be added to an interface after a test is written. We shouldn't fail a test just because a method it doesn't know about is called.\n  * However, this may also mean there's a bug in the test, so Google Mock shouldn't be silent either. If the user believes these calls are harmless, they can add an `EXPECT_CALL()` to suppress the warning.\n\nHowever, sometimes you may want to suppress all \"uninteresting call\"\nwarnings, while sometimes you may want the opposite, i.e. to treat all\nof them as errors. Google Mock lets you make the decision on a\nper-mock-object basis.\n\nSuppose your test uses a mock class `MockFoo`:\n\n```\nTEST(...) {\n  MockFoo mock_foo;\n  EXPECT_CALL(mock_foo, DoThis());\n  ... code that uses mock_foo ...\n}\n```\n\nIf a method of `mock_foo` other than `DoThis()` is called, it will be\nreported by Google Mock as a warning. However, if you rewrite your\ntest to use `NiceMock<MockFoo>` instead, the warning will be gone,\nresulting in a cleaner test output:\n\n```\nusing ::testing::NiceMock;\n\nTEST(...) {\n  NiceMock<MockFoo> mock_foo;\n  EXPECT_CALL(mock_foo, DoThis());\n  ... code that uses mock_foo ...\n}\n```\n\n`NiceMock<MockFoo>` is a subclass of `MockFoo`, so it can be used\nwherever `MockFoo` is accepted.\n\nIt also works if `MockFoo`'s constructor takes some arguments, as\n`NiceMock<MockFoo>` \"inherits\" `MockFoo`'s constructors:\n\n```\nusing ::testing::NiceMock;\n\nTEST(...) {\n  NiceMock<MockFoo> mock_foo(5, \"hi\");  // Calls MockFoo(5, \"hi\").\n  EXPECT_CALL(mock_foo, DoThis());\n  ... code that uses mock_foo ...\n}\n```\n\nThe usage of `StrictMock` is similar, except that it makes all\nuninteresting calls failures:\n\n```\nusing ::testing::StrictMock;\n\nTEST(...) {\n  StrictMock<MockFoo> mock_foo;\n  EXPECT_CALL(mock_foo, DoThis());\n  ... code that uses mock_foo ...\n\n  // The test will fail if a method of mock_foo other than DoThis()\n  // is called.\n}\n```\n\nThere are some caveats though (I don't like them just as much as the\nnext guy, but sadly they are side effects of C++'s limitations):\n\n  1. `NiceMock<MockFoo>` and `StrictMock<MockFoo>` only work for mock methods defined using the `MOCK_METHOD*` family of macros **directly** in the `MockFoo` class. If a mock method is defined in a **base class** of `MockFoo`, the \"nice\" or \"strict\" modifier may not affect it, depending on the compiler. In particular, nesting `NiceMock` and `StrictMock` (e.g. `NiceMock<StrictMock<MockFoo> >`) is **not** supported.\n  1. The constructors of the base mock (`MockFoo`) cannot have arguments passed by non-const reference, which happens to be banned by the [Google C++ style guide](https://google.github.io/styleguide/cppguide.html).\n  1. During the constructor or destructor of `MockFoo`, the mock object is _not_ nice or strict.  This may cause surprises if the constructor or destructor calls a mock method on `this` object. (This behavior, however, is consistent with C++'s general rule: if a constructor or destructor calls a virtual method of `this` object, that method is treated as non-virtual.  In other words, to the base class's constructor or destructor, `this` object behaves like an instance of the base class, not the derived class.  This rule is required for safety.  Otherwise a base constructor may use members of a derived class before they are initialized, or a base destructor may use members of a derived class after they have been destroyed.)\n\nFinally, you should be **very cautious** about when to use naggy or strict mocks, as they tend to make tests more brittle and harder to maintain. When you refactor your code without changing its externally visible behavior, ideally you should't need to update any tests. If your code interacts with a naggy mock, however, you may start to get spammed with warnings as the result of your change. Worse, if your code interacts with a strict mock, your tests may start to fail and you'll be forced to fix them. Our general recommendation is to use nice mocks (not yet the default) most of the time, use naggy mocks (the current default) when developing or debugging tests, and use strict mocks only as the last resort.\n\n## Simplifying the Interface without Breaking Existing Code ##\n\nSometimes a method has a long list of arguments that is mostly\nuninteresting. For example,\n\n```\nclass LogSink {\n public:\n  ...\n  virtual void send(LogSeverity severity, const char* full_filename,\n                    const char* base_filename, int line,\n                    const struct tm* tm_time,\n                    const char* message, size_t message_len) = 0;\n};\n```\n\nThis method's argument list is lengthy and hard to work with (let's\nsay that the `message` argument is not even 0-terminated). If we mock\nit as is, using the mock will be awkward. If, however, we try to\nsimplify this interface, we'll need to fix all clients depending on\nit, which is often infeasible.\n\nThe trick is to re-dispatch the method in the mock class:\n\n```\nclass ScopedMockLog : public LogSink {\n public:\n  ...\n  virtual void send(LogSeverity severity, const char* full_filename,\n                    const char* base_filename, int line, const tm* tm_time,\n                    const char* message, size_t message_len) {\n    // We are only interested in the log severity, full file name, and\n    // log message.\n    Log(severity, full_filename, std::string(message, message_len));\n  }\n\n  // Implements the mock method:\n  //\n  //   void Log(LogSeverity severity,\n  //            const string& file_path,\n  //            const string& message);\n  MOCK_METHOD3(Log, void(LogSeverity severity, const string& file_path,\n                         const string& message));\n};\n```\n\nBy defining a new mock method with a trimmed argument list, we make\nthe mock class much more user-friendly.\n\n## Alternative to Mocking Concrete Classes ##\n\nOften you may find yourself using classes that don't implement\ninterfaces. In order to test your code that uses such a class (let's\ncall it `Concrete`), you may be tempted to make the methods of\n`Concrete` virtual and then mock it.\n\nTry not to do that.\n\nMaking a non-virtual function virtual is a big decision. It creates an\nextension point where subclasses can tweak your class' behavior. This\nweakens your control on the class because now it's harder to maintain\nthe class' invariants. You should make a function virtual only when\nthere is a valid reason for a subclass to override it.\n\nMocking concrete classes directly is problematic as it creates a tight\ncoupling between the class and the tests - any small change in the\nclass may invalidate your tests and make test maintenance a pain.\n\nTo avoid such problems, many programmers have been practicing \"coding\nto interfaces\": instead of talking to the `Concrete` class, your code\nwould define an interface and talk to it. Then you implement that\ninterface as an adaptor on top of `Concrete`. In tests, you can easily\nmock that interface to observe how your code is doing.\n\nThis technique incurs some overhead:\n\n  * You pay the cost of virtual function calls (usually not a problem).\n  * There is more abstraction for the programmers to learn.\n\nHowever, it can also bring significant benefits in addition to better\ntestability:\n\n  * `Concrete`'s API may not fit your problem domain very well, as you may not be the only client it tries to serve. By designing your own interface, you have a chance to tailor it to your need - you may add higher-level functionalities, rename stuff, etc instead of just trimming the class. This allows you to write your code (user of the interface) in a more natural way, which means it will be more readable, more maintainable, and you'll be more productive.\n  * If `Concrete`'s implementation ever has to change, you don't have to rewrite everywhere it is used. Instead, you can absorb the change in your implementation of the interface, and your other code and tests will be insulated from this change.\n\nSome people worry that if everyone is practicing this technique, they\nwill end up writing lots of redundant code. This concern is totally\nunderstandable. However, there are two reasons why it may not be the\ncase:\n\n  * Different projects may need to use `Concrete` in different ways, so the best interfaces for them will be different. Therefore, each of them will have its own domain-specific interface on top of `Concrete`, and they will not be the same code.\n  * If enough projects want to use the same interface, they can always share it, just like they have been sharing `Concrete`. You can check in the interface and the adaptor somewhere near `Concrete` (perhaps in a `contrib` sub-directory) and let many projects use it.\n\nYou need to weigh the pros and cons carefully for your particular\nproblem, but I'd like to assure you that the Java community has been\npracticing this for a long time and it's a proven effective technique\napplicable in a wide variety of situations. :-)\n\n## Delegating Calls to a Fake ##\n\nSome times you have a non-trivial fake implementation of an\ninterface. For example:\n\n```\nclass Foo {\n public:\n  virtual ~Foo() {}\n  virtual char DoThis(int n) = 0;\n  virtual void DoThat(const char* s, int* p) = 0;\n};\n\nclass FakeFoo : public Foo {\n public:\n  virtual char DoThis(int n) {\n    return (n > 0) ? '+' :\n        (n < 0) ? '-' : '0';\n  }\n\n  virtual void DoThat(const char* s, int* p) {\n    *p = strlen(s);\n  }\n};\n```\n\nNow you want to mock this interface such that you can set expectations\non it. However, you also want to use `FakeFoo` for the default\nbehavior, as duplicating it in the mock object is, well, a lot of\nwork.\n\nWhen you define the mock class using Google Mock, you can have it\ndelegate its default action to a fake class you already have, using\nthis pattern:\n\n```\nusing ::testing::_;\nusing ::testing::Invoke;\n\nclass MockFoo : public Foo {\n public:\n  // Normal mock method definitions using Google Mock.\n  MOCK_METHOD1(DoThis, char(int n));\n  MOCK_METHOD2(DoThat, void(const char* s, int* p));\n\n  // Delegates the default actions of the methods to a FakeFoo object.\n  // This must be called *before* the custom ON_CALL() statements.\n  void DelegateToFake() {\n    ON_CALL(*this, DoThis(_))\n        .WillByDefault(Invoke(&fake_, &FakeFoo::DoThis));\n    ON_CALL(*this, DoThat(_, _))\n        .WillByDefault(Invoke(&fake_, &FakeFoo::DoThat));\n  }\n private:\n  FakeFoo fake_;  // Keeps an instance of the fake in the mock.\n};\n```\n\nWith that, you can use `MockFoo` in your tests as usual. Just remember\nthat if you don't explicitly set an action in an `ON_CALL()` or\n`EXPECT_CALL()`, the fake will be called upon to do it:\n\n```\nusing ::testing::_;\n\nTEST(AbcTest, Xyz) {\n  MockFoo foo;\n  foo.DelegateToFake(); // Enables the fake for delegation.\n\n  // Put your ON_CALL(foo, ...)s here, if any.\n\n  // No action specified, meaning to use the default action.\n  EXPECT_CALL(foo, DoThis(5));\n  EXPECT_CALL(foo, DoThat(_, _));\n\n  int n = 0;\n  EXPECT_EQ('+', foo.DoThis(5));  // FakeFoo::DoThis() is invoked.\n  foo.DoThat(\"Hi\", &n);           // FakeFoo::DoThat() is invoked.\n  EXPECT_EQ(2, n);\n}\n```\n\n**Some tips:**\n\n  * If you want, you can still override the default action by providing your own `ON_CALL()` or using `.WillOnce()` / `.WillRepeatedly()` in `EXPECT_CALL()`.\n  * In `DelegateToFake()`, you only need to delegate the methods whose fake implementation you intend to use.\n  * The general technique discussed here works for overloaded methods, but you'll need to tell the compiler which version you mean. To disambiguate a mock function (the one you specify inside the parentheses of `ON_CALL()`), see the \"Selecting Between Overloaded Functions\" section on this page; to disambiguate a fake function (the one you place inside `Invoke()`), use a `static_cast` to specify the function's type. For instance, if class `Foo` has methods `char DoThis(int n)` and `bool DoThis(double x) const`, and you want to invoke the latter, you need to write `Invoke(&fake_, static_cast<bool (FakeFoo::*)(double) const>(&FakeFoo::DoThis))` instead of `Invoke(&fake_, &FakeFoo::DoThis)` (The strange-looking thing inside the angled brackets of `static_cast` is the type of a function pointer to the second `DoThis()` method.).\n  * Having to mix a mock and a fake is often a sign of something gone wrong. Perhaps you haven't got used to the interaction-based way of testing yet. Or perhaps your interface is taking on too many roles and should be split up. Therefore, **don't abuse this**. We would only recommend to do it as an intermediate step when you are refactoring your code.\n\nRegarding the tip on mixing a mock and a fake, here's an example on\nwhy it may be a bad sign: Suppose you have a class `System` for\nlow-level system operations. In particular, it does file and I/O\noperations. And suppose you want to test how your code uses `System`\nto do I/O, and you just want the file operations to work normally. If\nyou mock out the entire `System` class, you'll have to provide a fake\nimplementation for the file operation part, which suggests that\n`System` is taking on too many roles.\n\nInstead, you can define a `FileOps` interface and an `IOOps` interface\nand split `System`'s functionalities into the two. Then you can mock\n`IOOps` without mocking `FileOps`.\n\n## Delegating Calls to a Real Object ##\n\nWhen using testing doubles (mocks, fakes, stubs, and etc), sometimes\ntheir behaviors will differ from those of the real objects. This\ndifference could be either intentional (as in simulating an error such\nthat you can test the error handling code) or unintentional. If your\nmocks have different behaviors than the real objects by mistake, you\ncould end up with code that passes the tests but fails in production.\n\nYou can use the _delegating-to-real_ technique to ensure that your\nmock has the same behavior as the real object while retaining the\nability to validate calls. This technique is very similar to the\ndelegating-to-fake technique, the difference being that we use a real\nobject instead of a fake. Here's an example:\n\n```\nusing ::testing::_;\nusing ::testing::AtLeast;\nusing ::testing::Invoke;\n\nclass MockFoo : public Foo {\n public:\n  MockFoo() {\n    // By default, all calls are delegated to the real object.\n    ON_CALL(*this, DoThis())\n        .WillByDefault(Invoke(&real_, &Foo::DoThis));\n    ON_CALL(*this, DoThat(_))\n        .WillByDefault(Invoke(&real_, &Foo::DoThat));\n    ...\n  }\n  MOCK_METHOD0(DoThis, ...);\n  MOCK_METHOD1(DoThat, ...);\n  ...\n private:\n  Foo real_;\n};\n...\n\n  MockFoo mock;\n\n  EXPECT_CALL(mock, DoThis())\n      .Times(3);\n  EXPECT_CALL(mock, DoThat(\"Hi\"))\n      .Times(AtLeast(1));\n  ... use mock in test ...\n```\n\nWith this, Google Mock will verify that your code made the right calls\n(with the right arguments, in the right order, called the right number\nof times, etc), and a real object will answer the calls (so the\nbehavior will be the same as in production). This gives you the best\nof both worlds.\n\n## Delegating Calls to a Parent Class ##\n\nIdeally, you should code to interfaces, whose methods are all pure\nvirtual. In reality, sometimes you do need to mock a virtual method\nthat is not pure (i.e, it already has an implementation). For example:\n\n```\nclass Foo {\n public:\n  virtual ~Foo();\n\n  virtual void Pure(int n) = 0;\n  virtual int Concrete(const char* str) { ... }\n};\n\nclass MockFoo : public Foo {\n public:\n  // Mocking a pure method.\n  MOCK_METHOD1(Pure, void(int n));\n  // Mocking a concrete method.  Foo::Concrete() is shadowed.\n  MOCK_METHOD1(Concrete, int(const char* str));\n};\n```\n\nSometimes you may want to call `Foo::Concrete()` instead of\n`MockFoo::Concrete()`. Perhaps you want to do it as part of a stub\naction, or perhaps your test doesn't need to mock `Concrete()` at all\n(but it would be oh-so painful to have to define a new mock class\nwhenever you don't need to mock one of its methods).\n\nThe trick is to leave a back door in your mock class for accessing the\nreal methods in the base class:\n\n```\nclass MockFoo : public Foo {\n public:\n  // Mocking a pure method.\n  MOCK_METHOD1(Pure, void(int n));\n  // Mocking a concrete method.  Foo::Concrete() is shadowed.\n  MOCK_METHOD1(Concrete, int(const char* str));\n\n  // Use this to call Concrete() defined in Foo.\n  int FooConcrete(const char* str) { return Foo::Concrete(str); }\n};\n```\n\nNow, you can call `Foo::Concrete()` inside an action by:\n\n```\nusing ::testing::_;\nusing ::testing::Invoke;\n...\n  EXPECT_CALL(foo, Concrete(_))\n      .WillOnce(Invoke(&foo, &MockFoo::FooConcrete));\n```\n\nor tell the mock object that you don't want to mock `Concrete()`:\n\n```\nusing ::testing::Invoke;\n...\n  ON_CALL(foo, Concrete(_))\n      .WillByDefault(Invoke(&foo, &MockFoo::FooConcrete));\n```\n\n(Why don't we just write `Invoke(&foo, &Foo::Concrete)`? If you do\nthat, `MockFoo::Concrete()` will be called (and cause an infinite\nrecursion) since `Foo::Concrete()` is virtual. That's just how C++\nworks.)\n\n# Using Matchers #\n\n## Matching Argument Values Exactly ##\n\nYou can specify exactly which arguments a mock method is expecting:\n\n```\nusing ::testing::Return;\n...\n  EXPECT_CALL(foo, DoThis(5))\n      .WillOnce(Return('a'));\n  EXPECT_CALL(foo, DoThat(\"Hello\", bar));\n```\n\n## Using Simple Matchers ##\n\nYou can use matchers to match arguments that have a certain property:\n\n```\nusing ::testing::Ge;\nusing ::testing::NotNull;\nusing ::testing::Return;\n...\n  EXPECT_CALL(foo, DoThis(Ge(5)))  // The argument must be >= 5.\n      .WillOnce(Return('a'));\n  EXPECT_CALL(foo, DoThat(\"Hello\", NotNull()));\n  // The second argument must not be NULL.\n```\n\nA frequently used matcher is `_`, which matches anything:\n\n```\nusing ::testing::_;\nusing ::testing::NotNull;\n...\n  EXPECT_CALL(foo, DoThat(_, NotNull()));\n```\n\n## Combining Matchers ##\n\nYou can build complex matchers from existing ones using `AllOf()`,\n`AnyOf()`, and `Not()`:\n\n```\nusing ::testing::AllOf;\nusing ::testing::Gt;\nusing ::testing::HasSubstr;\nusing ::testing::Ne;\nusing ::testing::Not;\n...\n  // The argument must be > 5 and != 10.\n  EXPECT_CALL(foo, DoThis(AllOf(Gt(5),\n                                Ne(10))));\n\n  // The first argument must not contain sub-string \"blah\".\n  EXPECT_CALL(foo, DoThat(Not(HasSubstr(\"blah\")),\n                          NULL));\n```\n\n## Casting Matchers ##\n\nGoogle Mock matchers are statically typed, meaning that the compiler\ncan catch your mistake if you use a matcher of the wrong type (for\nexample, if you use `Eq(5)` to match a `string` argument). Good for\nyou!\n\nSometimes, however, you know what you're doing and want the compiler\nto give you some slack. One example is that you have a matcher for\n`long` and the argument you want to match is `int`. While the two\ntypes aren't exactly the same, there is nothing really wrong with\nusing a `Matcher<long>` to match an `int` - after all, we can first\nconvert the `int` argument to a `long` before giving it to the\nmatcher.\n\nTo support this need, Google Mock gives you the\n`SafeMatcherCast<T>(m)` function. It casts a matcher `m` to type\n`Matcher<T>`. To ensure safety, Google Mock checks that (let `U` be the\ntype `m` accepts):\n\n  1. Type `T` can be implicitly cast to type `U`;\n  1. When both `T` and `U` are built-in arithmetic types (`bool`, integers, and floating-point numbers), the conversion from `T` to `U` is not lossy (in other words, any value representable by `T` can also be represented by `U`); and\n  1. When `U` is a reference, `T` must also be a reference (as the underlying matcher may be interested in the address of the `U` value).\n\nThe code won't compile if any of these conditions aren't met.\n\nHere's one example:\n\n```\nusing ::testing::SafeMatcherCast;\n\n// A base class and a child class.\nclass Base { ... };\nclass Derived : public Base { ... };\n\nclass MockFoo : public Foo {\n public:\n  MOCK_METHOD1(DoThis, void(Derived* derived));\n};\n...\n\n  MockFoo foo;\n  // m is a Matcher<Base*> we got from somewhere.\n  EXPECT_CALL(foo, DoThis(SafeMatcherCast<Derived*>(m)));\n```\n\nIf you find `SafeMatcherCast<T>(m)` too limiting, you can use a similar\nfunction `MatcherCast<T>(m)`. The difference is that `MatcherCast` works\nas long as you can `static_cast` type `T` to type `U`.\n\n`MatcherCast` essentially lets you bypass C++'s type system\n(`static_cast` isn't always safe as it could throw away information,\nfor example), so be careful not to misuse/abuse it.\n\n## Selecting Between Overloaded Functions ##\n\nIf you expect an overloaded function to be called, the compiler may\nneed some help on which overloaded version it is.\n\nTo disambiguate functions overloaded on the const-ness of this object,\nuse the `Const()` argument wrapper.\n\n```\nusing ::testing::ReturnRef;\n\nclass MockFoo : public Foo {\n  ...\n  MOCK_METHOD0(GetBar, Bar&());\n  MOCK_CONST_METHOD0(GetBar, const Bar&());\n};\n...\n\n  MockFoo foo;\n  Bar bar1, bar2;\n  EXPECT_CALL(foo, GetBar())         // The non-const GetBar().\n      .WillOnce(ReturnRef(bar1));\n  EXPECT_CALL(Const(foo), GetBar())  // The const GetBar().\n      .WillOnce(ReturnRef(bar2));\n```\n\n(`Const()` is defined by Google Mock and returns a `const` reference\nto its argument.)\n\nTo disambiguate overloaded functions with the same number of arguments\nbut different argument types, you may need to specify the exact type\nof a matcher, either by wrapping your matcher in `Matcher<type>()`, or\nusing a matcher whose type is fixed (`TypedEq<type>`, `An<type>()`,\netc):\n\n```\nusing ::testing::An;\nusing ::testing::Lt;\nusing ::testing::Matcher;\nusing ::testing::TypedEq;\n\nclass MockPrinter : public Printer {\n public:\n  MOCK_METHOD1(Print, void(int n));\n  MOCK_METHOD1(Print, void(char c));\n};\n\nTEST(PrinterTest, Print) {\n  MockPrinter printer;\n\n  EXPECT_CALL(printer, Print(An<int>()));            // void Print(int);\n  EXPECT_CALL(printer, Print(Matcher<int>(Lt(5))));  // void Print(int);\n  EXPECT_CALL(printer, Print(TypedEq<char>('a')));   // void Print(char);\n\n  printer.Print(3);\n  printer.Print(6);\n  printer.Print('a');\n}\n```\n\n## Performing Different Actions Based on the Arguments ##\n\nWhen a mock method is called, the _last_ matching expectation that's\nstill active will be selected (think \"newer overrides older\"). So, you\ncan make a method do different things depending on its argument values\nlike this:\n\n```\nusing ::testing::_;\nusing ::testing::Lt;\nusing ::testing::Return;\n...\n  // The default case.\n  EXPECT_CALL(foo, DoThis(_))\n      .WillRepeatedly(Return('b'));\n\n  // The more specific case.\n  EXPECT_CALL(foo, DoThis(Lt(5)))\n      .WillRepeatedly(Return('a'));\n```\n\nNow, if `foo.DoThis()` is called with a value less than 5, `'a'` will\nbe returned; otherwise `'b'` will be returned.\n\n## Matching Multiple Arguments as a Whole ##\n\nSometimes it's not enough to match the arguments individually. For\nexample, we may want to say that the first argument must be less than\nthe second argument. The `With()` clause allows us to match\nall arguments of a mock function as a whole. For example,\n\n```\nusing ::testing::_;\nusing ::testing::Lt;\nusing ::testing::Ne;\n...\n  EXPECT_CALL(foo, InRange(Ne(0), _))\n      .With(Lt());\n```\n\nsays that the first argument of `InRange()` must not be 0, and must be\nless than the second argument.\n\nThe expression inside `With()` must be a matcher of type\n`Matcher< ::testing::tuple<A1, ..., An> >`, where `A1`, ..., `An` are the\ntypes of the function arguments.\n\nYou can also write `AllArgs(m)` instead of `m` inside `.With()`. The\ntwo forms are equivalent, but `.With(AllArgs(Lt()))` is more readable\nthan `.With(Lt())`.\n\nYou can use `Args<k1, ..., kn>(m)` to match the `n` selected arguments\n(as a tuple) against `m`. For example,\n\n```\nusing ::testing::_;\nusing ::testing::AllOf;\nusing ::testing::Args;\nusing ::testing::Lt;\n...\n  EXPECT_CALL(foo, Blah(_, _, _))\n      .With(AllOf(Args<0, 1>(Lt()), Args<1, 2>(Lt())));\n```\n\nsays that `Blah()` will be called with arguments `x`, `y`, and `z` where\n`x < y < z`.\n\nAs a convenience and example, Google Mock provides some matchers for\n2-tuples, including the `Lt()` matcher above. See the [CheatSheet](CheatSheet.md) for\nthe complete list.\n\nNote that if you want to pass the arguments to a predicate of your own\n(e.g. `.With(Args<0, 1>(Truly(&MyPredicate)))`), that predicate MUST be\nwritten to take a `::testing::tuple` as its argument; Google Mock will pass the `n` selected arguments as _one_ single tuple to the predicate.\n\n## Using Matchers as Predicates ##\n\nHave you noticed that a matcher is just a fancy predicate that also\nknows how to describe itself? Many existing algorithms take predicates\nas arguments (e.g. those defined in STL's `<algorithm>` header), and\nit would be a shame if Google Mock matchers are not allowed to\nparticipate.\n\nLuckily, you can use a matcher where a unary predicate functor is\nexpected by wrapping it inside the `Matches()` function. For example,\n\n```\n#include <algorithm>\n#include <vector>\n\nstd::vector<int> v;\n...\n// How many elements in v are >= 10?\nconst int count = count_if(v.begin(), v.end(), Matches(Ge(10)));\n```\n\nSince you can build complex matchers from simpler ones easily using\nGoogle Mock, this gives you a way to conveniently construct composite\npredicates (doing the same using STL's `<functional>` header is just\npainful). For example, here's a predicate that's satisfied by any\nnumber that is >= 0, <= 100, and != 50:\n\n```\nMatches(AllOf(Ge(0), Le(100), Ne(50)))\n```\n\n## Using Matchers in Google Test Assertions ##\n\nSince matchers are basically predicates that also know how to describe\nthemselves, there is a way to take advantage of them in\n[Google Test](../../googletest/) assertions. It's\ncalled `ASSERT_THAT` and `EXPECT_THAT`:\n\n```\n  ASSERT_THAT(value, matcher);  // Asserts that value matches matcher.\n  EXPECT_THAT(value, matcher);  // The non-fatal version.\n```\n\nFor example, in a Google Test test you can write:\n\n```\n#include \"gmock/gmock.h\"\n\nusing ::testing::AllOf;\nusing ::testing::Ge;\nusing ::testing::Le;\nusing ::testing::MatchesRegex;\nusing ::testing::StartsWith;\n...\n\n  EXPECT_THAT(Foo(), StartsWith(\"Hello\"));\n  EXPECT_THAT(Bar(), MatchesRegex(\"Line \\\\d+\"));\n  ASSERT_THAT(Baz(), AllOf(Ge(5), Le(10)));\n```\n\nwhich (as you can probably guess) executes `Foo()`, `Bar()`, and\n`Baz()`, and verifies that:\n\n  * `Foo()` returns a string that starts with `\"Hello\"`.\n  * `Bar()` returns a string that matches regular expression `\"Line \\\\d+\"`.\n  * `Baz()` returns a number in the range [5, 10].\n\nThe nice thing about these macros is that _they read like\nEnglish_. They generate informative messages too. For example, if the\nfirst `EXPECT_THAT()` above fails, the message will be something like:\n\n```\nValue of: Foo()\n  Actual: \"Hi, world!\"\nExpected: starts with \"Hello\"\n```\n\n**Credit:** The idea of `(ASSERT|EXPECT)_THAT` was stolen from the\n[Hamcrest](https://github.com/hamcrest/) project, which adds\n`assertThat()` to JUnit.\n\n## Using Predicates as Matchers ##\n\nGoogle Mock provides a built-in set of matchers. In case you find them\nlacking, you can use an arbitray unary predicate function or functor\nas a matcher - as long as the predicate accepts a value of the type\nyou want. You do this by wrapping the predicate inside the `Truly()`\nfunction, for example:\n\n```\nusing ::testing::Truly;\n\nint IsEven(int n) { return (n % 2) == 0 ? 1 : 0; }\n...\n\n  // Bar() must be called with an even number.\n  EXPECT_CALL(foo, Bar(Truly(IsEven)));\n```\n\nNote that the predicate function / functor doesn't have to return\n`bool`. It works as long as the return value can be used as the\ncondition in statement `if (condition) ...`.\n\n## Matching Arguments that Are Not Copyable ##\n\nWhen you do an `EXPECT_CALL(mock_obj, Foo(bar))`, Google Mock saves\naway a copy of `bar`. When `Foo()` is called later, Google Mock\ncompares the argument to `Foo()` with the saved copy of `bar`. This\nway, you don't need to worry about `bar` being modified or destroyed\nafter the `EXPECT_CALL()` is executed. The same is true when you use\nmatchers like `Eq(bar)`, `Le(bar)`, and so on.\n\nBut what if `bar` cannot be copied (i.e. has no copy constructor)? You\ncould define your own matcher function and use it with `Truly()`, as\nthe previous couple of recipes have shown. Or, you may be able to get\naway from it if you can guarantee that `bar` won't be changed after\nthe `EXPECT_CALL()` is executed. Just tell Google Mock that it should\nsave a reference to `bar`, instead of a copy of it. Here's how:\n\n```\nusing ::testing::Eq;\nusing ::testing::ByRef;\nusing ::testing::Lt;\n...\n  // Expects that Foo()'s argument == bar.\n  EXPECT_CALL(mock_obj, Foo(Eq(ByRef(bar))));\n\n  // Expects that Foo()'s argument < bar.\n  EXPECT_CALL(mock_obj, Foo(Lt(ByRef(bar))));\n```\n\nRemember: if you do this, don't change `bar` after the\n`EXPECT_CALL()`, or the result is undefined.\n\n## Validating a Member of an Object ##\n\nOften a mock function takes a reference to object as an argument. When\nmatching the argument, you may not want to compare the entire object\nagainst a fixed object, as that may be over-specification. Instead,\nyou may need to validate a certain member variable or the result of a\ncertain getter method of the object. You can do this with `Field()`\nand `Property()`. More specifically,\n\n```\nField(&Foo::bar, m)\n```\n\nis a matcher that matches a `Foo` object whose `bar` member variable\nsatisfies matcher `m`.\n\n```\nProperty(&Foo::baz, m)\n```\n\nis a matcher that matches a `Foo` object whose `baz()` method returns\na value that satisfies matcher `m`.\n\nFor example:\n\n| Expression                   | Description                        |\n|:-----------------------------|:-----------------------------------|\n| `Field(&Foo::number, Ge(3))` | Matches `x` where `x.number >= 3`. |\n| `Property(&Foo::name, StartsWith(\"John \"))` | Matches `x` where `x.name()` starts with `\"John \"`. |\n\nNote that in `Property(&Foo::baz, ...)`, method `baz()` must take no\nargument and be declared as `const`.\n\nBTW, `Field()` and `Property()` can also match plain pointers to\nobjects. For instance,\n\n```\nField(&Foo::number, Ge(3))\n```\n\nmatches a plain pointer `p` where `p->number >= 3`. If `p` is `NULL`,\nthe match will always fail regardless of the inner matcher.\n\nWhat if you want to validate more than one members at the same time?\nRemember that there is `AllOf()`.\n\n## Validating the Value Pointed to by a Pointer Argument ##\n\nC++ functions often take pointers as arguments. You can use matchers\nlike `IsNull()`, `NotNull()`, and other comparison matchers to match a\npointer, but what if you want to make sure the value _pointed to_ by\nthe pointer, instead of the pointer itself, has a certain property?\nWell, you can use the `Pointee(m)` matcher.\n\n`Pointee(m)` matches a pointer iff `m` matches the value the pointer\npoints to. For example:\n\n```\nusing ::testing::Ge;\nusing ::testing::Pointee;\n...\n  EXPECT_CALL(foo, Bar(Pointee(Ge(3))));\n```\n\nexpects `foo.Bar()` to be called with a pointer that points to a value\ngreater than or equal to 3.\n\nOne nice thing about `Pointee()` is that it treats a `NULL` pointer as\na match failure, so you can write `Pointee(m)` instead of\n\n```\n  AllOf(NotNull(), Pointee(m))\n```\n\nwithout worrying that a `NULL` pointer will crash your test.\n\nAlso, did we tell you that `Pointee()` works with both raw pointers\n**and** smart pointers (`linked_ptr`, `shared_ptr`, `scoped_ptr`, and\netc)?\n\nWhat if you have a pointer to pointer? You guessed it - you can use\nnested `Pointee()` to probe deeper inside the value. For example,\n`Pointee(Pointee(Lt(3)))` matches a pointer that points to a pointer\nthat points to a number less than 3 (what a mouthful...).\n\n## Testing a Certain Property of an Object ##\n\nSometimes you want to specify that an object argument has a certain\nproperty, but there is no existing matcher that does this. If you want\ngood error messages, you should define a matcher. If you want to do it\nquick and dirty, you could get away with writing an ordinary function.\n\nLet's say you have a mock function that takes an object of type `Foo`,\nwhich has an `int bar()` method and an `int baz()` method, and you\nwant to constrain that the argument's `bar()` value plus its `baz()`\nvalue is a given number. Here's how you can define a matcher to do it:\n\n```\nusing ::testing::MatcherInterface;\nusing ::testing::MatchResultListener;\n\nclass BarPlusBazEqMatcher : public MatcherInterface<const Foo&> {\n public:\n  explicit BarPlusBazEqMatcher(int expected_sum)\n      : expected_sum_(expected_sum) {}\n\n  virtual bool MatchAndExplain(const Foo& foo,\n                               MatchResultListener* listener) const {\n    return (foo.bar() + foo.baz()) == expected_sum_;\n  }\n\n  virtual void DescribeTo(::std::ostream* os) const {\n    *os << \"bar() + baz() equals \" << expected_sum_;\n  }\n\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"bar() + baz() does not equal \" << expected_sum_;\n  }\n private:\n  const int expected_sum_;\n};\n\ninline Matcher<const Foo&> BarPlusBazEq(int expected_sum) {\n  return MakeMatcher(new BarPlusBazEqMatcher(expected_sum));\n}\n\n...\n\n  EXPECT_CALL(..., DoThis(BarPlusBazEq(5)))...;\n```\n\n## Matching Containers ##\n\nSometimes an STL container (e.g. list, vector, map, ...) is passed to\na mock function and you may want to validate it. Since most STL\ncontainers support the `==` operator, you can write\n`Eq(expected_container)` or simply `expected_container` to match a\ncontainer exactly.\n\nSometimes, though, you may want to be more flexible (for example, the\nfirst element must be an exact match, but the second element can be\nany positive number, and so on). Also, containers used in tests often\nhave a small number of elements, and having to define the expected\ncontainer out-of-line is a bit of a hassle.\n\nYou can use the `ElementsAre()` or `UnorderedElementsAre()` matcher in\nsuch cases:\n\n```\nusing ::testing::_;\nusing ::testing::ElementsAre;\nusing ::testing::Gt;\n...\n\n  MOCK_METHOD1(Foo, void(const vector<int>& numbers));\n...\n\n  EXPECT_CALL(mock, Foo(ElementsAre(1, Gt(0), _, 5)));\n```\n\nThe above matcher says that the container must have 4 elements, which\nmust be 1, greater than 0, anything, and 5 respectively.\n\nIf you instead write:\n\n```\nusing ::testing::_;\nusing ::testing::Gt;\nusing ::testing::UnorderedElementsAre;\n...\n\n  MOCK_METHOD1(Foo, void(const vector<int>& numbers));\n...\n\n  EXPECT_CALL(mock, Foo(UnorderedElementsAre(1, Gt(0), _, 5)));\n```\n\nIt means that the container must have 4 elements, which under some\npermutation must be 1, greater than 0, anything, and 5 respectively.\n\n`ElementsAre()` and `UnorderedElementsAre()` are overloaded to take 0\nto 10 arguments. If more are needed, you can place them in a C-style\narray and use `ElementsAreArray()` or `UnorderedElementsAreArray()`\ninstead:\n\n```\nusing ::testing::ElementsAreArray;\n...\n\n  // ElementsAreArray accepts an array of element values.\n  const int expected_vector1[] = { 1, 5, 2, 4, ... };\n  EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector1)));\n\n  // Or, an array of element matchers.\n  Matcher<int> expected_vector2 = { 1, Gt(2), _, 3, ... };\n  EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector2)));\n```\n\nIn case the array needs to be dynamically created (and therefore the\narray size cannot be inferred by the compiler), you can give\n`ElementsAreArray()` an additional argument to specify the array size:\n\n```\nusing ::testing::ElementsAreArray;\n...\n  int* const expected_vector3 = new int[count];\n  ... fill expected_vector3 with values ...\n  EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector3, count)));\n```\n\n**Tips:**\n\n  * `ElementsAre*()` can be used to match _any_ container that implements the STL iterator pattern (i.e. it has a `const_iterator` type and supports `begin()/end()`), not just the ones defined in STL. It will even work with container types yet to be written - as long as they follows the above pattern.\n  * You can use nested `ElementsAre*()` to match nested (multi-dimensional) containers.\n  * If the container is passed by pointer instead of by reference, just write `Pointee(ElementsAre*(...))`.\n  * The order of elements _matters_ for `ElementsAre*()`. Therefore don't use it with containers whose element order is undefined (e.g. `hash_map`).\n\n## Sharing Matchers ##\n\nUnder the hood, a Google Mock matcher object consists of a pointer to\na ref-counted implementation object. Copying matchers is allowed and\nvery efficient, as only the pointer is copied. When the last matcher\nthat references the implementation object dies, the implementation\nobject will be deleted.\n\nTherefore, if you have some complex matcher that you want to use again\nand again, there is no need to build it every time. Just assign it to a\nmatcher variable and use that variable repeatedly! For example,\n\n```\n  Matcher<int> in_range = AllOf(Gt(5), Le(10));\n  ... use in_range as a matcher in multiple EXPECT_CALLs ...\n```\n\n# Setting Expectations #\n\n## Knowing When to Expect ##\n\n`ON_CALL` is likely the single most under-utilized construct in Google Mock.\n\nThere are basically two constructs for defining the behavior of a mock object: `ON_CALL` and `EXPECT_CALL`. The difference? `ON_CALL` defines what happens when a mock method is called, but _doesn't imply any expectation on the method being called._ `EXPECT_CALL` not only defines the behavior, but also sets an expectation that _the method will be called with the given arguments, for the given number of times_ (and _in the given order_ when you specify the order too).\n\nSince `EXPECT_CALL` does more, isn't it better than `ON_CALL`? Not really. Every `EXPECT_CALL` adds a constraint on the behavior of the code under test. Having more constraints than necessary is _baaad_ - even worse than not having enough constraints.\n\nThis may be counter-intuitive. How could tests that verify more be worse than tests that verify less? Isn't verification the whole point of tests?\n\nThe answer, lies in _what_ a test should verify. **A good test verifies the contract of the code.** If a test over-specifies, it doesn't leave enough freedom to the implementation. As a result, changing the implementation without breaking the contract (e.g. refactoring and optimization), which should be perfectly fine to do, can break such tests. Then you have to spend time fixing them, only to see them broken again the next time the implementation is changed.\n\nKeep in mind that one doesn't have to verify more than one property in one test. In fact, **it's a good style to verify only one thing in one test.** If you do that, a bug will likely break only one or two tests instead of dozens (which case would you rather debug?). If you are also in the habit of giving tests descriptive names that tell what they verify, you can often easily guess what's wrong just from the test log itself.\n\nSo use `ON_CALL` by default, and only use `EXPECT_CALL` when you actually intend to verify that the call is made. For example, you may have a bunch of `ON_CALL`s in your test fixture to set the common mock behavior shared by all tests in the same group, and write (scarcely) different `EXPECT_CALL`s in different `TEST_F`s to verify different aspects of the code's behavior. Compared with the style where each `TEST` has many `EXPECT_CALL`s, this leads to tests that are more resilient to implementational changes (and thus less likely to require maintenance) and makes the intent of the tests more obvious (so they are easier to maintain when you do need to maintain them).\n\nIf you are bothered by the \"Uninteresting mock function call\" message printed when a mock method without an `EXPECT_CALL` is called, you may use a `NiceMock` instead to suppress all such messages for the mock object, or suppress the message for specific methods by adding `EXPECT_CALL(...).Times(AnyNumber())`. DO NOT suppress it by blindly adding an `EXPECT_CALL(...)`, or you'll have a test that's a pain to maintain.\n\n## Ignoring Uninteresting Calls ##\n\nIf you are not interested in how a mock method is called, just don't\nsay anything about it. In this case, if the method is ever called,\nGoogle Mock will perform its default action to allow the test program\nto continue. If you are not happy with the default action taken by\nGoogle Mock, you can override it using `DefaultValue<T>::Set()`\n(described later in this document) or `ON_CALL()`.\n\nPlease note that once you expressed interest in a particular mock\nmethod (via `EXPECT_CALL()`), all invocations to it must match some\nexpectation. If this function is called but the arguments don't match\nany `EXPECT_CALL()` statement, it will be an error.\n\n## Disallowing Unexpected Calls ##\n\nIf a mock method shouldn't be called at all, explicitly say so:\n\n```\nusing ::testing::_;\n...\n  EXPECT_CALL(foo, Bar(_))\n      .Times(0);\n```\n\nIf some calls to the method are allowed, but the rest are not, just\nlist all the expected calls:\n\n```\nusing ::testing::AnyNumber;\nusing ::testing::Gt;\n...\n  EXPECT_CALL(foo, Bar(5));\n  EXPECT_CALL(foo, Bar(Gt(10)))\n      .Times(AnyNumber());\n```\n\nA call to `foo.Bar()` that doesn't match any of the `EXPECT_CALL()`\nstatements will be an error.\n\n## Understanding Uninteresting vs Unexpected Calls ##\n\n_Uninteresting_ calls and _unexpected_ calls are different concepts in Google Mock. _Very_ different.\n\nA call `x.Y(...)` is **uninteresting** if there's _not even a single_ `EXPECT_CALL(x, Y(...))` set. In other words, the test isn't interested in the `x.Y()` method at all, as evident in that the test doesn't care to say anything about it.\n\nA call `x.Y(...)` is **unexpected** if there are some `EXPECT_CALL(x, Y(...))s` set, but none of them matches the call. Put another way, the test is interested in the `x.Y()` method (therefore it _explicitly_ sets some `EXPECT_CALL` to verify how it's called); however, the verification fails as the test doesn't expect this particular call to happen.\n\n**An unexpected call is always an error,** as the code under test doesn't behave the way the test expects it to behave.\n\n**By default, an uninteresting call is not an error,** as it violates no constraint specified by the test. (Google Mock's philosophy is that saying nothing means there is no constraint.) However, it leads to a warning, as it _might_ indicate a problem (e.g. the test author might have forgotten to specify a constraint).\n\nIn Google Mock, `NiceMock` and `StrictMock` can be used to make a mock class \"nice\" or \"strict\". How does this affect uninteresting calls and unexpected calls?\n\nA **nice mock** suppresses uninteresting call warnings. It is less chatty than the default mock, but otherwise is the same. If a test fails with a default mock, it will also fail using a nice mock instead. And vice versa. Don't expect making a mock nice to change the test's result.\n\nA **strict mock** turns uninteresting call warnings into errors. So making a mock strict may change the test's result.\n\nLet's look at an example:\n\n```\nTEST(...) {\n  NiceMock<MockDomainRegistry> mock_registry;\n  EXPECT_CALL(mock_registry, GetDomainOwner(\"google.com\"))\n          .WillRepeatedly(Return(\"Larry Page\"));\n\n  // Use mock_registry in code under test.\n  ... &mock_registry ...\n}\n```\n\nThe sole `EXPECT_CALL` here says that all calls to `GetDomainOwner()` must have `\"google.com\"` as the argument. If `GetDomainOwner(\"yahoo.com\")` is called, it will be an unexpected call, and thus an error. Having a nice mock doesn't change the severity of an unexpected call.\n\nSo how do we tell Google Mock that `GetDomainOwner()` can be called with some other arguments as well? The standard technique is to add a \"catch all\" `EXPECT_CALL`:\n\n```\n  EXPECT_CALL(mock_registry, GetDomainOwner(_))\n        .Times(AnyNumber());  // catches all other calls to this method.\n  EXPECT_CALL(mock_registry, GetDomainOwner(\"google.com\"))\n        .WillRepeatedly(Return(\"Larry Page\"));\n```\n\nRemember that `_` is the wildcard matcher that matches anything. With this, if `GetDomainOwner(\"google.com\")` is called, it will do what the second `EXPECT_CALL` says; if it is called with a different argument, it will do what the first `EXPECT_CALL` says.\n\nNote that the order of the two `EXPECT_CALLs` is important, as a newer `EXPECT_CALL` takes precedence over an older one.\n\nFor more on uninteresting calls, nice mocks, and strict mocks, read [\"The Nice, the Strict, and the Naggy\"](#the-nice-the-strict-and-the-naggy).\n\n## Expecting Ordered Calls ##\n\nAlthough an `EXPECT_CALL()` statement defined earlier takes precedence\nwhen Google Mock tries to match a function call with an expectation,\nby default calls don't have to happen in the order `EXPECT_CALL()`\nstatements are written. For example, if the arguments match the\nmatchers in the third `EXPECT_CALL()`, but not those in the first two,\nthen the third expectation will be used.\n\nIf you would rather have all calls occur in the order of the\nexpectations, put the `EXPECT_CALL()` statements in a block where you\ndefine a variable of type `InSequence`:\n\n```\n  using ::testing::_;\n  using ::testing::InSequence;\n\n  {\n    InSequence s;\n\n    EXPECT_CALL(foo, DoThis(5));\n    EXPECT_CALL(bar, DoThat(_))\n        .Times(2);\n    EXPECT_CALL(foo, DoThis(6));\n  }\n```\n\nIn this example, we expect a call to `foo.DoThis(5)`, followed by two\ncalls to `bar.DoThat()` where the argument can be anything, which are\nin turn followed by a call to `foo.DoThis(6)`. If a call occurred\nout-of-order, Google Mock will report an error.\n\n## Expecting Partially Ordered Calls ##\n\nSometimes requiring everything to occur in a predetermined order can\nlead to brittle tests. For example, we may care about `A` occurring\nbefore both `B` and `C`, but aren't interested in the relative order\nof `B` and `C`. In this case, the test should reflect our real intent,\ninstead of being overly constraining.\n\nGoogle Mock allows you to impose an arbitrary DAG (directed acyclic\ngraph) on the calls. One way to express the DAG is to use the\n[After](CheatSheet.md#the-after-clause) clause of `EXPECT_CALL`.\n\nAnother way is via the `InSequence()` clause (not the same as the\n`InSequence` class), which we borrowed from jMock 2. It's less\nflexible than `After()`, but more convenient when you have long chains\nof sequential calls, as it doesn't require you to come up with\ndifferent names for the expectations in the chains.  Here's how it\nworks:\n\nIf we view `EXPECT_CALL()` statements as nodes in a graph, and add an\nedge from node A to node B wherever A must occur before B, we can get\na DAG. We use the term \"sequence\" to mean a directed path in this\nDAG. Now, if we decompose the DAG into sequences, we just need to know\nwhich sequences each `EXPECT_CALL()` belongs to in order to be able to\nreconstruct the original DAG.\n\nSo, to specify the partial order on the expectations we need to do two\nthings: first to define some `Sequence` objects, and then for each\n`EXPECT_CALL()` say which `Sequence` objects it is part\nof. Expectations in the same sequence must occur in the order they are\nwritten. For example,\n\n```\n  using ::testing::Sequence;\n\n  Sequence s1, s2;\n\n  EXPECT_CALL(foo, A())\n      .InSequence(s1, s2);\n  EXPECT_CALL(bar, B())\n      .InSequence(s1);\n  EXPECT_CALL(bar, C())\n      .InSequence(s2);\n  EXPECT_CALL(foo, D())\n      .InSequence(s2);\n```\n\nspecifies the following DAG (where `s1` is `A -> B`, and `s2` is `A ->\nC -> D`):\n\n```\n       +---> B\n       |\n  A ---|\n       |\n       +---> C ---> D\n```\n\nThis means that A must occur before B and C, and C must occur before\nD. There's no restriction about the order other than these.\n\n## Controlling When an Expectation Retires ##\n\nWhen a mock method is called, Google Mock only consider expectations\nthat are still active. An expectation is active when created, and\nbecomes inactive (aka _retires_) when a call that has to occur later\nhas occurred. For example, in\n\n```\n  using ::testing::_;\n  using ::testing::Sequence;\n\n  Sequence s1, s2;\n\n  EXPECT_CALL(log, Log(WARNING, _, \"File too large.\"))     // #1\n      .Times(AnyNumber())\n      .InSequence(s1, s2);\n  EXPECT_CALL(log, Log(WARNING, _, \"Data set is empty.\"))  // #2\n      .InSequence(s1);\n  EXPECT_CALL(log, Log(WARNING, _, \"User not found.\"))     // #3\n      .InSequence(s2);\n```\n\nas soon as either #2 or #3 is matched, #1 will retire. If a warning\n`\"File too large.\"` is logged after this, it will be an error.\n\nNote that an expectation doesn't retire automatically when it's\nsaturated. For example,\n\n```\nusing ::testing::_;\n...\n  EXPECT_CALL(log, Log(WARNING, _, _));                  // #1\n  EXPECT_CALL(log, Log(WARNING, _, \"File too large.\"));  // #2\n```\n\nsays that there will be exactly one warning with the message `\"File\ntoo large.\"`. If the second warning contains this message too, #2 will\nmatch again and result in an upper-bound-violated error.\n\nIf this is not what you want, you can ask an expectation to retire as\nsoon as it becomes saturated:\n\n```\nusing ::testing::_;\n...\n  EXPECT_CALL(log, Log(WARNING, _, _));                 // #1\n  EXPECT_CALL(log, Log(WARNING, _, \"File too large.\"))  // #2\n      .RetiresOnSaturation();\n```\n\nHere #2 can be used only once, so if you have two warnings with the\nmessage `\"File too large.\"`, the first will match #2 and the second\nwill match #1 - there will be no error.\n\n# Using Actions #\n\n## Returning References from Mock Methods ##\n\nIf a mock function's return type is a reference, you need to use\n`ReturnRef()` instead of `Return()` to return a result:\n\n```\nusing ::testing::ReturnRef;\n\nclass MockFoo : public Foo {\n public:\n  MOCK_METHOD0(GetBar, Bar&());\n};\n...\n\n  MockFoo foo;\n  Bar bar;\n  EXPECT_CALL(foo, GetBar())\n      .WillOnce(ReturnRef(bar));\n```\n\n## Returning Live Values from Mock Methods ##\n\nThe `Return(x)` action saves a copy of `x` when the action is\n_created_, and always returns the same value whenever it's\nexecuted. Sometimes you may want to instead return the _live_ value of\n`x` (i.e. its value at the time when the action is _executed_.).\n\nIf the mock function's return type is a reference, you can do it using\n`ReturnRef(x)`, as shown in the previous recipe (\"Returning References\nfrom Mock Methods\"). However, Google Mock doesn't let you use\n`ReturnRef()` in a mock function whose return type is not a reference,\nas doing that usually indicates a user error. So, what shall you do?\n\nYou may be tempted to try `ByRef()`:\n\n```\nusing testing::ByRef;\nusing testing::Return;\n\nclass MockFoo : public Foo {\n public:\n  MOCK_METHOD0(GetValue, int());\n};\n...\n  int x = 0;\n  MockFoo foo;\n  EXPECT_CALL(foo, GetValue())\n      .WillRepeatedly(Return(ByRef(x)));\n  x = 42;\n  EXPECT_EQ(42, foo.GetValue());\n```\n\nUnfortunately, it doesn't work here. The above code will fail with error:\n\n```\nValue of: foo.GetValue()\n  Actual: 0\nExpected: 42\n```\n\nThe reason is that `Return(value)` converts `value` to the actual\nreturn type of the mock function at the time when the action is\n_created_, not when it is _executed_. (This behavior was chosen for\nthe action to be safe when `value` is a proxy object that references\nsome temporary objects.) As a result, `ByRef(x)` is converted to an\n`int` value (instead of a `const int&`) when the expectation is set,\nand `Return(ByRef(x))` will always return 0.\n\n`ReturnPointee(pointer)` was provided to solve this problem\nspecifically. It returns the value pointed to by `pointer` at the time\nthe action is _executed_:\n\n```\nusing testing::ReturnPointee;\n...\n  int x = 0;\n  MockFoo foo;\n  EXPECT_CALL(foo, GetValue())\n      .WillRepeatedly(ReturnPointee(&x));  // Note the & here.\n  x = 42;\n  EXPECT_EQ(42, foo.GetValue());  // This will succeed now.\n```\n\n## Combining Actions ##\n\nWant to do more than one thing when a function is called? That's\nfine. `DoAll()` allow you to do sequence of actions every time. Only\nthe return value of the last action in the sequence will be used.\n\n```\nusing ::testing::DoAll;\n\nclass MockFoo : public Foo {\n public:\n  MOCK_METHOD1(Bar, bool(int n));\n};\n...\n\n  EXPECT_CALL(foo, Bar(_))\n      .WillOnce(DoAll(action_1,\n                      action_2,\n                      ...\n                      action_n));\n```\n\n## Mocking Side Effects ##\n\nSometimes a method exhibits its effect not via returning a value but\nvia side effects. For example, it may change some global state or\nmodify an output argument. To mock side effects, in general you can\ndefine your own action by implementing `::testing::ActionInterface`.\n\nIf all you need to do is to change an output argument, the built-in\n`SetArgPointee()` action is convenient:\n\n```\nusing ::testing::SetArgPointee;\n\nclass MockMutator : public Mutator {\n public:\n  MOCK_METHOD2(Mutate, void(bool mutate, int* value));\n  ...\n};\n...\n\n  MockMutator mutator;\n  EXPECT_CALL(mutator, Mutate(true, _))\n      .WillOnce(SetArgPointee<1>(5));\n```\n\nIn this example, when `mutator.Mutate()` is called, we will assign 5\nto the `int` variable pointed to by argument #1\n(0-based).\n\n`SetArgPointee()` conveniently makes an internal copy of the\nvalue you pass to it, removing the need to keep the value in scope and\nalive. The implication however is that the value must have a copy\nconstructor and assignment operator.\n\nIf the mock method also needs to return a value as well, you can chain\n`SetArgPointee()` with `Return()` using `DoAll()`:\n\n```\nusing ::testing::_;\nusing ::testing::Return;\nusing ::testing::SetArgPointee;\n\nclass MockMutator : public Mutator {\n public:\n  ...\n  MOCK_METHOD1(MutateInt, bool(int* value));\n};\n...\n\n  MockMutator mutator;\n  EXPECT_CALL(mutator, MutateInt(_))\n      .WillOnce(DoAll(SetArgPointee<0>(5),\n                      Return(true)));\n```\n\nIf the output argument is an array, use the\n`SetArrayArgument<N>(first, last)` action instead. It copies the\nelements in source range `[first, last)` to the array pointed to by\nthe `N`-th (0-based) argument:\n\n```\nusing ::testing::NotNull;\nusing ::testing::SetArrayArgument;\n\nclass MockArrayMutator : public ArrayMutator {\n public:\n  MOCK_METHOD2(Mutate, void(int* values, int num_values));\n  ...\n};\n...\n\n  MockArrayMutator mutator;\n  int values[5] = { 1, 2, 3, 4, 5 };\n  EXPECT_CALL(mutator, Mutate(NotNull(), 5))\n      .WillOnce(SetArrayArgument<0>(values, values + 5));\n```\n\nThis also works when the argument is an output iterator:\n\n```\nusing ::testing::_;\nusing ::testing::SetArrayArgument;\n\nclass MockRolodex : public Rolodex {\n public:\n  MOCK_METHOD1(GetNames, void(std::back_insert_iterator<vector<string> >));\n  ...\n};\n...\n\n  MockRolodex rolodex;\n  vector<string> names;\n  names.push_back(\"George\");\n  names.push_back(\"John\");\n  names.push_back(\"Thomas\");\n  EXPECT_CALL(rolodex, GetNames(_))\n      .WillOnce(SetArrayArgument<0>(names.begin(), names.end()));\n```\n\n## Changing a Mock Object's Behavior Based on the State ##\n\nIf you expect a call to change the behavior of a mock object, you can use `::testing::InSequence` to specify different behaviors before and after the call:\n\n```\nusing ::testing::InSequence;\nusing ::testing::Return;\n\n...\n  {\n    InSequence seq;\n    EXPECT_CALL(my_mock, IsDirty())\n        .WillRepeatedly(Return(true));\n    EXPECT_CALL(my_mock, Flush());\n    EXPECT_CALL(my_mock, IsDirty())\n        .WillRepeatedly(Return(false));\n  }\n  my_mock.FlushIfDirty();\n```\n\nThis makes `my_mock.IsDirty()` return `true` before `my_mock.Flush()` is called and return `false` afterwards.\n\nIf the behavior change is more complex, you can store the effects in a variable and make a mock method get its return value from that variable:\n\n```\nusing ::testing::_;\nusing ::testing::SaveArg;\nusing ::testing::Return;\n\nACTION_P(ReturnPointee, p) { return *p; }\n...\n  int previous_value = 0;\n  EXPECT_CALL(my_mock, GetPrevValue())\n      .WillRepeatedly(ReturnPointee(&previous_value));\n  EXPECT_CALL(my_mock, UpdateValue(_))\n      .WillRepeatedly(SaveArg<0>(&previous_value));\n  my_mock.DoSomethingToUpdateValue();\n```\n\nHere `my_mock.GetPrevValue()` will always return the argument of the last `UpdateValue()` call.\n\n## Setting the Default Value for a Return Type ##\n\nIf a mock method's return type is a built-in C++ type or pointer, by\ndefault it will return 0 when invoked. Also, in C++ 11 and above, a mock\nmethod whose return type has a default constructor will return a default-constructed\nvalue by default.  You only need to specify an\naction if this default value doesn't work for you.\n\nSometimes, you may want to change this default value, or you may want\nto specify a default value for types Google Mock doesn't know\nabout. You can do this using the `::testing::DefaultValue` class\ntemplate:\n\n```\nclass MockFoo : public Foo {\n public:\n  MOCK_METHOD0(CalculateBar, Bar());\n};\n...\n\n  Bar default_bar;\n  // Sets the default return value for type Bar.\n  DefaultValue<Bar>::Set(default_bar);\n\n  MockFoo foo;\n\n  // We don't need to specify an action here, as the default\n  // return value works for us.\n  EXPECT_CALL(foo, CalculateBar());\n\n  foo.CalculateBar();  // This should return default_bar.\n\n  // Unsets the default return value.\n  DefaultValue<Bar>::Clear();\n```\n\nPlease note that changing the default value for a type can make you\ntests hard to understand. We recommend you to use this feature\njudiciously. For example, you may want to make sure the `Set()` and\n`Clear()` calls are right next to the code that uses your mock.\n\n## Setting the Default Actions for a Mock Method ##\n\nYou've learned how to change the default value of a given\ntype. However, this may be too coarse for your purpose: perhaps you\nhave two mock methods with the same return type and you want them to\nhave different behaviors. The `ON_CALL()` macro allows you to\ncustomize your mock's behavior at the method level:\n\n```\nusing ::testing::_;\nusing ::testing::AnyNumber;\nusing ::testing::Gt;\nusing ::testing::Return;\n...\n  ON_CALL(foo, Sign(_))\n      .WillByDefault(Return(-1));\n  ON_CALL(foo, Sign(0))\n      .WillByDefault(Return(0));\n  ON_CALL(foo, Sign(Gt(0)))\n      .WillByDefault(Return(1));\n\n  EXPECT_CALL(foo, Sign(_))\n      .Times(AnyNumber());\n\n  foo.Sign(5);   // This should return 1.\n  foo.Sign(-9);  // This should return -1.\n  foo.Sign(0);   // This should return 0.\n```\n\nAs you may have guessed, when there are more than one `ON_CALL()`\nstatements, the news order take precedence over the older ones. In\nother words, the **last** one that matches the function arguments will\nbe used. This matching order allows you to set up the common behavior\nin a mock object's constructor or the test fixture's set-up phase and\nspecialize the mock's behavior later.\n\n## Using Functions/Methods/Functors as Actions ##\n\nIf the built-in actions don't suit you, you can easily use an existing\nfunction, method, or functor as an action:\n\n```\nusing ::testing::_;\nusing ::testing::Invoke;\n\nclass MockFoo : public Foo {\n public:\n  MOCK_METHOD2(Sum, int(int x, int y));\n  MOCK_METHOD1(ComplexJob, bool(int x));\n};\n\nint CalculateSum(int x, int y) { return x + y; }\n\nclass Helper {\n public:\n  bool ComplexJob(int x);\n};\n...\n\n  MockFoo foo;\n  Helper helper;\n  EXPECT_CALL(foo, Sum(_, _))\n      .WillOnce(Invoke(CalculateSum));\n  EXPECT_CALL(foo, ComplexJob(_))\n      .WillOnce(Invoke(&helper, &Helper::ComplexJob));\n\n  foo.Sum(5, 6);       // Invokes CalculateSum(5, 6).\n  foo.ComplexJob(10);  // Invokes helper.ComplexJob(10);\n```\n\nThe only requirement is that the type of the function, etc must be\n_compatible_ with the signature of the mock function, meaning that the\nlatter's arguments can be implicitly converted to the corresponding\narguments of the former, and the former's return type can be\nimplicitly converted to that of the latter. So, you can invoke\nsomething whose type is _not_ exactly the same as the mock function,\nas long as it's safe to do so - nice, huh?\n\n## Invoking a Function/Method/Functor Without Arguments ##\n\n`Invoke()` is very useful for doing actions that are more complex. It\npasses the mock function's arguments to the function or functor being\ninvoked such that the callee has the full context of the call to work\nwith. If the invoked function is not interested in some or all of the\narguments, it can simply ignore them.\n\nYet, a common pattern is that a test author wants to invoke a function\nwithout the arguments of the mock function. `Invoke()` allows her to\ndo that using a wrapper function that throws away the arguments before\ninvoking an underlining nullary function. Needless to say, this can be\ntedious and obscures the intent of the test.\n\n`InvokeWithoutArgs()` solves this problem. It's like `Invoke()` except\nthat it doesn't pass the mock function's arguments to the\ncallee. Here's an example:\n\n```\nusing ::testing::_;\nusing ::testing::InvokeWithoutArgs;\n\nclass MockFoo : public Foo {\n public:\n  MOCK_METHOD1(ComplexJob, bool(int n));\n};\n\nbool Job1() { ... }\n...\n\n  MockFoo foo;\n  EXPECT_CALL(foo, ComplexJob(_))\n      .WillOnce(InvokeWithoutArgs(Job1));\n\n  foo.ComplexJob(10);  // Invokes Job1().\n```\n\n## Invoking an Argument of the Mock Function ##\n\nSometimes a mock function will receive a function pointer or a functor\n(in other words, a \"callable\") as an argument, e.g.\n\n```\nclass MockFoo : public Foo {\n public:\n  MOCK_METHOD2(DoThis, bool(int n, bool (*fp)(int)));\n};\n```\n\nand you may want to invoke this callable argument:\n\n```\nusing ::testing::_;\n...\n  MockFoo foo;\n  EXPECT_CALL(foo, DoThis(_, _))\n      .WillOnce(...);\n  // Will execute (*fp)(5), where fp is the\n  // second argument DoThis() receives.\n```\n\nArghh, you need to refer to a mock function argument but your version\nof C++ has no lambdas, so you have to define your own action. :-(\nOr do you really?\n\nWell, Google Mock has an action to solve _exactly_ this problem:\n\n```\n  InvokeArgument<N>(arg_1, arg_2, ..., arg_m)\n```\n\nwill invoke the `N`-th (0-based) argument the mock function receives,\nwith `arg_1`, `arg_2`, ..., and `arg_m`. No matter if the argument is\na function pointer or a functor, Google Mock handles them both.\n\nWith that, you could write:\n\n```\nusing ::testing::_;\nusing ::testing::InvokeArgument;\n...\n  EXPECT_CALL(foo, DoThis(_, _))\n      .WillOnce(InvokeArgument<1>(5));\n  // Will execute (*fp)(5), where fp is the\n  // second argument DoThis() receives.\n```\n\nWhat if the callable takes an argument by reference? No problem - just\nwrap it inside `ByRef()`:\n\n```\n...\n  MOCK_METHOD1(Bar, bool(bool (*fp)(int, const Helper&)));\n...\nusing ::testing::_;\nusing ::testing::ByRef;\nusing ::testing::InvokeArgument;\n...\n\n  MockFoo foo;\n  Helper helper;\n  ...\n  EXPECT_CALL(foo, Bar(_))\n      .WillOnce(InvokeArgument<0>(5, ByRef(helper)));\n  // ByRef(helper) guarantees that a reference to helper, not a copy of it,\n  // will be passed to the callable.\n```\n\nWhat if the callable takes an argument by reference and we do **not**\nwrap the argument in `ByRef()`? Then `InvokeArgument()` will _make a\ncopy_ of the argument, and pass a _reference to the copy_, instead of\na reference to the original value, to the callable. This is especially\nhandy when the argument is a temporary value:\n\n```\n...\n  MOCK_METHOD1(DoThat, bool(bool (*f)(const double& x, const string& s)));\n...\nusing ::testing::_;\nusing ::testing::InvokeArgument;\n...\n\n  MockFoo foo;\n  ...\n  EXPECT_CALL(foo, DoThat(_))\n      .WillOnce(InvokeArgument<0>(5.0, string(\"Hi\")));\n  // Will execute (*f)(5.0, string(\"Hi\")), where f is the function pointer\n  // DoThat() receives.  Note that the values 5.0 and string(\"Hi\") are\n  // temporary and dead once the EXPECT_CALL() statement finishes.  Yet\n  // it's fine to perform this action later, since a copy of the values\n  // are kept inside the InvokeArgument action.\n```\n\n## Ignoring an Action's Result ##\n\nSometimes you have an action that returns _something_, but you need an\naction that returns `void` (perhaps you want to use it in a mock\nfunction that returns `void`, or perhaps it needs to be used in\n`DoAll()` and it's not the last in the list). `IgnoreResult()` lets\nyou do that. For example:\n\n```\nusing ::testing::_;\nusing ::testing::Invoke;\nusing ::testing::Return;\n\nint Process(const MyData& data);\nstring DoSomething();\n\nclass MockFoo : public Foo {\n public:\n  MOCK_METHOD1(Abc, void(const MyData& data));\n  MOCK_METHOD0(Xyz, bool());\n};\n...\n\n  MockFoo foo;\n  EXPECT_CALL(foo, Abc(_))\n  // .WillOnce(Invoke(Process));\n  // The above line won't compile as Process() returns int but Abc() needs\n  // to return void.\n      .WillOnce(IgnoreResult(Invoke(Process)));\n\n  EXPECT_CALL(foo, Xyz())\n      .WillOnce(DoAll(IgnoreResult(Invoke(DoSomething)),\n      // Ignores the string DoSomething() returns.\n                      Return(true)));\n```\n\nNote that you **cannot** use `IgnoreResult()` on an action that already\nreturns `void`. Doing so will lead to ugly compiler errors.\n\n## Selecting an Action's Arguments ##\n\nSay you have a mock function `Foo()` that takes seven arguments, and\nyou have a custom action that you want to invoke when `Foo()` is\ncalled. Trouble is, the custom action only wants three arguments:\n\n```\nusing ::testing::_;\nusing ::testing::Invoke;\n...\n  MOCK_METHOD7(Foo, bool(bool visible, const string& name, int x, int y,\n                         const map<pair<int, int>, double>& weight,\n                         double min_weight, double max_wight));\n...\n\nbool IsVisibleInQuadrant1(bool visible, int x, int y) {\n  return visible && x >= 0 && y >= 0;\n}\n...\n\n  EXPECT_CALL(mock, Foo(_, _, _, _, _, _, _))\n      .WillOnce(Invoke(IsVisibleInQuadrant1));  // Uh, won't compile. :-(\n```\n\nTo please the compiler God, you can to define an \"adaptor\" that has\nthe same signature as `Foo()` and calls the custom action with the\nright arguments:\n\n```\nusing ::testing::_;\nusing ::testing::Invoke;\n\nbool MyIsVisibleInQuadrant1(bool visible, const string& name, int x, int y,\n                            const map<pair<int, int>, double>& weight,\n                            double min_weight, double max_wight) {\n  return IsVisibleInQuadrant1(visible, x, y);\n}\n...\n\n  EXPECT_CALL(mock, Foo(_, _, _, _, _, _, _))\n      .WillOnce(Invoke(MyIsVisibleInQuadrant1));  // Now it works.\n```\n\nBut isn't this awkward?\n\nGoogle Mock provides a generic _action adaptor_, so you can spend your\ntime minding more important business than writing your own\nadaptors. Here's the syntax:\n\n```\n  WithArgs<N1, N2, ..., Nk>(action)\n```\n\ncreates an action that passes the arguments of the mock function at\nthe given indices (0-based) to the inner `action` and performs\nit. Using `WithArgs`, our original example can be written as:\n\n```\nusing ::testing::_;\nusing ::testing::Invoke;\nusing ::testing::WithArgs;\n...\n  EXPECT_CALL(mock, Foo(_, _, _, _, _, _, _))\n      .WillOnce(WithArgs<0, 2, 3>(Invoke(IsVisibleInQuadrant1)));\n      // No need to define your own adaptor.\n```\n\nFor better readability, Google Mock also gives you:\n\n  * `WithoutArgs(action)` when the inner `action` takes _no_ argument, and\n  * `WithArg<N>(action)` (no `s` after `Arg`) when the inner `action` takes _one_ argument.\n\nAs you may have realized, `InvokeWithoutArgs(...)` is just syntactic\nsugar for `WithoutArgs(Invoke(...))`.\n\nHere are more tips:\n\n  * The inner action used in `WithArgs` and friends does not have to be `Invoke()` -- it can be anything.\n  * You can repeat an argument in the argument list if necessary, e.g. `WithArgs<2, 3, 3, 5>(...)`.\n  * You can change the order of the arguments, e.g. `WithArgs<3, 2, 1>(...)`.\n  * The types of the selected arguments do _not_ have to match the signature of the inner action exactly. It works as long as they can be implicitly converted to the corresponding arguments of the inner action. For example, if the 4-th argument of the mock function is an `int` and `my_action` takes a `double`, `WithArg<4>(my_action)` will work.\n\n## Ignoring Arguments in Action Functions ##\n\nThe selecting-an-action's-arguments recipe showed us one way to make a\nmock function and an action with incompatible argument lists fit\ntogether. The downside is that wrapping the action in\n`WithArgs<...>()` can get tedious for people writing the tests.\n\nIf you are defining a function, method, or functor to be used with\n`Invoke*()`, and you are not interested in some of its arguments, an\nalternative to `WithArgs` is to declare the uninteresting arguments as\n`Unused`. This makes the definition less cluttered and less fragile in\ncase the types of the uninteresting arguments change. It could also\nincrease the chance the action function can be reused. For example,\ngiven\n\n```\n  MOCK_METHOD3(Foo, double(const string& label, double x, double y));\n  MOCK_METHOD3(Bar, double(int index, double x, double y));\n```\n\ninstead of\n\n```\nusing ::testing::_;\nusing ::testing::Invoke;\n\ndouble DistanceToOriginWithLabel(const string& label, double x, double y) {\n  return sqrt(x*x + y*y);\n}\n\ndouble DistanceToOriginWithIndex(int index, double x, double y) {\n  return sqrt(x*x + y*y);\n}\n...\n\n  EXEPCT_CALL(mock, Foo(\"abc\", _, _))\n      .WillOnce(Invoke(DistanceToOriginWithLabel));\n  EXEPCT_CALL(mock, Bar(5, _, _))\n      .WillOnce(Invoke(DistanceToOriginWithIndex));\n```\n\nyou could write\n\n```\nusing ::testing::_;\nusing ::testing::Invoke;\nusing ::testing::Unused;\n\ndouble DistanceToOrigin(Unused, double x, double y) {\n  return sqrt(x*x + y*y);\n}\n...\n\n  EXEPCT_CALL(mock, Foo(\"abc\", _, _))\n      .WillOnce(Invoke(DistanceToOrigin));\n  EXEPCT_CALL(mock, Bar(5, _, _))\n      .WillOnce(Invoke(DistanceToOrigin));\n```\n\n## Sharing Actions ##\n\nJust like matchers, a Google Mock action object consists of a pointer\nto a ref-counted implementation object. Therefore copying actions is\nalso allowed and very efficient. When the last action that references\nthe implementation object dies, the implementation object will be\ndeleted.\n\nIf you have some complex action that you want to use again and again,\nyou may not have to build it from scratch every time. If the action\ndoesn't have an internal state (i.e. if it always does the same thing\nno matter how many times it has been called), you can assign it to an\naction variable and use that variable repeatedly. For example:\n\n```\n  Action<bool(int*)> set_flag = DoAll(SetArgPointee<0>(5),\n                                      Return(true));\n  ... use set_flag in .WillOnce() and .WillRepeatedly() ...\n```\n\nHowever, if the action has its own state, you may be surprised if you\nshare the action object. Suppose you have an action factory\n`IncrementCounter(init)` which creates an action that increments and\nreturns a counter whose initial value is `init`, using two actions\ncreated from the same expression and using a shared action will\nexihibit different behaviors. Example:\n\n```\n  EXPECT_CALL(foo, DoThis())\n      .WillRepeatedly(IncrementCounter(0));\n  EXPECT_CALL(foo, DoThat())\n      .WillRepeatedly(IncrementCounter(0));\n  foo.DoThis();  // Returns 1.\n  foo.DoThis();  // Returns 2.\n  foo.DoThat();  // Returns 1 - Blah() uses a different\n                 // counter than Bar()'s.\n```\n\nversus\n\n```\n  Action<int()> increment = IncrementCounter(0);\n\n  EXPECT_CALL(foo, DoThis())\n      .WillRepeatedly(increment);\n  EXPECT_CALL(foo, DoThat())\n      .WillRepeatedly(increment);\n  foo.DoThis();  // Returns 1.\n  foo.DoThis();  // Returns 2.\n  foo.DoThat();  // Returns 3 - the counter is shared.\n```\n\n# Misc Recipes on Using Google Mock #\n\n## Mocking Methods That Use Move-Only Types ##\n\nC++11 introduced *move-only types*. A move-only-typed value can be moved from\none object to another, but cannot be copied. `std::unique_ptr<T>` is\nprobably the most commonly used move-only type.\n\nMocking a method that takes and/or returns move-only types presents some\nchallenges, but nothing insurmountable. This recipe shows you how you can do it.\nNote that the support for move-only method arguments was only introduced to\ngMock in April 2017; in older code, you may find more complex\n[workarounds](#LegacyMoveOnly) for lack of this feature.\n\nLet’s say we are working on a fictional project that lets one post and share\nsnippets called “buzzes”. Your code uses these types:\n\n```cpp\nenum class AccessLevel { kInternal, kPublic };\n\nclass Buzz {\n public:\n  explicit Buzz(AccessLevel access) { ... }\n  ...\n};\n\nclass Buzzer {\n public:\n  virtual ~Buzzer() {}\n  virtual std::unique_ptr<Buzz> MakeBuzz(StringPiece text) = 0;\n  virtual bool ShareBuzz(std::unique_ptr<Buzz> buzz, int64_t timestamp) = 0;\n  ...\n};\n```\n\nA `Buzz` object represents a snippet being posted. A class that implements the\n`Buzzer` interface is capable of creating and sharing `Buzz`es. Methods in\n`Buzzer` may return a `unique_ptr<Buzz>` or take a\n`unique_ptr<Buzz>`. Now we need to mock `Buzzer` in our tests.\n\nTo mock a method that accepts or returns move-only types, you just use the\nfamiliar `MOCK_METHOD` syntax as usual:\n\n```cpp\nclass MockBuzzer : public Buzzer {\n public:\n  MOCK_METHOD1(MakeBuzz, std::unique_ptr<Buzz>(StringPiece text));\n  MOCK_METHOD2(ShareBuzz, bool(std::unique_ptr<Buzz> buzz, int64_t timestamp));\n};\n```\n\nNow that we have the mock class defined, we can use it in tests. In the\nfollowing code examples, we assume that we have defined a `MockBuzzer` object\nnamed `mock_buzzer_`:\n\n```cpp\n  MockBuzzer mock_buzzer_;\n```\n\nFirst let’s see how we can set expectations on the `MakeBuzz()` method, which\nreturns a `unique_ptr<Buzz>`.\n\nAs usual, if you set an expectation without an action (i.e. the `.WillOnce()` or\n`.WillRepeated()` clause), when that expectation fires, the default action for\nthat method will be taken. Since `unique_ptr<>` has a default constructor\nthat returns a null `unique_ptr`, that’s what you’ll get if you don’t specify an\naction:\n\n```cpp\n  // Use the default action.\n  EXPECT_CALL(mock_buzzer_, MakeBuzz(\"hello\"));\n\n  // Triggers the previous EXPECT_CALL.\n  EXPECT_EQ(nullptr, mock_buzzer_.MakeBuzz(\"hello\"));\n```\n\nIf you are not happy with the default action, you can tweak it as usual; see\n[Setting Default Actions](#OnCall).\n\nIf you just need to return a pre-defined move-only value, you can use the\n`Return(ByMove(...))` action:\n\n```cpp\n  // When this fires, the unique_ptr<> specified by ByMove(...) will\n  // be returned.\n  EXPECT_CALL(mock_buzzer_, MakeBuzz(\"world\"))\n      .WillOnce(Return(ByMove(MakeUnique<Buzz>(AccessLevel::kInternal))));\n\n  EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz(\"world\"));\n```\n\nNote that `ByMove()` is essential here - if you drop it, the code won’t compile.\n\nQuiz time! What do you think will happen if a `Return(ByMove(...))` action is\nperformed more than once (e.g. you write\n`.WillRepeatedly(Return(ByMove(...)));`)? Come think of it, after the first\ntime the action runs, the source value will be consumed (since it’s a move-only\nvalue), so the next time around, there’s no value to move from -- you’ll get a\nrun-time error that `Return(ByMove(...))` can only be run once.\n\nIf you need your mock method to do more than just moving a pre-defined value,\nremember that you can always use a lambda or a callable object, which can do\npretty much anything you want:\n\n```cpp\n  EXPECT_CALL(mock_buzzer_, MakeBuzz(\"x\"))\n      .WillRepeatedly([](StringPiece text) {\n        return MakeUnique<Buzz>(AccessLevel::kInternal);\n      });\n\n  EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz(\"x\"));\n  EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz(\"x\"));\n```\n\nEvery time this `EXPECT_CALL` fires, a new `unique_ptr<Buzz>` will be\ncreated and returned. You cannot do this with `Return(ByMove(...))`.\n\nThat covers returning move-only values; but how do we work with methods\naccepting move-only arguments? The answer is that they work normally, although\nsome actions will not compile when any of method's arguments are move-only. You\ncan always use `Return`, or a [lambda or functor](#FunctionsAsActions):\n\n```cpp\n  using ::testing::Unused;\n\n  EXPECT_CALL(mock_buzzer_, ShareBuzz(NotNull(), _)) .WillOnce(Return(true));\n  EXPECT_TRUE(mock_buzzer_.ShareBuzz(MakeUnique<Buzz>(AccessLevel::kInternal)),\n              0);\n\n  EXPECT_CALL(mock_buzzer_, ShareBuzz(_, _)) .WillOnce(\n      [](std::unique_ptr<Buzz> buzz, Unused) { return buzz != nullptr; });\n  EXPECT_FALSE(mock_buzzer_.ShareBuzz(nullptr, 0));\n```\n\nMany built-in actions (`WithArgs`, `WithoutArgs`,`DeleteArg`, `SaveArg`, ...)\ncould in principle support move-only arguments, but the support for this is not\nimplemented yet. If this is blocking you, please file a bug.\n\nA few actions (e.g. `DoAll`) copy their arguments internally, so they can never\nwork with non-copyable objects; you'll have to use functors instead.\n\n##### Legacy workarounds for move-only types {#LegacyMoveOnly}\n\nSupport for move-only function arguments was only introduced to gMock in April\n2017. In older code, you may encounter the following workaround for the lack of\nthis feature (it is no longer necessary - we're including it just for\nreference):\n\n```cpp\nclass MockBuzzer : public Buzzer {\n public:\n  MOCK_METHOD2(DoShareBuzz, bool(Buzz* buzz, Time timestamp));\n  bool ShareBuzz(std::unique_ptr<Buzz> buzz, Time timestamp) override {\n    return DoShareBuzz(buzz.get(), timestamp);\n  }\n};\n```\n\nThe trick is to delegate the `ShareBuzz()` method to a mock method (let’s call\nit `DoShareBuzz()`) that does not take move-only parameters. Then, instead of\nsetting expectations on `ShareBuzz()`, you set them on the `DoShareBuzz()` mock\nmethod:\n\n```cpp\n  MockBuzzer mock_buzzer_;\n  EXPECT_CALL(mock_buzzer_, DoShareBuzz(NotNull(), _));\n\n  // When one calls ShareBuzz() on the MockBuzzer like this, the call is\n  // forwarded to DoShareBuzz(), which is mocked.  Therefore this statement\n  // will trigger the above EXPECT_CALL.\n  mock_buzzer_.ShareBuzz(MakeUnique<Buzz>(AccessLevel::kInternal), 0);\n```\n\n\n\n## Making the Compilation Faster ##\n\nBelieve it or not, the _vast majority_ of the time spent on compiling\na mock class is in generating its constructor and destructor, as they\nperform non-trivial tasks (e.g. verification of the\nexpectations). What's more, mock methods with different signatures\nhave different types and thus their constructors/destructors need to\nbe generated by the compiler separately. As a result, if you mock many\ndifferent types of methods, compiling your mock class can get really\nslow.\n\nIf you are experiencing slow compilation, you can move the definition\nof your mock class' constructor and destructor out of the class body\nand into a `.cpp` file. This way, even if you `#include` your mock\nclass in N files, the compiler only needs to generate its constructor\nand destructor once, resulting in a much faster compilation.\n\nLet's illustrate the idea using an example. Here's the definition of a\nmock class before applying this recipe:\n\n```\n// File mock_foo.h.\n...\nclass MockFoo : public Foo {\n public:\n  // Since we don't declare the constructor or the destructor,\n  // the compiler will generate them in every translation unit\n  // where this mock class is used.\n\n  MOCK_METHOD0(DoThis, int());\n  MOCK_METHOD1(DoThat, bool(const char* str));\n  ... more mock methods ...\n};\n```\n\nAfter the change, it would look like:\n\n```\n// File mock_foo.h.\n...\nclass MockFoo : public Foo {\n public:\n  // The constructor and destructor are declared, but not defined, here.\n  MockFoo();\n  virtual ~MockFoo();\n\n  MOCK_METHOD0(DoThis, int());\n  MOCK_METHOD1(DoThat, bool(const char* str));\n  ... more mock methods ...\n};\n```\nand\n```\n// File mock_foo.cpp.\n#include \"path/to/mock_foo.h\"\n\n// The definitions may appear trivial, but the functions actually do a\n// lot of things through the constructors/destructors of the member\n// variables used to implement the mock methods.\nMockFoo::MockFoo() {}\nMockFoo::~MockFoo() {}\n```\n\n## Forcing a Verification ##\n\nWhen it's being destroyed, your friendly mock object will automatically\nverify that all expectations on it have been satisfied, and will\ngenerate [Google Test](../../googletest/) failures\nif not. This is convenient as it leaves you with one less thing to\nworry about. That is, unless you are not sure if your mock object will\nbe destroyed.\n\nHow could it be that your mock object won't eventually be destroyed?\nWell, it might be created on the heap and owned by the code you are\ntesting. Suppose there's a bug in that code and it doesn't delete the\nmock object properly - you could end up with a passing test when\nthere's actually a bug.\n\nUsing a heap checker is a good idea and can alleviate the concern, but\nits implementation may not be 100% reliable. So, sometimes you do want\nto _force_ Google Mock to verify a mock object before it is\n(hopefully) destructed. You can do this with\n`Mock::VerifyAndClearExpectations(&mock_object)`:\n\n```\nTEST(MyServerTest, ProcessesRequest) {\n  using ::testing::Mock;\n\n  MockFoo* const foo = new MockFoo;\n  EXPECT_CALL(*foo, ...)...;\n  // ... other expectations ...\n\n  // server now owns foo.\n  MyServer server(foo);\n  server.ProcessRequest(...);\n\n  // In case that server's destructor will forget to delete foo,\n  // this will verify the expectations anyway.\n  Mock::VerifyAndClearExpectations(foo);\n}  // server is destroyed when it goes out of scope here.\n```\n\n**Tip:** The `Mock::VerifyAndClearExpectations()` function returns a\n`bool` to indicate whether the verification was successful (`true` for\nyes), so you can wrap that function call inside a `ASSERT_TRUE()` if\nthere is no point going further when the verification has failed.\n\n## Using Check Points ##\n\nSometimes you may want to \"reset\" a mock object at various check\npoints in your test: at each check point, you verify that all existing\nexpectations on the mock object have been satisfied, and then you set\nsome new expectations on it as if it's newly created. This allows you\nto work with a mock object in \"phases\" whose sizes are each\nmanageable.\n\nOne such scenario is that in your test's `SetUp()` function, you may\nwant to put the object you are testing into a certain state, with the\nhelp from a mock object. Once in the desired state, you want to clear\nall expectations on the mock, such that in the `TEST_F` body you can\nset fresh expectations on it.\n\nAs you may have figured out, the `Mock::VerifyAndClearExpectations()`\nfunction we saw in the previous recipe can help you here. Or, if you\nare using `ON_CALL()` to set default actions on the mock object and\nwant to clear the default actions as well, use\n`Mock::VerifyAndClear(&mock_object)` instead. This function does what\n`Mock::VerifyAndClearExpectations(&mock_object)` does and returns the\nsame `bool`, **plus** it clears the `ON_CALL()` statements on\n`mock_object` too.\n\nAnother trick you can use to achieve the same effect is to put the\nexpectations in sequences and insert calls to a dummy \"check-point\"\nfunction at specific places. Then you can verify that the mock\nfunction calls do happen at the right time. For example, if you are\nexercising code:\n\n```\nFoo(1);\nFoo(2);\nFoo(3);\n```\n\nand want to verify that `Foo(1)` and `Foo(3)` both invoke\n`mock.Bar(\"a\")`, but `Foo(2)` doesn't invoke anything. You can write:\n\n```\nusing ::testing::MockFunction;\n\nTEST(FooTest, InvokesBarCorrectly) {\n  MyMock mock;\n  // Class MockFunction<F> has exactly one mock method.  It is named\n  // Call() and has type F.\n  MockFunction<void(string check_point_name)> check;\n  {\n    InSequence s;\n\n    EXPECT_CALL(mock, Bar(\"a\"));\n    EXPECT_CALL(check, Call(\"1\"));\n    EXPECT_CALL(check, Call(\"2\"));\n    EXPECT_CALL(mock, Bar(\"a\"));\n  }\n  Foo(1);\n  check.Call(\"1\");\n  Foo(2);\n  check.Call(\"2\");\n  Foo(3);\n}\n```\n\nThe expectation spec says that the first `Bar(\"a\")` must happen before\ncheck point \"1\", the second `Bar(\"a\")` must happen after check point \"2\",\nand nothing should happen between the two check points. The explicit\ncheck points make it easy to tell which `Bar(\"a\")` is called by which\ncall to `Foo()`.\n\n## Mocking Destructors ##\n\nSometimes you want to make sure a mock object is destructed at the\nright time, e.g. after `bar->A()` is called but before `bar->B()` is\ncalled. We already know that you can specify constraints on the order\nof mock function calls, so all we need to do is to mock the destructor\nof the mock function.\n\nThis sounds simple, except for one problem: a destructor is a special\nfunction with special syntax and special semantics, and the\n`MOCK_METHOD0` macro doesn't work for it:\n\n```\n  MOCK_METHOD0(~MockFoo, void());  // Won't compile!\n```\n\nThe good news is that you can use a simple pattern to achieve the same\neffect. First, add a mock function `Die()` to your mock class and call\nit in the destructor, like this:\n\n```\nclass MockFoo : public Foo {\n  ...\n  // Add the following two lines to the mock class.\n  MOCK_METHOD0(Die, void());\n  virtual ~MockFoo() { Die(); }\n};\n```\n\n(If the name `Die()` clashes with an existing symbol, choose another\nname.) Now, we have translated the problem of testing when a `MockFoo`\nobject dies to testing when its `Die()` method is called:\n\n```\n  MockFoo* foo = new MockFoo;\n  MockBar* bar = new MockBar;\n  ...\n  {\n    InSequence s;\n\n    // Expects *foo to die after bar->A() and before bar->B().\n    EXPECT_CALL(*bar, A());\n    EXPECT_CALL(*foo, Die());\n    EXPECT_CALL(*bar, B());\n  }\n```\n\nAnd that's that.\n\n## Using Google Mock and Threads ##\n\n**IMPORTANT NOTE:** What we describe in this recipe is **ONLY** true on\nplatforms where Google Mock is thread-safe. Currently these are only\nplatforms that support the pthreads library (this includes Linux and Mac).\nTo make it thread-safe on other platforms we only need to implement\nsome synchronization operations in `\"gtest/internal/gtest-port.h\"`.\n\nIn a **unit** test, it's best if you could isolate and test a piece of\ncode in a single-threaded context. That avoids race conditions and\ndead locks, and makes debugging your test much easier.\n\nYet many programs are multi-threaded, and sometimes to test something\nwe need to pound on it from more than one thread. Google Mock works\nfor this purpose too.\n\nRemember the steps for using a mock:\n\n  1. Create a mock object `foo`.\n  1. Set its default actions and expectations using `ON_CALL()` and `EXPECT_CALL()`.\n  1. The code under test calls methods of `foo`.\n  1. Optionally, verify and reset the mock.\n  1. Destroy the mock yourself, or let the code under test destroy it. The destructor will automatically verify it.\n\nIf you follow the following simple rules, your mocks and threads can\nlive happily together:\n\n  * Execute your _test code_ (as opposed to the code being tested) in _one_ thread. This makes your test easy to follow.\n  * Obviously, you can do step #1 without locking.\n  * When doing step #2 and #5, make sure no other thread is accessing `foo`. Obvious too, huh?\n  * #3 and #4 can be done either in one thread or in multiple threads - anyway you want. Google Mock takes care of the locking, so you don't have to do any - unless required by your test logic.\n\nIf you violate the rules (for example, if you set expectations on a\nmock while another thread is calling its methods), you get undefined\nbehavior. That's not fun, so don't do it.\n\nGoogle Mock guarantees that the action for a mock function is done in\nthe same thread that called the mock function. For example, in\n\n```\n  EXPECT_CALL(mock, Foo(1))\n      .WillOnce(action1);\n  EXPECT_CALL(mock, Foo(2))\n      .WillOnce(action2);\n```\n\nif `Foo(1)` is called in thread 1 and `Foo(2)` is called in thread 2,\nGoogle Mock will execute `action1` in thread 1 and `action2` in thread\n2.\n\nGoogle Mock does _not_ impose a sequence on actions performed in\ndifferent threads (doing so may create deadlocks as the actions may\nneed to cooperate). This means that the execution of `action1` and\n`action2` in the above example _may_ interleave. If this is a problem,\nyou should add proper synchronization logic to `action1` and `action2`\nto make the test thread-safe.\n\n\nAlso, remember that `DefaultValue<T>` is a global resource that\npotentially affects _all_ living mock objects in your\nprogram. Naturally, you won't want to mess with it from multiple\nthreads or when there still are mocks in action.\n\n## Controlling How Much Information Google Mock Prints ##\n\nWhen Google Mock sees something that has the potential of being an\nerror (e.g. a mock function with no expectation is called, a.k.a. an\nuninteresting call, which is allowed but perhaps you forgot to\nexplicitly ban the call), it prints some warning messages, including\nthe arguments of the function and the return value. Hopefully this\nwill remind you to take a look and see if there is indeed a problem.\n\nSometimes you are confident that your tests are correct and may not\nappreciate such friendly messages. Some other times, you are debugging\nyour tests or learning about the behavior of the code you are testing,\nand wish you could observe every mock call that happens (including\nargument values and the return value). Clearly, one size doesn't fit\nall.\n\nYou can control how much Google Mock tells you using the\n`--gmock_verbose=LEVEL` command-line flag, where `LEVEL` is a string\nwith three possible values:\n\n  * `info`: Google Mock will print all informational messages, warnings, and errors (most verbose). At this setting, Google Mock will also log any calls to the `ON_CALL/EXPECT_CALL` macros.\n  * `warning`: Google Mock will print both warnings and errors (less verbose). This is the default.\n  * `error`: Google Mock will print errors only (least verbose).\n\nAlternatively, you can adjust the value of that flag from within your\ntests like so:\n\n```\n  ::testing::FLAGS_gmock_verbose = \"error\";\n```\n\nNow, judiciously use the right flag to enable Google Mock serve you better!\n\n## Gaining Super Vision into Mock Calls ##\n\nYou have a test using Google Mock. It fails: Google Mock tells you\nthat some expectations aren't satisfied. However, you aren't sure why:\nIs there a typo somewhere in the matchers? Did you mess up the order\nof the `EXPECT_CALL`s? Or is the code under test doing something\nwrong?  How can you find out the cause?\n\nWon't it be nice if you have X-ray vision and can actually see the\ntrace of all `EXPECT_CALL`s and mock method calls as they are made?\nFor each call, would you like to see its actual argument values and\nwhich `EXPECT_CALL` Google Mock thinks it matches?\n\nYou can unlock this power by running your test with the\n`--gmock_verbose=info` flag. For example, given the test program:\n\n```\nusing testing::_;\nusing testing::HasSubstr;\nusing testing::Return;\n\nclass MockFoo {\n public:\n  MOCK_METHOD2(F, void(const string& x, const string& y));\n};\n\nTEST(Foo, Bar) {\n  MockFoo mock;\n  EXPECT_CALL(mock, F(_, _)).WillRepeatedly(Return());\n  EXPECT_CALL(mock, F(\"a\", \"b\"));\n  EXPECT_CALL(mock, F(\"c\", HasSubstr(\"d\")));\n\n  mock.F(\"a\", \"good\");\n  mock.F(\"a\", \"b\");\n}\n```\n\nif you run it with `--gmock_verbose=info`, you will see this output:\n\n```\n[ RUN      ] Foo.Bar\n\nfoo_test.cc:14: EXPECT_CALL(mock, F(_, _)) invoked\nfoo_test.cc:15: EXPECT_CALL(mock, F(\"a\", \"b\")) invoked\nfoo_test.cc:16: EXPECT_CALL(mock, F(\"c\", HasSubstr(\"d\"))) invoked\nfoo_test.cc:14: Mock function call matches EXPECT_CALL(mock, F(_, _))...\n    Function call: F(@0x7fff7c8dad40\"a\", @0x7fff7c8dad10\"good\")\nfoo_test.cc:15: Mock function call matches EXPECT_CALL(mock, F(\"a\", \"b\"))...\n    Function call: F(@0x7fff7c8dada0\"a\", @0x7fff7c8dad70\"b\")\nfoo_test.cc:16: Failure\nActual function call count doesn't match EXPECT_CALL(mock, F(\"c\", HasSubstr(\"d\")))...\n         Expected: to be called once\n           Actual: never called - unsatisfied and active\n[  FAILED  ] Foo.Bar\n```\n\nSuppose the bug is that the `\"c\"` in the third `EXPECT_CALL` is a typo\nand should actually be `\"a\"`. With the above message, you should see\nthat the actual `F(\"a\", \"good\")` call is matched by the first\n`EXPECT_CALL`, not the third as you thought. From that it should be\nobvious that the third `EXPECT_CALL` is written wrong. Case solved.\n\n## Running Tests in Emacs ##\n\nIf you build and run your tests in Emacs, the source file locations of\nGoogle Mock and [Google Test](../../googletest/)\nerrors will be highlighted. Just press `<Enter>` on one of them and\nyou'll be taken to the offending line. Or, you can just type `C-x ``\nto jump to the next error.\n\nTo make it even easier, you can add the following lines to your\n`~/.emacs` file:\n\n```\n(global-set-key \"\\M-m\"   'compile)  ; m is for make\n(global-set-key [M-down] 'next-error)\n(global-set-key [M-up]   '(lambda () (interactive) (next-error -1)))\n```\n\nThen you can type `M-m` to start a build, or `M-up`/`M-down` to move\nback and forth between errors.\n\n## Fusing Google Mock Source Files ##\n\nGoogle Mock's implementation consists of dozens of files (excluding\nits own tests).  Sometimes you may want them to be packaged up in\nfewer files instead, such that you can easily copy them to a new\nmachine and start hacking there.  For this we provide an experimental\nPython script `fuse_gmock_files.py` in the `scripts/` directory\n(starting with release 1.2.0).  Assuming you have Python 2.4 or above\ninstalled on your machine, just go to that directory and run\n```\npython fuse_gmock_files.py OUTPUT_DIR\n```\n\nand you should see an `OUTPUT_DIR` directory being created with files\n`gtest/gtest.h`, `gmock/gmock.h`, and `gmock-gtest-all.cc` in it.\nThese three files contain everything you need to use Google Mock (and\nGoogle Test).  Just copy them to anywhere you want and you are ready\nto write tests and use mocks.  You can use the\n[scrpts/test/Makefile](../scripts/test/Makefile) file as an example on how to compile your tests\nagainst them.\n\n# Extending Google Mock #\n\n## Writing New Matchers Quickly ##\n\nThe `MATCHER*` family of macros can be used to define custom matchers\neasily.  The syntax:\n\n```\nMATCHER(name, description_string_expression) { statements; }\n```\n\nwill define a matcher with the given name that executes the\nstatements, which must return a `bool` to indicate if the match\nsucceeds.  Inside the statements, you can refer to the value being\nmatched by `arg`, and refer to its type by `arg_type`.\n\nThe description string is a `string`-typed expression that documents\nwhat the matcher does, and is used to generate the failure message\nwhen the match fails.  It can (and should) reference the special\n`bool` variable `negation`, and should evaluate to the description of\nthe matcher when `negation` is `false`, or that of the matcher's\nnegation when `negation` is `true`.\n\nFor convenience, we allow the description string to be empty (`\"\"`),\nin which case Google Mock will use the sequence of words in the\nmatcher name as the description.\n\nFor example:\n```\nMATCHER(IsDivisibleBy7, \"\") { return (arg % 7) == 0; }\n```\nallows you to write\n```\n  // Expects mock_foo.Bar(n) to be called where n is divisible by 7.\n  EXPECT_CALL(mock_foo, Bar(IsDivisibleBy7()));\n```\nor,\n```\nusing ::testing::Not;\n...\n  EXPECT_THAT(some_expression, IsDivisibleBy7());\n  EXPECT_THAT(some_other_expression, Not(IsDivisibleBy7()));\n```\nIf the above assertions fail, they will print something like:\n```\n  Value of: some_expression\n  Expected: is divisible by 7\n    Actual: 27\n...\n  Value of: some_other_expression\n  Expected: not (is divisible by 7)\n    Actual: 21\n```\nwhere the descriptions `\"is divisible by 7\"` and `\"not (is divisible\nby 7)\"` are automatically calculated from the matcher name\n`IsDivisibleBy7`.\n\nAs you may have noticed, the auto-generated descriptions (especially\nthose for the negation) may not be so great. You can always override\nthem with a string expression of your own:\n```\nMATCHER(IsDivisibleBy7, std::string(negation ? \"isn't\" : \"is\") +\n                        \" divisible by 7\") {\n  return (arg % 7) == 0;\n}\n```\n\nOptionally, you can stream additional information to a hidden argument\nnamed `result_listener` to explain the match result. For example, a\nbetter definition of `IsDivisibleBy7` is:\n```\nMATCHER(IsDivisibleBy7, \"\") {\n  if ((arg % 7) == 0)\n    return true;\n\n  *result_listener << \"the remainder is \" << (arg % 7);\n  return false;\n}\n```\n\nWith this definition, the above assertion will give a better message:\n```\n  Value of: some_expression\n  Expected: is divisible by 7\n    Actual: 27 (the remainder is 6)\n```\n\nYou should let `MatchAndExplain()` print _any additional information_\nthat can help a user understand the match result. Note that it should\nexplain why the match succeeds in case of a success (unless it's\nobvious) - this is useful when the matcher is used inside\n`Not()`. There is no need to print the argument value itself, as\nGoogle Mock already prints it for you.\n\n**Notes:**\n\n  1. The type of the value being matched (`arg_type`) is determined by the context in which you use the matcher and is supplied to you by the compiler, so you don't need to worry about declaring it (nor can you).  This allows the matcher to be polymorphic.  For example, `IsDivisibleBy7()` can be used to match any type where the value of `(arg % 7) == 0` can be implicitly converted to a `bool`.  In the `Bar(IsDivisibleBy7())` example above, if method `Bar()` takes an `int`, `arg_type` will be `int`; if it takes an `unsigned long`, `arg_type` will be `unsigned long`; and so on.\n  1. Google Mock doesn't guarantee when or how many times a matcher will be invoked. Therefore the matcher logic must be _purely functional_ (i.e. it cannot have any side effect, and the result must not depend on anything other than the value being matched and the matcher parameters). This requirement must be satisfied no matter how you define the matcher (e.g. using one of the methods described in the following recipes). In particular, a matcher can never call a mock function, as that will affect the state of the mock object and Google Mock.\n\n## Writing New Parameterized Matchers Quickly ##\n\nSometimes you'll want to define a matcher that has parameters.  For that you\ncan use the macro:\n```\nMATCHER_P(name, param_name, description_string) { statements; }\n```\nwhere the description string can be either `\"\"` or a string expression\nthat references `negation` and `param_name`.\n\nFor example:\n```\nMATCHER_P(HasAbsoluteValue, value, \"\") { return abs(arg) == value; }\n```\nwill allow you to write:\n```\n  EXPECT_THAT(Blah(\"a\"), HasAbsoluteValue(n));\n```\nwhich may lead to this message (assuming `n` is 10):\n```\n  Value of: Blah(\"a\")\n  Expected: has absolute value 10\n    Actual: -9\n```\n\nNote that both the matcher description and its parameter are\nprinted, making the message human-friendly.\n\nIn the matcher definition body, you can write `foo_type` to\nreference the type of a parameter named `foo`.  For example, in the\nbody of `MATCHER_P(HasAbsoluteValue, value)` above, you can write\n`value_type` to refer to the type of `value`.\n\nGoogle Mock also provides `MATCHER_P2`, `MATCHER_P3`, ..., up to\n`MATCHER_P10` to support multi-parameter matchers:\n```\nMATCHER_Pk(name, param_1, ..., param_k, description_string) { statements; }\n```\n\nPlease note that the custom description string is for a particular\n**instance** of the matcher, where the parameters have been bound to\nactual values.  Therefore usually you'll want the parameter values to\nbe part of the description.  Google Mock lets you do that by\nreferencing the matcher parameters in the description string\nexpression.\n\nFor example,\n```\n  using ::testing::PrintToString;\n  MATCHER_P2(InClosedRange, low, hi,\n             std::string(negation ? \"isn't\" : \"is\") + \" in range [\" +\n             PrintToString(low) + \", \" + PrintToString(hi) + \"]\") {\n    return low <= arg && arg <= hi;\n  }\n  ...\n  EXPECT_THAT(3, InClosedRange(4, 6));\n```\nwould generate a failure that contains the message:\n```\n  Expected: is in range [4, 6]\n```\n\nIf you specify `\"\"` as the description, the failure message will\ncontain the sequence of words in the matcher name followed by the\nparameter values printed as a tuple.  For example,\n```\n  MATCHER_P2(InClosedRange, low, hi, \"\") { ... }\n  ...\n  EXPECT_THAT(3, InClosedRange(4, 6));\n```\nwould generate a failure that contains the text:\n```\n  Expected: in closed range (4, 6)\n```\n\nFor the purpose of typing, you can view\n```\nMATCHER_Pk(Foo, p1, ..., pk, description_string) { ... }\n```\nas shorthand for\n```\ntemplate <typename p1_type, ..., typename pk_type>\nFooMatcherPk<p1_type, ..., pk_type>\nFoo(p1_type p1, ..., pk_type pk) { ... }\n```\n\nWhen you write `Foo(v1, ..., vk)`, the compiler infers the types of\nthe parameters `v1`, ..., and `vk` for you.  If you are not happy with\nthe result of the type inference, you can specify the types by\nexplicitly instantiating the template, as in `Foo<long, bool>(5, false)`.\nAs said earlier, you don't get to (or need to) specify\n`arg_type` as that's determined by the context in which the matcher\nis used.\n\nYou can assign the result of expression `Foo(p1, ..., pk)` to a\nvariable of type `FooMatcherPk<p1_type, ..., pk_type>`.  This can be\nuseful when composing matchers.  Matchers that don't have a parameter\nor have only one parameter have special types: you can assign `Foo()`\nto a `FooMatcher`-typed variable, and assign `Foo(p)` to a\n`FooMatcherP<p_type>`-typed variable.\n\nWhile you can instantiate a matcher template with reference types,\npassing the parameters by pointer usually makes your code more\nreadable.  If, however, you still want to pass a parameter by\nreference, be aware that in the failure message generated by the\nmatcher you will see the value of the referenced object but not its\naddress.\n\nYou can overload matchers with different numbers of parameters:\n```\nMATCHER_P(Blah, a, description_string_1) { ... }\nMATCHER_P2(Blah, a, b, description_string_2) { ... }\n```\n\nWhile it's tempting to always use the `MATCHER*` macros when defining\na new matcher, you should also consider implementing\n`MatcherInterface` or using `MakePolymorphicMatcher()` instead (see\nthe recipes that follow), especially if you need to use the matcher a\nlot.  While these approaches require more work, they give you more\ncontrol on the types of the value being matched and the matcher\nparameters, which in general leads to better compiler error messages\nthat pay off in the long run.  They also allow overloading matchers\nbased on parameter types (as opposed to just based on the number of\nparameters).\n\n## Writing New Monomorphic Matchers ##\n\nA matcher of argument type `T` implements\n`::testing::MatcherInterface<T>` and does two things: it tests whether a\nvalue of type `T` matches the matcher, and can describe what kind of\nvalues it matches. The latter ability is used for generating readable\nerror messages when expectations are violated.\n\nThe interface looks like this:\n\n```\nclass MatchResultListener {\n public:\n  ...\n  // Streams x to the underlying ostream; does nothing if the ostream\n  // is NULL.\n  template <typename T>\n  MatchResultListener& operator<<(const T& x);\n\n  // Returns the underlying ostream.\n  ::std::ostream* stream();\n};\n\ntemplate <typename T>\nclass MatcherInterface {\n public:\n  virtual ~MatcherInterface();\n\n  // Returns true iff the matcher matches x; also explains the match\n  // result to 'listener'.\n  virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0;\n\n  // Describes this matcher to an ostream.\n  virtual void DescribeTo(::std::ostream* os) const = 0;\n\n  // Describes the negation of this matcher to an ostream.\n  virtual void DescribeNegationTo(::std::ostream* os) const;\n};\n```\n\nIf you need a custom matcher but `Truly()` is not a good option (for\nexample, you may not be happy with the way `Truly(predicate)`\ndescribes itself, or you may want your matcher to be polymorphic as\n`Eq(value)` is), you can define a matcher to do whatever you want in\ntwo steps: first implement the matcher interface, and then define a\nfactory function to create a matcher instance. The second step is not\nstrictly needed but it makes the syntax of using the matcher nicer.\n\nFor example, you can define a matcher to test whether an `int` is\ndivisible by 7 and then use it like this:\n```\nusing ::testing::MakeMatcher;\nusing ::testing::Matcher;\nusing ::testing::MatcherInterface;\nusing ::testing::MatchResultListener;\n\nclass DivisibleBy7Matcher : public MatcherInterface<int> {\n public:\n  virtual bool MatchAndExplain(int n, MatchResultListener* listener) const {\n    return (n % 7) == 0;\n  }\n\n  virtual void DescribeTo(::std::ostream* os) const {\n    *os << \"is divisible by 7\";\n  }\n\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"is not divisible by 7\";\n  }\n};\n\ninline Matcher<int> DivisibleBy7() {\n  return MakeMatcher(new DivisibleBy7Matcher);\n}\n...\n\n  EXPECT_CALL(foo, Bar(DivisibleBy7()));\n```\n\nYou may improve the matcher message by streaming additional\ninformation to the `listener` argument in `MatchAndExplain()`:\n\n```\nclass DivisibleBy7Matcher : public MatcherInterface<int> {\n public:\n  virtual bool MatchAndExplain(int n,\n                               MatchResultListener* listener) const {\n    const int remainder = n % 7;\n    if (remainder != 0) {\n      *listener << \"the remainder is \" << remainder;\n    }\n    return remainder == 0;\n  }\n  ...\n};\n```\n\nThen, `EXPECT_THAT(x, DivisibleBy7());` may general a message like this:\n```\nValue of: x\nExpected: is divisible by 7\n  Actual: 23 (the remainder is 2)\n```\n\n## Writing New Polymorphic Matchers ##\n\nYou've learned how to write your own matchers in the previous\nrecipe. Just one problem: a matcher created using `MakeMatcher()` only\nworks for one particular type of arguments. If you want a\n_polymorphic_ matcher that works with arguments of several types (for\ninstance, `Eq(x)` can be used to match a `value` as long as `value` ==\n`x` compiles -- `value` and `x` don't have to share the same type),\nyou can learn the trick from `\"gmock/gmock-matchers.h\"` but it's a bit\ninvolved.\n\nFortunately, most of the time you can define a polymorphic matcher\neasily with the help of `MakePolymorphicMatcher()`. Here's how you can\ndefine `NotNull()` as an example:\n\n```\nusing ::testing::MakePolymorphicMatcher;\nusing ::testing::MatchResultListener;\nusing ::testing::NotNull;\nusing ::testing::PolymorphicMatcher;\n\nclass NotNullMatcher {\n public:\n  // To implement a polymorphic matcher, first define a COPYABLE class\n  // that has three members MatchAndExplain(), DescribeTo(), and\n  // DescribeNegationTo(), like the following.\n\n  // In this example, we want to use NotNull() with any pointer, so\n  // MatchAndExplain() accepts a pointer of any type as its first argument.\n  // In general, you can define MatchAndExplain() as an ordinary method or\n  // a method template, or even overload it.\n  template <typename T>\n  bool MatchAndExplain(T* p,\n                       MatchResultListener* /* listener */) const {\n    return p != NULL;\n  }\n\n  // Describes the property of a value matching this matcher.\n  void DescribeTo(::std::ostream* os) const { *os << \"is not NULL\"; }\n\n  // Describes the property of a value NOT matching this matcher.\n  void DescribeNegationTo(::std::ostream* os) const { *os << \"is NULL\"; }\n};\n\n// To construct a polymorphic matcher, pass an instance of the class\n// to MakePolymorphicMatcher().  Note the return type.\ninline PolymorphicMatcher<NotNullMatcher> NotNull() {\n  return MakePolymorphicMatcher(NotNullMatcher());\n}\n...\n\n  EXPECT_CALL(foo, Bar(NotNull()));  // The argument must be a non-NULL pointer.\n```\n\n**Note:** Your polymorphic matcher class does **not** need to inherit from\n`MatcherInterface` or any other class, and its methods do **not** need\nto be virtual.\n\nLike in a monomorphic matcher, you may explain the match result by\nstreaming additional information to the `listener` argument in\n`MatchAndExplain()`.\n\n## Writing New Cardinalities ##\n\nA cardinality is used in `Times()` to tell Google Mock how many times\nyou expect a call to occur. It doesn't have to be exact. For example,\nyou can say `AtLeast(5)` or `Between(2, 4)`.\n\nIf the built-in set of cardinalities doesn't suit you, you are free to\ndefine your own by implementing the following interface (in namespace\n`testing`):\n\n```\nclass CardinalityInterface {\n public:\n  virtual ~CardinalityInterface();\n\n  // Returns true iff call_count calls will satisfy this cardinality.\n  virtual bool IsSatisfiedByCallCount(int call_count) const = 0;\n\n  // Returns true iff call_count calls will saturate this cardinality.\n  virtual bool IsSaturatedByCallCount(int call_count) const = 0;\n\n  // Describes self to an ostream.\n  virtual void DescribeTo(::std::ostream* os) const = 0;\n};\n```\n\nFor example, to specify that a call must occur even number of times,\nyou can write\n\n```\nusing ::testing::Cardinality;\nusing ::testing::CardinalityInterface;\nusing ::testing::MakeCardinality;\n\nclass EvenNumberCardinality : public CardinalityInterface {\n public:\n  virtual bool IsSatisfiedByCallCount(int call_count) const {\n    return (call_count % 2) == 0;\n  }\n\n  virtual bool IsSaturatedByCallCount(int call_count) const {\n    return false;\n  }\n\n  virtual void DescribeTo(::std::ostream* os) const {\n    *os << \"called even number of times\";\n  }\n};\n\nCardinality EvenNumber() {\n  return MakeCardinality(new EvenNumberCardinality);\n}\n...\n\n  EXPECT_CALL(foo, Bar(3))\n      .Times(EvenNumber());\n```\n\n## Writing New Actions Quickly ##\n\nIf the built-in actions don't work for you, and you find it\ninconvenient to use `Invoke()`, you can use a macro from the `ACTION*`\nfamily to quickly define a new action that can be used in your code as\nif it's a built-in action.\n\nBy writing\n```\nACTION(name) { statements; }\n```\nin a namespace scope (i.e. not inside a class or function), you will\ndefine an action with the given name that executes the statements.\nThe value returned by `statements` will be used as the return value of\nthe action.  Inside the statements, you can refer to the K-th\n(0-based) argument of the mock function as `argK`.  For example:\n```\nACTION(IncrementArg1) { return ++(*arg1); }\n```\nallows you to write\n```\n... WillOnce(IncrementArg1());\n```\n\nNote that you don't need to specify the types of the mock function\narguments.  Rest assured that your code is type-safe though:\nyou'll get a compiler error if `*arg1` doesn't support the `++`\noperator, or if the type of `++(*arg1)` isn't compatible with the mock\nfunction's return type.\n\nAnother example:\n```\nACTION(Foo) {\n  (*arg2)(5);\n  Blah();\n  *arg1 = 0;\n  return arg0;\n}\n```\ndefines an action `Foo()` that invokes argument #2 (a function pointer)\nwith 5, calls function `Blah()`, sets the value pointed to by argument\n#1 to 0, and returns argument #0.\n\nFor more convenience and flexibility, you can also use the following\npre-defined symbols in the body of `ACTION`:\n\n| `argK_type` | The type of the K-th (0-based) argument of the mock function |\n|:------------|:-------------------------------------------------------------|\n| `args`      | All arguments of the mock function as a tuple                |\n| `args_type` | The type of all arguments of the mock function as a tuple    |\n| `return_type` | The return type of the mock function                         |\n| `function_type` | The type of the mock function                                |\n\nFor example, when using an `ACTION` as a stub action for mock function:\n```\nint DoSomething(bool flag, int* ptr);\n```\nwe have:\n\n| **Pre-defined Symbol** | **Is Bound To** |\n|:-----------------------|:----------------|\n| `arg0`                 | the value of `flag` |\n| `arg0_type`            | the type `bool` |\n| `arg1`                 | the value of `ptr` |\n| `arg1_type`            | the type `int*` |\n| `args`                 | the tuple `(flag, ptr)` |\n| `args_type`            | the type `::testing::tuple<bool, int*>` |\n| `return_type`          | the type `int`  |\n| `function_type`        | the type `int(bool, int*)` |\n\n## Writing New Parameterized Actions Quickly ##\n\nSometimes you'll want to parameterize an action you define.  For that\nwe have another macro\n```\nACTION_P(name, param) { statements; }\n```\n\nFor example,\n```\nACTION_P(Add, n) { return arg0 + n; }\n```\nwill allow you to write\n```\n// Returns argument #0 + 5.\n... WillOnce(Add(5));\n```\n\nFor convenience, we use the term _arguments_ for the values used to\ninvoke the mock function, and the term _parameters_ for the values\nused to instantiate an action.\n\nNote that you don't need to provide the type of the parameter either.\nSuppose the parameter is named `param`, you can also use the\nGoogle-Mock-defined symbol `param_type` to refer to the type of the\nparameter as inferred by the compiler.  For example, in the body of\n`ACTION_P(Add, n)` above, you can write `n_type` for the type of `n`.\n\nGoogle Mock also provides `ACTION_P2`, `ACTION_P3`, and etc to support\nmulti-parameter actions.  For example,\n```\nACTION_P2(ReturnDistanceTo, x, y) {\n  double dx = arg0 - x;\n  double dy = arg1 - y;\n  return sqrt(dx*dx + dy*dy);\n}\n```\nlets you write\n```\n... WillOnce(ReturnDistanceTo(5.0, 26.5));\n```\n\nYou can view `ACTION` as a degenerated parameterized action where the\nnumber of parameters is 0.\n\nYou can also easily define actions overloaded on the number of parameters:\n```\nACTION_P(Plus, a) { ... }\nACTION_P2(Plus, a, b) { ... }\n```\n\n## Restricting the Type of an Argument or Parameter in an ACTION ##\n\nFor maximum brevity and reusability, the `ACTION*` macros don't ask\nyou to provide the types of the mock function arguments and the action\nparameters.  Instead, we let the compiler infer the types for us.\n\nSometimes, however, we may want to be more explicit about the types.\nThere are several tricks to do that.  For example:\n```\nACTION(Foo) {\n  // Makes sure arg0 can be converted to int.\n  int n = arg0;\n  ... use n instead of arg0 here ...\n}\n\nACTION_P(Bar, param) {\n  // Makes sure the type of arg1 is const char*.\n  ::testing::StaticAssertTypeEq<const char*, arg1_type>();\n\n  // Makes sure param can be converted to bool.\n  bool flag = param;\n}\n```\nwhere `StaticAssertTypeEq` is a compile-time assertion in Google Test\nthat verifies two types are the same.\n\n## Writing New Action Templates Quickly ##\n\nSometimes you want to give an action explicit template parameters that\ncannot be inferred from its value parameters.  `ACTION_TEMPLATE()`\nsupports that and can be viewed as an extension to `ACTION()` and\n`ACTION_P*()`.\n\nThe syntax:\n```\nACTION_TEMPLATE(ActionName,\n                HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m),\n                AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; }\n```\n\ndefines an action template that takes _m_ explicit template parameters\nand _n_ value parameters, where _m_ is between 1 and 10, and _n_ is\nbetween 0 and 10.  `name_i` is the name of the i-th template\nparameter, and `kind_i` specifies whether it's a `typename`, an\nintegral constant, or a template.  `p_i` is the name of the i-th value\nparameter.\n\nExample:\n```\n// DuplicateArg<k, T>(output) converts the k-th argument of the mock\n// function to type T and copies it to *output.\nACTION_TEMPLATE(DuplicateArg,\n                // Note the comma between int and k:\n                HAS_2_TEMPLATE_PARAMS(int, k, typename, T),\n                AND_1_VALUE_PARAMS(output)) {\n  *output = T(::testing::get<k>(args));\n}\n```\n\nTo create an instance of an action template, write:\n```\n  ActionName<t1, ..., t_m>(v1, ..., v_n)\n```\nwhere the `t`s are the template arguments and the\n`v`s are the value arguments.  The value argument\ntypes are inferred by the compiler.  For example:\n```\nusing ::testing::_;\n...\n  int n;\n  EXPECT_CALL(mock, Foo(_, _))\n      .WillOnce(DuplicateArg<1, unsigned char>(&n));\n```\n\nIf you want to explicitly specify the value argument types, you can\nprovide additional template arguments:\n```\n  ActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n)\n```\nwhere `u_i` is the desired type of `v_i`.\n\n`ACTION_TEMPLATE` and `ACTION`/`ACTION_P*` can be overloaded on the\nnumber of value parameters, but not on the number of template\nparameters.  Without the restriction, the meaning of the following is\nunclear:\n\n```\n  OverloadedAction<int, bool>(x);\n```\n\nAre we using a single-template-parameter action where `bool` refers to\nthe type of `x`, or a two-template-parameter action where the compiler\nis asked to infer the type of `x`?\n\n## Using the ACTION Object's Type ##\n\nIf you are writing a function that returns an `ACTION` object, you'll\nneed to know its type.  The type depends on the macro used to define\nthe action and the parameter types.  The rule is relatively simple:\n\n| **Given Definition** | **Expression** | **Has Type** |\n|:---------------------|:---------------|:-------------|\n| `ACTION(Foo)`        | `Foo()`        | `FooAction`  |\n| `ACTION_TEMPLATE(Foo, HAS_m_TEMPLATE_PARAMS(...), AND_0_VALUE_PARAMS())` |\t`Foo<t1, ..., t_m>()` | `FooAction<t1, ..., t_m>` |\n| `ACTION_P(Bar, param)` | `Bar(int_value)` | `BarActionP<int>` |\n| `ACTION_TEMPLATE(Bar, HAS_m_TEMPLATE_PARAMS(...), AND_1_VALUE_PARAMS(p1))` | `Bar<t1, ..., t_m>(int_value)` | `FooActionP<t1, ..., t_m, int>` |\n| `ACTION_P2(Baz, p1, p2)` | `Baz(bool_value, int_value)` | `BazActionP2<bool, int>` |\n| `ACTION_TEMPLATE(Baz, HAS_m_TEMPLATE_PARAMS(...), AND_2_VALUE_PARAMS(p1, p2))`| `Baz<t1, ..., t_m>(bool_value, int_value)` | `FooActionP2<t1, ..., t_m, bool, int>` |\n| ...                  | ...            | ...          |\n\nNote that we have to pick different suffixes (`Action`, `ActionP`,\n`ActionP2`, and etc) for actions with different numbers of value\nparameters, or the action definitions cannot be overloaded on the\nnumber of them.\n\n## Writing New Monomorphic Actions ##\n\nWhile the `ACTION*` macros are very convenient, sometimes they are\ninappropriate.  For example, despite the tricks shown in the previous\nrecipes, they don't let you directly specify the types of the mock\nfunction arguments and the action parameters, which in general leads\nto unoptimized compiler error messages that can baffle unfamiliar\nusers.  They also don't allow overloading actions based on parameter\ntypes without jumping through some hoops.\n\nAn alternative to the `ACTION*` macros is to implement\n`::testing::ActionInterface<F>`, where `F` is the type of the mock\nfunction in which the action will be used. For example:\n\n```\ntemplate <typename F>class ActionInterface {\n public:\n  virtual ~ActionInterface();\n\n  // Performs the action.  Result is the return type of function type\n  // F, and ArgumentTuple is the tuple of arguments of F.\n  //\n  // For example, if F is int(bool, const string&), then Result would\n  // be int, and ArgumentTuple would be ::testing::tuple<bool, const string&>.\n  virtual Result Perform(const ArgumentTuple& args) = 0;\n};\n\nusing ::testing::_;\nusing ::testing::Action;\nusing ::testing::ActionInterface;\nusing ::testing::MakeAction;\n\ntypedef int IncrementMethod(int*);\n\nclass IncrementArgumentAction : public ActionInterface<IncrementMethod> {\n public:\n  virtual int Perform(const ::testing::tuple<int*>& args) {\n    int* p = ::testing::get<0>(args);  // Grabs the first argument.\n    return *p++;\n  }\n};\n\nAction<IncrementMethod> IncrementArgument() {\n  return MakeAction(new IncrementArgumentAction);\n}\n...\n\n  EXPECT_CALL(foo, Baz(_))\n      .WillOnce(IncrementArgument());\n\n  int n = 5;\n  foo.Baz(&n);  // Should return 5 and change n to 6.\n```\n\n## Writing New Polymorphic Actions ##\n\nThe previous recipe showed you how to define your own action. This is\nall good, except that you need to know the type of the function in\nwhich the action will be used. Sometimes that can be a problem. For\nexample, if you want to use the action in functions with _different_\ntypes (e.g. like `Return()` and `SetArgPointee()`).\n\nIf an action can be used in several types of mock functions, we say\nit's _polymorphic_. The `MakePolymorphicAction()` function template\nmakes it easy to define such an action:\n\n```\nnamespace testing {\n\ntemplate <typename Impl>\nPolymorphicAction<Impl> MakePolymorphicAction(const Impl& impl);\n\n}  // namespace testing\n```\n\nAs an example, let's define an action that returns the second argument\nin the mock function's argument list. The first step is to define an\nimplementation class:\n\n```\nclass ReturnSecondArgumentAction {\n public:\n  template <typename Result, typename ArgumentTuple>\n  Result Perform(const ArgumentTuple& args) const {\n    // To get the i-th (0-based) argument, use ::testing::get<i>(args).\n    return ::testing::get<1>(args);\n  }\n};\n```\n\nThis implementation class does _not_ need to inherit from any\nparticular class. What matters is that it must have a `Perform()`\nmethod template. This method template takes the mock function's\narguments as a tuple in a **single** argument, and returns the result of\nthe action. It can be either `const` or not, but must be invokable\nwith exactly one template argument, which is the result type. In other\nwords, you must be able to call `Perform<R>(args)` where `R` is the\nmock function's return type and `args` is its arguments in a tuple.\n\nNext, we use `MakePolymorphicAction()` to turn an instance of the\nimplementation class into the polymorphic action we need. It will be\nconvenient to have a wrapper for this:\n\n```\nusing ::testing::MakePolymorphicAction;\nusing ::testing::PolymorphicAction;\n\nPolymorphicAction<ReturnSecondArgumentAction> ReturnSecondArgument() {\n  return MakePolymorphicAction(ReturnSecondArgumentAction());\n}\n```\n\nNow, you can use this polymorphic action the same way you use the\nbuilt-in ones:\n\n```\nusing ::testing::_;\n\nclass MockFoo : public Foo {\n public:\n  MOCK_METHOD2(DoThis, int(bool flag, int n));\n  MOCK_METHOD3(DoThat, string(int x, const char* str1, const char* str2));\n};\n...\n\n  MockFoo foo;\n  EXPECT_CALL(foo, DoThis(_, _))\n      .WillOnce(ReturnSecondArgument());\n  EXPECT_CALL(foo, DoThat(_, _, _))\n      .WillOnce(ReturnSecondArgument());\n  ...\n  foo.DoThis(true, 5);         // Will return 5.\n  foo.DoThat(1, \"Hi\", \"Bye\");  // Will return \"Hi\".\n```\n\n## Teaching Google Mock How to Print Your Values ##\n\nWhen an uninteresting or unexpected call occurs, Google Mock prints the\nargument values and the stack trace to help you debug.  Assertion\nmacros like `EXPECT_THAT` and `EXPECT_EQ` also print the values in\nquestion when the assertion fails.  Google Mock and Google Test do this using\nGoogle Test's user-extensible value printer.\n\nThis printer knows how to print built-in C++ types, native arrays, STL\ncontainers, and any type that supports the `<<` operator.  For other\ntypes, it prints the raw bytes in the value and hopes that you the\nuser can figure it out.\n[Google Test's advanced guide](../../googletest/docs/advanced.md#teaching-google-test-how-to-print-your-values)\nexplains how to extend the printer to do a better job at\nprinting your particular type than to dump the bytes.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/docs/DesignDoc.md",
    "content": "This page discusses the design of new Google Mock features.\n\n\n\n# Macros for Defining Actions #\n\n## Problem ##\n\nDue to the lack of closures in C++, it currently requires some\nnon-trivial effort to define a custom action in Google Mock.  For\nexample, suppose you want to \"increment the value pointed to by the\nsecond argument of the mock function and return it\", you could write:\n\n```\nint IncrementArg1(Unused, int* p, Unused) {\n  return ++(*p);\n}\n\n... WillOnce(Invoke(IncrementArg1));\n```\n\nThere are several things unsatisfactory about this approach:\n\n  * Even though the action only cares about the second argument of the mock function, its definition needs to list other arguments as dummies.  This is tedious.\n  * The defined action is usable only in mock functions that takes exactly 3 arguments - an unnecessary restriction.\n  * To use the action, one has to say `Invoke(IncrementArg1)`, which isn't as nice as `IncrementArg1()`.\n\nThe latter two problems can be overcome using `MakePolymorphicAction()`,\nbut it requires much more boilerplate code:\n\n```\nclass IncrementArg1Action {\n public:\n  template <typename Result, typename ArgumentTuple>\n  Result Perform(const ArgumentTuple& args) const {\n    return ++(*tr1::get<1>(args));\n  }\n};\n\nPolymorphicAction<IncrementArg1Action> IncrementArg1() {\n  return MakePolymorphicAction(IncrementArg1Action());\n}\n\n... WillOnce(IncrementArg1());\n```\n\nOur goal is to allow defining custom actions with the least amount of\nboiler-plate C++ requires.\n\n## Solution ##\n\nWe propose to introduce a new macro:\n```\nACTION(name) { statements; }\n```\n\nUsing this in a namespace scope will define an action with the given\nname that executes the statements.  Inside the statements, you can\nrefer to the K-th (0-based) argument of the mock function as `argK`.\nFor example:\n```\nACTION(IncrementArg1) { return ++(*arg1); }\n```\nallows you to write\n```\n... WillOnce(IncrementArg1());\n```\n\nNote that you don't need to specify the types of the mock function\narguments, as brevity is a top design goal here.  Rest assured that\nyour code is still type-safe though: you'll get a compiler error if\n`*arg1` doesn't support the `++` operator, or if the type of\n`++(*arg1)` isn't compatible with the mock function's return type.\n\nAnother example:\n```\nACTION(Foo) {\n  (*arg2)(5);\n  Blah();\n  *arg1 = 0;\n  return arg0;\n}\n```\ndefines an action `Foo()` that invokes argument #2 (a function pointer)\nwith 5, calls function `Blah()`, sets the value pointed to by argument\n#1 to 0, and returns argument #0.\n\nFor more convenience and flexibility, you can also use the following\npre-defined symbols in the body of `ACTION`:\n\n| `argK_type` | The type of the K-th (0-based) argument of the mock function |\n|:------------|:-------------------------------------------------------------|\n| `args`      | All arguments of the mock function as a tuple                |\n| `args_type` | The type of all arguments of the mock function as a tuple    |\n| `return_type` | The return type of the mock function                         |\n| `function_type` | The type of the mock function                                |\n\nFor example, when using an `ACTION` as a stub action for mock function:\n```\nint DoSomething(bool flag, int* ptr);\n```\nwe have:\n| **Pre-defined Symbol** | **Is Bound To** |\n|:-----------------------|:----------------|\n| `arg0`                 | the value of `flag` |\n| `arg0_type`            | the type `bool` |\n| `arg1`                 | the value of `ptr` |\n| `arg1_type`            | the type `int*` |\n| `args`                 | the tuple `(flag, ptr)` |\n| `args_type`            | the type `std::tr1::tuple<bool, int*>` |\n| `return_type`          | the type `int`  |\n| `function_type`        | the type `int(bool, int*)` |\n\n## Parameterized actions ##\n\nSometimes you'll want to parameterize the action.   For that we propose\nanother macro\n```\nACTION_P(name, param) { statements; }\n```\n\nFor example,\n```\nACTION_P(Add, n) { return arg0 + n; }\n```\nwill allow you to write\n```\n// Returns argument #0 + 5.\n... WillOnce(Add(5));\n```\n\nFor convenience, we use the term _arguments_ for the values used to\ninvoke the mock function, and the term _parameters_ for the values\nused to instantiate an action.\n\nNote that you don't need to provide the type of the parameter either.\nSuppose the parameter is named `param`, you can also use the\nGoogle-Mock-defined symbol `param_type` to refer to the type of the\nparameter as inferred by the compiler.\n\nWe will also provide `ACTION_P2`, `ACTION_P3`, and etc to support\nmulti-parameter actions.  For example,\n```\nACTION_P2(ReturnDistanceTo, x, y) {\n  double dx = arg0 - x;\n  double dy = arg1 - y;\n  return sqrt(dx*dx + dy*dy);\n}\n```\nlets you write\n```\n... WillOnce(ReturnDistanceTo(5.0, 26.5));\n```\n\nYou can view `ACTION` as a degenerated parameterized action where the\nnumber of parameters is 0.\n\n## Advanced Usages ##\n\n### Overloading Actions ###\n\nYou can easily define actions overloaded on the number of parameters:\n```\nACTION_P(Plus, a) { ... }\nACTION_P2(Plus, a, b) { ... }\n```\n\n### Restricting the Type of an Argument or Parameter ###\n\nFor maximum brevity and reusability, the `ACTION*` macros don't let\nyou specify the types of the mock function arguments and the action\nparameters.  Instead, we let the compiler infer the types for us.\n\nSometimes, however, we may want to be more explicit about the types.\nThere are several tricks to do that.  For example:\n```\nACTION(Foo) {\n  // Makes sure arg0 can be converted to int.\n  int n = arg0;\n  ... use n instead of arg0 here ...\n}\n\nACTION_P(Bar, param) {\n  // Makes sure the type of arg1 is const char*.\n  ::testing::StaticAssertTypeEq<const char*, arg1_type>();\n\n  // Makes sure param can be converted to bool.\n  bool flag = param;\n}\n```\nwhere `StaticAssertTypeEq` is a compile-time assertion we plan to add to\nGoogle Test (the name is chosen to match `static_assert` in C++0x).\n\n### Using the ACTION Object's Type ###\n\nIf you are writing a function that returns an `ACTION` object, you'll\nneed to know its type.  The type depends on the macro used to define\nthe action and the parameter types.  The rule is relatively simple:\n| **Given Definition** | **Expression** | **Has Type** |\n|:---------------------|:---------------|:-------------|\n| `ACTION(Foo)`        | `Foo()`        | `FooAction`  |\n| `ACTION_P(Bar, param)` | `Bar(int_value)` | `BarActionP<int>` |\n| `ACTION_P2(Baz, p1, p2)` | `Baz(bool_value, int_value)` | `BazActionP2<bool, int>` |\n| ...                  | ...            | ...          |\n\nNote that we have to pick different suffixes (`Action`, `ActionP`,\n`ActionP2`, and etc) for actions with different numbers of parameters,\nor the action definitions cannot be overloaded on the number of\nparameters.\n\n## When to Use ##\n\nWhile the new macros are very convenient, please also consider other\nmeans of implementing actions (e.g. via `ActionInterface` or\n`MakePolymorphicAction()`), especially if you need to use the defined\naction a lot.  While the other approaches require more work, they give\nyou more control on the types of the mock function arguments and the\naction parameters, which in general leads to better compiler error\nmessages that pay off in the long run.  They also allow overloading\nactions based on parameter types, as opposed to just the number of\nparameters.\n\n## Related Work ##\n\nAs you may have realized, the `ACTION*` macros resemble closures (also\nknown as lambda expressions or anonymous functions).  Indeed, both of\nthem seek to lower the syntactic overhead for defining a function.\n\nC++0x will support lambdas, but they are not part of C++ right now.\nSome non-standard libraries (most notably BLL or Boost Lambda Library)\ntry to alleviate this problem.  However, they are not a good choice\nfor defining actions as:\n\n  * They are non-standard and not widely installed.  Google Mock only depends on standard libraries and `tr1::tuple`, which is part of the new C++ standard and comes with gcc 4+.  We want to keep it that way.\n  * They are not trivial to learn.\n  * They will become obsolete when C++0x's lambda feature is widely supported.  We don't want to make our users use a dying library.\n  * Since they are based on operators, they are rather ad hoc: you cannot use statements, and you cannot pass the lambda arguments to a function, for example.\n  * They have subtle semantics that easily confuses new users.  For example, in expression `_1++ + foo++`, `foo` will be incremented only once where the expression is evaluated, while `_1` will be incremented every time the unnamed function is invoked.  This is far from intuitive.\n\n`ACTION*` avoid all these problems.\n\n## Future Improvements ##\n\nThere may be a need for composing `ACTION*` definitions (i.e. invoking\nanother `ACTION` inside the definition of one `ACTION*`).  We are not\nsure we want it yet, as one can get a similar effect by putting\n`ACTION` definitions in function templates and composing the function\ntemplates.  We'll revisit this based on user feedback.\n\nThe reason we don't allow `ACTION*()` inside a function body is that\nthe current C++ standard doesn't allow function-local types to be used\nto instantiate templates.  The upcoming C++0x standard will lift this\nrestriction.  Once this feature is widely supported by compilers, we\ncan revisit the implementation and add support for using `ACTION*()`\ninside a function.\n\nC++0x will also support lambda expressions.  When they become\navailable, we may want to support using lambdas as actions.\n\n# Macros for Defining Matchers #\n\nOnce the macros for defining actions are implemented, we plan to do\nthe same for matchers:\n\n```\nMATCHER(name) { statements; }\n```\n\nwhere you can refer to the value being matched as `arg`.  For example,\ngiven:\n\n```\nMATCHER(IsPositive) { return arg > 0; }\n```\n\nyou can use `IsPositive()` as a matcher that matches a value iff it is\ngreater than 0.\n\nWe will also add `MATCHER_P`, `MATCHER_P2`, and etc for parameterized\nmatchers."
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/docs/Documentation.md",
    "content": "This page lists all documentation markdown files for Google Mock **(the\ncurrent git version)**\n-- **if you use a former version of Google Mock, please read the\ndocumentation for that specific version instead (e.g. by checking out\nthe respective git branch/tag).**\n\n  * [ForDummies](ForDummies.md) -- start here if you are new to Google Mock.\n  * [CheatSheet](CheatSheet.md) -- a quick reference.\n  * [CookBook](CookBook.md) -- recipes for doing various tasks using Google Mock.\n  * [FrequentlyAskedQuestions](FrequentlyAskedQuestions.md) -- check here before asking a question on the mailing list.\n\nTo contribute code to Google Mock, read:\n\n  * [CONTRIBUTING](../CONTRIBUTING.md) -- read this _before_ writing your first patch.\n  * [Pump Manual](../../googletest/docs/PumpManual.md) -- how we generate some of Google Mock's source files.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/docs/ForDummies.md",
    "content": "\n\n(**Note:** If you get compiler errors that you don't understand, be sure to consult [Google Mock Doctor](FrequentlyAskedQuestions.md#how-am-i-supposed-to-make-sense-of-these-horrible-template-errors).)\n\n# What Is Google C++ Mocking Framework? #\nWhen you write a prototype or test, often it's not feasible or wise to rely on real objects entirely. A **mock object** implements the same interface as a real object (so it can be used as one), but lets you specify at run time how it will be used and what it should do (which methods will be called? in which order? how many times? with what arguments? what will they return? etc).\n\n**Note:** It is easy to confuse the term _fake objects_ with mock objects. Fakes and mocks actually mean very different things in the Test-Driven Development (TDD) community:\n\n  * **Fake** objects have working implementations, but usually take some shortcut (perhaps to make the operations less expensive), which makes them not suitable for production. An in-memory file system would be an example of a fake.\n  * **Mocks** are objects pre-programmed with _expectations_, which form a specification of the calls they are expected to receive.\n\nIf all this seems too abstract for you, don't worry - the most important thing to remember is that a mock allows you to check the _interaction_ between itself and code that uses it. The difference between fakes and mocks will become much clearer once you start to use mocks.\n\n**Google C++ Mocking Framework** (or **Google Mock** for short) is a library (sometimes we also call it a \"framework\" to make it sound cool) for creating mock classes and using them. It does to C++ what [jMock](http://www.jmock.org/) and [EasyMock](http://www.easymock.org/) do to Java.\n\nUsing Google Mock involves three basic steps:\n\n  1. Use some simple macros to describe the interface you want to mock, and they will expand to the implementation of your mock class;\n  1. Create some mock objects and specify its expectations and behavior using an intuitive syntax;\n  1. Exercise code that uses the mock objects. Google Mock will catch any violation of the expectations as soon as it arises.\n\n# Why Google Mock? #\nWhile mock objects help you remove unnecessary dependencies in tests and make them fast and reliable, using mocks manually in C++ is _hard_:\n\n  * Someone has to implement the mocks. The job is usually tedious and error-prone. No wonder people go great distances to avoid it.\n  * The quality of those manually written mocks is a bit, uh, unpredictable. You may see some really polished ones, but you may also see some that were hacked up in a hurry and have all sorts of ad-hoc restrictions.\n  * The knowledge you gained from using one mock doesn't transfer to the next.\n\nIn contrast, Java and Python programmers have some fine mock frameworks, which automate the creation of mocks. As a result, mocking is a proven effective technique and widely adopted practice in those communities. Having the right tool absolutely makes the difference.\n\nGoogle Mock was built to help C++ programmers. It was inspired by [jMock](http://www.jmock.org/) and [EasyMock](http://www.easymock.org/), but designed with C++'s specifics in mind. It is your friend if any of the following problems is bothering you:\n\n  * You are stuck with a sub-optimal design and wish you had done more prototyping before it was too late, but prototyping in C++ is by no means \"rapid\".\n  * Your tests are slow as they depend on too many libraries or use expensive resources (e.g. a database).\n  * Your tests are brittle as some resources they use are unreliable (e.g. the network).\n  * You want to test how your code handles a failure (e.g. a file checksum error), but it's not easy to cause one.\n  * You need to make sure that your module interacts with other modules in the right way, but it's hard to observe the interaction; therefore you resort to observing the side effects at the end of the action, which is awkward at best.\n  * You want to \"mock out\" your dependencies, except that they don't have mock implementations yet; and, frankly, you aren't thrilled by some of those hand-written mocks.\n\nWe encourage you to use Google Mock as:\n\n  * a _design_ tool, for it lets you experiment with your interface design early and often. More iterations lead to better designs!\n  * a _testing_ tool to cut your tests' outbound dependencies and probe the interaction between your module and its collaborators.\n\n# Getting Started #\nUsing Google Mock is easy! Inside your C++ source file, just `#include` `\"gtest/gtest.h\"` and `\"gmock/gmock.h\"`, and you are ready to go.\n\n# A Case for Mock Turtles #\nLet's look at an example. Suppose you are developing a graphics program that relies on a LOGO-like API for drawing. How would you test that it does the right thing? Well, you can run it and compare the screen with a golden screen snapshot, but let's admit it: tests like this are expensive to run and fragile (What if you just upgraded to a shiny new graphics card that has better anti-aliasing? Suddenly you have to update all your golden images.). It would be too painful if all your tests are like this. Fortunately, you learned about Dependency Injection and know the right thing to do: instead of having your application talk to the drawing API directly, wrap the API in an interface (say, `Turtle`) and code to that interface:\n\n```\nclass Turtle {\n  ...\n  virtual ~Turtle() {}\n  virtual void PenUp() = 0;\n  virtual void PenDown() = 0;\n  virtual void Forward(int distance) = 0;\n  virtual void Turn(int degrees) = 0;\n  virtual void GoTo(int x, int y) = 0;\n  virtual int GetX() const = 0;\n  virtual int GetY() const = 0;\n};\n```\n\n(Note that the destructor of `Turtle` **must** be virtual, as is the case for **all** classes you intend to inherit from - otherwise the destructor of the derived class will not be called when you delete an object through a base pointer, and you'll get corrupted program states like memory leaks.)\n\nYou can control whether the turtle's movement will leave a trace using `PenUp()` and `PenDown()`, and control its movement using `Forward()`, `Turn()`, and `GoTo()`. Finally, `GetX()` and `GetY()` tell you the current position of the turtle.\n\nYour program will normally use a real implementation of this interface. In tests, you can use a mock implementation instead. This allows you to easily check what drawing primitives your program is calling, with what arguments, and in which order. Tests written this way are much more robust (they won't break because your new machine does anti-aliasing differently), easier to read and maintain (the intent of a test is expressed in the code, not in some binary images), and run _much, much faster_.\n\n# Writing the Mock Class #\nIf you are lucky, the mocks you need to use have already been implemented by some nice people. If, however, you find yourself in the position to write a mock class, relax - Google Mock turns this task into a fun game! (Well, almost.)\n\n## How to Define It ##\nUsing the `Turtle` interface as example, here are the simple steps you need to follow:\n\n  1. Derive a class `MockTurtle` from `Turtle`.\n  1. Take a _virtual_ function of `Turtle` (while it's possible to [mock non-virtual methods using templates](CookBook.md#mocking-nonvirtual-methods), it's much more involved). Count how many arguments it has.\n  1. In the `public:` section of the child class, write `MOCK_METHODn();` (or `MOCK_CONST_METHODn();` if you are mocking a `const` method), where `n` is the number of the arguments; if you counted wrong, shame on you, and a compiler error will tell you so.\n  1. Now comes the fun part: you take the function signature, cut-and-paste the _function name_ as the _first_ argument to the macro, and leave what's left as the _second_ argument (in case you're curious, this is the _type of the function_).\n  1. Repeat until all virtual functions you want to mock are done.\n\nAfter the process, you should have something like:\n\n```\n#include \"gmock/gmock.h\"  // Brings in Google Mock.\nclass MockTurtle : public Turtle {\n public:\n  ...\n  MOCK_METHOD0(PenUp, void());\n  MOCK_METHOD0(PenDown, void());\n  MOCK_METHOD1(Forward, void(int distance));\n  MOCK_METHOD1(Turn, void(int degrees));\n  MOCK_METHOD2(GoTo, void(int x, int y));\n  MOCK_CONST_METHOD0(GetX, int());\n  MOCK_CONST_METHOD0(GetY, int());\n};\n```\n\nYou don't need to define these mock methods somewhere else - the `MOCK_METHOD*` macros will generate the definitions for you. It's that simple! Once you get the hang of it, you can pump out mock classes faster than your source-control system can handle your check-ins.\n\n**Tip:** If even this is too much work for you, you'll find the\n`gmock_gen.py` tool in Google Mock's `scripts/generator/` directory (courtesy of the [cppclean](http://code.google.com/p/cppclean/) project) useful.  This command-line\ntool requires that you have Python 2.4 installed.  You give it a C++ file and the name of an abstract class defined in it,\nand it will print the definition of the mock class for you.  Due to the\ncomplexity of the C++ language, this script may not always work, but\nit can be quite handy when it does.  For more details, read the [user documentation](../scripts/generator/README).\n\n## Where to Put It ##\nWhen you define a mock class, you need to decide where to put its definition. Some people put it in a `*_test.cc`. This is fine when the interface being mocked (say, `Foo`) is owned by the same person or team. Otherwise, when the owner of `Foo` changes it, your test could break. (You can't really expect `Foo`'s maintainer to fix every test that uses `Foo`, can you?)\n\nSo, the rule of thumb is: if you need to mock `Foo` and it's owned by others, define the mock class in `Foo`'s package (better, in a `testing` sub-package such that you can clearly separate production code and testing utilities), and put it in a `mock_foo.h`. Then everyone can reference `mock_foo.h` from their tests. If `Foo` ever changes, there is only one copy of `MockFoo` to change, and only tests that depend on the changed methods need to be fixed.\n\nAnother way to do it: you can introduce a thin layer `FooAdaptor` on top of `Foo` and code to this new interface. Since you own `FooAdaptor`, you can absorb changes in `Foo` much more easily. While this is more work initially, carefully choosing the adaptor interface can make your code easier to write and more readable (a net win in the long run), as you can choose `FooAdaptor` to fit your specific domain much better than `Foo` does.\n\n# Using Mocks in Tests #\nOnce you have a mock class, using it is easy. The typical work flow is:\n\n  1. Import the Google Mock names from the `testing` namespace such that you can use them unqualified (You only have to do it once per file. Remember that namespaces are a good idea and good for your health.).\n  1. Create some mock objects.\n  1. Specify your expectations on them (How many times will a method be called? With what arguments? What should it do? etc.).\n  1. Exercise some code that uses the mocks; optionally, check the result using Google Test assertions. If a mock method is called more than expected or with wrong arguments, you'll get an error immediately.\n  1. When a mock is destructed, Google Mock will automatically check whether all expectations on it have been satisfied.\n\nHere's an example:\n\n```\n#include \"path/to/mock-turtle.h\"\n#include \"gmock/gmock.h\"\n#include \"gtest/gtest.h\"\nusing ::testing::AtLeast;                     // #1\n\nTEST(PainterTest, CanDrawSomething) {\n  MockTurtle turtle;                          // #2\n  EXPECT_CALL(turtle, PenDown())              // #3\n      .Times(AtLeast(1));\n\n  Painter painter(&turtle);                   // #4\n\n  EXPECT_TRUE(painter.DrawCircle(0, 0, 10));\n}                                             // #5\n\nint main(int argc, char** argv) {\n  // The following line must be executed to initialize Google Mock\n  // (and Google Test) before running the tests.\n  ::testing::InitGoogleMock(&argc, argv);\n  return RUN_ALL_TESTS();\n}\n```\n\nAs you might have guessed, this test checks that `PenDown()` is called at least once. If the `painter` object didn't call this method, your test will fail with a message like this:\n\n```\npath/to/my_test.cc:119: Failure\nActual function call count doesn't match this expectation:\nActually: never called;\nExpected: called at least once.\n```\n\n**Tip 1:** If you run the test from an Emacs buffer, you can hit `<Enter>` on the line number displayed in the error message to jump right to the failed expectation.\n\n**Tip 2:** If your mock objects are never deleted, the final verification won't happen. Therefore it's a good idea to use a heap leak checker in your tests when you allocate mocks on the heap.\n\n**Important note:** Google Mock requires expectations to be set **before** the mock functions are called, otherwise the behavior is **undefined**. In particular, you mustn't interleave `EXPECT_CALL()`s and calls to the mock functions.\n\nThis means `EXPECT_CALL()` should be read as expecting that a call will occur _in the future_, not that a call has occurred. Why does Google Mock work like that? Well, specifying the expectation beforehand allows Google Mock to report a violation as soon as it arises, when the context (stack trace, etc) is still available. This makes debugging much easier.\n\nAdmittedly, this test is contrived and doesn't do much. You can easily achieve the same effect without using Google Mock. However, as we shall reveal soon, Google Mock allows you to do _much more_ with the mocks.\n\n## Using Google Mock with Any Testing Framework ##\nIf you want to use something other than Google Test (e.g. [CppUnit](http://sourceforge.net/projects/cppunit/) or\n[CxxTest](https://cxxtest.com/)) as your testing framework, just change the `main()` function in the previous section to:\n```\nint main(int argc, char** argv) {\n  // The following line causes Google Mock to throw an exception on failure,\n  // which will be interpreted by your testing framework as a test failure.\n  ::testing::GTEST_FLAG(throw_on_failure) = true;\n  ::testing::InitGoogleMock(&argc, argv);\n  ... whatever your testing framework requires ...\n}\n```\n\nThis approach has a catch: it makes Google Mock throw an exception\nfrom a mock object's destructor sometimes.  With some compilers, this\nsometimes causes the test program to crash.  You'll still be able to\nnotice that the test has failed, but it's not a graceful failure.\n\nA better solution is to use Google Test's\n[event listener API](../../googletest/docs/advanced.md#extending-google-test-by-handling-test-events)\nto report a test failure to your testing framework properly.  You'll need to\nimplement the `OnTestPartResult()` method of the event listener interface, but it\nshould be straightforward.\n\nIf this turns out to be too much work, we suggest that you stick with\nGoogle Test, which works with Google Mock seamlessly (in fact, it is\ntechnically part of Google Mock.).  If there is a reason that you\ncannot use Google Test, please let us know.\n\n# Setting Expectations #\nThe key to using a mock object successfully is to set the _right expectations_ on it. If you set the expectations too strict, your test will fail as the result of unrelated changes. If you set them too loose, bugs can slip through. You want to do it just right such that your test can catch exactly the kind of bugs you intend it to catch. Google Mock provides the necessary means for you to do it \"just right.\"\n\n## General Syntax ##\nIn Google Mock we use the `EXPECT_CALL()` macro to set an expectation on a mock method. The general syntax is:\n\n```\nEXPECT_CALL(mock_object, method(matchers))\n    .Times(cardinality)\n    .WillOnce(action)\n    .WillRepeatedly(action);\n```\n\nThe macro has two arguments: first the mock object, and then the method and its arguments. Note that the two are separated by a comma (`,`), not a period (`.`). (Why using a comma? The answer is that it was necessary for technical reasons.)\n\nThe macro can be followed by some optional _clauses_ that provide more information about the expectation. We'll discuss how each clause works in the coming sections.\n\nThis syntax is designed to make an expectation read like English. For example, you can probably guess that\n\n```\nusing ::testing::Return;\n...\nEXPECT_CALL(turtle, GetX())\n    .Times(5)\n    .WillOnce(Return(100))\n    .WillOnce(Return(150))\n    .WillRepeatedly(Return(200));\n```\n\nsays that the `turtle` object's `GetX()` method will be called five times, it will return 100 the first time, 150 the second time, and then 200 every time. Some people like to call this style of syntax a Domain-Specific Language (DSL).\n\n**Note:** Why do we use a macro to do this? It serves two purposes: first it makes expectations easily identifiable (either by `grep` or by a human reader), and second it allows Google Mock to include the source file location of a failed expectation in messages, making debugging easier.\n\n## Matchers: What Arguments Do We Expect? ##\nWhen a mock function takes arguments, we must specify what arguments we are expecting; for example:\n\n```\n// Expects the turtle to move forward by 100 units.\nEXPECT_CALL(turtle, Forward(100));\n```\n\nSometimes you may not want to be too specific (Remember that talk about tests being too rigid? Over specification leads to brittle tests and obscures the intent of tests. Therefore we encourage you to specify only what's necessary - no more, no less.). If you care to check that `Forward()` will be called but aren't interested in its actual argument, write `_` as the argument, which means \"anything goes\":\n\n```\nusing ::testing::_;\n...\n// Expects the turtle to move forward.\nEXPECT_CALL(turtle, Forward(_));\n```\n\n`_` is an instance of what we call **matchers**. A matcher is like a predicate and can test whether an argument is what we'd expect. You can use a matcher inside `EXPECT_CALL()` wherever a function argument is expected.\n\nA list of built-in matchers can be found in the [CheatSheet](CheatSheet.md). For example, here's the `Ge` (greater than or equal) matcher:\n\n```\nusing ::testing::Ge;\n...\nEXPECT_CALL(turtle, Forward(Ge(100)));\n```\n\nThis checks that the turtle will be told to go forward by at least 100 units.\n\n## Cardinalities: How Many Times Will It Be Called? ##\nThe first clause we can specify following an `EXPECT_CALL()` is `Times()`. We call its argument a **cardinality** as it tells _how many times_ the call should occur. It allows us to repeat an expectation many times without actually writing it as many times. More importantly, a cardinality can be \"fuzzy\", just like a matcher can be. This allows a user to express the intent of a test exactly.\n\nAn interesting special case is when we say `Times(0)`. You may have guessed - it means that the function shouldn't be called with the given arguments at all, and Google Mock will report a Google Test failure whenever the function is (wrongfully) called.\n\nWe've seen `AtLeast(n)` as an example of fuzzy cardinalities earlier. For the list of built-in cardinalities you can use, see the [CheatSheet](CheatSheet.md).\n\nThe `Times()` clause can be omitted. **If you omit `Times()`, Google Mock will infer the cardinality for you.** The rules are easy to remember:\n\n  * If **neither** `WillOnce()` **nor** `WillRepeatedly()` is in the `EXPECT_CALL()`, the inferred cardinality is `Times(1)`.\n  * If there are `n WillOnce()`'s but **no** `WillRepeatedly()`, where `n` >= 1, the cardinality is `Times(n)`.\n  * If there are `n WillOnce()`'s and **one** `WillRepeatedly()`, where `n` >= 0, the cardinality is `Times(AtLeast(n))`.\n\n**Quick quiz:** what do you think will happen if a function is expected to be called twice but actually called four times?\n\n## Actions: What Should It Do? ##\nRemember that a mock object doesn't really have a working implementation? We as users have to tell it what to do when a method is invoked. This is easy in Google Mock.\n\nFirst, if the return type of a mock function is a built-in type or a pointer, the function has a **default action** (a `void` function will just return, a `bool` function will return `false`, and other functions will return 0). In addition, in C++ 11 and above, a mock function whose return type is default-constructible (i.e. has a default constructor) has a default action of returning a default-constructed value.  If you don't say anything, this behavior will be used.\n\nSecond, if a mock function doesn't have a default action, or the default action doesn't suit you, you can specify the action to be taken each time the expectation matches using a series of `WillOnce()` clauses followed by an optional `WillRepeatedly()`. For example,\n\n```\nusing ::testing::Return;\n...\nEXPECT_CALL(turtle, GetX())\n    .WillOnce(Return(100))\n    .WillOnce(Return(200))\n    .WillOnce(Return(300));\n```\n\nThis says that `turtle.GetX()` will be called _exactly three times_ (Google Mock inferred this from how many `WillOnce()` clauses we've written, since we didn't explicitly write `Times()`), and will return 100, 200, and 300 respectively.\n\n```\nusing ::testing::Return;\n...\nEXPECT_CALL(turtle, GetY())\n    .WillOnce(Return(100))\n    .WillOnce(Return(200))\n    .WillRepeatedly(Return(300));\n```\n\nsays that `turtle.GetY()` will be called _at least twice_ (Google Mock knows this as we've written two `WillOnce()` clauses and a `WillRepeatedly()` while having no explicit `Times()`), will return 100 the first time, 200 the second time, and 300 from the third time on.\n\nOf course, if you explicitly write a `Times()`, Google Mock will not try to infer the cardinality itself. What if the number you specified is larger than there are `WillOnce()` clauses? Well, after all `WillOnce()`s are used up, Google Mock will do the _default_ action for the function every time (unless, of course, you have a `WillRepeatedly()`.).\n\nWhat can we do inside `WillOnce()` besides `Return()`? You can return a reference using `ReturnRef(variable)`, or invoke a pre-defined function, among [others](CheatSheet.md#actions).\n\n**Important note:** The `EXPECT_CALL()` statement evaluates the action clause only once, even though the action may be performed many times. Therefore you must be careful about side effects. The following may not do what you want:\n\n```\nint n = 100;\nEXPECT_CALL(turtle, GetX())\n.Times(4)\n.WillRepeatedly(Return(n++));\n```\n\nInstead of returning 100, 101, 102, ..., consecutively, this mock function will always return 100 as `n++` is only evaluated once. Similarly, `Return(new Foo)` will create a new `Foo` object when the `EXPECT_CALL()` is executed, and will return the same pointer every time. If you want the side effect to happen every time, you need to define a custom action, which we'll teach in the [CookBook](CookBook.md).\n\nTime for another quiz! What do you think the following means?\n\n```\nusing ::testing::Return;\n...\nEXPECT_CALL(turtle, GetY())\n.Times(4)\n.WillOnce(Return(100));\n```\n\nObviously `turtle.GetY()` is expected to be called four times. But if you think it will return 100 every time, think twice! Remember that one `WillOnce()` clause will be consumed each time the function is invoked and the default action will be taken afterwards. So the right answer is that `turtle.GetY()` will return 100 the first time, but **return 0 from the second time on**, as returning 0 is the default action for `int` functions.\n\n## Using Multiple Expectations ##\nSo far we've only shown examples where you have a single expectation. More realistically, you're going to specify expectations on multiple mock methods, which may be from multiple mock objects.\n\nBy default, when a mock method is invoked, Google Mock will search the expectations in the **reverse order** they are defined, and stop when an active expectation that matches the arguments is found (you can think of it as \"newer rules override older ones.\"). If the matching expectation cannot take any more calls, you will get an upper-bound-violated failure. Here's an example:\n\n```\nusing ::testing::_;\n...\nEXPECT_CALL(turtle, Forward(_));  // #1\nEXPECT_CALL(turtle, Forward(10))  // #2\n    .Times(2);\n```\n\nIf `Forward(10)` is called three times in a row, the third time it will be an error, as the last matching expectation (#2) has been saturated. If, however, the third `Forward(10)` call is replaced by `Forward(20)`, then it would be OK, as now #1 will be the matching expectation.\n\n**Side note:** Why does Google Mock search for a match in the _reverse_ order of the expectations? The reason is that this allows a user to set up the default expectations in a mock object's constructor or the test fixture's set-up phase and then customize the mock by writing more specific expectations in the test body. So, if you have two expectations on the same method, you want to put the one with more specific matchers **after** the other, or the more specific rule would be shadowed by the more general one that comes after it.\n\n## Ordered vs Unordered Calls ##\nBy default, an expectation can match a call even though an earlier expectation hasn't been satisfied. In other words, the calls don't have to occur in the order the expectations are specified.\n\nSometimes, you may want all the expected calls to occur in a strict order. To say this in Google Mock is easy:\n\n```\nusing ::testing::InSequence;\n...\nTEST(FooTest, DrawsLineSegment) {\n  ...\n  {\n    InSequence dummy;\n\n    EXPECT_CALL(turtle, PenDown());\n    EXPECT_CALL(turtle, Forward(100));\n    EXPECT_CALL(turtle, PenUp());\n  }\n  Foo();\n}\n```\n\nBy creating an object of type `InSequence`, all expectations in its scope are put into a _sequence_ and have to occur _sequentially_. Since we are just relying on the constructor and destructor of this object to do the actual work, its name is really irrelevant.\n\nIn this example, we test that `Foo()` calls the three expected functions in the order as written. If a call is made out-of-order, it will be an error.\n\n(What if you care about the relative order of some of the calls, but not all of them? Can you specify an arbitrary partial order? The answer is ... yes! If you are impatient, the details can be found in the [CookBook](CookBook.md#expecting-partially-ordered-calls).)\n\n## All Expectations Are Sticky (Unless Said Otherwise) ##\nNow let's do a quick quiz to see how well you can use this mock stuff already. How would you test that the turtle is asked to go to the origin _exactly twice_ (you want to ignore any other instructions it receives)?\n\nAfter you've come up with your answer, take a look at ours and compare notes (solve it yourself first - don't cheat!):\n\n```\nusing ::testing::_;\n...\nEXPECT_CALL(turtle, GoTo(_, _))  // #1\n    .Times(AnyNumber());\nEXPECT_CALL(turtle, GoTo(0, 0))  // #2\n    .Times(2);\n```\n\nSuppose `turtle.GoTo(0, 0)` is called three times. In the third time, Google Mock will see that the arguments match expectation #2 (remember that we always pick the last matching expectation). Now, since we said that there should be only two such calls, Google Mock will report an error immediately. This is basically what we've told you in the \"Using Multiple Expectations\" section above.\n\nThis example shows that **expectations in Google Mock are \"sticky\" by default**, in the sense that they remain active even after we have reached their invocation upper bounds. This is an important rule to remember, as it affects the meaning of the spec, and is **different** to how it's done in many other mocking frameworks (Why'd we do that? Because we think our rule makes the common cases easier to express and understand.).\n\nSimple? Let's see if you've really understood it: what does the following code say?\n\n```\nusing ::testing::Return;\n...\nfor (int i = n; i > 0; i--) {\n  EXPECT_CALL(turtle, GetX())\n      .WillOnce(Return(10*i));\n}\n```\n\nIf you think it says that `turtle.GetX()` will be called `n` times and will return 10, 20, 30, ..., consecutively, think twice! The problem is that, as we said, expectations are sticky. So, the second time `turtle.GetX()` is called, the last (latest) `EXPECT_CALL()` statement will match, and will immediately lead to an \"upper bound exceeded\" error - this piece of code is not very useful!\n\nOne correct way of saying that `turtle.GetX()` will return 10, 20, 30, ..., is to explicitly say that the expectations are _not_ sticky. In other words, they should _retire_ as soon as they are saturated:\n\n```\nusing ::testing::Return;\n...\nfor (int i = n; i > 0; i--) {\n  EXPECT_CALL(turtle, GetX())\n    .WillOnce(Return(10*i))\n    .RetiresOnSaturation();\n}\n```\n\nAnd, there's a better way to do it: in this case, we expect the calls to occur in a specific order, and we line up the actions to match the order. Since the order is important here, we should make it explicit using a sequence:\n\n```\nusing ::testing::InSequence;\nusing ::testing::Return;\n...\n{\n  InSequence s;\n\n  for (int i = 1; i <= n; i++) {\n    EXPECT_CALL(turtle, GetX())\n        .WillOnce(Return(10*i))\n        .RetiresOnSaturation();\n  }\n}\n```\n\nBy the way, the other situation where an expectation may _not_ be sticky is when it's in a sequence - as soon as another expectation that comes after it in the sequence has been used, it automatically retires (and will never be used to match any call).\n\n## Uninteresting Calls ##\nA mock object may have many methods, and not all of them are that interesting. For example, in some tests we may not care about how many times `GetX()` and `GetY()` get called.\n\nIn Google Mock, if you are not interested in a method, just don't say anything about it. If a call to this method occurs, you'll see a warning in the test output, but it won't be a failure.\n\n# What Now? #\nCongratulations! You've learned enough about Google Mock to start using it. Now, you might want to join the [googlemock](http://groups.google.com/group/googlemock) discussion group and actually write some tests using Google Mock - it will be fun. Hey, it may even be addictive - you've been warned.\n\nThen, if you feel like increasing your mock quotient, you should move on to the [CookBook](CookBook.md). You can learn many advanced features of Google Mock there -- and advance your level of enjoyment and testing bliss.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/docs/FrequentlyAskedQuestions.md",
    "content": "\n\nPlease send your questions to the\n[googlemock](http://groups.google.com/group/googlemock) discussion\ngroup. If you need help with compiler errors, make sure you have\ntried [Google Mock Doctor](#How_am_I_supposed_to_make_sense_of_these_horrible_template_error.md) first.\n\n## When I call a method on my mock object, the method for the real object is invoked instead.  What's the problem? ##\n\nIn order for a method to be mocked, it must be _virtual_, unless you use the [high-perf dependency injection technique](CookBook.md#mocking-nonvirtual-methods).\n\n## I wrote some matchers.  After I upgraded to a new version of Google Mock, they no longer compile.  What's going on? ##\n\nAfter version 1.4.0 of Google Mock was released, we had an idea on how\nto make it easier to write matchers that can generate informative\nmessages efficiently.  We experimented with this idea and liked what\nwe saw.  Therefore we decided to implement it.\n\nUnfortunately, this means that if you have defined your own matchers\nby implementing `MatcherInterface` or using `MakePolymorphicMatcher()`,\nyour definitions will no longer compile.  Matchers defined using the\n`MATCHER*` family of macros are not affected.\n\nSorry for the hassle if your matchers are affected.  We believe it's\nin everyone's long-term interest to make this change sooner than\nlater.  Fortunately, it's usually not hard to migrate an existing\nmatcher to the new API.  Here's what you need to do:\n\nIf you wrote your matcher like this:\n```\n// Old matcher definition that doesn't work with the latest\n// Google Mock.\nusing ::testing::MatcherInterface;\n...\nclass MyWonderfulMatcher : public MatcherInterface<MyType> {\n public:\n  ...\n  virtual bool Matches(MyType value) const {\n    // Returns true if value matches.\n    return value.GetFoo() > 5;\n  }\n  ...\n};\n```\n\nyou'll need to change it to:\n```\n// New matcher definition that works with the latest Google Mock.\nusing ::testing::MatcherInterface;\nusing ::testing::MatchResultListener;\n...\nclass MyWonderfulMatcher : public MatcherInterface<MyType> {\n public:\n  ...\n  virtual bool MatchAndExplain(MyType value,\n                               MatchResultListener* listener) const {\n    // Returns true if value matches.\n    return value.GetFoo() > 5;\n  }\n  ...\n};\n```\n(i.e. rename `Matches()` to `MatchAndExplain()` and give it a second\nargument of type `MatchResultListener*`.)\n\nIf you were also using `ExplainMatchResultTo()` to improve the matcher\nmessage:\n```\n// Old matcher definition that doesn't work with the lastest\n// Google Mock.\nusing ::testing::MatcherInterface;\n...\nclass MyWonderfulMatcher : public MatcherInterface<MyType> {\n public:\n  ...\n  virtual bool Matches(MyType value) const {\n    // Returns true if value matches.\n    return value.GetFoo() > 5;\n  }\n\n  virtual void ExplainMatchResultTo(MyType value,\n                                    ::std::ostream* os) const {\n    // Prints some helpful information to os to help\n    // a user understand why value matches (or doesn't match).\n    *os << \"the Foo property is \" << value.GetFoo();\n  }\n  ...\n};\n```\n\nyou should move the logic of `ExplainMatchResultTo()` into\n`MatchAndExplain()`, using the `MatchResultListener` argument where\nthe `::std::ostream` was used:\n```\n// New matcher definition that works with the latest Google Mock.\nusing ::testing::MatcherInterface;\nusing ::testing::MatchResultListener;\n...\nclass MyWonderfulMatcher : public MatcherInterface<MyType> {\n public:\n  ...\n  virtual bool MatchAndExplain(MyType value,\n                               MatchResultListener* listener) const {\n    // Returns true if value matches.\n    *listener << \"the Foo property is \" << value.GetFoo();\n    return value.GetFoo() > 5;\n  }\n  ...\n};\n```\n\nIf your matcher is defined using `MakePolymorphicMatcher()`:\n```\n// Old matcher definition that doesn't work with the latest\n// Google Mock.\nusing ::testing::MakePolymorphicMatcher;\n...\nclass MyGreatMatcher {\n public:\n  ...\n  bool Matches(MyType value) const {\n    // Returns true if value matches.\n    return value.GetBar() < 42;\n  }\n  ...\n};\n... MakePolymorphicMatcher(MyGreatMatcher()) ...\n```\n\nyou should rename the `Matches()` method to `MatchAndExplain()` and\nadd a `MatchResultListener*` argument (the same as what you need to do\nfor matchers defined by implementing `MatcherInterface`):\n```\n// New matcher definition that works with the latest Google Mock.\nusing ::testing::MakePolymorphicMatcher;\nusing ::testing::MatchResultListener;\n...\nclass MyGreatMatcher {\n public:\n  ...\n  bool MatchAndExplain(MyType value,\n                       MatchResultListener* listener) const {\n    // Returns true if value matches.\n    return value.GetBar() < 42;\n  }\n  ...\n};\n... MakePolymorphicMatcher(MyGreatMatcher()) ...\n```\n\nIf your polymorphic matcher uses `ExplainMatchResultTo()` for better\nfailure messages:\n```\n// Old matcher definition that doesn't work with the latest\n// Google Mock.\nusing ::testing::MakePolymorphicMatcher;\n...\nclass MyGreatMatcher {\n public:\n  ...\n  bool Matches(MyType value) const {\n    // Returns true if value matches.\n    return value.GetBar() < 42;\n  }\n  ...\n};\nvoid ExplainMatchResultTo(const MyGreatMatcher& matcher,\n                          MyType value,\n                          ::std::ostream* os) {\n  // Prints some helpful information to os to help\n  // a user understand why value matches (or doesn't match).\n  *os << \"the Bar property is \" << value.GetBar();\n}\n... MakePolymorphicMatcher(MyGreatMatcher()) ...\n```\n\nyou'll need to move the logic inside `ExplainMatchResultTo()` to\n`MatchAndExplain()`:\n```\n// New matcher definition that works with the latest Google Mock.\nusing ::testing::MakePolymorphicMatcher;\nusing ::testing::MatchResultListener;\n...\nclass MyGreatMatcher {\n public:\n  ...\n  bool MatchAndExplain(MyType value,\n                       MatchResultListener* listener) const {\n    // Returns true if value matches.\n    *listener << \"the Bar property is \" << value.GetBar();\n    return value.GetBar() < 42;\n  }\n  ...\n};\n... MakePolymorphicMatcher(MyGreatMatcher()) ...\n```\n\nFor more information, you can read these\n[two](CookBook.md#writing-new-monomorphic-matchers)\n[recipes](CookBook.md#writing-new-polymorphic-matchers)\nfrom the cookbook.  As always, you\nare welcome to post questions on `googlemock@googlegroups.com` if you\nneed any help.\n\n## When using Google Mock, do I have to use Google Test as the testing framework?  I have my favorite testing framework and don't want to switch. ##\n\nGoogle Mock works out of the box with Google Test.  However, it's easy\nto configure it to work with any testing framework of your choice.\n[Here](ForDummies.md#using-google-mock-with-any-testing-framework) is how.\n\n## How am I supposed to make sense of these horrible template errors? ##\n\nIf you are confused by the compiler errors gcc threw at you,\ntry consulting the _Google Mock Doctor_ tool first.  What it does is to\nscan stdin for gcc error messages, and spit out diagnoses on the\nproblems (we call them diseases) your code has.\n\nTo \"install\", run command:\n```\nalias gmd='<path to googlemock>/scripts/gmock_doctor.py'\n```\n\nTo use it, do:\n```\n<your-favorite-build-command> <your-test> 2>&1 | gmd\n```\n\nFor example:\n```\nmake my_test 2>&1 | gmd\n```\n\nOr you can run `gmd` and copy-n-paste gcc's error messages to it.\n\n## Can I mock a variadic function? ##\n\nYou cannot mock a variadic function (i.e. a function taking ellipsis\n(`...`) arguments) directly in Google Mock.\n\nThe problem is that in general, there is _no way_ for a mock object to\nknow how many arguments are passed to the variadic method, and what\nthe arguments' types are.  Only the _author of the base class_ knows\nthe protocol, and we cannot look into their head.\n\nTherefore, to mock such a function, the _user_ must teach the mock\nobject how to figure out the number of arguments and their types.  One\nway to do it is to provide overloaded versions of the function.\n\nEllipsis arguments are inherited from C and not really a C++ feature.\nThey are unsafe to use and don't work with arguments that have\nconstructors or destructors.  Therefore we recommend to avoid them in\nC++ as much as possible.\n\n## MSVC gives me warning C4301 or C4373 when I define a mock method with a const parameter.  Why? ##\n\nIf you compile this using Microsoft Visual C++ 2005 SP1:\n```\nclass Foo {\n  ...\n  virtual void Bar(const int i) = 0;\n};\n\nclass MockFoo : public Foo {\n  ...\n  MOCK_METHOD1(Bar, void(const int i));\n};\n```\nYou may get the following warning:\n```\nwarning C4301: 'MockFoo::Bar': overriding virtual function only differs from 'Foo::Bar' by const/volatile qualifier\n```\n\nThis is a MSVC bug.  The same code compiles fine with gcc ,for\nexample.  If you use Visual C++ 2008 SP1, you would get the warning:\n```\nwarning C4373: 'MockFoo::Bar': virtual function overrides 'Foo::Bar', previous versions of the compiler did not override when parameters only differed by const/volatile qualifiers\n```\n\nIn C++, if you _declare_ a function with a `const` parameter, the\n`const` modifier is _ignored_.  Therefore, the `Foo` base class above\nis equivalent to:\n```\nclass Foo {\n  ...\n  virtual void Bar(int i) = 0;  // int or const int?  Makes no difference.\n};\n```\n\nIn fact, you can _declare_ Bar() with an `int` parameter, and _define_\nit with a `const int` parameter.  The compiler will still match them\nup.\n\nSince making a parameter `const` is meaningless in the method\n_declaration_, we recommend to remove it in both `Foo` and `MockFoo`.\nThat should workaround the VC bug.\n\nNote that we are talking about the _top-level_ `const` modifier here.\nIf the function parameter is passed by pointer or reference, declaring\nthe _pointee_ or _referee_ as `const` is still meaningful.  For\nexample, the following two declarations are _not_ equivalent:\n```\nvoid Bar(int* p);        // Neither p nor *p is const.\nvoid Bar(const int* p);  // p is not const, but *p is.\n```\n\n## I have a huge mock class, and Microsoft Visual C++ runs out of memory when compiling it.  What can I do? ##\n\nWe've noticed that when the `/clr` compiler flag is used, Visual C++\nuses 5~6 times as much memory when compiling a mock class.  We suggest\nto avoid `/clr` when compiling native C++ mocks.\n\n## I can't figure out why Google Mock thinks my expectations are not satisfied.  What should I do? ##\n\nYou might want to run your test with\n`--gmock_verbose=info`.  This flag lets Google Mock print a trace\nof every mock function call it receives.  By studying the trace,\nyou'll gain insights on why the expectations you set are not met.\n\n## How can I assert that a function is NEVER called? ##\n\n```\nEXPECT_CALL(foo, Bar(_))\n    .Times(0);\n```\n\n## I have a failed test where Google Mock tells me TWICE that a particular expectation is not satisfied.  Isn't this redundant? ##\n\nWhen Google Mock detects a failure, it prints relevant information\n(the mock function arguments, the state of relevant expectations, and\netc) to help the user debug.  If another failure is detected, Google\nMock will do the same, including printing the state of relevant\nexpectations.\n\nSometimes an expectation's state didn't change between two failures,\nand you'll see the same description of the state twice.  They are\nhowever _not_ redundant, as they refer to _different points in time_.\nThe fact they are the same _is_ interesting information.\n\n## I get a heap check failure when using a mock object, but using a real object is fine.  What can be wrong? ##\n\nDoes the class (hopefully a pure interface) you are mocking have a\nvirtual destructor?\n\nWhenever you derive from a base class, make sure its destructor is\nvirtual.  Otherwise Bad Things will happen.  Consider the following\ncode:\n\n```\nclass Base {\n public:\n  // Not virtual, but should be.\n  ~Base() { ... }\n  ...\n};\n\nclass Derived : public Base {\n public:\n  ...\n private:\n  std::string value_;\n};\n\n...\n  Base* p = new Derived;\n  ...\n  delete p;  // Surprise! ~Base() will be called, but ~Derived() will not\n             // - value_ is leaked.\n```\n\nBy changing `~Base()` to virtual, `~Derived()` will be correctly\ncalled when `delete p` is executed, and the heap checker\nwill be happy.\n\n## The \"newer expectations override older ones\" rule makes writing expectations awkward.  Why does Google Mock do that? ##\n\nWhen people complain about this, often they are referring to code like:\n\n```\n// foo.Bar() should be called twice, return 1 the first time, and return\n// 2 the second time.  However, I have to write the expectations in the\n// reverse order.  This sucks big time!!!\nEXPECT_CALL(foo, Bar())\n    .WillOnce(Return(2))\n    .RetiresOnSaturation();\nEXPECT_CALL(foo, Bar())\n    .WillOnce(Return(1))\n    .RetiresOnSaturation();\n```\n\nThe problem is that they didn't pick the **best** way to express the test's\nintent.\n\nBy default, expectations don't have to be matched in _any_ particular\norder.  If you want them to match in a certain order, you need to be\nexplicit.  This is Google Mock's (and jMock's) fundamental philosophy: it's\neasy to accidentally over-specify your tests, and we want to make it\nharder to do so.\n\nThere are two better ways to write the test spec.  You could either\nput the expectations in sequence:\n\n```\n// foo.Bar() should be called twice, return 1 the first time, and return\n// 2 the second time.  Using a sequence, we can write the expectations\n// in their natural order.\n{\n  InSequence s;\n  EXPECT_CALL(foo, Bar())\n      .WillOnce(Return(1))\n      .RetiresOnSaturation();\n  EXPECT_CALL(foo, Bar())\n      .WillOnce(Return(2))\n      .RetiresOnSaturation();\n}\n```\n\nor you can put the sequence of actions in the same expectation:\n\n```\n// foo.Bar() should be called twice, return 1 the first time, and return\n// 2 the second time.\nEXPECT_CALL(foo, Bar())\n    .WillOnce(Return(1))\n    .WillOnce(Return(2))\n    .RetiresOnSaturation();\n```\n\nBack to the original questions: why does Google Mock search the\nexpectations (and `ON_CALL`s) from back to front?  Because this\nallows a user to set up a mock's behavior for the common case early\n(e.g. in the mock's constructor or the test fixture's set-up phase)\nand customize it with more specific rules later.  If Google Mock\nsearches from front to back, this very useful pattern won't be\npossible.\n\n## Google Mock prints a warning when a function without EXPECT\\_CALL is called, even if I have set its behavior using ON\\_CALL.  Would it be reasonable not to show the warning in this case? ##\n\nWhen choosing between being neat and being safe, we lean toward the\nlatter.  So the answer is that we think it's better to show the\nwarning.\n\nOften people write `ON_CALL`s in the mock object's\nconstructor or `SetUp()`, as the default behavior rarely changes from\ntest to test.  Then in the test body they set the expectations, which\nare often different for each test.  Having an `ON_CALL` in the set-up\npart of a test doesn't mean that the calls are expected.  If there's\nno `EXPECT_CALL` and the method is called, it's possibly an error.  If\nwe quietly let the call go through without notifying the user, bugs\nmay creep in unnoticed.\n\nIf, however, you are sure that the calls are OK, you can write\n\n```\nEXPECT_CALL(foo, Bar(_))\n    .WillRepeatedly(...);\n```\n\ninstead of\n\n```\nON_CALL(foo, Bar(_))\n    .WillByDefault(...);\n```\n\nThis tells Google Mock that you do expect the calls and no warning should be\nprinted.\n\nAlso, you can control the verbosity using the `--gmock_verbose` flag.\nIf you find the output too noisy when debugging, just choose a less\nverbose level.\n\n## How can I delete the mock function's argument in an action? ##\n\nIf you find yourself needing to perform some action that's not\nsupported by Google Mock directly, remember that you can define your own\nactions using\n[MakeAction()](CookBook.md#writing-new-actions) or\n[MakePolymorphicAction()](CookBook.md#writing_new_polymorphic_actions),\nor you can write a stub function and invoke it using\n[Invoke()](CookBook.md#using-functions_methods_functors).\n\n## MOCK\\_METHODn()'s second argument looks funny.  Why don't you use the MOCK\\_METHODn(Method, return\\_type, arg\\_1, ..., arg\\_n) syntax? ##\n\nWhat?!  I think it's beautiful. :-)\n\nWhile which syntax looks more natural is a subjective matter to some\nextent, Google Mock's syntax was chosen for several practical advantages it\nhas.\n\nTry to mock a function that takes a map as an argument:\n```\nvirtual int GetSize(const map<int, std::string>& m);\n```\n\nUsing the proposed syntax, it would be:\n```\nMOCK_METHOD1(GetSize, int, const map<int, std::string>& m);\n```\n\nGuess what?  You'll get a compiler error as the compiler thinks that\n`const map<int, std::string>& m` are **two**, not one, arguments. To work\naround this you can use `typedef` to give the map type a name, but\nthat gets in the way of your work.  Google Mock's syntax avoids this\nproblem as the function's argument types are protected inside a pair\nof parentheses:\n```\n// This compiles fine.\nMOCK_METHOD1(GetSize, int(const map<int, std::string>& m));\n```\n\nYou still need a `typedef` if the return type contains an unprotected\ncomma, but that's much rarer.\n\nOther advantages include:\n  1. `MOCK_METHOD1(Foo, int, bool)` can leave a reader wonder whether the method returns `int` or `bool`, while there won't be such confusion using Google Mock's syntax.\n  1. The way Google Mock describes a function type is nothing new, although many people may not be familiar with it.  The same syntax was used in C, and the `function` library in `tr1` uses this syntax extensively.  Since `tr1` will become a part of the new version of STL, we feel very comfortable to be consistent with it.\n  1. The function type syntax is also used in other parts of Google Mock's API (e.g. the action interface) in order to make the implementation tractable. A user needs to learn it anyway in order to utilize Google Mock's more advanced features.  We'd as well stick to the same syntax in `MOCK_METHOD*`!\n\n## My code calls a static/global function.  Can I mock it? ##\n\nYou can, but you need to make some changes.\n\nIn general, if you find yourself needing to mock a static function,\nit's a sign that your modules are too tightly coupled (and less\nflexible, less reusable, less testable, etc).  You are probably better\noff defining a small interface and call the function through that\ninterface, which then can be easily mocked.  It's a bit of work\ninitially, but usually pays for itself quickly.\n\nThis Google Testing Blog\n[post](https://testing.googleblog.com/2008/06/defeat-static-cling.html)\nsays it excellently.  Check it out.\n\n## My mock object needs to do complex stuff.  It's a lot of pain to specify the actions.  Google Mock sucks! ##\n\nI know it's not a question, but you get an answer for free any way. :-)\n\nWith Google Mock, you can create mocks in C++ easily.  And people might be\ntempted to use them everywhere. Sometimes they work great, and\nsometimes you may find them, well, a pain to use. So, what's wrong in\nthe latter case?\n\nWhen you write a test without using mocks, you exercise the code and\nassert that it returns the correct value or that the system is in an\nexpected state.  This is sometimes called \"state-based testing\".\n\nMocks are great for what some call \"interaction-based\" testing:\ninstead of checking the system state at the very end, mock objects\nverify that they are invoked the right way and report an error as soon\nas it arises, giving you a handle on the precise context in which the\nerror was triggered.  This is often more effective and economical to\ndo than state-based testing.\n\nIf you are doing state-based testing and using a test double just to\nsimulate the real object, you are probably better off using a fake.\nUsing a mock in this case causes pain, as it's not a strong point for\nmocks to perform complex actions.  If you experience this and think\nthat mocks suck, you are just not using the right tool for your\nproblem. Or, you might be trying to solve the wrong problem. :-)\n\n## I got a warning \"Uninteresting function call encountered - default action taken..\"  Should I panic? ##\n\nBy all means, NO!  It's just an FYI.\n\nWhat it means is that you have a mock function, you haven't set any\nexpectations on it (by Google Mock's rule this means that you are not\ninterested in calls to this function and therefore it can be called\nany number of times), and it is called.  That's OK - you didn't say\nit's not OK to call the function!\n\nWhat if you actually meant to disallow this function to be called, but\nforgot to write `EXPECT_CALL(foo, Bar()).Times(0)`?  While\none can argue that it's the user's fault, Google Mock tries to be nice and\nprints you a note.\n\nSo, when you see the message and believe that there shouldn't be any\nuninteresting calls, you should investigate what's going on.  To make\nyour life easier, Google Mock prints the function name and arguments\nwhen an uninteresting call is encountered.\n\n## I want to define a custom action.  Should I use Invoke() or implement the action interface? ##\n\nEither way is fine - you want to choose the one that's more convenient\nfor your circumstance.\n\nUsually, if your action is for a particular function type, defining it\nusing `Invoke()` should be easier; if your action can be used in\nfunctions of different types (e.g. if you are defining\n`Return(value)`), `MakePolymorphicAction()` is\neasiest.  Sometimes you want precise control on what types of\nfunctions the action can be used in, and implementing\n`ActionInterface` is the way to go here. See the implementation of\n`Return()` in `include/gmock/gmock-actions.h` for an example.\n\n## I'm using the set-argument-pointee action, and the compiler complains about \"conflicting return type specified\".  What does it mean? ##\n\nYou got this error as Google Mock has no idea what value it should return\nwhen the mock method is called.  `SetArgPointee()` says what the\nside effect is, but doesn't say what the return value should be.  You\nneed `DoAll()` to chain a `SetArgPointee()` with a `Return()`.\n\nSee this [recipe](CookBook.md#mocking_side_effects) for more details and an example.\n\n\n## My question is not in your FAQ! ##\n\nIf you cannot find the answer to your question in this FAQ, there are\nsome other resources you can use:\n\n  1. search the mailing list [archive](http://groups.google.com/group/googlemock/topics),\n  1. ask it on [googlemock@googlegroups.com](mailto:googlemock@googlegroups.com) and someone will answer it (to prevent spam, we require you to join the [discussion group](http://groups.google.com/group/googlemock) before you can post.).\n\nPlease note that creating an issue in the\n[issue tracker](https://github.com/google/googletest/issues) is _not_\na good way to get your answer, as it is monitored infrequently by a\nvery small number of people.\n\nWhen asking a question, it's helpful to provide as much of the\nfollowing information as possible (people cannot help you if there's\nnot enough information in your question):\n\n  * the version (or the revision number if you check out from SVN directly) of Google Mock you use (Google Mock is under active development, so it's possible that your problem has been solved in a later version),\n  * your operating system,\n  * the name and version of your compiler,\n  * the complete command line flags you give to your compiler,\n  * the complete compiler error messages (if the question is about compilation),\n  * the _actual_ code (ideally, a minimal but complete program) that has the problem you encounter.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/docs/KnownIssues.md",
    "content": "As any non-trivial software system, Google Mock has some known limitations and problems.  We are working on improving it, and welcome your help!  The follow is a list of issues we know about.\n\n\n\n## README contains outdated information on Google Mock's compatibility with other testing frameworks ##\n\nThe `README` file in release 1.1.0 still says that Google Mock only works with Google Test.  Actually, you can configure Google Mock to work with any testing framework you choose.\n\n## Tests failing on machines using Power PC CPUs (e.g. some Macs) ##\n\n`gmock_output_test` and `gmock-printers_test` are known to fail with Power PC CPUs.  This is due to portability issues with these tests, and is not an indication of problems in Google Mock itself.  You can safely ignore them.\n\n## Failed to resolve libgtest.so.0 in tests when built against installed Google Test ##\n\nThis only applies if you manually built and installed Google Test, and then built a Google Mock against it (either explicitly, or because gtest-config was in your path post-install). In this situation, Libtool has a known issue with certain systems' ldconfig setup:\n\nhttp://article.gmane.org/gmane.comp.sysutils.automake.general/9025\n\nThis requires a manual run of \"sudo ldconfig\" after the \"sudo make install\" for Google Test before any binaries which link against it can be executed. This isn't a bug in our install, but we should at least have documented it or hacked a work-around into our install. We should have one of these solutions in our next release."
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/gmock-actions.h",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements some commonly used actions.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_\n#define GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_\n\n#ifndef _WIN32_WCE\n# include <errno.h>\n#endif\n\n#include <algorithm>\n#include <string>\n\n#include \"gmock/internal/gmock-internal-utils.h\"\n#include \"gmock/internal/gmock-port.h\"\n\n#if GTEST_LANG_CXX11  // Defined by gtest-port.h via gmock-port.h.\n#include <functional>\n#include <type_traits>\n#endif  // GTEST_LANG_CXX11\n\nnamespace testing {\n\n// To implement an action Foo, define:\n//   1. a class FooAction that implements the ActionInterface interface, and\n//   2. a factory function that creates an Action object from a\n//      const FooAction*.\n//\n// The two-level delegation design follows that of Matcher, providing\n// consistency for extension developers.  It also eases ownership\n// management as Action objects can now be copied like plain values.\n\nnamespace internal {\n\ntemplate <typename F1, typename F2>\nclass ActionAdaptor;\n\n// BuiltInDefaultValueGetter<T, true>::Get() returns a\n// default-constructed T value.  BuiltInDefaultValueGetter<T,\n// false>::Get() crashes with an error.\n//\n// This primary template is used when kDefaultConstructible is true.\ntemplate <typename T, bool kDefaultConstructible>\nstruct BuiltInDefaultValueGetter {\n  static T Get() { return T(); }\n};\ntemplate <typename T>\nstruct BuiltInDefaultValueGetter<T, false> {\n  static T Get() {\n    Assert(false, __FILE__, __LINE__,\n           \"Default action undefined for the function return type.\");\n    return internal::Invalid<T>();\n    // The above statement will never be reached, but is required in\n    // order for this function to compile.\n  }\n};\n\n// BuiltInDefaultValue<T>::Get() returns the \"built-in\" default value\n// for type T, which is NULL when T is a raw pointer type, 0 when T is\n// a numeric type, false when T is bool, or \"\" when T is string or\n// std::string.  In addition, in C++11 and above, it turns a\n// default-constructed T value if T is default constructible.  For any\n// other type T, the built-in default T value is undefined, and the\n// function will abort the process.\ntemplate <typename T>\nclass BuiltInDefaultValue {\n public:\n#if GTEST_LANG_CXX11\n  // This function returns true iff type T has a built-in default value.\n  static bool Exists() {\n    return ::std::is_default_constructible<T>::value;\n  }\n\n  static T Get() {\n    return BuiltInDefaultValueGetter<\n        T, ::std::is_default_constructible<T>::value>::Get();\n  }\n\n#else  // GTEST_LANG_CXX11\n  // This function returns true iff type T has a built-in default value.\n  static bool Exists() {\n    return false;\n  }\n\n  static T Get() {\n    return BuiltInDefaultValueGetter<T, false>::Get();\n  }\n\n#endif  // GTEST_LANG_CXX11\n};\n\n// This partial specialization says that we use the same built-in\n// default value for T and const T.\ntemplate <typename T>\nclass BuiltInDefaultValue<const T> {\n public:\n  static bool Exists() { return BuiltInDefaultValue<T>::Exists(); }\n  static T Get() { return BuiltInDefaultValue<T>::Get(); }\n};\n\n// This partial specialization defines the default values for pointer\n// types.\ntemplate <typename T>\nclass BuiltInDefaultValue<T*> {\n public:\n  static bool Exists() { return true; }\n  static T* Get() { return NULL; }\n};\n\n// The following specializations define the default values for\n// specific types we care about.\n#define GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(type, value) \\\n  template <> \\\n  class BuiltInDefaultValue<type> { \\\n   public: \\\n    static bool Exists() { return true; } \\\n    static type Get() { return value; } \\\n  }\n\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(void, );  // NOLINT\n#if GTEST_HAS_GLOBAL_STRING\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::string, \"\");\n#endif  // GTEST_HAS_GLOBAL_STRING\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::std::string, \"\");\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(bool, false);\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned char, '\\0');\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed char, '\\0');\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(char, '\\0');\n\n// There's no need for a default action for signed wchar_t, as that\n// type is the same as wchar_t for gcc, and invalid for MSVC.\n//\n// There's also no need for a default action for unsigned wchar_t, as\n// that type is the same as unsigned int for gcc, and invalid for\n// MSVC.\n#if GMOCK_WCHAR_T_IS_NATIVE_\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(wchar_t, 0U);  // NOLINT\n#endif\n\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned short, 0U);  // NOLINT\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed short, 0);     // NOLINT\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned int, 0U);\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed int, 0);\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned long, 0UL);  // NOLINT\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed long, 0L);     // NOLINT\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(UInt64, 0);\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(Int64, 0);\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(float, 0);\nGMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(double, 0);\n\n#undef GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_\n\n}  // namespace internal\n\n// When an unexpected function call is encountered, Google Mock will\n// let it return a default value if the user has specified one for its\n// return type, or if the return type has a built-in default value;\n// otherwise Google Mock won't know what value to return and will have\n// to abort the process.\n//\n// The DefaultValue<T> class allows a user to specify the\n// default value for a type T that is both copyable and publicly\n// destructible (i.e. anything that can be used as a function return\n// type).  The usage is:\n//\n//   // Sets the default value for type T to be foo.\n//   DefaultValue<T>::Set(foo);\ntemplate <typename T>\nclass DefaultValue {\n public:\n  // Sets the default value for type T; requires T to be\n  // copy-constructable and have a public destructor.\n  static void Set(T x) {\n    delete producer_;\n    producer_ = new FixedValueProducer(x);\n  }\n\n  // Provides a factory function to be called to generate the default value.\n  // This method can be used even if T is only move-constructible, but it is not\n  // limited to that case.\n  typedef T (*FactoryFunction)();\n  static void SetFactory(FactoryFunction factory) {\n    delete producer_;\n    producer_ = new FactoryValueProducer(factory);\n  }\n\n  // Unsets the default value for type T.\n  static void Clear() {\n    delete producer_;\n    producer_ = NULL;\n  }\n\n  // Returns true iff the user has set the default value for type T.\n  static bool IsSet() { return producer_ != NULL; }\n\n  // Returns true if T has a default return value set by the user or there\n  // exists a built-in default value.\n  static bool Exists() {\n    return IsSet() || internal::BuiltInDefaultValue<T>::Exists();\n  }\n\n  // Returns the default value for type T if the user has set one;\n  // otherwise returns the built-in default value. Requires that Exists()\n  // is true, which ensures that the return value is well-defined.\n  static T Get() {\n    return producer_ == NULL ?\n        internal::BuiltInDefaultValue<T>::Get() : producer_->Produce();\n  }\n\n private:\n  class ValueProducer {\n   public:\n    virtual ~ValueProducer() {}\n    virtual T Produce() = 0;\n  };\n\n  class FixedValueProducer : public ValueProducer {\n   public:\n    explicit FixedValueProducer(T value) : value_(value) {}\n    virtual T Produce() { return value_; }\n\n   private:\n    const T value_;\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(FixedValueProducer);\n  };\n\n  class FactoryValueProducer : public ValueProducer {\n   public:\n    explicit FactoryValueProducer(FactoryFunction factory)\n        : factory_(factory) {}\n    virtual T Produce() { return factory_(); }\n\n   private:\n    const FactoryFunction factory_;\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(FactoryValueProducer);\n  };\n\n  static ValueProducer* producer_;\n};\n\n// This partial specialization allows a user to set default values for\n// reference types.\ntemplate <typename T>\nclass DefaultValue<T&> {\n public:\n  // Sets the default value for type T&.\n  static void Set(T& x) {  // NOLINT\n    address_ = &x;\n  }\n\n  // Unsets the default value for type T&.\n  static void Clear() {\n    address_ = NULL;\n  }\n\n  // Returns true iff the user has set the default value for type T&.\n  static bool IsSet() { return address_ != NULL; }\n\n  // Returns true if T has a default return value set by the user or there\n  // exists a built-in default value.\n  static bool Exists() {\n    return IsSet() || internal::BuiltInDefaultValue<T&>::Exists();\n  }\n\n  // Returns the default value for type T& if the user has set one;\n  // otherwise returns the built-in default value if there is one;\n  // otherwise aborts the process.\n  static T& Get() {\n    return address_ == NULL ?\n        internal::BuiltInDefaultValue<T&>::Get() : *address_;\n  }\n\n private:\n  static T* address_;\n};\n\n// This specialization allows DefaultValue<void>::Get() to\n// compile.\ntemplate <>\nclass DefaultValue<void> {\n public:\n  static bool Exists() { return true; }\n  static void Get() {}\n};\n\n// Points to the user-set default value for type T.\ntemplate <typename T>\ntypename DefaultValue<T>::ValueProducer* DefaultValue<T>::producer_ = NULL;\n\n// Points to the user-set default value for type T&.\ntemplate <typename T>\nT* DefaultValue<T&>::address_ = NULL;\n\n// Implement this interface to define an action for function type F.\ntemplate <typename F>\nclass ActionInterface {\n public:\n  typedef typename internal::Function<F>::Result Result;\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n  ActionInterface() {}\n  virtual ~ActionInterface() {}\n\n  // Performs the action.  This method is not const, as in general an\n  // action can have side effects and be stateful.  For example, a\n  // get-the-next-element-from-the-collection action will need to\n  // remember the current element.\n  virtual Result Perform(const ArgumentTuple& args) = 0;\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionInterface);\n};\n\n// An Action<F> is a copyable and IMMUTABLE (except by assignment)\n// object that represents an action to be taken when a mock function\n// of type F is called.  The implementation of Action<T> is just a\n// linked_ptr to const ActionInterface<T>, so copying is fairly cheap.\n// Don't inherit from Action!\n//\n// You can view an object implementing ActionInterface<F> as a\n// concrete action (including its current state), and an Action<F>\n// object as a handle to it.\ntemplate <typename F>\nclass Action {\n public:\n  typedef typename internal::Function<F>::Result Result;\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n  // Constructs a null Action.  Needed for storing Action objects in\n  // STL containers.\n  Action() {}\n\n#if GTEST_LANG_CXX11\n  // Construct an Action from a specified callable.\n  // This cannot take std::function directly, because then Action would not be\n  // directly constructible from lambda (it would require two conversions).\n  template <typename G,\n            typename = typename ::std::enable_if<\n                ::std::is_constructible<::std::function<F>, G>::value>::type>\n  Action(G&& fun) : fun_(::std::forward<G>(fun)) {}  // NOLINT\n#endif\n\n  // Constructs an Action from its implementation.\n  explicit Action(ActionInterface<F>* impl) : impl_(impl) {}\n\n  // This constructor allows us to turn an Action<Func> object into an\n  // Action<F>, as long as F's arguments can be implicitly converted\n  // to Func's and Func's return type can be implicitly converted to\n  // F's.\n  template <typename Func>\n  explicit Action(const Action<Func>& action);\n\n  // Returns true iff this is the DoDefault() action.\n  bool IsDoDefault() const {\n#if GTEST_LANG_CXX11\n    return impl_ == nullptr && fun_ == nullptr;\n#else\n    return impl_ == NULL;\n#endif\n  }\n\n  // Performs the action.  Note that this method is const even though\n  // the corresponding method in ActionInterface is not.  The reason\n  // is that a const Action<F> means that it cannot be re-bound to\n  // another concrete action, not that the concrete action it binds to\n  // cannot change state.  (Think of the difference between a const\n  // pointer and a pointer to const.)\n  Result Perform(ArgumentTuple args) const {\n    if (IsDoDefault()) {\n      internal::IllegalDoDefault(__FILE__, __LINE__);\n    }\n#if GTEST_LANG_CXX11\n    if (fun_ != nullptr) {\n      return internal::Apply(fun_, ::std::move(args));\n    }\n#endif\n    return impl_->Perform(args);\n  }\n\n private:\n  template <typename F1, typename F2>\n  friend class internal::ActionAdaptor;\n\n  template <typename G>\n  friend class Action;\n\n  // In C++11, Action can be implemented either as a generic functor (through\n  // std::function), or legacy ActionInterface. In C++98, only ActionInterface\n  // is available. The invariants are as follows:\n  // * in C++98, impl_ is null iff this is the default action\n  // * in C++11, at most one of fun_ & impl_ may be nonnull; both are null iff\n  //   this is the default action\n#if GTEST_LANG_CXX11\n  ::std::function<F> fun_;\n#endif\n  internal::linked_ptr<ActionInterface<F> > impl_;\n};\n\n// The PolymorphicAction class template makes it easy to implement a\n// polymorphic action (i.e. an action that can be used in mock\n// functions of than one type, e.g. Return()).\n//\n// To define a polymorphic action, a user first provides a COPYABLE\n// implementation class that has a Perform() method template:\n//\n//   class FooAction {\n//    public:\n//     template <typename Result, typename ArgumentTuple>\n//     Result Perform(const ArgumentTuple& args) const {\n//       // Processes the arguments and returns a result, using\n//       // tr1::get<N>(args) to get the N-th (0-based) argument in the tuple.\n//     }\n//     ...\n//   };\n//\n// Then the user creates the polymorphic action using\n// MakePolymorphicAction(object) where object has type FooAction.  See\n// the definition of Return(void) and SetArgumentPointee<N>(value) for\n// complete examples.\ntemplate <typename Impl>\nclass PolymorphicAction {\n public:\n  explicit PolymorphicAction(const Impl& impl) : impl_(impl) {}\n\n  template <typename F>\n  operator Action<F>() const {\n    return Action<F>(new MonomorphicImpl<F>(impl_));\n  }\n\n private:\n  template <typename F>\n  class MonomorphicImpl : public ActionInterface<F> {\n   public:\n    typedef typename internal::Function<F>::Result Result;\n    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n    explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}\n\n    virtual Result Perform(const ArgumentTuple& args) {\n      return impl_.template Perform<Result>(args);\n    }\n\n   private:\n    Impl impl_;\n\n    GTEST_DISALLOW_ASSIGN_(MonomorphicImpl);\n  };\n\n  Impl impl_;\n\n  GTEST_DISALLOW_ASSIGN_(PolymorphicAction);\n};\n\n// Creates an Action from its implementation and returns it.  The\n// created Action object owns the implementation.\ntemplate <typename F>\nAction<F> MakeAction(ActionInterface<F>* impl) {\n  return Action<F>(impl);\n}\n\n// Creates a polymorphic action from its implementation.  This is\n// easier to use than the PolymorphicAction<Impl> constructor as it\n// doesn't require you to explicitly write the template argument, e.g.\n//\n//   MakePolymorphicAction(foo);\n// vs\n//   PolymorphicAction<TypeOfFoo>(foo);\ntemplate <typename Impl>\ninline PolymorphicAction<Impl> MakePolymorphicAction(const Impl& impl) {\n  return PolymorphicAction<Impl>(impl);\n}\n\nnamespace internal {\n\n// Allows an Action<F2> object to pose as an Action<F1>, as long as F2\n// and F1 are compatible.\ntemplate <typename F1, typename F2>\nclass ActionAdaptor : public ActionInterface<F1> {\n public:\n  typedef typename internal::Function<F1>::Result Result;\n  typedef typename internal::Function<F1>::ArgumentTuple ArgumentTuple;\n\n  explicit ActionAdaptor(const Action<F2>& from) : impl_(from.impl_) {}\n\n  virtual Result Perform(const ArgumentTuple& args) {\n    return impl_->Perform(args);\n  }\n\n private:\n  const internal::linked_ptr<ActionInterface<F2> > impl_;\n\n  GTEST_DISALLOW_ASSIGN_(ActionAdaptor);\n};\n\n// Helper struct to specialize ReturnAction to execute a move instead of a copy\n// on return. Useful for move-only types, but could be used on any type.\ntemplate <typename T>\nstruct ByMoveWrapper {\n  explicit ByMoveWrapper(T value) : payload(internal::move(value)) {}\n  T payload;\n};\n\n// Implements the polymorphic Return(x) action, which can be used in\n// any function that returns the type of x, regardless of the argument\n// types.\n//\n// Note: The value passed into Return must be converted into\n// Function<F>::Result when this action is cast to Action<F> rather than\n// when that action is performed. This is important in scenarios like\n//\n// MOCK_METHOD1(Method, T(U));\n// ...\n// {\n//   Foo foo;\n//   X x(&foo);\n//   EXPECT_CALL(mock, Method(_)).WillOnce(Return(x));\n// }\n//\n// In the example above the variable x holds reference to foo which leaves\n// scope and gets destroyed.  If copying X just copies a reference to foo,\n// that copy will be left with a hanging reference.  If conversion to T\n// makes a copy of foo, the above code is safe. To support that scenario, we\n// need to make sure that the type conversion happens inside the EXPECT_CALL\n// statement, and conversion of the result of Return to Action<T(U)> is a\n// good place for that.\n//\n// The real life example of the above scenario happens when an invocation\n// of gtl::Container() is passed into Return.\n//\ntemplate <typename R>\nclass ReturnAction {\n public:\n  // Constructs a ReturnAction object from the value to be returned.\n  // 'value' is passed by value instead of by const reference in order\n  // to allow Return(\"string literal\") to compile.\n  explicit ReturnAction(R value) : value_(new R(internal::move(value))) {}\n\n  // This template type conversion operator allows Return(x) to be\n  // used in ANY function that returns x's type.\n  template <typename F>\n  operator Action<F>() const {\n    // Assert statement belongs here because this is the best place to verify\n    // conditions on F. It produces the clearest error messages\n    // in most compilers.\n    // Impl really belongs in this scope as a local class but can't\n    // because MSVC produces duplicate symbols in different translation units\n    // in this case. Until MS fixes that bug we put Impl into the class scope\n    // and put the typedef both here (for use in assert statement) and\n    // in the Impl class. But both definitions must be the same.\n    typedef typename Function<F>::Result Result;\n    GTEST_COMPILE_ASSERT_(\n        !is_reference<Result>::value,\n        use_ReturnRef_instead_of_Return_to_return_a_reference);\n    return Action<F>(new Impl<R, F>(value_));\n  }\n\n private:\n  // Implements the Return(x) action for a particular function type F.\n  template <typename R_, typename F>\n  class Impl : public ActionInterface<F> {\n   public:\n    typedef typename Function<F>::Result Result;\n    typedef typename Function<F>::ArgumentTuple ArgumentTuple;\n\n    // The implicit cast is necessary when Result has more than one\n    // single-argument constructor (e.g. Result is std::vector<int>) and R\n    // has a type conversion operator template.  In that case, value_(value)\n    // won't compile as the compiler doesn't known which constructor of\n    // Result to call.  ImplicitCast_ forces the compiler to convert R to\n    // Result without considering explicit constructors, thus resolving the\n    // ambiguity. value_ is then initialized using its copy constructor.\n    explicit Impl(const linked_ptr<R>& value)\n        : value_before_cast_(*value),\n          value_(ImplicitCast_<Result>(value_before_cast_)) {}\n\n    virtual Result Perform(const ArgumentTuple&) { return value_; }\n\n   private:\n    GTEST_COMPILE_ASSERT_(!is_reference<Result>::value,\n                          Result_cannot_be_a_reference_type);\n    // We save the value before casting just in case it is being cast to a\n    // wrapper type.\n    R value_before_cast_;\n    Result value_;\n\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(Impl);\n  };\n\n  // Partially specialize for ByMoveWrapper. This version of ReturnAction will\n  // move its contents instead.\n  template <typename R_, typename F>\n  class Impl<ByMoveWrapper<R_>, F> : public ActionInterface<F> {\n   public:\n    typedef typename Function<F>::Result Result;\n    typedef typename Function<F>::ArgumentTuple ArgumentTuple;\n\n    explicit Impl(const linked_ptr<R>& wrapper)\n        : performed_(false), wrapper_(wrapper) {}\n\n    virtual Result Perform(const ArgumentTuple&) {\n      GTEST_CHECK_(!performed_)\n          << \"A ByMove() action should only be performed once.\";\n      performed_ = true;\n      return internal::move(wrapper_->payload);\n    }\n\n   private:\n    bool performed_;\n    const linked_ptr<R> wrapper_;\n\n    GTEST_DISALLOW_ASSIGN_(Impl);\n  };\n\n  const linked_ptr<R> value_;\n\n  GTEST_DISALLOW_ASSIGN_(ReturnAction);\n};\n\n// Implements the ReturnNull() action.\nclass ReturnNullAction {\n public:\n  // Allows ReturnNull() to be used in any pointer-returning function. In C++11\n  // this is enforced by returning nullptr, and in non-C++11 by asserting a\n  // pointer type on compile time.\n  template <typename Result, typename ArgumentTuple>\n  static Result Perform(const ArgumentTuple&) {\n#if GTEST_LANG_CXX11\n    return nullptr;\n#else\n    GTEST_COMPILE_ASSERT_(internal::is_pointer<Result>::value,\n                          ReturnNull_can_be_used_to_return_a_pointer_only);\n    return NULL;\n#endif  // GTEST_LANG_CXX11\n  }\n};\n\n// Implements the Return() action.\nclass ReturnVoidAction {\n public:\n  // Allows Return() to be used in any void-returning function.\n  template <typename Result, typename ArgumentTuple>\n  static void Perform(const ArgumentTuple&) {\n    CompileAssertTypesEqual<void, Result>();\n  }\n};\n\n// Implements the polymorphic ReturnRef(x) action, which can be used\n// in any function that returns a reference to the type of x,\n// regardless of the argument types.\ntemplate <typename T>\nclass ReturnRefAction {\n public:\n  // Constructs a ReturnRefAction object from the reference to be returned.\n  explicit ReturnRefAction(T& ref) : ref_(ref) {}  // NOLINT\n\n  // This template type conversion operator allows ReturnRef(x) to be\n  // used in ANY function that returns a reference to x's type.\n  template <typename F>\n  operator Action<F>() const {\n    typedef typename Function<F>::Result Result;\n    // Asserts that the function return type is a reference.  This\n    // catches the user error of using ReturnRef(x) when Return(x)\n    // should be used, and generates some helpful error message.\n    GTEST_COMPILE_ASSERT_(internal::is_reference<Result>::value,\n                          use_Return_instead_of_ReturnRef_to_return_a_value);\n    return Action<F>(new Impl<F>(ref_));\n  }\n\n private:\n  // Implements the ReturnRef(x) action for a particular function type F.\n  template <typename F>\n  class Impl : public ActionInterface<F> {\n   public:\n    typedef typename Function<F>::Result Result;\n    typedef typename Function<F>::ArgumentTuple ArgumentTuple;\n\n    explicit Impl(T& ref) : ref_(ref) {}  // NOLINT\n\n    virtual Result Perform(const ArgumentTuple&) {\n      return ref_;\n    }\n\n   private:\n    T& ref_;\n\n    GTEST_DISALLOW_ASSIGN_(Impl);\n  };\n\n  T& ref_;\n\n  GTEST_DISALLOW_ASSIGN_(ReturnRefAction);\n};\n\n// Implements the polymorphic ReturnRefOfCopy(x) action, which can be\n// used in any function that returns a reference to the type of x,\n// regardless of the argument types.\ntemplate <typename T>\nclass ReturnRefOfCopyAction {\n public:\n  // Constructs a ReturnRefOfCopyAction object from the reference to\n  // be returned.\n  explicit ReturnRefOfCopyAction(const T& value) : value_(value) {}  // NOLINT\n\n  // This template type conversion operator allows ReturnRefOfCopy(x) to be\n  // used in ANY function that returns a reference to x's type.\n  template <typename F>\n  operator Action<F>() const {\n    typedef typename Function<F>::Result Result;\n    // Asserts that the function return type is a reference.  This\n    // catches the user error of using ReturnRefOfCopy(x) when Return(x)\n    // should be used, and generates some helpful error message.\n    GTEST_COMPILE_ASSERT_(\n        internal::is_reference<Result>::value,\n        use_Return_instead_of_ReturnRefOfCopy_to_return_a_value);\n    return Action<F>(new Impl<F>(value_));\n  }\n\n private:\n  // Implements the ReturnRefOfCopy(x) action for a particular function type F.\n  template <typename F>\n  class Impl : public ActionInterface<F> {\n   public:\n    typedef typename Function<F>::Result Result;\n    typedef typename Function<F>::ArgumentTuple ArgumentTuple;\n\n    explicit Impl(const T& value) : value_(value) {}  // NOLINT\n\n    virtual Result Perform(const ArgumentTuple&) {\n      return value_;\n    }\n\n   private:\n    T value_;\n\n    GTEST_DISALLOW_ASSIGN_(Impl);\n  };\n\n  const T value_;\n\n  GTEST_DISALLOW_ASSIGN_(ReturnRefOfCopyAction);\n};\n\n// Implements the polymorphic DoDefault() action.\nclass DoDefaultAction {\n public:\n  // This template type conversion operator allows DoDefault() to be\n  // used in any function.\n  template <typename F>\n  operator Action<F>() const { return Action<F>(); }  // NOLINT\n};\n\n// Implements the Assign action to set a given pointer referent to a\n// particular value.\ntemplate <typename T1, typename T2>\nclass AssignAction {\n public:\n  AssignAction(T1* ptr, T2 value) : ptr_(ptr), value_(value) {}\n\n  template <typename Result, typename ArgumentTuple>\n  void Perform(const ArgumentTuple& /* args */) const {\n    *ptr_ = value_;\n  }\n\n private:\n  T1* const ptr_;\n  const T2 value_;\n\n  GTEST_DISALLOW_ASSIGN_(AssignAction);\n};\n\n#if !GTEST_OS_WINDOWS_MOBILE\n\n// Implements the SetErrnoAndReturn action to simulate return from\n// various system calls and libc functions.\ntemplate <typename T>\nclass SetErrnoAndReturnAction {\n public:\n  SetErrnoAndReturnAction(int errno_value, T result)\n      : errno_(errno_value),\n        result_(result) {}\n  template <typename Result, typename ArgumentTuple>\n  Result Perform(const ArgumentTuple& /* args */) const {\n    errno = errno_;\n    return result_;\n  }\n\n private:\n  const int errno_;\n  const T result_;\n\n  GTEST_DISALLOW_ASSIGN_(SetErrnoAndReturnAction);\n};\n\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\n// Implements the SetArgumentPointee<N>(x) action for any function\n// whose N-th argument (0-based) is a pointer to x's type.  The\n// template parameter kIsProto is true iff type A is ProtocolMessage,\n// proto2::Message, or a sub-class of those.\ntemplate <size_t N, typename A, bool kIsProto>\nclass SetArgumentPointeeAction {\n public:\n  // Constructs an action that sets the variable pointed to by the\n  // N-th function argument to 'value'.\n  explicit SetArgumentPointeeAction(const A& value) : value_(value) {}\n\n  template <typename Result, typename ArgumentTuple>\n  void Perform(const ArgumentTuple& args) const {\n    CompileAssertTypesEqual<void, Result>();\n    *::testing::get<N>(args) = value_;\n  }\n\n private:\n  const A value_;\n\n  GTEST_DISALLOW_ASSIGN_(SetArgumentPointeeAction);\n};\n\ntemplate <size_t N, typename Proto>\nclass SetArgumentPointeeAction<N, Proto, true> {\n public:\n  // Constructs an action that sets the variable pointed to by the\n  // N-th function argument to 'proto'.  Both ProtocolMessage and\n  // proto2::Message have the CopyFrom() method, so the same\n  // implementation works for both.\n  explicit SetArgumentPointeeAction(const Proto& proto) : proto_(new Proto) {\n    proto_->CopyFrom(proto);\n  }\n\n  template <typename Result, typename ArgumentTuple>\n  void Perform(const ArgumentTuple& args) const {\n    CompileAssertTypesEqual<void, Result>();\n    ::testing::get<N>(args)->CopyFrom(*proto_);\n  }\n\n private:\n  const internal::linked_ptr<Proto> proto_;\n\n  GTEST_DISALLOW_ASSIGN_(SetArgumentPointeeAction);\n};\n\n// Implements the InvokeWithoutArgs(f) action.  The template argument\n// FunctionImpl is the implementation type of f, which can be either a\n// function pointer or a functor.  InvokeWithoutArgs(f) can be used as an\n// Action<F> as long as f's type is compatible with F (i.e. f can be\n// assigned to a tr1::function<F>).\ntemplate <typename FunctionImpl>\nclass InvokeWithoutArgsAction {\n public:\n  // The c'tor makes a copy of function_impl (either a function\n  // pointer or a functor).\n  explicit InvokeWithoutArgsAction(FunctionImpl function_impl)\n      : function_impl_(function_impl) {}\n\n  // Allows InvokeWithoutArgs(f) to be used as any action whose type is\n  // compatible with f.\n  template <typename Result, typename ArgumentTuple>\n  Result Perform(const ArgumentTuple&) { return function_impl_(); }\n\n private:\n  FunctionImpl function_impl_;\n\n  GTEST_DISALLOW_ASSIGN_(InvokeWithoutArgsAction);\n};\n\n// Implements the InvokeWithoutArgs(object_ptr, &Class::Method) action.\ntemplate <class Class, typename MethodPtr>\nclass InvokeMethodWithoutArgsAction {\n public:\n  InvokeMethodWithoutArgsAction(Class* obj_ptr, MethodPtr method_ptr)\n      : obj_ptr_(obj_ptr), method_ptr_(method_ptr) {}\n\n  template <typename Result, typename ArgumentTuple>\n  Result Perform(const ArgumentTuple&) const {\n    return (obj_ptr_->*method_ptr_)();\n  }\n\n private:\n  Class* const obj_ptr_;\n  const MethodPtr method_ptr_;\n\n  GTEST_DISALLOW_ASSIGN_(InvokeMethodWithoutArgsAction);\n};\n\n// Implements the InvokeWithoutArgs(callback) action.\ntemplate <typename CallbackType>\nclass InvokeCallbackWithoutArgsAction {\n public:\n  // The c'tor takes ownership of the callback.\n  explicit InvokeCallbackWithoutArgsAction(CallbackType* callback)\n      : callback_(callback) {\n    callback->CheckIsRepeatable();  // Makes sure the callback is permanent.\n  }\n\n  // This type conversion operator template allows Invoke(callback) to\n  // be used wherever the callback's return type can be implicitly\n  // converted to that of the mock function.\n  template <typename Result, typename ArgumentTuple>\n  Result Perform(const ArgumentTuple&) const { return callback_->Run(); }\n\n private:\n  const internal::linked_ptr<CallbackType> callback_;\n\n  GTEST_DISALLOW_ASSIGN_(InvokeCallbackWithoutArgsAction);\n};\n\n// Implements the IgnoreResult(action) action.\ntemplate <typename A>\nclass IgnoreResultAction {\n public:\n  explicit IgnoreResultAction(const A& action) : action_(action) {}\n\n  template <typename F>\n  operator Action<F>() const {\n    // Assert statement belongs here because this is the best place to verify\n    // conditions on F. It produces the clearest error messages\n    // in most compilers.\n    // Impl really belongs in this scope as a local class but can't\n    // because MSVC produces duplicate symbols in different translation units\n    // in this case. Until MS fixes that bug we put Impl into the class scope\n    // and put the typedef both here (for use in assert statement) and\n    // in the Impl class. But both definitions must be the same.\n    typedef typename internal::Function<F>::Result Result;\n\n    // Asserts at compile time that F returns void.\n    CompileAssertTypesEqual<void, Result>();\n\n    return Action<F>(new Impl<F>(action_));\n  }\n\n private:\n  template <typename F>\n  class Impl : public ActionInterface<F> {\n   public:\n    typedef typename internal::Function<F>::Result Result;\n    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n    explicit Impl(const A& action) : action_(action) {}\n\n    virtual void Perform(const ArgumentTuple& args) {\n      // Performs the action and ignores its result.\n      action_.Perform(args);\n    }\n\n   private:\n    // Type OriginalFunction is the same as F except that its return\n    // type is IgnoredValue.\n    typedef typename internal::Function<F>::MakeResultIgnoredValue\n        OriginalFunction;\n\n    const Action<OriginalFunction> action_;\n\n    GTEST_DISALLOW_ASSIGN_(Impl);\n  };\n\n  const A action_;\n\n  GTEST_DISALLOW_ASSIGN_(IgnoreResultAction);\n};\n\n// A ReferenceWrapper<T> object represents a reference to type T,\n// which can be either const or not.  It can be explicitly converted\n// from, and implicitly converted to, a T&.  Unlike a reference,\n// ReferenceWrapper<T> can be copied and can survive template type\n// inference.  This is used to support by-reference arguments in the\n// InvokeArgument<N>(...) action.  The idea was from \"reference\n// wrappers\" in tr1, which we don't have in our source tree yet.\ntemplate <typename T>\nclass ReferenceWrapper {\n public:\n  // Constructs a ReferenceWrapper<T> object from a T&.\n  explicit ReferenceWrapper(T& l_value) : pointer_(&l_value) {}  // NOLINT\n\n  // Allows a ReferenceWrapper<T> object to be implicitly converted to\n  // a T&.\n  operator T&() const { return *pointer_; }\n private:\n  T* pointer_;\n};\n\n// Allows the expression ByRef(x) to be printed as a reference to x.\ntemplate <typename T>\nvoid PrintTo(const ReferenceWrapper<T>& ref, ::std::ostream* os) {\n  T& value = ref;\n  UniversalPrinter<T&>::Print(value, os);\n}\n\n// Does two actions sequentially.  Used for implementing the DoAll(a1,\n// a2, ...) action.\ntemplate <typename Action1, typename Action2>\nclass DoBothAction {\n public:\n  DoBothAction(Action1 action1, Action2 action2)\n      : action1_(action1), action2_(action2) {}\n\n  // This template type conversion operator allows DoAll(a1, ..., a_n)\n  // to be used in ANY function of compatible type.\n  template <typename F>\n  operator Action<F>() const {\n    return Action<F>(new Impl<F>(action1_, action2_));\n  }\n\n private:\n  // Implements the DoAll(...) action for a particular function type F.\n  template <typename F>\n  class Impl : public ActionInterface<F> {\n   public:\n    typedef typename Function<F>::Result Result;\n    typedef typename Function<F>::ArgumentTuple ArgumentTuple;\n    typedef typename Function<F>::MakeResultVoid VoidResult;\n\n    Impl(const Action<VoidResult>& action1, const Action<F>& action2)\n        : action1_(action1), action2_(action2) {}\n\n    virtual Result Perform(const ArgumentTuple& args) {\n      action1_.Perform(args);\n      return action2_.Perform(args);\n    }\n\n   private:\n    const Action<VoidResult> action1_;\n    const Action<F> action2_;\n\n    GTEST_DISALLOW_ASSIGN_(Impl);\n  };\n\n  Action1 action1_;\n  Action2 action2_;\n\n  GTEST_DISALLOW_ASSIGN_(DoBothAction);\n};\n\n}  // namespace internal\n\n// An Unused object can be implicitly constructed from ANY value.\n// This is handy when defining actions that ignore some or all of the\n// mock function arguments.  For example, given\n//\n//   MOCK_METHOD3(Foo, double(const string& label, double x, double y));\n//   MOCK_METHOD3(Bar, double(int index, double x, double y));\n//\n// instead of\n//\n//   double DistanceToOriginWithLabel(const string& label, double x, double y) {\n//     return sqrt(x*x + y*y);\n//   }\n//   double DistanceToOriginWithIndex(int index, double x, double y) {\n//     return sqrt(x*x + y*y);\n//   }\n//   ...\n//   EXPECT_CALL(mock, Foo(\"abc\", _, _))\n//       .WillOnce(Invoke(DistanceToOriginWithLabel));\n//   EXPECT_CALL(mock, Bar(5, _, _))\n//       .WillOnce(Invoke(DistanceToOriginWithIndex));\n//\n// you could write\n//\n//   // We can declare any uninteresting argument as Unused.\n//   double DistanceToOrigin(Unused, double x, double y) {\n//     return sqrt(x*x + y*y);\n//   }\n//   ...\n//   EXPECT_CALL(mock, Foo(\"abc\", _, _)).WillOnce(Invoke(DistanceToOrigin));\n//   EXPECT_CALL(mock, Bar(5, _, _)).WillOnce(Invoke(DistanceToOrigin));\ntypedef internal::IgnoredValue Unused;\n\n// This constructor allows us to turn an Action<From> object into an\n// Action<To>, as long as To's arguments can be implicitly converted\n// to From's and From's return type cann be implicitly converted to\n// To's.\ntemplate <typename To>\ntemplate <typename From>\nAction<To>::Action(const Action<From>& from)\n    :\n#if GTEST_LANG_CXX11\n      fun_(from.fun_),\n#endif\n      impl_(from.impl_ == NULL ? NULL\n                               : new internal::ActionAdaptor<To, From>(from)) {\n}\n\n// Creates an action that returns 'value'.  'value' is passed by value\n// instead of const reference - otherwise Return(\"string literal\")\n// will trigger a compiler error about using array as initializer.\ntemplate <typename R>\ninternal::ReturnAction<R> Return(R value) {\n  return internal::ReturnAction<R>(internal::move(value));\n}\n\n// Creates an action that returns NULL.\ninline PolymorphicAction<internal::ReturnNullAction> ReturnNull() {\n  return MakePolymorphicAction(internal::ReturnNullAction());\n}\n\n// Creates an action that returns from a void function.\ninline PolymorphicAction<internal::ReturnVoidAction> Return() {\n  return MakePolymorphicAction(internal::ReturnVoidAction());\n}\n\n// Creates an action that returns the reference to a variable.\ntemplate <typename R>\ninline internal::ReturnRefAction<R> ReturnRef(R& x) {  // NOLINT\n  return internal::ReturnRefAction<R>(x);\n}\n\n// Creates an action that returns the reference to a copy of the\n// argument.  The copy is created when the action is constructed and\n// lives as long as the action.\ntemplate <typename R>\ninline internal::ReturnRefOfCopyAction<R> ReturnRefOfCopy(const R& x) {\n  return internal::ReturnRefOfCopyAction<R>(x);\n}\n\n// Modifies the parent action (a Return() action) to perform a move of the\n// argument instead of a copy.\n// Return(ByMove()) actions can only be executed once and will assert this\n// invariant.\ntemplate <typename R>\ninternal::ByMoveWrapper<R> ByMove(R x) {\n  return internal::ByMoveWrapper<R>(internal::move(x));\n}\n\n// Creates an action that does the default action for the give mock function.\ninline internal::DoDefaultAction DoDefault() {\n  return internal::DoDefaultAction();\n}\n\n// Creates an action that sets the variable pointed by the N-th\n// (0-based) function argument to 'value'.\ntemplate <size_t N, typename T>\nPolymorphicAction<\n  internal::SetArgumentPointeeAction<\n    N, T, internal::IsAProtocolMessage<T>::value> >\nSetArgPointee(const T& x) {\n  return MakePolymorphicAction(internal::SetArgumentPointeeAction<\n      N, T, internal::IsAProtocolMessage<T>::value>(x));\n}\n\n#if !((GTEST_GCC_VER_ && GTEST_GCC_VER_ < 40000) || GTEST_OS_SYMBIAN)\n// This overload allows SetArgPointee() to accept a string literal.\n// GCC prior to the version 4.0 and Symbian C++ compiler cannot distinguish\n// this overload from the templated version and emit a compile error.\ntemplate <size_t N>\nPolymorphicAction<\n  internal::SetArgumentPointeeAction<N, const char*, false> >\nSetArgPointee(const char* p) {\n  return MakePolymorphicAction(internal::SetArgumentPointeeAction<\n      N, const char*, false>(p));\n}\n\ntemplate <size_t N>\nPolymorphicAction<\n  internal::SetArgumentPointeeAction<N, const wchar_t*, false> >\nSetArgPointee(const wchar_t* p) {\n  return MakePolymorphicAction(internal::SetArgumentPointeeAction<\n      N, const wchar_t*, false>(p));\n}\n#endif\n\n// The following version is DEPRECATED.\ntemplate <size_t N, typename T>\nPolymorphicAction<\n  internal::SetArgumentPointeeAction<\n    N, T, internal::IsAProtocolMessage<T>::value> >\nSetArgumentPointee(const T& x) {\n  return MakePolymorphicAction(internal::SetArgumentPointeeAction<\n      N, T, internal::IsAProtocolMessage<T>::value>(x));\n}\n\n// Creates an action that sets a pointer referent to a given value.\ntemplate <typename T1, typename T2>\nPolymorphicAction<internal::AssignAction<T1, T2> > Assign(T1* ptr, T2 val) {\n  return MakePolymorphicAction(internal::AssignAction<T1, T2>(ptr, val));\n}\n\n#if !GTEST_OS_WINDOWS_MOBILE\n\n// Creates an action that sets errno and returns the appropriate error.\ntemplate <typename T>\nPolymorphicAction<internal::SetErrnoAndReturnAction<T> >\nSetErrnoAndReturn(int errval, T result) {\n  return MakePolymorphicAction(\n      internal::SetErrnoAndReturnAction<T>(errval, result));\n}\n\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\n// Various overloads for InvokeWithoutArgs().\n\n// Creates an action that invokes 'function_impl' with no argument.\ntemplate <typename FunctionImpl>\nPolymorphicAction<internal::InvokeWithoutArgsAction<FunctionImpl> >\nInvokeWithoutArgs(FunctionImpl function_impl) {\n  return MakePolymorphicAction(\n      internal::InvokeWithoutArgsAction<FunctionImpl>(function_impl));\n}\n\n// Creates an action that invokes the given method on the given object\n// with no argument.\ntemplate <class Class, typename MethodPtr>\nPolymorphicAction<internal::InvokeMethodWithoutArgsAction<Class, MethodPtr> >\nInvokeWithoutArgs(Class* obj_ptr, MethodPtr method_ptr) {\n  return MakePolymorphicAction(\n      internal::InvokeMethodWithoutArgsAction<Class, MethodPtr>(\n          obj_ptr, method_ptr));\n}\n\n// Creates an action that performs an_action and throws away its\n// result.  In other words, it changes the return type of an_action to\n// void.  an_action MUST NOT return void, or the code won't compile.\ntemplate <typename A>\ninline internal::IgnoreResultAction<A> IgnoreResult(const A& an_action) {\n  return internal::IgnoreResultAction<A>(an_action);\n}\n\n// Creates a reference wrapper for the given L-value.  If necessary,\n// you can explicitly specify the type of the reference.  For example,\n// suppose 'derived' is an object of type Derived, ByRef(derived)\n// would wrap a Derived&.  If you want to wrap a const Base& instead,\n// where Base is a base class of Derived, just write:\n//\n//   ByRef<const Base>(derived)\ntemplate <typename T>\ninline internal::ReferenceWrapper<T> ByRef(T& l_value) {  // NOLINT\n  return internal::ReferenceWrapper<T>(l_value);\n}\n\n}  // namespace testing\n\n#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/gmock-cardinalities.h",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements some commonly used cardinalities.  More\n// cardinalities can be defined by the user implementing the\n// CardinalityInterface interface if necessary.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_\n#define GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_\n\n#include <limits.h>\n#include <ostream>  // NOLINT\n#include \"gmock/internal/gmock-port.h\"\n#include \"gtest/gtest.h\"\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\nnamespace testing {\n\n// To implement a cardinality Foo, define:\n//   1. a class FooCardinality that implements the\n//      CardinalityInterface interface, and\n//   2. a factory function that creates a Cardinality object from a\n//      const FooCardinality*.\n//\n// The two-level delegation design follows that of Matcher, providing\n// consistency for extension developers.  It also eases ownership\n// management as Cardinality objects can now be copied like plain values.\n\n// The implementation of a cardinality.\nclass CardinalityInterface {\n public:\n  virtual ~CardinalityInterface() {}\n\n  // Conservative estimate on the lower/upper bound of the number of\n  // calls allowed.\n  virtual int ConservativeLowerBound() const { return 0; }\n  virtual int ConservativeUpperBound() const { return INT_MAX; }\n\n  // Returns true iff call_count calls will satisfy this cardinality.\n  virtual bool IsSatisfiedByCallCount(int call_count) const = 0;\n\n  // Returns true iff call_count calls will saturate this cardinality.\n  virtual bool IsSaturatedByCallCount(int call_count) const = 0;\n\n  // Describes self to an ostream.\n  virtual void DescribeTo(::std::ostream* os) const = 0;\n};\n\n// A Cardinality is a copyable and IMMUTABLE (except by assignment)\n// object that specifies how many times a mock function is expected to\n// be called.  The implementation of Cardinality is just a linked_ptr\n// to const CardinalityInterface, so copying is fairly cheap.\n// Don't inherit from Cardinality!\nclass GTEST_API_ Cardinality {\n public:\n  // Constructs a null cardinality.  Needed for storing Cardinality\n  // objects in STL containers.\n  Cardinality() {}\n\n  // Constructs a Cardinality from its implementation.\n  explicit Cardinality(const CardinalityInterface* impl) : impl_(impl) {}\n\n  // Conservative estimate on the lower/upper bound of the number of\n  // calls allowed.\n  int ConservativeLowerBound() const { return impl_->ConservativeLowerBound(); }\n  int ConservativeUpperBound() const { return impl_->ConservativeUpperBound(); }\n\n  // Returns true iff call_count calls will satisfy this cardinality.\n  bool IsSatisfiedByCallCount(int call_count) const {\n    return impl_->IsSatisfiedByCallCount(call_count);\n  }\n\n  // Returns true iff call_count calls will saturate this cardinality.\n  bool IsSaturatedByCallCount(int call_count) const {\n    return impl_->IsSaturatedByCallCount(call_count);\n  }\n\n  // Returns true iff call_count calls will over-saturate this\n  // cardinality, i.e. exceed the maximum number of allowed calls.\n  bool IsOverSaturatedByCallCount(int call_count) const {\n    return impl_->IsSaturatedByCallCount(call_count) &&\n        !impl_->IsSatisfiedByCallCount(call_count);\n  }\n\n  // Describes self to an ostream\n  void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); }\n\n  // Describes the given actual call count to an ostream.\n  static void DescribeActualCallCountTo(int actual_call_count,\n                                        ::std::ostream* os);\n\n private:\n  internal::linked_ptr<const CardinalityInterface> impl_;\n};\n\n// Creates a cardinality that allows at least n calls.\nGTEST_API_ Cardinality AtLeast(int n);\n\n// Creates a cardinality that allows at most n calls.\nGTEST_API_ Cardinality AtMost(int n);\n\n// Creates a cardinality that allows any number of calls.\nGTEST_API_ Cardinality AnyNumber();\n\n// Creates a cardinality that allows between min and max calls.\nGTEST_API_ Cardinality Between(int min, int max);\n\n// Creates a cardinality that allows exactly n calls.\nGTEST_API_ Cardinality Exactly(int n);\n\n// Creates a cardinality from its implementation.\ninline Cardinality MakeCardinality(const CardinalityInterface* c) {\n  return Cardinality(c);\n}\n\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/gmock-generated-actions.h",
    "content": "// This file was GENERATED by command:\n//     pump.py gmock-generated-actions.h.pump\n// DO NOT EDIT BY HAND!!!\n\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements some commonly used variadic actions.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_\n#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_\n\n#include \"gmock/gmock-actions.h\"\n#include \"gmock/internal/gmock-port.h\"\n\nnamespace testing {\nnamespace internal {\n\n// InvokeHelper<F> knows how to unpack an N-tuple and invoke an N-ary\n// function, method, or callback with the unpacked values, where F is\n// a function type that takes N arguments.\ntemplate <typename Result, typename ArgumentTuple>\nclass InvokeHelper;\n\ntemplate <typename R>\nclass InvokeHelper<R, ::testing::tuple<> > {\n public:\n  template <typename Function>\n  static R Invoke(Function function, const ::testing::tuple<>&) {\n           return function();\n  }\n\n  template <class Class, typename MethodPtr>\n  static R InvokeMethod(Class* obj_ptr,\n                        MethodPtr method_ptr,\n                        const ::testing::tuple<>&) {\n           return (obj_ptr->*method_ptr)();\n  }\n\n  template <typename CallbackType>\n  static R InvokeCallback(CallbackType* callback,\n                          const ::testing::tuple<>&) {\n           return callback->Run();\n  }\n};\n\ntemplate <typename R, typename A1>\nclass InvokeHelper<R, ::testing::tuple<A1> > {\n public:\n  template <typename Function>\n  static R Invoke(Function function, const ::testing::tuple<A1>& args) {\n           return function(get<0>(args));\n  }\n\n  template <class Class, typename MethodPtr>\n  static R InvokeMethod(Class* obj_ptr,\n                        MethodPtr method_ptr,\n                        const ::testing::tuple<A1>& args) {\n           return (obj_ptr->*method_ptr)(get<0>(args));\n  }\n\n  template <typename CallbackType>\n  static R InvokeCallback(CallbackType* callback,\n                          const ::testing::tuple<A1>& args) {\n           return callback->Run(get<0>(args));\n  }\n};\n\ntemplate <typename R, typename A1, typename A2>\nclass InvokeHelper<R, ::testing::tuple<A1, A2> > {\n public:\n  template <typename Function>\n  static R Invoke(Function function, const ::testing::tuple<A1, A2>& args) {\n           return function(get<0>(args), get<1>(args));\n  }\n\n  template <class Class, typename MethodPtr>\n  static R InvokeMethod(Class* obj_ptr,\n                        MethodPtr method_ptr,\n                        const ::testing::tuple<A1, A2>& args) {\n           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args));\n  }\n\n  template <typename CallbackType>\n  static R InvokeCallback(CallbackType* callback,\n                          const ::testing::tuple<A1, A2>& args) {\n           return callback->Run(get<0>(args), get<1>(args));\n  }\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3>\nclass InvokeHelper<R, ::testing::tuple<A1, A2, A3> > {\n public:\n  template <typename Function>\n  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3>& args) {\n           return function(get<0>(args), get<1>(args), get<2>(args));\n  }\n\n  template <class Class, typename MethodPtr>\n  static R InvokeMethod(Class* obj_ptr,\n                        MethodPtr method_ptr,\n                        const ::testing::tuple<A1, A2, A3>& args) {\n           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),\n               get<2>(args));\n  }\n\n  template <typename CallbackType>\n  static R InvokeCallback(CallbackType* callback,\n                          const ::testing::tuple<A1, A2, A3>& args) {\n           return callback->Run(get<0>(args), get<1>(args), get<2>(args));\n  }\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4>\nclass InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4> > {\n public:\n  template <typename Function>\n  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3,\n      A4>& args) {\n           return function(get<0>(args), get<1>(args), get<2>(args),\n               get<3>(args));\n  }\n\n  template <class Class, typename MethodPtr>\n  static R InvokeMethod(Class* obj_ptr,\n                        MethodPtr method_ptr,\n                        const ::testing::tuple<A1, A2, A3, A4>& args) {\n           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),\n               get<2>(args), get<3>(args));\n  }\n\n  template <typename CallbackType>\n  static R InvokeCallback(CallbackType* callback,\n                          const ::testing::tuple<A1, A2, A3, A4>& args) {\n           return callback->Run(get<0>(args), get<1>(args), get<2>(args),\n               get<3>(args));\n  }\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5>\nclass InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5> > {\n public:\n  template <typename Function>\n  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4,\n      A5>& args) {\n           return function(get<0>(args), get<1>(args), get<2>(args),\n               get<3>(args), get<4>(args));\n  }\n\n  template <class Class, typename MethodPtr>\n  static R InvokeMethod(Class* obj_ptr,\n                        MethodPtr method_ptr,\n                        const ::testing::tuple<A1, A2, A3, A4, A5>& args) {\n           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),\n               get<2>(args), get<3>(args), get<4>(args));\n  }\n\n  template <typename CallbackType>\n  static R InvokeCallback(CallbackType* callback,\n                          const ::testing::tuple<A1, A2, A3, A4, A5>& args) {\n           return callback->Run(get<0>(args), get<1>(args), get<2>(args),\n               get<3>(args), get<4>(args));\n  }\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5, typename A6>\nclass InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6> > {\n public:\n  template <typename Function>\n  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,\n      A6>& args) {\n           return function(get<0>(args), get<1>(args), get<2>(args),\n               get<3>(args), get<4>(args), get<5>(args));\n  }\n\n  template <class Class, typename MethodPtr>\n  static R InvokeMethod(Class* obj_ptr,\n                        MethodPtr method_ptr,\n                        const ::testing::tuple<A1, A2, A3, A4, A5, A6>& args) {\n           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),\n               get<2>(args), get<3>(args), get<4>(args), get<5>(args));\n  }\n\n  // There is no InvokeCallback() for 6-tuples\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5, typename A6, typename A7>\nclass InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> > {\n public:\n  template <typename Function>\n  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,\n      A6, A7>& args) {\n           return function(get<0>(args), get<1>(args), get<2>(args),\n               get<3>(args), get<4>(args), get<5>(args), get<6>(args));\n  }\n\n  template <class Class, typename MethodPtr>\n  static R InvokeMethod(Class* obj_ptr,\n                        MethodPtr method_ptr,\n                        const ::testing::tuple<A1, A2, A3, A4, A5, A6,\n                            A7>& args) {\n           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),\n               get<2>(args), get<3>(args), get<4>(args), get<5>(args),\n               get<6>(args));\n  }\n\n  // There is no InvokeCallback() for 7-tuples\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5, typename A6, typename A7, typename A8>\nclass InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > {\n public:\n  template <typename Function>\n  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,\n      A6, A7, A8>& args) {\n           return function(get<0>(args), get<1>(args), get<2>(args),\n               get<3>(args), get<4>(args), get<5>(args), get<6>(args),\n               get<7>(args));\n  }\n\n  template <class Class, typename MethodPtr>\n  static R InvokeMethod(Class* obj_ptr,\n                        MethodPtr method_ptr,\n                        const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7,\n                            A8>& args) {\n           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),\n               get<2>(args), get<3>(args), get<4>(args), get<5>(args),\n               get<6>(args), get<7>(args));\n  }\n\n  // There is no InvokeCallback() for 8-tuples\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5, typename A6, typename A7, typename A8, typename A9>\nclass InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > {\n public:\n  template <typename Function>\n  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,\n      A6, A7, A8, A9>& args) {\n           return function(get<0>(args), get<1>(args), get<2>(args),\n               get<3>(args), get<4>(args), get<5>(args), get<6>(args),\n               get<7>(args), get<8>(args));\n  }\n\n  template <class Class, typename MethodPtr>\n  static R InvokeMethod(Class* obj_ptr,\n                        MethodPtr method_ptr,\n                        const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8,\n                            A9>& args) {\n           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),\n               get<2>(args), get<3>(args), get<4>(args), get<5>(args),\n               get<6>(args), get<7>(args), get<8>(args));\n  }\n\n  // There is no InvokeCallback() for 9-tuples\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5, typename A6, typename A7, typename A8, typename A9,\n    typename A10>\nclass InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,\n    A10> > {\n public:\n  template <typename Function>\n  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,\n      A6, A7, A8, A9, A10>& args) {\n           return function(get<0>(args), get<1>(args), get<2>(args),\n               get<3>(args), get<4>(args), get<5>(args), get<6>(args),\n               get<7>(args), get<8>(args), get<9>(args));\n  }\n\n  template <class Class, typename MethodPtr>\n  static R InvokeMethod(Class* obj_ptr,\n                        MethodPtr method_ptr,\n                        const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8,\n                            A9, A10>& args) {\n           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),\n               get<2>(args), get<3>(args), get<4>(args), get<5>(args),\n               get<6>(args), get<7>(args), get<8>(args), get<9>(args));\n  }\n\n  // There is no InvokeCallback() for 10-tuples\n};\n\n// Implements the Invoke(callback) action.\ntemplate <typename CallbackType>\nclass InvokeCallbackAction {\n public:\n  // The c'tor takes ownership of the callback.\n  explicit InvokeCallbackAction(CallbackType* callback)\n      : callback_(callback) {\n    callback->CheckIsRepeatable();  // Makes sure the callback is permanent.\n  }\n\n  // This type conversion operator template allows Invoke(callback) to\n  // be used wherever the callback's type is compatible with that of\n  // the mock function, i.e. if the mock function's arguments can be\n  // implicitly converted to the callback's arguments and the\n  // callback's result can be implicitly converted to the mock\n  // function's result.\n  template <typename Result, typename ArgumentTuple>\n  Result Perform(const ArgumentTuple& args) const {\n    return InvokeHelper<Result, ArgumentTuple>::InvokeCallback(\n        callback_.get(), args);\n  }\n private:\n  const linked_ptr<CallbackType> callback_;\n};\n\n// An INTERNAL macro for extracting the type of a tuple field.  It's\n// subject to change without notice - DO NOT USE IN USER CODE!\n#define GMOCK_FIELD_(Tuple, N) \\\n    typename ::testing::tuple_element<N, Tuple>::type\n\n// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::type is the\n// type of an n-ary function whose i-th (1-based) argument type is the\n// k{i}-th (0-based) field of ArgumentTuple, which must be a tuple\n// type, and whose return type is Result.  For example,\n//   SelectArgs<int, ::testing::tuple<bool, char, double, long>, 0, 3>::type\n// is int(bool, long).\n//\n// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::Select(args)\n// returns the selected fields (k1, k2, ..., k_n) of args as a tuple.\n// For example,\n//   SelectArgs<int, tuple<bool, char, double>, 2, 0>::Select(\n//       ::testing::make_tuple(true, 'a', 2.5))\n// returns tuple (2.5, true).\n//\n// The numbers in list k1, k2, ..., k_n must be >= 0, where n can be\n// in the range [0, 10].  Duplicates are allowed and they don't have\n// to be in an ascending or descending order.\n\ntemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,\n    int k4, int k5, int k6, int k7, int k8, int k9, int k10>\nclass SelectArgs {\n public:\n  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),\n      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),\n      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),\n      GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),\n      GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9),\n      GMOCK_FIELD_(ArgumentTuple, k10));\n  typedef typename Function<type>::ArgumentTuple SelectedArgs;\n  static SelectedArgs Select(const ArgumentTuple& args) {\n    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),\n        get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),\n        get<k8>(args), get<k9>(args), get<k10>(args));\n  }\n};\n\ntemplate <typename Result, typename ArgumentTuple>\nclass SelectArgs<Result, ArgumentTuple,\n                 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {\n public:\n  typedef Result type();\n  typedef typename Function<type>::ArgumentTuple SelectedArgs;\n  static SelectedArgs Select(const ArgumentTuple& /* args */) {\n    return SelectedArgs();\n  }\n};\n\ntemplate <typename Result, typename ArgumentTuple, int k1>\nclass SelectArgs<Result, ArgumentTuple,\n                 k1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {\n public:\n  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1));\n  typedef typename Function<type>::ArgumentTuple SelectedArgs;\n  static SelectedArgs Select(const ArgumentTuple& args) {\n    return SelectedArgs(get<k1>(args));\n  }\n};\n\ntemplate <typename Result, typename ArgumentTuple, int k1, int k2>\nclass SelectArgs<Result, ArgumentTuple,\n                 k1, k2, -1, -1, -1, -1, -1, -1, -1, -1> {\n public:\n  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),\n      GMOCK_FIELD_(ArgumentTuple, k2));\n  typedef typename Function<type>::ArgumentTuple SelectedArgs;\n  static SelectedArgs Select(const ArgumentTuple& args) {\n    return SelectedArgs(get<k1>(args), get<k2>(args));\n  }\n};\n\ntemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3>\nclass SelectArgs<Result, ArgumentTuple,\n                 k1, k2, k3, -1, -1, -1, -1, -1, -1, -1> {\n public:\n  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),\n      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3));\n  typedef typename Function<type>::ArgumentTuple SelectedArgs;\n  static SelectedArgs Select(const ArgumentTuple& args) {\n    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args));\n  }\n};\n\ntemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,\n    int k4>\nclass SelectArgs<Result, ArgumentTuple,\n                 k1, k2, k3, k4, -1, -1, -1, -1, -1, -1> {\n public:\n  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),\n      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),\n      GMOCK_FIELD_(ArgumentTuple, k4));\n  typedef typename Function<type>::ArgumentTuple SelectedArgs;\n  static SelectedArgs Select(const ArgumentTuple& args) {\n    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),\n        get<k4>(args));\n  }\n};\n\ntemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,\n    int k4, int k5>\nclass SelectArgs<Result, ArgumentTuple,\n                 k1, k2, k3, k4, k5, -1, -1, -1, -1, -1> {\n public:\n  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),\n      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),\n      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5));\n  typedef typename Function<type>::ArgumentTuple SelectedArgs;\n  static SelectedArgs Select(const ArgumentTuple& args) {\n    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),\n        get<k4>(args), get<k5>(args));\n  }\n};\n\ntemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,\n    int k4, int k5, int k6>\nclass SelectArgs<Result, ArgumentTuple,\n                 k1, k2, k3, k4, k5, k6, -1, -1, -1, -1> {\n public:\n  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),\n      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),\n      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),\n      GMOCK_FIELD_(ArgumentTuple, k6));\n  typedef typename Function<type>::ArgumentTuple SelectedArgs;\n  static SelectedArgs Select(const ArgumentTuple& args) {\n    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),\n        get<k4>(args), get<k5>(args), get<k6>(args));\n  }\n};\n\ntemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,\n    int k4, int k5, int k6, int k7>\nclass SelectArgs<Result, ArgumentTuple,\n                 k1, k2, k3, k4, k5, k6, k7, -1, -1, -1> {\n public:\n  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),\n      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),\n      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),\n      GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7));\n  typedef typename Function<type>::ArgumentTuple SelectedArgs;\n  static SelectedArgs Select(const ArgumentTuple& args) {\n    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),\n        get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args));\n  }\n};\n\ntemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,\n    int k4, int k5, int k6, int k7, int k8>\nclass SelectArgs<Result, ArgumentTuple,\n                 k1, k2, k3, k4, k5, k6, k7, k8, -1, -1> {\n public:\n  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),\n      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),\n      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),\n      GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),\n      GMOCK_FIELD_(ArgumentTuple, k8));\n  typedef typename Function<type>::ArgumentTuple SelectedArgs;\n  static SelectedArgs Select(const ArgumentTuple& args) {\n    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),\n        get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),\n        get<k8>(args));\n  }\n};\n\ntemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,\n    int k4, int k5, int k6, int k7, int k8, int k9>\nclass SelectArgs<Result, ArgumentTuple,\n                 k1, k2, k3, k4, k5, k6, k7, k8, k9, -1> {\n public:\n  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),\n      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),\n      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),\n      GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),\n      GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9));\n  typedef typename Function<type>::ArgumentTuple SelectedArgs;\n  static SelectedArgs Select(const ArgumentTuple& args) {\n    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),\n        get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),\n        get<k8>(args), get<k9>(args));\n  }\n};\n\n#undef GMOCK_FIELD_\n\n// Implements the WithArgs action.\ntemplate <typename InnerAction, int k1 = -1, int k2 = -1, int k3 = -1,\n    int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,\n    int k9 = -1, int k10 = -1>\nclass WithArgsAction {\n public:\n  explicit WithArgsAction(const InnerAction& action) : action_(action) {}\n\n  template <typename F>\n  operator Action<F>() const { return MakeAction(new Impl<F>(action_)); }\n\n private:\n  template <typename F>\n  class Impl : public ActionInterface<F> {\n   public:\n    typedef typename Function<F>::Result Result;\n    typedef typename Function<F>::ArgumentTuple ArgumentTuple;\n\n    explicit Impl(const InnerAction& action) : action_(action) {}\n\n    virtual Result Perform(const ArgumentTuple& args) {\n      return action_.Perform(SelectArgs<Result, ArgumentTuple, k1, k2, k3, k4,\n          k5, k6, k7, k8, k9, k10>::Select(args));\n    }\n\n   private:\n    typedef typename SelectArgs<Result, ArgumentTuple,\n        k1, k2, k3, k4, k5, k6, k7, k8, k9, k10>::type InnerFunctionType;\n\n    Action<InnerFunctionType> action_;\n  };\n\n  const InnerAction action_;\n\n  GTEST_DISALLOW_ASSIGN_(WithArgsAction);\n};\n\n// A macro from the ACTION* family (defined later in this file)\n// defines an action that can be used in a mock function.  Typically,\n// these actions only care about a subset of the arguments of the mock\n// function.  For example, if such an action only uses the second\n// argument, it can be used in any mock function that takes >= 2\n// arguments where the type of the second argument is compatible.\n//\n// Therefore, the action implementation must be prepared to take more\n// arguments than it needs.  The ExcessiveArg type is used to\n// represent those excessive arguments.  In order to keep the compiler\n// error messages tractable, we define it in the testing namespace\n// instead of testing::internal.  However, this is an INTERNAL TYPE\n// and subject to change without notice, so a user MUST NOT USE THIS\n// TYPE DIRECTLY.\nstruct ExcessiveArg {};\n\n// A helper class needed for implementing the ACTION* macros.\ntemplate <typename Result, class Impl>\nclass ActionHelper {\n public:\n  static Result Perform(Impl* impl, const ::testing::tuple<>& args) {\n    return impl->template gmock_PerformImpl<>(args, ExcessiveArg(),\n        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),\n        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),\n        ExcessiveArg());\n  }\n\n  template <typename A0>\n  static Result Perform(Impl* impl, const ::testing::tuple<A0>& args) {\n    return impl->template gmock_PerformImpl<A0>(args, get<0>(args),\n        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),\n        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),\n        ExcessiveArg());\n  }\n\n  template <typename A0, typename A1>\n  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1>& args) {\n    return impl->template gmock_PerformImpl<A0, A1>(args, get<0>(args),\n        get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),\n        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),\n        ExcessiveArg());\n  }\n\n  template <typename A0, typename A1, typename A2>\n  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2>& args) {\n    return impl->template gmock_PerformImpl<A0, A1, A2>(args, get<0>(args),\n        get<1>(args), get<2>(args), ExcessiveArg(), ExcessiveArg(),\n        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),\n        ExcessiveArg());\n  }\n\n  template <typename A0, typename A1, typename A2, typename A3>\n  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2,\n      A3>& args) {\n    return impl->template gmock_PerformImpl<A0, A1, A2, A3>(args, get<0>(args),\n        get<1>(args), get<2>(args), get<3>(args), ExcessiveArg(),\n        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),\n        ExcessiveArg());\n  }\n\n  template <typename A0, typename A1, typename A2, typename A3, typename A4>\n  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3,\n      A4>& args) {\n    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4>(args,\n        get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),\n        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),\n        ExcessiveArg());\n  }\n\n  template <typename A0, typename A1, typename A2, typename A3, typename A4,\n      typename A5>\n  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,\n      A5>& args) {\n    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5>(args,\n        get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),\n        get<5>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),\n        ExcessiveArg());\n  }\n\n  template <typename A0, typename A1, typename A2, typename A3, typename A4,\n      typename A5, typename A6>\n  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,\n      A5, A6>& args) {\n    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6>(args,\n        get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),\n        get<5>(args), get<6>(args), ExcessiveArg(), ExcessiveArg(),\n        ExcessiveArg());\n  }\n\n  template <typename A0, typename A1, typename A2, typename A3, typename A4,\n      typename A5, typename A6, typename A7>\n  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,\n      A5, A6, A7>& args) {\n    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6,\n        A7>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),\n        get<4>(args), get<5>(args), get<6>(args), get<7>(args), ExcessiveArg(),\n        ExcessiveArg());\n  }\n\n  template <typename A0, typename A1, typename A2, typename A3, typename A4,\n      typename A5, typename A6, typename A7, typename A8>\n  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,\n      A5, A6, A7, A8>& args) {\n    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7,\n        A8>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),\n        get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),\n        ExcessiveArg());\n  }\n\n  template <typename A0, typename A1, typename A2, typename A3, typename A4,\n      typename A5, typename A6, typename A7, typename A8, typename A9>\n  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,\n      A5, A6, A7, A8, A9>& args) {\n    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7, A8,\n        A9>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),\n        get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),\n        get<9>(args));\n  }\n};\n\n}  // namespace internal\n\n// Various overloads for Invoke().\n\n// WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes\n// the selected arguments of the mock function to an_action and\n// performs it.  It serves as an adaptor between actions with\n// different argument lists.  C++ doesn't support default arguments for\n// function templates, so we have to overload it.\ntemplate <int k1, typename InnerAction>\ninline internal::WithArgsAction<InnerAction, k1>\nWithArgs(const InnerAction& action) {\n  return internal::WithArgsAction<InnerAction, k1>(action);\n}\n\ntemplate <int k1, int k2, typename InnerAction>\ninline internal::WithArgsAction<InnerAction, k1, k2>\nWithArgs(const InnerAction& action) {\n  return internal::WithArgsAction<InnerAction, k1, k2>(action);\n}\n\ntemplate <int k1, int k2, int k3, typename InnerAction>\ninline internal::WithArgsAction<InnerAction, k1, k2, k3>\nWithArgs(const InnerAction& action) {\n  return internal::WithArgsAction<InnerAction, k1, k2, k3>(action);\n}\n\ntemplate <int k1, int k2, int k3, int k4, typename InnerAction>\ninline internal::WithArgsAction<InnerAction, k1, k2, k3, k4>\nWithArgs(const InnerAction& action) {\n  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4>(action);\n}\n\ntemplate <int k1, int k2, int k3, int k4, int k5, typename InnerAction>\ninline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>\nWithArgs(const InnerAction& action) {\n  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>(action);\n}\n\ntemplate <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerAction>\ninline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>\nWithArgs(const InnerAction& action) {\n  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>(action);\n}\n\ntemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7,\n    typename InnerAction>\ninline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7>\nWithArgs(const InnerAction& action) {\n  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6,\n      k7>(action);\n}\n\ntemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,\n    typename InnerAction>\ninline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8>\nWithArgs(const InnerAction& action) {\n  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7,\n      k8>(action);\n}\n\ntemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,\n    int k9, typename InnerAction>\ninline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, k9>\nWithArgs(const InnerAction& action) {\n  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,\n      k9>(action);\n}\n\ntemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,\n    int k9, int k10, typename InnerAction>\ninline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,\n    k9, k10>\nWithArgs(const InnerAction& action) {\n  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,\n      k9, k10>(action);\n}\n\n// Creates an action that does actions a1, a2, ..., sequentially in\n// each invocation.\ntemplate <typename Action1, typename Action2>\ninline internal::DoBothAction<Action1, Action2>\nDoAll(Action1 a1, Action2 a2) {\n  return internal::DoBothAction<Action1, Action2>(a1, a2);\n}\n\ntemplate <typename Action1, typename Action2, typename Action3>\ninline internal::DoBothAction<Action1, internal::DoBothAction<Action2,\n    Action3> >\nDoAll(Action1 a1, Action2 a2, Action3 a3) {\n  return DoAll(a1, DoAll(a2, a3));\n}\n\ntemplate <typename Action1, typename Action2, typename Action3,\n    typename Action4>\ninline internal::DoBothAction<Action1, internal::DoBothAction<Action2,\n    internal::DoBothAction<Action3, Action4> > >\nDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4) {\n  return DoAll(a1, DoAll(a2, a3, a4));\n}\n\ntemplate <typename Action1, typename Action2, typename Action3,\n    typename Action4, typename Action5>\ninline internal::DoBothAction<Action1, internal::DoBothAction<Action2,\n    internal::DoBothAction<Action3, internal::DoBothAction<Action4,\n    Action5> > > >\nDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5) {\n  return DoAll(a1, DoAll(a2, a3, a4, a5));\n}\n\ntemplate <typename Action1, typename Action2, typename Action3,\n    typename Action4, typename Action5, typename Action6>\ninline internal::DoBothAction<Action1, internal::DoBothAction<Action2,\n    internal::DoBothAction<Action3, internal::DoBothAction<Action4,\n    internal::DoBothAction<Action5, Action6> > > > >\nDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6) {\n  return DoAll(a1, DoAll(a2, a3, a4, a5, a6));\n}\n\ntemplate <typename Action1, typename Action2, typename Action3,\n    typename Action4, typename Action5, typename Action6, typename Action7>\ninline internal::DoBothAction<Action1, internal::DoBothAction<Action2,\n    internal::DoBothAction<Action3, internal::DoBothAction<Action4,\n    internal::DoBothAction<Action5, internal::DoBothAction<Action6,\n    Action7> > > > > >\nDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,\n    Action7 a7) {\n  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7));\n}\n\ntemplate <typename Action1, typename Action2, typename Action3,\n    typename Action4, typename Action5, typename Action6, typename Action7,\n    typename Action8>\ninline internal::DoBothAction<Action1, internal::DoBothAction<Action2,\n    internal::DoBothAction<Action3, internal::DoBothAction<Action4,\n    internal::DoBothAction<Action5, internal::DoBothAction<Action6,\n    internal::DoBothAction<Action7, Action8> > > > > > >\nDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,\n    Action7 a7, Action8 a8) {\n  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8));\n}\n\ntemplate <typename Action1, typename Action2, typename Action3,\n    typename Action4, typename Action5, typename Action6, typename Action7,\n    typename Action8, typename Action9>\ninline internal::DoBothAction<Action1, internal::DoBothAction<Action2,\n    internal::DoBothAction<Action3, internal::DoBothAction<Action4,\n    internal::DoBothAction<Action5, internal::DoBothAction<Action6,\n    internal::DoBothAction<Action7, internal::DoBothAction<Action8,\n    Action9> > > > > > > >\nDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,\n    Action7 a7, Action8 a8, Action9 a9) {\n  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9));\n}\n\ntemplate <typename Action1, typename Action2, typename Action3,\n    typename Action4, typename Action5, typename Action6, typename Action7,\n    typename Action8, typename Action9, typename Action10>\ninline internal::DoBothAction<Action1, internal::DoBothAction<Action2,\n    internal::DoBothAction<Action3, internal::DoBothAction<Action4,\n    internal::DoBothAction<Action5, internal::DoBothAction<Action6,\n    internal::DoBothAction<Action7, internal::DoBothAction<Action8,\n    internal::DoBothAction<Action9, Action10> > > > > > > > >\nDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,\n    Action7 a7, Action8 a8, Action9 a9, Action10 a10) {\n  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9, a10));\n}\n\n}  // namespace testing\n\n// The ACTION* family of macros can be used in a namespace scope to\n// define custom actions easily.  The syntax:\n//\n//   ACTION(name) { statements; }\n//\n// will define an action with the given name that executes the\n// statements.  The value returned by the statements will be used as\n// the return value of the action.  Inside the statements, you can\n// refer to the K-th (0-based) argument of the mock function by\n// 'argK', and refer to its type by 'argK_type'.  For example:\n//\n//   ACTION(IncrementArg1) {\n//     arg1_type temp = arg1;\n//     return ++(*temp);\n//   }\n//\n// allows you to write\n//\n//   ...WillOnce(IncrementArg1());\n//\n// You can also refer to the entire argument tuple and its type by\n// 'args' and 'args_type', and refer to the mock function type and its\n// return type by 'function_type' and 'return_type'.\n//\n// Note that you don't need to specify the types of the mock function\n// arguments.  However rest assured that your code is still type-safe:\n// you'll get a compiler error if *arg1 doesn't support the ++\n// operator, or if the type of ++(*arg1) isn't compatible with the\n// mock function's return type, for example.\n//\n// Sometimes you'll want to parameterize the action.   For that you can use\n// another macro:\n//\n//   ACTION_P(name, param_name) { statements; }\n//\n// For example:\n//\n//   ACTION_P(Add, n) { return arg0 + n; }\n//\n// will allow you to write:\n//\n//   ...WillOnce(Add(5));\n//\n// Note that you don't need to provide the type of the parameter\n// either.  If you need to reference the type of a parameter named\n// 'foo', you can write 'foo_type'.  For example, in the body of\n// ACTION_P(Add, n) above, you can write 'n_type' to refer to the type\n// of 'n'.\n//\n// We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P10 to support\n// multi-parameter actions.\n//\n// For the purpose of typing, you can view\n//\n//   ACTION_Pk(Foo, p1, ..., pk) { ... }\n//\n// as shorthand for\n//\n//   template <typename p1_type, ..., typename pk_type>\n//   FooActionPk<p1_type, ..., pk_type> Foo(p1_type p1, ..., pk_type pk) { ... }\n//\n// In particular, you can provide the template type arguments\n// explicitly when invoking Foo(), as in Foo<long, bool>(5, false);\n// although usually you can rely on the compiler to infer the types\n// for you automatically.  You can assign the result of expression\n// Foo(p1, ..., pk) to a variable of type FooActionPk<p1_type, ...,\n// pk_type>.  This can be useful when composing actions.\n//\n// You can also overload actions with different numbers of parameters:\n//\n//   ACTION_P(Plus, a) { ... }\n//   ACTION_P2(Plus, a, b) { ... }\n//\n// While it's tempting to always use the ACTION* macros when defining\n// a new action, you should also consider implementing ActionInterface\n// or using MakePolymorphicAction() instead, especially if you need to\n// use the action a lot.  While these approaches require more work,\n// they give you more control on the types of the mock function\n// arguments and the action parameters, which in general leads to\n// better compiler error messages that pay off in the long run.  They\n// also allow overloading actions based on parameter types (as opposed\n// to just based on the number of parameters).\n//\n// CAVEAT:\n//\n// ACTION*() can only be used in a namespace scope.  The reason is\n// that C++ doesn't yet allow function-local types to be used to\n// instantiate templates.  The up-coming C++0x standard will fix this.\n// Once that's done, we'll consider supporting using ACTION*() inside\n// a function.\n//\n// MORE INFORMATION:\n//\n// To learn more about using these macros, please search for 'ACTION'\n// on https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md\n\n// An internal macro needed for implementing ACTION*().\n#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\\\n    const args_type& args GTEST_ATTRIBUTE_UNUSED_, \\\n    arg0_type arg0 GTEST_ATTRIBUTE_UNUSED_, \\\n    arg1_type arg1 GTEST_ATTRIBUTE_UNUSED_, \\\n    arg2_type arg2 GTEST_ATTRIBUTE_UNUSED_, \\\n    arg3_type arg3 GTEST_ATTRIBUTE_UNUSED_, \\\n    arg4_type arg4 GTEST_ATTRIBUTE_UNUSED_, \\\n    arg5_type arg5 GTEST_ATTRIBUTE_UNUSED_, \\\n    arg6_type arg6 GTEST_ATTRIBUTE_UNUSED_, \\\n    arg7_type arg7 GTEST_ATTRIBUTE_UNUSED_, \\\n    arg8_type arg8 GTEST_ATTRIBUTE_UNUSED_, \\\n    arg9_type arg9 GTEST_ATTRIBUTE_UNUSED_\n\n// Sometimes you want to give an action explicit template parameters\n// that cannot be inferred from its value parameters.  ACTION() and\n// ACTION_P*() don't support that.  ACTION_TEMPLATE() remedies that\n// and can be viewed as an extension to ACTION() and ACTION_P*().\n//\n// The syntax:\n//\n//   ACTION_TEMPLATE(ActionName,\n//                   HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m),\n//                   AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; }\n//\n// defines an action template that takes m explicit template\n// parameters and n value parameters.  name_i is the name of the i-th\n// template parameter, and kind_i specifies whether it's a typename,\n// an integral constant, or a template.  p_i is the name of the i-th\n// value parameter.\n//\n// Example:\n//\n//   // DuplicateArg<k, T>(output) converts the k-th argument of the mock\n//   // function to type T and copies it to *output.\n//   ACTION_TEMPLATE(DuplicateArg,\n//                   HAS_2_TEMPLATE_PARAMS(int, k, typename, T),\n//                   AND_1_VALUE_PARAMS(output)) {\n//     *output = T(::testing::get<k>(args));\n//   }\n//   ...\n//     int n;\n//     EXPECT_CALL(mock, Foo(_, _))\n//         .WillOnce(DuplicateArg<1, unsigned char>(&n));\n//\n// To create an instance of an action template, write:\n//\n//   ActionName<t1, ..., t_m>(v1, ..., v_n)\n//\n// where the ts are the template arguments and the vs are the value\n// arguments.  The value argument types are inferred by the compiler.\n// If you want to explicitly specify the value argument types, you can\n// provide additional template arguments:\n//\n//   ActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n)\n//\n// where u_i is the desired type of v_i.\n//\n// ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the\n// number of value parameters, but not on the number of template\n// parameters.  Without the restriction, the meaning of the following\n// is unclear:\n//\n//   OverloadedAction<int, bool>(x);\n//\n// Are we using a single-template-parameter action where 'bool' refers\n// to the type of x, or are we using a two-template-parameter action\n// where the compiler is asked to infer the type of x?\n//\n// Implementation notes:\n//\n// GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and\n// GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for\n// implementing ACTION_TEMPLATE.  The main trick we use is to create\n// new macro invocations when expanding a macro.  For example, we have\n//\n//   #define ACTION_TEMPLATE(name, template_params, value_params)\n//       ... GMOCK_INTERNAL_DECL_##template_params ...\n//\n// which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...)\n// to expand to\n//\n//       ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ...\n//\n// Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the\n// preprocessor will continue to expand it to\n//\n//       ... typename T ...\n//\n// This technique conforms to the C++ standard and is portable.  It\n// allows us to implement action templates using O(N) code, where N is\n// the maximum number of template/value parameters supported.  Without\n// using it, we'd have to devote O(N^2) amount of code to implement all\n// combinations of m and n.\n\n// Declares the template parameters.\n#define GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(kind0, name0) kind0 name0\n#define GMOCK_INTERNAL_DECL_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \\\n    name1) kind0 name0, kind1 name1\n#define GMOCK_INTERNAL_DECL_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2) kind0 name0, kind1 name1, kind2 name2\n#define GMOCK_INTERNAL_DECL_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3) kind0 name0, kind1 name1, kind2 name2, \\\n    kind3 name3\n#define GMOCK_INTERNAL_DECL_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4) kind0 name0, kind1 name1, \\\n    kind2 name2, kind3 name3, kind4 name4\n#define GMOCK_INTERNAL_DECL_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4, kind5, name5) kind0 name0, \\\n    kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5\n#define GMOCK_INTERNAL_DECL_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \\\n    name6) kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \\\n    kind5 name5, kind6 name6\n#define GMOCK_INTERNAL_DECL_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \\\n    kind7, name7) kind0 name0, kind1 name1, kind2 name2, kind3 name3, \\\n    kind4 name4, kind5 name5, kind6 name6, kind7 name7\n#define GMOCK_INTERNAL_DECL_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \\\n    kind7, name7, kind8, name8) kind0 name0, kind1 name1, kind2 name2, \\\n    kind3 name3, kind4 name4, kind5 name5, kind6 name6, kind7 name7, \\\n    kind8 name8\n#define GMOCK_INTERNAL_DECL_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \\\n    name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \\\n    name6, kind7, name7, kind8, name8, kind9, name9) kind0 name0, \\\n    kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5, \\\n    kind6 name6, kind7 name7, kind8 name8, kind9 name9\n\n// Lists the template parameters.\n#define GMOCK_INTERNAL_LIST_HAS_1_TEMPLATE_PARAMS(kind0, name0) name0\n#define GMOCK_INTERNAL_LIST_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \\\n    name1) name0, name1\n#define GMOCK_INTERNAL_LIST_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2) name0, name1, name2\n#define GMOCK_INTERNAL_LIST_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3) name0, name1, name2, name3\n#define GMOCK_INTERNAL_LIST_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4) name0, name1, name2, name3, \\\n    name4\n#define GMOCK_INTERNAL_LIST_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4, kind5, name5) name0, name1, \\\n    name2, name3, name4, name5\n#define GMOCK_INTERNAL_LIST_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \\\n    name6) name0, name1, name2, name3, name4, name5, name6\n#define GMOCK_INTERNAL_LIST_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \\\n    kind7, name7) name0, name1, name2, name3, name4, name5, name6, name7\n#define GMOCK_INTERNAL_LIST_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \\\n    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \\\n    kind7, name7, kind8, name8) name0, name1, name2, name3, name4, name5, \\\n    name6, name7, name8\n#define GMOCK_INTERNAL_LIST_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \\\n    name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \\\n    name6, kind7, name7, kind8, name8, kind9, name9) name0, name1, name2, \\\n    name3, name4, name5, name6, name7, name8, name9\n\n// Declares the types of value parameters.\n#define GMOCK_INTERNAL_DECL_TYPE_AND_0_VALUE_PARAMS()\n#define GMOCK_INTERNAL_DECL_TYPE_AND_1_VALUE_PARAMS(p0) , typename p0##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_2_VALUE_PARAMS(p0, p1) , \\\n    typename p0##_type, typename p1##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , \\\n    typename p0##_type, typename p1##_type, typename p2##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \\\n    typename p0##_type, typename p1##_type, typename p2##_type, \\\n    typename p3##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \\\n    typename p0##_type, typename p1##_type, typename p2##_type, \\\n    typename p3##_type, typename p4##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \\\n    typename p0##_type, typename p1##_type, typename p2##_type, \\\n    typename p3##_type, typename p4##_type, typename p5##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6) , typename p0##_type, typename p1##_type, typename p2##_type, \\\n    typename p3##_type, typename p4##_type, typename p5##_type, \\\n    typename p6##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6, p7) , typename p0##_type, typename p1##_type, typename p2##_type, \\\n    typename p3##_type, typename p4##_type, typename p5##_type, \\\n    typename p6##_type, typename p7##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6, p7, p8) , typename p0##_type, typename p1##_type, typename p2##_type, \\\n    typename p3##_type, typename p4##_type, typename p5##_type, \\\n    typename p6##_type, typename p7##_type, typename p8##_type\n#define GMOCK_INTERNAL_DECL_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6, p7, p8, p9) , typename p0##_type, typename p1##_type, \\\n    typename p2##_type, typename p3##_type, typename p4##_type, \\\n    typename p5##_type, typename p6##_type, typename p7##_type, \\\n    typename p8##_type, typename p9##_type\n\n// Initializes the value parameters.\n#define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS()\\\n    ()\n#define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0)\\\n    (p0##_type gmock_p0) : p0(::testing::internal::move(gmock_p0))\n#define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1)\\\n    (p0##_type gmock_p0, \\\n        p1##_type gmock_p1) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1))\n#define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)), \\\n        p2(::testing::internal::move(gmock_p2))\n#define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n        p3##_type gmock_p3) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)), \\\n        p2(::testing::internal::move(gmock_p2)), \\\n        p3(::testing::internal::move(gmock_p3))\n#define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n        p3##_type gmock_p3, \\\n        p4##_type gmock_p4) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)), \\\n        p2(::testing::internal::move(gmock_p2)), \\\n        p3(::testing::internal::move(gmock_p3)), \\\n        p4(::testing::internal::move(gmock_p4))\n#define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n        p3##_type gmock_p3, p4##_type gmock_p4, \\\n        p5##_type gmock_p5) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)), \\\n        p2(::testing::internal::move(gmock_p2)), \\\n        p3(::testing::internal::move(gmock_p3)), \\\n        p4(::testing::internal::move(gmock_p4)), \\\n        p5(::testing::internal::move(gmock_p5))\n#define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n        p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \\\n        p6##_type gmock_p6) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)), \\\n        p2(::testing::internal::move(gmock_p2)), \\\n        p3(::testing::internal::move(gmock_p3)), \\\n        p4(::testing::internal::move(gmock_p4)), \\\n        p5(::testing::internal::move(gmock_p5)), \\\n        p6(::testing::internal::move(gmock_p6))\n#define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n        p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \\\n        p6##_type gmock_p6, \\\n        p7##_type gmock_p7) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)), \\\n        p2(::testing::internal::move(gmock_p2)), \\\n        p3(::testing::internal::move(gmock_p3)), \\\n        p4(::testing::internal::move(gmock_p4)), \\\n        p5(::testing::internal::move(gmock_p5)), \\\n        p6(::testing::internal::move(gmock_p6)), \\\n        p7(::testing::internal::move(gmock_p7))\n#define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n        p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \\\n        p6##_type gmock_p6, p7##_type gmock_p7, \\\n        p8##_type gmock_p8) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)), \\\n        p2(::testing::internal::move(gmock_p2)), \\\n        p3(::testing::internal::move(gmock_p3)), \\\n        p4(::testing::internal::move(gmock_p4)), \\\n        p5(::testing::internal::move(gmock_p5)), \\\n        p6(::testing::internal::move(gmock_p6)), \\\n        p7(::testing::internal::move(gmock_p7)), \\\n        p8(::testing::internal::move(gmock_p8))\n#define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8, p9)\\\n    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n        p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \\\n        p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \\\n        p9##_type gmock_p9) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)), \\\n        p2(::testing::internal::move(gmock_p2)), \\\n        p3(::testing::internal::move(gmock_p3)), \\\n        p4(::testing::internal::move(gmock_p4)), \\\n        p5(::testing::internal::move(gmock_p5)), \\\n        p6(::testing::internal::move(gmock_p6)), \\\n        p7(::testing::internal::move(gmock_p7)), \\\n        p8(::testing::internal::move(gmock_p8)), \\\n        p9(::testing::internal::move(gmock_p9))\n\n// Declares the fields for storing the value parameters.\n#define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS()\n#define GMOCK_INTERNAL_DEFN_AND_1_VALUE_PARAMS(p0) p0##_type p0;\n#define GMOCK_INTERNAL_DEFN_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0; \\\n    p1##_type p1;\n#define GMOCK_INTERNAL_DEFN_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0; \\\n    p1##_type p1; p2##_type p2;\n#define GMOCK_INTERNAL_DEFN_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0; \\\n    p1##_type p1; p2##_type p2; p3##_type p3;\n#define GMOCK_INTERNAL_DEFN_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \\\n    p4) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4;\n#define GMOCK_INTERNAL_DEFN_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \\\n    p5) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \\\n    p5##_type p5;\n#define GMOCK_INTERNAL_DEFN_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \\\n    p5##_type p5; p6##_type p6;\n#define GMOCK_INTERNAL_DEFN_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \\\n    p5##_type p5; p6##_type p6; p7##_type p7;\n#define GMOCK_INTERNAL_DEFN_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \\\n    p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8;\n#define GMOCK_INTERNAL_DEFN_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8, p9) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \\\n    p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; \\\n    p9##_type p9;\n\n// Lists the value parameters.\n#define GMOCK_INTERNAL_LIST_AND_0_VALUE_PARAMS()\n#define GMOCK_INTERNAL_LIST_AND_1_VALUE_PARAMS(p0) p0\n#define GMOCK_INTERNAL_LIST_AND_2_VALUE_PARAMS(p0, p1) p0, p1\n#define GMOCK_INTERNAL_LIST_AND_3_VALUE_PARAMS(p0, p1, p2) p0, p1, p2\n#define GMOCK_INTERNAL_LIST_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0, p1, p2, p3\n#define GMOCK_INTERNAL_LIST_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) p0, p1, \\\n    p2, p3, p4\n#define GMOCK_INTERNAL_LIST_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) p0, \\\n    p1, p2, p3, p4, p5\n#define GMOCK_INTERNAL_LIST_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6) p0, p1, p2, p3, p4, p5, p6\n#define GMOCK_INTERNAL_LIST_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7) p0, p1, p2, p3, p4, p5, p6, p7\n#define GMOCK_INTERNAL_LIST_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8) p0, p1, p2, p3, p4, p5, p6, p7, p8\n#define GMOCK_INTERNAL_LIST_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8, p9) p0, p1, p2, p3, p4, p5, p6, p7, p8, p9\n\n// Lists the value parameter types.\n#define GMOCK_INTERNAL_LIST_TYPE_AND_0_VALUE_PARAMS()\n#define GMOCK_INTERNAL_LIST_TYPE_AND_1_VALUE_PARAMS(p0) , p0##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_2_VALUE_PARAMS(p0, p1) , p0##_type, \\\n    p1##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , p0##_type, \\\n    p1##_type, p2##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \\\n    p0##_type, p1##_type, p2##_type, p3##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \\\n    p0##_type, p1##_type, p2##_type, p3##_type, p4##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \\\n    p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, \\\n    p6##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6, p7) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \\\n    p5##_type, p6##_type, p7##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6, p7, p8) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \\\n    p5##_type, p6##_type, p7##_type, p8##_type\n#define GMOCK_INTERNAL_LIST_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6, p7, p8, p9) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \\\n    p5##_type, p6##_type, p7##_type, p8##_type, p9##_type\n\n// Declares the value parameters.\n#define GMOCK_INTERNAL_DECL_AND_0_VALUE_PARAMS()\n#define GMOCK_INTERNAL_DECL_AND_1_VALUE_PARAMS(p0) p0##_type p0\n#define GMOCK_INTERNAL_DECL_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0, \\\n    p1##_type p1\n#define GMOCK_INTERNAL_DECL_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0, \\\n    p1##_type p1, p2##_type p2\n#define GMOCK_INTERNAL_DECL_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0, \\\n    p1##_type p1, p2##_type p2, p3##_type p3\n#define GMOCK_INTERNAL_DECL_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \\\n    p4) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4\n#define GMOCK_INTERNAL_DECL_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \\\n    p5) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \\\n    p5##_type p5\n#define GMOCK_INTERNAL_DECL_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \\\n    p6) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \\\n    p5##_type p5, p6##_type p6\n#define GMOCK_INTERNAL_DECL_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \\\n    p5##_type p5, p6##_type p6, p7##_type p7\n#define GMOCK_INTERNAL_DECL_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \\\n    p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8\n#define GMOCK_INTERNAL_DECL_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8, p9) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \\\n    p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \\\n    p9##_type p9\n\n// The suffix of the class template implementing the action template.\n#define GMOCK_INTERNAL_COUNT_AND_0_VALUE_PARAMS()\n#define GMOCK_INTERNAL_COUNT_AND_1_VALUE_PARAMS(p0) P\n#define GMOCK_INTERNAL_COUNT_AND_2_VALUE_PARAMS(p0, p1) P2\n#define GMOCK_INTERNAL_COUNT_AND_3_VALUE_PARAMS(p0, p1, p2) P3\n#define GMOCK_INTERNAL_COUNT_AND_4_VALUE_PARAMS(p0, p1, p2, p3) P4\n#define GMOCK_INTERNAL_COUNT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) P5\n#define GMOCK_INTERNAL_COUNT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) P6\n#define GMOCK_INTERNAL_COUNT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) P7\n#define GMOCK_INTERNAL_COUNT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7) P8\n#define GMOCK_INTERNAL_COUNT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8) P9\n#define GMOCK_INTERNAL_COUNT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \\\n    p7, p8, p9) P10\n\n// The name of the class template implementing the action template.\n#define GMOCK_ACTION_CLASS_(name, value_params)\\\n    GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params)\n\n#define ACTION_TEMPLATE(name, template_params, value_params)\\\n  template <GMOCK_INTERNAL_DECL_##template_params\\\n            GMOCK_INTERNAL_DECL_TYPE_##value_params>\\\n  class GMOCK_ACTION_CLASS_(name, value_params) {\\\n   public:\\\n    explicit GMOCK_ACTION_CLASS_(name, value_params)\\\n        GMOCK_INTERNAL_INIT_##value_params {}\\\n    template <typename F>\\\n    class gmock_Impl : public ::testing::ActionInterface<F> {\\\n     public:\\\n      typedef F function_type;\\\n      typedef typename ::testing::internal::Function<F>::Result return_type;\\\n      typedef typename ::testing::internal::Function<F>::ArgumentTuple\\\n          args_type;\\\n      explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\\\n      virtual return_type Perform(const args_type& args) {\\\n        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\\\n            Perform(this, args);\\\n      }\\\n      template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n          typename arg3_type, typename arg4_type, typename arg5_type, \\\n          typename arg6_type, typename arg7_type, typename arg8_type, \\\n          typename arg9_type>\\\n      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \\\n          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \\\n          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \\\n          arg9_type arg9) const;\\\n      GMOCK_INTERNAL_DEFN_##value_params\\\n     private:\\\n      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\\\n    };\\\n    template <typename F> operator ::testing::Action<F>() const {\\\n      return ::testing::Action<F>(\\\n          new gmock_Impl<F>(GMOCK_INTERNAL_LIST_##value_params));\\\n    }\\\n    GMOCK_INTERNAL_DEFN_##value_params\\\n   private:\\\n    GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\\\n  };\\\n  template <GMOCK_INTERNAL_DECL_##template_params\\\n            GMOCK_INTERNAL_DECL_TYPE_##value_params>\\\n  inline GMOCK_ACTION_CLASS_(name, value_params)<\\\n      GMOCK_INTERNAL_LIST_##template_params\\\n      GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\\\n          GMOCK_INTERNAL_DECL_##value_params) {\\\n    return GMOCK_ACTION_CLASS_(name, value_params)<\\\n        GMOCK_INTERNAL_LIST_##template_params\\\n        GMOCK_INTERNAL_LIST_TYPE_##value_params>(\\\n            GMOCK_INTERNAL_LIST_##value_params);\\\n  }\\\n  template <GMOCK_INTERNAL_DECL_##template_params\\\n            GMOCK_INTERNAL_DECL_TYPE_##value_params>\\\n  template <typename F>\\\n  template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n      typename arg3_type, typename arg4_type, typename arg5_type, \\\n      typename arg6_type, typename arg7_type, typename arg8_type, \\\n      typename arg9_type>\\\n  typename ::testing::internal::Function<F>::Result\\\n      GMOCK_ACTION_CLASS_(name, value_params)<\\\n          GMOCK_INTERNAL_LIST_##template_params\\\n          GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl<F>::\\\n              gmock_PerformImpl(\\\n          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n\n#define ACTION(name)\\\n  class name##Action {\\\n   public:\\\n    name##Action() {}\\\n    template <typename F>\\\n    class gmock_Impl : public ::testing::ActionInterface<F> {\\\n     public:\\\n      typedef F function_type;\\\n      typedef typename ::testing::internal::Function<F>::Result return_type;\\\n      typedef typename ::testing::internal::Function<F>::ArgumentTuple\\\n          args_type;\\\n      gmock_Impl() {}\\\n      virtual return_type Perform(const args_type& args) {\\\n        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\\\n            Perform(this, args);\\\n      }\\\n      template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n          typename arg3_type, typename arg4_type, typename arg5_type, \\\n          typename arg6_type, typename arg7_type, typename arg8_type, \\\n          typename arg9_type>\\\n      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \\\n          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \\\n          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \\\n          arg9_type arg9) const;\\\n     private:\\\n      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\\\n    };\\\n    template <typename F> operator ::testing::Action<F>() const {\\\n      return ::testing::Action<F>(new gmock_Impl<F>());\\\n    }\\\n   private:\\\n    GTEST_DISALLOW_ASSIGN_(name##Action);\\\n  };\\\n  inline name##Action name() {\\\n    return name##Action();\\\n  }\\\n  template <typename F>\\\n  template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n      typename arg3_type, typename arg4_type, typename arg5_type, \\\n      typename arg6_type, typename arg7_type, typename arg8_type, \\\n      typename arg9_type>\\\n  typename ::testing::internal::Function<F>::Result\\\n      name##Action::gmock_Impl<F>::gmock_PerformImpl(\\\n          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n\n#define ACTION_P(name, p0)\\\n  template <typename p0##_type>\\\n  class name##ActionP {\\\n   public:\\\n    explicit name##ActionP(p0##_type gmock_p0) : \\\n        p0(::testing::internal::forward<p0##_type>(gmock_p0)) {}\\\n    template <typename F>\\\n    class gmock_Impl : public ::testing::ActionInterface<F> {\\\n     public:\\\n      typedef F function_type;\\\n      typedef typename ::testing::internal::Function<F>::Result return_type;\\\n      typedef typename ::testing::internal::Function<F>::ArgumentTuple\\\n          args_type;\\\n      explicit gmock_Impl(p0##_type gmock_p0) : \\\n          p0(::testing::internal::forward<p0##_type>(gmock_p0)) {}\\\n      virtual return_type Perform(const args_type& args) {\\\n        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\\\n            Perform(this, args);\\\n      }\\\n      template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n          typename arg3_type, typename arg4_type, typename arg5_type, \\\n          typename arg6_type, typename arg7_type, typename arg8_type, \\\n          typename arg9_type>\\\n      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \\\n          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \\\n          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \\\n          arg9_type arg9) const;\\\n      p0##_type p0;\\\n     private:\\\n      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\\\n    };\\\n    template <typename F> operator ::testing::Action<F>() const {\\\n      return ::testing::Action<F>(new gmock_Impl<F>(p0));\\\n    }\\\n    p0##_type p0;\\\n   private:\\\n    GTEST_DISALLOW_ASSIGN_(name##ActionP);\\\n  };\\\n  template <typename p0##_type>\\\n  inline name##ActionP<p0##_type> name(p0##_type p0) {\\\n    return name##ActionP<p0##_type>(p0);\\\n  }\\\n  template <typename p0##_type>\\\n  template <typename F>\\\n  template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n      typename arg3_type, typename arg4_type, typename arg5_type, \\\n      typename arg6_type, typename arg7_type, typename arg8_type, \\\n      typename arg9_type>\\\n  typename ::testing::internal::Function<F>::Result\\\n      name##ActionP<p0##_type>::gmock_Impl<F>::gmock_PerformImpl(\\\n          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n\n#define ACTION_P2(name, p0, p1)\\\n  template <typename p0##_type, typename p1##_type>\\\n  class name##ActionP2 {\\\n   public:\\\n    name##ActionP2(p0##_type gmock_p0, \\\n        p1##_type gmock_p1) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n        p1(::testing::internal::forward<p1##_type>(gmock_p1)) {}\\\n    template <typename F>\\\n    class gmock_Impl : public ::testing::ActionInterface<F> {\\\n     public:\\\n      typedef F function_type;\\\n      typedef typename ::testing::internal::Function<F>::Result return_type;\\\n      typedef typename ::testing::internal::Function<F>::ArgumentTuple\\\n          args_type;\\\n      gmock_Impl(p0##_type gmock_p0, \\\n          p1##_type gmock_p1) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n          p1(::testing::internal::forward<p1##_type>(gmock_p1)) {}\\\n      virtual return_type Perform(const args_type& args) {\\\n        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\\\n            Perform(this, args);\\\n      }\\\n      template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n          typename arg3_type, typename arg4_type, typename arg5_type, \\\n          typename arg6_type, typename arg7_type, typename arg8_type, \\\n          typename arg9_type>\\\n      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \\\n          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \\\n          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \\\n          arg9_type arg9) const;\\\n      p0##_type p0;\\\n      p1##_type p1;\\\n     private:\\\n      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\\\n    };\\\n    template <typename F> operator ::testing::Action<F>() const {\\\n      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1));\\\n    }\\\n    p0##_type p0;\\\n    p1##_type p1;\\\n   private:\\\n    GTEST_DISALLOW_ASSIGN_(name##ActionP2);\\\n  };\\\n  template <typename p0##_type, typename p1##_type>\\\n  inline name##ActionP2<p0##_type, p1##_type> name(p0##_type p0, \\\n      p1##_type p1) {\\\n    return name##ActionP2<p0##_type, p1##_type>(p0, p1);\\\n  }\\\n  template <typename p0##_type, typename p1##_type>\\\n  template <typename F>\\\n  template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n      typename arg3_type, typename arg4_type, typename arg5_type, \\\n      typename arg6_type, typename arg7_type, typename arg8_type, \\\n      typename arg9_type>\\\n  typename ::testing::internal::Function<F>::Result\\\n      name##ActionP2<p0##_type, p1##_type>::gmock_Impl<F>::gmock_PerformImpl(\\\n          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n\n#define ACTION_P3(name, p0, p1, p2)\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type>\\\n  class name##ActionP3 {\\\n   public:\\\n    name##ActionP3(p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \\\n        p2(::testing::internal::forward<p2##_type>(gmock_p2)) {}\\\n    template <typename F>\\\n    class gmock_Impl : public ::testing::ActionInterface<F> {\\\n     public:\\\n      typedef F function_type;\\\n      typedef typename ::testing::internal::Function<F>::Result return_type;\\\n      typedef typename ::testing::internal::Function<F>::ArgumentTuple\\\n          args_type;\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, \\\n          p2##_type gmock_p2) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \\\n          p2(::testing::internal::forward<p2##_type>(gmock_p2)) {}\\\n      virtual return_type Perform(const args_type& args) {\\\n        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\\\n            Perform(this, args);\\\n      }\\\n      template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n          typename arg3_type, typename arg4_type, typename arg5_type, \\\n          typename arg6_type, typename arg7_type, typename arg8_type, \\\n          typename arg9_type>\\\n      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \\\n          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \\\n          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \\\n          arg9_type arg9) const;\\\n      p0##_type p0;\\\n      p1##_type p1;\\\n      p2##_type p2;\\\n     private:\\\n      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\\\n    };\\\n    template <typename F> operator ::testing::Action<F>() const {\\\n      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2));\\\n    }\\\n    p0##_type p0;\\\n    p1##_type p1;\\\n    p2##_type p2;\\\n   private:\\\n    GTEST_DISALLOW_ASSIGN_(name##ActionP3);\\\n  };\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type>\\\n  inline name##ActionP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \\\n      p1##_type p1, p2##_type p2) {\\\n    return name##ActionP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\\\n  }\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type>\\\n  template <typename F>\\\n  template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n      typename arg3_type, typename arg4_type, typename arg5_type, \\\n      typename arg6_type, typename arg7_type, typename arg8_type, \\\n      typename arg9_type>\\\n  typename ::testing::internal::Function<F>::Result\\\n      name##ActionP3<p0##_type, p1##_type, \\\n          p2##_type>::gmock_Impl<F>::gmock_PerformImpl(\\\n          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n\n#define ACTION_P4(name, p0, p1, p2, p3)\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type>\\\n  class name##ActionP4 {\\\n   public:\\\n    name##ActionP4(p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2, \\\n        p3##_type gmock_p3) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \\\n        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \\\n        p3(::testing::internal::forward<p3##_type>(gmock_p3)) {}\\\n    template <typename F>\\\n    class gmock_Impl : public ::testing::ActionInterface<F> {\\\n     public:\\\n      typedef F function_type;\\\n      typedef typename ::testing::internal::Function<F>::Result return_type;\\\n      typedef typename ::testing::internal::Function<F>::ArgumentTuple\\\n          args_type;\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n          p3##_type gmock_p3) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \\\n          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \\\n          p3(::testing::internal::forward<p3##_type>(gmock_p3)) {}\\\n      virtual return_type Perform(const args_type& args) {\\\n        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\\\n            Perform(this, args);\\\n      }\\\n      template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n          typename arg3_type, typename arg4_type, typename arg5_type, \\\n          typename arg6_type, typename arg7_type, typename arg8_type, \\\n          typename arg9_type>\\\n      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \\\n          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \\\n          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \\\n          arg9_type arg9) const;\\\n      p0##_type p0;\\\n      p1##_type p1;\\\n      p2##_type p2;\\\n      p3##_type p3;\\\n     private:\\\n      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\\\n    };\\\n    template <typename F> operator ::testing::Action<F>() const {\\\n      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3));\\\n    }\\\n    p0##_type p0;\\\n    p1##_type p1;\\\n    p2##_type p2;\\\n    p3##_type p3;\\\n   private:\\\n    GTEST_DISALLOW_ASSIGN_(name##ActionP4);\\\n  };\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type>\\\n  inline name##ActionP4<p0##_type, p1##_type, p2##_type, \\\n      p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \\\n      p3##_type p3) {\\\n    return name##ActionP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, p1, \\\n        p2, p3);\\\n  }\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type>\\\n  template <typename F>\\\n  template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n      typename arg3_type, typename arg4_type, typename arg5_type, \\\n      typename arg6_type, typename arg7_type, typename arg8_type, \\\n      typename arg9_type>\\\n  typename ::testing::internal::Function<F>::Result\\\n      name##ActionP4<p0##_type, p1##_type, p2##_type, \\\n          p3##_type>::gmock_Impl<F>::gmock_PerformImpl(\\\n          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n\n#define ACTION_P5(name, p0, p1, p2, p3, p4)\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type>\\\n  class name##ActionP5 {\\\n   public:\\\n    name##ActionP5(p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2, p3##_type gmock_p3, \\\n        p4##_type gmock_p4) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \\\n        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \\\n        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \\\n        p4(::testing::internal::forward<p4##_type>(gmock_p4)) {}\\\n    template <typename F>\\\n    class gmock_Impl : public ::testing::ActionInterface<F> {\\\n     public:\\\n      typedef F function_type;\\\n      typedef typename ::testing::internal::Function<F>::Result return_type;\\\n      typedef typename ::testing::internal::Function<F>::ArgumentTuple\\\n          args_type;\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n          p3##_type gmock_p3, \\\n          p4##_type gmock_p4) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \\\n          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \\\n          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \\\n          p4(::testing::internal::forward<p4##_type>(gmock_p4)) {}\\\n      virtual return_type Perform(const args_type& args) {\\\n        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\\\n            Perform(this, args);\\\n      }\\\n      template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n          typename arg3_type, typename arg4_type, typename arg5_type, \\\n          typename arg6_type, typename arg7_type, typename arg8_type, \\\n          typename arg9_type>\\\n      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \\\n          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \\\n          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \\\n          arg9_type arg9) const;\\\n      p0##_type p0;\\\n      p1##_type p1;\\\n      p2##_type p2;\\\n      p3##_type p3;\\\n      p4##_type p4;\\\n     private:\\\n      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\\\n    };\\\n    template <typename F> operator ::testing::Action<F>() const {\\\n      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4));\\\n    }\\\n    p0##_type p0;\\\n    p1##_type p1;\\\n    p2##_type p2;\\\n    p3##_type p3;\\\n    p4##_type p4;\\\n   private:\\\n    GTEST_DISALLOW_ASSIGN_(name##ActionP5);\\\n  };\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type>\\\n  inline name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \\\n      p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \\\n      p4##_type p4) {\\\n    return name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \\\n        p4##_type>(p0, p1, p2, p3, p4);\\\n  }\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type>\\\n  template <typename F>\\\n  template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n      typename arg3_type, typename arg4_type, typename arg5_type, \\\n      typename arg6_type, typename arg7_type, typename arg8_type, \\\n      typename arg9_type>\\\n  typename ::testing::internal::Function<F>::Result\\\n      name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \\\n          p4##_type>::gmock_Impl<F>::gmock_PerformImpl(\\\n          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n\n#define ACTION_P6(name, p0, p1, p2, p3, p4, p5)\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type>\\\n  class name##ActionP6 {\\\n   public:\\\n    name##ActionP6(p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \\\n        p5##_type gmock_p5) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \\\n        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \\\n        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \\\n        p4(::testing::internal::forward<p4##_type>(gmock_p4)), \\\n        p5(::testing::internal::forward<p5##_type>(gmock_p5)) {}\\\n    template <typename F>\\\n    class gmock_Impl : public ::testing::ActionInterface<F> {\\\n     public:\\\n      typedef F function_type;\\\n      typedef typename ::testing::internal::Function<F>::Result return_type;\\\n      typedef typename ::testing::internal::Function<F>::ArgumentTuple\\\n          args_type;\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n          p3##_type gmock_p3, p4##_type gmock_p4, \\\n          p5##_type gmock_p5) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \\\n          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \\\n          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \\\n          p4(::testing::internal::forward<p4##_type>(gmock_p4)), \\\n          p5(::testing::internal::forward<p5##_type>(gmock_p5)) {}\\\n      virtual return_type Perform(const args_type& args) {\\\n        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\\\n            Perform(this, args);\\\n      }\\\n      template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n          typename arg3_type, typename arg4_type, typename arg5_type, \\\n          typename arg6_type, typename arg7_type, typename arg8_type, \\\n          typename arg9_type>\\\n      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \\\n          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \\\n          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \\\n          arg9_type arg9) const;\\\n      p0##_type p0;\\\n      p1##_type p1;\\\n      p2##_type p2;\\\n      p3##_type p3;\\\n      p4##_type p4;\\\n      p5##_type p5;\\\n     private:\\\n      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\\\n    };\\\n    template <typename F> operator ::testing::Action<F>() const {\\\n      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5));\\\n    }\\\n    p0##_type p0;\\\n    p1##_type p1;\\\n    p2##_type p2;\\\n    p3##_type p3;\\\n    p4##_type p4;\\\n    p5##_type p5;\\\n   private:\\\n    GTEST_DISALLOW_ASSIGN_(name##ActionP6);\\\n  };\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type>\\\n  inline name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \\\n      p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \\\n      p3##_type p3, p4##_type p4, p5##_type p5) {\\\n    return name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \\\n        p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\\\n  }\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type>\\\n  template <typename F>\\\n  template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n      typename arg3_type, typename arg4_type, typename arg5_type, \\\n      typename arg6_type, typename arg7_type, typename arg8_type, \\\n      typename arg9_type>\\\n  typename ::testing::internal::Function<F>::Result\\\n      name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \\\n          p5##_type>::gmock_Impl<F>::gmock_PerformImpl(\\\n          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n\n#define ACTION_P7(name, p0, p1, p2, p3, p4, p5, p6)\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type>\\\n  class name##ActionP7 {\\\n   public:\\\n    name##ActionP7(p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \\\n        p5##_type gmock_p5, \\\n        p6##_type gmock_p6) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \\\n        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \\\n        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \\\n        p4(::testing::internal::forward<p4##_type>(gmock_p4)), \\\n        p5(::testing::internal::forward<p5##_type>(gmock_p5)), \\\n        p6(::testing::internal::forward<p6##_type>(gmock_p6)) {}\\\n    template <typename F>\\\n    class gmock_Impl : public ::testing::ActionInterface<F> {\\\n     public:\\\n      typedef F function_type;\\\n      typedef typename ::testing::internal::Function<F>::Result return_type;\\\n      typedef typename ::testing::internal::Function<F>::ArgumentTuple\\\n          args_type;\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \\\n          p6##_type gmock_p6) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \\\n          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \\\n          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \\\n          p4(::testing::internal::forward<p4##_type>(gmock_p4)), \\\n          p5(::testing::internal::forward<p5##_type>(gmock_p5)), \\\n          p6(::testing::internal::forward<p6##_type>(gmock_p6)) {}\\\n      virtual return_type Perform(const args_type& args) {\\\n        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\\\n            Perform(this, args);\\\n      }\\\n      template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n          typename arg3_type, typename arg4_type, typename arg5_type, \\\n          typename arg6_type, typename arg7_type, typename arg8_type, \\\n          typename arg9_type>\\\n      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \\\n          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \\\n          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \\\n          arg9_type arg9) const;\\\n      p0##_type p0;\\\n      p1##_type p1;\\\n      p2##_type p2;\\\n      p3##_type p3;\\\n      p4##_type p4;\\\n      p5##_type p5;\\\n      p6##_type p6;\\\n     private:\\\n      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\\\n    };\\\n    template <typename F> operator ::testing::Action<F>() const {\\\n      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \\\n          p6));\\\n    }\\\n    p0##_type p0;\\\n    p1##_type p1;\\\n    p2##_type p2;\\\n    p3##_type p3;\\\n    p4##_type p4;\\\n    p5##_type p5;\\\n    p6##_type p6;\\\n   private:\\\n    GTEST_DISALLOW_ASSIGN_(name##ActionP7);\\\n  };\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type>\\\n  inline name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \\\n      p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \\\n      p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \\\n      p6##_type p6) {\\\n    return name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \\\n        p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\\\n  }\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type>\\\n  template <typename F>\\\n  template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n      typename arg3_type, typename arg4_type, typename arg5_type, \\\n      typename arg6_type, typename arg7_type, typename arg8_type, \\\n      typename arg9_type>\\\n  typename ::testing::internal::Function<F>::Result\\\n      name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \\\n          p5##_type, p6##_type>::gmock_Impl<F>::gmock_PerformImpl(\\\n          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n\n#define ACTION_P8(name, p0, p1, p2, p3, p4, p5, p6, p7)\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type>\\\n  class name##ActionP8 {\\\n   public:\\\n    name##ActionP8(p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \\\n        p5##_type gmock_p5, p6##_type gmock_p6, \\\n        p7##_type gmock_p7) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \\\n        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \\\n        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \\\n        p4(::testing::internal::forward<p4##_type>(gmock_p4)), \\\n        p5(::testing::internal::forward<p5##_type>(gmock_p5)), \\\n        p6(::testing::internal::forward<p6##_type>(gmock_p6)), \\\n        p7(::testing::internal::forward<p7##_type>(gmock_p7)) {}\\\n    template <typename F>\\\n    class gmock_Impl : public ::testing::ActionInterface<F> {\\\n     public:\\\n      typedef F function_type;\\\n      typedef typename ::testing::internal::Function<F>::Result return_type;\\\n      typedef typename ::testing::internal::Function<F>::ArgumentTuple\\\n          args_type;\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \\\n          p6##_type gmock_p6, \\\n          p7##_type gmock_p7) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \\\n          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \\\n          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \\\n          p4(::testing::internal::forward<p4##_type>(gmock_p4)), \\\n          p5(::testing::internal::forward<p5##_type>(gmock_p5)), \\\n          p6(::testing::internal::forward<p6##_type>(gmock_p6)), \\\n          p7(::testing::internal::forward<p7##_type>(gmock_p7)) {}\\\n      virtual return_type Perform(const args_type& args) {\\\n        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\\\n            Perform(this, args);\\\n      }\\\n      template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n          typename arg3_type, typename arg4_type, typename arg5_type, \\\n          typename arg6_type, typename arg7_type, typename arg8_type, \\\n          typename arg9_type>\\\n      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \\\n          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \\\n          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \\\n          arg9_type arg9) const;\\\n      p0##_type p0;\\\n      p1##_type p1;\\\n      p2##_type p2;\\\n      p3##_type p3;\\\n      p4##_type p4;\\\n      p5##_type p5;\\\n      p6##_type p6;\\\n      p7##_type p7;\\\n     private:\\\n      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\\\n    };\\\n    template <typename F> operator ::testing::Action<F>() const {\\\n      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \\\n          p6, p7));\\\n    }\\\n    p0##_type p0;\\\n    p1##_type p1;\\\n    p2##_type p2;\\\n    p3##_type p3;\\\n    p4##_type p4;\\\n    p5##_type p5;\\\n    p6##_type p6;\\\n    p7##_type p7;\\\n   private:\\\n    GTEST_DISALLOW_ASSIGN_(name##ActionP8);\\\n  };\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type>\\\n  inline name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \\\n      p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \\\n      p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \\\n      p6##_type p6, p7##_type p7) {\\\n    return name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \\\n        p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \\\n        p6, p7);\\\n  }\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type>\\\n  template <typename F>\\\n  template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n      typename arg3_type, typename arg4_type, typename arg5_type, \\\n      typename arg6_type, typename arg7_type, typename arg8_type, \\\n      typename arg9_type>\\\n  typename ::testing::internal::Function<F>::Result\\\n      name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \\\n          p5##_type, p6##_type, \\\n          p7##_type>::gmock_Impl<F>::gmock_PerformImpl(\\\n          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n\n#define ACTION_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8)\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type, typename p8##_type>\\\n  class name##ActionP9 {\\\n   public:\\\n    name##ActionP9(p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \\\n        p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \\\n        p8##_type gmock_p8) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \\\n        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \\\n        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \\\n        p4(::testing::internal::forward<p4##_type>(gmock_p4)), \\\n        p5(::testing::internal::forward<p5##_type>(gmock_p5)), \\\n        p6(::testing::internal::forward<p6##_type>(gmock_p6)), \\\n        p7(::testing::internal::forward<p7##_type>(gmock_p7)), \\\n        p8(::testing::internal::forward<p8##_type>(gmock_p8)) {}\\\n    template <typename F>\\\n    class gmock_Impl : public ::testing::ActionInterface<F> {\\\n     public:\\\n      typedef F function_type;\\\n      typedef typename ::testing::internal::Function<F>::Result return_type;\\\n      typedef typename ::testing::internal::Function<F>::ArgumentTuple\\\n          args_type;\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \\\n          p6##_type gmock_p6, p7##_type gmock_p7, \\\n          p8##_type gmock_p8) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \\\n          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \\\n          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \\\n          p4(::testing::internal::forward<p4##_type>(gmock_p4)), \\\n          p5(::testing::internal::forward<p5##_type>(gmock_p5)), \\\n          p6(::testing::internal::forward<p6##_type>(gmock_p6)), \\\n          p7(::testing::internal::forward<p7##_type>(gmock_p7)), \\\n          p8(::testing::internal::forward<p8##_type>(gmock_p8)) {}\\\n      virtual return_type Perform(const args_type& args) {\\\n        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\\\n            Perform(this, args);\\\n      }\\\n      template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n          typename arg3_type, typename arg4_type, typename arg5_type, \\\n          typename arg6_type, typename arg7_type, typename arg8_type, \\\n          typename arg9_type>\\\n      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \\\n          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \\\n          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \\\n          arg9_type arg9) const;\\\n      p0##_type p0;\\\n      p1##_type p1;\\\n      p2##_type p2;\\\n      p3##_type p3;\\\n      p4##_type p4;\\\n      p5##_type p5;\\\n      p6##_type p6;\\\n      p7##_type p7;\\\n      p8##_type p8;\\\n     private:\\\n      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\\\n    };\\\n    template <typename F> operator ::testing::Action<F>() const {\\\n      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \\\n          p6, p7, p8));\\\n    }\\\n    p0##_type p0;\\\n    p1##_type p1;\\\n    p2##_type p2;\\\n    p3##_type p3;\\\n    p4##_type p4;\\\n    p5##_type p5;\\\n    p6##_type p6;\\\n    p7##_type p7;\\\n    p8##_type p8;\\\n   private:\\\n    GTEST_DISALLOW_ASSIGN_(name##ActionP9);\\\n  };\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type, typename p8##_type>\\\n  inline name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \\\n      p4##_type, p5##_type, p6##_type, p7##_type, \\\n      p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \\\n      p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \\\n      p8##_type p8) {\\\n    return name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \\\n        p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \\\n        p3, p4, p5, p6, p7, p8);\\\n  }\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type, typename p8##_type>\\\n  template <typename F>\\\n  template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n      typename arg3_type, typename arg4_type, typename arg5_type, \\\n      typename arg6_type, typename arg7_type, typename arg8_type, \\\n      typename arg9_type>\\\n  typename ::testing::internal::Function<F>::Result\\\n      name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \\\n          p5##_type, p6##_type, p7##_type, \\\n          p8##_type>::gmock_Impl<F>::gmock_PerformImpl(\\\n          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n\n#define ACTION_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type, typename p8##_type, \\\n      typename p9##_type>\\\n  class name##ActionP10 {\\\n   public:\\\n    name##ActionP10(p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \\\n        p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \\\n        p8##_type gmock_p8, \\\n        p9##_type gmock_p9) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \\\n        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \\\n        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \\\n        p4(::testing::internal::forward<p4##_type>(gmock_p4)), \\\n        p5(::testing::internal::forward<p5##_type>(gmock_p5)), \\\n        p6(::testing::internal::forward<p6##_type>(gmock_p6)), \\\n        p7(::testing::internal::forward<p7##_type>(gmock_p7)), \\\n        p8(::testing::internal::forward<p8##_type>(gmock_p8)), \\\n        p9(::testing::internal::forward<p9##_type>(gmock_p9)) {}\\\n    template <typename F>\\\n    class gmock_Impl : public ::testing::ActionInterface<F> {\\\n     public:\\\n      typedef F function_type;\\\n      typedef typename ::testing::internal::Function<F>::Result return_type;\\\n      typedef typename ::testing::internal::Function<F>::ArgumentTuple\\\n          args_type;\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \\\n          p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \\\n          p9##_type gmock_p9) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \\\n          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \\\n          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \\\n          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \\\n          p4(::testing::internal::forward<p4##_type>(gmock_p4)), \\\n          p5(::testing::internal::forward<p5##_type>(gmock_p5)), \\\n          p6(::testing::internal::forward<p6##_type>(gmock_p6)), \\\n          p7(::testing::internal::forward<p7##_type>(gmock_p7)), \\\n          p8(::testing::internal::forward<p8##_type>(gmock_p8)), \\\n          p9(::testing::internal::forward<p9##_type>(gmock_p9)) {}\\\n      virtual return_type Perform(const args_type& args) {\\\n        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\\\n            Perform(this, args);\\\n      }\\\n      template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n          typename arg3_type, typename arg4_type, typename arg5_type, \\\n          typename arg6_type, typename arg7_type, typename arg8_type, \\\n          typename arg9_type>\\\n      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \\\n          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \\\n          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \\\n          arg9_type arg9) const;\\\n      p0##_type p0;\\\n      p1##_type p1;\\\n      p2##_type p2;\\\n      p3##_type p3;\\\n      p4##_type p4;\\\n      p5##_type p5;\\\n      p6##_type p6;\\\n      p7##_type p7;\\\n      p8##_type p8;\\\n      p9##_type p9;\\\n     private:\\\n      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\\\n    };\\\n    template <typename F> operator ::testing::Action<F>() const {\\\n      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \\\n          p6, p7, p8, p9));\\\n    }\\\n    p0##_type p0;\\\n    p1##_type p1;\\\n    p2##_type p2;\\\n    p3##_type p3;\\\n    p4##_type p4;\\\n    p5##_type p5;\\\n    p6##_type p6;\\\n    p7##_type p7;\\\n    p8##_type p8;\\\n    p9##_type p9;\\\n   private:\\\n    GTEST_DISALLOW_ASSIGN_(name##ActionP10);\\\n  };\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type, typename p8##_type, \\\n      typename p9##_type>\\\n  inline name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \\\n      p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \\\n      p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \\\n      p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \\\n      p9##_type p9) {\\\n    return name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \\\n        p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \\\n        p1, p2, p3, p4, p5, p6, p7, p8, p9);\\\n  }\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type, typename p8##_type, \\\n      typename p9##_type>\\\n  template <typename F>\\\n  template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n      typename arg3_type, typename arg4_type, typename arg5_type, \\\n      typename arg6_type, typename arg7_type, typename arg8_type, \\\n      typename arg9_type>\\\n  typename ::testing::internal::Function<F>::Result\\\n      name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \\\n          p5##_type, p6##_type, p7##_type, p8##_type, \\\n          p9##_type>::gmock_Impl<F>::gmock_PerformImpl(\\\n          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n\nnamespace testing {\n\n\n// The ACTION*() macros trigger warning C4100 (unreferenced formal\n// parameter) in MSVC with -W4.  Unfortunately they cannot be fixed in\n// the macro definition, as the warnings are generated when the macro\n// is expanded and macro expansion cannot contain #pragma.  Therefore\n// we suppress them here.\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4100)\n#endif\n\n// Various overloads for InvokeArgument<N>().\n//\n// The InvokeArgument<N>(a1, a2, ..., a_k) action invokes the N-th\n// (0-based) argument, which must be a k-ary callable, of the mock\n// function, with arguments a1, a2, ..., a_k.\n//\n// Notes:\n//\n//   1. The arguments are passed by value by default.  If you need to\n//   pass an argument by reference, wrap it inside ByRef().  For\n//   example,\n//\n//     InvokeArgument<1>(5, string(\"Hello\"), ByRef(foo))\n//\n//   passes 5 and string(\"Hello\") by value, and passes foo by\n//   reference.\n//\n//   2. If the callable takes an argument by reference but ByRef() is\n//   not used, it will receive the reference to a copy of the value,\n//   instead of the original value.  For example, when the 0-th\n//   argument of the mock function takes a const string&, the action\n//\n//     InvokeArgument<0>(string(\"Hello\"))\n//\n//   makes a copy of the temporary string(\"Hello\") object and passes a\n//   reference of the copy, instead of the original temporary object,\n//   to the callable.  This makes it easy for a user to define an\n//   InvokeArgument action from temporary values and have it performed\n//   later.\n\nnamespace internal {\nnamespace invoke_argument {\n\n// Appears in InvokeArgumentAdl's argument list to help avoid\n// accidental calls to user functions of the same name.\nstruct AdlTag {};\n\n// InvokeArgumentAdl - a helper for InvokeArgument.\n// The basic overloads are provided here for generic functors.\n// Overloads for other custom-callables are provided in the\n// internal/custom/callback-actions.h header.\n\ntemplate <typename R, typename F>\nR InvokeArgumentAdl(AdlTag, F f) {\n  return f();\n}\ntemplate <typename R, typename F, typename A1>\nR InvokeArgumentAdl(AdlTag, F f, A1 a1) {\n  return f(a1);\n}\ntemplate <typename R, typename F, typename A1, typename A2>\nR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2) {\n  return f(a1, a2);\n}\ntemplate <typename R, typename F, typename A1, typename A2, typename A3>\nR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3) {\n  return f(a1, a2, a3);\n}\ntemplate <typename R, typename F, typename A1, typename A2, typename A3,\n    typename A4>\nR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4) {\n  return f(a1, a2, a3, a4);\n}\ntemplate <typename R, typename F, typename A1, typename A2, typename A3,\n    typename A4, typename A5>\nR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {\n  return f(a1, a2, a3, a4, a5);\n}\ntemplate <typename R, typename F, typename A1, typename A2, typename A3,\n    typename A4, typename A5, typename A6>\nR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {\n  return f(a1, a2, a3, a4, a5, a6);\n}\ntemplate <typename R, typename F, typename A1, typename A2, typename A3,\n    typename A4, typename A5, typename A6, typename A7>\nR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,\n    A7 a7) {\n  return f(a1, a2, a3, a4, a5, a6, a7);\n}\ntemplate <typename R, typename F, typename A1, typename A2, typename A3,\n    typename A4, typename A5, typename A6, typename A7, typename A8>\nR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,\n    A7 a7, A8 a8) {\n  return f(a1, a2, a3, a4, a5, a6, a7, a8);\n}\ntemplate <typename R, typename F, typename A1, typename A2, typename A3,\n    typename A4, typename A5, typename A6, typename A7, typename A8,\n    typename A9>\nR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,\n    A7 a7, A8 a8, A9 a9) {\n  return f(a1, a2, a3, a4, a5, a6, a7, a8, a9);\n}\ntemplate <typename R, typename F, typename A1, typename A2, typename A3,\n    typename A4, typename A5, typename A6, typename A7, typename A8,\n    typename A9, typename A10>\nR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,\n    A7 a7, A8 a8, A9 a9, A10 a10) {\n  return f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);\n}\n}  // namespace invoke_argument\n}  // namespace internal\n\nACTION_TEMPLATE(InvokeArgument,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_0_VALUE_PARAMS()) {\n  using internal::invoke_argument::InvokeArgumentAdl;\n  return InvokeArgumentAdl<return_type>(\n      internal::invoke_argument::AdlTag(),\n      ::testing::get<k>(args));\n}\n\nACTION_TEMPLATE(InvokeArgument,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_1_VALUE_PARAMS(p0)) {\n  using internal::invoke_argument::InvokeArgumentAdl;\n  return InvokeArgumentAdl<return_type>(\n      internal::invoke_argument::AdlTag(),\n      ::testing::get<k>(args), p0);\n}\n\nACTION_TEMPLATE(InvokeArgument,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_2_VALUE_PARAMS(p0, p1)) {\n  using internal::invoke_argument::InvokeArgumentAdl;\n  return InvokeArgumentAdl<return_type>(\n      internal::invoke_argument::AdlTag(),\n      ::testing::get<k>(args), p0, p1);\n}\n\nACTION_TEMPLATE(InvokeArgument,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_3_VALUE_PARAMS(p0, p1, p2)) {\n  using internal::invoke_argument::InvokeArgumentAdl;\n  return InvokeArgumentAdl<return_type>(\n      internal::invoke_argument::AdlTag(),\n      ::testing::get<k>(args), p0, p1, p2);\n}\n\nACTION_TEMPLATE(InvokeArgument,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {\n  using internal::invoke_argument::InvokeArgumentAdl;\n  return InvokeArgumentAdl<return_type>(\n      internal::invoke_argument::AdlTag(),\n      ::testing::get<k>(args), p0, p1, p2, p3);\n}\n\nACTION_TEMPLATE(InvokeArgument,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {\n  using internal::invoke_argument::InvokeArgumentAdl;\n  return InvokeArgumentAdl<return_type>(\n      internal::invoke_argument::AdlTag(),\n      ::testing::get<k>(args), p0, p1, p2, p3, p4);\n}\n\nACTION_TEMPLATE(InvokeArgument,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {\n  using internal::invoke_argument::InvokeArgumentAdl;\n  return InvokeArgumentAdl<return_type>(\n      internal::invoke_argument::AdlTag(),\n      ::testing::get<k>(args), p0, p1, p2, p3, p4, p5);\n}\n\nACTION_TEMPLATE(InvokeArgument,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {\n  using internal::invoke_argument::InvokeArgumentAdl;\n  return InvokeArgumentAdl<return_type>(\n      internal::invoke_argument::AdlTag(),\n      ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6);\n}\n\nACTION_TEMPLATE(InvokeArgument,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) {\n  using internal::invoke_argument::InvokeArgumentAdl;\n  return InvokeArgumentAdl<return_type>(\n      internal::invoke_argument::AdlTag(),\n      ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7);\n}\n\nACTION_TEMPLATE(InvokeArgument,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) {\n  using internal::invoke_argument::InvokeArgumentAdl;\n  return InvokeArgumentAdl<return_type>(\n      internal::invoke_argument::AdlTag(),\n      ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8);\n}\n\nACTION_TEMPLATE(InvokeArgument,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {\n  using internal::invoke_argument::InvokeArgumentAdl;\n  return InvokeArgumentAdl<return_type>(\n      internal::invoke_argument::AdlTag(),\n      ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);\n}\n\n// Various overloads for ReturnNew<T>().\n//\n// The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new\n// instance of type T, constructed on the heap with constructor arguments\n// a1, a2, ..., and a_k. The caller assumes ownership of the returned value.\nACTION_TEMPLATE(ReturnNew,\n                HAS_1_TEMPLATE_PARAMS(typename, T),\n                AND_0_VALUE_PARAMS()) {\n  return new T();\n}\n\nACTION_TEMPLATE(ReturnNew,\n                HAS_1_TEMPLATE_PARAMS(typename, T),\n                AND_1_VALUE_PARAMS(p0)) {\n  return new T(p0);\n}\n\nACTION_TEMPLATE(ReturnNew,\n                HAS_1_TEMPLATE_PARAMS(typename, T),\n                AND_2_VALUE_PARAMS(p0, p1)) {\n  return new T(p0, p1);\n}\n\nACTION_TEMPLATE(ReturnNew,\n                HAS_1_TEMPLATE_PARAMS(typename, T),\n                AND_3_VALUE_PARAMS(p0, p1, p2)) {\n  return new T(p0, p1, p2);\n}\n\nACTION_TEMPLATE(ReturnNew,\n                HAS_1_TEMPLATE_PARAMS(typename, T),\n                AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {\n  return new T(p0, p1, p2, p3);\n}\n\nACTION_TEMPLATE(ReturnNew,\n                HAS_1_TEMPLATE_PARAMS(typename, T),\n                AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {\n  return new T(p0, p1, p2, p3, p4);\n}\n\nACTION_TEMPLATE(ReturnNew,\n                HAS_1_TEMPLATE_PARAMS(typename, T),\n                AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {\n  return new T(p0, p1, p2, p3, p4, p5);\n}\n\nACTION_TEMPLATE(ReturnNew,\n                HAS_1_TEMPLATE_PARAMS(typename, T),\n                AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {\n  return new T(p0, p1, p2, p3, p4, p5, p6);\n}\n\nACTION_TEMPLATE(ReturnNew,\n                HAS_1_TEMPLATE_PARAMS(typename, T),\n                AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) {\n  return new T(p0, p1, p2, p3, p4, p5, p6, p7);\n}\n\nACTION_TEMPLATE(ReturnNew,\n                HAS_1_TEMPLATE_PARAMS(typename, T),\n                AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) {\n  return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8);\n}\n\nACTION_TEMPLATE(ReturnNew,\n                HAS_1_TEMPLATE_PARAMS(typename, T),\n                AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {\n  return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);\n}\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n\n}  // namespace testing\n\n// Include any custom callback actions added by the local installation.\n// We must include this header at the end to make sure it can use the\n// declarations from this file.\n#include \"gmock/internal/custom/gmock-generated-actions.h\"\n\n#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/gmock-generated-actions.h.pump",
    "content": "$$ -*- mode: c++; -*-\n$$ This is a Pump source file. Please use Pump to convert it to\n$$ gmock-generated-actions.h.\n$$\n$var n = 10  $$ The maximum arity we support.\n$$}} This meta comment fixes auto-indentation in editors.\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements some commonly used variadic actions.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_\n#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_\n\n#include \"gmock/gmock-actions.h\"\n#include \"gmock/internal/gmock-port.h\"\n\nnamespace testing {\nnamespace internal {\n\n// InvokeHelper<F> knows how to unpack an N-tuple and invoke an N-ary\n// function, method, or callback with the unpacked values, where F is\n// a function type that takes N arguments.\ntemplate <typename Result, typename ArgumentTuple>\nclass InvokeHelper;\n\n\n$var max_callback_arity = 5\n$range i 0..n\n$for i [[\n$range j 1..i\n$var types = [[$for j [[, typename A$j]]]]\n$var as = [[$for j, [[A$j]]]]\n$var args = [[$if i==0 [[]] $else [[ args]]]]\n$var gets = [[$for j, [[get<$(j - 1)>(args)]]]]\ntemplate <typename R$types>\nclass InvokeHelper<R, ::testing::tuple<$as> > {\n public:\n  template <typename Function>\n  static R Invoke(Function function, const ::testing::tuple<$as>&$args) {\n           return function($gets);\n  }\n\n  template <class Class, typename MethodPtr>\n  static R InvokeMethod(Class* obj_ptr,\n                        MethodPtr method_ptr,\n                        const ::testing::tuple<$as>&$args) {\n           return (obj_ptr->*method_ptr)($gets);\n  }\n\n\n$if i <= max_callback_arity [[\n  template <typename CallbackType>\n  static R InvokeCallback(CallbackType* callback,\n                          const ::testing::tuple<$as>&$args) {\n           return callback->Run($gets);\n  }\n]] $else [[\n  // There is no InvokeCallback() for $i-tuples\n]]\n\n};\n\n\n]]\n// Implements the Invoke(callback) action.\ntemplate <typename CallbackType>\nclass InvokeCallbackAction {\n public:\n  // The c'tor takes ownership of the callback.\n  explicit InvokeCallbackAction(CallbackType* callback)\n      : callback_(callback) {\n    callback->CheckIsRepeatable();  // Makes sure the callback is permanent.\n  }\n\n  // This type conversion operator template allows Invoke(callback) to\n  // be used wherever the callback's type is compatible with that of\n  // the mock function, i.e. if the mock function's arguments can be\n  // implicitly converted to the callback's arguments and the\n  // callback's result can be implicitly converted to the mock\n  // function's result.\n  template <typename Result, typename ArgumentTuple>\n  Result Perform(const ArgumentTuple& args) const {\n    return InvokeHelper<Result, ArgumentTuple>::InvokeCallback(\n        callback_.get(), args);\n  }\n private:\n  const linked_ptr<CallbackType> callback_;\n};\n\n// An INTERNAL macro for extracting the type of a tuple field.  It's\n// subject to change without notice - DO NOT USE IN USER CODE!\n#define GMOCK_FIELD_(Tuple, N) \\\n    typename ::testing::tuple_element<N, Tuple>::type\n\n$range i 1..n\n\n// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::type is the\n// type of an n-ary function whose i-th (1-based) argument type is the\n// k{i}-th (0-based) field of ArgumentTuple, which must be a tuple\n// type, and whose return type is Result.  For example,\n//   SelectArgs<int, ::testing::tuple<bool, char, double, long>, 0, 3>::type\n// is int(bool, long).\n//\n// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::Select(args)\n// returns the selected fields (k1, k2, ..., k_n) of args as a tuple.\n// For example,\n//   SelectArgs<int, tuple<bool, char, double>, 2, 0>::Select(\n//       ::testing::make_tuple(true, 'a', 2.5))\n// returns tuple (2.5, true).\n//\n// The numbers in list k1, k2, ..., k_n must be >= 0, where n can be\n// in the range [0, $n].  Duplicates are allowed and they don't have\n// to be in an ascending or descending order.\n\ntemplate <typename Result, typename ArgumentTuple, $for i, [[int k$i]]>\nclass SelectArgs {\n public:\n  typedef Result type($for i, [[GMOCK_FIELD_(ArgumentTuple, k$i)]]);\n  typedef typename Function<type>::ArgumentTuple SelectedArgs;\n  static SelectedArgs Select(const ArgumentTuple& args) {\n    return SelectedArgs($for i, [[get<k$i>(args)]]);\n  }\n};\n\n\n$for i [[\n$range j 1..n\n$range j1 1..i-1\ntemplate <typename Result, typename ArgumentTuple$for j1[[, int k$j1]]>\nclass SelectArgs<Result, ArgumentTuple,\n                 $for j, [[$if j <= i-1 [[k$j]] $else [[-1]]]]> {\n public:\n  typedef Result type($for j1, [[GMOCK_FIELD_(ArgumentTuple, k$j1)]]);\n  typedef typename Function<type>::ArgumentTuple SelectedArgs;\n  static SelectedArgs Select(const ArgumentTuple& [[]]\n$if i == 1 [[/* args */]] $else [[args]]) {\n    return SelectedArgs($for j1, [[get<k$j1>(args)]]);\n  }\n};\n\n\n]]\n#undef GMOCK_FIELD_\n\n$var ks = [[$for i, [[k$i]]]]\n\n// Implements the WithArgs action.\ntemplate <typename InnerAction, $for i, [[int k$i = -1]]>\nclass WithArgsAction {\n public:\n  explicit WithArgsAction(const InnerAction& action) : action_(action) {}\n\n  template <typename F>\n  operator Action<F>() const { return MakeAction(new Impl<F>(action_)); }\n\n private:\n  template <typename F>\n  class Impl : public ActionInterface<F> {\n   public:\n    typedef typename Function<F>::Result Result;\n    typedef typename Function<F>::ArgumentTuple ArgumentTuple;\n\n    explicit Impl(const InnerAction& action) : action_(action) {}\n\n    virtual Result Perform(const ArgumentTuple& args) {\n      return action_.Perform(SelectArgs<Result, ArgumentTuple, $ks>::Select(args));\n    }\n\n   private:\n    typedef typename SelectArgs<Result, ArgumentTuple,\n        $ks>::type InnerFunctionType;\n\n    Action<InnerFunctionType> action_;\n  };\n\n  const InnerAction action_;\n\n  GTEST_DISALLOW_ASSIGN_(WithArgsAction);\n};\n\n// A macro from the ACTION* family (defined later in this file)\n// defines an action that can be used in a mock function.  Typically,\n// these actions only care about a subset of the arguments of the mock\n// function.  For example, if such an action only uses the second\n// argument, it can be used in any mock function that takes >= 2\n// arguments where the type of the second argument is compatible.\n//\n// Therefore, the action implementation must be prepared to take more\n// arguments than it needs.  The ExcessiveArg type is used to\n// represent those excessive arguments.  In order to keep the compiler\n// error messages tractable, we define it in the testing namespace\n// instead of testing::internal.  However, this is an INTERNAL TYPE\n// and subject to change without notice, so a user MUST NOT USE THIS\n// TYPE DIRECTLY.\nstruct ExcessiveArg {};\n\n// A helper class needed for implementing the ACTION* macros.\ntemplate <typename Result, class Impl>\nclass ActionHelper {\n public:\n$range i 0..n\n$for i\n\n[[\n$var template = [[$if i==0 [[]] $else [[\n$range j 0..i-1\n  template <$for j, [[typename A$j]]>\n]]]]\n$range j 0..i-1\n$var As = [[$for j, [[A$j]]]]\n$var as = [[$for j, [[get<$j>(args)]]]]\n$range k 1..n-i\n$var eas = [[$for k, [[ExcessiveArg()]]]]\n$var arg_list = [[$if (i==0) | (i==n) [[$as$eas]] $else [[$as, $eas]]]]\n$template\n  static Result Perform(Impl* impl, const ::testing::tuple<$As>& args) {\n    return impl->template gmock_PerformImpl<$As>(args, $arg_list);\n  }\n\n]]\n};\n\n}  // namespace internal\n\n// Various overloads for Invoke().\n\n// WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes\n// the selected arguments of the mock function to an_action and\n// performs it.  It serves as an adaptor between actions with\n// different argument lists.  C++ doesn't support default arguments for\n// function templates, so we have to overload it.\n\n$range i 1..n\n$for i [[\n$range j 1..i\ntemplate <$for j [[int k$j, ]]typename InnerAction>\ninline internal::WithArgsAction<InnerAction$for j [[, k$j]]>\nWithArgs(const InnerAction& action) {\n  return internal::WithArgsAction<InnerAction$for j [[, k$j]]>(action);\n}\n\n\n]]\n// Creates an action that does actions a1, a2, ..., sequentially in\n// each invocation.\n$range i 2..n\n$for i [[\n$range j 2..i\n$var types = [[$for j, [[typename Action$j]]]]\n$var Aas = [[$for j [[, Action$j a$j]]]]\n\ntemplate <typename Action1, $types>\n$range k 1..i-1\n\ninline $for k [[internal::DoBothAction<Action$k, ]]Action$i$for k  [[>]]\n\nDoAll(Action1 a1$Aas) {\n$if i==2 [[\n\n  return internal::DoBothAction<Action1, Action2>(a1, a2);\n]] $else [[\n$range j2 2..i\n\n  return DoAll(a1, DoAll($for j2, [[a$j2]]));\n]]\n\n}\n\n]]\n\n}  // namespace testing\n\n// The ACTION* family of macros can be used in a namespace scope to\n// define custom actions easily.  The syntax:\n//\n//   ACTION(name) { statements; }\n//\n// will define an action with the given name that executes the\n// statements.  The value returned by the statements will be used as\n// the return value of the action.  Inside the statements, you can\n// refer to the K-th (0-based) argument of the mock function by\n// 'argK', and refer to its type by 'argK_type'.  For example:\n//\n//   ACTION(IncrementArg1) {\n//     arg1_type temp = arg1;\n//     return ++(*temp);\n//   }\n//\n// allows you to write\n//\n//   ...WillOnce(IncrementArg1());\n//\n// You can also refer to the entire argument tuple and its type by\n// 'args' and 'args_type', and refer to the mock function type and its\n// return type by 'function_type' and 'return_type'.\n//\n// Note that you don't need to specify the types of the mock function\n// arguments.  However rest assured that your code is still type-safe:\n// you'll get a compiler error if *arg1 doesn't support the ++\n// operator, or if the type of ++(*arg1) isn't compatible with the\n// mock function's return type, for example.\n//\n// Sometimes you'll want to parameterize the action.   For that you can use\n// another macro:\n//\n//   ACTION_P(name, param_name) { statements; }\n//\n// For example:\n//\n//   ACTION_P(Add, n) { return arg0 + n; }\n//\n// will allow you to write:\n//\n//   ...WillOnce(Add(5));\n//\n// Note that you don't need to provide the type of the parameter\n// either.  If you need to reference the type of a parameter named\n// 'foo', you can write 'foo_type'.  For example, in the body of\n// ACTION_P(Add, n) above, you can write 'n_type' to refer to the type\n// of 'n'.\n//\n// We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P$n to support\n// multi-parameter actions.\n//\n// For the purpose of typing, you can view\n//\n//   ACTION_Pk(Foo, p1, ..., pk) { ... }\n//\n// as shorthand for\n//\n//   template <typename p1_type, ..., typename pk_type>\n//   FooActionPk<p1_type, ..., pk_type> Foo(p1_type p1, ..., pk_type pk) { ... }\n//\n// In particular, you can provide the template type arguments\n// explicitly when invoking Foo(), as in Foo<long, bool>(5, false);\n// although usually you can rely on the compiler to infer the types\n// for you automatically.  You can assign the result of expression\n// Foo(p1, ..., pk) to a variable of type FooActionPk<p1_type, ...,\n// pk_type>.  This can be useful when composing actions.\n//\n// You can also overload actions with different numbers of parameters:\n//\n//   ACTION_P(Plus, a) { ... }\n//   ACTION_P2(Plus, a, b) { ... }\n//\n// While it's tempting to always use the ACTION* macros when defining\n// a new action, you should also consider implementing ActionInterface\n// or using MakePolymorphicAction() instead, especially if you need to\n// use the action a lot.  While these approaches require more work,\n// they give you more control on the types of the mock function\n// arguments and the action parameters, which in general leads to\n// better compiler error messages that pay off in the long run.  They\n// also allow overloading actions based on parameter types (as opposed\n// to just based on the number of parameters).\n//\n// CAVEAT:\n//\n// ACTION*() can only be used in a namespace scope.  The reason is\n// that C++ doesn't yet allow function-local types to be used to\n// instantiate templates.  The up-coming C++0x standard will fix this.\n// Once that's done, we'll consider supporting using ACTION*() inside\n// a function.\n//\n// MORE INFORMATION:\n//\n// To learn more about using these macros, please search for 'ACTION'\n// on https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md\n\n$range i 0..n\n$range k 0..n-1\n\n// An internal macro needed for implementing ACTION*().\n#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\\\n    const args_type& args GTEST_ATTRIBUTE_UNUSED_\n$for k [[, \\\n    arg$k[[]]_type arg$k GTEST_ATTRIBUTE_UNUSED_]]\n\n\n// Sometimes you want to give an action explicit template parameters\n// that cannot be inferred from its value parameters.  ACTION() and\n// ACTION_P*() don't support that.  ACTION_TEMPLATE() remedies that\n// and can be viewed as an extension to ACTION() and ACTION_P*().\n//\n// The syntax:\n//\n//   ACTION_TEMPLATE(ActionName,\n//                   HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m),\n//                   AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; }\n//\n// defines an action template that takes m explicit template\n// parameters and n value parameters.  name_i is the name of the i-th\n// template parameter, and kind_i specifies whether it's a typename,\n// an integral constant, or a template.  p_i is the name of the i-th\n// value parameter.\n//\n// Example:\n//\n//   // DuplicateArg<k, T>(output) converts the k-th argument of the mock\n//   // function to type T and copies it to *output.\n//   ACTION_TEMPLATE(DuplicateArg,\n//                   HAS_2_TEMPLATE_PARAMS(int, k, typename, T),\n//                   AND_1_VALUE_PARAMS(output)) {\n//     *output = T(::testing::get<k>(args));\n//   }\n//   ...\n//     int n;\n//     EXPECT_CALL(mock, Foo(_, _))\n//         .WillOnce(DuplicateArg<1, unsigned char>(&n));\n//\n// To create an instance of an action template, write:\n//\n//   ActionName<t1, ..., t_m>(v1, ..., v_n)\n//\n// where the ts are the template arguments and the vs are the value\n// arguments.  The value argument types are inferred by the compiler.\n// If you want to explicitly specify the value argument types, you can\n// provide additional template arguments:\n//\n//   ActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n)\n//\n// where u_i is the desired type of v_i.\n//\n// ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the\n// number of value parameters, but not on the number of template\n// parameters.  Without the restriction, the meaning of the following\n// is unclear:\n//\n//   OverloadedAction<int, bool>(x);\n//\n// Are we using a single-template-parameter action where 'bool' refers\n// to the type of x, or are we using a two-template-parameter action\n// where the compiler is asked to infer the type of x?\n//\n// Implementation notes:\n//\n// GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and\n// GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for\n// implementing ACTION_TEMPLATE.  The main trick we use is to create\n// new macro invocations when expanding a macro.  For example, we have\n//\n//   #define ACTION_TEMPLATE(name, template_params, value_params)\n//       ... GMOCK_INTERNAL_DECL_##template_params ...\n//\n// which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...)\n// to expand to\n//\n//       ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ...\n//\n// Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the\n// preprocessor will continue to expand it to\n//\n//       ... typename T ...\n//\n// This technique conforms to the C++ standard and is portable.  It\n// allows us to implement action templates using O(N) code, where N is\n// the maximum number of template/value parameters supported.  Without\n// using it, we'd have to devote O(N^2) amount of code to implement all\n// combinations of m and n.\n\n// Declares the template parameters.\n\n$range j 1..n\n$for j [[\n$range m 0..j-1\n#define GMOCK_INTERNAL_DECL_HAS_$j[[]]\n_TEMPLATE_PARAMS($for m, [[kind$m, name$m]]) $for m, [[kind$m name$m]]\n\n\n]]\n\n// Lists the template parameters.\n\n$for j [[\n$range m 0..j-1\n#define GMOCK_INTERNAL_LIST_HAS_$j[[]]\n_TEMPLATE_PARAMS($for m, [[kind$m, name$m]]) $for m, [[name$m]]\n\n\n]]\n\n// Declares the types of value parameters.\n\n$for i [[\n$range j 0..i-1\n#define GMOCK_INTERNAL_DECL_TYPE_AND_$i[[]]\n_VALUE_PARAMS($for j, [[p$j]]) $for j [[, typename p$j##_type]]\n\n\n]]\n\n// Initializes the value parameters.\n\n$for i [[\n$range j 0..i-1\n#define GMOCK_INTERNAL_INIT_AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]])\\\n    ($for j, [[p$j##_type gmock_p$j]])$if i>0 [[ : ]]$for j, [[p$j(::testing::internal::move(gmock_p$j))]]\n\n\n]]\n\n// Declares the fields for storing the value parameters.\n\n$for i [[\n$range j 0..i-1\n#define GMOCK_INTERNAL_DEFN_AND_$i[[]]\n_VALUE_PARAMS($for j, [[p$j]]) $for j [[p$j##_type p$j; ]]\n\n\n]]\n\n// Lists the value parameters.\n\n$for i [[\n$range j 0..i-1\n#define GMOCK_INTERNAL_LIST_AND_$i[[]]\n_VALUE_PARAMS($for j, [[p$j]]) $for j, [[p$j]]\n\n\n]]\n\n// Lists the value parameter types.\n\n$for i [[\n$range j 0..i-1\n#define GMOCK_INTERNAL_LIST_TYPE_AND_$i[[]]\n_VALUE_PARAMS($for j, [[p$j]]) $for j [[, p$j##_type]]\n\n\n]]\n\n// Declares the value parameters.\n\n$for i [[\n$range j 0..i-1\n#define GMOCK_INTERNAL_DECL_AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]]) [[]]\n$for j, [[p$j##_type p$j]]\n\n\n]]\n\n// The suffix of the class template implementing the action template.\n$for i [[\n\n\n$range j 0..i-1\n#define GMOCK_INTERNAL_COUNT_AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]]) [[]]\n$if i==1 [[P]] $elif i>=2 [[P$i]]\n]]\n\n\n// The name of the class template implementing the action template.\n#define GMOCK_ACTION_CLASS_(name, value_params)\\\n    GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params)\n\n$range k 0..n-1\n\n#define ACTION_TEMPLATE(name, template_params, value_params)\\\n  template <GMOCK_INTERNAL_DECL_##template_params\\\n            GMOCK_INTERNAL_DECL_TYPE_##value_params>\\\n  class GMOCK_ACTION_CLASS_(name, value_params) {\\\n   public:\\\n    explicit GMOCK_ACTION_CLASS_(name, value_params)\\\n        GMOCK_INTERNAL_INIT_##value_params {}\\\n    template <typename F>\\\n    class gmock_Impl : public ::testing::ActionInterface<F> {\\\n     public:\\\n      typedef F function_type;\\\n      typedef typename ::testing::internal::Function<F>::Result return_type;\\\n      typedef typename ::testing::internal::Function<F>::ArgumentTuple\\\n          args_type;\\\n      explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\\\n      virtual return_type Perform(const args_type& args) {\\\n        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\\\n            Perform(this, args);\\\n      }\\\n      template <$for k, [[typename arg$k[[]]_type]]>\\\n      return_type gmock_PerformImpl(const args_type& args[[]]\n$for k [[, arg$k[[]]_type arg$k]]) const;\\\n      GMOCK_INTERNAL_DEFN_##value_params\\\n     private:\\\n      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\\\n    };\\\n    template <typename F> operator ::testing::Action<F>() const {\\\n      return ::testing::Action<F>(\\\n          new gmock_Impl<F>(GMOCK_INTERNAL_LIST_##value_params));\\\n    }\\\n    GMOCK_INTERNAL_DEFN_##value_params\\\n   private:\\\n    GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\\\n  };\\\n  template <GMOCK_INTERNAL_DECL_##template_params\\\n            GMOCK_INTERNAL_DECL_TYPE_##value_params>\\\n  inline GMOCK_ACTION_CLASS_(name, value_params)<\\\n      GMOCK_INTERNAL_LIST_##template_params\\\n      GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\\\n          GMOCK_INTERNAL_DECL_##value_params) {\\\n    return GMOCK_ACTION_CLASS_(name, value_params)<\\\n        GMOCK_INTERNAL_LIST_##template_params\\\n        GMOCK_INTERNAL_LIST_TYPE_##value_params>(\\\n            GMOCK_INTERNAL_LIST_##value_params);\\\n  }\\\n  template <GMOCK_INTERNAL_DECL_##template_params\\\n            GMOCK_INTERNAL_DECL_TYPE_##value_params>\\\n  template <typename F>\\\n  template <typename arg0_type, typename arg1_type, typename arg2_type, \\\n      typename arg3_type, typename arg4_type, typename arg5_type, \\\n      typename arg6_type, typename arg7_type, typename arg8_type, \\\n      typename arg9_type>\\\n  typename ::testing::internal::Function<F>::Result\\\n      GMOCK_ACTION_CLASS_(name, value_params)<\\\n          GMOCK_INTERNAL_LIST_##template_params\\\n          GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl<F>::\\\n              gmock_PerformImpl(\\\n          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n\n$for i\n\n[[\n$var template = [[$if i==0 [[]] $else [[\n$range j 0..i-1\n\n  template <$for j, [[typename p$j##_type]]>\\\n]]]]\n$var class_name = [[name##Action[[$if i==0 [[]] $elif i==1 [[P]]\n                                                $else [[P$i]]]]]]\n$range j 0..i-1\n$var ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]]\n$var param_types_and_names = [[$for j, [[p$j##_type p$j]]]]\n$var inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(::testing::internal::forward<p$j##_type>(gmock_p$j))]]]]]]\n$var param_field_decls = [[$for j\n[[\n\n      p$j##_type p$j;\\\n]]]]\n$var param_field_decls2 = [[$for j\n[[\n\n    p$j##_type p$j;\\\n]]]]\n$var params = [[$for j, [[p$j]]]]\n$var param_types = [[$if i==0 [[]] $else [[<$for j, [[p$j##_type]]>]]]]\n$var typename_arg_types = [[$for k, [[typename arg$k[[]]_type]]]]\n$var arg_types_and_names = [[$for k, [[arg$k[[]]_type arg$k]]]]\n$var macro_name = [[$if i==0 [[ACTION]] $elif i==1 [[ACTION_P]]\n                                        $else [[ACTION_P$i]]]]\n\n#define $macro_name(name$for j [[, p$j]])\\$template\n  class $class_name {\\\n   public:\\\n    [[$if i==1 [[explicit ]]]]$class_name($ctor_param_list)$inits {}\\\n    template <typename F>\\\n    class gmock_Impl : public ::testing::ActionInterface<F> {\\\n     public:\\\n      typedef F function_type;\\\n      typedef typename ::testing::internal::Function<F>::Result return_type;\\\n      typedef typename ::testing::internal::Function<F>::ArgumentTuple\\\n          args_type;\\\n      [[$if i==1 [[explicit ]]]]gmock_Impl($ctor_param_list)$inits {}\\\n      virtual return_type Perform(const args_type& args) {\\\n        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\\\n            Perform(this, args);\\\n      }\\\n      template <$typename_arg_types>\\\n      return_type gmock_PerformImpl(const args_type& args, [[]]\n$arg_types_and_names) const;\\$param_field_decls\n     private:\\\n      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\\\n    };\\\n    template <typename F> operator ::testing::Action<F>() const {\\\n      return ::testing::Action<F>(new gmock_Impl<F>($params));\\\n    }\\$param_field_decls2\n   private:\\\n    GTEST_DISALLOW_ASSIGN_($class_name);\\\n  };\\$template\n  inline $class_name$param_types name($param_types_and_names) {\\\n    return $class_name$param_types($params);\\\n  }\\$template\n  template <typename F>\\\n  template <$typename_arg_types>\\\n  typename ::testing::internal::Function<F>::Result\\\n      $class_name$param_types::gmock_Impl<F>::gmock_PerformImpl(\\\n          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const\n]]\n$$ }  // This meta comment fixes auto-indentation in Emacs.  It won't\n$$    // show up in the generated code.\n\n\nnamespace testing {\n\n\n// The ACTION*() macros trigger warning C4100 (unreferenced formal\n// parameter) in MSVC with -W4.  Unfortunately they cannot be fixed in\n// the macro definition, as the warnings are generated when the macro\n// is expanded and macro expansion cannot contain #pragma.  Therefore\n// we suppress them here.\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4100)\n#endif\n\n// Various overloads for InvokeArgument<N>().\n//\n// The InvokeArgument<N>(a1, a2, ..., a_k) action invokes the N-th\n// (0-based) argument, which must be a k-ary callable, of the mock\n// function, with arguments a1, a2, ..., a_k.\n//\n// Notes:\n//\n//   1. The arguments are passed by value by default.  If you need to\n//   pass an argument by reference, wrap it inside ByRef().  For\n//   example,\n//\n//     InvokeArgument<1>(5, string(\"Hello\"), ByRef(foo))\n//\n//   passes 5 and string(\"Hello\") by value, and passes foo by\n//   reference.\n//\n//   2. If the callable takes an argument by reference but ByRef() is\n//   not used, it will receive the reference to a copy of the value,\n//   instead of the original value.  For example, when the 0-th\n//   argument of the mock function takes a const string&, the action\n//\n//     InvokeArgument<0>(string(\"Hello\"))\n//\n//   makes a copy of the temporary string(\"Hello\") object and passes a\n//   reference of the copy, instead of the original temporary object,\n//   to the callable.  This makes it easy for a user to define an\n//   InvokeArgument action from temporary values and have it performed\n//   later.\n\nnamespace internal {\nnamespace invoke_argument {\n\n// Appears in InvokeArgumentAdl's argument list to help avoid\n// accidental calls to user functions of the same name.\nstruct AdlTag {};\n\n// InvokeArgumentAdl - a helper for InvokeArgument.\n// The basic overloads are provided here for generic functors.\n// Overloads for other custom-callables are provided in the\n// internal/custom/callback-actions.h header.\n\n$range i 0..n\n$for i\n[[\n$range j 1..i\n\ntemplate <typename R, typename F[[$for j [[, typename A$j]]]]>\nR InvokeArgumentAdl(AdlTag, F f[[$for j [[, A$j a$j]]]]) {\n  return f([[$for j, [[a$j]]]]);\n}\n]]\n\n}  // namespace invoke_argument\n}  // namespace internal\n\n$range i 0..n\n$for i [[\n$range j 0..i-1\n\nACTION_TEMPLATE(InvokeArgument,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]])) {\n  using internal::invoke_argument::InvokeArgumentAdl;\n  return InvokeArgumentAdl<return_type>(\n      internal::invoke_argument::AdlTag(),\n      ::testing::get<k>(args)$for j [[, p$j]]);\n}\n\n]]\n\n// Various overloads for ReturnNew<T>().\n//\n// The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new\n// instance of type T, constructed on the heap with constructor arguments\n// a1, a2, ..., and a_k. The caller assumes ownership of the returned value.\n$range i 0..n\n$for i [[\n$range j 0..i-1\n$var ps = [[$for j, [[p$j]]]]\n\nACTION_TEMPLATE(ReturnNew,\n                HAS_1_TEMPLATE_PARAMS(typename, T),\n                AND_$i[[]]_VALUE_PARAMS($ps)) {\n  return new T($ps);\n}\n\n]]\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n\n}  // namespace testing\n\n// Include any custom callback actions added by the local installation.\n// We must include this header at the end to make sure it can use the\n// declarations from this file.\n#include \"gmock/internal/custom/gmock-generated-actions.h\"\n\n#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/gmock-generated-function-mockers.h",
    "content": "// This file was GENERATED by command:\n//     pump.py gmock-generated-function-mockers.h.pump\n// DO NOT EDIT BY HAND!!!\n\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements function mockers of various arities.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_\n#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_\n\n#include \"gmock/gmock-spec-builders.h\"\n#include \"gmock/internal/gmock-internal-utils.h\"\n\n#if GTEST_HAS_STD_FUNCTION_\n# include <functional>\n#endif\n\nnamespace testing {\nnamespace internal {\n\ntemplate <typename F>\nclass FunctionMockerBase;\n\n// Note: class FunctionMocker really belongs to the ::testing\n// namespace.  However if we define it in ::testing, MSVC will\n// complain when classes in ::testing::internal declare it as a\n// friend class template.  To workaround this compiler bug, we define\n// FunctionMocker in ::testing::internal and import it into ::testing.\ntemplate <typename F>\nclass FunctionMocker;\n\ntemplate <typename R>\nclass FunctionMocker<R()> : public\n    internal::FunctionMockerBase<R()> {\n public:\n  typedef R F();\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n  MockSpec<F> With() {\n    return MockSpec<F>(this, ::testing::make_tuple());\n  }\n\n  R Invoke() {\n    // Even though gcc and MSVC don't enforce it, 'this->' is required\n    // by the C++ standard [14.6.4] here, as the base class type is\n    // dependent on the template argument (and thus shouldn't be\n    // looked into when resolving InvokeWith).\n    return this->InvokeWith(ArgumentTuple());\n  }\n};\n\ntemplate <typename R, typename A1>\nclass FunctionMocker<R(A1)> : public\n    internal::FunctionMockerBase<R(A1)> {\n public:\n  typedef R F(A1);\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n  MockSpec<F> With(const Matcher<A1>& m1) {\n    return MockSpec<F>(this, ::testing::make_tuple(m1));\n  }\n\n  R Invoke(A1 a1) {\n    // Even though gcc and MSVC don't enforce it, 'this->' is required\n    // by the C++ standard [14.6.4] here, as the base class type is\n    // dependent on the template argument (and thus shouldn't be\n    // looked into when resolving InvokeWith).\n    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1)));\n  }\n};\n\ntemplate <typename R, typename A1, typename A2>\nclass FunctionMocker<R(A1, A2)> : public\n    internal::FunctionMockerBase<R(A1, A2)> {\n public:\n  typedef R F(A1, A2);\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2) {\n    return MockSpec<F>(this, ::testing::make_tuple(m1, m2));\n  }\n\n  R Invoke(A1 a1, A2 a2) {\n    // Even though gcc and MSVC don't enforce it, 'this->' is required\n    // by the C++ standard [14.6.4] here, as the base class type is\n    // dependent on the template argument (and thus shouldn't be\n    // looked into when resolving InvokeWith).\n    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),\n        internal::forward<A2>(a2)));\n  }\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3>\nclass FunctionMocker<R(A1, A2, A3)> : public\n    internal::FunctionMockerBase<R(A1, A2, A3)> {\n public:\n  typedef R F(A1, A2, A3);\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,\n      const Matcher<A3>& m3) {\n    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3));\n  }\n\n  R Invoke(A1 a1, A2 a2, A3 a3) {\n    // Even though gcc and MSVC don't enforce it, 'this->' is required\n    // by the C++ standard [14.6.4] here, as the base class type is\n    // dependent on the template argument (and thus shouldn't be\n    // looked into when resolving InvokeWith).\n    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),\n        internal::forward<A2>(a2), internal::forward<A3>(a3)));\n  }\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4>\nclass FunctionMocker<R(A1, A2, A3, A4)> : public\n    internal::FunctionMockerBase<R(A1, A2, A3, A4)> {\n public:\n  typedef R F(A1, A2, A3, A4);\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,\n      const Matcher<A3>& m3, const Matcher<A4>& m4) {\n    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4));\n  }\n\n  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4) {\n    // Even though gcc and MSVC don't enforce it, 'this->' is required\n    // by the C++ standard [14.6.4] here, as the base class type is\n    // dependent on the template argument (and thus shouldn't be\n    // looked into when resolving InvokeWith).\n    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),\n        internal::forward<A2>(a2), internal::forward<A3>(a3),\n        internal::forward<A4>(a4)));\n  }\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5>\nclass FunctionMocker<R(A1, A2, A3, A4, A5)> : public\n    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5)> {\n public:\n  typedef R F(A1, A2, A3, A4, A5);\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,\n      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5) {\n    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5));\n  }\n\n  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {\n    // Even though gcc and MSVC don't enforce it, 'this->' is required\n    // by the C++ standard [14.6.4] here, as the base class type is\n    // dependent on the template argument (and thus shouldn't be\n    // looked into when resolving InvokeWith).\n    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),\n        internal::forward<A2>(a2), internal::forward<A3>(a3),\n        internal::forward<A4>(a4), internal::forward<A5>(a5)));\n  }\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5, typename A6>\nclass FunctionMocker<R(A1, A2, A3, A4, A5, A6)> : public\n    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6)> {\n public:\n  typedef R F(A1, A2, A3, A4, A5, A6);\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,\n      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,\n      const Matcher<A6>& m6) {\n    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6));\n  }\n\n  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {\n    // Even though gcc and MSVC don't enforce it, 'this->' is required\n    // by the C++ standard [14.6.4] here, as the base class type is\n    // dependent on the template argument (and thus shouldn't be\n    // looked into when resolving InvokeWith).\n    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),\n        internal::forward<A2>(a2), internal::forward<A3>(a3),\n        internal::forward<A4>(a4), internal::forward<A5>(a5),\n        internal::forward<A6>(a6)));\n  }\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5, typename A6, typename A7>\nclass FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7)> : public\n    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7)> {\n public:\n  typedef R F(A1, A2, A3, A4, A5, A6, A7);\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,\n      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,\n      const Matcher<A6>& m6, const Matcher<A7>& m7) {\n    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7));\n  }\n\n  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {\n    // Even though gcc and MSVC don't enforce it, 'this->' is required\n    // by the C++ standard [14.6.4] here, as the base class type is\n    // dependent on the template argument (and thus shouldn't be\n    // looked into when resolving InvokeWith).\n    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),\n        internal::forward<A2>(a2), internal::forward<A3>(a3),\n        internal::forward<A4>(a4), internal::forward<A5>(a5),\n        internal::forward<A6>(a6), internal::forward<A7>(a7)));\n  }\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5, typename A6, typename A7, typename A8>\nclass FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8)> : public\n    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8)> {\n public:\n  typedef R F(A1, A2, A3, A4, A5, A6, A7, A8);\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,\n      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,\n      const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8) {\n    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7,\n        m8));\n  }\n\n  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) {\n    // Even though gcc and MSVC don't enforce it, 'this->' is required\n    // by the C++ standard [14.6.4] here, as the base class type is\n    // dependent on the template argument (and thus shouldn't be\n    // looked into when resolving InvokeWith).\n    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),\n        internal::forward<A2>(a2), internal::forward<A3>(a3),\n        internal::forward<A4>(a4), internal::forward<A5>(a5),\n        internal::forward<A6>(a6), internal::forward<A7>(a7),\n        internal::forward<A8>(a8)));\n  }\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5, typename A6, typename A7, typename A8, typename A9>\nclass FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> : public\n    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> {\n public:\n  typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9);\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,\n      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,\n      const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8,\n      const Matcher<A9>& m9) {\n    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7,\n        m8, m9));\n  }\n\n  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) {\n    // Even though gcc and MSVC don't enforce it, 'this->' is required\n    // by the C++ standard [14.6.4] here, as the base class type is\n    // dependent on the template argument (and thus shouldn't be\n    // looked into when resolving InvokeWith).\n    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),\n        internal::forward<A2>(a2), internal::forward<A3>(a3),\n        internal::forward<A4>(a4), internal::forward<A5>(a5),\n        internal::forward<A6>(a6), internal::forward<A7>(a7),\n        internal::forward<A8>(a8), internal::forward<A9>(a9)));\n  }\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5, typename A6, typename A7, typename A8, typename A9,\n    typename A10>\nclass FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> : public\n    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> {\n public:\n  typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,\n      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,\n      const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8,\n      const Matcher<A9>& m9, const Matcher<A10>& m10) {\n    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7,\n        m8, m9, m10));\n  }\n\n  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9,\n      A10 a10) {\n    // Even though gcc and MSVC don't enforce it, 'this->' is required\n    // by the C++ standard [14.6.4] here, as the base class type is\n    // dependent on the template argument (and thus shouldn't be\n    // looked into when resolving InvokeWith).\n    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),\n        internal::forward<A2>(a2), internal::forward<A3>(a3),\n        internal::forward<A4>(a4), internal::forward<A5>(a5),\n        internal::forward<A6>(a6), internal::forward<A7>(a7),\n        internal::forward<A8>(a8), internal::forward<A9>(a9),\n        internal::forward<A10>(a10)));\n  }\n};\n\n// Removes the given pointer; this is a helper for the expectation setter method\n// for parameterless matchers.\n//\n// We want to make sure that the user cannot set a parameterless expectation on\n// overloaded methods, including methods which are overloaded on const. Example:\n//\n//   class MockClass {\n//     MOCK_METHOD0(GetName, string&());\n//     MOCK_CONST_METHOD0(GetName, const string&());\n//   };\n//\n//   TEST() {\n//     // This should be an error, as it's not clear which overload is expected.\n//     EXPECT_CALL(mock, GetName).WillOnce(ReturnRef(value));\n//   }\n//\n// Here are the generated expectation-setter methods:\n//\n//   class MockClass {\n//     // Overload 1\n//     MockSpec<string&()> gmock_GetName() { ... }\n//     // Overload 2. Declared const so that the compiler will generate an\n//     // error when trying to resolve between this and overload 4 in\n//     // 'gmock_GetName(WithoutMatchers(), nullptr)'.\n//     MockSpec<string&()> gmock_GetName(\n//         const WithoutMatchers&, const Function<string&()>*) const {\n//       // Removes const from this, calls overload 1\n//       return AdjustConstness_(this)->gmock_GetName();\n//     }\n//\n//     // Overload 3\n//     const string& gmock_GetName() const { ... }\n//     // Overload 4\n//     MockSpec<const string&()> gmock_GetName(\n//         const WithoutMatchers&, const Function<const string&()>*) const {\n//       // Does not remove const, calls overload 3\n//       return AdjustConstness_const(this)->gmock_GetName();\n//     }\n//   }\n//\ntemplate <typename MockType>\nconst MockType* AdjustConstness_const(const MockType* mock) {\n  return mock;\n}\n\n// Removes const from and returns the given pointer; this is a helper for the\n// expectation setter method for parameterless matchers.\ntemplate <typename MockType>\nMockType* AdjustConstness_(const MockType* mock) {\n  return const_cast<MockType*>(mock);\n}\n\n}  // namespace internal\n\n// The style guide prohibits \"using\" statements in a namespace scope\n// inside a header file.  However, the FunctionMocker class template\n// is meant to be defined in the ::testing namespace.  The following\n// line is just a trick for working around a bug in MSVC 8.0, which\n// cannot handle it if we define FunctionMocker in ::testing.\nusing internal::FunctionMocker;\n\n// GMOCK_RESULT_(tn, F) expands to the result type of function type F.\n// We define this as a variadic macro in case F contains unprotected\n// commas (the same reason that we use variadic macros in other places\n// in this file).\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_RESULT_(tn, ...) \\\n    tn ::testing::internal::Function<__VA_ARGS__>::Result\n\n// The type of argument N of the given function type.\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_ARG_(tn, N, ...) \\\n    tn ::testing::internal::Function<__VA_ARGS__>::Argument##N\n\n// The matcher type for argument N of the given function type.\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_MATCHER_(tn, N, ...) \\\n    const ::testing::Matcher<GMOCK_ARG_(tn, N, __VA_ARGS__)>&\n\n// The variable for mocking the given method.\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_MOCKER_(arity, constness, Method) \\\n    GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__)\n\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_METHOD0_(tn, constness, ct, Method, ...)                       \\\n  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method() constness {                     \\\n    GTEST_COMPILE_ASSERT_(                                                   \\\n        (::testing::tuple_size<tn ::testing::internal::Function<             \\\n             __VA_ARGS__>::ArgumentTuple>::value == 0),                      \\\n        this_method_does_not_take_0_arguments);                              \\\n    GMOCK_MOCKER_(0, constness, Method).SetOwnerAndName(this, #Method);      \\\n    return GMOCK_MOCKER_(0, constness, Method).Invoke();                     \\\n  }                                                                          \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method() constness {              \\\n    GMOCK_MOCKER_(0, constness, Method).RegisterOwner(this);                 \\\n    return GMOCK_MOCKER_(0, constness, Method).With();                       \\\n  }                                                                          \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                           \\\n      const ::testing::internal::WithoutMatchers&,                           \\\n      constness ::testing::internal::Function<__VA_ARGS__>*) const {         \\\n    return ::testing::internal::AdjustConstness_##constness(this)            \\\n        ->gmock_##Method();                                                  \\\n  }                                                                          \\\n  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(0, constness, \\\n                                                               Method)\n\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_METHOD1_(tn, constness, ct, Method, ...)                        \\\n  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \\\n  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1) constness {              \\\n    GTEST_COMPILE_ASSERT_(                                                    \\\n        (::testing::tuple_size<tn ::testing::internal::Function<              \\\n             __VA_ARGS__>::ArgumentTuple>::value == 1),                       \\\n        this_method_does_not_take_1_argument);                                \\\n    GMOCK_MOCKER_(1, constness, Method).SetOwnerAndName(this, #Method);       \\\n    return GMOCK_MOCKER_(1, constness, Method)                                \\\n        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \\\n            gmock_a1));                                                       \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1) constness {                \\\n    GMOCK_MOCKER_(1, constness, Method).RegisterOwner(this);                  \\\n    return GMOCK_MOCKER_(1, constness, Method).With(gmock_a1);                \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      const ::testing::internal::WithoutMatchers&,                            \\\n      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \\\n    return ::testing::internal::AdjustConstness_##constness(this)             \\\n        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>());     \\\n  }                                                                           \\\n  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(1, constness,  \\\n                                                               Method)\n\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_METHOD2_(tn, constness, ct, Method, ...)                        \\\n  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \\\n  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \\\n            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2) constness {              \\\n    GTEST_COMPILE_ASSERT_(                                                    \\\n        (::testing::tuple_size<tn ::testing::internal::Function<              \\\n             __VA_ARGS__>::ArgumentTuple>::value == 2),                       \\\n        this_method_does_not_take_2_arguments);                               \\\n    GMOCK_MOCKER_(2, constness, Method).SetOwnerAndName(this, #Method);       \\\n    return GMOCK_MOCKER_(2, constness, Method)                                \\\n        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \\\n                    gmock_a1),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \\\n                    gmock_a2));                                               \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \\\n      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2) constness {                \\\n    GMOCK_MOCKER_(2, constness, Method).RegisterOwner(this);                  \\\n    return GMOCK_MOCKER_(2, constness, Method).With(gmock_a1, gmock_a2);      \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      const ::testing::internal::WithoutMatchers&,                            \\\n      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \\\n    return ::testing::internal::AdjustConstness_##constness(this)             \\\n        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>());     \\\n  }                                                                           \\\n  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(2, constness,  \\\n                                                               Method)\n\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_METHOD3_(tn, constness, ct, Method, ...)                        \\\n  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \\\n  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \\\n            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \\\n            GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3) constness {              \\\n    GTEST_COMPILE_ASSERT_(                                                    \\\n        (::testing::tuple_size<tn ::testing::internal::Function<              \\\n             __VA_ARGS__>::ArgumentTuple>::value == 3),                       \\\n        this_method_does_not_take_3_arguments);                               \\\n    GMOCK_MOCKER_(3, constness, Method).SetOwnerAndName(this, #Method);       \\\n    return GMOCK_MOCKER_(3, constness, Method)                                \\\n        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \\\n                    gmock_a1),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \\\n                    gmock_a2),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \\\n                    gmock_a3));                                               \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \\\n      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \\\n      GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3) constness {                \\\n    GMOCK_MOCKER_(3, constness, Method).RegisterOwner(this);                  \\\n    return GMOCK_MOCKER_(3, constness, Method)                                \\\n        .With(gmock_a1, gmock_a2, gmock_a3);                                  \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      const ::testing::internal::WithoutMatchers&,                            \\\n      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \\\n    return ::testing::internal::AdjustConstness_##constness(this)             \\\n        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>());     \\\n  }                                                                           \\\n  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(3, constness,  \\\n                                                               Method)\n\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_METHOD4_(tn, constness, ct, Method, ...)                        \\\n  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \\\n  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \\\n            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \\\n            GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \\\n            GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4) constness {              \\\n    GTEST_COMPILE_ASSERT_(                                                    \\\n        (::testing::tuple_size<tn ::testing::internal::Function<              \\\n             __VA_ARGS__>::ArgumentTuple>::value == 4),                       \\\n        this_method_does_not_take_4_arguments);                               \\\n    GMOCK_MOCKER_(4, constness, Method).SetOwnerAndName(this, #Method);       \\\n    return GMOCK_MOCKER_(4, constness, Method)                                \\\n        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \\\n                    gmock_a1),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \\\n                    gmock_a2),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \\\n                    gmock_a3),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \\\n                    gmock_a4));                                               \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \\\n      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \\\n      GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \\\n      GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4) constness {                \\\n    GMOCK_MOCKER_(4, constness, Method).RegisterOwner(this);                  \\\n    return GMOCK_MOCKER_(4, constness, Method)                                \\\n        .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4);                        \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      const ::testing::internal::WithoutMatchers&,                            \\\n      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \\\n    return ::testing::internal::AdjustConstness_##constness(this)             \\\n        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>());     \\\n  }                                                                           \\\n  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(4, constness,  \\\n                                                               Method)\n\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_METHOD5_(tn, constness, ct, Method, ...)                        \\\n  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \\\n  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \\\n            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \\\n            GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \\\n            GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                          \\\n            GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5) constness {              \\\n    GTEST_COMPILE_ASSERT_(                                                    \\\n        (::testing::tuple_size<tn ::testing::internal::Function<              \\\n             __VA_ARGS__>::ArgumentTuple>::value == 5),                       \\\n        this_method_does_not_take_5_arguments);                               \\\n    GMOCK_MOCKER_(5, constness, Method).SetOwnerAndName(this, #Method);       \\\n    return GMOCK_MOCKER_(5, constness, Method)                                \\\n        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \\\n                    gmock_a1),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \\\n                    gmock_a2),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \\\n                    gmock_a3),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \\\n                    gmock_a4),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \\\n                    gmock_a5));                                               \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \\\n      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \\\n      GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \\\n      GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                            \\\n      GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5) constness {                \\\n    GMOCK_MOCKER_(5, constness, Method).RegisterOwner(this);                  \\\n    return GMOCK_MOCKER_(5, constness, Method)                                \\\n        .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5);              \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      const ::testing::internal::WithoutMatchers&,                            \\\n      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \\\n    return ::testing::internal::AdjustConstness_##constness(this)             \\\n        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>());     \\\n  }                                                                           \\\n  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(5, constness,  \\\n                                                               Method)\n\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_METHOD6_(tn, constness, ct, Method, ...)                        \\\n  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \\\n  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \\\n            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \\\n            GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \\\n            GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                          \\\n            GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5,                          \\\n            GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6) constness {              \\\n    GTEST_COMPILE_ASSERT_(                                                    \\\n        (::testing::tuple_size<tn ::testing::internal::Function<              \\\n             __VA_ARGS__>::ArgumentTuple>::value == 6),                       \\\n        this_method_does_not_take_6_arguments);                               \\\n    GMOCK_MOCKER_(6, constness, Method).SetOwnerAndName(this, #Method);       \\\n    return GMOCK_MOCKER_(6, constness, Method)                                \\\n        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \\\n                    gmock_a1),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \\\n                    gmock_a2),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \\\n                    gmock_a3),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \\\n                    gmock_a4),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \\\n                    gmock_a5),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \\\n                    gmock_a6));                                               \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \\\n      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \\\n      GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \\\n      GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                            \\\n      GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5,                            \\\n      GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6) constness {                \\\n    GMOCK_MOCKER_(6, constness, Method).RegisterOwner(this);                  \\\n    return GMOCK_MOCKER_(6, constness, Method)                                \\\n        .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6);    \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      const ::testing::internal::WithoutMatchers&,                            \\\n      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \\\n    return ::testing::internal::AdjustConstness_##constness(this)             \\\n        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>());     \\\n  }                                                                           \\\n  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(6, constness,  \\\n                                                               Method)\n\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_METHOD7_(tn, constness, ct, Method, ...)                        \\\n  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \\\n  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \\\n            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \\\n            GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \\\n            GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                          \\\n            GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5,                          \\\n            GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6,                          \\\n            GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7) constness {              \\\n    GTEST_COMPILE_ASSERT_(                                                    \\\n        (::testing::tuple_size<tn ::testing::internal::Function<              \\\n             __VA_ARGS__>::ArgumentTuple>::value == 7),                       \\\n        this_method_does_not_take_7_arguments);                               \\\n    GMOCK_MOCKER_(7, constness, Method).SetOwnerAndName(this, #Method);       \\\n    return GMOCK_MOCKER_(7, constness, Method)                                \\\n        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \\\n                    gmock_a1),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \\\n                    gmock_a2),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \\\n                    gmock_a3),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \\\n                    gmock_a4),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \\\n                    gmock_a5),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \\\n                    gmock_a6),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \\\n                    gmock_a7));                                               \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \\\n      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \\\n      GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \\\n      GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                            \\\n      GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5,                            \\\n      GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6,                            \\\n      GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7) constness {                \\\n    GMOCK_MOCKER_(7, constness, Method).RegisterOwner(this);                  \\\n    return GMOCK_MOCKER_(7, constness, Method)                                \\\n        .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6,     \\\n              gmock_a7);                                                      \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      const ::testing::internal::WithoutMatchers&,                            \\\n      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \\\n    return ::testing::internal::AdjustConstness_##constness(this)             \\\n        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>());     \\\n  }                                                                           \\\n  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(7, constness,  \\\n                                                               Method)\n\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_METHOD8_(tn, constness, ct, Method, ...)                        \\\n  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \\\n  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \\\n            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \\\n            GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \\\n            GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                          \\\n            GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5,                          \\\n            GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6,                          \\\n            GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7,                          \\\n            GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8) constness {              \\\n    GTEST_COMPILE_ASSERT_(                                                    \\\n        (::testing::tuple_size<tn ::testing::internal::Function<              \\\n             __VA_ARGS__>::ArgumentTuple>::value == 8),                       \\\n        this_method_does_not_take_8_arguments);                               \\\n    GMOCK_MOCKER_(8, constness, Method).SetOwnerAndName(this, #Method);       \\\n    return GMOCK_MOCKER_(8, constness, Method)                                \\\n        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \\\n                    gmock_a1),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \\\n                    gmock_a2),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \\\n                    gmock_a3),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \\\n                    gmock_a4),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \\\n                    gmock_a5),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \\\n                    gmock_a6),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \\\n                    gmock_a7),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>( \\\n                    gmock_a8));                                               \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \\\n      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \\\n      GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \\\n      GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                            \\\n      GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5,                            \\\n      GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6,                            \\\n      GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7,                            \\\n      GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8) constness {                \\\n    GMOCK_MOCKER_(8, constness, Method).RegisterOwner(this);                  \\\n    return GMOCK_MOCKER_(8, constness, Method)                                \\\n        .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6,     \\\n              gmock_a7, gmock_a8);                                            \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      const ::testing::internal::WithoutMatchers&,                            \\\n      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \\\n    return ::testing::internal::AdjustConstness_##constness(this)             \\\n        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>());     \\\n  }                                                                           \\\n  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(8, constness,  \\\n                                                               Method)\n\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_METHOD9_(tn, constness, ct, Method, ...)                        \\\n  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \\\n  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \\\n            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \\\n            GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \\\n            GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                          \\\n            GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5,                          \\\n            GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6,                          \\\n            GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7,                          \\\n            GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8,                          \\\n            GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9) constness {              \\\n    GTEST_COMPILE_ASSERT_(                                                    \\\n        (::testing::tuple_size<tn ::testing::internal::Function<              \\\n             __VA_ARGS__>::ArgumentTuple>::value == 9),                       \\\n        this_method_does_not_take_9_arguments);                               \\\n    GMOCK_MOCKER_(9, constness, Method).SetOwnerAndName(this, #Method);       \\\n    return GMOCK_MOCKER_(9, constness, Method)                                \\\n        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \\\n                    gmock_a1),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \\\n                    gmock_a2),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \\\n                    gmock_a3),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \\\n                    gmock_a4),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \\\n                    gmock_a5),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \\\n                    gmock_a6),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \\\n                    gmock_a7),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>( \\\n                    gmock_a8),                                                \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>( \\\n                    gmock_a9));                                               \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \\\n      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \\\n      GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \\\n      GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                            \\\n      GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5,                            \\\n      GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6,                            \\\n      GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7,                            \\\n      GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8,                            \\\n      GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9) constness {                \\\n    GMOCK_MOCKER_(9, constness, Method).RegisterOwner(this);                  \\\n    return GMOCK_MOCKER_(9, constness, Method)                                \\\n        .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6,     \\\n              gmock_a7, gmock_a8, gmock_a9);                                  \\\n  }                                                                           \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \\\n      const ::testing::internal::WithoutMatchers&,                            \\\n      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \\\n    return ::testing::internal::AdjustConstness_##constness(this)             \\\n        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(),      \\\n                         ::testing::A<GMOCK_ARG_(tn, 9, __VA_ARGS__)>());     \\\n  }                                                                           \\\n  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(9, constness,  \\\n                                                               Method)\n\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_METHOD10_(tn, constness, ct, Method, ...)                        \\\n  GMOCK_RESULT_(tn, __VA_ARGS__)                                               \\\n  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                           \\\n            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                           \\\n            GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                           \\\n            GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                           \\\n            GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5,                           \\\n            GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6,                           \\\n            GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7,                           \\\n            GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8,                           \\\n            GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9,                           \\\n            GMOCK_ARG_(tn, 10, __VA_ARGS__) gmock_a10) constness {             \\\n    GTEST_COMPILE_ASSERT_(                                                     \\\n        (::testing::tuple_size<tn ::testing::internal::Function<               \\\n             __VA_ARGS__>::ArgumentTuple>::value == 10),                       \\\n        this_method_does_not_take_10_arguments);                               \\\n    GMOCK_MOCKER_(10, constness, Method).SetOwnerAndName(this, #Method);       \\\n    return GMOCK_MOCKER_(10, constness, Method)                                \\\n        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(  \\\n                    gmock_a1),                                                 \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(  \\\n                    gmock_a2),                                                 \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(  \\\n                    gmock_a3),                                                 \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(  \\\n                    gmock_a4),                                                 \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(  \\\n                    gmock_a5),                                                 \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(  \\\n                    gmock_a6),                                                 \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(  \\\n                    gmock_a7),                                                 \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(  \\\n                    gmock_a8),                                                 \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(  \\\n                    gmock_a9),                                                 \\\n                ::testing::internal::forward<GMOCK_ARG_(tn, 10, __VA_ARGS__)>( \\\n                    gmock_a10));                                               \\\n  }                                                                            \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                             \\\n      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                             \\\n      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                             \\\n      GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                             \\\n      GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                             \\\n      GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5,                             \\\n      GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6,                             \\\n      GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7,                             \\\n      GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8,                             \\\n      GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9,                             \\\n      GMOCK_MATCHER_(tn, 10, __VA_ARGS__) gmock_a10) constness {               \\\n    GMOCK_MOCKER_(10, constness, Method).RegisterOwner(this);                  \\\n    return GMOCK_MOCKER_(10, constness, Method)                                \\\n        .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6,      \\\n              gmock_a7, gmock_a8, gmock_a9, gmock_a10);                        \\\n  }                                                                            \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                             \\\n      const ::testing::internal::WithoutMatchers&,                             \\\n      constness ::testing::internal::Function<__VA_ARGS__>*) const {           \\\n    return ::testing::internal::AdjustConstness_##constness(this)              \\\n        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),       \\\n                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),       \\\n                         ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),       \\\n                         ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),       \\\n                         ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(),       \\\n                         ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(),       \\\n                         ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(),       \\\n                         ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(),       \\\n                         ::testing::A<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(),       \\\n                         ::testing::A<GMOCK_ARG_(tn, 10, __VA_ARGS__)>());     \\\n  }                                                                            \\\n  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(10, constness,  \\\n                                                               Method)\n\n#define MOCK_METHOD0(m, ...) GMOCK_METHOD0_(, , , m, __VA_ARGS__)\n#define MOCK_METHOD1(m, ...) GMOCK_METHOD1_(, , , m, __VA_ARGS__)\n#define MOCK_METHOD2(m, ...) GMOCK_METHOD2_(, , , m, __VA_ARGS__)\n#define MOCK_METHOD3(m, ...) GMOCK_METHOD3_(, , , m, __VA_ARGS__)\n#define MOCK_METHOD4(m, ...) GMOCK_METHOD4_(, , , m, __VA_ARGS__)\n#define MOCK_METHOD5(m, ...) GMOCK_METHOD5_(, , , m, __VA_ARGS__)\n#define MOCK_METHOD6(m, ...) GMOCK_METHOD6_(, , , m, __VA_ARGS__)\n#define MOCK_METHOD7(m, ...) GMOCK_METHOD7_(, , , m, __VA_ARGS__)\n#define MOCK_METHOD8(m, ...) GMOCK_METHOD8_(, , , m, __VA_ARGS__)\n#define MOCK_METHOD9(m, ...) GMOCK_METHOD9_(, , , m, __VA_ARGS__)\n#define MOCK_METHOD10(m, ...) GMOCK_METHOD10_(, , , m, __VA_ARGS__)\n\n#define MOCK_CONST_METHOD0(m, ...) GMOCK_METHOD0_(, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD1(m, ...) GMOCK_METHOD1_(, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD2(m, ...) GMOCK_METHOD2_(, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD3(m, ...) GMOCK_METHOD3_(, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD4(m, ...) GMOCK_METHOD4_(, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD5(m, ...) GMOCK_METHOD5_(, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD6(m, ...) GMOCK_METHOD6_(, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD7(m, ...) GMOCK_METHOD7_(, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD8(m, ...) GMOCK_METHOD8_(, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD9(m, ...) GMOCK_METHOD9_(, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD10(m, ...) GMOCK_METHOD10_(, const, , m, __VA_ARGS__)\n\n#define MOCK_METHOD0_T(m, ...) GMOCK_METHOD0_(typename, , , m, __VA_ARGS__)\n#define MOCK_METHOD1_T(m, ...) GMOCK_METHOD1_(typename, , , m, __VA_ARGS__)\n#define MOCK_METHOD2_T(m, ...) GMOCK_METHOD2_(typename, , , m, __VA_ARGS__)\n#define MOCK_METHOD3_T(m, ...) GMOCK_METHOD3_(typename, , , m, __VA_ARGS__)\n#define MOCK_METHOD4_T(m, ...) GMOCK_METHOD4_(typename, , , m, __VA_ARGS__)\n#define MOCK_METHOD5_T(m, ...) GMOCK_METHOD5_(typename, , , m, __VA_ARGS__)\n#define MOCK_METHOD6_T(m, ...) GMOCK_METHOD6_(typename, , , m, __VA_ARGS__)\n#define MOCK_METHOD7_T(m, ...) GMOCK_METHOD7_(typename, , , m, __VA_ARGS__)\n#define MOCK_METHOD8_T(m, ...) GMOCK_METHOD8_(typename, , , m, __VA_ARGS__)\n#define MOCK_METHOD9_T(m, ...) GMOCK_METHOD9_(typename, , , m, __VA_ARGS__)\n#define MOCK_METHOD10_T(m, ...) GMOCK_METHOD10_(typename, , , m, __VA_ARGS__)\n\n#define MOCK_CONST_METHOD0_T(m, ...) \\\n    GMOCK_METHOD0_(typename, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD1_T(m, ...) \\\n    GMOCK_METHOD1_(typename, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD2_T(m, ...) \\\n    GMOCK_METHOD2_(typename, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD3_T(m, ...) \\\n    GMOCK_METHOD3_(typename, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD4_T(m, ...) \\\n    GMOCK_METHOD4_(typename, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD5_T(m, ...) \\\n    GMOCK_METHOD5_(typename, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD6_T(m, ...) \\\n    GMOCK_METHOD6_(typename, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD7_T(m, ...) \\\n    GMOCK_METHOD7_(typename, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD8_T(m, ...) \\\n    GMOCK_METHOD8_(typename, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD9_T(m, ...) \\\n    GMOCK_METHOD9_(typename, const, , m, __VA_ARGS__)\n#define MOCK_CONST_METHOD10_T(m, ...) \\\n    GMOCK_METHOD10_(typename, const, , m, __VA_ARGS__)\n\n#define MOCK_METHOD0_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD0_(, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD1_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD1_(, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD2_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD2_(, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD3_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD3_(, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD4_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD4_(, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD5_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD5_(, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD6_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD6_(, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD7_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD7_(, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD8_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD8_(, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD9_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD9_(, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD10_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD10_(, , ct, m, __VA_ARGS__)\n\n#define MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD0_(, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD1_(, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD2_(, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD3_(, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD4_(, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD5_(, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD6_(, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD7_(, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD8_(, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD9_(, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD10_(, const, ct, m, __VA_ARGS__)\n\n#define MOCK_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD0_(typename, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD1_(typename, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD2_(typename, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD3_(typename, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD4_(typename, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD5_(typename, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD6_(typename, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD7_(typename, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD8_(typename, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD9_(typename, , ct, m, __VA_ARGS__)\n#define MOCK_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD10_(typename, , ct, m, __VA_ARGS__)\n\n#define MOCK_CONST_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD0_(typename, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD1_(typename, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD2_(typename, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD3_(typename, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD4_(typename, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD5_(typename, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD6_(typename, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD7_(typename, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD8_(typename, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD9_(typename, const, ct, m, __VA_ARGS__)\n#define MOCK_CONST_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD10_(typename, const, ct, m, __VA_ARGS__)\n\n// A MockFunction<F> class has one mock method whose type is F.  It is\n// useful when you just want your test code to emit some messages and\n// have Google Mock verify the right messages are sent (and perhaps at\n// the right times).  For example, if you are exercising code:\n//\n//   Foo(1);\n//   Foo(2);\n//   Foo(3);\n//\n// and want to verify that Foo(1) and Foo(3) both invoke\n// mock.Bar(\"a\"), but Foo(2) doesn't invoke anything, you can write:\n//\n// TEST(FooTest, InvokesBarCorrectly) {\n//   MyMock mock;\n//   MockFunction<void(string check_point_name)> check;\n//   {\n//     InSequence s;\n//\n//     EXPECT_CALL(mock, Bar(\"a\"));\n//     EXPECT_CALL(check, Call(\"1\"));\n//     EXPECT_CALL(check, Call(\"2\"));\n//     EXPECT_CALL(mock, Bar(\"a\"));\n//   }\n//   Foo(1);\n//   check.Call(\"1\");\n//   Foo(2);\n//   check.Call(\"2\");\n//   Foo(3);\n// }\n//\n// The expectation spec says that the first Bar(\"a\") must happen\n// before check point \"1\", the second Bar(\"a\") must happen after check\n// point \"2\", and nothing should happen between the two check\n// points. The explicit check points make it easy to tell which\n// Bar(\"a\") is called by which call to Foo().\n//\n// MockFunction<F> can also be used to exercise code that accepts\n// std::function<F> callbacks. To do so, use AsStdFunction() method\n// to create std::function proxy forwarding to original object's Call.\n// Example:\n//\n// TEST(FooTest, RunsCallbackWithBarArgument) {\n//   MockFunction<int(string)> callback;\n//   EXPECT_CALL(callback, Call(\"bar\")).WillOnce(Return(1));\n//   Foo(callback.AsStdFunction());\n// }\ntemplate <typename F>\nclass MockFunction;\n\ntemplate <typename R>\nclass MockFunction<R()> {\n public:\n  MockFunction() {}\n\n  MOCK_METHOD0_T(Call, R());\n\n#if GTEST_HAS_STD_FUNCTION_\n  ::std::function<R()> AsStdFunction() {\n    return [this]() -> R {\n      return this->Call();\n    };\n  }\n#endif  // GTEST_HAS_STD_FUNCTION_\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);\n};\n\ntemplate <typename R, typename A0>\nclass MockFunction<R(A0)> {\n public:\n  MockFunction() {}\n\n  MOCK_METHOD1_T(Call, R(A0));\n\n#if GTEST_HAS_STD_FUNCTION_\n  ::std::function<R(A0)> AsStdFunction() {\n    return [this](A0 a0) -> R {\n      return this->Call(::std::move(a0));\n    };\n  }\n#endif  // GTEST_HAS_STD_FUNCTION_\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);\n};\n\ntemplate <typename R, typename A0, typename A1>\nclass MockFunction<R(A0, A1)> {\n public:\n  MockFunction() {}\n\n  MOCK_METHOD2_T(Call, R(A0, A1));\n\n#if GTEST_HAS_STD_FUNCTION_\n  ::std::function<R(A0, A1)> AsStdFunction() {\n    return [this](A0 a0, A1 a1) -> R {\n      return this->Call(::std::move(a0), ::std::move(a1));\n    };\n  }\n#endif  // GTEST_HAS_STD_FUNCTION_\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);\n};\n\ntemplate <typename R, typename A0, typename A1, typename A2>\nclass MockFunction<R(A0, A1, A2)> {\n public:\n  MockFunction() {}\n\n  MOCK_METHOD3_T(Call, R(A0, A1, A2));\n\n#if GTEST_HAS_STD_FUNCTION_\n  ::std::function<R(A0, A1, A2)> AsStdFunction() {\n    return [this](A0 a0, A1 a1, A2 a2) -> R {\n      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2));\n    };\n  }\n#endif  // GTEST_HAS_STD_FUNCTION_\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);\n};\n\ntemplate <typename R, typename A0, typename A1, typename A2, typename A3>\nclass MockFunction<R(A0, A1, A2, A3)> {\n public:\n  MockFunction() {}\n\n  MOCK_METHOD4_T(Call, R(A0, A1, A2, A3));\n\n#if GTEST_HAS_STD_FUNCTION_\n  ::std::function<R(A0, A1, A2, A3)> AsStdFunction() {\n    return [this](A0 a0, A1 a1, A2 a2, A3 a3) -> R {\n      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),\n          ::std::move(a3));\n    };\n  }\n#endif  // GTEST_HAS_STD_FUNCTION_\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);\n};\n\ntemplate <typename R, typename A0, typename A1, typename A2, typename A3,\n    typename A4>\nclass MockFunction<R(A0, A1, A2, A3, A4)> {\n public:\n  MockFunction() {}\n\n  MOCK_METHOD5_T(Call, R(A0, A1, A2, A3, A4));\n\n#if GTEST_HAS_STD_FUNCTION_\n  ::std::function<R(A0, A1, A2, A3, A4)> AsStdFunction() {\n    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) -> R {\n      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),\n          ::std::move(a3), ::std::move(a4));\n    };\n  }\n#endif  // GTEST_HAS_STD_FUNCTION_\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);\n};\n\ntemplate <typename R, typename A0, typename A1, typename A2, typename A3,\n    typename A4, typename A5>\nclass MockFunction<R(A0, A1, A2, A3, A4, A5)> {\n public:\n  MockFunction() {}\n\n  MOCK_METHOD6_T(Call, R(A0, A1, A2, A3, A4, A5));\n\n#if GTEST_HAS_STD_FUNCTION_\n  ::std::function<R(A0, A1, A2, A3, A4, A5)> AsStdFunction() {\n    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) -> R {\n      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),\n          ::std::move(a3), ::std::move(a4), ::std::move(a5));\n    };\n  }\n#endif  // GTEST_HAS_STD_FUNCTION_\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);\n};\n\ntemplate <typename R, typename A0, typename A1, typename A2, typename A3,\n    typename A4, typename A5, typename A6>\nclass MockFunction<R(A0, A1, A2, A3, A4, A5, A6)> {\n public:\n  MockFunction() {}\n\n  MOCK_METHOD7_T(Call, R(A0, A1, A2, A3, A4, A5, A6));\n\n#if GTEST_HAS_STD_FUNCTION_\n  ::std::function<R(A0, A1, A2, A3, A4, A5, A6)> AsStdFunction() {\n    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) -> R {\n      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),\n          ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6));\n    };\n  }\n#endif  // GTEST_HAS_STD_FUNCTION_\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);\n};\n\ntemplate <typename R, typename A0, typename A1, typename A2, typename A3,\n    typename A4, typename A5, typename A6, typename A7>\nclass MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7)> {\n public:\n  MockFunction() {}\n\n  MOCK_METHOD8_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7));\n\n#if GTEST_HAS_STD_FUNCTION_\n  ::std::function<R(A0, A1, A2, A3, A4, A5, A6, A7)> AsStdFunction() {\n    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) -> R {\n      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),\n          ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6),\n          ::std::move(a7));\n    };\n  }\n#endif  // GTEST_HAS_STD_FUNCTION_\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);\n};\n\ntemplate <typename R, typename A0, typename A1, typename A2, typename A3,\n    typename A4, typename A5, typename A6, typename A7, typename A8>\nclass MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7, A8)> {\n public:\n  MockFunction() {}\n\n  MOCK_METHOD9_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8));\n\n#if GTEST_HAS_STD_FUNCTION_\n  ::std::function<R(A0, A1, A2, A3, A4, A5, A6, A7, A8)> AsStdFunction() {\n    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7,\n        A8 a8) -> R {\n      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),\n          ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6),\n          ::std::move(a7), ::std::move(a8));\n    };\n  }\n#endif  // GTEST_HAS_STD_FUNCTION_\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);\n};\n\ntemplate <typename R, typename A0, typename A1, typename A2, typename A3,\n    typename A4, typename A5, typename A6, typename A7, typename A8,\n    typename A9>\nclass MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)> {\n public:\n  MockFunction() {}\n\n  MOCK_METHOD10_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9));\n\n#if GTEST_HAS_STD_FUNCTION_\n  ::std::function<R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)> AsStdFunction() {\n    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7,\n        A8 a8, A9 a9) -> R {\n      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),\n          ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6),\n          ::std::move(a7), ::std::move(a8), ::std::move(a9));\n    };\n  }\n#endif  // GTEST_HAS_STD_FUNCTION_\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);\n};\n\n}  // namespace testing\n\n#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/gmock-generated-function-mockers.h.pump",
    "content": "$$ -*- mode: c++; -*-\n$$ This is a Pump source file.  Please use Pump to convert\n$$ it to gmock-generated-function-mockers.h.\n$$\n$var n = 10  $$ The maximum arity we support.\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements function mockers of various arities.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_\n#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_\n\n#include \"gmock/gmock-spec-builders.h\"\n#include \"gmock/internal/gmock-internal-utils.h\"\n\n#if GTEST_HAS_STD_FUNCTION_\n# include <functional>\n#endif\n\nnamespace testing {\nnamespace internal {\n\ntemplate <typename F>\nclass FunctionMockerBase;\n\n// Note: class FunctionMocker really belongs to the ::testing\n// namespace.  However if we define it in ::testing, MSVC will\n// complain when classes in ::testing::internal declare it as a\n// friend class template.  To workaround this compiler bug, we define\n// FunctionMocker in ::testing::internal and import it into ::testing.\ntemplate <typename F>\nclass FunctionMocker;\n\n\n$range i 0..n\n$for i [[\n$range j 1..i\n$var typename_As = [[$for j [[, typename A$j]]]]\n$var As = [[$for j, [[A$j]]]]\n$var as = [[$for j, [[internal::forward<A$j>(a$j)]]]]\n$var Aas = [[$for j, [[A$j a$j]]]]\n$var ms = [[$for j, [[m$j]]]]\n$var matchers = [[$for j, [[const Matcher<A$j>& m$j]]]]\ntemplate <typename R$typename_As>\nclass FunctionMocker<R($As)> : public\n    internal::FunctionMockerBase<R($As)> {\n public:\n  typedef R F($As);\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n\n  MockSpec<F> With($matchers) {\n    return MockSpec<F>(this, ::testing::make_tuple($ms));\n  }\n\n  R Invoke($Aas) {\n    // Even though gcc and MSVC don't enforce it, 'this->' is required\n    // by the C++ standard [14.6.4] here, as the base class type is\n    // dependent on the template argument (and thus shouldn't be\n    // looked into when resolving InvokeWith).\n    return this->InvokeWith(ArgumentTuple($as));\n  }\n};\n\n\n]]\n// Removes the given pointer; this is a helper for the expectation setter method\n// for parameterless matchers.\n//\n// We want to make sure that the user cannot set a parameterless expectation on\n// overloaded methods, including methods which are overloaded on const. Example:\n//\n//   class MockClass {\n//     MOCK_METHOD0(GetName, string&());\n//     MOCK_CONST_METHOD0(GetName, const string&());\n//   };\n//\n//   TEST() {\n//     // This should be an error, as it's not clear which overload is expected.\n//     EXPECT_CALL(mock, GetName).WillOnce(ReturnRef(value));\n//   }\n//\n// Here are the generated expectation-setter methods:\n//\n//   class MockClass {\n//     // Overload 1\n//     MockSpec<string&()> gmock_GetName() { ... }\n//     // Overload 2. Declared const so that the compiler will generate an\n//     // error when trying to resolve between this and overload 4 in\n//     // 'gmock_GetName(WithoutMatchers(), nullptr)'.\n//     MockSpec<string&()> gmock_GetName(\n//         const WithoutMatchers&, const Function<string&()>*) const {\n//       // Removes const from this, calls overload 1\n//       return AdjustConstness_(this)->gmock_GetName();\n//     }\n//\n//     // Overload 3\n//     const string& gmock_GetName() const { ... }\n//     // Overload 4\n//     MockSpec<const string&()> gmock_GetName(\n//         const WithoutMatchers&, const Function<const string&()>*) const {\n//       // Does not remove const, calls overload 3\n//       return AdjustConstness_const(this)->gmock_GetName();\n//     }\n//   }\n//\ntemplate <typename MockType>\nconst MockType* AdjustConstness_const(const MockType* mock) {\n  return mock;\n}\n\n// Removes const from and returns the given pointer; this is a helper for the\n// expectation setter method for parameterless matchers.\ntemplate <typename MockType>\nMockType* AdjustConstness_(const MockType* mock) {\n  return const_cast<MockType*>(mock);\n}\n\n}  // namespace internal\n\n// The style guide prohibits \"using\" statements in a namespace scope\n// inside a header file.  However, the FunctionMocker class template\n// is meant to be defined in the ::testing namespace.  The following\n// line is just a trick for working around a bug in MSVC 8.0, which\n// cannot handle it if we define FunctionMocker in ::testing.\nusing internal::FunctionMocker;\n\n// GMOCK_RESULT_(tn, F) expands to the result type of function type F.\n// We define this as a variadic macro in case F contains unprotected\n// commas (the same reason that we use variadic macros in other places\n// in this file).\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_RESULT_(tn, ...) \\\n    tn ::testing::internal::Function<__VA_ARGS__>::Result\n\n// The type of argument N of the given function type.\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_ARG_(tn, N, ...) \\\n    tn ::testing::internal::Function<__VA_ARGS__>::Argument##N\n\n// The matcher type for argument N of the given function type.\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_MATCHER_(tn, N, ...) \\\n    const ::testing::Matcher<GMOCK_ARG_(tn, N, __VA_ARGS__)>&\n\n// The variable for mocking the given method.\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_MOCKER_(arity, constness, Method) \\\n    GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__)\n\n\n$for i [[\n$range j 1..i\n$var arg_as = [[$for j, [[GMOCK_ARG_(tn, $j, __VA_ARGS__) gmock_a$j]]]]\n$var as = [[$for j, \\\n  [[::testing::internal::forward<GMOCK_ARG_(tn, $j, __VA_ARGS__)>(gmock_a$j)]]]]\n$var matcher_arg_as = [[$for j, \\\n                     [[GMOCK_MATCHER_(tn, $j, __VA_ARGS__) gmock_a$j]]]]\n$var matcher_as = [[$for j, [[gmock_a$j]]]]\n$var anything_matchers = [[$for j, \\\n                     [[::testing::A<GMOCK_ARG_(tn, $j, __VA_ARGS__)>()]]]]\n// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!\n#define GMOCK_METHOD$i[[]]_(tn, constness, ct, Method, ...) \\\n  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \\\n      $arg_as) constness { \\\n    GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \\\n        tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value == $i), \\\n        this_method_does_not_take_$i[[]]_argument[[$if i != 1 [[s]]]]); \\\n    GMOCK_MOCKER_($i, constness, Method).SetOwnerAndName(this, #Method); \\\n    return GMOCK_MOCKER_($i, constness, Method).Invoke($as); \\\n  } \\\n  ::testing::MockSpec<__VA_ARGS__> \\\n      gmock_##Method($matcher_arg_as) constness { \\\n    GMOCK_MOCKER_($i, constness, Method).RegisterOwner(this); \\\n    return GMOCK_MOCKER_($i, constness, Method).With($matcher_as); \\\n  } \\\n  ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \\\n      const ::testing::internal::WithoutMatchers&, \\\n      constness ::testing::internal::Function<__VA_ARGS__>* ) const { \\\n        return ::testing::internal::AdjustConstness_##constness(this)-> \\\n            gmock_##Method($anything_matchers); \\\n      } \\\n  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_($i, constness, Method)\n\n\n]]\n$for i [[\n#define MOCK_METHOD$i(m, ...) GMOCK_METHOD$i[[]]_(, , , m, __VA_ARGS__)\n\n]]\n\n\n$for i [[\n#define MOCK_CONST_METHOD$i(m, ...) GMOCK_METHOD$i[[]]_(, const, , m, __VA_ARGS__)\n\n]]\n\n\n$for i [[\n#define MOCK_METHOD$i[[]]_T(m, ...) GMOCK_METHOD$i[[]]_(typename, , , m, __VA_ARGS__)\n\n]]\n\n\n$for i [[\n#define MOCK_CONST_METHOD$i[[]]_T(m, ...) \\\n    GMOCK_METHOD$i[[]]_(typename, const, , m, __VA_ARGS__)\n\n]]\n\n\n$for i [[\n#define MOCK_METHOD$i[[]]_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD$i[[]]_(, , ct, m, __VA_ARGS__)\n\n]]\n\n\n$for i [[\n#define MOCK_CONST_METHOD$i[[]]_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD$i[[]]_(, const, ct, m, __VA_ARGS__)\n\n]]\n\n\n$for i [[\n#define MOCK_METHOD$i[[]]_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD$i[[]]_(typename, , ct, m, __VA_ARGS__)\n\n]]\n\n\n$for i [[\n#define MOCK_CONST_METHOD$i[[]]_T_WITH_CALLTYPE(ct, m, ...) \\\n    GMOCK_METHOD$i[[]]_(typename, const, ct, m, __VA_ARGS__)\n\n]]\n\n// A MockFunction<F> class has one mock method whose type is F.  It is\n// useful when you just want your test code to emit some messages and\n// have Google Mock verify the right messages are sent (and perhaps at\n// the right times).  For example, if you are exercising code:\n//\n//   Foo(1);\n//   Foo(2);\n//   Foo(3);\n//\n// and want to verify that Foo(1) and Foo(3) both invoke\n// mock.Bar(\"a\"), but Foo(2) doesn't invoke anything, you can write:\n//\n// TEST(FooTest, InvokesBarCorrectly) {\n//   MyMock mock;\n//   MockFunction<void(string check_point_name)> check;\n//   {\n//     InSequence s;\n//\n//     EXPECT_CALL(mock, Bar(\"a\"));\n//     EXPECT_CALL(check, Call(\"1\"));\n//     EXPECT_CALL(check, Call(\"2\"));\n//     EXPECT_CALL(mock, Bar(\"a\"));\n//   }\n//   Foo(1);\n//   check.Call(\"1\");\n//   Foo(2);\n//   check.Call(\"2\");\n//   Foo(3);\n// }\n//\n// The expectation spec says that the first Bar(\"a\") must happen\n// before check point \"1\", the second Bar(\"a\") must happen after check\n// point \"2\", and nothing should happen between the two check\n// points. The explicit check points make it easy to tell which\n// Bar(\"a\") is called by which call to Foo().\n//\n// MockFunction<F> can also be used to exercise code that accepts\n// std::function<F> callbacks. To do so, use AsStdFunction() method\n// to create std::function proxy forwarding to original object's Call.\n// Example:\n//\n// TEST(FooTest, RunsCallbackWithBarArgument) {\n//   MockFunction<int(string)> callback;\n//   EXPECT_CALL(callback, Call(\"bar\")).WillOnce(Return(1));\n//   Foo(callback.AsStdFunction());\n// }\ntemplate <typename F>\nclass MockFunction;\n\n\n$for i [[\n$range j 0..i-1\n$var ArgTypes = [[$for j, [[A$j]]]]\n$var ArgValues = [[$for j, [[::std::move(a$j)]]]]\n$var ArgDecls = [[$for j, [[A$j a$j]]]]\ntemplate <typename R$for j [[, typename A$j]]>\nclass MockFunction<R($ArgTypes)> {\n public:\n  MockFunction() {}\n\n  MOCK_METHOD$i[[]]_T(Call, R($ArgTypes));\n\n#if GTEST_HAS_STD_FUNCTION_\n  ::std::function<R($ArgTypes)> AsStdFunction() {\n    return [this]($ArgDecls) -> R {\n      return this->Call($ArgValues);\n    };\n  }\n#endif  // GTEST_HAS_STD_FUNCTION_\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);\n};\n\n\n]]\n}  // namespace testing\n\n#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/gmock-generated-matchers.h",
    "content": "// This file was GENERATED by command:\n//     pump.py gmock-generated-matchers.h.pump\n// DO NOT EDIT BY HAND!!!\n\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements some commonly used variadic matchers.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_\n#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_\n\n#include <iterator>\n#include <sstream>\n#include <string>\n#include <vector>\n#include \"gmock/gmock-matchers.h\"\n\nnamespace testing {\nnamespace internal {\n\n// The type of the i-th (0-based) field of Tuple.\n#define GMOCK_FIELD_TYPE_(Tuple, i) \\\n    typename ::testing::tuple_element<i, Tuple>::type\n\n// TupleFields<Tuple, k0, ..., kn> is for selecting fields from a\n// tuple of type Tuple.  It has two members:\n//\n//   type: a tuple type whose i-th field is the ki-th field of Tuple.\n//   GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple.\n//\n// For example, in class TupleFields<tuple<bool, char, int>, 2, 0>, we have:\n//\n//   type is tuple<int, bool>, and\n//   GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true).\n\ntemplate <class Tuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1,\n    int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,\n    int k9 = -1>\nclass TupleFields;\n\n// This generic version is used when there are 10 selectors.\ntemplate <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,\n    int k7, int k8, int k9>\nclass TupleFields {\n public:\n  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),\n      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),\n      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),\n      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),\n      GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8),\n      GMOCK_FIELD_TYPE_(Tuple, k9)> type;\n  static type GetSelectedFields(const Tuple& t) {\n    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),\n        get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t), get<k9>(t));\n  }\n};\n\n// The following specialization is used for 0 ~ 9 selectors.\n\ntemplate <class Tuple>\nclass TupleFields<Tuple, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {\n public:\n  typedef ::testing::tuple<> type;\n  static type GetSelectedFields(const Tuple& /* t */) {\n    return type();\n  }\n};\n\ntemplate <class Tuple, int k0>\nclass TupleFields<Tuple, k0, -1, -1, -1, -1, -1, -1, -1, -1, -1> {\n public:\n  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0)> type;\n  static type GetSelectedFields(const Tuple& t) {\n    return type(get<k0>(t));\n  }\n};\n\ntemplate <class Tuple, int k0, int k1>\nclass TupleFields<Tuple, k0, k1, -1, -1, -1, -1, -1, -1, -1, -1> {\n public:\n  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),\n      GMOCK_FIELD_TYPE_(Tuple, k1)> type;\n  static type GetSelectedFields(const Tuple& t) {\n    return type(get<k0>(t), get<k1>(t));\n  }\n};\n\ntemplate <class Tuple, int k0, int k1, int k2>\nclass TupleFields<Tuple, k0, k1, k2, -1, -1, -1, -1, -1, -1, -1> {\n public:\n  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),\n      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2)> type;\n  static type GetSelectedFields(const Tuple& t) {\n    return type(get<k0>(t), get<k1>(t), get<k2>(t));\n  }\n};\n\ntemplate <class Tuple, int k0, int k1, int k2, int k3>\nclass TupleFields<Tuple, k0, k1, k2, k3, -1, -1, -1, -1, -1, -1> {\n public:\n  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),\n      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),\n      GMOCK_FIELD_TYPE_(Tuple, k3)> type;\n  static type GetSelectedFields(const Tuple& t) {\n    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t));\n  }\n};\n\ntemplate <class Tuple, int k0, int k1, int k2, int k3, int k4>\nclass TupleFields<Tuple, k0, k1, k2, k3, k4, -1, -1, -1, -1, -1> {\n public:\n  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),\n      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),\n      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4)> type;\n  static type GetSelectedFields(const Tuple& t) {\n    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t));\n  }\n};\n\ntemplate <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5>\nclass TupleFields<Tuple, k0, k1, k2, k3, k4, k5, -1, -1, -1, -1> {\n public:\n  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),\n      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),\n      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),\n      GMOCK_FIELD_TYPE_(Tuple, k5)> type;\n  static type GetSelectedFields(const Tuple& t) {\n    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),\n        get<k5>(t));\n  }\n};\n\ntemplate <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6>\nclass TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, -1, -1, -1> {\n public:\n  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),\n      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),\n      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),\n      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6)> type;\n  static type GetSelectedFields(const Tuple& t) {\n    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),\n        get<k5>(t), get<k6>(t));\n  }\n};\n\ntemplate <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,\n    int k7>\nclass TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, -1, -1> {\n public:\n  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),\n      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),\n      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),\n      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),\n      GMOCK_FIELD_TYPE_(Tuple, k7)> type;\n  static type GetSelectedFields(const Tuple& t) {\n    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),\n        get<k5>(t), get<k6>(t), get<k7>(t));\n  }\n};\n\ntemplate <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,\n    int k7, int k8>\nclass TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, k8, -1> {\n public:\n  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),\n      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),\n      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),\n      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),\n      GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8)> type;\n  static type GetSelectedFields(const Tuple& t) {\n    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),\n        get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t));\n  }\n};\n\n#undef GMOCK_FIELD_TYPE_\n\n// Implements the Args() matcher.\ntemplate <class ArgsTuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1,\n    int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,\n    int k9 = -1>\nclass ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {\n public:\n  // ArgsTuple may have top-level const or reference modifiers.\n  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(ArgsTuple) RawArgsTuple;\n  typedef typename internal::TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5,\n      k6, k7, k8, k9>::type SelectedArgs;\n  typedef Matcher<const SelectedArgs&> MonomorphicInnerMatcher;\n\n  template <typename InnerMatcher>\n  explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher)\n      : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {}\n\n  virtual bool MatchAndExplain(ArgsTuple args,\n                               MatchResultListener* listener) const {\n    const SelectedArgs& selected_args = GetSelectedArgs(args);\n    if (!listener->IsInterested())\n      return inner_matcher_.Matches(selected_args);\n\n    PrintIndices(listener->stream());\n    *listener << \"are \" << PrintToString(selected_args);\n\n    StringMatchResultListener inner_listener;\n    const bool match = inner_matcher_.MatchAndExplain(selected_args,\n                                                      &inner_listener);\n    PrintIfNotEmpty(inner_listener.str(), listener->stream());\n    return match;\n  }\n\n  virtual void DescribeTo(::std::ostream* os) const {\n    *os << \"are a tuple \";\n    PrintIndices(os);\n    inner_matcher_.DescribeTo(os);\n  }\n\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"are a tuple \";\n    PrintIndices(os);\n    inner_matcher_.DescribeNegationTo(os);\n  }\n\n private:\n  static SelectedArgs GetSelectedArgs(ArgsTuple args) {\n    return TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5, k6, k7, k8,\n        k9>::GetSelectedFields(args);\n  }\n\n  // Prints the indices of the selected fields.\n  static void PrintIndices(::std::ostream* os) {\n    *os << \"whose fields (\";\n    const int indices[10] = { k0, k1, k2, k3, k4, k5, k6, k7, k8, k9 };\n    for (int i = 0; i < 10; i++) {\n      if (indices[i] < 0)\n        break;\n\n      if (i >= 1)\n        *os << \", \";\n\n      *os << \"#\" << indices[i];\n    }\n    *os << \") \";\n  }\n\n  const MonomorphicInnerMatcher inner_matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl);\n};\n\ntemplate <class InnerMatcher, int k0 = -1, int k1 = -1, int k2 = -1,\n    int k3 = -1, int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1,\n    int k8 = -1, int k9 = -1>\nclass ArgsMatcher {\n public:\n  explicit ArgsMatcher(const InnerMatcher& inner_matcher)\n      : inner_matcher_(inner_matcher) {}\n\n  template <typename ArgsTuple>\n  operator Matcher<ArgsTuple>() const {\n    return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k0, k1, k2, k3, k4, k5,\n        k6, k7, k8, k9>(inner_matcher_));\n  }\n\n private:\n  const InnerMatcher inner_matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(ArgsMatcher);\n};\n\n// A set of metafunctions for computing the result type of AllOf.\n// AllOf(m1, ..., mN) returns\n// AllOfResultN<decltype(m1), ..., decltype(mN)>::type.\n\n// Although AllOf isn't defined for one argument, AllOfResult1 is defined\n// to simplify the implementation.\ntemplate <typename M1>\nstruct AllOfResult1 {\n  typedef M1 type;\n};\n\ntemplate <typename M1, typename M2>\nstruct AllOfResult2 {\n  typedef BothOfMatcher<\n      typename AllOfResult1<M1>::type,\n      typename AllOfResult1<M2>::type\n  > type;\n};\n\ntemplate <typename M1, typename M2, typename M3>\nstruct AllOfResult3 {\n  typedef BothOfMatcher<\n      typename AllOfResult1<M1>::type,\n      typename AllOfResult2<M2, M3>::type\n  > type;\n};\n\ntemplate <typename M1, typename M2, typename M3, typename M4>\nstruct AllOfResult4 {\n  typedef BothOfMatcher<\n      typename AllOfResult2<M1, M2>::type,\n      typename AllOfResult2<M3, M4>::type\n  > type;\n};\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5>\nstruct AllOfResult5 {\n  typedef BothOfMatcher<\n      typename AllOfResult2<M1, M2>::type,\n      typename AllOfResult3<M3, M4, M5>::type\n  > type;\n};\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6>\nstruct AllOfResult6 {\n  typedef BothOfMatcher<\n      typename AllOfResult3<M1, M2, M3>::type,\n      typename AllOfResult3<M4, M5, M6>::type\n  > type;\n};\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6, typename M7>\nstruct AllOfResult7 {\n  typedef BothOfMatcher<\n      typename AllOfResult3<M1, M2, M3>::type,\n      typename AllOfResult4<M4, M5, M6, M7>::type\n  > type;\n};\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6, typename M7, typename M8>\nstruct AllOfResult8 {\n  typedef BothOfMatcher<\n      typename AllOfResult4<M1, M2, M3, M4>::type,\n      typename AllOfResult4<M5, M6, M7, M8>::type\n  > type;\n};\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6, typename M7, typename M8, typename M9>\nstruct AllOfResult9 {\n  typedef BothOfMatcher<\n      typename AllOfResult4<M1, M2, M3, M4>::type,\n      typename AllOfResult5<M5, M6, M7, M8, M9>::type\n  > type;\n};\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6, typename M7, typename M8, typename M9, typename M10>\nstruct AllOfResult10 {\n  typedef BothOfMatcher<\n      typename AllOfResult5<M1, M2, M3, M4, M5>::type,\n      typename AllOfResult5<M6, M7, M8, M9, M10>::type\n  > type;\n};\n\n// A set of metafunctions for computing the result type of AnyOf.\n// AnyOf(m1, ..., mN) returns\n// AnyOfResultN<decltype(m1), ..., decltype(mN)>::type.\n\n// Although AnyOf isn't defined for one argument, AnyOfResult1 is defined\n// to simplify the implementation.\ntemplate <typename M1>\nstruct AnyOfResult1 {\n  typedef M1 type;\n};\n\ntemplate <typename M1, typename M2>\nstruct AnyOfResult2 {\n  typedef EitherOfMatcher<\n      typename AnyOfResult1<M1>::type,\n      typename AnyOfResult1<M2>::type\n  > type;\n};\n\ntemplate <typename M1, typename M2, typename M3>\nstruct AnyOfResult3 {\n  typedef EitherOfMatcher<\n      typename AnyOfResult1<M1>::type,\n      typename AnyOfResult2<M2, M3>::type\n  > type;\n};\n\ntemplate <typename M1, typename M2, typename M3, typename M4>\nstruct AnyOfResult4 {\n  typedef EitherOfMatcher<\n      typename AnyOfResult2<M1, M2>::type,\n      typename AnyOfResult2<M3, M4>::type\n  > type;\n};\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5>\nstruct AnyOfResult5 {\n  typedef EitherOfMatcher<\n      typename AnyOfResult2<M1, M2>::type,\n      typename AnyOfResult3<M3, M4, M5>::type\n  > type;\n};\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6>\nstruct AnyOfResult6 {\n  typedef EitherOfMatcher<\n      typename AnyOfResult3<M1, M2, M3>::type,\n      typename AnyOfResult3<M4, M5, M6>::type\n  > type;\n};\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6, typename M7>\nstruct AnyOfResult7 {\n  typedef EitherOfMatcher<\n      typename AnyOfResult3<M1, M2, M3>::type,\n      typename AnyOfResult4<M4, M5, M6, M7>::type\n  > type;\n};\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6, typename M7, typename M8>\nstruct AnyOfResult8 {\n  typedef EitherOfMatcher<\n      typename AnyOfResult4<M1, M2, M3, M4>::type,\n      typename AnyOfResult4<M5, M6, M7, M8>::type\n  > type;\n};\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6, typename M7, typename M8, typename M9>\nstruct AnyOfResult9 {\n  typedef EitherOfMatcher<\n      typename AnyOfResult4<M1, M2, M3, M4>::type,\n      typename AnyOfResult5<M5, M6, M7, M8, M9>::type\n  > type;\n};\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6, typename M7, typename M8, typename M9, typename M10>\nstruct AnyOfResult10 {\n  typedef EitherOfMatcher<\n      typename AnyOfResult5<M1, M2, M3, M4, M5>::type,\n      typename AnyOfResult5<M6, M7, M8, M9, M10>::type\n  > type;\n};\n\n}  // namespace internal\n\n// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected\n// fields of it matches a_matcher.  C++ doesn't support default\n// arguments for function templates, so we have to overload it.\ntemplate <typename InnerMatcher>\ninline internal::ArgsMatcher<InnerMatcher>\nArgs(const InnerMatcher& matcher) {\n  return internal::ArgsMatcher<InnerMatcher>(matcher);\n}\n\ntemplate <int k1, typename InnerMatcher>\ninline internal::ArgsMatcher<InnerMatcher, k1>\nArgs(const InnerMatcher& matcher) {\n  return internal::ArgsMatcher<InnerMatcher, k1>(matcher);\n}\n\ntemplate <int k1, int k2, typename InnerMatcher>\ninline internal::ArgsMatcher<InnerMatcher, k1, k2>\nArgs(const InnerMatcher& matcher) {\n  return internal::ArgsMatcher<InnerMatcher, k1, k2>(matcher);\n}\n\ntemplate <int k1, int k2, int k3, typename InnerMatcher>\ninline internal::ArgsMatcher<InnerMatcher, k1, k2, k3>\nArgs(const InnerMatcher& matcher) {\n  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3>(matcher);\n}\n\ntemplate <int k1, int k2, int k3, int k4, typename InnerMatcher>\ninline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>\nArgs(const InnerMatcher& matcher) {\n  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>(matcher);\n}\n\ntemplate <int k1, int k2, int k3, int k4, int k5, typename InnerMatcher>\ninline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>\nArgs(const InnerMatcher& matcher) {\n  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>(matcher);\n}\n\ntemplate <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerMatcher>\ninline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>\nArgs(const InnerMatcher& matcher) {\n  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>(matcher);\n}\n\ntemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7,\n    typename InnerMatcher>\ninline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7>\nArgs(const InnerMatcher& matcher) {\n  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6,\n      k7>(matcher);\n}\n\ntemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,\n    typename InnerMatcher>\ninline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8>\nArgs(const InnerMatcher& matcher) {\n  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7,\n      k8>(matcher);\n}\n\ntemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,\n    int k9, typename InnerMatcher>\ninline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9>\nArgs(const InnerMatcher& matcher) {\n  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,\n      k9>(matcher);\n}\n\ntemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,\n    int k9, int k10, typename InnerMatcher>\ninline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9,\n    k10>\nArgs(const InnerMatcher& matcher) {\n  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,\n      k9, k10>(matcher);\n}\n\n// ElementsAre(e_1, e_2, ... e_n) matches an STL-style container with\n// n elements, where the i-th element in the container must\n// match the i-th argument in the list.  Each argument of\n// ElementsAre() can be either a value or a matcher.  We support up to\n// 10 arguments.\n//\n// The use of DecayArray in the implementation allows ElementsAre()\n// to accept string literals, whose type is const char[N], but we\n// want to treat them as const char*.\n//\n// NOTE: Since ElementsAre() cares about the order of the elements, it\n// must not be used with containers whose elements's order is\n// undefined (e.g. hash_map).\n\ninline internal::ElementsAreMatcher<\n    ::testing::tuple<> >\nElementsAre() {\n  typedef ::testing::tuple<> Args;\n  return internal::ElementsAreMatcher<Args>(Args());\n}\n\ntemplate <typename T1>\ninline internal::ElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type> >\nElementsAre(const T1& e1) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type> Args;\n  return internal::ElementsAreMatcher<Args>(Args(e1));\n}\n\ntemplate <typename T1, typename T2>\ninline internal::ElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type> >\nElementsAre(const T1& e1, const T2& e2) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type> Args;\n  return internal::ElementsAreMatcher<Args>(Args(e1, e2));\n}\n\ntemplate <typename T1, typename T2, typename T3>\ninline internal::ElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type,\n        typename internal::DecayArray<T3>::type> >\nElementsAre(const T1& e1, const T2& e2, const T3& e3) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type,\n      typename internal::DecayArray<T3>::type> Args;\n  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3));\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\ninline internal::ElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type,\n        typename internal::DecayArray<T3>::type,\n        typename internal::DecayArray<T4>::type> >\nElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type,\n      typename internal::DecayArray<T3>::type,\n      typename internal::DecayArray<T4>::type> Args;\n  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4));\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\ninline internal::ElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type,\n        typename internal::DecayArray<T3>::type,\n        typename internal::DecayArray<T4>::type,\n        typename internal::DecayArray<T5>::type> >\nElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,\n    const T5& e5) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type,\n      typename internal::DecayArray<T3>::type,\n      typename internal::DecayArray<T4>::type,\n      typename internal::DecayArray<T5>::type> Args;\n  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5));\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\ninline internal::ElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type,\n        typename internal::DecayArray<T3>::type,\n        typename internal::DecayArray<T4>::type,\n        typename internal::DecayArray<T5>::type,\n        typename internal::DecayArray<T6>::type> >\nElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,\n    const T5& e5, const T6& e6) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type,\n      typename internal::DecayArray<T3>::type,\n      typename internal::DecayArray<T4>::type,\n      typename internal::DecayArray<T5>::type,\n      typename internal::DecayArray<T6>::type> Args;\n  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6));\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\ninline internal::ElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type,\n        typename internal::DecayArray<T3>::type,\n        typename internal::DecayArray<T4>::type,\n        typename internal::DecayArray<T5>::type,\n        typename internal::DecayArray<T6>::type,\n        typename internal::DecayArray<T7>::type> >\nElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,\n    const T5& e5, const T6& e6, const T7& e7) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type,\n      typename internal::DecayArray<T3>::type,\n      typename internal::DecayArray<T4>::type,\n      typename internal::DecayArray<T5>::type,\n      typename internal::DecayArray<T6>::type,\n      typename internal::DecayArray<T7>::type> Args;\n  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7));\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\ninline internal::ElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type,\n        typename internal::DecayArray<T3>::type,\n        typename internal::DecayArray<T4>::type,\n        typename internal::DecayArray<T5>::type,\n        typename internal::DecayArray<T6>::type,\n        typename internal::DecayArray<T7>::type,\n        typename internal::DecayArray<T8>::type> >\nElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,\n    const T5& e5, const T6& e6, const T7& e7, const T8& e8) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type,\n      typename internal::DecayArray<T3>::type,\n      typename internal::DecayArray<T4>::type,\n      typename internal::DecayArray<T5>::type,\n      typename internal::DecayArray<T6>::type,\n      typename internal::DecayArray<T7>::type,\n      typename internal::DecayArray<T8>::type> Args;\n  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,\n      e8));\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\ninline internal::ElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type,\n        typename internal::DecayArray<T3>::type,\n        typename internal::DecayArray<T4>::type,\n        typename internal::DecayArray<T5>::type,\n        typename internal::DecayArray<T6>::type,\n        typename internal::DecayArray<T7>::type,\n        typename internal::DecayArray<T8>::type,\n        typename internal::DecayArray<T9>::type> >\nElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,\n    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type,\n      typename internal::DecayArray<T3>::type,\n      typename internal::DecayArray<T4>::type,\n      typename internal::DecayArray<T5>::type,\n      typename internal::DecayArray<T6>::type,\n      typename internal::DecayArray<T7>::type,\n      typename internal::DecayArray<T8>::type,\n      typename internal::DecayArray<T9>::type> Args;\n  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,\n      e8, e9));\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\ninline internal::ElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type,\n        typename internal::DecayArray<T3>::type,\n        typename internal::DecayArray<T4>::type,\n        typename internal::DecayArray<T5>::type,\n        typename internal::DecayArray<T6>::type,\n        typename internal::DecayArray<T7>::type,\n        typename internal::DecayArray<T8>::type,\n        typename internal::DecayArray<T9>::type,\n        typename internal::DecayArray<T10>::type> >\nElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,\n    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9,\n    const T10& e10) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type,\n      typename internal::DecayArray<T3>::type,\n      typename internal::DecayArray<T4>::type,\n      typename internal::DecayArray<T5>::type,\n      typename internal::DecayArray<T6>::type,\n      typename internal::DecayArray<T7>::type,\n      typename internal::DecayArray<T8>::type,\n      typename internal::DecayArray<T9>::type,\n      typename internal::DecayArray<T10>::type> Args;\n  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,\n      e8, e9, e10));\n}\n\n// UnorderedElementsAre(e_1, e_2, ..., e_n) is an ElementsAre extension\n// that matches n elements in any order.  We support up to n=10 arguments.\n//\n// If you have >10 elements, consider UnorderedElementsAreArray() or\n// UnorderedPointwise() instead.\n\ninline internal::UnorderedElementsAreMatcher<\n    ::testing::tuple<> >\nUnorderedElementsAre() {\n  typedef ::testing::tuple<> Args;\n  return internal::UnorderedElementsAreMatcher<Args>(Args());\n}\n\ntemplate <typename T1>\ninline internal::UnorderedElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type> >\nUnorderedElementsAre(const T1& e1) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type> Args;\n  return internal::UnorderedElementsAreMatcher<Args>(Args(e1));\n}\n\ntemplate <typename T1, typename T2>\ninline internal::UnorderedElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type> >\nUnorderedElementsAre(const T1& e1, const T2& e2) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type> Args;\n  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2));\n}\n\ntemplate <typename T1, typename T2, typename T3>\ninline internal::UnorderedElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type,\n        typename internal::DecayArray<T3>::type> >\nUnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type,\n      typename internal::DecayArray<T3>::type> Args;\n  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3));\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\ninline internal::UnorderedElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type,\n        typename internal::DecayArray<T3>::type,\n        typename internal::DecayArray<T4>::type> >\nUnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type,\n      typename internal::DecayArray<T3>::type,\n      typename internal::DecayArray<T4>::type> Args;\n  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4));\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\ninline internal::UnorderedElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type,\n        typename internal::DecayArray<T3>::type,\n        typename internal::DecayArray<T4>::type,\n        typename internal::DecayArray<T5>::type> >\nUnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,\n    const T5& e5) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type,\n      typename internal::DecayArray<T3>::type,\n      typename internal::DecayArray<T4>::type,\n      typename internal::DecayArray<T5>::type> Args;\n  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5));\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\ninline internal::UnorderedElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type,\n        typename internal::DecayArray<T3>::type,\n        typename internal::DecayArray<T4>::type,\n        typename internal::DecayArray<T5>::type,\n        typename internal::DecayArray<T6>::type> >\nUnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,\n    const T5& e5, const T6& e6) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type,\n      typename internal::DecayArray<T3>::type,\n      typename internal::DecayArray<T4>::type,\n      typename internal::DecayArray<T5>::type,\n      typename internal::DecayArray<T6>::type> Args;\n  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,\n      e6));\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\ninline internal::UnorderedElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type,\n        typename internal::DecayArray<T3>::type,\n        typename internal::DecayArray<T4>::type,\n        typename internal::DecayArray<T5>::type,\n        typename internal::DecayArray<T6>::type,\n        typename internal::DecayArray<T7>::type> >\nUnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,\n    const T5& e5, const T6& e6, const T7& e7) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type,\n      typename internal::DecayArray<T3>::type,\n      typename internal::DecayArray<T4>::type,\n      typename internal::DecayArray<T5>::type,\n      typename internal::DecayArray<T6>::type,\n      typename internal::DecayArray<T7>::type> Args;\n  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,\n      e6, e7));\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\ninline internal::UnorderedElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type,\n        typename internal::DecayArray<T3>::type,\n        typename internal::DecayArray<T4>::type,\n        typename internal::DecayArray<T5>::type,\n        typename internal::DecayArray<T6>::type,\n        typename internal::DecayArray<T7>::type,\n        typename internal::DecayArray<T8>::type> >\nUnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,\n    const T5& e5, const T6& e6, const T7& e7, const T8& e8) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type,\n      typename internal::DecayArray<T3>::type,\n      typename internal::DecayArray<T4>::type,\n      typename internal::DecayArray<T5>::type,\n      typename internal::DecayArray<T6>::type,\n      typename internal::DecayArray<T7>::type,\n      typename internal::DecayArray<T8>::type> Args;\n  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,\n      e6, e7, e8));\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\ninline internal::UnorderedElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type,\n        typename internal::DecayArray<T3>::type,\n        typename internal::DecayArray<T4>::type,\n        typename internal::DecayArray<T5>::type,\n        typename internal::DecayArray<T6>::type,\n        typename internal::DecayArray<T7>::type,\n        typename internal::DecayArray<T8>::type,\n        typename internal::DecayArray<T9>::type> >\nUnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,\n    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type,\n      typename internal::DecayArray<T3>::type,\n      typename internal::DecayArray<T4>::type,\n      typename internal::DecayArray<T5>::type,\n      typename internal::DecayArray<T6>::type,\n      typename internal::DecayArray<T7>::type,\n      typename internal::DecayArray<T8>::type,\n      typename internal::DecayArray<T9>::type> Args;\n  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,\n      e6, e7, e8, e9));\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\ninline internal::UnorderedElementsAreMatcher<\n    ::testing::tuple<\n        typename internal::DecayArray<T1>::type,\n        typename internal::DecayArray<T2>::type,\n        typename internal::DecayArray<T3>::type,\n        typename internal::DecayArray<T4>::type,\n        typename internal::DecayArray<T5>::type,\n        typename internal::DecayArray<T6>::type,\n        typename internal::DecayArray<T7>::type,\n        typename internal::DecayArray<T8>::type,\n        typename internal::DecayArray<T9>::type,\n        typename internal::DecayArray<T10>::type> >\nUnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,\n    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9,\n    const T10& e10) {\n  typedef ::testing::tuple<\n      typename internal::DecayArray<T1>::type,\n      typename internal::DecayArray<T2>::type,\n      typename internal::DecayArray<T3>::type,\n      typename internal::DecayArray<T4>::type,\n      typename internal::DecayArray<T5>::type,\n      typename internal::DecayArray<T6>::type,\n      typename internal::DecayArray<T7>::type,\n      typename internal::DecayArray<T8>::type,\n      typename internal::DecayArray<T9>::type,\n      typename internal::DecayArray<T10>::type> Args;\n  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,\n      e6, e7, e8, e9, e10));\n}\n\n// AllOf(m1, m2, ..., mk) matches any value that matches all of the given\n// sub-matchers.  AllOf is called fully qualified to prevent ADL from firing.\n\ntemplate <typename M1, typename M2>\ninline typename internal::AllOfResult2<M1, M2>::type\nAllOf(M1 m1, M2 m2) {\n  return typename internal::AllOfResult2<M1, M2>::type(\n      m1,\n      m2);\n}\n\ntemplate <typename M1, typename M2, typename M3>\ninline typename internal::AllOfResult3<M1, M2, M3>::type\nAllOf(M1 m1, M2 m2, M3 m3) {\n  return typename internal::AllOfResult3<M1, M2, M3>::type(\n      m1,\n      ::testing::AllOf(m2, m3));\n}\n\ntemplate <typename M1, typename M2, typename M3, typename M4>\ninline typename internal::AllOfResult4<M1, M2, M3, M4>::type\nAllOf(M1 m1, M2 m2, M3 m3, M4 m4) {\n  return typename internal::AllOfResult4<M1, M2, M3, M4>::type(\n      ::testing::AllOf(m1, m2),\n      ::testing::AllOf(m3, m4));\n}\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5>\ninline typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type\nAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) {\n  return typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type(\n      ::testing::AllOf(m1, m2),\n      ::testing::AllOf(m3, m4, m5));\n}\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6>\ninline typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type\nAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) {\n  return typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type(\n      ::testing::AllOf(m1, m2, m3),\n      ::testing::AllOf(m4, m5, m6));\n}\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6, typename M7>\ninline typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type\nAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) {\n  return typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type(\n      ::testing::AllOf(m1, m2, m3),\n      ::testing::AllOf(m4, m5, m6, m7));\n}\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6, typename M7, typename M8>\ninline typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type\nAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) {\n  return typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type(\n      ::testing::AllOf(m1, m2, m3, m4),\n      ::testing::AllOf(m5, m6, m7, m8));\n}\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6, typename M7, typename M8, typename M9>\ninline typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type\nAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) {\n  return typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8,\n      M9>::type(\n      ::testing::AllOf(m1, m2, m3, m4),\n      ::testing::AllOf(m5, m6, m7, m8, m9));\n}\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6, typename M7, typename M8, typename M9, typename M10>\ninline typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,\n    M10>::type\nAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {\n  return typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,\n      M10>::type(\n      ::testing::AllOf(m1, m2, m3, m4, m5),\n      ::testing::AllOf(m6, m7, m8, m9, m10));\n}\n\n// AnyOf(m1, m2, ..., mk) matches any value that matches any of the given\n// sub-matchers.  AnyOf is called fully qualified to prevent ADL from firing.\n\ntemplate <typename M1, typename M2>\ninline typename internal::AnyOfResult2<M1, M2>::type\nAnyOf(M1 m1, M2 m2) {\n  return typename internal::AnyOfResult2<M1, M2>::type(\n      m1,\n      m2);\n}\n\ntemplate <typename M1, typename M2, typename M3>\ninline typename internal::AnyOfResult3<M1, M2, M3>::type\nAnyOf(M1 m1, M2 m2, M3 m3) {\n  return typename internal::AnyOfResult3<M1, M2, M3>::type(\n      m1,\n      ::testing::AnyOf(m2, m3));\n}\n\ntemplate <typename M1, typename M2, typename M3, typename M4>\ninline typename internal::AnyOfResult4<M1, M2, M3, M4>::type\nAnyOf(M1 m1, M2 m2, M3 m3, M4 m4) {\n  return typename internal::AnyOfResult4<M1, M2, M3, M4>::type(\n      ::testing::AnyOf(m1, m2),\n      ::testing::AnyOf(m3, m4));\n}\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5>\ninline typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type\nAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) {\n  return typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type(\n      ::testing::AnyOf(m1, m2),\n      ::testing::AnyOf(m3, m4, m5));\n}\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6>\ninline typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type\nAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) {\n  return typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type(\n      ::testing::AnyOf(m1, m2, m3),\n      ::testing::AnyOf(m4, m5, m6));\n}\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6, typename M7>\ninline typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type\nAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) {\n  return typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type(\n      ::testing::AnyOf(m1, m2, m3),\n      ::testing::AnyOf(m4, m5, m6, m7));\n}\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6, typename M7, typename M8>\ninline typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type\nAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) {\n  return typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type(\n      ::testing::AnyOf(m1, m2, m3, m4),\n      ::testing::AnyOf(m5, m6, m7, m8));\n}\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6, typename M7, typename M8, typename M9>\ninline typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type\nAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) {\n  return typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8,\n      M9>::type(\n      ::testing::AnyOf(m1, m2, m3, m4),\n      ::testing::AnyOf(m5, m6, m7, m8, m9));\n}\n\ntemplate <typename M1, typename M2, typename M3, typename M4, typename M5,\n    typename M6, typename M7, typename M8, typename M9, typename M10>\ninline typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,\n    M10>::type\nAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {\n  return typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,\n      M10>::type(\n      ::testing::AnyOf(m1, m2, m3, m4, m5),\n      ::testing::AnyOf(m6, m7, m8, m9, m10));\n}\n\n}  // namespace testing\n\n\n// The MATCHER* family of macros can be used in a namespace scope to\n// define custom matchers easily.\n//\n// Basic Usage\n// ===========\n//\n// The syntax\n//\n//   MATCHER(name, description_string) { statements; }\n//\n// defines a matcher with the given name that executes the statements,\n// which must return a bool to indicate if the match succeeds.  Inside\n// the statements, you can refer to the value being matched by 'arg',\n// and refer to its type by 'arg_type'.\n//\n// The description string documents what the matcher does, and is used\n// to generate the failure message when the match fails.  Since a\n// MATCHER() is usually defined in a header file shared by multiple\n// C++ source files, we require the description to be a C-string\n// literal to avoid possible side effects.  It can be empty, in which\n// case we'll use the sequence of words in the matcher name as the\n// description.\n//\n// For example:\n//\n//   MATCHER(IsEven, \"\") { return (arg % 2) == 0; }\n//\n// allows you to write\n//\n//   // Expects mock_foo.Bar(n) to be called where n is even.\n//   EXPECT_CALL(mock_foo, Bar(IsEven()));\n//\n// or,\n//\n//   // Verifies that the value of some_expression is even.\n//   EXPECT_THAT(some_expression, IsEven());\n//\n// If the above assertion fails, it will print something like:\n//\n//   Value of: some_expression\n//   Expected: is even\n//     Actual: 7\n//\n// where the description \"is even\" is automatically calculated from the\n// matcher name IsEven.\n//\n// Argument Type\n// =============\n//\n// Note that the type of the value being matched (arg_type) is\n// determined by the context in which you use the matcher and is\n// supplied to you by the compiler, so you don't need to worry about\n// declaring it (nor can you).  This allows the matcher to be\n// polymorphic.  For example, IsEven() can be used to match any type\n// where the value of \"(arg % 2) == 0\" can be implicitly converted to\n// a bool.  In the \"Bar(IsEven())\" example above, if method Bar()\n// takes an int, 'arg_type' will be int; if it takes an unsigned long,\n// 'arg_type' will be unsigned long; and so on.\n//\n// Parameterizing Matchers\n// =======================\n//\n// Sometimes you'll want to parameterize the matcher.  For that you\n// can use another macro:\n//\n//   MATCHER_P(name, param_name, description_string) { statements; }\n//\n// For example:\n//\n//   MATCHER_P(HasAbsoluteValue, value, \"\") { return abs(arg) == value; }\n//\n// will allow you to write:\n//\n//   EXPECT_THAT(Blah(\"a\"), HasAbsoluteValue(n));\n//\n// which may lead to this message (assuming n is 10):\n//\n//   Value of: Blah(\"a\")\n//   Expected: has absolute value 10\n//     Actual: -9\n//\n// Note that both the matcher description and its parameter are\n// printed, making the message human-friendly.\n//\n// In the matcher definition body, you can write 'foo_type' to\n// reference the type of a parameter named 'foo'.  For example, in the\n// body of MATCHER_P(HasAbsoluteValue, value) above, you can write\n// 'value_type' to refer to the type of 'value'.\n//\n// We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P10 to\n// support multi-parameter matchers.\n//\n// Describing Parameterized Matchers\n// =================================\n//\n// The last argument to MATCHER*() is a string-typed expression.  The\n// expression can reference all of the matcher's parameters and a\n// special bool-typed variable named 'negation'.  When 'negation' is\n// false, the expression should evaluate to the matcher's description;\n// otherwise it should evaluate to the description of the negation of\n// the matcher.  For example,\n//\n//   using testing::PrintToString;\n//\n//   MATCHER_P2(InClosedRange, low, hi,\n//       std::string(negation ? \"is not\" : \"is\") + \" in range [\" +\n//       PrintToString(low) + \", \" + PrintToString(hi) + \"]\") {\n//     return low <= arg && arg <= hi;\n//   }\n//   ...\n//   EXPECT_THAT(3, InClosedRange(4, 6));\n//   EXPECT_THAT(3, Not(InClosedRange(2, 4)));\n//\n// would generate two failures that contain the text:\n//\n//   Expected: is in range [4, 6]\n//   ...\n//   Expected: is not in range [2, 4]\n//\n// If you specify \"\" as the description, the failure message will\n// contain the sequence of words in the matcher name followed by the\n// parameter values printed as a tuple.  For example,\n//\n//   MATCHER_P2(InClosedRange, low, hi, \"\") { ... }\n//   ...\n//   EXPECT_THAT(3, InClosedRange(4, 6));\n//   EXPECT_THAT(3, Not(InClosedRange(2, 4)));\n//\n// would generate two failures that contain the text:\n//\n//   Expected: in closed range (4, 6)\n//   ...\n//   Expected: not (in closed range (2, 4))\n//\n// Types of Matcher Parameters\n// ===========================\n//\n// For the purpose of typing, you can view\n//\n//   MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... }\n//\n// as shorthand for\n//\n//   template <typename p1_type, ..., typename pk_type>\n//   FooMatcherPk<p1_type, ..., pk_type>\n//   Foo(p1_type p1, ..., pk_type pk) { ... }\n//\n// When you write Foo(v1, ..., vk), the compiler infers the types of\n// the parameters v1, ..., and vk for you.  If you are not happy with\n// the result of the type inference, you can specify the types by\n// explicitly instantiating the template, as in Foo<long, bool>(5,\n// false).  As said earlier, you don't get to (or need to) specify\n// 'arg_type' as that's determined by the context in which the matcher\n// is used.  You can assign the result of expression Foo(p1, ..., pk)\n// to a variable of type FooMatcherPk<p1_type, ..., pk_type>.  This\n// can be useful when composing matchers.\n//\n// While you can instantiate a matcher template with reference types,\n// passing the parameters by pointer usually makes your code more\n// readable.  If, however, you still want to pass a parameter by\n// reference, be aware that in the failure message generated by the\n// matcher you will see the value of the referenced object but not its\n// address.\n//\n// Explaining Match Results\n// ========================\n//\n// Sometimes the matcher description alone isn't enough to explain why\n// the match has failed or succeeded.  For example, when expecting a\n// long string, it can be very helpful to also print the diff between\n// the expected string and the actual one.  To achieve that, you can\n// optionally stream additional information to a special variable\n// named result_listener, whose type is a pointer to class\n// MatchResultListener:\n//\n//   MATCHER_P(EqualsLongString, str, \"\") {\n//     if (arg == str) return true;\n//\n//     *result_listener << \"the difference: \"\n///                     << DiffStrings(str, arg);\n//     return false;\n//   }\n//\n// Overloading Matchers\n// ====================\n//\n// You can overload matchers with different numbers of parameters:\n//\n//   MATCHER_P(Blah, a, description_string1) { ... }\n//   MATCHER_P2(Blah, a, b, description_string2) { ... }\n//\n// Caveats\n// =======\n//\n// When defining a new matcher, you should also consider implementing\n// MatcherInterface or using MakePolymorphicMatcher().  These\n// approaches require more work than the MATCHER* macros, but also\n// give you more control on the types of the value being matched and\n// the matcher parameters, which may leads to better compiler error\n// messages when the matcher is used wrong.  They also allow\n// overloading matchers based on parameter types (as opposed to just\n// based on the number of parameters).\n//\n// MATCHER*() can only be used in a namespace scope.  The reason is\n// that C++ doesn't yet allow function-local types to be used to\n// instantiate templates.  The up-coming C++0x standard will fix this.\n// Once that's done, we'll consider supporting using MATCHER*() inside\n// a function.\n//\n// More Information\n// ================\n//\n// To learn more about using these macros, please search for 'MATCHER'\n// on\n// https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md\n\n#define MATCHER(name, description)\\\n  class name##Matcher {\\\n   public:\\\n    template <typename arg_type>\\\n    class gmock_Impl : public ::testing::MatcherInterface<\\\n        GTEST_REFERENCE_TO_CONST_(arg_type)> {\\\n     public:\\\n      gmock_Impl()\\\n           {}\\\n      virtual bool MatchAndExplain(\\\n          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n          ::testing::MatchResultListener* result_listener) const;\\\n      virtual void DescribeTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(false);\\\n      }\\\n      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(true);\\\n      }\\\n     private:\\\n      ::std::string FormatDescription(bool negation) const {\\\n        ::std::string gmock_description = (description);\\\n        if (!gmock_description.empty())\\\n          return gmock_description;\\\n        return ::testing::internal::FormatMatcherDescription(\\\n            negation, #name, \\\n            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\\\n                ::testing::tuple<>()));\\\n      }\\\n    };\\\n    template <typename arg_type>\\\n    operator ::testing::Matcher<arg_type>() const {\\\n      return ::testing::Matcher<arg_type>(\\\n          new gmock_Impl<arg_type>());\\\n    }\\\n    name##Matcher() {\\\n    }\\\n   private:\\\n  };\\\n  inline name##Matcher name() {\\\n    return name##Matcher();\\\n  }\\\n  template <typename arg_type>\\\n  bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain(\\\n      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\\\n          const\n\n#define MATCHER_P(name, p0, description)\\\n  template <typename p0##_type>\\\n  class name##MatcherP {\\\n   public:\\\n    template <typename arg_type>\\\n    class gmock_Impl : public ::testing::MatcherInterface<\\\n        GTEST_REFERENCE_TO_CONST_(arg_type)> {\\\n     public:\\\n      explicit gmock_Impl(p0##_type gmock_p0)\\\n           : p0(::testing::internal::move(gmock_p0)) {}\\\n      virtual bool MatchAndExplain(\\\n          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n          ::testing::MatchResultListener* result_listener) const;\\\n      virtual void DescribeTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(false);\\\n      }\\\n      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(true);\\\n      }\\\n      p0##_type const p0;\\\n     private:\\\n      ::std::string FormatDescription(bool negation) const {\\\n        ::std::string gmock_description = (description);\\\n        if (!gmock_description.empty())\\\n          return gmock_description;\\\n        return ::testing::internal::FormatMatcherDescription(\\\n            negation, #name, \\\n            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\\\n                ::testing::tuple<p0##_type>(p0)));\\\n      }\\\n    };\\\n    template <typename arg_type>\\\n    operator ::testing::Matcher<arg_type>() const {\\\n      return ::testing::Matcher<arg_type>(\\\n          new gmock_Impl<arg_type>(p0));\\\n    }\\\n    explicit name##MatcherP(p0##_type gmock_p0) : \\\n        p0(::testing::internal::move(gmock_p0)) {\\\n    }\\\n    p0##_type const p0;\\\n   private:\\\n  };\\\n  template <typename p0##_type>\\\n  inline name##MatcherP<p0##_type> name(p0##_type p0) {\\\n    return name##MatcherP<p0##_type>(p0);\\\n  }\\\n  template <typename p0##_type>\\\n  template <typename arg_type>\\\n  bool name##MatcherP<p0##_type>::gmock_Impl<arg_type>::MatchAndExplain(\\\n      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\\\n          const\n\n#define MATCHER_P2(name, p0, p1, description)\\\n  template <typename p0##_type, typename p1##_type>\\\n  class name##MatcherP2 {\\\n   public:\\\n    template <typename arg_type>\\\n    class gmock_Impl : public ::testing::MatcherInterface<\\\n        GTEST_REFERENCE_TO_CONST_(arg_type)> {\\\n     public:\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1)\\\n           : p0(::testing::internal::move(gmock_p0)), \\\n               p1(::testing::internal::move(gmock_p1)) {}\\\n      virtual bool MatchAndExplain(\\\n          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n          ::testing::MatchResultListener* result_listener) const;\\\n      virtual void DescribeTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(false);\\\n      }\\\n      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(true);\\\n      }\\\n      p0##_type const p0;\\\n      p1##_type const p1;\\\n     private:\\\n      ::std::string FormatDescription(bool negation) const {\\\n        ::std::string gmock_description = (description);\\\n        if (!gmock_description.empty())\\\n          return gmock_description;\\\n        return ::testing::internal::FormatMatcherDescription(\\\n            negation, #name, \\\n            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\\\n                ::testing::tuple<p0##_type, p1##_type>(p0, p1)));\\\n      }\\\n    };\\\n    template <typename arg_type>\\\n    operator ::testing::Matcher<arg_type>() const {\\\n      return ::testing::Matcher<arg_type>(\\\n          new gmock_Impl<arg_type>(p0, p1));\\\n    }\\\n    name##MatcherP2(p0##_type gmock_p0, \\\n        p1##_type gmock_p1) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)) {\\\n    }\\\n    p0##_type const p0;\\\n    p1##_type const p1;\\\n   private:\\\n  };\\\n  template <typename p0##_type, typename p1##_type>\\\n  inline name##MatcherP2<p0##_type, p1##_type> name(p0##_type p0, \\\n      p1##_type p1) {\\\n    return name##MatcherP2<p0##_type, p1##_type>(p0, p1);\\\n  }\\\n  template <typename p0##_type, typename p1##_type>\\\n  template <typename arg_type>\\\n  bool name##MatcherP2<p0##_type, \\\n      p1##_type>::gmock_Impl<arg_type>::MatchAndExplain(\\\n      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\\\n          const\n\n#define MATCHER_P3(name, p0, p1, p2, description)\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type>\\\n  class name##MatcherP3 {\\\n   public:\\\n    template <typename arg_type>\\\n    class gmock_Impl : public ::testing::MatcherInterface<\\\n        GTEST_REFERENCE_TO_CONST_(arg_type)> {\\\n     public:\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2)\\\n           : p0(::testing::internal::move(gmock_p0)), \\\n               p1(::testing::internal::move(gmock_p1)), \\\n               p2(::testing::internal::move(gmock_p2)) {}\\\n      virtual bool MatchAndExplain(\\\n          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n          ::testing::MatchResultListener* result_listener) const;\\\n      virtual void DescribeTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(false);\\\n      }\\\n      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(true);\\\n      }\\\n      p0##_type const p0;\\\n      p1##_type const p1;\\\n      p2##_type const p2;\\\n     private:\\\n      ::std::string FormatDescription(bool negation) const {\\\n        ::std::string gmock_description = (description);\\\n        if (!gmock_description.empty())\\\n          return gmock_description;\\\n        return ::testing::internal::FormatMatcherDescription(\\\n            negation, #name, \\\n            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\\\n                ::testing::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, \\\n                    p2)));\\\n      }\\\n    };\\\n    template <typename arg_type>\\\n    operator ::testing::Matcher<arg_type>() const {\\\n      return ::testing::Matcher<arg_type>(\\\n          new gmock_Impl<arg_type>(p0, p1, p2));\\\n    }\\\n    name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)), \\\n        p2(::testing::internal::move(gmock_p2)) {\\\n    }\\\n    p0##_type const p0;\\\n    p1##_type const p1;\\\n    p2##_type const p2;\\\n   private:\\\n  };\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type>\\\n  inline name##MatcherP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \\\n      p1##_type p1, p2##_type p2) {\\\n    return name##MatcherP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\\\n  }\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type>\\\n  template <typename arg_type>\\\n  bool name##MatcherP3<p0##_type, p1##_type, \\\n      p2##_type>::gmock_Impl<arg_type>::MatchAndExplain(\\\n      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\\\n          const\n\n#define MATCHER_P4(name, p0, p1, p2, p3, description)\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type>\\\n  class name##MatcherP4 {\\\n   public:\\\n    template <typename arg_type>\\\n    class gmock_Impl : public ::testing::MatcherInterface<\\\n        GTEST_REFERENCE_TO_CONST_(arg_type)> {\\\n     public:\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n          p3##_type gmock_p3)\\\n           : p0(::testing::internal::move(gmock_p0)), \\\n               p1(::testing::internal::move(gmock_p1)), \\\n               p2(::testing::internal::move(gmock_p2)), \\\n               p3(::testing::internal::move(gmock_p3)) {}\\\n      virtual bool MatchAndExplain(\\\n          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n          ::testing::MatchResultListener* result_listener) const;\\\n      virtual void DescribeTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(false);\\\n      }\\\n      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(true);\\\n      }\\\n      p0##_type const p0;\\\n      p1##_type const p1;\\\n      p2##_type const p2;\\\n      p3##_type const p3;\\\n     private:\\\n      ::std::string FormatDescription(bool negation) const {\\\n        ::std::string gmock_description = (description);\\\n        if (!gmock_description.empty())\\\n          return gmock_description;\\\n        return ::testing::internal::FormatMatcherDescription(\\\n            negation, #name, \\\n            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\\\n                ::testing::tuple<p0##_type, p1##_type, p2##_type, \\\n                    p3##_type>(p0, p1, p2, p3)));\\\n      }\\\n    };\\\n    template <typename arg_type>\\\n    operator ::testing::Matcher<arg_type>() const {\\\n      return ::testing::Matcher<arg_type>(\\\n          new gmock_Impl<arg_type>(p0, p1, p2, p3));\\\n    }\\\n    name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2, \\\n        p3##_type gmock_p3) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)), \\\n        p2(::testing::internal::move(gmock_p2)), \\\n        p3(::testing::internal::move(gmock_p3)) {\\\n    }\\\n    p0##_type const p0;\\\n    p1##_type const p1;\\\n    p2##_type const p2;\\\n    p3##_type const p3;\\\n   private:\\\n  };\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type>\\\n  inline name##MatcherP4<p0##_type, p1##_type, p2##_type, \\\n      p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \\\n      p3##_type p3) {\\\n    return name##MatcherP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, \\\n        p1, p2, p3);\\\n  }\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type>\\\n  template <typename arg_type>\\\n  bool name##MatcherP4<p0##_type, p1##_type, p2##_type, \\\n      p3##_type>::gmock_Impl<arg_type>::MatchAndExplain(\\\n      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\\\n          const\n\n#define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type>\\\n  class name##MatcherP5 {\\\n   public:\\\n    template <typename arg_type>\\\n    class gmock_Impl : public ::testing::MatcherInterface<\\\n        GTEST_REFERENCE_TO_CONST_(arg_type)> {\\\n     public:\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n          p3##_type gmock_p3, p4##_type gmock_p4)\\\n           : p0(::testing::internal::move(gmock_p0)), \\\n               p1(::testing::internal::move(gmock_p1)), \\\n               p2(::testing::internal::move(gmock_p2)), \\\n               p3(::testing::internal::move(gmock_p3)), \\\n               p4(::testing::internal::move(gmock_p4)) {}\\\n      virtual bool MatchAndExplain(\\\n          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n          ::testing::MatchResultListener* result_listener) const;\\\n      virtual void DescribeTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(false);\\\n      }\\\n      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(true);\\\n      }\\\n      p0##_type const p0;\\\n      p1##_type const p1;\\\n      p2##_type const p2;\\\n      p3##_type const p3;\\\n      p4##_type const p4;\\\n     private:\\\n      ::std::string FormatDescription(bool negation) const {\\\n        ::std::string gmock_description = (description);\\\n        if (!gmock_description.empty())\\\n          return gmock_description;\\\n        return ::testing::internal::FormatMatcherDescription(\\\n            negation, #name, \\\n            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\\\n                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \\\n                    p4##_type>(p0, p1, p2, p3, p4)));\\\n      }\\\n    };\\\n    template <typename arg_type>\\\n    operator ::testing::Matcher<arg_type>() const {\\\n      return ::testing::Matcher<arg_type>(\\\n          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4));\\\n    }\\\n    name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2, p3##_type gmock_p3, \\\n        p4##_type gmock_p4) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)), \\\n        p2(::testing::internal::move(gmock_p2)), \\\n        p3(::testing::internal::move(gmock_p3)), \\\n        p4(::testing::internal::move(gmock_p4)) {\\\n    }\\\n    p0##_type const p0;\\\n    p1##_type const p1;\\\n    p2##_type const p2;\\\n    p3##_type const p3;\\\n    p4##_type const p4;\\\n   private:\\\n  };\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type>\\\n  inline name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \\\n      p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \\\n      p4##_type p4) {\\\n    return name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \\\n        p4##_type>(p0, p1, p2, p3, p4);\\\n  }\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type>\\\n  template <typename arg_type>\\\n  bool name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \\\n      p4##_type>::gmock_Impl<arg_type>::MatchAndExplain(\\\n      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\\\n          const\n\n#define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type>\\\n  class name##MatcherP6 {\\\n   public:\\\n    template <typename arg_type>\\\n    class gmock_Impl : public ::testing::MatcherInterface<\\\n        GTEST_REFERENCE_TO_CONST_(arg_type)> {\\\n     public:\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5)\\\n           : p0(::testing::internal::move(gmock_p0)), \\\n               p1(::testing::internal::move(gmock_p1)), \\\n               p2(::testing::internal::move(gmock_p2)), \\\n               p3(::testing::internal::move(gmock_p3)), \\\n               p4(::testing::internal::move(gmock_p4)), \\\n               p5(::testing::internal::move(gmock_p5)) {}\\\n      virtual bool MatchAndExplain(\\\n          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n          ::testing::MatchResultListener* result_listener) const;\\\n      virtual void DescribeTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(false);\\\n      }\\\n      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(true);\\\n      }\\\n      p0##_type const p0;\\\n      p1##_type const p1;\\\n      p2##_type const p2;\\\n      p3##_type const p3;\\\n      p4##_type const p4;\\\n      p5##_type const p5;\\\n     private:\\\n      ::std::string FormatDescription(bool negation) const {\\\n        ::std::string gmock_description = (description);\\\n        if (!gmock_description.empty())\\\n          return gmock_description;\\\n        return ::testing::internal::FormatMatcherDescription(\\\n            negation, #name, \\\n            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\\\n                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \\\n                    p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\\\n      }\\\n    };\\\n    template <typename arg_type>\\\n    operator ::testing::Matcher<arg_type>() const {\\\n      return ::testing::Matcher<arg_type>(\\\n          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5));\\\n    }\\\n    name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \\\n        p5##_type gmock_p5) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)), \\\n        p2(::testing::internal::move(gmock_p2)), \\\n        p3(::testing::internal::move(gmock_p3)), \\\n        p4(::testing::internal::move(gmock_p4)), \\\n        p5(::testing::internal::move(gmock_p5)) {\\\n    }\\\n    p0##_type const p0;\\\n    p1##_type const p1;\\\n    p2##_type const p2;\\\n    p3##_type const p3;\\\n    p4##_type const p4;\\\n    p5##_type const p5;\\\n   private:\\\n  };\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type>\\\n  inline name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \\\n      p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \\\n      p3##_type p3, p4##_type p4, p5##_type p5) {\\\n    return name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \\\n        p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\\\n  }\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type>\\\n  template <typename arg_type>\\\n  bool name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \\\n      p5##_type>::gmock_Impl<arg_type>::MatchAndExplain(\\\n      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\\\n          const\n\n#define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description)\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type>\\\n  class name##MatcherP7 {\\\n   public:\\\n    template <typename arg_type>\\\n    class gmock_Impl : public ::testing::MatcherInterface<\\\n        GTEST_REFERENCE_TO_CONST_(arg_type)> {\\\n     public:\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \\\n          p6##_type gmock_p6)\\\n           : p0(::testing::internal::move(gmock_p0)), \\\n               p1(::testing::internal::move(gmock_p1)), \\\n               p2(::testing::internal::move(gmock_p2)), \\\n               p3(::testing::internal::move(gmock_p3)), \\\n               p4(::testing::internal::move(gmock_p4)), \\\n               p5(::testing::internal::move(gmock_p5)), \\\n               p6(::testing::internal::move(gmock_p6)) {}\\\n      virtual bool MatchAndExplain(\\\n          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n          ::testing::MatchResultListener* result_listener) const;\\\n      virtual void DescribeTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(false);\\\n      }\\\n      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(true);\\\n      }\\\n      p0##_type const p0;\\\n      p1##_type const p1;\\\n      p2##_type const p2;\\\n      p3##_type const p3;\\\n      p4##_type const p4;\\\n      p5##_type const p5;\\\n      p6##_type const p6;\\\n     private:\\\n      ::std::string FormatDescription(bool negation) const {\\\n        ::std::string gmock_description = (description);\\\n        if (!gmock_description.empty())\\\n          return gmock_description;\\\n        return ::testing::internal::FormatMatcherDescription(\\\n            negation, #name, \\\n            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\\\n                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \\\n                    p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, \\\n                    p6)));\\\n      }\\\n    };\\\n    template <typename arg_type>\\\n    operator ::testing::Matcher<arg_type>() const {\\\n      return ::testing::Matcher<arg_type>(\\\n          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6));\\\n    }\\\n    name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \\\n        p5##_type gmock_p5, \\\n        p6##_type gmock_p6) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)), \\\n        p2(::testing::internal::move(gmock_p2)), \\\n        p3(::testing::internal::move(gmock_p3)), \\\n        p4(::testing::internal::move(gmock_p4)), \\\n        p5(::testing::internal::move(gmock_p5)), \\\n        p6(::testing::internal::move(gmock_p6)) {\\\n    }\\\n    p0##_type const p0;\\\n    p1##_type const p1;\\\n    p2##_type const p2;\\\n    p3##_type const p3;\\\n    p4##_type const p4;\\\n    p5##_type const p5;\\\n    p6##_type const p6;\\\n   private:\\\n  };\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type>\\\n  inline name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \\\n      p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \\\n      p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \\\n      p6##_type p6) {\\\n    return name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \\\n        p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\\\n  }\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type>\\\n  template <typename arg_type>\\\n  bool name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \\\n      p5##_type, p6##_type>::gmock_Impl<arg_type>::MatchAndExplain(\\\n      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\\\n          const\n\n#define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description)\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type>\\\n  class name##MatcherP8 {\\\n   public:\\\n    template <typename arg_type>\\\n    class gmock_Impl : public ::testing::MatcherInterface<\\\n        GTEST_REFERENCE_TO_CONST_(arg_type)> {\\\n     public:\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \\\n          p6##_type gmock_p6, p7##_type gmock_p7)\\\n           : p0(::testing::internal::move(gmock_p0)), \\\n               p1(::testing::internal::move(gmock_p1)), \\\n               p2(::testing::internal::move(gmock_p2)), \\\n               p3(::testing::internal::move(gmock_p3)), \\\n               p4(::testing::internal::move(gmock_p4)), \\\n               p5(::testing::internal::move(gmock_p5)), \\\n               p6(::testing::internal::move(gmock_p6)), \\\n               p7(::testing::internal::move(gmock_p7)) {}\\\n      virtual bool MatchAndExplain(\\\n          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n          ::testing::MatchResultListener* result_listener) const;\\\n      virtual void DescribeTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(false);\\\n      }\\\n      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(true);\\\n      }\\\n      p0##_type const p0;\\\n      p1##_type const p1;\\\n      p2##_type const p2;\\\n      p3##_type const p3;\\\n      p4##_type const p4;\\\n      p5##_type const p5;\\\n      p6##_type const p6;\\\n      p7##_type const p7;\\\n     private:\\\n      ::std::string FormatDescription(bool negation) const {\\\n        ::std::string gmock_description = (description);\\\n        if (!gmock_description.empty())\\\n          return gmock_description;\\\n        return ::testing::internal::FormatMatcherDescription(\\\n            negation, #name, \\\n            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\\\n                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \\\n                    p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, \\\n                    p3, p4, p5, p6, p7)));\\\n      }\\\n    };\\\n    template <typename arg_type>\\\n    operator ::testing::Matcher<arg_type>() const {\\\n      return ::testing::Matcher<arg_type>(\\\n          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7));\\\n    }\\\n    name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \\\n        p5##_type gmock_p5, p6##_type gmock_p6, \\\n        p7##_type gmock_p7) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)), \\\n        p2(::testing::internal::move(gmock_p2)), \\\n        p3(::testing::internal::move(gmock_p3)), \\\n        p4(::testing::internal::move(gmock_p4)), \\\n        p5(::testing::internal::move(gmock_p5)), \\\n        p6(::testing::internal::move(gmock_p6)), \\\n        p7(::testing::internal::move(gmock_p7)) {\\\n    }\\\n    p0##_type const p0;\\\n    p1##_type const p1;\\\n    p2##_type const p2;\\\n    p3##_type const p3;\\\n    p4##_type const p4;\\\n    p5##_type const p5;\\\n    p6##_type const p6;\\\n    p7##_type const p7;\\\n   private:\\\n  };\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type>\\\n  inline name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \\\n      p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \\\n      p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \\\n      p6##_type p6, p7##_type p7) {\\\n    return name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \\\n        p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \\\n        p6, p7);\\\n  }\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type>\\\n  template <typename arg_type>\\\n  bool name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \\\n      p5##_type, p6##_type, \\\n      p7##_type>::gmock_Impl<arg_type>::MatchAndExplain(\\\n      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\\\n          const\n\n#define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description)\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type, typename p8##_type>\\\n  class name##MatcherP9 {\\\n   public:\\\n    template <typename arg_type>\\\n    class gmock_Impl : public ::testing::MatcherInterface<\\\n        GTEST_REFERENCE_TO_CONST_(arg_type)> {\\\n     public:\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \\\n          p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8)\\\n           : p0(::testing::internal::move(gmock_p0)), \\\n               p1(::testing::internal::move(gmock_p1)), \\\n               p2(::testing::internal::move(gmock_p2)), \\\n               p3(::testing::internal::move(gmock_p3)), \\\n               p4(::testing::internal::move(gmock_p4)), \\\n               p5(::testing::internal::move(gmock_p5)), \\\n               p6(::testing::internal::move(gmock_p6)), \\\n               p7(::testing::internal::move(gmock_p7)), \\\n               p8(::testing::internal::move(gmock_p8)) {}\\\n      virtual bool MatchAndExplain(\\\n          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n          ::testing::MatchResultListener* result_listener) const;\\\n      virtual void DescribeTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(false);\\\n      }\\\n      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(true);\\\n      }\\\n      p0##_type const p0;\\\n      p1##_type const p1;\\\n      p2##_type const p2;\\\n      p3##_type const p3;\\\n      p4##_type const p4;\\\n      p5##_type const p5;\\\n      p6##_type const p6;\\\n      p7##_type const p7;\\\n      p8##_type const p8;\\\n     private:\\\n      ::std::string FormatDescription(bool negation) const {\\\n        ::std::string gmock_description = (description);\\\n        if (!gmock_description.empty())\\\n          return gmock_description;\\\n        return ::testing::internal::FormatMatcherDescription(\\\n            negation, #name, \\\n            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\\\n                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \\\n                    p4##_type, p5##_type, p6##_type, p7##_type, \\\n                    p8##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\\\n      }\\\n    };\\\n    template <typename arg_type>\\\n    operator ::testing::Matcher<arg_type>() const {\\\n      return ::testing::Matcher<arg_type>(\\\n          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8));\\\n    }\\\n    name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \\\n        p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \\\n        p8##_type gmock_p8) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)), \\\n        p2(::testing::internal::move(gmock_p2)), \\\n        p3(::testing::internal::move(gmock_p3)), \\\n        p4(::testing::internal::move(gmock_p4)), \\\n        p5(::testing::internal::move(gmock_p5)), \\\n        p6(::testing::internal::move(gmock_p6)), \\\n        p7(::testing::internal::move(gmock_p7)), \\\n        p8(::testing::internal::move(gmock_p8)) {\\\n    }\\\n    p0##_type const p0;\\\n    p1##_type const p1;\\\n    p2##_type const p2;\\\n    p3##_type const p3;\\\n    p4##_type const p4;\\\n    p5##_type const p5;\\\n    p6##_type const p6;\\\n    p7##_type const p7;\\\n    p8##_type const p8;\\\n   private:\\\n  };\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type, typename p8##_type>\\\n  inline name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \\\n      p4##_type, p5##_type, p6##_type, p7##_type, \\\n      p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \\\n      p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \\\n      p8##_type p8) {\\\n    return name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \\\n        p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \\\n        p3, p4, p5, p6, p7, p8);\\\n  }\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type, typename p8##_type>\\\n  template <typename arg_type>\\\n  bool name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \\\n      p5##_type, p6##_type, p7##_type, \\\n      p8##_type>::gmock_Impl<arg_type>::MatchAndExplain(\\\n      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\\\n          const\n\n#define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description)\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type, typename p8##_type, \\\n      typename p9##_type>\\\n  class name##MatcherP10 {\\\n   public:\\\n    template <typename arg_type>\\\n    class gmock_Impl : public ::testing::MatcherInterface<\\\n        GTEST_REFERENCE_TO_CONST_(arg_type)> {\\\n     public:\\\n      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \\\n          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \\\n          p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \\\n          p9##_type gmock_p9)\\\n           : p0(::testing::internal::move(gmock_p0)), \\\n               p1(::testing::internal::move(gmock_p1)), \\\n               p2(::testing::internal::move(gmock_p2)), \\\n               p3(::testing::internal::move(gmock_p3)), \\\n               p4(::testing::internal::move(gmock_p4)), \\\n               p5(::testing::internal::move(gmock_p5)), \\\n               p6(::testing::internal::move(gmock_p6)), \\\n               p7(::testing::internal::move(gmock_p7)), \\\n               p8(::testing::internal::move(gmock_p8)), \\\n               p9(::testing::internal::move(gmock_p9)) {}\\\n      virtual bool MatchAndExplain(\\\n          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n          ::testing::MatchResultListener* result_listener) const;\\\n      virtual void DescribeTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(false);\\\n      }\\\n      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(true);\\\n      }\\\n      p0##_type const p0;\\\n      p1##_type const p1;\\\n      p2##_type const p2;\\\n      p3##_type const p3;\\\n      p4##_type const p4;\\\n      p5##_type const p5;\\\n      p6##_type const p6;\\\n      p7##_type const p7;\\\n      p8##_type const p8;\\\n      p9##_type const p9;\\\n     private:\\\n      ::std::string FormatDescription(bool negation) const {\\\n        ::std::string gmock_description = (description);\\\n        if (!gmock_description.empty())\\\n          return gmock_description;\\\n        return ::testing::internal::FormatMatcherDescription(\\\n            negation, #name, \\\n            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\\\n                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \\\n                    p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \\\n                    p9##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\\\n      }\\\n    };\\\n    template <typename arg_type>\\\n    operator ::testing::Matcher<arg_type>() const {\\\n      return ::testing::Matcher<arg_type>(\\\n          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));\\\n    }\\\n    name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \\\n        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \\\n        p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \\\n        p8##_type gmock_p8, \\\n        p9##_type gmock_p9) : p0(::testing::internal::move(gmock_p0)), \\\n        p1(::testing::internal::move(gmock_p1)), \\\n        p2(::testing::internal::move(gmock_p2)), \\\n        p3(::testing::internal::move(gmock_p3)), \\\n        p4(::testing::internal::move(gmock_p4)), \\\n        p5(::testing::internal::move(gmock_p5)), \\\n        p6(::testing::internal::move(gmock_p6)), \\\n        p7(::testing::internal::move(gmock_p7)), \\\n        p8(::testing::internal::move(gmock_p8)), \\\n        p9(::testing::internal::move(gmock_p9)) {\\\n    }\\\n    p0##_type const p0;\\\n    p1##_type const p1;\\\n    p2##_type const p2;\\\n    p3##_type const p3;\\\n    p4##_type const p4;\\\n    p5##_type const p5;\\\n    p6##_type const p6;\\\n    p7##_type const p7;\\\n    p8##_type const p8;\\\n    p9##_type const p9;\\\n   private:\\\n  };\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type, typename p8##_type, \\\n      typename p9##_type>\\\n  inline name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \\\n      p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \\\n      p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \\\n      p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \\\n      p9##_type p9) {\\\n    return name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \\\n        p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \\\n        p1, p2, p3, p4, p5, p6, p7, p8, p9);\\\n  }\\\n  template <typename p0##_type, typename p1##_type, typename p2##_type, \\\n      typename p3##_type, typename p4##_type, typename p5##_type, \\\n      typename p6##_type, typename p7##_type, typename p8##_type, \\\n      typename p9##_type>\\\n  template <typename arg_type>\\\n  bool name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \\\n      p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \\\n      p9##_type>::gmock_Impl<arg_type>::MatchAndExplain(\\\n      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\\\n          const\n\n#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/gmock-generated-matchers.h.pump",
    "content": "$$ -*- mode: c++; -*-\n$$ This is a Pump source file. Please use Pump to convert\n$$ it to gmock-generated-matchers.h.\n$$\n$var n = 10  $$ The maximum arity we support.\n$$ }} This line fixes auto-indentation of the following code in Emacs.\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements some commonly used variadic matchers.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_\n#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_\n\n#include <iterator>\n#include <sstream>\n#include <string>\n#include <vector>\n#include \"gmock/gmock-matchers.h\"\n\nnamespace testing {\nnamespace internal {\n\n$range i 0..n-1\n\n// The type of the i-th (0-based) field of Tuple.\n#define GMOCK_FIELD_TYPE_(Tuple, i) \\\n    typename ::testing::tuple_element<i, Tuple>::type\n\n// TupleFields<Tuple, k0, ..., kn> is for selecting fields from a\n// tuple of type Tuple.  It has two members:\n//\n//   type: a tuple type whose i-th field is the ki-th field of Tuple.\n//   GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple.\n//\n// For example, in class TupleFields<tuple<bool, char, int>, 2, 0>, we have:\n//\n//   type is tuple<int, bool>, and\n//   GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true).\n\ntemplate <class Tuple$for i [[, int k$i = -1]]>\nclass TupleFields;\n\n// This generic version is used when there are $n selectors.\ntemplate <class Tuple$for i [[, int k$i]]>\nclass TupleFields {\n public:\n  typedef ::testing::tuple<$for i, [[GMOCK_FIELD_TYPE_(Tuple, k$i)]]> type;\n  static type GetSelectedFields(const Tuple& t) {\n    return type($for i, [[get<k$i>(t)]]);\n  }\n};\n\n// The following specialization is used for 0 ~ $(n-1) selectors.\n\n$for i [[\n$$ }}}\n$range j 0..i-1\n$range k 0..n-1\n\ntemplate <class Tuple$for j [[, int k$j]]>\nclass TupleFields<Tuple, $for k, [[$if k < i [[k$k]] $else [[-1]]]]> {\n public:\n  typedef ::testing::tuple<$for j, [[GMOCK_FIELD_TYPE_(Tuple, k$j)]]> type;\n  static type GetSelectedFields(const Tuple& $if i==0 [[/* t */]] $else [[t]]) {\n    return type($for j, [[get<k$j>(t)]]);\n  }\n};\n\n]]\n\n#undef GMOCK_FIELD_TYPE_\n\n// Implements the Args() matcher.\n\n$var ks = [[$for i, [[k$i]]]]\ntemplate <class ArgsTuple$for i [[, int k$i = -1]]>\nclass ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {\n public:\n  // ArgsTuple may have top-level const or reference modifiers.\n  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(ArgsTuple) RawArgsTuple;\n  typedef typename internal::TupleFields<RawArgsTuple, $ks>::type SelectedArgs;\n  typedef Matcher<const SelectedArgs&> MonomorphicInnerMatcher;\n\n  template <typename InnerMatcher>\n  explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher)\n      : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {}\n\n  virtual bool MatchAndExplain(ArgsTuple args,\n                               MatchResultListener* listener) const {\n    const SelectedArgs& selected_args = GetSelectedArgs(args);\n    if (!listener->IsInterested())\n      return inner_matcher_.Matches(selected_args);\n\n    PrintIndices(listener->stream());\n    *listener << \"are \" << PrintToString(selected_args);\n\n    StringMatchResultListener inner_listener;\n    const bool match = inner_matcher_.MatchAndExplain(selected_args,\n                                                      &inner_listener);\n    PrintIfNotEmpty(inner_listener.str(), listener->stream());\n    return match;\n  }\n\n  virtual void DescribeTo(::std::ostream* os) const {\n    *os << \"are a tuple \";\n    PrintIndices(os);\n    inner_matcher_.DescribeTo(os);\n  }\n\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"are a tuple \";\n    PrintIndices(os);\n    inner_matcher_.DescribeNegationTo(os);\n  }\n\n private:\n  static SelectedArgs GetSelectedArgs(ArgsTuple args) {\n    return TupleFields<RawArgsTuple, $ks>::GetSelectedFields(args);\n  }\n\n  // Prints the indices of the selected fields.\n  static void PrintIndices(::std::ostream* os) {\n    *os << \"whose fields (\";\n    const int indices[$n] = { $ks };\n    for (int i = 0; i < $n; i++) {\n      if (indices[i] < 0)\n        break;\n\n      if (i >= 1)\n        *os << \", \";\n\n      *os << \"#\" << indices[i];\n    }\n    *os << \") \";\n  }\n\n  const MonomorphicInnerMatcher inner_matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl);\n};\n\ntemplate <class InnerMatcher$for i [[, int k$i = -1]]>\nclass ArgsMatcher {\n public:\n  explicit ArgsMatcher(const InnerMatcher& inner_matcher)\n      : inner_matcher_(inner_matcher) {}\n\n  template <typename ArgsTuple>\n  operator Matcher<ArgsTuple>() const {\n    return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, $ks>(inner_matcher_));\n  }\n\n private:\n  const InnerMatcher inner_matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(ArgsMatcher);\n};\n\n// A set of metafunctions for computing the result type of AllOf.\n// AllOf(m1, ..., mN) returns\n// AllOfResultN<decltype(m1), ..., decltype(mN)>::type.\n\n// Although AllOf isn't defined for one argument, AllOfResult1 is defined\n// to simplify the implementation.\ntemplate <typename M1>\nstruct AllOfResult1 {\n  typedef M1 type;\n};\n\n$range i 1..n\n\n$range i 2..n\n$for i [[\n$range j 2..i\n$var m = i/2\n$range k 1..m\n$range t m+1..i\n\ntemplate <typename M1$for j [[, typename M$j]]>\nstruct AllOfResult$i {\n  typedef BothOfMatcher<\n      typename AllOfResult$m<$for k, [[M$k]]>::type,\n      typename AllOfResult$(i-m)<$for t, [[M$t]]>::type\n  > type;\n};\n\n]]\n\n// A set of metafunctions for computing the result type of AnyOf.\n// AnyOf(m1, ..., mN) returns\n// AnyOfResultN<decltype(m1), ..., decltype(mN)>::type.\n\n// Although AnyOf isn't defined for one argument, AnyOfResult1 is defined\n// to simplify the implementation.\ntemplate <typename M1>\nstruct AnyOfResult1 {\n  typedef M1 type;\n};\n\n$range i 1..n\n\n$range i 2..n\n$for i [[\n$range j 2..i\n$var m = i/2\n$range k 1..m\n$range t m+1..i\n\ntemplate <typename M1$for j [[, typename M$j]]>\nstruct AnyOfResult$i {\n  typedef EitherOfMatcher<\n      typename AnyOfResult$m<$for k, [[M$k]]>::type,\n      typename AnyOfResult$(i-m)<$for t, [[M$t]]>::type\n  > type;\n};\n\n]]\n\n}  // namespace internal\n\n// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected\n// fields of it matches a_matcher.  C++ doesn't support default\n// arguments for function templates, so we have to overload it.\n\n$range i 0..n\n$for i [[\n$range j 1..i\ntemplate <$for j [[int k$j, ]]typename InnerMatcher>\ninline internal::ArgsMatcher<InnerMatcher$for j [[, k$j]]>\nArgs(const InnerMatcher& matcher) {\n  return internal::ArgsMatcher<InnerMatcher$for j [[, k$j]]>(matcher);\n}\n\n\n]]\n// ElementsAre(e_1, e_2, ... e_n) matches an STL-style container with\n// n elements, where the i-th element in the container must\n// match the i-th argument in the list.  Each argument of\n// ElementsAre() can be either a value or a matcher.  We support up to\n// $n arguments.\n//\n// The use of DecayArray in the implementation allows ElementsAre()\n// to accept string literals, whose type is const char[N], but we\n// want to treat them as const char*.\n//\n// NOTE: Since ElementsAre() cares about the order of the elements, it\n// must not be used with containers whose elements's order is\n// undefined (e.g. hash_map).\n\n$range i 0..n\n$for i [[\n\n$range j 1..i\n\n$if i>0 [[\n\ntemplate <$for j, [[typename T$j]]>\n]]\n\ninline internal::ElementsAreMatcher<\n    ::testing::tuple<\n$for j, [[\n\n        typename internal::DecayArray<T$j[[]]>::type]]> >\nElementsAre($for j, [[const T$j& e$j]]) {\n  typedef ::testing::tuple<\n$for j, [[\n\n      typename internal::DecayArray<T$j[[]]>::type]]> Args;\n  return internal::ElementsAreMatcher<Args>(Args($for j, [[e$j]]));\n}\n\n]]\n\n// UnorderedElementsAre(e_1, e_2, ..., e_n) is an ElementsAre extension\n// that matches n elements in any order.  We support up to n=$n arguments.\n//\n// If you have >$n elements, consider UnorderedElementsAreArray() or\n// UnorderedPointwise() instead.\n\n$range i 0..n\n$for i [[\n\n$range j 1..i\n\n$if i>0 [[\n\ntemplate <$for j, [[typename T$j]]>\n]]\n\ninline internal::UnorderedElementsAreMatcher<\n    ::testing::tuple<\n$for j, [[\n\n        typename internal::DecayArray<T$j[[]]>::type]]> >\nUnorderedElementsAre($for j, [[const T$j& e$j]]) {\n  typedef ::testing::tuple<\n$for j, [[\n\n      typename internal::DecayArray<T$j[[]]>::type]]> Args;\n  return internal::UnorderedElementsAreMatcher<Args>(Args($for j, [[e$j]]));\n}\n\n]]\n\n// AllOf(m1, m2, ..., mk) matches any value that matches all of the given\n// sub-matchers.  AllOf is called fully qualified to prevent ADL from firing.\n\n$range i 2..n\n$for i [[\n$range j 1..i\n$var m = i/2\n$range k 1..m\n$range t m+1..i\n\ntemplate <$for j, [[typename M$j]]>\ninline typename internal::AllOfResult$i<$for j, [[M$j]]>::type\nAllOf($for j, [[M$j m$j]]) {\n  return typename internal::AllOfResult$i<$for j, [[M$j]]>::type(\n      $if m == 1 [[m1]] $else [[::testing::AllOf($for k, [[m$k]])]],\n      $if m+1 == i [[m$i]] $else [[::testing::AllOf($for t, [[m$t]])]]);\n}\n\n]]\n\n// AnyOf(m1, m2, ..., mk) matches any value that matches any of the given\n// sub-matchers.  AnyOf is called fully qualified to prevent ADL from firing.\n\n$range i 2..n\n$for i [[\n$range j 1..i\n$var m = i/2\n$range k 1..m\n$range t m+1..i\n\ntemplate <$for j, [[typename M$j]]>\ninline typename internal::AnyOfResult$i<$for j, [[M$j]]>::type\nAnyOf($for j, [[M$j m$j]]) {\n  return typename internal::AnyOfResult$i<$for j, [[M$j]]>::type(\n      $if m == 1 [[m1]] $else [[::testing::AnyOf($for k, [[m$k]])]],\n      $if m+1 == i [[m$i]] $else [[::testing::AnyOf($for t, [[m$t]])]]);\n}\n\n]]\n\n}  // namespace testing\n$$ } // This Pump meta comment fixes auto-indentation in Emacs. It will not\n$$   // show up in the generated code.\n\n\n// The MATCHER* family of macros can be used in a namespace scope to\n// define custom matchers easily.\n//\n// Basic Usage\n// ===========\n//\n// The syntax\n//\n//   MATCHER(name, description_string) { statements; }\n//\n// defines a matcher with the given name that executes the statements,\n// which must return a bool to indicate if the match succeeds.  Inside\n// the statements, you can refer to the value being matched by 'arg',\n// and refer to its type by 'arg_type'.\n//\n// The description string documents what the matcher does, and is used\n// to generate the failure message when the match fails.  Since a\n// MATCHER() is usually defined in a header file shared by multiple\n// C++ source files, we require the description to be a C-string\n// literal to avoid possible side effects.  It can be empty, in which\n// case we'll use the sequence of words in the matcher name as the\n// description.\n//\n// For example:\n//\n//   MATCHER(IsEven, \"\") { return (arg % 2) == 0; }\n//\n// allows you to write\n//\n//   // Expects mock_foo.Bar(n) to be called where n is even.\n//   EXPECT_CALL(mock_foo, Bar(IsEven()));\n//\n// or,\n//\n//   // Verifies that the value of some_expression is even.\n//   EXPECT_THAT(some_expression, IsEven());\n//\n// If the above assertion fails, it will print something like:\n//\n//   Value of: some_expression\n//   Expected: is even\n//     Actual: 7\n//\n// where the description \"is even\" is automatically calculated from the\n// matcher name IsEven.\n//\n// Argument Type\n// =============\n//\n// Note that the type of the value being matched (arg_type) is\n// determined by the context in which you use the matcher and is\n// supplied to you by the compiler, so you don't need to worry about\n// declaring it (nor can you).  This allows the matcher to be\n// polymorphic.  For example, IsEven() can be used to match any type\n// where the value of \"(arg % 2) == 0\" can be implicitly converted to\n// a bool.  In the \"Bar(IsEven())\" example above, if method Bar()\n// takes an int, 'arg_type' will be int; if it takes an unsigned long,\n// 'arg_type' will be unsigned long; and so on.\n//\n// Parameterizing Matchers\n// =======================\n//\n// Sometimes you'll want to parameterize the matcher.  For that you\n// can use another macro:\n//\n//   MATCHER_P(name, param_name, description_string) { statements; }\n//\n// For example:\n//\n//   MATCHER_P(HasAbsoluteValue, value, \"\") { return abs(arg) == value; }\n//\n// will allow you to write:\n//\n//   EXPECT_THAT(Blah(\"a\"), HasAbsoluteValue(n));\n//\n// which may lead to this message (assuming n is 10):\n//\n//   Value of: Blah(\"a\")\n//   Expected: has absolute value 10\n//     Actual: -9\n//\n// Note that both the matcher description and its parameter are\n// printed, making the message human-friendly.\n//\n// In the matcher definition body, you can write 'foo_type' to\n// reference the type of a parameter named 'foo'.  For example, in the\n// body of MATCHER_P(HasAbsoluteValue, value) above, you can write\n// 'value_type' to refer to the type of 'value'.\n//\n// We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P$n to\n// support multi-parameter matchers.\n//\n// Describing Parameterized Matchers\n// =================================\n//\n// The last argument to MATCHER*() is a string-typed expression.  The\n// expression can reference all of the matcher's parameters and a\n// special bool-typed variable named 'negation'.  When 'negation' is\n// false, the expression should evaluate to the matcher's description;\n// otherwise it should evaluate to the description of the negation of\n// the matcher.  For example,\n//\n//   using testing::PrintToString;\n//\n//   MATCHER_P2(InClosedRange, low, hi,\n//       std::string(negation ? \"is not\" : \"is\") + \" in range [\" +\n//       PrintToString(low) + \", \" + PrintToString(hi) + \"]\") {\n//     return low <= arg && arg <= hi;\n//   }\n//   ...\n//   EXPECT_THAT(3, InClosedRange(4, 6));\n//   EXPECT_THAT(3, Not(InClosedRange(2, 4)));\n//\n// would generate two failures that contain the text:\n//\n//   Expected: is in range [4, 6]\n//   ...\n//   Expected: is not in range [2, 4]\n//\n// If you specify \"\" as the description, the failure message will\n// contain the sequence of words in the matcher name followed by the\n// parameter values printed as a tuple.  For example,\n//\n//   MATCHER_P2(InClosedRange, low, hi, \"\") { ... }\n//   ...\n//   EXPECT_THAT(3, InClosedRange(4, 6));\n//   EXPECT_THAT(3, Not(InClosedRange(2, 4)));\n//\n// would generate two failures that contain the text:\n//\n//   Expected: in closed range (4, 6)\n//   ...\n//   Expected: not (in closed range (2, 4))\n//\n// Types of Matcher Parameters\n// ===========================\n//\n// For the purpose of typing, you can view\n//\n//   MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... }\n//\n// as shorthand for\n//\n//   template <typename p1_type, ..., typename pk_type>\n//   FooMatcherPk<p1_type, ..., pk_type>\n//   Foo(p1_type p1, ..., pk_type pk) { ... }\n//\n// When you write Foo(v1, ..., vk), the compiler infers the types of\n// the parameters v1, ..., and vk for you.  If you are not happy with\n// the result of the type inference, you can specify the types by\n// explicitly instantiating the template, as in Foo<long, bool>(5,\n// false).  As said earlier, you don't get to (or need to) specify\n// 'arg_type' as that's determined by the context in which the matcher\n// is used.  You can assign the result of expression Foo(p1, ..., pk)\n// to a variable of type FooMatcherPk<p1_type, ..., pk_type>.  This\n// can be useful when composing matchers.\n//\n// While you can instantiate a matcher template with reference types,\n// passing the parameters by pointer usually makes your code more\n// readable.  If, however, you still want to pass a parameter by\n// reference, be aware that in the failure message generated by the\n// matcher you will see the value of the referenced object but not its\n// address.\n//\n// Explaining Match Results\n// ========================\n//\n// Sometimes the matcher description alone isn't enough to explain why\n// the match has failed or succeeded.  For example, when expecting a\n// long string, it can be very helpful to also print the diff between\n// the expected string and the actual one.  To achieve that, you can\n// optionally stream additional information to a special variable\n// named result_listener, whose type is a pointer to class\n// MatchResultListener:\n//\n//   MATCHER_P(EqualsLongString, str, \"\") {\n//     if (arg == str) return true;\n//\n//     *result_listener << \"the difference: \"\n///                     << DiffStrings(str, arg);\n//     return false;\n//   }\n//\n// Overloading Matchers\n// ====================\n//\n// You can overload matchers with different numbers of parameters:\n//\n//   MATCHER_P(Blah, a, description_string1) { ... }\n//   MATCHER_P2(Blah, a, b, description_string2) { ... }\n//\n// Caveats\n// =======\n//\n// When defining a new matcher, you should also consider implementing\n// MatcherInterface or using MakePolymorphicMatcher().  These\n// approaches require more work than the MATCHER* macros, but also\n// give you more control on the types of the value being matched and\n// the matcher parameters, which may leads to better compiler error\n// messages when the matcher is used wrong.  They also allow\n// overloading matchers based on parameter types (as opposed to just\n// based on the number of parameters).\n//\n// MATCHER*() can only be used in a namespace scope.  The reason is\n// that C++ doesn't yet allow function-local types to be used to\n// instantiate templates.  The up-coming C++0x standard will fix this.\n// Once that's done, we'll consider supporting using MATCHER*() inside\n// a function.\n//\n// More Information\n// ================\n//\n// To learn more about using these macros, please search for 'MATCHER'\n// on\n// https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md\n\n$range i 0..n\n$for i\n\n[[\n$var macro_name = [[$if i==0 [[MATCHER]] $elif i==1 [[MATCHER_P]]\n                                         $else [[MATCHER_P$i]]]]\n$var class_name = [[name##Matcher[[$if i==0 [[]] $elif i==1 [[P]]\n                                                 $else [[P$i]]]]]]\n$range j 0..i-1\n$var template = [[$if i==0 [[]] $else [[\n\n  template <$for j, [[typename p$j##_type]]>\\\n]]]]\n$var ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]]\n$var impl_ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]]\n$var impl_inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(::testing::internal::move(gmock_p$j))]]]]]]\n$var inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(::testing::internal::move(gmock_p$j))]]]]]]\n$var params = [[$for j, [[p$j]]]]\n$var param_types = [[$if i==0 [[]] $else [[<$for j, [[p$j##_type]]>]]]]\n$var param_types_and_names = [[$for j, [[p$j##_type p$j]]]]\n$var param_field_decls = [[$for j\n[[\n\n      p$j##_type const p$j;\\\n]]]]\n$var param_field_decls2 = [[$for j\n[[\n\n    p$j##_type const p$j;\\\n]]]]\n\n#define $macro_name(name$for j [[, p$j]], description)\\$template\n  class $class_name {\\\n   public:\\\n    template <typename arg_type>\\\n    class gmock_Impl : public ::testing::MatcherInterface<\\\n        GTEST_REFERENCE_TO_CONST_(arg_type)> {\\\n     public:\\\n      [[$if i==1 [[explicit ]]]]gmock_Impl($impl_ctor_param_list)\\\n          $impl_inits {}\\\n      virtual bool MatchAndExplain(\\\n          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n          ::testing::MatchResultListener* result_listener) const;\\\n      virtual void DescribeTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(false);\\\n      }\\\n      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\\\n        *gmock_os << FormatDescription(true);\\\n      }\\$param_field_decls\n     private:\\\n      ::std::string FormatDescription(bool negation) const {\\\n        ::std::string gmock_description = (description);\\\n        if (!gmock_description.empty())\\\n          return gmock_description;\\\n        return ::testing::internal::FormatMatcherDescription(\\\n            negation, #name, \\\n            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\\\n                ::testing::tuple<$for j, [[p$j##_type]]>($for j, [[p$j]])));\\\n      }\\\n    };\\\n    template <typename arg_type>\\\n    operator ::testing::Matcher<arg_type>() const {\\\n      return ::testing::Matcher<arg_type>(\\\n          new gmock_Impl<arg_type>($params));\\\n    }\\\n    [[$if i==1 [[explicit ]]]]$class_name($ctor_param_list)$inits {\\\n    }\\$param_field_decls2\n   private:\\\n  };\\$template\n  inline $class_name$param_types name($param_types_and_names) {\\\n    return $class_name$param_types($params);\\\n  }\\$template\n  template <typename arg_type>\\\n  bool $class_name$param_types::gmock_Impl<arg_type>::MatchAndExplain(\\\n      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\\\n      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\\\n          const\n]]\n\n\n#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/gmock-generated-nice-strict.h",
    "content": "// This file was GENERATED by command:\n//     pump.py gmock-generated-nice-strict.h.pump\n// DO NOT EDIT BY HAND!!!\n\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Implements class templates NiceMock, NaggyMock, and StrictMock.\n//\n// Given a mock class MockFoo that is created using Google Mock,\n// NiceMock<MockFoo> is a subclass of MockFoo that allows\n// uninteresting calls (i.e. calls to mock methods that have no\n// EXPECT_CALL specs), NaggyMock<MockFoo> is a subclass of MockFoo\n// that prints a warning when an uninteresting call occurs, and\n// StrictMock<MockFoo> is a subclass of MockFoo that treats all\n// uninteresting calls as errors.\n//\n// Currently a mock is naggy by default, so MockFoo and\n// NaggyMock<MockFoo> behave like the same.  However, we will soon\n// switch the default behavior of mocks to be nice, as that in general\n// leads to more maintainable tests.  When that happens, MockFoo will\n// stop behaving like NaggyMock<MockFoo> and start behaving like\n// NiceMock<MockFoo>.\n//\n// NiceMock, NaggyMock, and StrictMock \"inherit\" the constructors of\n// their respective base class.  Therefore you can write\n// NiceMock<MockFoo>(5, \"a\") to construct a nice mock where MockFoo\n// has a constructor that accepts (int, const char*), for example.\n//\n// A known limitation is that NiceMock<MockFoo>, NaggyMock<MockFoo>,\n// and StrictMock<MockFoo> only works for mock methods defined using\n// the MOCK_METHOD* family of macros DIRECTLY in the MockFoo class.\n// If a mock method is defined in a base class of MockFoo, the \"nice\"\n// or \"strict\" modifier may not affect it, depending on the compiler.\n// In particular, nesting NiceMock, NaggyMock, and StrictMock is NOT\n// supported.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_\n#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_\n\n#include \"gmock/gmock-spec-builders.h\"\n#include \"gmock/internal/gmock-port.h\"\n\nnamespace testing {\n\ntemplate <class MockClass>\nclass NiceMock : public MockClass {\n public:\n  NiceMock() : MockClass() {\n    ::testing::Mock::AllowUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n#if GTEST_LANG_CXX11\n  // Ideally, we would inherit base class's constructors through a using\n  // declaration, which would preserve their visibility. However, many existing\n  // tests rely on the fact that current implementation reexports protected\n  // constructors as public. These tests would need to be cleaned up first.\n\n  // Single argument constructor is special-cased so that it can be\n  // made explicit.\n  template <typename A>\n  explicit NiceMock(A&& arg) : MockClass(std::forward<A>(arg)) {\n    ::testing::Mock::AllowUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename... An>\n  NiceMock(A1&& arg1, A2&& arg2, An&&... args)\n      : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),\n                  std::forward<An>(args)...) {\n    ::testing::Mock::AllowUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n#else\n  // C++98 doesn't have variadic templates, so we have to define one\n  // for each arity.\n  template <typename A1>\n  explicit NiceMock(const A1& a1) : MockClass(a1) {\n    ::testing::Mock::AllowUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n  template <typename A1, typename A2>\n  NiceMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {\n    ::testing::Mock::AllowUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3>\n  NiceMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) {\n    ::testing::Mock::AllowUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4>\n  NiceMock(const A1& a1, const A2& a2, const A3& a3,\n      const A4& a4) : MockClass(a1, a2, a3, a4) {\n    ::testing::Mock::AllowUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5>\n  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5) : MockClass(a1, a2, a3, a4, a5) {\n    ::testing::Mock::AllowUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5,\n      typename A6>\n  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {\n    ::testing::Mock::AllowUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5,\n      typename A6, typename A7>\n  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5,\n      a6, a7) {\n    ::testing::Mock::AllowUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5,\n      typename A6, typename A7, typename A8>\n  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1,\n      a2, a3, a4, a5, a6, a7, a8) {\n    ::testing::Mock::AllowUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5,\n      typename A6, typename A7, typename A8, typename A9>\n  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5, const A6& a6, const A7& a7, const A8& a8,\n      const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {\n    ::testing::Mock::AllowUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5,\n      typename A6, typename A7, typename A8, typename A9, typename A10>\n  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9,\n      const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {\n    ::testing::Mock::AllowUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n#endif  // GTEST_LANG_CXX11\n\n  ~NiceMock() {\n    ::testing::Mock::UnregisterCallReaction(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(NiceMock);\n};\n\ntemplate <class MockClass>\nclass NaggyMock : public MockClass {\n public:\n  NaggyMock() : MockClass() {\n    ::testing::Mock::WarnUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n#if GTEST_LANG_CXX11\n  // Ideally, we would inherit base class's constructors through a using\n  // declaration, which would preserve their visibility. However, many existing\n  // tests rely on the fact that current implementation reexports protected\n  // constructors as public. These tests would need to be cleaned up first.\n\n  // Single argument constructor is special-cased so that it can be\n  // made explicit.\n  template <typename A>\n  explicit NaggyMock(A&& arg) : MockClass(std::forward<A>(arg)) {\n    ::testing::Mock::WarnUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename... An>\n  NaggyMock(A1&& arg1, A2&& arg2, An&&... args)\n      : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),\n                  std::forward<An>(args)...) {\n    ::testing::Mock::WarnUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n#else\n  // C++98 doesn't have variadic templates, so we have to define one\n  // for each arity.\n  template <typename A1>\n  explicit NaggyMock(const A1& a1) : MockClass(a1) {\n    ::testing::Mock::WarnUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n  template <typename A1, typename A2>\n  NaggyMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {\n    ::testing::Mock::WarnUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3>\n  NaggyMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) {\n    ::testing::Mock::WarnUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4>\n  NaggyMock(const A1& a1, const A2& a2, const A3& a3,\n      const A4& a4) : MockClass(a1, a2, a3, a4) {\n    ::testing::Mock::WarnUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5>\n  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5) : MockClass(a1, a2, a3, a4, a5) {\n    ::testing::Mock::WarnUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5,\n      typename A6>\n  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {\n    ::testing::Mock::WarnUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5,\n      typename A6, typename A7>\n  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5,\n      a6, a7) {\n    ::testing::Mock::WarnUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5,\n      typename A6, typename A7, typename A8>\n  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1,\n      a2, a3, a4, a5, a6, a7, a8) {\n    ::testing::Mock::WarnUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5,\n      typename A6, typename A7, typename A8, typename A9>\n  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5, const A6& a6, const A7& a7, const A8& a8,\n      const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {\n    ::testing::Mock::WarnUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5,\n      typename A6, typename A7, typename A8, typename A9, typename A10>\n  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9,\n      const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {\n    ::testing::Mock::WarnUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n#endif  // GTEST_LANG_CXX11\n\n  ~NaggyMock() {\n    ::testing::Mock::UnregisterCallReaction(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(NaggyMock);\n};\n\ntemplate <class MockClass>\nclass StrictMock : public MockClass {\n public:\n  StrictMock() : MockClass() {\n    ::testing::Mock::FailUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n#if GTEST_LANG_CXX11\n  // Ideally, we would inherit base class's constructors through a using\n  // declaration, which would preserve their visibility. However, many existing\n  // tests rely on the fact that current implementation reexports protected\n  // constructors as public. These tests would need to be cleaned up first.\n\n  // Single argument constructor is special-cased so that it can be\n  // made explicit.\n  template <typename A>\n  explicit StrictMock(A&& arg) : MockClass(std::forward<A>(arg)) {\n    ::testing::Mock::FailUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename... An>\n  StrictMock(A1&& arg1, A2&& arg2, An&&... args)\n      : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),\n                  std::forward<An>(args)...) {\n    ::testing::Mock::FailUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n#else\n  // C++98 doesn't have variadic templates, so we have to define one\n  // for each arity.\n  template <typename A1>\n  explicit StrictMock(const A1& a1) : MockClass(a1) {\n    ::testing::Mock::FailUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n  template <typename A1, typename A2>\n  StrictMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {\n    ::testing::Mock::FailUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3>\n  StrictMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) {\n    ::testing::Mock::FailUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4>\n  StrictMock(const A1& a1, const A2& a2, const A3& a3,\n      const A4& a4) : MockClass(a1, a2, a3, a4) {\n    ::testing::Mock::FailUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5>\n  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5) : MockClass(a1, a2, a3, a4, a5) {\n    ::testing::Mock::FailUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5,\n      typename A6>\n  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {\n    ::testing::Mock::FailUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5,\n      typename A6, typename A7>\n  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5,\n      a6, a7) {\n    ::testing::Mock::FailUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5,\n      typename A6, typename A7, typename A8>\n  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1,\n      a2, a3, a4, a5, a6, a7, a8) {\n    ::testing::Mock::FailUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5,\n      typename A6, typename A7, typename A8, typename A9>\n  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5, const A6& a6, const A7& a7, const A8& a8,\n      const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {\n    ::testing::Mock::FailUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename A3, typename A4, typename A5,\n      typename A6, typename A7, typename A8, typename A9, typename A10>\n  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,\n      const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9,\n      const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {\n    ::testing::Mock::FailUninterestingCalls(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n#endif  // GTEST_LANG_CXX11\n\n  ~StrictMock() {\n    ::testing::Mock::UnregisterCallReaction(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(StrictMock);\n};\n\n// The following specializations catch some (relatively more common)\n// user errors of nesting nice and strict mocks.  They do NOT catch\n// all possible errors.\n\n// These specializations are declared but not defined, as NiceMock,\n// NaggyMock, and StrictMock cannot be nested.\n\ntemplate <typename MockClass>\nclass NiceMock<NiceMock<MockClass> >;\ntemplate <typename MockClass>\nclass NiceMock<NaggyMock<MockClass> >;\ntemplate <typename MockClass>\nclass NiceMock<StrictMock<MockClass> >;\n\ntemplate <typename MockClass>\nclass NaggyMock<NiceMock<MockClass> >;\ntemplate <typename MockClass>\nclass NaggyMock<NaggyMock<MockClass> >;\ntemplate <typename MockClass>\nclass NaggyMock<StrictMock<MockClass> >;\n\ntemplate <typename MockClass>\nclass StrictMock<NiceMock<MockClass> >;\ntemplate <typename MockClass>\nclass StrictMock<NaggyMock<MockClass> >;\ntemplate <typename MockClass>\nclass StrictMock<StrictMock<MockClass> >;\n\n}  // namespace testing\n\n#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/gmock-generated-nice-strict.h.pump",
    "content": "$$ -*- mode: c++; -*-\n$$ This is a Pump source file. Please use Pump to convert\n$$ it to gmock-generated-nice-strict.h.\n$$\n$var n = 10  $$ The maximum arity we support.\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Implements class templates NiceMock, NaggyMock, and StrictMock.\n//\n// Given a mock class MockFoo that is created using Google Mock,\n// NiceMock<MockFoo> is a subclass of MockFoo that allows\n// uninteresting calls (i.e. calls to mock methods that have no\n// EXPECT_CALL specs), NaggyMock<MockFoo> is a subclass of MockFoo\n// that prints a warning when an uninteresting call occurs, and\n// StrictMock<MockFoo> is a subclass of MockFoo that treats all\n// uninteresting calls as errors.\n//\n// Currently a mock is naggy by default, so MockFoo and\n// NaggyMock<MockFoo> behave like the same.  However, we will soon\n// switch the default behavior of mocks to be nice, as that in general\n// leads to more maintainable tests.  When that happens, MockFoo will\n// stop behaving like NaggyMock<MockFoo> and start behaving like\n// NiceMock<MockFoo>.\n//\n// NiceMock, NaggyMock, and StrictMock \"inherit\" the constructors of\n// their respective base class.  Therefore you can write\n// NiceMock<MockFoo>(5, \"a\") to construct a nice mock where MockFoo\n// has a constructor that accepts (int, const char*), for example.\n//\n// A known limitation is that NiceMock<MockFoo>, NaggyMock<MockFoo>,\n// and StrictMock<MockFoo> only works for mock methods defined using\n// the MOCK_METHOD* family of macros DIRECTLY in the MockFoo class.\n// If a mock method is defined in a base class of MockFoo, the \"nice\"\n// or \"strict\" modifier may not affect it, depending on the compiler.\n// In particular, nesting NiceMock, NaggyMock, and StrictMock is NOT\n// supported.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_\n#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_\n\n#include \"gmock/gmock-spec-builders.h\"\n#include \"gmock/internal/gmock-port.h\"\n\nnamespace testing {\n\n$range kind 0..2\n$for kind [[\n\n$var clazz=[[$if kind==0 [[NiceMock]]\n             $elif kind==1 [[NaggyMock]]\n             $else [[StrictMock]]]]\n\n$var method=[[$if kind==0 [[AllowUninterestingCalls]]\n             $elif kind==1 [[WarnUninterestingCalls]]\n             $else [[FailUninterestingCalls]]]]\n\ntemplate <class MockClass>\nclass $clazz : public MockClass {\n public:\n  $clazz() : MockClass() {\n    ::testing::Mock::$method(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n#if GTEST_LANG_CXX11\n  // Ideally, we would inherit base class's constructors through a using\n  // declaration, which would preserve their visibility. However, many existing\n  // tests rely on the fact that current implementation reexports protected\n  // constructors as public. These tests would need to be cleaned up first.\n\n  // Single argument constructor is special-cased so that it can be\n  // made explicit.\n  template <typename A>\n  explicit $clazz(A&& arg) : MockClass(std::forward<A>(arg)) {\n    ::testing::Mock::$method(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n  template <typename A1, typename A2, typename... An>\n  $clazz(A1&& arg1, A2&& arg2, An&&... args)\n      : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),\n                  std::forward<An>(args)...) {\n    ::testing::Mock::$method(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n#else\n  // C++98 doesn't have variadic templates, so we have to define one\n  // for each arity.\n  template <typename A1>\n  explicit $clazz(const A1& a1) : MockClass(a1) {\n    ::testing::Mock::$method(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n$range i 2..n\n$for i [[\n$range j 1..i\n  template <$for j, [[typename A$j]]>\n  $clazz($for j, [[const A$j& a$j]]) : MockClass($for j, [[a$j]]) {\n    ::testing::Mock::$method(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n\n]]\n#endif  // GTEST_LANG_CXX11\n\n  ~$clazz() {\n    ::testing::Mock::UnregisterCallReaction(\n        internal::ImplicitCast_<MockClass*>(this));\n  }\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_($clazz);\n};\n\n]]\n\n// The following specializations catch some (relatively more common)\n// user errors of nesting nice and strict mocks.  They do NOT catch\n// all possible errors.\n\n// These specializations are declared but not defined, as NiceMock,\n// NaggyMock, and StrictMock cannot be nested.\n\ntemplate <typename MockClass>\nclass NiceMock<NiceMock<MockClass> >;\ntemplate <typename MockClass>\nclass NiceMock<NaggyMock<MockClass> >;\ntemplate <typename MockClass>\nclass NiceMock<StrictMock<MockClass> >;\n\ntemplate <typename MockClass>\nclass NaggyMock<NiceMock<MockClass> >;\ntemplate <typename MockClass>\nclass NaggyMock<NaggyMock<MockClass> >;\ntemplate <typename MockClass>\nclass NaggyMock<StrictMock<MockClass> >;\n\ntemplate <typename MockClass>\nclass StrictMock<NiceMock<MockClass> >;\ntemplate <typename MockClass>\nclass StrictMock<NaggyMock<MockClass> >;\ntemplate <typename MockClass>\nclass StrictMock<StrictMock<MockClass> >;\n\n}  // namespace testing\n\n#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/gmock-matchers.h",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements some commonly used argument matchers.  More\n// matchers can be defined by the user implementing the\n// MatcherInterface<T> interface if necessary.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_\n#define GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_\n\n#include <math.h>\n#include <algorithm>\n#include <iterator>\n#include <limits>\n#include <ostream>  // NOLINT\n#include <sstream>\n#include <string>\n#include <utility>\n#include <vector>\n#include \"gtest/gtest.h\"\n#include \"gmock/internal/gmock-internal-utils.h\"\n#include \"gmock/internal/gmock-port.h\"\n\n#if GTEST_HAS_STD_INITIALIZER_LIST_\n# include <initializer_list>  // NOLINT -- must be after gtest.h\n#endif\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(\n    4251 5046 /* class A needs to have dll-interface to be used by clients of\n                 class B */\n    /* Symbol involving type with internal linkage not defined */)\n\nnamespace testing {\n\n// To implement a matcher Foo for type T, define:\n//   1. a class FooMatcherImpl that implements the\n//      MatcherInterface<T> interface, and\n//   2. a factory function that creates a Matcher<T> object from a\n//      FooMatcherImpl*.\n//\n// The two-level delegation design makes it possible to allow a user\n// to write \"v\" instead of \"Eq(v)\" where a Matcher is expected, which\n// is impossible if we pass matchers by pointers.  It also eases\n// ownership management as Matcher objects can now be copied like\n// plain values.\n\n// MatchResultListener is an abstract class.  Its << operator can be\n// used by a matcher to explain why a value matches or doesn't match.\n//\n// FIXME: add method\n//   bool InterestedInWhy(bool result) const;\n// to indicate whether the listener is interested in why the match\n// result is 'result'.\nclass MatchResultListener {\n public:\n  // Creates a listener object with the given underlying ostream.  The\n  // listener does not own the ostream, and does not dereference it\n  // in the constructor or destructor.\n  explicit MatchResultListener(::std::ostream* os) : stream_(os) {}\n  virtual ~MatchResultListener() = 0;  // Makes this class abstract.\n\n  // Streams x to the underlying ostream; does nothing if the ostream\n  // is NULL.\n  template <typename T>\n  MatchResultListener& operator<<(const T& x) {\n    if (stream_ != NULL)\n      *stream_ << x;\n    return *this;\n  }\n\n  // Returns the underlying ostream.\n  ::std::ostream* stream() { return stream_; }\n\n  // Returns true iff the listener is interested in an explanation of\n  // the match result.  A matcher's MatchAndExplain() method can use\n  // this information to avoid generating the explanation when no one\n  // intends to hear it.\n  bool IsInterested() const { return stream_ != NULL; }\n\n private:\n  ::std::ostream* const stream_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener);\n};\n\ninline MatchResultListener::~MatchResultListener() {\n}\n\n// An instance of a subclass of this knows how to describe itself as a\n// matcher.\nclass MatcherDescriberInterface {\n public:\n  virtual ~MatcherDescriberInterface() {}\n\n  // Describes this matcher to an ostream.  The function should print\n  // a verb phrase that describes the property a value matching this\n  // matcher should have.  The subject of the verb phrase is the value\n  // being matched.  For example, the DescribeTo() method of the Gt(7)\n  // matcher prints \"is greater than 7\".\n  virtual void DescribeTo(::std::ostream* os) const = 0;\n\n  // Describes the negation of this matcher to an ostream.  For\n  // example, if the description of this matcher is \"is greater than\n  // 7\", the negated description could be \"is not greater than 7\".\n  // You are not required to override this when implementing\n  // MatcherInterface, but it is highly advised so that your matcher\n  // can produce good error messages.\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"not (\";\n    DescribeTo(os);\n    *os << \")\";\n  }\n};\n\n// The implementation of a matcher.\ntemplate <typename T>\nclass MatcherInterface : public MatcherDescriberInterface {\n public:\n  // Returns true iff the matcher matches x; also explains the match\n  // result to 'listener' if necessary (see the next paragraph), in\n  // the form of a non-restrictive relative clause (\"which ...\",\n  // \"whose ...\", etc) that describes x.  For example, the\n  // MatchAndExplain() method of the Pointee(...) matcher should\n  // generate an explanation like \"which points to ...\".\n  //\n  // Implementations of MatchAndExplain() should add an explanation of\n  // the match result *if and only if* they can provide additional\n  // information that's not already present (or not obvious) in the\n  // print-out of x and the matcher's description.  Whether the match\n  // succeeds is not a factor in deciding whether an explanation is\n  // needed, as sometimes the caller needs to print a failure message\n  // when the match succeeds (e.g. when the matcher is used inside\n  // Not()).\n  //\n  // For example, a \"has at least 10 elements\" matcher should explain\n  // what the actual element count is, regardless of the match result,\n  // as it is useful information to the reader; on the other hand, an\n  // \"is empty\" matcher probably only needs to explain what the actual\n  // size is when the match fails, as it's redundant to say that the\n  // size is 0 when the value is already known to be empty.\n  //\n  // You should override this method when defining a new matcher.\n  //\n  // It's the responsibility of the caller (Google Mock) to guarantee\n  // that 'listener' is not NULL.  This helps to simplify a matcher's\n  // implementation when it doesn't care about the performance, as it\n  // can talk to 'listener' without checking its validity first.\n  // However, in order to implement dummy listeners efficiently,\n  // listener->stream() may be NULL.\n  virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0;\n\n  // Inherits these methods from MatcherDescriberInterface:\n  //   virtual void DescribeTo(::std::ostream* os) const = 0;\n  //   virtual void DescribeNegationTo(::std::ostream* os) const;\n};\n\nnamespace internal {\n\n// Converts a MatcherInterface<T> to a MatcherInterface<const T&>.\ntemplate <typename T>\nclass MatcherInterfaceAdapter : public MatcherInterface<const T&> {\n public:\n  explicit MatcherInterfaceAdapter(const MatcherInterface<T>* impl)\n      : impl_(impl) {}\n  virtual ~MatcherInterfaceAdapter() { delete impl_; }\n\n  virtual void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); }\n\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    impl_->DescribeNegationTo(os);\n  }\n\n  virtual bool MatchAndExplain(const T& x,\n                               MatchResultListener* listener) const {\n    return impl_->MatchAndExplain(x, listener);\n  }\n\n private:\n  const MatcherInterface<T>* const impl_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MatcherInterfaceAdapter);\n};\n\n}  // namespace internal\n\n// A match result listener that stores the explanation in a string.\nclass StringMatchResultListener : public MatchResultListener {\n public:\n  StringMatchResultListener() : MatchResultListener(&ss_) {}\n\n  // Returns the explanation accumulated so far.\n  std::string str() const { return ss_.str(); }\n\n  // Clears the explanation accumulated so far.\n  void Clear() { ss_.str(\"\"); }\n\n private:\n  ::std::stringstream ss_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener);\n};\n\nnamespace internal {\n\nstruct AnyEq {\n  template <typename A, typename B>\n  bool operator()(const A& a, const B& b) const { return a == b; }\n};\nstruct AnyNe {\n  template <typename A, typename B>\n  bool operator()(const A& a, const B& b) const { return a != b; }\n};\nstruct AnyLt {\n  template <typename A, typename B>\n  bool operator()(const A& a, const B& b) const { return a < b; }\n};\nstruct AnyGt {\n  template <typename A, typename B>\n  bool operator()(const A& a, const B& b) const { return a > b; }\n};\nstruct AnyLe {\n  template <typename A, typename B>\n  bool operator()(const A& a, const B& b) const { return a <= b; }\n};\nstruct AnyGe {\n  template <typename A, typename B>\n  bool operator()(const A& a, const B& b) const { return a >= b; }\n};\n\n// A match result listener that ignores the explanation.\nclass DummyMatchResultListener : public MatchResultListener {\n public:\n  DummyMatchResultListener() : MatchResultListener(NULL) {}\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener);\n};\n\n// A match result listener that forwards the explanation to a given\n// ostream.  The difference between this and MatchResultListener is\n// that the former is concrete.\nclass StreamMatchResultListener : public MatchResultListener {\n public:\n  explicit StreamMatchResultListener(::std::ostream* os)\n      : MatchResultListener(os) {}\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener);\n};\n\n// An internal class for implementing Matcher<T>, which will derive\n// from it.  We put functionalities common to all Matcher<T>\n// specializations here to avoid code duplication.\ntemplate <typename T>\nclass MatcherBase {\n public:\n  // Returns true iff the matcher matches x; also explains the match\n  // result to 'listener'.\n  bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x,\n                       MatchResultListener* listener) const {\n    return impl_->MatchAndExplain(x, listener);\n  }\n\n  // Returns true iff this matcher matches x.\n  bool Matches(GTEST_REFERENCE_TO_CONST_(T) x) const {\n    DummyMatchResultListener dummy;\n    return MatchAndExplain(x, &dummy);\n  }\n\n  // Describes this matcher to an ostream.\n  void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); }\n\n  // Describes the negation of this matcher to an ostream.\n  void DescribeNegationTo(::std::ostream* os) const {\n    impl_->DescribeNegationTo(os);\n  }\n\n  // Explains why x matches, or doesn't match, the matcher.\n  void ExplainMatchResultTo(GTEST_REFERENCE_TO_CONST_(T) x,\n                            ::std::ostream* os) const {\n    StreamMatchResultListener listener(os);\n    MatchAndExplain(x, &listener);\n  }\n\n  // Returns the describer for this matcher object; retains ownership\n  // of the describer, which is only guaranteed to be alive when\n  // this matcher object is alive.\n  const MatcherDescriberInterface* GetDescriber() const {\n    return impl_.get();\n  }\n\n protected:\n  MatcherBase() {}\n\n  // Constructs a matcher from its implementation.\n  explicit MatcherBase(\n      const MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)>* impl)\n      : impl_(impl) {}\n\n  template <typename U>\n  explicit MatcherBase(\n      const MatcherInterface<U>* impl,\n      typename internal::EnableIf<\n          !internal::IsSame<U, GTEST_REFERENCE_TO_CONST_(U)>::value>::type* =\n          NULL)\n      : impl_(new internal::MatcherInterfaceAdapter<U>(impl)) {}\n\n  virtual ~MatcherBase() {}\n\n private:\n  // shared_ptr (util/gtl/shared_ptr.h) and linked_ptr have similar\n  // interfaces.  The former dynamically allocates a chunk of memory\n  // to hold the reference count, while the latter tracks all\n  // references using a circular linked list without allocating\n  // memory.  It has been observed that linked_ptr performs better in\n  // typical scenarios.  However, shared_ptr can out-perform\n  // linked_ptr when there are many more uses of the copy constructor\n  // than the default constructor.\n  //\n  // If performance becomes a problem, we should see if using\n  // shared_ptr helps.\n  ::testing::internal::linked_ptr<\n      const MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> >\n      impl_;\n};\n\n}  // namespace internal\n\n// A Matcher<T> is a copyable and IMMUTABLE (except by assignment)\n// object that can check whether a value of type T matches.  The\n// implementation of Matcher<T> is just a linked_ptr to const\n// MatcherInterface<T>, so copying is fairly cheap.  Don't inherit\n// from Matcher!\ntemplate <typename T>\nclass Matcher : public internal::MatcherBase<T> {\n public:\n  // Constructs a null matcher.  Needed for storing Matcher objects in STL\n  // containers.  A default-constructed matcher is not yet initialized.  You\n  // cannot use it until a valid value has been assigned to it.\n  explicit Matcher() {}  // NOLINT\n\n  // Constructs a matcher from its implementation.\n  explicit Matcher(const MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)>* impl)\n      : internal::MatcherBase<T>(impl) {}\n\n  template <typename U>\n  explicit Matcher(const MatcherInterface<U>* impl,\n                   typename internal::EnableIf<!internal::IsSame<\n                       U, GTEST_REFERENCE_TO_CONST_(U)>::value>::type* = NULL)\n      : internal::MatcherBase<T>(impl) {}\n\n  // Implicit constructor here allows people to write\n  // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes\n  Matcher(T value);  // NOLINT\n};\n\n// The following two specializations allow the user to write str\n// instead of Eq(str) and \"foo\" instead of Eq(\"foo\") when a std::string\n// matcher is expected.\ntemplate <>\nclass GTEST_API_ Matcher<const std::string&>\n    : public internal::MatcherBase<const std::string&> {\n public:\n  Matcher() {}\n\n  explicit Matcher(const MatcherInterface<const std::string&>* impl)\n      : internal::MatcherBase<const std::string&>(impl) {}\n\n  // Allows the user to write str instead of Eq(str) sometimes, where\n  // str is a std::string object.\n  Matcher(const std::string& s);  // NOLINT\n\n#if GTEST_HAS_GLOBAL_STRING\n  // Allows the user to write str instead of Eq(str) sometimes, where\n  // str is a ::string object.\n  Matcher(const ::string& s);  // NOLINT\n#endif                         // GTEST_HAS_GLOBAL_STRING\n\n  // Allows the user to write \"foo\" instead of Eq(\"foo\") sometimes.\n  Matcher(const char* s);  // NOLINT\n};\n\ntemplate <>\nclass GTEST_API_ Matcher<std::string>\n    : public internal::MatcherBase<std::string> {\n public:\n  Matcher() {}\n\n  explicit Matcher(const MatcherInterface<const std::string&>* impl)\n      : internal::MatcherBase<std::string>(impl) {}\n  explicit Matcher(const MatcherInterface<std::string>* impl)\n      : internal::MatcherBase<std::string>(impl) {}\n\n  // Allows the user to write str instead of Eq(str) sometimes, where\n  // str is a string object.\n  Matcher(const std::string& s);  // NOLINT\n\n#if GTEST_HAS_GLOBAL_STRING\n  // Allows the user to write str instead of Eq(str) sometimes, where\n  // str is a ::string object.\n  Matcher(const ::string& s);  // NOLINT\n#endif                         // GTEST_HAS_GLOBAL_STRING\n\n  // Allows the user to write \"foo\" instead of Eq(\"foo\") sometimes.\n  Matcher(const char* s);  // NOLINT\n};\n\n#if GTEST_HAS_GLOBAL_STRING\n// The following two specializations allow the user to write str\n// instead of Eq(str) and \"foo\" instead of Eq(\"foo\") when a ::string\n// matcher is expected.\ntemplate <>\nclass GTEST_API_ Matcher<const ::string&>\n    : public internal::MatcherBase<const ::string&> {\n public:\n  Matcher() {}\n\n  explicit Matcher(const MatcherInterface<const ::string&>* impl)\n      : internal::MatcherBase<const ::string&>(impl) {}\n\n  // Allows the user to write str instead of Eq(str) sometimes, where\n  // str is a std::string object.\n  Matcher(const std::string& s);  // NOLINT\n\n  // Allows the user to write str instead of Eq(str) sometimes, where\n  // str is a ::string object.\n  Matcher(const ::string& s);  // NOLINT\n\n  // Allows the user to write \"foo\" instead of Eq(\"foo\") sometimes.\n  Matcher(const char* s);  // NOLINT\n};\n\ntemplate <>\nclass GTEST_API_ Matcher< ::string>\n    : public internal::MatcherBase< ::string> {\n public:\n  Matcher() {}\n\n  explicit Matcher(const MatcherInterface<const ::string&>* impl)\n      : internal::MatcherBase< ::string>(impl) {}\n  explicit Matcher(const MatcherInterface< ::string>* impl)\n      : internal::MatcherBase< ::string>(impl) {}\n\n  // Allows the user to write str instead of Eq(str) sometimes, where\n  // str is a std::string object.\n  Matcher(const std::string& s);  // NOLINT\n\n  // Allows the user to write str instead of Eq(str) sometimes, where\n  // str is a ::string object.\n  Matcher(const ::string& s);  // NOLINT\n\n  // Allows the user to write \"foo\" instead of Eq(\"foo\") sometimes.\n  Matcher(const char* s);  // NOLINT\n};\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n#if GTEST_HAS_ABSL\n// The following two specializations allow the user to write str\n// instead of Eq(str) and \"foo\" instead of Eq(\"foo\") when a absl::string_view\n// matcher is expected.\ntemplate <>\nclass GTEST_API_ Matcher<const absl::string_view&>\n    : public internal::MatcherBase<const absl::string_view&> {\n public:\n  Matcher() {}\n\n  explicit Matcher(const MatcherInterface<const absl::string_view&>* impl)\n      : internal::MatcherBase<const absl::string_view&>(impl) {}\n\n  // Allows the user to write str instead of Eq(str) sometimes, where\n  // str is a std::string object.\n  Matcher(const std::string& s);  // NOLINT\n\n#if GTEST_HAS_GLOBAL_STRING\n  // Allows the user to write str instead of Eq(str) sometimes, where\n  // str is a ::string object.\n  Matcher(const ::string& s);  // NOLINT\n#endif                         // GTEST_HAS_GLOBAL_STRING\n\n  // Allows the user to write \"foo\" instead of Eq(\"foo\") sometimes.\n  Matcher(const char* s);  // NOLINT\n\n  // Allows the user to pass absl::string_views directly.\n  Matcher(absl::string_view s);  // NOLINT\n};\n\ntemplate <>\nclass GTEST_API_ Matcher<absl::string_view>\n    : public internal::MatcherBase<absl::string_view> {\n public:\n  Matcher() {}\n\n  explicit Matcher(const MatcherInterface<const absl::string_view&>* impl)\n      : internal::MatcherBase<absl::string_view>(impl) {}\n  explicit Matcher(const MatcherInterface<absl::string_view>* impl)\n      : internal::MatcherBase<absl::string_view>(impl) {}\n\n  // Allows the user to write str instead of Eq(str) sometimes, where\n  // str is a std::string object.\n  Matcher(const std::string& s);  // NOLINT\n\n#if GTEST_HAS_GLOBAL_STRING\n  // Allows the user to write str instead of Eq(str) sometimes, where\n  // str is a ::string object.\n  Matcher(const ::string& s);  // NOLINT\n#endif                         // GTEST_HAS_GLOBAL_STRING\n\n  // Allows the user to write \"foo\" instead of Eq(\"foo\") sometimes.\n  Matcher(const char* s);  // NOLINT\n\n  // Allows the user to pass absl::string_views directly.\n  Matcher(absl::string_view s);  // NOLINT\n};\n#endif  // GTEST_HAS_ABSL\n\n// Prints a matcher in a human-readable format.\ntemplate <typename T>\nstd::ostream& operator<<(std::ostream& os, const Matcher<T>& matcher) {\n  matcher.DescribeTo(&os);\n  return os;\n}\n\n// The PolymorphicMatcher class template makes it easy to implement a\n// polymorphic matcher (i.e. a matcher that can match values of more\n// than one type, e.g. Eq(n) and NotNull()).\n//\n// To define a polymorphic matcher, a user should provide an Impl\n// class that has a DescribeTo() method and a DescribeNegationTo()\n// method, and define a member function (or member function template)\n//\n//   bool MatchAndExplain(const Value& value,\n//                        MatchResultListener* listener) const;\n//\n// See the definition of NotNull() for a complete example.\ntemplate <class Impl>\nclass PolymorphicMatcher {\n public:\n  explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {}\n\n  // Returns a mutable reference to the underlying matcher\n  // implementation object.\n  Impl& mutable_impl() { return impl_; }\n\n  // Returns an immutable reference to the underlying matcher\n  // implementation object.\n  const Impl& impl() const { return impl_; }\n\n  template <typename T>\n  operator Matcher<T>() const {\n    return Matcher<T>(new MonomorphicImpl<GTEST_REFERENCE_TO_CONST_(T)>(impl_));\n  }\n\n private:\n  template <typename T>\n  class MonomorphicImpl : public MatcherInterface<T> {\n   public:\n    explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}\n\n    virtual void DescribeTo(::std::ostream* os) const {\n      impl_.DescribeTo(os);\n    }\n\n    virtual void DescribeNegationTo(::std::ostream* os) const {\n      impl_.DescribeNegationTo(os);\n    }\n\n    virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {\n      return impl_.MatchAndExplain(x, listener);\n    }\n\n   private:\n    const Impl impl_;\n\n    GTEST_DISALLOW_ASSIGN_(MonomorphicImpl);\n  };\n\n  Impl impl_;\n\n  GTEST_DISALLOW_ASSIGN_(PolymorphicMatcher);\n};\n\n// Creates a matcher from its implementation.  This is easier to use\n// than the Matcher<T> constructor as it doesn't require you to\n// explicitly write the template argument, e.g.\n//\n//   MakeMatcher(foo);\n// vs\n//   Matcher<const string&>(foo);\ntemplate <typename T>\ninline Matcher<T> MakeMatcher(const MatcherInterface<T>* impl) {\n  return Matcher<T>(impl);\n}\n\n// Creates a polymorphic matcher from its implementation.  This is\n// easier to use than the PolymorphicMatcher<Impl> constructor as it\n// doesn't require you to explicitly write the template argument, e.g.\n//\n//   MakePolymorphicMatcher(foo);\n// vs\n//   PolymorphicMatcher<TypeOfFoo>(foo);\ntemplate <class Impl>\ninline PolymorphicMatcher<Impl> MakePolymorphicMatcher(const Impl& impl) {\n  return PolymorphicMatcher<Impl>(impl);\n}\n\n// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION\n// and MUST NOT BE USED IN USER CODE!!!\nnamespace internal {\n\n// The MatcherCastImpl class template is a helper for implementing\n// MatcherCast().  We need this helper in order to partially\n// specialize the implementation of MatcherCast() (C++ allows\n// class/struct templates to be partially specialized, but not\n// function templates.).\n\n// This general version is used when MatcherCast()'s argument is a\n// polymorphic matcher (i.e. something that can be converted to a\n// Matcher but is not one yet; for example, Eq(value)) or a value (for\n// example, \"hello\").\ntemplate <typename T, typename M>\nclass MatcherCastImpl {\n public:\n  static Matcher<T> Cast(const M& polymorphic_matcher_or_value) {\n    // M can be a polymorphic matcher, in which case we want to use\n    // its conversion operator to create Matcher<T>.  Or it can be a value\n    // that should be passed to the Matcher<T>'s constructor.\n    //\n    // We can't call Matcher<T>(polymorphic_matcher_or_value) when M is a\n    // polymorphic matcher because it'll be ambiguous if T has an implicit\n    // constructor from M (this usually happens when T has an implicit\n    // constructor from any type).\n    //\n    // It won't work to unconditionally implict_cast\n    // polymorphic_matcher_or_value to Matcher<T> because it won't trigger\n    // a user-defined conversion from M to T if one exists (assuming M is\n    // a value).\n    return CastImpl(\n        polymorphic_matcher_or_value,\n        BooleanConstant<\n            internal::ImplicitlyConvertible<M, Matcher<T> >::value>(),\n        BooleanConstant<\n            internal::ImplicitlyConvertible<M, T>::value>());\n  }\n\n private:\n  template <bool Ignore>\n  static Matcher<T> CastImpl(const M& polymorphic_matcher_or_value,\n                             BooleanConstant<true> /* convertible_to_matcher */,\n                             BooleanConstant<Ignore>) {\n    // M is implicitly convertible to Matcher<T>, which means that either\n    // M is a polymorphic matcher or Matcher<T> has an implicit constructor\n    // from M.  In both cases using the implicit conversion will produce a\n    // matcher.\n    //\n    // Even if T has an implicit constructor from M, it won't be called because\n    // creating Matcher<T> would require a chain of two user-defined conversions\n    // (first to create T from M and then to create Matcher<T> from T).\n    return polymorphic_matcher_or_value;\n  }\n\n  // M can't be implicitly converted to Matcher<T>, so M isn't a polymorphic\n  // matcher. It's a value of a type implicitly convertible to T. Use direct\n  // initialization to create a matcher.\n  static Matcher<T> CastImpl(\n      const M& value, BooleanConstant<false> /* convertible_to_matcher */,\n      BooleanConstant<true> /* convertible_to_T */) {\n    return Matcher<T>(ImplicitCast_<T>(value));\n  }\n\n  // M can't be implicitly converted to either Matcher<T> or T. Attempt to use\n  // polymorphic matcher Eq(value) in this case.\n  //\n  // Note that we first attempt to perform an implicit cast on the value and\n  // only fall back to the polymorphic Eq() matcher afterwards because the\n  // latter calls bool operator==(const Lhs& lhs, const Rhs& rhs) in the end\n  // which might be undefined even when Rhs is implicitly convertible to Lhs\n  // (e.g. std::pair<const int, int> vs. std::pair<int, int>).\n  //\n  // We don't define this method inline as we need the declaration of Eq().\n  static Matcher<T> CastImpl(\n      const M& value, BooleanConstant<false> /* convertible_to_matcher */,\n      BooleanConstant<false> /* convertible_to_T */);\n};\n\n// This more specialized version is used when MatcherCast()'s argument\n// is already a Matcher.  This only compiles when type T can be\n// statically converted to type U.\ntemplate <typename T, typename U>\nclass MatcherCastImpl<T, Matcher<U> > {\n public:\n  static Matcher<T> Cast(const Matcher<U>& source_matcher) {\n    return Matcher<T>(new Impl(source_matcher));\n  }\n\n private:\n  class Impl : public MatcherInterface<T> {\n   public:\n    explicit Impl(const Matcher<U>& source_matcher)\n        : source_matcher_(source_matcher) {}\n\n    // We delegate the matching logic to the source matcher.\n    virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {\n#if GTEST_LANG_CXX11\n      using FromType = typename std::remove_cv<typename std::remove_pointer<\n          typename std::remove_reference<T>::type>::type>::type;\n      using ToType = typename std::remove_cv<typename std::remove_pointer<\n          typename std::remove_reference<U>::type>::type>::type;\n      // Do not allow implicitly converting base*/& to derived*/&.\n      static_assert(\n          // Do not trigger if only one of them is a pointer. That implies a\n          // regular conversion and not a down_cast.\n          (std::is_pointer<typename std::remove_reference<T>::type>::value !=\n           std::is_pointer<typename std::remove_reference<U>::type>::value) ||\n              std::is_same<FromType, ToType>::value ||\n              !std::is_base_of<FromType, ToType>::value,\n          \"Can't implicitly convert from <base> to <derived>\");\n#endif  // GTEST_LANG_CXX11\n\n      return source_matcher_.MatchAndExplain(static_cast<U>(x), listener);\n    }\n\n    virtual void DescribeTo(::std::ostream* os) const {\n      source_matcher_.DescribeTo(os);\n    }\n\n    virtual void DescribeNegationTo(::std::ostream* os) const {\n      source_matcher_.DescribeNegationTo(os);\n    }\n\n   private:\n    const Matcher<U> source_matcher_;\n\n    GTEST_DISALLOW_ASSIGN_(Impl);\n  };\n};\n\n// This even more specialized version is used for efficiently casting\n// a matcher to its own type.\ntemplate <typename T>\nclass MatcherCastImpl<T, Matcher<T> > {\n public:\n  static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; }\n};\n\n}  // namespace internal\n\n// In order to be safe and clear, casting between different matcher\n// types is done explicitly via MatcherCast<T>(m), which takes a\n// matcher m and returns a Matcher<T>.  It compiles only when T can be\n// statically converted to the argument type of m.\ntemplate <typename T, typename M>\ninline Matcher<T> MatcherCast(const M& matcher) {\n  return internal::MatcherCastImpl<T, M>::Cast(matcher);\n}\n\n// Implements SafeMatcherCast().\n//\n// We use an intermediate class to do the actual safe casting as Nokia's\n// Symbian compiler cannot decide between\n// template <T, M> ... (M) and\n// template <T, U> ... (const Matcher<U>&)\n// for function templates but can for member function templates.\ntemplate <typename T>\nclass SafeMatcherCastImpl {\n public:\n  // This overload handles polymorphic matchers and values only since\n  // monomorphic matchers are handled by the next one.\n  template <typename M>\n  static inline Matcher<T> Cast(const M& polymorphic_matcher_or_value) {\n    return internal::MatcherCastImpl<T, M>::Cast(polymorphic_matcher_or_value);\n  }\n\n  // This overload handles monomorphic matchers.\n  //\n  // In general, if type T can be implicitly converted to type U, we can\n  // safely convert a Matcher<U> to a Matcher<T> (i.e. Matcher is\n  // contravariant): just keep a copy of the original Matcher<U>, convert the\n  // argument from type T to U, and then pass it to the underlying Matcher<U>.\n  // The only exception is when U is a reference and T is not, as the\n  // underlying Matcher<U> may be interested in the argument's address, which\n  // is not preserved in the conversion from T to U.\n  template <typename U>\n  static inline Matcher<T> Cast(const Matcher<U>& matcher) {\n    // Enforce that T can be implicitly converted to U.\n    GTEST_COMPILE_ASSERT_((internal::ImplicitlyConvertible<T, U>::value),\n                          T_must_be_implicitly_convertible_to_U);\n    // Enforce that we are not converting a non-reference type T to a reference\n    // type U.\n    GTEST_COMPILE_ASSERT_(\n        internal::is_reference<T>::value || !internal::is_reference<U>::value,\n        cannot_convert_non_reference_arg_to_reference);\n    // In case both T and U are arithmetic types, enforce that the\n    // conversion is not lossy.\n    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(T) RawT;\n    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(U) RawU;\n    const bool kTIsOther = GMOCK_KIND_OF_(RawT) == internal::kOther;\n    const bool kUIsOther = GMOCK_KIND_OF_(RawU) == internal::kOther;\n    GTEST_COMPILE_ASSERT_(\n        kTIsOther || kUIsOther ||\n        (internal::LosslessArithmeticConvertible<RawT, RawU>::value),\n        conversion_of_arithmetic_types_must_be_lossless);\n    return MatcherCast<T>(matcher);\n  }\n};\n\ntemplate <typename T, typename M>\ninline Matcher<T> SafeMatcherCast(const M& polymorphic_matcher) {\n  return SafeMatcherCastImpl<T>::Cast(polymorphic_matcher);\n}\n\n// A<T>() returns a matcher that matches any value of type T.\ntemplate <typename T>\nMatcher<T> A();\n\n// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION\n// and MUST NOT BE USED IN USER CODE!!!\nnamespace internal {\n\n// If the explanation is not empty, prints it to the ostream.\ninline void PrintIfNotEmpty(const std::string& explanation,\n                            ::std::ostream* os) {\n  if (explanation != \"\" && os != NULL) {\n    *os << \", \" << explanation;\n  }\n}\n\n// Returns true if the given type name is easy to read by a human.\n// This is used to decide whether printing the type of a value might\n// be helpful.\ninline bool IsReadableTypeName(const std::string& type_name) {\n  // We consider a type name readable if it's short or doesn't contain\n  // a template or function type.\n  return (type_name.length() <= 20 ||\n          type_name.find_first_of(\"<(\") == std::string::npos);\n}\n\n// Matches the value against the given matcher, prints the value and explains\n// the match result to the listener. Returns the match result.\n// 'listener' must not be NULL.\n// Value cannot be passed by const reference, because some matchers take a\n// non-const argument.\ntemplate <typename Value, typename T>\nbool MatchPrintAndExplain(Value& value, const Matcher<T>& matcher,\n                          MatchResultListener* listener) {\n  if (!listener->IsInterested()) {\n    // If the listener is not interested, we do not need to construct the\n    // inner explanation.\n    return matcher.Matches(value);\n  }\n\n  StringMatchResultListener inner_listener;\n  const bool match = matcher.MatchAndExplain(value, &inner_listener);\n\n  UniversalPrint(value, listener->stream());\n#if GTEST_HAS_RTTI\n  const std::string& type_name = GetTypeName<Value>();\n  if (IsReadableTypeName(type_name))\n    *listener->stream() << \" (of type \" << type_name << \")\";\n#endif\n  PrintIfNotEmpty(inner_listener.str(), listener->stream());\n\n  return match;\n}\n\n// An internal helper class for doing compile-time loop on a tuple's\n// fields.\ntemplate <size_t N>\nclass TuplePrefix {\n public:\n  // TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true\n  // iff the first N fields of matcher_tuple matches the first N\n  // fields of value_tuple, respectively.\n  template <typename MatcherTuple, typename ValueTuple>\n  static bool Matches(const MatcherTuple& matcher_tuple,\n                      const ValueTuple& value_tuple) {\n    return TuplePrefix<N - 1>::Matches(matcher_tuple, value_tuple)\n        && get<N - 1>(matcher_tuple).Matches(get<N - 1>(value_tuple));\n  }\n\n  // TuplePrefix<N>::ExplainMatchFailuresTo(matchers, values, os)\n  // describes failures in matching the first N fields of matchers\n  // against the first N fields of values.  If there is no failure,\n  // nothing will be streamed to os.\n  template <typename MatcherTuple, typename ValueTuple>\n  static void ExplainMatchFailuresTo(const MatcherTuple& matchers,\n                                     const ValueTuple& values,\n                                     ::std::ostream* os) {\n    // First, describes failures in the first N - 1 fields.\n    TuplePrefix<N - 1>::ExplainMatchFailuresTo(matchers, values, os);\n\n    // Then describes the failure (if any) in the (N - 1)-th (0-based)\n    // field.\n    typename tuple_element<N - 1, MatcherTuple>::type matcher =\n        get<N - 1>(matchers);\n    typedef typename tuple_element<N - 1, ValueTuple>::type Value;\n    GTEST_REFERENCE_TO_CONST_(Value) value = get<N - 1>(values);\n    StringMatchResultListener listener;\n    if (!matcher.MatchAndExplain(value, &listener)) {\n      // FIXME: include in the message the name of the parameter\n      // as used in MOCK_METHOD*() when possible.\n      *os << \"  Expected arg #\" << N - 1 << \": \";\n      get<N - 1>(matchers).DescribeTo(os);\n      *os << \"\\n           Actual: \";\n      // We remove the reference in type Value to prevent the\n      // universal printer from printing the address of value, which\n      // isn't interesting to the user most of the time.  The\n      // matcher's MatchAndExplain() method handles the case when\n      // the address is interesting.\n      internal::UniversalPrint(value, os);\n      PrintIfNotEmpty(listener.str(), os);\n      *os << \"\\n\";\n    }\n  }\n};\n\n// The base case.\ntemplate <>\nclass TuplePrefix<0> {\n public:\n  template <typename MatcherTuple, typename ValueTuple>\n  static bool Matches(const MatcherTuple& /* matcher_tuple */,\n                      const ValueTuple& /* value_tuple */) {\n    return true;\n  }\n\n  template <typename MatcherTuple, typename ValueTuple>\n  static void ExplainMatchFailuresTo(const MatcherTuple& /* matchers */,\n                                     const ValueTuple& /* values */,\n                                     ::std::ostream* /* os */) {}\n};\n\n// TupleMatches(matcher_tuple, value_tuple) returns true iff all\n// matchers in matcher_tuple match the corresponding fields in\n// value_tuple.  It is a compiler error if matcher_tuple and\n// value_tuple have different number of fields or incompatible field\n// types.\ntemplate <typename MatcherTuple, typename ValueTuple>\nbool TupleMatches(const MatcherTuple& matcher_tuple,\n                  const ValueTuple& value_tuple) {\n  // Makes sure that matcher_tuple and value_tuple have the same\n  // number of fields.\n  GTEST_COMPILE_ASSERT_(tuple_size<MatcherTuple>::value ==\n                        tuple_size<ValueTuple>::value,\n                        matcher_and_value_have_different_numbers_of_fields);\n  return TuplePrefix<tuple_size<ValueTuple>::value>::\n      Matches(matcher_tuple, value_tuple);\n}\n\n// Describes failures in matching matchers against values.  If there\n// is no failure, nothing will be streamed to os.\ntemplate <typename MatcherTuple, typename ValueTuple>\nvoid ExplainMatchFailureTupleTo(const MatcherTuple& matchers,\n                                const ValueTuple& values,\n                                ::std::ostream* os) {\n  TuplePrefix<tuple_size<MatcherTuple>::value>::ExplainMatchFailuresTo(\n      matchers, values, os);\n}\n\n// TransformTupleValues and its helper.\n//\n// TransformTupleValuesHelper hides the internal machinery that\n// TransformTupleValues uses to implement a tuple traversal.\ntemplate <typename Tuple, typename Func, typename OutIter>\nclass TransformTupleValuesHelper {\n private:\n  typedef ::testing::tuple_size<Tuple> TupleSize;\n\n public:\n  // For each member of tuple 't', taken in order, evaluates '*out++ = f(t)'.\n  // Returns the final value of 'out' in case the caller needs it.\n  static OutIter Run(Func f, const Tuple& t, OutIter out) {\n    return IterateOverTuple<Tuple, TupleSize::value>()(f, t, out);\n  }\n\n private:\n  template <typename Tup, size_t kRemainingSize>\n  struct IterateOverTuple {\n    OutIter operator() (Func f, const Tup& t, OutIter out) const {\n      *out++ = f(::testing::get<TupleSize::value - kRemainingSize>(t));\n      return IterateOverTuple<Tup, kRemainingSize - 1>()(f, t, out);\n    }\n  };\n  template <typename Tup>\n  struct IterateOverTuple<Tup, 0> {\n    OutIter operator() (Func /* f */, const Tup& /* t */, OutIter out) const {\n      return out;\n    }\n  };\n};\n\n// Successively invokes 'f(element)' on each element of the tuple 't',\n// appending each result to the 'out' iterator. Returns the final value\n// of 'out'.\ntemplate <typename Tuple, typename Func, typename OutIter>\nOutIter TransformTupleValues(Func f, const Tuple& t, OutIter out) {\n  return TransformTupleValuesHelper<Tuple, Func, OutIter>::Run(f, t, out);\n}\n\n// Implements A<T>().\ntemplate <typename T>\nclass AnyMatcherImpl : public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> {\n public:\n  virtual bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) /* x */,\n                               MatchResultListener* /* listener */) const {\n    return true;\n  }\n  virtual void DescribeTo(::std::ostream* os) const { *os << \"is anything\"; }\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    // This is mostly for completeness' safe, as it's not very useful\n    // to write Not(A<bool>()).  However we cannot completely rule out\n    // such a possibility, and it doesn't hurt to be prepared.\n    *os << \"never matches\";\n  }\n};\n\n// Implements _, a matcher that matches any value of any\n// type.  This is a polymorphic matcher, so we need a template type\n// conversion operator to make it appearing as a Matcher<T> for any\n// type T.\nclass AnythingMatcher {\n public:\n  template <typename T>\n  operator Matcher<T>() const { return A<T>(); }\n};\n\n// Implements a matcher that compares a given value with a\n// pre-supplied value using one of the ==, <=, <, etc, operators.  The\n// two values being compared don't have to have the same type.\n//\n// The matcher defined here is polymorphic (for example, Eq(5) can be\n// used to match an int, a short, a double, etc).  Therefore we use\n// a template type conversion operator in the implementation.\n//\n// The following template definition assumes that the Rhs parameter is\n// a \"bare\" type (i.e. neither 'const T' nor 'T&').\ntemplate <typename D, typename Rhs, typename Op>\nclass ComparisonBase {\n public:\n  explicit ComparisonBase(const Rhs& rhs) : rhs_(rhs) {}\n  template <typename Lhs>\n  operator Matcher<Lhs>() const {\n    return MakeMatcher(new Impl<Lhs>(rhs_));\n  }\n\n private:\n  template <typename Lhs>\n  class Impl : public MatcherInterface<Lhs> {\n   public:\n    explicit Impl(const Rhs& rhs) : rhs_(rhs) {}\n    virtual bool MatchAndExplain(\n        Lhs lhs, MatchResultListener* /* listener */) const {\n      return Op()(lhs, rhs_);\n    }\n    virtual void DescribeTo(::std::ostream* os) const {\n      *os << D::Desc() << \" \";\n      UniversalPrint(rhs_, os);\n    }\n    virtual void DescribeNegationTo(::std::ostream* os) const {\n      *os << D::NegatedDesc() <<  \" \";\n      UniversalPrint(rhs_, os);\n    }\n   private:\n    Rhs rhs_;\n    GTEST_DISALLOW_ASSIGN_(Impl);\n  };\n  Rhs rhs_;\n  GTEST_DISALLOW_ASSIGN_(ComparisonBase);\n};\n\ntemplate <typename Rhs>\nclass EqMatcher : public ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq> {\n public:\n  explicit EqMatcher(const Rhs& rhs)\n      : ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq>(rhs) { }\n  static const char* Desc() { return \"is equal to\"; }\n  static const char* NegatedDesc() { return \"isn't equal to\"; }\n};\ntemplate <typename Rhs>\nclass NeMatcher : public ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe> {\n public:\n  explicit NeMatcher(const Rhs& rhs)\n      : ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe>(rhs) { }\n  static const char* Desc() { return \"isn't equal to\"; }\n  static const char* NegatedDesc() { return \"is equal to\"; }\n};\ntemplate <typename Rhs>\nclass LtMatcher : public ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt> {\n public:\n  explicit LtMatcher(const Rhs& rhs)\n      : ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt>(rhs) { }\n  static const char* Desc() { return \"is <\"; }\n  static const char* NegatedDesc() { return \"isn't <\"; }\n};\ntemplate <typename Rhs>\nclass GtMatcher : public ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt> {\n public:\n  explicit GtMatcher(const Rhs& rhs)\n      : ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt>(rhs) { }\n  static const char* Desc() { return \"is >\"; }\n  static const char* NegatedDesc() { return \"isn't >\"; }\n};\ntemplate <typename Rhs>\nclass LeMatcher : public ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe> {\n public:\n  explicit LeMatcher(const Rhs& rhs)\n      : ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe>(rhs) { }\n  static const char* Desc() { return \"is <=\"; }\n  static const char* NegatedDesc() { return \"isn't <=\"; }\n};\ntemplate <typename Rhs>\nclass GeMatcher : public ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe> {\n public:\n  explicit GeMatcher(const Rhs& rhs)\n      : ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe>(rhs) { }\n  static const char* Desc() { return \"is >=\"; }\n  static const char* NegatedDesc() { return \"isn't >=\"; }\n};\n\n// Implements the polymorphic IsNull() matcher, which matches any raw or smart\n// pointer that is NULL.\nclass IsNullMatcher {\n public:\n  template <typename Pointer>\n  bool MatchAndExplain(const Pointer& p,\n                       MatchResultListener* /* listener */) const {\n#if GTEST_LANG_CXX11\n    return p == nullptr;\n#else  // GTEST_LANG_CXX11\n    return GetRawPointer(p) == NULL;\n#endif  // GTEST_LANG_CXX11\n  }\n\n  void DescribeTo(::std::ostream* os) const { *os << \"is NULL\"; }\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"isn't NULL\";\n  }\n};\n\n// Implements the polymorphic NotNull() matcher, which matches any raw or smart\n// pointer that is not NULL.\nclass NotNullMatcher {\n public:\n  template <typename Pointer>\n  bool MatchAndExplain(const Pointer& p,\n                       MatchResultListener* /* listener */) const {\n#if GTEST_LANG_CXX11\n    return p != nullptr;\n#else  // GTEST_LANG_CXX11\n    return GetRawPointer(p) != NULL;\n#endif  // GTEST_LANG_CXX11\n  }\n\n  void DescribeTo(::std::ostream* os) const { *os << \"isn't NULL\"; }\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"is NULL\";\n  }\n};\n\n// Ref(variable) matches any argument that is a reference to\n// 'variable'.  This matcher is polymorphic as it can match any\n// super type of the type of 'variable'.\n//\n// The RefMatcher template class implements Ref(variable).  It can\n// only be instantiated with a reference type.  This prevents a user\n// from mistakenly using Ref(x) to match a non-reference function\n// argument.  For example, the following will righteously cause a\n// compiler error:\n//\n//   int n;\n//   Matcher<int> m1 = Ref(n);   // This won't compile.\n//   Matcher<int&> m2 = Ref(n);  // This will compile.\ntemplate <typename T>\nclass RefMatcher;\n\ntemplate <typename T>\nclass RefMatcher<T&> {\n  // Google Mock is a generic framework and thus needs to support\n  // mocking any function types, including those that take non-const\n  // reference arguments.  Therefore the template parameter T (and\n  // Super below) can be instantiated to either a const type or a\n  // non-const type.\n public:\n  // RefMatcher() takes a T& instead of const T&, as we want the\n  // compiler to catch using Ref(const_value) as a matcher for a\n  // non-const reference.\n  explicit RefMatcher(T& x) : object_(x) {}  // NOLINT\n\n  template <typename Super>\n  operator Matcher<Super&>() const {\n    // By passing object_ (type T&) to Impl(), which expects a Super&,\n    // we make sure that Super is a super type of T.  In particular,\n    // this catches using Ref(const_value) as a matcher for a\n    // non-const reference, as you cannot implicitly convert a const\n    // reference to a non-const reference.\n    return MakeMatcher(new Impl<Super>(object_));\n  }\n\n private:\n  template <typename Super>\n  class Impl : public MatcherInterface<Super&> {\n   public:\n    explicit Impl(Super& x) : object_(x) {}  // NOLINT\n\n    // MatchAndExplain() takes a Super& (as opposed to const Super&)\n    // in order to match the interface MatcherInterface<Super&>.\n    virtual bool MatchAndExplain(\n        Super& x, MatchResultListener* listener) const {\n      *listener << \"which is located @\" << static_cast<const void*>(&x);\n      return &x == &object_;\n    }\n\n    virtual void DescribeTo(::std::ostream* os) const {\n      *os << \"references the variable \";\n      UniversalPrinter<Super&>::Print(object_, os);\n    }\n\n    virtual void DescribeNegationTo(::std::ostream* os) const {\n      *os << \"does not reference the variable \";\n      UniversalPrinter<Super&>::Print(object_, os);\n    }\n\n   private:\n    const Super& object_;\n\n    GTEST_DISALLOW_ASSIGN_(Impl);\n  };\n\n  T& object_;\n\n  GTEST_DISALLOW_ASSIGN_(RefMatcher);\n};\n\n// Polymorphic helper functions for narrow and wide string matchers.\ninline bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs) {\n  return String::CaseInsensitiveCStringEquals(lhs, rhs);\n}\n\ninline bool CaseInsensitiveCStringEquals(const wchar_t* lhs,\n                                         const wchar_t* rhs) {\n  return String::CaseInsensitiveWideCStringEquals(lhs, rhs);\n}\n\n// String comparison for narrow or wide strings that can have embedded NUL\n// characters.\ntemplate <typename StringType>\nbool CaseInsensitiveStringEquals(const StringType& s1,\n                                 const StringType& s2) {\n  // Are the heads equal?\n  if (!CaseInsensitiveCStringEquals(s1.c_str(), s2.c_str())) {\n    return false;\n  }\n\n  // Skip the equal heads.\n  const typename StringType::value_type nul = 0;\n  const size_t i1 = s1.find(nul), i2 = s2.find(nul);\n\n  // Are we at the end of either s1 or s2?\n  if (i1 == StringType::npos || i2 == StringType::npos) {\n    return i1 == i2;\n  }\n\n  // Are the tails equal?\n  return CaseInsensitiveStringEquals(s1.substr(i1 + 1), s2.substr(i2 + 1));\n}\n\n// String matchers.\n\n// Implements equality-based string matchers like StrEq, StrCaseNe, and etc.\ntemplate <typename StringType>\nclass StrEqualityMatcher {\n public:\n  StrEqualityMatcher(const StringType& str, bool expect_eq,\n                     bool case_sensitive)\n      : string_(str), expect_eq_(expect_eq), case_sensitive_(case_sensitive) {}\n\n#if GTEST_HAS_ABSL\n  bool MatchAndExplain(const absl::string_view& s,\n                       MatchResultListener* listener) const {\n    if (s.data() == NULL) {\n      return !expect_eq_;\n    }\n    // This should fail to compile if absl::string_view is used with wide\n    // strings.\n    const StringType& str = string(s);\n    return MatchAndExplain(str, listener);\n  }\n#endif  // GTEST_HAS_ABSL\n\n  // Accepts pointer types, particularly:\n  //   const char*\n  //   char*\n  //   const wchar_t*\n  //   wchar_t*\n  template <typename CharType>\n  bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {\n    if (s == NULL) {\n      return !expect_eq_;\n    }\n    return MatchAndExplain(StringType(s), listener);\n  }\n\n  // Matches anything that can convert to StringType.\n  //\n  // This is a template, not just a plain function with const StringType&,\n  // because absl::string_view has some interfering non-explicit constructors.\n  template <typename MatcheeStringType>\n  bool MatchAndExplain(const MatcheeStringType& s,\n                       MatchResultListener* /* listener */) const {\n    const StringType& s2(s);\n    const bool eq = case_sensitive_ ? s2 == string_ :\n        CaseInsensitiveStringEquals(s2, string_);\n    return expect_eq_ == eq;\n  }\n\n  void DescribeTo(::std::ostream* os) const {\n    DescribeToHelper(expect_eq_, os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    DescribeToHelper(!expect_eq_, os);\n  }\n\n private:\n  void DescribeToHelper(bool expect_eq, ::std::ostream* os) const {\n    *os << (expect_eq ? \"is \" : \"isn't \");\n    *os << \"equal to \";\n    if (!case_sensitive_) {\n      *os << \"(ignoring case) \";\n    }\n    UniversalPrint(string_, os);\n  }\n\n  const StringType string_;\n  const bool expect_eq_;\n  const bool case_sensitive_;\n\n  GTEST_DISALLOW_ASSIGN_(StrEqualityMatcher);\n};\n\n// Implements the polymorphic HasSubstr(substring) matcher, which\n// can be used as a Matcher<T> as long as T can be converted to a\n// string.\ntemplate <typename StringType>\nclass HasSubstrMatcher {\n public:\n  explicit HasSubstrMatcher(const StringType& substring)\n      : substring_(substring) {}\n\n#if GTEST_HAS_ABSL\n  bool MatchAndExplain(const absl::string_view& s,\n                       MatchResultListener* listener) const {\n    if (s.data() == NULL) {\n      return false;\n    }\n    // This should fail to compile if absl::string_view is used with wide\n    // strings.\n    const StringType& str = string(s);\n    return MatchAndExplain(str, listener);\n  }\n#endif  // GTEST_HAS_ABSL\n\n  // Accepts pointer types, particularly:\n  //   const char*\n  //   char*\n  //   const wchar_t*\n  //   wchar_t*\n  template <typename CharType>\n  bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {\n    return s != NULL && MatchAndExplain(StringType(s), listener);\n  }\n\n  // Matches anything that can convert to StringType.\n  //\n  // This is a template, not just a plain function with const StringType&,\n  // because absl::string_view has some interfering non-explicit constructors.\n  template <typename MatcheeStringType>\n  bool MatchAndExplain(const MatcheeStringType& s,\n                       MatchResultListener* /* listener */) const {\n    const StringType& s2(s);\n    return s2.find(substring_) != StringType::npos;\n  }\n\n  // Describes what this matcher matches.\n  void DescribeTo(::std::ostream* os) const {\n    *os << \"has substring \";\n    UniversalPrint(substring_, os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"has no substring \";\n    UniversalPrint(substring_, os);\n  }\n\n private:\n  const StringType substring_;\n\n  GTEST_DISALLOW_ASSIGN_(HasSubstrMatcher);\n};\n\n// Implements the polymorphic StartsWith(substring) matcher, which\n// can be used as a Matcher<T> as long as T can be converted to a\n// string.\ntemplate <typename StringType>\nclass StartsWithMatcher {\n public:\n  explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) {\n  }\n\n#if GTEST_HAS_ABSL\n  bool MatchAndExplain(const absl::string_view& s,\n                       MatchResultListener* listener) const {\n    if (s.data() == NULL) {\n      return false;\n    }\n    // This should fail to compile if absl::string_view is used with wide\n    // strings.\n    const StringType& str = string(s);\n    return MatchAndExplain(str, listener);\n  }\n#endif  // GTEST_HAS_ABSL\n\n  // Accepts pointer types, particularly:\n  //   const char*\n  //   char*\n  //   const wchar_t*\n  //   wchar_t*\n  template <typename CharType>\n  bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {\n    return s != NULL && MatchAndExplain(StringType(s), listener);\n  }\n\n  // Matches anything that can convert to StringType.\n  //\n  // This is a template, not just a plain function with const StringType&,\n  // because absl::string_view has some interfering non-explicit constructors.\n  template <typename MatcheeStringType>\n  bool MatchAndExplain(const MatcheeStringType& s,\n                       MatchResultListener* /* listener */) const {\n    const StringType& s2(s);\n    return s2.length() >= prefix_.length() &&\n        s2.substr(0, prefix_.length()) == prefix_;\n  }\n\n  void DescribeTo(::std::ostream* os) const {\n    *os << \"starts with \";\n    UniversalPrint(prefix_, os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"doesn't start with \";\n    UniversalPrint(prefix_, os);\n  }\n\n private:\n  const StringType prefix_;\n\n  GTEST_DISALLOW_ASSIGN_(StartsWithMatcher);\n};\n\n// Implements the polymorphic EndsWith(substring) matcher, which\n// can be used as a Matcher<T> as long as T can be converted to a\n// string.\ntemplate <typename StringType>\nclass EndsWithMatcher {\n public:\n  explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {}\n\n#if GTEST_HAS_ABSL\n  bool MatchAndExplain(const absl::string_view& s,\n                       MatchResultListener* listener) const {\n    if (s.data() == NULL) {\n      return false;\n    }\n    // This should fail to compile if absl::string_view is used with wide\n    // strings.\n    const StringType& str = string(s);\n    return MatchAndExplain(str, listener);\n  }\n#endif  // GTEST_HAS_ABSL\n\n  // Accepts pointer types, particularly:\n  //   const char*\n  //   char*\n  //   const wchar_t*\n  //   wchar_t*\n  template <typename CharType>\n  bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {\n    return s != NULL && MatchAndExplain(StringType(s), listener);\n  }\n\n  // Matches anything that can convert to StringType.\n  //\n  // This is a template, not just a plain function with const StringType&,\n  // because absl::string_view has some interfering non-explicit constructors.\n  template <typename MatcheeStringType>\n  bool MatchAndExplain(const MatcheeStringType& s,\n                       MatchResultListener* /* listener */) const {\n    const StringType& s2(s);\n    return s2.length() >= suffix_.length() &&\n        s2.substr(s2.length() - suffix_.length()) == suffix_;\n  }\n\n  void DescribeTo(::std::ostream* os) const {\n    *os << \"ends with \";\n    UniversalPrint(suffix_, os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"doesn't end with \";\n    UniversalPrint(suffix_, os);\n  }\n\n private:\n  const StringType suffix_;\n\n  GTEST_DISALLOW_ASSIGN_(EndsWithMatcher);\n};\n\n// Implements polymorphic matchers MatchesRegex(regex) and\n// ContainsRegex(regex), which can be used as a Matcher<T> as long as\n// T can be converted to a string.\nclass MatchesRegexMatcher {\n public:\n  MatchesRegexMatcher(const RE* regex, bool full_match)\n      : regex_(regex), full_match_(full_match) {}\n\n#if GTEST_HAS_ABSL\n  bool MatchAndExplain(const absl::string_view& s,\n                       MatchResultListener* listener) const {\n    return s.data() && MatchAndExplain(string(s), listener);\n  }\n#endif  // GTEST_HAS_ABSL\n\n  // Accepts pointer types, particularly:\n  //   const char*\n  //   char*\n  //   const wchar_t*\n  //   wchar_t*\n  template <typename CharType>\n  bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {\n    return s != NULL && MatchAndExplain(std::string(s), listener);\n  }\n\n  // Matches anything that can convert to std::string.\n  //\n  // This is a template, not just a plain function with const std::string&,\n  // because absl::string_view has some interfering non-explicit constructors.\n  template <class MatcheeStringType>\n  bool MatchAndExplain(const MatcheeStringType& s,\n                       MatchResultListener* /* listener */) const {\n    const std::string& s2(s);\n    return full_match_ ? RE::FullMatch(s2, *regex_) :\n        RE::PartialMatch(s2, *regex_);\n  }\n\n  void DescribeTo(::std::ostream* os) const {\n    *os << (full_match_ ? \"matches\" : \"contains\")\n        << \" regular expression \";\n    UniversalPrinter<std::string>::Print(regex_->pattern(), os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"doesn't \" << (full_match_ ? \"match\" : \"contain\")\n        << \" regular expression \";\n    UniversalPrinter<std::string>::Print(regex_->pattern(), os);\n  }\n\n private:\n  const internal::linked_ptr<const RE> regex_;\n  const bool full_match_;\n\n  GTEST_DISALLOW_ASSIGN_(MatchesRegexMatcher);\n};\n\n// Implements a matcher that compares the two fields of a 2-tuple\n// using one of the ==, <=, <, etc, operators.  The two fields being\n// compared don't have to have the same type.\n//\n// The matcher defined here is polymorphic (for example, Eq() can be\n// used to match a tuple<int, short>, a tuple<const long&, double>,\n// etc).  Therefore we use a template type conversion operator in the\n// implementation.\ntemplate <typename D, typename Op>\nclass PairMatchBase {\n public:\n  template <typename T1, typename T2>\n  operator Matcher< ::testing::tuple<T1, T2> >() const {\n    return MakeMatcher(new Impl< ::testing::tuple<T1, T2> >);\n  }\n  template <typename T1, typename T2>\n  operator Matcher<const ::testing::tuple<T1, T2>&>() const {\n    return MakeMatcher(new Impl<const ::testing::tuple<T1, T2>&>);\n  }\n\n private:\n  static ::std::ostream& GetDesc(::std::ostream& os) {  // NOLINT\n    return os << D::Desc();\n  }\n\n  template <typename Tuple>\n  class Impl : public MatcherInterface<Tuple> {\n   public:\n    virtual bool MatchAndExplain(\n        Tuple args,\n        MatchResultListener* /* listener */) const {\n      return Op()(::testing::get<0>(args), ::testing::get<1>(args));\n    }\n    virtual void DescribeTo(::std::ostream* os) const {\n      *os << \"are \" << GetDesc;\n    }\n    virtual void DescribeNegationTo(::std::ostream* os) const {\n      *os << \"aren't \" << GetDesc;\n    }\n  };\n};\n\nclass Eq2Matcher : public PairMatchBase<Eq2Matcher, AnyEq> {\n public:\n  static const char* Desc() { return \"an equal pair\"; }\n};\nclass Ne2Matcher : public PairMatchBase<Ne2Matcher, AnyNe> {\n public:\n  static const char* Desc() { return \"an unequal pair\"; }\n};\nclass Lt2Matcher : public PairMatchBase<Lt2Matcher, AnyLt> {\n public:\n  static const char* Desc() { return \"a pair where the first < the second\"; }\n};\nclass Gt2Matcher : public PairMatchBase<Gt2Matcher, AnyGt> {\n public:\n  static const char* Desc() { return \"a pair where the first > the second\"; }\n};\nclass Le2Matcher : public PairMatchBase<Le2Matcher, AnyLe> {\n public:\n  static const char* Desc() { return \"a pair where the first <= the second\"; }\n};\nclass Ge2Matcher : public PairMatchBase<Ge2Matcher, AnyGe> {\n public:\n  static const char* Desc() { return \"a pair where the first >= the second\"; }\n};\n\n// Implements the Not(...) matcher for a particular argument type T.\n// We do not nest it inside the NotMatcher class template, as that\n// will prevent different instantiations of NotMatcher from sharing\n// the same NotMatcherImpl<T> class.\ntemplate <typename T>\nclass NotMatcherImpl : public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> {\n public:\n  explicit NotMatcherImpl(const Matcher<T>& matcher)\n      : matcher_(matcher) {}\n\n  virtual bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x,\n                               MatchResultListener* listener) const {\n    return !matcher_.MatchAndExplain(x, listener);\n  }\n\n  virtual void DescribeTo(::std::ostream* os) const {\n    matcher_.DescribeNegationTo(os);\n  }\n\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    matcher_.DescribeTo(os);\n  }\n\n private:\n  const Matcher<T> matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(NotMatcherImpl);\n};\n\n// Implements the Not(m) matcher, which matches a value that doesn't\n// match matcher m.\ntemplate <typename InnerMatcher>\nclass NotMatcher {\n public:\n  explicit NotMatcher(InnerMatcher matcher) : matcher_(matcher) {}\n\n  // This template type conversion operator allows Not(m) to be used\n  // to match any type m can match.\n  template <typename T>\n  operator Matcher<T>() const {\n    return Matcher<T>(new NotMatcherImpl<T>(SafeMatcherCast<T>(matcher_)));\n  }\n\n private:\n  InnerMatcher matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(NotMatcher);\n};\n\n// Implements the AllOf(m1, m2) matcher for a particular argument type\n// T. We do not nest it inside the BothOfMatcher class template, as\n// that will prevent different instantiations of BothOfMatcher from\n// sharing the same BothOfMatcherImpl<T> class.\ntemplate <typename T>\nclass AllOfMatcherImpl\n    : public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> {\n public:\n  explicit AllOfMatcherImpl(std::vector<Matcher<T> > matchers)\n      : matchers_(internal::move(matchers)) {}\n\n  virtual void DescribeTo(::std::ostream* os) const {\n    *os << \"(\";\n    for (size_t i = 0; i < matchers_.size(); ++i) {\n      if (i != 0) *os << \") and (\";\n      matchers_[i].DescribeTo(os);\n    }\n    *os << \")\";\n  }\n\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"(\";\n    for (size_t i = 0; i < matchers_.size(); ++i) {\n      if (i != 0) *os << \") or (\";\n      matchers_[i].DescribeNegationTo(os);\n    }\n    *os << \")\";\n  }\n\n  virtual bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x,\n                               MatchResultListener* listener) const {\n    // If either matcher1_ or matcher2_ doesn't match x, we only need\n    // to explain why one of them fails.\n    std::string all_match_result;\n\n    for (size_t i = 0; i < matchers_.size(); ++i) {\n      StringMatchResultListener slistener;\n      if (matchers_[i].MatchAndExplain(x, &slistener)) {\n        if (all_match_result.empty()) {\n          all_match_result = slistener.str();\n        } else {\n          std::string result = slistener.str();\n          if (!result.empty()) {\n            all_match_result += \", and \";\n            all_match_result += result;\n          }\n        }\n      } else {\n        *listener << slistener.str();\n        return false;\n      }\n    }\n\n    // Otherwise we need to explain why *both* of them match.\n    *listener << all_match_result;\n    return true;\n  }\n\n private:\n  const std::vector<Matcher<T> > matchers_;\n\n  GTEST_DISALLOW_ASSIGN_(AllOfMatcherImpl);\n};\n\n#if GTEST_LANG_CXX11\n// VariadicMatcher is used for the variadic implementation of\n// AllOf(m_1, m_2, ...) and AnyOf(m_1, m_2, ...).\n// CombiningMatcher<T> is used to recursively combine the provided matchers\n// (of type Args...).\ntemplate <template <typename T> class CombiningMatcher, typename... Args>\nclass VariadicMatcher {\n public:\n  VariadicMatcher(const Args&... matchers)  // NOLINT\n      : matchers_(matchers...) {\n    static_assert(sizeof...(Args) > 0, \"Must have at least one matcher.\");\n  }\n\n  // This template type conversion operator allows an\n  // VariadicMatcher<Matcher1, Matcher2...> object to match any type that\n  // all of the provided matchers (Matcher1, Matcher2, ...) can match.\n  template <typename T>\n  operator Matcher<T>() const {\n    std::vector<Matcher<T> > values;\n    CreateVariadicMatcher<T>(&values, std::integral_constant<size_t, 0>());\n    return Matcher<T>(new CombiningMatcher<T>(internal::move(values)));\n  }\n\n private:\n  template <typename T, size_t I>\n  void CreateVariadicMatcher(std::vector<Matcher<T> >* values,\n                             std::integral_constant<size_t, I>) const {\n    values->push_back(SafeMatcherCast<T>(std::get<I>(matchers_)));\n    CreateVariadicMatcher<T>(values, std::integral_constant<size_t, I + 1>());\n  }\n\n  template <typename T>\n  void CreateVariadicMatcher(\n      std::vector<Matcher<T> >*,\n      std::integral_constant<size_t, sizeof...(Args)>) const {}\n\n  tuple<Args...> matchers_;\n\n  GTEST_DISALLOW_ASSIGN_(VariadicMatcher);\n};\n\ntemplate <typename... Args>\nusing AllOfMatcher = VariadicMatcher<AllOfMatcherImpl, Args...>;\n\n#endif  // GTEST_LANG_CXX11\n\n// Used for implementing the AllOf(m_1, ..., m_n) matcher, which\n// matches a value that matches all of the matchers m_1, ..., and m_n.\ntemplate <typename Matcher1, typename Matcher2>\nclass BothOfMatcher {\n public:\n  BothOfMatcher(Matcher1 matcher1, Matcher2 matcher2)\n      : matcher1_(matcher1), matcher2_(matcher2) {}\n\n  // This template type conversion operator allows a\n  // BothOfMatcher<Matcher1, Matcher2> object to match any type that\n  // both Matcher1 and Matcher2 can match.\n  template <typename T>\n  operator Matcher<T>() const {\n    std::vector<Matcher<T> > values;\n    values.push_back(SafeMatcherCast<T>(matcher1_));\n    values.push_back(SafeMatcherCast<T>(matcher2_));\n    return Matcher<T>(new AllOfMatcherImpl<T>(internal::move(values)));\n  }\n\n private:\n  Matcher1 matcher1_;\n  Matcher2 matcher2_;\n\n  GTEST_DISALLOW_ASSIGN_(BothOfMatcher);\n};\n\n// Implements the AnyOf(m1, m2) matcher for a particular argument type\n// T.  We do not nest it inside the AnyOfMatcher class template, as\n// that will prevent different instantiations of AnyOfMatcher from\n// sharing the same EitherOfMatcherImpl<T> class.\ntemplate <typename T>\nclass AnyOfMatcherImpl\n    : public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> {\n public:\n  explicit AnyOfMatcherImpl(std::vector<Matcher<T> > matchers)\n      : matchers_(internal::move(matchers)) {}\n\n  virtual void DescribeTo(::std::ostream* os) const {\n    *os << \"(\";\n    for (size_t i = 0; i < matchers_.size(); ++i) {\n      if (i != 0) *os << \") or (\";\n      matchers_[i].DescribeTo(os);\n    }\n    *os << \")\";\n  }\n\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"(\";\n    for (size_t i = 0; i < matchers_.size(); ++i) {\n      if (i != 0) *os << \") and (\";\n      matchers_[i].DescribeNegationTo(os);\n    }\n    *os << \")\";\n  }\n\n  virtual bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x,\n                               MatchResultListener* listener) const {\n    std::string no_match_result;\n\n    // If either matcher1_ or matcher2_ matches x, we just need to\n    // explain why *one* of them matches.\n    for (size_t i = 0; i < matchers_.size(); ++i) {\n      StringMatchResultListener slistener;\n      if (matchers_[i].MatchAndExplain(x, &slistener)) {\n        *listener << slistener.str();\n        return true;\n      } else {\n        if (no_match_result.empty()) {\n          no_match_result = slistener.str();\n        } else {\n          std::string result = slistener.str();\n          if (!result.empty()) {\n            no_match_result += \", and \";\n            no_match_result += result;\n          }\n        }\n      }\n    }\n\n    // Otherwise we need to explain why *both* of them fail.\n    *listener << no_match_result;\n    return false;\n  }\n\n private:\n  const std::vector<Matcher<T> > matchers_;\n\n  GTEST_DISALLOW_ASSIGN_(AnyOfMatcherImpl);\n};\n\n#if GTEST_LANG_CXX11\n// AnyOfMatcher is used for the variadic implementation of AnyOf(m_1, m_2, ...).\ntemplate <typename... Args>\nusing AnyOfMatcher = VariadicMatcher<AnyOfMatcherImpl, Args...>;\n\n#endif  // GTEST_LANG_CXX11\n\n// Used for implementing the AnyOf(m_1, ..., m_n) matcher, which\n// matches a value that matches at least one of the matchers m_1, ...,\n// and m_n.\ntemplate <typename Matcher1, typename Matcher2>\nclass EitherOfMatcher {\n public:\n  EitherOfMatcher(Matcher1 matcher1, Matcher2 matcher2)\n      : matcher1_(matcher1), matcher2_(matcher2) {}\n\n  // This template type conversion operator allows a\n  // EitherOfMatcher<Matcher1, Matcher2> object to match any type that\n  // both Matcher1 and Matcher2 can match.\n  template <typename T>\n  operator Matcher<T>() const {\n    std::vector<Matcher<T> > values;\n    values.push_back(SafeMatcherCast<T>(matcher1_));\n    values.push_back(SafeMatcherCast<T>(matcher2_));\n    return Matcher<T>(new AnyOfMatcherImpl<T>(internal::move(values)));\n  }\n\n private:\n  Matcher1 matcher1_;\n  Matcher2 matcher2_;\n\n  GTEST_DISALLOW_ASSIGN_(EitherOfMatcher);\n};\n\n// Used for implementing Truly(pred), which turns a predicate into a\n// matcher.\ntemplate <typename Predicate>\nclass TrulyMatcher {\n public:\n  explicit TrulyMatcher(Predicate pred) : predicate_(pred) {}\n\n  // This method template allows Truly(pred) to be used as a matcher\n  // for type T where T is the argument type of predicate 'pred'.  The\n  // argument is passed by reference as the predicate may be\n  // interested in the address of the argument.\n  template <typename T>\n  bool MatchAndExplain(T& x,  // NOLINT\n                       MatchResultListener* /* listener */) const {\n    // Without the if-statement, MSVC sometimes warns about converting\n    // a value to bool (warning 4800).\n    //\n    // We cannot write 'return !!predicate_(x);' as that doesn't work\n    // when predicate_(x) returns a class convertible to bool but\n    // having no operator!().\n    if (predicate_(x))\n      return true;\n    return false;\n  }\n\n  void DescribeTo(::std::ostream* os) const {\n    *os << \"satisfies the given predicate\";\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"doesn't satisfy the given predicate\";\n  }\n\n private:\n  Predicate predicate_;\n\n  GTEST_DISALLOW_ASSIGN_(TrulyMatcher);\n};\n\n// Used for implementing Matches(matcher), which turns a matcher into\n// a predicate.\ntemplate <typename M>\nclass MatcherAsPredicate {\n public:\n  explicit MatcherAsPredicate(M matcher) : matcher_(matcher) {}\n\n  // This template operator() allows Matches(m) to be used as a\n  // predicate on type T where m is a matcher on type T.\n  //\n  // The argument x is passed by reference instead of by value, as\n  // some matcher may be interested in its address (e.g. as in\n  // Matches(Ref(n))(x)).\n  template <typename T>\n  bool operator()(const T& x) const {\n    // We let matcher_ commit to a particular type here instead of\n    // when the MatcherAsPredicate object was constructed.  This\n    // allows us to write Matches(m) where m is a polymorphic matcher\n    // (e.g. Eq(5)).\n    //\n    // If we write Matcher<T>(matcher_).Matches(x) here, it won't\n    // compile when matcher_ has type Matcher<const T&>; if we write\n    // Matcher<const T&>(matcher_).Matches(x) here, it won't compile\n    // when matcher_ has type Matcher<T>; if we just write\n    // matcher_.Matches(x), it won't compile when matcher_ is\n    // polymorphic, e.g. Eq(5).\n    //\n    // MatcherCast<const T&>() is necessary for making the code work\n    // in all of the above situations.\n    return MatcherCast<const T&>(matcher_).Matches(x);\n  }\n\n private:\n  M matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(MatcherAsPredicate);\n};\n\n// For implementing ASSERT_THAT() and EXPECT_THAT().  The template\n// argument M must be a type that can be converted to a matcher.\ntemplate <typename M>\nclass PredicateFormatterFromMatcher {\n public:\n  explicit PredicateFormatterFromMatcher(M m) : matcher_(internal::move(m)) {}\n\n  // This template () operator allows a PredicateFormatterFromMatcher\n  // object to act as a predicate-formatter suitable for using with\n  // Google Test's EXPECT_PRED_FORMAT1() macro.\n  template <typename T>\n  AssertionResult operator()(const char* value_text, const T& x) const {\n    // We convert matcher_ to a Matcher<const T&> *now* instead of\n    // when the PredicateFormatterFromMatcher object was constructed,\n    // as matcher_ may be polymorphic (e.g. NotNull()) and we won't\n    // know which type to instantiate it to until we actually see the\n    // type of x here.\n    //\n    // We write SafeMatcherCast<const T&>(matcher_) instead of\n    // Matcher<const T&>(matcher_), as the latter won't compile when\n    // matcher_ has type Matcher<T> (e.g. An<int>()).\n    // We don't write MatcherCast<const T&> either, as that allows\n    // potentially unsafe downcasting of the matcher argument.\n    const Matcher<const T&> matcher = SafeMatcherCast<const T&>(matcher_);\n    StringMatchResultListener listener;\n    if (MatchPrintAndExplain(x, matcher, &listener))\n      return AssertionSuccess();\n\n    ::std::stringstream ss;\n    ss << \"Value of: \" << value_text << \"\\n\"\n       << \"Expected: \";\n    matcher.DescribeTo(&ss);\n    ss << \"\\n  Actual: \" << listener.str();\n    return AssertionFailure() << ss.str();\n  }\n\n private:\n  const M matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(PredicateFormatterFromMatcher);\n};\n\n// A helper function for converting a matcher to a predicate-formatter\n// without the user needing to explicitly write the type.  This is\n// used for implementing ASSERT_THAT() and EXPECT_THAT().\n// Implementation detail: 'matcher' is received by-value to force decaying.\ntemplate <typename M>\ninline PredicateFormatterFromMatcher<M>\nMakePredicateFormatterFromMatcher(M matcher) {\n  return PredicateFormatterFromMatcher<M>(internal::move(matcher));\n}\n\n// Implements the polymorphic floating point equality matcher, which matches\n// two float values using ULP-based approximation or, optionally, a\n// user-specified epsilon.  The template is meant to be instantiated with\n// FloatType being either float or double.\ntemplate <typename FloatType>\nclass FloatingEqMatcher {\n public:\n  // Constructor for FloatingEqMatcher.\n  // The matcher's input will be compared with expected.  The matcher treats two\n  // NANs as equal if nan_eq_nan is true.  Otherwise, under IEEE standards,\n  // equality comparisons between NANs will always return false.  We specify a\n  // negative max_abs_error_ term to indicate that ULP-based approximation will\n  // be used for comparison.\n  FloatingEqMatcher(FloatType expected, bool nan_eq_nan) :\n    expected_(expected), nan_eq_nan_(nan_eq_nan), max_abs_error_(-1) {\n  }\n\n  // Constructor that supports a user-specified max_abs_error that will be used\n  // for comparison instead of ULP-based approximation.  The max absolute\n  // should be non-negative.\n  FloatingEqMatcher(FloatType expected, bool nan_eq_nan,\n                    FloatType max_abs_error)\n      : expected_(expected),\n        nan_eq_nan_(nan_eq_nan),\n        max_abs_error_(max_abs_error) {\n    GTEST_CHECK_(max_abs_error >= 0)\n        << \", where max_abs_error is\" << max_abs_error;\n  }\n\n  // Implements floating point equality matcher as a Matcher<T>.\n  template <typename T>\n  class Impl : public MatcherInterface<T> {\n   public:\n    Impl(FloatType expected, bool nan_eq_nan, FloatType max_abs_error)\n        : expected_(expected),\n          nan_eq_nan_(nan_eq_nan),\n          max_abs_error_(max_abs_error) {}\n\n    virtual bool MatchAndExplain(T value,\n                                 MatchResultListener* listener) const {\n      const FloatingPoint<FloatType> actual(value), expected(expected_);\n\n      // Compares NaNs first, if nan_eq_nan_ is true.\n      if (actual.is_nan() || expected.is_nan()) {\n        if (actual.is_nan() && expected.is_nan()) {\n          return nan_eq_nan_;\n        }\n        // One is nan; the other is not nan.\n        return false;\n      }\n      if (HasMaxAbsError()) {\n        // We perform an equality check so that inf will match inf, regardless\n        // of error bounds.  If the result of value - expected_ would result in\n        // overflow or if either value is inf, the default result is infinity,\n        // which should only match if max_abs_error_ is also infinity.\n        if (value == expected_) {\n          return true;\n        }\n\n        const FloatType diff = value - expected_;\n        if (fabs(diff) <= max_abs_error_) {\n          return true;\n        }\n\n        if (listener->IsInterested()) {\n          *listener << \"which is \" << diff << \" from \" << expected_;\n        }\n        return false;\n      } else {\n        return actual.AlmostEquals(expected);\n      }\n    }\n\n    virtual void DescribeTo(::std::ostream* os) const {\n      // os->precision() returns the previously set precision, which we\n      // store to restore the ostream to its original configuration\n      // after outputting.\n      const ::std::streamsize old_precision = os->precision(\n          ::std::numeric_limits<FloatType>::digits10 + 2);\n      if (FloatingPoint<FloatType>(expected_).is_nan()) {\n        if (nan_eq_nan_) {\n          *os << \"is NaN\";\n        } else {\n          *os << \"never matches\";\n        }\n      } else {\n        *os << \"is approximately \" << expected_;\n        if (HasMaxAbsError()) {\n          *os << \" (absolute error <= \" << max_abs_error_ << \")\";\n        }\n      }\n      os->precision(old_precision);\n    }\n\n    virtual void DescribeNegationTo(::std::ostream* os) const {\n      // As before, get original precision.\n      const ::std::streamsize old_precision = os->precision(\n          ::std::numeric_limits<FloatType>::digits10 + 2);\n      if (FloatingPoint<FloatType>(expected_).is_nan()) {\n        if (nan_eq_nan_) {\n          *os << \"isn't NaN\";\n        } else {\n          *os << \"is anything\";\n        }\n      } else {\n        *os << \"isn't approximately \" << expected_;\n        if (HasMaxAbsError()) {\n          *os << \" (absolute error > \" << max_abs_error_ << \")\";\n        }\n      }\n      // Restore original precision.\n      os->precision(old_precision);\n    }\n\n   private:\n    bool HasMaxAbsError() const {\n      return max_abs_error_ >= 0;\n    }\n\n    const FloatType expected_;\n    const bool nan_eq_nan_;\n    // max_abs_error will be used for value comparison when >= 0.\n    const FloatType max_abs_error_;\n\n    GTEST_DISALLOW_ASSIGN_(Impl);\n  };\n\n  // The following 3 type conversion operators allow FloatEq(expected) and\n  // NanSensitiveFloatEq(expected) to be used as a Matcher<float>, a\n  // Matcher<const float&>, or a Matcher<float&>, but nothing else.\n  // (While Google's C++ coding style doesn't allow arguments passed\n  // by non-const reference, we may see them in code not conforming to\n  // the style.  Therefore Google Mock needs to support them.)\n  operator Matcher<FloatType>() const {\n    return MakeMatcher(\n        new Impl<FloatType>(expected_, nan_eq_nan_, max_abs_error_));\n  }\n\n  operator Matcher<const FloatType&>() const {\n    return MakeMatcher(\n        new Impl<const FloatType&>(expected_, nan_eq_nan_, max_abs_error_));\n  }\n\n  operator Matcher<FloatType&>() const {\n    return MakeMatcher(\n        new Impl<FloatType&>(expected_, nan_eq_nan_, max_abs_error_));\n  }\n\n private:\n  const FloatType expected_;\n  const bool nan_eq_nan_;\n  // max_abs_error will be used for value comparison when >= 0.\n  const FloatType max_abs_error_;\n\n  GTEST_DISALLOW_ASSIGN_(FloatingEqMatcher);\n};\n\n// A 2-tuple (\"binary\") wrapper around FloatingEqMatcher:\n// FloatingEq2Matcher() matches (x, y) by matching FloatingEqMatcher(x, false)\n// against y, and FloatingEq2Matcher(e) matches FloatingEqMatcher(x, false, e)\n// against y. The former implements \"Eq\", the latter \"Near\". At present, there\n// is no version that compares NaNs as equal.\ntemplate <typename FloatType>\nclass FloatingEq2Matcher {\n public:\n  FloatingEq2Matcher() { Init(-1, false); }\n\n  explicit FloatingEq2Matcher(bool nan_eq_nan) { Init(-1, nan_eq_nan); }\n\n  explicit FloatingEq2Matcher(FloatType max_abs_error) {\n    Init(max_abs_error, false);\n  }\n\n  FloatingEq2Matcher(FloatType max_abs_error, bool nan_eq_nan) {\n    Init(max_abs_error, nan_eq_nan);\n  }\n\n  template <typename T1, typename T2>\n  operator Matcher< ::testing::tuple<T1, T2> >() const {\n    return MakeMatcher(\n        new Impl< ::testing::tuple<T1, T2> >(max_abs_error_, nan_eq_nan_));\n  }\n  template <typename T1, typename T2>\n  operator Matcher<const ::testing::tuple<T1, T2>&>() const {\n    return MakeMatcher(\n        new Impl<const ::testing::tuple<T1, T2>&>(max_abs_error_, nan_eq_nan_));\n  }\n\n private:\n  static ::std::ostream& GetDesc(::std::ostream& os) {  // NOLINT\n    return os << \"an almost-equal pair\";\n  }\n\n  template <typename Tuple>\n  class Impl : public MatcherInterface<Tuple> {\n   public:\n    Impl(FloatType max_abs_error, bool nan_eq_nan) :\n        max_abs_error_(max_abs_error),\n        nan_eq_nan_(nan_eq_nan) {}\n\n    virtual bool MatchAndExplain(Tuple args,\n                                 MatchResultListener* listener) const {\n      if (max_abs_error_ == -1) {\n        FloatingEqMatcher<FloatType> fm(::testing::get<0>(args), nan_eq_nan_);\n        return static_cast<Matcher<FloatType> >(fm).MatchAndExplain(\n            ::testing::get<1>(args), listener);\n      } else {\n        FloatingEqMatcher<FloatType> fm(::testing::get<0>(args), nan_eq_nan_,\n                                        max_abs_error_);\n        return static_cast<Matcher<FloatType> >(fm).MatchAndExplain(\n            ::testing::get<1>(args), listener);\n      }\n    }\n    virtual void DescribeTo(::std::ostream* os) const {\n      *os << \"are \" << GetDesc;\n    }\n    virtual void DescribeNegationTo(::std::ostream* os) const {\n      *os << \"aren't \" << GetDesc;\n    }\n\n   private:\n    FloatType max_abs_error_;\n    const bool nan_eq_nan_;\n  };\n\n  void Init(FloatType max_abs_error_val, bool nan_eq_nan_val) {\n    max_abs_error_ = max_abs_error_val;\n    nan_eq_nan_ = nan_eq_nan_val;\n  }\n  FloatType max_abs_error_;\n  bool nan_eq_nan_;\n};\n\n// Implements the Pointee(m) matcher for matching a pointer whose\n// pointee matches matcher m.  The pointer can be either raw or smart.\ntemplate <typename InnerMatcher>\nclass PointeeMatcher {\n public:\n  explicit PointeeMatcher(const InnerMatcher& matcher) : matcher_(matcher) {}\n\n  // This type conversion operator template allows Pointee(m) to be\n  // used as a matcher for any pointer type whose pointee type is\n  // compatible with the inner matcher, where type Pointer can be\n  // either a raw pointer or a smart pointer.\n  //\n  // The reason we do this instead of relying on\n  // MakePolymorphicMatcher() is that the latter is not flexible\n  // enough for implementing the DescribeTo() method of Pointee().\n  template <typename Pointer>\n  operator Matcher<Pointer>() const {\n    return Matcher<Pointer>(\n        new Impl<GTEST_REFERENCE_TO_CONST_(Pointer)>(matcher_));\n  }\n\n private:\n  // The monomorphic implementation that works for a particular pointer type.\n  template <typename Pointer>\n  class Impl : public MatcherInterface<Pointer> {\n   public:\n    typedef typename PointeeOf<GTEST_REMOVE_CONST_(  // NOLINT\n        GTEST_REMOVE_REFERENCE_(Pointer))>::type Pointee;\n\n    explicit Impl(const InnerMatcher& matcher)\n        : matcher_(MatcherCast<const Pointee&>(matcher)) {}\n\n    virtual void DescribeTo(::std::ostream* os) const {\n      *os << \"points to a value that \";\n      matcher_.DescribeTo(os);\n    }\n\n    virtual void DescribeNegationTo(::std::ostream* os) const {\n      *os << \"does not point to a value that \";\n      matcher_.DescribeTo(os);\n    }\n\n    virtual bool MatchAndExplain(Pointer pointer,\n                                 MatchResultListener* listener) const {\n      if (GetRawPointer(pointer) == NULL)\n        return false;\n\n      *listener << \"which points to \";\n      return MatchPrintAndExplain(*pointer, matcher_, listener);\n    }\n\n   private:\n    const Matcher<const Pointee&> matcher_;\n\n    GTEST_DISALLOW_ASSIGN_(Impl);\n  };\n\n  const InnerMatcher matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(PointeeMatcher);\n};\n\n#if GTEST_HAS_RTTI\n// Implements the WhenDynamicCastTo<T>(m) matcher that matches a pointer or\n// reference that matches inner_matcher when dynamic_cast<T> is applied.\n// The result of dynamic_cast<To> is forwarded to the inner matcher.\n// If To is a pointer and the cast fails, the inner matcher will receive NULL.\n// If To is a reference and the cast fails, this matcher returns false\n// immediately.\ntemplate <typename To>\nclass WhenDynamicCastToMatcherBase {\n public:\n  explicit WhenDynamicCastToMatcherBase(const Matcher<To>& matcher)\n      : matcher_(matcher) {}\n\n  void DescribeTo(::std::ostream* os) const {\n    GetCastTypeDescription(os);\n    matcher_.DescribeTo(os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    GetCastTypeDescription(os);\n    matcher_.DescribeNegationTo(os);\n  }\n\n protected:\n  const Matcher<To> matcher_;\n\n  static std::string GetToName() {\n    return GetTypeName<To>();\n  }\n\n private:\n  static void GetCastTypeDescription(::std::ostream* os) {\n    *os << \"when dynamic_cast to \" << GetToName() << \", \";\n  }\n\n  GTEST_DISALLOW_ASSIGN_(WhenDynamicCastToMatcherBase);\n};\n\n// Primary template.\n// To is a pointer. Cast and forward the result.\ntemplate <typename To>\nclass WhenDynamicCastToMatcher : public WhenDynamicCastToMatcherBase<To> {\n public:\n  explicit WhenDynamicCastToMatcher(const Matcher<To>& matcher)\n      : WhenDynamicCastToMatcherBase<To>(matcher) {}\n\n  template <typename From>\n  bool MatchAndExplain(From from, MatchResultListener* listener) const {\n    // FIXME: Add more detail on failures. ie did the dyn_cast fail?\n    To to = dynamic_cast<To>(from);\n    return MatchPrintAndExplain(to, this->matcher_, listener);\n  }\n};\n\n// Specialize for references.\n// In this case we return false if the dynamic_cast fails.\ntemplate <typename To>\nclass WhenDynamicCastToMatcher<To&> : public WhenDynamicCastToMatcherBase<To&> {\n public:\n  explicit WhenDynamicCastToMatcher(const Matcher<To&>& matcher)\n      : WhenDynamicCastToMatcherBase<To&>(matcher) {}\n\n  template <typename From>\n  bool MatchAndExplain(From& from, MatchResultListener* listener) const {\n    // We don't want an std::bad_cast here, so do the cast with pointers.\n    To* to = dynamic_cast<To*>(&from);\n    if (to == NULL) {\n      *listener << \"which cannot be dynamic_cast to \" << this->GetToName();\n      return false;\n    }\n    return MatchPrintAndExplain(*to, this->matcher_, listener);\n  }\n};\n#endif  // GTEST_HAS_RTTI\n\n// Implements the Field() matcher for matching a field (i.e. member\n// variable) of an object.\ntemplate <typename Class, typename FieldType>\nclass FieldMatcher {\n public:\n  FieldMatcher(FieldType Class::*field,\n               const Matcher<const FieldType&>& matcher)\n      : field_(field), matcher_(matcher), whose_field_(\"whose given field \") {}\n\n  FieldMatcher(const std::string& field_name, FieldType Class::*field,\n               const Matcher<const FieldType&>& matcher)\n      : field_(field),\n        matcher_(matcher),\n        whose_field_(\"whose field `\" + field_name + \"` \") {}\n\n  void DescribeTo(::std::ostream* os) const {\n    *os << \"is an object \" << whose_field_;\n    matcher_.DescribeTo(os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"is an object \" << whose_field_;\n    matcher_.DescribeNegationTo(os);\n  }\n\n  template <typename T>\n  bool MatchAndExplain(const T& value, MatchResultListener* listener) const {\n    return MatchAndExplainImpl(\n        typename ::testing::internal::\n            is_pointer<GTEST_REMOVE_CONST_(T)>::type(),\n        value, listener);\n  }\n\n private:\n  // The first argument of MatchAndExplainImpl() is needed to help\n  // Symbian's C++ compiler choose which overload to use.  Its type is\n  // true_type iff the Field() matcher is used to match a pointer.\n  bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj,\n                           MatchResultListener* listener) const {\n    *listener << whose_field_ << \"is \";\n    return MatchPrintAndExplain(obj.*field_, matcher_, listener);\n  }\n\n  bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p,\n                           MatchResultListener* listener) const {\n    if (p == NULL)\n      return false;\n\n    *listener << \"which points to an object \";\n    // Since *p has a field, it must be a class/struct/union type and\n    // thus cannot be a pointer.  Therefore we pass false_type() as\n    // the first argument.\n    return MatchAndExplainImpl(false_type(), *p, listener);\n  }\n\n  const FieldType Class::*field_;\n  const Matcher<const FieldType&> matcher_;\n\n  // Contains either \"whose given field \" if the name of the field is unknown\n  // or \"whose field `name_of_field` \" if the name is known.\n  const std::string whose_field_;\n\n  GTEST_DISALLOW_ASSIGN_(FieldMatcher);\n};\n\n// Implements the Property() matcher for matching a property\n// (i.e. return value of a getter method) of an object.\n//\n// Property is a const-qualified member function of Class returning\n// PropertyType.\ntemplate <typename Class, typename PropertyType, typename Property>\nclass PropertyMatcher {\n public:\n  // The property may have a reference type, so 'const PropertyType&'\n  // may cause double references and fail to compile.  That's why we\n  // need GTEST_REFERENCE_TO_CONST, which works regardless of\n  // PropertyType being a reference or not.\n  typedef GTEST_REFERENCE_TO_CONST_(PropertyType) RefToConstProperty;\n\n  PropertyMatcher(Property property, const Matcher<RefToConstProperty>& matcher)\n      : property_(property),\n        matcher_(matcher),\n        whose_property_(\"whose given property \") {}\n\n  PropertyMatcher(const std::string& property_name, Property property,\n                  const Matcher<RefToConstProperty>& matcher)\n      : property_(property),\n        matcher_(matcher),\n        whose_property_(\"whose property `\" + property_name + \"` \") {}\n\n  void DescribeTo(::std::ostream* os) const {\n    *os << \"is an object \" << whose_property_;\n    matcher_.DescribeTo(os);\n  }\n\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"is an object \" << whose_property_;\n    matcher_.DescribeNegationTo(os);\n  }\n\n  template <typename T>\n  bool MatchAndExplain(const T&value, MatchResultListener* listener) const {\n    return MatchAndExplainImpl(\n        typename ::testing::internal::\n            is_pointer<GTEST_REMOVE_CONST_(T)>::type(),\n        value, listener);\n  }\n\n private:\n  // The first argument of MatchAndExplainImpl() is needed to help\n  // Symbian's C++ compiler choose which overload to use.  Its type is\n  // true_type iff the Property() matcher is used to match a pointer.\n  bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj,\n                           MatchResultListener* listener) const {\n    *listener << whose_property_ << \"is \";\n    // Cannot pass the return value (for example, int) to MatchPrintAndExplain,\n    // which takes a non-const reference as argument.\n#if defined(_PREFAST_ ) && _MSC_VER == 1800\n    // Workaround bug in VC++ 2013's /analyze parser.\n    // https://connect.microsoft.com/VisualStudio/feedback/details/1106363/internal-compiler-error-with-analyze-due-to-failure-to-infer-move\n    posix::Abort();  // To make sure it is never run.\n    return false;\n#else\n    RefToConstProperty result = (obj.*property_)();\n    return MatchPrintAndExplain(result, matcher_, listener);\n#endif\n  }\n\n  bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p,\n                           MatchResultListener* listener) const {\n    if (p == NULL)\n      return false;\n\n    *listener << \"which points to an object \";\n    // Since *p has a property method, it must be a class/struct/union\n    // type and thus cannot be a pointer.  Therefore we pass\n    // false_type() as the first argument.\n    return MatchAndExplainImpl(false_type(), *p, listener);\n  }\n\n  Property property_;\n  const Matcher<RefToConstProperty> matcher_;\n\n  // Contains either \"whose given property \" if the name of the property is\n  // unknown or \"whose property `name_of_property` \" if the name is known.\n  const std::string whose_property_;\n\n  GTEST_DISALLOW_ASSIGN_(PropertyMatcher);\n};\n\n// Type traits specifying various features of different functors for ResultOf.\n// The default template specifies features for functor objects.\ntemplate <typename Functor>\nstruct CallableTraits {\n  typedef Functor StorageType;\n\n  static void CheckIsValid(Functor /* functor */) {}\n\n#if GTEST_LANG_CXX11\n  template <typename T>\n  static auto Invoke(Functor f, T arg) -> decltype(f(arg)) { return f(arg); }\n#else\n  typedef typename Functor::result_type ResultType;\n  template <typename T>\n  static ResultType Invoke(Functor f, T arg) { return f(arg); }\n#endif\n};\n\n// Specialization for function pointers.\ntemplate <typename ArgType, typename ResType>\nstruct CallableTraits<ResType(*)(ArgType)> {\n  typedef ResType ResultType;\n  typedef ResType(*StorageType)(ArgType);\n\n  static void CheckIsValid(ResType(*f)(ArgType)) {\n    GTEST_CHECK_(f != NULL)\n        << \"NULL function pointer is passed into ResultOf().\";\n  }\n  template <typename T>\n  static ResType Invoke(ResType(*f)(ArgType), T arg) {\n    return (*f)(arg);\n  }\n};\n\n// Implements the ResultOf() matcher for matching a return value of a\n// unary function of an object.\ntemplate <typename Callable, typename InnerMatcher>\nclass ResultOfMatcher {\n public:\n  ResultOfMatcher(Callable callable, InnerMatcher matcher)\n      : callable_(internal::move(callable)), matcher_(internal::move(matcher)) {\n    CallableTraits<Callable>::CheckIsValid(callable_);\n  }\n\n  template <typename T>\n  operator Matcher<T>() const {\n    return Matcher<T>(new Impl<T>(callable_, matcher_));\n  }\n\n private:\n  typedef typename CallableTraits<Callable>::StorageType CallableStorageType;\n\n  template <typename T>\n  class Impl : public MatcherInterface<T> {\n#if GTEST_LANG_CXX11\n    using ResultType = decltype(CallableTraits<Callable>::template Invoke<T>(\n        std::declval<CallableStorageType>(), std::declval<T>()));\n#else\n    typedef typename CallableTraits<Callable>::ResultType ResultType;\n#endif\n\n   public:\n    template <typename M>\n    Impl(const CallableStorageType& callable, const M& matcher)\n        : callable_(callable), matcher_(MatcherCast<ResultType>(matcher)) {}\n\n    virtual void DescribeTo(::std::ostream* os) const {\n      *os << \"is mapped by the given callable to a value that \";\n      matcher_.DescribeTo(os);\n    }\n\n    virtual void DescribeNegationTo(::std::ostream* os) const {\n      *os << \"is mapped by the given callable to a value that \";\n      matcher_.DescribeNegationTo(os);\n    }\n\n    virtual bool MatchAndExplain(T obj, MatchResultListener* listener) const {\n      *listener << \"which is mapped by the given callable to \";\n      // Cannot pass the return value directly to MatchPrintAndExplain, which\n      // takes a non-const reference as argument.\n      // Also, specifying template argument explicitly is needed because T could\n      // be a non-const reference (e.g. Matcher<Uncopyable&>).\n      ResultType result =\n          CallableTraits<Callable>::template Invoke<T>(callable_, obj);\n      return MatchPrintAndExplain(result, matcher_, listener);\n    }\n\n   private:\n    // Functors often define operator() as non-const method even though\n    // they are actually stateless. But we need to use them even when\n    // 'this' is a const pointer. It's the user's responsibility not to\n    // use stateful callables with ResultOf(), which doesn't guarantee\n    // how many times the callable will be invoked.\n    mutable CallableStorageType callable_;\n    const Matcher<ResultType> matcher_;\n\n    GTEST_DISALLOW_ASSIGN_(Impl);\n  };  // class Impl\n\n  const CallableStorageType callable_;\n  const InnerMatcher matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(ResultOfMatcher);\n};\n\n// Implements a matcher that checks the size of an STL-style container.\ntemplate <typename SizeMatcher>\nclass SizeIsMatcher {\n public:\n  explicit SizeIsMatcher(const SizeMatcher& size_matcher)\n       : size_matcher_(size_matcher) {\n  }\n\n  template <typename Container>\n  operator Matcher<Container>() const {\n    return MakeMatcher(new Impl<Container>(size_matcher_));\n  }\n\n  template <typename Container>\n  class Impl : public MatcherInterface<Container> {\n   public:\n    typedef internal::StlContainerView<\n         GTEST_REMOVE_REFERENCE_AND_CONST_(Container)> ContainerView;\n    typedef typename ContainerView::type::size_type SizeType;\n    explicit Impl(const SizeMatcher& size_matcher)\n        : size_matcher_(MatcherCast<SizeType>(size_matcher)) {}\n\n    virtual void DescribeTo(::std::ostream* os) const {\n      *os << \"size \";\n      size_matcher_.DescribeTo(os);\n    }\n    virtual void DescribeNegationTo(::std::ostream* os) const {\n      *os << \"size \";\n      size_matcher_.DescribeNegationTo(os);\n    }\n\n    virtual bool MatchAndExplain(Container container,\n                                 MatchResultListener* listener) const {\n      SizeType size = container.size();\n      StringMatchResultListener size_listener;\n      const bool result = size_matcher_.MatchAndExplain(size, &size_listener);\n      *listener\n          << \"whose size \" << size << (result ? \" matches\" : \" doesn't match\");\n      PrintIfNotEmpty(size_listener.str(), listener->stream());\n      return result;\n    }\n\n   private:\n    const Matcher<SizeType> size_matcher_;\n    GTEST_DISALLOW_ASSIGN_(Impl);\n  };\n\n private:\n  const SizeMatcher size_matcher_;\n  GTEST_DISALLOW_ASSIGN_(SizeIsMatcher);\n};\n\n// Implements a matcher that checks the begin()..end() distance of an STL-style\n// container.\ntemplate <typename DistanceMatcher>\nclass BeginEndDistanceIsMatcher {\n public:\n  explicit BeginEndDistanceIsMatcher(const DistanceMatcher& distance_matcher)\n      : distance_matcher_(distance_matcher) {}\n\n  template <typename Container>\n  operator Matcher<Container>() const {\n    return MakeMatcher(new Impl<Container>(distance_matcher_));\n  }\n\n  template <typename Container>\n  class Impl : public MatcherInterface<Container> {\n   public:\n    typedef internal::StlContainerView<\n        GTEST_REMOVE_REFERENCE_AND_CONST_(Container)> ContainerView;\n    typedef typename std::iterator_traits<\n        typename ContainerView::type::const_iterator>::difference_type\n        DistanceType;\n    explicit Impl(const DistanceMatcher& distance_matcher)\n        : distance_matcher_(MatcherCast<DistanceType>(distance_matcher)) {}\n\n    virtual void DescribeTo(::std::ostream* os) const {\n      *os << \"distance between begin() and end() \";\n      distance_matcher_.DescribeTo(os);\n    }\n    virtual void DescribeNegationTo(::std::ostream* os) const {\n      *os << \"distance between begin() and end() \";\n      distance_matcher_.DescribeNegationTo(os);\n    }\n\n    virtual bool MatchAndExplain(Container container,\n                                 MatchResultListener* listener) const {\n#if GTEST_HAS_STD_BEGIN_AND_END_\n      using std::begin;\n      using std::end;\n      DistanceType distance = std::distance(begin(container), end(container));\n#else\n      DistanceType distance = std::distance(container.begin(), container.end());\n#endif\n      StringMatchResultListener distance_listener;\n      const bool result =\n          distance_matcher_.MatchAndExplain(distance, &distance_listener);\n      *listener << \"whose distance between begin() and end() \" << distance\n                << (result ? \" matches\" : \" doesn't match\");\n      PrintIfNotEmpty(distance_listener.str(), listener->stream());\n      return result;\n    }\n\n   private:\n    const Matcher<DistanceType> distance_matcher_;\n    GTEST_DISALLOW_ASSIGN_(Impl);\n  };\n\n private:\n  const DistanceMatcher distance_matcher_;\n  GTEST_DISALLOW_ASSIGN_(BeginEndDistanceIsMatcher);\n};\n\n// Implements an equality matcher for any STL-style container whose elements\n// support ==. This matcher is like Eq(), but its failure explanations provide\n// more detailed information that is useful when the container is used as a set.\n// The failure message reports elements that are in one of the operands but not\n// the other. The failure messages do not report duplicate or out-of-order\n// elements in the containers (which don't properly matter to sets, but can\n// occur if the containers are vectors or lists, for example).\n//\n// Uses the container's const_iterator, value_type, operator ==,\n// begin(), and end().\ntemplate <typename Container>\nclass ContainerEqMatcher {\n public:\n  typedef internal::StlContainerView<Container> View;\n  typedef typename View::type StlContainer;\n  typedef typename View::const_reference StlContainerReference;\n\n  // We make a copy of expected in case the elements in it are modified\n  // after this matcher is created.\n  explicit ContainerEqMatcher(const Container& expected)\n      : expected_(View::Copy(expected)) {\n    // Makes sure the user doesn't instantiate this class template\n    // with a const or reference type.\n    (void)testing::StaticAssertTypeEq<Container,\n        GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>();\n  }\n\n  void DescribeTo(::std::ostream* os) const {\n    *os << \"equals \";\n    UniversalPrint(expected_, os);\n  }\n  void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"does not equal \";\n    UniversalPrint(expected_, os);\n  }\n\n  template <typename LhsContainer>\n  bool MatchAndExplain(const LhsContainer& lhs,\n                       MatchResultListener* listener) const {\n    // GTEST_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug\n    // that causes LhsContainer to be a const type sometimes.\n    typedef internal::StlContainerView<GTEST_REMOVE_CONST_(LhsContainer)>\n        LhsView;\n    typedef typename LhsView::type LhsStlContainer;\n    StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);\n    if (lhs_stl_container == expected_)\n      return true;\n\n    ::std::ostream* const os = listener->stream();\n    if (os != NULL) {\n      // Something is different. Check for extra values first.\n      bool printed_header = false;\n      for (typename LhsStlContainer::const_iterator it =\n               lhs_stl_container.begin();\n           it != lhs_stl_container.end(); ++it) {\n        if (internal::ArrayAwareFind(expected_.begin(), expected_.end(), *it) ==\n            expected_.end()) {\n          if (printed_header) {\n            *os << \", \";\n          } else {\n            *os << \"which has these unexpected elements: \";\n            printed_header = true;\n          }\n          UniversalPrint(*it, os);\n        }\n      }\n\n      // Now check for missing values.\n      bool printed_header2 = false;\n      for (typename StlContainer::const_iterator it = expected_.begin();\n           it != expected_.end(); ++it) {\n        if (internal::ArrayAwareFind(\n                lhs_stl_container.begin(), lhs_stl_container.end(), *it) ==\n            lhs_stl_container.end()) {\n          if (printed_header2) {\n            *os << \", \";\n          } else {\n            *os << (printed_header ? \",\\nand\" : \"which\")\n                << \" doesn't have these expected elements: \";\n            printed_header2 = true;\n          }\n          UniversalPrint(*it, os);\n        }\n      }\n    }\n\n    return false;\n  }\n\n private:\n  const StlContainer expected_;\n\n  GTEST_DISALLOW_ASSIGN_(ContainerEqMatcher);\n};\n\n// A comparator functor that uses the < operator to compare two values.\nstruct LessComparator {\n  template <typename T, typename U>\n  bool operator()(const T& lhs, const U& rhs) const { return lhs < rhs; }\n};\n\n// Implements WhenSortedBy(comparator, container_matcher).\ntemplate <typename Comparator, typename ContainerMatcher>\nclass WhenSortedByMatcher {\n public:\n  WhenSortedByMatcher(const Comparator& comparator,\n                      const ContainerMatcher& matcher)\n      : comparator_(comparator), matcher_(matcher) {}\n\n  template <typename LhsContainer>\n  operator Matcher<LhsContainer>() const {\n    return MakeMatcher(new Impl<LhsContainer>(comparator_, matcher_));\n  }\n\n  template <typename LhsContainer>\n  class Impl : public MatcherInterface<LhsContainer> {\n   public:\n    typedef internal::StlContainerView<\n         GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)> LhsView;\n    typedef typename LhsView::type LhsStlContainer;\n    typedef typename LhsView::const_reference LhsStlContainerReference;\n    // Transforms std::pair<const Key, Value> into std::pair<Key, Value>\n    // so that we can match associative containers.\n    typedef typename RemoveConstFromKey<\n        typename LhsStlContainer::value_type>::type LhsValue;\n\n    Impl(const Comparator& comparator, const ContainerMatcher& matcher)\n        : comparator_(comparator), matcher_(matcher) {}\n\n    virtual void DescribeTo(::std::ostream* os) const {\n      *os << \"(when sorted) \";\n      matcher_.DescribeTo(os);\n    }\n\n    virtual void DescribeNegationTo(::std::ostream* os) const {\n      *os << \"(when sorted) \";\n      matcher_.DescribeNegationTo(os);\n    }\n\n    virtual bool MatchAndExplain(LhsContainer lhs,\n                                 MatchResultListener* listener) const {\n      LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);\n      ::std::vector<LhsValue> sorted_container(lhs_stl_container.begin(),\n                                               lhs_stl_container.end());\n      ::std::sort(\n           sorted_container.begin(), sorted_container.end(), comparator_);\n\n      if (!listener->IsInterested()) {\n        // If the listener is not interested, we do not need to\n        // construct the inner explanation.\n        return matcher_.Matches(sorted_container);\n      }\n\n      *listener << \"which is \";\n      UniversalPrint(sorted_container, listener->stream());\n      *listener << \" when sorted\";\n\n      StringMatchResultListener inner_listener;\n      const bool match = matcher_.MatchAndExplain(sorted_container,\n                                                  &inner_listener);\n      PrintIfNotEmpty(inner_listener.str(), listener->stream());\n      return match;\n    }\n\n   private:\n    const Comparator comparator_;\n    const Matcher<const ::std::vector<LhsValue>&> matcher_;\n\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(Impl);\n  };\n\n private:\n  const Comparator comparator_;\n  const ContainerMatcher matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(WhenSortedByMatcher);\n};\n\n// Implements Pointwise(tuple_matcher, rhs_container).  tuple_matcher\n// must be able to be safely cast to Matcher<tuple<const T1&, const\n// T2&> >, where T1 and T2 are the types of elements in the LHS\n// container and the RHS container respectively.\ntemplate <typename TupleMatcher, typename RhsContainer>\nclass PointwiseMatcher {\n  GTEST_COMPILE_ASSERT_(\n      !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(RhsContainer)>::value,\n      use_UnorderedPointwise_with_hash_tables);\n\n public:\n  typedef internal::StlContainerView<RhsContainer> RhsView;\n  typedef typename RhsView::type RhsStlContainer;\n  typedef typename RhsStlContainer::value_type RhsValue;\n\n  // Like ContainerEq, we make a copy of rhs in case the elements in\n  // it are modified after this matcher is created.\n  PointwiseMatcher(const TupleMatcher& tuple_matcher, const RhsContainer& rhs)\n      : tuple_matcher_(tuple_matcher), rhs_(RhsView::Copy(rhs)) {\n    // Makes sure the user doesn't instantiate this class template\n    // with a const or reference type.\n    (void)testing::StaticAssertTypeEq<RhsContainer,\n        GTEST_REMOVE_REFERENCE_AND_CONST_(RhsContainer)>();\n  }\n\n  template <typename LhsContainer>\n  operator Matcher<LhsContainer>() const {\n    GTEST_COMPILE_ASSERT_(\n        !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)>::value,\n        use_UnorderedPointwise_with_hash_tables);\n\n    return MakeMatcher(new Impl<LhsContainer>(tuple_matcher_, rhs_));\n  }\n\n  template <typename LhsContainer>\n  class Impl : public MatcherInterface<LhsContainer> {\n   public:\n    typedef internal::StlContainerView<\n         GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)> LhsView;\n    typedef typename LhsView::type LhsStlContainer;\n    typedef typename LhsView::const_reference LhsStlContainerReference;\n    typedef typename LhsStlContainer::value_type LhsValue;\n    // We pass the LHS value and the RHS value to the inner matcher by\n    // reference, as they may be expensive to copy.  We must use tuple\n    // instead of pair here, as a pair cannot hold references (C++ 98,\n    // 20.2.2 [lib.pairs]).\n    typedef ::testing::tuple<const LhsValue&, const RhsValue&> InnerMatcherArg;\n\n    Impl(const TupleMatcher& tuple_matcher, const RhsStlContainer& rhs)\n        // mono_tuple_matcher_ holds a monomorphic version of the tuple matcher.\n        : mono_tuple_matcher_(SafeMatcherCast<InnerMatcherArg>(tuple_matcher)),\n          rhs_(rhs) {}\n\n    virtual void DescribeTo(::std::ostream* os) const {\n      *os << \"contains \" << rhs_.size()\n          << \" values, where each value and its corresponding value in \";\n      UniversalPrinter<RhsStlContainer>::Print(rhs_, os);\n      *os << \" \";\n      mono_tuple_matcher_.DescribeTo(os);\n    }\n    virtual void DescribeNegationTo(::std::ostream* os) const {\n      *os << \"doesn't contain exactly \" << rhs_.size()\n          << \" values, or contains a value x at some index i\"\n          << \" where x and the i-th value of \";\n      UniversalPrint(rhs_, os);\n      *os << \" \";\n      mono_tuple_matcher_.DescribeNegationTo(os);\n    }\n\n    virtual bool MatchAndExplain(LhsContainer lhs,\n                                 MatchResultListener* listener) const {\n      LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);\n      const size_t actual_size = lhs_stl_container.size();\n      if (actual_size != rhs_.size()) {\n        *listener << \"which contains \" << actual_size << \" values\";\n        return false;\n      }\n\n      typename LhsStlContainer::const_iterator left = lhs_stl_container.begin();\n      typename RhsStlContainer::const_iterator right = rhs_.begin();\n      for (size_t i = 0; i != actual_size; ++i, ++left, ++right) {\n        if (listener->IsInterested()) {\n          StringMatchResultListener inner_listener;\n          // Create InnerMatcherArg as a temporarily object to avoid it outlives\n          // *left and *right. Dereference or the conversion to `const T&` may\n          // return temp objects, e.g for vector<bool>.\n          if (!mono_tuple_matcher_.MatchAndExplain(\n                  InnerMatcherArg(ImplicitCast_<const LhsValue&>(*left),\n                                  ImplicitCast_<const RhsValue&>(*right)),\n                  &inner_listener)) {\n            *listener << \"where the value pair (\";\n            UniversalPrint(*left, listener->stream());\n            *listener << \", \";\n            UniversalPrint(*right, listener->stream());\n            *listener << \") at index #\" << i << \" don't match\";\n            PrintIfNotEmpty(inner_listener.str(), listener->stream());\n            return false;\n          }\n        } else {\n          if (!mono_tuple_matcher_.Matches(\n                  InnerMatcherArg(ImplicitCast_<const LhsValue&>(*left),\n                                  ImplicitCast_<const RhsValue&>(*right))))\n            return false;\n        }\n      }\n\n      return true;\n    }\n\n   private:\n    const Matcher<InnerMatcherArg> mono_tuple_matcher_;\n    const RhsStlContainer rhs_;\n\n    GTEST_DISALLOW_ASSIGN_(Impl);\n  };\n\n private:\n  const TupleMatcher tuple_matcher_;\n  const RhsStlContainer rhs_;\n\n  GTEST_DISALLOW_ASSIGN_(PointwiseMatcher);\n};\n\n// Holds the logic common to ContainsMatcherImpl and EachMatcherImpl.\ntemplate <typename Container>\nclass QuantifierMatcherImpl : public MatcherInterface<Container> {\n public:\n  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;\n  typedef StlContainerView<RawContainer> View;\n  typedef typename View::type StlContainer;\n  typedef typename View::const_reference StlContainerReference;\n  typedef typename StlContainer::value_type Element;\n\n  template <typename InnerMatcher>\n  explicit QuantifierMatcherImpl(InnerMatcher inner_matcher)\n      : inner_matcher_(\n           testing::SafeMatcherCast<const Element&>(inner_matcher)) {}\n\n  // Checks whether:\n  // * All elements in the container match, if all_elements_should_match.\n  // * Any element in the container matches, if !all_elements_should_match.\n  bool MatchAndExplainImpl(bool all_elements_should_match,\n                           Container container,\n                           MatchResultListener* listener) const {\n    StlContainerReference stl_container = View::ConstReference(container);\n    size_t i = 0;\n    for (typename StlContainer::const_iterator it = stl_container.begin();\n         it != stl_container.end(); ++it, ++i) {\n      StringMatchResultListener inner_listener;\n      const bool matches = inner_matcher_.MatchAndExplain(*it, &inner_listener);\n\n      if (matches != all_elements_should_match) {\n        *listener << \"whose element #\" << i\n                  << (matches ? \" matches\" : \" doesn't match\");\n        PrintIfNotEmpty(inner_listener.str(), listener->stream());\n        return !all_elements_should_match;\n      }\n    }\n    return all_elements_should_match;\n  }\n\n protected:\n  const Matcher<const Element&> inner_matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(QuantifierMatcherImpl);\n};\n\n// Implements Contains(element_matcher) for the given argument type Container.\n// Symmetric to EachMatcherImpl.\ntemplate <typename Container>\nclass ContainsMatcherImpl : public QuantifierMatcherImpl<Container> {\n public:\n  template <typename InnerMatcher>\n  explicit ContainsMatcherImpl(InnerMatcher inner_matcher)\n      : QuantifierMatcherImpl<Container>(inner_matcher) {}\n\n  // Describes what this matcher does.\n  virtual void DescribeTo(::std::ostream* os) const {\n    *os << \"contains at least one element that \";\n    this->inner_matcher_.DescribeTo(os);\n  }\n\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"doesn't contain any element that \";\n    this->inner_matcher_.DescribeTo(os);\n  }\n\n  virtual bool MatchAndExplain(Container container,\n                               MatchResultListener* listener) const {\n    return this->MatchAndExplainImpl(false, container, listener);\n  }\n\n private:\n  GTEST_DISALLOW_ASSIGN_(ContainsMatcherImpl);\n};\n\n// Implements Each(element_matcher) for the given argument type Container.\n// Symmetric to ContainsMatcherImpl.\ntemplate <typename Container>\nclass EachMatcherImpl : public QuantifierMatcherImpl<Container> {\n public:\n  template <typename InnerMatcher>\n  explicit EachMatcherImpl(InnerMatcher inner_matcher)\n      : QuantifierMatcherImpl<Container>(inner_matcher) {}\n\n  // Describes what this matcher does.\n  virtual void DescribeTo(::std::ostream* os) const {\n    *os << \"only contains elements that \";\n    this->inner_matcher_.DescribeTo(os);\n  }\n\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"contains some element that \";\n    this->inner_matcher_.DescribeNegationTo(os);\n  }\n\n  virtual bool MatchAndExplain(Container container,\n                               MatchResultListener* listener) const {\n    return this->MatchAndExplainImpl(true, container, listener);\n  }\n\n private:\n  GTEST_DISALLOW_ASSIGN_(EachMatcherImpl);\n};\n\n// Implements polymorphic Contains(element_matcher).\ntemplate <typename M>\nclass ContainsMatcher {\n public:\n  explicit ContainsMatcher(M m) : inner_matcher_(m) {}\n\n  template <typename Container>\n  operator Matcher<Container>() const {\n    return MakeMatcher(new ContainsMatcherImpl<Container>(inner_matcher_));\n  }\n\n private:\n  const M inner_matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(ContainsMatcher);\n};\n\n// Implements polymorphic Each(element_matcher).\ntemplate <typename M>\nclass EachMatcher {\n public:\n  explicit EachMatcher(M m) : inner_matcher_(m) {}\n\n  template <typename Container>\n  operator Matcher<Container>() const {\n    return MakeMatcher(new EachMatcherImpl<Container>(inner_matcher_));\n  }\n\n private:\n  const M inner_matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(EachMatcher);\n};\n\nstruct Rank1 {};\nstruct Rank0 : Rank1 {};\n\nnamespace pair_getters {\n#if GTEST_LANG_CXX11\nusing std::get;\ntemplate <typename T>\nauto First(T& x, Rank1) -> decltype(get<0>(x)) {  // NOLINT\n  return get<0>(x);\n}\ntemplate <typename T>\nauto First(T& x, Rank0) -> decltype((x.first)) {  // NOLINT\n  return x.first;\n}\n\ntemplate <typename T>\nauto Second(T& x, Rank1) -> decltype(get<1>(x)) {  // NOLINT\n  return get<1>(x);\n}\ntemplate <typename T>\nauto Second(T& x, Rank0) -> decltype((x.second)) {  // NOLINT\n  return x.second;\n}\n#else\ntemplate <typename T>\ntypename T::first_type& First(T& x, Rank0) {  // NOLINT\n  return x.first;\n}\ntemplate <typename T>\nconst typename T::first_type& First(const T& x, Rank0) {\n  return x.first;\n}\n\ntemplate <typename T>\ntypename T::second_type& Second(T& x, Rank0) {  // NOLINT\n  return x.second;\n}\ntemplate <typename T>\nconst typename T::second_type& Second(const T& x, Rank0) {\n  return x.second;\n}\n#endif  // GTEST_LANG_CXX11\n}  // namespace pair_getters\n\n// Implements Key(inner_matcher) for the given argument pair type.\n// Key(inner_matcher) matches an std::pair whose 'first' field matches\n// inner_matcher.  For example, Contains(Key(Ge(5))) can be used to match an\n// std::map that contains at least one element whose key is >= 5.\ntemplate <typename PairType>\nclass KeyMatcherImpl : public MatcherInterface<PairType> {\n public:\n  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType;\n  typedef typename RawPairType::first_type KeyType;\n\n  template <typename InnerMatcher>\n  explicit KeyMatcherImpl(InnerMatcher inner_matcher)\n      : inner_matcher_(\n          testing::SafeMatcherCast<const KeyType&>(inner_matcher)) {\n  }\n\n  // Returns true iff 'key_value.first' (the key) matches the inner matcher.\n  virtual bool MatchAndExplain(PairType key_value,\n                               MatchResultListener* listener) const {\n    StringMatchResultListener inner_listener;\n    const bool match = inner_matcher_.MatchAndExplain(\n        pair_getters::First(key_value, Rank0()), &inner_listener);\n    const std::string explanation = inner_listener.str();\n    if (explanation != \"\") {\n      *listener << \"whose first field is a value \" << explanation;\n    }\n    return match;\n  }\n\n  // Describes what this matcher does.\n  virtual void DescribeTo(::std::ostream* os) const {\n    *os << \"has a key that \";\n    inner_matcher_.DescribeTo(os);\n  }\n\n  // Describes what the negation of this matcher does.\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"doesn't have a key that \";\n    inner_matcher_.DescribeTo(os);\n  }\n\n private:\n  const Matcher<const KeyType&> inner_matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(KeyMatcherImpl);\n};\n\n// Implements polymorphic Key(matcher_for_key).\ntemplate <typename M>\nclass KeyMatcher {\n public:\n  explicit KeyMatcher(M m) : matcher_for_key_(m) {}\n\n  template <typename PairType>\n  operator Matcher<PairType>() const {\n    return MakeMatcher(new KeyMatcherImpl<PairType>(matcher_for_key_));\n  }\n\n private:\n  const M matcher_for_key_;\n\n  GTEST_DISALLOW_ASSIGN_(KeyMatcher);\n};\n\n// Implements Pair(first_matcher, second_matcher) for the given argument pair\n// type with its two matchers. See Pair() function below.\ntemplate <typename PairType>\nclass PairMatcherImpl : public MatcherInterface<PairType> {\n public:\n  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType;\n  typedef typename RawPairType::first_type FirstType;\n  typedef typename RawPairType::second_type SecondType;\n\n  template <typename FirstMatcher, typename SecondMatcher>\n  PairMatcherImpl(FirstMatcher first_matcher, SecondMatcher second_matcher)\n      : first_matcher_(\n            testing::SafeMatcherCast<const FirstType&>(first_matcher)),\n        second_matcher_(\n            testing::SafeMatcherCast<const SecondType&>(second_matcher)) {\n  }\n\n  // Describes what this matcher does.\n  virtual void DescribeTo(::std::ostream* os) const {\n    *os << \"has a first field that \";\n    first_matcher_.DescribeTo(os);\n    *os << \", and has a second field that \";\n    second_matcher_.DescribeTo(os);\n  }\n\n  // Describes what the negation of this matcher does.\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    *os << \"has a first field that \";\n    first_matcher_.DescribeNegationTo(os);\n    *os << \", or has a second field that \";\n    second_matcher_.DescribeNegationTo(os);\n  }\n\n  // Returns true iff 'a_pair.first' matches first_matcher and 'a_pair.second'\n  // matches second_matcher.\n  virtual bool MatchAndExplain(PairType a_pair,\n                               MatchResultListener* listener) const {\n    if (!listener->IsInterested()) {\n      // If the listener is not interested, we don't need to construct the\n      // explanation.\n      return first_matcher_.Matches(pair_getters::First(a_pair, Rank0())) &&\n             second_matcher_.Matches(pair_getters::Second(a_pair, Rank0()));\n    }\n    StringMatchResultListener first_inner_listener;\n    if (!first_matcher_.MatchAndExplain(pair_getters::First(a_pair, Rank0()),\n                                        &first_inner_listener)) {\n      *listener << \"whose first field does not match\";\n      PrintIfNotEmpty(first_inner_listener.str(), listener->stream());\n      return false;\n    }\n    StringMatchResultListener second_inner_listener;\n    if (!second_matcher_.MatchAndExplain(pair_getters::Second(a_pair, Rank0()),\n                                         &second_inner_listener)) {\n      *listener << \"whose second field does not match\";\n      PrintIfNotEmpty(second_inner_listener.str(), listener->stream());\n      return false;\n    }\n    ExplainSuccess(first_inner_listener.str(), second_inner_listener.str(),\n                   listener);\n    return true;\n  }\n\n private:\n  void ExplainSuccess(const std::string& first_explanation,\n                      const std::string& second_explanation,\n                      MatchResultListener* listener) const {\n    *listener << \"whose both fields match\";\n    if (first_explanation != \"\") {\n      *listener << \", where the first field is a value \" << first_explanation;\n    }\n    if (second_explanation != \"\") {\n      *listener << \", \";\n      if (first_explanation != \"\") {\n        *listener << \"and \";\n      } else {\n        *listener << \"where \";\n      }\n      *listener << \"the second field is a value \" << second_explanation;\n    }\n  }\n\n  const Matcher<const FirstType&> first_matcher_;\n  const Matcher<const SecondType&> second_matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(PairMatcherImpl);\n};\n\n// Implements polymorphic Pair(first_matcher, second_matcher).\ntemplate <typename FirstMatcher, typename SecondMatcher>\nclass PairMatcher {\n public:\n  PairMatcher(FirstMatcher first_matcher, SecondMatcher second_matcher)\n      : first_matcher_(first_matcher), second_matcher_(second_matcher) {}\n\n  template <typename PairType>\n  operator Matcher<PairType> () const {\n    return MakeMatcher(\n        new PairMatcherImpl<PairType>(\n            first_matcher_, second_matcher_));\n  }\n\n private:\n  const FirstMatcher first_matcher_;\n  const SecondMatcher second_matcher_;\n\n  GTEST_DISALLOW_ASSIGN_(PairMatcher);\n};\n\n// Implements ElementsAre() and ElementsAreArray().\ntemplate <typename Container>\nclass ElementsAreMatcherImpl : public MatcherInterface<Container> {\n public:\n  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;\n  typedef internal::StlContainerView<RawContainer> View;\n  typedef typename View::type StlContainer;\n  typedef typename View::const_reference StlContainerReference;\n  typedef typename StlContainer::value_type Element;\n\n  // Constructs the matcher from a sequence of element values or\n  // element matchers.\n  template <typename InputIter>\n  ElementsAreMatcherImpl(InputIter first, InputIter last) {\n    while (first != last) {\n      matchers_.push_back(MatcherCast<const Element&>(*first++));\n    }\n  }\n\n  // Describes what this matcher does.\n  virtual void DescribeTo(::std::ostream* os) const {\n    if (count() == 0) {\n      *os << \"is empty\";\n    } else if (count() == 1) {\n      *os << \"has 1 element that \";\n      matchers_[0].DescribeTo(os);\n    } else {\n      *os << \"has \" << Elements(count()) << \" where\\n\";\n      for (size_t i = 0; i != count(); ++i) {\n        *os << \"element #\" << i << \" \";\n        matchers_[i].DescribeTo(os);\n        if (i + 1 < count()) {\n          *os << \",\\n\";\n        }\n      }\n    }\n  }\n\n  // Describes what the negation of this matcher does.\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    if (count() == 0) {\n      *os << \"isn't empty\";\n      return;\n    }\n\n    *os << \"doesn't have \" << Elements(count()) << \", or\\n\";\n    for (size_t i = 0; i != count(); ++i) {\n      *os << \"element #\" << i << \" \";\n      matchers_[i].DescribeNegationTo(os);\n      if (i + 1 < count()) {\n        *os << \", or\\n\";\n      }\n    }\n  }\n\n  virtual bool MatchAndExplain(Container container,\n                               MatchResultListener* listener) const {\n    // To work with stream-like \"containers\", we must only walk\n    // through the elements in one pass.\n\n    const bool listener_interested = listener->IsInterested();\n\n    // explanations[i] is the explanation of the element at index i.\n    ::std::vector<std::string> explanations(count());\n    StlContainerReference stl_container = View::ConstReference(container);\n    typename StlContainer::const_iterator it = stl_container.begin();\n    size_t exam_pos = 0;\n    bool mismatch_found = false;  // Have we found a mismatched element yet?\n\n    // Go through the elements and matchers in pairs, until we reach\n    // the end of either the elements or the matchers, or until we find a\n    // mismatch.\n    for (; it != stl_container.end() && exam_pos != count(); ++it, ++exam_pos) {\n      bool match;  // Does the current element match the current matcher?\n      if (listener_interested) {\n        StringMatchResultListener s;\n        match = matchers_[exam_pos].MatchAndExplain(*it, &s);\n        explanations[exam_pos] = s.str();\n      } else {\n        match = matchers_[exam_pos].Matches(*it);\n      }\n\n      if (!match) {\n        mismatch_found = true;\n        break;\n      }\n    }\n    // If mismatch_found is true, 'exam_pos' is the index of the mismatch.\n\n    // Find how many elements the actual container has.  We avoid\n    // calling size() s.t. this code works for stream-like \"containers\"\n    // that don't define size().\n    size_t actual_count = exam_pos;\n    for (; it != stl_container.end(); ++it) {\n      ++actual_count;\n    }\n\n    if (actual_count != count()) {\n      // The element count doesn't match.  If the container is empty,\n      // there's no need to explain anything as Google Mock already\n      // prints the empty container.  Otherwise we just need to show\n      // how many elements there actually are.\n      if (listener_interested && (actual_count != 0)) {\n        *listener << \"which has \" << Elements(actual_count);\n      }\n      return false;\n    }\n\n    if (mismatch_found) {\n      // The element count matches, but the exam_pos-th element doesn't match.\n      if (listener_interested) {\n        *listener << \"whose element #\" << exam_pos << \" doesn't match\";\n        PrintIfNotEmpty(explanations[exam_pos], listener->stream());\n      }\n      return false;\n    }\n\n    // Every element matches its expectation.  We need to explain why\n    // (the obvious ones can be skipped).\n    if (listener_interested) {\n      bool reason_printed = false;\n      for (size_t i = 0; i != count(); ++i) {\n        const std::string& s = explanations[i];\n        if (!s.empty()) {\n          if (reason_printed) {\n            *listener << \",\\nand \";\n          }\n          *listener << \"whose element #\" << i << \" matches, \" << s;\n          reason_printed = true;\n        }\n      }\n    }\n    return true;\n  }\n\n private:\n  static Message Elements(size_t count) {\n    return Message() << count << (count == 1 ? \" element\" : \" elements\");\n  }\n\n  size_t count() const { return matchers_.size(); }\n\n  ::std::vector<Matcher<const Element&> > matchers_;\n\n  GTEST_DISALLOW_ASSIGN_(ElementsAreMatcherImpl);\n};\n\n// Connectivity matrix of (elements X matchers), in element-major order.\n// Initially, there are no edges.\n// Use NextGraph() to iterate over all possible edge configurations.\n// Use Randomize() to generate a random edge configuration.\nclass GTEST_API_ MatchMatrix {\n public:\n  MatchMatrix(size_t num_elements, size_t num_matchers)\n      : num_elements_(num_elements),\n        num_matchers_(num_matchers),\n        matched_(num_elements_* num_matchers_, 0) {\n  }\n\n  size_t LhsSize() const { return num_elements_; }\n  size_t RhsSize() const { return num_matchers_; }\n  bool HasEdge(size_t ilhs, size_t irhs) const {\n    return matched_[SpaceIndex(ilhs, irhs)] == 1;\n  }\n  void SetEdge(size_t ilhs, size_t irhs, bool b) {\n    matched_[SpaceIndex(ilhs, irhs)] = b ? 1 : 0;\n  }\n\n  // Treating the connectivity matrix as a (LhsSize()*RhsSize())-bit number,\n  // adds 1 to that number; returns false if incrementing the graph left it\n  // empty.\n  bool NextGraph();\n\n  void Randomize();\n\n  std::string DebugString() const;\n\n private:\n  size_t SpaceIndex(size_t ilhs, size_t irhs) const {\n    return ilhs * num_matchers_ + irhs;\n  }\n\n  size_t num_elements_;\n  size_t num_matchers_;\n\n  // Each element is a char interpreted as bool. They are stored as a\n  // flattened array in lhs-major order, use 'SpaceIndex()' to translate\n  // a (ilhs, irhs) matrix coordinate into an offset.\n  ::std::vector<char> matched_;\n};\n\ntypedef ::std::pair<size_t, size_t> ElementMatcherPair;\ntypedef ::std::vector<ElementMatcherPair> ElementMatcherPairs;\n\n// Returns a maximum bipartite matching for the specified graph 'g'.\n// The matching is represented as a vector of {element, matcher} pairs.\nGTEST_API_ ElementMatcherPairs\nFindMaxBipartiteMatching(const MatchMatrix& g);\n\nstruct UnorderedMatcherRequire {\n  enum Flags {\n    Superset = 1 << 0,\n    Subset = 1 << 1,\n    ExactMatch = Superset | Subset,\n  };\n};\n\n// Untyped base class for implementing UnorderedElementsAre.  By\n// putting logic that's not specific to the element type here, we\n// reduce binary bloat and increase compilation speed.\nclass GTEST_API_ UnorderedElementsAreMatcherImplBase {\n protected:\n  explicit UnorderedElementsAreMatcherImplBase(\n      UnorderedMatcherRequire::Flags matcher_flags)\n      : match_flags_(matcher_flags) {}\n\n  // A vector of matcher describers, one for each element matcher.\n  // Does not own the describers (and thus can be used only when the\n  // element matchers are alive).\n  typedef ::std::vector<const MatcherDescriberInterface*> MatcherDescriberVec;\n\n  // Describes this UnorderedElementsAre matcher.\n  void DescribeToImpl(::std::ostream* os) const;\n\n  // Describes the negation of this UnorderedElementsAre matcher.\n  void DescribeNegationToImpl(::std::ostream* os) const;\n\n  bool VerifyMatchMatrix(const ::std::vector<std::string>& element_printouts,\n                         const MatchMatrix& matrix,\n                         MatchResultListener* listener) const;\n\n  bool FindPairing(const MatchMatrix& matrix,\n                   MatchResultListener* listener) const;\n\n  MatcherDescriberVec& matcher_describers() {\n    return matcher_describers_;\n  }\n\n  static Message Elements(size_t n) {\n    return Message() << n << \" element\" << (n == 1 ? \"\" : \"s\");\n  }\n\n  UnorderedMatcherRequire::Flags match_flags() const { return match_flags_; }\n\n private:\n  UnorderedMatcherRequire::Flags match_flags_;\n  MatcherDescriberVec matcher_describers_;\n\n  GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreMatcherImplBase);\n};\n\n// Implements UnorderedElementsAre, UnorderedElementsAreArray, IsSubsetOf, and\n// IsSupersetOf.\ntemplate <typename Container>\nclass UnorderedElementsAreMatcherImpl\n    : public MatcherInterface<Container>,\n      public UnorderedElementsAreMatcherImplBase {\n public:\n  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;\n  typedef internal::StlContainerView<RawContainer> View;\n  typedef typename View::type StlContainer;\n  typedef typename View::const_reference StlContainerReference;\n  typedef typename StlContainer::const_iterator StlContainerConstIterator;\n  typedef typename StlContainer::value_type Element;\n\n  template <typename InputIter>\n  UnorderedElementsAreMatcherImpl(UnorderedMatcherRequire::Flags matcher_flags,\n                                  InputIter first, InputIter last)\n      : UnorderedElementsAreMatcherImplBase(matcher_flags) {\n    for (; first != last; ++first) {\n      matchers_.push_back(MatcherCast<const Element&>(*first));\n      matcher_describers().push_back(matchers_.back().GetDescriber());\n    }\n  }\n\n  // Describes what this matcher does.\n  virtual void DescribeTo(::std::ostream* os) const {\n    return UnorderedElementsAreMatcherImplBase::DescribeToImpl(os);\n  }\n\n  // Describes what the negation of this matcher does.\n  virtual void DescribeNegationTo(::std::ostream* os) const {\n    return UnorderedElementsAreMatcherImplBase::DescribeNegationToImpl(os);\n  }\n\n  virtual bool MatchAndExplain(Container container,\n                               MatchResultListener* listener) const {\n    StlContainerReference stl_container = View::ConstReference(container);\n    ::std::vector<std::string> element_printouts;\n    MatchMatrix matrix =\n        AnalyzeElements(stl_container.begin(), stl_container.end(),\n                        &element_printouts, listener);\n\n    if (matrix.LhsSize() == 0 && matrix.RhsSize() == 0) {\n      return true;\n    }\n\n    if (match_flags() == UnorderedMatcherRequire::ExactMatch) {\n      if (matrix.LhsSize() != matrix.RhsSize()) {\n        // The element count doesn't match.  If the container is empty,\n        // there's no need to explain anything as Google Mock already\n        // prints the empty container. Otherwise we just need to show\n        // how many elements there actually are.\n        if (matrix.LhsSize() != 0 && listener->IsInterested()) {\n          *listener << \"which has \" << Elements(matrix.LhsSize());\n        }\n        return false;\n      }\n    }\n\n    return VerifyMatchMatrix(element_printouts, matrix, listener) &&\n           FindPairing(matrix, listener);\n  }\n\n private:\n  template <typename ElementIter>\n  MatchMatrix AnalyzeElements(ElementIter elem_first, ElementIter elem_last,\n                              ::std::vector<std::string>* element_printouts,\n                              MatchResultListener* listener) const {\n    element_printouts->clear();\n    ::std::vector<char> did_match;\n    size_t num_elements = 0;\n    for (; elem_first != elem_last; ++num_elements, ++elem_first) {\n      if (listener->IsInterested()) {\n        element_printouts->push_back(PrintToString(*elem_first));\n      }\n      for (size_t irhs = 0; irhs != matchers_.size(); ++irhs) {\n        did_match.push_back(Matches(matchers_[irhs])(*elem_first));\n      }\n    }\n\n    MatchMatrix matrix(num_elements, matchers_.size());\n    ::std::vector<char>::const_iterator did_match_iter = did_match.begin();\n    for (size_t ilhs = 0; ilhs != num_elements; ++ilhs) {\n      for (size_t irhs = 0; irhs != matchers_.size(); ++irhs) {\n        matrix.SetEdge(ilhs, irhs, *did_match_iter++ != 0);\n      }\n    }\n    return matrix;\n  }\n\n  ::std::vector<Matcher<const Element&> > matchers_;\n\n  GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreMatcherImpl);\n};\n\n// Functor for use in TransformTuple.\n// Performs MatcherCast<Target> on an input argument of any type.\ntemplate <typename Target>\nstruct CastAndAppendTransform {\n  template <typename Arg>\n  Matcher<Target> operator()(const Arg& a) const {\n    return MatcherCast<Target>(a);\n  }\n};\n\n// Implements UnorderedElementsAre.\ntemplate <typename MatcherTuple>\nclass UnorderedElementsAreMatcher {\n public:\n  explicit UnorderedElementsAreMatcher(const MatcherTuple& args)\n      : matchers_(args) {}\n\n  template <typename Container>\n  operator Matcher<Container>() const {\n    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;\n    typedef typename internal::StlContainerView<RawContainer>::type View;\n    typedef typename View::value_type Element;\n    typedef ::std::vector<Matcher<const Element&> > MatcherVec;\n    MatcherVec matchers;\n    matchers.reserve(::testing::tuple_size<MatcherTuple>::value);\n    TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,\n                         ::std::back_inserter(matchers));\n    return MakeMatcher(new UnorderedElementsAreMatcherImpl<Container>(\n        UnorderedMatcherRequire::ExactMatch, matchers.begin(), matchers.end()));\n  }\n\n private:\n  const MatcherTuple matchers_;\n  GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreMatcher);\n};\n\n// Implements ElementsAre.\ntemplate <typename MatcherTuple>\nclass ElementsAreMatcher {\n public:\n  explicit ElementsAreMatcher(const MatcherTuple& args) : matchers_(args) {}\n\n  template <typename Container>\n  operator Matcher<Container>() const {\n    GTEST_COMPILE_ASSERT_(\n        !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>::value ||\n            ::testing::tuple_size<MatcherTuple>::value < 2,\n        use_UnorderedElementsAre_with_hash_tables);\n\n    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;\n    typedef typename internal::StlContainerView<RawContainer>::type View;\n    typedef typename View::value_type Element;\n    typedef ::std::vector<Matcher<const Element&> > MatcherVec;\n    MatcherVec matchers;\n    matchers.reserve(::testing::tuple_size<MatcherTuple>::value);\n    TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,\n                         ::std::back_inserter(matchers));\n    return MakeMatcher(new ElementsAreMatcherImpl<Container>(\n                           matchers.begin(), matchers.end()));\n  }\n\n private:\n  const MatcherTuple matchers_;\n  GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher);\n};\n\n// Implements UnorderedElementsAreArray(), IsSubsetOf(), and IsSupersetOf().\ntemplate <typename T>\nclass UnorderedElementsAreArrayMatcher {\n public:\n  template <typename Iter>\n  UnorderedElementsAreArrayMatcher(UnorderedMatcherRequire::Flags match_flags,\n                                   Iter first, Iter last)\n      : match_flags_(match_flags), matchers_(first, last) {}\n\n  template <typename Container>\n  operator Matcher<Container>() const {\n    return MakeMatcher(new UnorderedElementsAreMatcherImpl<Container>(\n        match_flags_, matchers_.begin(), matchers_.end()));\n  }\n\n private:\n  UnorderedMatcherRequire::Flags match_flags_;\n  ::std::vector<T> matchers_;\n\n  GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreArrayMatcher);\n};\n\n// Implements ElementsAreArray().\ntemplate <typename T>\nclass ElementsAreArrayMatcher {\n public:\n  template <typename Iter>\n  ElementsAreArrayMatcher(Iter first, Iter last) : matchers_(first, last) {}\n\n  template <typename Container>\n  operator Matcher<Container>() const {\n    GTEST_COMPILE_ASSERT_(\n        !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>::value,\n        use_UnorderedElementsAreArray_with_hash_tables);\n\n    return MakeMatcher(new ElementsAreMatcherImpl<Container>(\n        matchers_.begin(), matchers_.end()));\n  }\n\n private:\n  const ::std::vector<T> matchers_;\n\n  GTEST_DISALLOW_ASSIGN_(ElementsAreArrayMatcher);\n};\n\n// Given a 2-tuple matcher tm of type Tuple2Matcher and a value second\n// of type Second, BoundSecondMatcher<Tuple2Matcher, Second>(tm,\n// second) is a polymorphic matcher that matches a value x iff tm\n// matches tuple (x, second).  Useful for implementing\n// UnorderedPointwise() in terms of UnorderedElementsAreArray().\n//\n// BoundSecondMatcher is copyable and assignable, as we need to put\n// instances of this class in a vector when implementing\n// UnorderedPointwise().\ntemplate <typename Tuple2Matcher, typename Second>\nclass BoundSecondMatcher {\n public:\n  BoundSecondMatcher(const Tuple2Matcher& tm, const Second& second)\n      : tuple2_matcher_(tm), second_value_(second) {}\n\n  template <typename T>\n  operator Matcher<T>() const {\n    return MakeMatcher(new Impl<T>(tuple2_matcher_, second_value_));\n  }\n\n  // We have to define this for UnorderedPointwise() to compile in\n  // C++98 mode, as it puts BoundSecondMatcher instances in a vector,\n  // which requires the elements to be assignable in C++98.  The\n  // compiler cannot generate the operator= for us, as Tuple2Matcher\n  // and Second may not be assignable.\n  //\n  // However, this should never be called, so the implementation just\n  // need to assert.\n  void operator=(const BoundSecondMatcher& /*rhs*/) {\n    GTEST_LOG_(FATAL) << \"BoundSecondMatcher should never be assigned.\";\n  }\n\n private:\n  template <typename T>\n  class Impl : public MatcherInterface<T> {\n   public:\n    typedef ::testing::tuple<T, Second> ArgTuple;\n\n    Impl(const Tuple2Matcher& tm, const Second& second)\n        : mono_tuple2_matcher_(SafeMatcherCast<const ArgTuple&>(tm)),\n          second_value_(second) {}\n\n    virtual void DescribeTo(::std::ostream* os) const {\n      *os << \"and \";\n      UniversalPrint(second_value_, os);\n      *os << \" \";\n      mono_tuple2_matcher_.DescribeTo(os);\n    }\n\n    virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {\n      return mono_tuple2_matcher_.MatchAndExplain(ArgTuple(x, second_value_),\n                                                  listener);\n    }\n\n   private:\n    const Matcher<const ArgTuple&> mono_tuple2_matcher_;\n    const Second second_value_;\n\n    GTEST_DISALLOW_ASSIGN_(Impl);\n  };\n\n  const Tuple2Matcher tuple2_matcher_;\n  const Second second_value_;\n};\n\n// Given a 2-tuple matcher tm and a value second,\n// MatcherBindSecond(tm, second) returns a matcher that matches a\n// value x iff tm matches tuple (x, second).  Useful for implementing\n// UnorderedPointwise() in terms of UnorderedElementsAreArray().\ntemplate <typename Tuple2Matcher, typename Second>\nBoundSecondMatcher<Tuple2Matcher, Second> MatcherBindSecond(\n    const Tuple2Matcher& tm, const Second& second) {\n  return BoundSecondMatcher<Tuple2Matcher, Second>(tm, second);\n}\n\n// Returns the description for a matcher defined using the MATCHER*()\n// macro where the user-supplied description string is \"\", if\n// 'negation' is false; otherwise returns the description of the\n// negation of the matcher.  'param_values' contains a list of strings\n// that are the print-out of the matcher's parameters.\nGTEST_API_ std::string FormatMatcherDescription(bool negation,\n                                                const char* matcher_name,\n                                                const Strings& param_values);\n\n// Implements a matcher that checks the value of a optional<> type variable.\ntemplate <typename ValueMatcher>\nclass OptionalMatcher {\n public:\n  explicit OptionalMatcher(const ValueMatcher& value_matcher)\n      : value_matcher_(value_matcher) {}\n\n  template <typename Optional>\n  operator Matcher<Optional>() const {\n    return MakeMatcher(new Impl<Optional>(value_matcher_));\n  }\n\n  template <typename Optional>\n  class Impl : public MatcherInterface<Optional> {\n   public:\n    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Optional) OptionalView;\n    typedef typename OptionalView::value_type ValueType;\n    explicit Impl(const ValueMatcher& value_matcher)\n        : value_matcher_(MatcherCast<ValueType>(value_matcher)) {}\n\n    virtual void DescribeTo(::std::ostream* os) const {\n      *os << \"value \";\n      value_matcher_.DescribeTo(os);\n    }\n\n    virtual void DescribeNegationTo(::std::ostream* os) const {\n      *os << \"value \";\n      value_matcher_.DescribeNegationTo(os);\n    }\n\n    virtual bool MatchAndExplain(Optional optional,\n                                 MatchResultListener* listener) const {\n      if (!optional) {\n        *listener << \"which is not engaged\";\n        return false;\n      }\n      const ValueType& value = *optional;\n      StringMatchResultListener value_listener;\n      const bool match = value_matcher_.MatchAndExplain(value, &value_listener);\n      *listener << \"whose value \" << PrintToString(value)\n                << (match ? \" matches\" : \" doesn't match\");\n      PrintIfNotEmpty(value_listener.str(), listener->stream());\n      return match;\n    }\n\n   private:\n    const Matcher<ValueType> value_matcher_;\n    GTEST_DISALLOW_ASSIGN_(Impl);\n  };\n\n private:\n  const ValueMatcher value_matcher_;\n  GTEST_DISALLOW_ASSIGN_(OptionalMatcher);\n};\n\nnamespace variant_matcher {\n// Overloads to allow VariantMatcher to do proper ADL lookup.\ntemplate <typename T>\nvoid holds_alternative() {}\ntemplate <typename T>\nvoid get() {}\n\n// Implements a matcher that checks the value of a variant<> type variable.\ntemplate <typename T>\nclass VariantMatcher {\n public:\n  explicit VariantMatcher(::testing::Matcher<const T&> matcher)\n      : matcher_(internal::move(matcher)) {}\n\n  template <typename Variant>\n  bool MatchAndExplain(const Variant& value,\n                       ::testing::MatchResultListener* listener) const {\n    if (!listener->IsInterested()) {\n      return holds_alternative<T>(value) && matcher_.Matches(get<T>(value));\n    }\n\n    if (!holds_alternative<T>(value)) {\n      *listener << \"whose value is not of type '\" << GetTypeName() << \"'\";\n      return false;\n    }\n\n    const T& elem = get<T>(value);\n    StringMatchResultListener elem_listener;\n    const bool match = matcher_.MatchAndExplain(elem, &elem_listener);\n    *listener << \"whose value \" << PrintToString(elem)\n              << (match ? \" matches\" : \" doesn't match\");\n    PrintIfNotEmpty(elem_listener.str(), listener->stream());\n    return match;\n  }\n\n  void DescribeTo(std::ostream* os) const {\n    *os << \"is a variant<> with value of type '\" << GetTypeName()\n        << \"' and the value \";\n    matcher_.DescribeTo(os);\n  }\n\n  void DescribeNegationTo(std::ostream* os) const {\n    *os << \"is a variant<> with value of type other than '\" << GetTypeName()\n        << \"' or the value \";\n    matcher_.DescribeNegationTo(os);\n  }\n\n private:\n  static std::string GetTypeName() {\n#if GTEST_HAS_RTTI\n    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(\n        return internal::GetTypeName<T>());\n#endif\n    return \"the element type\";\n  }\n\n  const ::testing::Matcher<const T&> matcher_;\n};\n\n}  // namespace variant_matcher\n\nnamespace any_cast_matcher {\n\n// Overloads to allow AnyCastMatcher to do proper ADL lookup.\ntemplate <typename T>\nvoid any_cast() {}\n\n// Implements a matcher that any_casts the value.\ntemplate <typename T>\nclass AnyCastMatcher {\n public:\n  explicit AnyCastMatcher(const ::testing::Matcher<const T&>& matcher)\n      : matcher_(matcher) {}\n\n  template <typename AnyType>\n  bool MatchAndExplain(const AnyType& value,\n                       ::testing::MatchResultListener* listener) const {\n    if (!listener->IsInterested()) {\n      const T* ptr = any_cast<T>(&value);\n      return ptr != NULL && matcher_.Matches(*ptr);\n    }\n\n    const T* elem = any_cast<T>(&value);\n    if (elem == NULL) {\n      *listener << \"whose value is not of type '\" << GetTypeName() << \"'\";\n      return false;\n    }\n\n    StringMatchResultListener elem_listener;\n    const bool match = matcher_.MatchAndExplain(*elem, &elem_listener);\n    *listener << \"whose value \" << PrintToString(*elem)\n              << (match ? \" matches\" : \" doesn't match\");\n    PrintIfNotEmpty(elem_listener.str(), listener->stream());\n    return match;\n  }\n\n  void DescribeTo(std::ostream* os) const {\n    *os << \"is an 'any' type with value of type '\" << GetTypeName()\n        << \"' and the value \";\n    matcher_.DescribeTo(os);\n  }\n\n  void DescribeNegationTo(std::ostream* os) const {\n    *os << \"is an 'any' type with value of type other than '\" << GetTypeName()\n        << \"' or the value \";\n    matcher_.DescribeNegationTo(os);\n  }\n\n private:\n  static std::string GetTypeName() {\n#if GTEST_HAS_RTTI\n    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(\n        return internal::GetTypeName<T>());\n#endif\n    return \"the element type\";\n  }\n\n  const ::testing::Matcher<const T&> matcher_;\n};\n\n}  // namespace any_cast_matcher\n}  // namespace internal\n\n// ElementsAreArray(iterator_first, iterator_last)\n// ElementsAreArray(pointer, count)\n// ElementsAreArray(array)\n// ElementsAreArray(container)\n// ElementsAreArray({ e1, e2, ..., en })\n//\n// The ElementsAreArray() functions are like ElementsAre(...), except\n// that they are given a homogeneous sequence rather than taking each\n// element as a function argument. The sequence can be specified as an\n// array, a pointer and count, a vector, an initializer list, or an\n// STL iterator range. In each of these cases, the underlying sequence\n// can be either a sequence of values or a sequence of matchers.\n//\n// All forms of ElementsAreArray() make a copy of the input matcher sequence.\n\ntemplate <typename Iter>\ninline internal::ElementsAreArrayMatcher<\n    typename ::std::iterator_traits<Iter>::value_type>\nElementsAreArray(Iter first, Iter last) {\n  typedef typename ::std::iterator_traits<Iter>::value_type T;\n  return internal::ElementsAreArrayMatcher<T>(first, last);\n}\n\ntemplate <typename T>\ninline internal::ElementsAreArrayMatcher<T> ElementsAreArray(\n    const T* pointer, size_t count) {\n  return ElementsAreArray(pointer, pointer + count);\n}\n\ntemplate <typename T, size_t N>\ninline internal::ElementsAreArrayMatcher<T> ElementsAreArray(\n    const T (&array)[N]) {\n  return ElementsAreArray(array, N);\n}\n\ntemplate <typename Container>\ninline internal::ElementsAreArrayMatcher<typename Container::value_type>\nElementsAreArray(const Container& container) {\n  return ElementsAreArray(container.begin(), container.end());\n}\n\n#if GTEST_HAS_STD_INITIALIZER_LIST_\ntemplate <typename T>\ninline internal::ElementsAreArrayMatcher<T>\nElementsAreArray(::std::initializer_list<T> xs) {\n  return ElementsAreArray(xs.begin(), xs.end());\n}\n#endif\n\n// UnorderedElementsAreArray(iterator_first, iterator_last)\n// UnorderedElementsAreArray(pointer, count)\n// UnorderedElementsAreArray(array)\n// UnorderedElementsAreArray(container)\n// UnorderedElementsAreArray({ e1, e2, ..., en })\n//\n// UnorderedElementsAreArray() verifies that a bijective mapping onto a\n// collection of matchers exists.\n//\n// The matchers can be specified as an array, a pointer and count, a container,\n// an initializer list, or an STL iterator range. In each of these cases, the\n// underlying matchers can be either values or matchers.\n\ntemplate <typename Iter>\ninline internal::UnorderedElementsAreArrayMatcher<\n    typename ::std::iterator_traits<Iter>::value_type>\nUnorderedElementsAreArray(Iter first, Iter last) {\n  typedef typename ::std::iterator_traits<Iter>::value_type T;\n  return internal::UnorderedElementsAreArrayMatcher<T>(\n      internal::UnorderedMatcherRequire::ExactMatch, first, last);\n}\n\ntemplate <typename T>\ninline internal::UnorderedElementsAreArrayMatcher<T>\nUnorderedElementsAreArray(const T* pointer, size_t count) {\n  return UnorderedElementsAreArray(pointer, pointer + count);\n}\n\ntemplate <typename T, size_t N>\ninline internal::UnorderedElementsAreArrayMatcher<T>\nUnorderedElementsAreArray(const T (&array)[N]) {\n  return UnorderedElementsAreArray(array, N);\n}\n\ntemplate <typename Container>\ninline internal::UnorderedElementsAreArrayMatcher<\n    typename Container::value_type>\nUnorderedElementsAreArray(const Container& container) {\n  return UnorderedElementsAreArray(container.begin(), container.end());\n}\n\n#if GTEST_HAS_STD_INITIALIZER_LIST_\ntemplate <typename T>\ninline internal::UnorderedElementsAreArrayMatcher<T>\nUnorderedElementsAreArray(::std::initializer_list<T> xs) {\n  return UnorderedElementsAreArray(xs.begin(), xs.end());\n}\n#endif\n\n// _ is a matcher that matches anything of any type.\n//\n// This definition is fine as:\n//\n//   1. The C++ standard permits using the name _ in a namespace that\n//      is not the global namespace or ::std.\n//   2. The AnythingMatcher class has no data member or constructor,\n//      so it's OK to create global variables of this type.\n//   3. c-style has approved of using _ in this case.\nconst internal::AnythingMatcher _ = {};\n// Creates a matcher that matches any value of the given type T.\ntemplate <typename T>\ninline Matcher<T> A() {\n  return Matcher<T>(new internal::AnyMatcherImpl<T>());\n}\n\n// Creates a matcher that matches any value of the given type T.\ntemplate <typename T>\ninline Matcher<T> An() { return A<T>(); }\n\n// Creates a polymorphic matcher that matches anything equal to x.\n// Note: if the parameter of Eq() were declared as const T&, Eq(\"foo\")\n// wouldn't compile.\ntemplate <typename T>\ninline internal::EqMatcher<T> Eq(T x) { return internal::EqMatcher<T>(x); }\n\n// Constructs a Matcher<T> from a 'value' of type T.  The constructed\n// matcher matches any value that's equal to 'value'.\ntemplate <typename T>\nMatcher<T>::Matcher(T value) { *this = Eq(value); }\n\ntemplate <typename T, typename M>\nMatcher<T> internal::MatcherCastImpl<T, M>::CastImpl(\n    const M& value,\n    internal::BooleanConstant<false> /* convertible_to_matcher */,\n    internal::BooleanConstant<false> /* convertible_to_T */) {\n  return Eq(value);\n}\n\n// Creates a monomorphic matcher that matches anything with type Lhs\n// and equal to rhs.  A user may need to use this instead of Eq(...)\n// in order to resolve an overloading ambiguity.\n//\n// TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x))\n// or Matcher<T>(x), but more readable than the latter.\n//\n// We could define similar monomorphic matchers for other comparison\n// operations (e.g. TypedLt, TypedGe, and etc), but decided not to do\n// it yet as those are used much less than Eq() in practice.  A user\n// can always write Matcher<T>(Lt(5)) to be explicit about the type,\n// for example.\ntemplate <typename Lhs, typename Rhs>\ninline Matcher<Lhs> TypedEq(const Rhs& rhs) { return Eq(rhs); }\n\n// Creates a polymorphic matcher that matches anything >= x.\ntemplate <typename Rhs>\ninline internal::GeMatcher<Rhs> Ge(Rhs x) {\n  return internal::GeMatcher<Rhs>(x);\n}\n\n// Creates a polymorphic matcher that matches anything > x.\ntemplate <typename Rhs>\ninline internal::GtMatcher<Rhs> Gt(Rhs x) {\n  return internal::GtMatcher<Rhs>(x);\n}\n\n// Creates a polymorphic matcher that matches anything <= x.\ntemplate <typename Rhs>\ninline internal::LeMatcher<Rhs> Le(Rhs x) {\n  return internal::LeMatcher<Rhs>(x);\n}\n\n// Creates a polymorphic matcher that matches anything < x.\ntemplate <typename Rhs>\ninline internal::LtMatcher<Rhs> Lt(Rhs x) {\n  return internal::LtMatcher<Rhs>(x);\n}\n\n// Creates a polymorphic matcher that matches anything != x.\ntemplate <typename Rhs>\ninline internal::NeMatcher<Rhs> Ne(Rhs x) {\n  return internal::NeMatcher<Rhs>(x);\n}\n\n// Creates a polymorphic matcher that matches any NULL pointer.\ninline PolymorphicMatcher<internal::IsNullMatcher > IsNull() {\n  return MakePolymorphicMatcher(internal::IsNullMatcher());\n}\n\n// Creates a polymorphic matcher that matches any non-NULL pointer.\n// This is convenient as Not(NULL) doesn't compile (the compiler\n// thinks that that expression is comparing a pointer with an integer).\ninline PolymorphicMatcher<internal::NotNullMatcher > NotNull() {\n  return MakePolymorphicMatcher(internal::NotNullMatcher());\n}\n\n// Creates a polymorphic matcher that matches any argument that\n// references variable x.\ntemplate <typename T>\ninline internal::RefMatcher<T&> Ref(T& x) {  // NOLINT\n  return internal::RefMatcher<T&>(x);\n}\n\n// Creates a matcher that matches any double argument approximately\n// equal to rhs, where two NANs are considered unequal.\ninline internal::FloatingEqMatcher<double> DoubleEq(double rhs) {\n  return internal::FloatingEqMatcher<double>(rhs, false);\n}\n\n// Creates a matcher that matches any double argument approximately\n// equal to rhs, including NaN values when rhs is NaN.\ninline internal::FloatingEqMatcher<double> NanSensitiveDoubleEq(double rhs) {\n  return internal::FloatingEqMatcher<double>(rhs, true);\n}\n\n// Creates a matcher that matches any double argument approximately equal to\n// rhs, up to the specified max absolute error bound, where two NANs are\n// considered unequal.  The max absolute error bound must be non-negative.\ninline internal::FloatingEqMatcher<double> DoubleNear(\n    double rhs, double max_abs_error) {\n  return internal::FloatingEqMatcher<double>(rhs, false, max_abs_error);\n}\n\n// Creates a matcher that matches any double argument approximately equal to\n// rhs, up to the specified max absolute error bound, including NaN values when\n// rhs is NaN.  The max absolute error bound must be non-negative.\ninline internal::FloatingEqMatcher<double> NanSensitiveDoubleNear(\n    double rhs, double max_abs_error) {\n  return internal::FloatingEqMatcher<double>(rhs, true, max_abs_error);\n}\n\n// Creates a matcher that matches any float argument approximately\n// equal to rhs, where two NANs are considered unequal.\ninline internal::FloatingEqMatcher<float> FloatEq(float rhs) {\n  return internal::FloatingEqMatcher<float>(rhs, false);\n}\n\n// Creates a matcher that matches any float argument approximately\n// equal to rhs, including NaN values when rhs is NaN.\ninline internal::FloatingEqMatcher<float> NanSensitiveFloatEq(float rhs) {\n  return internal::FloatingEqMatcher<float>(rhs, true);\n}\n\n// Creates a matcher that matches any float argument approximately equal to\n// rhs, up to the specified max absolute error bound, where two NANs are\n// considered unequal.  The max absolute error bound must be non-negative.\ninline internal::FloatingEqMatcher<float> FloatNear(\n    float rhs, float max_abs_error) {\n  return internal::FloatingEqMatcher<float>(rhs, false, max_abs_error);\n}\n\n// Creates a matcher that matches any float argument approximately equal to\n// rhs, up to the specified max absolute error bound, including NaN values when\n// rhs is NaN.  The max absolute error bound must be non-negative.\ninline internal::FloatingEqMatcher<float> NanSensitiveFloatNear(\n    float rhs, float max_abs_error) {\n  return internal::FloatingEqMatcher<float>(rhs, true, max_abs_error);\n}\n\n// Creates a matcher that matches a pointer (raw or smart) that points\n// to a value that matches inner_matcher.\ntemplate <typename InnerMatcher>\ninline internal::PointeeMatcher<InnerMatcher> Pointee(\n    const InnerMatcher& inner_matcher) {\n  return internal::PointeeMatcher<InnerMatcher>(inner_matcher);\n}\n\n#if GTEST_HAS_RTTI\n// Creates a matcher that matches a pointer or reference that matches\n// inner_matcher when dynamic_cast<To> is applied.\n// The result of dynamic_cast<To> is forwarded to the inner matcher.\n// If To is a pointer and the cast fails, the inner matcher will receive NULL.\n// If To is a reference and the cast fails, this matcher returns false\n// immediately.\ntemplate <typename To>\ninline PolymorphicMatcher<internal::WhenDynamicCastToMatcher<To> >\nWhenDynamicCastTo(const Matcher<To>& inner_matcher) {\n  return MakePolymorphicMatcher(\n      internal::WhenDynamicCastToMatcher<To>(inner_matcher));\n}\n#endif  // GTEST_HAS_RTTI\n\n// Creates a matcher that matches an object whose given field matches\n// 'matcher'.  For example,\n//   Field(&Foo::number, Ge(5))\n// matches a Foo object x iff x.number >= 5.\ntemplate <typename Class, typename FieldType, typename FieldMatcher>\ninline PolymorphicMatcher<\n  internal::FieldMatcher<Class, FieldType> > Field(\n    FieldType Class::*field, const FieldMatcher& matcher) {\n  return MakePolymorphicMatcher(\n      internal::FieldMatcher<Class, FieldType>(\n          field, MatcherCast<const FieldType&>(matcher)));\n  // The call to MatcherCast() is required for supporting inner\n  // matchers of compatible types.  For example, it allows\n  //   Field(&Foo::bar, m)\n  // to compile where bar is an int32 and m is a matcher for int64.\n}\n\n// Same as Field() but also takes the name of the field to provide better error\n// messages.\ntemplate <typename Class, typename FieldType, typename FieldMatcher>\ninline PolymorphicMatcher<internal::FieldMatcher<Class, FieldType> > Field(\n    const std::string& field_name, FieldType Class::*field,\n    const FieldMatcher& matcher) {\n  return MakePolymorphicMatcher(internal::FieldMatcher<Class, FieldType>(\n      field_name, field, MatcherCast<const FieldType&>(matcher)));\n}\n\n// Creates a matcher that matches an object whose given property\n// matches 'matcher'.  For example,\n//   Property(&Foo::str, StartsWith(\"hi\"))\n// matches a Foo object x iff x.str() starts with \"hi\".\ntemplate <typename Class, typename PropertyType, typename PropertyMatcher>\ninline PolymorphicMatcher<internal::PropertyMatcher<\n    Class, PropertyType, PropertyType (Class::*)() const> >\nProperty(PropertyType (Class::*property)() const,\n         const PropertyMatcher& matcher) {\n  return MakePolymorphicMatcher(\n      internal::PropertyMatcher<Class, PropertyType,\n                                PropertyType (Class::*)() const>(\n          property,\n          MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher)));\n  // The call to MatcherCast() is required for supporting inner\n  // matchers of compatible types.  For example, it allows\n  //   Property(&Foo::bar, m)\n  // to compile where bar() returns an int32 and m is a matcher for int64.\n}\n\n// Same as Property() above, but also takes the name of the property to provide\n// better error messages.\ntemplate <typename Class, typename PropertyType, typename PropertyMatcher>\ninline PolymorphicMatcher<internal::PropertyMatcher<\n    Class, PropertyType, PropertyType (Class::*)() const> >\nProperty(const std::string& property_name,\n         PropertyType (Class::*property)() const,\n         const PropertyMatcher& matcher) {\n  return MakePolymorphicMatcher(\n      internal::PropertyMatcher<Class, PropertyType,\n                                PropertyType (Class::*)() const>(\n          property_name, property,\n          MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher)));\n}\n\n#if GTEST_LANG_CXX11\n// The same as above but for reference-qualified member functions.\ntemplate <typename Class, typename PropertyType, typename PropertyMatcher>\ninline PolymorphicMatcher<internal::PropertyMatcher<\n    Class, PropertyType, PropertyType (Class::*)() const &> >\nProperty(PropertyType (Class::*property)() const &,\n         const PropertyMatcher& matcher) {\n  return MakePolymorphicMatcher(\n      internal::PropertyMatcher<Class, PropertyType,\n                                PropertyType (Class::*)() const &>(\n          property,\n          MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher)));\n}\n\n// Three-argument form for reference-qualified member functions.\ntemplate <typename Class, typename PropertyType, typename PropertyMatcher>\ninline PolymorphicMatcher<internal::PropertyMatcher<\n    Class, PropertyType, PropertyType (Class::*)() const &> >\nProperty(const std::string& property_name,\n         PropertyType (Class::*property)() const &,\n         const PropertyMatcher& matcher) {\n  return MakePolymorphicMatcher(\n      internal::PropertyMatcher<Class, PropertyType,\n                                PropertyType (Class::*)() const &>(\n          property_name, property,\n          MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher)));\n}\n#endif\n\n// Creates a matcher that matches an object iff the result of applying\n// a callable to x matches 'matcher'.\n// For example,\n//   ResultOf(f, StartsWith(\"hi\"))\n// matches a Foo object x iff f(x) starts with \"hi\".\n// `callable` parameter can be a function, function pointer, or a functor. It is\n// required to keep no state affecting the results of the calls on it and make\n// no assumptions about how many calls will be made. Any state it keeps must be\n// protected from the concurrent access.\ntemplate <typename Callable, typename InnerMatcher>\ninternal::ResultOfMatcher<Callable, InnerMatcher> ResultOf(\n    Callable callable, InnerMatcher matcher) {\n  return internal::ResultOfMatcher<Callable, InnerMatcher>(\n      internal::move(callable), internal::move(matcher));\n}\n\n// String matchers.\n\n// Matches a string equal to str.\ninline PolymorphicMatcher<internal::StrEqualityMatcher<std::string> > StrEq(\n    const std::string& str) {\n  return MakePolymorphicMatcher(\n      internal::StrEqualityMatcher<std::string>(str, true, true));\n}\n\n// Matches a string not equal to str.\ninline PolymorphicMatcher<internal::StrEqualityMatcher<std::string> > StrNe(\n    const std::string& str) {\n  return MakePolymorphicMatcher(\n      internal::StrEqualityMatcher<std::string>(str, false, true));\n}\n\n// Matches a string equal to str, ignoring case.\ninline PolymorphicMatcher<internal::StrEqualityMatcher<std::string> > StrCaseEq(\n    const std::string& str) {\n  return MakePolymorphicMatcher(\n      internal::StrEqualityMatcher<std::string>(str, true, false));\n}\n\n// Matches a string not equal to str, ignoring case.\ninline PolymorphicMatcher<internal::StrEqualityMatcher<std::string> > StrCaseNe(\n    const std::string& str) {\n  return MakePolymorphicMatcher(\n      internal::StrEqualityMatcher<std::string>(str, false, false));\n}\n\n// Creates a matcher that matches any string, std::string, or C string\n// that contains the given substring.\ninline PolymorphicMatcher<internal::HasSubstrMatcher<std::string> > HasSubstr(\n    const std::string& substring) {\n  return MakePolymorphicMatcher(\n      internal::HasSubstrMatcher<std::string>(substring));\n}\n\n// Matches a string that starts with 'prefix' (case-sensitive).\ninline PolymorphicMatcher<internal::StartsWithMatcher<std::string> > StartsWith(\n    const std::string& prefix) {\n  return MakePolymorphicMatcher(\n      internal::StartsWithMatcher<std::string>(prefix));\n}\n\n// Matches a string that ends with 'suffix' (case-sensitive).\ninline PolymorphicMatcher<internal::EndsWithMatcher<std::string> > EndsWith(\n    const std::string& suffix) {\n  return MakePolymorphicMatcher(internal::EndsWithMatcher<std::string>(suffix));\n}\n\n// Matches a string that fully matches regular expression 'regex'.\n// The matcher takes ownership of 'regex'.\ninline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(\n    const internal::RE* regex) {\n  return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true));\n}\ninline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(\n    const std::string& regex) {\n  return MatchesRegex(new internal::RE(regex));\n}\n\n// Matches a string that contains regular expression 'regex'.\n// The matcher takes ownership of 'regex'.\ninline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(\n    const internal::RE* regex) {\n  return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false));\n}\ninline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(\n    const std::string& regex) {\n  return ContainsRegex(new internal::RE(regex));\n}\n\n#if GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING\n// Wide string matchers.\n\n// Matches a string equal to str.\ninline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> > StrEq(\n    const std::wstring& str) {\n  return MakePolymorphicMatcher(\n      internal::StrEqualityMatcher<std::wstring>(str, true, true));\n}\n\n// Matches a string not equal to str.\ninline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> > StrNe(\n    const std::wstring& str) {\n  return MakePolymorphicMatcher(\n      internal::StrEqualityMatcher<std::wstring>(str, false, true));\n}\n\n// Matches a string equal to str, ignoring case.\ninline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> >\nStrCaseEq(const std::wstring& str) {\n  return MakePolymorphicMatcher(\n      internal::StrEqualityMatcher<std::wstring>(str, true, false));\n}\n\n// Matches a string not equal to str, ignoring case.\ninline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> >\nStrCaseNe(const std::wstring& str) {\n  return MakePolymorphicMatcher(\n      internal::StrEqualityMatcher<std::wstring>(str, false, false));\n}\n\n// Creates a matcher that matches any ::wstring, std::wstring, or C wide string\n// that contains the given substring.\ninline PolymorphicMatcher<internal::HasSubstrMatcher<std::wstring> > HasSubstr(\n    const std::wstring& substring) {\n  return MakePolymorphicMatcher(\n      internal::HasSubstrMatcher<std::wstring>(substring));\n}\n\n// Matches a string that starts with 'prefix' (case-sensitive).\ninline PolymorphicMatcher<internal::StartsWithMatcher<std::wstring> >\nStartsWith(const std::wstring& prefix) {\n  return MakePolymorphicMatcher(\n      internal::StartsWithMatcher<std::wstring>(prefix));\n}\n\n// Matches a string that ends with 'suffix' (case-sensitive).\ninline PolymorphicMatcher<internal::EndsWithMatcher<std::wstring> > EndsWith(\n    const std::wstring& suffix) {\n  return MakePolymorphicMatcher(\n      internal::EndsWithMatcher<std::wstring>(suffix));\n}\n\n#endif  // GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING\n\n// Creates a polymorphic matcher that matches a 2-tuple where the\n// first field == the second field.\ninline internal::Eq2Matcher Eq() { return internal::Eq2Matcher(); }\n\n// Creates a polymorphic matcher that matches a 2-tuple where the\n// first field >= the second field.\ninline internal::Ge2Matcher Ge() { return internal::Ge2Matcher(); }\n\n// Creates a polymorphic matcher that matches a 2-tuple where the\n// first field > the second field.\ninline internal::Gt2Matcher Gt() { return internal::Gt2Matcher(); }\n\n// Creates a polymorphic matcher that matches a 2-tuple where the\n// first field <= the second field.\ninline internal::Le2Matcher Le() { return internal::Le2Matcher(); }\n\n// Creates a polymorphic matcher that matches a 2-tuple where the\n// first field < the second field.\ninline internal::Lt2Matcher Lt() { return internal::Lt2Matcher(); }\n\n// Creates a polymorphic matcher that matches a 2-tuple where the\n// first field != the second field.\ninline internal::Ne2Matcher Ne() { return internal::Ne2Matcher(); }\n\n// Creates a polymorphic matcher that matches a 2-tuple where\n// FloatEq(first field) matches the second field.\ninline internal::FloatingEq2Matcher<float> FloatEq() {\n  return internal::FloatingEq2Matcher<float>();\n}\n\n// Creates a polymorphic matcher that matches a 2-tuple where\n// DoubleEq(first field) matches the second field.\ninline internal::FloatingEq2Matcher<double> DoubleEq() {\n  return internal::FloatingEq2Matcher<double>();\n}\n\n// Creates a polymorphic matcher that matches a 2-tuple where\n// FloatEq(first field) matches the second field with NaN equality.\ninline internal::FloatingEq2Matcher<float> NanSensitiveFloatEq() {\n  return internal::FloatingEq2Matcher<float>(true);\n}\n\n// Creates a polymorphic matcher that matches a 2-tuple where\n// DoubleEq(first field) matches the second field with NaN equality.\ninline internal::FloatingEq2Matcher<double> NanSensitiveDoubleEq() {\n  return internal::FloatingEq2Matcher<double>(true);\n}\n\n// Creates a polymorphic matcher that matches a 2-tuple where\n// FloatNear(first field, max_abs_error) matches the second field.\ninline internal::FloatingEq2Matcher<float> FloatNear(float max_abs_error) {\n  return internal::FloatingEq2Matcher<float>(max_abs_error);\n}\n\n// Creates a polymorphic matcher that matches a 2-tuple where\n// DoubleNear(first field, max_abs_error) matches the second field.\ninline internal::FloatingEq2Matcher<double> DoubleNear(double max_abs_error) {\n  return internal::FloatingEq2Matcher<double>(max_abs_error);\n}\n\n// Creates a polymorphic matcher that matches a 2-tuple where\n// FloatNear(first field, max_abs_error) matches the second field with NaN\n// equality.\ninline internal::FloatingEq2Matcher<float> NanSensitiveFloatNear(\n    float max_abs_error) {\n  return internal::FloatingEq2Matcher<float>(max_abs_error, true);\n}\n\n// Creates a polymorphic matcher that matches a 2-tuple where\n// DoubleNear(first field, max_abs_error) matches the second field with NaN\n// equality.\ninline internal::FloatingEq2Matcher<double> NanSensitiveDoubleNear(\n    double max_abs_error) {\n  return internal::FloatingEq2Matcher<double>(max_abs_error, true);\n}\n\n// Creates a matcher that matches any value of type T that m doesn't\n// match.\ntemplate <typename InnerMatcher>\ninline internal::NotMatcher<InnerMatcher> Not(InnerMatcher m) {\n  return internal::NotMatcher<InnerMatcher>(m);\n}\n\n// Returns a matcher that matches anything that satisfies the given\n// predicate.  The predicate can be any unary function or functor\n// whose return type can be implicitly converted to bool.\ntemplate <typename Predicate>\ninline PolymorphicMatcher<internal::TrulyMatcher<Predicate> >\nTruly(Predicate pred) {\n  return MakePolymorphicMatcher(internal::TrulyMatcher<Predicate>(pred));\n}\n\n// Returns a matcher that matches the container size. The container must\n// support both size() and size_type which all STL-like containers provide.\n// Note that the parameter 'size' can be a value of type size_type as well as\n// matcher. For instance:\n//   EXPECT_THAT(container, SizeIs(2));     // Checks container has 2 elements.\n//   EXPECT_THAT(container, SizeIs(Le(2));  // Checks container has at most 2.\ntemplate <typename SizeMatcher>\ninline internal::SizeIsMatcher<SizeMatcher>\nSizeIs(const SizeMatcher& size_matcher) {\n  return internal::SizeIsMatcher<SizeMatcher>(size_matcher);\n}\n\n// Returns a matcher that matches the distance between the container's begin()\n// iterator and its end() iterator, i.e. the size of the container. This matcher\n// can be used instead of SizeIs with containers such as std::forward_list which\n// do not implement size(). The container must provide const_iterator (with\n// valid iterator_traits), begin() and end().\ntemplate <typename DistanceMatcher>\ninline internal::BeginEndDistanceIsMatcher<DistanceMatcher>\nBeginEndDistanceIs(const DistanceMatcher& distance_matcher) {\n  return internal::BeginEndDistanceIsMatcher<DistanceMatcher>(distance_matcher);\n}\n\n// Returns a matcher that matches an equal container.\n// This matcher behaves like Eq(), but in the event of mismatch lists the\n// values that are included in one container but not the other. (Duplicate\n// values and order differences are not explained.)\ntemplate <typename Container>\ninline PolymorphicMatcher<internal::ContainerEqMatcher<  // NOLINT\n                            GTEST_REMOVE_CONST_(Container)> >\n    ContainerEq(const Container& rhs) {\n  // This following line is for working around a bug in MSVC 8.0,\n  // which causes Container to be a const type sometimes.\n  typedef GTEST_REMOVE_CONST_(Container) RawContainer;\n  return MakePolymorphicMatcher(\n      internal::ContainerEqMatcher<RawContainer>(rhs));\n}\n\n// Returns a matcher that matches a container that, when sorted using\n// the given comparator, matches container_matcher.\ntemplate <typename Comparator, typename ContainerMatcher>\ninline internal::WhenSortedByMatcher<Comparator, ContainerMatcher>\nWhenSortedBy(const Comparator& comparator,\n             const ContainerMatcher& container_matcher) {\n  return internal::WhenSortedByMatcher<Comparator, ContainerMatcher>(\n      comparator, container_matcher);\n}\n\n// Returns a matcher that matches a container that, when sorted using\n// the < operator, matches container_matcher.\ntemplate <typename ContainerMatcher>\ninline internal::WhenSortedByMatcher<internal::LessComparator, ContainerMatcher>\nWhenSorted(const ContainerMatcher& container_matcher) {\n  return\n      internal::WhenSortedByMatcher<internal::LessComparator, ContainerMatcher>(\n          internal::LessComparator(), container_matcher);\n}\n\n// Matches an STL-style container or a native array that contains the\n// same number of elements as in rhs, where its i-th element and rhs's\n// i-th element (as a pair) satisfy the given pair matcher, for all i.\n// TupleMatcher must be able to be safely cast to Matcher<tuple<const\n// T1&, const T2&> >, where T1 and T2 are the types of elements in the\n// LHS container and the RHS container respectively.\ntemplate <typename TupleMatcher, typename Container>\ninline internal::PointwiseMatcher<TupleMatcher,\n                                  GTEST_REMOVE_CONST_(Container)>\nPointwise(const TupleMatcher& tuple_matcher, const Container& rhs) {\n  // This following line is for working around a bug in MSVC 8.0,\n  // which causes Container to be a const type sometimes (e.g. when\n  // rhs is a const int[])..\n  typedef GTEST_REMOVE_CONST_(Container) RawContainer;\n  return internal::PointwiseMatcher<TupleMatcher, RawContainer>(\n      tuple_matcher, rhs);\n}\n\n#if GTEST_HAS_STD_INITIALIZER_LIST_\n\n// Supports the Pointwise(m, {a, b, c}) syntax.\ntemplate <typename TupleMatcher, typename T>\ninline internal::PointwiseMatcher<TupleMatcher, std::vector<T> > Pointwise(\n    const TupleMatcher& tuple_matcher, std::initializer_list<T> rhs) {\n  return Pointwise(tuple_matcher, std::vector<T>(rhs));\n}\n\n#endif  // GTEST_HAS_STD_INITIALIZER_LIST_\n\n// UnorderedPointwise(pair_matcher, rhs) matches an STL-style\n// container or a native array that contains the same number of\n// elements as in rhs, where in some permutation of the container, its\n// i-th element and rhs's i-th element (as a pair) satisfy the given\n// pair matcher, for all i.  Tuple2Matcher must be able to be safely\n// cast to Matcher<tuple<const T1&, const T2&> >, where T1 and T2 are\n// the types of elements in the LHS container and the RHS container\n// respectively.\n//\n// This is like Pointwise(pair_matcher, rhs), except that the element\n// order doesn't matter.\ntemplate <typename Tuple2Matcher, typename RhsContainer>\ninline internal::UnorderedElementsAreArrayMatcher<\n    typename internal::BoundSecondMatcher<\n        Tuple2Matcher, typename internal::StlContainerView<GTEST_REMOVE_CONST_(\n                           RhsContainer)>::type::value_type> >\nUnorderedPointwise(const Tuple2Matcher& tuple2_matcher,\n                   const RhsContainer& rhs_container) {\n  // This following line is for working around a bug in MSVC 8.0,\n  // which causes RhsContainer to be a const type sometimes (e.g. when\n  // rhs_container is a const int[]).\n  typedef GTEST_REMOVE_CONST_(RhsContainer) RawRhsContainer;\n\n  // RhsView allows the same code to handle RhsContainer being a\n  // STL-style container and it being a native C-style array.\n  typedef typename internal::StlContainerView<RawRhsContainer> RhsView;\n  typedef typename RhsView::type RhsStlContainer;\n  typedef typename RhsStlContainer::value_type Second;\n  const RhsStlContainer& rhs_stl_container =\n      RhsView::ConstReference(rhs_container);\n\n  // Create a matcher for each element in rhs_container.\n  ::std::vector<internal::BoundSecondMatcher<Tuple2Matcher, Second> > matchers;\n  for (typename RhsStlContainer::const_iterator it = rhs_stl_container.begin();\n       it != rhs_stl_container.end(); ++it) {\n    matchers.push_back(\n        internal::MatcherBindSecond(tuple2_matcher, *it));\n  }\n\n  // Delegate the work to UnorderedElementsAreArray().\n  return UnorderedElementsAreArray(matchers);\n}\n\n#if GTEST_HAS_STD_INITIALIZER_LIST_\n\n// Supports the UnorderedPointwise(m, {a, b, c}) syntax.\ntemplate <typename Tuple2Matcher, typename T>\ninline internal::UnorderedElementsAreArrayMatcher<\n    typename internal::BoundSecondMatcher<Tuple2Matcher, T> >\nUnorderedPointwise(const Tuple2Matcher& tuple2_matcher,\n                   std::initializer_list<T> rhs) {\n  return UnorderedPointwise(tuple2_matcher, std::vector<T>(rhs));\n}\n\n#endif  // GTEST_HAS_STD_INITIALIZER_LIST_\n\n// Matches an STL-style container or a native array that contains at\n// least one element matching the given value or matcher.\n//\n// Examples:\n//   ::std::set<int> page_ids;\n//   page_ids.insert(3);\n//   page_ids.insert(1);\n//   EXPECT_THAT(page_ids, Contains(1));\n//   EXPECT_THAT(page_ids, Contains(Gt(2)));\n//   EXPECT_THAT(page_ids, Not(Contains(4)));\n//\n//   ::std::map<int, size_t> page_lengths;\n//   page_lengths[1] = 100;\n//   EXPECT_THAT(page_lengths,\n//               Contains(::std::pair<const int, size_t>(1, 100)));\n//\n//   const char* user_ids[] = { \"joe\", \"mike\", \"tom\" };\n//   EXPECT_THAT(user_ids, Contains(Eq(::std::string(\"tom\"))));\ntemplate <typename M>\ninline internal::ContainsMatcher<M> Contains(M matcher) {\n  return internal::ContainsMatcher<M>(matcher);\n}\n\n// IsSupersetOf(iterator_first, iterator_last)\n// IsSupersetOf(pointer, count)\n// IsSupersetOf(array)\n// IsSupersetOf(container)\n// IsSupersetOf({e1, e2, ..., en})\n//\n// IsSupersetOf() verifies that a surjective partial mapping onto a collection\n// of matchers exists. In other words, a container matches\n// IsSupersetOf({e1, ..., en}) if and only if there is a permutation\n// {y1, ..., yn} of some of the container's elements where y1 matches e1,\n// ..., and yn matches en. Obviously, the size of the container must be >= n\n// in order to have a match. Examples:\n//\n// - {1, 2, 3} matches IsSupersetOf({Ge(3), Ne(0)}), as 3 matches Ge(3) and\n//   1 matches Ne(0).\n// - {1, 2} doesn't match IsSupersetOf({Eq(1), Lt(2)}), even though 1 matches\n//   both Eq(1) and Lt(2). The reason is that different matchers must be used\n//   for elements in different slots of the container.\n// - {1, 1, 2} matches IsSupersetOf({Eq(1), Lt(2)}), as (the first) 1 matches\n//   Eq(1) and (the second) 1 matches Lt(2).\n// - {1, 2, 3} matches IsSupersetOf(Gt(1), Gt(1)), as 2 matches (the first)\n//   Gt(1) and 3 matches (the second) Gt(1).\n//\n// The matchers can be specified as an array, a pointer and count, a container,\n// an initializer list, or an STL iterator range. In each of these cases, the\n// underlying matchers can be either values or matchers.\n\ntemplate <typename Iter>\ninline internal::UnorderedElementsAreArrayMatcher<\n    typename ::std::iterator_traits<Iter>::value_type>\nIsSupersetOf(Iter first, Iter last) {\n  typedef typename ::std::iterator_traits<Iter>::value_type T;\n  return internal::UnorderedElementsAreArrayMatcher<T>(\n      internal::UnorderedMatcherRequire::Superset, first, last);\n}\n\ntemplate <typename T>\ninline internal::UnorderedElementsAreArrayMatcher<T> IsSupersetOf(\n    const T* pointer, size_t count) {\n  return IsSupersetOf(pointer, pointer + count);\n}\n\ntemplate <typename T, size_t N>\ninline internal::UnorderedElementsAreArrayMatcher<T> IsSupersetOf(\n    const T (&array)[N]) {\n  return IsSupersetOf(array, N);\n}\n\ntemplate <typename Container>\ninline internal::UnorderedElementsAreArrayMatcher<\n    typename Container::value_type>\nIsSupersetOf(const Container& container) {\n  return IsSupersetOf(container.begin(), container.end());\n}\n\n#if GTEST_HAS_STD_INITIALIZER_LIST_\ntemplate <typename T>\ninline internal::UnorderedElementsAreArrayMatcher<T> IsSupersetOf(\n    ::std::initializer_list<T> xs) {\n  return IsSupersetOf(xs.begin(), xs.end());\n}\n#endif\n\n// IsSubsetOf(iterator_first, iterator_last)\n// IsSubsetOf(pointer, count)\n// IsSubsetOf(array)\n// IsSubsetOf(container)\n// IsSubsetOf({e1, e2, ..., en})\n//\n// IsSubsetOf() verifies that an injective mapping onto a collection of matchers\n// exists.  In other words, a container matches IsSubsetOf({e1, ..., en}) if and\n// only if there is a subset of matchers {m1, ..., mk} which would match the\n// container using UnorderedElementsAre.  Obviously, the size of the container\n// must be <= n in order to have a match. Examples:\n//\n// - {1} matches IsSubsetOf({Gt(0), Lt(0)}), as 1 matches Gt(0).\n// - {1, -1} matches IsSubsetOf({Lt(0), Gt(0)}), as 1 matches Gt(0) and -1\n//   matches Lt(0).\n// - {1, 2} doesn't matches IsSubsetOf({Gt(0), Lt(0)}), even though 1 and 2 both\n//   match Gt(0). The reason is that different matchers must be used for\n//   elements in different slots of the container.\n//\n// The matchers can be specified as an array, a pointer and count, a container,\n// an initializer list, or an STL iterator range. In each of these cases, the\n// underlying matchers can be either values or matchers.\n\ntemplate <typename Iter>\ninline internal::UnorderedElementsAreArrayMatcher<\n    typename ::std::iterator_traits<Iter>::value_type>\nIsSubsetOf(Iter first, Iter last) {\n  typedef typename ::std::iterator_traits<Iter>::value_type T;\n  return internal::UnorderedElementsAreArrayMatcher<T>(\n      internal::UnorderedMatcherRequire::Subset, first, last);\n}\n\ntemplate <typename T>\ninline internal::UnorderedElementsAreArrayMatcher<T> IsSubsetOf(\n    const T* pointer, size_t count) {\n  return IsSubsetOf(pointer, pointer + count);\n}\n\ntemplate <typename T, size_t N>\ninline internal::UnorderedElementsAreArrayMatcher<T> IsSubsetOf(\n    const T (&array)[N]) {\n  return IsSubsetOf(array, N);\n}\n\ntemplate <typename Container>\ninline internal::UnorderedElementsAreArrayMatcher<\n    typename Container::value_type>\nIsSubsetOf(const Container& container) {\n  return IsSubsetOf(container.begin(), container.end());\n}\n\n#if GTEST_HAS_STD_INITIALIZER_LIST_\ntemplate <typename T>\ninline internal::UnorderedElementsAreArrayMatcher<T> IsSubsetOf(\n    ::std::initializer_list<T> xs) {\n  return IsSubsetOf(xs.begin(), xs.end());\n}\n#endif\n\n// Matches an STL-style container or a native array that contains only\n// elements matching the given value or matcher.\n//\n// Each(m) is semantically equivalent to Not(Contains(Not(m))). Only\n// the messages are different.\n//\n// Examples:\n//   ::std::set<int> page_ids;\n//   // Each(m) matches an empty container, regardless of what m is.\n//   EXPECT_THAT(page_ids, Each(Eq(1)));\n//   EXPECT_THAT(page_ids, Each(Eq(77)));\n//\n//   page_ids.insert(3);\n//   EXPECT_THAT(page_ids, Each(Gt(0)));\n//   EXPECT_THAT(page_ids, Not(Each(Gt(4))));\n//   page_ids.insert(1);\n//   EXPECT_THAT(page_ids, Not(Each(Lt(2))));\n//\n//   ::std::map<int, size_t> page_lengths;\n//   page_lengths[1] = 100;\n//   page_lengths[2] = 200;\n//   page_lengths[3] = 300;\n//   EXPECT_THAT(page_lengths, Not(Each(Pair(1, 100))));\n//   EXPECT_THAT(page_lengths, Each(Key(Le(3))));\n//\n//   const char* user_ids[] = { \"joe\", \"mike\", \"tom\" };\n//   EXPECT_THAT(user_ids, Not(Each(Eq(::std::string(\"tom\")))));\ntemplate <typename M>\ninline internal::EachMatcher<M> Each(M matcher) {\n  return internal::EachMatcher<M>(matcher);\n}\n\n// Key(inner_matcher) matches an std::pair whose 'first' field matches\n// inner_matcher.  For example, Contains(Key(Ge(5))) can be used to match an\n// std::map that contains at least one element whose key is >= 5.\ntemplate <typename M>\ninline internal::KeyMatcher<M> Key(M inner_matcher) {\n  return internal::KeyMatcher<M>(inner_matcher);\n}\n\n// Pair(first_matcher, second_matcher) matches a std::pair whose 'first' field\n// matches first_matcher and whose 'second' field matches second_matcher.  For\n// example, EXPECT_THAT(map_type, ElementsAre(Pair(Ge(5), \"foo\"))) can be used\n// to match a std::map<int, string> that contains exactly one element whose key\n// is >= 5 and whose value equals \"foo\".\ntemplate <typename FirstMatcher, typename SecondMatcher>\ninline internal::PairMatcher<FirstMatcher, SecondMatcher>\nPair(FirstMatcher first_matcher, SecondMatcher second_matcher) {\n  return internal::PairMatcher<FirstMatcher, SecondMatcher>(\n      first_matcher, second_matcher);\n}\n\n// Returns a predicate that is satisfied by anything that matches the\n// given matcher.\ntemplate <typename M>\ninline internal::MatcherAsPredicate<M> Matches(M matcher) {\n  return internal::MatcherAsPredicate<M>(matcher);\n}\n\n// Returns true iff the value matches the matcher.\ntemplate <typename T, typename M>\ninline bool Value(const T& value, M matcher) {\n  return testing::Matches(matcher)(value);\n}\n\n// Matches the value against the given matcher and explains the match\n// result to listener.\ntemplate <typename T, typename M>\ninline bool ExplainMatchResult(\n    M matcher, const T& value, MatchResultListener* listener) {\n  return SafeMatcherCast<const T&>(matcher).MatchAndExplain(value, listener);\n}\n\n// Returns a string representation of the given matcher.  Useful for description\n// strings of matchers defined using MATCHER_P* macros that accept matchers as\n// their arguments.  For example:\n//\n// MATCHER_P(XAndYThat, matcher,\n//           \"X that \" + DescribeMatcher<int>(matcher, negation) +\n//               \" and Y that \" + DescribeMatcher<double>(matcher, negation)) {\n//   return ExplainMatchResult(matcher, arg.x(), result_listener) &&\n//          ExplainMatchResult(matcher, arg.y(), result_listener);\n// }\ntemplate <typename T, typename M>\nstd::string DescribeMatcher(const M& matcher, bool negation = false) {\n  ::std::stringstream ss;\n  Matcher<T> monomorphic_matcher = SafeMatcherCast<T>(matcher);\n  if (negation) {\n    monomorphic_matcher.DescribeNegationTo(&ss);\n  } else {\n    monomorphic_matcher.DescribeTo(&ss);\n  }\n  return ss.str();\n}\n\n#if GTEST_LANG_CXX11\n// Define variadic matcher versions. They are overloaded in\n// gmock-generated-matchers.h for the cases supported by pre C++11 compilers.\ntemplate <typename... Args>\ninternal::AllOfMatcher<typename std::decay<const Args&>::type...> AllOf(\n    const Args&... matchers) {\n  return internal::AllOfMatcher<typename std::decay<const Args&>::type...>(\n      matchers...);\n}\n\ntemplate <typename... Args>\ninternal::AnyOfMatcher<typename std::decay<const Args&>::type...> AnyOf(\n    const Args&... matchers) {\n  return internal::AnyOfMatcher<typename std::decay<const Args&>::type...>(\n      matchers...);\n}\n\ntemplate <typename... Args>\ninternal::ElementsAreMatcher<tuple<typename std::decay<const Args&>::type...>>\nElementsAre(const Args&... matchers) {\n  return internal::ElementsAreMatcher<\n      tuple<typename std::decay<const Args&>::type...>>(\n      make_tuple(matchers...));\n}\n\ntemplate <typename... Args>\ninternal::UnorderedElementsAreMatcher<\n    tuple<typename std::decay<const Args&>::type...>>\nUnorderedElementsAre(const Args&... matchers) {\n  return internal::UnorderedElementsAreMatcher<\n      tuple<typename std::decay<const Args&>::type...>>(\n      make_tuple(matchers...));\n}\n\n#endif  // GTEST_LANG_CXX11\n\n// AllArgs(m) is a synonym of m.  This is useful in\n//\n//   EXPECT_CALL(foo, Bar(_, _)).With(AllArgs(Eq()));\n//\n// which is easier to read than\n//\n//   EXPECT_CALL(foo, Bar(_, _)).With(Eq());\ntemplate <typename InnerMatcher>\ninline InnerMatcher AllArgs(const InnerMatcher& matcher) { return matcher; }\n\n// Returns a matcher that matches the value of an optional<> type variable.\n// The matcher implementation only uses '!arg' and requires that the optional<>\n// type has a 'value_type' member type and that '*arg' is of type 'value_type'\n// and is printable using 'PrintToString'. It is compatible with\n// std::optional/std::experimental::optional.\n// Note that to compare an optional type variable against nullopt you should\n// use Eq(nullopt) and not Optional(Eq(nullopt)). The latter implies that the\n// optional value contains an optional itself.\ntemplate <typename ValueMatcher>\ninline internal::OptionalMatcher<ValueMatcher> Optional(\n    const ValueMatcher& value_matcher) {\n  return internal::OptionalMatcher<ValueMatcher>(value_matcher);\n}\n\n// Returns a matcher that matches the value of a absl::any type variable.\ntemplate <typename T>\nPolymorphicMatcher<internal::any_cast_matcher::AnyCastMatcher<T> > AnyWith(\n    const Matcher<const T&>& matcher) {\n  return MakePolymorphicMatcher(\n      internal::any_cast_matcher::AnyCastMatcher<T>(matcher));\n}\n\n// Returns a matcher that matches the value of a variant<> type variable.\n// The matcher implementation uses ADL to find the holds_alternative and get\n// functions.\n// It is compatible with std::variant.\ntemplate <typename T>\nPolymorphicMatcher<internal::variant_matcher::VariantMatcher<T> > VariantWith(\n    const Matcher<const T&>& matcher) {\n  return MakePolymorphicMatcher(\n      internal::variant_matcher::VariantMatcher<T>(matcher));\n}\n\n// These macros allow using matchers to check values in Google Test\n// tests.  ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher)\n// succeed iff the value matches the matcher.  If the assertion fails,\n// the value and the description of the matcher will be printed.\n#define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\\\n    ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)\n#define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\\\n    ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)\n\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251 5046\n\n// Include any custom callback matchers added by the local installation.\n// We must include this header at the end to make sure it can use the\n// declarations from this file.\n#include \"gmock/internal/custom/gmock-matchers.h\"\n\n#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/gmock-more-actions.h",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements some actions that depend on gmock-generated-actions.h.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_\n#define GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_\n\n#include <algorithm>\n\n#include \"gmock/gmock-generated-actions.h\"\n\nnamespace testing {\nnamespace internal {\n\n// Implements the Invoke(f) action.  The template argument\n// FunctionImpl is the implementation type of f, which can be either a\n// function pointer or a functor.  Invoke(f) can be used as an\n// Action<F> as long as f's type is compatible with F (i.e. f can be\n// assigned to a tr1::function<F>).\ntemplate <typename FunctionImpl>\nclass InvokeAction {\n public:\n  // The c'tor makes a copy of function_impl (either a function\n  // pointer or a functor).\n  explicit InvokeAction(FunctionImpl function_impl)\n      : function_impl_(function_impl) {}\n\n  template <typename Result, typename ArgumentTuple>\n  Result Perform(const ArgumentTuple& args) {\n    return InvokeHelper<Result, ArgumentTuple>::Invoke(function_impl_, args);\n  }\n\n private:\n  FunctionImpl function_impl_;\n\n  GTEST_DISALLOW_ASSIGN_(InvokeAction);\n};\n\n// Implements the Invoke(object_ptr, &Class::Method) action.\ntemplate <class Class, typename MethodPtr>\nclass InvokeMethodAction {\n public:\n  InvokeMethodAction(Class* obj_ptr, MethodPtr method_ptr)\n      : method_ptr_(method_ptr), obj_ptr_(obj_ptr) {}\n\n  template <typename Result, typename ArgumentTuple>\n  Result Perform(const ArgumentTuple& args) const {\n    return InvokeHelper<Result, ArgumentTuple>::InvokeMethod(\n        obj_ptr_, method_ptr_, args);\n  }\n\n private:\n  // The order of these members matters.  Reversing the order can trigger\n  // warning C4121 in MSVC (see\n  // http://computer-programming-forum.com/7-vc.net/6fbc30265f860ad1.htm ).\n  const MethodPtr method_ptr_;\n  Class* const obj_ptr_;\n\n  GTEST_DISALLOW_ASSIGN_(InvokeMethodAction);\n};\n\n// An internal replacement for std::copy which mimics its behavior. This is\n// necessary because Visual Studio deprecates ::std::copy, issuing warning 4996.\n// However Visual Studio 2010 and later do not honor #pragmas which disable that\n// warning.\ntemplate<typename InputIterator, typename OutputIterator>\ninline OutputIterator CopyElements(InputIterator first,\n                                   InputIterator last,\n                                   OutputIterator output) {\n  for (; first != last; ++first, ++output) {\n    *output = *first;\n  }\n  return output;\n}\n\n}  // namespace internal\n\n// Various overloads for Invoke().\n\n// Creates an action that invokes 'function_impl' with the mock\n// function's arguments.\ntemplate <typename FunctionImpl>\nPolymorphicAction<internal::InvokeAction<FunctionImpl> > Invoke(\n    FunctionImpl function_impl) {\n  return MakePolymorphicAction(\n      internal::InvokeAction<FunctionImpl>(function_impl));\n}\n\n// Creates an action that invokes the given method on the given object\n// with the mock function's arguments.\ntemplate <class Class, typename MethodPtr>\nPolymorphicAction<internal::InvokeMethodAction<Class, MethodPtr> > Invoke(\n    Class* obj_ptr, MethodPtr method_ptr) {\n  return MakePolymorphicAction(\n      internal::InvokeMethodAction<Class, MethodPtr>(obj_ptr, method_ptr));\n}\n\n// WithoutArgs(inner_action) can be used in a mock function with a\n// non-empty argument list to perform inner_action, which takes no\n// argument.  In other words, it adapts an action accepting no\n// argument to one that accepts (and ignores) arguments.\ntemplate <typename InnerAction>\ninline internal::WithArgsAction<InnerAction>\nWithoutArgs(const InnerAction& action) {\n  return internal::WithArgsAction<InnerAction>(action);\n}\n\n// WithArg<k>(an_action) creates an action that passes the k-th\n// (0-based) argument of the mock function to an_action and performs\n// it.  It adapts an action accepting one argument to one that accepts\n// multiple arguments.  For convenience, we also provide\n// WithArgs<k>(an_action) (defined below) as a synonym.\ntemplate <int k, typename InnerAction>\ninline internal::WithArgsAction<InnerAction, k>\nWithArg(const InnerAction& action) {\n  return internal::WithArgsAction<InnerAction, k>(action);\n}\n\n// The ACTION*() macros trigger warning C4100 (unreferenced formal\n// parameter) in MSVC with -W4.  Unfortunately they cannot be fixed in\n// the macro definition, as the warnings are generated when the macro\n// is expanded and macro expansion cannot contain #pragma.  Therefore\n// we suppress them here.\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4100)\n#endif\n\n// Action ReturnArg<k>() returns the k-th argument of the mock function.\nACTION_TEMPLATE(ReturnArg,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_0_VALUE_PARAMS()) {\n  return ::testing::get<k>(args);\n}\n\n// Action SaveArg<k>(pointer) saves the k-th (0-based) argument of the\n// mock function to *pointer.\nACTION_TEMPLATE(SaveArg,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_1_VALUE_PARAMS(pointer)) {\n  *pointer = ::testing::get<k>(args);\n}\n\n// Action SaveArgPointee<k>(pointer) saves the value pointed to\n// by the k-th (0-based) argument of the mock function to *pointer.\nACTION_TEMPLATE(SaveArgPointee,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_1_VALUE_PARAMS(pointer)) {\n  *pointer = *::testing::get<k>(args);\n}\n\n// Action SetArgReferee<k>(value) assigns 'value' to the variable\n// referenced by the k-th (0-based) argument of the mock function.\nACTION_TEMPLATE(SetArgReferee,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_1_VALUE_PARAMS(value)) {\n  typedef typename ::testing::tuple_element<k, args_type>::type argk_type;\n  // Ensures that argument #k is a reference.  If you get a compiler\n  // error on the next line, you are using SetArgReferee<k>(value) in\n  // a mock function whose k-th (0-based) argument is not a reference.\n  GTEST_COMPILE_ASSERT_(internal::is_reference<argk_type>::value,\n                        SetArgReferee_must_be_used_with_a_reference_argument);\n  ::testing::get<k>(args) = value;\n}\n\n// Action SetArrayArgument<k>(first, last) copies the elements in\n// source range [first, last) to the array pointed to by the k-th\n// (0-based) argument, which can be either a pointer or an\n// iterator. The action does not take ownership of the elements in the\n// source range.\nACTION_TEMPLATE(SetArrayArgument,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_2_VALUE_PARAMS(first, last)) {\n  // Visual Studio deprecates ::std::copy, so we use our own copy in that case.\n#ifdef _MSC_VER\n  internal::CopyElements(first, last, ::testing::get<k>(args));\n#else\n  ::std::copy(first, last, ::testing::get<k>(args));\n#endif\n}\n\n// Action DeleteArg<k>() deletes the k-th (0-based) argument of the mock\n// function.\nACTION_TEMPLATE(DeleteArg,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_0_VALUE_PARAMS()) {\n  delete ::testing::get<k>(args);\n}\n\n// This action returns the value pointed to by 'pointer'.\nACTION_P(ReturnPointee, pointer) { return *pointer; }\n\n// Action Throw(exception) can be used in a mock function of any type\n// to throw the given exception.  Any copyable value can be thrown.\n#if GTEST_HAS_EXCEPTIONS\n\n// Suppresses the 'unreachable code' warning that VC generates in opt modes.\n# ifdef _MSC_VER\n#  pragma warning(push)          // Saves the current warning state.\n#  pragma warning(disable:4702)  // Temporarily disables warning 4702.\n# endif\nACTION_P(Throw, exception) { throw exception; }\n# ifdef _MSC_VER\n#  pragma warning(pop)           // Restores the warning state.\n# endif\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n\n}  // namespace testing\n\n#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/gmock-more-matchers.h",
    "content": "// Copyright 2013, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements some matchers that depend on gmock-generated-matchers.h.\n//\n// Note that tests are implemented in gmock-matchers_test.cc rather than\n// gmock-more-matchers-test.cc.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_MORE_MATCHERS_H_\n#define GMOCK_INCLUDE_GMOCK_MORE_MATCHERS_H_\n\n#include \"gmock/gmock-generated-matchers.h\"\n\nnamespace testing {\n\n// Silence C4100 (unreferenced formal\n// parameter) for MSVC\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4100)\n#if (_MSC_VER == 1900)\n// and silence C4800 (C4800: 'int *const ': forcing value\n// to bool 'true' or 'false') for MSVC 14\n# pragma warning(disable:4800)\n  #endif\n#endif\n\n// Defines a matcher that matches an empty container. The container must\n// support both size() and empty(), which all STL-like containers provide.\nMATCHER(IsEmpty, negation ? \"isn't empty\" : \"is empty\") {\n  if (arg.empty()) {\n    return true;\n  }\n  *result_listener << \"whose size is \" << arg.size();\n  return false;\n}\n\n// Define a matcher that matches a value that evaluates in boolean\n// context to true.  Useful for types that define \"explicit operator\n// bool\" operators and so can't be compared for equality with true\n// and false.\nMATCHER(IsTrue, negation ? \"is false\" : \"is true\") {\n  return static_cast<bool>(arg);\n}\n\n// Define a matcher that matches a value that evaluates in boolean\n// context to false.  Useful for types that define \"explicit operator\n// bool\" operators and so can't be compared for equality with true\n// and false.\nMATCHER(IsFalse, negation ? \"is true\" : \"is false\") {\n  return !static_cast<bool>(arg);\n}\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n\n\n}  // namespace testing\n\n#endif  // GMOCK_INCLUDE_GMOCK_MORE_MATCHERS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/gmock-spec-builders.h",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements the ON_CALL() and EXPECT_CALL() macros.\n//\n// A user can use the ON_CALL() macro to specify the default action of\n// a mock method.  The syntax is:\n//\n//   ON_CALL(mock_object, Method(argument-matchers))\n//       .With(multi-argument-matcher)\n//       .WillByDefault(action);\n//\n//  where the .With() clause is optional.\n//\n// A user can use the EXPECT_CALL() macro to specify an expectation on\n// a mock method.  The syntax is:\n//\n//   EXPECT_CALL(mock_object, Method(argument-matchers))\n//       .With(multi-argument-matchers)\n//       .Times(cardinality)\n//       .InSequence(sequences)\n//       .After(expectations)\n//       .WillOnce(action)\n//       .WillRepeatedly(action)\n//       .RetiresOnSaturation();\n//\n// where all clauses are optional, and .InSequence()/.After()/\n// .WillOnce() can appear any number of times.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_\n#define GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_\n\n#include <map>\n#include <set>\n#include <sstream>\n#include <string>\n#include <vector>\n#include \"gmock/gmock-actions.h\"\n#include \"gmock/gmock-cardinalities.h\"\n#include \"gmock/gmock-matchers.h\"\n#include \"gmock/internal/gmock-internal-utils.h\"\n#include \"gmock/internal/gmock-port.h\"\n#include \"gtest/gtest.h\"\n\n#if GTEST_HAS_EXCEPTIONS\n# include <stdexcept>  // NOLINT\n#endif\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\nnamespace testing {\n\n// An abstract handle of an expectation.\nclass Expectation;\n\n// A set of expectation handles.\nclass ExpectationSet;\n\n// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION\n// and MUST NOT BE USED IN USER CODE!!!\nnamespace internal {\n\n// Implements a mock function.\ntemplate <typename F> class FunctionMocker;\n\n// Base class for expectations.\nclass ExpectationBase;\n\n// Implements an expectation.\ntemplate <typename F> class TypedExpectation;\n\n// Helper class for testing the Expectation class template.\nclass ExpectationTester;\n\n// Base class for function mockers.\ntemplate <typename F> class FunctionMockerBase;\n\n// Protects the mock object registry (in class Mock), all function\n// mockers, and all expectations.\n//\n// The reason we don't use more fine-grained protection is: when a\n// mock function Foo() is called, it needs to consult its expectations\n// to see which one should be picked.  If another thread is allowed to\n// call a mock function (either Foo() or a different one) at the same\n// time, it could affect the \"retired\" attributes of Foo()'s\n// expectations when InSequence() is used, and thus affect which\n// expectation gets picked.  Therefore, we sequence all mock function\n// calls to ensure the integrity of the mock objects' states.\nGTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_gmock_mutex);\n\n// Untyped base class for ActionResultHolder<R>.\nclass UntypedActionResultHolderBase;\n\n// Abstract base class of FunctionMockerBase.  This is the\n// type-agnostic part of the function mocker interface.  Its pure\n// virtual methods are implemented by FunctionMockerBase.\nclass GTEST_API_ UntypedFunctionMockerBase {\n public:\n  UntypedFunctionMockerBase();\n  virtual ~UntypedFunctionMockerBase();\n\n  // Verifies that all expectations on this mock function have been\n  // satisfied.  Reports one or more Google Test non-fatal failures\n  // and returns false if not.\n  bool VerifyAndClearExpectationsLocked()\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);\n\n  // Clears the ON_CALL()s set on this mock function.\n  virtual void ClearDefaultActionsLocked()\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) = 0;\n\n  // In all of the following Untyped* functions, it's the caller's\n  // responsibility to guarantee the correctness of the arguments'\n  // types.\n\n  // Performs the default action with the given arguments and returns\n  // the action's result.  The call description string will be used in\n  // the error message to describe the call in the case the default\n  // action fails.\n  // L = *\n  virtual UntypedActionResultHolderBase* UntypedPerformDefaultAction(\n      void* untyped_args, const std::string& call_description) const = 0;\n\n  // Performs the given action with the given arguments and returns\n  // the action's result.\n  // L = *\n  virtual UntypedActionResultHolderBase* UntypedPerformAction(\n      const void* untyped_action, void* untyped_args) const = 0;\n\n  // Writes a message that the call is uninteresting (i.e. neither\n  // explicitly expected nor explicitly unexpected) to the given\n  // ostream.\n  virtual void UntypedDescribeUninterestingCall(\n      const void* untyped_args,\n      ::std::ostream* os) const\n          GTEST_LOCK_EXCLUDED_(g_gmock_mutex) = 0;\n\n  // Returns the expectation that matches the given function arguments\n  // (or NULL is there's no match); when a match is found,\n  // untyped_action is set to point to the action that should be\n  // performed (or NULL if the action is \"do default\"), and\n  // is_excessive is modified to indicate whether the call exceeds the\n  // expected number.\n  virtual const ExpectationBase* UntypedFindMatchingExpectation(\n      const void* untyped_args,\n      const void** untyped_action, bool* is_excessive,\n      ::std::ostream* what, ::std::ostream* why)\n          GTEST_LOCK_EXCLUDED_(g_gmock_mutex) = 0;\n\n  // Prints the given function arguments to the ostream.\n  virtual void UntypedPrintArgs(const void* untyped_args,\n                                ::std::ostream* os) const = 0;\n\n  // Sets the mock object this mock method belongs to, and registers\n  // this information in the global mock registry.  Will be called\n  // whenever an EXPECT_CALL() or ON_CALL() is executed on this mock\n  // method.\n  // FIXME: rename to SetAndRegisterOwner().\n  void RegisterOwner(const void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(g_gmock_mutex);\n\n  // Sets the mock object this mock method belongs to, and sets the\n  // name of the mock function.  Will be called upon each invocation\n  // of this mock function.\n  void SetOwnerAndName(const void* mock_obj, const char* name)\n      GTEST_LOCK_EXCLUDED_(g_gmock_mutex);\n\n  // Returns the mock object this mock method belongs to.  Must be\n  // called after RegisterOwner() or SetOwnerAndName() has been\n  // called.\n  const void* MockObject() const\n      GTEST_LOCK_EXCLUDED_(g_gmock_mutex);\n\n  // Returns the name of this mock method.  Must be called after\n  // SetOwnerAndName() has been called.\n  const char* Name() const\n      GTEST_LOCK_EXCLUDED_(g_gmock_mutex);\n\n  // Returns the result of invoking this mock function with the given\n  // arguments.  This function can be safely called from multiple\n  // threads concurrently.  The caller is responsible for deleting the\n  // result.\n  UntypedActionResultHolderBase* UntypedInvokeWith(void* untyped_args)\n      GTEST_LOCK_EXCLUDED_(g_gmock_mutex);\n\n protected:\n  typedef std::vector<const void*> UntypedOnCallSpecs;\n\n  typedef std::vector<internal::linked_ptr<ExpectationBase> >\n  UntypedExpectations;\n\n  // Returns an Expectation object that references and co-owns exp,\n  // which must be an expectation on this mock function.\n  Expectation GetHandleOf(ExpectationBase* exp);\n\n  // Address of the mock object this mock method belongs to.  Only\n  // valid after this mock method has been called or\n  // ON_CALL/EXPECT_CALL has been invoked on it.\n  const void* mock_obj_;  // Protected by g_gmock_mutex.\n\n  // Name of the function being mocked.  Only valid after this mock\n  // method has been called.\n  const char* name_;  // Protected by g_gmock_mutex.\n\n  // All default action specs for this function mocker.\n  UntypedOnCallSpecs untyped_on_call_specs_;\n\n  // All expectations for this function mocker.\n  //\n  // It's undefined behavior to interleave expectations (EXPECT_CALLs\n  // or ON_CALLs) and mock function calls.  Also, the order of\n  // expectations is important.  Therefore it's a logic race condition\n  // to read/write untyped_expectations_ concurrently.  In order for\n  // tools like tsan to catch concurrent read/write accesses to\n  // untyped_expectations, we deliberately leave accesses to it\n  // unprotected.\n  UntypedExpectations untyped_expectations_;\n};  // class UntypedFunctionMockerBase\n\n// Untyped base class for OnCallSpec<F>.\nclass UntypedOnCallSpecBase {\n public:\n  // The arguments are the location of the ON_CALL() statement.\n  UntypedOnCallSpecBase(const char* a_file, int a_line)\n      : file_(a_file), line_(a_line), last_clause_(kNone) {}\n\n  // Where in the source file was the default action spec defined?\n  const char* file() const { return file_; }\n  int line() const { return line_; }\n\n protected:\n  // Gives each clause in the ON_CALL() statement a name.\n  enum Clause {\n    // Do not change the order of the enum members!  The run-time\n    // syntax checking relies on it.\n    kNone,\n    kWith,\n    kWillByDefault\n  };\n\n  // Asserts that the ON_CALL() statement has a certain property.\n  void AssertSpecProperty(bool property,\n                          const std::string& failure_message) const {\n    Assert(property, file_, line_, failure_message);\n  }\n\n  // Expects that the ON_CALL() statement has a certain property.\n  void ExpectSpecProperty(bool property,\n                          const std::string& failure_message) const {\n    Expect(property, file_, line_, failure_message);\n  }\n\n  const char* file_;\n  int line_;\n\n  // The last clause in the ON_CALL() statement as seen so far.\n  // Initially kNone and changes as the statement is parsed.\n  Clause last_clause_;\n};  // class UntypedOnCallSpecBase\n\n// This template class implements an ON_CALL spec.\ntemplate <typename F>\nclass OnCallSpec : public UntypedOnCallSpecBase {\n public:\n  typedef typename Function<F>::ArgumentTuple ArgumentTuple;\n  typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple;\n\n  // Constructs an OnCallSpec object from the information inside\n  // the parenthesis of an ON_CALL() statement.\n  OnCallSpec(const char* a_file, int a_line,\n             const ArgumentMatcherTuple& matchers)\n      : UntypedOnCallSpecBase(a_file, a_line),\n        matchers_(matchers),\n        // By default, extra_matcher_ should match anything.  However,\n        // we cannot initialize it with _ as that triggers a compiler\n        // bug in Symbian's C++ compiler (cannot decide between two\n        // overloaded constructors of Matcher<const ArgumentTuple&>).\n        extra_matcher_(A<const ArgumentTuple&>()) {\n  }\n\n  // Implements the .With() clause.\n  OnCallSpec& With(const Matcher<const ArgumentTuple&>& m) {\n    // Makes sure this is called at most once.\n    ExpectSpecProperty(last_clause_ < kWith,\n                       \".With() cannot appear \"\n                       \"more than once in an ON_CALL().\");\n    last_clause_ = kWith;\n\n    extra_matcher_ = m;\n    return *this;\n  }\n\n  // Implements the .WillByDefault() clause.\n  OnCallSpec& WillByDefault(const Action<F>& action) {\n    ExpectSpecProperty(last_clause_ < kWillByDefault,\n                       \".WillByDefault() must appear \"\n                       \"exactly once in an ON_CALL().\");\n    last_clause_ = kWillByDefault;\n\n    ExpectSpecProperty(!action.IsDoDefault(),\n                       \"DoDefault() cannot be used in ON_CALL().\");\n    action_ = action;\n    return *this;\n  }\n\n  // Returns true iff the given arguments match the matchers.\n  bool Matches(const ArgumentTuple& args) const {\n    return TupleMatches(matchers_, args) && extra_matcher_.Matches(args);\n  }\n\n  // Returns the action specified by the user.\n  const Action<F>& GetAction() const {\n    AssertSpecProperty(last_clause_ == kWillByDefault,\n                       \".WillByDefault() must appear exactly \"\n                       \"once in an ON_CALL().\");\n    return action_;\n  }\n\n private:\n  // The information in statement\n  //\n  //   ON_CALL(mock_object, Method(matchers))\n  //       .With(multi-argument-matcher)\n  //       .WillByDefault(action);\n  //\n  // is recorded in the data members like this:\n  //\n  //   source file that contains the statement => file_\n  //   line number of the statement            => line_\n  //   matchers                                => matchers_\n  //   multi-argument-matcher                  => extra_matcher_\n  //   action                                  => action_\n  ArgumentMatcherTuple matchers_;\n  Matcher<const ArgumentTuple&> extra_matcher_;\n  Action<F> action_;\n};  // class OnCallSpec\n\n// Possible reactions on uninteresting calls.\nenum CallReaction {\n  kAllow,\n  kWarn,\n  kFail,\n};\n\n}  // namespace internal\n\n// Utilities for manipulating mock objects.\nclass GTEST_API_ Mock {\n public:\n  // The following public methods can be called concurrently.\n\n  // Tells Google Mock to ignore mock_obj when checking for leaked\n  // mock objects.\n  static void AllowLeak(const void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Verifies and clears all expectations on the given mock object.\n  // If the expectations aren't satisfied, generates one or more\n  // Google Test non-fatal failures and returns false.\n  static bool VerifyAndClearExpectations(void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Verifies all expectations on the given mock object and clears its\n  // default actions and expectations.  Returns true iff the\n  // verification was successful.\n  static bool VerifyAndClear(void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n private:\n  friend class internal::UntypedFunctionMockerBase;\n\n  // Needed for a function mocker to register itself (so that we know\n  // how to clear a mock object).\n  template <typename F>\n  friend class internal::FunctionMockerBase;\n\n  template <typename M>\n  friend class NiceMock;\n\n  template <typename M>\n  friend class NaggyMock;\n\n  template <typename M>\n  friend class StrictMock;\n\n  // Tells Google Mock to allow uninteresting calls on the given mock\n  // object.\n  static void AllowUninterestingCalls(const void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Tells Google Mock to warn the user about uninteresting calls on\n  // the given mock object.\n  static void WarnUninterestingCalls(const void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Tells Google Mock to fail uninteresting calls on the given mock\n  // object.\n  static void FailUninterestingCalls(const void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Tells Google Mock the given mock object is being destroyed and\n  // its entry in the call-reaction table should be removed.\n  static void UnregisterCallReaction(const void* mock_obj)\n      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Returns the reaction Google Mock will have on uninteresting calls\n  // made on the given mock object.\n  static internal::CallReaction GetReactionOnUninterestingCalls(\n      const void* mock_obj)\n          GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Verifies that all expectations on the given mock object have been\n  // satisfied.  Reports one or more Google Test non-fatal failures\n  // and returns false if not.\n  static bool VerifyAndClearExpectationsLocked(void* mock_obj)\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);\n\n  // Clears all ON_CALL()s set on the given mock object.\n  static void ClearDefaultActionsLocked(void* mock_obj)\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);\n\n  // Registers a mock object and a mock method it owns.\n  static void Register(\n      const void* mock_obj,\n      internal::UntypedFunctionMockerBase* mocker)\n          GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Tells Google Mock where in the source code mock_obj is used in an\n  // ON_CALL or EXPECT_CALL.  In case mock_obj is leaked, this\n  // information helps the user identify which object it is.\n  static void RegisterUseByOnCallOrExpectCall(\n      const void* mock_obj, const char* file, int line)\n          GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);\n\n  // Unregisters a mock method; removes the owning mock object from\n  // the registry when the last mock method associated with it has\n  // been unregistered.  This is called only in the destructor of\n  // FunctionMockerBase.\n  static void UnregisterLocked(internal::UntypedFunctionMockerBase* mocker)\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);\n};  // class Mock\n\n// An abstract handle of an expectation.  Useful in the .After()\n// clause of EXPECT_CALL() for setting the (partial) order of\n// expectations.  The syntax:\n//\n//   Expectation e1 = EXPECT_CALL(...)...;\n//   EXPECT_CALL(...).After(e1)...;\n//\n// sets two expectations where the latter can only be matched after\n// the former has been satisfied.\n//\n// Notes:\n//   - This class is copyable and has value semantics.\n//   - Constness is shallow: a const Expectation object itself cannot\n//     be modified, but the mutable methods of the ExpectationBase\n//     object it references can be called via expectation_base().\n//   - The constructors and destructor are defined out-of-line because\n//     the Symbian WINSCW compiler wants to otherwise instantiate them\n//     when it sees this class definition, at which point it doesn't have\n//     ExpectationBase available yet, leading to incorrect destruction\n//     in the linked_ptr (or compilation errors if using a checking\n//     linked_ptr).\nclass GTEST_API_ Expectation {\n public:\n  // Constructs a null object that doesn't reference any expectation.\n  Expectation();\n\n  ~Expectation();\n\n  // This single-argument ctor must not be explicit, in order to support the\n  //   Expectation e = EXPECT_CALL(...);\n  // syntax.\n  //\n  // A TypedExpectation object stores its pre-requisites as\n  // Expectation objects, and needs to call the non-const Retire()\n  // method on the ExpectationBase objects they reference.  Therefore\n  // Expectation must receive a *non-const* reference to the\n  // ExpectationBase object.\n  Expectation(internal::ExpectationBase& exp);  // NOLINT\n\n  // The compiler-generated copy ctor and operator= work exactly as\n  // intended, so we don't need to define our own.\n\n  // Returns true iff rhs references the same expectation as this object does.\n  bool operator==(const Expectation& rhs) const {\n    return expectation_base_ == rhs.expectation_base_;\n  }\n\n  bool operator!=(const Expectation& rhs) const { return !(*this == rhs); }\n\n private:\n  friend class ExpectationSet;\n  friend class Sequence;\n  friend class ::testing::internal::ExpectationBase;\n  friend class ::testing::internal::UntypedFunctionMockerBase;\n\n  template <typename F>\n  friend class ::testing::internal::FunctionMockerBase;\n\n  template <typename F>\n  friend class ::testing::internal::TypedExpectation;\n\n  // This comparator is needed for putting Expectation objects into a set.\n  class Less {\n   public:\n    bool operator()(const Expectation& lhs, const Expectation& rhs) const {\n      return lhs.expectation_base_.get() < rhs.expectation_base_.get();\n    }\n  };\n\n  typedef ::std::set<Expectation, Less> Set;\n\n  Expectation(\n      const internal::linked_ptr<internal::ExpectationBase>& expectation_base);\n\n  // Returns the expectation this object references.\n  const internal::linked_ptr<internal::ExpectationBase>&\n  expectation_base() const {\n    return expectation_base_;\n  }\n\n  // A linked_ptr that co-owns the expectation this handle references.\n  internal::linked_ptr<internal::ExpectationBase> expectation_base_;\n};\n\n// A set of expectation handles.  Useful in the .After() clause of\n// EXPECT_CALL() for setting the (partial) order of expectations.  The\n// syntax:\n//\n//   ExpectationSet es;\n//   es += EXPECT_CALL(...)...;\n//   es += EXPECT_CALL(...)...;\n//   EXPECT_CALL(...).After(es)...;\n//\n// sets three expectations where the last one can only be matched\n// after the first two have both been satisfied.\n//\n// This class is copyable and has value semantics.\nclass ExpectationSet {\n public:\n  // A bidirectional iterator that can read a const element in the set.\n  typedef Expectation::Set::const_iterator const_iterator;\n\n  // An object stored in the set.  This is an alias of Expectation.\n  typedef Expectation::Set::value_type value_type;\n\n  // Constructs an empty set.\n  ExpectationSet() {}\n\n  // This single-argument ctor must not be explicit, in order to support the\n  //   ExpectationSet es = EXPECT_CALL(...);\n  // syntax.\n  ExpectationSet(internal::ExpectationBase& exp) {  // NOLINT\n    *this += Expectation(exp);\n  }\n\n  // This single-argument ctor implements implicit conversion from\n  // Expectation and thus must not be explicit.  This allows either an\n  // Expectation or an ExpectationSet to be used in .After().\n  ExpectationSet(const Expectation& e) {  // NOLINT\n    *this += e;\n  }\n\n  // The compiler-generator ctor and operator= works exactly as\n  // intended, so we don't need to define our own.\n\n  // Returns true iff rhs contains the same set of Expectation objects\n  // as this does.\n  bool operator==(const ExpectationSet& rhs) const {\n    return expectations_ == rhs.expectations_;\n  }\n\n  bool operator!=(const ExpectationSet& rhs) const { return !(*this == rhs); }\n\n  // Implements the syntax\n  //   expectation_set += EXPECT_CALL(...);\n  ExpectationSet& operator+=(const Expectation& e) {\n    expectations_.insert(e);\n    return *this;\n  }\n\n  int size() const { return static_cast<int>(expectations_.size()); }\n\n  const_iterator begin() const { return expectations_.begin(); }\n  const_iterator end() const { return expectations_.end(); }\n\n private:\n  Expectation::Set expectations_;\n};\n\n\n// Sequence objects are used by a user to specify the relative order\n// in which the expectations should match.  They are copyable (we rely\n// on the compiler-defined copy constructor and assignment operator).\nclass GTEST_API_ Sequence {\n public:\n  // Constructs an empty sequence.\n  Sequence() : last_expectation_(new Expectation) {}\n\n  // Adds an expectation to this sequence.  The caller must ensure\n  // that no other thread is accessing this Sequence object.\n  void AddExpectation(const Expectation& expectation) const;\n\n private:\n  // The last expectation in this sequence.  We use a linked_ptr here\n  // because Sequence objects are copyable and we want the copies to\n  // be aliases.  The linked_ptr allows the copies to co-own and share\n  // the same Expectation object.\n  internal::linked_ptr<Expectation> last_expectation_;\n};  // class Sequence\n\n// An object of this type causes all EXPECT_CALL() statements\n// encountered in its scope to be put in an anonymous sequence.  The\n// work is done in the constructor and destructor.  You should only\n// create an InSequence object on the stack.\n//\n// The sole purpose for this class is to support easy definition of\n// sequential expectations, e.g.\n//\n//   {\n//     InSequence dummy;  // The name of the object doesn't matter.\n//\n//     // The following expectations must match in the order they appear.\n//     EXPECT_CALL(a, Bar())...;\n//     EXPECT_CALL(a, Baz())...;\n//     ...\n//     EXPECT_CALL(b, Xyz())...;\n//   }\n//\n// You can create InSequence objects in multiple threads, as long as\n// they are used to affect different mock objects.  The idea is that\n// each thread can create and set up its own mocks as if it's the only\n// thread.  However, for clarity of your tests we recommend you to set\n// up mocks in the main thread unless you have a good reason not to do\n// so.\nclass GTEST_API_ InSequence {\n public:\n  InSequence();\n  ~InSequence();\n private:\n  bool sequence_created_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(InSequence);  // NOLINT\n} GTEST_ATTRIBUTE_UNUSED_;\n\nnamespace internal {\n\n// Points to the implicit sequence introduced by a living InSequence\n// object (if any) in the current thread or NULL.\nGTEST_API_ extern ThreadLocal<Sequence*> g_gmock_implicit_sequence;\n\n// Base class for implementing expectations.\n//\n// There are two reasons for having a type-agnostic base class for\n// Expectation:\n//\n//   1. We need to store collections of expectations of different\n//   types (e.g. all pre-requisites of a particular expectation, all\n//   expectations in a sequence).  Therefore these expectation objects\n//   must share a common base class.\n//\n//   2. We can avoid binary code bloat by moving methods not depending\n//   on the template argument of Expectation to the base class.\n//\n// This class is internal and mustn't be used by user code directly.\nclass GTEST_API_ ExpectationBase {\n public:\n  // source_text is the EXPECT_CALL(...) source that created this Expectation.\n  ExpectationBase(const char* file, int line, const std::string& source_text);\n\n  virtual ~ExpectationBase();\n\n  // Where in the source file was the expectation spec defined?\n  const char* file() const { return file_; }\n  int line() const { return line_; }\n  const char* source_text() const { return source_text_.c_str(); }\n  // Returns the cardinality specified in the expectation spec.\n  const Cardinality& cardinality() const { return cardinality_; }\n\n  // Describes the source file location of this expectation.\n  void DescribeLocationTo(::std::ostream* os) const {\n    *os << FormatFileLocation(file(), line()) << \" \";\n  }\n\n  // Describes how many times a function call matching this\n  // expectation has occurred.\n  void DescribeCallCountTo(::std::ostream* os) const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);\n\n  // If this mock method has an extra matcher (i.e. .With(matcher)),\n  // describes it to the ostream.\n  virtual void MaybeDescribeExtraMatcherTo(::std::ostream* os) = 0;\n\n protected:\n  friend class ::testing::Expectation;\n  friend class UntypedFunctionMockerBase;\n\n  enum Clause {\n    // Don't change the order of the enum members!\n    kNone,\n    kWith,\n    kTimes,\n    kInSequence,\n    kAfter,\n    kWillOnce,\n    kWillRepeatedly,\n    kRetiresOnSaturation\n  };\n\n  typedef std::vector<const void*> UntypedActions;\n\n  // Returns an Expectation object that references and co-owns this\n  // expectation.\n  virtual Expectation GetHandle() = 0;\n\n  // Asserts that the EXPECT_CALL() statement has the given property.\n  void AssertSpecProperty(bool property,\n                          const std::string& failure_message) const {\n    Assert(property, file_, line_, failure_message);\n  }\n\n  // Expects that the EXPECT_CALL() statement has the given property.\n  void ExpectSpecProperty(bool property,\n                          const std::string& failure_message) const {\n    Expect(property, file_, line_, failure_message);\n  }\n\n  // Explicitly specifies the cardinality of this expectation.  Used\n  // by the subclasses to implement the .Times() clause.\n  void SpecifyCardinality(const Cardinality& cardinality);\n\n  // Returns true iff the user specified the cardinality explicitly\n  // using a .Times().\n  bool cardinality_specified() const { return cardinality_specified_; }\n\n  // Sets the cardinality of this expectation spec.\n  void set_cardinality(const Cardinality& a_cardinality) {\n    cardinality_ = a_cardinality;\n  }\n\n  // The following group of methods should only be called after the\n  // EXPECT_CALL() statement, and only when g_gmock_mutex is held by\n  // the current thread.\n\n  // Retires all pre-requisites of this expectation.\n  void RetireAllPreRequisites()\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);\n\n  // Returns true iff this expectation is retired.\n  bool is_retired() const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    return retired_;\n  }\n\n  // Retires this expectation.\n  void Retire()\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    retired_ = true;\n  }\n\n  // Returns true iff this expectation is satisfied.\n  bool IsSatisfied() const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    return cardinality().IsSatisfiedByCallCount(call_count_);\n  }\n\n  // Returns true iff this expectation is saturated.\n  bool IsSaturated() const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    return cardinality().IsSaturatedByCallCount(call_count_);\n  }\n\n  // Returns true iff this expectation is over-saturated.\n  bool IsOverSaturated() const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    return cardinality().IsOverSaturatedByCallCount(call_count_);\n  }\n\n  // Returns true iff all pre-requisites of this expectation are satisfied.\n  bool AllPrerequisitesAreSatisfied() const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);\n\n  // Adds unsatisfied pre-requisites of this expectation to 'result'.\n  void FindUnsatisfiedPrerequisites(ExpectationSet* result) const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);\n\n  // Returns the number this expectation has been invoked.\n  int call_count() const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    return call_count_;\n  }\n\n  // Increments the number this expectation has been invoked.\n  void IncrementCallCount()\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    call_count_++;\n  }\n\n  // Checks the action count (i.e. the number of WillOnce() and\n  // WillRepeatedly() clauses) against the cardinality if this hasn't\n  // been done before.  Prints a warning if there are too many or too\n  // few actions.\n  void CheckActionCountIfNotDone() const\n      GTEST_LOCK_EXCLUDED_(mutex_);\n\n  friend class ::testing::Sequence;\n  friend class ::testing::internal::ExpectationTester;\n\n  template <typename Function>\n  friend class TypedExpectation;\n\n  // Implements the .Times() clause.\n  void UntypedTimes(const Cardinality& a_cardinality);\n\n  // This group of fields are part of the spec and won't change after\n  // an EXPECT_CALL() statement finishes.\n  const char* file_;          // The file that contains the expectation.\n  int line_;                  // The line number of the expectation.\n  const std::string source_text_;  // The EXPECT_CALL(...) source text.\n  // True iff the cardinality is specified explicitly.\n  bool cardinality_specified_;\n  Cardinality cardinality_;            // The cardinality of the expectation.\n  // The immediate pre-requisites (i.e. expectations that must be\n  // satisfied before this expectation can be matched) of this\n  // expectation.  We use linked_ptr in the set because we want an\n  // Expectation object to be co-owned by its FunctionMocker and its\n  // successors.  This allows multiple mock objects to be deleted at\n  // different times.\n  ExpectationSet immediate_prerequisites_;\n\n  // This group of fields are the current state of the expectation,\n  // and can change as the mock function is called.\n  int call_count_;  // How many times this expectation has been invoked.\n  bool retired_;    // True iff this expectation has retired.\n  UntypedActions untyped_actions_;\n  bool extra_matcher_specified_;\n  bool repeated_action_specified_;  // True if a WillRepeatedly() was specified.\n  bool retires_on_saturation_;\n  Clause last_clause_;\n  mutable bool action_count_checked_;  // Under mutex_.\n  mutable Mutex mutex_;  // Protects action_count_checked_.\n\n  GTEST_DISALLOW_ASSIGN_(ExpectationBase);\n};  // class ExpectationBase\n\n// Impements an expectation for the given function type.\ntemplate <typename F>\nclass TypedExpectation : public ExpectationBase {\n public:\n  typedef typename Function<F>::ArgumentTuple ArgumentTuple;\n  typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple;\n  typedef typename Function<F>::Result Result;\n\n  TypedExpectation(FunctionMockerBase<F>* owner, const char* a_file, int a_line,\n                   const std::string& a_source_text,\n                   const ArgumentMatcherTuple& m)\n      : ExpectationBase(a_file, a_line, a_source_text),\n        owner_(owner),\n        matchers_(m),\n        // By default, extra_matcher_ should match anything.  However,\n        // we cannot initialize it with _ as that triggers a compiler\n        // bug in Symbian's C++ compiler (cannot decide between two\n        // overloaded constructors of Matcher<const ArgumentTuple&>).\n        extra_matcher_(A<const ArgumentTuple&>()),\n        repeated_action_(DoDefault()) {}\n\n  virtual ~TypedExpectation() {\n    // Check the validity of the action count if it hasn't been done\n    // yet (for example, if the expectation was never used).\n    CheckActionCountIfNotDone();\n    for (UntypedActions::const_iterator it = untyped_actions_.begin();\n         it != untyped_actions_.end(); ++it) {\n      delete static_cast<const Action<F>*>(*it);\n    }\n  }\n\n  // Implements the .With() clause.\n  TypedExpectation& With(const Matcher<const ArgumentTuple&>& m) {\n    if (last_clause_ == kWith) {\n      ExpectSpecProperty(false,\n                         \".With() cannot appear \"\n                         \"more than once in an EXPECT_CALL().\");\n    } else {\n      ExpectSpecProperty(last_clause_ < kWith,\n                         \".With() must be the first \"\n                         \"clause in an EXPECT_CALL().\");\n    }\n    last_clause_ = kWith;\n\n    extra_matcher_ = m;\n    extra_matcher_specified_ = true;\n    return *this;\n  }\n\n  // Implements the .Times() clause.\n  TypedExpectation& Times(const Cardinality& a_cardinality) {\n    ExpectationBase::UntypedTimes(a_cardinality);\n    return *this;\n  }\n\n  // Implements the .Times() clause.\n  TypedExpectation& Times(int n) {\n    return Times(Exactly(n));\n  }\n\n  // Implements the .InSequence() clause.\n  TypedExpectation& InSequence(const Sequence& s) {\n    ExpectSpecProperty(last_clause_ <= kInSequence,\n                       \".InSequence() cannot appear after .After(),\"\n                       \" .WillOnce(), .WillRepeatedly(), or \"\n                       \".RetiresOnSaturation().\");\n    last_clause_ = kInSequence;\n\n    s.AddExpectation(GetHandle());\n    return *this;\n  }\n  TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2) {\n    return InSequence(s1).InSequence(s2);\n  }\n  TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2,\n                               const Sequence& s3) {\n    return InSequence(s1, s2).InSequence(s3);\n  }\n  TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2,\n                               const Sequence& s3, const Sequence& s4) {\n    return InSequence(s1, s2, s3).InSequence(s4);\n  }\n  TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2,\n                               const Sequence& s3, const Sequence& s4,\n                               const Sequence& s5) {\n    return InSequence(s1, s2, s3, s4).InSequence(s5);\n  }\n\n  // Implements that .After() clause.\n  TypedExpectation& After(const ExpectationSet& s) {\n    ExpectSpecProperty(last_clause_ <= kAfter,\n                       \".After() cannot appear after .WillOnce(),\"\n                       \" .WillRepeatedly(), or \"\n                       \".RetiresOnSaturation().\");\n    last_clause_ = kAfter;\n\n    for (ExpectationSet::const_iterator it = s.begin(); it != s.end(); ++it) {\n      immediate_prerequisites_ += *it;\n    }\n    return *this;\n  }\n  TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2) {\n    return After(s1).After(s2);\n  }\n  TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2,\n                          const ExpectationSet& s3) {\n    return After(s1, s2).After(s3);\n  }\n  TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2,\n                          const ExpectationSet& s3, const ExpectationSet& s4) {\n    return After(s1, s2, s3).After(s4);\n  }\n  TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2,\n                          const ExpectationSet& s3, const ExpectationSet& s4,\n                          const ExpectationSet& s5) {\n    return After(s1, s2, s3, s4).After(s5);\n  }\n\n  // Implements the .WillOnce() clause.\n  TypedExpectation& WillOnce(const Action<F>& action) {\n    ExpectSpecProperty(last_clause_ <= kWillOnce,\n                       \".WillOnce() cannot appear after \"\n                       \".WillRepeatedly() or .RetiresOnSaturation().\");\n    last_clause_ = kWillOnce;\n\n    untyped_actions_.push_back(new Action<F>(action));\n    if (!cardinality_specified()) {\n      set_cardinality(Exactly(static_cast<int>(untyped_actions_.size())));\n    }\n    return *this;\n  }\n\n  // Implements the .WillRepeatedly() clause.\n  TypedExpectation& WillRepeatedly(const Action<F>& action) {\n    if (last_clause_ == kWillRepeatedly) {\n      ExpectSpecProperty(false,\n                         \".WillRepeatedly() cannot appear \"\n                         \"more than once in an EXPECT_CALL().\");\n    } else {\n      ExpectSpecProperty(last_clause_ < kWillRepeatedly,\n                         \".WillRepeatedly() cannot appear \"\n                         \"after .RetiresOnSaturation().\");\n    }\n    last_clause_ = kWillRepeatedly;\n    repeated_action_specified_ = true;\n\n    repeated_action_ = action;\n    if (!cardinality_specified()) {\n      set_cardinality(AtLeast(static_cast<int>(untyped_actions_.size())));\n    }\n\n    // Now that no more action clauses can be specified, we check\n    // whether their count makes sense.\n    CheckActionCountIfNotDone();\n    return *this;\n  }\n\n  // Implements the .RetiresOnSaturation() clause.\n  TypedExpectation& RetiresOnSaturation() {\n    ExpectSpecProperty(last_clause_ < kRetiresOnSaturation,\n                       \".RetiresOnSaturation() cannot appear \"\n                       \"more than once.\");\n    last_clause_ = kRetiresOnSaturation;\n    retires_on_saturation_ = true;\n\n    // Now that no more action clauses can be specified, we check\n    // whether their count makes sense.\n    CheckActionCountIfNotDone();\n    return *this;\n  }\n\n  // Returns the matchers for the arguments as specified inside the\n  // EXPECT_CALL() macro.\n  const ArgumentMatcherTuple& matchers() const {\n    return matchers_;\n  }\n\n  // Returns the matcher specified by the .With() clause.\n  const Matcher<const ArgumentTuple&>& extra_matcher() const {\n    return extra_matcher_;\n  }\n\n  // Returns the action specified by the .WillRepeatedly() clause.\n  const Action<F>& repeated_action() const { return repeated_action_; }\n\n  // If this mock method has an extra matcher (i.e. .With(matcher)),\n  // describes it to the ostream.\n  virtual void MaybeDescribeExtraMatcherTo(::std::ostream* os) {\n    if (extra_matcher_specified_) {\n      *os << \"    Expected args: \";\n      extra_matcher_.DescribeTo(os);\n      *os << \"\\n\";\n    }\n  }\n\n private:\n  template <typename Function>\n  friend class FunctionMockerBase;\n\n  // Returns an Expectation object that references and co-owns this\n  // expectation.\n  virtual Expectation GetHandle() {\n    return owner_->GetHandleOf(this);\n  }\n\n  // The following methods will be called only after the EXPECT_CALL()\n  // statement finishes and when the current thread holds\n  // g_gmock_mutex.\n\n  // Returns true iff this expectation matches the given arguments.\n  bool Matches(const ArgumentTuple& args) const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    return TupleMatches(matchers_, args) && extra_matcher_.Matches(args);\n  }\n\n  // Returns true iff this expectation should handle the given arguments.\n  bool ShouldHandleArguments(const ArgumentTuple& args) const\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n\n    // In case the action count wasn't checked when the expectation\n    // was defined (e.g. if this expectation has no WillRepeatedly()\n    // or RetiresOnSaturation() clause), we check it when the\n    // expectation is used for the first time.\n    CheckActionCountIfNotDone();\n    return !is_retired() && AllPrerequisitesAreSatisfied() && Matches(args);\n  }\n\n  // Describes the result of matching the arguments against this\n  // expectation to the given ostream.\n  void ExplainMatchResultTo(\n      const ArgumentTuple& args,\n      ::std::ostream* os) const\n          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n\n    if (is_retired()) {\n      *os << \"         Expected: the expectation is active\\n\"\n          << \"           Actual: it is retired\\n\";\n    } else if (!Matches(args)) {\n      if (!TupleMatches(matchers_, args)) {\n        ExplainMatchFailureTupleTo(matchers_, args, os);\n      }\n      StringMatchResultListener listener;\n      if (!extra_matcher_.MatchAndExplain(args, &listener)) {\n        *os << \"    Expected args: \";\n        extra_matcher_.DescribeTo(os);\n        *os << \"\\n           Actual: don't match\";\n\n        internal::PrintIfNotEmpty(listener.str(), os);\n        *os << \"\\n\";\n      }\n    } else if (!AllPrerequisitesAreSatisfied()) {\n      *os << \"         Expected: all pre-requisites are satisfied\\n\"\n          << \"           Actual: the following immediate pre-requisites \"\n          << \"are not satisfied:\\n\";\n      ExpectationSet unsatisfied_prereqs;\n      FindUnsatisfiedPrerequisites(&unsatisfied_prereqs);\n      int i = 0;\n      for (ExpectationSet::const_iterator it = unsatisfied_prereqs.begin();\n           it != unsatisfied_prereqs.end(); ++it) {\n        it->expectation_base()->DescribeLocationTo(os);\n        *os << \"pre-requisite #\" << i++ << \"\\n\";\n      }\n      *os << \"                   (end of pre-requisites)\\n\";\n    } else {\n      // This line is here just for completeness' sake.  It will never\n      // be executed as currently the ExplainMatchResultTo() function\n      // is called only when the mock function call does NOT match the\n      // expectation.\n      *os << \"The call matches the expectation.\\n\";\n    }\n  }\n\n  // Returns the action that should be taken for the current invocation.\n  const Action<F>& GetCurrentAction(\n      const FunctionMockerBase<F>* mocker,\n      const ArgumentTuple& args) const\n          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    const int count = call_count();\n    Assert(count >= 1, __FILE__, __LINE__,\n           \"call_count() is <= 0 when GetCurrentAction() is \"\n           \"called - this should never happen.\");\n\n    const int action_count = static_cast<int>(untyped_actions_.size());\n    if (action_count > 0 && !repeated_action_specified_ &&\n        count > action_count) {\n      // If there is at least one WillOnce() and no WillRepeatedly(),\n      // we warn the user when the WillOnce() clauses ran out.\n      ::std::stringstream ss;\n      DescribeLocationTo(&ss);\n      ss << \"Actions ran out in \" << source_text() << \"...\\n\"\n         << \"Called \" << count << \" times, but only \"\n         << action_count << \" WillOnce()\"\n         << (action_count == 1 ? \" is\" : \"s are\") << \" specified - \";\n      mocker->DescribeDefaultActionTo(args, &ss);\n      Log(kWarning, ss.str(), 1);\n    }\n\n    return count <= action_count ?\n        *static_cast<const Action<F>*>(untyped_actions_[count - 1]) :\n        repeated_action();\n  }\n\n  // Given the arguments of a mock function call, if the call will\n  // over-saturate this expectation, returns the default action;\n  // otherwise, returns the next action in this expectation.  Also\n  // describes *what* happened to 'what', and explains *why* Google\n  // Mock does it to 'why'.  This method is not const as it calls\n  // IncrementCallCount().  A return value of NULL means the default\n  // action.\n  const Action<F>* GetActionForArguments(\n      const FunctionMockerBase<F>* mocker,\n      const ArgumentTuple& args,\n      ::std::ostream* what,\n      ::std::ostream* why)\n          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    if (IsSaturated()) {\n      // We have an excessive call.\n      IncrementCallCount();\n      *what << \"Mock function called more times than expected - \";\n      mocker->DescribeDefaultActionTo(args, what);\n      DescribeCallCountTo(why);\n\n      // FIXME: allow the user to control whether\n      // unexpected calls should fail immediately or continue using a\n      // flag --gmock_unexpected_calls_are_fatal.\n      return NULL;\n    }\n\n    IncrementCallCount();\n    RetireAllPreRequisites();\n\n    if (retires_on_saturation_ && IsSaturated()) {\n      Retire();\n    }\n\n    // Must be done after IncrementCount()!\n    *what << \"Mock function call matches \" << source_text() <<\"...\\n\";\n    return &(GetCurrentAction(mocker, args));\n  }\n\n  // All the fields below won't change once the EXPECT_CALL()\n  // statement finishes.\n  FunctionMockerBase<F>* const owner_;\n  ArgumentMatcherTuple matchers_;\n  Matcher<const ArgumentTuple&> extra_matcher_;\n  Action<F> repeated_action_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TypedExpectation);\n};  // class TypedExpectation\n\n// A MockSpec object is used by ON_CALL() or EXPECT_CALL() for\n// specifying the default behavior of, or expectation on, a mock\n// function.\n\n// Note: class MockSpec really belongs to the ::testing namespace.\n// However if we define it in ::testing, MSVC will complain when\n// classes in ::testing::internal declare it as a friend class\n// template.  To workaround this compiler bug, we define MockSpec in\n// ::testing::internal and import it into ::testing.\n\n// Logs a message including file and line number information.\nGTEST_API_ void LogWithLocation(testing::internal::LogSeverity severity,\n                                const char* file, int line,\n                                const std::string& message);\n\ntemplate <typename F>\nclass MockSpec {\n public:\n  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;\n  typedef typename internal::Function<F>::ArgumentMatcherTuple\n      ArgumentMatcherTuple;\n\n  // Constructs a MockSpec object, given the function mocker object\n  // that the spec is associated with.\n  MockSpec(internal::FunctionMockerBase<F>* function_mocker,\n           const ArgumentMatcherTuple& matchers)\n      : function_mocker_(function_mocker), matchers_(matchers) {}\n\n  // Adds a new default action spec to the function mocker and returns\n  // the newly created spec.\n  internal::OnCallSpec<F>& InternalDefaultActionSetAt(\n      const char* file, int line, const char* obj, const char* call) {\n    LogWithLocation(internal::kInfo, file, line,\n                    std::string(\"ON_CALL(\") + obj + \", \" + call + \") invoked\");\n    return function_mocker_->AddNewOnCallSpec(file, line, matchers_);\n  }\n\n  // Adds a new expectation spec to the function mocker and returns\n  // the newly created spec.\n  internal::TypedExpectation<F>& InternalExpectedAt(\n      const char* file, int line, const char* obj, const char* call) {\n    const std::string source_text(std::string(\"EXPECT_CALL(\") + obj + \", \" +\n                                  call + \")\");\n    LogWithLocation(internal::kInfo, file, line, source_text + \" invoked\");\n    return function_mocker_->AddNewExpectation(\n        file, line, source_text, matchers_);\n  }\n\n  // This operator overload is used to swallow the superfluous parameter list\n  // introduced by the ON/EXPECT_CALL macros. See the macro comments for more\n  // explanation.\n  MockSpec<F>& operator()(const internal::WithoutMatchers&, void* const) {\n    return *this;\n  }\n\n private:\n  template <typename Function>\n  friend class internal::FunctionMocker;\n\n  // The function mocker that owns this spec.\n  internal::FunctionMockerBase<F>* const function_mocker_;\n  // The argument matchers specified in the spec.\n  ArgumentMatcherTuple matchers_;\n\n  GTEST_DISALLOW_ASSIGN_(MockSpec);\n};  // class MockSpec\n\n// Wrapper type for generically holding an ordinary value or lvalue reference.\n// If T is not a reference type, it must be copyable or movable.\n// ReferenceOrValueWrapper<T> is movable, and will also be copyable unless\n// T is a move-only value type (which means that it will always be copyable\n// if the current platform does not support move semantics).\n//\n// The primary template defines handling for values, but function header\n// comments describe the contract for the whole template (including\n// specializations).\ntemplate <typename T>\nclass ReferenceOrValueWrapper {\n public:\n  // Constructs a wrapper from the given value/reference.\n  explicit ReferenceOrValueWrapper(T value)\n      : value_(::testing::internal::move(value)) {\n  }\n\n  // Unwraps and returns the underlying value/reference, exactly as\n  // originally passed. The behavior of calling this more than once on\n  // the same object is unspecified.\n  T Unwrap() { return ::testing::internal::move(value_); }\n\n  // Provides nondestructive access to the underlying value/reference.\n  // Always returns a const reference (more precisely,\n  // const RemoveReference<T>&). The behavior of calling this after\n  // calling Unwrap on the same object is unspecified.\n  const T& Peek() const {\n    return value_;\n  }\n\n private:\n  T value_;\n};\n\n// Specialization for lvalue reference types. See primary template\n// for documentation.\ntemplate <typename T>\nclass ReferenceOrValueWrapper<T&> {\n public:\n  // Workaround for debatable pass-by-reference lint warning (c-library-team\n  // policy precludes NOLINT in this context)\n  typedef T& reference;\n  explicit ReferenceOrValueWrapper(reference ref)\n      : value_ptr_(&ref) {}\n  T& Unwrap() { return *value_ptr_; }\n  const T& Peek() const { return *value_ptr_; }\n\n private:\n  T* value_ptr_;\n};\n\n// MSVC warns about using 'this' in base member initializer list, so\n// we need to temporarily disable the warning.  We have to do it for\n// the entire class to suppress the warning, even though it's about\n// the constructor only.\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4355)\n\n// C++ treats the void type specially.  For example, you cannot define\n// a void-typed variable or pass a void value to a function.\n// ActionResultHolder<T> holds a value of type T, where T must be a\n// copyable type or void (T doesn't need to be default-constructable).\n// It hides the syntactic difference between void and other types, and\n// is used to unify the code for invoking both void-returning and\n// non-void-returning mock functions.\n\n// Untyped base class for ActionResultHolder<T>.\nclass UntypedActionResultHolderBase {\n public:\n  virtual ~UntypedActionResultHolderBase() {}\n\n  // Prints the held value as an action's result to os.\n  virtual void PrintAsActionResult(::std::ostream* os) const = 0;\n};\n\n// This generic definition is used when T is not void.\ntemplate <typename T>\nclass ActionResultHolder : public UntypedActionResultHolderBase {\n public:\n  // Returns the held value. Must not be called more than once.\n  T Unwrap() {\n    return result_.Unwrap();\n  }\n\n  // Prints the held value as an action's result to os.\n  virtual void PrintAsActionResult(::std::ostream* os) const {\n    *os << \"\\n          Returns: \";\n    // T may be a reference type, so we don't use UniversalPrint().\n    UniversalPrinter<T>::Print(result_.Peek(), os);\n  }\n\n  // Performs the given mock function's default action and returns the\n  // result in a new-ed ActionResultHolder.\n  template <typename F>\n  static ActionResultHolder* PerformDefaultAction(\n      const FunctionMockerBase<F>* func_mocker,\n      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args,\n      const std::string& call_description) {\n    return new ActionResultHolder(Wrapper(func_mocker->PerformDefaultAction(\n        internal::move(args), call_description)));\n  }\n\n  // Performs the given action and returns the result in a new-ed\n  // ActionResultHolder.\n  template <typename F>\n  static ActionResultHolder* PerformAction(\n      const Action<F>& action,\n      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args) {\n    return new ActionResultHolder(\n        Wrapper(action.Perform(internal::move(args))));\n  }\n\n private:\n  typedef ReferenceOrValueWrapper<T> Wrapper;\n\n  explicit ActionResultHolder(Wrapper result)\n      : result_(::testing::internal::move(result)) {\n  }\n\n  Wrapper result_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionResultHolder);\n};\n\n// Specialization for T = void.\ntemplate <>\nclass ActionResultHolder<void> : public UntypedActionResultHolderBase {\n public:\n  void Unwrap() { }\n\n  virtual void PrintAsActionResult(::std::ostream* /* os */) const {}\n\n  // Performs the given mock function's default action and returns ownership\n  // of an empty ActionResultHolder*.\n  template <typename F>\n  static ActionResultHolder* PerformDefaultAction(\n      const FunctionMockerBase<F>* func_mocker,\n      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args,\n      const std::string& call_description) {\n    func_mocker->PerformDefaultAction(internal::move(args), call_description);\n    return new ActionResultHolder;\n  }\n\n  // Performs the given action and returns ownership of an empty\n  // ActionResultHolder*.\n  template <typename F>\n  static ActionResultHolder* PerformAction(\n      const Action<F>& action,\n      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args) {\n    action.Perform(internal::move(args));\n    return new ActionResultHolder;\n  }\n\n private:\n  ActionResultHolder() {}\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionResultHolder);\n};\n\n// The base of the function mocker class for the given function type.\n// We put the methods in this class instead of its child to avoid code\n// bloat.\ntemplate <typename F>\nclass FunctionMockerBase : public UntypedFunctionMockerBase {\n public:\n  typedef typename Function<F>::Result Result;\n  typedef typename Function<F>::ArgumentTuple ArgumentTuple;\n  typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple;\n\n  FunctionMockerBase() {}\n\n  // The destructor verifies that all expectations on this mock\n  // function have been satisfied.  If not, it will report Google Test\n  // non-fatal failures for the violations.\n  virtual ~FunctionMockerBase()\n        GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n    MutexLock l(&g_gmock_mutex);\n    VerifyAndClearExpectationsLocked();\n    Mock::UnregisterLocked(this);\n    ClearDefaultActionsLocked();\n  }\n\n  // Returns the ON_CALL spec that matches this mock function with the\n  // given arguments; returns NULL if no matching ON_CALL is found.\n  // L = *\n  const OnCallSpec<F>* FindOnCallSpec(\n      const ArgumentTuple& args) const {\n    for (UntypedOnCallSpecs::const_reverse_iterator it\n             = untyped_on_call_specs_.rbegin();\n         it != untyped_on_call_specs_.rend(); ++it) {\n      const OnCallSpec<F>* spec = static_cast<const OnCallSpec<F>*>(*it);\n      if (spec->Matches(args))\n        return spec;\n    }\n\n    return NULL;\n  }\n\n  // Performs the default action of this mock function on the given\n  // arguments and returns the result. Asserts (or throws if\n  // exceptions are enabled) with a helpful call descrption if there\n  // is no valid return value. This method doesn't depend on the\n  // mutable state of this object, and thus can be called concurrently\n  // without locking.\n  // L = *\n  Result PerformDefaultAction(\n      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args,\n      const std::string& call_description) const {\n    const OnCallSpec<F>* const spec =\n        this->FindOnCallSpec(args);\n    if (spec != NULL) {\n      return spec->GetAction().Perform(internal::move(args));\n    }\n    const std::string message =\n        call_description +\n        \"\\n    The mock function has no default action \"\n        \"set, and its return type has no default value set.\";\n#if GTEST_HAS_EXCEPTIONS\n    if (!DefaultValue<Result>::Exists()) {\n      throw std::runtime_error(message);\n    }\n#else\n    Assert(DefaultValue<Result>::Exists(), \"\", -1, message);\n#endif\n    return DefaultValue<Result>::Get();\n  }\n\n  // Performs the default action with the given arguments and returns\n  // the action's result.  The call description string will be used in\n  // the error message to describe the call in the case the default\n  // action fails.  The caller is responsible for deleting the result.\n  // L = *\n  virtual UntypedActionResultHolderBase* UntypedPerformDefaultAction(\n      void* untyped_args,  // must point to an ArgumentTuple\n      const std::string& call_description) const {\n    ArgumentTuple* args = static_cast<ArgumentTuple*>(untyped_args);\n    return ResultHolder::PerformDefaultAction(this, internal::move(*args),\n                                              call_description);\n  }\n\n  // Performs the given action with the given arguments and returns\n  // the action's result.  The caller is responsible for deleting the\n  // result.\n  // L = *\n  virtual UntypedActionResultHolderBase* UntypedPerformAction(\n      const void* untyped_action, void* untyped_args) const {\n    // Make a copy of the action before performing it, in case the\n    // action deletes the mock object (and thus deletes itself).\n    const Action<F> action = *static_cast<const Action<F>*>(untyped_action);\n    ArgumentTuple* args = static_cast<ArgumentTuple*>(untyped_args);\n    return ResultHolder::PerformAction(action, internal::move(*args));\n  }\n\n  // Implements UntypedFunctionMockerBase::ClearDefaultActionsLocked():\n  // clears the ON_CALL()s set on this mock function.\n  virtual void ClearDefaultActionsLocked()\n      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n\n    // Deleting our default actions may trigger other mock objects to be\n    // deleted, for example if an action contains a reference counted smart\n    // pointer to that mock object, and that is the last reference. So if we\n    // delete our actions within the context of the global mutex we may deadlock\n    // when this method is called again. Instead, make a copy of the set of\n    // actions to delete, clear our set within the mutex, and then delete the\n    // actions outside of the mutex.\n    UntypedOnCallSpecs specs_to_delete;\n    untyped_on_call_specs_.swap(specs_to_delete);\n\n    g_gmock_mutex.Unlock();\n    for (UntypedOnCallSpecs::const_iterator it =\n             specs_to_delete.begin();\n         it != specs_to_delete.end(); ++it) {\n      delete static_cast<const OnCallSpec<F>*>(*it);\n    }\n\n    // Lock the mutex again, since the caller expects it to be locked when we\n    // return.\n    g_gmock_mutex.Lock();\n  }\n\n protected:\n  template <typename Function>\n  friend class MockSpec;\n\n  typedef ActionResultHolder<Result> ResultHolder;\n\n  // Returns the result of invoking this mock function with the given\n  // arguments.  This function can be safely called from multiple\n  // threads concurrently.\n  Result InvokeWith(\n      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args)\n      GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n    // const_cast is required since in C++98 we still pass ArgumentTuple around\n    // by const& instead of rvalue reference.\n    void* untyped_args = const_cast<void*>(static_cast<const void*>(&args));\n    scoped_ptr<ResultHolder> holder(\n        DownCast_<ResultHolder*>(this->UntypedInvokeWith(untyped_args)));\n    return holder->Unwrap();\n  }\n\n  // Adds and returns a default action spec for this mock function.\n  OnCallSpec<F>& AddNewOnCallSpec(\n      const char* file, int line,\n      const ArgumentMatcherTuple& m)\n          GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n    Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line);\n    OnCallSpec<F>* const on_call_spec = new OnCallSpec<F>(file, line, m);\n    untyped_on_call_specs_.push_back(on_call_spec);\n    return *on_call_spec;\n  }\n\n  // Adds and returns an expectation spec for this mock function.\n  TypedExpectation<F>& AddNewExpectation(const char* file, int line,\n                                         const std::string& source_text,\n                                         const ArgumentMatcherTuple& m)\n      GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n    Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line);\n    TypedExpectation<F>* const expectation =\n        new TypedExpectation<F>(this, file, line, source_text, m);\n    const linked_ptr<ExpectationBase> untyped_expectation(expectation);\n    // See the definition of untyped_expectations_ for why access to\n    // it is unprotected here.\n    untyped_expectations_.push_back(untyped_expectation);\n\n    // Adds this expectation into the implicit sequence if there is one.\n    Sequence* const implicit_sequence = g_gmock_implicit_sequence.get();\n    if (implicit_sequence != NULL) {\n      implicit_sequence->AddExpectation(Expectation(untyped_expectation));\n    }\n\n    return *expectation;\n  }\n\n private:\n  template <typename Func> friend class TypedExpectation;\n\n  // Some utilities needed for implementing UntypedInvokeWith().\n\n  // Describes what default action will be performed for the given\n  // arguments.\n  // L = *\n  void DescribeDefaultActionTo(const ArgumentTuple& args,\n                               ::std::ostream* os) const {\n    const OnCallSpec<F>* const spec = FindOnCallSpec(args);\n\n    if (spec == NULL) {\n      *os << (internal::type_equals<Result, void>::value ?\n              \"returning directly.\\n\" :\n              \"returning default value.\\n\");\n    } else {\n      *os << \"taking default action specified at:\\n\"\n          << FormatFileLocation(spec->file(), spec->line()) << \"\\n\";\n    }\n  }\n\n  // Writes a message that the call is uninteresting (i.e. neither\n  // explicitly expected nor explicitly unexpected) to the given\n  // ostream.\n  virtual void UntypedDescribeUninterestingCall(\n      const void* untyped_args,\n      ::std::ostream* os) const\n          GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n    const ArgumentTuple& args =\n        *static_cast<const ArgumentTuple*>(untyped_args);\n    *os << \"Uninteresting mock function call - \";\n    DescribeDefaultActionTo(args, os);\n    *os << \"    Function call: \" << Name();\n    UniversalPrint(args, os);\n  }\n\n  // Returns the expectation that matches the given function arguments\n  // (or NULL is there's no match); when a match is found,\n  // untyped_action is set to point to the action that should be\n  // performed (or NULL if the action is \"do default\"), and\n  // is_excessive is modified to indicate whether the call exceeds the\n  // expected number.\n  //\n  // Critical section: We must find the matching expectation and the\n  // corresponding action that needs to be taken in an ATOMIC\n  // transaction.  Otherwise another thread may call this mock\n  // method in the middle and mess up the state.\n  //\n  // However, performing the action has to be left out of the critical\n  // section.  The reason is that we have no control on what the\n  // action does (it can invoke an arbitrary user function or even a\n  // mock function) and excessive locking could cause a dead lock.\n  virtual const ExpectationBase* UntypedFindMatchingExpectation(\n      const void* untyped_args,\n      const void** untyped_action, bool* is_excessive,\n      ::std::ostream* what, ::std::ostream* why)\n          GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n    const ArgumentTuple& args =\n        *static_cast<const ArgumentTuple*>(untyped_args);\n    MutexLock l(&g_gmock_mutex);\n    TypedExpectation<F>* exp = this->FindMatchingExpectationLocked(args);\n    if (exp == NULL) {  // A match wasn't found.\n      this->FormatUnexpectedCallMessageLocked(args, what, why);\n      return NULL;\n    }\n\n    // This line must be done before calling GetActionForArguments(),\n    // which will increment the call count for *exp and thus affect\n    // its saturation status.\n    *is_excessive = exp->IsSaturated();\n    const Action<F>* action = exp->GetActionForArguments(this, args, what, why);\n    if (action != NULL && action->IsDoDefault())\n      action = NULL;  // Normalize \"do default\" to NULL.\n    *untyped_action = action;\n    return exp;\n  }\n\n  // Prints the given function arguments to the ostream.\n  virtual void UntypedPrintArgs(const void* untyped_args,\n                                ::std::ostream* os) const {\n    const ArgumentTuple& args =\n        *static_cast<const ArgumentTuple*>(untyped_args);\n    UniversalPrint(args, os);\n  }\n\n  // Returns the expectation that matches the arguments, or NULL if no\n  // expectation matches them.\n  TypedExpectation<F>* FindMatchingExpectationLocked(\n      const ArgumentTuple& args) const\n          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    // See the definition of untyped_expectations_ for why access to\n    // it is unprotected here.\n    for (typename UntypedExpectations::const_reverse_iterator it =\n             untyped_expectations_.rbegin();\n         it != untyped_expectations_.rend(); ++it) {\n      TypedExpectation<F>* const exp =\n          static_cast<TypedExpectation<F>*>(it->get());\n      if (exp->ShouldHandleArguments(args)) {\n        return exp;\n      }\n    }\n    return NULL;\n  }\n\n  // Returns a message that the arguments don't match any expectation.\n  void FormatUnexpectedCallMessageLocked(\n      const ArgumentTuple& args,\n      ::std::ostream* os,\n      ::std::ostream* why) const\n          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    *os << \"\\nUnexpected mock function call - \";\n    DescribeDefaultActionTo(args, os);\n    PrintTriedExpectationsLocked(args, why);\n  }\n\n  // Prints a list of expectations that have been tried against the\n  // current mock function call.\n  void PrintTriedExpectationsLocked(\n      const ArgumentTuple& args,\n      ::std::ostream* why) const\n          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n    g_gmock_mutex.AssertHeld();\n    const int count = static_cast<int>(untyped_expectations_.size());\n    *why << \"Google Mock tried the following \" << count << \" \"\n         << (count == 1 ? \"expectation, but it didn't match\" :\n             \"expectations, but none matched\")\n         << \":\\n\";\n    for (int i = 0; i < count; i++) {\n      TypedExpectation<F>* const expectation =\n          static_cast<TypedExpectation<F>*>(untyped_expectations_[i].get());\n      *why << \"\\n\";\n      expectation->DescribeLocationTo(why);\n      if (count > 1) {\n        *why << \"tried expectation #\" << i << \": \";\n      }\n      *why << expectation->source_text() << \"...\\n\";\n      expectation->ExplainMatchResultTo(args, why);\n      expectation->DescribeCallCountTo(why);\n    }\n  }\n\n  // There is no generally useful and implementable semantics of\n  // copying a mock object, so copying a mock is usually a user error.\n  // Thus we disallow copying function mockers.  If the user really\n  // wants to copy a mock object, they should implement their own copy\n  // operation, for example:\n  //\n  //   class MockFoo : public Foo {\n  //    public:\n  //     // Defines a copy constructor explicitly.\n  //     MockFoo(const MockFoo& src) {}\n  //     ...\n  //   };\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(FunctionMockerBase);\n};  // class FunctionMockerBase\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4355\n\n// Implements methods of FunctionMockerBase.\n\n// Verifies that all expectations on this mock function have been\n// satisfied.  Reports one or more Google Test non-fatal failures and\n// returns false if not.\n\n// Reports an uninteresting call (whose description is in msg) in the\n// manner specified by 'reaction'.\nvoid ReportUninterestingCall(CallReaction reaction, const std::string& msg);\n\n}  // namespace internal\n\n// The style guide prohibits \"using\" statements in a namespace scope\n// inside a header file.  However, the MockSpec class template is\n// meant to be defined in the ::testing namespace.  The following line\n// is just a trick for working around a bug in MSVC 8.0, which cannot\n// handle it if we define MockSpec in ::testing.\nusing internal::MockSpec;\n\n// Const(x) is a convenient function for obtaining a const reference\n// to x.  This is useful for setting expectations on an overloaded\n// const mock method, e.g.\n//\n//   class MockFoo : public FooInterface {\n//    public:\n//     MOCK_METHOD0(Bar, int());\n//     MOCK_CONST_METHOD0(Bar, int&());\n//   };\n//\n//   MockFoo foo;\n//   // Expects a call to non-const MockFoo::Bar().\n//   EXPECT_CALL(foo, Bar());\n//   // Expects a call to const MockFoo::Bar().\n//   EXPECT_CALL(Const(foo), Bar());\ntemplate <typename T>\ninline const T& Const(const T& x) { return x; }\n\n// Constructs an Expectation object that references and co-owns exp.\ninline Expectation::Expectation(internal::ExpectationBase& exp)  // NOLINT\n    : expectation_base_(exp.GetHandle().expectation_base()) {}\n\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n// Implementation for ON_CALL and EXPECT_CALL macros. A separate macro is\n// required to avoid compile errors when the name of the method used in call is\n// a result of macro expansion. See CompilesWithMethodNameExpandedFromMacro\n// tests in internal/gmock-spec-builders_test.cc for more details.\n//\n// This macro supports statements both with and without parameter matchers. If\n// the parameter list is omitted, gMock will accept any parameters, which allows\n// tests to be written that don't need to encode the number of method\n// parameter. This technique may only be used for non-overloaded methods.\n//\n//   // These are the same:\n//   ON_CALL(mock, NoArgsMethod()).WillByDefault(...);\n//   ON_CALL(mock, NoArgsMethod).WillByDefault(...);\n//\n//   // As are these:\n//   ON_CALL(mock, TwoArgsMethod(_, _)).WillByDefault(...);\n//   ON_CALL(mock, TwoArgsMethod).WillByDefault(...);\n//\n//   // Can also specify args if you want, of course:\n//   ON_CALL(mock, TwoArgsMethod(_, 45)).WillByDefault(...);\n//\n//   // Overloads work as long as you specify parameters:\n//   ON_CALL(mock, OverloadedMethod(_)).WillByDefault(...);\n//   ON_CALL(mock, OverloadedMethod(_, _)).WillByDefault(...);\n//\n//   // Oops! Which overload did you want?\n//   ON_CALL(mock, OverloadedMethod).WillByDefault(...);\n//     => ERROR: call to member function 'gmock_OverloadedMethod' is ambiguous\n//\n// How this works: The mock class uses two overloads of the gmock_Method\n// expectation setter method plus an operator() overload on the MockSpec object.\n// In the matcher list form, the macro expands to:\n//\n//   // This statement:\n//   ON_CALL(mock, TwoArgsMethod(_, 45))...\n//\n//   // ...expands to:\n//   mock.gmock_TwoArgsMethod(_, 45)(WithoutMatchers(), nullptr)...\n//   |-------------v---------------||------------v-------------|\n//       invokes first overload        swallowed by operator()\n//\n//   // ...which is essentially:\n//   mock.gmock_TwoArgsMethod(_, 45)...\n//\n// Whereas the form without a matcher list:\n//\n//   // This statement:\n//   ON_CALL(mock, TwoArgsMethod)...\n//\n//   // ...expands to:\n//   mock.gmock_TwoArgsMethod(WithoutMatchers(), nullptr)...\n//   |-----------------------v--------------------------|\n//                 invokes second overload\n//\n//   // ...which is essentially:\n//   mock.gmock_TwoArgsMethod(_, _)...\n//\n// The WithoutMatchers() argument is used to disambiguate overloads and to\n// block the caller from accidentally invoking the second overload directly. The\n// second argument is an internal type derived from the method signature. The\n// failure to disambiguate two overloads of this method in the ON_CALL statement\n// is how we block callers from setting expectations on overloaded methods.\n#define GMOCK_ON_CALL_IMPL_(mock_expr, Setter, call)                          \\\n  ((mock_expr).gmock_##call)(::testing::internal::GetWithoutMatchers(), NULL) \\\n      .Setter(__FILE__, __LINE__, #mock_expr, #call)\n\n#define ON_CALL(obj, call) \\\n  GMOCK_ON_CALL_IMPL_(obj, InternalDefaultActionSetAt, call)\n\n#define EXPECT_CALL(obj, call) \\\n  GMOCK_ON_CALL_IMPL_(obj, InternalExpectedAt, call)\n\n#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/gmock.h",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This is the main header file a user should include.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_H_\n#define GMOCK_INCLUDE_GMOCK_GMOCK_H_\n\n// This file implements the following syntax:\n//\n//   ON_CALL(mock_object.Method(...))\n//     .With(...) ?\n//     .WillByDefault(...);\n//\n// where With() is optional and WillByDefault() must appear exactly\n// once.\n//\n//   EXPECT_CALL(mock_object.Method(...))\n//     .With(...) ?\n//     .Times(...) ?\n//     .InSequence(...) *\n//     .WillOnce(...) *\n//     .WillRepeatedly(...) ?\n//     .RetiresOnSaturation() ? ;\n//\n// where all clauses are optional and WillOnce() can be repeated.\n\n#include \"gmock/gmock-actions.h\"\n#include \"gmock/gmock-cardinalities.h\"\n#include \"gmock/gmock-generated-actions.h\"\n#include \"gmock/gmock-generated-function-mockers.h\"\n#include \"gmock/gmock-generated-matchers.h\"\n#include \"gmock/gmock-generated-nice-strict.h\"\n#include \"gmock/gmock-matchers.h\"\n#include \"gmock/gmock-more-actions.h\"\n#include \"gmock/gmock-more-matchers.h\"\n#include \"gmock/internal/gmock-internal-utils.h\"\n\nnamespace testing {\n\n// Declares Google Mock flags that we want a user to use programmatically.\nGMOCK_DECLARE_bool_(catch_leaked_mocks);\nGMOCK_DECLARE_string_(verbose);\nGMOCK_DECLARE_int32_(default_mock_behavior);\n\n// Initializes Google Mock.  This must be called before running the\n// tests.  In particular, it parses the command line for the flags\n// that Google Mock recognizes.  Whenever a Google Mock flag is seen,\n// it is removed from argv, and *argc is decremented.\n//\n// No value is returned.  Instead, the Google Mock flag variables are\n// updated.\n//\n// Since Google Test is needed for Google Mock to work, this function\n// also initializes Google Test and parses its flags, if that hasn't\n// been done.\nGTEST_API_ void InitGoogleMock(int* argc, char** argv);\n\n// This overloaded version can be used in Windows programs compiled in\n// UNICODE mode.\nGTEST_API_ void InitGoogleMock(int* argc, wchar_t** argv);\n\n}  // namespace testing\n\n#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/internal/custom/README.md",
    "content": "# Customization Points\n\nThe custom directory is an injection point for custom user configurations.\n\n## Header `gmock-port.h`\n\nThe following macros can be defined:\n\n### Flag related macros:\n\n*   `GMOCK_DECLARE_bool_(name)`\n*   `GMOCK_DECLARE_int32_(name)`\n*   `GMOCK_DECLARE_string_(name)`\n*   `GMOCK_DEFINE_bool_(name, default_val, doc)`\n*   `GMOCK_DEFINE_int32_(name, default_val, doc)`\n*   `GMOCK_DEFINE_string_(name, default_val, doc)`\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/internal/custom/gmock-generated-actions.h",
    "content": "// This file was GENERATED by command:\n//     pump.py gmock-generated-actions.h.pump\n// DO NOT EDIT BY HAND!!!\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_\n#define GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_\n\n#endif  // GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/internal/custom/gmock-generated-actions.h.pump",
    "content": "$$ -*- mode: c++; -*-\n$$ This is a Pump source file. Please use Pump to convert\n$$ it to callback-actions.h.\n$$\n$var max_callback_arity = 5\n$$}} This meta comment fixes auto-indentation in editors.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_\n#define GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_\n\n#endif  // GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/internal/custom/gmock-matchers.h",
    "content": "// Copyright 2015, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Injection point for custom user configurations. See README for details\n//\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_MATCHERS_H_\n#define GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_MATCHERS_H_\n#endif  // GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_MATCHERS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/internal/custom/gmock-port.h",
    "content": "// Copyright 2015, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Injection point for custom user configurations. See README for details\n//\n// ** Custom implementation starts here **\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_PORT_H_\n#define GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_PORT_H_\n\n#endif  // GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_PORT_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/internal/gmock-generated-internal-utils.h",
    "content": "// This file was GENERATED by command:\n//     pump.py gmock-generated-internal-utils.h.pump\n// DO NOT EDIT BY HAND!!!\n\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file contains template meta-programming utility classes needed\n// for implementing Google Mock.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_\n#define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_\n\n#include \"gmock/internal/gmock-port.h\"\n\nnamespace testing {\n\ntemplate <typename T>\nclass Matcher;\n\nnamespace internal {\n\n// An IgnoredValue object can be implicitly constructed from ANY value.\n// This is used in implementing the IgnoreResult(a) action.\nclass IgnoredValue {\n public:\n  // This constructor template allows any value to be implicitly\n  // converted to IgnoredValue.  The object has no data member and\n  // doesn't try to remember anything about the argument.  We\n  // deliberately omit the 'explicit' keyword in order to allow the\n  // conversion to be implicit.\n  template <typename T>\n  IgnoredValue(const T& /* ignored */) {}  // NOLINT(runtime/explicit)\n};\n\n// MatcherTuple<T>::type is a tuple type where each field is a Matcher\n// for the corresponding field in tuple type T.\ntemplate <typename Tuple>\nstruct MatcherTuple;\n\ntemplate <>\nstruct MatcherTuple< ::testing::tuple<> > {\n  typedef ::testing::tuple< > type;\n};\n\ntemplate <typename A1>\nstruct MatcherTuple< ::testing::tuple<A1> > {\n  typedef ::testing::tuple<Matcher<A1> > type;\n};\n\ntemplate <typename A1, typename A2>\nstruct MatcherTuple< ::testing::tuple<A1, A2> > {\n  typedef ::testing::tuple<Matcher<A1>, Matcher<A2> > type;\n};\n\ntemplate <typename A1, typename A2, typename A3>\nstruct MatcherTuple< ::testing::tuple<A1, A2, A3> > {\n  typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3> > type;\n};\n\ntemplate <typename A1, typename A2, typename A3, typename A4>\nstruct MatcherTuple< ::testing::tuple<A1, A2, A3, A4> > {\n  typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4> >\n      type;\n};\n\ntemplate <typename A1, typename A2, typename A3, typename A4, typename A5>\nstruct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5> > {\n  typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,\n                           Matcher<A5> >\n      type;\n};\n\ntemplate <typename A1, typename A2, typename A3, typename A4, typename A5,\n    typename A6>\nstruct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6> > {\n  typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,\n                           Matcher<A5>, Matcher<A6> >\n      type;\n};\n\ntemplate <typename A1, typename A2, typename A3, typename A4, typename A5,\n    typename A6, typename A7>\nstruct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> > {\n  typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,\n                           Matcher<A5>, Matcher<A6>, Matcher<A7> >\n      type;\n};\n\ntemplate <typename A1, typename A2, typename A3, typename A4, typename A5,\n    typename A6, typename A7, typename A8>\nstruct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > {\n  typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,\n                           Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8> >\n      type;\n};\n\ntemplate <typename A1, typename A2, typename A3, typename A4, typename A5,\n    typename A6, typename A7, typename A8, typename A9>\nstruct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > {\n  typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,\n                           Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8>,\n                           Matcher<A9> >\n      type;\n};\n\ntemplate <typename A1, typename A2, typename A3, typename A4, typename A5,\n    typename A6, typename A7, typename A8, typename A9, typename A10>\nstruct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,\n    A10> > {\n  typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,\n                           Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8>,\n                           Matcher<A9>, Matcher<A10> >\n      type;\n};\n\n// Template struct Function<F>, where F must be a function type, contains\n// the following typedefs:\n//\n//   Result:               the function's return type.\n//   ArgumentN:            the type of the N-th argument, where N starts with 1.\n//   ArgumentTuple:        the tuple type consisting of all parameters of F.\n//   ArgumentMatcherTuple: the tuple type consisting of Matchers for all\n//                         parameters of F.\n//   MakeResultVoid:       the function type obtained by substituting void\n//                         for the return type of F.\n//   MakeResultIgnoredValue:\n//                         the function type obtained by substituting Something\n//                         for the return type of F.\ntemplate <typename F>\nstruct Function;\n\ntemplate <typename R>\nstruct Function<R()> {\n  typedef R Result;\n  typedef ::testing::tuple<> ArgumentTuple;\n  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;\n  typedef void MakeResultVoid();\n  typedef IgnoredValue MakeResultIgnoredValue();\n};\n\ntemplate <typename R, typename A1>\nstruct Function<R(A1)>\n    : Function<R()> {\n  typedef A1 Argument1;\n  typedef ::testing::tuple<A1> ArgumentTuple;\n  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;\n  typedef void MakeResultVoid(A1);\n  typedef IgnoredValue MakeResultIgnoredValue(A1);\n};\n\ntemplate <typename R, typename A1, typename A2>\nstruct Function<R(A1, A2)>\n    : Function<R(A1)> {\n  typedef A2 Argument2;\n  typedef ::testing::tuple<A1, A2> ArgumentTuple;\n  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;\n  typedef void MakeResultVoid(A1, A2);\n  typedef IgnoredValue MakeResultIgnoredValue(A1, A2);\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3>\nstruct Function<R(A1, A2, A3)>\n    : Function<R(A1, A2)> {\n  typedef A3 Argument3;\n  typedef ::testing::tuple<A1, A2, A3> ArgumentTuple;\n  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;\n  typedef void MakeResultVoid(A1, A2, A3);\n  typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3);\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4>\nstruct Function<R(A1, A2, A3, A4)>\n    : Function<R(A1, A2, A3)> {\n  typedef A4 Argument4;\n  typedef ::testing::tuple<A1, A2, A3, A4> ArgumentTuple;\n  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;\n  typedef void MakeResultVoid(A1, A2, A3, A4);\n  typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4);\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5>\nstruct Function<R(A1, A2, A3, A4, A5)>\n    : Function<R(A1, A2, A3, A4)> {\n  typedef A5 Argument5;\n  typedef ::testing::tuple<A1, A2, A3, A4, A5> ArgumentTuple;\n  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;\n  typedef void MakeResultVoid(A1, A2, A3, A4, A5);\n  typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5);\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5, typename A6>\nstruct Function<R(A1, A2, A3, A4, A5, A6)>\n    : Function<R(A1, A2, A3, A4, A5)> {\n  typedef A6 Argument6;\n  typedef ::testing::tuple<A1, A2, A3, A4, A5, A6> ArgumentTuple;\n  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;\n  typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6);\n  typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6);\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5, typename A6, typename A7>\nstruct Function<R(A1, A2, A3, A4, A5, A6, A7)>\n    : Function<R(A1, A2, A3, A4, A5, A6)> {\n  typedef A7 Argument7;\n  typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> ArgumentTuple;\n  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;\n  typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7);\n  typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7);\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5, typename A6, typename A7, typename A8>\nstruct Function<R(A1, A2, A3, A4, A5, A6, A7, A8)>\n    : Function<R(A1, A2, A3, A4, A5, A6, A7)> {\n  typedef A8 Argument8;\n  typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> ArgumentTuple;\n  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;\n  typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8);\n  typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8);\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5, typename A6, typename A7, typename A8, typename A9>\nstruct Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)>\n    : Function<R(A1, A2, A3, A4, A5, A6, A7, A8)> {\n  typedef A9 Argument9;\n  typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> ArgumentTuple;\n  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;\n  typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9);\n  typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8,\n      A9);\n};\n\ntemplate <typename R, typename A1, typename A2, typename A3, typename A4,\n    typename A5, typename A6, typename A7, typename A8, typename A9,\n    typename A10>\nstruct Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)>\n    : Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> {\n  typedef A10 Argument10;\n  typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,\n      A10> ArgumentTuple;\n  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;\n  typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);\n  typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8,\n      A9, A10);\n};\n\n}  // namespace internal\n\n}  // namespace testing\n\n#endif  // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/internal/gmock-generated-internal-utils.h.pump",
    "content": "$$ -*- mode: c++; -*-\n$$ This is a Pump source file.  Please use Pump to convert it to\n$$ gmock-generated-function-mockers.h.\n$$\n$var n = 10  $$ The maximum arity we support.\n// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file contains template meta-programming utility classes needed\n// for implementing Google Mock.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_\n#define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_\n\n#include \"gmock/internal/gmock-port.h\"\n\nnamespace testing {\n\ntemplate <typename T>\nclass Matcher;\n\nnamespace internal {\n\n// An IgnoredValue object can be implicitly constructed from ANY value.\n// This is used in implementing the IgnoreResult(a) action.\nclass IgnoredValue {\n public:\n  // This constructor template allows any value to be implicitly\n  // converted to IgnoredValue.  The object has no data member and\n  // doesn't try to remember anything about the argument.  We\n  // deliberately omit the 'explicit' keyword in order to allow the\n  // conversion to be implicit.\n  template <typename T>\n  IgnoredValue(const T& /* ignored */) {}  // NOLINT(runtime/explicit)\n};\n\n// MatcherTuple<T>::type is a tuple type where each field is a Matcher\n// for the corresponding field in tuple type T.\ntemplate <typename Tuple>\nstruct MatcherTuple;\n\n\n$range i 0..n\n$for i [[\n$range j 1..i\n$var typename_As = [[$for j, [[typename A$j]]]]\n$var As = [[$for j, [[A$j]]]]\n$var matcher_As = [[$for j, [[Matcher<A$j>]]]]\ntemplate <$typename_As>\nstruct MatcherTuple< ::testing::tuple<$As> > {\n  typedef ::testing::tuple<$matcher_As > type;\n};\n\n\n]]\n// Template struct Function<F>, where F must be a function type, contains\n// the following typedefs:\n//\n//   Result:               the function's return type.\n//   ArgumentN:            the type of the N-th argument, where N starts with 1.\n//   ArgumentTuple:        the tuple type consisting of all parameters of F.\n//   ArgumentMatcherTuple: the tuple type consisting of Matchers for all\n//                         parameters of F.\n//   MakeResultVoid:       the function type obtained by substituting void\n//                         for the return type of F.\n//   MakeResultIgnoredValue:\n//                         the function type obtained by substituting Something\n//                         for the return type of F.\ntemplate <typename F>\nstruct Function;\n\ntemplate <typename R>\nstruct Function<R()> {\n  typedef R Result;\n  typedef ::testing::tuple<> ArgumentTuple;\n  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;\n  typedef void MakeResultVoid();\n  typedef IgnoredValue MakeResultIgnoredValue();\n};\n\n\n$range i 1..n\n$for i [[\n$range j 1..i\n$var typename_As = [[$for j [[, typename A$j]]]]\n$var As = [[$for j, [[A$j]]]]\n$var matcher_As = [[$for j, [[Matcher<A$j>]]]]\n$range k 1..i-1\n$var prev_As = [[$for k, [[A$k]]]]\ntemplate <typename R$typename_As>\nstruct Function<R($As)>\n    : Function<R($prev_As)> {\n  typedef A$i Argument$i;\n  typedef ::testing::tuple<$As> ArgumentTuple;\n  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;\n  typedef void MakeResultVoid($As);\n  typedef IgnoredValue MakeResultIgnoredValue($As);\n};\n\n\n]]\n}  // namespace internal\n\n}  // namespace testing\n\n#endif  // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/internal/gmock-internal-utils.h",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file defines some utilities useful for implementing Google\n// Mock.  They are subject to change without notice, so please DO NOT\n// USE THEM IN USER CODE.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_\n#define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_\n\n#include <stdio.h>\n#include <ostream>  // NOLINT\n#include <string>\n#include \"gmock/internal/gmock-generated-internal-utils.h\"\n#include \"gmock/internal/gmock-port.h\"\n#include \"gtest/gtest.h\"\n\nnamespace testing {\nnamespace internal {\n\n// Silence MSVC C4100 (unreferenced formal parameter) and\n// C4805('==': unsafe mix of type 'const int' and type 'const bool')\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4100)\n# pragma warning(disable:4805)\n#endif\n\n// Joins a vector of strings as if they are fields of a tuple; returns\n// the joined string.\nGTEST_API_ std::string JoinAsTuple(const Strings& fields);\n\n// Converts an identifier name to a space-separated list of lower-case\n// words.  Each maximum substring of the form [A-Za-z][a-z]*|\\d+ is\n// treated as one word.  For example, both \"FooBar123\" and\n// \"foo_bar_123\" are converted to \"foo bar 123\".\nGTEST_API_ std::string ConvertIdentifierNameToWords(const char* id_name);\n\n// PointeeOf<Pointer>::type is the type of a value pointed to by a\n// Pointer, which can be either a smart pointer or a raw pointer.  The\n// following default implementation is for the case where Pointer is a\n// smart pointer.\ntemplate <typename Pointer>\nstruct PointeeOf {\n  // Smart pointer classes define type element_type as the type of\n  // their pointees.\n  typedef typename Pointer::element_type type;\n};\n// This specialization is for the raw pointer case.\ntemplate <typename T>\nstruct PointeeOf<T*> { typedef T type; };  // NOLINT\n\n// GetRawPointer(p) returns the raw pointer underlying p when p is a\n// smart pointer, or returns p itself when p is already a raw pointer.\n// The following default implementation is for the smart pointer case.\ntemplate <typename Pointer>\ninline const typename Pointer::element_type* GetRawPointer(const Pointer& p) {\n  return p.get();\n}\n// This overloaded version is for the raw pointer case.\ntemplate <typename Element>\ninline Element* GetRawPointer(Element* p) { return p; }\n\n// This comparator allows linked_ptr to be stored in sets.\ntemplate <typename T>\nstruct LinkedPtrLessThan {\n  bool operator()(const ::testing::internal::linked_ptr<T>& lhs,\n                  const ::testing::internal::linked_ptr<T>& rhs) const {\n    return lhs.get() < rhs.get();\n  }\n};\n\n// Symbian compilation can be done with wchar_t being either a native\n// type or a typedef.  Using Google Mock with OpenC without wchar_t\n// should require the definition of _STLP_NO_WCHAR_T.\n//\n// MSVC treats wchar_t as a native type usually, but treats it as the\n// same as unsigned short when the compiler option /Zc:wchar_t- is\n// specified.  It defines _NATIVE_WCHAR_T_DEFINED symbol when wchar_t\n// is a native type.\n#if (GTEST_OS_SYMBIAN && defined(_STLP_NO_WCHAR_T)) || \\\n    (defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED))\n// wchar_t is a typedef.\n#else\n# define GMOCK_WCHAR_T_IS_NATIVE_ 1\n#endif\n\n// signed wchar_t and unsigned wchar_t are NOT in the C++ standard.\n// Using them is a bad practice and not portable.  So DON'T use them.\n//\n// Still, Google Mock is designed to work even if the user uses signed\n// wchar_t or unsigned wchar_t (obviously, assuming the compiler\n// supports them).\n//\n// To gcc,\n//   wchar_t == signed wchar_t != unsigned wchar_t == unsigned int\n#ifdef __GNUC__\n#if !defined(__WCHAR_UNSIGNED__)\n// signed/unsigned wchar_t are valid types.\n# define GMOCK_HAS_SIGNED_WCHAR_T_ 1\n#endif\n#endif\n\n// In what follows, we use the term \"kind\" to indicate whether a type\n// is bool, an integer type (excluding bool), a floating-point type,\n// or none of them.  This categorization is useful for determining\n// when a matcher argument type can be safely converted to another\n// type in the implementation of SafeMatcherCast.\nenum TypeKind {\n  kBool, kInteger, kFloatingPoint, kOther\n};\n\n// KindOf<T>::value is the kind of type T.\ntemplate <typename T> struct KindOf {\n  enum { value = kOther };  // The default kind.\n};\n\n// This macro declares that the kind of 'type' is 'kind'.\n#define GMOCK_DECLARE_KIND_(type, kind) \\\n  template <> struct KindOf<type> { enum { value = kind }; }\n\nGMOCK_DECLARE_KIND_(bool, kBool);\n\n// All standard integer types.\nGMOCK_DECLARE_KIND_(char, kInteger);\nGMOCK_DECLARE_KIND_(signed char, kInteger);\nGMOCK_DECLARE_KIND_(unsigned char, kInteger);\nGMOCK_DECLARE_KIND_(short, kInteger);  // NOLINT\nGMOCK_DECLARE_KIND_(unsigned short, kInteger);  // NOLINT\nGMOCK_DECLARE_KIND_(int, kInteger);\nGMOCK_DECLARE_KIND_(unsigned int, kInteger);\nGMOCK_DECLARE_KIND_(long, kInteger);  // NOLINT\nGMOCK_DECLARE_KIND_(unsigned long, kInteger);  // NOLINT\n\n#if GMOCK_WCHAR_T_IS_NATIVE_\nGMOCK_DECLARE_KIND_(wchar_t, kInteger);\n#endif\n\n// Non-standard integer types.\nGMOCK_DECLARE_KIND_(Int64, kInteger);\nGMOCK_DECLARE_KIND_(UInt64, kInteger);\n\n// All standard floating-point types.\nGMOCK_DECLARE_KIND_(float, kFloatingPoint);\nGMOCK_DECLARE_KIND_(double, kFloatingPoint);\nGMOCK_DECLARE_KIND_(long double, kFloatingPoint);\n\n#undef GMOCK_DECLARE_KIND_\n\n// Evaluates to the kind of 'type'.\n#define GMOCK_KIND_OF_(type) \\\n  static_cast< ::testing::internal::TypeKind>( \\\n      ::testing::internal::KindOf<type>::value)\n\n// Evaluates to true iff integer type T is signed.\n#define GMOCK_IS_SIGNED_(T) (static_cast<T>(-1) < 0)\n\n// LosslessArithmeticConvertibleImpl<kFromKind, From, kToKind, To>::value\n// is true iff arithmetic type From can be losslessly converted to\n// arithmetic type To.\n//\n// It's the user's responsibility to ensure that both From and To are\n// raw (i.e. has no CV modifier, is not a pointer, and is not a\n// reference) built-in arithmetic types, kFromKind is the kind of\n// From, and kToKind is the kind of To; the value is\n// implementation-defined when the above pre-condition is violated.\ntemplate <TypeKind kFromKind, typename From, TypeKind kToKind, typename To>\nstruct LosslessArithmeticConvertibleImpl : public false_type {};\n\n// Converting bool to bool is lossless.\ntemplate <>\nstruct LosslessArithmeticConvertibleImpl<kBool, bool, kBool, bool>\n    : public true_type {};  // NOLINT\n\n// Converting bool to any integer type is lossless.\ntemplate <typename To>\nstruct LosslessArithmeticConvertibleImpl<kBool, bool, kInteger, To>\n    : public true_type {};  // NOLINT\n\n// Converting bool to any floating-point type is lossless.\ntemplate <typename To>\nstruct LosslessArithmeticConvertibleImpl<kBool, bool, kFloatingPoint, To>\n    : public true_type {};  // NOLINT\n\n// Converting an integer to bool is lossy.\ntemplate <typename From>\nstruct LosslessArithmeticConvertibleImpl<kInteger, From, kBool, bool>\n    : public false_type {};  // NOLINT\n\n// Converting an integer to another non-bool integer is lossless iff\n// the target type's range encloses the source type's range.\ntemplate <typename From, typename To>\nstruct LosslessArithmeticConvertibleImpl<kInteger, From, kInteger, To>\n    : public bool_constant<\n      // When converting from a smaller size to a larger size, we are\n      // fine as long as we are not converting from signed to unsigned.\n      ((sizeof(From) < sizeof(To)) &&\n       (!GMOCK_IS_SIGNED_(From) || GMOCK_IS_SIGNED_(To))) ||\n      // When converting between the same size, the signedness must match.\n      ((sizeof(From) == sizeof(To)) &&\n       (GMOCK_IS_SIGNED_(From) == GMOCK_IS_SIGNED_(To)))> {};  // NOLINT\n\n#undef GMOCK_IS_SIGNED_\n\n// Converting an integer to a floating-point type may be lossy, since\n// the format of a floating-point number is implementation-defined.\ntemplate <typename From, typename To>\nstruct LosslessArithmeticConvertibleImpl<kInteger, From, kFloatingPoint, To>\n    : public false_type {};  // NOLINT\n\n// Converting a floating-point to bool is lossy.\ntemplate <typename From>\nstruct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kBool, bool>\n    : public false_type {};  // NOLINT\n\n// Converting a floating-point to an integer is lossy.\ntemplate <typename From, typename To>\nstruct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kInteger, To>\n    : public false_type {};  // NOLINT\n\n// Converting a floating-point to another floating-point is lossless\n// iff the target type is at least as big as the source type.\ntemplate <typename From, typename To>\nstruct LosslessArithmeticConvertibleImpl<\n  kFloatingPoint, From, kFloatingPoint, To>\n    : public bool_constant<sizeof(From) <= sizeof(To)> {};  // NOLINT\n\n// LosslessArithmeticConvertible<From, To>::value is true iff arithmetic\n// type From can be losslessly converted to arithmetic type To.\n//\n// It's the user's responsibility to ensure that both From and To are\n// raw (i.e. has no CV modifier, is not a pointer, and is not a\n// reference) built-in arithmetic types; the value is\n// implementation-defined when the above pre-condition is violated.\ntemplate <typename From, typename To>\nstruct LosslessArithmeticConvertible\n    : public LosslessArithmeticConvertibleImpl<\n  GMOCK_KIND_OF_(From), From, GMOCK_KIND_OF_(To), To> {};  // NOLINT\n\n// This interface knows how to report a Google Mock failure (either\n// non-fatal or fatal).\nclass FailureReporterInterface {\n public:\n  // The type of a failure (either non-fatal or fatal).\n  enum FailureType {\n    kNonfatal, kFatal\n  };\n\n  virtual ~FailureReporterInterface() {}\n\n  // Reports a failure that occurred at the given source file location.\n  virtual void ReportFailure(FailureType type, const char* file, int line,\n                             const std::string& message) = 0;\n};\n\n// Returns the failure reporter used by Google Mock.\nGTEST_API_ FailureReporterInterface* GetFailureReporter();\n\n// Asserts that condition is true; aborts the process with the given\n// message if condition is false.  We cannot use LOG(FATAL) or CHECK()\n// as Google Mock might be used to mock the log sink itself.  We\n// inline this function to prevent it from showing up in the stack\n// trace.\ninline void Assert(bool condition, const char* file, int line,\n                   const std::string& msg) {\n  if (!condition) {\n    GetFailureReporter()->ReportFailure(FailureReporterInterface::kFatal,\n                                        file, line, msg);\n  }\n}\ninline void Assert(bool condition, const char* file, int line) {\n  Assert(condition, file, line, \"Assertion failed.\");\n}\n\n// Verifies that condition is true; generates a non-fatal failure if\n// condition is false.\ninline void Expect(bool condition, const char* file, int line,\n                   const std::string& msg) {\n  if (!condition) {\n    GetFailureReporter()->ReportFailure(FailureReporterInterface::kNonfatal,\n                                        file, line, msg);\n  }\n}\ninline void Expect(bool condition, const char* file, int line) {\n  Expect(condition, file, line, \"Expectation failed.\");\n}\n\n// Severity level of a log.\nenum LogSeverity {\n  kInfo = 0,\n  kWarning = 1\n};\n\n// Valid values for the --gmock_verbose flag.\n\n// All logs (informational and warnings) are printed.\nconst char kInfoVerbosity[] = \"info\";\n// Only warnings are printed.\nconst char kWarningVerbosity[] = \"warning\";\n// No logs are printed.\nconst char kErrorVerbosity[] = \"error\";\n\n// Returns true iff a log with the given severity is visible according\n// to the --gmock_verbose flag.\nGTEST_API_ bool LogIsVisible(LogSeverity severity);\n\n// Prints the given message to stdout iff 'severity' >= the level\n// specified by the --gmock_verbose flag.  If stack_frames_to_skip >=\n// 0, also prints the stack trace excluding the top\n// stack_frames_to_skip frames.  In opt mode, any positive\n// stack_frames_to_skip is treated as 0, since we don't know which\n// function calls will be inlined by the compiler and need to be\n// conservative.\nGTEST_API_ void Log(LogSeverity severity, const std::string& message,\n                    int stack_frames_to_skip);\n\n// A marker class that is used to resolve parameterless expectations to the\n// correct overload. This must not be instantiable, to prevent client code from\n// accidentally resolving to the overload; for example:\n//\n//    ON_CALL(mock, Method({}, nullptr))...\n//\nclass WithoutMatchers {\n private:\n  WithoutMatchers() {}\n  friend GTEST_API_ WithoutMatchers GetWithoutMatchers();\n};\n\n// Internal use only: access the singleton instance of WithoutMatchers.\nGTEST_API_ WithoutMatchers GetWithoutMatchers();\n\n// FIXME: group all type utilities together.\n\n// Type traits.\n\n// is_reference<T>::value is non-zero iff T is a reference type.\ntemplate <typename T> struct is_reference : public false_type {};\ntemplate <typename T> struct is_reference<T&> : public true_type {};\n\n// type_equals<T1, T2>::value is non-zero iff T1 and T2 are the same type.\ntemplate <typename T1, typename T2> struct type_equals : public false_type {};\ntemplate <typename T> struct type_equals<T, T> : public true_type {};\n\n// remove_reference<T>::type removes the reference from type T, if any.\ntemplate <typename T> struct remove_reference { typedef T type; };  // NOLINT\ntemplate <typename T> struct remove_reference<T&> { typedef T type; }; // NOLINT\n\n// DecayArray<T>::type turns an array type U[N] to const U* and preserves\n// other types.  Useful for saving a copy of a function argument.\ntemplate <typename T> struct DecayArray { typedef T type; };  // NOLINT\ntemplate <typename T, size_t N> struct DecayArray<T[N]> {\n  typedef const T* type;\n};\n// Sometimes people use arrays whose size is not available at the use site\n// (e.g. extern const char kNamePrefix[]).  This specialization covers that\n// case.\ntemplate <typename T> struct DecayArray<T[]> {\n  typedef const T* type;\n};\n\n// Disable MSVC warnings for infinite recursion, since in this case the\n// the recursion is unreachable.\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4717)\n#endif\n\n// Invalid<T>() is usable as an expression of type T, but will terminate\n// the program with an assertion failure if actually run.  This is useful\n// when a value of type T is needed for compilation, but the statement\n// will not really be executed (or we don't care if the statement\n// crashes).\ntemplate <typename T>\ninline T Invalid() {\n  Assert(false, \"\", -1, \"Internal error: attempt to return invalid value\");\n  // This statement is unreachable, and would never terminate even if it\n  // could be reached. It is provided only to placate compiler warnings\n  // about missing return statements.\n  return Invalid<T>();\n}\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n\n// Given a raw type (i.e. having no top-level reference or const\n// modifier) RawContainer that's either an STL-style container or a\n// native array, class StlContainerView<RawContainer> has the\n// following members:\n//\n//   - type is a type that provides an STL-style container view to\n//     (i.e. implements the STL container concept for) RawContainer;\n//   - const_reference is a type that provides a reference to a const\n//     RawContainer;\n//   - ConstReference(raw_container) returns a const reference to an STL-style\n//     container view to raw_container, which is a RawContainer.\n//   - Copy(raw_container) returns an STL-style container view of a\n//     copy of raw_container, which is a RawContainer.\n//\n// This generic version is used when RawContainer itself is already an\n// STL-style container.\ntemplate <class RawContainer>\nclass StlContainerView {\n public:\n  typedef RawContainer type;\n  typedef const type& const_reference;\n\n  static const_reference ConstReference(const RawContainer& container) {\n    // Ensures that RawContainer is not a const type.\n    testing::StaticAssertTypeEq<RawContainer,\n        GTEST_REMOVE_CONST_(RawContainer)>();\n    return container;\n  }\n  static type Copy(const RawContainer& container) { return container; }\n};\n\n// This specialization is used when RawContainer is a native array type.\ntemplate <typename Element, size_t N>\nclass StlContainerView<Element[N]> {\n public:\n  typedef GTEST_REMOVE_CONST_(Element) RawElement;\n  typedef internal::NativeArray<RawElement> type;\n  // NativeArray<T> can represent a native array either by value or by\n  // reference (selected by a constructor argument), so 'const type'\n  // can be used to reference a const native array.  We cannot\n  // 'typedef const type& const_reference' here, as that would mean\n  // ConstReference() has to return a reference to a local variable.\n  typedef const type const_reference;\n\n  static const_reference ConstReference(const Element (&array)[N]) {\n    // Ensures that Element is not a const type.\n    testing::StaticAssertTypeEq<Element, RawElement>();\n#if GTEST_OS_SYMBIAN\n    // The Nokia Symbian compiler confuses itself in template instantiation\n    // for this call without the cast to Element*:\n    // function call '[testing::internal::NativeArray<char *>].NativeArray(\n    //     {lval} const char *[4], long, testing::internal::RelationToSource)'\n    //     does not match\n    // 'testing::internal::NativeArray<char *>::NativeArray(\n    //     char *const *, unsigned int, testing::internal::RelationToSource)'\n    // (instantiating: 'testing::internal::ContainsMatcherImpl\n    //     <const char * (&)[4]>::Matches(const char * (&)[4]) const')\n    // (instantiating: 'testing::internal::StlContainerView<char *[4]>::\n    //     ConstReference(const char * (&)[4])')\n    // (and though the N parameter type is mismatched in the above explicit\n    // conversion of it doesn't help - only the conversion of the array).\n    return type(const_cast<Element*>(&array[0]), N,\n                RelationToSourceReference());\n#else\n    return type(array, N, RelationToSourceReference());\n#endif  // GTEST_OS_SYMBIAN\n  }\n  static type Copy(const Element (&array)[N]) {\n#if GTEST_OS_SYMBIAN\n    return type(const_cast<Element*>(&array[0]), N, RelationToSourceCopy());\n#else\n    return type(array, N, RelationToSourceCopy());\n#endif  // GTEST_OS_SYMBIAN\n  }\n};\n\n// This specialization is used when RawContainer is a native array\n// represented as a (pointer, size) tuple.\ntemplate <typename ElementPointer, typename Size>\nclass StlContainerView< ::testing::tuple<ElementPointer, Size> > {\n public:\n  typedef GTEST_REMOVE_CONST_(\n      typename internal::PointeeOf<ElementPointer>::type) RawElement;\n  typedef internal::NativeArray<RawElement> type;\n  typedef const type const_reference;\n\n  static const_reference ConstReference(\n      const ::testing::tuple<ElementPointer, Size>& array) {\n    return type(get<0>(array), get<1>(array), RelationToSourceReference());\n  }\n  static type Copy(const ::testing::tuple<ElementPointer, Size>& array) {\n    return type(get<0>(array), get<1>(array), RelationToSourceCopy());\n  }\n};\n\n// The following specialization prevents the user from instantiating\n// StlContainer with a reference type.\ntemplate <typename T> class StlContainerView<T&>;\n\n// A type transform to remove constness from the first part of a pair.\n// Pairs like that are used as the value_type of associative containers,\n// and this transform produces a similar but assignable pair.\ntemplate <typename T>\nstruct RemoveConstFromKey {\n  typedef T type;\n};\n\n// Partially specialized to remove constness from std::pair<const K, V>.\ntemplate <typename K, typename V>\nstruct RemoveConstFromKey<std::pair<const K, V> > {\n  typedef std::pair<K, V> type;\n};\n\n// Mapping from booleans to types. Similar to boost::bool_<kValue> and\n// std::integral_constant<bool, kValue>.\ntemplate <bool kValue>\nstruct BooleanConstant {};\n\n// Emit an assertion failure due to incorrect DoDefault() usage. Out-of-lined to\n// reduce code size.\nGTEST_API_ void IllegalDoDefault(const char* file, int line);\n\n#if GTEST_LANG_CXX11\n// Helper types for Apply() below.\ntemplate <size_t... Is> struct int_pack { typedef int_pack type; };\n\ntemplate <class Pack, size_t I> struct append;\ntemplate <size_t... Is, size_t I>\nstruct append<int_pack<Is...>, I> : int_pack<Is..., I> {};\n\ntemplate <size_t C>\nstruct make_int_pack : append<typename make_int_pack<C - 1>::type, C - 1> {};\ntemplate <> struct make_int_pack<0> : int_pack<> {};\n\ntemplate <typename F, typename Tuple, size_t... Idx>\nauto ApplyImpl(F&& f, Tuple&& args, int_pack<Idx...>) -> decltype(\n    std::forward<F>(f)(std::get<Idx>(std::forward<Tuple>(args))...)) {\n  return std::forward<F>(f)(std::get<Idx>(std::forward<Tuple>(args))...);\n}\n\n// Apply the function to a tuple of arguments.\ntemplate <typename F, typename Tuple>\nauto Apply(F&& f, Tuple&& args)\n    -> decltype(ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),\n                          make_int_pack<std::tuple_size<Tuple>::value>())) {\n  return ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),\n                   make_int_pack<std::tuple_size<Tuple>::value>());\n}\n#endif\n\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/include/gmock/internal/gmock-port.h",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Low-level types and utilities for porting Google Mock to various\n// platforms.  All macros ending with _ and symbols defined in an\n// internal namespace are subject to change without notice.  Code\n// outside Google Mock MUST NOT USE THEM DIRECTLY.  Macros that don't\n// end with _ are part of Google Mock's public API and can be used by\n// code outside Google Mock.\n\n// GOOGLETEST_CM0002 DO NOT DELETE\n\n#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_\n#define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_\n\n#include <assert.h>\n#include <stdlib.h>\n#include <iostream>\n\n// Most of the utilities needed for porting Google Mock are also\n// required for Google Test and are defined in gtest-port.h.\n//\n// Note to maintainers: to reduce code duplication, prefer adding\n// portability utilities to Google Test's gtest-port.h instead of\n// here, as Google Mock depends on Google Test.  Only add a utility\n// here if it's truly specific to Google Mock.\n\n#include \"gtest/internal/gtest-linked_ptr.h\"\n#include \"gtest/internal/gtest-port.h\"\n#include \"gmock/internal/custom/gmock-port.h\"\n\n// For MS Visual C++, check the compiler version. At least VS 2003 is\n// required to compile Google Mock.\n#if defined(_MSC_VER) && _MSC_VER < 1310\n# error \"At least Visual C++ 2003 (7.1) is required to compile Google Mock.\"\n#endif\n\n// Macro for referencing flags.  This is public as we want the user to\n// use this syntax to reference Google Mock flags.\n#define GMOCK_FLAG(name) FLAGS_gmock_##name\n\n#if !defined(GMOCK_DECLARE_bool_)\n\n// Macros for declaring flags.\n# define GMOCK_DECLARE_bool_(name) extern GTEST_API_ bool GMOCK_FLAG(name)\n# define GMOCK_DECLARE_int32_(name) \\\n    extern GTEST_API_ ::testing::internal::Int32 GMOCK_FLAG(name)\n# define GMOCK_DECLARE_string_(name) \\\n    extern GTEST_API_ ::std::string GMOCK_FLAG(name)\n\n// Macros for defining flags.\n# define GMOCK_DEFINE_bool_(name, default_val, doc) \\\n    GTEST_API_ bool GMOCK_FLAG(name) = (default_val)\n# define GMOCK_DEFINE_int32_(name, default_val, doc) \\\n    GTEST_API_ ::testing::internal::Int32 GMOCK_FLAG(name) = (default_val)\n# define GMOCK_DEFINE_string_(name, default_val, doc) \\\n    GTEST_API_ ::std::string GMOCK_FLAG(name) = (default_val)\n\n#endif  // !defined(GMOCK_DECLARE_bool_)\n\n#endif  // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/msvc/2005/gmock.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 9.00\n# Visual Studio 2005\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gmock\", \"gmock.vcproj\", \"{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gmock_test\", \"gmock_test.vcproj\", \"{F10D22F8-AC7B-4213-8720-608E7D878CD2}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gmock_main\", \"gmock_main.vcproj\", \"{E4EF614B-30DF-4954-8C53-580A0BF6B589}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Win32 = Debug|Win32\n\t\tRelease|Win32 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|Win32.Build.0 = Release|Win32\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Release|Win32.Build.0 = Release|Win32\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Release|Win32.Build.0 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/msvc/2005/gmock.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\n<VisualStudioProject\n\tProjectType=\"Visual C++\"\n\tVersion=\"8.00\"\n\tName=\"gmock\"\n\tProjectGUID=\"{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}\"\n\tRootNamespace=\"gmock\"\n\tKeyword=\"Win32Proj\"\n\t>\n\t<Platforms>\n\t\t<Platform\n\t\t\tName=\"Win32\"\n\t\t/>\n\t</Platforms>\n\t<ToolFiles>\n\t</ToolFiles>\n\t<Configurations>\n\t\t<Configuration\n\t\t\tName=\"Debug|Win32\"\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\n\t\t\tIntermediateDirectory=\"$(OutDir)\\$(ProjectName)\"\n\t\t\tConfigurationType=\"4\"\n\t\t\tInheritedPropertySheets=\".\\gmock_config.vsprops\"\n\t\t\tCharacterSet=\"1\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tOptimization=\"0\"\n\t\t\t\tAdditionalIncludeDirectories=\"..\\..\\include;..\\..\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_LIB\"\n\t\t\t\tMinimalRebuild=\"true\"\n\t\t\t\tBasicRuntimeChecks=\"3\"\n\t\t\t\tRuntimeLibrary=\"1\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"3\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLibrarianTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t\t<Configuration\n\t\t\tName=\"Release|Win32\"\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\n\t\t\tIntermediateDirectory=\"$(OutDir)\\$(ProjectName)\"\n\t\t\tConfigurationType=\"4\"\n\t\t\tInheritedPropertySheets=\".\\gmock_config.vsprops\"\n\t\t\tCharacterSet=\"1\"\n\t\t\tWholeProgramOptimization=\"1\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalIncludeDirectories=\"..\\..\\include;..\\..\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_LIB\"\n\t\t\t\tRuntimeLibrary=\"0\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"3\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLibrarianTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t</Configurations>\n\t<References>\n\t</References>\n\t<Files>\n\t\t<Filter\n\t\t\tName=\"Source Files\"\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\..\\src\\gmock-all.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"$(GTestDir)\\src\\gtest-all.cc\"\n\t\t\t\t>\n\t\t\t\t<FileConfiguration\n\t\t\t\t\tName=\"Debug|Win32\"\n\t\t\t\t\t>\n\t\t\t\t\t<Tool\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"$(GTestDir)\"\n\t\t\t\t\t/>\n\t\t\t\t</FileConfiguration>\n\t\t\t\t<FileConfiguration\n\t\t\t\t\tName=\"Release|Win32\"\n\t\t\t\t\t>\n\t\t\t\t\t<Tool\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"$(GTestDir)\"\n\t\t\t\t\t/>\n\t\t\t\t</FileConfiguration>\n\t\t\t</File>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Public Header Files\"\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\n\t\t\t>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Private Header Files\"\n\t\t\t>\n\t\t</Filter>\n\t</Files>\n\t<Globals>\n\t</Globals>\n</VisualStudioProject>\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/msvc/2005/gmock_config.vsprops",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\n<VisualStudioPropertySheet\n\tProjectType=\"Visual C++\"\n\tVersion=\"8.00\"\n\tName=\"gmock_config\"\n\t>\n\t<Tool\n\t\tName=\"VCCLCompilerTool\"\n\t\tAdditionalIncludeDirectories=\"&quot;$(GTestDir)/include&quot;\"\n\t/>\n\t<UserMacro\n\t\tName=\"GTestDir\"\n\t\tValue=\"../../../googletest\"\n\t/>\n</VisualStudioPropertySheet>\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/msvc/2005/gmock_main.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\n<VisualStudioProject\n\tProjectType=\"Visual C++\"\n\tVersion=\"8.00\"\n\tName=\"gmock_main\"\n\tProjectGUID=\"{E4EF614B-30DF-4954-8C53-580A0BF6B589}\"\n\tRootNamespace=\"gmock_main\"\n\tKeyword=\"Win32Proj\"\n\t>\n\t<Platforms>\n\t\t<Platform\n\t\t\tName=\"Win32\"\n\t\t/>\n\t</Platforms>\n\t<ToolFiles>\n\t</ToolFiles>\n\t<Configurations>\n\t\t<Configuration\n\t\t\tName=\"Debug|Win32\"\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\n\t\t\tIntermediateDirectory=\"$(OutDir)\\$(ProjectName)\"\n\t\t\tConfigurationType=\"4\"\n\t\t\tInheritedPropertySheets=\".\\gmock_config.vsprops\"\n\t\t\tCharacterSet=\"1\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tOptimization=\"0\"\n\t\t\t\tAdditionalIncludeDirectories=\"../../include\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_LIB\"\n\t\t\t\tMinimalRebuild=\"true\"\n\t\t\t\tBasicRuntimeChecks=\"3\"\n\t\t\t\tRuntimeLibrary=\"1\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"3\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLibrarianTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t\t<Configuration\n\t\t\tName=\"Release|Win32\"\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\n\t\t\tIntermediateDirectory=\"$(OutDir)\\$(ProjectName)\"\n\t\t\tConfigurationType=\"4\"\n\t\t\tInheritedPropertySheets=\".\\gmock_config.vsprops\"\n\t\t\tCharacterSet=\"1\"\n\t\t\tWholeProgramOptimization=\"1\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalIncludeDirectories=\"../../include\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_LIB\"\n\t\t\t\tRuntimeLibrary=\"0\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"3\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLibrarianTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t</Configurations>\n\t<References>\n\t\t<ProjectReference\n\t\t\tReferencedProjectIdentifier=\"{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}\"\n\t\t\tRelativePathToProject=\".\\gmock.vcproj\"\n\t\t/>\n\t</References>\n\t<Files>\n\t\t<Filter\n\t\t\tName=\"Source Files\"\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\..\\src\\gmock_main.cc\"\n\t\t\t\t>\n\t\t\t\t<FileConfiguration\n\t\t\t\t\tName=\"Debug|Win32\"\n\t\t\t\t\t>\n\t\t\t\t\t<Tool\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"../../include\"\n\t\t\t\t\t/>\n\t\t\t\t</FileConfiguration>\n\t\t\t\t<FileConfiguration\n\t\t\t\t\tName=\"Release|Win32\"\n\t\t\t\t\t>\n\t\t\t\t\t<Tool\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"../../include\"\n\t\t\t\t\t/>\n\t\t\t\t</FileConfiguration>\n\t\t\t</File>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Header Files\"\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\n\t\t\t>\n\t\t</Filter>\n\t</Files>\n\t<Globals>\n\t</Globals>\n</VisualStudioProject>\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/msvc/2005/gmock_test.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\n<VisualStudioProject\n\tProjectType=\"Visual C++\"\n\tVersion=\"8.00\"\n\tName=\"gmock_test\"\n\tProjectGUID=\"{F10D22F8-AC7B-4213-8720-608E7D878CD2}\"\n\tRootNamespace=\"gmock_test\"\n\tKeyword=\"Win32Proj\"\n\t>\n\t<Platforms>\n\t\t<Platform\n\t\t\tName=\"Win32\"\n\t\t/>\n\t</Platforms>\n\t<ToolFiles>\n\t</ToolFiles>\n\t<Configurations>\n\t\t<Configuration\n\t\t\tName=\"Debug|Win32\"\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\n\t\t\tIntermediateDirectory=\"$(OutDir)\\$(ProjectName)\"\n\t\t\tConfigurationType=\"1\"\n\t\t\tInheritedPropertySheets=\".\\gmock_config.vsprops\"\n\t\t\tCharacterSet=\"1\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalOptions=\"/bigobj\"\n\t\t\t\tOptimization=\"0\"\n\t\t\t\tAdditionalIncludeDirectories=\"..\\..\\include;..\\..\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\n\t\t\t\tMinimalRebuild=\"true\"\n\t\t\t\tBasicRuntimeChecks=\"3\"\n\t\t\t\tRuntimeLibrary=\"1\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"3\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLinkerTool\"\n\t\t\t\tLinkIncremental=\"2\"\n\t\t\t\tGenerateDebugInformation=\"true\"\n\t\t\t\tSubSystem=\"1\"\n\t\t\t\tTargetMachine=\"1\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManifestTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCAppVerifierTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebDeploymentTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t\t<Configuration\n\t\t\tName=\"Release|Win32\"\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\n\t\t\tIntermediateDirectory=\"$(OutDir)\\$(ProjectName)\"\n\t\t\tConfigurationType=\"1\"\n\t\t\tInheritedPropertySheets=\".\\gmock_config.vsprops\"\n\t\t\tCharacterSet=\"1\"\n\t\t\tWholeProgramOptimization=\"1\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalOptions=\"/bigobj\"\n\t\t\t\tAdditionalIncludeDirectories=\"..\\..\\include;..\\..\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\n\t\t\t\tRuntimeLibrary=\"0\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"3\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLinkerTool\"\n\t\t\t\tLinkIncremental=\"1\"\n\t\t\t\tGenerateDebugInformation=\"true\"\n\t\t\t\tSubSystem=\"1\"\n\t\t\t\tOptimizeReferences=\"2\"\n\t\t\t\tEnableCOMDATFolding=\"2\"\n\t\t\t\tTargetMachine=\"1\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManifestTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCAppVerifierTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebDeploymentTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t</Configurations>\n\t<References>\n\t\t<ProjectReference\n\t\t\tReferencedProjectIdentifier=\"{E4EF614B-30DF-4954-8C53-580A0BF6B589}\"\n\t\t\tRelativePathToProject=\".\\gmock_main.vcproj\"\n\t\t/>\n\t</References>\n\t<Files>\n\t\t<Filter\n\t\t\tName=\"Source Files\"\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\..\\test\\gmock_all_test.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Header Files\"\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\n\t\t\t>\n\t\t</Filter>\n\t</Files>\n\t<Globals>\n\t</Globals>\n</VisualStudioProject>\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/msvc/2010/gmock.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 11.00\n# Visual C++ Express 2010\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gmock\", \"gmock.vcxproj\", \"{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gmock_test\", \"gmock_test.vcxproj\", \"{F10D22F8-AC7B-4213-8720-608E7D878CD2}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gmock_main\", \"gmock_main.vcxproj\", \"{E4EF614B-30DF-4954-8C53-580A0BF6B589}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Win32 = Debug|Win32\n\t\tDebug|x64 = Debug|x64\n\t\tRelease|Win32 = Release|Win32\n\t\tRelease|x64 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|x64.Build.0 = Debug|x64\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|Win32.Build.0 = Release|Win32\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|x64.ActiveCfg = Release|x64\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|x64.Build.0 = Release|x64\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Debug|x64.Build.0 = Debug|x64\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Release|Win32.Build.0 = Release|Win32\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Release|x64.ActiveCfg = Release|x64\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Release|x64.Build.0 = Release|x64\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Debug|x64.Build.0 = Debug|x64\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Release|Win32.Build.0 = Release|Win32\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Release|x64.ActiveCfg = Release|x64\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Release|x64.Build.0 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/msvc/2010/gmock.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}</ProjectGuid>\n    <RootNamespace>gmock</RootNamespace>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\src\\gmock-all.cc\" />\n    <ClCompile Include=\"$(GTestDir)\\src\\gtest-all.cc\">\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(GTestDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(GTestDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(GTestDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(GTestDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/msvc/2010/gmock_config.props",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup Label=\"UserMacros\">\n    <GTestDir>../../../googletest</GTestDir>\n  </PropertyGroup>\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(GTestDir)/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <BuildMacro Include=\"GTestDir\">\n      <Value>$(GTestDir)</Value>\n    </BuildMacro>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/msvc/2010/gmock_main.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{E4EF614B-30DF-4954-8C53-580A0BF6B589}</ProjectGuid>\n    <RootNamespace>gmock_main</RootNamespace>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"gmock.vcxproj\">\n      <Project>{34681f0d-ce45-415d-b5f2-5c662dfe3bd5}</Project>\n      <CopyLocalSatelliteAssemblies>true</CopyLocalSatelliteAssemblies>\n      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\src\\gmock_main.cc\">\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/msvc/2010/gmock_test.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{F10D22F8-AC7B-4213-8720-608E7D878CD2}</ProjectGuid>\n    <RootNamespace>gmock_test</RootNamespace>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;$(GTestDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;$(GTestDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;$(GTestDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;$(GTestDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"gmock_main.vcxproj\">\n      <Project>{e4ef614b-30df-4954-8c53-580a0bf6b589}</Project>\n      <CopyLocalSatelliteAssemblies>true</CopyLocalSatelliteAssemblies>\n      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\test\\gmock_all_test.cc\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/msvc/2015/gmock.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gmock\", \"gmock.vcxproj\", \"{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gmock_test\", \"gmock_test.vcxproj\", \"{F10D22F8-AC7B-4213-8720-608E7D878CD2}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gmock_main\", \"gmock_main.vcxproj\", \"{E4EF614B-30DF-4954-8C53-580A0BF6B589}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Win32 = Debug|Win32\n\t\tDebug|x64 = Debug|x64\n\t\tRelease|Win32 = Release|Win32\n\t\tRelease|x64 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|x64.Build.0 = Debug|x64\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|Win32.Build.0 = Release|Win32\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|x64.ActiveCfg = Release|x64\n\t\t{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|x64.Build.0 = Release|x64\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Debug|x64.Build.0 = Debug|x64\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Release|Win32.Build.0 = Release|Win32\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Release|x64.ActiveCfg = Release|x64\n\t\t{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Release|x64.Build.0 = Release|x64\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Debug|x64.Build.0 = Debug|x64\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Release|Win32.Build.0 = Release|Win32\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Release|x64.ActiveCfg = Release|x64\n\t\t{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Release|x64.Build.0 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/msvc/2015/gmock.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}</ProjectGuid>\n    <RootNamespace>gmock</RootNamespace>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\src\\gmock-all.cc\" />\n    <ClCompile Include=\"$(GTestDir)\\src\\gtest-all.cc\">\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(GTestDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(GTestDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(GTestDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(GTestDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/msvc/2015/gmock_config.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup Label=\"UserMacros\">\n    <GTestDir>../../../googletest</GTestDir>\n  </PropertyGroup>\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(GTestDir)/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <BuildMacro Include=\"GTestDir\">\n      <Value>$(GTestDir)</Value>\n    </BuildMacro>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/msvc/2015/gmock_main.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{E4EF614B-30DF-4954-8C53-580A0BF6B589}</ProjectGuid>\n    <RootNamespace>gmock_main</RootNamespace>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"gmock.vcxproj\">\n      <Project>{34681f0d-ce45-415d-b5f2-5c662dfe3bd5}</Project>\n      <CopyLocalSatelliteAssemblies>true</CopyLocalSatelliteAssemblies>\n      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\src\\gmock_main.cc\">\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/msvc/2015/gmock_test.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{F10D22F8-AC7B-4213-8720-608E7D878CD2}</ProjectGuid>\n    <RootNamespace>gmock_test</RootNamespace>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"gmock_config.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(SolutionDir)$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;$(GTestDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;$(GTestDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;$(GTestDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;$(GTestDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"gmock_main.vcxproj\">\n      <Project>{e4ef614b-30df-4954-8c53-580a0bf6b589}</Project>\n      <CopyLocalSatelliteAssemblies>true</CopyLocalSatelliteAssemblies>\n      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\test\\gmock_all_test.cc\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/scripts/fuse_gmock_files.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"fuse_gmock_files.py v0.1.0\nFuses Google Mock and Google Test source code into two .h files and a .cc file.\n\nSYNOPSIS\n       fuse_gmock_files.py [GMOCK_ROOT_DIR] OUTPUT_DIR\n\n       Scans GMOCK_ROOT_DIR for Google Mock and Google Test source\n       code, assuming Google Test is in the GMOCK_ROOT_DIR/../googletest\n       directory, and generates three files:\n       OUTPUT_DIR/gtest/gtest.h, OUTPUT_DIR/gmock/gmock.h, and\n       OUTPUT_DIR/gmock-gtest-all.cc.  Then you can build your tests\n       by adding OUTPUT_DIR to the include search path and linking\n       with OUTPUT_DIR/gmock-gtest-all.cc.  These three files contain\n       everything you need to use Google Mock.  Hence you can\n       \"install\" Google Mock by copying them to wherever you want.\n\n       GMOCK_ROOT_DIR can be omitted and defaults to the parent\n       directory of the directory holding this script.\n\nEXAMPLES\n       ./fuse_gmock_files.py fused_gmock\n       ./fuse_gmock_files.py path/to/unpacked/gmock fused_gmock\n\nThis tool is experimental.  In particular, it assumes that there is no\nconditional inclusion of Google Mock or Google Test headers.  Please\nreport any problems to googlemock@googlegroups.com.  You can read\nhttps://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md for more\ninformation.\n\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport re\nimport sets\nimport sys\n\n# We assume that this file is in the scripts/ directory in the Google\n# Mock root directory.\nDEFAULT_GMOCK_ROOT_DIR = os.path.join(os.path.dirname(__file__), '..')\n\n# We need to call into googletest/scripts/fuse_gtest_files.py.\nsys.path.append(os.path.join(DEFAULT_GMOCK_ROOT_DIR, '../googletest/scripts'))\nimport fuse_gtest_files\ngtest = fuse_gtest_files\n\n# Regex for matching '#include \"gmock/...\"'.\nINCLUDE_GMOCK_FILE_REGEX = re.compile(r'^\\s*#\\s*include\\s*\"(gmock/.+)\"')\n\n# Where to find the source seed files.\nGMOCK_H_SEED = 'include/gmock/gmock.h'\nGMOCK_ALL_CC_SEED = 'src/gmock-all.cc'\n\n# Where to put the generated files.\nGTEST_H_OUTPUT = 'gtest/gtest.h'\nGMOCK_H_OUTPUT = 'gmock/gmock.h'\nGMOCK_GTEST_ALL_CC_OUTPUT = 'gmock-gtest-all.cc'\n\n\ndef GetGTestRootDir(gmock_root):\n  \"\"\"Returns the root directory of Google Test.\"\"\"\n\n  return os.path.join(gmock_root, '../googletest')\n\n\ndef ValidateGMockRootDir(gmock_root):\n  \"\"\"Makes sure gmock_root points to a valid gmock root directory.\n\n  The function aborts the program on failure.\n  \"\"\"\n\n  gtest.ValidateGTestRootDir(GetGTestRootDir(gmock_root))\n  gtest.VerifyFileExists(gmock_root, GMOCK_H_SEED)\n  gtest.VerifyFileExists(gmock_root, GMOCK_ALL_CC_SEED)\n\n\ndef ValidateOutputDir(output_dir):\n  \"\"\"Makes sure output_dir points to a valid output directory.\n\n  The function aborts the program on failure.\n  \"\"\"\n\n  gtest.VerifyOutputFile(output_dir, gtest.GTEST_H_OUTPUT)\n  gtest.VerifyOutputFile(output_dir, GMOCK_H_OUTPUT)\n  gtest.VerifyOutputFile(output_dir, GMOCK_GTEST_ALL_CC_OUTPUT)\n\n\ndef FuseGMockH(gmock_root, output_dir):\n  \"\"\"Scans folder gmock_root to generate gmock/gmock.h in output_dir.\"\"\"\n\n  output_file = file(os.path.join(output_dir, GMOCK_H_OUTPUT), 'w')\n  processed_files = sets.Set()  # Holds all gmock headers we've processed.\n\n  def ProcessFile(gmock_header_path):\n    \"\"\"Processes the given gmock header file.\"\"\"\n\n    # We don't process the same header twice.\n    if gmock_header_path in processed_files:\n      return\n\n    processed_files.add(gmock_header_path)\n\n    # Reads each line in the given gmock header.\n    for line in file(os.path.join(gmock_root, gmock_header_path), 'r'):\n      m = INCLUDE_GMOCK_FILE_REGEX.match(line)\n      if m:\n        # It's '#include \"gmock/...\"' - let's process it recursively.\n        ProcessFile('include/' + m.group(1))\n      else:\n        m = gtest.INCLUDE_GTEST_FILE_REGEX.match(line)\n        if m:\n          # It's '#include \"gtest/foo.h\"'.  We translate it to\n          # \"gtest/gtest.h\", regardless of what foo is, since all\n          # gtest headers are fused into gtest/gtest.h.\n\n          # There is no need to #include gtest.h twice.\n          if not gtest.GTEST_H_SEED in processed_files:\n            processed_files.add(gtest.GTEST_H_SEED)\n            output_file.write('#include \"%s\"\\n' % (gtest.GTEST_H_OUTPUT,))\n        else:\n          # Otherwise we copy the line unchanged to the output file.\n          output_file.write(line)\n\n  ProcessFile(GMOCK_H_SEED)\n  output_file.close()\n\n\ndef FuseGMockAllCcToFile(gmock_root, output_file):\n  \"\"\"Scans folder gmock_root to fuse gmock-all.cc into output_file.\"\"\"\n\n  processed_files = sets.Set()\n\n  def ProcessFile(gmock_source_file):\n    \"\"\"Processes the given gmock source file.\"\"\"\n\n    # We don't process the same #included file twice.\n    if gmock_source_file in processed_files:\n      return\n\n    processed_files.add(gmock_source_file)\n\n    # Reads each line in the given gmock source file.\n    for line in file(os.path.join(gmock_root, gmock_source_file), 'r'):\n      m = INCLUDE_GMOCK_FILE_REGEX.match(line)\n      if m:\n        # It's '#include \"gmock/foo.h\"'.  We treat it as '#include\n        # \"gmock/gmock.h\"', as all other gmock headers are being fused\n        # into gmock.h and cannot be #included directly.\n\n        # There is no need to #include \"gmock/gmock.h\" more than once.\n        if not GMOCK_H_SEED in processed_files:\n          processed_files.add(GMOCK_H_SEED)\n          output_file.write('#include \"%s\"\\n' % (GMOCK_H_OUTPUT,))\n      else:\n        m = gtest.INCLUDE_GTEST_FILE_REGEX.match(line)\n        if m:\n          # It's '#include \"gtest/...\"'.\n          # There is no need to #include gtest.h as it has been\n          # #included by gtest-all.cc.\n          pass\n        else:\n          m = gtest.INCLUDE_SRC_FILE_REGEX.match(line)\n          if m:\n            # It's '#include \"src/foo\"' - let's process it recursively.\n            ProcessFile(m.group(1))\n          else:\n            # Otherwise we copy the line unchanged to the output file.\n            output_file.write(line)\n\n  ProcessFile(GMOCK_ALL_CC_SEED)\n\n\ndef FuseGMockGTestAllCc(gmock_root, output_dir):\n  \"\"\"Scans folder gmock_root to generate gmock-gtest-all.cc in output_dir.\"\"\"\n\n  output_file = file(os.path.join(output_dir, GMOCK_GTEST_ALL_CC_OUTPUT), 'w')\n  # First, fuse gtest-all.cc into gmock-gtest-all.cc.\n  gtest.FuseGTestAllCcToFile(GetGTestRootDir(gmock_root), output_file)\n  # Next, append fused gmock-all.cc to gmock-gtest-all.cc.\n  FuseGMockAllCcToFile(gmock_root, output_file)\n  output_file.close()\n\n\ndef FuseGMock(gmock_root, output_dir):\n  \"\"\"Fuses gtest.h, gmock.h, and gmock-gtest-all.h.\"\"\"\n\n  ValidateGMockRootDir(gmock_root)\n  ValidateOutputDir(output_dir)\n\n  gtest.FuseGTestH(GetGTestRootDir(gmock_root), output_dir)\n  FuseGMockH(gmock_root, output_dir)\n  FuseGMockGTestAllCc(gmock_root, output_dir)\n\n\ndef main():\n  argc = len(sys.argv)\n  if argc == 2:\n    # fuse_gmock_files.py OUTPUT_DIR\n    FuseGMock(DEFAULT_GMOCK_ROOT_DIR, sys.argv[1])\n  elif argc == 3:\n    # fuse_gmock_files.py GMOCK_ROOT_DIR OUTPUT_DIR\n    FuseGMock(sys.argv[1], sys.argv[2])\n  else:\n    print __doc__\n    sys.exit(1)\n\n\nif __name__ == '__main__':\n  main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/scripts/generator/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [2007] Neal Norwitz\n   Portions Copyright [2007] Google Inc.\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/scripts/generator/README",
    "content": "\nThe Google Mock class generator is an application that is part of cppclean.\nFor more information about cppclean, visit http://code.google.com/p/cppclean/\n\nThe mock generator requires Python 2.3.5 or later.  If you don't have Python\ninstalled on your system, you will also need to install it.  You can download\nPython from:  http://www.python.org/download/releases/\n\nTo use the Google Mock class generator, you need to call it\non the command line passing the header file and class for which you want\nto generate a Google Mock class.\n\nMake sure to install the scripts somewhere in your path.  Then you can\nrun the program.\n\n  gmock_gen.py header-file.h [ClassName]...\n\nIf no ClassNames are specified, all classes in the file are emitted.\n\nTo change the indentation from the default of 2, set INDENT in\nthe environment.  For example to use an indent of 4 spaces:\n\nINDENT=4 gmock_gen.py header-file.h ClassName\n\nThis version was made from SVN revision 281 in the cppclean repository.\n\nKnown Limitations\n-----------------\nNot all code will be generated properly.  For example, when mocking templated\nclasses, the template information is lost.  You will need to add the template\ninformation manually.\n\nNot all permutations of using multiple pointers/references will be rendered\nproperly.  These will also have to be fixed manually.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/scripts/generator/README.cppclean",
    "content": "Goal:\n-----\n  CppClean attempts to find problems in C++ source that slow development\n  in large code bases, for example various forms of unused code.\n  Unused code can be unused functions, methods, data members, types, etc\n  to unnecessary #include directives.  Unnecessary #includes can cause\n  considerable extra compiles increasing the edit-compile-run cycle.\n\n  The project home page is:   http://code.google.com/p/cppclean/\n\n\nFeatures:\n---------\n * Find and print C++ language constructs: classes, methods, functions, etc.\n * Find classes with virtual methods, no virtual destructor, and no bases\n * Find global/static data that are potential problems when using threads\n * Unnecessary forward class declarations\n * Unnecessary function declarations\n * Undeclared function definitions\n * (planned) Find unnecessary header files #included\n   - No direct reference to anything in the header\n   - Header is unnecessary if classes were forward declared instead\n * (planned) Source files that reference headers not directly #included,\n   ie, files that rely on a transitive #include from another header\n * (planned) Unused members (private, protected, & public) methods and data\n * (planned) Store AST in a SQL database so relationships can be queried\n\nAST is Abstract Syntax Tree, a representation of parsed source code.\nhttp://en.wikipedia.org/wiki/Abstract_syntax_tree\n\n\nSystem Requirements:\n--------------------\n * Python 2.4 or later (2.3 probably works too)\n * Works on Windows (untested), Mac OS X, and Unix\n\n\nHow to Run:\n-----------\n  For all examples, it is assumed that cppclean resides in a directory called\n  /cppclean.\n\n  To print warnings for classes with virtual methods, no virtual destructor and\n  no base classes:\n\n      /cppclean/run.sh nonvirtual_dtors.py file1.h file2.h file3.cc ...\n\n  To print all the functions defined in header file(s):\n\n      /cppclean/run.sh functions.py file1.h file2.h ...\n\n  All the commands take multiple files on the command line.  Other programs\n  include: find_warnings, headers, methods, and types.  Some other programs\n  are available, but used primarily for debugging.\n\n  run.sh is a simple wrapper that sets PYTHONPATH to /cppclean and then\n  runs the program in /cppclean/cpp/PROGRAM.py.  There is currently\n  no equivalent for Windows.  Contributions for a run.bat file\n  would be greatly appreciated.\n\n\nHow to Configure:\n-----------------\n  You can add a siteheaders.py file in /cppclean/cpp to configure where\n  to look for other headers (typically -I options passed to a compiler).\n  Currently two values are supported:  _TRANSITIVE and GetIncludeDirs.\n  _TRANSITIVE should be set to a boolean value (True or False) indicating\n  whether to transitively process all header files.  The default is False.\n\n  GetIncludeDirs is a function that takes a single argument and returns\n  a sequence of directories to include.  This can be a generator or\n  return a static list.\n\n      def GetIncludeDirs(filename):\n          return ['/some/path/with/other/headers']\n\n      # Here is a more complicated example.\n      def GetIncludeDirs(filename):\n          yield '/path1'\n          yield os.path.join('/path2', os.path.dirname(filename))\n          yield '/path3'\n\n\nHow to Test:\n------------\n  For all examples, it is assumed that cppclean resides in a directory called\n  /cppclean.  The tests require\n\n  cd /cppclean\n  make test\n  # To generate expected results after a change:\n  make expected\n\n\nCurrent Status:\n---------------\n  The parser works pretty well for header files, parsing about 99% of Google's\n  header files.  Anything which inspects structure of C++ source files should\n  work reasonably well.  Function bodies are not transformed to an AST,\n  but left as tokens.  Much work is still needed on finding unused header files\n  and storing an AST in a database.\n\n\nNon-goals:\n----------\n * Parsing all valid C++ source\n * Handling invalid C++ source gracefully\n * Compiling to machine code (or anything beyond an AST)\n\n\nContact:\n--------\n  If you used cppclean, I would love to hear about your experiences\n  cppclean@googlegroups.com.  Even if you don't use cppclean, I'd like to\n  hear from you.  :-)  (You can contact me directly at:  nnorwitz@gmail.com)\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/scripts/generator/cpp/__init__.py",
    "content": ""
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/scripts/generator/cpp/ast.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2007 Neal Norwitz\n# Portions Copyright 2007 Google Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\"\"\"Generate an Abstract Syntax Tree (AST) for C++.\"\"\"\n\n__author__ = 'nnorwitz@google.com (Neal Norwitz)'\n\n\n# TODO:\n#  * Tokens should never be exported, need to convert to Nodes\n#    (return types, parameters, etc.)\n#  * Handle static class data for templatized classes\n#  * Handle casts (both C++ and C-style)\n#  * Handle conditions and loops (if/else, switch, for, while/do)\n#\n# TODO much, much later:\n#  * Handle #define\n#  * exceptions\n\n\ntry:\n    # Python 3.x\n    import builtins\nexcept ImportError:\n    # Python 2.x\n    import __builtin__ as builtins\n\nimport sys\nimport traceback\n\nfrom cpp import keywords\nfrom cpp import tokenize\nfrom cpp import utils\n\n\nif not hasattr(builtins, 'reversed'):\n    # Support Python 2.3 and earlier.\n    def reversed(seq):\n        for i in range(len(seq)-1, -1, -1):\n            yield seq[i]\n\nif not hasattr(builtins, 'next'):\n    # Support Python 2.5 and earlier.\n    def next(obj):\n        return obj.next()\n\n\nVISIBILITY_PUBLIC, VISIBILITY_PROTECTED, VISIBILITY_PRIVATE = range(3)\n\nFUNCTION_NONE = 0x00\nFUNCTION_CONST = 0x01\nFUNCTION_VIRTUAL = 0x02\nFUNCTION_PURE_VIRTUAL = 0x04\nFUNCTION_CTOR = 0x08\nFUNCTION_DTOR = 0x10\nFUNCTION_ATTRIBUTE = 0x20\nFUNCTION_UNKNOWN_ANNOTATION = 0x40\nFUNCTION_THROW = 0x80\nFUNCTION_OVERRIDE = 0x100\n\n\"\"\"\nThese are currently unused.  Should really handle these properly at some point.\n\nTYPE_MODIFIER_INLINE   = 0x010000\nTYPE_MODIFIER_EXTERN   = 0x020000\nTYPE_MODIFIER_STATIC   = 0x040000\nTYPE_MODIFIER_CONST    = 0x080000\nTYPE_MODIFIER_REGISTER = 0x100000\nTYPE_MODIFIER_VOLATILE = 0x200000\nTYPE_MODIFIER_MUTABLE  = 0x400000\n\nTYPE_MODIFIER_MAP = {\n    'inline': TYPE_MODIFIER_INLINE,\n    'extern': TYPE_MODIFIER_EXTERN,\n    'static': TYPE_MODIFIER_STATIC,\n    'const': TYPE_MODIFIER_CONST,\n    'register': TYPE_MODIFIER_REGISTER,\n    'volatile': TYPE_MODIFIER_VOLATILE,\n    'mutable': TYPE_MODIFIER_MUTABLE,\n    }\n\"\"\"\n\n_INTERNAL_TOKEN = 'internal'\n_NAMESPACE_POP = 'ns-pop'\n\n\n# TODO(nnorwitz): use this as a singleton for templated_types, etc\n# where we don't want to create a new empty dict each time.  It is also const.\nclass _NullDict(object):\n    __contains__ = lambda self: False\n    keys = values = items = iterkeys = itervalues = iteritems = lambda self: ()\n\n\n# TODO(nnorwitz): move AST nodes into a separate module.\nclass Node(object):\n    \"\"\"Base AST node.\"\"\"\n\n    def __init__(self, start, end):\n        self.start = start\n        self.end = end\n\n    def IsDeclaration(self):\n        \"\"\"Returns bool if this node is a declaration.\"\"\"\n        return False\n\n    def IsDefinition(self):\n        \"\"\"Returns bool if this node is a definition.\"\"\"\n        return False\n\n    def IsExportable(self):\n        \"\"\"Returns bool if this node exportable from a header file.\"\"\"\n        return False\n\n    def Requires(self, node):\n        \"\"\"Does this AST node require the definition of the node passed in?\"\"\"\n        return False\n\n    def XXX__str__(self):\n        return self._StringHelper(self.__class__.__name__, '')\n\n    def _StringHelper(self, name, suffix):\n        if not utils.DEBUG:\n            return '%s(%s)' % (name, suffix)\n        return '%s(%d, %d, %s)' % (name, self.start, self.end, suffix)\n\n    def __repr__(self):\n        return str(self)\n\n\nclass Define(Node):\n    def __init__(self, start, end, name, definition):\n        Node.__init__(self, start, end)\n        self.name = name\n        self.definition = definition\n\n    def __str__(self):\n        value = '%s %s' % (self.name, self.definition)\n        return self._StringHelper(self.__class__.__name__, value)\n\n\nclass Include(Node):\n    def __init__(self, start, end, filename, system):\n        Node.__init__(self, start, end)\n        self.filename = filename\n        self.system = system\n\n    def __str__(self):\n        fmt = '\"%s\"'\n        if self.system:\n            fmt = '<%s>'\n        return self._StringHelper(self.__class__.__name__, fmt % self.filename)\n\n\nclass Goto(Node):\n    def __init__(self, start, end, label):\n        Node.__init__(self, start, end)\n        self.label = label\n\n    def __str__(self):\n        return self._StringHelper(self.__class__.__name__, str(self.label))\n\n\nclass Expr(Node):\n    def __init__(self, start, end, expr):\n        Node.__init__(self, start, end)\n        self.expr = expr\n\n    def Requires(self, node):\n        # TODO(nnorwitz): impl.\n        return False\n\n    def __str__(self):\n        return self._StringHelper(self.__class__.__name__, str(self.expr))\n\n\nclass Return(Expr):\n    pass\n\n\nclass Delete(Expr):\n    pass\n\n\nclass Friend(Expr):\n    def __init__(self, start, end, expr, namespace):\n        Expr.__init__(self, start, end, expr)\n        self.namespace = namespace[:]\n\n\nclass Using(Node):\n    def __init__(self, start, end, names):\n        Node.__init__(self, start, end)\n        self.names = names\n\n    def __str__(self):\n        return self._StringHelper(self.__class__.__name__, str(self.names))\n\n\nclass Parameter(Node):\n    def __init__(self, start, end, name, parameter_type, default):\n        Node.__init__(self, start, end)\n        self.name = name\n        self.type = parameter_type\n        self.default = default\n\n    def Requires(self, node):\n        # TODO(nnorwitz): handle namespaces, etc.\n        return self.type.name == node.name\n\n    def __str__(self):\n        name = str(self.type)\n        suffix = '%s %s' % (name, self.name)\n        if self.default:\n            suffix += ' = ' + ''.join([d.name for d in self.default])\n        return self._StringHelper(self.__class__.__name__, suffix)\n\n\nclass _GenericDeclaration(Node):\n    def __init__(self, start, end, name, namespace):\n        Node.__init__(self, start, end)\n        self.name = name\n        self.namespace = namespace[:]\n\n    def FullName(self):\n        prefix = ''\n        if self.namespace and self.namespace[-1]:\n            prefix = '::'.join(self.namespace) + '::'\n        return prefix + self.name\n\n    def _TypeStringHelper(self, suffix):\n        if self.namespace:\n            names = [n or '<anonymous>' for n in self.namespace]\n            suffix += ' in ' + '::'.join(names)\n        return self._StringHelper(self.__class__.__name__, suffix)\n\n\n# TODO(nnorwitz): merge with Parameter in some way?\nclass VariableDeclaration(_GenericDeclaration):\n    def __init__(self, start, end, name, var_type, initial_value, namespace):\n        _GenericDeclaration.__init__(self, start, end, name, namespace)\n        self.type = var_type\n        self.initial_value = initial_value\n\n    def Requires(self, node):\n        # TODO(nnorwitz): handle namespaces, etc.\n        return self.type.name == node.name\n\n    def ToString(self):\n        \"\"\"Return a string that tries to reconstitute the variable decl.\"\"\"\n        suffix = '%s %s' % (self.type, self.name)\n        if self.initial_value:\n            suffix += ' = ' + self.initial_value\n        return suffix\n\n    def __str__(self):\n        return self._StringHelper(self.__class__.__name__, self.ToString())\n\n\nclass Typedef(_GenericDeclaration):\n    def __init__(self, start, end, name, alias, namespace):\n        _GenericDeclaration.__init__(self, start, end, name, namespace)\n        self.alias = alias\n\n    def IsDefinition(self):\n        return True\n\n    def IsExportable(self):\n        return True\n\n    def Requires(self, node):\n        # TODO(nnorwitz): handle namespaces, etc.\n        name = node.name\n        for token in self.alias:\n            if token is not None and name == token.name:\n                return True\n        return False\n\n    def __str__(self):\n        suffix = '%s, %s' % (self.name, self.alias)\n        return self._TypeStringHelper(suffix)\n\n\nclass _NestedType(_GenericDeclaration):\n    def __init__(self, start, end, name, fields, namespace):\n        _GenericDeclaration.__init__(self, start, end, name, namespace)\n        self.fields = fields\n\n    def IsDefinition(self):\n        return True\n\n    def IsExportable(self):\n        return True\n\n    def __str__(self):\n        suffix = '%s, {%s}' % (self.name, self.fields)\n        return self._TypeStringHelper(suffix)\n\n\nclass Union(_NestedType):\n    pass\n\n\nclass Enum(_NestedType):\n    pass\n\n\nclass Class(_GenericDeclaration):\n    def __init__(self, start, end, name, bases, templated_types, body, namespace):\n        _GenericDeclaration.__init__(self, start, end, name, namespace)\n        self.bases = bases\n        self.body = body\n        self.templated_types = templated_types\n\n    def IsDeclaration(self):\n        return self.bases is None and self.body is None\n\n    def IsDefinition(self):\n        return not self.IsDeclaration()\n\n    def IsExportable(self):\n        return not self.IsDeclaration()\n\n    def Requires(self, node):\n        # TODO(nnorwitz): handle namespaces, etc.\n        if self.bases:\n            for token_list in self.bases:\n                # TODO(nnorwitz): bases are tokens, do name comparison.\n                for token in token_list:\n                    if token.name == node.name:\n                        return True\n        # TODO(nnorwitz): search in body too.\n        return False\n\n    def __str__(self):\n        name = self.name\n        if self.templated_types:\n            name += '<%s>' % self.templated_types\n        suffix = '%s, %s, %s' % (name, self.bases, self.body)\n        return self._TypeStringHelper(suffix)\n\n\nclass Struct(Class):\n    pass\n\n\nclass Function(_GenericDeclaration):\n    def __init__(self, start, end, name, return_type, parameters,\n                 modifiers, templated_types, body, namespace):\n        _GenericDeclaration.__init__(self, start, end, name, namespace)\n        converter = TypeConverter(namespace)\n        self.return_type = converter.CreateReturnType(return_type)\n        self.parameters = converter.ToParameters(parameters)\n        self.modifiers = modifiers\n        self.body = body\n        self.templated_types = templated_types\n\n    def IsDeclaration(self):\n        return self.body is None\n\n    def IsDefinition(self):\n        return self.body is not None\n\n    def IsExportable(self):\n        if self.return_type and 'static' in self.return_type.modifiers:\n            return False\n        return None not in self.namespace\n\n    def Requires(self, node):\n        if self.parameters:\n            # TODO(nnorwitz): parameters are tokens, do name comparison.\n            for p in self.parameters:\n                if p.name == node.name:\n                    return True\n        # TODO(nnorwitz): search in body too.\n        return False\n\n    def __str__(self):\n        # TODO(nnorwitz): add templated_types.\n        suffix = ('%s %s(%s), 0x%02x, %s' %\n                  (self.return_type, self.name, self.parameters,\n                   self.modifiers, self.body))\n        return self._TypeStringHelper(suffix)\n\n\nclass Method(Function):\n    def __init__(self, start, end, name, in_class, return_type, parameters,\n                 modifiers, templated_types, body, namespace):\n        Function.__init__(self, start, end, name, return_type, parameters,\n                          modifiers, templated_types, body, namespace)\n        # TODO(nnorwitz): in_class could also be a namespace which can\n        # mess up finding functions properly.\n        self.in_class = in_class\n\n\nclass Type(_GenericDeclaration):\n    \"\"\"Type used for any variable (eg class, primitive, struct, etc).\"\"\"\n\n    def __init__(self, start, end, name, templated_types, modifiers,\n                 reference, pointer, array):\n        \"\"\"\n        Args:\n          name: str name of main type\n          templated_types: [Class (Type?)] template type info between <>\n          modifiers: [str] type modifiers (keywords) eg, const, mutable, etc.\n          reference, pointer, array: bools\n        \"\"\"\n        _GenericDeclaration.__init__(self, start, end, name, [])\n        self.templated_types = templated_types\n        if not name and modifiers:\n            self.name = modifiers.pop()\n        self.modifiers = modifiers\n        self.reference = reference\n        self.pointer = pointer\n        self.array = array\n\n    def __str__(self):\n        prefix = ''\n        if self.modifiers:\n            prefix = ' '.join(self.modifiers) + ' '\n        name = str(self.name)\n        if self.templated_types:\n            name += '<%s>' % self.templated_types\n        suffix = prefix + name\n        if self.reference:\n            suffix += '&'\n        if self.pointer:\n            suffix += '*'\n        if self.array:\n            suffix += '[]'\n        return self._TypeStringHelper(suffix)\n\n    # By definition, Is* are always False.  A Type can only exist in\n    # some sort of variable declaration, parameter, or return value.\n    def IsDeclaration(self):\n        return False\n\n    def IsDefinition(self):\n        return False\n\n    def IsExportable(self):\n        return False\n\n\nclass TypeConverter(object):\n\n    def __init__(self, namespace_stack):\n        self.namespace_stack = namespace_stack\n\n    def _GetTemplateEnd(self, tokens, start):\n        count = 1\n        end = start\n        while 1:\n            token = tokens[end]\n            end += 1\n            if token.name == '<':\n                count += 1\n            elif token.name == '>':\n                count -= 1\n                if count == 0:\n                    break\n        return tokens[start:end-1], end\n\n    def ToType(self, tokens):\n        \"\"\"Convert [Token,...] to [Class(...), ] useful for base classes.\n        For example, code like class Foo : public Bar<x, y> { ... };\n        the \"Bar<x, y>\" portion gets converted to an AST.\n\n        Returns:\n          [Class(...), ...]\n        \"\"\"\n        result = []\n        name_tokens = []\n        reference = pointer = array = False\n\n        def AddType(templated_types):\n            # Partition tokens into name and modifier tokens.\n            names = []\n            modifiers = []\n            for t in name_tokens:\n                if keywords.IsKeyword(t.name):\n                    modifiers.append(t.name)\n                else:\n                    names.append(t.name)\n            name = ''.join(names)\n            if name_tokens:\n                result.append(Type(name_tokens[0].start, name_tokens[-1].end,\n                                   name, templated_types, modifiers,\n                                   reference, pointer, array))\n            del name_tokens[:]\n\n        i = 0\n        end = len(tokens)\n        while i < end:\n            token = tokens[i]\n            if token.name == '<':\n                new_tokens, new_end = self._GetTemplateEnd(tokens, i+1)\n                AddType(self.ToType(new_tokens))\n                # If there is a comma after the template, we need to consume\n                # that here otherwise it becomes part of the name.\n                i = new_end\n                reference = pointer = array = False\n            elif token.name == ',':\n                AddType([])\n                reference = pointer = array = False\n            elif token.name == '*':\n                pointer = True\n            elif token.name == '&':\n                reference = True\n            elif token.name == '[':\n               pointer = True\n            elif token.name == ']':\n                pass\n            else:\n                name_tokens.append(token)\n            i += 1\n\n        if name_tokens:\n            # No '<' in the tokens, just a simple name and no template.\n            AddType([])\n        return result\n\n    def DeclarationToParts(self, parts, needs_name_removed):\n        name = None\n        default = []\n        if needs_name_removed:\n            # Handle default (initial) values properly.\n            for i, t in enumerate(parts):\n                if t.name == '=':\n                    default = parts[i+1:]\n                    name = parts[i-1].name\n                    if name == ']' and parts[i-2].name == '[':\n                        name = parts[i-3].name\n                        i -= 1\n                    parts = parts[:i-1]\n                    break\n            else:\n                if parts[-1].token_type == tokenize.NAME:\n                    name = parts.pop().name\n                else:\n                    # TODO(nnorwitz): this is a hack that happens for code like\n                    # Register(Foo<T>); where it thinks this is a function call\n                    # but it's actually a declaration.\n                    name = '???'\n        modifiers = []\n        type_name = []\n        other_tokens = []\n        templated_types = []\n        i = 0\n        end = len(parts)\n        while i < end:\n            p = parts[i]\n            if keywords.IsKeyword(p.name):\n                modifiers.append(p.name)\n            elif p.name == '<':\n                templated_tokens, new_end = self._GetTemplateEnd(parts, i+1)\n                templated_types = self.ToType(templated_tokens)\n                i = new_end - 1\n                # Don't add a spurious :: to data members being initialized.\n                next_index = i + 1\n                if next_index < end and parts[next_index].name == '::':\n                    i += 1\n            elif p.name in ('[', ']', '='):\n                # These are handled elsewhere.\n                other_tokens.append(p)\n            elif p.name not in ('*', '&', '>'):\n                # Ensure that names have a space between them.\n                if (type_name and type_name[-1].token_type == tokenize.NAME and\n                    p.token_type == tokenize.NAME):\n                    type_name.append(tokenize.Token(tokenize.SYNTAX, ' ', 0, 0))\n                type_name.append(p)\n            else:\n                other_tokens.append(p)\n            i += 1\n        type_name = ''.join([t.name for t in type_name])\n        return name, type_name, templated_types, modifiers, default, other_tokens\n\n    def ToParameters(self, tokens):\n        if not tokens:\n            return []\n\n        result = []\n        name = type_name = ''\n        type_modifiers = []\n        pointer = reference = array = False\n        first_token = None\n        default = []\n\n        def AddParameter(end):\n            if default:\n                del default[0]  # Remove flag.\n            parts = self.DeclarationToParts(type_modifiers, True)\n            (name, type_name, templated_types, modifiers,\n             unused_default, unused_other_tokens) = parts\n            parameter_type = Type(first_token.start, first_token.end,\n                                  type_name, templated_types, modifiers,\n                                  reference, pointer, array)\n            p = Parameter(first_token.start, end, name,\n                          parameter_type, default)\n            result.append(p)\n\n        template_count = 0\n        for s in tokens:\n            if not first_token:\n                first_token = s\n            if s.name == '<':\n                template_count += 1\n            elif s.name == '>':\n                template_count -= 1\n            if template_count > 0:\n                type_modifiers.append(s)\n                continue\n\n            if s.name == ',':\n                AddParameter(s.start)\n                name = type_name = ''\n                type_modifiers = []\n                pointer = reference = array = False\n                first_token = None\n                default = []\n            elif s.name == '*':\n                pointer = True\n            elif s.name == '&':\n                reference = True\n            elif s.name == '[':\n                array = True\n            elif s.name == ']':\n                pass  # Just don't add to type_modifiers.\n            elif s.name == '=':\n                # Got a default value.  Add any value (None) as a flag.\n                default.append(None)\n            elif default:\n                default.append(s)\n            else:\n                type_modifiers.append(s)\n        AddParameter(tokens[-1].end)\n        return result\n\n    def CreateReturnType(self, return_type_seq):\n        if not return_type_seq:\n            return None\n        start = return_type_seq[0].start\n        end = return_type_seq[-1].end\n        _, name, templated_types, modifiers, default, other_tokens = \\\n           self.DeclarationToParts(return_type_seq, False)\n        names = [n.name for n in other_tokens]\n        reference = '&' in names\n        pointer = '*' in names\n        array = '[' in names\n        return Type(start, end, name, templated_types, modifiers,\n                    reference, pointer, array)\n\n    def GetTemplateIndices(self, names):\n        # names is a list of strings.\n        start = names.index('<')\n        end = len(names) - 1\n        while end > 0:\n            if names[end] == '>':\n                break\n            end -= 1\n        return start, end+1\n\nclass AstBuilder(object):\n    def __init__(self, token_stream, filename, in_class='', visibility=None,\n                 namespace_stack=[]):\n        self.tokens = token_stream\n        self.filename = filename\n        # TODO(nnorwitz): use a better data structure (deque) for the queue.\n        # Switching directions of the \"queue\" improved perf by about 25%.\n        # Using a deque should be even better since we access from both sides.\n        self.token_queue = []\n        self.namespace_stack = namespace_stack[:]\n        self.in_class = in_class\n        if in_class is None:\n            self.in_class_name_only = None\n        else:\n            self.in_class_name_only = in_class.split('::')[-1]\n        self.visibility = visibility\n        self.in_function = False\n        self.current_token = None\n        # Keep the state whether we are currently handling a typedef or not.\n        self._handling_typedef = False\n\n        self.converter = TypeConverter(self.namespace_stack)\n\n    def HandleError(self, msg, token):\n        printable_queue = list(reversed(self.token_queue[-20:]))\n        sys.stderr.write('Got %s in %s @ %s %s\\n' %\n                         (msg, self.filename, token, printable_queue))\n\n    def Generate(self):\n        while 1:\n            token = self._GetNextToken()\n            if not token:\n                break\n\n            # Get the next token.\n            self.current_token = token\n\n            # Dispatch on the next token type.\n            if token.token_type == _INTERNAL_TOKEN:\n                if token.name == _NAMESPACE_POP:\n                    self.namespace_stack.pop()\n                continue\n\n            try:\n                result = self._GenerateOne(token)\n                if result is not None:\n                    yield result\n            except:\n                self.HandleError('exception', token)\n                raise\n\n    def _CreateVariable(self, pos_token, name, type_name, type_modifiers,\n                        ref_pointer_name_seq, templated_types, value=None):\n        reference = '&' in ref_pointer_name_seq\n        pointer = '*' in ref_pointer_name_seq\n        array = '[' in ref_pointer_name_seq\n        var_type = Type(pos_token.start, pos_token.end, type_name,\n                        templated_types, type_modifiers,\n                        reference, pointer, array)\n        return VariableDeclaration(pos_token.start, pos_token.end,\n                                   name, var_type, value, self.namespace_stack)\n\n    def _GenerateOne(self, token):\n        if token.token_type == tokenize.NAME:\n            if (keywords.IsKeyword(token.name) and\n                not keywords.IsBuiltinType(token.name)):\n                method = getattr(self, 'handle_' + token.name)\n                return method()\n            elif token.name == self.in_class_name_only:\n                # The token name is the same as the class, must be a ctor if\n                # there is a paren.  Otherwise, it's the return type.\n                # Peek ahead to get the next token to figure out which.\n                next = self._GetNextToken()\n                self._AddBackToken(next)\n                if next.token_type == tokenize.SYNTAX and next.name == '(':\n                    return self._GetMethod([token], FUNCTION_CTOR, None, True)\n                # Fall through--handle like any other method.\n\n            # Handle data or function declaration/definition.\n            syntax = tokenize.SYNTAX\n            temp_tokens, last_token = \\\n                self._GetVarTokensUpTo(syntax, '(', ';', '{', '[')\n            temp_tokens.insert(0, token)\n            if last_token.name == '(':\n                # If there is an assignment before the paren,\n                # this is an expression, not a method.\n                expr = bool([e for e in temp_tokens if e.name == '='])\n                if expr:\n                    new_temp = self._GetTokensUpTo(tokenize.SYNTAX, ';')\n                    temp_tokens.append(last_token)\n                    temp_tokens.extend(new_temp)\n                    last_token = tokenize.Token(tokenize.SYNTAX, ';', 0, 0)\n\n            if last_token.name == '[':\n                # Handle array, this isn't a method, unless it's an operator.\n                # TODO(nnorwitz): keep the size somewhere.\n                # unused_size = self._GetTokensUpTo(tokenize.SYNTAX, ']')\n                temp_tokens.append(last_token)\n                if temp_tokens[-2].name == 'operator':\n                    temp_tokens.append(self._GetNextToken())\n                else:\n                    temp_tokens2, last_token = \\\n                        self._GetVarTokensUpTo(tokenize.SYNTAX, ';')\n                    temp_tokens.extend(temp_tokens2)\n\n            if last_token.name == ';':\n                # Handle data, this isn't a method.\n                parts = self.converter.DeclarationToParts(temp_tokens, True)\n                (name, type_name, templated_types, modifiers, default,\n                 unused_other_tokens) = parts\n\n                t0 = temp_tokens[0]\n                names = [t.name for t in temp_tokens]\n                if templated_types:\n                    start, end = self.converter.GetTemplateIndices(names)\n                    names = names[:start] + names[end:]\n                default = ''.join([t.name for t in default])\n                return self._CreateVariable(t0, name, type_name, modifiers,\n                                            names, templated_types, default)\n            if last_token.name == '{':\n                self._AddBackTokens(temp_tokens[1:])\n                self._AddBackToken(last_token)\n                method_name = temp_tokens[0].name\n                method = getattr(self, 'handle_' + method_name, None)\n                if not method:\n                    # Must be declaring a variable.\n                    # TODO(nnorwitz): handle the declaration.\n                    return None\n                return method()\n            return self._GetMethod(temp_tokens, 0, None, False)\n        elif token.token_type == tokenize.SYNTAX:\n            if token.name == '~' and self.in_class:\n                # Must be a dtor (probably not in method body).\n                token = self._GetNextToken()\n                # self.in_class can contain A::Name, but the dtor will only\n                # be Name.  Make sure to compare against the right value.\n                if (token.token_type == tokenize.NAME and\n                    token.name == self.in_class_name_only):\n                    return self._GetMethod([token], FUNCTION_DTOR, None, True)\n            # TODO(nnorwitz): handle a lot more syntax.\n        elif token.token_type == tokenize.PREPROCESSOR:\n            # TODO(nnorwitz): handle more preprocessor directives.\n            # token starts with a #, so remove it and strip whitespace.\n            name = token.name[1:].lstrip()\n            if name.startswith('include'):\n                # Remove \"include\".\n                name = name[7:].strip()\n                assert name\n                # Handle #include \\<newline> \"header-on-second-line.h\".\n                if name.startswith('\\\\'):\n                    name = name[1:].strip()\n                assert name[0] in '<\"', token\n                assert name[-1] in '>\"', token\n                system = name[0] == '<'\n                filename = name[1:-1]\n                return Include(token.start, token.end, filename, system)\n            if name.startswith('define'):\n                # Remove \"define\".\n                name = name[6:].strip()\n                assert name\n                value = ''\n                for i, c in enumerate(name):\n                    if c.isspace():\n                        value = name[i:].lstrip()\n                        name = name[:i]\n                        break\n                return Define(token.start, token.end, name, value)\n            if name.startswith('if') and name[2:3].isspace():\n                condition = name[3:].strip()\n                if condition.startswith('0') or condition.startswith('(0)'):\n                    self._SkipIf0Blocks()\n        return None\n\n    def _GetTokensUpTo(self, expected_token_type, expected_token):\n        return self._GetVarTokensUpTo(expected_token_type, expected_token)[0]\n\n    def _GetVarTokensUpTo(self, expected_token_type, *expected_tokens):\n        last_token = self._GetNextToken()\n        tokens = []\n        while (last_token.token_type != expected_token_type or\n               last_token.name not in expected_tokens):\n            tokens.append(last_token)\n            last_token = self._GetNextToken()\n        return tokens, last_token\n\n    # TODO(nnorwitz): remove _IgnoreUpTo() it shouldn't be necessary.\n    def _IgnoreUpTo(self, token_type, token):\n        unused_tokens = self._GetTokensUpTo(token_type, token)\n\n    def _SkipIf0Blocks(self):\n        count = 1\n        while 1:\n            token = self._GetNextToken()\n            if token.token_type != tokenize.PREPROCESSOR:\n                continue\n\n            name = token.name[1:].lstrip()\n            if name.startswith('endif'):\n                count -= 1\n                if count == 0:\n                    break\n            elif name.startswith('if'):\n                count += 1\n\n    def _GetMatchingChar(self, open_paren, close_paren, GetNextToken=None):\n        if GetNextToken is None:\n            GetNextToken = self._GetNextToken\n        # Assumes the current token is open_paren and we will consume\n        # and return up to the close_paren.\n        count = 1\n        token = GetNextToken()\n        while 1:\n            if token.token_type == tokenize.SYNTAX:\n                if token.name == open_paren:\n                    count += 1\n                elif token.name == close_paren:\n                    count -= 1\n                    if count == 0:\n                        break\n            yield token\n            token = GetNextToken()\n        yield token\n\n    def _GetParameters(self):\n        return self._GetMatchingChar('(', ')')\n\n    def GetScope(self):\n        return self._GetMatchingChar('{', '}')\n\n    def _GetNextToken(self):\n        if self.token_queue:\n            return self.token_queue.pop()\n        return next(self.tokens)\n\n    def _AddBackToken(self, token):\n        if token.whence == tokenize.WHENCE_STREAM:\n            token.whence = tokenize.WHENCE_QUEUE\n            self.token_queue.insert(0, token)\n        else:\n            assert token.whence == tokenize.WHENCE_QUEUE, token\n            self.token_queue.append(token)\n\n    def _AddBackTokens(self, tokens):\n        if tokens:\n            if tokens[-1].whence == tokenize.WHENCE_STREAM:\n                for token in tokens:\n                    token.whence = tokenize.WHENCE_QUEUE\n                self.token_queue[:0] = reversed(tokens)\n            else:\n                assert tokens[-1].whence == tokenize.WHENCE_QUEUE, tokens\n                self.token_queue.extend(reversed(tokens))\n\n    def GetName(self, seq=None):\n        \"\"\"Returns ([tokens], next_token_info).\"\"\"\n        GetNextToken = self._GetNextToken\n        if seq is not None:\n            it = iter(seq)\n            GetNextToken = lambda: next(it)\n        next_token = GetNextToken()\n        tokens = []\n        last_token_was_name = False\n        while (next_token.token_type == tokenize.NAME or\n               (next_token.token_type == tokenize.SYNTAX and\n                next_token.name in ('::', '<'))):\n            # Two NAMEs in a row means the identifier should terminate.\n            # It's probably some sort of variable declaration.\n            if last_token_was_name and next_token.token_type == tokenize.NAME:\n                break\n            last_token_was_name = next_token.token_type == tokenize.NAME\n            tokens.append(next_token)\n            # Handle templated names.\n            if next_token.name == '<':\n                tokens.extend(self._GetMatchingChar('<', '>', GetNextToken))\n                last_token_was_name = True\n            next_token = GetNextToken()\n        return tokens, next_token\n\n    def GetMethod(self, modifiers, templated_types):\n        return_type_and_name = self._GetTokensUpTo(tokenize.SYNTAX, '(')\n        assert len(return_type_and_name) >= 1\n        return self._GetMethod(return_type_and_name, modifiers, templated_types,\n                               False)\n\n    def _GetMethod(self, return_type_and_name, modifiers, templated_types,\n                   get_paren):\n        template_portion = None\n        if get_paren:\n            token = self._GetNextToken()\n            assert token.token_type == tokenize.SYNTAX, token\n            if token.name == '<':\n                # Handle templatized dtors.\n                template_portion = [token]\n                template_portion.extend(self._GetMatchingChar('<', '>'))\n                token = self._GetNextToken()\n            assert token.token_type == tokenize.SYNTAX, token\n            assert token.name == '(', token\n\n        name = return_type_and_name.pop()\n        # Handle templatized ctors.\n        if name.name == '>':\n            index = 1\n            while return_type_and_name[index].name != '<':\n                index += 1\n            template_portion = return_type_and_name[index:] + [name]\n            del return_type_and_name[index:]\n            name = return_type_and_name.pop()\n        elif name.name == ']':\n            rt = return_type_and_name\n            assert rt[-1].name == '[', return_type_and_name\n            assert rt[-2].name == 'operator', return_type_and_name\n            name_seq = return_type_and_name[-2:]\n            del return_type_and_name[-2:]\n            name = tokenize.Token(tokenize.NAME, 'operator[]',\n                                  name_seq[0].start, name.end)\n            # Get the open paren so _GetParameters() below works.\n            unused_open_paren = self._GetNextToken()\n\n        # TODO(nnorwitz): store template_portion.\n        return_type = return_type_and_name\n        indices = name\n        if return_type:\n            indices = return_type[0]\n\n        # Force ctor for templatized ctors.\n        if name.name == self.in_class and not modifiers:\n            modifiers |= FUNCTION_CTOR\n        parameters = list(self._GetParameters())\n        del parameters[-1]              # Remove trailing ')'.\n\n        # Handling operator() is especially weird.\n        if name.name == 'operator' and not parameters:\n            token = self._GetNextToken()\n            assert token.name == '(', token\n            parameters = list(self._GetParameters())\n            del parameters[-1]          # Remove trailing ')'.\n\n        token = self._GetNextToken()\n        while token.token_type == tokenize.NAME:\n            modifier_token = token\n            token = self._GetNextToken()\n            if modifier_token.name == 'const':\n                modifiers |= FUNCTION_CONST\n            elif modifier_token.name == '__attribute__':\n                # TODO(nnorwitz): handle more __attribute__ details.\n                modifiers |= FUNCTION_ATTRIBUTE\n                assert token.name == '(', token\n                # Consume everything between the (parens).\n                unused_tokens = list(self._GetMatchingChar('(', ')'))\n                token = self._GetNextToken()\n            elif modifier_token.name == 'throw':\n                modifiers |= FUNCTION_THROW\n                assert token.name == '(', token\n                # Consume everything between the (parens).\n                unused_tokens = list(self._GetMatchingChar('(', ')'))\n                token = self._GetNextToken()\n            elif modifier_token.name == 'override':\n                modifiers |= FUNCTION_OVERRIDE\n            elif modifier_token.name == modifier_token.name.upper():\n                # HACK(nnorwitz):  assume that all upper-case names\n                # are some macro we aren't expanding.\n                modifiers |= FUNCTION_UNKNOWN_ANNOTATION\n            else:\n                self.HandleError('unexpected token', modifier_token)\n\n        assert token.token_type == tokenize.SYNTAX, token\n        # Handle ctor initializers.\n        if token.name == ':':\n            # TODO(nnorwitz): anything else to handle for initializer list?\n            while token.name != ';' and token.name != '{':\n                token = self._GetNextToken()\n\n        # Handle pointer to functions that are really data but look\n        # like method declarations.\n        if token.name == '(':\n            if parameters[0].name == '*':\n                # name contains the return type.\n                name = parameters.pop()\n                # parameters contains the name of the data.\n                modifiers = [p.name for p in parameters]\n                # Already at the ( to open the parameter list.\n                function_parameters = list(self._GetMatchingChar('(', ')'))\n                del function_parameters[-1]  # Remove trailing ')'.\n                # TODO(nnorwitz): store the function_parameters.\n                token = self._GetNextToken()\n                assert token.token_type == tokenize.SYNTAX, token\n                assert token.name == ';', token\n                return self._CreateVariable(indices, name.name, indices.name,\n                                            modifiers, '', None)\n            # At this point, we got something like:\n            #  return_type (type::*name_)(params);\n            # This is a data member called name_ that is a function pointer.\n            # With this code: void (sq_type::*field_)(string&);\n            # We get: name=void return_type=[] parameters=sq_type ... field_\n            # TODO(nnorwitz): is return_type always empty?\n            # TODO(nnorwitz): this isn't even close to being correct.\n            # Just put in something so we don't crash and can move on.\n            real_name = parameters[-1]\n            modifiers = [p.name for p in self._GetParameters()]\n            del modifiers[-1]           # Remove trailing ')'.\n            return self._CreateVariable(indices, real_name.name, indices.name,\n                                        modifiers, '', None)\n\n        if token.name == '{':\n            body = list(self.GetScope())\n            del body[-1]                # Remove trailing '}'.\n        else:\n            body = None\n            if token.name == '=':\n                token = self._GetNextToken()\n\n                if token.name == 'default' or token.name == 'delete':\n                    # Ignore explicitly defaulted and deleted special members\n                    # in C++11.\n                    token = self._GetNextToken()\n                else:\n                    # Handle pure-virtual declarations.\n                    assert token.token_type == tokenize.CONSTANT, token\n                    assert token.name == '0', token\n                    modifiers |= FUNCTION_PURE_VIRTUAL\n                    token = self._GetNextToken()\n\n            if token.name == '[':\n                # TODO(nnorwitz): store tokens and improve parsing.\n                # template <typename T, size_t N> char (&ASH(T (&seq)[N]))[N];\n                tokens = list(self._GetMatchingChar('[', ']'))\n                token = self._GetNextToken()\n\n            assert token.name == ';', (token, return_type_and_name, parameters)\n\n        # Looks like we got a method, not a function.\n        if len(return_type) > 2 and return_type[-1].name == '::':\n            return_type, in_class = \\\n                         self._GetReturnTypeAndClassName(return_type)\n            return Method(indices.start, indices.end, name.name, in_class,\n                          return_type, parameters, modifiers, templated_types,\n                          body, self.namespace_stack)\n        return Function(indices.start, indices.end, name.name, return_type,\n                        parameters, modifiers, templated_types, body,\n                        self.namespace_stack)\n\n    def _GetReturnTypeAndClassName(self, token_seq):\n        # Splitting the return type from the class name in a method\n        # can be tricky.  For example, Return::Type::Is::Hard::To::Find().\n        # Where is the return type and where is the class name?\n        # The heuristic used is to pull the last name as the class name.\n        # This includes all the templated type info.\n        # TODO(nnorwitz): if there is only One name like in the\n        # example above, punt and assume the last bit is the class name.\n\n        # Ignore a :: prefix, if exists so we can find the first real name.\n        i = 0\n        if token_seq[0].name == '::':\n            i = 1\n        # Ignore a :: suffix, if exists.\n        end = len(token_seq) - 1\n        if token_seq[end-1].name == '::':\n            end -= 1\n\n        # Make a copy of the sequence so we can append a sentinel\n        # value. This is required for GetName will has to have some\n        # terminating condition beyond the last name.\n        seq_copy = token_seq[i:end]\n        seq_copy.append(tokenize.Token(tokenize.SYNTAX, '', 0, 0))\n        names = []\n        while i < end:\n            # Iterate through the sequence parsing out each name.\n            new_name, next = self.GetName(seq_copy[i:])\n            assert new_name, 'Got empty new_name, next=%s' % next\n            # We got a pointer or ref.  Add it to the name.\n            if next and next.token_type == tokenize.SYNTAX:\n                new_name.append(next)\n            names.append(new_name)\n            i += len(new_name)\n\n        # Now that we have the names, it's time to undo what we did.\n\n        # Remove the sentinel value.\n        names[-1].pop()\n        # Flatten the token sequence for the return type.\n        return_type = [e for seq in names[:-1] for e in seq]\n        # The class name is the last name.\n        class_name = names[-1]\n        return return_type, class_name\n\n    def handle_bool(self):\n        pass\n\n    def handle_char(self):\n        pass\n\n    def handle_int(self):\n        pass\n\n    def handle_long(self):\n        pass\n\n    def handle_short(self):\n        pass\n\n    def handle_double(self):\n        pass\n\n    def handle_float(self):\n        pass\n\n    def handle_void(self):\n        pass\n\n    def handle_wchar_t(self):\n        pass\n\n    def handle_unsigned(self):\n        pass\n\n    def handle_signed(self):\n        pass\n\n    def _GetNestedType(self, ctor):\n        name = None\n        name_tokens, token = self.GetName()\n        if name_tokens:\n            name = ''.join([t.name for t in name_tokens])\n\n        # Handle forward declarations.\n        if token.token_type == tokenize.SYNTAX and token.name == ';':\n            return ctor(token.start, token.end, name, None,\n                        self.namespace_stack)\n\n        if token.token_type == tokenize.NAME and self._handling_typedef:\n            self._AddBackToken(token)\n            return ctor(token.start, token.end, name, None,\n                        self.namespace_stack)\n\n        # Must be the type declaration.\n        fields = list(self._GetMatchingChar('{', '}'))\n        del fields[-1]                  # Remove trailing '}'.\n        if token.token_type == tokenize.SYNTAX and token.name == '{':\n            next = self._GetNextToken()\n            new_type = ctor(token.start, token.end, name, fields,\n                            self.namespace_stack)\n            # A name means this is an anonymous type and the name\n            # is the variable declaration.\n            if next.token_type != tokenize.NAME:\n                return new_type\n            name = new_type\n            token = next\n\n        # Must be variable declaration using the type prefixed with keyword.\n        assert token.token_type == tokenize.NAME, token\n        return self._CreateVariable(token, token.name, name, [], '', None)\n\n    def handle_struct(self):\n        # Special case the handling typedef/aliasing of structs here.\n        # It would be a pain to handle in the class code.\n        name_tokens, var_token = self.GetName()\n        if name_tokens:\n            next_token = self._GetNextToken()\n            is_syntax = (var_token.token_type == tokenize.SYNTAX and\n                         var_token.name[0] in '*&')\n            is_variable = (var_token.token_type == tokenize.NAME and\n                           next_token.name == ';')\n            variable = var_token\n            if is_syntax and not is_variable:\n                variable = next_token\n                temp = self._GetNextToken()\n                if temp.token_type == tokenize.SYNTAX and temp.name == '(':\n                    # Handle methods declared to return a struct.\n                    t0 = name_tokens[0]\n                    struct = tokenize.Token(tokenize.NAME, 'struct',\n                                            t0.start-7, t0.start-2)\n                    type_and_name = [struct]\n                    type_and_name.extend(name_tokens)\n                    type_and_name.extend((var_token, next_token))\n                    return self._GetMethod(type_and_name, 0, None, False)\n                assert temp.name == ';', (temp, name_tokens, var_token)\n            if is_syntax or (is_variable and not self._handling_typedef):\n                modifiers = ['struct']\n                type_name = ''.join([t.name for t in name_tokens])\n                position = name_tokens[0]\n                return self._CreateVariable(position, variable.name, type_name,\n                                            modifiers, var_token.name, None)\n            name_tokens.extend((var_token, next_token))\n            self._AddBackTokens(name_tokens)\n        else:\n            self._AddBackToken(var_token)\n        return self._GetClass(Struct, VISIBILITY_PUBLIC, None)\n\n    def handle_union(self):\n        return self._GetNestedType(Union)\n\n    def handle_enum(self):\n        token = self._GetNextToken()\n        if not (token.token_type == tokenize.NAME and token.name == 'class'):\n            self._AddBackToken(token)\n        return self._GetNestedType(Enum)\n\n    def handle_auto(self):\n        # TODO(nnorwitz): warn about using auto?  Probably not since it\n        # will be reclaimed and useful for C++0x.\n        pass\n\n    def handle_register(self):\n        pass\n\n    def handle_const(self):\n        pass\n\n    def handle_inline(self):\n        pass\n\n    def handle_extern(self):\n        pass\n\n    def handle_static(self):\n        pass\n\n    def handle_virtual(self):\n        # What follows must be a method.\n        token = token2 = self._GetNextToken()\n        if token.name == 'inline':\n            # HACK(nnorwitz): handle inline dtors by ignoring 'inline'.\n            token2 = self._GetNextToken()\n        if token2.token_type == tokenize.SYNTAX and token2.name == '~':\n            return self.GetMethod(FUNCTION_VIRTUAL + FUNCTION_DTOR, None)\n        assert token.token_type == tokenize.NAME or token.name == '::', token\n        return_type_and_name = self._GetTokensUpTo(tokenize.SYNTAX, '(')  # )\n        return_type_and_name.insert(0, token)\n        if token2 is not token:\n            return_type_and_name.insert(1, token2)\n        return self._GetMethod(return_type_and_name, FUNCTION_VIRTUAL,\n                               None, False)\n\n    def handle_volatile(self):\n        pass\n\n    def handle_mutable(self):\n        pass\n\n    def handle_public(self):\n        assert self.in_class\n        self.visibility = VISIBILITY_PUBLIC\n\n    def handle_protected(self):\n        assert self.in_class\n        self.visibility = VISIBILITY_PROTECTED\n\n    def handle_private(self):\n        assert self.in_class\n        self.visibility = VISIBILITY_PRIVATE\n\n    def handle_friend(self):\n        tokens = self._GetTokensUpTo(tokenize.SYNTAX, ';')\n        assert tokens\n        t0 = tokens[0]\n        return Friend(t0.start, t0.end, tokens, self.namespace_stack)\n\n    def handle_static_cast(self):\n        pass\n\n    def handle_const_cast(self):\n        pass\n\n    def handle_dynamic_cast(self):\n        pass\n\n    def handle_reinterpret_cast(self):\n        pass\n\n    def handle_new(self):\n        pass\n\n    def handle_delete(self):\n        tokens = self._GetTokensUpTo(tokenize.SYNTAX, ';')\n        assert tokens\n        return Delete(tokens[0].start, tokens[0].end, tokens)\n\n    def handle_typedef(self):\n        token = self._GetNextToken()\n        if (token.token_type == tokenize.NAME and\n            keywords.IsKeyword(token.name)):\n            # Token must be struct/enum/union/class.\n            method = getattr(self, 'handle_' + token.name)\n            self._handling_typedef = True\n            tokens = [method()]\n            self._handling_typedef = False\n        else:\n            tokens = [token]\n\n        # Get the remainder of the typedef up to the semi-colon.\n        tokens.extend(self._GetTokensUpTo(tokenize.SYNTAX, ';'))\n\n        # TODO(nnorwitz): clean all this up.\n        assert tokens\n        name = tokens.pop()\n        indices = name\n        if tokens:\n            indices = tokens[0]\n        if not indices:\n            indices = token\n        if name.name == ')':\n            # HACK(nnorwitz): Handle pointers to functions \"properly\".\n            if (len(tokens) >= 4 and\n                tokens[1].name == '(' and tokens[2].name == '*'):\n                tokens.append(name)\n                name = tokens[3]\n        elif name.name == ']':\n            # HACK(nnorwitz): Handle arrays properly.\n            if len(tokens) >= 2:\n                tokens.append(name)\n                name = tokens[1]\n        new_type = tokens\n        if tokens and isinstance(tokens[0], tokenize.Token):\n            new_type = self.converter.ToType(tokens)[0]\n        return Typedef(indices.start, indices.end, name.name,\n                       new_type, self.namespace_stack)\n\n    def handle_typeid(self):\n        pass  # Not needed yet.\n\n    def handle_typename(self):\n        pass  # Not needed yet.\n\n    def _GetTemplatedTypes(self):\n        result = {}\n        tokens = list(self._GetMatchingChar('<', '>'))\n        len_tokens = len(tokens) - 1    # Ignore trailing '>'.\n        i = 0\n        while i < len_tokens:\n            key = tokens[i].name\n            i += 1\n            if keywords.IsKeyword(key) or key == ',':\n                continue\n            type_name = default = None\n            if i < len_tokens:\n                i += 1\n                if tokens[i-1].name == '=':\n                    assert i < len_tokens, '%s %s' % (i, tokens)\n                    default, unused_next_token = self.GetName(tokens[i:])\n                    i += len(default)\n                else:\n                    if tokens[i-1].name != ',':\n                        # We got something like: Type variable.\n                        # Re-adjust the key (variable) and type_name (Type).\n                        key = tokens[i-1].name\n                        type_name = tokens[i-2]\n\n            result[key] = (type_name, default)\n        return result\n\n    def handle_template(self):\n        token = self._GetNextToken()\n        assert token.token_type == tokenize.SYNTAX, token\n        assert token.name == '<', token\n        templated_types = self._GetTemplatedTypes()\n        # TODO(nnorwitz): for now, just ignore the template params.\n        token = self._GetNextToken()\n        if token.token_type == tokenize.NAME:\n            if token.name == 'class':\n                return self._GetClass(Class, VISIBILITY_PRIVATE, templated_types)\n            elif token.name == 'struct':\n                return self._GetClass(Struct, VISIBILITY_PUBLIC, templated_types)\n            elif token.name == 'friend':\n                return self.handle_friend()\n        self._AddBackToken(token)\n        tokens, last = self._GetVarTokensUpTo(tokenize.SYNTAX, '(', ';')\n        tokens.append(last)\n        self._AddBackTokens(tokens)\n        if last.name == '(':\n            return self.GetMethod(FUNCTION_NONE, templated_types)\n        # Must be a variable definition.\n        return None\n\n    def handle_true(self):\n        pass  # Nothing to do.\n\n    def handle_false(self):\n        pass  # Nothing to do.\n\n    def handle_asm(self):\n        pass  # Not needed yet.\n\n    def handle_class(self):\n        return self._GetClass(Class, VISIBILITY_PRIVATE, None)\n\n    def _GetBases(self):\n        # Get base classes.\n        bases = []\n        while 1:\n            token = self._GetNextToken()\n            assert token.token_type == tokenize.NAME, token\n            # TODO(nnorwitz): store kind of inheritance...maybe.\n            if token.name not in ('public', 'protected', 'private'):\n                # If inheritance type is not specified, it is private.\n                # Just put the token back so we can form a name.\n                # TODO(nnorwitz): it would be good to warn about this.\n                self._AddBackToken(token)\n            else:\n                # Check for virtual inheritance.\n                token = self._GetNextToken()\n                if token.name != 'virtual':\n                    self._AddBackToken(token)\n                else:\n                    # TODO(nnorwitz): store that we got virtual for this base.\n                    pass\n            base, next_token = self.GetName()\n            bases_ast = self.converter.ToType(base)\n            assert len(bases_ast) == 1, bases_ast\n            bases.append(bases_ast[0])\n            assert next_token.token_type == tokenize.SYNTAX, next_token\n            if next_token.name == '{':\n                token = next_token\n                break\n            # Support multiple inheritance.\n            assert next_token.name == ',', next_token\n        return bases, token\n\n    def _GetClass(self, class_type, visibility, templated_types):\n        class_name = None\n        class_token = self._GetNextToken()\n        if class_token.token_type != tokenize.NAME:\n            assert class_token.token_type == tokenize.SYNTAX, class_token\n            token = class_token\n        else:\n            # Skip any macro (e.g. storage class specifiers) after the\n            # 'class' keyword.\n            next_token = self._GetNextToken()\n            if next_token.token_type == tokenize.NAME:\n                self._AddBackToken(next_token)\n            else:\n                self._AddBackTokens([class_token, next_token])\n            name_tokens, token = self.GetName()\n            class_name = ''.join([t.name for t in name_tokens])\n        bases = None\n        if token.token_type == tokenize.SYNTAX:\n            if token.name == ';':\n                # Forward declaration.\n                return class_type(class_token.start, class_token.end,\n                                  class_name, None, templated_types, None,\n                                  self.namespace_stack)\n            if token.name in '*&':\n                # Inline forward declaration.  Could be method or data.\n                name_token = self._GetNextToken()\n                next_token = self._GetNextToken()\n                if next_token.name == ';':\n                    # Handle data\n                    modifiers = ['class']\n                    return self._CreateVariable(class_token, name_token.name,\n                                                class_name,\n                                                modifiers, token.name, None)\n                else:\n                    # Assume this is a method.\n                    tokens = (class_token, token, name_token, next_token)\n                    self._AddBackTokens(tokens)\n                    return self.GetMethod(FUNCTION_NONE, None)\n            if token.name == ':':\n                bases, token = self._GetBases()\n\n        body = None\n        if token.token_type == tokenize.SYNTAX and token.name == '{':\n            assert token.token_type == tokenize.SYNTAX, token\n            assert token.name == '{', token\n\n            ast = AstBuilder(self.GetScope(), self.filename, class_name,\n                             visibility, self.namespace_stack)\n            body = list(ast.Generate())\n\n            if not self._handling_typedef:\n                token = self._GetNextToken()\n                if token.token_type != tokenize.NAME:\n                    assert token.token_type == tokenize.SYNTAX, token\n                    assert token.name == ';', token\n                else:\n                    new_class = class_type(class_token.start, class_token.end,\n                                           class_name, bases, None,\n                                           body, self.namespace_stack)\n\n                    modifiers = []\n                    return self._CreateVariable(class_token,\n                                                token.name, new_class,\n                                                modifiers, token.name, None)\n        else:\n            if not self._handling_typedef:\n                self.HandleError('non-typedef token', token)\n            self._AddBackToken(token)\n\n        return class_type(class_token.start, class_token.end, class_name,\n                          bases, templated_types, body, self.namespace_stack)\n\n    def handle_namespace(self):\n        token = self._GetNextToken()\n        # Support anonymous namespaces.\n        name = None\n        if token.token_type == tokenize.NAME:\n            name = token.name\n            token = self._GetNextToken()\n        self.namespace_stack.append(name)\n        assert token.token_type == tokenize.SYNTAX, token\n        # Create an internal token that denotes when the namespace is complete.\n        internal_token = tokenize.Token(_INTERNAL_TOKEN, _NAMESPACE_POP,\n                                        None, None)\n        internal_token.whence = token.whence\n        if token.name == '=':\n            # TODO(nnorwitz): handle aliasing namespaces.\n            name, next_token = self.GetName()\n            assert next_token.name == ';', next_token\n            self._AddBackToken(internal_token)\n        else:\n            assert token.name == '{', token\n            tokens = list(self.GetScope())\n            # Replace the trailing } with the internal namespace pop token.\n            tokens[-1] = internal_token\n            # Handle namespace with nothing in it.\n            self._AddBackTokens(tokens)\n        return None\n\n    def handle_using(self):\n        tokens = self._GetTokensUpTo(tokenize.SYNTAX, ';')\n        assert tokens\n        return Using(tokens[0].start, tokens[0].end, tokens)\n\n    def handle_explicit(self):\n        assert self.in_class\n        # Nothing much to do.\n        # TODO(nnorwitz): maybe verify the method name == class name.\n        # This must be a ctor.\n        return self.GetMethod(FUNCTION_CTOR, None)\n\n    def handle_this(self):\n        pass  # Nothing to do.\n\n    def handle_operator(self):\n        # Pull off the next token(s?) and make that part of the method name.\n        pass\n\n    def handle_sizeof(self):\n        pass\n\n    def handle_case(self):\n        pass\n\n    def handle_switch(self):\n        pass\n\n    def handle_default(self):\n        token = self._GetNextToken()\n        assert token.token_type == tokenize.SYNTAX\n        assert token.name == ':'\n\n    def handle_if(self):\n        pass\n\n    def handle_else(self):\n        pass\n\n    def handle_return(self):\n        tokens = self._GetTokensUpTo(tokenize.SYNTAX, ';')\n        if not tokens:\n            return Return(self.current_token.start, self.current_token.end, None)\n        return Return(tokens[0].start, tokens[0].end, tokens)\n\n    def handle_goto(self):\n        tokens = self._GetTokensUpTo(tokenize.SYNTAX, ';')\n        assert len(tokens) == 1, str(tokens)\n        return Goto(tokens[0].start, tokens[0].end, tokens[0].name)\n\n    def handle_try(self):\n        pass  # Not needed yet.\n\n    def handle_catch(self):\n        pass  # Not needed yet.\n\n    def handle_throw(self):\n        pass  # Not needed yet.\n\n    def handle_while(self):\n        pass\n\n    def handle_do(self):\n        pass\n\n    def handle_for(self):\n        pass\n\n    def handle_break(self):\n        self._IgnoreUpTo(tokenize.SYNTAX, ';')\n\n    def handle_continue(self):\n        self._IgnoreUpTo(tokenize.SYNTAX, ';')\n\n\ndef BuilderFromSource(source, filename):\n    \"\"\"Utility method that returns an AstBuilder from source code.\n\n    Args:\n      source: 'C++ source code'\n      filename: 'file1'\n\n    Returns:\n      AstBuilder\n    \"\"\"\n    return AstBuilder(tokenize.GetTokens(source), filename)\n\n\ndef PrintIndentifiers(filename, should_print):\n    \"\"\"Prints all identifiers for a C++ source file.\n\n    Args:\n      filename: 'file1'\n      should_print: predicate with signature: bool Function(token)\n    \"\"\"\n    source = utils.ReadFile(filename, False)\n    if source is None:\n        sys.stderr.write('Unable to find: %s\\n' % filename)\n        return\n\n    #print('Processing %s' % actual_filename)\n    builder = BuilderFromSource(source, filename)\n    try:\n        for node in builder.Generate():\n            if should_print(node):\n                print(node.name)\n    except KeyboardInterrupt:\n        return\n    except:\n        pass\n\n\ndef PrintAllIndentifiers(filenames, should_print):\n    \"\"\"Prints all identifiers for each C++ source file in filenames.\n\n    Args:\n      filenames: ['file1', 'file2', ...]\n      should_print: predicate with signature: bool Function(token)\n    \"\"\"\n    for path in filenames:\n        PrintIndentifiers(path, should_print)\n\n\ndef main(argv):\n    for filename in argv[1:]:\n        source = utils.ReadFile(filename)\n        if source is None:\n            continue\n\n        print('Processing %s' % filename)\n        builder = BuilderFromSource(source, filename)\n        try:\n            entire_ast = filter(None, builder.Generate())\n        except KeyboardInterrupt:\n            return\n        except:\n            # Already printed a warning, print the traceback and continue.\n            traceback.print_exc()\n        else:\n            if utils.DEBUG:\n                for ast in entire_ast:\n                    print(ast)\n\n\nif __name__ == '__main__':\n    main(sys.argv)\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/scripts/generator/cpp/gmock_class.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008 Google Inc.  All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\"\"\"Generate Google Mock classes from base classes.\n\nThis program will read in a C++ source file and output the Google Mock\nclasses for the specified classes.  If no class is specified, all\nclasses in the source file are emitted.\n\nUsage:\n  gmock_class.py header-file.h [ClassName]...\n\nOutput is sent to stdout.\n\"\"\"\n\n__author__ = 'nnorwitz@google.com (Neal Norwitz)'\n\n\nimport os\nimport re\nimport sys\n\nfrom cpp import ast\nfrom cpp import utils\n\n# Preserve compatibility with Python 2.3.\ntry:\n  _dummy = set\nexcept NameError:\n  import sets\n  set = sets.Set\n\n_VERSION = (1, 0, 1)  # The version of this script.\n# How many spaces to indent.  Can set me with the INDENT environment variable.\n_INDENT = 2\n\n\ndef _GenerateMethods(output_lines, source, class_node):\n  function_type = (ast.FUNCTION_VIRTUAL | ast.FUNCTION_PURE_VIRTUAL |\n                   ast.FUNCTION_OVERRIDE)\n  ctor_or_dtor = ast.FUNCTION_CTOR | ast.FUNCTION_DTOR\n  indent = ' ' * _INDENT\n\n  for node in class_node.body:\n    # We only care about virtual functions.\n    if (isinstance(node, ast.Function) and\n        node.modifiers & function_type and\n        not node.modifiers & ctor_or_dtor):\n      # Pick out all the elements we need from the original function.\n      const = ''\n      if node.modifiers & ast.FUNCTION_CONST:\n        const = 'CONST_'\n      return_type = 'void'\n      if node.return_type:\n        # Add modifiers like 'const'.\n        modifiers = ''\n        if node.return_type.modifiers:\n          modifiers = ' '.join(node.return_type.modifiers) + ' '\n        return_type = modifiers + node.return_type.name\n        template_args = [arg.name for arg in node.return_type.templated_types]\n        if template_args:\n          return_type += '<' + ', '.join(template_args) + '>'\n          if len(template_args) > 1:\n            for line in [\n                '// The following line won\\'t really compile, as the return',\n                '// type has multiple template arguments.  To fix it, use a',\n                '// typedef for the return type.']:\n              output_lines.append(indent + line)\n        if node.return_type.pointer:\n          return_type += '*'\n        if node.return_type.reference:\n          return_type += '&'\n        num_parameters = len(node.parameters)\n        if len(node.parameters) == 1:\n          first_param = node.parameters[0]\n          if source[first_param.start:first_param.end].strip() == 'void':\n            # We must treat T(void) as a function with no parameters.\n            num_parameters = 0\n      tmpl = ''\n      if class_node.templated_types:\n        tmpl = '_T'\n      mock_method_macro = 'MOCK_%sMETHOD%d%s' % (const, num_parameters, tmpl)\n\n      args = ''\n      if node.parameters:\n        # Due to the parser limitations, it is impossible to keep comments\n        # while stripping the default parameters.  When defaults are\n        # present, we choose to strip them and comments (and produce\n        # compilable code).\n        # TODO(nnorwitz@google.com): Investigate whether it is possible to\n        # preserve parameter name when reconstructing parameter text from\n        # the AST.\n        if len([param for param in node.parameters if param.default]) > 0:\n          args = ', '.join(param.type.name for param in node.parameters)\n        else:\n          # Get the full text of the parameters from the start\n          # of the first parameter to the end of the last parameter.\n          start = node.parameters[0].start\n          end = node.parameters[-1].end\n          # Remove // comments.\n          args_strings = re.sub(r'//.*', '', source[start:end])\n          # Condense multiple spaces and eliminate newlines putting the\n          # parameters together on a single line.  Ensure there is a\n          # space in an argument which is split by a newline without\n          # intervening whitespace, e.g.: int\\nBar\n          args = re.sub('  +', ' ', args_strings.replace('\\n', ' '))\n\n      # Create the mock method definition.\n      output_lines.extend(['%s%s(%s,' % (indent, mock_method_macro, node.name),\n                           '%s%s(%s));' % (indent*3, return_type, args)])\n\n\ndef _GenerateMocks(filename, source, ast_list, desired_class_names):\n  processed_class_names = set()\n  lines = []\n  for node in ast_list:\n    if (isinstance(node, ast.Class) and node.body and\n        # desired_class_names being None means that all classes are selected.\n        (not desired_class_names or node.name in desired_class_names)):\n      class_name = node.name\n      parent_name = class_name\n      processed_class_names.add(class_name)\n      class_node = node\n      # Add namespace before the class.\n      if class_node.namespace:\n        lines.extend(['namespace %s {' % n for n in class_node.namespace])  # }\n        lines.append('')\n\n      # Add template args for templated classes.\n      if class_node.templated_types:\n        # TODO(paulchang): The AST doesn't preserve template argument order,\n        # so we have to make up names here.\n        # TODO(paulchang): Handle non-type template arguments (e.g.\n        # template<typename T, int N>).\n        template_arg_count = len(class_node.templated_types.keys())\n        template_args = ['T%d' % n for n in range(template_arg_count)]\n        template_decls = ['typename ' + arg for arg in template_args]\n        lines.append('template <' + ', '.join(template_decls) + '>')\n        parent_name += '<' + ', '.join(template_args) + '>'\n\n      # Add the class prolog.\n      lines.append('class Mock%s : public %s {'  # }\n                   % (class_name, parent_name))\n      lines.append('%spublic:' % (' ' * (_INDENT // 2)))\n\n      # Add all the methods.\n      _GenerateMethods(lines, source, class_node)\n\n      # Close the class.\n      if lines:\n        # If there are no virtual methods, no need for a public label.\n        if len(lines) == 2:\n          del lines[-1]\n\n        # Only close the class if there really is a class.\n        lines.append('};')\n        lines.append('')  # Add an extra newline.\n\n      # Close the namespace.\n      if class_node.namespace:\n        for i in range(len(class_node.namespace)-1, -1, -1):\n          lines.append('}  // namespace %s' % class_node.namespace[i])\n        lines.append('')  # Add an extra newline.\n\n  if desired_class_names:\n    missing_class_name_list = list(desired_class_names - processed_class_names)\n    if missing_class_name_list:\n      missing_class_name_list.sort()\n      sys.stderr.write('Class(es) not found in %s: %s\\n' %\n                       (filename, ', '.join(missing_class_name_list)))\n  elif not processed_class_names:\n    sys.stderr.write('No class found in %s\\n' % filename)\n\n  return lines\n\n\ndef main(argv=sys.argv):\n  if len(argv) < 2:\n    sys.stderr.write('Google Mock Class Generator v%s\\n\\n' %\n                     '.'.join(map(str, _VERSION)))\n    sys.stderr.write(__doc__)\n    return 1\n\n  global _INDENT\n  try:\n    _INDENT = int(os.environ['INDENT'])\n  except KeyError:\n    pass\n  except:\n    sys.stderr.write('Unable to use indent of %s\\n' % os.environ.get('INDENT'))\n\n  filename = argv[1]\n  desired_class_names = None  # None means all classes in the source file.\n  if len(argv) >= 3:\n    desired_class_names = set(argv[2:])\n  source = utils.ReadFile(filename)\n  if source is None:\n    return 1\n\n  builder = ast.BuilderFromSource(source, filename)\n  try:\n    entire_ast = filter(None, builder.Generate())\n  except KeyboardInterrupt:\n    return\n  except:\n    # An error message was already printed since we couldn't parse.\n    sys.exit(1)\n  else:\n    lines = _GenerateMocks(filename, source, entire_ast, desired_class_names)\n    sys.stdout.write('\\n'.join(lines))\n\n\nif __name__ == '__main__':\n  main(sys.argv)\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/scripts/generator/cpp/gmock_class_test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009 Neal Norwitz All Rights Reserved.\n# Portions Copyright 2009 Google Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\"\"\"Tests for gmock.scripts.generator.cpp.gmock_class.\"\"\"\n\n__author__ = 'nnorwitz@google.com (Neal Norwitz)'\n\n\nimport os\nimport sys\nimport unittest\n\n# Allow the cpp imports below to work when run as a standalone script.\nsys.path.append(os.path.join(os.path.dirname(__file__), '..'))\n\nfrom cpp import ast\nfrom cpp import gmock_class\n\n\nclass TestCase(unittest.TestCase):\n  \"\"\"Helper class that adds assert methods.\"\"\"\n\n  def StripLeadingWhitespace(self, lines):\n    \"\"\"Strip leading whitespace in each line in 'lines'.\"\"\"\n    return '\\n'.join([s.lstrip() for s in lines.split('\\n')])\n\n  def assertEqualIgnoreLeadingWhitespace(self, expected_lines, lines):\n    \"\"\"Specialized assert that ignores the indent level.\"\"\"\n    self.assertEqual(expected_lines, self.StripLeadingWhitespace(lines))\n\n\nclass GenerateMethodsTest(TestCase):\n\n  def GenerateMethodSource(self, cpp_source):\n    \"\"\"Convert C++ source to Google Mock output source lines.\"\"\"\n    method_source_lines = []\n    # <test> is a pseudo-filename, it is not read or written.\n    builder = ast.BuilderFromSource(cpp_source, '<test>')\n    ast_list = list(builder.Generate())\n    gmock_class._GenerateMethods(method_source_lines, cpp_source, ast_list[0])\n    return '\\n'.join(method_source_lines)\n\n  def testSimpleMethod(self):\n    source = \"\"\"\nclass Foo {\n public:\n  virtual int Bar();\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD0(Bar,\\nint());',\n        self.GenerateMethodSource(source))\n\n  def testSimpleConstructorsAndDestructor(self):\n    source = \"\"\"\nclass Foo {\n public:\n  Foo();\n  Foo(int x);\n  Foo(const Foo& f);\n  Foo(Foo&& f);\n  ~Foo();\n  virtual int Bar() = 0;\n};\n\"\"\"\n    # The constructors and destructor should be ignored.\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD0(Bar,\\nint());',\n        self.GenerateMethodSource(source))\n\n  def testVirtualDestructor(self):\n    source = \"\"\"\nclass Foo {\n public:\n  virtual ~Foo();\n  virtual int Bar() = 0;\n};\n\"\"\"\n    # The destructor should be ignored.\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD0(Bar,\\nint());',\n        self.GenerateMethodSource(source))\n\n  def testExplicitlyDefaultedConstructorsAndDestructor(self):\n    source = \"\"\"\nclass Foo {\n public:\n  Foo() = default;\n  Foo(const Foo& f) = default;\n  Foo(Foo&& f) = default;\n  ~Foo() = default;\n  virtual int Bar() = 0;\n};\n\"\"\"\n    # The constructors and destructor should be ignored.\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD0(Bar,\\nint());',\n        self.GenerateMethodSource(source))\n\n  def testExplicitlyDeletedConstructorsAndDestructor(self):\n    source = \"\"\"\nclass Foo {\n public:\n  Foo() = delete;\n  Foo(const Foo& f) = delete;\n  Foo(Foo&& f) = delete;\n  ~Foo() = delete;\n  virtual int Bar() = 0;\n};\n\"\"\"\n    # The constructors and destructor should be ignored.\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD0(Bar,\\nint());',\n        self.GenerateMethodSource(source))\n\n  def testSimpleOverrideMethod(self):\n    source = \"\"\"\nclass Foo {\n public:\n  int Bar() override;\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD0(Bar,\\nint());',\n        self.GenerateMethodSource(source))\n\n  def testSimpleConstMethod(self):\n    source = \"\"\"\nclass Foo {\n public:\n  virtual void Bar(bool flag) const;\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_CONST_METHOD1(Bar,\\nvoid(bool flag));',\n        self.GenerateMethodSource(source))\n\n  def testExplicitVoid(self):\n    source = \"\"\"\nclass Foo {\n public:\n  virtual int Bar(void);\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD0(Bar,\\nint(void));',\n        self.GenerateMethodSource(source))\n\n  def testStrangeNewlineInParameter(self):\n    source = \"\"\"\nclass Foo {\n public:\n  virtual void Bar(int\na) = 0;\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD1(Bar,\\nvoid(int a));',\n        self.GenerateMethodSource(source))\n\n  def testDefaultParameters(self):\n    source = \"\"\"\nclass Foo {\n public:\n  virtual void Bar(int a, char c = 'x') = 0;\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD2(Bar,\\nvoid(int, char));',\n        self.GenerateMethodSource(source))\n\n  def testMultipleDefaultParameters(self):\n    source = \"\"\"\nclass Foo {\n public:\n  virtual void Bar(int a = 42, char c = 'x') = 0;\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD2(Bar,\\nvoid(int, char));',\n        self.GenerateMethodSource(source))\n\n  def testRemovesCommentsWhenDefaultsArePresent(self):\n    source = \"\"\"\nclass Foo {\n public:\n  virtual void Bar(int a = 42 /* a comment */,\n                   char /* other comment */ c= 'x') = 0;\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD2(Bar,\\nvoid(int, char));',\n        self.GenerateMethodSource(source))\n\n  def testDoubleSlashCommentsInParameterListAreRemoved(self):\n    source = \"\"\"\nclass Foo {\n public:\n  virtual void Bar(int a,  // inline comments should be elided.\n                   int b   // inline comments should be elided.\n                   ) const = 0;\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_CONST_METHOD2(Bar,\\nvoid(int a, int b));',\n        self.GenerateMethodSource(source))\n\n  def testCStyleCommentsInParameterListAreNotRemoved(self):\n    # NOTE(nnorwitz): I'm not sure if it's the best behavior to keep these\n    # comments.  Also note that C style comments after the last parameter\n    # are still elided.\n    source = \"\"\"\nclass Foo {\n public:\n  virtual const string& Bar(int /* keeper */, int b);\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD2(Bar,\\nconst string&(int /* keeper */, int b));',\n        self.GenerateMethodSource(source))\n\n  def testArgsOfTemplateTypes(self):\n    source = \"\"\"\nclass Foo {\n public:\n  virtual int Bar(const vector<int>& v, map<int, string>* output);\n};\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD2(Bar,\\n'\n        'int(const vector<int>& v, map<int, string>* output));',\n        self.GenerateMethodSource(source))\n\n  def testReturnTypeWithOneTemplateArg(self):\n    source = \"\"\"\nclass Foo {\n public:\n  virtual vector<int>* Bar(int n);\n};\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD1(Bar,\\nvector<int>*(int n));',\n        self.GenerateMethodSource(source))\n\n  def testReturnTypeWithManyTemplateArgs(self):\n    source = \"\"\"\nclass Foo {\n public:\n  virtual map<int, string> Bar();\n};\"\"\"\n    # Comparing the comment text is brittle - we'll think of something\n    # better in case this gets annoying, but for now let's keep it simple.\n    self.assertEqualIgnoreLeadingWhitespace(\n        '// The following line won\\'t really compile, as the return\\n'\n        '// type has multiple template arguments.  To fix it, use a\\n'\n        '// typedef for the return type.\\n'\n        'MOCK_METHOD0(Bar,\\nmap<int, string>());',\n        self.GenerateMethodSource(source))\n\n  def testSimpleMethodInTemplatedClass(self):\n    source = \"\"\"\ntemplate<class T>\nclass Foo {\n public:\n  virtual int Bar();\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD0_T(Bar,\\nint());',\n        self.GenerateMethodSource(source))\n\n  def testPointerArgWithoutNames(self):\n    source = \"\"\"\nclass Foo {\n  virtual int Bar(C*);\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD1(Bar,\\nint(C*));',\n        self.GenerateMethodSource(source))\n\n  def testReferenceArgWithoutNames(self):\n    source = \"\"\"\nclass Foo {\n  virtual int Bar(C&);\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD1(Bar,\\nint(C&));',\n        self.GenerateMethodSource(source))\n\n  def testArrayArgWithoutNames(self):\n    source = \"\"\"\nclass Foo {\n  virtual int Bar(C[]);\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        'MOCK_METHOD1(Bar,\\nint(C[]));',\n        self.GenerateMethodSource(source))\n\n\nclass GenerateMocksTest(TestCase):\n\n  def GenerateMocks(self, cpp_source):\n    \"\"\"Convert C++ source to complete Google Mock output source.\"\"\"\n    # <test> is a pseudo-filename, it is not read or written.\n    filename = '<test>'\n    builder = ast.BuilderFromSource(cpp_source, filename)\n    ast_list = list(builder.Generate())\n    lines = gmock_class._GenerateMocks(filename, cpp_source, ast_list, None)\n    return '\\n'.join(lines)\n\n  def testNamespaces(self):\n    source = \"\"\"\nnamespace Foo {\nnamespace Bar { class Forward; }\nnamespace Baz {\n\nclass Test {\n public:\n  virtual void Foo();\n};\n\n}  // namespace Baz\n}  // namespace Foo\n\"\"\"\n    expected = \"\"\"\\\nnamespace Foo {\nnamespace Baz {\n\nclass MockTest : public Test {\npublic:\nMOCK_METHOD0(Foo,\nvoid());\n};\n\n}  // namespace Baz\n}  // namespace Foo\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        expected, self.GenerateMocks(source))\n\n  def testClassWithStorageSpecifierMacro(self):\n    source = \"\"\"\nclass STORAGE_SPECIFIER Test {\n public:\n  virtual void Foo();\n};\n\"\"\"\n    expected = \"\"\"\\\nclass MockTest : public Test {\npublic:\nMOCK_METHOD0(Foo,\nvoid());\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        expected, self.GenerateMocks(source))\n\n  def testTemplatedForwardDeclaration(self):\n    source = \"\"\"\ntemplate <class T> class Forward;  // Forward declaration should be ignored.\nclass Test {\n public:\n  virtual void Foo();\n};\n\"\"\"\n    expected = \"\"\"\\\nclass MockTest : public Test {\npublic:\nMOCK_METHOD0(Foo,\nvoid());\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        expected, self.GenerateMocks(source))\n\n  def testTemplatedClass(self):\n    source = \"\"\"\ntemplate <typename S, typename T>\nclass Test {\n public:\n  virtual void Foo();\n};\n\"\"\"\n    expected = \"\"\"\\\ntemplate <typename T0, typename T1>\nclass MockTest : public Test<T0, T1> {\npublic:\nMOCK_METHOD0_T(Foo,\nvoid());\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        expected, self.GenerateMocks(source))\n\n  def testTemplateInATemplateTypedef(self):\n    source = \"\"\"\nclass Test {\n public:\n  typedef std::vector<std::list<int>> FooType;\n  virtual void Bar(const FooType& test_arg);\n};\n\"\"\"\n    expected = \"\"\"\\\nclass MockTest : public Test {\npublic:\nMOCK_METHOD1(Bar,\nvoid(const FooType& test_arg));\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        expected, self.GenerateMocks(source))\n\n  def testTemplateInATemplateTypedefWithComma(self):\n    source = \"\"\"\nclass Test {\n public:\n  typedef std::function<void(\n      const vector<std::list<int>>&, int> FooType;\n  virtual void Bar(const FooType& test_arg);\n};\n\"\"\"\n    expected = \"\"\"\\\nclass MockTest : public Test {\npublic:\nMOCK_METHOD1(Bar,\nvoid(const FooType& test_arg));\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        expected, self.GenerateMocks(source))\n\n  def testEnumClass(self):\n    source = \"\"\"\nclass Test {\n public:\n  enum class Baz { BAZINGA };\n  virtual void Bar(const FooType& test_arg);\n};\n\"\"\"\n    expected = \"\"\"\\\nclass MockTest : public Test {\npublic:\nMOCK_METHOD1(Bar,\nvoid(const FooType& test_arg));\n};\n\"\"\"\n    self.assertEqualIgnoreLeadingWhitespace(\n        expected, self.GenerateMocks(source))\n\nif __name__ == '__main__':\n  unittest.main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/scripts/generator/cpp/keywords.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2007 Neal Norwitz\n# Portions Copyright 2007 Google Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\"\"\"C++ keywords and helper utilities for determining keywords.\"\"\"\n\n__author__ = 'nnorwitz@google.com (Neal Norwitz)'\n\n\ntry:\n    # Python 3.x\n    import builtins\nexcept ImportError:\n    # Python 2.x\n    import __builtin__ as builtins\n\n\nif not hasattr(builtins, 'set'):\n    # Nominal support for Python 2.3.\n    from sets import Set as set\n\n\nTYPES = set('bool char int long short double float void wchar_t unsigned signed'.split())\nTYPE_MODIFIERS = set('auto register const inline extern static virtual volatile mutable'.split())\nACCESS = set('public protected private friend'.split())\n\nCASTS = set('static_cast const_cast dynamic_cast reinterpret_cast'.split())\n\nOTHERS = set('true false asm class namespace using explicit this operator sizeof'.split())\nOTHER_TYPES = set('new delete typedef struct union enum typeid typename template'.split())\n\nCONTROL = set('case switch default if else return goto'.split())\nEXCEPTION = set('try catch throw'.split())\nLOOP = set('while do for break continue'.split())\n\nALL = TYPES | TYPE_MODIFIERS | ACCESS | CASTS | OTHERS | OTHER_TYPES | CONTROL | EXCEPTION | LOOP\n\n\ndef IsKeyword(token):\n    return token in ALL\n\ndef IsBuiltinType(token):\n    if token in ('virtual', 'inline'):\n        # These only apply to methods, they can't be types by themselves.\n        return False\n    return token in TYPES or token in TYPE_MODIFIERS\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/scripts/generator/cpp/tokenize.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2007 Neal Norwitz\n# Portions Copyright 2007 Google Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\"\"\"Tokenize C++ source code.\"\"\"\n\n__author__ = 'nnorwitz@google.com (Neal Norwitz)'\n\n\ntry:\n    # Python 3.x\n    import builtins\nexcept ImportError:\n    # Python 2.x\n    import __builtin__ as builtins\n\n\nimport sys\n\nfrom cpp import utils\n\n\nif not hasattr(builtins, 'set'):\n    # Nominal support for Python 2.3.\n    from sets import Set as set\n\n\n# Add $ as a valid identifier char since so much code uses it.\n_letters = 'abcdefghijklmnopqrstuvwxyz'\nVALID_IDENTIFIER_CHARS = set(_letters + _letters.upper() + '_0123456789$')\nHEX_DIGITS = set('0123456789abcdefABCDEF')\nINT_OR_FLOAT_DIGITS = set('01234567890eE-+')\n\n\n# C++0x string preffixes.\n_STR_PREFIXES = set(('R', 'u8', 'u8R', 'u', 'uR', 'U', 'UR', 'L', 'LR'))\n\n\n# Token types.\nUNKNOWN = 'UNKNOWN'\nSYNTAX = 'SYNTAX'\nCONSTANT = 'CONSTANT'\nNAME = 'NAME'\nPREPROCESSOR = 'PREPROCESSOR'\n\n# Where the token originated from.  This can be used for backtracking.\n# It is always set to WHENCE_STREAM in this code.\nWHENCE_STREAM, WHENCE_QUEUE = range(2)\n\n\nclass Token(object):\n    \"\"\"Data container to represent a C++ token.\n\n    Tokens can be identifiers, syntax char(s), constants, or\n    pre-processor directives.\n\n    start contains the index of the first char of the token in the source\n    end contains the index of the last char of the token in the source\n    \"\"\"\n\n    def __init__(self, token_type, name, start, end):\n        self.token_type = token_type\n        self.name = name\n        self.start = start\n        self.end = end\n        self.whence = WHENCE_STREAM\n\n    def __str__(self):\n        if not utils.DEBUG:\n            return 'Token(%r)' % self.name\n        return 'Token(%r, %s, %s)' % (self.name, self.start, self.end)\n\n    __repr__ = __str__\n\n\ndef _GetString(source, start, i):\n    i = source.find('\"', i+1)\n    while source[i-1] == '\\\\':\n        # Count the trailing backslashes.\n        backslash_count = 1\n        j = i - 2\n        while source[j] == '\\\\':\n            backslash_count += 1\n            j -= 1\n        # When trailing backslashes are even, they escape each other.\n        if (backslash_count % 2) == 0:\n            break\n        i = source.find('\"', i+1)\n    return i + 1\n\n\ndef _GetChar(source, start, i):\n    # NOTE(nnorwitz): may not be quite correct, should be good enough.\n    i = source.find(\"'\", i+1)\n    while source[i-1] == '\\\\':\n        # Need to special case '\\\\'.\n        if (i - 2) > start and source[i-2] == '\\\\':\n            break\n        i = source.find(\"'\", i+1)\n    # Try to handle unterminated single quotes (in a #if 0 block).\n    if i < 0:\n        i = start\n    return i + 1\n\n\ndef GetTokens(source):\n    \"\"\"Returns a sequence of Tokens.\n\n    Args:\n      source: string of C++ source code.\n\n    Yields:\n      Token that represents the next token in the source.\n    \"\"\"\n    # Cache various valid character sets for speed.\n    valid_identifier_chars = VALID_IDENTIFIER_CHARS\n    hex_digits = HEX_DIGITS\n    int_or_float_digits = INT_OR_FLOAT_DIGITS\n    int_or_float_digits2 = int_or_float_digits | set('.')\n\n    # Only ignore errors while in a #if 0 block.\n    ignore_errors = False\n    count_ifs = 0\n\n    i = 0\n    end = len(source)\n    while i < end:\n        # Skip whitespace.\n        while i < end and source[i].isspace():\n            i += 1\n        if i >= end:\n            return\n\n        token_type = UNKNOWN\n        start = i\n        c = source[i]\n        if c.isalpha() or c == '_':              # Find a string token.\n            token_type = NAME\n            while source[i] in valid_identifier_chars:\n                i += 1\n            # String and character constants can look like a name if\n            # they are something like L\"\".\n            if (source[i] == \"'\" and (i - start) == 1 and\n                source[start:i] in 'uUL'):\n                # u, U, and L are valid C++0x character preffixes.\n                token_type = CONSTANT\n                i = _GetChar(source, start, i)\n            elif source[i] == \"'\" and source[start:i] in _STR_PREFIXES:\n                token_type = CONSTANT\n                i = _GetString(source, start, i)\n        elif c == '/' and source[i+1] == '/':    # Find // comments.\n            i = source.find('\\n', i)\n            if i == -1:  # Handle EOF.\n                i = end\n            continue\n        elif c == '/' and source[i+1] == '*':    # Find /* comments. */\n            i = source.find('*/', i) + 2\n            continue\n        elif c in ':+-<>&|*=':                   # : or :: (plus other chars).\n            token_type = SYNTAX\n            i += 1\n            new_ch = source[i]\n            if new_ch == c and c != '>':         # Treat \">>\" as two tokens.\n                i += 1\n            elif c == '-' and new_ch == '>':\n                i += 1\n            elif new_ch == '=':\n                i += 1\n        elif c in '()[]{}~!?^%;/.,':             # Handle single char tokens.\n            token_type = SYNTAX\n            i += 1\n            if c == '.' and source[i].isdigit():\n                token_type = CONSTANT\n                i += 1\n                while source[i] in int_or_float_digits:\n                    i += 1\n                # Handle float suffixes.\n                for suffix in ('l', 'f'):\n                    if suffix == source[i:i+1].lower():\n                        i += 1\n                        break\n        elif c.isdigit():                        # Find integer.\n            token_type = CONSTANT\n            if c == '0' and source[i+1] in 'xX':\n                # Handle hex digits.\n                i += 2\n                while source[i] in hex_digits:\n                    i += 1\n            else:\n                while source[i] in int_or_float_digits2:\n                    i += 1\n            # Handle integer (and float) suffixes.\n            for suffix in ('ull', 'll', 'ul', 'l', 'f', 'u'):\n                size = len(suffix)\n                if suffix == source[i:i+size].lower():\n                    i += size\n                    break\n        elif c == '\"':                           # Find string.\n            token_type = CONSTANT\n            i = _GetString(source, start, i)\n        elif c == \"'\":                           # Find char.\n            token_type = CONSTANT\n            i = _GetChar(source, start, i)\n        elif c == '#':                           # Find pre-processor command.\n            token_type = PREPROCESSOR\n            got_if = source[i:i+3] == '#if' and source[i+3:i+4].isspace()\n            if got_if:\n                count_ifs += 1\n            elif source[i:i+6] == '#endif':\n                count_ifs -= 1\n                if count_ifs == 0:\n                    ignore_errors = False\n\n            # TODO(nnorwitz): handle preprocessor statements (\\ continuations).\n            while 1:\n                i1 = source.find('\\n', i)\n                i2 = source.find('//', i)\n                i3 = source.find('/*', i)\n                i4 = source.find('\"', i)\n                # NOTE(nnorwitz): doesn't handle comments in #define macros.\n                # Get the first important symbol (newline, comment, EOF/end).\n                i = min([x for x in (i1, i2, i3, i4, end) if x != -1])\n\n                # Handle #include \"dir//foo.h\" properly.\n                if source[i] == '\"':\n                    i = source.find('\"', i+1) + 1\n                    assert i > 0\n                    continue\n                # Keep going if end of the line and the line ends with \\.\n                if not (i == i1 and source[i-1] == '\\\\'):\n                    if got_if:\n                        condition = source[start+4:i].lstrip()\n                        if (condition.startswith('0') or\n                            condition.startswith('(0)')):\n                            ignore_errors = True\n                    break\n                i += 1\n        elif c == '\\\\':                          # Handle \\ in code.\n            # This is different from the pre-processor \\ handling.\n            i += 1\n            continue\n        elif ignore_errors:\n            # The tokenizer seems to be in pretty good shape.  This\n            # raise is conditionally disabled so that bogus code\n            # in an #if 0 block can be handled.  Since we will ignore\n            # it anyways, this is probably fine.  So disable the\n            # exception and  return the bogus char.\n            i += 1\n        else:\n            sys.stderr.write('Got invalid token in %s @ %d token:%s: %r\\n' %\n                             ('?', i, c, source[i-10:i+10]))\n            raise RuntimeError('unexpected token')\n\n        if i <= 0:\n            print('Invalid index, exiting now.')\n            return\n        yield Token(token_type, source[start:i], start, i)\n\n\nif __name__ == '__main__':\n    def main(argv):\n        \"\"\"Driver mostly for testing purposes.\"\"\"\n        for filename in argv[1:]:\n            source = utils.ReadFile(filename)\n            if source is None:\n                continue\n\n            for token in GetTokens(source):\n                print('%-12s: %s' % (token.token_type, token.name))\n                # print('\\r%6.2f%%' % (100.0 * index / token.end),)\n            sys.stdout.write('\\n')\n\n\n    main(sys.argv)\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/scripts/generator/cpp/utils.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2007 Neal Norwitz\n# Portions Copyright 2007 Google Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\"\"\"Generic utilities for C++ parsing.\"\"\"\n\n__author__ = 'nnorwitz@google.com (Neal Norwitz)'\n\n\nimport sys\n\n\n# Set to True to see the start/end token indices.\nDEBUG = True\n\n\ndef ReadFile(filename, print_error=True):\n    \"\"\"Returns the contents of a file.\"\"\"\n    try:\n        fp = open(filename)\n        try:\n            return fp.read()\n        finally:\n            fp.close()\n    except IOError:\n        if print_error:\n            print('Error reading %s: %s' % (filename, sys.exc_info()[1]))\n        return None\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/scripts/generator/gmock_gen.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008 Google Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\"\"\"Driver for starting up Google Mock class generator.\"\"\"\n\n__author__ = 'nnorwitz@google.com (Neal Norwitz)'\n\nimport os\nimport sys\n\nif __name__ == '__main__':\n  # Add the directory of this script to the path so we can import gmock_class.\n  sys.path.append(os.path.dirname(__file__))\n\n  from cpp import gmock_class\n  # Fix the docstring in case they require the usage.\n  gmock_class.__doc__ = gmock_class.__doc__.replace('gmock_class.py', __file__)\n  gmock_class.main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/scripts/gmock-config.in",
    "content": "#!/bin/sh\n\n# These variables are automatically filled in by the configure script.\nname=\"@PACKAGE_TARNAME@\"\nversion=\"@PACKAGE_VERSION@\"\n\nshow_usage()\n{\n  echo \"Usage: gmock-config [OPTIONS...]\"\n}\n\nshow_help()\n{\n  show_usage\n  cat <<\\EOF\n\nThe `gmock-config' script provides access to the necessary compile and linking\nflags to connect with Google C++ Mocking Framework, both in a build prior to\ninstallation, and on the system proper after installation. The installation\noverrides may be issued in combination with any other queries, but will only\naffect installation queries if called on a built but not installed gmock. The\ninstallation queries may not be issued with any other types of queries, and\nonly one installation query may be made at a time. The version queries and\ncompiler flag queries may be combined as desired but not mixed. Different\nversion queries are always combined with logical \"and\" semantics, and only the\nlast of any particular query is used while all previous ones ignored. All\nversions must be specified as a sequence of numbers separated by periods.\nCompiler flag queries output the union of the sets of flags when combined.\n\n Examples:\n  gmock-config --min-version=1.0 || echo \"Insufficient Google Mock version.\"\n\n  g++ $(gmock-config --cppflags --cxxflags) -o foo.o -c foo.cpp\n  g++ $(gmock-config --ldflags --libs) -o foo foo.o\n\n  # When using a built but not installed Google Mock:\n  g++ $(../../my_gmock_build/scripts/gmock-config ...) ...\n\n  # When using an installed Google Mock, but with installation overrides:\n  export GMOCK_PREFIX=\"/opt\"\n  g++ $(gmock-config --libdir=\"/opt/lib64\" ...) ...\n\n Help:\n  --usage                    brief usage information\n  --help                     display this help message\n\n Installation Overrides:\n  --prefix=<dir>             overrides the installation prefix\n  --exec-prefix=<dir>        overrides the executable installation prefix\n  --libdir=<dir>             overrides the library installation prefix\n  --includedir=<dir>         overrides the header file installation prefix\n\n Installation Queries:\n  --prefix                   installation prefix\n  --exec-prefix              executable installation prefix\n  --libdir                   library installation directory\n  --includedir               header file installation directory\n  --version                  the version of the Google Mock installation\n\n Version Queries:\n  --min-version=VERSION      return 0 if the version is at least VERSION\n  --exact-version=VERSION    return 0 if the version is exactly VERSION\n  --max-version=VERSION      return 0 if the version is at most VERSION\n\n Compilation Flag Queries:\n  --cppflags                 compile flags specific to the C-like preprocessors\n  --cxxflags                 compile flags appropriate for C++ programs\n  --ldflags                  linker flags\n  --libs                     libraries for linking\n\nEOF\n}\n\n# This function bounds our version with a min and a max. It uses some clever\n# POSIX-compliant variable expansion to portably do all the work in the shell\n# and avoid any dependency on a particular \"sed\" or \"awk\" implementation.\n# Notable is that it will only ever compare the first 3 components of versions.\n# Further components will be cleanly stripped off. All versions must be\n# unadorned, so \"v1.0\" will *not* work. The minimum version must be in $1, and\n# the max in $2. TODO(chandlerc@google.com): If this ever breaks, we should\n# investigate expanding this via autom4te from AS_VERSION_COMPARE rather than\n# continuing to maintain our own shell version.\ncheck_versions()\n{\n  major_version=${version%%.*}\n  minor_version=\"0\"\n  point_version=\"0\"\n  if test \"${version#*.}\" != \"${version}\"; then\n    minor_version=${version#*.}\n    minor_version=${minor_version%%.*}\n  fi\n  if test \"${version#*.*.}\" != \"${version}\"; then\n    point_version=${version#*.*.}\n    point_version=${point_version%%.*}\n  fi\n\n  min_version=\"$1\"\n  min_major_version=${min_version%%.*}\n  min_minor_version=\"0\"\n  min_point_version=\"0\"\n  if test \"${min_version#*.}\" != \"${min_version}\"; then\n    min_minor_version=${min_version#*.}\n    min_minor_version=${min_minor_version%%.*}\n  fi\n  if test \"${min_version#*.*.}\" != \"${min_version}\"; then\n    min_point_version=${min_version#*.*.}\n    min_point_version=${min_point_version%%.*}\n  fi\n\n  max_version=\"$2\"\n  max_major_version=${max_version%%.*}\n  max_minor_version=\"0\"\n  max_point_version=\"0\"\n  if test \"${max_version#*.}\" != \"${max_version}\"; then\n    max_minor_version=${max_version#*.}\n    max_minor_version=${max_minor_version%%.*}\n  fi\n  if test \"${max_version#*.*.}\" != \"${max_version}\"; then\n    max_point_version=${max_version#*.*.}\n    max_point_version=${max_point_version%%.*}\n  fi\n\n  test $(($major_version)) -lt $(($min_major_version)) && exit 1\n  if test $(($major_version)) -eq $(($min_major_version)); then\n    test $(($minor_version)) -lt $(($min_minor_version)) && exit 1\n    if test $(($minor_version)) -eq $(($min_minor_version)); then\n      test $(($point_version)) -lt $(($min_point_version)) && exit 1\n    fi\n  fi\n\n  test $(($major_version)) -gt $(($max_major_version)) && exit 1\n  if test $(($major_version)) -eq $(($max_major_version)); then\n    test $(($minor_version)) -gt $(($max_minor_version)) && exit 1\n    if test $(($minor_version)) -eq $(($max_minor_version)); then\n      test $(($point_version)) -gt $(($max_point_version)) && exit 1\n    fi\n  fi\n\n  exit 0\n}\n\n# Show the usage line when no arguments are specified.\nif test $# -eq 0; then\n  show_usage\n  exit 1\nfi\n\nwhile test $# -gt 0; do\n  case $1 in\n    --usage)          show_usage;         exit 0;;\n    --help)           show_help;          exit 0;;\n\n    # Installation overrides\n    --prefix=*)       GMOCK_PREFIX=${1#--prefix=};;\n    --exec-prefix=*)  GMOCK_EXEC_PREFIX=${1#--exec-prefix=};;\n    --libdir=*)       GMOCK_LIBDIR=${1#--libdir=};;\n    --includedir=*)   GMOCK_INCLUDEDIR=${1#--includedir=};;\n\n    # Installation queries\n    --prefix|--exec-prefix|--libdir|--includedir|--version)\n      if test -n \"${do_query}\"; then\n        show_usage\n        exit 1\n      fi\n      do_query=${1#--}\n      ;;\n\n    # Version checking\n    --min-version=*)\n      do_check_versions=yes\n      min_version=${1#--min-version=}\n      ;;\n    --max-version=*)\n      do_check_versions=yes\n      max_version=${1#--max-version=}\n      ;;\n    --exact-version=*)\n      do_check_versions=yes\n      exact_version=${1#--exact-version=}\n      ;;\n\n    # Compiler flag output\n    --cppflags)       echo_cppflags=yes;;\n    --cxxflags)       echo_cxxflags=yes;;\n    --ldflags)        echo_ldflags=yes;;\n    --libs)           echo_libs=yes;;\n\n    # Everything else is an error\n    *)                show_usage;         exit 1;;\n  esac\n  shift\ndone\n\n# These have defaults filled in by the configure script but can also be\n# overridden by environment variables or command line parameters.\nprefix=\"${GMOCK_PREFIX:-@prefix@}\"\nexec_prefix=\"${GMOCK_EXEC_PREFIX:-@exec_prefix@}\"\nlibdir=\"${GMOCK_LIBDIR:-@libdir@}\"\nincludedir=\"${GMOCK_INCLUDEDIR:-@includedir@}\"\n\n# We try and detect if our binary is not located at its installed location. If\n# it's not, we provide variables pointing to the source and build tree rather\n# than to the install tree. We also locate Google Test using the configured\n# gtest-config script rather than searching the PATH and our bindir for one.\n# This allows building against a just-built gmock rather than an installed\n# gmock.\nbindir=\"@bindir@\"\nthis_relative_bindir=`dirname $0`\nthis_bindir=`cd ${this_relative_bindir}; pwd -P`\nif test \"${this_bindir}\" = \"${this_bindir%${bindir}}\"; then\n  # The path to the script doesn't end in the bindir sequence from Autoconf,\n  # assume that we are in a build tree.\n  build_dir=`dirname ${this_bindir}`\n  src_dir=`cd ${this_bindir}/@top_srcdir@; pwd -P`\n\n  # TODO(chandlerc@google.com): This is a dangerous dependency on libtool, we\n  # should work to remove it, and/or remove libtool altogether, replacing it\n  # with direct references to the library and a link path.\n  gmock_libs=\"${build_dir}/lib/libgmock.la\"\n  gmock_ldflags=\"\"\n\n  # We provide hooks to include from either the source or build dir, where the\n  # build dir is always preferred. This will potentially allow us to write\n  # build rules for generated headers and have them automatically be preferred\n  # over provided versions.\n  gmock_cppflags=\"-I${build_dir}/include -I${src_dir}/include\"\n  gmock_cxxflags=\"\"\n\n  # Directly invoke the gtest-config script used during the build process.\n  gtest_config=\"@GTEST_CONFIG@\"\nelse\n  # We're using an installed gmock, although it may be staged under some\n  # prefix. Assume (as our own libraries do) that we can resolve the prefix,\n  # and are present in the dynamic link paths.\n  gmock_ldflags=\"-L${libdir}\"\n  gmock_libs=\"-l${name}\"\n  gmock_cppflags=\"-I${includedir}\"\n  gmock_cxxflags=\"\"\n\n  # We also prefer any gtest-config script installed in our prefix. Lacking\n  # one, we look in the PATH for one.\n  gtest_config=\"${bindir}/gtest-config\"\n  if test ! -x \"${gtest_config}\"; then\n    gtest_config=`which gtest-config`\n  fi\nfi\n\n# Ensure that we have located a Google Test to link against.\nif ! test -x \"${gtest_config}\"; then\n  echo \"Unable to locate Google Test, check your Google Mock configuration\" \\\n       \"and installation\" >&2\n  exit 1\nelif ! \"${gtest_config}\" \"--exact-version=@GTEST_VERSION@\"; then\n  echo \"The Google Test found is not the same version as Google Mock was \" \\\n       \"built against\" >&2\n  exit 1\nfi\n\n# Add the necessary Google Test bits into the various flag variables\ngmock_cppflags=\"${gmock_cppflags} `${gtest_config} --cppflags`\"\ngmock_cxxflags=\"${gmock_cxxflags} `${gtest_config} --cxxflags`\"\ngmock_ldflags=\"${gmock_ldflags} `${gtest_config} --ldflags`\"\ngmock_libs=\"${gmock_libs} `${gtest_config} --libs`\"\n\n# Do an installation query if requested.\nif test -n \"$do_query\"; then\n  case $do_query in\n    prefix)           echo $prefix;       exit 0;;\n    exec-prefix)      echo $exec_prefix;  exit 0;;\n    libdir)           echo $libdir;       exit 0;;\n    includedir)       echo $includedir;   exit 0;;\n    version)          echo $version;      exit 0;;\n    *)                show_usage;         exit 1;;\n  esac\nfi\n\n# Do a version check if requested.\nif test \"$do_check_versions\" = \"yes\"; then\n  # Make sure we didn't receive a bad combination of parameters.\n  test \"$echo_cppflags\" = \"yes\" && show_usage && exit 1\n  test \"$echo_cxxflags\" = \"yes\" && show_usage && exit 1\n  test \"$echo_ldflags\" = \"yes\"  && show_usage && exit 1\n  test \"$echo_libs\" = \"yes\"     && show_usage && exit 1\n\n  if test \"$exact_version\" != \"\"; then\n    check_versions $exact_version $exact_version\n    # unreachable\n  else\n    check_versions ${min_version:-0.0.0} ${max_version:-9999.9999.9999}\n    # unreachable\n  fi\nfi\n\n# Do the output in the correct order so that these can be used in-line of\n# a compiler invocation.\noutput=\"\"\ntest \"$echo_cppflags\" = \"yes\" && output=\"$output $gmock_cppflags\"\ntest \"$echo_cxxflags\" = \"yes\" && output=\"$output $gmock_cxxflags\"\ntest \"$echo_ldflags\" = \"yes\"  && output=\"$output $gmock_ldflags\"\ntest \"$echo_libs\" = \"yes\"     && output=\"$output $gmock_libs\"\necho $output\n\nexit 0\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/scripts/gmock_doctor.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Converts compiler's errors in code using Google Mock to plain English.\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport re\nimport sys\n\n_VERSION = '1.0.3'\n\n_EMAIL = 'googlemock@googlegroups.com'\n\n_COMMON_GMOCK_SYMBOLS = [\n    # Matchers\n    '_',\n    'A',\n    'AddressSatisfies',\n    'AllOf',\n    'An',\n    'AnyOf',\n    'ContainerEq',\n    'Contains',\n    'ContainsRegex',\n    'DoubleEq',\n    'ElementsAre',\n    'ElementsAreArray',\n    'EndsWith',\n    'Eq',\n    'Field',\n    'FloatEq',\n    'Ge',\n    'Gt',\n    'HasSubstr',\n    'IsInitializedProto',\n    'Le',\n    'Lt',\n    'MatcherCast',\n    'Matches',\n    'MatchesRegex',\n    'NanSensitiveDoubleEq',\n    'NanSensitiveFloatEq',\n    'Ne',\n    'Not',\n    'NotNull',\n    'Pointee',\n    'Property',\n    'Ref',\n    'ResultOf',\n    'SafeMatcherCast',\n    'StartsWith',\n    'StrCaseEq',\n    'StrCaseNe',\n    'StrEq',\n    'StrNe',\n    'Truly',\n    'TypedEq',\n    'Value',\n\n    # Actions\n    'Assign',\n    'ByRef',\n    'DeleteArg',\n    'DoAll',\n    'DoDefault',\n    'IgnoreResult',\n    'Invoke',\n    'InvokeArgument',\n    'InvokeWithoutArgs',\n    'Return',\n    'ReturnNew',\n    'ReturnNull',\n    'ReturnRef',\n    'SaveArg',\n    'SetArgReferee',\n    'SetArgPointee',\n    'SetArgumentPointee',\n    'SetArrayArgument',\n    'SetErrnoAndReturn',\n    'Throw',\n    'WithArg',\n    'WithArgs',\n    'WithoutArgs',\n\n    # Cardinalities\n    'AnyNumber',\n    'AtLeast',\n    'AtMost',\n    'Between',\n    'Exactly',\n\n    # Sequences\n    'InSequence',\n    'Sequence',\n\n    # Misc\n    'DefaultValue',\n    'Mock',\n    ]\n\n# Regex for matching source file path and line number in the compiler's errors.\n_GCC_FILE_LINE_RE = r'(?P<file>.*):(?P<line>\\d+):(\\d+:)?\\s+'\n_CLANG_FILE_LINE_RE = r'(?P<file>.*):(?P<line>\\d+):(?P<column>\\d+):\\s+'\n_CLANG_NON_GMOCK_FILE_LINE_RE = (\n    r'(?P<file>.*[/\\\\^](?!gmock-)[^/\\\\]+):(?P<line>\\d+):(?P<column>\\d+):\\s+')\n\n\ndef _FindAllMatches(regex, s):\n  \"\"\"Generates all matches of regex in string s.\"\"\"\n\n  r = re.compile(regex)\n  return r.finditer(s)\n\n\ndef _GenericDiagnoser(short_name, long_name, diagnoses, msg):\n  \"\"\"Diagnoses the given disease by pattern matching.\n\n  Can provide different diagnoses for different patterns.\n\n  Args:\n    short_name: Short name of the disease.\n    long_name:  Long name of the disease.\n    diagnoses:  A list of pairs (regex, pattern for formatting the diagnosis\n                for matching regex).\n    msg:        Compiler's error messages.\n  Yields:\n    Tuples of the form\n      (short name of disease, long name of disease, diagnosis).\n  \"\"\"\n  for regex, diagnosis in diagnoses:\n    if re.search(regex, msg):\n      diagnosis = '%(file)s:%(line)s:' + diagnosis\n      for m in _FindAllMatches(regex, msg):\n        yield (short_name, long_name, diagnosis % m.groupdict())\n\n\ndef _NeedToReturnReferenceDiagnoser(msg):\n  \"\"\"Diagnoses the NRR disease, given the error messages by the compiler.\"\"\"\n\n  gcc_regex = (r'In member function \\'testing::internal::ReturnAction<R>.*\\n'\n               + _GCC_FILE_LINE_RE + r'instantiated from here\\n'\n               r'.*gmock-actions\\.h.*error: creating array with negative size')\n  clang_regex = (r'error:.*array.*negative.*\\r?\\n'\n                 r'(.*\\n)*?' +\n                 _CLANG_NON_GMOCK_FILE_LINE_RE +\n                 r'note: in instantiation of function template specialization '\n                 r'\\'testing::internal::ReturnAction<(?P<type>.*)>'\n                 r'::operator Action<.*>\\' requested here')\n  clang11_re = (r'use_ReturnRef_instead_of_Return_to_return_a_reference.*'\n                r'(.*\\n)*?' + _CLANG_NON_GMOCK_FILE_LINE_RE)\n\n  diagnosis = \"\"\"\nYou are using a Return() action in a function that returns a reference to\n%(type)s.  Please use ReturnRef() instead.\"\"\"\n  return _GenericDiagnoser('NRR', 'Need to Return Reference',\n                           [(clang_regex, diagnosis),\n                            (clang11_re, diagnosis % {'type': 'a type'}),\n                            (gcc_regex, diagnosis % {'type': 'a type'})],\n                           msg)\n\n\ndef _NeedToReturnSomethingDiagnoser(msg):\n  \"\"\"Diagnoses the NRS disease, given the error messages by the compiler.\"\"\"\n\n  gcc_regex = (_GCC_FILE_LINE_RE + r'(instantiated from here\\n.'\n               r'*gmock.*actions\\.h.*error: void value not ignored)'\n               r'|(error: control reaches end of non-void function)')\n  clang_regex1 = (_CLANG_FILE_LINE_RE +\n                  r'error: cannot initialize return object '\n                  r'of type \\'Result\\' \\(aka \\'(?P<return_type>.*)\\'\\) '\n                  r'with an rvalue of type \\'void\\'')\n  clang_regex2 = (_CLANG_FILE_LINE_RE +\n                  r'error: cannot initialize return object '\n                  r'of type \\'(?P<return_type>.*)\\' '\n                  r'with an rvalue of type \\'void\\'')\n  diagnosis = \"\"\"\nYou are using an action that returns void, but it needs to return\n%(return_type)s.  Please tell it *what* to return.  Perhaps you can use\nthe pattern DoAll(some_action, Return(some_value))?\"\"\"\n  return _GenericDiagnoser(\n      'NRS',\n      'Need to Return Something',\n      [(gcc_regex, diagnosis % {'return_type': '*something*'}),\n       (clang_regex1, diagnosis),\n       (clang_regex2, diagnosis)],\n      msg)\n\n\ndef _NeedToReturnNothingDiagnoser(msg):\n  \"\"\"Diagnoses the NRN disease, given the error messages by the compiler.\"\"\"\n\n  gcc_regex = (_GCC_FILE_LINE_RE + r'instantiated from here\\n'\n               r'.*gmock-actions\\.h.*error: instantiation of '\n               r'\\'testing::internal::ReturnAction<R>::Impl<F>::value_\\' '\n               r'as type \\'void\\'')\n  clang_regex1 = (r'error: field has incomplete type '\n                  r'\\'Result\\' \\(aka \\'void\\'\\)(\\r)?\\n'\n                  r'(.*\\n)*?' +\n                  _CLANG_NON_GMOCK_FILE_LINE_RE + r'note: in instantiation '\n                  r'of function template specialization '\n                  r'\\'testing::internal::ReturnAction<(?P<return_type>.*)>'\n                  r'::operator Action<void \\(.*\\)>\\' requested here')\n  clang_regex2 = (r'error: field has incomplete type '\n                  r'\\'Result\\' \\(aka \\'void\\'\\)(\\r)?\\n'\n                  r'(.*\\n)*?' +\n                  _CLANG_NON_GMOCK_FILE_LINE_RE + r'note: in instantiation '\n                  r'of function template specialization '\n                  r'\\'testing::internal::DoBothAction<.*>'\n                  r'::operator Action<(?P<return_type>.*) \\(.*\\)>\\' '\n                  r'requested here')\n  diagnosis = \"\"\"\nYou are using an action that returns %(return_type)s, but it needs to return\nvoid.  Please use a void-returning action instead.\n\nAll actions but the last in DoAll(...) must return void.  Perhaps you need\nto re-arrange the order of actions in a DoAll(), if you are using one?\"\"\"\n  return _GenericDiagnoser(\n      'NRN',\n      'Need to Return Nothing',\n      [(gcc_regex, diagnosis % {'return_type': '*something*'}),\n       (clang_regex1, diagnosis),\n       (clang_regex2, diagnosis)],\n      msg)\n\n\ndef _IncompleteByReferenceArgumentDiagnoser(msg):\n  \"\"\"Diagnoses the IBRA disease, given the error messages by the compiler.\"\"\"\n\n  gcc_regex = (_GCC_FILE_LINE_RE + r'instantiated from here\\n'\n               r'.*gtest-printers\\.h.*error: invalid application of '\n               r'\\'sizeof\\' to incomplete type \\'(?P<type>.*)\\'')\n\n  clang_regex = (r'.*gtest-printers\\.h.*error: invalid application of '\n                 r'\\'sizeof\\' to an incomplete type '\n                 r'\\'(?P<type>.*)( const)?\\'\\r?\\n'\n                 r'(.*\\n)*?' +\n                 _CLANG_NON_GMOCK_FILE_LINE_RE +\n                 r'note: in instantiation of member function '\n                 r'\\'testing::internal2::TypeWithoutFormatter<.*>::'\n                 r'PrintValue\\' requested here')\n  diagnosis = \"\"\"\nIn order to mock this function, Google Mock needs to see the definition\nof type \"%(type)s\" - declaration alone is not enough.  Either #include\nthe header that defines it, or change the argument to be passed\nby pointer.\"\"\"\n\n  return _GenericDiagnoser('IBRA', 'Incomplete By-Reference Argument Type',\n                           [(gcc_regex, diagnosis),\n                            (clang_regex, diagnosis)],\n                           msg)\n\n\ndef _OverloadedFunctionMatcherDiagnoser(msg):\n  \"\"\"Diagnoses the OFM disease, given the error messages by the compiler.\"\"\"\n\n  gcc_regex = (_GCC_FILE_LINE_RE + r'error: no matching function for '\n               r'call to \\'Truly\\(<unresolved overloaded function type>\\)')\n  clang_regex = (_CLANG_FILE_LINE_RE + r'error: no matching function for '\n                 r'call to \\'Truly')\n  diagnosis = \"\"\"\nThe argument you gave to Truly() is an overloaded function.  Please tell\nyour compiler which overloaded version you want to use.\n\nFor example, if you want to use the version whose signature is\n  bool Foo(int n);\nyou should write\n  Truly(static_cast<bool (*)(int n)>(Foo))\"\"\"\n  return _GenericDiagnoser('OFM', 'Overloaded Function Matcher',\n                           [(gcc_regex, diagnosis),\n                            (clang_regex, diagnosis)],\n                           msg)\n\n\ndef _OverloadedFunctionActionDiagnoser(msg):\n  \"\"\"Diagnoses the OFA disease, given the error messages by the compiler.\"\"\"\n\n  gcc_regex = (_GCC_FILE_LINE_RE + r'error: no matching function for call to '\n               r'\\'Invoke\\(<unresolved overloaded function type>')\n  clang_regex = (_CLANG_FILE_LINE_RE + r'error: no matching '\n                 r'function for call to \\'Invoke\\'\\r?\\n'\n                 r'(.*\\n)*?'\n                 r'.*\\bgmock-generated-actions\\.h:\\d+:\\d+:\\s+'\n                 r'note: candidate template ignored:\\s+'\n                 r'couldn\\'t infer template argument \\'FunctionImpl\\'')\n  diagnosis = \"\"\"\nFunction you are passing to Invoke is overloaded.  Please tell your compiler\nwhich overloaded version you want to use.\n\nFor example, if you want to use the version whose signature is\n  bool MyFunction(int n, double x);\nyou should write something like\n  Invoke(static_cast<bool (*)(int n, double x)>(MyFunction))\"\"\"\n  return _GenericDiagnoser('OFA', 'Overloaded Function Action',\n                           [(gcc_regex, diagnosis),\n                            (clang_regex, diagnosis)],\n                           msg)\n\n\ndef _OverloadedMethodActionDiagnoser(msg):\n  \"\"\"Diagnoses the OMA disease, given the error messages by the compiler.\"\"\"\n\n  gcc_regex = (_GCC_FILE_LINE_RE + r'error: no matching function for '\n               r'call to \\'Invoke\\(.+, <unresolved overloaded function '\n               r'type>\\)')\n  clang_regex = (_CLANG_FILE_LINE_RE + r'error: no matching function '\n                 r'for call to \\'Invoke\\'\\r?\\n'\n                 r'(.*\\n)*?'\n                 r'.*\\bgmock-generated-actions\\.h:\\d+:\\d+: '\n                 r'note: candidate function template not viable: '\n                 r'requires .*, but 2 (arguments )?were provided')\n  diagnosis = \"\"\"\nThe second argument you gave to Invoke() is an overloaded method.  Please\ntell your compiler which overloaded version you want to use.\n\nFor example, if you want to use the version whose signature is\n  class Foo {\n    ...\n    bool Bar(int n, double x);\n  };\nyou should write something like\n  Invoke(foo, static_cast<bool (Foo::*)(int n, double x)>(&Foo::Bar))\"\"\"\n  return _GenericDiagnoser('OMA', 'Overloaded Method Action',\n                           [(gcc_regex, diagnosis),\n                            (clang_regex, diagnosis)],\n                           msg)\n\n\ndef _MockObjectPointerDiagnoser(msg):\n  \"\"\"Diagnoses the MOP disease, given the error messages by the compiler.\"\"\"\n\n  gcc_regex = (_GCC_FILE_LINE_RE + r'error: request for member '\n               r'\\'gmock_(?P<method>.+)\\' in \\'(?P<mock_object>.+)\\', '\n               r'which is of non-class type \\'(.*::)*(?P<class_name>.+)\\*\\'')\n  clang_regex = (_CLANG_FILE_LINE_RE + r'error: member reference type '\n                 r'\\'(?P<class_name>.*?) *\\' is a pointer; '\n                 r'(did you mean|maybe you meant) to use \\'->\\'\\?')\n  diagnosis = \"\"\"\nThe first argument to ON_CALL() and EXPECT_CALL() must be a mock *object*,\nnot a *pointer* to it.  Please write '*(%(mock_object)s)' instead of\n'%(mock_object)s' as your first argument.\n\nFor example, given the mock class:\n\n  class %(class_name)s : public ... {\n    ...\n    MOCK_METHOD0(%(method)s, ...);\n  };\n\nand the following mock instance:\n\n  %(class_name)s* mock_ptr = ...\n\nyou should use the EXPECT_CALL like this:\n\n  EXPECT_CALL(*mock_ptr, %(method)s(...));\"\"\"\n\n  return _GenericDiagnoser(\n      'MOP',\n      'Mock Object Pointer',\n      [(gcc_regex, diagnosis),\n       (clang_regex, diagnosis % {'mock_object': 'mock_object',\n                                  'method': 'method',\n                                  'class_name': '%(class_name)s'})],\n       msg)\n\n\ndef _NeedToUseSymbolDiagnoser(msg):\n  \"\"\"Diagnoses the NUS disease, given the error messages by the compiler.\"\"\"\n\n  gcc_regex = (_GCC_FILE_LINE_RE + r'error: \\'(?P<symbol>.+)\\' '\n               r'(was not declared in this scope|has not been declared)')\n  clang_regex = (_CLANG_FILE_LINE_RE +\n                 r'error: (use of undeclared identifier|unknown type name|'\n                 r'no template named) \\'(?P<symbol>[^\\']+)\\'')\n  diagnosis = \"\"\"\n'%(symbol)s' is defined by Google Mock in the testing namespace.\nDid you forget to write\n  using testing::%(symbol)s;\n?\"\"\"\n  for m in (list(_FindAllMatches(gcc_regex, msg)) +\n            list(_FindAllMatches(clang_regex, msg))):\n    symbol = m.groupdict()['symbol']\n    if symbol in _COMMON_GMOCK_SYMBOLS:\n      yield ('NUS', 'Need to Use Symbol', diagnosis % m.groupdict())\n\n\ndef _NeedToUseReturnNullDiagnoser(msg):\n  \"\"\"Diagnoses the NRNULL disease, given the error messages by the compiler.\"\"\"\n\n  gcc_regex = ('instantiated from \\'testing::internal::ReturnAction<R>'\n               '::operator testing::Action<Func>\\(\\) const.*\\n' +\n               _GCC_FILE_LINE_RE + r'instantiated from here\\n'\n               r'.*error: no matching function for call to \\'ImplicitCast_\\('\n               r'(:?long )?int&\\)')\n  clang_regex = (r'\\bgmock-actions.h:.* error: no matching function for '\n                 r'call to \\'ImplicitCast_\\'\\r?\\n'\n                 r'(.*\\n)*?' +\n                 _CLANG_NON_GMOCK_FILE_LINE_RE + r'note: in instantiation '\n                 r'of function template specialization '\n                 r'\\'testing::internal::ReturnAction<(int|long)>::operator '\n                 r'Action<(?P<type>.*)\\(\\)>\\' requested here')\n  diagnosis = \"\"\"\nYou are probably calling Return(NULL) and the compiler isn't sure how to turn\nNULL into %(type)s. Use ReturnNull() instead.\nNote: the line number may be off; please fix all instances of Return(NULL).\"\"\"\n  return _GenericDiagnoser(\n      'NRNULL', 'Need to use ReturnNull',\n      [(clang_regex, diagnosis),\n       (gcc_regex, diagnosis % {'type': 'the right type'})],\n      msg)\n\n\ndef _TypeInTemplatedBaseDiagnoser(msg):\n  \"\"\"Diagnoses the TTB disease, given the error messages by the compiler.\"\"\"\n\n  # This version works when the type is used as the mock function's return\n  # type.\n  gcc_4_3_1_regex_type_in_retval = (\n      r'In member function \\'int .*\\n' + _GCC_FILE_LINE_RE +\n      r'error: a function call cannot appear in a constant-expression')\n  gcc_4_4_0_regex_type_in_retval = (\n      r'error: a function call cannot appear in a constant-expression'\n      + _GCC_FILE_LINE_RE + r'error: template argument 1 is invalid\\n')\n  # This version works when the type is used as the mock function's sole\n  # parameter type.\n  gcc_regex_type_of_sole_param = (\n      _GCC_FILE_LINE_RE +\n      r'error: \\'(?P<type>.+)\\' was not declared in this scope\\n'\n      r'.*error: template argument 1 is invalid\\n')\n  # This version works when the type is used as a parameter of a mock\n  # function that has multiple parameters.\n  gcc_regex_type_of_a_param = (\n      r'error: expected `;\\' before \\'::\\' token\\n'\n      + _GCC_FILE_LINE_RE +\n      r'error: \\'(?P<type>.+)\\' was not declared in this scope\\n'\n      r'.*error: template argument 1 is invalid\\n'\n      r'.*error: \\'.+\\' was not declared in this scope')\n  clang_regex_type_of_retval_or_sole_param = (\n      _CLANG_FILE_LINE_RE +\n      r'error: use of undeclared identifier \\'(?P<type>.*)\\'\\n'\n      r'(.*\\n)*?'\n      r'(?P=file):(?P=line):\\d+: error: '\n      r'non-friend class member \\'Result\\' cannot have a qualified name'\n      )\n  clang_regex_type_of_a_param = (\n      _CLANG_FILE_LINE_RE +\n      r'error: C\\+\\+ requires a type specifier for all declarations\\n'\n      r'(.*\\n)*?'\n      r'(?P=file):(?P=line):(?P=column): error: '\n      r'C\\+\\+ requires a type specifier for all declarations'\n      )\n  clang_regex_unknown_type = (\n      _CLANG_FILE_LINE_RE +\n      r'error: unknown type name \\'(?P<type>[^\\']+)\\''\n      )\n\n  diagnosis = \"\"\"\nIn a mock class template, types or typedefs defined in the base class\ntemplate are *not* automatically visible.  This is how C++ works.  Before\nyou can use a type or typedef named %(type)s defined in base class Base<T>, you\nneed to make it visible.  One way to do it is:\n\n  typedef typename Base<T>::%(type)s %(type)s;\"\"\"\n\n  for diag in _GenericDiagnoser(\n      'TTB', 'Type in Template Base',\n      [(gcc_4_3_1_regex_type_in_retval, diagnosis % {'type': 'Foo'}),\n       (gcc_4_4_0_regex_type_in_retval, diagnosis % {'type': 'Foo'}),\n       (gcc_regex_type_of_sole_param, diagnosis),\n       (gcc_regex_type_of_a_param, diagnosis),\n       (clang_regex_type_of_retval_or_sole_param, diagnosis),\n       (clang_regex_type_of_a_param, diagnosis % {'type': 'Foo'})],\n      msg):\n    yield diag\n  # Avoid overlap with the NUS pattern.\n  for m in _FindAllMatches(clang_regex_unknown_type, msg):\n    type_ = m.groupdict()['type']\n    if type_ not in _COMMON_GMOCK_SYMBOLS:\n      yield ('TTB', 'Type in Template Base', diagnosis % m.groupdict())\n\n\ndef _WrongMockMethodMacroDiagnoser(msg):\n  \"\"\"Diagnoses the WMM disease, given the error messages by the compiler.\"\"\"\n\n  gcc_regex = (_GCC_FILE_LINE_RE +\n               r'.*this_method_does_not_take_(?P<wrong_args>\\d+)_argument.*\\n'\n               r'.*\\n'\n               r'.*candidates are.*FunctionMocker<[^>]+A(?P<args>\\d+)\\)>')\n  clang_regex = (_CLANG_NON_GMOCK_FILE_LINE_RE +\n                 r'error:.*array.*negative.*r?\\n'\n                 r'(.*\\n)*?'\n                 r'(?P=file):(?P=line):(?P=column): error: too few arguments '\n                 r'to function call, expected (?P<args>\\d+), '\n                 r'have (?P<wrong_args>\\d+)')\n  clang11_re = (_CLANG_NON_GMOCK_FILE_LINE_RE +\n                r'.*this_method_does_not_take_'\n                r'(?P<wrong_args>\\d+)_argument.*')\n  diagnosis = \"\"\"\nYou are using MOCK_METHOD%(wrong_args)s to define a mock method that has\n%(args)s arguments. Use MOCK_METHOD%(args)s (or MOCK_CONST_METHOD%(args)s,\nMOCK_METHOD%(args)s_T, MOCK_CONST_METHOD%(args)s_T as appropriate) instead.\"\"\"\n  return _GenericDiagnoser('WMM', 'Wrong MOCK_METHODn Macro',\n                           [(gcc_regex, diagnosis),\n                            (clang11_re, diagnosis % {'wrong_args': 'm',\n                                                      'args': 'n'}),\n                            (clang_regex, diagnosis)],\n                           msg)\n\n\ndef _WrongParenPositionDiagnoser(msg):\n  \"\"\"Diagnoses the WPP disease, given the error messages by the compiler.\"\"\"\n\n  gcc_regex = (_GCC_FILE_LINE_RE +\n               r'error:.*testing::internal::MockSpec<.* has no member named \\''\n               r'(?P<method>\\w+)\\'')\n  clang_regex = (_CLANG_NON_GMOCK_FILE_LINE_RE +\n                 r'error: no member named \\'(?P<method>\\w+)\\' in '\n                 r'\\'testing::internal::MockSpec<.*>\\'')\n  diagnosis = \"\"\"\nThe closing parenthesis of ON_CALL or EXPECT_CALL should be *before*\n\".%(method)s\".  For example, you should write:\n  EXPECT_CALL(my_mock, Foo(_)).%(method)s(...);\ninstead of:\n  EXPECT_CALL(my_mock, Foo(_).%(method)s(...));\"\"\"\n  return _GenericDiagnoser('WPP', 'Wrong Parenthesis Position',\n                           [(gcc_regex, diagnosis),\n                            (clang_regex, diagnosis)],\n                           msg)\n\n\n_DIAGNOSERS = [\n    _IncompleteByReferenceArgumentDiagnoser,\n    _MockObjectPointerDiagnoser,\n    _NeedToReturnNothingDiagnoser,\n    _NeedToReturnReferenceDiagnoser,\n    _NeedToReturnSomethingDiagnoser,\n    _NeedToUseReturnNullDiagnoser,\n    _NeedToUseSymbolDiagnoser,\n    _OverloadedFunctionActionDiagnoser,\n    _OverloadedFunctionMatcherDiagnoser,\n    _OverloadedMethodActionDiagnoser,\n    _TypeInTemplatedBaseDiagnoser,\n    _WrongMockMethodMacroDiagnoser,\n    _WrongParenPositionDiagnoser,\n    ]\n\n\ndef Diagnose(msg):\n  \"\"\"Generates all possible diagnoses given the compiler error message.\"\"\"\n\n  msg = re.sub(r'\\x1b\\[[^m]*m', '', msg)  # Strips all color formatting.\n  # Assuming the string is using the UTF-8 encoding, replaces the left and\n  # the right single quote characters with apostrophes.\n  msg = re.sub(r'(\\xe2\\x80\\x98|\\xe2\\x80\\x99)', \"'\", msg)\n\n  diagnoses = []\n  for diagnoser in _DIAGNOSERS:\n    for diag in diagnoser(msg):\n      diagnosis = '[%s - %s]\\n%s' % diag\n      if not diagnosis in diagnoses:\n        diagnoses.append(diagnosis)\n  return diagnoses\n\n\ndef main():\n  print ('Google Mock Doctor v%s - '\n         'diagnoses problems in code using Google Mock.' % _VERSION)\n\n  if sys.stdin.isatty():\n    print ('Please copy and paste the compiler errors here.  Press c-D when '\n           'you are done:')\n  else:\n    print ('Waiting for compiler errors on stdin . . .')\n\n  msg = sys.stdin.read().strip()\n  diagnoses = Diagnose(msg)\n  count = len(diagnoses)\n  if not count:\n    print (\"\"\"\nYour compiler complained:\n8<------------------------------------------------------------\n%s\n------------------------------------------------------------>8\n\nUh-oh, I'm not smart enough to figure out what the problem is. :-(\nHowever...\nIf you send your source code and the compiler's error messages to\n%s, you can be helped and I can get smarter --\nwin-win for us!\"\"\" % (msg, _EMAIL))\n  else:\n    print ('------------------------------------------------------------')\n    print ('Your code appears to have the following',)\n    if count > 1:\n      print ('%s diseases:' % (count,))\n    else:\n      print ('disease:')\n    i = 0\n    for d in diagnoses:\n      i += 1\n      if count > 1:\n        print ('\\n#%s:' % (i,))\n      print (d)\n    print (\"\"\"\nHow did I do?  If you think I'm wrong or unhelpful, please send your\nsource code and the compiler's error messages to %s.\nThen you can be helped and I can get smarter -- I promise I won't be upset!\"\"\" %\n           _EMAIL)\n\n\nif __name__ == '__main__':\n  main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/scripts/upload.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2007 Google Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\"\"\"Tool for uploading diffs from a version control system to the codereview app.\n\nUsage summary: upload.py [options] [-- diff_options]\n\nDiff options are passed to the diff command of the underlying system.\n\nSupported version control systems:\n  Git\n  Mercurial\n  Subversion\n\nIt is important for Git/Mercurial users to specify a tree/node/branch to diff\nagainst by using the '--rev' option.\n\"\"\"\n# This code is derived from appcfg.py in the App Engine SDK (open source),\n# and from ASPN recipe #146306.\n\nimport cookielib\nimport getpass\nimport logging\nimport md5\nimport mimetypes\nimport optparse\nimport os\nimport re\nimport socket\nimport subprocess\nimport sys\nimport urllib\nimport urllib2\nimport urlparse\n\ntry:\n  import readline\nexcept ImportError:\n  pass\n\n# The logging verbosity:\n#  0: Errors only.\n#  1: Status messages.\n#  2: Info logs.\n#  3: Debug logs.\nverbosity = 1\n\n# Max size of patch or base file.\nMAX_UPLOAD_SIZE = 900 * 1024\n\n\ndef GetEmail(prompt):\n  \"\"\"Prompts the user for their email address and returns it.\n\n  The last used email address is saved to a file and offered up as a suggestion\n  to the user. If the user presses enter without typing in anything the last\n  used email address is used. If the user enters a new address, it is saved\n  for next time we prompt.\n\n  \"\"\"\n  last_email_file_name = os.path.expanduser(\"~/.last_codereview_email_address\")\n  last_email = \"\"\n  if os.path.exists(last_email_file_name):\n    try:\n      last_email_file = open(last_email_file_name, \"r\")\n      last_email = last_email_file.readline().strip(\"\\n\")\n      last_email_file.close()\n      prompt += \" [%s]\" % last_email\n    except IOError, e:\n      pass\n  email = raw_input(prompt + \": \").strip()\n  if email:\n    try:\n      last_email_file = open(last_email_file_name, \"w\")\n      last_email_file.write(email)\n      last_email_file.close()\n    except IOError, e:\n      pass\n  else:\n    email = last_email\n  return email\n\n\ndef StatusUpdate(msg):\n  \"\"\"Print a status message to stdout.\n\n  If 'verbosity' is greater than 0, print the message.\n\n  Args:\n    msg: The string to print.\n  \"\"\"\n  if verbosity > 0:\n    print msg\n\n\ndef ErrorExit(msg):\n  \"\"\"Print an error message to stderr and exit.\"\"\"\n  print >>sys.stderr, msg\n  sys.exit(1)\n\n\nclass ClientLoginError(urllib2.HTTPError):\n  \"\"\"Raised to indicate there was an error authenticating with ClientLogin.\"\"\"\n\n  def __init__(self, url, code, msg, headers, args):\n    urllib2.HTTPError.__init__(self, url, code, msg, headers, None)\n    self.args = args\n    self.reason = args[\"Error\"]\n\n\nclass AbstractRpcServer(object):\n  \"\"\"Provides a common interface for a simple RPC server.\"\"\"\n\n  def __init__(self, host, auth_function, host_override=None, extra_headers={},\n               save_cookies=False):\n    \"\"\"Creates a new HttpRpcServer.\n\n    Args:\n      host: The host to send requests to.\n      auth_function: A function that takes no arguments and returns an\n        (email, password) tuple when called. Will be called if authentication\n        is required.\n      host_override: The host header to send to the server (defaults to host).\n      extra_headers: A dict of extra headers to append to every request.\n      save_cookies: If True, save the authentication cookies to local disk.\n        If False, use an in-memory cookiejar instead.  Subclasses must\n        implement this functionality.  Defaults to False.\n    \"\"\"\n    self.host = host\n    self.host_override = host_override\n    self.auth_function = auth_function\n    self.authenticated = False\n    self.extra_headers = extra_headers\n    self.save_cookies = save_cookies\n    self.opener = self._GetOpener()\n    if self.host_override:\n      logging.info(\"Server: %s; Host: %s\", self.host, self.host_override)\n    else:\n      logging.info(\"Server: %s\", self.host)\n\n  def _GetOpener(self):\n    \"\"\"Returns an OpenerDirector for making HTTP requests.\n\n    Returns:\n      A urllib2.OpenerDirector object.\n    \"\"\"\n    raise NotImplementedError()\n\n  def _CreateRequest(self, url, data=None):\n    \"\"\"Creates a new urllib request.\"\"\"\n    logging.debug(\"Creating request for: '%s' with payload:\\n%s\", url, data)\n    req = urllib2.Request(url, data=data)\n    if self.host_override:\n      req.add_header(\"Host\", self.host_override)\n    for key, value in self.extra_headers.iteritems():\n      req.add_header(key, value)\n    return req\n\n  def _GetAuthToken(self, email, password):\n    \"\"\"Uses ClientLogin to authenticate the user, returning an auth token.\n\n    Args:\n      email:    The user's email address\n      password: The user's password\n\n    Raises:\n      ClientLoginError: If there was an error authenticating with ClientLogin.\n      HTTPError: If there was some other form of HTTP error.\n\n    Returns:\n      The authentication token returned by ClientLogin.\n    \"\"\"\n    account_type = \"GOOGLE\"\n    if self.host.endswith(\".google.com\"):\n      # Needed for use inside Google.\n      account_type = \"HOSTED\"\n    req = self._CreateRequest(\n        url=\"https://www.google.com/accounts/ClientLogin\",\n        data=urllib.urlencode({\n            \"Email\": email,\n            \"Passwd\": password,\n            \"service\": \"ah\",\n            \"source\": \"rietveld-codereview-upload\",\n            \"accountType\": account_type,\n        }),\n    )\n    try:\n      response = self.opener.open(req)\n      response_body = response.read()\n      response_dict = dict(x.split(\"=\")\n                           for x in response_body.split(\"\\n\") if x)\n      return response_dict[\"Auth\"]\n    except urllib2.HTTPError, e:\n      if e.code == 403:\n        body = e.read()\n        response_dict = dict(x.split(\"=\", 1) for x in body.split(\"\\n\") if x)\n        raise ClientLoginError(req.get_full_url(), e.code, e.msg,\n                               e.headers, response_dict)\n      else:\n        raise\n\n  def _GetAuthCookie(self, auth_token):\n    \"\"\"Fetches authentication cookies for an authentication token.\n\n    Args:\n      auth_token: The authentication token returned by ClientLogin.\n\n    Raises:\n      HTTPError: If there was an error fetching the authentication cookies.\n    \"\"\"\n    # This is a dummy value to allow us to identify when we're successful.\n    continue_location = \"http://localhost/\"\n    args = {\"continue\": continue_location, \"auth\": auth_token}\n    req = self._CreateRequest(\"http://%s/_ah/login?%s\" %\n                              (self.host, urllib.urlencode(args)))\n    try:\n      response = self.opener.open(req)\n    except urllib2.HTTPError, e:\n      response = e\n    if (response.code != 302 or\n        response.info()[\"location\"] != continue_location):\n      raise urllib2.HTTPError(req.get_full_url(), response.code, response.msg,\n                              response.headers, response.fp)\n    self.authenticated = True\n\n  def _Authenticate(self):\n    \"\"\"Authenticates the user.\n\n    The authentication process works as follows:\n     1) We get a username and password from the user\n     2) We use ClientLogin to obtain an AUTH token for the user\n        (see https://developers.google.com/identity/protocols/AuthForInstalledApps).\n     3) We pass the auth token to /_ah/login on the server to obtain an\n        authentication cookie. If login was successful, it tries to redirect\n        us to the URL we provided.\n\n    If we attempt to access the upload API without first obtaining an\n    authentication cookie, it returns a 401 response and directs us to\n    authenticate ourselves with ClientLogin.\n    \"\"\"\n    for i in range(3):\n      credentials = self.auth_function()\n      try:\n        auth_token = self._GetAuthToken(credentials[0], credentials[1])\n      except ClientLoginError, e:\n        if e.reason == \"BadAuthentication\":\n          print >>sys.stderr, \"Invalid username or password.\"\n          continue\n        if e.reason == \"CaptchaRequired\":\n          print >>sys.stderr, (\n              \"Please go to\\n\"\n              \"https://www.google.com/accounts/DisplayUnlockCaptcha\\n\"\n              \"and verify you are a human.  Then try again.\")\n          break\n        if e.reason == \"NotVerified\":\n          print >>sys.stderr, \"Account not verified.\"\n          break\n        if e.reason == \"TermsNotAgreed\":\n          print >>sys.stderr, \"User has not agreed to TOS.\"\n          break\n        if e.reason == \"AccountDeleted\":\n          print >>sys.stderr, \"The user account has been deleted.\"\n          break\n        if e.reason == \"AccountDisabled\":\n          print >>sys.stderr, \"The user account has been disabled.\"\n          break\n        if e.reason == \"ServiceDisabled\":\n          print >>sys.stderr, (\"The user's access to the service has been \"\n                               \"disabled.\")\n          break\n        if e.reason == \"ServiceUnavailable\":\n          print >>sys.stderr, \"The service is not available; try again later.\"\n          break\n        raise\n      self._GetAuthCookie(auth_token)\n      return\n\n  def Send(self, request_path, payload=None,\n           content_type=\"application/octet-stream\",\n           timeout=None,\n           **kwargs):\n    \"\"\"Sends an RPC and returns the response.\n\n    Args:\n      request_path: The path to send the request to, eg /api/appversion/create.\n      payload: The body of the request, or None to send an empty request.\n      content_type: The Content-Type header to use.\n      timeout: timeout in seconds; default None i.e. no timeout.\n        (Note: for large requests on OS X, the timeout doesn't work right.)\n      kwargs: Any keyword arguments are converted into query string parameters.\n\n    Returns:\n      The response body, as a string.\n    \"\"\"\n    # TODO: Don't require authentication.  Let the server say\n    # whether it is necessary.\n    if not self.authenticated:\n      self._Authenticate()\n\n    old_timeout = socket.getdefaulttimeout()\n    socket.setdefaulttimeout(timeout)\n    try:\n      tries = 0\n      while True:\n        tries += 1\n        args = dict(kwargs)\n        url = \"http://%s%s\" % (self.host, request_path)\n        if args:\n          url += \"?\" + urllib.urlencode(args)\n        req = self._CreateRequest(url=url, data=payload)\n        req.add_header(\"Content-Type\", content_type)\n        try:\n          f = self.opener.open(req)\n          response = f.read()\n          f.close()\n          return response\n        except urllib2.HTTPError, e:\n          if tries > 3:\n            raise\n          elif e.code == 401:\n            self._Authenticate()\n##           elif e.code >= 500 and e.code < 600:\n##             # Server Error - try again.\n##             continue\n          else:\n            raise\n    finally:\n      socket.setdefaulttimeout(old_timeout)\n\n\nclass HttpRpcServer(AbstractRpcServer):\n  \"\"\"Provides a simplified RPC-style interface for HTTP requests.\"\"\"\n\n  def _Authenticate(self):\n    \"\"\"Save the cookie jar after authentication.\"\"\"\n    super(HttpRpcServer, self)._Authenticate()\n    if self.save_cookies:\n      StatusUpdate(\"Saving authentication cookies to %s\" % self.cookie_file)\n      self.cookie_jar.save()\n\n  def _GetOpener(self):\n    \"\"\"Returns an OpenerDirector that supports cookies and ignores redirects.\n\n    Returns:\n      A urllib2.OpenerDirector object.\n    \"\"\"\n    opener = urllib2.OpenerDirector()\n    opener.add_handler(urllib2.ProxyHandler())\n    opener.add_handler(urllib2.UnknownHandler())\n    opener.add_handler(urllib2.HTTPHandler())\n    opener.add_handler(urllib2.HTTPDefaultErrorHandler())\n    opener.add_handler(urllib2.HTTPSHandler())\n    opener.add_handler(urllib2.HTTPErrorProcessor())\n    if self.save_cookies:\n      self.cookie_file = os.path.expanduser(\"~/.codereview_upload_cookies\")\n      self.cookie_jar = cookielib.MozillaCookieJar(self.cookie_file)\n      if os.path.exists(self.cookie_file):\n        try:\n          self.cookie_jar.load()\n          self.authenticated = True\n          StatusUpdate(\"Loaded authentication cookies from %s\" %\n                       self.cookie_file)\n        except (cookielib.LoadError, IOError):\n          # Failed to load cookies - just ignore them.\n          pass\n      else:\n        # Create an empty cookie file with mode 600\n        fd = os.open(self.cookie_file, os.O_CREAT, 0600)\n        os.close(fd)\n      # Always chmod the cookie file\n      os.chmod(self.cookie_file, 0600)\n    else:\n      # Don't save cookies across runs of update.py.\n      self.cookie_jar = cookielib.CookieJar()\n    opener.add_handler(urllib2.HTTPCookieProcessor(self.cookie_jar))\n    return opener\n\n\nparser = optparse.OptionParser(usage=\"%prog [options] [-- diff_options]\")\nparser.add_option(\"-y\", \"--assume_yes\", action=\"store_true\",\n                  dest=\"assume_yes\", default=False,\n                  help=\"Assume that the answer to yes/no questions is 'yes'.\")\n# Logging\ngroup = parser.add_option_group(\"Logging options\")\ngroup.add_option(\"-q\", \"--quiet\", action=\"store_const\", const=0,\n                 dest=\"verbose\", help=\"Print errors only.\")\ngroup.add_option(\"-v\", \"--verbose\", action=\"store_const\", const=2,\n                 dest=\"verbose\", default=1,\n                 help=\"Print info level logs (default).\")\ngroup.add_option(\"--noisy\", action=\"store_const\", const=3,\n                 dest=\"verbose\", help=\"Print all logs.\")\n# Review server\ngroup = parser.add_option_group(\"Review server options\")\ngroup.add_option(\"-s\", \"--server\", action=\"store\", dest=\"server\",\n                 default=\"codereview.appspot.com\",\n                 metavar=\"SERVER\",\n                 help=(\"The server to upload to. The format is host[:port]. \"\n                       \"Defaults to 'codereview.appspot.com'.\"))\ngroup.add_option(\"-e\", \"--email\", action=\"store\", dest=\"email\",\n                 metavar=\"EMAIL\", default=None,\n                 help=\"The username to use. Will prompt if omitted.\")\ngroup.add_option(\"-H\", \"--host\", action=\"store\", dest=\"host\",\n                 metavar=\"HOST\", default=None,\n                 help=\"Overrides the Host header sent with all RPCs.\")\ngroup.add_option(\"--no_cookies\", action=\"store_false\",\n                 dest=\"save_cookies\", default=True,\n                 help=\"Do not save authentication cookies to local disk.\")\n# Issue\ngroup = parser.add_option_group(\"Issue options\")\ngroup.add_option(\"-d\", \"--description\", action=\"store\", dest=\"description\",\n                 metavar=\"DESCRIPTION\", default=None,\n                 help=\"Optional description when creating an issue.\")\ngroup.add_option(\"-f\", \"--description_file\", action=\"store\",\n                 dest=\"description_file\", metavar=\"DESCRIPTION_FILE\",\n                 default=None,\n                 help=\"Optional path of a file that contains \"\n                      \"the description when creating an issue.\")\ngroup.add_option(\"-r\", \"--reviewers\", action=\"store\", dest=\"reviewers\",\n                 metavar=\"REVIEWERS\", default=None,\n                 help=\"Add reviewers (comma separated email addresses).\")\ngroup.add_option(\"--cc\", action=\"store\", dest=\"cc\",\n                 metavar=\"CC\", default=None,\n                 help=\"Add CC (comma separated email addresses).\")\n# Upload options\ngroup = parser.add_option_group(\"Patch options\")\ngroup.add_option(\"-m\", \"--message\", action=\"store\", dest=\"message\",\n                 metavar=\"MESSAGE\", default=None,\n                 help=\"A message to identify the patch. \"\n                      \"Will prompt if omitted.\")\ngroup.add_option(\"-i\", \"--issue\", type=\"int\", action=\"store\",\n                 metavar=\"ISSUE\", default=None,\n                 help=\"Issue number to which to add. Defaults to new issue.\")\ngroup.add_option(\"--download_base\", action=\"store_true\",\n                 dest=\"download_base\", default=False,\n                 help=\"Base files will be downloaded by the server \"\n                 \"(side-by-side diffs may not work on files with CRs).\")\ngroup.add_option(\"--rev\", action=\"store\", dest=\"revision\",\n                 metavar=\"REV\", default=None,\n                 help=\"Branch/tree/revision to diff against (used by DVCS).\")\ngroup.add_option(\"--send_mail\", action=\"store_true\",\n                 dest=\"send_mail\", default=False,\n                 help=\"Send notification email to reviewers.\")\n\n\ndef GetRpcServer(options):\n  \"\"\"Returns an instance of an AbstractRpcServer.\n\n  Returns:\n    A new AbstractRpcServer, on which RPC calls can be made.\n  \"\"\"\n\n  rpc_server_class = HttpRpcServer\n\n  def GetUserCredentials():\n    \"\"\"Prompts the user for a username and password.\"\"\"\n    email = options.email\n    if email is None:\n      email = GetEmail(\"Email (login for uploading to %s)\" % options.server)\n    password = getpass.getpass(\"Password for %s: \" % email)\n    return (email, password)\n\n  # If this is the dev_appserver, use fake authentication.\n  host = (options.host or options.server).lower()\n  if host == \"localhost\" or host.startswith(\"localhost:\"):\n    email = options.email\n    if email is None:\n      email = \"test@example.com\"\n      logging.info(\"Using debug user %s.  Override with --email\" % email)\n    server = rpc_server_class(\n        options.server,\n        lambda: (email, \"password\"),\n        host_override=options.host,\n        extra_headers={\"Cookie\":\n                       'dev_appserver_login=\"%s:False\"' % email},\n        save_cookies=options.save_cookies)\n    # Don't try to talk to ClientLogin.\n    server.authenticated = True\n    return server\n\n  return rpc_server_class(options.server, GetUserCredentials,\n                          host_override=options.host,\n                          save_cookies=options.save_cookies)\n\n\ndef EncodeMultipartFormData(fields, files):\n  \"\"\"Encode form fields for multipart/form-data.\n\n  Args:\n    fields: A sequence of (name, value) elements for regular form fields.\n    files: A sequence of (name, filename, value) elements for data to be\n           uploaded as files.\n  Returns:\n    (content_type, body) ready for httplib.HTTP instance.\n\n  Source:\n    https://web.archive.org/web/20160116052001/code.activestate.com/recipes/146306\n  \"\"\"\n  BOUNDARY = '-M-A-G-I-C---B-O-U-N-D-A-R-Y-'\n  CRLF = '\\r\\n'\n  lines = []\n  for (key, value) in fields:\n    lines.append('--' + BOUNDARY)\n    lines.append('Content-Disposition: form-data; name=\"%s\"' % key)\n    lines.append('')\n    lines.append(value)\n  for (key, filename, value) in files:\n    lines.append('--' + BOUNDARY)\n    lines.append('Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"' %\n             (key, filename))\n    lines.append('Content-Type: %s' % GetContentType(filename))\n    lines.append('')\n    lines.append(value)\n  lines.append('--' + BOUNDARY + '--')\n  lines.append('')\n  body = CRLF.join(lines)\n  content_type = 'multipart/form-data; boundary=%s' % BOUNDARY\n  return content_type, body\n\n\ndef GetContentType(filename):\n  \"\"\"Helper to guess the content-type from the filename.\"\"\"\n  return mimetypes.guess_type(filename)[0] or 'application/octet-stream'\n\n\n# Use a shell for subcommands on Windows to get a PATH search.\nuse_shell = sys.platform.startswith(\"win\")\n\ndef RunShellWithReturnCode(command, print_output=False,\n                           universal_newlines=True):\n  \"\"\"Executes a command and returns the output from stdout and the return code.\n\n  Args:\n    command: Command to execute.\n    print_output: If True, the output is printed to stdout.\n                  If False, both stdout and stderr are ignored.\n    universal_newlines: Use universal_newlines flag (default: True).\n\n  Returns:\n    Tuple (output, return code)\n  \"\"\"\n  logging.info(\"Running %s\", command)\n  p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,\n                       shell=use_shell, universal_newlines=universal_newlines)\n  if print_output:\n    output_array = []\n    while True:\n      line = p.stdout.readline()\n      if not line:\n        break\n      print line.strip(\"\\n\")\n      output_array.append(line)\n    output = \"\".join(output_array)\n  else:\n    output = p.stdout.read()\n  p.wait()\n  errout = p.stderr.read()\n  if print_output and errout:\n    print >>sys.stderr, errout\n  p.stdout.close()\n  p.stderr.close()\n  return output, p.returncode\n\n\ndef RunShell(command, silent_ok=False, universal_newlines=True,\n             print_output=False):\n  data, retcode = RunShellWithReturnCode(command, print_output,\n                                         universal_newlines)\n  if retcode:\n    ErrorExit(\"Got error status from %s:\\n%s\" % (command, data))\n  if not silent_ok and not data:\n    ErrorExit(\"No output from %s\" % command)\n  return data\n\n\nclass VersionControlSystem(object):\n  \"\"\"Abstract base class providing an interface to the VCS.\"\"\"\n\n  def __init__(self, options):\n    \"\"\"Constructor.\n\n    Args:\n      options: Command line options.\n    \"\"\"\n    self.options = options\n\n  def GenerateDiff(self, args):\n    \"\"\"Return the current diff as a string.\n\n    Args:\n      args: Extra arguments to pass to the diff command.\n    \"\"\"\n    raise NotImplementedError(\n        \"abstract method -- subclass %s must override\" % self.__class__)\n\n  def GetUnknownFiles(self):\n    \"\"\"Return a list of files unknown to the VCS.\"\"\"\n    raise NotImplementedError(\n        \"abstract method -- subclass %s must override\" % self.__class__)\n\n  def CheckForUnknownFiles(self):\n    \"\"\"Show an \"are you sure?\" prompt if there are unknown files.\"\"\"\n    unknown_files = self.GetUnknownFiles()\n    if unknown_files:\n      print \"The following files are not added to version control:\"\n      for line in unknown_files:\n        print line\n      prompt = \"Are you sure to continue?(y/N) \"\n      answer = raw_input(prompt).strip()\n      if answer != \"y\":\n        ErrorExit(\"User aborted\")\n\n  def GetBaseFile(self, filename):\n    \"\"\"Get the content of the upstream version of a file.\n\n    Returns:\n      A tuple (base_content, new_content, is_binary, status)\n        base_content: The contents of the base file.\n        new_content: For text files, this is empty.  For binary files, this is\n          the contents of the new file, since the diff output won't contain\n          information to reconstruct the current file.\n        is_binary: True iff the file is binary.\n        status: The status of the file.\n    \"\"\"\n\n    raise NotImplementedError(\n        \"abstract method -- subclass %s must override\" % self.__class__)\n\n\n  def GetBaseFiles(self, diff):\n    \"\"\"Helper that calls GetBase file for each file in the patch.\n\n    Returns:\n      A dictionary that maps from filename to GetBaseFile's tuple.  Filenames\n      are retrieved based on lines that start with \"Index:\" or\n      \"Property changes on:\".\n    \"\"\"\n    files = {}\n    for line in diff.splitlines(True):\n      if line.startswith('Index:') or line.startswith('Property changes on:'):\n        unused, filename = line.split(':', 1)\n        # On Windows if a file has property changes its filename uses '\\'\n        # instead of '/'.\n        filename = filename.strip().replace('\\\\', '/')\n        files[filename] = self.GetBaseFile(filename)\n    return files\n\n\n  def UploadBaseFiles(self, issue, rpc_server, patch_list, patchset, options,\n                      files):\n    \"\"\"Uploads the base files (and if necessary, the current ones as well).\"\"\"\n\n    def UploadFile(filename, file_id, content, is_binary, status, is_base):\n      \"\"\"Uploads a file to the server.\"\"\"\n      file_too_large = False\n      if is_base:\n        type = \"base\"\n      else:\n        type = \"current\"\n      if len(content) > MAX_UPLOAD_SIZE:\n        print (\"Not uploading the %s file for %s because it's too large.\" %\n               (type, filename))\n        file_too_large = True\n        content = \"\"\n      checksum = md5.new(content).hexdigest()\n      if options.verbose > 0 and not file_too_large:\n        print \"Uploading %s file for %s\" % (type, filename)\n      url = \"/%d/upload_content/%d/%d\" % (int(issue), int(patchset), file_id)\n      form_fields = [(\"filename\", filename),\n                     (\"status\", status),\n                     (\"checksum\", checksum),\n                     (\"is_binary\", str(is_binary)),\n                     (\"is_current\", str(not is_base)),\n                    ]\n      if file_too_large:\n        form_fields.append((\"file_too_large\", \"1\"))\n      if options.email:\n        form_fields.append((\"user\", options.email))\n      ctype, body = EncodeMultipartFormData(form_fields,\n                                            [(\"data\", filename, content)])\n      response_body = rpc_server.Send(url, body,\n                                      content_type=ctype)\n      if not response_body.startswith(\"OK\"):\n        StatusUpdate(\"  --> %s\" % response_body)\n        sys.exit(1)\n\n    patches = dict()\n    [patches.setdefault(v, k) for k, v in patch_list]\n    for filename in patches.keys():\n      base_content, new_content, is_binary, status = files[filename]\n      file_id_str = patches.get(filename)\n      if file_id_str.find(\"nobase\") != -1:\n        base_content = None\n        file_id_str = file_id_str[file_id_str.rfind(\"_\") + 1:]\n      file_id = int(file_id_str)\n      if base_content != None:\n        UploadFile(filename, file_id, base_content, is_binary, status, True)\n      if new_content != None:\n        UploadFile(filename, file_id, new_content, is_binary, status, False)\n\n  def IsImage(self, filename):\n    \"\"\"Returns true if the filename has an image extension.\"\"\"\n    mimetype =  mimetypes.guess_type(filename)[0]\n    if not mimetype:\n      return False\n    return mimetype.startswith(\"image/\")\n\n\nclass SubversionVCS(VersionControlSystem):\n  \"\"\"Implementation of the VersionControlSystem interface for Subversion.\"\"\"\n\n  def __init__(self, options):\n    super(SubversionVCS, self).__init__(options)\n    if self.options.revision:\n      match = re.match(r\"(\\d+)(:(\\d+))?\", self.options.revision)\n      if not match:\n        ErrorExit(\"Invalid Subversion revision %s.\" % self.options.revision)\n      self.rev_start = match.group(1)\n      self.rev_end = match.group(3)\n    else:\n      self.rev_start = self.rev_end = None\n    # Cache output from \"svn list -r REVNO dirname\".\n    # Keys: dirname, Values: 2-tuple (ouput for start rev and end rev).\n    self.svnls_cache = {}\n    # SVN base URL is required to fetch files deleted in an older revision.\n    # Result is cached to not guess it over and over again in GetBaseFile().\n    required = self.options.download_base or self.options.revision is not None\n    self.svn_base = self._GuessBase(required)\n\n  def GuessBase(self, required):\n    \"\"\"Wrapper for _GuessBase.\"\"\"\n    return self.svn_base\n\n  def _GuessBase(self, required):\n    \"\"\"Returns the SVN base URL.\n\n    Args:\n      required: If true, exits if the url can't be guessed, otherwise None is\n        returned.\n    \"\"\"\n    info = RunShell([\"svn\", \"info\"])\n    for line in info.splitlines():\n      words = line.split()\n      if len(words) == 2 and words[0] == \"URL:\":\n        url = words[1]\n        scheme, netloc, path, params, query, fragment = urlparse.urlparse(url)\n        username, netloc = urllib.splituser(netloc)\n        if username:\n          logging.info(\"Removed username from base URL\")\n        if netloc.endswith(\"svn.python.org\"):\n          if netloc == \"svn.python.org\":\n            if path.startswith(\"/projects/\"):\n              path = path[9:]\n          elif netloc != \"pythondev@svn.python.org\":\n            ErrorExit(\"Unrecognized Python URL: %s\" % url)\n          base = \"http://svn.python.org/view/*checkout*%s/\" % path\n          logging.info(\"Guessed Python base = %s\", base)\n        elif netloc.endswith(\"svn.collab.net\"):\n          if path.startswith(\"/repos/\"):\n            path = path[6:]\n          base = \"http://svn.collab.net/viewvc/*checkout*%s/\" % path\n          logging.info(\"Guessed CollabNet base = %s\", base)\n        elif netloc.endswith(\".googlecode.com\"):\n          path = path + \"/\"\n          base = urlparse.urlunparse((\"http\", netloc, path, params,\n                                      query, fragment))\n          logging.info(\"Guessed Google Code base = %s\", base)\n        else:\n          path = path + \"/\"\n          base = urlparse.urlunparse((scheme, netloc, path, params,\n                                      query, fragment))\n          logging.info(\"Guessed base = %s\", base)\n        return base\n    if required:\n      ErrorExit(\"Can't find URL in output from svn info\")\n    return None\n\n  def GenerateDiff(self, args):\n    cmd = [\"svn\", \"diff\"]\n    if self.options.revision:\n      cmd += [\"-r\", self.options.revision]\n    cmd.extend(args)\n    data = RunShell(cmd)\n    count = 0\n    for line in data.splitlines():\n      if line.startswith(\"Index:\") or line.startswith(\"Property changes on:\"):\n        count += 1\n        logging.info(line)\n    if not count:\n      ErrorExit(\"No valid patches found in output from svn diff\")\n    return data\n\n  def _CollapseKeywords(self, content, keyword_str):\n    \"\"\"Collapses SVN keywords.\"\"\"\n    # svn cat translates keywords but svn diff doesn't. As a result of this\n    # behavior patching.PatchChunks() fails with a chunk mismatch error.\n    # This part was originally written by the Review Board development team\n    # who had the same problem (https://reviews.reviewboard.org/r/276/).\n    # Mapping of keywords to known aliases\n    svn_keywords = {\n      # Standard keywords\n      'Date':                ['Date', 'LastChangedDate'],\n      'Revision':            ['Revision', 'LastChangedRevision', 'Rev'],\n      'Author':              ['Author', 'LastChangedBy'],\n      'HeadURL':             ['HeadURL', 'URL'],\n      'Id':                  ['Id'],\n\n      # Aliases\n      'LastChangedDate':     ['LastChangedDate', 'Date'],\n      'LastChangedRevision': ['LastChangedRevision', 'Rev', 'Revision'],\n      'LastChangedBy':       ['LastChangedBy', 'Author'],\n      'URL':                 ['URL', 'HeadURL'],\n    }\n\n    def repl(m):\n       if m.group(2):\n         return \"$%s::%s$\" % (m.group(1), \" \" * len(m.group(3)))\n       return \"$%s$\" % m.group(1)\n    keywords = [keyword\n                for name in keyword_str.split(\" \")\n                for keyword in svn_keywords.get(name, [])]\n    return re.sub(r\"\\$(%s):(:?)([^\\$]+)\\$\" % '|'.join(keywords), repl, content)\n\n  def GetUnknownFiles(self):\n    status = RunShell([\"svn\", \"status\", \"--ignore-externals\"], silent_ok=True)\n    unknown_files = []\n    for line in status.split(\"\\n\"):\n      if line and line[0] == \"?\":\n        unknown_files.append(line)\n    return unknown_files\n\n  def ReadFile(self, filename):\n    \"\"\"Returns the contents of a file.\"\"\"\n    file = open(filename, 'rb')\n    result = \"\"\n    try:\n      result = file.read()\n    finally:\n      file.close()\n    return result\n\n  def GetStatus(self, filename):\n    \"\"\"Returns the status of a file.\"\"\"\n    if not self.options.revision:\n      status = RunShell([\"svn\", \"status\", \"--ignore-externals\", filename])\n      if not status:\n        ErrorExit(\"svn status returned no output for %s\" % filename)\n      status_lines = status.splitlines()\n      # If file is in a cl, the output will begin with\n      # \"\\n--- Changelist 'cl_name':\\n\".  See\n      # https://web.archive.org/web/20090918234815/svn.collab.net/repos/svn/trunk/notes/changelist-design.txt\n      if (len(status_lines) == 3 and\n          not status_lines[0] and\n          status_lines[1].startswith(\"--- Changelist\")):\n        status = status_lines[2]\n      else:\n        status = status_lines[0]\n    # If we have a revision to diff against we need to run \"svn list\"\n    # for the old and the new revision and compare the results to get\n    # the correct status for a file.\n    else:\n      dirname, relfilename = os.path.split(filename)\n      if dirname not in self.svnls_cache:\n        cmd = [\"svn\", \"list\", \"-r\", self.rev_start, dirname or \".\"]\n        out, returncode = RunShellWithReturnCode(cmd)\n        if returncode:\n          ErrorExit(\"Failed to get status for %s.\" % filename)\n        old_files = out.splitlines()\n        args = [\"svn\", \"list\"]\n        if self.rev_end:\n          args += [\"-r\", self.rev_end]\n        cmd = args + [dirname or \".\"]\n        out, returncode = RunShellWithReturnCode(cmd)\n        if returncode:\n          ErrorExit(\"Failed to run command %s\" % cmd)\n        self.svnls_cache[dirname] = (old_files, out.splitlines())\n      old_files, new_files = self.svnls_cache[dirname]\n      if relfilename in old_files and relfilename not in new_files:\n        status = \"D   \"\n      elif relfilename in old_files and relfilename in new_files:\n        status = \"M   \"\n      else:\n        status = \"A   \"\n    return status\n\n  def GetBaseFile(self, filename):\n    status = self.GetStatus(filename)\n    base_content = None\n    new_content = None\n\n    # If a file is copied its status will be \"A  +\", which signifies\n    # \"addition-with-history\".  See \"svn st\" for more information.  We need to\n    # upload the original file or else diff parsing will fail if the file was\n    # edited.\n    if status[0] == \"A\" and status[3] != \"+\":\n      # We'll need to upload the new content if we're adding a binary file\n      # since diff's output won't contain it.\n      mimetype = RunShell([\"svn\", \"propget\", \"svn:mime-type\", filename],\n                          silent_ok=True)\n      base_content = \"\"\n      is_binary = mimetype and not mimetype.startswith(\"text/\")\n      if is_binary and self.IsImage(filename):\n        new_content = self.ReadFile(filename)\n    elif (status[0] in (\"M\", \"D\", \"R\") or\n          (status[0] == \"A\" and status[3] == \"+\") or  # Copied file.\n          (status[0] == \" \" and status[1] == \"M\")):  # Property change.\n      args = []\n      if self.options.revision:\n        url = \"%s/%s@%s\" % (self.svn_base, filename, self.rev_start)\n      else:\n        # Don't change filename, it's needed later.\n        url = filename\n        args += [\"-r\", \"BASE\"]\n      cmd = [\"svn\"] + args + [\"propget\", \"svn:mime-type\", url]\n      mimetype, returncode = RunShellWithReturnCode(cmd)\n      if returncode:\n        # File does not exist in the requested revision.\n        # Reset mimetype, it contains an error message.\n        mimetype = \"\"\n      get_base = False\n      is_binary = mimetype and not mimetype.startswith(\"text/\")\n      if status[0] == \" \":\n        # Empty base content just to force an upload.\n        base_content = \"\"\n      elif is_binary:\n        if self.IsImage(filename):\n          get_base = True\n          if status[0] == \"M\":\n            if not self.rev_end:\n              new_content = self.ReadFile(filename)\n            else:\n              url = \"%s/%s@%s\" % (self.svn_base, filename, self.rev_end)\n              new_content = RunShell([\"svn\", \"cat\", url],\n                                     universal_newlines=True, silent_ok=True)\n        else:\n          base_content = \"\"\n      else:\n        get_base = True\n\n      if get_base:\n        if is_binary:\n          universal_newlines = False\n        else:\n          universal_newlines = True\n        if self.rev_start:\n          # \"svn cat -r REV delete_file.txt\" doesn't work. cat requires\n          # the full URL with \"@REV\" appended instead of using \"-r\" option.\n          url = \"%s/%s@%s\" % (self.svn_base, filename, self.rev_start)\n          base_content = RunShell([\"svn\", \"cat\", url],\n                                  universal_newlines=universal_newlines,\n                                  silent_ok=True)\n        else:\n          base_content = RunShell([\"svn\", \"cat\", filename],\n                                  universal_newlines=universal_newlines,\n                                  silent_ok=True)\n        if not is_binary:\n          args = []\n          if self.rev_start:\n            url = \"%s/%s@%s\" % (self.svn_base, filename, self.rev_start)\n          else:\n            url = filename\n            args += [\"-r\", \"BASE\"]\n          cmd = [\"svn\"] + args + [\"propget\", \"svn:keywords\", url]\n          keywords, returncode = RunShellWithReturnCode(cmd)\n          if keywords and not returncode:\n            base_content = self._CollapseKeywords(base_content, keywords)\n    else:\n      StatusUpdate(\"svn status returned unexpected output: %s\" % status)\n      sys.exit(1)\n    return base_content, new_content, is_binary, status[0:5]\n\n\nclass GitVCS(VersionControlSystem):\n  \"\"\"Implementation of the VersionControlSystem interface for Git.\"\"\"\n\n  def __init__(self, options):\n    super(GitVCS, self).__init__(options)\n    # Map of filename -> hash of base file.\n    self.base_hashes = {}\n\n  def GenerateDiff(self, extra_args):\n    # This is more complicated than svn's GenerateDiff because we must convert\n    # the diff output to include an svn-style \"Index:\" line as well as record\n    # the hashes of the base files, so we can upload them along with our diff.\n    if self.options.revision:\n      extra_args = [self.options.revision] + extra_args\n    gitdiff = RunShell([\"git\", \"diff\", \"--full-index\"] + extra_args)\n    svndiff = []\n    filecount = 0\n    filename = None\n    for line in gitdiff.splitlines():\n      match = re.match(r\"diff --git a/(.*) b/.*$\", line)\n      if match:\n        filecount += 1\n        filename = match.group(1)\n        svndiff.append(\"Index: %s\\n\" % filename)\n      else:\n        # The \"index\" line in a git diff looks like this (long hashes elided):\n        #   index 82c0d44..b2cee3f 100755\n        # We want to save the left hash, as that identifies the base file.\n        match = re.match(r\"index (\\w+)\\.\\.\", line)\n        if match:\n          self.base_hashes[filename] = match.group(1)\n      svndiff.append(line + \"\\n\")\n    if not filecount:\n      ErrorExit(\"No valid patches found in output from git diff\")\n    return \"\".join(svndiff)\n\n  def GetUnknownFiles(self):\n    status = RunShell([\"git\", \"ls-files\", \"--exclude-standard\", \"--others\"],\n                      silent_ok=True)\n    return status.splitlines()\n\n  def GetBaseFile(self, filename):\n    hash = self.base_hashes[filename]\n    base_content = None\n    new_content = None\n    is_binary = False\n    if hash == \"0\" * 40:  # All-zero hash indicates no base file.\n      status = \"A\"\n      base_content = \"\"\n    else:\n      status = \"M\"\n      base_content, returncode = RunShellWithReturnCode([\"git\", \"show\", hash])\n      if returncode:\n        ErrorExit(\"Got error status from 'git show %s'\" % hash)\n    return (base_content, new_content, is_binary, status)\n\n\nclass MercurialVCS(VersionControlSystem):\n  \"\"\"Implementation of the VersionControlSystem interface for Mercurial.\"\"\"\n\n  def __init__(self, options, repo_dir):\n    super(MercurialVCS, self).__init__(options)\n    # Absolute path to repository (we can be in a subdir)\n    self.repo_dir = os.path.normpath(repo_dir)\n    # Compute the subdir\n    cwd = os.path.normpath(os.getcwd())\n    assert cwd.startswith(self.repo_dir)\n    self.subdir = cwd[len(self.repo_dir):].lstrip(r\"\\/\")\n    if self.options.revision:\n      self.base_rev = self.options.revision\n    else:\n      self.base_rev = RunShell([\"hg\", \"parent\", \"-q\"]).split(':')[1].strip()\n\n  def _GetRelPath(self, filename):\n    \"\"\"Get relative path of a file according to the current directory,\n    given its logical path in the repo.\"\"\"\n    assert filename.startswith(self.subdir), filename\n    return filename[len(self.subdir):].lstrip(r\"\\/\")\n\n  def GenerateDiff(self, extra_args):\n    # If no file specified, restrict to the current subdir\n    extra_args = extra_args or [\".\"]\n    cmd = [\"hg\", \"diff\", \"--git\", \"-r\", self.base_rev] + extra_args\n    data = RunShell(cmd, silent_ok=True)\n    svndiff = []\n    filecount = 0\n    for line in data.splitlines():\n      m = re.match(\"diff --git a/(\\S+) b/(\\S+)\", line)\n      if m:\n        # Modify line to make it look like as it comes from svn diff.\n        # With this modification no changes on the server side are required\n        # to make upload.py work with Mercurial repos.\n        # NOTE: for proper handling of moved/copied files, we have to use\n        # the second filename.\n        filename = m.group(2)\n        svndiff.append(\"Index: %s\" % filename)\n        svndiff.append(\"=\" * 67)\n        filecount += 1\n        logging.info(line)\n      else:\n        svndiff.append(line)\n    if not filecount:\n      ErrorExit(\"No valid patches found in output from hg diff\")\n    return \"\\n\".join(svndiff) + \"\\n\"\n\n  def GetUnknownFiles(self):\n    \"\"\"Return a list of files unknown to the VCS.\"\"\"\n    args = []\n    status = RunShell([\"hg\", \"status\", \"--rev\", self.base_rev, \"-u\", \".\"],\n        silent_ok=True)\n    unknown_files = []\n    for line in status.splitlines():\n      st, fn = line.split(\" \", 1)\n      if st == \"?\":\n        unknown_files.append(fn)\n    return unknown_files\n\n  def GetBaseFile(self, filename):\n    # \"hg status\" and \"hg cat\" both take a path relative to the current subdir\n    # rather than to the repo root, but \"hg diff\" has given us the full path\n    # to the repo root.\n    base_content = \"\"\n    new_content = None\n    is_binary = False\n    oldrelpath = relpath = self._GetRelPath(filename)\n    # \"hg status -C\" returns two lines for moved/copied files, one otherwise\n    out = RunShell([\"hg\", \"status\", \"-C\", \"--rev\", self.base_rev, relpath])\n    out = out.splitlines()\n    # HACK: strip error message about missing file/directory if it isn't in\n    # the working copy\n    if out[0].startswith('%s: ' % relpath):\n      out = out[1:]\n    if len(out) > 1:\n      # Moved/copied => considered as modified, use old filename to\n      # retrieve base contents\n      oldrelpath = out[1].strip()\n      status = \"M\"\n    else:\n      status, _ = out[0].split(' ', 1)\n    if status != \"A\":\n      base_content = RunShell([\"hg\", \"cat\", \"-r\", self.base_rev, oldrelpath],\n        silent_ok=True)\n      is_binary = \"\\0\" in base_content  # Mercurial's heuristic\n    if status != \"R\":\n      new_content = open(relpath, \"rb\").read()\n      is_binary = is_binary or \"\\0\" in new_content\n    if is_binary and base_content:\n      # Fetch again without converting newlines\n      base_content = RunShell([\"hg\", \"cat\", \"-r\", self.base_rev, oldrelpath],\n        silent_ok=True, universal_newlines=False)\n    if not is_binary or not self.IsImage(relpath):\n      new_content = None\n    return base_content, new_content, is_binary, status\n\n\n# NOTE: The SplitPatch function is duplicated in engine.py, keep them in sync.\ndef SplitPatch(data):\n  \"\"\"Splits a patch into separate pieces for each file.\n\n  Args:\n    data: A string containing the output of svn diff.\n\n  Returns:\n    A list of 2-tuple (filename, text) where text is the svn diff output\n      pertaining to filename.\n  \"\"\"\n  patches = []\n  filename = None\n  diff = []\n  for line in data.splitlines(True):\n    new_filename = None\n    if line.startswith('Index:'):\n      unused, new_filename = line.split(':', 1)\n      new_filename = new_filename.strip()\n    elif line.startswith('Property changes on:'):\n      unused, temp_filename = line.split(':', 1)\n      # When a file is modified, paths use '/' between directories, however\n      # when a property is modified '\\' is used on Windows.  Make them the same\n      # otherwise the file shows up twice.\n      temp_filename = temp_filename.strip().replace('\\\\', '/')\n      if temp_filename != filename:\n        # File has property changes but no modifications, create a new diff.\n        new_filename = temp_filename\n    if new_filename:\n      if filename and diff:\n        patches.append((filename, ''.join(diff)))\n      filename = new_filename\n      diff = [line]\n      continue\n    if diff is not None:\n      diff.append(line)\n  if filename and diff:\n    patches.append((filename, ''.join(diff)))\n  return patches\n\n\ndef UploadSeparatePatches(issue, rpc_server, patchset, data, options):\n  \"\"\"Uploads a separate patch for each file in the diff output.\n\n  Returns a list of [patch_key, filename] for each file.\n  \"\"\"\n  patches = SplitPatch(data)\n  rv = []\n  for patch in patches:\n    if len(patch[1]) > MAX_UPLOAD_SIZE:\n      print (\"Not uploading the patch for \" + patch[0] +\n             \" because the file is too large.\")\n      continue\n    form_fields = [(\"filename\", patch[0])]\n    if not options.download_base:\n      form_fields.append((\"content_upload\", \"1\"))\n    files = [(\"data\", \"data.diff\", patch[1])]\n    ctype, body = EncodeMultipartFormData(form_fields, files)\n    url = \"/%d/upload_patch/%d\" % (int(issue), int(patchset))\n    print \"Uploading patch for \" + patch[0]\n    response_body = rpc_server.Send(url, body, content_type=ctype)\n    lines = response_body.splitlines()\n    if not lines or lines[0] != \"OK\":\n      StatusUpdate(\"  --> %s\" % response_body)\n      sys.exit(1)\n    rv.append([lines[1], patch[0]])\n  return rv\n\n\ndef GuessVCS(options):\n  \"\"\"Helper to guess the version control system.\n\n  This examines the current directory, guesses which VersionControlSystem\n  we're using, and returns an instance of the appropriate class.  Exit with an\n  error if we can't figure it out.\n\n  Returns:\n    A VersionControlSystem instance. Exits if the VCS can't be guessed.\n  \"\"\"\n  # Mercurial has a command to get the base directory of a repository\n  # Try running it, but don't die if we don't have hg installed.\n  # NOTE: we try Mercurial first as it can sit on top of an SVN working copy.\n  try:\n    out, returncode = RunShellWithReturnCode([\"hg\", \"root\"])\n    if returncode == 0:\n      return MercurialVCS(options, out.strip())\n  except OSError, (errno, message):\n    if errno != 2:  # ENOENT -- they don't have hg installed.\n      raise\n\n  # Subversion has a .svn in all working directories.\n  if os.path.isdir('.svn'):\n    logging.info(\"Guessed VCS = Subversion\")\n    return SubversionVCS(options)\n\n  # Git has a command to test if you're in a git tree.\n  # Try running it, but don't die if we don't have git installed.\n  try:\n    out, returncode = RunShellWithReturnCode([\"git\", \"rev-parse\",\n                                              \"--is-inside-work-tree\"])\n    if returncode == 0:\n      return GitVCS(options)\n  except OSError, (errno, message):\n    if errno != 2:  # ENOENT -- they don't have git installed.\n      raise\n\n  ErrorExit((\"Could not guess version control system. \"\n             \"Are you in a working copy directory?\"))\n\n\ndef RealMain(argv, data=None):\n  \"\"\"The real main function.\n\n  Args:\n    argv: Command line arguments.\n    data: Diff contents. If None (default) the diff is generated by\n      the VersionControlSystem implementation returned by GuessVCS().\n\n  Returns:\n    A 2-tuple (issue id, patchset id).\n    The patchset id is None if the base files are not uploaded by this\n    script (applies only to SVN checkouts).\n  \"\"\"\n  logging.basicConfig(format=(\"%(asctime).19s %(levelname)s %(filename)s:\"\n                              \"%(lineno)s %(message)s \"))\n  os.environ['LC_ALL'] = 'C'\n  options, args = parser.parse_args(argv[1:])\n  global verbosity\n  verbosity = options.verbose\n  if verbosity >= 3:\n    logging.getLogger().setLevel(logging.DEBUG)\n  elif verbosity >= 2:\n    logging.getLogger().setLevel(logging.INFO)\n  vcs = GuessVCS(options)\n  if isinstance(vcs, SubversionVCS):\n    # base field is only allowed for Subversion.\n    # Note: Fetching base files may become deprecated in future releases.\n    base = vcs.GuessBase(options.download_base)\n  else:\n    base = None\n  if not base and options.download_base:\n    options.download_base = True\n    logging.info(\"Enabled upload of base file\")\n  if not options.assume_yes:\n    vcs.CheckForUnknownFiles()\n  if data is None:\n    data = vcs.GenerateDiff(args)\n  files = vcs.GetBaseFiles(data)\n  if verbosity >= 1:\n    print \"Upload server:\", options.server, \"(change with -s/--server)\"\n  if options.issue:\n    prompt = \"Message describing this patch set: \"\n  else:\n    prompt = \"New issue subject: \"\n  message = options.message or raw_input(prompt).strip()\n  if not message:\n    ErrorExit(\"A non-empty message is required\")\n  rpc_server = GetRpcServer(options)\n  form_fields = [(\"subject\", message)]\n  if base:\n    form_fields.append((\"base\", base))\n  if options.issue:\n    form_fields.append((\"issue\", str(options.issue)))\n  if options.email:\n    form_fields.append((\"user\", options.email))\n  if options.reviewers:\n    for reviewer in options.reviewers.split(','):\n      if \"@\" in reviewer and not reviewer.split(\"@\")[1].count(\".\") == 1:\n        ErrorExit(\"Invalid email address: %s\" % reviewer)\n    form_fields.append((\"reviewers\", options.reviewers))\n  if options.cc:\n    for cc in options.cc.split(','):\n      if \"@\" in cc and not cc.split(\"@\")[1].count(\".\") == 1:\n        ErrorExit(\"Invalid email address: %s\" % cc)\n    form_fields.append((\"cc\", options.cc))\n  description = options.description\n  if options.description_file:\n    if options.description:\n      ErrorExit(\"Can't specify description and description_file\")\n    file = open(options.description_file, 'r')\n    description = file.read()\n    file.close()\n  if description:\n    form_fields.append((\"description\", description))\n  # Send a hash of all the base file so the server can determine if a copy\n  # already exists in an earlier patchset.\n  base_hashes = \"\"\n  for file, info in files.iteritems():\n    if not info[0] is None:\n      checksum = md5.new(info[0]).hexdigest()\n      if base_hashes:\n        base_hashes += \"|\"\n      base_hashes += checksum + \":\" + file\n  form_fields.append((\"base_hashes\", base_hashes))\n  # If we're uploading base files, don't send the email before the uploads, so\n  # that it contains the file status.\n  if options.send_mail and options.download_base:\n    form_fields.append((\"send_mail\", \"1\"))\n  if not options.download_base:\n    form_fields.append((\"content_upload\", \"1\"))\n  if len(data) > MAX_UPLOAD_SIZE:\n    print \"Patch is large, so uploading file patches separately.\"\n    uploaded_diff_file = []\n    form_fields.append((\"separate_patches\", \"1\"))\n  else:\n    uploaded_diff_file = [(\"data\", \"data.diff\", data)]\n  ctype, body = EncodeMultipartFormData(form_fields, uploaded_diff_file)\n  response_body = rpc_server.Send(\"/upload\", body, content_type=ctype)\n  patchset = None\n  if not options.download_base or not uploaded_diff_file:\n    lines = response_body.splitlines()\n    if len(lines) >= 2:\n      msg = lines[0]\n      patchset = lines[1].strip()\n      patches = [x.split(\" \", 1) for x in lines[2:]]\n    else:\n      msg = response_body\n  else:\n    msg = response_body\n  StatusUpdate(msg)\n  if not response_body.startswith(\"Issue created.\") and \\\n  not response_body.startswith(\"Issue updated.\"):\n    sys.exit(0)\n  issue = msg[msg.rfind(\"/\")+1:]\n\n  if not uploaded_diff_file:\n    result = UploadSeparatePatches(issue, rpc_server, patchset, data, options)\n    if not options.download_base:\n      patches = result\n\n  if not options.download_base:\n    vcs.UploadBaseFiles(issue, rpc_server, patches, patchset, options, files)\n    if options.send_mail:\n      rpc_server.Send(\"/\" + issue + \"/mail\", payload=\"\")\n  return issue, patchset\n\n\ndef main():\n  try:\n    RealMain(sys.argv)\n  except KeyboardInterrupt:\n    print\n    StatusUpdate(\"Interrupted.\")\n    sys.exit(1)\n\n\nif __name__ == \"__main__\":\n  main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/scripts/upload_gmock.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"upload_gmock.py v0.1.0 -- uploads a Google Mock patch for review.\n\nThis simple wrapper passes all command line flags and\n--cc=googlemock@googlegroups.com to upload.py.\n\nUSAGE: upload_gmock.py [options for upload.py]\n\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport sys\n\nCC_FLAG = '--cc='\nGMOCK_GROUP = 'googlemock@googlegroups.com'\n\n\ndef main():\n  # Finds the path to upload.py, assuming it is in the same directory\n  # as this file.\n  my_dir = os.path.dirname(os.path.abspath(__file__))\n  upload_py_path = os.path.join(my_dir, 'upload.py')\n\n  # Adds Google Mock discussion group to the cc line if it's not there\n  # already.\n  upload_py_argv = [upload_py_path]\n  found_cc_flag = False\n  for arg in sys.argv[1:]:\n    if arg.startswith(CC_FLAG):\n      found_cc_flag = True\n      cc_line = arg[len(CC_FLAG):]\n      cc_list = [addr for addr in cc_line.split(',') if addr]\n      if GMOCK_GROUP not in cc_list:\n        cc_list.append(GMOCK_GROUP)\n      upload_py_argv.append(CC_FLAG + ','.join(cc_list))\n    else:\n      upload_py_argv.append(arg)\n\n  if not found_cc_flag:\n    upload_py_argv.append(CC_FLAG + GMOCK_GROUP)\n\n  # Invokes upload.py with the modified command line flags.\n  os.execv(upload_py_path, upload_py_argv)\n\n\nif __name__ == '__main__':\n  main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/src/gmock-all.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Google C++ Mocking Framework (Google Mock)\n//\n// This file #includes all Google Mock implementation .cc files.  The\n// purpose is to allow a user to build Google Mock by compiling this\n// file alone.\n\n// This line ensures that gmock.h can be compiled on its own, even\n// when it's fused.\n#include \"gmock/gmock.h\"\n\n// The following lines pull in the real gmock *.cc files.\n#include \"src/gmock-cardinalities.cc\"\n#include \"src/gmock-internal-utils.cc\"\n#include \"src/gmock-matchers.cc\"\n#include \"src/gmock-spec-builders.cc\"\n#include \"src/gmock.cc\"\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/src/gmock-cardinalities.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements cardinalities.\n\n#include \"gmock/gmock-cardinalities.h\"\n\n#include <limits.h>\n#include <ostream>  // NOLINT\n#include <sstream>\n#include <string>\n#include \"gmock/internal/gmock-internal-utils.h\"\n#include \"gtest/gtest.h\"\n\nnamespace testing {\n\nnamespace {\n\n// Implements the Between(m, n) cardinality.\nclass BetweenCardinalityImpl : public CardinalityInterface {\n public:\n  BetweenCardinalityImpl(int min, int max)\n      : min_(min >= 0 ? min : 0),\n        max_(max >= min_ ? max : min_) {\n    std::stringstream ss;\n    if (min < 0) {\n      ss << \"The invocation lower bound must be >= 0, \"\n         << \"but is actually \" << min << \".\";\n      internal::Expect(false, __FILE__, __LINE__, ss.str());\n    } else if (max < 0) {\n      ss << \"The invocation upper bound must be >= 0, \"\n         << \"but is actually \" << max << \".\";\n      internal::Expect(false, __FILE__, __LINE__, ss.str());\n    } else if (min > max) {\n      ss << \"The invocation upper bound (\" << max\n         << \") must be >= the invocation lower bound (\" << min\n         << \").\";\n      internal::Expect(false, __FILE__, __LINE__, ss.str());\n    }\n  }\n\n  // Conservative estimate on the lower/upper bound of the number of\n  // calls allowed.\n  virtual int ConservativeLowerBound() const { return min_; }\n  virtual int ConservativeUpperBound() const { return max_; }\n\n  virtual bool IsSatisfiedByCallCount(int call_count) const {\n    return min_ <= call_count && call_count <= max_;\n  }\n\n  virtual bool IsSaturatedByCallCount(int call_count) const {\n    return call_count >= max_;\n  }\n\n  virtual void DescribeTo(::std::ostream* os) const;\n\n private:\n  const int min_;\n  const int max_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(BetweenCardinalityImpl);\n};\n\n// Formats \"n times\" in a human-friendly way.\ninline std::string FormatTimes(int n) {\n  if (n == 1) {\n    return \"once\";\n  } else if (n == 2) {\n    return \"twice\";\n  } else {\n    std::stringstream ss;\n    ss << n << \" times\";\n    return ss.str();\n  }\n}\n\n// Describes the Between(m, n) cardinality in human-friendly text.\nvoid BetweenCardinalityImpl::DescribeTo(::std::ostream* os) const {\n  if (min_ == 0) {\n    if (max_ == 0) {\n      *os << \"never called\";\n    } else if (max_ == INT_MAX) {\n      *os << \"called any number of times\";\n    } else {\n      *os << \"called at most \" << FormatTimes(max_);\n    }\n  } else if (min_ == max_) {\n    *os << \"called \" << FormatTimes(min_);\n  } else if (max_ == INT_MAX) {\n    *os << \"called at least \" << FormatTimes(min_);\n  } else {\n    // 0 < min_ < max_ < INT_MAX\n    *os << \"called between \" << min_ << \" and \" << max_ << \" times\";\n  }\n}\n\n}  // Unnamed namespace\n\n// Describes the given call count to an ostream.\nvoid Cardinality::DescribeActualCallCountTo(int actual_call_count,\n                                            ::std::ostream* os) {\n  if (actual_call_count > 0) {\n    *os << \"called \" << FormatTimes(actual_call_count);\n  } else {\n    *os << \"never called\";\n  }\n}\n\n// Creates a cardinality that allows at least n calls.\nGTEST_API_ Cardinality AtLeast(int n) { return Between(n, INT_MAX); }\n\n// Creates a cardinality that allows at most n calls.\nGTEST_API_ Cardinality AtMost(int n) { return Between(0, n); }\n\n// Creates a cardinality that allows any number of calls.\nGTEST_API_ Cardinality AnyNumber() { return AtLeast(0); }\n\n// Creates a cardinality that allows between min and max calls.\nGTEST_API_ Cardinality Between(int min, int max) {\n  return Cardinality(new BetweenCardinalityImpl(min, max));\n}\n\n// Creates a cardinality that allows exactly n calls.\nGTEST_API_ Cardinality Exactly(int n) { return Between(n, n); }\n\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/src/gmock-internal-utils.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file defines some utilities useful for implementing Google\n// Mock.  They are subject to change without notice, so please DO NOT\n// USE THEM IN USER CODE.\n\n#include \"gmock/internal/gmock-internal-utils.h\"\n\n#include <ctype.h>\n#include <ostream>  // NOLINT\n#include <string>\n#include \"gmock/gmock.h\"\n#include \"gmock/internal/gmock-port.h\"\n#include \"gtest/gtest.h\"\n\nnamespace testing {\nnamespace internal {\n\n// Joins a vector of strings as if they are fields of a tuple; returns\n// the joined string.\nGTEST_API_ std::string JoinAsTuple(const Strings& fields) {\n  switch (fields.size()) {\n    case 0:\n      return \"\";\n    case 1:\n      return fields[0];\n    default:\n      std::string result = \"(\" + fields[0];\n      for (size_t i = 1; i < fields.size(); i++) {\n        result += \", \";\n        result += fields[i];\n      }\n      result += \")\";\n      return result;\n  }\n}\n\n// Converts an identifier name to a space-separated list of lower-case\n// words.  Each maximum substring of the form [A-Za-z][a-z]*|\\d+ is\n// treated as one word.  For example, both \"FooBar123\" and\n// \"foo_bar_123\" are converted to \"foo bar 123\".\nGTEST_API_ std::string ConvertIdentifierNameToWords(const char* id_name) {\n  std::string result;\n  char prev_char = '\\0';\n  for (const char* p = id_name; *p != '\\0'; prev_char = *(p++)) {\n    // We don't care about the current locale as the input is\n    // guaranteed to be a valid C++ identifier name.\n    const bool starts_new_word = IsUpper(*p) ||\n        (!IsAlpha(prev_char) && IsLower(*p)) ||\n        (!IsDigit(prev_char) && IsDigit(*p));\n\n    if (IsAlNum(*p)) {\n      if (starts_new_word && result != \"\")\n        result += ' ';\n      result += ToLower(*p);\n    }\n  }\n  return result;\n}\n\n// This class reports Google Mock failures as Google Test failures.  A\n// user can define another class in a similar fashion if they intend to\n// use Google Mock with a testing framework other than Google Test.\nclass GoogleTestFailureReporter : public FailureReporterInterface {\n public:\n  virtual void ReportFailure(FailureType type, const char* file, int line,\n                             const std::string& message) {\n    AssertHelper(type == kFatal ?\n                 TestPartResult::kFatalFailure :\n                 TestPartResult::kNonFatalFailure,\n                 file,\n                 line,\n                 message.c_str()) = Message();\n    if (type == kFatal) {\n      posix::Abort();\n    }\n  }\n};\n\n// Returns the global failure reporter.  Will create a\n// GoogleTestFailureReporter and return it the first time called.\nGTEST_API_ FailureReporterInterface* GetFailureReporter() {\n  // Points to the global failure reporter used by Google Mock.  gcc\n  // guarantees that the following use of failure_reporter is\n  // thread-safe.  We may need to add additional synchronization to\n  // protect failure_reporter if we port Google Mock to other\n  // compilers.\n  static FailureReporterInterface* const failure_reporter =\n      new GoogleTestFailureReporter();\n  return failure_reporter;\n}\n\n// Protects global resources (stdout in particular) used by Log().\nstatic GTEST_DEFINE_STATIC_MUTEX_(g_log_mutex);\n\n// Returns true iff a log with the given severity is visible according\n// to the --gmock_verbose flag.\nGTEST_API_ bool LogIsVisible(LogSeverity severity) {\n  if (GMOCK_FLAG(verbose) == kInfoVerbosity) {\n    // Always show the log if --gmock_verbose=info.\n    return true;\n  } else if (GMOCK_FLAG(verbose) == kErrorVerbosity) {\n    // Always hide it if --gmock_verbose=error.\n    return false;\n  } else {\n    // If --gmock_verbose is neither \"info\" nor \"error\", we treat it\n    // as \"warning\" (its default value).\n    return severity == kWarning;\n  }\n}\n\n// Prints the given message to stdout iff 'severity' >= the level\n// specified by the --gmock_verbose flag.  If stack_frames_to_skip >=\n// 0, also prints the stack trace excluding the top\n// stack_frames_to_skip frames.  In opt mode, any positive\n// stack_frames_to_skip is treated as 0, since we don't know which\n// function calls will be inlined by the compiler and need to be\n// conservative.\nGTEST_API_ void Log(LogSeverity severity, const std::string& message,\n                    int stack_frames_to_skip) {\n  if (!LogIsVisible(severity))\n    return;\n\n  // Ensures that logs from different threads don't interleave.\n  MutexLock l(&g_log_mutex);\n\n  // \"using ::std::cout;\" doesn't work with Symbian's STLport, where cout is a\n  // macro.\n\n  if (severity == kWarning) {\n    // Prints a GMOCK WARNING marker to make the warnings easily searchable.\n    std::cout << \"\\nGMOCK WARNING:\";\n  }\n  // Pre-pends a new-line to message if it doesn't start with one.\n  if (message.empty() || message[0] != '\\n') {\n    std::cout << \"\\n\";\n  }\n  std::cout << message;\n  if (stack_frames_to_skip >= 0) {\n#ifdef NDEBUG\n    // In opt mode, we have to be conservative and skip no stack frame.\n    const int actual_to_skip = 0;\n#else\n    // In dbg mode, we can do what the caller tell us to do (plus one\n    // for skipping this function's stack frame).\n    const int actual_to_skip = stack_frames_to_skip + 1;\n#endif  // NDEBUG\n\n    // Appends a new-line to message if it doesn't end with one.\n    if (!message.empty() && *message.rbegin() != '\\n') {\n      std::cout << \"\\n\";\n    }\n    std::cout << \"Stack trace:\\n\"\n         << ::testing::internal::GetCurrentOsStackTraceExceptTop(\n             ::testing::UnitTest::GetInstance(), actual_to_skip);\n  }\n  std::cout << ::std::flush;\n}\n\nGTEST_API_ WithoutMatchers GetWithoutMatchers() { return WithoutMatchers(); }\n\nGTEST_API_ void IllegalDoDefault(const char* file, int line) {\n  internal::Assert(\n      false, file, line,\n      \"You are using DoDefault() inside a composite action like \"\n      \"DoAll() or WithArgs().  This is not supported for technical \"\n      \"reasons.  Please instead spell out the default action, or \"\n      \"assign the default action to an Action variable and use \"\n      \"the variable in various places.\");\n}\n\n}  // namespace internal\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/src/gmock-matchers.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements Matcher<const string&>, Matcher<string>, and\n// utilities for defining matchers.\n\n#include \"gmock/gmock-matchers.h\"\n#include \"gmock/gmock-generated-matchers.h\"\n\n#include <string.h>\n#include <iostream>\n#include <sstream>\n#include <string>\n\nnamespace testing {\n\n// Constructs a matcher that matches a const std::string& whose value is\n// equal to s.\nMatcher<const std::string&>::Matcher(const std::string& s) { *this = Eq(s); }\n\n#if GTEST_HAS_GLOBAL_STRING\n// Constructs a matcher that matches a const std::string& whose value is\n// equal to s.\nMatcher<const std::string&>::Matcher(const ::string& s) {\n  *this = Eq(static_cast<std::string>(s));\n}\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n// Constructs a matcher that matches a const std::string& whose value is\n// equal to s.\nMatcher<const std::string&>::Matcher(const char* s) {\n  *this = Eq(std::string(s));\n}\n\n// Constructs a matcher that matches a std::string whose value is equal to\n// s.\nMatcher<std::string>::Matcher(const std::string& s) { *this = Eq(s); }\n\n#if GTEST_HAS_GLOBAL_STRING\n// Constructs a matcher that matches a std::string whose value is equal to\n// s.\nMatcher<std::string>::Matcher(const ::string& s) {\n  *this = Eq(static_cast<std::string>(s));\n}\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n// Constructs a matcher that matches a std::string whose value is equal to\n// s.\nMatcher<std::string>::Matcher(const char* s) { *this = Eq(std::string(s)); }\n\n#if GTEST_HAS_GLOBAL_STRING\n// Constructs a matcher that matches a const ::string& whose value is\n// equal to s.\nMatcher<const ::string&>::Matcher(const std::string& s) {\n  *this = Eq(static_cast<::string>(s));\n}\n\n// Constructs a matcher that matches a const ::string& whose value is\n// equal to s.\nMatcher<const ::string&>::Matcher(const ::string& s) { *this = Eq(s); }\n\n// Constructs a matcher that matches a const ::string& whose value is\n// equal to s.\nMatcher<const ::string&>::Matcher(const char* s) { *this = Eq(::string(s)); }\n\n// Constructs a matcher that matches a ::string whose value is equal to s.\nMatcher<::string>::Matcher(const std::string& s) {\n  *this = Eq(static_cast<::string>(s));\n}\n\n// Constructs a matcher that matches a ::string whose value is equal to s.\nMatcher<::string>::Matcher(const ::string& s) { *this = Eq(s); }\n\n// Constructs a matcher that matches a string whose value is equal to s.\nMatcher<::string>::Matcher(const char* s) { *this = Eq(::string(s)); }\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n#if GTEST_HAS_ABSL\n// Constructs a matcher that matches a const absl::string_view& whose value is\n// equal to s.\nMatcher<const absl::string_view&>::Matcher(const std::string& s) {\n  *this = Eq(s);\n}\n\n#if GTEST_HAS_GLOBAL_STRING\n// Constructs a matcher that matches a const absl::string_view& whose value is\n// equal to s.\nMatcher<const absl::string_view&>::Matcher(const ::string& s) { *this = Eq(s); }\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n// Constructs a matcher that matches a const absl::string_view& whose value is\n// equal to s.\nMatcher<const absl::string_view&>::Matcher(const char* s) {\n  *this = Eq(std::string(s));\n}\n\n// Constructs a matcher that matches a const absl::string_view& whose value is\n// equal to s.\nMatcher<const absl::string_view&>::Matcher(absl::string_view s) {\n  *this = Eq(std::string(s));\n}\n\n// Constructs a matcher that matches a absl::string_view whose value is equal to\n// s.\nMatcher<absl::string_view>::Matcher(const std::string& s) { *this = Eq(s); }\n\n#if GTEST_HAS_GLOBAL_STRING\n// Constructs a matcher that matches a absl::string_view whose value is equal to\n// s.\nMatcher<absl::string_view>::Matcher(const ::string& s) { *this = Eq(s); }\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n// Constructs a matcher that matches a absl::string_view whose value is equal to\n// s.\nMatcher<absl::string_view>::Matcher(const char* s) {\n  *this = Eq(std::string(s));\n}\n\n// Constructs a matcher that matches a absl::string_view whose value is equal to\n// s.\nMatcher<absl::string_view>::Matcher(absl::string_view s) {\n  *this = Eq(std::string(s));\n}\n#endif  // GTEST_HAS_ABSL\n\nnamespace internal {\n\n// Returns the description for a matcher defined using the MATCHER*()\n// macro where the user-supplied description string is \"\", if\n// 'negation' is false; otherwise returns the description of the\n// negation of the matcher.  'param_values' contains a list of strings\n// that are the print-out of the matcher's parameters.\nGTEST_API_ std::string FormatMatcherDescription(bool negation,\n                                                const char* matcher_name,\n                                                const Strings& param_values) {\n  std::string result = ConvertIdentifierNameToWords(matcher_name);\n  if (param_values.size() >= 1) result += \" \" + JoinAsTuple(param_values);\n  return negation ? \"not (\" + result + \")\" : result;\n}\n\n// FindMaxBipartiteMatching and its helper class.\n//\n// Uses the well-known Ford-Fulkerson max flow method to find a maximum\n// bipartite matching. Flow is considered to be from left to right.\n// There is an implicit source node that is connected to all of the left\n// nodes, and an implicit sink node that is connected to all of the\n// right nodes. All edges have unit capacity.\n//\n// Neither the flow graph nor the residual flow graph are represented\n// explicitly. Instead, they are implied by the information in 'graph' and\n// a vector<int> called 'left_' whose elements are initialized to the\n// value kUnused. This represents the initial state of the algorithm,\n// where the flow graph is empty, and the residual flow graph has the\n// following edges:\n//   - An edge from source to each left_ node\n//   - An edge from each right_ node to sink\n//   - An edge from each left_ node to each right_ node, if the\n//     corresponding edge exists in 'graph'.\n//\n// When the TryAugment() method adds a flow, it sets left_[l] = r for some\n// nodes l and r. This induces the following changes:\n//   - The edges (source, l), (l, r), and (r, sink) are added to the\n//     flow graph.\n//   - The same three edges are removed from the residual flow graph.\n//   - The reverse edges (l, source), (r, l), and (sink, r) are added\n//     to the residual flow graph, which is a directional graph\n//     representing unused flow capacity.\n//\n// When the method augments a flow (moving left_[l] from some r1 to some\n// other r2), this can be thought of as \"undoing\" the above steps with\n// respect to r1 and \"redoing\" them with respect to r2.\n//\n// It bears repeating that the flow graph and residual flow graph are\n// never represented explicitly, but can be derived by looking at the\n// information in 'graph' and in left_.\n//\n// As an optimization, there is a second vector<int> called right_ which\n// does not provide any new information. Instead, it enables more\n// efficient queries about edges entering or leaving the right-side nodes\n// of the flow or residual flow graphs. The following invariants are\n// maintained:\n//\n// left[l] == kUnused or right[left[l]] == l\n// right[r] == kUnused or left[right[r]] == r\n//\n// . [ source ]                                        .\n// .   |||                                             .\n// .   |||                                             .\n// .   ||\\--> left[0]=1  ---\\    right[0]=-1 ----\\     .\n// .   ||                   |                    |     .\n// .   |\\---> left[1]=-1    \\--> right[1]=0  ---\\|     .\n// .   |                                        ||     .\n// .   \\----> left[2]=2  ------> right[2]=2  --\\||     .\n// .                                           |||     .\n// .         elements           matchers       vvv     .\n// .                                         [ sink ]  .\n//\n// See Also:\n//   [1] Cormen, et al (2001). \"Section 26.2: The Ford-Fulkerson method\".\n//       \"Introduction to Algorithms (Second ed.)\", pp. 651-664.\n//   [2] \"Ford-Fulkerson algorithm\", Wikipedia,\n//       'http://en.wikipedia.org/wiki/Ford%E2%80%93Fulkerson_algorithm'\nclass MaxBipartiteMatchState {\n public:\n  explicit MaxBipartiteMatchState(const MatchMatrix& graph)\n      : graph_(&graph),\n        left_(graph_->LhsSize(), kUnused),\n        right_(graph_->RhsSize(), kUnused) {}\n\n  // Returns the edges of a maximal match, each in the form {left, right}.\n  ElementMatcherPairs Compute() {\n    // 'seen' is used for path finding { 0: unseen, 1: seen }.\n    ::std::vector<char> seen;\n    // Searches the residual flow graph for a path from each left node to\n    // the sink in the residual flow graph, and if one is found, add flow\n    // to the graph. It's okay to search through the left nodes once. The\n    // edge from the implicit source node to each previously-visited left\n    // node will have flow if that left node has any path to the sink\n    // whatsoever. Subsequent augmentations can only add flow to the\n    // network, and cannot take away that previous flow unit from the source.\n    // Since the source-to-left edge can only carry one flow unit (or,\n    // each element can be matched to only one matcher), there is no need\n    // to visit the left nodes more than once looking for augmented paths.\n    // The flow is known to be possible or impossible by looking at the\n    // node once.\n    for (size_t ilhs = 0; ilhs < graph_->LhsSize(); ++ilhs) {\n      // Reset the path-marking vector and try to find a path from\n      // source to sink starting at the left_[ilhs] node.\n      GTEST_CHECK_(left_[ilhs] == kUnused)\n          << \"ilhs: \" << ilhs << \", left_[ilhs]: \" << left_[ilhs];\n      // 'seen' initialized to 'graph_->RhsSize()' copies of 0.\n      seen.assign(graph_->RhsSize(), 0);\n      TryAugment(ilhs, &seen);\n    }\n    ElementMatcherPairs result;\n    for (size_t ilhs = 0; ilhs < left_.size(); ++ilhs) {\n      size_t irhs = left_[ilhs];\n      if (irhs == kUnused) continue;\n      result.push_back(ElementMatcherPair(ilhs, irhs));\n    }\n    return result;\n  }\n\n private:\n  static const size_t kUnused = static_cast<size_t>(-1);\n\n  // Perform a depth-first search from left node ilhs to the sink.  If a\n  // path is found, flow is added to the network by linking the left and\n  // right vector elements corresponding each segment of the path.\n  // Returns true if a path to sink was found, which means that a unit of\n  // flow was added to the network. The 'seen' vector elements correspond\n  // to right nodes and are marked to eliminate cycles from the search.\n  //\n  // Left nodes will only be explored at most once because they\n  // are accessible from at most one right node in the residual flow\n  // graph.\n  //\n  // Note that left_[ilhs] is the only element of left_ that TryAugment will\n  // potentially transition from kUnused to another value. Any other\n  // left_ element holding kUnused before TryAugment will be holding it\n  // when TryAugment returns.\n  //\n  bool TryAugment(size_t ilhs, ::std::vector<char>* seen) {\n    for (size_t irhs = 0; irhs < graph_->RhsSize(); ++irhs) {\n      if ((*seen)[irhs]) continue;\n      if (!graph_->HasEdge(ilhs, irhs)) continue;\n      // There's an available edge from ilhs to irhs.\n      (*seen)[irhs] = 1;\n      // Next a search is performed to determine whether\n      // this edge is a dead end or leads to the sink.\n      //\n      // right_[irhs] == kUnused means that there is residual flow from\n      // right node irhs to the sink, so we can use that to finish this\n      // flow path and return success.\n      //\n      // Otherwise there is residual flow to some ilhs. We push flow\n      // along that path and call ourselves recursively to see if this\n      // ultimately leads to sink.\n      if (right_[irhs] == kUnused || TryAugment(right_[irhs], seen)) {\n        // Add flow from left_[ilhs] to right_[irhs].\n        left_[ilhs] = irhs;\n        right_[irhs] = ilhs;\n        return true;\n      }\n    }\n    return false;\n  }\n\n  const MatchMatrix* graph_;  // not owned\n  // Each element of the left_ vector represents a left hand side node\n  // (i.e. an element) and each element of right_ is a right hand side\n  // node (i.e. a matcher). The values in the left_ vector indicate\n  // outflow from that node to a node on the right_ side. The values\n  // in the right_ indicate inflow, and specify which left_ node is\n  // feeding that right_ node, if any. For example, left_[3] == 1 means\n  // there's a flow from element #3 to matcher #1. Such a flow would also\n  // be redundantly represented in the right_ vector as right_[1] == 3.\n  // Elements of left_ and right_ are either kUnused or mutually\n  // referent. Mutually referent means that left_[right_[i]] = i and\n  // right_[left_[i]] = i.\n  ::std::vector<size_t> left_;\n  ::std::vector<size_t> right_;\n\n  GTEST_DISALLOW_ASSIGN_(MaxBipartiteMatchState);\n};\n\nconst size_t MaxBipartiteMatchState::kUnused;\n\nGTEST_API_ ElementMatcherPairs FindMaxBipartiteMatching(const MatchMatrix& g) {\n  return MaxBipartiteMatchState(g).Compute();\n}\n\nstatic void LogElementMatcherPairVec(const ElementMatcherPairs& pairs,\n                                     ::std::ostream* stream) {\n  typedef ElementMatcherPairs::const_iterator Iter;\n  ::std::ostream& os = *stream;\n  os << \"{\";\n  const char* sep = \"\";\n  for (Iter it = pairs.begin(); it != pairs.end(); ++it) {\n    os << sep << \"\\n  (\"\n       << \"element #\" << it->first << \", \"\n       << \"matcher #\" << it->second << \")\";\n    sep = \",\";\n  }\n  os << \"\\n}\";\n}\n\nbool MatchMatrix::NextGraph() {\n  for (size_t ilhs = 0; ilhs < LhsSize(); ++ilhs) {\n    for (size_t irhs = 0; irhs < RhsSize(); ++irhs) {\n      char& b = matched_[SpaceIndex(ilhs, irhs)];\n      if (!b) {\n        b = 1;\n        return true;\n      }\n      b = 0;\n    }\n  }\n  return false;\n}\n\nvoid MatchMatrix::Randomize() {\n  for (size_t ilhs = 0; ilhs < LhsSize(); ++ilhs) {\n    for (size_t irhs = 0; irhs < RhsSize(); ++irhs) {\n      char& b = matched_[SpaceIndex(ilhs, irhs)];\n      b = static_cast<char>(rand() & 1);  // NOLINT\n    }\n  }\n}\n\nstd::string MatchMatrix::DebugString() const {\n  ::std::stringstream ss;\n  const char* sep = \"\";\n  for (size_t i = 0; i < LhsSize(); ++i) {\n    ss << sep;\n    for (size_t j = 0; j < RhsSize(); ++j) {\n      ss << HasEdge(i, j);\n    }\n    sep = \";\";\n  }\n  return ss.str();\n}\n\nvoid UnorderedElementsAreMatcherImplBase::DescribeToImpl(\n    ::std::ostream* os) const {\n  switch (match_flags()) {\n    case UnorderedMatcherRequire::ExactMatch:\n      if (matcher_describers_.empty()) {\n        *os << \"is empty\";\n        return;\n      }\n      if (matcher_describers_.size() == 1) {\n        *os << \"has \" << Elements(1) << \" and that element \";\n        matcher_describers_[0]->DescribeTo(os);\n        return;\n      }\n      *os << \"has \" << Elements(matcher_describers_.size())\n          << \" and there exists some permutation of elements such that:\\n\";\n      break;\n    case UnorderedMatcherRequire::Superset:\n      *os << \"a surjection from elements to requirements exists such that:\\n\";\n      break;\n    case UnorderedMatcherRequire::Subset:\n      *os << \"an injection from elements to requirements exists such that:\\n\";\n      break;\n  }\n\n  const char* sep = \"\";\n  for (size_t i = 0; i != matcher_describers_.size(); ++i) {\n    *os << sep;\n    if (match_flags() == UnorderedMatcherRequire::ExactMatch) {\n      *os << \" - element #\" << i << \" \";\n    } else {\n      *os << \" - an element \";\n    }\n    matcher_describers_[i]->DescribeTo(os);\n    if (match_flags() == UnorderedMatcherRequire::ExactMatch) {\n      sep = \", and\\n\";\n    } else {\n      sep = \"\\n\";\n    }\n  }\n}\n\nvoid UnorderedElementsAreMatcherImplBase::DescribeNegationToImpl(\n    ::std::ostream* os) const {\n  switch (match_flags()) {\n    case UnorderedMatcherRequire::ExactMatch:\n      if (matcher_describers_.empty()) {\n        *os << \"isn't empty\";\n        return;\n      }\n      if (matcher_describers_.size() == 1) {\n        *os << \"doesn't have \" << Elements(1) << \", or has \" << Elements(1)\n            << \" that \";\n        matcher_describers_[0]->DescribeNegationTo(os);\n        return;\n      }\n      *os << \"doesn't have \" << Elements(matcher_describers_.size())\n          << \", or there exists no permutation of elements such that:\\n\";\n      break;\n    case UnorderedMatcherRequire::Superset:\n      *os << \"no surjection from elements to requirements exists such that:\\n\";\n      break;\n    case UnorderedMatcherRequire::Subset:\n      *os << \"no injection from elements to requirements exists such that:\\n\";\n      break;\n  }\n  const char* sep = \"\";\n  for (size_t i = 0; i != matcher_describers_.size(); ++i) {\n    *os << sep;\n    if (match_flags() == UnorderedMatcherRequire::ExactMatch) {\n      *os << \" - element #\" << i << \" \";\n    } else {\n      *os << \" - an element \";\n    }\n    matcher_describers_[i]->DescribeTo(os);\n    if (match_flags() == UnorderedMatcherRequire::ExactMatch) {\n      sep = \", and\\n\";\n    } else {\n      sep = \"\\n\";\n    }\n  }\n}\n\n// Checks that all matchers match at least one element, and that all\n// elements match at least one matcher. This enables faster matching\n// and better error reporting.\n// Returns false, writing an explanation to 'listener', if and only\n// if the success criteria are not met.\nbool UnorderedElementsAreMatcherImplBase::VerifyMatchMatrix(\n    const ::std::vector<std::string>& element_printouts,\n    const MatchMatrix& matrix, MatchResultListener* listener) const {\n  bool result = true;\n  ::std::vector<char> element_matched(matrix.LhsSize(), 0);\n  ::std::vector<char> matcher_matched(matrix.RhsSize(), 0);\n\n  for (size_t ilhs = 0; ilhs < matrix.LhsSize(); ilhs++) {\n    for (size_t irhs = 0; irhs < matrix.RhsSize(); irhs++) {\n      char matched = matrix.HasEdge(ilhs, irhs);\n      element_matched[ilhs] |= matched;\n      matcher_matched[irhs] |= matched;\n    }\n  }\n\n  if (match_flags() & UnorderedMatcherRequire::Superset) {\n    const char* sep =\n        \"where the following matchers don't match any elements:\\n\";\n    for (size_t mi = 0; mi < matcher_matched.size(); ++mi) {\n      if (matcher_matched[mi]) continue;\n      result = false;\n      if (listener->IsInterested()) {\n        *listener << sep << \"matcher #\" << mi << \": \";\n        matcher_describers_[mi]->DescribeTo(listener->stream());\n        sep = \",\\n\";\n      }\n    }\n  }\n\n  if (match_flags() & UnorderedMatcherRequire::Subset) {\n    const char* sep =\n        \"where the following elements don't match any matchers:\\n\";\n    const char* outer_sep = \"\";\n    if (!result) {\n      outer_sep = \"\\nand \";\n    }\n    for (size_t ei = 0; ei < element_matched.size(); ++ei) {\n      if (element_matched[ei]) continue;\n      result = false;\n      if (listener->IsInterested()) {\n        *listener << outer_sep << sep << \"element #\" << ei << \": \"\n                  << element_printouts[ei];\n        sep = \",\\n\";\n        outer_sep = \"\";\n      }\n    }\n  }\n  return result;\n}\n\nbool UnorderedElementsAreMatcherImplBase::FindPairing(\n    const MatchMatrix& matrix, MatchResultListener* listener) const {\n  ElementMatcherPairs matches = FindMaxBipartiteMatching(matrix);\n\n  size_t max_flow = matches.size();\n  if ((match_flags() & UnorderedMatcherRequire::Superset) &&\n      max_flow < matrix.RhsSize()) {\n    if (listener->IsInterested()) {\n      *listener << \"where no permutation of the elements can satisfy all \"\n                   \"matchers, and the closest match is \"\n                << max_flow << \" of \" << matrix.RhsSize()\n                << \" matchers with the pairings:\\n\";\n      LogElementMatcherPairVec(matches, listener->stream());\n    }\n    return false;\n  }\n  if ((match_flags() & UnorderedMatcherRequire::Subset) &&\n      max_flow < matrix.LhsSize()) {\n    if (listener->IsInterested()) {\n      *listener\n          << \"where not all elements can be matched, and the closest match is \"\n          << max_flow << \" of \" << matrix.RhsSize()\n          << \" matchers with the pairings:\\n\";\n      LogElementMatcherPairVec(matches, listener->stream());\n    }\n    return false;\n  }\n\n  if (matches.size() > 1) {\n    if (listener->IsInterested()) {\n      const char* sep = \"where:\\n\";\n      for (size_t mi = 0; mi < matches.size(); ++mi) {\n        *listener << sep << \" - element #\" << matches[mi].first\n                  << \" is matched by matcher #\" << matches[mi].second;\n        sep = \",\\n\";\n      }\n    }\n  }\n  return true;\n}\n\n}  // namespace internal\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/src/gmock-spec-builders.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file implements the spec builder syntax (ON_CALL and\n// EXPECT_CALL).\n\n#include \"gmock/gmock-spec-builders.h\"\n\n#include <stdlib.h>\n#include <iostream>  // NOLINT\n#include <map>\n#include <set>\n#include <string>\n#include <vector>\n#include \"gmock/gmock.h\"\n#include \"gtest/gtest.h\"\n\n#if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC\n# include <unistd.h>  // NOLINT\n#endif\n\n// Silence C4800 (C4800: 'int *const ': forcing value\n// to bool 'true' or 'false') for MSVC 14,15\n#ifdef _MSC_VER\n#if _MSC_VER <= 1900\n#  pragma warning(push)\n#  pragma warning(disable:4800)\n#endif\n#endif\n\nnamespace testing {\nnamespace internal {\n\n// Protects the mock object registry (in class Mock), all function\n// mockers, and all expectations.\nGTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_gmock_mutex);\n\n// Logs a message including file and line number information.\nGTEST_API_ void LogWithLocation(testing::internal::LogSeverity severity,\n                                const char* file, int line,\n                                const std::string& message) {\n  ::std::ostringstream s;\n  s << file << \":\" << line << \": \" << message << ::std::endl;\n  Log(severity, s.str(), 0);\n}\n\n// Constructs an ExpectationBase object.\nExpectationBase::ExpectationBase(const char* a_file, int a_line,\n                                 const std::string& a_source_text)\n    : file_(a_file),\n      line_(a_line),\n      source_text_(a_source_text),\n      cardinality_specified_(false),\n      cardinality_(Exactly(1)),\n      call_count_(0),\n      retired_(false),\n      extra_matcher_specified_(false),\n      repeated_action_specified_(false),\n      retires_on_saturation_(false),\n      last_clause_(kNone),\n      action_count_checked_(false) {}\n\n// Destructs an ExpectationBase object.\nExpectationBase::~ExpectationBase() {}\n\n// Explicitly specifies the cardinality of this expectation.  Used by\n// the subclasses to implement the .Times() clause.\nvoid ExpectationBase::SpecifyCardinality(const Cardinality& a_cardinality) {\n  cardinality_specified_ = true;\n  cardinality_ = a_cardinality;\n}\n\n// Retires all pre-requisites of this expectation.\nvoid ExpectationBase::RetireAllPreRequisites()\n    GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n  if (is_retired()) {\n    // We can take this short-cut as we never retire an expectation\n    // until we have retired all its pre-requisites.\n    return;\n  }\n\n  ::std::vector<ExpectationBase*> expectations(1, this);\n  while (!expectations.empty()) {\n    ExpectationBase* exp = expectations.back();\n    expectations.pop_back();\n\n    for (ExpectationSet::const_iterator it =\n             exp->immediate_prerequisites_.begin();\n         it != exp->immediate_prerequisites_.end(); ++it) {\n      ExpectationBase* next = it->expectation_base().get();\n      if (!next->is_retired()) {\n        next->Retire();\n        expectations.push_back(next);\n      }\n    }\n  }\n}\n\n// Returns true iff all pre-requisites of this expectation have been\n// satisfied.\nbool ExpectationBase::AllPrerequisitesAreSatisfied() const\n    GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n  g_gmock_mutex.AssertHeld();\n  ::std::vector<const ExpectationBase*> expectations(1, this);\n  while (!expectations.empty()) {\n    const ExpectationBase* exp = expectations.back();\n    expectations.pop_back();\n\n    for (ExpectationSet::const_iterator it =\n             exp->immediate_prerequisites_.begin();\n         it != exp->immediate_prerequisites_.end(); ++it) {\n      const ExpectationBase* next = it->expectation_base().get();\n      if (!next->IsSatisfied()) return false;\n      expectations.push_back(next);\n    }\n  }\n  return true;\n}\n\n// Adds unsatisfied pre-requisites of this expectation to 'result'.\nvoid ExpectationBase::FindUnsatisfiedPrerequisites(ExpectationSet* result) const\n    GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n  g_gmock_mutex.AssertHeld();\n  ::std::vector<const ExpectationBase*> expectations(1, this);\n  while (!expectations.empty()) {\n    const ExpectationBase* exp = expectations.back();\n    expectations.pop_back();\n\n    for (ExpectationSet::const_iterator it =\n             exp->immediate_prerequisites_.begin();\n         it != exp->immediate_prerequisites_.end(); ++it) {\n      const ExpectationBase* next = it->expectation_base().get();\n\n      if (next->IsSatisfied()) {\n        // If *it is satisfied and has a call count of 0, some of its\n        // pre-requisites may not be satisfied yet.\n        if (next->call_count_ == 0) {\n          expectations.push_back(next);\n        }\n      } else {\n        // Now that we know next is unsatisfied, we are not so interested\n        // in whether its pre-requisites are satisfied.  Therefore we\n        // don't iterate into it here.\n        *result += *it;\n      }\n    }\n  }\n}\n\n// Describes how many times a function call matching this\n// expectation has occurred.\nvoid ExpectationBase::DescribeCallCountTo(::std::ostream* os) const\n    GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n  g_gmock_mutex.AssertHeld();\n\n  // Describes how many times the function is expected to be called.\n  *os << \"         Expected: to be \";\n  cardinality().DescribeTo(os);\n  *os << \"\\n           Actual: \";\n  Cardinality::DescribeActualCallCountTo(call_count(), os);\n\n  // Describes the state of the expectation (e.g. is it satisfied?\n  // is it active?).\n  *os << \" - \" << (IsOverSaturated() ? \"over-saturated\" :\n                   IsSaturated() ? \"saturated\" :\n                   IsSatisfied() ? \"satisfied\" : \"unsatisfied\")\n      << \" and \"\n      << (is_retired() ? \"retired\" : \"active\");\n}\n\n// Checks the action count (i.e. the number of WillOnce() and\n// WillRepeatedly() clauses) against the cardinality if this hasn't\n// been done before.  Prints a warning if there are too many or too\n// few actions.\nvoid ExpectationBase::CheckActionCountIfNotDone() const\n    GTEST_LOCK_EXCLUDED_(mutex_) {\n  bool should_check = false;\n  {\n    MutexLock l(&mutex_);\n    if (!action_count_checked_) {\n      action_count_checked_ = true;\n      should_check = true;\n    }\n  }\n\n  if (should_check) {\n    if (!cardinality_specified_) {\n      // The cardinality was inferred - no need to check the action\n      // count against it.\n      return;\n    }\n\n    // The cardinality was explicitly specified.\n    const int action_count = static_cast<int>(untyped_actions_.size());\n    const int upper_bound = cardinality().ConservativeUpperBound();\n    const int lower_bound = cardinality().ConservativeLowerBound();\n    bool too_many;  // True if there are too many actions, or false\n    // if there are too few.\n    if (action_count > upper_bound ||\n        (action_count == upper_bound && repeated_action_specified_)) {\n      too_many = true;\n    } else if (0 < action_count && action_count < lower_bound &&\n               !repeated_action_specified_) {\n      too_many = false;\n    } else {\n      return;\n    }\n\n    ::std::stringstream ss;\n    DescribeLocationTo(&ss);\n    ss << \"Too \" << (too_many ? \"many\" : \"few\")\n       << \" actions specified in \" << source_text() << \"...\\n\"\n       << \"Expected to be \";\n    cardinality().DescribeTo(&ss);\n    ss << \", but has \" << (too_many ? \"\" : \"only \")\n       << action_count << \" WillOnce()\"\n       << (action_count == 1 ? \"\" : \"s\");\n    if (repeated_action_specified_) {\n      ss << \" and a WillRepeatedly()\";\n    }\n    ss << \".\";\n    Log(kWarning, ss.str(), -1);  // -1 means \"don't print stack trace\".\n  }\n}\n\n// Implements the .Times() clause.\nvoid ExpectationBase::UntypedTimes(const Cardinality& a_cardinality) {\n  if (last_clause_ == kTimes) {\n    ExpectSpecProperty(false,\n                       \".Times() cannot appear \"\n                       \"more than once in an EXPECT_CALL().\");\n  } else {\n    ExpectSpecProperty(last_clause_ < kTimes,\n                       \".Times() cannot appear after \"\n                       \".InSequence(), .WillOnce(), .WillRepeatedly(), \"\n                       \"or .RetiresOnSaturation().\");\n  }\n  last_clause_ = kTimes;\n\n  SpecifyCardinality(a_cardinality);\n}\n\n// Points to the implicit sequence introduced by a living InSequence\n// object (if any) in the current thread or NULL.\nGTEST_API_ ThreadLocal<Sequence*> g_gmock_implicit_sequence;\n\n// Reports an uninteresting call (whose description is in msg) in the\n// manner specified by 'reaction'.\nvoid ReportUninterestingCall(CallReaction reaction, const std::string& msg) {\n  // Include a stack trace only if --gmock_verbose=info is specified.\n  const int stack_frames_to_skip =\n      GMOCK_FLAG(verbose) == kInfoVerbosity ? 3 : -1;\n  switch (reaction) {\n    case kAllow:\n      Log(kInfo, msg, stack_frames_to_skip);\n      break;\n    case kWarn:\n      Log(kWarning,\n          msg +\n              \"\\nNOTE: You can safely ignore the above warning unless this \"\n              \"call should not happen.  Do not suppress it by blindly adding \"\n              \"an EXPECT_CALL() if you don't mean to enforce the call.  \"\n              \"See \"\n              \"https://github.com/google/googletest/blob/master/googlemock/\"\n              \"docs/CookBook.md#\"\n              \"knowing-when-to-expect for details.\\n\",\n          stack_frames_to_skip);\n      break;\n    default:  // FAIL\n      Expect(false, NULL, -1, msg);\n  }\n}\n\nUntypedFunctionMockerBase::UntypedFunctionMockerBase()\n    : mock_obj_(NULL), name_(\"\") {}\n\nUntypedFunctionMockerBase::~UntypedFunctionMockerBase() {}\n\n// Sets the mock object this mock method belongs to, and registers\n// this information in the global mock registry.  Will be called\n// whenever an EXPECT_CALL() or ON_CALL() is executed on this mock\n// method.\nvoid UntypedFunctionMockerBase::RegisterOwner(const void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n  {\n    MutexLock l(&g_gmock_mutex);\n    mock_obj_ = mock_obj;\n  }\n  Mock::Register(mock_obj, this);\n}\n\n// Sets the mock object this mock method belongs to, and sets the name\n// of the mock function.  Will be called upon each invocation of this\n// mock function.\nvoid UntypedFunctionMockerBase::SetOwnerAndName(const void* mock_obj,\n                                                const char* name)\n    GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n  // We protect name_ under g_gmock_mutex in case this mock function\n  // is called from two threads concurrently.\n  MutexLock l(&g_gmock_mutex);\n  mock_obj_ = mock_obj;\n  name_ = name;\n}\n\n// Returns the name of the function being mocked.  Must be called\n// after RegisterOwner() or SetOwnerAndName() has been called.\nconst void* UntypedFunctionMockerBase::MockObject() const\n    GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n  const void* mock_obj;\n  {\n    // We protect mock_obj_ under g_gmock_mutex in case this mock\n    // function is called from two threads concurrently.\n    MutexLock l(&g_gmock_mutex);\n    Assert(mock_obj_ != NULL, __FILE__, __LINE__,\n           \"MockObject() must not be called before RegisterOwner() or \"\n           \"SetOwnerAndName() has been called.\");\n    mock_obj = mock_obj_;\n  }\n  return mock_obj;\n}\n\n// Returns the name of this mock method.  Must be called after\n// SetOwnerAndName() has been called.\nconst char* UntypedFunctionMockerBase::Name() const\n    GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n  const char* name;\n  {\n    // We protect name_ under g_gmock_mutex in case this mock\n    // function is called from two threads concurrently.\n    MutexLock l(&g_gmock_mutex);\n    Assert(name_ != NULL, __FILE__, __LINE__,\n           \"Name() must not be called before SetOwnerAndName() has \"\n           \"been called.\");\n    name = name_;\n  }\n  return name;\n}\n\n// Calculates the result of invoking this mock function with the given\n// arguments, prints it, and returns it.  The caller is responsible\n// for deleting the result.\nUntypedActionResultHolderBase* UntypedFunctionMockerBase::UntypedInvokeWith(\n    void* const untyped_args) GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {\n  // See the definition of untyped_expectations_ for why access to it\n  // is unprotected here.\n  if (untyped_expectations_.size() == 0) {\n    // No expectation is set on this mock method - we have an\n    // uninteresting call.\n\n    // We must get Google Mock's reaction on uninteresting calls\n    // made on this mock object BEFORE performing the action,\n    // because the action may DELETE the mock object and make the\n    // following expression meaningless.\n    const CallReaction reaction =\n        Mock::GetReactionOnUninterestingCalls(MockObject());\n\n    // True iff we need to print this call's arguments and return\n    // value.  This definition must be kept in sync with\n    // the behavior of ReportUninterestingCall().\n    const bool need_to_report_uninteresting_call =\n        // If the user allows this uninteresting call, we print it\n        // only when they want informational messages.\n        reaction == kAllow ? LogIsVisible(kInfo) :\n                           // If the user wants this to be a warning, we print\n                           // it only when they want to see warnings.\n            reaction == kWarn\n                ? LogIsVisible(kWarning)\n                :\n                // Otherwise, the user wants this to be an error, and we\n                // should always print detailed information in the error.\n                true;\n\n    if (!need_to_report_uninteresting_call) {\n      // Perform the action without printing the call information.\n      return this->UntypedPerformDefaultAction(\n          untyped_args, \"Function call: \" + std::string(Name()));\n    }\n\n    // Warns about the uninteresting call.\n    ::std::stringstream ss;\n    this->UntypedDescribeUninterestingCall(untyped_args, &ss);\n\n    // Calculates the function result.\n    UntypedActionResultHolderBase* const result =\n        this->UntypedPerformDefaultAction(untyped_args, ss.str());\n\n    // Prints the function result.\n    if (result != NULL)\n      result->PrintAsActionResult(&ss);\n\n    ReportUninterestingCall(reaction, ss.str());\n    return result;\n  }\n\n  bool is_excessive = false;\n  ::std::stringstream ss;\n  ::std::stringstream why;\n  ::std::stringstream loc;\n  const void* untyped_action = NULL;\n\n  // The UntypedFindMatchingExpectation() function acquires and\n  // releases g_gmock_mutex.\n  const ExpectationBase* const untyped_expectation =\n      this->UntypedFindMatchingExpectation(\n          untyped_args, &untyped_action, &is_excessive,\n          &ss, &why);\n  const bool found = untyped_expectation != NULL;\n\n  // True iff we need to print the call's arguments and return value.\n  // This definition must be kept in sync with the uses of Expect()\n  // and Log() in this function.\n  const bool need_to_report_call =\n      !found || is_excessive || LogIsVisible(kInfo);\n  if (!need_to_report_call) {\n    // Perform the action without printing the call information.\n    return\n        untyped_action == NULL ?\n        this->UntypedPerformDefaultAction(untyped_args, \"\") :\n        this->UntypedPerformAction(untyped_action, untyped_args);\n  }\n\n  ss << \"    Function call: \" << Name();\n  this->UntypedPrintArgs(untyped_args, &ss);\n\n  // In case the action deletes a piece of the expectation, we\n  // generate the message beforehand.\n  if (found && !is_excessive) {\n    untyped_expectation->DescribeLocationTo(&loc);\n  }\n\n  UntypedActionResultHolderBase* const result =\n      untyped_action == NULL ?\n      this->UntypedPerformDefaultAction(untyped_args, ss.str()) :\n      this->UntypedPerformAction(untyped_action, untyped_args);\n  if (result != NULL)\n    result->PrintAsActionResult(&ss);\n  ss << \"\\n\" << why.str();\n\n  if (!found) {\n    // No expectation matches this call - reports a failure.\n    Expect(false, NULL, -1, ss.str());\n  } else if (is_excessive) {\n    // We had an upper-bound violation and the failure message is in ss.\n    Expect(false, untyped_expectation->file(),\n           untyped_expectation->line(), ss.str());\n  } else {\n    // We had an expected call and the matching expectation is\n    // described in ss.\n    Log(kInfo, loc.str() + ss.str(), 2);\n  }\n\n  return result;\n}\n\n// Returns an Expectation object that references and co-owns exp,\n// which must be an expectation on this mock function.\nExpectation UntypedFunctionMockerBase::GetHandleOf(ExpectationBase* exp) {\n  // See the definition of untyped_expectations_ for why access to it\n  // is unprotected here.\n  for (UntypedExpectations::const_iterator it =\n           untyped_expectations_.begin();\n       it != untyped_expectations_.end(); ++it) {\n    if (it->get() == exp) {\n      return Expectation(*it);\n    }\n  }\n\n  Assert(false, __FILE__, __LINE__, \"Cannot find expectation.\");\n  return Expectation();\n  // The above statement is just to make the code compile, and will\n  // never be executed.\n}\n\n// Verifies that all expectations on this mock function have been\n// satisfied.  Reports one or more Google Test non-fatal failures\n// and returns false if not.\nbool UntypedFunctionMockerBase::VerifyAndClearExpectationsLocked()\n    GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {\n  g_gmock_mutex.AssertHeld();\n  bool expectations_met = true;\n  for (UntypedExpectations::const_iterator it =\n           untyped_expectations_.begin();\n       it != untyped_expectations_.end(); ++it) {\n    ExpectationBase* const untyped_expectation = it->get();\n    if (untyped_expectation->IsOverSaturated()) {\n      // There was an upper-bound violation.  Since the error was\n      // already reported when it occurred, there is no need to do\n      // anything here.\n      expectations_met = false;\n    } else if (!untyped_expectation->IsSatisfied()) {\n      expectations_met = false;\n      ::std::stringstream ss;\n      ss  << \"Actual function call count doesn't match \"\n          << untyped_expectation->source_text() << \"...\\n\";\n      // No need to show the source file location of the expectation\n      // in the description, as the Expect() call that follows already\n      // takes care of it.\n      untyped_expectation->MaybeDescribeExtraMatcherTo(&ss);\n      untyped_expectation->DescribeCallCountTo(&ss);\n      Expect(false, untyped_expectation->file(),\n             untyped_expectation->line(), ss.str());\n    }\n  }\n\n  // Deleting our expectations may trigger other mock objects to be deleted, for\n  // example if an action contains a reference counted smart pointer to that\n  // mock object, and that is the last reference. So if we delete our\n  // expectations within the context of the global mutex we may deadlock when\n  // this method is called again. Instead, make a copy of the set of\n  // expectations to delete, clear our set within the mutex, and then clear the\n  // copied set outside of it.\n  UntypedExpectations expectations_to_delete;\n  untyped_expectations_.swap(expectations_to_delete);\n\n  g_gmock_mutex.Unlock();\n  expectations_to_delete.clear();\n  g_gmock_mutex.Lock();\n\n  return expectations_met;\n}\n\nCallReaction intToCallReaction(int mock_behavior) {\n  if (mock_behavior >= kAllow && mock_behavior <= kFail) {\n    return static_cast<internal::CallReaction>(mock_behavior);\n  }\n  return kWarn;\n}\n\n}  // namespace internal\n\n// Class Mock.\n\nnamespace {\n\ntypedef std::set<internal::UntypedFunctionMockerBase*> FunctionMockers;\n\n// The current state of a mock object.  Such information is needed for\n// detecting leaked mock objects and explicitly verifying a mock's\n// expectations.\nstruct MockObjectState {\n  MockObjectState()\n      : first_used_file(NULL), first_used_line(-1), leakable(false) {}\n\n  // Where in the source file an ON_CALL or EXPECT_CALL is first\n  // invoked on this mock object.\n  const char* first_used_file;\n  int first_used_line;\n  ::std::string first_used_test_case;\n  ::std::string first_used_test;\n  bool leakable;  // true iff it's OK to leak the object.\n  FunctionMockers function_mockers;  // All registered methods of the object.\n};\n\n// A global registry holding the state of all mock objects that are\n// alive.  A mock object is added to this registry the first time\n// Mock::AllowLeak(), ON_CALL(), or EXPECT_CALL() is called on it.  It\n// is removed from the registry in the mock object's destructor.\nclass MockObjectRegistry {\n public:\n  // Maps a mock object (identified by its address) to its state.\n  typedef std::map<const void*, MockObjectState> StateMap;\n\n  // This destructor will be called when a program exits, after all\n  // tests in it have been run.  By then, there should be no mock\n  // object alive.  Therefore we report any living object as test\n  // failure, unless the user explicitly asked us to ignore it.\n  ~MockObjectRegistry() {\n    // \"using ::std::cout;\" doesn't work with Symbian's STLport, where cout is\n    // a macro.\n\n    if (!GMOCK_FLAG(catch_leaked_mocks))\n      return;\n\n    int leaked_count = 0;\n    for (StateMap::const_iterator it = states_.begin(); it != states_.end();\n         ++it) {\n      if (it->second.leakable)  // The user said it's fine to leak this object.\n        continue;\n\n      // FIXME: Print the type of the leaked object.\n      // This can help the user identify the leaked object.\n      std::cout << \"\\n\";\n      const MockObjectState& state = it->second;\n      std::cout << internal::FormatFileLocation(state.first_used_file,\n                                                state.first_used_line);\n      std::cout << \" ERROR: this mock object\";\n      if (state.first_used_test != \"\") {\n        std::cout << \" (used in test \" << state.first_used_test_case << \".\"\n             << state.first_used_test << \")\";\n      }\n      std::cout << \" should be deleted but never is. Its address is @\"\n           << it->first << \".\";\n      leaked_count++;\n    }\n    if (leaked_count > 0) {\n      std::cout << \"\\nERROR: \" << leaked_count << \" leaked mock \"\n                << (leaked_count == 1 ? \"object\" : \"objects\")\n                << \" found at program exit. Expectations on a mock object is \"\n                   \"verified when the object is destructed. Leaking a mock \"\n                   \"means that its expectations aren't verified, which is \"\n                   \"usually a test bug. If you really intend to leak a mock, \"\n                   \"you can suppress this error using \"\n                   \"testing::Mock::AllowLeak(mock_object), or you may use a \"\n                   \"fake or stub instead of a mock.\\n\";\n      std::cout.flush();\n      ::std::cerr.flush();\n      // RUN_ALL_TESTS() has already returned when this destructor is\n      // called.  Therefore we cannot use the normal Google Test\n      // failure reporting mechanism.\n      _exit(1);  // We cannot call exit() as it is not reentrant and\n                 // may already have been called.\n    }\n  }\n\n  StateMap& states() { return states_; }\n\n private:\n  StateMap states_;\n};\n\n// Protected by g_gmock_mutex.\nMockObjectRegistry g_mock_object_registry;\n\n// Maps a mock object to the reaction Google Mock should have when an\n// uninteresting method is called.  Protected by g_gmock_mutex.\nstd::map<const void*, internal::CallReaction> g_uninteresting_call_reaction;\n\n// Sets the reaction Google Mock should have when an uninteresting\n// method of the given mock object is called.\nvoid SetReactionOnUninterestingCalls(const void* mock_obj,\n                                     internal::CallReaction reaction)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  internal::MutexLock l(&internal::g_gmock_mutex);\n  g_uninteresting_call_reaction[mock_obj] = reaction;\n}\n\n}  // namespace\n\n// Tells Google Mock to allow uninteresting calls on the given mock\n// object.\nvoid Mock::AllowUninterestingCalls(const void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  SetReactionOnUninterestingCalls(mock_obj, internal::kAllow);\n}\n\n// Tells Google Mock to warn the user about uninteresting calls on the\n// given mock object.\nvoid Mock::WarnUninterestingCalls(const void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  SetReactionOnUninterestingCalls(mock_obj, internal::kWarn);\n}\n\n// Tells Google Mock to fail uninteresting calls on the given mock\n// object.\nvoid Mock::FailUninterestingCalls(const void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  SetReactionOnUninterestingCalls(mock_obj, internal::kFail);\n}\n\n// Tells Google Mock the given mock object is being destroyed and its\n// entry in the call-reaction table should be removed.\nvoid Mock::UnregisterCallReaction(const void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  internal::MutexLock l(&internal::g_gmock_mutex);\n  g_uninteresting_call_reaction.erase(mock_obj);\n}\n\n// Returns the reaction Google Mock will have on uninteresting calls\n// made on the given mock object.\ninternal::CallReaction Mock::GetReactionOnUninterestingCalls(\n    const void* mock_obj)\n        GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  internal::MutexLock l(&internal::g_gmock_mutex);\n  return (g_uninteresting_call_reaction.count(mock_obj) == 0) ?\n      internal::intToCallReaction(GMOCK_FLAG(default_mock_behavior)) :\n      g_uninteresting_call_reaction[mock_obj];\n}\n\n// Tells Google Mock to ignore mock_obj when checking for leaked mock\n// objects.\nvoid Mock::AllowLeak(const void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  internal::MutexLock l(&internal::g_gmock_mutex);\n  g_mock_object_registry.states()[mock_obj].leakable = true;\n}\n\n// Verifies and clears all expectations on the given mock object.  If\n// the expectations aren't satisfied, generates one or more Google\n// Test non-fatal failures and returns false.\nbool Mock::VerifyAndClearExpectations(void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  internal::MutexLock l(&internal::g_gmock_mutex);\n  return VerifyAndClearExpectationsLocked(mock_obj);\n}\n\n// Verifies all expectations on the given mock object and clears its\n// default actions and expectations.  Returns true iff the\n// verification was successful.\nbool Mock::VerifyAndClear(void* mock_obj)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  internal::MutexLock l(&internal::g_gmock_mutex);\n  ClearDefaultActionsLocked(mock_obj);\n  return VerifyAndClearExpectationsLocked(mock_obj);\n}\n\n// Verifies and clears all expectations on the given mock object.  If\n// the expectations aren't satisfied, generates one or more Google\n// Test non-fatal failures and returns false.\nbool Mock::VerifyAndClearExpectationsLocked(void* mock_obj)\n    GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex) {\n  internal::g_gmock_mutex.AssertHeld();\n  if (g_mock_object_registry.states().count(mock_obj) == 0) {\n    // No EXPECT_CALL() was set on the given mock object.\n    return true;\n  }\n\n  // Verifies and clears the expectations on each mock method in the\n  // given mock object.\n  bool expectations_met = true;\n  FunctionMockers& mockers =\n      g_mock_object_registry.states()[mock_obj].function_mockers;\n  for (FunctionMockers::const_iterator it = mockers.begin();\n       it != mockers.end(); ++it) {\n    if (!(*it)->VerifyAndClearExpectationsLocked()) {\n      expectations_met = false;\n    }\n  }\n\n  // We don't clear the content of mockers, as they may still be\n  // needed by ClearDefaultActionsLocked().\n  return expectations_met;\n}\n\n// Registers a mock object and a mock method it owns.\nvoid Mock::Register(const void* mock_obj,\n                    internal::UntypedFunctionMockerBase* mocker)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  internal::MutexLock l(&internal::g_gmock_mutex);\n  g_mock_object_registry.states()[mock_obj].function_mockers.insert(mocker);\n}\n\n// Tells Google Mock where in the source code mock_obj is used in an\n// ON_CALL or EXPECT_CALL.  In case mock_obj is leaked, this\n// information helps the user identify which object it is.\nvoid Mock::RegisterUseByOnCallOrExpectCall(const void* mock_obj,\n                                           const char* file, int line)\n    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {\n  internal::MutexLock l(&internal::g_gmock_mutex);\n  MockObjectState& state = g_mock_object_registry.states()[mock_obj];\n  if (state.first_used_file == NULL) {\n    state.first_used_file = file;\n    state.first_used_line = line;\n    const TestInfo* const test_info =\n        UnitTest::GetInstance()->current_test_info();\n    if (test_info != NULL) {\n      // FIXME: record the test case name when the\n      // ON_CALL or EXPECT_CALL is invoked from SetUpTestCase() or\n      // TearDownTestCase().\n      state.first_used_test_case = test_info->test_case_name();\n      state.first_used_test = test_info->name();\n    }\n  }\n}\n\n// Unregisters a mock method; removes the owning mock object from the\n// registry when the last mock method associated with it has been\n// unregistered.  This is called only in the destructor of\n// FunctionMockerBase.\nvoid Mock::UnregisterLocked(internal::UntypedFunctionMockerBase* mocker)\n    GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex) {\n  internal::g_gmock_mutex.AssertHeld();\n  for (MockObjectRegistry::StateMap::iterator it =\n           g_mock_object_registry.states().begin();\n       it != g_mock_object_registry.states().end(); ++it) {\n    FunctionMockers& mockers = it->second.function_mockers;\n    if (mockers.erase(mocker) > 0) {\n      // mocker was in mockers and has been just removed.\n      if (mockers.empty()) {\n        g_mock_object_registry.states().erase(it);\n      }\n      return;\n    }\n  }\n}\n\n// Clears all ON_CALL()s set on the given mock object.\nvoid Mock::ClearDefaultActionsLocked(void* mock_obj)\n    GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex) {\n  internal::g_gmock_mutex.AssertHeld();\n\n  if (g_mock_object_registry.states().count(mock_obj) == 0) {\n    // No ON_CALL() was set on the given mock object.\n    return;\n  }\n\n  // Clears the default actions for each mock method in the given mock\n  // object.\n  FunctionMockers& mockers =\n      g_mock_object_registry.states()[mock_obj].function_mockers;\n  for (FunctionMockers::const_iterator it = mockers.begin();\n       it != mockers.end(); ++it) {\n    (*it)->ClearDefaultActionsLocked();\n  }\n\n  // We don't clear the content of mockers, as they may still be\n  // needed by VerifyAndClearExpectationsLocked().\n}\n\nExpectation::Expectation() {}\n\nExpectation::Expectation(\n    const internal::linked_ptr<internal::ExpectationBase>& an_expectation_base)\n    : expectation_base_(an_expectation_base) {}\n\nExpectation::~Expectation() {}\n\n// Adds an expectation to a sequence.\nvoid Sequence::AddExpectation(const Expectation& expectation) const {\n  if (*last_expectation_ != expectation) {\n    if (last_expectation_->expectation_base() != NULL) {\n      expectation.expectation_base()->immediate_prerequisites_\n          += *last_expectation_;\n    }\n    *last_expectation_ = expectation;\n  }\n}\n\n// Creates the implicit sequence if there isn't one.\nInSequence::InSequence() {\n  if (internal::g_gmock_implicit_sequence.get() == NULL) {\n    internal::g_gmock_implicit_sequence.set(new Sequence);\n    sequence_created_ = true;\n  } else {\n    sequence_created_ = false;\n  }\n}\n\n// Deletes the implicit sequence if it was created by the constructor\n// of this object.\nInSequence::~InSequence() {\n  if (sequence_created_) {\n    delete internal::g_gmock_implicit_sequence.get();\n    internal::g_gmock_implicit_sequence.set(NULL);\n  }\n}\n\n}  // namespace testing\n\n#ifdef _MSC_VER\n#if _MSC_VER <= 1900\n#  pragma warning(pop)\n#endif\n#endif\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/src/gmock.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include \"gmock/gmock.h\"\n#include \"gmock/internal/gmock-port.h\"\n\nnamespace testing {\n\n// FIXME: support using environment variables to\n// control the flag values, like what Google Test does.\n\nGMOCK_DEFINE_bool_(catch_leaked_mocks, true,\n                   \"true iff Google Mock should report leaked mock objects \"\n                   \"as failures.\");\n\nGMOCK_DEFINE_string_(verbose, internal::kWarningVerbosity,\n                     \"Controls how verbose Google Mock's output is.\"\n                     \"  Valid values:\\n\"\n                     \"  info    - prints all messages.\\n\"\n                     \"  warning - prints warnings and errors.\\n\"\n                     \"  error   - prints errors only.\");\n\nGMOCK_DEFINE_int32_(default_mock_behavior, 1,\n                    \"Controls the default behavior of mocks.\"\n                    \"  Valid values:\\n\"\n                    \"  0 - by default, mocks act as NiceMocks.\\n\"\n                    \"  1 - by default, mocks act as NaggyMocks.\\n\"\n                    \"  2 - by default, mocks act as StrictMocks.\");\n\nnamespace internal {\n\n// Parses a string as a command line flag.  The string should have the\n// format \"--gmock_flag=value\".  When def_optional is true, the\n// \"=value\" part can be omitted.\n//\n// Returns the value of the flag, or NULL if the parsing failed.\nstatic const char* ParseGoogleMockFlagValue(const char* str,\n                                            const char* flag,\n                                            bool def_optional) {\n  // str and flag must not be NULL.\n  if (str == NULL || flag == NULL) return NULL;\n\n  // The flag must start with \"--gmock_\".\n  const std::string flag_str = std::string(\"--gmock_\") + flag;\n  const size_t flag_len = flag_str.length();\n  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;\n\n  // Skips the flag name.\n  const char* flag_end = str + flag_len;\n\n  // When def_optional is true, it's OK to not have a \"=value\" part.\n  if (def_optional && (flag_end[0] == '\\0')) {\n    return flag_end;\n  }\n\n  // If def_optional is true and there are more characters after the\n  // flag name, or if def_optional is false, there must be a '=' after\n  // the flag name.\n  if (flag_end[0] != '=') return NULL;\n\n  // Returns the string after \"=\".\n  return flag_end + 1;\n}\n\n// Parses a string for a Google Mock bool flag, in the form of\n// \"--gmock_flag=value\".\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\nstatic bool ParseGoogleMockBoolFlag(const char* str, const char* flag,\n                                    bool* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseGoogleMockFlagValue(str, flag, true);\n\n  // Aborts if the parsing failed.\n  if (value_str == NULL) return false;\n\n  // Converts the string value to a bool.\n  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');\n  return true;\n}\n\n// Parses a string for a Google Mock string flag, in the form of\n// \"--gmock_flag=value\".\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\ntemplate <typename String>\nstatic bool ParseGoogleMockStringFlag(const char* str, const char* flag,\n                                      String* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseGoogleMockFlagValue(str, flag, false);\n\n  // Aborts if the parsing failed.\n  if (value_str == NULL) return false;\n\n  // Sets *value to the value of the flag.\n  *value = value_str;\n  return true;\n}\n\nstatic bool ParseGoogleMockIntFlag(const char* str, const char* flag,\n                                   int* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseGoogleMockFlagValue(str, flag, true);\n\n  // Aborts if the parsing failed.\n  if (value_str == NULL) return false;\n\n  // Sets *value to the value of the flag.\n  return ParseInt32(Message() << \"The value of flag --\" << flag,\n                    value_str, value);\n}\n\n// The internal implementation of InitGoogleMock().\n//\n// The type parameter CharType can be instantiated to either char or\n// wchar_t.\ntemplate <typename CharType>\nvoid InitGoogleMockImpl(int* argc, CharType** argv) {\n  // Makes sure Google Test is initialized.  InitGoogleTest() is\n  // idempotent, so it's fine if the user has already called it.\n  InitGoogleTest(argc, argv);\n  if (*argc <= 0) return;\n\n  for (int i = 1; i != *argc; i++) {\n    const std::string arg_string = StreamableToString(argv[i]);\n    const char* const arg = arg_string.c_str();\n\n    // Do we see a Google Mock flag?\n    if (ParseGoogleMockBoolFlag(arg, \"catch_leaked_mocks\",\n                                &GMOCK_FLAG(catch_leaked_mocks)) ||\n        ParseGoogleMockStringFlag(arg, \"verbose\", &GMOCK_FLAG(verbose)) ||\n        ParseGoogleMockIntFlag(arg, \"default_mock_behavior\",\n                               &GMOCK_FLAG(default_mock_behavior))) {\n      // Yes.  Shift the remainder of the argv list left by one.  Note\n      // that argv has (*argc + 1) elements, the last one always being\n      // NULL.  The following loop moves the trailing NULL element as\n      // well.\n      for (int j = i; j != *argc; j++) {\n        argv[j] = argv[j + 1];\n      }\n\n      // Decrements the argument count.\n      (*argc)--;\n\n      // We also need to decrement the iterator as we just removed\n      // an element.\n      i--;\n    }\n  }\n}\n\n}  // namespace internal\n\n// Initializes Google Mock.  This must be called before running the\n// tests.  In particular, it parses a command line for the flags that\n// Google Mock recognizes.  Whenever a Google Mock flag is seen, it is\n// removed from argv, and *argc is decremented.\n//\n// No value is returned.  Instead, the Google Mock flag variables are\n// updated.\n//\n// Since Google Test is needed for Google Mock to work, this function\n// also initializes Google Test and parses its flags, if that hasn't\n// been done.\nGTEST_API_ void InitGoogleMock(int* argc, char** argv) {\n  internal::InitGoogleMockImpl(argc, argv);\n}\n\n// This overloaded version can be used in Windows programs compiled in\n// UNICODE mode.\nGTEST_API_ void InitGoogleMock(int* argc, wchar_t** argv) {\n  internal::InitGoogleMockImpl(argc, argv);\n}\n\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/src/gmock_main.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include <iostream>\n#include \"gmock/gmock.h\"\n#include \"gtest/gtest.h\"\n\n// MS C++ compiler/linker has a bug on Windows (not on Windows CE), which\n// causes a link error when _tmain is defined in a static library and UNICODE\n// is enabled. For this reason instead of _tmain, main function is used on\n// Windows. See the following link to track the current status of this bug:\n// https://web.archive.org/web/20170912203238/connect.microsoft.com/VisualStudio/feedback/details/394464/wmain-link-error-in-the-static-library\n// // NOLINT\n#if GTEST_OS_WINDOWS_MOBILE\n# include <tchar.h>  // NOLINT\n\nGTEST_API_ int _tmain(int argc, TCHAR** argv) {\n#else\nGTEST_API_ int main(int argc, char** argv) {\n#endif  // GTEST_OS_WINDOWS_MOBILE\n  std::cout << \"Running main() from gmock_main.cc\\n\";\n  // Since Google Mock depends on Google Test, InitGoogleMock() is\n  // also responsible for initializing Google Test.  Therefore there's\n  // no need for calling testing::InitGoogleTest() separately.\n  testing::InitGoogleMock(&argc, argv);\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/BUILD.bazel",
    "content": "# Copyright 2017 Google Inc.\n# All Rights Reserved.\n#\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n# Author: misterg@google.com (Gennadiy Civil)\n#\n#   Bazel Build for Google C++ Testing Framework(Google Test)-googlemock\n\nlicenses([\"notice\"])\n\n\"\"\" gmock own tests \"\"\"\n\ncc_test(\n    name = \"gmock_all_test\",\n    size = \"small\",\n    srcs = glob(\n        include = [\n            \"gmock-*.cc\",\n        ],\n    ),\n    linkopts = select({\n        \"//:windows\": [],\n        \"//:windows_msvc\": [],\n        \"//conditions:default\": [\n            \"-pthread\",\n        ],\n    }),\n    deps = [\"//:gtest\"],\n)\n\n#  Py tests\n\npy_library(\n    name = \"gmock_test_utils\",\n    testonly = 1,\n    srcs = [\"gmock_test_utils.py\"],\n)\n\ncc_binary(\n    name = \"gmock_leak_test_\",\n    testonly = 1,\n    srcs = [\"gmock_leak_test_.cc\"],\n    deps = [\n        \"//:gtest_main\",\n    ],\n)\n\npy_test(\n    name = \"gmock_leak_test\",\n    size = \"medium\",\n    srcs = [\"gmock_leak_test.py\"],\n    data = [\n        \":gmock_leak_test_\",\n        \":gmock_test_utils\",\n    ],\n)\n\ncc_test(\n    name = \"gmock_link_test\",\n    size = \"small\",\n    srcs = [\n        \"gmock_link2_test.cc\",\n        \"gmock_link_test.cc\",\n        \"gmock_link_test.h\",\n    ],\n    deps = [\n        \"//:gtest_main\",\n    ],\n)\n\ncc_binary(\n    name = \"gmock_output_test_\",\n    srcs = [\"gmock_output_test_.cc\"],\n    deps = [\n        \"//:gtest\",\n    ],\n)\n\npy_test(\n    name = \"gmock_output_test\",\n    size = \"medium\",\n    srcs = [\"gmock_output_test.py\"],\n    data = [\n        \":gmock_output_test_\",\n        \":gmock_output_test_golden.txt\",\n    ],\n    deps = [\":gmock_test_utils\"],\n)\n\ncc_test(\n    name = \"gmock_test\",\n    size = \"small\",\n    srcs = [\"gmock_test.cc\"],\n    deps = [\n        \"//:gtest_main\",\n    ],\n)\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock-actions_test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file tests the built-in actions.\n\n// Silence C4800 (C4800: 'int *const ': forcing value\n// to bool 'true' or 'false') for MSVC 14,15\n#ifdef _MSC_VER\n#if _MSC_VER <= 1900\n#  pragma warning(push)\n#  pragma warning(disable:4800)\n#endif\n#endif\n\n#include \"gmock/gmock-actions.h\"\n#include <algorithm>\n#include <iterator>\n#include <memory>\n#include <string>\n#include \"gmock/gmock.h\"\n#include \"gmock/internal/gmock-port.h\"\n#include \"gtest/gtest.h\"\n#include \"gtest/gtest-spi.h\"\n\nnamespace {\n\n// This list should be kept sorted.\nusing testing::Action;\nusing testing::ActionInterface;\nusing testing::Assign;\nusing testing::ByMove;\nusing testing::ByRef;\nusing testing::DefaultValue;\nusing testing::DoDefault;\nusing testing::IgnoreResult;\nusing testing::Invoke;\nusing testing::InvokeWithoutArgs;\nusing testing::MakePolymorphicAction;\nusing testing::Ne;\nusing testing::PolymorphicAction;\nusing testing::Return;\nusing testing::ReturnNull;\nusing testing::ReturnRef;\nusing testing::ReturnRefOfCopy;\nusing testing::SetArgPointee;\nusing testing::SetArgumentPointee;\nusing testing::Unused;\nusing testing::_;\nusing testing::get;\nusing testing::internal::BuiltInDefaultValue;\nusing testing::internal::Int64;\nusing testing::internal::UInt64;\nusing testing::make_tuple;\nusing testing::tuple;\nusing testing::tuple_element;\n\n#if !GTEST_OS_WINDOWS_MOBILE\nusing testing::SetErrnoAndReturn;\n#endif\n\n// Tests that BuiltInDefaultValue<T*>::Get() returns NULL.\nTEST(BuiltInDefaultValueTest, IsNullForPointerTypes) {\n  EXPECT_TRUE(BuiltInDefaultValue<int*>::Get() == NULL);\n  EXPECT_TRUE(BuiltInDefaultValue<const char*>::Get() == NULL);\n  EXPECT_TRUE(BuiltInDefaultValue<void*>::Get() == NULL);\n}\n\n// Tests that BuiltInDefaultValue<T*>::Exists() return true.\nTEST(BuiltInDefaultValueTest, ExistsForPointerTypes) {\n  EXPECT_TRUE(BuiltInDefaultValue<int*>::Exists());\n  EXPECT_TRUE(BuiltInDefaultValue<const char*>::Exists());\n  EXPECT_TRUE(BuiltInDefaultValue<void*>::Exists());\n}\n\n// Tests that BuiltInDefaultValue<T>::Get() returns 0 when T is a\n// built-in numeric type.\nTEST(BuiltInDefaultValueTest, IsZeroForNumericTypes) {\n  EXPECT_EQ(0U, BuiltInDefaultValue<unsigned char>::Get());\n  EXPECT_EQ(0, BuiltInDefaultValue<signed char>::Get());\n  EXPECT_EQ(0, BuiltInDefaultValue<char>::Get());\n#if GMOCK_HAS_SIGNED_WCHAR_T_\n  EXPECT_EQ(0U, BuiltInDefaultValue<unsigned wchar_t>::Get());\n  EXPECT_EQ(0, BuiltInDefaultValue<signed wchar_t>::Get());\n#endif\n#if GMOCK_WCHAR_T_IS_NATIVE_\n#if !defined(__WCHAR_UNSIGNED__)\n  EXPECT_EQ(0, BuiltInDefaultValue<wchar_t>::Get());\n#else\n  EXPECT_EQ(0U, BuiltInDefaultValue<wchar_t>::Get());\n#endif\n#endif\n  EXPECT_EQ(0U, BuiltInDefaultValue<unsigned short>::Get());  // NOLINT\n  EXPECT_EQ(0, BuiltInDefaultValue<signed short>::Get());  // NOLINT\n  EXPECT_EQ(0, BuiltInDefaultValue<short>::Get());  // NOLINT\n  EXPECT_EQ(0U, BuiltInDefaultValue<unsigned int>::Get());\n  EXPECT_EQ(0, BuiltInDefaultValue<signed int>::Get());\n  EXPECT_EQ(0, BuiltInDefaultValue<int>::Get());\n  EXPECT_EQ(0U, BuiltInDefaultValue<unsigned long>::Get());  // NOLINT\n  EXPECT_EQ(0, BuiltInDefaultValue<signed long>::Get());  // NOLINT\n  EXPECT_EQ(0, BuiltInDefaultValue<long>::Get());  // NOLINT\n  EXPECT_EQ(0U, BuiltInDefaultValue<UInt64>::Get());\n  EXPECT_EQ(0, BuiltInDefaultValue<Int64>::Get());\n  EXPECT_EQ(0, BuiltInDefaultValue<float>::Get());\n  EXPECT_EQ(0, BuiltInDefaultValue<double>::Get());\n}\n\n// Tests that BuiltInDefaultValue<T>::Exists() returns true when T is a\n// built-in numeric type.\nTEST(BuiltInDefaultValueTest, ExistsForNumericTypes) {\n  EXPECT_TRUE(BuiltInDefaultValue<unsigned char>::Exists());\n  EXPECT_TRUE(BuiltInDefaultValue<signed char>::Exists());\n  EXPECT_TRUE(BuiltInDefaultValue<char>::Exists());\n#if GMOCK_HAS_SIGNED_WCHAR_T_\n  EXPECT_TRUE(BuiltInDefaultValue<unsigned wchar_t>::Exists());\n  EXPECT_TRUE(BuiltInDefaultValue<signed wchar_t>::Exists());\n#endif\n#if GMOCK_WCHAR_T_IS_NATIVE_\n  EXPECT_TRUE(BuiltInDefaultValue<wchar_t>::Exists());\n#endif\n  EXPECT_TRUE(BuiltInDefaultValue<unsigned short>::Exists());  // NOLINT\n  EXPECT_TRUE(BuiltInDefaultValue<signed short>::Exists());  // NOLINT\n  EXPECT_TRUE(BuiltInDefaultValue<short>::Exists());  // NOLINT\n  EXPECT_TRUE(BuiltInDefaultValue<unsigned int>::Exists());\n  EXPECT_TRUE(BuiltInDefaultValue<signed int>::Exists());\n  EXPECT_TRUE(BuiltInDefaultValue<int>::Exists());\n  EXPECT_TRUE(BuiltInDefaultValue<unsigned long>::Exists());  // NOLINT\n  EXPECT_TRUE(BuiltInDefaultValue<signed long>::Exists());  // NOLINT\n  EXPECT_TRUE(BuiltInDefaultValue<long>::Exists());  // NOLINT\n  EXPECT_TRUE(BuiltInDefaultValue<UInt64>::Exists());\n  EXPECT_TRUE(BuiltInDefaultValue<Int64>::Exists());\n  EXPECT_TRUE(BuiltInDefaultValue<float>::Exists());\n  EXPECT_TRUE(BuiltInDefaultValue<double>::Exists());\n}\n\n// Tests that BuiltInDefaultValue<bool>::Get() returns false.\nTEST(BuiltInDefaultValueTest, IsFalseForBool) {\n  EXPECT_FALSE(BuiltInDefaultValue<bool>::Get());\n}\n\n// Tests that BuiltInDefaultValue<bool>::Exists() returns true.\nTEST(BuiltInDefaultValueTest, BoolExists) {\n  EXPECT_TRUE(BuiltInDefaultValue<bool>::Exists());\n}\n\n// Tests that BuiltInDefaultValue<T>::Get() returns \"\" when T is a\n// string type.\nTEST(BuiltInDefaultValueTest, IsEmptyStringForString) {\n#if GTEST_HAS_GLOBAL_STRING\n  EXPECT_EQ(\"\", BuiltInDefaultValue< ::string>::Get());\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n  EXPECT_EQ(\"\", BuiltInDefaultValue< ::std::string>::Get());\n}\n\n// Tests that BuiltInDefaultValue<T>::Exists() returns true when T is a\n// string type.\nTEST(BuiltInDefaultValueTest, ExistsForString) {\n#if GTEST_HAS_GLOBAL_STRING\n  EXPECT_TRUE(BuiltInDefaultValue< ::string>::Exists());\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n  EXPECT_TRUE(BuiltInDefaultValue< ::std::string>::Exists());\n}\n\n// Tests that BuiltInDefaultValue<const T>::Get() returns the same\n// value as BuiltInDefaultValue<T>::Get() does.\nTEST(BuiltInDefaultValueTest, WorksForConstTypes) {\n  EXPECT_EQ(\"\", BuiltInDefaultValue<const std::string>::Get());\n  EXPECT_EQ(0, BuiltInDefaultValue<const int>::Get());\n  EXPECT_TRUE(BuiltInDefaultValue<char* const>::Get() == NULL);\n  EXPECT_FALSE(BuiltInDefaultValue<const bool>::Get());\n}\n\n// A type that's default constructible.\nclass MyDefaultConstructible {\n public:\n  MyDefaultConstructible() : value_(42) {}\n\n  int value() const { return value_; }\n\n private:\n  int value_;\n};\n\n// A type that's not default constructible.\nclass MyNonDefaultConstructible {\n public:\n  // Does not have a default ctor.\n  explicit MyNonDefaultConstructible(int a_value) : value_(a_value) {}\n\n  int value() const { return value_; }\n\n private:\n  int value_;\n};\n\n#if GTEST_LANG_CXX11\n\nTEST(BuiltInDefaultValueTest, ExistsForDefaultConstructibleType) {\n  EXPECT_TRUE(BuiltInDefaultValue<MyDefaultConstructible>::Exists());\n}\n\nTEST(BuiltInDefaultValueTest, IsDefaultConstructedForDefaultConstructibleType) {\n  EXPECT_EQ(42, BuiltInDefaultValue<MyDefaultConstructible>::Get().value());\n}\n\n#endif  // GTEST_LANG_CXX11\n\nTEST(BuiltInDefaultValueTest, DoesNotExistForNonDefaultConstructibleType) {\n  EXPECT_FALSE(BuiltInDefaultValue<MyNonDefaultConstructible>::Exists());\n}\n\n// Tests that BuiltInDefaultValue<T&>::Get() aborts the program.\nTEST(BuiltInDefaultValueDeathTest, IsUndefinedForReferences) {\n  EXPECT_DEATH_IF_SUPPORTED({\n    BuiltInDefaultValue<int&>::Get();\n  }, \"\");\n  EXPECT_DEATH_IF_SUPPORTED({\n    BuiltInDefaultValue<const char&>::Get();\n  }, \"\");\n}\n\nTEST(BuiltInDefaultValueDeathTest, IsUndefinedForNonDefaultConstructibleType) {\n  EXPECT_DEATH_IF_SUPPORTED({\n    BuiltInDefaultValue<MyNonDefaultConstructible>::Get();\n  }, \"\");\n}\n\n// Tests that DefaultValue<T>::IsSet() is false initially.\nTEST(DefaultValueTest, IsInitiallyUnset) {\n  EXPECT_FALSE(DefaultValue<int>::IsSet());\n  EXPECT_FALSE(DefaultValue<MyDefaultConstructible>::IsSet());\n  EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::IsSet());\n}\n\n// Tests that DefaultValue<T> can be set and then unset.\nTEST(DefaultValueTest, CanBeSetAndUnset) {\n  EXPECT_TRUE(DefaultValue<int>::Exists());\n  EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::Exists());\n\n  DefaultValue<int>::Set(1);\n  DefaultValue<const MyNonDefaultConstructible>::Set(\n      MyNonDefaultConstructible(42));\n\n  EXPECT_EQ(1, DefaultValue<int>::Get());\n  EXPECT_EQ(42, DefaultValue<const MyNonDefaultConstructible>::Get().value());\n\n  EXPECT_TRUE(DefaultValue<int>::Exists());\n  EXPECT_TRUE(DefaultValue<const MyNonDefaultConstructible>::Exists());\n\n  DefaultValue<int>::Clear();\n  DefaultValue<const MyNonDefaultConstructible>::Clear();\n\n  EXPECT_FALSE(DefaultValue<int>::IsSet());\n  EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::IsSet());\n\n  EXPECT_TRUE(DefaultValue<int>::Exists());\n  EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::Exists());\n}\n\n// Tests that DefaultValue<T>::Get() returns the\n// BuiltInDefaultValue<T>::Get() when DefaultValue<T>::IsSet() is\n// false.\nTEST(DefaultValueDeathTest, GetReturnsBuiltInDefaultValueWhenUnset) {\n  EXPECT_FALSE(DefaultValue<int>::IsSet());\n  EXPECT_TRUE(DefaultValue<int>::Exists());\n  EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible>::IsSet());\n  EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible>::Exists());\n\n  EXPECT_EQ(0, DefaultValue<int>::Get());\n\n  EXPECT_DEATH_IF_SUPPORTED({\n    DefaultValue<MyNonDefaultConstructible>::Get();\n  }, \"\");\n}\n\n#if GTEST_HAS_STD_UNIQUE_PTR_\nTEST(DefaultValueTest, GetWorksForMoveOnlyIfSet) {\n  EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Exists());\n  EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Get() == NULL);\n  DefaultValue<std::unique_ptr<int>>::SetFactory([] {\n    return std::unique_ptr<int>(new int(42));\n  });\n  EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Exists());\n  std::unique_ptr<int> i = DefaultValue<std::unique_ptr<int>>::Get();\n  EXPECT_EQ(42, *i);\n}\n#endif  // GTEST_HAS_STD_UNIQUE_PTR_\n\n// Tests that DefaultValue<void>::Get() returns void.\nTEST(DefaultValueTest, GetWorksForVoid) {\n  return DefaultValue<void>::Get();\n}\n\n// Tests using DefaultValue with a reference type.\n\n// Tests that DefaultValue<T&>::IsSet() is false initially.\nTEST(DefaultValueOfReferenceTest, IsInitiallyUnset) {\n  EXPECT_FALSE(DefaultValue<int&>::IsSet());\n  EXPECT_FALSE(DefaultValue<MyDefaultConstructible&>::IsSet());\n  EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::IsSet());\n}\n\n// Tests that DefaultValue<T&>::Exists is false initiallly.\nTEST(DefaultValueOfReferenceTest, IsInitiallyNotExisting) {\n  EXPECT_FALSE(DefaultValue<int&>::Exists());\n  EXPECT_FALSE(DefaultValue<MyDefaultConstructible&>::Exists());\n  EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::Exists());\n}\n\n// Tests that DefaultValue<T&> can be set and then unset.\nTEST(DefaultValueOfReferenceTest, CanBeSetAndUnset) {\n  int n = 1;\n  DefaultValue<const int&>::Set(n);\n  MyNonDefaultConstructible x(42);\n  DefaultValue<MyNonDefaultConstructible&>::Set(x);\n\n  EXPECT_TRUE(DefaultValue<const int&>::Exists());\n  EXPECT_TRUE(DefaultValue<MyNonDefaultConstructible&>::Exists());\n\n  EXPECT_EQ(&n, &(DefaultValue<const int&>::Get()));\n  EXPECT_EQ(&x, &(DefaultValue<MyNonDefaultConstructible&>::Get()));\n\n  DefaultValue<const int&>::Clear();\n  DefaultValue<MyNonDefaultConstructible&>::Clear();\n\n  EXPECT_FALSE(DefaultValue<const int&>::Exists());\n  EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::Exists());\n\n  EXPECT_FALSE(DefaultValue<const int&>::IsSet());\n  EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::IsSet());\n}\n\n// Tests that DefaultValue<T&>::Get() returns the\n// BuiltInDefaultValue<T&>::Get() when DefaultValue<T&>::IsSet() is\n// false.\nTEST(DefaultValueOfReferenceDeathTest, GetReturnsBuiltInDefaultValueWhenUnset) {\n  EXPECT_FALSE(DefaultValue<int&>::IsSet());\n  EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::IsSet());\n\n  EXPECT_DEATH_IF_SUPPORTED({\n    DefaultValue<int&>::Get();\n  }, \"\");\n  EXPECT_DEATH_IF_SUPPORTED({\n    DefaultValue<MyNonDefaultConstructible>::Get();\n  }, \"\");\n}\n\n// Tests that ActionInterface can be implemented by defining the\n// Perform method.\n\ntypedef int MyGlobalFunction(bool, int);\n\nclass MyActionImpl : public ActionInterface<MyGlobalFunction> {\n public:\n  virtual int Perform(const tuple<bool, int>& args) {\n    return get<0>(args) ? get<1>(args) : 0;\n  }\n};\n\nTEST(ActionInterfaceTest, CanBeImplementedByDefiningPerform) {\n  MyActionImpl my_action_impl;\n  (void)my_action_impl;\n}\n\nTEST(ActionInterfaceTest, MakeAction) {\n  Action<MyGlobalFunction> action = MakeAction(new MyActionImpl);\n\n  // When exercising the Perform() method of Action<F>, we must pass\n  // it a tuple whose size and type are compatible with F's argument\n  // types.  For example, if F is int(), then Perform() takes a\n  // 0-tuple; if F is void(bool, int), then Perform() takes a\n  // tuple<bool, int>, and so on.\n  EXPECT_EQ(5, action.Perform(make_tuple(true, 5)));\n}\n\n// Tests that Action<F> can be contructed from a pointer to\n// ActionInterface<F>.\nTEST(ActionTest, CanBeConstructedFromActionInterface) {\n  Action<MyGlobalFunction> action(new MyActionImpl);\n}\n\n// Tests that Action<F> delegates actual work to ActionInterface<F>.\nTEST(ActionTest, DelegatesWorkToActionInterface) {\n  const Action<MyGlobalFunction> action(new MyActionImpl);\n\n  EXPECT_EQ(5, action.Perform(make_tuple(true, 5)));\n  EXPECT_EQ(0, action.Perform(make_tuple(false, 1)));\n}\n\n// Tests that Action<F> can be copied.\nTEST(ActionTest, IsCopyable) {\n  Action<MyGlobalFunction> a1(new MyActionImpl);\n  Action<MyGlobalFunction> a2(a1);  // Tests the copy constructor.\n\n  // a1 should continue to work after being copied from.\n  EXPECT_EQ(5, a1.Perform(make_tuple(true, 5)));\n  EXPECT_EQ(0, a1.Perform(make_tuple(false, 1)));\n\n  // a2 should work like the action it was copied from.\n  EXPECT_EQ(5, a2.Perform(make_tuple(true, 5)));\n  EXPECT_EQ(0, a2.Perform(make_tuple(false, 1)));\n\n  a2 = a1;  // Tests the assignment operator.\n\n  // a1 should continue to work after being copied from.\n  EXPECT_EQ(5, a1.Perform(make_tuple(true, 5)));\n  EXPECT_EQ(0, a1.Perform(make_tuple(false, 1)));\n\n  // a2 should work like the action it was copied from.\n  EXPECT_EQ(5, a2.Perform(make_tuple(true, 5)));\n  EXPECT_EQ(0, a2.Perform(make_tuple(false, 1)));\n}\n\n// Tests that an Action<From> object can be converted to a\n// compatible Action<To> object.\n\nclass IsNotZero : public ActionInterface<bool(int)> {  // NOLINT\n public:\n  virtual bool Perform(const tuple<int>& arg) {\n    return get<0>(arg) != 0;\n  }\n};\n\n#if !GTEST_OS_SYMBIAN\n// Compiling this test on Nokia's Symbian compiler fails with:\n//  'Result' is not a member of class 'testing::internal::Function<int>'\n//  (point of instantiation: '@unnamed@gmock_actions_test_cc@::\n//      ActionTest_CanBeConvertedToOtherActionType_Test::TestBody()')\n// with no obvious fix.\nTEST(ActionTest, CanBeConvertedToOtherActionType) {\n  const Action<bool(int)> a1(new IsNotZero);  // NOLINT\n  const Action<int(char)> a2 = Action<int(char)>(a1);  // NOLINT\n  EXPECT_EQ(1, a2.Perform(make_tuple('a')));\n  EXPECT_EQ(0, a2.Perform(make_tuple('\\0')));\n}\n#endif  // !GTEST_OS_SYMBIAN\n\n// The following two classes are for testing MakePolymorphicAction().\n\n// Implements a polymorphic action that returns the second of the\n// arguments it receives.\nclass ReturnSecondArgumentAction {\n public:\n  // We want to verify that MakePolymorphicAction() can work with a\n  // polymorphic action whose Perform() method template is either\n  // const or not.  This lets us verify the non-const case.\n  template <typename Result, typename ArgumentTuple>\n  Result Perform(const ArgumentTuple& args) { return get<1>(args); }\n};\n\n// Implements a polymorphic action that can be used in a nullary\n// function to return 0.\nclass ReturnZeroFromNullaryFunctionAction {\n public:\n  // For testing that MakePolymorphicAction() works when the\n  // implementation class' Perform() method template takes only one\n  // template parameter.\n  //\n  // We want to verify that MakePolymorphicAction() can work with a\n  // polymorphic action whose Perform() method template is either\n  // const or not.  This lets us verify the const case.\n  template <typename Result>\n  Result Perform(const tuple<>&) const { return 0; }\n};\n\n// These functions verify that MakePolymorphicAction() returns a\n// PolymorphicAction<T> where T is the argument's type.\n\nPolymorphicAction<ReturnSecondArgumentAction> ReturnSecondArgument() {\n  return MakePolymorphicAction(ReturnSecondArgumentAction());\n}\n\nPolymorphicAction<ReturnZeroFromNullaryFunctionAction>\nReturnZeroFromNullaryFunction() {\n  return MakePolymorphicAction(ReturnZeroFromNullaryFunctionAction());\n}\n\n// Tests that MakePolymorphicAction() turns a polymorphic action\n// implementation class into a polymorphic action.\nTEST(MakePolymorphicActionTest, ConstructsActionFromImpl) {\n  Action<int(bool, int, double)> a1 = ReturnSecondArgument();  // NOLINT\n  EXPECT_EQ(5, a1.Perform(make_tuple(false, 5, 2.0)));\n}\n\n// Tests that MakePolymorphicAction() works when the implementation\n// class' Perform() method template has only one template parameter.\nTEST(MakePolymorphicActionTest, WorksWhenPerformHasOneTemplateParameter) {\n  Action<int()> a1 = ReturnZeroFromNullaryFunction();\n  EXPECT_EQ(0, a1.Perform(make_tuple()));\n\n  Action<void*()> a2 = ReturnZeroFromNullaryFunction();\n  EXPECT_TRUE(a2.Perform(make_tuple()) == NULL);\n}\n\n// Tests that Return() works as an action for void-returning\n// functions.\nTEST(ReturnTest, WorksForVoid) {\n  const Action<void(int)> ret = Return();  // NOLINT\n  return ret.Perform(make_tuple(1));\n}\n\n// Tests that Return(v) returns v.\nTEST(ReturnTest, ReturnsGivenValue) {\n  Action<int()> ret = Return(1);  // NOLINT\n  EXPECT_EQ(1, ret.Perform(make_tuple()));\n\n  ret = Return(-5);\n  EXPECT_EQ(-5, ret.Perform(make_tuple()));\n}\n\n// Tests that Return(\"string literal\") works.\nTEST(ReturnTest, AcceptsStringLiteral) {\n  Action<const char*()> a1 = Return(\"Hello\");\n  EXPECT_STREQ(\"Hello\", a1.Perform(make_tuple()));\n\n  Action<std::string()> a2 = Return(\"world\");\n  EXPECT_EQ(\"world\", a2.Perform(make_tuple()));\n}\n\n// Test struct which wraps a vector of integers. Used in\n// 'SupportsWrapperReturnType' test.\nstruct IntegerVectorWrapper {\n  std::vector<int> * v;\n  IntegerVectorWrapper(std::vector<int>& _v) : v(&_v) {}  // NOLINT\n};\n\n// Tests that Return() works when return type is a wrapper type.\nTEST(ReturnTest, SupportsWrapperReturnType) {\n  // Initialize vector of integers.\n  std::vector<int> v;\n  for (int i = 0; i < 5; ++i) v.push_back(i);\n\n  // Return() called with 'v' as argument. The Action will return the same data\n  // as 'v' (copy) but it will be wrapped in an IntegerVectorWrapper.\n  Action<IntegerVectorWrapper()> a = Return(v);\n  const std::vector<int>& result = *(a.Perform(make_tuple()).v);\n  EXPECT_THAT(result, ::testing::ElementsAre(0, 1, 2, 3, 4));\n}\n\n// Tests that Return(v) is covaraint.\n\nstruct Base {\n  bool operator==(const Base&) { return true; }\n};\n\nstruct Derived : public Base {\n  bool operator==(const Derived&) { return true; }\n};\n\nTEST(ReturnTest, IsCovariant) {\n  Base base;\n  Derived derived;\n  Action<Base*()> ret = Return(&base);\n  EXPECT_EQ(&base, ret.Perform(make_tuple()));\n\n  ret = Return(&derived);\n  EXPECT_EQ(&derived, ret.Perform(make_tuple()));\n}\n\n// Tests that the type of the value passed into Return is converted into T\n// when the action is cast to Action<T(...)> rather than when the action is\n// performed. See comments on testing::internal::ReturnAction in\n// gmock-actions.h for more information.\nclass FromType {\n public:\n  explicit FromType(bool* is_converted) : converted_(is_converted) {}\n  bool* converted() const { return converted_; }\n\n private:\n  bool* const converted_;\n\n  GTEST_DISALLOW_ASSIGN_(FromType);\n};\n\nclass ToType {\n public:\n  // Must allow implicit conversion due to use in ImplicitCast_<T>.\n  ToType(const FromType& x) { *x.converted() = true; }  // NOLINT\n};\n\nTEST(ReturnTest, ConvertsArgumentWhenConverted) {\n  bool converted = false;\n  FromType x(&converted);\n  Action<ToType()> action(Return(x));\n  EXPECT_TRUE(converted) << \"Return must convert its argument in its own \"\n                         << \"conversion operator.\";\n  converted = false;\n  action.Perform(tuple<>());\n  EXPECT_FALSE(converted) << \"Action must NOT convert its argument \"\n                          << \"when performed.\";\n}\n\nclass DestinationType {};\n\nclass SourceType {\n public:\n  // Note: a non-const typecast operator.\n  operator DestinationType() { return DestinationType(); }\n};\n\nTEST(ReturnTest, CanConvertArgumentUsingNonConstTypeCastOperator) {\n  SourceType s;\n  Action<DestinationType()> action(Return(s));\n}\n\n// Tests that ReturnNull() returns NULL in a pointer-returning function.\nTEST(ReturnNullTest, WorksInPointerReturningFunction) {\n  const Action<int*()> a1 = ReturnNull();\n  EXPECT_TRUE(a1.Perform(make_tuple()) == NULL);\n\n  const Action<const char*(bool)> a2 = ReturnNull();  // NOLINT\n  EXPECT_TRUE(a2.Perform(make_tuple(true)) == NULL);\n}\n\n#if GTEST_HAS_STD_UNIQUE_PTR_\n// Tests that ReturnNull() returns NULL for shared_ptr and unique_ptr returning\n// functions.\nTEST(ReturnNullTest, WorksInSmartPointerReturningFunction) {\n  const Action<std::unique_ptr<const int>()> a1 = ReturnNull();\n  EXPECT_TRUE(a1.Perform(make_tuple()) == nullptr);\n\n  const Action<std::shared_ptr<int>(std::string)> a2 = ReturnNull();\n  EXPECT_TRUE(a2.Perform(make_tuple(\"foo\")) == nullptr);\n}\n#endif  // GTEST_HAS_STD_UNIQUE_PTR_\n\n// Tests that ReturnRef(v) works for reference types.\nTEST(ReturnRefTest, WorksForReference) {\n  const int n = 0;\n  const Action<const int&(bool)> ret = ReturnRef(n);  // NOLINT\n\n  EXPECT_EQ(&n, &ret.Perform(make_tuple(true)));\n}\n\n// Tests that ReturnRef(v) is covariant.\nTEST(ReturnRefTest, IsCovariant) {\n  Base base;\n  Derived derived;\n  Action<Base&()> a = ReturnRef(base);\n  EXPECT_EQ(&base, &a.Perform(make_tuple()));\n\n  a = ReturnRef(derived);\n  EXPECT_EQ(&derived, &a.Perform(make_tuple()));\n}\n\n// Tests that ReturnRefOfCopy(v) works for reference types.\nTEST(ReturnRefOfCopyTest, WorksForReference) {\n  int n = 42;\n  const Action<const int&()> ret = ReturnRefOfCopy(n);\n\n  EXPECT_NE(&n, &ret.Perform(make_tuple()));\n  EXPECT_EQ(42, ret.Perform(make_tuple()));\n\n  n = 43;\n  EXPECT_NE(&n, &ret.Perform(make_tuple()));\n  EXPECT_EQ(42, ret.Perform(make_tuple()));\n}\n\n// Tests that ReturnRefOfCopy(v) is covariant.\nTEST(ReturnRefOfCopyTest, IsCovariant) {\n  Base base;\n  Derived derived;\n  Action<Base&()> a = ReturnRefOfCopy(base);\n  EXPECT_NE(&base, &a.Perform(make_tuple()));\n\n  a = ReturnRefOfCopy(derived);\n  EXPECT_NE(&derived, &a.Perform(make_tuple()));\n}\n\n// Tests that DoDefault() does the default action for the mock method.\n\nclass MockClass {\n public:\n  MockClass() {}\n\n  MOCK_METHOD1(IntFunc, int(bool flag));  // NOLINT\n  MOCK_METHOD0(Foo, MyNonDefaultConstructible());\n#if GTEST_HAS_STD_UNIQUE_PTR_\n  MOCK_METHOD0(MakeUnique, std::unique_ptr<int>());\n  MOCK_METHOD0(MakeUniqueBase, std::unique_ptr<Base>());\n  MOCK_METHOD0(MakeVectorUnique, std::vector<std::unique_ptr<int>>());\n  MOCK_METHOD1(TakeUnique, int(std::unique_ptr<int>));\n  MOCK_METHOD2(TakeUnique,\n               int(const std::unique_ptr<int>&, std::unique_ptr<int>));\n#endif\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockClass);\n};\n\n// Tests that DoDefault() returns the built-in default value for the\n// return type by default.\nTEST(DoDefaultTest, ReturnsBuiltInDefaultValueByDefault) {\n  MockClass mock;\n  EXPECT_CALL(mock, IntFunc(_))\n      .WillOnce(DoDefault());\n  EXPECT_EQ(0, mock.IntFunc(true));\n}\n\n// Tests that DoDefault() throws (when exceptions are enabled) or aborts\n// the process when there is no built-in default value for the return type.\nTEST(DoDefaultDeathTest, DiesForUnknowType) {\n  MockClass mock;\n  EXPECT_CALL(mock, Foo())\n      .WillRepeatedly(DoDefault());\n#if GTEST_HAS_EXCEPTIONS\n  EXPECT_ANY_THROW(mock.Foo());\n#else\n  EXPECT_DEATH_IF_SUPPORTED({\n    mock.Foo();\n  }, \"\");\n#endif\n}\n\n// Tests that using DoDefault() inside a composite action leads to a\n// run-time error.\n\nvoid VoidFunc(bool /* flag */) {}\n\nTEST(DoDefaultDeathTest, DiesIfUsedInCompositeAction) {\n  MockClass mock;\n  EXPECT_CALL(mock, IntFunc(_))\n      .WillRepeatedly(DoAll(Invoke(VoidFunc),\n                            DoDefault()));\n\n  // Ideally we should verify the error message as well.  Sadly,\n  // EXPECT_DEATH() can only capture stderr, while Google Mock's\n  // errors are printed on stdout.  Therefore we have to settle for\n  // not verifying the message.\n  EXPECT_DEATH_IF_SUPPORTED({\n    mock.IntFunc(true);\n  }, \"\");\n}\n\n// Tests that DoDefault() returns the default value set by\n// DefaultValue<T>::Set() when it's not overriden by an ON_CALL().\nTEST(DoDefaultTest, ReturnsUserSpecifiedPerTypeDefaultValueWhenThereIsOne) {\n  DefaultValue<int>::Set(1);\n  MockClass mock;\n  EXPECT_CALL(mock, IntFunc(_))\n      .WillOnce(DoDefault());\n  EXPECT_EQ(1, mock.IntFunc(false));\n  DefaultValue<int>::Clear();\n}\n\n// Tests that DoDefault() does the action specified by ON_CALL().\nTEST(DoDefaultTest, DoesWhatOnCallSpecifies) {\n  MockClass mock;\n  ON_CALL(mock, IntFunc(_))\n      .WillByDefault(Return(2));\n  EXPECT_CALL(mock, IntFunc(_))\n      .WillOnce(DoDefault());\n  EXPECT_EQ(2, mock.IntFunc(false));\n}\n\n// Tests that using DoDefault() in ON_CALL() leads to a run-time failure.\nTEST(DoDefaultTest, CannotBeUsedInOnCall) {\n  MockClass mock;\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    ON_CALL(mock, IntFunc(_))\n      .WillByDefault(DoDefault());\n  }, \"DoDefault() cannot be used in ON_CALL()\");\n}\n\n// Tests that SetArgPointee<N>(v) sets the variable pointed to by\n// the N-th (0-based) argument to v.\nTEST(SetArgPointeeTest, SetsTheNthPointee) {\n  typedef void MyFunction(bool, int*, char*);\n  Action<MyFunction> a = SetArgPointee<1>(2);\n\n  int n = 0;\n  char ch = '\\0';\n  a.Perform(make_tuple(true, &n, &ch));\n  EXPECT_EQ(2, n);\n  EXPECT_EQ('\\0', ch);\n\n  a = SetArgPointee<2>('a');\n  n = 0;\n  ch = '\\0';\n  a.Perform(make_tuple(true, &n, &ch));\n  EXPECT_EQ(0, n);\n  EXPECT_EQ('a', ch);\n}\n\n#if !((GTEST_GCC_VER_ && GTEST_GCC_VER_ < 40000) || GTEST_OS_SYMBIAN)\n// Tests that SetArgPointee<N>() accepts a string literal.\n// GCC prior to v4.0 and the Symbian compiler do not support this.\nTEST(SetArgPointeeTest, AcceptsStringLiteral) {\n  typedef void MyFunction(std::string*, const char**);\n  Action<MyFunction> a = SetArgPointee<0>(\"hi\");\n  std::string str;\n  const char* ptr = NULL;\n  a.Perform(make_tuple(&str, &ptr));\n  EXPECT_EQ(\"hi\", str);\n  EXPECT_TRUE(ptr == NULL);\n\n  a = SetArgPointee<1>(\"world\");\n  str = \"\";\n  a.Perform(make_tuple(&str, &ptr));\n  EXPECT_EQ(\"\", str);\n  EXPECT_STREQ(\"world\", ptr);\n}\n\nTEST(SetArgPointeeTest, AcceptsWideStringLiteral) {\n  typedef void MyFunction(const wchar_t**);\n  Action<MyFunction> a = SetArgPointee<0>(L\"world\");\n  const wchar_t* ptr = NULL;\n  a.Perform(make_tuple(&ptr));\n  EXPECT_STREQ(L\"world\", ptr);\n\n# if GTEST_HAS_STD_WSTRING\n\n  typedef void MyStringFunction(std::wstring*);\n  Action<MyStringFunction> a2 = SetArgPointee<0>(L\"world\");\n  std::wstring str = L\"\";\n  a2.Perform(make_tuple(&str));\n  EXPECT_EQ(L\"world\", str);\n\n# endif\n}\n#endif\n\n// Tests that SetArgPointee<N>() accepts a char pointer.\nTEST(SetArgPointeeTest, AcceptsCharPointer) {\n  typedef void MyFunction(bool, std::string*, const char**);\n  const char* const hi = \"hi\";\n  Action<MyFunction> a = SetArgPointee<1>(hi);\n  std::string str;\n  const char* ptr = NULL;\n  a.Perform(make_tuple(true, &str, &ptr));\n  EXPECT_EQ(\"hi\", str);\n  EXPECT_TRUE(ptr == NULL);\n\n  char world_array[] = \"world\";\n  char* const world = world_array;\n  a = SetArgPointee<2>(world);\n  str = \"\";\n  a.Perform(make_tuple(true, &str, &ptr));\n  EXPECT_EQ(\"\", str);\n  EXPECT_EQ(world, ptr);\n}\n\nTEST(SetArgPointeeTest, AcceptsWideCharPointer) {\n  typedef void MyFunction(bool, const wchar_t**);\n  const wchar_t* const hi = L\"hi\";\n  Action<MyFunction> a = SetArgPointee<1>(hi);\n  const wchar_t* ptr = NULL;\n  a.Perform(make_tuple(true, &ptr));\n  EXPECT_EQ(hi, ptr);\n\n# if GTEST_HAS_STD_WSTRING\n\n  typedef void MyStringFunction(bool, std::wstring*);\n  wchar_t world_array[] = L\"world\";\n  wchar_t* const world = world_array;\n  Action<MyStringFunction> a2 = SetArgPointee<1>(world);\n  std::wstring str;\n  a2.Perform(make_tuple(true, &str));\n  EXPECT_EQ(world_array, str);\n# endif\n}\n\n// Tests that SetArgumentPointee<N>(v) sets the variable pointed to by\n// the N-th (0-based) argument to v.\nTEST(SetArgumentPointeeTest, SetsTheNthPointee) {\n  typedef void MyFunction(bool, int*, char*);\n  Action<MyFunction> a = SetArgumentPointee<1>(2);\n\n  int n = 0;\n  char ch = '\\0';\n  a.Perform(make_tuple(true, &n, &ch));\n  EXPECT_EQ(2, n);\n  EXPECT_EQ('\\0', ch);\n\n  a = SetArgumentPointee<2>('a');\n  n = 0;\n  ch = '\\0';\n  a.Perform(make_tuple(true, &n, &ch));\n  EXPECT_EQ(0, n);\n  EXPECT_EQ('a', ch);\n}\n\n// Sample functions and functors for testing Invoke() and etc.\nint Nullary() { return 1; }\n\nclass NullaryFunctor {\n public:\n  int operator()() { return 2; }\n};\n\nbool g_done = false;\nvoid VoidNullary() { g_done = true; }\n\nclass VoidNullaryFunctor {\n public:\n  void operator()() { g_done = true; }\n};\n\nclass Foo {\n public:\n  Foo() : value_(123) {}\n\n  int Nullary() const { return value_; }\n\n private:\n  int value_;\n};\n\n// Tests InvokeWithoutArgs(function).\nTEST(InvokeWithoutArgsTest, Function) {\n  // As an action that takes one argument.\n  Action<int(int)> a = InvokeWithoutArgs(Nullary);  // NOLINT\n  EXPECT_EQ(1, a.Perform(make_tuple(2)));\n\n  // As an action that takes two arguments.\n  Action<int(int, double)> a2 = InvokeWithoutArgs(Nullary);  // NOLINT\n  EXPECT_EQ(1, a2.Perform(make_tuple(2, 3.5)));\n\n  // As an action that returns void.\n  Action<void(int)> a3 = InvokeWithoutArgs(VoidNullary);  // NOLINT\n  g_done = false;\n  a3.Perform(make_tuple(1));\n  EXPECT_TRUE(g_done);\n}\n\n// Tests InvokeWithoutArgs(functor).\nTEST(InvokeWithoutArgsTest, Functor) {\n  // As an action that takes no argument.\n  Action<int()> a = InvokeWithoutArgs(NullaryFunctor());  // NOLINT\n  EXPECT_EQ(2, a.Perform(make_tuple()));\n\n  // As an action that takes three arguments.\n  Action<int(int, double, char)> a2 =  // NOLINT\n      InvokeWithoutArgs(NullaryFunctor());\n  EXPECT_EQ(2, a2.Perform(make_tuple(3, 3.5, 'a')));\n\n  // As an action that returns void.\n  Action<void()> a3 = InvokeWithoutArgs(VoidNullaryFunctor());\n  g_done = false;\n  a3.Perform(make_tuple());\n  EXPECT_TRUE(g_done);\n}\n\n// Tests InvokeWithoutArgs(obj_ptr, method).\nTEST(InvokeWithoutArgsTest, Method) {\n  Foo foo;\n  Action<int(bool, char)> a =  // NOLINT\n      InvokeWithoutArgs(&foo, &Foo::Nullary);\n  EXPECT_EQ(123, a.Perform(make_tuple(true, 'a')));\n}\n\n// Tests using IgnoreResult() on a polymorphic action.\nTEST(IgnoreResultTest, PolymorphicAction) {\n  Action<void(int)> a = IgnoreResult(Return(5));  // NOLINT\n  a.Perform(make_tuple(1));\n}\n\n// Tests using IgnoreResult() on a monomorphic action.\n\nint ReturnOne() {\n  g_done = true;\n  return 1;\n}\n\nTEST(IgnoreResultTest, MonomorphicAction) {\n  g_done = false;\n  Action<void()> a = IgnoreResult(Invoke(ReturnOne));\n  a.Perform(make_tuple());\n  EXPECT_TRUE(g_done);\n}\n\n// Tests using IgnoreResult() on an action that returns a class type.\n\nMyNonDefaultConstructible ReturnMyNonDefaultConstructible(double /* x */) {\n  g_done = true;\n  return MyNonDefaultConstructible(42);\n}\n\nTEST(IgnoreResultTest, ActionReturningClass) {\n  g_done = false;\n  Action<void(int)> a =\n      IgnoreResult(Invoke(ReturnMyNonDefaultConstructible));  // NOLINT\n  a.Perform(make_tuple(2));\n  EXPECT_TRUE(g_done);\n}\n\nTEST(AssignTest, Int) {\n  int x = 0;\n  Action<void(int)> a = Assign(&x, 5);\n  a.Perform(make_tuple(0));\n  EXPECT_EQ(5, x);\n}\n\nTEST(AssignTest, String) {\n  ::std::string x;\n  Action<void(void)> a = Assign(&x, \"Hello, world\");\n  a.Perform(make_tuple());\n  EXPECT_EQ(\"Hello, world\", x);\n}\n\nTEST(AssignTest, CompatibleTypes) {\n  double x = 0;\n  Action<void(int)> a = Assign(&x, 5);\n  a.Perform(make_tuple(0));\n  EXPECT_DOUBLE_EQ(5, x);\n}\n\n#if !GTEST_OS_WINDOWS_MOBILE\n\nclass SetErrnoAndReturnTest : public testing::Test {\n protected:\n  virtual void SetUp() { errno = 0; }\n  virtual void TearDown() { errno = 0; }\n};\n\nTEST_F(SetErrnoAndReturnTest, Int) {\n  Action<int(void)> a = SetErrnoAndReturn(ENOTTY, -5);\n  EXPECT_EQ(-5, a.Perform(make_tuple()));\n  EXPECT_EQ(ENOTTY, errno);\n}\n\nTEST_F(SetErrnoAndReturnTest, Ptr) {\n  int x;\n  Action<int*(void)> a = SetErrnoAndReturn(ENOTTY, &x);\n  EXPECT_EQ(&x, a.Perform(make_tuple()));\n  EXPECT_EQ(ENOTTY, errno);\n}\n\nTEST_F(SetErrnoAndReturnTest, CompatibleTypes) {\n  Action<double()> a = SetErrnoAndReturn(EINVAL, 5);\n  EXPECT_DOUBLE_EQ(5.0, a.Perform(make_tuple()));\n  EXPECT_EQ(EINVAL, errno);\n}\n\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\n// Tests ByRef().\n\n// Tests that ReferenceWrapper<T> is copyable.\nTEST(ByRefTest, IsCopyable) {\n  const std::string s1 = \"Hi\";\n  const std::string s2 = \"Hello\";\n\n  ::testing::internal::ReferenceWrapper<const std::string> ref_wrapper =\n      ByRef(s1);\n  const std::string& r1 = ref_wrapper;\n  EXPECT_EQ(&s1, &r1);\n\n  // Assigns a new value to ref_wrapper.\n  ref_wrapper = ByRef(s2);\n  const std::string& r2 = ref_wrapper;\n  EXPECT_EQ(&s2, &r2);\n\n  ::testing::internal::ReferenceWrapper<const std::string> ref_wrapper1 =\n      ByRef(s1);\n  // Copies ref_wrapper1 to ref_wrapper.\n  ref_wrapper = ref_wrapper1;\n  const std::string& r3 = ref_wrapper;\n  EXPECT_EQ(&s1, &r3);\n}\n\n// Tests using ByRef() on a const value.\nTEST(ByRefTest, ConstValue) {\n  const int n = 0;\n  // int& ref = ByRef(n);  // This shouldn't compile - we have a\n                           // negative compilation test to catch it.\n  const int& const_ref = ByRef(n);\n  EXPECT_EQ(&n, &const_ref);\n}\n\n// Tests using ByRef() on a non-const value.\nTEST(ByRefTest, NonConstValue) {\n  int n = 0;\n\n  // ByRef(n) can be used as either an int&,\n  int& ref = ByRef(n);\n  EXPECT_EQ(&n, &ref);\n\n  // or a const int&.\n  const int& const_ref = ByRef(n);\n  EXPECT_EQ(&n, &const_ref);\n}\n\n// Tests explicitly specifying the type when using ByRef().\nTEST(ByRefTest, ExplicitType) {\n  int n = 0;\n  const int& r1 = ByRef<const int>(n);\n  EXPECT_EQ(&n, &r1);\n\n  // ByRef<char>(n);  // This shouldn't compile - we have a negative\n                      // compilation test to catch it.\n\n  Derived d;\n  Derived& r2 = ByRef<Derived>(d);\n  EXPECT_EQ(&d, &r2);\n\n  const Derived& r3 = ByRef<const Derived>(d);\n  EXPECT_EQ(&d, &r3);\n\n  Base& r4 = ByRef<Base>(d);\n  EXPECT_EQ(&d, &r4);\n\n  const Base& r5 = ByRef<const Base>(d);\n  EXPECT_EQ(&d, &r5);\n\n  // The following shouldn't compile - we have a negative compilation\n  // test for it.\n  //\n  // Base b;\n  // ByRef<Derived>(b);\n}\n\n// Tests that Google Mock prints expression ByRef(x) as a reference to x.\nTEST(ByRefTest, PrintsCorrectly) {\n  int n = 42;\n  ::std::stringstream expected, actual;\n  testing::internal::UniversalPrinter<const int&>::Print(n, &expected);\n  testing::internal::UniversalPrint(ByRef(n), &actual);\n  EXPECT_EQ(expected.str(), actual.str());\n}\n\n#if GTEST_HAS_STD_UNIQUE_PTR_\n\nstd::unique_ptr<int> UniquePtrSource() {\n  return std::unique_ptr<int>(new int(19));\n}\n\nstd::vector<std::unique_ptr<int>> VectorUniquePtrSource() {\n  std::vector<std::unique_ptr<int>> out;\n  out.emplace_back(new int(7));\n  return out;\n}\n\nTEST(MockMethodTest, CanReturnMoveOnlyValue_Return) {\n  MockClass mock;\n  std::unique_ptr<int> i(new int(19));\n  EXPECT_CALL(mock, MakeUnique()).WillOnce(Return(ByMove(std::move(i))));\n  EXPECT_CALL(mock, MakeVectorUnique())\n      .WillOnce(Return(ByMove(VectorUniquePtrSource())));\n  Derived* d = new Derived;\n  EXPECT_CALL(mock, MakeUniqueBase())\n      .WillOnce(Return(ByMove(std::unique_ptr<Derived>(d))));\n\n  std::unique_ptr<int> result1 = mock.MakeUnique();\n  EXPECT_EQ(19, *result1);\n\n  std::vector<std::unique_ptr<int>> vresult = mock.MakeVectorUnique();\n  EXPECT_EQ(1u, vresult.size());\n  EXPECT_NE(nullptr, vresult[0]);\n  EXPECT_EQ(7, *vresult[0]);\n\n  std::unique_ptr<Base> result2 = mock.MakeUniqueBase();\n  EXPECT_EQ(d, result2.get());\n}\n\nTEST(MockMethodTest, CanReturnMoveOnlyValue_DoAllReturn) {\n  testing::MockFunction<void()> mock_function;\n  MockClass mock;\n  std::unique_ptr<int> i(new int(19));\n  EXPECT_CALL(mock_function, Call());\n  EXPECT_CALL(mock, MakeUnique()).WillOnce(DoAll(\n      InvokeWithoutArgs(&mock_function, &testing::MockFunction<void()>::Call),\n      Return(ByMove(std::move(i)))));\n\n  std::unique_ptr<int> result1 = mock.MakeUnique();\n  EXPECT_EQ(19, *result1);\n}\n\nTEST(MockMethodTest, CanReturnMoveOnlyValue_Invoke) {\n  MockClass mock;\n\n  // Check default value\n  DefaultValue<std::unique_ptr<int>>::SetFactory([] {\n    return std::unique_ptr<int>(new int(42));\n  });\n  EXPECT_EQ(42, *mock.MakeUnique());\n\n  EXPECT_CALL(mock, MakeUnique()).WillRepeatedly(Invoke(UniquePtrSource));\n  EXPECT_CALL(mock, MakeVectorUnique())\n      .WillRepeatedly(Invoke(VectorUniquePtrSource));\n  std::unique_ptr<int> result1 = mock.MakeUnique();\n  EXPECT_EQ(19, *result1);\n  std::unique_ptr<int> result2 = mock.MakeUnique();\n  EXPECT_EQ(19, *result2);\n  EXPECT_NE(result1, result2);\n\n  std::vector<std::unique_ptr<int>> vresult = mock.MakeVectorUnique();\n  EXPECT_EQ(1u, vresult.size());\n  EXPECT_NE(nullptr, vresult[0]);\n  EXPECT_EQ(7, *vresult[0]);\n}\n\nTEST(MockMethodTest, CanTakeMoveOnlyValue) {\n  MockClass mock;\n  auto make = [](int i) { return std::unique_ptr<int>(new int(i)); };\n\n  EXPECT_CALL(mock, TakeUnique(_)).WillRepeatedly([](std::unique_ptr<int> i) {\n    return *i;\n  });\n  // DoAll() does not compile, since it would move from its arguments twice.\n  // EXPECT_CALL(mock, TakeUnique(_, _))\n  //     .WillRepeatedly(DoAll(Invoke([](std::unique_ptr<int> j) {}),\n  //     Return(1)));\n  EXPECT_CALL(mock, TakeUnique(testing::Pointee(7)))\n      .WillOnce(Return(-7))\n      .RetiresOnSaturation();\n  EXPECT_CALL(mock, TakeUnique(testing::IsNull()))\n      .WillOnce(Return(-1))\n      .RetiresOnSaturation();\n\n  EXPECT_EQ(5, mock.TakeUnique(make(5)));\n  EXPECT_EQ(-7, mock.TakeUnique(make(7)));\n  EXPECT_EQ(7, mock.TakeUnique(make(7)));\n  EXPECT_EQ(7, mock.TakeUnique(make(7)));\n  EXPECT_EQ(-1, mock.TakeUnique({}));\n\n  // Some arguments are moved, some passed by reference.\n  auto lvalue = make(6);\n  EXPECT_CALL(mock, TakeUnique(_, _))\n      .WillOnce([](const std::unique_ptr<int>& i, std::unique_ptr<int> j) {\n        return *i * *j;\n      });\n  EXPECT_EQ(42, mock.TakeUnique(lvalue, make(7)));\n\n  // The unique_ptr can be saved by the action.\n  std::unique_ptr<int> saved;\n  EXPECT_CALL(mock, TakeUnique(_)).WillOnce([&saved](std::unique_ptr<int> i) {\n    saved = std::move(i);\n    return 0;\n  });\n  EXPECT_EQ(0, mock.TakeUnique(make(42)));\n  EXPECT_EQ(42, *saved);\n}\n\n#endif  // GTEST_HAS_STD_UNIQUE_PTR_\n\n#if GTEST_LANG_CXX11\n// Tests for std::function based action.\n\nint Add(int val, int& ref, int* ptr) {  // NOLINT\n  int result = val + ref + *ptr;\n  ref = 42;\n  *ptr = 43;\n  return result;\n}\n\nint Deref(std::unique_ptr<int> ptr) { return *ptr; }\n\nstruct Double {\n  template <typename T>\n  T operator()(T t) { return 2 * t; }\n};\n\nstd::unique_ptr<int> UniqueInt(int i) {\n  return std::unique_ptr<int>(new int(i));\n}\n\nTEST(FunctorActionTest, ActionFromFunction) {\n  Action<int(int, int&, int*)> a = &Add;\n  int x = 1, y = 2, z = 3;\n  EXPECT_EQ(6, a.Perform(std::forward_as_tuple(x, y, &z)));\n  EXPECT_EQ(42, y);\n  EXPECT_EQ(43, z);\n\n  Action<int(std::unique_ptr<int>)> a1 = &Deref;\n  EXPECT_EQ(7, a1.Perform(std::make_tuple(UniqueInt(7))));\n}\n\nTEST(FunctorActionTest, ActionFromLambda) {\n  Action<int(bool, int)> a1 = [](bool b, int i) { return b ? i : 0; };\n  EXPECT_EQ(5, a1.Perform(make_tuple(true, 5)));\n  EXPECT_EQ(0, a1.Perform(make_tuple(false, 5)));\n\n  std::unique_ptr<int> saved;\n  Action<void(std::unique_ptr<int>)> a2 = [&saved](std::unique_ptr<int> p) {\n    saved = std::move(p);\n  };\n  a2.Perform(make_tuple(UniqueInt(5)));\n  EXPECT_EQ(5, *saved);\n}\n\nTEST(FunctorActionTest, PolymorphicFunctor) {\n  Action<int(int)> ai = Double();\n  EXPECT_EQ(2, ai.Perform(make_tuple(1)));\n  Action<double(double)> ad = Double();  // Double? Double double!\n  EXPECT_EQ(3.0, ad.Perform(make_tuple(1.5)));\n}\n\nTEST(FunctorActionTest, TypeConversion) {\n  // Numeric promotions are allowed.\n  const Action<bool(int)> a1 = [](int i) { return i > 1; };\n  const Action<int(bool)> a2 = Action<int(bool)>(a1);\n  EXPECT_EQ(1, a1.Perform(make_tuple(42)));\n  EXPECT_EQ(0, a2.Perform(make_tuple(42)));\n\n  // Implicit constructors are allowed.\n  const Action<bool(std::string)> s1 = [](std::string s) { return !s.empty(); };\n  const Action<int(const char*)> s2 = Action<int(const char*)>(s1);\n  EXPECT_EQ(0, s2.Perform(make_tuple(\"\")));\n  EXPECT_EQ(1, s2.Perform(make_tuple(\"hello\")));\n\n  // Also between the lambda and the action itself.\n  const Action<bool(std::string)> x = [](Unused) { return 42; };\n  EXPECT_TRUE(x.Perform(make_tuple(\"hello\")));\n}\n\nTEST(FunctorActionTest, UnusedArguments) {\n  // Verify that users can ignore uninteresting arguments.\n  Action<int(int, double y, double z)> a =\n      [](int i, Unused, Unused) { return 2 * i; };\n  tuple<int, double, double> dummy = make_tuple(3, 7.3, 9.44);\n  EXPECT_EQ(6, a.Perform(dummy));\n}\n\n// Test that basic built-in actions work with move-only arguments.\n// FIXME: Currently, almost all ActionInterface-based actions will not\n// work, even if they only try to use other, copyable arguments. Implement them\n// if necessary (but note that DoAll cannot work on non-copyable types anyway -\n// so maybe it's better to make users use lambdas instead.\nTEST(MoveOnlyArgumentsTest, ReturningActions) {\n  Action<int(std::unique_ptr<int>)> a = Return(1);\n  EXPECT_EQ(1, a.Perform(make_tuple(nullptr)));\n\n  a = testing::WithoutArgs([]() { return 7; });\n  EXPECT_EQ(7, a.Perform(make_tuple(nullptr)));\n\n  Action<void(std::unique_ptr<int>, int*)> a2 = testing::SetArgPointee<1>(3);\n  int x = 0;\n  a2.Perform(make_tuple(nullptr, &x));\n  EXPECT_EQ(x, 3);\n}\n\n#endif  // GTEST_LANG_CXX11\n\n}  // Unnamed namespace\n\n#ifdef _MSC_VER\n#if _MSC_VER == 1900\n#  pragma warning(pop)\n#endif\n#endif\n\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock-cardinalities_test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file tests the built-in cardinalities.\n\n#include \"gmock/gmock.h\"\n#include \"gtest/gtest.h\"\n#include \"gtest/gtest-spi.h\"\n\nnamespace {\n\nusing std::stringstream;\nusing testing::AnyNumber;\nusing testing::AtLeast;\nusing testing::AtMost;\nusing testing::Between;\nusing testing::Cardinality;\nusing testing::CardinalityInterface;\nusing testing::Exactly;\nusing testing::IsSubstring;\nusing testing::MakeCardinality;\n\nclass MockFoo {\n public:\n  MockFoo() {}\n  MOCK_METHOD0(Bar, int());  // NOLINT\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo);\n};\n\n// Tests that Cardinality objects can be default constructed.\nTEST(CardinalityTest, IsDefaultConstructable) {\n  Cardinality c;\n}\n\n// Tests that Cardinality objects are copyable.\nTEST(CardinalityTest, IsCopyable) {\n  // Tests the copy constructor.\n  Cardinality c = Exactly(1);\n  EXPECT_FALSE(c.IsSatisfiedByCallCount(0));\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(1));\n  EXPECT_TRUE(c.IsSaturatedByCallCount(1));\n\n  // Tests the assignment operator.\n  c = Exactly(2);\n  EXPECT_FALSE(c.IsSatisfiedByCallCount(1));\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(2));\n  EXPECT_TRUE(c.IsSaturatedByCallCount(2));\n}\n\nTEST(CardinalityTest, IsOverSaturatedByCallCountWorks) {\n  const Cardinality c = AtMost(5);\n  EXPECT_FALSE(c.IsOverSaturatedByCallCount(4));\n  EXPECT_FALSE(c.IsOverSaturatedByCallCount(5));\n  EXPECT_TRUE(c.IsOverSaturatedByCallCount(6));\n}\n\n// Tests that Cardinality::DescribeActualCallCountTo() creates the\n// correct description.\nTEST(CardinalityTest, CanDescribeActualCallCount) {\n  stringstream ss0;\n  Cardinality::DescribeActualCallCountTo(0, &ss0);\n  EXPECT_EQ(\"never called\", ss0.str());\n\n  stringstream ss1;\n  Cardinality::DescribeActualCallCountTo(1, &ss1);\n  EXPECT_EQ(\"called once\", ss1.str());\n\n  stringstream ss2;\n  Cardinality::DescribeActualCallCountTo(2, &ss2);\n  EXPECT_EQ(\"called twice\", ss2.str());\n\n  stringstream ss3;\n  Cardinality::DescribeActualCallCountTo(3, &ss3);\n  EXPECT_EQ(\"called 3 times\", ss3.str());\n}\n\n// Tests AnyNumber()\nTEST(AnyNumber, Works) {\n  const Cardinality c = AnyNumber();\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(0));\n  EXPECT_FALSE(c.IsSaturatedByCallCount(0));\n\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(1));\n  EXPECT_FALSE(c.IsSaturatedByCallCount(1));\n\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(9));\n  EXPECT_FALSE(c.IsSaturatedByCallCount(9));\n\n  stringstream ss;\n  c.DescribeTo(&ss);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"called any number of times\",\n                      ss.str());\n}\n\nTEST(AnyNumberTest, HasCorrectBounds) {\n  const Cardinality c = AnyNumber();\n  EXPECT_EQ(0, c.ConservativeLowerBound());\n  EXPECT_EQ(INT_MAX, c.ConservativeUpperBound());\n}\n\n// Tests AtLeast(n).\n\nTEST(AtLeastTest, OnNegativeNumber) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    AtLeast(-1);\n  }, \"The invocation lower bound must be >= 0\");\n}\n\nTEST(AtLeastTest, OnZero) {\n  const Cardinality c = AtLeast(0);\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(0));\n  EXPECT_FALSE(c.IsSaturatedByCallCount(0));\n\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(1));\n  EXPECT_FALSE(c.IsSaturatedByCallCount(1));\n\n  stringstream ss;\n  c.DescribeTo(&ss);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"any number of times\",\n                      ss.str());\n}\n\nTEST(AtLeastTest, OnPositiveNumber) {\n  const Cardinality c = AtLeast(2);\n  EXPECT_FALSE(c.IsSatisfiedByCallCount(0));\n  EXPECT_FALSE(c.IsSaturatedByCallCount(0));\n\n  EXPECT_FALSE(c.IsSatisfiedByCallCount(1));\n  EXPECT_FALSE(c.IsSaturatedByCallCount(1));\n\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(2));\n  EXPECT_FALSE(c.IsSaturatedByCallCount(2));\n\n  stringstream ss1;\n  AtLeast(1).DescribeTo(&ss1);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"at least once\",\n                      ss1.str());\n\n  stringstream ss2;\n  c.DescribeTo(&ss2);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"at least twice\",\n                      ss2.str());\n\n  stringstream ss3;\n  AtLeast(3).DescribeTo(&ss3);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"at least 3 times\",\n                      ss3.str());\n}\n\nTEST(AtLeastTest, HasCorrectBounds) {\n  const Cardinality c = AtLeast(2);\n  EXPECT_EQ(2, c.ConservativeLowerBound());\n  EXPECT_EQ(INT_MAX, c.ConservativeUpperBound());\n}\n\n// Tests AtMost(n).\n\nTEST(AtMostTest, OnNegativeNumber) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    AtMost(-1);\n  }, \"The invocation upper bound must be >= 0\");\n}\n\nTEST(AtMostTest, OnZero) {\n  const Cardinality c = AtMost(0);\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(0));\n  EXPECT_TRUE(c.IsSaturatedByCallCount(0));\n\n  EXPECT_FALSE(c.IsSatisfiedByCallCount(1));\n  EXPECT_TRUE(c.IsSaturatedByCallCount(1));\n\n  stringstream ss;\n  c.DescribeTo(&ss);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"never called\",\n                      ss.str());\n}\n\nTEST(AtMostTest, OnPositiveNumber) {\n  const Cardinality c = AtMost(2);\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(0));\n  EXPECT_FALSE(c.IsSaturatedByCallCount(0));\n\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(1));\n  EXPECT_FALSE(c.IsSaturatedByCallCount(1));\n\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(2));\n  EXPECT_TRUE(c.IsSaturatedByCallCount(2));\n\n  stringstream ss1;\n  AtMost(1).DescribeTo(&ss1);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"called at most once\",\n                      ss1.str());\n\n  stringstream ss2;\n  c.DescribeTo(&ss2);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"called at most twice\",\n                      ss2.str());\n\n  stringstream ss3;\n  AtMost(3).DescribeTo(&ss3);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"called at most 3 times\",\n                      ss3.str());\n}\n\nTEST(AtMostTest, HasCorrectBounds) {\n  const Cardinality c = AtMost(2);\n  EXPECT_EQ(0, c.ConservativeLowerBound());\n  EXPECT_EQ(2, c.ConservativeUpperBound());\n}\n\n// Tests Between(m, n).\n\nTEST(BetweenTest, OnNegativeStart) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    Between(-1, 2);\n  }, \"The invocation lower bound must be >= 0, but is actually -1\");\n}\n\nTEST(BetweenTest, OnNegativeEnd) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    Between(1, -2);\n  }, \"The invocation upper bound must be >= 0, but is actually -2\");\n}\n\nTEST(BetweenTest, OnStartBiggerThanEnd) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    Between(2, 1);\n  }, \"The invocation upper bound (1) must be >= \"\n     \"the invocation lower bound (2)\");\n}\n\nTEST(BetweenTest, OnZeroStartAndZeroEnd) {\n  const Cardinality c = Between(0, 0);\n\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(0));\n  EXPECT_TRUE(c.IsSaturatedByCallCount(0));\n\n  EXPECT_FALSE(c.IsSatisfiedByCallCount(1));\n  EXPECT_TRUE(c.IsSaturatedByCallCount(1));\n\n  stringstream ss;\n  c.DescribeTo(&ss);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"never called\",\n                      ss.str());\n}\n\nTEST(BetweenTest, OnZeroStartAndNonZeroEnd) {\n  const Cardinality c = Between(0, 2);\n\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(0));\n  EXPECT_FALSE(c.IsSaturatedByCallCount(0));\n\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(2));\n  EXPECT_TRUE(c.IsSaturatedByCallCount(2));\n\n  EXPECT_FALSE(c.IsSatisfiedByCallCount(4));\n  EXPECT_TRUE(c.IsSaturatedByCallCount(4));\n\n  stringstream ss;\n  c.DescribeTo(&ss);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"called at most twice\",\n                      ss.str());\n}\n\nTEST(BetweenTest, OnSameStartAndEnd) {\n  const Cardinality c = Between(3, 3);\n\n  EXPECT_FALSE(c.IsSatisfiedByCallCount(2));\n  EXPECT_FALSE(c.IsSaturatedByCallCount(2));\n\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(3));\n  EXPECT_TRUE(c.IsSaturatedByCallCount(3));\n\n  EXPECT_FALSE(c.IsSatisfiedByCallCount(4));\n  EXPECT_TRUE(c.IsSaturatedByCallCount(4));\n\n  stringstream ss;\n  c.DescribeTo(&ss);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"called 3 times\",\n                      ss.str());\n}\n\nTEST(BetweenTest, OnDifferentStartAndEnd) {\n  const Cardinality c = Between(3, 5);\n\n  EXPECT_FALSE(c.IsSatisfiedByCallCount(2));\n  EXPECT_FALSE(c.IsSaturatedByCallCount(2));\n\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(3));\n  EXPECT_FALSE(c.IsSaturatedByCallCount(3));\n\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(5));\n  EXPECT_TRUE(c.IsSaturatedByCallCount(5));\n\n  EXPECT_FALSE(c.IsSatisfiedByCallCount(6));\n  EXPECT_TRUE(c.IsSaturatedByCallCount(6));\n\n  stringstream ss;\n  c.DescribeTo(&ss);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"called between 3 and 5 times\",\n                      ss.str());\n}\n\nTEST(BetweenTest, HasCorrectBounds) {\n  const Cardinality c = Between(3, 5);\n  EXPECT_EQ(3, c.ConservativeLowerBound());\n  EXPECT_EQ(5, c.ConservativeUpperBound());\n}\n\n// Tests Exactly(n).\n\nTEST(ExactlyTest, OnNegativeNumber) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    Exactly(-1);\n  }, \"The invocation lower bound must be >= 0\");\n}\n\nTEST(ExactlyTest, OnZero) {\n  const Cardinality c = Exactly(0);\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(0));\n  EXPECT_TRUE(c.IsSaturatedByCallCount(0));\n\n  EXPECT_FALSE(c.IsSatisfiedByCallCount(1));\n  EXPECT_TRUE(c.IsSaturatedByCallCount(1));\n\n  stringstream ss;\n  c.DescribeTo(&ss);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"never called\",\n                      ss.str());\n}\n\nTEST(ExactlyTest, OnPositiveNumber) {\n  const Cardinality c = Exactly(2);\n  EXPECT_FALSE(c.IsSatisfiedByCallCount(0));\n  EXPECT_FALSE(c.IsSaturatedByCallCount(0));\n\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(2));\n  EXPECT_TRUE(c.IsSaturatedByCallCount(2));\n\n  stringstream ss1;\n  Exactly(1).DescribeTo(&ss1);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"called once\",\n                      ss1.str());\n\n  stringstream ss2;\n  c.DescribeTo(&ss2);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"called twice\",\n                      ss2.str());\n\n  stringstream ss3;\n  Exactly(3).DescribeTo(&ss3);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"called 3 times\",\n                      ss3.str());\n}\n\nTEST(ExactlyTest, HasCorrectBounds) {\n  const Cardinality c = Exactly(3);\n  EXPECT_EQ(3, c.ConservativeLowerBound());\n  EXPECT_EQ(3, c.ConservativeUpperBound());\n}\n\n// Tests that a user can make their own cardinality by implementing\n// CardinalityInterface and calling MakeCardinality().\n\nclass EvenCardinality : public CardinalityInterface {\n public:\n  // Returns true iff call_count calls will satisfy this cardinality.\n  virtual bool IsSatisfiedByCallCount(int call_count) const {\n    return (call_count % 2 == 0);\n  }\n\n  // Returns true iff call_count calls will saturate this cardinality.\n  virtual bool IsSaturatedByCallCount(int /* call_count */) const {\n    return false;\n  }\n\n  // Describes self to an ostream.\n  virtual void DescribeTo(::std::ostream* ss) const {\n    *ss << \"called even number of times\";\n  }\n};\n\nTEST(MakeCardinalityTest, ConstructsCardinalityFromInterface) {\n  const Cardinality c = MakeCardinality(new EvenCardinality);\n\n  EXPECT_TRUE(c.IsSatisfiedByCallCount(2));\n  EXPECT_FALSE(c.IsSatisfiedByCallCount(3));\n\n  EXPECT_FALSE(c.IsSaturatedByCallCount(10000));\n\n  stringstream ss;\n  c.DescribeTo(&ss);\n  EXPECT_EQ(\"called even number of times\", ss.str());\n}\n\n}  // Unnamed namespace\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock-generated-actions_test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file tests the built-in actions generated by a script.\n\n#include \"gmock/gmock-generated-actions.h\"\n\n#include <functional>\n#include <sstream>\n#include <string>\n#include \"gmock/gmock.h\"\n#include \"gtest/gtest.h\"\n\nnamespace testing {\nnamespace gmock_generated_actions_test {\n\nusing ::std::plus;\nusing ::std::string;\nusing testing::get;\nusing testing::make_tuple;\nusing testing::tuple;\nusing testing::tuple_element;\nusing testing::_;\nusing testing::Action;\nusing testing::ActionInterface;\nusing testing::ByRef;\nusing testing::DoAll;\nusing testing::Invoke;\nusing testing::Return;\nusing testing::ReturnNew;\nusing testing::SetArgPointee;\nusing testing::StaticAssertTypeEq;\nusing testing::Unused;\nusing testing::WithArgs;\n\n// For suppressing compiler warnings on conversion possibly losing precision.\ninline short Short(short n) { return n; }  // NOLINT\ninline char Char(char ch) { return ch; }\n\n// Sample functions and functors for testing various actions.\nint Nullary() { return 1; }\n\nclass NullaryFunctor {\n public:\n  int operator()() { return 2; }\n};\n\nbool g_done = false;\n\nbool Unary(int x) { return x < 0; }\n\nconst char* Plus1(const char* s) { return s + 1; }\n\nbool ByConstRef(const std::string& s) { return s == \"Hi\"; }\n\nconst double g_double = 0;\nbool ReferencesGlobalDouble(const double& x) { return &x == &g_double; }\n\nstd::string ByNonConstRef(std::string& s) { return s += \"+\"; }  // NOLINT\n\nstruct UnaryFunctor {\n  int operator()(bool x) { return x ? 1 : -1; }\n};\n\nconst char* Binary(const char* input, short n) { return input + n; }  // NOLINT\n\nvoid VoidBinary(int, char) { g_done = true; }\n\nint Ternary(int x, char y, short z) { return x + y + z; }  // NOLINT\n\nvoid VoidTernary(int, char, bool) { g_done = true; }\n\nint SumOf4(int a, int b, int c, int d) { return a + b + c + d; }\n\nstd::string Concat4(const char* s1, const char* s2, const char* s3,\n                    const char* s4) {\n  return std::string(s1) + s2 + s3 + s4;\n}\n\nint SumOf5(int a, int b, int c, int d, int e) { return a + b + c + d + e; }\n\nstruct SumOf5Functor {\n  int operator()(int a, int b, int c, int d, int e) {\n    return a + b + c + d + e;\n  }\n};\n\nstd::string Concat5(const char* s1, const char* s2, const char* s3,\n                    const char* s4, const char* s5) {\n  return std::string(s1) + s2 + s3 + s4 + s5;\n}\n\nint SumOf6(int a, int b, int c, int d, int e, int f) {\n  return a + b + c + d + e + f;\n}\n\nstruct SumOf6Functor {\n  int operator()(int a, int b, int c, int d, int e, int f) {\n    return a + b + c + d + e + f;\n  }\n};\n\nstd::string Concat6(const char* s1, const char* s2, const char* s3,\n                    const char* s4, const char* s5, const char* s6) {\n  return std::string(s1) + s2 + s3 + s4 + s5 + s6;\n}\n\nstd::string Concat7(const char* s1, const char* s2, const char* s3,\n                    const char* s4, const char* s5, const char* s6,\n                    const char* s7) {\n  return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7;\n}\n\nstd::string Concat8(const char* s1, const char* s2, const char* s3,\n                    const char* s4, const char* s5, const char* s6,\n                    const char* s7, const char* s8) {\n  return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8;\n}\n\nstd::string Concat9(const char* s1, const char* s2, const char* s3,\n                    const char* s4, const char* s5, const char* s6,\n                    const char* s7, const char* s8, const char* s9) {\n  return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9;\n}\n\nstd::string Concat10(const char* s1, const char* s2, const char* s3,\n                     const char* s4, const char* s5, const char* s6,\n                     const char* s7, const char* s8, const char* s9,\n                     const char* s10) {\n  return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;\n}\n\n// A helper that turns the type of a C-string literal from const\n// char[N] to const char*.\ninline const char* CharPtr(const char* s) { return s; }\n\n// Tests InvokeArgument<N>(...).\n\n// Tests using InvokeArgument with a nullary function.\nTEST(InvokeArgumentTest, Function0) {\n  Action<int(int, int(*)())> a = InvokeArgument<1>();  // NOLINT\n  EXPECT_EQ(1, a.Perform(make_tuple(2, &Nullary)));\n}\n\n// Tests using InvokeArgument with a unary function.\nTEST(InvokeArgumentTest, Functor1) {\n  Action<int(UnaryFunctor)> a = InvokeArgument<0>(true);  // NOLINT\n  EXPECT_EQ(1, a.Perform(make_tuple(UnaryFunctor())));\n}\n\n// Tests using InvokeArgument with a 5-ary function.\nTEST(InvokeArgumentTest, Function5) {\n  Action<int(int(*)(int, int, int, int, int))> a =  // NOLINT\n      InvokeArgument<0>(10000, 2000, 300, 40, 5);\n  EXPECT_EQ(12345, a.Perform(make_tuple(&SumOf5)));\n}\n\n// Tests using InvokeArgument with a 5-ary functor.\nTEST(InvokeArgumentTest, Functor5) {\n  Action<int(SumOf5Functor)> a =  // NOLINT\n      InvokeArgument<0>(10000, 2000, 300, 40, 5);\n  EXPECT_EQ(12345, a.Perform(make_tuple(SumOf5Functor())));\n}\n\n// Tests using InvokeArgument with a 6-ary function.\nTEST(InvokeArgumentTest, Function6) {\n  Action<int(int(*)(int, int, int, int, int, int))> a =  // NOLINT\n      InvokeArgument<0>(100000, 20000, 3000, 400, 50, 6);\n  EXPECT_EQ(123456, a.Perform(make_tuple(&SumOf6)));\n}\n\n// Tests using InvokeArgument with a 6-ary functor.\nTEST(InvokeArgumentTest, Functor6) {\n  Action<int(SumOf6Functor)> a =  // NOLINT\n      InvokeArgument<0>(100000, 20000, 3000, 400, 50, 6);\n  EXPECT_EQ(123456, a.Perform(make_tuple(SumOf6Functor())));\n}\n\n// Tests using InvokeArgument with a 7-ary function.\nTEST(InvokeArgumentTest, Function7) {\n  Action<std::string(std::string(*)(const char*, const char*, const char*,\n                                    const char*, const char*, const char*,\n                                    const char*))>\n      a = InvokeArgument<0>(\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\");\n  EXPECT_EQ(\"1234567\", a.Perform(make_tuple(&Concat7)));\n}\n\n// Tests using InvokeArgument with a 8-ary function.\nTEST(InvokeArgumentTest, Function8) {\n  Action<std::string(std::string(*)(const char*, const char*, const char*,\n                                    const char*, const char*, const char*,\n                                    const char*, const char*))>\n      a = InvokeArgument<0>(\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\");\n  EXPECT_EQ(\"12345678\", a.Perform(make_tuple(&Concat8)));\n}\n\n// Tests using InvokeArgument with a 9-ary function.\nTEST(InvokeArgumentTest, Function9) {\n  Action<std::string(std::string(*)(const char*, const char*, const char*,\n                                    const char*, const char*, const char*,\n                                    const char*, const char*, const char*))>\n      a = InvokeArgument<0>(\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\");\n  EXPECT_EQ(\"123456789\", a.Perform(make_tuple(&Concat9)));\n}\n\n// Tests using InvokeArgument with a 10-ary function.\nTEST(InvokeArgumentTest, Function10) {\n  Action<std::string(std::string(*)(\n      const char*, const char*, const char*, const char*, const char*,\n      const char*, const char*, const char*, const char*, const char*))>\n      a = InvokeArgument<0>(\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"0\");\n  EXPECT_EQ(\"1234567890\", a.Perform(make_tuple(&Concat10)));\n}\n\n// Tests using InvokeArgument with a function that takes a pointer argument.\nTEST(InvokeArgumentTest, ByPointerFunction) {\n  Action<const char*(const char*(*)(const char* input, short n))> a =  // NOLINT\n      InvokeArgument<0>(static_cast<const char*>(\"Hi\"), Short(1));\n  EXPECT_STREQ(\"i\", a.Perform(make_tuple(&Binary)));\n}\n\n// Tests using InvokeArgument with a function that takes a const char*\n// by passing it a C-string literal.\nTEST(InvokeArgumentTest, FunctionWithCStringLiteral) {\n  Action<const char*(const char*(*)(const char* input, short n))> a =  // NOLINT\n      InvokeArgument<0>(\"Hi\", Short(1));\n  EXPECT_STREQ(\"i\", a.Perform(make_tuple(&Binary)));\n}\n\n// Tests using InvokeArgument with a function that takes a const reference.\nTEST(InvokeArgumentTest, ByConstReferenceFunction) {\n  Action<bool(bool (*function)(const std::string& s))> a =  // NOLINT\n      InvokeArgument<0>(std::string(\"Hi\"));\n  // When action 'a' is constructed, it makes a copy of the temporary\n  // string object passed to it, so it's OK to use 'a' later, when the\n  // temporary object has already died.\n  EXPECT_TRUE(a.Perform(make_tuple(&ByConstRef)));\n}\n\n// Tests using InvokeArgument with ByRef() and a function that takes a\n// const reference.\nTEST(InvokeArgumentTest, ByExplicitConstReferenceFunction) {\n  Action<bool(bool(*)(const double& x))> a =  // NOLINT\n      InvokeArgument<0>(ByRef(g_double));\n  // The above line calls ByRef() on a const value.\n  EXPECT_TRUE(a.Perform(make_tuple(&ReferencesGlobalDouble)));\n\n  double x = 0;\n  a = InvokeArgument<0>(ByRef(x));  // This calls ByRef() on a non-const.\n  EXPECT_FALSE(a.Perform(make_tuple(&ReferencesGlobalDouble)));\n}\n\n// Tests using WithArgs and with an action that takes 1 argument.\nTEST(WithArgsTest, OneArg) {\n  Action<bool(double x, int n)> a = WithArgs<1>(Invoke(Unary));  // NOLINT\n  EXPECT_TRUE(a.Perform(make_tuple(1.5, -1)));\n  EXPECT_FALSE(a.Perform(make_tuple(1.5, 1)));\n}\n\n// Tests using WithArgs with an action that takes 2 arguments.\nTEST(WithArgsTest, TwoArgs) {\n  Action<const char*(const char* s, double x, short n)> a =\n      WithArgs<0, 2>(Invoke(Binary));\n  const char s[] = \"Hello\";\n  EXPECT_EQ(s + 2, a.Perform(make_tuple(CharPtr(s), 0.5, Short(2))));\n}\n\n// Tests using WithArgs with an action that takes 3 arguments.\nTEST(WithArgsTest, ThreeArgs) {\n  Action<int(int, double, char, short)> a =  // NOLINT\n      WithArgs<0, 2, 3>(Invoke(Ternary));\n  EXPECT_EQ(123, a.Perform(make_tuple(100, 6.5, Char(20), Short(3))));\n}\n\n// Tests using WithArgs with an action that takes 4 arguments.\nTEST(WithArgsTest, FourArgs) {\n  Action<std::string(const char*, const char*, double, const char*,\n                     const char*)>\n      a = WithArgs<4, 3, 1, 0>(Invoke(Concat4));\n  EXPECT_EQ(\"4310\", a.Perform(make_tuple(CharPtr(\"0\"), CharPtr(\"1\"), 2.5,\n                                         CharPtr(\"3\"), CharPtr(\"4\"))));\n}\n\n// Tests using WithArgs with an action that takes 5 arguments.\nTEST(WithArgsTest, FiveArgs) {\n  Action<std::string(const char*, const char*, const char*, const char*,\n                     const char*)>\n      a = WithArgs<4, 3, 2, 1, 0>(Invoke(Concat5));\n  EXPECT_EQ(\"43210\",\n            a.Perform(make_tuple(CharPtr(\"0\"), CharPtr(\"1\"), CharPtr(\"2\"),\n                                 CharPtr(\"3\"), CharPtr(\"4\"))));\n}\n\n// Tests using WithArgs with an action that takes 6 arguments.\nTEST(WithArgsTest, SixArgs) {\n  Action<std::string(const char*, const char*, const char*)> a =\n      WithArgs<0, 1, 2, 2, 1, 0>(Invoke(Concat6));\n  EXPECT_EQ(\"012210\",\n            a.Perform(make_tuple(CharPtr(\"0\"), CharPtr(\"1\"), CharPtr(\"2\"))));\n}\n\n// Tests using WithArgs with an action that takes 7 arguments.\nTEST(WithArgsTest, SevenArgs) {\n  Action<std::string(const char*, const char*, const char*, const char*)> a =\n      WithArgs<0, 1, 2, 3, 2, 1, 0>(Invoke(Concat7));\n  EXPECT_EQ(\"0123210\",\n            a.Perform(make_tuple(CharPtr(\"0\"), CharPtr(\"1\"), CharPtr(\"2\"),\n                                 CharPtr(\"3\"))));\n}\n\n// Tests using WithArgs with an action that takes 8 arguments.\nTEST(WithArgsTest, EightArgs) {\n  Action<std::string(const char*, const char*, const char*, const char*)> a =\n      WithArgs<0, 1, 2, 3, 0, 1, 2, 3>(Invoke(Concat8));\n  EXPECT_EQ(\"01230123\",\n            a.Perform(make_tuple(CharPtr(\"0\"), CharPtr(\"1\"), CharPtr(\"2\"),\n                                 CharPtr(\"3\"))));\n}\n\n// Tests using WithArgs with an action that takes 9 arguments.\nTEST(WithArgsTest, NineArgs) {\n  Action<std::string(const char*, const char*, const char*, const char*)> a =\n      WithArgs<0, 1, 2, 3, 1, 2, 3, 2, 3>(Invoke(Concat9));\n  EXPECT_EQ(\"012312323\",\n            a.Perform(make_tuple(CharPtr(\"0\"), CharPtr(\"1\"), CharPtr(\"2\"),\n                                 CharPtr(\"3\"))));\n}\n\n// Tests using WithArgs with an action that takes 10 arguments.\nTEST(WithArgsTest, TenArgs) {\n  Action<std::string(const char*, const char*, const char*, const char*)> a =\n      WithArgs<0, 1, 2, 3, 2, 1, 0, 1, 2, 3>(Invoke(Concat10));\n  EXPECT_EQ(\"0123210123\",\n            a.Perform(make_tuple(CharPtr(\"0\"), CharPtr(\"1\"), CharPtr(\"2\"),\n                                 CharPtr(\"3\"))));\n}\n\n// Tests using WithArgs with an action that is not Invoke().\nclass SubstractAction : public ActionInterface<int(int, int)> {  // NOLINT\n public:\n  virtual int Perform(const tuple<int, int>& args) {\n    return get<0>(args) - get<1>(args);\n  }\n};\n\nTEST(WithArgsTest, NonInvokeAction) {\n  Action<int(const std::string&, int, int)> a =  // NOLINT\n      WithArgs<2, 1>(MakeAction(new SubstractAction));\n  tuple<std::string, int, int> dummy = make_tuple(std::string(\"hi\"), 2, 10);\n  EXPECT_EQ(8, a.Perform(dummy));\n}\n\n// Tests using WithArgs to pass all original arguments in the original order.\nTEST(WithArgsTest, Identity) {\n  Action<int(int x, char y, short z)> a =  // NOLINT\n      WithArgs<0, 1, 2>(Invoke(Ternary));\n  EXPECT_EQ(123, a.Perform(make_tuple(100, Char(20), Short(3))));\n}\n\n// Tests using WithArgs with repeated arguments.\nTEST(WithArgsTest, RepeatedArguments) {\n  Action<int(bool, int m, int n)> a =  // NOLINT\n      WithArgs<1, 1, 1, 1>(Invoke(SumOf4));\n  EXPECT_EQ(4, a.Perform(make_tuple(false, 1, 10)));\n}\n\n// Tests using WithArgs with reversed argument order.\nTEST(WithArgsTest, ReversedArgumentOrder) {\n  Action<const char*(short n, const char* input)> a =  // NOLINT\n      WithArgs<1, 0>(Invoke(Binary));\n  const char s[] = \"Hello\";\n  EXPECT_EQ(s + 2, a.Perform(make_tuple(Short(2), CharPtr(s))));\n}\n\n// Tests using WithArgs with compatible, but not identical, argument types.\nTEST(WithArgsTest, ArgsOfCompatibleTypes) {\n  Action<long(short x, char y, double z, char c)> a =  // NOLINT\n      WithArgs<0, 1, 3>(Invoke(Ternary));\n  EXPECT_EQ(123, a.Perform(make_tuple(Short(100), Char(20), 5.6, Char(3))));\n}\n\n// Tests using WithArgs with an action that returns void.\nTEST(WithArgsTest, VoidAction) {\n  Action<void(double x, char c, int n)> a = WithArgs<2, 1>(Invoke(VoidBinary));\n  g_done = false;\n  a.Perform(make_tuple(1.5, 'a', 3));\n  EXPECT_TRUE(g_done);\n}\n\n// Tests DoAll(a1, a2).\nTEST(DoAllTest, TwoActions) {\n  int n = 0;\n  Action<int(int*)> a = DoAll(SetArgPointee<0>(1),  // NOLINT\n                              Return(2));\n  EXPECT_EQ(2, a.Perform(make_tuple(&n)));\n  EXPECT_EQ(1, n);\n}\n\n// Tests DoAll(a1, a2, a3).\nTEST(DoAllTest, ThreeActions) {\n  int m = 0, n = 0;\n  Action<int(int*, int*)> a = DoAll(SetArgPointee<0>(1),  // NOLINT\n                                    SetArgPointee<1>(2),\n                                    Return(3));\n  EXPECT_EQ(3, a.Perform(make_tuple(&m, &n)));\n  EXPECT_EQ(1, m);\n  EXPECT_EQ(2, n);\n}\n\n// Tests DoAll(a1, a2, a3, a4).\nTEST(DoAllTest, FourActions) {\n  int m = 0, n = 0;\n  char ch = '\\0';\n  Action<int(int*, int*, char*)> a =  // NOLINT\n      DoAll(SetArgPointee<0>(1),\n            SetArgPointee<1>(2),\n            SetArgPointee<2>('a'),\n            Return(3));\n  EXPECT_EQ(3, a.Perform(make_tuple(&m, &n, &ch)));\n  EXPECT_EQ(1, m);\n  EXPECT_EQ(2, n);\n  EXPECT_EQ('a', ch);\n}\n\n// Tests DoAll(a1, a2, a3, a4, a5).\nTEST(DoAllTest, FiveActions) {\n  int m = 0, n = 0;\n  char a = '\\0', b = '\\0';\n  Action<int(int*, int*, char*, char*)> action =  // NOLINT\n      DoAll(SetArgPointee<0>(1),\n            SetArgPointee<1>(2),\n            SetArgPointee<2>('a'),\n            SetArgPointee<3>('b'),\n            Return(3));\n  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b)));\n  EXPECT_EQ(1, m);\n  EXPECT_EQ(2, n);\n  EXPECT_EQ('a', a);\n  EXPECT_EQ('b', b);\n}\n\n// Tests DoAll(a1, a2, ..., a6).\nTEST(DoAllTest, SixActions) {\n  int m = 0, n = 0;\n  char a = '\\0', b = '\\0', c = '\\0';\n  Action<int(int*, int*, char*, char*, char*)> action =  // NOLINT\n      DoAll(SetArgPointee<0>(1),\n            SetArgPointee<1>(2),\n            SetArgPointee<2>('a'),\n            SetArgPointee<3>('b'),\n            SetArgPointee<4>('c'),\n            Return(3));\n  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c)));\n  EXPECT_EQ(1, m);\n  EXPECT_EQ(2, n);\n  EXPECT_EQ('a', a);\n  EXPECT_EQ('b', b);\n  EXPECT_EQ('c', c);\n}\n\n// Tests DoAll(a1, a2, ..., a7).\nTEST(DoAllTest, SevenActions) {\n  int m = 0, n = 0;\n  char a = '\\0', b = '\\0', c = '\\0', d = '\\0';\n  Action<int(int*, int*, char*, char*, char*, char*)> action =  // NOLINT\n      DoAll(SetArgPointee<0>(1),\n            SetArgPointee<1>(2),\n            SetArgPointee<2>('a'),\n            SetArgPointee<3>('b'),\n            SetArgPointee<4>('c'),\n            SetArgPointee<5>('d'),\n            Return(3));\n  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c, &d)));\n  EXPECT_EQ(1, m);\n  EXPECT_EQ(2, n);\n  EXPECT_EQ('a', a);\n  EXPECT_EQ('b', b);\n  EXPECT_EQ('c', c);\n  EXPECT_EQ('d', d);\n}\n\n// Tests DoAll(a1, a2, ..., a8).\nTEST(DoAllTest, EightActions) {\n  int m = 0, n = 0;\n  char a = '\\0', b = '\\0', c = '\\0', d = '\\0', e = '\\0';\n  Action<int(int*, int*, char*, char*, char*, char*,  // NOLINT\n             char*)> action =\n      DoAll(SetArgPointee<0>(1),\n            SetArgPointee<1>(2),\n            SetArgPointee<2>('a'),\n            SetArgPointee<3>('b'),\n            SetArgPointee<4>('c'),\n            SetArgPointee<5>('d'),\n            SetArgPointee<6>('e'),\n            Return(3));\n  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c, &d, &e)));\n  EXPECT_EQ(1, m);\n  EXPECT_EQ(2, n);\n  EXPECT_EQ('a', a);\n  EXPECT_EQ('b', b);\n  EXPECT_EQ('c', c);\n  EXPECT_EQ('d', d);\n  EXPECT_EQ('e', e);\n}\n\n// Tests DoAll(a1, a2, ..., a9).\nTEST(DoAllTest, NineActions) {\n  int m = 0, n = 0;\n  char a = '\\0', b = '\\0', c = '\\0', d = '\\0', e = '\\0', f = '\\0';\n  Action<int(int*, int*, char*, char*, char*, char*,  // NOLINT\n             char*, char*)> action =\n      DoAll(SetArgPointee<0>(1),\n            SetArgPointee<1>(2),\n            SetArgPointee<2>('a'),\n            SetArgPointee<3>('b'),\n            SetArgPointee<4>('c'),\n            SetArgPointee<5>('d'),\n            SetArgPointee<6>('e'),\n            SetArgPointee<7>('f'),\n            Return(3));\n  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c, &d, &e, &f)));\n  EXPECT_EQ(1, m);\n  EXPECT_EQ(2, n);\n  EXPECT_EQ('a', a);\n  EXPECT_EQ('b', b);\n  EXPECT_EQ('c', c);\n  EXPECT_EQ('d', d);\n  EXPECT_EQ('e', e);\n  EXPECT_EQ('f', f);\n}\n\n// Tests DoAll(a1, a2, ..., a10).\nTEST(DoAllTest, TenActions) {\n  int m = 0, n = 0;\n  char a = '\\0', b = '\\0', c = '\\0', d = '\\0';\n  char e = '\\0', f = '\\0', g = '\\0';\n  Action<int(int*, int*, char*, char*, char*, char*,  // NOLINT\n             char*, char*, char*)> action =\n      DoAll(SetArgPointee<0>(1),\n            SetArgPointee<1>(2),\n            SetArgPointee<2>('a'),\n            SetArgPointee<3>('b'),\n            SetArgPointee<4>('c'),\n            SetArgPointee<5>('d'),\n            SetArgPointee<6>('e'),\n            SetArgPointee<7>('f'),\n            SetArgPointee<8>('g'),\n            Return(3));\n  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c, &d, &e, &f, &g)));\n  EXPECT_EQ(1, m);\n  EXPECT_EQ(2, n);\n  EXPECT_EQ('a', a);\n  EXPECT_EQ('b', b);\n  EXPECT_EQ('c', c);\n  EXPECT_EQ('d', d);\n  EXPECT_EQ('e', e);\n  EXPECT_EQ('f', f);\n  EXPECT_EQ('g', g);\n}\n\n// The ACTION*() macros trigger warning C4100 (unreferenced formal\n// parameter) in MSVC with -W4.  Unfortunately they cannot be fixed in\n// the macro definition, as the warnings are generated when the macro\n// is expanded and macro expansion cannot contain #pragma.  Therefore\n// we suppress them here.\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4100)\n#endif\n\n// Tests the ACTION*() macro family.\n\n// Tests that ACTION() can define an action that doesn't reference the\n// mock function arguments.\nACTION(Return5) { return 5; }\n\nTEST(ActionMacroTest, WorksWhenNotReferencingArguments) {\n  Action<double()> a1 = Return5();\n  EXPECT_DOUBLE_EQ(5, a1.Perform(make_tuple()));\n\n  Action<int(double, bool)> a2 = Return5();\n  EXPECT_EQ(5, a2.Perform(make_tuple(1, true)));\n}\n\n// Tests that ACTION() can define an action that returns void.\nACTION(IncrementArg1) { (*arg1)++; }\n\nTEST(ActionMacroTest, WorksWhenReturningVoid) {\n  Action<void(int, int*)> a1 = IncrementArg1();\n  int n = 0;\n  a1.Perform(make_tuple(5, &n));\n  EXPECT_EQ(1, n);\n}\n\n// Tests that the body of ACTION() can reference the type of the\n// argument.\nACTION(IncrementArg2) {\n  StaticAssertTypeEq<int*, arg2_type>();\n  arg2_type temp = arg2;\n  (*temp)++;\n}\n\nTEST(ActionMacroTest, CanReferenceArgumentType) {\n  Action<void(int, bool, int*)> a1 = IncrementArg2();\n  int n = 0;\n  a1.Perform(make_tuple(5, false, &n));\n  EXPECT_EQ(1, n);\n}\n\n// Tests that the body of ACTION() can reference the argument tuple\n// via args_type and args.\nACTION(Sum2) {\n  StaticAssertTypeEq<tuple<int, char, int*>, args_type>();\n  args_type args_copy = args;\n  return get<0>(args_copy) + get<1>(args_copy);\n}\n\nTEST(ActionMacroTest, CanReferenceArgumentTuple) {\n  Action<int(int, char, int*)> a1 = Sum2();\n  int dummy = 0;\n  EXPECT_EQ(11, a1.Perform(make_tuple(5, Char(6), &dummy)));\n}\n\n// Tests that the body of ACTION() can reference the mock function\n// type.\nint Dummy(bool flag) { return flag? 1 : 0; }\n\nACTION(InvokeDummy) {\n  StaticAssertTypeEq<int(bool), function_type>();\n  function_type* fp = &Dummy;\n  return (*fp)(true);\n}\n\nTEST(ActionMacroTest, CanReferenceMockFunctionType) {\n  Action<int(bool)> a1 = InvokeDummy();\n  EXPECT_EQ(1, a1.Perform(make_tuple(true)));\n  EXPECT_EQ(1, a1.Perform(make_tuple(false)));\n}\n\n// Tests that the body of ACTION() can reference the mock function's\n// return type.\nACTION(InvokeDummy2) {\n  StaticAssertTypeEq<int, return_type>();\n  return_type result = Dummy(true);\n  return result;\n}\n\nTEST(ActionMacroTest, CanReferenceMockFunctionReturnType) {\n  Action<int(bool)> a1 = InvokeDummy2();\n  EXPECT_EQ(1, a1.Perform(make_tuple(true)));\n  EXPECT_EQ(1, a1.Perform(make_tuple(false)));\n}\n\n// Tests that ACTION() works for arguments passed by const reference.\nACTION(ReturnAddrOfConstBoolReferenceArg) {\n  StaticAssertTypeEq<const bool&, arg1_type>();\n  return &arg1;\n}\n\nTEST(ActionMacroTest, WorksForConstReferenceArg) {\n  Action<const bool*(int, const bool&)> a = ReturnAddrOfConstBoolReferenceArg();\n  const bool b = false;\n  EXPECT_EQ(&b, a.Perform(tuple<int, const bool&>(0, b)));\n}\n\n// Tests that ACTION() works for arguments passed by non-const reference.\nACTION(ReturnAddrOfIntReferenceArg) {\n  StaticAssertTypeEq<int&, arg0_type>();\n  return &arg0;\n}\n\nTEST(ActionMacroTest, WorksForNonConstReferenceArg) {\n  Action<int*(int&, bool, int)> a = ReturnAddrOfIntReferenceArg();\n  int n = 0;\n  EXPECT_EQ(&n, a.Perform(tuple<int&, bool, int>(n, true, 1)));\n}\n\n// Tests that ACTION() can be used in a namespace.\nnamespace action_test {\nACTION(Sum) { return arg0 + arg1; }\n}  // namespace action_test\n\nTEST(ActionMacroTest, WorksInNamespace) {\n  Action<int(int, int)> a1 = action_test::Sum();\n  EXPECT_EQ(3, a1.Perform(make_tuple(1, 2)));\n}\n\n// Tests that the same ACTION definition works for mock functions with\n// different argument numbers.\nACTION(PlusTwo) { return arg0 + 2; }\n\nTEST(ActionMacroTest, WorksForDifferentArgumentNumbers) {\n  Action<int(int)> a1 = PlusTwo();\n  EXPECT_EQ(4, a1.Perform(make_tuple(2)));\n\n  Action<double(float, void*)> a2 = PlusTwo();\n  int dummy;\n  EXPECT_DOUBLE_EQ(6, a2.Perform(make_tuple(4.0f, &dummy)));\n}\n\n// Tests that ACTION_P can define a parameterized action.\nACTION_P(Plus, n) { return arg0 + n; }\n\nTEST(ActionPMacroTest, DefinesParameterizedAction) {\n  Action<int(int m, bool t)> a1 = Plus(9);\n  EXPECT_EQ(10, a1.Perform(make_tuple(1, true)));\n}\n\n// Tests that the body of ACTION_P can reference the argument types\n// and the parameter type.\nACTION_P(TypedPlus, n) {\n  arg0_type t1 = arg0;\n  n_type t2 = n;\n  return t1 + t2;\n}\n\nTEST(ActionPMacroTest, CanReferenceArgumentAndParameterTypes) {\n  Action<int(char m, bool t)> a1 = TypedPlus(9);\n  EXPECT_EQ(10, a1.Perform(make_tuple(Char(1), true)));\n}\n\n// Tests that a parameterized action can be used in any mock function\n// whose type is compatible.\nTEST(ActionPMacroTest, WorksInCompatibleMockFunction) {\n  Action<std::string(const std::string& s)> a1 = Plus(\"tail\");\n  const std::string re = \"re\";\n  tuple<const std::string> dummy = make_tuple(re);\n  EXPECT_EQ(\"retail\", a1.Perform(dummy));\n}\n\n// Tests that we can use ACTION*() to define actions overloaded on the\n// number of parameters.\n\nACTION(OverloadedAction) { return arg0 ? arg1 : \"hello\"; }\n\nACTION_P(OverloadedAction, default_value) {\n  return arg0 ? arg1 : default_value;\n}\n\nACTION_P2(OverloadedAction, true_value, false_value) {\n  return arg0 ? true_value : false_value;\n}\n\nTEST(ActionMacroTest, CanDefineOverloadedActions) {\n  typedef Action<const char*(bool, const char*)> MyAction;\n\n  const MyAction a1 = OverloadedAction();\n  EXPECT_STREQ(\"hello\", a1.Perform(make_tuple(false, CharPtr(\"world\"))));\n  EXPECT_STREQ(\"world\", a1.Perform(make_tuple(true, CharPtr(\"world\"))));\n\n  const MyAction a2 = OverloadedAction(\"hi\");\n  EXPECT_STREQ(\"hi\", a2.Perform(make_tuple(false, CharPtr(\"world\"))));\n  EXPECT_STREQ(\"world\", a2.Perform(make_tuple(true, CharPtr(\"world\"))));\n\n  const MyAction a3 = OverloadedAction(\"hi\", \"you\");\n  EXPECT_STREQ(\"hi\", a3.Perform(make_tuple(true, CharPtr(\"world\"))));\n  EXPECT_STREQ(\"you\", a3.Perform(make_tuple(false, CharPtr(\"world\"))));\n}\n\n// Tests ACTION_Pn where n >= 3.\n\nACTION_P3(Plus, m, n, k) { return arg0 + m + n + k; }\n\nTEST(ActionPnMacroTest, WorksFor3Parameters) {\n  Action<double(int m, bool t)> a1 = Plus(100, 20, 3.4);\n  EXPECT_DOUBLE_EQ(3123.4, a1.Perform(make_tuple(3000, true)));\n\n  Action<std::string(const std::string& s)> a2 = Plus(\"tail\", \"-\", \">\");\n  const std::string re = \"re\";\n  tuple<const std::string> dummy = make_tuple(re);\n  EXPECT_EQ(\"retail->\", a2.Perform(dummy));\n}\n\nACTION_P4(Plus, p0, p1, p2, p3) { return arg0 + p0 + p1 + p2 + p3; }\n\nTEST(ActionPnMacroTest, WorksFor4Parameters) {\n  Action<int(int)> a1 = Plus(1, 2, 3, 4);\n  EXPECT_EQ(10 + 1 + 2 + 3 + 4, a1.Perform(make_tuple(10)));\n}\n\nACTION_P5(Plus, p0, p1, p2, p3, p4) { return arg0 + p0 + p1 + p2 + p3 + p4; }\n\nTEST(ActionPnMacroTest, WorksFor5Parameters) {\n  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5);\n  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5, a1.Perform(make_tuple(10)));\n}\n\nACTION_P6(Plus, p0, p1, p2, p3, p4, p5) {\n  return arg0 + p0 + p1 + p2 + p3 + p4 + p5;\n}\n\nTEST(ActionPnMacroTest, WorksFor6Parameters) {\n  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6);\n  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6, a1.Perform(make_tuple(10)));\n}\n\nACTION_P7(Plus, p0, p1, p2, p3, p4, p5, p6) {\n  return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6;\n}\n\nTEST(ActionPnMacroTest, WorksFor7Parameters) {\n  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7);\n  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7, a1.Perform(make_tuple(10)));\n}\n\nACTION_P8(Plus, p0, p1, p2, p3, p4, p5, p6, p7) {\n  return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7;\n}\n\nTEST(ActionPnMacroTest, WorksFor8Parameters) {\n  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8);\n  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8, a1.Perform(make_tuple(10)));\n}\n\nACTION_P9(Plus, p0, p1, p2, p3, p4, p5, p6, p7, p8) {\n  return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8;\n}\n\nTEST(ActionPnMacroTest, WorksFor9Parameters) {\n  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8, 9);\n  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9, a1.Perform(make_tuple(10)));\n}\n\nACTION_P10(Plus, p0, p1, p2, p3, p4, p5, p6, p7, p8, last_param) {\n  arg0_type t0 = arg0;\n  last_param_type t9 = last_param;\n  return t0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + t9;\n}\n\nTEST(ActionPnMacroTest, WorksFor10Parameters) {\n  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);\n  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10,\n            a1.Perform(make_tuple(10)));\n}\n\n// Tests that the action body can promote the parameter types.\n\nACTION_P2(PadArgument, prefix, suffix) {\n  // The following lines promote the two parameters to desired types.\n  std::string prefix_str(prefix);\n  char suffix_char = static_cast<char>(suffix);\n  return prefix_str + arg0 + suffix_char;\n}\n\nTEST(ActionPnMacroTest, SimpleTypePromotion) {\n  Action<std::string(const char*)> no_promo =\n      PadArgument(std::string(\"foo\"), 'r');\n  Action<std::string(const char*)> promo =\n      PadArgument(\"foo\", static_cast<int>('r'));\n  EXPECT_EQ(\"foobar\", no_promo.Perform(make_tuple(CharPtr(\"ba\"))));\n  EXPECT_EQ(\"foobar\", promo.Perform(make_tuple(CharPtr(\"ba\"))));\n}\n\n// Tests that we can partially restrict parameter types using a\n// straight-forward pattern.\n\n// Defines a generic action that doesn't restrict the types of its\n// parameters.\nACTION_P3(ConcatImpl, a, b, c) {\n  std::stringstream ss;\n  ss << a << b << c;\n  return ss.str();\n}\n\n// Next, we try to restrict that either the first parameter is a\n// string, or the second parameter is an int.\n\n// Defines a partially specialized wrapper that restricts the first\n// parameter to std::string.\ntemplate <typename T1, typename T2>\n// ConcatImplActionP3 is the class template ACTION_P3 uses to\n// implement ConcatImpl.  We shouldn't change the name as this\n// pattern requires the user to use it directly.\nConcatImplActionP3<std::string, T1, T2>\nConcat(const std::string& a, T1 b, T2 c) {\n  GTEST_INTENTIONAL_CONST_COND_PUSH_()\n  if (true) {\n  GTEST_INTENTIONAL_CONST_COND_POP_()\n    // This branch verifies that ConcatImpl() can be invoked without\n    // explicit template arguments.\n    return ConcatImpl(a, b, c);\n  } else {\n    // This branch verifies that ConcatImpl() can also be invoked with\n    // explicit template arguments.  It doesn't really need to be\n    // executed as this is a compile-time verification.\n    return ConcatImpl<std::string, T1, T2>(a, b, c);\n  }\n}\n\n// Defines another partially specialized wrapper that restricts the\n// second parameter to int.\ntemplate <typename T1, typename T2>\nConcatImplActionP3<T1, int, T2>\nConcat(T1 a, int b, T2 c) {\n  return ConcatImpl(a, b, c);\n}\n\nTEST(ActionPnMacroTest, CanPartiallyRestrictParameterTypes) {\n  Action<const std::string()> a1 = Concat(\"Hello\", \"1\", 2);\n  EXPECT_EQ(\"Hello12\", a1.Perform(make_tuple()));\n\n  a1 = Concat(1, 2, 3);\n  EXPECT_EQ(\"123\", a1.Perform(make_tuple()));\n}\n\n// Verifies the type of an ACTION*.\n\nACTION(DoFoo) {}\nACTION_P(DoFoo, p) {}\nACTION_P2(DoFoo, p0, p1) {}\n\nTEST(ActionPnMacroTest, TypesAreCorrect) {\n  // DoFoo() must be assignable to a DoFooAction variable.\n  DoFooAction a0 = DoFoo();\n\n  // DoFoo(1) must be assignable to a DoFooActionP variable.\n  DoFooActionP<int> a1 = DoFoo(1);\n\n  // DoFoo(p1, ..., pk) must be assignable to a DoFooActionPk\n  // variable, and so on.\n  DoFooActionP2<int, char> a2 = DoFoo(1, '2');\n  PlusActionP3<int, int, char> a3 = Plus(1, 2, '3');\n  PlusActionP4<int, int, int, char> a4 = Plus(1, 2, 3, '4');\n  PlusActionP5<int, int, int, int, char> a5 = Plus(1, 2, 3, 4, '5');\n  PlusActionP6<int, int, int, int, int, char> a6 = Plus(1, 2, 3, 4, 5, '6');\n  PlusActionP7<int, int, int, int, int, int, char> a7 =\n      Plus(1, 2, 3, 4, 5, 6, '7');\n  PlusActionP8<int, int, int, int, int, int, int, char> a8 =\n      Plus(1, 2, 3, 4, 5, 6, 7, '8');\n  PlusActionP9<int, int, int, int, int, int, int, int, char> a9 =\n      Plus(1, 2, 3, 4, 5, 6, 7, 8, '9');\n  PlusActionP10<int, int, int, int, int, int, int, int, int, char> a10 =\n      Plus(1, 2, 3, 4, 5, 6, 7, 8, 9, '0');\n\n  // Avoid \"unused variable\" warnings.\n  (void)a0;\n  (void)a1;\n  (void)a2;\n  (void)a3;\n  (void)a4;\n  (void)a5;\n  (void)a6;\n  (void)a7;\n  (void)a8;\n  (void)a9;\n  (void)a10;\n}\n\n// Tests that an ACTION_P*() action can be explicitly instantiated\n// with reference-typed parameters.\n\nACTION_P(Plus1, x) { return x; }\nACTION_P2(Plus2, x, y) { return x + y; }\nACTION_P3(Plus3, x, y, z) { return x + y + z; }\nACTION_P10(Plus10, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {\n  return a0 + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9;\n}\n\nTEST(ActionPnMacroTest, CanExplicitlyInstantiateWithReferenceTypes) {\n  int x = 1, y = 2, z = 3;\n  const tuple<> empty = make_tuple();\n\n  Action<int()> a = Plus1<int&>(x);\n  EXPECT_EQ(1, a.Perform(empty));\n\n  a = Plus2<const int&, int&>(x, y);\n  EXPECT_EQ(3, a.Perform(empty));\n\n  a = Plus3<int&, const int&, int&>(x, y, z);\n  EXPECT_EQ(6, a.Perform(empty));\n\n  int n[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };\n  a = Plus10<const int&, int&, const int&, int&, const int&, int&, const int&,\n      int&, const int&, int&>(n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7],\n                              n[8], n[9]);\n  EXPECT_EQ(55, a.Perform(empty));\n}\n\nclass NullaryConstructorClass {\n public:\n  NullaryConstructorClass() : value_(123) {}\n  int value_;\n};\n\n// Tests using ReturnNew() with a nullary constructor.\nTEST(ReturnNewTest, NoArgs) {\n  Action<NullaryConstructorClass*()> a = ReturnNew<NullaryConstructorClass>();\n  NullaryConstructorClass* c = a.Perform(make_tuple());\n  EXPECT_EQ(123, c->value_);\n  delete c;\n}\n\nclass UnaryConstructorClass {\n public:\n  explicit UnaryConstructorClass(int value) : value_(value) {}\n  int value_;\n};\n\n// Tests using ReturnNew() with a unary constructor.\nTEST(ReturnNewTest, Unary) {\n  Action<UnaryConstructorClass*()> a = ReturnNew<UnaryConstructorClass>(4000);\n  UnaryConstructorClass* c = a.Perform(make_tuple());\n  EXPECT_EQ(4000, c->value_);\n  delete c;\n}\n\nTEST(ReturnNewTest, UnaryWorksWhenMockMethodHasArgs) {\n  Action<UnaryConstructorClass*(bool, int)> a =\n      ReturnNew<UnaryConstructorClass>(4000);\n  UnaryConstructorClass* c = a.Perform(make_tuple(false, 5));\n  EXPECT_EQ(4000, c->value_);\n  delete c;\n}\n\nTEST(ReturnNewTest, UnaryWorksWhenMockMethodReturnsPointerToConst) {\n  Action<const UnaryConstructorClass*()> a =\n      ReturnNew<UnaryConstructorClass>(4000);\n  const UnaryConstructorClass* c = a.Perform(make_tuple());\n  EXPECT_EQ(4000, c->value_);\n  delete c;\n}\n\nclass TenArgConstructorClass {\n public:\n  TenArgConstructorClass(int a1, int a2, int a3, int a4, int a5,\n                         int a6, int a7, int a8, int a9, int a10)\n    : value_(a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10) {\n  }\n  int value_;\n};\n\n// Tests using ReturnNew() with a 10-argument constructor.\nTEST(ReturnNewTest, ConstructorThatTakes10Arguments) {\n  Action<TenArgConstructorClass*()> a =\n      ReturnNew<TenArgConstructorClass>(1000000000, 200000000, 30000000,\n                                        4000000, 500000, 60000,\n                                        7000, 800, 90, 0);\n  TenArgConstructorClass* c = a.Perform(make_tuple());\n  EXPECT_EQ(1234567890, c->value_);\n  delete c;\n}\n\n// Tests that ACTION_TEMPLATE works when there is no value parameter.\nACTION_TEMPLATE(CreateNew,\n                HAS_1_TEMPLATE_PARAMS(typename, T),\n                AND_0_VALUE_PARAMS()) {\n  return new T;\n}\n\nTEST(ActionTemplateTest, WorksWithoutValueParam) {\n  const Action<int*()> a = CreateNew<int>();\n  int* p = a.Perform(make_tuple());\n  delete p;\n}\n\n// Tests that ACTION_TEMPLATE works when there are value parameters.\nACTION_TEMPLATE(CreateNew,\n                HAS_1_TEMPLATE_PARAMS(typename, T),\n                AND_1_VALUE_PARAMS(a0)) {\n  return new T(a0);\n}\n\nTEST(ActionTemplateTest, WorksWithValueParams) {\n  const Action<int*()> a = CreateNew<int>(42);\n  int* p = a.Perform(make_tuple());\n  EXPECT_EQ(42, *p);\n  delete p;\n}\n\n// Tests that ACTION_TEMPLATE works for integral template parameters.\nACTION_TEMPLATE(MyDeleteArg,\n                HAS_1_TEMPLATE_PARAMS(int, k),\n                AND_0_VALUE_PARAMS()) {\n  delete get<k>(args);\n}\n\n// Resets a bool variable in the destructor.\nclass BoolResetter {\n public:\n  explicit BoolResetter(bool* value) : value_(value) {}\n  ~BoolResetter() { *value_ = false; }\n private:\n  bool* value_;\n};\n\nTEST(ActionTemplateTest, WorksForIntegralTemplateParams) {\n  const Action<void(int*, BoolResetter*)> a = MyDeleteArg<1>();\n  int n = 0;\n  bool b = true;\n  BoolResetter* resetter = new BoolResetter(&b);\n  a.Perform(make_tuple(&n, resetter));\n  EXPECT_FALSE(b);  // Verifies that resetter is deleted.\n}\n\n// Tests that ACTION_TEMPLATES works for template template parameters.\nACTION_TEMPLATE(ReturnSmartPointer,\n                HAS_1_TEMPLATE_PARAMS(template <typename Pointee> class,\n                                      Pointer),\n                AND_1_VALUE_PARAMS(pointee)) {\n  return Pointer<pointee_type>(new pointee_type(pointee));\n}\n\nTEST(ActionTemplateTest, WorksForTemplateTemplateParameters) {\n  using ::testing::internal::linked_ptr;\n  const Action<linked_ptr<int>()> a = ReturnSmartPointer<linked_ptr>(42);\n  linked_ptr<int> p = a.Perform(make_tuple());\n  EXPECT_EQ(42, *p);\n}\n\n// Tests that ACTION_TEMPLATE works for 10 template parameters.\ntemplate <typename T1, typename T2, typename T3, int k4, bool k5,\n          unsigned int k6, typename T7, typename T8, typename T9>\nstruct GiantTemplate {\n public:\n  explicit GiantTemplate(int a_value) : value(a_value) {}\n  int value;\n};\n\nACTION_TEMPLATE(ReturnGiant,\n                HAS_10_TEMPLATE_PARAMS(\n                    typename, T1,\n                    typename, T2,\n                    typename, T3,\n                    int, k4,\n                    bool, k5,\n                    unsigned int, k6,\n                    class, T7,\n                    class, T8,\n                    class, T9,\n                    template <typename T> class, T10),\n                AND_1_VALUE_PARAMS(value)) {\n  return GiantTemplate<T10<T1>, T2, T3, k4, k5, k6, T7, T8, T9>(value);\n}\n\nTEST(ActionTemplateTest, WorksFor10TemplateParameters) {\n  using ::testing::internal::linked_ptr;\n  typedef GiantTemplate<linked_ptr<int>, bool, double, 5,\n      true, 6, char, unsigned, int> Giant;\n  const Action<Giant()> a = ReturnGiant<\n      int, bool, double, 5, true, 6, char, unsigned, int, linked_ptr>(42);\n  Giant giant = a.Perform(make_tuple());\n  EXPECT_EQ(42, giant.value);\n}\n\n// Tests that ACTION_TEMPLATE works for 10 value parameters.\nACTION_TEMPLATE(ReturnSum,\n                HAS_1_TEMPLATE_PARAMS(typename, Number),\n                AND_10_VALUE_PARAMS(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)) {\n  return static_cast<Number>(v1) + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10;\n}\n\nTEST(ActionTemplateTest, WorksFor10ValueParameters) {\n  const Action<int()> a = ReturnSum<int>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);\n  EXPECT_EQ(55, a.Perform(make_tuple()));\n}\n\n// Tests that ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded\n// on the number of value parameters.\n\nACTION(ReturnSum) { return 0; }\n\nACTION_P(ReturnSum, x) { return x; }\n\nACTION_TEMPLATE(ReturnSum,\n                HAS_1_TEMPLATE_PARAMS(typename, Number),\n                AND_2_VALUE_PARAMS(v1, v2)) {\n  return static_cast<Number>(v1) + v2;\n}\n\nACTION_TEMPLATE(ReturnSum,\n                HAS_1_TEMPLATE_PARAMS(typename, Number),\n                AND_3_VALUE_PARAMS(v1, v2, v3)) {\n  return static_cast<Number>(v1) + v2 + v3;\n}\n\nACTION_TEMPLATE(ReturnSum,\n                HAS_2_TEMPLATE_PARAMS(typename, Number, int, k),\n                AND_4_VALUE_PARAMS(v1, v2, v3, v4)) {\n  return static_cast<Number>(v1) + v2 + v3 + v4 + k;\n}\n\nTEST(ActionTemplateTest, CanBeOverloadedOnNumberOfValueParameters) {\n  const Action<int()> a0 = ReturnSum();\n  const Action<int()> a1 = ReturnSum(1);\n  const Action<int()> a2 = ReturnSum<int>(1, 2);\n  const Action<int()> a3 = ReturnSum<int>(1, 2, 3);\n  const Action<int()> a4 = ReturnSum<int, 10000>(2000, 300, 40, 5);\n  EXPECT_EQ(0, a0.Perform(make_tuple()));\n  EXPECT_EQ(1, a1.Perform(make_tuple()));\n  EXPECT_EQ(3, a2.Perform(make_tuple()));\n  EXPECT_EQ(6, a3.Perform(make_tuple()));\n  EXPECT_EQ(12345, a4.Perform(make_tuple()));\n}\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n\n}  // namespace gmock_generated_actions_test\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock-generated-function-mockers_test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file tests the function mocker classes.\n\n#include \"gmock/gmock-generated-function-mockers.h\"\n\n#if GTEST_OS_WINDOWS\n// MSDN says the header file to be included for STDMETHOD is BaseTyps.h but\n// we are getting compiler errors if we use basetyps.h, hence including\n// objbase.h for definition of STDMETHOD.\n# include <objbase.h>\n#endif  // GTEST_OS_WINDOWS\n\n#include <map>\n#include <string>\n#include \"gmock/gmock.h\"\n#include \"gtest/gtest.h\"\n\n// There is a bug in MSVC (fixed in VS 2008) that prevents creating a\n// mock for a function with const arguments, so we don't test such\n// cases for MSVC versions older than 2008.\n#if !GTEST_OS_WINDOWS || (_MSC_VER >= 1500)\n# define GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS\n#endif  // !GTEST_OS_WINDOWS || (_MSC_VER >= 1500)\n\nnamespace testing {\nnamespace gmock_generated_function_mockers_test {\n\nusing testing::_;\nusing testing::A;\nusing testing::An;\nusing testing::AnyNumber;\nusing testing::Const;\nusing testing::DoDefault;\nusing testing::Eq;\nusing testing::Lt;\nusing testing::MockFunction;\nusing testing::Ref;\nusing testing::Return;\nusing testing::ReturnRef;\nusing testing::TypedEq;\n\nclass FooInterface {\n public:\n  virtual ~FooInterface() {}\n\n  virtual void VoidReturning(int x) = 0;\n\n  virtual int Nullary() = 0;\n  virtual bool Unary(int x) = 0;\n  virtual long Binary(short x, int y) = 0;  // NOLINT\n  virtual int Decimal(bool b, char c, short d, int e, long f,  // NOLINT\n                      float g, double h, unsigned i, char* j,\n                      const std::string& k) = 0;\n\n  virtual bool TakesNonConstReference(int& n) = 0;  // NOLINT\n  virtual std::string TakesConstReference(const int& n) = 0;\n#ifdef GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS\n  virtual bool TakesConst(const int x) = 0;\n#endif  // GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS\n\n  virtual int OverloadedOnArgumentNumber() = 0;\n  virtual int OverloadedOnArgumentNumber(int n) = 0;\n\n  virtual int OverloadedOnArgumentType(int n) = 0;\n  virtual char OverloadedOnArgumentType(char c) = 0;\n\n  virtual int OverloadedOnConstness() = 0;\n  virtual char OverloadedOnConstness() const = 0;\n\n  virtual int TypeWithHole(int (*func)()) = 0;\n  virtual int TypeWithComma(const std::map<int, std::string>& a_map) = 0;\n\n#if GTEST_OS_WINDOWS\n  STDMETHOD_(int, CTNullary)() = 0;\n  STDMETHOD_(bool, CTUnary)(int x) = 0;\n  STDMETHOD_(int, CTDecimal)\n  (bool b, char c, short d, int e, long f,  // NOLINT\n   float g, double h, unsigned i, char* j, const std::string& k) = 0;\n  STDMETHOD_(char, CTConst)(int x) const = 0;\n#endif  // GTEST_OS_WINDOWS\n};\n\n// Const qualifiers on arguments were once (incorrectly) considered\n// significant in determining whether two virtual functions had the same\n// signature. This was fixed in Visual Studio 2008. However, the compiler\n// still emits a warning that alerts about this change in behavior.\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable : 4373)\n#endif\nclass MockFoo : public FooInterface {\n public:\n  MockFoo() {}\n\n  // Makes sure that a mock function parameter can be named.\n  MOCK_METHOD1(VoidReturning, void(int n));  // NOLINT\n\n  MOCK_METHOD0(Nullary, int());  // NOLINT\n\n  // Makes sure that a mock function parameter can be unnamed.\n  MOCK_METHOD1(Unary, bool(int));  // NOLINT\n  MOCK_METHOD2(Binary, long(short, int));  // NOLINT\n  MOCK_METHOD10(Decimal, int(bool, char, short, int, long, float,  // NOLINT\n                             double, unsigned, char*, const std::string& str));\n\n  MOCK_METHOD1(TakesNonConstReference, bool(int&));  // NOLINT\n  MOCK_METHOD1(TakesConstReference, std::string(const int&));\n\n#ifdef GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS\n  MOCK_METHOD1(TakesConst, bool(const int));  // NOLINT\n#endif\n\n  // Tests that the function return type can contain unprotected comma.\n  MOCK_METHOD0(ReturnTypeWithComma, std::map<int, std::string>());\n  MOCK_CONST_METHOD1(ReturnTypeWithComma,\n                     std::map<int, std::string>(int));  // NOLINT\n\n  MOCK_METHOD0(OverloadedOnArgumentNumber, int());  // NOLINT\n  MOCK_METHOD1(OverloadedOnArgumentNumber, int(int));  // NOLINT\n\n  MOCK_METHOD1(OverloadedOnArgumentType, int(int));  // NOLINT\n  MOCK_METHOD1(OverloadedOnArgumentType, char(char));  // NOLINT\n\n  MOCK_METHOD0(OverloadedOnConstness, int());  // NOLINT\n  MOCK_CONST_METHOD0(OverloadedOnConstness, char());  // NOLINT\n\n  MOCK_METHOD1(TypeWithHole, int(int (*)()));  // NOLINT\n  MOCK_METHOD1(TypeWithComma,\n               int(const std::map<int, std::string>&));  // NOLINT\n\n#if GTEST_OS_WINDOWS\n  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, CTNullary, int());\n  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, CTUnary, bool(int));\n  MOCK_METHOD10_WITH_CALLTYPE(STDMETHODCALLTYPE, CTDecimal,\n                              int(bool b, char c, short d, int e, long f,\n                                  float g, double h, unsigned i, char* j,\n                                  const std::string& k));\n  MOCK_CONST_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, CTConst, char(int));\n\n  // Tests that the function return type can contain unprotected comma.\n  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, CTReturnTypeWithComma,\n                             std::map<int, std::string>());\n#endif  // GTEST_OS_WINDOWS\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo);\n};\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n\nclass FunctionMockerTest : public testing::Test {\n protected:\n  FunctionMockerTest() : foo_(&mock_foo_) {}\n\n  FooInterface* const foo_;\n  MockFoo mock_foo_;\n};\n\n// Tests mocking a void-returning function.\nTEST_F(FunctionMockerTest, MocksVoidFunction) {\n  EXPECT_CALL(mock_foo_, VoidReturning(Lt(100)));\n  foo_->VoidReturning(0);\n}\n\n// Tests mocking a nullary function.\nTEST_F(FunctionMockerTest, MocksNullaryFunction) {\n  EXPECT_CALL(mock_foo_, Nullary())\n      .WillOnce(DoDefault())\n      .WillOnce(Return(1));\n\n  EXPECT_EQ(0, foo_->Nullary());\n  EXPECT_EQ(1, foo_->Nullary());\n}\n\n// Tests mocking a unary function.\nTEST_F(FunctionMockerTest, MocksUnaryFunction) {\n  EXPECT_CALL(mock_foo_, Unary(Eq(2)))\n      .Times(2)\n      .WillOnce(Return(true));\n\n  EXPECT_TRUE(foo_->Unary(2));\n  EXPECT_FALSE(foo_->Unary(2));\n}\n\n// Tests mocking a binary function.\nTEST_F(FunctionMockerTest, MocksBinaryFunction) {\n  EXPECT_CALL(mock_foo_, Binary(2, _))\n      .WillOnce(Return(3));\n\n  EXPECT_EQ(3, foo_->Binary(2, 1));\n}\n\n// Tests mocking a decimal function.\nTEST_F(FunctionMockerTest, MocksDecimalFunction) {\n  EXPECT_CALL(mock_foo_, Decimal(true, 'a', 0, 0, 1L, A<float>(),\n                                 Lt(100), 5U, NULL, \"hi\"))\n      .WillOnce(Return(5));\n\n  EXPECT_EQ(5, foo_->Decimal(true, 'a', 0, 0, 1, 0, 0, 5, NULL, \"hi\"));\n}\n\n// Tests mocking a function that takes a non-const reference.\nTEST_F(FunctionMockerTest, MocksFunctionWithNonConstReferenceArgument) {\n  int a = 0;\n  EXPECT_CALL(mock_foo_, TakesNonConstReference(Ref(a)))\n      .WillOnce(Return(true));\n\n  EXPECT_TRUE(foo_->TakesNonConstReference(a));\n}\n\n// Tests mocking a function that takes a const reference.\nTEST_F(FunctionMockerTest, MocksFunctionWithConstReferenceArgument) {\n  int a = 0;\n  EXPECT_CALL(mock_foo_, TakesConstReference(Ref(a)))\n      .WillOnce(Return(\"Hello\"));\n\n  EXPECT_EQ(\"Hello\", foo_->TakesConstReference(a));\n}\n\n#ifdef GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS\n// Tests mocking a function that takes a const variable.\nTEST_F(FunctionMockerTest, MocksFunctionWithConstArgument) {\n  EXPECT_CALL(mock_foo_, TakesConst(Lt(10)))\n      .WillOnce(DoDefault());\n\n  EXPECT_FALSE(foo_->TakesConst(5));\n}\n#endif  // GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS\n\n// Tests mocking functions overloaded on the number of arguments.\nTEST_F(FunctionMockerTest, MocksFunctionsOverloadedOnArgumentNumber) {\n  EXPECT_CALL(mock_foo_, OverloadedOnArgumentNumber())\n      .WillOnce(Return(1));\n  EXPECT_CALL(mock_foo_, OverloadedOnArgumentNumber(_))\n      .WillOnce(Return(2));\n\n  EXPECT_EQ(2, foo_->OverloadedOnArgumentNumber(1));\n  EXPECT_EQ(1, foo_->OverloadedOnArgumentNumber());\n}\n\n// Tests mocking functions overloaded on the types of argument.\nTEST_F(FunctionMockerTest, MocksFunctionsOverloadedOnArgumentType) {\n  EXPECT_CALL(mock_foo_, OverloadedOnArgumentType(An<int>()))\n      .WillOnce(Return(1));\n  EXPECT_CALL(mock_foo_, OverloadedOnArgumentType(TypedEq<char>('a')))\n      .WillOnce(Return('b'));\n\n  EXPECT_EQ(1, foo_->OverloadedOnArgumentType(0));\n  EXPECT_EQ('b', foo_->OverloadedOnArgumentType('a'));\n}\n\n// Tests mocking functions overloaded on the const-ness of this object.\nTEST_F(FunctionMockerTest, MocksFunctionsOverloadedOnConstnessOfThis) {\n  EXPECT_CALL(mock_foo_, OverloadedOnConstness());\n  EXPECT_CALL(Const(mock_foo_), OverloadedOnConstness())\n      .WillOnce(Return('a'));\n\n  EXPECT_EQ(0, foo_->OverloadedOnConstness());\n  EXPECT_EQ('a', Const(*foo_).OverloadedOnConstness());\n}\n\nTEST_F(FunctionMockerTest, MocksReturnTypeWithComma) {\n  const std::map<int, std::string> a_map;\n  EXPECT_CALL(mock_foo_, ReturnTypeWithComma())\n      .WillOnce(Return(a_map));\n  EXPECT_CALL(mock_foo_, ReturnTypeWithComma(42))\n      .WillOnce(Return(a_map));\n\n  EXPECT_EQ(a_map, mock_foo_.ReturnTypeWithComma());\n  EXPECT_EQ(a_map, mock_foo_.ReturnTypeWithComma(42));\n}\n\n#if GTEST_OS_WINDOWS\n// Tests mocking a nullary function with calltype.\nTEST_F(FunctionMockerTest, MocksNullaryFunctionWithCallType) {\n  EXPECT_CALL(mock_foo_, CTNullary())\n      .WillOnce(Return(-1))\n      .WillOnce(Return(0));\n\n  EXPECT_EQ(-1, foo_->CTNullary());\n  EXPECT_EQ(0, foo_->CTNullary());\n}\n\n// Tests mocking a unary function with calltype.\nTEST_F(FunctionMockerTest, MocksUnaryFunctionWithCallType) {\n  EXPECT_CALL(mock_foo_, CTUnary(Eq(2)))\n      .Times(2)\n      .WillOnce(Return(true))\n      .WillOnce(Return(false));\n\n  EXPECT_TRUE(foo_->CTUnary(2));\n  EXPECT_FALSE(foo_->CTUnary(2));\n}\n\n// Tests mocking a decimal function with calltype.\nTEST_F(FunctionMockerTest, MocksDecimalFunctionWithCallType) {\n  EXPECT_CALL(mock_foo_, CTDecimal(true, 'a', 0, 0, 1L, A<float>(),\n                                   Lt(100), 5U, NULL, \"hi\"))\n      .WillOnce(Return(10));\n\n  EXPECT_EQ(10, foo_->CTDecimal(true, 'a', 0, 0, 1, 0, 0, 5, NULL, \"hi\"));\n}\n\n// Tests mocking functions overloaded on the const-ness of this object.\nTEST_F(FunctionMockerTest, MocksFunctionsConstFunctionWithCallType) {\n  EXPECT_CALL(Const(mock_foo_), CTConst(_))\n      .WillOnce(Return('a'));\n\n  EXPECT_EQ('a', Const(*foo_).CTConst(0));\n}\n\nTEST_F(FunctionMockerTest, MocksReturnTypeWithCommaAndCallType) {\n  const std::map<int, std::string> a_map;\n  EXPECT_CALL(mock_foo_, CTReturnTypeWithComma())\n      .WillOnce(Return(a_map));\n\n  EXPECT_EQ(a_map, mock_foo_.CTReturnTypeWithComma());\n}\n\n#endif  // GTEST_OS_WINDOWS\n\nclass MockB {\n public:\n  MockB() {}\n\n  MOCK_METHOD0(DoB, void());\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockB);\n};\n\n// Tests that functions with no EXPECT_CALL() ruls can be called any\n// number of times.\nTEST(ExpectCallTest, UnmentionedFunctionCanBeCalledAnyNumberOfTimes) {\n  {\n    MockB b;\n  }\n\n  {\n    MockB b;\n    b.DoB();\n  }\n\n  {\n    MockB b;\n    b.DoB();\n    b.DoB();\n  }\n}\n\n// Tests mocking template interfaces.\n\ntemplate <typename T>\nclass StackInterface {\n public:\n  virtual ~StackInterface() {}\n\n  // Template parameter appears in function parameter.\n  virtual void Push(const T& value) = 0;\n  virtual void Pop() = 0;\n  virtual int GetSize() const = 0;\n  // Template parameter appears in function return type.\n  virtual const T& GetTop() const = 0;\n};\n\ntemplate <typename T>\nclass MockStack : public StackInterface<T> {\n public:\n  MockStack() {}\n\n  MOCK_METHOD1_T(Push, void(const T& elem));\n  MOCK_METHOD0_T(Pop, void());\n  MOCK_CONST_METHOD0_T(GetSize, int());  // NOLINT\n  MOCK_CONST_METHOD0_T(GetTop, const T&());\n\n  // Tests that the function return type can contain unprotected comma.\n  MOCK_METHOD0_T(ReturnTypeWithComma, std::map<int, int>());\n  MOCK_CONST_METHOD1_T(ReturnTypeWithComma, std::map<int, int>(int));  // NOLINT\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockStack);\n};\n\n// Tests that template mock works.\nTEST(TemplateMockTest, Works) {\n  MockStack<int> mock;\n\n  EXPECT_CALL(mock, GetSize())\n      .WillOnce(Return(0))\n      .WillOnce(Return(1))\n      .WillOnce(Return(0));\n  EXPECT_CALL(mock, Push(_));\n  int n = 5;\n  EXPECT_CALL(mock, GetTop())\n      .WillOnce(ReturnRef(n));\n  EXPECT_CALL(mock, Pop())\n      .Times(AnyNumber());\n\n  EXPECT_EQ(0, mock.GetSize());\n  mock.Push(5);\n  EXPECT_EQ(1, mock.GetSize());\n  EXPECT_EQ(5, mock.GetTop());\n  mock.Pop();\n  EXPECT_EQ(0, mock.GetSize());\n}\n\nTEST(TemplateMockTest, MethodWithCommaInReturnTypeWorks) {\n  MockStack<int> mock;\n\n  const std::map<int, int> a_map;\n  EXPECT_CALL(mock, ReturnTypeWithComma())\n      .WillOnce(Return(a_map));\n  EXPECT_CALL(mock, ReturnTypeWithComma(1))\n      .WillOnce(Return(a_map));\n\n  EXPECT_EQ(a_map, mock.ReturnTypeWithComma());\n  EXPECT_EQ(a_map, mock.ReturnTypeWithComma(1));\n}\n\n#if GTEST_OS_WINDOWS\n// Tests mocking template interfaces with calltype.\n\ntemplate <typename T>\nclass StackInterfaceWithCallType {\n public:\n  virtual ~StackInterfaceWithCallType() {}\n\n  // Template parameter appears in function parameter.\n  STDMETHOD_(void, Push)(const T& value) = 0;\n  STDMETHOD_(void, Pop)() = 0;\n  STDMETHOD_(int, GetSize)() const = 0;\n  // Template parameter appears in function return type.\n  STDMETHOD_(const T&, GetTop)() const = 0;\n};\n\ntemplate <typename T>\nclass MockStackWithCallType : public StackInterfaceWithCallType<T> {\n public:\n  MockStackWithCallType() {}\n\n  MOCK_METHOD1_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Push, void(const T& elem));\n  MOCK_METHOD0_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Pop, void());\n  MOCK_CONST_METHOD0_T_WITH_CALLTYPE(STDMETHODCALLTYPE, GetSize, int());\n  MOCK_CONST_METHOD0_T_WITH_CALLTYPE(STDMETHODCALLTYPE, GetTop, const T&());\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockStackWithCallType);\n};\n\n// Tests that template mock with calltype works.\nTEST(TemplateMockTestWithCallType, Works) {\n  MockStackWithCallType<int> mock;\n\n  EXPECT_CALL(mock, GetSize())\n      .WillOnce(Return(0))\n      .WillOnce(Return(1))\n      .WillOnce(Return(0));\n  EXPECT_CALL(mock, Push(_));\n  int n = 5;\n  EXPECT_CALL(mock, GetTop())\n      .WillOnce(ReturnRef(n));\n  EXPECT_CALL(mock, Pop())\n      .Times(AnyNumber());\n\n  EXPECT_EQ(0, mock.GetSize());\n  mock.Push(5);\n  EXPECT_EQ(1, mock.GetSize());\n  EXPECT_EQ(5, mock.GetTop());\n  mock.Pop();\n  EXPECT_EQ(0, mock.GetSize());\n}\n#endif  // GTEST_OS_WINDOWS\n\n#define MY_MOCK_METHODS1_ \\\n    MOCK_METHOD0(Overloaded, void()); \\\n    MOCK_CONST_METHOD1(Overloaded, int(int n)); \\\n    MOCK_METHOD2(Overloaded, bool(bool f, int n))\n\nclass MockOverloadedOnArgNumber {\n public:\n  MockOverloadedOnArgNumber() {}\n\n  MY_MOCK_METHODS1_;\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockOverloadedOnArgNumber);\n};\n\nTEST(OverloadedMockMethodTest, CanOverloadOnArgNumberInMacroBody) {\n  MockOverloadedOnArgNumber mock;\n  EXPECT_CALL(mock, Overloaded());\n  EXPECT_CALL(mock, Overloaded(1)).WillOnce(Return(2));\n  EXPECT_CALL(mock, Overloaded(true, 1)).WillOnce(Return(true));\n\n  mock.Overloaded();\n  EXPECT_EQ(2, mock.Overloaded(1));\n  EXPECT_TRUE(mock.Overloaded(true, 1));\n}\n\n#define MY_MOCK_METHODS2_ \\\n    MOCK_CONST_METHOD1(Overloaded, int(int n)); \\\n    MOCK_METHOD1(Overloaded, int(int n));\n\nclass MockOverloadedOnConstness {\n public:\n  MockOverloadedOnConstness() {}\n\n  MY_MOCK_METHODS2_;\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockOverloadedOnConstness);\n};\n\nTEST(OverloadedMockMethodTest, CanOverloadOnConstnessInMacroBody) {\n  MockOverloadedOnConstness mock;\n  const MockOverloadedOnConstness* const_mock = &mock;\n  EXPECT_CALL(mock, Overloaded(1)).WillOnce(Return(2));\n  EXPECT_CALL(*const_mock, Overloaded(1)).WillOnce(Return(3));\n\n  EXPECT_EQ(2, mock.Overloaded(1));\n  EXPECT_EQ(3, const_mock->Overloaded(1));\n}\n\nTEST(MockFunctionTest, WorksForVoidNullary) {\n  MockFunction<void()> foo;\n  EXPECT_CALL(foo, Call());\n  foo.Call();\n}\n\nTEST(MockFunctionTest, WorksForNonVoidNullary) {\n  MockFunction<int()> foo;\n  EXPECT_CALL(foo, Call())\n      .WillOnce(Return(1))\n      .WillOnce(Return(2));\n  EXPECT_EQ(1, foo.Call());\n  EXPECT_EQ(2, foo.Call());\n}\n\nTEST(MockFunctionTest, WorksForVoidUnary) {\n  MockFunction<void(int)> foo;\n  EXPECT_CALL(foo, Call(1));\n  foo.Call(1);\n}\n\nTEST(MockFunctionTest, WorksForNonVoidBinary) {\n  MockFunction<int(bool, int)> foo;\n  EXPECT_CALL(foo, Call(false, 42))\n      .WillOnce(Return(1))\n      .WillOnce(Return(2));\n  EXPECT_CALL(foo, Call(true, Ge(100)))\n      .WillOnce(Return(3));\n  EXPECT_EQ(1, foo.Call(false, 42));\n  EXPECT_EQ(2, foo.Call(false, 42));\n  EXPECT_EQ(3, foo.Call(true, 120));\n}\n\nTEST(MockFunctionTest, WorksFor10Arguments) {\n  MockFunction<int(bool a0, char a1, int a2, int a3, int a4,\n                   int a5, int a6, char a7, int a8, bool a9)> foo;\n  EXPECT_CALL(foo, Call(_, 'a', _, _, _, _, _, _, _, _))\n      .WillOnce(Return(1))\n      .WillOnce(Return(2));\n  EXPECT_EQ(1, foo.Call(false, 'a', 0, 0, 0, 0, 0, 'b', 0, true));\n  EXPECT_EQ(2, foo.Call(true, 'a', 0, 0, 0, 0, 0, 'b', 1, false));\n}\n\n#if GTEST_HAS_STD_FUNCTION_\nTEST(MockFunctionTest, AsStdFunction) {\n  MockFunction<int(int)> foo;\n  auto call = [](const std::function<int(int)> &f, int i) {\n    return f(i);\n  };\n  EXPECT_CALL(foo, Call(1)).WillOnce(Return(-1));\n  EXPECT_CALL(foo, Call(2)).WillOnce(Return(-2));\n  EXPECT_EQ(-1, call(foo.AsStdFunction(), 1));\n  EXPECT_EQ(-2, call(foo.AsStdFunction(), 2));\n}\n\nTEST(MockFunctionTest, AsStdFunctionReturnsReference) {\n  MockFunction<int&()> foo;\n  int value = 1;\n  EXPECT_CALL(foo, Call()).WillOnce(ReturnRef(value));\n  int& ref = foo.AsStdFunction()();\n  EXPECT_EQ(1, ref);\n  value = 2;\n  EXPECT_EQ(2, ref);\n}\n#endif  // GTEST_HAS_STD_FUNCTION_\n\nstruct MockMethodSizes0 {\n  MOCK_METHOD0(func, void());\n};\nstruct MockMethodSizes1 {\n  MOCK_METHOD1(func, void(int));\n};\nstruct MockMethodSizes2 {\n  MOCK_METHOD2(func, void(int, int));\n};\nstruct MockMethodSizes3 {\n  MOCK_METHOD3(func, void(int, int, int));\n};\nstruct MockMethodSizes4 {\n  MOCK_METHOD4(func, void(int, int, int, int));\n};\n\nTEST(MockFunctionTest, MockMethodSizeOverhead) {\n  EXPECT_EQ(sizeof(MockMethodSizes0), sizeof(MockMethodSizes1));\n  EXPECT_EQ(sizeof(MockMethodSizes0), sizeof(MockMethodSizes2));\n  EXPECT_EQ(sizeof(MockMethodSizes0), sizeof(MockMethodSizes3));\n  EXPECT_EQ(sizeof(MockMethodSizes0), sizeof(MockMethodSizes4));\n}\n\n}  // namespace gmock_generated_function_mockers_test\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock-generated-internal-utils_test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file tests the internal utilities.\n\n#include \"gmock/internal/gmock-generated-internal-utils.h\"\n#include \"gmock/internal/gmock-internal-utils.h\"\n#include \"gtest/gtest.h\"\n\nnamespace {\n\nusing ::testing::tuple;\nusing ::testing::Matcher;\nusing ::testing::internal::CompileAssertTypesEqual;\nusing ::testing::internal::MatcherTuple;\nusing ::testing::internal::Function;\nusing ::testing::internal::IgnoredValue;\n\n// Tests the MatcherTuple template struct.\n\nTEST(MatcherTupleTest, ForSize0) {\n  CompileAssertTypesEqual<tuple<>, MatcherTuple<tuple<> >::type>();\n}\n\nTEST(MatcherTupleTest, ForSize1) {\n  CompileAssertTypesEqual<tuple<Matcher<int> >,\n                          MatcherTuple<tuple<int> >::type>();\n}\n\nTEST(MatcherTupleTest, ForSize2) {\n  CompileAssertTypesEqual<tuple<Matcher<int>, Matcher<char> >,\n                          MatcherTuple<tuple<int, char> >::type>();\n}\n\nTEST(MatcherTupleTest, ForSize5) {\n  CompileAssertTypesEqual<\n      tuple<Matcher<int>, Matcher<char>, Matcher<bool>, Matcher<double>,\n            Matcher<char*> >,\n      MatcherTuple<tuple<int, char, bool, double, char*> >::type>();\n}\n\n// Tests the Function template struct.\n\nTEST(FunctionTest, Nullary) {\n  typedef Function<int()> F;  // NOLINT\n  CompileAssertTypesEqual<int, F::Result>();\n  CompileAssertTypesEqual<tuple<>, F::ArgumentTuple>();\n  CompileAssertTypesEqual<tuple<>, F::ArgumentMatcherTuple>();\n  CompileAssertTypesEqual<void(), F::MakeResultVoid>();\n  CompileAssertTypesEqual<IgnoredValue(), F::MakeResultIgnoredValue>();\n}\n\nTEST(FunctionTest, Unary) {\n  typedef Function<int(bool)> F;  // NOLINT\n  CompileAssertTypesEqual<int, F::Result>();\n  CompileAssertTypesEqual<bool, F::Argument1>();\n  CompileAssertTypesEqual<tuple<bool>, F::ArgumentTuple>();\n  CompileAssertTypesEqual<tuple<Matcher<bool> >, F::ArgumentMatcherTuple>();\n  CompileAssertTypesEqual<void(bool), F::MakeResultVoid>();  // NOLINT\n  CompileAssertTypesEqual<IgnoredValue(bool),  // NOLINT\n      F::MakeResultIgnoredValue>();\n}\n\nTEST(FunctionTest, Binary) {\n  typedef Function<int(bool, const long&)> F;  // NOLINT\n  CompileAssertTypesEqual<int, F::Result>();\n  CompileAssertTypesEqual<bool, F::Argument1>();\n  CompileAssertTypesEqual<const long&, F::Argument2>();  // NOLINT\n  CompileAssertTypesEqual<tuple<bool, const long&>, F::ArgumentTuple>();  // NOLINT\n  CompileAssertTypesEqual<\n      tuple<Matcher<bool>, Matcher<const long&> >,  // NOLINT\n      F::ArgumentMatcherTuple>();\n  CompileAssertTypesEqual<void(bool, const long&), F::MakeResultVoid>();  // NOLINT\n  CompileAssertTypesEqual<IgnoredValue(bool, const long&),  // NOLINT\n      F::MakeResultIgnoredValue>();\n}\n\nTEST(FunctionTest, LongArgumentList) {\n  typedef Function<char(bool, int, char*, int&, const long&)> F;  // NOLINT\n  CompileAssertTypesEqual<char, F::Result>();\n  CompileAssertTypesEqual<bool, F::Argument1>();\n  CompileAssertTypesEqual<int, F::Argument2>();\n  CompileAssertTypesEqual<char*, F::Argument3>();\n  CompileAssertTypesEqual<int&, F::Argument4>();\n  CompileAssertTypesEqual<const long&, F::Argument5>();  // NOLINT\n  CompileAssertTypesEqual<tuple<bool, int, char*, int&, const long&>,  // NOLINT\n                          F::ArgumentTuple>();\n  CompileAssertTypesEqual<\n      tuple<Matcher<bool>, Matcher<int>, Matcher<char*>, Matcher<int&>,\n            Matcher<const long&> >,  // NOLINT\n      F::ArgumentMatcherTuple>();\n  CompileAssertTypesEqual<void(bool, int, char*, int&, const long&),  // NOLINT\n                          F::MakeResultVoid>();\n  CompileAssertTypesEqual<\n      IgnoredValue(bool, int, char*, int&, const long&),  // NOLINT\n      F::MakeResultIgnoredValue>();\n}\n\n}  // Unnamed namespace\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock-generated-matchers_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file tests the built-in matchers generated by a script.\n\n// Silence warning C4244: 'initializing': conversion from 'int' to 'short',\n// possible loss of data and C4100, unreferenced local parameter\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4244)\n# pragma warning(disable:4100)\n#endif\n\n#include \"gmock/gmock-generated-matchers.h\"\n\n#include <list>\n#include <map>\n#include <memory>\n#include <set>\n#include <sstream>\n#include <string>\n#include <utility>\n#include <vector>\n\n#include \"gmock/gmock.h\"\n#include \"gtest/gtest.h\"\n#include \"gtest/gtest-spi.h\"\n\nnamespace {\n\nusing std::list;\nusing std::map;\nusing std::pair;\nusing std::set;\nusing std::stringstream;\nusing std::vector;\nusing testing::get;\nusing testing::make_tuple;\nusing testing::tuple;\nusing testing::_;\nusing testing::AllOf;\nusing testing::AnyOf;\nusing testing::Args;\nusing testing::Contains;\nusing testing::ElementsAre;\nusing testing::ElementsAreArray;\nusing testing::Eq;\nusing testing::Ge;\nusing testing::Gt;\nusing testing::Le;\nusing testing::Lt;\nusing testing::MakeMatcher;\nusing testing::Matcher;\nusing testing::MatcherInterface;\nusing testing::MatchResultListener;\nusing testing::Ne;\nusing testing::Not;\nusing testing::Pointee;\nusing testing::PrintToString;\nusing testing::Ref;\nusing testing::StaticAssertTypeEq;\nusing testing::StrEq;\nusing testing::Value;\nusing testing::internal::ElementsAreArrayMatcher;\n\n// Returns the description of the given matcher.\ntemplate <typename T>\nstd::string Describe(const Matcher<T>& m) {\n  stringstream ss;\n  m.DescribeTo(&ss);\n  return ss.str();\n}\n\n// Returns the description of the negation of the given matcher.\ntemplate <typename T>\nstd::string DescribeNegation(const Matcher<T>& m) {\n  stringstream ss;\n  m.DescribeNegationTo(&ss);\n  return ss.str();\n}\n\n// Returns the reason why x matches, or doesn't match, m.\ntemplate <typename MatcherType, typename Value>\nstd::string Explain(const MatcherType& m, const Value& x) {\n  stringstream ss;\n  m.ExplainMatchResultTo(x, &ss);\n  return ss.str();\n}\n\n// Tests Args<k0, ..., kn>(m).\n\nTEST(ArgsTest, AcceptsZeroTemplateArg) {\n  const tuple<int, bool> t(5, true);\n  EXPECT_THAT(t, Args<>(Eq(tuple<>())));\n  EXPECT_THAT(t, Not(Args<>(Ne(tuple<>()))));\n}\n\nTEST(ArgsTest, AcceptsOneTemplateArg) {\n  const tuple<int, bool> t(5, true);\n  EXPECT_THAT(t, Args<0>(Eq(make_tuple(5))));\n  EXPECT_THAT(t, Args<1>(Eq(make_tuple(true))));\n  EXPECT_THAT(t, Not(Args<1>(Eq(make_tuple(false)))));\n}\n\nTEST(ArgsTest, AcceptsTwoTemplateArgs) {\n  const tuple<short, int, long> t(4, 5, 6L);  // NOLINT\n\n  EXPECT_THAT(t, (Args<0, 1>(Lt())));\n  EXPECT_THAT(t, (Args<1, 2>(Lt())));\n  EXPECT_THAT(t, Not(Args<0, 2>(Gt())));\n}\n\nTEST(ArgsTest, AcceptsRepeatedTemplateArgs) {\n  const tuple<short, int, long> t(4, 5, 6L);  // NOLINT\n  EXPECT_THAT(t, (Args<0, 0>(Eq())));\n  EXPECT_THAT(t, Not(Args<1, 1>(Ne())));\n}\n\nTEST(ArgsTest, AcceptsDecreasingTemplateArgs) {\n  const tuple<short, int, long> t(4, 5, 6L);  // NOLINT\n  EXPECT_THAT(t, (Args<2, 0>(Gt())));\n  EXPECT_THAT(t, Not(Args<2, 1>(Lt())));\n}\n\n// The MATCHER*() macros trigger warning C4100 (unreferenced formal\n// parameter) in MSVC with -W4.  Unfortunately they cannot be fixed in\n// the macro definition, as the warnings are generated when the macro\n// is expanded and macro expansion cannot contain #pragma.  Therefore\n// we suppress them here.\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4100)\n#endif\n\nMATCHER(SumIsZero, \"\") {\n  return get<0>(arg) + get<1>(arg) + get<2>(arg) == 0;\n}\n\nTEST(ArgsTest, AcceptsMoreTemplateArgsThanArityOfOriginalTuple) {\n  EXPECT_THAT(make_tuple(-1, 2), (Args<0, 0, 1>(SumIsZero())));\n  EXPECT_THAT(make_tuple(1, 2), Not(Args<0, 0, 1>(SumIsZero())));\n}\n\nTEST(ArgsTest, CanBeNested) {\n  const tuple<short, int, long, int> t(4, 5, 6L, 6);  // NOLINT\n  EXPECT_THAT(t, (Args<1, 2, 3>(Args<1, 2>(Eq()))));\n  EXPECT_THAT(t, (Args<0, 1, 3>(Args<0, 2>(Lt()))));\n}\n\nTEST(ArgsTest, CanMatchTupleByValue) {\n  typedef tuple<char, int, int> Tuple3;\n  const Matcher<Tuple3> m = Args<1, 2>(Lt());\n  EXPECT_TRUE(m.Matches(Tuple3('a', 1, 2)));\n  EXPECT_FALSE(m.Matches(Tuple3('b', 2, 2)));\n}\n\nTEST(ArgsTest, CanMatchTupleByReference) {\n  typedef tuple<char, char, int> Tuple3;\n  const Matcher<const Tuple3&> m = Args<0, 1>(Lt());\n  EXPECT_TRUE(m.Matches(Tuple3('a', 'b', 2)));\n  EXPECT_FALSE(m.Matches(Tuple3('b', 'b', 2)));\n}\n\n// Validates that arg is printed as str.\nMATCHER_P(PrintsAs, str, \"\") {\n  return testing::PrintToString(arg) == str;\n}\n\nTEST(ArgsTest, AcceptsTenTemplateArgs) {\n  EXPECT_THAT(make_tuple(0, 1L, 2, 3L, 4, 5, 6, 7, 8, 9),\n              (Args<9, 8, 7, 6, 5, 4, 3, 2, 1, 0>(\n                  PrintsAs(\"(9, 8, 7, 6, 5, 4, 3, 2, 1, 0)\"))));\n  EXPECT_THAT(make_tuple(0, 1L, 2, 3L, 4, 5, 6, 7, 8, 9),\n              Not(Args<9, 8, 7, 6, 5, 4, 3, 2, 1, 0>(\n                      PrintsAs(\"(0, 8, 7, 6, 5, 4, 3, 2, 1, 0)\"))));\n}\n\nTEST(ArgsTest, DescirbesSelfCorrectly) {\n  const Matcher<tuple<int, bool, char> > m = Args<2, 0>(Lt());\n  EXPECT_EQ(\"are a tuple whose fields (#2, #0) are a pair where \"\n            \"the first < the second\",\n            Describe(m));\n}\n\nTEST(ArgsTest, DescirbesNestedArgsCorrectly) {\n  const Matcher<const tuple<int, bool, char, int>&> m =\n      Args<0, 2, 3>(Args<2, 0>(Lt()));\n  EXPECT_EQ(\"are a tuple whose fields (#0, #2, #3) are a tuple \"\n            \"whose fields (#2, #0) are a pair where the first < the second\",\n            Describe(m));\n}\n\nTEST(ArgsTest, DescribesNegationCorrectly) {\n  const Matcher<tuple<int, char> > m = Args<1, 0>(Gt());\n  EXPECT_EQ(\"are a tuple whose fields (#1, #0) aren't a pair \"\n            \"where the first > the second\",\n            DescribeNegation(m));\n}\n\nTEST(ArgsTest, ExplainsMatchResultWithoutInnerExplanation) {\n  const Matcher<tuple<bool, int, int> > m = Args<1, 2>(Eq());\n  EXPECT_EQ(\"whose fields (#1, #2) are (42, 42)\",\n            Explain(m, make_tuple(false, 42, 42)));\n  EXPECT_EQ(\"whose fields (#1, #2) are (42, 43)\",\n            Explain(m, make_tuple(false, 42, 43)));\n}\n\n// For testing Args<>'s explanation.\nclass LessThanMatcher : public MatcherInterface<tuple<char, int> > {\n public:\n  virtual void DescribeTo(::std::ostream* os) const {}\n\n  virtual bool MatchAndExplain(tuple<char, int> value,\n                               MatchResultListener* listener) const {\n    const int diff = get<0>(value) - get<1>(value);\n    if (diff > 0) {\n      *listener << \"where the first value is \" << diff\n                << \" more than the second\";\n    }\n    return diff < 0;\n  }\n};\n\nMatcher<tuple<char, int> > LessThan() {\n  return MakeMatcher(new LessThanMatcher);\n}\n\nTEST(ArgsTest, ExplainsMatchResultWithInnerExplanation) {\n  const Matcher<tuple<char, int, int> > m = Args<0, 2>(LessThan());\n  EXPECT_EQ(\"whose fields (#0, #2) are ('a' (97, 0x61), 42), \"\n            \"where the first value is 55 more than the second\",\n            Explain(m, make_tuple('a', 42, 42)));\n  EXPECT_EQ(\"whose fields (#0, #2) are ('\\\\0', 43)\",\n            Explain(m, make_tuple('\\0', 42, 43)));\n}\n\n// For testing ExplainMatchResultTo().\nclass GreaterThanMatcher : public MatcherInterface<int> {\n public:\n  explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {}\n\n  virtual void DescribeTo(::std::ostream* os) const {\n    *os << \"is greater than \" << rhs_;\n  }\n\n  virtual bool MatchAndExplain(int lhs,\n                               MatchResultListener* listener) const {\n    const int diff = lhs - rhs_;\n    if (diff > 0) {\n      *listener << \"which is \" << diff << \" more than \" << rhs_;\n    } else if (diff == 0) {\n      *listener << \"which is the same as \" << rhs_;\n    } else {\n      *listener << \"which is \" << -diff << \" less than \" << rhs_;\n    }\n\n    return lhs > rhs_;\n  }\n\n private:\n  int rhs_;\n};\n\nMatcher<int> GreaterThan(int n) {\n  return MakeMatcher(new GreaterThanMatcher(n));\n}\n\n// Tests for ElementsAre().\n\nTEST(ElementsAreTest, CanDescribeExpectingNoElement) {\n  Matcher<const vector<int>&> m = ElementsAre();\n  EXPECT_EQ(\"is empty\", Describe(m));\n}\n\nTEST(ElementsAreTest, CanDescribeExpectingOneElement) {\n  Matcher<vector<int> > m = ElementsAre(Gt(5));\n  EXPECT_EQ(\"has 1 element that is > 5\", Describe(m));\n}\n\nTEST(ElementsAreTest, CanDescribeExpectingManyElements) {\n  Matcher<list<std::string> > m = ElementsAre(StrEq(\"one\"), \"two\");\n  EXPECT_EQ(\"has 2 elements where\\n\"\n            \"element #0 is equal to \\\"one\\\",\\n\"\n            \"element #1 is equal to \\\"two\\\"\", Describe(m));\n}\n\nTEST(ElementsAreTest, CanDescribeNegationOfExpectingNoElement) {\n  Matcher<vector<int> > m = ElementsAre();\n  EXPECT_EQ(\"isn't empty\", DescribeNegation(m));\n}\n\nTEST(ElementsAreTest, CanDescribeNegationOfExpectingOneElment) {\n  Matcher<const list<int>& > m = ElementsAre(Gt(5));\n  EXPECT_EQ(\"doesn't have 1 element, or\\n\"\n            \"element #0 isn't > 5\", DescribeNegation(m));\n}\n\nTEST(ElementsAreTest, CanDescribeNegationOfExpectingManyElements) {\n  Matcher<const list<std::string>&> m = ElementsAre(\"one\", \"two\");\n  EXPECT_EQ(\"doesn't have 2 elements, or\\n\"\n            \"element #0 isn't equal to \\\"one\\\", or\\n\"\n            \"element #1 isn't equal to \\\"two\\\"\", DescribeNegation(m));\n}\n\nTEST(ElementsAreTest, DoesNotExplainTrivialMatch) {\n  Matcher<const list<int>& > m = ElementsAre(1, Ne(2));\n\n  list<int> test_list;\n  test_list.push_back(1);\n  test_list.push_back(3);\n  EXPECT_EQ(\"\", Explain(m, test_list));  // No need to explain anything.\n}\n\nTEST(ElementsAreTest, ExplainsNonTrivialMatch) {\n  Matcher<const vector<int>& > m =\n      ElementsAre(GreaterThan(1), 0, GreaterThan(2));\n\n  const int a[] = { 10, 0, 100 };\n  vector<int> test_vector(a, a + GTEST_ARRAY_SIZE_(a));\n  EXPECT_EQ(\"whose element #0 matches, which is 9 more than 1,\\n\"\n            \"and whose element #2 matches, which is 98 more than 2\",\n            Explain(m, test_vector));\n}\n\nTEST(ElementsAreTest, CanExplainMismatchWrongSize) {\n  Matcher<const list<int>& > m = ElementsAre(1, 3);\n\n  list<int> test_list;\n  // No need to explain when the container is empty.\n  EXPECT_EQ(\"\", Explain(m, test_list));\n\n  test_list.push_back(1);\n  EXPECT_EQ(\"which has 1 element\", Explain(m, test_list));\n}\n\nTEST(ElementsAreTest, CanExplainMismatchRightSize) {\n  Matcher<const vector<int>& > m = ElementsAre(1, GreaterThan(5));\n\n  vector<int> v;\n  v.push_back(2);\n  v.push_back(1);\n  EXPECT_EQ(\"whose element #0 doesn't match\", Explain(m, v));\n\n  v[0] = 1;\n  EXPECT_EQ(\"whose element #1 doesn't match, which is 4 less than 5\",\n            Explain(m, v));\n}\n\nTEST(ElementsAreTest, MatchesOneElementVector) {\n  vector<std::string> test_vector;\n  test_vector.push_back(\"test string\");\n\n  EXPECT_THAT(test_vector, ElementsAre(StrEq(\"test string\")));\n}\n\nTEST(ElementsAreTest, MatchesOneElementList) {\n  list<std::string> test_list;\n  test_list.push_back(\"test string\");\n\n  EXPECT_THAT(test_list, ElementsAre(\"test string\"));\n}\n\nTEST(ElementsAreTest, MatchesThreeElementVector) {\n  vector<std::string> test_vector;\n  test_vector.push_back(\"one\");\n  test_vector.push_back(\"two\");\n  test_vector.push_back(\"three\");\n\n  EXPECT_THAT(test_vector, ElementsAre(\"one\", StrEq(\"two\"), _));\n}\n\nTEST(ElementsAreTest, MatchesOneElementEqMatcher) {\n  vector<int> test_vector;\n  test_vector.push_back(4);\n\n  EXPECT_THAT(test_vector, ElementsAre(Eq(4)));\n}\n\nTEST(ElementsAreTest, MatchesOneElementAnyMatcher) {\n  vector<int> test_vector;\n  test_vector.push_back(4);\n\n  EXPECT_THAT(test_vector, ElementsAre(_));\n}\n\nTEST(ElementsAreTest, MatchesOneElementValue) {\n  vector<int> test_vector;\n  test_vector.push_back(4);\n\n  EXPECT_THAT(test_vector, ElementsAre(4));\n}\n\nTEST(ElementsAreTest, MatchesThreeElementsMixedMatchers) {\n  vector<int> test_vector;\n  test_vector.push_back(1);\n  test_vector.push_back(2);\n  test_vector.push_back(3);\n\n  EXPECT_THAT(test_vector, ElementsAre(1, Eq(2), _));\n}\n\nTEST(ElementsAreTest, MatchesTenElementVector) {\n  const int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n  vector<int> test_vector(a, a + GTEST_ARRAY_SIZE_(a));\n\n  EXPECT_THAT(test_vector,\n              // The element list can contain values and/or matchers\n              // of different types.\n              ElementsAre(0, Ge(0), _, 3, 4, Ne(2), Eq(6), 7, 8, _));\n}\n\nTEST(ElementsAreTest, DoesNotMatchWrongSize) {\n  vector<std::string> test_vector;\n  test_vector.push_back(\"test string\");\n  test_vector.push_back(\"test string\");\n\n  Matcher<vector<std::string> > m = ElementsAre(StrEq(\"test string\"));\n  EXPECT_FALSE(m.Matches(test_vector));\n}\n\nTEST(ElementsAreTest, DoesNotMatchWrongValue) {\n  vector<std::string> test_vector;\n  test_vector.push_back(\"other string\");\n\n  Matcher<vector<std::string> > m = ElementsAre(StrEq(\"test string\"));\n  EXPECT_FALSE(m.Matches(test_vector));\n}\n\nTEST(ElementsAreTest, DoesNotMatchWrongOrder) {\n  vector<std::string> test_vector;\n  test_vector.push_back(\"one\");\n  test_vector.push_back(\"three\");\n  test_vector.push_back(\"two\");\n\n  Matcher<vector<std::string> > m =\n      ElementsAre(StrEq(\"one\"), StrEq(\"two\"), StrEq(\"three\"));\n  EXPECT_FALSE(m.Matches(test_vector));\n}\n\nTEST(ElementsAreTest, WorksForNestedContainer) {\n  const char* strings[] = {\n    \"Hi\",\n    \"world\"\n  };\n\n  vector<list<char> > nested;\n  for (size_t i = 0; i < GTEST_ARRAY_SIZE_(strings); i++) {\n    nested.push_back(list<char>(strings[i], strings[i] + strlen(strings[i])));\n  }\n\n  EXPECT_THAT(nested, ElementsAre(ElementsAre('H', Ne('e')),\n                                  ElementsAre('w', 'o', _, _, 'd')));\n  EXPECT_THAT(nested, Not(ElementsAre(ElementsAre('H', 'e'),\n                                      ElementsAre('w', 'o', _, _, 'd'))));\n}\n\nTEST(ElementsAreTest, WorksWithByRefElementMatchers) {\n  int a[] = { 0, 1, 2 };\n  vector<int> v(a, a + GTEST_ARRAY_SIZE_(a));\n\n  EXPECT_THAT(v, ElementsAre(Ref(v[0]), Ref(v[1]), Ref(v[2])));\n  EXPECT_THAT(v, Not(ElementsAre(Ref(v[0]), Ref(v[1]), Ref(a[2]))));\n}\n\nTEST(ElementsAreTest, WorksWithContainerPointerUsingPointee) {\n  int a[] = { 0, 1, 2 };\n  vector<int> v(a, a + GTEST_ARRAY_SIZE_(a));\n\n  EXPECT_THAT(&v, Pointee(ElementsAre(0, 1, _)));\n  EXPECT_THAT(&v, Not(Pointee(ElementsAre(0, _, 3))));\n}\n\nTEST(ElementsAreTest, WorksWithNativeArrayPassedByReference) {\n  int array[] = { 0, 1, 2 };\n  EXPECT_THAT(array, ElementsAre(0, 1, _));\n  EXPECT_THAT(array, Not(ElementsAre(1, _, _)));\n  EXPECT_THAT(array, Not(ElementsAre(0, _)));\n}\n\nclass NativeArrayPassedAsPointerAndSize {\n public:\n  NativeArrayPassedAsPointerAndSize() {}\n\n  MOCK_METHOD2(Helper, void(int* array, int size));\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(NativeArrayPassedAsPointerAndSize);\n};\n\nTEST(ElementsAreTest, WorksWithNativeArrayPassedAsPointerAndSize) {\n  int array[] = { 0, 1 };\n  ::testing::tuple<int*, size_t> array_as_tuple(array, 2);\n  EXPECT_THAT(array_as_tuple, ElementsAre(0, 1));\n  EXPECT_THAT(array_as_tuple, Not(ElementsAre(0)));\n\n  NativeArrayPassedAsPointerAndSize helper;\n  EXPECT_CALL(helper, Helper(_, _))\n      .With(ElementsAre(0, 1));\n  helper.Helper(array, 2);\n}\n\nTEST(ElementsAreTest, WorksWithTwoDimensionalNativeArray) {\n  const char a2[][3] = { \"hi\", \"lo\" };\n  EXPECT_THAT(a2, ElementsAre(ElementsAre('h', 'i', '\\0'),\n                              ElementsAre('l', 'o', '\\0')));\n  EXPECT_THAT(a2, ElementsAre(StrEq(\"hi\"), StrEq(\"lo\")));\n  EXPECT_THAT(a2, ElementsAre(Not(ElementsAre('h', 'o', '\\0')),\n                              ElementsAre('l', 'o', '\\0')));\n}\n\nTEST(ElementsAreTest, AcceptsStringLiteral) {\n  std::string array[] = {\"hi\", \"one\", \"two\"};\n  EXPECT_THAT(array, ElementsAre(\"hi\", \"one\", \"two\"));\n  EXPECT_THAT(array, Not(ElementsAre(\"hi\", \"one\", \"too\")));\n}\n\n#ifndef _MSC_VER\n\n// The following test passes a value of type const char[] to a\n// function template that expects const T&.  Some versions of MSVC\n// generates a compiler error C2665 for that.  We believe it's a bug\n// in MSVC.  Therefore this test is #if-ed out for MSVC.\n\n// Declared here with the size unknown.  Defined AFTER the following test.\nextern const char kHi[];\n\nTEST(ElementsAreTest, AcceptsArrayWithUnknownSize) {\n  // The size of kHi is not known in this test, but ElementsAre() should\n  // still accept it.\n\n  std::string array1[] = {\"hi\"};\n  EXPECT_THAT(array1, ElementsAre(kHi));\n\n  std::string array2[] = {\"ho\"};\n  EXPECT_THAT(array2, Not(ElementsAre(kHi)));\n}\n\nconst char kHi[] = \"hi\";\n\n#endif  // _MSC_VER\n\nTEST(ElementsAreTest, MakesCopyOfArguments) {\n  int x = 1;\n  int y = 2;\n  // This should make a copy of x and y.\n  ::testing::internal::ElementsAreMatcher<testing::tuple<int, int> >\n          polymorphic_matcher = ElementsAre(x, y);\n  // Changing x and y now shouldn't affect the meaning of the above matcher.\n  x = y = 0;\n  const int array1[] = { 1, 2 };\n  EXPECT_THAT(array1, polymorphic_matcher);\n  const int array2[] = { 0, 0 };\n  EXPECT_THAT(array2, Not(polymorphic_matcher));\n}\n\n\n// Tests for ElementsAreArray().  Since ElementsAreArray() shares most\n// of the implementation with ElementsAre(), we don't test it as\n// thoroughly here.\n\nTEST(ElementsAreArrayTest, CanBeCreatedWithValueArray) {\n  const int a[] = { 1, 2, 3 };\n\n  vector<int> test_vector(a, a + GTEST_ARRAY_SIZE_(a));\n  EXPECT_THAT(test_vector, ElementsAreArray(a));\n\n  test_vector[2] = 0;\n  EXPECT_THAT(test_vector, Not(ElementsAreArray(a)));\n}\n\nTEST(ElementsAreArrayTest, CanBeCreatedWithArraySize) {\n  const char* a[] = { \"one\", \"two\", \"three\" };\n\n  vector<std::string> test_vector(a, a + GTEST_ARRAY_SIZE_(a));\n  EXPECT_THAT(test_vector, ElementsAreArray(a, GTEST_ARRAY_SIZE_(a)));\n\n  const char** p = a;\n  test_vector[0] = \"1\";\n  EXPECT_THAT(test_vector, Not(ElementsAreArray(p, GTEST_ARRAY_SIZE_(a))));\n}\n\nTEST(ElementsAreArrayTest, CanBeCreatedWithoutArraySize) {\n  const char* a[] = { \"one\", \"two\", \"three\" };\n\n  vector<std::string> test_vector(a, a + GTEST_ARRAY_SIZE_(a));\n  EXPECT_THAT(test_vector, ElementsAreArray(a));\n\n  test_vector[0] = \"1\";\n  EXPECT_THAT(test_vector, Not(ElementsAreArray(a)));\n}\n\nTEST(ElementsAreArrayTest, CanBeCreatedWithMatcherArray) {\n  const Matcher<std::string> kMatcherArray[] = {StrEq(\"one\"), StrEq(\"two\"),\n                                                StrEq(\"three\")};\n\n  vector<std::string> test_vector;\n  test_vector.push_back(\"one\");\n  test_vector.push_back(\"two\");\n  test_vector.push_back(\"three\");\n  EXPECT_THAT(test_vector, ElementsAreArray(kMatcherArray));\n\n  test_vector.push_back(\"three\");\n  EXPECT_THAT(test_vector, Not(ElementsAreArray(kMatcherArray)));\n}\n\nTEST(ElementsAreArrayTest, CanBeCreatedWithVector) {\n  const int a[] = { 1, 2, 3 };\n  vector<int> test_vector(a, a + GTEST_ARRAY_SIZE_(a));\n  const vector<int> expected(a, a + GTEST_ARRAY_SIZE_(a));\n  EXPECT_THAT(test_vector, ElementsAreArray(expected));\n  test_vector.push_back(4);\n  EXPECT_THAT(test_vector, Not(ElementsAreArray(expected)));\n}\n\n#if GTEST_HAS_STD_INITIALIZER_LIST_\n\nTEST(ElementsAreArrayTest, TakesInitializerList) {\n  const int a[5] = { 1, 2, 3, 4, 5 };\n  EXPECT_THAT(a, ElementsAreArray({ 1, 2, 3, 4, 5 }));\n  EXPECT_THAT(a, Not(ElementsAreArray({ 1, 2, 3, 5, 4 })));\n  EXPECT_THAT(a, Not(ElementsAreArray({ 1, 2, 3, 4, 6 })));\n}\n\nTEST(ElementsAreArrayTest, TakesInitializerListOfCStrings) {\n  const std::string a[5] = {\"a\", \"b\", \"c\", \"d\", \"e\"};\n  EXPECT_THAT(a, ElementsAreArray({ \"a\", \"b\", \"c\", \"d\", \"e\" }));\n  EXPECT_THAT(a, Not(ElementsAreArray({ \"a\", \"b\", \"c\", \"e\", \"d\" })));\n  EXPECT_THAT(a, Not(ElementsAreArray({ \"a\", \"b\", \"c\", \"d\", \"ef\" })));\n}\n\nTEST(ElementsAreArrayTest, TakesInitializerListOfSameTypedMatchers) {\n  const int a[5] = { 1, 2, 3, 4, 5 };\n  EXPECT_THAT(a, ElementsAreArray(\n      { Eq(1), Eq(2), Eq(3), Eq(4), Eq(5) }));\n  EXPECT_THAT(a, Not(ElementsAreArray(\n      { Eq(1), Eq(2), Eq(3), Eq(4), Eq(6) })));\n}\n\nTEST(ElementsAreArrayTest,\n     TakesInitializerListOfDifferentTypedMatchers) {\n  const int a[5] = { 1, 2, 3, 4, 5 };\n  // The compiler cannot infer the type of the initializer list if its\n  // elements have different types.  We must explicitly specify the\n  // unified element type in this case.\n  EXPECT_THAT(a, ElementsAreArray<Matcher<int> >(\n      { Eq(1), Ne(-2), Ge(3), Le(4), Eq(5) }));\n  EXPECT_THAT(a, Not(ElementsAreArray<Matcher<int> >(\n      { Eq(1), Ne(-2), Ge(3), Le(4), Eq(6) })));\n}\n\n#endif  // GTEST_HAS_STD_INITIALIZER_LIST_\n\nTEST(ElementsAreArrayTest, CanBeCreatedWithMatcherVector) {\n  const int a[] = { 1, 2, 3 };\n  const Matcher<int> kMatchers[] = { Eq(1), Eq(2), Eq(3) };\n  vector<int> test_vector(a, a + GTEST_ARRAY_SIZE_(a));\n  const vector<Matcher<int> > expected(\n      kMatchers, kMatchers + GTEST_ARRAY_SIZE_(kMatchers));\n  EXPECT_THAT(test_vector, ElementsAreArray(expected));\n  test_vector.push_back(4);\n  EXPECT_THAT(test_vector, Not(ElementsAreArray(expected)));\n}\n\nTEST(ElementsAreArrayTest, CanBeCreatedWithIteratorRange) {\n  const int a[] = { 1, 2, 3 };\n  const vector<int> test_vector(a, a + GTEST_ARRAY_SIZE_(a));\n  const vector<int> expected(a, a + GTEST_ARRAY_SIZE_(a));\n  EXPECT_THAT(test_vector, ElementsAreArray(expected.begin(), expected.end()));\n  // Pointers are iterators, too.\n  EXPECT_THAT(test_vector, ElementsAreArray(a, a + GTEST_ARRAY_SIZE_(a)));\n  // The empty range of NULL pointers should also be okay.\n  int* const null_int = NULL;\n  EXPECT_THAT(test_vector, Not(ElementsAreArray(null_int, null_int)));\n  EXPECT_THAT((vector<int>()), ElementsAreArray(null_int, null_int));\n}\n\n// Since ElementsAre() and ElementsAreArray() share much of the\n// implementation, we only do a sanity test for native arrays here.\nTEST(ElementsAreArrayTest, WorksWithNativeArray) {\n  ::std::string a[] = { \"hi\", \"ho\" };\n  ::std::string b[] = { \"hi\", \"ho\" };\n\n  EXPECT_THAT(a, ElementsAreArray(b));\n  EXPECT_THAT(a, ElementsAreArray(b, 2));\n  EXPECT_THAT(a, Not(ElementsAreArray(b, 1)));\n}\n\nTEST(ElementsAreArrayTest, SourceLifeSpan) {\n  const int a[] = { 1, 2, 3 };\n  vector<int> test_vector(a, a + GTEST_ARRAY_SIZE_(a));\n  vector<int> expect(a, a + GTEST_ARRAY_SIZE_(a));\n  ElementsAreArrayMatcher<int> matcher_maker =\n      ElementsAreArray(expect.begin(), expect.end());\n  EXPECT_THAT(test_vector, matcher_maker);\n  // Changing in place the values that initialized matcher_maker should not\n  // affect matcher_maker anymore. It should have made its own copy of them.\n  typedef vector<int>::iterator Iter;\n  for (Iter it = expect.begin(); it != expect.end(); ++it) { *it += 10; }\n  EXPECT_THAT(test_vector, matcher_maker);\n  test_vector.push_back(3);\n  EXPECT_THAT(test_vector, Not(matcher_maker));\n}\n\n// Tests for the MATCHER*() macro family.\n\n// Tests that a simple MATCHER() definition works.\n\nMATCHER(IsEven, \"\") { return (arg % 2) == 0; }\n\nTEST(MatcherMacroTest, Works) {\n  const Matcher<int> m = IsEven();\n  EXPECT_TRUE(m.Matches(6));\n  EXPECT_FALSE(m.Matches(7));\n\n  EXPECT_EQ(\"is even\", Describe(m));\n  EXPECT_EQ(\"not (is even)\", DescribeNegation(m));\n  EXPECT_EQ(\"\", Explain(m, 6));\n  EXPECT_EQ(\"\", Explain(m, 7));\n}\n\n// This also tests that the description string can reference 'negation'.\nMATCHER(IsEven2, negation ? \"is odd\" : \"is even\") {\n  if ((arg % 2) == 0) {\n    // Verifies that we can stream to result_listener, a listener\n    // supplied by the MATCHER macro implicitly.\n    *result_listener << \"OK\";\n    return true;\n  } else {\n    *result_listener << \"% 2 == \" << (arg % 2);\n    return false;\n  }\n}\n\n// This also tests that the description string can reference matcher\n// parameters.\nMATCHER_P2(EqSumOf, x, y, std::string(negation ? \"doesn't equal\" : \"equals\") +\n                              \" the sum of \" + PrintToString(x) + \" and \" +\n                              PrintToString(y)) {\n  if (arg == (x + y)) {\n    *result_listener << \"OK\";\n    return true;\n  } else {\n    // Verifies that we can stream to the underlying stream of\n    // result_listener.\n    if (result_listener->stream() != NULL) {\n      *result_listener->stream() << \"diff == \" << (x + y - arg);\n    }\n    return false;\n  }\n}\n\n// Tests that the matcher description can reference 'negation' and the\n// matcher parameters.\nTEST(MatcherMacroTest, DescriptionCanReferenceNegationAndParameters) {\n  const Matcher<int> m1 = IsEven2();\n  EXPECT_EQ(\"is even\", Describe(m1));\n  EXPECT_EQ(\"is odd\", DescribeNegation(m1));\n\n  const Matcher<int> m2 = EqSumOf(5, 9);\n  EXPECT_EQ(\"equals the sum of 5 and 9\", Describe(m2));\n  EXPECT_EQ(\"doesn't equal the sum of 5 and 9\", DescribeNegation(m2));\n}\n\n// Tests explaining match result in a MATCHER* macro.\nTEST(MatcherMacroTest, CanExplainMatchResult) {\n  const Matcher<int> m1 = IsEven2();\n  EXPECT_EQ(\"OK\", Explain(m1, 4));\n  EXPECT_EQ(\"% 2 == 1\", Explain(m1, 5));\n\n  const Matcher<int> m2 = EqSumOf(1, 2);\n  EXPECT_EQ(\"OK\", Explain(m2, 3));\n  EXPECT_EQ(\"diff == -1\", Explain(m2, 4));\n}\n\n// Tests that the body of MATCHER() can reference the type of the\n// value being matched.\n\nMATCHER(IsEmptyString, \"\") {\n  StaticAssertTypeEq< ::std::string, arg_type>();\n  return arg == \"\";\n}\n\nMATCHER(IsEmptyStringByRef, \"\") {\n  StaticAssertTypeEq<const ::std::string&, arg_type>();\n  return arg == \"\";\n}\n\nTEST(MatcherMacroTest, CanReferenceArgType) {\n  const Matcher< ::std::string> m1 = IsEmptyString();\n  EXPECT_TRUE(m1.Matches(\"\"));\n\n  const Matcher<const ::std::string&> m2 = IsEmptyStringByRef();\n  EXPECT_TRUE(m2.Matches(\"\"));\n}\n\n// Tests that MATCHER() can be used in a namespace.\n\nnamespace matcher_test {\nMATCHER(IsOdd, \"\") { return (arg % 2) != 0; }\n}  // namespace matcher_test\n\nTEST(MatcherMacroTest, WorksInNamespace) {\n  Matcher<int> m = matcher_test::IsOdd();\n  EXPECT_FALSE(m.Matches(4));\n  EXPECT_TRUE(m.Matches(5));\n}\n\n// Tests that Value() can be used to compose matchers.\nMATCHER(IsPositiveOdd, \"\") {\n  return Value(arg, matcher_test::IsOdd()) && arg > 0;\n}\n\nTEST(MatcherMacroTest, CanBeComposedUsingValue) {\n  EXPECT_THAT(3, IsPositiveOdd());\n  EXPECT_THAT(4, Not(IsPositiveOdd()));\n  EXPECT_THAT(-1, Not(IsPositiveOdd()));\n}\n\n// Tests that a simple MATCHER_P() definition works.\n\nMATCHER_P(IsGreaterThan32And, n, \"\") { return arg > 32 && arg > n; }\n\nTEST(MatcherPMacroTest, Works) {\n  const Matcher<int> m = IsGreaterThan32And(5);\n  EXPECT_TRUE(m.Matches(36));\n  EXPECT_FALSE(m.Matches(5));\n\n  EXPECT_EQ(\"is greater than 32 and 5\", Describe(m));\n  EXPECT_EQ(\"not (is greater than 32 and 5)\", DescribeNegation(m));\n  EXPECT_EQ(\"\", Explain(m, 36));\n  EXPECT_EQ(\"\", Explain(m, 5));\n}\n\n// Tests that the description is calculated correctly from the matcher name.\nMATCHER_P(_is_Greater_Than32and_, n, \"\") { return arg > 32 && arg > n; }\n\nTEST(MatcherPMacroTest, GeneratesCorrectDescription) {\n  const Matcher<int> m = _is_Greater_Than32and_(5);\n\n  EXPECT_EQ(\"is greater than 32 and 5\", Describe(m));\n  EXPECT_EQ(\"not (is greater than 32 and 5)\", DescribeNegation(m));\n  EXPECT_EQ(\"\", Explain(m, 36));\n  EXPECT_EQ(\"\", Explain(m, 5));\n}\n\n// Tests that a MATCHER_P matcher can be explicitly instantiated with\n// a reference parameter type.\n\nclass UncopyableFoo {\n public:\n  explicit UncopyableFoo(char value) : value_(value) {}\n private:\n  UncopyableFoo(const UncopyableFoo&);\n  void operator=(const UncopyableFoo&);\n\n  char value_;\n};\n\nMATCHER_P(ReferencesUncopyable, variable, \"\") { return &arg == &variable; }\n\nTEST(MatcherPMacroTest, WorksWhenExplicitlyInstantiatedWithReference) {\n  UncopyableFoo foo1('1'), foo2('2');\n  const Matcher<const UncopyableFoo&> m =\n      ReferencesUncopyable<const UncopyableFoo&>(foo1);\n\n  EXPECT_TRUE(m.Matches(foo1));\n  EXPECT_FALSE(m.Matches(foo2));\n\n  // We don't want the address of the parameter printed, as most\n  // likely it will just annoy the user.  If the address is\n  // interesting, the user should consider passing the parameter by\n  // pointer instead.\n  EXPECT_EQ(\"references uncopyable 1-byte object <31>\", Describe(m));\n}\n\n\n// Tests that the body of MATCHER_Pn() can reference the parameter\n// types.\n\nMATCHER_P3(ParamTypesAreIntLongAndChar, foo, bar, baz, \"\") {\n  StaticAssertTypeEq<int, foo_type>();\n  StaticAssertTypeEq<long, bar_type>();  // NOLINT\n  StaticAssertTypeEq<char, baz_type>();\n  return arg == 0;\n}\n\nTEST(MatcherPnMacroTest, CanReferenceParamTypes) {\n  EXPECT_THAT(0, ParamTypesAreIntLongAndChar(10, 20L, 'a'));\n}\n\n// Tests that a MATCHER_Pn matcher can be explicitly instantiated with\n// reference parameter types.\n\nMATCHER_P2(ReferencesAnyOf, variable1, variable2, \"\") {\n  return &arg == &variable1 || &arg == &variable2;\n}\n\nTEST(MatcherPnMacroTest, WorksWhenExplicitlyInstantiatedWithReferences) {\n  UncopyableFoo foo1('1'), foo2('2'), foo3('3');\n  const Matcher<const UncopyableFoo&> m =\n      ReferencesAnyOf<const UncopyableFoo&, const UncopyableFoo&>(foo1, foo2);\n\n  EXPECT_TRUE(m.Matches(foo1));\n  EXPECT_TRUE(m.Matches(foo2));\n  EXPECT_FALSE(m.Matches(foo3));\n}\n\nTEST(MatcherPnMacroTest,\n     GeneratesCorretDescriptionWhenExplicitlyInstantiatedWithReferences) {\n  UncopyableFoo foo1('1'), foo2('2');\n  const Matcher<const UncopyableFoo&> m =\n      ReferencesAnyOf<const UncopyableFoo&, const UncopyableFoo&>(foo1, foo2);\n\n  // We don't want the addresses of the parameters printed, as most\n  // likely they will just annoy the user.  If the addresses are\n  // interesting, the user should consider passing the parameters by\n  // pointers instead.\n  EXPECT_EQ(\"references any of (1-byte object <31>, 1-byte object <32>)\",\n            Describe(m));\n}\n\n// Tests that a simple MATCHER_P2() definition works.\n\nMATCHER_P2(IsNotInClosedRange, low, hi, \"\") { return arg < low || arg > hi; }\n\nTEST(MatcherPnMacroTest, Works) {\n  const Matcher<const long&> m = IsNotInClosedRange(10, 20);  // NOLINT\n  EXPECT_TRUE(m.Matches(36L));\n  EXPECT_FALSE(m.Matches(15L));\n\n  EXPECT_EQ(\"is not in closed range (10, 20)\", Describe(m));\n  EXPECT_EQ(\"not (is not in closed range (10, 20))\", DescribeNegation(m));\n  EXPECT_EQ(\"\", Explain(m, 36L));\n  EXPECT_EQ(\"\", Explain(m, 15L));\n}\n\n// Tests that MATCHER*() definitions can be overloaded on the number\n// of parameters; also tests MATCHER_Pn() where n >= 3.\n\nMATCHER(EqualsSumOf, \"\") { return arg == 0; }\nMATCHER_P(EqualsSumOf, a, \"\") { return arg == a; }\nMATCHER_P2(EqualsSumOf, a, b, \"\") { return arg == a + b; }\nMATCHER_P3(EqualsSumOf, a, b, c, \"\") { return arg == a + b + c; }\nMATCHER_P4(EqualsSumOf, a, b, c, d, \"\") { return arg == a + b + c + d; }\nMATCHER_P5(EqualsSumOf, a, b, c, d, e, \"\") { return arg == a + b + c + d + e; }\nMATCHER_P6(EqualsSumOf, a, b, c, d, e, f, \"\") {\n  return arg == a + b + c + d + e + f;\n}\nMATCHER_P7(EqualsSumOf, a, b, c, d, e, f, g, \"\") {\n  return arg == a + b + c + d + e + f + g;\n}\nMATCHER_P8(EqualsSumOf, a, b, c, d, e, f, g, h, \"\") {\n  return arg == a + b + c + d + e + f + g + h;\n}\nMATCHER_P9(EqualsSumOf, a, b, c, d, e, f, g, h, i, \"\") {\n  return arg == a + b + c + d + e + f + g + h + i;\n}\nMATCHER_P10(EqualsSumOf, a, b, c, d, e, f, g, h, i, j, \"\") {\n  return arg == a + b + c + d + e + f + g + h + i + j;\n}\n\nTEST(MatcherPnMacroTest, CanBeOverloadedOnNumberOfParameters) {\n  EXPECT_THAT(0, EqualsSumOf());\n  EXPECT_THAT(1, EqualsSumOf(1));\n  EXPECT_THAT(12, EqualsSumOf(10, 2));\n  EXPECT_THAT(123, EqualsSumOf(100, 20, 3));\n  EXPECT_THAT(1234, EqualsSumOf(1000, 200, 30, 4));\n  EXPECT_THAT(12345, EqualsSumOf(10000, 2000, 300, 40, 5));\n  EXPECT_THAT(\"abcdef\",\n              EqualsSumOf(::std::string(\"a\"), 'b', 'c', \"d\", \"e\", 'f'));\n  EXPECT_THAT(\"abcdefg\",\n              EqualsSumOf(::std::string(\"a\"), 'b', 'c', \"d\", \"e\", 'f', 'g'));\n  EXPECT_THAT(\"abcdefgh\",\n              EqualsSumOf(::std::string(\"a\"), 'b', 'c', \"d\", \"e\", 'f', 'g',\n                          \"h\"));\n  EXPECT_THAT(\"abcdefghi\",\n              EqualsSumOf(::std::string(\"a\"), 'b', 'c', \"d\", \"e\", 'f', 'g',\n                          \"h\", 'i'));\n  EXPECT_THAT(\"abcdefghij\",\n              EqualsSumOf(::std::string(\"a\"), 'b', 'c', \"d\", \"e\", 'f', 'g',\n                          \"h\", 'i', ::std::string(\"j\")));\n\n  EXPECT_THAT(1, Not(EqualsSumOf()));\n  EXPECT_THAT(-1, Not(EqualsSumOf(1)));\n  EXPECT_THAT(-12, Not(EqualsSumOf(10, 2)));\n  EXPECT_THAT(-123, Not(EqualsSumOf(100, 20, 3)));\n  EXPECT_THAT(-1234, Not(EqualsSumOf(1000, 200, 30, 4)));\n  EXPECT_THAT(-12345, Not(EqualsSumOf(10000, 2000, 300, 40, 5)));\n  EXPECT_THAT(\"abcdef \",\n              Not(EqualsSumOf(::std::string(\"a\"), 'b', 'c', \"d\", \"e\", 'f')));\n  EXPECT_THAT(\"abcdefg \",\n              Not(EqualsSumOf(::std::string(\"a\"), 'b', 'c', \"d\", \"e\", 'f',\n                              'g')));\n  EXPECT_THAT(\"abcdefgh \",\n              Not(EqualsSumOf(::std::string(\"a\"), 'b', 'c', \"d\", \"e\", 'f', 'g',\n                              \"h\")));\n  EXPECT_THAT(\"abcdefghi \",\n              Not(EqualsSumOf(::std::string(\"a\"), 'b', 'c', \"d\", \"e\", 'f', 'g',\n                              \"h\", 'i')));\n  EXPECT_THAT(\"abcdefghij \",\n              Not(EqualsSumOf(::std::string(\"a\"), 'b', 'c', \"d\", \"e\", 'f', 'g',\n                              \"h\", 'i', ::std::string(\"j\"))));\n}\n\n// Tests that a MATCHER_Pn() definition can be instantiated with any\n// compatible parameter types.\nTEST(MatcherPnMacroTest, WorksForDifferentParameterTypes) {\n  EXPECT_THAT(123, EqualsSumOf(100L, 20, static_cast<char>(3)));\n  EXPECT_THAT(\"abcd\", EqualsSumOf(::std::string(\"a\"), \"b\", 'c', \"d\"));\n\n  EXPECT_THAT(124, Not(EqualsSumOf(100L, 20, static_cast<char>(3))));\n  EXPECT_THAT(\"abcde\", Not(EqualsSumOf(::std::string(\"a\"), \"b\", 'c', \"d\")));\n}\n\n// Tests that the matcher body can promote the parameter types.\n\nMATCHER_P2(EqConcat, prefix, suffix, \"\") {\n  // The following lines promote the two parameters to desired types.\n  std::string prefix_str(prefix);\n  char suffix_char = static_cast<char>(suffix);\n  return arg == prefix_str + suffix_char;\n}\n\nTEST(MatcherPnMacroTest, SimpleTypePromotion) {\n  Matcher<std::string> no_promo =\n      EqConcat(std::string(\"foo\"), 't');\n  Matcher<const std::string&> promo =\n      EqConcat(\"foo\", static_cast<int>('t'));\n  EXPECT_FALSE(no_promo.Matches(\"fool\"));\n  EXPECT_FALSE(promo.Matches(\"fool\"));\n  EXPECT_TRUE(no_promo.Matches(\"foot\"));\n  EXPECT_TRUE(promo.Matches(\"foot\"));\n}\n\n// Verifies the type of a MATCHER*.\n\nTEST(MatcherPnMacroTest, TypesAreCorrect) {\n  // EqualsSumOf() must be assignable to a EqualsSumOfMatcher variable.\n  EqualsSumOfMatcher a0 = EqualsSumOf();\n\n  // EqualsSumOf(1) must be assignable to a EqualsSumOfMatcherP variable.\n  EqualsSumOfMatcherP<int> a1 = EqualsSumOf(1);\n\n  // EqualsSumOf(p1, ..., pk) must be assignable to a EqualsSumOfMatcherPk\n  // variable, and so on.\n  EqualsSumOfMatcherP2<int, char> a2 = EqualsSumOf(1, '2');\n  EqualsSumOfMatcherP3<int, int, char> a3 = EqualsSumOf(1, 2, '3');\n  EqualsSumOfMatcherP4<int, int, int, char> a4 = EqualsSumOf(1, 2, 3, '4');\n  EqualsSumOfMatcherP5<int, int, int, int, char> a5 =\n      EqualsSumOf(1, 2, 3, 4, '5');\n  EqualsSumOfMatcherP6<int, int, int, int, int, char> a6 =\n      EqualsSumOf(1, 2, 3, 4, 5, '6');\n  EqualsSumOfMatcherP7<int, int, int, int, int, int, char> a7 =\n      EqualsSumOf(1, 2, 3, 4, 5, 6, '7');\n  EqualsSumOfMatcherP8<int, int, int, int, int, int, int, char> a8 =\n      EqualsSumOf(1, 2, 3, 4, 5, 6, 7, '8');\n  EqualsSumOfMatcherP9<int, int, int, int, int, int, int, int, char> a9 =\n      EqualsSumOf(1, 2, 3, 4, 5, 6, 7, 8, '9');\n  EqualsSumOfMatcherP10<int, int, int, int, int, int, int, int, int, char> a10 =\n      EqualsSumOf(1, 2, 3, 4, 5, 6, 7, 8, 9, '0');\n\n  // Avoid \"unused variable\" warnings.\n  (void)a0;\n  (void)a1;\n  (void)a2;\n  (void)a3;\n  (void)a4;\n  (void)a5;\n  (void)a6;\n  (void)a7;\n  (void)a8;\n  (void)a9;\n  (void)a10;\n}\n\n// Tests that matcher-typed parameters can be used in Value() inside a\n// MATCHER_Pn definition.\n\n// Succeeds if arg matches exactly 2 of the 3 matchers.\nMATCHER_P3(TwoOf, m1, m2, m3, \"\") {\n  const int count = static_cast<int>(Value(arg, m1))\n      + static_cast<int>(Value(arg, m2)) + static_cast<int>(Value(arg, m3));\n  return count == 2;\n}\n\nTEST(MatcherPnMacroTest, CanUseMatcherTypedParameterInValue) {\n  EXPECT_THAT(42, TwoOf(Gt(0), Lt(50), Eq(10)));\n  EXPECT_THAT(0, Not(TwoOf(Gt(-1), Lt(1), Eq(0))));\n}\n\n// Tests Contains().\n\nTEST(ContainsTest, ListMatchesWhenElementIsInContainer) {\n  list<int> some_list;\n  some_list.push_back(3);\n  some_list.push_back(1);\n  some_list.push_back(2);\n  EXPECT_THAT(some_list, Contains(1));\n  EXPECT_THAT(some_list, Contains(Gt(2.5)));\n  EXPECT_THAT(some_list, Contains(Eq(2.0f)));\n\n  list<std::string> another_list;\n  another_list.push_back(\"fee\");\n  another_list.push_back(\"fie\");\n  another_list.push_back(\"foe\");\n  another_list.push_back(\"fum\");\n  EXPECT_THAT(another_list, Contains(std::string(\"fee\")));\n}\n\nTEST(ContainsTest, ListDoesNotMatchWhenElementIsNotInContainer) {\n  list<int> some_list;\n  some_list.push_back(3);\n  some_list.push_back(1);\n  EXPECT_THAT(some_list, Not(Contains(4)));\n}\n\nTEST(ContainsTest, SetMatchesWhenElementIsInContainer) {\n  set<int> some_set;\n  some_set.insert(3);\n  some_set.insert(1);\n  some_set.insert(2);\n  EXPECT_THAT(some_set, Contains(Eq(1.0)));\n  EXPECT_THAT(some_set, Contains(Eq(3.0f)));\n  EXPECT_THAT(some_set, Contains(2));\n\n  set<const char*> another_set;\n  another_set.insert(\"fee\");\n  another_set.insert(\"fie\");\n  another_set.insert(\"foe\");\n  another_set.insert(\"fum\");\n  EXPECT_THAT(another_set, Contains(Eq(std::string(\"fum\"))));\n}\n\nTEST(ContainsTest, SetDoesNotMatchWhenElementIsNotInContainer) {\n  set<int> some_set;\n  some_set.insert(3);\n  some_set.insert(1);\n  EXPECT_THAT(some_set, Not(Contains(4)));\n\n  set<const char*> c_string_set;\n  c_string_set.insert(\"hello\");\n  EXPECT_THAT(c_string_set, Not(Contains(std::string(\"hello\").c_str())));\n}\n\nTEST(ContainsTest, ExplainsMatchResultCorrectly) {\n  const int a[2] = { 1, 2 };\n  Matcher<const int (&)[2]> m = Contains(2);\n  EXPECT_EQ(\"whose element #1 matches\", Explain(m, a));\n\n  m = Contains(3);\n  EXPECT_EQ(\"\", Explain(m, a));\n\n  m = Contains(GreaterThan(0));\n  EXPECT_EQ(\"whose element #0 matches, which is 1 more than 0\", Explain(m, a));\n\n  m = Contains(GreaterThan(10));\n  EXPECT_EQ(\"\", Explain(m, a));\n}\n\nTEST(ContainsTest, DescribesItselfCorrectly) {\n  Matcher<vector<int> > m = Contains(1);\n  EXPECT_EQ(\"contains at least one element that is equal to 1\", Describe(m));\n\n  Matcher<vector<int> > m2 = Not(m);\n  EXPECT_EQ(\"doesn't contain any element that is equal to 1\", Describe(m2));\n}\n\nTEST(ContainsTest, MapMatchesWhenElementIsInContainer) {\n  map<const char*, int> my_map;\n  const char* bar = \"a string\";\n  my_map[bar] = 2;\n  EXPECT_THAT(my_map, Contains(pair<const char* const, int>(bar, 2)));\n\n  map<std::string, int> another_map;\n  another_map[\"fee\"] = 1;\n  another_map[\"fie\"] = 2;\n  another_map[\"foe\"] = 3;\n  another_map[\"fum\"] = 4;\n  EXPECT_THAT(another_map,\n              Contains(pair<const std::string, int>(std::string(\"fee\"), 1)));\n  EXPECT_THAT(another_map, Contains(pair<const std::string, int>(\"fie\", 2)));\n}\n\nTEST(ContainsTest, MapDoesNotMatchWhenElementIsNotInContainer) {\n  map<int, int> some_map;\n  some_map[1] = 11;\n  some_map[2] = 22;\n  EXPECT_THAT(some_map, Not(Contains(pair<const int, int>(2, 23))));\n}\n\nTEST(ContainsTest, ArrayMatchesWhenElementIsInContainer) {\n  const char* string_array[] = { \"fee\", \"fie\", \"foe\", \"fum\" };\n  EXPECT_THAT(string_array, Contains(Eq(std::string(\"fum\"))));\n}\n\nTEST(ContainsTest, ArrayDoesNotMatchWhenElementIsNotInContainer) {\n  int int_array[] = { 1, 2, 3, 4 };\n  EXPECT_THAT(int_array, Not(Contains(5)));\n}\n\nTEST(ContainsTest, AcceptsMatcher) {\n  const int a[] = { 1, 2, 3 };\n  EXPECT_THAT(a, Contains(Gt(2)));\n  EXPECT_THAT(a, Not(Contains(Gt(4))));\n}\n\nTEST(ContainsTest, WorksForNativeArrayAsTuple) {\n  const int a[] = { 1, 2 };\n  const int* const pointer = a;\n  EXPECT_THAT(make_tuple(pointer, 2), Contains(1));\n  EXPECT_THAT(make_tuple(pointer, 2), Not(Contains(Gt(3))));\n}\n\nTEST(ContainsTest, WorksForTwoDimensionalNativeArray) {\n  int a[][3] = { { 1, 2, 3 }, { 4, 5, 6 } };\n  EXPECT_THAT(a, Contains(ElementsAre(4, 5, 6)));\n  EXPECT_THAT(a, Contains(Contains(5)));\n  EXPECT_THAT(a, Not(Contains(ElementsAre(3, 4, 5))));\n  EXPECT_THAT(a, Contains(Not(Contains(5))));\n}\n\nTEST(AllOfTest, HugeMatcher) {\n  // Verify that using AllOf with many arguments doesn't cause\n  // the compiler to exceed template instantiation depth limit.\n  EXPECT_THAT(0, testing::AllOf(_, _, _, _, _, _, _, _, _,\n                                testing::AllOf(_, _, _, _, _, _, _, _, _, _)));\n}\n\nTEST(AnyOfTest, HugeMatcher) {\n  // Verify that using AnyOf with many arguments doesn't cause\n  // the compiler to exceed template instantiation depth limit.\n  EXPECT_THAT(0, testing::AnyOf(_, _, _, _, _, _, _, _, _,\n                                testing::AnyOf(_, _, _, _, _, _, _, _, _, _)));\n}\n\nnamespace adl_test {\n\n// Verifies that the implementation of ::testing::AllOf and ::testing::AnyOf\n// don't issue unqualified recursive calls.  If they do, the argument dependent\n// name lookup will cause AllOf/AnyOf in the 'adl_test' namespace to be found\n// as a candidate and the compilation will break due to an ambiguous overload.\n\n// The matcher must be in the same namespace as AllOf/AnyOf to make argument\n// dependent lookup find those.\nMATCHER(M, \"\") { return true; }\n\ntemplate <typename T1, typename T2>\nbool AllOf(const T1& t1, const T2& t2) { return true; }\n\nTEST(AllOfTest, DoesNotCallAllOfUnqualified) {\n  EXPECT_THAT(42, testing::AllOf(\n      M(), M(), M(), M(), M(), M(), M(), M(), M(), M()));\n}\n\ntemplate <typename T1, typename T2> bool\nAnyOf(const T1& t1, const T2& t2) { return true; }\n\nTEST(AnyOfTest, DoesNotCallAnyOfUnqualified) {\n  EXPECT_THAT(42, testing::AnyOf(\n      M(), M(), M(), M(), M(), M(), M(), M(), M(), M()));\n}\n\n}  // namespace adl_test\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n\n#if GTEST_LANG_CXX11\n\nTEST(AllOfTest, WorksOnMoveOnlyType) {\n  std::unique_ptr<int> p(new int(3));\n  EXPECT_THAT(p, AllOf(Pointee(Eq(3)), Pointee(Gt(0)), Pointee(Lt(5))));\n  EXPECT_THAT(p, Not(AllOf(Pointee(Eq(3)), Pointee(Gt(0)), Pointee(Lt(3)))));\n}\n\nTEST(AnyOfTest, WorksOnMoveOnlyType) {\n  std::unique_ptr<int> p(new int(3));\n  EXPECT_THAT(p, AnyOf(Pointee(Eq(5)), Pointee(Lt(0)), Pointee(Lt(5))));\n  EXPECT_THAT(p, Not(AnyOf(Pointee(Eq(5)), Pointee(Lt(0)), Pointee(Gt(5)))));\n}\n\nMATCHER(IsNotNull, \"\") {\n  return arg != nullptr;\n}\n\n// Verifies that a matcher defined using MATCHER() can work on\n// move-only types.\nTEST(MatcherMacroTest, WorksOnMoveOnlyType) {\n  std::unique_ptr<int> p(new int(3));\n  EXPECT_THAT(p, IsNotNull());\n  EXPECT_THAT(std::unique_ptr<int>(), Not(IsNotNull()));\n}\n\nMATCHER_P(UniquePointee, pointee, \"\") {\n  return *arg == pointee;\n}\n\n// Verifies that a matcher defined using MATCHER_P*() can work on\n// move-only types.\nTEST(MatcherPMacroTest, WorksOnMoveOnlyType) {\n  std::unique_ptr<int> p(new int(3));\n  EXPECT_THAT(p, UniquePointee(3));\n  EXPECT_THAT(p, Not(UniquePointee(2)));\n}\n\n#endif  // GTEST_LASNG_CXX11\n\n}  // namespace\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock-internal-utils_test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file tests the internal utilities.\n\n#include \"gmock/internal/gmock-internal-utils.h\"\n#include <stdlib.h>\n#include <map>\n#include <memory>\n#include <string>\n#include <sstream>\n#include <vector>\n#include \"gmock/gmock.h\"\n#include \"gmock/internal/gmock-port.h\"\n#include \"gtest/gtest.h\"\n#include \"gtest/gtest-spi.h\"\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// their code.\n#define GTEST_IMPLEMENTATION_ 1\n#include \"src/gtest-internal-inl.h\"\n#undef GTEST_IMPLEMENTATION_\n\n#if GTEST_OS_CYGWIN\n# include <sys/types.h>  // For ssize_t. NOLINT\n#endif\n\nclass ProtocolMessage;\n\nnamespace proto2 {\nclass Message;\n}  // namespace proto2\n\nnamespace testing {\nnamespace internal {\n\nnamespace {\n\nTEST(JoinAsTupleTest, JoinsEmptyTuple) {\n  EXPECT_EQ(\"\", JoinAsTuple(Strings()));\n}\n\nTEST(JoinAsTupleTest, JoinsOneTuple) {\n  const char* fields[] = {\"1\"};\n  EXPECT_EQ(\"1\", JoinAsTuple(Strings(fields, fields + 1)));\n}\n\nTEST(JoinAsTupleTest, JoinsTwoTuple) {\n  const char* fields[] = {\"1\", \"a\"};\n  EXPECT_EQ(\"(1, a)\", JoinAsTuple(Strings(fields, fields + 2)));\n}\n\nTEST(JoinAsTupleTest, JoinsTenTuple) {\n  const char* fields[] = {\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\"};\n  EXPECT_EQ(\"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\",\n            JoinAsTuple(Strings(fields, fields + 10)));\n}\n\nTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsNoWord) {\n  EXPECT_EQ(\"\", ConvertIdentifierNameToWords(\"\"));\n  EXPECT_EQ(\"\", ConvertIdentifierNameToWords(\"_\"));\n  EXPECT_EQ(\"\", ConvertIdentifierNameToWords(\"__\"));\n}\n\nTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsDigits) {\n  EXPECT_EQ(\"1\", ConvertIdentifierNameToWords(\"_1\"));\n  EXPECT_EQ(\"2\", ConvertIdentifierNameToWords(\"2_\"));\n  EXPECT_EQ(\"34\", ConvertIdentifierNameToWords(\"_34_\"));\n  EXPECT_EQ(\"34 56\", ConvertIdentifierNameToWords(\"_34_56\"));\n}\n\nTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsCamelCaseWords) {\n  EXPECT_EQ(\"a big word\", ConvertIdentifierNameToWords(\"ABigWord\"));\n  EXPECT_EQ(\"foo bar\", ConvertIdentifierNameToWords(\"FooBar\"));\n  EXPECT_EQ(\"foo\", ConvertIdentifierNameToWords(\"Foo_\"));\n  EXPECT_EQ(\"foo bar\", ConvertIdentifierNameToWords(\"_Foo_Bar_\"));\n  EXPECT_EQ(\"foo and bar\", ConvertIdentifierNameToWords(\"_Foo__And_Bar\"));\n}\n\nTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContains_SeparatedWords) {\n  EXPECT_EQ(\"foo bar\", ConvertIdentifierNameToWords(\"foo_bar\"));\n  EXPECT_EQ(\"foo\", ConvertIdentifierNameToWords(\"_foo_\"));\n  EXPECT_EQ(\"foo bar\", ConvertIdentifierNameToWords(\"_foo_bar_\"));\n  EXPECT_EQ(\"foo and bar\", ConvertIdentifierNameToWords(\"_foo__and_bar\"));\n}\n\nTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameIsMixture) {\n  EXPECT_EQ(\"foo bar 123\", ConvertIdentifierNameToWords(\"Foo_bar123\"));\n  EXPECT_EQ(\"chapter 11 section 1\",\n            ConvertIdentifierNameToWords(\"_Chapter11Section_1_\"));\n}\n\nTEST(PointeeOfTest, WorksForSmartPointers) {\n  CompileAssertTypesEqual<const char,\n      PointeeOf<internal::linked_ptr<const char> >::type>();\n#if GTEST_HAS_STD_UNIQUE_PTR_\n  CompileAssertTypesEqual<int, PointeeOf<std::unique_ptr<int> >::type>();\n#endif  // GTEST_HAS_STD_UNIQUE_PTR_\n#if GTEST_HAS_STD_SHARED_PTR_\n  CompileAssertTypesEqual<std::string,\n                          PointeeOf<std::shared_ptr<std::string> >::type>();\n#endif  // GTEST_HAS_STD_SHARED_PTR_\n}\n\nTEST(PointeeOfTest, WorksForRawPointers) {\n  CompileAssertTypesEqual<int, PointeeOf<int*>::type>();\n  CompileAssertTypesEqual<const char, PointeeOf<const char*>::type>();\n  CompileAssertTypesEqual<void, PointeeOf<void*>::type>();\n}\n\nTEST(GetRawPointerTest, WorksForSmartPointers) {\n#if GTEST_HAS_STD_UNIQUE_PTR_\n  const char* const raw_p1 = new const char('a');  // NOLINT\n  const std::unique_ptr<const char> p1(raw_p1);\n  EXPECT_EQ(raw_p1, GetRawPointer(p1));\n#endif  // GTEST_HAS_STD_UNIQUE_PTR_\n#if GTEST_HAS_STD_SHARED_PTR_\n  double* const raw_p2 = new double(2.5);  // NOLINT\n  const std::shared_ptr<double> p2(raw_p2);\n  EXPECT_EQ(raw_p2, GetRawPointer(p2));\n#endif  // GTEST_HAS_STD_SHARED_PTR_\n\n  const char* const raw_p4 = new const char('a');  // NOLINT\n  const internal::linked_ptr<const char> p4(raw_p4);\n  EXPECT_EQ(raw_p4, GetRawPointer(p4));\n}\n\nTEST(GetRawPointerTest, WorksForRawPointers) {\n  int* p = NULL;\n  // Don't use EXPECT_EQ as no NULL-testing magic on Symbian.\n  EXPECT_TRUE(NULL == GetRawPointer(p));\n  int n = 1;\n  EXPECT_EQ(&n, GetRawPointer(&n));\n}\n\n// Tests KindOf<T>.\n\nclass Base {};\nclass Derived : public Base {};\n\nTEST(KindOfTest, Bool) {\n  EXPECT_EQ(kBool, GMOCK_KIND_OF_(bool));  // NOLINT\n}\n\nTEST(KindOfTest, Integer) {\n  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(char));  // NOLINT\n  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(signed char));  // NOLINT\n  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned char));  // NOLINT\n  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(short));  // NOLINT\n  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned short));  // NOLINT\n  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(int));  // NOLINT\n  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned int));  // NOLINT\n  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(long));  // NOLINT\n  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned long));  // NOLINT\n  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(wchar_t));  // NOLINT\n  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(Int64));  // NOLINT\n  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(UInt64));  // NOLINT\n  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(size_t));  // NOLINT\n#if GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN\n  // ssize_t is not defined on Windows and possibly some other OSes.\n  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(ssize_t));  // NOLINT\n#endif\n}\n\nTEST(KindOfTest, FloatingPoint) {\n  EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(float));  // NOLINT\n  EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(double));  // NOLINT\n  EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(long double));  // NOLINT\n}\n\nTEST(KindOfTest, Other) {\n  EXPECT_EQ(kOther, GMOCK_KIND_OF_(void*));  // NOLINT\n  EXPECT_EQ(kOther, GMOCK_KIND_OF_(char**));  // NOLINT\n  EXPECT_EQ(kOther, GMOCK_KIND_OF_(Base));  // NOLINT\n}\n\n// Tests LosslessArithmeticConvertible<T, U>.\n\nTEST(LosslessArithmeticConvertibleTest, BoolToBool) {\n  EXPECT_TRUE((LosslessArithmeticConvertible<bool, bool>::value));\n}\n\nTEST(LosslessArithmeticConvertibleTest, BoolToInteger) {\n  EXPECT_TRUE((LosslessArithmeticConvertible<bool, char>::value));\n  EXPECT_TRUE((LosslessArithmeticConvertible<bool, int>::value));\n  EXPECT_TRUE(\n      (LosslessArithmeticConvertible<bool, unsigned long>::value));  // NOLINT\n}\n\nTEST(LosslessArithmeticConvertibleTest, BoolToFloatingPoint) {\n  EXPECT_TRUE((LosslessArithmeticConvertible<bool, float>::value));\n  EXPECT_TRUE((LosslessArithmeticConvertible<bool, double>::value));\n}\n\nTEST(LosslessArithmeticConvertibleTest, IntegerToBool) {\n  EXPECT_FALSE((LosslessArithmeticConvertible<unsigned char, bool>::value));\n  EXPECT_FALSE((LosslessArithmeticConvertible<int, bool>::value));\n}\n\nTEST(LosslessArithmeticConvertibleTest, IntegerToInteger) {\n  // Unsigned => larger signed is fine.\n  EXPECT_TRUE((LosslessArithmeticConvertible<unsigned char, int>::value));\n\n  // Unsigned => larger unsigned is fine.\n  EXPECT_TRUE(\n      (LosslessArithmeticConvertible<unsigned short, UInt64>::value)); // NOLINT\n\n  // Signed => unsigned is not fine.\n  EXPECT_FALSE((LosslessArithmeticConvertible<short, UInt64>::value)); // NOLINT\n  EXPECT_FALSE((LosslessArithmeticConvertible<\n      signed char, unsigned int>::value));  // NOLINT\n\n  // Same size and same signedness: fine too.\n  EXPECT_TRUE((LosslessArithmeticConvertible<\n               unsigned char, unsigned char>::value));\n  EXPECT_TRUE((LosslessArithmeticConvertible<int, int>::value));\n  EXPECT_TRUE((LosslessArithmeticConvertible<wchar_t, wchar_t>::value));\n  EXPECT_TRUE((LosslessArithmeticConvertible<\n               unsigned long, unsigned long>::value));  // NOLINT\n\n  // Same size, different signedness: not fine.\n  EXPECT_FALSE((LosslessArithmeticConvertible<\n                unsigned char, signed char>::value));\n  EXPECT_FALSE((LosslessArithmeticConvertible<int, unsigned int>::value));\n  EXPECT_FALSE((LosslessArithmeticConvertible<UInt64, Int64>::value));\n\n  // Larger size => smaller size is not fine.\n  EXPECT_FALSE((LosslessArithmeticConvertible<long, char>::value));  // NOLINT\n  EXPECT_FALSE((LosslessArithmeticConvertible<int, signed char>::value));\n  EXPECT_FALSE((LosslessArithmeticConvertible<Int64, unsigned int>::value));\n}\n\nTEST(LosslessArithmeticConvertibleTest, IntegerToFloatingPoint) {\n  // Integers cannot be losslessly converted to floating-points, as\n  // the format of the latter is implementation-defined.\n  EXPECT_FALSE((LosslessArithmeticConvertible<char, float>::value));\n  EXPECT_FALSE((LosslessArithmeticConvertible<int, double>::value));\n  EXPECT_FALSE((LosslessArithmeticConvertible<\n                short, long double>::value));  // NOLINT\n}\n\nTEST(LosslessArithmeticConvertibleTest, FloatingPointToBool) {\n  EXPECT_FALSE((LosslessArithmeticConvertible<float, bool>::value));\n  EXPECT_FALSE((LosslessArithmeticConvertible<double, bool>::value));\n}\n\nTEST(LosslessArithmeticConvertibleTest, FloatingPointToInteger) {\n  EXPECT_FALSE((LosslessArithmeticConvertible<float, long>::value));  // NOLINT\n  EXPECT_FALSE((LosslessArithmeticConvertible<double, Int64>::value));\n  EXPECT_FALSE((LosslessArithmeticConvertible<long double, int>::value));\n}\n\nTEST(LosslessArithmeticConvertibleTest, FloatingPointToFloatingPoint) {\n  // Smaller size => larger size is fine.\n  EXPECT_TRUE((LosslessArithmeticConvertible<float, double>::value));\n  EXPECT_TRUE((LosslessArithmeticConvertible<float, long double>::value));\n  EXPECT_TRUE((LosslessArithmeticConvertible<double, long double>::value));\n\n  // Same size: fine.\n  EXPECT_TRUE((LosslessArithmeticConvertible<float, float>::value));\n  EXPECT_TRUE((LosslessArithmeticConvertible<double, double>::value));\n\n  // Larger size => smaller size is not fine.\n  EXPECT_FALSE((LosslessArithmeticConvertible<double, float>::value));\n  GTEST_INTENTIONAL_CONST_COND_PUSH_()\n  if (sizeof(double) == sizeof(long double)) {  // NOLINT\n  GTEST_INTENTIONAL_CONST_COND_POP_()\n    // In some implementations (e.g. MSVC), double and long double\n    // have the same size.\n    EXPECT_TRUE((LosslessArithmeticConvertible<long double, double>::value));\n  } else {\n    EXPECT_FALSE((LosslessArithmeticConvertible<long double, double>::value));\n  }\n}\n\n// Tests the TupleMatches() template function.\n\nTEST(TupleMatchesTest, WorksForSize0) {\n  tuple<> matchers;\n  tuple<> values;\n\n  EXPECT_TRUE(TupleMatches(matchers, values));\n}\n\nTEST(TupleMatchesTest, WorksForSize1) {\n  tuple<Matcher<int> > matchers(Eq(1));\n  tuple<int> values1(1),\n      values2(2);\n\n  EXPECT_TRUE(TupleMatches(matchers, values1));\n  EXPECT_FALSE(TupleMatches(matchers, values2));\n}\n\nTEST(TupleMatchesTest, WorksForSize2) {\n  tuple<Matcher<int>, Matcher<char> > matchers(Eq(1), Eq('a'));\n  tuple<int, char> values1(1, 'a'),\n      values2(1, 'b'),\n      values3(2, 'a'),\n      values4(2, 'b');\n\n  EXPECT_TRUE(TupleMatches(matchers, values1));\n  EXPECT_FALSE(TupleMatches(matchers, values2));\n  EXPECT_FALSE(TupleMatches(matchers, values3));\n  EXPECT_FALSE(TupleMatches(matchers, values4));\n}\n\nTEST(TupleMatchesTest, WorksForSize5) {\n  tuple<Matcher<int>, Matcher<char>, Matcher<bool>, Matcher<long>,  // NOLINT\n        Matcher<std::string> >\n      matchers(Eq(1), Eq('a'), Eq(true), Eq(2L), Eq(\"hi\"));\n  tuple<int, char, bool, long, std::string>  // NOLINT\n      values1(1, 'a', true, 2L, \"hi\"), values2(1, 'a', true, 2L, \"hello\"),\n      values3(2, 'a', true, 2L, \"hi\");\n\n  EXPECT_TRUE(TupleMatches(matchers, values1));\n  EXPECT_FALSE(TupleMatches(matchers, values2));\n  EXPECT_FALSE(TupleMatches(matchers, values3));\n}\n\n// Tests that Assert(true, ...) succeeds.\nTEST(AssertTest, SucceedsOnTrue) {\n  Assert(true, __FILE__, __LINE__, \"This should succeed.\");\n  Assert(true, __FILE__, __LINE__);  // This should succeed too.\n}\n\n// Tests that Assert(false, ...) generates a fatal failure.\nTEST(AssertTest, FailsFatallyOnFalse) {\n  EXPECT_DEATH_IF_SUPPORTED({\n    Assert(false, __FILE__, __LINE__, \"This should fail.\");\n  }, \"\");\n\n  EXPECT_DEATH_IF_SUPPORTED({\n    Assert(false, __FILE__, __LINE__);\n  }, \"\");\n}\n\n// Tests that Expect(true, ...) succeeds.\nTEST(ExpectTest, SucceedsOnTrue) {\n  Expect(true, __FILE__, __LINE__, \"This should succeed.\");\n  Expect(true, __FILE__, __LINE__);  // This should succeed too.\n}\n\n// Tests that Expect(false, ...) generates a non-fatal failure.\nTEST(ExpectTest, FailsNonfatallyOnFalse) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    Expect(false, __FILE__, __LINE__, \"This should fail.\");\n  }, \"This should fail\");\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    Expect(false, __FILE__, __LINE__);\n  }, \"Expectation failed\");\n}\n\n// Tests LogIsVisible().\n\nclass LogIsVisibleTest : public ::testing::Test {\n protected:\n  virtual void SetUp() {\n    original_verbose_ = GMOCK_FLAG(verbose);\n  }\n\n  virtual void TearDown() { GMOCK_FLAG(verbose) = original_verbose_; }\n\n  std::string original_verbose_;\n};\n\nTEST_F(LogIsVisibleTest, AlwaysReturnsTrueIfVerbosityIsInfo) {\n  GMOCK_FLAG(verbose) = kInfoVerbosity;\n  EXPECT_TRUE(LogIsVisible(kInfo));\n  EXPECT_TRUE(LogIsVisible(kWarning));\n}\n\nTEST_F(LogIsVisibleTest, AlwaysReturnsFalseIfVerbosityIsError) {\n  GMOCK_FLAG(verbose) = kErrorVerbosity;\n  EXPECT_FALSE(LogIsVisible(kInfo));\n  EXPECT_FALSE(LogIsVisible(kWarning));\n}\n\nTEST_F(LogIsVisibleTest, WorksWhenVerbosityIsWarning) {\n  GMOCK_FLAG(verbose) = kWarningVerbosity;\n  EXPECT_FALSE(LogIsVisible(kInfo));\n  EXPECT_TRUE(LogIsVisible(kWarning));\n}\n\n#if GTEST_HAS_STREAM_REDIRECTION\n\n// Tests the Log() function.\n\n// Verifies that Log() behaves correctly for the given verbosity level\n// and log severity.\nvoid TestLogWithSeverity(const std::string& verbosity, LogSeverity severity,\n                         bool should_print) {\n  const std::string old_flag = GMOCK_FLAG(verbose);\n  GMOCK_FLAG(verbose) = verbosity;\n  CaptureStdout();\n  Log(severity, \"Test log.\\n\", 0);\n  if (should_print) {\n    EXPECT_THAT(GetCapturedStdout().c_str(),\n                ContainsRegex(\n                    severity == kWarning ?\n                    \"^\\nGMOCK WARNING:\\nTest log\\\\.\\nStack trace:\\n\" :\n                    \"^\\nTest log\\\\.\\nStack trace:\\n\"));\n  } else {\n    EXPECT_STREQ(\"\", GetCapturedStdout().c_str());\n  }\n  GMOCK_FLAG(verbose) = old_flag;\n}\n\n// Tests that when the stack_frames_to_skip parameter is negative,\n// Log() doesn't include the stack trace in the output.\nTEST(LogTest, NoStackTraceWhenStackFramesToSkipIsNegative) {\n  const std::string saved_flag = GMOCK_FLAG(verbose);\n  GMOCK_FLAG(verbose) = kInfoVerbosity;\n  CaptureStdout();\n  Log(kInfo, \"Test log.\\n\", -1);\n  EXPECT_STREQ(\"\\nTest log.\\n\", GetCapturedStdout().c_str());\n  GMOCK_FLAG(verbose) = saved_flag;\n}\n\nstruct MockStackTraceGetter : testing::internal::OsStackTraceGetterInterface {\n  virtual std::string CurrentStackTrace(int max_depth, int skip_count) {\n    return (testing::Message() << max_depth << \"::\" << skip_count << \"\\n\")\n        .GetString();\n  }\n  virtual void UponLeavingGTest() {}\n};\n\n// Tests that in opt mode, a positive stack_frames_to_skip argument is\n// treated as 0.\nTEST(LogTest, NoSkippingStackFrameInOptMode) {\n  MockStackTraceGetter* mock_os_stack_trace_getter = new MockStackTraceGetter;\n  GetUnitTestImpl()->set_os_stack_trace_getter(mock_os_stack_trace_getter);\n\n  CaptureStdout();\n  Log(kWarning, \"Test log.\\n\", 100);\n  const std::string log = GetCapturedStdout();\n\n  std::string expected_trace =\n      (testing::Message() << GTEST_FLAG(stack_trace_depth) << \"::\").GetString();\n  std::string expected_message =\n      \"\\nGMOCK WARNING:\\n\"\n      \"Test log.\\n\"\n      \"Stack trace:\\n\" +\n      expected_trace;\n  EXPECT_THAT(log, HasSubstr(expected_message));\n  int skip_count = atoi(log.substr(expected_message.size()).c_str());\n\n# if defined(NDEBUG)\n  // In opt mode, no stack frame should be skipped.\n  const int expected_skip_count = 0;\n# else\n  // In dbg mode, the stack frames should be skipped.\n  const int expected_skip_count = 100;\n# endif\n\n  // Note that each inner implementation layer will +1 the number to remove\n  // itself from the trace. This means that the value is a little higher than\n  // expected, but close enough.\n  EXPECT_THAT(skip_count,\n              AllOf(Ge(expected_skip_count), Le(expected_skip_count + 10)));\n\n  // Restores the default OS stack trace getter.\n  GetUnitTestImpl()->set_os_stack_trace_getter(NULL);\n}\n\n// Tests that all logs are printed when the value of the\n// --gmock_verbose flag is \"info\".\nTEST(LogTest, AllLogsArePrintedWhenVerbosityIsInfo) {\n  TestLogWithSeverity(kInfoVerbosity, kInfo, true);\n  TestLogWithSeverity(kInfoVerbosity, kWarning, true);\n}\n\n// Tests that only warnings are printed when the value of the\n// --gmock_verbose flag is \"warning\".\nTEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsWarning) {\n  TestLogWithSeverity(kWarningVerbosity, kInfo, false);\n  TestLogWithSeverity(kWarningVerbosity, kWarning, true);\n}\n\n// Tests that no logs are printed when the value of the\n// --gmock_verbose flag is \"error\".\nTEST(LogTest, NoLogsArePrintedWhenVerbosityIsError) {\n  TestLogWithSeverity(kErrorVerbosity, kInfo, false);\n  TestLogWithSeverity(kErrorVerbosity, kWarning, false);\n}\n\n// Tests that only warnings are printed when the value of the\n// --gmock_verbose flag is invalid.\nTEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsInvalid) {\n  TestLogWithSeverity(\"invalid\", kInfo, false);\n  TestLogWithSeverity(\"invalid\", kWarning, true);\n}\n\n#endif  // GTEST_HAS_STREAM_REDIRECTION\n\nTEST(TypeTraitsTest, true_type) {\n  EXPECT_TRUE(true_type::value);\n}\n\nTEST(TypeTraitsTest, false_type) {\n  EXPECT_FALSE(false_type::value);\n}\n\nTEST(TypeTraitsTest, is_reference) {\n  EXPECT_FALSE(is_reference<int>::value);\n  EXPECT_FALSE(is_reference<char*>::value);\n  EXPECT_TRUE(is_reference<const int&>::value);\n}\n\nTEST(TypeTraitsTest, is_pointer) {\n  EXPECT_FALSE(is_pointer<int>::value);\n  EXPECT_FALSE(is_pointer<char&>::value);\n  EXPECT_TRUE(is_pointer<const int*>::value);\n}\n\nTEST(TypeTraitsTest, type_equals) {\n  EXPECT_FALSE((type_equals<int, const int>::value));\n  EXPECT_FALSE((type_equals<int, int&>::value));\n  EXPECT_FALSE((type_equals<int, double>::value));\n  EXPECT_TRUE((type_equals<char, char>::value));\n}\n\nTEST(TypeTraitsTest, remove_reference) {\n  EXPECT_TRUE((type_equals<char, remove_reference<char&>::type>::value));\n  EXPECT_TRUE((type_equals<const int,\n               remove_reference<const int&>::type>::value));\n  EXPECT_TRUE((type_equals<int, remove_reference<int>::type>::value));\n  EXPECT_TRUE((type_equals<double*, remove_reference<double*>::type>::value));\n}\n\n#if GTEST_HAS_STREAM_REDIRECTION\n\n// Verifies that Log() behaves correctly for the given verbosity level\n// and log severity.\nstd::string GrabOutput(void(*logger)(), const char* verbosity) {\n  const std::string saved_flag = GMOCK_FLAG(verbose);\n  GMOCK_FLAG(verbose) = verbosity;\n  CaptureStdout();\n  logger();\n  GMOCK_FLAG(verbose) = saved_flag;\n  return GetCapturedStdout();\n}\n\nclass DummyMock {\n public:\n  MOCK_METHOD0(TestMethod, void());\n  MOCK_METHOD1(TestMethodArg, void(int dummy));\n};\n\nvoid ExpectCallLogger() {\n  DummyMock mock;\n  EXPECT_CALL(mock, TestMethod());\n  mock.TestMethod();\n};\n\n// Verifies that EXPECT_CALL logs if the --gmock_verbose flag is set to \"info\".\nTEST(ExpectCallTest, LogsWhenVerbosityIsInfo) {\n  EXPECT_THAT(std::string(GrabOutput(ExpectCallLogger, kInfoVerbosity)),\n              HasSubstr(\"EXPECT_CALL(mock, TestMethod())\"));\n}\n\n// Verifies that EXPECT_CALL doesn't log\n// if the --gmock_verbose flag is set to \"warning\".\nTEST(ExpectCallTest, DoesNotLogWhenVerbosityIsWarning) {\n  EXPECT_STREQ(\"\", GrabOutput(ExpectCallLogger, kWarningVerbosity).c_str());\n}\n\n// Verifies that EXPECT_CALL doesn't log\n// if the --gmock_verbose flag is set to \"error\".\nTEST(ExpectCallTest,  DoesNotLogWhenVerbosityIsError) {\n  EXPECT_STREQ(\"\", GrabOutput(ExpectCallLogger, kErrorVerbosity).c_str());\n}\n\nvoid OnCallLogger() {\n  DummyMock mock;\n  ON_CALL(mock, TestMethod());\n};\n\n// Verifies that ON_CALL logs if the --gmock_verbose flag is set to \"info\".\nTEST(OnCallTest, LogsWhenVerbosityIsInfo) {\n  EXPECT_THAT(std::string(GrabOutput(OnCallLogger, kInfoVerbosity)),\n              HasSubstr(\"ON_CALL(mock, TestMethod())\"));\n}\n\n// Verifies that ON_CALL doesn't log\n// if the --gmock_verbose flag is set to \"warning\".\nTEST(OnCallTest, DoesNotLogWhenVerbosityIsWarning) {\n  EXPECT_STREQ(\"\", GrabOutput(OnCallLogger, kWarningVerbosity).c_str());\n}\n\n// Verifies that ON_CALL doesn't log if\n// the --gmock_verbose flag is set to \"error\".\nTEST(OnCallTest, DoesNotLogWhenVerbosityIsError) {\n  EXPECT_STREQ(\"\", GrabOutput(OnCallLogger, kErrorVerbosity).c_str());\n}\n\nvoid OnCallAnyArgumentLogger() {\n  DummyMock mock;\n  ON_CALL(mock, TestMethodArg(_));\n}\n\n// Verifies that ON_CALL prints provided _ argument.\nTEST(OnCallTest, LogsAnythingArgument) {\n  EXPECT_THAT(std::string(GrabOutput(OnCallAnyArgumentLogger, kInfoVerbosity)),\n              HasSubstr(\"ON_CALL(mock, TestMethodArg(_)\"));\n}\n\n#endif  // GTEST_HAS_STREAM_REDIRECTION\n\n// Tests StlContainerView.\n\nTEST(StlContainerViewTest, WorksForStlContainer) {\n  StaticAssertTypeEq<std::vector<int>,\n      StlContainerView<std::vector<int> >::type>();\n  StaticAssertTypeEq<const std::vector<double>&,\n      StlContainerView<std::vector<double> >::const_reference>();\n\n  typedef std::vector<char> Chars;\n  Chars v1;\n  const Chars& v2(StlContainerView<Chars>::ConstReference(v1));\n  EXPECT_EQ(&v1, &v2);\n\n  v1.push_back('a');\n  Chars v3 = StlContainerView<Chars>::Copy(v1);\n  EXPECT_THAT(v3, Eq(v3));\n}\n\nTEST(StlContainerViewTest, WorksForStaticNativeArray) {\n  StaticAssertTypeEq<NativeArray<int>,\n      StlContainerView<int[3]>::type>();\n  StaticAssertTypeEq<NativeArray<double>,\n      StlContainerView<const double[4]>::type>();\n  StaticAssertTypeEq<NativeArray<char[3]>,\n      StlContainerView<const char[2][3]>::type>();\n\n  StaticAssertTypeEq<const NativeArray<int>,\n      StlContainerView<int[2]>::const_reference>();\n\n  int a1[3] = { 0, 1, 2 };\n  NativeArray<int> a2 = StlContainerView<int[3]>::ConstReference(a1);\n  EXPECT_EQ(3U, a2.size());\n  EXPECT_EQ(a1, a2.begin());\n\n  const NativeArray<int> a3 = StlContainerView<int[3]>::Copy(a1);\n  ASSERT_EQ(3U, a3.size());\n  EXPECT_EQ(0, a3.begin()[0]);\n  EXPECT_EQ(1, a3.begin()[1]);\n  EXPECT_EQ(2, a3.begin()[2]);\n\n  // Makes sure a1 and a3 aren't aliases.\n  a1[0] = 3;\n  EXPECT_EQ(0, a3.begin()[0]);\n}\n\nTEST(StlContainerViewTest, WorksForDynamicNativeArray) {\n  StaticAssertTypeEq<NativeArray<int>,\n      StlContainerView<tuple<const int*, size_t> >::type>();\n  StaticAssertTypeEq<NativeArray<double>,\n      StlContainerView<tuple<linked_ptr<double>, int> >::type>();\n\n  StaticAssertTypeEq<const NativeArray<int>,\n      StlContainerView<tuple<const int*, int> >::const_reference>();\n\n  int a1[3] = { 0, 1, 2 };\n  const int* const p1 = a1;\n  NativeArray<int> a2 = StlContainerView<tuple<const int*, int> >::\n      ConstReference(make_tuple(p1, 3));\n  EXPECT_EQ(3U, a2.size());\n  EXPECT_EQ(a1, a2.begin());\n\n  const NativeArray<int> a3 = StlContainerView<tuple<int*, size_t> >::\n      Copy(make_tuple(static_cast<int*>(a1), 3));\n  ASSERT_EQ(3U, a3.size());\n  EXPECT_EQ(0, a3.begin()[0]);\n  EXPECT_EQ(1, a3.begin()[1]);\n  EXPECT_EQ(2, a3.begin()[2]);\n\n  // Makes sure a1 and a3 aren't aliases.\n  a1[0] = 3;\n  EXPECT_EQ(0, a3.begin()[0]);\n}\n\n}  // namespace\n}  // namespace internal\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock-matchers_test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file tests some commonly used argument matchers.\n\n#include \"gmock/gmock-matchers.h\"\n#include \"gmock/gmock-more-matchers.h\"\n\n#include <string.h>\n#include <time.h>\n#include <deque>\n#include <functional>\n#include <iostream>\n#include <iterator>\n#include <limits>\n#include <list>\n#include <map>\n#include <memory>\n#include <set>\n#include <sstream>\n#include <string>\n#include <utility>\n#include <vector>\n#include \"gmock/gmock.h\"\n#include \"gtest/gtest.h\"\n#include \"gtest/gtest-spi.h\"\n\n#if GTEST_HAS_STD_FORWARD_LIST_\n# include <forward_list>  // NOLINT\n#endif\n\n#if GTEST_LANG_CXX11\n# include <type_traits>\n#endif\n\nnamespace testing {\nnamespace gmock_matchers_test {\n\nusing std::greater;\nusing std::less;\nusing std::list;\nusing std::make_pair;\nusing std::map;\nusing std::multimap;\nusing std::multiset;\nusing std::ostream;\nusing std::pair;\nusing std::set;\nusing std::stringstream;\nusing std::vector;\nusing testing::A;\nusing testing::AllArgs;\nusing testing::AllOf;\nusing testing::An;\nusing testing::AnyOf;\nusing testing::ByRef;\nusing testing::ContainsRegex;\nusing testing::DoubleEq;\nusing testing::DoubleNear;\nusing testing::EndsWith;\nusing testing::Eq;\nusing testing::ExplainMatchResult;\nusing testing::Field;\nusing testing::FloatEq;\nusing testing::FloatNear;\nusing testing::Ge;\nusing testing::Gt;\nusing testing::HasSubstr;\nusing testing::IsEmpty;\nusing testing::IsNull;\nusing testing::Key;\nusing testing::Le;\nusing testing::Lt;\nusing testing::MakeMatcher;\nusing testing::MakePolymorphicMatcher;\nusing testing::MatchResultListener;\nusing testing::Matcher;\nusing testing::MatcherCast;\nusing testing::MatcherInterface;\nusing testing::Matches;\nusing testing::MatchesRegex;\nusing testing::NanSensitiveDoubleEq;\nusing testing::NanSensitiveDoubleNear;\nusing testing::NanSensitiveFloatEq;\nusing testing::NanSensitiveFloatNear;\nusing testing::Ne;\nusing testing::Not;\nusing testing::NotNull;\nusing testing::Pair;\nusing testing::Pointee;\nusing testing::Pointwise;\nusing testing::PolymorphicMatcher;\nusing testing::Property;\nusing testing::Ref;\nusing testing::ResultOf;\nusing testing::SizeIs;\nusing testing::StartsWith;\nusing testing::StrCaseEq;\nusing testing::StrCaseNe;\nusing testing::StrEq;\nusing testing::StrNe;\nusing testing::StringMatchResultListener;\nusing testing::Truly;\nusing testing::TypedEq;\nusing testing::UnorderedPointwise;\nusing testing::Value;\nusing testing::WhenSorted;\nusing testing::WhenSortedBy;\nusing testing::_;\nusing testing::get;\nusing testing::internal::DummyMatchResultListener;\nusing testing::internal::ElementMatcherPair;\nusing testing::internal::ElementMatcherPairs;\nusing testing::internal::ExplainMatchFailureTupleTo;\nusing testing::internal::FloatingEqMatcher;\nusing testing::internal::FormatMatcherDescription;\nusing testing::internal::IsReadableTypeName;\nusing testing::internal::linked_ptr;\nusing testing::internal::MatchMatrix;\nusing testing::internal::RE;\nusing testing::internal::scoped_ptr;\nusing testing::internal::StreamMatchResultListener;\nusing testing::internal::Strings;\nusing testing::internal::linked_ptr;\nusing testing::internal::scoped_ptr;\nusing testing::internal::string;\nusing testing::make_tuple;\nusing testing::tuple;\n\n// For testing ExplainMatchResultTo().\nclass GreaterThanMatcher : public MatcherInterface<int> {\n public:\n  explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {}\n\n  virtual void DescribeTo(ostream* os) const {\n    *os << \"is > \" << rhs_;\n  }\n\n  virtual bool MatchAndExplain(int lhs,\n                               MatchResultListener* listener) const {\n    const int diff = lhs - rhs_;\n    if (diff > 0) {\n      *listener << \"which is \" << diff << \" more than \" << rhs_;\n    } else if (diff == 0) {\n      *listener << \"which is the same as \" << rhs_;\n    } else {\n      *listener << \"which is \" << -diff << \" less than \" << rhs_;\n    }\n\n    return lhs > rhs_;\n  }\n\n private:\n  int rhs_;\n};\n\nMatcher<int> GreaterThan(int n) {\n  return MakeMatcher(new GreaterThanMatcher(n));\n}\n\nstd::string OfType(const std::string& type_name) {\n#if GTEST_HAS_RTTI\n  return \" (of type \" + type_name + \")\";\n#else\n  return \"\";\n#endif\n}\n\n// Returns the description of the given matcher.\ntemplate <typename T>\nstd::string Describe(const Matcher<T>& m) {\n  return DescribeMatcher<T>(m);\n}\n\n// Returns the description of the negation of the given matcher.\ntemplate <typename T>\nstd::string DescribeNegation(const Matcher<T>& m) {\n  return DescribeMatcher<T>(m, true);\n}\n\n// Returns the reason why x matches, or doesn't match, m.\ntemplate <typename MatcherType, typename Value>\nstd::string Explain(const MatcherType& m, const Value& x) {\n  StringMatchResultListener listener;\n  ExplainMatchResult(m, x, &listener);\n  return listener.str();\n}\n\nTEST(MonotonicMatcherTest, IsPrintable) {\n  stringstream ss;\n  ss << GreaterThan(5);\n  EXPECT_EQ(\"is > 5\", ss.str());\n}\n\nTEST(MatchResultListenerTest, StreamingWorks) {\n  StringMatchResultListener listener;\n  listener << \"hi\" << 5;\n  EXPECT_EQ(\"hi5\", listener.str());\n\n  listener.Clear();\n  EXPECT_EQ(\"\", listener.str());\n\n  listener << 42;\n  EXPECT_EQ(\"42\", listener.str());\n\n  // Streaming shouldn't crash when the underlying ostream is NULL.\n  DummyMatchResultListener dummy;\n  dummy << \"hi\" << 5;\n}\n\nTEST(MatchResultListenerTest, CanAccessUnderlyingStream) {\n  EXPECT_TRUE(DummyMatchResultListener().stream() == NULL);\n  EXPECT_TRUE(StreamMatchResultListener(NULL).stream() == NULL);\n\n  EXPECT_EQ(&std::cout, StreamMatchResultListener(&std::cout).stream());\n}\n\nTEST(MatchResultListenerTest, IsInterestedWorks) {\n  EXPECT_TRUE(StringMatchResultListener().IsInterested());\n  EXPECT_TRUE(StreamMatchResultListener(&std::cout).IsInterested());\n\n  EXPECT_FALSE(DummyMatchResultListener().IsInterested());\n  EXPECT_FALSE(StreamMatchResultListener(NULL).IsInterested());\n}\n\n// Makes sure that the MatcherInterface<T> interface doesn't\n// change.\nclass EvenMatcherImpl : public MatcherInterface<int> {\n public:\n  virtual bool MatchAndExplain(int x,\n                               MatchResultListener* /* listener */) const {\n    return x % 2 == 0;\n  }\n\n  virtual void DescribeTo(ostream* os) const {\n    *os << \"is an even number\";\n  }\n\n  // We deliberately don't define DescribeNegationTo() and\n  // ExplainMatchResultTo() here, to make sure the definition of these\n  // two methods is optional.\n};\n\n// Makes sure that the MatcherInterface API doesn't change.\nTEST(MatcherInterfaceTest, CanBeImplementedUsingPublishedAPI) {\n  EvenMatcherImpl m;\n}\n\n// Tests implementing a monomorphic matcher using MatchAndExplain().\n\nclass NewEvenMatcherImpl : public MatcherInterface<int> {\n public:\n  virtual bool MatchAndExplain(int x, MatchResultListener* listener) const {\n    const bool match = x % 2 == 0;\n    // Verifies that we can stream to a listener directly.\n    *listener << \"value % \" << 2;\n    if (listener->stream() != NULL) {\n      // Verifies that we can stream to a listener's underlying stream\n      // too.\n      *listener->stream() << \" == \" << (x % 2);\n    }\n    return match;\n  }\n\n  virtual void DescribeTo(ostream* os) const {\n    *os << \"is an even number\";\n  }\n};\n\nTEST(MatcherInterfaceTest, CanBeImplementedUsingNewAPI) {\n  Matcher<int> m = MakeMatcher(new NewEvenMatcherImpl);\n  EXPECT_TRUE(m.Matches(2));\n  EXPECT_FALSE(m.Matches(3));\n  EXPECT_EQ(\"value % 2 == 0\", Explain(m, 2));\n  EXPECT_EQ(\"value % 2 == 1\", Explain(m, 3));\n}\n\n// Tests default-constructing a matcher.\nTEST(MatcherTest, CanBeDefaultConstructed) {\n  Matcher<double> m;\n}\n\n// Tests that Matcher<T> can be constructed from a MatcherInterface<T>*.\nTEST(MatcherTest, CanBeConstructedFromMatcherInterface) {\n  const MatcherInterface<int>* impl = new EvenMatcherImpl;\n  Matcher<int> m(impl);\n  EXPECT_TRUE(m.Matches(4));\n  EXPECT_FALSE(m.Matches(5));\n}\n\n// Tests that value can be used in place of Eq(value).\nTEST(MatcherTest, CanBeImplicitlyConstructedFromValue) {\n  Matcher<int> m1 = 5;\n  EXPECT_TRUE(m1.Matches(5));\n  EXPECT_FALSE(m1.Matches(6));\n}\n\n// Tests that NULL can be used in place of Eq(NULL).\nTEST(MatcherTest, CanBeImplicitlyConstructedFromNULL) {\n  Matcher<int*> m1 = NULL;\n  EXPECT_TRUE(m1.Matches(NULL));\n  int n = 0;\n  EXPECT_FALSE(m1.Matches(&n));\n}\n\n// Tests that matchers can be constructed from a variable that is not properly\n// defined. This should be illegal, but many users rely on this accidentally.\nstruct Undefined {\n  virtual ~Undefined() = 0;\n  static const int kInt = 1;\n};\n\nTEST(MatcherTest, CanBeConstructedFromUndefinedVariable) {\n  Matcher<int> m1 = Undefined::kInt;\n  EXPECT_TRUE(m1.Matches(1));\n  EXPECT_FALSE(m1.Matches(2));\n}\n\n// Test that a matcher parameterized with an abstract class compiles.\nTEST(MatcherTest, CanAcceptAbstractClass) { Matcher<const Undefined&> m = _; }\n\n// Tests that matchers are copyable.\nTEST(MatcherTest, IsCopyable) {\n  // Tests the copy constructor.\n  Matcher<bool> m1 = Eq(false);\n  EXPECT_TRUE(m1.Matches(false));\n  EXPECT_FALSE(m1.Matches(true));\n\n  // Tests the assignment operator.\n  m1 = Eq(true);\n  EXPECT_TRUE(m1.Matches(true));\n  EXPECT_FALSE(m1.Matches(false));\n}\n\n// Tests that Matcher<T>::DescribeTo() calls\n// MatcherInterface<T>::DescribeTo().\nTEST(MatcherTest, CanDescribeItself) {\n  EXPECT_EQ(\"is an even number\",\n            Describe(Matcher<int>(new EvenMatcherImpl)));\n}\n\n// Tests Matcher<T>::MatchAndExplain().\nTEST(MatcherTest, MatchAndExplain) {\n  Matcher<int> m = GreaterThan(0);\n  StringMatchResultListener listener1;\n  EXPECT_TRUE(m.MatchAndExplain(42, &listener1));\n  EXPECT_EQ(\"which is 42 more than 0\", listener1.str());\n\n  StringMatchResultListener listener2;\n  EXPECT_FALSE(m.MatchAndExplain(-9, &listener2));\n  EXPECT_EQ(\"which is 9 less than 0\", listener2.str());\n}\n\n// Tests that a C-string literal can be implicitly converted to a\n// Matcher<std::string> or Matcher<const std::string&>.\nTEST(StringMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) {\n  Matcher<std::string> m1 = \"hi\";\n  EXPECT_TRUE(m1.Matches(\"hi\"));\n  EXPECT_FALSE(m1.Matches(\"hello\"));\n\n  Matcher<const std::string&> m2 = \"hi\";\n  EXPECT_TRUE(m2.Matches(\"hi\"));\n  EXPECT_FALSE(m2.Matches(\"hello\"));\n}\n\n// Tests that a string object can be implicitly converted to a\n// Matcher<std::string> or Matcher<const std::string&>.\nTEST(StringMatcherTest, CanBeImplicitlyConstructedFromString) {\n  Matcher<std::string> m1 = std::string(\"hi\");\n  EXPECT_TRUE(m1.Matches(\"hi\"));\n  EXPECT_FALSE(m1.Matches(\"hello\"));\n\n  Matcher<const std::string&> m2 = std::string(\"hi\");\n  EXPECT_TRUE(m2.Matches(\"hi\"));\n  EXPECT_FALSE(m2.Matches(\"hello\"));\n}\n\n#if GTEST_HAS_GLOBAL_STRING\n// Tests that a ::string object can be implicitly converted to a\n// Matcher<std::string> or Matcher<const std::string&>.\nTEST(StringMatcherTest, CanBeImplicitlyConstructedFromGlobalString) {\n  Matcher<std::string> m1 = ::string(\"hi\");\n  EXPECT_TRUE(m1.Matches(\"hi\"));\n  EXPECT_FALSE(m1.Matches(\"hello\"));\n\n  Matcher<const std::string&> m2 = ::string(\"hi\");\n  EXPECT_TRUE(m2.Matches(\"hi\"));\n  EXPECT_FALSE(m2.Matches(\"hello\"));\n}\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n#if GTEST_HAS_GLOBAL_STRING\n// Tests that a C-string literal can be implicitly converted to a\n// Matcher<::string> or Matcher<const ::string&>.\nTEST(GlobalStringMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) {\n  Matcher< ::string> m1 = \"hi\";\n  EXPECT_TRUE(m1.Matches(\"hi\"));\n  EXPECT_FALSE(m1.Matches(\"hello\"));\n\n  Matcher<const ::string&> m2 = \"hi\";\n  EXPECT_TRUE(m2.Matches(\"hi\"));\n  EXPECT_FALSE(m2.Matches(\"hello\"));\n}\n\n// Tests that a std::string object can be implicitly converted to a\n// Matcher<::string> or Matcher<const ::string&>.\nTEST(GlobalStringMatcherTest, CanBeImplicitlyConstructedFromString) {\n  Matcher< ::string> m1 = std::string(\"hi\");\n  EXPECT_TRUE(m1.Matches(\"hi\"));\n  EXPECT_FALSE(m1.Matches(\"hello\"));\n\n  Matcher<const ::string&> m2 = std::string(\"hi\");\n  EXPECT_TRUE(m2.Matches(\"hi\"));\n  EXPECT_FALSE(m2.Matches(\"hello\"));\n}\n\n// Tests that a ::string object can be implicitly converted to a\n// Matcher<::string> or Matcher<const ::string&>.\nTEST(GlobalStringMatcherTest, CanBeImplicitlyConstructedFromGlobalString) {\n  Matcher< ::string> m1 = ::string(\"hi\");\n  EXPECT_TRUE(m1.Matches(\"hi\"));\n  EXPECT_FALSE(m1.Matches(\"hello\"));\n\n  Matcher<const ::string&> m2 = ::string(\"hi\");\n  EXPECT_TRUE(m2.Matches(\"hi\"));\n  EXPECT_FALSE(m2.Matches(\"hello\"));\n}\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n#if GTEST_HAS_ABSL\n// Tests that a C-string literal can be implicitly converted to a\n// Matcher<absl::string_view> or Matcher<const absl::string_view&>.\nTEST(StringViewMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) {\n  Matcher<absl::string_view> m1 = \"cats\";\n  EXPECT_TRUE(m1.Matches(\"cats\"));\n  EXPECT_FALSE(m1.Matches(\"dogs\"));\n\n  Matcher<const absl::string_view&> m2 = \"cats\";\n  EXPECT_TRUE(m2.Matches(\"cats\"));\n  EXPECT_FALSE(m2.Matches(\"dogs\"));\n}\n\n// Tests that a std::string object can be implicitly converted to a\n// Matcher<absl::string_view> or Matcher<const absl::string_view&>.\nTEST(StringViewMatcherTest, CanBeImplicitlyConstructedFromString) {\n  Matcher<absl::string_view> m1 = std::string(\"cats\");\n  EXPECT_TRUE(m1.Matches(\"cats\"));\n  EXPECT_FALSE(m1.Matches(\"dogs\"));\n\n  Matcher<const absl::string_view&> m2 = std::string(\"cats\");\n  EXPECT_TRUE(m2.Matches(\"cats\"));\n  EXPECT_FALSE(m2.Matches(\"dogs\"));\n}\n\n#if GTEST_HAS_GLOBAL_STRING\n// Tests that a ::string object can be implicitly converted to a\n// Matcher<absl::string_view> or Matcher<const absl::string_view&>.\nTEST(StringViewMatcherTest, CanBeImplicitlyConstructedFromGlobalString) {\n  Matcher<absl::string_view> m1 = ::string(\"cats\");\n  EXPECT_TRUE(m1.Matches(\"cats\"));\n  EXPECT_FALSE(m1.Matches(\"dogs\"));\n\n  Matcher<const absl::string_view&> m2 = ::string(\"cats\");\n  EXPECT_TRUE(m2.Matches(\"cats\"));\n  EXPECT_FALSE(m2.Matches(\"dogs\"));\n}\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n// Tests that a absl::string_view object can be implicitly converted to a\n// Matcher<absl::string_view> or Matcher<const absl::string_view&>.\nTEST(StringViewMatcherTest, CanBeImplicitlyConstructedFromStringView) {\n  Matcher<absl::string_view> m1 = absl::string_view(\"cats\");\n  EXPECT_TRUE(m1.Matches(\"cats\"));\n  EXPECT_FALSE(m1.Matches(\"dogs\"));\n\n  Matcher<const absl::string_view&> m2 = absl::string_view(\"cats\");\n  EXPECT_TRUE(m2.Matches(\"cats\"));\n  EXPECT_FALSE(m2.Matches(\"dogs\"));\n}\n#endif  // GTEST_HAS_ABSL\n\n// Tests that MakeMatcher() constructs a Matcher<T> from a\n// MatcherInterface* without requiring the user to explicitly\n// write the type.\nTEST(MakeMatcherTest, ConstructsMatcherFromMatcherInterface) {\n  const MatcherInterface<int>* dummy_impl = NULL;\n  Matcher<int> m = MakeMatcher(dummy_impl);\n}\n\n// Tests that MakePolymorphicMatcher() can construct a polymorphic\n// matcher from its implementation using the old API.\nconst int g_bar = 1;\nclass ReferencesBarOrIsZeroImpl {\n public:\n  template <typename T>\n  bool MatchAndExplain(const T& x,\n                       MatchResultListener* /* listener */) const {\n    const void* p = &x;\n    return p == &g_bar || x == 0;\n  }\n\n  void DescribeTo(ostream* os) const { *os << \"g_bar or zero\"; }\n\n  void DescribeNegationTo(ostream* os) const {\n    *os << \"doesn't reference g_bar and is not zero\";\n  }\n};\n\n// This function verifies that MakePolymorphicMatcher() returns a\n// PolymorphicMatcher<T> where T is the argument's type.\nPolymorphicMatcher<ReferencesBarOrIsZeroImpl> ReferencesBarOrIsZero() {\n  return MakePolymorphicMatcher(ReferencesBarOrIsZeroImpl());\n}\n\nTEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingOldAPI) {\n  // Using a polymorphic matcher to match a reference type.\n  Matcher<const int&> m1 = ReferencesBarOrIsZero();\n  EXPECT_TRUE(m1.Matches(0));\n  // Verifies that the identity of a by-reference argument is preserved.\n  EXPECT_TRUE(m1.Matches(g_bar));\n  EXPECT_FALSE(m1.Matches(1));\n  EXPECT_EQ(\"g_bar or zero\", Describe(m1));\n\n  // Using a polymorphic matcher to match a value type.\n  Matcher<double> m2 = ReferencesBarOrIsZero();\n  EXPECT_TRUE(m2.Matches(0.0));\n  EXPECT_FALSE(m2.Matches(0.1));\n  EXPECT_EQ(\"g_bar or zero\", Describe(m2));\n}\n\n// Tests implementing a polymorphic matcher using MatchAndExplain().\n\nclass PolymorphicIsEvenImpl {\n public:\n  void DescribeTo(ostream* os) const { *os << \"is even\"; }\n\n  void DescribeNegationTo(ostream* os) const {\n    *os << \"is odd\";\n  }\n\n  template <typename T>\n  bool MatchAndExplain(const T& x, MatchResultListener* listener) const {\n    // Verifies that we can stream to the listener directly.\n    *listener << \"% \" << 2;\n    if (listener->stream() != NULL) {\n      // Verifies that we can stream to the listener's underlying stream\n      // too.\n      *listener->stream() << \" == \" << (x % 2);\n    }\n    return (x % 2) == 0;\n  }\n};\n\nPolymorphicMatcher<PolymorphicIsEvenImpl> PolymorphicIsEven() {\n  return MakePolymorphicMatcher(PolymorphicIsEvenImpl());\n}\n\nTEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingNewAPI) {\n  // Using PolymorphicIsEven() as a Matcher<int>.\n  const Matcher<int> m1 = PolymorphicIsEven();\n  EXPECT_TRUE(m1.Matches(42));\n  EXPECT_FALSE(m1.Matches(43));\n  EXPECT_EQ(\"is even\", Describe(m1));\n\n  const Matcher<int> not_m1 = Not(m1);\n  EXPECT_EQ(\"is odd\", Describe(not_m1));\n\n  EXPECT_EQ(\"% 2 == 0\", Explain(m1, 42));\n\n  // Using PolymorphicIsEven() as a Matcher<char>.\n  const Matcher<char> m2 = PolymorphicIsEven();\n  EXPECT_TRUE(m2.Matches('\\x42'));\n  EXPECT_FALSE(m2.Matches('\\x43'));\n  EXPECT_EQ(\"is even\", Describe(m2));\n\n  const Matcher<char> not_m2 = Not(m2);\n  EXPECT_EQ(\"is odd\", Describe(not_m2));\n\n  EXPECT_EQ(\"% 2 == 0\", Explain(m2, '\\x42'));\n}\n\n// Tests that MatcherCast<T>(m) works when m is a polymorphic matcher.\nTEST(MatcherCastTest, FromPolymorphicMatcher) {\n  Matcher<int> m = MatcherCast<int>(Eq(5));\n  EXPECT_TRUE(m.Matches(5));\n  EXPECT_FALSE(m.Matches(6));\n}\n\n// For testing casting matchers between compatible types.\nclass IntValue {\n public:\n  // An int can be statically (although not implicitly) cast to a\n  // IntValue.\n  explicit IntValue(int a_value) : value_(a_value) {}\n\n  int value() const { return value_; }\n private:\n  int value_;\n};\n\n// For testing casting matchers between compatible types.\nbool IsPositiveIntValue(const IntValue& foo) {\n  return foo.value() > 0;\n}\n\n// Tests that MatcherCast<T>(m) works when m is a Matcher<U> where T\n// can be statically converted to U.\nTEST(MatcherCastTest, FromCompatibleType) {\n  Matcher<double> m1 = Eq(2.0);\n  Matcher<int> m2 = MatcherCast<int>(m1);\n  EXPECT_TRUE(m2.Matches(2));\n  EXPECT_FALSE(m2.Matches(3));\n\n  Matcher<IntValue> m3 = Truly(IsPositiveIntValue);\n  Matcher<int> m4 = MatcherCast<int>(m3);\n  // In the following, the arguments 1 and 0 are statically converted\n  // to IntValue objects, and then tested by the IsPositiveIntValue()\n  // predicate.\n  EXPECT_TRUE(m4.Matches(1));\n  EXPECT_FALSE(m4.Matches(0));\n}\n\n// Tests that MatcherCast<T>(m) works when m is a Matcher<const T&>.\nTEST(MatcherCastTest, FromConstReferenceToNonReference) {\n  Matcher<const int&> m1 = Eq(0);\n  Matcher<int> m2 = MatcherCast<int>(m1);\n  EXPECT_TRUE(m2.Matches(0));\n  EXPECT_FALSE(m2.Matches(1));\n}\n\n// Tests that MatcherCast<T>(m) works when m is a Matcher<T&>.\nTEST(MatcherCastTest, FromReferenceToNonReference) {\n  Matcher<int&> m1 = Eq(0);\n  Matcher<int> m2 = MatcherCast<int>(m1);\n  EXPECT_TRUE(m2.Matches(0));\n  EXPECT_FALSE(m2.Matches(1));\n}\n\n// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>.\nTEST(MatcherCastTest, FromNonReferenceToConstReference) {\n  Matcher<int> m1 = Eq(0);\n  Matcher<const int&> m2 = MatcherCast<const int&>(m1);\n  EXPECT_TRUE(m2.Matches(0));\n  EXPECT_FALSE(m2.Matches(1));\n}\n\n// Tests that MatcherCast<T&>(m) works when m is a Matcher<T>.\nTEST(MatcherCastTest, FromNonReferenceToReference) {\n  Matcher<int> m1 = Eq(0);\n  Matcher<int&> m2 = MatcherCast<int&>(m1);\n  int n = 0;\n  EXPECT_TRUE(m2.Matches(n));\n  n = 1;\n  EXPECT_FALSE(m2.Matches(n));\n}\n\n// Tests that MatcherCast<T>(m) works when m is a Matcher<T>.\nTEST(MatcherCastTest, FromSameType) {\n  Matcher<int> m1 = Eq(0);\n  Matcher<int> m2 = MatcherCast<int>(m1);\n  EXPECT_TRUE(m2.Matches(0));\n  EXPECT_FALSE(m2.Matches(1));\n}\n\n// Tests that MatcherCast<T>(m) works when m is a value of the same type as the\n// value type of the Matcher.\nTEST(MatcherCastTest, FromAValue) {\n  Matcher<int> m = MatcherCast<int>(42);\n  EXPECT_TRUE(m.Matches(42));\n  EXPECT_FALSE(m.Matches(239));\n}\n\n// Tests that MatcherCast<T>(m) works when m is a value of the type implicitly\n// convertible to the value type of the Matcher.\nTEST(MatcherCastTest, FromAnImplicitlyConvertibleValue) {\n  const int kExpected = 'c';\n  Matcher<int> m = MatcherCast<int>('c');\n  EXPECT_TRUE(m.Matches(kExpected));\n  EXPECT_FALSE(m.Matches(kExpected + 1));\n}\n\nstruct NonImplicitlyConstructibleTypeWithOperatorEq {\n  friend bool operator==(\n      const NonImplicitlyConstructibleTypeWithOperatorEq& /* ignored */,\n      int rhs) {\n    return 42 == rhs;\n  }\n  friend bool operator==(\n      int lhs,\n      const NonImplicitlyConstructibleTypeWithOperatorEq& /* ignored */) {\n    return lhs == 42;\n  }\n};\n\n// Tests that MatcherCast<T>(m) works when m is a neither a matcher nor\n// implicitly convertible to the value type of the Matcher, but the value type\n// of the matcher has operator==() overload accepting m.\nTEST(MatcherCastTest, NonImplicitlyConstructibleTypeWithOperatorEq) {\n  Matcher<NonImplicitlyConstructibleTypeWithOperatorEq> m1 =\n      MatcherCast<NonImplicitlyConstructibleTypeWithOperatorEq>(42);\n  EXPECT_TRUE(m1.Matches(NonImplicitlyConstructibleTypeWithOperatorEq()));\n\n  Matcher<NonImplicitlyConstructibleTypeWithOperatorEq> m2 =\n      MatcherCast<NonImplicitlyConstructibleTypeWithOperatorEq>(239);\n  EXPECT_FALSE(m2.Matches(NonImplicitlyConstructibleTypeWithOperatorEq()));\n\n  // When updating the following lines please also change the comment to\n  // namespace convertible_from_any.\n  Matcher<int> m3 =\n      MatcherCast<int>(NonImplicitlyConstructibleTypeWithOperatorEq());\n  EXPECT_TRUE(m3.Matches(42));\n  EXPECT_FALSE(m3.Matches(239));\n}\n\n// ConvertibleFromAny does not work with MSVC. resulting in\n// error C2440: 'initializing': cannot convert from 'Eq' to 'M'\n// No constructor could take the source type, or constructor overload\n// resolution was ambiguous\n\n#if !defined _MSC_VER\n\n// The below ConvertibleFromAny struct is implicitly constructible from anything\n// and when in the same namespace can interact with other tests. In particular,\n// if it is in the same namespace as other tests and one removes\n//   NonImplicitlyConstructibleTypeWithOperatorEq::operator==(int lhs, ...);\n// then the corresponding test still compiles (and it should not!) by implicitly\n// converting NonImplicitlyConstructibleTypeWithOperatorEq to ConvertibleFromAny\n// in m3.Matcher().\nnamespace convertible_from_any {\n// Implicitly convertible from any type.\nstruct ConvertibleFromAny {\n  ConvertibleFromAny(int a_value) : value(a_value) {}\n  template <typename T>\n  ConvertibleFromAny(const T& /*a_value*/) : value(-1) {\n    ADD_FAILURE() << \"Conversion constructor called\";\n  }\n  int value;\n};\n\nbool operator==(const ConvertibleFromAny& a, const ConvertibleFromAny& b) {\n  return a.value == b.value;\n}\n\nostream& operator<<(ostream& os, const ConvertibleFromAny& a) {\n  return os << a.value;\n}\n\nTEST(MatcherCastTest, ConversionConstructorIsUsed) {\n  Matcher<ConvertibleFromAny> m = MatcherCast<ConvertibleFromAny>(1);\n  EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));\n  EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));\n}\n\nTEST(MatcherCastTest, FromConvertibleFromAny) {\n  Matcher<ConvertibleFromAny> m =\n      MatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1)));\n  EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));\n  EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));\n}\n}  // namespace convertible_from_any\n\n#endif  // !defined _MSC_VER\n\nstruct IntReferenceWrapper {\n  IntReferenceWrapper(const int& a_value) : value(&a_value) {}\n  const int* value;\n};\n\nbool operator==(const IntReferenceWrapper& a, const IntReferenceWrapper& b) {\n  return a.value == b.value;\n}\n\nTEST(MatcherCastTest, ValueIsNotCopied) {\n  int n = 42;\n  Matcher<IntReferenceWrapper> m = MatcherCast<IntReferenceWrapper>(n);\n  // Verify that the matcher holds a reference to n, not to its temporary copy.\n  EXPECT_TRUE(m.Matches(n));\n}\n\nclass Base {\n public:\n  virtual ~Base() {}\n  Base() {}\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Base);\n};\n\nclass Derived : public Base {\n public:\n  Derived() : Base() {}\n  int i;\n};\n\nclass OtherDerived : public Base {};\n\n// Tests that SafeMatcherCast<T>(m) works when m is a polymorphic matcher.\nTEST(SafeMatcherCastTest, FromPolymorphicMatcher) {\n  Matcher<char> m2 = SafeMatcherCast<char>(Eq(32));\n  EXPECT_TRUE(m2.Matches(' '));\n  EXPECT_FALSE(m2.Matches('\\n'));\n}\n\n// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where\n// T and U are arithmetic types and T can be losslessly converted to\n// U.\nTEST(SafeMatcherCastTest, FromLosslesslyConvertibleArithmeticType) {\n  Matcher<double> m1 = DoubleEq(1.0);\n  Matcher<float> m2 = SafeMatcherCast<float>(m1);\n  EXPECT_TRUE(m2.Matches(1.0f));\n  EXPECT_FALSE(m2.Matches(2.0f));\n\n  Matcher<char> m3 = SafeMatcherCast<char>(TypedEq<int>('a'));\n  EXPECT_TRUE(m3.Matches('a'));\n  EXPECT_FALSE(m3.Matches('b'));\n}\n\n// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where T and U\n// are pointers or references to a derived and a base class, correspondingly.\nTEST(SafeMatcherCastTest, FromBaseClass) {\n  Derived d, d2;\n  Matcher<Base*> m1 = Eq(&d);\n  Matcher<Derived*> m2 = SafeMatcherCast<Derived*>(m1);\n  EXPECT_TRUE(m2.Matches(&d));\n  EXPECT_FALSE(m2.Matches(&d2));\n\n  Matcher<Base&> m3 = Ref(d);\n  Matcher<Derived&> m4 = SafeMatcherCast<Derived&>(m3);\n  EXPECT_TRUE(m4.Matches(d));\n  EXPECT_FALSE(m4.Matches(d2));\n}\n\n// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<const T&>.\nTEST(SafeMatcherCastTest, FromConstReferenceToReference) {\n  int n = 0;\n  Matcher<const int&> m1 = Ref(n);\n  Matcher<int&> m2 = SafeMatcherCast<int&>(m1);\n  int n1 = 0;\n  EXPECT_TRUE(m2.Matches(n));\n  EXPECT_FALSE(m2.Matches(n1));\n}\n\n// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>.\nTEST(SafeMatcherCastTest, FromNonReferenceToConstReference) {\n  Matcher<int> m1 = Eq(0);\n  Matcher<const int&> m2 = SafeMatcherCast<const int&>(m1);\n  EXPECT_TRUE(m2.Matches(0));\n  EXPECT_FALSE(m2.Matches(1));\n}\n\n// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<T>.\nTEST(SafeMatcherCastTest, FromNonReferenceToReference) {\n  Matcher<int> m1 = Eq(0);\n  Matcher<int&> m2 = SafeMatcherCast<int&>(m1);\n  int n = 0;\n  EXPECT_TRUE(m2.Matches(n));\n  n = 1;\n  EXPECT_FALSE(m2.Matches(n));\n}\n\n// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<T>.\nTEST(SafeMatcherCastTest, FromSameType) {\n  Matcher<int> m1 = Eq(0);\n  Matcher<int> m2 = SafeMatcherCast<int>(m1);\n  EXPECT_TRUE(m2.Matches(0));\n  EXPECT_FALSE(m2.Matches(1));\n}\n\n#if !defined _MSC_VER\n\nnamespace convertible_from_any {\nTEST(SafeMatcherCastTest, ConversionConstructorIsUsed) {\n  Matcher<ConvertibleFromAny> m = SafeMatcherCast<ConvertibleFromAny>(1);\n  EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));\n  EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));\n}\n\nTEST(SafeMatcherCastTest, FromConvertibleFromAny) {\n  Matcher<ConvertibleFromAny> m =\n      SafeMatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1)));\n  EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));\n  EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));\n}\n}  // namespace convertible_from_any\n\n#endif  // !defined _MSC_VER\n\nTEST(SafeMatcherCastTest, ValueIsNotCopied) {\n  int n = 42;\n  Matcher<IntReferenceWrapper> m = SafeMatcherCast<IntReferenceWrapper>(n);\n  // Verify that the matcher holds a reference to n, not to its temporary copy.\n  EXPECT_TRUE(m.Matches(n));\n}\n\nTEST(ExpectThat, TakesLiterals) {\n  EXPECT_THAT(1, 1);\n  EXPECT_THAT(1.0, 1.0);\n  EXPECT_THAT(std::string(), \"\");\n}\n\nTEST(ExpectThat, TakesFunctions) {\n  struct Helper {\n    static void Func() {}\n  };\n  void (*func)() = Helper::Func;\n  EXPECT_THAT(func, Helper::Func);\n  EXPECT_THAT(func, &Helper::Func);\n}\n\n// Tests that A<T>() matches any value of type T.\nTEST(ATest, MatchesAnyValue) {\n  // Tests a matcher for a value type.\n  Matcher<double> m1 = A<double>();\n  EXPECT_TRUE(m1.Matches(91.43));\n  EXPECT_TRUE(m1.Matches(-15.32));\n\n  // Tests a matcher for a reference type.\n  int a = 2;\n  int b = -6;\n  Matcher<int&> m2 = A<int&>();\n  EXPECT_TRUE(m2.Matches(a));\n  EXPECT_TRUE(m2.Matches(b));\n}\n\nTEST(ATest, WorksForDerivedClass) {\n  Base base;\n  Derived derived;\n  EXPECT_THAT(&base, A<Base*>());\n  // This shouldn't compile: EXPECT_THAT(&base, A<Derived*>());\n  EXPECT_THAT(&derived, A<Base*>());\n  EXPECT_THAT(&derived, A<Derived*>());\n}\n\n// Tests that A<T>() describes itself properly.\nTEST(ATest, CanDescribeSelf) {\n  EXPECT_EQ(\"is anything\", Describe(A<bool>()));\n}\n\n// Tests that An<T>() matches any value of type T.\nTEST(AnTest, MatchesAnyValue) {\n  // Tests a matcher for a value type.\n  Matcher<int> m1 = An<int>();\n  EXPECT_TRUE(m1.Matches(9143));\n  EXPECT_TRUE(m1.Matches(-1532));\n\n  // Tests a matcher for a reference type.\n  int a = 2;\n  int b = -6;\n  Matcher<int&> m2 = An<int&>();\n  EXPECT_TRUE(m2.Matches(a));\n  EXPECT_TRUE(m2.Matches(b));\n}\n\n// Tests that An<T>() describes itself properly.\nTEST(AnTest, CanDescribeSelf) {\n  EXPECT_EQ(\"is anything\", Describe(An<int>()));\n}\n\n// Tests that _ can be used as a matcher for any type and matches any\n// value of that type.\nTEST(UnderscoreTest, MatchesAnyValue) {\n  // Uses _ as a matcher for a value type.\n  Matcher<int> m1 = _;\n  EXPECT_TRUE(m1.Matches(123));\n  EXPECT_TRUE(m1.Matches(-242));\n\n  // Uses _ as a matcher for a reference type.\n  bool a = false;\n  const bool b = true;\n  Matcher<const bool&> m2 = _;\n  EXPECT_TRUE(m2.Matches(a));\n  EXPECT_TRUE(m2.Matches(b));\n}\n\n// Tests that _ describes itself properly.\nTEST(UnderscoreTest, CanDescribeSelf) {\n  Matcher<int> m = _;\n  EXPECT_EQ(\"is anything\", Describe(m));\n}\n\n// Tests that Eq(x) matches any value equal to x.\nTEST(EqTest, MatchesEqualValue) {\n  // 2 C-strings with same content but different addresses.\n  const char a1[] = \"hi\";\n  const char a2[] = \"hi\";\n\n  Matcher<const char*> m1 = Eq(a1);\n  EXPECT_TRUE(m1.Matches(a1));\n  EXPECT_FALSE(m1.Matches(a2));\n}\n\n// Tests that Eq(v) describes itself properly.\n\nclass Unprintable {\n public:\n  Unprintable() : c_('a') {}\n\n  bool operator==(const Unprintable& /* rhs */) const { return true; }\n private:\n  char c_;\n};\n\nTEST(EqTest, CanDescribeSelf) {\n  Matcher<Unprintable> m = Eq(Unprintable());\n  EXPECT_EQ(\"is equal to 1-byte object <61>\", Describe(m));\n}\n\n// Tests that Eq(v) can be used to match any type that supports\n// comparing with type T, where T is v's type.\nTEST(EqTest, IsPolymorphic) {\n  Matcher<int> m1 = Eq(1);\n  EXPECT_TRUE(m1.Matches(1));\n  EXPECT_FALSE(m1.Matches(2));\n\n  Matcher<char> m2 = Eq(1);\n  EXPECT_TRUE(m2.Matches('\\1'));\n  EXPECT_FALSE(m2.Matches('a'));\n}\n\n// Tests that TypedEq<T>(v) matches values of type T that's equal to v.\nTEST(TypedEqTest, ChecksEqualityForGivenType) {\n  Matcher<char> m1 = TypedEq<char>('a');\n  EXPECT_TRUE(m1.Matches('a'));\n  EXPECT_FALSE(m1.Matches('b'));\n\n  Matcher<int> m2 = TypedEq<int>(6);\n  EXPECT_TRUE(m2.Matches(6));\n  EXPECT_FALSE(m2.Matches(7));\n}\n\n// Tests that TypedEq(v) describes itself properly.\nTEST(TypedEqTest, CanDescribeSelf) {\n  EXPECT_EQ(\"is equal to 2\", Describe(TypedEq<int>(2)));\n}\n\n// Tests that TypedEq<T>(v) has type Matcher<T>.\n\n// Type<T>::IsTypeOf(v) compiles iff the type of value v is T, where T\n// is a \"bare\" type (i.e. not in the form of const U or U&).  If v's\n// type is not T, the compiler will generate a message about\n// \"undefined reference\".\ntemplate <typename T>\nstruct Type {\n  static bool IsTypeOf(const T& /* v */) { return true; }\n\n  template <typename T2>\n  static void IsTypeOf(T2 v);\n};\n\nTEST(TypedEqTest, HasSpecifiedType) {\n  // Verfies that the type of TypedEq<T>(v) is Matcher<T>.\n  Type<Matcher<int> >::IsTypeOf(TypedEq<int>(5));\n  Type<Matcher<double> >::IsTypeOf(TypedEq<double>(5));\n}\n\n// Tests that Ge(v) matches anything >= v.\nTEST(GeTest, ImplementsGreaterThanOrEqual) {\n  Matcher<int> m1 = Ge(0);\n  EXPECT_TRUE(m1.Matches(1));\n  EXPECT_TRUE(m1.Matches(0));\n  EXPECT_FALSE(m1.Matches(-1));\n}\n\n// Tests that Ge(v) describes itself properly.\nTEST(GeTest, CanDescribeSelf) {\n  Matcher<int> m = Ge(5);\n  EXPECT_EQ(\"is >= 5\", Describe(m));\n}\n\n// Tests that Gt(v) matches anything > v.\nTEST(GtTest, ImplementsGreaterThan) {\n  Matcher<double> m1 = Gt(0);\n  EXPECT_TRUE(m1.Matches(1.0));\n  EXPECT_FALSE(m1.Matches(0.0));\n  EXPECT_FALSE(m1.Matches(-1.0));\n}\n\n// Tests that Gt(v) describes itself properly.\nTEST(GtTest, CanDescribeSelf) {\n  Matcher<int> m = Gt(5);\n  EXPECT_EQ(\"is > 5\", Describe(m));\n}\n\n// Tests that Le(v) matches anything <= v.\nTEST(LeTest, ImplementsLessThanOrEqual) {\n  Matcher<char> m1 = Le('b');\n  EXPECT_TRUE(m1.Matches('a'));\n  EXPECT_TRUE(m1.Matches('b'));\n  EXPECT_FALSE(m1.Matches('c'));\n}\n\n// Tests that Le(v) describes itself properly.\nTEST(LeTest, CanDescribeSelf) {\n  Matcher<int> m = Le(5);\n  EXPECT_EQ(\"is <= 5\", Describe(m));\n}\n\n// Tests that Lt(v) matches anything < v.\nTEST(LtTest, ImplementsLessThan) {\n  Matcher<const std::string&> m1 = Lt(\"Hello\");\n  EXPECT_TRUE(m1.Matches(\"Abc\"));\n  EXPECT_FALSE(m1.Matches(\"Hello\"));\n  EXPECT_FALSE(m1.Matches(\"Hello, world!\"));\n}\n\n// Tests that Lt(v) describes itself properly.\nTEST(LtTest, CanDescribeSelf) {\n  Matcher<int> m = Lt(5);\n  EXPECT_EQ(\"is < 5\", Describe(m));\n}\n\n// Tests that Ne(v) matches anything != v.\nTEST(NeTest, ImplementsNotEqual) {\n  Matcher<int> m1 = Ne(0);\n  EXPECT_TRUE(m1.Matches(1));\n  EXPECT_TRUE(m1.Matches(-1));\n  EXPECT_FALSE(m1.Matches(0));\n}\n\n// Tests that Ne(v) describes itself properly.\nTEST(NeTest, CanDescribeSelf) {\n  Matcher<int> m = Ne(5);\n  EXPECT_EQ(\"isn't equal to 5\", Describe(m));\n}\n\n// Tests that IsNull() matches any NULL pointer of any type.\nTEST(IsNullTest, MatchesNullPointer) {\n  Matcher<int*> m1 = IsNull();\n  int* p1 = NULL;\n  int n = 0;\n  EXPECT_TRUE(m1.Matches(p1));\n  EXPECT_FALSE(m1.Matches(&n));\n\n  Matcher<const char*> m2 = IsNull();\n  const char* p2 = NULL;\n  EXPECT_TRUE(m2.Matches(p2));\n  EXPECT_FALSE(m2.Matches(\"hi\"));\n\n#if !GTEST_OS_SYMBIAN\n  // Nokia's Symbian compiler generates:\n  // gmock-matchers.h: ambiguous access to overloaded function\n  // gmock-matchers.h: 'testing::Matcher<void *>::Matcher(void *)'\n  // gmock-matchers.h: 'testing::Matcher<void *>::Matcher(const testing::\n  //     MatcherInterface<void *> *)'\n  // gmock-matchers.h:  (point of instantiation: 'testing::\n  //     gmock_matchers_test::IsNullTest_MatchesNullPointer_Test::TestBody()')\n  // gmock-matchers.h:   (instantiating: 'testing::PolymorphicMatc\n  Matcher<void*> m3 = IsNull();\n  void* p3 = NULL;\n  EXPECT_TRUE(m3.Matches(p3));\n  EXPECT_FALSE(m3.Matches(reinterpret_cast<void*>(0xbeef)));\n#endif\n}\n\nTEST(IsNullTest, LinkedPtr) {\n  const Matcher<linked_ptr<int> > m = IsNull();\n  const linked_ptr<int> null_p;\n  const linked_ptr<int> non_null_p(new int);\n\n  EXPECT_TRUE(m.Matches(null_p));\n  EXPECT_FALSE(m.Matches(non_null_p));\n}\n\nTEST(IsNullTest, ReferenceToConstLinkedPtr) {\n  const Matcher<const linked_ptr<double>&> m = IsNull();\n  const linked_ptr<double> null_p;\n  const linked_ptr<double> non_null_p(new double);\n\n  EXPECT_TRUE(m.Matches(null_p));\n  EXPECT_FALSE(m.Matches(non_null_p));\n}\n\n#if GTEST_LANG_CXX11\nTEST(IsNullTest, StdFunction) {\n  const Matcher<std::function<void()>> m = IsNull();\n\n  EXPECT_TRUE(m.Matches(std::function<void()>()));\n  EXPECT_FALSE(m.Matches([]{}));\n}\n#endif  // GTEST_LANG_CXX11\n\n// Tests that IsNull() describes itself properly.\nTEST(IsNullTest, CanDescribeSelf) {\n  Matcher<int*> m = IsNull();\n  EXPECT_EQ(\"is NULL\", Describe(m));\n  EXPECT_EQ(\"isn't NULL\", DescribeNegation(m));\n}\n\n// Tests that NotNull() matches any non-NULL pointer of any type.\nTEST(NotNullTest, MatchesNonNullPointer) {\n  Matcher<int*> m1 = NotNull();\n  int* p1 = NULL;\n  int n = 0;\n  EXPECT_FALSE(m1.Matches(p1));\n  EXPECT_TRUE(m1.Matches(&n));\n\n  Matcher<const char*> m2 = NotNull();\n  const char* p2 = NULL;\n  EXPECT_FALSE(m2.Matches(p2));\n  EXPECT_TRUE(m2.Matches(\"hi\"));\n}\n\nTEST(NotNullTest, LinkedPtr) {\n  const Matcher<linked_ptr<int> > m = NotNull();\n  const linked_ptr<int> null_p;\n  const linked_ptr<int> non_null_p(new int);\n\n  EXPECT_FALSE(m.Matches(null_p));\n  EXPECT_TRUE(m.Matches(non_null_p));\n}\n\nTEST(NotNullTest, ReferenceToConstLinkedPtr) {\n  const Matcher<const linked_ptr<double>&> m = NotNull();\n  const linked_ptr<double> null_p;\n  const linked_ptr<double> non_null_p(new double);\n\n  EXPECT_FALSE(m.Matches(null_p));\n  EXPECT_TRUE(m.Matches(non_null_p));\n}\n\n#if GTEST_LANG_CXX11\nTEST(NotNullTest, StdFunction) {\n  const Matcher<std::function<void()>> m = NotNull();\n\n  EXPECT_TRUE(m.Matches([]{}));\n  EXPECT_FALSE(m.Matches(std::function<void()>()));\n}\n#endif  // GTEST_LANG_CXX11\n\n// Tests that NotNull() describes itself properly.\nTEST(NotNullTest, CanDescribeSelf) {\n  Matcher<int*> m = NotNull();\n  EXPECT_EQ(\"isn't NULL\", Describe(m));\n}\n\n// Tests that Ref(variable) matches an argument that references\n// 'variable'.\nTEST(RefTest, MatchesSameVariable) {\n  int a = 0;\n  int b = 0;\n  Matcher<int&> m = Ref(a);\n  EXPECT_TRUE(m.Matches(a));\n  EXPECT_FALSE(m.Matches(b));\n}\n\n// Tests that Ref(variable) describes itself properly.\nTEST(RefTest, CanDescribeSelf) {\n  int n = 5;\n  Matcher<int&> m = Ref(n);\n  stringstream ss;\n  ss << \"references the variable @\" << &n << \" 5\";\n  EXPECT_EQ(ss.str(), Describe(m));\n}\n\n// Test that Ref(non_const_varialbe) can be used as a matcher for a\n// const reference.\nTEST(RefTest, CanBeUsedAsMatcherForConstReference) {\n  int a = 0;\n  int b = 0;\n  Matcher<const int&> m = Ref(a);\n  EXPECT_TRUE(m.Matches(a));\n  EXPECT_FALSE(m.Matches(b));\n}\n\n// Tests that Ref(variable) is covariant, i.e. Ref(derived) can be\n// used wherever Ref(base) can be used (Ref(derived) is a sub-type\n// of Ref(base), but not vice versa.\n\nTEST(RefTest, IsCovariant) {\n  Base base, base2;\n  Derived derived;\n  Matcher<const Base&> m1 = Ref(base);\n  EXPECT_TRUE(m1.Matches(base));\n  EXPECT_FALSE(m1.Matches(base2));\n  EXPECT_FALSE(m1.Matches(derived));\n\n  m1 = Ref(derived);\n  EXPECT_TRUE(m1.Matches(derived));\n  EXPECT_FALSE(m1.Matches(base));\n  EXPECT_FALSE(m1.Matches(base2));\n}\n\nTEST(RefTest, ExplainsResult) {\n  int n = 0;\n  EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), n),\n              StartsWith(\"which is located @\"));\n\n  int m = 0;\n  EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), m),\n              StartsWith(\"which is located @\"));\n}\n\n// Tests string comparison matchers.\n\nTEST(StrEqTest, MatchesEqualString) {\n  Matcher<const char*> m = StrEq(std::string(\"Hello\"));\n  EXPECT_TRUE(m.Matches(\"Hello\"));\n  EXPECT_FALSE(m.Matches(\"hello\"));\n  EXPECT_FALSE(m.Matches(NULL));\n\n  Matcher<const std::string&> m2 = StrEq(\"Hello\");\n  EXPECT_TRUE(m2.Matches(\"Hello\"));\n  EXPECT_FALSE(m2.Matches(\"Hi\"));\n\n#if GTEST_HAS_ABSL\n  Matcher<const absl::string_view&> m3 = StrEq(\"Hello\");\n  EXPECT_TRUE(m3.Matches(absl::string_view(\"Hello\")));\n  EXPECT_FALSE(m3.Matches(absl::string_view(\"hello\")));\n  EXPECT_FALSE(m3.Matches(absl::string_view()));\n#endif  // GTEST_HAS_ABSL\n}\n\nTEST(StrEqTest, CanDescribeSelf) {\n  Matcher<std::string> m = StrEq(\"Hi-\\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\\xD3\");\n  EXPECT_EQ(\"is equal to \\\"Hi-\\'\\\\\\\"?\\\\\\\\\\\\a\\\\b\\\\f\\\\n\\\\r\\\\t\\\\v\\\\xD3\\\"\",\n      Describe(m));\n\n  std::string str(\"01204500800\");\n  str[3] = '\\0';\n  Matcher<std::string> m2 = StrEq(str);\n  EXPECT_EQ(\"is equal to \\\"012\\\\04500800\\\"\", Describe(m2));\n  str[0] = str[6] = str[7] = str[9] = str[10] = '\\0';\n  Matcher<std::string> m3 = StrEq(str);\n  EXPECT_EQ(\"is equal to \\\"\\\\012\\\\045\\\\0\\\\08\\\\0\\\\0\\\"\", Describe(m3));\n}\n\nTEST(StrNeTest, MatchesUnequalString) {\n  Matcher<const char*> m = StrNe(\"Hello\");\n  EXPECT_TRUE(m.Matches(\"\"));\n  EXPECT_TRUE(m.Matches(NULL));\n  EXPECT_FALSE(m.Matches(\"Hello\"));\n\n  Matcher<std::string> m2 = StrNe(std::string(\"Hello\"));\n  EXPECT_TRUE(m2.Matches(\"hello\"));\n  EXPECT_FALSE(m2.Matches(\"Hello\"));\n\n#if GTEST_HAS_ABSL\n  Matcher<const absl::string_view> m3 = StrNe(\"Hello\");\n  EXPECT_TRUE(m3.Matches(absl::string_view(\"\")));\n  EXPECT_TRUE(m3.Matches(absl::string_view()));\n  EXPECT_FALSE(m3.Matches(absl::string_view(\"Hello\")));\n#endif  // GTEST_HAS_ABSL\n}\n\nTEST(StrNeTest, CanDescribeSelf) {\n  Matcher<const char*> m = StrNe(\"Hi\");\n  EXPECT_EQ(\"isn't equal to \\\"Hi\\\"\", Describe(m));\n}\n\nTEST(StrCaseEqTest, MatchesEqualStringIgnoringCase) {\n  Matcher<const char*> m = StrCaseEq(std::string(\"Hello\"));\n  EXPECT_TRUE(m.Matches(\"Hello\"));\n  EXPECT_TRUE(m.Matches(\"hello\"));\n  EXPECT_FALSE(m.Matches(\"Hi\"));\n  EXPECT_FALSE(m.Matches(NULL));\n\n  Matcher<const std::string&> m2 = StrCaseEq(\"Hello\");\n  EXPECT_TRUE(m2.Matches(\"hello\"));\n  EXPECT_FALSE(m2.Matches(\"Hi\"));\n\n#if GTEST_HAS_ABSL\n  Matcher<const absl::string_view&> m3 = StrCaseEq(std::string(\"Hello\"));\n  EXPECT_TRUE(m3.Matches(absl::string_view(\"Hello\")));\n  EXPECT_TRUE(m3.Matches(absl::string_view(\"hello\")));\n  EXPECT_FALSE(m3.Matches(absl::string_view(\"Hi\")));\n  EXPECT_FALSE(m3.Matches(absl::string_view()));\n#endif  // GTEST_HAS_ABSL\n}\n\nTEST(StrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {\n  std::string str1(\"oabocdooeoo\");\n  std::string str2(\"OABOCDOOEOO\");\n  Matcher<const std::string&> m0 = StrCaseEq(str1);\n  EXPECT_FALSE(m0.Matches(str2 + std::string(1, '\\0')));\n\n  str1[3] = str2[3] = '\\0';\n  Matcher<const std::string&> m1 = StrCaseEq(str1);\n  EXPECT_TRUE(m1.Matches(str2));\n\n  str1[0] = str1[6] = str1[7] = str1[10] = '\\0';\n  str2[0] = str2[6] = str2[7] = str2[10] = '\\0';\n  Matcher<const std::string&> m2 = StrCaseEq(str1);\n  str1[9] = str2[9] = '\\0';\n  EXPECT_FALSE(m2.Matches(str2));\n\n  Matcher<const std::string&> m3 = StrCaseEq(str1);\n  EXPECT_TRUE(m3.Matches(str2));\n\n  EXPECT_FALSE(m3.Matches(str2 + \"x\"));\n  str2.append(1, '\\0');\n  EXPECT_FALSE(m3.Matches(str2));\n  EXPECT_FALSE(m3.Matches(std::string(str2, 0, 9)));\n}\n\nTEST(StrCaseEqTest, CanDescribeSelf) {\n  Matcher<std::string> m = StrCaseEq(\"Hi\");\n  EXPECT_EQ(\"is equal to (ignoring case) \\\"Hi\\\"\", Describe(m));\n}\n\nTEST(StrCaseNeTest, MatchesUnequalStringIgnoringCase) {\n  Matcher<const char*> m = StrCaseNe(\"Hello\");\n  EXPECT_TRUE(m.Matches(\"Hi\"));\n  EXPECT_TRUE(m.Matches(NULL));\n  EXPECT_FALSE(m.Matches(\"Hello\"));\n  EXPECT_FALSE(m.Matches(\"hello\"));\n\n  Matcher<std::string> m2 = StrCaseNe(std::string(\"Hello\"));\n  EXPECT_TRUE(m2.Matches(\"\"));\n  EXPECT_FALSE(m2.Matches(\"Hello\"));\n\n#if GTEST_HAS_ABSL\n  Matcher<const absl::string_view> m3 = StrCaseNe(\"Hello\");\n  EXPECT_TRUE(m3.Matches(absl::string_view(\"Hi\")));\n  EXPECT_TRUE(m3.Matches(absl::string_view()));\n  EXPECT_FALSE(m3.Matches(absl::string_view(\"Hello\")));\n  EXPECT_FALSE(m3.Matches(absl::string_view(\"hello\")));\n#endif  // GTEST_HAS_ABSL\n}\n\nTEST(StrCaseNeTest, CanDescribeSelf) {\n  Matcher<const char*> m = StrCaseNe(\"Hi\");\n  EXPECT_EQ(\"isn't equal to (ignoring case) \\\"Hi\\\"\", Describe(m));\n}\n\n// Tests that HasSubstr() works for matching string-typed values.\nTEST(HasSubstrTest, WorksForStringClasses) {\n  const Matcher<std::string> m1 = HasSubstr(\"foo\");\n  EXPECT_TRUE(m1.Matches(std::string(\"I love food.\")));\n  EXPECT_FALSE(m1.Matches(std::string(\"tofo\")));\n\n  const Matcher<const std::string&> m2 = HasSubstr(\"foo\");\n  EXPECT_TRUE(m2.Matches(std::string(\"I love food.\")));\n  EXPECT_FALSE(m2.Matches(std::string(\"tofo\")));\n}\n\n// Tests that HasSubstr() works for matching C-string-typed values.\nTEST(HasSubstrTest, WorksForCStrings) {\n  const Matcher<char*> m1 = HasSubstr(\"foo\");\n  EXPECT_TRUE(m1.Matches(const_cast<char*>(\"I love food.\")));\n  EXPECT_FALSE(m1.Matches(const_cast<char*>(\"tofo\")));\n  EXPECT_FALSE(m1.Matches(NULL));\n\n  const Matcher<const char*> m2 = HasSubstr(\"foo\");\n  EXPECT_TRUE(m2.Matches(\"I love food.\"));\n  EXPECT_FALSE(m2.Matches(\"tofo\"));\n  EXPECT_FALSE(m2.Matches(NULL));\n}\n\n#if GTEST_HAS_ABSL\n// Tests that HasSubstr() works for matching absl::string_view-typed values.\nTEST(HasSubstrTest, WorksForStringViewClasses) {\n  const Matcher<absl::string_view> m1 = HasSubstr(\"foo\");\n  EXPECT_TRUE(m1.Matches(absl::string_view(\"I love food.\")));\n  EXPECT_FALSE(m1.Matches(absl::string_view(\"tofo\")));\n  EXPECT_FALSE(m1.Matches(absl::string_view()));\n\n  const Matcher<const absl::string_view&> m2 = HasSubstr(\"foo\");\n  EXPECT_TRUE(m2.Matches(absl::string_view(\"I love food.\")));\n  EXPECT_FALSE(m2.Matches(absl::string_view(\"tofo\")));\n  EXPECT_FALSE(m2.Matches(absl::string_view()));\n\n  const Matcher<const absl::string_view&> m3 = HasSubstr(\"\");\n  EXPECT_TRUE(m3.Matches(absl::string_view(\"foo\")));\n  EXPECT_FALSE(m3.Matches(absl::string_view()));\n}\n#endif  // GTEST_HAS_ABSL\n\n// Tests that HasSubstr(s) describes itself properly.\nTEST(HasSubstrTest, CanDescribeSelf) {\n  Matcher<std::string> m = HasSubstr(\"foo\\n\\\"\");\n  EXPECT_EQ(\"has substring \\\"foo\\\\n\\\\\\\"\\\"\", Describe(m));\n}\n\nTEST(KeyTest, CanDescribeSelf) {\n  Matcher<const pair<std::string, int>&> m = Key(\"foo\");\n  EXPECT_EQ(\"has a key that is equal to \\\"foo\\\"\", Describe(m));\n  EXPECT_EQ(\"doesn't have a key that is equal to \\\"foo\\\"\", DescribeNegation(m));\n}\n\nTEST(KeyTest, ExplainsResult) {\n  Matcher<pair<int, bool> > m = Key(GreaterThan(10));\n  EXPECT_EQ(\"whose first field is a value which is 5 less than 10\",\n            Explain(m, make_pair(5, true)));\n  EXPECT_EQ(\"whose first field is a value which is 5 more than 10\",\n            Explain(m, make_pair(15, true)));\n}\n\nTEST(KeyTest, MatchesCorrectly) {\n  pair<int, std::string> p(25, \"foo\");\n  EXPECT_THAT(p, Key(25));\n  EXPECT_THAT(p, Not(Key(42)));\n  EXPECT_THAT(p, Key(Ge(20)));\n  EXPECT_THAT(p, Not(Key(Lt(25))));\n}\n\n#if GTEST_LANG_CXX11\ntemplate <size_t I>\nstruct Tag {};\n\nstruct PairWithGet {\n  int member_1;\n  string member_2;\n  using first_type = int;\n  using second_type = string;\n\n  const int& GetImpl(Tag<0>) const { return member_1; }\n  const string& GetImpl(Tag<1>) const { return member_2; }\n};\ntemplate <size_t I>\nauto get(const PairWithGet& value) -> decltype(value.GetImpl(Tag<I>())) {\n  return value.GetImpl(Tag<I>());\n}\nTEST(PairTest, MatchesPairWithGetCorrectly) {\n  PairWithGet p{25, \"foo\"};\n  EXPECT_THAT(p, Key(25));\n  EXPECT_THAT(p, Not(Key(42)));\n  EXPECT_THAT(p, Key(Ge(20)));\n  EXPECT_THAT(p, Not(Key(Lt(25))));\n\n  std::vector<PairWithGet> v = {{11, \"Foo\"}, {29, \"gMockIsBestMock\"}};\n  EXPECT_THAT(v, Contains(Key(29)));\n}\n#endif  // GTEST_LANG_CXX11\n\nTEST(KeyTest, SafelyCastsInnerMatcher) {\n  Matcher<int> is_positive = Gt(0);\n  Matcher<int> is_negative = Lt(0);\n  pair<char, bool> p('a', true);\n  EXPECT_THAT(p, Key(is_positive));\n  EXPECT_THAT(p, Not(Key(is_negative)));\n}\n\nTEST(KeyTest, InsideContainsUsingMap) {\n  map<int, char> container;\n  container.insert(make_pair(1, 'a'));\n  container.insert(make_pair(2, 'b'));\n  container.insert(make_pair(4, 'c'));\n  EXPECT_THAT(container, Contains(Key(1)));\n  EXPECT_THAT(container, Not(Contains(Key(3))));\n}\n\nTEST(KeyTest, InsideContainsUsingMultimap) {\n  multimap<int, char> container;\n  container.insert(make_pair(1, 'a'));\n  container.insert(make_pair(2, 'b'));\n  container.insert(make_pair(4, 'c'));\n\n  EXPECT_THAT(container, Not(Contains(Key(25))));\n  container.insert(make_pair(25, 'd'));\n  EXPECT_THAT(container, Contains(Key(25)));\n  container.insert(make_pair(25, 'e'));\n  EXPECT_THAT(container, Contains(Key(25)));\n\n  EXPECT_THAT(container, Contains(Key(1)));\n  EXPECT_THAT(container, Not(Contains(Key(3))));\n}\n\nTEST(PairTest, Typing) {\n  // Test verifies the following type conversions can be compiled.\n  Matcher<const pair<const char*, int>&> m1 = Pair(\"foo\", 42);\n  Matcher<const pair<const char*, int> > m2 = Pair(\"foo\", 42);\n  Matcher<pair<const char*, int> > m3 = Pair(\"foo\", 42);\n\n  Matcher<pair<int, const std::string> > m4 = Pair(25, \"42\");\n  Matcher<pair<const std::string, int> > m5 = Pair(\"25\", 42);\n}\n\nTEST(PairTest, CanDescribeSelf) {\n  Matcher<const pair<std::string, int>&> m1 = Pair(\"foo\", 42);\n  EXPECT_EQ(\"has a first field that is equal to \\\"foo\\\"\"\n            \", and has a second field that is equal to 42\",\n            Describe(m1));\n  EXPECT_EQ(\"has a first field that isn't equal to \\\"foo\\\"\"\n            \", or has a second field that isn't equal to 42\",\n            DescribeNegation(m1));\n  // Double and triple negation (1 or 2 times not and description of negation).\n  Matcher<const pair<int, int>&> m2 = Not(Pair(Not(13), 42));\n  EXPECT_EQ(\"has a first field that isn't equal to 13\"\n            \", and has a second field that is equal to 42\",\n            DescribeNegation(m2));\n}\n\nTEST(PairTest, CanExplainMatchResultTo) {\n  // If neither field matches, Pair() should explain about the first\n  // field.\n  const Matcher<pair<int, int> > m = Pair(GreaterThan(0), GreaterThan(0));\n  EXPECT_EQ(\"whose first field does not match, which is 1 less than 0\",\n            Explain(m, make_pair(-1, -2)));\n\n  // If the first field matches but the second doesn't, Pair() should\n  // explain about the second field.\n  EXPECT_EQ(\"whose second field does not match, which is 2 less than 0\",\n            Explain(m, make_pair(1, -2)));\n\n  // If the first field doesn't match but the second does, Pair()\n  // should explain about the first field.\n  EXPECT_EQ(\"whose first field does not match, which is 1 less than 0\",\n            Explain(m, make_pair(-1, 2)));\n\n  // If both fields match, Pair() should explain about them both.\n  EXPECT_EQ(\"whose both fields match, where the first field is a value \"\n            \"which is 1 more than 0, and the second field is a value \"\n            \"which is 2 more than 0\",\n            Explain(m, make_pair(1, 2)));\n\n  // If only the first match has an explanation, only this explanation should\n  // be printed.\n  const Matcher<pair<int, int> > explain_first = Pair(GreaterThan(0), 0);\n  EXPECT_EQ(\"whose both fields match, where the first field is a value \"\n            \"which is 1 more than 0\",\n            Explain(explain_first, make_pair(1, 0)));\n\n  // If only the second match has an explanation, only this explanation should\n  // be printed.\n  const Matcher<pair<int, int> > explain_second = Pair(0, GreaterThan(0));\n  EXPECT_EQ(\"whose both fields match, where the second field is a value \"\n            \"which is 1 more than 0\",\n            Explain(explain_second, make_pair(0, 1)));\n}\n\nTEST(PairTest, MatchesCorrectly) {\n  pair<int, std::string> p(25, \"foo\");\n\n  // Both fields match.\n  EXPECT_THAT(p, Pair(25, \"foo\"));\n  EXPECT_THAT(p, Pair(Ge(20), HasSubstr(\"o\")));\n\n  // 'first' doesnt' match, but 'second' matches.\n  EXPECT_THAT(p, Not(Pair(42, \"foo\")));\n  EXPECT_THAT(p, Not(Pair(Lt(25), \"foo\")));\n\n  // 'first' matches, but 'second' doesn't match.\n  EXPECT_THAT(p, Not(Pair(25, \"bar\")));\n  EXPECT_THAT(p, Not(Pair(25, Not(\"foo\"))));\n\n  // Neither field matches.\n  EXPECT_THAT(p, Not(Pair(13, \"bar\")));\n  EXPECT_THAT(p, Not(Pair(Lt(13), HasSubstr(\"a\"))));\n}\n\nTEST(PairTest, SafelyCastsInnerMatchers) {\n  Matcher<int> is_positive = Gt(0);\n  Matcher<int> is_negative = Lt(0);\n  pair<char, bool> p('a', true);\n  EXPECT_THAT(p, Pair(is_positive, _));\n  EXPECT_THAT(p, Not(Pair(is_negative, _)));\n  EXPECT_THAT(p, Pair(_, is_positive));\n  EXPECT_THAT(p, Not(Pair(_, is_negative)));\n}\n\nTEST(PairTest, InsideContainsUsingMap) {\n  map<int, char> container;\n  container.insert(make_pair(1, 'a'));\n  container.insert(make_pair(2, 'b'));\n  container.insert(make_pair(4, 'c'));\n  EXPECT_THAT(container, Contains(Pair(1, 'a')));\n  EXPECT_THAT(container, Contains(Pair(1, _)));\n  EXPECT_THAT(container, Contains(Pair(_, 'a')));\n  EXPECT_THAT(container, Not(Contains(Pair(3, _))));\n}\n\n#if GTEST_LANG_CXX11\nTEST(PairTest, UseGetInsteadOfMembers) {\n  PairWithGet pair{7, \"ABC\"};\n  EXPECT_THAT(pair, Pair(7, \"ABC\"));\n  EXPECT_THAT(pair, Pair(Ge(7), HasSubstr(\"AB\")));\n  EXPECT_THAT(pair, Not(Pair(Lt(7), \"ABC\")));\n\n  std::vector<PairWithGet> v = {{11, \"Foo\"}, {29, \"gMockIsBestMock\"}};\n  EXPECT_THAT(v, ElementsAre(Pair(11, string(\"Foo\")), Pair(Ge(10), Not(\"\"))));\n}\n#endif  // GTEST_LANG_CXX11\n\n// Tests StartsWith(s).\n\nTEST(StartsWithTest, MatchesStringWithGivenPrefix) {\n  const Matcher<const char*> m1 = StartsWith(std::string(\"\"));\n  EXPECT_TRUE(m1.Matches(\"Hi\"));\n  EXPECT_TRUE(m1.Matches(\"\"));\n  EXPECT_FALSE(m1.Matches(NULL));\n\n  const Matcher<const std::string&> m2 = StartsWith(\"Hi\");\n  EXPECT_TRUE(m2.Matches(\"Hi\"));\n  EXPECT_TRUE(m2.Matches(\"Hi Hi!\"));\n  EXPECT_TRUE(m2.Matches(\"High\"));\n  EXPECT_FALSE(m2.Matches(\"H\"));\n  EXPECT_FALSE(m2.Matches(\" Hi\"));\n}\n\nTEST(StartsWithTest, CanDescribeSelf) {\n  Matcher<const std::string> m = StartsWith(\"Hi\");\n  EXPECT_EQ(\"starts with \\\"Hi\\\"\", Describe(m));\n}\n\n// Tests EndsWith(s).\n\nTEST(EndsWithTest, MatchesStringWithGivenSuffix) {\n  const Matcher<const char*> m1 = EndsWith(\"\");\n  EXPECT_TRUE(m1.Matches(\"Hi\"));\n  EXPECT_TRUE(m1.Matches(\"\"));\n  EXPECT_FALSE(m1.Matches(NULL));\n\n  const Matcher<const std::string&> m2 = EndsWith(std::string(\"Hi\"));\n  EXPECT_TRUE(m2.Matches(\"Hi\"));\n  EXPECT_TRUE(m2.Matches(\"Wow Hi Hi\"));\n  EXPECT_TRUE(m2.Matches(\"Super Hi\"));\n  EXPECT_FALSE(m2.Matches(\"i\"));\n  EXPECT_FALSE(m2.Matches(\"Hi \"));\n\n#if GTEST_HAS_GLOBAL_STRING\n  const Matcher<const ::string&> m3 = EndsWith(::string(\"Hi\"));\n  EXPECT_TRUE(m3.Matches(\"Hi\"));\n  EXPECT_TRUE(m3.Matches(\"Wow Hi Hi\"));\n  EXPECT_TRUE(m3.Matches(\"Super Hi\"));\n  EXPECT_FALSE(m3.Matches(\"i\"));\n  EXPECT_FALSE(m3.Matches(\"Hi \"));\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n#if GTEST_HAS_ABSL\n  const Matcher<const absl::string_view&> m4 = EndsWith(\"\");\n  EXPECT_TRUE(m4.Matches(\"Hi\"));\n  EXPECT_TRUE(m4.Matches(\"\"));\n  // Default-constructed absl::string_view should not match anything, in order\n  // to distinguish it from an empty string.\n  EXPECT_FALSE(m4.Matches(absl::string_view()));\n#endif  // GTEST_HAS_ABSL\n}\n\nTEST(EndsWithTest, CanDescribeSelf) {\n  Matcher<const std::string> m = EndsWith(\"Hi\");\n  EXPECT_EQ(\"ends with \\\"Hi\\\"\", Describe(m));\n}\n\n// Tests MatchesRegex().\n\nTEST(MatchesRegexTest, MatchesStringMatchingGivenRegex) {\n  const Matcher<const char*> m1 = MatchesRegex(\"a.*z\");\n  EXPECT_TRUE(m1.Matches(\"az\"));\n  EXPECT_TRUE(m1.Matches(\"abcz\"));\n  EXPECT_FALSE(m1.Matches(NULL));\n\n  const Matcher<const std::string&> m2 = MatchesRegex(new RE(\"a.*z\"));\n  EXPECT_TRUE(m2.Matches(\"azbz\"));\n  EXPECT_FALSE(m2.Matches(\"az1\"));\n  EXPECT_FALSE(m2.Matches(\"1az\"));\n\n#if GTEST_HAS_ABSL\n  const Matcher<const absl::string_view&> m3 = MatchesRegex(\"a.*z\");\n  EXPECT_TRUE(m3.Matches(absl::string_view(\"az\")));\n  EXPECT_TRUE(m3.Matches(absl::string_view(\"abcz\")));\n  EXPECT_FALSE(m3.Matches(absl::string_view(\"1az\")));\n  // Default-constructed absl::string_view should not match anything, in order\n  // to distinguish it from an empty string.\n  EXPECT_FALSE(m3.Matches(absl::string_view()));\n  const Matcher<const absl::string_view&> m4 = MatchesRegex(\"\");\n  EXPECT_FALSE(m4.Matches(absl::string_view()));\n#endif  // GTEST_HAS_ABSL\n}\n\nTEST(MatchesRegexTest, CanDescribeSelf) {\n  Matcher<const std::string> m1 = MatchesRegex(std::string(\"Hi.*\"));\n  EXPECT_EQ(\"matches regular expression \\\"Hi.*\\\"\", Describe(m1));\n\n  Matcher<const char*> m2 = MatchesRegex(new RE(\"a.*\"));\n  EXPECT_EQ(\"matches regular expression \\\"a.*\\\"\", Describe(m2));\n\n#if GTEST_HAS_ABSL\n  Matcher<const absl::string_view> m3 = MatchesRegex(new RE(\"0.*\"));\n  EXPECT_EQ(\"matches regular expression \\\"0.*\\\"\", Describe(m3));\n#endif  // GTEST_HAS_ABSL\n}\n\n// Tests ContainsRegex().\n\nTEST(ContainsRegexTest, MatchesStringContainingGivenRegex) {\n  const Matcher<const char*> m1 = ContainsRegex(std::string(\"a.*z\"));\n  EXPECT_TRUE(m1.Matches(\"az\"));\n  EXPECT_TRUE(m1.Matches(\"0abcz1\"));\n  EXPECT_FALSE(m1.Matches(NULL));\n\n  const Matcher<const std::string&> m2 = ContainsRegex(new RE(\"a.*z\"));\n  EXPECT_TRUE(m2.Matches(\"azbz\"));\n  EXPECT_TRUE(m2.Matches(\"az1\"));\n  EXPECT_FALSE(m2.Matches(\"1a\"));\n\n#if GTEST_HAS_ABSL\n  const Matcher<const absl::string_view&> m3 = ContainsRegex(new RE(\"a.*z\"));\n  EXPECT_TRUE(m3.Matches(absl::string_view(\"azbz\")));\n  EXPECT_TRUE(m3.Matches(absl::string_view(\"az1\")));\n  EXPECT_FALSE(m3.Matches(absl::string_view(\"1a\")));\n  // Default-constructed absl::string_view should not match anything, in order\n  // to distinguish it from an empty string.\n  EXPECT_FALSE(m3.Matches(absl::string_view()));\n  const Matcher<const absl::string_view&> m4 = ContainsRegex(\"\");\n  EXPECT_FALSE(m4.Matches(absl::string_view()));\n#endif  // GTEST_HAS_ABSL\n}\n\nTEST(ContainsRegexTest, CanDescribeSelf) {\n  Matcher<const std::string> m1 = ContainsRegex(\"Hi.*\");\n  EXPECT_EQ(\"contains regular expression \\\"Hi.*\\\"\", Describe(m1));\n\n  Matcher<const char*> m2 = ContainsRegex(new RE(\"a.*\"));\n  EXPECT_EQ(\"contains regular expression \\\"a.*\\\"\", Describe(m2));\n\n#if GTEST_HAS_ABSL\n  Matcher<const absl::string_view> m3 = ContainsRegex(new RE(\"0.*\"));\n  EXPECT_EQ(\"contains regular expression \\\"0.*\\\"\", Describe(m3));\n#endif  // GTEST_HAS_ABSL\n}\n\n// Tests for wide strings.\n#if GTEST_HAS_STD_WSTRING\nTEST(StdWideStrEqTest, MatchesEqual) {\n  Matcher<const wchar_t*> m = StrEq(::std::wstring(L\"Hello\"));\n  EXPECT_TRUE(m.Matches(L\"Hello\"));\n  EXPECT_FALSE(m.Matches(L\"hello\"));\n  EXPECT_FALSE(m.Matches(NULL));\n\n  Matcher<const ::std::wstring&> m2 = StrEq(L\"Hello\");\n  EXPECT_TRUE(m2.Matches(L\"Hello\"));\n  EXPECT_FALSE(m2.Matches(L\"Hi\"));\n\n  Matcher<const ::std::wstring&> m3 = StrEq(L\"\\xD3\\x576\\x8D3\\xC74D\");\n  EXPECT_TRUE(m3.Matches(L\"\\xD3\\x576\\x8D3\\xC74D\"));\n  EXPECT_FALSE(m3.Matches(L\"\\xD3\\x576\\x8D3\\xC74E\"));\n\n  ::std::wstring str(L\"01204500800\");\n  str[3] = L'\\0';\n  Matcher<const ::std::wstring&> m4 = StrEq(str);\n  EXPECT_TRUE(m4.Matches(str));\n  str[0] = str[6] = str[7] = str[9] = str[10] = L'\\0';\n  Matcher<const ::std::wstring&> m5 = StrEq(str);\n  EXPECT_TRUE(m5.Matches(str));\n}\n\nTEST(StdWideStrEqTest, CanDescribeSelf) {\n  Matcher< ::std::wstring> m = StrEq(L\"Hi-\\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\");\n  EXPECT_EQ(\"is equal to L\\\"Hi-\\'\\\\\\\"?\\\\\\\\\\\\a\\\\b\\\\f\\\\n\\\\r\\\\t\\\\v\\\"\",\n    Describe(m));\n\n  Matcher< ::std::wstring> m2 = StrEq(L\"\\xD3\\x576\\x8D3\\xC74D\");\n  EXPECT_EQ(\"is equal to L\\\"\\\\xD3\\\\x576\\\\x8D3\\\\xC74D\\\"\",\n    Describe(m2));\n\n  ::std::wstring str(L\"01204500800\");\n  str[3] = L'\\0';\n  Matcher<const ::std::wstring&> m4 = StrEq(str);\n  EXPECT_EQ(\"is equal to L\\\"012\\\\04500800\\\"\", Describe(m4));\n  str[0] = str[6] = str[7] = str[9] = str[10] = L'\\0';\n  Matcher<const ::std::wstring&> m5 = StrEq(str);\n  EXPECT_EQ(\"is equal to L\\\"\\\\012\\\\045\\\\0\\\\08\\\\0\\\\0\\\"\", Describe(m5));\n}\n\nTEST(StdWideStrNeTest, MatchesUnequalString) {\n  Matcher<const wchar_t*> m = StrNe(L\"Hello\");\n  EXPECT_TRUE(m.Matches(L\"\"));\n  EXPECT_TRUE(m.Matches(NULL));\n  EXPECT_FALSE(m.Matches(L\"Hello\"));\n\n  Matcher< ::std::wstring> m2 = StrNe(::std::wstring(L\"Hello\"));\n  EXPECT_TRUE(m2.Matches(L\"hello\"));\n  EXPECT_FALSE(m2.Matches(L\"Hello\"));\n}\n\nTEST(StdWideStrNeTest, CanDescribeSelf) {\n  Matcher<const wchar_t*> m = StrNe(L\"Hi\");\n  EXPECT_EQ(\"isn't equal to L\\\"Hi\\\"\", Describe(m));\n}\n\nTEST(StdWideStrCaseEqTest, MatchesEqualStringIgnoringCase) {\n  Matcher<const wchar_t*> m = StrCaseEq(::std::wstring(L\"Hello\"));\n  EXPECT_TRUE(m.Matches(L\"Hello\"));\n  EXPECT_TRUE(m.Matches(L\"hello\"));\n  EXPECT_FALSE(m.Matches(L\"Hi\"));\n  EXPECT_FALSE(m.Matches(NULL));\n\n  Matcher<const ::std::wstring&> m2 = StrCaseEq(L\"Hello\");\n  EXPECT_TRUE(m2.Matches(L\"hello\"));\n  EXPECT_FALSE(m2.Matches(L\"Hi\"));\n}\n\nTEST(StdWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {\n  ::std::wstring str1(L\"oabocdooeoo\");\n  ::std::wstring str2(L\"OABOCDOOEOO\");\n  Matcher<const ::std::wstring&> m0 = StrCaseEq(str1);\n  EXPECT_FALSE(m0.Matches(str2 + ::std::wstring(1, L'\\0')));\n\n  str1[3] = str2[3] = L'\\0';\n  Matcher<const ::std::wstring&> m1 = StrCaseEq(str1);\n  EXPECT_TRUE(m1.Matches(str2));\n\n  str1[0] = str1[6] = str1[7] = str1[10] = L'\\0';\n  str2[0] = str2[6] = str2[7] = str2[10] = L'\\0';\n  Matcher<const ::std::wstring&> m2 = StrCaseEq(str1);\n  str1[9] = str2[9] = L'\\0';\n  EXPECT_FALSE(m2.Matches(str2));\n\n  Matcher<const ::std::wstring&> m3 = StrCaseEq(str1);\n  EXPECT_TRUE(m3.Matches(str2));\n\n  EXPECT_FALSE(m3.Matches(str2 + L\"x\"));\n  str2.append(1, L'\\0');\n  EXPECT_FALSE(m3.Matches(str2));\n  EXPECT_FALSE(m3.Matches(::std::wstring(str2, 0, 9)));\n}\n\nTEST(StdWideStrCaseEqTest, CanDescribeSelf) {\n  Matcher< ::std::wstring> m = StrCaseEq(L\"Hi\");\n  EXPECT_EQ(\"is equal to (ignoring case) L\\\"Hi\\\"\", Describe(m));\n}\n\nTEST(StdWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) {\n  Matcher<const wchar_t*> m = StrCaseNe(L\"Hello\");\n  EXPECT_TRUE(m.Matches(L\"Hi\"));\n  EXPECT_TRUE(m.Matches(NULL));\n  EXPECT_FALSE(m.Matches(L\"Hello\"));\n  EXPECT_FALSE(m.Matches(L\"hello\"));\n\n  Matcher< ::std::wstring> m2 = StrCaseNe(::std::wstring(L\"Hello\"));\n  EXPECT_TRUE(m2.Matches(L\"\"));\n  EXPECT_FALSE(m2.Matches(L\"Hello\"));\n}\n\nTEST(StdWideStrCaseNeTest, CanDescribeSelf) {\n  Matcher<const wchar_t*> m = StrCaseNe(L\"Hi\");\n  EXPECT_EQ(\"isn't equal to (ignoring case) L\\\"Hi\\\"\", Describe(m));\n}\n\n// Tests that HasSubstr() works for matching wstring-typed values.\nTEST(StdWideHasSubstrTest, WorksForStringClasses) {\n  const Matcher< ::std::wstring> m1 = HasSubstr(L\"foo\");\n  EXPECT_TRUE(m1.Matches(::std::wstring(L\"I love food.\")));\n  EXPECT_FALSE(m1.Matches(::std::wstring(L\"tofo\")));\n\n  const Matcher<const ::std::wstring&> m2 = HasSubstr(L\"foo\");\n  EXPECT_TRUE(m2.Matches(::std::wstring(L\"I love food.\")));\n  EXPECT_FALSE(m2.Matches(::std::wstring(L\"tofo\")));\n}\n\n// Tests that HasSubstr() works for matching C-wide-string-typed values.\nTEST(StdWideHasSubstrTest, WorksForCStrings) {\n  const Matcher<wchar_t*> m1 = HasSubstr(L\"foo\");\n  EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L\"I love food.\")));\n  EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L\"tofo\")));\n  EXPECT_FALSE(m1.Matches(NULL));\n\n  const Matcher<const wchar_t*> m2 = HasSubstr(L\"foo\");\n  EXPECT_TRUE(m2.Matches(L\"I love food.\"));\n  EXPECT_FALSE(m2.Matches(L\"tofo\"));\n  EXPECT_FALSE(m2.Matches(NULL));\n}\n\n// Tests that HasSubstr(s) describes itself properly.\nTEST(StdWideHasSubstrTest, CanDescribeSelf) {\n  Matcher< ::std::wstring> m = HasSubstr(L\"foo\\n\\\"\");\n  EXPECT_EQ(\"has substring L\\\"foo\\\\n\\\\\\\"\\\"\", Describe(m));\n}\n\n// Tests StartsWith(s).\n\nTEST(StdWideStartsWithTest, MatchesStringWithGivenPrefix) {\n  const Matcher<const wchar_t*> m1 = StartsWith(::std::wstring(L\"\"));\n  EXPECT_TRUE(m1.Matches(L\"Hi\"));\n  EXPECT_TRUE(m1.Matches(L\"\"));\n  EXPECT_FALSE(m1.Matches(NULL));\n\n  const Matcher<const ::std::wstring&> m2 = StartsWith(L\"Hi\");\n  EXPECT_TRUE(m2.Matches(L\"Hi\"));\n  EXPECT_TRUE(m2.Matches(L\"Hi Hi!\"));\n  EXPECT_TRUE(m2.Matches(L\"High\"));\n  EXPECT_FALSE(m2.Matches(L\"H\"));\n  EXPECT_FALSE(m2.Matches(L\" Hi\"));\n}\n\nTEST(StdWideStartsWithTest, CanDescribeSelf) {\n  Matcher<const ::std::wstring> m = StartsWith(L\"Hi\");\n  EXPECT_EQ(\"starts with L\\\"Hi\\\"\", Describe(m));\n}\n\n// Tests EndsWith(s).\n\nTEST(StdWideEndsWithTest, MatchesStringWithGivenSuffix) {\n  const Matcher<const wchar_t*> m1 = EndsWith(L\"\");\n  EXPECT_TRUE(m1.Matches(L\"Hi\"));\n  EXPECT_TRUE(m1.Matches(L\"\"));\n  EXPECT_FALSE(m1.Matches(NULL));\n\n  const Matcher<const ::std::wstring&> m2 = EndsWith(::std::wstring(L\"Hi\"));\n  EXPECT_TRUE(m2.Matches(L\"Hi\"));\n  EXPECT_TRUE(m2.Matches(L\"Wow Hi Hi\"));\n  EXPECT_TRUE(m2.Matches(L\"Super Hi\"));\n  EXPECT_FALSE(m2.Matches(L\"i\"));\n  EXPECT_FALSE(m2.Matches(L\"Hi \"));\n}\n\nTEST(StdWideEndsWithTest, CanDescribeSelf) {\n  Matcher<const ::std::wstring> m = EndsWith(L\"Hi\");\n  EXPECT_EQ(\"ends with L\\\"Hi\\\"\", Describe(m));\n}\n\n#endif  // GTEST_HAS_STD_WSTRING\n\n#if GTEST_HAS_GLOBAL_WSTRING\nTEST(GlobalWideStrEqTest, MatchesEqual) {\n  Matcher<const wchar_t*> m = StrEq(::wstring(L\"Hello\"));\n  EXPECT_TRUE(m.Matches(L\"Hello\"));\n  EXPECT_FALSE(m.Matches(L\"hello\"));\n  EXPECT_FALSE(m.Matches(NULL));\n\n  Matcher<const ::wstring&> m2 = StrEq(L\"Hello\");\n  EXPECT_TRUE(m2.Matches(L\"Hello\"));\n  EXPECT_FALSE(m2.Matches(L\"Hi\"));\n\n  Matcher<const ::wstring&> m3 = StrEq(L\"\\xD3\\x576\\x8D3\\xC74D\");\n  EXPECT_TRUE(m3.Matches(L\"\\xD3\\x576\\x8D3\\xC74D\"));\n  EXPECT_FALSE(m3.Matches(L\"\\xD3\\x576\\x8D3\\xC74E\"));\n\n  ::wstring str(L\"01204500800\");\n  str[3] = L'\\0';\n  Matcher<const ::wstring&> m4 = StrEq(str);\n  EXPECT_TRUE(m4.Matches(str));\n  str[0] = str[6] = str[7] = str[9] = str[10] = L'\\0';\n  Matcher<const ::wstring&> m5 = StrEq(str);\n  EXPECT_TRUE(m5.Matches(str));\n}\n\nTEST(GlobalWideStrEqTest, CanDescribeSelf) {\n  Matcher< ::wstring> m = StrEq(L\"Hi-\\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\");\n  EXPECT_EQ(\"is equal to L\\\"Hi-\\'\\\\\\\"?\\\\\\\\\\\\a\\\\b\\\\f\\\\n\\\\r\\\\t\\\\v\\\"\",\n    Describe(m));\n\n  Matcher< ::wstring> m2 = StrEq(L\"\\xD3\\x576\\x8D3\\xC74D\");\n  EXPECT_EQ(\"is equal to L\\\"\\\\xD3\\\\x576\\\\x8D3\\\\xC74D\\\"\",\n    Describe(m2));\n\n  ::wstring str(L\"01204500800\");\n  str[3] = L'\\0';\n  Matcher<const ::wstring&> m4 = StrEq(str);\n  EXPECT_EQ(\"is equal to L\\\"012\\\\04500800\\\"\", Describe(m4));\n  str[0] = str[6] = str[7] = str[9] = str[10] = L'\\0';\n  Matcher<const ::wstring&> m5 = StrEq(str);\n  EXPECT_EQ(\"is equal to L\\\"\\\\012\\\\045\\\\0\\\\08\\\\0\\\\0\\\"\", Describe(m5));\n}\n\nTEST(GlobalWideStrNeTest, MatchesUnequalString) {\n  Matcher<const wchar_t*> m = StrNe(L\"Hello\");\n  EXPECT_TRUE(m.Matches(L\"\"));\n  EXPECT_TRUE(m.Matches(NULL));\n  EXPECT_FALSE(m.Matches(L\"Hello\"));\n\n  Matcher< ::wstring> m2 = StrNe(::wstring(L\"Hello\"));\n  EXPECT_TRUE(m2.Matches(L\"hello\"));\n  EXPECT_FALSE(m2.Matches(L\"Hello\"));\n}\n\nTEST(GlobalWideStrNeTest, CanDescribeSelf) {\n  Matcher<const wchar_t*> m = StrNe(L\"Hi\");\n  EXPECT_EQ(\"isn't equal to L\\\"Hi\\\"\", Describe(m));\n}\n\nTEST(GlobalWideStrCaseEqTest, MatchesEqualStringIgnoringCase) {\n  Matcher<const wchar_t*> m = StrCaseEq(::wstring(L\"Hello\"));\n  EXPECT_TRUE(m.Matches(L\"Hello\"));\n  EXPECT_TRUE(m.Matches(L\"hello\"));\n  EXPECT_FALSE(m.Matches(L\"Hi\"));\n  EXPECT_FALSE(m.Matches(NULL));\n\n  Matcher<const ::wstring&> m2 = StrCaseEq(L\"Hello\");\n  EXPECT_TRUE(m2.Matches(L\"hello\"));\n  EXPECT_FALSE(m2.Matches(L\"Hi\"));\n}\n\nTEST(GlobalWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {\n  ::wstring str1(L\"oabocdooeoo\");\n  ::wstring str2(L\"OABOCDOOEOO\");\n  Matcher<const ::wstring&> m0 = StrCaseEq(str1);\n  EXPECT_FALSE(m0.Matches(str2 + ::wstring(1, L'\\0')));\n\n  str1[3] = str2[3] = L'\\0';\n  Matcher<const ::wstring&> m1 = StrCaseEq(str1);\n  EXPECT_TRUE(m1.Matches(str2));\n\n  str1[0] = str1[6] = str1[7] = str1[10] = L'\\0';\n  str2[0] = str2[6] = str2[7] = str2[10] = L'\\0';\n  Matcher<const ::wstring&> m2 = StrCaseEq(str1);\n  str1[9] = str2[9] = L'\\0';\n  EXPECT_FALSE(m2.Matches(str2));\n\n  Matcher<const ::wstring&> m3 = StrCaseEq(str1);\n  EXPECT_TRUE(m3.Matches(str2));\n\n  EXPECT_FALSE(m3.Matches(str2 + L\"x\"));\n  str2.append(1, L'\\0');\n  EXPECT_FALSE(m3.Matches(str2));\n  EXPECT_FALSE(m3.Matches(::wstring(str2, 0, 9)));\n}\n\nTEST(GlobalWideStrCaseEqTest, CanDescribeSelf) {\n  Matcher< ::wstring> m = StrCaseEq(L\"Hi\");\n  EXPECT_EQ(\"is equal to (ignoring case) L\\\"Hi\\\"\", Describe(m));\n}\n\nTEST(GlobalWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) {\n  Matcher<const wchar_t*> m = StrCaseNe(L\"Hello\");\n  EXPECT_TRUE(m.Matches(L\"Hi\"));\n  EXPECT_TRUE(m.Matches(NULL));\n  EXPECT_FALSE(m.Matches(L\"Hello\"));\n  EXPECT_FALSE(m.Matches(L\"hello\"));\n\n  Matcher< ::wstring> m2 = StrCaseNe(::wstring(L\"Hello\"));\n  EXPECT_TRUE(m2.Matches(L\"\"));\n  EXPECT_FALSE(m2.Matches(L\"Hello\"));\n}\n\nTEST(GlobalWideStrCaseNeTest, CanDescribeSelf) {\n  Matcher<const wchar_t*> m = StrCaseNe(L\"Hi\");\n  EXPECT_EQ(\"isn't equal to (ignoring case) L\\\"Hi\\\"\", Describe(m));\n}\n\n// Tests that HasSubstr() works for matching wstring-typed values.\nTEST(GlobalWideHasSubstrTest, WorksForStringClasses) {\n  const Matcher< ::wstring> m1 = HasSubstr(L\"foo\");\n  EXPECT_TRUE(m1.Matches(::wstring(L\"I love food.\")));\n  EXPECT_FALSE(m1.Matches(::wstring(L\"tofo\")));\n\n  const Matcher<const ::wstring&> m2 = HasSubstr(L\"foo\");\n  EXPECT_TRUE(m2.Matches(::wstring(L\"I love food.\")));\n  EXPECT_FALSE(m2.Matches(::wstring(L\"tofo\")));\n}\n\n// Tests that HasSubstr() works for matching C-wide-string-typed values.\nTEST(GlobalWideHasSubstrTest, WorksForCStrings) {\n  const Matcher<wchar_t*> m1 = HasSubstr(L\"foo\");\n  EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L\"I love food.\")));\n  EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L\"tofo\")));\n  EXPECT_FALSE(m1.Matches(NULL));\n\n  const Matcher<const wchar_t*> m2 = HasSubstr(L\"foo\");\n  EXPECT_TRUE(m2.Matches(L\"I love food.\"));\n  EXPECT_FALSE(m2.Matches(L\"tofo\"));\n  EXPECT_FALSE(m2.Matches(NULL));\n}\n\n// Tests that HasSubstr(s) describes itself properly.\nTEST(GlobalWideHasSubstrTest, CanDescribeSelf) {\n  Matcher< ::wstring> m = HasSubstr(L\"foo\\n\\\"\");\n  EXPECT_EQ(\"has substring L\\\"foo\\\\n\\\\\\\"\\\"\", Describe(m));\n}\n\n// Tests StartsWith(s).\n\nTEST(GlobalWideStartsWithTest, MatchesStringWithGivenPrefix) {\n  const Matcher<const wchar_t*> m1 = StartsWith(::wstring(L\"\"));\n  EXPECT_TRUE(m1.Matches(L\"Hi\"));\n  EXPECT_TRUE(m1.Matches(L\"\"));\n  EXPECT_FALSE(m1.Matches(NULL));\n\n  const Matcher<const ::wstring&> m2 = StartsWith(L\"Hi\");\n  EXPECT_TRUE(m2.Matches(L\"Hi\"));\n  EXPECT_TRUE(m2.Matches(L\"Hi Hi!\"));\n  EXPECT_TRUE(m2.Matches(L\"High\"));\n  EXPECT_FALSE(m2.Matches(L\"H\"));\n  EXPECT_FALSE(m2.Matches(L\" Hi\"));\n}\n\nTEST(GlobalWideStartsWithTest, CanDescribeSelf) {\n  Matcher<const ::wstring> m = StartsWith(L\"Hi\");\n  EXPECT_EQ(\"starts with L\\\"Hi\\\"\", Describe(m));\n}\n\n// Tests EndsWith(s).\n\nTEST(GlobalWideEndsWithTest, MatchesStringWithGivenSuffix) {\n  const Matcher<const wchar_t*> m1 = EndsWith(L\"\");\n  EXPECT_TRUE(m1.Matches(L\"Hi\"));\n  EXPECT_TRUE(m1.Matches(L\"\"));\n  EXPECT_FALSE(m1.Matches(NULL));\n\n  const Matcher<const ::wstring&> m2 = EndsWith(::wstring(L\"Hi\"));\n  EXPECT_TRUE(m2.Matches(L\"Hi\"));\n  EXPECT_TRUE(m2.Matches(L\"Wow Hi Hi\"));\n  EXPECT_TRUE(m2.Matches(L\"Super Hi\"));\n  EXPECT_FALSE(m2.Matches(L\"i\"));\n  EXPECT_FALSE(m2.Matches(L\"Hi \"));\n}\n\nTEST(GlobalWideEndsWithTest, CanDescribeSelf) {\n  Matcher<const ::wstring> m = EndsWith(L\"Hi\");\n  EXPECT_EQ(\"ends with L\\\"Hi\\\"\", Describe(m));\n}\n\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n\ntypedef ::testing::tuple<long, int> Tuple2;  // NOLINT\n\n// Tests that Eq() matches a 2-tuple where the first field == the\n// second field.\nTEST(Eq2Test, MatchesEqualArguments) {\n  Matcher<const Tuple2&> m = Eq();\n  EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));\n  EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));\n}\n\n// Tests that Eq() describes itself properly.\nTEST(Eq2Test, CanDescribeSelf) {\n  Matcher<const Tuple2&> m = Eq();\n  EXPECT_EQ(\"are an equal pair\", Describe(m));\n}\n\n// Tests that Ge() matches a 2-tuple where the first field >= the\n// second field.\nTEST(Ge2Test, MatchesGreaterThanOrEqualArguments) {\n  Matcher<const Tuple2&> m = Ge();\n  EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));\n  EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));\n  EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));\n}\n\n// Tests that Ge() describes itself properly.\nTEST(Ge2Test, CanDescribeSelf) {\n  Matcher<const Tuple2&> m = Ge();\n  EXPECT_EQ(\"are a pair where the first >= the second\", Describe(m));\n}\n\n// Tests that Gt() matches a 2-tuple where the first field > the\n// second field.\nTEST(Gt2Test, MatchesGreaterThanArguments) {\n  Matcher<const Tuple2&> m = Gt();\n  EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));\n  EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));\n  EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));\n}\n\n// Tests that Gt() describes itself properly.\nTEST(Gt2Test, CanDescribeSelf) {\n  Matcher<const Tuple2&> m = Gt();\n  EXPECT_EQ(\"are a pair where the first > the second\", Describe(m));\n}\n\n// Tests that Le() matches a 2-tuple where the first field <= the\n// second field.\nTEST(Le2Test, MatchesLessThanOrEqualArguments) {\n  Matcher<const Tuple2&> m = Le();\n  EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));\n  EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));\n  EXPECT_FALSE(m.Matches(Tuple2(5L, 4)));\n}\n\n// Tests that Le() describes itself properly.\nTEST(Le2Test, CanDescribeSelf) {\n  Matcher<const Tuple2&> m = Le();\n  EXPECT_EQ(\"are a pair where the first <= the second\", Describe(m));\n}\n\n// Tests that Lt() matches a 2-tuple where the first field < the\n// second field.\nTEST(Lt2Test, MatchesLessThanArguments) {\n  Matcher<const Tuple2&> m = Lt();\n  EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));\n  EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));\n  EXPECT_FALSE(m.Matches(Tuple2(5L, 4)));\n}\n\n// Tests that Lt() describes itself properly.\nTEST(Lt2Test, CanDescribeSelf) {\n  Matcher<const Tuple2&> m = Lt();\n  EXPECT_EQ(\"are a pair where the first < the second\", Describe(m));\n}\n\n// Tests that Ne() matches a 2-tuple where the first field != the\n// second field.\nTEST(Ne2Test, MatchesUnequalArguments) {\n  Matcher<const Tuple2&> m = Ne();\n  EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));\n  EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));\n  EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));\n}\n\n// Tests that Ne() describes itself properly.\nTEST(Ne2Test, CanDescribeSelf) {\n  Matcher<const Tuple2&> m = Ne();\n  EXPECT_EQ(\"are an unequal pair\", Describe(m));\n}\n\n// Tests that FloatEq() matches a 2-tuple where\n// FloatEq(first field) matches the second field.\nTEST(FloatEq2Test, MatchesEqualArguments) {\n  typedef ::testing::tuple<float, float> Tpl;\n  Matcher<const Tpl&> m = FloatEq();\n  EXPECT_TRUE(m.Matches(Tpl(1.0f, 1.0f)));\n  EXPECT_TRUE(m.Matches(Tpl(0.3f, 0.1f + 0.1f + 0.1f)));\n  EXPECT_FALSE(m.Matches(Tpl(1.1f, 1.0f)));\n}\n\n// Tests that FloatEq() describes itself properly.\nTEST(FloatEq2Test, CanDescribeSelf) {\n  Matcher<const ::testing::tuple<float, float>&> m = FloatEq();\n  EXPECT_EQ(\"are an almost-equal pair\", Describe(m));\n}\n\n// Tests that NanSensitiveFloatEq() matches a 2-tuple where\n// NanSensitiveFloatEq(first field) matches the second field.\nTEST(NanSensitiveFloatEqTest, MatchesEqualArgumentsWithNaN) {\n  typedef ::testing::tuple<float, float> Tpl;\n  Matcher<const Tpl&> m = NanSensitiveFloatEq();\n  EXPECT_TRUE(m.Matches(Tpl(1.0f, 1.0f)));\n  EXPECT_TRUE(m.Matches(Tpl(std::numeric_limits<float>::quiet_NaN(),\n                            std::numeric_limits<float>::quiet_NaN())));\n  EXPECT_FALSE(m.Matches(Tpl(1.1f, 1.0f)));\n  EXPECT_FALSE(m.Matches(Tpl(1.0f, std::numeric_limits<float>::quiet_NaN())));\n  EXPECT_FALSE(m.Matches(Tpl(std::numeric_limits<float>::quiet_NaN(), 1.0f)));\n}\n\n// Tests that NanSensitiveFloatEq() describes itself properly.\nTEST(NanSensitiveFloatEqTest, CanDescribeSelfWithNaNs) {\n  Matcher<const ::testing::tuple<float, float>&> m = NanSensitiveFloatEq();\n  EXPECT_EQ(\"are an almost-equal pair\", Describe(m));\n}\n\n// Tests that DoubleEq() matches a 2-tuple where\n// DoubleEq(first field) matches the second field.\nTEST(DoubleEq2Test, MatchesEqualArguments) {\n  typedef ::testing::tuple<double, double> Tpl;\n  Matcher<const Tpl&> m = DoubleEq();\n  EXPECT_TRUE(m.Matches(Tpl(1.0, 1.0)));\n  EXPECT_TRUE(m.Matches(Tpl(0.3, 0.1 + 0.1 + 0.1)));\n  EXPECT_FALSE(m.Matches(Tpl(1.1, 1.0)));\n}\n\n// Tests that DoubleEq() describes itself properly.\nTEST(DoubleEq2Test, CanDescribeSelf) {\n  Matcher<const ::testing::tuple<double, double>&> m = DoubleEq();\n  EXPECT_EQ(\"are an almost-equal pair\", Describe(m));\n}\n\n// Tests that NanSensitiveDoubleEq() matches a 2-tuple where\n// NanSensitiveDoubleEq(first field) matches the second field.\nTEST(NanSensitiveDoubleEqTest, MatchesEqualArgumentsWithNaN) {\n  typedef ::testing::tuple<double, double> Tpl;\n  Matcher<const Tpl&> m = NanSensitiveDoubleEq();\n  EXPECT_TRUE(m.Matches(Tpl(1.0f, 1.0f)));\n  EXPECT_TRUE(m.Matches(Tpl(std::numeric_limits<double>::quiet_NaN(),\n                            std::numeric_limits<double>::quiet_NaN())));\n  EXPECT_FALSE(m.Matches(Tpl(1.1f, 1.0f)));\n  EXPECT_FALSE(m.Matches(Tpl(1.0f, std::numeric_limits<double>::quiet_NaN())));\n  EXPECT_FALSE(m.Matches(Tpl(std::numeric_limits<double>::quiet_NaN(), 1.0f)));\n}\n\n// Tests that DoubleEq() describes itself properly.\nTEST(NanSensitiveDoubleEqTest, CanDescribeSelfWithNaNs) {\n  Matcher<const ::testing::tuple<double, double>&> m = NanSensitiveDoubleEq();\n  EXPECT_EQ(\"are an almost-equal pair\", Describe(m));\n}\n\n// Tests that FloatEq() matches a 2-tuple where\n// FloatNear(first field, max_abs_error) matches the second field.\nTEST(FloatNear2Test, MatchesEqualArguments) {\n  typedef ::testing::tuple<float, float> Tpl;\n  Matcher<const Tpl&> m = FloatNear(0.5f);\n  EXPECT_TRUE(m.Matches(Tpl(1.0f, 1.0f)));\n  EXPECT_TRUE(m.Matches(Tpl(1.3f, 1.0f)));\n  EXPECT_FALSE(m.Matches(Tpl(1.8f, 1.0f)));\n}\n\n// Tests that FloatNear() describes itself properly.\nTEST(FloatNear2Test, CanDescribeSelf) {\n  Matcher<const ::testing::tuple<float, float>&> m = FloatNear(0.5f);\n  EXPECT_EQ(\"are an almost-equal pair\", Describe(m));\n}\n\n// Tests that NanSensitiveFloatNear() matches a 2-tuple where\n// NanSensitiveFloatNear(first field) matches the second field.\nTEST(NanSensitiveFloatNearTest, MatchesNearbyArgumentsWithNaN) {\n  typedef ::testing::tuple<float, float> Tpl;\n  Matcher<const Tpl&> m = NanSensitiveFloatNear(0.5f);\n  EXPECT_TRUE(m.Matches(Tpl(1.0f, 1.0f)));\n  EXPECT_TRUE(m.Matches(Tpl(1.1f, 1.0f)));\n  EXPECT_TRUE(m.Matches(Tpl(std::numeric_limits<float>::quiet_NaN(),\n                            std::numeric_limits<float>::quiet_NaN())));\n  EXPECT_FALSE(m.Matches(Tpl(1.6f, 1.0f)));\n  EXPECT_FALSE(m.Matches(Tpl(1.0f, std::numeric_limits<float>::quiet_NaN())));\n  EXPECT_FALSE(m.Matches(Tpl(std::numeric_limits<float>::quiet_NaN(), 1.0f)));\n}\n\n// Tests that NanSensitiveFloatNear() describes itself properly.\nTEST(NanSensitiveFloatNearTest, CanDescribeSelfWithNaNs) {\n  Matcher<const ::testing::tuple<float, float>&> m =\n      NanSensitiveFloatNear(0.5f);\n  EXPECT_EQ(\"are an almost-equal pair\", Describe(m));\n}\n\n// Tests that FloatEq() matches a 2-tuple where\n// DoubleNear(first field, max_abs_error) matches the second field.\nTEST(DoubleNear2Test, MatchesEqualArguments) {\n  typedef ::testing::tuple<double, double> Tpl;\n  Matcher<const Tpl&> m = DoubleNear(0.5);\n  EXPECT_TRUE(m.Matches(Tpl(1.0, 1.0)));\n  EXPECT_TRUE(m.Matches(Tpl(1.3, 1.0)));\n  EXPECT_FALSE(m.Matches(Tpl(1.8, 1.0)));\n}\n\n// Tests that DoubleNear() describes itself properly.\nTEST(DoubleNear2Test, CanDescribeSelf) {\n  Matcher<const ::testing::tuple<double, double>&> m = DoubleNear(0.5);\n  EXPECT_EQ(\"are an almost-equal pair\", Describe(m));\n}\n\n// Tests that NanSensitiveDoubleNear() matches a 2-tuple where\n// NanSensitiveDoubleNear(first field) matches the second field.\nTEST(NanSensitiveDoubleNearTest, MatchesNearbyArgumentsWithNaN) {\n  typedef ::testing::tuple<double, double> Tpl;\n  Matcher<const Tpl&> m = NanSensitiveDoubleNear(0.5f);\n  EXPECT_TRUE(m.Matches(Tpl(1.0f, 1.0f)));\n  EXPECT_TRUE(m.Matches(Tpl(1.1f, 1.0f)));\n  EXPECT_TRUE(m.Matches(Tpl(std::numeric_limits<double>::quiet_NaN(),\n                            std::numeric_limits<double>::quiet_NaN())));\n  EXPECT_FALSE(m.Matches(Tpl(1.6f, 1.0f)));\n  EXPECT_FALSE(m.Matches(Tpl(1.0f, std::numeric_limits<double>::quiet_NaN())));\n  EXPECT_FALSE(m.Matches(Tpl(std::numeric_limits<double>::quiet_NaN(), 1.0f)));\n}\n\n// Tests that NanSensitiveDoubleNear() describes itself properly.\nTEST(NanSensitiveDoubleNearTest, CanDescribeSelfWithNaNs) {\n  Matcher<const ::testing::tuple<double, double>&> m =\n      NanSensitiveDoubleNear(0.5f);\n  EXPECT_EQ(\"are an almost-equal pair\", Describe(m));\n}\n\n// Tests that Not(m) matches any value that doesn't match m.\nTEST(NotTest, NegatesMatcher) {\n  Matcher<int> m;\n  m = Not(Eq(2));\n  EXPECT_TRUE(m.Matches(3));\n  EXPECT_FALSE(m.Matches(2));\n}\n\n// Tests that Not(m) describes itself properly.\nTEST(NotTest, CanDescribeSelf) {\n  Matcher<int> m = Not(Eq(5));\n  EXPECT_EQ(\"isn't equal to 5\", Describe(m));\n}\n\n// Tests that monomorphic matchers are safely cast by the Not matcher.\nTEST(NotTest, NotMatcherSafelyCastsMonomorphicMatchers) {\n  // greater_than_5 is a monomorphic matcher.\n  Matcher<int> greater_than_5 = Gt(5);\n\n  Matcher<const int&> m = Not(greater_than_5);\n  Matcher<int&> m2 = Not(greater_than_5);\n  Matcher<int&> m3 = Not(m);\n}\n\n// Helper to allow easy testing of AllOf matchers with num parameters.\nvoid AllOfMatches(int num, const Matcher<int>& m) {\n  SCOPED_TRACE(Describe(m));\n  EXPECT_TRUE(m.Matches(0));\n  for (int i = 1; i <= num; ++i) {\n    EXPECT_FALSE(m.Matches(i));\n  }\n  EXPECT_TRUE(m.Matches(num + 1));\n}\n\n// Tests that AllOf(m1, ..., mn) matches any value that matches all of\n// the given matchers.\nTEST(AllOfTest, MatchesWhenAllMatch) {\n  Matcher<int> m;\n  m = AllOf(Le(2), Ge(1));\n  EXPECT_TRUE(m.Matches(1));\n  EXPECT_TRUE(m.Matches(2));\n  EXPECT_FALSE(m.Matches(0));\n  EXPECT_FALSE(m.Matches(3));\n\n  m = AllOf(Gt(0), Ne(1), Ne(2));\n  EXPECT_TRUE(m.Matches(3));\n  EXPECT_FALSE(m.Matches(2));\n  EXPECT_FALSE(m.Matches(1));\n  EXPECT_FALSE(m.Matches(0));\n\n  m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));\n  EXPECT_TRUE(m.Matches(4));\n  EXPECT_FALSE(m.Matches(3));\n  EXPECT_FALSE(m.Matches(2));\n  EXPECT_FALSE(m.Matches(1));\n  EXPECT_FALSE(m.Matches(0));\n\n  m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));\n  EXPECT_TRUE(m.Matches(0));\n  EXPECT_TRUE(m.Matches(1));\n  EXPECT_FALSE(m.Matches(3));\n\n  // The following tests for varying number of sub-matchers. Due to the way\n  // the sub-matchers are handled it is enough to test every sub-matcher once\n  // with sub-matchers using the same matcher type. Varying matcher types are\n  // checked for above.\n  AllOfMatches(2, AllOf(Ne(1), Ne(2)));\n  AllOfMatches(3, AllOf(Ne(1), Ne(2), Ne(3)));\n  AllOfMatches(4, AllOf(Ne(1), Ne(2), Ne(3), Ne(4)));\n  AllOfMatches(5, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5)));\n  AllOfMatches(6, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6)));\n  AllOfMatches(7, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7)));\n  AllOfMatches(8, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7),\n                        Ne(8)));\n  AllOfMatches(9, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7),\n                        Ne(8), Ne(9)));\n  AllOfMatches(10, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),\n                         Ne(9), Ne(10)));\n}\n\n#if GTEST_LANG_CXX11\n// Tests the variadic version of the AllOfMatcher.\nTEST(AllOfTest, VariadicMatchesWhenAllMatch) {\n  // Make sure AllOf is defined in the right namespace and does not depend on\n  // ADL.\n  ::testing::AllOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);\n  Matcher<int> m = AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),\n                         Ne(9), Ne(10), Ne(11));\n  EXPECT_THAT(Describe(m), EndsWith(\"and (isn't equal to 11)\"));\n  AllOfMatches(11, m);\n  AllOfMatches(50, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),\n                         Ne(9), Ne(10), Ne(11), Ne(12), Ne(13), Ne(14), Ne(15),\n                         Ne(16), Ne(17), Ne(18), Ne(19), Ne(20), Ne(21), Ne(22),\n                         Ne(23), Ne(24), Ne(25), Ne(26), Ne(27), Ne(28), Ne(29),\n                         Ne(30), Ne(31), Ne(32), Ne(33), Ne(34), Ne(35), Ne(36),\n                         Ne(37), Ne(38), Ne(39), Ne(40), Ne(41), Ne(42), Ne(43),\n                         Ne(44), Ne(45), Ne(46), Ne(47), Ne(48), Ne(49),\n                         Ne(50)));\n}\n\n#endif  // GTEST_LANG_CXX11\n\n// Tests that AllOf(m1, ..., mn) describes itself properly.\nTEST(AllOfTest, CanDescribeSelf) {\n  Matcher<int> m;\n  m = AllOf(Le(2), Ge(1));\n  EXPECT_EQ(\"(is <= 2) and (is >= 1)\", Describe(m));\n\n  m = AllOf(Gt(0), Ne(1), Ne(2));\n  EXPECT_EQ(\"(is > 0) and \"\n            \"((isn't equal to 1) and \"\n            \"(isn't equal to 2))\",\n            Describe(m));\n\n\n  m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));\n  EXPECT_EQ(\"((is > 0) and \"\n            \"(isn't equal to 1)) and \"\n            \"((isn't equal to 2) and \"\n            \"(isn't equal to 3))\",\n            Describe(m));\n\n\n  m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));\n  EXPECT_EQ(\"((is >= 0) and \"\n            \"(is < 10)) and \"\n            \"((isn't equal to 3) and \"\n            \"((isn't equal to 5) and \"\n            \"(isn't equal to 7)))\",\n            Describe(m));\n}\n\n// Tests that AllOf(m1, ..., mn) describes its negation properly.\nTEST(AllOfTest, CanDescribeNegation) {\n  Matcher<int> m;\n  m = AllOf(Le(2), Ge(1));\n  EXPECT_EQ(\"(isn't <= 2) or \"\n            \"(isn't >= 1)\",\n            DescribeNegation(m));\n\n  m = AllOf(Gt(0), Ne(1), Ne(2));\n  EXPECT_EQ(\"(isn't > 0) or \"\n            \"((is equal to 1) or \"\n            \"(is equal to 2))\",\n            DescribeNegation(m));\n\n\n  m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));\n  EXPECT_EQ(\"((isn't > 0) or \"\n            \"(is equal to 1)) or \"\n            \"((is equal to 2) or \"\n            \"(is equal to 3))\",\n            DescribeNegation(m));\n\n\n  m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));\n  EXPECT_EQ(\"((isn't >= 0) or \"\n            \"(isn't < 10)) or \"\n            \"((is equal to 3) or \"\n            \"((is equal to 5) or \"\n            \"(is equal to 7)))\",\n            DescribeNegation(m));\n}\n\n// Tests that monomorphic matchers are safely cast by the AllOf matcher.\nTEST(AllOfTest, AllOfMatcherSafelyCastsMonomorphicMatchers) {\n  // greater_than_5 and less_than_10 are monomorphic matchers.\n  Matcher<int> greater_than_5 = Gt(5);\n  Matcher<int> less_than_10 = Lt(10);\n\n  Matcher<const int&> m = AllOf(greater_than_5, less_than_10);\n  Matcher<int&> m2 = AllOf(greater_than_5, less_than_10);\n  Matcher<int&> m3 = AllOf(greater_than_5, m2);\n\n  // Tests that BothOf works when composing itself.\n  Matcher<const int&> m4 = AllOf(greater_than_5, less_than_10, less_than_10);\n  Matcher<int&> m5 = AllOf(greater_than_5, less_than_10, less_than_10);\n}\n\nTEST(AllOfTest, ExplainsResult) {\n  Matcher<int> m;\n\n  // Successful match.  Both matchers need to explain.  The second\n  // matcher doesn't give an explanation, so only the first matcher's\n  // explanation is printed.\n  m = AllOf(GreaterThan(10), Lt(30));\n  EXPECT_EQ(\"which is 15 more than 10\", Explain(m, 25));\n\n  // Successful match.  Both matchers need to explain.\n  m = AllOf(GreaterThan(10), GreaterThan(20));\n  EXPECT_EQ(\"which is 20 more than 10, and which is 10 more than 20\",\n            Explain(m, 30));\n\n  // Successful match.  All matchers need to explain.  The second\n  // matcher doesn't given an explanation.\n  m = AllOf(GreaterThan(10), Lt(30), GreaterThan(20));\n  EXPECT_EQ(\"which is 15 more than 10, and which is 5 more than 20\",\n            Explain(m, 25));\n\n  // Successful match.  All matchers need to explain.\n  m = AllOf(GreaterThan(10), GreaterThan(20), GreaterThan(30));\n  EXPECT_EQ(\"which is 30 more than 10, and which is 20 more than 20, \"\n            \"and which is 10 more than 30\",\n            Explain(m, 40));\n\n  // Failed match.  The first matcher, which failed, needs to\n  // explain.\n  m = AllOf(GreaterThan(10), GreaterThan(20));\n  EXPECT_EQ(\"which is 5 less than 10\", Explain(m, 5));\n\n  // Failed match.  The second matcher, which failed, needs to\n  // explain.  Since it doesn't given an explanation, nothing is\n  // printed.\n  m = AllOf(GreaterThan(10), Lt(30));\n  EXPECT_EQ(\"\", Explain(m, 40));\n\n  // Failed match.  The second matcher, which failed, needs to\n  // explain.\n  m = AllOf(GreaterThan(10), GreaterThan(20));\n  EXPECT_EQ(\"which is 5 less than 20\", Explain(m, 15));\n}\n\n// Helper to allow easy testing of AnyOf matchers with num parameters.\nstatic void AnyOfMatches(int num, const Matcher<int>& m) {\n  SCOPED_TRACE(Describe(m));\n  EXPECT_FALSE(m.Matches(0));\n  for (int i = 1; i <= num; ++i) {\n    EXPECT_TRUE(m.Matches(i));\n  }\n  EXPECT_FALSE(m.Matches(num + 1));\n}\n\n#if GTEST_LANG_CXX11\nstatic void AnyOfStringMatches(int num, const Matcher<std::string>& m) {\n  SCOPED_TRACE(Describe(m));\n  EXPECT_FALSE(m.Matches(std::to_string(0)));\n\n  for (int i = 1; i <= num; ++i) {\n    EXPECT_TRUE(m.Matches(std::to_string(i)));\n  }\n  EXPECT_FALSE(m.Matches(std::to_string(num + 1)));\n}\n#endif\n\n// Tests that AnyOf(m1, ..., mn) matches any value that matches at\n// least one of the given matchers.\nTEST(AnyOfTest, MatchesWhenAnyMatches) {\n  Matcher<int> m;\n  m = AnyOf(Le(1), Ge(3));\n  EXPECT_TRUE(m.Matches(1));\n  EXPECT_TRUE(m.Matches(4));\n  EXPECT_FALSE(m.Matches(2));\n\n  m = AnyOf(Lt(0), Eq(1), Eq(2));\n  EXPECT_TRUE(m.Matches(-1));\n  EXPECT_TRUE(m.Matches(1));\n  EXPECT_TRUE(m.Matches(2));\n  EXPECT_FALSE(m.Matches(0));\n\n  m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));\n  EXPECT_TRUE(m.Matches(-1));\n  EXPECT_TRUE(m.Matches(1));\n  EXPECT_TRUE(m.Matches(2));\n  EXPECT_TRUE(m.Matches(3));\n  EXPECT_FALSE(m.Matches(0));\n\n  m = AnyOf(Le(0), Gt(10), 3, 5, 7);\n  EXPECT_TRUE(m.Matches(0));\n  EXPECT_TRUE(m.Matches(11));\n  EXPECT_TRUE(m.Matches(3));\n  EXPECT_FALSE(m.Matches(2));\n\n  // The following tests for varying number of sub-matchers. Due to the way\n  // the sub-matchers are handled it is enough to test every sub-matcher once\n  // with sub-matchers using the same matcher type. Varying matcher types are\n  // checked for above.\n  AnyOfMatches(2, AnyOf(1, 2));\n  AnyOfMatches(3, AnyOf(1, 2, 3));\n  AnyOfMatches(4, AnyOf(1, 2, 3, 4));\n  AnyOfMatches(5, AnyOf(1, 2, 3, 4, 5));\n  AnyOfMatches(6, AnyOf(1, 2, 3, 4, 5, 6));\n  AnyOfMatches(7, AnyOf(1, 2, 3, 4, 5, 6, 7));\n  AnyOfMatches(8, AnyOf(1, 2, 3, 4, 5, 6, 7, 8));\n  AnyOfMatches(9, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9));\n  AnyOfMatches(10, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));\n}\n\n#if GTEST_LANG_CXX11\n// Tests the variadic version of the AnyOfMatcher.\nTEST(AnyOfTest, VariadicMatchesWhenAnyMatches) {\n  // Also make sure AnyOf is defined in the right namespace and does not depend\n  // on ADL.\n  Matcher<int> m = ::testing::AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);\n\n  EXPECT_THAT(Describe(m), EndsWith(\"or (is equal to 11)\"));\n  AnyOfMatches(11, m);\n  AnyOfMatches(50, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,\n                         11, 12, 13, 14, 15, 16, 17, 18, 19, 20,\n                         21, 22, 23, 24, 25, 26, 27, 28, 29, 30,\n                         31, 32, 33, 34, 35, 36, 37, 38, 39, 40,\n                         41, 42, 43, 44, 45, 46, 47, 48, 49, 50));\n  AnyOfStringMatches(\n      50, AnyOf(\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\",\n                \"13\", \"14\", \"15\", \"16\", \"17\", \"18\", \"19\", \"20\", \"21\", \"22\",\n                \"23\", \"24\", \"25\", \"26\", \"27\", \"28\", \"29\", \"30\", \"31\", \"32\",\n                \"33\", \"34\", \"35\", \"36\", \"37\", \"38\", \"39\", \"40\", \"41\", \"42\",\n                \"43\", \"44\", \"45\", \"46\", \"47\", \"48\", \"49\", \"50\"));\n}\n\n// Tests the variadic version of the ElementsAreMatcher\nTEST(ElementsAreTest, HugeMatcher) {\n  vector<int> test_vector{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};\n\n  EXPECT_THAT(test_vector,\n              ElementsAre(Eq(1), Eq(2), Lt(13), Eq(4), Eq(5), Eq(6), Eq(7),\n                          Eq(8), Eq(9), Eq(10), Gt(1), Eq(12)));\n}\n\n// Tests the variadic version of the UnorderedElementsAreMatcher\nTEST(ElementsAreTest, HugeMatcherStr) {\n  vector<string> test_vector{\n      \"literal_string\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"};\n\n  EXPECT_THAT(test_vector, UnorderedElementsAre(\"literal_string\", _, _, _, _, _,\n                                                _, _, _, _, _, _));\n}\n\n// Tests the variadic version of the UnorderedElementsAreMatcher\nTEST(ElementsAreTest, HugeMatcherUnordered) {\n  vector<int> test_vector{2, 1, 8, 5, 4, 6, 7, 3, 9, 12, 11, 10};\n\n  EXPECT_THAT(test_vector, UnorderedElementsAre(\n                               Eq(2), Eq(1), Gt(7), Eq(5), Eq(4), Eq(6), Eq(7),\n                               Eq(3), Eq(9), Eq(12), Eq(11), Ne(122)));\n}\n\n#endif  // GTEST_LANG_CXX11\n\n// Tests that AnyOf(m1, ..., mn) describes itself properly.\nTEST(AnyOfTest, CanDescribeSelf) {\n  Matcher<int> m;\n  m = AnyOf(Le(1), Ge(3));\n  EXPECT_EQ(\"(is <= 1) or (is >= 3)\",\n            Describe(m));\n\n  m = AnyOf(Lt(0), Eq(1), Eq(2));\n  EXPECT_EQ(\"(is < 0) or \"\n            \"((is equal to 1) or (is equal to 2))\",\n            Describe(m));\n\n  m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));\n  EXPECT_EQ(\"((is < 0) or \"\n            \"(is equal to 1)) or \"\n            \"((is equal to 2) or \"\n            \"(is equal to 3))\",\n            Describe(m));\n\n  m = AnyOf(Le(0), Gt(10), 3, 5, 7);\n  EXPECT_EQ(\"((is <= 0) or \"\n            \"(is > 10)) or \"\n            \"((is equal to 3) or \"\n            \"((is equal to 5) or \"\n            \"(is equal to 7)))\",\n            Describe(m));\n}\n\n// Tests that AnyOf(m1, ..., mn) describes its negation properly.\nTEST(AnyOfTest, CanDescribeNegation) {\n  Matcher<int> m;\n  m = AnyOf(Le(1), Ge(3));\n  EXPECT_EQ(\"(isn't <= 1) and (isn't >= 3)\",\n            DescribeNegation(m));\n\n  m = AnyOf(Lt(0), Eq(1), Eq(2));\n  EXPECT_EQ(\"(isn't < 0) and \"\n            \"((isn't equal to 1) and (isn't equal to 2))\",\n            DescribeNegation(m));\n\n  m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));\n  EXPECT_EQ(\"((isn't < 0) and \"\n            \"(isn't equal to 1)) and \"\n            \"((isn't equal to 2) and \"\n            \"(isn't equal to 3))\",\n            DescribeNegation(m));\n\n  m = AnyOf(Le(0), Gt(10), 3, 5, 7);\n  EXPECT_EQ(\"((isn't <= 0) and \"\n            \"(isn't > 10)) and \"\n            \"((isn't equal to 3) and \"\n            \"((isn't equal to 5) and \"\n            \"(isn't equal to 7)))\",\n            DescribeNegation(m));\n}\n\n// Tests that monomorphic matchers are safely cast by the AnyOf matcher.\nTEST(AnyOfTest, AnyOfMatcherSafelyCastsMonomorphicMatchers) {\n  // greater_than_5 and less_than_10 are monomorphic matchers.\n  Matcher<int> greater_than_5 = Gt(5);\n  Matcher<int> less_than_10 = Lt(10);\n\n  Matcher<const int&> m = AnyOf(greater_than_5, less_than_10);\n  Matcher<int&> m2 = AnyOf(greater_than_5, less_than_10);\n  Matcher<int&> m3 = AnyOf(greater_than_5, m2);\n\n  // Tests that EitherOf works when composing itself.\n  Matcher<const int&> m4 = AnyOf(greater_than_5, less_than_10, less_than_10);\n  Matcher<int&> m5 = AnyOf(greater_than_5, less_than_10, less_than_10);\n}\n\nTEST(AnyOfTest, ExplainsResult) {\n  Matcher<int> m;\n\n  // Failed match.  Both matchers need to explain.  The second\n  // matcher doesn't give an explanation, so only the first matcher's\n  // explanation is printed.\n  m = AnyOf(GreaterThan(10), Lt(0));\n  EXPECT_EQ(\"which is 5 less than 10\", Explain(m, 5));\n\n  // Failed match.  Both matchers need to explain.\n  m = AnyOf(GreaterThan(10), GreaterThan(20));\n  EXPECT_EQ(\"which is 5 less than 10, and which is 15 less than 20\",\n            Explain(m, 5));\n\n  // Failed match.  All matchers need to explain.  The second\n  // matcher doesn't given an explanation.\n  m = AnyOf(GreaterThan(10), Gt(20), GreaterThan(30));\n  EXPECT_EQ(\"which is 5 less than 10, and which is 25 less than 30\",\n            Explain(m, 5));\n\n  // Failed match.  All matchers need to explain.\n  m = AnyOf(GreaterThan(10), GreaterThan(20), GreaterThan(30));\n  EXPECT_EQ(\"which is 5 less than 10, and which is 15 less than 20, \"\n            \"and which is 25 less than 30\",\n            Explain(m, 5));\n\n  // Successful match.  The first matcher, which succeeded, needs to\n  // explain.\n  m = AnyOf(GreaterThan(10), GreaterThan(20));\n  EXPECT_EQ(\"which is 5 more than 10\", Explain(m, 15));\n\n  // Successful match.  The second matcher, which succeeded, needs to\n  // explain.  Since it doesn't given an explanation, nothing is\n  // printed.\n  m = AnyOf(GreaterThan(10), Lt(30));\n  EXPECT_EQ(\"\", Explain(m, 0));\n\n  // Successful match.  The second matcher, which succeeded, needs to\n  // explain.\n  m = AnyOf(GreaterThan(30), GreaterThan(20));\n  EXPECT_EQ(\"which is 5 more than 20\", Explain(m, 25));\n}\n\n// The following predicate function and predicate functor are for\n// testing the Truly(predicate) matcher.\n\n// Returns non-zero if the input is positive.  Note that the return\n// type of this function is not bool.  It's OK as Truly() accepts any\n// unary function or functor whose return type can be implicitly\n// converted to bool.\nint IsPositive(double x) {\n  return x > 0 ? 1 : 0;\n}\n\n// This functor returns true if the input is greater than the given\n// number.\nclass IsGreaterThan {\n public:\n  explicit IsGreaterThan(int threshold) : threshold_(threshold) {}\n\n  bool operator()(int n) const { return n > threshold_; }\n\n private:\n  int threshold_;\n};\n\n// For testing Truly().\nconst int foo = 0;\n\n// This predicate returns true iff the argument references foo and has\n// a zero value.\nbool ReferencesFooAndIsZero(const int& n) {\n  return (&n == &foo) && (n == 0);\n}\n\n// Tests that Truly(predicate) matches what satisfies the given\n// predicate.\nTEST(TrulyTest, MatchesWhatSatisfiesThePredicate) {\n  Matcher<double> m = Truly(IsPositive);\n  EXPECT_TRUE(m.Matches(2.0));\n  EXPECT_FALSE(m.Matches(-1.5));\n}\n\n// Tests that Truly(predicate_functor) works too.\nTEST(TrulyTest, CanBeUsedWithFunctor) {\n  Matcher<int> m = Truly(IsGreaterThan(5));\n  EXPECT_TRUE(m.Matches(6));\n  EXPECT_FALSE(m.Matches(4));\n}\n\n// A class that can be implicitly converted to bool.\nclass ConvertibleToBool {\n public:\n  explicit ConvertibleToBool(int number) : number_(number) {}\n  operator bool() const { return number_ != 0; }\n\n private:\n  int number_;\n};\n\nConvertibleToBool IsNotZero(int number) {\n  return ConvertibleToBool(number);\n}\n\n// Tests that the predicate used in Truly() may return a class that's\n// implicitly convertible to bool, even when the class has no\n// operator!().\nTEST(TrulyTest, PredicateCanReturnAClassConvertibleToBool) {\n  Matcher<int> m = Truly(IsNotZero);\n  EXPECT_TRUE(m.Matches(1));\n  EXPECT_FALSE(m.Matches(0));\n}\n\n// Tests that Truly(predicate) can describe itself properly.\nTEST(TrulyTest, CanDescribeSelf) {\n  Matcher<double> m = Truly(IsPositive);\n  EXPECT_EQ(\"satisfies the given predicate\",\n            Describe(m));\n}\n\n// Tests that Truly(predicate) works when the matcher takes its\n// argument by reference.\nTEST(TrulyTest, WorksForByRefArguments) {\n  Matcher<const int&> m = Truly(ReferencesFooAndIsZero);\n  EXPECT_TRUE(m.Matches(foo));\n  int n = 0;\n  EXPECT_FALSE(m.Matches(n));\n}\n\n// Tests that Matches(m) is a predicate satisfied by whatever that\n// matches matcher m.\nTEST(MatchesTest, IsSatisfiedByWhatMatchesTheMatcher) {\n  EXPECT_TRUE(Matches(Ge(0))(1));\n  EXPECT_FALSE(Matches(Eq('a'))('b'));\n}\n\n// Tests that Matches(m) works when the matcher takes its argument by\n// reference.\nTEST(MatchesTest, WorksOnByRefArguments) {\n  int m = 0, n = 0;\n  EXPECT_TRUE(Matches(AllOf(Ref(n), Eq(0)))(n));\n  EXPECT_FALSE(Matches(Ref(m))(n));\n}\n\n// Tests that a Matcher on non-reference type can be used in\n// Matches().\nTEST(MatchesTest, WorksWithMatcherOnNonRefType) {\n  Matcher<int> eq5 = Eq(5);\n  EXPECT_TRUE(Matches(eq5)(5));\n  EXPECT_FALSE(Matches(eq5)(2));\n}\n\n// Tests Value(value, matcher).  Since Value() is a simple wrapper for\n// Matches(), which has been tested already, we don't spend a lot of\n// effort on testing Value().\nTEST(ValueTest, WorksWithPolymorphicMatcher) {\n  EXPECT_TRUE(Value(\"hi\", StartsWith(\"h\")));\n  EXPECT_FALSE(Value(5, Gt(10)));\n}\n\nTEST(ValueTest, WorksWithMonomorphicMatcher) {\n  const Matcher<int> is_zero = Eq(0);\n  EXPECT_TRUE(Value(0, is_zero));\n  EXPECT_FALSE(Value('a', is_zero));\n\n  int n = 0;\n  const Matcher<const int&> ref_n = Ref(n);\n  EXPECT_TRUE(Value(n, ref_n));\n  EXPECT_FALSE(Value(1, ref_n));\n}\n\nTEST(ExplainMatchResultTest, WorksWithPolymorphicMatcher) {\n  StringMatchResultListener listener1;\n  EXPECT_TRUE(ExplainMatchResult(PolymorphicIsEven(), 42, &listener1));\n  EXPECT_EQ(\"% 2 == 0\", listener1.str());\n\n  StringMatchResultListener listener2;\n  EXPECT_FALSE(ExplainMatchResult(Ge(42), 1.5, &listener2));\n  EXPECT_EQ(\"\", listener2.str());\n}\n\nTEST(ExplainMatchResultTest, WorksWithMonomorphicMatcher) {\n  const Matcher<int> is_even = PolymorphicIsEven();\n  StringMatchResultListener listener1;\n  EXPECT_TRUE(ExplainMatchResult(is_even, 42, &listener1));\n  EXPECT_EQ(\"% 2 == 0\", listener1.str());\n\n  const Matcher<const double&> is_zero = Eq(0);\n  StringMatchResultListener listener2;\n  EXPECT_FALSE(ExplainMatchResult(is_zero, 1.5, &listener2));\n  EXPECT_EQ(\"\", listener2.str());\n}\n\nMATCHER_P(Really, inner_matcher, \"\") {\n  return ExplainMatchResult(inner_matcher, arg, result_listener);\n}\n\nTEST(ExplainMatchResultTest, WorksInsideMATCHER) {\n  EXPECT_THAT(0, Really(Eq(0)));\n}\n\nTEST(DescribeMatcherTest, WorksWithValue) {\n  EXPECT_EQ(\"is equal to 42\", DescribeMatcher<int>(42));\n  EXPECT_EQ(\"isn't equal to 42\", DescribeMatcher<int>(42, true));\n}\n\nTEST(DescribeMatcherTest, WorksWithMonomorphicMatcher) {\n  const Matcher<int> monomorphic = Le(0);\n  EXPECT_EQ(\"is <= 0\", DescribeMatcher<int>(monomorphic));\n  EXPECT_EQ(\"isn't <= 0\", DescribeMatcher<int>(monomorphic, true));\n}\n\nTEST(DescribeMatcherTest, WorksWithPolymorphicMatcher) {\n  EXPECT_EQ(\"is even\", DescribeMatcher<int>(PolymorphicIsEven()));\n  EXPECT_EQ(\"is odd\", DescribeMatcher<int>(PolymorphicIsEven(), true));\n}\n\nTEST(AllArgsTest, WorksForTuple) {\n  EXPECT_THAT(make_tuple(1, 2L), AllArgs(Lt()));\n  EXPECT_THAT(make_tuple(2L, 1), Not(AllArgs(Lt())));\n}\n\nTEST(AllArgsTest, WorksForNonTuple) {\n  EXPECT_THAT(42, AllArgs(Gt(0)));\n  EXPECT_THAT('a', Not(AllArgs(Eq('b'))));\n}\n\nclass AllArgsHelper {\n public:\n  AllArgsHelper() {}\n\n  MOCK_METHOD2(Helper, int(char x, int y));\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(AllArgsHelper);\n};\n\nTEST(AllArgsTest, WorksInWithClause) {\n  AllArgsHelper helper;\n  ON_CALL(helper, Helper(_, _))\n      .With(AllArgs(Lt()))\n      .WillByDefault(Return(1));\n  EXPECT_CALL(helper, Helper(_, _));\n  EXPECT_CALL(helper, Helper(_, _))\n      .With(AllArgs(Gt()))\n      .WillOnce(Return(2));\n\n  EXPECT_EQ(1, helper.Helper('\\1', 2));\n  EXPECT_EQ(2, helper.Helper('a', 1));\n}\n\nclass OptionalMatchersHelper {\n public:\n  OptionalMatchersHelper() {}\n\n  MOCK_METHOD0(NoArgs, int());\n\n  MOCK_METHOD1(OneArg, int(int y));\n\n  MOCK_METHOD2(TwoArgs, int(char x, int y));\n\n  MOCK_METHOD1(Overloaded, int(char x));\n  MOCK_METHOD2(Overloaded, int(char x, int y));\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(OptionalMatchersHelper);\n};\n\nTEST(AllArgsTest, WorksWithoutMatchers) {\n  OptionalMatchersHelper helper;\n\n  ON_CALL(helper, NoArgs).WillByDefault(Return(10));\n  ON_CALL(helper, OneArg).WillByDefault(Return(20));\n  ON_CALL(helper, TwoArgs).WillByDefault(Return(30));\n\n  EXPECT_EQ(10, helper.NoArgs());\n  EXPECT_EQ(20, helper.OneArg(1));\n  EXPECT_EQ(30, helper.TwoArgs('\\1', 2));\n\n  EXPECT_CALL(helper, NoArgs).Times(1);\n  EXPECT_CALL(helper, OneArg).WillOnce(Return(100));\n  EXPECT_CALL(helper, OneArg(17)).WillOnce(Return(200));\n  EXPECT_CALL(helper, TwoArgs).Times(0);\n\n  EXPECT_EQ(10, helper.NoArgs());\n  EXPECT_EQ(100, helper.OneArg(1));\n  EXPECT_EQ(200, helper.OneArg(17));\n}\n\n// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value\n// matches the matcher.\nTEST(MatcherAssertionTest, WorksWhenMatcherIsSatisfied) {\n  ASSERT_THAT(5, Ge(2)) << \"This should succeed.\";\n  ASSERT_THAT(\"Foo\", EndsWith(\"oo\"));\n  EXPECT_THAT(2, AllOf(Le(7), Ge(0))) << \"This should succeed too.\";\n  EXPECT_THAT(\"Hello\", StartsWith(\"Hell\"));\n}\n\n// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value\n// doesn't match the matcher.\nTEST(MatcherAssertionTest, WorksWhenMatcherIsNotSatisfied) {\n  // 'n' must be static as it is used in an EXPECT_FATAL_FAILURE(),\n  // which cannot reference auto variables.\n  static unsigned short n;  // NOLINT\n  n = 5;\n\n  // VC++ prior to version 8.0 SP1 has a bug where it will not see any\n  // functions declared in the namespace scope from within nested classes.\n  // EXPECT/ASSERT_(NON)FATAL_FAILURE macros use nested classes so that all\n  // namespace-level functions invoked inside them need to be explicitly\n  // resolved.\n  EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Gt(10)),\n                       \"Value of: n\\n\"\n                       \"Expected: is > 10\\n\"\n                       \"  Actual: 5\" + OfType(\"unsigned short\"));\n  n = 0;\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_THAT(n, ::testing::AllOf(::testing::Le(7), ::testing::Ge(5))),\n      \"Value of: n\\n\"\n      \"Expected: (is <= 7) and (is >= 5)\\n\"\n      \"  Actual: 0\" + OfType(\"unsigned short\"));\n}\n\n// Tests that ASSERT_THAT() and EXPECT_THAT() work when the argument\n// has a reference type.\nTEST(MatcherAssertionTest, WorksForByRefArguments) {\n  // We use a static variable here as EXPECT_FATAL_FAILURE() cannot\n  // reference auto variables.\n  static int n;\n  n = 0;\n  EXPECT_THAT(n, AllOf(Le(7), Ref(n)));\n  EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))),\n                       \"Value of: n\\n\"\n                       \"Expected: does not reference the variable @\");\n  // Tests the \"Actual\" part.\n  EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))),\n                       \"Actual: 0\" + OfType(\"int\") + \", which is located @\");\n}\n\n#if !GTEST_OS_SYMBIAN\n// Tests that ASSERT_THAT() and EXPECT_THAT() work when the matcher is\n// monomorphic.\n\n// ASSERT_THAT(\"hello\", starts_with_he) fails to compile with Nokia's\n// Symbian compiler: it tries to compile\n// template<T, U> class MatcherCastImpl { ...\n//   virtual bool MatchAndExplain(T x, ...) const {\n//     return source_matcher_.MatchAndExplain(static_cast<U>(x), ...);\n// with U == string and T == const char*\n// With ASSERT_THAT(\"hello\"...) changed to ASSERT_THAT(string(\"hello\") ... )\n// the compiler silently crashes with no output.\n// If MatcherCastImpl is changed to use U(x) instead of static_cast<U>(x)\n// the code compiles but the converted string is bogus.\nTEST(MatcherAssertionTest, WorksForMonomorphicMatcher) {\n  Matcher<const char*> starts_with_he = StartsWith(\"he\");\n  ASSERT_THAT(\"hello\", starts_with_he);\n\n  Matcher<const std::string&> ends_with_ok = EndsWith(\"ok\");\n  ASSERT_THAT(\"book\", ends_with_ok);\n  const std::string bad = \"bad\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_THAT(bad, ends_with_ok),\n                          \"Value of: bad\\n\"\n                          \"Expected: ends with \\\"ok\\\"\\n\"\n                          \"  Actual: \\\"bad\\\"\");\n  Matcher<int> is_greater_than_5 = Gt(5);\n  EXPECT_NONFATAL_FAILURE(EXPECT_THAT(5, is_greater_than_5),\n                          \"Value of: 5\\n\"\n                          \"Expected: is > 5\\n\"\n                          \"  Actual: 5\" + OfType(\"int\"));\n}\n#endif  // !GTEST_OS_SYMBIAN\n\n// Tests floating-point matchers.\ntemplate <typename RawType>\nclass FloatingPointTest : public testing::Test {\n protected:\n  typedef testing::internal::FloatingPoint<RawType> Floating;\n  typedef typename Floating::Bits Bits;\n\n  FloatingPointTest()\n      : max_ulps_(Floating::kMaxUlps),\n        zero_bits_(Floating(0).bits()),\n        one_bits_(Floating(1).bits()),\n        infinity_bits_(Floating(Floating::Infinity()).bits()),\n        close_to_positive_zero_(\n            Floating::ReinterpretBits(zero_bits_ + max_ulps_/2)),\n        close_to_negative_zero_(\n            -Floating::ReinterpretBits(zero_bits_ + max_ulps_ - max_ulps_/2)),\n        further_from_negative_zero_(-Floating::ReinterpretBits(\n            zero_bits_ + max_ulps_ + 1 - max_ulps_/2)),\n        close_to_one_(Floating::ReinterpretBits(one_bits_ + max_ulps_)),\n        further_from_one_(Floating::ReinterpretBits(one_bits_ + max_ulps_ + 1)),\n        infinity_(Floating::Infinity()),\n        close_to_infinity_(\n            Floating::ReinterpretBits(infinity_bits_ - max_ulps_)),\n        further_from_infinity_(\n            Floating::ReinterpretBits(infinity_bits_ - max_ulps_ - 1)),\n        max_(Floating::Max()),\n        nan1_(Floating::ReinterpretBits(Floating::kExponentBitMask | 1)),\n        nan2_(Floating::ReinterpretBits(Floating::kExponentBitMask | 200)) {\n  }\n\n  void TestSize() {\n    EXPECT_EQ(sizeof(RawType), sizeof(Bits));\n  }\n\n  // A battery of tests for FloatingEqMatcher::Matches.\n  // matcher_maker is a pointer to a function which creates a FloatingEqMatcher.\n  void TestMatches(\n      testing::internal::FloatingEqMatcher<RawType> (*matcher_maker)(RawType)) {\n    Matcher<RawType> m1 = matcher_maker(0.0);\n    EXPECT_TRUE(m1.Matches(-0.0));\n    EXPECT_TRUE(m1.Matches(close_to_positive_zero_));\n    EXPECT_TRUE(m1.Matches(close_to_negative_zero_));\n    EXPECT_FALSE(m1.Matches(1.0));\n\n    Matcher<RawType> m2 = matcher_maker(close_to_positive_zero_);\n    EXPECT_FALSE(m2.Matches(further_from_negative_zero_));\n\n    Matcher<RawType> m3 = matcher_maker(1.0);\n    EXPECT_TRUE(m3.Matches(close_to_one_));\n    EXPECT_FALSE(m3.Matches(further_from_one_));\n\n    // Test commutativity: matcher_maker(0.0).Matches(1.0) was tested above.\n    EXPECT_FALSE(m3.Matches(0.0));\n\n    Matcher<RawType> m4 = matcher_maker(-infinity_);\n    EXPECT_TRUE(m4.Matches(-close_to_infinity_));\n\n    Matcher<RawType> m5 = matcher_maker(infinity_);\n    EXPECT_TRUE(m5.Matches(close_to_infinity_));\n\n    // This is interesting as the representations of infinity_ and nan1_\n    // are only 1 DLP apart.\n    EXPECT_FALSE(m5.Matches(nan1_));\n\n    // matcher_maker can produce a Matcher<const RawType&>, which is needed in\n    // some cases.\n    Matcher<const RawType&> m6 = matcher_maker(0.0);\n    EXPECT_TRUE(m6.Matches(-0.0));\n    EXPECT_TRUE(m6.Matches(close_to_positive_zero_));\n    EXPECT_FALSE(m6.Matches(1.0));\n\n    // matcher_maker can produce a Matcher<RawType&>, which is needed in some\n    // cases.\n    Matcher<RawType&> m7 = matcher_maker(0.0);\n    RawType x = 0.0;\n    EXPECT_TRUE(m7.Matches(x));\n    x = 0.01f;\n    EXPECT_FALSE(m7.Matches(x));\n  }\n\n  // Pre-calculated numbers to be used by the tests.\n\n  const Bits max_ulps_;\n\n  const Bits zero_bits_;  // The bits that represent 0.0.\n  const Bits one_bits_;  // The bits that represent 1.0.\n  const Bits infinity_bits_;  // The bits that represent +infinity.\n\n  // Some numbers close to 0.0.\n  const RawType close_to_positive_zero_;\n  const RawType close_to_negative_zero_;\n  const RawType further_from_negative_zero_;\n\n  // Some numbers close to 1.0.\n  const RawType close_to_one_;\n  const RawType further_from_one_;\n\n  // Some numbers close to +infinity.\n  const RawType infinity_;\n  const RawType close_to_infinity_;\n  const RawType further_from_infinity_;\n\n  // Maximum representable value that's not infinity.\n  const RawType max_;\n\n  // Some NaNs.\n  const RawType nan1_;\n  const RawType nan2_;\n};\n\n// Tests floating-point matchers with fixed epsilons.\ntemplate <typename RawType>\nclass FloatingPointNearTest : public FloatingPointTest<RawType> {\n protected:\n  typedef FloatingPointTest<RawType> ParentType;\n\n  // A battery of tests for FloatingEqMatcher::Matches with a fixed epsilon.\n  // matcher_maker is a pointer to a function which creates a FloatingEqMatcher.\n  void TestNearMatches(\n      testing::internal::FloatingEqMatcher<RawType>\n          (*matcher_maker)(RawType, RawType)) {\n    Matcher<RawType> m1 = matcher_maker(0.0, 0.0);\n    EXPECT_TRUE(m1.Matches(0.0));\n    EXPECT_TRUE(m1.Matches(-0.0));\n    EXPECT_FALSE(m1.Matches(ParentType::close_to_positive_zero_));\n    EXPECT_FALSE(m1.Matches(ParentType::close_to_negative_zero_));\n    EXPECT_FALSE(m1.Matches(1.0));\n\n    Matcher<RawType> m2 = matcher_maker(0.0, 1.0);\n    EXPECT_TRUE(m2.Matches(0.0));\n    EXPECT_TRUE(m2.Matches(-0.0));\n    EXPECT_TRUE(m2.Matches(1.0));\n    EXPECT_TRUE(m2.Matches(-1.0));\n    EXPECT_FALSE(m2.Matches(ParentType::close_to_one_));\n    EXPECT_FALSE(m2.Matches(-ParentType::close_to_one_));\n\n    // Check that inf matches inf, regardless of the of the specified max\n    // absolute error.\n    Matcher<RawType> m3 = matcher_maker(ParentType::infinity_, 0.0);\n    EXPECT_TRUE(m3.Matches(ParentType::infinity_));\n    EXPECT_FALSE(m3.Matches(ParentType::close_to_infinity_));\n    EXPECT_FALSE(m3.Matches(-ParentType::infinity_));\n\n    Matcher<RawType> m4 = matcher_maker(-ParentType::infinity_, 0.0);\n    EXPECT_TRUE(m4.Matches(-ParentType::infinity_));\n    EXPECT_FALSE(m4.Matches(-ParentType::close_to_infinity_));\n    EXPECT_FALSE(m4.Matches(ParentType::infinity_));\n\n    // Test various overflow scenarios.\n    Matcher<RawType> m5 = matcher_maker(ParentType::max_, ParentType::max_);\n    EXPECT_TRUE(m5.Matches(ParentType::max_));\n    EXPECT_FALSE(m5.Matches(-ParentType::max_));\n\n    Matcher<RawType> m6 = matcher_maker(-ParentType::max_, ParentType::max_);\n    EXPECT_FALSE(m6.Matches(ParentType::max_));\n    EXPECT_TRUE(m6.Matches(-ParentType::max_));\n\n    Matcher<RawType> m7 = matcher_maker(ParentType::max_, 0);\n    EXPECT_TRUE(m7.Matches(ParentType::max_));\n    EXPECT_FALSE(m7.Matches(-ParentType::max_));\n\n    Matcher<RawType> m8 = matcher_maker(-ParentType::max_, 0);\n    EXPECT_FALSE(m8.Matches(ParentType::max_));\n    EXPECT_TRUE(m8.Matches(-ParentType::max_));\n\n    // The difference between max() and -max() normally overflows to infinity,\n    // but it should still match if the max_abs_error is also infinity.\n    Matcher<RawType> m9 = matcher_maker(\n        ParentType::max_, ParentType::infinity_);\n    EXPECT_TRUE(m8.Matches(-ParentType::max_));\n\n    // matcher_maker can produce a Matcher<const RawType&>, which is needed in\n    // some cases.\n    Matcher<const RawType&> m10 = matcher_maker(0.0, 1.0);\n    EXPECT_TRUE(m10.Matches(-0.0));\n    EXPECT_TRUE(m10.Matches(ParentType::close_to_positive_zero_));\n    EXPECT_FALSE(m10.Matches(ParentType::close_to_one_));\n\n    // matcher_maker can produce a Matcher<RawType&>, which is needed in some\n    // cases.\n    Matcher<RawType&> m11 = matcher_maker(0.0, 1.0);\n    RawType x = 0.0;\n    EXPECT_TRUE(m11.Matches(x));\n    x = 1.0f;\n    EXPECT_TRUE(m11.Matches(x));\n    x = -1.0f;\n    EXPECT_TRUE(m11.Matches(x));\n    x = 1.1f;\n    EXPECT_FALSE(m11.Matches(x));\n    x = -1.1f;\n    EXPECT_FALSE(m11.Matches(x));\n  }\n};\n\n// Instantiate FloatingPointTest for testing floats.\ntypedef FloatingPointTest<float> FloatTest;\n\nTEST_F(FloatTest, FloatEqApproximatelyMatchesFloats) {\n  TestMatches(&FloatEq);\n}\n\nTEST_F(FloatTest, NanSensitiveFloatEqApproximatelyMatchesFloats) {\n  TestMatches(&NanSensitiveFloatEq);\n}\n\nTEST_F(FloatTest, FloatEqCannotMatchNaN) {\n  // FloatEq never matches NaN.\n  Matcher<float> m = FloatEq(nan1_);\n  EXPECT_FALSE(m.Matches(nan1_));\n  EXPECT_FALSE(m.Matches(nan2_));\n  EXPECT_FALSE(m.Matches(1.0));\n}\n\nTEST_F(FloatTest, NanSensitiveFloatEqCanMatchNaN) {\n  // NanSensitiveFloatEq will match NaN.\n  Matcher<float> m = NanSensitiveFloatEq(nan1_);\n  EXPECT_TRUE(m.Matches(nan1_));\n  EXPECT_TRUE(m.Matches(nan2_));\n  EXPECT_FALSE(m.Matches(1.0));\n}\n\nTEST_F(FloatTest, FloatEqCanDescribeSelf) {\n  Matcher<float> m1 = FloatEq(2.0f);\n  EXPECT_EQ(\"is approximately 2\", Describe(m1));\n  EXPECT_EQ(\"isn't approximately 2\", DescribeNegation(m1));\n\n  Matcher<float> m2 = FloatEq(0.5f);\n  EXPECT_EQ(\"is approximately 0.5\", Describe(m2));\n  EXPECT_EQ(\"isn't approximately 0.5\", DescribeNegation(m2));\n\n  Matcher<float> m3 = FloatEq(nan1_);\n  EXPECT_EQ(\"never matches\", Describe(m3));\n  EXPECT_EQ(\"is anything\", DescribeNegation(m3));\n}\n\nTEST_F(FloatTest, NanSensitiveFloatEqCanDescribeSelf) {\n  Matcher<float> m1 = NanSensitiveFloatEq(2.0f);\n  EXPECT_EQ(\"is approximately 2\", Describe(m1));\n  EXPECT_EQ(\"isn't approximately 2\", DescribeNegation(m1));\n\n  Matcher<float> m2 = NanSensitiveFloatEq(0.5f);\n  EXPECT_EQ(\"is approximately 0.5\", Describe(m2));\n  EXPECT_EQ(\"isn't approximately 0.5\", DescribeNegation(m2));\n\n  Matcher<float> m3 = NanSensitiveFloatEq(nan1_);\n  EXPECT_EQ(\"is NaN\", Describe(m3));\n  EXPECT_EQ(\"isn't NaN\", DescribeNegation(m3));\n}\n\n// Instantiate FloatingPointTest for testing floats with a user-specified\n// max absolute error.\ntypedef FloatingPointNearTest<float> FloatNearTest;\n\nTEST_F(FloatNearTest, FloatNearMatches) {\n  TestNearMatches(&FloatNear);\n}\n\nTEST_F(FloatNearTest, NanSensitiveFloatNearApproximatelyMatchesFloats) {\n  TestNearMatches(&NanSensitiveFloatNear);\n}\n\nTEST_F(FloatNearTest, FloatNearCanDescribeSelf) {\n  Matcher<float> m1 = FloatNear(2.0f, 0.5f);\n  EXPECT_EQ(\"is approximately 2 (absolute error <= 0.5)\", Describe(m1));\n  EXPECT_EQ(\n      \"isn't approximately 2 (absolute error > 0.5)\", DescribeNegation(m1));\n\n  Matcher<float> m2 = FloatNear(0.5f, 0.5f);\n  EXPECT_EQ(\"is approximately 0.5 (absolute error <= 0.5)\", Describe(m2));\n  EXPECT_EQ(\n      \"isn't approximately 0.5 (absolute error > 0.5)\", DescribeNegation(m2));\n\n  Matcher<float> m3 = FloatNear(nan1_, 0.0);\n  EXPECT_EQ(\"never matches\", Describe(m3));\n  EXPECT_EQ(\"is anything\", DescribeNegation(m3));\n}\n\nTEST_F(FloatNearTest, NanSensitiveFloatNearCanDescribeSelf) {\n  Matcher<float> m1 = NanSensitiveFloatNear(2.0f, 0.5f);\n  EXPECT_EQ(\"is approximately 2 (absolute error <= 0.5)\", Describe(m1));\n  EXPECT_EQ(\n      \"isn't approximately 2 (absolute error > 0.5)\", DescribeNegation(m1));\n\n  Matcher<float> m2 = NanSensitiveFloatNear(0.5f, 0.5f);\n  EXPECT_EQ(\"is approximately 0.5 (absolute error <= 0.5)\", Describe(m2));\n  EXPECT_EQ(\n      \"isn't approximately 0.5 (absolute error > 0.5)\", DescribeNegation(m2));\n\n  Matcher<float> m3 = NanSensitiveFloatNear(nan1_, 0.1f);\n  EXPECT_EQ(\"is NaN\", Describe(m3));\n  EXPECT_EQ(\"isn't NaN\", DescribeNegation(m3));\n}\n\nTEST_F(FloatNearTest, FloatNearCannotMatchNaN) {\n  // FloatNear never matches NaN.\n  Matcher<float> m = FloatNear(ParentType::nan1_, 0.1f);\n  EXPECT_FALSE(m.Matches(nan1_));\n  EXPECT_FALSE(m.Matches(nan2_));\n  EXPECT_FALSE(m.Matches(1.0));\n}\n\nTEST_F(FloatNearTest, NanSensitiveFloatNearCanMatchNaN) {\n  // NanSensitiveFloatNear will match NaN.\n  Matcher<float> m = NanSensitiveFloatNear(nan1_, 0.1f);\n  EXPECT_TRUE(m.Matches(nan1_));\n  EXPECT_TRUE(m.Matches(nan2_));\n  EXPECT_FALSE(m.Matches(1.0));\n}\n\n// Instantiate FloatingPointTest for testing doubles.\ntypedef FloatingPointTest<double> DoubleTest;\n\nTEST_F(DoubleTest, DoubleEqApproximatelyMatchesDoubles) {\n  TestMatches(&DoubleEq);\n}\n\nTEST_F(DoubleTest, NanSensitiveDoubleEqApproximatelyMatchesDoubles) {\n  TestMatches(&NanSensitiveDoubleEq);\n}\n\nTEST_F(DoubleTest, DoubleEqCannotMatchNaN) {\n  // DoubleEq never matches NaN.\n  Matcher<double> m = DoubleEq(nan1_);\n  EXPECT_FALSE(m.Matches(nan1_));\n  EXPECT_FALSE(m.Matches(nan2_));\n  EXPECT_FALSE(m.Matches(1.0));\n}\n\nTEST_F(DoubleTest, NanSensitiveDoubleEqCanMatchNaN) {\n  // NanSensitiveDoubleEq will match NaN.\n  Matcher<double> m = NanSensitiveDoubleEq(nan1_);\n  EXPECT_TRUE(m.Matches(nan1_));\n  EXPECT_TRUE(m.Matches(nan2_));\n  EXPECT_FALSE(m.Matches(1.0));\n}\n\nTEST_F(DoubleTest, DoubleEqCanDescribeSelf) {\n  Matcher<double> m1 = DoubleEq(2.0);\n  EXPECT_EQ(\"is approximately 2\", Describe(m1));\n  EXPECT_EQ(\"isn't approximately 2\", DescribeNegation(m1));\n\n  Matcher<double> m2 = DoubleEq(0.5);\n  EXPECT_EQ(\"is approximately 0.5\", Describe(m2));\n  EXPECT_EQ(\"isn't approximately 0.5\", DescribeNegation(m2));\n\n  Matcher<double> m3 = DoubleEq(nan1_);\n  EXPECT_EQ(\"never matches\", Describe(m3));\n  EXPECT_EQ(\"is anything\", DescribeNegation(m3));\n}\n\nTEST_F(DoubleTest, NanSensitiveDoubleEqCanDescribeSelf) {\n  Matcher<double> m1 = NanSensitiveDoubleEq(2.0);\n  EXPECT_EQ(\"is approximately 2\", Describe(m1));\n  EXPECT_EQ(\"isn't approximately 2\", DescribeNegation(m1));\n\n  Matcher<double> m2 = NanSensitiveDoubleEq(0.5);\n  EXPECT_EQ(\"is approximately 0.5\", Describe(m2));\n  EXPECT_EQ(\"isn't approximately 0.5\", DescribeNegation(m2));\n\n  Matcher<double> m3 = NanSensitiveDoubleEq(nan1_);\n  EXPECT_EQ(\"is NaN\", Describe(m3));\n  EXPECT_EQ(\"isn't NaN\", DescribeNegation(m3));\n}\n\n// Instantiate FloatingPointTest for testing floats with a user-specified\n// max absolute error.\ntypedef FloatingPointNearTest<double> DoubleNearTest;\n\nTEST_F(DoubleNearTest, DoubleNearMatches) {\n  TestNearMatches(&DoubleNear);\n}\n\nTEST_F(DoubleNearTest, NanSensitiveDoubleNearApproximatelyMatchesDoubles) {\n  TestNearMatches(&NanSensitiveDoubleNear);\n}\n\nTEST_F(DoubleNearTest, DoubleNearCanDescribeSelf) {\n  Matcher<double> m1 = DoubleNear(2.0, 0.5);\n  EXPECT_EQ(\"is approximately 2 (absolute error <= 0.5)\", Describe(m1));\n  EXPECT_EQ(\n      \"isn't approximately 2 (absolute error > 0.5)\", DescribeNegation(m1));\n\n  Matcher<double> m2 = DoubleNear(0.5, 0.5);\n  EXPECT_EQ(\"is approximately 0.5 (absolute error <= 0.5)\", Describe(m2));\n  EXPECT_EQ(\n      \"isn't approximately 0.5 (absolute error > 0.5)\", DescribeNegation(m2));\n\n  Matcher<double> m3 = DoubleNear(nan1_, 0.0);\n  EXPECT_EQ(\"never matches\", Describe(m3));\n  EXPECT_EQ(\"is anything\", DescribeNegation(m3));\n}\n\nTEST_F(DoubleNearTest, ExplainsResultWhenMatchFails) {\n  EXPECT_EQ(\"\", Explain(DoubleNear(2.0, 0.1), 2.05));\n  EXPECT_EQ(\"which is 0.2 from 2\", Explain(DoubleNear(2.0, 0.1), 2.2));\n  EXPECT_EQ(\"which is -0.3 from 2\", Explain(DoubleNear(2.0, 0.1), 1.7));\n\n  const std::string explanation =\n      Explain(DoubleNear(2.1, 1e-10), 2.1 + 1.2e-10);\n  // Different C++ implementations may print floating-point numbers\n  // slightly differently.\n  EXPECT_TRUE(explanation == \"which is 1.2e-10 from 2.1\" ||  // GCC\n              explanation == \"which is 1.2e-010 from 2.1\")   // MSVC\n      << \" where explanation is \\\"\" << explanation << \"\\\".\";\n}\n\nTEST_F(DoubleNearTest, NanSensitiveDoubleNearCanDescribeSelf) {\n  Matcher<double> m1 = NanSensitiveDoubleNear(2.0, 0.5);\n  EXPECT_EQ(\"is approximately 2 (absolute error <= 0.5)\", Describe(m1));\n  EXPECT_EQ(\n      \"isn't approximately 2 (absolute error > 0.5)\", DescribeNegation(m1));\n\n  Matcher<double> m2 = NanSensitiveDoubleNear(0.5, 0.5);\n  EXPECT_EQ(\"is approximately 0.5 (absolute error <= 0.5)\", Describe(m2));\n  EXPECT_EQ(\n      \"isn't approximately 0.5 (absolute error > 0.5)\", DescribeNegation(m2));\n\n  Matcher<double> m3 = NanSensitiveDoubleNear(nan1_, 0.1);\n  EXPECT_EQ(\"is NaN\", Describe(m3));\n  EXPECT_EQ(\"isn't NaN\", DescribeNegation(m3));\n}\n\nTEST_F(DoubleNearTest, DoubleNearCannotMatchNaN) {\n  // DoubleNear never matches NaN.\n  Matcher<double> m = DoubleNear(ParentType::nan1_, 0.1);\n  EXPECT_FALSE(m.Matches(nan1_));\n  EXPECT_FALSE(m.Matches(nan2_));\n  EXPECT_FALSE(m.Matches(1.0));\n}\n\nTEST_F(DoubleNearTest, NanSensitiveDoubleNearCanMatchNaN) {\n  // NanSensitiveDoubleNear will match NaN.\n  Matcher<double> m = NanSensitiveDoubleNear(nan1_, 0.1);\n  EXPECT_TRUE(m.Matches(nan1_));\n  EXPECT_TRUE(m.Matches(nan2_));\n  EXPECT_FALSE(m.Matches(1.0));\n}\n\nTEST(PointeeTest, RawPointer) {\n  const Matcher<int*> m = Pointee(Ge(0));\n\n  int n = 1;\n  EXPECT_TRUE(m.Matches(&n));\n  n = -1;\n  EXPECT_FALSE(m.Matches(&n));\n  EXPECT_FALSE(m.Matches(NULL));\n}\n\nTEST(PointeeTest, RawPointerToConst) {\n  const Matcher<const double*> m = Pointee(Ge(0));\n\n  double x = 1;\n  EXPECT_TRUE(m.Matches(&x));\n  x = -1;\n  EXPECT_FALSE(m.Matches(&x));\n  EXPECT_FALSE(m.Matches(NULL));\n}\n\nTEST(PointeeTest, ReferenceToConstRawPointer) {\n  const Matcher<int* const &> m = Pointee(Ge(0));\n\n  int n = 1;\n  EXPECT_TRUE(m.Matches(&n));\n  n = -1;\n  EXPECT_FALSE(m.Matches(&n));\n  EXPECT_FALSE(m.Matches(NULL));\n}\n\nTEST(PointeeTest, ReferenceToNonConstRawPointer) {\n  const Matcher<double* &> m = Pointee(Ge(0));\n\n  double x = 1.0;\n  double* p = &x;\n  EXPECT_TRUE(m.Matches(p));\n  x = -1;\n  EXPECT_FALSE(m.Matches(p));\n  p = NULL;\n  EXPECT_FALSE(m.Matches(p));\n}\n\nMATCHER_P(FieldIIs, inner_matcher, \"\") {\n  return ExplainMatchResult(inner_matcher, arg.i, result_listener);\n}\n\n#if GTEST_HAS_RTTI\nTEST(WhenDynamicCastToTest, SameType) {\n  Derived derived;\n  derived.i = 4;\n\n  // Right type. A pointer is passed down.\n  Base* as_base_ptr = &derived;\n  EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(Not(IsNull())));\n  EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(Pointee(FieldIIs(4))));\n  EXPECT_THAT(as_base_ptr,\n              Not(WhenDynamicCastTo<Derived*>(Pointee(FieldIIs(5)))));\n}\n\nTEST(WhenDynamicCastToTest, WrongTypes) {\n  Base base;\n  Derived derived;\n  OtherDerived other_derived;\n\n  // Wrong types. NULL is passed.\n  EXPECT_THAT(&base, Not(WhenDynamicCastTo<Derived*>(Pointee(_))));\n  EXPECT_THAT(&base, WhenDynamicCastTo<Derived*>(IsNull()));\n  Base* as_base_ptr = &derived;\n  EXPECT_THAT(as_base_ptr, Not(WhenDynamicCastTo<OtherDerived*>(Pointee(_))));\n  EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<OtherDerived*>(IsNull()));\n  as_base_ptr = &other_derived;\n  EXPECT_THAT(as_base_ptr, Not(WhenDynamicCastTo<Derived*>(Pointee(_))));\n  EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(IsNull()));\n}\n\nTEST(WhenDynamicCastToTest, AlreadyNull) {\n  // Already NULL.\n  Base* as_base_ptr = NULL;\n  EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(IsNull()));\n}\n\nstruct AmbiguousCastTypes {\n  class VirtualDerived : public virtual Base {};\n  class DerivedSub1 : public VirtualDerived {};\n  class DerivedSub2 : public VirtualDerived {};\n  class ManyDerivedInHierarchy : public DerivedSub1, public DerivedSub2 {};\n};\n\nTEST(WhenDynamicCastToTest, AmbiguousCast) {\n  AmbiguousCastTypes::DerivedSub1 sub1;\n  AmbiguousCastTypes::ManyDerivedInHierarchy many_derived;\n  // Multiply derived from Base. dynamic_cast<> returns NULL.\n  Base* as_base_ptr =\n      static_cast<AmbiguousCastTypes::DerivedSub1*>(&many_derived);\n  EXPECT_THAT(as_base_ptr,\n              WhenDynamicCastTo<AmbiguousCastTypes::VirtualDerived*>(IsNull()));\n  as_base_ptr = &sub1;\n  EXPECT_THAT(\n      as_base_ptr,\n      WhenDynamicCastTo<AmbiguousCastTypes::VirtualDerived*>(Not(IsNull())));\n}\n\nTEST(WhenDynamicCastToTest, Describe) {\n  Matcher<Base*> matcher = WhenDynamicCastTo<Derived*>(Pointee(_));\n  const std::string prefix =\n      \"when dynamic_cast to \" + internal::GetTypeName<Derived*>() + \", \";\n  EXPECT_EQ(prefix + \"points to a value that is anything\", Describe(matcher));\n  EXPECT_EQ(prefix + \"does not point to a value that is anything\",\n            DescribeNegation(matcher));\n}\n\nTEST(WhenDynamicCastToTest, Explain) {\n  Matcher<Base*> matcher = WhenDynamicCastTo<Derived*>(Pointee(_));\n  Base* null = NULL;\n  EXPECT_THAT(Explain(matcher, null), HasSubstr(\"NULL\"));\n  Derived derived;\n  EXPECT_TRUE(matcher.Matches(&derived));\n  EXPECT_THAT(Explain(matcher, &derived), HasSubstr(\"which points to \"));\n\n  // With references, the matcher itself can fail. Test for that one.\n  Matcher<const Base&> ref_matcher = WhenDynamicCastTo<const OtherDerived&>(_);\n  EXPECT_THAT(Explain(ref_matcher, derived),\n              HasSubstr(\"which cannot be dynamic_cast\"));\n}\n\nTEST(WhenDynamicCastToTest, GoodReference) {\n  Derived derived;\n  derived.i = 4;\n  Base& as_base_ref = derived;\n  EXPECT_THAT(as_base_ref, WhenDynamicCastTo<const Derived&>(FieldIIs(4)));\n  EXPECT_THAT(as_base_ref, WhenDynamicCastTo<const Derived&>(Not(FieldIIs(5))));\n}\n\nTEST(WhenDynamicCastToTest, BadReference) {\n  Derived derived;\n  Base& as_base_ref = derived;\n  EXPECT_THAT(as_base_ref, Not(WhenDynamicCastTo<const OtherDerived&>(_)));\n}\n#endif  // GTEST_HAS_RTTI\n\n// Minimal const-propagating pointer.\ntemplate <typename T>\nclass ConstPropagatingPtr {\n public:\n  typedef T element_type;\n\n  ConstPropagatingPtr() : val_() {}\n  explicit ConstPropagatingPtr(T* t) : val_(t) {}\n  ConstPropagatingPtr(const ConstPropagatingPtr& other) : val_(other.val_) {}\n\n  T* get() { return val_; }\n  T& operator*() { return *val_; }\n  // Most smart pointers return non-const T* and T& from the next methods.\n  const T* get() const { return val_; }\n  const T& operator*() const { return *val_; }\n\n private:\n  T* val_;\n};\n\nTEST(PointeeTest, WorksWithConstPropagatingPointers) {\n  const Matcher< ConstPropagatingPtr<int> > m = Pointee(Lt(5));\n  int three = 3;\n  const ConstPropagatingPtr<int> co(&three);\n  ConstPropagatingPtr<int> o(&three);\n  EXPECT_TRUE(m.Matches(o));\n  EXPECT_TRUE(m.Matches(co));\n  *o = 6;\n  EXPECT_FALSE(m.Matches(o));\n  EXPECT_FALSE(m.Matches(ConstPropagatingPtr<int>()));\n}\n\nTEST(PointeeTest, NeverMatchesNull) {\n  const Matcher<const char*> m = Pointee(_);\n  EXPECT_FALSE(m.Matches(NULL));\n}\n\n// Tests that we can write Pointee(value) instead of Pointee(Eq(value)).\nTEST(PointeeTest, MatchesAgainstAValue) {\n  const Matcher<int*> m = Pointee(5);\n\n  int n = 5;\n  EXPECT_TRUE(m.Matches(&n));\n  n = -1;\n  EXPECT_FALSE(m.Matches(&n));\n  EXPECT_FALSE(m.Matches(NULL));\n}\n\nTEST(PointeeTest, CanDescribeSelf) {\n  const Matcher<int*> m = Pointee(Gt(3));\n  EXPECT_EQ(\"points to a value that is > 3\", Describe(m));\n  EXPECT_EQ(\"does not point to a value that is > 3\",\n            DescribeNegation(m));\n}\n\nTEST(PointeeTest, CanExplainMatchResult) {\n  const Matcher<const std::string*> m = Pointee(StartsWith(\"Hi\"));\n\n  EXPECT_EQ(\"\", Explain(m, static_cast<const std::string*>(NULL)));\n\n  const Matcher<long*> m2 = Pointee(GreaterThan(1));  // NOLINT\n  long n = 3;  // NOLINT\n  EXPECT_EQ(\"which points to 3\" + OfType(\"long\") + \", which is 2 more than 1\",\n            Explain(m2, &n));\n}\n\nTEST(PointeeTest, AlwaysExplainsPointee) {\n  const Matcher<int*> m = Pointee(0);\n  int n = 42;\n  EXPECT_EQ(\"which points to 42\" + OfType(\"int\"), Explain(m, &n));\n}\n\n// An uncopyable class.\nclass Uncopyable {\n public:\n  Uncopyable() : value_(-1) {}\n  explicit Uncopyable(int a_value) : value_(a_value) {}\n\n  int value() const { return value_; }\n  void set_value(int i) { value_ = i; }\n\n private:\n  int value_;\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Uncopyable);\n};\n\n// Returns true iff x.value() is positive.\nbool ValueIsPositive(const Uncopyable& x) { return x.value() > 0; }\n\nMATCHER_P(UncopyableIs, inner_matcher, \"\") {\n  return ExplainMatchResult(inner_matcher, arg.value(), result_listener);\n}\n\n// A user-defined struct for testing Field().\nstruct AStruct {\n  AStruct() : x(0), y(1.0), z(5), p(NULL) {}\n  AStruct(const AStruct& rhs)\n      : x(rhs.x), y(rhs.y), z(rhs.z.value()), p(rhs.p) {}\n\n  int x;           // A non-const field.\n  const double y;  // A const field.\n  Uncopyable z;    // An uncopyable field.\n  const char* p;   // A pointer field.\n\n private:\n  GTEST_DISALLOW_ASSIGN_(AStruct);\n};\n\n// A derived struct for testing Field().\nstruct DerivedStruct : public AStruct {\n  char ch;\n\n private:\n  GTEST_DISALLOW_ASSIGN_(DerivedStruct);\n};\n\n// Tests that Field(&Foo::field, ...) works when field is non-const.\nTEST(FieldTest, WorksForNonConstField) {\n  Matcher<AStruct> m = Field(&AStruct::x, Ge(0));\n  Matcher<AStruct> m_with_name = Field(\"x\", &AStruct::x, Ge(0));\n\n  AStruct a;\n  EXPECT_TRUE(m.Matches(a));\n  EXPECT_TRUE(m_with_name.Matches(a));\n  a.x = -1;\n  EXPECT_FALSE(m.Matches(a));\n  EXPECT_FALSE(m_with_name.Matches(a));\n}\n\n// Tests that Field(&Foo::field, ...) works when field is const.\nTEST(FieldTest, WorksForConstField) {\n  AStruct a;\n\n  Matcher<AStruct> m = Field(&AStruct::y, Ge(0.0));\n  Matcher<AStruct> m_with_name = Field(\"y\", &AStruct::y, Ge(0.0));\n  EXPECT_TRUE(m.Matches(a));\n  EXPECT_TRUE(m_with_name.Matches(a));\n  m = Field(&AStruct::y, Le(0.0));\n  m_with_name = Field(\"y\", &AStruct::y, Le(0.0));\n  EXPECT_FALSE(m.Matches(a));\n  EXPECT_FALSE(m_with_name.Matches(a));\n}\n\n// Tests that Field(&Foo::field, ...) works when field is not copyable.\nTEST(FieldTest, WorksForUncopyableField) {\n  AStruct a;\n\n  Matcher<AStruct> m = Field(&AStruct::z, Truly(ValueIsPositive));\n  EXPECT_TRUE(m.Matches(a));\n  m = Field(&AStruct::z, Not(Truly(ValueIsPositive)));\n  EXPECT_FALSE(m.Matches(a));\n}\n\n// Tests that Field(&Foo::field, ...) works when field is a pointer.\nTEST(FieldTest, WorksForPointerField) {\n  // Matching against NULL.\n  Matcher<AStruct> m = Field(&AStruct::p, static_cast<const char*>(NULL));\n  AStruct a;\n  EXPECT_TRUE(m.Matches(a));\n  a.p = \"hi\";\n  EXPECT_FALSE(m.Matches(a));\n\n  // Matching a pointer that is not NULL.\n  m = Field(&AStruct::p, StartsWith(\"hi\"));\n  a.p = \"hill\";\n  EXPECT_TRUE(m.Matches(a));\n  a.p = \"hole\";\n  EXPECT_FALSE(m.Matches(a));\n}\n\n// Tests that Field() works when the object is passed by reference.\nTEST(FieldTest, WorksForByRefArgument) {\n  Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));\n\n  AStruct a;\n  EXPECT_TRUE(m.Matches(a));\n  a.x = -1;\n  EXPECT_FALSE(m.Matches(a));\n}\n\n// Tests that Field(&Foo::field, ...) works when the argument's type\n// is a sub-type of Foo.\nTEST(FieldTest, WorksForArgumentOfSubType) {\n  // Note that the matcher expects DerivedStruct but we say AStruct\n  // inside Field().\n  Matcher<const DerivedStruct&> m = Field(&AStruct::x, Ge(0));\n\n  DerivedStruct d;\n  EXPECT_TRUE(m.Matches(d));\n  d.x = -1;\n  EXPECT_FALSE(m.Matches(d));\n}\n\n// Tests that Field(&Foo::field, m) works when field's type and m's\n// argument type are compatible but not the same.\nTEST(FieldTest, WorksForCompatibleMatcherType) {\n  // The field is an int, but the inner matcher expects a signed char.\n  Matcher<const AStruct&> m = Field(&AStruct::x,\n                                    Matcher<signed char>(Ge(0)));\n\n  AStruct a;\n  EXPECT_TRUE(m.Matches(a));\n  a.x = -1;\n  EXPECT_FALSE(m.Matches(a));\n}\n\n// Tests that Field() can describe itself.\nTEST(FieldTest, CanDescribeSelf) {\n  Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));\n\n  EXPECT_EQ(\"is an object whose given field is >= 0\", Describe(m));\n  EXPECT_EQ(\"is an object whose given field isn't >= 0\", DescribeNegation(m));\n}\n\nTEST(FieldTest, CanDescribeSelfWithFieldName) {\n  Matcher<const AStruct&> m = Field(\"field_name\", &AStruct::x, Ge(0));\n\n  EXPECT_EQ(\"is an object whose field `field_name` is >= 0\", Describe(m));\n  EXPECT_EQ(\"is an object whose field `field_name` isn't >= 0\",\n            DescribeNegation(m));\n}\n\n// Tests that Field() can explain the match result.\nTEST(FieldTest, CanExplainMatchResult) {\n  Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));\n\n  AStruct a;\n  a.x = 1;\n  EXPECT_EQ(\"whose given field is 1\" + OfType(\"int\"), Explain(m, a));\n\n  m = Field(&AStruct::x, GreaterThan(0));\n  EXPECT_EQ(\n      \"whose given field is 1\" + OfType(\"int\") + \", which is 1 more than 0\",\n      Explain(m, a));\n}\n\nTEST(FieldTest, CanExplainMatchResultWithFieldName) {\n  Matcher<const AStruct&> m = Field(\"field_name\", &AStruct::x, Ge(0));\n\n  AStruct a;\n  a.x = 1;\n  EXPECT_EQ(\"whose field `field_name` is 1\" + OfType(\"int\"), Explain(m, a));\n\n  m = Field(\"field_name\", &AStruct::x, GreaterThan(0));\n  EXPECT_EQ(\"whose field `field_name` is 1\" + OfType(\"int\") +\n                \", which is 1 more than 0\",\n            Explain(m, a));\n}\n\n// Tests that Field() works when the argument is a pointer to const.\nTEST(FieldForPointerTest, WorksForPointerToConst) {\n  Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));\n\n  AStruct a;\n  EXPECT_TRUE(m.Matches(&a));\n  a.x = -1;\n  EXPECT_FALSE(m.Matches(&a));\n}\n\n// Tests that Field() works when the argument is a pointer to non-const.\nTEST(FieldForPointerTest, WorksForPointerToNonConst) {\n  Matcher<AStruct*> m = Field(&AStruct::x, Ge(0));\n\n  AStruct a;\n  EXPECT_TRUE(m.Matches(&a));\n  a.x = -1;\n  EXPECT_FALSE(m.Matches(&a));\n}\n\n// Tests that Field() works when the argument is a reference to a const pointer.\nTEST(FieldForPointerTest, WorksForReferenceToConstPointer) {\n  Matcher<AStruct* const&> m = Field(&AStruct::x, Ge(0));\n\n  AStruct a;\n  EXPECT_TRUE(m.Matches(&a));\n  a.x = -1;\n  EXPECT_FALSE(m.Matches(&a));\n}\n\n// Tests that Field() does not match the NULL pointer.\nTEST(FieldForPointerTest, DoesNotMatchNull) {\n  Matcher<const AStruct*> m = Field(&AStruct::x, _);\n  EXPECT_FALSE(m.Matches(NULL));\n}\n\n// Tests that Field(&Foo::field, ...) works when the argument's type\n// is a sub-type of const Foo*.\nTEST(FieldForPointerTest, WorksForArgumentOfSubType) {\n  // Note that the matcher expects DerivedStruct but we say AStruct\n  // inside Field().\n  Matcher<DerivedStruct*> m = Field(&AStruct::x, Ge(0));\n\n  DerivedStruct d;\n  EXPECT_TRUE(m.Matches(&d));\n  d.x = -1;\n  EXPECT_FALSE(m.Matches(&d));\n}\n\n// Tests that Field() can describe itself when used to match a pointer.\nTEST(FieldForPointerTest, CanDescribeSelf) {\n  Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));\n\n  EXPECT_EQ(\"is an object whose given field is >= 0\", Describe(m));\n  EXPECT_EQ(\"is an object whose given field isn't >= 0\", DescribeNegation(m));\n}\n\nTEST(FieldForPointerTest, CanDescribeSelfWithFieldName) {\n  Matcher<const AStruct*> m = Field(\"field_name\", &AStruct::x, Ge(0));\n\n  EXPECT_EQ(\"is an object whose field `field_name` is >= 0\", Describe(m));\n  EXPECT_EQ(\"is an object whose field `field_name` isn't >= 0\",\n            DescribeNegation(m));\n}\n\n// Tests that Field() can explain the result of matching a pointer.\nTEST(FieldForPointerTest, CanExplainMatchResult) {\n  Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));\n\n  AStruct a;\n  a.x = 1;\n  EXPECT_EQ(\"\", Explain(m, static_cast<const AStruct*>(NULL)));\n  EXPECT_EQ(\"which points to an object whose given field is 1\" + OfType(\"int\"),\n            Explain(m, &a));\n\n  m = Field(&AStruct::x, GreaterThan(0));\n  EXPECT_EQ(\"which points to an object whose given field is 1\" + OfType(\"int\") +\n            \", which is 1 more than 0\", Explain(m, &a));\n}\n\nTEST(FieldForPointerTest, CanExplainMatchResultWithFieldName) {\n  Matcher<const AStruct*> m = Field(\"field_name\", &AStruct::x, Ge(0));\n\n  AStruct a;\n  a.x = 1;\n  EXPECT_EQ(\"\", Explain(m, static_cast<const AStruct*>(NULL)));\n  EXPECT_EQ(\n      \"which points to an object whose field `field_name` is 1\" + OfType(\"int\"),\n      Explain(m, &a));\n\n  m = Field(\"field_name\", &AStruct::x, GreaterThan(0));\n  EXPECT_EQ(\"which points to an object whose field `field_name` is 1\" +\n                OfType(\"int\") + \", which is 1 more than 0\",\n            Explain(m, &a));\n}\n\n// A user-defined class for testing Property().\nclass AClass {\n public:\n  AClass() : n_(0) {}\n\n  // A getter that returns a non-reference.\n  int n() const { return n_; }\n\n  void set_n(int new_n) { n_ = new_n; }\n\n  // A getter that returns a reference to const.\n  const std::string& s() const { return s_; }\n\n#if GTEST_LANG_CXX11\n  const std::string& s_ref() const & { return s_; }\n#endif\n\n  void set_s(const std::string& new_s) { s_ = new_s; }\n\n  // A getter that returns a reference to non-const.\n  double& x() const { return x_; }\n\n private:\n  int n_;\n  std::string s_;\n\n  static double x_;\n};\n\ndouble AClass::x_ = 0.0;\n\n// A derived class for testing Property().\nclass DerivedClass : public AClass {\n public:\n  int k() const { return k_; }\n private:\n  int k_;\n};\n\n// Tests that Property(&Foo::property, ...) works when property()\n// returns a non-reference.\nTEST(PropertyTest, WorksForNonReferenceProperty) {\n  Matcher<const AClass&> m = Property(&AClass::n, Ge(0));\n  Matcher<const AClass&> m_with_name = Property(\"n\", &AClass::n, Ge(0));\n\n  AClass a;\n  a.set_n(1);\n  EXPECT_TRUE(m.Matches(a));\n  EXPECT_TRUE(m_with_name.Matches(a));\n\n  a.set_n(-1);\n  EXPECT_FALSE(m.Matches(a));\n  EXPECT_FALSE(m_with_name.Matches(a));\n}\n\n// Tests that Property(&Foo::property, ...) works when property()\n// returns a reference to const.\nTEST(PropertyTest, WorksForReferenceToConstProperty) {\n  Matcher<const AClass&> m = Property(&AClass::s, StartsWith(\"hi\"));\n  Matcher<const AClass&> m_with_name =\n      Property(\"s\", &AClass::s, StartsWith(\"hi\"));\n\n  AClass a;\n  a.set_s(\"hill\");\n  EXPECT_TRUE(m.Matches(a));\n  EXPECT_TRUE(m_with_name.Matches(a));\n\n  a.set_s(\"hole\");\n  EXPECT_FALSE(m.Matches(a));\n  EXPECT_FALSE(m_with_name.Matches(a));\n}\n\n#if GTEST_LANG_CXX11\n// Tests that Property(&Foo::property, ...) works when property() is\n// ref-qualified.\nTEST(PropertyTest, WorksForRefQualifiedProperty) {\n  Matcher<const AClass&> m = Property(&AClass::s_ref, StartsWith(\"hi\"));\n  Matcher<const AClass&> m_with_name =\n      Property(\"s\", &AClass::s_ref, StartsWith(\"hi\"));\n\n  AClass a;\n  a.set_s(\"hill\");\n  EXPECT_TRUE(m.Matches(a));\n  EXPECT_TRUE(m_with_name.Matches(a));\n\n  a.set_s(\"hole\");\n  EXPECT_FALSE(m.Matches(a));\n  EXPECT_FALSE(m_with_name.Matches(a));\n}\n#endif\n\n// Tests that Property(&Foo::property, ...) works when property()\n// returns a reference to non-const.\nTEST(PropertyTest, WorksForReferenceToNonConstProperty) {\n  double x = 0.0;\n  AClass a;\n\n  Matcher<const AClass&> m = Property(&AClass::x, Ref(x));\n  EXPECT_FALSE(m.Matches(a));\n\n  m = Property(&AClass::x, Not(Ref(x)));\n  EXPECT_TRUE(m.Matches(a));\n}\n\n// Tests that Property(&Foo::property, ...) works when the argument is\n// passed by value.\nTEST(PropertyTest, WorksForByValueArgument) {\n  Matcher<AClass> m = Property(&AClass::s, StartsWith(\"hi\"));\n\n  AClass a;\n  a.set_s(\"hill\");\n  EXPECT_TRUE(m.Matches(a));\n\n  a.set_s(\"hole\");\n  EXPECT_FALSE(m.Matches(a));\n}\n\n// Tests that Property(&Foo::property, ...) works when the argument's\n// type is a sub-type of Foo.\nTEST(PropertyTest, WorksForArgumentOfSubType) {\n  // The matcher expects a DerivedClass, but inside the Property() we\n  // say AClass.\n  Matcher<const DerivedClass&> m = Property(&AClass::n, Ge(0));\n\n  DerivedClass d;\n  d.set_n(1);\n  EXPECT_TRUE(m.Matches(d));\n\n  d.set_n(-1);\n  EXPECT_FALSE(m.Matches(d));\n}\n\n// Tests that Property(&Foo::property, m) works when property()'s type\n// and m's argument type are compatible but different.\nTEST(PropertyTest, WorksForCompatibleMatcherType) {\n  // n() returns an int but the inner matcher expects a signed char.\n  Matcher<const AClass&> m = Property(&AClass::n,\n                                      Matcher<signed char>(Ge(0)));\n\n  Matcher<const AClass&> m_with_name =\n      Property(\"n\", &AClass::n, Matcher<signed char>(Ge(0)));\n\n  AClass a;\n  EXPECT_TRUE(m.Matches(a));\n  EXPECT_TRUE(m_with_name.Matches(a));\n  a.set_n(-1);\n  EXPECT_FALSE(m.Matches(a));\n  EXPECT_FALSE(m_with_name.Matches(a));\n}\n\n// Tests that Property() can describe itself.\nTEST(PropertyTest, CanDescribeSelf) {\n  Matcher<const AClass&> m = Property(&AClass::n, Ge(0));\n\n  EXPECT_EQ(\"is an object whose given property is >= 0\", Describe(m));\n  EXPECT_EQ(\"is an object whose given property isn't >= 0\",\n            DescribeNegation(m));\n}\n\nTEST(PropertyTest, CanDescribeSelfWithPropertyName) {\n  Matcher<const AClass&> m = Property(\"fancy_name\", &AClass::n, Ge(0));\n\n  EXPECT_EQ(\"is an object whose property `fancy_name` is >= 0\", Describe(m));\n  EXPECT_EQ(\"is an object whose property `fancy_name` isn't >= 0\",\n            DescribeNegation(m));\n}\n\n// Tests that Property() can explain the match result.\nTEST(PropertyTest, CanExplainMatchResult) {\n  Matcher<const AClass&> m = Property(&AClass::n, Ge(0));\n\n  AClass a;\n  a.set_n(1);\n  EXPECT_EQ(\"whose given property is 1\" + OfType(\"int\"), Explain(m, a));\n\n  m = Property(&AClass::n, GreaterThan(0));\n  EXPECT_EQ(\n      \"whose given property is 1\" + OfType(\"int\") + \", which is 1 more than 0\",\n      Explain(m, a));\n}\n\nTEST(PropertyTest, CanExplainMatchResultWithPropertyName) {\n  Matcher<const AClass&> m = Property(\"fancy_name\", &AClass::n, Ge(0));\n\n  AClass a;\n  a.set_n(1);\n  EXPECT_EQ(\"whose property `fancy_name` is 1\" + OfType(\"int\"), Explain(m, a));\n\n  m = Property(\"fancy_name\", &AClass::n, GreaterThan(0));\n  EXPECT_EQ(\"whose property `fancy_name` is 1\" + OfType(\"int\") +\n                \", which is 1 more than 0\",\n            Explain(m, a));\n}\n\n// Tests that Property() works when the argument is a pointer to const.\nTEST(PropertyForPointerTest, WorksForPointerToConst) {\n  Matcher<const AClass*> m = Property(&AClass::n, Ge(0));\n\n  AClass a;\n  a.set_n(1);\n  EXPECT_TRUE(m.Matches(&a));\n\n  a.set_n(-1);\n  EXPECT_FALSE(m.Matches(&a));\n}\n\n// Tests that Property() works when the argument is a pointer to non-const.\nTEST(PropertyForPointerTest, WorksForPointerToNonConst) {\n  Matcher<AClass*> m = Property(&AClass::s, StartsWith(\"hi\"));\n\n  AClass a;\n  a.set_s(\"hill\");\n  EXPECT_TRUE(m.Matches(&a));\n\n  a.set_s(\"hole\");\n  EXPECT_FALSE(m.Matches(&a));\n}\n\n// Tests that Property() works when the argument is a reference to a\n// const pointer.\nTEST(PropertyForPointerTest, WorksForReferenceToConstPointer) {\n  Matcher<AClass* const&> m = Property(&AClass::s, StartsWith(\"hi\"));\n\n  AClass a;\n  a.set_s(\"hill\");\n  EXPECT_TRUE(m.Matches(&a));\n\n  a.set_s(\"hole\");\n  EXPECT_FALSE(m.Matches(&a));\n}\n\n// Tests that Property() does not match the NULL pointer.\nTEST(PropertyForPointerTest, WorksForReferenceToNonConstProperty) {\n  Matcher<const AClass*> m = Property(&AClass::x, _);\n  EXPECT_FALSE(m.Matches(NULL));\n}\n\n// Tests that Property(&Foo::property, ...) works when the argument's\n// type is a sub-type of const Foo*.\nTEST(PropertyForPointerTest, WorksForArgumentOfSubType) {\n  // The matcher expects a DerivedClass, but inside the Property() we\n  // say AClass.\n  Matcher<const DerivedClass*> m = Property(&AClass::n, Ge(0));\n\n  DerivedClass d;\n  d.set_n(1);\n  EXPECT_TRUE(m.Matches(&d));\n\n  d.set_n(-1);\n  EXPECT_FALSE(m.Matches(&d));\n}\n\n// Tests that Property() can describe itself when used to match a pointer.\nTEST(PropertyForPointerTest, CanDescribeSelf) {\n  Matcher<const AClass*> m = Property(&AClass::n, Ge(0));\n\n  EXPECT_EQ(\"is an object whose given property is >= 0\", Describe(m));\n  EXPECT_EQ(\"is an object whose given property isn't >= 0\",\n            DescribeNegation(m));\n}\n\nTEST(PropertyForPointerTest, CanDescribeSelfWithPropertyDescription) {\n  Matcher<const AClass*> m = Property(\"fancy_name\", &AClass::n, Ge(0));\n\n  EXPECT_EQ(\"is an object whose property `fancy_name` is >= 0\", Describe(m));\n  EXPECT_EQ(\"is an object whose property `fancy_name` isn't >= 0\",\n            DescribeNegation(m));\n}\n\n// Tests that Property() can explain the result of matching a pointer.\nTEST(PropertyForPointerTest, CanExplainMatchResult) {\n  Matcher<const AClass*> m = Property(&AClass::n, Ge(0));\n\n  AClass a;\n  a.set_n(1);\n  EXPECT_EQ(\"\", Explain(m, static_cast<const AClass*>(NULL)));\n  EXPECT_EQ(\n      \"which points to an object whose given property is 1\" + OfType(\"int\"),\n      Explain(m, &a));\n\n  m = Property(&AClass::n, GreaterThan(0));\n  EXPECT_EQ(\"which points to an object whose given property is 1\" +\n            OfType(\"int\") + \", which is 1 more than 0\",\n            Explain(m, &a));\n}\n\nTEST(PropertyForPointerTest, CanExplainMatchResultWithPropertyName) {\n  Matcher<const AClass*> m = Property(\"fancy_name\", &AClass::n, Ge(0));\n\n  AClass a;\n  a.set_n(1);\n  EXPECT_EQ(\"\", Explain(m, static_cast<const AClass*>(NULL)));\n  EXPECT_EQ(\"which points to an object whose property `fancy_name` is 1\" +\n                OfType(\"int\"),\n            Explain(m, &a));\n\n  m = Property(\"fancy_name\", &AClass::n, GreaterThan(0));\n  EXPECT_EQ(\"which points to an object whose property `fancy_name` is 1\" +\n                OfType(\"int\") + \", which is 1 more than 0\",\n            Explain(m, &a));\n}\n\n// Tests ResultOf.\n\n// Tests that ResultOf(f, ...) compiles and works as expected when f is a\n// function pointer.\nstd::string IntToStringFunction(int input) {\n  return input == 1 ? \"foo\" : \"bar\";\n}\n\nTEST(ResultOfTest, WorksForFunctionPointers) {\n  Matcher<int> matcher = ResultOf(&IntToStringFunction, Eq(std::string(\"foo\")));\n\n  EXPECT_TRUE(matcher.Matches(1));\n  EXPECT_FALSE(matcher.Matches(2));\n}\n\n// Tests that ResultOf() can describe itself.\nTEST(ResultOfTest, CanDescribeItself) {\n  Matcher<int> matcher = ResultOf(&IntToStringFunction, StrEq(\"foo\"));\n\n  EXPECT_EQ(\"is mapped by the given callable to a value that \"\n            \"is equal to \\\"foo\\\"\", Describe(matcher));\n  EXPECT_EQ(\"is mapped by the given callable to a value that \"\n            \"isn't equal to \\\"foo\\\"\", DescribeNegation(matcher));\n}\n\n// Tests that ResultOf() can explain the match result.\nint IntFunction(int input) { return input == 42 ? 80 : 90; }\n\nTEST(ResultOfTest, CanExplainMatchResult) {\n  Matcher<int> matcher = ResultOf(&IntFunction, Ge(85));\n  EXPECT_EQ(\"which is mapped by the given callable to 90\" + OfType(\"int\"),\n            Explain(matcher, 36));\n\n  matcher = ResultOf(&IntFunction, GreaterThan(85));\n  EXPECT_EQ(\"which is mapped by the given callable to 90\" + OfType(\"int\") +\n            \", which is 5 more than 85\", Explain(matcher, 36));\n}\n\n// Tests that ResultOf(f, ...) compiles and works as expected when f(x)\n// returns a non-reference.\nTEST(ResultOfTest, WorksForNonReferenceResults) {\n  Matcher<int> matcher = ResultOf(&IntFunction, Eq(80));\n\n  EXPECT_TRUE(matcher.Matches(42));\n  EXPECT_FALSE(matcher.Matches(36));\n}\n\n// Tests that ResultOf(f, ...) compiles and works as expected when f(x)\n// returns a reference to non-const.\ndouble& DoubleFunction(double& input) { return input; }  // NOLINT\n\nUncopyable& RefUncopyableFunction(Uncopyable& obj) {  // NOLINT\n  return obj;\n}\n\nTEST(ResultOfTest, WorksForReferenceToNonConstResults) {\n  double x = 3.14;\n  double x2 = x;\n  Matcher<double&> matcher = ResultOf(&DoubleFunction, Ref(x));\n\n  EXPECT_TRUE(matcher.Matches(x));\n  EXPECT_FALSE(matcher.Matches(x2));\n\n  // Test that ResultOf works with uncopyable objects\n  Uncopyable obj(0);\n  Uncopyable obj2(0);\n  Matcher<Uncopyable&> matcher2 =\n      ResultOf(&RefUncopyableFunction, Ref(obj));\n\n  EXPECT_TRUE(matcher2.Matches(obj));\n  EXPECT_FALSE(matcher2.Matches(obj2));\n}\n\n// Tests that ResultOf(f, ...) compiles and works as expected when f(x)\n// returns a reference to const.\nconst std::string& StringFunction(const std::string& input) { return input; }\n\nTEST(ResultOfTest, WorksForReferenceToConstResults) {\n  std::string s = \"foo\";\n  std::string s2 = s;\n  Matcher<const std::string&> matcher = ResultOf(&StringFunction, Ref(s));\n\n  EXPECT_TRUE(matcher.Matches(s));\n  EXPECT_FALSE(matcher.Matches(s2));\n}\n\n// Tests that ResultOf(f, m) works when f(x) and m's\n// argument types are compatible but different.\nTEST(ResultOfTest, WorksForCompatibleMatcherTypes) {\n  // IntFunction() returns int but the inner matcher expects a signed char.\n  Matcher<int> matcher = ResultOf(IntFunction, Matcher<signed char>(Ge(85)));\n\n  EXPECT_TRUE(matcher.Matches(36));\n  EXPECT_FALSE(matcher.Matches(42));\n}\n\n// Tests that the program aborts when ResultOf is passed\n// a NULL function pointer.\nTEST(ResultOfDeathTest, DiesOnNullFunctionPointers) {\n  EXPECT_DEATH_IF_SUPPORTED(\n      ResultOf(static_cast<std::string (*)(int dummy)>(NULL),\n               Eq(std::string(\"foo\"))),\n      \"NULL function pointer is passed into ResultOf\\\\(\\\\)\\\\.\");\n}\n\n// Tests that ResultOf(f, ...) compiles and works as expected when f is a\n// function reference.\nTEST(ResultOfTest, WorksForFunctionReferences) {\n  Matcher<int> matcher = ResultOf(IntToStringFunction, StrEq(\"foo\"));\n  EXPECT_TRUE(matcher.Matches(1));\n  EXPECT_FALSE(matcher.Matches(2));\n}\n\n// Tests that ResultOf(f, ...) compiles and works as expected when f is a\n// function object.\nstruct Functor : public ::std::unary_function<int, std::string> {\n  result_type operator()(argument_type input) const {\n    return IntToStringFunction(input);\n  }\n};\n\nTEST(ResultOfTest, WorksForFunctors) {\n  Matcher<int> matcher = ResultOf(Functor(), Eq(std::string(\"foo\")));\n\n  EXPECT_TRUE(matcher.Matches(1));\n  EXPECT_FALSE(matcher.Matches(2));\n}\n\n// Tests that ResultOf(f, ...) compiles and works as expected when f is a\n// functor with more than one operator() defined. ResultOf() must work\n// for each defined operator().\nstruct PolymorphicFunctor {\n  typedef int result_type;\n  int operator()(int n) { return n; }\n  int operator()(const char* s) { return static_cast<int>(strlen(s)); }\n  std::string operator()(int *p) { return p ? \"good ptr\" : \"null\"; }\n};\n\nTEST(ResultOfTest, WorksForPolymorphicFunctors) {\n  Matcher<int> matcher_int = ResultOf(PolymorphicFunctor(), Ge(5));\n\n  EXPECT_TRUE(matcher_int.Matches(10));\n  EXPECT_FALSE(matcher_int.Matches(2));\n\n  Matcher<const char*> matcher_string = ResultOf(PolymorphicFunctor(), Ge(5));\n\n  EXPECT_TRUE(matcher_string.Matches(\"long string\"));\n  EXPECT_FALSE(matcher_string.Matches(\"shrt\"));\n}\n\n#if GTEST_LANG_CXX11\nTEST(ResultOfTest, WorksForPolymorphicFunctorsIgnoringResultType) {\n  Matcher<int*> matcher = ResultOf(PolymorphicFunctor(), \"good ptr\");\n\n  int n = 0;\n  EXPECT_TRUE(matcher.Matches(&n));\n  EXPECT_FALSE(matcher.Matches(nullptr));\n}\n\nTEST(ResultOfTest, WorksForLambdas) {\n  Matcher<int> matcher =\n      ResultOf([](int str_len) { return std::string(str_len, 'x'); }, \"xxx\");\n  EXPECT_TRUE(matcher.Matches(3));\n  EXPECT_FALSE(matcher.Matches(1));\n}\n#endif\n\nconst int* ReferencingFunction(const int& n) { return &n; }\n\nstruct ReferencingFunctor {\n  typedef const int* result_type;\n  result_type operator()(const int& n) { return &n; }\n};\n\nTEST(ResultOfTest, WorksForReferencingCallables) {\n  const int n = 1;\n  const int n2 = 1;\n  Matcher<const int&> matcher2 = ResultOf(ReferencingFunction, Eq(&n));\n  EXPECT_TRUE(matcher2.Matches(n));\n  EXPECT_FALSE(matcher2.Matches(n2));\n\n  Matcher<const int&> matcher3 = ResultOf(ReferencingFunctor(), Eq(&n));\n  EXPECT_TRUE(matcher3.Matches(n));\n  EXPECT_FALSE(matcher3.Matches(n2));\n}\n\nclass DivisibleByImpl {\n public:\n  explicit DivisibleByImpl(int a_divider) : divider_(a_divider) {}\n\n  // For testing using ExplainMatchResultTo() with polymorphic matchers.\n  template <typename T>\n  bool MatchAndExplain(const T& n, MatchResultListener* listener) const {\n    *listener << \"which is \" << (n % divider_) << \" modulo \"\n              << divider_;\n    return (n % divider_) == 0;\n  }\n\n  void DescribeTo(ostream* os) const {\n    *os << \"is divisible by \" << divider_;\n  }\n\n  void DescribeNegationTo(ostream* os) const {\n    *os << \"is not divisible by \" << divider_;\n  }\n\n  void set_divider(int a_divider) { divider_ = a_divider; }\n  int divider() const { return divider_; }\n\n private:\n  int divider_;\n};\n\nPolymorphicMatcher<DivisibleByImpl> DivisibleBy(int n) {\n  return MakePolymorphicMatcher(DivisibleByImpl(n));\n}\n\n// Tests that when AllOf() fails, only the first failing matcher is\n// asked to explain why.\nTEST(ExplainMatchResultTest, AllOf_False_False) {\n  const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3));\n  EXPECT_EQ(\"which is 1 modulo 4\", Explain(m, 5));\n}\n\n// Tests that when AllOf() fails, only the first failing matcher is\n// asked to explain why.\nTEST(ExplainMatchResultTest, AllOf_False_True) {\n  const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3));\n  EXPECT_EQ(\"which is 2 modulo 4\", Explain(m, 6));\n}\n\n// Tests that when AllOf() fails, only the first failing matcher is\n// asked to explain why.\nTEST(ExplainMatchResultTest, AllOf_True_False) {\n  const Matcher<int> m = AllOf(Ge(1), DivisibleBy(3));\n  EXPECT_EQ(\"which is 2 modulo 3\", Explain(m, 5));\n}\n\n// Tests that when AllOf() succeeds, all matchers are asked to explain\n// why.\nTEST(ExplainMatchResultTest, AllOf_True_True) {\n  const Matcher<int> m = AllOf(DivisibleBy(2), DivisibleBy(3));\n  EXPECT_EQ(\"which is 0 modulo 2, and which is 0 modulo 3\", Explain(m, 6));\n}\n\nTEST(ExplainMatchResultTest, AllOf_True_True_2) {\n  const Matcher<int> m = AllOf(Ge(2), Le(3));\n  EXPECT_EQ(\"\", Explain(m, 2));\n}\n\nTEST(ExplainmatcherResultTest, MonomorphicMatcher) {\n  const Matcher<int> m = GreaterThan(5);\n  EXPECT_EQ(\"which is 1 more than 5\", Explain(m, 6));\n}\n\n// The following two tests verify that values without a public copy\n// ctor can be used as arguments to matchers like Eq(), Ge(), and etc\n// with the help of ByRef().\n\nclass NotCopyable {\n public:\n  explicit NotCopyable(int a_value) : value_(a_value) {}\n\n  int value() const { return value_; }\n\n  bool operator==(const NotCopyable& rhs) const {\n    return value() == rhs.value();\n  }\n\n  bool operator>=(const NotCopyable& rhs) const {\n    return value() >= rhs.value();\n  }\n private:\n  int value_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(NotCopyable);\n};\n\nTEST(ByRefTest, AllowsNotCopyableConstValueInMatchers) {\n  const NotCopyable const_value1(1);\n  const Matcher<const NotCopyable&> m = Eq(ByRef(const_value1));\n\n  const NotCopyable n1(1), n2(2);\n  EXPECT_TRUE(m.Matches(n1));\n  EXPECT_FALSE(m.Matches(n2));\n}\n\nTEST(ByRefTest, AllowsNotCopyableValueInMatchers) {\n  NotCopyable value2(2);\n  const Matcher<NotCopyable&> m = Ge(ByRef(value2));\n\n  NotCopyable n1(1), n2(2);\n  EXPECT_FALSE(m.Matches(n1));\n  EXPECT_TRUE(m.Matches(n2));\n}\n\nTEST(IsEmptyTest, ImplementsIsEmpty) {\n  vector<int> container;\n  EXPECT_THAT(container, IsEmpty());\n  container.push_back(0);\n  EXPECT_THAT(container, Not(IsEmpty()));\n  container.push_back(1);\n  EXPECT_THAT(container, Not(IsEmpty()));\n}\n\nTEST(IsEmptyTest, WorksWithString) {\n  std::string text;\n  EXPECT_THAT(text, IsEmpty());\n  text = \"foo\";\n  EXPECT_THAT(text, Not(IsEmpty()));\n  text = std::string(\"\\0\", 1);\n  EXPECT_THAT(text, Not(IsEmpty()));\n}\n\nTEST(IsEmptyTest, CanDescribeSelf) {\n  Matcher<vector<int> > m = IsEmpty();\n  EXPECT_EQ(\"is empty\", Describe(m));\n  EXPECT_EQ(\"isn't empty\", DescribeNegation(m));\n}\n\nTEST(IsEmptyTest, ExplainsResult) {\n  Matcher<vector<int> > m = IsEmpty();\n  vector<int> container;\n  EXPECT_EQ(\"\", Explain(m, container));\n  container.push_back(0);\n  EXPECT_EQ(\"whose size is 1\", Explain(m, container));\n}\n\nTEST(IsTrueTest, IsTrueIsFalse) {\n  EXPECT_THAT(true, IsTrue());\n  EXPECT_THAT(false, IsFalse());\n  EXPECT_THAT(true, Not(IsFalse()));\n  EXPECT_THAT(false, Not(IsTrue()));\n  EXPECT_THAT(0, Not(IsTrue()));\n  EXPECT_THAT(0, IsFalse());\n  EXPECT_THAT(NULL, Not(IsTrue()));\n  EXPECT_THAT(NULL, IsFalse());\n  EXPECT_THAT(-1, IsTrue());\n  EXPECT_THAT(-1, Not(IsFalse()));\n  EXPECT_THAT(1, IsTrue());\n  EXPECT_THAT(1, Not(IsFalse()));\n  EXPECT_THAT(2, IsTrue());\n  EXPECT_THAT(2, Not(IsFalse()));\n  int a = 42;\n  EXPECT_THAT(a, IsTrue());\n  EXPECT_THAT(a, Not(IsFalse()));\n  EXPECT_THAT(&a, IsTrue());\n  EXPECT_THAT(&a, Not(IsFalse()));\n  EXPECT_THAT(false, Not(IsTrue()));\n  EXPECT_THAT(true, Not(IsFalse()));\n#if GTEST_LANG_CXX11\n  EXPECT_THAT(std::true_type(), IsTrue());\n  EXPECT_THAT(std::true_type(), Not(IsFalse()));\n  EXPECT_THAT(std::false_type(), IsFalse());\n  EXPECT_THAT(std::false_type(), Not(IsTrue()));\n  EXPECT_THAT(nullptr, Not(IsTrue()));\n  EXPECT_THAT(nullptr, IsFalse());\n  std::unique_ptr<int> null_unique;\n  std::unique_ptr<int> nonnull_unique(new int(0));\n  EXPECT_THAT(null_unique, Not(IsTrue()));\n  EXPECT_THAT(null_unique, IsFalse());\n  EXPECT_THAT(nonnull_unique, IsTrue());\n  EXPECT_THAT(nonnull_unique, Not(IsFalse()));\n#endif  // GTEST_LANG_CXX11\n}\n\nTEST(SizeIsTest, ImplementsSizeIs) {\n  vector<int> container;\n  EXPECT_THAT(container, SizeIs(0));\n  EXPECT_THAT(container, Not(SizeIs(1)));\n  container.push_back(0);\n  EXPECT_THAT(container, Not(SizeIs(0)));\n  EXPECT_THAT(container, SizeIs(1));\n  container.push_back(0);\n  EXPECT_THAT(container, Not(SizeIs(0)));\n  EXPECT_THAT(container, SizeIs(2));\n}\n\nTEST(SizeIsTest, WorksWithMap) {\n  map<std::string, int> container;\n  EXPECT_THAT(container, SizeIs(0));\n  EXPECT_THAT(container, Not(SizeIs(1)));\n  container.insert(make_pair(\"foo\", 1));\n  EXPECT_THAT(container, Not(SizeIs(0)));\n  EXPECT_THAT(container, SizeIs(1));\n  container.insert(make_pair(\"bar\", 2));\n  EXPECT_THAT(container, Not(SizeIs(0)));\n  EXPECT_THAT(container, SizeIs(2));\n}\n\nTEST(SizeIsTest, WorksWithReferences) {\n  vector<int> container;\n  Matcher<const vector<int>&> m = SizeIs(1);\n  EXPECT_THAT(container, Not(m));\n  container.push_back(0);\n  EXPECT_THAT(container, m);\n}\n\nTEST(SizeIsTest, CanDescribeSelf) {\n  Matcher<vector<int> > m = SizeIs(2);\n  EXPECT_EQ(\"size is equal to 2\", Describe(m));\n  EXPECT_EQ(\"size isn't equal to 2\", DescribeNegation(m));\n}\n\nTEST(SizeIsTest, ExplainsResult) {\n  Matcher<vector<int> > m1 = SizeIs(2);\n  Matcher<vector<int> > m2 = SizeIs(Lt(2u));\n  Matcher<vector<int> > m3 = SizeIs(AnyOf(0, 3));\n  Matcher<vector<int> > m4 = SizeIs(GreaterThan(1));\n  vector<int> container;\n  EXPECT_EQ(\"whose size 0 doesn't match\", Explain(m1, container));\n  EXPECT_EQ(\"whose size 0 matches\", Explain(m2, container));\n  EXPECT_EQ(\"whose size 0 matches\", Explain(m3, container));\n  EXPECT_EQ(\"whose size 0 doesn't match, which is 1 less than 1\",\n            Explain(m4, container));\n  container.push_back(0);\n  container.push_back(0);\n  EXPECT_EQ(\"whose size 2 matches\", Explain(m1, container));\n  EXPECT_EQ(\"whose size 2 doesn't match\", Explain(m2, container));\n  EXPECT_EQ(\"whose size 2 doesn't match\", Explain(m3, container));\n  EXPECT_EQ(\"whose size 2 matches, which is 1 more than 1\",\n            Explain(m4, container));\n}\n\n#if GTEST_HAS_TYPED_TEST\n// Tests ContainerEq with different container types, and\n// different element types.\n\ntemplate <typename T>\nclass ContainerEqTest : public testing::Test {};\n\ntypedef testing::Types<\n    set<int>,\n    vector<size_t>,\n    multiset<size_t>,\n    list<int> >\n    ContainerEqTestTypes;\n\nTYPED_TEST_CASE(ContainerEqTest, ContainerEqTestTypes);\n\n// Tests that the filled container is equal to itself.\nTYPED_TEST(ContainerEqTest, EqualsSelf) {\n  static const int vals[] = {1, 1, 2, 3, 5, 8};\n  TypeParam my_set(vals, vals + 6);\n  const Matcher<TypeParam> m = ContainerEq(my_set);\n  EXPECT_TRUE(m.Matches(my_set));\n  EXPECT_EQ(\"\", Explain(m, my_set));\n}\n\n// Tests that missing values are reported.\nTYPED_TEST(ContainerEqTest, ValueMissing) {\n  static const int vals[] = {1, 1, 2, 3, 5, 8};\n  static const int test_vals[] = {2, 1, 8, 5};\n  TypeParam my_set(vals, vals + 6);\n  TypeParam test_set(test_vals, test_vals + 4);\n  const Matcher<TypeParam> m = ContainerEq(my_set);\n  EXPECT_FALSE(m.Matches(test_set));\n  EXPECT_EQ(\"which doesn't have these expected elements: 3\",\n            Explain(m, test_set));\n}\n\n// Tests that added values are reported.\nTYPED_TEST(ContainerEqTest, ValueAdded) {\n  static const int vals[] = {1, 1, 2, 3, 5, 8};\n  static const int test_vals[] = {1, 2, 3, 5, 8, 46};\n  TypeParam my_set(vals, vals + 6);\n  TypeParam test_set(test_vals, test_vals + 6);\n  const Matcher<const TypeParam&> m = ContainerEq(my_set);\n  EXPECT_FALSE(m.Matches(test_set));\n  EXPECT_EQ(\"which has these unexpected elements: 46\", Explain(m, test_set));\n}\n\n// Tests that added and missing values are reported together.\nTYPED_TEST(ContainerEqTest, ValueAddedAndRemoved) {\n  static const int vals[] = {1, 1, 2, 3, 5, 8};\n  static const int test_vals[] = {1, 2, 3, 8, 46};\n  TypeParam my_set(vals, vals + 6);\n  TypeParam test_set(test_vals, test_vals + 5);\n  const Matcher<TypeParam> m = ContainerEq(my_set);\n  EXPECT_FALSE(m.Matches(test_set));\n  EXPECT_EQ(\"which has these unexpected elements: 46,\\n\"\n            \"and doesn't have these expected elements: 5\",\n            Explain(m, test_set));\n}\n\n// Tests duplicated value -- expect no explanation.\nTYPED_TEST(ContainerEqTest, DuplicateDifference) {\n  static const int vals[] = {1, 1, 2, 3, 5, 8};\n  static const int test_vals[] = {1, 2, 3, 5, 8};\n  TypeParam my_set(vals, vals + 6);\n  TypeParam test_set(test_vals, test_vals + 5);\n  const Matcher<const TypeParam&> m = ContainerEq(my_set);\n  // Depending on the container, match may be true or false\n  // But in any case there should be no explanation.\n  EXPECT_EQ(\"\", Explain(m, test_set));\n}\n#endif  // GTEST_HAS_TYPED_TEST\n\n// Tests that mutliple missing values are reported.\n// Using just vector here, so order is predictable.\nTEST(ContainerEqExtraTest, MultipleValuesMissing) {\n  static const int vals[] = {1, 1, 2, 3, 5, 8};\n  static const int test_vals[] = {2, 1, 5};\n  vector<int> my_set(vals, vals + 6);\n  vector<int> test_set(test_vals, test_vals + 3);\n  const Matcher<vector<int> > m = ContainerEq(my_set);\n  EXPECT_FALSE(m.Matches(test_set));\n  EXPECT_EQ(\"which doesn't have these expected elements: 3, 8\",\n            Explain(m, test_set));\n}\n\n// Tests that added values are reported.\n// Using just vector here, so order is predictable.\nTEST(ContainerEqExtraTest, MultipleValuesAdded) {\n  static const int vals[] = {1, 1, 2, 3, 5, 8};\n  static const int test_vals[] = {1, 2, 92, 3, 5, 8, 46};\n  list<size_t> my_set(vals, vals + 6);\n  list<size_t> test_set(test_vals, test_vals + 7);\n  const Matcher<const list<size_t>&> m = ContainerEq(my_set);\n  EXPECT_FALSE(m.Matches(test_set));\n  EXPECT_EQ(\"which has these unexpected elements: 92, 46\",\n            Explain(m, test_set));\n}\n\n// Tests that added and missing values are reported together.\nTEST(ContainerEqExtraTest, MultipleValuesAddedAndRemoved) {\n  static const int vals[] = {1, 1, 2, 3, 5, 8};\n  static const int test_vals[] = {1, 2, 3, 92, 46};\n  list<size_t> my_set(vals, vals + 6);\n  list<size_t> test_set(test_vals, test_vals + 5);\n  const Matcher<const list<size_t> > m = ContainerEq(my_set);\n  EXPECT_FALSE(m.Matches(test_set));\n  EXPECT_EQ(\"which has these unexpected elements: 92, 46,\\n\"\n            \"and doesn't have these expected elements: 5, 8\",\n            Explain(m, test_set));\n}\n\n// Tests to see that duplicate elements are detected,\n// but (as above) not reported in the explanation.\nTEST(ContainerEqExtraTest, MultiSetOfIntDuplicateDifference) {\n  static const int vals[] = {1, 1, 2, 3, 5, 8};\n  static const int test_vals[] = {1, 2, 3, 5, 8};\n  vector<int> my_set(vals, vals + 6);\n  vector<int> test_set(test_vals, test_vals + 5);\n  const Matcher<vector<int> > m = ContainerEq(my_set);\n  EXPECT_TRUE(m.Matches(my_set));\n  EXPECT_FALSE(m.Matches(test_set));\n  // There is nothing to report when both sets contain all the same values.\n  EXPECT_EQ(\"\", Explain(m, test_set));\n}\n\n// Tests that ContainerEq works for non-trivial associative containers,\n// like maps.\nTEST(ContainerEqExtraTest, WorksForMaps) {\n  map<int, std::string> my_map;\n  my_map[0] = \"a\";\n  my_map[1] = \"b\";\n\n  map<int, std::string> test_map;\n  test_map[0] = \"aa\";\n  test_map[1] = \"b\";\n\n  const Matcher<const map<int, std::string>&> m = ContainerEq(my_map);\n  EXPECT_TRUE(m.Matches(my_map));\n  EXPECT_FALSE(m.Matches(test_map));\n\n  EXPECT_EQ(\"which has these unexpected elements: (0, \\\"aa\\\"),\\n\"\n            \"and doesn't have these expected elements: (0, \\\"a\\\")\",\n            Explain(m, test_map));\n}\n\nTEST(ContainerEqExtraTest, WorksForNativeArray) {\n  int a1[] = {1, 2, 3};\n  int a2[] = {1, 2, 3};\n  int b[] = {1, 2, 4};\n\n  EXPECT_THAT(a1, ContainerEq(a2));\n  EXPECT_THAT(a1, Not(ContainerEq(b)));\n}\n\nTEST(ContainerEqExtraTest, WorksForTwoDimensionalNativeArray) {\n  const char a1[][3] = {\"hi\", \"lo\"};\n  const char a2[][3] = {\"hi\", \"lo\"};\n  const char b[][3] = {\"lo\", \"hi\"};\n\n  // Tests using ContainerEq() in the first dimension.\n  EXPECT_THAT(a1, ContainerEq(a2));\n  EXPECT_THAT(a1, Not(ContainerEq(b)));\n\n  // Tests using ContainerEq() in the second dimension.\n  EXPECT_THAT(a1, ElementsAre(ContainerEq(a2[0]), ContainerEq(a2[1])));\n  EXPECT_THAT(a1, ElementsAre(Not(ContainerEq(b[0])), ContainerEq(a2[1])));\n}\n\nTEST(ContainerEqExtraTest, WorksForNativeArrayAsTuple) {\n  const int a1[] = {1, 2, 3};\n  const int a2[] = {1, 2, 3};\n  const int b[] = {1, 2, 3, 4};\n\n  const int* const p1 = a1;\n  EXPECT_THAT(make_tuple(p1, 3), ContainerEq(a2));\n  EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(b)));\n\n  const int c[] = {1, 3, 2};\n  EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(c)));\n}\n\nTEST(ContainerEqExtraTest, CopiesNativeArrayParameter) {\n  std::string a1[][3] = {\n    {\"hi\", \"hello\", \"ciao\"},\n    {\"bye\", \"see you\", \"ciao\"}\n  };\n\n  std::string a2[][3] = {\n    {\"hi\", \"hello\", \"ciao\"},\n    {\"bye\", \"see you\", \"ciao\"}\n  };\n\n  const Matcher<const std::string(&)[2][3]> m = ContainerEq(a2);\n  EXPECT_THAT(a1, m);\n\n  a2[0][0] = \"ha\";\n  EXPECT_THAT(a1, m);\n}\n\nTEST(WhenSortedByTest, WorksForEmptyContainer) {\n  const vector<int> numbers;\n  EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre()));\n  EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1))));\n}\n\nTEST(WhenSortedByTest, WorksForNonEmptyContainer) {\n  vector<unsigned> numbers;\n  numbers.push_back(3);\n  numbers.push_back(1);\n  numbers.push_back(2);\n  numbers.push_back(2);\n  EXPECT_THAT(numbers, WhenSortedBy(greater<unsigned>(),\n                                    ElementsAre(3, 2, 2, 1)));\n  EXPECT_THAT(numbers, Not(WhenSortedBy(greater<unsigned>(),\n                                        ElementsAre(1, 2, 2, 3))));\n}\n\nTEST(WhenSortedByTest, WorksForNonVectorContainer) {\n  list<std::string> words;\n  words.push_back(\"say\");\n  words.push_back(\"hello\");\n  words.push_back(\"world\");\n  EXPECT_THAT(words, WhenSortedBy(less<std::string>(),\n                                  ElementsAre(\"hello\", \"say\", \"world\")));\n  EXPECT_THAT(words, Not(WhenSortedBy(less<std::string>(),\n                                      ElementsAre(\"say\", \"hello\", \"world\"))));\n}\n\nTEST(WhenSortedByTest, WorksForNativeArray) {\n  const int numbers[] = {1, 3, 2, 4};\n  const int sorted_numbers[] = {1, 2, 3, 4};\n  EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre(1, 2, 3, 4)));\n  EXPECT_THAT(numbers, WhenSortedBy(less<int>(),\n                                    ElementsAreArray(sorted_numbers)));\n  EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1, 3, 2, 4))));\n}\n\nTEST(WhenSortedByTest, CanDescribeSelf) {\n  const Matcher<vector<int> > m = WhenSortedBy(less<int>(), ElementsAre(1, 2));\n  EXPECT_EQ(\"(when sorted) has 2 elements where\\n\"\n            \"element #0 is equal to 1,\\n\"\n            \"element #1 is equal to 2\",\n            Describe(m));\n  EXPECT_EQ(\"(when sorted) doesn't have 2 elements, or\\n\"\n            \"element #0 isn't equal to 1, or\\n\"\n            \"element #1 isn't equal to 2\",\n            DescribeNegation(m));\n}\n\nTEST(WhenSortedByTest, ExplainsMatchResult) {\n  const int a[] = {2, 1};\n  EXPECT_EQ(\"which is { 1, 2 } when sorted, whose element #0 doesn't match\",\n            Explain(WhenSortedBy(less<int>(), ElementsAre(2, 3)), a));\n  EXPECT_EQ(\"which is { 1, 2 } when sorted\",\n            Explain(WhenSortedBy(less<int>(), ElementsAre(1, 2)), a));\n}\n\n// WhenSorted() is a simple wrapper on WhenSortedBy().  Hence we don't\n// need to test it as exhaustively as we test the latter.\n\nTEST(WhenSortedTest, WorksForEmptyContainer) {\n  const vector<int> numbers;\n  EXPECT_THAT(numbers, WhenSorted(ElementsAre()));\n  EXPECT_THAT(numbers, Not(WhenSorted(ElementsAre(1))));\n}\n\nTEST(WhenSortedTest, WorksForNonEmptyContainer) {\n  list<std::string> words;\n  words.push_back(\"3\");\n  words.push_back(\"1\");\n  words.push_back(\"2\");\n  words.push_back(\"2\");\n  EXPECT_THAT(words, WhenSorted(ElementsAre(\"1\", \"2\", \"2\", \"3\")));\n  EXPECT_THAT(words, Not(WhenSorted(ElementsAre(\"3\", \"1\", \"2\", \"2\"))));\n}\n\nTEST(WhenSortedTest, WorksForMapTypes) {\n  map<std::string, int> word_counts;\n  word_counts[\"and\"] = 1;\n  word_counts[\"the\"] = 1;\n  word_counts[\"buffalo\"] = 2;\n  EXPECT_THAT(word_counts,\n              WhenSorted(ElementsAre(Pair(\"and\", 1), Pair(\"buffalo\", 2),\n                                     Pair(\"the\", 1))));\n  EXPECT_THAT(word_counts,\n              Not(WhenSorted(ElementsAre(Pair(\"and\", 1), Pair(\"the\", 1),\n                                         Pair(\"buffalo\", 2)))));\n}\n\nTEST(WhenSortedTest, WorksForMultiMapTypes) {\n    multimap<int, int> ifib;\n    ifib.insert(make_pair(8, 6));\n    ifib.insert(make_pair(2, 3));\n    ifib.insert(make_pair(1, 1));\n    ifib.insert(make_pair(3, 4));\n    ifib.insert(make_pair(1, 2));\n    ifib.insert(make_pair(5, 5));\n    EXPECT_THAT(ifib, WhenSorted(ElementsAre(Pair(1, 1),\n                                             Pair(1, 2),\n                                             Pair(2, 3),\n                                             Pair(3, 4),\n                                             Pair(5, 5),\n                                             Pair(8, 6))));\n    EXPECT_THAT(ifib, Not(WhenSorted(ElementsAre(Pair(8, 6),\n                                                 Pair(2, 3),\n                                                 Pair(1, 1),\n                                                 Pair(3, 4),\n                                                 Pair(1, 2),\n                                                 Pair(5, 5)))));\n}\n\nTEST(WhenSortedTest, WorksForPolymorphicMatcher) {\n    std::deque<int> d;\n    d.push_back(2);\n    d.push_back(1);\n    EXPECT_THAT(d, WhenSorted(ElementsAre(1, 2)));\n    EXPECT_THAT(d, Not(WhenSorted(ElementsAre(2, 1))));\n}\n\nTEST(WhenSortedTest, WorksForVectorConstRefMatcher) {\n    std::deque<int> d;\n    d.push_back(2);\n    d.push_back(1);\n    Matcher<const std::vector<int>&> vector_match = ElementsAre(1, 2);\n    EXPECT_THAT(d, WhenSorted(vector_match));\n    Matcher<const std::vector<int>&> not_vector_match = ElementsAre(2, 1);\n    EXPECT_THAT(d, Not(WhenSorted(not_vector_match)));\n}\n\n// Deliberately bare pseudo-container.\n// Offers only begin() and end() accessors, yielding InputIterator.\ntemplate <typename T>\nclass Streamlike {\n private:\n  class ConstIter;\n public:\n  typedef ConstIter const_iterator;\n  typedef T value_type;\n\n  template <typename InIter>\n  Streamlike(InIter first, InIter last) : remainder_(first, last) {}\n\n  const_iterator begin() const {\n    return const_iterator(this, remainder_.begin());\n  }\n  const_iterator end() const {\n    return const_iterator(this, remainder_.end());\n  }\n\n private:\n  class ConstIter : public std::iterator<std::input_iterator_tag,\n                                         value_type,\n                                         ptrdiff_t,\n                                         const value_type*,\n                                         const value_type&> {\n   public:\n    ConstIter(const Streamlike* s,\n              typename std::list<value_type>::iterator pos)\n        : s_(s), pos_(pos) {}\n\n    const value_type& operator*() const { return *pos_; }\n    const value_type* operator->() const { return &*pos_; }\n    ConstIter& operator++() {\n      s_->remainder_.erase(pos_++);\n      return *this;\n    }\n\n    // *iter++ is required to work (see std::istreambuf_iterator).\n    // (void)iter++ is also required to work.\n    class PostIncrProxy {\n     public:\n      explicit PostIncrProxy(const value_type& value) : value_(value) {}\n      value_type operator*() const { return value_; }\n     private:\n      value_type value_;\n    };\n    PostIncrProxy operator++(int) {\n      PostIncrProxy proxy(**this);\n      ++(*this);\n      return proxy;\n    }\n\n    friend bool operator==(const ConstIter& a, const ConstIter& b) {\n      return a.s_ == b.s_ && a.pos_ == b.pos_;\n    }\n    friend bool operator!=(const ConstIter& a, const ConstIter& b) {\n      return !(a == b);\n    }\n\n   private:\n    const Streamlike* s_;\n    typename std::list<value_type>::iterator pos_;\n  };\n\n  friend std::ostream& operator<<(std::ostream& os, const Streamlike& s) {\n    os << \"[\";\n    typedef typename std::list<value_type>::const_iterator Iter;\n    const char* sep = \"\";\n    for (Iter it = s.remainder_.begin(); it != s.remainder_.end(); ++it) {\n      os << sep << *it;\n      sep = \",\";\n    }\n    os << \"]\";\n    return os;\n  }\n\n  mutable std::list<value_type> remainder_;  // modified by iteration\n};\n\nTEST(StreamlikeTest, Iteration) {\n  const int a[5] = {2, 1, 4, 5, 3};\n  Streamlike<int> s(a, a + 5);\n  Streamlike<int>::const_iterator it = s.begin();\n  const int* ip = a;\n  while (it != s.end()) {\n    SCOPED_TRACE(ip - a);\n    EXPECT_EQ(*ip++, *it++);\n  }\n}\n\n#if GTEST_HAS_STD_FORWARD_LIST_\nTEST(BeginEndDistanceIsTest, WorksWithForwardList) {\n  std::forward_list<int> container;\n  EXPECT_THAT(container, BeginEndDistanceIs(0));\n  EXPECT_THAT(container, Not(BeginEndDistanceIs(1)));\n  container.push_front(0);\n  EXPECT_THAT(container, Not(BeginEndDistanceIs(0)));\n  EXPECT_THAT(container, BeginEndDistanceIs(1));\n  container.push_front(0);\n  EXPECT_THAT(container, Not(BeginEndDistanceIs(0)));\n  EXPECT_THAT(container, BeginEndDistanceIs(2));\n}\n#endif  // GTEST_HAS_STD_FORWARD_LIST_\n\nTEST(BeginEndDistanceIsTest, WorksWithNonStdList) {\n  const int a[5] = {1, 2, 3, 4, 5};\n  Streamlike<int> s(a, a + 5);\n  EXPECT_THAT(s, BeginEndDistanceIs(5));\n}\n\nTEST(BeginEndDistanceIsTest, CanDescribeSelf) {\n  Matcher<vector<int> > m = BeginEndDistanceIs(2);\n  EXPECT_EQ(\"distance between begin() and end() is equal to 2\", Describe(m));\n  EXPECT_EQ(\"distance between begin() and end() isn't equal to 2\",\n            DescribeNegation(m));\n}\n\nTEST(BeginEndDistanceIsTest, ExplainsResult) {\n  Matcher<vector<int> > m1 = BeginEndDistanceIs(2);\n  Matcher<vector<int> > m2 = BeginEndDistanceIs(Lt(2));\n  Matcher<vector<int> > m3 = BeginEndDistanceIs(AnyOf(0, 3));\n  Matcher<vector<int> > m4 = BeginEndDistanceIs(GreaterThan(1));\n  vector<int> container;\n  EXPECT_EQ(\"whose distance between begin() and end() 0 doesn't match\",\n            Explain(m1, container));\n  EXPECT_EQ(\"whose distance between begin() and end() 0 matches\",\n            Explain(m2, container));\n  EXPECT_EQ(\"whose distance between begin() and end() 0 matches\",\n            Explain(m3, container));\n  EXPECT_EQ(\n      \"whose distance between begin() and end() 0 doesn't match, which is 1 \"\n      \"less than 1\",\n      Explain(m4, container));\n  container.push_back(0);\n  container.push_back(0);\n  EXPECT_EQ(\"whose distance between begin() and end() 2 matches\",\n            Explain(m1, container));\n  EXPECT_EQ(\"whose distance between begin() and end() 2 doesn't match\",\n            Explain(m2, container));\n  EXPECT_EQ(\"whose distance between begin() and end() 2 doesn't match\",\n            Explain(m3, container));\n  EXPECT_EQ(\n      \"whose distance between begin() and end() 2 matches, which is 1 more \"\n      \"than 1\",\n      Explain(m4, container));\n}\n\nTEST(WhenSortedTest, WorksForStreamlike) {\n  // Streamlike 'container' provides only minimal iterator support.\n  // Its iterators are tagged with input_iterator_tag.\n  const int a[5] = {2, 1, 4, 5, 3};\n  Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));\n  EXPECT_THAT(s, WhenSorted(ElementsAre(1, 2, 3, 4, 5)));\n  EXPECT_THAT(s, Not(WhenSorted(ElementsAre(2, 1, 4, 5, 3))));\n}\n\nTEST(WhenSortedTest, WorksForVectorConstRefMatcherOnStreamlike) {\n  const int a[] = {2, 1, 4, 5, 3};\n  Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));\n  Matcher<const std::vector<int>&> vector_match = ElementsAre(1, 2, 3, 4, 5);\n  EXPECT_THAT(s, WhenSorted(vector_match));\n  EXPECT_THAT(s, Not(WhenSorted(ElementsAre(2, 1, 4, 5, 3))));\n}\n\nTEST(IsSupersetOfTest, WorksForNativeArray) {\n  const int subset[] = {1, 4};\n  const int superset[] = {1, 2, 4};\n  const int disjoint[] = {1, 0, 3};\n  EXPECT_THAT(subset, IsSupersetOf(subset));\n  EXPECT_THAT(subset, Not(IsSupersetOf(superset)));\n  EXPECT_THAT(superset, IsSupersetOf(subset));\n  EXPECT_THAT(subset, Not(IsSupersetOf(disjoint)));\n  EXPECT_THAT(disjoint, Not(IsSupersetOf(subset)));\n}\n\nTEST(IsSupersetOfTest, WorksWithDuplicates) {\n  const int not_enough[] = {1, 2};\n  const int enough[] = {1, 1, 2};\n  const int expected[] = {1, 1};\n  EXPECT_THAT(not_enough, Not(IsSupersetOf(expected)));\n  EXPECT_THAT(enough, IsSupersetOf(expected));\n}\n\nTEST(IsSupersetOfTest, WorksForEmpty) {\n  vector<int> numbers;\n  vector<int> expected;\n  EXPECT_THAT(numbers, IsSupersetOf(expected));\n  expected.push_back(1);\n  EXPECT_THAT(numbers, Not(IsSupersetOf(expected)));\n  expected.clear();\n  numbers.push_back(1);\n  numbers.push_back(2);\n  EXPECT_THAT(numbers, IsSupersetOf(expected));\n  expected.push_back(1);\n  EXPECT_THAT(numbers, IsSupersetOf(expected));\n  expected.push_back(2);\n  EXPECT_THAT(numbers, IsSupersetOf(expected));\n  expected.push_back(3);\n  EXPECT_THAT(numbers, Not(IsSupersetOf(expected)));\n}\n\nTEST(IsSupersetOfTest, WorksForStreamlike) {\n  const int a[5] = {1, 2, 3, 4, 5};\n  Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));\n\n  vector<int> expected;\n  expected.push_back(1);\n  expected.push_back(2);\n  expected.push_back(5);\n  EXPECT_THAT(s, IsSupersetOf(expected));\n\n  expected.push_back(0);\n  EXPECT_THAT(s, Not(IsSupersetOf(expected)));\n}\n\nTEST(IsSupersetOfTest, TakesStlContainer) {\n  const int actual[] = {3, 1, 2};\n\n  ::std::list<int> expected;\n  expected.push_back(1);\n  expected.push_back(3);\n  EXPECT_THAT(actual, IsSupersetOf(expected));\n\n  expected.push_back(4);\n  EXPECT_THAT(actual, Not(IsSupersetOf(expected)));\n}\n\nTEST(IsSupersetOfTest, Describe) {\n  typedef std::vector<int> IntVec;\n  IntVec expected;\n  expected.push_back(111);\n  expected.push_back(222);\n  expected.push_back(333);\n  EXPECT_THAT(\n      Describe<IntVec>(IsSupersetOf(expected)),\n      Eq(\"a surjection from elements to requirements exists such that:\\n\"\n         \" - an element is equal to 111\\n\"\n         \" - an element is equal to 222\\n\"\n         \" - an element is equal to 333\"));\n}\n\nTEST(IsSupersetOfTest, DescribeNegation) {\n  typedef std::vector<int> IntVec;\n  IntVec expected;\n  expected.push_back(111);\n  expected.push_back(222);\n  expected.push_back(333);\n  EXPECT_THAT(\n      DescribeNegation<IntVec>(IsSupersetOf(expected)),\n      Eq(\"no surjection from elements to requirements exists such that:\\n\"\n         \" - an element is equal to 111\\n\"\n         \" - an element is equal to 222\\n\"\n         \" - an element is equal to 333\"));\n}\n\nTEST(IsSupersetOfTest, MatchAndExplain) {\n  std::vector<int> v;\n  v.push_back(2);\n  v.push_back(3);\n  std::vector<int> expected;\n  expected.push_back(1);\n  expected.push_back(2);\n  StringMatchResultListener listener;\n  ASSERT_FALSE(ExplainMatchResult(IsSupersetOf(expected), v, &listener))\n      << listener.str();\n  EXPECT_THAT(listener.str(),\n              Eq(\"where the following matchers don't match any elements:\\n\"\n                 \"matcher #0: is equal to 1\"));\n\n  v.push_back(1);\n  listener.Clear();\n  ASSERT_TRUE(ExplainMatchResult(IsSupersetOf(expected), v, &listener))\n      << listener.str();\n  EXPECT_THAT(listener.str(), Eq(\"where:\\n\"\n                                 \" - element #0 is matched by matcher #1,\\n\"\n                                 \" - element #2 is matched by matcher #0\"));\n}\n\n#if GTEST_HAS_STD_INITIALIZER_LIST_\nTEST(IsSupersetOfTest, WorksForRhsInitializerList) {\n  const int numbers[] = {1, 3, 6, 2, 4, 5};\n  EXPECT_THAT(numbers, IsSupersetOf({1, 2}));\n  EXPECT_THAT(numbers, Not(IsSupersetOf({3, 0})));\n}\n#endif\n\nTEST(IsSubsetOfTest, WorksForNativeArray) {\n  const int subset[] = {1, 4};\n  const int superset[] = {1, 2, 4};\n  const int disjoint[] = {1, 0, 3};\n  EXPECT_THAT(subset, IsSubsetOf(subset));\n  EXPECT_THAT(subset, IsSubsetOf(superset));\n  EXPECT_THAT(superset, Not(IsSubsetOf(subset)));\n  EXPECT_THAT(subset, Not(IsSubsetOf(disjoint)));\n  EXPECT_THAT(disjoint, Not(IsSubsetOf(subset)));\n}\n\nTEST(IsSubsetOfTest, WorksWithDuplicates) {\n  const int not_enough[] = {1, 2};\n  const int enough[] = {1, 1, 2};\n  const int actual[] = {1, 1};\n  EXPECT_THAT(actual, Not(IsSubsetOf(not_enough)));\n  EXPECT_THAT(actual, IsSubsetOf(enough));\n}\n\nTEST(IsSubsetOfTest, WorksForEmpty) {\n  vector<int> numbers;\n  vector<int> expected;\n  EXPECT_THAT(numbers, IsSubsetOf(expected));\n  expected.push_back(1);\n  EXPECT_THAT(numbers, IsSubsetOf(expected));\n  expected.clear();\n  numbers.push_back(1);\n  numbers.push_back(2);\n  EXPECT_THAT(numbers, Not(IsSubsetOf(expected)));\n  expected.push_back(1);\n  EXPECT_THAT(numbers, Not(IsSubsetOf(expected)));\n  expected.push_back(2);\n  EXPECT_THAT(numbers, IsSubsetOf(expected));\n  expected.push_back(3);\n  EXPECT_THAT(numbers, IsSubsetOf(expected));\n}\n\nTEST(IsSubsetOfTest, WorksForStreamlike) {\n  const int a[5] = {1, 2};\n  Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));\n\n  vector<int> expected;\n  expected.push_back(1);\n  EXPECT_THAT(s, Not(IsSubsetOf(expected)));\n  expected.push_back(2);\n  expected.push_back(5);\n  EXPECT_THAT(s, IsSubsetOf(expected));\n}\n\nTEST(IsSubsetOfTest, TakesStlContainer) {\n  const int actual[] = {3, 1, 2};\n\n  ::std::list<int> expected;\n  expected.push_back(1);\n  expected.push_back(3);\n  EXPECT_THAT(actual, Not(IsSubsetOf(expected)));\n\n  expected.push_back(2);\n  expected.push_back(4);\n  EXPECT_THAT(actual, IsSubsetOf(expected));\n}\n\nTEST(IsSubsetOfTest, Describe) {\n  typedef std::vector<int> IntVec;\n  IntVec expected;\n  expected.push_back(111);\n  expected.push_back(222);\n  expected.push_back(333);\n\n  EXPECT_THAT(\n      Describe<IntVec>(IsSubsetOf(expected)),\n      Eq(\"an injection from elements to requirements exists such that:\\n\"\n         \" - an element is equal to 111\\n\"\n         \" - an element is equal to 222\\n\"\n         \" - an element is equal to 333\"));\n}\n\nTEST(IsSubsetOfTest, DescribeNegation) {\n  typedef std::vector<int> IntVec;\n  IntVec expected;\n  expected.push_back(111);\n  expected.push_back(222);\n  expected.push_back(333);\n  EXPECT_THAT(\n      DescribeNegation<IntVec>(IsSubsetOf(expected)),\n      Eq(\"no injection from elements to requirements exists such that:\\n\"\n         \" - an element is equal to 111\\n\"\n         \" - an element is equal to 222\\n\"\n         \" - an element is equal to 333\"));\n}\n\nTEST(IsSubsetOfTest, MatchAndExplain) {\n  std::vector<int> v;\n  v.push_back(2);\n  v.push_back(3);\n  std::vector<int> expected;\n  expected.push_back(1);\n  expected.push_back(2);\n  StringMatchResultListener listener;\n  ASSERT_FALSE(ExplainMatchResult(IsSubsetOf(expected), v, &listener))\n      << listener.str();\n  EXPECT_THAT(listener.str(),\n              Eq(\"where the following elements don't match any matchers:\\n\"\n                 \"element #1: 3\"));\n\n  expected.push_back(3);\n  listener.Clear();\n  ASSERT_TRUE(ExplainMatchResult(IsSubsetOf(expected), v, &listener))\n      << listener.str();\n  EXPECT_THAT(listener.str(), Eq(\"where:\\n\"\n                                 \" - element #0 is matched by matcher #1,\\n\"\n                                 \" - element #1 is matched by matcher #2\"));\n}\n\n#if GTEST_HAS_STD_INITIALIZER_LIST_\nTEST(IsSubsetOfTest, WorksForRhsInitializerList) {\n  const int numbers[] = {1, 2, 3};\n  EXPECT_THAT(numbers, IsSubsetOf({1, 2, 3, 4}));\n  EXPECT_THAT(numbers, Not(IsSubsetOf({1, 2})));\n}\n#endif\n\n// Tests using ElementsAre() and ElementsAreArray() with stream-like\n// \"containers\".\n\nTEST(ElemensAreStreamTest, WorksForStreamlike) {\n  const int a[5] = {1, 2, 3, 4, 5};\n  Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));\n  EXPECT_THAT(s, ElementsAre(1, 2, 3, 4, 5));\n  EXPECT_THAT(s, Not(ElementsAre(2, 1, 4, 5, 3)));\n}\n\nTEST(ElemensAreArrayStreamTest, WorksForStreamlike) {\n  const int a[5] = {1, 2, 3, 4, 5};\n  Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));\n\n  vector<int> expected;\n  expected.push_back(1);\n  expected.push_back(2);\n  expected.push_back(3);\n  expected.push_back(4);\n  expected.push_back(5);\n  EXPECT_THAT(s, ElementsAreArray(expected));\n\n  expected[3] = 0;\n  EXPECT_THAT(s, Not(ElementsAreArray(expected)));\n}\n\nTEST(ElementsAreTest, WorksWithUncopyable) {\n  Uncopyable objs[2];\n  objs[0].set_value(-3);\n  objs[1].set_value(1);\n  EXPECT_THAT(objs, ElementsAre(UncopyableIs(-3), Truly(ValueIsPositive)));\n}\n\nTEST(ElementsAreTest, TakesStlContainer) {\n  const int actual[] = {3, 1, 2};\n\n  ::std::list<int> expected;\n  expected.push_back(3);\n  expected.push_back(1);\n  expected.push_back(2);\n  EXPECT_THAT(actual, ElementsAreArray(expected));\n\n  expected.push_back(4);\n  EXPECT_THAT(actual, Not(ElementsAreArray(expected)));\n}\n\n// Tests for UnorderedElementsAreArray()\n\nTEST(UnorderedElementsAreArrayTest, SucceedsWhenExpected) {\n  const int a[] = {0, 1, 2, 3, 4};\n  std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a));\n  do {\n    StringMatchResultListener listener;\n    EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(a),\n                                   s, &listener)) << listener.str();\n  } while (std::next_permutation(s.begin(), s.end()));\n}\n\nTEST(UnorderedElementsAreArrayTest, VectorBool) {\n  const bool a[] = {0, 1, 0, 1, 1};\n  const bool b[] = {1, 0, 1, 1, 0};\n  std::vector<bool> expected(a, a + GTEST_ARRAY_SIZE_(a));\n  std::vector<bool> actual(b, b + GTEST_ARRAY_SIZE_(b));\n  StringMatchResultListener listener;\n  EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(expected),\n                                 actual, &listener)) << listener.str();\n}\n\nTEST(UnorderedElementsAreArrayTest, WorksForStreamlike) {\n  // Streamlike 'container' provides only minimal iterator support.\n  // Its iterators are tagged with input_iterator_tag, and it has no\n  // size() or empty() methods.\n  const int a[5] = {2, 1, 4, 5, 3};\n  Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));\n\n  ::std::vector<int> expected;\n  expected.push_back(1);\n  expected.push_back(2);\n  expected.push_back(3);\n  expected.push_back(4);\n  expected.push_back(5);\n  EXPECT_THAT(s, UnorderedElementsAreArray(expected));\n\n  expected.push_back(6);\n  EXPECT_THAT(s, Not(UnorderedElementsAreArray(expected)));\n}\n\nTEST(UnorderedElementsAreArrayTest, TakesStlContainer) {\n  const int actual[] = {3, 1, 2};\n\n  ::std::list<int> expected;\n  expected.push_back(1);\n  expected.push_back(2);\n  expected.push_back(3);\n  EXPECT_THAT(actual, UnorderedElementsAreArray(expected));\n\n  expected.push_back(4);\n  EXPECT_THAT(actual, Not(UnorderedElementsAreArray(expected)));\n}\n\n#if GTEST_HAS_STD_INITIALIZER_LIST_\n\nTEST(UnorderedElementsAreArrayTest, TakesInitializerList) {\n  const int a[5] = {2, 1, 4, 5, 3};\n  EXPECT_THAT(a, UnorderedElementsAreArray({1, 2, 3, 4, 5}));\n  EXPECT_THAT(a, Not(UnorderedElementsAreArray({1, 2, 3, 4, 6})));\n}\n\nTEST(UnorderedElementsAreArrayTest, TakesInitializerListOfCStrings) {\n  const std::string a[5] = {\"a\", \"b\", \"c\", \"d\", \"e\"};\n  EXPECT_THAT(a, UnorderedElementsAreArray({\"a\", \"b\", \"c\", \"d\", \"e\"}));\n  EXPECT_THAT(a, Not(UnorderedElementsAreArray({\"a\", \"b\", \"c\", \"d\", \"ef\"})));\n}\n\nTEST(UnorderedElementsAreArrayTest, TakesInitializerListOfSameTypedMatchers) {\n  const int a[5] = {2, 1, 4, 5, 3};\n  EXPECT_THAT(a, UnorderedElementsAreArray(\n      {Eq(1), Eq(2), Eq(3), Eq(4), Eq(5)}));\n  EXPECT_THAT(a, Not(UnorderedElementsAreArray(\n      {Eq(1), Eq(2), Eq(3), Eq(4), Eq(6)})));\n}\n\nTEST(UnorderedElementsAreArrayTest,\n     TakesInitializerListOfDifferentTypedMatchers) {\n  const int a[5] = {2, 1, 4, 5, 3};\n  // The compiler cannot infer the type of the initializer list if its\n  // elements have different types.  We must explicitly specify the\n  // unified element type in this case.\n  EXPECT_THAT(a, UnorderedElementsAreArray<Matcher<int> >(\n      {Eq(1), Ne(-2), Ge(3), Le(4), Eq(5)}));\n  EXPECT_THAT(a, Not(UnorderedElementsAreArray<Matcher<int> >(\n      {Eq(1), Ne(-2), Ge(3), Le(4), Eq(6)})));\n}\n\n#endif  // GTEST_HAS_STD_INITIALIZER_LIST_\n\nclass UnorderedElementsAreTest : public testing::Test {\n protected:\n  typedef std::vector<int> IntVec;\n};\n\nTEST_F(UnorderedElementsAreTest, WorksWithUncopyable) {\n  Uncopyable objs[2];\n  objs[0].set_value(-3);\n  objs[1].set_value(1);\n  EXPECT_THAT(objs,\n              UnorderedElementsAre(Truly(ValueIsPositive), UncopyableIs(-3)));\n}\n\nTEST_F(UnorderedElementsAreTest, SucceedsWhenExpected) {\n  const int a[] = {1, 2, 3};\n  std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a));\n  do {\n    StringMatchResultListener listener;\n    EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3),\n                                   s, &listener)) << listener.str();\n  } while (std::next_permutation(s.begin(), s.end()));\n}\n\nTEST_F(UnorderedElementsAreTest, FailsWhenAnElementMatchesNoMatcher) {\n  const int a[] = {1, 2, 3};\n  std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a));\n  std::vector<Matcher<int> > mv;\n  mv.push_back(1);\n  mv.push_back(2);\n  mv.push_back(2);\n  // The element with value '3' matches nothing: fail fast.\n  StringMatchResultListener listener;\n  EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAreArray(mv),\n                                  s, &listener)) << listener.str();\n}\n\nTEST_F(UnorderedElementsAreTest, WorksForStreamlike) {\n  // Streamlike 'container' provides only minimal iterator support.\n  // Its iterators are tagged with input_iterator_tag, and it has no\n  // size() or empty() methods.\n  const int a[5] = {2, 1, 4, 5, 3};\n  Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));\n\n  EXPECT_THAT(s, UnorderedElementsAre(1, 2, 3, 4, 5));\n  EXPECT_THAT(s, Not(UnorderedElementsAre(2, 2, 3, 4, 5)));\n}\n\n// One naive implementation of the matcher runs in O(N!) time, which is too\n// slow for many real-world inputs. This test shows that our matcher can match\n// 100 inputs very quickly (a few milliseconds).  An O(100!) is 10^158\n// iterations and obviously effectively incomputable.\n// [ RUN      ] UnorderedElementsAreTest.Performance\n// [       OK ] UnorderedElementsAreTest.Performance (4 ms)\nTEST_F(UnorderedElementsAreTest, Performance) {\n  std::vector<int> s;\n  std::vector<Matcher<int> > mv;\n  for (int i = 0; i < 100; ++i) {\n    s.push_back(i);\n    mv.push_back(_);\n  }\n  mv[50] = Eq(0);\n  StringMatchResultListener listener;\n  EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(mv),\n                                 s, &listener)) << listener.str();\n}\n\n// Another variant of 'Performance' with similar expectations.\n// [ RUN      ] UnorderedElementsAreTest.PerformanceHalfStrict\n// [       OK ] UnorderedElementsAreTest.PerformanceHalfStrict (4 ms)\nTEST_F(UnorderedElementsAreTest, PerformanceHalfStrict) {\n  std::vector<int> s;\n  std::vector<Matcher<int> > mv;\n  for (int i = 0; i < 100; ++i) {\n    s.push_back(i);\n    if (i & 1) {\n      mv.push_back(_);\n    } else {\n      mv.push_back(i);\n    }\n  }\n  StringMatchResultListener listener;\n  EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(mv),\n                                 s, &listener)) << listener.str();\n}\n\nTEST_F(UnorderedElementsAreTest, FailMessageCountWrong) {\n  std::vector<int> v;\n  v.push_back(4);\n  StringMatchResultListener listener;\n  EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3),\n                                  v, &listener)) << listener.str();\n  EXPECT_THAT(listener.str(), Eq(\"which has 1 element\"));\n}\n\nTEST_F(UnorderedElementsAreTest, FailMessageCountWrongZero) {\n  std::vector<int> v;\n  StringMatchResultListener listener;\n  EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3),\n                                  v, &listener)) << listener.str();\n  EXPECT_THAT(listener.str(), Eq(\"\"));\n}\n\nTEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatchers) {\n  std::vector<int> v;\n  v.push_back(1);\n  v.push_back(1);\n  StringMatchResultListener listener;\n  EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2),\n                                  v, &listener)) << listener.str();\n  EXPECT_THAT(\n      listener.str(),\n      Eq(\"where the following matchers don't match any elements:\\n\"\n         \"matcher #1: is equal to 2\"));\n}\n\nTEST_F(UnorderedElementsAreTest, FailMessageUnmatchedElements) {\n  std::vector<int> v;\n  v.push_back(1);\n  v.push_back(2);\n  StringMatchResultListener listener;\n  EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 1),\n                                  v, &listener)) << listener.str();\n  EXPECT_THAT(\n      listener.str(),\n      Eq(\"where the following elements don't match any matchers:\\n\"\n         \"element #1: 2\"));\n}\n\nTEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatcherAndElement) {\n  std::vector<int> v;\n  v.push_back(2);\n  v.push_back(3);\n  StringMatchResultListener listener;\n  EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2),\n                                  v, &listener)) << listener.str();\n  EXPECT_THAT(\n      listener.str(),\n      Eq(\"where\"\n         \" the following matchers don't match any elements:\\n\"\n         \"matcher #0: is equal to 1\\n\"\n         \"and\"\n         \" where\"\n         \" the following elements don't match any matchers:\\n\"\n         \"element #1: 3\"));\n}\n\n// Test helper for formatting element, matcher index pairs in expectations.\nstatic std::string EMString(int element, int matcher) {\n  stringstream ss;\n  ss << \"(element #\" << element << \", matcher #\" << matcher << \")\";\n  return ss.str();\n}\n\nTEST_F(UnorderedElementsAreTest, FailMessageImperfectMatchOnly) {\n  // A situation where all elements and matchers have a match\n  // associated with them, but the max matching is not perfect.\n  std::vector<std::string> v;\n  v.push_back(\"a\");\n  v.push_back(\"b\");\n  v.push_back(\"c\");\n  StringMatchResultListener listener;\n  EXPECT_FALSE(ExplainMatchResult(\n      UnorderedElementsAre(\"a\", \"a\", AnyOf(\"b\", \"c\")), v, &listener))\n      << listener.str();\n\n  std::string prefix =\n      \"where no permutation of the elements can satisfy all matchers, \"\n      \"and the closest match is 2 of 3 matchers with the \"\n      \"pairings:\\n\";\n\n  // We have to be a bit loose here, because there are 4 valid max matches.\n  EXPECT_THAT(\n      listener.str(),\n      AnyOf(prefix + \"{\\n  \" + EMString(0, 0) +\n                     \",\\n  \" + EMString(1, 2) + \"\\n}\",\n            prefix + \"{\\n  \" + EMString(0, 1) +\n                     \",\\n  \" + EMString(1, 2) + \"\\n}\",\n            prefix + \"{\\n  \" + EMString(0, 0) +\n                     \",\\n  \" + EMString(2, 2) + \"\\n}\",\n            prefix + \"{\\n  \" + EMString(0, 1) +\n                     \",\\n  \" + EMString(2, 2) + \"\\n}\"));\n}\n\nTEST_F(UnorderedElementsAreTest, Describe) {\n  EXPECT_THAT(Describe<IntVec>(UnorderedElementsAre()),\n              Eq(\"is empty\"));\n  EXPECT_THAT(\n      Describe<IntVec>(UnorderedElementsAre(345)),\n      Eq(\"has 1 element and that element is equal to 345\"));\n  EXPECT_THAT(\n      Describe<IntVec>(UnorderedElementsAre(111, 222, 333)),\n      Eq(\"has 3 elements and there exists some permutation \"\n         \"of elements such that:\\n\"\n         \" - element #0 is equal to 111, and\\n\"\n         \" - element #1 is equal to 222, and\\n\"\n         \" - element #2 is equal to 333\"));\n}\n\nTEST_F(UnorderedElementsAreTest, DescribeNegation) {\n  EXPECT_THAT(DescribeNegation<IntVec>(UnorderedElementsAre()),\n              Eq(\"isn't empty\"));\n  EXPECT_THAT(\n      DescribeNegation<IntVec>(UnorderedElementsAre(345)),\n      Eq(\"doesn't have 1 element, or has 1 element that isn't equal to 345\"));\n  EXPECT_THAT(\n      DescribeNegation<IntVec>(UnorderedElementsAre(123, 234, 345)),\n      Eq(\"doesn't have 3 elements, or there exists no permutation \"\n         \"of elements such that:\\n\"\n         \" - element #0 is equal to 123, and\\n\"\n         \" - element #1 is equal to 234, and\\n\"\n         \" - element #2 is equal to 345\"));\n}\n\nnamespace {\n\n// Used as a check on the more complex max flow method used in the\n// real testing::internal::FindMaxBipartiteMatching. This method is\n// compatible but runs in worst-case factorial time, so we only\n// use it in testing for small problem sizes.\ntemplate <typename Graph>\nclass BacktrackingMaxBPMState {\n public:\n  // Does not take ownership of 'g'.\n  explicit BacktrackingMaxBPMState(const Graph* g) : graph_(g) { }\n\n  ElementMatcherPairs Compute() {\n    if (graph_->LhsSize() == 0 || graph_->RhsSize() == 0) {\n      return best_so_far_;\n    }\n    lhs_used_.assign(graph_->LhsSize(), kUnused);\n    rhs_used_.assign(graph_->RhsSize(), kUnused);\n    for (size_t irhs = 0; irhs < graph_->RhsSize(); ++irhs) {\n      matches_.clear();\n      RecurseInto(irhs);\n      if (best_so_far_.size() == graph_->RhsSize())\n        break;\n    }\n    return best_so_far_;\n  }\n\n private:\n  static const size_t kUnused = static_cast<size_t>(-1);\n\n  void PushMatch(size_t lhs, size_t rhs) {\n    matches_.push_back(ElementMatcherPair(lhs, rhs));\n    lhs_used_[lhs] = rhs;\n    rhs_used_[rhs] = lhs;\n    if (matches_.size() > best_so_far_.size()) {\n      best_so_far_ = matches_;\n    }\n  }\n\n  void PopMatch() {\n    const ElementMatcherPair& back = matches_.back();\n    lhs_used_[back.first] = kUnused;\n    rhs_used_[back.second] = kUnused;\n    matches_.pop_back();\n  }\n\n  bool RecurseInto(size_t irhs) {\n    if (rhs_used_[irhs] != kUnused) {\n      return true;\n    }\n    for (size_t ilhs = 0; ilhs < graph_->LhsSize(); ++ilhs) {\n      if (lhs_used_[ilhs] != kUnused) {\n        continue;\n      }\n      if (!graph_->HasEdge(ilhs, irhs)) {\n        continue;\n      }\n      PushMatch(ilhs, irhs);\n      if (best_so_far_.size() == graph_->RhsSize()) {\n        return false;\n      }\n      for (size_t mi = irhs + 1; mi < graph_->RhsSize(); ++mi) {\n        if (!RecurseInto(mi)) return false;\n      }\n      PopMatch();\n    }\n    return true;\n  }\n\n  const Graph* graph_;  // not owned\n  std::vector<size_t> lhs_used_;\n  std::vector<size_t> rhs_used_;\n  ElementMatcherPairs matches_;\n  ElementMatcherPairs best_so_far_;\n};\n\ntemplate <typename Graph>\nconst size_t BacktrackingMaxBPMState<Graph>::kUnused;\n\n}  // namespace\n\n// Implement a simple backtracking algorithm to determine if it is possible\n// to find one element per matcher, without reusing elements.\ntemplate <typename Graph>\nElementMatcherPairs\nFindBacktrackingMaxBPM(const Graph& g) {\n  return BacktrackingMaxBPMState<Graph>(&g).Compute();\n}\n\nclass BacktrackingBPMTest : public ::testing::Test { };\n\n// Tests the MaxBipartiteMatching algorithm with square matrices.\n// The single int param is the # of nodes on each of the left and right sides.\nclass BipartiteTest : public ::testing::TestWithParam<int> { };\n\n// Verify all match graphs up to some moderate number of edges.\nTEST_P(BipartiteTest, Exhaustive) {\n  int nodes = GetParam();\n  MatchMatrix graph(nodes, nodes);\n  do {\n    ElementMatcherPairs matches =\n        internal::FindMaxBipartiteMatching(graph);\n    EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(), matches.size())\n        << \"graph: \" << graph.DebugString();\n    // Check that all elements of matches are in the graph.\n    // Check that elements of first and second are unique.\n    std::vector<bool> seen_element(graph.LhsSize());\n    std::vector<bool> seen_matcher(graph.RhsSize());\n    SCOPED_TRACE(PrintToString(matches));\n    for (size_t i = 0; i < matches.size(); ++i) {\n      size_t ilhs = matches[i].first;\n      size_t irhs = matches[i].second;\n      EXPECT_TRUE(graph.HasEdge(ilhs, irhs));\n      EXPECT_FALSE(seen_element[ilhs]);\n      EXPECT_FALSE(seen_matcher[irhs]);\n      seen_element[ilhs] = true;\n      seen_matcher[irhs] = true;\n    }\n  } while (graph.NextGraph());\n}\n\nINSTANTIATE_TEST_CASE_P(AllGraphs, BipartiteTest,\n                        ::testing::Range(0, 5));\n\n// Parameterized by a pair interpreted as (LhsSize, RhsSize).\nclass BipartiteNonSquareTest\n    : public ::testing::TestWithParam<std::pair<size_t, size_t> > {\n};\n\nTEST_F(BipartiteNonSquareTest, SimpleBacktracking) {\n  //   .......\n  // 0:-----\\ :\n  // 1:---\\ | :\n  // 2:---\\ | :\n  // 3:-\\ | | :\n  //  :.......:\n  //    0 1 2\n  MatchMatrix g(4, 3);\n  static const int kEdges[][2] = {{0, 2}, {1, 1}, {2, 1}, {3, 0}};\n  for (size_t i = 0; i < GTEST_ARRAY_SIZE_(kEdges); ++i) {\n    g.SetEdge(kEdges[i][0], kEdges[i][1], true);\n  }\n  EXPECT_THAT(FindBacktrackingMaxBPM(g),\n              ElementsAre(Pair(3, 0),\n                          Pair(AnyOf(1, 2), 1),\n                          Pair(0, 2))) << g.DebugString();\n}\n\n// Verify a few nonsquare matrices.\nTEST_P(BipartiteNonSquareTest, Exhaustive) {\n  size_t nlhs = GetParam().first;\n  size_t nrhs = GetParam().second;\n  MatchMatrix graph(nlhs, nrhs);\n  do {\n    EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(),\n              internal::FindMaxBipartiteMatching(graph).size())\n        << \"graph: \" << graph.DebugString()\n        << \"\\nbacktracking: \"\n        << PrintToString(FindBacktrackingMaxBPM(graph))\n        << \"\\nmax flow: \"\n        << PrintToString(internal::FindMaxBipartiteMatching(graph));\n  } while (graph.NextGraph());\n}\n\nINSTANTIATE_TEST_CASE_P(AllGraphs, BipartiteNonSquareTest,\n    testing::Values(\n        std::make_pair(1, 2),\n        std::make_pair(2, 1),\n        std::make_pair(3, 2),\n        std::make_pair(2, 3),\n        std::make_pair(4, 1),\n        std::make_pair(1, 4),\n        std::make_pair(4, 3),\n        std::make_pair(3, 4)));\n\nclass BipartiteRandomTest\n    : public ::testing::TestWithParam<std::pair<int, int> > {\n};\n\n// Verifies a large sample of larger graphs.\nTEST_P(BipartiteRandomTest, LargerNets) {\n  int nodes = GetParam().first;\n  int iters = GetParam().second;\n  MatchMatrix graph(nodes, nodes);\n\n  testing::internal::Int32 seed = GTEST_FLAG(random_seed);\n  if (seed == 0) {\n    seed = static_cast<testing::internal::Int32>(time(NULL));\n  }\n\n  for (; iters > 0; --iters, ++seed) {\n    srand(static_cast<int>(seed));\n    graph.Randomize();\n    EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(),\n              internal::FindMaxBipartiteMatching(graph).size())\n        << \" graph: \" << graph.DebugString()\n        << \"\\nTo reproduce the failure, rerun the test with the flag\"\n           \" --\" << GTEST_FLAG_PREFIX_ << \"random_seed=\" << seed;\n  }\n}\n\n// Test argument is a std::pair<int, int> representing (nodes, iters).\nINSTANTIATE_TEST_CASE_P(Samples, BipartiteRandomTest,\n    testing::Values(\n        std::make_pair(5, 10000),\n        std::make_pair(6, 5000),\n        std::make_pair(7, 2000),\n        std::make_pair(8, 500),\n        std::make_pair(9, 100)));\n\n// Tests IsReadableTypeName().\n\nTEST(IsReadableTypeNameTest, ReturnsTrueForShortNames) {\n  EXPECT_TRUE(IsReadableTypeName(\"int\"));\n  EXPECT_TRUE(IsReadableTypeName(\"const unsigned char*\"));\n  EXPECT_TRUE(IsReadableTypeName(\"MyMap<int, void*>\"));\n  EXPECT_TRUE(IsReadableTypeName(\"void (*)(int, bool)\"));\n}\n\nTEST(IsReadableTypeNameTest, ReturnsTrueForLongNonTemplateNonFunctionNames) {\n  EXPECT_TRUE(IsReadableTypeName(\"my_long_namespace::MyClassName\"));\n  EXPECT_TRUE(IsReadableTypeName(\"int [5][6][7][8][9][10][11]\"));\n  EXPECT_TRUE(IsReadableTypeName(\"my_namespace::MyOuterClass::MyInnerClass\"));\n}\n\nTEST(IsReadableTypeNameTest, ReturnsFalseForLongTemplateNames) {\n  EXPECT_FALSE(\n      IsReadableTypeName(\"basic_string<char, std::char_traits<char> >\"));\n  EXPECT_FALSE(IsReadableTypeName(\"std::vector<int, std::alloc_traits<int> >\"));\n}\n\nTEST(IsReadableTypeNameTest, ReturnsFalseForLongFunctionTypeNames) {\n  EXPECT_FALSE(IsReadableTypeName(\"void (&)(int, bool, char, float)\"));\n}\n\n// Tests FormatMatcherDescription().\n\nTEST(FormatMatcherDescriptionTest, WorksForEmptyDescription) {\n  EXPECT_EQ(\"is even\",\n            FormatMatcherDescription(false, \"IsEven\", Strings()));\n  EXPECT_EQ(\"not (is even)\",\n            FormatMatcherDescription(true, \"IsEven\", Strings()));\n\n  const char* params[] = {\"5\"};\n  EXPECT_EQ(\"equals 5\",\n            FormatMatcherDescription(false, \"Equals\",\n                                     Strings(params, params + 1)));\n\n  const char* params2[] = {\"5\", \"8\"};\n  EXPECT_EQ(\"is in range (5, 8)\",\n            FormatMatcherDescription(false, \"IsInRange\",\n                                     Strings(params2, params2 + 2)));\n}\n\n// Tests PolymorphicMatcher::mutable_impl().\nTEST(PolymorphicMatcherTest, CanAccessMutableImpl) {\n  PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42));\n  DivisibleByImpl& impl = m.mutable_impl();\n  EXPECT_EQ(42, impl.divider());\n\n  impl.set_divider(0);\n  EXPECT_EQ(0, m.mutable_impl().divider());\n}\n\n// Tests PolymorphicMatcher::impl().\nTEST(PolymorphicMatcherTest, CanAccessImpl) {\n  const PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42));\n  const DivisibleByImpl& impl = m.impl();\n  EXPECT_EQ(42, impl.divider());\n}\n\nTEST(MatcherTupleTest, ExplainsMatchFailure) {\n  stringstream ss1;\n  ExplainMatchFailureTupleTo(make_tuple(Matcher<char>(Eq('a')), GreaterThan(5)),\n                             make_tuple('a', 10), &ss1);\n  EXPECT_EQ(\"\", ss1.str());  // Successful match.\n\n  stringstream ss2;\n  ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))),\n                             make_tuple(2, 'b'), &ss2);\n  EXPECT_EQ(\"  Expected arg #0: is > 5\\n\"\n            \"           Actual: 2, which is 3 less than 5\\n\"\n            \"  Expected arg #1: is equal to 'a' (97, 0x61)\\n\"\n            \"           Actual: 'b' (98, 0x62)\\n\",\n            ss2.str());  // Failed match where both arguments need explanation.\n\n  stringstream ss3;\n  ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))),\n                             make_tuple(2, 'a'), &ss3);\n  EXPECT_EQ(\"  Expected arg #0: is > 5\\n\"\n            \"           Actual: 2, which is 3 less than 5\\n\",\n            ss3.str());  // Failed match where only one argument needs\n                         // explanation.\n}\n\n// Tests Each().\n\nTEST(EachTest, ExplainsMatchResultCorrectly) {\n  set<int> a;  // empty\n\n  Matcher<set<int> > m = Each(2);\n  EXPECT_EQ(\"\", Explain(m, a));\n\n  Matcher<const int(&)[1]> n = Each(1);  // NOLINT\n\n  const int b[1] = {1};\n  EXPECT_EQ(\"\", Explain(n, b));\n\n  n = Each(3);\n  EXPECT_EQ(\"whose element #0 doesn't match\", Explain(n, b));\n\n  a.insert(1);\n  a.insert(2);\n  a.insert(3);\n  m = Each(GreaterThan(0));\n  EXPECT_EQ(\"\", Explain(m, a));\n\n  m = Each(GreaterThan(10));\n  EXPECT_EQ(\"whose element #0 doesn't match, which is 9 less than 10\",\n            Explain(m, a));\n}\n\nTEST(EachTest, DescribesItselfCorrectly) {\n  Matcher<vector<int> > m = Each(1);\n  EXPECT_EQ(\"only contains elements that is equal to 1\", Describe(m));\n\n  Matcher<vector<int> > m2 = Not(m);\n  EXPECT_EQ(\"contains some element that isn't equal to 1\", Describe(m2));\n}\n\nTEST(EachTest, MatchesVectorWhenAllElementsMatch) {\n  vector<int> some_vector;\n  EXPECT_THAT(some_vector, Each(1));\n  some_vector.push_back(3);\n  EXPECT_THAT(some_vector, Not(Each(1)));\n  EXPECT_THAT(some_vector, Each(3));\n  some_vector.push_back(1);\n  some_vector.push_back(2);\n  EXPECT_THAT(some_vector, Not(Each(3)));\n  EXPECT_THAT(some_vector, Each(Lt(3.5)));\n\n  vector<std::string> another_vector;\n  another_vector.push_back(\"fee\");\n  EXPECT_THAT(another_vector, Each(std::string(\"fee\")));\n  another_vector.push_back(\"fie\");\n  another_vector.push_back(\"foe\");\n  another_vector.push_back(\"fum\");\n  EXPECT_THAT(another_vector, Not(Each(std::string(\"fee\"))));\n}\n\nTEST(EachTest, MatchesMapWhenAllElementsMatch) {\n  map<const char*, int> my_map;\n  const char* bar = \"a string\";\n  my_map[bar] = 2;\n  EXPECT_THAT(my_map, Each(make_pair(bar, 2)));\n\n  map<std::string, int> another_map;\n  EXPECT_THAT(another_map, Each(make_pair(std::string(\"fee\"), 1)));\n  another_map[\"fee\"] = 1;\n  EXPECT_THAT(another_map, Each(make_pair(std::string(\"fee\"), 1)));\n  another_map[\"fie\"] = 2;\n  another_map[\"foe\"] = 3;\n  another_map[\"fum\"] = 4;\n  EXPECT_THAT(another_map, Not(Each(make_pair(std::string(\"fee\"), 1))));\n  EXPECT_THAT(another_map, Not(Each(make_pair(std::string(\"fum\"), 1))));\n  EXPECT_THAT(another_map, Each(Pair(_, Gt(0))));\n}\n\nTEST(EachTest, AcceptsMatcher) {\n  const int a[] = {1, 2, 3};\n  EXPECT_THAT(a, Each(Gt(0)));\n  EXPECT_THAT(a, Not(Each(Gt(1))));\n}\n\nTEST(EachTest, WorksForNativeArrayAsTuple) {\n  const int a[] = {1, 2};\n  const int* const pointer = a;\n  EXPECT_THAT(make_tuple(pointer, 2), Each(Gt(0)));\n  EXPECT_THAT(make_tuple(pointer, 2), Not(Each(Gt(1))));\n}\n\n// For testing Pointwise().\nclass IsHalfOfMatcher {\n public:\n  template <typename T1, typename T2>\n  bool MatchAndExplain(const tuple<T1, T2>& a_pair,\n                       MatchResultListener* listener) const {\n    if (get<0>(a_pair) == get<1>(a_pair)/2) {\n      *listener << \"where the second is \" << get<1>(a_pair);\n      return true;\n    } else {\n      *listener << \"where the second/2 is \" << get<1>(a_pair)/2;\n      return false;\n    }\n  }\n\n  void DescribeTo(ostream* os) const {\n    *os << \"are a pair where the first is half of the second\";\n  }\n\n  void DescribeNegationTo(ostream* os) const {\n    *os << \"are a pair where the first isn't half of the second\";\n  }\n};\n\nPolymorphicMatcher<IsHalfOfMatcher> IsHalfOf() {\n  return MakePolymorphicMatcher(IsHalfOfMatcher());\n}\n\nTEST(PointwiseTest, DescribesSelf) {\n  vector<int> rhs;\n  rhs.push_back(1);\n  rhs.push_back(2);\n  rhs.push_back(3);\n  const Matcher<const vector<int>&> m = Pointwise(IsHalfOf(), rhs);\n  EXPECT_EQ(\"contains 3 values, where each value and its corresponding value \"\n            \"in { 1, 2, 3 } are a pair where the first is half of the second\",\n            Describe(m));\n  EXPECT_EQ(\"doesn't contain exactly 3 values, or contains a value x at some \"\n            \"index i where x and the i-th value of { 1, 2, 3 } are a pair \"\n            \"where the first isn't half of the second\",\n            DescribeNegation(m));\n}\n\nTEST(PointwiseTest, MakesCopyOfRhs) {\n  list<signed char> rhs;\n  rhs.push_back(2);\n  rhs.push_back(4);\n\n  int lhs[] = {1, 2};\n  const Matcher<const int (&)[2]> m = Pointwise(IsHalfOf(), rhs);\n  EXPECT_THAT(lhs, m);\n\n  // Changing rhs now shouldn't affect m, which made a copy of rhs.\n  rhs.push_back(6);\n  EXPECT_THAT(lhs, m);\n}\n\nTEST(PointwiseTest, WorksForLhsNativeArray) {\n  const int lhs[] = {1, 2, 3};\n  vector<int> rhs;\n  rhs.push_back(2);\n  rhs.push_back(4);\n  rhs.push_back(6);\n  EXPECT_THAT(lhs, Pointwise(Lt(), rhs));\n  EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs)));\n}\n\nTEST(PointwiseTest, WorksForRhsNativeArray) {\n  const int rhs[] = {1, 2, 3};\n  vector<int> lhs;\n  lhs.push_back(2);\n  lhs.push_back(4);\n  lhs.push_back(6);\n  EXPECT_THAT(lhs, Pointwise(Gt(), rhs));\n  EXPECT_THAT(lhs, Not(Pointwise(Lt(), rhs)));\n}\n\n// Test is effective only with sanitizers.\nTEST(PointwiseTest, WorksForVectorOfBool) {\n  vector<bool> rhs(3, false);\n  rhs[1] = true;\n  vector<bool> lhs = rhs;\n  EXPECT_THAT(lhs, Pointwise(Eq(), rhs));\n  rhs[0] = true;\n  EXPECT_THAT(lhs, Not(Pointwise(Eq(), rhs)));\n}\n\n#if GTEST_HAS_STD_INITIALIZER_LIST_\n\nTEST(PointwiseTest, WorksForRhsInitializerList) {\n  const vector<int> lhs{2, 4, 6};\n  EXPECT_THAT(lhs, Pointwise(Gt(), {1, 2, 3}));\n  EXPECT_THAT(lhs, Not(Pointwise(Lt(), {3, 3, 7})));\n}\n\n#endif  // GTEST_HAS_STD_INITIALIZER_LIST_\n\nTEST(PointwiseTest, RejectsWrongSize) {\n  const double lhs[2] = {1, 2};\n  const int rhs[1] = {0};\n  EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs)));\n  EXPECT_EQ(\"which contains 2 values\",\n            Explain(Pointwise(Gt(), rhs), lhs));\n\n  const int rhs2[3] = {0, 1, 2};\n  EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs2)));\n}\n\nTEST(PointwiseTest, RejectsWrongContent) {\n  const double lhs[3] = {1, 2, 3};\n  const int rhs[3] = {2, 6, 4};\n  EXPECT_THAT(lhs, Not(Pointwise(IsHalfOf(), rhs)));\n  EXPECT_EQ(\"where the value pair (2, 6) at index #1 don't match, \"\n            \"where the second/2 is 3\",\n            Explain(Pointwise(IsHalfOf(), rhs), lhs));\n}\n\nTEST(PointwiseTest, AcceptsCorrectContent) {\n  const double lhs[3] = {1, 2, 3};\n  const int rhs[3] = {2, 4, 6};\n  EXPECT_THAT(lhs, Pointwise(IsHalfOf(), rhs));\n  EXPECT_EQ(\"\", Explain(Pointwise(IsHalfOf(), rhs), lhs));\n}\n\nTEST(PointwiseTest, AllowsMonomorphicInnerMatcher) {\n  const double lhs[3] = {1, 2, 3};\n  const int rhs[3] = {2, 4, 6};\n  const Matcher<tuple<const double&, const int&> > m1 = IsHalfOf();\n  EXPECT_THAT(lhs, Pointwise(m1, rhs));\n  EXPECT_EQ(\"\", Explain(Pointwise(m1, rhs), lhs));\n\n  // This type works as a tuple<const double&, const int&> can be\n  // implicitly cast to tuple<double, int>.\n  const Matcher<tuple<double, int> > m2 = IsHalfOf();\n  EXPECT_THAT(lhs, Pointwise(m2, rhs));\n  EXPECT_EQ(\"\", Explain(Pointwise(m2, rhs), lhs));\n}\n\nTEST(UnorderedPointwiseTest, DescribesSelf) {\n  vector<int> rhs;\n  rhs.push_back(1);\n  rhs.push_back(2);\n  rhs.push_back(3);\n  const Matcher<const vector<int>&> m = UnorderedPointwise(IsHalfOf(), rhs);\n  EXPECT_EQ(\n      \"has 3 elements and there exists some permutation of elements such \"\n      \"that:\\n\"\n      \" - element #0 and 1 are a pair where the first is half of the second, \"\n      \"and\\n\"\n      \" - element #1 and 2 are a pair where the first is half of the second, \"\n      \"and\\n\"\n      \" - element #2 and 3 are a pair where the first is half of the second\",\n      Describe(m));\n  EXPECT_EQ(\n      \"doesn't have 3 elements, or there exists no permutation of elements \"\n      \"such that:\\n\"\n      \" - element #0 and 1 are a pair where the first is half of the second, \"\n      \"and\\n\"\n      \" - element #1 and 2 are a pair where the first is half of the second, \"\n      \"and\\n\"\n      \" - element #2 and 3 are a pair where the first is half of the second\",\n      DescribeNegation(m));\n}\n\nTEST(UnorderedPointwiseTest, MakesCopyOfRhs) {\n  list<signed char> rhs;\n  rhs.push_back(2);\n  rhs.push_back(4);\n\n  int lhs[] = {2, 1};\n  const Matcher<const int (&)[2]> m = UnorderedPointwise(IsHalfOf(), rhs);\n  EXPECT_THAT(lhs, m);\n\n  // Changing rhs now shouldn't affect m, which made a copy of rhs.\n  rhs.push_back(6);\n  EXPECT_THAT(lhs, m);\n}\n\nTEST(UnorderedPointwiseTest, WorksForLhsNativeArray) {\n  const int lhs[] = {1, 2, 3};\n  vector<int> rhs;\n  rhs.push_back(4);\n  rhs.push_back(6);\n  rhs.push_back(2);\n  EXPECT_THAT(lhs, UnorderedPointwise(Lt(), rhs));\n  EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs)));\n}\n\nTEST(UnorderedPointwiseTest, WorksForRhsNativeArray) {\n  const int rhs[] = {1, 2, 3};\n  vector<int> lhs;\n  lhs.push_back(4);\n  lhs.push_back(2);\n  lhs.push_back(6);\n  EXPECT_THAT(lhs, UnorderedPointwise(Gt(), rhs));\n  EXPECT_THAT(lhs, Not(UnorderedPointwise(Lt(), rhs)));\n}\n\n#if GTEST_HAS_STD_INITIALIZER_LIST_\n\nTEST(UnorderedPointwiseTest, WorksForRhsInitializerList) {\n  const vector<int> lhs{2, 4, 6};\n  EXPECT_THAT(lhs, UnorderedPointwise(Gt(), {5, 1, 3}));\n  EXPECT_THAT(lhs, Not(UnorderedPointwise(Lt(), {1, 1, 7})));\n}\n\n#endif  // GTEST_HAS_STD_INITIALIZER_LIST_\n\nTEST(UnorderedPointwiseTest, RejectsWrongSize) {\n  const double lhs[2] = {1, 2};\n  const int rhs[1] = {0};\n  EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs)));\n  EXPECT_EQ(\"which has 2 elements\",\n            Explain(UnorderedPointwise(Gt(), rhs), lhs));\n\n  const int rhs2[3] = {0, 1, 2};\n  EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs2)));\n}\n\nTEST(UnorderedPointwiseTest, RejectsWrongContent) {\n  const double lhs[3] = {1, 2, 3};\n  const int rhs[3] = {2, 6, 6};\n  EXPECT_THAT(lhs, Not(UnorderedPointwise(IsHalfOf(), rhs)));\n  EXPECT_EQ(\"where the following elements don't match any matchers:\\n\"\n            \"element #1: 2\",\n            Explain(UnorderedPointwise(IsHalfOf(), rhs), lhs));\n}\n\nTEST(UnorderedPointwiseTest, AcceptsCorrectContentInSameOrder) {\n  const double lhs[3] = {1, 2, 3};\n  const int rhs[3] = {2, 4, 6};\n  EXPECT_THAT(lhs, UnorderedPointwise(IsHalfOf(), rhs));\n}\n\nTEST(UnorderedPointwiseTest, AcceptsCorrectContentInDifferentOrder) {\n  const double lhs[3] = {1, 2, 3};\n  const int rhs[3] = {6, 4, 2};\n  EXPECT_THAT(lhs, UnorderedPointwise(IsHalfOf(), rhs));\n}\n\nTEST(UnorderedPointwiseTest, AllowsMonomorphicInnerMatcher) {\n  const double lhs[3] = {1, 2, 3};\n  const int rhs[3] = {4, 6, 2};\n  const Matcher<tuple<const double&, const int&> > m1 = IsHalfOf();\n  EXPECT_THAT(lhs, UnorderedPointwise(m1, rhs));\n\n  // This type works as a tuple<const double&, const int&> can be\n  // implicitly cast to tuple<double, int>.\n  const Matcher<tuple<double, int> > m2 = IsHalfOf();\n  EXPECT_THAT(lhs, UnorderedPointwise(m2, rhs));\n}\n\n// Sample optional type implementation with minimal requirements for use with\n// Optional matcher.\nclass SampleOptionalInt {\n public:\n  typedef int value_type;\n  explicit SampleOptionalInt(int value) : value_(value), has_value_(true) {}\n  SampleOptionalInt() : value_(0), has_value_(false) {}\n  operator bool() const {\n    return has_value_;\n  }\n  const int& operator*() const {\n    return value_;\n  }\n private:\n  int value_;\n  bool has_value_;\n};\n\nTEST(OptionalTest, DescribesSelf) {\n  const Matcher<SampleOptionalInt> m = Optional(Eq(1));\n  EXPECT_EQ(\"value is equal to 1\", Describe(m));\n}\n\nTEST(OptionalTest, ExplainsSelf) {\n  const Matcher<SampleOptionalInt> m = Optional(Eq(1));\n  EXPECT_EQ(\"whose value 1 matches\", Explain(m, SampleOptionalInt(1)));\n  EXPECT_EQ(\"whose value 2 doesn't match\", Explain(m, SampleOptionalInt(2)));\n}\n\nTEST(OptionalTest, MatchesNonEmptyOptional) {\n  const Matcher<SampleOptionalInt> m1 = Optional(1);\n  const Matcher<SampleOptionalInt> m2 = Optional(Eq(2));\n  const Matcher<SampleOptionalInt> m3 = Optional(Lt(3));\n  SampleOptionalInt opt(1);\n  EXPECT_TRUE(m1.Matches(opt));\n  EXPECT_FALSE(m2.Matches(opt));\n  EXPECT_TRUE(m3.Matches(opt));\n}\n\nTEST(OptionalTest, DoesNotMatchNullopt) {\n  const Matcher<SampleOptionalInt> m = Optional(1);\n  SampleOptionalInt empty;\n  EXPECT_FALSE(m.Matches(empty));\n}\n\nclass SampleVariantIntString {\n public:\n  SampleVariantIntString(int i) : i_(i), has_int_(true) {}\n  SampleVariantIntString(const std::string& s) : s_(s), has_int_(false) {}\n\n  template <typename T>\n  friend bool holds_alternative(const SampleVariantIntString& value) {\n    return value.has_int_ == internal::IsSame<T, int>::value;\n  }\n\n  template <typename T>\n  friend const T& get(const SampleVariantIntString& value) {\n    return value.get_impl(static_cast<T*>(NULL));\n  }\n\n private:\n  const int& get_impl(int*) const { return i_; }\n  const std::string& get_impl(std::string*) const { return s_; }\n\n  int i_;\n  std::string s_;\n  bool has_int_;\n};\n\nTEST(VariantTest, DescribesSelf) {\n  const Matcher<SampleVariantIntString> m = VariantWith<int>(Eq(1));\n  EXPECT_THAT(Describe(m), ContainsRegex(\"is a variant<> with value of type \"\n                                         \"'.*' and the value is equal to 1\"));\n}\n\nTEST(VariantTest, ExplainsSelf) {\n  const Matcher<SampleVariantIntString> m = VariantWith<int>(Eq(1));\n  EXPECT_THAT(Explain(m, SampleVariantIntString(1)),\n              ContainsRegex(\"whose value 1\"));\n  EXPECT_THAT(Explain(m, SampleVariantIntString(\"A\")),\n              HasSubstr(\"whose value is not of type '\"));\n  EXPECT_THAT(Explain(m, SampleVariantIntString(2)),\n              \"whose value 2 doesn't match\");\n}\n\nTEST(VariantTest, FullMatch) {\n  Matcher<SampleVariantIntString> m = VariantWith<int>(Eq(1));\n  EXPECT_TRUE(m.Matches(SampleVariantIntString(1)));\n\n  m = VariantWith<std::string>(Eq(\"1\"));\n  EXPECT_TRUE(m.Matches(SampleVariantIntString(\"1\")));\n}\n\nTEST(VariantTest, TypeDoesNotMatch) {\n  Matcher<SampleVariantIntString> m = VariantWith<int>(Eq(1));\n  EXPECT_FALSE(m.Matches(SampleVariantIntString(\"1\")));\n\n  m = VariantWith<std::string>(Eq(\"1\"));\n  EXPECT_FALSE(m.Matches(SampleVariantIntString(1)));\n}\n\nTEST(VariantTest, InnerDoesNotMatch) {\n  Matcher<SampleVariantIntString> m = VariantWith<int>(Eq(1));\n  EXPECT_FALSE(m.Matches(SampleVariantIntString(2)));\n\n  m = VariantWith<std::string>(Eq(\"1\"));\n  EXPECT_FALSE(m.Matches(SampleVariantIntString(\"2\")));\n}\n\nclass SampleAnyType {\n public:\n  explicit SampleAnyType(int i) : index_(0), i_(i) {}\n  explicit SampleAnyType(const std::string& s) : index_(1), s_(s) {}\n\n  template <typename T>\n  friend const T* any_cast(const SampleAnyType* any) {\n    return any->get_impl(static_cast<T*>(NULL));\n  }\n\n private:\n  int index_;\n  int i_;\n  std::string s_;\n\n  const int* get_impl(int*) const { return index_ == 0 ? &i_ : NULL; }\n  const std::string* get_impl(std::string*) const {\n    return index_ == 1 ? &s_ : NULL;\n  }\n};\n\nTEST(AnyWithTest, FullMatch) {\n  Matcher<SampleAnyType> m = AnyWith<int>(Eq(1));\n  EXPECT_TRUE(m.Matches(SampleAnyType(1)));\n}\n\nTEST(AnyWithTest, TestBadCastType) {\n  Matcher<SampleAnyType> m = AnyWith<std::string>(Eq(\"fail\"));\n  EXPECT_FALSE(m.Matches(SampleAnyType(1)));\n}\n\n#if GTEST_LANG_CXX11\nTEST(AnyWithTest, TestUseInContainers) {\n  std::vector<SampleAnyType> a;\n  a.emplace_back(1);\n  a.emplace_back(2);\n  a.emplace_back(3);\n  EXPECT_THAT(\n      a, ElementsAreArray({AnyWith<int>(1), AnyWith<int>(2), AnyWith<int>(3)}));\n\n  std::vector<SampleAnyType> b;\n  b.emplace_back(\"hello\");\n  b.emplace_back(\"merhaba\");\n  b.emplace_back(\"salut\");\n  EXPECT_THAT(b, ElementsAreArray({AnyWith<std::string>(\"hello\"),\n                                   AnyWith<std::string>(\"merhaba\"),\n                                   AnyWith<std::string>(\"salut\")}));\n}\n#endif  //  GTEST_LANG_CXX11\nTEST(AnyWithTest, TestCompare) {\n  EXPECT_THAT(SampleAnyType(1), AnyWith<int>(Gt(0)));\n}\n\nTEST(AnyWithTest, DescribesSelf) {\n  const Matcher<const SampleAnyType&> m = AnyWith<int>(Eq(1));\n  EXPECT_THAT(Describe(m), ContainsRegex(\"is an 'any' type with value of type \"\n                                         \"'.*' and the value is equal to 1\"));\n}\n\nTEST(AnyWithTest, ExplainsSelf) {\n  const Matcher<const SampleAnyType&> m = AnyWith<int>(Eq(1));\n\n  EXPECT_THAT(Explain(m, SampleAnyType(1)), ContainsRegex(\"whose value 1\"));\n  EXPECT_THAT(Explain(m, SampleAnyType(\"A\")),\n              HasSubstr(\"whose value is not of type '\"));\n  EXPECT_THAT(Explain(m, SampleAnyType(2)), \"whose value 2 doesn't match\");\n}\n\n#if GTEST_LANG_CXX11\n\nTEST(PointeeTest, WorksOnMoveOnlyType) {\n  std::unique_ptr<int> p(new int(3));\n  EXPECT_THAT(p, Pointee(Eq(3)));\n  EXPECT_THAT(p, Not(Pointee(Eq(2))));\n}\n\nTEST(NotTest, WorksOnMoveOnlyType) {\n  std::unique_ptr<int> p(new int(3));\n  EXPECT_THAT(p, Pointee(Eq(3)));\n  EXPECT_THAT(p, Not(Pointee(Eq(2))));\n}\n\n#endif  // GTEST_LANG_CXX11\n\n}  // namespace gmock_matchers_test\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock-more-actions_test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file tests the built-in actions in gmock-more-actions.h.\n\n#include \"gmock/gmock-more-actions.h\"\n\n#include <functional>\n#include <sstream>\n#include <string>\n#include \"gmock/gmock.h\"\n#include \"gtest/gtest.h\"\n#include \"gtest/internal/gtest-linked_ptr.h\"\n\nnamespace testing {\nnamespace gmock_more_actions_test {\n\nusing ::std::plus;\nusing ::std::string;\nusing testing::get;\nusing testing::make_tuple;\nusing testing::tuple;\nusing testing::tuple_element;\nusing testing::_;\nusing testing::Action;\nusing testing::ActionInterface;\nusing testing::DeleteArg;\nusing testing::Invoke;\nusing testing::Return;\nusing testing::ReturnArg;\nusing testing::ReturnPointee;\nusing testing::SaveArg;\nusing testing::SaveArgPointee;\nusing testing::SetArgReferee;\nusing testing::StaticAssertTypeEq;\nusing testing::Unused;\nusing testing::WithArg;\nusing testing::WithoutArgs;\nusing testing::internal::linked_ptr;\n\n// For suppressing compiler warnings on conversion possibly losing precision.\ninline short Short(short n) { return n; }  // NOLINT\ninline char Char(char ch) { return ch; }\n\n// Sample functions and functors for testing Invoke() and etc.\nint Nullary() { return 1; }\n\nclass NullaryFunctor {\n public:\n  int operator()() { return 2; }\n};\n\nbool g_done = false;\nvoid VoidNullary() { g_done = true; }\n\nclass VoidNullaryFunctor {\n public:\n  void operator()() { g_done = true; }\n};\n\nbool Unary(int x) { return x < 0; }\n\nconst char* Plus1(const char* s) { return s + 1; }\n\nvoid VoidUnary(int /* n */) { g_done = true; }\n\nbool ByConstRef(const std::string& s) { return s == \"Hi\"; }\n\nconst double g_double = 0;\nbool ReferencesGlobalDouble(const double& x) { return &x == &g_double; }\n\nstd::string ByNonConstRef(std::string& s) { return s += \"+\"; }  // NOLINT\n\nstruct UnaryFunctor {\n  int operator()(bool x) { return x ? 1 : -1; }\n};\n\nconst char* Binary(const char* input, short n) { return input + n; }  // NOLINT\n\nvoid VoidBinary(int, char) { g_done = true; }\n\nint Ternary(int x, char y, short z) { return x + y + z; }  // NOLINT\n\nvoid VoidTernary(int, char, bool) { g_done = true; }\n\nint SumOf4(int a, int b, int c, int d) { return a + b + c + d; }\n\nint SumOfFirst2(int a, int b, Unused, Unused) { return a + b; }\n\nvoid VoidFunctionWithFourArguments(char, int, float, double) { g_done = true; }\n\nstd::string Concat4(const char* s1, const char* s2, const char* s3,\n                    const char* s4) {\n  return std::string(s1) + s2 + s3 + s4;\n}\n\nint SumOf5(int a, int b, int c, int d, int e) { return a + b + c + d + e; }\n\nstruct SumOf5Functor {\n  int operator()(int a, int b, int c, int d, int e) {\n    return a + b + c + d + e;\n  }\n};\n\nstd::string Concat5(const char* s1, const char* s2, const char* s3,\n                    const char* s4, const char* s5) {\n  return std::string(s1) + s2 + s3 + s4 + s5;\n}\n\nint SumOf6(int a, int b, int c, int d, int e, int f) {\n  return a + b + c + d + e + f;\n}\n\nstruct SumOf6Functor {\n  int operator()(int a, int b, int c, int d, int e, int f) {\n    return a + b + c + d + e + f;\n  }\n};\n\nstd::string Concat6(const char* s1, const char* s2, const char* s3,\n                    const char* s4, const char* s5, const char* s6) {\n  return std::string(s1) + s2 + s3 + s4 + s5 + s6;\n}\n\nstd::string Concat7(const char* s1, const char* s2, const char* s3,\n                    const char* s4, const char* s5, const char* s6,\n                    const char* s7) {\n  return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7;\n}\n\nstd::string Concat8(const char* s1, const char* s2, const char* s3,\n                    const char* s4, const char* s5, const char* s6,\n                    const char* s7, const char* s8) {\n  return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8;\n}\n\nstd::string Concat9(const char* s1, const char* s2, const char* s3,\n                    const char* s4, const char* s5, const char* s6,\n                    const char* s7, const char* s8, const char* s9) {\n  return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9;\n}\n\nstd::string Concat10(const char* s1, const char* s2, const char* s3,\n                     const char* s4, const char* s5, const char* s6,\n                     const char* s7, const char* s8, const char* s9,\n                     const char* s10) {\n  return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;\n}\n\nclass Foo {\n public:\n  Foo() : value_(123) {}\n\n  int Nullary() const { return value_; }\n\n  short Unary(long x) { return static_cast<short>(value_ + x); }  // NOLINT\n\n  std::string Binary(const std::string& str, char c) const { return str + c; }\n\n  int Ternary(int x, bool y, char z) { return value_ + x + y*z; }\n\n  int SumOf4(int a, int b, int c, int d) const {\n    return a + b + c + d + value_;\n  }\n\n  int SumOfLast2(Unused, Unused, int a, int b) const { return a + b; }\n\n  int SumOf5(int a, int b, int c, int d, int e) { return a + b + c + d + e; }\n\n  int SumOf6(int a, int b, int c, int d, int e, int f) {\n    return a + b + c + d + e + f;\n  }\n\n  std::string Concat7(const char* s1, const char* s2, const char* s3,\n                      const char* s4, const char* s5, const char* s6,\n                      const char* s7) {\n    return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7;\n  }\n\n  std::string Concat8(const char* s1, const char* s2, const char* s3,\n                      const char* s4, const char* s5, const char* s6,\n                      const char* s7, const char* s8) {\n    return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8;\n  }\n\n  std::string Concat9(const char* s1, const char* s2, const char* s3,\n                      const char* s4, const char* s5, const char* s6,\n                      const char* s7, const char* s8, const char* s9) {\n    return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9;\n  }\n\n  std::string Concat10(const char* s1, const char* s2, const char* s3,\n                       const char* s4, const char* s5, const char* s6,\n                       const char* s7, const char* s8, const char* s9,\n                       const char* s10) {\n    return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;\n  }\n\n private:\n  int value_;\n};\n\n// Tests using Invoke() with a nullary function.\nTEST(InvokeTest, Nullary) {\n  Action<int()> a = Invoke(Nullary);  // NOLINT\n  EXPECT_EQ(1, a.Perform(make_tuple()));\n}\n\n// Tests using Invoke() with a unary function.\nTEST(InvokeTest, Unary) {\n  Action<bool(int)> a = Invoke(Unary);  // NOLINT\n  EXPECT_FALSE(a.Perform(make_tuple(1)));\n  EXPECT_TRUE(a.Perform(make_tuple(-1)));\n}\n\n// Tests using Invoke() with a binary function.\nTEST(InvokeTest, Binary) {\n  Action<const char*(const char*, short)> a = Invoke(Binary);  // NOLINT\n  const char* p = \"Hello\";\n  EXPECT_EQ(p + 2, a.Perform(make_tuple(p, Short(2))));\n}\n\n// Tests using Invoke() with a ternary function.\nTEST(InvokeTest, Ternary) {\n  Action<int(int, char, short)> a = Invoke(Ternary);  // NOLINT\n  EXPECT_EQ(6, a.Perform(make_tuple(1, '\\2', Short(3))));\n}\n\n// Tests using Invoke() with a 4-argument function.\nTEST(InvokeTest, FunctionThatTakes4Arguments) {\n  Action<int(int, int, int, int)> a = Invoke(SumOf4);  // NOLINT\n  EXPECT_EQ(1234, a.Perform(make_tuple(1000, 200, 30, 4)));\n}\n\n// Tests using Invoke() with a 5-argument function.\nTEST(InvokeTest, FunctionThatTakes5Arguments) {\n  Action<int(int, int, int, int, int)> a = Invoke(SumOf5);  // NOLINT\n  EXPECT_EQ(12345, a.Perform(make_tuple(10000, 2000, 300, 40, 5)));\n}\n\n// Tests using Invoke() with a 6-argument function.\nTEST(InvokeTest, FunctionThatTakes6Arguments) {\n  Action<int(int, int, int, int, int, int)> a = Invoke(SumOf6);  // NOLINT\n  EXPECT_EQ(123456, a.Perform(make_tuple(100000, 20000, 3000, 400, 50, 6)));\n}\n\n// A helper that turns the type of a C-string literal from const\n// char[N] to const char*.\ninline const char* CharPtr(const char* s) { return s; }\n\n// Tests using Invoke() with a 7-argument function.\nTEST(InvokeTest, FunctionThatTakes7Arguments) {\n  Action<std::string(const char*, const char*, const char*, const char*,\n                     const char*, const char*, const char*)>\n      a = Invoke(Concat7);\n  EXPECT_EQ(\"1234567\",\n            a.Perform(make_tuple(CharPtr(\"1\"), CharPtr(\"2\"), CharPtr(\"3\"),\n                                 CharPtr(\"4\"), CharPtr(\"5\"), CharPtr(\"6\"),\n                                 CharPtr(\"7\"))));\n}\n\n// Tests using Invoke() with a 8-argument function.\nTEST(InvokeTest, FunctionThatTakes8Arguments) {\n  Action<std::string(const char*, const char*, const char*, const char*,\n                     const char*, const char*, const char*, const char*)>\n      a = Invoke(Concat8);\n  EXPECT_EQ(\"12345678\",\n            a.Perform(make_tuple(CharPtr(\"1\"), CharPtr(\"2\"), CharPtr(\"3\"),\n                                 CharPtr(\"4\"), CharPtr(\"5\"), CharPtr(\"6\"),\n                                 CharPtr(\"7\"), CharPtr(\"8\"))));\n}\n\n// Tests using Invoke() with a 9-argument function.\nTEST(InvokeTest, FunctionThatTakes9Arguments) {\n  Action<std::string(const char*, const char*, const char*, const char*,\n                     const char*, const char*, const char*, const char*,\n                     const char*)>\n      a = Invoke(Concat9);\n  EXPECT_EQ(\"123456789\",\n            a.Perform(make_tuple(CharPtr(\"1\"), CharPtr(\"2\"), CharPtr(\"3\"),\n                                 CharPtr(\"4\"), CharPtr(\"5\"), CharPtr(\"6\"),\n                                 CharPtr(\"7\"), CharPtr(\"8\"), CharPtr(\"9\"))));\n}\n\n// Tests using Invoke() with a 10-argument function.\nTEST(InvokeTest, FunctionThatTakes10Arguments) {\n  Action<std::string(const char*, const char*, const char*, const char*,\n                     const char*, const char*, const char*, const char*,\n                     const char*, const char*)>\n      a = Invoke(Concat10);\n  EXPECT_EQ(\"1234567890\",\n            a.Perform(make_tuple(CharPtr(\"1\"), CharPtr(\"2\"), CharPtr(\"3\"),\n                                 CharPtr(\"4\"), CharPtr(\"5\"), CharPtr(\"6\"),\n                                 CharPtr(\"7\"), CharPtr(\"8\"), CharPtr(\"9\"),\n                                 CharPtr(\"0\"))));\n}\n\n// Tests using Invoke() with functions with parameters declared as Unused.\nTEST(InvokeTest, FunctionWithUnusedParameters) {\n  Action<int(int, int, double, const std::string&)> a1 = Invoke(SumOfFirst2);\n  tuple<int, int, double, std::string> dummy =\n      make_tuple(10, 2, 5.6, std::string(\"hi\"));\n  EXPECT_EQ(12, a1.Perform(dummy));\n\n  Action<int(int, int, bool, int*)> a2 =\n      Invoke(SumOfFirst2);\n  EXPECT_EQ(23, a2.Perform(make_tuple(20, 3, true, static_cast<int*>(NULL))));\n}\n\n// Tests using Invoke() with methods with parameters declared as Unused.\nTEST(InvokeTest, MethodWithUnusedParameters) {\n  Foo foo;\n  Action<int(std::string, bool, int, int)> a1 = Invoke(&foo, &Foo::SumOfLast2);\n  EXPECT_EQ(12, a1.Perform(make_tuple(CharPtr(\"hi\"), true, 10, 2)));\n\n  Action<int(char, double, int, int)> a2 =\n      Invoke(&foo, &Foo::SumOfLast2);\n  EXPECT_EQ(23, a2.Perform(make_tuple('a', 2.5, 20, 3)));\n}\n\n// Tests using Invoke() with a functor.\nTEST(InvokeTest, Functor) {\n  Action<long(long, int)> a = Invoke(plus<long>());  // NOLINT\n  EXPECT_EQ(3L, a.Perform(make_tuple(1, 2)));\n}\n\n// Tests using Invoke(f) as an action of a compatible type.\nTEST(InvokeTest, FunctionWithCompatibleType) {\n  Action<long(int, short, char, bool)> a = Invoke(SumOf4);  // NOLINT\n  EXPECT_EQ(4321, a.Perform(make_tuple(4000, Short(300), Char(20), true)));\n}\n\n// Tests using Invoke() with an object pointer and a method pointer.\n\n// Tests using Invoke() with a nullary method.\nTEST(InvokeMethodTest, Nullary) {\n  Foo foo;\n  Action<int()> a = Invoke(&foo, &Foo::Nullary);  // NOLINT\n  EXPECT_EQ(123, a.Perform(make_tuple()));\n}\n\n// Tests using Invoke() with a unary method.\nTEST(InvokeMethodTest, Unary) {\n  Foo foo;\n  Action<short(long)> a = Invoke(&foo, &Foo::Unary);  // NOLINT\n  EXPECT_EQ(4123, a.Perform(make_tuple(4000)));\n}\n\n// Tests using Invoke() with a binary method.\nTEST(InvokeMethodTest, Binary) {\n  Foo foo;\n  Action<std::string(const std::string&, char)> a = Invoke(&foo, &Foo::Binary);\n  std::string s(\"Hell\");\n  tuple<std::string, char> dummy = make_tuple(s, 'o');\n  EXPECT_EQ(\"Hello\", a.Perform(dummy));\n}\n\n// Tests using Invoke() with a ternary method.\nTEST(InvokeMethodTest, Ternary) {\n  Foo foo;\n  Action<int(int, bool, char)> a = Invoke(&foo, &Foo::Ternary);  // NOLINT\n  EXPECT_EQ(1124, a.Perform(make_tuple(1000, true, Char(1))));\n}\n\n// Tests using Invoke() with a 4-argument method.\nTEST(InvokeMethodTest, MethodThatTakes4Arguments) {\n  Foo foo;\n  Action<int(int, int, int, int)> a = Invoke(&foo, &Foo::SumOf4);  // NOLINT\n  EXPECT_EQ(1357, a.Perform(make_tuple(1000, 200, 30, 4)));\n}\n\n// Tests using Invoke() with a 5-argument method.\nTEST(InvokeMethodTest, MethodThatTakes5Arguments) {\n  Foo foo;\n  Action<int(int, int, int, int, int)> a = Invoke(&foo, &Foo::SumOf5);  // NOLINT\n  EXPECT_EQ(12345, a.Perform(make_tuple(10000, 2000, 300, 40, 5)));\n}\n\n// Tests using Invoke() with a 6-argument method.\nTEST(InvokeMethodTest, MethodThatTakes6Arguments) {\n  Foo foo;\n  Action<int(int, int, int, int, int, int)> a =  // NOLINT\n      Invoke(&foo, &Foo::SumOf6);\n  EXPECT_EQ(123456, a.Perform(make_tuple(100000, 20000, 3000, 400, 50, 6)));\n}\n\n// Tests using Invoke() with a 7-argument method.\nTEST(InvokeMethodTest, MethodThatTakes7Arguments) {\n  Foo foo;\n  Action<std::string(const char*, const char*, const char*, const char*,\n                     const char*, const char*, const char*)>\n      a = Invoke(&foo, &Foo::Concat7);\n  EXPECT_EQ(\"1234567\",\n            a.Perform(make_tuple(CharPtr(\"1\"), CharPtr(\"2\"), CharPtr(\"3\"),\n                                 CharPtr(\"4\"), CharPtr(\"5\"), CharPtr(\"6\"),\n                                 CharPtr(\"7\"))));\n}\n\n// Tests using Invoke() with a 8-argument method.\nTEST(InvokeMethodTest, MethodThatTakes8Arguments) {\n  Foo foo;\n  Action<std::string(const char*, const char*, const char*, const char*,\n                     const char*, const char*, const char*, const char*)>\n      a = Invoke(&foo, &Foo::Concat8);\n  EXPECT_EQ(\"12345678\",\n            a.Perform(make_tuple(CharPtr(\"1\"), CharPtr(\"2\"), CharPtr(\"3\"),\n                                 CharPtr(\"4\"), CharPtr(\"5\"), CharPtr(\"6\"),\n                                 CharPtr(\"7\"), CharPtr(\"8\"))));\n}\n\n// Tests using Invoke() with a 9-argument method.\nTEST(InvokeMethodTest, MethodThatTakes9Arguments) {\n  Foo foo;\n  Action<std::string(const char*, const char*, const char*, const char*,\n                     const char*, const char*, const char*, const char*,\n                     const char*)>\n      a = Invoke(&foo, &Foo::Concat9);\n  EXPECT_EQ(\"123456789\",\n            a.Perform(make_tuple(CharPtr(\"1\"), CharPtr(\"2\"), CharPtr(\"3\"),\n                                 CharPtr(\"4\"), CharPtr(\"5\"), CharPtr(\"6\"),\n                                 CharPtr(\"7\"), CharPtr(\"8\"), CharPtr(\"9\"))));\n}\n\n// Tests using Invoke() with a 10-argument method.\nTEST(InvokeMethodTest, MethodThatTakes10Arguments) {\n  Foo foo;\n  Action<std::string(const char*, const char*, const char*, const char*,\n                     const char*, const char*, const char*, const char*,\n                     const char*, const char*)>\n      a = Invoke(&foo, &Foo::Concat10);\n  EXPECT_EQ(\"1234567890\",\n            a.Perform(make_tuple(CharPtr(\"1\"), CharPtr(\"2\"), CharPtr(\"3\"),\n                                 CharPtr(\"4\"), CharPtr(\"5\"), CharPtr(\"6\"),\n                                 CharPtr(\"7\"), CharPtr(\"8\"), CharPtr(\"9\"),\n                                 CharPtr(\"0\"))));\n}\n\n// Tests using Invoke(f) as an action of a compatible type.\nTEST(InvokeMethodTest, MethodWithCompatibleType) {\n  Foo foo;\n  Action<long(int, short, char, bool)> a =  // NOLINT\n      Invoke(&foo, &Foo::SumOf4);\n  EXPECT_EQ(4444, a.Perform(make_tuple(4000, Short(300), Char(20), true)));\n}\n\n// Tests using WithoutArgs with an action that takes no argument.\nTEST(WithoutArgsTest, NoArg) {\n  Action<int(int n)> a = WithoutArgs(Invoke(Nullary));  // NOLINT\n  EXPECT_EQ(1, a.Perform(make_tuple(2)));\n}\n\n// Tests using WithArg with an action that takes 1 argument.\nTEST(WithArgTest, OneArg) {\n  Action<bool(double x, int n)> b = WithArg<1>(Invoke(Unary));  // NOLINT\n  EXPECT_TRUE(b.Perform(make_tuple(1.5, -1)));\n  EXPECT_FALSE(b.Perform(make_tuple(1.5, 1)));\n}\n\nTEST(ReturnArgActionTest, WorksForOneArgIntArg0) {\n  const Action<int(int)> a = ReturnArg<0>();\n  EXPECT_EQ(5, a.Perform(make_tuple(5)));\n}\n\nTEST(ReturnArgActionTest, WorksForMultiArgBoolArg0) {\n  const Action<bool(bool, bool, bool)> a = ReturnArg<0>();\n  EXPECT_TRUE(a.Perform(make_tuple(true, false, false)));\n}\n\nTEST(ReturnArgActionTest, WorksForMultiArgStringArg2) {\n  const Action<std::string(int, int, std::string, int)> a = ReturnArg<2>();\n  EXPECT_EQ(\"seven\", a.Perform(make_tuple(5, 6, std::string(\"seven\"), 8)));\n}\n\nTEST(SaveArgActionTest, WorksForSameType) {\n  int result = 0;\n  const Action<void(int n)> a1 = SaveArg<0>(&result);\n  a1.Perform(make_tuple(5));\n  EXPECT_EQ(5, result);\n}\n\nTEST(SaveArgActionTest, WorksForCompatibleType) {\n  int result = 0;\n  const Action<void(bool, char)> a1 = SaveArg<1>(&result);\n  a1.Perform(make_tuple(true, 'a'));\n  EXPECT_EQ('a', result);\n}\n\nTEST(SaveArgPointeeActionTest, WorksForSameType) {\n  int result = 0;\n  const int value = 5;\n  const Action<void(const int*)> a1 = SaveArgPointee<0>(&result);\n  a1.Perform(make_tuple(&value));\n  EXPECT_EQ(5, result);\n}\n\nTEST(SaveArgPointeeActionTest, WorksForCompatibleType) {\n  int result = 0;\n  char value = 'a';\n  const Action<void(bool, char*)> a1 = SaveArgPointee<1>(&result);\n  a1.Perform(make_tuple(true, &value));\n  EXPECT_EQ('a', result);\n}\n\nTEST(SaveArgPointeeActionTest, WorksForLinkedPtr) {\n  int result = 0;\n  linked_ptr<int> value(new int(5));\n  const Action<void(linked_ptr<int>)> a1 = SaveArgPointee<0>(&result);\n  a1.Perform(make_tuple(value));\n  EXPECT_EQ(5, result);\n}\n\nTEST(SetArgRefereeActionTest, WorksForSameType) {\n  int value = 0;\n  const Action<void(int&)> a1 = SetArgReferee<0>(1);\n  a1.Perform(tuple<int&>(value));\n  EXPECT_EQ(1, value);\n}\n\nTEST(SetArgRefereeActionTest, WorksForCompatibleType) {\n  int value = 0;\n  const Action<void(int, int&)> a1 = SetArgReferee<1>('a');\n  a1.Perform(tuple<int, int&>(0, value));\n  EXPECT_EQ('a', value);\n}\n\nTEST(SetArgRefereeActionTest, WorksWithExtraArguments) {\n  int value = 0;\n  const Action<void(bool, int, int&, const char*)> a1 = SetArgReferee<2>('a');\n  a1.Perform(tuple<bool, int, int&, const char*>(true, 0, value, \"hi\"));\n  EXPECT_EQ('a', value);\n}\n\n// A class that can be used to verify that its destructor is called: it will set\n// the bool provided to the constructor to true when destroyed.\nclass DeletionTester {\n public:\n  explicit DeletionTester(bool* is_deleted)\n    : is_deleted_(is_deleted) {\n    // Make sure the bit is set to false.\n    *is_deleted_ = false;\n  }\n\n  ~DeletionTester() {\n    *is_deleted_ = true;\n  }\n\n private:\n  bool* is_deleted_;\n};\n\nTEST(DeleteArgActionTest, OneArg) {\n  bool is_deleted = false;\n  DeletionTester* t = new DeletionTester(&is_deleted);\n  const Action<void(DeletionTester*)> a1 = DeleteArg<0>();      // NOLINT\n  EXPECT_FALSE(is_deleted);\n  a1.Perform(make_tuple(t));\n  EXPECT_TRUE(is_deleted);\n}\n\nTEST(DeleteArgActionTest, TenArgs) {\n  bool is_deleted = false;\n  DeletionTester* t = new DeletionTester(&is_deleted);\n  const Action<void(bool, int, int, const char*, bool,\n                    int, int, int, int, DeletionTester*)> a1 = DeleteArg<9>();\n  EXPECT_FALSE(is_deleted);\n  a1.Perform(make_tuple(true, 5, 6, CharPtr(\"hi\"), false, 7, 8, 9, 10, t));\n  EXPECT_TRUE(is_deleted);\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\nTEST(ThrowActionTest, ThrowsGivenExceptionInVoidFunction) {\n  const Action<void(int n)> a = Throw('a');\n  EXPECT_THROW(a.Perform(make_tuple(0)), char);\n}\n\nclass MyException {};\n\nTEST(ThrowActionTest, ThrowsGivenExceptionInNonVoidFunction) {\n  const Action<double(char ch)> a = Throw(MyException());\n  EXPECT_THROW(a.Perform(make_tuple('0')), MyException);\n}\n\nTEST(ThrowActionTest, ThrowsGivenExceptionInNullaryFunction) {\n  const Action<double()> a = Throw(MyException());\n  EXPECT_THROW(a.Perform(make_tuple()), MyException);\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// Tests that SetArrayArgument<N>(first, last) sets the elements of the array\n// pointed to by the N-th (0-based) argument to values in range [first, last).\nTEST(SetArrayArgumentTest, SetsTheNthArray) {\n  typedef void MyFunction(bool, int*, char*);\n  int numbers[] = { 1, 2, 3 };\n  Action<MyFunction> a = SetArrayArgument<1>(numbers, numbers + 3);\n\n  int n[4] = {};\n  int* pn = n;\n  char ch[4] = {};\n  char* pch = ch;\n  a.Perform(make_tuple(true, pn, pch));\n  EXPECT_EQ(1, n[0]);\n  EXPECT_EQ(2, n[1]);\n  EXPECT_EQ(3, n[2]);\n  EXPECT_EQ(0, n[3]);\n  EXPECT_EQ('\\0', ch[0]);\n  EXPECT_EQ('\\0', ch[1]);\n  EXPECT_EQ('\\0', ch[2]);\n  EXPECT_EQ('\\0', ch[3]);\n\n  // Tests first and last are iterators.\n  std::string letters = \"abc\";\n  a = SetArrayArgument<2>(letters.begin(), letters.end());\n  std::fill_n(n, 4, 0);\n  std::fill_n(ch, 4, '\\0');\n  a.Perform(make_tuple(true, pn, pch));\n  EXPECT_EQ(0, n[0]);\n  EXPECT_EQ(0, n[1]);\n  EXPECT_EQ(0, n[2]);\n  EXPECT_EQ(0, n[3]);\n  EXPECT_EQ('a', ch[0]);\n  EXPECT_EQ('b', ch[1]);\n  EXPECT_EQ('c', ch[2]);\n  EXPECT_EQ('\\0', ch[3]);\n}\n\n// Tests SetArrayArgument<N>(first, last) where first == last.\nTEST(SetArrayArgumentTest, SetsTheNthArrayWithEmptyRange) {\n  typedef void MyFunction(bool, int*);\n  int numbers[] = { 1, 2, 3 };\n  Action<MyFunction> a = SetArrayArgument<1>(numbers, numbers);\n\n  int n[4] = {};\n  int* pn = n;\n  a.Perform(make_tuple(true, pn));\n  EXPECT_EQ(0, n[0]);\n  EXPECT_EQ(0, n[1]);\n  EXPECT_EQ(0, n[2]);\n  EXPECT_EQ(0, n[3]);\n}\n\n// Tests SetArrayArgument<N>(first, last) where *first is convertible\n// (but not equal) to the argument type.\nTEST(SetArrayArgumentTest, SetsTheNthArrayWithConvertibleType) {\n  typedef void MyFunction(bool, int*);\n  char chars[] = { 97, 98, 99 };\n  Action<MyFunction> a = SetArrayArgument<1>(chars, chars + 3);\n\n  int codes[4] = { 111, 222, 333, 444 };\n  int* pcodes = codes;\n  a.Perform(make_tuple(true, pcodes));\n  EXPECT_EQ(97, codes[0]);\n  EXPECT_EQ(98, codes[1]);\n  EXPECT_EQ(99, codes[2]);\n  EXPECT_EQ(444, codes[3]);\n}\n\n// Test SetArrayArgument<N>(first, last) with iterator as argument.\nTEST(SetArrayArgumentTest, SetsTheNthArrayWithIteratorArgument) {\n  typedef void MyFunction(bool, std::back_insert_iterator<std::string>);\n  std::string letters = \"abc\";\n  Action<MyFunction> a = SetArrayArgument<1>(letters.begin(), letters.end());\n\n  std::string s;\n  a.Perform(make_tuple(true, back_inserter(s)));\n  EXPECT_EQ(letters, s);\n}\n\nTEST(ReturnPointeeTest, Works) {\n  int n = 42;\n  const Action<int()> a = ReturnPointee(&n);\n  EXPECT_EQ(42, a.Perform(make_tuple()));\n\n  n = 43;\n  EXPECT_EQ(43, a.Perform(make_tuple()));\n}\n\n}  // namespace gmock_generated_actions_test\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock-nice-strict_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include \"gmock/gmock-generated-nice-strict.h\"\n\n#include <string>\n#include <utility>\n#include \"gmock/gmock.h\"\n#include \"gtest/gtest-spi.h\"\n#include \"gtest/gtest.h\"\n\n// This must not be defined inside the ::testing namespace, or it will\n// clash with ::testing::Mock.\nclass Mock {\n public:\n  Mock() {}\n\n  MOCK_METHOD0(DoThis, void());\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mock);\n};\n\nnamespace testing {\nnamespace gmock_nice_strict_test {\n\nusing testing::GMOCK_FLAG(verbose);\nusing testing::HasSubstr;\nusing testing::NaggyMock;\nusing testing::NiceMock;\nusing testing::StrictMock;\n\n#if GTEST_HAS_STREAM_REDIRECTION\nusing testing::internal::CaptureStdout;\nusing testing::internal::GetCapturedStdout;\n#endif\n\n// Class without default constructor.\nclass NotDefaultConstructible {\n public:\n  explicit NotDefaultConstructible(int) {}\n};\n\n// Defines some mock classes needed by the tests.\n\nclass Foo {\n public:\n  virtual ~Foo() {}\n\n  virtual void DoThis() = 0;\n  virtual int DoThat(bool flag) = 0;\n};\n\nclass MockFoo : public Foo {\n public:\n  MockFoo() {}\n  void Delete() { delete this; }\n\n  MOCK_METHOD0(DoThis, void());\n  MOCK_METHOD1(DoThat, int(bool flag));\n  MOCK_METHOD0(ReturnNonDefaultConstructible, NotDefaultConstructible());\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo);\n};\n\nclass MockBar {\n public:\n  explicit MockBar(const std::string& s) : str_(s) {}\n\n  MockBar(char a1, char a2, std::string a3, std::string a4, int a5, int a6,\n          const std::string& a7, const std::string& a8, bool a9, bool a10) {\n    str_ = std::string() + a1 + a2 + a3 + a4 + static_cast<char>(a5) +\n        static_cast<char>(a6) + a7 + a8 + (a9 ? 'T' : 'F') + (a10 ? 'T' : 'F');\n  }\n\n  virtual ~MockBar() {}\n\n  const std::string& str() const { return str_; }\n\n  MOCK_METHOD0(This, int());\n  MOCK_METHOD2(That, std::string(int, bool));\n\n private:\n  std::string str_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockBar);\n};\n\n#if GTEST_GTEST_LANG_CXX11\n\nclass MockBaz {\n public:\n  class MoveOnly {\n    MoveOnly() = default;\n\n    MoveOnly(const MoveOnly&) = delete;\n    operator=(const MoveOnly&) = delete;\n\n    MoveOnly(MoveOnly&&) = default;\n    operator=(MoveOnly&&) = default;\n  };\n\n  MockBaz(MoveOnly) {}\n}\n#endif  // GTEST_GTEST_LANG_CXX11 && GTEST_HAS_STD_MOVE_\n\n#if GTEST_HAS_STREAM_REDIRECTION\n\n// Tests that a raw mock generates warnings for uninteresting calls.\nTEST(RawMockTest, WarningForUninterestingCall) {\n  const std::string saved_flag = GMOCK_FLAG(verbose);\n  GMOCK_FLAG(verbose) = \"warning\";\n\n  MockFoo raw_foo;\n\n  CaptureStdout();\n  raw_foo.DoThis();\n  raw_foo.DoThat(true);\n  EXPECT_THAT(GetCapturedStdout(),\n              HasSubstr(\"Uninteresting mock function call\"));\n\n  GMOCK_FLAG(verbose) = saved_flag;\n}\n\n// Tests that a raw mock generates warnings for uninteresting calls\n// that delete the mock object.\nTEST(RawMockTest, WarningForUninterestingCallAfterDeath) {\n  const std::string saved_flag = GMOCK_FLAG(verbose);\n  GMOCK_FLAG(verbose) = \"warning\";\n\n  MockFoo* const raw_foo = new MockFoo;\n\n  ON_CALL(*raw_foo, DoThis())\n      .WillByDefault(Invoke(raw_foo, &MockFoo::Delete));\n\n  CaptureStdout();\n  raw_foo->DoThis();\n  EXPECT_THAT(GetCapturedStdout(),\n              HasSubstr(\"Uninteresting mock function call\"));\n\n  GMOCK_FLAG(verbose) = saved_flag;\n}\n\n// Tests that a raw mock generates informational logs for\n// uninteresting calls.\nTEST(RawMockTest, InfoForUninterestingCall) {\n  MockFoo raw_foo;\n\n  const std::string saved_flag = GMOCK_FLAG(verbose);\n  GMOCK_FLAG(verbose) = \"info\";\n  CaptureStdout();\n  raw_foo.DoThis();\n  EXPECT_THAT(GetCapturedStdout(),\n              HasSubstr(\"Uninteresting mock function call\"));\n\n  GMOCK_FLAG(verbose) = saved_flag;\n}\n\n// Tests that a nice mock generates no warning for uninteresting calls.\nTEST(NiceMockTest, NoWarningForUninterestingCall) {\n  NiceMock<MockFoo> nice_foo;\n\n  CaptureStdout();\n  nice_foo.DoThis();\n  nice_foo.DoThat(true);\n  EXPECT_EQ(\"\", GetCapturedStdout());\n}\n\n// Tests that a nice mock generates no warning for uninteresting calls\n// that delete the mock object.\nTEST(NiceMockTest, NoWarningForUninterestingCallAfterDeath) {\n  NiceMock<MockFoo>* const nice_foo = new NiceMock<MockFoo>;\n\n  ON_CALL(*nice_foo, DoThis())\n      .WillByDefault(Invoke(nice_foo, &MockFoo::Delete));\n\n  CaptureStdout();\n  nice_foo->DoThis();\n  EXPECT_EQ(\"\", GetCapturedStdout());\n}\n\n// Tests that a nice mock generates informational logs for\n// uninteresting calls.\nTEST(NiceMockTest, InfoForUninterestingCall) {\n  NiceMock<MockFoo> nice_foo;\n\n  const std::string saved_flag = GMOCK_FLAG(verbose);\n  GMOCK_FLAG(verbose) = \"info\";\n  CaptureStdout();\n  nice_foo.DoThis();\n  EXPECT_THAT(GetCapturedStdout(),\n              HasSubstr(\"Uninteresting mock function call\"));\n\n  GMOCK_FLAG(verbose) = saved_flag;\n}\n\n#endif  // GTEST_HAS_STREAM_REDIRECTION\n\n// Tests that a nice mock allows expected calls.\nTEST(NiceMockTest, AllowsExpectedCall) {\n  NiceMock<MockFoo> nice_foo;\n\n  EXPECT_CALL(nice_foo, DoThis());\n  nice_foo.DoThis();\n}\n\n// Tests that an unexpected call on a nice mock which returns a\n// not-default-constructible type throws an exception and the exception contains\n// the method's name.\nTEST(NiceMockTest, ThrowsExceptionForUnknownReturnTypes) {\n  NiceMock<MockFoo> nice_foo;\n#if GTEST_HAS_EXCEPTIONS\n  try {\n    nice_foo.ReturnNonDefaultConstructible();\n    FAIL();\n  } catch (const std::runtime_error& ex) {\n    EXPECT_THAT(ex.what(), HasSubstr(\"ReturnNonDefaultConstructible\"));\n  }\n#else\n  EXPECT_DEATH_IF_SUPPORTED({ nice_foo.ReturnNonDefaultConstructible(); }, \"\");\n#endif\n}\n\n// Tests that an unexpected call on a nice mock fails.\nTEST(NiceMockTest, UnexpectedCallFails) {\n  NiceMock<MockFoo> nice_foo;\n\n  EXPECT_CALL(nice_foo, DoThis()).Times(0);\n  EXPECT_NONFATAL_FAILURE(nice_foo.DoThis(), \"called more times than expected\");\n}\n\n// Tests that NiceMock works with a mock class that has a non-default\n// constructor.\nTEST(NiceMockTest, NonDefaultConstructor) {\n  NiceMock<MockBar> nice_bar(\"hi\");\n  EXPECT_EQ(\"hi\", nice_bar.str());\n\n  nice_bar.This();\n  nice_bar.That(5, true);\n}\n\n// Tests that NiceMock works with a mock class that has a 10-ary\n// non-default constructor.\nTEST(NiceMockTest, NonDefaultConstructor10) {\n  NiceMock<MockBar> nice_bar('a', 'b', \"c\", \"d\", 'e', 'f',\n                             \"g\", \"h\", true, false);\n  EXPECT_EQ(\"abcdefghTF\", nice_bar.str());\n\n  nice_bar.This();\n  nice_bar.That(5, true);\n}\n\nTEST(NiceMockTest, AllowLeak) {\n  NiceMock<MockFoo>* leaked = new NiceMock<MockFoo>;\n  Mock::AllowLeak(leaked);\n  EXPECT_CALL(*leaked, DoThis());\n  leaked->DoThis();\n}\n\n#if GTEST_GTEST_LANG_CXX11 && GTEST_HAS_STD_MOVE_\n\nTEST(NiceMockTest, MoveOnlyConstructor) {\n  NiceMock<MockBaz> nice_baz(MockBaz::MoveOnly());\n}\n\n#endif  // GTEST_LANG_CXX11 && GTEST_HAS_STD_MOVE_\n\n#if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE\n// Tests that NiceMock<Mock> compiles where Mock is a user-defined\n// class (as opposed to ::testing::Mock).  We had to work around an\n// MSVC 8.0 bug that caused the symbol Mock used in the definition of\n// NiceMock to be looked up in the wrong context, and this test\n// ensures that our fix works.\n//\n// We have to skip this test on Symbian and Windows Mobile, as it\n// causes the program to crash there, for reasons unclear to us yet.\nTEST(NiceMockTest, AcceptsClassNamedMock) {\n  NiceMock< ::Mock> nice;\n  EXPECT_CALL(nice, DoThis());\n  nice.DoThis();\n}\n#endif  // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE\n\n#if GTEST_HAS_STREAM_REDIRECTION\n\n// Tests that a naggy mock generates warnings for uninteresting calls.\nTEST(NaggyMockTest, WarningForUninterestingCall) {\n  const std::string saved_flag = GMOCK_FLAG(verbose);\n  GMOCK_FLAG(verbose) = \"warning\";\n\n  NaggyMock<MockFoo> naggy_foo;\n\n  CaptureStdout();\n  naggy_foo.DoThis();\n  naggy_foo.DoThat(true);\n  EXPECT_THAT(GetCapturedStdout(),\n              HasSubstr(\"Uninteresting mock function call\"));\n\n  GMOCK_FLAG(verbose) = saved_flag;\n}\n\n// Tests that a naggy mock generates a warning for an uninteresting call\n// that deletes the mock object.\nTEST(NaggyMockTest, WarningForUninterestingCallAfterDeath) {\n  const std::string saved_flag = GMOCK_FLAG(verbose);\n  GMOCK_FLAG(verbose) = \"warning\";\n\n  NaggyMock<MockFoo>* const naggy_foo = new NaggyMock<MockFoo>;\n\n  ON_CALL(*naggy_foo, DoThis())\n      .WillByDefault(Invoke(naggy_foo, &MockFoo::Delete));\n\n  CaptureStdout();\n  naggy_foo->DoThis();\n  EXPECT_THAT(GetCapturedStdout(),\n              HasSubstr(\"Uninteresting mock function call\"));\n\n  GMOCK_FLAG(verbose) = saved_flag;\n}\n\n#endif  // GTEST_HAS_STREAM_REDIRECTION\n\n// Tests that a naggy mock allows expected calls.\nTEST(NaggyMockTest, AllowsExpectedCall) {\n  NaggyMock<MockFoo> naggy_foo;\n\n  EXPECT_CALL(naggy_foo, DoThis());\n  naggy_foo.DoThis();\n}\n\n// Tests that an unexpected call on a naggy mock fails.\nTEST(NaggyMockTest, UnexpectedCallFails) {\n  NaggyMock<MockFoo> naggy_foo;\n\n  EXPECT_CALL(naggy_foo, DoThis()).Times(0);\n  EXPECT_NONFATAL_FAILURE(naggy_foo.DoThis(),\n                          \"called more times than expected\");\n}\n\n// Tests that NaggyMock works with a mock class that has a non-default\n// constructor.\nTEST(NaggyMockTest, NonDefaultConstructor) {\n  NaggyMock<MockBar> naggy_bar(\"hi\");\n  EXPECT_EQ(\"hi\", naggy_bar.str());\n\n  naggy_bar.This();\n  naggy_bar.That(5, true);\n}\n\n// Tests that NaggyMock works with a mock class that has a 10-ary\n// non-default constructor.\nTEST(NaggyMockTest, NonDefaultConstructor10) {\n  NaggyMock<MockBar> naggy_bar('0', '1', \"2\", \"3\", '4', '5',\n                               \"6\", \"7\", true, false);\n  EXPECT_EQ(\"01234567TF\", naggy_bar.str());\n\n  naggy_bar.This();\n  naggy_bar.That(5, true);\n}\n\nTEST(NaggyMockTest, AllowLeak) {\n  NaggyMock<MockFoo>* leaked = new NaggyMock<MockFoo>;\n  Mock::AllowLeak(leaked);\n  EXPECT_CALL(*leaked, DoThis());\n  leaked->DoThis();\n}\n\n#if GTEST_GTEST_LANG_CXX11 && GTEST_HAS_STD_MOVE_\n\nTEST(NaggyMockTest, MoveOnlyConstructor) {\n  NaggyMock<MockBaz> naggy_baz(MockBaz::MoveOnly());\n}\n\n#endif  // GTEST_LANG_CXX11 && GTEST_HAS_STD_MOVE_\n\n#if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE\n// Tests that NaggyMock<Mock> compiles where Mock is a user-defined\n// class (as opposed to ::testing::Mock).  We had to work around an\n// MSVC 8.0 bug that caused the symbol Mock used in the definition of\n// NaggyMock to be looked up in the wrong context, and this test\n// ensures that our fix works.\n//\n// We have to skip this test on Symbian and Windows Mobile, as it\n// causes the program to crash there, for reasons unclear to us yet.\nTEST(NaggyMockTest, AcceptsClassNamedMock) {\n  NaggyMock< ::Mock> naggy;\n  EXPECT_CALL(naggy, DoThis());\n  naggy.DoThis();\n}\n#endif  // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE\n\n// Tests that a strict mock allows expected calls.\nTEST(StrictMockTest, AllowsExpectedCall) {\n  StrictMock<MockFoo> strict_foo;\n\n  EXPECT_CALL(strict_foo, DoThis());\n  strict_foo.DoThis();\n}\n\n// Tests that an unexpected call on a strict mock fails.\nTEST(StrictMockTest, UnexpectedCallFails) {\n  StrictMock<MockFoo> strict_foo;\n\n  EXPECT_CALL(strict_foo, DoThis()).Times(0);\n  EXPECT_NONFATAL_FAILURE(strict_foo.DoThis(),\n                          \"called more times than expected\");\n}\n\n// Tests that an uninteresting call on a strict mock fails.\nTEST(StrictMockTest, UninterestingCallFails) {\n  StrictMock<MockFoo> strict_foo;\n\n  EXPECT_NONFATAL_FAILURE(strict_foo.DoThis(),\n                          \"Uninteresting mock function call\");\n}\n\n// Tests that an uninteresting call on a strict mock fails, even if\n// the call deletes the mock object.\nTEST(StrictMockTest, UninterestingCallFailsAfterDeath) {\n  StrictMock<MockFoo>* const strict_foo = new StrictMock<MockFoo>;\n\n  ON_CALL(*strict_foo, DoThis())\n      .WillByDefault(Invoke(strict_foo, &MockFoo::Delete));\n\n  EXPECT_NONFATAL_FAILURE(strict_foo->DoThis(),\n                          \"Uninteresting mock function call\");\n}\n\n// Tests that StrictMock works with a mock class that has a\n// non-default constructor.\nTEST(StrictMockTest, NonDefaultConstructor) {\n  StrictMock<MockBar> strict_bar(\"hi\");\n  EXPECT_EQ(\"hi\", strict_bar.str());\n\n  EXPECT_NONFATAL_FAILURE(strict_bar.That(5, true),\n                          \"Uninteresting mock function call\");\n}\n\n// Tests that StrictMock works with a mock class that has a 10-ary\n// non-default constructor.\nTEST(StrictMockTest, NonDefaultConstructor10) {\n  StrictMock<MockBar> strict_bar('a', 'b', \"c\", \"d\", 'e', 'f',\n                                 \"g\", \"h\", true, false);\n  EXPECT_EQ(\"abcdefghTF\", strict_bar.str());\n\n  EXPECT_NONFATAL_FAILURE(strict_bar.That(5, true),\n                          \"Uninteresting mock function call\");\n}\n\nTEST(StrictMockTest, AllowLeak) {\n  StrictMock<MockFoo>* leaked = new StrictMock<MockFoo>;\n  Mock::AllowLeak(leaked);\n  EXPECT_CALL(*leaked, DoThis());\n  leaked->DoThis();\n}\n\n#if GTEST_GTEST_LANG_CXX11 && GTEST_HAS_STD_MOVE_\n\nTEST(StrictMockTest, MoveOnlyConstructor) {\n  StrictMock<MockBaz> strict_baz(MockBaz::MoveOnly());\n}\n\n#endif  // GTEST_LANG_CXX11 && GTEST_HAS_STD_MOVE_\n\n#if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE\n// Tests that StrictMock<Mock> compiles where Mock is a user-defined\n// class (as opposed to ::testing::Mock).  We had to work around an\n// MSVC 8.0 bug that caused the symbol Mock used in the definition of\n// StrictMock to be looked up in the wrong context, and this test\n// ensures that our fix works.\n//\n// We have to skip this test on Symbian and Windows Mobile, as it\n// causes the program to crash there, for reasons unclear to us yet.\nTEST(StrictMockTest, AcceptsClassNamedMock) {\n  StrictMock< ::Mock> strict;\n  EXPECT_CALL(strict, DoThis());\n  strict.DoThis();\n}\n#endif  // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE\n\n}  // namespace gmock_nice_strict_test\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock-port_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file tests the internal cross-platform support utilities.\n\n#include \"gmock/internal/gmock-port.h\"\n#include \"gtest/gtest.h\"\n\n// NOTE: if this file is left without tests for some reason, put a dummy\n// test here to make references to symbols in the gtest library and avoid\n// 'undefined symbol' linker errors in gmock_main:\n\nTEST(DummyTest, Dummy) {}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock-spec-builders_test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file tests the spec builder syntax.\n\n#include \"gmock/gmock-spec-builders.h\"\n\n#include <ostream>  // NOLINT\n#include <sstream>\n#include <string>\n\n#include \"gmock/gmock.h\"\n#include \"gmock/internal/gmock-port.h\"\n#include \"gtest/gtest.h\"\n#include \"gtest/gtest-spi.h\"\n#include \"gtest/internal/gtest-port.h\"\n\nnamespace testing {\nnamespace internal {\n\n// Helper class for testing the Expectation class template.\nclass ExpectationTester {\n public:\n  // Sets the call count of the given expectation to the given number.\n  void SetCallCount(int n, ExpectationBase* exp) {\n    exp->call_count_ = n;\n  }\n};\n\n}  // namespace internal\n}  // namespace testing\n\nnamespace {\n\nusing testing::_;\nusing testing::AnyNumber;\nusing testing::AtLeast;\nusing testing::AtMost;\nusing testing::Between;\nusing testing::Cardinality;\nusing testing::CardinalityInterface;\nusing testing::ContainsRegex;\nusing testing::Const;\nusing testing::DoAll;\nusing testing::DoDefault;\nusing testing::Eq;\nusing testing::Expectation;\nusing testing::ExpectationSet;\nusing testing::GMOCK_FLAG(verbose);\nusing testing::Gt;\nusing testing::InSequence;\nusing testing::Invoke;\nusing testing::InvokeWithoutArgs;\nusing testing::IsNotSubstring;\nusing testing::IsSubstring;\nusing testing::Lt;\nusing testing::Message;\nusing testing::Mock;\nusing testing::NaggyMock;\nusing testing::Ne;\nusing testing::Return;\nusing testing::SaveArg;\nusing testing::Sequence;\nusing testing::SetArgPointee;\nusing testing::internal::ExpectationTester;\nusing testing::internal::FormatFileLocation;\nusing testing::internal::kAllow;\nusing testing::internal::kErrorVerbosity;\nusing testing::internal::kFail;\nusing testing::internal::kInfoVerbosity;\nusing testing::internal::kWarn;\nusing testing::internal::kWarningVerbosity;\nusing testing::internal::linked_ptr;\n\n#if GTEST_HAS_STREAM_REDIRECTION\nusing testing::HasSubstr;\nusing testing::internal::CaptureStdout;\nusing testing::internal::GetCapturedStdout;\n#endif\n\nclass Incomplete;\n\nclass MockIncomplete {\n public:\n  // This line verifies that a mock method can take a by-reference\n  // argument of an incomplete type.\n  MOCK_METHOD1(ByRefFunc, void(const Incomplete& x));\n};\n\n// Tells Google Mock how to print a value of type Incomplete.\nvoid PrintTo(const Incomplete& x, ::std::ostream* os);\n\nTEST(MockMethodTest, CanInstantiateWithIncompleteArgType) {\n  // Even though this mock class contains a mock method that takes\n  // by-reference an argument whose type is incomplete, we can still\n  // use the mock, as long as Google Mock knows how to print the\n  // argument.\n  MockIncomplete incomplete;\n  EXPECT_CALL(incomplete, ByRefFunc(_))\n      .Times(AnyNumber());\n}\n\n// The definition of the printer for the argument type doesn't have to\n// be visible where the mock is used.\nvoid PrintTo(const Incomplete& /* x */, ::std::ostream* os) {\n  *os << \"incomplete\";\n}\n\nclass Result {};\n\n// A type that's not default constructible.\nclass NonDefaultConstructible {\n public:\n  explicit NonDefaultConstructible(int /* dummy */) {}\n};\n\nclass MockA {\n public:\n  MockA() {}\n\n  MOCK_METHOD1(DoA, void(int n));\n  MOCK_METHOD1(ReturnResult, Result(int n));\n  MOCK_METHOD0(ReturnNonDefaultConstructible, NonDefaultConstructible());\n  MOCK_METHOD2(Binary, bool(int x, int y));\n  MOCK_METHOD2(ReturnInt, int(int x, int y));\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockA);\n};\n\nclass MockB {\n public:\n  MockB() {}\n\n  MOCK_CONST_METHOD0(DoB, int());  // NOLINT\n  MOCK_METHOD1(DoB, int(int n));  // NOLINT\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockB);\n};\n\nclass ReferenceHoldingMock {\n public:\n  ReferenceHoldingMock() {}\n\n  MOCK_METHOD1(AcceptReference, void(linked_ptr<MockA>*));\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ReferenceHoldingMock);\n};\n\n// Tests that EXPECT_CALL and ON_CALL compile in a presence of macro\n// redefining a mock method name. This could happen, for example, when\n// the tested code #includes Win32 API headers which define many APIs\n// as macros, e.g. #define TextOut TextOutW.\n\n#define Method MethodW\n\nclass CC {\n public:\n  virtual ~CC() {}\n  virtual int Method() = 0;\n};\nclass MockCC : public CC {\n public:\n  MockCC() {}\n\n  MOCK_METHOD0(Method, int());\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockCC);\n};\n\n// Tests that a method with expanded name compiles.\nTEST(OnCallSyntaxTest, CompilesWithMethodNameExpandedFromMacro) {\n  MockCC cc;\n  ON_CALL(cc, Method());\n}\n\n// Tests that the method with expanded name not only compiles but runs\n// and returns a correct value, too.\nTEST(OnCallSyntaxTest, WorksWithMethodNameExpandedFromMacro) {\n  MockCC cc;\n  ON_CALL(cc, Method()).WillByDefault(Return(42));\n  EXPECT_EQ(42, cc.Method());\n}\n\n// Tests that a method with expanded name compiles.\nTEST(ExpectCallSyntaxTest, CompilesWithMethodNameExpandedFromMacro) {\n  MockCC cc;\n  EXPECT_CALL(cc, Method());\n  cc.Method();\n}\n\n// Tests that it works, too.\nTEST(ExpectCallSyntaxTest, WorksWithMethodNameExpandedFromMacro) {\n  MockCC cc;\n  EXPECT_CALL(cc, Method()).WillOnce(Return(42));\n  EXPECT_EQ(42, cc.Method());\n}\n\n#undef Method  // Done with macro redefinition tests.\n\n// Tests that ON_CALL evaluates its arguments exactly once as promised\n// by Google Mock.\nTEST(OnCallSyntaxTest, EvaluatesFirstArgumentOnce) {\n  MockA a;\n  MockA* pa = &a;\n\n  ON_CALL(*pa++, DoA(_));\n  EXPECT_EQ(&a + 1, pa);\n}\n\nTEST(OnCallSyntaxTest, EvaluatesSecondArgumentOnce) {\n  MockA a;\n  int n = 0;\n\n  ON_CALL(a, DoA(n++));\n  EXPECT_EQ(1, n);\n}\n\n// Tests that the syntax of ON_CALL() is enforced at run time.\n\nTEST(OnCallSyntaxTest, WithIsOptional) {\n  MockA a;\n\n  ON_CALL(a, DoA(5))\n      .WillByDefault(Return());\n  ON_CALL(a, DoA(_))\n      .With(_)\n      .WillByDefault(Return());\n}\n\nTEST(OnCallSyntaxTest, WithCanAppearAtMostOnce) {\n  MockA a;\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    ON_CALL(a, ReturnResult(_))\n        .With(_)\n        .With(_)\n        .WillByDefault(Return(Result()));\n  }, \".With() cannot appear more than once in an ON_CALL()\");\n}\n\nTEST(OnCallSyntaxTest, WillByDefaultIsMandatory) {\n  MockA a;\n\n  EXPECT_DEATH_IF_SUPPORTED({\n    ON_CALL(a, DoA(5));\n    a.DoA(5);\n  }, \"\");\n}\n\nTEST(OnCallSyntaxTest, WillByDefaultCanAppearAtMostOnce) {\n  MockA a;\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    ON_CALL(a, DoA(5))\n        .WillByDefault(Return())\n        .WillByDefault(Return());\n  }, \".WillByDefault() must appear exactly once in an ON_CALL()\");\n}\n\n// Tests that EXPECT_CALL evaluates its arguments exactly once as\n// promised by Google Mock.\nTEST(ExpectCallSyntaxTest, EvaluatesFirstArgumentOnce) {\n  MockA a;\n  MockA* pa = &a;\n\n  EXPECT_CALL(*pa++, DoA(_));\n  a.DoA(0);\n  EXPECT_EQ(&a + 1, pa);\n}\n\nTEST(ExpectCallSyntaxTest, EvaluatesSecondArgumentOnce) {\n  MockA a;\n  int n = 0;\n\n  EXPECT_CALL(a, DoA(n++));\n  a.DoA(0);\n  EXPECT_EQ(1, n);\n}\n\n// Tests that the syntax of EXPECT_CALL() is enforced at run time.\n\nTEST(ExpectCallSyntaxTest, WithIsOptional) {\n  MockA a;\n\n  EXPECT_CALL(a, DoA(5))\n      .Times(0);\n  EXPECT_CALL(a, DoA(6))\n      .With(_)\n      .Times(0);\n}\n\nTEST(ExpectCallSyntaxTest, WithCanAppearAtMostOnce) {\n  MockA a;\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_CALL(a, DoA(6))\n        .With(_)\n        .With(_);\n  }, \".With() cannot appear more than once in an EXPECT_CALL()\");\n\n  a.DoA(6);\n}\n\nTEST(ExpectCallSyntaxTest, WithMustBeFirstClause) {\n  MockA a;\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_CALL(a, DoA(1))\n        .Times(1)\n        .With(_);\n  }, \".With() must be the first clause in an EXPECT_CALL()\");\n\n  a.DoA(1);\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_CALL(a, DoA(2))\n        .WillOnce(Return())\n        .With(_);\n  }, \".With() must be the first clause in an EXPECT_CALL()\");\n\n  a.DoA(2);\n}\n\nTEST(ExpectCallSyntaxTest, TimesCanBeInferred) {\n  MockA a;\n\n  EXPECT_CALL(a, DoA(1))\n      .WillOnce(Return());\n\n  EXPECT_CALL(a, DoA(2))\n      .WillOnce(Return())\n      .WillRepeatedly(Return());\n\n  a.DoA(1);\n  a.DoA(2);\n  a.DoA(2);\n}\n\nTEST(ExpectCallSyntaxTest, TimesCanAppearAtMostOnce) {\n  MockA a;\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_CALL(a, DoA(1))\n        .Times(1)\n        .Times(2);\n  }, \".Times() cannot appear more than once in an EXPECT_CALL()\");\n\n  a.DoA(1);\n  a.DoA(1);\n}\n\nTEST(ExpectCallSyntaxTest, TimesMustBeBeforeInSequence) {\n  MockA a;\n  Sequence s;\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_CALL(a, DoA(1))\n        .InSequence(s)\n        .Times(1);\n  }, \".Times() cannot appear after \");\n\n  a.DoA(1);\n}\n\nTEST(ExpectCallSyntaxTest, InSequenceIsOptional) {\n  MockA a;\n  Sequence s;\n\n  EXPECT_CALL(a, DoA(1));\n  EXPECT_CALL(a, DoA(2))\n      .InSequence(s);\n\n  a.DoA(1);\n  a.DoA(2);\n}\n\nTEST(ExpectCallSyntaxTest, InSequenceCanAppearMultipleTimes) {\n  MockA a;\n  Sequence s1, s2;\n\n  EXPECT_CALL(a, DoA(1))\n      .InSequence(s1, s2)\n      .InSequence(s1);\n\n  a.DoA(1);\n}\n\nTEST(ExpectCallSyntaxTest, InSequenceMustBeBeforeAfter) {\n  MockA a;\n  Sequence s;\n\n  Expectation e = EXPECT_CALL(a, DoA(1))\n      .Times(AnyNumber());\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_CALL(a, DoA(2))\n        .After(e)\n        .InSequence(s);\n  }, \".InSequence() cannot appear after \");\n\n  a.DoA(2);\n}\n\nTEST(ExpectCallSyntaxTest, InSequenceMustBeBeforeWillOnce) {\n  MockA a;\n  Sequence s;\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_CALL(a, DoA(1))\n        .WillOnce(Return())\n        .InSequence(s);\n  }, \".InSequence() cannot appear after \");\n\n  a.DoA(1);\n}\n\nTEST(ExpectCallSyntaxTest, AfterMustBeBeforeWillOnce) {\n  MockA a;\n\n  Expectation e = EXPECT_CALL(a, DoA(1));\n  EXPECT_NONFATAL_FAILURE({\n    EXPECT_CALL(a, DoA(2))\n        .WillOnce(Return())\n        .After(e);\n  }, \".After() cannot appear after \");\n\n  a.DoA(1);\n  a.DoA(2);\n}\n\nTEST(ExpectCallSyntaxTest, WillIsOptional) {\n  MockA a;\n\n  EXPECT_CALL(a, DoA(1));\n  EXPECT_CALL(a, DoA(2))\n      .WillOnce(Return());\n\n  a.DoA(1);\n  a.DoA(2);\n}\n\nTEST(ExpectCallSyntaxTest, WillCanAppearMultipleTimes) {\n  MockA a;\n\n  EXPECT_CALL(a, DoA(1))\n      .Times(AnyNumber())\n      .WillOnce(Return())\n      .WillOnce(Return())\n      .WillOnce(Return());\n}\n\nTEST(ExpectCallSyntaxTest, WillMustBeBeforeWillRepeatedly) {\n  MockA a;\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_CALL(a, DoA(1))\n        .WillRepeatedly(Return())\n        .WillOnce(Return());\n  }, \".WillOnce() cannot appear after \");\n\n  a.DoA(1);\n}\n\nTEST(ExpectCallSyntaxTest, WillRepeatedlyIsOptional) {\n  MockA a;\n\n  EXPECT_CALL(a, DoA(1))\n      .WillOnce(Return());\n  EXPECT_CALL(a, DoA(2))\n      .WillOnce(Return())\n      .WillRepeatedly(Return());\n\n  a.DoA(1);\n  a.DoA(2);\n  a.DoA(2);\n}\n\nTEST(ExpectCallSyntaxTest, WillRepeatedlyCannotAppearMultipleTimes) {\n  MockA a;\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_CALL(a, DoA(1))\n        .WillRepeatedly(Return())\n        .WillRepeatedly(Return());\n  }, \".WillRepeatedly() cannot appear more than once in an \"\n     \"EXPECT_CALL()\");\n}\n\nTEST(ExpectCallSyntaxTest, WillRepeatedlyMustBeBeforeRetiresOnSaturation) {\n  MockA a;\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_CALL(a, DoA(1))\n        .RetiresOnSaturation()\n        .WillRepeatedly(Return());\n  }, \".WillRepeatedly() cannot appear after \");\n}\n\nTEST(ExpectCallSyntaxTest, RetiresOnSaturationIsOptional) {\n  MockA a;\n\n  EXPECT_CALL(a, DoA(1));\n  EXPECT_CALL(a, DoA(1))\n      .RetiresOnSaturation();\n\n  a.DoA(1);\n  a.DoA(1);\n}\n\nTEST(ExpectCallSyntaxTest, RetiresOnSaturationCannotAppearMultipleTimes) {\n  MockA a;\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_CALL(a, DoA(1))\n        .RetiresOnSaturation()\n        .RetiresOnSaturation();\n  }, \".RetiresOnSaturation() cannot appear more than once\");\n\n  a.DoA(1);\n}\n\nTEST(ExpectCallSyntaxTest, DefaultCardinalityIsOnce) {\n  {\n    MockA a;\n    EXPECT_CALL(a, DoA(1));\n    a.DoA(1);\n  }\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    MockA a;\n    EXPECT_CALL(a, DoA(1));\n  }, \"to be called once\");\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    MockA a;\n    EXPECT_CALL(a, DoA(1));\n    a.DoA(1);\n    a.DoA(1);\n  }, \"to be called once\");\n}\n\n#if GTEST_HAS_STREAM_REDIRECTION\n\n// Tests that Google Mock doesn't print a warning when the number of\n// WillOnce() is adequate.\nTEST(ExpectCallSyntaxTest, DoesNotWarnOnAdequateActionCount) {\n  CaptureStdout();\n  {\n    MockB b;\n\n    // It's always fine to omit WillOnce() entirely.\n    EXPECT_CALL(b, DoB())\n        .Times(0);\n    EXPECT_CALL(b, DoB(1))\n        .Times(AtMost(1));\n    EXPECT_CALL(b, DoB(2))\n        .Times(1)\n        .WillRepeatedly(Return(1));\n\n    // It's fine for the number of WillOnce()s to equal the upper bound.\n    EXPECT_CALL(b, DoB(3))\n        .Times(Between(1, 2))\n        .WillOnce(Return(1))\n        .WillOnce(Return(2));\n\n    // It's fine for the number of WillOnce()s to be smaller than the\n    // upper bound when there is a WillRepeatedly().\n    EXPECT_CALL(b, DoB(4))\n        .Times(AtMost(3))\n        .WillOnce(Return(1))\n        .WillRepeatedly(Return(2));\n\n    // Satisfies the above expectations.\n    b.DoB(2);\n    b.DoB(3);\n  }\n  EXPECT_STREQ(\"\", GetCapturedStdout().c_str());\n}\n\n// Tests that Google Mock warns on having too many actions in an\n// expectation compared to its cardinality.\nTEST(ExpectCallSyntaxTest, WarnsOnTooManyActions) {\n  CaptureStdout();\n  {\n    MockB b;\n\n    // Warns when the number of WillOnce()s is larger than the upper bound.\n    EXPECT_CALL(b, DoB())\n        .Times(0)\n        .WillOnce(Return(1));  // #1\n    EXPECT_CALL(b, DoB())\n        .Times(AtMost(1))\n        .WillOnce(Return(1))\n        .WillOnce(Return(2));  // #2\n    EXPECT_CALL(b, DoB(1))\n        .Times(1)\n        .WillOnce(Return(1))\n        .WillOnce(Return(2))\n        .RetiresOnSaturation();  // #3\n\n    // Warns when the number of WillOnce()s equals the upper bound and\n    // there is a WillRepeatedly().\n    EXPECT_CALL(b, DoB())\n        .Times(0)\n        .WillRepeatedly(Return(1));  // #4\n    EXPECT_CALL(b, DoB(2))\n        .Times(1)\n        .WillOnce(Return(1))\n        .WillRepeatedly(Return(2));  // #5\n\n    // Satisfies the above expectations.\n    b.DoB(1);\n    b.DoB(2);\n  }\n  const std::string output = GetCapturedStdout();\n  EXPECT_PRED_FORMAT2(\n      IsSubstring,\n      \"Too many actions specified in EXPECT_CALL(b, DoB())...\\n\"\n      \"Expected to be never called, but has 1 WillOnce().\",\n      output);  // #1\n  EXPECT_PRED_FORMAT2(\n      IsSubstring,\n      \"Too many actions specified in EXPECT_CALL(b, DoB())...\\n\"\n      \"Expected to be called at most once, \"\n      \"but has 2 WillOnce()s.\",\n      output);  // #2\n  EXPECT_PRED_FORMAT2(\n      IsSubstring,\n      \"Too many actions specified in EXPECT_CALL(b, DoB(1))...\\n\"\n      \"Expected to be called once, but has 2 WillOnce()s.\",\n      output);  // #3\n  EXPECT_PRED_FORMAT2(\n      IsSubstring,\n      \"Too many actions specified in EXPECT_CALL(b, DoB())...\\n\"\n      \"Expected to be never called, but has 0 WillOnce()s \"\n      \"and a WillRepeatedly().\",\n      output);  // #4\n  EXPECT_PRED_FORMAT2(\n      IsSubstring,\n      \"Too many actions specified in EXPECT_CALL(b, DoB(2))...\\n\"\n      \"Expected to be called once, but has 1 WillOnce() \"\n      \"and a WillRepeatedly().\",\n      output);  // #5\n}\n\n// Tests that Google Mock warns on having too few actions in an\n// expectation compared to its cardinality.\nTEST(ExpectCallSyntaxTest, WarnsOnTooFewActions) {\n  MockB b;\n\n  EXPECT_CALL(b, DoB())\n      .Times(Between(2, 3))\n      .WillOnce(Return(1));\n\n  CaptureStdout();\n  b.DoB();\n  const std::string output = GetCapturedStdout();\n  EXPECT_PRED_FORMAT2(\n      IsSubstring,\n      \"Too few actions specified in EXPECT_CALL(b, DoB())...\\n\"\n      \"Expected to be called between 2 and 3 times, \"\n      \"but has only 1 WillOnce().\",\n      output);\n  b.DoB();\n}\n\nTEST(ExpectCallSyntaxTest, WarningIsErrorWithFlag) {\n  int original_behavior = testing::GMOCK_FLAG(default_mock_behavior);\n\n  testing::GMOCK_FLAG(default_mock_behavior) = kAllow;\n  CaptureStdout();\n  {\n    MockA a;\n    a.DoA(0);\n  }\n  std::string output = GetCapturedStdout();\n  EXPECT_TRUE(output.empty()) << output;\n\n  testing::GMOCK_FLAG(default_mock_behavior) = kWarn;\n  CaptureStdout();\n  {\n    MockA a;\n    a.DoA(0);\n  }\n  std::string warning_output = GetCapturedStdout();\n  EXPECT_PRED_FORMAT2(IsSubstring, \"GMOCK WARNING\", warning_output);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"Uninteresting mock function call\",\n                      warning_output);\n\n  testing::GMOCK_FLAG(default_mock_behavior) = kFail;\n  EXPECT_NONFATAL_FAILURE({\n    MockA a;\n    a.DoA(0);\n  }, \"Uninteresting mock function call\");\n\n  // Out of bounds values are converted to kWarn\n  testing::GMOCK_FLAG(default_mock_behavior) = -1;\n  CaptureStdout();\n  {\n    MockA a;\n    a.DoA(0);\n  }\n  warning_output = GetCapturedStdout();\n  EXPECT_PRED_FORMAT2(IsSubstring, \"GMOCK WARNING\", warning_output);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"Uninteresting mock function call\",\n                      warning_output);\n  testing::GMOCK_FLAG(default_mock_behavior) = 3;\n  CaptureStdout();\n  {\n    MockA a;\n    a.DoA(0);\n  }\n  warning_output = GetCapturedStdout();\n  EXPECT_PRED_FORMAT2(IsSubstring, \"GMOCK WARNING\", warning_output);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"Uninteresting mock function call\",\n                      warning_output);\n\n  testing::GMOCK_FLAG(default_mock_behavior) = original_behavior;\n}\n\n#endif  // GTEST_HAS_STREAM_REDIRECTION\n\n// Tests the semantics of ON_CALL().\n\n// Tests that the built-in default action is taken when no ON_CALL()\n// is specified.\nTEST(OnCallTest, TakesBuiltInDefaultActionWhenNoOnCall) {\n  MockB b;\n  EXPECT_CALL(b, DoB());\n\n  EXPECT_EQ(0, b.DoB());\n}\n\n// Tests that the built-in default action is taken when no ON_CALL()\n// matches the invocation.\nTEST(OnCallTest, TakesBuiltInDefaultActionWhenNoOnCallMatches) {\n  MockB b;\n  ON_CALL(b, DoB(1))\n      .WillByDefault(Return(1));\n  EXPECT_CALL(b, DoB(_));\n\n  EXPECT_EQ(0, b.DoB(2));\n}\n\n// Tests that the last matching ON_CALL() action is taken.\nTEST(OnCallTest, PicksLastMatchingOnCall) {\n  MockB b;\n  ON_CALL(b, DoB(_))\n      .WillByDefault(Return(3));\n  ON_CALL(b, DoB(2))\n      .WillByDefault(Return(2));\n  ON_CALL(b, DoB(1))\n      .WillByDefault(Return(1));\n  EXPECT_CALL(b, DoB(_));\n\n  EXPECT_EQ(2, b.DoB(2));\n}\n\n// Tests the semantics of EXPECT_CALL().\n\n// Tests that any call is allowed when no EXPECT_CALL() is specified.\nTEST(ExpectCallTest, AllowsAnyCallWhenNoSpec) {\n  MockB b;\n  EXPECT_CALL(b, DoB());\n  // There is no expectation on DoB(int).\n\n  b.DoB();\n\n  // DoB(int) can be called any number of times.\n  b.DoB(1);\n  b.DoB(2);\n}\n\n// Tests that the last matching EXPECT_CALL() fires.\nTEST(ExpectCallTest, PicksLastMatchingExpectCall) {\n  MockB b;\n  EXPECT_CALL(b, DoB(_))\n      .WillRepeatedly(Return(2));\n  EXPECT_CALL(b, DoB(1))\n      .WillRepeatedly(Return(1));\n\n  EXPECT_EQ(1, b.DoB(1));\n}\n\n// Tests lower-bound violation.\nTEST(ExpectCallTest, CatchesTooFewCalls) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    MockB b;\n    EXPECT_CALL(b, DoB(5))\n        .Times(AtLeast(2));\n\n    b.DoB(5);\n  }, \"Actual function call count doesn't match EXPECT_CALL(b, DoB(5))...\\n\"\n     \"         Expected: to be called at least twice\\n\"\n     \"           Actual: called once - unsatisfied and active\");\n}\n\n// Tests that the cardinality can be inferred when no Times(...) is\n// specified.\nTEST(ExpectCallTest, InfersCardinalityWhenThereIsNoWillRepeatedly) {\n  {\n    MockB b;\n    EXPECT_CALL(b, DoB())\n        .WillOnce(Return(1))\n        .WillOnce(Return(2));\n\n    EXPECT_EQ(1, b.DoB());\n    EXPECT_EQ(2, b.DoB());\n  }\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    MockB b;\n    EXPECT_CALL(b, DoB())\n        .WillOnce(Return(1))\n        .WillOnce(Return(2));\n\n    EXPECT_EQ(1, b.DoB());\n  }, \"to be called twice\");\n\n  {  // NOLINT\n    MockB b;\n    EXPECT_CALL(b, DoB())\n        .WillOnce(Return(1))\n        .WillOnce(Return(2));\n\n    EXPECT_EQ(1, b.DoB());\n    EXPECT_EQ(2, b.DoB());\n    EXPECT_NONFATAL_FAILURE(b.DoB(), \"to be called twice\");\n  }\n}\n\nTEST(ExpectCallTest, InfersCardinality1WhenThereIsWillRepeatedly) {\n  {\n    MockB b;\n    EXPECT_CALL(b, DoB())\n        .WillOnce(Return(1))\n        .WillRepeatedly(Return(2));\n\n    EXPECT_EQ(1, b.DoB());\n  }\n\n  {  // NOLINT\n    MockB b;\n    EXPECT_CALL(b, DoB())\n        .WillOnce(Return(1))\n        .WillRepeatedly(Return(2));\n\n    EXPECT_EQ(1, b.DoB());\n    EXPECT_EQ(2, b.DoB());\n    EXPECT_EQ(2, b.DoB());\n  }\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    MockB b;\n    EXPECT_CALL(b, DoB())\n        .WillOnce(Return(1))\n        .WillRepeatedly(Return(2));\n  }, \"to be called at least once\");\n}\n\n// Tests that the n-th action is taken for the n-th matching\n// invocation.\nTEST(ExpectCallTest, NthMatchTakesNthAction) {\n  MockB b;\n  EXPECT_CALL(b, DoB())\n      .WillOnce(Return(1))\n      .WillOnce(Return(2))\n      .WillOnce(Return(3));\n\n  EXPECT_EQ(1, b.DoB());\n  EXPECT_EQ(2, b.DoB());\n  EXPECT_EQ(3, b.DoB());\n}\n\n// Tests that the WillRepeatedly() action is taken when the WillOnce(...)\n// list is exhausted.\nTEST(ExpectCallTest, TakesRepeatedActionWhenWillListIsExhausted) {\n  MockB b;\n  EXPECT_CALL(b, DoB())\n      .WillOnce(Return(1))\n      .WillRepeatedly(Return(2));\n\n  EXPECT_EQ(1, b.DoB());\n  EXPECT_EQ(2, b.DoB());\n  EXPECT_EQ(2, b.DoB());\n}\n\n#if GTEST_HAS_STREAM_REDIRECTION\n\n// Tests that the default action is taken when the WillOnce(...) list is\n// exhausted and there is no WillRepeatedly().\nTEST(ExpectCallTest, TakesDefaultActionWhenWillListIsExhausted) {\n  MockB b;\n  EXPECT_CALL(b, DoB(_))\n      .Times(1);\n  EXPECT_CALL(b, DoB())\n      .Times(AnyNumber())\n      .WillOnce(Return(1))\n      .WillOnce(Return(2));\n\n  CaptureStdout();\n  EXPECT_EQ(0, b.DoB(1));  // Shouldn't generate a warning as the\n                           // expectation has no action clause at all.\n  EXPECT_EQ(1, b.DoB());\n  EXPECT_EQ(2, b.DoB());\n  const std::string output1 = GetCapturedStdout();\n  EXPECT_STREQ(\"\", output1.c_str());\n\n  CaptureStdout();\n  EXPECT_EQ(0, b.DoB());\n  EXPECT_EQ(0, b.DoB());\n  const std::string output2 = GetCapturedStdout();\n  EXPECT_THAT(output2.c_str(),\n              HasSubstr(\"Actions ran out in EXPECT_CALL(b, DoB())...\\n\"\n                        \"Called 3 times, but only 2 WillOnce()s are specified\"\n                        \" - returning default value.\"));\n  EXPECT_THAT(output2.c_str(),\n              HasSubstr(\"Actions ran out in EXPECT_CALL(b, DoB())...\\n\"\n                        \"Called 4 times, but only 2 WillOnce()s are specified\"\n                        \" - returning default value.\"));\n}\n\nTEST(FunctionMockerMessageTest, ReportsExpectCallLocationForExhausedActions) {\n  MockB b;\n  std::string expect_call_location = FormatFileLocation(__FILE__, __LINE__ + 1);\n  EXPECT_CALL(b, DoB()).Times(AnyNumber()).WillOnce(Return(1));\n\n  EXPECT_EQ(1, b.DoB());\n\n  CaptureStdout();\n  EXPECT_EQ(0, b.DoB());\n  const std::string output = GetCapturedStdout();\n  // The warning message should contain the call location.\n  EXPECT_PRED_FORMAT2(IsSubstring, expect_call_location, output);\n}\n\nTEST(FunctionMockerMessageTest,\n     ReportsDefaultActionLocationOfUninterestingCallsForNaggyMock) {\n  std::string on_call_location;\n  CaptureStdout();\n  {\n    NaggyMock<MockB> b;\n    on_call_location = FormatFileLocation(__FILE__, __LINE__ + 1);\n    ON_CALL(b, DoB(_)).WillByDefault(Return(0));\n    b.DoB(0);\n  }\n  EXPECT_PRED_FORMAT2(IsSubstring, on_call_location, GetCapturedStdout());\n}\n\n#endif  // GTEST_HAS_STREAM_REDIRECTION\n\n// Tests that an uninteresting call performs the default action.\nTEST(UninterestingCallTest, DoesDefaultAction) {\n  // When there is an ON_CALL() statement, the action specified by it\n  // should be taken.\n  MockA a;\n  ON_CALL(a, Binary(_, _))\n      .WillByDefault(Return(true));\n  EXPECT_TRUE(a.Binary(1, 2));\n\n  // When there is no ON_CALL(), the default value for the return type\n  // should be returned.\n  MockB b;\n  EXPECT_EQ(0, b.DoB());\n}\n\n// Tests that an unexpected call performs the default action.\nTEST(UnexpectedCallTest, DoesDefaultAction) {\n  // When there is an ON_CALL() statement, the action specified by it\n  // should be taken.\n  MockA a;\n  ON_CALL(a, Binary(_, _))\n      .WillByDefault(Return(true));\n  EXPECT_CALL(a, Binary(0, 0));\n  a.Binary(0, 0);\n  bool result = false;\n  EXPECT_NONFATAL_FAILURE(result = a.Binary(1, 2),\n                          \"Unexpected mock function call\");\n  EXPECT_TRUE(result);\n\n  // When there is no ON_CALL(), the default value for the return type\n  // should be returned.\n  MockB b;\n  EXPECT_CALL(b, DoB(0))\n      .Times(0);\n  int n = -1;\n  EXPECT_NONFATAL_FAILURE(n = b.DoB(1),\n                          \"Unexpected mock function call\");\n  EXPECT_EQ(0, n);\n}\n\n// Tests that when an unexpected void function generates the right\n// failure message.\nTEST(UnexpectedCallTest, GeneratesFailureForVoidFunction) {\n  // First, tests the message when there is only one EXPECT_CALL().\n  MockA a1;\n  EXPECT_CALL(a1, DoA(1));\n  a1.DoA(1);\n  // Ideally we should match the failure message against a regex, but\n  // EXPECT_NONFATAL_FAILURE doesn't support that, so we test for\n  // multiple sub-strings instead.\n  EXPECT_NONFATAL_FAILURE(\n      a1.DoA(9),\n      \"Unexpected mock function call - returning directly.\\n\"\n      \"    Function call: DoA(9)\\n\"\n      \"Google Mock tried the following 1 expectation, but it didn't match:\");\n  EXPECT_NONFATAL_FAILURE(\n      a1.DoA(9),\n      \"  Expected arg #0: is equal to 1\\n\"\n      \"           Actual: 9\\n\"\n      \"         Expected: to be called once\\n\"\n      \"           Actual: called once - saturated and active\");\n\n  // Next, tests the message when there are more than one EXPECT_CALL().\n  MockA a2;\n  EXPECT_CALL(a2, DoA(1));\n  EXPECT_CALL(a2, DoA(3));\n  a2.DoA(1);\n  EXPECT_NONFATAL_FAILURE(\n      a2.DoA(2),\n      \"Unexpected mock function call - returning directly.\\n\"\n      \"    Function call: DoA(2)\\n\"\n      \"Google Mock tried the following 2 expectations, but none matched:\");\n  EXPECT_NONFATAL_FAILURE(\n      a2.DoA(2),\n      \"tried expectation #0: EXPECT_CALL(a2, DoA(1))...\\n\"\n      \"  Expected arg #0: is equal to 1\\n\"\n      \"           Actual: 2\\n\"\n      \"         Expected: to be called once\\n\"\n      \"           Actual: called once - saturated and active\");\n  EXPECT_NONFATAL_FAILURE(\n      a2.DoA(2),\n      \"tried expectation #1: EXPECT_CALL(a2, DoA(3))...\\n\"\n      \"  Expected arg #0: is equal to 3\\n\"\n      \"           Actual: 2\\n\"\n      \"         Expected: to be called once\\n\"\n      \"           Actual: never called - unsatisfied and active\");\n  a2.DoA(3);\n}\n\n// Tests that an unexpected non-void function generates the right\n// failure message.\nTEST(UnexpectedCallTest, GeneartesFailureForNonVoidFunction) {\n  MockB b1;\n  EXPECT_CALL(b1, DoB(1));\n  b1.DoB(1);\n  EXPECT_NONFATAL_FAILURE(\n      b1.DoB(2),\n      \"Unexpected mock function call - returning default value.\\n\"\n      \"    Function call: DoB(2)\\n\"\n      \"          Returns: 0\\n\"\n      \"Google Mock tried the following 1 expectation, but it didn't match:\");\n  EXPECT_NONFATAL_FAILURE(\n      b1.DoB(2),\n      \"  Expected arg #0: is equal to 1\\n\"\n      \"           Actual: 2\\n\"\n      \"         Expected: to be called once\\n\"\n      \"           Actual: called once - saturated and active\");\n}\n\n// Tests that Google Mock explains that an retired expectation doesn't\n// match the call.\nTEST(UnexpectedCallTest, RetiredExpectation) {\n  MockB b;\n  EXPECT_CALL(b, DoB(1))\n      .RetiresOnSaturation();\n\n  b.DoB(1);\n  EXPECT_NONFATAL_FAILURE(\n      b.DoB(1),\n      \"         Expected: the expectation is active\\n\"\n      \"           Actual: it is retired\");\n}\n\n// Tests that Google Mock explains that an expectation that doesn't\n// match the arguments doesn't match the call.\nTEST(UnexpectedCallTest, UnmatchedArguments) {\n  MockB b;\n  EXPECT_CALL(b, DoB(1));\n\n  EXPECT_NONFATAL_FAILURE(\n      b.DoB(2),\n      \"  Expected arg #0: is equal to 1\\n\"\n      \"           Actual: 2\\n\");\n  b.DoB(1);\n}\n\n// Tests that Google Mock explains that an expectation with\n// unsatisfied pre-requisites doesn't match the call.\nTEST(UnexpectedCallTest, UnsatisifiedPrerequisites) {\n  Sequence s1, s2;\n  MockB b;\n  EXPECT_CALL(b, DoB(1))\n      .InSequence(s1);\n  EXPECT_CALL(b, DoB(2))\n      .Times(AnyNumber())\n      .InSequence(s1);\n  EXPECT_CALL(b, DoB(3))\n      .InSequence(s2);\n  EXPECT_CALL(b, DoB(4))\n      .InSequence(s1, s2);\n\n  ::testing::TestPartResultArray failures;\n  {\n    ::testing::ScopedFakeTestPartResultReporter reporter(&failures);\n    b.DoB(4);\n    // Now 'failures' contains the Google Test failures generated by\n    // the above statement.\n  }\n\n  // There should be one non-fatal failure.\n  ASSERT_EQ(1, failures.size());\n  const ::testing::TestPartResult& r = failures.GetTestPartResult(0);\n  EXPECT_EQ(::testing::TestPartResult::kNonFatalFailure, r.type());\n\n  // Verifies that the failure message contains the two unsatisfied\n  // pre-requisites but not the satisfied one.\n#if GTEST_USES_PCRE\n  EXPECT_THAT(r.message(), ContainsRegex(\n      // PCRE has trouble using (.|\\n) to match any character, but\n      // supports the (?s) prefix for using . to match any character.\n      \"(?s)the following immediate pre-requisites are not satisfied:\\n\"\n      \".*: pre-requisite #0\\n\"\n      \".*: pre-requisite #1\"));\n#elif GTEST_USES_POSIX_RE\n  EXPECT_THAT(r.message(), ContainsRegex(\n      // POSIX RE doesn't understand the (?s) prefix, but has no trouble\n      // with (.|\\n).\n      \"the following immediate pre-requisites are not satisfied:\\n\"\n      \"(.|\\n)*: pre-requisite #0\\n\"\n      \"(.|\\n)*: pre-requisite #1\"));\n#else\n  // We can only use Google Test's own simple regex.\n  EXPECT_THAT(r.message(), ContainsRegex(\n      \"the following immediate pre-requisites are not satisfied:\"));\n  EXPECT_THAT(r.message(), ContainsRegex(\": pre-requisite #0\"));\n  EXPECT_THAT(r.message(), ContainsRegex(\": pre-requisite #1\"));\n#endif  // GTEST_USES_PCRE\n\n  b.DoB(1);\n  b.DoB(3);\n  b.DoB(4);\n}\n\nTEST(UndefinedReturnValueTest,\n     ReturnValueIsMandatoryWhenNotDefaultConstructible) {\n  MockA a;\n  // FIXME: We should really verify the output message,\n  // but we cannot yet due to that EXPECT_DEATH only captures stderr\n  // while Google Mock logs to stdout.\n#if GTEST_HAS_EXCEPTIONS\n  EXPECT_ANY_THROW(a.ReturnNonDefaultConstructible());\n#else\n  EXPECT_DEATH_IF_SUPPORTED(a.ReturnNonDefaultConstructible(), \"\");\n#endif\n}\n\n// Tests that an excessive call (one whose arguments match the\n// matchers but is called too many times) performs the default action.\nTEST(ExcessiveCallTest, DoesDefaultAction) {\n  // When there is an ON_CALL() statement, the action specified by it\n  // should be taken.\n  MockA a;\n  ON_CALL(a, Binary(_, _))\n      .WillByDefault(Return(true));\n  EXPECT_CALL(a, Binary(0, 0));\n  a.Binary(0, 0);\n  bool result = false;\n  EXPECT_NONFATAL_FAILURE(result = a.Binary(0, 0),\n                          \"Mock function called more times than expected\");\n  EXPECT_TRUE(result);\n\n  // When there is no ON_CALL(), the default value for the return type\n  // should be returned.\n  MockB b;\n  EXPECT_CALL(b, DoB(0))\n      .Times(0);\n  int n = -1;\n  EXPECT_NONFATAL_FAILURE(n = b.DoB(0),\n                          \"Mock function called more times than expected\");\n  EXPECT_EQ(0, n);\n}\n\n// Tests that when a void function is called too many times,\n// the failure message contains the argument values.\nTEST(ExcessiveCallTest, GeneratesFailureForVoidFunction) {\n  MockA a;\n  EXPECT_CALL(a, DoA(_))\n      .Times(0);\n  EXPECT_NONFATAL_FAILURE(\n      a.DoA(9),\n      \"Mock function called more times than expected - returning directly.\\n\"\n      \"    Function call: DoA(9)\\n\"\n      \"         Expected: to be never called\\n\"\n      \"           Actual: called once - over-saturated and active\");\n}\n\n// Tests that when a non-void function is called too many times, the\n// failure message contains the argument values and the return value.\nTEST(ExcessiveCallTest, GeneratesFailureForNonVoidFunction) {\n  MockB b;\n  EXPECT_CALL(b, DoB(_));\n  b.DoB(1);\n  EXPECT_NONFATAL_FAILURE(\n      b.DoB(2),\n      \"Mock function called more times than expected - \"\n      \"returning default value.\\n\"\n      \"    Function call: DoB(2)\\n\"\n      \"          Returns: 0\\n\"\n      \"         Expected: to be called once\\n\"\n      \"           Actual: called twice - over-saturated and active\");\n}\n\n// Tests using sequences.\n\nTEST(InSequenceTest, AllExpectationInScopeAreInSequence) {\n  MockA a;\n  {\n    InSequence dummy;\n\n    EXPECT_CALL(a, DoA(1));\n    EXPECT_CALL(a, DoA(2));\n  }\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    a.DoA(2);\n  }, \"Unexpected mock function call\");\n\n  a.DoA(1);\n  a.DoA(2);\n}\n\nTEST(InSequenceTest, NestedInSequence) {\n  MockA a;\n  {\n    InSequence dummy;\n\n    EXPECT_CALL(a, DoA(1));\n    {\n      InSequence dummy2;\n\n      EXPECT_CALL(a, DoA(2));\n      EXPECT_CALL(a, DoA(3));\n    }\n  }\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    a.DoA(1);\n    a.DoA(3);\n  }, \"Unexpected mock function call\");\n\n  a.DoA(2);\n  a.DoA(3);\n}\n\nTEST(InSequenceTest, ExpectationsOutOfScopeAreNotAffected) {\n  MockA a;\n  {\n    InSequence dummy;\n\n    EXPECT_CALL(a, DoA(1));\n    EXPECT_CALL(a, DoA(2));\n  }\n  EXPECT_CALL(a, DoA(3));\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    a.DoA(2);\n  }, \"Unexpected mock function call\");\n\n  a.DoA(3);\n  a.DoA(1);\n  a.DoA(2);\n}\n\n// Tests that any order is allowed when no sequence is used.\nTEST(SequenceTest, AnyOrderIsOkByDefault) {\n  {\n    MockA a;\n    MockB b;\n\n    EXPECT_CALL(a, DoA(1));\n    EXPECT_CALL(b, DoB())\n        .Times(AnyNumber());\n\n    a.DoA(1);\n    b.DoB();\n  }\n\n  {  // NOLINT\n    MockA a;\n    MockB b;\n\n    EXPECT_CALL(a, DoA(1));\n    EXPECT_CALL(b, DoB())\n        .Times(AnyNumber());\n\n    b.DoB();\n    a.DoA(1);\n  }\n}\n\n// Tests that the calls must be in strict order when a complete order\n// is specified.\nTEST(SequenceTest, CallsMustBeInStrictOrderWhenSaidSo1) {\n  MockA a;\n  ON_CALL(a, ReturnResult(_))\n      .WillByDefault(Return(Result()));\n\n  Sequence s;\n  EXPECT_CALL(a, ReturnResult(1))\n      .InSequence(s);\n  EXPECT_CALL(a, ReturnResult(2))\n      .InSequence(s);\n  EXPECT_CALL(a, ReturnResult(3))\n      .InSequence(s);\n\n  a.ReturnResult(1);\n\n  // May only be called after a.ReturnResult(2).\n  EXPECT_NONFATAL_FAILURE(a.ReturnResult(3), \"Unexpected mock function call\");\n\n  a.ReturnResult(2);\n  a.ReturnResult(3);\n}\n\n// Tests that the calls must be in strict order when a complete order\n// is specified.\nTEST(SequenceTest, CallsMustBeInStrictOrderWhenSaidSo2) {\n  MockA a;\n  ON_CALL(a, ReturnResult(_))\n      .WillByDefault(Return(Result()));\n\n  Sequence s;\n  EXPECT_CALL(a, ReturnResult(1))\n      .InSequence(s);\n  EXPECT_CALL(a, ReturnResult(2))\n      .InSequence(s);\n\n  // May only be called after a.ReturnResult(1).\n  EXPECT_NONFATAL_FAILURE(a.ReturnResult(2), \"Unexpected mock function call\");\n\n  a.ReturnResult(1);\n  a.ReturnResult(2);\n}\n\n// Tests specifying a DAG using multiple sequences.\nclass PartialOrderTest : public testing::Test {\n protected:\n  PartialOrderTest() {\n    ON_CALL(a_, ReturnResult(_))\n        .WillByDefault(Return(Result()));\n\n    // Specifies this partial ordering:\n    //\n    // a.ReturnResult(1) ==>\n    //                       a.ReturnResult(2) * n  ==>  a.ReturnResult(3)\n    // b.DoB() * 2       ==>\n    Sequence x, y;\n    EXPECT_CALL(a_, ReturnResult(1))\n        .InSequence(x);\n    EXPECT_CALL(b_, DoB())\n        .Times(2)\n        .InSequence(y);\n    EXPECT_CALL(a_, ReturnResult(2))\n        .Times(AnyNumber())\n        .InSequence(x, y);\n    EXPECT_CALL(a_, ReturnResult(3))\n        .InSequence(x);\n  }\n\n  MockA a_;\n  MockB b_;\n};\n\nTEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag1) {\n  a_.ReturnResult(1);\n  b_.DoB();\n\n  // May only be called after the second DoB().\n  EXPECT_NONFATAL_FAILURE(a_.ReturnResult(2), \"Unexpected mock function call\");\n\n  b_.DoB();\n  a_.ReturnResult(3);\n}\n\nTEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag2) {\n  // May only be called after ReturnResult(1).\n  EXPECT_NONFATAL_FAILURE(a_.ReturnResult(2), \"Unexpected mock function call\");\n\n  a_.ReturnResult(1);\n  b_.DoB();\n  b_.DoB();\n  a_.ReturnResult(3);\n}\n\nTEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag3) {\n  // May only be called last.\n  EXPECT_NONFATAL_FAILURE(a_.ReturnResult(3), \"Unexpected mock function call\");\n\n  a_.ReturnResult(1);\n  b_.DoB();\n  b_.DoB();\n  a_.ReturnResult(3);\n}\n\nTEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag4) {\n  a_.ReturnResult(1);\n  b_.DoB();\n  b_.DoB();\n  a_.ReturnResult(3);\n\n  // May only be called before ReturnResult(3).\n  EXPECT_NONFATAL_FAILURE(a_.ReturnResult(2), \"Unexpected mock function call\");\n}\n\nTEST(SequenceTest, Retirement) {\n  MockA a;\n  Sequence s;\n\n  EXPECT_CALL(a, DoA(1))\n      .InSequence(s);\n  EXPECT_CALL(a, DoA(_))\n      .InSequence(s)\n      .RetiresOnSaturation();\n  EXPECT_CALL(a, DoA(1))\n      .InSequence(s);\n\n  a.DoA(1);\n  a.DoA(2);\n  a.DoA(1);\n}\n\n// Tests Expectation.\n\nTEST(ExpectationTest, ConstrutorsWork) {\n  MockA a;\n  Expectation e1;  // Default ctor.\n\n  // Ctor from various forms of EXPECT_CALL.\n  Expectation e2 = EXPECT_CALL(a, DoA(2));\n  Expectation e3 = EXPECT_CALL(a, DoA(3)).With(_);\n  {\n    Sequence s;\n    Expectation e4 = EXPECT_CALL(a, DoA(4)).Times(1);\n    Expectation e5 = EXPECT_CALL(a, DoA(5)).InSequence(s);\n  }\n  Expectation e6 = EXPECT_CALL(a, DoA(6)).After(e2);\n  Expectation e7 = EXPECT_CALL(a, DoA(7)).WillOnce(Return());\n  Expectation e8 = EXPECT_CALL(a, DoA(8)).WillRepeatedly(Return());\n  Expectation e9 = EXPECT_CALL(a, DoA(9)).RetiresOnSaturation();\n\n  Expectation e10 = e2;  // Copy ctor.\n\n  EXPECT_THAT(e1, Ne(e2));\n  EXPECT_THAT(e2, Eq(e10));\n\n  a.DoA(2);\n  a.DoA(3);\n  a.DoA(4);\n  a.DoA(5);\n  a.DoA(6);\n  a.DoA(7);\n  a.DoA(8);\n  a.DoA(9);\n}\n\nTEST(ExpectationTest, AssignmentWorks) {\n  MockA a;\n  Expectation e1;\n  Expectation e2 = EXPECT_CALL(a, DoA(1));\n\n  EXPECT_THAT(e1, Ne(e2));\n\n  e1 = e2;\n  EXPECT_THAT(e1, Eq(e2));\n\n  a.DoA(1);\n}\n\n// Tests ExpectationSet.\n\nTEST(ExpectationSetTest, MemberTypesAreCorrect) {\n  ::testing::StaticAssertTypeEq<Expectation, ExpectationSet::value_type>();\n}\n\nTEST(ExpectationSetTest, ConstructorsWork) {\n  MockA a;\n\n  Expectation e1;\n  const Expectation e2;\n  ExpectationSet es1;  // Default ctor.\n  ExpectationSet es2 = EXPECT_CALL(a, DoA(1));  // Ctor from EXPECT_CALL.\n  ExpectationSet es3 = e1;  // Ctor from Expectation.\n  ExpectationSet es4(e1);   // Ctor from Expectation; alternative syntax.\n  ExpectationSet es5 = e2;  // Ctor from const Expectation.\n  ExpectationSet es6(e2);   // Ctor from const Expectation; alternative syntax.\n  ExpectationSet es7 = es2;  // Copy ctor.\n\n  EXPECT_EQ(0, es1.size());\n  EXPECT_EQ(1, es2.size());\n  EXPECT_EQ(1, es3.size());\n  EXPECT_EQ(1, es4.size());\n  EXPECT_EQ(1, es5.size());\n  EXPECT_EQ(1, es6.size());\n  EXPECT_EQ(1, es7.size());\n\n  EXPECT_THAT(es3, Ne(es2));\n  EXPECT_THAT(es4, Eq(es3));\n  EXPECT_THAT(es5, Eq(es4));\n  EXPECT_THAT(es6, Eq(es5));\n  EXPECT_THAT(es7, Eq(es2));\n  a.DoA(1);\n}\n\nTEST(ExpectationSetTest, AssignmentWorks) {\n  ExpectationSet es1;\n  ExpectationSet es2 = Expectation();\n\n  es1 = es2;\n  EXPECT_EQ(1, es1.size());\n  EXPECT_THAT(*(es1.begin()), Eq(Expectation()));\n  EXPECT_THAT(es1, Eq(es2));\n}\n\nTEST(ExpectationSetTest, InsertionWorks) {\n  ExpectationSet es1;\n  Expectation e1;\n  es1 += e1;\n  EXPECT_EQ(1, es1.size());\n  EXPECT_THAT(*(es1.begin()), Eq(e1));\n\n  MockA a;\n  Expectation e2 = EXPECT_CALL(a, DoA(1));\n  es1 += e2;\n  EXPECT_EQ(2, es1.size());\n\n  ExpectationSet::const_iterator it1 = es1.begin();\n  ExpectationSet::const_iterator it2 = it1;\n  ++it2;\n  EXPECT_TRUE(*it1 == e1 || *it2 == e1);  // e1 must be in the set.\n  EXPECT_TRUE(*it1 == e2 || *it2 == e2);  // e2 must be in the set too.\n  a.DoA(1);\n}\n\nTEST(ExpectationSetTest, SizeWorks) {\n  ExpectationSet es;\n  EXPECT_EQ(0, es.size());\n\n  es += Expectation();\n  EXPECT_EQ(1, es.size());\n\n  MockA a;\n  es += EXPECT_CALL(a, DoA(1));\n  EXPECT_EQ(2, es.size());\n\n  a.DoA(1);\n}\n\nTEST(ExpectationSetTest, IsEnumerable) {\n  ExpectationSet es;\n  EXPECT_TRUE(es.begin() == es.end());\n\n  es += Expectation();\n  ExpectationSet::const_iterator it = es.begin();\n  EXPECT_TRUE(it != es.end());\n  EXPECT_THAT(*it, Eq(Expectation()));\n  ++it;\n  EXPECT_TRUE(it== es.end());\n}\n\n// Tests the .After() clause.\n\nTEST(AfterTest, SucceedsWhenPartialOrderIsSatisfied) {\n  MockA a;\n  ExpectationSet es;\n  es += EXPECT_CALL(a, DoA(1));\n  es += EXPECT_CALL(a, DoA(2));\n  EXPECT_CALL(a, DoA(3))\n      .After(es);\n\n  a.DoA(1);\n  a.DoA(2);\n  a.DoA(3);\n}\n\nTEST(AfterTest, SucceedsWhenTotalOrderIsSatisfied) {\n  MockA a;\n  MockB b;\n  // The following also verifies that const Expectation objects work\n  // too.  Do not remove the const modifiers.\n  const Expectation e1 = EXPECT_CALL(a, DoA(1));\n  const Expectation e2 = EXPECT_CALL(b, DoB())\n      .Times(2)\n      .After(e1);\n  EXPECT_CALL(a, DoA(2)).After(e2);\n\n  a.DoA(1);\n  b.DoB();\n  b.DoB();\n  a.DoA(2);\n}\n\n// Calls must be in strict order when specified so using .After().\nTEST(AfterTest, CallsMustBeInStrictOrderWhenSpecifiedSo1) {\n  MockA a;\n  MockB b;\n\n  // Define ordering:\n  //   a.DoA(1) ==> b.DoB() ==> a.DoA(2)\n  Expectation e1 = EXPECT_CALL(a, DoA(1));\n  Expectation e2 = EXPECT_CALL(b, DoB())\n      .After(e1);\n  EXPECT_CALL(a, DoA(2))\n      .After(e2);\n\n  a.DoA(1);\n\n  // May only be called after DoB().\n  EXPECT_NONFATAL_FAILURE(a.DoA(2), \"Unexpected mock function call\");\n\n  b.DoB();\n  a.DoA(2);\n}\n\n// Calls must be in strict order when specified so using .After().\nTEST(AfterTest, CallsMustBeInStrictOrderWhenSpecifiedSo2) {\n  MockA a;\n  MockB b;\n\n  // Define ordering:\n  //   a.DoA(1) ==> b.DoB() * 2 ==> a.DoA(2)\n  Expectation e1 = EXPECT_CALL(a, DoA(1));\n  Expectation e2 = EXPECT_CALL(b, DoB())\n      .Times(2)\n      .After(e1);\n  EXPECT_CALL(a, DoA(2))\n      .After(e2);\n\n  a.DoA(1);\n  b.DoB();\n\n  // May only be called after the second DoB().\n  EXPECT_NONFATAL_FAILURE(a.DoA(2), \"Unexpected mock function call\");\n\n  b.DoB();\n  a.DoA(2);\n}\n\n// Calls must satisfy the partial order when specified so.\nTEST(AfterTest, CallsMustSatisfyPartialOrderWhenSpecifiedSo) {\n  MockA a;\n  ON_CALL(a, ReturnResult(_))\n      .WillByDefault(Return(Result()));\n\n  // Define ordering:\n  //   a.DoA(1) ==>\n  //   a.DoA(2) ==> a.ReturnResult(3)\n  Expectation e = EXPECT_CALL(a, DoA(1));\n  const ExpectationSet es = EXPECT_CALL(a, DoA(2));\n  EXPECT_CALL(a, ReturnResult(3))\n      .After(e, es);\n\n  // May only be called last.\n  EXPECT_NONFATAL_FAILURE(a.ReturnResult(3), \"Unexpected mock function call\");\n\n  a.DoA(2);\n  a.DoA(1);\n  a.ReturnResult(3);\n}\n\n// Calls must satisfy the partial order when specified so.\nTEST(AfterTest, CallsMustSatisfyPartialOrderWhenSpecifiedSo2) {\n  MockA a;\n\n  // Define ordering:\n  //   a.DoA(1) ==>\n  //   a.DoA(2) ==> a.DoA(3)\n  Expectation e = EXPECT_CALL(a, DoA(1));\n  const ExpectationSet es = EXPECT_CALL(a, DoA(2));\n  EXPECT_CALL(a, DoA(3))\n      .After(e, es);\n\n  a.DoA(2);\n\n  // May only be called last.\n  EXPECT_NONFATAL_FAILURE(a.DoA(3), \"Unexpected mock function call\");\n\n  a.DoA(1);\n  a.DoA(3);\n}\n\n// .After() can be combined with .InSequence().\nTEST(AfterTest, CanBeUsedWithInSequence) {\n  MockA a;\n  Sequence s;\n  Expectation e = EXPECT_CALL(a, DoA(1));\n  EXPECT_CALL(a, DoA(2)).InSequence(s);\n  EXPECT_CALL(a, DoA(3))\n      .InSequence(s)\n      .After(e);\n\n  a.DoA(1);\n\n  // May only be after DoA(2).\n  EXPECT_NONFATAL_FAILURE(a.DoA(3), \"Unexpected mock function call\");\n\n  a.DoA(2);\n  a.DoA(3);\n}\n\n// .After() can be called multiple times.\nTEST(AfterTest, CanBeCalledManyTimes) {\n  MockA a;\n  Expectation e1 = EXPECT_CALL(a, DoA(1));\n  Expectation e2 = EXPECT_CALL(a, DoA(2));\n  Expectation e3 = EXPECT_CALL(a, DoA(3));\n  EXPECT_CALL(a, DoA(4))\n      .After(e1)\n      .After(e2)\n      .After(e3);\n\n  a.DoA(3);\n  a.DoA(1);\n  a.DoA(2);\n  a.DoA(4);\n}\n\n// .After() accepts up to 5 arguments.\nTEST(AfterTest, AcceptsUpToFiveArguments) {\n  MockA a;\n  Expectation e1 = EXPECT_CALL(a, DoA(1));\n  Expectation e2 = EXPECT_CALL(a, DoA(2));\n  Expectation e3 = EXPECT_CALL(a, DoA(3));\n  ExpectationSet es1 = EXPECT_CALL(a, DoA(4));\n  ExpectationSet es2 = EXPECT_CALL(a, DoA(5));\n  EXPECT_CALL(a, DoA(6))\n      .After(e1, e2, e3, es1, es2);\n\n  a.DoA(5);\n  a.DoA(2);\n  a.DoA(4);\n  a.DoA(1);\n  a.DoA(3);\n  a.DoA(6);\n}\n\n// .After() allows input to contain duplicated Expectations.\nTEST(AfterTest, AcceptsDuplicatedInput) {\n  MockA a;\n  ON_CALL(a, ReturnResult(_))\n      .WillByDefault(Return(Result()));\n\n  // Define ordering:\n  //   DoA(1) ==>\n  //   DoA(2) ==> ReturnResult(3)\n  Expectation e1 = EXPECT_CALL(a, DoA(1));\n  Expectation e2 = EXPECT_CALL(a, DoA(2));\n  ExpectationSet es;\n  es += e1;\n  es += e2;\n  EXPECT_CALL(a, ReturnResult(3))\n      .After(e1, e2, es, e1);\n\n  a.DoA(1);\n\n  // May only be after DoA(2).\n  EXPECT_NONFATAL_FAILURE(a.ReturnResult(3), \"Unexpected mock function call\");\n\n  a.DoA(2);\n  a.ReturnResult(3);\n}\n\n// An Expectation added to an ExpectationSet after it has been used in\n// an .After() has no effect.\nTEST(AfterTest, ChangesToExpectationSetHaveNoEffectAfterwards) {\n  MockA a;\n  ExpectationSet es1 = EXPECT_CALL(a, DoA(1));\n  Expectation e2 = EXPECT_CALL(a, DoA(2));\n  EXPECT_CALL(a, DoA(3))\n      .After(es1);\n  es1 += e2;\n\n  a.DoA(1);\n  a.DoA(3);\n  a.DoA(2);\n}\n\n// Tests that Google Mock correctly handles calls to mock functions\n// after a mock object owning one of their pre-requisites has died.\n\n// Tests that calls that satisfy the original spec are successful.\nTEST(DeletingMockEarlyTest, Success1) {\n  MockB* const b1 = new MockB;\n  MockA* const a = new MockA;\n  MockB* const b2 = new MockB;\n\n  {\n    InSequence dummy;\n    EXPECT_CALL(*b1, DoB(_))\n        .WillOnce(Return(1));\n    EXPECT_CALL(*a, Binary(_, _))\n        .Times(AnyNumber())\n        .WillRepeatedly(Return(true));\n    EXPECT_CALL(*b2, DoB(_))\n        .Times(AnyNumber())\n        .WillRepeatedly(Return(2));\n  }\n\n  EXPECT_EQ(1, b1->DoB(1));\n  delete b1;\n  // a's pre-requisite has died.\n  EXPECT_TRUE(a->Binary(0, 1));\n  delete b2;\n  // a's successor has died.\n  EXPECT_TRUE(a->Binary(1, 2));\n  delete a;\n}\n\n// Tests that calls that satisfy the original spec are successful.\nTEST(DeletingMockEarlyTest, Success2) {\n  MockB* const b1 = new MockB;\n  MockA* const a = new MockA;\n  MockB* const b2 = new MockB;\n\n  {\n    InSequence dummy;\n    EXPECT_CALL(*b1, DoB(_))\n        .WillOnce(Return(1));\n    EXPECT_CALL(*a, Binary(_, _))\n        .Times(AnyNumber());\n    EXPECT_CALL(*b2, DoB(_))\n        .Times(AnyNumber())\n        .WillRepeatedly(Return(2));\n  }\n\n  delete a;  // a is trivially satisfied.\n  EXPECT_EQ(1, b1->DoB(1));\n  EXPECT_EQ(2, b2->DoB(2));\n  delete b1;\n  delete b2;\n}\n\n// Tests that it's OK to delete a mock object itself in its action.\n\n// Suppresses warning on unreferenced formal parameter in MSVC with\n// -W4.\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4100)\n#endif\n\nACTION_P(Delete, ptr) { delete ptr; }\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n\nTEST(DeletingMockEarlyTest, CanDeleteSelfInActionReturningVoid) {\n  MockA* const a = new MockA;\n  EXPECT_CALL(*a, DoA(_)).WillOnce(Delete(a));\n  a->DoA(42);  // This will cause a to be deleted.\n}\n\nTEST(DeletingMockEarlyTest, CanDeleteSelfInActionReturningValue) {\n  MockA* const a = new MockA;\n  EXPECT_CALL(*a, ReturnResult(_))\n      .WillOnce(DoAll(Delete(a), Return(Result())));\n  a->ReturnResult(42);  // This will cause a to be deleted.\n}\n\n// Tests that calls that violate the original spec yield failures.\nTEST(DeletingMockEarlyTest, Failure1) {\n  MockB* const b1 = new MockB;\n  MockA* const a = new MockA;\n  MockB* const b2 = new MockB;\n\n  {\n    InSequence dummy;\n    EXPECT_CALL(*b1, DoB(_))\n        .WillOnce(Return(1));\n    EXPECT_CALL(*a, Binary(_, _))\n        .Times(AnyNumber());\n    EXPECT_CALL(*b2, DoB(_))\n        .Times(AnyNumber())\n        .WillRepeatedly(Return(2));\n  }\n\n  delete a;  // a is trivially satisfied.\n  EXPECT_NONFATAL_FAILURE({\n    b2->DoB(2);\n  }, \"Unexpected mock function call\");\n  EXPECT_EQ(1, b1->DoB(1));\n  delete b1;\n  delete b2;\n}\n\n// Tests that calls that violate the original spec yield failures.\nTEST(DeletingMockEarlyTest, Failure2) {\n  MockB* const b1 = new MockB;\n  MockA* const a = new MockA;\n  MockB* const b2 = new MockB;\n\n  {\n    InSequence dummy;\n    EXPECT_CALL(*b1, DoB(_));\n    EXPECT_CALL(*a, Binary(_, _))\n        .Times(AnyNumber());\n    EXPECT_CALL(*b2, DoB(_))\n        .Times(AnyNumber());\n  }\n\n  EXPECT_NONFATAL_FAILURE(delete b1,\n                          \"Actual: never called\");\n  EXPECT_NONFATAL_FAILURE(a->Binary(0, 1),\n                          \"Unexpected mock function call\");\n  EXPECT_NONFATAL_FAILURE(b2->DoB(1),\n                          \"Unexpected mock function call\");\n  delete a;\n  delete b2;\n}\n\nclass EvenNumberCardinality : public CardinalityInterface {\n public:\n  // Returns true iff call_count calls will satisfy this cardinality.\n  virtual bool IsSatisfiedByCallCount(int call_count) const {\n    return call_count % 2 == 0;\n  }\n\n  // Returns true iff call_count calls will saturate this cardinality.\n  virtual bool IsSaturatedByCallCount(int /* call_count */) const {\n    return false;\n  }\n\n  // Describes self to an ostream.\n  virtual void DescribeTo(::std::ostream* os) const {\n    *os << \"called even number of times\";\n  }\n};\n\nCardinality EvenNumber() {\n  return Cardinality(new EvenNumberCardinality);\n}\n\nTEST(ExpectationBaseTest,\n     AllPrerequisitesAreSatisfiedWorksForNonMonotonicCardinality) {\n  MockA* a = new MockA;\n  Sequence s;\n\n  EXPECT_CALL(*a, DoA(1))\n      .Times(EvenNumber())\n      .InSequence(s);\n  EXPECT_CALL(*a, DoA(2))\n      .Times(AnyNumber())\n      .InSequence(s);\n  EXPECT_CALL(*a, DoA(3))\n      .Times(AnyNumber());\n\n  a->DoA(3);\n  a->DoA(1);\n  EXPECT_NONFATAL_FAILURE(a->DoA(2), \"Unexpected mock function call\");\n  EXPECT_NONFATAL_FAILURE(delete a, \"to be called even number of times\");\n}\n\n// The following tests verify the message generated when a mock\n// function is called.\n\nstruct Printable {\n};\n\ninline void operator<<(::std::ostream& os, const Printable&) {\n  os << \"Printable\";\n}\n\nstruct Unprintable {\n  Unprintable() : value(0) {}\n  int value;\n};\n\nclass MockC {\n public:\n  MockC() {}\n\n  MOCK_METHOD6(VoidMethod, void(bool cond, int n, std::string s, void* p,\n                                const Printable& x, Unprintable y));\n  MOCK_METHOD0(NonVoidMethod, int());  // NOLINT\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockC);\n};\n\nclass VerboseFlagPreservingFixture : public testing::Test {\n protected:\n  VerboseFlagPreservingFixture()\n      : saved_verbose_flag_(GMOCK_FLAG(verbose)) {}\n\n  ~VerboseFlagPreservingFixture() { GMOCK_FLAG(verbose) = saved_verbose_flag_; }\n\n private:\n  const std::string saved_verbose_flag_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(VerboseFlagPreservingFixture);\n};\n\n#if GTEST_HAS_STREAM_REDIRECTION\n\n// Tests that an uninteresting mock function call on a naggy mock\n// generates a warning without the stack trace when\n// --gmock_verbose=warning is specified.\nTEST(FunctionCallMessageTest,\n     UninterestingCallOnNaggyMockGeneratesNoStackTraceWhenVerboseWarning) {\n  GMOCK_FLAG(verbose) = kWarningVerbosity;\n  NaggyMock<MockC> c;\n  CaptureStdout();\n  c.VoidMethod(false, 5, \"Hi\", NULL, Printable(), Unprintable());\n  const std::string output = GetCapturedStdout();\n  EXPECT_PRED_FORMAT2(IsSubstring, \"GMOCK WARNING\", output);\n  EXPECT_PRED_FORMAT2(IsNotSubstring, \"Stack trace:\", output);\n}\n\n// Tests that an uninteresting mock function call on a naggy mock\n// generates a warning containing the stack trace when\n// --gmock_verbose=info is specified.\nTEST(FunctionCallMessageTest,\n     UninterestingCallOnNaggyMockGeneratesFyiWithStackTraceWhenVerboseInfo) {\n  GMOCK_FLAG(verbose) = kInfoVerbosity;\n  NaggyMock<MockC> c;\n  CaptureStdout();\n  c.VoidMethod(false, 5, \"Hi\", NULL, Printable(), Unprintable());\n  const std::string output = GetCapturedStdout();\n  EXPECT_PRED_FORMAT2(IsSubstring, \"GMOCK WARNING\", output);\n  EXPECT_PRED_FORMAT2(IsSubstring, \"Stack trace:\", output);\n\n# ifndef NDEBUG\n\n  // We check the stack trace content in dbg-mode only, as opt-mode\n  // may inline the call we are interested in seeing.\n\n  // Verifies that a void mock function's name appears in the stack\n  // trace.\n  EXPECT_PRED_FORMAT2(IsSubstring, \"VoidMethod(\", output);\n\n  // Verifies that a non-void mock function's name appears in the\n  // stack trace.\n  CaptureStdout();\n  c.NonVoidMethod();\n  const std::string output2 = GetCapturedStdout();\n  EXPECT_PRED_FORMAT2(IsSubstring, \"NonVoidMethod(\", output2);\n\n# endif  // NDEBUG\n}\n\n// Tests that an uninteresting mock function call on a naggy mock\n// causes the function arguments and return value to be printed.\nTEST(FunctionCallMessageTest,\n     UninterestingCallOnNaggyMockPrintsArgumentsAndReturnValue) {\n  // A non-void mock function.\n  NaggyMock<MockB> b;\n  CaptureStdout();\n  b.DoB();\n  const std::string output1 = GetCapturedStdout();\n  EXPECT_PRED_FORMAT2(\n      IsSubstring,\n      \"Uninteresting mock function call - returning default value.\\n\"\n      \"    Function call: DoB()\\n\"\n      \"          Returns: 0\\n\", output1.c_str());\n  // Makes sure the return value is printed.\n\n  // A void mock function.\n  NaggyMock<MockC> c;\n  CaptureStdout();\n  c.VoidMethod(false, 5, \"Hi\", NULL, Printable(), Unprintable());\n  const std::string output2 = GetCapturedStdout();\n  EXPECT_THAT(output2.c_str(),\n              ContainsRegex(\n                  \"Uninteresting mock function call - returning directly\\\\.\\n\"\n                  \"    Function call: VoidMethod\"\n                  \"\\\\(false, 5, \\\"Hi\\\", NULL, @.+ \"\n                  \"Printable, 4-byte object <00-00 00-00>\\\\)\"));\n  // A void function has no return value to print.\n}\n\n// Tests how the --gmock_verbose flag affects Google Mock's output.\n\nclass GMockVerboseFlagTest : public VerboseFlagPreservingFixture {\n public:\n  // Verifies that the given Google Mock output is correct.  (When\n  // should_print is true, the output should match the given regex and\n  // contain the given function name in the stack trace.  When it's\n  // false, the output should be empty.)\n  void VerifyOutput(const std::string& output, bool should_print,\n                    const std::string& expected_substring,\n                    const std::string& function_name) {\n    if (should_print) {\n      EXPECT_THAT(output.c_str(), HasSubstr(expected_substring));\n# ifndef NDEBUG\n      // We check the stack trace content in dbg-mode only, as opt-mode\n      // may inline the call we are interested in seeing.\n      EXPECT_THAT(output.c_str(), HasSubstr(function_name));\n# else\n      // Suppresses 'unused function parameter' warnings.\n      static_cast<void>(function_name);\n# endif  // NDEBUG\n    } else {\n      EXPECT_STREQ(\"\", output.c_str());\n    }\n  }\n\n  // Tests how the flag affects expected calls.\n  void TestExpectedCall(bool should_print) {\n    MockA a;\n    EXPECT_CALL(a, DoA(5));\n    EXPECT_CALL(a, Binary(_, 1))\n        .WillOnce(Return(true));\n\n    // A void-returning function.\n    CaptureStdout();\n    a.DoA(5);\n    VerifyOutput(\n        GetCapturedStdout(),\n        should_print,\n        \"Mock function call matches EXPECT_CALL(a, DoA(5))...\\n\"\n        \"    Function call: DoA(5)\\n\"\n        \"Stack trace:\\n\",\n        \"DoA\");\n\n    // A non-void-returning function.\n    CaptureStdout();\n    a.Binary(2, 1);\n    VerifyOutput(\n        GetCapturedStdout(),\n        should_print,\n        \"Mock function call matches EXPECT_CALL(a, Binary(_, 1))...\\n\"\n        \"    Function call: Binary(2, 1)\\n\"\n        \"          Returns: true\\n\"\n        \"Stack trace:\\n\",\n        \"Binary\");\n  }\n\n  // Tests how the flag affects uninteresting calls on a naggy mock.\n  void TestUninterestingCallOnNaggyMock(bool should_print) {\n    NaggyMock<MockA> a;\n    const std::string note =\n        \"NOTE: You can safely ignore the above warning unless this \"\n        \"call should not happen.  Do not suppress it by blindly adding \"\n        \"an EXPECT_CALL() if you don't mean to enforce the call.  \"\n        \"See \"\n        \"https://github.com/google/googletest/blob/master/googlemock/docs/\"\n        \"CookBook.md#\"\n        \"knowing-when-to-expect for details.\";\n\n    // A void-returning function.\n    CaptureStdout();\n    a.DoA(5);\n    VerifyOutput(\n        GetCapturedStdout(),\n        should_print,\n        \"\\nGMOCK WARNING:\\n\"\n        \"Uninteresting mock function call - returning directly.\\n\"\n        \"    Function call: DoA(5)\\n\" +\n        note,\n        \"DoA\");\n\n    // A non-void-returning function.\n    CaptureStdout();\n    a.Binary(2, 1);\n    VerifyOutput(\n        GetCapturedStdout(),\n        should_print,\n        \"\\nGMOCK WARNING:\\n\"\n        \"Uninteresting mock function call - returning default value.\\n\"\n        \"    Function call: Binary(2, 1)\\n\"\n        \"          Returns: false\\n\" +\n        note,\n        \"Binary\");\n  }\n};\n\n// Tests that --gmock_verbose=info causes both expected and\n// uninteresting calls to be reported.\nTEST_F(GMockVerboseFlagTest, Info) {\n  GMOCK_FLAG(verbose) = kInfoVerbosity;\n  TestExpectedCall(true);\n  TestUninterestingCallOnNaggyMock(true);\n}\n\n// Tests that --gmock_verbose=warning causes uninteresting calls to be\n// reported.\nTEST_F(GMockVerboseFlagTest, Warning) {\n  GMOCK_FLAG(verbose) = kWarningVerbosity;\n  TestExpectedCall(false);\n  TestUninterestingCallOnNaggyMock(true);\n}\n\n// Tests that --gmock_verbose=warning causes neither expected nor\n// uninteresting calls to be reported.\nTEST_F(GMockVerboseFlagTest, Error) {\n  GMOCK_FLAG(verbose) = kErrorVerbosity;\n  TestExpectedCall(false);\n  TestUninterestingCallOnNaggyMock(false);\n}\n\n// Tests that --gmock_verbose=SOME_INVALID_VALUE has the same effect\n// as --gmock_verbose=warning.\nTEST_F(GMockVerboseFlagTest, InvalidFlagIsTreatedAsWarning) {\n  GMOCK_FLAG(verbose) = \"invalid\";  // Treated as \"warning\".\n  TestExpectedCall(false);\n  TestUninterestingCallOnNaggyMock(true);\n}\n\n#endif  // GTEST_HAS_STREAM_REDIRECTION\n\n// A helper class that generates a failure when printed.  We use it to\n// ensure that Google Mock doesn't print a value (even to an internal\n// buffer) when it is not supposed to do so.\nclass PrintMeNot {};\n\nvoid PrintTo(PrintMeNot /* dummy */, ::std::ostream* /* os */) {\n  ADD_FAILURE() << \"Google Mock is printing a value that shouldn't be \"\n                << \"printed even to an internal buffer.\";\n}\n\nclass LogTestHelper {\n public:\n  LogTestHelper() {}\n\n  MOCK_METHOD1(Foo, PrintMeNot(PrintMeNot));\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(LogTestHelper);\n};\n\nclass GMockLogTest : public VerboseFlagPreservingFixture {\n protected:\n  LogTestHelper helper_;\n};\n\nTEST_F(GMockLogTest, DoesNotPrintGoodCallInternallyIfVerbosityIsWarning) {\n  GMOCK_FLAG(verbose) = kWarningVerbosity;\n  EXPECT_CALL(helper_, Foo(_))\n      .WillOnce(Return(PrintMeNot()));\n  helper_.Foo(PrintMeNot());  // This is an expected call.\n}\n\nTEST_F(GMockLogTest, DoesNotPrintGoodCallInternallyIfVerbosityIsError) {\n  GMOCK_FLAG(verbose) = kErrorVerbosity;\n  EXPECT_CALL(helper_, Foo(_))\n      .WillOnce(Return(PrintMeNot()));\n  helper_.Foo(PrintMeNot());  // This is an expected call.\n}\n\nTEST_F(GMockLogTest, DoesNotPrintWarningInternallyIfVerbosityIsError) {\n  GMOCK_FLAG(verbose) = kErrorVerbosity;\n  ON_CALL(helper_, Foo(_))\n      .WillByDefault(Return(PrintMeNot()));\n  helper_.Foo(PrintMeNot());  // This should generate a warning.\n}\n\n// Tests Mock::AllowLeak().\n\nTEST(AllowLeakTest, AllowsLeakingUnusedMockObject) {\n  MockA* a = new MockA;\n  Mock::AllowLeak(a);\n}\n\nTEST(AllowLeakTest, CanBeCalledBeforeOnCall) {\n  MockA* a = new MockA;\n  Mock::AllowLeak(a);\n  ON_CALL(*a, DoA(_)).WillByDefault(Return());\n  a->DoA(0);\n}\n\nTEST(AllowLeakTest, CanBeCalledAfterOnCall) {\n  MockA* a = new MockA;\n  ON_CALL(*a, DoA(_)).WillByDefault(Return());\n  Mock::AllowLeak(a);\n}\n\nTEST(AllowLeakTest, CanBeCalledBeforeExpectCall) {\n  MockA* a = new MockA;\n  Mock::AllowLeak(a);\n  EXPECT_CALL(*a, DoA(_));\n  a->DoA(0);\n}\n\nTEST(AllowLeakTest, CanBeCalledAfterExpectCall) {\n  MockA* a = new MockA;\n  EXPECT_CALL(*a, DoA(_)).Times(AnyNumber());\n  Mock::AllowLeak(a);\n}\n\nTEST(AllowLeakTest, WorksWhenBothOnCallAndExpectCallArePresent) {\n  MockA* a = new MockA;\n  ON_CALL(*a, DoA(_)).WillByDefault(Return());\n  EXPECT_CALL(*a, DoA(_)).Times(AnyNumber());\n  Mock::AllowLeak(a);\n}\n\n// Tests that we can verify and clear a mock object's expectations\n// when none of its methods has expectations.\nTEST(VerifyAndClearExpectationsTest, NoMethodHasExpectations) {\n  MockB b;\n  ASSERT_TRUE(Mock::VerifyAndClearExpectations(&b));\n\n  // There should be no expectations on the methods now, so we can\n  // freely call them.\n  EXPECT_EQ(0, b.DoB());\n  EXPECT_EQ(0, b.DoB(1));\n}\n\n// Tests that we can verify and clear a mock object's expectations\n// when some, but not all, of its methods have expectations *and* the\n// verification succeeds.\nTEST(VerifyAndClearExpectationsTest, SomeMethodsHaveExpectationsAndSucceed) {\n  MockB b;\n  EXPECT_CALL(b, DoB())\n      .WillOnce(Return(1));\n  b.DoB();\n  ASSERT_TRUE(Mock::VerifyAndClearExpectations(&b));\n\n  // There should be no expectations on the methods now, so we can\n  // freely call them.\n  EXPECT_EQ(0, b.DoB());\n  EXPECT_EQ(0, b.DoB(1));\n}\n\n// Tests that we can verify and clear a mock object's expectations\n// when some, but not all, of its methods have expectations *and* the\n// verification fails.\nTEST(VerifyAndClearExpectationsTest, SomeMethodsHaveExpectationsAndFail) {\n  MockB b;\n  EXPECT_CALL(b, DoB())\n      .WillOnce(Return(1));\n  bool result = true;\n  EXPECT_NONFATAL_FAILURE(result = Mock::VerifyAndClearExpectations(&b),\n                          \"Actual: never called\");\n  ASSERT_FALSE(result);\n\n  // There should be no expectations on the methods now, so we can\n  // freely call them.\n  EXPECT_EQ(0, b.DoB());\n  EXPECT_EQ(0, b.DoB(1));\n}\n\n// Tests that we can verify and clear a mock object's expectations\n// when all of its methods have expectations.\nTEST(VerifyAndClearExpectationsTest, AllMethodsHaveExpectations) {\n  MockB b;\n  EXPECT_CALL(b, DoB())\n      .WillOnce(Return(1));\n  EXPECT_CALL(b, DoB(_))\n      .WillOnce(Return(2));\n  b.DoB();\n  b.DoB(1);\n  ASSERT_TRUE(Mock::VerifyAndClearExpectations(&b));\n\n  // There should be no expectations on the methods now, so we can\n  // freely call them.\n  EXPECT_EQ(0, b.DoB());\n  EXPECT_EQ(0, b.DoB(1));\n}\n\n// Tests that we can verify and clear a mock object's expectations\n// when a method has more than one expectation.\nTEST(VerifyAndClearExpectationsTest, AMethodHasManyExpectations) {\n  MockB b;\n  EXPECT_CALL(b, DoB(0))\n      .WillOnce(Return(1));\n  EXPECT_CALL(b, DoB(_))\n      .WillOnce(Return(2));\n  b.DoB(1);\n  bool result = true;\n  EXPECT_NONFATAL_FAILURE(result = Mock::VerifyAndClearExpectations(&b),\n                          \"Actual: never called\");\n  ASSERT_FALSE(result);\n\n  // There should be no expectations on the methods now, so we can\n  // freely call them.\n  EXPECT_EQ(0, b.DoB());\n  EXPECT_EQ(0, b.DoB(1));\n}\n\n// Tests that we can call VerifyAndClearExpectations() on the same\n// mock object multiple times.\nTEST(VerifyAndClearExpectationsTest, CanCallManyTimes) {\n  MockB b;\n  EXPECT_CALL(b, DoB());\n  b.DoB();\n  Mock::VerifyAndClearExpectations(&b);\n\n  EXPECT_CALL(b, DoB(_))\n      .WillOnce(Return(1));\n  b.DoB(1);\n  Mock::VerifyAndClearExpectations(&b);\n  Mock::VerifyAndClearExpectations(&b);\n\n  // There should be no expectations on the methods now, so we can\n  // freely call them.\n  EXPECT_EQ(0, b.DoB());\n  EXPECT_EQ(0, b.DoB(1));\n}\n\n// Tests that we can clear a mock object's default actions when none\n// of its methods has default actions.\nTEST(VerifyAndClearTest, NoMethodHasDefaultActions) {\n  MockB b;\n  // If this crashes or generates a failure, the test will catch it.\n  Mock::VerifyAndClear(&b);\n  EXPECT_EQ(0, b.DoB());\n}\n\n// Tests that we can clear a mock object's default actions when some,\n// but not all of its methods have default actions.\nTEST(VerifyAndClearTest, SomeMethodsHaveDefaultActions) {\n  MockB b;\n  ON_CALL(b, DoB())\n      .WillByDefault(Return(1));\n\n  Mock::VerifyAndClear(&b);\n\n  // Verifies that the default action of int DoB() was removed.\n  EXPECT_EQ(0, b.DoB());\n}\n\n// Tests that we can clear a mock object's default actions when all of\n// its methods have default actions.\nTEST(VerifyAndClearTest, AllMethodsHaveDefaultActions) {\n  MockB b;\n  ON_CALL(b, DoB())\n      .WillByDefault(Return(1));\n  ON_CALL(b, DoB(_))\n      .WillByDefault(Return(2));\n\n  Mock::VerifyAndClear(&b);\n\n  // Verifies that the default action of int DoB() was removed.\n  EXPECT_EQ(0, b.DoB());\n\n  // Verifies that the default action of int DoB(int) was removed.\n  EXPECT_EQ(0, b.DoB(0));\n}\n\n// Tests that we can clear a mock object's default actions when a\n// method has more than one ON_CALL() set on it.\nTEST(VerifyAndClearTest, AMethodHasManyDefaultActions) {\n  MockB b;\n  ON_CALL(b, DoB(0))\n      .WillByDefault(Return(1));\n  ON_CALL(b, DoB(_))\n      .WillByDefault(Return(2));\n\n  Mock::VerifyAndClear(&b);\n\n  // Verifies that the default actions (there are two) of int DoB(int)\n  // were removed.\n  EXPECT_EQ(0, b.DoB(0));\n  EXPECT_EQ(0, b.DoB(1));\n}\n\n// Tests that we can call VerifyAndClear() on a mock object multiple\n// times.\nTEST(VerifyAndClearTest, CanCallManyTimes) {\n  MockB b;\n  ON_CALL(b, DoB())\n      .WillByDefault(Return(1));\n  Mock::VerifyAndClear(&b);\n  Mock::VerifyAndClear(&b);\n\n  ON_CALL(b, DoB(_))\n      .WillByDefault(Return(1));\n  Mock::VerifyAndClear(&b);\n\n  EXPECT_EQ(0, b.DoB());\n  EXPECT_EQ(0, b.DoB(1));\n}\n\n// Tests that VerifyAndClear() works when the verification succeeds.\nTEST(VerifyAndClearTest, Success) {\n  MockB b;\n  ON_CALL(b, DoB())\n      .WillByDefault(Return(1));\n  EXPECT_CALL(b, DoB(1))\n      .WillOnce(Return(2));\n\n  b.DoB();\n  b.DoB(1);\n  ASSERT_TRUE(Mock::VerifyAndClear(&b));\n\n  // There should be no expectations on the methods now, so we can\n  // freely call them.\n  EXPECT_EQ(0, b.DoB());\n  EXPECT_EQ(0, b.DoB(1));\n}\n\n// Tests that VerifyAndClear() works when the verification fails.\nTEST(VerifyAndClearTest, Failure) {\n  MockB b;\n  ON_CALL(b, DoB(_))\n      .WillByDefault(Return(1));\n  EXPECT_CALL(b, DoB())\n      .WillOnce(Return(2));\n\n  b.DoB(1);\n  bool result = true;\n  EXPECT_NONFATAL_FAILURE(result = Mock::VerifyAndClear(&b),\n                          \"Actual: never called\");\n  ASSERT_FALSE(result);\n\n  // There should be no expectations on the methods now, so we can\n  // freely call them.\n  EXPECT_EQ(0, b.DoB());\n  EXPECT_EQ(0, b.DoB(1));\n}\n\n// Tests that VerifyAndClear() works when the default actions and\n// expectations are set on a const mock object.\nTEST(VerifyAndClearTest, Const) {\n  MockB b;\n  ON_CALL(Const(b), DoB())\n      .WillByDefault(Return(1));\n\n  EXPECT_CALL(Const(b), DoB())\n      .WillOnce(DoDefault())\n      .WillOnce(Return(2));\n\n  b.DoB();\n  b.DoB();\n  ASSERT_TRUE(Mock::VerifyAndClear(&b));\n\n  // There should be no expectations on the methods now, so we can\n  // freely call them.\n  EXPECT_EQ(0, b.DoB());\n  EXPECT_EQ(0, b.DoB(1));\n}\n\n// Tests that we can set default actions and expectations on a mock\n// object after VerifyAndClear() has been called on it.\nTEST(VerifyAndClearTest, CanSetDefaultActionsAndExpectationsAfterwards) {\n  MockB b;\n  ON_CALL(b, DoB())\n      .WillByDefault(Return(1));\n  EXPECT_CALL(b, DoB(_))\n      .WillOnce(Return(2));\n  b.DoB(1);\n\n  Mock::VerifyAndClear(&b);\n\n  EXPECT_CALL(b, DoB())\n      .WillOnce(Return(3));\n  ON_CALL(b, DoB(_))\n      .WillByDefault(Return(4));\n\n  EXPECT_EQ(3, b.DoB());\n  EXPECT_EQ(4, b.DoB(1));\n}\n\n// Tests that calling VerifyAndClear() on one mock object does not\n// affect other mock objects (either of the same type or not).\nTEST(VerifyAndClearTest, DoesNotAffectOtherMockObjects) {\n  MockA a;\n  MockB b1;\n  MockB b2;\n\n  ON_CALL(a, Binary(_, _))\n      .WillByDefault(Return(true));\n  EXPECT_CALL(a, Binary(_, _))\n      .WillOnce(DoDefault())\n      .WillOnce(Return(false));\n\n  ON_CALL(b1, DoB())\n      .WillByDefault(Return(1));\n  EXPECT_CALL(b1, DoB(_))\n      .WillOnce(Return(2));\n\n  ON_CALL(b2, DoB())\n      .WillByDefault(Return(3));\n  EXPECT_CALL(b2, DoB(_));\n\n  b2.DoB(0);\n  Mock::VerifyAndClear(&b2);\n\n  // Verifies that the default actions and expectations of a and b1\n  // are still in effect.\n  EXPECT_TRUE(a.Binary(0, 0));\n  EXPECT_FALSE(a.Binary(0, 0));\n\n  EXPECT_EQ(1, b1.DoB());\n  EXPECT_EQ(2, b1.DoB(0));\n}\n\nTEST(VerifyAndClearTest,\n     DestroyingChainedMocksDoesNotDeadlockThroughExpectations) {\n  linked_ptr<MockA> a(new MockA);\n  ReferenceHoldingMock test_mock;\n\n  // EXPECT_CALL stores a reference to a inside test_mock.\n  EXPECT_CALL(test_mock, AcceptReference(_))\n      .WillRepeatedly(SetArgPointee<0>(a));\n\n  // Throw away the reference to the mock that we have in a. After this, the\n  // only reference to it is stored by test_mock.\n  a.reset();\n\n  // When test_mock goes out of scope, it destroys the last remaining reference\n  // to the mock object originally pointed to by a. This will cause the MockA\n  // destructor to be called from inside the ReferenceHoldingMock destructor.\n  // The state of all mocks is protected by a single global lock, but there\n  // should be no deadlock.\n}\n\nTEST(VerifyAndClearTest,\n     DestroyingChainedMocksDoesNotDeadlockThroughDefaultAction) {\n  linked_ptr<MockA> a(new MockA);\n  ReferenceHoldingMock test_mock;\n\n  // ON_CALL stores a reference to a inside test_mock.\n  ON_CALL(test_mock, AcceptReference(_))\n      .WillByDefault(SetArgPointee<0>(a));\n\n  // Throw away the reference to the mock that we have in a. After this, the\n  // only reference to it is stored by test_mock.\n  a.reset();\n\n  // When test_mock goes out of scope, it destroys the last remaining reference\n  // to the mock object originally pointed to by a. This will cause the MockA\n  // destructor to be called from inside the ReferenceHoldingMock destructor.\n  // The state of all mocks is protected by a single global lock, but there\n  // should be no deadlock.\n}\n\n// Tests that a mock function's action can call a mock function\n// (either the same function or a different one) either as an explicit\n// action or as a default action without causing a dead lock.  It\n// verifies that the action is not performed inside the critical\n// section.\nTEST(SynchronizationTest, CanCallMockMethodInAction) {\n  MockA a;\n  MockC c;\n  ON_CALL(a, DoA(_))\n      .WillByDefault(IgnoreResult(InvokeWithoutArgs(&c,\n                                                    &MockC::NonVoidMethod)));\n  EXPECT_CALL(a, DoA(1));\n  EXPECT_CALL(a, DoA(1))\n      .WillOnce(Invoke(&a, &MockA::DoA))\n      .RetiresOnSaturation();\n  EXPECT_CALL(c, NonVoidMethod());\n\n  a.DoA(1);\n  // This will match the second EXPECT_CALL() and trigger another a.DoA(1),\n  // which will in turn match the first EXPECT_CALL() and trigger a call to\n  // c.NonVoidMethod() that was specified by the ON_CALL() since the first\n  // EXPECT_CALL() did not specify an action.\n}\n\nTEST(ParameterlessExpectationsTest, CanSetExpectationsWithoutMatchers) {\n  MockA a;\n  int do_a_arg0 = 0;\n  ON_CALL(a, DoA).WillByDefault(SaveArg<0>(&do_a_arg0));\n  int do_a_47_arg0 = 0;\n  ON_CALL(a, DoA(47)).WillByDefault(SaveArg<0>(&do_a_47_arg0));\n\n  a.DoA(17);\n  EXPECT_THAT(do_a_arg0, 17);\n  EXPECT_THAT(do_a_47_arg0, 0);\n  a.DoA(47);\n  EXPECT_THAT(do_a_arg0, 17);\n  EXPECT_THAT(do_a_47_arg0, 47);\n\n  ON_CALL(a, Binary).WillByDefault(Return(true));\n  ON_CALL(a, Binary(_, 14)).WillByDefault(Return(false));\n  EXPECT_THAT(a.Binary(14, 17), true);\n  EXPECT_THAT(a.Binary(17, 14), false);\n}\n\nTEST(ParameterlessExpectationsTest, CanSetExpectationsForOverloadedMethods) {\n  MockB b;\n  ON_CALL(b, DoB()).WillByDefault(Return(9));\n  ON_CALL(b, DoB(5)).WillByDefault(Return(11));\n\n  EXPECT_THAT(b.DoB(), 9);\n  EXPECT_THAT(b.DoB(1), 0);  // default value\n  EXPECT_THAT(b.DoB(5), 11);\n}\n\nstruct MockWithConstMethods {\n public:\n  MOCK_CONST_METHOD1(Foo, int(int));\n  MOCK_CONST_METHOD2(Bar, int(int, const char*));\n};\n\nTEST(ParameterlessExpectationsTest, CanSetExpectationsForConstMethods) {\n  MockWithConstMethods mock;\n  ON_CALL(mock, Foo).WillByDefault(Return(7));\n  ON_CALL(mock, Bar).WillByDefault(Return(33));\n\n  EXPECT_THAT(mock.Foo(17), 7);\n  EXPECT_THAT(mock.Bar(27, \"purple\"), 33);\n}\n\nclass MockConstOverload {\n public:\n  MOCK_METHOD1(Overloaded, int(int));\n  MOCK_CONST_METHOD1(Overloaded, int(int));\n};\n\nTEST(ParameterlessExpectationsTest,\n     CanSetExpectationsForConstOverloadedMethods) {\n  MockConstOverload mock;\n  ON_CALL(mock, Overloaded(_)).WillByDefault(Return(7));\n  ON_CALL(mock, Overloaded(5)).WillByDefault(Return(9));\n  ON_CALL(Const(mock), Overloaded(5)).WillByDefault(Return(11));\n  ON_CALL(Const(mock), Overloaded(7)).WillByDefault(Return(13));\n\n  EXPECT_THAT(mock.Overloaded(1), 7);\n  EXPECT_THAT(mock.Overloaded(5), 9);\n  EXPECT_THAT(mock.Overloaded(7), 7);\n\n  const MockConstOverload& const_mock = mock;\n  EXPECT_THAT(const_mock.Overloaded(1), 0);\n  EXPECT_THAT(const_mock.Overloaded(5), 11);\n  EXPECT_THAT(const_mock.Overloaded(7), 13);\n}\n\n}  // namespace\n\n// Allows the user to define their own main and then invoke gmock_main\n// from it. This might be necessary on some platforms which require\n// specific setup and teardown.\n#if GMOCK_RENAME_MAIN\nint gmock_main(int argc, char **argv) {\n#else\nint main(int argc, char **argv) {\n#endif  // GMOCK_RENAME_MAIN\n  testing::InitGoogleMock(&argc, argv);\n  // Ensures that the tests pass no matter what value of\n  // --gmock_catch_leaked_mocks and --gmock_verbose the user specifies.\n  testing::GMOCK_FLAG(catch_leaked_mocks) = true;\n  testing::GMOCK_FLAG(verbose) = testing::internal::kWarningVerbosity;\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock_all_test.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Tests for Google C++ Mocking Framework (Google Mock)\n//\n// Some users use a build system that Google Mock doesn't support directly,\n// yet they still want to build and run Google Mock's own tests.  This file\n// includes most such tests, making it easier for these users to maintain\n// their build scripts (they just need to build this file, even though the\n// below list of actual *_test.cc files might change).\n#include \"test/gmock-actions_test.cc\"\n#include \"test/gmock-cardinalities_test.cc\"\n#include \"test/gmock-generated-actions_test.cc\"\n#include \"test/gmock-generated-function-mockers_test.cc\"\n#include \"test/gmock-generated-internal-utils_test.cc\"\n#include \"test/gmock-generated-matchers_test.cc\"\n#include \"test/gmock-internal-utils_test.cc\"\n#include \"test/gmock-matchers_test.cc\"\n#include \"test/gmock-more-actions_test.cc\"\n#include \"test/gmock-nice-strict_test.cc\"\n#include \"test/gmock-port_test.cc\"\n#include \"test/gmock-spec-builders_test.cc\"\n#include \"test/gmock_test.cc\"\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock_ex_test.cc",
    "content": "// Copyright 2013, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Tests Google Mock's functionality that depends on exceptions.\n\n#include \"gmock/gmock.h\"\n#include \"gtest/gtest.h\"\n\n#if GTEST_HAS_EXCEPTIONS\nnamespace {\n\nusing testing::HasSubstr;\n\nusing testing::internal::GoogleTestFailureException;\n\n// A type that cannot be default constructed.\nclass NonDefaultConstructible {\n public:\n  explicit NonDefaultConstructible(int /* dummy */) {}\n};\n\nclass MockFoo {\n public:\n  // A mock method that returns a user-defined type.  Google Mock\n  // doesn't know what the default value for this type is.\n  MOCK_METHOD0(GetNonDefaultConstructible, NonDefaultConstructible());\n};\n\nTEST(DefaultValueTest, ThrowsRuntimeErrorWhenNoDefaultValue) {\n  MockFoo mock;\n  try {\n    // No expectation is set on this method, so Google Mock must\n    // return the default value.  However, since Google Mock knows\n    // nothing about the return type, it doesn't know what to return,\n    // and has to throw (when exceptions are enabled) or abort\n    // (otherwise).\n    mock.GetNonDefaultConstructible();\n    FAIL() << \"GetNonDefaultConstructible()'s return type has no default \"\n           << \"value, so Google Mock should have thrown.\";\n  } catch (const GoogleTestFailureException& /* unused */) {\n    FAIL() << \"Google Test does not try to catch an exception of type \"\n           << \"GoogleTestFailureException, which is used for reporting \"\n           << \"a failure to other testing frameworks.  Google Mock should \"\n           << \"not throw a GoogleTestFailureException as it will kill the \"\n           << \"entire test program instead of just the current TEST.\";\n  } catch (const std::exception& ex) {\n    EXPECT_THAT(ex.what(), HasSubstr(\"has no default value\"));\n  }\n}\n\n\n}  // unnamed namespace\n#endif\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock_leak_test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Tests that leaked mock objects can be caught be Google Mock.\"\"\"\n\nimport gmock_test_utils\n\nPROGRAM_PATH = gmock_test_utils.GetTestExecutablePath('gmock_leak_test_')\nTEST_WITH_EXPECT_CALL = [PROGRAM_PATH, '--gtest_filter=*ExpectCall*']\nTEST_WITH_ON_CALL = [PROGRAM_PATH, '--gtest_filter=*OnCall*']\nTEST_MULTIPLE_LEAKS = [PROGRAM_PATH, '--gtest_filter=*MultipleLeaked*']\n\nenviron = gmock_test_utils.environ\nSetEnvVar = gmock_test_utils.SetEnvVar\n\n# Tests in this file run a Google-Test-based test program and expect it\n# to terminate prematurely.  Therefore they are incompatible with\n# the premature-exit-file protocol by design.  Unset the\n# premature-exit filepath to prevent Google Test from creating\n# the file.\nSetEnvVar(gmock_test_utils.PREMATURE_EXIT_FILE_ENV_VAR, None)\n\n\nclass GMockLeakTest(gmock_test_utils.TestCase):\n\n  def testCatchesLeakedMockByDefault(self):\n    self.assertNotEqual(\n        0,\n        gmock_test_utils.Subprocess(TEST_WITH_EXPECT_CALL,\n                                    env=environ).exit_code)\n    self.assertNotEqual(\n        0,\n        gmock_test_utils.Subprocess(TEST_WITH_ON_CALL,\n                                    env=environ).exit_code)\n\n  def testDoesNotCatchLeakedMockWhenDisabled(self):\n    self.assertEquals(\n        0,\n        gmock_test_utils.Subprocess(TEST_WITH_EXPECT_CALL +\n                                    ['--gmock_catch_leaked_mocks=0'],\n                                    env=environ).exit_code)\n    self.assertEquals(\n        0,\n        gmock_test_utils.Subprocess(TEST_WITH_ON_CALL +\n                                    ['--gmock_catch_leaked_mocks=0'],\n                                    env=environ).exit_code)\n\n  def testCatchesLeakedMockWhenEnabled(self):\n    self.assertNotEqual(\n        0,\n        gmock_test_utils.Subprocess(TEST_WITH_EXPECT_CALL +\n                                    ['--gmock_catch_leaked_mocks'],\n                                    env=environ).exit_code)\n    self.assertNotEqual(\n        0,\n        gmock_test_utils.Subprocess(TEST_WITH_ON_CALL +\n                                    ['--gmock_catch_leaked_mocks'],\n                                    env=environ).exit_code)\n\n  def testCatchesLeakedMockWhenEnabledWithExplictFlagValue(self):\n    self.assertNotEqual(\n        0,\n        gmock_test_utils.Subprocess(TEST_WITH_EXPECT_CALL +\n                                    ['--gmock_catch_leaked_mocks=1'],\n                                    env=environ).exit_code)\n\n  def testCatchesMultipleLeakedMocks(self):\n    self.assertNotEqual(\n        0,\n        gmock_test_utils.Subprocess(TEST_MULTIPLE_LEAKS +\n                                    ['--gmock_catch_leaked_mocks'],\n                                    env=environ).exit_code)\n\n\nif __name__ == '__main__':\n  gmock_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock_leak_test_.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This program is for verifying that a leaked mock object can be\n// caught by Google Mock's leak detector.\n\n#include \"gmock/gmock.h\"\n\nnamespace {\n\nusing ::testing::Return;\n\nclass FooInterface {\n public:\n  virtual ~FooInterface() {}\n  virtual void DoThis() = 0;\n};\n\nclass MockFoo : public FooInterface {\n public:\n  MockFoo() {}\n\n  MOCK_METHOD0(DoThis, void());\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo);\n};\n\nTEST(LeakTest, LeakedMockWithExpectCallCausesFailureWhenLeakCheckingIsEnabled) {\n  MockFoo* foo = new MockFoo;\n\n  EXPECT_CALL(*foo, DoThis());\n  foo->DoThis();\n\n  // In order to test the leak detector, we deliberately leak foo.\n\n  // Makes sure Google Mock's leak detector can change the exit code\n  // to 1 even when the code is already exiting with 0.\n  exit(0);\n}\n\nTEST(LeakTest, LeakedMockWithOnCallCausesFailureWhenLeakCheckingIsEnabled) {\n  MockFoo* foo = new MockFoo;\n\n  ON_CALL(*foo, DoThis()).WillByDefault(Return());\n\n  // In order to test the leak detector, we deliberately leak foo.\n\n  // Makes sure Google Mock's leak detector can change the exit code\n  // to 1 even when the code is already exiting with 0.\n  exit(0);\n}\n\nTEST(LeakTest, CatchesMultipleLeakedMockObjects) {\n  MockFoo* foo1 = new MockFoo;\n  MockFoo* foo2 = new MockFoo;\n\n  ON_CALL(*foo1, DoThis()).WillByDefault(Return());\n  EXPECT_CALL(*foo2, DoThis());\n  foo2->DoThis();\n\n  // In order to test the leak detector, we deliberately leak foo1 and\n  // foo2.\n\n  // Makes sure Google Mock's leak detector can change the exit code\n  // to 1 even when the code is already exiting with 0.\n  exit(0);\n}\n\n}  // namespace\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock_link2_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file is for verifying that various Google Mock constructs do not\n// produce linker errors when instantiated in different translation units.\n// Please see gmock_link_test.h for details.\n\n#define LinkTest LinkTest2\n\n#include \"test/gmock_link_test.h\"\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock_link_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file is for verifying that various Google Mock constructs do not\n// produce linker errors when instantiated in different translation units.\n// Please see gmock_link_test.h for details.\n\n#define LinkTest LinkTest1\n\n#include \"test/gmock_link_test.h\"\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock_link_test.h",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file tests that:\n// a. A header file defining a mock class can be included in multiple\n//    translation units without causing a link error.\n// b. Actions and matchers can be instantiated with identical template\n//    arguments in different translation units without causing link\n//    errors.\n//    The following constructs are currently tested:\n//    Actions:\n//      Return()\n//      Return(value)\n//      ReturnNull\n//      ReturnRef\n//      Assign\n//      SetArgPointee\n//      SetArrayArgument\n//      SetErrnoAndReturn\n//      Invoke(function)\n//      Invoke(object, method)\n//      InvokeWithoutArgs(function)\n//      InvokeWithoutArgs(object, method)\n//      InvokeArgument\n//      WithArg\n//      WithArgs\n//      WithoutArgs\n//      DoAll\n//      DoDefault\n//      IgnoreResult\n//      Throw\n//      ACTION()-generated\n//      ACTION_P()-generated\n//      ACTION_P2()-generated\n//    Matchers:\n//      _\n//      A\n//      An\n//      Eq\n//      Gt, Lt, Ge, Le, Ne\n//      NotNull\n//      Ref\n//      TypedEq\n//      DoubleEq\n//      FloatEq\n//      NanSensitiveDoubleEq\n//      NanSensitiveFloatEq\n//      ContainsRegex\n//      MatchesRegex\n//      EndsWith\n//      HasSubstr\n//      StartsWith\n//      StrCaseEq\n//      StrCaseNe\n//      StrEq\n//      StrNe\n//      ElementsAre\n//      ElementsAreArray\n//      ContainerEq\n//      Field\n//      Property\n//      ResultOf(function)\n//      ResultOf(callback)\n//      Pointee\n//      Truly(predicate)\n//      AddressSatisfies\n//      AllOf\n//      AnyOf\n//      Not\n//      MatcherCast<T>\n//\n//  Please note: this test does not verify the functioning of these\n//  constructs, only that the programs using them will link successfully.\n//\n// Implementation note:\n// This test requires identical definitions of Interface and Mock to be\n// included in different translation units.  We achieve this by writing\n// them in this header and #including it in gmock_link_test.cc and\n// gmock_link2_test.cc.  Because the symbols generated by the compiler for\n// those constructs must be identical in both translation units,\n// definitions of Interface and Mock tests MUST be kept in the SAME\n// NON-ANONYMOUS namespace in this file.  The test fixture class LinkTest\n// is defined as LinkTest1 in gmock_link_test.cc and as LinkTest2 in\n// gmock_link2_test.cc to avoid producing linker errors.\n\n#ifndef GMOCK_TEST_GMOCK_LINK_TEST_H_\n#define GMOCK_TEST_GMOCK_LINK_TEST_H_\n\n#include \"gmock/gmock.h\"\n\n#if !GTEST_OS_WINDOWS_MOBILE\n# include <errno.h>\n#endif\n\n#include <iostream>\n#include <vector>\n\n#include \"gtest/gtest.h\"\n#include \"gtest/internal/gtest-port.h\"\n\nusing testing::_;\nusing testing::A;\nusing testing::Action;\nusing testing::AllOf;\nusing testing::AnyOf;\nusing testing::Assign;\nusing testing::ContainerEq;\nusing testing::DoAll;\nusing testing::DoDefault;\nusing testing::DoubleEq;\nusing testing::ElementsAre;\nusing testing::ElementsAreArray;\nusing testing::EndsWith;\nusing testing::Eq;\nusing testing::Field;\nusing testing::FloatEq;\nusing testing::Ge;\nusing testing::Gt;\nusing testing::HasSubstr;\nusing testing::IgnoreResult;\nusing testing::Invoke;\nusing testing::InvokeArgument;\nusing testing::InvokeWithoutArgs;\nusing testing::IsNull;\nusing testing::IsSubsetOf;\nusing testing::IsSupersetOf;\nusing testing::Le;\nusing testing::Lt;\nusing testing::Matcher;\nusing testing::MatcherCast;\nusing testing::NanSensitiveDoubleEq;\nusing testing::NanSensitiveFloatEq;\nusing testing::Ne;\nusing testing::Not;\nusing testing::NotNull;\nusing testing::Pointee;\nusing testing::Property;\nusing testing::Ref;\nusing testing::ResultOf;\nusing testing::Return;\nusing testing::ReturnNull;\nusing testing::ReturnRef;\nusing testing::SetArgPointee;\nusing testing::SetArrayArgument;\nusing testing::StartsWith;\nusing testing::StrCaseEq;\nusing testing::StrCaseNe;\nusing testing::StrEq;\nusing testing::StrNe;\nusing testing::Truly;\nusing testing::TypedEq;\nusing testing::WithArg;\nusing testing::WithArgs;\nusing testing::WithoutArgs;\n\n#if !GTEST_OS_WINDOWS_MOBILE\nusing testing::SetErrnoAndReturn;\n#endif\n\n#if GTEST_HAS_EXCEPTIONS\nusing testing::Throw;\n#endif\n\nusing testing::ContainsRegex;\nusing testing::MatchesRegex;\n\nclass Interface {\n public:\n  virtual ~Interface() {}\n  virtual void VoidFromString(char* str) = 0;\n  virtual char* StringFromString(char* str) = 0;\n  virtual int IntFromString(char* str) = 0;\n  virtual int& IntRefFromString(char* str) = 0;\n  virtual void VoidFromFunc(void(*func)(char* str)) = 0;\n  virtual void VoidFromIntRef(int& n) = 0;  // NOLINT\n  virtual void VoidFromFloat(float n) = 0;\n  virtual void VoidFromDouble(double n) = 0;\n  virtual void VoidFromVector(const std::vector<int>& v) = 0;\n};\n\nclass Mock: public Interface {\n public:\n  Mock() {}\n\n  MOCK_METHOD1(VoidFromString, void(char* str));\n  MOCK_METHOD1(StringFromString, char*(char* str));\n  MOCK_METHOD1(IntFromString, int(char* str));\n  MOCK_METHOD1(IntRefFromString, int&(char* str));\n  MOCK_METHOD1(VoidFromFunc, void(void(*func)(char* str)));\n  MOCK_METHOD1(VoidFromIntRef, void(int& n));  // NOLINT\n  MOCK_METHOD1(VoidFromFloat, void(float n));\n  MOCK_METHOD1(VoidFromDouble, void(double n));\n  MOCK_METHOD1(VoidFromVector, void(const std::vector<int>& v));\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mock);\n};\n\nclass InvokeHelper {\n public:\n  static void StaticVoidFromVoid() {}\n  void VoidFromVoid() {}\n  static void StaticVoidFromString(char* /* str */) {}\n  void VoidFromString(char* /* str */) {}\n  static int StaticIntFromString(char* /* str */) { return 1; }\n  static bool StaticBoolFromString(const char* /* str */) { return true; }\n};\n\nclass FieldHelper {\n public:\n  explicit FieldHelper(int a_field) : field_(a_field) {}\n  int field() const { return field_; }\n  int field_;  // NOLINT -- need external access to field_ to test\n               //           the Field matcher.\n};\n\n// Tests the linkage of the ReturnVoid action.\nTEST(LinkTest, TestReturnVoid) {\n  Mock mock;\n\n  EXPECT_CALL(mock, VoidFromString(_)).WillOnce(Return());\n  mock.VoidFromString(NULL);\n}\n\n// Tests the linkage of the Return action.\nTEST(LinkTest, TestReturn) {\n  Mock mock;\n  char ch = 'x';\n\n  EXPECT_CALL(mock, StringFromString(_)).WillOnce(Return(&ch));\n  mock.StringFromString(NULL);\n}\n\n// Tests the linkage of the ReturnNull action.\nTEST(LinkTest, TestReturnNull) {\n  Mock mock;\n\n  EXPECT_CALL(mock, VoidFromString(_)).WillOnce(Return());\n  mock.VoidFromString(NULL);\n}\n\n// Tests the linkage of the ReturnRef action.\nTEST(LinkTest, TestReturnRef) {\n  Mock mock;\n  int n = 42;\n\n  EXPECT_CALL(mock, IntRefFromString(_)).WillOnce(ReturnRef(n));\n  mock.IntRefFromString(NULL);\n}\n\n// Tests the linkage of the Assign action.\nTEST(LinkTest, TestAssign) {\n  Mock mock;\n  char ch = 'x';\n\n  EXPECT_CALL(mock, VoidFromString(_)).WillOnce(Assign(&ch, 'y'));\n  mock.VoidFromString(NULL);\n}\n\n// Tests the linkage of the SetArgPointee action.\nTEST(LinkTest, TestSetArgPointee) {\n  Mock mock;\n  char ch = 'x';\n\n  EXPECT_CALL(mock, VoidFromString(_)).WillOnce(SetArgPointee<0>('y'));\n  mock.VoidFromString(&ch);\n}\n\n// Tests the linkage of the SetArrayArgument action.\nTEST(LinkTest, TestSetArrayArgument) {\n  Mock mock;\n  char ch = 'x';\n  char ch2 = 'y';\n\n  EXPECT_CALL(mock, VoidFromString(_)).WillOnce(SetArrayArgument<0>(&ch2,\n                                                                    &ch2 + 1));\n  mock.VoidFromString(&ch);\n}\n\n#if !GTEST_OS_WINDOWS_MOBILE\n\n// Tests the linkage of the SetErrnoAndReturn action.\nTEST(LinkTest, TestSetErrnoAndReturn) {\n  Mock mock;\n\n  int saved_errno = errno;\n  EXPECT_CALL(mock, IntFromString(_)).WillOnce(SetErrnoAndReturn(1, -1));\n  mock.IntFromString(NULL);\n  errno = saved_errno;\n}\n\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\n// Tests the linkage of the Invoke(function) and Invoke(object, method) actions.\nTEST(LinkTest, TestInvoke) {\n  Mock mock;\n  InvokeHelper test_invoke_helper;\n\n  EXPECT_CALL(mock, VoidFromString(_))\n      .WillOnce(Invoke(&InvokeHelper::StaticVoidFromString))\n      .WillOnce(Invoke(&test_invoke_helper, &InvokeHelper::VoidFromString));\n  mock.VoidFromString(NULL);\n  mock.VoidFromString(NULL);\n}\n\n// Tests the linkage of the InvokeWithoutArgs action.\nTEST(LinkTest, TestInvokeWithoutArgs) {\n  Mock mock;\n  InvokeHelper test_invoke_helper;\n\n  EXPECT_CALL(mock, VoidFromString(_))\n      .WillOnce(InvokeWithoutArgs(&InvokeHelper::StaticVoidFromVoid))\n      .WillOnce(InvokeWithoutArgs(&test_invoke_helper,\n                                  &InvokeHelper::VoidFromVoid));\n  mock.VoidFromString(NULL);\n  mock.VoidFromString(NULL);\n}\n\n// Tests the linkage of the InvokeArgument action.\nTEST(LinkTest, TestInvokeArgument) {\n  Mock mock;\n  char ch = 'x';\n\n  EXPECT_CALL(mock, VoidFromFunc(_)).WillOnce(InvokeArgument<0>(&ch));\n  mock.VoidFromFunc(InvokeHelper::StaticVoidFromString);\n}\n\n// Tests the linkage of the WithArg action.\nTEST(LinkTest, TestWithArg) {\n  Mock mock;\n\n  EXPECT_CALL(mock, VoidFromString(_))\n      .WillOnce(WithArg<0>(Invoke(&InvokeHelper::StaticVoidFromString)));\n  mock.VoidFromString(NULL);\n}\n\n// Tests the linkage of the WithArgs action.\nTEST(LinkTest, TestWithArgs) {\n  Mock mock;\n\n  EXPECT_CALL(mock, VoidFromString(_))\n      .WillOnce(WithArgs<0>(Invoke(&InvokeHelper::StaticVoidFromString)));\n  mock.VoidFromString(NULL);\n}\n\n// Tests the linkage of the WithoutArgs action.\nTEST(LinkTest, TestWithoutArgs) {\n  Mock mock;\n\n  EXPECT_CALL(mock, VoidFromString(_)).WillOnce(WithoutArgs(Return()));\n  mock.VoidFromString(NULL);\n}\n\n// Tests the linkage of the DoAll action.\nTEST(LinkTest, TestDoAll) {\n  Mock mock;\n  char ch = 'x';\n\n  EXPECT_CALL(mock, VoidFromString(_))\n      .WillOnce(DoAll(SetArgPointee<0>('y'), Return()));\n  mock.VoidFromString(&ch);\n}\n\n// Tests the linkage of the DoDefault action.\nTEST(LinkTest, TestDoDefault) {\n  Mock mock;\n  char ch = 'x';\n\n  ON_CALL(mock, VoidFromString(_)).WillByDefault(Return());\n  EXPECT_CALL(mock, VoidFromString(_)).WillOnce(DoDefault());\n  mock.VoidFromString(&ch);\n}\n\n// Tests the linkage of the IgnoreResult action.\nTEST(LinkTest, TestIgnoreResult) {\n  Mock mock;\n\n  EXPECT_CALL(mock, VoidFromString(_)).WillOnce(IgnoreResult(Return(42)));\n  mock.VoidFromString(NULL);\n}\n\n#if GTEST_HAS_EXCEPTIONS\n// Tests the linkage of the Throw action.\nTEST(LinkTest, TestThrow) {\n  Mock mock;\n\n  EXPECT_CALL(mock, VoidFromString(_)).WillOnce(Throw(42));\n  EXPECT_THROW(mock.VoidFromString(NULL), int);\n}\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// The ACTION*() macros trigger warning C4100 (unreferenced formal\n// parameter) in MSVC with -W4.  Unfortunately they cannot be fixed in\n// the macro definition, as the warnings are generated when the macro\n// is expanded and macro expansion cannot contain #pragma.  Therefore\n// we suppress them here.\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4100)\n#endif\n\n// Tests the linkage of actions created using ACTION macro.\nnamespace {\nACTION(Return1) { return 1; }\n}\n\nTEST(LinkTest, TestActionMacro) {\n  Mock mock;\n\n  EXPECT_CALL(mock, IntFromString(_)).WillOnce(Return1());\n  mock.IntFromString(NULL);\n}\n\n// Tests the linkage of actions created using ACTION_P macro.\nnamespace {\nACTION_P(ReturnArgument, ret_value) { return ret_value; }\n}\n\nTEST(LinkTest, TestActionPMacro) {\n  Mock mock;\n\n  EXPECT_CALL(mock, IntFromString(_)).WillOnce(ReturnArgument(42));\n  mock.IntFromString(NULL);\n}\n\n// Tests the linkage of actions created using ACTION_P2 macro.\nnamespace {\nACTION_P2(ReturnEqualsEitherOf, first, second) {\n  return arg0 == first || arg0 == second;\n}\n}\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n\nTEST(LinkTest, TestActionP2Macro) {\n  Mock mock;\n  char ch = 'x';\n\n  EXPECT_CALL(mock, IntFromString(_))\n      .WillOnce(ReturnEqualsEitherOf(\"one\", \"two\"));\n  mock.IntFromString(&ch);\n}\n\n// Tests the linkage of the \"_\" matcher.\nTEST(LinkTest, TestMatcherAnything) {\n  Mock mock;\n\n  ON_CALL(mock, VoidFromString(_)).WillByDefault(Return());\n}\n\n// Tests the linkage of the A matcher.\nTEST(LinkTest, TestMatcherA) {\n  Mock mock;\n\n  ON_CALL(mock, VoidFromString(A<char*>())).WillByDefault(Return());\n}\n\n// Tests the linkage of the Eq and the \"bare value\" matcher.\nTEST(LinkTest, TestMatchersEq) {\n  Mock mock;\n  const char* p = \"x\";\n\n  ON_CALL(mock, VoidFromString(Eq(p))).WillByDefault(Return());\n  ON_CALL(mock, VoidFromString(const_cast<char*>(\"y\")))\n      .WillByDefault(Return());\n}\n\n// Tests the linkage of the Lt, Gt, Le, Ge, and Ne matchers.\nTEST(LinkTest, TestMatchersRelations) {\n  Mock mock;\n\n  ON_CALL(mock, VoidFromFloat(Lt(1.0f))).WillByDefault(Return());\n  ON_CALL(mock, VoidFromFloat(Gt(1.0f))).WillByDefault(Return());\n  ON_CALL(mock, VoidFromFloat(Le(1.0f))).WillByDefault(Return());\n  ON_CALL(mock, VoidFromFloat(Ge(1.0f))).WillByDefault(Return());\n  ON_CALL(mock, VoidFromFloat(Ne(1.0f))).WillByDefault(Return());\n}\n\n// Tests the linkage of the NotNull matcher.\nTEST(LinkTest, TestMatcherNotNull) {\n  Mock mock;\n\n  ON_CALL(mock, VoidFromString(NotNull())).WillByDefault(Return());\n}\n\n// Tests the linkage of the IsNull matcher.\nTEST(LinkTest, TestMatcherIsNull) {\n  Mock mock;\n\n  ON_CALL(mock, VoidFromString(IsNull())).WillByDefault(Return());\n}\n\n// Tests the linkage of the Ref matcher.\nTEST(LinkTest, TestMatcherRef) {\n  Mock mock;\n  int a = 0;\n\n  ON_CALL(mock, VoidFromIntRef(Ref(a))).WillByDefault(Return());\n}\n\n// Tests the linkage of the TypedEq matcher.\nTEST(LinkTest, TestMatcherTypedEq) {\n  Mock mock;\n  long a = 0;\n\n  ON_CALL(mock, VoidFromIntRef(TypedEq<int&>(a))).WillByDefault(Return());\n}\n\n// Tests the linkage of the FloatEq, DoubleEq, NanSensitiveFloatEq and\n// NanSensitiveDoubleEq matchers.\nTEST(LinkTest, TestMatchersFloatingPoint) {\n  Mock mock;\n  float a = 0;\n\n  ON_CALL(mock, VoidFromFloat(FloatEq(a))).WillByDefault(Return());\n  ON_CALL(mock, VoidFromDouble(DoubleEq(a))).WillByDefault(Return());\n  ON_CALL(mock, VoidFromFloat(NanSensitiveFloatEq(a))).WillByDefault(Return());\n  ON_CALL(mock, VoidFromDouble(NanSensitiveDoubleEq(a)))\n      .WillByDefault(Return());\n}\n\n// Tests the linkage of the ContainsRegex matcher.\nTEST(LinkTest, TestMatcherContainsRegex) {\n  Mock mock;\n\n  ON_CALL(mock, VoidFromString(ContainsRegex(\".*\"))).WillByDefault(Return());\n}\n\n// Tests the linkage of the MatchesRegex matcher.\nTEST(LinkTest, TestMatcherMatchesRegex) {\n  Mock mock;\n\n  ON_CALL(mock, VoidFromString(MatchesRegex(\".*\"))).WillByDefault(Return());\n}\n\n// Tests the linkage of the StartsWith, EndsWith, and HasSubstr matchers.\nTEST(LinkTest, TestMatchersSubstrings) {\n  Mock mock;\n\n  ON_CALL(mock, VoidFromString(StartsWith(\"a\"))).WillByDefault(Return());\n  ON_CALL(mock, VoidFromString(EndsWith(\"c\"))).WillByDefault(Return());\n  ON_CALL(mock, VoidFromString(HasSubstr(\"b\"))).WillByDefault(Return());\n}\n\n// Tests the linkage of the StrEq, StrNe, StrCaseEq, and StrCaseNe matchers.\nTEST(LinkTest, TestMatchersStringEquality) {\n  Mock mock;\n  ON_CALL(mock, VoidFromString(StrEq(\"a\"))).WillByDefault(Return());\n  ON_CALL(mock, VoidFromString(StrNe(\"a\"))).WillByDefault(Return());\n  ON_CALL(mock, VoidFromString(StrCaseEq(\"a\"))).WillByDefault(Return());\n  ON_CALL(mock, VoidFromString(StrCaseNe(\"a\"))).WillByDefault(Return());\n}\n\n// Tests the linkage of the ElementsAre matcher.\nTEST(LinkTest, TestMatcherElementsAre) {\n  Mock mock;\n\n  ON_CALL(mock, VoidFromVector(ElementsAre('a', _))).WillByDefault(Return());\n}\n\n// Tests the linkage of the ElementsAreArray matcher.\nTEST(LinkTest, TestMatcherElementsAreArray) {\n  Mock mock;\n  char arr[] = { 'a', 'b' };\n\n  ON_CALL(mock, VoidFromVector(ElementsAreArray(arr))).WillByDefault(Return());\n}\n\n// Tests the linkage of the IsSubsetOf matcher.\nTEST(LinkTest, TestMatcherIsSubsetOf) {\n  Mock mock;\n  char arr[] = {'a', 'b'};\n\n  ON_CALL(mock, VoidFromVector(IsSubsetOf(arr))).WillByDefault(Return());\n}\n\n// Tests the linkage of the IsSupersetOf matcher.\nTEST(LinkTest, TestMatcherIsSupersetOf) {\n  Mock mock;\n  char arr[] = {'a', 'b'};\n\n  ON_CALL(mock, VoidFromVector(IsSupersetOf(arr))).WillByDefault(Return());\n}\n\n// Tests the linkage of the ContainerEq matcher.\nTEST(LinkTest, TestMatcherContainerEq) {\n  Mock mock;\n  std::vector<int> v;\n\n  ON_CALL(mock, VoidFromVector(ContainerEq(v))).WillByDefault(Return());\n}\n\n// Tests the linkage of the Field matcher.\nTEST(LinkTest, TestMatcherField) {\n  FieldHelper helper(0);\n\n  Matcher<const FieldHelper&> m = Field(&FieldHelper::field_, Eq(0));\n  EXPECT_TRUE(m.Matches(helper));\n\n  Matcher<const FieldHelper*> m2 = Field(&FieldHelper::field_, Eq(0));\n  EXPECT_TRUE(m2.Matches(&helper));\n}\n\n// Tests the linkage of the Property matcher.\nTEST(LinkTest, TestMatcherProperty) {\n  FieldHelper helper(0);\n\n  Matcher<const FieldHelper&> m = Property(&FieldHelper::field, Eq(0));\n  EXPECT_TRUE(m.Matches(helper));\n\n  Matcher<const FieldHelper*> m2 = Property(&FieldHelper::field, Eq(0));\n  EXPECT_TRUE(m2.Matches(&helper));\n}\n\n// Tests the linkage of the ResultOf matcher.\nTEST(LinkTest, TestMatcherResultOf) {\n  Matcher<char*> m = ResultOf(&InvokeHelper::StaticIntFromString, Eq(1));\n  EXPECT_TRUE(m.Matches(NULL));\n}\n\n// Tests the linkage of the ResultOf matcher.\nTEST(LinkTest, TestMatcherPointee) {\n  int n = 1;\n\n  Matcher<int*> m = Pointee(Eq(1));\n  EXPECT_TRUE(m.Matches(&n));\n}\n\n// Tests the linkage of the Truly matcher.\nTEST(LinkTest, TestMatcherTruly) {\n  Matcher<const char*> m = Truly(&InvokeHelper::StaticBoolFromString);\n  EXPECT_TRUE(m.Matches(NULL));\n}\n\n// Tests the linkage of the AllOf matcher.\nTEST(LinkTest, TestMatcherAllOf) {\n  Matcher<int> m = AllOf(_, Eq(1));\n  EXPECT_TRUE(m.Matches(1));\n}\n\n// Tests the linkage of the AnyOf matcher.\nTEST(LinkTest, TestMatcherAnyOf) {\n  Matcher<int> m = AnyOf(_, Eq(1));\n  EXPECT_TRUE(m.Matches(1));\n}\n\n// Tests the linkage of the Not matcher.\nTEST(LinkTest, TestMatcherNot) {\n  Matcher<int> m = Not(_);\n  EXPECT_FALSE(m.Matches(1));\n}\n\n// Tests the linkage of the MatcherCast<T>() function.\nTEST(LinkTest, TestMatcherCast) {\n  Matcher<const char*> m = MatcherCast<const char*>(_);\n  EXPECT_TRUE(m.Matches(NULL));\n}\n\n#endif  // GMOCK_TEST_GMOCK_LINK_TEST_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock_output_test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nr\"\"\"Tests the text output of Google C++ Mocking Framework.\n\nTo update the golden file:\ngmock_output_test.py --build_dir=BUILD/DIR --gengolden\nwhere BUILD/DIR contains the built gmock_output_test_ file.\ngmock_output_test.py --gengolden\ngmock_output_test.py\n\n\"\"\"\n\nimport os\nimport re\nimport sys\nimport gmock_test_utils\n\n\n# The flag for generating the golden file\nGENGOLDEN_FLAG = '--gengolden'\n\nPROGRAM_PATH = gmock_test_utils.GetTestExecutablePath('gmock_output_test_')\nCOMMAND = [PROGRAM_PATH, '--gtest_stack_trace_depth=0', '--gtest_print_time=0']\nGOLDEN_NAME = 'gmock_output_test_golden.txt'\nGOLDEN_PATH = os.path.join(gmock_test_utils.GetSourceDir(), GOLDEN_NAME)\n\n\ndef ToUnixLineEnding(s):\n  \"\"\"Changes all Windows/Mac line endings in s to UNIX line endings.\"\"\"\n\n  return s.replace('\\r\\n', '\\n').replace('\\r', '\\n')\n\n\ndef RemoveReportHeaderAndFooter(output):\n  \"\"\"Removes Google Test result report's header and footer from the output.\"\"\"\n\n  output = re.sub(r'.*gtest_main.*\\n', '', output)\n  output = re.sub(r'\\[.*\\d+ tests.*\\n', '', output)\n  output = re.sub(r'\\[.* test environment .*\\n', '', output)\n  output = re.sub(r'\\[=+\\] \\d+ tests .* ran.*', '', output)\n  output = re.sub(r'.* FAILED TESTS\\n', '', output)\n  return output\n\n\ndef RemoveLocations(output):\n  \"\"\"Removes all file location info from a Google Test program's output.\n\n  Args:\n       output:  the output of a Google Test program.\n\n  Returns:\n       output with all file location info (in the form of\n       'DIRECTORY/FILE_NAME:LINE_NUMBER: 'or\n       'DIRECTORY\\\\FILE_NAME(LINE_NUMBER): ') replaced by\n       'FILE:#: '.\n  \"\"\"\n\n  return re.sub(r'.*[/\\\\](.+)(\\:\\d+|\\(\\d+\\))\\:', 'FILE:#:', output)\n\n\ndef NormalizeErrorMarker(output):\n  \"\"\"Normalizes the error marker, which is different on Windows vs on Linux.\"\"\"\n\n  return re.sub(r' error: ', ' Failure\\n', output)\n\n\ndef RemoveMemoryAddresses(output):\n  \"\"\"Removes memory addresses from the test output.\"\"\"\n\n  return re.sub(r'@\\w+', '@0x#', output)\n\n\ndef RemoveTestNamesOfLeakedMocks(output):\n  \"\"\"Removes the test names of leaked mock objects from the test output.\"\"\"\n\n  return re.sub(r'\\(used in test .+\\) ', '', output)\n\n\ndef GetLeakyTests(output):\n  \"\"\"Returns a list of test names that leak mock objects.\"\"\"\n\n  # findall() returns a list of all matches of the regex in output.\n  # For example, if '(used in test FooTest.Bar)' is in output, the\n  # list will contain 'FooTest.Bar'.\n  return re.findall(r'\\(used in test (.+)\\)', output)\n\n\ndef GetNormalizedOutputAndLeakyTests(output):\n  \"\"\"Normalizes the output of gmock_output_test_.\n\n  Args:\n    output: The test output.\n\n  Returns:\n    A tuple (the normalized test output, the list of test names that have\n    leaked mocks).\n  \"\"\"\n\n  output = ToUnixLineEnding(output)\n  output = RemoveReportHeaderAndFooter(output)\n  output = NormalizeErrorMarker(output)\n  output = RemoveLocations(output)\n  output = RemoveMemoryAddresses(output)\n  return (RemoveTestNamesOfLeakedMocks(output), GetLeakyTests(output))\n\n\ndef GetShellCommandOutput(cmd):\n  \"\"\"Runs a command in a sub-process, and returns its STDOUT in a string.\"\"\"\n\n  return gmock_test_utils.Subprocess(cmd, capture_stderr=False).output\n\n\ndef GetNormalizedCommandOutputAndLeakyTests(cmd):\n  \"\"\"Runs a command and returns its normalized output and a list of leaky tests.\n\n  Args:\n    cmd:  the shell command.\n  \"\"\"\n\n  # Disables exception pop-ups on Windows.\n  os.environ['GTEST_CATCH_EXCEPTIONS'] = '1'\n  return GetNormalizedOutputAndLeakyTests(GetShellCommandOutput(cmd))\n\n\nclass GMockOutputTest(gmock_test_utils.TestCase):\n  def testOutput(self):\n    (output, leaky_tests) = GetNormalizedCommandOutputAndLeakyTests(COMMAND)\n    golden_file = open(GOLDEN_PATH, 'rb')\n    golden = golden_file.read()\n    golden_file.close()\n\n    # The normalized output should match the golden file.\n    self.assertEquals(golden, output)\n\n    # The raw output should contain 2 leaked mock object errors for\n    # test GMockOutputTest.CatchesLeakedMocks.\n    self.assertEquals(['GMockOutputTest.CatchesLeakedMocks',\n                       'GMockOutputTest.CatchesLeakedMocks'],\n                      leaky_tests)\n\n\nif __name__ == '__main__':\n  if sys.argv[1:] == [GENGOLDEN_FLAG]:\n    (output, _) = GetNormalizedCommandOutputAndLeakyTests(COMMAND)\n    golden_file = open(GOLDEN_PATH, 'wb')\n    golden_file.write(output)\n    golden_file.close()\n    # Suppress the error \"googletest was imported but a call to its main()\n    # was never detected.\"\n    os._exit(0)\n  else:\n    gmock_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock_output_test_.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Tests Google Mock's output in various scenarios.  This ensures that\n// Google Mock's messages are readable and useful.\n\n#include \"gmock/gmock.h\"\n\n#include <stdio.h>\n#include <string>\n\n#include \"gtest/gtest.h\"\n\n// Silence C4100 (unreferenced formal parameter)\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4100)\n#endif\n\nusing testing::_;\nusing testing::AnyNumber;\nusing testing::Ge;\nusing testing::InSequence;\nusing testing::NaggyMock;\nusing testing::Ref;\nusing testing::Return;\nusing testing::Sequence;\nusing testing::Value;\n\nclass MockFoo {\n public:\n  MockFoo() {}\n\n  MOCK_METHOD3(Bar, char(const std::string& s, int i, double x));\n  MOCK_METHOD2(Bar2, bool(int x, int y));\n  MOCK_METHOD2(Bar3, void(int x, int y));\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo);\n};\n\nclass GMockOutputTest : public testing::Test {\n protected:\n  NaggyMock<MockFoo> foo_;\n};\n\nTEST_F(GMockOutputTest, ExpectedCall) {\n  testing::GMOCK_FLAG(verbose) = \"info\";\n\n  EXPECT_CALL(foo_, Bar2(0, _));\n  foo_.Bar2(0, 0);  // Expected call\n\n  testing::GMOCK_FLAG(verbose) = \"warning\";\n}\n\nTEST_F(GMockOutputTest, ExpectedCallToVoidFunction) {\n  testing::GMOCK_FLAG(verbose) = \"info\";\n\n  EXPECT_CALL(foo_, Bar3(0, _));\n  foo_.Bar3(0, 0);  // Expected call\n\n  testing::GMOCK_FLAG(verbose) = \"warning\";\n}\n\nTEST_F(GMockOutputTest, ExplicitActionsRunOut) {\n  EXPECT_CALL(foo_, Bar2(_, _))\n      .Times(2)\n      .WillOnce(Return(false));\n  foo_.Bar2(2, 2);\n  foo_.Bar2(1, 1);  // Explicit actions in EXPECT_CALL run out.\n}\n\nTEST_F(GMockOutputTest, UnexpectedCall) {\n  EXPECT_CALL(foo_, Bar2(0, _));\n\n  foo_.Bar2(1, 0);  // Unexpected call\n  foo_.Bar2(0, 0);  // Expected call\n}\n\nTEST_F(GMockOutputTest, UnexpectedCallToVoidFunction) {\n  EXPECT_CALL(foo_, Bar3(0, _));\n\n  foo_.Bar3(1, 0);  // Unexpected call\n  foo_.Bar3(0, 0);  // Expected call\n}\n\nTEST_F(GMockOutputTest, ExcessiveCall) {\n  EXPECT_CALL(foo_, Bar2(0, _));\n\n  foo_.Bar2(0, 0);  // Expected call\n  foo_.Bar2(0, 1);  // Excessive call\n}\n\nTEST_F(GMockOutputTest, ExcessiveCallToVoidFunction) {\n  EXPECT_CALL(foo_, Bar3(0, _));\n\n  foo_.Bar3(0, 0);  // Expected call\n  foo_.Bar3(0, 1);  // Excessive call\n}\n\nTEST_F(GMockOutputTest, UninterestingCall) {\n  foo_.Bar2(0, 1);  // Uninteresting call\n}\n\nTEST_F(GMockOutputTest, UninterestingCallToVoidFunction) {\n  foo_.Bar3(0, 1);  // Uninteresting call\n}\n\nTEST_F(GMockOutputTest, RetiredExpectation) {\n  EXPECT_CALL(foo_, Bar2(_, _))\n      .RetiresOnSaturation();\n  EXPECT_CALL(foo_, Bar2(0, 0));\n\n  foo_.Bar2(1, 1);\n  foo_.Bar2(1, 1);  // Matches a retired expectation\n  foo_.Bar2(0, 0);\n}\n\nTEST_F(GMockOutputTest, UnsatisfiedPrerequisite) {\n  {\n    InSequence s;\n    EXPECT_CALL(foo_, Bar(_, 0, _));\n    EXPECT_CALL(foo_, Bar2(0, 0));\n    EXPECT_CALL(foo_, Bar2(1, _));\n  }\n\n  foo_.Bar2(1, 0);  // Has one immediate unsatisfied pre-requisite\n  foo_.Bar(\"Hi\", 0, 0);\n  foo_.Bar2(0, 0);\n  foo_.Bar2(1, 0);\n}\n\nTEST_F(GMockOutputTest, UnsatisfiedPrerequisites) {\n  Sequence s1, s2;\n\n  EXPECT_CALL(foo_, Bar(_, 0, _))\n      .InSequence(s1);\n  EXPECT_CALL(foo_, Bar2(0, 0))\n      .InSequence(s2);\n  EXPECT_CALL(foo_, Bar2(1, _))\n      .InSequence(s1, s2);\n\n  foo_.Bar2(1, 0);  // Has two immediate unsatisfied pre-requisites\n  foo_.Bar(\"Hi\", 0, 0);\n  foo_.Bar2(0, 0);\n  foo_.Bar2(1, 0);\n}\n\nTEST_F(GMockOutputTest, UnsatisfiedWith) {\n  EXPECT_CALL(foo_, Bar2(_, _)).With(Ge());\n}\n\nTEST_F(GMockOutputTest, UnsatisfiedExpectation) {\n  EXPECT_CALL(foo_, Bar(_, _, _));\n  EXPECT_CALL(foo_, Bar2(0, _))\n      .Times(2);\n\n  foo_.Bar2(0, 1);\n}\n\nTEST_F(GMockOutputTest, MismatchArguments) {\n  const std::string s = \"Hi\";\n  EXPECT_CALL(foo_, Bar(Ref(s), _, Ge(0)));\n\n  foo_.Bar(\"Ho\", 0, -0.1);  // Mismatch arguments\n  foo_.Bar(s, 0, 0);\n}\n\nTEST_F(GMockOutputTest, MismatchWith) {\n  EXPECT_CALL(foo_, Bar2(Ge(2), Ge(1)))\n      .With(Ge());\n\n  foo_.Bar2(2, 3);  // Mismatch With()\n  foo_.Bar2(2, 1);\n}\n\nTEST_F(GMockOutputTest, MismatchArgumentsAndWith) {\n  EXPECT_CALL(foo_, Bar2(Ge(2), Ge(1)))\n      .With(Ge());\n\n  foo_.Bar2(1, 3);  // Mismatch arguments and mismatch With()\n  foo_.Bar2(2, 1);\n}\n\nTEST_F(GMockOutputTest, UnexpectedCallWithDefaultAction) {\n  ON_CALL(foo_, Bar2(_, _))\n      .WillByDefault(Return(true));   // Default action #1\n  ON_CALL(foo_, Bar2(1, _))\n      .WillByDefault(Return(false));  // Default action #2\n\n  EXPECT_CALL(foo_, Bar2(2, 2));\n  foo_.Bar2(1, 0);  // Unexpected call, takes default action #2.\n  foo_.Bar2(0, 0);  // Unexpected call, takes default action #1.\n  foo_.Bar2(2, 2);  // Expected call.\n}\n\nTEST_F(GMockOutputTest, ExcessiveCallWithDefaultAction) {\n  ON_CALL(foo_, Bar2(_, _))\n      .WillByDefault(Return(true));   // Default action #1\n  ON_CALL(foo_, Bar2(1, _))\n      .WillByDefault(Return(false));  // Default action #2\n\n  EXPECT_CALL(foo_, Bar2(2, 2));\n  EXPECT_CALL(foo_, Bar2(1, 1));\n\n  foo_.Bar2(2, 2);  // Expected call.\n  foo_.Bar2(2, 2);  // Excessive call, takes default action #1.\n  foo_.Bar2(1, 1);  // Expected call.\n  foo_.Bar2(1, 1);  // Excessive call, takes default action #2.\n}\n\nTEST_F(GMockOutputTest, UninterestingCallWithDefaultAction) {\n  ON_CALL(foo_, Bar2(_, _))\n      .WillByDefault(Return(true));   // Default action #1\n  ON_CALL(foo_, Bar2(1, _))\n      .WillByDefault(Return(false));  // Default action #2\n\n  foo_.Bar2(2, 2);  // Uninteresting call, takes default action #1.\n  foo_.Bar2(1, 1);  // Uninteresting call, takes default action #2.\n}\n\nTEST_F(GMockOutputTest, ExplicitActionsRunOutWithDefaultAction) {\n  ON_CALL(foo_, Bar2(_, _))\n      .WillByDefault(Return(true));   // Default action #1\n\n  EXPECT_CALL(foo_, Bar2(_, _))\n      .Times(2)\n      .WillOnce(Return(false));\n  foo_.Bar2(2, 2);\n  foo_.Bar2(1, 1);  // Explicit actions in EXPECT_CALL run out.\n}\n\nTEST_F(GMockOutputTest, CatchesLeakedMocks) {\n  MockFoo* foo1 = new MockFoo;\n  MockFoo* foo2 = new MockFoo;\n\n  // Invokes ON_CALL on foo1.\n  ON_CALL(*foo1, Bar(_, _, _)).WillByDefault(Return('a'));\n\n  // Invokes EXPECT_CALL on foo2.\n  EXPECT_CALL(*foo2, Bar2(_, _));\n  EXPECT_CALL(*foo2, Bar2(1, _));\n  EXPECT_CALL(*foo2, Bar3(_, _)).Times(AnyNumber());\n  foo2->Bar2(2, 1);\n  foo2->Bar2(1, 1);\n\n  // Both foo1 and foo2 are deliberately leaked.\n}\n\nMATCHER_P2(IsPair, first, second, \"\") {\n  return Value(arg.first, first) && Value(arg.second, second);\n}\n\nTEST_F(GMockOutputTest, PrintsMatcher) {\n  const testing::Matcher<int> m1 = Ge(48);\n  EXPECT_THAT((std::pair<int, bool>(42, true)), IsPair(m1, true));\n}\n\nvoid TestCatchesLeakedMocksInAdHocTests() {\n  MockFoo* foo = new MockFoo;\n\n  // Invokes EXPECT_CALL on foo.\n  EXPECT_CALL(*foo, Bar2(_, _));\n  foo->Bar2(2, 1);\n\n  // foo is deliberately leaked.\n}\n\nint main(int argc, char **argv) {\n  testing::InitGoogleMock(&argc, argv);\n  // Ensures that the tests pass no matter what value of\n  // --gmock_catch_leaked_mocks and --gmock_verbose the user specifies.\n  testing::GMOCK_FLAG(catch_leaked_mocks) = true;\n  testing::GMOCK_FLAG(verbose) = \"warning\";\n\n  TestCatchesLeakedMocksInAdHocTests();\n  return RUN_ALL_TESTS();\n}\n\n#ifdef _MSC_VER\n# pragma warning(pop)\n#endif\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock_output_test_golden.txt",
    "content": "[ RUN      ] GMockOutputTest.ExpectedCall\n\nFILE:#: EXPECT_CALL(foo_, Bar2(0, _)) invoked\nStack trace:\n\nFILE:#: Mock function call matches EXPECT_CALL(foo_, Bar2(0, _))...\n    Function call: Bar2(0, 0)\n          Returns: false\nStack trace:\n[       OK ] GMockOutputTest.ExpectedCall\n[ RUN      ] GMockOutputTest.ExpectedCallToVoidFunction\n\nFILE:#: EXPECT_CALL(foo_, Bar3(0, _)) invoked\nStack trace:\n\nFILE:#: Mock function call matches EXPECT_CALL(foo_, Bar3(0, _))...\n    Function call: Bar3(0, 0)\nStack trace:\n[       OK ] GMockOutputTest.ExpectedCallToVoidFunction\n[ RUN      ] GMockOutputTest.ExplicitActionsRunOut\n\nGMOCK WARNING:\nFILE:#: Too few actions specified in EXPECT_CALL(foo_, Bar2(_, _))...\nExpected to be called twice, but has only 1 WillOnce().\nGMOCK WARNING:\nFILE:#: Actions ran out in EXPECT_CALL(foo_, Bar2(_, _))...\nCalled 2 times, but only 1 WillOnce() is specified - returning default value.\nStack trace:\n[       OK ] GMockOutputTest.ExplicitActionsRunOut\n[ RUN      ] GMockOutputTest.UnexpectedCall\nunknown file: Failure\n\nUnexpected mock function call - returning default value.\n    Function call: Bar2(1, 0)\n          Returns: false\nGoogle Mock tried the following 1 expectation, but it didn't match:\n\nFILE:#: EXPECT_CALL(foo_, Bar2(0, _))...\n  Expected arg #0: is equal to 0\n           Actual: 1\n         Expected: to be called once\n           Actual: never called - unsatisfied and active\n[  FAILED  ] GMockOutputTest.UnexpectedCall\n[ RUN      ] GMockOutputTest.UnexpectedCallToVoidFunction\nunknown file: Failure\n\nUnexpected mock function call - returning directly.\n    Function call: Bar3(1, 0)\nGoogle Mock tried the following 1 expectation, but it didn't match:\n\nFILE:#: EXPECT_CALL(foo_, Bar3(0, _))...\n  Expected arg #0: is equal to 0\n           Actual: 1\n         Expected: to be called once\n           Actual: never called - unsatisfied and active\n[  FAILED  ] GMockOutputTest.UnexpectedCallToVoidFunction\n[ RUN      ] GMockOutputTest.ExcessiveCall\nFILE:#: Failure\nMock function called more times than expected - returning default value.\n    Function call: Bar2(0, 1)\n          Returns: false\n         Expected: to be called once\n           Actual: called twice - over-saturated and active\n[  FAILED  ] GMockOutputTest.ExcessiveCall\n[ RUN      ] GMockOutputTest.ExcessiveCallToVoidFunction\nFILE:#: Failure\nMock function called more times than expected - returning directly.\n    Function call: Bar3(0, 1)\n         Expected: to be called once\n           Actual: called twice - over-saturated and active\n[  FAILED  ] GMockOutputTest.ExcessiveCallToVoidFunction\n[ RUN      ] GMockOutputTest.UninterestingCall\n\nGMOCK WARNING:\nUninteresting mock function call - returning default value.\n    Function call: Bar2(0, 1)\n          Returns: false\nNOTE: You can safely ignore the above warning unless this call should not happen.  Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call.  See https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#knowing-when-to-expect for details.\n[       OK ] GMockOutputTest.UninterestingCall\n[ RUN      ] GMockOutputTest.UninterestingCallToVoidFunction\n\nGMOCK WARNING:\nUninteresting mock function call - returning directly.\n    Function call: Bar3(0, 1)\nNOTE: You can safely ignore the above warning unless this call should not happen.  Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call.  See https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#knowing-when-to-expect for details.\n[       OK ] GMockOutputTest.UninterestingCallToVoidFunction\n[ RUN      ] GMockOutputTest.RetiredExpectation\nunknown file: Failure\n\nUnexpected mock function call - returning default value.\n    Function call: Bar2(1, 1)\n          Returns: false\nGoogle Mock tried the following 2 expectations, but none matched:\n\nFILE:#: tried expectation #0: EXPECT_CALL(foo_, Bar2(_, _))...\n         Expected: the expectation is active\n           Actual: it is retired\n         Expected: to be called once\n           Actual: called once - saturated and retired\nFILE:#: tried expectation #1: EXPECT_CALL(foo_, Bar2(0, 0))...\n  Expected arg #0: is equal to 0\n           Actual: 1\n  Expected arg #1: is equal to 0\n           Actual: 1\n         Expected: to be called once\n           Actual: never called - unsatisfied and active\n[  FAILED  ] GMockOutputTest.RetiredExpectation\n[ RUN      ] GMockOutputTest.UnsatisfiedPrerequisite\nunknown file: Failure\n\nUnexpected mock function call - returning default value.\n    Function call: Bar2(1, 0)\n          Returns: false\nGoogle Mock tried the following 2 expectations, but none matched:\n\nFILE:#: tried expectation #0: EXPECT_CALL(foo_, Bar2(0, 0))...\n  Expected arg #0: is equal to 0\n           Actual: 1\n         Expected: to be called once\n           Actual: never called - unsatisfied and active\nFILE:#: tried expectation #1: EXPECT_CALL(foo_, Bar2(1, _))...\n         Expected: all pre-requisites are satisfied\n           Actual: the following immediate pre-requisites are not satisfied:\nFILE:#: pre-requisite #0\n                   (end of pre-requisites)\n         Expected: to be called once\n           Actual: never called - unsatisfied and active\n[  FAILED  ] GMockOutputTest.UnsatisfiedPrerequisite\n[ RUN      ] GMockOutputTest.UnsatisfiedPrerequisites\nunknown file: Failure\n\nUnexpected mock function call - returning default value.\n    Function call: Bar2(1, 0)\n          Returns: false\nGoogle Mock tried the following 2 expectations, but none matched:\n\nFILE:#: tried expectation #0: EXPECT_CALL(foo_, Bar2(0, 0))...\n  Expected arg #0: is equal to 0\n           Actual: 1\n         Expected: to be called once\n           Actual: never called - unsatisfied and active\nFILE:#: tried expectation #1: EXPECT_CALL(foo_, Bar2(1, _))...\n         Expected: all pre-requisites are satisfied\n           Actual: the following immediate pre-requisites are not satisfied:\nFILE:#: pre-requisite #0\nFILE:#: pre-requisite #1\n                   (end of pre-requisites)\n         Expected: to be called once\n           Actual: never called - unsatisfied and active\n[  FAILED  ] GMockOutputTest.UnsatisfiedPrerequisites\n[ RUN      ] GMockOutputTest.UnsatisfiedWith\nFILE:#: Failure\nActual function call count doesn't match EXPECT_CALL(foo_, Bar2(_, _))...\n    Expected args: are a pair where the first >= the second\n         Expected: to be called once\n           Actual: never called - unsatisfied and active\n[  FAILED  ] GMockOutputTest.UnsatisfiedWith\n[ RUN      ] GMockOutputTest.UnsatisfiedExpectation\nFILE:#: Failure\nActual function call count doesn't match EXPECT_CALL(foo_, Bar2(0, _))...\n         Expected: to be called twice\n           Actual: called once - unsatisfied and active\nFILE:#: Failure\nActual function call count doesn't match EXPECT_CALL(foo_, Bar(_, _, _))...\n         Expected: to be called once\n           Actual: never called - unsatisfied and active\n[  FAILED  ] GMockOutputTest.UnsatisfiedExpectation\n[ RUN      ] GMockOutputTest.MismatchArguments\nunknown file: Failure\n\nUnexpected mock function call - returning default value.\n    Function call: Bar(@0x# \"Ho\", 0, -0.1)\n          Returns: '\\0'\nGoogle Mock tried the following 1 expectation, but it didn't match:\n\nFILE:#: EXPECT_CALL(foo_, Bar(Ref(s), _, Ge(0)))...\n  Expected arg #0: references the variable @0x# \"Hi\"\n           Actual: \"Ho\", which is located @0x#\n  Expected arg #2: is >= 0\n           Actual: -0.1\n         Expected: to be called once\n           Actual: never called - unsatisfied and active\n[  FAILED  ] GMockOutputTest.MismatchArguments\n[ RUN      ] GMockOutputTest.MismatchWith\nunknown file: Failure\n\nUnexpected mock function call - returning default value.\n    Function call: Bar2(2, 3)\n          Returns: false\nGoogle Mock tried the following 1 expectation, but it didn't match:\n\nFILE:#: EXPECT_CALL(foo_, Bar2(Ge(2), Ge(1)))...\n    Expected args: are a pair where the first >= the second\n           Actual: don't match\n         Expected: to be called once\n           Actual: never called - unsatisfied and active\n[  FAILED  ] GMockOutputTest.MismatchWith\n[ RUN      ] GMockOutputTest.MismatchArgumentsAndWith\nunknown file: Failure\n\nUnexpected mock function call - returning default value.\n    Function call: Bar2(1, 3)\n          Returns: false\nGoogle Mock tried the following 1 expectation, but it didn't match:\n\nFILE:#: EXPECT_CALL(foo_, Bar2(Ge(2), Ge(1)))...\n  Expected arg #0: is >= 2\n           Actual: 1\n    Expected args: are a pair where the first >= the second\n           Actual: don't match\n         Expected: to be called once\n           Actual: never called - unsatisfied and active\n[  FAILED  ] GMockOutputTest.MismatchArgumentsAndWith\n[ RUN      ] GMockOutputTest.UnexpectedCallWithDefaultAction\nunknown file: Failure\n\nUnexpected mock function call - taking default action specified at:\nFILE:#:\n    Function call: Bar2(1, 0)\n          Returns: false\nGoogle Mock tried the following 1 expectation, but it didn't match:\n\nFILE:#: EXPECT_CALL(foo_, Bar2(2, 2))...\n  Expected arg #0: is equal to 2\n           Actual: 1\n  Expected arg #1: is equal to 2\n           Actual: 0\n         Expected: to be called once\n           Actual: never called - unsatisfied and active\nunknown file: Failure\n\nUnexpected mock function call - taking default action specified at:\nFILE:#:\n    Function call: Bar2(0, 0)\n          Returns: true\nGoogle Mock tried the following 1 expectation, but it didn't match:\n\nFILE:#: EXPECT_CALL(foo_, Bar2(2, 2))...\n  Expected arg #0: is equal to 2\n           Actual: 0\n  Expected arg #1: is equal to 2\n           Actual: 0\n         Expected: to be called once\n           Actual: never called - unsatisfied and active\n[  FAILED  ] GMockOutputTest.UnexpectedCallWithDefaultAction\n[ RUN      ] GMockOutputTest.ExcessiveCallWithDefaultAction\nFILE:#: Failure\nMock function called more times than expected - taking default action specified at:\nFILE:#:\n    Function call: Bar2(2, 2)\n          Returns: true\n         Expected: to be called once\n           Actual: called twice - over-saturated and active\nFILE:#: Failure\nMock function called more times than expected - taking default action specified at:\nFILE:#:\n    Function call: Bar2(1, 1)\n          Returns: false\n         Expected: to be called once\n           Actual: called twice - over-saturated and active\n[  FAILED  ] GMockOutputTest.ExcessiveCallWithDefaultAction\n[ RUN      ] GMockOutputTest.UninterestingCallWithDefaultAction\n\nGMOCK WARNING:\nUninteresting mock function call - taking default action specified at:\nFILE:#:\n    Function call: Bar2(2, 2)\n          Returns: true\nNOTE: You can safely ignore the above warning unless this call should not happen.  Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call.  See https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#knowing-when-to-expect for details.\n\nGMOCK WARNING:\nUninteresting mock function call - taking default action specified at:\nFILE:#:\n    Function call: Bar2(1, 1)\n          Returns: false\nNOTE: You can safely ignore the above warning unless this call should not happen.  Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call.  See https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#knowing-when-to-expect for details.\n[       OK ] GMockOutputTest.UninterestingCallWithDefaultAction\n[ RUN      ] GMockOutputTest.ExplicitActionsRunOutWithDefaultAction\n\nGMOCK WARNING:\nFILE:#: Too few actions specified in EXPECT_CALL(foo_, Bar2(_, _))...\nExpected to be called twice, but has only 1 WillOnce().\nGMOCK WARNING:\nFILE:#: Actions ran out in EXPECT_CALL(foo_, Bar2(_, _))...\nCalled 2 times, but only 1 WillOnce() is specified - taking default action specified at:\nFILE:#:\nStack trace:\n[       OK ] GMockOutputTest.ExplicitActionsRunOutWithDefaultAction\n[ RUN      ] GMockOutputTest.CatchesLeakedMocks\n[       OK ] GMockOutputTest.CatchesLeakedMocks\n[ RUN      ] GMockOutputTest.PrintsMatcher\nFILE:#: Failure\nValue of: (std::pair<int, bool>(42, true))\nExpected: is pair (is >= 48, true)\n  Actual: (42, true) (of type std::pair<int, bool>)\n[  FAILED  ] GMockOutputTest.PrintsMatcher\n[  FAILED  ] GMockOutputTest.UnexpectedCall\n[  FAILED  ] GMockOutputTest.UnexpectedCallToVoidFunction\n[  FAILED  ] GMockOutputTest.ExcessiveCall\n[  FAILED  ] GMockOutputTest.ExcessiveCallToVoidFunction\n[  FAILED  ] GMockOutputTest.RetiredExpectation\n[  FAILED  ] GMockOutputTest.UnsatisfiedPrerequisite\n[  FAILED  ] GMockOutputTest.UnsatisfiedPrerequisites\n[  FAILED  ] GMockOutputTest.UnsatisfiedWith\n[  FAILED  ] GMockOutputTest.UnsatisfiedExpectation\n[  FAILED  ] GMockOutputTest.MismatchArguments\n[  FAILED  ] GMockOutputTest.MismatchWith\n[  FAILED  ] GMockOutputTest.MismatchArgumentsAndWith\n[  FAILED  ] GMockOutputTest.UnexpectedCallWithDefaultAction\n[  FAILED  ] GMockOutputTest.ExcessiveCallWithDefaultAction\n[  FAILED  ] GMockOutputTest.PrintsMatcher\n\n\nFILE:#: ERROR: this mock object should be deleted but never is. Its address is @0x#.\nFILE:#: ERROR: this mock object should be deleted but never is. Its address is @0x#.\nFILE:#: ERROR: this mock object should be deleted but never is. Its address is @0x#.\nERROR: 3 leaked mock objects found at program exit. Expectations on a mock object is verified when the object is destructed. Leaking a mock means that its expectations aren't verified, which is usually a test bug. If you really intend to leak a mock, you can suppress this error using testing::Mock::AllowLeak(mock_object), or you may use a fake or stub instead of a mock.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock_stress_test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Tests that Google Mock constructs can be used in a large number of\n// threads concurrently.\n\n#include \"gmock/gmock.h\"\n#include \"gtest/gtest.h\"\n\nnamespace testing {\nnamespace {\n\n// From gtest-port.h.\nusing ::testing::internal::ThreadWithParam;\n\n// The maximum number of test threads (not including helper threads)\n// to create.\nconst int kMaxTestThreads = 50;\n\n// How many times to repeat a task in a test thread.\nconst int kRepeat = 50;\n\nclass MockFoo {\n public:\n  MOCK_METHOD1(Bar, int(int n));  // NOLINT\n  MOCK_METHOD2(Baz, char(const char* s1, const std::string& s2));  // NOLINT\n};\n\n// Helper for waiting for the given thread to finish and then deleting it.\ntemplate <typename T>\nvoid JoinAndDelete(ThreadWithParam<T>* t) {\n  t->Join();\n  delete t;\n}\n\nusing internal::linked_ptr;\n\n// Helper classes for testing using linked_ptr concurrently.\n\nclass Base {\n public:\n  explicit Base(int a_x) : x_(a_x) {}\n  virtual ~Base() {}\n  int x() const { return x_; }\n private:\n  int x_;\n};\n\nclass Derived1 : public Base {\n public:\n  Derived1(int a_x, int a_y) : Base(a_x), y_(a_y) {}\n  int y() const { return y_; }\n private:\n  int y_;\n};\n\nclass Derived2 : public Base {\n public:\n  Derived2(int a_x, int a_z) : Base(a_x), z_(a_z) {}\n  int z() const { return z_; }\n private:\n  int z_;\n};\n\nlinked_ptr<Derived1> pointer1(new Derived1(1, 2));\nlinked_ptr<Derived2> pointer2(new Derived2(3, 4));\n\nstruct Dummy {};\n\n// Tests that we can copy from a linked_ptr and read it concurrently.\nvoid TestConcurrentCopyAndReadLinkedPtr(Dummy /* dummy */) {\n  // Reads pointer1 and pointer2 while they are being copied from in\n  // another thread.\n  EXPECT_EQ(1, pointer1->x());\n  EXPECT_EQ(2, pointer1->y());\n  EXPECT_EQ(3, pointer2->x());\n  EXPECT_EQ(4, pointer2->z());\n\n  // Copies from pointer1.\n  linked_ptr<Derived1> p1(pointer1);\n  EXPECT_EQ(1, p1->x());\n  EXPECT_EQ(2, p1->y());\n\n  // Assigns from pointer2 where the LHS was empty.\n  linked_ptr<Base> p2;\n  p2 = pointer1;\n  EXPECT_EQ(1, p2->x());\n\n  // Assigns from pointer2 where the LHS was not empty.\n  p2 = pointer2;\n  EXPECT_EQ(3, p2->x());\n}\n\nconst linked_ptr<Derived1> p0(new Derived1(1, 2));\n\n// Tests that we can concurrently modify two linked_ptrs that point to\n// the same object.\nvoid TestConcurrentWriteToEqualLinkedPtr(Dummy /* dummy */) {\n  // p1 and p2 point to the same, shared thing.  One thread resets p1.\n  // Another thread assigns to p2.  This will cause the same\n  // underlying \"ring\" to be updated concurrently.\n  linked_ptr<Derived1> p1(p0);\n  linked_ptr<Derived1> p2(p0);\n\n  EXPECT_EQ(1, p1->x());\n  EXPECT_EQ(2, p1->y());\n\n  EXPECT_EQ(1, p2->x());\n  EXPECT_EQ(2, p2->y());\n\n  p1.reset();\n  p2 = p0;\n\n  EXPECT_EQ(1, p2->x());\n  EXPECT_EQ(2, p2->y());\n}\n\n// Tests that different mock objects can be used in their respective\n// threads.  This should generate no Google Test failure.\nvoid TestConcurrentMockObjects(Dummy /* dummy */) {\n  // Creates a mock and does some typical operations on it.\n  MockFoo foo;\n  ON_CALL(foo, Bar(_))\n      .WillByDefault(Return(1));\n  ON_CALL(foo, Baz(_, _))\n      .WillByDefault(Return('b'));\n  ON_CALL(foo, Baz(_, \"you\"))\n      .WillByDefault(Return('a'));\n\n  EXPECT_CALL(foo, Bar(0))\n      .Times(AtMost(3));\n  EXPECT_CALL(foo, Baz(_, _));\n  EXPECT_CALL(foo, Baz(\"hi\", \"you\"))\n      .WillOnce(Return('z'))\n      .WillRepeatedly(DoDefault());\n\n  EXPECT_EQ(1, foo.Bar(0));\n  EXPECT_EQ(1, foo.Bar(0));\n  EXPECT_EQ('z', foo.Baz(\"hi\", \"you\"));\n  EXPECT_EQ('a', foo.Baz(\"hi\", \"you\"));\n  EXPECT_EQ('b', foo.Baz(\"hi\", \"me\"));\n}\n\n// Tests invoking methods of the same mock object in multiple threads.\n\nstruct Helper1Param {\n  MockFoo* mock_foo;\n  int* count;\n};\n\nvoid Helper1(Helper1Param param) {\n  for (int i = 0; i < kRepeat; i++) {\n    const char ch = param.mock_foo->Baz(\"a\", \"b\");\n    if (ch == 'a') {\n      // It was an expected call.\n      (*param.count)++;\n    } else {\n      // It was an excessive call.\n      EXPECT_EQ('\\0', ch);\n    }\n\n    // An unexpected call.\n    EXPECT_EQ('\\0', param.mock_foo->Baz(\"x\", \"y\")) << \"Expected failure.\";\n\n    // An uninteresting call.\n    EXPECT_EQ(1, param.mock_foo->Bar(5));\n  }\n}\n\n// This should generate 3*kRepeat + 1 failures in total.\nvoid TestConcurrentCallsOnSameObject(Dummy /* dummy */) {\n  MockFoo foo;\n\n  ON_CALL(foo, Bar(_))\n      .WillByDefault(Return(1));\n  EXPECT_CALL(foo, Baz(_, \"b\"))\n      .Times(kRepeat)\n      .WillRepeatedly(Return('a'));\n  EXPECT_CALL(foo, Baz(_, \"c\"));  // Expected to be unsatisfied.\n\n  // This chunk of code should generate kRepeat failures about\n  // excessive calls, and 2*kRepeat failures about unexpected calls.\n  int count1 = 0;\n  const Helper1Param param = { &foo, &count1 };\n  ThreadWithParam<Helper1Param>* const t =\n      new ThreadWithParam<Helper1Param>(Helper1, param, NULL);\n\n  int count2 = 0;\n  const Helper1Param param2 = { &foo, &count2 };\n  Helper1(param2);\n  JoinAndDelete(t);\n\n  EXPECT_EQ(kRepeat, count1 + count2);\n\n  // foo's destructor should generate one failure about unsatisfied\n  // expectation.\n}\n\n// Tests using the same mock object in multiple threads when the\n// expectations are partially ordered.\n\nvoid Helper2(MockFoo* foo) {\n  for (int i = 0; i < kRepeat; i++) {\n    foo->Bar(2);\n    foo->Bar(3);\n  }\n}\n\n// This should generate no Google Test failures.\nvoid TestPartiallyOrderedExpectationsWithThreads(Dummy /* dummy */) {\n  MockFoo foo;\n  Sequence s1, s2;\n\n  {\n    InSequence dummy;\n    EXPECT_CALL(foo, Bar(0));\n    EXPECT_CALL(foo, Bar(1))\n        .InSequence(s1, s2);\n  }\n\n  EXPECT_CALL(foo, Bar(2))\n      .Times(2*kRepeat)\n      .InSequence(s1)\n      .RetiresOnSaturation();\n  EXPECT_CALL(foo, Bar(3))\n      .Times(2*kRepeat)\n      .InSequence(s2);\n\n  {\n    InSequence dummy;\n    EXPECT_CALL(foo, Bar(2))\n        .InSequence(s1, s2);\n    EXPECT_CALL(foo, Bar(4));\n  }\n\n  foo.Bar(0);\n  foo.Bar(1);\n\n  ThreadWithParam<MockFoo*>* const t =\n      new ThreadWithParam<MockFoo*>(Helper2, &foo, NULL);\n  Helper2(&foo);\n  JoinAndDelete(t);\n\n  foo.Bar(2);\n  foo.Bar(4);\n}\n\n// Tests using Google Mock constructs in many threads concurrently.\nTEST(StressTest, CanUseGMockWithThreads) {\n  void (*test_routines[])(Dummy dummy) = {\n    &TestConcurrentCopyAndReadLinkedPtr,\n    &TestConcurrentWriteToEqualLinkedPtr,\n    &TestConcurrentMockObjects,\n    &TestConcurrentCallsOnSameObject,\n    &TestPartiallyOrderedExpectationsWithThreads,\n  };\n\n  const int kRoutines = sizeof(test_routines)/sizeof(test_routines[0]);\n  const int kCopiesOfEachRoutine = kMaxTestThreads / kRoutines;\n  const int kTestThreads = kCopiesOfEachRoutine * kRoutines;\n  ThreadWithParam<Dummy>* threads[kTestThreads] = {};\n  for (int i = 0; i < kTestThreads; i++) {\n    // Creates a thread to run the test function.\n    threads[i] =\n        new ThreadWithParam<Dummy>(test_routines[i % kRoutines], Dummy(), NULL);\n    GTEST_LOG_(INFO) << \"Thread #\" << i << \" running . . .\";\n  }\n\n  // At this point, we have many threads running.\n  for (int i = 0; i < kTestThreads; i++) {\n    JoinAndDelete(threads[i]);\n  }\n\n  // Ensures that the correct number of failures have been reported.\n  const TestInfo* const info = UnitTest::GetInstance()->current_test_info();\n  const TestResult& result = *info->result();\n  const int kExpectedFailures = (3*kRepeat + 1)*kCopiesOfEachRoutine;\n  GTEST_CHECK_(kExpectedFailures == result.total_part_count())\n      << \"Expected \" << kExpectedFailures << \" failures, but got \"\n      << result.total_part_count();\n}\n\n}  // namespace\n}  // namespace testing\n\nint main(int argc, char **argv) {\n  testing::InitGoogleMock(&argc, argv);\n\n  const int exit_code = RUN_ALL_TESTS();  // Expected to fail.\n  GTEST_CHECK_(exit_code != 0) << \"RUN_ALL_TESTS() did not fail as expected\";\n\n  printf(\"\\nPASS\\n\");\n  return 0;\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Mock - a framework for writing C++ mock classes.\n//\n// This file tests code in gmock.cc.\n\n#include \"gmock/gmock.h\"\n\n#include <string>\n#include \"gtest/gtest.h\"\n#include \"gtest/internal/custom/gtest.h\"\n\n#if !defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n\nusing testing::GMOCK_FLAG(default_mock_behavior);\nusing testing::GMOCK_FLAG(verbose);\nusing testing::InitGoogleMock;\n\n// Verifies that calling InitGoogleMock() on argv results in new_argv,\n// and the gmock_verbose flag's value is set to expected_gmock_verbose.\ntemplate <typename Char, int M, int N>\nvoid TestInitGoogleMock(const Char* (&argv)[M], const Char* (&new_argv)[N],\n                        const ::std::string& expected_gmock_verbose) {\n  const ::std::string old_verbose = GMOCK_FLAG(verbose);\n\n  int argc = M - 1;\n  InitGoogleMock(&argc, const_cast<Char**>(argv));\n  ASSERT_EQ(N - 1, argc) << \"The new argv has wrong number of elements.\";\n\n  for (int i = 0; i < N; i++) {\n    EXPECT_STREQ(new_argv[i], argv[i]);\n  }\n\n  EXPECT_EQ(expected_gmock_verbose, GMOCK_FLAG(verbose).c_str());\n  GMOCK_FLAG(verbose) = old_verbose;  // Restores the gmock_verbose flag.\n}\n\nTEST(InitGoogleMockTest, ParsesInvalidCommandLine) {\n  const char* argv[] = {\n    NULL\n  };\n\n  const char* new_argv[] = {\n    NULL\n  };\n\n  TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose));\n}\n\nTEST(InitGoogleMockTest, ParsesEmptyCommandLine) {\n  const char* argv[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  const char* new_argv[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose));\n}\n\nTEST(InitGoogleMockTest, ParsesSingleFlag) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gmock_verbose=info\",\n    NULL\n  };\n\n  const char* new_argv[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  TestInitGoogleMock(argv, new_argv, \"info\");\n}\n\nTEST(InitGoogleMockTest, ParsesMultipleFlags) {\n  int old_default_behavior = GMOCK_FLAG(default_mock_behavior);\n  const wchar_t* argv[] = {\n    L\"foo.exe\",\n    L\"--gmock_verbose=info\",\n    L\"--gmock_default_mock_behavior=2\",\n    NULL\n  };\n\n  const wchar_t* new_argv[] = {\n    L\"foo.exe\",\n    NULL\n  };\n\n  TestInitGoogleMock(argv, new_argv, \"info\");\n  EXPECT_EQ(2, GMOCK_FLAG(default_mock_behavior));\n  EXPECT_NE(2, old_default_behavior);\n  GMOCK_FLAG(default_mock_behavior) = old_default_behavior;\n}\n\nTEST(InitGoogleMockTest, ParsesUnrecognizedFlag) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--non_gmock_flag=blah\",\n    NULL\n  };\n\n  const char* new_argv[] = {\n    \"foo.exe\",\n    \"--non_gmock_flag=blah\",\n    NULL\n  };\n\n  TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose));\n}\n\nTEST(InitGoogleMockTest, ParsesGoogleMockFlagAndUnrecognizedFlag) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--non_gmock_flag=blah\",\n    \"--gmock_verbose=error\",\n    NULL\n  };\n\n  const char* new_argv[] = {\n    \"foo.exe\",\n    \"--non_gmock_flag=blah\",\n    NULL\n  };\n\n  TestInitGoogleMock(argv, new_argv, \"error\");\n}\n\nTEST(WideInitGoogleMockTest, ParsesInvalidCommandLine) {\n  const wchar_t* argv[] = {\n    NULL\n  };\n\n  const wchar_t* new_argv[] = {\n    NULL\n  };\n\n  TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose));\n}\n\nTEST(WideInitGoogleMockTest, ParsesEmptyCommandLine) {\n  const wchar_t* argv[] = {\n    L\"foo.exe\",\n    NULL\n  };\n\n  const wchar_t* new_argv[] = {\n    L\"foo.exe\",\n    NULL\n  };\n\n  TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose));\n}\n\nTEST(WideInitGoogleMockTest, ParsesSingleFlag) {\n  const wchar_t* argv[] = {\n    L\"foo.exe\",\n    L\"--gmock_verbose=info\",\n    NULL\n  };\n\n  const wchar_t* new_argv[] = {\n    L\"foo.exe\",\n    NULL\n  };\n\n  TestInitGoogleMock(argv, new_argv, \"info\");\n}\n\nTEST(WideInitGoogleMockTest, ParsesMultipleFlags) {\n  int old_default_behavior = GMOCK_FLAG(default_mock_behavior);\n  const wchar_t* argv[] = {\n    L\"foo.exe\",\n    L\"--gmock_verbose=info\",\n    L\"--gmock_default_mock_behavior=2\",\n    NULL\n  };\n\n  const wchar_t* new_argv[] = {\n    L\"foo.exe\",\n    NULL\n  };\n\n  TestInitGoogleMock(argv, new_argv, \"info\");\n  EXPECT_EQ(2, GMOCK_FLAG(default_mock_behavior));\n  EXPECT_NE(2, old_default_behavior);\n  GMOCK_FLAG(default_mock_behavior) = old_default_behavior;\n}\n\nTEST(WideInitGoogleMockTest, ParsesUnrecognizedFlag) {\n  const wchar_t* argv[] = {\n    L\"foo.exe\",\n    L\"--non_gmock_flag=blah\",\n    NULL\n  };\n\n  const wchar_t* new_argv[] = {\n    L\"foo.exe\",\n    L\"--non_gmock_flag=blah\",\n    NULL\n  };\n\n  TestInitGoogleMock(argv, new_argv, GMOCK_FLAG(verbose));\n}\n\nTEST(WideInitGoogleMockTest, ParsesGoogleMockFlagAndUnrecognizedFlag) {\n  const wchar_t* argv[] = {\n    L\"foo.exe\",\n    L\"--non_gmock_flag=blah\",\n    L\"--gmock_verbose=error\",\n    NULL\n  };\n\n  const wchar_t* new_argv[] = {\n    L\"foo.exe\",\n    L\"--non_gmock_flag=blah\",\n    NULL\n  };\n\n  TestInitGoogleMock(argv, new_argv, \"error\");\n}\n\n#endif  // !defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n\n// Makes sure Google Mock flags can be accessed in code.\nTEST(FlagTest, IsAccessibleInCode) {\n  bool dummy = testing::GMOCK_FLAG(catch_leaked_mocks) &&\n      testing::GMOCK_FLAG(verbose) == \"\";\n  (void)dummy;  // Avoids the \"unused local variable\" warning.\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googlemock/test/gmock_test_utils.py",
    "content": "# Copyright 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test utilities for Google C++ Mocking Framework.\"\"\"\n\nimport os\nimport sys\n\n# Determines path to gtest_test_utils and imports it.\nSCRIPT_DIR = os.path.dirname(__file__) or '.'\n\n# isdir resolves symbolic links.\ngtest_tests_util_dir = os.path.join(SCRIPT_DIR, '../../googletest/test')\nif os.path.isdir(gtest_tests_util_dir):\n  GTEST_TESTS_UTIL_DIR = gtest_tests_util_dir\nelse:\n  GTEST_TESTS_UTIL_DIR = os.path.join(SCRIPT_DIR, '../../googletest/test')\nsys.path.append(GTEST_TESTS_UTIL_DIR)\n\n# pylint: disable=C6204\nimport gtest_test_utils\n\n\ndef GetSourceDir():\n  \"\"\"Returns the absolute path of the directory where the .py files are.\"\"\"\n\n  return gtest_test_utils.GetSourceDir()\n\n\ndef GetTestExecutablePath(executable_name):\n  \"\"\"Returns the absolute path of the test binary given its name.\n\n  The function will print a message and abort the program if the resulting file\n  doesn't exist.\n\n  Args:\n    executable_name: name of the test binary that the test script runs.\n\n  Returns:\n    The absolute path of the test binary.\n  \"\"\"\n\n  return gtest_test_utils.GetTestExecutablePath(executable_name)\n\n\ndef GetExitStatus(exit_code):\n  \"\"\"Returns the argument to exit(), or -1 if exit() wasn't called.\n\n  Args:\n    exit_code: the result value of os.system(command).\n  \"\"\"\n\n  if os.name == 'nt':\n    # On Windows, os.WEXITSTATUS() doesn't work and os.system() returns\n    # the argument to exit() directly.\n    return exit_code\n  else:\n    # On Unix, os.WEXITSTATUS() must be used to extract the exit status\n    # from the result of os.system().\n    if os.WIFEXITED(exit_code):\n      return os.WEXITSTATUS(exit_code)\n    else:\n      return -1\n\n\n# Suppresses the \"Invalid const name\" lint complaint\n# pylint: disable-msg=C6409\n\n# Exposes utilities from gtest_test_utils.\nSubprocess = gtest_test_utils.Subprocess\nTestCase = gtest_test_utils.TestCase\nenviron = gtest_test_utils.environ\nSetEnvVar = gtest_test_utils.SetEnvVar\nPREMATURE_EXIT_FILE_ENV_VAR = gtest_test_utils.PREMATURE_EXIT_FILE_ENV_VAR\n\n# pylint: enable-msg=C6409\n\n\ndef Main():\n  \"\"\"Runs the unit test.\"\"\"\n\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/CHANGES",
    "content": "Changes for 1.7.0:\n\n* New feature: death tests are supported on OpenBSD and in iOS\n  simulator now.\n* New feature: Google Test now implements a protocol to allow\n  a test runner to detect that a test program has exited\n  prematurely and report it as a failure (before it would be\n  falsely reported as a success if the exit code is 0).\n* New feature: Test::RecordProperty() can now be used outside of the\n  lifespan of a test method, in which case it will be attributed to\n  the current test case or the test program in the XML report.\n* New feature (potentially breaking): --gtest_list_tests now prints\n  the type parameters and value parameters for each test.\n* Improvement: char pointers and char arrays are now escaped properly\n  in failure messages.\n* Improvement: failure summary in XML reports now includes file and\n  line information.\n* Improvement: the <testsuites> XML element now has a timestamp attribute.\n* Improvement: When --gtest_filter is specified, XML report now doesn't\n  contain information about tests that are filtered out.\n* Fixed the bug where long --gtest_filter flag values are truncated in\n  death tests.\n* Potentially breaking change: RUN_ALL_TESTS() is now implemented as a\n  function instead of a macro in order to work better with Clang.\n* Compatibility fixes with C++ 11 and various platforms.\n* Bug/warning fixes.\n\nChanges for 1.6.0:\n\n* New feature: ADD_FAILURE_AT() for reporting a test failure at the\n  given source location -- useful for writing testing utilities.\n* New feature: the universal value printer is moved from Google Mock\n  to Google Test.\n* New feature: type parameters and value parameters are reported in\n  the XML report now.\n* A gtest_disable_pthreads CMake option.\n* Colored output works in GNU Screen sessions now.\n* Parameters of value-parameterized tests are now printed in the\n  textual output.\n* Failures from ad hoc test assertions run before RUN_ALL_TESTS() are\n  now correctly reported.\n* Arguments of ASSERT_XY and EXPECT_XY no longer need to support << to\n  ostream.\n* More complete handling of exceptions.\n* GTEST_ASSERT_XY can be used instead of ASSERT_XY in case the latter\n  name is already used by another library.\n* --gtest_catch_exceptions is now true by default, allowing a test\n  program to continue after an exception is thrown.\n* Value-parameterized test fixtures can now derive from Test and\n  WithParamInterface<T> separately, easing conversion of legacy tests.\n* Death test messages are clearly marked to make them more\n  distinguishable from other messages.\n* Compatibility fixes for Android, Google Native Client, MinGW, HP UX,\n  PowerPC, Lucid autotools, libCStd, Sun C++, Borland C++ Builder (Code Gear),\n  IBM XL C++ (Visual Age C++), and C++0x.\n* Bug fixes and implementation clean-ups.\n* Potentially incompatible changes: disables the harmful 'make install'\n  command in autotools.\n\nChanges for 1.5.0:\n\n * New feature: assertions can be safely called in multiple threads\n   where the pthreads library is available.\n * New feature: predicates used inside EXPECT_TRUE() and friends\n   can now generate custom failure messages.\n * New feature: Google Test can now be compiled as a DLL.\n * New feature: fused source files are included.\n * New feature: prints help when encountering unrecognized Google Test flags.\n * Experimental feature: CMake build script (requires CMake 2.6.4+).\n * Experimental feature: the Pump script for meta programming.\n * double values streamed to an assertion are printed with enough precision\n   to differentiate any two different values.\n * Google Test now works on Solaris and AIX.\n * Build and test script improvements.\n * Bug fixes and implementation clean-ups.\n\n Potentially breaking changes:\n\n * Stopped supporting VC++ 7.1 with exceptions disabled.\n * Dropped support for 'make install'.\n\nChanges for 1.4.0:\n\n * New feature: the event listener API\n * New feature: test shuffling\n * New feature: the XML report format is closer to junitreport and can\n   be parsed by Hudson now.\n * New feature: when a test runs under Visual Studio, its failures are\n   integrated in the IDE.\n * New feature: /MD(d) versions of VC++ projects.\n * New feature: elapsed time for the tests is printed by default.\n * New feature: comes with a TR1 tuple implementation such that Boost\n   is no longer needed for Combine().\n * New feature: EXPECT_DEATH_IF_SUPPORTED macro and friends.\n * New feature: the Xcode project can now produce static gtest\n   libraries in addition to a framework.\n * Compatibility fixes for Solaris, Cygwin, minGW, Windows Mobile,\n   Symbian, gcc, and C++Builder.\n * Bug fixes and implementation clean-ups.\n\nChanges for 1.3.0:\n\n * New feature: death tests on Windows, Cygwin, and Mac.\n * New feature: ability to use Google Test assertions in other testing\n   frameworks.\n * New feature: ability to run disabled test via\n   --gtest_also_run_disabled_tests.\n * New feature: the --help flag for printing the usage.\n * New feature: access to Google Test flag values in user code.\n * New feature: a script that packs Google Test into one .h and one\n   .cc file for easy deployment.\n * New feature: support for distributing test functions to multiple\n   machines (requires support from the test runner).\n * Bug fixes and implementation clean-ups.\n\nChanges for 1.2.1:\n\n * Compatibility fixes for Linux IA-64 and IBM z/OS.\n * Added support for using Boost and other TR1 implementations.\n * Changes to the build scripts to support upcoming release of Google C++\n   Mocking Framework.\n * Added Makefile to the distribution package.\n * Improved build instructions in README.\n\nChanges for 1.2.0:\n\n * New feature: value-parameterized tests.\n * New feature: the ASSERT/EXPECT_(NON)FATAL_FAILURE(_ON_ALL_THREADS)\n   macros.\n * Changed the XML report format to match JUnit/Ant's.\n * Added tests to the Xcode project.\n * Added scons/SConscript for building with SCons.\n * Added src/gtest-all.cc for building Google Test from a single file.\n * Fixed compatibility with Solaris and z/OS.\n * Enabled running Python tests on systems with python 2.3 installed,\n   e.g. Mac OS X 10.4.\n * Bug fixes.\n\nChanges for 1.1.0:\n\n * New feature: type-parameterized tests.\n * New feature: exception assertions.\n * New feature: printing elapsed time of tests.\n * Improved the robustness of death tests.\n * Added an Xcode project and samples.\n * Adjusted the output format on Windows to be understandable by Visual Studio.\n * Minor bug fixes.\n\nChanges for 1.0.1:\n\n * Added project files for Visual Studio 7.1.\n * Fixed issues with compiling on Mac OS X.\n * Fixed issues with compiling on Cygwin.\n\nChanges for 1.0.0:\n\n * Initial Open Source release of Google Test\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/CMakeLists.txt",
    "content": "########################################################################\n# CMake build script for Google Test.\n#\n# To run the tests for Google Test itself on Linux, use 'make test' or\n# ctest.  You can select which tests to run using 'ctest -R regex'.\n# For more options, run 'ctest --help'.\n\n# When other libraries are using a shared version of runtime libraries,\n# Google Test also has to use one.\noption(\n  gtest_force_shared_crt\n  \"Use shared (DLL) run-time lib even when Google Test is built as static lib.\"\n  ON)\n\noption(gtest_build_tests \"Build all of gtest's own tests.\" OFF)\n\noption(gtest_build_samples \"Build gtest's sample programs.\" OFF)\n\noption(gtest_disable_pthreads \"Disable uses of pthreads in gtest.\" OFF)\n\noption(\n  gtest_hide_internal_symbols\n  \"Build gtest with internal symbols hidden in shared libraries.\"\n  OFF)\n\n# Defines pre_project_set_up_hermetic_build() and set_up_hermetic_build().\ninclude(cmake/hermetic_build.cmake OPTIONAL)\n\nif (COMMAND pre_project_set_up_hermetic_build)\n  pre_project_set_up_hermetic_build()\nendif()\n\n########################################################################\n#\n# Project-wide settings\n\n# Name of the project.\n#\n# CMake files in this project can refer to the root source directory\n# as ${gtest_SOURCE_DIR} and to the root binary directory as\n# ${gtest_BINARY_DIR}.\n# Language \"C\" is required for find_package(Threads).\nif (CMAKE_VERSION VERSION_LESS 3.0)\n  project(gtest CXX C)\nelse()\n  cmake_policy(SET CMP0048 NEW)\n  project(gtest VERSION ${GOOGLETEST_VERSION} LANGUAGES CXX C)\nendif()\ncmake_minimum_required(VERSION 2.6.4)\n\nif (POLICY CMP0063) # Visibility\n  cmake_policy(SET CMP0063 NEW)\nendif (POLICY CMP0063)\n\nif (COMMAND set_up_hermetic_build)\n  set_up_hermetic_build()\nendif()\n\n# These commands only run if this is the main project\nif(CMAKE_PROJECT_NAME STREQUAL \"gtest\" OR CMAKE_PROJECT_NAME STREQUAL \"googletest-distribution\")\n\n  # BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to\n  # make it prominent in the GUI.\n  option(BUILD_SHARED_LIBS \"Build shared libraries (DLLs).\" OFF)\n\nelse()\n\n  mark_as_advanced(\n    gtest_force_shared_crt\n    gtest_build_tests\n    gtest_build_samples\n    gtest_disable_pthreads\n    gtest_hide_internal_symbols)\n\nendif()\n\n\nif (gtest_hide_internal_symbols)\n  set(CMAKE_CXX_VISIBILITY_PRESET hidden)\n  set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)\nendif()\n\n# Define helper functions and macros used by Google Test.\ninclude(cmake/internal_utils.cmake)\n\nconfig_compiler_and_linker()  # Defined in internal_utils.cmake.\n\n# Create the CMake package file descriptors.\nif (INSTALL_GTEST)\n  include(CMakePackageConfigHelpers)\n  set(cmake_package_name GTest)\n  set(targets_export_name ${cmake_package_name}Targets CACHE INTERNAL \"\")\n  set(generated_dir \"${CMAKE_CURRENT_BINARY_DIR}/generated\" CACHE INTERNAL \"\")\n  set(cmake_files_install_dir \"${CMAKE_INSTALL_LIBDIR}/cmake/${cmake_package_name}\")\n  set(version_file \"${generated_dir}/${cmake_package_name}ConfigVersion.cmake\")\n  write_basic_package_version_file(${version_file} COMPATIBILITY AnyNewerVersion)\n  install(EXPORT ${targets_export_name}\n    NAMESPACE ${cmake_package_name}::\n    DESTINATION ${cmake_files_install_dir})\n  set(config_file \"${generated_dir}/${cmake_package_name}Config.cmake\")\n  configure_package_config_file(\"${gtest_SOURCE_DIR}/cmake/Config.cmake.in\"\n    \"${config_file}\" INSTALL_DESTINATION ${cmake_files_install_dir})\n  install(FILES ${version_file} ${config_file}\n    DESTINATION ${cmake_files_install_dir})\nendif()\n\n# Where Google Test's .h files can be found.\nset(gtest_build_include_dirs\n  \"${gtest_SOURCE_DIR}/include\"\n  \"${gtest_SOURCE_DIR}\")\ninclude_directories(${gtest_build_include_dirs})\n\n# Summary of tuple support for Microsoft Visual Studio:\n# Compiler    version(MS)  version(cmake)  Support\n# ----------  -----------  --------------  -----------------------------\n# <= VS 2010  <= 10        <= 1600         Use Google Tests's own tuple.\n# VS 2012     11           1700            std::tr1::tuple + _VARIADIC_MAX=10\n# VS 2013     12           1800            std::tr1::tuple\n# VS 2015     14           1900            std::tuple\n# VS 2017     15           >= 1910         std::tuple\nif (MSVC AND MSVC_VERSION EQUAL 1700)\n  add_definitions(/D _VARIADIC_MAX=10)\nendif()\n\n########################################################################\n#\n# Defines the gtest & gtest_main libraries.  User tests should link\n# with one of them.\n\n# Google Test libraries.  We build them using more strict warnings than what\n# are used for other targets, to ensure that gtest can be compiled by a user\n# aggressive about warnings.\ncxx_library(gtest \"${cxx_strict}\" src/gtest-all.cc)\ncxx_library(gtest_main \"${cxx_strict}\" src/gtest_main.cc)\n# If the CMake version supports it, attach header directory information\n# to the targets for when we are part of a parent build (ie being pulled\n# in via add_subdirectory() rather than being a standalone build).\nif (DEFINED CMAKE_VERSION AND NOT \"${CMAKE_VERSION}\" VERSION_LESS \"2.8.11\")\n  target_include_directories(gtest SYSTEM INTERFACE\n    \"$<BUILD_INTERFACE:${gtest_build_include_dirs}>\"\n    \"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>\")\n  target_include_directories(gtest_main SYSTEM INTERFACE\n    \"$<BUILD_INTERFACE:${gtest_build_include_dirs}>\"\n    \"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>\")\nendif()\ntarget_link_libraries(gtest_main PUBLIC gtest)\n\n########################################################################\n#\n# Install rules\ninstall_project(gtest gtest_main)\n\n########################################################################\n#\n# Samples on how to link user tests with gtest or gtest_main.\n#\n# They are not built by default.  To build them, set the\n# gtest_build_samples option to ON.  You can do it by running ccmake\n# or specifying the -Dgtest_build_samples=ON flag when running cmake.\n\nif (gtest_build_samples)\n  cxx_executable(sample1_unittest samples gtest_main samples/sample1.cc)\n  cxx_executable(sample2_unittest samples gtest_main samples/sample2.cc)\n  cxx_executable(sample3_unittest samples gtest_main)\n  cxx_executable(sample4_unittest samples gtest_main samples/sample4.cc)\n  cxx_executable(sample5_unittest samples gtest_main samples/sample1.cc)\n  cxx_executable(sample6_unittest samples gtest_main)\n  cxx_executable(sample7_unittest samples gtest_main)\n  cxx_executable(sample8_unittest samples gtest_main)\n  cxx_executable(sample9_unittest samples gtest)\n  cxx_executable(sample10_unittest samples gtest)\nendif()\n\n########################################################################\n#\n# Google Test's own tests.\n#\n# You can skip this section if you aren't interested in testing\n# Google Test itself.\n#\n# The tests are not built by default.  To build them, set the\n# gtest_build_tests option to ON.  You can do it by running ccmake\n# or specifying the -Dgtest_build_tests=ON flag when running cmake.\n\nif (gtest_build_tests)\n  # This must be set in the root directory for the tests to be run by\n  # 'make test' or ctest.\n  enable_testing()\n\n  ############################################################\n  # C++ tests built with standard compiler flags.\n\n  cxx_test(googletest-death-test-test gtest_main)\n  cxx_test(gtest_environment_test gtest)\n  cxx_test(googletest-filepath-test gtest_main)\n  cxx_test(googletest-linked-ptr-test gtest_main)\n  cxx_test(googletest-listener-test gtest_main)\n  cxx_test(gtest_main_unittest gtest_main)\n  cxx_test(googletest-message-test gtest_main)\n  cxx_test(gtest_no_test_unittest gtest)\n  cxx_test(googletest-options-test gtest_main)\n  cxx_test(googletest-param-test-test gtest\n    test/googletest-param-test2-test.cc)\n  cxx_test(googletest-port-test gtest_main)\n  cxx_test(gtest_pred_impl_unittest gtest_main)\n  cxx_test(gtest_premature_exit_test gtest\n    test/gtest_premature_exit_test.cc)\n  cxx_test(googletest-printers-test gtest_main)\n  cxx_test(gtest_prod_test gtest_main\n    test/production.cc)\n  cxx_test(gtest_repeat_test gtest)\n  cxx_test(gtest_sole_header_test gtest_main)\n  cxx_test(gtest_stress_test gtest)\n  cxx_test(googletest-test-part-test gtest_main)\n  cxx_test(gtest_throw_on_failure_ex_test gtest)\n  cxx_test(gtest-typed-test_test gtest_main\n    test/gtest-typed-test2_test.cc)\n  cxx_test(gtest_unittest gtest_main)\n  cxx_test(gtest-unittest-api_test gtest)\n\n  ############################################################\n  # C++ tests built with non-standard compiler flags.\n\n  # MSVC 7.1 does not support STL with exceptions disabled.\n  if (NOT MSVC OR MSVC_VERSION GREATER 1310)\n    cxx_library(gtest_no_exception \"${cxx_no_exception}\"\n      src/gtest-all.cc)\n    cxx_library(gtest_main_no_exception \"${cxx_no_exception}\"\n      src/gtest-all.cc src/gtest_main.cc)\n  endif()\n  cxx_library(gtest_main_no_rtti \"${cxx_no_rtti}\"\n    src/gtest-all.cc src/gtest_main.cc)\n\n  cxx_test_with_flags(gtest-death-test_ex_nocatch_test\n    \"${cxx_exception} -DGTEST_ENABLE_CATCH_EXCEPTIONS_=0\"\n    gtest test/googletest-death-test_ex_test.cc)\n  cxx_test_with_flags(gtest-death-test_ex_catch_test\n    \"${cxx_exception} -DGTEST_ENABLE_CATCH_EXCEPTIONS_=1\"\n    gtest test/googletest-death-test_ex_test.cc)\n\n  cxx_test_with_flags(gtest_no_rtti_unittest \"${cxx_no_rtti}\"\n    gtest_main_no_rtti test/gtest_unittest.cc)\n\n  cxx_shared_library(gtest_dll \"${cxx_default}\"\n    src/gtest-all.cc src/gtest_main.cc)\n\n  cxx_executable_with_flags(gtest_dll_test_ \"${cxx_default}\"\n    gtest_dll test/gtest_all_test.cc)\n  set_target_properties(gtest_dll_test_\n                        PROPERTIES\n                        COMPILE_DEFINITIONS \"GTEST_LINKED_AS_SHARED_LIBRARY=1\")\n\n  if (NOT MSVC OR MSVC_VERSION LESS 1600)  # 1600 is Visual Studio 2010.\n    # Visual Studio 2010, 2012, and 2013 define symbols in std::tr1 that\n    # conflict with our own definitions. Therefore using our own tuple does not\n    # work on those compilers.\n    cxx_library(gtest_main_use_own_tuple \"${cxx_use_own_tuple}\"\n      src/gtest-all.cc src/gtest_main.cc)\n\n    cxx_test_with_flags(googletest-tuple-test \"${cxx_use_own_tuple}\"\n      gtest_main_use_own_tuple test/googletest-tuple-test.cc)\n\n    cxx_test_with_flags(gtest_use_own_tuple_test \"${cxx_use_own_tuple}\"\n      gtest_main_use_own_tuple\n      test/googletest-param-test-test.cc test/googletest-param-test2-test.cc)\n  endif()\n\n  ############################################################\n  # Python tests.\n\n  cxx_executable(googletest-break-on-failure-unittest_ test gtest)\n  py_test(googletest-break-on-failure-unittest)\n\n  # Visual Studio .NET 2003 does not support STL with exceptions disabled.\n  if (NOT MSVC OR MSVC_VERSION GREATER 1310)  # 1310 is Visual Studio .NET 2003\n    cxx_executable_with_flags(\n      googletest-catch-exceptions-no-ex-test_\n      \"${cxx_no_exception}\"\n      gtest_main_no_exception\n      test/googletest-catch-exceptions-test_.cc)\n  endif()\n\n  cxx_executable_with_flags(\n    googletest-catch-exceptions-ex-test_\n    \"${cxx_exception}\"\n    gtest_main\n    test/googletest-catch-exceptions-test_.cc)\n  py_test(googletest-catch-exceptions-test)\n\n  cxx_executable(googletest-color-test_ test gtest)\n  py_test(googletest-color-test)\n\n  cxx_executable(googletest-env-var-test_ test gtest)\n  py_test(googletest-env-var-test)\n\n  cxx_executable(googletest-filter-unittest_ test gtest)\n  py_test(googletest-filter-unittest)\n\n  cxx_executable(gtest_help_test_ test gtest_main)\n  py_test(gtest_help_test)\n\n  cxx_executable(googletest-list-tests-unittest_ test gtest)\n  py_test(googletest-list-tests-unittest)\n\n  cxx_executable(googletest-output-test_ test gtest)\n  py_test(googletest-output-test --no_stacktrace_support)\n\n  cxx_executable(googletest-shuffle-test_ test gtest)\n  py_test(googletest-shuffle-test)\n\n  # MSVC 7.1 does not support STL with exceptions disabled.\n  if (NOT MSVC OR MSVC_VERSION GREATER 1310)\n    cxx_executable(googletest-throw-on-failure-test_ test gtest_no_exception)\n    set_target_properties(googletest-throw-on-failure-test_\n      PROPERTIES\n      COMPILE_FLAGS \"${cxx_no_exception}\")\n    py_test(googletest-throw-on-failure-test)\n  endif()\n\n  cxx_executable(googletest-uninitialized-test_ test gtest)\n  py_test(googletest-uninitialized-test)\n\n  cxx_executable(gtest_xml_outfile1_test_ test gtest_main)\n  cxx_executable(gtest_xml_outfile2_test_ test gtest_main)\n  py_test(gtest_xml_outfiles_test)\n  py_test(googletest-json-outfiles-test)\n\n  cxx_executable(gtest_xml_output_unittest_ test gtest)\n  py_test(gtest_xml_output_unittest --no_stacktrace_support)\n  py_test(googletest-json-output-unittest --no_stacktrace_support)\nendif()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/CONTRIBUTORS",
    "content": "# This file contains a list of people who've made non-trivial\n# contribution to the Google C++ Testing Framework project.  People\n# who commit code to the project are encouraged to add their names\n# here.  Please keep the list sorted by first names.\n\nAjay Joshi <jaj@google.com>\nBalázs Dán <balazs.dan@gmail.com>\nBharat Mediratta <bharat@menalto.com>\nChandler Carruth <chandlerc@google.com>\nChris Prince <cprince@google.com>\nChris Taylor <taylorc@google.com>\nDan Egnor <egnor@google.com>\nEric Roman <eroman@chromium.org>\nHady Zalek <hady.zalek@gmail.com>\nJeffrey Yasskin <jyasskin@google.com>\nJói Sigurðsson <joi@google.com>\nKeir Mierle <mierle@gmail.com>\nKeith Ray <keith.ray@gmail.com>\nKenton Varda <kenton@google.com>\nManuel Klimek <klimek@google.com>\nMarkus Heule <markus.heule@gmail.com>\nMika Raento <mikie@iki.fi>\nMiklós Fazekas <mfazekas@szemafor.com>\nPasi Valminen <pasi.valminen@gmail.com>\nPatrick Hanna <phanna@google.com>\nPatrick Riley <pfr@google.com>\nPeter Kaminski <piotrk@google.com>\nPreston Jackson <preston.a.jackson@gmail.com>\nRainer Klaffenboeck <rainer.klaffenboeck@dynatrace.com>\nRuss Cox <rsc@google.com>\nRuss Rufer <russ@pentad.com>\nSean Mcafee <eefacm@gmail.com>\nSigurður Ásgeirsson <siggi@google.com>\nTracy Bialik <tracy@pentad.com>\nVadim Berman <vadimb@google.com>\nVlad Losev <vladl@google.com>\nZhanyong Wan <wan@google.com>\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/LICENSE",
    "content": "Copyright 2008, Google Inc.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n    * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/Makefile.am",
    "content": "# Automake file\n\nACLOCAL_AMFLAGS = -I m4\n\n# Nonstandard package files for distribution\nEXTRA_DIST = \\\n  CHANGES \\\n  CONTRIBUTORS \\\n  LICENSE \\\n  include/gtest/gtest-param-test.h.pump \\\n  include/gtest/internal/gtest-param-util-generated.h.pump \\\n  include/gtest/internal/gtest-tuple.h.pump \\\n  include/gtest/internal/gtest-type-util.h.pump \\\n  make/Makefile \\\n  scripts/fuse_gtest_files.py \\\n  scripts/gen_gtest_pred_impl.py \\\n  scripts/pump.py \\\n  scripts/test/Makefile\n\n# gtest source files that we don't compile directly.  They are\n# #included by gtest-all.cc.\nGTEST_SRC = \\\n  src/gtest-death-test.cc \\\n  src/gtest-filepath.cc \\\n  src/gtest-internal-inl.h \\\n  src/gtest-port.cc \\\n  src/gtest-printers.cc \\\n  src/gtest-test-part.cc \\\n  src/gtest-typed-test.cc \\\n  src/gtest.cc\n\nEXTRA_DIST += $(GTEST_SRC)\n\n# Sample files that we don't compile.\nEXTRA_DIST += \\\n  samples/prime_tables.h \\\n  samples/sample1_unittest.cc \\\n  samples/sample2_unittest.cc \\\n  samples/sample3_unittest.cc \\\n  samples/sample4_unittest.cc \\\n  samples/sample5_unittest.cc \\\n  samples/sample6_unittest.cc \\\n  samples/sample7_unittest.cc \\\n  samples/sample8_unittest.cc \\\n  samples/sample9_unittest.cc\n\n# C++ test files that we don't compile directly.\nEXTRA_DIST += \\\n  test/gtest-death-test_ex_test.cc \\\n  test/gtest-death-test_test.cc \\\n  test/gtest-filepath_test.cc \\\n  test/gtest-linked_ptr_test.cc \\\n  test/gtest-listener_test.cc \\\n  test/gtest-message_test.cc \\\n  test/gtest-options_test.cc \\\n  test/googletest-param-test2-test.cc \\\n  test/googletest-param-test2-test.cc \\\n  test/googletest-param-test-test.cc \\\n  test/googletest-param-test-test.cc \\\n  test/gtest-param-test_test.h \\\n  test/gtest-port_test.cc \\\n  test/gtest_premature_exit_test.cc \\\n  test/gtest-printers_test.cc \\\n  test/gtest-test-part_test.cc \\\n  test/googletest-tuple-test.cc \\\n  test/gtest-typed-test2_test.cc \\\n  test/gtest-typed-test_test.cc \\\n  test/gtest-typed-test_test.h \\\n  test/gtest-unittest-api_test.cc \\\n  test/googletest-break-on-failure-unittest_.cc \\\n  test/googletest-catch-exceptions-test_.cc \\\n  test/googletest-color-test_.cc \\\n  test/googletest-env-var-test_.cc \\\n  test/gtest_environment_test.cc \\\n  test/googletest-filter-unittest_.cc \\\n  test/gtest_help_test_.cc \\\n  test/googletest-list-tests-unittest_.cc \\\n  test/gtest_main_unittest.cc \\\n  test/gtest_no_test_unittest.cc \\\n  test/googletest-output-test_.cc \\\n  test/gtest_pred_impl_unittest.cc \\\n  test/gtest_prod_test.cc \\\n  test/gtest_repeat_test.cc \\\n  test/googletest-shuffle-test_.cc \\\n  test/gtest_sole_header_test.cc \\\n  test/gtest_stress_test.cc \\\n  test/gtest_throw_on_failure_ex_test.cc \\\n  test/googletest-throw-on-failure-test_.cc \\\n  test/googletest-uninitialized-test_.cc \\\n  test/gtest_unittest.cc \\\n  test/gtest_unittest.cc \\\n  test/gtest_xml_outfile1_test_.cc \\\n  test/gtest_xml_outfile2_test_.cc \\\n  test/gtest_xml_output_unittest_.cc \\\n  test/production.cc \\\n  test/production.h\n\n# Python tests that we don't run.\nEXTRA_DIST += \\\n  test/googletest-break-on-failure-unittest.py \\\n  test/googletest-catch-exceptions-test.py \\\n  test/googletest-color-test.py \\\n  test/googletest-env-var-test.py \\\n  test/googletest-filter-unittest.py \\\n  test/gtest_help_test.py \\\n  test/googletest-list-tests-unittest.py \\\n  test/googletest-output-test.py \\\n  test/googletest-output-test_golden_lin.txt \\\n  test/googletest-shuffle-test.py \\\n  test/gtest_test_utils.py \\\n  test/googletest-throw-on-failure-test.py \\\n  test/googletest-uninitialized-test.py \\\n  test/gtest_xml_outfiles_test.py \\\n  test/gtest_xml_output_unittest.py \\\n  test/gtest_xml_test_utils.py\n\n# CMake script\nEXTRA_DIST += \\\n  CMakeLists.txt \\\n  cmake/internal_utils.cmake\n\n# MSVC project files\nEXTRA_DIST += \\\n  msvc/2010/gtest-md.sln \\\n  msvc/2010/gtest-md.vcxproj \\\n  msvc/2010/gtest.sln \\\n  msvc/2010/gtest.vcxproj \\\n  msvc/2010/gtest_main-md.vcxproj \\\n  msvc/2010/gtest_main.vcxproj \\\n  msvc/2010/gtest_prod_test-md.vcxproj \\\n  msvc/2010/gtest_prod_test.vcxproj \\\n  msvc/2010/gtest_unittest-md.vcxproj \\\n  msvc/2010/gtest_unittest.vcxproj\n\n# xcode project files\nEXTRA_DIST += \\\n  xcode/Config/DebugProject.xcconfig \\\n  xcode/Config/FrameworkTarget.xcconfig \\\n  xcode/Config/General.xcconfig \\\n  xcode/Config/ReleaseProject.xcconfig \\\n  xcode/Config/StaticLibraryTarget.xcconfig \\\n  xcode/Config/TestTarget.xcconfig \\\n  xcode/Resources/Info.plist \\\n  xcode/Scripts/runtests.sh \\\n  xcode/Scripts/versiongenerate.py \\\n  xcode/gtest.xcodeproj/project.pbxproj\n\n# xcode sample files\nEXTRA_DIST += \\\n  xcode/Samples/FrameworkSample/Info.plist \\\n  xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj \\\n  xcode/Samples/FrameworkSample/runtests.sh \\\n  xcode/Samples/FrameworkSample/widget.cc \\\n  xcode/Samples/FrameworkSample/widget.h \\\n  xcode/Samples/FrameworkSample/widget_test.cc\n\n# C++Builder project files\nEXTRA_DIST += \\\n  codegear/gtest.cbproj \\\n  codegear/gtest.groupproj \\\n  codegear/gtest_all.cc \\\n  codegear/gtest_link.cc \\\n  codegear/gtest_main.cbproj \\\n  codegear/gtest_unittest.cbproj\n\n# Distribute and install M4 macro\nm4datadir = $(datadir)/aclocal\nm4data_DATA = m4/gtest.m4\nEXTRA_DIST += $(m4data_DATA)\n\n# We define the global AM_CPPFLAGS as everything we compile includes from these\n# directories.\nAM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/include\n\n# Modifies compiler and linker flags for pthreads compatibility.\nif HAVE_PTHREADS\n  AM_CXXFLAGS = @PTHREAD_CFLAGS@ -DGTEST_HAS_PTHREAD=1\n  AM_LIBS = @PTHREAD_LIBS@\nelse\n  AM_CXXFLAGS = -DGTEST_HAS_PTHREAD=0\nendif\n\n# Build rules for libraries.\nlib_LTLIBRARIES = lib/libgtest.la lib/libgtest_main.la\n\nlib_libgtest_la_SOURCES = src/gtest-all.cc\n\npkginclude_HEADERS = \\\n  include/gtest/gtest-death-test.h \\\n  include/gtest/gtest-message.h \\\n  include/gtest/gtest-param-test.h \\\n  include/gtest/gtest-printers.h \\\n  include/gtest/gtest-spi.h \\\n  include/gtest/gtest-test-part.h \\\n  include/gtest/gtest-typed-test.h \\\n  include/gtest/gtest.h \\\n  include/gtest/gtest_pred_impl.h \\\n  include/gtest/gtest_prod.h\n\npkginclude_internaldir = $(pkgincludedir)/internal\npkginclude_internal_HEADERS = \\\n  include/gtest/internal/gtest-death-test-internal.h \\\n  include/gtest/internal/gtest-filepath.h \\\n  include/gtest/internal/gtest-internal.h \\\n  include/gtest/internal/gtest-linked_ptr.h \\\n  include/gtest/internal/gtest-param-util-generated.h \\\n  include/gtest/internal/gtest-param-util.h \\\n  include/gtest/internal/gtest-port.h \\\n  include/gtest/internal/gtest-port-arch.h \\\n  include/gtest/internal/gtest-string.h \\\n  include/gtest/internal/gtest-tuple.h \\\n  include/gtest/internal/gtest-type-util.h \\\n  include/gtest/internal/custom/gtest.h \\\n  include/gtest/internal/custom/gtest-port.h \\\n  include/gtest/internal/custom/gtest-printers.h\n\nlib_libgtest_main_la_SOURCES = src/gtest_main.cc\nlib_libgtest_main_la_LIBADD = lib/libgtest.la\n\n# Build rules for samples and tests. Automake's naming for some of\n# these variables isn't terribly obvious, so this is a brief\n# reference:\n#\n# TESTS -- Programs run automatically by \"make check\"\n# check_PROGRAMS -- Programs built by \"make check\" but not necessarily run\n\nTESTS=\nTESTS_ENVIRONMENT = GTEST_SOURCE_DIR=\"$(srcdir)/test\" \\\n                    GTEST_BUILD_DIR=\"$(top_builddir)/test\"\ncheck_PROGRAMS=\n\n# A simple sample on using gtest.\nTESTS += samples/sample1_unittest \\\n    samples/sample2_unittest \\\n    samples/sample3_unittest \\\n    samples/sample4_unittest \\\n    samples/sample5_unittest \\\n    samples/sample6_unittest \\\n    samples/sample7_unittest \\\n    samples/sample8_unittest \\\n    samples/sample9_unittest \\\n    samples/sample10_unittest\ncheck_PROGRAMS += samples/sample1_unittest \\\n    samples/sample2_unittest \\\n    samples/sample3_unittest \\\n    samples/sample4_unittest \\\n    samples/sample5_unittest \\\n    samples/sample6_unittest \\\n    samples/sample7_unittest \\\n    samples/sample8_unittest \\\n    samples/sample9_unittest \\\n    samples/sample10_unittest\n\nsamples_sample1_unittest_SOURCES = samples/sample1_unittest.cc samples/sample1.cc\nsamples_sample1_unittest_LDADD = lib/libgtest_main.la \\\n                                 lib/libgtest.la\nsamples_sample2_unittest_SOURCES = samples/sample2_unittest.cc samples/sample2.cc\nsamples_sample2_unittest_LDADD = lib/libgtest_main.la \\\n                                 lib/libgtest.la\nsamples_sample3_unittest_SOURCES = samples/sample3_unittest.cc\nsamples_sample3_unittest_LDADD = lib/libgtest_main.la \\\n                                 lib/libgtest.la\nsamples_sample4_unittest_SOURCES = samples/sample4_unittest.cc samples/sample4.cc\nsamples_sample4_unittest_LDADD = lib/libgtest_main.la \\\n                                 lib/libgtest.la\nsamples_sample5_unittest_SOURCES = samples/sample5_unittest.cc samples/sample1.cc\nsamples_sample5_unittest_LDADD = lib/libgtest_main.la \\\n                                 lib/libgtest.la\nsamples_sample6_unittest_SOURCES = samples/sample6_unittest.cc\nsamples_sample6_unittest_LDADD = lib/libgtest_main.la \\\n                                 lib/libgtest.la\nsamples_sample7_unittest_SOURCES = samples/sample7_unittest.cc\nsamples_sample7_unittest_LDADD = lib/libgtest_main.la \\\n                                 lib/libgtest.la\nsamples_sample8_unittest_SOURCES = samples/sample8_unittest.cc\nsamples_sample8_unittest_LDADD = lib/libgtest_main.la \\\n                                 lib/libgtest.la\n\n# Also verify that libgtest works by itself.\nsamples_sample9_unittest_SOURCES = samples/sample9_unittest.cc\nsamples_sample9_unittest_LDADD = lib/libgtest.la\nsamples_sample10_unittest_SOURCES = samples/sample10_unittest.cc\nsamples_sample10_unittest_LDADD = lib/libgtest.la\n\n# This tests most constructs of gtest and verifies that libgtest_main\n# and libgtest work.\nTESTS += test/gtest_all_test\ncheck_PROGRAMS += test/gtest_all_test\ntest_gtest_all_test_SOURCES = test/gtest_all_test.cc\ntest_gtest_all_test_LDADD = lib/libgtest_main.la \\\n                            lib/libgtest.la\n\n# Tests that fused gtest files compile and work.\nFUSED_GTEST_SRC = \\\n  fused-src/gtest/gtest-all.cc \\\n  fused-src/gtest/gtest.h \\\n  fused-src/gtest/gtest_main.cc\n\nif HAVE_PYTHON\nTESTS += test/fused_gtest_test\ncheck_PROGRAMS += test/fused_gtest_test\ntest_fused_gtest_test_SOURCES = $(FUSED_GTEST_SRC) \\\n                                samples/sample1.cc samples/sample1_unittest.cc\ntest_fused_gtest_test_CPPFLAGS = -I\"$(srcdir)/fused-src\"\n\n# Build rules for putting fused Google Test files into the distribution\n# package. The user can also create those files by manually running\n# scripts/fuse_gtest_files.py.\n$(test_fused_gtest_test_SOURCES): fused-gtest\n\nfused-gtest: $(pkginclude_HEADERS) $(pkginclude_internal_HEADERS) \\\n             $(GTEST_SRC) src/gtest-all.cc src/gtest_main.cc \\\n             scripts/fuse_gtest_files.py\n\tmkdir -p \"$(srcdir)/fused-src\"\n\tchmod -R u+w \"$(srcdir)/fused-src\"\n\trm -f \"$(srcdir)/fused-src/gtest/gtest-all.cc\"\n\trm -f \"$(srcdir)/fused-src/gtest/gtest.h\"\n\t\"$(srcdir)/scripts/fuse_gtest_files.py\" \"$(srcdir)/fused-src\"\n\tcp -f \"$(srcdir)/src/gtest_main.cc\" \"$(srcdir)/fused-src/gtest/\"\n\nmaintainer-clean-local:\n\trm -rf \"$(srcdir)/fused-src\"\nendif\n\n# Death tests may produce core dumps in the build directory. In case\n# this happens, clean them to keep distcleancheck happy.\nCLEANFILES = core\n\n# Disables 'make install' as installing a compiled version of Google\n# Test can lead to undefined behavior due to violation of the\n# One-Definition Rule.\n\ninstall-exec-local:\n\techo \"'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system.\"\n\tfalse\n\ninstall-data-local:\n\techo \"'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system.\"\n\tfalse\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/README.md",
    "content": "### Generic Build Instructions\n\n#### Setup\n\nTo build Google Test and your tests that use it, you need to tell your build\nsystem where to find its headers and source files. The exact way to do it\ndepends on which build system you use, and is usually straightforward.\n\n#### Build\n\nSuppose you put Google Test in directory `${GTEST_DIR}`. To build it, create a\nlibrary build target (or a project as called by Visual Studio and Xcode) to\ncompile\n\n    ${GTEST_DIR}/src/gtest-all.cc\n\nwith `${GTEST_DIR}/include` in the system header search path and `${GTEST_DIR}`\nin the normal header search path. Assuming a Linux-like system and gcc,\nsomething like the following will do:\n\n    g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} \\\n        -pthread -c ${GTEST_DIR}/src/gtest-all.cc\n    ar -rv libgtest.a gtest-all.o\n\n(We need `-pthread` as Google Test uses threads.)\n\nNext, you should compile your test source file with `${GTEST_DIR}/include` in\nthe system header search path, and link it with gtest and any other necessary\nlibraries:\n\n    g++ -isystem ${GTEST_DIR}/include -pthread path/to/your_test.cc libgtest.a \\\n        -o your_test\n\nAs an example, the make/ directory contains a Makefile that you can use to build\nGoogle Test on systems where GNU make is available (e.g. Linux, Mac OS X, and\nCygwin). It doesn't try to build Google Test's own tests. Instead, it just\nbuilds the Google Test library and a sample test. You can use it as a starting\npoint for your own build script.\n\nIf the default settings are correct for your environment, the following commands\nshould succeed:\n\n    cd ${GTEST_DIR}/make\n    make\n    ./sample1_unittest\n\nIf you see errors, try to tweak the contents of `make/Makefile` to make them go\naway. There are instructions in `make/Makefile` on how to do it.\n\n### Using CMake\n\nGoogle Test comes with a CMake build script (\n[CMakeLists.txt](https://github.com/google/googletest/blob/master/CMakeLists.txt))\nthat can be used on a wide range of platforms (\"C\" stands for cross-platform.).\nIf you don't have CMake installed already, you can download it for free from\n<http://www.cmake.org/>.\n\nCMake works by generating native makefiles or build projects that can be used in\nthe compiler environment of your choice. You can either build Google Test as a\nstandalone project or it can be incorporated into an existing CMake build for\nanother project.\n\n#### Standalone CMake Project\n\nWhen building Google Test as a standalone project, the typical workflow starts\nwith:\n\n    mkdir mybuild       # Create a directory to hold the build output.\n    cd mybuild\n    cmake ${GTEST_DIR}  # Generate native build scripts.\n\nIf you want to build Google Test's samples, you should replace the last command\nwith\n\n    cmake -Dgtest_build_samples=ON ${GTEST_DIR}\n\nIf you are on a \\*nix system, you should now see a Makefile in the current\ndirectory. Just type 'make' to build gtest.\n\nIf you use Windows and have Visual Studio installed, a `gtest.sln` file and\nseveral `.vcproj` files will be created. You can then build them using Visual\nStudio.\n\nOn Mac OS X with Xcode installed, a `.xcodeproj` file will be generated.\n\n#### Incorporating Into An Existing CMake Project\n\nIf you want to use gtest in a project which already uses CMake, then a more\nrobust and flexible approach is to build gtest as part of that project directly.\nThis is done by making the GoogleTest source code available to the main build\nand adding it using CMake's `add_subdirectory()` command. This has the\nsignificant advantage that the same compiler and linker settings are used\nbetween gtest and the rest of your project, so issues associated with using\nincompatible libraries (eg debug/release), etc. are avoided. This is\nparticularly useful on Windows. Making GoogleTest's source code available to the\nmain build can be done a few different ways:\n\n*   Download the GoogleTest source code manually and place it at a known\n    location. This is the least flexible approach and can make it more difficult\n    to use with continuous integration systems, etc.\n*   Embed the GoogleTest source code as a direct copy in the main project's\n    source tree. This is often the simplest approach, but is also the hardest to\n    keep up to date. Some organizations may not permit this method.\n*   Add GoogleTest as a git submodule or equivalent. This may not always be\n    possible or appropriate. Git submodules, for example, have their own set of\n    advantages and drawbacks.\n*   Use CMake to download GoogleTest as part of the build's configure step. This\n    is just a little more complex, but doesn't have the limitations of the other\n    methods.\n\nThe last of the above methods is implemented with a small piece of CMake code in\na separate file (e.g. `CMakeLists.txt.in`) which is copied to the build area and\nthen invoked as a sub-build _during the CMake stage_. That directory is then\npulled into the main build with `add_subdirectory()`. For example:\n\nNew file `CMakeLists.txt.in`:\n\n    cmake_minimum_required(VERSION 2.8.2)\n\n    project(googletest-download NONE)\n\n    include(ExternalProject)\n    ExternalProject_Add(googletest\n      GIT_REPOSITORY    https://github.com/google/googletest.git\n      GIT_TAG           master\n      SOURCE_DIR        \"${CMAKE_BINARY_DIR}/googletest-src\"\n      BINARY_DIR        \"${CMAKE_BINARY_DIR}/googletest-build\"\n      CONFIGURE_COMMAND \"\"\n      BUILD_COMMAND     \"\"\n      INSTALL_COMMAND   \"\"\n      TEST_COMMAND      \"\"\n    )\n\nExisting build's `CMakeLists.txt`:\n\n    # Download and unpack googletest at configure time\n    configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt)\n    execute_process(COMMAND ${CMAKE_COMMAND} -G \"${CMAKE_GENERATOR}\" .\n      RESULT_VARIABLE result\n      WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download )\n    if(result)\n      message(FATAL_ERROR \"CMake step for googletest failed: ${result}\")\n    endif()\n    execute_process(COMMAND ${CMAKE_COMMAND} --build .\n      RESULT_VARIABLE result\n      WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download )\n    if(result)\n      message(FATAL_ERROR \"Build step for googletest failed: ${result}\")\n    endif()\n\n    # Prevent overriding the parent project's compiler/linker\n    # settings on Windows\n    set(gtest_force_shared_crt ON CACHE BOOL \"\" FORCE)\n\n    # Add googletest directly to our build. This defines\n    # the gtest and gtest_main targets.\n    add_subdirectory(${CMAKE_BINARY_DIR}/googletest-src\n                     ${CMAKE_BINARY_DIR}/googletest-build\n                     EXCLUDE_FROM_ALL)\n\n    # The gtest/gtest_main targets carry header search path\n    # dependencies automatically when using CMake 2.8.11 or\n    # later. Otherwise we have to add them here ourselves.\n    if (CMAKE_VERSION VERSION_LESS 2.8.11)\n      include_directories(\"${gtest_SOURCE_DIR}/include\")\n    endif()\n\n    # Now simply link against gtest or gtest_main as needed. Eg\n    add_executable(example example.cpp)\n    target_link_libraries(example gtest_main)\n    add_test(NAME example_test COMMAND example)\n\nNote that this approach requires CMake 2.8.2 or later due to its use of the\n`ExternalProject_Add()` command. The above technique is discussed in more detail\nin [this separate article](http://crascit.com/2015/07/25/cmake-gtest/) which\nalso contains a link to a fully generalized implementation of the technique.\n\n##### Visual Studio Dynamic vs Static Runtimes\n\nBy default, new Visual Studio projects link the C runtimes dynamically but\nGoogle Test links them statically. This will generate an error that looks\nsomething like the following: gtest.lib(gtest-all.obj) : error LNK2038: mismatch\ndetected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value\n'MDd_DynamicDebug' in main.obj\n\nGoogle Test already has a CMake option for this: `gtest_force_shared_crt`\n\nEnabling this option will make gtest link the runtimes dynamically too, and\nmatch the project in which it is included.\n\n### Legacy Build Scripts\n\nBefore settling on CMake, we have been providing hand-maintained build\nprojects/scripts for Visual Studio, Xcode, and Autotools. While we continue to\nprovide them for convenience, they are not actively maintained any more. We\nhighly recommend that you follow the instructions in the above sections to\nintegrate Google Test with your existing build system.\n\nIf you still need to use the legacy build scripts, here's how:\n\nThe msvc\\ folder contains two solutions with Visual C++ projects. Open the\n`gtest.sln` or `gtest-md.sln` file using Visual Studio, and you are ready to\nbuild Google Test the same way you build any Visual Studio project. Files that\nhave names ending with -md use DLL versions of Microsoft runtime libraries (the\n/MD or the /MDd compiler option). Files without that suffix use static versions\nof the runtime libraries (the /MT or the /MTd option). Please note that one must\nuse the same option to compile both gtest and the test code. If you use Visual\nStudio 2005 or above, we recommend the -md version as /MD is the default for new\nprojects in these versions of Visual Studio.\n\nOn Mac OS X, open the `gtest.xcodeproj` in the `xcode/` folder using Xcode.\nBuild the \"gtest\" target. The universal binary framework will end up in your\nselected build directory (selected in the Xcode \"Preferences...\" -> \"Building\"\npane and defaults to xcode/build). Alternatively, at the command line, enter:\n\n    xcodebuild\n\nThis will build the \"Release\" configuration of gtest.framework in your default\nbuild location. See the \"xcodebuild\" man page for more information about\nbuilding different configurations and building in different locations.\n\nIf you wish to use the Google Test Xcode project with Xcode 4.x and above, you\nneed to either:\n\n*   update the SDK configuration options in xcode/Config/General.xconfig.\n    Comment options `SDKROOT`, `MACOS_DEPLOYMENT_TARGET`, and `GCC_VERSION`. If\n    you choose this route you lose the ability to target earlier versions of\n    MacOS X.\n*   Install an SDK for an earlier version. This doesn't appear to be supported\n    by Apple, but has been reported to work\n    (http://stackoverflow.com/questions/5378518).\n\n### Tweaking Google Test\n\nGoogle Test can be used in diverse environments. The default configuration may\nnot work (or may not work well) out of the box in some environments. However,\nyou can easily tweak Google Test by defining control macros on the compiler\ncommand line. Generally, these macros are named like `GTEST_XYZ` and you define\nthem to either 1 or 0 to enable or disable a certain feature.\n\nWe list the most frequently used macros below. For a complete list, see file\n[include/gtest/internal/gtest-port.h](https://github.com/google/googletest/blob/master/include/gtest/internal/gtest-port.h).\n\n### Choosing a TR1 Tuple Library\n\nSome Google Test features require the C++ Technical Report 1 (TR1) tuple\nlibrary, which is not yet available with all compilers. The good news is that\nGoogle Test implements a subset of TR1 tuple that's enough for its own need, and\nwill automatically use this when the compiler doesn't provide TR1 tuple.\n\nUsually you don't need to care about which tuple library Google Test uses.\nHowever, if your project already uses TR1 tuple, you need to tell Google Test to\nuse the same TR1 tuple library the rest of your project uses, or the two tuple\nimplementations will clash. To do that, add\n\n    -DGTEST_USE_OWN_TR1_TUPLE=0\n\nto the compiler flags while compiling Google Test and your tests. If you want to\nforce Google Test to use its own tuple library, just add\n\n    -DGTEST_USE_OWN_TR1_TUPLE=1\n\nto the compiler flags instead.\n\nIf you don't want Google Test to use tuple at all, add\n\n    -DGTEST_HAS_TR1_TUPLE=0\n\nand all features using tuple will be disabled.\n\n### Multi-threaded Tests\n\nGoogle Test is thread-safe where the pthread library is available. After\n`#include \"gtest/gtest.h\"`, you can check the `GTEST_IS_THREADSAFE` macro to see\nwhether this is the case (yes if the macro is `#defined` to 1, no if it's\nundefined.).\n\nIf Google Test doesn't correctly detect whether pthread is available in your\nenvironment, you can force it with\n\n    -DGTEST_HAS_PTHREAD=1\n\nor\n\n    -DGTEST_HAS_PTHREAD=0\n\nWhen Google Test uses pthread, you may need to add flags to your compiler and/or\nlinker to select the pthread library, or you'll get link errors. If you use the\nCMake script or the deprecated Autotools script, this is taken care of for you.\nIf you use your own build script, you'll need to read your compiler and linker's\nmanual to figure out what flags to add.\n\n### As a Shared Library (DLL)\n\nGoogle Test is compact, so most users can build and link it as a static library\nfor the simplicity. You can choose to use Google Test as a shared library (known\nas a DLL on Windows) if you prefer.\n\nTo compile *gtest* as a shared library, add\n\n    -DGTEST_CREATE_SHARED_LIBRARY=1\n\nto the compiler flags. You'll also need to tell the linker to produce a shared\nlibrary instead - consult your linker's manual for how to do it.\n\nTo compile your *tests* that use the gtest shared library, add\n\n    -DGTEST_LINKED_AS_SHARED_LIBRARY=1\n\nto the compiler flags.\n\nNote: while the above steps aren't technically necessary today when using some\ncompilers (e.g. GCC), they may become necessary in the future, if we decide to\nimprove the speed of loading the library (see\n<http://gcc.gnu.org/wiki/Visibility> for details). Therefore you are recommended\nto always add the above flags when using Google Test as a shared library.\nOtherwise a future release of Google Test may break your build script.\n\n### Avoiding Macro Name Clashes\n\nIn C++, macros don't obey namespaces. Therefore two libraries that both define a\nmacro of the same name will clash if you `#include` both definitions. In case a\nGoogle Test macro clashes with another library, you can force Google Test to\nrename its macro to avoid the conflict.\n\nSpecifically, if both Google Test and some other code define macro FOO, you can\nadd\n\n    -DGTEST_DONT_DEFINE_FOO=1\n\nto the compiler flags to tell Google Test to change the macro's name from `FOO`\nto `GTEST_FOO`. Currently `FOO` can be `FAIL`, `SUCCEED`, or `TEST`. For\nexample, with `-DGTEST_DONT_DEFINE_TEST=1`, you'll need to write\n\n    GTEST_TEST(SomeTest, DoesThis) { ... }\n\ninstead of\n\n    TEST(SomeTest, DoesThis) { ... }\n\nin order to define a test.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/cmake/Config.cmake.in",
    "content": "@PACKAGE_INIT@\ninclude(CMakeFindDependencyMacro)\nif (@GTEST_HAS_PTHREAD@)\n  set(THREADS_PREFER_PTHREAD_FLAG @THREADS_PREFER_PTHREAD_FLAG@)\n  find_dependency(Threads)\nendif()\n\ninclude(\"${CMAKE_CURRENT_LIST_DIR}/@targets_export_name@.cmake\")\ncheck_required_components(\"@project_name@\")\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/cmake/gtest.pc.in",
    "content": "libdir=@CMAKE_INSTALL_FULL_LIBDIR@\nincludedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@\n\nName: gtest\nDescription: GoogleTest (without main() function)\nVersion: @PROJECT_VERSION@\nURL: https://github.com/google/googletest\nLibs: -L${libdir} -lgtest @CMAKE_THREAD_LIBS_INIT@\nCflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ @CMAKE_THREAD_LIBS_INIT@\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/cmake/gtest_main.pc.in",
    "content": "libdir=@CMAKE_INSTALL_FULL_LIBDIR@\nincludedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@\n\nName: gtest_main\nDescription: GoogleTest (with main() function)\nVersion: @PROJECT_VERSION@\nURL: https://github.com/google/googletest\nRequires: gtest\nLibs: -L${libdir} -lgtest_main @CMAKE_THREAD_LIBS_INIT@\nCflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ @CMAKE_THREAD_LIBS_INIT@\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/cmake/internal_utils.cmake",
    "content": "# Defines functions and macros useful for building Google Test and\n# Google Mock.\n#\n# Note:\n#\n# - This file will be run twice when building Google Mock (once via\n#   Google Test's CMakeLists.txt, and once via Google Mock's).\n#   Therefore it shouldn't have any side effects other than defining\n#   the functions and macros.\n#\n# - The functions/macros defined in this file may depend on Google\n#   Test and Google Mock's option() definitions, and thus must be\n#   called *after* the options have been defined.\n\n# Tweaks CMake's default compiler/linker settings to suit Google Test's needs.\n#\n# This must be a macro(), as inside a function string() can only\n# update variables in the function scope.\nmacro(fix_default_compiler_settings_)\n  if (MSVC)\n    # For MSVC, CMake sets certain flags to defaults we want to override.\n    # This replacement code is taken from sample in the CMake Wiki at\n    # https://gitlab.kitware.com/cmake/community/wikis/FAQ#dynamic-replace.\n    foreach (flag_var\n             CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE\n             CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)\n      if (NOT BUILD_SHARED_LIBS AND NOT gtest_force_shared_crt)\n        # When Google Test is built as a shared library, it should also use\n        # shared runtime libraries.  Otherwise, it may end up with multiple\n        # copies of runtime library data in different modules, resulting in\n        # hard-to-find crashes. When it is built as a static library, it is\n        # preferable to use CRT as static libraries, as we don't have to rely\n        # on CRT DLLs being available. CMake always defaults to using shared\n        # CRT libraries, so we override that default here.\n        string(REPLACE \"/MD\" \"-MT\" ${flag_var} \"${${flag_var}}\")\n      endif()\n\n      # We prefer more strict warning checking for building Google Test.\n      # Replaces /W3 with /W4 in defaults.\n      string(REPLACE \"/W3\" \"/W4\" ${flag_var} \"${${flag_var}}\")\n\n      # Prevent D9025 warning for targets that have exception handling\n      # turned off (/EHs-c- flag). Where required, exceptions are explicitly\n      # re-enabled using the cxx_exception_flags variable.\n      string(REPLACE \"/EHsc\" \"\" ${flag_var} \"${${flag_var}}\")\n    endforeach()\n  endif()\nendmacro()\n\n# Defines the compiler/linker flags used to build Google Test and\n# Google Mock.  You can tweak these definitions to suit your need.  A\n# variable's value is empty before it's explicitly assigned to.\nmacro(config_compiler_and_linker)\n  # Note: pthreads on MinGW is not supported, even if available\n  # instead, we use windows threading primitives\n  unset(GTEST_HAS_PTHREAD)\n  if (NOT gtest_disable_pthreads AND NOT MINGW)\n    # Defines CMAKE_USE_PTHREADS_INIT and CMAKE_THREAD_LIBS_INIT.\n    set(THREADS_PREFER_PTHREAD_FLAG ON)\n    find_package(Threads)\n    if (CMAKE_USE_PTHREADS_INIT)\n      set(GTEST_HAS_PTHREAD ON)\n    endif()\n  endif()\n\n  fix_default_compiler_settings_()\n  if (MSVC)\n    # Newlines inside flags variables break CMake's NMake generator.\n    # TODO(vladl@google.com): Add -RTCs and -RTCu to debug builds.\n    set(cxx_base_flags \"-GS -W4 -WX -wd4251 -wd4275 -nologo -J -Zi\")\n    if (MSVC_VERSION LESS 1400)  # 1400 is Visual Studio 2005\n      # Suppress spurious warnings MSVC 7.1 sometimes issues.\n      # Forcing value to bool.\n      set(cxx_base_flags \"${cxx_base_flags} -wd4800\")\n      # Copy constructor and assignment operator could not be generated.\n      set(cxx_base_flags \"${cxx_base_flags} -wd4511 -wd4512\")\n      # Compatibility warnings not applicable to Google Test.\n      # Resolved overload was found by argument-dependent lookup.\n      set(cxx_base_flags \"${cxx_base_flags} -wd4675\")\n    endif()\n    if (MSVC_VERSION LESS 1500)  # 1500 is Visual Studio 2008\n      # Conditional expression is constant.\n      # When compiling with /W4, we get several instances of C4127\n      # (Conditional expression is constant). In our code, we disable that\n      # warning on a case-by-case basis. However, on Visual Studio 2005,\n      # the warning fires on std::list. Therefore on that compiler and earlier,\n      # we disable the warning project-wide.\n      set(cxx_base_flags \"${cxx_base_flags} -wd4127\")\n    endif()\n    if (NOT (MSVC_VERSION LESS 1700))  # 1700 is Visual Studio 2012.\n      # Suppress \"unreachable code\" warning on VS 2012 and later.\n      # http://stackoverflow.com/questions/3232669 explains the issue.\n      set(cxx_base_flags \"${cxx_base_flags} -wd4702\")\n    endif()\n\n    set(cxx_base_flags \"${cxx_base_flags} -D_UNICODE -DUNICODE -DWIN32 -D_WIN32\")\n    set(cxx_base_flags \"${cxx_base_flags} -DSTRICT -DWIN32_LEAN_AND_MEAN\")\n    set(cxx_exception_flags \"-EHsc -D_HAS_EXCEPTIONS=1\")\n    set(cxx_no_exception_flags \"-EHs-c- -D_HAS_EXCEPTIONS=0\")\n    set(cxx_no_rtti_flags \"-GR-\")\n  elseif (CMAKE_COMPILER_IS_GNUCXX)\n    set(cxx_base_flags \"-Wall -Wshadow -Werror\")\n    if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0.0)\n      set(cxx_base_flags \"${cxx_base_flags} -Wno-error=dangling-else\")\n    endif()\n    set(cxx_exception_flags \"-fexceptions\")\n    set(cxx_no_exception_flags \"-fno-exceptions\")\n    # Until version 4.3.2, GCC doesn't define a macro to indicate\n    # whether RTTI is enabled.  Therefore we define GTEST_HAS_RTTI\n    # explicitly.\n    set(cxx_no_rtti_flags \"-fno-rtti -DGTEST_HAS_RTTI=0\")\n    set(cxx_strict_flags\n      \"-Wextra -Wno-unused-parameter -Wno-missing-field-initializers\")\n  elseif (CMAKE_CXX_COMPILER_ID STREQUAL \"SunPro\")\n    set(cxx_exception_flags \"-features=except\")\n    # Sun Pro doesn't provide macros to indicate whether exceptions and\n    # RTTI are enabled, so we define GTEST_HAS_* explicitly.\n    set(cxx_no_exception_flags \"-features=no%except -DGTEST_HAS_EXCEPTIONS=0\")\n    set(cxx_no_rtti_flags \"-features=no%rtti -DGTEST_HAS_RTTI=0\")\n  elseif (CMAKE_CXX_COMPILER_ID STREQUAL \"VisualAge\" OR\n      CMAKE_CXX_COMPILER_ID STREQUAL \"XL\")\n    # CMake 2.8 changes Visual Age's compiler ID to \"XL\".\n    set(cxx_exception_flags \"-qeh\")\n    set(cxx_no_exception_flags \"-qnoeh\")\n    # Until version 9.0, Visual Age doesn't define a macro to indicate\n    # whether RTTI is enabled.  Therefore we define GTEST_HAS_RTTI\n    # explicitly.\n    set(cxx_no_rtti_flags \"-qnortti -DGTEST_HAS_RTTI=0\")\n  elseif (CMAKE_CXX_COMPILER_ID STREQUAL \"HP\")\n    set(cxx_base_flags \"-AA -mt\")\n    set(cxx_exception_flags \"-DGTEST_HAS_EXCEPTIONS=1\")\n    set(cxx_no_exception_flags \"+noeh -DGTEST_HAS_EXCEPTIONS=0\")\n    # RTTI can not be disabled in HP aCC compiler.\n    set(cxx_no_rtti_flags \"\")\n  endif()\n\n  # The pthreads library is available and allowed?\n  if (DEFINED GTEST_HAS_PTHREAD)\n    set(GTEST_HAS_PTHREAD_MACRO \"-DGTEST_HAS_PTHREAD=1\")\n  else()\n    set(GTEST_HAS_PTHREAD_MACRO \"-DGTEST_HAS_PTHREAD=0\")\n  endif()\n  set(cxx_base_flags \"${cxx_base_flags} ${GTEST_HAS_PTHREAD_MACRO}\")\n\n  # For building gtest's own tests and samples.\n  set(cxx_exception \"${cxx_base_flags} ${cxx_exception_flags}\")\n  set(cxx_no_exception\n    \"${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_no_exception_flags}\")\n  set(cxx_default \"${cxx_exception}\")\n  set(cxx_no_rtti \"${cxx_default} ${cxx_no_rtti_flags}\")\n  set(cxx_use_own_tuple \"${cxx_default} -DGTEST_USE_OWN_TR1_TUPLE=1\")\n\n  # For building the gtest libraries.\n  set(cxx_strict \"${cxx_default} ${cxx_strict_flags}\")\nendmacro()\n\n# Defines the gtest & gtest_main libraries.  User tests should link\n# with one of them.\nfunction(cxx_library_with_type name type cxx_flags)\n  # type can be either STATIC or SHARED to denote a static or shared library.\n  # ARGN refers to additional arguments after 'cxx_flags'.\n  add_library(${name} ${type} ${ARGN})\n  set_target_properties(${name}\n    PROPERTIES\n    COMPILE_FLAGS \"${cxx_flags}\")\n  # Generate debug library name with a postfix.\n  set_target_properties(${name}\n    PROPERTIES\n    DEBUG_POSTFIX \"d\")\n  if (BUILD_SHARED_LIBS OR type STREQUAL \"SHARED\")\n    set_target_properties(${name}\n      PROPERTIES\n      COMPILE_DEFINITIONS \"GTEST_CREATE_SHARED_LIBRARY=1\")\n    if (NOT \"${CMAKE_VERSION}\" VERSION_LESS \"2.8.11\")\n      target_compile_definitions(${name} INTERFACE\n        $<INSTALL_INTERFACE:GTEST_LINKED_AS_SHARED_LIBRARY=1>)\n    endif()\n  endif()\n  if (DEFINED GTEST_HAS_PTHREAD)\n    if (\"${CMAKE_VERSION}\" VERSION_LESS \"3.1.0\")\n      set(threads_spec ${CMAKE_THREAD_LIBS_INIT})\n    else()\n      set(threads_spec Threads::Threads)\n    endif()\n    target_link_libraries(${name} PUBLIC ${threads_spec})\n  endif()\nendfunction()\n\n########################################################################\n#\n# Helper functions for creating build targets.\n\nfunction(cxx_shared_library name cxx_flags)\n  cxx_library_with_type(${name} SHARED \"${cxx_flags}\" ${ARGN})\nendfunction()\n\nfunction(cxx_library name cxx_flags)\n  cxx_library_with_type(${name} \"\" \"${cxx_flags}\" ${ARGN})\nendfunction()\n\n# cxx_executable_with_flags(name cxx_flags libs srcs...)\n#\n# creates a named C++ executable that depends on the given libraries and\n# is built from the given source files with the given compiler flags.\nfunction(cxx_executable_with_flags name cxx_flags libs)\n  add_executable(${name} ${ARGN})\n  if (MSVC AND (NOT (MSVC_VERSION LESS 1700)))  # 1700 is Visual Studio 2012.\n    # BigObj required for tests.\n    set(cxx_flags \"${cxx_flags} -bigobj\")\n  endif()\n  if (cxx_flags)\n    set_target_properties(${name}\n      PROPERTIES\n      COMPILE_FLAGS \"${cxx_flags}\")\n  endif()\n  if (BUILD_SHARED_LIBS)\n    set_target_properties(${name}\n      PROPERTIES\n      COMPILE_DEFINITIONS \"GTEST_LINKED_AS_SHARED_LIBRARY=1\")\n  endif()\n  # To support mixing linking in static and dynamic libraries, link each\n  # library in with an extra call to target_link_libraries.\n  foreach (lib \"${libs}\")\n    target_link_libraries(${name} ${lib})\n  endforeach()\nendfunction()\n\n# cxx_executable(name dir lib srcs...)\n#\n# creates a named target that depends on the given libs and is built\n# from the given source files.  dir/name.cc is implicitly included in\n# the source file list.\nfunction(cxx_executable name dir libs)\n  cxx_executable_with_flags(\n    ${name} \"${cxx_default}\" \"${libs}\" \"${dir}/${name}.cc\" ${ARGN})\nendfunction()\n\n# Sets PYTHONINTERP_FOUND and PYTHON_EXECUTABLE.\nfind_package(PythonInterp)\n\n# cxx_test_with_flags(name cxx_flags libs srcs...)\n#\n# creates a named C++ test that depends on the given libs and is built\n# from the given source files with the given compiler flags.\nfunction(cxx_test_with_flags name cxx_flags libs)\n  cxx_executable_with_flags(${name} \"${cxx_flags}\" \"${libs}\" ${ARGN})\n  add_test(NAME ${name} COMMAND ${name})\nendfunction()\n\n# cxx_test(name libs srcs...)\n#\n# creates a named test target that depends on the given libs and is\n# built from the given source files.  Unlike cxx_test_with_flags,\n# test/name.cc is already implicitly included in the source file list.\nfunction(cxx_test name libs)\n  cxx_test_with_flags(\"${name}\" \"${cxx_default}\" \"${libs}\"\n    \"test/${name}.cc\" ${ARGN})\nendfunction()\n\n# py_test(name)\n#\n# creates a Python test with the given name whose main module is in\n# test/name.py.  It does nothing if Python is not installed.\nfunction(py_test name)\n  if (PYTHONINTERP_FOUND)\n    if (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 3.1)\n      if (CMAKE_CONFIGURATION_TYPES)\n\t# Multi-configuration build generators as for Visual Studio save\n\t# output in a subdirectory of CMAKE_CURRENT_BINARY_DIR (Debug,\n\t# Release etc.), so we have to provide it here.\n        add_test(\n          NAME ${name}\n          COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/${name}.py\n              --build_dir=${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG> ${ARGN})\n      else (CMAKE_CONFIGURATION_TYPES)\n\t# Single-configuration build generators like Makefile generators\n\t# don't have subdirs below CMAKE_CURRENT_BINARY_DIR.\n        add_test(\n          NAME ${name}\n          COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/${name}.py\n              --build_dir=${CMAKE_CURRENT_BINARY_DIR} ${ARGN})\n      endif (CMAKE_CONFIGURATION_TYPES)\n    else (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 3.1)\n      # ${CMAKE_CURRENT_BINARY_DIR} is known at configuration time, so we can\n      # directly bind it from cmake. ${CTEST_CONFIGURATION_TYPE} is known\n      # only at ctest runtime (by calling ctest -c <Configuration>), so\n      # we have to escape $ to delay variable substitution here.\n      add_test(\n        ${name}\n        ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/${name}.py\n          --build_dir=${CMAKE_CURRENT_BINARY_DIR}/\\${CTEST_CONFIGURATION_TYPE} ${ARGN})\n    endif (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 3.1)\n  endif(PYTHONINTERP_FOUND)\nendfunction()\n\n# install_project(targets...)\n#\n# Installs the specified targets and configures the associated pkgconfig files.\nfunction(install_project)\n  if(INSTALL_GTEST)\n    install(DIRECTORY \"${PROJECT_SOURCE_DIR}/include/\"\n      DESTINATION \"${CMAKE_INSTALL_INCLUDEDIR}\")\n    # Install the project targets.\n    install(TARGETS ${ARGN}\n      EXPORT ${targets_export_name}\n      RUNTIME DESTINATION \"${CMAKE_INSTALL_BINDIR}\"\n      ARCHIVE DESTINATION \"${CMAKE_INSTALL_LIBDIR}\"\n      LIBRARY DESTINATION \"${CMAKE_INSTALL_LIBDIR}\")\n    # Configure and install pkgconfig files.\n    foreach(t ${ARGN})\n      set(configured_pc \"${generated_dir}/${t}.pc\")\n      configure_file(\"${PROJECT_SOURCE_DIR}/cmake/${t}.pc.in\"\n        \"${configured_pc}\" @ONLY)\n      install(FILES \"${configured_pc}\"\n        DESTINATION \"${CMAKE_INSTALL_LIBDIR}/pkgconfig\")\n    endforeach()\n  endif()\nendfunction()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/codegear/gtest.cbproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <ProjectGuid>{bca37a72-5b07-46cf-b44e-89f8e06451a2}</ProjectGuid>\n    <Config Condition=\"'$(Config)'==''\">Release</Config>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Config)'=='Base' or '$(Base)'!=''\">\n    <Base>true</Base>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Config)'=='Debug' or '$(Cfg_1)'!=''\">\n    <Base>true</Base>\n    <Cfg_1>true</Cfg_1>\n    <CfgParent>Base</CfgParent>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Config)'=='Release' or '$(Cfg_2)'!=''\">\n    <Base>true</Base>\n    <Cfg_2>true</Cfg_2>\n    <CfgParent>Base</CfgParent>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Base)'!=''\">\n    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>\n    <OutputExt>lib</OutputExt>\n    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>\n    <Defines>NO_STRICT</Defines>\n    <DynamicRTL>true</DynamicRTL>\n    <UsePackages>true</UsePackages>\n    <ProjectType>CppStaticLibrary</ProjectType>\n    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>\n    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi;GR32_BDS2006.bpi;GR32_DSGN_BDS2006.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi;CExceptionExpert11.bpi</PackageImports>\n    <BCC_wpar>false</BCC_wpar>\n    <IncludePath>$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\src;..\\include;..</IncludePath>\n    <AllPackageLibs>rtl.lib;vcl.lib</AllPackageLibs>\n    <TLIB_PageSize>32</TLIB_PageSize>\n    <ILINK_LibraryPath>$(BDS)\\lib;$(BDS)\\lib\\obj;$(BDS)\\lib\\psdk</ILINK_LibraryPath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Cfg_1)'!=''\">\n    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>\n    <DCC_Optimize>false</DCC_Optimize>\n    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>\n    <Defines>_DEBUG;$(Defines)</Defines>\n    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>\n    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>\n    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>\n    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>\n    <DCC_Define>DEBUG</DCC_Define>\n    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>\n    <IntermediateOutputDir>Debug</IntermediateOutputDir>\n    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>\n    <BCC_StackFrames>true</BCC_StackFrames>\n    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>\n    <ILINK_LibraryPath>$(BDS)\\lib\\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>\n    <TASM_Debugging>Full</TASM_Debugging>\n    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Cfg_2)'!=''\">\n    <Defines>NDEBUG;$(Defines)</Defines>\n    <IntermediateOutputDir>Release</IntermediateOutputDir>\n    <ILINK_LibraryPath>$(BDS)\\lib\\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>\n    <TASM_Debugging>None</TASM_Debugging>\n  </PropertyGroup>\n  <ProjectExtensions>\n    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>\n    <Borland.ProjectType>CppStaticLibrary</Borland.ProjectType>\n    <BorlandProject>\n<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name=\"IncludeVerInfo\">False</VersionInfo><VersionInfo Name=\"AutoIncBuild\">False</VersionInfo><VersionInfo Name=\"MajorVer\">1</VersionInfo><VersionInfo Name=\"MinorVer\">0</VersionInfo><VersionInfo Name=\"Release\">0</VersionInfo><VersionInfo Name=\"Build\">0</VersionInfo><VersionInfo Name=\"Debug\">False</VersionInfo><VersionInfo Name=\"PreRelease\">False</VersionInfo><VersionInfo Name=\"Special\">False</VersionInfo><VersionInfo Name=\"Private\">False</VersionInfo><VersionInfo Name=\"DLL\">False</VersionInfo><VersionInfo Name=\"Locale\">1033</VersionInfo><VersionInfo Name=\"CodePage\">1252</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name=\"CompanyName\"></VersionInfoKeys><VersionInfoKeys Name=\"FileDescription\"></VersionInfoKeys><VersionInfoKeys Name=\"FileVersion\">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name=\"InternalName\"></VersionInfoKeys><VersionInfoKeys Name=\"LegalCopyright\"></VersionInfoKeys><VersionInfoKeys Name=\"LegalTrademarks\"></VersionInfoKeys><VersionInfoKeys Name=\"OriginalFilename\"></VersionInfoKeys><VersionInfoKeys Name=\"ProductName\"></VersionInfoKeys><VersionInfoKeys Name=\"ProductVersion\">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name=\"Comments\"></VersionInfoKeys></VersionInfoKeys><Debugging><Debugging Name=\"DebugSourceDirs\"></Debugging></Debugging><Parameters><Parameters Name=\"RunParams\"></Parameters><Parameters Name=\"Launcher\"></Parameters><Parameters Name=\"UseLauncher\">False</Parameters><Parameters Name=\"DebugCWD\"></Parameters><Parameters Name=\"HostApplication\"></Parameters><Parameters Name=\"RemoteHost\"></Parameters><Parameters Name=\"RemotePath\"></Parameters><Parameters Name=\"RemoteParams\"></Parameters><Parameters Name=\"RemoteLauncher\"></Parameters><Parameters Name=\"UseRemoteLauncher\">False</Parameters><Parameters Name=\"RemoteCWD\"></Parameters><Parameters Name=\"RemoteDebug\">False</Parameters><Parameters Name=\"Debug Symbols Search Path\"></Parameters><Parameters Name=\"LoadAllSymbols\">True</Parameters><Parameters Name=\"LoadUnspecifiedSymbols\">False</Parameters></Parameters><Excluded_Packages>\n      \n      \n      <Excluded_Packages Name=\"$(BDS)\\bin\\bcboffice2k100.bpl\">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>\n      <Excluded_Packages Name=\"$(BDS)\\bin\\bcbofficexp100.bpl\">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>\n    </Excluded_Packages><Linker><Linker Name=\"LibPrefix\"></Linker><Linker Name=\"LibSuffix\"></Linker><Linker Name=\"LibVersion\"></Linker></Linker><ProjectProperties><ProjectProperties Name=\"AutoShowDeps\">False</ProjectProperties><ProjectProperties Name=\"ManagePaths\">True</ProjectProperties><ProjectProperties Name=\"VerifyPackages\">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Count\">3</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item0\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\src;..\\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item1\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\src;..\\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item2\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\src;..\\src;..\\include</HistoryLists_hlIncludePath></HistoryLists_hlIncludePath><HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name=\"Count\">1</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name=\"Item0\">$(BDS)\\lib;$(BDS)\\lib\\obj;$(BDS)\\lib\\psdk</HistoryLists_hlILINK_LibraryPath></HistoryLists_hlILINK_LibraryPath><HistoryLists_hlDefines><HistoryLists_hlDefines Name=\"Count\">1</HistoryLists_hlDefines><HistoryLists_hlDefines Name=\"Item0\">NO_STRICT</HistoryLists_hlDefines></HistoryLists_hlDefines><HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name=\"Count\">1</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name=\"Item0\">32</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name=\"Item1\">16</HistoryLists_hlTLIB_PageSize></HistoryLists_hlTLIB_PageSize></CPlusPlusBuilder.Personality></BorlandProject></BorlandProject>\n  </ProjectExtensions>\n  <Import Project=\"$(MSBuildBinPath)\\Borland.Cpp.Targets\" />\n  <ItemGroup>\n    <None Include=\"..\\include\\gtest\\gtest-death-test.h\">\n      <BuildOrder>3</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\gtest-message.h\">\n      <BuildOrder>4</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\gtest-param-test.h\">\n      <BuildOrder>5</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\gtest-spi.h\">\n      <BuildOrder>6</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\gtest-test-part.h\">\n      <BuildOrder>7</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\gtest-typed-test.h\">\n      <BuildOrder>8</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\gtest.h\">\n      <BuildOrder>0</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\gtest_pred_impl.h\">\n      <BuildOrder>1</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\gtest_prod.h\">\n      <BuildOrder>2</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\internal\\gtest-death-test-internal.h\">\n      <BuildOrder>9</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\internal\\gtest-filepath.h\">\n      <BuildOrder>10</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\internal\\gtest-internal.h\">\n      <BuildOrder>11</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\internal\\gtest-linked_ptr.h\">\n      <BuildOrder>12</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\internal\\gtest-param-util-generated.h\">\n      <BuildOrder>14</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\internal\\gtest-param-util.h\">\n      <BuildOrder>13</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\internal\\gtest-port.h\">\n      <BuildOrder>15</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\internal\\gtest-string.h\">\n      <BuildOrder>16</BuildOrder>\n    </None>\n    <None Include=\"..\\include\\gtest\\internal\\gtest-type-util.h\">\n      <BuildOrder>17</BuildOrder>\n    </None>\n    <CppCompile Include=\"gtest_all.cc\">\n      <BuildOrder>18</BuildOrder>\n    </CppCompile>\n    <BuildConfiguration Include=\"Debug\">\n      <Key>Cfg_1</Key>\n    </BuildConfiguration>\n    <BuildConfiguration Include=\"Release\">\n      <Key>Cfg_2</Key>\n    </BuildConfiguration>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/codegear/gtest.groupproj",
    "content": "﻿<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <ProjectGuid>{c1d923e0-6cba-4332-9b6f-3420acbf5091}</ProjectGuid>\n  </PropertyGroup>\n  <ItemGroup />\n  <ItemGroup>\n    <Projects Include=\"gtest.cbproj\" />\n    <Projects Include=\"gtest_main.cbproj\" />\n    <Projects Include=\"gtest_unittest.cbproj\" />\n  </ItemGroup>\n  <ProjectExtensions>\n    <Borland.Personality>Default.Personality</Borland.Personality>\n    <Borland.ProjectType />\n    <BorlandProject>\n<BorlandProject xmlns=\"\"><Default.Personality></Default.Personality></BorlandProject></BorlandProject>\n  </ProjectExtensions>\n  <Target Name=\"gtest\">\n    <MSBuild Projects=\"gtest.cbproj\" Targets=\"\" />\n  </Target>\n  <Target Name=\"gtest:Clean\">\n    <MSBuild Projects=\"gtest.cbproj\" Targets=\"Clean\" />\n  </Target>\n  <Target Name=\"gtest:Make\">\n    <MSBuild Projects=\"gtest.cbproj\" Targets=\"Make\" />\n  </Target>\n  <Target Name=\"gtest_main\">\n    <MSBuild Projects=\"gtest_main.cbproj\" Targets=\"\" />\n  </Target>\n  <Target Name=\"gtest_main:Clean\">\n    <MSBuild Projects=\"gtest_main.cbproj\" Targets=\"Clean\" />\n  </Target>\n  <Target Name=\"gtest_main:Make\">\n    <MSBuild Projects=\"gtest_main.cbproj\" Targets=\"Make\" />\n  </Target>\n  <Target Name=\"gtest_unittest\">\n    <MSBuild Projects=\"gtest_unittest.cbproj\" Targets=\"\" />\n  </Target>\n  <Target Name=\"gtest_unittest:Clean\">\n    <MSBuild Projects=\"gtest_unittest.cbproj\" Targets=\"Clean\" />\n  </Target>\n  <Target Name=\"gtest_unittest:Make\">\n    <MSBuild Projects=\"gtest_unittest.cbproj\" Targets=\"Make\" />\n  </Target>\n  <Target Name=\"Build\">\n    <CallTarget Targets=\"gtest;gtest_main;gtest_unittest\" />\n  </Target>\n  <Target Name=\"Clean\">\n    <CallTarget Targets=\"gtest:Clean;gtest_main:Clean;gtest_unittest:Clean\" />\n  </Target>\n  <Target Name=\"Make\">\n    <CallTarget Targets=\"gtest:Make;gtest_main:Make;gtest_unittest:Make\" />\n  </Target>\n  <Import Condition=\"Exists('$(MSBuildBinPath)\\Borland.Group.Targets')\" Project=\"$(MSBuildBinPath)\\Borland.Group.Targets\" />\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/codegear/gtest_all.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Josh Kelley (joshkel@gmail.com)\n//\n// Google C++ Testing Framework (Google Test)\n//\n// C++Builder's IDE cannot build a static library from files with hyphens\n// in their name.  See http://qc.codegear.com/wc/qcmain.aspx?d=70977 .\n// This file serves as a workaround.\n\n#include \"src/gtest-all.cc\"\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/codegear/gtest_link.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Josh Kelley (joshkel@gmail.com)\n//\n// Google C++ Testing Framework (Google Test)\n//\n// Links gtest.lib and gtest_main.lib into the current project in C++Builder.\n// This means that these libraries can't be renamed, but it's the only way to\n// ensure that Debug versus Release test builds are linked against the\n// appropriate Debug or Release build of the libraries.\n\n#pragma link \"gtest.lib\"\n#pragma link \"gtest_main.lib\"\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/codegear/gtest_main.cbproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <ProjectGuid>{bca37a72-5b07-46cf-b44e-89f8e06451a2}</ProjectGuid>\n    <Config Condition=\"'$(Config)'==''\">Release</Config>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Config)'=='Base' or '$(Base)'!=''\">\n    <Base>true</Base>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Config)'=='Debug' or '$(Cfg_1)'!=''\">\n    <Base>true</Base>\n    <Cfg_1>true</Cfg_1>\n    <CfgParent>Base</CfgParent>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Config)'=='Release' or '$(Cfg_2)'!=''\">\n    <Base>true</Base>\n    <Cfg_2>true</Cfg_2>\n    <CfgParent>Base</CfgParent>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Base)'!=''\">\n    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>\n    <OutputExt>lib</OutputExt>\n    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>\n    <Defines>NO_STRICT</Defines>\n    <DynamicRTL>true</DynamicRTL>\n    <UsePackages>true</UsePackages>\n    <ProjectType>CppStaticLibrary</ProjectType>\n    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>\n    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi;GR32_BDS2006.bpi;GR32_DSGN_BDS2006.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi;CExceptionExpert11.bpi</PackageImports>\n    <BCC_wpar>false</BCC_wpar>\n    <IncludePath>$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\src;..\\include;..</IncludePath>\n    <AllPackageLibs>rtl.lib;vcl.lib</AllPackageLibs>\n    <TLIB_PageSize>32</TLIB_PageSize>\n    <ILINK_LibraryPath>$(BDS)\\lib;$(BDS)\\lib\\obj;$(BDS)\\lib\\psdk</ILINK_LibraryPath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Cfg_1)'!=''\">\n    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>\n    <DCC_Optimize>false</DCC_Optimize>\n    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>\n    <Defines>_DEBUG;$(Defines)</Defines>\n    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>\n    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>\n    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>\n    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>\n    <DCC_Define>DEBUG</DCC_Define>\n    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>\n    <IntermediateOutputDir>Debug</IntermediateOutputDir>\n    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>\n    <BCC_StackFrames>true</BCC_StackFrames>\n    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>\n    <ILINK_LibraryPath>$(BDS)\\lib\\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>\n    <TASM_Debugging>Full</TASM_Debugging>\n    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Cfg_2)'!=''\">\n    <Defines>NDEBUG;$(Defines)</Defines>\n    <IntermediateOutputDir>Release</IntermediateOutputDir>\n    <ILINK_LibraryPath>$(BDS)\\lib\\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>\n    <TASM_Debugging>None</TASM_Debugging>\n  </PropertyGroup>\n  <ProjectExtensions>\n    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>\n    <Borland.ProjectType>CppStaticLibrary</Borland.ProjectType>\n    <BorlandProject>\n<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name=\"IncludeVerInfo\">False</VersionInfo><VersionInfo Name=\"AutoIncBuild\">False</VersionInfo><VersionInfo Name=\"MajorVer\">1</VersionInfo><VersionInfo Name=\"MinorVer\">0</VersionInfo><VersionInfo Name=\"Release\">0</VersionInfo><VersionInfo Name=\"Build\">0</VersionInfo><VersionInfo Name=\"Debug\">False</VersionInfo><VersionInfo Name=\"PreRelease\">False</VersionInfo><VersionInfo Name=\"Special\">False</VersionInfo><VersionInfo Name=\"Private\">False</VersionInfo><VersionInfo Name=\"DLL\">False</VersionInfo><VersionInfo Name=\"Locale\">1033</VersionInfo><VersionInfo Name=\"CodePage\">1252</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name=\"CompanyName\"></VersionInfoKeys><VersionInfoKeys Name=\"FileDescription\"></VersionInfoKeys><VersionInfoKeys Name=\"FileVersion\">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name=\"InternalName\"></VersionInfoKeys><VersionInfoKeys Name=\"LegalCopyright\"></VersionInfoKeys><VersionInfoKeys Name=\"LegalTrademarks\"></VersionInfoKeys><VersionInfoKeys Name=\"OriginalFilename\"></VersionInfoKeys><VersionInfoKeys Name=\"ProductName\"></VersionInfoKeys><VersionInfoKeys Name=\"ProductVersion\">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name=\"Comments\"></VersionInfoKeys></VersionInfoKeys><Debugging><Debugging Name=\"DebugSourceDirs\"></Debugging></Debugging><Parameters><Parameters Name=\"RunParams\"></Parameters><Parameters Name=\"Launcher\"></Parameters><Parameters Name=\"UseLauncher\">False</Parameters><Parameters Name=\"DebugCWD\"></Parameters><Parameters Name=\"HostApplication\"></Parameters><Parameters Name=\"RemoteHost\"></Parameters><Parameters Name=\"RemotePath\"></Parameters><Parameters Name=\"RemoteParams\"></Parameters><Parameters Name=\"RemoteLauncher\"></Parameters><Parameters Name=\"UseRemoteLauncher\">False</Parameters><Parameters Name=\"RemoteCWD\"></Parameters><Parameters Name=\"RemoteDebug\">False</Parameters><Parameters Name=\"Debug Symbols Search Path\"></Parameters><Parameters Name=\"LoadAllSymbols\">True</Parameters><Parameters Name=\"LoadUnspecifiedSymbols\">False</Parameters></Parameters><Excluded_Packages>\n      <Excluded_Packages Name=\"$(BDS)\\bin\\bcboffice2k100.bpl\">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>\n      <Excluded_Packages Name=\"$(BDS)\\bin\\bcbofficexp100.bpl\">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>\n    </Excluded_Packages><Linker><Linker Name=\"LibPrefix\"></Linker><Linker Name=\"LibSuffix\"></Linker><Linker Name=\"LibVersion\"></Linker></Linker><ProjectProperties><ProjectProperties Name=\"AutoShowDeps\">False</ProjectProperties><ProjectProperties Name=\"ManagePaths\">True</ProjectProperties><ProjectProperties Name=\"VerifyPackages\">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Count\">3</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item0\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\src;..\\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item1\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\src;..\\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item2\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\src;..\\src;..\\include</HistoryLists_hlIncludePath></HistoryLists_hlIncludePath><HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name=\"Count\">1</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name=\"Item0\">$(BDS)\\lib;$(BDS)\\lib\\obj;$(BDS)\\lib\\psdk</HistoryLists_hlILINK_LibraryPath></HistoryLists_hlILINK_LibraryPath><HistoryLists_hlDefines><HistoryLists_hlDefines Name=\"Count\">1</HistoryLists_hlDefines><HistoryLists_hlDefines Name=\"Item0\">NO_STRICT</HistoryLists_hlDefines></HistoryLists_hlDefines><HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name=\"Count\">1</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name=\"Item0\">32</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name=\"Item1\">16</HistoryLists_hlTLIB_PageSize></HistoryLists_hlTLIB_PageSize></CPlusPlusBuilder.Personality></BorlandProject></BorlandProject>\n  </ProjectExtensions>\n  <Import Project=\"$(MSBuildBinPath)\\Borland.Cpp.Targets\" />\n  <ItemGroup>\n    <CppCompile Include=\"..\\src\\gtest_main.cc\">\n      <BuildOrder>0</BuildOrder>\n    </CppCompile>\n    <BuildConfiguration Include=\"Debug\">\n      <Key>Cfg_1</Key>\n    </BuildConfiguration>\n    <BuildConfiguration Include=\"Release\">\n      <Key>Cfg_2</Key>\n    </BuildConfiguration>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/codegear/gtest_unittest.cbproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <ProjectGuid>{eea63393-5ac5-4b9c-8909-d75fef2daa41}</ProjectGuid>\n    <Config Condition=\"'$(Config)'==''\">Release</Config>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Config)'=='Base' or '$(Base)'!=''\">\n    <Base>true</Base>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Config)'=='Debug' or '$(Cfg_1)'!=''\">\n    <Base>true</Base>\n    <Cfg_1>true</Cfg_1>\n    <CfgParent>Base</CfgParent>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Config)'=='Release' or '$(Cfg_2)'!=''\">\n    <Base>true</Base>\n    <Cfg_2>true</Cfg_2>\n    <CfgParent>Base</CfgParent>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Base)'!=''\">\n    <OutputExt>exe</OutputExt>\n    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>\n    <Defines>NO_STRICT</Defines>\n    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>\n    <DynamicRTL>true</DynamicRTL>\n    <ILINK_ObjectSearchPath>..\\test</ILINK_ObjectSearchPath>\n    <UsePackages>true</UsePackages>\n    <ProjectType>CppConsoleApplication</ProjectType>\n    <NoVCL>true</NoVCL>\n    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>\n    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi</PackageImports>\n    <BCC_wpar>false</BCC_wpar>\n    <IncludePath>$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\include;..\\test;..</IncludePath>\n    <ILINK_LibraryPath>$(BDS)\\lib;$(BDS)\\lib\\obj;$(BDS)\\lib\\psdk;..\\test</ILINK_LibraryPath>\n    <Multithreaded>true</Multithreaded>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Cfg_1)'!=''\">\n    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>\n    <DCC_Optimize>false</DCC_Optimize>\n    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>\n    <Defines>_DEBUG;$(Defines)</Defines>\n    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>\n    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>\n    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>\n    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>\n    <DCC_Define>DEBUG</DCC_Define>\n    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>\n    <IntermediateOutputDir>Debug</IntermediateOutputDir>\n    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>\n    <BCC_StackFrames>true</BCC_StackFrames>\n    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>\n    <ILINK_LibraryPath>$(BDS)\\lib\\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>\n    <TASM_Debugging>Full</TASM_Debugging>\n    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Cfg_2)'!=''\">\n    <Defines>NDEBUG;$(Defines)</Defines>\n    <IntermediateOutputDir>Release</IntermediateOutputDir>\n    <ILINK_LibraryPath>$(BDS)\\lib\\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>\n    <TASM_Debugging>None</TASM_Debugging>\n  </PropertyGroup>\n  <ProjectExtensions>\n    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>\n    <Borland.ProjectType>CppConsoleApplication</Borland.ProjectType>\n    <BorlandProject>\n<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name=\"IncludeVerInfo\">False</VersionInfo><VersionInfo Name=\"AutoIncBuild\">False</VersionInfo><VersionInfo Name=\"MajorVer\">1</VersionInfo><VersionInfo Name=\"MinorVer\">0</VersionInfo><VersionInfo Name=\"Release\">0</VersionInfo><VersionInfo Name=\"Build\">0</VersionInfo><VersionInfo Name=\"Debug\">False</VersionInfo><VersionInfo Name=\"PreRelease\">False</VersionInfo><VersionInfo Name=\"Special\">False</VersionInfo><VersionInfo Name=\"Private\">False</VersionInfo><VersionInfo Name=\"DLL\">False</VersionInfo><VersionInfo Name=\"Locale\">1033</VersionInfo><VersionInfo Name=\"CodePage\">1252</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name=\"CompanyName\"></VersionInfoKeys><VersionInfoKeys Name=\"FileDescription\"></VersionInfoKeys><VersionInfoKeys Name=\"FileVersion\">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name=\"InternalName\"></VersionInfoKeys><VersionInfoKeys Name=\"LegalCopyright\"></VersionInfoKeys><VersionInfoKeys Name=\"LegalTrademarks\"></VersionInfoKeys><VersionInfoKeys Name=\"OriginalFilename\"></VersionInfoKeys><VersionInfoKeys Name=\"ProductName\"></VersionInfoKeys><VersionInfoKeys Name=\"ProductVersion\">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name=\"Comments\"></VersionInfoKeys></VersionInfoKeys><Debugging><Debugging Name=\"DebugSourceDirs\"></Debugging></Debugging><Parameters><Parameters Name=\"RunParams\"></Parameters><Parameters Name=\"Launcher\"></Parameters><Parameters Name=\"UseLauncher\">False</Parameters><Parameters Name=\"DebugCWD\"></Parameters><Parameters Name=\"HostApplication\"></Parameters><Parameters Name=\"RemoteHost\"></Parameters><Parameters Name=\"RemotePath\"></Parameters><Parameters Name=\"RemoteParams\"></Parameters><Parameters Name=\"RemoteLauncher\"></Parameters><Parameters Name=\"UseRemoteLauncher\">False</Parameters><Parameters Name=\"RemoteCWD\"></Parameters><Parameters Name=\"RemoteDebug\">False</Parameters><Parameters Name=\"Debug Symbols Search Path\"></Parameters><Parameters Name=\"LoadAllSymbols\">True</Parameters><Parameters Name=\"LoadUnspecifiedSymbols\">False</Parameters></Parameters><Excluded_Packages>\n      \n      \n      <Excluded_Packages Name=\"$(BDS)\\bin\\bcboffice2k100.bpl\">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>\n      <Excluded_Packages Name=\"$(BDS)\\bin\\bcbofficexp100.bpl\">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>\n    </Excluded_Packages><Linker><Linker Name=\"LibPrefix\"></Linker><Linker Name=\"LibSuffix\"></Linker><Linker Name=\"LibVersion\"></Linker></Linker><ProjectProperties><ProjectProperties Name=\"AutoShowDeps\">False</ProjectProperties><ProjectProperties Name=\"ManagePaths\">True</ProjectProperties><ProjectProperties Name=\"VerifyPackages\">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Count\">3</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item0\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\include;..\\test;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item1\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\include;..\\test</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item2\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\include</HistoryLists_hlIncludePath></HistoryLists_hlIncludePath><HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name=\"Count\">1</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name=\"Item0\">$(BDS)\\lib;$(BDS)\\lib\\obj;$(BDS)\\lib\\psdk;..\\test</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name=\"Item1\">$(BDS)\\lib;$(BDS)\\lib\\obj;$(BDS)\\lib\\psdk;..\\test</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name=\"Item2\">$(BDS)\\lib;$(BDS)\\lib\\obj;$(BDS)\\lib\\psdk;$(OUTPUTDIR);..\\test</HistoryLists_hlILINK_LibraryPath></HistoryLists_hlILINK_LibraryPath><HistoryLists_hlDefines><HistoryLists_hlDefines Name=\"Count\">2</HistoryLists_hlDefines><HistoryLists_hlDefines Name=\"Item0\">NO_STRICT</HistoryLists_hlDefines><HistoryLists_hlDefines Name=\"Item1\">STRICT</HistoryLists_hlDefines></HistoryLists_hlDefines></CPlusPlusBuilder.Personality></BorlandProject></BorlandProject>\n  </ProjectExtensions>\n  <Import Project=\"$(MSBuildBinPath)\\Borland.Cpp.Targets\" />\n  <ItemGroup>\n    <CppCompile Include=\"..\\test\\gtest_unittest.cc\">\n      <BuildOrder>0</BuildOrder>\n    </CppCompile>\n    <CppCompile Include=\"gtest_link.cc\">\n      <BuildOrder>1</BuildOrder>\n    </CppCompile>\n    <BuildConfiguration Include=\"Debug\">\n      <Key>Cfg_1</Key>\n    </BuildConfiguration>\n    <BuildConfiguration Include=\"Release\">\n      <Key>Cfg_2</Key>\n    </BuildConfiguration>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/configure.ac",
    "content": "m4_include(m4/acx_pthread.m4)\n\n# At this point, the Xcode project assumes the version string will be three\n# integers separated by periods and surrounded by square brackets (e.g.\n# \"[1.0.1]\"). It also asumes that there won't be any closing parenthesis\n# between \"AC_INIT(\" and the closing \")\" including comments and strings.\nAC_INIT([Google C++ Testing Framework],\n        [1.8.0],\n        [googletestframework@googlegroups.com],\n        [gtest])\n\n# Provide various options to initialize the Autoconf and configure processes.\nAC_PREREQ([2.59])\nAC_CONFIG_SRCDIR([./LICENSE])\nAC_CONFIG_MACRO_DIR([m4])\nAC_CONFIG_AUX_DIR([build-aux])\nAC_CONFIG_HEADERS([build-aux/config.h])\nAC_CONFIG_FILES([Makefile])\nAC_CONFIG_FILES([scripts/gtest-config], [chmod +x scripts/gtest-config])\n\n# Initialize Automake with various options. We require at least v1.9, prevent\n# pedantic complaints about package files, and enable various distribution\n# targets.\nAM_INIT_AUTOMAKE([1.9 dist-bzip2 dist-zip foreign subdir-objects])\n\n# Check for programs used in building Google Test.\nAC_PROG_CC\nAC_PROG_CXX\nAC_LANG([C++])\nAC_PROG_LIBTOOL\n\n# TODO(chandlerc@google.com): Currently we aren't running the Python tests\n# against the interpreter detected by AM_PATH_PYTHON, and so we condition\n# HAVE_PYTHON by requiring \"python\" to be in the PATH, and that interpreter's\n# version to be >= 2.3. This will allow the scripts to use a \"/usr/bin/env\"\n# hashbang.\nPYTHON=  # We *do not* allow the user to specify a python interpreter\nAC_PATH_PROG([PYTHON],[python],[:])\nAS_IF([test \"$PYTHON\" != \":\"],\n      [AM_PYTHON_CHECK_VERSION([$PYTHON],[2.3],[:],[PYTHON=\":\"])])\nAM_CONDITIONAL([HAVE_PYTHON],[test \"$PYTHON\" != \":\"])\n\n# Configure pthreads.\nAC_ARG_WITH([pthreads],\n            [AS_HELP_STRING([--with-pthreads],\n               [use pthreads (default is yes)])],\n            [with_pthreads=$withval],\n            [with_pthreads=check])\n\nhave_pthreads=no\nAS_IF([test \"x$with_pthreads\" != \"xno\"],\n      [ACX_PTHREAD(\n        [],\n        [AS_IF([test \"x$with_pthreads\" != \"xcheck\"],\n               [AC_MSG_FAILURE(\n                 [--with-pthreads was specified, but unable to be used])])])\n       have_pthreads=\"$acx_pthread_ok\"])\nAM_CONDITIONAL([HAVE_PTHREADS],[test \"x$have_pthreads\" = \"xyes\"])\nAC_SUBST(PTHREAD_CFLAGS)\nAC_SUBST(PTHREAD_LIBS)\n\n# TODO(chandlerc@google.com) Check for the necessary system headers.\n\n# TODO(chandlerc@google.com) Check the types, structures, and other compiler\n# and architecture characteristics.\n\n# Output the generated files. No further autoconf macros may be used.\nAC_OUTPUT\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/docs/Pkgconfig.md",
    "content": "## Using GoogleTest from various build systems ##\n\nGoogleTest comes with pkg-config files that can be used to determine all\nnecessary flags for compiling and linking to GoogleTest (and GoogleMock).\nPkg-config is a standardised plain-text format containing\n\n  * the includedir (-I) path\n  * necessary macro (-D) definitions\n  * further required flags (-pthread)\n  * the library (-L) path\n  * the library (-l) to link to\n\nAll current build systems support pkg-config in one way or another. For\nall examples here we assume you want to compile the sample\n`samples/sample3_unittest.cc`.\n\n\n### CMake ###\n\nUsing `pkg-config` in CMake is fairly easy:\n\n```\ncmake_minimum_required(VERSION 3.0)\n\ncmake_policy(SET CMP0048 NEW)\nproject(my_gtest_pkgconfig VERSION 0.0.1 LANGUAGES CXX)\n\nfind_package(PkgConfig)\npkg_search_module(GTEST REQUIRED gtest_main)\n\nadd_executable(testapp samples/sample3_unittest.cc)\ntarget_link_libraries(testapp ${GTEST_LDFLAGS})\ntarget_compile_options(testapp PUBLIC ${GTEST_CFLAGS})\n\ninclude(CTest)\nadd_test(first_and_only_test testapp)\n```\n\nIt is generally recommended that you use `target_compile_options` + `_CFLAGS`\nover `target_include_directories` + `_INCLUDE_DIRS` as the former includes not\njust -I flags (GoogleTest might require a macro indicating to internal headers\nthat all libraries have been compiled with threading enabled. In addition,\nGoogleTest might also require `-pthread` in the compiling step, and as such\nsplitting the pkg-config `Cflags` variable into include dirs and macros for\n`target_compile_definitions()` might still miss this). The same recommendation\ngoes for using `_LDFLAGS` over the more commonplace `_LIBRARIES`, which\nhappens to discard `-L` flags and `-pthread`.\n\n\n### Autotools ###\n\nFinding GoogleTest in Autoconf and using it from Automake is also fairly easy:\n\nIn your `configure.ac`:\n\n```\nAC_PREREQ([2.69])\nAC_INIT([my_gtest_pkgconfig], [0.0.1])\nAC_CONFIG_SRCDIR([samples/sample3_unittest.cc])\nAC_PROG_CXX\n\nPKG_CHECK_MODULES([GTEST], [gtest_main])\n\nAM_INIT_AUTOMAKE([foreign subdir-objects])\nAC_CONFIG_FILES([Makefile])\nAC_OUTPUT\n```\n\nand in your `Makefile.am`:\n\n```\ncheck_PROGRAMS = testapp\nTESTS = $(check_PROGRAMS)\n\ntestapp_SOURCES = samples/sample3_unittest.cc\ntestapp_CXXFLAGS = $(GTEST_CFLAGS)\ntestapp_LDADD = $(GTEST_LIBS)\n```\n\n\n### Meson ###\n\nMeson natively uses pkgconfig to query dependencies:\n\n```\nproject('my_gtest_pkgconfig', 'cpp', version : '0.0.1')\n\ngtest_dep = dependency('gtest_main')\n\ntestapp = executable(\n  'testapp',\n  files(['samples/sample3_unittest.cc']),\n  dependencies : gtest_dep,\n  install : false)\n\ntest('first_and_only_test', testapp)\n```\n\n\n### Plain Makefiles ###\n\nSince `pkg-config` is a small Unix command-line utility, it can be used\nin handwritten `Makefile`s too:\n\n```\nGTEST_CFLAGS = `pkg-config --cflags gtest_main`\nGTEST_LIBS = `pkg-config --libs gtest_main`\n\n.PHONY: tests all\n\ntests: all\n\t./testapp\n\nall: testapp\n\ntestapp: testapp.o\n\t$(CXX) $(CXXFLAGS) $(LDFLAGS) $< -o $@ $(GTEST_LIBS)\n\ntestapp.o: samples/sample3_unittest.cc\n\t$(CXX) $(CPPFLAGS) $(CXXFLAGS) $< -c -o $@ $(GTEST_CFLAGS)\n```\n\n\n### Help! pkg-config can't find GoogleTest! ###\n\nLet's say you have a `CMakeLists.txt` along the lines of the one in this\ntutorial and you try to run `cmake`. It is very possible that you get a\nfailure along the lines of:\n\n```\n-- Checking for one of the modules 'gtest_main'\nCMake Error at /usr/share/cmake/Modules/FindPkgConfig.cmake:640 (message):\n  None of the required 'gtest_main' found\n```\n\nThese failures are common if you installed GoogleTest yourself and have not\nsourced it from a distro or other package manager. If so, you need to tell\npkg-config where it can find the `.pc` files containing the information.\nSay you installed GoogleTest to `/usr/local`, then it might be that the\n`.pc` files are installed under `/usr/local/lib64/pkgconfig`. If you set\n\n```\nexport PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig\n```\n\npkg-config will also try to look in `PKG_CONFIG_PATH` to find `gtest_main.pc`.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/docs/PumpManual.md",
    "content": "\n\n<b>P</b>ump is <b>U</b>seful for <b>M</b>eta <b>P</b>rogramming.\n\n# The Problem #\n\nTemplate and macro libraries often need to define many classes,\nfunctions, or macros that vary only (or almost only) in the number of\narguments they take. It's a lot of repetitive, mechanical, and\nerror-prone work.\n\nVariadic templates and variadic macros can alleviate the problem.\nHowever, while both are being considered by the C++ committee, neither\nis in the standard yet or widely supported by compilers.  Thus they\nare often not a good choice, especially when your code needs to be\nportable. And their capabilities are still limited.\n\nAs a result, authors of such libraries often have to write scripts to\ngenerate their implementation. However, our experience is that it's\ntedious to write such scripts, which tend to reflect the structure of\nthe generated code poorly and are often hard to read and edit. For\nexample, a small change needed in the generated code may require some\nnon-intuitive, non-trivial changes in the script. This is especially\npainful when experimenting with the code.\n\n# Our Solution #\n\nPump (for Pump is Useful for Meta Programming, Pretty Useful for Meta\nProgramming, or Practical Utility for Meta Programming, whichever you\nprefer) is a simple meta-programming tool for C++. The idea is that a\nprogrammer writes a `foo.pump` file which contains C++ code plus meta\ncode that manipulates the C++ code. The meta code can handle\niterations over a range, nested iterations, local meta variable\ndefinitions, simple arithmetic, and conditional expressions. You can\nview it as a small Domain-Specific Language. The meta language is\ndesigned to be non-intrusive (s.t. it won't confuse Emacs' C++ mode,\nfor example) and concise, making Pump code intuitive and easy to\nmaintain.\n\n## Highlights ##\n\n  * The implementation is in a single Python script and thus ultra portable: no build or installation is needed and it works cross platforms.\n  * Pump tries to be smart with respect to [Google's style guide](https://github.com/google/styleguide): it breaks long lines (easy to have when they are generated) at acceptable places to fit within 80 columns and indent the continuation lines correctly.\n  * The format is human-readable and more concise than XML.\n  * The format works relatively well with Emacs' C++ mode.\n\n## Examples ##\n\nThe following Pump code (where meta keywords start with `$`, `[[` and `]]` are meta brackets, and `$$` starts a meta comment that ends with the line):\n\n```\n$var n = 3     $$ Defines a meta variable n.\n$range i 0..n  $$ Declares the range of meta iterator i (inclusive).\n$for i [[\n               $$ Meta loop.\n// Foo$i does blah for $i-ary predicates.\n$range j 1..i\ntemplate <size_t N $for j [[, typename A$j]]>\nclass Foo$i {\n$if i == 0 [[\n  blah a;\n]] $elif i <= 2 [[\n  blah b;\n]] $else [[\n  blah c;\n]]\n};\n\n]]\n```\n\nwill be translated by the Pump compiler to:\n\n```\n// Foo0 does blah for 0-ary predicates.\ntemplate <size_t N>\nclass Foo0 {\n  blah a;\n};\n\n// Foo1 does blah for 1-ary predicates.\ntemplate <size_t N, typename A1>\nclass Foo1 {\n  blah b;\n};\n\n// Foo2 does blah for 2-ary predicates.\ntemplate <size_t N, typename A1, typename A2>\nclass Foo2 {\n  blah b;\n};\n\n// Foo3 does blah for 3-ary predicates.\ntemplate <size_t N, typename A1, typename A2, typename A3>\nclass Foo3 {\n  blah c;\n};\n```\n\nIn another example,\n\n```\n$range i 1..n\nFunc($for i + [[a$i]]);\n$$ The text between i and [[ is the separator between iterations.\n```\n\nwill generate one of the following lines (without the comments), depending on the value of `n`:\n\n```\nFunc();              // If n is 0.\nFunc(a1);            // If n is 1.\nFunc(a1 + a2);       // If n is 2.\nFunc(a1 + a2 + a3);  // If n is 3.\n// And so on...\n```\n\n## Constructs ##\n\nWe support the following meta programming constructs:\n\n| `$var id = exp` | Defines a named constant value. `$id` is valid util the end of the current meta lexical block. |\n|:----------------|:-----------------------------------------------------------------------------------------------|\n| `$range id exp..exp` | Sets the range of an iteration variable, which can be reused in multiple loops later.          |\n| `$for id sep [[ code ]]` | Iteration. The range of `id` must have been defined earlier. `$id` is valid in `code`.         |\n| `$($)`          | Generates a single `$` character.                                                              |\n| `$id`           | Value of the named constant or iteration variable.                                             |\n| `$(exp)`        | Value of the expression.                                                                       |\n| `$if exp [[ code ]] else_branch` | Conditional.                                                                                   |\n| `[[ code ]]`    | Meta lexical block.                                                                            |\n| `cpp_code`      | Raw C++ code.                                                                                  |\n| `$$ comment`    | Meta comment.                                                                                  |\n\n**Note:** To give the user some freedom in formatting the Pump source\ncode, Pump ignores a new-line character if it's right after `$for foo`\nor next to `[[` or `]]`. Without this rule you'll often be forced to write\nvery long lines to get the desired output. Therefore sometimes you may\nneed to insert an extra new-line in such places for a new-line to show\nup in your output.\n\n## Grammar ##\n\n```\ncode ::= atomic_code*\natomic_code ::= $var id = exp\n    | $var id = [[ code ]]\n    | $range id exp..exp\n    | $for id sep [[ code ]]\n    | $($)\n    | $id\n    | $(exp)\n    | $if exp [[ code ]] else_branch\n    | [[ code ]]\n    | cpp_code\nsep ::= cpp_code | empty_string\nelse_branch ::= $else [[ code ]]\n    | $elif exp [[ code ]] else_branch\n    | empty_string\nexp ::= simple_expression_in_Python_syntax\n```\n\n## Code ##\n\nYou can find the source code of Pump in [scripts/pump.py](../scripts/pump.py). It is still\nvery unpolished and lacks automated tests, although it has been\nsuccessfully used many times. If you find a chance to use it in your\nproject, please let us know what you think!  We also welcome help on\nimproving Pump.\n\n## Real Examples ##\n\nYou can find real-world applications of Pump in [Google Test](https://github.com/google/googletest/tree/master/googletest) and [Google Mock](https://github.com/google/googletest/tree/master/googlemock). The source file `foo.h.pump` generates `foo.h`.\n\n## Tips ##\n\n  * If a meta variable is followed by a letter or digit, you can separate them using `[[]]`, which inserts an empty string. For example `Foo$j[[]]Helper` generate `Foo1Helper` when `j` is 1.\n  * To avoid extra-long Pump source lines, you can break a line anywhere you want by inserting `[[]]` followed by a new line. Since any new-line character next to `[[` or `]]` is ignored, the generated code won't contain this new line.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/docs/XcodeGuide.md",
    "content": "\n\nThis guide will explain how to use the Google Testing Framework in your Xcode projects on Mac OS X. This tutorial begins by quickly explaining what to do for experienced users. After the quick start, the guide goes provides additional explanation about each step.\n\n# Quick Start #\n\nHere is the quick guide for using Google Test in your Xcode project.\n\n  1. Download the source from the [website](https://github.com/google/googletest) using this command: `svn checkout http://googletest.googlecode.com/svn/trunk/ googletest-read-only`.\n  1. Open up the `gtest.xcodeproj` in the `googletest-read-only/xcode/` directory and build the gtest.framework.\n  1. Create a new \"Shell Tool\" target in your Xcode project called something like \"UnitTests\".\n  1. Add the gtest.framework to your project and add it to the \"Link Binary with Libraries\" build phase of \"UnitTests\".\n  1. Add your unit test source code to the \"Compile Sources\" build phase of \"UnitTests\".\n  1. Edit the \"UnitTests\" executable and add an environment variable named \"DYLD\\_FRAMEWORK\\_PATH\" with a value equal to the path to the framework containing the gtest.framework relative to the compiled executable.\n  1. Build and Go.\n\nThe following sections further explain each of the steps listed above in depth, describing in more detail how to complete it including some variations.\n\n# Get the Source #\n\nCurrently, the gtest.framework discussed here isn't available in a tagged release of Google Test, it is only available in the trunk. As explained at the Google Test [site](https://github.com/google/googletest), you can get the code from anonymous SVN with this command:\n\n```\nsvn checkout http://googletest.googlecode.com/svn/trunk/ googletest-read-only\n```\n\nAlternatively, if you are working with Subversion in your own code base, you can add Google Test as an external dependency to your own Subversion repository. By following this approach, everyone that checks out your svn repository will also receive a copy of Google Test (a specific version, if you wish) without having to check it out explicitly. This makes the set up of your project simpler and reduces the copied code in the repository.\n\nTo use `svn:externals`, decide where you would like to have the external source reside. You might choose to put the external source inside the trunk, because you want it to be part of the branch when you make a release. However, keeping it outside the trunk in a version-tagged directory called something like `third-party/googletest/1.0.1`, is another option. Once the location is established, use `svn propedit svn:externals _directory_` to set the svn:externals property on a directory in your repository. This directory won't contain the code, but be its versioned parent directory.\n\nThe command `svn propedit` will bring up your Subversion editor, making editing the long, (potentially multi-line) property simpler. This same method can be used to check out a tagged branch, by using the appropriate URL (e.g. `https://github.com/google/googletest/releases/tag/release-1.0.1`). Additionally, the svn:externals property allows the specification of a particular revision of the trunk with the `-r_##_` option (e.g. `externals/src/googletest -r60 http://googletest.googlecode.com/svn/trunk`).\n\nHere is an example of using the svn:externals properties on a trunk (read via `svn propget`) of a project. This value checks out a copy of Google Test into the `trunk/externals/src/googletest/` directory.\n\n```\n[Computer:svn] user$ svn propget svn:externals trunk\nexternals/src/googletest http://googletest.googlecode.com/svn/trunk\n```\n\n# Add the Framework to Your Project #\n\nThe next step is to build and add the gtest.framework to your own project. This guide describes two common ways below.\n\n  * **Option 1** --- The simplest way to add Google Test to your own project, is to open gtest.xcodeproj (found in the xcode/ directory of the Google Test trunk) and build the framework manually. Then, add the built framework into your project using the \"Add->Existing Framework...\" from the context menu or \"Project->Add...\" from the main menu. The gtest.framework is relocatable and contains the headers and object code that you'll need to make tests. This method requires rebuilding every time you upgrade Google Test in your project.\n  * **Option 2** --- If you are going to be living off the trunk of Google Test, incorporating its latest features into your unit tests (or are a Google Test developer yourself). You'll want to rebuild the framework every time the source updates. to do this, you'll need to add the gtest.xcodeproj file, not the framework itself, to your own Xcode project. Then, from the build products that are revealed by the project's disclosure triangle, you can find the gtest.framework, which can be added to your targets (discussed below).\n\n# Make a Test Target #\n\nTo start writing tests, make a new \"Shell Tool\" target. This target template is available under BSD, Cocoa, or Carbon. Add your unit test source code to the \"Compile Sources\" build phase of the target.\n\nNext, you'll want to add gtest.framework in two different ways, depending upon which option you chose above.\n\n  * **Option 1** --- During compilation, Xcode will need to know that you are linking against the gtest.framework. Add the gtest.framework to the \"Link Binary with Libraries\" build phase of your test target. This will include the Google Test headers in your header search path, and will tell the linker where to find the library.\n  * **Option 2** --- If your working out of the trunk, you'll also want to add gtest.framework to your \"Link Binary with Libraries\" build phase of your test target. In addition, you'll  want to add the gtest.framework as a dependency to your unit test target. This way, Xcode will make sure that gtest.framework is up to date, every time your build your target. Finally, if you don't share build directories with Google Test, you'll have to copy the gtest.framework into your own build products directory using a \"Run Script\" build phase.\n\n# Set Up the Executable Run Environment #\n\nSince the unit test executable is a shell tool, it doesn't have a bundle with a `Contents/Frameworks` directory, in which to place gtest.framework. Instead, the dynamic linker must be told at runtime to search for the framework in another location. This can be accomplished by setting the \"DYLD\\_FRAMEWORK\\_PATH\" environment variable in the \"Edit Active Executable ...\" Arguments tab, under \"Variables to be set in the environment:\". The path for this value is the path (relative or absolute) of the directory containing the gtest.framework.\n\nIf you haven't set up the DYLD\\_FRAMEWORK\\_PATH, correctly, you might get a message like this:\n\n```\n[Session started at 2008-08-15 06:23:57 -0600.]\n  dyld: Library not loaded: @loader_path/../Frameworks/gtest.framework/Versions/A/gtest\n    Referenced from: /Users/username/Documents/Sandbox/gtestSample/build/Debug/WidgetFrameworkTest\n    Reason: image not found\n```\n\nTo correct this problem, go to to the directory containing the executable named in \"Referenced from:\" value in the error message above. Then, with the terminal in this location, find the relative path to the directory containing the gtest.framework. That is the value you'll need to set as the DYLD\\_FRAMEWORK\\_PATH.\n\n# Build and Go #\n\nNow, when you click \"Build and Go\", the test will be executed. Dumping out something like this:\n\n```\n[Session started at 2008-08-06 06:36:13 -0600.]\n[==========] Running 2 tests from 1 test case.\n[----------] Global test environment set-up.\n[----------] 2 tests from WidgetInitializerTest\n[ RUN      ] WidgetInitializerTest.TestConstructor\n[       OK ] WidgetInitializerTest.TestConstructor\n[ RUN      ] WidgetInitializerTest.TestConversion\n[       OK ] WidgetInitializerTest.TestConversion\n[----------] Global test environment tear-down\n[==========] 2 tests from 1 test case ran.\n[  PASSED  ] 2 tests.\n\nThe Debugger has exited with status 0.  \n```\n\n# Summary #\n\nUnit testing is a valuable way to ensure your data model stays valid even during rapid development or refactoring. The Google Testing Framework is a great unit testing framework for C and C++ which integrates well with an Xcode development environment.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/docs/advanced.md",
    "content": "# Advanced googletest Topics\n\n\n## Introduction\n\nNow that you have read the [googletest Primer](primer.md) and learned how to write\ntests using googletest, it's time to learn some new tricks. This document will\nshow you more assertions as well as how to construct complex failure messages,\npropagate fatal failures, reuse and speed up your test fixtures, and use various\nflags with your tests.\n\n## More Assertions\n\nThis section covers some less frequently used, but still significant,\nassertions.\n\n### Explicit Success and Failure\n\nThese three assertions do not actually test a value or expression. Instead, they\ngenerate a success or failure directly. Like the macros that actually perform a\ntest, you may stream a custom failure message into them.\n\n```c++\nSUCCEED();\n```\n\nGenerates a success. This does **NOT** make the overall test succeed. A test is\nconsidered successful only if none of its assertions fail during its execution.\n\nNOTE: `SUCCEED()` is purely documentary and currently doesn't generate any\nuser-visible output. However, we may add `SUCCEED()` messages to googletest's\noutput in the future.\n\n```c++\nFAIL();\nADD_FAILURE();\nADD_FAILURE_AT(\"file_path\", line_number);\n```\n\n`FAIL()` generates a fatal failure, while `ADD_FAILURE()` and `ADD_FAILURE_AT()`\ngenerate a nonfatal failure. These are useful when control flow, rather than a\nBoolean expression, determines the test's success or failure. For example, you\nmight want to write something like:\n\n```c++\nswitch(expression) {\n  case 1:\n     ... some checks ...\n  case 2:\n     ... some other checks ...\n  default:\n     FAIL() << \"We shouldn't get here.\";\n}\n```\n\nNOTE: you can only use `FAIL()` in functions that return `void`. See the\n[Assertion Placement section](#assertion-placement) for more information.\n\n**Availability**: Linux, Windows, Mac.\n\n### Exception Assertions\n\nThese are for verifying that a piece of code throws (or does not throw) an\nexception of the given type:\n\nFatal assertion                            | Nonfatal assertion                         | Verifies\n------------------------------------------ | ------------------------------------------ | --------\n`ASSERT_THROW(statement, exception_type);` | `EXPECT_THROW(statement, exception_type);` | `statement` throws an exception of the given type\n`ASSERT_ANY_THROW(statement);`             | `EXPECT_ANY_THROW(statement);`             | `statement` throws an exception of any type\n`ASSERT_NO_THROW(statement);`              | `EXPECT_NO_THROW(statement);`              | `statement` doesn't throw any exception\n\nExamples:\n\n```c++\nASSERT_THROW(Foo(5), bar_exception);\n\nEXPECT_NO_THROW({\n  int n = 5;\n  Bar(&n);\n});\n```\n\n**Availability**: Linux, Windows, Mac; requires exceptions to be enabled in the\nbuild environment (note that `google3` **disables** exceptions).\n\n### Predicate Assertions for Better Error Messages\n\nEven though googletest has a rich set of assertions, they can never be complete,\nas it's impossible (nor a good idea) to anticipate all scenarios a user might\nrun into. Therefore, sometimes a user has to use `EXPECT_TRUE()` to check a\ncomplex expression, for lack of a better macro. This has the problem of not\nshowing you the values of the parts of the expression, making it hard to\nunderstand what went wrong. As a workaround, some users choose to construct the\nfailure message by themselves, streaming it into `EXPECT_TRUE()`. However, this\nis awkward especially when the expression has side-effects or is expensive to\nevaluate.\n\ngoogletest gives you three different options to solve this problem:\n\n#### Using an Existing Boolean Function\n\nIf you already have a function or functor that returns `bool` (or a type that\ncan be implicitly converted to `bool`), you can use it in a *predicate\nassertion* to get the function arguments printed for free:\n\n| Fatal assertion                    | Nonfatal assertion                 | Verifies                    |\n| ---------------------------------- | ---------------------------------- | --------------------------- |\n| `ASSERT_PRED1(pred1, val1);`       | `EXPECT_PRED1(pred1, val1);`       | `pred1(val1)` is true       |\n| `ASSERT_PRED2(pred2, val1, val2);` | `EXPECT_PRED2(pred2, val1, val2);` | `pred2(val1, val2)` is true |\n| `...`                              | `...`                              | ...                         |\n\nIn the above, `predn` is an `n`-ary predicate function or functor, where `val1`,\n`val2`, ..., and `valn` are its arguments. The assertion succeeds if the\npredicate returns `true` when applied to the given arguments, and fails\notherwise. When the assertion fails, it prints the value of each argument. In\neither case, the arguments are evaluated exactly once.\n\nHere's an example. Given\n\n```c++\n// Returns true if m and n have no common divisors except 1.\nbool MutuallyPrime(int m, int n) { ... }\n\nconst int a = 3;\nconst int b = 4;\nconst int c = 10;\n```\n\nthe assertion\n\n```c++\n  EXPECT_PRED2(MutuallyPrime, a, b);\n```\n\nwill succeed, while the assertion\n\n```c++\n  EXPECT_PRED2(MutuallyPrime, b, c);\n```\n\nwill fail with the message\n\n```none\nMutuallyPrime(b, c) is false, where\nb is 4\nc is 10\n```\n\n> NOTE:\n>\n> 1.  If you see a compiler error \"no matching function to call\" when using\n>     `ASSERT_PRED*` or `EXPECT_PRED*`, please see\n>     [this](faq.md#OverloadedPredicate) for how to resolve it.\n> 1.  Currently we only provide predicate assertions of arity <= 5. If you need\n>     a higher-arity assertion, let [us](https://github.com/google/googletest/issues) know.\n\n**Availability**: Linux, Windows, Mac.\n\n#### Using a Function That Returns an AssertionResult\n\nWhile `EXPECT_PRED*()` and friends are handy for a quick job, the syntax is not\nsatisfactory: you have to use different macros for different arities, and it\nfeels more like Lisp than C++. The `::testing::AssertionResult` class solves\nthis problem.\n\nAn `AssertionResult` object represents the result of an assertion (whether it's\na success or a failure, and an associated message). You can create an\n`AssertionResult` using one of these factory functions:\n\n```c++\nnamespace testing {\n\n// Returns an AssertionResult object to indicate that an assertion has\n// succeeded.\nAssertionResult AssertionSuccess();\n\n// Returns an AssertionResult object to indicate that an assertion has\n// failed.\nAssertionResult AssertionFailure();\n\n}\n```\n\nYou can then use the `<<` operator to stream messages to the `AssertionResult`\nobject.\n\nTo provide more readable messages in Boolean assertions (e.g. `EXPECT_TRUE()`),\nwrite a predicate function that returns `AssertionResult` instead of `bool`. For\nexample, if you define `IsEven()` as:\n\n```c++\n::testing::AssertionResult IsEven(int n) {\n  if ((n % 2) == 0)\n     return ::testing::AssertionSuccess();\n  else\n     return ::testing::AssertionFailure() << n << \" is odd\";\n}\n```\n\ninstead of:\n\n```c++\nbool IsEven(int n) {\n  return (n % 2) == 0;\n}\n```\n\nthe failed assertion `EXPECT_TRUE(IsEven(Fib(4)))` will print:\n\n```none\nValue of: IsEven(Fib(4))\n  Actual: false (3 is odd)\nExpected: true\n```\n\ninstead of a more opaque\n\n```none\nValue of: IsEven(Fib(4))\n  Actual: false\nExpected: true\n```\n\nIf you want informative messages in `EXPECT_FALSE` and `ASSERT_FALSE` as well\n(one third of Boolean assertions in the Google code base are negative ones), and\nare fine with making the predicate slower in the success case, you can supply a\nsuccess message:\n\n```c++\n::testing::AssertionResult IsEven(int n) {\n  if ((n % 2) == 0)\n     return ::testing::AssertionSuccess() << n << \" is even\";\n  else\n     return ::testing::AssertionFailure() << n << \" is odd\";\n}\n```\n\nThen the statement `EXPECT_FALSE(IsEven(Fib(6)))` will print\n\n```none\n  Value of: IsEven(Fib(6))\n     Actual: true (8 is even)\n  Expected: false\n```\n\n**Availability**: Linux, Windows, Mac.\n\n#### Using a Predicate-Formatter\n\nIf you find the default message generated by `(ASSERT|EXPECT)_PRED*` and\n`(ASSERT|EXPECT)_(TRUE|FALSE)` unsatisfactory, or some arguments to your\npredicate do not support streaming to `ostream`, you can instead use the\nfollowing *predicate-formatter assertions* to *fully* customize how the message\nis formatted:\n\nFatal assertion                                  | Nonfatal assertion                               | Verifies\n------------------------------------------------ | ------------------------------------------------ | --------\n`ASSERT_PRED_FORMAT1(pred_format1, val1);`       | `EXPECT_PRED_FORMAT1(pred_format1, val1);`       | `pred_format1(val1)` is successful\n`ASSERT_PRED_FORMAT2(pred_format2, val1, val2);` | `EXPECT_PRED_FORMAT2(pred_format2, val1, val2);` | `pred_format2(val1, val2)` is successful\n`...`                                            | `...`                                            | ...\n\nThe difference between this and the previous group of macros is that instead of\na predicate, `(ASSERT|EXPECT)_PRED_FORMAT*` take a *predicate-formatter*\n(`pred_formatn`), which is a function or functor with the signature:\n\n```c++\n::testing::AssertionResult PredicateFormattern(const char* expr1,\n                                               const char* expr2,\n                                               ...\n                                               const char* exprn,\n                                               T1 val1,\n                                               T2 val2,\n                                               ...\n                                               Tn valn);\n```\n\nwhere `val1`, `val2`, ..., and `valn` are the values of the predicate arguments,\nand `expr1`, `expr2`, ..., and `exprn` are the corresponding expressions as they\nappear in the source code. The types `T1`, `T2`, ..., and `Tn` can be either\nvalue types or reference types. For example, if an argument has type `Foo`, you\ncan declare it as either `Foo` or `const Foo&`, whichever is appropriate.\n\nAs an example, let's improve the failure message in `MutuallyPrime()`, which was\nused with `EXPECT_PRED2()`:\n\n```c++\n// Returns the smallest prime common divisor of m and n,\n// or 1 when m and n are mutually prime.\nint SmallestPrimeCommonDivisor(int m, int n) { ... }\n\n// A predicate-formatter for asserting that two integers are mutually prime.\n::testing::AssertionResult AssertMutuallyPrime(const char* m_expr,\n                                               const char* n_expr,\n                                               int m,\n                                               int n) {\n  if (MutuallyPrime(m, n)) return ::testing::AssertionSuccess();\n\n  return ::testing::AssertionFailure() << m_expr << \" and \" << n_expr\n      << \" (\" << m << \" and \" << n << \") are not mutually prime, \"\n      << \"as they have a common divisor \" << SmallestPrimeCommonDivisor(m, n);\n}\n```\n\nWith this predicate-formatter, we can use\n\n```c++\n  EXPECT_PRED_FORMAT2(AssertMutuallyPrime, b, c);\n```\n\nto generate the message\n\n```none\nb and c (4 and 10) are not mutually prime, as they have a common divisor 2.\n```\n\nAs you may have realized, many of the built-in assertions we introduced earlier\nare special cases of `(EXPECT|ASSERT)_PRED_FORMAT*`. In fact, most of them are\nindeed defined using `(EXPECT|ASSERT)_PRED_FORMAT*`.\n\n**Availability**: Linux, Windows, Mac.\n\n### Floating-Point Comparison\n\nComparing floating-point numbers is tricky. Due to round-off errors, it is very\nunlikely that two floating-points will match exactly. Therefore, `ASSERT_EQ` 's\nnaive comparison usually doesn't work. And since floating-points can have a wide\nvalue range, no single fixed error bound works. It's better to compare by a\nfixed relative error bound, except for values close to 0 due to the loss of\nprecision there.\n\nIn general, for floating-point comparison to make sense, the user needs to\ncarefully choose the error bound. If they don't want or care to, comparing in\nterms of Units in the Last Place (ULPs) is a good default, and googletest\nprovides assertions to do this. Full details about ULPs are quite long; if you\nwant to learn more, see\n[here](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/).\n\n#### Floating-Point Macros\n\n| Fatal assertion                 | Nonfatal assertion             | Verifies                                 |\n| ------------------------------- | ------------------------------ | ---------------------------------------- |\n| `ASSERT_FLOAT_EQ(val1, val2);`  | `EXPECT_FLOAT_EQ(val1,val2);`  | the two `float` values are almost equal  |\n| `ASSERT_DOUBLE_EQ(val1, val2);` | `EXPECT_DOUBLE_EQ(val1, val2);`| the two `double` values are almost equal |\n\nBy \"almost equal\" we mean the values are within 4 ULP's from each other.\n\nNOTE: `CHECK_DOUBLE_EQ()` in `base/logging.h` uses a fixed absolute error bound,\nso its result may differ from that of the googletest macros. That macro is\nunsafe and has been deprecated. Please don't use it any more.\n\nThe following assertions allow you to choose the acceptable error bound:\n\n| Fatal assertion                       | Nonfatal assertion                    | Verifies                  |\n| ------------------------------------- | ------------------------------------- | ------------------------- |\n| `ASSERT_NEAR(val1, val2, abs_error);` | `EXPECT_NEAR(val1, val2, abs_error);` | the difference between `val1` and `val2` doesn't exceed the given absolute error |\n\n**Availability**: Linux, Windows, Mac.\n\n#### Floating-Point Predicate-Format Functions\n\nSome floating-point operations are useful, but not that often used. In order to\navoid an explosion of new macros, we provide them as predicate-format functions\nthat can be used in predicate assertion macros (e.g. `EXPECT_PRED_FORMAT2`,\netc).\n\n```c++\nEXPECT_PRED_FORMAT2(::testing::FloatLE, val1, val2);\nEXPECT_PRED_FORMAT2(::testing::DoubleLE, val1, val2);\n```\n\nVerifies that `val1` is less than, or almost equal to, `val2`. You can replace\n`EXPECT_PRED_FORMAT2` in the above table with `ASSERT_PRED_FORMAT2`.\n\n**Availability**: Linux, Windows, Mac.\n\n### Asserting Using gMock Matchers\n\nGoogle-developed C++ mocking framework [gMock](../../googlemock) comes with a\nlibrary of matchers for validating arguments passed to mock objects. A gMock\n*matcher* is basically a predicate that knows how to describe itself. It can be\nused in these assertion macros:\n\n| Fatal assertion                | Nonfatal assertion             | Verifies              |\n| ------------------------------ | ------------------------------ | --------------------- |\n| `ASSERT_THAT(value, matcher);` | `EXPECT_THAT(value, matcher);` | value matches matcher |\n\nFor example, `StartsWith(prefix)` is a matcher that matches a string starting\nwith `prefix`, and you can write:\n\n```c++\nusing ::testing::StartsWith;\n...\n    // Verifies that Foo() returns a string starting with \"Hello\".\n    EXPECT_THAT(Foo(), StartsWith(\"Hello\"));\n```\n\nRead this [recipe](../../googlemock/docs/CookBook.md#using-matchers-in-google-test-assertions) in\nthe gMock Cookbook for more details.\n\ngMock has a rich set of matchers. You can do many things googletest cannot do\nalone with them. For a list of matchers gMock provides, read\n[this](../../googlemock/docs/CookBook.md#using-matchers). Especially useful among them are\nsome [protocol buffer matchers](https://github.com/google/nucleus/blob/master/nucleus/testing/protocol-buffer-matchers.h). It's easy to write\nyour [own matchers](../../googlemock/docs/CookBook.md#writing-new-matchers-quickly) too.\n\nFor example, you can use gMock's\n[EqualsProto](https://github.com/google/nucleus/blob/master/nucleus/testing/protocol-buffer-matchers.h)\nto compare protos in your tests:\n\n```c++\n#include \"testing/base/public/gmock.h\"\nusing ::testing::EqualsProto;\n...\n    EXPECT_THAT(actual_proto, EqualsProto(\"foo: 123 bar: 'xyz'\"));\n    EXPECT_THAT(*actual_proto_ptr, EqualsProto(expected_proto));\n```\n\ngMock is bundled with googletest, so you don't need to add any build dependency\nin order to take advantage of this. Just include `\"testing/base/public/gmock.h\"`\nand you're ready to go.\n\n**Availability**: Linux, Windows, and Mac.\n\n### More String Assertions\n\n(Please read the [previous](#AssertThat) section first if you haven't.)\n\nYou can use the gMock [string matchers](../../googlemock/docs/CheatSheet.md#string-matchers)\nwith `EXPECT_THAT()` or `ASSERT_THAT()` to do more string comparison tricks\n(sub-string, prefix, suffix, regular expression, and etc). For example,\n\n```c++\nusing ::testing::HasSubstr;\nusing ::testing::MatchesRegex;\n...\n  ASSERT_THAT(foo_string, HasSubstr(\"needle\"));\n  EXPECT_THAT(bar_string, MatchesRegex(\"\\\\w*\\\\d+\"));\n```\n\n**Availability**: Linux, Windows, Mac.\n\nIf the string contains a well-formed HTML or XML document, you can check whether\nits DOM tree matches an [XPath\nexpression](http://www.w3.org/TR/xpath/#contents):\n\n```c++\n// Currently still in //template/prototemplate/testing:xpath_matcher\n#include \"template/prototemplate/testing/xpath_matcher.h\"\nusing prototemplate::testing::MatchesXPath;\nEXPECT_THAT(html_string, MatchesXPath(\"//a[text()='click here']\"));\n```\n\n**Availability**: Linux.\n\n### Windows HRESULT assertions\n\nThese assertions test for `HRESULT` success or failure.\n\nFatal assertion                        | Nonfatal assertion                     | Verifies\n-------------------------------------- | -------------------------------------- | --------\n`ASSERT_HRESULT_SUCCEEDED(expression)` | `EXPECT_HRESULT_SUCCEEDED(expression)` | `expression` is a success `HRESULT`\n`ASSERT_HRESULT_FAILED(expression)`    | `EXPECT_HRESULT_FAILED(expression)`    | `expression` is a failure `HRESULT`\n\nThe generated output contains the human-readable error message associated with\nthe `HRESULT` code returned by `expression`.\n\nYou might use them like this:\n\n```c++\nCComPtr<IShellDispatch2> shell;\nASSERT_HRESULT_SUCCEEDED(shell.CoCreateInstance(L\"Shell.Application\"));\nCComVariant empty;\nASSERT_HRESULT_SUCCEEDED(shell->ShellExecute(CComBSTR(url), empty, empty, empty, empty));\n```\n\n**Availability**: Windows.\n\n### Type Assertions\n\nYou can call the function\n\n```c++\n::testing::StaticAssertTypeEq<T1, T2>();\n```\n\nto assert that types `T1` and `T2` are the same. The function does nothing if\nthe assertion is satisfied. If the types are different, the function call will\nfail to compile, and the compiler error message will likely (depending on the\ncompiler) show you the actual values of `T1` and `T2`. This is mainly useful\ninside template code.\n\n**Caveat**: When used inside a member function of a class template or a function\ntemplate, `StaticAssertTypeEq<T1, T2>()` is effective only if the function is\ninstantiated. For example, given:\n\n```c++\ntemplate <typename T> class Foo {\n public:\n  void Bar() { ::testing::StaticAssertTypeEq<int, T>(); }\n};\n```\n\nthe code:\n\n```c++\nvoid Test1() { Foo<bool> foo; }\n```\n\nwill not generate a compiler error, as `Foo<bool>::Bar()` is never actually\ninstantiated. Instead, you need:\n\n```c++\nvoid Test2() { Foo<bool> foo; foo.Bar(); }\n```\n\nto cause a compiler error.\n\n**Availability**: Linux, Windows, Mac.\n\n### Assertion Placement\n\nYou can use assertions in any C++ function. In particular, it doesn't have to be\na method of the test fixture class. The one constraint is that assertions that\ngenerate a fatal failure (`FAIL*` and `ASSERT_*`) can only be used in\nvoid-returning functions. This is a consequence of Google's not using\nexceptions. By placing it in a non-void function you'll get a confusing compile\nerror like `\"error: void value not ignored as it ought to be\"` or `\"cannot\ninitialize return object of type 'bool' with an rvalue of type 'void'\"` or\n`\"error: no viable conversion from 'void' to 'string'\"`.\n\nIf you need to use fatal assertions in a function that returns non-void, one\noption is to make the function return the value in an out parameter instead. For\nexample, you can rewrite `T2 Foo(T1 x)` to `void Foo(T1 x, T2* result)`. You\nneed to make sure that `*result` contains some sensible value even when the\nfunction returns prematurely. As the function now returns `void`, you can use\nany assertion inside of it.\n\nIf changing the function's type is not an option, you should just use assertions\nthat generate non-fatal failures, such as `ADD_FAILURE*` and `EXPECT_*`.\n\nNOTE: Constructors and destructors are not considered void-returning functions,\naccording to the C++ language specification, and so you may not use fatal\nassertions in them. You'll get a compilation error if you try. A simple\nworkaround is to transfer the entire body of the constructor or destructor to a\nprivate void-returning method. However, you should be aware that a fatal\nassertion failure in a constructor does not terminate the current test, as your\nintuition might suggest; it merely returns from the constructor early, possibly\nleaving your object in a partially-constructed state. Likewise, a fatal\nassertion failure in a destructor may leave your object in a\npartially-destructed state. Use assertions carefully in these situations!\n\n## Teaching googletest How to Print Your Values\n\nWhen a test assertion such as `EXPECT_EQ` fails, googletest prints the argument\nvalues to help you debug. It does this using a user-extensible value printer.\n\nThis printer knows how to print built-in C++ types, native arrays, STL\ncontainers, and any type that supports the `<<` operator. For other types, it\nprints the raw bytes in the value and hopes that you the user can figure it out.\n\nAs mentioned earlier, the printer is *extensible*. That means you can teach it\nto do a better job at printing your particular type than to dump the bytes. To\ndo that, define `<<` for your type:\n\n```c++\n// Streams are allowed only for logging.  Don't include this for\n// any other purpose.\n#include <ostream>\n\nnamespace foo {\n\nclass Bar {  // We want googletest to be able to print instances of this.\n...\n  // Create a free inline friend function.\n  friend std::ostream& operator<<(std::ostream& os, const Bar& bar) {\n    return os << bar.DebugString();  // whatever needed to print bar to os\n  }\n};\n\n// If you can't declare the function in the class it's important that the\n// << operator is defined in the SAME namespace that defines Bar.  C++'s look-up\n// rules rely on that.\nstd::ostream& operator<<(std::ostream& os, const Bar& bar) {\n  return os << bar.DebugString();  // whatever needed to print bar to os\n}\n\n}  // namespace foo\n```\n\nSometimes, this might not be an option: your team may consider it bad style to\nhave a `<<` operator for `Bar`, or `Bar` may already have a `<<` operator that\ndoesn't do what you want (and you cannot change it). If so, you can instead\ndefine a `PrintTo()` function like this:\n\n```c++\n// Streams are allowed only for logging.  Don't include this for\n// any other purpose.\n#include <ostream>\n\nnamespace foo {\n\nclass Bar {\n  ...\n  friend void PrintTo(const Bar& bar, std::ostream* os) {\n    *os << bar.DebugString();  // whatever needed to print bar to os\n  }\n};\n\n// If you can't declare the function in the class it's important that PrintTo()\n// is defined in the SAME namespace that defines Bar.  C++'s look-up rules rely\n// on that.\nvoid PrintTo(const Bar& bar, std::ostream* os) {\n  *os << bar.DebugString();  // whatever needed to print bar to os\n}\n\n}  // namespace foo\n```\n\nIf you have defined both `<<` and `PrintTo()`, the latter will be used when\ngoogletest is concerned. This allows you to customize how the value appears in\ngoogletest's output without affecting code that relies on the behavior of its\n`<<` operator.\n\nIf you want to print a value `x` using googletest's value printer yourself, just\ncall `::testing::PrintToString(x)`, which returns an `std::string`:\n\n```c++\nvector<pair<Bar, int> > bar_ints = GetBarIntVector();\n\nEXPECT_TRUE(IsCorrectBarIntVector(bar_ints))\n    << \"bar_ints = \" << ::testing::PrintToString(bar_ints);\n```\n\n## Death Tests\n\nIn many applications, there are assertions that can cause application failure if\na condition is not met. These sanity checks, which ensure that the program is in\na known good state, are there to fail at the earliest possible time after some\nprogram state is corrupted. If the assertion checks the wrong condition, then\nthe program may proceed in an erroneous state, which could lead to memory\ncorruption, security holes, or worse. Hence it is vitally important to test that\nsuch assertion statements work as expected.\n\nSince these precondition checks cause the processes to die, we call such tests\n_death tests_. More generally, any test that checks that a program terminates\n(except by throwing an exception) in an expected fashion is also a death test.\n\n\nNote that if a piece of code throws an exception, we don't consider it \"death\"\nfor the purpose of death tests, as the caller of the code could catch the\nexception and avoid the crash. If you want to verify exceptions thrown by your\ncode, see [Exception Assertions](#exception-assertions).\n\nIf you want to test `EXPECT_*()/ASSERT_*()` failures in your test code, see\nCatching Failures\n\n### How to Write a Death Test\n\ngoogletest has the following macros to support death tests:\n\nFatal assertion                                | Nonfatal assertion                             | Verifies\n---------------------------------------------- | ---------------------------------------------- | --------\n`ASSERT_DEATH(statement, regex);`              | `EXPECT_DEATH(statement, regex);`              | `statement` crashes with the given error\n`ASSERT_DEATH_IF_SUPPORTED(statement, regex);` | `EXPECT_DEATH_IF_SUPPORTED(statement, regex);` | if death tests are supported, verifies that `statement` crashes with the given error; otherwise verifies nothing\n`ASSERT_EXIT(statement, predicate, regex);`    | `EXPECT_EXIT(statement, predicate, regex);`    | `statement` exits with the given error, and its exit code matches `predicate`\n\nwhere `statement` is a statement that is expected to cause the process to die,\n`predicate` is a function or function object that evaluates an integer exit\nstatus, and `regex` is a (Perl) regular expression that the stderr output of\n`statement` is expected to match. Note that `statement` can be *any valid\nstatement* (including *compound statement*) and doesn't have to be an\nexpression.\n\n\nAs usual, the `ASSERT` variants abort the current test function, while the\n`EXPECT` variants do not.\n\n> NOTE: We use the word \"crash\" here to mean that the process terminates with a\n> *non-zero* exit status code. There are two possibilities: either the process\n> has called `exit()` or `_exit()` with a non-zero value, or it may be killed by\n> a signal.\n>\n> This means that if `*statement*` terminates the process with a 0 exit code, it\n> is *not* considered a crash by `EXPECT_DEATH`. Use `EXPECT_EXIT` instead if\n> this is the case, or if you want to restrict the exit code more precisely.\n\nA predicate here must accept an `int` and return a `bool`. The death test\nsucceeds only if the predicate returns `true`. googletest defines a few\npredicates that handle the most common cases:\n\n```c++\n::testing::ExitedWithCode(exit_code)\n```\n\nThis expression is `true` if the program exited normally with the given exit\ncode.\n\n```c++\n::testing::KilledBySignal(signal_number)  // Not available on Windows.\n```\n\nThis expression is `true` if the program was killed by the given signal.\n\nThe `*_DEATH` macros are convenient wrappers for `*_EXIT` that use a predicate\nthat verifies the process' exit code is non-zero.\n\nNote that a death test only cares about three things:\n\n1.  does `statement` abort or exit the process?\n2.  (in the case of `ASSERT_EXIT` and `EXPECT_EXIT`) does the exit status\n    satisfy `predicate`? Or (in the case of `ASSERT_DEATH` and `EXPECT_DEATH`)\n    is the exit status non-zero? And\n3.  does the stderr output match `regex`?\n\nIn particular, if `statement` generates an `ASSERT_*` or `EXPECT_*` failure, it\nwill **not** cause the death test to fail, as googletest assertions don't abort\nthe process.\n\nTo write a death test, simply use one of the above macros inside your test\nfunction. For example,\n\n```c++\nTEST(MyDeathTest, Foo) {\n  // This death test uses a compound statement.\n  ASSERT_DEATH({\n    int n = 5;\n    Foo(&n);\n  }, \"Error on line .* of Foo()\");\n}\n\nTEST(MyDeathTest, NormalExit) {\n  EXPECT_EXIT(NormalExit(), ::testing::ExitedWithCode(0), \"Success\");\n}\n\nTEST(MyDeathTest, KillMyself) {\n  EXPECT_EXIT(KillMyself(), ::testing::KilledBySignal(SIGKILL),\n              \"Sending myself unblockable signal\");\n}\n```\n\nverifies that:\n\n*   calling `Foo(5)` causes the process to die with the given error message,\n*   calling `NormalExit()` causes the process to print `\"Success\"` to stderr and\n    exit with exit code 0, and\n*   calling `KillMyself()` kills the process with signal `SIGKILL`.\n\nThe test function body may contain other assertions and statements as well, if\nnecessary.\n\n### Death Test Naming\n\nIMPORTANT: We strongly recommend you to follow the convention of naming your\n**test case** (not test) `*DeathTest` when it contains a death test, as\ndemonstrated in the above example. The [Death Tests And\nThreads](#death-tests-and-threads) section below explains why.\n\nIf a test fixture class is shared by normal tests and death tests, you can use\n`using` or `typedef` to introduce an alias for the fixture class and avoid\nduplicating its code:\n\n```c++\nclass FooTest : public ::testing::Test { ... };\n\nusing FooDeathTest = FooTest;\n\nTEST_F(FooTest, DoesThis) {\n  // normal test\n}\n\nTEST_F(FooDeathTest, DoesThat) {\n  // death test\n}\n```\n\n**Availability**: Linux, Windows (requires MSVC 8.0 or above), Cygwin, and Mac\n\n### Regular Expression Syntax\n\n\nOn POSIX systems (e.g. Linux, Cygwin, and Mac), googletest uses the\n[POSIX extended regular expression](http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html#tag_09_04)\nsyntax. To learn about this syntax, you may want to read this\n[Wikipedia entry](http://en.wikipedia.org/wiki/Regular_expression#POSIX_Extended_Regular_Expressions).\n\nOn Windows, googletest uses its own simple regular expression implementation. It\nlacks many features. For example, we don't support union (`\"x|y\"`), grouping\n(`\"(xy)\"`), brackets (`\"[xy]\"`), and repetition count (`\"x{5,7}\"`), among\nothers. Below is what we do support (`A` denotes a literal character, period\n(`.`), or a single `\\\\ ` escape sequence; `x` and `y` denote regular\nexpressions.):\n\nExpression | Meaning\n---------- | --------------------------------------------------------------\n`c`        | matches any literal character `c`\n`\\\\d`      | matches any decimal digit\n`\\\\D`      | matches any character that's not a decimal digit\n`\\\\f`      | matches `\\f`\n`\\\\n`      | matches `\\n`\n`\\\\r`      | matches `\\r`\n`\\\\s`      | matches any ASCII whitespace, including `\\n`\n`\\\\S`      | matches any character that's not a whitespace\n`\\\\t`      | matches `\\t`\n`\\\\v`      | matches `\\v`\n`\\\\w`      | matches any letter, `_`, or decimal digit\n`\\\\W`      | matches any character that `\\\\w` doesn't match\n`\\\\c`      | matches any literal character `c`, which must be a punctuation\n`.`        | matches any single character except `\\n`\n`A?`       | matches 0 or 1 occurrences of `A`\n`A*`       | matches 0 or many occurrences of `A`\n`A+`       | matches 1 or many occurrences of `A`\n`^`        | matches the beginning of a string (not that of each line)\n`$`        | matches the end of a string (not that of each line)\n`xy`       | matches `x` followed by `y`\n\nTo help you determine which capability is available on your system, googletest\ndefines macros to govern which regular expression it is using. The macros are:\n<!--absl:google3-begin(google3-only)-->`GTEST_USES_PCRE=1`, or\n<!--absl:google3-end--> `GTEST_USES_SIMPLE_RE=1` or `GTEST_USES_POSIX_RE=1`. If\nyou want your death tests to work in all cases, you can either `#if` on these\nmacros or use the more limited syntax only.\n\n### How It Works\n\nUnder the hood, `ASSERT_EXIT()` spawns a new process and executes the death test\nstatement in that process. The details of how precisely that happens depend on\nthe platform and the variable ::testing::GTEST_FLAG(death_test_style) (which is\ninitialized from the command-line flag `--gtest_death_test_style`).\n\n*   On POSIX systems, `fork()` (or `clone()` on Linux) is used to spawn the\n    child, after which:\n    *   If the variable's value is `\"fast\"`, the death test statement is\n        immediately executed.\n    *   If the variable's value is `\"threadsafe\"`, the child process re-executes\n        the unit test binary just as it was originally invoked, but with some\n        extra flags to cause just the single death test under consideration to\n        be run.\n*   On Windows, the child is spawned using the `CreateProcess()` API, and\n    re-executes the binary to cause just the single death test under\n    consideration to be run - much like the `threadsafe` mode on POSIX.\n\nOther values for the variable are illegal and will cause the death test to fail.\nCurrently, the flag's default value is\n\"fast\". However, we reserve\nthe right to change it in the future. Therefore, your tests should not depend on\nthis. In either case, the parent process waits for the child process to\ncomplete, and checks that\n\n1.  the child's exit status satisfies the predicate, and\n2.  the child's stderr matches the regular expression.\n\nIf the death test statement runs to completion without dying, the child process\nwill nonetheless terminate, and the assertion fails.\n\n### Death Tests And Threads\n\nThe reason for the two death test styles has to do with thread safety. Due to\nwell-known problems with forking in the presence of threads, death tests should\nbe run in a single-threaded context. Sometimes, however, it isn't feasible to\narrange that kind of environment. For example, statically-initialized modules\nmay start threads before main is ever reached. Once threads have been created,\nit may be difficult or impossible to clean them up.\n\ngoogletest has three features intended to raise awareness of threading issues.\n\n1.  A warning is emitted if multiple threads are running when a death test is\n    encountered.\n2.  Test cases with a name ending in \"DeathTest\" are run before all other tests.\n3.  It uses `clone()` instead of `fork()` to spawn the child process on Linux\n    (`clone()` is not available on Cygwin and Mac), as `fork()` is more likely\n    to cause the child to hang when the parent process has multiple threads.\n\nIt's perfectly fine to create threads inside a death test statement; they are\nexecuted in a separate process and cannot affect the parent.\n\n### Death Test Styles\n\n\nThe \"threadsafe\" death test style was introduced in order to help mitigate the\nrisks of testing in a possibly multithreaded environment. It trades increased\ntest execution time (potentially dramatically so) for improved thread safety.\n\nThe automated testing framework does not set the style flag. You can choose a\nparticular style of death tests by setting the flag programmatically:\n\n```c++\ntesting::FLAGS_gtest_death_test_style=\"threadsafe\"\n```\n\nYou can do this in `main()` to set the style for all death tests in the binary,\nor in individual tests. Recall that flags are saved before running each test and\nrestored afterwards, so you need not do that yourself. For example:\n\n```c++\nint main(int argc, char** argv) {\n  InitGoogle(argv[0], &argc, &argv, true);\n  ::testing::FLAGS_gtest_death_test_style = \"fast\";\n  return RUN_ALL_TESTS();\n}\n\nTEST(MyDeathTest, TestOne) {\n  ::testing::FLAGS_gtest_death_test_style = \"threadsafe\";\n  // This test is run in the \"threadsafe\" style:\n  ASSERT_DEATH(ThisShouldDie(), \"\");\n}\n\nTEST(MyDeathTest, TestTwo) {\n  // This test is run in the \"fast\" style:\n  ASSERT_DEATH(ThisShouldDie(), \"\");\n}\n```\n\n\n### Caveats\n\nThe `statement` argument of `ASSERT_EXIT()` can be any valid C++ statement. If\nit leaves the current function via a `return` statement or by throwing an\nexception, the death test is considered to have failed. Some googletest macros\nmay return from the current function (e.g. `ASSERT_TRUE()`), so be sure to avoid\nthem in `statement`.\n\nSince `statement` runs in the child process, any in-memory side effect (e.g.\nmodifying a variable, releasing memory, etc) it causes will *not* be observable\nin the parent process. In particular, if you release memory in a death test,\nyour program will fail the heap check as the parent process will never see the\nmemory reclaimed. To solve this problem, you can\n\n1.  try not to free memory in a death test;\n2.  free the memory again in the parent process; or\n3.  do not use the heap checker in your program.\n\nDue to an implementation detail, you cannot place multiple death test assertions\non the same line; otherwise, compilation will fail with an unobvious error\nmessage.\n\nDespite the improved thread safety afforded by the \"threadsafe\" style of death\ntest, thread problems such as deadlock are still possible in the presence of\nhandlers registered with `pthread_atfork(3)`.\n\n\n## Using Assertions in Sub-routines\n\n### Adding Traces to Assertions\n\nIf a test sub-routine is called from several places, when an assertion inside it\nfails, it can be hard to tell which invocation of the sub-routine the failure is\nfrom. \nYou can alleviate this problem using extra logging or custom failure messages,\nbut that usually clutters up your tests. A better solution is to use the\n`SCOPED_TRACE` macro or the `ScopedTrace` utility:\n\n```c++\nSCOPED_TRACE(message);\nScopedTrace trace(\"file_path\", line_number, message);\n```\n\nwhere `message` can be anything streamable to `std::ostream`. `SCOPED_TRACE`\nmacro will cause the current file name, line number, and the given message to be\nadded in every failure message. `ScopedTrace` accepts explicit file name and\nline number in arguments, which is useful for writing test helpers. The effect\nwill be undone when the control leaves the current lexical scope.\n\nFor example,\n\n```c++\n10: void Sub1(int n) {\n11:   EXPECT_EQ(1, Bar(n));\n12:   EXPECT_EQ(2, Bar(n + 1));\n13: }\n14:\n15: TEST(FooTest, Bar) {\n16:   {\n17:     SCOPED_TRACE(\"A\");  // This trace point will be included in\n18:                         // every failure in this scope.\n19:     Sub1(1);\n20:   }\n21:   // Now it won't.\n22:   Sub1(9);\n23: }\n```\n\ncould result in messages like these:\n\n```none\npath/to/foo_test.cc:11: Failure\nValue of: Bar(n)\nExpected: 1\n  Actual: 2\n   Trace:\npath/to/foo_test.cc:17: A\n\npath/to/foo_test.cc:12: Failure\nValue of: Bar(n + 1)\nExpected: 2\n  Actual: 3\n```\n\nWithout the trace, it would've been difficult to know which invocation of\n`Sub1()` the two failures come from respectively. (You could add\n\nan extra message to each assertion in `Sub1()` to indicate the value of `n`, but\nthat's tedious.)\n\nSome tips on using `SCOPED_TRACE`:\n\n1.  With a suitable message, it's often enough to use `SCOPED_TRACE` at the\n    beginning of a sub-routine, instead of at each call site.\n2.  When calling sub-routines inside a loop, make the loop iterator part of the\n    message in `SCOPED_TRACE` such that you can know which iteration the failure\n    is from.\n3.  Sometimes the line number of the trace point is enough for identifying the\n    particular invocation of a sub-routine. In this case, you don't have to\n    choose a unique message for `SCOPED_TRACE`. You can simply use `\"\"`.\n4.  You can use `SCOPED_TRACE` in an inner scope when there is one in the outer\n    scope. In this case, all active trace points will be included in the failure\n    messages, in reverse order they are encountered.\n5.  The trace dump is clickable in Emacs - hit `return` on a line number and\n    you'll be taken to that line in the source file!\n\n**Availability**: Linux, Windows, Mac.\n\n### Propagating Fatal Failures\n\nA common pitfall when using `ASSERT_*` and `FAIL*` is not understanding that\nwhen they fail they only abort the _current function_, not the entire test. For\nexample, the following test will segfault:\n\n```c++\nvoid Subroutine() {\n  // Generates a fatal failure and aborts the current function.\n  ASSERT_EQ(1, 2);\n\n  // The following won't be executed.\n  ...\n}\n\nTEST(FooTest, Bar) {\n  Subroutine();  // The intended behavior is for the fatal failure\n                 // in Subroutine() to abort the entire test.\n\n  // The actual behavior: the function goes on after Subroutine() returns.\n  int* p = NULL;\n  *p = 3;  // Segfault!\n}\n```\n\nTo alleviate this, googletest provides three different solutions. You could use\neither exceptions, the `(ASSERT|EXPECT)_NO_FATAL_FAILURE` assertions or the\n`HasFatalFailure()` function. They are described in the following two\nsubsections.\n\n#### Asserting on Subroutines with an exception\n\nThe following code can turn ASSERT-failure into an exception:\n\n```c++\nclass ThrowListener : public testing::EmptyTestEventListener {\n  void OnTestPartResult(const testing::TestPartResult& result) override {\n    if (result.type() == testing::TestPartResult::kFatalFailure) {\n      throw testing::AssertionException(result);\n    }\n  }\n};\nint main(int argc, char** argv) {\n  ...\n  testing::UnitTest::GetInstance()->listeners().Append(new ThrowListener);\n  return RUN_ALL_TESTS();\n}\n```\n\nThis listener should be added after other listeners if you have any, otherwise\nthey won't see failed `OnTestPartResult`.\n\n#### Asserting on Subroutines\n\nAs shown above, if your test calls a subroutine that has an `ASSERT_*` failure\nin it, the test will continue after the subroutine returns. This may not be what\nyou want.\n\nOften people want fatal failures to propagate like exceptions. For that\ngoogletest offers the following macros:\n\nFatal assertion                       | Nonfatal assertion                    | Verifies\n------------------------------------- | ------------------------------------- | --------\n`ASSERT_NO_FATAL_FAILURE(statement);` | `EXPECT_NO_FATAL_FAILURE(statement);` | `statement` doesn't generate any new fatal failures in the current thread.\n\nOnly failures in the thread that executes the assertion are checked to determine\nthe result of this type of assertions. If `statement` creates new threads,\nfailures in these threads are ignored.\n\nExamples:\n\n```c++\nASSERT_NO_FATAL_FAILURE(Foo());\n\nint i;\nEXPECT_NO_FATAL_FAILURE({\n  i = Bar();\n});\n```\n\n**Availability**: Linux, Windows, Mac. Assertions from multiple threads are\ncurrently not supported on Windows.\n\n#### Checking for Failures in the Current Test\n\n`HasFatalFailure()` in the `::testing::Test` class returns `true` if an\nassertion in the current test has suffered a fatal failure. This allows\nfunctions to catch fatal failures in a sub-routine and return early.\n\n```c++\nclass Test {\n public:\n  ...\n  static bool HasFatalFailure();\n};\n```\n\nThe typical usage, which basically simulates the behavior of a thrown exception,\nis:\n\n```c++\nTEST(FooTest, Bar) {\n  Subroutine();\n  // Aborts if Subroutine() had a fatal failure.\n  if (HasFatalFailure()) return;\n\n  // The following won't be executed.\n  ...\n}\n```\n\nIf `HasFatalFailure()` is used outside of `TEST()` , `TEST_F()` , or a test\nfixture, you must add the `::testing::Test::` prefix, as in:\n\n```c++\nif (::testing::Test::HasFatalFailure()) return;\n```\n\nSimilarly, `HasNonfatalFailure()` returns `true` if the current test has at\nleast one non-fatal failure, and `HasFailure()` returns `true` if the current\ntest has at least one failure of either kind.\n\n**Availability**: Linux, Windows, Mac.\n\n## Logging Additional Information\n\nIn your test code, you can call `RecordProperty(\"key\", value)` to log additional\ninformation, where `value` can be either a string or an `int`. The *last* value\nrecorded for a key will be emitted to the [XML output](#generating-an-xml-report) if you\nspecify one. For example, the test\n\n```c++\nTEST_F(WidgetUsageTest, MinAndMaxWidgets) {\n  RecordProperty(\"MaximumWidgets\", ComputeMaxUsage());\n  RecordProperty(\"MinimumWidgets\", ComputeMinUsage());\n}\n```\n\nwill output XML like this:\n\n```xml\n  ...\n    <testcase name=\"MinAndMaxWidgets\" status=\"run\" time=\"0.006\" classname=\"WidgetUsageTest\" MaximumWidgets=\"12\" MinimumWidgets=\"9\" />\n  ...\n```\n\n> NOTE:\n>\n> *   `RecordProperty()` is a static member of the `Test` class. Therefore it\n>     needs to be prefixed with `::testing::Test::` if used outside of the\n>     `TEST` body and the test fixture class.\n> *   `*key*` must be a valid XML attribute name, and cannot conflict with the\n>     ones already used by googletest (`name`, `status`, `time`, `classname`,\n>     `type_param`, and `value_param`).\n> *   Calling `RecordProperty()` outside of the lifespan of a test is allowed.\n>     If it's called outside of a test but between a test case's\n>     `SetUpTestCase()` and `TearDownTestCase()` methods, it will be attributed\n>     to the XML element for the test case. If it's called outside of all test\n>     cases (e.g. in a test environment), it will be attributed to the top-level\n>     XML element.\n\n**Availability**: Linux, Windows, Mac.\n\n## Sharing Resources Between Tests in the Same Test Case\n\ngoogletest creates a new test fixture object for each test in order to make\ntests independent and easier to debug. However, sometimes tests use resources\nthat are expensive to set up, making the one-copy-per-test model prohibitively\nexpensive.\n\nIf the tests don't change the resource, there's no harm in their sharing a\nsingle resource copy. So, in addition to per-test set-up/tear-down, googletest\nalso supports per-test-case set-up/tear-down. To use it:\n\n1.  In your test fixture class (say `FooTest` ), declare as `static` some member\n    variables to hold the shared resources.\n1.  Outside your test fixture class (typically just below it), define those\n    member variables, optionally giving them initial values.\n1.  In the same test fixture class, define a `static void SetUpTestCase()`\n    function (remember not to spell it as **`SetupTestCase`** with a small `u`!)\n    to set up the shared resources and a `static void TearDownTestCase()`\n    function to tear them down.\n\nThat's it! googletest automatically calls `SetUpTestCase()` before running the\n*first test* in the `FooTest` test case (i.e. before creating the first\n`FooTest` object), and calls `TearDownTestCase()` after running the *last test*\nin it (i.e. after deleting the last `FooTest` object). In between, the tests can\nuse the shared resources.\n\nRemember that the test order is undefined, so your code can't depend on a test\npreceding or following another. Also, the tests must either not modify the state\nof any shared resource, or, if they do modify the state, they must restore the\nstate to its original value before passing control to the next test.\n\nHere's an example of per-test-case set-up and tear-down:\n\n```c++\nclass FooTest : public ::testing::Test {\n protected:\n  // Per-test-case set-up.\n  // Called before the first test in this test case.\n  // Can be omitted if not needed.\n  static void SetUpTestCase() {\n    shared_resource_ = new ...;\n  }\n\n  // Per-test-case tear-down.\n  // Called after the last test in this test case.\n  // Can be omitted if not needed.\n  static void TearDownTestCase() {\n    delete shared_resource_;\n    shared_resource_ = NULL;\n  }\n\n  // You can define per-test set-up logic as usual.\n  virtual void SetUp() { ... }\n\n  // You can define per-test tear-down logic as usual.\n  virtual void TearDown() { ... }\n\n  // Some expensive resource shared by all tests.\n  static T* shared_resource_;\n};\n\nT* FooTest::shared_resource_ = NULL;\n\nTEST_F(FooTest, Test1) {\n  ... you can refer to shared_resource_ here ...\n}\n\nTEST_F(FooTest, Test2) {\n  ... you can refer to shared_resource_ here ...\n}\n```\n\nNOTE: Though the above code declares `SetUpTestCase()` protected, it may\nsometimes be necessary to declare it public, such as when using it with\n`TEST_P`.\n\n**Availability**: Linux, Windows, Mac.\n\n## Global Set-Up and Tear-Down\n\nJust as you can do set-up and tear-down at the test level and the test case\nlevel, you can also do it at the test program level. Here's how.\n\nFirst, you subclass the `::testing::Environment` class to define a test\nenvironment, which knows how to set-up and tear-down:\n\n```c++\nclass Environment {\n public:\n  virtual ~Environment() {}\n\n  // Override this to define how to set up the environment.\n  virtual void SetUp() {}\n\n  // Override this to define how to tear down the environment.\n  virtual void TearDown() {}\n};\n```\n\nThen, you register an instance of your environment class with googletest by\ncalling the `::testing::AddGlobalTestEnvironment()` function:\n\n```c++\nEnvironment* AddGlobalTestEnvironment(Environment* env);\n```\n\nNow, when `RUN_ALL_TESTS()` is called, it first calls the `SetUp()` method of\nthe environment object, then runs the tests if there was no fatal failures, and\nfinally calls `TearDown()` of the environment object.\n\nIt's OK to register multiple environment objects. In this case, their `SetUp()`\nwill be called in the order they are registered, and their `TearDown()` will be\ncalled in the reverse order.\n\nNote that googletest takes ownership of the registered environment objects.\nTherefore **do not delete them** by yourself.\n\nYou should call `AddGlobalTestEnvironment()` before `RUN_ALL_TESTS()` is called,\nprobably in `main()`. If you use `gtest_main`, you need to call this before\n`main()` starts for it to take effect. One way to do this is to define a global\nvariable like this:\n\n```c++\n::testing::Environment* const foo_env =\n    ::testing::AddGlobalTestEnvironment(new FooEnvironment);\n```\n\nHowever, we strongly recommend you to write your own `main()` and call\n`AddGlobalTestEnvironment()` there, as relying on initialization of global\nvariables makes the code harder to read and may cause problems when you register\nmultiple environments from different translation units and the environments have\ndependencies among them (remember that the compiler doesn't guarantee the order\nin which global variables from different translation units are initialized).\n\n## Value-Parameterized Tests\n\n*Value-parameterized tests* allow you to test your code with different\nparameters without writing multiple copies of the same test. This is useful in a\nnumber of situations, for example:\n\n*   You have a piece of code whose behavior is affected by one or more\n    command-line flags. You want to make sure your code performs correctly for\n    various values of those flags.\n*   You want to test different implementations of an OO interface.\n*   You want to test your code over various inputs (a.k.a. data-driven testing).\n    This feature is easy to abuse, so please exercise your good sense when doing\n    it!\n\n### How to Write Value-Parameterized Tests\n\nTo write value-parameterized tests, first you should define a fixture class. It\nmust be derived from both `::testing::Test` and\n`::testing::WithParamInterface<T>` (the latter is a pure interface), where `T`\nis the type of your parameter values. For convenience, you can just derive the\nfixture class from `::testing::TestWithParam<T>`, which itself is derived from\nboth `::testing::Test` and `::testing::WithParamInterface<T>`. `T` can be any\ncopyable type. If it's a raw pointer, you are responsible for managing the\nlifespan of the pointed values.\n\nNOTE: If your test fixture defines `SetUpTestCase()` or `TearDownTestCase()`\nthey must be declared **public** rather than **protected** in order to use\n`TEST_P`.\n\n```c++\nclass FooTest :\n    public ::testing::TestWithParam<const char*> {\n  // You can implement all the usual fixture class members here.\n  // To access the test parameter, call GetParam() from class\n  // TestWithParam<T>.\n};\n\n// Or, when you want to add parameters to a pre-existing fixture class:\nclass BaseTest : public ::testing::Test {\n  ...\n};\nclass BarTest : public BaseTest,\n                public ::testing::WithParamInterface<const char*> {\n  ...\n};\n```\n\nThen, use the `TEST_P` macro to define as many test patterns using this fixture\nas you want. The `_P` suffix is for \"parameterized\" or \"pattern\", whichever you\nprefer to think.\n\n```c++\nTEST_P(FooTest, DoesBlah) {\n  // Inside a test, access the test parameter with the GetParam() method\n  // of the TestWithParam<T> class:\n  EXPECT_TRUE(foo.Blah(GetParam()));\n  ...\n}\n\nTEST_P(FooTest, HasBlahBlah) {\n  ...\n}\n```\n\nFinally, you can use `INSTANTIATE_TEST_CASE_P` to instantiate the test case with\nany set of parameters you want. googletest defines a number of functions for\ngenerating test parameters. They return what we call (surprise!) *parameter\ngenerators*. Here is a summary of them, which are all in the `testing`\nnamespace:\n\n| Parameter Generator          | Behavior                                    |\n| ---------------------------- | ------------------------------------------- |\n| `Range(begin, end [, step])` | Yields values `{begin, begin+step, begin+step+step, ...}`. The values do not include `end`. `step` defaults to 1.      |\n| `Values(v1, v2, ..., vN)`    | Yields values `{v1, v2, ..., vN}`.          |\n| `ValuesIn(container)` and `ValuesIn(begin,end)`   | Yields values from a C-style array, an STL-style container, or an iterator range  `[begin, end)`. |\n| `Bool()`                     | Yields sequence `{false, true}`.            |\n| `Combine(g1, g2, ..., gN)`   | Yields all combinations (Cartesian product) as std\\:\\:tuples of the values generated by the `N` generators.            |\n\nFor more details, see the comments at the definitions of these functions.\n\nThe following statement will instantiate tests from the `FooTest` test case each\nwith parameter values `\"meeny\"`, `\"miny\"`, and `\"moe\"`.\n\n```c++\nINSTANTIATE_TEST_CASE_P(InstantiationName,\n                        FooTest,\n                        ::testing::Values(\"meeny\", \"miny\", \"moe\"));\n```\n\nNOTE: The code above must be placed at global or namespace scope, not at\nfunction scope.\n\nNOTE: Don't forget this step! If you do your test will silently pass, but none\nof its cases will ever run!\n\nTo distinguish different instances of the pattern (yes, you can instantiate it\nmore than once), the first argument to `INSTANTIATE_TEST_CASE_P` is a prefix\nthat will be added to the actual test case name. Remember to pick unique\nprefixes for different instantiations. The tests from the instantiation above\nwill have these names:\n\n*   `InstantiationName/FooTest.DoesBlah/0` for `\"meeny\"`\n*   `InstantiationName/FooTest.DoesBlah/1` for `\"miny\"`\n*   `InstantiationName/FooTest.DoesBlah/2` for `\"moe\"`\n*   `InstantiationName/FooTest.HasBlahBlah/0` for `\"meeny\"`\n*   `InstantiationName/FooTest.HasBlahBlah/1` for `\"miny\"`\n*   `InstantiationName/FooTest.HasBlahBlah/2` for `\"moe\"`\n\nYou can use these names in [`--gtest_filter`](#running-a-subset-of-the-tests).\n\nThis statement will instantiate all tests from `FooTest` again, each with\nparameter values `\"cat\"` and `\"dog\"`:\n\n```c++\nconst char* pets[] = {\"cat\", \"dog\"};\nINSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest,\n                        ::testing::ValuesIn(pets));\n```\n\nThe tests from the instantiation above will have these names:\n\n*   `AnotherInstantiationName/FooTest.DoesBlah/0` for `\"cat\"`\n*   `AnotherInstantiationName/FooTest.DoesBlah/1` for `\"dog\"`\n*   `AnotherInstantiationName/FooTest.HasBlahBlah/0` for `\"cat\"`\n*   `AnotherInstantiationName/FooTest.HasBlahBlah/1` for `\"dog\"`\n\nPlease note that `INSTANTIATE_TEST_CASE_P` will instantiate *all* tests in the\ngiven test case, whether their definitions come before or *after* the\n`INSTANTIATE_TEST_CASE_P` statement.\n\nYou can see sample7_unittest.cc and sample8_unittest.cc for more examples.\n\n**Availability**: Linux, Windows (requires MSVC 8.0 or above), Mac\n\n### Creating Value-Parameterized Abstract Tests\n\nIn the above, we define and instantiate `FooTest` in the *same* source file.\nSometimes you may want to define value-parameterized tests in a library and let\nother people instantiate them later. This pattern is known as *abstract tests*.\nAs an example of its application, when you are designing an interface you can\nwrite a standard suite of abstract tests (perhaps using a factory function as\nthe test parameter) that all implementations of the interface are expected to\npass. When someone implements the interface, they can instantiate your suite to\nget all the interface-conformance tests for free.\n\nTo define abstract tests, you should organize your code like this:\n\n1.  Put the definition of the parameterized test fixture class (e.g. `FooTest`)\n    in a header file, say `foo_param_test.h`. Think of this as *declaring* your\n    abstract tests.\n1.  Put the `TEST_P` definitions in `foo_param_test.cc`, which includes\n    `foo_param_test.h`. Think of this as *implementing* your abstract tests.\n\nOnce they are defined, you can instantiate them by including `foo_param_test.h`,\ninvoking `INSTANTIATE_TEST_CASE_P()`, and depending on the library target that\ncontains `foo_param_test.cc`. You can instantiate the same abstract test case\nmultiple times, possibly in different source files.\n\n### Specifying Names for Value-Parameterized Test Parameters\n\nThe optional last argument to `INSTANTIATE_TEST_CASE_P()` allows the user to\nspecify a function or functor that generates custom test name suffixes based on\nthe test parameters. The function should accept one argument of type\n`testing::TestParamInfo<class ParamType>`, and return `std::string`.\n\n`testing::PrintToStringParamName` is a builtin test suffix generator that\nreturns the value of `testing::PrintToString(GetParam())`. It does not work for\n`std::string` or C strings.\n\nNOTE: test names must be non-empty, unique, and may only contain ASCII\nalphanumeric characters. In particular, they [should not contain\nunderscores](https://g3doc.corp.google.com/third_party/googletest/googletest/g3doc/faq.md#no-underscores).\n\n```c++\nclass MyTestCase : public testing::TestWithParam<int> {};\n\nTEST_P(MyTestCase, MyTest)\n{\n  std::cout << \"Example Test Param: \" << GetParam() << std::endl;\n}\n\nINSTANTIATE_TEST_CASE_P(MyGroup, MyTestCase, testing::Range(0, 10),\n                        testing::PrintToStringParamName());\n```\n\n## Typed Tests</id>\n\nSuppose you have multiple implementations of the same interface and want to make\nsure that all of them satisfy some common requirements. Or, you may have defined\nseveral types that are supposed to conform to the same \"concept\" and you want to\nverify it. In both cases, you want the same test logic repeated for different\ntypes.\n\nWhile you can write one `TEST` or `TEST_F` for each type you want to test (and\nyou may even factor the test logic into a function template that you invoke from\nthe `TEST`), it's tedious and doesn't scale: if you want `m` tests over `n`\ntypes, you'll end up writing `m*n` `TEST`s.\n\n*Typed tests* allow you to repeat the same test logic over a list of types. You\nonly need to write the test logic once, although you must know the type list\nwhen writing typed tests. Here's how you do it:\n\nFirst, define a fixture class template. It should be parameterized by a type.\nRemember to derive it from `::testing::Test`:\n\n```c++\ntemplate <typename T>\nclass FooTest : public ::testing::Test {\n public:\n  ...\n  typedef std::list<T> List;\n  static T shared_;\n  T value_;\n};\n```\n\nNext, associate a list of types with the test case, which will be repeated for\neach type in the list:\n\n```c++\nusing MyTypes = ::testing::Types<char, int, unsigned int>;\nTYPED_TEST_CASE(FooTest, MyTypes);\n```\n\nThe type alias (`using` or `typedef`) is necessary for the `TYPED_TEST_CASE`\nmacro to parse correctly. Otherwise the compiler will think that each comma in\nthe type list introduces a new macro argument.\n\nThen, use `TYPED_TEST()` instead of `TEST_F()` to define a typed test for this\ntest case. You can repeat this as many times as you want:\n\n```c++\nTYPED_TEST(FooTest, DoesBlah) {\n  // Inside a test, refer to the special name TypeParam to get the type\n  // parameter.  Since we are inside a derived class template, C++ requires\n  // us to visit the members of FooTest via 'this'.\n  TypeParam n = this->value_;\n\n  // To visit static members of the fixture, add the 'TestFixture::'\n  // prefix.\n  n += TestFixture::shared_;\n\n  // To refer to typedefs in the fixture, add the 'typename TestFixture::'\n  // prefix.  The 'typename' is required to satisfy the compiler.\n  typename TestFixture::List values;\n\n  values.push_back(n);\n  ...\n}\n\nTYPED_TEST(FooTest, HasPropertyA) { ... }\n```\n\nYou can see sample6_unittest.cc\n\n**Availability**: Linux, Windows (requires MSVC 8.0 or above), Mac\n\n## Type-Parameterized Tests\n\n*Type-parameterized tests* are like typed tests, except that they don't require\nyou to know the list of types ahead of time. Instead, you can define the test\nlogic first and instantiate it with different type lists later. You can even\ninstantiate it more than once in the same program.\n\nIf you are designing an interface or concept, you can define a suite of\ntype-parameterized tests to verify properties that any valid implementation of\nthe interface/concept should have. Then, the author of each implementation can\njust instantiate the test suite with their type to verify that it conforms to\nthe requirements, without having to write similar tests repeatedly. Here's an\nexample:\n\nFirst, define a fixture class template, as we did with typed tests:\n\n```c++\ntemplate <typename T>\nclass FooTest : public ::testing::Test {\n  ...\n};\n```\n\nNext, declare that you will define a type-parameterized test case:\n\n```c++\nTYPED_TEST_CASE_P(FooTest);\n```\n\nThen, use `TYPED_TEST_P()` to define a type-parameterized test. You can repeat\nthis as many times as you want:\n\n```c++\nTYPED_TEST_P(FooTest, DoesBlah) {\n  // Inside a test, refer to TypeParam to get the type parameter.\n  TypeParam n = 0;\n  ...\n}\n\nTYPED_TEST_P(FooTest, HasPropertyA) { ... }\n```\n\nNow the tricky part: you need to register all test patterns using the\n`REGISTER_TYPED_TEST_CASE_P` macro before you can instantiate them. The first\nargument of the macro is the test case name; the rest are the names of the tests\nin this test case:\n\n```c++\nREGISTER_TYPED_TEST_CASE_P(FooTest,\n                           DoesBlah, HasPropertyA);\n```\n\nFinally, you are free to instantiate the pattern with the types you want. If you\nput the above code in a header file, you can `#include` it in multiple C++\nsource files and instantiate it multiple times.\n\n```c++\ntypedef ::testing::Types<char, int, unsigned int> MyTypes;\nINSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);\n```\n\nTo distinguish different instances of the pattern, the first argument to the\n`INSTANTIATE_TYPED_TEST_CASE_P` macro is a prefix that will be added to the\nactual test case name. Remember to pick unique prefixes for different instances.\n\nIn the special case where the type list contains only one type, you can write\nthat type directly without `::testing::Types<...>`, like this:\n\n```c++\nINSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);\n```\n\nYou can see `sample6_unittest.cc` for a complete example.\n\n**Availability**: Linux, Windows (requires MSVC 8.0 or above), Mac\n\n## Testing Private Code\n\nIf you change your software's internal implementation, your tests should not\nbreak as long as the change is not observable by users. Therefore, **per the\nblack-box testing principle, most of the time you should test your code through\nits public interfaces.**\n\n**If you still find yourself needing to test internal implementation code,\nconsider if there's a better design.** The desire to test internal\nimplementation is often a sign that the class is doing too much. Consider\nextracting an implementation class, and testing it. Then use that implementation\nclass in the original class.\n\nIf you absolutely have to test non-public interface code though, you can. There\nare two cases to consider:\n\n*   Static functions ( *not* the same as static member functions!) or unnamed\n    namespaces, and\n*   Private or protected class members\n\nTo test them, we use the following special techniques:\n\n*   Both static functions and definitions/declarations in an unnamed namespace\n    are only visible within the same translation unit. To test them, you can\n    `#include` the entire `.cc` file being tested in your `*_test.cc` file.\n    (including `.cc` files is not a good way to reuse code - you should not do\n    this in production code!)\n\n    However, a better approach is to move the private code into the\n    `foo::internal` namespace, where `foo` is the namespace your project\n    normally uses, and put the private declarations in a `*-internal.h` file.\n    Your production `.cc` files and your tests are allowed to include this\n    internal header, but your clients are not. This way, you can fully test your\n    internal implementation without leaking it to your clients.\n\n*   Private class members are only accessible from within the class or by\n    friends. To access a class' private members, you can declare your test\n    fixture as a friend to the class and define accessors in your fixture. Tests\n    using the fixture can then access the private members of your production\n    class via the accessors in the fixture. Note that even though your fixture\n    is a friend to your production class, your tests are not automatically\n    friends to it, as they are technically defined in sub-classes of the\n    fixture.\n\n    Another way to test private members is to refactor them into an\n    implementation class, which is then declared in a `*-internal.h` file. Your\n    clients aren't allowed to include this header but your tests can. Such is\n    called the\n    [Pimpl](https://www.gamedev.net/articles/programming/general-and-gameplay-programming/the-c-pimpl-r1794/)\n    (Private Implementation) idiom.\n\n    Or, you can declare an individual test as a friend of your class by adding\n    this line in the class body:\n\n    ```c++\n        FRIEND_TEST(TestCaseName, TestName);\n    ```\n\n    For example,\n\n    ```c++\n    // foo.h\n\n    #include \"gtest/gtest_prod.h\"\n\n    class Foo {\n      ...\n    private:\n      FRIEND_TEST(FooTest, BarReturnsZeroOnNull);\n\n      int Bar(void* x);\n    };\n\n    // foo_test.cc\n    ...\n    TEST(FooTest, BarReturnsZeroOnNull) {\n      Foo foo;\n      EXPECT_EQ(0, foo.Bar(NULL));  // Uses Foo's private member Bar().\n    }\n    ```\n\n    Pay special attention when your class is defined in a namespace, as you\n    should define your test fixtures and tests in the same namespace if you want\n    them to be friends of your class. For example, if the code to be tested\n    looks like:\n\n    ```c++\n    namespace my_namespace {\n\n    class Foo {\n      friend class FooTest;\n      FRIEND_TEST(FooTest, Bar);\n      FRIEND_TEST(FooTest, Baz);\n      ... definition of the class Foo ...\n    };\n\n    }  // namespace my_namespace\n    ```\n\n    Your test code should be something like:\n\n    ```c++\n    namespace my_namespace {\n\n    class FooTest : public ::testing::Test {\n     protected:\n      ...\n    };\n\n    TEST_F(FooTest, Bar) { ... }\n    TEST_F(FooTest, Baz) { ... }\n\n    }  // namespace my_namespace\n    ```\n\n\n## \"Catching\" Failures\n\nIf you are building a testing utility on top of googletest, you'll want to test\nyour utility. What framework would you use to test it? googletest, of course.\n\nThe challenge is to verify that your testing utility reports failures correctly.\nIn frameworks that report a failure by throwing an exception, you could catch\nthe exception and assert on it. But googletest doesn't use exceptions, so how do\nwe test that a piece of code generates an expected failure?\n\ngunit-spi.h contains some constructs to do this. After #including this header,\nyou can use\n\n```c++\n  EXPECT_FATAL_FAILURE(statement, substring);\n```\n\nto assert that `statement` generates a fatal (e.g. `ASSERT_*`) failure in the\ncurrent thread whose message contains the given `substring`, or use\n\n```c++\n  EXPECT_NONFATAL_FAILURE(statement, substring);\n```\n\nif you are expecting a non-fatal (e.g. `EXPECT_*`) failure.\n\nOnly failures in the current thread are checked to determine the result of this\ntype of expectations. If `statement` creates new threads, failures in these\nthreads are also ignored. If you want to catch failures in other threads as\nwell, use one of the following macros instead:\n\n```c++\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substring);\n  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substring);\n```\n\nNOTE: Assertions from multiple threads are currently not supported on Windows.\n\nFor technical reasons, there are some caveats:\n\n1.  You cannot stream a failure message to either macro.\n\n1.  `statement` in `EXPECT_FATAL_FAILURE{_ON_ALL_THREADS}()` cannot reference\n    local non-static variables or non-static members of `this` object.\n\n1.  `statement` in `EXPECT_FATAL_FAILURE{_ON_ALL_THREADS}()()` cannot return a\n    value.\n\n\n## Getting the Current Test's Name\n\nSometimes a function may need to know the name of the currently running test.\nFor example, you may be using the `SetUp()` method of your test fixture to set\nthe golden file name based on which test is running. The `::testing::TestInfo`\nclass has this information:\n\n```c++\nnamespace testing {\n\nclass TestInfo {\n public:\n  // Returns the test case name and the test name, respectively.\n  //\n  // Do NOT delete or free the return value - it's managed by the\n  // TestInfo class.\n  const char* test_case_name() const;\n  const char* name() const;\n};\n\n}\n```\n\nTo obtain a `TestInfo` object for the currently running test, call\n`current_test_info()` on the `UnitTest` singleton object:\n\n```c++\n  // Gets information about the currently running test.\n  // Do NOT delete the returned object - it's managed by the UnitTest class.\n  const ::testing::TestInfo* const test_info =\n    ::testing::UnitTest::GetInstance()->current_test_info();\n\n\n\n  printf(\"We are in test %s of test case %s.\\n\",\n         test_info->name(),\n         test_info->test_case_name());\n```\n\n`current_test_info()` returns a null pointer if no test is running. In\nparticular, you cannot find the test case name in `TestCaseSetUp()`,\n`TestCaseTearDown()` (where you know the test case name implicitly), or\nfunctions called from them.\n\n**Availability**: Linux, Windows, Mac.\n\n## Extending googletest by Handling Test Events\n\ngoogletest provides an **event listener API** to let you receive notifications\nabout the progress of a test program and test failures. The events you can\nlisten to include the start and end of the test program, a test case, or a test\nmethod, among others. You may use this API to augment or replace the standard\nconsole output, replace the XML output, or provide a completely different form\nof output, such as a GUI or a database. You can also use test events as\ncheckpoints to implement a resource leak checker, for example.\n\n**Availability**: Linux, Windows, Mac.\n\n### Defining Event Listeners\n\nTo define a event listener, you subclass either testing::TestEventListener or\ntesting::EmptyTestEventListener The former is an (abstract) interface, where\n*each pure virtual method can be overridden to handle a test event* (For\nexample, when a test starts, the `OnTestStart()` method will be called.). The\nlatter provides an empty implementation of all methods in the interface, such\nthat a subclass only needs to override the methods it cares about.\n\nWhen an event is fired, its context is passed to the handler function as an\nargument. The following argument types are used:\n\n*   UnitTest reflects the state of the entire test program,\n*   TestCase has information about a test case, which can contain one or more\n    tests,\n*   TestInfo contains the state of a test, and\n*   TestPartResult represents the result of a test assertion.\n\nAn event handler function can examine the argument it receives to find out\ninteresting information about the event and the test program's state.\n\nHere's an example:\n\n```c++\n  class MinimalistPrinter : public ::testing::EmptyTestEventListener {\n    // Called before a test starts.\n    virtual void OnTestStart(const ::testing::TestInfo& test_info) {\n      printf(\"*** Test %s.%s starting.\\n\",\n             test_info.test_case_name(), test_info.name());\n    }\n\n    // Called after a failed assertion or a SUCCESS().\n    virtual void OnTestPartResult(const ::testing::TestPartResult& test_part_result) {\n      printf(\"%s in %s:%d\\n%s\\n\",\n             test_part_result.failed() ? \"*** Failure\" : \"Success\",\n             test_part_result.file_name(),\n             test_part_result.line_number(),\n             test_part_result.summary());\n    }\n\n    // Called after a test ends.\n    virtual void OnTestEnd(const ::testing::TestInfo& test_info) {\n      printf(\"*** Test %s.%s ending.\\n\",\n             test_info.test_case_name(), test_info.name());\n    }\n  };\n```\n\n### Using Event Listeners\n\nTo use the event listener you have defined, add an instance of it to the\ngoogletest event listener list (represented by class TestEventListeners - note\nthe \"s\" at the end of the name) in your `main()` function, before calling\n`RUN_ALL_TESTS()`:\n\n```c++\nint main(int argc, char** argv) {\n  ::testing::InitGoogleTest(&argc, argv);\n  // Gets hold of the event listener list.\n  ::testing::TestEventListeners& listeners =\n        ::testing::UnitTest::GetInstance()->listeners();\n  // Adds a listener to the end.  googletest takes the ownership.\n  listeners.Append(new MinimalistPrinter);\n  return RUN_ALL_TESTS();\n}\n```\n\nThere's only one problem: the default test result printer is still in effect, so\nits output will mingle with the output from your minimalist printer. To suppress\nthe default printer, just release it from the event listener list and delete it.\nYou can do so by adding one line:\n\n```c++\n  ...\n  delete listeners.Release(listeners.default_result_printer());\n  listeners.Append(new MinimalistPrinter);\n  return RUN_ALL_TESTS();\n```\n\nNow, sit back and enjoy a completely different output from your tests. For more\ndetails, you can read this sample9_unittest.cc\n\nYou may append more than one listener to the list. When an `On*Start()` or\n`OnTestPartResult()` event is fired, the listeners will receive it in the order\nthey appear in the list (since new listeners are added to the end of the list,\nthe default text printer and the default XML generator will receive the event\nfirst). An `On*End()` event will be received by the listeners in the *reverse*\norder. This allows output by listeners added later to be framed by output from\nlisteners added earlier.\n\n### Generating Failures in Listeners\n\nYou may use failure-raising macros (`EXPECT_*()`, `ASSERT_*()`, `FAIL()`, etc)\nwhen processing an event. There are some restrictions:\n\n1.  You cannot generate any failure in `OnTestPartResult()` (otherwise it will\n    cause `OnTestPartResult()` to be called recursively).\n1.  A listener that handles `OnTestPartResult()` is not allowed to generate any\n    failure.\n\nWhen you add listeners to the listener list, you should put listeners that\nhandle `OnTestPartResult()` *before* listeners that can generate failures. This\nensures that failures generated by the latter are attributed to the right test\nby the former.\n\nWe have a sample of failure-raising listener sample10_unittest.cc\n\n## Running Test Programs: Advanced Options\n\ngoogletest test programs are ordinary executables. Once built, you can run them\ndirectly and affect their behavior via the following environment variables\nand/or command line flags. For the flags to work, your programs must call\n`::testing::InitGoogleTest()` before calling `RUN_ALL_TESTS()`.\n\nTo see a list of supported flags and their usage, please run your test program\nwith the `--help` flag. You can also use `-h`, `-?`, or `/?` for short.\n\nIf an option is specified both by an environment variable and by a flag, the\nlatter takes precedence.\n\n### Selecting Tests\n\n#### Listing Test Names\n\nSometimes it is necessary to list the available tests in a program before\nrunning them so that a filter may be applied if needed. Including the flag\n`--gtest_list_tests` overrides all other flags and lists tests in the following\nformat:\n\n```none\nTestCase1.\n  TestName1\n  TestName2\nTestCase2.\n  TestName\n```\n\nNone of the tests listed are actually run if the flag is provided. There is no\ncorresponding environment variable for this flag.\n\n**Availability**: Linux, Windows, Mac.\n\n#### Running a Subset of the Tests\n\nBy default, a googletest program runs all tests the user has defined. Sometimes,\nyou want to run only a subset of the tests (e.g. for debugging or quickly\nverifying a change). If you set the `GTEST_FILTER` environment variable or the\n`--gtest_filter` flag to a filter string, googletest will only run the tests\nwhose full names (in the form of `TestCaseName.TestName`) match the filter.\n\nThe format of a filter is a '`:`'-separated list of wildcard patterns (called\nthe *positive patterns*) optionally followed by a '`-`' and another\n'`:`'-separated pattern list (called the *negative patterns*). A test matches\nthe filter if and only if it matches any of the positive patterns but does not\nmatch any of the negative patterns.\n\nA pattern may contain `'*'` (matches any string) or `'?'` (matches any single\ncharacter). For convenience, the filter\n\n`'*-NegativePatterns'` can be also written as `'-NegativePatterns'`.\n\nFor example:\n\n*   `./foo_test` Has no flag, and thus runs all its tests.\n*   `./foo_test --gtest_filter=*` Also runs everything, due to the single\n    match-everything `*` value.\n*   `./foo_test --gtest_filter=FooTest.*` Runs everything in test case `FooTest`\n    .\n*   `./foo_test --gtest_filter=*Null*:*Constructor*` Runs any test whose full\n    name contains either `\"Null\"` or `\"Constructor\"` .\n*   `./foo_test --gtest_filter=-*DeathTest.*` Runs all non-death tests.\n*   `./foo_test --gtest_filter=FooTest.*-FooTest.Bar` Runs everything in test\n    case `FooTest` except `FooTest.Bar`.\n*   `./foo_test --gtest_filter=FooTest.*:BarTest.*-FooTest.Bar:BarTest.Foo` Runs\n    everything in test case `FooTest` except `FooTest.Bar` and everything in\n    test case `BarTest` except `BarTest.Foo`.\n    \n#### Temporarily Disabling Tests\n\nIf you have a broken test that you cannot fix right away, you can add the\n`DISABLED_` prefix to its name. This will exclude it from execution. This is\nbetter than commenting out the code or using `#if 0`, as disabled tests are\nstill compiled (and thus won't rot).\n\nIf you need to disable all tests in a test case, you can either add `DISABLED_`\nto the front of the name of each test, or alternatively add it to the front of\nthe test case name.\n\nFor example, the following tests won't be run by googletest, even though they\nwill still be compiled:\n\n```c++\n// Tests that Foo does Abc.\nTEST(FooTest, DISABLED_DoesAbc) { ... }\n\nclass DISABLED_BarTest : public ::testing::Test { ... };\n\n// Tests that Bar does Xyz.\nTEST_F(DISABLED_BarTest, DoesXyz) { ... }\n```\n\nNOTE: This feature should only be used for temporary pain-relief. You still have\nto fix the disabled tests at a later date. As a reminder, googletest will print\na banner warning you if a test program contains any disabled tests.\n\nTIP: You can easily count the number of disabled tests you have using `gsearch`\nand/or `grep`. This number can be used as a metric for improving your test\nquality.\n\n**Availability**: Linux, Windows, Mac.\n\n#### Temporarily Enabling Disabled Tests\n\nTo include disabled tests in test execution, just invoke the test program with\nthe `--gtest_also_run_disabled_tests` flag or set the\n`GTEST_ALSO_RUN_DISABLED_TESTS` environment variable to a value other than `0`.\nYou can combine this with the `--gtest_filter` flag to further select which\ndisabled tests to run.\n\n**Availability**: Linux, Windows, Mac.\n\n### Repeating the Tests\n\nOnce in a while you'll run into a test whose result is hit-or-miss. Perhaps it\nwill fail only 1% of the time, making it rather hard to reproduce the bug under\na debugger. This can be a major source of frustration.\n\nThe `--gtest_repeat` flag allows you to repeat all (or selected) test methods in\na program many times. Hopefully, a flaky test will eventually fail and give you\na chance to debug. Here's how to use it:\n\n```none\n$ foo_test --gtest_repeat=1000\nRepeat foo_test 1000 times and don't stop at failures.\n\n$ foo_test --gtest_repeat=-1\nA negative count means repeating forever.\n\n$ foo_test --gtest_repeat=1000 --gtest_break_on_failure\nRepeat foo_test 1000 times, stopping at the first failure.  This\nis especially useful when running under a debugger: when the test\nfails, it will drop into the debugger and you can then inspect\nvariables and stacks.\n\n$ foo_test --gtest_repeat=1000 --gtest_filter=FooBar.*\nRepeat the tests whose name matches the filter 1000 times.\n```\n\nIf your test program contains [global set-up/tear-down](#global-set-up-and-tear-down) code, it\nwill be repeated in each iteration as well, as the flakiness may be in it. You\ncan also specify the repeat count by setting the `GTEST_REPEAT` environment\nvariable.\n\n**Availability**: Linux, Windows, Mac.\n\n### Shuffling the Tests\n\nYou can specify the `--gtest_shuffle` flag (or set the `GTEST_SHUFFLE`\nenvironment variable to `1`) to run the tests in a program in a random order.\nThis helps to reveal bad dependencies between tests.\n\nBy default, googletest uses a random seed calculated from the current time.\nTherefore you'll get a different order every time. The console output includes\nthe random seed value, such that you can reproduce an order-related test failure\nlater. To specify the random seed explicitly, use the `--gtest_random_seed=SEED`\nflag (or set the `GTEST_RANDOM_SEED` environment variable), where `SEED` is an\ninteger in the range [0, 99999]. The seed value 0 is special: it tells\ngoogletest to do the default behavior of calculating the seed from the current\ntime.\n\nIf you combine this with `--gtest_repeat=N`, googletest will pick a different\nrandom seed and re-shuffle the tests in each iteration.\n\n**Availability**: Linux, Windows, Mac.\n\n### Controlling Test Output\n\n#### Colored Terminal Output\n\ngoogletest can use colors in its terminal output to make it easier to spot the\nimportant information:\n\n...<br/>\n<span style=\"color:green\">[----------]<span style=\"color:black\"> 1 test from FooTest<br/>\n<span style=\"color:green\">[ RUN      ]<span style=\"color:black\"> FooTest.DoesAbc<br/>\n<span style=\"color:green\">[       OK ]<span style=\"color:black\"> FooTest.DoesAbc<br/>\n<span style=\"color:green\">[----------]<span style=\"color:black\"> 2 tests from BarTest<br/>\n<span style=\"color:green\">[ RUN      ]<span style=\"color:black\"> BarTest.HasXyzProperty<br/>\n<span style=\"color:green\">[       OK ]<span style=\"color:black\"> BarTest.HasXyzProperty<br/>\n<span style=\"color:green\">[ RUN      ]<span style=\"color:black\"> BarTest.ReturnsTrueOnSuccess<br/>\n... some error messages ...<br/>\n<span   style=\"color:red\">[  FAILED  ] <span style=\"color:black\">BarTest.ReturnsTrueOnSuccess<br/>\n...<br/>\n<span style=\"color:green\">[==========]<span style=\"color:black\"> 30 tests from 14 test cases ran.<br/>\n<span style=\"color:green\">[  PASSED  ]<span style=\"color:black\"> 28 tests.<br/>\n<span style=\"color:red\">[  FAILED  ]<span style=\"color:black\"> 2 tests, listed below:<br/>\n<span style=\"color:red\">[  FAILED  ]<span style=\"color:black\"> BarTest.ReturnsTrueOnSuccess<br/>\n<span style=\"color:red\">[  FAILED  ]<span style=\"color:black\"> AnotherTest.DoesXyz<br/>\n  2 FAILED TESTS\n\nYou can set the `GTEST_COLOR` environment variable or the `--gtest_color`\ncommand line flag to `yes`, `no`, or `auto` (the default) to enable colors,\ndisable colors, or let googletest decide. When the value is `auto`, googletest\nwill use colors if and only if the output goes to a terminal and (on non-Windows\nplatforms) the `TERM` environment variable is set to `xterm` or `xterm-color`.\n\n **Availability**: Linux, Windows, Mac.\n\n#### Suppressing the Elapsed Time\n\nBy default, googletest prints the time it takes to run each test. To disable\nthat, run the test program with the `--gtest_print_time=0` command line flag, or\nset the GTEST_PRINT_TIME environment variable to `0`.\n\n**Availability**: Linux, Windows, Mac.\n\n#### Suppressing UTF-8 Text Output\n\nIn case of assertion failures, googletest prints expected and actual values of\ntype `string` both as hex-encoded strings as well as in readable UTF-8 text if\nthey contain valid non-ASCII UTF-8 characters. If you want to suppress the UTF-8\ntext because, for example, you don't have an UTF-8 compatible output medium, run\nthe test program with `--gtest_print_utf8=0` or set the `GTEST_PRINT_UTF8`\nenvironment variable to `0`.\n\n**Availability**: Linux, Windows, Mac.\n\n\n#### Generating an XML Report\n\ngoogletest can emit a detailed XML report to a file in addition to its normal\ntextual output. The report contains the duration of each test, and thus can help\nyou identify slow tests. The report is also used by the http://unittest\ndashboard to show per-test-method error messages.\n\nTo generate the XML report, set the `GTEST_OUTPUT` environment variable or the\n`--gtest_output` flag to the string `\"xml:path_to_output_file\"`, which will\ncreate the file at the given location. You can also just use the string `\"xml\"`,\nin which case the output can be found in the `test_detail.xml` file in the\ncurrent directory.\n\nIf you specify a directory (for example, `\"xml:output/directory/\"` on Linux or\n`\"xml:output\\directory\\\"` on Windows), googletest will create the XML file in\nthat directory, named after the test executable (e.g. `foo_test.xml` for test\nprogram `foo_test` or `foo_test.exe`). If the file already exists (perhaps left\nover from a previous run), googletest will pick a different name (e.g.\n`foo_test_1.xml`) to avoid overwriting it.\n\n\nThe report is based on the `junitreport` Ant task. Since that format was\noriginally intended for Java, a little interpretation is required to make it\napply to googletest tests, as shown here:\n\n```xml\n<testsuites name=\"AllTests\" ...>\n  <testsuite name=\"test_case_name\" ...>\n    <testcase    name=\"test_name\" ...>\n      <failure message=\"...\"/>\n      <failure message=\"...\"/>\n      <failure message=\"...\"/>\n    </testcase>\n  </testsuite>\n</testsuites>\n```\n\n*   The root `<testsuites>` element corresponds to the entire test program.\n*   `<testsuite>` elements correspond to googletest test cases.\n*   `<testcase>` elements correspond to googletest test functions.\n\nFor instance, the following program\n\n```c++\nTEST(MathTest, Addition) { ... }\nTEST(MathTest, Subtraction) { ... }\nTEST(LogicTest, NonContradiction) { ... }\n```\n\ncould generate this report:\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites tests=\"3\" failures=\"1\" errors=\"0\" time=\"0.035\" timestamp=\"2011-10-31T18:52:42\" name=\"AllTests\">\n  <testsuite name=\"MathTest\" tests=\"2\" failures=\"1\" errors=\"0\" time=\"0.015\">\n    <testcase name=\"Addition\" status=\"run\" time=\"0.007\" classname=\"\">\n      <failure message=\"Value of: add(1, 1)&#x0A;  Actual: 3&#x0A;Expected: 2\" type=\"\">...</failure>\n      <failure message=\"Value of: add(1, -1)&#x0A;  Actual: 1&#x0A;Expected: 0\" type=\"\">...</failure>\n    </testcase>\n    <testcase name=\"Subtraction\" status=\"run\" time=\"0.005\" classname=\"\">\n    </testcase>\n  </testsuite>\n  <testsuite name=\"LogicTest\" tests=\"1\" failures=\"0\" errors=\"0\" time=\"0.005\">\n    <testcase name=\"NonContradiction\" status=\"run\" time=\"0.005\" classname=\"\">\n    </testcase>\n  </testsuite>\n</testsuites>\n```\n\nThings to note:\n\n*   The `tests` attribute of a `<testsuites>` or `<testsuite>` element tells how\n    many test functions the googletest program or test case contains, while the\n    `failures` attribute tells how many of them failed.\n\n*   The `time` attribute expresses the duration of the test, test case, or\n    entire test program in seconds.\n\n*   The `timestamp` attribute records the local date and time of the test\n    execution.\n\n*   Each `<failure>` element corresponds to a single failed googletest\n    assertion.\n\n**Availability**: Linux, Windows, Mac.\n\n#### Generating an JSON Report\n\ngoogletest can also emit a JSON report as an alternative format to XML. To\ngenerate the JSON report, set the `GTEST_OUTPUT` environment variable or the\n`--gtest_output` flag to the string `\"json:path_to_output_file\"`, which will\ncreate the file at the given location. You can also just use the string\n`\"json\"`, in which case the output can be found in the `test_detail.json` file\nin the current directory.\n\nThe report format conforms to the following JSON Schema:\n\n```json\n{\n  \"$schema\": \"http://json-schema.org/schema#\",\n  \"type\": \"object\",\n  \"definitions\": {\n    \"TestCase\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": { \"type\": \"string\" },\n        \"tests\": { \"type\": \"integer\" },\n        \"failures\": { \"type\": \"integer\" },\n        \"disabled\": { \"type\": \"integer\" },\n        \"time\": { \"type\": \"string\" },\n        \"testsuite\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/TestInfo\"\n          }\n        }\n      }\n    },\n    \"TestInfo\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": { \"type\": \"string\" },\n        \"status\": {\n          \"type\": \"string\",\n          \"enum\": [\"RUN\", \"NOTRUN\"]\n        },\n        \"time\": { \"type\": \"string\" },\n        \"classname\": { \"type\": \"string\" },\n        \"failures\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/Failure\"\n          }\n        }\n      }\n    },\n    \"Failure\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"failures\": { \"type\": \"string\" },\n        \"type\": { \"type\": \"string\" }\n      }\n    }\n  },\n  \"properties\": {\n    \"tests\": { \"type\": \"integer\" },\n    \"failures\": { \"type\": \"integer\" },\n    \"disabled\": { \"type\": \"integer\" },\n    \"errors\": { \"type\": \"integer\" },\n    \"timestamp\": {\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"time\": { \"type\": \"string\" },\n    \"name\": { \"type\": \"string\" },\n    \"testsuites\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"$ref\": \"#/definitions/TestCase\"\n      }\n    }\n  }\n}\n```\n\nThe report uses the format that conforms to the following Proto3 using the [JSON\nencoding](https://developers.google.com/protocol-buffers/docs/proto3#json):\n\n```proto\nsyntax = \"proto3\";\n\npackage googletest;\n\nimport \"google/protobuf/timestamp.proto\";\nimport \"google/protobuf/duration.proto\";\n\nmessage UnitTest {\n  int32 tests = 1;\n  int32 failures = 2;\n  int32 disabled = 3;\n  int32 errors = 4;\n  google.protobuf.Timestamp timestamp = 5;\n  google.protobuf.Duration time = 6;\n  string name = 7;\n  repeated TestCase testsuites = 8;\n}\n\nmessage TestCase {\n  string name = 1;\n  int32 tests = 2;\n  int32 failures = 3;\n  int32 disabled = 4;\n  int32 errors = 5;\n  google.protobuf.Duration time = 6;\n  repeated TestInfo testsuite = 7;\n}\n\nmessage TestInfo {\n  string name = 1;\n  enum Status {\n    RUN = 0;\n    NOTRUN = 1;\n  }\n  Status status = 2;\n  google.protobuf.Duration time = 3;\n  string classname = 4;\n  message Failure {\n    string failures = 1;\n    string type = 2;\n  }\n  repeated Failure failures = 5;\n}\n```\n\nFor instance, the following program\n\n```c++\nTEST(MathTest, Addition) { ... }\nTEST(MathTest, Subtraction) { ... }\nTEST(LogicTest, NonContradiction) { ... }\n```\n\ncould generate this report:\n\n```json\n{\n  \"tests\": 3,\n  \"failures\": 1,\n  \"errors\": 0,\n  \"time\": \"0.035s\",\n  \"timestamp\": \"2011-10-31T18:52:42Z\"\n  \"name\": \"AllTests\",\n  \"testsuites\": [\n    {\n      \"name\": \"MathTest\",\n      \"tests\": 2,\n      \"failures\": 1,\n      \"errors\": 0,\n      \"time\": \"0.015s\",\n      \"testsuite\": [\n        {\n          \"name\": \"Addition\",\n          \"status\": \"RUN\",\n          \"time\": \"0.007s\",\n          \"classname\": \"\",\n          \"failures\": [\n            {\n              \"message\": \"Value of: add(1, 1)\\x0A  Actual: 3\\x0AExpected: 2\",\n              \"type\": \"\"\n            },\n            {\n              \"message\": \"Value of: add(1, -1)\\x0A  Actual: 1\\x0AExpected: 0\",\n              \"type\": \"\"\n            }\n          ]\n        },\n        {\n          \"name\": \"Subtraction\",\n          \"status\": \"RUN\",\n          \"time\": \"0.005s\",\n          \"classname\": \"\"\n        }\n      ]\n    }\n    {\n      \"name\": \"LogicTest\",\n      \"tests\": 1,\n      \"failures\": 0,\n      \"errors\": 0,\n      \"time\": \"0.005s\",\n      \"testsuite\": [\n        {\n          \"name\": \"NonContradiction\",\n          \"status\": \"RUN\",\n          \"time\": \"0.005s\",\n          \"classname\": \"\"\n        }\n      ]\n    }\n  ]\n}\n```\n\nIMPORTANT: The exact format of the JSON document is subject to change.\n\n**Availability**: Linux, Windows, Mac.\n\n### Controlling How Failures Are Reported\n\n#### Turning Assertion Failures into Break-Points\n\nWhen running test programs under a debugger, it's very convenient if the\ndebugger can catch an assertion failure and automatically drop into interactive\nmode. googletest's *break-on-failure* mode supports this behavior.\n\nTo enable it, set the `GTEST_BREAK_ON_FAILURE` environment variable to a value\nother than `0` . Alternatively, you can use the `--gtest_break_on_failure`\ncommand line flag.\n\n**Availability**: Linux, Windows, Mac.\n\n#### Disabling Catching Test-Thrown Exceptions\n\ngoogletest can be used either with or without exceptions enabled. If a test\nthrows a C++ exception or (on Windows) a structured exception (SEH), by default\ngoogletest catches it, reports it as a test failure, and continues with the next\ntest method. This maximizes the coverage of a test run. Also, on Windows an\nuncaught exception will cause a pop-up window, so catching the exceptions allows\nyou to run the tests automatically.\n\nWhen debugging the test failures, however, you may instead want the exceptions\nto be handled by the debugger, such that you can examine the call stack when an\nexception is thrown. To achieve that, set the `GTEST_CATCH_EXCEPTIONS`\nenvironment variable to `0`, or use the `--gtest_catch_exceptions=0` flag when\nrunning the tests.\n\n**Availability**: Linux, Windows, Mac.\n\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/docs/faq.md",
    "content": "# Googletest FAQ\n\n\n## Why should test case names and test names not contain underscore?\n\nUnderscore (`_`) is special, as C++ reserves the following to be used by the\ncompiler and the standard library:\n\n1.  any identifier that starts with an `_` followed by an upper-case letter, and\n1.  any identifier that contains two consecutive underscores (i.e. `__`)\n    *anywhere* in its name.\n\nUser code is *prohibited* from using such identifiers.\n\nNow let's look at what this means for `TEST` and `TEST_F`.\n\nCurrently `TEST(TestCaseName, TestName)` generates a class named\n`TestCaseName_TestName_Test`. What happens if `TestCaseName` or `TestName`\ncontains `_`?\n\n1.  If `TestCaseName` starts with an `_` followed by an upper-case letter (say,\n    `_Foo`), we end up with `_Foo_TestName_Test`, which is reserved and thus\n    invalid.\n1.  If `TestCaseName` ends with an `_` (say, `Foo_`), we get\n    `Foo__TestName_Test`, which is invalid.\n1.  If `TestName` starts with an `_` (say, `_Bar`), we get\n    `TestCaseName__Bar_Test`, which is invalid.\n1.  If `TestName` ends with an `_` (say, `Bar_`), we get\n    `TestCaseName_Bar__Test`, which is invalid.\n\nSo clearly `TestCaseName` and `TestName` cannot start or end with `_` (Actually,\n`TestCaseName` can start with `_` -- as long as the `_` isn't followed by an\nupper-case letter. But that's getting complicated. So for simplicity we just say\nthat it cannot start with `_`.).\n\nIt may seem fine for `TestCaseName` and `TestName` to contain `_` in the middle.\nHowever, consider this:\n\n```c++\nTEST(Time, Flies_Like_An_Arrow) { ... }\nTEST(Time_Flies, Like_An_Arrow) { ... }\n```\n\nNow, the two `TEST`s will both generate the same class\n(`Time_Flies_Like_An_Arrow_Test`). That's not good.\n\nSo for simplicity, we just ask the users to avoid `_` in `TestCaseName` and\n`TestName`. The rule is more constraining than necessary, but it's simple and\neasy to remember. It also gives googletest some wiggle room in case its\nimplementation needs to change in the future.\n\nIf you violate the rule, there may not be immediate consequences, but your test\nmay (just may) break with a new compiler (or a new version of the compiler you\nare using) or with a new version of googletest. Therefore it's best to follow\nthe rule.\n\n## Why does googletest support `EXPECT_EQ(NULL, ptr)` and `ASSERT_EQ(NULL, ptr)` but not `EXPECT_NE(NULL, ptr)` and `ASSERT_NE(NULL, ptr)`?\n\nFirst of all you can use `EXPECT_NE(nullptr, ptr)` and `ASSERT_NE(nullptr,\nptr)`. This is the preferred syntax in the style guide because nullptr does not\nhave the type problems that NULL does. Which is why NULL does not work.\n\nDue to some peculiarity of C++, it requires some non-trivial template meta\nprogramming tricks to support using `NULL` as an argument of the `EXPECT_XX()`\nand `ASSERT_XX()` macros. Therefore we only do it where it's most needed\n(otherwise we make the implementation of googletest harder to maintain and more\nerror-prone than necessary).\n\nThe `EXPECT_EQ()` macro takes the *expected* value as its first argument and the\n*actual* value as the second. It's reasonable that someone wants to write\n`EXPECT_EQ(NULL, some_expression)`, and this indeed was requested several times.\nTherefore we implemented it.\n\nThe need for `EXPECT_NE(NULL, ptr)` isn't nearly as strong. When the assertion\nfails, you already know that `ptr` must be `NULL`, so it doesn't add any\ninformation to print `ptr` in this case. That means `EXPECT_TRUE(ptr != NULL)`\nworks just as well.\n\nIf we were to support `EXPECT_NE(NULL, ptr)`, for consistency we'll have to\nsupport `EXPECT_NE(ptr, NULL)` as well, as unlike `EXPECT_EQ`, we don't have a\nconvention on the order of the two arguments for `EXPECT_NE`. This means using\nthe template meta programming tricks twice in the implementation, making it even\nharder to understand and maintain. We believe the benefit doesn't justify the\ncost.\n\nFinally, with the growth of the gMock matcher library, we are encouraging people\nto use the unified `EXPECT_THAT(value, matcher)` syntax more often in tests. One\nsignificant advantage of the matcher approach is that matchers can be easily\ncombined to form new matchers, while the `EXPECT_NE`, etc, macros cannot be\neasily combined. Therefore we want to invest more in the matchers than in the\n`EXPECT_XX()` macros.\n\n## I need to test that different implementations of an interface satisfy some common requirements. Should I use typed tests or value-parameterized tests?\n\nFor testing various implementations of the same interface, either typed tests or\nvalue-parameterized tests can get it done. It's really up to you the user to\ndecide which is more convenient for you, depending on your particular case. Some\nrough guidelines:\n\n*   Typed tests can be easier to write if instances of the different\n    implementations can be created the same way, modulo the type. For example,\n    if all these implementations have a public default constructor (such that\n    you can write `new TypeParam`), or if their factory functions have the same\n    form (e.g. `CreateInstance<TypeParam>()`).\n*   Value-parameterized tests can be easier to write if you need different code\n    patterns to create different implementations' instances, e.g. `new Foo` vs\n    `new Bar(5)`. To accommodate for the differences, you can write factory\n    function wrappers and pass these function pointers to the tests as their\n    parameters.\n*   When a typed test fails, the output includes the name of the type, which can\n    help you quickly identify which implementation is wrong. Value-parameterized\n    tests cannot do this, so there you'll have to look at the iteration number\n    to know which implementation the failure is from, which is less direct.\n*   If you make a mistake writing a typed test, the compiler errors can be\n    harder to digest, as the code is templatized.\n*   When using typed tests, you need to make sure you are testing against the\n    interface type, not the concrete types (in other words, you want to make\n    sure `implicit_cast<MyInterface*>(my_concrete_impl)` works, not just that\n    `my_concrete_impl` works). It's less likely to make mistakes in this area\n    when using value-parameterized tests.\n\nI hope I didn't confuse you more. :-) If you don't mind, I'd suggest you to give\nboth approaches a try. Practice is a much better way to grasp the subtle\ndifferences between the two tools. Once you have some concrete experience, you\ncan much more easily decide which one to use the next time.\n\n## My death tests became very slow - what happened?\n\nIn August 2008 we had to switch the default death test style from `fast` to\n`threadsafe`, as the former is no longer safe now that threaded logging is the\ndefault. This caused many death tests to slow down. Unfortunately this change\nwas necessary.\n\nPlease read [Fixing Failing Death Tests](death_test_styles.md) for what you can\ndo.\n\n## I got some run-time errors about invalid proto descriptors when using `ProtocolMessageEquals`. Help!\n\n**Note:** `ProtocolMessageEquals` and `ProtocolMessageEquiv` are *deprecated*\nnow. Please use `EqualsProto`, etc instead.\n\n`ProtocolMessageEquals` and `ProtocolMessageEquiv` were redefined recently and\nare now less tolerant on invalid protocol buffer definitions. In particular, if\nyou have a `foo.proto` that doesn't fully qualify the type of a protocol message\nit references (e.g. `message<Bar>` where it should be `message<blah.Bar>`), you\nwill now get run-time errors like:\n\n```\n... descriptor.cc:...] Invalid proto descriptor for file \"path/to/foo.proto\":\n... descriptor.cc:...]  blah.MyMessage.my_field: \".Bar\" is not defined.\n```\n\nIf you see this, your `.proto` file is broken and needs to be fixed by making\nthe types fully qualified. The new definition of `ProtocolMessageEquals` and\n`ProtocolMessageEquiv` just happen to reveal your bug.\n\n## My death test modifies some state, but the change seems lost after the death test finishes. Why?\n\nDeath tests (`EXPECT_DEATH`, etc) are executed in a sub-process s.t. the\nexpected crash won't kill the test program (i.e. the parent process). As a\nresult, any in-memory side effects they incur are observable in their respective\nsub-processes, but not in the parent process. You can think of them as running\nin a parallel universe, more or less.\n\nIn particular, if you use [gMock](../../googlemock) and the death test statement\ninvokes some mock methods, the parent process will think the calls have never\noccurred. Therefore, you may want to move your `EXPECT_CALL` statements inside\nthe `EXPECT_DEATH` macro.\n\n## EXPECT_EQ(htonl(blah), blah_blah) generates weird compiler errors in opt mode. Is this a googletest bug?\n\nActually, the bug is in `htonl()`.\n\nAccording to `'man htonl'`, `htonl()` is a *function*, which means it's valid to\nuse `htonl` as a function pointer. However, in opt mode `htonl()` is defined as\na *macro*, which breaks this usage.\n\nWorse, the macro definition of `htonl()` uses a `gcc` extension and is *not*\nstandard C++. That hacky implementation has some ad hoc limitations. In\nparticular, it prevents you from writing `Foo<sizeof(htonl(x))>()`, where `Foo`\nis a template that has an integral argument.\n\nThe implementation of `EXPECT_EQ(a, b)` uses `sizeof(... a ...)` inside a\ntemplate argument, and thus doesn't compile in opt mode when `a` contains a call\nto `htonl()`. It is difficult to make `EXPECT_EQ` bypass the `htonl()` bug, as\nthe solution must work with different compilers on various platforms.\n\n`htonl()` has some other problems as described in `//util/endian/endian.h`,\nwhich defines `ghtonl()` to replace it. `ghtonl()` does the same thing `htonl()`\ndoes, only without its problems. We suggest you to use `ghtonl()` instead of\n`htonl()`, both in your tests and production code.\n\n`//util/endian/endian.h` also defines `ghtons()`, which solves similar problems\nin `htons()`.\n\nDon't forget to add `//util/endian` to the list of dependencies in the `BUILD`\nfile wherever `ghtonl()` and `ghtons()` are used. The library consists of a\nsingle header file and will not bloat your binary.\n\n## The compiler complains about \"undefined references\" to some static const member variables, but I did define them in the class body. What's wrong?\n\nIf your class has a static data member:\n\n```c++\n// foo.h\nclass Foo {\n  ...\n  static const int kBar = 100;\n};\n```\n\nYou also need to define it *outside* of the class body in `foo.cc`:\n\n```c++\nconst int Foo::kBar;  // No initializer here.\n```\n\nOtherwise your code is **invalid C++**, and may break in unexpected ways. In\nparticular, using it in googletest comparison assertions (`EXPECT_EQ`, etc) will\ngenerate an \"undefined reference\" linker error. The fact that \"it used to work\"\ndoesn't mean it's valid. It just means that you were lucky. :-)\n\n## Can I derive a test fixture from another?\n\nYes.\n\nEach test fixture has a corresponding and same named test case. This means only\none test case can use a particular fixture. Sometimes, however, multiple test\ncases may want to use the same or slightly different fixtures. For example, you\nmay want to make sure that all of a GUI library's test cases don't leak\nimportant system resources like fonts and brushes.\n\nIn googletest, you share a fixture among test cases by putting the shared logic\nin a base test fixture, then deriving from that base a separate fixture for each\ntest case that wants to use this common logic. You then use `TEST_F()` to write\ntests using each derived fixture.\n\nTypically, your code looks like this:\n\n```c++\n// Defines a base test fixture.\nclass BaseTest : public ::testing::Test {\n protected:\n  ...\n};\n\n// Derives a fixture FooTest from BaseTest.\nclass FooTest : public BaseTest {\n protected:\n  void SetUp() override {\n    BaseTest::SetUp();  // Sets up the base fixture first.\n    ... additional set-up work ...\n  }\n\n  void TearDown() override {\n    ... clean-up work for FooTest ...\n    BaseTest::TearDown();  // Remember to tear down the base fixture\n                           // after cleaning up FooTest!\n  }\n\n  ... functions and variables for FooTest ...\n};\n\n// Tests that use the fixture FooTest.\nTEST_F(FooTest, Bar) { ... }\nTEST_F(FooTest, Baz) { ... }\n\n... additional fixtures derived from BaseTest ...\n```\n\nIf necessary, you can continue to derive test fixtures from a derived fixture.\ngoogletest has no limit on how deep the hierarchy can be.\n\nFor a complete example using derived test fixtures, see [googletest\nsample](https://github.com/google/googletest/blob/master/googletest/samples/sample5_unittest.cc)\n\n## My compiler complains \"void value not ignored as it ought to be.\" What does this mean?\n\nYou're probably using an `ASSERT_*()` in a function that doesn't return `void`.\n`ASSERT_*()` can only be used in `void` functions, due to exceptions being\ndisabled by our build system. Please see more details\n[here](advanced.md#assertion-placement).\n\n## My death test hangs (or seg-faults). How do I fix it?\n\nIn googletest, death tests are run in a child process and the way they work is\ndelicate. To write death tests you really need to understand how they work.\nPlease make sure you have read [this](advanced.md#how-it-works).\n\nIn particular, death tests don't like having multiple threads in the parent\nprocess. So the first thing you can try is to eliminate creating threads outside\nof `EXPECT_DEATH()`. For example, you may want to use [mocks](../../googlemock)\nor fake objects instead of real ones in your tests.\n\nSometimes this is impossible as some library you must use may be creating\nthreads before `main()` is even reached. In this case, you can try to minimize\nthe chance of conflicts by either moving as many activities as possible inside\n`EXPECT_DEATH()` (in the extreme case, you want to move everything inside), or\nleaving as few things as possible in it. Also, you can try to set the death test\nstyle to `\"threadsafe\"`, which is safer but slower, and see if it helps.\n\nIf you go with thread-safe death tests, remember that they rerun the test\nprogram from the beginning in the child process. Therefore make sure your\nprogram can run side-by-side with itself and is deterministic.\n\nIn the end, this boils down to good concurrent programming. You have to make\nsure that there is no race conditions or dead locks in your program. No silver\nbullet - sorry!\n\n## Should I use the constructor/destructor of the test fixture or SetUp()/TearDown()?\n\nThe first thing to remember is that googletest does **not** reuse the same test\nfixture object across multiple tests. For each `TEST_F`, googletest will create\na **fresh** test fixture object, immediately call `SetUp()`, run the test body,\ncall `TearDown()`, and then delete the test fixture object.\n\nWhen you need to write per-test set-up and tear-down logic, you have the choice\nbetween using the test fixture constructor/destructor or `SetUp()/TearDown()`.\nThe former is usually preferred, as it has the following benefits:\n\n*   By initializing a member variable in the constructor, we have the option to\n    make it `const`, which helps prevent accidental changes to its value and\n    makes the tests more obviously correct.\n*   In case we need to subclass the test fixture class, the subclass'\n    constructor is guaranteed to call the base class' constructor *first*, and\n    the subclass' destructor is guaranteed to call the base class' destructor\n    *afterward*. With `SetUp()/TearDown()`, a subclass may make the mistake of\n    forgetting to call the base class' `SetUp()/TearDown()` or call them at the\n    wrong time.\n\nYou may still want to use `SetUp()/TearDown()` in the following rare cases:\n\n*   In the body of a constructor (or destructor), it's not possible to use the\n    `ASSERT_xx` macros. Therefore, if the set-up operation could cause a fatal\n    test failure that should prevent the test from running, it's necessary to\n    use a `CHECK` macro or to use `SetUp()` instead of a constructor.\n*   If the tear-down operation could throw an exception, you must use\n    `TearDown()` as opposed to the destructor, as throwing in a destructor leads\n    to undefined behavior and usually will kill your program right away. Note\n    that many standard libraries (like STL) may throw when exceptions are\n    enabled in the compiler. Therefore you should prefer `TearDown()` if you\n    want to write portable tests that work with or without exceptions.\n*   The googletest team is considering making the assertion macros throw on\n    platforms where exceptions are enabled (e.g. Windows, Mac OS, and Linux\n    client-side), which will eliminate the need for the user to propagate\n    failures from a subroutine to its caller. Therefore, you shouldn't use\n    googletest assertions in a destructor if your code could run on such a\n    platform.\n*   In a constructor or destructor, you cannot make a virtual function call on\n    this object. (You can call a method declared as virtual, but it will be\n    statically bound.) Therefore, if you need to call a method that will be\n    overridden in a derived class, you have to use `SetUp()/TearDown()`.\n\n\n## The compiler complains \"no matching function to call\" when I use ASSERT_PRED*. How do I fix it?\n\nIf the predicate function you use in `ASSERT_PRED*` or `EXPECT_PRED*` is\noverloaded or a template, the compiler will have trouble figuring out which\noverloaded version it should use. `ASSERT_PRED_FORMAT*` and\n`EXPECT_PRED_FORMAT*` don't have this problem.\n\nIf you see this error, you might want to switch to\n`(ASSERT|EXPECT)_PRED_FORMAT*`, which will also give you a better failure\nmessage. If, however, that is not an option, you can resolve the problem by\nexplicitly telling the compiler which version to pick.\n\nFor example, suppose you have\n\n```c++\nbool IsPositive(int n) {\n  return n > 0;\n}\n\nbool IsPositive(double x) {\n  return x > 0;\n}\n```\n\nyou will get a compiler error if you write\n\n```c++\nEXPECT_PRED1(IsPositive, 5);\n```\n\nHowever, this will work:\n\n```c++\nEXPECT_PRED1(static_cast<bool (*)(int)>(IsPositive), 5);\n```\n\n(The stuff inside the angled brackets for the `static_cast` operator is the type\nof the function pointer for the `int`-version of `IsPositive()`.)\n\nAs another example, when you have a template function\n\n```c++\ntemplate <typename T>\nbool IsNegative(T x) {\n  return x < 0;\n}\n```\n\nyou can use it in a predicate assertion like this:\n\n```c++\nASSERT_PRED1(IsNegative<int>, -5);\n```\n\nThings are more interesting if your template has more than one parameters. The\nfollowing won't compile:\n\n```c++\nASSERT_PRED2(GreaterThan<int, int>, 5, 0);\n```\n\nas the C++ pre-processor thinks you are giving `ASSERT_PRED2` 4 arguments, which\nis one more than expected. The workaround is to wrap the predicate function in\nparentheses:\n\n```c++\nASSERT_PRED2((GreaterThan<int, int>), 5, 0);\n```\n\n\n## My compiler complains about \"ignoring return value\" when I call RUN_ALL_TESTS(). Why?\n\nSome people had been ignoring the return value of `RUN_ALL_TESTS()`. That is,\ninstead of\n\n```c++\n  return RUN_ALL_TESTS();\n```\n\nthey write\n\n```c++\n  RUN_ALL_TESTS();\n```\n\nThis is **wrong and dangerous**. The testing services needs to see the return\nvalue of `RUN_ALL_TESTS()` in order to determine if a test has passed. If your\n`main()` function ignores it, your test will be considered successful even if it\nhas a googletest assertion failure. Very bad.\n\nWe have decided to fix this (thanks to Michael Chastain for the idea). Now, your\ncode will no longer be able to ignore `RUN_ALL_TESTS()` when compiled with\n`gcc`. If you do so, you'll get a compiler error.\n\nIf you see the compiler complaining about you ignoring the return value of\n`RUN_ALL_TESTS()`, the fix is simple: just make sure its value is used as the\nreturn value of `main()`.\n\nBut how could we introduce a change that breaks existing tests? Well, in this\ncase, the code was already broken in the first place, so we didn't break it. :-)\n\n## My compiler complains that a constructor (or destructor) cannot return a value. What's going on?\n\nDue to a peculiarity of C++, in order to support the syntax for streaming\nmessages to an `ASSERT_*`, e.g.\n\n```c++\n  ASSERT_EQ(1, Foo()) << \"blah blah\" << foo;\n```\n\nwe had to give up using `ASSERT*` and `FAIL*` (but not `EXPECT*` and\n`ADD_FAILURE*`) in constructors and destructors. The workaround is to move the\ncontent of your constructor/destructor to a private void member function, or\nswitch to `EXPECT_*()` if that works. This\n[section](advanced.md#assertion-placement) in the user's guide explains it.\n\n## My SetUp() function is not called. Why?\n\nC++ is case-sensitive. Did you spell it as `Setup()`?\n\nSimilarly, sometimes people spell `SetUpTestCase()` as `SetupTestCase()` and\nwonder why it's never called.\n\n## How do I jump to the line of a failure in Emacs directly?\n\ngoogletest's failure message format is understood by Emacs and many other IDEs,\nlike acme and XCode. If a googletest message is in a compilation buffer in\nEmacs, then it's clickable.\n\n\n## I have several test cases which share the same test fixture logic, do I have to define a new test fixture class for each of them? This seems pretty tedious.\n\nYou don't have to. Instead of\n\n```c++\nclass FooTest : public BaseTest {};\n\nTEST_F(FooTest, Abc) { ... }\nTEST_F(FooTest, Def) { ... }\n\nclass BarTest : public BaseTest {};\n\nTEST_F(BarTest, Abc) { ... }\nTEST_F(BarTest, Def) { ... }\n```\n\nyou can simply `typedef` the test fixtures:\n\n```c++\ntypedef BaseTest FooTest;\n\nTEST_F(FooTest, Abc) { ... }\nTEST_F(FooTest, Def) { ... }\n\ntypedef BaseTest BarTest;\n\nTEST_F(BarTest, Abc) { ... }\nTEST_F(BarTest, Def) { ... }\n```\n\n## googletest output is buried in a whole bunch of LOG messages. What do I do?\n\nThe googletest output is meant to be a concise and human-friendly report. If\nyour test generates textual output itself, it will mix with the googletest\noutput, making it hard to read. However, there is an easy solution to this\nproblem.\n\nSince `LOG` messages go to stderr, we decided to let googletest output go to\nstdout. This way, you can easily separate the two using redirection. For\nexample:\n\n```shell\n$ ./my_test > gtest_output.txt\n```\n\n\n## Why should I prefer test fixtures over global variables?\n\nThere are several good reasons:\n\n1.  It's likely your test needs to change the states of its global variables.\n    This makes it difficult to keep side effects from escaping one test and\n    contaminating others, making debugging difficult. By using fixtures, each\n    test has a fresh set of variables that's different (but with the same\n    names). Thus, tests are kept independent of each other.\n1.  Global variables pollute the global namespace.\n1.  Test fixtures can be reused via subclassing, which cannot be done easily\n    with global variables. This is useful if many test cases have something in\n    common.\n\n\n    ## What can the statement argument in ASSERT_DEATH() be?\n\n`ASSERT_DEATH(*statement*, *regex*)` (or any death assertion macro) can be used\nwherever `*statement*` is valid. So basically `*statement*` can be any C++\nstatement that makes sense in the current context. In particular, it can\nreference global and/or local variables, and can be:\n\n*   a simple function call (often the case),\n*   a complex expression, or\n*   a compound statement.\n\nSome examples are shown here:\n\n```c++\n// A death test can be a simple function call.\nTEST(MyDeathTest, FunctionCall) {\n  ASSERT_DEATH(Xyz(5), \"Xyz failed\");\n}\n\n// Or a complex expression that references variables and functions.\nTEST(MyDeathTest, ComplexExpression) {\n  const bool c = Condition();\n  ASSERT_DEATH((c ? Func1(0) : object2.Method(\"test\")),\n               \"(Func1|Method) failed\");\n}\n\n// Death assertions can be used any where in a function.  In\n// particular, they can be inside a loop.\nTEST(MyDeathTest, InsideLoop) {\n  // Verifies that Foo(0), Foo(1), ..., and Foo(4) all die.\n  for (int i = 0; i < 5; i++) {\n    EXPECT_DEATH_M(Foo(i), \"Foo has \\\\d+ errors\",\n                   ::testing::Message() << \"where i is \" << i);\n  }\n}\n\n// A death assertion can contain a compound statement.\nTEST(MyDeathTest, CompoundStatement) {\n  // Verifies that at lease one of Bar(0), Bar(1), ..., and\n  // Bar(4) dies.\n  ASSERT_DEATH({\n    for (int i = 0; i < 5; i++) {\n      Bar(i);\n    }\n  },\n  \"Bar has \\\\d+ errors\");\n}\n```\n\ngtest-death-test_test.cc contains more examples if you are interested.\n\n## I have a fixture class `FooTest`, but `TEST_F(FooTest, Bar)` gives me error ``\"no matching function for call to `FooTest::FooTest()'\"``. Why?\n\nGoogletest needs to be able to create objects of your test fixture class, so it\nmust have a default constructor. Normally the compiler will define one for you.\nHowever, there are cases where you have to define your own:\n\n*   If you explicitly declare a non-default constructor for class `FooTest`\n    (`DISALLOW_EVIL_CONSTRUCTORS()` does this), then you need to define a\n    default constructor, even if it would be empty.\n*   If `FooTest` has a const non-static data member, then you have to define the\n    default constructor *and* initialize the const member in the initializer\n    list of the constructor. (Early versions of `gcc` doesn't force you to\n    initialize the const member. It's a bug that has been fixed in `gcc 4`.)\n\n## Why does ASSERT_DEATH complain about previous threads that were already joined?\n\nWith the Linux pthread library, there is no turning back once you cross the line\nfrom single thread to multiple threads. The first time you create a thread, a\nmanager thread is created in addition, so you get 3, not 2, threads. Later when\nthe thread you create joins the main thread, the thread count decrements by 1,\nbut the manager thread will never be killed, so you still have 2 threads, which\nmeans you cannot safely run a death test.\n\nThe new NPTL thread library doesn't suffer from this problem, as it doesn't\ncreate a manager thread. However, if you don't control which machine your test\nruns on, you shouldn't depend on this.\n\n## Why does googletest require the entire test case, instead of individual tests, to be named *DeathTest when it uses ASSERT_DEATH?\n\ngoogletest does not interleave tests from different test cases. That is, it runs\nall tests in one test case first, and then runs all tests in the next test case,\nand so on. googletest does this because it needs to set up a test case before\nthe first test in it is run, and tear it down afterwords. Splitting up the test\ncase would require multiple set-up and tear-down processes, which is inefficient\nand makes the semantics unclean.\n\nIf we were to determine the order of tests based on test name instead of test\ncase name, then we would have a problem with the following situation:\n\n```c++\nTEST_F(FooTest, AbcDeathTest) { ... }\nTEST_F(FooTest, Uvw) { ... }\n\nTEST_F(BarTest, DefDeathTest) { ... }\nTEST_F(BarTest, Xyz) { ... }\n```\n\nSince `FooTest.AbcDeathTest` needs to run before `BarTest.Xyz`, and we don't\ninterleave tests from different test cases, we need to run all tests in the\n`FooTest` case before running any test in the `BarTest` case. This contradicts\nwith the requirement to run `BarTest.DefDeathTest` before `FooTest.Uvw`.\n\n## But I don't like calling my entire test case \\*DeathTest when it contains both death tests and non-death tests. What do I do?\n\nYou don't have to, but if you like, you may split up the test case into\n`FooTest` and `FooDeathTest`, where the names make it clear that they are\nrelated:\n\n```c++\nclass FooTest : public ::testing::Test { ... };\n\nTEST_F(FooTest, Abc) { ... }\nTEST_F(FooTest, Def) { ... }\n\nusing FooDeathTest = FooTest;\n\nTEST_F(FooDeathTest, Uvw) { ... EXPECT_DEATH(...) ... }\nTEST_F(FooDeathTest, Xyz) { ... ASSERT_DEATH(...) ... }\n```\n\n## googletest prints the LOG messages in a death test's child process only when the test fails. How can I see the LOG messages when the death test succeeds?\n\nPrinting the LOG messages generated by the statement inside `EXPECT_DEATH()`\nmakes it harder to search for real problems in the parent's log. Therefore,\ngoogletest only prints them when the death test has failed.\n\nIf you really need to see such LOG messages, a workaround is to temporarily\nbreak the death test (e.g. by changing the regex pattern it is expected to\nmatch). Admittedly, this is a hack. We'll consider a more permanent solution\nafter the fork-and-exec-style death tests are implemented.\n\n## The compiler complains about \"no match for 'operator<<'\" when I use an assertion. What gives?\n\nIf you use a user-defined type `FooType` in an assertion, you must make sure\nthere is an `std::ostream& operator<<(std::ostream&, const FooType&)` function\ndefined such that we can print a value of `FooType`.\n\nIn addition, if `FooType` is declared in a name space, the `<<` operator also\nneeds to be defined in the *same* name space. See go/totw/49 for details.\n\n## How do I suppress the memory leak messages on Windows?\n\nSince the statically initialized googletest singleton requires allocations on\nthe heap, the Visual C++ memory leak detector will report memory leaks at the\nend of the program run. The easiest way to avoid this is to use the\n`_CrtMemCheckpoint` and `_CrtMemDumpAllObjectsSince` calls to not report any\nstatically initialized heap objects. See MSDN for more details and additional\nheap check/debug routines.\n\n\n## How can my code detect if it is running in a test?\n\nIf you write code that sniffs whether it's running in a test and does different\nthings accordingly, you are leaking test-only logic into production code and\nthere is no easy way to ensure that the test-only code paths aren't run by\nmistake in production. Such cleverness also leads to\n[Heisenbugs](https://en.wikipedia.org/wiki/Heisenbug). Therefore we strongly\nadvise against the practice, and googletest doesn't provide a way to do it.\n\nIn general, the recommended way to cause the code to behave differently under\ntest is [Dependency Injection](https://en.wikipedia.org/wiki/Dependency_injection). You can inject\ndifferent functionality from the test and from the production code. Since your\nproduction code doesn't link in the for-test logic at all (the\n[`testonly`](https://docs.bazel.build/versions/master/be/common-definitions.html#common.testonly)\nattribute for BUILD targets helps to ensure that), there is no danger in\naccidentally running it.\n\nHowever, if you *really*, *really*, *really* have no choice, and if you follow\nthe rule of ending your test program names with `_test`, you can use the\n*horrible* hack of sniffing your executable name (`argv[0]` in `main()`) to know\nwhether the code is under test.\n\n\n## How do I temporarily disable a test?\n\nIf you have a broken test that you cannot fix right away, you can add the\nDISABLED_ prefix to its name. This will exclude it from execution. This is\nbetter than commenting out the code or using #if 0, as disabled tests are still\ncompiled (and thus won't rot).\n\nTo include disabled tests in test execution, just invoke the test program with\nthe --gtest_also_run_disabled_tests flag.\n\n## Is it OK if I have two separate `TEST(Foo, Bar)` test methods defined in different namespaces?\n\nYes.\n\nThe rule is **all test methods in the same test case must use the same fixture\nclass.** This means that the following is **allowed** because both tests use the\nsame fixture class (`::testing::Test`).\n\n```c++\nnamespace foo {\nTEST(CoolTest, DoSomething) {\n  SUCCEED();\n}\n}  // namespace foo\n\nnamespace bar {\nTEST(CoolTest, DoSomething) {\n  SUCCEED();\n}\n}  // namespace bar\n```\n\nHowever, the following code is **not allowed** and will produce a runtime error\nfrom googletest because the test methods are using different test fixture\nclasses with the same test case name.\n\n```c++\nnamespace foo {\nclass CoolTest : public ::testing::Test {};  // Fixture foo::CoolTest\nTEST_F(CoolTest, DoSomething) {\n  SUCCEED();\n}\n}  // namespace foo\n\nnamespace bar {\nclass CoolTest : public ::testing::Test {};  // Fixture: bar::CoolTest\nTEST_F(CoolTest, DoSomething) {\n  SUCCEED();\n}\n}  // namespace bar\n```\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/docs/primer.md",
    "content": "# Googletest Primer\n\n\n## Introduction: Why googletest?\n\n*googletest* helps you write better C++ tests.\n\ngoogletest is a testing framework developed by the Testing\nTechnology team with Google's specific\nrequirements and constraints in mind. No matter whether you work on Linux,\nWindows, or a Mac, if you write C++ code, googletest can help you. And it\nsupports *any* kind of tests, not just unit tests.\n\nSo what makes a good test, and how does googletest fit in? We believe:\n\n1.  Tests should be *independent* and *repeatable*. It's a pain to debug a test\n    that succeeds or fails as a result of other tests. googletest isolates the\n    tests by running each of them on a different object. When a test fails,\n    googletest allows you to run it in isolation for quick debugging.\n1.  Tests should be well *organized* and reflect the structure of the tested\n    code. googletest groups related tests into test cases that can share data\n    and subroutines. This common pattern is easy to recognize and makes tests\n    easy to maintain. Such consistency is especially helpful when people switch\n    projects and start to work on a new code base.\n1.  Tests should be *portable* and *reusable*. Google has a lot of code that is\n    platform-neutral, its tests should also be platform-neutral. googletest\n    works on different OSes, with different compilers (gcc, icc, and MSVC), with\n    or without exceptions, so googletest tests can easily work with a variety of\n    configurations.\n1.  When tests fail, they should provide as much *information* about the problem\n    as possible. googletest doesn't stop at the first test failure. Instead, it\n    only stops the current test and continues with the next. You can also set up\n    tests that report non-fatal failures after which the current test continues.\n    Thus, you can detect and fix multiple bugs in a single run-edit-compile\n    cycle.\n1.  The testing framework should liberate test writers from housekeeping chores\n    and let them focus on the test *content*. googletest automatically keeps\n    track of all tests defined, and doesn't require the user to enumerate them\n    in order to run them.\n1.  Tests should be *fast*. With googletest, you can reuse shared resources\n    across tests and pay for the set-up/tear-down only once, without making\n    tests depend on each other.\n\nSince googletest is based on the popular xUnit architecture, you'll feel right\nat home if you've used JUnit or PyUnit before. If not, it will take you about 10\nminutes to learn the basics and get started. So let's go!\n\n## Beware of the nomenclature\n\n_Note:_ There might be some confusion of idea due to different\ndefinitions of the terms _Test_, _Test Case_ and _Test Suite_, so beware\nof misunderstanding these.\n\nHistorically, googletest started to use the term _Test Case_ for grouping\nrelated tests, whereas current publications including the International Software\nTesting Qualifications Board ([ISTQB](http://www.istqb.org/)) and various\ntextbooks on Software Quality use the term _[Test\nSuite](http://glossary.istqb.org/search/test%20suite)_ for this.\n\nThe related term _Test_, as it is used in the googletest, is corresponding to\nthe term _[Test Case](http://glossary.istqb.org/search/test%20case)_ of ISTQB\nand others.\n\nThe term _Test_ is commonly of broad enough sense, including ISTQB's\ndefinition of _Test Case_, so it's not much of a problem here. But the\nterm _Test Case_ as used in Google Test is of contradictory sense and thus confusing.\n\nUnfortunately replacing the term _Test Case_ by _Test Suite_ throughout the\ngoogletest is not easy without breaking dependent projects, as `TestCase` is\npart of the public API at various places.\n\nSo for the time being, please be aware of the different definitions of\nthe terms:\n\nMeaning                                                                              | googletest Term                                                                                            | [ISTQB](http://www.istqb.org/) Term\n:----------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------- | :----------------------------------\nExercise a particular program path with specific input values and verify the results | [TEST()](#simple-tests)                                                                                    | [Test Case](http://glossary.istqb.org/search/test%20case)\nA set of several tests related to one component                                      | [TestCase](#basic-concepts) | [TestSuite](http://glossary.istqb.org/search/test%20suite)\n\n## Basic Concepts\n\nWhen using googletest, you start by writing *assertions*, which are statements\nthat check whether a condition is true. An assertion's result can be *success*,\n*nonfatal failure*, or *fatal failure*. If a fatal failure occurs, it aborts the\ncurrent function; otherwise the program continues normally.\n\n*Tests* use assertions to verify the tested code's behavior. If a test crashes\nor has a failed assertion, then it *fails*; otherwise it *succeeds*.\n\nA *test case* contains one or many tests. You should group your tests into test\ncases that reflect the structure of the tested code. When multiple tests in a\ntest case need to share common objects and subroutines, you can put them into a\n*test fixture* class.\n\nA *test program* can contain multiple test cases.\n\nWe'll now explain how to write a test program, starting at the individual\nassertion level and building up to tests and test cases.\n\n## Assertions\n\ngoogletest assertions are macros that resemble function calls. You test a class\nor function by making assertions about its behavior. When an assertion fails,\ngoogletest prints the assertion's source file and line number location, along\nwith a failure message. You may also supply a custom failure message which will\nbe appended to googletest's message.\n\nThe assertions come in pairs that test the same thing but have different effects\non the current function. `ASSERT_*` versions generate fatal failures when they\nfail, and **abort the current function**. `EXPECT_*` versions generate nonfatal\nfailures, which don't abort the current function. Usually `EXPECT_*` are\npreferred, as they allow more than one failure to be reported in a test.\nHowever, you should use `ASSERT_*` if it doesn't make sense to continue when the\nassertion in question fails.\n\nSince a failed `ASSERT_*` returns from the current function immediately,\npossibly skipping clean-up code that comes after it, it may cause a space leak.\nDepending on the nature of the leak, it may or may not be worth fixing - so keep\nthis in mind if you get a heap checker error in addition to assertion errors.\n\nTo provide a custom failure message, simply stream it into the macro using the\n`<<` operator, or a sequence of such operators. An example:\n\n```c++\nASSERT_EQ(x.size(), y.size()) << \"Vectors x and y are of unequal length\";\n\nfor (int i = 0; i < x.size(); ++i) {\n  EXPECT_EQ(x[i], y[i]) << \"Vectors x and y differ at index \" << i;\n}\n```\n\nAnything that can be streamed to an `ostream` can be streamed to an assertion\nmacro--in particular, C strings and `string` objects. If a wide string\n(`wchar_t*`, `TCHAR*` in `UNICODE` mode on Windows, or `std::wstring`) is\nstreamed to an assertion, it will be translated to UTF-8 when printed.\n\n### Basic Assertions\n\nThese assertions do basic true/false condition testing.\n\nFatal assertion            | Nonfatal assertion         | Verifies\n-------------------------- | -------------------------- | --------------------\n`ASSERT_TRUE(condition);`  | `EXPECT_TRUE(condition);`  | `condition` is true\n`ASSERT_FALSE(condition);` | `EXPECT_FALSE(condition);` | `condition` is false\n\nRemember, when they fail, `ASSERT_*` yields a fatal failure and returns from the\ncurrent function, while `EXPECT_*` yields a nonfatal failure, allowing the\nfunction to continue running. In either case, an assertion failure means its\ncontaining test fails.\n\n**Availability**: Linux, Windows, Mac.\n\n### Binary Comparison\n\nThis section describes assertions that compare two values.\n\nFatal assertion          | Nonfatal assertion       | Verifies\n------------------------ | ------------------------ | --------------\n`ASSERT_EQ(val1, val2);` | `EXPECT_EQ(val1, val2);` | `val1 == val2`\n`ASSERT_NE(val1, val2);` | `EXPECT_NE(val1, val2);` | `val1 != val2`\n`ASSERT_LT(val1, val2);` | `EXPECT_LT(val1, val2);` | `val1 < val2`\n`ASSERT_LE(val1, val2);` | `EXPECT_LE(val1, val2);` | `val1 <= val2`\n`ASSERT_GT(val1, val2);` | `EXPECT_GT(val1, val2);` | `val1 > val2`\n`ASSERT_GE(val1, val2);` | `EXPECT_GE(val1, val2);` | `val1 >= val2`\n\nValue arguments must be comparable by the assertion's comparison operator or\nyou'll get a compiler error. We used to require the arguments to support the\n`<<` operator for streaming to an `ostream`, but it's no longer necessary. If\n`<<` is supported, it will be called to print the arguments when the assertion\nfails; otherwise googletest will attempt to print them in the best way it can.\nFor more details and how to customize the printing of the arguments, see\ngMock [recipe](../../googlemock/docs/CookBook.md#teaching-google-mock-how-to-print-your-values).).\n\nThese assertions can work with a user-defined type, but only if you define the\ncorresponding comparison operator (e.g. `==`, `<`, etc). Since this is\ndiscouraged by the Google [C++ Style\nGuide](https://google.github.io/styleguide/cppguide.html#Operator_Overloading),\nyou may need to use `ASSERT_TRUE()` or `EXPECT_TRUE()` to assert the equality of\ntwo objects of a user-defined type.\n\nHowever, when possible, `ASSERT_EQ(actual, expected)` is preferred to\n`ASSERT_TRUE(actual == expected)`, since it tells you `actual` and `expected`'s\nvalues on failure.\n\nArguments are always evaluated exactly once. Therefore, it's OK for the\narguments to have side effects. However, as with any ordinary C/C++ function,\nthe arguments' evaluation order is undefined (i.e. the compiler is free to\nchoose any order) and your code should not depend on any particular argument\nevaluation order.\n\n`ASSERT_EQ()` does pointer equality on pointers. If used on two C strings, it\ntests if they are in the same memory location, not if they have the same value.\nTherefore, if you want to compare C strings (e.g. `const char*`) by value, use\n`ASSERT_STREQ()`, which will be described later on. In particular, to assert\nthat a C string is `NULL`, use `ASSERT_STREQ(c_string, NULL)`. Consider use\n`ASSERT_EQ(c_string, nullptr)` if c++11 is supported. To compare two `string`\nobjects, you should use `ASSERT_EQ`.\n\nWhen doing pointer comparisons use `*_EQ(ptr, nullptr)` and `*_NE(ptr, nullptr)`\ninstead of `*_EQ(ptr, NULL)` and `*_NE(ptr, NULL)`. This is because `nullptr` is\ntyped while `NULL` is not. See [FAQ](faq.md#why-does-google-test-support-expect_eqnull-ptr-and-assert_eqnull-ptr-but-not-expect_nenull-ptr-and-assert_nenull-ptr)\nfor more details.\n\nIf you're working with floating point numbers, you may want to use the floating\npoint variations of some of these macros in order to avoid problems caused by\nrounding. See [Advanced googletest Topics](advanced.md) for details.\n\nMacros in this section work with both narrow and wide string objects (`string`\nand `wstring`).\n\n**Availability**: Linux, Windows, Mac.\n\n**Historical note**: Before February 2016 `*_EQ` had a convention of calling it\nas `ASSERT_EQ(expected, actual)`, so lots of existing code uses this order. Now\n`*_EQ` treats both parameters in the same way.\n\n### String Comparison\n\nThe assertions in this group compare two **C strings**. If you want to compare\ntwo `string` objects, use `EXPECT_EQ`, `EXPECT_NE`, and etc instead.\n\n| Fatal assertion                 | Nonfatal assertion              | Verifies                                                 |\n| ------------------------------- | ------------------------------- | -------------------------------------------------------- |\n| `ASSERT_STREQ(str1, str2);`     | `EXPECT_STREQ(str1, str2);`     | the two C strings have the same content                  |\n| `ASSERT_STRNE(str1, str2);`     | `EXPECT_STRNE(str1, str2);`     | the two C strings have different contents                |\n| `ASSERT_STRCASEEQ(str1, str2);` | `EXPECT_STRCASEEQ(str1, str2);` | the two C strings have the same content, ignoring case   |\n| `ASSERT_STRCASENE(str1, str2);` | `EXPECT_STRCASENE(str1, str2);` | the two C strings have different contents, ignoring case |\n\nNote that \"CASE\" in an assertion name means that case is ignored. A `NULL`\npointer and an empty string are considered *different*.\n\n`*STREQ*` and `*STRNE*` also accept wide C strings (`wchar_t*`). If a comparison\nof two wide strings fails, their values will be printed as UTF-8 narrow strings.\n\n**Availability**: Linux, Windows, Mac.\n\n**See also**: For more string comparison tricks (substring, prefix, suffix, and\nregular expression matching, for example), see\n[this](https://github.com/google/googletest/blob/master/googletest/docs/advanced.md)\nin the Advanced googletest Guide.\n\n## Simple Tests\n\nTo create a test:\n\n1.  Use the `TEST()` macro to define and name a test function, These are\n    ordinary C++ functions that don't return a value.\n1.  In this function, along with any valid C++ statements you want to include,\n    use the various googletest assertions to check values.\n1.  The test's result is determined by the assertions; if any assertion in the\n    test fails (either fatally or non-fatally), or if the test crashes, the\n    entire test fails. Otherwise, it succeeds.\n\n```c++\nTEST(TestCaseName, TestName) {\n  ... test body ...\n}\n```\n\n`TEST()` arguments go from general to specific. The *first* argument is the name\nof the test case, and the *second* argument is the test's name within the test\ncase. Both names must be valid C++ identifiers, and they should not contain\nunderscore (`_`). A test's *full name* consists of its containing test case and\nits individual name. Tests from different test cases can have the same\nindividual name.\n\nFor example, let's take a simple integer function:\n\n```c++\nint Factorial(int n);  // Returns the factorial of n\n```\n\nA test case for this function might look like:\n\n```c++\n// Tests factorial of 0.\nTEST(FactorialTest, HandlesZeroInput) {\n  EXPECT_EQ(Factorial(0), 1);\n}\n\n// Tests factorial of positive numbers.\nTEST(FactorialTest, HandlesPositiveInput) {\n  EXPECT_EQ(Factorial(1), 1);\n  EXPECT_EQ(Factorial(2), 2);\n  EXPECT_EQ(Factorial(3), 6);\n  EXPECT_EQ(Factorial(8), 40320);\n}\n```\n\ngoogletest groups the test results by test cases, so logically-related tests\nshould be in the same test case; in other words, the first argument to their\n`TEST()` should be the same. In the above example, we have two tests,\n`HandlesZeroInput` and `HandlesPositiveInput`, that belong to the same test case\n`FactorialTest`.\n\nWhen naming your test cases and tests, you should follow the same convention as\nfor [naming functions and\nclasses](https://google.github.io/styleguide/cppguide.html#Function_Names).\n\n**Availability**: Linux, Windows, Mac.\n\n## Test Fixtures: Using the Same Data Configuration for Multiple Tests\n\nIf you find yourself writing two or more tests that operate on similar data, you\ncan use a *test fixture*. It allows you to reuse the same configuration of\nobjects for several different tests.\n\nTo create a fixture:\n\n1.  Derive a class from `::testing::Test` . Start its body with `protected:` as\n    we'll want to access fixture members from sub-classes.\n1.  Inside the class, declare any objects you plan to use.\n1.  If necessary, write a default constructor or `SetUp()` function to prepare\n    the objects for each test. A common mistake is to spell `SetUp()` as\n    **`Setup()`** with a small `u` - Use `override` in C++11 to make sure you\n    spelled it correctly\n1.  If necessary, write a destructor or `TearDown()` function to release any\n    resources you allocated in `SetUp()` . To learn when you should use the\n    constructor/destructor and when you should use `SetUp()/TearDown()`, read\n    this [FAQ](faq.md#should-i-use-the-constructordestructor-of-the-test-fixture-or-setupteardown) entry.\n1.  If needed, define subroutines for your tests to share.\n\nWhen using a fixture, use `TEST_F()` instead of `TEST()` as it allows you to\naccess objects and subroutines in the test fixture:\n\n```c++\nTEST_F(TestCaseName, TestName) {\n  ... test body ...\n}\n```\n\nLike `TEST()`, the first argument is the test case name, but for `TEST_F()` this\nmust be the name of the test fixture class. You've probably guessed: `_F` is for\nfixture.\n\nUnfortunately, the C++ macro system does not allow us to create a single macro\nthat can handle both types of tests. Using the wrong macro causes a compiler\nerror.\n\nAlso, you must first define a test fixture class before using it in a\n`TEST_F()`, or you'll get the compiler error \"`virtual outside class\ndeclaration`\".\n\nFor each test defined with `TEST_F()` , googletest will create a *fresh* test\nfixture at runtime, immediately initialize it via `SetUp()` , run the test,\nclean up by calling `TearDown()` , and then delete the test fixture. Note that\ndifferent tests in the same test case have different test fixture objects, and\ngoogletest always deletes a test fixture before it creates the next one.\ngoogletest does **not** reuse the same test fixture for multiple tests. Any\nchanges one test makes to the fixture do not affect other tests.\n\nAs an example, let's write tests for a FIFO queue class named `Queue`, which has\nthe following interface:\n\n```c++\ntemplate <typename E>  // E is the element type.\nclass Queue {\n public:\n  Queue();\n  void Enqueue(const E& element);\n  E* Dequeue();  // Returns NULL if the queue is empty.\n  size_t size() const;\n  ...\n};\n```\n\nFirst, define a fixture class. By convention, you should give it the name\n`FooTest` where `Foo` is the class being tested.\n\n```c++\nclass QueueTest : public ::testing::Test {\n protected:\n  void SetUp() override {\n     q1_.Enqueue(1);\n     q2_.Enqueue(2);\n     q2_.Enqueue(3);\n  }\n\n  // void TearDown() override {}\n\n  Queue<int> q0_;\n  Queue<int> q1_;\n  Queue<int> q2_;\n};\n```\n\nIn this case, `TearDown()` is not needed since we don't have to clean up after\neach test, other than what's already done by the destructor.\n\nNow we'll write tests using `TEST_F()` and this fixture.\n\n```c++\nTEST_F(QueueTest, IsEmptyInitially) {\n  EXPECT_EQ(q0_.size(), 0);\n}\n\nTEST_F(QueueTest, DequeueWorks) {\n  int* n = q0_.Dequeue();\n  EXPECT_EQ(n, nullptr);\n\n  n = q1_.Dequeue();\n  ASSERT_NE(n, nullptr);\n  EXPECT_EQ(*n, 1);\n  EXPECT_EQ(q1_.size(), 0);\n  delete n;\n\n  n = q2_.Dequeue();\n  ASSERT_NE(n, nullptr);\n  EXPECT_EQ(*n, 2);\n  EXPECT_EQ(q2_.size(), 1);\n  delete n;\n}\n```\n\nThe above uses both `ASSERT_*` and `EXPECT_*` assertions. The rule of thumb is\nto use `EXPECT_*` when you want the test to continue to reveal more errors after\nthe assertion failure, and use `ASSERT_*` when continuing after failure doesn't\nmake sense. For example, the second assertion in the `Dequeue` test is\n=ASSERT_NE(nullptr, n)=, as we need to dereference the pointer `n` later, which\nwould lead to a segfault when `n` is `NULL`.\n\nWhen these tests run, the following happens:\n\n1.  googletest constructs a `QueueTest` object (let's call it `t1` ).\n1.  `t1.SetUp()` initializes `t1` .\n1.  The first test ( `IsEmptyInitially` ) runs on `t1` .\n1.  `t1.TearDown()` cleans up after the test finishes.\n1.  `t1` is destructed.\n1.  The above steps are repeated on another `QueueTest` object, this time\n    running the `DequeueWorks` test.\n\n**Availability**: Linux, Windows, Mac.\n\n\n## Invoking the Tests\n\n`TEST()` and `TEST_F()` implicitly register their tests with googletest. So,\nunlike with many other C++ testing frameworks, you don't have to re-list all\nyour defined tests in order to run them.\n\nAfter defining your tests, you can run them with `RUN_ALL_TESTS()` , which\nreturns `0` if all the tests are successful, or `1` otherwise. Note that\n`RUN_ALL_TESTS()` runs *all tests* in your link unit -- they can be from\ndifferent test cases, or even different source files.\n\nWhen invoked, the `RUN_ALL_TESTS()` macro:\n\n1. Saves the state of all googletest flags\n\n*   Creates a test fixture object for the first test.\n\n*   Initializes it via `SetUp()`.\n\n*   Runs the test on the fixture object.\n\n*   Cleans up the fixture via `TearDown()`.\n\n*   Deletes the fixture.\n\n* Restores the state of all googletest flags\n\n*   Repeats the above steps for the next test, until all tests have run.\n\nIf a fatal failure happens the subsequent steps will be skipped.\n\n> IMPORTANT: You must **not** ignore the return value of `RUN_ALL_TESTS()`, or\n> you will get a compiler error. The rationale for this design is that the\n> automated testing service determines whether a test has passed based on its\n> exit code, not on its stdout/stderr output; thus your `main()` function must\n> return the value of `RUN_ALL_TESTS()`.\n>\n> Also, you should call `RUN_ALL_TESTS()` only **once**. Calling it more than\n> once conflicts with some advanced googletest features (e.g. thread-safe [death\n> tests](advanced#death-tests)) and thus is not supported.\n\n**Availability**: Linux, Windows, Mac.\n\n## Writing the main() Function\n\nIn `google3`, the simplest approach is to use the default main() function\nprovided by linking in `\"//testing/base/public:gtest_main\"`. If that doesn't\ncover what you need, you should write your own main() function, which should\nreturn the value of `RUN_ALL_TESTS()`. Link to `\"//testing/base/public:gunit\"`.\nYou can start from this boilerplate:\n\n```c++\n#include \"this/package/foo.h\"\n#include \"gtest/gtest.h\"\n\nnamespace {\n\n// The fixture for testing class Foo.\nclass FooTest : public ::testing::Test {\n protected:\n  // You can remove any or all of the following functions if its body\n  // is empty.\n\n  FooTest() {\n     // You can do set-up work for each test here.\n  }\n\n  ~FooTest() override {\n     // You can do clean-up work that doesn't throw exceptions here.\n  }\n\n  // If the constructor and destructor are not enough for setting up\n  // and cleaning up each test, you can define the following methods:\n\n  void SetUp() override {\n     // Code here will be called immediately after the constructor (right\n     // before each test).\n  }\n\n  void TearDown() override {\n     // Code here will be called immediately after each test (right\n     // before the destructor).\n  }\n\n  // Objects declared here can be used by all tests in the test case for Foo.\n};\n\n// Tests that the Foo::Bar() method does Abc.\nTEST_F(FooTest, MethodBarDoesAbc) {\n  const std::string input_filepath = \"this/package/testdata/myinputfile.dat\";\n  const std::string output_filepath = \"this/package/testdata/myoutputfile.dat\";\n  Foo f;\n  EXPECT_EQ(f.Bar(input_filepath, output_filepath), 0);\n}\n\n// Tests that Foo does Xyz.\nTEST_F(FooTest, DoesXyz) {\n  // Exercises the Xyz feature of Foo.\n}\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  ::testing::InitGoogleTest(&argc, argv);\n  return RUN_ALL_TESTS();\n}\n```\n\n\nThe `::testing::InitGoogleTest()` function parses the command line for\ngoogletest flags, and removes all recognized flags. This allows the user to\ncontrol a test program's behavior via various flags, which we'll cover in\n[AdvancedGuide](advanced.md). You **must** call this function before calling\n`RUN_ALL_TESTS()`, or the flags won't be properly initialized.\n\nOn Windows, `InitGoogleTest()` also works with wide strings, so it can be used\nin programs compiled in `UNICODE` mode as well.\n\nBut maybe you think that writing all those main() functions is too much work? We\nagree with you completely and that's why Google Test provides a basic\nimplementation of main(). If it fits your needs, then just link your test with\ngtest\\_main library and you are good to go.\n\nNOTE: `ParseGUnitFlags()` is deprecated in favor of `InitGoogleTest()`.\n\n\n## Known Limitations\n\n*   Google Test is designed to be thread-safe. The implementation is thread-safe\n    on systems where the `pthreads` library is available. It is currently\n    _unsafe_ to use Google Test assertions from two threads concurrently on\n    other systems (e.g. Windows). In most tests this is not an issue as usually\n    the assertions are done in the main thread. If you want to help, you can\n    volunteer to implement the necessary synchronization primitives in\n    `gtest-port.h` for your platform.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/docs/samples.md",
    "content": "# Googletest Samples {#samples}\n\nIf you're like us, you'd like to look at [googletest\nsamples.](https://github.com/google/googletest/tree/master/googletest/samples)\nThe sample directory has a number of well-commented samples showing how to use a\nvariety of googletest features.\n\n*   Sample #1 shows the basic steps of using googletest to test C++ functions.\n*   Sample #2 shows a more complex unit test for a class with multiple member\n    functions.\n*   Sample #3 uses a test fixture.\n*   Sample #4 teaches you how to use googletest and `googletest.h` together to\n    get the best of both libraries.\n*   Sample #5 puts shared testing logic in a base test fixture, and reuses it in\n    derived fixtures.\n*   Sample #6 demonstrates type-parameterized tests.\n*   Sample #7 teaches the basics of value-parameterized tests.\n*   Sample #8 shows using `Combine()` in value-parameterized tests.\n*   Sample #9 shows use of the listener API to modify Google Test's console\n    output and the use of its reflection API to inspect test results.\n*   Sample #10 shows use of the listener API to implement a primitive memory\n    leak checker.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/gtest-death-test.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This header file defines the public API for death tests.  It is\n// #included by gtest.h so a user doesn't need to include this\n// directly.\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_\n#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_\n\n#include \"gtest/internal/gtest-death-test-internal.h\"\n\nnamespace testing {\n\n// This flag controls the style of death tests.  Valid values are \"threadsafe\",\n// meaning that the death test child process will re-execute the test binary\n// from the start, running only a single death test, or \"fast\",\n// meaning that the child process will execute the test logic immediately\n// after forking.\nGTEST_DECLARE_string_(death_test_style);\n\n#if GTEST_HAS_DEATH_TEST\n\nnamespace internal {\n\n// Returns a Boolean value indicating whether the caller is currently\n// executing in the context of the death test child process.  Tools such as\n// Valgrind heap checkers may need this to modify their behavior in death\n// tests.  IMPORTANT: This is an internal utility.  Using it may break the\n// implementation of death tests.  User code MUST NOT use it.\nGTEST_API_ bool InDeathTestChild();\n\n}  // namespace internal\n\n// The following macros are useful for writing death tests.\n\n// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is\n// executed:\n//\n//   1. It generates a warning if there is more than one active\n//   thread.  This is because it's safe to fork() or clone() only\n//   when there is a single thread.\n//\n//   2. The parent process clone()s a sub-process and runs the death\n//   test in it; the sub-process exits with code 0 at the end of the\n//   death test, if it hasn't exited already.\n//\n//   3. The parent process waits for the sub-process to terminate.\n//\n//   4. The parent process checks the exit code and error message of\n//   the sub-process.\n//\n// Examples:\n//\n//   ASSERT_DEATH(server.SendMessage(56, \"Hello\"), \"Invalid port number\");\n//   for (int i = 0; i < 5; i++) {\n//     EXPECT_DEATH(server.ProcessRequest(i),\n//                  \"Invalid request .* in ProcessRequest()\")\n//                  << \"Failed to die on request \" << i;\n//   }\n//\n//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), \"Exiting\");\n//\n//   bool KilledBySIGHUP(int exit_code) {\n//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;\n//   }\n//\n//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, \"Hanging up!\");\n//\n// On the regular expressions used in death tests:\n//\n//   GOOGLETEST_CM0005 DO NOT DELETE\n//   On POSIX-compliant systems (*nix), we use the <regex.h> library,\n//   which uses the POSIX extended regex syntax.\n//\n//   On other platforms (e.g. Windows or Mac), we only support a simple regex\n//   syntax implemented as part of Google Test.  This limited\n//   implementation should be enough most of the time when writing\n//   death tests; though it lacks many features you can find in PCRE\n//   or POSIX extended regex syntax.  For example, we don't support\n//   union (\"x|y\"), grouping (\"(xy)\"), brackets (\"[xy]\"), and\n//   repetition count (\"x{5,7}\"), among others.\n//\n//   Below is the syntax that we do support.  We chose it to be a\n//   subset of both PCRE and POSIX extended regex, so it's easy to\n//   learn wherever you come from.  In the following: 'A' denotes a\n//   literal character, period (.), or a single \\\\ escape sequence;\n//   'x' and 'y' denote regular expressions; 'm' and 'n' are for\n//   natural numbers.\n//\n//     c     matches any literal character c\n//     \\\\d   matches any decimal digit\n//     \\\\D   matches any character that's not a decimal digit\n//     \\\\f   matches \\f\n//     \\\\n   matches \\n\n//     \\\\r   matches \\r\n//     \\\\s   matches any ASCII whitespace, including \\n\n//     \\\\S   matches any character that's not a whitespace\n//     \\\\t   matches \\t\n//     \\\\v   matches \\v\n//     \\\\w   matches any letter, _, or decimal digit\n//     \\\\W   matches any character that \\\\w doesn't match\n//     \\\\c   matches any literal character c, which must be a punctuation\n//     .     matches any single character except \\n\n//     A?    matches 0 or 1 occurrences of A\n//     A*    matches 0 or many occurrences of A\n//     A+    matches 1 or many occurrences of A\n//     ^     matches the beginning of a string (not that of each line)\n//     $     matches the end of a string (not that of each line)\n//     xy    matches x followed by y\n//\n//   If you accidentally use PCRE or POSIX extended regex features\n//   not implemented by us, you will get a run-time failure.  In that\n//   case, please try to rewrite your regular expression within the\n//   above syntax.\n//\n//   This implementation is *not* meant to be as highly tuned or robust\n//   as a compiled regex library, but should perform well enough for a\n//   death test, which already incurs significant overhead by launching\n//   a child process.\n//\n// Known caveats:\n//\n//   A \"threadsafe\" style death test obtains the path to the test\n//   program from argv[0] and re-executes it in the sub-process.  For\n//   simplicity, the current implementation doesn't search the PATH\n//   when launching the sub-process.  This means that the user must\n//   invoke the test program via a path that contains at least one\n//   path separator (e.g. path/to/foo_test and\n//   /absolute/path/to/bar_test are fine, but foo_test is not).  This\n//   is rarely a problem as people usually don't put the test binary\n//   directory in PATH.\n//\n// FIXME: make thread-safe death tests search the PATH.\n\n// Asserts that a given statement causes the program to exit, with an\n// integer exit status that satisfies predicate, and emitting error output\n// that matches regex.\n# define ASSERT_EXIT(statement, predicate, regex) \\\n    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)\n\n// Like ASSERT_EXIT, but continues on to successive tests in the\n// test case, if any:\n# define EXPECT_EXIT(statement, predicate, regex) \\\n    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)\n\n// Asserts that a given statement causes the program to exit, either by\n// explicitly exiting with a nonzero exit code or being killed by a\n// signal, and emitting error output that matches regex.\n# define ASSERT_DEATH(statement, regex) \\\n    ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)\n\n// Like ASSERT_DEATH, but continues on to successive tests in the\n// test case, if any:\n# define EXPECT_DEATH(statement, regex) \\\n    EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)\n\n// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:\n\n// Tests that an exit code describes a normal exit with a given exit code.\nclass GTEST_API_ ExitedWithCode {\n public:\n  explicit ExitedWithCode(int exit_code);\n  bool operator()(int exit_status) const;\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ExitedWithCode& other);\n\n  const int exit_code_;\n};\n\n# if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA\n// Tests that an exit code describes an exit due to termination by a\n// given signal.\n// GOOGLETEST_CM0006 DO NOT DELETE\nclass GTEST_API_ KilledBySignal {\n public:\n  explicit KilledBySignal(int signum);\n  bool operator()(int exit_status) const;\n private:\n  const int signum_;\n};\n# endif  // !GTEST_OS_WINDOWS\n\n// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.\n// The death testing framework causes this to have interesting semantics,\n// since the sideeffects of the call are only visible in opt mode, and not\n// in debug mode.\n//\n// In practice, this can be used to test functions that utilize the\n// LOG(DFATAL) macro using the following style:\n//\n// int DieInDebugOr12(int* sideeffect) {\n//   if (sideeffect) {\n//     *sideeffect = 12;\n//   }\n//   LOG(DFATAL) << \"death\";\n//   return 12;\n// }\n//\n// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {\n//   int sideeffect = 0;\n//   // Only asserts in dbg.\n//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), \"death\");\n//\n// #ifdef NDEBUG\n//   // opt-mode has sideeffect visible.\n//   EXPECT_EQ(12, sideeffect);\n// #else\n//   // dbg-mode no visible sideeffect.\n//   EXPECT_EQ(0, sideeffect);\n// #endif\n// }\n//\n// This will assert that DieInDebugReturn12InOpt() crashes in debug\n// mode, usually due to a DCHECK or LOG(DFATAL), but returns the\n// appropriate fallback value (12 in this case) in opt mode. If you\n// need to test that a function has appropriate side-effects in opt\n// mode, include assertions against the side-effects.  A general\n// pattern for this is:\n//\n// EXPECT_DEBUG_DEATH({\n//   // Side-effects here will have an effect after this statement in\n//   // opt mode, but none in debug mode.\n//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));\n// }, \"death\");\n//\n# ifdef NDEBUG\n\n#  define EXPECT_DEBUG_DEATH(statement, regex) \\\n  GTEST_EXECUTE_STATEMENT_(statement, regex)\n\n#  define ASSERT_DEBUG_DEATH(statement, regex) \\\n  GTEST_EXECUTE_STATEMENT_(statement, regex)\n\n# else\n\n#  define EXPECT_DEBUG_DEATH(statement, regex) \\\n  EXPECT_DEATH(statement, regex)\n\n#  define ASSERT_DEBUG_DEATH(statement, regex) \\\n  ASSERT_DEATH(statement, regex)\n\n# endif  // NDEBUG for EXPECT_DEBUG_DEATH\n#endif  // GTEST_HAS_DEATH_TEST\n\n// This macro is used for implementing macros such as\n// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where\n// death tests are not supported. Those macros must compile on such systems\n// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on\n// systems that support death tests. This allows one to write such a macro\n// on a system that does not support death tests and be sure that it will\n// compile on a death-test supporting system. It is exposed publicly so that\n// systems that have death-tests with stricter requirements than\n// GTEST_HAS_DEATH_TEST can write their own equivalent of\n// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED.\n//\n// Parameters:\n//   statement -  A statement that a macro such as EXPECT_DEATH would test\n//                for program termination. This macro has to make sure this\n//                statement is compiled but not executed, to ensure that\n//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain\n//                parameter iff EXPECT_DEATH compiles with it.\n//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test\n//                the output of statement.  This parameter has to be\n//                compiled but not evaluated by this macro, to ensure that\n//                this macro only accepts expressions that a macro such as\n//                EXPECT_DEATH would accept.\n//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED\n//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.\n//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not\n//                compile inside functions where ASSERT_DEATH doesn't\n//                compile.\n//\n//  The branch that has an always false condition is used to ensure that\n//  statement and regex are compiled (and thus syntactically correct) but\n//  never executed. The unreachable code macro protects the terminator\n//  statement from generating an 'unreachable code' warning in case\n//  statement unconditionally returns or throws. The Message constructor at\n//  the end allows the syntax of streaming additional messages into the\n//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.\n# define GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, terminator) \\\n    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n    if (::testing::internal::AlwaysTrue()) { \\\n      GTEST_LOG_(WARNING) \\\n          << \"Death tests are not supported on this platform.\\n\" \\\n          << \"Statement '\" #statement \"' cannot be verified.\"; \\\n    } else if (::testing::internal::AlwaysFalse()) { \\\n      ::testing::internal::RE::PartialMatch(\".*\", (regex)); \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n      terminator; \\\n    } else \\\n      ::testing::Message()\n\n// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and\n// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if\n// death tests are supported; otherwise they just issue a warning.  This is\n// useful when you are combining death test assertions with normal test\n// assertions in one test.\n#if GTEST_HAS_DEATH_TEST\n# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \\\n    EXPECT_DEATH(statement, regex)\n# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \\\n    ASSERT_DEATH(statement, regex)\n#else\n# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \\\n    GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, )\n# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \\\n    GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, return)\n#endif\n\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/gtest-message.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This header file defines the Message class.\n//\n// IMPORTANT NOTE: Due to limitation of the C++ language, we have to\n// leave some internal implementation details in this header file.\n// They are clearly marked by comments like this:\n//\n//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n//\n// Such code is NOT meant to be used by a user directly, and is subject\n// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user\n// program!\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_\n#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_\n\n#include <limits>\n\n#include \"gtest/internal/gtest-port.h\"\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\n// Ensures that there is at least one operator<< in the global namespace.\n// See Message& operator<<(...) below for why.\nvoid operator<<(const testing::internal::Secret&, int);\n\nnamespace testing {\n\n// The Message class works like an ostream repeater.\n//\n// Typical usage:\n//\n//   1. You stream a bunch of values to a Message object.\n//      It will remember the text in a stringstream.\n//   2. Then you stream the Message object to an ostream.\n//      This causes the text in the Message to be streamed\n//      to the ostream.\n//\n// For example;\n//\n//   testing::Message foo;\n//   foo << 1 << \" != \" << 2;\n//   std::cout << foo;\n//\n// will print \"1 != 2\".\n//\n// Message is not intended to be inherited from.  In particular, its\n// destructor is not virtual.\n//\n// Note that stringstream behaves differently in gcc and in MSVC.  You\n// can stream a NULL char pointer to it in the former, but not in the\n// latter (it causes an access violation if you do).  The Message\n// class hides this difference by treating a NULL char pointer as\n// \"(null)\".\nclass GTEST_API_ Message {\n private:\n  // The type of basic IO manipulators (endl, ends, and flush) for\n  // narrow streams.\n  typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);\n\n public:\n  // Constructs an empty Message.\n  Message();\n\n  // Copy constructor.\n  Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT\n    *ss_ << msg.GetString();\n  }\n\n  // Constructs a Message from a C-string.\n  explicit Message(const char* str) : ss_(new ::std::stringstream) {\n    *ss_ << str;\n  }\n\n#if GTEST_OS_SYMBIAN\n  // Streams a value (either a pointer or not) to this object.\n  template <typename T>\n  inline Message& operator <<(const T& value) {\n    StreamHelper(typename internal::is_pointer<T>::type(), value);\n    return *this;\n  }\n#else\n  // Streams a non-pointer value to this object.\n  template <typename T>\n  inline Message& operator <<(const T& val) {\n    // Some libraries overload << for STL containers.  These\n    // overloads are defined in the global namespace instead of ::std.\n    //\n    // C++'s symbol lookup rule (i.e. Koenig lookup) says that these\n    // overloads are visible in either the std namespace or the global\n    // namespace, but not other namespaces, including the testing\n    // namespace which Google Test's Message class is in.\n    //\n    // To allow STL containers (and other types that has a << operator\n    // defined in the global namespace) to be used in Google Test\n    // assertions, testing::Message must access the custom << operator\n    // from the global namespace.  With this using declaration,\n    // overloads of << defined in the global namespace and those\n    // visible via Koenig lookup are both exposed in this function.\n    using ::operator <<;\n    *ss_ << val;\n    return *this;\n  }\n\n  // Streams a pointer value to this object.\n  //\n  // This function is an overload of the previous one.  When you\n  // stream a pointer to a Message, this definition will be used as it\n  // is more specialized.  (The C++ Standard, section\n  // [temp.func.order].)  If you stream a non-pointer, then the\n  // previous definition will be used.\n  //\n  // The reason for this overload is that streaming a NULL pointer to\n  // ostream is undefined behavior.  Depending on the compiler, you\n  // may get \"0\", \"(nil)\", \"(null)\", or an access violation.  To\n  // ensure consistent result across compilers, we always treat NULL\n  // as \"(null)\".\n  template <typename T>\n  inline Message& operator <<(T* const& pointer) {  // NOLINT\n    if (pointer == NULL) {\n      *ss_ << \"(null)\";\n    } else {\n      *ss_ << pointer;\n    }\n    return *this;\n  }\n#endif  // GTEST_OS_SYMBIAN\n\n  // Since the basic IO manipulators are overloaded for both narrow\n  // and wide streams, we have to provide this specialized definition\n  // of operator <<, even though its body is the same as the\n  // templatized version above.  Without this definition, streaming\n  // endl or other basic IO manipulators to Message will confuse the\n  // compiler.\n  Message& operator <<(BasicNarrowIoManip val) {\n    *ss_ << val;\n    return *this;\n  }\n\n  // Instead of 1/0, we want to see true/false for bool values.\n  Message& operator <<(bool b) {\n    return *this << (b ? \"true\" : \"false\");\n  }\n\n  // These two overloads allow streaming a wide C string to a Message\n  // using the UTF-8 encoding.\n  Message& operator <<(const wchar_t* wide_c_str);\n  Message& operator <<(wchar_t* wide_c_str);\n\n#if GTEST_HAS_STD_WSTRING\n  // Converts the given wide string to a narrow string using the UTF-8\n  // encoding, and streams the result to this Message object.\n  Message& operator <<(const ::std::wstring& wstr);\n#endif  // GTEST_HAS_STD_WSTRING\n\n#if GTEST_HAS_GLOBAL_WSTRING\n  // Converts the given wide string to a narrow string using the UTF-8\n  // encoding, and streams the result to this Message object.\n  Message& operator <<(const ::wstring& wstr);\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n  // Gets the text streamed to this object so far as an std::string.\n  // Each '\\0' character in the buffer is replaced with \"\\\\0\".\n  //\n  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n  std::string GetString() const;\n\n private:\n#if GTEST_OS_SYMBIAN\n  // These are needed as the Nokia Symbian Compiler cannot decide between\n  // const T& and const T* in a function template. The Nokia compiler _can_\n  // decide between class template specializations for T and T*, so a\n  // tr1::type_traits-like is_pointer works, and we can overload on that.\n  template <typename T>\n  inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {\n    if (pointer == NULL) {\n      *ss_ << \"(null)\";\n    } else {\n      *ss_ << pointer;\n    }\n  }\n  template <typename T>\n  inline void StreamHelper(internal::false_type /*is_pointer*/,\n                           const T& value) {\n    // See the comments in Message& operator <<(const T&) above for why\n    // we need this using statement.\n    using ::operator <<;\n    *ss_ << value;\n  }\n#endif  // GTEST_OS_SYMBIAN\n\n  // We'll hold the text streamed to this object here.\n  const internal::scoped_ptr< ::std::stringstream> ss_;\n\n  // We declare (but don't implement) this to prevent the compiler\n  // from implementing the assignment operator.\n  void operator=(const Message&);\n};\n\n// Streams a Message to an ostream.\ninline std::ostream& operator <<(std::ostream& os, const Message& sb) {\n  return os << sb.GetString();\n}\n\nnamespace internal {\n\n// Converts a streamable value to an std::string.  A NULL pointer is\n// converted to \"(null)\".  When the input value is a ::string,\n// ::std::string, ::wstring, or ::std::wstring object, each NUL\n// character in it is replaced with \"\\\\0\".\ntemplate <typename T>\nstd::string StreamableToString(const T& streamable) {\n  return (Message() << streamable).GetString();\n}\n\n}  // namespace internal\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/gtest-param-test.h",
    "content": "// This file was GENERATED by command:\n//     pump.py gtest-param-test.h.pump\n// DO NOT EDIT BY HAND!!!\n\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Macros and functions for implementing parameterized tests\n// in Google C++ Testing and Mocking Framework (Google Test)\n//\n// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!\n//\n// GOOGLETEST_CM0001 DO NOT DELETE\n#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n\n\n// Value-parameterized tests allow you to test your code with different\n// parameters without writing multiple copies of the same test.\n//\n// Here is how you use value-parameterized tests:\n\n#if 0\n\n// To write value-parameterized tests, first you should define a fixture\n// class. It is usually derived from testing::TestWithParam<T> (see below for\n// another inheritance scheme that's sometimes useful in more complicated\n// class hierarchies), where the type of your parameter values.\n// TestWithParam<T> is itself derived from testing::Test. T can be any\n// copyable type. If it's a raw pointer, you are responsible for managing the\n// lifespan of the pointed values.\n\nclass FooTest : public ::testing::TestWithParam<const char*> {\n  // You can implement all the usual class fixture members here.\n};\n\n// Then, use the TEST_P macro to define as many parameterized tests\n// for this fixture as you want. The _P suffix is for \"parameterized\"\n// or \"pattern\", whichever you prefer to think.\n\nTEST_P(FooTest, DoesBlah) {\n  // Inside a test, access the test parameter with the GetParam() method\n  // of the TestWithParam<T> class:\n  EXPECT_TRUE(foo.Blah(GetParam()));\n  ...\n}\n\nTEST_P(FooTest, HasBlahBlah) {\n  ...\n}\n\n// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test\n// case with any set of parameters you want. Google Test defines a number\n// of functions for generating test parameters. They return what we call\n// (surprise!) parameter generators. Here is a summary of them, which\n// are all in the testing namespace:\n//\n//\n//  Range(begin, end [, step]) - Yields values {begin, begin+step,\n//                               begin+step+step, ...}. The values do not\n//                               include end. step defaults to 1.\n//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.\n//  ValuesIn(container)        - Yields values from a C-style array, an STL\n//  ValuesIn(begin,end)          container, or an iterator range [begin, end).\n//  Bool()                     - Yields sequence {false, true}.\n//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product\n//                               for the math savvy) of the values generated\n//                               by the N generators.\n//\n// For more details, see comments at the definitions of these functions below\n// in this file.\n//\n// The following statement will instantiate tests from the FooTest test case\n// each with parameter values \"meeny\", \"miny\", and \"moe\".\n\nINSTANTIATE_TEST_CASE_P(InstantiationName,\n                        FooTest,\n                        Values(\"meeny\", \"miny\", \"moe\"));\n\n// To distinguish different instances of the pattern, (yes, you\n// can instantiate it more then once) the first argument to the\n// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the\n// actual test case name. Remember to pick unique prefixes for different\n// instantiations. The tests from the instantiation above will have\n// these names:\n//\n//    * InstantiationName/FooTest.DoesBlah/0 for \"meeny\"\n//    * InstantiationName/FooTest.DoesBlah/1 for \"miny\"\n//    * InstantiationName/FooTest.DoesBlah/2 for \"moe\"\n//    * InstantiationName/FooTest.HasBlahBlah/0 for \"meeny\"\n//    * InstantiationName/FooTest.HasBlahBlah/1 for \"miny\"\n//    * InstantiationName/FooTest.HasBlahBlah/2 for \"moe\"\n//\n// You can use these names in --gtest_filter.\n//\n// This statement will instantiate all tests from FooTest again, each\n// with parameter values \"cat\" and \"dog\":\n\nconst char* pets[] = {\"cat\", \"dog\"};\nINSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));\n\n// The tests from the instantiation above will have these names:\n//\n//    * AnotherInstantiationName/FooTest.DoesBlah/0 for \"cat\"\n//    * AnotherInstantiationName/FooTest.DoesBlah/1 for \"dog\"\n//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for \"cat\"\n//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for \"dog\"\n//\n// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests\n// in the given test case, whether their definitions come before or\n// AFTER the INSTANTIATE_TEST_CASE_P statement.\n//\n// Please also note that generator expressions (including parameters to the\n// generators) are evaluated in InitGoogleTest(), after main() has started.\n// This allows the user on one hand, to adjust generator parameters in order\n// to dynamically determine a set of tests to run and on the other hand,\n// give the user a chance to inspect the generated tests with Google Test\n// reflection API before RUN_ALL_TESTS() is executed.\n//\n// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc\n// for more examples.\n//\n// In the future, we plan to publish the API for defining new parameter\n// generators. But for now this interface remains part of the internal\n// implementation and is subject to change.\n//\n//\n// A parameterized test fixture must be derived from testing::Test and from\n// testing::WithParamInterface<T>, where T is the type of the parameter\n// values. Inheriting from TestWithParam<T> satisfies that requirement because\n// TestWithParam<T> inherits from both Test and WithParamInterface. In more\n// complicated hierarchies, however, it is occasionally useful to inherit\n// separately from Test and WithParamInterface. For example:\n\nclass BaseTest : public ::testing::Test {\n  // You can inherit all the usual members for a non-parameterized test\n  // fixture here.\n};\n\nclass DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {\n  // The usual test fixture members go here too.\n};\n\nTEST_F(BaseTest, HasFoo) {\n  // This is an ordinary non-parameterized test.\n}\n\nTEST_P(DerivedTest, DoesBlah) {\n  // GetParam works just the same here as if you inherit from TestWithParam.\n  EXPECT_TRUE(foo.Blah(GetParam()));\n}\n\n#endif  // 0\n\n#include \"gtest/internal/gtest-port.h\"\n\n#if !GTEST_OS_SYMBIAN\n# include <utility>\n#endif\n\n#include \"gtest/internal/gtest-internal.h\"\n#include \"gtest/internal/gtest-param-util.h\"\n#include \"gtest/internal/gtest-param-util-generated.h\"\n\nnamespace testing {\n\n// Functions producing parameter generators.\n//\n// Google Test uses these generators to produce parameters for value-\n// parameterized tests. When a parameterized test case is instantiated\n// with a particular generator, Google Test creates and runs tests\n// for each element in the sequence produced by the generator.\n//\n// In the following sample, tests from test case FooTest are instantiated\n// each three times with parameter values 3, 5, and 8:\n//\n// class FooTest : public TestWithParam<int> { ... };\n//\n// TEST_P(FooTest, TestThis) {\n// }\n// TEST_P(FooTest, TestThat) {\n// }\n// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));\n//\n\n// Range() returns generators providing sequences of values in a range.\n//\n// Synopsis:\n// Range(start, end)\n//   - returns a generator producing a sequence of values {start, start+1,\n//     start+2, ..., }.\n// Range(start, end, step)\n//   - returns a generator producing a sequence of values {start, start+step,\n//     start+step+step, ..., }.\n// Notes:\n//   * The generated sequences never include end. For example, Range(1, 5)\n//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)\n//     returns a generator producing {1, 3, 5, 7}.\n//   * start and end must have the same type. That type may be any integral or\n//     floating-point type or a user defined type satisfying these conditions:\n//     * It must be assignable (have operator=() defined).\n//     * It must have operator+() (operator+(int-compatible type) for\n//       two-operand version).\n//     * It must have operator<() defined.\n//     Elements in the resulting sequences will also have that type.\n//   * Condition start < end must be satisfied in order for resulting sequences\n//     to contain any elements.\n//\ntemplate <typename T, typename IncrementT>\ninternal::ParamGenerator<T> Range(T start, T end, IncrementT step) {\n  return internal::ParamGenerator<T>(\n      new internal::RangeGenerator<T, IncrementT>(start, end, step));\n}\n\ntemplate <typename T>\ninternal::ParamGenerator<T> Range(T start, T end) {\n  return Range(start, end, 1);\n}\n\n// ValuesIn() function allows generation of tests with parameters coming from\n// a container.\n//\n// Synopsis:\n// ValuesIn(const T (&array)[N])\n//   - returns a generator producing sequences with elements from\n//     a C-style array.\n// ValuesIn(const Container& container)\n//   - returns a generator producing sequences with elements from\n//     an STL-style container.\n// ValuesIn(Iterator begin, Iterator end)\n//   - returns a generator producing sequences with elements from\n//     a range [begin, end) defined by a pair of STL-style iterators. These\n//     iterators can also be plain C pointers.\n//\n// Please note that ValuesIn copies the values from the containers\n// passed in and keeps them to generate tests in RUN_ALL_TESTS().\n//\n// Examples:\n//\n// This instantiates tests from test case StringTest\n// each with C-string values of \"foo\", \"bar\", and \"baz\":\n//\n// const char* strings[] = {\"foo\", \"bar\", \"baz\"};\n// INSTANTIATE_TEST_CASE_P(StringSequence, StringTest, ValuesIn(strings));\n//\n// This instantiates tests from test case StlStringTest\n// each with STL strings with values \"a\" and \"b\":\n//\n// ::std::vector< ::std::string> GetParameterStrings() {\n//   ::std::vector< ::std::string> v;\n//   v.push_back(\"a\");\n//   v.push_back(\"b\");\n//   return v;\n// }\n//\n// INSTANTIATE_TEST_CASE_P(CharSequence,\n//                         StlStringTest,\n//                         ValuesIn(GetParameterStrings()));\n//\n//\n// This will also instantiate tests from CharTest\n// each with parameter values 'a' and 'b':\n//\n// ::std::list<char> GetParameterChars() {\n//   ::std::list<char> list;\n//   list.push_back('a');\n//   list.push_back('b');\n//   return list;\n// }\n// ::std::list<char> l = GetParameterChars();\n// INSTANTIATE_TEST_CASE_P(CharSequence2,\n//                         CharTest,\n//                         ValuesIn(l.begin(), l.end()));\n//\ntemplate <typename ForwardIterator>\ninternal::ParamGenerator<\n  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>\nValuesIn(ForwardIterator begin, ForwardIterator end) {\n  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>\n      ::value_type ParamType;\n  return internal::ParamGenerator<ParamType>(\n      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));\n}\n\ntemplate <typename T, size_t N>\ninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {\n  return ValuesIn(array, array + N);\n}\n\ntemplate <class Container>\ninternal::ParamGenerator<typename Container::value_type> ValuesIn(\n    const Container& container) {\n  return ValuesIn(container.begin(), container.end());\n}\n\n// Values() allows generating tests from explicitly specified list of\n// parameters.\n//\n// Synopsis:\n// Values(T v1, T v2, ..., T vN)\n//   - returns a generator producing sequences with elements v1, v2, ..., vN.\n//\n// For example, this instantiates tests from test case BarTest each\n// with values \"one\", \"two\", and \"three\":\n//\n// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values(\"one\", \"two\", \"three\"));\n//\n// This instantiates tests from test case BazTest each with values 1, 2, 3.5.\n// The exact type of values will depend on the type of parameter in BazTest.\n//\n// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));\n//\n// Currently, Values() supports from 1 to 50 parameters.\n//\ntemplate <typename T1>\ninternal::ValueArray1<T1> Values(T1 v1) {\n  return internal::ValueArray1<T1>(v1);\n}\n\ntemplate <typename T1, typename T2>\ninternal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {\n  return internal::ValueArray2<T1, T2>(v1, v2);\n}\n\ntemplate <typename T1, typename T2, typename T3>\ninternal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {\n  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\ninternal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {\n  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\ninternal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5) {\n  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\ninternal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,\n    T4 v4, T5 v5, T6 v6) {\n  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\ninternal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,\n    T4 v4, T5 v5, T6 v6, T7 v7) {\n  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,\n      v6, v7);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\ninternal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {\n  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,\n      v5, v6, v7, v8);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\ninternal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {\n  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,\n      v4, v5, v6, v7, v8, v9);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\ninternal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,\n    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {\n  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,\n      v2, v3, v4, v5, v6, v7, v8, v9, v10);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11>\ninternal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,\n    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11) {\n  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,\n      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12>\ninternal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12) {\n  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13>\ninternal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13) {\n  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14>\ninternal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {\n  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,\n      v14);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15>\ninternal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,\n    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {\n  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,\n      v13, v14, v15);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16>\ninternal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16) {\n  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,\n      v12, v13, v14, v15, v16);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17>\ninternal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17) {\n  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,\n      v11, v12, v13, v14, v15, v16, v17);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18>\ninternal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,\n    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18) {\n  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,\n      v10, v11, v12, v13, v14, v15, v16, v17, v18);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19>\ninternal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,\n    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,\n    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {\n  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,\n      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20>\ninternal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,\n    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {\n  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,\n      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21>\ninternal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,\n    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {\n  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,\n      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22>\ninternal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,\n    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22) {\n  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,\n      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,\n      v20, v21, v22);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23>\ninternal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22, T23 v23) {\n  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,\n      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,\n      v20, v21, v22, v23);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24>\ninternal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22, T23 v23, T24 v24) {\n  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,\n      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,\n      v19, v20, v21, v22, v23, v24);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25>\ninternal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,\n    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,\n    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,\n    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {\n  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,\n      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,\n      v18, v19, v20, v21, v22, v23, v24, v25);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26>\ninternal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26) {\n  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,\n      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27>\ninternal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27) {\n  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,\n      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28>\ninternal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28) {\n  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,\n      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,\n      v28);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29>\ninternal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28, T29 v29) {\n  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,\n      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,\n      v27, v28, v29);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30>\ninternal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,\n    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,\n    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,\n    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {\n  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,\n      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,\n      v26, v27, v28, v29, v30);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31>\ninternal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {\n  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,\n      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,\n      v25, v26, v27, v28, v29, v30, v31);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32>\ninternal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,\n    T32 v32) {\n  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,\n      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,\n      v24, v25, v26, v27, v28, v29, v30, v31, v32);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33>\ninternal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,\n    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,\n    T32 v32, T33 v33) {\n  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,\n      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,\n      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34>\ninternal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,\n    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,\n    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,\n    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,\n    T31 v31, T32 v32, T33 v33, T34 v34) {\n  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,\n      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,\n      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35>\ninternal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,\n    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,\n    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,\n    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {\n  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,\n      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,\n      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36>\ninternal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,\n    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,\n    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,\n    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {\n  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,\n      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,\n      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,\n      v34, v35, v36);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37>\ninternal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,\n    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,\n    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,\n    T37 v37) {\n  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,\n      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,\n      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,\n      v34, v35, v36, v37);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38>\ninternal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,\n    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,\n    T37 v37, T38 v38) {\n  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,\n      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,\n      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,\n      v33, v34, v35, v36, v37, v38);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39>\ninternal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,\n    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,\n    T37 v37, T38 v38, T39 v39) {\n  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,\n      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,\n      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,\n      v32, v33, v34, v35, v36, v37, v38, v39);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40>\ninternal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,\n    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,\n    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,\n    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,\n    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,\n    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {\n  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,\n      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,\n      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41>\ninternal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {\n  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,\n      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,\n      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42>\ninternal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n    T42 v42) {\n  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,\n      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,\n      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,\n      v42);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43>\ninternal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n    T42 v42, T43 v43) {\n  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,\n      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,\n      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,\n      v41, v42, v43);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44>\ninternal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n    T42 v42, T43 v43, T44 v44) {\n  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,\n      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,\n      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,\n      v40, v41, v42, v43, v44);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45>\ninternal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,\n    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,\n    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,\n    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,\n    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,\n    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {\n  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,\n      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,\n      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,\n      v39, v40, v41, v42, v43, v44, v45);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46>\ninternal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,\n    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,\n    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {\n  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,\n      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,\n      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,\n      v38, v39, v40, v41, v42, v43, v44, v45, v46);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47>\ninternal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,\n    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,\n    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {\n  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,\n      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,\n      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,\n      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48>\ninternal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,\n    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,\n    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,\n    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,\n    T48 v48) {\n  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,\n      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,\n      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,\n      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49>\ninternal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,\n    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,\n    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,\n    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,\n    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,\n    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,\n    T47 v47, T48 v48, T49 v49) {\n  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,\n      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,\n      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,\n      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49, typename T50>\ninternal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,\n    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,\n    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,\n    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,\n    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,\n    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {\n  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,\n      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,\n      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,\n      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,\n      v48, v49, v50);\n}\n\n// Bool() allows generating tests with parameters in a set of (false, true).\n//\n// Synopsis:\n// Bool()\n//   - returns a generator producing sequences with elements {false, true}.\n//\n// It is useful when testing code that depends on Boolean flags. Combinations\n// of multiple flags can be tested when several Bool()'s are combined using\n// Combine() function.\n//\n// In the following example all tests in the test case FlagDependentTest\n// will be instantiated twice with parameters false and true.\n//\n// class FlagDependentTest : public testing::TestWithParam<bool> {\n//   virtual void SetUp() {\n//     external_flag = GetParam();\n//   }\n// }\n// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());\n//\ninline internal::ParamGenerator<bool> Bool() {\n  return Values(false, true);\n}\n\n# if GTEST_HAS_COMBINE\n// Combine() allows the user to combine two or more sequences to produce\n// values of a Cartesian product of those sequences' elements.\n//\n// Synopsis:\n// Combine(gen1, gen2, ..., genN)\n//   - returns a generator producing sequences with elements coming from\n//     the Cartesian product of elements from the sequences generated by\n//     gen1, gen2, ..., genN. The sequence elements will have a type of\n//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types\n//     of elements from sequences produces by gen1, gen2, ..., genN.\n//\n// Combine can have up to 10 arguments. This number is currently limited\n// by the maximum number of elements in the tuple implementation used by Google\n// Test.\n//\n// Example:\n//\n// This will instantiate tests in test case AnimalTest each one with\n// the parameter values tuple(\"cat\", BLACK), tuple(\"cat\", WHITE),\n// tuple(\"dog\", BLACK), and tuple(\"dog\", WHITE):\n//\n// enum Color { BLACK, GRAY, WHITE };\n// class AnimalTest\n//     : public testing::TestWithParam<tuple<const char*, Color> > {...};\n//\n// TEST_P(AnimalTest, AnimalLooksNice) {...}\n//\n// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,\n//                         Combine(Values(\"cat\", \"dog\"),\n//                                 Values(BLACK, WHITE)));\n//\n// This will instantiate tests in FlagDependentTest with all variations of two\n// Boolean flags:\n//\n// class FlagDependentTest\n//     : public testing::TestWithParam<tuple<bool, bool> > {\n//   virtual void SetUp() {\n//     // Assigns external_flag_1 and external_flag_2 values from the tuple.\n//     tie(external_flag_1, external_flag_2) = GetParam();\n//   }\n// };\n//\n// TEST_P(FlagDependentTest, TestFeature1) {\n//   // Test your code using external_flag_1 and external_flag_2 here.\n// }\n// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,\n//                         Combine(Bool(), Bool()));\n//\ntemplate <typename Generator1, typename Generator2>\ninternal::CartesianProductHolder2<Generator1, Generator2> Combine(\n    const Generator1& g1, const Generator2& g2) {\n  return internal::CartesianProductHolder2<Generator1, Generator2>(\n      g1, g2);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3>\ninternal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3) {\n  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(\n      g1, g2, g3);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4>\ninternal::CartesianProductHolder4<Generator1, Generator2, Generator3,\n    Generator4> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4) {\n  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,\n      Generator4>(\n      g1, g2, g3, g4);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5>\ninternal::CartesianProductHolder5<Generator1, Generator2, Generator3,\n    Generator4, Generator5> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5) {\n  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,\n      Generator4, Generator5>(\n      g1, g2, g3, g4, g5);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5, typename Generator6>\ninternal::CartesianProductHolder6<Generator1, Generator2, Generator3,\n    Generator4, Generator5, Generator6> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5, const Generator6& g6) {\n  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,\n      Generator4, Generator5, Generator6>(\n      g1, g2, g3, g4, g5, g6);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5, typename Generator6,\n    typename Generator7>\ninternal::CartesianProductHolder7<Generator1, Generator2, Generator3,\n    Generator4, Generator5, Generator6, Generator7> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5, const Generator6& g6,\n        const Generator7& g7) {\n  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,\n      Generator4, Generator5, Generator6, Generator7>(\n      g1, g2, g3, g4, g5, g6, g7);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5, typename Generator6,\n    typename Generator7, typename Generator8>\ninternal::CartesianProductHolder8<Generator1, Generator2, Generator3,\n    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5, const Generator6& g6,\n        const Generator7& g7, const Generator8& g8) {\n  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,\n      Generator4, Generator5, Generator6, Generator7, Generator8>(\n      g1, g2, g3, g4, g5, g6, g7, g8);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5, typename Generator6,\n    typename Generator7, typename Generator8, typename Generator9>\ninternal::CartesianProductHolder9<Generator1, Generator2, Generator3,\n    Generator4, Generator5, Generator6, Generator7, Generator8,\n    Generator9> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5, const Generator6& g6,\n        const Generator7& g7, const Generator8& g8, const Generator9& g9) {\n  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,\n      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(\n      g1, g2, g3, g4, g5, g6, g7, g8, g9);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5, typename Generator6,\n    typename Generator7, typename Generator8, typename Generator9,\n    typename Generator10>\ninternal::CartesianProductHolder10<Generator1, Generator2, Generator3,\n    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,\n    Generator10> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5, const Generator6& g6,\n        const Generator7& g7, const Generator8& g8, const Generator9& g9,\n        const Generator10& g10) {\n  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,\n      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,\n      Generator10>(\n      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);\n}\n# endif  // GTEST_HAS_COMBINE\n\n# define TEST_P(test_case_name, test_name) \\\n  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \\\n      : public test_case_name { \\\n   public: \\\n    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \\\n    virtual void TestBody(); \\\n   private: \\\n    static int AddToRegistry() { \\\n      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \\\n          GetTestCasePatternHolder<test_case_name>(\\\n              #test_case_name, \\\n              ::testing::internal::CodeLocation(\\\n                  __FILE__, __LINE__))->AddTestPattern(\\\n                      GTEST_STRINGIFY_(test_case_name), \\\n                      GTEST_STRINGIFY_(test_name), \\\n                      new ::testing::internal::TestMetaFactory< \\\n                          GTEST_TEST_CLASS_NAME_(\\\n                              test_case_name, test_name)>()); \\\n      return 0; \\\n    } \\\n    static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \\\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(\\\n        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \\\n  }; \\\n  int GTEST_TEST_CLASS_NAME_(test_case_name, \\\n                             test_name)::gtest_registering_dummy_ = \\\n      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \\\n  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()\n\n// The optional last argument to INSTANTIATE_TEST_CASE_P allows the user\n// to specify a function or functor that generates custom test name suffixes\n// based on the test parameters. The function should accept one argument of\n// type testing::TestParamInfo<class ParamType>, and return std::string.\n//\n// testing::PrintToStringParamName is a builtin test suffix generator that\n// returns the value of testing::PrintToString(GetParam()).\n//\n// Note: test names must be non-empty, unique, and may only contain ASCII\n// alphanumeric characters or underscore. Because PrintToString adds quotes\n// to std::string and C strings, it won't work for these types.\n\n# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator, ...) \\\n  static ::testing::internal::ParamGenerator<test_case_name::ParamType> \\\n      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \\\n  static ::std::string gtest_##prefix##test_case_name##_EvalGenerateName_( \\\n      const ::testing::TestParamInfo<test_case_name::ParamType>& info) { \\\n    return ::testing::internal::GetParamNameGen<test_case_name::ParamType> \\\n        (__VA_ARGS__)(info); \\\n  } \\\n  static int gtest_##prefix##test_case_name##_dummy_ GTEST_ATTRIBUTE_UNUSED_ = \\\n      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \\\n          GetTestCasePatternHolder<test_case_name>(\\\n              #test_case_name, \\\n              ::testing::internal::CodeLocation(\\\n                  __FILE__, __LINE__))->AddTestCaseInstantiation(\\\n                      #prefix, \\\n                      &gtest_##prefix##test_case_name##_EvalGenerator_, \\\n                      &gtest_##prefix##test_case_name##_EvalGenerateName_, \\\n                      __FILE__, __LINE__)\n\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/gtest-param-test.h.pump",
    "content": "$$ -*- mode: c++; -*-\n$var n = 50  $$ Maximum length of Values arguments we want to support.\n$var maxtuple = 10  $$ Maximum number of Combine arguments we want to support.\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Macros and functions for implementing parameterized tests\n// in Google C++ Testing and Mocking Framework (Google Test)\n//\n// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!\n//\n// GOOGLETEST_CM0001 DO NOT DELETE\n#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n\n\n// Value-parameterized tests allow you to test your code with different\n// parameters without writing multiple copies of the same test.\n//\n// Here is how you use value-parameterized tests:\n\n#if 0\n\n// To write value-parameterized tests, first you should define a fixture\n// class. It is usually derived from testing::TestWithParam<T> (see below for\n// another inheritance scheme that's sometimes useful in more complicated\n// class hierarchies), where the type of your parameter values.\n// TestWithParam<T> is itself derived from testing::Test. T can be any\n// copyable type. If it's a raw pointer, you are responsible for managing the\n// lifespan of the pointed values.\n\nclass FooTest : public ::testing::TestWithParam<const char*> {\n  // You can implement all the usual class fixture members here.\n};\n\n// Then, use the TEST_P macro to define as many parameterized tests\n// for this fixture as you want. The _P suffix is for \"parameterized\"\n// or \"pattern\", whichever you prefer to think.\n\nTEST_P(FooTest, DoesBlah) {\n  // Inside a test, access the test parameter with the GetParam() method\n  // of the TestWithParam<T> class:\n  EXPECT_TRUE(foo.Blah(GetParam()));\n  ...\n}\n\nTEST_P(FooTest, HasBlahBlah) {\n  ...\n}\n\n// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test\n// case with any set of parameters you want. Google Test defines a number\n// of functions for generating test parameters. They return what we call\n// (surprise!) parameter generators. Here is a summary of them, which\n// are all in the testing namespace:\n//\n//\n//  Range(begin, end [, step]) - Yields values {begin, begin+step,\n//                               begin+step+step, ...}. The values do not\n//                               include end. step defaults to 1.\n//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.\n//  ValuesIn(container)        - Yields values from a C-style array, an STL\n//  ValuesIn(begin,end)          container, or an iterator range [begin, end).\n//  Bool()                     - Yields sequence {false, true}.\n//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product\n//                               for the math savvy) of the values generated\n//                               by the N generators.\n//\n// For more details, see comments at the definitions of these functions below\n// in this file.\n//\n// The following statement will instantiate tests from the FooTest test case\n// each with parameter values \"meeny\", \"miny\", and \"moe\".\n\nINSTANTIATE_TEST_CASE_P(InstantiationName,\n                        FooTest,\n                        Values(\"meeny\", \"miny\", \"moe\"));\n\n// To distinguish different instances of the pattern, (yes, you\n// can instantiate it more then once) the first argument to the\n// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the\n// actual test case name. Remember to pick unique prefixes for different\n// instantiations. The tests from the instantiation above will have\n// these names:\n//\n//    * InstantiationName/FooTest.DoesBlah/0 for \"meeny\"\n//    * InstantiationName/FooTest.DoesBlah/1 for \"miny\"\n//    * InstantiationName/FooTest.DoesBlah/2 for \"moe\"\n//    * InstantiationName/FooTest.HasBlahBlah/0 for \"meeny\"\n//    * InstantiationName/FooTest.HasBlahBlah/1 for \"miny\"\n//    * InstantiationName/FooTest.HasBlahBlah/2 for \"moe\"\n//\n// You can use these names in --gtest_filter.\n//\n// This statement will instantiate all tests from FooTest again, each\n// with parameter values \"cat\" and \"dog\":\n\nconst char* pets[] = {\"cat\", \"dog\"};\nINSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));\n\n// The tests from the instantiation above will have these names:\n//\n//    * AnotherInstantiationName/FooTest.DoesBlah/0 for \"cat\"\n//    * AnotherInstantiationName/FooTest.DoesBlah/1 for \"dog\"\n//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for \"cat\"\n//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for \"dog\"\n//\n// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests\n// in the given test case, whether their definitions come before or\n// AFTER the INSTANTIATE_TEST_CASE_P statement.\n//\n// Please also note that generator expressions (including parameters to the\n// generators) are evaluated in InitGoogleTest(), after main() has started.\n// This allows the user on one hand, to adjust generator parameters in order\n// to dynamically determine a set of tests to run and on the other hand,\n// give the user a chance to inspect the generated tests with Google Test\n// reflection API before RUN_ALL_TESTS() is executed.\n//\n// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc\n// for more examples.\n//\n// In the future, we plan to publish the API for defining new parameter\n// generators. But for now this interface remains part of the internal\n// implementation and is subject to change.\n//\n//\n// A parameterized test fixture must be derived from testing::Test and from\n// testing::WithParamInterface<T>, where T is the type of the parameter\n// values. Inheriting from TestWithParam<T> satisfies that requirement because\n// TestWithParam<T> inherits from both Test and WithParamInterface. In more\n// complicated hierarchies, however, it is occasionally useful to inherit\n// separately from Test and WithParamInterface. For example:\n\nclass BaseTest : public ::testing::Test {\n  // You can inherit all the usual members for a non-parameterized test\n  // fixture here.\n};\n\nclass DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {\n  // The usual test fixture members go here too.\n};\n\nTEST_F(BaseTest, HasFoo) {\n  // This is an ordinary non-parameterized test.\n}\n\nTEST_P(DerivedTest, DoesBlah) {\n  // GetParam works just the same here as if you inherit from TestWithParam.\n  EXPECT_TRUE(foo.Blah(GetParam()));\n}\n\n#endif  // 0\n\n#include \"gtest/internal/gtest-port.h\"\n\n#if !GTEST_OS_SYMBIAN\n# include <utility>\n#endif\n\n#include \"gtest/internal/gtest-internal.h\"\n#include \"gtest/internal/gtest-param-util.h\"\n#include \"gtest/internal/gtest-param-util-generated.h\"\n\nnamespace testing {\n\n// Functions producing parameter generators.\n//\n// Google Test uses these generators to produce parameters for value-\n// parameterized tests. When a parameterized test case is instantiated\n// with a particular generator, Google Test creates and runs tests\n// for each element in the sequence produced by the generator.\n//\n// In the following sample, tests from test case FooTest are instantiated\n// each three times with parameter values 3, 5, and 8:\n//\n// class FooTest : public TestWithParam<int> { ... };\n//\n// TEST_P(FooTest, TestThis) {\n// }\n// TEST_P(FooTest, TestThat) {\n// }\n// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));\n//\n\n// Range() returns generators providing sequences of values in a range.\n//\n// Synopsis:\n// Range(start, end)\n//   - returns a generator producing a sequence of values {start, start+1,\n//     start+2, ..., }.\n// Range(start, end, step)\n//   - returns a generator producing a sequence of values {start, start+step,\n//     start+step+step, ..., }.\n// Notes:\n//   * The generated sequences never include end. For example, Range(1, 5)\n//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)\n//     returns a generator producing {1, 3, 5, 7}.\n//   * start and end must have the same type. That type may be any integral or\n//     floating-point type or a user defined type satisfying these conditions:\n//     * It must be assignable (have operator=() defined).\n//     * It must have operator+() (operator+(int-compatible type) for\n//       two-operand version).\n//     * It must have operator<() defined.\n//     Elements in the resulting sequences will also have that type.\n//   * Condition start < end must be satisfied in order for resulting sequences\n//     to contain any elements.\n//\ntemplate <typename T, typename IncrementT>\ninternal::ParamGenerator<T> Range(T start, T end, IncrementT step) {\n  return internal::ParamGenerator<T>(\n      new internal::RangeGenerator<T, IncrementT>(start, end, step));\n}\n\ntemplate <typename T>\ninternal::ParamGenerator<T> Range(T start, T end) {\n  return Range(start, end, 1);\n}\n\n// ValuesIn() function allows generation of tests with parameters coming from\n// a container.\n//\n// Synopsis:\n// ValuesIn(const T (&array)[N])\n//   - returns a generator producing sequences with elements from\n//     a C-style array.\n// ValuesIn(const Container& container)\n//   - returns a generator producing sequences with elements from\n//     an STL-style container.\n// ValuesIn(Iterator begin, Iterator end)\n//   - returns a generator producing sequences with elements from\n//     a range [begin, end) defined by a pair of STL-style iterators. These\n//     iterators can also be plain C pointers.\n//\n// Please note that ValuesIn copies the values from the containers\n// passed in and keeps them to generate tests in RUN_ALL_TESTS().\n//\n// Examples:\n//\n// This instantiates tests from test case StringTest\n// each with C-string values of \"foo\", \"bar\", and \"baz\":\n//\n// const char* strings[] = {\"foo\", \"bar\", \"baz\"};\n// INSTANTIATE_TEST_CASE_P(StringSequence, StringTest, ValuesIn(strings));\n//\n// This instantiates tests from test case StlStringTest\n// each with STL strings with values \"a\" and \"b\":\n//\n// ::std::vector< ::std::string> GetParameterStrings() {\n//   ::std::vector< ::std::string> v;\n//   v.push_back(\"a\");\n//   v.push_back(\"b\");\n//   return v;\n// }\n//\n// INSTANTIATE_TEST_CASE_P(CharSequence,\n//                         StlStringTest,\n//                         ValuesIn(GetParameterStrings()));\n//\n//\n// This will also instantiate tests from CharTest\n// each with parameter values 'a' and 'b':\n//\n// ::std::list<char> GetParameterChars() {\n//   ::std::list<char> list;\n//   list.push_back('a');\n//   list.push_back('b');\n//   return list;\n// }\n// ::std::list<char> l = GetParameterChars();\n// INSTANTIATE_TEST_CASE_P(CharSequence2,\n//                         CharTest,\n//                         ValuesIn(l.begin(), l.end()));\n//\ntemplate <typename ForwardIterator>\ninternal::ParamGenerator<\n  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>\nValuesIn(ForwardIterator begin, ForwardIterator end) {\n  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>\n      ::value_type ParamType;\n  return internal::ParamGenerator<ParamType>(\n      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));\n}\n\ntemplate <typename T, size_t N>\ninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {\n  return ValuesIn(array, array + N);\n}\n\ntemplate <class Container>\ninternal::ParamGenerator<typename Container::value_type> ValuesIn(\n    const Container& container) {\n  return ValuesIn(container.begin(), container.end());\n}\n\n// Values() allows generating tests from explicitly specified list of\n// parameters.\n//\n// Synopsis:\n// Values(T v1, T v2, ..., T vN)\n//   - returns a generator producing sequences with elements v1, v2, ..., vN.\n//\n// For example, this instantiates tests from test case BarTest each\n// with values \"one\", \"two\", and \"three\":\n//\n// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values(\"one\", \"two\", \"three\"));\n//\n// This instantiates tests from test case BazTest each with values 1, 2, 3.5.\n// The exact type of values will depend on the type of parameter in BazTest.\n//\n// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));\n//\n// Currently, Values() supports from 1 to $n parameters.\n//\n$range i 1..n\n$for i [[\n$range j 1..i\n\ntemplate <$for j, [[typename T$j]]>\ninternal::ValueArray$i<$for j, [[T$j]]> Values($for j, [[T$j v$j]]) {\n  return internal::ValueArray$i<$for j, [[T$j]]>($for j, [[v$j]]);\n}\n\n]]\n\n// Bool() allows generating tests with parameters in a set of (false, true).\n//\n// Synopsis:\n// Bool()\n//   - returns a generator producing sequences with elements {false, true}.\n//\n// It is useful when testing code that depends on Boolean flags. Combinations\n// of multiple flags can be tested when several Bool()'s are combined using\n// Combine() function.\n//\n// In the following example all tests in the test case FlagDependentTest\n// will be instantiated twice with parameters false and true.\n//\n// class FlagDependentTest : public testing::TestWithParam<bool> {\n//   virtual void SetUp() {\n//     external_flag = GetParam();\n//   }\n// }\n// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());\n//\ninline internal::ParamGenerator<bool> Bool() {\n  return Values(false, true);\n}\n\n# if GTEST_HAS_COMBINE\n// Combine() allows the user to combine two or more sequences to produce\n// values of a Cartesian product of those sequences' elements.\n//\n// Synopsis:\n// Combine(gen1, gen2, ..., genN)\n//   - returns a generator producing sequences with elements coming from\n//     the Cartesian product of elements from the sequences generated by\n//     gen1, gen2, ..., genN. The sequence elements will have a type of\n//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types\n//     of elements from sequences produces by gen1, gen2, ..., genN.\n//\n// Combine can have up to $maxtuple arguments. This number is currently limited\n// by the maximum number of elements in the tuple implementation used by Google\n// Test.\n//\n// Example:\n//\n// This will instantiate tests in test case AnimalTest each one with\n// the parameter values tuple(\"cat\", BLACK), tuple(\"cat\", WHITE),\n// tuple(\"dog\", BLACK), and tuple(\"dog\", WHITE):\n//\n// enum Color { BLACK, GRAY, WHITE };\n// class AnimalTest\n//     : public testing::TestWithParam<tuple<const char*, Color> > {...};\n//\n// TEST_P(AnimalTest, AnimalLooksNice) {...}\n//\n// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,\n//                         Combine(Values(\"cat\", \"dog\"),\n//                                 Values(BLACK, WHITE)));\n//\n// This will instantiate tests in FlagDependentTest with all variations of two\n// Boolean flags:\n//\n// class FlagDependentTest\n//     : public testing::TestWithParam<tuple<bool, bool> > {\n//   virtual void SetUp() {\n//     // Assigns external_flag_1 and external_flag_2 values from the tuple.\n//     tie(external_flag_1, external_flag_2) = GetParam();\n//   }\n// };\n//\n// TEST_P(FlagDependentTest, TestFeature1) {\n//   // Test your code using external_flag_1 and external_flag_2 here.\n// }\n// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,\n//                         Combine(Bool(), Bool()));\n//\n$range i 2..maxtuple\n$for i [[\n$range j 1..i\n\ntemplate <$for j, [[typename Generator$j]]>\ninternal::CartesianProductHolder$i<$for j, [[Generator$j]]> Combine(\n    $for j, [[const Generator$j& g$j]]) {\n  return internal::CartesianProductHolder$i<$for j, [[Generator$j]]>(\n      $for j, [[g$j]]);\n}\n\n]]\n# endif  // GTEST_HAS_COMBINE\n\n# define TEST_P(test_case_name, test_name) \\\n  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \\\n      : public test_case_name { \\\n   public: \\\n    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \\\n    virtual void TestBody(); \\\n   private: \\\n    static int AddToRegistry() { \\\n      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \\\n          GetTestCasePatternHolder<test_case_name>(\\\n              #test_case_name, \\\n              ::testing::internal::CodeLocation(\\\n                  __FILE__, __LINE__))->AddTestPattern(\\\n                      GTEST_STRINGIFY_(test_case_name), \\\n                      GTEST_STRINGIFY_(test_name), \\\n                      new ::testing::internal::TestMetaFactory< \\\n                          GTEST_TEST_CLASS_NAME_(\\\n                              test_case_name, test_name)>()); \\\n      return 0; \\\n    } \\\n    static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \\\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(\\\n        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \\\n  }; \\\n  int GTEST_TEST_CLASS_NAME_(test_case_name, \\\n                             test_name)::gtest_registering_dummy_ = \\\n      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \\\n  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()\n\n// The optional last argument to INSTANTIATE_TEST_CASE_P allows the user\n// to specify a function or functor that generates custom test name suffixes\n// based on the test parameters. The function should accept one argument of\n// type testing::TestParamInfo<class ParamType>, and return std::string.\n//\n// testing::PrintToStringParamName is a builtin test suffix generator that\n// returns the value of testing::PrintToString(GetParam()).\n//\n// Note: test names must be non-empty, unique, and may only contain ASCII\n// alphanumeric characters or underscore. Because PrintToString adds quotes\n// to std::string and C strings, it won't work for these types.\n\n# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator, ...) \\\n  static ::testing::internal::ParamGenerator<test_case_name::ParamType> \\\n      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \\\n  static ::std::string gtest_##prefix##test_case_name##_EvalGenerateName_( \\\n      const ::testing::TestParamInfo<test_case_name::ParamType>& info) { \\\n    return ::testing::internal::GetParamNameGen<test_case_name::ParamType> \\\n        (__VA_ARGS__)(info); \\\n  } \\\n  static int gtest_##prefix##test_case_name##_dummy_ GTEST_ATTRIBUTE_UNUSED_ = \\\n      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \\\n          GetTestCasePatternHolder<test_case_name>(\\\n              #test_case_name, \\\n              ::testing::internal::CodeLocation(\\\n                  __FILE__, __LINE__))->AddTestCaseInstantiation(\\\n                      #prefix, \\\n                      &gtest_##prefix##test_case_name##_EvalGenerator_, \\\n                      &gtest_##prefix##test_case_name##_EvalGenerateName_, \\\n                      __FILE__, __LINE__)\n\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/gtest-printers.h",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Test - The Google C++ Testing and Mocking Framework\n//\n// This file implements a universal value printer that can print a\n// value of any type T:\n//\n//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);\n//\n// A user can teach this function how to print a class type T by\n// defining either operator<<() or PrintTo() in the namespace that\n// defines T.  More specifically, the FIRST defined function in the\n// following list will be used (assuming T is defined in namespace\n// foo):\n//\n//   1. foo::PrintTo(const T&, ostream*)\n//   2. operator<<(ostream&, const T&) defined in either foo or the\n//      global namespace.\n//\n// However if T is an STL-style container then it is printed element-wise\n// unless foo::PrintTo(const T&, ostream*) is defined. Note that\n// operator<<() is ignored for container types.\n//\n// If none of the above is defined, it will print the debug string of\n// the value if it is a protocol buffer, or print the raw bytes in the\n// value otherwise.\n//\n// To aid debugging: when T is a reference type, the address of the\n// value is also printed; when T is a (const) char pointer, both the\n// pointer value and the NUL-terminated string it points to are\n// printed.\n//\n// We also provide some convenient wrappers:\n//\n//   // Prints a value to a string.  For a (const or not) char\n//   // pointer, the NUL-terminated string (but not the pointer) is\n//   // printed.\n//   std::string ::testing::PrintToString(const T& value);\n//\n//   // Prints a value tersely: for a reference type, the referenced\n//   // value (but not the address) is printed; for a (const or not) char\n//   // pointer, the NUL-terminated string (but not the pointer) is\n//   // printed.\n//   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);\n//\n//   // Prints value using the type inferred by the compiler.  The difference\n//   // from UniversalTersePrint() is that this function prints both the\n//   // pointer and the NUL-terminated string for a (const or not) char pointer.\n//   void ::testing::internal::UniversalPrint(const T& value, ostream*);\n//\n//   // Prints the fields of a tuple tersely to a string vector, one\n//   // element for each field. Tuple support must be enabled in\n//   // gtest-port.h.\n//   std::vector<string> UniversalTersePrintTupleFieldsToStrings(\n//       const Tuple& value);\n//\n// Known limitation:\n//\n// The print primitives print the elements of an STL-style container\n// using the compiler-inferred type of *iter where iter is a\n// const_iterator of the container.  When const_iterator is an input\n// iterator but not a forward iterator, this inferred type may not\n// match value_type, and the print output may be incorrect.  In\n// practice, this is rarely a problem as for most containers\n// const_iterator is a forward iterator.  We'll fix this if there's an\n// actual need for it.  Note that this fix cannot rely on value_type\n// being defined as many user-defined container types don't have\n// value_type.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_\n#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_\n\n#include <ostream>  // NOLINT\n#include <sstream>\n#include <string>\n#include <utility>\n#include <vector>\n#include \"gtest/internal/gtest-port.h\"\n#include \"gtest/internal/gtest-internal.h\"\n\n#if GTEST_HAS_STD_TUPLE_\n# include <tuple>\n#endif\n\n#if GTEST_HAS_ABSL\n#include \"absl/strings/string_view.h\"\n#include \"absl/types/optional.h\"\n#include \"absl/types/variant.h\"\n#endif  // GTEST_HAS_ABSL\n\nnamespace testing {\n\n// Definitions in the 'internal' and 'internal2' name spaces are\n// subject to change without notice.  DO NOT USE THEM IN USER CODE!\nnamespace internal2 {\n\n// Prints the given number of bytes in the given object to the given\n// ostream.\nGTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,\n                                     size_t count,\n                                     ::std::ostream* os);\n\n// For selecting which printer to use when a given type has neither <<\n// nor PrintTo().\nenum TypeKind {\n  kProtobuf,              // a protobuf type\n  kConvertibleToInteger,  // a type implicitly convertible to BiggestInt\n                          // (e.g. a named or unnamed enum type)\n#if GTEST_HAS_ABSL\n  kConvertibleToStringView,  // a type implicitly convertible to\n                             // absl::string_view\n#endif\n  kOtherType  // anything else\n};\n\n// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called\n// by the universal printer to print a value of type T when neither\n// operator<< nor PrintTo() is defined for T, where kTypeKind is the\n// \"kind\" of T as defined by enum TypeKind.\ntemplate <typename T, TypeKind kTypeKind>\nclass TypeWithoutFormatter {\n public:\n  // This default version is called when kTypeKind is kOtherType.\n  static void PrintValue(const T& value, ::std::ostream* os) {\n    PrintBytesInObjectTo(static_cast<const unsigned char*>(\n                             reinterpret_cast<const void*>(&value)),\n                         sizeof(value), os);\n  }\n};\n\n// We print a protobuf using its ShortDebugString() when the string\n// doesn't exceed this many characters; otherwise we print it using\n// DebugString() for better readability.\nconst size_t kProtobufOneLinerMaxLength = 50;\n\ntemplate <typename T>\nclass TypeWithoutFormatter<T, kProtobuf> {\n public:\n  static void PrintValue(const T& value, ::std::ostream* os) {\n    std::string pretty_str = value.ShortDebugString();\n    if (pretty_str.length() > kProtobufOneLinerMaxLength) {\n      pretty_str = \"\\n\" + value.DebugString();\n    }\n    *os << (\"<\" + pretty_str + \">\");\n  }\n};\n\ntemplate <typename T>\nclass TypeWithoutFormatter<T, kConvertibleToInteger> {\n public:\n  // Since T has no << operator or PrintTo() but can be implicitly\n  // converted to BiggestInt, we print it as a BiggestInt.\n  //\n  // Most likely T is an enum type (either named or unnamed), in which\n  // case printing it as an integer is the desired behavior.  In case\n  // T is not an enum, printing it as an integer is the best we can do\n  // given that it has no user-defined printer.\n  static void PrintValue(const T& value, ::std::ostream* os) {\n    const internal::BiggestInt kBigInt = value;\n    *os << kBigInt;\n  }\n};\n\n#if GTEST_HAS_ABSL\ntemplate <typename T>\nclass TypeWithoutFormatter<T, kConvertibleToStringView> {\n public:\n  // Since T has neither operator<< nor PrintTo() but can be implicitly\n  // converted to absl::string_view, we print it as a absl::string_view.\n  //\n  // Note: the implementation is further below, as it depends on\n  // internal::PrintTo symbol which is defined later in the file.\n  static void PrintValue(const T& value, ::std::ostream* os);\n};\n#endif\n\n// Prints the given value to the given ostream.  If the value is a\n// protocol message, its debug string is printed; if it's an enum or\n// of a type implicitly convertible to BiggestInt, it's printed as an\n// integer; otherwise the bytes in the value are printed.  This is\n// what UniversalPrinter<T>::Print() does when it knows nothing about\n// type T and T has neither << operator nor PrintTo().\n//\n// A user can override this behavior for a class type Foo by defining\n// a << operator in the namespace where Foo is defined.\n//\n// We put this operator in namespace 'internal2' instead of 'internal'\n// to simplify the implementation, as much code in 'internal' needs to\n// use << in STL, which would conflict with our own << were it defined\n// in 'internal'.\n//\n// Note that this operator<< takes a generic std::basic_ostream<Char,\n// CharTraits> type instead of the more restricted std::ostream.  If\n// we define it to take an std::ostream instead, we'll get an\n// \"ambiguous overloads\" compiler error when trying to print a type\n// Foo that supports streaming to std::basic_ostream<Char,\n// CharTraits>, as the compiler cannot tell whether\n// operator<<(std::ostream&, const T&) or\n// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more\n// specific.\ntemplate <typename Char, typename CharTraits, typename T>\n::std::basic_ostream<Char, CharTraits>& operator<<(\n    ::std::basic_ostream<Char, CharTraits>& os, const T& x) {\n  TypeWithoutFormatter<T, (internal::IsAProtocolMessage<T>::value\n                               ? kProtobuf\n                               : internal::ImplicitlyConvertible<\n                                     const T&, internal::BiggestInt>::value\n                                     ? kConvertibleToInteger\n                                     :\n#if GTEST_HAS_ABSL\n                                     internal::ImplicitlyConvertible<\n                                         const T&, absl::string_view>::value\n                                         ? kConvertibleToStringView\n                                         :\n#endif\n                                         kOtherType)>::PrintValue(x, &os);\n  return os;\n}\n\n}  // namespace internal2\n}  // namespace testing\n\n// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up\n// magic needed for implementing UniversalPrinter won't work.\nnamespace testing_internal {\n\n// Used to print a value that is not an STL-style container when the\n// user doesn't define PrintTo() for it.\ntemplate <typename T>\nvoid DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {\n  // With the following statement, during unqualified name lookup,\n  // testing::internal2::operator<< appears as if it was declared in\n  // the nearest enclosing namespace that contains both\n  // ::testing_internal and ::testing::internal2, i.e. the global\n  // namespace.  For more details, refer to the C++ Standard section\n  // 7.3.4-1 [namespace.udir].  This allows us to fall back onto\n  // testing::internal2::operator<< in case T doesn't come with a <<\n  // operator.\n  //\n  // We cannot write 'using ::testing::internal2::operator<<;', which\n  // gcc 3.3 fails to compile due to a compiler bug.\n  using namespace ::testing::internal2;  // NOLINT\n\n  // Assuming T is defined in namespace foo, in the next statement,\n  // the compiler will consider all of:\n  //\n  //   1. foo::operator<< (thanks to Koenig look-up),\n  //   2. ::operator<< (as the current namespace is enclosed in ::),\n  //   3. testing::internal2::operator<< (thanks to the using statement above).\n  //\n  // The operator<< whose type matches T best will be picked.\n  //\n  // We deliberately allow #2 to be a candidate, as sometimes it's\n  // impossible to define #1 (e.g. when foo is ::std, defining\n  // anything in it is undefined behavior unless you are a compiler\n  // vendor.).\n  *os << value;\n}\n\n}  // namespace testing_internal\n\nnamespace testing {\nnamespace internal {\n\n// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a\n// value of type ToPrint that is an operand of a comparison assertion\n// (e.g. ASSERT_EQ).  OtherOperand is the type of the other operand in\n// the comparison, and is used to help determine the best way to\n// format the value.  In particular, when the value is a C string\n// (char pointer) and the other operand is an STL string object, we\n// want to format the C string as a string, since we know it is\n// compared by value with the string object.  If the value is a char\n// pointer but the other operand is not an STL string object, we don't\n// know whether the pointer is supposed to point to a NUL-terminated\n// string, and thus want to print it as a pointer to be safe.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n\n// The default case.\ntemplate <typename ToPrint, typename OtherOperand>\nclass FormatForComparison {\n public:\n  static ::std::string Format(const ToPrint& value) {\n    return ::testing::PrintToString(value);\n  }\n};\n\n// Array.\ntemplate <typename ToPrint, size_t N, typename OtherOperand>\nclass FormatForComparison<ToPrint[N], OtherOperand> {\n public:\n  static ::std::string Format(const ToPrint* value) {\n    return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);\n  }\n};\n\n// By default, print C string as pointers to be safe, as we don't know\n// whether they actually point to a NUL-terminated string.\n\n#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType)                \\\n  template <typename OtherOperand>                                      \\\n  class FormatForComparison<CharType*, OtherOperand> {                  \\\n   public:                                                              \\\n    static ::std::string Format(CharType* value) {                      \\\n      return ::testing::PrintToString(static_cast<const void*>(value)); \\\n    }                                                                   \\\n  }\n\nGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);\nGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);\nGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);\nGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);\n\n#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_\n\n// If a C string is compared with an STL string object, we know it's meant\n// to point to a NUL-terminated string, and thus can print it as a string.\n\n#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \\\n  template <>                                                           \\\n  class FormatForComparison<CharType*, OtherStringType> {               \\\n   public:                                                              \\\n    static ::std::string Format(CharType* value) {                      \\\n      return ::testing::PrintToString(value);                           \\\n    }                                                                   \\\n  }\n\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);\n\n#if GTEST_HAS_GLOBAL_STRING\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);\n#endif\n\n#if GTEST_HAS_GLOBAL_WSTRING\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);\n#endif\n\n#if GTEST_HAS_STD_WSTRING\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);\nGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);\n#endif\n\n#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_\n\n// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)\n// operand to be used in a failure message.  The type (but not value)\n// of the other operand may affect the format.  This allows us to\n// print a char* as a raw pointer when it is compared against another\n// char* or void*, and print it as a C string when it is compared\n// against an std::string object, for example.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\ntemplate <typename T1, typename T2>\nstd::string FormatForComparisonFailureMessage(\n    const T1& value, const T2& /* other_operand */) {\n  return FormatForComparison<T1, T2>::Format(value);\n}\n\n// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given\n// value to the given ostream.  The caller must ensure that\n// 'ostream_ptr' is not NULL, or the behavior is undefined.\n//\n// We define UniversalPrinter as a class template (as opposed to a\n// function template), as we need to partially specialize it for\n// reference types, which cannot be done with function templates.\ntemplate <typename T>\nclass UniversalPrinter;\n\ntemplate <typename T>\nvoid UniversalPrint(const T& value, ::std::ostream* os);\n\nenum DefaultPrinterType {\n  kPrintContainer,\n  kPrintPointer,\n  kPrintFunctionPointer,\n  kPrintOther,\n};\ntemplate <DefaultPrinterType type> struct WrapPrinterType {};\n\n// Used to print an STL-style container when the user doesn't define\n// a PrintTo() for it.\ntemplate <typename C>\nvoid DefaultPrintTo(WrapPrinterType<kPrintContainer> /* dummy */,\n                    const C& container, ::std::ostream* os) {\n  const size_t kMaxCount = 32;  // The maximum number of elements to print.\n  *os << '{';\n  size_t count = 0;\n  for (typename C::const_iterator it = container.begin();\n       it != container.end(); ++it, ++count) {\n    if (count > 0) {\n      *os << ',';\n      if (count == kMaxCount) {  // Enough has been printed.\n        *os << \" ...\";\n        break;\n      }\n    }\n    *os << ' ';\n    // We cannot call PrintTo(*it, os) here as PrintTo() doesn't\n    // handle *it being a native array.\n    internal::UniversalPrint(*it, os);\n  }\n\n  if (count > 0) {\n    *os << ' ';\n  }\n  *os << '}';\n}\n\n// Used to print a pointer that is neither a char pointer nor a member\n// pointer, when the user doesn't define PrintTo() for it.  (A member\n// variable pointer or member function pointer doesn't really point to\n// a location in the address space.  Their representation is\n// implementation-defined.  Therefore they will be printed as raw\n// bytes.)\ntemplate <typename T>\nvoid DefaultPrintTo(WrapPrinterType<kPrintPointer> /* dummy */,\n                    T* p, ::std::ostream* os) {\n  if (p == NULL) {\n    *os << \"NULL\";\n  } else {\n    // T is not a function type.  We just call << to print p,\n    // relying on ADL to pick up user-defined << for their pointer\n    // types, if any.\n    *os << p;\n  }\n}\ntemplate <typename T>\nvoid DefaultPrintTo(WrapPrinterType<kPrintFunctionPointer> /* dummy */,\n                    T* p, ::std::ostream* os) {\n  if (p == NULL) {\n    *os << \"NULL\";\n  } else {\n    // T is a function type, so '*os << p' doesn't do what we want\n    // (it just prints p as bool).  We want to print p as a const\n    // void*.\n    *os << reinterpret_cast<const void*>(p);\n  }\n}\n\n// Used to print a non-container, non-pointer value when the user\n// doesn't define PrintTo() for it.\ntemplate <typename T>\nvoid DefaultPrintTo(WrapPrinterType<kPrintOther> /* dummy */,\n                    const T& value, ::std::ostream* os) {\n  ::testing_internal::DefaultPrintNonContainerTo(value, os);\n}\n\n// Prints the given value using the << operator if it has one;\n// otherwise prints the bytes in it.  This is what\n// UniversalPrinter<T>::Print() does when PrintTo() is not specialized\n// or overloaded for type T.\n//\n// A user can override this behavior for a class type Foo by defining\n// an overload of PrintTo() in the namespace where Foo is defined.  We\n// give the user this option as sometimes defining a << operator for\n// Foo is not desirable (e.g. the coding style may prevent doing it,\n// or there is already a << operator but it doesn't do what the user\n// wants).\ntemplate <typename T>\nvoid PrintTo(const T& value, ::std::ostream* os) {\n  // DefaultPrintTo() is overloaded.  The type of its first argument\n  // determines which version will be picked.\n  //\n  // Note that we check for container types here, prior to we check\n  // for protocol message types in our operator<<.  The rationale is:\n  //\n  // For protocol messages, we want to give people a chance to\n  // override Google Mock's format by defining a PrintTo() or\n  // operator<<.  For STL containers, other formats can be\n  // incompatible with Google Mock's format for the container\n  // elements; therefore we check for container types here to ensure\n  // that our format is used.\n  //\n  // Note that MSVC and clang-cl do allow an implicit conversion from\n  // pointer-to-function to pointer-to-object, but clang-cl warns on it.\n  // So don't use ImplicitlyConvertible if it can be helped since it will\n  // cause this warning, and use a separate overload of DefaultPrintTo for\n  // function pointers so that the `*os << p` in the object pointer overload\n  // doesn't cause that warning either.\n  DefaultPrintTo(\n      WrapPrinterType <\n                  (sizeof(IsContainerTest<T>(0)) == sizeof(IsContainer)) &&\n              !IsRecursiveContainer<T>::value\n          ? kPrintContainer\n          : !is_pointer<T>::value\n                ? kPrintOther\n#if GTEST_LANG_CXX11\n                : std::is_function<typename std::remove_pointer<T>::type>::value\n#else\n                : !internal::ImplicitlyConvertible<T, const void*>::value\n#endif\n                      ? kPrintFunctionPointer\n                      : kPrintPointer > (),\n      value, os);\n}\n\n// The following list of PrintTo() overloads tells\n// UniversalPrinter<T>::Print() how to print standard types (built-in\n// types, strings, plain arrays, and pointers).\n\n// Overloads for various char types.\nGTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);\nGTEST_API_ void PrintTo(signed char c, ::std::ostream* os);\ninline void PrintTo(char c, ::std::ostream* os) {\n  // When printing a plain char, we always treat it as unsigned.  This\n  // way, the output won't be affected by whether the compiler thinks\n  // char is signed or not.\n  PrintTo(static_cast<unsigned char>(c), os);\n}\n\n// Overloads for other simple built-in types.\ninline void PrintTo(bool x, ::std::ostream* os) {\n  *os << (x ? \"true\" : \"false\");\n}\n\n// Overload for wchar_t type.\n// Prints a wchar_t as a symbol if it is printable or as its internal\n// code otherwise and also as its decimal code (except for L'\\0').\n// The L'\\0' char is printed as \"L'\\\\0'\". The decimal code is printed\n// as signed integer when wchar_t is implemented by the compiler\n// as a signed type and is printed as an unsigned integer when wchar_t\n// is implemented as an unsigned type.\nGTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);\n\n// Overloads for C strings.\nGTEST_API_ void PrintTo(const char* s, ::std::ostream* os);\ninline void PrintTo(char* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const char*>(s), os);\n}\n\n// signed/unsigned char is often used for representing binary data, so\n// we print pointers to it as void* to be safe.\ninline void PrintTo(const signed char* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const void*>(s), os);\n}\ninline void PrintTo(signed char* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const void*>(s), os);\n}\ninline void PrintTo(const unsigned char* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const void*>(s), os);\n}\ninline void PrintTo(unsigned char* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const void*>(s), os);\n}\n\n// MSVC can be configured to define wchar_t as a typedef of unsigned\n// short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native\n// type.  When wchar_t is a typedef, defining an overload for const\n// wchar_t* would cause unsigned short* be printed as a wide string,\n// possibly causing invalid memory accesses.\n#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)\n// Overloads for wide C strings\nGTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);\ninline void PrintTo(wchar_t* s, ::std::ostream* os) {\n  PrintTo(ImplicitCast_<const wchar_t*>(s), os);\n}\n#endif\n\n// Overload for C arrays.  Multi-dimensional arrays are printed\n// properly.\n\n// Prints the given number of elements in an array, without printing\n// the curly braces.\ntemplate <typename T>\nvoid PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {\n  UniversalPrint(a[0], os);\n  for (size_t i = 1; i != count; i++) {\n    *os << \", \";\n    UniversalPrint(a[i], os);\n  }\n}\n\n// Overloads for ::string and ::std::string.\n#if GTEST_HAS_GLOBAL_STRING\nGTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);\ninline void PrintTo(const ::string& s, ::std::ostream* os) {\n  PrintStringTo(s, os);\n}\n#endif  // GTEST_HAS_GLOBAL_STRING\n\nGTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);\ninline void PrintTo(const ::std::string& s, ::std::ostream* os) {\n  PrintStringTo(s, os);\n}\n\n// Overloads for ::wstring and ::std::wstring.\n#if GTEST_HAS_GLOBAL_WSTRING\nGTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);\ninline void PrintTo(const ::wstring& s, ::std::ostream* os) {\n  PrintWideStringTo(s, os);\n}\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n#if GTEST_HAS_STD_WSTRING\nGTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);\ninline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {\n  PrintWideStringTo(s, os);\n}\n#endif  // GTEST_HAS_STD_WSTRING\n\n#if GTEST_HAS_ABSL\n// Overload for absl::string_view.\ninline void PrintTo(absl::string_view sp, ::std::ostream* os) {\n  PrintTo(::std::string(sp), os);\n}\n#endif  // GTEST_HAS_ABSL\n\n#if GTEST_LANG_CXX11\ninline void PrintTo(std::nullptr_t, ::std::ostream* os) { *os << \"(nullptr)\"; }\n#endif  // GTEST_LANG_CXX11\n\n#if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_\n// Helper function for printing a tuple.  T must be instantiated with\n// a tuple type.\ntemplate <typename T>\nvoid PrintTupleTo(const T& t, ::std::ostream* os);\n#endif  // GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_\n\n#if GTEST_HAS_TR1_TUPLE\n// Overload for ::std::tr1::tuple.  Needed for printing function arguments,\n// which are packed as tuples.\n\n// Overloaded PrintTo() for tuples of various arities.  We support\n// tuples of up-to 10 fields.  The following implementation works\n// regardless of whether tr1::tuple is implemented using the\n// non-standard variadic template feature or not.\n\ninline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1>\nvoid PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2>\nvoid PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2, typename T3>\nvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\nvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,\n             ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n          typename T6>\nvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,\n             ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n          typename T6, typename T7>\nvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,\n             ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n          typename T6, typename T7, typename T8>\nvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,\n             ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n          typename T6, typename T7, typename T8, typename T9>\nvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,\n             ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n          typename T6, typename T7, typename T8, typename T9, typename T10>\nvoid PrintTo(\n    const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,\n    ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n#endif  // GTEST_HAS_TR1_TUPLE\n\n#if GTEST_HAS_STD_TUPLE_\ntemplate <typename... Types>\nvoid PrintTo(const ::std::tuple<Types...>& t, ::std::ostream* os) {\n  PrintTupleTo(t, os);\n}\n#endif  // GTEST_HAS_STD_TUPLE_\n\n// Overload for std::pair.\ntemplate <typename T1, typename T2>\nvoid PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {\n  *os << '(';\n  // We cannot use UniversalPrint(value.first, os) here, as T1 may be\n  // a reference type.  The same for printing value.second.\n  UniversalPrinter<T1>::Print(value.first, os);\n  *os << \", \";\n  UniversalPrinter<T2>::Print(value.second, os);\n  *os << ')';\n}\n\n// Implements printing a non-reference type T by letting the compiler\n// pick the right overload of PrintTo() for T.\ntemplate <typename T>\nclass UniversalPrinter {\n public:\n  // MSVC warns about adding const to a function type, so we want to\n  // disable the warning.\n  GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180)\n\n  // Note: we deliberately don't call this PrintTo(), as that name\n  // conflicts with ::testing::internal::PrintTo in the body of the\n  // function.\n  static void Print(const T& value, ::std::ostream* os) {\n    // By default, ::testing::internal::PrintTo() is used for printing\n    // the value.\n    //\n    // Thanks to Koenig look-up, if T is a class and has its own\n    // PrintTo() function defined in its namespace, that function will\n    // be visible here.  Since it is more specific than the generic ones\n    // in ::testing::internal, it will be picked by the compiler in the\n    // following statement - exactly what we want.\n    PrintTo(value, os);\n  }\n\n  GTEST_DISABLE_MSC_WARNINGS_POP_()\n};\n\n#if GTEST_HAS_ABSL\n\n// Printer for absl::optional\n\ntemplate <typename T>\nclass UniversalPrinter<::absl::optional<T>> {\n public:\n  static void Print(const ::absl::optional<T>& value, ::std::ostream* os) {\n    *os << '(';\n    if (!value) {\n      *os << \"nullopt\";\n    } else {\n      UniversalPrint(*value, os);\n    }\n    *os << ')';\n  }\n};\n\n// Printer for absl::variant\n\ntemplate <typename... T>\nclass UniversalPrinter<::absl::variant<T...>> {\n public:\n  static void Print(const ::absl::variant<T...>& value, ::std::ostream* os) {\n    *os << '(';\n    absl::visit(Visitor{os}, value);\n    *os << ')';\n  }\n\n private:\n  struct Visitor {\n    template <typename U>\n    void operator()(const U& u) const {\n      *os << \"'\" << GetTypeName<U>() << \"' with value \";\n      UniversalPrint(u, os);\n    }\n    ::std::ostream* os;\n  };\n};\n\n#endif  // GTEST_HAS_ABSL\n\n// UniversalPrintArray(begin, len, os) prints an array of 'len'\n// elements, starting at address 'begin'.\ntemplate <typename T>\nvoid UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {\n  if (len == 0) {\n    *os << \"{}\";\n  } else {\n    *os << \"{ \";\n    const size_t kThreshold = 18;\n    const size_t kChunkSize = 8;\n    // If the array has more than kThreshold elements, we'll have to\n    // omit some details by printing only the first and the last\n    // kChunkSize elements.\n    // FIXME: let the user control the threshold using a flag.\n    if (len <= kThreshold) {\n      PrintRawArrayTo(begin, len, os);\n    } else {\n      PrintRawArrayTo(begin, kChunkSize, os);\n      *os << \", ..., \";\n      PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);\n    }\n    *os << \" }\";\n  }\n}\n// This overload prints a (const) char array compactly.\nGTEST_API_ void UniversalPrintArray(\n    const char* begin, size_t len, ::std::ostream* os);\n\n// This overload prints a (const) wchar_t array compactly.\nGTEST_API_ void UniversalPrintArray(\n    const wchar_t* begin, size_t len, ::std::ostream* os);\n\n// Implements printing an array type T[N].\ntemplate <typename T, size_t N>\nclass UniversalPrinter<T[N]> {\n public:\n  // Prints the given array, omitting some elements when there are too\n  // many.\n  static void Print(const T (&a)[N], ::std::ostream* os) {\n    UniversalPrintArray(a, N, os);\n  }\n};\n\n// Implements printing a reference type T&.\ntemplate <typename T>\nclass UniversalPrinter<T&> {\n public:\n  // MSVC warns about adding const to a function type, so we want to\n  // disable the warning.\n  GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180)\n\n  static void Print(const T& value, ::std::ostream* os) {\n    // Prints the address of the value.  We use reinterpret_cast here\n    // as static_cast doesn't compile when T is a function type.\n    *os << \"@\" << reinterpret_cast<const void*>(&value) << \" \";\n\n    // Then prints the value itself.\n    UniversalPrint(value, os);\n  }\n\n  GTEST_DISABLE_MSC_WARNINGS_POP_()\n};\n\n// Prints a value tersely: for a reference type, the referenced value\n// (but not the address) is printed; for a (const) char pointer, the\n// NUL-terminated string (but not the pointer) is printed.\n\ntemplate <typename T>\nclass UniversalTersePrinter {\n public:\n  static void Print(const T& value, ::std::ostream* os) {\n    UniversalPrint(value, os);\n  }\n};\ntemplate <typename T>\nclass UniversalTersePrinter<T&> {\n public:\n  static void Print(const T& value, ::std::ostream* os) {\n    UniversalPrint(value, os);\n  }\n};\ntemplate <typename T, size_t N>\nclass UniversalTersePrinter<T[N]> {\n public:\n  static void Print(const T (&value)[N], ::std::ostream* os) {\n    UniversalPrinter<T[N]>::Print(value, os);\n  }\n};\ntemplate <>\nclass UniversalTersePrinter<const char*> {\n public:\n  static void Print(const char* str, ::std::ostream* os) {\n    if (str == NULL) {\n      *os << \"NULL\";\n    } else {\n      UniversalPrint(std::string(str), os);\n    }\n  }\n};\ntemplate <>\nclass UniversalTersePrinter<char*> {\n public:\n  static void Print(char* str, ::std::ostream* os) {\n    UniversalTersePrinter<const char*>::Print(str, os);\n  }\n};\n\n#if GTEST_HAS_STD_WSTRING\ntemplate <>\nclass UniversalTersePrinter<const wchar_t*> {\n public:\n  static void Print(const wchar_t* str, ::std::ostream* os) {\n    if (str == NULL) {\n      *os << \"NULL\";\n    } else {\n      UniversalPrint(::std::wstring(str), os);\n    }\n  }\n};\n#endif\n\ntemplate <>\nclass UniversalTersePrinter<wchar_t*> {\n public:\n  static void Print(wchar_t* str, ::std::ostream* os) {\n    UniversalTersePrinter<const wchar_t*>::Print(str, os);\n  }\n};\n\ntemplate <typename T>\nvoid UniversalTersePrint(const T& value, ::std::ostream* os) {\n  UniversalTersePrinter<T>::Print(value, os);\n}\n\n// Prints a value using the type inferred by the compiler.  The\n// difference between this and UniversalTersePrint() is that for a\n// (const) char pointer, this prints both the pointer and the\n// NUL-terminated string.\ntemplate <typename T>\nvoid UniversalPrint(const T& value, ::std::ostream* os) {\n  // A workarond for the bug in VC++ 7.1 that prevents us from instantiating\n  // UniversalPrinter with T directly.\n  typedef T T1;\n  UniversalPrinter<T1>::Print(value, os);\n}\n\ntypedef ::std::vector< ::std::string> Strings;\n\n// TuplePolicy<TupleT> must provide:\n// - tuple_size\n//     size of tuple TupleT.\n// - get<size_t I>(const TupleT& t)\n//     static function extracting element I of tuple TupleT.\n// - tuple_element<size_t I>::type\n//     type of element I of tuple TupleT.\ntemplate <typename TupleT>\nstruct TuplePolicy;\n\n#if GTEST_HAS_TR1_TUPLE\ntemplate <typename TupleT>\nstruct TuplePolicy {\n  typedef TupleT Tuple;\n  static const size_t tuple_size = ::std::tr1::tuple_size<Tuple>::value;\n\n  template <size_t I>\n  struct tuple_element : ::std::tr1::tuple_element<static_cast<int>(I), Tuple> {\n  };\n\n  template <size_t I>\n  static typename AddReference<const typename ::std::tr1::tuple_element<\n      static_cast<int>(I), Tuple>::type>::type\n  get(const Tuple& tuple) {\n    return ::std::tr1::get<I>(tuple);\n  }\n};\ntemplate <typename TupleT>\nconst size_t TuplePolicy<TupleT>::tuple_size;\n#endif  // GTEST_HAS_TR1_TUPLE\n\n#if GTEST_HAS_STD_TUPLE_\ntemplate <typename... Types>\nstruct TuplePolicy< ::std::tuple<Types...> > {\n  typedef ::std::tuple<Types...> Tuple;\n  static const size_t tuple_size = ::std::tuple_size<Tuple>::value;\n\n  template <size_t I>\n  struct tuple_element : ::std::tuple_element<I, Tuple> {};\n\n  template <size_t I>\n  static const typename ::std::tuple_element<I, Tuple>::type& get(\n      const Tuple& tuple) {\n    return ::std::get<I>(tuple);\n  }\n};\ntemplate <typename... Types>\nconst size_t TuplePolicy< ::std::tuple<Types...> >::tuple_size;\n#endif  // GTEST_HAS_STD_TUPLE_\n\n#if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_\n// This helper template allows PrintTo() for tuples and\n// UniversalTersePrintTupleFieldsToStrings() to be defined by\n// induction on the number of tuple fields.  The idea is that\n// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N\n// fields in tuple t, and can be defined in terms of\n// TuplePrefixPrinter<N - 1>.\n//\n// The inductive case.\ntemplate <size_t N>\nstruct TuplePrefixPrinter {\n  // Prints the first N fields of a tuple.\n  template <typename Tuple>\n  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {\n    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);\n    GTEST_INTENTIONAL_CONST_COND_PUSH_()\n    if (N > 1) {\n    GTEST_INTENTIONAL_CONST_COND_POP_()\n      *os << \", \";\n    }\n    UniversalPrinter<\n        typename TuplePolicy<Tuple>::template tuple_element<N - 1>::type>\n        ::Print(TuplePolicy<Tuple>::template get<N - 1>(t), os);\n  }\n\n  // Tersely prints the first N fields of a tuple to a string vector,\n  // one element for each field.\n  template <typename Tuple>\n  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {\n    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);\n    ::std::stringstream ss;\n    UniversalTersePrint(TuplePolicy<Tuple>::template get<N - 1>(t), &ss);\n    strings->push_back(ss.str());\n  }\n};\n\n// Base case.\ntemplate <>\nstruct TuplePrefixPrinter<0> {\n  template <typename Tuple>\n  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}\n\n  template <typename Tuple>\n  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}\n};\n\n// Helper function for printing a tuple.\n// Tuple must be either std::tr1::tuple or std::tuple type.\ntemplate <typename Tuple>\nvoid PrintTupleTo(const Tuple& t, ::std::ostream* os) {\n  *os << \"(\";\n  TuplePrefixPrinter<TuplePolicy<Tuple>::tuple_size>::PrintPrefixTo(t, os);\n  *os << \")\";\n}\n\n// Prints the fields of a tuple tersely to a string vector, one\n// element for each field.  See the comment before\n// UniversalTersePrint() for how we define \"tersely\".\ntemplate <typename Tuple>\nStrings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {\n  Strings result;\n  TuplePrefixPrinter<TuplePolicy<Tuple>::tuple_size>::\n      TersePrintPrefixToStrings(value, &result);\n  return result;\n}\n#endif  // GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_\n\n}  // namespace internal\n\n#if GTEST_HAS_ABSL\nnamespace internal2 {\ntemplate <typename T>\nvoid TypeWithoutFormatter<T, kConvertibleToStringView>::PrintValue(\n    const T& value, ::std::ostream* os) {\n  internal::PrintTo(absl::string_view(value), os);\n}\n}  // namespace internal2\n#endif\n\ntemplate <typename T>\n::std::string PrintToString(const T& value) {\n  ::std::stringstream ss;\n  internal::UniversalTersePrinter<T>::Print(value, &ss);\n  return ss.str();\n}\n\n}  // namespace testing\n\n// Include any custom printer added by the local installation.\n// We must include this header at the end to make sure it can use the\n// declarations from this file.\n#include \"gtest/internal/custom/gtest-printers.h\"\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/gtest-spi.h",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Utilities for testing Google Test itself and code that uses Google Test\n// (e.g. frameworks built on top of Google Test).\n\n// GOOGLETEST_CM0004 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_\n#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_\n\n#include \"gtest/gtest.h\"\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\nnamespace testing {\n\n// This helper class can be used to mock out Google Test failure reporting\n// so that we can test Google Test or code that builds on Google Test.\n//\n// An object of this class appends a TestPartResult object to the\n// TestPartResultArray object given in the constructor whenever a Google Test\n// failure is reported. It can either intercept only failures that are\n// generated in the same thread that created this object or it can intercept\n// all generated failures. The scope of this mock object can be controlled with\n// the second argument to the two arguments constructor.\nclass GTEST_API_ ScopedFakeTestPartResultReporter\n    : public TestPartResultReporterInterface {\n public:\n  // The two possible mocking modes of this object.\n  enum InterceptMode {\n    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.\n    INTERCEPT_ALL_THREADS           // Intercepts all failures.\n  };\n\n  // The c'tor sets this object as the test part result reporter used\n  // by Google Test.  The 'result' parameter specifies where to report the\n  // results. This reporter will only catch failures generated in the current\n  // thread. DEPRECATED\n  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);\n\n  // Same as above, but you can choose the interception scope of this object.\n  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,\n                                   TestPartResultArray* result);\n\n  // The d'tor restores the previous test part result reporter.\n  virtual ~ScopedFakeTestPartResultReporter();\n\n  // Appends the TestPartResult object to the TestPartResultArray\n  // received in the constructor.\n  //\n  // This method is from the TestPartResultReporterInterface\n  // interface.\n  virtual void ReportTestPartResult(const TestPartResult& result);\n private:\n  void Init();\n\n  const InterceptMode intercept_mode_;\n  TestPartResultReporterInterface* old_reporter_;\n  TestPartResultArray* const result_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);\n};\n\nnamespace internal {\n\n// A helper class for implementing EXPECT_FATAL_FAILURE() and\n// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given\n// TestPartResultArray contains exactly one failure that has the given\n// type and contains the given substring.  If that's not the case, a\n// non-fatal failure will be generated.\nclass GTEST_API_ SingleFailureChecker {\n public:\n  // The constructor remembers the arguments.\n  SingleFailureChecker(const TestPartResultArray* results,\n                       TestPartResult::Type type, const std::string& substr);\n  ~SingleFailureChecker();\n private:\n  const TestPartResultArray* const results_;\n  const TestPartResult::Type type_;\n  const std::string substr_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);\n};\n\n}  // namespace internal\n\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n// A set of macros for testing Google Test assertions or code that's expected\n// to generate Google Test fatal failures.  It verifies that the given\n// statement will cause exactly one fatal Google Test failure with 'substr'\n// being part of the failure message.\n//\n// There are two different versions of this macro. EXPECT_FATAL_FAILURE only\n// affects and considers failures generated in the current thread and\n// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.\n//\n// The verification of the assertion is done correctly even when the statement\n// throws an exception or aborts the current function.\n//\n// Known restrictions:\n//   - 'statement' cannot reference local non-static variables or\n//     non-static members of the current object.\n//   - 'statement' cannot return a value.\n//   - You cannot stream a failure message to this macro.\n//\n// Note that even though the implementations of the following two\n// macros are much alike, we cannot refactor them to use a common\n// helper macro, due to some peculiarity in how the preprocessor\n// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in\n// gtest_unittest.cc will fail to compile if we do that.\n#define EXPECT_FATAL_FAILURE(statement, substr) \\\n  do { \\\n    class GTestExpectFatalFailureHelper {\\\n     public:\\\n      static void Execute() { statement; }\\\n    };\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter:: \\\n          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\\\n      GTestExpectFatalFailureHelper::Execute();\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \\\n  do { \\\n    class GTestExpectFatalFailureHelper {\\\n     public:\\\n      static void Execute() { statement; }\\\n    };\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter:: \\\n          INTERCEPT_ALL_THREADS, &gtest_failures);\\\n      GTestExpectFatalFailureHelper::Execute();\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n// A macro for testing Google Test assertions or code that's expected to\n// generate Google Test non-fatal failures.  It asserts that the given\n// statement will cause exactly one non-fatal Google Test failure with 'substr'\n// being part of the failure message.\n//\n// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only\n// affects and considers failures generated in the current thread and\n// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.\n//\n// 'statement' is allowed to reference local variables and members of\n// the current object.\n//\n// The verification of the assertion is done correctly even when the statement\n// throws an exception or aborts the current function.\n//\n// Known restrictions:\n//   - You cannot stream a failure message to this macro.\n//\n// Note that even though the implementations of the following two\n// macros are much alike, we cannot refactor them to use a common\n// helper macro, due to some peculiarity in how the preprocessor\n// works.  If we do that, the code won't compile when the user gives\n// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that\n// expands to code containing an unprotected comma.  The\n// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc\n// catches that.\n//\n// For the same reason, we have to write\n//   if (::testing::internal::AlwaysTrue()) { statement; }\n// instead of\n//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)\n// to avoid an MSVC warning on unreachable code.\n#define EXPECT_NONFATAL_FAILURE(statement, substr) \\\n  do {\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \\\n        (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter:: \\\n          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\\\n      if (::testing::internal::AlwaysTrue()) { statement; }\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \\\n  do {\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \\\n        (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \\\n          &gtest_failures);\\\n      if (::testing::internal::AlwaysTrue()) { statement; }\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/gtest-test-part.h",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_\n#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_\n\n#include <iosfwd>\n#include <vector>\n#include \"gtest/internal/gtest-internal.h\"\n#include \"gtest/internal/gtest-string.h\"\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\nnamespace testing {\n\n// A copyable object representing the result of a test part (i.e. an\n// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).\n//\n// Don't inherit from TestPartResult as its destructor is not virtual.\nclass GTEST_API_ TestPartResult {\n public:\n  // The possible outcomes of a test part (i.e. an assertion or an\n  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).\n  enum Type {\n    kSuccess,          // Succeeded.\n    kNonFatalFailure,  // Failed but the test can continue.\n    kFatalFailure      // Failed and the test should be terminated.\n  };\n\n  // C'tor.  TestPartResult does NOT have a default constructor.\n  // Always use this constructor (with parameters) to create a\n  // TestPartResult object.\n  TestPartResult(Type a_type,\n                 const char* a_file_name,\n                 int a_line_number,\n                 const char* a_message)\n      : type_(a_type),\n        file_name_(a_file_name == NULL ? \"\" : a_file_name),\n        line_number_(a_line_number),\n        summary_(ExtractSummary(a_message)),\n        message_(a_message) {\n  }\n\n  // Gets the outcome of the test part.\n  Type type() const { return type_; }\n\n  // Gets the name of the source file where the test part took place, or\n  // NULL if it's unknown.\n  const char* file_name() const {\n    return file_name_.empty() ? NULL : file_name_.c_str();\n  }\n\n  // Gets the line in the source file where the test part took place,\n  // or -1 if it's unknown.\n  int line_number() const { return line_number_; }\n\n  // Gets the summary of the failure message.\n  const char* summary() const { return summary_.c_str(); }\n\n  // Gets the message associated with the test part.\n  const char* message() const { return message_.c_str(); }\n\n  // Returns true iff the test part passed.\n  bool passed() const { return type_ == kSuccess; }\n\n  // Returns true iff the test part failed.\n  bool failed() const { return type_ != kSuccess; }\n\n  // Returns true iff the test part non-fatally failed.\n  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }\n\n  // Returns true iff the test part fatally failed.\n  bool fatally_failed() const { return type_ == kFatalFailure; }\n\n private:\n  Type type_;\n\n  // Gets the summary of the failure message by omitting the stack\n  // trace in it.\n  static std::string ExtractSummary(const char* message);\n\n  // The name of the source file where the test part took place, or\n  // \"\" if the source file is unknown.\n  std::string file_name_;\n  // The line in the source file where the test part took place, or -1\n  // if the line number is unknown.\n  int line_number_;\n  std::string summary_;  // The test failure summary.\n  std::string message_;  // The test failure message.\n};\n\n// Prints a TestPartResult object.\nstd::ostream& operator<<(std::ostream& os, const TestPartResult& result);\n\n// An array of TestPartResult objects.\n//\n// Don't inherit from TestPartResultArray as its destructor is not\n// virtual.\nclass GTEST_API_ TestPartResultArray {\n public:\n  TestPartResultArray() {}\n\n  // Appends the given TestPartResult to the array.\n  void Append(const TestPartResult& result);\n\n  // Returns the TestPartResult at the given index (0-based).\n  const TestPartResult& GetTestPartResult(int index) const;\n\n  // Returns the number of TestPartResult objects in the array.\n  int size() const;\n\n private:\n  std::vector<TestPartResult> array_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);\n};\n\n// This interface knows how to report a test part result.\nclass GTEST_API_ TestPartResultReporterInterface {\n public:\n  virtual ~TestPartResultReporterInterface() {}\n\n  virtual void ReportTestPartResult(const TestPartResult& result) = 0;\n};\n\nnamespace internal {\n\n// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a\n// statement generates new fatal failures. To do so it registers itself as the\n// current test part result reporter. Besides checking if fatal failures were\n// reported, it only delegates the reporting to the former result reporter.\n// The original result reporter is restored in the destructor.\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nclass GTEST_API_ HasNewFatalFailureHelper\n    : public TestPartResultReporterInterface {\n public:\n  HasNewFatalFailureHelper();\n  virtual ~HasNewFatalFailureHelper();\n  virtual void ReportTestPartResult(const TestPartResult& result);\n  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }\n private:\n  bool has_new_fatal_failure_;\n  TestPartResultReporterInterface* original_reporter_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);\n};\n\n}  // namespace internal\n\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/gtest-typed-test.h",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_\n#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_\n\n// This header implements typed tests and type-parameterized tests.\n\n// Typed (aka type-driven) tests repeat the same test for types in a\n// list.  You must know which types you want to test with when writing\n// typed tests. Here's how you do it:\n\n#if 0\n\n// First, define a fixture class template.  It should be parameterized\n// by a type.  Remember to derive it from testing::Test.\ntemplate <typename T>\nclass FooTest : public testing::Test {\n public:\n  ...\n  typedef std::list<T> List;\n  static T shared_;\n  T value_;\n};\n\n// Next, associate a list of types with the test case, which will be\n// repeated for each type in the list.  The typedef is necessary for\n// the macro to parse correctly.\ntypedef testing::Types<char, int, unsigned int> MyTypes;\nTYPED_TEST_CASE(FooTest, MyTypes);\n\n// If the type list contains only one type, you can write that type\n// directly without Types<...>:\n//   TYPED_TEST_CASE(FooTest, int);\n\n// Then, use TYPED_TEST() instead of TEST_F() to define as many typed\n// tests for this test case as you want.\nTYPED_TEST(FooTest, DoesBlah) {\n  // Inside a test, refer to TypeParam to get the type parameter.\n  // Since we are inside a derived class template, C++ requires use to\n  // visit the members of FooTest via 'this'.\n  TypeParam n = this->value_;\n\n  // To visit static members of the fixture, add the TestFixture::\n  // prefix.\n  n += TestFixture::shared_;\n\n  // To refer to typedefs in the fixture, add the \"typename\n  // TestFixture::\" prefix.\n  typename TestFixture::List values;\n  values.push_back(n);\n  ...\n}\n\nTYPED_TEST(FooTest, HasPropertyA) { ... }\n\n// TYPED_TEST_CASE takes an optional third argument which allows to specify a\n// class that generates custom test name suffixes based on the type. This should\n// be a class which has a static template function GetName(int index) returning\n// a string for each type. The provided integer index equals the index of the\n// type in the provided type list. In many cases the index can be ignored.\n//\n// For example:\n//   class MyTypeNames {\n//    public:\n//     template <typename T>\n//     static std::string GetName(int) {\n//       if (std::is_same<T, char>()) return \"char\";\n//       if (std::is_same<T, int>()) return \"int\";\n//       if (std::is_same<T, unsigned int>()) return \"unsignedInt\";\n//     }\n//   };\n//   TYPED_TEST_CASE(FooTest, MyTypes, MyTypeNames);\n\n#endif  // 0\n\n// Type-parameterized tests are abstract test patterns parameterized\n// by a type.  Compared with typed tests, type-parameterized tests\n// allow you to define the test pattern without knowing what the type\n// parameters are.  The defined pattern can be instantiated with\n// different types any number of times, in any number of translation\n// units.\n//\n// If you are designing an interface or concept, you can define a\n// suite of type-parameterized tests to verify properties that any\n// valid implementation of the interface/concept should have.  Then,\n// each implementation can easily instantiate the test suite to verify\n// that it conforms to the requirements, without having to write\n// similar tests repeatedly.  Here's an example:\n\n#if 0\n\n// First, define a fixture class template.  It should be parameterized\n// by a type.  Remember to derive it from testing::Test.\ntemplate <typename T>\nclass FooTest : public testing::Test {\n  ...\n};\n\n// Next, declare that you will define a type-parameterized test case\n// (the _P suffix is for \"parameterized\" or \"pattern\", whichever you\n// prefer):\nTYPED_TEST_CASE_P(FooTest);\n\n// Then, use TYPED_TEST_P() to define as many type-parameterized tests\n// for this type-parameterized test case as you want.\nTYPED_TEST_P(FooTest, DoesBlah) {\n  // Inside a test, refer to TypeParam to get the type parameter.\n  TypeParam n = 0;\n  ...\n}\n\nTYPED_TEST_P(FooTest, HasPropertyA) { ... }\n\n// Now the tricky part: you need to register all test patterns before\n// you can instantiate them.  The first argument of the macro is the\n// test case name; the rest are the names of the tests in this test\n// case.\nREGISTER_TYPED_TEST_CASE_P(FooTest,\n                           DoesBlah, HasPropertyA);\n\n// Finally, you are free to instantiate the pattern with the types you\n// want.  If you put the above code in a header file, you can #include\n// it in multiple C++ source files and instantiate it multiple times.\n//\n// To distinguish different instances of the pattern, the first\n// argument to the INSTANTIATE_* macro is a prefix that will be added\n// to the actual test case name.  Remember to pick unique prefixes for\n// different instances.\ntypedef testing::Types<char, int, unsigned int> MyTypes;\nINSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);\n\n// If the type list contains only one type, you can write that type\n// directly without Types<...>:\n//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);\n//\n// Similar to the optional argument of TYPED_TEST_CASE above,\n// INSTANTIATE_TEST_CASE_P takes an optional fourth argument which allows to\n// generate custom names.\n//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes, MyTypeNames);\n\n#endif  // 0\n\n#include \"gtest/internal/gtest-port.h\"\n#include \"gtest/internal/gtest-type-util.h\"\n\n// Implements typed tests.\n\n#if GTEST_HAS_TYPED_TEST\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Expands to the name of the typedef for the type parameters of the\n// given test case.\n# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_\n\n// Expands to the name of the typedef for the NameGenerator, responsible for\n// creating the suffixes of the name.\n#define GTEST_NAME_GENERATOR_(TestCaseName) \\\n  gtest_type_params_##TestCaseName##_NameGenerator\n\n// The 'Types' template argument below must have spaces around it\n// since some compilers may choke on '>>' when passing a template\n// instance (e.g. Types<int>)\n# define TYPED_TEST_CASE(CaseName, Types, ...)                             \\\n  typedef ::testing::internal::TypeList< Types >::type GTEST_TYPE_PARAMS_( \\\n      CaseName);                                                           \\\n  typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type    \\\n      GTEST_NAME_GENERATOR_(CaseName)\n\n# define TYPED_TEST(CaseName, TestName)                                       \\\n  template <typename gtest_TypeParam_>                                        \\\n  class GTEST_TEST_CLASS_NAME_(CaseName, TestName)                            \\\n      : public CaseName<gtest_TypeParam_> {                                   \\\n   private:                                                                   \\\n    typedef CaseName<gtest_TypeParam_> TestFixture;                           \\\n    typedef gtest_TypeParam_ TypeParam;                                       \\\n    virtual void TestBody();                                                  \\\n  };                                                                          \\\n  static bool gtest_##CaseName##_##TestName##_registered_                     \\\n        GTEST_ATTRIBUTE_UNUSED_ =                                             \\\n      ::testing::internal::TypeParameterizedTest<                             \\\n          CaseName,                                                           \\\n          ::testing::internal::TemplateSel<GTEST_TEST_CLASS_NAME_(CaseName,   \\\n                                                                  TestName)>, \\\n          GTEST_TYPE_PARAMS_(                                                 \\\n              CaseName)>::Register(\"\",                                        \\\n                                   ::testing::internal::CodeLocation(         \\\n                                       __FILE__, __LINE__),                   \\\n                                   #CaseName, #TestName, 0,                   \\\n                                   ::testing::internal::GenerateNames<        \\\n                                       GTEST_NAME_GENERATOR_(CaseName),       \\\n                                       GTEST_TYPE_PARAMS_(CaseName)>());      \\\n  template <typename gtest_TypeParam_>                                        \\\n  void GTEST_TEST_CLASS_NAME_(CaseName,                                       \\\n                              TestName)<gtest_TypeParam_>::TestBody()\n\n#endif  // GTEST_HAS_TYPED_TEST\n\n// Implements type-parameterized tests.\n\n#if GTEST_HAS_TYPED_TEST_P\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Expands to the namespace name that the type-parameterized tests for\n// the given type-parameterized test case are defined in.  The exact\n// name of the namespace is subject to change without notice.\n# define GTEST_CASE_NAMESPACE_(TestCaseName) \\\n  gtest_case_##TestCaseName##_\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Expands to the name of the variable used to remember the names of\n// the defined tests in the given test case.\n# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \\\n  gtest_typed_test_case_p_state_##TestCaseName##_\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.\n//\n// Expands to the name of the variable used to remember the names of\n// the registered tests in the given test case.\n# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \\\n  gtest_registered_test_names_##TestCaseName##_\n\n// The variables defined in the type-parameterized test macros are\n// static as typically these macros are used in a .h file that can be\n// #included in multiple translation units linked together.\n# define TYPED_TEST_CASE_P(CaseName) \\\n  static ::testing::internal::TypedTestCasePState \\\n      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)\n\n# define TYPED_TEST_P(CaseName, TestName) \\\n  namespace GTEST_CASE_NAMESPACE_(CaseName) { \\\n  template <typename gtest_TypeParam_> \\\n  class TestName : public CaseName<gtest_TypeParam_> { \\\n   private: \\\n    typedef CaseName<gtest_TypeParam_> TestFixture; \\\n    typedef gtest_TypeParam_ TypeParam; \\\n    virtual void TestBody(); \\\n  }; \\\n  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \\\n      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\\\n          __FILE__, __LINE__, #CaseName, #TestName); \\\n  } \\\n  template <typename gtest_TypeParam_> \\\n  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()\n\n# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \\\n  namespace GTEST_CASE_NAMESPACE_(CaseName) { \\\n  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \\\n  } \\\n  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) \\\n      GTEST_ATTRIBUTE_UNUSED_ = \\\n          GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames( \\\n              __FILE__, __LINE__, #__VA_ARGS__)\n\n// The 'Types' template argument below must have spaces around it\n// since some compilers may choke on '>>' when passing a template\n// instance (e.g. Types<int>)\n# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types, ...)      \\\n  static bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ =       \\\n      ::testing::internal::TypeParameterizedTestCase<                     \\\n          CaseName, GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_,     \\\n          ::testing::internal::TypeList< Types >::type>::                 \\\n          Register(#Prefix,                                               \\\n                   ::testing::internal::CodeLocation(__FILE__, __LINE__), \\\n                   &GTEST_TYPED_TEST_CASE_P_STATE_(CaseName), #CaseName,  \\\n                   GTEST_REGISTERED_TEST_NAMES_(CaseName),                \\\n                   ::testing::internal::GenerateNames<                    \\\n                       ::testing::internal::NameGeneratorSelector<        \\\n                           __VA_ARGS__>::type,                            \\\n                       ::testing::internal::TypeList< Types >::type>())\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/gtest.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This header file defines the public API for Google Test.  It should be\n// included by any test program that uses Google Test.\n//\n// IMPORTANT NOTE: Due to limitation of the C++ language, we have to\n// leave some internal implementation details in this header file.\n// They are clearly marked by comments like this:\n//\n//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n//\n// Such code is NOT meant to be used by a user directly, and is subject\n// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user\n// program!\n//\n// Acknowledgment: Google Test borrowed the idea of automatic test\n// registration from Barthelemy Dagenais' (barthelemy@prologique.com)\n// easyUnit framework.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_H_\n#define GTEST_INCLUDE_GTEST_GTEST_H_\n\n#include <limits>\n#include <ostream>\n#include <vector>\n\n#include \"gtest/internal/gtest-internal.h\"\n#include \"gtest/internal/gtest-string.h\"\n#include \"gtest/gtest-death-test.h\"\n#include \"gtest/gtest-message.h\"\n#include \"gtest/gtest-param-test.h\"\n#include \"gtest/gtest-printers.h\"\n#include \"gtest/gtest_prod.h\"\n#include \"gtest/gtest-test-part.h\"\n#include \"gtest/gtest-typed-test.h\"\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\n// Depending on the platform, different string classes are available.\n// On Linux, in addition to ::std::string, Google also makes use of\n// class ::string, which has the same interface as ::std::string, but\n// has a different implementation.\n//\n// You can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that\n// ::string is available AND is a distinct type to ::std::string, or\n// define it to 0 to indicate otherwise.\n//\n// If ::std::string and ::string are the same class on your platform\n// due to aliasing, you should define GTEST_HAS_GLOBAL_STRING to 0.\n//\n// If you do not define GTEST_HAS_GLOBAL_STRING, it is defined\n// heuristically.\n\nnamespace testing {\n\n// Silence C4100 (unreferenced formal parameter) and 4805\n// unsafe mix of type 'const int' and type 'const bool'\n#ifdef _MSC_VER\n# pragma warning(push)\n# pragma warning(disable:4805)\n# pragma warning(disable:4100)\n#endif\n\n\n// Declares the flags.\n\n// This flag temporary enables the disabled tests.\nGTEST_DECLARE_bool_(also_run_disabled_tests);\n\n// This flag brings the debugger on an assertion failure.\nGTEST_DECLARE_bool_(break_on_failure);\n\n// This flag controls whether Google Test catches all test-thrown exceptions\n// and logs them as failures.\nGTEST_DECLARE_bool_(catch_exceptions);\n\n// This flag enables using colors in terminal output. Available values are\n// \"yes\" to enable colors, \"no\" (disable colors), or \"auto\" (the default)\n// to let Google Test decide.\nGTEST_DECLARE_string_(color);\n\n// This flag sets up the filter to select by name using a glob pattern\n// the tests to run. If the filter is not given all tests are executed.\nGTEST_DECLARE_string_(filter);\n\n// This flag controls whether Google Test installs a signal handler that dumps\n// debugging information when fatal signals are raised.\nGTEST_DECLARE_bool_(install_failure_signal_handler);\n\n// This flag causes the Google Test to list tests. None of the tests listed\n// are actually run if the flag is provided.\nGTEST_DECLARE_bool_(list_tests);\n\n// This flag controls whether Google Test emits a detailed XML report to a file\n// in addition to its normal textual output.\nGTEST_DECLARE_string_(output);\n\n// This flags control whether Google Test prints the elapsed time for each\n// test.\nGTEST_DECLARE_bool_(print_time);\n\n// This flags control whether Google Test prints UTF8 characters as text.\nGTEST_DECLARE_bool_(print_utf8);\n\n// This flag specifies the random number seed.\nGTEST_DECLARE_int32_(random_seed);\n\n// This flag sets how many times the tests are repeated. The default value\n// is 1. If the value is -1 the tests are repeating forever.\nGTEST_DECLARE_int32_(repeat);\n\n// This flag controls whether Google Test includes Google Test internal\n// stack frames in failure stack traces.\nGTEST_DECLARE_bool_(show_internal_stack_frames);\n\n// When this flag is specified, tests' order is randomized on every iteration.\nGTEST_DECLARE_bool_(shuffle);\n\n// This flag specifies the maximum number of stack frames to be\n// printed in a failure message.\nGTEST_DECLARE_int32_(stack_trace_depth);\n\n// When this flag is specified, a failed assertion will throw an\n// exception if exceptions are enabled, or exit the program with a\n// non-zero code otherwise. For use with an external test framework.\nGTEST_DECLARE_bool_(throw_on_failure);\n\n// When this flag is set with a \"host:port\" string, on supported\n// platforms test results are streamed to the specified port on\n// the specified host machine.\nGTEST_DECLARE_string_(stream_result_to);\n\n#if GTEST_USE_OWN_FLAGFILE_FLAG_\nGTEST_DECLARE_string_(flagfile);\n#endif  // GTEST_USE_OWN_FLAGFILE_FLAG_\n\n// The upper limit for valid stack trace depths.\nconst int kMaxStackTraceDepth = 100;\n\nnamespace internal {\n\nclass AssertHelper;\nclass DefaultGlobalTestPartResultReporter;\nclass ExecDeathTest;\nclass NoExecDeathTest;\nclass FinalSuccessChecker;\nclass GTestFlagSaver;\nclass StreamingListenerTest;\nclass TestResultAccessor;\nclass TestEventListenersAccessor;\nclass TestEventRepeater;\nclass UnitTestRecordPropertyTestHelper;\nclass WindowsDeathTest;\nclass FuchsiaDeathTest;\nclass UnitTestImpl* GetUnitTestImpl();\nvoid ReportFailureInUnknownLocation(TestPartResult::Type result_type,\n                                    const std::string& message);\n\n}  // namespace internal\n\n// The friend relationship of some of these classes is cyclic.\n// If we don't forward declare them the compiler might confuse the classes\n// in friendship clauses with same named classes on the scope.\nclass Test;\nclass TestCase;\nclass TestInfo;\nclass UnitTest;\n\n// A class for indicating whether an assertion was successful.  When\n// the assertion wasn't successful, the AssertionResult object\n// remembers a non-empty message that describes how it failed.\n//\n// To create an instance of this class, use one of the factory functions\n// (AssertionSuccess() and AssertionFailure()).\n//\n// This class is useful for two purposes:\n//   1. Defining predicate functions to be used with Boolean test assertions\n//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts\n//   2. Defining predicate-format functions to be\n//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).\n//\n// For example, if you define IsEven predicate:\n//\n//   testing::AssertionResult IsEven(int n) {\n//     if ((n % 2) == 0)\n//       return testing::AssertionSuccess();\n//     else\n//       return testing::AssertionFailure() << n << \" is odd\";\n//   }\n//\n// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))\n// will print the message\n//\n//   Value of: IsEven(Fib(5))\n//     Actual: false (5 is odd)\n//   Expected: true\n//\n// instead of a more opaque\n//\n//   Value of: IsEven(Fib(5))\n//     Actual: false\n//   Expected: true\n//\n// in case IsEven is a simple Boolean predicate.\n//\n// If you expect your predicate to be reused and want to support informative\n// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up\n// about half as often as positive ones in our tests), supply messages for\n// both success and failure cases:\n//\n//   testing::AssertionResult IsEven(int n) {\n//     if ((n % 2) == 0)\n//       return testing::AssertionSuccess() << n << \" is even\";\n//     else\n//       return testing::AssertionFailure() << n << \" is odd\";\n//   }\n//\n// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print\n//\n//   Value of: IsEven(Fib(6))\n//     Actual: true (8 is even)\n//   Expected: false\n//\n// NB: Predicates that support negative Boolean assertions have reduced\n// performance in positive ones so be careful not to use them in tests\n// that have lots (tens of thousands) of positive Boolean assertions.\n//\n// To use this class with EXPECT_PRED_FORMAT assertions such as:\n//\n//   // Verifies that Foo() returns an even number.\n//   EXPECT_PRED_FORMAT1(IsEven, Foo());\n//\n// you need to define:\n//\n//   testing::AssertionResult IsEven(const char* expr, int n) {\n//     if ((n % 2) == 0)\n//       return testing::AssertionSuccess();\n//     else\n//       return testing::AssertionFailure()\n//         << \"Expected: \" << expr << \" is even\\n  Actual: it's \" << n;\n//   }\n//\n// If Foo() returns 5, you will see the following message:\n//\n//   Expected: Foo() is even\n//     Actual: it's 5\n//\nclass GTEST_API_ AssertionResult {\n public:\n  // Copy constructor.\n  // Used in EXPECT_TRUE/FALSE(assertion_result).\n  AssertionResult(const AssertionResult& other);\n\n#if defined(_MSC_VER) && _MSC_VER < 1910\n  GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 /* forcing value to bool */)\n#endif\n\n  // Used in the EXPECT_TRUE/FALSE(bool_expression).\n  //\n  // T must be contextually convertible to bool.\n  //\n  // The second parameter prevents this overload from being considered if\n  // the argument is implicitly convertible to AssertionResult. In that case\n  // we want AssertionResult's copy constructor to be used.\n  template <typename T>\n  explicit AssertionResult(\n      const T& success,\n      typename internal::EnableIf<\n          !internal::ImplicitlyConvertible<T, AssertionResult>::value>::type*\n          /*enabler*/ = NULL)\n      : success_(success) {}\n\n#if defined(_MSC_VER) && _MSC_VER < 1910\n  GTEST_DISABLE_MSC_WARNINGS_POP_()\n#endif\n\n  // Assignment operator.\n  AssertionResult& operator=(AssertionResult other) {\n    swap(other);\n    return *this;\n  }\n\n  // Returns true iff the assertion succeeded.\n  operator bool() const { return success_; }  // NOLINT\n\n  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.\n  AssertionResult operator!() const;\n\n  // Returns the text streamed into this AssertionResult. Test assertions\n  // use it when they fail (i.e., the predicate's outcome doesn't match the\n  // assertion's expectation). When nothing has been streamed into the\n  // object, returns an empty string.\n  const char* message() const {\n    return message_.get() != NULL ?  message_->c_str() : \"\";\n  }\n  // FIXME: Remove this after making sure no clients use it.\n  // Deprecated; please use message() instead.\n  const char* failure_message() const { return message(); }\n\n  // Streams a custom failure message into this object.\n  template <typename T> AssertionResult& operator<<(const T& value) {\n    AppendMessage(Message() << value);\n    return *this;\n  }\n\n  // Allows streaming basic output manipulators such as endl or flush into\n  // this object.\n  AssertionResult& operator<<(\n      ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {\n    AppendMessage(Message() << basic_manipulator);\n    return *this;\n  }\n\n private:\n  // Appends the contents of message to message_.\n  void AppendMessage(const Message& a_message) {\n    if (message_.get() == NULL)\n      message_.reset(new ::std::string);\n    message_->append(a_message.GetString().c_str());\n  }\n\n  // Swap the contents of this AssertionResult with other.\n  void swap(AssertionResult& other);\n\n  // Stores result of the assertion predicate.\n  bool success_;\n  // Stores the message describing the condition in case the expectation\n  // construct is not satisfied with the predicate's outcome.\n  // Referenced via a pointer to avoid taking too much stack frame space\n  // with test assertions.\n  internal::scoped_ptr< ::std::string> message_;\n};\n\n// Makes a successful assertion result.\nGTEST_API_ AssertionResult AssertionSuccess();\n\n// Makes a failed assertion result.\nGTEST_API_ AssertionResult AssertionFailure();\n\n// Makes a failed assertion result with the given failure message.\n// Deprecated; use AssertionFailure() << msg.\nGTEST_API_ AssertionResult AssertionFailure(const Message& msg);\n\n}  // namespace testing\n\n// Includes the auto-generated header that implements a family of generic\n// predicate assertion macros. This include comes late because it relies on\n// APIs declared above.\n#include \"gtest/gtest_pred_impl.h\"\n\nnamespace testing {\n\n// The abstract class that all tests inherit from.\n//\n// In Google Test, a unit test program contains one or many TestCases, and\n// each TestCase contains one or many Tests.\n//\n// When you define a test using the TEST macro, you don't need to\n// explicitly derive from Test - the TEST macro automatically does\n// this for you.\n//\n// The only time you derive from Test is when defining a test fixture\n// to be used in a TEST_F.  For example:\n//\n//   class FooTest : public testing::Test {\n//    protected:\n//     void SetUp() override { ... }\n//     void TearDown() override { ... }\n//     ...\n//   };\n//\n//   TEST_F(FooTest, Bar) { ... }\n//   TEST_F(FooTest, Baz) { ... }\n//\n// Test is not copyable.\nclass GTEST_API_ Test {\n public:\n  friend class TestInfo;\n\n  // Defines types for pointers to functions that set up and tear down\n  // a test case.\n  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;\n  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;\n\n  // The d'tor is virtual as we intend to inherit from Test.\n  virtual ~Test();\n\n  // Sets up the stuff shared by all tests in this test case.\n  //\n  // Google Test will call Foo::SetUpTestCase() before running the first\n  // test in test case Foo.  Hence a sub-class can define its own\n  // SetUpTestCase() method to shadow the one defined in the super\n  // class.\n  static void SetUpTestCase() {}\n\n  // Tears down the stuff shared by all tests in this test case.\n  //\n  // Google Test will call Foo::TearDownTestCase() after running the last\n  // test in test case Foo.  Hence a sub-class can define its own\n  // TearDownTestCase() method to shadow the one defined in the super\n  // class.\n  static void TearDownTestCase() {}\n\n  // Returns true iff the current test has a fatal failure.\n  static bool HasFatalFailure();\n\n  // Returns true iff the current test has a non-fatal failure.\n  static bool HasNonfatalFailure();\n\n  // Returns true iff the current test has a (either fatal or\n  // non-fatal) failure.\n  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }\n\n  // Logs a property for the current test, test case, or for the entire\n  // invocation of the test program when used outside of the context of a\n  // test case.  Only the last value for a given key is remembered.  These\n  // are public static so they can be called from utility functions that are\n  // not members of the test fixture.  Calls to RecordProperty made during\n  // lifespan of the test (from the moment its constructor starts to the\n  // moment its destructor finishes) will be output in XML as attributes of\n  // the <testcase> element.  Properties recorded from fixture's\n  // SetUpTestCase or TearDownTestCase are logged as attributes of the\n  // corresponding <testsuite> element.  Calls to RecordProperty made in the\n  // global context (before or after invocation of RUN_ALL_TESTS and from\n  // SetUp/TearDown method of Environment objects registered with Google\n  // Test) will be output as attributes of the <testsuites> element.\n  static void RecordProperty(const std::string& key, const std::string& value);\n  static void RecordProperty(const std::string& key, int value);\n\n protected:\n  // Creates a Test object.\n  Test();\n\n  // Sets up the test fixture.\n  virtual void SetUp();\n\n  // Tears down the test fixture.\n  virtual void TearDown();\n\n private:\n  // Returns true iff the current test has the same fixture class as\n  // the first test in the current test case.\n  static bool HasSameFixtureClass();\n\n  // Runs the test after the test fixture has been set up.\n  //\n  // A sub-class must implement this to define the test logic.\n  //\n  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.\n  // Instead, use the TEST or TEST_F macro.\n  virtual void TestBody() = 0;\n\n  // Sets up, executes, and tears down the test.\n  void Run();\n\n  // Deletes self.  We deliberately pick an unusual name for this\n  // internal method to avoid clashing with names used in user TESTs.\n  void DeleteSelf_() { delete this; }\n\n  const internal::scoped_ptr< GTEST_FLAG_SAVER_ > gtest_flag_saver_;\n\n  // Often a user misspells SetUp() as Setup() and spends a long time\n  // wondering why it is never called by Google Test.  The declaration of\n  // the following method is solely for catching such an error at\n  // compile time:\n  //\n  //   - The return type is deliberately chosen to be not void, so it\n  //   will be a conflict if void Setup() is declared in the user's\n  //   test fixture.\n  //\n  //   - This method is private, so it will be another compiler error\n  //   if the method is called from the user's test fixture.\n  //\n  // DO NOT OVERRIDE THIS FUNCTION.\n  //\n  // If you see an error about overriding the following function or\n  // about it being private, you have mis-spelled SetUp() as Setup().\n  struct Setup_should_be_spelled_SetUp {};\n  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }\n\n  // We disallow copying Tests.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);\n};\n\ntypedef internal::TimeInMillis TimeInMillis;\n\n// A copyable object representing a user specified test property which can be\n// output as a key/value string pair.\n//\n// Don't inherit from TestProperty as its destructor is not virtual.\nclass TestProperty {\n public:\n  // C'tor.  TestProperty does NOT have a default constructor.\n  // Always use this constructor (with parameters) to create a\n  // TestProperty object.\n  TestProperty(const std::string& a_key, const std::string& a_value) :\n    key_(a_key), value_(a_value) {\n  }\n\n  // Gets the user supplied key.\n  const char* key() const {\n    return key_.c_str();\n  }\n\n  // Gets the user supplied value.\n  const char* value() const {\n    return value_.c_str();\n  }\n\n  // Sets a new value, overriding the one supplied in the constructor.\n  void SetValue(const std::string& new_value) {\n    value_ = new_value;\n  }\n\n private:\n  // The key supplied by the user.\n  std::string key_;\n  // The value supplied by the user.\n  std::string value_;\n};\n\n// The result of a single Test.  This includes a list of\n// TestPartResults, a list of TestProperties, a count of how many\n// death tests there are in the Test, and how much time it took to run\n// the Test.\n//\n// TestResult is not copyable.\nclass GTEST_API_ TestResult {\n public:\n  // Creates an empty TestResult.\n  TestResult();\n\n  // D'tor.  Do not inherit from TestResult.\n  ~TestResult();\n\n  // Gets the number of all test parts.  This is the sum of the number\n  // of successful test parts and the number of failed test parts.\n  int total_part_count() const;\n\n  // Returns the number of the test properties.\n  int test_property_count() const;\n\n  // Returns true iff the test passed (i.e. no test part failed).\n  bool Passed() const { return !Failed(); }\n\n  // Returns true iff the test failed.\n  bool Failed() const;\n\n  // Returns true iff the test fatally failed.\n  bool HasFatalFailure() const;\n\n  // Returns true iff the test has a non-fatal failure.\n  bool HasNonfatalFailure() const;\n\n  // Returns the elapsed time, in milliseconds.\n  TimeInMillis elapsed_time() const { return elapsed_time_; }\n\n  // Returns the i-th test part result among all the results. i can range from 0\n  // to total_part_count() - 1. If i is not in that range, aborts the program.\n  const TestPartResult& GetTestPartResult(int i) const;\n\n  // Returns the i-th test property. i can range from 0 to\n  // test_property_count() - 1. If i is not in that range, aborts the\n  // program.\n  const TestProperty& GetTestProperty(int i) const;\n\n private:\n  friend class TestInfo;\n  friend class TestCase;\n  friend class UnitTest;\n  friend class internal::DefaultGlobalTestPartResultReporter;\n  friend class internal::ExecDeathTest;\n  friend class internal::TestResultAccessor;\n  friend class internal::UnitTestImpl;\n  friend class internal::WindowsDeathTest;\n  friend class internal::FuchsiaDeathTest;\n\n  // Gets the vector of TestPartResults.\n  const std::vector<TestPartResult>& test_part_results() const {\n    return test_part_results_;\n  }\n\n  // Gets the vector of TestProperties.\n  const std::vector<TestProperty>& test_properties() const {\n    return test_properties_;\n  }\n\n  // Sets the elapsed time.\n  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }\n\n  // Adds a test property to the list. The property is validated and may add\n  // a non-fatal failure if invalid (e.g., if it conflicts with reserved\n  // key names). If a property is already recorded for the same key, the\n  // value will be updated, rather than storing multiple values for the same\n  // key.  xml_element specifies the element for which the property is being\n  // recorded and is used for validation.\n  void RecordProperty(const std::string& xml_element,\n                      const TestProperty& test_property);\n\n  // Adds a failure if the key is a reserved attribute of Google Test\n  // testcase tags.  Returns true if the property is valid.\n  // FIXME: Validate attribute names are legal and human readable.\n  static bool ValidateTestProperty(const std::string& xml_element,\n                                   const TestProperty& test_property);\n\n  // Adds a test part result to the list.\n  void AddTestPartResult(const TestPartResult& test_part_result);\n\n  // Returns the death test count.\n  int death_test_count() const { return death_test_count_; }\n\n  // Increments the death test count, returning the new count.\n  int increment_death_test_count() { return ++death_test_count_; }\n\n  // Clears the test part results.\n  void ClearTestPartResults();\n\n  // Clears the object.\n  void Clear();\n\n  // Protects mutable state of the property vector and of owned\n  // properties, whose values may be updated.\n  internal::Mutex test_properites_mutex_;\n\n  // The vector of TestPartResults\n  std::vector<TestPartResult> test_part_results_;\n  // The vector of TestProperties\n  std::vector<TestProperty> test_properties_;\n  // Running count of death tests.\n  int death_test_count_;\n  // The elapsed time, in milliseconds.\n  TimeInMillis elapsed_time_;\n\n  // We disallow copying TestResult.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);\n};  // class TestResult\n\n// A TestInfo object stores the following information about a test:\n//\n//   Test case name\n//   Test name\n//   Whether the test should be run\n//   A function pointer that creates the test object when invoked\n//   Test result\n//\n// The constructor of TestInfo registers itself with the UnitTest\n// singleton such that the RUN_ALL_TESTS() macro knows which tests to\n// run.\nclass GTEST_API_ TestInfo {\n public:\n  // Destructs a TestInfo object.  This function is not virtual, so\n  // don't inherit from TestInfo.\n  ~TestInfo();\n\n  // Returns the test case name.\n  const char* test_case_name() const { return test_case_name_.c_str(); }\n\n  // Returns the test name.\n  const char* name() const { return name_.c_str(); }\n\n  // Returns the name of the parameter type, or NULL if this is not a typed\n  // or a type-parameterized test.\n  const char* type_param() const {\n    if (type_param_.get() != NULL)\n      return type_param_->c_str();\n    return NULL;\n  }\n\n  // Returns the text representation of the value parameter, or NULL if this\n  // is not a value-parameterized test.\n  const char* value_param() const {\n    if (value_param_.get() != NULL)\n      return value_param_->c_str();\n    return NULL;\n  }\n\n  // Returns the file name where this test is defined.\n  const char* file() const { return location_.file.c_str(); }\n\n  // Returns the line where this test is defined.\n  int line() const { return location_.line; }\n\n  // Return true if this test should not be run because it's in another shard.\n  bool is_in_another_shard() const { return is_in_another_shard_; }\n\n  // Returns true if this test should run, that is if the test is not\n  // disabled (or it is disabled but the also_run_disabled_tests flag has\n  // been specified) and its full name matches the user-specified filter.\n  //\n  // Google Test allows the user to filter the tests by their full names.\n  // The full name of a test Bar in test case Foo is defined as\n  // \"Foo.Bar\".  Only the tests that match the filter will run.\n  //\n  // A filter is a colon-separated list of glob (not regex) patterns,\n  // optionally followed by a '-' and a colon-separated list of\n  // negative patterns (tests to exclude).  A test is run if it\n  // matches one of the positive patterns and does not match any of\n  // the negative patterns.\n  //\n  // For example, *A*:Foo.* is a filter that matches any string that\n  // contains the character 'A' or starts with \"Foo.\".\n  bool should_run() const { return should_run_; }\n\n  // Returns true iff this test will appear in the XML report.\n  bool is_reportable() const {\n    // The XML report includes tests matching the filter, excluding those\n    // run in other shards.\n    return matches_filter_ && !is_in_another_shard_;\n  }\n\n  // Returns the result of the test.\n  const TestResult* result() const { return &result_; }\n\n private:\n#if GTEST_HAS_DEATH_TEST\n  friend class internal::DefaultDeathTestFactory;\n#endif  // GTEST_HAS_DEATH_TEST\n  friend class Test;\n  friend class TestCase;\n  friend class internal::UnitTestImpl;\n  friend class internal::StreamingListenerTest;\n  friend TestInfo* internal::MakeAndRegisterTestInfo(\n      const char* test_case_name,\n      const char* name,\n      const char* type_param,\n      const char* value_param,\n      internal::CodeLocation code_location,\n      internal::TypeId fixture_class_id,\n      Test::SetUpTestCaseFunc set_up_tc,\n      Test::TearDownTestCaseFunc tear_down_tc,\n      internal::TestFactoryBase* factory);\n\n  // Constructs a TestInfo object. The newly constructed instance assumes\n  // ownership of the factory object.\n  TestInfo(const std::string& test_case_name,\n           const std::string& name,\n           const char* a_type_param,   // NULL if not a type-parameterized test\n           const char* a_value_param,  // NULL if not a value-parameterized test\n           internal::CodeLocation a_code_location,\n           internal::TypeId fixture_class_id,\n           internal::TestFactoryBase* factory);\n\n  // Increments the number of death tests encountered in this test so\n  // far.\n  int increment_death_test_count() {\n    return result_.increment_death_test_count();\n  }\n\n  // Creates the test object, runs it, records its result, and then\n  // deletes it.\n  void Run();\n\n  static void ClearTestResult(TestInfo* test_info) {\n    test_info->result_.Clear();\n  }\n\n  // These fields are immutable properties of the test.\n  const std::string test_case_name_;     // Test case name\n  const std::string name_;               // Test name\n  // Name of the parameter type, or NULL if this is not a typed or a\n  // type-parameterized test.\n  const internal::scoped_ptr<const ::std::string> type_param_;\n  // Text representation of the value parameter, or NULL if this is not a\n  // value-parameterized test.\n  const internal::scoped_ptr<const ::std::string> value_param_;\n  internal::CodeLocation location_;\n  const internal::TypeId fixture_class_id_;   // ID of the test fixture class\n  bool should_run_;                 // True iff this test should run\n  bool is_disabled_;                // True iff this test is disabled\n  bool matches_filter_;             // True if this test matches the\n                                    // user-specified filter.\n  bool is_in_another_shard_;        // Will be run in another shard.\n  internal::TestFactoryBase* const factory_;  // The factory that creates\n                                              // the test object\n\n  // This field is mutable and needs to be reset before running the\n  // test for the second time.\n  TestResult result_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);\n};\n\n// A test case, which consists of a vector of TestInfos.\n//\n// TestCase is not copyable.\nclass GTEST_API_ TestCase {\n public:\n  // Creates a TestCase with the given name.\n  //\n  // TestCase does NOT have a default constructor.  Always use this\n  // constructor to create a TestCase object.\n  //\n  // Arguments:\n  //\n  //   name:         name of the test case\n  //   a_type_param: the name of the test's type parameter, or NULL if\n  //                 this is not a type-parameterized test.\n  //   set_up_tc:    pointer to the function that sets up the test case\n  //   tear_down_tc: pointer to the function that tears down the test case\n  TestCase(const char* name, const char* a_type_param,\n           Test::SetUpTestCaseFunc set_up_tc,\n           Test::TearDownTestCaseFunc tear_down_tc);\n\n  // Destructor of TestCase.\n  virtual ~TestCase();\n\n  // Gets the name of the TestCase.\n  const char* name() const { return name_.c_str(); }\n\n  // Returns the name of the parameter type, or NULL if this is not a\n  // type-parameterized test case.\n  const char* type_param() const {\n    if (type_param_.get() != NULL)\n      return type_param_->c_str();\n    return NULL;\n  }\n\n  // Returns true if any test in this test case should run.\n  bool should_run() const { return should_run_; }\n\n  // Gets the number of successful tests in this test case.\n  int successful_test_count() const;\n\n  // Gets the number of failed tests in this test case.\n  int failed_test_count() const;\n\n  // Gets the number of disabled tests that will be reported in the XML report.\n  int reportable_disabled_test_count() const;\n\n  // Gets the number of disabled tests in this test case.\n  int disabled_test_count() const;\n\n  // Gets the number of tests to be printed in the XML report.\n  int reportable_test_count() const;\n\n  // Get the number of tests in this test case that should run.\n  int test_to_run_count() const;\n\n  // Gets the number of all tests in this test case.\n  int total_test_count() const;\n\n  // Returns true iff the test case passed.\n  bool Passed() const { return !Failed(); }\n\n  // Returns true iff the test case failed.\n  bool Failed() const { return failed_test_count() > 0; }\n\n  // Returns the elapsed time, in milliseconds.\n  TimeInMillis elapsed_time() const { return elapsed_time_; }\n\n  // Returns the i-th test among all the tests. i can range from 0 to\n  // total_test_count() - 1. If i is not in that range, returns NULL.\n  const TestInfo* GetTestInfo(int i) const;\n\n  // Returns the TestResult that holds test properties recorded during\n  // execution of SetUpTestCase and TearDownTestCase.\n  const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }\n\n private:\n  friend class Test;\n  friend class internal::UnitTestImpl;\n\n  // Gets the (mutable) vector of TestInfos in this TestCase.\n  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }\n\n  // Gets the (immutable) vector of TestInfos in this TestCase.\n  const std::vector<TestInfo*>& test_info_list() const {\n    return test_info_list_;\n  }\n\n  // Returns the i-th test among all the tests. i can range from 0 to\n  // total_test_count() - 1. If i is not in that range, returns NULL.\n  TestInfo* GetMutableTestInfo(int i);\n\n  // Sets the should_run member.\n  void set_should_run(bool should) { should_run_ = should; }\n\n  // Adds a TestInfo to this test case.  Will delete the TestInfo upon\n  // destruction of the TestCase object.\n  void AddTestInfo(TestInfo * test_info);\n\n  // Clears the results of all tests in this test case.\n  void ClearResult();\n\n  // Clears the results of all tests in the given test case.\n  static void ClearTestCaseResult(TestCase* test_case) {\n    test_case->ClearResult();\n  }\n\n  // Runs every test in this TestCase.\n  void Run();\n\n  // Runs SetUpTestCase() for this TestCase.  This wrapper is needed\n  // for catching exceptions thrown from SetUpTestCase().\n  void RunSetUpTestCase() { (*set_up_tc_)(); }\n\n  // Runs TearDownTestCase() for this TestCase.  This wrapper is\n  // needed for catching exceptions thrown from TearDownTestCase().\n  void RunTearDownTestCase() { (*tear_down_tc_)(); }\n\n  // Returns true iff test passed.\n  static bool TestPassed(const TestInfo* test_info) {\n    return test_info->should_run() && test_info->result()->Passed();\n  }\n\n  // Returns true iff test failed.\n  static bool TestFailed(const TestInfo* test_info) {\n    return test_info->should_run() && test_info->result()->Failed();\n  }\n\n  // Returns true iff the test is disabled and will be reported in the XML\n  // report.\n  static bool TestReportableDisabled(const TestInfo* test_info) {\n    return test_info->is_reportable() && test_info->is_disabled_;\n  }\n\n  // Returns true iff test is disabled.\n  static bool TestDisabled(const TestInfo* test_info) {\n    return test_info->is_disabled_;\n  }\n\n  // Returns true iff this test will appear in the XML report.\n  static bool TestReportable(const TestInfo* test_info) {\n    return test_info->is_reportable();\n  }\n\n  // Returns true if the given test should run.\n  static bool ShouldRunTest(const TestInfo* test_info) {\n    return test_info->should_run();\n  }\n\n  // Shuffles the tests in this test case.\n  void ShuffleTests(internal::Random* random);\n\n  // Restores the test order to before the first shuffle.\n  void UnshuffleTests();\n\n  // Name of the test case.\n  std::string name_;\n  // Name of the parameter type, or NULL if this is not a typed or a\n  // type-parameterized test.\n  const internal::scoped_ptr<const ::std::string> type_param_;\n  // The vector of TestInfos in their original order.  It owns the\n  // elements in the vector.\n  std::vector<TestInfo*> test_info_list_;\n  // Provides a level of indirection for the test list to allow easy\n  // shuffling and restoring the test order.  The i-th element in this\n  // vector is the index of the i-th test in the shuffled test list.\n  std::vector<int> test_indices_;\n  // Pointer to the function that sets up the test case.\n  Test::SetUpTestCaseFunc set_up_tc_;\n  // Pointer to the function that tears down the test case.\n  Test::TearDownTestCaseFunc tear_down_tc_;\n  // True iff any test in this test case should run.\n  bool should_run_;\n  // Elapsed time, in milliseconds.\n  TimeInMillis elapsed_time_;\n  // Holds test properties recorded during execution of SetUpTestCase and\n  // TearDownTestCase.\n  TestResult ad_hoc_test_result_;\n\n  // We disallow copying TestCases.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);\n};\n\n// An Environment object is capable of setting up and tearing down an\n// environment.  You should subclass this to define your own\n// environment(s).\n//\n// An Environment object does the set-up and tear-down in virtual\n// methods SetUp() and TearDown() instead of the constructor and the\n// destructor, as:\n//\n//   1. You cannot safely throw from a destructor.  This is a problem\n//      as in some cases Google Test is used where exceptions are enabled, and\n//      we may want to implement ASSERT_* using exceptions where they are\n//      available.\n//   2. You cannot use ASSERT_* directly in a constructor or\n//      destructor.\nclass Environment {\n public:\n  // The d'tor is virtual as we need to subclass Environment.\n  virtual ~Environment() {}\n\n  // Override this to define how to set up the environment.\n  virtual void SetUp() {}\n\n  // Override this to define how to tear down the environment.\n  virtual void TearDown() {}\n private:\n  // If you see an error about overriding the following function or\n  // about it being private, you have mis-spelled SetUp() as Setup().\n  struct Setup_should_be_spelled_SetUp {};\n  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }\n};\n\n#if GTEST_HAS_EXCEPTIONS\n\n// Exception which can be thrown from TestEventListener::OnTestPartResult.\nclass GTEST_API_ AssertionException\n    : public internal::GoogleTestFailureException {\n public:\n  explicit AssertionException(const TestPartResult& result)\n      : GoogleTestFailureException(result) {}\n};\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// The interface for tracing execution of tests. The methods are organized in\n// the order the corresponding events are fired.\nclass TestEventListener {\n public:\n  virtual ~TestEventListener() {}\n\n  // Fired before any test activity starts.\n  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;\n\n  // Fired before each iteration of tests starts.  There may be more than\n  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration\n  // index, starting from 0.\n  virtual void OnTestIterationStart(const UnitTest& unit_test,\n                                    int iteration) = 0;\n\n  // Fired before environment set-up for each iteration of tests starts.\n  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;\n\n  // Fired after environment set-up for each iteration of tests ends.\n  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;\n\n  // Fired before the test case starts.\n  virtual void OnTestCaseStart(const TestCase& test_case) = 0;\n\n  // Fired before the test starts.\n  virtual void OnTestStart(const TestInfo& test_info) = 0;\n\n  // Fired after a failed assertion or a SUCCEED() invocation.\n  // If you want to throw an exception from this function to skip to the next\n  // TEST, it must be AssertionException defined above, or inherited from it.\n  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;\n\n  // Fired after the test ends.\n  virtual void OnTestEnd(const TestInfo& test_info) = 0;\n\n  // Fired after the test case ends.\n  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;\n\n  // Fired before environment tear-down for each iteration of tests starts.\n  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;\n\n  // Fired after environment tear-down for each iteration of tests ends.\n  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;\n\n  // Fired after each iteration of tests finishes.\n  virtual void OnTestIterationEnd(const UnitTest& unit_test,\n                                  int iteration) = 0;\n\n  // Fired after all test activities have ended.\n  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;\n};\n\n// The convenience class for users who need to override just one or two\n// methods and are not concerned that a possible change to a signature of\n// the methods they override will not be caught during the build.  For\n// comments about each method please see the definition of TestEventListener\n// above.\nclass EmptyTestEventListener : public TestEventListener {\n public:\n  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,\n                                    int /*iteration*/) {}\n  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}\n  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}\n  virtual void OnTestStart(const TestInfo& /*test_info*/) {}\n  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}\n  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}\n  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}\n  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}\n  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,\n                                  int /*iteration*/) {}\n  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}\n};\n\n// TestEventListeners lets users add listeners to track events in Google Test.\nclass GTEST_API_ TestEventListeners {\n public:\n  TestEventListeners();\n  ~TestEventListeners();\n\n  // Appends an event listener to the end of the list. Google Test assumes\n  // the ownership of the listener (i.e. it will delete the listener when\n  // the test program finishes).\n  void Append(TestEventListener* listener);\n\n  // Removes the given event listener from the list and returns it.  It then\n  // becomes the caller's responsibility to delete the listener. Returns\n  // NULL if the listener is not found in the list.\n  TestEventListener* Release(TestEventListener* listener);\n\n  // Returns the standard listener responsible for the default console\n  // output.  Can be removed from the listeners list to shut down default\n  // console output.  Note that removing this object from the listener list\n  // with Release transfers its ownership to the caller and makes this\n  // function return NULL the next time.\n  TestEventListener* default_result_printer() const {\n    return default_result_printer_;\n  }\n\n  // Returns the standard listener responsible for the default XML output\n  // controlled by the --gtest_output=xml flag.  Can be removed from the\n  // listeners list by users who want to shut down the default XML output\n  // controlled by this flag and substitute it with custom one.  Note that\n  // removing this object from the listener list with Release transfers its\n  // ownership to the caller and makes this function return NULL the next\n  // time.\n  TestEventListener* default_xml_generator() const {\n    return default_xml_generator_;\n  }\n\n private:\n  friend class TestCase;\n  friend class TestInfo;\n  friend class internal::DefaultGlobalTestPartResultReporter;\n  friend class internal::NoExecDeathTest;\n  friend class internal::TestEventListenersAccessor;\n  friend class internal::UnitTestImpl;\n\n  // Returns repeater that broadcasts the TestEventListener events to all\n  // subscribers.\n  TestEventListener* repeater();\n\n  // Sets the default_result_printer attribute to the provided listener.\n  // The listener is also added to the listener list and previous\n  // default_result_printer is removed from it and deleted. The listener can\n  // also be NULL in which case it will not be added to the list. Does\n  // nothing if the previous and the current listener objects are the same.\n  void SetDefaultResultPrinter(TestEventListener* listener);\n\n  // Sets the default_xml_generator attribute to the provided listener.  The\n  // listener is also added to the listener list and previous\n  // default_xml_generator is removed from it and deleted. The listener can\n  // also be NULL in which case it will not be added to the list. Does\n  // nothing if the previous and the current listener objects are the same.\n  void SetDefaultXmlGenerator(TestEventListener* listener);\n\n  // Controls whether events will be forwarded by the repeater to the\n  // listeners in the list.\n  bool EventForwardingEnabled() const;\n  void SuppressEventForwarding();\n\n  // The actual list of listeners.\n  internal::TestEventRepeater* repeater_;\n  // Listener responsible for the standard result output.\n  TestEventListener* default_result_printer_;\n  // Listener responsible for the creation of the XML output file.\n  TestEventListener* default_xml_generator_;\n\n  // We disallow copying TestEventListeners.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);\n};\n\n// A UnitTest consists of a vector of TestCases.\n//\n// This is a singleton class.  The only instance of UnitTest is\n// created when UnitTest::GetInstance() is first called.  This\n// instance is never deleted.\n//\n// UnitTest is not copyable.\n//\n// This class is thread-safe as long as the methods are called\n// according to their specification.\nclass GTEST_API_ UnitTest {\n public:\n  // Gets the singleton UnitTest object.  The first time this method\n  // is called, a UnitTest object is constructed and returned.\n  // Consecutive calls will return the same object.\n  static UnitTest* GetInstance();\n\n  // Runs all tests in this UnitTest object and prints the result.\n  // Returns 0 if successful, or 1 otherwise.\n  //\n  // This method can only be called from the main thread.\n  //\n  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n  int Run() GTEST_MUST_USE_RESULT_;\n\n  // Returns the working directory when the first TEST() or TEST_F()\n  // was executed.  The UnitTest object owns the string.\n  const char* original_working_dir() const;\n\n  // Returns the TestCase object for the test that's currently running,\n  // or NULL if no test is running.\n  const TestCase* current_test_case() const\n      GTEST_LOCK_EXCLUDED_(mutex_);\n\n  // Returns the TestInfo object for the test that's currently running,\n  // or NULL if no test is running.\n  const TestInfo* current_test_info() const\n      GTEST_LOCK_EXCLUDED_(mutex_);\n\n  // Returns the random seed used at the start of the current test run.\n  int random_seed() const;\n\n  // Returns the ParameterizedTestCaseRegistry object used to keep track of\n  // value-parameterized tests and instantiate and register them.\n  //\n  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n  internal::ParameterizedTestCaseRegistry& parameterized_test_registry()\n      GTEST_LOCK_EXCLUDED_(mutex_);\n\n  // Gets the number of successful test cases.\n  int successful_test_case_count() const;\n\n  // Gets the number of failed test cases.\n  int failed_test_case_count() const;\n\n  // Gets the number of all test cases.\n  int total_test_case_count() const;\n\n  // Gets the number of all test cases that contain at least one test\n  // that should run.\n  int test_case_to_run_count() const;\n\n  // Gets the number of successful tests.\n  int successful_test_count() const;\n\n  // Gets the number of failed tests.\n  int failed_test_count() const;\n\n  // Gets the number of disabled tests that will be reported in the XML report.\n  int reportable_disabled_test_count() const;\n\n  // Gets the number of disabled tests.\n  int disabled_test_count() const;\n\n  // Gets the number of tests to be printed in the XML report.\n  int reportable_test_count() const;\n\n  // Gets the number of all tests.\n  int total_test_count() const;\n\n  // Gets the number of tests that should run.\n  int test_to_run_count() const;\n\n  // Gets the time of the test program start, in ms from the start of the\n  // UNIX epoch.\n  TimeInMillis start_timestamp() const;\n\n  // Gets the elapsed time, in milliseconds.\n  TimeInMillis elapsed_time() const;\n\n  // Returns true iff the unit test passed (i.e. all test cases passed).\n  bool Passed() const;\n\n  // Returns true iff the unit test failed (i.e. some test case failed\n  // or something outside of all tests failed).\n  bool Failed() const;\n\n  // Gets the i-th test case among all the test cases. i can range from 0 to\n  // total_test_case_count() - 1. If i is not in that range, returns NULL.\n  const TestCase* GetTestCase(int i) const;\n\n  // Returns the TestResult containing information on test failures and\n  // properties logged outside of individual test cases.\n  const TestResult& ad_hoc_test_result() const;\n\n  // Returns the list of event listeners that can be used to track events\n  // inside Google Test.\n  TestEventListeners& listeners();\n\n private:\n  // Registers and returns a global test environment.  When a test\n  // program is run, all global test environments will be set-up in\n  // the order they were registered.  After all tests in the program\n  // have finished, all global test environments will be torn-down in\n  // the *reverse* order they were registered.\n  //\n  // The UnitTest object takes ownership of the given environment.\n  //\n  // This method can only be called from the main thread.\n  Environment* AddEnvironment(Environment* env);\n\n  // Adds a TestPartResult to the current TestResult object.  All\n  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)\n  // eventually call this to report their results.  The user code\n  // should use the assertion macros instead of calling this directly.\n  void AddTestPartResult(TestPartResult::Type result_type,\n                         const char* file_name,\n                         int line_number,\n                         const std::string& message,\n                         const std::string& os_stack_trace)\n      GTEST_LOCK_EXCLUDED_(mutex_);\n\n  // Adds a TestProperty to the current TestResult object when invoked from\n  // inside a test, to current TestCase's ad_hoc_test_result_ when invoked\n  // from SetUpTestCase or TearDownTestCase, or to the global property set\n  // when invoked elsewhere.  If the result already contains a property with\n  // the same key, the value will be updated.\n  void RecordProperty(const std::string& key, const std::string& value);\n\n  // Gets the i-th test case among all the test cases. i can range from 0 to\n  // total_test_case_count() - 1. If i is not in that range, returns NULL.\n  TestCase* GetMutableTestCase(int i);\n\n  // Accessors for the implementation object.\n  internal::UnitTestImpl* impl() { return impl_; }\n  const internal::UnitTestImpl* impl() const { return impl_; }\n\n  // These classes and functions are friends as they need to access private\n  // members of UnitTest.\n  friend class ScopedTrace;\n  friend class Test;\n  friend class internal::AssertHelper;\n  friend class internal::StreamingListenerTest;\n  friend class internal::UnitTestRecordPropertyTestHelper;\n  friend Environment* AddGlobalTestEnvironment(Environment* env);\n  friend internal::UnitTestImpl* internal::GetUnitTestImpl();\n  friend void internal::ReportFailureInUnknownLocation(\n      TestPartResult::Type result_type,\n      const std::string& message);\n\n  // Creates an empty UnitTest.\n  UnitTest();\n\n  // D'tor\n  virtual ~UnitTest();\n\n  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread\n  // Google Test trace stack.\n  void PushGTestTrace(const internal::TraceInfo& trace)\n      GTEST_LOCK_EXCLUDED_(mutex_);\n\n  // Pops a trace from the per-thread Google Test trace stack.\n  void PopGTestTrace()\n      GTEST_LOCK_EXCLUDED_(mutex_);\n\n  // Protects mutable state in *impl_.  This is mutable as some const\n  // methods need to lock it too.\n  mutable internal::Mutex mutex_;\n\n  // Opaque implementation object.  This field is never changed once\n  // the object is constructed.  We don't mark it as const here, as\n  // doing so will cause a warning in the constructor of UnitTest.\n  // Mutable state in *impl_ is protected by mutex_.\n  internal::UnitTestImpl* impl_;\n\n  // We disallow copying UnitTest.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);\n};\n\n// A convenient wrapper for adding an environment for the test\n// program.\n//\n// You should call this before RUN_ALL_TESTS() is called, probably in\n// main().  If you use gtest_main, you need to call this before main()\n// starts for it to take effect.  For example, you can define a global\n// variable like this:\n//\n//   testing::Environment* const foo_env =\n//       testing::AddGlobalTestEnvironment(new FooEnvironment);\n//\n// However, we strongly recommend you to write your own main() and\n// call AddGlobalTestEnvironment() there, as relying on initialization\n// of global variables makes the code harder to read and may cause\n// problems when you register multiple environments from different\n// translation units and the environments have dependencies among them\n// (remember that the compiler doesn't guarantee the order in which\n// global variables from different translation units are initialized).\ninline Environment* AddGlobalTestEnvironment(Environment* env) {\n  return UnitTest::GetInstance()->AddEnvironment(env);\n}\n\n// Initializes Google Test.  This must be called before calling\n// RUN_ALL_TESTS().  In particular, it parses a command line for the\n// flags that Google Test recognizes.  Whenever a Google Test flag is\n// seen, it is removed from argv, and *argc is decremented.\n//\n// No value is returned.  Instead, the Google Test flag variables are\n// updated.\n//\n// Calling the function for the second time has no user-visible effect.\nGTEST_API_ void InitGoogleTest(int* argc, char** argv);\n\n// This overloaded version can be used in Windows programs compiled in\n// UNICODE mode.\nGTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);\n\nnamespace internal {\n\n// Separate the error generating code from the code path to reduce the stack\n// frame size of CmpHelperEQ. This helps reduce the overhead of some sanitizers\n// when calling EXPECT_* in a tight loop.\ntemplate <typename T1, typename T2>\nAssertionResult CmpHelperEQFailure(const char* lhs_expression,\n                                   const char* rhs_expression,\n                                   const T1& lhs, const T2& rhs) {\n  return EqFailure(lhs_expression,\n                   rhs_expression,\n                   FormatForComparisonFailureMessage(lhs, rhs),\n                   FormatForComparisonFailureMessage(rhs, lhs),\n                   false);\n}\n\n// The helper function for {ASSERT|EXPECT}_EQ.\ntemplate <typename T1, typename T2>\nAssertionResult CmpHelperEQ(const char* lhs_expression,\n                            const char* rhs_expression,\n                            const T1& lhs,\n                            const T2& rhs) {\n  if (lhs == rhs) {\n    return AssertionSuccess();\n  }\n\n  return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs);\n}\n\n// With this overloaded version, we allow anonymous enums to be used\n// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums\n// can be implicitly cast to BiggestInt.\nGTEST_API_ AssertionResult CmpHelperEQ(const char* lhs_expression,\n                                       const char* rhs_expression,\n                                       BiggestInt lhs,\n                                       BiggestInt rhs);\n\n// The helper class for {ASSERT|EXPECT}_EQ.  The template argument\n// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()\n// is a null pointer literal.  The following default implementation is\n// for lhs_is_null_literal being false.\ntemplate <bool lhs_is_null_literal>\nclass EqHelper {\n public:\n  // This templatized version is for the general case.\n  template <typename T1, typename T2>\n  static AssertionResult Compare(const char* lhs_expression,\n                                 const char* rhs_expression,\n                                 const T1& lhs,\n                                 const T2& rhs) {\n    return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);\n  }\n\n  // With this overloaded version, we allow anonymous enums to be used\n  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous\n  // enums can be implicitly cast to BiggestInt.\n  //\n  // Even though its body looks the same as the above version, we\n  // cannot merge the two, as it will make anonymous enums unhappy.\n  static AssertionResult Compare(const char* lhs_expression,\n                                 const char* rhs_expression,\n                                 BiggestInt lhs,\n                                 BiggestInt rhs) {\n    return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);\n  }\n};\n\n// This specialization is used when the first argument to ASSERT_EQ()\n// is a null pointer literal, like NULL, false, or 0.\ntemplate <>\nclass EqHelper<true> {\n public:\n  // We define two overloaded versions of Compare().  The first\n  // version will be picked when the second argument to ASSERT_EQ() is\n  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or\n  // EXPECT_EQ(false, a_bool).\n  template <typename T1, typename T2>\n  static AssertionResult Compare(\n      const char* lhs_expression,\n      const char* rhs_expression,\n      const T1& lhs,\n      const T2& rhs,\n      // The following line prevents this overload from being considered if T2\n      // is not a pointer type.  We need this because ASSERT_EQ(NULL, my_ptr)\n      // expands to Compare(\"\", \"\", NULL, my_ptr), which requires a conversion\n      // to match the Secret* in the other overload, which would otherwise make\n      // this template match better.\n      typename EnableIf<!is_pointer<T2>::value>::type* = 0) {\n    return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);\n  }\n\n  // This version will be picked when the second argument to ASSERT_EQ() is a\n  // pointer, e.g. ASSERT_EQ(NULL, a_pointer).\n  template <typename T>\n  static AssertionResult Compare(\n      const char* lhs_expression,\n      const char* rhs_expression,\n      // We used to have a second template parameter instead of Secret*.  That\n      // template parameter would deduce to 'long', making this a better match\n      // than the first overload even without the first overload's EnableIf.\n      // Unfortunately, gcc with -Wconversion-null warns when \"passing NULL to\n      // non-pointer argument\" (even a deduced integral argument), so the old\n      // implementation caused warnings in user code.\n      Secret* /* lhs (NULL) */,\n      T* rhs) {\n    // We already know that 'lhs' is a null pointer.\n    return CmpHelperEQ(lhs_expression, rhs_expression,\n                       static_cast<T*>(NULL), rhs);\n  }\n};\n\n// Separate the error generating code from the code path to reduce the stack\n// frame size of CmpHelperOP. This helps reduce the overhead of some sanitizers\n// when calling EXPECT_OP in a tight loop.\ntemplate <typename T1, typename T2>\nAssertionResult CmpHelperOpFailure(const char* expr1, const char* expr2,\n                                   const T1& val1, const T2& val2,\n                                   const char* op) {\n  return AssertionFailure()\n         << \"Expected: (\" << expr1 << \") \" << op << \" (\" << expr2\n         << \"), actual: \" << FormatForComparisonFailureMessage(val1, val2)\n         << \" vs \" << FormatForComparisonFailureMessage(val2, val1);\n}\n\n// A macro for implementing the helper functions needed to implement\n// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste\n// of similar code.\n//\n// For each templatized helper function, we also define an overloaded\n// version for BiggestInt in order to reduce code bloat and allow\n// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled\n// with gcc 4.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n\n#define GTEST_IMPL_CMP_HELPER_(op_name, op)\\\ntemplate <typename T1, typename T2>\\\nAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \\\n                                   const T1& val1, const T2& val2) {\\\n  if (val1 op val2) {\\\n    return AssertionSuccess();\\\n  } else {\\\n    return CmpHelperOpFailure(expr1, expr2, val1, val2, #op);\\\n  }\\\n}\\\nGTEST_API_ AssertionResult CmpHelper##op_name(\\\n    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n\n// Implements the helper function for {ASSERT|EXPECT}_NE\nGTEST_IMPL_CMP_HELPER_(NE, !=);\n// Implements the helper function for {ASSERT|EXPECT}_LE\nGTEST_IMPL_CMP_HELPER_(LE, <=);\n// Implements the helper function for {ASSERT|EXPECT}_LT\nGTEST_IMPL_CMP_HELPER_(LT, <);\n// Implements the helper function for {ASSERT|EXPECT}_GE\nGTEST_IMPL_CMP_HELPER_(GE, >=);\n// Implements the helper function for {ASSERT|EXPECT}_GT\nGTEST_IMPL_CMP_HELPER_(GT, >);\n\n#undef GTEST_IMPL_CMP_HELPER_\n\n// The helper function for {ASSERT|EXPECT}_STREQ.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTREQ(const char* s1_expression,\n                                          const char* s2_expression,\n                                          const char* s1,\n                                          const char* s2);\n\n// The helper function for {ASSERT|EXPECT}_STRCASEEQ.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* s1_expression,\n                                              const char* s2_expression,\n                                              const char* s1,\n                                              const char* s2);\n\n// The helper function for {ASSERT|EXPECT}_STRNE.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,\n                                          const char* s2_expression,\n                                          const char* s1,\n                                          const char* s2);\n\n// The helper function for {ASSERT|EXPECT}_STRCASENE.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,\n                                              const char* s2_expression,\n                                              const char* s1,\n                                              const char* s2);\n\n\n// Helper function for *_STREQ on wide strings.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTREQ(const char* s1_expression,\n                                          const char* s2_expression,\n                                          const wchar_t* s1,\n                                          const wchar_t* s2);\n\n// Helper function for *_STRNE on wide strings.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,\n                                          const char* s2_expression,\n                                          const wchar_t* s1,\n                                          const wchar_t* s2);\n\n}  // namespace internal\n\n// IsSubstring() and IsNotSubstring() are intended to be used as the\n// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by\n// themselves.  They check whether needle is a substring of haystack\n// (NULL is considered a substring of itself only), and return an\n// appropriate error message when they fail.\n//\n// The {needle,haystack}_expr arguments are the stringified\n// expressions that generated the two real arguments.\nGTEST_API_ AssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const char* needle, const char* haystack);\nGTEST_API_ AssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const wchar_t* needle, const wchar_t* haystack);\nGTEST_API_ AssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const char* needle, const char* haystack);\nGTEST_API_ AssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const wchar_t* needle, const wchar_t* haystack);\nGTEST_API_ AssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::string& needle, const ::std::string& haystack);\nGTEST_API_ AssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::string& needle, const ::std::string& haystack);\n\n#if GTEST_HAS_STD_WSTRING\nGTEST_API_ AssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::wstring& needle, const ::std::wstring& haystack);\nGTEST_API_ AssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::wstring& needle, const ::std::wstring& haystack);\n#endif  // GTEST_HAS_STD_WSTRING\n\nnamespace internal {\n\n// Helper template function for comparing floating-points.\n//\n// Template parameter:\n//\n//   RawType: the raw floating-point type (either float or double)\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\ntemplate <typename RawType>\nAssertionResult CmpHelperFloatingPointEQ(const char* lhs_expression,\n                                         const char* rhs_expression,\n                                         RawType lhs_value,\n                                         RawType rhs_value) {\n  const FloatingPoint<RawType> lhs(lhs_value), rhs(rhs_value);\n\n  if (lhs.AlmostEquals(rhs)) {\n    return AssertionSuccess();\n  }\n\n  ::std::stringstream lhs_ss;\n  lhs_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)\n         << lhs_value;\n\n  ::std::stringstream rhs_ss;\n  rhs_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)\n         << rhs_value;\n\n  return EqFailure(lhs_expression,\n                   rhs_expression,\n                   StringStreamToString(&lhs_ss),\n                   StringStreamToString(&rhs_ss),\n                   false);\n}\n\n// Helper function for implementing ASSERT_NEAR.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,\n                                                const char* expr2,\n                                                const char* abs_error_expr,\n                                                double val1,\n                                                double val2,\n                                                double abs_error);\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n// A class that enables one to stream messages to assertion macros\nclass GTEST_API_ AssertHelper {\n public:\n  // Constructor.\n  AssertHelper(TestPartResult::Type type,\n               const char* file,\n               int line,\n               const char* message);\n  ~AssertHelper();\n\n  // Message assignment is a semantic trick to enable assertion\n  // streaming; see the GTEST_MESSAGE_ macro below.\n  void operator=(const Message& message) const;\n\n private:\n  // We put our data in a struct so that the size of the AssertHelper class can\n  // be as small as possible.  This is important because gcc is incapable of\n  // re-using stack space even for temporary variables, so every EXPECT_EQ\n  // reserves stack space for another AssertHelper.\n  struct AssertHelperData {\n    AssertHelperData(TestPartResult::Type t,\n                     const char* srcfile,\n                     int line_num,\n                     const char* msg)\n        : type(t), file(srcfile), line(line_num), message(msg) { }\n\n    TestPartResult::Type const type;\n    const char* const file;\n    int const line;\n    std::string const message;\n\n   private:\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);\n  };\n\n  AssertHelperData* const data_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);\n};\n\n}  // namespace internal\n\n// The pure interface class that all value-parameterized tests inherit from.\n// A value-parameterized class must inherit from both ::testing::Test and\n// ::testing::WithParamInterface. In most cases that just means inheriting\n// from ::testing::TestWithParam, but more complicated test hierarchies\n// may need to inherit from Test and WithParamInterface at different levels.\n//\n// This interface has support for accessing the test parameter value via\n// the GetParam() method.\n//\n// Use it with one of the parameter generator defining functions, like Range(),\n// Values(), ValuesIn(), Bool(), and Combine().\n//\n// class FooTest : public ::testing::TestWithParam<int> {\n//  protected:\n//   FooTest() {\n//     // Can use GetParam() here.\n//   }\n//   virtual ~FooTest() {\n//     // Can use GetParam() here.\n//   }\n//   virtual void SetUp() {\n//     // Can use GetParam() here.\n//   }\n//   virtual void TearDown {\n//     // Can use GetParam() here.\n//   }\n// };\n// TEST_P(FooTest, DoesBar) {\n//   // Can use GetParam() method here.\n//   Foo foo;\n//   ASSERT_TRUE(foo.DoesBar(GetParam()));\n// }\n// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));\n\ntemplate <typename T>\nclass WithParamInterface {\n public:\n  typedef T ParamType;\n  virtual ~WithParamInterface() {}\n\n  // The current parameter value. Is also available in the test fixture's\n  // constructor. This member function is non-static, even though it only\n  // references static data, to reduce the opportunity for incorrect uses\n  // like writing 'WithParamInterface<bool>::GetParam()' for a test that\n  // uses a fixture whose parameter type is int.\n  const ParamType& GetParam() const {\n    GTEST_CHECK_(parameter_ != NULL)\n        << \"GetParam() can only be called inside a value-parameterized test \"\n        << \"-- did you intend to write TEST_P instead of TEST_F?\";\n    return *parameter_;\n  }\n\n private:\n  // Sets parameter value. The caller is responsible for making sure the value\n  // remains alive and unchanged throughout the current test.\n  static void SetParam(const ParamType* parameter) {\n    parameter_ = parameter;\n  }\n\n  // Static value used for accessing parameter during a test lifetime.\n  static const ParamType* parameter_;\n\n  // TestClass must be a subclass of WithParamInterface<T> and Test.\n  template <class TestClass> friend class internal::ParameterizedTestFactory;\n};\n\ntemplate <typename T>\nconst T* WithParamInterface<T>::parameter_ = NULL;\n\n// Most value-parameterized classes can ignore the existence of\n// WithParamInterface, and can just inherit from ::testing::TestWithParam.\n\ntemplate <typename T>\nclass TestWithParam : public Test, public WithParamInterface<T> {\n};\n\n// Macros for indicating success/failure in test code.\n\n// ADD_FAILURE unconditionally adds a failure to the current test.\n// SUCCEED generates a success - it doesn't automatically make the\n// current test successful, as a test is only successful when it has\n// no failure.\n//\n// EXPECT_* verifies that a certain condition is satisfied.  If not,\n// it behaves like ADD_FAILURE.  In particular:\n//\n//   EXPECT_TRUE  verifies that a Boolean condition is true.\n//   EXPECT_FALSE verifies that a Boolean condition is false.\n//\n// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except\n// that they will also abort the current function on failure.  People\n// usually want the fail-fast behavior of FAIL and ASSERT_*, but those\n// writing data-driven tests often find themselves using ADD_FAILURE\n// and EXPECT_* more.\n\n// Generates a nonfatal failure with a generic message.\n#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_(\"Failed\")\n\n// Generates a nonfatal failure at the given source file location with\n// a generic message.\n#define ADD_FAILURE_AT(file, line) \\\n  GTEST_MESSAGE_AT_(file, line, \"Failed\", \\\n                    ::testing::TestPartResult::kNonFatalFailure)\n\n// Generates a fatal failure with a generic message.\n#define GTEST_FAIL() GTEST_FATAL_FAILURE_(\"Failed\")\n\n// Define this macro to 1 to omit the definition of FAIL(), which is a\n// generic name and clashes with some other libraries.\n#if !GTEST_DONT_DEFINE_FAIL\n# define FAIL() GTEST_FAIL()\n#endif\n\n// Generates a success with a generic message.\n#define GTEST_SUCCEED() GTEST_SUCCESS_(\"Succeeded\")\n\n// Define this macro to 1 to omit the definition of SUCCEED(), which\n// is a generic name and clashes with some other libraries.\n#if !GTEST_DONT_DEFINE_SUCCEED\n# define SUCCEED() GTEST_SUCCEED()\n#endif\n\n// Macros for testing exceptions.\n//\n//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):\n//         Tests that the statement throws the expected exception.\n//    * {ASSERT|EXPECT}_NO_THROW(statement):\n//         Tests that the statement doesn't throw any exception.\n//    * {ASSERT|EXPECT}_ANY_THROW(statement):\n//         Tests that the statement throws an exception.\n\n#define EXPECT_THROW(statement, expected_exception) \\\n  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_NO_THROW(statement) \\\n  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_ANY_THROW(statement) \\\n  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_THROW(statement, expected_exception) \\\n  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)\n#define ASSERT_NO_THROW(statement) \\\n  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)\n#define ASSERT_ANY_THROW(statement) \\\n  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)\n\n// Boolean assertions. Condition can be either a Boolean expression or an\n// AssertionResult. For more information on how to use AssertionResult with\n// these macros see comments on that class.\n#define EXPECT_TRUE(condition) \\\n  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \\\n                      GTEST_NONFATAL_FAILURE_)\n#define EXPECT_FALSE(condition) \\\n  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \\\n                      GTEST_NONFATAL_FAILURE_)\n#define ASSERT_TRUE(condition) \\\n  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \\\n                      GTEST_FATAL_FAILURE_)\n#define ASSERT_FALSE(condition) \\\n  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \\\n                      GTEST_FATAL_FAILURE_)\n\n// Macros for testing equalities and inequalities.\n//\n//    * {ASSERT|EXPECT}_EQ(v1, v2): Tests that v1 == v2\n//    * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2\n//    * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2\n//    * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2\n//    * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2\n//    * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2\n//\n// When they are not, Google Test prints both the tested expressions and\n// their actual values.  The values must be compatible built-in types,\n// or you will get a compiler error.  By \"compatible\" we mean that the\n// values can be compared by the respective operator.\n//\n// Note:\n//\n//   1. It is possible to make a user-defined type work with\n//   {ASSERT|EXPECT}_??(), but that requires overloading the\n//   comparison operators and is thus discouraged by the Google C++\n//   Usage Guide.  Therefore, you are advised to use the\n//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are\n//   equal.\n//\n//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on\n//   pointers (in particular, C strings).  Therefore, if you use it\n//   with two C strings, you are testing how their locations in memory\n//   are related, not how their content is related.  To compare two C\n//   strings by content, use {ASSERT|EXPECT}_STR*().\n//\n//   3. {ASSERT|EXPECT}_EQ(v1, v2) is preferred to\n//   {ASSERT|EXPECT}_TRUE(v1 == v2), as the former tells you\n//   what the actual value is when it fails, and similarly for the\n//   other comparisons.\n//\n//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()\n//   evaluate their arguments, which is undefined.\n//\n//   5. These macros evaluate their arguments exactly once.\n//\n// Examples:\n//\n//   EXPECT_NE(Foo(), 5);\n//   EXPECT_EQ(a_pointer, NULL);\n//   ASSERT_LT(i, array_size);\n//   ASSERT_GT(records.size(), 0) << \"There is no record left.\";\n\n#define EXPECT_EQ(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal:: \\\n                      EqHelper<GTEST_IS_NULL_LITERAL_(val1)>::Compare, \\\n                      val1, val2)\n#define EXPECT_NE(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)\n#define EXPECT_LE(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)\n#define EXPECT_LT(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)\n#define EXPECT_GE(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)\n#define EXPECT_GT(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)\n\n#define GTEST_ASSERT_EQ(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal:: \\\n                      EqHelper<GTEST_IS_NULL_LITERAL_(val1)>::Compare, \\\n                      val1, val2)\n#define GTEST_ASSERT_NE(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)\n#define GTEST_ASSERT_LE(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)\n#define GTEST_ASSERT_LT(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)\n#define GTEST_ASSERT_GE(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)\n#define GTEST_ASSERT_GT(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)\n\n// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of\n// ASSERT_XY(), which clashes with some users' own code.\n\n#if !GTEST_DONT_DEFINE_ASSERT_EQ\n# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_NE\n# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_LE\n# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_LT\n# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_GE\n# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)\n#endif\n\n#if !GTEST_DONT_DEFINE_ASSERT_GT\n# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)\n#endif\n\n// C-string Comparisons.  All tests treat NULL and any non-NULL string\n// as different.  Two NULLs are equal.\n//\n//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2\n//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2\n//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case\n//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case\n//\n// For wide or narrow string objects, you can use the\n// {ASSERT|EXPECT}_??() macros.\n//\n// Don't depend on the order in which the arguments are evaluated,\n// which is undefined.\n//\n// These macros evaluate their arguments exactly once.\n\n#define EXPECT_STREQ(s1, s2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2)\n#define EXPECT_STRNE(s1, s2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)\n#define EXPECT_STRCASEEQ(s1, s2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2)\n#define EXPECT_STRCASENE(s1, s2)\\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)\n\n#define ASSERT_STREQ(s1, s2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2)\n#define ASSERT_STRNE(s1, s2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)\n#define ASSERT_STRCASEEQ(s1, s2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2)\n#define ASSERT_STRCASENE(s1, s2)\\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)\n\n// Macros for comparing floating-point numbers.\n//\n//    * {ASSERT|EXPECT}_FLOAT_EQ(val1, val2):\n//         Tests that two float values are almost equal.\n//    * {ASSERT|EXPECT}_DOUBLE_EQ(val1, val2):\n//         Tests that two double values are almost equal.\n//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):\n//         Tests that v1 and v2 are within the given distance to each other.\n//\n// Google Test uses ULP-based comparison to automatically pick a default\n// error bound that is appropriate for the operands.  See the\n// FloatingPoint template class in gtest-internal.h if you are\n// interested in the implementation details.\n\n#define EXPECT_FLOAT_EQ(val1, val2)\\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \\\n                      val1, val2)\n\n#define EXPECT_DOUBLE_EQ(val1, val2)\\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \\\n                      val1, val2)\n\n#define ASSERT_FLOAT_EQ(val1, val2)\\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \\\n                      val1, val2)\n\n#define ASSERT_DOUBLE_EQ(val1, val2)\\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \\\n                      val1, val2)\n\n#define EXPECT_NEAR(val1, val2, abs_error)\\\n  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \\\n                      val1, val2, abs_error)\n\n#define ASSERT_NEAR(val1, val2, abs_error)\\\n  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \\\n                      val1, val2, abs_error)\n\n// These predicate format functions work on floating-point values, and\n// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.\n//\n//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);\n\n// Asserts that val1 is less than, or almost equal to, val2.  Fails\n// otherwise.  In particular, it fails if either val1 or val2 is NaN.\nGTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,\n                                   float val1, float val2);\nGTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,\n                                    double val1, double val2);\n\n\n#if GTEST_OS_WINDOWS\n\n// Macros that test for HRESULT failure and success, these are only useful\n// on Windows, and rely on Windows SDK macros and APIs to compile.\n//\n//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)\n//\n// When expr unexpectedly fails or succeeds, Google Test prints the\n// expected result and the actual result with both a human-readable\n// string representation of the error, if available, as well as the\n// hex result code.\n# define EXPECT_HRESULT_SUCCEEDED(expr) \\\n    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))\n\n# define ASSERT_HRESULT_SUCCEEDED(expr) \\\n    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))\n\n# define EXPECT_HRESULT_FAILED(expr) \\\n    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))\n\n# define ASSERT_HRESULT_FAILED(expr) \\\n    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))\n\n#endif  // GTEST_OS_WINDOWS\n\n// Macros that execute statement and check that it doesn't generate new fatal\n// failures in the current thread.\n//\n//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);\n//\n// Examples:\n//\n//   EXPECT_NO_FATAL_FAILURE(Process());\n//   ASSERT_NO_FATAL_FAILURE(Process()) << \"Process() failed\";\n//\n#define ASSERT_NO_FATAL_FAILURE(statement) \\\n    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)\n#define EXPECT_NO_FATAL_FAILURE(statement) \\\n    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)\n\n// Causes a trace (including the given source file path and line number,\n// and the given message) to be included in every test failure message generated\n// by code in the scope of the lifetime of an instance of this class. The effect\n// is undone with the destruction of the instance.\n//\n// The message argument can be anything streamable to std::ostream.\n//\n// Example:\n//   testing::ScopedTrace trace(\"file.cc\", 123, \"message\");\n//\nclass GTEST_API_ ScopedTrace {\n public:\n  // The c'tor pushes the given source file location and message onto\n  // a trace stack maintained by Google Test.\n\n  // Template version. Uses Message() to convert the values into strings.\n  // Slow, but flexible.\n  template <typename T>\n  ScopedTrace(const char* file, int line, const T& message) {\n    PushTrace(file, line, (Message() << message).GetString());\n  }\n\n  // Optimize for some known types.\n  ScopedTrace(const char* file, int line, const char* message) {\n    PushTrace(file, line, message ? message : \"(null)\");\n  }\n\n#if GTEST_HAS_GLOBAL_STRING\n  ScopedTrace(const char* file, int line, const ::string& message) {\n    PushTrace(file, line, message);\n  }\n#endif\n\n  ScopedTrace(const char* file, int line, const std::string& message) {\n    PushTrace(file, line, message);\n  }\n\n  // The d'tor pops the info pushed by the c'tor.\n  //\n  // Note that the d'tor is not virtual in order to be efficient.\n  // Don't inherit from ScopedTrace!\n  ~ScopedTrace();\n\n private:\n  void PushTrace(const char* file, int line, std::string message);\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);\n} GTEST_ATTRIBUTE_UNUSED_;  // A ScopedTrace object does its job in its\n                            // c'tor and d'tor.  Therefore it doesn't\n                            // need to be used otherwise.\n\n// Causes a trace (including the source file path, the current line\n// number, and the given message) to be included in every test failure\n// message generated by code in the current scope.  The effect is\n// undone when the control leaves the current scope.\n//\n// The message argument can be anything streamable to std::ostream.\n//\n// In the implementation, we include the current line number as part\n// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s\n// to appear in the same block - as long as they are on different\n// lines.\n//\n// Assuming that each thread maintains its own stack of traces.\n// Therefore, a SCOPED_TRACE() would (correctly) only affect the\n// assertions in its own thread.\n#define SCOPED_TRACE(message) \\\n  ::testing::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\\\n    __FILE__, __LINE__, (message))\n\n\n// Compile-time assertion for type equality.\n// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are\n// the same type.  The value it returns is not interesting.\n//\n// Instead of making StaticAssertTypeEq a class template, we make it a\n// function template that invokes a helper class template.  This\n// prevents a user from misusing StaticAssertTypeEq<T1, T2> by\n// defining objects of that type.\n//\n// CAVEAT:\n//\n// When used inside a method of a class template,\n// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is\n// instantiated.  For example, given:\n//\n//   template <typename T> class Foo {\n//    public:\n//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }\n//   };\n//\n// the code:\n//\n//   void Test1() { Foo<bool> foo; }\n//\n// will NOT generate a compiler error, as Foo<bool>::Bar() is never\n// actually instantiated.  Instead, you need:\n//\n//   void Test2() { Foo<bool> foo; foo.Bar(); }\n//\n// to cause a compiler error.\ntemplate <typename T1, typename T2>\nbool StaticAssertTypeEq() {\n  (void)internal::StaticAssertTypeEqHelper<T1, T2>();\n  return true;\n}\n\n// Defines a test.\n//\n// The first parameter is the name of the test case, and the second\n// parameter is the name of the test within the test case.\n//\n// The convention is to end the test case name with \"Test\".  For\n// example, a test case for the Foo class can be named FooTest.\n//\n// Test code should appear between braces after an invocation of\n// this macro.  Example:\n//\n//   TEST(FooTest, InitializesCorrectly) {\n//     Foo foo;\n//     EXPECT_TRUE(foo.StatusIsOK());\n//   }\n\n// Note that we call GetTestTypeId() instead of GetTypeId<\n// ::testing::Test>() here to get the type ID of testing::Test.  This\n// is to work around a suspected linker bug when using Google Test as\n// a framework on Mac OS X.  The bug causes GetTypeId<\n// ::testing::Test>() to return different values depending on whether\n// the call is from the Google Test framework itself or from user test\n// code.  GetTestTypeId() is guaranteed to always return the same\n// value, as it always calls GetTypeId<>() from the Google Test\n// framework.\n#define GTEST_TEST(test_case_name, test_name)\\\n  GTEST_TEST_(test_case_name, test_name, \\\n              ::testing::Test, ::testing::internal::GetTestTypeId())\n\n// Define this macro to 1 to omit the definition of TEST(), which\n// is a generic name and clashes with some other libraries.\n#if !GTEST_DONT_DEFINE_TEST\n# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)\n#endif\n\n// Defines a test that uses a test fixture.\n//\n// The first parameter is the name of the test fixture class, which\n// also doubles as the test case name.  The second parameter is the\n// name of the test within the test case.\n//\n// A test fixture class must be declared earlier.  The user should put\n// the test code between braces after using this macro.  Example:\n//\n//   class FooTest : public testing::Test {\n//    protected:\n//     virtual void SetUp() { b_.AddElement(3); }\n//\n//     Foo a_;\n//     Foo b_;\n//   };\n//\n//   TEST_F(FooTest, InitializesCorrectly) {\n//     EXPECT_TRUE(a_.StatusIsOK());\n//   }\n//\n//   TEST_F(FooTest, ReturnsElementCountCorrectly) {\n//     EXPECT_EQ(a_.size(), 0);\n//     EXPECT_EQ(b_.size(), 1);\n//   }\n\n#define TEST_F(test_fixture, test_name)\\\n  GTEST_TEST_(test_fixture, test_name, test_fixture, \\\n              ::testing::internal::GetTypeId<test_fixture>())\n\n// Returns a path to temporary directory.\n// Tries to determine an appropriate directory for the platform.\nGTEST_API_ std::string TempDir();\n\n#ifdef _MSC_VER\n#  pragma warning(pop)\n#endif\n\n}  // namespace testing\n\n// Use this function in main() to run all tests.  It returns 0 if all\n// tests are successful, or 1 otherwise.\n//\n// RUN_ALL_TESTS() should be invoked after the command line has been\n// parsed by InitGoogleTest().\n//\n// This function was formerly a macro; thus, it is in the global\n// namespace and has an all-caps name.\nint RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;\n\ninline int RUN_ALL_TESTS() {\n  return ::testing::UnitTest::GetInstance()->Run();\n}\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/gtest_pred_impl.h",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// This file is AUTOMATICALLY GENERATED on 01/02/2018 by command\n// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!\n//\n// Implements a family of generic predicate assertion macros.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n\n#include \"gtest/gtest.h\"\n\nnamespace testing {\n\n// This header implements a family of generic predicate assertion\n// macros:\n//\n//   ASSERT_PRED_FORMAT1(pred_format, v1)\n//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)\n//   ...\n//\n// where pred_format is a function or functor that takes n (in the\n// case of ASSERT_PRED_FORMATn) values and their source expression\n// text, and returns a testing::AssertionResult.  See the definition\n// of ASSERT_EQ in gtest.h for an example.\n//\n// If you don't care about formatting, you can use the more\n// restrictive version:\n//\n//   ASSERT_PRED1(pred, v1)\n//   ASSERT_PRED2(pred, v1, v2)\n//   ...\n//\n// where pred is an n-ary function or functor that returns bool,\n// and the values v1, v2, ..., must support the << operator for\n// streaming to std::ostream.\n//\n// We also define the EXPECT_* variations.\n//\n// For now we only support predicates whose arity is at most 5.\n\n// GTEST_ASSERT_ is the basic statement to which all of the assertions\n// in this file reduce.  Don't use this in your code.\n\n#define GTEST_ASSERT_(expression, on_failure) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (const ::testing::AssertionResult gtest_ar = (expression)) \\\n    ; \\\n  else \\\n    on_failure(gtest_ar.failure_message())\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1>\nAssertionResult AssertPred1Helper(const char* pred_text,\n                                  const char* e1,\n                                  Pred pred,\n                                  const T1& v1) {\n  if (pred(v1)) return AssertionSuccess();\n\n  return AssertionFailure() << pred_text << \"(\"\n                            << e1 << \") evaluates to false, where\"\n                            << \"\\n\" << e1 << \" evaluates to \" << v1;\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, v1), \\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use\n// this in your code.\n#define GTEST_PRED1_(pred, v1, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \\\n                                             #v1, \\\n                                             pred, \\\n                                             v1), on_failure)\n\n// Unary predicate assertion macros.\n#define EXPECT_PRED_FORMAT1(pred_format, v1) \\\n  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED1(pred, v1) \\\n  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT1(pred_format, v1) \\\n  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED1(pred, v1) \\\n  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)\n\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1,\n          typename T2>\nAssertionResult AssertPred2Helper(const char* pred_text,\n                                  const char* e1,\n                                  const char* e2,\n                                  Pred pred,\n                                  const T1& v1,\n                                  const T2& v2) {\n  if (pred(v1, v2)) return AssertionSuccess();\n\n  return AssertionFailure() << pred_text << \"(\"\n                            << e1 << \", \"\n                            << e2 << \") evaluates to false, where\"\n                            << \"\\n\" << e1 << \" evaluates to \" << v1\n                            << \"\\n\" << e2 << \" evaluates to \" << v2;\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use\n// this in your code.\n#define GTEST_PRED2_(pred, v1, v2, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \\\n                                             #v1, \\\n                                             #v2, \\\n                                             pred, \\\n                                             v1, \\\n                                             v2), on_failure)\n\n// Binary predicate assertion macros.\n#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \\\n  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED2(pred, v1, v2) \\\n  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \\\n  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED2(pred, v1, v2) \\\n  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)\n\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1,\n          typename T2,\n          typename T3>\nAssertionResult AssertPred3Helper(const char* pred_text,\n                                  const char* e1,\n                                  const char* e2,\n                                  const char* e3,\n                                  Pred pred,\n                                  const T1& v1,\n                                  const T2& v2,\n                                  const T3& v3) {\n  if (pred(v1, v2, v3)) return AssertionSuccess();\n\n  return AssertionFailure() << pred_text << \"(\"\n                            << e1 << \", \"\n                            << e2 << \", \"\n                            << e3 << \") evaluates to false, where\"\n                            << \"\\n\" << e1 << \" evaluates to \" << v1\n                            << \"\\n\" << e2 << \" evaluates to \" << v2\n                            << \"\\n\" << e3 << \" evaluates to \" << v3;\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use\n// this in your code.\n#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \\\n                                             #v1, \\\n                                             #v2, \\\n                                             #v3, \\\n                                             pred, \\\n                                             v1, \\\n                                             v2, \\\n                                             v3), on_failure)\n\n// Ternary predicate assertion macros.\n#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \\\n  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED3(pred, v1, v2, v3) \\\n  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \\\n  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED3(pred, v1, v2, v3) \\\n  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)\n\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1,\n          typename T2,\n          typename T3,\n          typename T4>\nAssertionResult AssertPred4Helper(const char* pred_text,\n                                  const char* e1,\n                                  const char* e2,\n                                  const char* e3,\n                                  const char* e4,\n                                  Pred pred,\n                                  const T1& v1,\n                                  const T2& v2,\n                                  const T3& v3,\n                                  const T4& v4) {\n  if (pred(v1, v2, v3, v4)) return AssertionSuccess();\n\n  return AssertionFailure() << pred_text << \"(\"\n                            << e1 << \", \"\n                            << e2 << \", \"\n                            << e3 << \", \"\n                            << e4 << \") evaluates to false, where\"\n                            << \"\\n\" << e1 << \" evaluates to \" << v1\n                            << \"\\n\" << e2 << \" evaluates to \" << v2\n                            << \"\\n\" << e3 << \" evaluates to \" << v3\n                            << \"\\n\" << e4 << \" evaluates to \" << v4;\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use\n// this in your code.\n#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \\\n                                             #v1, \\\n                                             #v2, \\\n                                             #v3, \\\n                                             #v4, \\\n                                             pred, \\\n                                             v1, \\\n                                             v2, \\\n                                             v3, \\\n                                             v4), on_failure)\n\n// 4-ary predicate assertion macros.\n#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \\\n  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED4(pred, v1, v2, v3, v4) \\\n  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \\\n  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED4(pred, v1, v2, v3, v4) \\\n  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)\n\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1,\n          typename T2,\n          typename T3,\n          typename T4,\n          typename T5>\nAssertionResult AssertPred5Helper(const char* pred_text,\n                                  const char* e1,\n                                  const char* e2,\n                                  const char* e3,\n                                  const char* e4,\n                                  const char* e5,\n                                  Pred pred,\n                                  const T1& v1,\n                                  const T2& v2,\n                                  const T3& v3,\n                                  const T4& v4,\n                                  const T5& v5) {\n  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();\n\n  return AssertionFailure() << pred_text << \"(\"\n                            << e1 << \", \"\n                            << e2 << \", \"\n                            << e3 << \", \"\n                            << e4 << \", \"\n                            << e5 << \") evaluates to false, where\"\n                            << \"\\n\" << e1 << \" evaluates to \" << v1\n                            << \"\\n\" << e2 << \" evaluates to \" << v2\n                            << \"\\n\" << e3 << \" evaluates to \" << v3\n                            << \"\\n\" << e4 << \" evaluates to \" << v4\n                            << \"\\n\" << e5 << \" evaluates to \" << v5;\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use\n// this in your code.\n#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \\\n                                             #v1, \\\n                                             #v2, \\\n                                             #v3, \\\n                                             #v4, \\\n                                             #v5, \\\n                                             pred, \\\n                                             v1, \\\n                                             v2, \\\n                                             v3, \\\n                                             v4, \\\n                                             v5), on_failure)\n\n// 5-ary predicate assertion macros.\n#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \\\n  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \\\n  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \\\n  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \\\n  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)\n\n\n\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/gtest_prod.h",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Google C++ Testing and Mocking Framework definitions useful in production code.\n// GOOGLETEST_CM0003 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_\n#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_\n\n// When you need to test the private or protected members of a class,\n// use the FRIEND_TEST macro to declare your tests as friends of the\n// class.  For example:\n//\n// class MyClass {\n//  private:\n//   void PrivateMethod();\n//   FRIEND_TEST(MyClassTest, PrivateMethodWorks);\n// };\n//\n// class MyClassTest : public testing::Test {\n//   // ...\n// };\n//\n// TEST_F(MyClassTest, PrivateMethodWorks) {\n//   // Can call MyClass::PrivateMethod() here.\n// }\n//\n// Note: The test class must be in the same namespace as the class being tested.\n// For example, putting MyClassTest in an anonymous namespace will not work.\n\n#define FRIEND_TEST(test_case_name, test_name)\\\nfriend class test_case_name##_##test_name##_Test\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_PROD_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/custom/README.md",
    "content": "# Customization Points\n\nThe custom directory is an injection point for custom user configurations.\n\n## Header `gtest.h`\n\n### The following macros can be defined:\n\n*   `GTEST_OS_STACK_TRACE_GETTER_` - The name of an implementation of\n    `OsStackTraceGetterInterface`.\n*   `GTEST_CUSTOM_TEMPDIR_FUNCTION_` - An override for `testing::TempDir()`. See\n    `testing::TempDir` for semantics and signature.\n\n## Header `gtest-port.h`\n\nThe following macros can be defined:\n\n### Flag related macros:\n\n*   `GTEST_FLAG(flag_name)`\n*   `GTEST_USE_OWN_FLAGFILE_FLAG_` - Define to 0 when the system provides its\n    own flagfile flag parsing.\n*   `GTEST_DECLARE_bool_(name)`\n*   `GTEST_DECLARE_int32_(name)`\n*   `GTEST_DECLARE_string_(name)`\n*   `GTEST_DEFINE_bool_(name, default_val, doc)`\n*   `GTEST_DEFINE_int32_(name, default_val, doc)`\n*   `GTEST_DEFINE_string_(name, default_val, doc)`\n\n### Logging:\n\n*   `GTEST_LOG_(severity)`\n*   `GTEST_CHECK_(condition)`\n*   Functions `LogToStderr()` and `FlushInfoLog()` have to be provided too.\n\n### Threading:\n\n*   `GTEST_HAS_NOTIFICATION_` - Enabled if Notification is already provided.\n*   `GTEST_HAS_MUTEX_AND_THREAD_LOCAL_` - Enabled if `Mutex` and `ThreadLocal`\n    are already provided. Must also provide `GTEST_DECLARE_STATIC_MUTEX_(mutex)`\n    and `GTEST_DEFINE_STATIC_MUTEX_(mutex)`\n*   `GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)`\n*   `GTEST_LOCK_EXCLUDED_(locks)`\n\n### Underlying library support features\n\n*   `GTEST_HAS_CXXABI_H_`\n\n### Exporting API symbols:\n\n*   `GTEST_API_` - Specifier for exported symbols.\n\n## Header `gtest-printers.h`\n\n*   See documentation at `gtest/gtest-printers.h` for details on how to define a\n    custom printer.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/custom/gtest-port.h",
    "content": "// Copyright 2015, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Injection point for custom user configurations. See README for details\n//\n// ** Custom implementation starts here **\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/custom/gtest-printers.h",
    "content": "// Copyright 2015, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// This file provides an injection point for custom printers in a local\n// installation of gTest.\n// It will be included from gtest-printers.h and the overrides in this file\n// will be visible to everyone.\n//\n// Injection point for custom user configurations. See README for details\n//\n// ** Custom implementation starts here **\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/custom/gtest.h",
    "content": "// Copyright 2015, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Injection point for custom user configurations. See README for details\n//\n// ** Custom implementation starts here **\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/gtest-death-test-internal.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This header file defines internal utilities needed for implementing\n// death tests.  They are subject to change without notice.\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_\n\n#include \"gtest/internal/gtest-internal.h\"\n\n#include <stdio.h>\n\nnamespace testing {\nnamespace internal {\n\nGTEST_DECLARE_string_(internal_run_death_test);\n\n// Names of the flags (needed for parsing Google Test flags).\nconst char kDeathTestStyleFlag[] = \"death_test_style\";\nconst char kDeathTestUseFork[] = \"death_test_use_fork\";\nconst char kInternalRunDeathTestFlag[] = \"internal_run_death_test\";\n\n#if GTEST_HAS_DEATH_TEST\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\n// DeathTest is a class that hides much of the complexity of the\n// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method\n// returns a concrete class that depends on the prevailing death test\n// style, as defined by the --gtest_death_test_style and/or\n// --gtest_internal_run_death_test flags.\n\n// In describing the results of death tests, these terms are used with\n// the corresponding definitions:\n//\n// exit status:  The integer exit information in the format specified\n//               by wait(2)\n// exit code:    The integer code passed to exit(3), _exit(2), or\n//               returned from main()\nclass GTEST_API_ DeathTest {\n public:\n  // Create returns false if there was an error determining the\n  // appropriate action to take for the current death test; for example,\n  // if the gtest_death_test_style flag is set to an invalid value.\n  // The LastMessage method will return a more detailed message in that\n  // case.  Otherwise, the DeathTest pointer pointed to by the \"test\"\n  // argument is set.  If the death test should be skipped, the pointer\n  // is set to NULL; otherwise, it is set to the address of a new concrete\n  // DeathTest object that controls the execution of the current test.\n  static bool Create(const char* statement, const RE* regex,\n                     const char* file, int line, DeathTest** test);\n  DeathTest();\n  virtual ~DeathTest() { }\n\n  // A helper class that aborts a death test when it's deleted.\n  class ReturnSentinel {\n   public:\n    explicit ReturnSentinel(DeathTest* test) : test_(test) { }\n    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }\n   private:\n    DeathTest* const test_;\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);\n  } GTEST_ATTRIBUTE_UNUSED_;\n\n  // An enumeration of possible roles that may be taken when a death\n  // test is encountered.  EXECUTE means that the death test logic should\n  // be executed immediately.  OVERSEE means that the program should prepare\n  // the appropriate environment for a child process to execute the death\n  // test, then wait for it to complete.\n  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };\n\n  // An enumeration of the three reasons that a test might be aborted.\n  enum AbortReason {\n    TEST_ENCOUNTERED_RETURN_STATEMENT,\n    TEST_THREW_EXCEPTION,\n    TEST_DID_NOT_DIE\n  };\n\n  // Assumes one of the above roles.\n  virtual TestRole AssumeRole() = 0;\n\n  // Waits for the death test to finish and returns its status.\n  virtual int Wait() = 0;\n\n  // Returns true if the death test passed; that is, the test process\n  // exited during the test, its exit status matches a user-supplied\n  // predicate, and its stderr output matches a user-supplied regular\n  // expression.\n  // The user-supplied predicate may be a macro expression rather\n  // than a function pointer or functor, or else Wait and Passed could\n  // be combined.\n  virtual bool Passed(bool exit_status_ok) = 0;\n\n  // Signals that the death test did not die as expected.\n  virtual void Abort(AbortReason reason) = 0;\n\n  // Returns a human-readable outcome message regarding the outcome of\n  // the last death test.\n  static const char* LastMessage();\n\n  static void set_last_death_test_message(const std::string& message);\n\n private:\n  // A string containing a description of the outcome of the last death test.\n  static std::string last_death_test_message_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);\n};\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n// Factory interface for death tests.  May be mocked out for testing.\nclass DeathTestFactory {\n public:\n  virtual ~DeathTestFactory() { }\n  virtual bool Create(const char* statement, const RE* regex,\n                      const char* file, int line, DeathTest** test) = 0;\n};\n\n// A concrete DeathTestFactory implementation for normal use.\nclass DefaultDeathTestFactory : public DeathTestFactory {\n public:\n  virtual bool Create(const char* statement, const RE* regex,\n                      const char* file, int line, DeathTest** test);\n};\n\n// Returns true if exit_status describes a process that was terminated\n// by a signal, or exited normally with a nonzero exit code.\nGTEST_API_ bool ExitedUnsuccessfully(int exit_status);\n\n// Traps C++ exceptions escaping statement and reports them as test\n// failures. Note that trapping SEH exceptions is not implemented here.\n# if GTEST_HAS_EXCEPTIONS\n#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \\\n  try { \\\n    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n  } catch (const ::std::exception& gtest_exception) { \\\n    fprintf(\\\n        stderr, \\\n        \"\\n%s: Caught std::exception-derived exception escaping the \" \\\n        \"death test statement. Exception message: %s\\n\", \\\n        ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \\\n        gtest_exception.what()); \\\n    fflush(stderr); \\\n    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \\\n  } catch (...) { \\\n    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \\\n  }\n\n# else\n#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \\\n  GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)\n\n# endif\n\n// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,\n// ASSERT_EXIT*, and EXPECT_EXIT*.\n# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (::testing::internal::AlwaysTrue()) { \\\n    const ::testing::internal::RE& gtest_regex = (regex); \\\n    ::testing::internal::DeathTest* gtest_dt; \\\n    if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \\\n        __FILE__, __LINE__, &gtest_dt)) { \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \\\n    } \\\n    if (gtest_dt != NULL) { \\\n      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \\\n          gtest_dt_ptr(gtest_dt); \\\n      switch (gtest_dt->AssumeRole()) { \\\n        case ::testing::internal::DeathTest::OVERSEE_TEST: \\\n          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \\\n            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \\\n          } \\\n          break; \\\n        case ::testing::internal::DeathTest::EXECUTE_TEST: { \\\n          ::testing::internal::DeathTest::ReturnSentinel \\\n              gtest_sentinel(gtest_dt); \\\n          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \\\n          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \\\n          break; \\\n        } \\\n        default: \\\n          break; \\\n      } \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \\\n      fail(::testing::internal::DeathTest::LastMessage())\n// The symbol \"fail\" here expands to something into which a message\n// can be streamed.\n\n// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in\n// NDEBUG mode. In this case we need the statements to be executed and the macro\n// must accept a streamed message even though the message is never printed.\n// The regex object is not evaluated, but it is used to prevent \"unused\"\n// warnings and to avoid an expression that doesn't compile in debug mode.\n#define GTEST_EXECUTE_STATEMENT_(statement, regex)             \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_                                \\\n  if (::testing::internal::AlwaysTrue()) {                     \\\n    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n  } else if (!::testing::internal::AlwaysTrue()) {             \\\n    const ::testing::internal::RE& gtest_regex = (regex);      \\\n    static_cast<void>(gtest_regex);                            \\\n  } else                                                       \\\n    ::testing::Message()\n\n// A class representing the parsed contents of the\n// --gtest_internal_run_death_test flag, as it existed when\n// RUN_ALL_TESTS was called.\nclass InternalRunDeathTestFlag {\n public:\n  InternalRunDeathTestFlag(const std::string& a_file,\n                           int a_line,\n                           int an_index,\n                           int a_write_fd)\n      : file_(a_file), line_(a_line), index_(an_index),\n        write_fd_(a_write_fd) {}\n\n  ~InternalRunDeathTestFlag() {\n    if (write_fd_ >= 0)\n      posix::Close(write_fd_);\n  }\n\n  const std::string& file() const { return file_; }\n  int line() const { return line_; }\n  int index() const { return index_; }\n  int write_fd() const { return write_fd_; }\n\n private:\n  std::string file_;\n  int line_;\n  int index_;\n  int write_fd_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);\n};\n\n// Returns a newly created InternalRunDeathTestFlag object with fields\n// initialized from the GTEST_FLAG(internal_run_death_test) flag if\n// the flag is specified; otherwise returns NULL.\nInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/gtest-filepath.h",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Google Test filepath utilities\n//\n// This header file declares classes and functions used internally by\n// Google Test.  They are subject to change without notice.\n//\n// This file is #included in gtest/internal/gtest-internal.h.\n// Do not include this header file separately!\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_\n\n#include \"gtest/internal/gtest-string.h\"\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\nnamespace testing {\nnamespace internal {\n\n// FilePath - a class for file and directory pathname manipulation which\n// handles platform-specific conventions (like the pathname separator).\n// Used for helper functions for naming files in a directory for xml output.\n// Except for Set methods, all methods are const or static, which provides an\n// \"immutable value object\" -- useful for peace of mind.\n// A FilePath with a value ending in a path separator (\"like/this/\") represents\n// a directory, otherwise it is assumed to represent a file. In either case,\n// it may or may not represent an actual file or directory in the file system.\n// Names are NOT checked for syntax correctness -- no checking for illegal\n// characters, malformed paths, etc.\n\nclass GTEST_API_ FilePath {\n public:\n  FilePath() : pathname_(\"\") { }\n  FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }\n\n  explicit FilePath(const std::string& pathname) : pathname_(pathname) {\n    Normalize();\n  }\n\n  FilePath& operator=(const FilePath& rhs) {\n    Set(rhs);\n    return *this;\n  }\n\n  void Set(const FilePath& rhs) {\n    pathname_ = rhs.pathname_;\n  }\n\n  const std::string& string() const { return pathname_; }\n  const char* c_str() const { return pathname_.c_str(); }\n\n  // Returns the current working directory, or \"\" if unsuccessful.\n  static FilePath GetCurrentDir();\n\n  // Given directory = \"dir\", base_name = \"test\", number = 0,\n  // extension = \"xml\", returns \"dir/test.xml\". If number is greater\n  // than zero (e.g., 12), returns \"dir/test_12.xml\".\n  // On Windows platform, uses \\ as the separator rather than /.\n  static FilePath MakeFileName(const FilePath& directory,\n                               const FilePath& base_name,\n                               int number,\n                               const char* extension);\n\n  // Given directory = \"dir\", relative_path = \"test.xml\",\n  // returns \"dir/test.xml\".\n  // On Windows, uses \\ as the separator rather than /.\n  static FilePath ConcatPaths(const FilePath& directory,\n                              const FilePath& relative_path);\n\n  // Returns a pathname for a file that does not currently exist. The pathname\n  // will be directory/base_name.extension or\n  // directory/base_name_<number>.extension if directory/base_name.extension\n  // already exists. The number will be incremented until a pathname is found\n  // that does not already exist.\n  // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.\n  // There could be a race condition if two or more processes are calling this\n  // function at the same time -- they could both pick the same filename.\n  static FilePath GenerateUniqueFileName(const FilePath& directory,\n                                         const FilePath& base_name,\n                                         const char* extension);\n\n  // Returns true iff the path is \"\".\n  bool IsEmpty() const { return pathname_.empty(); }\n\n  // If input name has a trailing separator character, removes it and returns\n  // the name, otherwise return the name string unmodified.\n  // On Windows platform, uses \\ as the separator, other platforms use /.\n  FilePath RemoveTrailingPathSeparator() const;\n\n  // Returns a copy of the FilePath with the directory part removed.\n  // Example: FilePath(\"path/to/file\").RemoveDirectoryName() returns\n  // FilePath(\"file\"). If there is no directory part (\"just_a_file\"), it returns\n  // the FilePath unmodified. If there is no file part (\"just_a_dir/\") it\n  // returns an empty FilePath (\"\").\n  // On Windows platform, '\\' is the path separator, otherwise it is '/'.\n  FilePath RemoveDirectoryName() const;\n\n  // RemoveFileName returns the directory path with the filename removed.\n  // Example: FilePath(\"path/to/file\").RemoveFileName() returns \"path/to/\".\n  // If the FilePath is \"a_file\" or \"/a_file\", RemoveFileName returns\n  // FilePath(\"./\") or, on Windows, FilePath(\".\\\\\"). If the filepath does\n  // not have a file, like \"just/a/dir/\", it returns the FilePath unmodified.\n  // On Windows platform, '\\' is the path separator, otherwise it is '/'.\n  FilePath RemoveFileName() const;\n\n  // Returns a copy of the FilePath with the case-insensitive extension removed.\n  // Example: FilePath(\"dir/file.exe\").RemoveExtension(\"EXE\") returns\n  // FilePath(\"dir/file\"). If a case-insensitive extension is not\n  // found, returns a copy of the original FilePath.\n  FilePath RemoveExtension(const char* extension) const;\n\n  // Creates directories so that path exists. Returns true if successful or if\n  // the directories already exist; returns false if unable to create\n  // directories for any reason. Will also return false if the FilePath does\n  // not represent a directory (that is, it doesn't end with a path separator).\n  bool CreateDirectoriesRecursively() const;\n\n  // Create the directory so that path exists. Returns true if successful or\n  // if the directory already exists; returns false if unable to create the\n  // directory for any reason, including if the parent directory does not\n  // exist. Not named \"CreateDirectory\" because that's a macro on Windows.\n  bool CreateFolder() const;\n\n  // Returns true if FilePath describes something in the file-system,\n  // either a file, directory, or whatever, and that something exists.\n  bool FileOrDirectoryExists() const;\n\n  // Returns true if pathname describes a directory in the file-system\n  // that exists.\n  bool DirectoryExists() const;\n\n  // Returns true if FilePath ends with a path separator, which indicates that\n  // it is intended to represent a directory. Returns false otherwise.\n  // This does NOT check that a directory (or file) actually exists.\n  bool IsDirectory() const;\n\n  // Returns true if pathname describes a root directory. (Windows has one\n  // root directory per disk drive.)\n  bool IsRootDirectory() const;\n\n  // Returns true if pathname describes an absolute path.\n  bool IsAbsolutePath() const;\n\n private:\n  // Replaces multiple consecutive separators with a single separator.\n  // For example, \"bar///foo\" becomes \"bar/foo\". Does not eliminate other\n  // redundancies that might be in a pathname involving \".\" or \"..\".\n  //\n  // A pathname with multiple consecutive separators may occur either through\n  // user error or as a result of some scripts or APIs that generate a pathname\n  // with a trailing separator. On other platforms the same API or script\n  // may NOT generate a pathname with a trailing \"/\". Then elsewhere that\n  // pathname may have another \"/\" and pathname components added to it,\n  // without checking for the separator already being there.\n  // The script language and operating system may allow paths like \"foo//bar\"\n  // but some of the functions in FilePath will not handle that correctly. In\n  // particular, RemoveTrailingPathSeparator() only removes one separator, and\n  // it is called in CreateDirectoriesRecursively() assuming that it will change\n  // a pathname from directory syntax (trailing separator) to filename syntax.\n  //\n  // On Windows this method also replaces the alternate path separator '/' with\n  // the primary path separator '\\\\', so that for example \"bar\\\\/\\\\foo\" becomes\n  // \"bar\\\\foo\".\n\n  void Normalize();\n\n  // Returns a pointer to the last occurence of a valid path separator in\n  // the FilePath. On Windows, for example, both '/' and '\\' are valid path\n  // separators. Returns NULL if no path separator was found.\n  const char* FindLastPathSeparator() const;\n\n  std::string pathname_;\n};  // class FilePath\n\n}  // namespace internal\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/gtest-internal.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This header file declares functions and macros used internally by\n// Google Test.  They are subject to change without notice.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_\n\n#include \"gtest/internal/gtest-port.h\"\n\n#if GTEST_OS_LINUX\n# include <stdlib.h>\n# include <sys/types.h>\n# include <sys/wait.h>\n# include <unistd.h>\n#endif  // GTEST_OS_LINUX\n\n#if GTEST_HAS_EXCEPTIONS\n# include <stdexcept>\n#endif\n\n#include <ctype.h>\n#include <float.h>\n#include <string.h>\n#include <iomanip>\n#include <limits>\n#include <map>\n#include <set>\n#include <string>\n#include <vector>\n\n#include \"gtest/gtest-message.h\"\n#include \"gtest/internal/gtest-filepath.h\"\n#include \"gtest/internal/gtest-string.h\"\n#include \"gtest/internal/gtest-type-util.h\"\n\n// Due to C++ preprocessor weirdness, we need double indirection to\n// concatenate two tokens when one of them is __LINE__.  Writing\n//\n//   foo ## __LINE__\n//\n// will result in the token foo__LINE__, instead of foo followed by\n// the current line number.  For more details, see\n// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6\n#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)\n#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar\n\n// Stringifies its argument.\n#define GTEST_STRINGIFY_(name) #name\n\nclass ProtocolMessage;\nnamespace proto2 { class Message; }\n\nnamespace testing {\n\n// Forward declarations.\n\nclass AssertionResult;                 // Result of an assertion.\nclass Message;                         // Represents a failure message.\nclass Test;                            // Represents a test.\nclass TestInfo;                        // Information about a test.\nclass TestPartResult;                  // Result of a test part.\nclass UnitTest;                        // A collection of test cases.\n\ntemplate <typename T>\n::std::string PrintToString(const T& value);\n\nnamespace internal {\n\nstruct TraceInfo;                      // Information about a trace point.\nclass TestInfoImpl;                    // Opaque implementation of TestInfo\nclass UnitTestImpl;                    // Opaque implementation of UnitTest\n\n// The text used in failure messages to indicate the start of the\n// stack trace.\nGTEST_API_ extern const char kStackTraceMarker[];\n\n// Two overloaded helpers for checking at compile time whether an\n// expression is a null pointer literal (i.e. NULL or any 0-valued\n// compile-time integral constant).  Their return values have\n// different sizes, so we can use sizeof() to test which version is\n// picked by the compiler.  These helpers have no implementations, as\n// we only need their signatures.\n//\n// Given IsNullLiteralHelper(x), the compiler will pick the first\n// version if x can be implicitly converted to Secret*, and pick the\n// second version otherwise.  Since Secret is a secret and incomplete\n// type, the only expression a user can write that has type Secret* is\n// a null pointer literal.  Therefore, we know that x is a null\n// pointer literal if and only if the first version is picked by the\n// compiler.\nchar IsNullLiteralHelper(Secret* p);\nchar (&IsNullLiteralHelper(...))[2];  // NOLINT\n\n// A compile-time bool constant that is true if and only if x is a\n// null pointer literal (i.e. NULL or any 0-valued compile-time\n// integral constant).\n#ifdef GTEST_ELLIPSIS_NEEDS_POD_\n// We lose support for NULL detection where the compiler doesn't like\n// passing non-POD classes through ellipsis (...).\n# define GTEST_IS_NULL_LITERAL_(x) false\n#else\n# define GTEST_IS_NULL_LITERAL_(x) \\\n    (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)\n#endif  // GTEST_ELLIPSIS_NEEDS_POD_\n\n// Appends the user-supplied message to the Google-Test-generated message.\nGTEST_API_ std::string AppendUserMessage(\n    const std::string& gtest_msg, const Message& user_msg);\n\n#if GTEST_HAS_EXCEPTIONS\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4275 \\\n/* an exported class was derived from a class that was not exported */)\n\n// This exception is thrown by (and only by) a failed Google Test\n// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions\n// are enabled).  We derive it from std::runtime_error, which is for\n// errors presumably detectable only at run time.  Since\n// std::runtime_error inherits from std::exception, many testing\n// frameworks know how to extract and print the message inside it.\nclass GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {\n public:\n  explicit GoogleTestFailureException(const TestPartResult& failure);\n};\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4275\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\nnamespace edit_distance {\n// Returns the optimal edits to go from 'left' to 'right'.\n// All edits cost the same, with replace having lower priority than\n// add/remove.\n// Simple implementation of the Wagner-Fischer algorithm.\n// See http://en.wikipedia.org/wiki/Wagner-Fischer_algorithm\nenum EditType { kMatch, kAdd, kRemove, kReplace };\nGTEST_API_ std::vector<EditType> CalculateOptimalEdits(\n    const std::vector<size_t>& left, const std::vector<size_t>& right);\n\n// Same as above, but the input is represented as strings.\nGTEST_API_ std::vector<EditType> CalculateOptimalEdits(\n    const std::vector<std::string>& left,\n    const std::vector<std::string>& right);\n\n// Create a diff of the input strings in Unified diff format.\nGTEST_API_ std::string CreateUnifiedDiff(const std::vector<std::string>& left,\n                                         const std::vector<std::string>& right,\n                                         size_t context = 2);\n\n}  // namespace edit_distance\n\n// Calculate the diff between 'left' and 'right' and return it in unified diff\n// format.\n// If not null, stores in 'total_line_count' the total number of lines found\n// in left + right.\nGTEST_API_ std::string DiffStrings(const std::string& left,\n                                   const std::string& right,\n                                   size_t* total_line_count);\n\n// Constructs and returns the message for an equality assertion\n// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.\n//\n// The first four parameters are the expressions used in the assertion\n// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)\n// where foo is 5 and bar is 6, we have:\n//\n//   expected_expression: \"foo\"\n//   actual_expression:   \"bar\"\n//   expected_value:      \"5\"\n//   actual_value:        \"6\"\n//\n// The ignoring_case parameter is true iff the assertion is a\n// *_STRCASEEQ*.  When it's true, the string \" (ignoring case)\" will\n// be inserted into the message.\nGTEST_API_ AssertionResult EqFailure(const char* expected_expression,\n                                     const char* actual_expression,\n                                     const std::string& expected_value,\n                                     const std::string& actual_value,\n                                     bool ignoring_case);\n\n// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.\nGTEST_API_ std::string GetBoolAssertionFailureMessage(\n    const AssertionResult& assertion_result,\n    const char* expression_text,\n    const char* actual_predicate_value,\n    const char* expected_predicate_value);\n\n// This template class represents an IEEE floating-point number\n// (either single-precision or double-precision, depending on the\n// template parameters).\n//\n// The purpose of this class is to do more sophisticated number\n// comparison.  (Due to round-off error, etc, it's very unlikely that\n// two floating-points will be equal exactly.  Hence a naive\n// comparison by the == operation often doesn't work.)\n//\n// Format of IEEE floating-point:\n//\n//   The most-significant bit being the leftmost, an IEEE\n//   floating-point looks like\n//\n//     sign_bit exponent_bits fraction_bits\n//\n//   Here, sign_bit is a single bit that designates the sign of the\n//   number.\n//\n//   For float, there are 8 exponent bits and 23 fraction bits.\n//\n//   For double, there are 11 exponent bits and 52 fraction bits.\n//\n//   More details can be found at\n//   http://en.wikipedia.org/wiki/IEEE_floating-point_standard.\n//\n// Template parameter:\n//\n//   RawType: the raw floating-point type (either float or double)\ntemplate <typename RawType>\nclass FloatingPoint {\n public:\n  // Defines the unsigned integer type that has the same size as the\n  // floating point number.\n  typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;\n\n  // Constants.\n\n  // # of bits in a number.\n  static const size_t kBitCount = 8*sizeof(RawType);\n\n  // # of fraction bits in a number.\n  static const size_t kFractionBitCount =\n    std::numeric_limits<RawType>::digits - 1;\n\n  // # of exponent bits in a number.\n  static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;\n\n  // The mask for the sign bit.\n  static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);\n\n  // The mask for the fraction bits.\n  static const Bits kFractionBitMask =\n    ~static_cast<Bits>(0) >> (kExponentBitCount + 1);\n\n  // The mask for the exponent bits.\n  static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);\n\n  // How many ULP's (Units in the Last Place) we want to tolerate when\n  // comparing two numbers.  The larger the value, the more error we\n  // allow.  A 0 value means that two numbers must be exactly the same\n  // to be considered equal.\n  //\n  // The maximum error of a single floating-point operation is 0.5\n  // units in the last place.  On Intel CPU's, all floating-point\n  // calculations are done with 80-bit precision, while double has 64\n  // bits.  Therefore, 4 should be enough for ordinary use.\n  //\n  // See the following article for more details on ULP:\n  // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/\n  static const size_t kMaxUlps = 4;\n\n  // Constructs a FloatingPoint from a raw floating-point number.\n  //\n  // On an Intel CPU, passing a non-normalized NAN (Not a Number)\n  // around may change its bits, although the new value is guaranteed\n  // to be also a NAN.  Therefore, don't expect this constructor to\n  // preserve the bits in x when x is a NAN.\n  explicit FloatingPoint(const RawType& x) { u_.value_ = x; }\n\n  // Static methods\n\n  // Reinterprets a bit pattern as a floating-point number.\n  //\n  // This function is needed to test the AlmostEquals() method.\n  static RawType ReinterpretBits(const Bits bits) {\n    FloatingPoint fp(0);\n    fp.u_.bits_ = bits;\n    return fp.u_.value_;\n  }\n\n  // Returns the floating-point number that represent positive infinity.\n  static RawType Infinity() {\n    return ReinterpretBits(kExponentBitMask);\n  }\n\n  // Returns the maximum representable finite floating-point number.\n  static RawType Max();\n\n  // Non-static methods\n\n  // Returns the bits that represents this number.\n  const Bits &bits() const { return u_.bits_; }\n\n  // Returns the exponent bits of this number.\n  Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }\n\n  // Returns the fraction bits of this number.\n  Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }\n\n  // Returns the sign bit of this number.\n  Bits sign_bit() const { return kSignBitMask & u_.bits_; }\n\n  // Returns true iff this is NAN (not a number).\n  bool is_nan() const {\n    // It's a NAN if the exponent bits are all ones and the fraction\n    // bits are not entirely zeros.\n    return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);\n  }\n\n  // Returns true iff this number is at most kMaxUlps ULP's away from\n  // rhs.  In particular, this function:\n  //\n  //   - returns false if either number is (or both are) NAN.\n  //   - treats really large numbers as almost equal to infinity.\n  //   - thinks +0.0 and -0.0 are 0 DLP's apart.\n  bool AlmostEquals(const FloatingPoint& rhs) const {\n    // The IEEE standard says that any comparison operation involving\n    // a NAN must return false.\n    if (is_nan() || rhs.is_nan()) return false;\n\n    return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)\n        <= kMaxUlps;\n  }\n\n private:\n  // The data type used to store the actual floating-point number.\n  union FloatingPointUnion {\n    RawType value_;  // The raw floating-point number.\n    Bits bits_;      // The bits that represent the number.\n  };\n\n  // Converts an integer from the sign-and-magnitude representation to\n  // the biased representation.  More precisely, let N be 2 to the\n  // power of (kBitCount - 1), an integer x is represented by the\n  // unsigned number x + N.\n  //\n  // For instance,\n  //\n  //   -N + 1 (the most negative number representable using\n  //          sign-and-magnitude) is represented by 1;\n  //   0      is represented by N; and\n  //   N - 1  (the biggest number representable using\n  //          sign-and-magnitude) is represented by 2N - 1.\n  //\n  // Read http://en.wikipedia.org/wiki/Signed_number_representations\n  // for more details on signed number representations.\n  static Bits SignAndMagnitudeToBiased(const Bits &sam) {\n    if (kSignBitMask & sam) {\n      // sam represents a negative number.\n      return ~sam + 1;\n    } else {\n      // sam represents a positive number.\n      return kSignBitMask | sam;\n    }\n  }\n\n  // Given two numbers in the sign-and-magnitude representation,\n  // returns the distance between them as an unsigned number.\n  static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,\n                                                     const Bits &sam2) {\n    const Bits biased1 = SignAndMagnitudeToBiased(sam1);\n    const Bits biased2 = SignAndMagnitudeToBiased(sam2);\n    return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);\n  }\n\n  FloatingPointUnion u_;\n};\n\n// We cannot use std::numeric_limits<T>::max() as it clashes with the max()\n// macro defined by <windows.h>.\ntemplate <>\ninline float FloatingPoint<float>::Max() { return FLT_MAX; }\ntemplate <>\ninline double FloatingPoint<double>::Max() { return DBL_MAX; }\n\n// Typedefs the instances of the FloatingPoint template class that we\n// care to use.\ntypedef FloatingPoint<float> Float;\ntypedef FloatingPoint<double> Double;\n\n// In order to catch the mistake of putting tests that use different\n// test fixture classes in the same test case, we need to assign\n// unique IDs to fixture classes and compare them.  The TypeId type is\n// used to hold such IDs.  The user should treat TypeId as an opaque\n// type: the only operation allowed on TypeId values is to compare\n// them for equality using the == operator.\ntypedef const void* TypeId;\n\ntemplate <typename T>\nclass TypeIdHelper {\n public:\n  // dummy_ must not have a const type.  Otherwise an overly eager\n  // compiler (e.g. MSVC 7.1 & 8.0) may try to merge\n  // TypeIdHelper<T>::dummy_ for different Ts as an \"optimization\".\n  static bool dummy_;\n};\n\ntemplate <typename T>\nbool TypeIdHelper<T>::dummy_ = false;\n\n// GetTypeId<T>() returns the ID of type T.  Different values will be\n// returned for different types.  Calling the function twice with the\n// same type argument is guaranteed to return the same ID.\ntemplate <typename T>\nTypeId GetTypeId() {\n  // The compiler is required to allocate a different\n  // TypeIdHelper<T>::dummy_ variable for each T used to instantiate\n  // the template.  Therefore, the address of dummy_ is guaranteed to\n  // be unique.\n  return &(TypeIdHelper<T>::dummy_);\n}\n\n// Returns the type ID of ::testing::Test.  Always call this instead\n// of GetTypeId< ::testing::Test>() to get the type ID of\n// ::testing::Test, as the latter may give the wrong result due to a\n// suspected linker bug when compiling Google Test as a Mac OS X\n// framework.\nGTEST_API_ TypeId GetTestTypeId();\n\n// Defines the abstract factory interface that creates instances\n// of a Test object.\nclass TestFactoryBase {\n public:\n  virtual ~TestFactoryBase() {}\n\n  // Creates a test instance to run. The instance is both created and destroyed\n  // within TestInfoImpl::Run()\n  virtual Test* CreateTest() = 0;\n\n protected:\n  TestFactoryBase() {}\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);\n};\n\n// This class provides implementation of TeastFactoryBase interface.\n// It is used in TEST and TEST_F macros.\ntemplate <class TestClass>\nclass TestFactoryImpl : public TestFactoryBase {\n public:\n  virtual Test* CreateTest() { return new TestClass; }\n};\n\n#if GTEST_OS_WINDOWS\n\n// Predicate-formatters for implementing the HRESULT checking macros\n// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}\n// We pass a long instead of HRESULT to avoid causing an\n// include dependency for the HRESULT type.\nGTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,\n                                            long hr);  // NOLINT\nGTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,\n                                            long hr);  // NOLINT\n\n#endif  // GTEST_OS_WINDOWS\n\n// Types of SetUpTestCase() and TearDownTestCase() functions.\ntypedef void (*SetUpTestCaseFunc)();\ntypedef void (*TearDownTestCaseFunc)();\n\nstruct CodeLocation {\n  CodeLocation(const std::string& a_file, int a_line)\n      : file(a_file), line(a_line) {}\n\n  std::string file;\n  int line;\n};\n\n// Creates a new TestInfo object and registers it with Google Test;\n// returns the created object.\n//\n// Arguments:\n//\n//   test_case_name:   name of the test case\n//   name:             name of the test\n//   type_param        the name of the test's type parameter, or NULL if\n//                     this is not a typed or a type-parameterized test.\n//   value_param       text representation of the test's value parameter,\n//                     or NULL if this is not a type-parameterized test.\n//   code_location:    code location where the test is defined\n//   fixture_class_id: ID of the test fixture class\n//   set_up_tc:        pointer to the function that sets up the test case\n//   tear_down_tc:     pointer to the function that tears down the test case\n//   factory:          pointer to the factory that creates a test object.\n//                     The newly created TestInfo instance will assume\n//                     ownership of the factory object.\nGTEST_API_ TestInfo* MakeAndRegisterTestInfo(\n    const char* test_case_name,\n    const char* name,\n    const char* type_param,\n    const char* value_param,\n    CodeLocation code_location,\n    TypeId fixture_class_id,\n    SetUpTestCaseFunc set_up_tc,\n    TearDownTestCaseFunc tear_down_tc,\n    TestFactoryBase* factory);\n\n// If *pstr starts with the given prefix, modifies *pstr to be right\n// past the prefix and returns true; otherwise leaves *pstr unchanged\n// and returns false.  None of pstr, *pstr, and prefix can be NULL.\nGTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);\n\n#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\n// State of the definition of a type-parameterized test case.\nclass GTEST_API_ TypedTestCasePState {\n public:\n  TypedTestCasePState() : registered_(false) {}\n\n  // Adds the given test name to defined_test_names_ and return true\n  // if the test case hasn't been registered; otherwise aborts the\n  // program.\n  bool AddTestName(const char* file, int line, const char* case_name,\n                   const char* test_name) {\n    if (registered_) {\n      fprintf(stderr, \"%s Test %s must be defined before \"\n              \"REGISTER_TYPED_TEST_CASE_P(%s, ...).\\n\",\n              FormatFileLocation(file, line).c_str(), test_name, case_name);\n      fflush(stderr);\n      posix::Abort();\n    }\n    registered_tests_.insert(\n        ::std::make_pair(test_name, CodeLocation(file, line)));\n    return true;\n  }\n\n  bool TestExists(const std::string& test_name) const {\n    return registered_tests_.count(test_name) > 0;\n  }\n\n  const CodeLocation& GetCodeLocation(const std::string& test_name) const {\n    RegisteredTestsMap::const_iterator it = registered_tests_.find(test_name);\n    GTEST_CHECK_(it != registered_tests_.end());\n    return it->second;\n  }\n\n  // Verifies that registered_tests match the test names in\n  // defined_test_names_; returns registered_tests if successful, or\n  // aborts the program otherwise.\n  const char* VerifyRegisteredTestNames(\n      const char* file, int line, const char* registered_tests);\n\n private:\n  typedef ::std::map<std::string, CodeLocation> RegisteredTestsMap;\n\n  bool registered_;\n  RegisteredTestsMap registered_tests_;\n};\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n// Skips to the first non-space char after the first comma in 'str';\n// returns NULL if no comma is found in 'str'.\ninline const char* SkipComma(const char* str) {\n  const char* comma = strchr(str, ',');\n  if (comma == NULL) {\n    return NULL;\n  }\n  while (IsSpace(*(++comma))) {}\n  return comma;\n}\n\n// Returns the prefix of 'str' before the first comma in it; returns\n// the entire string if it contains no comma.\ninline std::string GetPrefixUntilComma(const char* str) {\n  const char* comma = strchr(str, ',');\n  return comma == NULL ? str : std::string(str, comma);\n}\n\n// Splits a given string on a given delimiter, populating a given\n// vector with the fields.\nvoid SplitString(const ::std::string& str, char delimiter,\n                 ::std::vector< ::std::string>* dest);\n\n// The default argument to the template below for the case when the user does\n// not provide a name generator.\nstruct DefaultNameGenerator {\n  template <typename T>\n  static std::string GetName(int i) {\n    return StreamableToString(i);\n  }\n};\n\ntemplate <typename Provided = DefaultNameGenerator>\nstruct NameGeneratorSelector {\n  typedef Provided type;\n};\n\ntemplate <typename NameGenerator>\nvoid GenerateNamesRecursively(Types0, std::vector<std::string>*, int) {}\n\ntemplate <typename NameGenerator, typename Types>\nvoid GenerateNamesRecursively(Types, std::vector<std::string>* result, int i) {\n  result->push_back(NameGenerator::template GetName<typename Types::Head>(i));\n  GenerateNamesRecursively<NameGenerator>(typename Types::Tail(), result,\n                                          i + 1);\n}\n\ntemplate <typename NameGenerator, typename Types>\nstd::vector<std::string> GenerateNames() {\n  std::vector<std::string> result;\n  GenerateNamesRecursively<NameGenerator>(Types(), &result, 0);\n  return result;\n}\n\n// TypeParameterizedTest<Fixture, TestSel, Types>::Register()\n// registers a list of type-parameterized tests with Google Test.  The\n// return value is insignificant - we just need to return something\n// such that we can call this function in a namespace scope.\n//\n// Implementation note: The GTEST_TEMPLATE_ macro declares a template\n// template parameter.  It's defined in gtest-type-util.h.\ntemplate <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>\nclass TypeParameterizedTest {\n public:\n  // 'index' is the index of the test in the type list 'Types'\n  // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,\n  // Types).  Valid values for 'index' are [0, N - 1] where N is the\n  // length of Types.\n  static bool Register(const char* prefix, const CodeLocation& code_location,\n                       const char* case_name, const char* test_names, int index,\n                       const std::vector<std::string>& type_names =\n                           GenerateNames<DefaultNameGenerator, Types>()) {\n    typedef typename Types::Head Type;\n    typedef Fixture<Type> FixtureClass;\n    typedef typename GTEST_BIND_(TestSel, Type) TestClass;\n\n    // First, registers the first type-parameterized test in the type\n    // list.\n    MakeAndRegisterTestInfo(\n        (std::string(prefix) + (prefix[0] == '\\0' ? \"\" : \"/\") + case_name +\n         \"/\" + type_names[index])\n            .c_str(),\n        StripTrailingSpaces(GetPrefixUntilComma(test_names)).c_str(),\n        GetTypeName<Type>().c_str(),\n        NULL,  // No value parameter.\n        code_location, GetTypeId<FixtureClass>(), TestClass::SetUpTestCase,\n        TestClass::TearDownTestCase, new TestFactoryImpl<TestClass>);\n\n    // Next, recurses (at compile time) with the tail of the type list.\n    return TypeParameterizedTest<Fixture, TestSel,\n                                 typename Types::Tail>::Register(prefix,\n                                                                 code_location,\n                                                                 case_name,\n                                                                 test_names,\n                                                                 index + 1,\n                                                                 type_names);\n  }\n};\n\n// The base case for the compile time recursion.\ntemplate <GTEST_TEMPLATE_ Fixture, class TestSel>\nclass TypeParameterizedTest<Fixture, TestSel, Types0> {\n public:\n  static bool Register(const char* /*prefix*/, const CodeLocation&,\n                       const char* /*case_name*/, const char* /*test_names*/,\n                       int /*index*/,\n                       const std::vector<std::string>& =\n                           std::vector<std::string>() /*type_names*/) {\n    return true;\n  }\n};\n\n// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()\n// registers *all combinations* of 'Tests' and 'Types' with Google\n// Test.  The return value is insignificant - we just need to return\n// something such that we can call this function in a namespace scope.\ntemplate <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>\nclass TypeParameterizedTestCase {\n public:\n  static bool Register(const char* prefix, CodeLocation code_location,\n                       const TypedTestCasePState* state, const char* case_name,\n                       const char* test_names,\n                       const std::vector<std::string>& type_names =\n                           GenerateNames<DefaultNameGenerator, Types>()) {\n    std::string test_name = StripTrailingSpaces(\n        GetPrefixUntilComma(test_names));\n    if (!state->TestExists(test_name)) {\n      fprintf(stderr, \"Failed to get code location for test %s.%s at %s.\",\n              case_name, test_name.c_str(),\n              FormatFileLocation(code_location.file.c_str(),\n                                 code_location.line).c_str());\n      fflush(stderr);\n      posix::Abort();\n    }\n    const CodeLocation& test_location = state->GetCodeLocation(test_name);\n\n    typedef typename Tests::Head Head;\n\n    // First, register the first test in 'Test' for each type in 'Types'.\n    TypeParameterizedTest<Fixture, Head, Types>::Register(\n        prefix, test_location, case_name, test_names, 0, type_names);\n\n    // Next, recurses (at compile time) with the tail of the test list.\n    return TypeParameterizedTestCase<Fixture, typename Tests::Tail,\n                                     Types>::Register(prefix, code_location,\n                                                      state, case_name,\n                                                      SkipComma(test_names),\n                                                      type_names);\n  }\n};\n\n// The base case for the compile time recursion.\ntemplate <GTEST_TEMPLATE_ Fixture, typename Types>\nclass TypeParameterizedTestCase<Fixture, Templates0, Types> {\n public:\n  static bool Register(const char* /*prefix*/, const CodeLocation&,\n                       const TypedTestCasePState* /*state*/,\n                       const char* /*case_name*/, const char* /*test_names*/,\n                       const std::vector<std::string>& =\n                           std::vector<std::string>() /*type_names*/) {\n    return true;\n  }\n};\n\n#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P\n\n// Returns the current OS stack trace as an std::string.\n//\n// The maximum number of stack frames to be included is specified by\n// the gtest_stack_trace_depth flag.  The skip_count parameter\n// specifies the number of top frames to be skipped, which doesn't\n// count against the number of frames to be included.\n//\n// For example, if Foo() calls Bar(), which in turn calls\n// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in\n// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.\nGTEST_API_ std::string GetCurrentOsStackTraceExceptTop(\n    UnitTest* unit_test, int skip_count);\n\n// Helpers for suppressing warnings on unreachable code or constant\n// condition.\n\n// Always returns true.\nGTEST_API_ bool AlwaysTrue();\n\n// Always returns false.\ninline bool AlwaysFalse() { return !AlwaysTrue(); }\n\n// Helper for suppressing false warning from Clang on a const char*\n// variable declared in a conditional expression always being NULL in\n// the else branch.\nstruct GTEST_API_ ConstCharPtr {\n  ConstCharPtr(const char* str) : value(str) {}\n  operator bool() const { return true; }\n  const char* value;\n};\n\n// A simple Linear Congruential Generator for generating random\n// numbers with a uniform distribution.  Unlike rand() and srand(), it\n// doesn't use global state (and therefore can't interfere with user\n// code).  Unlike rand_r(), it's portable.  An LCG isn't very random,\n// but it's good enough for our purposes.\nclass GTEST_API_ Random {\n public:\n  static const UInt32 kMaxRange = 1u << 31;\n\n  explicit Random(UInt32 seed) : state_(seed) {}\n\n  void Reseed(UInt32 seed) { state_ = seed; }\n\n  // Generates a random number from [0, range).  Crashes if 'range' is\n  // 0 or greater than kMaxRange.\n  UInt32 Generate(UInt32 range);\n\n private:\n  UInt32 state_;\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);\n};\n\n// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a\n// compiler error iff T1 and T2 are different types.\ntemplate <typename T1, typename T2>\nstruct CompileAssertTypesEqual;\n\ntemplate <typename T>\nstruct CompileAssertTypesEqual<T, T> {\n};\n\n// Removes the reference from a type if it is a reference type,\n// otherwise leaves it unchanged.  This is the same as\n// tr1::remove_reference, which is not widely available yet.\ntemplate <typename T>\nstruct RemoveReference { typedef T type; };  // NOLINT\ntemplate <typename T>\nstruct RemoveReference<T&> { typedef T type; };  // NOLINT\n\n// A handy wrapper around RemoveReference that works when the argument\n// T depends on template parameters.\n#define GTEST_REMOVE_REFERENCE_(T) \\\n    typename ::testing::internal::RemoveReference<T>::type\n\n// Removes const from a type if it is a const type, otherwise leaves\n// it unchanged.  This is the same as tr1::remove_const, which is not\n// widely available yet.\ntemplate <typename T>\nstruct RemoveConst { typedef T type; };  // NOLINT\ntemplate <typename T>\nstruct RemoveConst<const T> { typedef T type; };  // NOLINT\n\n// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above\n// definition to fail to remove the const in 'const int[3]' and 'const\n// char[3][4]'.  The following specialization works around the bug.\ntemplate <typename T, size_t N>\nstruct RemoveConst<const T[N]> {\n  typedef typename RemoveConst<T>::type type[N];\n};\n\n#if defined(_MSC_VER) && _MSC_VER < 1400\n// This is the only specialization that allows VC++ 7.1 to remove const in\n// 'const int[3] and 'const int[3][4]'.  However, it causes trouble with GCC\n// and thus needs to be conditionally compiled.\ntemplate <typename T, size_t N>\nstruct RemoveConst<T[N]> {\n  typedef typename RemoveConst<T>::type type[N];\n};\n#endif\n\n// A handy wrapper around RemoveConst that works when the argument\n// T depends on template parameters.\n#define GTEST_REMOVE_CONST_(T) \\\n    typename ::testing::internal::RemoveConst<T>::type\n\n// Turns const U&, U&, const U, and U all into U.\n#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \\\n    GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))\n\n// ImplicitlyConvertible<From, To>::value is a compile-time bool\n// constant that's true iff type From can be implicitly converted to\n// type To.\ntemplate <typename From, typename To>\nclass ImplicitlyConvertible {\n private:\n  // We need the following helper functions only for their types.\n  // They have no implementations.\n\n  // MakeFrom() is an expression whose type is From.  We cannot simply\n  // use From(), as the type From may not have a public default\n  // constructor.\n  static typename AddReference<From>::type MakeFrom();\n\n  // These two functions are overloaded.  Given an expression\n  // Helper(x), the compiler will pick the first version if x can be\n  // implicitly converted to type To; otherwise it will pick the\n  // second version.\n  //\n  // The first version returns a value of size 1, and the second\n  // version returns a value of size 2.  Therefore, by checking the\n  // size of Helper(x), which can be done at compile time, we can tell\n  // which version of Helper() is used, and hence whether x can be\n  // implicitly converted to type To.\n  static char Helper(To);\n  static char (&Helper(...))[2];  // NOLINT\n\n  // We have to put the 'public' section after the 'private' section,\n  // or MSVC refuses to compile the code.\n public:\n#if defined(__BORLANDC__)\n  // C++Builder cannot use member overload resolution during template\n  // instantiation.  The simplest workaround is to use its C++0x type traits\n  // functions (C++Builder 2009 and above only).\n  static const bool value = __is_convertible(From, To);\n#else\n  // MSVC warns about implicitly converting from double to int for\n  // possible loss of data, so we need to temporarily disable the\n  // warning.\n  GTEST_DISABLE_MSC_WARNINGS_PUSH_(4244)\n  static const bool value =\n      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;\n  GTEST_DISABLE_MSC_WARNINGS_POP_()\n#endif  // __BORLANDC__\n};\ntemplate <typename From, typename To>\nconst bool ImplicitlyConvertible<From, To>::value;\n\n// IsAProtocolMessage<T>::value is a compile-time bool constant that's\n// true iff T is type ProtocolMessage, proto2::Message, or a subclass\n// of those.\ntemplate <typename T>\nstruct IsAProtocolMessage\n    : public bool_constant<\n  ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||\n  ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {\n};\n\n// When the compiler sees expression IsContainerTest<C>(0), if C is an\n// STL-style container class, the first overload of IsContainerTest\n// will be viable (since both C::iterator* and C::const_iterator* are\n// valid types and NULL can be implicitly converted to them).  It will\n// be picked over the second overload as 'int' is a perfect match for\n// the type of argument 0.  If C::iterator or C::const_iterator is not\n// a valid type, the first overload is not viable, and the second\n// overload will be picked.  Therefore, we can determine whether C is\n// a container class by checking the type of IsContainerTest<C>(0).\n// The value of the expression is insignificant.\n//\n// In C++11 mode we check the existence of a const_iterator and that an\n// iterator is properly implemented for the container.\n//\n// For pre-C++11 that we look for both C::iterator and C::const_iterator.\n// The reason is that C++ injects the name of a class as a member of the\n// class itself (e.g. you can refer to class iterator as either\n// 'iterator' or 'iterator::iterator').  If we look for C::iterator\n// only, for example, we would mistakenly think that a class named\n// iterator is an STL container.\n//\n// Also note that the simpler approach of overloading\n// IsContainerTest(typename C::const_iterator*) and\n// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.\ntypedef int IsContainer;\n#if GTEST_LANG_CXX11\ntemplate <class C,\n          class Iterator = decltype(::std::declval<const C&>().begin()),\n          class = decltype(::std::declval<const C&>().end()),\n          class = decltype(++::std::declval<Iterator&>()),\n          class = decltype(*::std::declval<Iterator>()),\n          class = typename C::const_iterator>\nIsContainer IsContainerTest(int /* dummy */) {\n  return 0;\n}\n#else\ntemplate <class C>\nIsContainer IsContainerTest(int /* dummy */,\n                            typename C::iterator* /* it */ = NULL,\n                            typename C::const_iterator* /* const_it */ = NULL) {\n  return 0;\n}\n#endif  // GTEST_LANG_CXX11\n\ntypedef char IsNotContainer;\ntemplate <class C>\nIsNotContainer IsContainerTest(long /* dummy */) { return '\\0'; }\n\n// Trait to detect whether a type T is a hash table.\n// The heuristic used is that the type contains an inner type `hasher` and does\n// not contain an inner type `reverse_iterator`.\n// If the container is iterable in reverse, then order might actually matter.\ntemplate <typename T>\nstruct IsHashTable {\n private:\n  template <typename U>\n  static char test(typename U::hasher*, typename U::reverse_iterator*);\n  template <typename U>\n  static int test(typename U::hasher*, ...);\n  template <typename U>\n  static char test(...);\n\n public:\n  static const bool value = sizeof(test<T>(0, 0)) == sizeof(int);\n};\n\ntemplate <typename T>\nconst bool IsHashTable<T>::value;\n\ntemplate<typename T>\nstruct VoidT {\n    typedef void value_type;\n};\n\ntemplate <typename T, typename = void>\nstruct HasValueType : false_type {};\ntemplate <typename T>\nstruct HasValueType<T, VoidT<typename T::value_type> > : true_type {\n};\n\ntemplate <typename C,\n          bool = sizeof(IsContainerTest<C>(0)) == sizeof(IsContainer),\n          bool = HasValueType<C>::value>\nstruct IsRecursiveContainerImpl;\n\ntemplate <typename C, bool HV>\nstruct IsRecursiveContainerImpl<C, false, HV> : public false_type {};\n\n// Since the IsRecursiveContainerImpl depends on the IsContainerTest we need to\n// obey the same inconsistencies as the IsContainerTest, namely check if\n// something is a container is relying on only const_iterator in C++11 and\n// is relying on both const_iterator and iterator otherwise\ntemplate <typename C>\nstruct IsRecursiveContainerImpl<C, true, false> : public false_type {};\n\ntemplate <typename C>\nstruct IsRecursiveContainerImpl<C, true, true> {\n  #if GTEST_LANG_CXX11\n  typedef typename IteratorTraits<typename C::const_iterator>::value_type\n      value_type;\n#else\n  typedef typename IteratorTraits<typename C::iterator>::value_type value_type;\n#endif\n  typedef is_same<value_type, C> type;\n};\n\n// IsRecursiveContainer<Type> is a unary compile-time predicate that\n// evaluates whether C is a recursive container type. A recursive container\n// type is a container type whose value_type is equal to the container type\n// itself. An example for a recursive container type is\n// boost::filesystem::path, whose iterator has a value_type that is equal to\n// boost::filesystem::path.\ntemplate <typename C>\nstruct IsRecursiveContainer : public IsRecursiveContainerImpl<C>::type {};\n\n// EnableIf<condition>::type is void when 'Cond' is true, and\n// undefined when 'Cond' is false.  To use SFINAE to make a function\n// overload only apply when a particular expression is true, add\n// \"typename EnableIf<expression>::type* = 0\" as the last parameter.\ntemplate<bool> struct EnableIf;\ntemplate<> struct EnableIf<true> { typedef void type; };  // NOLINT\n\n// Utilities for native arrays.\n\n// ArrayEq() compares two k-dimensional native arrays using the\n// elements' operator==, where k can be any integer >= 0.  When k is\n// 0, ArrayEq() degenerates into comparing a single pair of values.\n\ntemplate <typename T, typename U>\nbool ArrayEq(const T* lhs, size_t size, const U* rhs);\n\n// This generic version is used when k is 0.\ntemplate <typename T, typename U>\ninline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }\n\n// This overload is used when k >= 1.\ntemplate <typename T, typename U, size_t N>\ninline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {\n  return internal::ArrayEq(lhs, N, rhs);\n}\n\n// This helper reduces code bloat.  If we instead put its logic inside\n// the previous ArrayEq() function, arrays with different sizes would\n// lead to different copies of the template code.\ntemplate <typename T, typename U>\nbool ArrayEq(const T* lhs, size_t size, const U* rhs) {\n  for (size_t i = 0; i != size; i++) {\n    if (!internal::ArrayEq(lhs[i], rhs[i]))\n      return false;\n  }\n  return true;\n}\n\n// Finds the first element in the iterator range [begin, end) that\n// equals elem.  Element may be a native array type itself.\ntemplate <typename Iter, typename Element>\nIter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {\n  for (Iter it = begin; it != end; ++it) {\n    if (internal::ArrayEq(*it, elem))\n      return it;\n  }\n  return end;\n}\n\n// CopyArray() copies a k-dimensional native array using the elements'\n// operator=, where k can be any integer >= 0.  When k is 0,\n// CopyArray() degenerates into copying a single value.\n\ntemplate <typename T, typename U>\nvoid CopyArray(const T* from, size_t size, U* to);\n\n// This generic version is used when k is 0.\ntemplate <typename T, typename U>\ninline void CopyArray(const T& from, U* to) { *to = from; }\n\n// This overload is used when k >= 1.\ntemplate <typename T, typename U, size_t N>\ninline void CopyArray(const T(&from)[N], U(*to)[N]) {\n  internal::CopyArray(from, N, *to);\n}\n\n// This helper reduces code bloat.  If we instead put its logic inside\n// the previous CopyArray() function, arrays with different sizes\n// would lead to different copies of the template code.\ntemplate <typename T, typename U>\nvoid CopyArray(const T* from, size_t size, U* to) {\n  for (size_t i = 0; i != size; i++) {\n    internal::CopyArray(from[i], to + i);\n  }\n}\n\n// The relation between an NativeArray object (see below) and the\n// native array it represents.\n// We use 2 different structs to allow non-copyable types to be used, as long\n// as RelationToSourceReference() is passed.\nstruct RelationToSourceReference {};\nstruct RelationToSourceCopy {};\n\n// Adapts a native array to a read-only STL-style container.  Instead\n// of the complete STL container concept, this adaptor only implements\n// members useful for Google Mock's container matchers.  New members\n// should be added as needed.  To simplify the implementation, we only\n// support Element being a raw type (i.e. having no top-level const or\n// reference modifier).  It's the client's responsibility to satisfy\n// this requirement.  Element can be an array type itself (hence\n// multi-dimensional arrays are supported).\ntemplate <typename Element>\nclass NativeArray {\n public:\n  // STL-style container typedefs.\n  typedef Element value_type;\n  typedef Element* iterator;\n  typedef const Element* const_iterator;\n\n  // Constructs from a native array. References the source.\n  NativeArray(const Element* array, size_t count, RelationToSourceReference) {\n    InitRef(array, count);\n  }\n\n  // Constructs from a native array. Copies the source.\n  NativeArray(const Element* array, size_t count, RelationToSourceCopy) {\n    InitCopy(array, count);\n  }\n\n  // Copy constructor.\n  NativeArray(const NativeArray& rhs) {\n    (this->*rhs.clone_)(rhs.array_, rhs.size_);\n  }\n\n  ~NativeArray() {\n    if (clone_ != &NativeArray::InitRef)\n      delete[] array_;\n  }\n\n  // STL-style container methods.\n  size_t size() const { return size_; }\n  const_iterator begin() const { return array_; }\n  const_iterator end() const { return array_ + size_; }\n  bool operator==(const NativeArray& rhs) const {\n    return size() == rhs.size() &&\n        ArrayEq(begin(), size(), rhs.begin());\n  }\n\n private:\n  enum {\n    kCheckTypeIsNotConstOrAReference = StaticAssertTypeEqHelper<\n        Element, GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>::value\n  };\n\n  // Initializes this object with a copy of the input.\n  void InitCopy(const Element* array, size_t a_size) {\n    Element* const copy = new Element[a_size];\n    CopyArray(array, a_size, copy);\n    array_ = copy;\n    size_ = a_size;\n    clone_ = &NativeArray::InitCopy;\n  }\n\n  // Initializes this object with a reference of the input.\n  void InitRef(const Element* array, size_t a_size) {\n    array_ = array;\n    size_ = a_size;\n    clone_ = &NativeArray::InitRef;\n  }\n\n  const Element* array_;\n  size_t size_;\n  void (NativeArray::*clone_)(const Element*, size_t);\n\n  GTEST_DISALLOW_ASSIGN_(NativeArray);\n};\n\n}  // namespace internal\n}  // namespace testing\n\n#define GTEST_MESSAGE_AT_(file, line, message, result_type) \\\n  ::testing::internal::AssertHelper(result_type, file, line, message) \\\n    = ::testing::Message()\n\n#define GTEST_MESSAGE_(message, result_type) \\\n  GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)\n\n#define GTEST_FATAL_FAILURE_(message) \\\n  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)\n\n#define GTEST_NONFATAL_FAILURE_(message) \\\n  GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)\n\n#define GTEST_SUCCESS_(message) \\\n  GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)\n\n// Suppress MSVC warning 4702 (unreachable code) for the code following\n// statement if it returns or throws (or doesn't return or throw in some\n// situations).\n#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \\\n  if (::testing::internal::AlwaysTrue()) { statement; }\n\n#define GTEST_TEST_THROW_(statement, expected_exception, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (::testing::internal::ConstCharPtr gtest_msg = \"\") { \\\n    bool gtest_caught_expected = false; \\\n    try { \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n    } \\\n    catch (expected_exception const&) { \\\n      gtest_caught_expected = true; \\\n    } \\\n    catch (...) { \\\n      gtest_msg.value = \\\n          \"Expected: \" #statement \" throws an exception of type \" \\\n          #expected_exception \".\\n  Actual: it throws a different type.\"; \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \\\n    } \\\n    if (!gtest_caught_expected) { \\\n      gtest_msg.value = \\\n          \"Expected: \" #statement \" throws an exception of type \" \\\n          #expected_exception \".\\n  Actual: it throws nothing.\"; \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \\\n      fail(gtest_msg.value)\n\n#define GTEST_TEST_NO_THROW_(statement, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (::testing::internal::AlwaysTrue()) { \\\n    try { \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n    } \\\n    catch (...) { \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \\\n      fail(\"Expected: \" #statement \" doesn't throw an exception.\\n\" \\\n           \"  Actual: it throws.\")\n\n#define GTEST_TEST_ANY_THROW_(statement, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (::testing::internal::AlwaysTrue()) { \\\n    bool gtest_caught_any = false; \\\n    try { \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n    } \\\n    catch (...) { \\\n      gtest_caught_any = true; \\\n    } \\\n    if (!gtest_caught_any) { \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \\\n      fail(\"Expected: \" #statement \" throws an exception.\\n\" \\\n           \"  Actual: it doesn't.\")\n\n\n// Implements Boolean test assertions such as EXPECT_TRUE. expression can be\n// either a boolean expression or an AssertionResult. text is a textual\n// represenation of expression as it was passed into the EXPECT_TRUE.\n#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (const ::testing::AssertionResult gtest_ar_ = \\\n      ::testing::AssertionResult(expression)) \\\n    ; \\\n  else \\\n    fail(::testing::internal::GetBoolAssertionFailureMessage(\\\n        gtest_ar_, text, #actual, #expected).c_str())\n\n#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (::testing::internal::AlwaysTrue()) { \\\n    ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \\\n    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n    if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \\\n      fail(\"Expected: \" #statement \" doesn't generate new fatal \" \\\n           \"failures in the current thread.\\n\" \\\n           \"  Actual: it does.\")\n\n// Expands to the name of the class that implements the given test.\n#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \\\n  test_case_name##_##test_name##_Test\n\n// Helper macro for defining tests.\n#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\\\nclass GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\\\n public:\\\n  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\\\n private:\\\n  virtual void TestBody();\\\n  static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\\\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(\\\n      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\\\n};\\\n\\\n::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\\\n  ::test_info_ =\\\n    ::testing::internal::MakeAndRegisterTestInfo(\\\n        #test_case_name, #test_name, NULL, NULL, \\\n        ::testing::internal::CodeLocation(__FILE__, __LINE__), \\\n        (parent_id), \\\n        parent_class::SetUpTestCase, \\\n        parent_class::TearDownTestCase, \\\n        new ::testing::internal::TestFactoryImpl<\\\n            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\\\nvoid GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/gtest-linked_ptr.h",
    "content": "// Copyright 2003 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// A \"smart\" pointer type with reference tracking.  Every pointer to a\n// particular object is kept on a circular linked list.  When the last pointer\n// to an object is destroyed or reassigned, the object is deleted.\n//\n// Used properly, this deletes the object when the last reference goes away.\n// There are several caveats:\n// - Like all reference counting schemes, cycles lead to leaks.\n// - Each smart pointer is actually two pointers (8 bytes instead of 4).\n// - Every time a pointer is assigned, the entire list of pointers to that\n//   object is traversed.  This class is therefore NOT SUITABLE when there\n//   will often be more than two or three pointers to a particular object.\n// - References are only tracked as long as linked_ptr<> objects are copied.\n//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS\n//   will happen (double deletion).\n//\n// A good use of this class is storing object references in STL containers.\n// You can safely put linked_ptr<> in a vector<>.\n// Other uses may not be as good.\n//\n// Note: If you use an incomplete type with linked_ptr<>, the class\n// *containing* linked_ptr<> must have a constructor and destructor (even\n// if they do nothing!).\n//\n// Bill Gibbons suggested we use something like this.\n//\n// Thread Safety:\n//   Unlike other linked_ptr implementations, in this implementation\n//   a linked_ptr object is thread-safe in the sense that:\n//     - it's safe to copy linked_ptr objects concurrently,\n//     - it's safe to copy *from* a linked_ptr and read its underlying\n//       raw pointer (e.g. via get()) concurrently, and\n//     - it's safe to write to two linked_ptrs that point to the same\n//       shared object concurrently.\n// FIXME: rename this to safe_linked_ptr to avoid\n// confusion with normal linked_ptr.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_\n\n#include <stdlib.h>\n#include <assert.h>\n\n#include \"gtest/internal/gtest-port.h\"\n\nnamespace testing {\nnamespace internal {\n\n// Protects copying of all linked_ptr objects.\nGTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);\n\n// This is used internally by all instances of linked_ptr<>.  It needs to be\n// a non-template class because different types of linked_ptr<> can refer to\n// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).\n// So, it needs to be possible for different types of linked_ptr to participate\n// in the same circular linked list, so we need a single class type here.\n//\n// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.\nclass linked_ptr_internal {\n public:\n  // Create a new circle that includes only this instance.\n  void join_new() {\n    next_ = this;\n  }\n\n  // Many linked_ptr operations may change p.link_ for some linked_ptr\n  // variable p in the same circle as this object.  Therefore we need\n  // to prevent two such operations from occurring concurrently.\n  //\n  // Note that different types of linked_ptr objects can coexist in a\n  // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and\n  // linked_ptr<Derived2>).  Therefore we must use a single mutex to\n  // protect all linked_ptr objects.  This can create serious\n  // contention in production code, but is acceptable in a testing\n  // framework.\n\n  // Join an existing circle.\n  void join(linked_ptr_internal const* ptr)\n      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {\n    MutexLock lock(&g_linked_ptr_mutex);\n\n    linked_ptr_internal const* p = ptr;\n    while (p->next_ != ptr) {\n      assert(p->next_ != this &&\n             \"Trying to join() a linked ring we are already in. \"\n             \"Is GMock thread safety enabled?\");\n      p = p->next_;\n    }\n    p->next_ = this;\n    next_ = ptr;\n  }\n\n  // Leave whatever circle we're part of.  Returns true if we were the\n  // last member of the circle.  Once this is done, you can join() another.\n  bool depart()\n      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {\n    MutexLock lock(&g_linked_ptr_mutex);\n\n    if (next_ == this) return true;\n    linked_ptr_internal const* p = next_;\n    while (p->next_ != this) {\n      assert(p->next_ != next_ &&\n             \"Trying to depart() a linked ring we are not in. \"\n             \"Is GMock thread safety enabled?\");\n      p = p->next_;\n    }\n    p->next_ = next_;\n    return false;\n  }\n\n private:\n  mutable linked_ptr_internal const* next_;\n};\n\ntemplate <typename T>\nclass linked_ptr {\n public:\n  typedef T element_type;\n\n  // Take over ownership of a raw pointer.  This should happen as soon as\n  // possible after the object is created.\n  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }\n  ~linked_ptr() { depart(); }\n\n  // Copy an existing linked_ptr<>, adding ourselves to the list of references.\n  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }\n  linked_ptr(linked_ptr const& ptr) {  // NOLINT\n    assert(&ptr != this);\n    copy(&ptr);\n  }\n\n  // Assignment releases the old value and acquires the new.\n  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {\n    depart();\n    copy(&ptr);\n    return *this;\n  }\n\n  linked_ptr& operator=(linked_ptr const& ptr) {\n    if (&ptr != this) {\n      depart();\n      copy(&ptr);\n    }\n    return *this;\n  }\n\n  // Smart pointer members.\n  void reset(T* ptr = NULL) {\n    depart();\n    capture(ptr);\n  }\n  T* get() const { return value_; }\n  T* operator->() const { return value_; }\n  T& operator*() const { return *value_; }\n\n  bool operator==(T* p) const { return value_ == p; }\n  bool operator!=(T* p) const { return value_ != p; }\n  template <typename U>\n  bool operator==(linked_ptr<U> const& ptr) const {\n    return value_ == ptr.get();\n  }\n  template <typename U>\n  bool operator!=(linked_ptr<U> const& ptr) const {\n    return value_ != ptr.get();\n  }\n\n private:\n  template <typename U>\n  friend class linked_ptr;\n\n  T* value_;\n  linked_ptr_internal link_;\n\n  void depart() {\n    if (link_.depart()) delete value_;\n  }\n\n  void capture(T* ptr) {\n    value_ = ptr;\n    link_.join_new();\n  }\n\n  template <typename U> void copy(linked_ptr<U> const* ptr) {\n    value_ = ptr->get();\n    if (value_)\n      link_.join(&ptr->link_);\n    else\n      link_.join_new();\n  }\n};\n\ntemplate<typename T> inline\nbool operator==(T* ptr, const linked_ptr<T>& x) {\n  return ptr == x.get();\n}\n\ntemplate<typename T> inline\nbool operator!=(T* ptr, const linked_ptr<T>& x) {\n  return ptr != x.get();\n}\n\n// A function to convert T* into linked_ptr<T>\n// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation\n// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))\ntemplate <typename T>\nlinked_ptr<T> make_linked_ptr(T* ptr) {\n  return linked_ptr<T>(ptr);\n}\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/gtest-param-util-generated.h",
    "content": "// This file was GENERATED by command:\n//     pump.py gtest-param-util-generated.h.pump\n// DO NOT EDIT BY HAND!!!\n\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Type and function utilities for implementing parameterized tests.\n// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!\n//\n// Currently Google Test supports at most 50 arguments in Values,\n// and at most 10 arguments in Combine. Please contact\n// googletestframework@googlegroups.com if you need more.\n// Please note that the number of arguments to Combine is limited\n// by the maximum arity of the implementation of tuple which is\n// currently set at 10.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_\n\n#include \"gtest/internal/gtest-param-util.h\"\n#include \"gtest/internal/gtest-port.h\"\n\nnamespace testing {\n\n// Forward declarations of ValuesIn(), which is implemented in\n// include/gtest/gtest-param-test.h.\ntemplate <typename ForwardIterator>\ninternal::ParamGenerator<\n  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>\nValuesIn(ForwardIterator begin, ForwardIterator end);\n\ntemplate <typename T, size_t N>\ninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]);\n\ntemplate <class Container>\ninternal::ParamGenerator<typename Container::value_type> ValuesIn(\n    const Container& container);\n\nnamespace internal {\n\n// Used in the Values() function to provide polymorphic capabilities.\ntemplate <typename T1>\nclass ValueArray1 {\n public:\n  explicit ValueArray1(T1 v1) : v1_(v1) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray1(const ValueArray1& other) : v1_(other.v1_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray1& other);\n\n  const T1 v1_;\n};\n\ntemplate <typename T1, typename T2>\nclass ValueArray2 {\n public:\n  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray2(const ValueArray2& other) : v1_(other.v1_), v2_(other.v2_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray2& other);\n\n  const T1 v1_;\n  const T2 v2_;\n};\n\ntemplate <typename T1, typename T2, typename T3>\nclass ValueArray3 {\n public:\n  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray3(const ValueArray3& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray3& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\nclass ValueArray4 {\n public:\n  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray4(const ValueArray4& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray4& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nclass ValueArray5 {\n public:\n  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray5(const ValueArray5& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray5& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\nclass ValueArray6 {\n public:\n  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray6(const ValueArray6& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray6& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\nclass ValueArray7 {\n public:\n  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray7(const ValueArray7& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray7& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\nclass ValueArray8 {\n public:\n  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray8(const ValueArray8& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray8& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\nclass ValueArray9 {\n public:\n  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,\n      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray9(const ValueArray9& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray9& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\nclass ValueArray10 {\n public:\n  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray10(const ValueArray10& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray10& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11>\nclass ValueArray11 {\n public:\n  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),\n      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray11(const ValueArray11& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray11& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12>\nclass ValueArray12 {\n public:\n  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),\n      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray12(const ValueArray12& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray12& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13>\nclass ValueArray13 {\n public:\n  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),\n      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),\n      v12_(v12), v13_(v13) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray13(const ValueArray13& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray13& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14>\nclass ValueArray14 {\n public:\n  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray14(const ValueArray14& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray14& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15>\nclass ValueArray15 {\n public:\n  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray15(const ValueArray15& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray15& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16>\nclass ValueArray16 {\n public:\n  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),\n      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),\n      v16_(v16) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray16(const ValueArray16& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray16& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17>\nclass ValueArray17 {\n public:\n  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,\n      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray17(const ValueArray17& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray17& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18>\nclass ValueArray18 {\n public:\n  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray18(const ValueArray18& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray18& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19>\nclass ValueArray19 {\n public:\n  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),\n      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),\n      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray19(const ValueArray19& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray19& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20>\nclass ValueArray20 {\n public:\n  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),\n      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),\n      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),\n      v19_(v19), v20_(v20) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray20(const ValueArray20& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray20& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21>\nclass ValueArray21 {\n public:\n  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),\n      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),\n      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),\n      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray21(const ValueArray21& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray21& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22>\nclass ValueArray22 {\n public:\n  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray22(const ValueArray22& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray22& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23>\nclass ValueArray23 {\n public:\n  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray23(const ValueArray23& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray23& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24>\nclass ValueArray24 {\n public:\n  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),\n      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),\n      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),\n      v22_(v22), v23_(v23), v24_(v24) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray24(const ValueArray24& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray24& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25>\nclass ValueArray25 {\n public:\n  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,\n      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray25(const ValueArray25& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray25& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26>\nclass ValueArray26 {\n public:\n  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray26(const ValueArray26& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray26& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27>\nclass ValueArray27 {\n public:\n  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),\n      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),\n      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),\n      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),\n      v26_(v26), v27_(v27) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray27(const ValueArray27& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray27& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28>\nclass ValueArray28 {\n public:\n  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),\n      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),\n      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),\n      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),\n      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray28(const ValueArray28& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray28& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29>\nclass ValueArray29 {\n public:\n  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),\n      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),\n      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),\n      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),\n      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray29(const ValueArray29& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray29& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30>\nclass ValueArray30 {\n public:\n  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray30(const ValueArray30& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray30& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31>\nclass ValueArray31 {\n public:\n  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30), v31_(v31) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray31(const ValueArray31& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray31& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32>\nclass ValueArray32 {\n public:\n  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),\n      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),\n      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),\n      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),\n      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray32(const ValueArray32& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray32& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33>\nclass ValueArray33 {\n public:\n  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,\n      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray33(const ValueArray33& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray33& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34>\nclass ValueArray34 {\n public:\n  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33), v34_(v34) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray34(const ValueArray34& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray34& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35>\nclass ValueArray35 {\n public:\n  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),\n      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),\n      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),\n      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),\n      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),\n      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray35(const ValueArray35& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),\n      v35_(other.v35_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray35& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36>\nclass ValueArray36 {\n public:\n  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),\n      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),\n      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),\n      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),\n      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),\n      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),\n        static_cast<T>(v36_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray36(const ValueArray36& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),\n      v35_(other.v35_), v36_(other.v36_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray36& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37>\nclass ValueArray37 {\n public:\n  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),\n      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),\n      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),\n      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),\n      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),\n      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),\n      v36_(v36), v37_(v37) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),\n        static_cast<T>(v36_), static_cast<T>(v37_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray37(const ValueArray37& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),\n      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray37& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38>\nclass ValueArray38 {\n public:\n  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),\n      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),\n        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray38(const ValueArray38& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),\n      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray38& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39>\nclass ValueArray39 {\n public:\n  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),\n      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),\n        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),\n        static_cast<T>(v39_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray39(const ValueArray39& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),\n      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),\n      v39_(other.v39_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray39& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40>\nclass ValueArray40 {\n public:\n  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),\n      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),\n      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),\n      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),\n      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),\n      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),\n      v40_(v40) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),\n        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),\n        static_cast<T>(v39_), static_cast<T>(v40_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray40(const ValueArray40& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),\n      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),\n      v39_(other.v39_), v40_(other.v40_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray40& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41>\nclass ValueArray41 {\n public:\n  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,\n      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),\n      v39_(v39), v40_(v40), v41_(v41) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),\n        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),\n        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray41(const ValueArray41& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),\n      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),\n      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray41& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42>\nclass ValueArray42 {\n public:\n  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),\n      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),\n        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),\n        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),\n        static_cast<T>(v42_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray42(const ValueArray42& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),\n      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),\n      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray42& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43>\nclass ValueArray43 {\n public:\n  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),\n      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),\n      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),\n      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),\n      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),\n      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),\n      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),\n        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),\n        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),\n        static_cast<T>(v42_), static_cast<T>(v43_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray43(const ValueArray43& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),\n      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),\n      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),\n      v43_(other.v43_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray43& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44>\nclass ValueArray44 {\n public:\n  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),\n      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),\n      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),\n      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),\n      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),\n      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),\n      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),\n      v43_(v43), v44_(v44) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),\n        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),\n        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),\n        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray44(const ValueArray44& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),\n      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),\n      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),\n      v43_(other.v43_), v44_(other.v44_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray44& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45>\nclass ValueArray45 {\n public:\n  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),\n      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),\n      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),\n      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),\n      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),\n      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),\n      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),\n      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),\n        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),\n        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),\n        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),\n        static_cast<T>(v45_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray45(const ValueArray45& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),\n      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),\n      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),\n      v43_(other.v43_), v44_(other.v44_), v45_(other.v45_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray45& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46>\nclass ValueArray46 {\n public:\n  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),\n      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),\n      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),\n        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),\n        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),\n        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),\n        static_cast<T>(v45_), static_cast<T>(v46_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray46(const ValueArray46& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),\n      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),\n      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),\n      v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray46& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n  const T46 v46_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47>\nclass ValueArray47 {\n public:\n  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),\n      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),\n      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),\n      v47_(v47) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),\n        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),\n        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),\n        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),\n        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray47(const ValueArray47& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),\n      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),\n      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),\n      v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_),\n      v47_(other.v47_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray47& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n  const T46 v46_;\n  const T47 v47_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48>\nclass ValueArray48 {\n public:\n  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),\n      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),\n      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),\n      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),\n      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),\n      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),\n      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),\n      v46_(v46), v47_(v47), v48_(v48) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),\n        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),\n        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),\n        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),\n        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),\n        static_cast<T>(v48_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray48(const ValueArray48& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),\n      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),\n      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),\n      v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_),\n      v47_(other.v47_), v48_(other.v48_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray48& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n  const T46 v46_;\n  const T47 v47_;\n  const T48 v48_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49>\nclass ValueArray49 {\n public:\n  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,\n      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),\n      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),\n      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),\n        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),\n        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),\n        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),\n        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),\n        static_cast<T>(v48_), static_cast<T>(v49_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray49(const ValueArray49& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),\n      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),\n      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),\n      v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_),\n      v47_(other.v47_), v48_(other.v48_), v49_(other.v49_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray49& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n  const T46 v46_;\n  const T47 v47_;\n  const T48 v48_;\n  const T49 v49_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49, typename T50>\nclass ValueArray50 {\n public:\n  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,\n      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),\n      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),\n      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),\n        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),\n        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),\n        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),\n        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),\n        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),\n        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),\n        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),\n        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),\n        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),\n        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),\n        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),\n        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),\n        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),\n        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),\n        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),\n        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};\n    return ValuesIn(array);\n  }\n\n  ValueArray50(const ValueArray50& other) : v1_(other.v1_), v2_(other.v2_),\n      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),\n      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),\n      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),\n      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),\n      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),\n      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),\n      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),\n      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),\n      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),\n      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),\n      v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_),\n      v47_(other.v47_), v48_(other.v48_), v49_(other.v49_), v50_(other.v50_) {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray50& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n  const T46 v46_;\n  const T47 v47_;\n  const T48 v48_;\n  const T49 v49_;\n  const T50 v50_;\n};\n\n# if GTEST_HAS_COMBINE\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Generates values from the Cartesian product of values produced\n// by the argument generators.\n//\ntemplate <typename T1, typename T2>\nclass CartesianProductGenerator2\n    : public ParamGeneratorInterface< ::testing::tuple<T1, T2> > {\n public:\n  typedef ::testing::tuple<T1, T2> ParamType;\n\n  CartesianProductGenerator2(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2)\n      : g1_(g1), g2_(g2) {}\n  virtual ~CartesianProductGenerator2() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current2_;\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return current_value_.get(); }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_.reset(new ParamType(*current1_, *current2_));\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    linked_ptr<ParamType> current_value_;\n  };  // class CartesianProductGenerator2::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator2& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n};  // class CartesianProductGenerator2\n\n\ntemplate <typename T1, typename T2, typename T3>\nclass CartesianProductGenerator3\n    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3> > {\n public:\n  typedef ::testing::tuple<T1, T2, T3> ParamType;\n\n  CartesianProductGenerator3(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)\n      : g1_(g1), g2_(g2), g3_(g3) {}\n  virtual ~CartesianProductGenerator3() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current3_;\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return current_value_.get(); }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_.reset(new ParamType(*current1_, *current2_, *current3_));\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    linked_ptr<ParamType> current_value_;\n  };  // class CartesianProductGenerator3::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator3& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n};  // class CartesianProductGenerator3\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\nclass CartesianProductGenerator4\n    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4> > {\n public:\n  typedef ::testing::tuple<T1, T2, T3, T4> ParamType;\n\n  CartesianProductGenerator4(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}\n  virtual ~CartesianProductGenerator4() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current4_;\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return current_value_.get(); }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_.reset(new ParamType(*current1_, *current2_, *current3_,\n            *current4_));\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    linked_ptr<ParamType> current_value_;\n  };  // class CartesianProductGenerator4::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator4& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n};  // class CartesianProductGenerator4\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nclass CartesianProductGenerator5\n    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5> > {\n public:\n  typedef ::testing::tuple<T1, T2, T3, T4, T5> ParamType;\n\n  CartesianProductGenerator5(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}\n  virtual ~CartesianProductGenerator5() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current5_;\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return current_value_.get(); }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_.reset(new ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_));\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    linked_ptr<ParamType> current_value_;\n  };  // class CartesianProductGenerator5::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator5& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n};  // class CartesianProductGenerator5\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\nclass CartesianProductGenerator6\n    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5,\n        T6> > {\n public:\n  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6> ParamType;\n\n  CartesianProductGenerator6(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,\n      const ParamGenerator<T6>& g6)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}\n  virtual ~CartesianProductGenerator6() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5,\n      const ParamGenerator<T6>& g6,\n      const typename ParamGenerator<T6>::iterator& current6)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),\n          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current6_;\n      if (current6_ == end6_) {\n        current6_ = begin6_;\n        ++current5_;\n      }\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return current_value_.get(); }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_ &&\n          current6_ == typed_other->current6_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_),\n        begin6_(other.begin6_),\n        end6_(other.end6_),\n        current6_(other.current6_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_.reset(new ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_, *current6_));\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_ ||\n          current6_ == end6_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    const typename ParamGenerator<T6>::iterator begin6_;\n    const typename ParamGenerator<T6>::iterator end6_;\n    typename ParamGenerator<T6>::iterator current6_;\n    linked_ptr<ParamType> current_value_;\n  };  // class CartesianProductGenerator6::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator6& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n  const ParamGenerator<T6> g6_;\n};  // class CartesianProductGenerator6\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\nclass CartesianProductGenerator7\n    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,\n        T7> > {\n public:\n  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;\n\n  CartesianProductGenerator7(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,\n      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}\n  virtual ~CartesianProductGenerator7() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,\n        g7_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5,\n      const ParamGenerator<T6>& g6,\n      const typename ParamGenerator<T6>::iterator& current6,\n      const ParamGenerator<T7>& g7,\n      const typename ParamGenerator<T7>::iterator& current7)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),\n          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),\n          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current7_;\n      if (current7_ == end7_) {\n        current7_ = begin7_;\n        ++current6_;\n      }\n      if (current6_ == end6_) {\n        current6_ = begin6_;\n        ++current5_;\n      }\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return current_value_.get(); }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_ &&\n          current6_ == typed_other->current6_ &&\n          current7_ == typed_other->current7_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_),\n        begin6_(other.begin6_),\n        end6_(other.end6_),\n        current6_(other.current6_),\n        begin7_(other.begin7_),\n        end7_(other.end7_),\n        current7_(other.current7_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_.reset(new ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_, *current6_, *current7_));\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_ ||\n          current6_ == end6_ ||\n          current7_ == end7_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    const typename ParamGenerator<T6>::iterator begin6_;\n    const typename ParamGenerator<T6>::iterator end6_;\n    typename ParamGenerator<T6>::iterator current6_;\n    const typename ParamGenerator<T7>::iterator begin7_;\n    const typename ParamGenerator<T7>::iterator end7_;\n    typename ParamGenerator<T7>::iterator current7_;\n    linked_ptr<ParamType> current_value_;\n  };  // class CartesianProductGenerator7::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator7& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n  const ParamGenerator<T6> g6_;\n  const ParamGenerator<T7> g7_;\n};  // class CartesianProductGenerator7\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\nclass CartesianProductGenerator8\n    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,\n        T7, T8> > {\n public:\n  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;\n\n  CartesianProductGenerator8(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,\n      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,\n      const ParamGenerator<T8>& g8)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),\n          g8_(g8) {}\n  virtual ~CartesianProductGenerator8() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,\n        g7_.begin(), g8_, g8_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,\n        g8_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5,\n      const ParamGenerator<T6>& g6,\n      const typename ParamGenerator<T6>::iterator& current6,\n      const ParamGenerator<T7>& g7,\n      const typename ParamGenerator<T7>::iterator& current7,\n      const ParamGenerator<T8>& g8,\n      const typename ParamGenerator<T8>::iterator& current8)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),\n          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),\n          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),\n          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current8_;\n      if (current8_ == end8_) {\n        current8_ = begin8_;\n        ++current7_;\n      }\n      if (current7_ == end7_) {\n        current7_ = begin7_;\n        ++current6_;\n      }\n      if (current6_ == end6_) {\n        current6_ = begin6_;\n        ++current5_;\n      }\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return current_value_.get(); }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_ &&\n          current6_ == typed_other->current6_ &&\n          current7_ == typed_other->current7_ &&\n          current8_ == typed_other->current8_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_),\n        begin6_(other.begin6_),\n        end6_(other.end6_),\n        current6_(other.current6_),\n        begin7_(other.begin7_),\n        end7_(other.end7_),\n        current7_(other.current7_),\n        begin8_(other.begin8_),\n        end8_(other.end8_),\n        current8_(other.current8_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_.reset(new ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_, *current6_, *current7_, *current8_));\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_ ||\n          current6_ == end6_ ||\n          current7_ == end7_ ||\n          current8_ == end8_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    const typename ParamGenerator<T6>::iterator begin6_;\n    const typename ParamGenerator<T6>::iterator end6_;\n    typename ParamGenerator<T6>::iterator current6_;\n    const typename ParamGenerator<T7>::iterator begin7_;\n    const typename ParamGenerator<T7>::iterator end7_;\n    typename ParamGenerator<T7>::iterator current7_;\n    const typename ParamGenerator<T8>::iterator begin8_;\n    const typename ParamGenerator<T8>::iterator end8_;\n    typename ParamGenerator<T8>::iterator current8_;\n    linked_ptr<ParamType> current_value_;\n  };  // class CartesianProductGenerator8::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator8& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n  const ParamGenerator<T6> g6_;\n  const ParamGenerator<T7> g7_;\n  const ParamGenerator<T8> g8_;\n};  // class CartesianProductGenerator8\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\nclass CartesianProductGenerator9\n    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,\n        T7, T8, T9> > {\n public:\n  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;\n\n  CartesianProductGenerator9(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,\n      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,\n      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),\n          g9_(g9) {}\n  virtual ~CartesianProductGenerator9() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,\n        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,\n        g8_.end(), g9_, g9_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5,\n      const ParamGenerator<T6>& g6,\n      const typename ParamGenerator<T6>::iterator& current6,\n      const ParamGenerator<T7>& g7,\n      const typename ParamGenerator<T7>::iterator& current7,\n      const ParamGenerator<T8>& g8,\n      const typename ParamGenerator<T8>::iterator& current8,\n      const ParamGenerator<T9>& g9,\n      const typename ParamGenerator<T9>::iterator& current9)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),\n          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),\n          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),\n          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),\n          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current9_;\n      if (current9_ == end9_) {\n        current9_ = begin9_;\n        ++current8_;\n      }\n      if (current8_ == end8_) {\n        current8_ = begin8_;\n        ++current7_;\n      }\n      if (current7_ == end7_) {\n        current7_ = begin7_;\n        ++current6_;\n      }\n      if (current6_ == end6_) {\n        current6_ = begin6_;\n        ++current5_;\n      }\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return current_value_.get(); }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_ &&\n          current6_ == typed_other->current6_ &&\n          current7_ == typed_other->current7_ &&\n          current8_ == typed_other->current8_ &&\n          current9_ == typed_other->current9_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_),\n        begin6_(other.begin6_),\n        end6_(other.end6_),\n        current6_(other.current6_),\n        begin7_(other.begin7_),\n        end7_(other.end7_),\n        current7_(other.current7_),\n        begin8_(other.begin8_),\n        end8_(other.end8_),\n        current8_(other.current8_),\n        begin9_(other.begin9_),\n        end9_(other.end9_),\n        current9_(other.current9_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_.reset(new ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_, *current6_, *current7_, *current8_,\n            *current9_));\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_ ||\n          current6_ == end6_ ||\n          current7_ == end7_ ||\n          current8_ == end8_ ||\n          current9_ == end9_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    const typename ParamGenerator<T6>::iterator begin6_;\n    const typename ParamGenerator<T6>::iterator end6_;\n    typename ParamGenerator<T6>::iterator current6_;\n    const typename ParamGenerator<T7>::iterator begin7_;\n    const typename ParamGenerator<T7>::iterator end7_;\n    typename ParamGenerator<T7>::iterator current7_;\n    const typename ParamGenerator<T8>::iterator begin8_;\n    const typename ParamGenerator<T8>::iterator end8_;\n    typename ParamGenerator<T8>::iterator current8_;\n    const typename ParamGenerator<T9>::iterator begin9_;\n    const typename ParamGenerator<T9>::iterator end9_;\n    typename ParamGenerator<T9>::iterator current9_;\n    linked_ptr<ParamType> current_value_;\n  };  // class CartesianProductGenerator9::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator9& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n  const ParamGenerator<T6> g6_;\n  const ParamGenerator<T7> g7_;\n  const ParamGenerator<T8> g8_;\n  const ParamGenerator<T9> g9_;\n};  // class CartesianProductGenerator9\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\nclass CartesianProductGenerator10\n    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,\n        T7, T8, T9, T10> > {\n public:\n  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;\n\n  CartesianProductGenerator10(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,\n      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,\n      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,\n      const ParamGenerator<T10>& g10)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),\n          g9_(g9), g10_(g10) {}\n  virtual ~CartesianProductGenerator10() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,\n        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,\n        g8_.end(), g9_, g9_.end(), g10_, g10_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5,\n      const ParamGenerator<T6>& g6,\n      const typename ParamGenerator<T6>::iterator& current6,\n      const ParamGenerator<T7>& g7,\n      const typename ParamGenerator<T7>::iterator& current7,\n      const ParamGenerator<T8>& g8,\n      const typename ParamGenerator<T8>::iterator& current8,\n      const ParamGenerator<T9>& g9,\n      const typename ParamGenerator<T9>::iterator& current9,\n      const ParamGenerator<T10>& g10,\n      const typename ParamGenerator<T10>::iterator& current10)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),\n          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),\n          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),\n          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),\n          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),\n          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current10_;\n      if (current10_ == end10_) {\n        current10_ = begin10_;\n        ++current9_;\n      }\n      if (current9_ == end9_) {\n        current9_ = begin9_;\n        ++current8_;\n      }\n      if (current8_ == end8_) {\n        current8_ = begin8_;\n        ++current7_;\n      }\n      if (current7_ == end7_) {\n        current7_ = begin7_;\n        ++current6_;\n      }\n      if (current6_ == end6_) {\n        current6_ = begin6_;\n        ++current5_;\n      }\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return current_value_.get(); }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_ &&\n          current6_ == typed_other->current6_ &&\n          current7_ == typed_other->current7_ &&\n          current8_ == typed_other->current8_ &&\n          current9_ == typed_other->current9_ &&\n          current10_ == typed_other->current10_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_),\n        begin6_(other.begin6_),\n        end6_(other.end6_),\n        current6_(other.current6_),\n        begin7_(other.begin7_),\n        end7_(other.end7_),\n        current7_(other.current7_),\n        begin8_(other.begin8_),\n        end8_(other.end8_),\n        current8_(other.current8_),\n        begin9_(other.begin9_),\n        end9_(other.end9_),\n        current9_(other.current9_),\n        begin10_(other.begin10_),\n        end10_(other.end10_),\n        current10_(other.current10_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_.reset(new ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_, *current6_, *current7_, *current8_,\n            *current9_, *current10_));\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_ ||\n          current6_ == end6_ ||\n          current7_ == end7_ ||\n          current8_ == end8_ ||\n          current9_ == end9_ ||\n          current10_ == end10_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    const typename ParamGenerator<T6>::iterator begin6_;\n    const typename ParamGenerator<T6>::iterator end6_;\n    typename ParamGenerator<T6>::iterator current6_;\n    const typename ParamGenerator<T7>::iterator begin7_;\n    const typename ParamGenerator<T7>::iterator end7_;\n    typename ParamGenerator<T7>::iterator current7_;\n    const typename ParamGenerator<T8>::iterator begin8_;\n    const typename ParamGenerator<T8>::iterator end8_;\n    typename ParamGenerator<T8>::iterator current8_;\n    const typename ParamGenerator<T9>::iterator begin9_;\n    const typename ParamGenerator<T9>::iterator end9_;\n    typename ParamGenerator<T9>::iterator current9_;\n    const typename ParamGenerator<T10>::iterator begin10_;\n    const typename ParamGenerator<T10>::iterator end10_;\n    typename ParamGenerator<T10>::iterator current10_;\n    linked_ptr<ParamType> current_value_;\n  };  // class CartesianProductGenerator10::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator10& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n  const ParamGenerator<T6> g6_;\n  const ParamGenerator<T7> g7_;\n  const ParamGenerator<T8> g8_;\n  const ParamGenerator<T9> g9_;\n  const ParamGenerator<T10> g10_;\n};  // class CartesianProductGenerator10\n\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Helper classes providing Combine() with polymorphic features. They allow\n// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is\n// convertible to U.\n//\ntemplate <class Generator1, class Generator2>\nclass CartesianProductHolder2 {\n public:\nCartesianProductHolder2(const Generator1& g1, const Generator2& g2)\n      : g1_(g1), g2_(g2) {}\n  template <typename T1, typename T2>\n  operator ParamGenerator< ::testing::tuple<T1, T2> >() const {\n    return ParamGenerator< ::testing::tuple<T1, T2> >(\n        new CartesianProductGenerator2<T1, T2>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder2& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n};  // class CartesianProductHolder2\n\ntemplate <class Generator1, class Generator2, class Generator3>\nclass CartesianProductHolder3 {\n public:\nCartesianProductHolder3(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3)\n      : g1_(g1), g2_(g2), g3_(g3) {}\n  template <typename T1, typename T2, typename T3>\n  operator ParamGenerator< ::testing::tuple<T1, T2, T3> >() const {\n    return ParamGenerator< ::testing::tuple<T1, T2, T3> >(\n        new CartesianProductGenerator3<T1, T2, T3>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder3& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n};  // class CartesianProductHolder3\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4>\nclass CartesianProductHolder4 {\n public:\nCartesianProductHolder4(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}\n  template <typename T1, typename T2, typename T3, typename T4>\n  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4> >() const {\n    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4> >(\n        new CartesianProductGenerator4<T1, T2, T3, T4>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder4& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n};  // class CartesianProductHolder4\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5>\nclass CartesianProductHolder5 {\n public:\nCartesianProductHolder5(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5>\n  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5> >() const {\n    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5> >(\n        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder5& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n};  // class CartesianProductHolder5\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5, class Generator6>\nclass CartesianProductHolder6 {\n public:\nCartesianProductHolder6(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5,\n    const Generator6& g6)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5,\n      typename T6>\n  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6> >() const {\n    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6> >(\n        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_),\n        static_cast<ParamGenerator<T6> >(g6_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder6& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n  const Generator6 g6_;\n};  // class CartesianProductHolder6\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5, class Generator6, class Generator7>\nclass CartesianProductHolder7 {\n public:\nCartesianProductHolder7(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5,\n    const Generator6& g6, const Generator7& g7)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5,\n      typename T6, typename T7>\n  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6,\n      T7> >() const {\n    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7> >(\n        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_),\n        static_cast<ParamGenerator<T6> >(g6_),\n        static_cast<ParamGenerator<T7> >(g7_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder7& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n  const Generator6 g6_;\n  const Generator7 g7_;\n};  // class CartesianProductHolder7\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5, class Generator6, class Generator7,\n    class Generator8>\nclass CartesianProductHolder8 {\n public:\nCartesianProductHolder8(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5,\n    const Generator6& g6, const Generator7& g7, const Generator8& g8)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),\n          g8_(g8) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5,\n      typename T6, typename T7, typename T8>\n  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7,\n      T8> >() const {\n    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(\n        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_),\n        static_cast<ParamGenerator<T6> >(g6_),\n        static_cast<ParamGenerator<T7> >(g7_),\n        static_cast<ParamGenerator<T8> >(g8_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder8& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n  const Generator6 g6_;\n  const Generator7 g7_;\n  const Generator8 g8_;\n};  // class CartesianProductHolder8\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5, class Generator6, class Generator7,\n    class Generator8, class Generator9>\nclass CartesianProductHolder9 {\n public:\nCartesianProductHolder9(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5,\n    const Generator6& g6, const Generator7& g7, const Generator8& g8,\n    const Generator9& g9)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),\n          g9_(g9) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5,\n      typename T6, typename T7, typename T8, typename T9>\n  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8,\n      T9> >() const {\n    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8,\n        T9> >(\n        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_),\n        static_cast<ParamGenerator<T6> >(g6_),\n        static_cast<ParamGenerator<T7> >(g7_),\n        static_cast<ParamGenerator<T8> >(g8_),\n        static_cast<ParamGenerator<T9> >(g9_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder9& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n  const Generator6 g6_;\n  const Generator7 g7_;\n  const Generator8 g8_;\n  const Generator9 g9_;\n};  // class CartesianProductHolder9\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5, class Generator6, class Generator7,\n    class Generator8, class Generator9, class Generator10>\nclass CartesianProductHolder10 {\n public:\nCartesianProductHolder10(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5,\n    const Generator6& g6, const Generator7& g7, const Generator8& g8,\n    const Generator9& g9, const Generator10& g10)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),\n          g9_(g9), g10_(g10) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5,\n      typename T6, typename T7, typename T8, typename T9, typename T10>\n  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9,\n      T10> >() const {\n    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9,\n        T10> >(\n        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,\n            T10>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_),\n        static_cast<ParamGenerator<T6> >(g6_),\n        static_cast<ParamGenerator<T7> >(g7_),\n        static_cast<ParamGenerator<T8> >(g8_),\n        static_cast<ParamGenerator<T9> >(g9_),\n        static_cast<ParamGenerator<T10> >(g10_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder10& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n  const Generator6 g6_;\n  const Generator7 g7_;\n  const Generator8 g8_;\n  const Generator9 g9_;\n  const Generator10 g10_;\n};  // class CartesianProductHolder10\n\n# endif  // GTEST_HAS_COMBINE\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/gtest-param-util-generated.h.pump",
    "content": "$$ -*- mode: c++; -*-\n$var n = 50  $$ Maximum length of Values arguments we want to support.\n$var maxtuple = 10  $$ Maximum number of Combine arguments we want to support.\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Type and function utilities for implementing parameterized tests.\n// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!\n//\n// Currently Google Test supports at most $n arguments in Values,\n// and at most $maxtuple arguments in Combine. Please contact\n// googletestframework@googlegroups.com if you need more.\n// Please note that the number of arguments to Combine is limited\n// by the maximum arity of the implementation of tuple which is\n// currently set at $maxtuple.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_\n\n#include \"gtest/internal/gtest-param-util.h\"\n#include \"gtest/internal/gtest-port.h\"\n\nnamespace testing {\n\n// Forward declarations of ValuesIn(), which is implemented in\n// include/gtest/gtest-param-test.h.\ntemplate <typename ForwardIterator>\ninternal::ParamGenerator<\n  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>\nValuesIn(ForwardIterator begin, ForwardIterator end);\n\ntemplate <typename T, size_t N>\ninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]);\n\ntemplate <class Container>\ninternal::ParamGenerator<typename Container::value_type> ValuesIn(\n    const Container& container);\n\nnamespace internal {\n\n// Used in the Values() function to provide polymorphic capabilities.\n$range i 1..n\n$for i [[\n$range j 1..i\n\ntemplate <$for j, [[typename T$j]]>\nclass ValueArray$i {\n public:\n  $if i==1 [[explicit ]]ValueArray$i($for j, [[T$j v$j]]) : $for j, [[v$(j)_(v$j)]] {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {$for j, [[static_cast<T>(v$(j)_)]]};\n    return ValuesIn(array);\n  }\n\n  ValueArray$i(const ValueArray$i& other) : $for j, [[v$(j)_(other.v$(j)_)]] {}\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray$i& other);\n\n$for j [[\n\n  const T$j v$(j)_;\n]]\n\n};\n\n]]\n\n# if GTEST_HAS_COMBINE\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Generates values from the Cartesian product of values produced\n// by the argument generators.\n//\n$range i 2..maxtuple\n$for i [[\n$range j 1..i\n$range k 2..i\n\ntemplate <$for j, [[typename T$j]]>\nclass CartesianProductGenerator$i\n    : public ParamGeneratorInterface< ::testing::tuple<$for j, [[T$j]]> > {\n public:\n  typedef ::testing::tuple<$for j, [[T$j]]> ParamType;\n\n  CartesianProductGenerator$i($for j, [[const ParamGenerator<T$j>& g$j]])\n      : $for j, [[g$(j)_(g$j)]] {}\n  virtual ~CartesianProductGenerator$i() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, $for j, [[g$(j)_, g$(j)_.begin()]]);\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, $for j, [[g$(j)_, g$(j)_.end()]]);\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base, $for j, [[\n\n      const ParamGenerator<T$j>& g$j,\n      const typename ParamGenerator<T$j>::iterator& current$(j)]])\n        : base_(base),\n$for j, [[\n\n          begin$(j)_(g$j.begin()), end$(j)_(g$j.end()), current$(j)_(current$j)\n]]    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current$(i)_;\n\n$for k [[\n      if (current$(i+2-k)_ == end$(i+2-k)_) {\n        current$(i+2-k)_ = begin$(i+2-k)_;\n        ++current$(i+2-k-1)_;\n      }\n\n]]\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return current_value_.get(); }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         ($for j  && [[\n\n          current$(j)_ == typed_other->current$(j)_\n]]);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_), $for j, [[\n\n        begin$(j)_(other.begin$(j)_),\n        end$(j)_(other.end$(j)_),\n        current$(j)_(other.current$(j)_)\n]] {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_.reset(new ParamType($for j, [[*current$(j)_]]));\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n$for j  || [[\n\n          current$(j)_ == end$(j)_\n]];\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n$for j [[\n\n    const typename ParamGenerator<T$j>::iterator begin$(j)_;\n    const typename ParamGenerator<T$j>::iterator end$(j)_;\n    typename ParamGenerator<T$j>::iterator current$(j)_;\n]]\n\n    linked_ptr<ParamType> current_value_;\n  };  // class CartesianProductGenerator$i::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator$i& other);\n\n\n$for j [[\n  const ParamGenerator<T$j> g$(j)_;\n\n]]\n};  // class CartesianProductGenerator$i\n\n\n]]\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Helper classes providing Combine() with polymorphic features. They allow\n// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is\n// convertible to U.\n//\n$range i 2..maxtuple\n$for i [[\n$range j 1..i\n\ntemplate <$for j, [[class Generator$j]]>\nclass CartesianProductHolder$i {\n public:\nCartesianProductHolder$i($for j, [[const Generator$j& g$j]])\n      : $for j, [[g$(j)_(g$j)]] {}\n  template <$for j, [[typename T$j]]>\n  operator ParamGenerator< ::testing::tuple<$for j, [[T$j]]> >() const {\n    return ParamGenerator< ::testing::tuple<$for j, [[T$j]]> >(\n        new CartesianProductGenerator$i<$for j, [[T$j]]>(\n$for j,[[\n\n        static_cast<ParamGenerator<T$j> >(g$(j)_)\n]]));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder$i& other);\n\n\n$for j [[\n  const Generator$j g$(j)_;\n\n]]\n};  // class CartesianProductHolder$i\n\n]]\n\n# endif  // GTEST_HAS_COMBINE\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/gtest-param-util.h",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Type and function utilities for implementing parameterized tests.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_\n\n#include <ctype.h>\n\n#include <iterator>\n#include <set>\n#include <utility>\n#include <vector>\n\n#include \"gtest/internal/gtest-internal.h\"\n#include \"gtest/internal/gtest-linked_ptr.h\"\n#include \"gtest/internal/gtest-port.h\"\n#include \"gtest/gtest-printers.h\"\n\nnamespace testing {\n\n// Input to a parameterized test name generator, describing a test parameter.\n// Consists of the parameter value and the integer parameter index.\ntemplate <class ParamType>\nstruct TestParamInfo {\n  TestParamInfo(const ParamType& a_param, size_t an_index) :\n    param(a_param),\n    index(an_index) {}\n  ParamType param;\n  size_t index;\n};\n\n// A builtin parameterized test name generator which returns the result of\n// testing::PrintToString.\nstruct PrintToStringParamName {\n  template <class ParamType>\n  std::string operator()(const TestParamInfo<ParamType>& info) const {\n    return PrintToString(info.param);\n  }\n};\n\nnamespace internal {\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Outputs a message explaining invalid registration of different\n// fixture class for the same test case. This may happen when\n// TEST_P macro is used to define two tests with the same name\n// but in different namespaces.\nGTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,\n                                          CodeLocation code_location);\n\ntemplate <typename> class ParamGeneratorInterface;\ntemplate <typename> class ParamGenerator;\n\n// Interface for iterating over elements provided by an implementation\n// of ParamGeneratorInterface<T>.\ntemplate <typename T>\nclass ParamIteratorInterface {\n public:\n  virtual ~ParamIteratorInterface() {}\n  // A pointer to the base generator instance.\n  // Used only for the purposes of iterator comparison\n  // to make sure that two iterators belong to the same generator.\n  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;\n  // Advances iterator to point to the next element\n  // provided by the generator. The caller is responsible\n  // for not calling Advance() on an iterator equal to\n  // BaseGenerator()->End().\n  virtual void Advance() = 0;\n  // Clones the iterator object. Used for implementing copy semantics\n  // of ParamIterator<T>.\n  virtual ParamIteratorInterface* Clone() const = 0;\n  // Dereferences the current iterator and provides (read-only) access\n  // to the pointed value. It is the caller's responsibility not to call\n  // Current() on an iterator equal to BaseGenerator()->End().\n  // Used for implementing ParamGenerator<T>::operator*().\n  virtual const T* Current() const = 0;\n  // Determines whether the given iterator and other point to the same\n  // element in the sequence generated by the generator.\n  // Used for implementing ParamGenerator<T>::operator==().\n  virtual bool Equals(const ParamIteratorInterface& other) const = 0;\n};\n\n// Class iterating over elements provided by an implementation of\n// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>\n// and implements the const forward iterator concept.\ntemplate <typename T>\nclass ParamIterator {\n public:\n  typedef T value_type;\n  typedef const T& reference;\n  typedef ptrdiff_t difference_type;\n\n  // ParamIterator assumes ownership of the impl_ pointer.\n  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}\n  ParamIterator& operator=(const ParamIterator& other) {\n    if (this != &other)\n      impl_.reset(other.impl_->Clone());\n    return *this;\n  }\n\n  const T& operator*() const { return *impl_->Current(); }\n  const T* operator->() const { return impl_->Current(); }\n  // Prefix version of operator++.\n  ParamIterator& operator++() {\n    impl_->Advance();\n    return *this;\n  }\n  // Postfix version of operator++.\n  ParamIterator operator++(int /*unused*/) {\n    ParamIteratorInterface<T>* clone = impl_->Clone();\n    impl_->Advance();\n    return ParamIterator(clone);\n  }\n  bool operator==(const ParamIterator& other) const {\n    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);\n  }\n  bool operator!=(const ParamIterator& other) const {\n    return !(*this == other);\n  }\n\n private:\n  friend class ParamGenerator<T>;\n  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}\n  scoped_ptr<ParamIteratorInterface<T> > impl_;\n};\n\n// ParamGeneratorInterface<T> is the binary interface to access generators\n// defined in other translation units.\ntemplate <typename T>\nclass ParamGeneratorInterface {\n public:\n  typedef T ParamType;\n\n  virtual ~ParamGeneratorInterface() {}\n\n  // Generator interface definition\n  virtual ParamIteratorInterface<T>* Begin() const = 0;\n  virtual ParamIteratorInterface<T>* End() const = 0;\n};\n\n// Wraps ParamGeneratorInterface<T> and provides general generator syntax\n// compatible with the STL Container concept.\n// This class implements copy initialization semantics and the contained\n// ParamGeneratorInterface<T> instance is shared among all copies\n// of the original object. This is possible because that instance is immutable.\ntemplate<typename T>\nclass ParamGenerator {\n public:\n  typedef ParamIterator<T> iterator;\n\n  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}\n  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}\n\n  ParamGenerator& operator=(const ParamGenerator& other) {\n    impl_ = other.impl_;\n    return *this;\n  }\n\n  iterator begin() const { return iterator(impl_->Begin()); }\n  iterator end() const { return iterator(impl_->End()); }\n\n private:\n  linked_ptr<const ParamGeneratorInterface<T> > impl_;\n};\n\n// Generates values from a range of two comparable values. Can be used to\n// generate sequences of user-defined types that implement operator+() and\n// operator<().\n// This class is used in the Range() function.\ntemplate <typename T, typename IncrementT>\nclass RangeGenerator : public ParamGeneratorInterface<T> {\n public:\n  RangeGenerator(T begin, T end, IncrementT step)\n      : begin_(begin), end_(end),\n        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}\n  virtual ~RangeGenerator() {}\n\n  virtual ParamIteratorInterface<T>* Begin() const {\n    return new Iterator(this, begin_, 0, step_);\n  }\n  virtual ParamIteratorInterface<T>* End() const {\n    return new Iterator(this, end_, end_index_, step_);\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<T> {\n   public:\n    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,\n             IncrementT step)\n        : base_(base), value_(value), index_(index), step_(step) {}\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {\n      return base_;\n    }\n    virtual void Advance() {\n      value_ = static_cast<T>(value_ + step_);\n      index_++;\n    }\n    virtual ParamIteratorInterface<T>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const T* Current() const { return &value_; }\n    virtual bool Equals(const ParamIteratorInterface<T>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const int other_index =\n          CheckedDowncastToActualType<const Iterator>(&other)->index_;\n      return index_ == other_index;\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : ParamIteratorInterface<T>(),\n          base_(other.base_), value_(other.value_), index_(other.index_),\n          step_(other.step_) {}\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<T>* const base_;\n    T value_;\n    int index_;\n    const IncrementT step_;\n  };  // class RangeGenerator::Iterator\n\n  static int CalculateEndIndex(const T& begin,\n                               const T& end,\n                               const IncrementT& step) {\n    int end_index = 0;\n    for (T i = begin; i < end; i = static_cast<T>(i + step))\n      end_index++;\n    return end_index;\n  }\n\n  // No implementation - assignment is unsupported.\n  void operator=(const RangeGenerator& other);\n\n  const T begin_;\n  const T end_;\n  const IncrementT step_;\n  // The index for the end() iterator. All the elements in the generated\n  // sequence are indexed (0-based) to aid iterator comparison.\n  const int end_index_;\n};  // class RangeGenerator\n\n\n// Generates values from a pair of STL-style iterators. Used in the\n// ValuesIn() function. The elements are copied from the source range\n// since the source can be located on the stack, and the generator\n// is likely to persist beyond that stack frame.\ntemplate <typename T>\nclass ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {\n public:\n  template <typename ForwardIterator>\n  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)\n      : container_(begin, end) {}\n  virtual ~ValuesInIteratorRangeGenerator() {}\n\n  virtual ParamIteratorInterface<T>* Begin() const {\n    return new Iterator(this, container_.begin());\n  }\n  virtual ParamIteratorInterface<T>* End() const {\n    return new Iterator(this, container_.end());\n  }\n\n private:\n  typedef typename ::std::vector<T> ContainerType;\n\n  class Iterator : public ParamIteratorInterface<T> {\n   public:\n    Iterator(const ParamGeneratorInterface<T>* base,\n             typename ContainerType::const_iterator iterator)\n        : base_(base), iterator_(iterator) {}\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {\n      return base_;\n    }\n    virtual void Advance() {\n      ++iterator_;\n      value_.reset();\n    }\n    virtual ParamIteratorInterface<T>* Clone() const {\n      return new Iterator(*this);\n    }\n    // We need to use cached value referenced by iterator_ because *iterator_\n    // can return a temporary object (and of type other then T), so just\n    // having \"return &*iterator_;\" doesn't work.\n    // value_ is updated here and not in Advance() because Advance()\n    // can advance iterator_ beyond the end of the range, and we cannot\n    // detect that fact. The client code, on the other hand, is\n    // responsible for not calling Current() on an out-of-range iterator.\n    virtual const T* Current() const {\n      if (value_.get() == NULL)\n        value_.reset(new T(*iterator_));\n      return value_.get();\n    }\n    virtual bool Equals(const ParamIteratorInterface<T>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      return iterator_ ==\n          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;\n    }\n\n   private:\n    Iterator(const Iterator& other)\n          // The explicit constructor call suppresses a false warning\n          // emitted by gcc when supplied with the -Wextra option.\n        : ParamIteratorInterface<T>(),\n          base_(other.base_),\n          iterator_(other.iterator_) {}\n\n    const ParamGeneratorInterface<T>* const base_;\n    typename ContainerType::const_iterator iterator_;\n    // A cached value of *iterator_. We keep it here to allow access by\n    // pointer in the wrapping iterator's operator->().\n    // value_ needs to be mutable to be accessed in Current().\n    // Use of scoped_ptr helps manage cached value's lifetime,\n    // which is bound by the lifespan of the iterator itself.\n    mutable scoped_ptr<const T> value_;\n  };  // class ValuesInIteratorRangeGenerator::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const ValuesInIteratorRangeGenerator& other);\n\n  const ContainerType container_;\n};  // class ValuesInIteratorRangeGenerator\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Default parameterized test name generator, returns a string containing the\n// integer test parameter index.\ntemplate <class ParamType>\nstd::string DefaultParamName(const TestParamInfo<ParamType>& info) {\n  Message name_stream;\n  name_stream << info.index;\n  return name_stream.GetString();\n}\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Parameterized test name overload helpers, which help the\n// INSTANTIATE_TEST_CASE_P macro choose between the default parameterized\n// test name generator and user param name generator.\ntemplate <class ParamType, class ParamNameGenFunctor>\nParamNameGenFunctor GetParamNameGen(ParamNameGenFunctor func) {\n  return func;\n}\n\ntemplate <class ParamType>\nstruct ParamNameGenFunc {\n  typedef std::string Type(const TestParamInfo<ParamType>&);\n};\n\ntemplate <class ParamType>\ntypename ParamNameGenFunc<ParamType>::Type *GetParamNameGen() {\n  return DefaultParamName;\n}\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Stores a parameter value and later creates tests parameterized with that\n// value.\ntemplate <class TestClass>\nclass ParameterizedTestFactory : public TestFactoryBase {\n public:\n  typedef typename TestClass::ParamType ParamType;\n  explicit ParameterizedTestFactory(ParamType parameter) :\n      parameter_(parameter) {}\n  virtual Test* CreateTest() {\n    TestClass::SetParam(&parameter_);\n    return new TestClass();\n  }\n\n private:\n  const ParamType parameter_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);\n};\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// TestMetaFactoryBase is a base class for meta-factories that create\n// test factories for passing into MakeAndRegisterTestInfo function.\ntemplate <class ParamType>\nclass TestMetaFactoryBase {\n public:\n  virtual ~TestMetaFactoryBase() {}\n\n  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;\n};\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// TestMetaFactory creates test factories for passing into\n// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives\n// ownership of test factory pointer, same factory object cannot be passed\n// into that method twice. But ParameterizedTestCaseInfo is going to call\n// it for each Test/Parameter value combination. Thus it needs meta factory\n// creator class.\ntemplate <class TestCase>\nclass TestMetaFactory\n    : public TestMetaFactoryBase<typename TestCase::ParamType> {\n public:\n  typedef typename TestCase::ParamType ParamType;\n\n  TestMetaFactory() {}\n\n  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {\n    return new ParameterizedTestFactory<TestCase>(parameter);\n  }\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);\n};\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// ParameterizedTestCaseInfoBase is a generic interface\n// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase\n// accumulates test information provided by TEST_P macro invocations\n// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations\n// and uses that information to register all resulting test instances\n// in RegisterTests method. The ParameterizeTestCaseRegistry class holds\n// a collection of pointers to the ParameterizedTestCaseInfo objects\n// and calls RegisterTests() on each of them when asked.\nclass ParameterizedTestCaseInfoBase {\n public:\n  virtual ~ParameterizedTestCaseInfoBase() {}\n\n  // Base part of test case name for display purposes.\n  virtual const std::string& GetTestCaseName() const = 0;\n  // Test case id to verify identity.\n  virtual TypeId GetTestCaseTypeId() const = 0;\n  // UnitTest class invokes this method to register tests in this\n  // test case right before running them in RUN_ALL_TESTS macro.\n  // This method should not be called more then once on any single\n  // instance of a ParameterizedTestCaseInfoBase derived class.\n  virtual void RegisterTests() = 0;\n\n protected:\n  ParameterizedTestCaseInfoBase() {}\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);\n};\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P\n// macro invocations for a particular test case and generators\n// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that\n// test case. It registers tests with all values generated by all\n// generators when asked.\ntemplate <class TestCase>\nclass ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {\n public:\n  // ParamType and GeneratorCreationFunc are private types but are required\n  // for declarations of public methods AddTestPattern() and\n  // AddTestCaseInstantiation().\n  typedef typename TestCase::ParamType ParamType;\n  // A function that returns an instance of appropriate generator type.\n  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();\n  typedef typename ParamNameGenFunc<ParamType>::Type ParamNameGeneratorFunc;\n\n  explicit ParameterizedTestCaseInfo(\n      const char* name, CodeLocation code_location)\n      : test_case_name_(name), code_location_(code_location) {}\n\n  // Test case base name for display purposes.\n  virtual const std::string& GetTestCaseName() const { return test_case_name_; }\n  // Test case id to verify identity.\n  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }\n  // TEST_P macro uses AddTestPattern() to record information\n  // about a single test in a LocalTestInfo structure.\n  // test_case_name is the base name of the test case (without invocation\n  // prefix). test_base_name is the name of an individual test without\n  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is\n  // test case base name and DoBar is test base name.\n  void AddTestPattern(const char* test_case_name,\n                      const char* test_base_name,\n                      TestMetaFactoryBase<ParamType>* meta_factory) {\n    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,\n                                                       test_base_name,\n                                                       meta_factory)));\n  }\n  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information\n  // about a generator.\n  int AddTestCaseInstantiation(const std::string& instantiation_name,\n                               GeneratorCreationFunc* func,\n                               ParamNameGeneratorFunc* name_func,\n                               const char* file, int line) {\n    instantiations_.push_back(\n        InstantiationInfo(instantiation_name, func, name_func, file, line));\n    return 0;  // Return value used only to run this method in namespace scope.\n  }\n  // UnitTest class invokes this method to register tests in this test case\n  // test cases right before running tests in RUN_ALL_TESTS macro.\n  // This method should not be called more then once on any single\n  // instance of a ParameterizedTestCaseInfoBase derived class.\n  // UnitTest has a guard to prevent from calling this method more then once.\n  virtual void RegisterTests() {\n    for (typename TestInfoContainer::iterator test_it = tests_.begin();\n         test_it != tests_.end(); ++test_it) {\n      linked_ptr<TestInfo> test_info = *test_it;\n      for (typename InstantiationContainer::iterator gen_it =\n               instantiations_.begin(); gen_it != instantiations_.end();\n               ++gen_it) {\n        const std::string& instantiation_name = gen_it->name;\n        ParamGenerator<ParamType> generator((*gen_it->generator)());\n        ParamNameGeneratorFunc* name_func = gen_it->name_func;\n        const char* file = gen_it->file;\n        int line = gen_it->line;\n\n        std::string test_case_name;\n        if ( !instantiation_name.empty() )\n          test_case_name = instantiation_name + \"/\";\n        test_case_name += test_info->test_case_base_name;\n\n        size_t i = 0;\n        std::set<std::string> test_param_names;\n        for (typename ParamGenerator<ParamType>::iterator param_it =\n                 generator.begin();\n             param_it != generator.end(); ++param_it, ++i) {\n          Message test_name_stream;\n\n          std::string param_name = name_func(\n              TestParamInfo<ParamType>(*param_it, i));\n\n          GTEST_CHECK_(IsValidParamName(param_name))\n              << \"Parameterized test name '\" << param_name\n              << \"' is invalid, in \" << file\n              << \" line \" << line << std::endl;\n\n          GTEST_CHECK_(test_param_names.count(param_name) == 0)\n              << \"Duplicate parameterized test name '\" << param_name\n              << \"', in \" << file << \" line \" << line << std::endl;\n\n          test_param_names.insert(param_name);\n\n          test_name_stream << test_info->test_base_name << \"/\" << param_name;\n          MakeAndRegisterTestInfo(\n              test_case_name.c_str(),\n              test_name_stream.GetString().c_str(),\n              NULL,  // No type parameter.\n              PrintToString(*param_it).c_str(),\n              code_location_,\n              GetTestCaseTypeId(),\n              TestCase::SetUpTestCase,\n              TestCase::TearDownTestCase,\n              test_info->test_meta_factory->CreateTestFactory(*param_it));\n        }  // for param_it\n      }  // for gen_it\n    }  // for test_it\n  }  // RegisterTests\n\n private:\n  // LocalTestInfo structure keeps information about a single test registered\n  // with TEST_P macro.\n  struct TestInfo {\n    TestInfo(const char* a_test_case_base_name,\n             const char* a_test_base_name,\n             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :\n        test_case_base_name(a_test_case_base_name),\n        test_base_name(a_test_base_name),\n        test_meta_factory(a_test_meta_factory) {}\n\n    const std::string test_case_base_name;\n    const std::string test_base_name;\n    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;\n  };\n  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;\n  // Records data received from INSTANTIATE_TEST_CASE_P macros:\n  //  <Instantiation name, Sequence generator creation function,\n  //     Name generator function, Source file, Source line>\n  struct InstantiationInfo {\n      InstantiationInfo(const std::string &name_in,\n                        GeneratorCreationFunc* generator_in,\n                        ParamNameGeneratorFunc* name_func_in,\n                        const char* file_in,\n                        int line_in)\n          : name(name_in),\n            generator(generator_in),\n            name_func(name_func_in),\n            file(file_in),\n            line(line_in) {}\n\n      std::string name;\n      GeneratorCreationFunc* generator;\n      ParamNameGeneratorFunc* name_func;\n      const char* file;\n      int line;\n  };\n  typedef ::std::vector<InstantiationInfo> InstantiationContainer;\n\n  static bool IsValidParamName(const std::string& name) {\n    // Check for empty string\n    if (name.empty())\n      return false;\n\n    // Check for invalid characters\n    for (std::string::size_type index = 0; index < name.size(); ++index) {\n      if (!isalnum(name[index]) && name[index] != '_')\n        return false;\n    }\n\n    return true;\n  }\n\n  const std::string test_case_name_;\n  CodeLocation code_location_;\n  TestInfoContainer tests_;\n  InstantiationContainer instantiations_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);\n};  // class ParameterizedTestCaseInfo\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase\n// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P\n// macros use it to locate their corresponding ParameterizedTestCaseInfo\n// descriptors.\nclass ParameterizedTestCaseRegistry {\n public:\n  ParameterizedTestCaseRegistry() {}\n  ~ParameterizedTestCaseRegistry() {\n    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();\n         it != test_case_infos_.end(); ++it) {\n      delete *it;\n    }\n  }\n\n  // Looks up or creates and returns a structure containing information about\n  // tests and instantiations of a particular test case.\n  template <class TestCase>\n  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(\n      const char* test_case_name,\n      CodeLocation code_location) {\n    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;\n    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();\n         it != test_case_infos_.end(); ++it) {\n      if ((*it)->GetTestCaseName() == test_case_name) {\n        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {\n          // Complain about incorrect usage of Google Test facilities\n          // and terminate the program since we cannot guaranty correct\n          // test case setup and tear-down in this case.\n          ReportInvalidTestCaseType(test_case_name, code_location);\n          posix::Abort();\n        } else {\n          // At this point we are sure that the object we found is of the same\n          // type we are looking for, so we downcast it to that type\n          // without further checks.\n          typed_test_info = CheckedDowncastToActualType<\n              ParameterizedTestCaseInfo<TestCase> >(*it);\n        }\n        break;\n      }\n    }\n    if (typed_test_info == NULL) {\n      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(\n          test_case_name, code_location);\n      test_case_infos_.push_back(typed_test_info);\n    }\n    return typed_test_info;\n  }\n  void RegisterTests() {\n    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();\n         it != test_case_infos_.end(); ++it) {\n      (*it)->RegisterTests();\n    }\n  }\n\n private:\n  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;\n\n  TestCaseInfoContainer test_case_infos_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);\n};\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/gtest-port-arch.h",
    "content": "// Copyright 2015, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This header file defines the GTEST_OS_* macro.\n// It is separate from gtest-port.h so that custom/gtest-port.h can include it.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_\n\n// Determines the platform on which Google Test is compiled.\n#ifdef __CYGWIN__\n# define GTEST_OS_CYGWIN 1\n#elif defined __SYMBIAN32__\n# define GTEST_OS_SYMBIAN 1\n#elif defined _WIN32\n# define GTEST_OS_WINDOWS 1\n# ifdef _WIN32_WCE\n#  define GTEST_OS_WINDOWS_MOBILE 1\n# elif defined(__MINGW__) || defined(__MINGW32__)\n#  define GTEST_OS_WINDOWS_MINGW 1\n# elif defined(WINAPI_FAMILY)\n#  include <winapifamily.h>\n#  if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\n#   define GTEST_OS_WINDOWS_DESKTOP 1\n#  elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)\n#   define GTEST_OS_WINDOWS_PHONE 1\n#  elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)\n#   define GTEST_OS_WINDOWS_RT 1\n#  elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_TV_TITLE)\n#   define GTEST_OS_WINDOWS_PHONE 1\n#   define GTEST_OS_WINDOWS_TV_TITLE 1\n#  else\n    // WINAPI_FAMILY defined but no known partition matched.\n    // Default to desktop.\n#   define GTEST_OS_WINDOWS_DESKTOP 1\n#  endif\n# else\n#  define GTEST_OS_WINDOWS_DESKTOP 1\n# endif  // _WIN32_WCE\n#elif defined __APPLE__\n# define GTEST_OS_MAC 1\n# if TARGET_OS_IPHONE\n#  define GTEST_OS_IOS 1\n# endif\n#elif defined __FreeBSD__\n# define GTEST_OS_FREEBSD 1\n#elif defined __Fuchsia__\n# define GTEST_OS_FUCHSIA 1\n#elif defined __linux__\n# define GTEST_OS_LINUX 1\n# if defined __ANDROID__\n#  define GTEST_OS_LINUX_ANDROID 1\n# endif\n#elif defined __MVS__\n# define GTEST_OS_ZOS 1\n#elif defined(__sun) && defined(__SVR4)\n# define GTEST_OS_SOLARIS 1\n#elif defined(_AIX)\n# define GTEST_OS_AIX 1\n#elif defined(__hpux)\n# define GTEST_OS_HPUX 1\n#elif defined __native_client__\n# define GTEST_OS_NACL 1\n#elif defined __NetBSD__\n# define GTEST_OS_NETBSD 1\n#elif defined __OpenBSD__\n# define GTEST_OS_OPENBSD 1\n#elif defined __QNX__\n# define GTEST_OS_QNX 1\n#endif  // __CYGWIN__\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/gtest-port.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Low-level types and utilities for porting Google Test to various\n// platforms.  All macros ending with _ and symbols defined in an\n// internal namespace are subject to change without notice.  Code\n// outside Google Test MUST NOT USE THEM DIRECTLY.  Macros that don't\n// end with _ are part of Google Test's public API and can be used by\n// code outside Google Test.\n//\n// This file is fundamental to Google Test.  All other Google Test source\n// files are expected to #include this.  Therefore, it cannot #include\n// any other Google Test header.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_\n\n// Environment-describing macros\n// -----------------------------\n//\n// Google Test can be used in many different environments.  Macros in\n// this section tell Google Test what kind of environment it is being\n// used in, such that Google Test can provide environment-specific\n// features and implementations.\n//\n// Google Test tries to automatically detect the properties of its\n// environment, so users usually don't need to worry about these\n// macros.  However, the automatic detection is not perfect.\n// Sometimes it's necessary for a user to define some of the following\n// macros in the build script to override Google Test's decisions.\n//\n// If the user doesn't define a macro in the list, Google Test will\n// provide a default definition.  After this header is #included, all\n// macros in this list will be defined to either 1 or 0.\n//\n// Notes to maintainers:\n//   - Each macro here is a user-tweakable knob; do not grow the list\n//     lightly.\n//   - Use #if to key off these macros.  Don't use #ifdef or \"#if\n//     defined(...)\", which will not work as these macros are ALWAYS\n//     defined.\n//\n//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)\n//                              is/isn't available.\n//   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions\n//                              are enabled.\n//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string\n//                              is/isn't available\n//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::wstring\n//                              is/isn't available\n//   GTEST_HAS_POSIX_RE       - Define it to 1/0 to indicate that POSIX regular\n//                              expressions are/aren't available.\n//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>\n//                              is/isn't available.\n//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't\n//                              enabled.\n//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that\n//                              std::wstring does/doesn't work (Google Test can\n//                              be used where std::wstring is unavailable).\n//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple\n//                              is/isn't available.\n//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the\n//                              compiler supports Microsoft's \"Structured\n//                              Exception Handling\".\n//   GTEST_HAS_STREAM_REDIRECTION\n//                            - Define it to 1/0 to indicate whether the\n//                              platform supports I/O stream redirection using\n//                              dup() and dup2().\n//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google\n//                              Test's own tr1 tuple implementation should be\n//                              used.  Unused when the user sets\n//                              GTEST_HAS_TR1_TUPLE to 0.\n//   GTEST_LANG_CXX11         - Define it to 1/0 to indicate that Google Test\n//                              is building in C++11/C++98 mode.\n//   GTEST_LINKED_AS_SHARED_LIBRARY\n//                            - Define to 1 when compiling tests that use\n//                              Google Test as a shared library (known as\n//                              DLL on Windows).\n//   GTEST_CREATE_SHARED_LIBRARY\n//                            - Define to 1 when compiling Google Test itself\n//                              as a shared library.\n//   GTEST_DEFAULT_DEATH_TEST_STYLE\n//                            - The default value of --gtest_death_test_style.\n//                              The legacy default has been \"fast\" in the open\n//                              source version since 2008. The recommended value\n//                              is \"threadsafe\", and can be set in\n//                              custom/gtest-port.h.\n\n// Platform-indicating macros\n// --------------------------\n//\n// Macros indicating the platform on which Google Test is being used\n// (a macro is defined to 1 if compiled on the given platform;\n// otherwise UNDEFINED -- it's never defined to 0.).  Google Test\n// defines these macros automatically.  Code outside Google Test MUST\n// NOT define them.\n//\n//   GTEST_OS_AIX      - IBM AIX\n//   GTEST_OS_CYGWIN   - Cygwin\n//   GTEST_OS_FREEBSD  - FreeBSD\n//   GTEST_OS_FUCHSIA  - Fuchsia\n//   GTEST_OS_HPUX     - HP-UX\n//   GTEST_OS_LINUX    - Linux\n//     GTEST_OS_LINUX_ANDROID - Google Android\n//   GTEST_OS_MAC      - Mac OS X\n//     GTEST_OS_IOS    - iOS\n//   GTEST_OS_NACL     - Google Native Client (NaCl)\n//   GTEST_OS_NETBSD   - NetBSD\n//   GTEST_OS_OPENBSD  - OpenBSD\n//   GTEST_OS_QNX      - QNX\n//   GTEST_OS_SOLARIS  - Sun Solaris\n//   GTEST_OS_SYMBIAN  - Symbian\n//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)\n//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop\n//     GTEST_OS_WINDOWS_MINGW    - MinGW\n//     GTEST_OS_WINDOWS_MOBILE   - Windows Mobile\n//     GTEST_OS_WINDOWS_PHONE    - Windows Phone\n//     GTEST_OS_WINDOWS_RT       - Windows Store App/WinRT\n//   GTEST_OS_ZOS      - z/OS\n//\n// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the\n// most stable support.  Since core members of the Google Test project\n// don't have access to other platforms, support for them may be less\n// stable.  If you notice any problems on your platform, please notify\n// googletestframework@googlegroups.com (patches for fixing them are\n// even more welcome!).\n//\n// It is possible that none of the GTEST_OS_* macros are defined.\n\n// Feature-indicating macros\n// -------------------------\n//\n// Macros indicating which Google Test features are available (a macro\n// is defined to 1 if the corresponding feature is supported;\n// otherwise UNDEFINED -- it's never defined to 0.).  Google Test\n// defines these macros automatically.  Code outside Google Test MUST\n// NOT define them.\n//\n// These macros are public so that portable tests can be written.\n// Such tests typically surround code using a feature with an #if\n// which controls that code.  For example:\n//\n// #if GTEST_HAS_DEATH_TEST\n//   EXPECT_DEATH(DoSomethingDeadly());\n// #endif\n//\n//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized\n//                            tests)\n//   GTEST_HAS_DEATH_TEST   - death tests\n//   GTEST_HAS_TYPED_TEST   - typed tests\n//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests\n//   GTEST_IS_THREADSAFE    - Google Test is thread-safe.\n//   GOOGLETEST_CM0007 DO NOT DELETE\n//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used. Do not confuse with\n//                            GTEST_HAS_POSIX_RE (see above) which users can\n//                            define themselves.\n//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;\n//                            the above RE\\b(s) are mutually exclusive.\n//   GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().\n\n// Misc public macros\n// ------------------\n//\n//   GTEST_FLAG(flag_name)  - references the variable corresponding to\n//                            the given Google Test flag.\n\n// Internal utilities\n// ------------------\n//\n// The following macros and utilities are for Google Test's INTERNAL\n// use only.  Code outside Google Test MUST NOT USE THEM DIRECTLY.\n//\n// Macros for basic C++ coding:\n//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.\n//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a\n//                              variable don't have to be used.\n//   GTEST_DISALLOW_ASSIGN_   - disables operator=.\n//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.\n//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.\n//   GTEST_INTENTIONAL_CONST_COND_PUSH_ - start code section where MSVC C4127 is\n//                                        suppressed (constant conditional).\n//   GTEST_INTENTIONAL_CONST_COND_POP_  - finish code section where MSVC C4127\n//                                        is suppressed.\n//\n// C++11 feature wrappers:\n//\n//   testing::internal::forward - portability wrapper for std::forward.\n//   testing::internal::move  - portability wrapper for std::move.\n//\n// Synchronization:\n//   Mutex, MutexLock, ThreadLocal, GetThreadCount()\n//                            - synchronization primitives.\n//\n// Template meta programming:\n//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.\n//   IteratorTraits - partial implementation of std::iterator_traits, which\n//                    is not available in libCstd when compiled with Sun C++.\n//\n// Smart pointers:\n//   scoped_ptr     - as in TR2.\n//\n// Regular expressions:\n//   RE             - a simple regular expression class using the POSIX\n//                    Extended Regular Expression syntax on UNIX-like platforms\n//                    GOOGLETEST_CM0008 DO NOT DELETE\n//                    or a reduced regular exception syntax on other\n//                    platforms, including Windows.\n// Logging:\n//   GTEST_LOG_()   - logs messages at the specified severity level.\n//   LogToStderr()  - directs all log messages to stderr.\n//   FlushInfoLog() - flushes informational log messages.\n//\n// Stdout and stderr capturing:\n//   CaptureStdout()     - starts capturing stdout.\n//   GetCapturedStdout() - stops capturing stdout and returns the captured\n//                         string.\n//   CaptureStderr()     - starts capturing stderr.\n//   GetCapturedStderr() - stops capturing stderr and returns the captured\n//                         string.\n//\n// Integer types:\n//   TypeWithSize   - maps an integer to a int type.\n//   Int32, UInt32, Int64, UInt64, TimeInMillis\n//                  - integers of known sizes.\n//   BiggestInt     - the biggest signed integer type.\n//\n// Command-line utilities:\n//   GTEST_DECLARE_*()  - declares a flag.\n//   GTEST_DEFINE_*()   - defines a flag.\n//   GetInjectableArgvs() - returns the command line as a vector of strings.\n//\n// Environment variable utilities:\n//   GetEnv()             - gets the value of an environment variable.\n//   BoolFromGTestEnv()   - parses a bool environment variable.\n//   Int32FromGTestEnv()  - parses an Int32 environment variable.\n//   StringFromGTestEnv() - parses a string environment variable.\n\n#include <ctype.h>   // for isspace, etc\n#include <stddef.h>  // for ptrdiff_t\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#ifndef _WIN32_WCE\n# include <sys/types.h>\n# include <sys/stat.h>\n#endif  // !_WIN32_WCE\n\n#if defined __APPLE__\n# include <AvailabilityMacros.h>\n# include <TargetConditionals.h>\n#endif\n\n// Brings in the definition of HAS_GLOBAL_STRING.  This must be done\n// BEFORE we test HAS_GLOBAL_STRING.\n#include <string>  // NOLINT\n#include <algorithm>  // NOLINT\n#include <iostream>  // NOLINT\n#include <sstream>  // NOLINT\n#include <utility>\n#include <vector>  // NOLINT\n\n#include \"gtest/internal/gtest-port-arch.h\"\n#include \"gtest/internal/custom/gtest-port.h\"\n\n#if !defined(GTEST_DEV_EMAIL_)\n# define GTEST_DEV_EMAIL_ \"googletestframework@@googlegroups.com\"\n# define GTEST_FLAG_PREFIX_ \"gtest_\"\n# define GTEST_FLAG_PREFIX_DASH_ \"gtest-\"\n# define GTEST_FLAG_PREFIX_UPPER_ \"GTEST_\"\n# define GTEST_NAME_ \"Google Test\"\n# define GTEST_PROJECT_URL_ \"https://github.com/google/googletest/\"\n#endif  // !defined(GTEST_DEV_EMAIL_)\n\n#if !defined(GTEST_INIT_GOOGLE_TEST_NAME_)\n# define GTEST_INIT_GOOGLE_TEST_NAME_ \"testing::InitGoogleTest\"\n#endif  // !defined(GTEST_INIT_GOOGLE_TEST_NAME_)\n\n// Determines the version of gcc that is used to compile this.\n#ifdef __GNUC__\n// 40302 means version 4.3.2.\n# define GTEST_GCC_VER_ \\\n    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)\n#endif  // __GNUC__\n\n// Macros for disabling Microsoft Visual C++ warnings.\n//\n//   GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 4385)\n//   /* code that triggers warnings C4800 and C4385 */\n//   GTEST_DISABLE_MSC_WARNINGS_POP_()\n#if _MSC_VER >= 1400\n# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \\\n    __pragma(warning(push))                        \\\n    __pragma(warning(disable: warnings))\n# define GTEST_DISABLE_MSC_WARNINGS_POP_()          \\\n    __pragma(warning(pop))\n#else\n// Older versions of MSVC don't have __pragma.\n# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)\n# define GTEST_DISABLE_MSC_WARNINGS_POP_()\n#endif\n\n// Clang on Windows does not understand MSVC's pragma warning.\n// We need clang-specific way to disable function deprecation warning.\n#ifdef __clang__\n# define GTEST_DISABLE_MSC_DEPRECATED_PUSH_()                         \\\n    _Pragma(\"clang diagnostic push\")                                  \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wdeprecated-declarations\\\"\") \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wdeprecated-implementations\\\"\")\n#define GTEST_DISABLE_MSC_DEPRECATED_POP_() \\\n    _Pragma(\"clang diagnostic pop\")\n#else\n# define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \\\n    GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996)\n# define GTEST_DISABLE_MSC_DEPRECATED_POP_() \\\n    GTEST_DISABLE_MSC_WARNINGS_POP_()\n#endif\n\n#ifndef GTEST_LANG_CXX11\n// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when\n// -std={c,gnu}++{0x,11} is passed.  The C++11 standard specifies a\n// value for __cplusplus, and recent versions of clang, gcc, and\n// probably other compilers set that too in C++11 mode.\n# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L || _MSC_VER >= 1900\n// Compiling in at least C++11 mode.\n#  define GTEST_LANG_CXX11 1\n# else\n#  define GTEST_LANG_CXX11 0\n# endif\n#endif\n\n// Distinct from C++11 language support, some environments don't provide\n// proper C++11 library support. Notably, it's possible to build in\n// C++11 mode when targeting Mac OS X 10.6, which has an old libstdc++\n// with no C++11 support.\n//\n// libstdc++ has sufficient C++11 support as of GCC 4.6.0, __GLIBCXX__\n// 20110325, but maintenance releases in the 4.4 and 4.5 series followed\n// this date, so check for those versions by their date stamps.\n// https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html#abi.versioning\n#if GTEST_LANG_CXX11 && \\\n    (!defined(__GLIBCXX__) || ( \\\n        __GLIBCXX__ >= 20110325ul &&  /* GCC >= 4.6.0 */ \\\n        /* Blacklist of patch releases of older branches: */ \\\n        __GLIBCXX__ != 20110416ul &&  /* GCC 4.4.6 */ \\\n        __GLIBCXX__ != 20120313ul &&  /* GCC 4.4.7 */ \\\n        __GLIBCXX__ != 20110428ul &&  /* GCC 4.5.3 */ \\\n        __GLIBCXX__ != 20120702ul))   /* GCC 4.5.4 */\n# define GTEST_STDLIB_CXX11 1\n#endif\n\n// Only use C++11 library features if the library provides them.\n#if GTEST_STDLIB_CXX11\n# define GTEST_HAS_STD_BEGIN_AND_END_ 1\n# define GTEST_HAS_STD_FORWARD_LIST_ 1\n# if !defined(_MSC_VER) || (_MSC_FULL_VER >= 190023824)\n// works only with VS2015U2 and better\n#   define GTEST_HAS_STD_FUNCTION_ 1\n# endif\n# define GTEST_HAS_STD_INITIALIZER_LIST_ 1\n# define GTEST_HAS_STD_MOVE_ 1\n# define GTEST_HAS_STD_UNIQUE_PTR_ 1\n# define GTEST_HAS_STD_SHARED_PTR_ 1\n# define GTEST_HAS_UNORDERED_MAP_ 1\n# define GTEST_HAS_UNORDERED_SET_ 1\n#endif\n\n// C++11 specifies that <tuple> provides std::tuple.\n// Some platforms still might not have it, however.\n#if GTEST_LANG_CXX11\n# define GTEST_HAS_STD_TUPLE_ 1\n# if defined(__clang__)\n// Inspired by\n// https://clang.llvm.org/docs/LanguageExtensions.html#include-file-checking-macros\n#  if defined(__has_include) && !__has_include(<tuple>)\n#   undef GTEST_HAS_STD_TUPLE_\n#  endif\n# elif defined(_MSC_VER)\n// Inspired by boost/config/stdlib/dinkumware.hpp\n#  if defined(_CPPLIB_VER) && _CPPLIB_VER < 520\n#   undef GTEST_HAS_STD_TUPLE_\n#  endif\n# elif defined(__GLIBCXX__)\n// Inspired by boost/config/stdlib/libstdcpp3.hpp,\n// http://gcc.gnu.org/gcc-4.2/changes.html and\n// https://web.archive.org/web/20140227044429/gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch01.html#manual.intro.status.standard.200x\n#  if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)\n#   undef GTEST_HAS_STD_TUPLE_\n#  endif\n# endif\n#endif\n\n// Brings in definitions for functions used in the testing::internal::posix\n// namespace (read, write, close, chdir, isatty, stat). We do not currently\n// use them on Windows Mobile.\n#if GTEST_OS_WINDOWS\n# if !GTEST_OS_WINDOWS_MOBILE\n#  include <direct.h>\n#  include <io.h>\n# endif\n// In order to avoid having to include <windows.h>, use forward declaration\n#if GTEST_OS_WINDOWS_MINGW && !defined(__MINGW64_VERSION_MAJOR)\n// MinGW defined _CRITICAL_SECTION and _RTL_CRITICAL_SECTION as two\n// separate (equivalent) structs, instead of using typedef\ntypedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION;\n#else\n// Assume CRITICAL_SECTION is a typedef of _RTL_CRITICAL_SECTION.\n// This assumption is verified by\n// WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION.\ntypedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;\n#endif\n#else\n// This assumes that non-Windows OSes provide unistd.h. For OSes where this\n// is not the case, we need to include headers that provide the functions\n// mentioned above.\n# include <unistd.h>\n# include <strings.h>\n#endif  // GTEST_OS_WINDOWS\n\n#if GTEST_OS_LINUX_ANDROID\n// Used to define __ANDROID_API__ matching the target NDK API level.\n#  include <android/api-level.h>  // NOLINT\n#endif\n\n// Defines this to true iff Google Test can use POSIX regular expressions.\n#ifndef GTEST_HAS_POSIX_RE\n# if GTEST_OS_LINUX_ANDROID\n// On Android, <regex.h> is only available starting with Gingerbread.\n#  define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)\n# else\n#  define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)\n# endif\n#endif\n\n#if GTEST_USES_PCRE\n// The appropriate headers have already been included.\n\n#elif GTEST_HAS_POSIX_RE\n\n// On some platforms, <regex.h> needs someone to define size_t, and\n// won't compile otherwise.  We can #include it here as we already\n// included <stdlib.h>, which is guaranteed to define size_t through\n// <stddef.h>.\n# include <regex.h>  // NOLINT\n\n# define GTEST_USES_POSIX_RE 1\n\n#elif GTEST_OS_WINDOWS\n\n// <regex.h> is not available on Windows.  Use our own simple regex\n// implementation instead.\n# define GTEST_USES_SIMPLE_RE 1\n\n#else\n\n// <regex.h> may not be available on this platform.  Use our own\n// simple regex implementation instead.\n# define GTEST_USES_SIMPLE_RE 1\n\n#endif  // GTEST_USES_PCRE\n\n#ifndef GTEST_HAS_EXCEPTIONS\n// The user didn't tell us whether exceptions are enabled, so we need\n// to figure it out.\n# if defined(_MSC_VER) && defined(_CPPUNWIND)\n// MSVC defines _CPPUNWIND to 1 iff exceptions are enabled.\n#  define GTEST_HAS_EXCEPTIONS 1\n# elif defined(__BORLANDC__)\n// C++Builder's implementation of the STL uses the _HAS_EXCEPTIONS\n// macro to enable exceptions, so we'll do the same.\n// Assumes that exceptions are enabled by default.\n#  ifndef _HAS_EXCEPTIONS\n#   define _HAS_EXCEPTIONS 1\n#  endif  // _HAS_EXCEPTIONS\n#  define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS\n# elif defined(__clang__)\n// clang defines __EXCEPTIONS iff exceptions are enabled before clang 220714,\n// but iff cleanups are enabled after that. In Obj-C++ files, there can be\n// cleanups for ObjC exceptions which also need cleanups, even if C++ exceptions\n// are disabled. clang has __has_feature(cxx_exceptions) which checks for C++\n// exceptions starting at clang r206352, but which checked for cleanups prior to\n// that. To reliably check for C++ exception availability with clang, check for\n// __EXCEPTIONS && __has_feature(cxx_exceptions).\n#  define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions))\n# elif defined(__GNUC__) && __EXCEPTIONS\n// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.\n#  define GTEST_HAS_EXCEPTIONS 1\n# elif defined(__SUNPRO_CC)\n// Sun Pro CC supports exceptions.  However, there is no compile-time way of\n// detecting whether they are enabled or not.  Therefore, we assume that\n// they are enabled unless the user tells us otherwise.\n#  define GTEST_HAS_EXCEPTIONS 1\n# elif defined(__IBMCPP__) && __EXCEPTIONS\n// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.\n#  define GTEST_HAS_EXCEPTIONS 1\n# elif defined(__HP_aCC)\n// Exception handling is in effect by default in HP aCC compiler. It has to\n// be turned of by +noeh compiler option if desired.\n#  define GTEST_HAS_EXCEPTIONS 1\n# else\n// For other compilers, we assume exceptions are disabled to be\n// conservative.\n#  define GTEST_HAS_EXCEPTIONS 0\n# endif  // defined(_MSC_VER) || defined(__BORLANDC__)\n#endif  // GTEST_HAS_EXCEPTIONS\n\n#if !defined(GTEST_HAS_STD_STRING)\n// Even though we don't use this macro any longer, we keep it in case\n// some clients still depend on it.\n# define GTEST_HAS_STD_STRING 1\n#elif !GTEST_HAS_STD_STRING\n// The user told us that ::std::string isn't available.\n# error \"::std::string isn't available.\"\n#endif  // !defined(GTEST_HAS_STD_STRING)\n\n#ifndef GTEST_HAS_GLOBAL_STRING\n# define GTEST_HAS_GLOBAL_STRING 0\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n#ifndef GTEST_HAS_STD_WSTRING\n// The user didn't tell us whether ::std::wstring is available, so we need\n// to figure it out.\n// FIXME: uses autoconf to detect whether ::std::wstring\n//   is available.\n\n// Cygwin 1.7 and below doesn't support ::std::wstring.\n// Solaris' libc++ doesn't support it either.  Android has\n// no support for it at least as recent as Froyo (2.2).\n# define GTEST_HAS_STD_WSTRING \\\n    (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))\n\n#endif  // GTEST_HAS_STD_WSTRING\n\n#ifndef GTEST_HAS_GLOBAL_WSTRING\n// The user didn't tell us whether ::wstring is available, so we need\n// to figure it out.\n# define GTEST_HAS_GLOBAL_WSTRING \\\n    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n// Determines whether RTTI is available.\n#ifndef GTEST_HAS_RTTI\n// The user didn't tell us whether RTTI is enabled, so we need to\n// figure it out.\n\n# ifdef _MSC_VER\n\n#  ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.\n#   define GTEST_HAS_RTTI 1\n#  else\n#   define GTEST_HAS_RTTI 0\n#  endif\n\n// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.\n# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)\n\n#  ifdef __GXX_RTTI\n// When building against STLport with the Android NDK and with\n// -frtti -fno-exceptions, the build fails at link time with undefined\n// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,\n// so disable RTTI when detected.\n#   if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \\\n       !defined(__EXCEPTIONS)\n#    define GTEST_HAS_RTTI 0\n#   else\n#    define GTEST_HAS_RTTI 1\n#   endif  // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS\n#  else\n#   define GTEST_HAS_RTTI 0\n#  endif  // __GXX_RTTI\n\n// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends\n// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the\n// first version with C++ support.\n# elif defined(__clang__)\n\n#  define GTEST_HAS_RTTI __has_feature(cxx_rtti)\n\n// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if\n// both the typeid and dynamic_cast features are present.\n# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)\n\n#  ifdef __RTTI_ALL__\n#   define GTEST_HAS_RTTI 1\n#  else\n#   define GTEST_HAS_RTTI 0\n#  endif\n\n# else\n\n// For all other compilers, we assume RTTI is enabled.\n#  define GTEST_HAS_RTTI 1\n\n# endif  // _MSC_VER\n\n#endif  // GTEST_HAS_RTTI\n\n// It's this header's responsibility to #include <typeinfo> when RTTI\n// is enabled.\n#if GTEST_HAS_RTTI\n# include <typeinfo>\n#endif\n\n// Determines whether Google Test can use the pthreads library.\n#ifndef GTEST_HAS_PTHREAD\n// The user didn't tell us explicitly, so we make reasonable assumptions about\n// which platforms have pthreads support.\n//\n// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0\n// to your compiler flags.\n#define GTEST_HAS_PTHREAD                                             \\\n  (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX || GTEST_OS_QNX || \\\n   GTEST_OS_FREEBSD || GTEST_OS_NACL || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA)\n#endif  // GTEST_HAS_PTHREAD\n\n#if GTEST_HAS_PTHREAD\n// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is\n// true.\n# include <pthread.h>  // NOLINT\n\n// For timespec and nanosleep, used below.\n# include <time.h>  // NOLINT\n#endif\n\n// Determines if hash_map/hash_set are available.\n// Only used for testing against those containers.\n#if !defined(GTEST_HAS_HASH_MAP_)\n# if defined(_MSC_VER) && (_MSC_VER < 1900)\n#  define GTEST_HAS_HASH_MAP_ 1  // Indicates that hash_map is available.\n#  define GTEST_HAS_HASH_SET_ 1  // Indicates that hash_set is available.\n# endif  // _MSC_VER\n#endif  // !defined(GTEST_HAS_HASH_MAP_)\n\n// Determines whether Google Test can use tr1/tuple.  You can define\n// this macro to 0 to prevent Google Test from using tuple (any\n// feature depending on tuple with be disabled in this mode).\n#ifndef GTEST_HAS_TR1_TUPLE\n# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)\n// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.\n#  define GTEST_HAS_TR1_TUPLE 0\n# elif defined(_MSC_VER) && (_MSC_VER >= 1910)\n// Prevent `warning C4996: 'std::tr1': warning STL4002:\n// The non-Standard std::tr1 namespace and TR1-only machinery\n// are deprecated and will be REMOVED.`\n#  define GTEST_HAS_TR1_TUPLE 0\n# elif GTEST_LANG_CXX11 && defined(_LIBCPP_VERSION)\n// libc++ doesn't support TR1.\n#  define GTEST_HAS_TR1_TUPLE 0\n# else\n// The user didn't tell us not to do it, so we assume it's OK.\n#  define GTEST_HAS_TR1_TUPLE 1\n# endif\n#endif  // GTEST_HAS_TR1_TUPLE\n\n// Determines whether Google Test's own tr1 tuple implementation\n// should be used.\n#ifndef GTEST_USE_OWN_TR1_TUPLE\n// We use our own tuple implementation on Symbian.\n# if GTEST_OS_SYMBIAN\n#  define GTEST_USE_OWN_TR1_TUPLE 1\n# else\n// The user didn't tell us, so we need to figure it out.\n\n// We use our own TR1 tuple if we aren't sure the user has an\n// implementation of it already.  At this time, libstdc++ 4.0.0+ and\n// MSVC 2010 are the only mainstream standard libraries that come\n// with a TR1 tuple implementation.  NVIDIA's CUDA NVCC compiler\n// pretends to be GCC by defining __GNUC__ and friends, but cannot\n// compile GCC's tuple implementation.  MSVC 2008 (9.0) provides TR1\n// tuple in a 323 MB Feature Pack download, which we cannot assume the\n// user has.  QNX's QCC compiler is a modified GCC but it doesn't\n// support TR1 tuple.  libc++ only provides std::tuple, in C++11 mode,\n// and it can be used with some compilers that define __GNUC__.\n# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \\\n      && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) \\\n      || (_MSC_VER >= 1600 && _MSC_VER < 1900)\n#  define GTEST_ENV_HAS_TR1_TUPLE_ 1\n# endif\n\n// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used\n// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6\n// can build with clang but need to use gcc4.2's libstdc++).\n# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)\n#  define GTEST_ENV_HAS_STD_TUPLE_ 1\n# endif\n\n# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_\n#  define GTEST_USE_OWN_TR1_TUPLE 0\n# else\n#  define GTEST_USE_OWN_TR1_TUPLE 1\n# endif\n# endif  // GTEST_OS_SYMBIAN\n#endif  // GTEST_USE_OWN_TR1_TUPLE\n\n// To avoid conditional compilation we make it gtest-port.h's responsibility\n// to #include the header implementing tuple.\n#if GTEST_HAS_STD_TUPLE_\n# include <tuple>  // IWYU pragma: export\n# define GTEST_TUPLE_NAMESPACE_ ::std\n#endif  // GTEST_HAS_STD_TUPLE_\n\n// We include tr1::tuple even if std::tuple is available to define printers for\n// them.\n#if GTEST_HAS_TR1_TUPLE\n# ifndef GTEST_TUPLE_NAMESPACE_\n#  define GTEST_TUPLE_NAMESPACE_ ::std::tr1\n# endif  // GTEST_TUPLE_NAMESPACE_\n\n# if GTEST_USE_OWN_TR1_TUPLE\n#  include \"gtest/internal/gtest-tuple.h\"  // IWYU pragma: export  // NOLINT\n# elif GTEST_OS_SYMBIAN\n\n// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to\n// use STLport's tuple implementation, which unfortunately doesn't\n// work as the copy of STLport distributed with Symbian is incomplete.\n// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to\n// use its own tuple implementation.\n#  ifdef BOOST_HAS_TR1_TUPLE\n#   undef BOOST_HAS_TR1_TUPLE\n#  endif  // BOOST_HAS_TR1_TUPLE\n\n// This prevents <boost/tr1/detail/config.hpp>, which defines\n// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.\n#  define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED\n#  include <tuple>  // IWYU pragma: export  // NOLINT\n\n# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)\n// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does\n// not conform to the TR1 spec, which requires the header to be <tuple>.\n\n#  if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302\n// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,\n// which is #included by <tr1/tuple>, to not compile when RTTI is\n// disabled.  _TR1_FUNCTIONAL is the header guard for\n// <tr1/functional>.  Hence the following #define is used to prevent\n// <tr1/functional> from being included.\n#   define _TR1_FUNCTIONAL 1\n#   include <tr1/tuple>\n#   undef _TR1_FUNCTIONAL  // Allows the user to #include\n                        // <tr1/functional> if they choose to.\n#  else\n#   include <tr1/tuple>  // NOLINT\n#  endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302\n\n// VS 2010 now has tr1 support.\n# elif _MSC_VER >= 1600\n#  include <tuple>  // IWYU pragma: export  // NOLINT\n\n# else  // GTEST_USE_OWN_TR1_TUPLE\n#  include <tr1/tuple>  // IWYU pragma: export  // NOLINT\n# endif  // GTEST_USE_OWN_TR1_TUPLE\n\n#endif  // GTEST_HAS_TR1_TUPLE\n\n// Determines whether clone(2) is supported.\n// Usually it will only be available on Linux, excluding\n// Linux on the Itanium architecture.\n// Also see http://linux.die.net/man/2/clone.\n#ifndef GTEST_HAS_CLONE\n// The user didn't tell us, so we need to figure it out.\n\n# if GTEST_OS_LINUX && !defined(__ia64__)\n#  if GTEST_OS_LINUX_ANDROID\n// On Android, clone() became available at different API levels for each 32-bit\n// architecture.\n#    if defined(__LP64__) || \\\n        (defined(__arm__) && __ANDROID_API__ >= 9) || \\\n        (defined(__mips__) && __ANDROID_API__ >= 12) || \\\n        (defined(__i386__) && __ANDROID_API__ >= 17)\n#     define GTEST_HAS_CLONE 1\n#    else\n#     define GTEST_HAS_CLONE 0\n#    endif\n#  else\n#   define GTEST_HAS_CLONE 1\n#  endif\n# else\n#  define GTEST_HAS_CLONE 0\n# endif  // GTEST_OS_LINUX && !defined(__ia64__)\n\n#endif  // GTEST_HAS_CLONE\n\n// Determines whether to support stream redirection. This is used to test\n// output correctness and to implement death tests.\n#ifndef GTEST_HAS_STREAM_REDIRECTION\n// By default, we assume that stream redirection is supported on all\n// platforms except known mobile ones.\n# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || \\\n    GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT\n#  define GTEST_HAS_STREAM_REDIRECTION 0\n# else\n#  define GTEST_HAS_STREAM_REDIRECTION 1\n# endif  // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN\n#endif  // GTEST_HAS_STREAM_REDIRECTION\n\n// Determines whether to support death tests.\n// Google Test does not support death tests for VC 7.1 and earlier as\n// abort() in a VC 7.1 application compiled as GUI in debug config\n// pops up a dialog window that cannot be suppressed programmatically.\n#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS ||   \\\n     (GTEST_OS_MAC && !GTEST_OS_IOS) ||                         \\\n     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) ||          \\\n     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \\\n     GTEST_OS_OPENBSD || GTEST_OS_QNX || GTEST_OS_FREEBSD || \\\n     GTEST_OS_NETBSD || GTEST_OS_FUCHSIA)\n# define GTEST_HAS_DEATH_TEST 1\n#endif\n\n// Determines whether to support type-driven tests.\n\n// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,\n// Sun Pro CC, IBM Visual Age, and HP aCC support.\n#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \\\n    defined(__IBMCPP__) || defined(__HP_aCC)\n# define GTEST_HAS_TYPED_TEST 1\n# define GTEST_HAS_TYPED_TEST_P 1\n#endif\n\n// Determines whether to support Combine(). This only makes sense when\n// value-parameterized tests are enabled.  The implementation doesn't\n// work on Sun Studio since it doesn't understand templated conversion\n// operators.\n#if (GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_) && !defined(__SUNPRO_CC)\n# define GTEST_HAS_COMBINE 1\n#endif\n\n// Determines whether the system compiler uses UTF-16 for encoding wide strings.\n#define GTEST_WIDE_STRING_USES_UTF16_ \\\n    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)\n\n// Determines whether test results can be streamed to a socket.\n#if GTEST_OS_LINUX\n# define GTEST_CAN_STREAM_RESULTS_ 1\n#endif\n\n// Defines some utility macros.\n\n// The GNU compiler emits a warning if nested \"if\" statements are followed by\n// an \"else\" statement and braces are not used to explicitly disambiguate the\n// \"else\" binding.  This leads to problems with code like:\n//\n//   if (gate)\n//     ASSERT_*(condition) << \"Some message\";\n//\n// The \"switch (0) case 0:\" idiom is used to suppress this.\n#ifdef __INTEL_COMPILER\n# define GTEST_AMBIGUOUS_ELSE_BLOCKER_\n#else\n# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default:  // NOLINT\n#endif\n\n// Use this annotation at the end of a struct/class definition to\n// prevent the compiler from optimizing away instances that are never\n// used.  This is useful when all interesting logic happens inside the\n// c'tor and / or d'tor.  Example:\n//\n//   struct Foo {\n//     Foo() { ... }\n//   } GTEST_ATTRIBUTE_UNUSED_;\n//\n// Also use it after a variable or parameter declaration to tell the\n// compiler the variable/parameter does not have to be used.\n#if defined(__GNUC__) && !defined(COMPILER_ICC)\n# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))\n#elif defined(__clang__)\n# if __has_attribute(unused)\n#  define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))\n# endif\n#endif\n#ifndef GTEST_ATTRIBUTE_UNUSED_\n# define GTEST_ATTRIBUTE_UNUSED_\n#endif\n\n#if GTEST_LANG_CXX11\n# define GTEST_CXX11_EQUALS_DELETE_ = delete\n#else  // GTEST_LANG_CXX11\n# define GTEST_CXX11_EQUALS_DELETE_\n#endif  // GTEST_LANG_CXX11\n\n// Use this annotation before a function that takes a printf format string.\n#if (defined(__GNUC__) || defined(__clang__)) && !defined(COMPILER_ICC)\n# if defined(__MINGW_PRINTF_FORMAT)\n// MinGW has two different printf implementations. Ensure the format macro\n// matches the selected implementation. See\n// https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/.\n#  define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \\\n       __attribute__((__format__(__MINGW_PRINTF_FORMAT, string_index, \\\n                                 first_to_check)))\n# else\n#  define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \\\n       __attribute__((__format__(__printf__, string_index, first_to_check)))\n# endif\n#else\n# define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check)\n#endif\n\n\n// A macro to disallow operator=\n// This should be used in the private: declarations for a class.\n#define GTEST_DISALLOW_ASSIGN_(type) \\\n  void operator=(type const &) GTEST_CXX11_EQUALS_DELETE_\n\n// A macro to disallow copy constructor and operator=\n// This should be used in the private: declarations for a class.\n#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \\\n  type(type const &) GTEST_CXX11_EQUALS_DELETE_; \\\n  GTEST_DISALLOW_ASSIGN_(type)\n\n// Tell the compiler to warn about unused return values for functions declared\n// with this macro.  The macro should be used on function declarations\n// following the argument list:\n//\n//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;\n#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)\n# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))\n#else\n# define GTEST_MUST_USE_RESULT_\n#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC\n\n// MS C++ compiler emits warning when a conditional expression is compile time\n// constant. In some contexts this warning is false positive and needs to be\n// suppressed. Use the following two macros in such cases:\n//\n// GTEST_INTENTIONAL_CONST_COND_PUSH_()\n// while (true) {\n// GTEST_INTENTIONAL_CONST_COND_POP_()\n// }\n# define GTEST_INTENTIONAL_CONST_COND_PUSH_() \\\n    GTEST_DISABLE_MSC_WARNINGS_PUSH_(4127)\n# define GTEST_INTENTIONAL_CONST_COND_POP_() \\\n    GTEST_DISABLE_MSC_WARNINGS_POP_()\n\n// Determine whether the compiler supports Microsoft's Structured Exception\n// Handling.  This is supported by several Windows compilers but generally\n// does not exist on any other system.\n#ifndef GTEST_HAS_SEH\n// The user didn't tell us, so we need to figure it out.\n\n# if defined(_MSC_VER) || defined(__BORLANDC__)\n// These two compilers are known to support SEH.\n#  define GTEST_HAS_SEH 1\n# else\n// Assume no SEH.\n#  define GTEST_HAS_SEH 0\n# endif\n\n#define GTEST_IS_THREADSAFE \\\n    (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ \\\n     || (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) \\\n     || GTEST_HAS_PTHREAD)\n\n#endif  // GTEST_HAS_SEH\n\n// GTEST_API_ qualifies all symbols that must be exported. The definitions below\n// are guarded by #ifndef to give embedders a chance to define GTEST_API_ in\n// gtest/internal/custom/gtest-port.h\n#ifndef GTEST_API_\n\n#ifdef _MSC_VER\n# if GTEST_LINKED_AS_SHARED_LIBRARY\n#  define GTEST_API_ __declspec(dllimport)\n# elif GTEST_CREATE_SHARED_LIBRARY\n#  define GTEST_API_ __declspec(dllexport)\n# endif\n#elif __GNUC__ >= 4 || defined(__clang__)\n# define GTEST_API_ __attribute__((visibility (\"default\")))\n#endif  // _MSC_VER\n\n#endif  // GTEST_API_\n\n#ifndef GTEST_API_\n# define GTEST_API_\n#endif  // GTEST_API_\n\n#ifndef GTEST_DEFAULT_DEATH_TEST_STYLE\n# define GTEST_DEFAULT_DEATH_TEST_STYLE  \"fast\"\n#endif  // GTEST_DEFAULT_DEATH_TEST_STYLE\n\n#ifdef __GNUC__\n// Ask the compiler to never inline a given function.\n# define GTEST_NO_INLINE_ __attribute__((noinline))\n#else\n# define GTEST_NO_INLINE_\n#endif\n\n// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.\n#if !defined(GTEST_HAS_CXXABI_H_)\n# if defined(__GLIBCXX__) || (defined(_LIBCPP_VERSION) && !defined(_MSC_VER))\n#  define GTEST_HAS_CXXABI_H_ 1\n# else\n#  define GTEST_HAS_CXXABI_H_ 0\n# endif\n#endif\n\n// A function level attribute to disable checking for use of uninitialized\n// memory when built with MemorySanitizer.\n#if defined(__clang__)\n# if __has_feature(memory_sanitizer)\n#  define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ \\\n       __attribute__((no_sanitize_memory))\n# else\n#  define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_\n# endif  // __has_feature(memory_sanitizer)\n#else\n# define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_\n#endif  // __clang__\n\n// A function level attribute to disable AddressSanitizer instrumentation.\n#if defined(__clang__)\n# if __has_feature(address_sanitizer)\n#  define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ \\\n       __attribute__((no_sanitize_address))\n# else\n#  define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_\n# endif  // __has_feature(address_sanitizer)\n#else\n# define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_\n#endif  // __clang__\n\n// A function level attribute to disable ThreadSanitizer instrumentation.\n#if defined(__clang__)\n# if __has_feature(thread_sanitizer)\n#  define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ \\\n       __attribute__((no_sanitize_thread))\n# else\n#  define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_\n# endif  // __has_feature(thread_sanitizer)\n#else\n# define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_\n#endif  // __clang__\n\nnamespace testing {\n\nclass Message;\n\n#if defined(GTEST_TUPLE_NAMESPACE_)\n// Import tuple and friends into the ::testing namespace.\n// It is part of our interface, having them in ::testing allows us to change\n// their types as needed.\nusing GTEST_TUPLE_NAMESPACE_::get;\nusing GTEST_TUPLE_NAMESPACE_::make_tuple;\nusing GTEST_TUPLE_NAMESPACE_::tuple;\nusing GTEST_TUPLE_NAMESPACE_::tuple_size;\nusing GTEST_TUPLE_NAMESPACE_::tuple_element;\n#endif  // defined(GTEST_TUPLE_NAMESPACE_)\n\nnamespace internal {\n\n// A secret type that Google Test users don't know about.  It has no\n// definition on purpose.  Therefore it's impossible to create a\n// Secret object, which is what we want.\nclass Secret;\n\n// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time\n// expression is true. For example, you could use it to verify the\n// size of a static array:\n//\n//   GTEST_COMPILE_ASSERT_(GTEST_ARRAY_SIZE_(names) == NUM_NAMES,\n//                         names_incorrect_size);\n//\n// or to make sure a struct is smaller than a certain size:\n//\n//   GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);\n//\n// The second argument to the macro is the name of the variable. If\n// the expression is false, most compilers will issue a warning/error\n// containing the name of the variable.\n\n#if GTEST_LANG_CXX11\n# define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)\n#else  // !GTEST_LANG_CXX11\ntemplate <bool>\n  struct CompileAssert {\n};\n\n# define GTEST_COMPILE_ASSERT_(expr, msg) \\\n  typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \\\n      msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_\n#endif  // !GTEST_LANG_CXX11\n\n// Implementation details of GTEST_COMPILE_ASSERT_:\n//\n// (In C++11, we simply use static_assert instead of the following)\n//\n// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1\n//   elements (and thus is invalid) when the expression is false.\n//\n// - The simpler definition\n//\n//    #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]\n//\n//   does not work, as gcc supports variable-length arrays whose sizes\n//   are determined at run-time (this is gcc's extension and not part\n//   of the C++ standard).  As a result, gcc fails to reject the\n//   following code with the simple definition:\n//\n//     int foo;\n//     GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is\n//                                      // not a compile-time constant.\n//\n// - By using the type CompileAssert<(bool(expr))>, we ensures that\n//   expr is a compile-time constant.  (Template arguments must be\n//   determined at compile-time.)\n//\n// - The outter parentheses in CompileAssert<(bool(expr))> are necessary\n//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written\n//\n//     CompileAssert<bool(expr)>\n//\n//   instead, these compilers will refuse to compile\n//\n//     GTEST_COMPILE_ASSERT_(5 > 0, some_message);\n//\n//   (They seem to think the \">\" in \"5 > 0\" marks the end of the\n//   template argument list.)\n//\n// - The array size is (bool(expr) ? 1 : -1), instead of simply\n//\n//     ((expr) ? 1 : -1).\n//\n//   This is to avoid running into a bug in MS VC 7.1, which\n//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.\n\n// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.\n//\n// This template is declared, but intentionally undefined.\ntemplate <typename T1, typename T2>\nstruct StaticAssertTypeEqHelper;\n\ntemplate <typename T>\nstruct StaticAssertTypeEqHelper<T, T> {\n  enum { value = true };\n};\n\n// Same as std::is_same<>.\ntemplate <typename T, typename U>\nstruct IsSame {\n  enum { value = false };\n};\ntemplate <typename T>\nstruct IsSame<T, T> {\n  enum { value = true };\n};\n\n// Evaluates to the number of elements in 'array'.\n#define GTEST_ARRAY_SIZE_(array) (sizeof(array) / sizeof(array[0]))\n\n#if GTEST_HAS_GLOBAL_STRING\ntypedef ::string string;\n#else\ntypedef ::std::string string;\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n#if GTEST_HAS_GLOBAL_WSTRING\ntypedef ::wstring wstring;\n#elif GTEST_HAS_STD_WSTRING\ntypedef ::std::wstring wstring;\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n// A helper for suppressing warnings on constant condition.  It just\n// returns 'condition'.\nGTEST_API_ bool IsTrue(bool condition);\n\n// Defines scoped_ptr.\n\n// This implementation of scoped_ptr is PARTIAL - it only contains\n// enough stuff to satisfy Google Test's need.\ntemplate <typename T>\nclass scoped_ptr {\n public:\n  typedef T element_type;\n\n  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}\n  ~scoped_ptr() { reset(); }\n\n  T& operator*() const { return *ptr_; }\n  T* operator->() const { return ptr_; }\n  T* get() const { return ptr_; }\n\n  T* release() {\n    T* const ptr = ptr_;\n    ptr_ = NULL;\n    return ptr;\n  }\n\n  void reset(T* p = NULL) {\n    if (p != ptr_) {\n      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.\n        delete ptr_;\n      }\n      ptr_ = p;\n    }\n  }\n\n  friend void swap(scoped_ptr& a, scoped_ptr& b) {\n    using std::swap;\n    swap(a.ptr_, b.ptr_);\n  }\n\n private:\n  T* ptr_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);\n};\n\n// Defines RE.\n\n#if GTEST_USES_PCRE\n// if used, PCRE is injected by custom/gtest-port.h\n#elif GTEST_USES_POSIX_RE || GTEST_USES_SIMPLE_RE\n\n// A simple C++ wrapper for <regex.h>.  It uses the POSIX Extended\n// Regular Expression syntax.\nclass GTEST_API_ RE {\n public:\n  // A copy constructor is required by the Standard to initialize object\n  // references from r-values.\n  RE(const RE& other) { Init(other.pattern()); }\n\n  // Constructs an RE from a string.\n  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT\n\n# if GTEST_HAS_GLOBAL_STRING\n\n  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT\n\n# endif  // GTEST_HAS_GLOBAL_STRING\n\n  RE(const char* regex) { Init(regex); }  // NOLINT\n  ~RE();\n\n  // Returns the string representation of the regex.\n  const char* pattern() const { return pattern_; }\n\n  // FullMatch(str, re) returns true iff regular expression re matches\n  // the entire str.\n  // PartialMatch(str, re) returns true iff regular expression re\n  // matches a substring of str (including str itself).\n  //\n  // FIXME: make FullMatch() and PartialMatch() work\n  // when str contains NUL characters.\n  static bool FullMatch(const ::std::string& str, const RE& re) {\n    return FullMatch(str.c_str(), re);\n  }\n  static bool PartialMatch(const ::std::string& str, const RE& re) {\n    return PartialMatch(str.c_str(), re);\n  }\n\n# if GTEST_HAS_GLOBAL_STRING\n\n  static bool FullMatch(const ::string& str, const RE& re) {\n    return FullMatch(str.c_str(), re);\n  }\n  static bool PartialMatch(const ::string& str, const RE& re) {\n    return PartialMatch(str.c_str(), re);\n  }\n\n# endif  // GTEST_HAS_GLOBAL_STRING\n\n  static bool FullMatch(const char* str, const RE& re);\n  static bool PartialMatch(const char* str, const RE& re);\n\n private:\n  void Init(const char* regex);\n\n  // We use a const char* instead of an std::string, as Google Test used to be\n  // used where std::string is not available.  FIXME: change to\n  // std::string.\n  const char* pattern_;\n  bool is_valid_;\n\n# if GTEST_USES_POSIX_RE\n\n  regex_t full_regex_;     // For FullMatch().\n  regex_t partial_regex_;  // For PartialMatch().\n\n# else  // GTEST_USES_SIMPLE_RE\n\n  const char* full_pattern_;  // For FullMatch();\n\n# endif\n\n  GTEST_DISALLOW_ASSIGN_(RE);\n};\n\n#endif  // GTEST_USES_PCRE\n\n// Formats a source file path and a line number as they would appear\n// in an error message from the compiler used to compile this code.\nGTEST_API_ ::std::string FormatFileLocation(const char* file, int line);\n\n// Formats a file location for compiler-independent XML output.\n// Although this function is not platform dependent, we put it next to\n// FormatFileLocation in order to contrast the two functions.\nGTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,\n                                                               int line);\n\n// Defines logging utilities:\n//   GTEST_LOG_(severity) - logs messages at the specified severity level. The\n//                          message itself is streamed into the macro.\n//   LogToStderr()  - directs all log messages to stderr.\n//   FlushInfoLog() - flushes informational log messages.\n\nenum GTestLogSeverity {\n  GTEST_INFO,\n  GTEST_WARNING,\n  GTEST_ERROR,\n  GTEST_FATAL\n};\n\n// Formats log entry severity, provides a stream object for streaming the\n// log message, and terminates the message with a newline when going out of\n// scope.\nclass GTEST_API_ GTestLog {\n public:\n  GTestLog(GTestLogSeverity severity, const char* file, int line);\n\n  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.\n  ~GTestLog();\n\n  ::std::ostream& GetStream() { return ::std::cerr; }\n\n private:\n  const GTestLogSeverity severity_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);\n};\n\n#if !defined(GTEST_LOG_)\n\n# define GTEST_LOG_(severity) \\\n    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \\\n                                  __FILE__, __LINE__).GetStream()\n\ninline void LogToStderr() {}\ninline void FlushInfoLog() { fflush(NULL); }\n\n#endif  // !defined(GTEST_LOG_)\n\n#if !defined(GTEST_CHECK_)\n// INTERNAL IMPLEMENTATION - DO NOT USE.\n//\n// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition\n// is not satisfied.\n//  Synopsys:\n//    GTEST_CHECK_(boolean_condition);\n//     or\n//    GTEST_CHECK_(boolean_condition) << \"Additional message\";\n//\n//    This checks the condition and if the condition is not satisfied\n//    it prints message about the condition violation, including the\n//    condition itself, plus additional message streamed into it, if any,\n//    and then it aborts the program. It aborts the program irrespective of\n//    whether it is built in the debug mode or not.\n# define GTEST_CHECK_(condition) \\\n    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n    if (::testing::internal::IsTrue(condition)) \\\n      ; \\\n    else \\\n      GTEST_LOG_(FATAL) << \"Condition \" #condition \" failed. \"\n#endif  // !defined(GTEST_CHECK_)\n\n// An all-mode assert to verify that the given POSIX-style function\n// call returns 0 (indicating success).  Known limitation: this\n// doesn't expand to a balanced 'if' statement, so enclose the macro\n// in {} if you need to use it as the only statement in an 'if'\n// branch.\n#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \\\n  if (const int gtest_error = (posix_call)) \\\n    GTEST_LOG_(FATAL) << #posix_call << \"failed with error \" \\\n                      << gtest_error\n\n// Adds reference to a type if it is not a reference type,\n// otherwise leaves it unchanged.  This is the same as\n// tr1::add_reference, which is not widely available yet.\ntemplate <typename T>\nstruct AddReference { typedef T& type; };  // NOLINT\ntemplate <typename T>\nstruct AddReference<T&> { typedef T& type; };  // NOLINT\n\n// A handy wrapper around AddReference that works when the argument T\n// depends on template parameters.\n#define GTEST_ADD_REFERENCE_(T) \\\n    typename ::testing::internal::AddReference<T>::type\n\n// Transforms \"T\" into \"const T&\" according to standard reference collapsing\n// rules (this is only needed as a backport for C++98 compilers that do not\n// support reference collapsing). Specifically, it transforms:\n//\n//   char         ==> const char&\n//   const char   ==> const char&\n//   char&        ==> char&\n//   const char&  ==> const char&\n//\n// Note that the non-const reference will not have \"const\" added. This is\n// standard, and necessary so that \"T\" can always bind to \"const T&\".\ntemplate <typename T>\nstruct ConstRef { typedef const T& type; };\ntemplate <typename T>\nstruct ConstRef<T&> { typedef T& type; };\n\n// The argument T must depend on some template parameters.\n#define GTEST_REFERENCE_TO_CONST_(T) \\\n  typename ::testing::internal::ConstRef<T>::type\n\n#if GTEST_HAS_STD_MOVE_\nusing std::forward;\nusing std::move;\n\ntemplate <typename T>\nstruct RvalueRef {\n  typedef T&& type;\n};\n#else  // GTEST_HAS_STD_MOVE_\ntemplate <typename T>\nconst T& move(const T& t) {\n  return t;\n}\ntemplate <typename T>\nGTEST_ADD_REFERENCE_(T) forward(GTEST_ADD_REFERENCE_(T) t) { return t; }\n\ntemplate <typename T>\nstruct RvalueRef {\n  typedef const T& type;\n};\n#endif  // GTEST_HAS_STD_MOVE_\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Use ImplicitCast_ as a safe version of static_cast for upcasting in\n// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a\n// const Foo*).  When you use ImplicitCast_, the compiler checks that\n// the cast is safe.  Such explicit ImplicitCast_s are necessary in\n// surprisingly many situations where C++ demands an exact type match\n// instead of an argument type convertable to a target type.\n//\n// The syntax for using ImplicitCast_ is the same as for static_cast:\n//\n//   ImplicitCast_<ToType>(expr)\n//\n// ImplicitCast_ would have been part of the C++ standard library,\n// but the proposal was submitted too late.  It will probably make\n// its way into the language in the future.\n//\n// This relatively ugly name is intentional. It prevents clashes with\n// similar functions users may have (e.g., implicit_cast). The internal\n// namespace alone is not enough because the function can be found by ADL.\ntemplate<typename To>\ninline To ImplicitCast_(To x) { return x; }\n\n// When you upcast (that is, cast a pointer from type Foo to type\n// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts\n// always succeed.  When you downcast (that is, cast a pointer from\n// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because\n// how do you know the pointer is really of type SubclassOfFoo?  It\n// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,\n// when you downcast, you should use this macro.  In debug mode, we\n// use dynamic_cast<> to double-check the downcast is legal (we die\n// if it's not).  In normal mode, we do the efficient static_cast<>\n// instead.  Thus, it's important to test in debug mode to make sure\n// the cast is legal!\n//    This is the only place in the code we should use dynamic_cast<>.\n// In particular, you SHOULDN'T be using dynamic_cast<> in order to\n// do RTTI (eg code like this:\n//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);\n//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);\n// You should design the code some other way not to need this.\n//\n// This relatively ugly name is intentional. It prevents clashes with\n// similar functions users may have (e.g., down_cast). The internal\n// namespace alone is not enough because the function can be found by ADL.\ntemplate<typename To, typename From>  // use like this: DownCast_<T*>(foo);\ninline To DownCast_(From* f) {  // so we only accept pointers\n  // Ensures that To is a sub-type of From *.  This test is here only\n  // for compile-time type checking, and has no overhead in an\n  // optimized build at run-time, as it will be optimized away\n  // completely.\n  GTEST_INTENTIONAL_CONST_COND_PUSH_()\n  if (false) {\n  GTEST_INTENTIONAL_CONST_COND_POP_()\n    const To to = NULL;\n    ::testing::internal::ImplicitCast_<From*>(to);\n  }\n\n#if GTEST_HAS_RTTI\n  // RTTI: debug mode only!\n  GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);\n#endif\n  return static_cast<To>(f);\n}\n\n// Downcasts the pointer of type Base to Derived.\n// Derived must be a subclass of Base. The parameter MUST\n// point to a class of type Derived, not any subclass of it.\n// When RTTI is available, the function performs a runtime\n// check to enforce this.\ntemplate <class Derived, class Base>\nDerived* CheckedDowncastToActualType(Base* base) {\n#if GTEST_HAS_RTTI\n  GTEST_CHECK_(typeid(*base) == typeid(Derived));\n#endif\n\n#if GTEST_HAS_DOWNCAST_\n  return ::down_cast<Derived*>(base);\n#elif GTEST_HAS_RTTI\n  return dynamic_cast<Derived*>(base);  // NOLINT\n#else\n  return static_cast<Derived*>(base);  // Poor man's downcast.\n#endif\n}\n\n#if GTEST_HAS_STREAM_REDIRECTION\n\n// Defines the stderr capturer:\n//   CaptureStdout     - starts capturing stdout.\n//   GetCapturedStdout - stops capturing stdout and returns the captured string.\n//   CaptureStderr     - starts capturing stderr.\n//   GetCapturedStderr - stops capturing stderr and returns the captured string.\n//\nGTEST_API_ void CaptureStdout();\nGTEST_API_ std::string GetCapturedStdout();\nGTEST_API_ void CaptureStderr();\nGTEST_API_ std::string GetCapturedStderr();\n\n#endif  // GTEST_HAS_STREAM_REDIRECTION\n// Returns the size (in bytes) of a file.\nGTEST_API_ size_t GetFileSize(FILE* file);\n\n// Reads the entire content of a file as a string.\nGTEST_API_ std::string ReadEntireFile(FILE* file);\n\n// All command line arguments.\nGTEST_API_ std::vector<std::string> GetArgvs();\n\n#if GTEST_HAS_DEATH_TEST\n\nstd::vector<std::string> GetInjectableArgvs();\n// Deprecated: pass the args vector by value instead.\nvoid SetInjectableArgvs(const std::vector<std::string>* new_argvs);\nvoid SetInjectableArgvs(const std::vector<std::string>& new_argvs);\n#if GTEST_HAS_GLOBAL_STRING\nvoid SetInjectableArgvs(const std::vector< ::string>& new_argvs);\n#endif  // GTEST_HAS_GLOBAL_STRING\nvoid ClearInjectableArgvs();\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n// Defines synchronization primitives.\n#if GTEST_IS_THREADSAFE\n# if GTEST_HAS_PTHREAD\n// Sleeps for (roughly) n milliseconds.  This function is only for testing\n// Google Test's own constructs.  Don't use it in user tests, either\n// directly or indirectly.\ninline void SleepMilliseconds(int n) {\n  const timespec time = {\n    0,                  // 0 seconds.\n    n * 1000L * 1000L,  // And n ms.\n  };\n  nanosleep(&time, NULL);\n}\n# endif  // GTEST_HAS_PTHREAD\n\n# if GTEST_HAS_NOTIFICATION_\n// Notification has already been imported into the namespace.\n// Nothing to do here.\n\n# elif GTEST_HAS_PTHREAD\n// Allows a controller thread to pause execution of newly created\n// threads until notified.  Instances of this class must be created\n// and destroyed in the controller thread.\n//\n// This class is only for testing Google Test's own constructs. Do not\n// use it in user tests, either directly or indirectly.\nclass Notification {\n public:\n  Notification() : notified_(false) {\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));\n  }\n  ~Notification() {\n    pthread_mutex_destroy(&mutex_);\n  }\n\n  // Notifies all threads created with this notification to start. Must\n  // be called from the controller thread.\n  void Notify() {\n    pthread_mutex_lock(&mutex_);\n    notified_ = true;\n    pthread_mutex_unlock(&mutex_);\n  }\n\n  // Blocks until the controller thread notifies. Must be called from a test\n  // thread.\n  void WaitForNotification() {\n    for (;;) {\n      pthread_mutex_lock(&mutex_);\n      const bool notified = notified_;\n      pthread_mutex_unlock(&mutex_);\n      if (notified)\n        break;\n      SleepMilliseconds(10);\n    }\n  }\n\n private:\n  pthread_mutex_t mutex_;\n  bool notified_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);\n};\n\n# elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT\n\nGTEST_API_ void SleepMilliseconds(int n);\n\n// Provides leak-safe Windows kernel handle ownership.\n// Used in death tests and in threading support.\nclass GTEST_API_ AutoHandle {\n public:\n  // Assume that Win32 HANDLE type is equivalent to void*. Doing so allows us to\n  // avoid including <windows.h> in this header file. Including <windows.h> is\n  // undesirable because it defines a lot of symbols and macros that tend to\n  // conflict with client code. This assumption is verified by\n  // WindowsTypesTest.HANDLEIsVoidStar.\n  typedef void* Handle;\n  AutoHandle();\n  explicit AutoHandle(Handle handle);\n\n  ~AutoHandle();\n\n  Handle Get() const;\n  void Reset();\n  void Reset(Handle handle);\n\n private:\n  // Returns true iff the handle is a valid handle object that can be closed.\n  bool IsCloseable() const;\n\n  Handle handle_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);\n};\n\n// Allows a controller thread to pause execution of newly created\n// threads until notified.  Instances of this class must be created\n// and destroyed in the controller thread.\n//\n// This class is only for testing Google Test's own constructs. Do not\n// use it in user tests, either directly or indirectly.\nclass GTEST_API_ Notification {\n public:\n  Notification();\n  void Notify();\n  void WaitForNotification();\n\n private:\n  AutoHandle event_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);\n};\n# endif  // GTEST_HAS_NOTIFICATION_\n\n// On MinGW, we can have both GTEST_OS_WINDOWS and GTEST_HAS_PTHREAD\n// defined, but we don't want to use MinGW's pthreads implementation, which\n// has conformance problems with some versions of the POSIX standard.\n# if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW\n\n// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.\n// Consequently, it cannot select a correct instantiation of ThreadWithParam\n// in order to call its Run(). Introducing ThreadWithParamBase as a\n// non-templated base class for ThreadWithParam allows us to bypass this\n// problem.\nclass ThreadWithParamBase {\n public:\n  virtual ~ThreadWithParamBase() {}\n  virtual void Run() = 0;\n};\n\n// pthread_create() accepts a pointer to a function type with the C linkage.\n// According to the Standard (7.5/1), function types with different linkages\n// are different even if they are otherwise identical.  Some compilers (for\n// example, SunStudio) treat them as different types.  Since class methods\n// cannot be defined with C-linkage we need to define a free C-function to\n// pass into pthread_create().\nextern \"C\" inline void* ThreadFuncWithCLinkage(void* thread) {\n  static_cast<ThreadWithParamBase*>(thread)->Run();\n  return NULL;\n}\n\n// Helper class for testing Google Test's multi-threading constructs.\n// To use it, write:\n//\n//   void ThreadFunc(int param) { /* Do things with param */ }\n//   Notification thread_can_start;\n//   ...\n//   // The thread_can_start parameter is optional; you can supply NULL.\n//   ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);\n//   thread_can_start.Notify();\n//\n// These classes are only for testing Google Test's own constructs. Do\n// not use them in user tests, either directly or indirectly.\ntemplate <typename T>\nclass ThreadWithParam : public ThreadWithParamBase {\n public:\n  typedef void UserThreadFunc(T);\n\n  ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start)\n      : func_(func),\n        param_(param),\n        thread_can_start_(thread_can_start),\n        finished_(false) {\n    ThreadWithParamBase* const base = this;\n    // The thread can be created only after all fields except thread_\n    // have been initialized.\n    GTEST_CHECK_POSIX_SUCCESS_(\n        pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));\n  }\n  ~ThreadWithParam() { Join(); }\n\n  void Join() {\n    if (!finished_) {\n      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));\n      finished_ = true;\n    }\n  }\n\n  virtual void Run() {\n    if (thread_can_start_ != NULL)\n      thread_can_start_->WaitForNotification();\n    func_(param_);\n  }\n\n private:\n  UserThreadFunc* const func_;  // User-supplied thread function.\n  const T param_;  // User-supplied parameter to the thread function.\n  // When non-NULL, used to block execution until the controller thread\n  // notifies.\n  Notification* const thread_can_start_;\n  bool finished_;  // true iff we know that the thread function has finished.\n  pthread_t thread_;  // The native thread object.\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);\n};\n# endif  // !GTEST_OS_WINDOWS && GTEST_HAS_PTHREAD ||\n         // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_\n\n# if GTEST_HAS_MUTEX_AND_THREAD_LOCAL_\n// Mutex and ThreadLocal have already been imported into the namespace.\n// Nothing to do here.\n\n# elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT\n\n// Mutex implements mutex on Windows platforms.  It is used in conjunction\n// with class MutexLock:\n//\n//   Mutex mutex;\n//   ...\n//   MutexLock lock(&mutex);  // Acquires the mutex and releases it at the\n//                            // end of the current scope.\n//\n// A static Mutex *must* be defined or declared using one of the following\n// macros:\n//   GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);\n//   GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);\n//\n// (A non-static Mutex is defined/declared in the usual way).\nclass GTEST_API_ Mutex {\n public:\n  enum MutexType { kStatic = 0, kDynamic = 1 };\n  // We rely on kStaticMutex being 0 as it is to what the linker initializes\n  // type_ in static mutexes.  critical_section_ will be initialized lazily\n  // in ThreadSafeLazyInit().\n  enum StaticConstructorSelector { kStaticMutex = 0 };\n\n  // This constructor intentionally does nothing.  It relies on type_ being\n  // statically initialized to 0 (effectively setting it to kStatic) and on\n  // ThreadSafeLazyInit() to lazily initialize the rest of the members.\n  explicit Mutex(StaticConstructorSelector /*dummy*/) {}\n\n  Mutex();\n  ~Mutex();\n\n  void Lock();\n\n  void Unlock();\n\n  // Does nothing if the current thread holds the mutex. Otherwise, crashes\n  // with high probability.\n  void AssertHeld();\n\n private:\n  // Initializes owner_thread_id_ and critical_section_ in static mutexes.\n  void ThreadSafeLazyInit();\n\n  // Per https://blogs.msdn.microsoft.com/oldnewthing/20040223-00/?p=40503,\n  // we assume that 0 is an invalid value for thread IDs.\n  unsigned int owner_thread_id_;\n\n  // For static mutexes, we rely on these members being initialized to zeros\n  // by the linker.\n  MutexType type_;\n  long critical_section_init_phase_;  // NOLINT\n  GTEST_CRITICAL_SECTION* critical_section_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);\n};\n\n# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \\\n    extern ::testing::internal::Mutex mutex\n\n# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \\\n    ::testing::internal::Mutex mutex(::testing::internal::Mutex::kStaticMutex)\n\n// We cannot name this class MutexLock because the ctor declaration would\n// conflict with a macro named MutexLock, which is defined on some\n// platforms. That macro is used as a defensive measure to prevent against\n// inadvertent misuses of MutexLock like \"MutexLock(&mu)\" rather than\n// \"MutexLock l(&mu)\".  Hence the typedef trick below.\nclass GTestMutexLock {\n public:\n  explicit GTestMutexLock(Mutex* mutex)\n      : mutex_(mutex) { mutex_->Lock(); }\n\n  ~GTestMutexLock() { mutex_->Unlock(); }\n\n private:\n  Mutex* const mutex_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);\n};\n\ntypedef GTestMutexLock MutexLock;\n\n// Base class for ValueHolder<T>.  Allows a caller to hold and delete a value\n// without knowing its type.\nclass ThreadLocalValueHolderBase {\n public:\n  virtual ~ThreadLocalValueHolderBase() {}\n};\n\n// Provides a way for a thread to send notifications to a ThreadLocal\n// regardless of its parameter type.\nclass ThreadLocalBase {\n public:\n  // Creates a new ValueHolder<T> object holding a default value passed to\n  // this ThreadLocal<T>'s constructor and returns it.  It is the caller's\n  // responsibility not to call this when the ThreadLocal<T> instance already\n  // has a value on the current thread.\n  virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const = 0;\n\n protected:\n  ThreadLocalBase() {}\n  virtual ~ThreadLocalBase() {}\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocalBase);\n};\n\n// Maps a thread to a set of ThreadLocals that have values instantiated on that\n// thread and notifies them when the thread exits.  A ThreadLocal instance is\n// expected to persist until all threads it has values on have terminated.\nclass GTEST_API_ ThreadLocalRegistry {\n public:\n  // Registers thread_local_instance as having value on the current thread.\n  // Returns a value that can be used to identify the thread from other threads.\n  static ThreadLocalValueHolderBase* GetValueOnCurrentThread(\n      const ThreadLocalBase* thread_local_instance);\n\n  // Invoked when a ThreadLocal instance is destroyed.\n  static void OnThreadLocalDestroyed(\n      const ThreadLocalBase* thread_local_instance);\n};\n\nclass GTEST_API_ ThreadWithParamBase {\n public:\n  void Join();\n\n protected:\n  class Runnable {\n   public:\n    virtual ~Runnable() {}\n    virtual void Run() = 0;\n  };\n\n  ThreadWithParamBase(Runnable *runnable, Notification* thread_can_start);\n  virtual ~ThreadWithParamBase();\n\n private:\n  AutoHandle thread_;\n};\n\n// Helper class for testing Google Test's multi-threading constructs.\ntemplate <typename T>\nclass ThreadWithParam : public ThreadWithParamBase {\n public:\n  typedef void UserThreadFunc(T);\n\n  ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start)\n      : ThreadWithParamBase(new RunnableImpl(func, param), thread_can_start) {\n  }\n  virtual ~ThreadWithParam() {}\n\n private:\n  class RunnableImpl : public Runnable {\n   public:\n    RunnableImpl(UserThreadFunc* func, T param)\n        : func_(func),\n          param_(param) {\n    }\n    virtual ~RunnableImpl() {}\n    virtual void Run() {\n      func_(param_);\n    }\n\n   private:\n    UserThreadFunc* const func_;\n    const T param_;\n\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(RunnableImpl);\n  };\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);\n};\n\n// Implements thread-local storage on Windows systems.\n//\n//   // Thread 1\n//   ThreadLocal<int> tl(100);  // 100 is the default value for each thread.\n//\n//   // Thread 2\n//   tl.set(150);  // Changes the value for thread 2 only.\n//   EXPECT_EQ(150, tl.get());\n//\n//   // Thread 1\n//   EXPECT_EQ(100, tl.get());  // In thread 1, tl has the original value.\n//   tl.set(200);\n//   EXPECT_EQ(200, tl.get());\n//\n// The template type argument T must have a public copy constructor.\n// In addition, the default ThreadLocal constructor requires T to have\n// a public default constructor.\n//\n// The users of a TheadLocal instance have to make sure that all but one\n// threads (including the main one) using that instance have exited before\n// destroying it. Otherwise, the per-thread objects managed for them by the\n// ThreadLocal instance are not guaranteed to be destroyed on all platforms.\n//\n// Google Test only uses global ThreadLocal objects.  That means they\n// will die after main() has returned.  Therefore, no per-thread\n// object managed by Google Test will be leaked as long as all threads\n// using Google Test have exited when main() returns.\ntemplate <typename T>\nclass ThreadLocal : public ThreadLocalBase {\n public:\n  ThreadLocal() : default_factory_(new DefaultValueHolderFactory()) {}\n  explicit ThreadLocal(const T& value)\n      : default_factory_(new InstanceValueHolderFactory(value)) {}\n\n  ~ThreadLocal() { ThreadLocalRegistry::OnThreadLocalDestroyed(this); }\n\n  T* pointer() { return GetOrCreateValue(); }\n  const T* pointer() const { return GetOrCreateValue(); }\n  const T& get() const { return *pointer(); }\n  void set(const T& value) { *pointer() = value; }\n\n private:\n  // Holds a value of T.  Can be deleted via its base class without the caller\n  // knowing the type of T.\n  class ValueHolder : public ThreadLocalValueHolderBase {\n   public:\n    ValueHolder() : value_() {}\n    explicit ValueHolder(const T& value) : value_(value) {}\n\n    T* pointer() { return &value_; }\n\n   private:\n    T value_;\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);\n  };\n\n\n  T* GetOrCreateValue() const {\n    return static_cast<ValueHolder*>(\n        ThreadLocalRegistry::GetValueOnCurrentThread(this))->pointer();\n  }\n\n  virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const {\n    return default_factory_->MakeNewHolder();\n  }\n\n  class ValueHolderFactory {\n   public:\n    ValueHolderFactory() {}\n    virtual ~ValueHolderFactory() {}\n    virtual ValueHolder* MakeNewHolder() const = 0;\n\n   private:\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory);\n  };\n\n  class DefaultValueHolderFactory : public ValueHolderFactory {\n   public:\n    DefaultValueHolderFactory() {}\n    virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(); }\n\n   private:\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);\n  };\n\n  class InstanceValueHolderFactory : public ValueHolderFactory {\n   public:\n    explicit InstanceValueHolderFactory(const T& value) : value_(value) {}\n    virtual ValueHolder* MakeNewHolder() const {\n      return new ValueHolder(value_);\n    }\n\n   private:\n    const T value_;  // The value for each thread.\n\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory);\n  };\n\n  scoped_ptr<ValueHolderFactory> default_factory_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);\n};\n\n# elif GTEST_HAS_PTHREAD\n\n// MutexBase and Mutex implement mutex on pthreads-based platforms.\nclass MutexBase {\n public:\n  // Acquires this mutex.\n  void Lock() {\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));\n    owner_ = pthread_self();\n    has_owner_ = true;\n  }\n\n  // Releases this mutex.\n  void Unlock() {\n    // Since the lock is being released the owner_ field should no longer be\n    // considered valid. We don't protect writing to has_owner_ here, as it's\n    // the caller's responsibility to ensure that the current thread holds the\n    // mutex when this is called.\n    has_owner_ = false;\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));\n  }\n\n  // Does nothing if the current thread holds the mutex. Otherwise, crashes\n  // with high probability.\n  void AssertHeld() const {\n    GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))\n        << \"The current thread is not holding the mutex @\" << this;\n  }\n\n  // A static mutex may be used before main() is entered.  It may even\n  // be used before the dynamic initialization stage.  Therefore we\n  // must be able to initialize a static mutex object at link time.\n  // This means MutexBase has to be a POD and its member variables\n  // have to be public.\n public:\n  pthread_mutex_t mutex_;  // The underlying pthread mutex.\n  // has_owner_ indicates whether the owner_ field below contains a valid thread\n  // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All\n  // accesses to the owner_ field should be protected by a check of this field.\n  // An alternative might be to memset() owner_ to all zeros, but there's no\n  // guarantee that a zero'd pthread_t is necessarily invalid or even different\n  // from pthread_self().\n  bool has_owner_;\n  pthread_t owner_;  // The thread holding the mutex.\n};\n\n// Forward-declares a static mutex.\n#  define GTEST_DECLARE_STATIC_MUTEX_(mutex) \\\n     extern ::testing::internal::MutexBase mutex\n\n// Defines and statically (i.e. at link time) initializes a static mutex.\n// The initialization list here does not explicitly initialize each field,\n// instead relying on default initialization for the unspecified fields. In\n// particular, the owner_ field (a pthread_t) is not explicitly initialized.\n// This allows initialization to work whether pthread_t is a scalar or struct.\n// The flag -Wmissing-field-initializers must not be specified for this to work.\n#define GTEST_DEFINE_STATIC_MUTEX_(mutex) \\\n  ::testing::internal::MutexBase mutex = {PTHREAD_MUTEX_INITIALIZER, false, 0}\n\n// The Mutex class can only be used for mutexes created at runtime. It\n// shares its API with MutexBase otherwise.\nclass Mutex : public MutexBase {\n public:\n  Mutex() {\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));\n    has_owner_ = false;\n  }\n  ~Mutex() {\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));\n  }\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);\n};\n\n// We cannot name this class MutexLock because the ctor declaration would\n// conflict with a macro named MutexLock, which is defined on some\n// platforms. That macro is used as a defensive measure to prevent against\n// inadvertent misuses of MutexLock like \"MutexLock(&mu)\" rather than\n// \"MutexLock l(&mu)\".  Hence the typedef trick below.\nclass GTestMutexLock {\n public:\n  explicit GTestMutexLock(MutexBase* mutex)\n      : mutex_(mutex) { mutex_->Lock(); }\n\n  ~GTestMutexLock() { mutex_->Unlock(); }\n\n private:\n  MutexBase* const mutex_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);\n};\n\ntypedef GTestMutexLock MutexLock;\n\n// Helpers for ThreadLocal.\n\n// pthread_key_create() requires DeleteThreadLocalValue() to have\n// C-linkage.  Therefore it cannot be templatized to access\n// ThreadLocal<T>.  Hence the need for class\n// ThreadLocalValueHolderBase.\nclass ThreadLocalValueHolderBase {\n public:\n  virtual ~ThreadLocalValueHolderBase() {}\n};\n\n// Called by pthread to delete thread-local data stored by\n// pthread_setspecific().\nextern \"C\" inline void DeleteThreadLocalValue(void* value_holder) {\n  delete static_cast<ThreadLocalValueHolderBase*>(value_holder);\n}\n\n// Implements thread-local storage on pthreads-based systems.\ntemplate <typename T>\nclass GTEST_API_ ThreadLocal {\n public:\n  ThreadLocal()\n      : key_(CreateKey()), default_factory_(new DefaultValueHolderFactory()) {}\n  explicit ThreadLocal(const T& value)\n      : key_(CreateKey()),\n        default_factory_(new InstanceValueHolderFactory(value)) {}\n\n  ~ThreadLocal() {\n    // Destroys the managed object for the current thread, if any.\n    DeleteThreadLocalValue(pthread_getspecific(key_));\n\n    // Releases resources associated with the key.  This will *not*\n    // delete managed objects for other threads.\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));\n  }\n\n  T* pointer() { return GetOrCreateValue(); }\n  const T* pointer() const { return GetOrCreateValue(); }\n  const T& get() const { return *pointer(); }\n  void set(const T& value) { *pointer() = value; }\n\n private:\n  // Holds a value of type T.\n  class ValueHolder : public ThreadLocalValueHolderBase {\n   public:\n    ValueHolder() : value_() {}\n    explicit ValueHolder(const T& value) : value_(value) {}\n\n    T* pointer() { return &value_; }\n\n   private:\n    T value_;\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);\n  };\n\n  static pthread_key_t CreateKey() {\n    pthread_key_t key;\n    // When a thread exits, DeleteThreadLocalValue() will be called on\n    // the object managed for that thread.\n    GTEST_CHECK_POSIX_SUCCESS_(\n        pthread_key_create(&key, &DeleteThreadLocalValue));\n    return key;\n  }\n\n  T* GetOrCreateValue() const {\n    ThreadLocalValueHolderBase* const holder =\n        static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));\n    if (holder != NULL) {\n      return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();\n    }\n\n    ValueHolder* const new_holder = default_factory_->MakeNewHolder();\n    ThreadLocalValueHolderBase* const holder_base = new_holder;\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));\n    return new_holder->pointer();\n  }\n\n  class ValueHolderFactory {\n   public:\n    ValueHolderFactory() {}\n    virtual ~ValueHolderFactory() {}\n    virtual ValueHolder* MakeNewHolder() const = 0;\n\n   private:\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory);\n  };\n\n  class DefaultValueHolderFactory : public ValueHolderFactory {\n   public:\n    DefaultValueHolderFactory() {}\n    virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(); }\n\n   private:\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);\n  };\n\n  class InstanceValueHolderFactory : public ValueHolderFactory {\n   public:\n    explicit InstanceValueHolderFactory(const T& value) : value_(value) {}\n    virtual ValueHolder* MakeNewHolder() const {\n      return new ValueHolder(value_);\n    }\n\n   private:\n    const T value_;  // The value for each thread.\n\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory);\n  };\n\n  // A key pthreads uses for looking up per-thread values.\n  const pthread_key_t key_;\n  scoped_ptr<ValueHolderFactory> default_factory_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);\n};\n\n# endif  // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_\n\n#else  // GTEST_IS_THREADSAFE\n\n// A dummy implementation of synchronization primitives (mutex, lock,\n// and thread-local variable).  Necessary for compiling Google Test where\n// mutex is not supported - using Google Test in multiple threads is not\n// supported on such platforms.\n\nclass Mutex {\n public:\n  Mutex() {}\n  void Lock() {}\n  void Unlock() {}\n  void AssertHeld() const {}\n};\n\n# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \\\n  extern ::testing::internal::Mutex mutex\n\n# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex\n\n// We cannot name this class MutexLock because the ctor declaration would\n// conflict with a macro named MutexLock, which is defined on some\n// platforms. That macro is used as a defensive measure to prevent against\n// inadvertent misuses of MutexLock like \"MutexLock(&mu)\" rather than\n// \"MutexLock l(&mu)\".  Hence the typedef trick below.\nclass GTestMutexLock {\n public:\n  explicit GTestMutexLock(Mutex*) {}  // NOLINT\n};\n\ntypedef GTestMutexLock MutexLock;\n\ntemplate <typename T>\nclass GTEST_API_ ThreadLocal {\n public:\n  ThreadLocal() : value_() {}\n  explicit ThreadLocal(const T& value) : value_(value) {}\n  T* pointer() { return &value_; }\n  const T* pointer() const { return &value_; }\n  const T& get() const { return value_; }\n  void set(const T& value) { value_ = value; }\n private:\n  T value_;\n};\n\n#endif  // GTEST_IS_THREADSAFE\n\n// Returns the number of threads running in the process, or 0 to indicate that\n// we cannot detect it.\nGTEST_API_ size_t GetThreadCount();\n\n// Passing non-POD classes through ellipsis (...) crashes the ARM\n// compiler and generates a warning in Sun Studio before 12u4. The Nokia Symbian\n// and the IBM XL C/C++ compiler try to instantiate a copy constructor\n// for objects passed through ellipsis (...), failing for uncopyable\n// objects.  We define this to ensure that only POD is passed through\n// ellipsis on these systems.\n#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || \\\n     (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x5130)\n// We lose support for NULL detection where the compiler doesn't like\n// passing non-POD classes through ellipsis (...).\n# define GTEST_ELLIPSIS_NEEDS_POD_ 1\n#else\n# define GTEST_CAN_COMPARE_NULL 1\n#endif\n\n// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between\n// const T& and const T* in a function template.  These compilers\n// _can_ decide between class template specializations for T and T*,\n// so a tr1::type_traits-like is_pointer works.\n#if defined(__SYMBIAN32__) || defined(__IBMCPP__)\n# define GTEST_NEEDS_IS_POINTER_ 1\n#endif\n\ntemplate <bool bool_value>\nstruct bool_constant {\n  typedef bool_constant<bool_value> type;\n  static const bool value = bool_value;\n};\ntemplate <bool bool_value> const bool bool_constant<bool_value>::value;\n\ntypedef bool_constant<false> false_type;\ntypedef bool_constant<true> true_type;\n\ntemplate <typename T, typename U>\nstruct is_same : public false_type {};\n\ntemplate <typename T>\nstruct is_same<T, T> : public true_type {};\n\n\ntemplate <typename T>\nstruct is_pointer : public false_type {};\n\ntemplate <typename T>\nstruct is_pointer<T*> : public true_type {};\n\ntemplate <typename Iterator>\nstruct IteratorTraits {\n  typedef typename Iterator::value_type value_type;\n};\n\n\ntemplate <typename T>\nstruct IteratorTraits<T*> {\n  typedef T value_type;\n};\n\ntemplate <typename T>\nstruct IteratorTraits<const T*> {\n  typedef T value_type;\n};\n\n#if GTEST_OS_WINDOWS\n# define GTEST_PATH_SEP_ \"\\\\\"\n# define GTEST_HAS_ALT_PATH_SEP_ 1\n// The biggest signed integer type the compiler supports.\ntypedef __int64 BiggestInt;\n#else\n# define GTEST_PATH_SEP_ \"/\"\n# define GTEST_HAS_ALT_PATH_SEP_ 0\ntypedef long long BiggestInt;  // NOLINT\n#endif  // GTEST_OS_WINDOWS\n\n// Utilities for char.\n\n// isspace(int ch) and friends accept an unsigned char or EOF.  char\n// may be signed, depending on the compiler (or compiler flags).\n// Therefore we need to cast a char to unsigned char before calling\n// isspace(), etc.\n\ninline bool IsAlpha(char ch) {\n  return isalpha(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsAlNum(char ch) {\n  return isalnum(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsDigit(char ch) {\n  return isdigit(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsLower(char ch) {\n  return islower(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsSpace(char ch) {\n  return isspace(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsUpper(char ch) {\n  return isupper(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsXDigit(char ch) {\n  return isxdigit(static_cast<unsigned char>(ch)) != 0;\n}\ninline bool IsXDigit(wchar_t ch) {\n  const unsigned char low_byte = static_cast<unsigned char>(ch);\n  return ch == low_byte && isxdigit(low_byte) != 0;\n}\n\ninline char ToLower(char ch) {\n  return static_cast<char>(tolower(static_cast<unsigned char>(ch)));\n}\ninline char ToUpper(char ch) {\n  return static_cast<char>(toupper(static_cast<unsigned char>(ch)));\n}\n\ninline std::string StripTrailingSpaces(std::string str) {\n  std::string::iterator it = str.end();\n  while (it != str.begin() && IsSpace(*--it))\n    it = str.erase(it);\n  return str;\n}\n\n// The testing::internal::posix namespace holds wrappers for common\n// POSIX functions.  These wrappers hide the differences between\n// Windows/MSVC and POSIX systems.  Since some compilers define these\n// standard functions as macros, the wrapper cannot have the same name\n// as the wrapped function.\n\nnamespace posix {\n\n// Functions with a different name on Windows.\n\n#if GTEST_OS_WINDOWS\n\ntypedef struct _stat StatStruct;\n\n# ifdef __BORLANDC__\ninline int IsATTY(int fd) { return isatty(fd); }\ninline int StrCaseCmp(const char* s1, const char* s2) {\n  return stricmp(s1, s2);\n}\ninline char* StrDup(const char* src) { return strdup(src); }\n# else  // !__BORLANDC__\n#  if GTEST_OS_WINDOWS_MOBILE\ninline int IsATTY(int /* fd */) { return 0; }\n#  else\ninline int IsATTY(int fd) { return _isatty(fd); }\n#  endif  // GTEST_OS_WINDOWS_MOBILE\ninline int StrCaseCmp(const char* s1, const char* s2) {\n  return _stricmp(s1, s2);\n}\ninline char* StrDup(const char* src) { return _strdup(src); }\n# endif  // __BORLANDC__\n\n# if GTEST_OS_WINDOWS_MOBILE\ninline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }\n// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this\n// time and thus not defined there.\n# else\ninline int FileNo(FILE* file) { return _fileno(file); }\ninline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }\ninline int RmDir(const char* dir) { return _rmdir(dir); }\ninline bool IsDir(const StatStruct& st) {\n  return (_S_IFDIR & st.st_mode) != 0;\n}\n# endif  // GTEST_OS_WINDOWS_MOBILE\n\n#else\n\ntypedef struct stat StatStruct;\n\ninline int FileNo(FILE* file) { return fileno(file); }\ninline int IsATTY(int fd) { return isatty(fd); }\ninline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }\ninline int StrCaseCmp(const char* s1, const char* s2) {\n  return strcasecmp(s1, s2);\n}\ninline char* StrDup(const char* src) { return strdup(src); }\ninline int RmDir(const char* dir) { return rmdir(dir); }\ninline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }\n\n#endif  // GTEST_OS_WINDOWS\n\n// Functions deprecated by MSVC 8.0.\n\nGTEST_DISABLE_MSC_DEPRECATED_PUSH_()\n\ninline const char* StrNCpy(char* dest, const char* src, size_t n) {\n  return strncpy(dest, src, n);\n}\n\n// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and\n// StrError() aren't needed on Windows CE at this time and thus not\n// defined there.\n\n#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT\ninline int ChDir(const char* dir) { return chdir(dir); }\n#endif\ninline FILE* FOpen(const char* path, const char* mode) {\n  return fopen(path, mode);\n}\n#if !GTEST_OS_WINDOWS_MOBILE\ninline FILE *FReopen(const char* path, const char* mode, FILE* stream) {\n  return freopen(path, mode, stream);\n}\ninline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }\n#endif\ninline int FClose(FILE* fp) { return fclose(fp); }\n#if !GTEST_OS_WINDOWS_MOBILE\ninline int Read(int fd, void* buf, unsigned int count) {\n  return static_cast<int>(read(fd, buf, count));\n}\ninline int Write(int fd, const void* buf, unsigned int count) {\n  return static_cast<int>(write(fd, buf, count));\n}\ninline int Close(int fd) { return close(fd); }\ninline const char* StrError(int errnum) { return strerror(errnum); }\n#endif\ninline const char* GetEnv(const char* name) {\n#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT\n  // We are on Windows CE, which has no environment variables.\n  static_cast<void>(name);  // To prevent 'unused argument' warning.\n  return NULL;\n#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)\n  // Environment variables which we programmatically clear will be set to the\n  // empty string rather than unset (NULL).  Handle that case.\n  const char* const env = getenv(name);\n  return (env != NULL && env[0] != '\\0') ? env : NULL;\n#else\n  return getenv(name);\n#endif\n}\n\nGTEST_DISABLE_MSC_DEPRECATED_POP_()\n\n#if GTEST_OS_WINDOWS_MOBILE\n// Windows CE has no C library. The abort() function is used in\n// several places in Google Test. This implementation provides a reasonable\n// imitation of standard behaviour.\nvoid Abort();\n#else\ninline void Abort() { abort(); }\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n}  // namespace posix\n\n// MSVC \"deprecates\" snprintf and issues warnings wherever it is used.  In\n// order to avoid these warnings, we need to use _snprintf or _snprintf_s on\n// MSVC-based platforms.  We map the GTEST_SNPRINTF_ macro to the appropriate\n// function in order to achieve that.  We use macro definition here because\n// snprintf is a variadic function.\n#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE\n// MSVC 2005 and above support variadic macros.\n# define GTEST_SNPRINTF_(buffer, size, format, ...) \\\n     _snprintf_s(buffer, size, size, format, __VA_ARGS__)\n#elif defined(_MSC_VER)\n// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't\n// complain about _snprintf.\n# define GTEST_SNPRINTF_ _snprintf\n#else\n# define GTEST_SNPRINTF_ snprintf\n#endif\n\n// The maximum number a BiggestInt can represent.  This definition\n// works no matter BiggestInt is represented in one's complement or\n// two's complement.\n//\n// We cannot rely on numeric_limits in STL, as __int64 and long long\n// are not part of standard C++ and numeric_limits doesn't need to be\n// defined for them.\nconst BiggestInt kMaxBiggestInt =\n    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));\n\n// This template class serves as a compile-time function from size to\n// type.  It maps a size in bytes to a primitive type with that\n// size. e.g.\n//\n//   TypeWithSize<4>::UInt\n//\n// is typedef-ed to be unsigned int (unsigned integer made up of 4\n// bytes).\n//\n// Such functionality should belong to STL, but I cannot find it\n// there.\n//\n// Google Test uses this class in the implementation of floating-point\n// comparison.\n//\n// For now it only handles UInt (unsigned int) as that's all Google Test\n// needs.  Other types can be easily added in the future if need\n// arises.\ntemplate <size_t size>\nclass TypeWithSize {\n public:\n  // This prevents the user from using TypeWithSize<N> with incorrect\n  // values of N.\n  typedef void UInt;\n};\n\n// The specialization for size 4.\ntemplate <>\nclass TypeWithSize<4> {\n public:\n  // unsigned int has size 4 in both gcc and MSVC.\n  //\n  // As base/basictypes.h doesn't compile on Windows, we cannot use\n  // uint32, uint64, and etc here.\n  typedef int Int;\n  typedef unsigned int UInt;\n};\n\n// The specialization for size 8.\ntemplate <>\nclass TypeWithSize<8> {\n public:\n#if GTEST_OS_WINDOWS\n  typedef __int64 Int;\n  typedef unsigned __int64 UInt;\n#else\n  typedef long long Int;  // NOLINT\n  typedef unsigned long long UInt;  // NOLINT\n#endif  // GTEST_OS_WINDOWS\n};\n\n// Integer types of known sizes.\ntypedef TypeWithSize<4>::Int Int32;\ntypedef TypeWithSize<4>::UInt UInt32;\ntypedef TypeWithSize<8>::Int Int64;\ntypedef TypeWithSize<8>::UInt UInt64;\ntypedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.\n\n// Utilities for command line flags and environment variables.\n\n// Macro for referencing flags.\n#if !defined(GTEST_FLAG)\n# define GTEST_FLAG(name) FLAGS_gtest_##name\n#endif  // !defined(GTEST_FLAG)\n\n#if !defined(GTEST_USE_OWN_FLAGFILE_FLAG_)\n# define GTEST_USE_OWN_FLAGFILE_FLAG_ 1\n#endif  // !defined(GTEST_USE_OWN_FLAGFILE_FLAG_)\n\n#if !defined(GTEST_DECLARE_bool_)\n# define GTEST_FLAG_SAVER_ ::testing::internal::GTestFlagSaver\n\n// Macros for declaring flags.\n# define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)\n# define GTEST_DECLARE_int32_(name) \\\n    GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)\n# define GTEST_DECLARE_string_(name) \\\n    GTEST_API_ extern ::std::string GTEST_FLAG(name)\n\n// Macros for defining flags.\n# define GTEST_DEFINE_bool_(name, default_val, doc) \\\n    GTEST_API_ bool GTEST_FLAG(name) = (default_val)\n# define GTEST_DEFINE_int32_(name, default_val, doc) \\\n    GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)\n# define GTEST_DEFINE_string_(name, default_val, doc) \\\n    GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)\n\n#endif  // !defined(GTEST_DECLARE_bool_)\n\n// Thread annotations\n#if !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_)\n# define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)\n# define GTEST_LOCK_EXCLUDED_(locks)\n#endif  // !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_)\n\n// Parses 'str' for a 32-bit signed integer.  If successful, writes the result\n// to *value and returns true; otherwise leaves *value unchanged and returns\n// false.\n// FIXME: Find a better way to refactor flag and environment parsing\n// out of both gtest-port.cc and gtest.cc to avoid exporting this utility\n// function.\nbool ParseInt32(const Message& src_text, const char* str, Int32* value);\n\n// Parses a bool/Int32/string from the environment variable\n// corresponding to the given Google Test flag.\nbool BoolFromGTestEnv(const char* flag, bool default_val);\nGTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);\nstd::string OutputFlagAlsoCheckEnvVar();\nconst char* StringFromGTestEnv(const char* flag, const char* default_val);\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/gtest-string.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This header file declares the String class and functions used internally by\n// Google Test.  They are subject to change without notice. They should not used\n// by code external to Google Test.\n//\n// This header file is #included by gtest-internal.h.\n// It should not be #included by other files.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_\n\n#ifdef __BORLANDC__\n// string.h is not guaranteed to provide strcpy on C++ Builder.\n# include <mem.h>\n#endif\n\n#include <string.h>\n#include <string>\n\n#include \"gtest/internal/gtest-port.h\"\n\nnamespace testing {\nnamespace internal {\n\n// String - an abstract class holding static string utilities.\nclass GTEST_API_ String {\n public:\n  // Static utility methods\n\n  // Clones a 0-terminated C string, allocating memory using new.  The\n  // caller is responsible for deleting the return value using\n  // delete[].  Returns the cloned string, or NULL if the input is\n  // NULL.\n  //\n  // This is different from strdup() in string.h, which allocates\n  // memory using malloc().\n  static const char* CloneCString(const char* c_str);\n\n#if GTEST_OS_WINDOWS_MOBILE\n  // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be\n  // able to pass strings to Win32 APIs on CE we need to convert them\n  // to 'Unicode', UTF-16.\n\n  // Creates a UTF-16 wide string from the given ANSI string, allocating\n  // memory using new. The caller is responsible for deleting the return\n  // value using delete[]. Returns the wide string, or NULL if the\n  // input is NULL.\n  //\n  // The wide string is created using the ANSI codepage (CP_ACP) to\n  // match the behaviour of the ANSI versions of Win32 calls and the\n  // C runtime.\n  static LPCWSTR AnsiToUtf16(const char* c_str);\n\n  // Creates an ANSI string from the given wide string, allocating\n  // memory using new. The caller is responsible for deleting the return\n  // value using delete[]. Returns the ANSI string, or NULL if the\n  // input is NULL.\n  //\n  // The returned string is created using the ANSI codepage (CP_ACP) to\n  // match the behaviour of the ANSI versions of Win32 calls and the\n  // C runtime.\n  static const char* Utf16ToAnsi(LPCWSTR utf16_str);\n#endif\n\n  // Compares two C strings.  Returns true iff they have the same content.\n  //\n  // Unlike strcmp(), this function can handle NULL argument(s).  A\n  // NULL C string is considered different to any non-NULL C string,\n  // including the empty string.\n  static bool CStringEquals(const char* lhs, const char* rhs);\n\n  // Converts a wide C string to a String using the UTF-8 encoding.\n  // NULL will be converted to \"(null)\".  If an error occurred during\n  // the conversion, \"(failed to convert from wide string)\" is\n  // returned.\n  static std::string ShowWideCString(const wchar_t* wide_c_str);\n\n  // Compares two wide C strings.  Returns true iff they have the same\n  // content.\n  //\n  // Unlike wcscmp(), this function can handle NULL argument(s).  A\n  // NULL C string is considered different to any non-NULL C string,\n  // including the empty string.\n  static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);\n\n  // Compares two C strings, ignoring case.  Returns true iff they\n  // have the same content.\n  //\n  // Unlike strcasecmp(), this function can handle NULL argument(s).\n  // A NULL C string is considered different to any non-NULL C string,\n  // including the empty string.\n  static bool CaseInsensitiveCStringEquals(const char* lhs,\n                                           const char* rhs);\n\n  // Compares two wide C strings, ignoring case.  Returns true iff they\n  // have the same content.\n  //\n  // Unlike wcscasecmp(), this function can handle NULL argument(s).\n  // A NULL C string is considered different to any non-NULL wide C string,\n  // including the empty string.\n  // NB: The implementations on different platforms slightly differ.\n  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE\n  // environment variable. On GNU platform this method uses wcscasecmp\n  // which compares according to LC_CTYPE category of the current locale.\n  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the\n  // current locale.\n  static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,\n                                               const wchar_t* rhs);\n\n  // Returns true iff the given string ends with the given suffix, ignoring\n  // case. Any string is considered to end with an empty suffix.\n  static bool EndsWithCaseInsensitive(\n      const std::string& str, const std::string& suffix);\n\n  // Formats an int value as \"%02d\".\n  static std::string FormatIntWidth2(int value);  // \"%02d\" for width == 2\n\n  // Formats an int value as \"%X\".\n  static std::string FormatHexInt(int value);\n\n  // Formats a byte as \"%02X\".\n  static std::string FormatByte(unsigned char value);\n\n private:\n  String();  // Not meant to be instantiated.\n};  // class String\n\n// Gets the content of the stringstream's buffer as an std::string.  Each '\\0'\n// character in the buffer is replaced with \"\\\\0\".\nGTEST_API_ std::string StringStreamToString(::std::stringstream* stream);\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/gtest-tuple.h",
    "content": "// This file was GENERATED by command:\n//     pump.py gtest-tuple.h.pump\n// DO NOT EDIT BY HAND!!!\n\n// Copyright 2009 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Implements a subset of TR1 tuple needed by Google Test and Google Mock.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_\n\n#include <utility>  // For ::std::pair.\n\n// The compiler used in Symbian has a bug that prevents us from declaring the\n// tuple template as a friend (it complains that tuple is redefined).  This\n// bypasses the bug by declaring the members that should otherwise be\n// private as public.\n// Sun Studio versions < 12 also have the above bug.\n#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)\n# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:\n#else\n# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \\\n    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \\\n   private:\n#endif\n\n// Visual Studio 2010, 2012, and 2013 define symbols in std::tr1 that conflict\n// with our own definitions. Therefore using our own tuple does not work on\n// those compilers.\n#if defined(_MSC_VER) && _MSC_VER >= 1600  /* 1600 is Visual Studio 2010 */\n# error \"gtest's tuple doesn't compile on Visual Studio 2010 or later. \\\nGTEST_USE_OWN_TR1_TUPLE must be set to 0 on those compilers.\"\n#endif\n\n// GTEST_n_TUPLE_(T) is the type of an n-tuple.\n#define GTEST_0_TUPLE_(T) tuple<>\n#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \\\n    void, void, void>\n#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \\\n    void, void, void>\n#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \\\n    void, void, void>\n#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \\\n    void, void, void>\n#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \\\n    void, void, void>\n#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \\\n    void, void, void>\n#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \\\n    void, void, void>\n#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \\\n    T##7, void, void>\n#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \\\n    T##7, T##8, void>\n#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \\\n    T##7, T##8, T##9>\n\n// GTEST_n_TYPENAMES_(T) declares a list of n typenames.\n#define GTEST_0_TYPENAMES_(T)\n#define GTEST_1_TYPENAMES_(T) typename T##0\n#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1\n#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2\n#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3\n#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4\n#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4, typename T##5\n#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4, typename T##5, typename T##6\n#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7\n#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4, typename T##5, typename T##6, \\\n    typename T##7, typename T##8\n#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4, typename T##5, typename T##6, \\\n    typename T##7, typename T##8, typename T##9\n\n// In theory, defining stuff in the ::std namespace is undefined\n// behavior.  We can do this as we are playing the role of a standard\n// library vendor.\nnamespace std {\nnamespace tr1 {\n\ntemplate <typename T0 = void, typename T1 = void, typename T2 = void,\n    typename T3 = void, typename T4 = void, typename T5 = void,\n    typename T6 = void, typename T7 = void, typename T8 = void,\n    typename T9 = void>\nclass tuple;\n\n// Anything in namespace gtest_internal is Google Test's INTERNAL\n// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.\nnamespace gtest_internal {\n\n// ByRef<T>::type is T if T is a reference; otherwise it's const T&.\ntemplate <typename T>\nstruct ByRef { typedef const T& type; };  // NOLINT\ntemplate <typename T>\nstruct ByRef<T&> { typedef T& type; };  // NOLINT\n\n// A handy wrapper for ByRef.\n#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type\n\n// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This\n// is the same as tr1::add_reference<T>::type.\ntemplate <typename T>\nstruct AddRef { typedef T& type; };  // NOLINT\ntemplate <typename T>\nstruct AddRef<T&> { typedef T& type; };  // NOLINT\n\n// A handy wrapper for AddRef.\n#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type\n\n// A helper for implementing get<k>().\ntemplate <int k> class Get;\n\n// A helper for implementing tuple_element<k, T>.  kIndexValid is true\n// iff k < the number of fields in tuple type T.\ntemplate <bool kIndexValid, int kIndex, class Tuple>\nstruct TupleElement;\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {\n  typedef T0 type;\n};\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {\n  typedef T1 type;\n};\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {\n  typedef T2 type;\n};\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {\n  typedef T3 type;\n};\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {\n  typedef T4 type;\n};\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {\n  typedef T5 type;\n};\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {\n  typedef T6 type;\n};\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {\n  typedef T7 type;\n};\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {\n  typedef T8 type;\n};\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {\n  typedef T9 type;\n};\n\n}  // namespace gtest_internal\n\ntemplate <>\nclass tuple<> {\n public:\n  tuple() {}\n  tuple(const tuple& /* t */)  {}\n  tuple& operator=(const tuple& /* t */) { return *this; }\n};\n\ntemplate <GTEST_1_TYPENAMES_(T)>\nclass GTEST_1_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}\n\n  tuple(const tuple& t) : f0_(t.f0_) {}\n\n  template <GTEST_1_TYPENAMES_(U)>\n  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_1_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_1_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    return *this;\n  }\n\n  T0 f0_;\n};\n\ntemplate <GTEST_2_TYPENAMES_(T)>\nclass GTEST_2_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),\n      f1_(f1) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}\n\n  template <GTEST_2_TYPENAMES_(U)>\n  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}\n  template <typename U0, typename U1>\n  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_2_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n  template <typename U0, typename U1>\n  tuple& operator=(const ::std::pair<U0, U1>& p) {\n    f0_ = p.first;\n    f1_ = p.second;\n    return *this;\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_2_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n};\n\ntemplate <GTEST_3_TYPENAMES_(T)>\nclass GTEST_3_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}\n\n  template <GTEST_3_TYPENAMES_(U)>\n  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_3_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_3_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n};\n\ntemplate <GTEST_4_TYPENAMES_(T)>\nclass GTEST_4_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),\n      f3_(f3) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}\n\n  template <GTEST_4_TYPENAMES_(U)>\n  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_4_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_4_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n};\n\ntemplate <GTEST_5_TYPENAMES_(T)>\nclass GTEST_5_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,\n      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_) {}\n\n  template <GTEST_5_TYPENAMES_(U)>\n  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_5_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_5_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n};\n\ntemplate <GTEST_6_TYPENAMES_(T)>\nclass GTEST_6_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,\n      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),\n      f5_(f5) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_), f5_(t.f5_) {}\n\n  template <GTEST_6_TYPENAMES_(U)>\n  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_6_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_6_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    f5_ = t.f5_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n  T5 f5_;\n};\n\ntemplate <GTEST_7_TYPENAMES_(T)>\nclass GTEST_7_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,\n      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),\n      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}\n\n  template <GTEST_7_TYPENAMES_(U)>\n  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_7_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_7_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    f5_ = t.f5_;\n    f6_ = t.f6_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n  T5 f5_;\n  T6 f6_;\n};\n\ntemplate <GTEST_8_TYPENAMES_(T)>\nclass GTEST_8_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,\n      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,\n      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),\n      f5_(f5), f6_(f6), f7_(f7) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}\n\n  template <GTEST_8_TYPENAMES_(U)>\n  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_8_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_8_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    f5_ = t.f5_;\n    f6_ = t.f6_;\n    f7_ = t.f7_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n  T5 f5_;\n  T6 f6_;\n  T7 f7_;\n};\n\ntemplate <GTEST_9_TYPENAMES_(T)>\nclass GTEST_9_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,\n      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,\n      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),\n      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}\n\n  template <GTEST_9_TYPENAMES_(U)>\n  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_9_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_9_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    f5_ = t.f5_;\n    f6_ = t.f6_;\n    f7_ = t.f7_;\n    f8_ = t.f8_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n  T5 f5_;\n  T6 f6_;\n  T7 f7_;\n  T8 f8_;\n};\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nclass tuple {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),\n      f9_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,\n      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,\n      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),\n      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}\n\n  template <GTEST_10_TYPENAMES_(U)>\n  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),\n      f9_(t.f9_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_10_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_10_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    f5_ = t.f5_;\n    f6_ = t.f6_;\n    f7_ = t.f7_;\n    f8_ = t.f8_;\n    f9_ = t.f9_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n  T5 f5_;\n  T6 f6_;\n  T7 f7_;\n  T8 f8_;\n  T9 f9_;\n};\n\n// 6.1.3.2 Tuple creation functions.\n\n// Known limitations: we don't support passing an\n// std::tr1::reference_wrapper<T> to make_tuple().  And we don't\n// implement tie().\n\ninline tuple<> make_tuple() { return tuple<>(); }\n\ntemplate <GTEST_1_TYPENAMES_(T)>\ninline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {\n  return GTEST_1_TUPLE_(T)(f0);\n}\n\ntemplate <GTEST_2_TYPENAMES_(T)>\ninline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {\n  return GTEST_2_TUPLE_(T)(f0, f1);\n}\n\ntemplate <GTEST_3_TYPENAMES_(T)>\ninline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {\n  return GTEST_3_TUPLE_(T)(f0, f1, f2);\n}\n\ntemplate <GTEST_4_TYPENAMES_(T)>\ninline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3) {\n  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);\n}\n\ntemplate <GTEST_5_TYPENAMES_(T)>\ninline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4) {\n  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);\n}\n\ntemplate <GTEST_6_TYPENAMES_(T)>\ninline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4, const T5& f5) {\n  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);\n}\n\ntemplate <GTEST_7_TYPENAMES_(T)>\ninline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {\n  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);\n}\n\ntemplate <GTEST_8_TYPENAMES_(T)>\ninline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {\n  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);\n}\n\ntemplate <GTEST_9_TYPENAMES_(T)>\ninline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,\n    const T8& f8) {\n  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);\n}\n\ntemplate <GTEST_10_TYPENAMES_(T)>\ninline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,\n    const T8& f8, const T9& f9) {\n  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);\n}\n\n// 6.1.3.3 Tuple helper classes.\n\ntemplate <typename Tuple> struct tuple_size;\n\ntemplate <GTEST_0_TYPENAMES_(T)>\nstruct tuple_size<GTEST_0_TUPLE_(T) > {\n  static const int value = 0;\n};\n\ntemplate <GTEST_1_TYPENAMES_(T)>\nstruct tuple_size<GTEST_1_TUPLE_(T) > {\n  static const int value = 1;\n};\n\ntemplate <GTEST_2_TYPENAMES_(T)>\nstruct tuple_size<GTEST_2_TUPLE_(T) > {\n  static const int value = 2;\n};\n\ntemplate <GTEST_3_TYPENAMES_(T)>\nstruct tuple_size<GTEST_3_TUPLE_(T) > {\n  static const int value = 3;\n};\n\ntemplate <GTEST_4_TYPENAMES_(T)>\nstruct tuple_size<GTEST_4_TUPLE_(T) > {\n  static const int value = 4;\n};\n\ntemplate <GTEST_5_TYPENAMES_(T)>\nstruct tuple_size<GTEST_5_TUPLE_(T) > {\n  static const int value = 5;\n};\n\ntemplate <GTEST_6_TYPENAMES_(T)>\nstruct tuple_size<GTEST_6_TUPLE_(T) > {\n  static const int value = 6;\n};\n\ntemplate <GTEST_7_TYPENAMES_(T)>\nstruct tuple_size<GTEST_7_TUPLE_(T) > {\n  static const int value = 7;\n};\n\ntemplate <GTEST_8_TYPENAMES_(T)>\nstruct tuple_size<GTEST_8_TUPLE_(T) > {\n  static const int value = 8;\n};\n\ntemplate <GTEST_9_TYPENAMES_(T)>\nstruct tuple_size<GTEST_9_TUPLE_(T) > {\n  static const int value = 9;\n};\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct tuple_size<GTEST_10_TUPLE_(T) > {\n  static const int value = 10;\n};\n\ntemplate <int k, class Tuple>\nstruct tuple_element {\n  typedef typename gtest_internal::TupleElement<\n      k < (tuple_size<Tuple>::value), k, Tuple>::type type;\n};\n\n#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type\n\n// 6.1.3.4 Element access.\n\nnamespace gtest_internal {\n\ntemplate <>\nclass Get<0> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))\n  Field(Tuple& t) { return t.f0_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))\n  ConstField(const Tuple& t) { return t.f0_; }\n};\n\ntemplate <>\nclass Get<1> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))\n  Field(Tuple& t) { return t.f1_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))\n  ConstField(const Tuple& t) { return t.f1_; }\n};\n\ntemplate <>\nclass Get<2> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))\n  Field(Tuple& t) { return t.f2_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))\n  ConstField(const Tuple& t) { return t.f2_; }\n};\n\ntemplate <>\nclass Get<3> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))\n  Field(Tuple& t) { return t.f3_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))\n  ConstField(const Tuple& t) { return t.f3_; }\n};\n\ntemplate <>\nclass Get<4> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))\n  Field(Tuple& t) { return t.f4_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))\n  ConstField(const Tuple& t) { return t.f4_; }\n};\n\ntemplate <>\nclass Get<5> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))\n  Field(Tuple& t) { return t.f5_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))\n  ConstField(const Tuple& t) { return t.f5_; }\n};\n\ntemplate <>\nclass Get<6> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))\n  Field(Tuple& t) { return t.f6_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))\n  ConstField(const Tuple& t) { return t.f6_; }\n};\n\ntemplate <>\nclass Get<7> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))\n  Field(Tuple& t) { return t.f7_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))\n  ConstField(const Tuple& t) { return t.f7_; }\n};\n\ntemplate <>\nclass Get<8> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))\n  Field(Tuple& t) { return t.f8_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))\n  ConstField(const Tuple& t) { return t.f8_; }\n};\n\ntemplate <>\nclass Get<9> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))\n  Field(Tuple& t) { return t.f9_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))\n  ConstField(const Tuple& t) { return t.f9_; }\n};\n\n}  // namespace gtest_internal\n\ntemplate <int k, GTEST_10_TYPENAMES_(T)>\nGTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))\nget(GTEST_10_TUPLE_(T)& t) {\n  return gtest_internal::Get<k>::Field(t);\n}\n\ntemplate <int k, GTEST_10_TYPENAMES_(T)>\nGTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))\nget(const GTEST_10_TUPLE_(T)& t) {\n  return gtest_internal::Get<k>::ConstField(t);\n}\n\n// 6.1.3.5 Relational operators\n\n// We only implement == and !=, as we don't have a need for the rest yet.\n\nnamespace gtest_internal {\n\n// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the\n// first k fields of t1 equals the first k fields of t2.\n// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if\n// k1 != k2.\ntemplate <int kSize1, int kSize2>\nstruct SameSizeTuplePrefixComparator;\n\ntemplate <>\nstruct SameSizeTuplePrefixComparator<0, 0> {\n  template <class Tuple1, class Tuple2>\n  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {\n    return true;\n  }\n};\n\ntemplate <int k>\nstruct SameSizeTuplePrefixComparator<k, k> {\n  template <class Tuple1, class Tuple2>\n  static bool Eq(const Tuple1& t1, const Tuple2& t2) {\n    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&\n        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);\n  }\n};\n\n}  // namespace gtest_internal\n\ntemplate <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>\ninline bool operator==(const GTEST_10_TUPLE_(T)& t,\n                       const GTEST_10_TUPLE_(U)& u) {\n  return gtest_internal::SameSizeTuplePrefixComparator<\n      tuple_size<GTEST_10_TUPLE_(T) >::value,\n      tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);\n}\n\ntemplate <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>\ninline bool operator!=(const GTEST_10_TUPLE_(T)& t,\n                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }\n\n// 6.1.4 Pairs.\n// Unimplemented.\n\n}  // namespace tr1\n}  // namespace std\n\n#undef GTEST_0_TUPLE_\n#undef GTEST_1_TUPLE_\n#undef GTEST_2_TUPLE_\n#undef GTEST_3_TUPLE_\n#undef GTEST_4_TUPLE_\n#undef GTEST_5_TUPLE_\n#undef GTEST_6_TUPLE_\n#undef GTEST_7_TUPLE_\n#undef GTEST_8_TUPLE_\n#undef GTEST_9_TUPLE_\n#undef GTEST_10_TUPLE_\n\n#undef GTEST_0_TYPENAMES_\n#undef GTEST_1_TYPENAMES_\n#undef GTEST_2_TYPENAMES_\n#undef GTEST_3_TYPENAMES_\n#undef GTEST_4_TYPENAMES_\n#undef GTEST_5_TYPENAMES_\n#undef GTEST_6_TYPENAMES_\n#undef GTEST_7_TYPENAMES_\n#undef GTEST_8_TYPENAMES_\n#undef GTEST_9_TYPENAMES_\n#undef GTEST_10_TYPENAMES_\n\n#undef GTEST_DECLARE_TUPLE_AS_FRIEND_\n#undef GTEST_BY_REF_\n#undef GTEST_ADD_REF_\n#undef GTEST_TUPLE_ELEMENT_\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/gtest-tuple.h.pump",
    "content": "$$ -*- mode: c++; -*-\n$var n = 10  $$ Maximum number of tuple fields we want to support.\n$$ This meta comment fixes auto-indentation in Emacs. }}\n// Copyright 2009 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Implements a subset of TR1 tuple needed by Google Test and Google Mock.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_\n\n#include <utility>  // For ::std::pair.\n\n// The compiler used in Symbian has a bug that prevents us from declaring the\n// tuple template as a friend (it complains that tuple is redefined).  This\n// bypasses the bug by declaring the members that should otherwise be\n// private as public.\n// Sun Studio versions < 12 also have the above bug.\n#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)\n# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:\n#else\n# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \\\n    template <GTEST_$(n)_TYPENAMES_(U)> friend class tuple; \\\n   private:\n#endif\n\n// Visual Studio 2010, 2012, and 2013 define symbols in std::tr1 that conflict\n// with our own definitions. Therefore using our own tuple does not work on\n// those compilers.\n#if defined(_MSC_VER) && _MSC_VER >= 1600  /* 1600 is Visual Studio 2010 */\n# error \"gtest's tuple doesn't compile on Visual Studio 2010 or later. \\\nGTEST_USE_OWN_TR1_TUPLE must be set to 0 on those compilers.\"\n#endif\n\n\n$range i 0..n-1\n$range j 0..n\n$range k 1..n\n// GTEST_n_TUPLE_(T) is the type of an n-tuple.\n#define GTEST_0_TUPLE_(T) tuple<>\n\n$for k [[\n$range m 0..k-1\n$range m2 k..n-1\n#define GTEST_$(k)_TUPLE_(T) tuple<$for m, [[T##$m]]$for m2 [[, void]]>\n\n]]\n\n// GTEST_n_TYPENAMES_(T) declares a list of n typenames.\n\n$for j [[\n$range m 0..j-1\n#define GTEST_$(j)_TYPENAMES_(T) $for m, [[typename T##$m]]\n\n\n]]\n\n// In theory, defining stuff in the ::std namespace is undefined\n// behavior.  We can do this as we are playing the role of a standard\n// library vendor.\nnamespace std {\nnamespace tr1 {\n\ntemplate <$for i, [[typename T$i = void]]>\nclass tuple;\n\n// Anything in namespace gtest_internal is Google Test's INTERNAL\n// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.\nnamespace gtest_internal {\n\n// ByRef<T>::type is T if T is a reference; otherwise it's const T&.\ntemplate <typename T>\nstruct ByRef { typedef const T& type; };  // NOLINT\ntemplate <typename T>\nstruct ByRef<T&> { typedef T& type; };  // NOLINT\n\n// A handy wrapper for ByRef.\n#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type\n\n// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This\n// is the same as tr1::add_reference<T>::type.\ntemplate <typename T>\nstruct AddRef { typedef T& type; };  // NOLINT\ntemplate <typename T>\nstruct AddRef<T&> { typedef T& type; };  // NOLINT\n\n// A handy wrapper for AddRef.\n#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type\n\n// A helper for implementing get<k>().\ntemplate <int k> class Get;\n\n// A helper for implementing tuple_element<k, T>.  kIndexValid is true\n// iff k < the number of fields in tuple type T.\ntemplate <bool kIndexValid, int kIndex, class Tuple>\nstruct TupleElement;\n\n\n$for i [[\ntemplate <GTEST_$(n)_TYPENAMES_(T)>\nstruct TupleElement<true, $i, GTEST_$(n)_TUPLE_(T) > {\n  typedef T$i type;\n};\n\n\n]]\n}  // namespace gtest_internal\n\ntemplate <>\nclass tuple<> {\n public:\n  tuple() {}\n  tuple(const tuple& /* t */)  {}\n  tuple& operator=(const tuple& /* t */) { return *this; }\n};\n\n\n$for k [[\n$range m 0..k-1\ntemplate <GTEST_$(k)_TYPENAMES_(T)>\nclass $if k < n [[GTEST_$(k)_TUPLE_(T)]] $else [[tuple]] {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : $for m, [[f$(m)_()]] {}\n\n  explicit tuple($for m, [[GTEST_BY_REF_(T$m) f$m]]) : [[]]\n$for m, [[f$(m)_(f$m)]] {}\n\n  tuple(const tuple& t) : $for m, [[f$(m)_(t.f$(m)_)]] {}\n\n  template <GTEST_$(k)_TYPENAMES_(U)>\n  tuple(const GTEST_$(k)_TUPLE_(U)& t) : $for m, [[f$(m)_(t.f$(m)_)]] {}\n\n$if k == 2 [[\n  template <typename U0, typename U1>\n  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}\n\n]]\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_$(k)_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_$(k)_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n$if k == 2 [[\n  template <typename U0, typename U1>\n  tuple& operator=(const ::std::pair<U0, U1>& p) {\n    f0_ = p.first;\n    f1_ = p.second;\n    return *this;\n  }\n\n]]\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_$(k)_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_$(k)_TUPLE_(U)& t) {\n\n$for m [[\n    f$(m)_ = t.f$(m)_;\n\n]]\n    return *this;\n  }\n\n\n$for m [[\n  T$m f$(m)_;\n\n]]\n};\n\n\n]]\n// 6.1.3.2 Tuple creation functions.\n\n// Known limitations: we don't support passing an\n// std::tr1::reference_wrapper<T> to make_tuple().  And we don't\n// implement tie().\n\ninline tuple<> make_tuple() { return tuple<>(); }\n\n$for k [[\n$range m 0..k-1\n\ntemplate <GTEST_$(k)_TYPENAMES_(T)>\ninline GTEST_$(k)_TUPLE_(T) make_tuple($for m, [[const T$m& f$m]]) {\n  return GTEST_$(k)_TUPLE_(T)($for m, [[f$m]]);\n}\n\n]]\n\n// 6.1.3.3 Tuple helper classes.\n\ntemplate <typename Tuple> struct tuple_size;\n\n\n$for j [[\ntemplate <GTEST_$(j)_TYPENAMES_(T)>\nstruct tuple_size<GTEST_$(j)_TUPLE_(T) > {\n  static const int value = $j;\n};\n\n\n]]\ntemplate <int k, class Tuple>\nstruct tuple_element {\n  typedef typename gtest_internal::TupleElement<\n      k < (tuple_size<Tuple>::value), k, Tuple>::type type;\n};\n\n#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type\n\n// 6.1.3.4 Element access.\n\nnamespace gtest_internal {\n\n\n$for i [[\ntemplate <>\nclass Get<$i> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple))\n  Field(Tuple& t) { return t.f$(i)_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple))\n  ConstField(const Tuple& t) { return t.f$(i)_; }\n};\n\n\n]]\n}  // namespace gtest_internal\n\ntemplate <int k, GTEST_$(n)_TYPENAMES_(T)>\nGTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T)))\nget(GTEST_$(n)_TUPLE_(T)& t) {\n  return gtest_internal::Get<k>::Field(t);\n}\n\ntemplate <int k, GTEST_$(n)_TYPENAMES_(T)>\nGTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_$(n)_TUPLE_(T)))\nget(const GTEST_$(n)_TUPLE_(T)& t) {\n  return gtest_internal::Get<k>::ConstField(t);\n}\n\n// 6.1.3.5 Relational operators\n\n// We only implement == and !=, as we don't have a need for the rest yet.\n\nnamespace gtest_internal {\n\n// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the\n// first k fields of t1 equals the first k fields of t2.\n// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if\n// k1 != k2.\ntemplate <int kSize1, int kSize2>\nstruct SameSizeTuplePrefixComparator;\n\ntemplate <>\nstruct SameSizeTuplePrefixComparator<0, 0> {\n  template <class Tuple1, class Tuple2>\n  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {\n    return true;\n  }\n};\n\ntemplate <int k>\nstruct SameSizeTuplePrefixComparator<k, k> {\n  template <class Tuple1, class Tuple2>\n  static bool Eq(const Tuple1& t1, const Tuple2& t2) {\n    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&\n        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);\n  }\n};\n\n}  // namespace gtest_internal\n\ntemplate <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)>\ninline bool operator==(const GTEST_$(n)_TUPLE_(T)& t,\n                       const GTEST_$(n)_TUPLE_(U)& u) {\n  return gtest_internal::SameSizeTuplePrefixComparator<\n      tuple_size<GTEST_$(n)_TUPLE_(T) >::value,\n      tuple_size<GTEST_$(n)_TUPLE_(U) >::value>::Eq(t, u);\n}\n\ntemplate <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)>\ninline bool operator!=(const GTEST_$(n)_TUPLE_(T)& t,\n                       const GTEST_$(n)_TUPLE_(U)& u) { return !(t == u); }\n\n// 6.1.4 Pairs.\n// Unimplemented.\n\n}  // namespace tr1\n}  // namespace std\n\n\n$for j [[\n#undef GTEST_$(j)_TUPLE_\n\n]]\n\n\n$for j [[\n#undef GTEST_$(j)_TYPENAMES_\n\n]]\n\n#undef GTEST_DECLARE_TUPLE_AS_FRIEND_\n#undef GTEST_BY_REF_\n#undef GTEST_ADD_REF_\n#undef GTEST_TUPLE_ELEMENT_\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/gtest-type-util.h",
    "content": "// This file was GENERATED by command:\n//     pump.py gtest-type-util.h.pump\n// DO NOT EDIT BY HAND!!!\n\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Type utilities needed for implementing typed and type-parameterized\n// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!\n//\n// Currently we support at most 50 types in a list, and at most 50\n// type-parameterized tests in one type-parameterized test case.\n// Please contact googletestframework@googlegroups.com if you need\n// more.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n\n#include \"gtest/internal/gtest-port.h\"\n\n// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using\n// libstdc++ (which is where cxxabi.h comes from).\n# if GTEST_HAS_CXXABI_H_\n#  include <cxxabi.h>\n# elif defined(__HP_aCC)\n#  include <acxx_demangle.h>\n# endif  // GTEST_HASH_CXXABI_H_\n\nnamespace testing {\nnamespace internal {\n\n// Canonicalizes a given name with respect to the Standard C++ Library.\n// This handles removing the inline namespace within `std` that is\n// used by various standard libraries (e.g., `std::__1`).  Names outside\n// of namespace std are returned unmodified.\ninline std::string CanonicalizeForStdLibVersioning(std::string s) {\n  static const char prefix[] = \"std::__\";\n  if (s.compare(0, strlen(prefix), prefix) == 0) {\n    std::string::size_type end = s.find(\"::\", strlen(prefix));\n    if (end != s.npos) {\n      // Erase everything between the initial `std` and the second `::`.\n      s.erase(strlen(\"std\"), end - strlen(\"std\"));\n    }\n  }\n  return s;\n}\n\n// GetTypeName<T>() returns a human-readable name of type T.\n// NB: This function is also used in Google Mock, so don't move it inside of\n// the typed-test-only section below.\ntemplate <typename T>\nstd::string GetTypeName() {\n# if GTEST_HAS_RTTI\n\n  const char* const name = typeid(T).name();\n#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)\n  int status = 0;\n  // gcc's implementation of typeid(T).name() mangles the type name,\n  // so we have to demangle it.\n#   if GTEST_HAS_CXXABI_H_\n  using abi::__cxa_demangle;\n#   endif  // GTEST_HAS_CXXABI_H_\n  char* const readable_name = __cxa_demangle(name, 0, 0, &status);\n  const std::string name_str(status == 0 ? readable_name : name);\n  free(readable_name);\n  return CanonicalizeForStdLibVersioning(name_str);\n#  else\n  return name;\n#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC\n\n# else\n\n  return \"<type>\";\n\n# endif  // GTEST_HAS_RTTI\n}\n\n#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P\n\n// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same\n// type.  This can be used as a compile-time assertion to ensure that\n// two types are equal.\n\ntemplate <typename T1, typename T2>\nstruct AssertTypeEq;\n\ntemplate <typename T>\nstruct AssertTypeEq<T, T> {\n  typedef bool type;\n};\n\n// A unique type used as the default value for the arguments of class\n// template Types.  This allows us to simulate variadic templates\n// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't\n// support directly.\nstruct None {};\n\n// The following family of struct and struct templates are used to\n// represent type lists.  In particular, TypesN<T1, T2, ..., TN>\n// represents a type list with N types (T1, T2, ..., and TN) in it.\n// Except for Types0, every struct in the family has two member types:\n// Head for the first type in the list, and Tail for the rest of the\n// list.\n\n// The empty type list.\nstruct Types0 {};\n\n// Type lists of length 1, 2, 3, and so on.\n\ntemplate <typename T1>\nstruct Types1 {\n  typedef T1 Head;\n  typedef Types0 Tail;\n};\ntemplate <typename T1, typename T2>\nstruct Types2 {\n  typedef T1 Head;\n  typedef Types1<T2> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3>\nstruct Types3 {\n  typedef T1 Head;\n  typedef Types2<T2, T3> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\nstruct Types4 {\n  typedef T1 Head;\n  typedef Types3<T2, T3, T4> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nstruct Types5 {\n  typedef T1 Head;\n  typedef Types4<T2, T3, T4, T5> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\nstruct Types6 {\n  typedef T1 Head;\n  typedef Types5<T2, T3, T4, T5, T6> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\nstruct Types7 {\n  typedef T1 Head;\n  typedef Types6<T2, T3, T4, T5, T6, T7> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\nstruct Types8 {\n  typedef T1 Head;\n  typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\nstruct Types9 {\n  typedef T1 Head;\n  typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\nstruct Types10 {\n  typedef T1 Head;\n  typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11>\nstruct Types11 {\n  typedef T1 Head;\n  typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12>\nstruct Types12 {\n  typedef T1 Head;\n  typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13>\nstruct Types13 {\n  typedef T1 Head;\n  typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14>\nstruct Types14 {\n  typedef T1 Head;\n  typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15>\nstruct Types15 {\n  typedef T1 Head;\n  typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16>\nstruct Types16 {\n  typedef T1 Head;\n  typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17>\nstruct Types17 {\n  typedef T1 Head;\n  typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18>\nstruct Types18 {\n  typedef T1 Head;\n  typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19>\nstruct Types19 {\n  typedef T1 Head;\n  typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20>\nstruct Types20 {\n  typedef T1 Head;\n  typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21>\nstruct Types21 {\n  typedef T1 Head;\n  typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22>\nstruct Types22 {\n  typedef T1 Head;\n  typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23>\nstruct Types23 {\n  typedef T1 Head;\n  typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24>\nstruct Types24 {\n  typedef T1 Head;\n  typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25>\nstruct Types25 {\n  typedef T1 Head;\n  typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26>\nstruct Types26 {\n  typedef T1 Head;\n  typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27>\nstruct Types27 {\n  typedef T1 Head;\n  typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28>\nstruct Types28 {\n  typedef T1 Head;\n  typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29>\nstruct Types29 {\n  typedef T1 Head;\n  typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30>\nstruct Types30 {\n  typedef T1 Head;\n  typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31>\nstruct Types31 {\n  typedef T1 Head;\n  typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32>\nstruct Types32 {\n  typedef T1 Head;\n  typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33>\nstruct Types33 {\n  typedef T1 Head;\n  typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34>\nstruct Types34 {\n  typedef T1 Head;\n  typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35>\nstruct Types35 {\n  typedef T1 Head;\n  typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36>\nstruct Types36 {\n  typedef T1 Head;\n  typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37>\nstruct Types37 {\n  typedef T1 Head;\n  typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38>\nstruct Types38 {\n  typedef T1 Head;\n  typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39>\nstruct Types39 {\n  typedef T1 Head;\n  typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40>\nstruct Types40 {\n  typedef T1 Head;\n  typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41>\nstruct Types41 {\n  typedef T1 Head;\n  typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42>\nstruct Types42 {\n  typedef T1 Head;\n  typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43>\nstruct Types43 {\n  typedef T1 Head;\n  typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44>\nstruct Types44 {\n  typedef T1 Head;\n  typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45>\nstruct Types45 {\n  typedef T1 Head;\n  typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46>\nstruct Types46 {\n  typedef T1 Head;\n  typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45, T46> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47>\nstruct Types47 {\n  typedef T1 Head;\n  typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45, T46, T47> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48>\nstruct Types48 {\n  typedef T1 Head;\n  typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45, T46, T47, T48> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49>\nstruct Types49 {\n  typedef T1 Head;\n  typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45, T46, T47, T48, T49> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49, typename T50>\nstruct Types50 {\n  typedef T1 Head;\n  typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45, T46, T47, T48, T49, T50> Tail;\n};\n\n\n}  // namespace internal\n\n// We don't want to require the users to write TypesN<...> directly,\n// as that would require them to count the length.  Types<...> is much\n// easier to write, but generates horrible messages when there is a\n// compiler error, as gcc insists on printing out each template\n// argument, even if it has the default value (this means Types<int>\n// will appear as Types<int, None, None, ..., None> in the compiler\n// errors).\n//\n// Our solution is to combine the best part of the two approaches: a\n// user would write Types<T1, ..., TN>, and Google Test will translate\n// that to TypesN<T1, ..., TN> internally to make error messages\n// readable.  The translation is done by the 'type' member of the\n// Types template.\ntemplate <typename T1 = internal::None, typename T2 = internal::None,\n    typename T3 = internal::None, typename T4 = internal::None,\n    typename T5 = internal::None, typename T6 = internal::None,\n    typename T7 = internal::None, typename T8 = internal::None,\n    typename T9 = internal::None, typename T10 = internal::None,\n    typename T11 = internal::None, typename T12 = internal::None,\n    typename T13 = internal::None, typename T14 = internal::None,\n    typename T15 = internal::None, typename T16 = internal::None,\n    typename T17 = internal::None, typename T18 = internal::None,\n    typename T19 = internal::None, typename T20 = internal::None,\n    typename T21 = internal::None, typename T22 = internal::None,\n    typename T23 = internal::None, typename T24 = internal::None,\n    typename T25 = internal::None, typename T26 = internal::None,\n    typename T27 = internal::None, typename T28 = internal::None,\n    typename T29 = internal::None, typename T30 = internal::None,\n    typename T31 = internal::None, typename T32 = internal::None,\n    typename T33 = internal::None, typename T34 = internal::None,\n    typename T35 = internal::None, typename T36 = internal::None,\n    typename T37 = internal::None, typename T38 = internal::None,\n    typename T39 = internal::None, typename T40 = internal::None,\n    typename T41 = internal::None, typename T42 = internal::None,\n    typename T43 = internal::None, typename T44 = internal::None,\n    typename T45 = internal::None, typename T46 = internal::None,\n    typename T47 = internal::None, typename T48 = internal::None,\n    typename T49 = internal::None, typename T50 = internal::None>\nstruct Types {\n  typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;\n};\n\ntemplate <>\nstruct Types<internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types0 type;\n};\ntemplate <typename T1>\nstruct Types<T1, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types1<T1> type;\n};\ntemplate <typename T1, typename T2>\nstruct Types<T1, T2, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types2<T1, T2> type;\n};\ntemplate <typename T1, typename T2, typename T3>\nstruct Types<T1, T2, T3, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types3<T1, T2, T3> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4>\nstruct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types4<T1, T2, T3, T4> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nstruct Types<T1, T2, T3, T4, T5, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types5<T1, T2, T3, T4, T5> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\nstruct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,\n    T46, internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,\n    T46, T47, internal::None, internal::None, internal::None> {\n  typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46, T47> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,\n    T46, T47, T48, internal::None, internal::None> {\n  typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46, T47, T48> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,\n    T46, T47, T48, T49, internal::None> {\n  typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46, T47, T48, T49> type;\n};\n\nnamespace internal {\n\n# define GTEST_TEMPLATE_ template <typename T> class\n\n// The template \"selector\" struct TemplateSel<Tmpl> is used to\n// represent Tmpl, which must be a class template with one type\n// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined\n// as the type Tmpl<T>.  This allows us to actually instantiate the\n// template \"selected\" by TemplateSel<Tmpl>.\n//\n// This trick is necessary for simulating typedef for class templates,\n// which C++ doesn't support directly.\ntemplate <GTEST_TEMPLATE_ Tmpl>\nstruct TemplateSel {\n  template <typename T>\n  struct Bind {\n    typedef Tmpl<T> type;\n  };\n};\n\n# define GTEST_BIND_(TmplSel, T) \\\n  TmplSel::template Bind<T>::type\n\n// A unique struct template used as the default value for the\n// arguments of class template Templates.  This allows us to simulate\n// variadic templates (e.g. Templates<int>, Templates<int, double>,\n// and etc), which C++ doesn't support directly.\ntemplate <typename T>\nstruct NoneT {};\n\n// The following family of struct and struct templates are used to\n// represent template lists.  In particular, TemplatesN<T1, T2, ...,\n// TN> represents a list of N templates (T1, T2, ..., and TN).  Except\n// for Templates0, every struct in the family has two member types:\n// Head for the selector of the first template in the list, and Tail\n// for the rest of the list.\n\n// The empty template list.\nstruct Templates0 {};\n\n// Template lists of length 1, 2, 3, and so on.\n\ntemplate <GTEST_TEMPLATE_ T1>\nstruct Templates1 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates0 Tail;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>\nstruct Templates2 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates1<T2> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>\nstruct Templates3 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates2<T2, T3> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4>\nstruct Templates4 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates3<T2, T3, T4> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>\nstruct Templates5 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates4<T2, T3, T4, T5> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>\nstruct Templates6 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates5<T2, T3, T4, T5, T6> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7>\nstruct Templates7 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>\nstruct Templates8 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>\nstruct Templates9 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10>\nstruct Templates10 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>\nstruct Templates11 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>\nstruct Templates12 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13>\nstruct Templates13 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>\nstruct Templates14 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>\nstruct Templates15 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16>\nstruct Templates16 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>\nstruct Templates17 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>\nstruct Templates18 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19>\nstruct Templates19 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>\nstruct Templates20 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>\nstruct Templates21 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22>\nstruct Templates22 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>\nstruct Templates23 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>\nstruct Templates24 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25>\nstruct Templates25 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>\nstruct Templates26 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>\nstruct Templates27 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28>\nstruct Templates28 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>\nstruct Templates29 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>\nstruct Templates30 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31>\nstruct Templates31 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>\nstruct Templates32 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>\nstruct Templates33 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34>\nstruct Templates34 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>\nstruct Templates35 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>\nstruct Templates36 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37>\nstruct Templates37 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>\nstruct Templates38 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>\nstruct Templates39 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40>\nstruct Templates40 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>\nstruct Templates41 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>\nstruct Templates42 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43>\nstruct Templates43 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>\nstruct Templates44 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>\nstruct Templates45 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46>\nstruct Templates46 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45, T46> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>\nstruct Templates47 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45, T46, T47> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>\nstruct Templates48 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45, T46, T47, T48> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,\n    GTEST_TEMPLATE_ T49>\nstruct Templates49 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45, T46, T47, T48, T49> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,\n    GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>\nstruct Templates50 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45, T46, T47, T48, T49, T50> Tail;\n};\n\n\n// We don't want to require the users to write TemplatesN<...> directly,\n// as that would require them to count the length.  Templates<...> is much\n// easier to write, but generates horrible messages when there is a\n// compiler error, as gcc insists on printing out each template\n// argument, even if it has the default value (this means Templates<list>\n// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler\n// errors).\n//\n// Our solution is to combine the best part of the two approaches: a\n// user would write Templates<T1, ..., TN>, and Google Test will translate\n// that to TemplatesN<T1, ..., TN> internally to make error messages\n// readable.  The translation is done by the 'type' member of the\n// Templates template.\ntemplate <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,\n    GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,\n    GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,\n    GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,\n    GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,\n    GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,\n    GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,\n    GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,\n    GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,\n    GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,\n    GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,\n    GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,\n    GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,\n    GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,\n    GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,\n    GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,\n    GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,\n    GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,\n    GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,\n    GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,\n    GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,\n    GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,\n    GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,\n    GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,\n    GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>\nstruct Templates {\n  typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45, T46, T47, T48, T49, T50> type;\n};\n\ntemplate <>\nstruct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT> {\n  typedef Templates0 type;\n};\ntemplate <GTEST_TEMPLATE_ T1>\nstruct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT> {\n  typedef Templates1<T1> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>\nstruct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT> {\n  typedef Templates2<T1, T2> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>\nstruct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates3<T1, T2, T3> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4>\nstruct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates4<T1, T2, T3, T4> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>\nstruct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates5<T1, T2, T3, T4, T5> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>\nstruct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates6<T1, T2, T3, T4, T5, T6> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT> {\n  typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT> {\n  typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT> {\n  typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT> {\n  typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT> {\n  typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT> {\n  typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT> {\n  typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT> {\n  typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    T45, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    T45, T46, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45, T46> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    T45, T46, T47, NoneT, NoneT, NoneT> {\n  typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45, T46, T47> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    T45, T46, T47, T48, NoneT, NoneT> {\n  typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45, T46, T47, T48> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,\n    GTEST_TEMPLATE_ T49>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    T45, T46, T47, T48, T49, NoneT> {\n  typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45, T46, T47, T48, T49> type;\n};\n\n// The TypeList template makes it possible to use either a single type\n// or a Types<...> list in TYPED_TEST_CASE() and\n// INSTANTIATE_TYPED_TEST_CASE_P().\n\ntemplate <typename T>\nstruct TypeList {\n  typedef Types1<T> type;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49, typename T50>\nstruct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46, T47, T48, T49, T50> > {\n  typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;\n};\n\n#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/include/gtest/internal/gtest-type-util.h.pump",
    "content": "$$ -*- mode: c++; -*-\n$var n = 50  $$ Maximum length of type lists we want to support.\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Type utilities needed for implementing typed and type-parameterized\n// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!\n//\n// Currently we support at most $n types in a list, and at most $n\n// type-parameterized tests in one type-parameterized test case.\n// Please contact googletestframework@googlegroups.com if you need\n// more.\n\n// GOOGLETEST_CM0001 DO NOT DELETE\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n\n#include \"gtest/internal/gtest-port.h\"\n\n// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using\n// libstdc++ (which is where cxxabi.h comes from).\n# if GTEST_HAS_CXXABI_H_\n#  include <cxxabi.h>\n# elif defined(__HP_aCC)\n#  include <acxx_demangle.h>\n# endif  // GTEST_HASH_CXXABI_H_\n\nnamespace testing {\nnamespace internal {\n\n// Canonicalizes a given name with respect to the Standard C++ Library.\n// This handles removing the inline namespace within `std` that is\n// used by various standard libraries (e.g., `std::__1`).  Names outside\n// of namespace std are returned unmodified.\ninline std::string CanonicalizeForStdLibVersioning(std::string s) {\n  static const char prefix[] = \"std::__\";\n  if (s.compare(0, strlen(prefix), prefix) == 0) {\n    std::string::size_type end = s.find(\"::\", strlen(prefix));\n    if (end != s.npos) {\n      // Erase everything between the initial `std` and the second `::`.\n      s.erase(strlen(\"std\"), end - strlen(\"std\"));\n    }\n  }\n  return s;\n}\n\n// GetTypeName<T>() returns a human-readable name of type T.\n// NB: This function is also used in Google Mock, so don't move it inside of\n// the typed-test-only section below.\ntemplate <typename T>\nstd::string GetTypeName() {\n# if GTEST_HAS_RTTI\n\n  const char* const name = typeid(T).name();\n#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)\n  int status = 0;\n  // gcc's implementation of typeid(T).name() mangles the type name,\n  // so we have to demangle it.\n#   if GTEST_HAS_CXXABI_H_\n  using abi::__cxa_demangle;\n#   endif  // GTEST_HAS_CXXABI_H_\n  char* const readable_name = __cxa_demangle(name, 0, 0, &status);\n  const std::string name_str(status == 0 ? readable_name : name);\n  free(readable_name);\n  return CanonicalizeForStdLibVersioning(name_str);\n#  else\n  return name;\n#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC\n\n# else\n\n  return \"<type>\";\n\n# endif  // GTEST_HAS_RTTI\n}\n\n#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P\n\n// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same\n// type.  This can be used as a compile-time assertion to ensure that\n// two types are equal.\n\ntemplate <typename T1, typename T2>\nstruct AssertTypeEq;\n\ntemplate <typename T>\nstruct AssertTypeEq<T, T> {\n  typedef bool type;\n};\n\n// A unique type used as the default value for the arguments of class\n// template Types.  This allows us to simulate variadic templates\n// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't\n// support directly.\nstruct None {};\n\n// The following family of struct and struct templates are used to\n// represent type lists.  In particular, TypesN<T1, T2, ..., TN>\n// represents a type list with N types (T1, T2, ..., and TN) in it.\n// Except for Types0, every struct in the family has two member types:\n// Head for the first type in the list, and Tail for the rest of the\n// list.\n\n// The empty type list.\nstruct Types0 {};\n\n// Type lists of length 1, 2, 3, and so on.\n\ntemplate <typename T1>\nstruct Types1 {\n  typedef T1 Head;\n  typedef Types0 Tail;\n};\n\n$range i 2..n\n\n$for i [[\n$range j 1..i\n$range k 2..i\ntemplate <$for j, [[typename T$j]]>\nstruct Types$i {\n  typedef T1 Head;\n  typedef Types$(i-1)<$for k, [[T$k]]> Tail;\n};\n\n\n]]\n\n}  // namespace internal\n\n// We don't want to require the users to write TypesN<...> directly,\n// as that would require them to count the length.  Types<...> is much\n// easier to write, but generates horrible messages when there is a\n// compiler error, as gcc insists on printing out each template\n// argument, even if it has the default value (this means Types<int>\n// will appear as Types<int, None, None, ..., None> in the compiler\n// errors).\n//\n// Our solution is to combine the best part of the two approaches: a\n// user would write Types<T1, ..., TN>, and Google Test will translate\n// that to TypesN<T1, ..., TN> internally to make error messages\n// readable.  The translation is done by the 'type' member of the\n// Types template.\n\n$range i 1..n\ntemplate <$for i, [[typename T$i = internal::None]]>\nstruct Types {\n  typedef internal::Types$n<$for i, [[T$i]]> type;\n};\n\ntemplate <>\nstruct Types<$for i, [[internal::None]]> {\n  typedef internal::Types0 type;\n};\n\n$range i 1..n-1\n$for i [[\n$range j 1..i\n$range k i+1..n\ntemplate <$for j, [[typename T$j]]>\nstruct Types<$for j, [[T$j]]$for k[[, internal::None]]> {\n  typedef internal::Types$i<$for j, [[T$j]]> type;\n};\n\n]]\n\nnamespace internal {\n\n# define GTEST_TEMPLATE_ template <typename T> class\n\n// The template \"selector\" struct TemplateSel<Tmpl> is used to\n// represent Tmpl, which must be a class template with one type\n// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined\n// as the type Tmpl<T>.  This allows us to actually instantiate the\n// template \"selected\" by TemplateSel<Tmpl>.\n//\n// This trick is necessary for simulating typedef for class templates,\n// which C++ doesn't support directly.\ntemplate <GTEST_TEMPLATE_ Tmpl>\nstruct TemplateSel {\n  template <typename T>\n  struct Bind {\n    typedef Tmpl<T> type;\n  };\n};\n\n# define GTEST_BIND_(TmplSel, T) \\\n  TmplSel::template Bind<T>::type\n\n// A unique struct template used as the default value for the\n// arguments of class template Templates.  This allows us to simulate\n// variadic templates (e.g. Templates<int>, Templates<int, double>,\n// and etc), which C++ doesn't support directly.\ntemplate <typename T>\nstruct NoneT {};\n\n// The following family of struct and struct templates are used to\n// represent template lists.  In particular, TemplatesN<T1, T2, ...,\n// TN> represents a list of N templates (T1, T2, ..., and TN).  Except\n// for Templates0, every struct in the family has two member types:\n// Head for the selector of the first template in the list, and Tail\n// for the rest of the list.\n\n// The empty template list.\nstruct Templates0 {};\n\n// Template lists of length 1, 2, 3, and so on.\n\ntemplate <GTEST_TEMPLATE_ T1>\nstruct Templates1 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates0 Tail;\n};\n\n$range i 2..n\n\n$for i [[\n$range j 1..i\n$range k 2..i\ntemplate <$for j, [[GTEST_TEMPLATE_ T$j]]>\nstruct Templates$i {\n  typedef TemplateSel<T1> Head;\n  typedef Templates$(i-1)<$for k, [[T$k]]> Tail;\n};\n\n\n]]\n\n// We don't want to require the users to write TemplatesN<...> directly,\n// as that would require them to count the length.  Templates<...> is much\n// easier to write, but generates horrible messages when there is a\n// compiler error, as gcc insists on printing out each template\n// argument, even if it has the default value (this means Templates<list>\n// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler\n// errors).\n//\n// Our solution is to combine the best part of the two approaches: a\n// user would write Templates<T1, ..., TN>, and Google Test will translate\n// that to TemplatesN<T1, ..., TN> internally to make error messages\n// readable.  The translation is done by the 'type' member of the\n// Templates template.\n\n$range i 1..n\ntemplate <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]>\nstruct Templates {\n  typedef Templates$n<$for i, [[T$i]]> type;\n};\n\ntemplate <>\nstruct Templates<$for i, [[NoneT]]> {\n  typedef Templates0 type;\n};\n\n$range i 1..n-1\n$for i [[\n$range j 1..i\n$range k i+1..n\ntemplate <$for j, [[GTEST_TEMPLATE_ T$j]]>\nstruct Templates<$for j, [[T$j]]$for k[[, NoneT]]> {\n  typedef Templates$i<$for j, [[T$j]]> type;\n};\n\n]]\n\n// The TypeList template makes it possible to use either a single type\n// or a Types<...> list in TYPED_TEST_CASE() and\n// INSTANTIATE_TYPED_TEST_CASE_P().\n\ntemplate <typename T>\nstruct TypeList {\n  typedef Types1<T> type;\n};\n\n\n$range i 1..n\ntemplate <$for i, [[typename T$i]]>\nstruct TypeList<Types<$for i, [[T$i]]> > {\n  typedef typename Types<$for i, [[T$i]]>::type type;\n};\n\n#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/m4/acx_pthread.m4",
    "content": "# This was retrieved from\n#    http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?revision=1277&root=avahi\n# See also (perhaps for new versions?)\n#    http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?root=avahi\n#\n# We've rewritten the inconsistency check code (from avahi), to work\n# more broadly.  In particular, it no longer assumes ld accepts -zdefs.\n# This caused a restructing of the code, but the functionality has only\n# changed a little.\n\ndnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])\ndnl\ndnl @summary figure out how to build C programs using POSIX threads\ndnl\ndnl This macro figures out how to build C programs using POSIX threads.\ndnl It sets the PTHREAD_LIBS output variable to the threads library and\ndnl linker flags, and the PTHREAD_CFLAGS output variable to any special\ndnl C compiler flags that are needed. (The user can also force certain\ndnl compiler flags/libs to be tested by setting these environment\ndnl variables.)\ndnl\ndnl Also sets PTHREAD_CC to any special C compiler that is needed for\ndnl multi-threaded programs (defaults to the value of CC otherwise).\ndnl (This is necessary on AIX to use the special cc_r compiler alias.)\ndnl\ndnl NOTE: You are assumed to not only compile your program with these\ndnl flags, but also link it with them as well. e.g. you should link\ndnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS\ndnl $LIBS\ndnl\ndnl If you are only building threads programs, you may wish to use\ndnl these variables in your default LIBS, CFLAGS, and CC:\ndnl\ndnl        LIBS=\"$PTHREAD_LIBS $LIBS\"\ndnl        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\ndnl        CC=\"$PTHREAD_CC\"\ndnl\ndnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute\ndnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to\ndnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).\ndnl\ndnl ACTION-IF-FOUND is a list of shell commands to run if a threads\ndnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to\ndnl run it if it is not found. If ACTION-IF-FOUND is not specified, the\ndnl default action will define HAVE_PTHREAD.\ndnl\ndnl Please let the authors know if this macro fails on any platform, or\ndnl if you have any other suggestions or comments. This macro was based\ndnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with\ndnl help from M. Frigo), as well as ac_pthread and hb_pthread macros\ndnl posted by Alejandro Forero Cuervo to the autoconf macro repository.\ndnl We are also grateful for the helpful feedback of numerous users.\ndnl\ndnl @category InstalledPackages\ndnl @author Steven G. Johnson <stevenj@alum.mit.edu>\ndnl @version 2006-05-29\ndnl @license GPLWithACException\ndnl \ndnl Checks for GCC shared/pthread inconsistency based on work by\ndnl Marcin Owsiany <marcin@owsiany.pl>\n\n\nAC_DEFUN([ACX_PTHREAD], [\nAC_REQUIRE([AC_CANONICAL_HOST])\nAC_LANG_SAVE\nAC_LANG_C\nacx_pthread_ok=no\n\n# We used to check for pthread.h first, but this fails if pthread.h\n# requires special compiler flags (e.g. on True64 or Sequent).\n# It gets checked for in the link test anyway.\n\n# First of all, check if the user has set any of the PTHREAD_LIBS,\n# etcetera environment variables, and if threads linking works using\n# them:\nif test x\"$PTHREAD_LIBS$PTHREAD_CFLAGS\" != x; then\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])\n        AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)\n        AC_MSG_RESULT($acx_pthread_ok)\n        if test x\"$acx_pthread_ok\" = xno; then\n                PTHREAD_LIBS=\"\"\n                PTHREAD_CFLAGS=\"\"\n        fi\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\nfi\n\n# We must check for the threads library under a number of different\n# names; the ordering is very important because some systems\n# (e.g. DEC) have both -lpthread and -lpthreads, where one of the\n# libraries is broken (non-POSIX).\n\n# Create a list of thread flags to try.  Items starting with a \"-\" are\n# C compiler flags, and other items are library names, except for \"none\"\n# which indicates that we try without any flags at all, and \"pthread-config\"\n# which is a program returning the flags for the Pth emulation library.\n\nacx_pthread_flags=\"pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config\"\n\n# The ordering *is* (sometimes) important.  Some notes on the\n# individual items follow:\n\n# pthreads: AIX (must check this before -lpthread)\n# none: in case threads are in libc; should be tried before -Kthread and\n#       other compiler flags to prevent continual compiler warnings\n# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)\n# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)\n# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)\n# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)\n# -pthreads: Solaris/gcc\n# -mthreads: Mingw32/gcc, Lynx/gcc\n# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it\n#      doesn't hurt to check since this sometimes defines pthreads too;\n#      also defines -D_REENTRANT)\n#      ... -mt is also the pthreads flag for HP/aCC\n# pthread: Linux, etcetera\n# --thread-safe: KAI C++\n# pthread-config: use pthread-config program (for GNU Pth library)\n\ncase \"${host_cpu}-${host_os}\" in\n        *solaris*)\n\n        # On Solaris (at least, for some versions), libc contains stubbed\n        # (non-functional) versions of the pthreads routines, so link-based\n        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/\n        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather\n        # a function called by this macro, so we could check for that, but\n        # who knows whether they'll stub that too in a future libc.)  So,\n        # we'll just look for -pthreads and -lpthread first:\n\n        acx_pthread_flags=\"-pthreads pthread -mt -pthread $acx_pthread_flags\"\n        ;;\nesac\n\nif test x\"$acx_pthread_ok\" = xno; then\nfor flag in $acx_pthread_flags; do\n\n        case $flag in\n                none)\n                AC_MSG_CHECKING([whether pthreads work without any flags])\n                ;;\n\n                -*)\n                AC_MSG_CHECKING([whether pthreads work with $flag])\n                PTHREAD_CFLAGS=\"$flag\"\n                ;;\n\n\t\tpthread-config)\n\t\tAC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)\n\t\tif test x\"$acx_pthread_config\" = xno; then continue; fi\n\t\tPTHREAD_CFLAGS=\"`pthread-config --cflags`\"\n\t\tPTHREAD_LIBS=\"`pthread-config --ldflags` `pthread-config --libs`\"\n\t\t;;\n\n                *)\n                AC_MSG_CHECKING([for the pthreads library -l$flag])\n                PTHREAD_LIBS=\"-l$flag\"\n                ;;\n        esac\n\n        save_LIBS=\"$LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n\n        # Check for various functions.  We must include pthread.h,\n        # since some functions may be macros.  (On the Sequent, we\n        # need a special flag -Kthread to make this header compile.)\n        # We check for pthread_join because it is in -lpthread on IRIX\n        # while pthread_create is in libc.  We check for pthread_attr_init\n        # due to DEC craziness with -lpthreads.  We check for\n        # pthread_cleanup_push because it is one of the few pthread\n        # functions on Solaris that doesn't have a non-functional libc stub.\n        # We try pthread_create on general principles.\n        AC_TRY_LINK([#include <pthread.h>],\n                    [pthread_t th; pthread_join(th, 0);\n                     pthread_attr_init(0); pthread_cleanup_push(0, 0);\n                     pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n                    [acx_pthread_ok=yes])\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n\n        AC_MSG_RESULT($acx_pthread_ok)\n        if test \"x$acx_pthread_ok\" = xyes; then\n                break;\n        fi\n\n        PTHREAD_LIBS=\"\"\n        PTHREAD_CFLAGS=\"\"\ndone\nfi\n\n# Various other checks:\nif test \"x$acx_pthread_ok\" = xyes; then\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n\n        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.\n\tAC_MSG_CHECKING([for joinable pthread attribute])\n\tattr_name=unknown\n\tfor attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do\n\t    AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;],\n                        [attr_name=$attr; break])\n\tdone\n        AC_MSG_RESULT($attr_name)\n        if test \"$attr_name\" != PTHREAD_CREATE_JOINABLE; then\n            AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,\n                               [Define to necessary symbol if this constant\n                                uses a non-standard name on your system.])\n        fi\n\n        AC_MSG_CHECKING([if more special flags are required for pthreads])\n        flag=no\n        case \"${host_cpu}-${host_os}\" in\n            *-aix* | *-freebsd* | *-darwin*) flag=\"-D_THREAD_SAFE\";;\n            *solaris* | *-osf* | *-hpux*) flag=\"-D_REENTRANT\";;\n        esac\n        AC_MSG_RESULT(${flag})\n        if test \"x$flag\" != xno; then\n            PTHREAD_CFLAGS=\"$flag $PTHREAD_CFLAGS\"\n        fi\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n        # More AIX lossage: must compile with xlc_r or cc_r\n\tif test x\"$GCC\" != xyes; then\n          AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})\n        else\n          PTHREAD_CC=$CC\n\tfi\n\n\t# The next part tries to detect GCC inconsistency with -shared on some\n\t# architectures and systems. The problem is that in certain\n\t# configurations, when -shared is specified, GCC \"forgets\" to\n\t# internally use various flags which are still necessary.\n\t\n\t#\n\t# Prepare the flags\n\t#\n\tsave_CFLAGS=\"$CFLAGS\"\n\tsave_LIBS=\"$LIBS\"\n\tsave_CC=\"$CC\"\n\t\n\t# Try with the flags determined by the earlier checks.\n\t#\n\t# -Wl,-z,defs forces link-time symbol resolution, so that the\n\t# linking checks with -shared actually have any value\n\t#\n\t# FIXME: -fPIC is required for -shared on many architectures,\n\t# so we specify it here, but the right way would probably be to\n\t# properly detect whether it is actually required.\n\tCFLAGS=\"-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS\"\n\tLIBS=\"$PTHREAD_LIBS $LIBS\"\n\tCC=\"$PTHREAD_CC\"\n\t\n\t# In order not to create several levels of indentation, we test\n\t# the value of \"$done\" until we find the cure or run out of ideas.\n\tdone=\"no\"\n\t\n\t# First, make sure the CFLAGS we added are actually accepted by our\n\t# compiler.  If not (and OS X's ld, for instance, does not accept -z),\n\t# then we can't do this test.\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies])\n\t   AC_TRY_LINK(,, , [done=yes])\n\t\n\t   if test \"x$done\" = xyes ; then\n\t      AC_MSG_RESULT([no])\n\t   else\n\t      AC_MSG_RESULT([yes])\n\t   fi\n\tfi\n\t\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether -pthread is sufficient with -shared])\n\t   AC_TRY_LINK([#include <pthread.h>],\n\t      [pthread_t th; pthread_join(th, 0);\n\t      pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n\t      [done=yes])\n\t   \n\t   if test \"x$done\" = xyes; then\n\t      AC_MSG_RESULT([yes])\n\t   else\n\t      AC_MSG_RESULT([no])\n\t   fi\n\tfi\n\t\n\t#\n\t# Linux gcc on some architectures such as mips/mipsel forgets\n\t# about -lpthread\n\t#\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether -lpthread fixes that])\n\t   LIBS=\"-lpthread $PTHREAD_LIBS $save_LIBS\"\n\t   AC_TRY_LINK([#include <pthread.h>],\n\t      [pthread_t th; pthread_join(th, 0);\n\t      pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n\t      [done=yes])\n\t\n\t   if test \"x$done\" = xyes; then\n\t      AC_MSG_RESULT([yes])\n\t      PTHREAD_LIBS=\"-lpthread $PTHREAD_LIBS\"\n\t   else\n\t      AC_MSG_RESULT([no])\n\t   fi\n\tfi\n\t#\n\t# FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc\n\t#\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether -lc_r fixes that])\n\t   LIBS=\"-lc_r $PTHREAD_LIBS $save_LIBS\"\n\t   AC_TRY_LINK([#include <pthread.h>],\n\t       [pthread_t th; pthread_join(th, 0);\n\t        pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t        pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n\t       [done=yes])\n\t\n\t   if test \"x$done\" = xyes; then\n\t      AC_MSG_RESULT([yes])\n\t      PTHREAD_LIBS=\"-lc_r $PTHREAD_LIBS\"\n\t   else\n\t      AC_MSG_RESULT([no])\n\t   fi\n\tfi\n\tif test x\"$done\" = xno; then\n\t   # OK, we have run out of ideas\n\t   AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries])\n\t\n\t   # so it's not safe to assume that we may use pthreads\n\t   acx_pthread_ok=no\n\tfi\n\t\n\tCFLAGS=\"$save_CFLAGS\"\n\tLIBS=\"$save_LIBS\"\n\tCC=\"$save_CC\"\nelse\n        PTHREAD_CC=\"$CC\"\nfi\n\nAC_SUBST(PTHREAD_LIBS)\nAC_SUBST(PTHREAD_CFLAGS)\nAC_SUBST(PTHREAD_CC)\n\n# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:\nif test x\"$acx_pthread_ok\" = xyes; then\n        ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])\n        :\nelse\n        acx_pthread_ok=no\n        $2\nfi\nAC_LANG_RESTORE\n])dnl ACX_PTHREAD\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/m4/gtest.m4",
    "content": "dnl GTEST_LIB_CHECK([minimum version [,\ndnl                  action if found [,action if not found]]])\ndnl\ndnl Check for the presence of the Google Test library, optionally at a minimum\ndnl version, and indicate a viable version with the HAVE_GTEST flag. It defines\ndnl standard variables for substitution including GTEST_CPPFLAGS,\ndnl GTEST_CXXFLAGS, GTEST_LDFLAGS, and GTEST_LIBS. It also defines\ndnl GTEST_VERSION as the version of Google Test found. Finally, it provides\ndnl optional custom action slots in the event GTEST is found or not.\nAC_DEFUN([GTEST_LIB_CHECK],\n[\ndnl Provide a flag to enable or disable Google Test usage.\nAC_ARG_ENABLE([gtest],\n  [AS_HELP_STRING([--enable-gtest],\n                  [Enable tests using the Google C++ Testing Framework.\n                  (Default is enabled.)])],\n  [],\n  [enable_gtest=])\nAC_ARG_VAR([GTEST_CONFIG],\n           [The exact path of Google Test's 'gtest-config' script.])\nAC_ARG_VAR([GTEST_CPPFLAGS],\n           [C-like preprocessor flags for Google Test.])\nAC_ARG_VAR([GTEST_CXXFLAGS],\n           [C++ compile flags for Google Test.])\nAC_ARG_VAR([GTEST_LDFLAGS],\n           [Linker path and option flags for Google Test.])\nAC_ARG_VAR([GTEST_LIBS],\n           [Library linking flags for Google Test.])\nAC_ARG_VAR([GTEST_VERSION],\n           [The version of Google Test available.])\nHAVE_GTEST=\"no\"\nAS_IF([test \"x${enable_gtest}\" != \"xno\"],\n  [AC_MSG_CHECKING([for 'gtest-config'])\n   AS_IF([test \"x${enable_gtest}\" != \"xyes\"],\n     [AS_IF([test -x \"${enable_gtest}/scripts/gtest-config\"],\n        [GTEST_CONFIG=\"${enable_gtest}/scripts/gtest-config\"],\n        [GTEST_CONFIG=\"${enable_gtest}/bin/gtest-config\"])\n      AS_IF([test -x \"${GTEST_CONFIG}\"], [],\n        [AC_MSG_RESULT([no])\n         AC_MSG_ERROR([dnl\nUnable to locate either a built or installed Google Test.\nThe specific location '${enable_gtest}' was provided for a built or installed\nGoogle Test, but no 'gtest-config' script could be found at this location.])\n         ])],\n     [AC_PATH_PROG([GTEST_CONFIG], [gtest-config])])\n   AS_IF([test -x \"${GTEST_CONFIG}\"],\n     [AC_MSG_RESULT([${GTEST_CONFIG}])\n      m4_ifval([$1],\n        [_gtest_min_version=\"--min-version=$1\"\n         AC_MSG_CHECKING([for Google Test at least version >= $1])],\n        [_gtest_min_version=\"--min-version=0\"\n         AC_MSG_CHECKING([for Google Test])])\n      AS_IF([${GTEST_CONFIG} ${_gtest_min_version}],\n        [AC_MSG_RESULT([yes])\n         HAVE_GTEST='yes'],\n        [AC_MSG_RESULT([no])])],\n     [AC_MSG_RESULT([no])])\n   AS_IF([test \"x${HAVE_GTEST}\" = \"xyes\"],\n     [GTEST_CPPFLAGS=`${GTEST_CONFIG} --cppflags`\n      GTEST_CXXFLAGS=`${GTEST_CONFIG} --cxxflags`\n      GTEST_LDFLAGS=`${GTEST_CONFIG} --ldflags`\n      GTEST_LIBS=`${GTEST_CONFIG} --libs`\n      GTEST_VERSION=`${GTEST_CONFIG} --version`\n      AC_DEFINE([HAVE_GTEST],[1],[Defined when Google Test is available.])],\n     [AS_IF([test \"x${enable_gtest}\" = \"xyes\"],\n        [AC_MSG_ERROR([dnl\nGoogle Test was enabled, but no viable version could be found.])\n         ])])])\nAC_SUBST([HAVE_GTEST])\nAM_CONDITIONAL([HAVE_GTEST],[test \"x$HAVE_GTEST\" = \"xyes\"])\nAS_IF([test \"x$HAVE_GTEST\" = \"xyes\"],\n  [m4_ifval([$2], [$2])],\n  [m4_ifval([$3], [$3])])\n])\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest-md.sln",
    "content": "Microsoft Visual Studio Solution File, Format Version 11.00\n# Visual C++ Express 2010\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest-md\", \"gtest-md.vcxproj\", \"{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest_main-md\", \"gtest_main-md.vcxproj\", \"{3AF54C8A-10BF-4332-9147-F68ED9862033}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest_prod_test-md\", \"gtest_prod_test-md.vcxproj\", \"{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest_unittest-md\", \"gtest_unittest-md.vcxproj\", \"{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Win32 = Debug|Win32\n\t\tDebug|x64 = Debug|x64\n\t\tRelease|Win32 = Release|Win32\n\t\tRelease|x64 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug|x64.Build.0 = Debug|x64\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release|Win32.Build.0 = Release|Win32\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release|x64.ActiveCfg = Release|x64\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release|x64.Build.0 = Release|x64\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862033}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862033}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862033}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862033}.Debug|x64.Build.0 = Debug|x64\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862033}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862033}.Release|Win32.Build.0 = Release|Win32\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862033}.Release|x64.ActiveCfg = Release|x64\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862033}.Release|x64.Build.0 = Release|x64\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Debug|x64.Build.0 = Debug|x64\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Release|Win32.Build.0 = Release|Win32\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Release|x64.ActiveCfg = Release|x64\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Release|x64.Build.0 = Release|x64\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Debug|x64.Build.0 = Debug|x64\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Release|Win32.Build.0 = Release|Win32\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Release|x64.ActiveCfg = Release|x64\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Release|x64.Build.0 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest-md.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n    <TargetName>gtestd</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n    <TargetName>gtest</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <TargetName>gtestd</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <TargetName>gtest</TargetName>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Lib />\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Lib />\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Lib />\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Lib />\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\src\\gtest-all.cc\">\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest-md.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\src\\gtest-all.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest.sln",
    "content": "Microsoft Visual Studio Solution File, Format Version 11.00\n# Visual C++ Express 2010\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest\", \"gtest.vcxproj\", \"{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest_main\", \"gtest_main.vcxproj\", \"{3AF54C8A-10BF-4332-9147-F68ED9862032}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest_unittest\", \"gtest_unittest.vcxproj\", \"{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest_prod_test\", \"gtest_prod_test.vcxproj\", \"{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Win32 = Debug|Win32\n\t\tDebug|x64 = Debug|x64\n\t\tRelease|Win32 = Release|Win32\n\t\tRelease|x64 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|x64.Build.0 = Debug|x64\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|Win32.Build.0 = Release|Win32\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|x64.ActiveCfg = Release|x64\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|x64.Build.0 = Release|x64\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug|x64.Build.0 = Debug|x64\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release|Win32.Build.0 = Release|Win32\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release|x64.ActiveCfg = Release|x64\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release|x64.Build.0 = Release|x64\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug|x64.Build.0 = Debug|x64\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release|Win32.Build.0 = Release|Win32\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release|x64.ActiveCfg = Release|x64\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release|x64.Build.0 = Release|x64\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug|x64.Build.0 = Debug|x64\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release|Win32.Build.0 = Release|Win32\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release|x64.ActiveCfg = Release|x64\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release|x64.Build.0 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(OutDir)temp\\$(ProjectName)\\</IntDir>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(OutDir)temp\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)temp\\$(ProjectName)\\</IntDir>\n    <TargetName>gtestd</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)temp\\$(ProjectName)\\</IntDir>\n    <TargetName>gtest</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <TargetName>gtestd</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <TargetName>gtest</TargetName>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Lib />\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Lib />\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Lib />\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Lib />\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\src\\gtest-all.cc\">\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\src\\gtest-all.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest_main-md.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{3AF54C8A-10BF-4332-9147-F68ED9862033}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n    <TargetName>gtest_maind</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n    <TargetName>gtest_main</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <TargetName>gtest_maind</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <TargetName>gtest_main</TargetName>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Lib />\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Lib />\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Lib />\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Lib />\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\src\\gtest_main.cc\">\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"gtest-md.vcxproj\">\n      <Project>{c8f6c172-56f2-4e76-b5fa-c3b423b31be8}</Project>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest_main-md.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\src\\gtest_main.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest_main.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{3AF54C8A-10BF-4332-9147-F68ED9862032}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(OutDir)temp\\$(ProjectName)\\</IntDir>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(OutDir)temp\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)temp\\$(ProjectName)\\</IntDir>\n    <TargetName>gtest_maind</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)temp\\$(ProjectName)\\</IntDir>\n    <TargetName>gtest_main</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <TargetName>gtest_maind</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <TargetName>gtest_main</TargetName>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Lib>\n      <OutputFile>$(OutDir)$(ProjectName)d.lib</OutputFile>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Lib>\n      <OutputFile>$(OutDir)$(ProjectName)d.lib</OutputFile>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Lib>\n      <OutputFile>$(OutDir)$(ProjectName).lib</OutputFile>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Lib>\n      <OutputFile>$(OutDir)$(ProjectName).lib</OutputFile>\n    </Lib>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\src\\gtest_main.cc\">\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"gtest.vcxproj\">\n      <Project>{c8f6c172-56f2-4e76-b5fa-c3b423b31be7}</Project>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest_main.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\src\\gtest_main.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest_prod_test-md.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n    <TargetName>gtest_prod_test</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n    <TargetName>gtest_prod_test</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <TargetName>gtest_prod_test</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <TargetName>gtest_prod_test</TargetName>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)gtest_prod_test.pdb</ProgramDatabaseFile>\n      <SubSystem>Console</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)gtest_prod_test.pdb</ProgramDatabaseFile>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\test\\gtest_prod_test.cc\">\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </PrecompiledHeader>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n      </PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\test\\production.cc\">\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </PrecompiledHeader>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n      </PrecompiledHeader>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\test\\production.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"gtest_main-md.vcxproj\">\n      <Project>{3af54c8a-10bf-4332-9147-f68ed9862033}</Project>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest_prod_test-md.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\test\\gtest_prod_test.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\test\\production.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\test\\production.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest_prod_test.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(OutDir)temp\\$(ProjectName)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(OutDir)temp\\$(ProjectName)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)temp\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)temp\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)gtest_prod_test.pdb</ProgramDatabaseFile>\n      <SubSystem>Console</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)gtest_prod_test.pdb</ProgramDatabaseFile>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\test\\gtest_prod_test.cc\">\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </PrecompiledHeader>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n      </PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\test\\production.cc\">\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </PrecompiledHeader>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n      </PrecompiledHeader>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\test\\production.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"gtest_main.vcxproj\">\n      <Project>{3af54c8a-10bf-4332-9147-f68ed9862032}</Project>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest_prod_test.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\test\\gtest_prod_test.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\test\\production.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\test\\production.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest_unittest-md.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(OutDir)$(ProjectName)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n    <TargetName>gtest_unittest</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)$(ProjectName)\\</IntDir>\n    <TargetName>gtest_unittest</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <TargetName>gtest_unittest</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <TargetName>gtest_unittest</TargetName>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)gtest_unittest.pdb</ProgramDatabaseFile>\n      <SubSystem>Console</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)gtest_unittest.pdb</ProgramDatabaseFile>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\test\\gtest_unittest.cc\">\n      <Optimization Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">MinSpace</Optimization>\n      <Optimization Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">MinSpace</Optimization>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <BasicRuntimeChecks Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Default</BasicRuntimeChecks>\n      <BasicRuntimeChecks Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Default</BasicRuntimeChecks>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </PrecompiledHeader>\n      <DebugInformationFormat Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">ProgramDatabase</DebugInformationFormat>\n      <DebugInformationFormat Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n      </PrecompiledHeader>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"gtest_main-md.vcxproj\">\n      <Project>{3af54c8a-10bf-4332-9147-f68ed9862033}</Project>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest_unittest-md.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\test\\gtest_unittest.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest_unittest.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v100</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(OutDir)temp\\$(ProjectName)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(OutDir)temp\\$(ProjectName)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)temp\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(SolutionDir)$(SolutionName)\\$(Platform)-$(Configuration)\\</OutDir>\n    <IntDir>$(OutDir)temp\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)gtest_unittest.pdb</ProgramDatabaseFile>\n      <SubSystem>Console</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)gtest_unittest.pdb</ProgramDatabaseFile>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;_VARIADIC_MAX=10;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories>..\\..\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\test\\gtest_unittest.cc\">\n      <Optimization Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">MinSpace</Optimization>\n      <Optimization Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">MinSpace</Optimization>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <BasicRuntimeChecks Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Default</BasicRuntimeChecks>\n      <BasicRuntimeChecks Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Default</BasicRuntimeChecks>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </PrecompiledHeader>\n      <DebugInformationFormat Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">ProgramDatabase</DebugInformationFormat>\n      <DebugInformationFormat Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">ProgramDatabase</DebugInformationFormat>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalIncludeDirectories Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">..;..\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n      </PrecompiledHeader>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"gtest_main.vcxproj\">\n      <Project>{3af54c8a-10bf-4332-9147-f68ed9862032}</Project>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/msvc/2010/gtest_unittest.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\test\\gtest_unittest.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/prime_tables.h",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n\n// This provides interface PrimeTable that determines whether a number is a\n// prime and determines a next prime number. This interface is used\n// in Google Test samples demonstrating use of parameterized tests.\n\n#ifndef GTEST_SAMPLES_PRIME_TABLES_H_\n#define GTEST_SAMPLES_PRIME_TABLES_H_\n\n#include <algorithm>\n\n// The prime table interface.\nclass PrimeTable {\n public:\n  virtual ~PrimeTable() {}\n\n  // Returns true iff n is a prime number.\n  virtual bool IsPrime(int n) const = 0;\n\n  // Returns the smallest prime number greater than p; or returns -1\n  // if the next prime is beyond the capacity of the table.\n  virtual int GetNextPrime(int p) const = 0;\n};\n\n// Implementation #1 calculates the primes on-the-fly.\nclass OnTheFlyPrimeTable : public PrimeTable {\n public:\n  virtual bool IsPrime(int n) const {\n    if (n <= 1) return false;\n\n    for (int i = 2; i*i <= n; i++) {\n      // n is divisible by an integer other than 1 and itself.\n      if ((n % i) == 0) return false;\n    }\n\n    return true;\n  }\n\n  virtual int GetNextPrime(int p) const {\n    for (int n = p + 1; n > 0; n++) {\n      if (IsPrime(n)) return n;\n    }\n\n    return -1;\n  }\n};\n\n// Implementation #2 pre-calculates the primes and stores the result\n// in an array.\nclass PreCalculatedPrimeTable : public PrimeTable {\n public:\n  // 'max' specifies the maximum number the prime table holds.\n  explicit PreCalculatedPrimeTable(int max)\n      : is_prime_size_(max + 1), is_prime_(new bool[max + 1]) {\n    CalculatePrimesUpTo(max);\n  }\n  virtual ~PreCalculatedPrimeTable() { delete[] is_prime_; }\n\n  virtual bool IsPrime(int n) const {\n    return 0 <= n && n < is_prime_size_ && is_prime_[n];\n  }\n\n  virtual int GetNextPrime(int p) const {\n    for (int n = p + 1; n < is_prime_size_; n++) {\n      if (is_prime_[n]) return n;\n    }\n\n    return -1;\n  }\n\n private:\n  void CalculatePrimesUpTo(int max) {\n    ::std::fill(is_prime_, is_prime_ + is_prime_size_, true);\n    is_prime_[0] = is_prime_[1] = false;\n\n    // Checks every candidate for prime number (we know that 2 is the only even\n    // prime).\n    for (int i = 2; i*i <= max; i += i%2+1) {\n      if (!is_prime_[i]) continue;\n\n      // Marks all multiples of i (except i itself) as non-prime.\n      // We are starting here from i-th multiplier, because all smaller\n      // complex numbers were already marked.\n      for (int j = i*i; j <= max; j += i) {\n        is_prime_[j] = false;\n      }\n    }\n  }\n\n  const int is_prime_size_;\n  bool* const is_prime_;\n\n  // Disables compiler warning \"assignment operator could not be generated.\"\n  void operator=(const PreCalculatedPrimeTable& rhs);\n};\n\n#endif  // GTEST_SAMPLES_PRIME_TABLES_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample1.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n\n#include \"sample1.h\"\n\n// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.\nint Factorial(int n) {\n  int result = 1;\n  for (int i = 1; i <= n; i++) {\n    result *= i;\n  }\n\n  return result;\n}\n\n// Returns true iff n is a prime number.\nbool IsPrime(int n) {\n  // Trivial case 1: small numbers\n  if (n <= 1) return false;\n\n  // Trivial case 2: even numbers\n  if (n % 2 == 0) return n == 2;\n\n  // Now, we have that n is odd and n >= 3.\n\n  // Try to divide n by every odd number i, starting from 3\n  for (int i = 3; ; i += 2) {\n    // We only have to try i up to the square root of n\n    if (i > n/i) break;\n\n    // Now, we have i <= n/i < n.\n    // If n is divisible by i, n is not prime.\n    if (n % i == 0) return false;\n  }\n\n  // n has no integer factor in the range (1, n), and thus is prime.\n  return true;\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample1.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n\n#ifndef GTEST_SAMPLES_SAMPLE1_H_\n#define GTEST_SAMPLES_SAMPLE1_H_\n\n// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.\nint Factorial(int n);\n\n// Returns true iff n is a prime number.\nbool IsPrime(int n);\n\n#endif  // GTEST_SAMPLES_SAMPLE1_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample10_unittest.cc",
    "content": "// Copyright 2009 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// This sample shows how to use Google Test listener API to implement\n// a primitive leak checker.\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"gtest/gtest.h\"\nusing ::testing::EmptyTestEventListener;\nusing ::testing::InitGoogleTest;\nusing ::testing::Test;\nusing ::testing::TestEventListeners;\nusing ::testing::TestInfo;\nusing ::testing::TestPartResult;\nusing ::testing::UnitTest;\n\nnamespace {\n// We will track memory used by this class.\nclass Water {\n public:\n  // Normal Water declarations go here.\n\n  // operator new and operator delete help us control water allocation.\n  void* operator new(size_t allocation_size) {\n    allocated_++;\n    return malloc(allocation_size);\n  }\n\n  void operator delete(void* block, size_t /* allocation_size */) {\n    allocated_--;\n    free(block);\n  }\n\n  static int allocated() { return allocated_; }\n\n private:\n  static int allocated_;\n};\n\nint Water::allocated_ = 0;\n\n// This event listener monitors how many Water objects are created and\n// destroyed by each test, and reports a failure if a test leaks some Water\n// objects. It does this by comparing the number of live Water objects at\n// the beginning of a test and at the end of a test.\nclass LeakChecker : public EmptyTestEventListener {\n private:\n  // Called before a test starts.\n  virtual void OnTestStart(const TestInfo& /* test_info */) {\n    initially_allocated_ = Water::allocated();\n  }\n\n  // Called after a test ends.\n  virtual void OnTestEnd(const TestInfo& /* test_info */) {\n    int difference = Water::allocated() - initially_allocated_;\n\n    // You can generate a failure in any event handler except\n    // OnTestPartResult. Just use an appropriate Google Test assertion to do\n    // it.\n    EXPECT_LE(difference, 0) << \"Leaked \" << difference << \" unit(s) of Water!\";\n  }\n\n  int initially_allocated_;\n};\n\nTEST(ListenersTest, DoesNotLeak) {\n  Water* water = new Water;\n  delete water;\n}\n\n// This should fail when the --check_for_leaks command line flag is\n// specified.\nTEST(ListenersTest, LeaksWater) {\n  Water* water = new Water;\n  EXPECT_TRUE(water != NULL);\n}\n}  // namespace\n\nint main(int argc, char **argv) {\n  InitGoogleTest(&argc, argv);\n\n  bool check_for_leaks = false;\n  if (argc > 1 && strcmp(argv[1], \"--check_for_leaks\") == 0 )\n    check_for_leaks = true;\n  else\n    printf(\"%s\\n\", \"Run this program with --check_for_leaks to enable \"\n           \"custom leak checking in the tests.\");\n\n  // If we are given the --check_for_leaks command line flag, installs the\n  // leak checker.\n  if (check_for_leaks) {\n    TestEventListeners& listeners = UnitTest::GetInstance()->listeners();\n\n    // Adds the leak checker to the end of the test event listener list,\n    // after the default text output printer and the default XML report\n    // generator.\n    //\n    // The order is important - it ensures that failures generated in the\n    // leak checker's OnTestEnd() method are processed by the text and XML\n    // printers *before* their OnTestEnd() methods are called, such that\n    // they are attributed to the right test. Remember that a listener\n    // receives an OnXyzStart event *after* listeners preceding it in the\n    // list received that event, and receives an OnXyzEnd event *before*\n    // listeners preceding it.\n    //\n    // We don't need to worry about deleting the new listener later, as\n    // Google Test will do it.\n    listeners.Append(new LeakChecker);\n  }\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample1_unittest.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n\n// This sample shows how to write a simple unit test for a function,\n// using Google C++ testing framework.\n//\n// Writing a unit test using Google C++ testing framework is easy as 1-2-3:\n\n\n// Step 1. Include necessary header files such that the stuff your\n// test logic needs is declared.\n//\n// Don't forget gtest.h, which declares the testing framework.\n\n#include <limits.h>\n#include \"sample1.h\"\n#include \"gtest/gtest.h\"\nnamespace {\n\n// Step 2. Use the TEST macro to define your tests.\n//\n// TEST has two parameters: the test case name and the test name.\n// After using the macro, you should define your test logic between a\n// pair of braces.  You can use a bunch of macros to indicate the\n// success or failure of a test.  EXPECT_TRUE and EXPECT_EQ are\n// examples of such macros.  For a complete list, see gtest.h.\n//\n// <TechnicalDetails>\n//\n// In Google Test, tests are grouped into test cases.  This is how we\n// keep test code organized.  You should put logically related tests\n// into the same test case.\n//\n// The test case name and the test name should both be valid C++\n// identifiers.  And you should not use underscore (_) in the names.\n//\n// Google Test guarantees that each test you define is run exactly\n// once, but it makes no guarantee on the order the tests are\n// executed.  Therefore, you should write your tests in such a way\n// that their results don't depend on their order.\n//\n// </TechnicalDetails>\n\n\n// Tests Factorial().\n\n// Tests factorial of negative numbers.\nTEST(FactorialTest, Negative) {\n  // This test is named \"Negative\", and belongs to the \"FactorialTest\"\n  // test case.\n  EXPECT_EQ(1, Factorial(-5));\n  EXPECT_EQ(1, Factorial(-1));\n  EXPECT_GT(Factorial(-10), 0);\n\n  // <TechnicalDetails>\n  //\n  // EXPECT_EQ(expected, actual) is the same as\n  //\n  //   EXPECT_TRUE((expected) == (actual))\n  //\n  // except that it will print both the expected value and the actual\n  // value when the assertion fails.  This is very helpful for\n  // debugging.  Therefore in this case EXPECT_EQ is preferred.\n  //\n  // On the other hand, EXPECT_TRUE accepts any Boolean expression,\n  // and is thus more general.\n  //\n  // </TechnicalDetails>\n}\n\n// Tests factorial of 0.\nTEST(FactorialTest, Zero) {\n  EXPECT_EQ(1, Factorial(0));\n}\n\n// Tests factorial of positive numbers.\nTEST(FactorialTest, Positive) {\n  EXPECT_EQ(1, Factorial(1));\n  EXPECT_EQ(2, Factorial(2));\n  EXPECT_EQ(6, Factorial(3));\n  EXPECT_EQ(40320, Factorial(8));\n}\n\n\n// Tests IsPrime()\n\n// Tests negative input.\nTEST(IsPrimeTest, Negative) {\n  // This test belongs to the IsPrimeTest test case.\n\n  EXPECT_FALSE(IsPrime(-1));\n  EXPECT_FALSE(IsPrime(-2));\n  EXPECT_FALSE(IsPrime(INT_MIN));\n}\n\n// Tests some trivial cases.\nTEST(IsPrimeTest, Trivial) {\n  EXPECT_FALSE(IsPrime(0));\n  EXPECT_FALSE(IsPrime(1));\n  EXPECT_TRUE(IsPrime(2));\n  EXPECT_TRUE(IsPrime(3));\n}\n\n// Tests positive input.\nTEST(IsPrimeTest, Positive) {\n  EXPECT_FALSE(IsPrime(4));\n  EXPECT_TRUE(IsPrime(5));\n  EXPECT_FALSE(IsPrime(6));\n  EXPECT_TRUE(IsPrime(23));\n}\n}  // namespace\n\n// Step 3. Call RUN_ALL_TESTS() in main().\n//\n// We do this by linking in src/gtest_main.cc file, which consists of\n// a main() function which calls RUN_ALL_TESTS() for us.\n//\n// This runs all the tests you've defined, prints the result, and\n// returns 0 if successful, or 1 otherwise.\n//\n// Did you notice that we didn't register the tests?  The\n// RUN_ALL_TESTS() macro magically knows about all the tests we\n// defined.  Isn't this convenient?\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample2.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n\n#include \"sample2.h\"\n\n#include <string.h>\n\n// Clones a 0-terminated C string, allocating memory using new.\nconst char* MyString::CloneCString(const char* a_c_string) {\n  if (a_c_string == NULL) return NULL;\n\n  const size_t len = strlen(a_c_string);\n  char* const clone = new char[ len + 1 ];\n  memcpy(clone, a_c_string, len + 1);\n\n  return clone;\n}\n\n// Sets the 0-terminated C string this MyString object\n// represents.\nvoid MyString::Set(const char* a_c_string) {\n  // Makes sure this works when c_string == c_string_\n  const char* const temp = MyString::CloneCString(a_c_string);\n  delete[] c_string_;\n  c_string_ = temp;\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample2.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n\n#ifndef GTEST_SAMPLES_SAMPLE2_H_\n#define GTEST_SAMPLES_SAMPLE2_H_\n\n#include <string.h>\n\n\n// A simple string class.\nclass MyString {\n private:\n  const char* c_string_;\n  const MyString& operator=(const MyString& rhs);\n\n public:\n  // Clones a 0-terminated C string, allocating memory using new.\n  static const char* CloneCString(const char* a_c_string);\n\n  ////////////////////////////////////////////////////////////\n  //\n  // C'tors\n\n  // The default c'tor constructs a NULL string.\n  MyString() : c_string_(NULL) {}\n\n  // Constructs a MyString by cloning a 0-terminated C string.\n  explicit MyString(const char* a_c_string) : c_string_(NULL) {\n    Set(a_c_string);\n  }\n\n  // Copy c'tor\n  MyString(const MyString& string) : c_string_(NULL) {\n    Set(string.c_string_);\n  }\n\n  ////////////////////////////////////////////////////////////\n  //\n  // D'tor.  MyString is intended to be a final class, so the d'tor\n  // doesn't need to be virtual.\n  ~MyString() { delete[] c_string_; }\n\n  // Gets the 0-terminated C string this MyString object represents.\n  const char* c_string() const { return c_string_; }\n\n  size_t Length() const {\n    return c_string_ == NULL ? 0 : strlen(c_string_);\n  }\n\n  // Sets the 0-terminated C string this MyString object represents.\n  void Set(const char* c_string);\n};\n\n\n#endif  // GTEST_SAMPLES_SAMPLE2_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample2_unittest.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n\n// This sample shows how to write a more complex unit test for a class\n// that has multiple member functions.\n//\n// Usually, it's a good idea to have one test for each method in your\n// class.  You don't have to do that exactly, but it helps to keep\n// your tests organized.  You may also throw in additional tests as\n// needed.\n\n#include \"sample2.h\"\n#include \"gtest/gtest.h\"\nnamespace {\n// In this example, we test the MyString class (a simple string).\n\n// Tests the default c'tor.\nTEST(MyString, DefaultConstructor) {\n  const MyString s;\n\n  // Asserts that s.c_string() returns NULL.\n  //\n  // <TechnicalDetails>\n  //\n  // If we write NULL instead of\n  //\n  //   static_cast<const char *>(NULL)\n  //\n  // in this assertion, it will generate a warning on gcc 3.4.  The\n  // reason is that EXPECT_EQ needs to know the types of its\n  // arguments in order to print them when it fails.  Since NULL is\n  // #defined as 0, the compiler will use the formatter function for\n  // int to print it.  However, gcc thinks that NULL should be used as\n  // a pointer, not an int, and therefore complains.\n  //\n  // The root of the problem is C++'s lack of distinction between the\n  // integer number 0 and the null pointer constant.  Unfortunately,\n  // we have to live with this fact.\n  //\n  // </TechnicalDetails>\n  EXPECT_STREQ(NULL, s.c_string());\n\n  EXPECT_EQ(0u, s.Length());\n}\n\nconst char kHelloString[] = \"Hello, world!\";\n\n// Tests the c'tor that accepts a C string.\nTEST(MyString, ConstructorFromCString) {\n  const MyString s(kHelloString);\n  EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));\n  EXPECT_EQ(sizeof(kHelloString)/sizeof(kHelloString[0]) - 1,\n            s.Length());\n}\n\n// Tests the copy c'tor.\nTEST(MyString, CopyConstructor) {\n  const MyString s1(kHelloString);\n  const MyString s2 = s1;\n  EXPECT_EQ(0, strcmp(s2.c_string(), kHelloString));\n}\n\n// Tests the Set method.\nTEST(MyString, Set) {\n  MyString s;\n\n  s.Set(kHelloString);\n  EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));\n\n  // Set should work when the input pointer is the same as the one\n  // already in the MyString object.\n  s.Set(s.c_string());\n  EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));\n\n  // Can we set the MyString to NULL?\n  s.Set(NULL);\n  EXPECT_STREQ(NULL, s.c_string());\n}\n}  // namespace\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample3-inl.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n\n#ifndef GTEST_SAMPLES_SAMPLE3_INL_H_\n#define GTEST_SAMPLES_SAMPLE3_INL_H_\n\n#include <stddef.h>\n\n\n// Queue is a simple queue implemented as a singled-linked list.\n//\n// The element type must support copy constructor.\ntemplate <typename E>  // E is the element type\nclass Queue;\n\n// QueueNode is a node in a Queue, which consists of an element of\n// type E and a pointer to the next node.\ntemplate <typename E>  // E is the element type\nclass QueueNode {\n  friend class Queue<E>;\n\n public:\n  // Gets the element in this node.\n  const E& element() const { return element_; }\n\n  // Gets the next node in the queue.\n  QueueNode* next() { return next_; }\n  const QueueNode* next() const { return next_; }\n\n private:\n  // Creates a node with a given element value.  The next pointer is\n  // set to NULL.\n  explicit QueueNode(const E& an_element) : element_(an_element), next_(NULL) {}\n\n  // We disable the default assignment operator and copy c'tor.\n  const QueueNode& operator = (const QueueNode&);\n  QueueNode(const QueueNode&);\n\n  E element_;\n  QueueNode* next_;\n};\n\ntemplate <typename E>  // E is the element type.\nclass Queue {\n public:\n  // Creates an empty queue.\n  Queue() : head_(NULL), last_(NULL), size_(0) {}\n\n  // D'tor.  Clears the queue.\n  ~Queue() { Clear(); }\n\n  // Clears the queue.\n  void Clear() {\n    if (size_ > 0) {\n      // 1. Deletes every node.\n      QueueNode<E>* node = head_;\n      QueueNode<E>* next = node->next();\n      for (; ;) {\n        delete node;\n        node = next;\n        if (node == NULL) break;\n        next = node->next();\n      }\n\n      // 2. Resets the member variables.\n      head_ = last_ = NULL;\n      size_ = 0;\n    }\n  }\n\n  // Gets the number of elements.\n  size_t Size() const { return size_; }\n\n  // Gets the first element of the queue, or NULL if the queue is empty.\n  QueueNode<E>* Head() { return head_; }\n  const QueueNode<E>* Head() const { return head_; }\n\n  // Gets the last element of the queue, or NULL if the queue is empty.\n  QueueNode<E>* Last() { return last_; }\n  const QueueNode<E>* Last() const { return last_; }\n\n  // Adds an element to the end of the queue.  A copy of the element is\n  // created using the copy constructor, and then stored in the queue.\n  // Changes made to the element in the queue doesn't affect the source\n  // object, and vice versa.\n  void Enqueue(const E& element) {\n    QueueNode<E>* new_node = new QueueNode<E>(element);\n\n    if (size_ == 0) {\n      head_ = last_ = new_node;\n      size_ = 1;\n    } else {\n      last_->next_ = new_node;\n      last_ = new_node;\n      size_++;\n    }\n  }\n\n  // Removes the head of the queue and returns it.  Returns NULL if\n  // the queue is empty.\n  E* Dequeue() {\n    if (size_ == 0) {\n      return NULL;\n    }\n\n    const QueueNode<E>* const old_head = head_;\n    head_ = head_->next_;\n    size_--;\n    if (size_ == 0) {\n      last_ = NULL;\n    }\n\n    E* element = new E(old_head->element());\n    delete old_head;\n\n    return element;\n  }\n\n  // Applies a function/functor on each element of the queue, and\n  // returns the result in a new queue.  The original queue is not\n  // affected.\n  template <typename F>\n  Queue* Map(F function) const {\n    Queue* new_queue = new Queue();\n    for (const QueueNode<E>* node = head_; node != NULL; node = node->next_) {\n      new_queue->Enqueue(function(node->element()));\n    }\n\n    return new_queue;\n  }\n\n private:\n  QueueNode<E>* head_;  // The first node of the queue.\n  QueueNode<E>* last_;  // The last node of the queue.\n  size_t size_;  // The number of elements in the queue.\n\n  // We disallow copying a queue.\n  Queue(const Queue&);\n  const Queue& operator = (const Queue&);\n};\n\n#endif  // GTEST_SAMPLES_SAMPLE3_INL_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample3_unittest.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n\n// In this example, we use a more advanced feature of Google Test called\n// test fixture.\n//\n// A test fixture is a place to hold objects and functions shared by\n// all tests in a test case.  Using a test fixture avoids duplicating\n// the test code necessary to initialize and cleanup those common\n// objects for each test.  It is also useful for defining sub-routines\n// that your tests need to invoke a lot.\n//\n// <TechnicalDetails>\n//\n// The tests share the test fixture in the sense of code sharing, not\n// data sharing.  Each test is given its own fresh copy of the\n// fixture.  You cannot expect the data modified by one test to be\n// passed on to another test, which is a bad idea.\n//\n// The reason for this design is that tests should be independent and\n// repeatable.  In particular, a test should not fail as the result of\n// another test's failure.  If one test depends on info produced by\n// another test, then the two tests should really be one big test.\n//\n// The macros for indicating the success/failure of a test\n// (EXPECT_TRUE, FAIL, etc) need to know what the current test is\n// (when Google Test prints the test result, it tells you which test\n// each failure belongs to).  Technically, these macros invoke a\n// member function of the Test class.  Therefore, you cannot use them\n// in a global function.  That's why you should put test sub-routines\n// in a test fixture.\n//\n// </TechnicalDetails>\n\n#include \"sample3-inl.h\"\n#include \"gtest/gtest.h\"\nnamespace {\n// To use a test fixture, derive a class from testing::Test.\nclass QueueTestSmpl3 : public testing::Test {\n protected:  // You should make the members protected s.t. they can be\n             // accessed from sub-classes.\n\n  // virtual void SetUp() will be called before each test is run.  You\n  // should define it if you need to initialize the variables.\n  // Otherwise, this can be skipped.\n  virtual void SetUp() {\n    q1_.Enqueue(1);\n    q2_.Enqueue(2);\n    q2_.Enqueue(3);\n  }\n\n  // virtual void TearDown() will be called after each test is run.\n  // You should define it if there is cleanup work to do.  Otherwise,\n  // you don't have to provide it.\n  //\n  // virtual void TearDown() {\n  // }\n\n  // A helper function that some test uses.\n  static int Double(int n) {\n    return 2*n;\n  }\n\n  // A helper function for testing Queue::Map().\n  void MapTester(const Queue<int> * q) {\n    // Creates a new queue, where each element is twice as big as the\n    // corresponding one in q.\n    const Queue<int> * const new_q = q->Map(Double);\n\n    // Verifies that the new queue has the same size as q.\n    ASSERT_EQ(q->Size(), new_q->Size());\n\n    // Verifies the relationship between the elements of the two queues.\n    for ( const QueueNode<int> * n1 = q->Head(), * n2 = new_q->Head();\n          n1 != NULL; n1 = n1->next(), n2 = n2->next() ) {\n      EXPECT_EQ(2 * n1->element(), n2->element());\n    }\n\n    delete new_q;\n  }\n\n  // Declares the variables your tests want to use.\n  Queue<int> q0_;\n  Queue<int> q1_;\n  Queue<int> q2_;\n};\n\n// When you have a test fixture, you define a test using TEST_F\n// instead of TEST.\n\n// Tests the default c'tor.\nTEST_F(QueueTestSmpl3, DefaultConstructor) {\n  // You can access data in the test fixture here.\n  EXPECT_EQ(0u, q0_.Size());\n}\n\n// Tests Dequeue().\nTEST_F(QueueTestSmpl3, Dequeue) {\n  int * n = q0_.Dequeue();\n  EXPECT_TRUE(n == NULL);\n\n  n = q1_.Dequeue();\n  ASSERT_TRUE(n != NULL);\n  EXPECT_EQ(1, *n);\n  EXPECT_EQ(0u, q1_.Size());\n  delete n;\n\n  n = q2_.Dequeue();\n  ASSERT_TRUE(n != NULL);\n  EXPECT_EQ(2, *n);\n  EXPECT_EQ(1u, q2_.Size());\n  delete n;\n}\n\n// Tests the Queue::Map() function.\nTEST_F(QueueTestSmpl3, Map) {\n  MapTester(&q0_);\n  MapTester(&q1_);\n  MapTester(&q2_);\n}\n}  // namespace\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample4.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n\n#include <stdio.h>\n\n#include \"sample4.h\"\n\n// Returns the current counter value, and increments it.\nint Counter::Increment() {\n  return counter_++;\n}\n\n// Returns the current counter value, and decrements it.\n// counter can not be less than 0, return 0 in this case\nint Counter::Decrement() {\n  if (counter_ == 0) {\n    return counter_;\n  } else  {\n    return counter_--;\n  }\n}\n\n// Prints the current counter value to STDOUT.\nvoid Counter::Print() const {\n  printf(\"%d\", counter_);\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample4.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n#ifndef GTEST_SAMPLES_SAMPLE4_H_\n#define GTEST_SAMPLES_SAMPLE4_H_\n\n// A simple monotonic counter.\nclass Counter {\n private:\n  int counter_;\n\n public:\n  // Creates a counter that starts at 0.\n  Counter() : counter_(0) {}\n\n  // Returns the current counter value, and increments it.\n  int Increment();\n\n  // Returns the current counter value, and decrements it.\n  int Decrement();\n\n  // Prints the current counter value to STDOUT.\n  void Print() const;\n};\n\n#endif  // GTEST_SAMPLES_SAMPLE4_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample4_unittest.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include \"sample4.h\"\n#include \"gtest/gtest.h\"\n\nnamespace {\n// Tests the Increment() method.\n\nTEST(Counter, Increment) {\n  Counter c;\n\n  // Test that counter 0 returns 0\n  EXPECT_EQ(0, c.Decrement());\n\n  // EXPECT_EQ() evaluates its arguments exactly once, so they\n  // can have side effects.\n\n  EXPECT_EQ(0, c.Increment());\n  EXPECT_EQ(1, c.Increment());\n  EXPECT_EQ(2, c.Increment());\n\n  EXPECT_EQ(3, c.Decrement());\n}\n\n}  // namespace\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample5_unittest.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// This sample teaches how to reuse a test fixture in multiple test\n// cases by deriving sub-fixtures from it.\n//\n// When you define a test fixture, you specify the name of the test\n// case that will use this fixture.  Therefore, a test fixture can\n// be used by only one test case.\n//\n// Sometimes, more than one test cases may want to use the same or\n// slightly different test fixtures.  For example, you may want to\n// make sure that all tests for a GUI library don't leak important\n// system resources like fonts and brushes.  In Google Test, you do\n// this by putting the shared logic in a super (as in \"super class\")\n// test fixture, and then have each test case use a fixture derived\n// from this super fixture.\n\n#include <limits.h>\n#include <time.h>\n#include \"gtest/gtest.h\"\n#include \"sample1.h\"\n#include \"sample3-inl.h\"\nnamespace {\n// In this sample, we want to ensure that every test finishes within\n// ~5 seconds.  If a test takes longer to run, we consider it a\n// failure.\n//\n// We put the code for timing a test in a test fixture called\n// \"QuickTest\".  QuickTest is intended to be the super fixture that\n// other fixtures derive from, therefore there is no test case with\n// the name \"QuickTest\".  This is OK.\n//\n// Later, we will derive multiple test fixtures from QuickTest.\nclass QuickTest : public testing::Test {\n protected:\n  // Remember that SetUp() is run immediately before a test starts.\n  // This is a good place to record the start time.\n  virtual void SetUp() {\n    start_time_ = time(NULL);\n  }\n\n  // TearDown() is invoked immediately after a test finishes.  Here we\n  // check if the test was too slow.\n  virtual void TearDown() {\n    // Gets the time when the test finishes\n    const time_t end_time = time(NULL);\n\n    // Asserts that the test took no more than ~5 seconds.  Did you\n    // know that you can use assertions in SetUp() and TearDown() as\n    // well?\n    EXPECT_TRUE(end_time - start_time_ <= 5) << \"The test took too long.\";\n  }\n\n  // The UTC time (in seconds) when the test starts\n  time_t start_time_;\n};\n\n\n// We derive a fixture named IntegerFunctionTest from the QuickTest\n// fixture.  All tests using this fixture will be automatically\n// required to be quick.\nclass IntegerFunctionTest : public QuickTest {\n  // We don't need any more logic than already in the QuickTest fixture.\n  // Therefore the body is empty.\n};\n\n\n// Now we can write tests in the IntegerFunctionTest test case.\n\n// Tests Factorial()\nTEST_F(IntegerFunctionTest, Factorial) {\n  // Tests factorial of negative numbers.\n  EXPECT_EQ(1, Factorial(-5));\n  EXPECT_EQ(1, Factorial(-1));\n  EXPECT_GT(Factorial(-10), 0);\n\n  // Tests factorial of 0.\n  EXPECT_EQ(1, Factorial(0));\n\n  // Tests factorial of positive numbers.\n  EXPECT_EQ(1, Factorial(1));\n  EXPECT_EQ(2, Factorial(2));\n  EXPECT_EQ(6, Factorial(3));\n  EXPECT_EQ(40320, Factorial(8));\n}\n\n\n// Tests IsPrime()\nTEST_F(IntegerFunctionTest, IsPrime) {\n  // Tests negative input.\n  EXPECT_FALSE(IsPrime(-1));\n  EXPECT_FALSE(IsPrime(-2));\n  EXPECT_FALSE(IsPrime(INT_MIN));\n\n  // Tests some trivial cases.\n  EXPECT_FALSE(IsPrime(0));\n  EXPECT_FALSE(IsPrime(1));\n  EXPECT_TRUE(IsPrime(2));\n  EXPECT_TRUE(IsPrime(3));\n\n  // Tests positive input.\n  EXPECT_FALSE(IsPrime(4));\n  EXPECT_TRUE(IsPrime(5));\n  EXPECT_FALSE(IsPrime(6));\n  EXPECT_TRUE(IsPrime(23));\n}\n\n\n// The next test case (named \"QueueTest\") also needs to be quick, so\n// we derive another fixture from QuickTest.\n//\n// The QueueTest test fixture has some logic and shared objects in\n// addition to what's in QuickTest already.  We define the additional\n// stuff inside the body of the test fixture, as usual.\nclass QueueTest : public QuickTest {\n protected:\n  virtual void SetUp() {\n    // First, we need to set up the super fixture (QuickTest).\n    QuickTest::SetUp();\n\n    // Second, some additional setup for this fixture.\n    q1_.Enqueue(1);\n    q2_.Enqueue(2);\n    q2_.Enqueue(3);\n  }\n\n  // By default, TearDown() inherits the behavior of\n  // QuickTest::TearDown().  As we have no additional cleaning work\n  // for QueueTest, we omit it here.\n  //\n  // virtual void TearDown() {\n  //   QuickTest::TearDown();\n  // }\n\n  Queue<int> q0_;\n  Queue<int> q1_;\n  Queue<int> q2_;\n};\n\n\n// Now, let's write tests using the QueueTest fixture.\n\n// Tests the default constructor.\nTEST_F(QueueTest, DefaultConstructor) {\n  EXPECT_EQ(0u, q0_.Size());\n}\n\n// Tests Dequeue().\nTEST_F(QueueTest, Dequeue) {\n  int* n = q0_.Dequeue();\n  EXPECT_TRUE(n == NULL);\n\n  n = q1_.Dequeue();\n  EXPECT_TRUE(n != NULL);\n  EXPECT_EQ(1, *n);\n  EXPECT_EQ(0u, q1_.Size());\n  delete n;\n\n  n = q2_.Dequeue();\n  EXPECT_TRUE(n != NULL);\n  EXPECT_EQ(2, *n);\n  EXPECT_EQ(1u, q2_.Size());\n  delete n;\n}\n}  // namespace\n// If necessary, you can derive further test fixtures from a derived\n// fixture itself.  For example, you can derive another fixture from\n// QueueTest.  Google Test imposes no limit on how deep the hierarchy\n// can be.  In practice, however, you probably don't want it to be too\n// deep as to be confusing.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample6_unittest.cc",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// This sample shows how to test common properties of multiple\n// implementations of the same interface (aka interface tests).\n\n// The interface and its implementations are in this header.\n#include \"prime_tables.h\"\n\n#include \"gtest/gtest.h\"\nnamespace {\n// First, we define some factory functions for creating instances of\n// the implementations.  You may be able to skip this step if all your\n// implementations can be constructed the same way.\n\ntemplate <class T>\nPrimeTable* CreatePrimeTable();\n\ntemplate <>\nPrimeTable* CreatePrimeTable<OnTheFlyPrimeTable>() {\n  return new OnTheFlyPrimeTable;\n}\n\ntemplate <>\nPrimeTable* CreatePrimeTable<PreCalculatedPrimeTable>() {\n  return new PreCalculatedPrimeTable(10000);\n}\n\n// Then we define a test fixture class template.\ntemplate <class T>\nclass PrimeTableTest : public testing::Test {\n protected:\n  // The ctor calls the factory function to create a prime table\n  // implemented by T.\n  PrimeTableTest() : table_(CreatePrimeTable<T>()) {}\n\n  virtual ~PrimeTableTest() { delete table_; }\n\n  // Note that we test an implementation via the base interface\n  // instead of the actual implementation class.  This is important\n  // for keeping the tests close to the real world scenario, where the\n  // implementation is invoked via the base interface.  It avoids\n  // got-yas where the implementation class has a method that shadows\n  // a method with the same name (but slightly different argument\n  // types) in the base interface, for example.\n  PrimeTable* const table_;\n};\n\n#if GTEST_HAS_TYPED_TEST\n\nusing testing::Types;\n\n// Google Test offers two ways for reusing tests for different types.\n// The first is called \"typed tests\".  You should use it if you\n// already know *all* the types you are gonna exercise when you write\n// the tests.\n\n// To write a typed test case, first use\n//\n//   TYPED_TEST_CASE(TestCaseName, TypeList);\n//\n// to declare it and specify the type parameters.  As with TEST_F,\n// TestCaseName must match the test fixture name.\n\n// The list of types we want to test.\ntypedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable> Implementations;\n\nTYPED_TEST_CASE(PrimeTableTest, Implementations);\n\n// Then use TYPED_TEST(TestCaseName, TestName) to define a typed test,\n// similar to TEST_F.\nTYPED_TEST(PrimeTableTest, ReturnsFalseForNonPrimes) {\n  // Inside the test body, you can refer to the type parameter by\n  // TypeParam, and refer to the fixture class by TestFixture.  We\n  // don't need them in this example.\n\n  // Since we are in the template world, C++ requires explicitly\n  // writing 'this->' when referring to members of the fixture class.\n  // This is something you have to learn to live with.\n  EXPECT_FALSE(this->table_->IsPrime(-5));\n  EXPECT_FALSE(this->table_->IsPrime(0));\n  EXPECT_FALSE(this->table_->IsPrime(1));\n  EXPECT_FALSE(this->table_->IsPrime(4));\n  EXPECT_FALSE(this->table_->IsPrime(6));\n  EXPECT_FALSE(this->table_->IsPrime(100));\n}\n\nTYPED_TEST(PrimeTableTest, ReturnsTrueForPrimes) {\n  EXPECT_TRUE(this->table_->IsPrime(2));\n  EXPECT_TRUE(this->table_->IsPrime(3));\n  EXPECT_TRUE(this->table_->IsPrime(5));\n  EXPECT_TRUE(this->table_->IsPrime(7));\n  EXPECT_TRUE(this->table_->IsPrime(11));\n  EXPECT_TRUE(this->table_->IsPrime(131));\n}\n\nTYPED_TEST(PrimeTableTest, CanGetNextPrime) {\n  EXPECT_EQ(2, this->table_->GetNextPrime(0));\n  EXPECT_EQ(3, this->table_->GetNextPrime(2));\n  EXPECT_EQ(5, this->table_->GetNextPrime(3));\n  EXPECT_EQ(7, this->table_->GetNextPrime(5));\n  EXPECT_EQ(11, this->table_->GetNextPrime(7));\n  EXPECT_EQ(131, this->table_->GetNextPrime(128));\n}\n\n// That's it!  Google Test will repeat each TYPED_TEST for each type\n// in the type list specified in TYPED_TEST_CASE.  Sit back and be\n// happy that you don't have to define them multiple times.\n\n#endif  // GTEST_HAS_TYPED_TEST\n\n#if GTEST_HAS_TYPED_TEST_P\n\nusing testing::Types;\n\n// Sometimes, however, you don't yet know all the types that you want\n// to test when you write the tests.  For example, if you are the\n// author of an interface and expect other people to implement it, you\n// might want to write a set of tests to make sure each implementation\n// conforms to some basic requirements, but you don't know what\n// implementations will be written in the future.\n//\n// How can you write the tests without committing to the type\n// parameters?  That's what \"type-parameterized tests\" can do for you.\n// It is a bit more involved than typed tests, but in return you get a\n// test pattern that can be reused in many contexts, which is a big\n// win.  Here's how you do it:\n\n// First, define a test fixture class template.  Here we just reuse\n// the PrimeTableTest fixture defined earlier:\n\ntemplate <class T>\nclass PrimeTableTest2 : public PrimeTableTest<T> {\n};\n\n// Then, declare the test case.  The argument is the name of the test\n// fixture, and also the name of the test case (as usual).  The _P\n// suffix is for \"parameterized\" or \"pattern\".\nTYPED_TEST_CASE_P(PrimeTableTest2);\n\n// Next, use TYPED_TEST_P(TestCaseName, TestName) to define a test,\n// similar to what you do with TEST_F.\nTYPED_TEST_P(PrimeTableTest2, ReturnsFalseForNonPrimes) {\n  EXPECT_FALSE(this->table_->IsPrime(-5));\n  EXPECT_FALSE(this->table_->IsPrime(0));\n  EXPECT_FALSE(this->table_->IsPrime(1));\n  EXPECT_FALSE(this->table_->IsPrime(4));\n  EXPECT_FALSE(this->table_->IsPrime(6));\n  EXPECT_FALSE(this->table_->IsPrime(100));\n}\n\nTYPED_TEST_P(PrimeTableTest2, ReturnsTrueForPrimes) {\n  EXPECT_TRUE(this->table_->IsPrime(2));\n  EXPECT_TRUE(this->table_->IsPrime(3));\n  EXPECT_TRUE(this->table_->IsPrime(5));\n  EXPECT_TRUE(this->table_->IsPrime(7));\n  EXPECT_TRUE(this->table_->IsPrime(11));\n  EXPECT_TRUE(this->table_->IsPrime(131));\n}\n\nTYPED_TEST_P(PrimeTableTest2, CanGetNextPrime) {\n  EXPECT_EQ(2, this->table_->GetNextPrime(0));\n  EXPECT_EQ(3, this->table_->GetNextPrime(2));\n  EXPECT_EQ(5, this->table_->GetNextPrime(3));\n  EXPECT_EQ(7, this->table_->GetNextPrime(5));\n  EXPECT_EQ(11, this->table_->GetNextPrime(7));\n  EXPECT_EQ(131, this->table_->GetNextPrime(128));\n}\n\n// Type-parameterized tests involve one extra step: you have to\n// enumerate the tests you defined:\nREGISTER_TYPED_TEST_CASE_P(\n    PrimeTableTest2,  // The first argument is the test case name.\n    // The rest of the arguments are the test names.\n    ReturnsFalseForNonPrimes, ReturnsTrueForPrimes, CanGetNextPrime);\n\n// At this point the test pattern is done.  However, you don't have\n// any real test yet as you haven't said which types you want to run\n// the tests with.\n\n// To turn the abstract test pattern into real tests, you instantiate\n// it with a list of types.  Usually the test pattern will be defined\n// in a .h file, and anyone can #include and instantiate it.  You can\n// even instantiate it more than once in the same program.  To tell\n// different instances apart, you give each of them a name, which will\n// become part of the test case name and can be used in test filters.\n\n// The list of types we want to test.  Note that it doesn't have to be\n// defined at the time we write the TYPED_TEST_P()s.\ntypedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable>\n    PrimeTableImplementations;\nINSTANTIATE_TYPED_TEST_CASE_P(OnTheFlyAndPreCalculated,    // Instance name\n                              PrimeTableTest2,             // Test case name\n                              PrimeTableImplementations);  // Type list\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n}  // namespace\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample7_unittest.cc",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// This sample shows how to test common properties of multiple\n// implementations of an interface (aka interface tests) using\n// value-parameterized tests. Each test in the test case has\n// a parameter that is an interface pointer to an implementation\n// tested.\n\n// The interface and its implementations are in this header.\n#include \"prime_tables.h\"\n\n#include \"gtest/gtest.h\"\nnamespace {\n\nusing ::testing::TestWithParam;\nusing ::testing::Values;\n\n// As a general rule, to prevent a test from affecting the tests that come\n// after it, you should create and destroy the tested objects for each test\n// instead of reusing them.  In this sample we will define a simple factory\n// function for PrimeTable objects.  We will instantiate objects in test's\n// SetUp() method and delete them in TearDown() method.\ntypedef PrimeTable* CreatePrimeTableFunc();\n\nPrimeTable* CreateOnTheFlyPrimeTable() {\n  return new OnTheFlyPrimeTable();\n}\n\ntemplate <size_t max_precalculated>\nPrimeTable* CreatePreCalculatedPrimeTable() {\n  return new PreCalculatedPrimeTable(max_precalculated);\n}\n\n// Inside the test body, fixture constructor, SetUp(), and TearDown() you\n// can refer to the test parameter by GetParam().  In this case, the test\n// parameter is a factory function which we call in fixture's SetUp() to\n// create and store an instance of PrimeTable.\nclass PrimeTableTestSmpl7 : public TestWithParam<CreatePrimeTableFunc*> {\n public:\n  virtual ~PrimeTableTestSmpl7() { delete table_; }\n  virtual void SetUp() { table_ = (*GetParam())(); }\n  virtual void TearDown() {\n    delete table_;\n    table_ = NULL;\n  }\n\n protected:\n  PrimeTable* table_;\n};\n\nTEST_P(PrimeTableTestSmpl7, ReturnsFalseForNonPrimes) {\n  EXPECT_FALSE(table_->IsPrime(-5));\n  EXPECT_FALSE(table_->IsPrime(0));\n  EXPECT_FALSE(table_->IsPrime(1));\n  EXPECT_FALSE(table_->IsPrime(4));\n  EXPECT_FALSE(table_->IsPrime(6));\n  EXPECT_FALSE(table_->IsPrime(100));\n}\n\nTEST_P(PrimeTableTestSmpl7, ReturnsTrueForPrimes) {\n  EXPECT_TRUE(table_->IsPrime(2));\n  EXPECT_TRUE(table_->IsPrime(3));\n  EXPECT_TRUE(table_->IsPrime(5));\n  EXPECT_TRUE(table_->IsPrime(7));\n  EXPECT_TRUE(table_->IsPrime(11));\n  EXPECT_TRUE(table_->IsPrime(131));\n}\n\nTEST_P(PrimeTableTestSmpl7, CanGetNextPrime) {\n  EXPECT_EQ(2, table_->GetNextPrime(0));\n  EXPECT_EQ(3, table_->GetNextPrime(2));\n  EXPECT_EQ(5, table_->GetNextPrime(3));\n  EXPECT_EQ(7, table_->GetNextPrime(5));\n  EXPECT_EQ(11, table_->GetNextPrime(7));\n  EXPECT_EQ(131, table_->GetNextPrime(128));\n}\n\n// In order to run value-parameterized tests, you need to instantiate them,\n// or bind them to a list of values which will be used as test parameters.\n// You can instantiate them in a different translation module, or even\n// instantiate them several times.\n//\n// Here, we instantiate our tests with a list of two PrimeTable object\n// factory functions:\nINSTANTIATE_TEST_CASE_P(OnTheFlyAndPreCalculated, PrimeTableTestSmpl7,\n                        Values(&CreateOnTheFlyPrimeTable,\n                               &CreatePreCalculatedPrimeTable<1000>));\n\n}  // namespace\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample8_unittest.cc",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// This sample shows how to test code relying on some global flag variables.\n// Combine() helps with generating all possible combinations of such flags,\n// and each test is given one combination as a parameter.\n\n// Use class definitions to test from this header.\n#include \"prime_tables.h\"\n\n#include \"gtest/gtest.h\"\nnamespace {\n#if GTEST_HAS_COMBINE\n\n// Suppose we want to introduce a new, improved implementation of PrimeTable\n// which combines speed of PrecalcPrimeTable and versatility of\n// OnTheFlyPrimeTable (see prime_tables.h). Inside it instantiates both\n// PrecalcPrimeTable and OnTheFlyPrimeTable and uses the one that is more\n// appropriate under the circumstances. But in low memory conditions, it can be\n// told to instantiate without PrecalcPrimeTable instance at all and use only\n// OnTheFlyPrimeTable.\nclass HybridPrimeTable : public PrimeTable {\n public:\n  HybridPrimeTable(bool force_on_the_fly, int max_precalculated)\n      : on_the_fly_impl_(new OnTheFlyPrimeTable),\n        precalc_impl_(force_on_the_fly ? NULL :\n                          new PreCalculatedPrimeTable(max_precalculated)),\n        max_precalculated_(max_precalculated) {}\n  virtual ~HybridPrimeTable() {\n    delete on_the_fly_impl_;\n    delete precalc_impl_;\n  }\n\n  virtual bool IsPrime(int n) const {\n    if (precalc_impl_ != NULL && n < max_precalculated_)\n      return precalc_impl_->IsPrime(n);\n    else\n      return on_the_fly_impl_->IsPrime(n);\n  }\n\n  virtual int GetNextPrime(int p) const {\n    int next_prime = -1;\n    if (precalc_impl_ != NULL && p < max_precalculated_)\n      next_prime = precalc_impl_->GetNextPrime(p);\n\n    return next_prime != -1 ? next_prime : on_the_fly_impl_->GetNextPrime(p);\n  }\n\n private:\n  OnTheFlyPrimeTable* on_the_fly_impl_;\n  PreCalculatedPrimeTable* precalc_impl_;\n  int max_precalculated_;\n};\n\nusing ::testing::TestWithParam;\nusing ::testing::Bool;\nusing ::testing::Values;\nusing ::testing::Combine;\n\n// To test all code paths for HybridPrimeTable we must test it with numbers\n// both within and outside PreCalculatedPrimeTable's capacity and also with\n// PreCalculatedPrimeTable disabled. We do this by defining fixture which will\n// accept different combinations of parameters for instantiating a\n// HybridPrimeTable instance.\nclass PrimeTableTest : public TestWithParam< ::testing::tuple<bool, int> > {\n protected:\n  virtual void SetUp() {\n    // This can be written as\n    //\n    // bool force_on_the_fly;\n    // int max_precalculated;\n    // tie(force_on_the_fly, max_precalculated) = GetParam();\n    //\n    // once the Google C++ Style Guide allows use of ::std::tr1::tie.\n    //\n    bool force_on_the_fly = ::testing::get<0>(GetParam());\n    int max_precalculated = ::testing::get<1>(GetParam());\n    table_ = new HybridPrimeTable(force_on_the_fly, max_precalculated);\n  }\n  virtual void TearDown() {\n    delete table_;\n    table_ = NULL;\n  }\n  HybridPrimeTable* table_;\n};\n\nTEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) {\n  // Inside the test body, you can refer to the test parameter by GetParam().\n  // In this case, the test parameter is a PrimeTable interface pointer which\n  // we can use directly.\n  // Please note that you can also save it in the fixture's SetUp() method\n  // or constructor and use saved copy in the tests.\n\n  EXPECT_FALSE(table_->IsPrime(-5));\n  EXPECT_FALSE(table_->IsPrime(0));\n  EXPECT_FALSE(table_->IsPrime(1));\n  EXPECT_FALSE(table_->IsPrime(4));\n  EXPECT_FALSE(table_->IsPrime(6));\n  EXPECT_FALSE(table_->IsPrime(100));\n}\n\nTEST_P(PrimeTableTest, ReturnsTrueForPrimes) {\n  EXPECT_TRUE(table_->IsPrime(2));\n  EXPECT_TRUE(table_->IsPrime(3));\n  EXPECT_TRUE(table_->IsPrime(5));\n  EXPECT_TRUE(table_->IsPrime(7));\n  EXPECT_TRUE(table_->IsPrime(11));\n  EXPECT_TRUE(table_->IsPrime(131));\n}\n\nTEST_P(PrimeTableTest, CanGetNextPrime) {\n  EXPECT_EQ(2, table_->GetNextPrime(0));\n  EXPECT_EQ(3, table_->GetNextPrime(2));\n  EXPECT_EQ(5, table_->GetNextPrime(3));\n  EXPECT_EQ(7, table_->GetNextPrime(5));\n  EXPECT_EQ(11, table_->GetNextPrime(7));\n  EXPECT_EQ(131, table_->GetNextPrime(128));\n}\n\n// In order to run value-parameterized tests, you need to instantiate them,\n// or bind them to a list of values which will be used as test parameters.\n// You can instantiate them in a different translation module, or even\n// instantiate them several times.\n//\n// Here, we instantiate our tests with a list of parameters. We must combine\n// all variations of the boolean flag suppressing PrecalcPrimeTable and some\n// meaningful values for tests. We choose a small value (1), and a value that\n// will put some of the tested numbers beyond the capability of the\n// PrecalcPrimeTable instance and some inside it (10). Combine will produce all\n// possible combinations.\nINSTANTIATE_TEST_CASE_P(MeaningfulTestParameters,\n                        PrimeTableTest,\n                        Combine(Bool(), Values(1, 10)));\n\n#else\n\n// Google Test may not support Combine() with some compilers. If we\n// use conditional compilation to compile out all code referring to\n// the gtest_main library, MSVC linker will not link that library at\n// all and consequently complain about missing entry point defined in\n// that library (fatal error LNK1561: entry point must be\n// defined). This dummy test keeps gtest_main linked in.\nTEST(DummyTest, CombineIsNotSupportedOnThisPlatform) {}\n\n#endif  // GTEST_HAS_COMBINE\n}  // namespace\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/samples/sample9_unittest.cc",
    "content": "// Copyright 2009 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// This sample shows how to use Google Test listener API to implement\n// an alternative console output and how to use the UnitTest reflection API\n// to enumerate test cases and tests and to inspect their results.\n\n#include <stdio.h>\n\n#include \"gtest/gtest.h\"\n\nusing ::testing::EmptyTestEventListener;\nusing ::testing::InitGoogleTest;\nusing ::testing::Test;\nusing ::testing::TestCase;\nusing ::testing::TestEventListeners;\nusing ::testing::TestInfo;\nusing ::testing::TestPartResult;\nusing ::testing::UnitTest;\nnamespace {\n// Provides alternative output mode which produces minimal amount of\n// information about tests.\nclass TersePrinter : public EmptyTestEventListener {\n private:\n  // Called before any test activity starts.\n  virtual void OnTestProgramStart(const UnitTest& /* unit_test */) {}\n\n  // Called after all test activities have ended.\n  virtual void OnTestProgramEnd(const UnitTest& unit_test) {\n    fprintf(stdout, \"TEST %s\\n\", unit_test.Passed() ? \"PASSED\" : \"FAILED\");\n    fflush(stdout);\n  }\n\n  // Called before a test starts.\n  virtual void OnTestStart(const TestInfo& test_info) {\n    fprintf(stdout,\n            \"*** Test %s.%s starting.\\n\",\n            test_info.test_case_name(),\n            test_info.name());\n    fflush(stdout);\n  }\n\n  // Called after a failed assertion or a SUCCEED() invocation.\n  virtual void OnTestPartResult(const TestPartResult& test_part_result) {\n    fprintf(stdout,\n            \"%s in %s:%d\\n%s\\n\",\n            test_part_result.failed() ? \"*** Failure\" : \"Success\",\n            test_part_result.file_name(),\n            test_part_result.line_number(),\n            test_part_result.summary());\n    fflush(stdout);\n  }\n\n  // Called after a test ends.\n  virtual void OnTestEnd(const TestInfo& test_info) {\n    fprintf(stdout,\n            \"*** Test %s.%s ending.\\n\",\n            test_info.test_case_name(),\n            test_info.name());\n    fflush(stdout);\n  }\n};  // class TersePrinter\n\nTEST(CustomOutputTest, PrintsMessage) {\n  printf(\"Printing something from the test body...\\n\");\n}\n\nTEST(CustomOutputTest, Succeeds) {\n  SUCCEED() << \"SUCCEED() has been invoked from here\";\n}\n\nTEST(CustomOutputTest, Fails) {\n  EXPECT_EQ(1, 2)\n      << \"This test fails in order to demonstrate alternative failure messages\";\n}\n}  // namespace\n\nint main(int argc, char **argv) {\n  InitGoogleTest(&argc, argv);\n\n  bool terse_output = false;\n  if (argc > 1 && strcmp(argv[1], \"--terse_output\") == 0 )\n    terse_output = true;\n  else\n    printf(\"%s\\n\", \"Run this program with --terse_output to change the way \"\n           \"it prints its output.\");\n\n  UnitTest& unit_test = *UnitTest::GetInstance();\n\n  // If we are given the --terse_output command line flag, suppresses the\n  // standard output and attaches own result printer.\n  if (terse_output) {\n    TestEventListeners& listeners = unit_test.listeners();\n\n    // Removes the default console output listener from the list so it will\n    // not receive events from Google Test and won't print any output. Since\n    // this operation transfers ownership of the listener to the caller we\n    // have to delete it as well.\n    delete listeners.Release(listeners.default_result_printer());\n\n    // Adds the custom output listener to the list. It will now receive\n    // events from Google Test and print the alternative output. We don't\n    // have to worry about deleting it since Google Test assumes ownership\n    // over it after adding it to the list.\n    listeners.Append(new TersePrinter);\n  }\n  int ret_val = RUN_ALL_TESTS();\n\n  // This is an example of using the UnitTest reflection API to inspect test\n  // results. Here we discount failures from the tests we expected to fail.\n  int unexpectedly_failed_tests = 0;\n  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {\n    const TestCase& test_case = *unit_test.GetTestCase(i);\n    for (int j = 0; j < test_case.total_test_count(); ++j) {\n      const TestInfo& test_info = *test_case.GetTestInfo(j);\n      // Counts failed tests that were not meant to fail (those without\n      // 'Fails' in the name).\n      if (test_info.result()->Failed() &&\n          strcmp(test_info.name(), \"Fails\") != 0) {\n        unexpectedly_failed_tests++;\n      }\n    }\n  }\n\n  // Test that were meant to fail should not affect the test program outcome.\n  if (unexpectedly_failed_tests == 0)\n    ret_val = 0;\n\n  return ret_val;\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/scripts/common.py",
    "content": "# Copyright 2013 Google Inc. All Rights Reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Shared utilities for writing scripts for Google Test/Mock.\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\n\nimport os\nimport re\n\n\n# Matches the line from 'svn info .' output that describes what SVN\n# path the current local directory corresponds to.  For example, in\n# a googletest SVN workspace's trunk/test directory, the output will be:\n#\n# URL: https://googletest.googlecode.com/svn/trunk/test\n_SVN_INFO_URL_RE = re.compile(r'^URL: https://(\\w+)\\.googlecode\\.com/svn(.*)')\n\n\ndef GetCommandOutput(command):\n  \"\"\"Runs the shell command and returns its stdout as a list of lines.\"\"\"\n\n  f = os.popen(command, 'r')\n  lines = [line.strip() for line in f.readlines()]\n  f.close()\n  return lines\n\n\ndef GetSvnInfo():\n  \"\"\"Returns the project name and the current SVN workspace's root path.\"\"\"\n\n  for line in GetCommandOutput('svn info .'):\n    m = _SVN_INFO_URL_RE.match(line)\n    if m:\n      project = m.group(1)  # googletest or googlemock\n      rel_path = m.group(2)\n      root = os.path.realpath(rel_path.count('/') * '../')\n      return project, root\n\n  return None, None\n\n\ndef GetSvnTrunk():\n  \"\"\"Returns the current SVN workspace's trunk root path.\"\"\"\n\n  _, root = GetSvnInfo()\n  return root + '/trunk' if root else None\n\n\ndef IsInGTestSvn():\n  project, _ = GetSvnInfo()\n  return project == 'googletest'\n\n\ndef IsInGMockSvn():\n  project, _ = GetSvnInfo()\n  return project == 'googlemock'\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/scripts/fuse_gtest_files.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"fuse_gtest_files.py v0.2.0\nFuses Google Test source code into a .h file and a .cc file.\n\nSYNOPSIS\n       fuse_gtest_files.py [GTEST_ROOT_DIR] OUTPUT_DIR\n\n       Scans GTEST_ROOT_DIR for Google Test source code, and generates\n       two files: OUTPUT_DIR/gtest/gtest.h and OUTPUT_DIR/gtest/gtest-all.cc.\n       Then you can build your tests by adding OUTPUT_DIR to the include\n       search path and linking with OUTPUT_DIR/gtest/gtest-all.cc.  These\n       two files contain everything you need to use Google Test.  Hence\n       you can \"install\" Google Test by copying them to wherever you want.\n\n       GTEST_ROOT_DIR can be omitted and defaults to the parent\n       directory of the directory holding this script.\n\nEXAMPLES\n       ./fuse_gtest_files.py fused_gtest\n       ./fuse_gtest_files.py path/to/unpacked/gtest fused_gtest\n\nThis tool is experimental.  In particular, it assumes that there is no\nconditional inclusion of Google Test headers.  Please report any\nproblems to googletestframework@googlegroups.com.  You can read\nhttps://github.com/google/googletest/blob/master/googletest/docs/advanced.md for\nmore information.\n\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport re\ntry:\n  from sets import Set as set  # For Python 2.3 compatibility\nexcept ImportError:\n  pass\nimport sys\n\n# We assume that this file is in the scripts/ directory in the Google\n# Test root directory.\nDEFAULT_GTEST_ROOT_DIR = os.path.join(os.path.dirname(__file__), '..')\n\n# Regex for matching '#include \"gtest/...\"'.\nINCLUDE_GTEST_FILE_REGEX = re.compile(r'^\\s*#\\s*include\\s*\"(gtest/.+)\"')\n\n# Regex for matching '#include \"src/...\"'.\nINCLUDE_SRC_FILE_REGEX = re.compile(r'^\\s*#\\s*include\\s*\"(src/.+)\"')\n\n# Where to find the source seed files.\nGTEST_H_SEED = 'include/gtest/gtest.h'\nGTEST_SPI_H_SEED = 'include/gtest/gtest-spi.h'\nGTEST_ALL_CC_SEED = 'src/gtest-all.cc'\n\n# Where to put the generated files.\nGTEST_H_OUTPUT = 'gtest/gtest.h'\nGTEST_ALL_CC_OUTPUT = 'gtest/gtest-all.cc'\n\n\ndef VerifyFileExists(directory, relative_path):\n  \"\"\"Verifies that the given file exists; aborts on failure.\n\n  relative_path is the file path relative to the given directory.\n  \"\"\"\n\n  if not os.path.isfile(os.path.join(directory, relative_path)):\n    print('ERROR: Cannot find %s in directory %s.' % (relative_path,\n                                                      directory))\n    print('Please either specify a valid project root directory '\n          'or omit it on the command line.')\n    sys.exit(1)\n\n\ndef ValidateGTestRootDir(gtest_root):\n  \"\"\"Makes sure gtest_root points to a valid gtest root directory.\n\n  The function aborts the program on failure.\n  \"\"\"\n\n  VerifyFileExists(gtest_root, GTEST_H_SEED)\n  VerifyFileExists(gtest_root, GTEST_ALL_CC_SEED)\n\n\ndef VerifyOutputFile(output_dir, relative_path):\n  \"\"\"Verifies that the given output file path is valid.\n\n  relative_path is relative to the output_dir directory.\n  \"\"\"\n\n  # Makes sure the output file either doesn't exist or can be overwritten.\n  output_file = os.path.join(output_dir, relative_path)\n  if os.path.exists(output_file):\n    # TODO(wan@google.com): The following user-interaction doesn't\n    # work with automated processes.  We should provide a way for the\n    # Makefile to force overwriting the files.\n    print('%s already exists in directory %s - overwrite it? (y/N) ' %\n          (relative_path, output_dir))\n    answer = sys.stdin.readline().strip()\n    if answer not in ['y', 'Y']:\n      print('ABORTED.')\n      sys.exit(1)\n\n  # Makes sure the directory holding the output file exists; creates\n  # it and all its ancestors if necessary.\n  parent_directory = os.path.dirname(output_file)\n  if not os.path.isdir(parent_directory):\n    os.makedirs(parent_directory)\n\n\ndef ValidateOutputDir(output_dir):\n  \"\"\"Makes sure output_dir points to a valid output directory.\n\n  The function aborts the program on failure.\n  \"\"\"\n\n  VerifyOutputFile(output_dir, GTEST_H_OUTPUT)\n  VerifyOutputFile(output_dir, GTEST_ALL_CC_OUTPUT)\n\n\ndef FuseGTestH(gtest_root, output_dir):\n  \"\"\"Scans folder gtest_root to generate gtest/gtest.h in output_dir.\"\"\"\n\n  output_file = open(os.path.join(output_dir, GTEST_H_OUTPUT), 'w')\n  processed_files = set()  # Holds all gtest headers we've processed.\n\n  def ProcessFile(gtest_header_path):\n    \"\"\"Processes the given gtest header file.\"\"\"\n\n    # We don't process the same header twice.\n    if gtest_header_path in processed_files:\n      return\n\n    processed_files.add(gtest_header_path)\n\n    # Reads each line in the given gtest header.\n    for line in open(os.path.join(gtest_root, gtest_header_path), 'r'):\n      m = INCLUDE_GTEST_FILE_REGEX.match(line)\n      if m:\n        # It's '#include \"gtest/...\"' - let's process it recursively.\n        ProcessFile('include/' + m.group(1))\n      else:\n        # Otherwise we copy the line unchanged to the output file.\n        output_file.write(line)\n\n  ProcessFile(GTEST_H_SEED)\n  output_file.close()\n\n\ndef FuseGTestAllCcToFile(gtest_root, output_file):\n  \"\"\"Scans folder gtest_root to generate gtest/gtest-all.cc in output_file.\"\"\"\n\n  processed_files = set()\n\n  def ProcessFile(gtest_source_file):\n    \"\"\"Processes the given gtest source file.\"\"\"\n\n    # We don't process the same #included file twice.\n    if gtest_source_file in processed_files:\n      return\n\n    processed_files.add(gtest_source_file)\n\n    # Reads each line in the given gtest source file.\n    for line in open(os.path.join(gtest_root, gtest_source_file), 'r'):\n      m = INCLUDE_GTEST_FILE_REGEX.match(line)\n      if m:\n        if 'include/' + m.group(1) == GTEST_SPI_H_SEED:\n          # It's '#include \"gtest/gtest-spi.h\"'.  This file is not\n          # #included by \"gtest/gtest.h\", so we need to process it.\n          ProcessFile(GTEST_SPI_H_SEED)\n        else:\n          # It's '#include \"gtest/foo.h\"' where foo is not gtest-spi.\n          # We treat it as '#include \"gtest/gtest.h\"', as all other\n          # gtest headers are being fused into gtest.h and cannot be\n          # #included directly.\n\n          # There is no need to #include \"gtest/gtest.h\" more than once.\n          if not GTEST_H_SEED in processed_files:\n            processed_files.add(GTEST_H_SEED)\n            output_file.write('#include \"%s\"\\n' % (GTEST_H_OUTPUT,))\n      else:\n        m = INCLUDE_SRC_FILE_REGEX.match(line)\n        if m:\n          # It's '#include \"src/foo\"' - let's process it recursively.\n          ProcessFile(m.group(1))\n        else:\n          output_file.write(line)\n\n  ProcessFile(GTEST_ALL_CC_SEED)\n\n\ndef FuseGTestAllCc(gtest_root, output_dir):\n  \"\"\"Scans folder gtest_root to generate gtest/gtest-all.cc in output_dir.\"\"\"\n\n  output_file = open(os.path.join(output_dir, GTEST_ALL_CC_OUTPUT), 'w')\n  FuseGTestAllCcToFile(gtest_root, output_file)\n  output_file.close()\n\n\ndef FuseGTest(gtest_root, output_dir):\n  \"\"\"Fuses gtest.h and gtest-all.cc.\"\"\"\n\n  ValidateGTestRootDir(gtest_root)\n  ValidateOutputDir(output_dir)\n\n  FuseGTestH(gtest_root, output_dir)\n  FuseGTestAllCc(gtest_root, output_dir)\n\n\ndef main():\n  argc = len(sys.argv)\n  if argc == 2:\n    # fuse_gtest_files.py OUTPUT_DIR\n    FuseGTest(DEFAULT_GTEST_ROOT_DIR, sys.argv[1])\n  elif argc == 3:\n    # fuse_gtest_files.py GTEST_ROOT_DIR OUTPUT_DIR\n    FuseGTest(sys.argv[1], sys.argv[2])\n  else:\n    print(__doc__)\n    sys.exit(1)\n\n\nif __name__ == '__main__':\n  main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/scripts/gen_gtest_pred_impl.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"gen_gtest_pred_impl.py v0.1\n\nGenerates the implementation of Google Test predicate assertions and\naccompanying tests.\n\nUsage:\n\n  gen_gtest_pred_impl.py MAX_ARITY\n\nwhere MAX_ARITY is a positive integer.\n\nThe command generates the implementation of up-to MAX_ARITY-ary\npredicate assertions, and writes it to file gtest_pred_impl.h in the\ndirectory where the script is.  It also generates the accompanying\nunit test in file gtest_pred_impl_unittest.cc.\n\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport sys\nimport time\n\n# Where this script is.\nSCRIPT_DIR = os.path.dirname(sys.argv[0])\n\n# Where to store the generated header.\nHEADER = os.path.join(SCRIPT_DIR, '../include/gtest/gtest_pred_impl.h')\n\n# Where to store the generated unit test.\nUNIT_TEST = os.path.join(SCRIPT_DIR, '../test/gtest_pred_impl_unittest.cc')\n\n\ndef HeaderPreamble(n):\n  \"\"\"Returns the preamble for the header file.\n\n  Args:\n    n:  the maximum arity of the predicate macros to be generated.\n  \"\"\"\n\n  # A map that defines the values used in the preamble template.\n  DEFS = {\n    'today' : time.strftime('%m/%d/%Y'),\n    'year' : time.strftime('%Y'),\n    'command' : '%s %s' % (os.path.basename(sys.argv[0]), n),\n    'n' : n\n    }\n\n  return (\n\"\"\"// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// This file is AUTOMATICALLY GENERATED on %(today)s by command\n// '%(command)s'.  DO NOT EDIT BY HAND!\n//\n// Implements a family of generic predicate assertion macros.\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n\n#include \"gtest/gtest.h\"\n\nnamespace testing {\n\n// This header implements a family of generic predicate assertion\n// macros:\n//\n//   ASSERT_PRED_FORMAT1(pred_format, v1)\n//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)\n//   ...\n//\n// where pred_format is a function or functor that takes n (in the\n// case of ASSERT_PRED_FORMATn) values and their source expression\n// text, and returns a testing::AssertionResult.  See the definition\n// of ASSERT_EQ in gtest.h for an example.\n//\n// If you don't care about formatting, you can use the more\n// restrictive version:\n//\n//   ASSERT_PRED1(pred, v1)\n//   ASSERT_PRED2(pred, v1, v2)\n//   ...\n//\n// where pred is an n-ary function or functor that returns bool,\n// and the values v1, v2, ..., must support the << operator for\n// streaming to std::ostream.\n//\n// We also define the EXPECT_* variations.\n//\n// For now we only support predicates whose arity is at most %(n)s.\n// Please email googletestframework@googlegroups.com if you need\n// support for higher arities.\n\n// GTEST_ASSERT_ is the basic statement to which all of the assertions\n// in this file reduce.  Don't use this in your code.\n\n#define GTEST_ASSERT_(expression, on_failure) \\\\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\\\n  if (const ::testing::AssertionResult gtest_ar = (expression)) \\\\\n    ; \\\\\n  else \\\\\n    on_failure(gtest_ar.failure_message())\n\"\"\" % DEFS)\n\n\ndef Arity(n):\n  \"\"\"Returns the English name of the given arity.\"\"\"\n\n  if n < 0:\n    return None\n  elif n <= 3:\n    return ['nullary', 'unary', 'binary', 'ternary'][n]\n  else:\n    return '%s-ary' % n\n\n\ndef Title(word):\n  \"\"\"Returns the given word in title case.  The difference between\n  this and string's title() method is that Title('4-ary') is '4-ary'\n  while '4-ary'.title() is '4-Ary'.\"\"\"\n\n  return word[0].upper() + word[1:]\n\n\ndef OneTo(n):\n  \"\"\"Returns the list [1, 2, 3, ..., n].\"\"\"\n\n  return range(1, n + 1)\n\n\ndef Iter(n, format, sep=''):\n  \"\"\"Given a positive integer n, a format string that contains 0 or\n  more '%s' format specs, and optionally a separator string, returns\n  the join of n strings, each formatted with the format string on an\n  iterator ranged from 1 to n.\n\n  Example:\n\n  Iter(3, 'v%s', sep=', ') returns 'v1, v2, v3'.\n  \"\"\"\n\n  # How many '%s' specs are in format?\n  spec_count = len(format.split('%s')) - 1\n  return sep.join([format % (spec_count * (i,)) for i in OneTo(n)])\n\n\ndef ImplementationForArity(n):\n  \"\"\"Returns the implementation of n-ary predicate assertions.\"\"\"\n\n  # A map the defines the values used in the implementation template.\n  DEFS = {\n    'n' : str(n),\n    'vs' : Iter(n, 'v%s', sep=', '),\n    'vts' : Iter(n, '#v%s', sep=', '),\n    'arity' : Arity(n),\n    'Arity' : Title(Arity(n))\n    }\n\n  impl = \"\"\"\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED%(n)s.  Don't use\n// this in your code.\ntemplate <typename Pred\"\"\" % DEFS\n\n  impl += Iter(n, \"\"\",\n          typename T%s\"\"\")\n\n  impl += \"\"\">\nAssertionResult AssertPred%(n)sHelper(const char* pred_text\"\"\" % DEFS\n\n  impl += Iter(n, \"\"\",\n                                  const char* e%s\"\"\")\n\n  impl += \"\"\",\n                                  Pred pred\"\"\"\n\n  impl += Iter(n, \"\"\",\n                                  const T%s& v%s\"\"\")\n\n  impl += \"\"\") {\n  if (pred(%(vs)s)) return AssertionSuccess();\n\n\"\"\" % DEFS\n\n  impl += '  return AssertionFailure() << pred_text << \"(\"'\n\n  impl += Iter(n, \"\"\"\n                            << e%s\"\"\", sep=' << \", \"')\n\n  impl += ' << \") evaluates to false, where\"'\n\n  impl += Iter(n, \"\"\"\n                            << \"\\\\n\" << e%s << \" evaluates to \" << v%s\"\"\")\n\n  impl += \"\"\";\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT%(n)s.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, on_failure)\\\\\n  GTEST_ASSERT_(pred_format(%(vts)s, %(vs)s), \\\\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED%(n)s.  Don't use\n// this in your code.\n#define GTEST_PRED%(n)s_(pred, %(vs)s, on_failure)\\\\\n  GTEST_ASSERT_(::testing::AssertPred%(n)sHelper(#pred\"\"\" % DEFS\n\n  impl += Iter(n, \"\"\", \\\\\n                                             #v%s\"\"\")\n\n  impl += \"\"\", \\\\\n                                             pred\"\"\"\n\n  impl += Iter(n, \"\"\", \\\\\n                                             v%s\"\"\")\n\n  impl += \"\"\"), on_failure)\n\n// %(Arity)s predicate assertion macros.\n#define EXPECT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\\\\n  GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED%(n)s(pred, %(vs)s) \\\\\n  GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\\\\n  GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED%(n)s(pred, %(vs)s) \\\\\n  GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_FATAL_FAILURE_)\n\n\"\"\" % DEFS\n\n  return impl\n\n\ndef HeaderPostamble():\n  \"\"\"Returns the postamble for the header file.\"\"\"\n\n  return \"\"\"\n\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n\"\"\"\n\n\ndef GenerateFile(path, content):\n  \"\"\"Given a file path and a content string\n     overwrites it with the given content.\n  \"\"\"\n  print 'Updating file %s . . .' % path\n  f = file(path, 'w+')\n  print >>f, content,\n  f.close()\n\n  print 'File %s has been updated.' % path\n\n\ndef GenerateHeader(n):\n  \"\"\"Given the maximum arity n, updates the header file that implements\n  the predicate assertions.\n  \"\"\"\n  GenerateFile(HEADER,\n               HeaderPreamble(n)\n               + ''.join([ImplementationForArity(i) for i in OneTo(n)])\n               + HeaderPostamble())\n\n\ndef UnitTestPreamble():\n  \"\"\"Returns the preamble for the unit test file.\"\"\"\n\n  # A map that defines the values used in the preamble template.\n  DEFS = {\n    'today' : time.strftime('%m/%d/%Y'),\n    'year' : time.strftime('%Y'),\n    'command' : '%s %s' % (os.path.basename(sys.argv[0]), sys.argv[1]),\n    }\n\n  return (\n\"\"\"// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// This file is AUTOMATICALLY GENERATED on %(today)s by command\n// '%(command)s'.  DO NOT EDIT BY HAND!\n\n// Regression test for gtest_pred_impl.h\n//\n// This file is generated by a script and quite long.  If you intend to\n// learn how Google Test works by reading its unit tests, read\n// gtest_unittest.cc instead.\n//\n// This is intended as a regression test for the Google Test predicate\n// assertions.  We compile it as part of the gtest_unittest target\n// only to keep the implementation tidy and compact, as it is quite\n// involved to set up the stage for testing Google Test using Google\n// Test itself.\n//\n// Currently, gtest_unittest takes ~11 seconds to run in the testing\n// daemon.  In the future, if it grows too large and needs much more\n// time to finish, we should consider separating this file into a\n// stand-alone regression test.\n\n#include <iostream>\n\n#include \"gtest/gtest.h\"\n#include \"gtest/gtest-spi.h\"\n\n// A user-defined data type.\nstruct Bool {\n  explicit Bool(int val) : value(val != 0) {}\n\n  bool operator>(int n) const { return value > Bool(n).value; }\n\n  Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); }\n\n  bool operator==(const Bool& rhs) const { return value == rhs.value; }\n\n  bool value;\n};\n\n// Enables Bool to be used in assertions.\nstd::ostream& operator<<(std::ostream& os, const Bool& x) {\n  return os << (x.value ? \"true\" : \"false\");\n}\n\n\"\"\" % DEFS)\n\n\ndef TestsForArity(n):\n  \"\"\"Returns the tests for n-ary predicate assertions.\"\"\"\n\n  # A map that defines the values used in the template for the tests.\n  DEFS = {\n    'n' : n,\n    'es' : Iter(n, 'e%s', sep=', '),\n    'vs' : Iter(n, 'v%s', sep=', '),\n    'vts' : Iter(n, '#v%s', sep=', '),\n    'tvs' : Iter(n, 'T%s v%s', sep=', '),\n    'int_vs' : Iter(n, 'int v%s', sep=', '),\n    'Bool_vs' : Iter(n, 'Bool v%s', sep=', '),\n    'types' : Iter(n, 'typename T%s', sep=', '),\n    'v_sum' : Iter(n, 'v%s', sep=' + '),\n    'arity' : Arity(n),\n    'Arity' : Title(Arity(n)),\n    }\n\n  tests = (\n\"\"\"// Sample functions/functors for testing %(arity)s predicate assertions.\n\n// A %(arity)s predicate function.\ntemplate <%(types)s>\nbool PredFunction%(n)s(%(tvs)s) {\n  return %(v_sum)s > 0;\n}\n\n// The following two functions are needed to circumvent a bug in\n// gcc 2.95.3, which sometimes has problem with the above template\n// function.\nbool PredFunction%(n)sInt(%(int_vs)s) {\n  return %(v_sum)s > 0;\n}\nbool PredFunction%(n)sBool(%(Bool_vs)s) {\n  return %(v_sum)s > 0;\n}\n\"\"\" % DEFS)\n\n  tests += \"\"\"\n// A %(arity)s predicate functor.\nstruct PredFunctor%(n)s {\n  template <%(types)s>\n  bool operator()(\"\"\" % DEFS\n\n  tests += Iter(n, 'const T%s& v%s', sep=\"\"\",\n                  \"\"\")\n\n  tests += \"\"\") {\n    return %(v_sum)s > 0;\n  }\n};\n\"\"\" % DEFS\n\n  tests += \"\"\"\n// A %(arity)s predicate-formatter function.\ntemplate <%(types)s>\ntesting::AssertionResult PredFormatFunction%(n)s(\"\"\" % DEFS\n\n  tests += Iter(n, 'const char* e%s', sep=\"\"\",\n                                             \"\"\")\n\n  tests += Iter(n, \"\"\",\n                                             const T%s& v%s\"\"\")\n\n  tests += \"\"\") {\n  if (PredFunction%(n)s(%(vs)s))\n    return testing::AssertionSuccess();\n\n  return testing::AssertionFailure()\n      << \"\"\" % DEFS\n\n  tests += Iter(n, 'e%s', sep=' << \" + \" << ')\n\n  tests += \"\"\"\n      << \" is expected to be positive, but evaluates to \"\n      << %(v_sum)s << \".\";\n}\n\"\"\" % DEFS\n\n  tests += \"\"\"\n// A %(arity)s predicate-formatter functor.\nstruct PredFormatFunctor%(n)s {\n  template <%(types)s>\n  testing::AssertionResult operator()(\"\"\" % DEFS\n\n  tests += Iter(n, 'const char* e%s', sep=\"\"\",\n                                      \"\"\")\n\n  tests += Iter(n, \"\"\",\n                                      const T%s& v%s\"\"\")\n\n  tests += \"\"\") const {\n    return PredFormatFunction%(n)s(%(es)s, %(vs)s);\n  }\n};\n\"\"\" % DEFS\n\n  tests += \"\"\"\n// Tests for {EXPECT|ASSERT}_PRED_FORMAT%(n)s.\n\nclass Predicate%(n)sTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    expected_to_finish_ = true;\n    finished_ = false;\"\"\" % DEFS\n\n  tests += \"\"\"\n    \"\"\" + Iter(n, 'n%s_ = ') + \"\"\"0;\n  }\n\"\"\"\n\n  tests += \"\"\"\n  virtual void TearDown() {\n    // Verifies that each of the predicate's arguments was evaluated\n    // exactly once.\"\"\"\n\n  tests += ''.join([\"\"\"\n    EXPECT_EQ(1, n%s_) <<\n        \"The predicate assertion didn't evaluate argument %s \"\n        \"exactly once.\";\"\"\" % (i, i + 1) for i in OneTo(n)])\n\n  tests += \"\"\"\n\n    // Verifies that the control flow in the test function is expected.\n    if (expected_to_finish_ && !finished_) {\n      FAIL() << \"The predicate assertion unexpactedly aborted the test.\";\n    } else if (!expected_to_finish_ && finished_) {\n      FAIL() << \"The failed predicate assertion didn't abort the test \"\n                \"as expected.\";\n    }\n  }\n\n  // true iff the test function is expected to run to finish.\n  static bool expected_to_finish_;\n\n  // true iff the test function did run to finish.\n  static bool finished_;\n\"\"\" % DEFS\n\n  tests += Iter(n, \"\"\"\n  static int n%s_;\"\"\")\n\n  tests += \"\"\"\n};\n\nbool Predicate%(n)sTest::expected_to_finish_;\nbool Predicate%(n)sTest::finished_;\n\"\"\" % DEFS\n\n  tests += Iter(n, \"\"\"int Predicate%%(n)sTest::n%s_;\n\"\"\") % DEFS\n\n  tests += \"\"\"\ntypedef Predicate%(n)sTest EXPECT_PRED_FORMAT%(n)sTest;\ntypedef Predicate%(n)sTest ASSERT_PRED_FORMAT%(n)sTest;\ntypedef Predicate%(n)sTest EXPECT_PRED%(n)sTest;\ntypedef Predicate%(n)sTest ASSERT_PRED%(n)sTest;\n\"\"\" % DEFS\n\n  def GenTest(use_format, use_assert, expect_failure,\n              use_functor, use_user_type):\n    \"\"\"Returns the test for a predicate assertion macro.\n\n    Args:\n      use_format:     true iff the assertion is a *_PRED_FORMAT*.\n      use_assert:     true iff the assertion is a ASSERT_*.\n      expect_failure: true iff the assertion is expected to fail.\n      use_functor:    true iff the first argument of the assertion is\n                      a functor (as opposed to a function)\n      use_user_type:  true iff the predicate functor/function takes\n                      argument(s) of a user-defined type.\n\n    Example:\n\n      GenTest(1, 0, 0, 1, 0) returns a test that tests the behavior\n      of a successful EXPECT_PRED_FORMATn() that takes a functor\n      whose arguments have built-in types.\"\"\"\n\n    if use_assert:\n      assrt = 'ASSERT'  # 'assert' is reserved, so we cannot use\n                        # that identifier here.\n    else:\n      assrt = 'EXPECT'\n\n    assertion = assrt + '_PRED'\n\n    if use_format:\n      pred_format = 'PredFormat'\n      assertion += '_FORMAT'\n    else:\n      pred_format = 'Pred'\n\n    assertion += '%(n)s' % DEFS\n\n    if use_functor:\n      pred_format_type = 'functor'\n      pred_format += 'Functor%(n)s()'\n    else:\n      pred_format_type = 'function'\n      pred_format += 'Function%(n)s'\n      if not use_format:\n        if use_user_type:\n          pred_format += 'Bool'\n        else:\n          pred_format += 'Int'\n\n    test_name = pred_format_type.title()\n\n    if use_user_type:\n      arg_type = 'user-defined type (Bool)'\n      test_name += 'OnUserType'\n      if expect_failure:\n        arg = 'Bool(n%s_++)'\n      else:\n        arg = 'Bool(++n%s_)'\n    else:\n      arg_type = 'built-in type (int)'\n      test_name += 'OnBuiltInType'\n      if expect_failure:\n        arg = 'n%s_++'\n      else:\n        arg = '++n%s_'\n\n    if expect_failure:\n      successful_or_failed = 'failed'\n      expected_or_not = 'expected.'\n      test_name +=  'Failure'\n    else:\n      successful_or_failed = 'successful'\n      expected_or_not = 'UNEXPECTED!'\n      test_name +=  'Success'\n\n    # A map that defines the values used in the test template.\n    defs = DEFS.copy()\n    defs.update({\n      'assert' : assrt,\n      'assertion' : assertion,\n      'test_name' : test_name,\n      'pf_type' : pred_format_type,\n      'pf' : pred_format,\n      'arg_type' : arg_type,\n      'arg' : arg,\n      'successful' : successful_or_failed,\n      'expected' : expected_or_not,\n      })\n\n    test = \"\"\"\n// Tests a %(successful)s %(assertion)s where the\n// predicate-formatter is a %(pf_type)s on a %(arg_type)s.\nTEST_F(%(assertion)sTest, %(test_name)s) {\"\"\" % defs\n\n    indent = (len(assertion) + 3)*' '\n    extra_indent = ''\n\n    if expect_failure:\n      extra_indent = '  '\n      if use_assert:\n        test += \"\"\"\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\"\"\"\n      else:\n        test += \"\"\"\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\"\"\"\n\n    test += '\\n' + extra_indent + \"\"\"  %(assertion)s(%(pf)s\"\"\" % defs\n\n    test = test % defs\n    test += Iter(n, ',\\n' + indent + extra_indent + '%(arg)s' % defs)\n    test += ');\\n' + extra_indent + '  finished_ = true;\\n'\n\n    if expect_failure:\n      test += '  }, \"\");\\n'\n\n    test += '}\\n'\n    return test\n\n  # Generates tests for all 2**6 = 64 combinations.\n  tests += ''.join([GenTest(use_format, use_assert, expect_failure,\n                            use_functor, use_user_type)\n                    for use_format in [0, 1]\n                    for use_assert in [0, 1]\n                    for expect_failure in [0, 1]\n                    for use_functor in [0, 1]\n                    for use_user_type in [0, 1]\n                    ])\n\n  return tests\n\n\ndef UnitTestPostamble():\n  \"\"\"Returns the postamble for the tests.\"\"\"\n\n  return ''\n\n\ndef GenerateUnitTest(n):\n  \"\"\"Returns the tests for up-to n-ary predicate assertions.\"\"\"\n\n  GenerateFile(UNIT_TEST,\n               UnitTestPreamble()\n               + ''.join([TestsForArity(i) for i in OneTo(n)])\n               + UnitTestPostamble())\n\n\ndef _Main():\n  \"\"\"The entry point of the script.  Generates the header file and its\n  unit test.\"\"\"\n\n  if len(sys.argv) != 2:\n    print __doc__\n    print 'Author: ' + __author__\n    sys.exit(1)\n\n  n = int(sys.argv[1])\n  GenerateHeader(n)\n  GenerateUnitTest(n)\n\n\nif __name__ == '__main__':\n  _Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/scripts/gtest-config.in",
    "content": "#!/bin/sh\n\n# These variables are automatically filled in by the configure script.\nname=\"@PACKAGE_TARNAME@\"\nversion=\"@PACKAGE_VERSION@\"\n\nshow_usage()\n{\n  echo \"Usage: gtest-config [OPTIONS...]\"\n}\n\nshow_help()\n{\n  show_usage\n  cat <<\\EOF\n\nThe `gtest-config' script provides access to the necessary compile and linking\nflags to connect with Google C++ Testing Framework, both in a build prior to\ninstallation, and on the system proper after installation. The installation\noverrides may be issued in combination with any other queries, but will only\naffect installation queries if called on a built but not installed gtest. The\ninstallation queries may not be issued with any other types of queries, and\nonly one installation query may be made at a time. The version queries and\ncompiler flag queries may be combined as desired but not mixed. Different\nversion queries are always combined with logical \"and\" semantics, and only the\nlast of any particular query is used while all previous ones ignored. All\nversions must be specified as a sequence of numbers separated by periods.\nCompiler flag queries output the union of the sets of flags when combined.\n\n Examples:\n  gtest-config --min-version=1.0 || echo \"Insufficient Google Test version.\"\n\n  g++ $(gtest-config --cppflags --cxxflags) -o foo.o -c foo.cpp\n  g++ $(gtest-config --ldflags --libs) -o foo foo.o\n\n  # When using a built but not installed Google Test:\n  g++ $(../../my_gtest_build/scripts/gtest-config ...) ...\n\n  # When using an installed Google Test, but with installation overrides:\n  export GTEST_PREFIX=\"/opt\"\n  g++ $(gtest-config --libdir=\"/opt/lib64\" ...) ...\n\n Help:\n  --usage                    brief usage information\n  --help                     display this help message\n\n Installation Overrides:\n  --prefix=<dir>             overrides the installation prefix\n  --exec-prefix=<dir>        overrides the executable installation prefix\n  --libdir=<dir>             overrides the library installation prefix\n  --includedir=<dir>         overrides the header file installation prefix\n\n Installation Queries:\n  --prefix                   installation prefix\n  --exec-prefix              executable installation prefix\n  --libdir                   library installation directory\n  --includedir               header file installation directory\n  --version                  the version of the Google Test installation\n\n Version Queries:\n  --min-version=VERSION      return 0 if the version is at least VERSION\n  --exact-version=VERSION    return 0 if the version is exactly VERSION\n  --max-version=VERSION      return 0 if the version is at most VERSION\n\n Compilation Flag Queries:\n  --cppflags                 compile flags specific to the C-like preprocessors\n  --cxxflags                 compile flags appropriate for C++ programs\n  --ldflags                  linker flags\n  --libs                     libraries for linking\n\nEOF\n}\n\n# This function bounds our version with a min and a max. It uses some clever\n# POSIX-compliant variable expansion to portably do all the work in the shell\n# and avoid any dependency on a particular \"sed\" or \"awk\" implementation.\n# Notable is that it will only ever compare the first 3 components of versions.\n# Further components will be cleanly stripped off. All versions must be\n# unadorned, so \"v1.0\" will *not* work. The minimum version must be in $1, and\n# the max in $2. TODO(chandlerc@google.com): If this ever breaks, we should\n# investigate expanding this via autom4te from AS_VERSION_COMPARE rather than\n# continuing to maintain our own shell version.\ncheck_versions()\n{\n  major_version=${version%%.*}\n  minor_version=\"0\"\n  point_version=\"0\"\n  if test \"${version#*.}\" != \"${version}\"; then\n    minor_version=${version#*.}\n    minor_version=${minor_version%%.*}\n  fi\n  if test \"${version#*.*.}\" != \"${version}\"; then\n    point_version=${version#*.*.}\n    point_version=${point_version%%.*}\n  fi\n\n  min_version=\"$1\"\n  min_major_version=${min_version%%.*}\n  min_minor_version=\"0\"\n  min_point_version=\"0\"\n  if test \"${min_version#*.}\" != \"${min_version}\"; then\n    min_minor_version=${min_version#*.}\n    min_minor_version=${min_minor_version%%.*}\n  fi\n  if test \"${min_version#*.*.}\" != \"${min_version}\"; then\n    min_point_version=${min_version#*.*.}\n    min_point_version=${min_point_version%%.*}\n  fi\n\n  max_version=\"$2\"\n  max_major_version=${max_version%%.*}\n  max_minor_version=\"0\"\n  max_point_version=\"0\"\n  if test \"${max_version#*.}\" != \"${max_version}\"; then\n    max_minor_version=${max_version#*.}\n    max_minor_version=${max_minor_version%%.*}\n  fi\n  if test \"${max_version#*.*.}\" != \"${max_version}\"; then\n    max_point_version=${max_version#*.*.}\n    max_point_version=${max_point_version%%.*}\n  fi\n\n  test $(($major_version)) -lt $(($min_major_version)) && exit 1\n  if test $(($major_version)) -eq $(($min_major_version)); then\n    test $(($minor_version)) -lt $(($min_minor_version)) && exit 1\n    if test $(($minor_version)) -eq $(($min_minor_version)); then\n      test $(($point_version)) -lt $(($min_point_version)) && exit 1\n    fi\n  fi\n\n  test $(($major_version)) -gt $(($max_major_version)) && exit 1\n  if test $(($major_version)) -eq $(($max_major_version)); then\n    test $(($minor_version)) -gt $(($max_minor_version)) && exit 1\n    if test $(($minor_version)) -eq $(($max_minor_version)); then\n      test $(($point_version)) -gt $(($max_point_version)) && exit 1\n    fi\n  fi\n\n  exit 0\n}\n\n# Show the usage line when no arguments are specified.\nif test $# -eq 0; then\n  show_usage\n  exit 1\nfi\n\nwhile test $# -gt 0; do\n  case $1 in\n    --usage)          show_usage;         exit 0;;\n    --help)           show_help;          exit 0;;\n\n    # Installation overrides\n    --prefix=*)       GTEST_PREFIX=${1#--prefix=};;\n    --exec-prefix=*)  GTEST_EXEC_PREFIX=${1#--exec-prefix=};;\n    --libdir=*)       GTEST_LIBDIR=${1#--libdir=};;\n    --includedir=*)   GTEST_INCLUDEDIR=${1#--includedir=};;\n\n    # Installation queries\n    --prefix|--exec-prefix|--libdir|--includedir|--version)\n      if test -n \"${do_query}\"; then\n        show_usage\n        exit 1\n      fi\n      do_query=${1#--}\n      ;;\n\n    # Version checking\n    --min-version=*)\n      do_check_versions=yes\n      min_version=${1#--min-version=}\n      ;;\n    --max-version=*)\n      do_check_versions=yes\n      max_version=${1#--max-version=}\n      ;;\n    --exact-version=*)\n      do_check_versions=yes\n      exact_version=${1#--exact-version=}\n      ;;\n\n    # Compiler flag output\n    --cppflags)       echo_cppflags=yes;;\n    --cxxflags)       echo_cxxflags=yes;;\n    --ldflags)        echo_ldflags=yes;;\n    --libs)           echo_libs=yes;;\n\n    # Everything else is an error\n    *)                show_usage;         exit 1;;\n  esac\n  shift\ndone\n\n# These have defaults filled in by the configure script but can also be\n# overridden by environment variables or command line parameters.\nprefix=\"${GTEST_PREFIX:-@prefix@}\"\nexec_prefix=\"${GTEST_EXEC_PREFIX:-@exec_prefix@}\"\nlibdir=\"${GTEST_LIBDIR:-@libdir@}\"\nincludedir=\"${GTEST_INCLUDEDIR:-@includedir@}\"\n\n# We try and detect if our binary is not located at its installed location. If\n# it's not, we provide variables pointing to the source and build tree rather\n# than to the install tree. This allows building against a just-built gtest\n# rather than an installed gtest.\nbindir=\"@bindir@\"\nthis_relative_bindir=`dirname $0`\nthis_bindir=`cd ${this_relative_bindir}; pwd -P`\nif test \"${this_bindir}\" = \"${this_bindir%${bindir}}\"; then\n  # The path to the script doesn't end in the bindir sequence from Autoconf,\n  # assume that we are in a build tree.\n  build_dir=`dirname ${this_bindir}`\n  src_dir=`cd ${this_bindir}; cd @top_srcdir@; pwd -P`\n\n  # TODO(chandlerc@google.com): This is a dangerous dependency on libtool, we\n  # should work to remove it, and/or remove libtool altogether, replacing it\n  # with direct references to the library and a link path.\n  gtest_libs=\"${build_dir}/lib/libgtest.la @PTHREAD_CFLAGS@ @PTHREAD_LIBS@\"\n  gtest_ldflags=\"\"\n\n  # We provide hooks to include from either the source or build dir, where the\n  # build dir is always preferred. This will potentially allow us to write\n  # build rules for generated headers and have them automatically be preferred\n  # over provided versions.\n  gtest_cppflags=\"-I${build_dir}/include -I${src_dir}/include\"\n  gtest_cxxflags=\"@PTHREAD_CFLAGS@\"\nelse\n  # We're using an installed gtest, although it may be staged under some\n  # prefix. Assume (as our own libraries do) that we can resolve the prefix,\n  # and are present in the dynamic link paths.\n  gtest_ldflags=\"-L${libdir}\"\n  gtest_libs=\"-l${name} @PTHREAD_CFLAGS@ @PTHREAD_LIBS@\"\n  gtest_cppflags=\"-I${includedir}\"\n  gtest_cxxflags=\"@PTHREAD_CFLAGS@\"\nfi\n\n# Do an installation query if requested.\nif test -n \"$do_query\"; then\n  case $do_query in\n    prefix)           echo $prefix;       exit 0;;\n    exec-prefix)      echo $exec_prefix;  exit 0;;\n    libdir)           echo $libdir;       exit 0;;\n    includedir)       echo $includedir;   exit 0;;\n    version)          echo $version;      exit 0;;\n    *)                show_usage;         exit 1;;\n  esac\nfi\n\n# Do a version check if requested.\nif test \"$do_check_versions\" = \"yes\"; then\n  # Make sure we didn't receive a bad combination of parameters.\n  test \"$echo_cppflags\" = \"yes\" && show_usage && exit 1\n  test \"$echo_cxxflags\" = \"yes\" && show_usage && exit 1\n  test \"$echo_ldflags\" = \"yes\"  && show_usage && exit 1\n  test \"$echo_libs\" = \"yes\"     && show_usage && exit 1\n\n  if test \"$exact_version\" != \"\"; then\n    check_versions $exact_version $exact_version\n    # unreachable\n  else\n    check_versions ${min_version:-0.0.0} ${max_version:-9999.9999.9999}\n    # unreachable\n  fi\nfi\n\n# Do the output in the correct order so that these can be used in-line of\n# a compiler invocation.\noutput=\"\"\ntest \"$echo_cppflags\" = \"yes\" && output=\"$output $gtest_cppflags\"\ntest \"$echo_cxxflags\" = \"yes\" && output=\"$output $gtest_cxxflags\"\ntest \"$echo_ldflags\" = \"yes\"  && output=\"$output $gtest_ldflags\"\ntest \"$echo_libs\" = \"yes\"     && output=\"$output $gtest_libs\"\necho $output\n\nexit 0\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/scripts/pump.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"pump v0.2.0 - Pretty Useful for Meta Programming.\n\nA tool for preprocessor meta programming.  Useful for generating\nrepetitive boilerplate code.  Especially useful for writing C++\nclasses, functions, macros, and templates that need to work with\nvarious number of arguments.\n\nUSAGE:\n       pump.py SOURCE_FILE\n\nEXAMPLES:\n       pump.py foo.cc.pump\n         Converts foo.cc.pump to foo.cc.\n\nGRAMMAR:\n       CODE ::= ATOMIC_CODE*\n       ATOMIC_CODE ::= $var ID = EXPRESSION\n           | $var ID = [[ CODE ]]\n           | $range ID EXPRESSION..EXPRESSION\n           | $for ID SEPARATOR [[ CODE ]]\n           | $($)\n           | $ID\n           | $(EXPRESSION)\n           | $if EXPRESSION [[ CODE ]] ELSE_BRANCH\n           | [[ CODE ]]\n           | RAW_CODE\n       SEPARATOR ::= RAW_CODE | EMPTY\n       ELSE_BRANCH ::= $else [[ CODE ]]\n           | $elif EXPRESSION [[ CODE ]] ELSE_BRANCH\n           | EMPTY\n       EXPRESSION has Python syntax.\n\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport re\nimport sys\n\n\nTOKEN_TABLE = [\n    (re.compile(r'\\$var\\s+'), '$var'),\n    (re.compile(r'\\$elif\\s+'), '$elif'),\n    (re.compile(r'\\$else\\s+'), '$else'),\n    (re.compile(r'\\$for\\s+'), '$for'),\n    (re.compile(r'\\$if\\s+'), '$if'),\n    (re.compile(r'\\$range\\s+'), '$range'),\n    (re.compile(r'\\$[_A-Za-z]\\w*'), '$id'),\n    (re.compile(r'\\$\\(\\$\\)'), '$($)'),\n    (re.compile(r'\\$'), '$'),\n    (re.compile(r'\\[\\[\\n?'), '[['),\n    (re.compile(r'\\]\\]\\n?'), ']]'),\n    ]\n\n\nclass Cursor:\n  \"\"\"Represents a position (line and column) in a text file.\"\"\"\n\n  def __init__(self, line=-1, column=-1):\n    self.line = line\n    self.column = column\n\n  def __eq__(self, rhs):\n    return self.line == rhs.line and self.column == rhs.column\n\n  def __ne__(self, rhs):\n    return not self == rhs\n\n  def __lt__(self, rhs):\n    return self.line < rhs.line or (\n        self.line == rhs.line and self.column < rhs.column)\n\n  def __le__(self, rhs):\n    return self < rhs or self == rhs\n\n  def __gt__(self, rhs):\n    return rhs < self\n\n  def __ge__(self, rhs):\n    return rhs <= self\n\n  def __str__(self):\n    if self == Eof():\n      return 'EOF'\n    else:\n      return '%s(%s)' % (self.line + 1, self.column)\n\n  def __add__(self, offset):\n    return Cursor(self.line, self.column + offset)\n\n  def __sub__(self, offset):\n    return Cursor(self.line, self.column - offset)\n\n  def Clone(self):\n    \"\"\"Returns a copy of self.\"\"\"\n\n    return Cursor(self.line, self.column)\n\n\n# Special cursor to indicate the end-of-file.\ndef Eof():\n  \"\"\"Returns the special cursor to denote the end-of-file.\"\"\"\n  return Cursor(-1, -1)\n\n\nclass Token:\n  \"\"\"Represents a token in a Pump source file.\"\"\"\n\n  def __init__(self, start=None, end=None, value=None, token_type=None):\n    if start is None:\n      self.start = Eof()\n    else:\n      self.start = start\n    if end is None:\n      self.end = Eof()\n    else:\n      self.end = end\n    self.value = value\n    self.token_type = token_type\n\n  def __str__(self):\n    return 'Token @%s: \\'%s\\' type=%s' % (\n        self.start, self.value, self.token_type)\n\n  def Clone(self):\n    \"\"\"Returns a copy of self.\"\"\"\n\n    return Token(self.start.Clone(), self.end.Clone(), self.value,\n                 self.token_type)\n\n\ndef StartsWith(lines, pos, string):\n  \"\"\"Returns True iff the given position in lines starts with 'string'.\"\"\"\n\n  return lines[pos.line][pos.column:].startswith(string)\n\n\ndef FindFirstInLine(line, token_table):\n  best_match_start = -1\n  for (regex, token_type) in token_table:\n    m = regex.search(line)\n    if m:\n      # We found regex in lines\n      if best_match_start < 0 or m.start() < best_match_start:\n        best_match_start = m.start()\n        best_match_length = m.end() - m.start()\n        best_match_token_type = token_type\n\n  if best_match_start < 0:\n    return None\n\n  return (best_match_start, best_match_length, best_match_token_type)\n\n\ndef FindFirst(lines, token_table, cursor):\n  \"\"\"Finds the first occurrence of any string in strings in lines.\"\"\"\n\n  start = cursor.Clone()\n  cur_line_number = cursor.line\n  for line in lines[start.line:]:\n    if cur_line_number == start.line:\n      line = line[start.column:]\n    m = FindFirstInLine(line, token_table)\n    if m:\n      # We found a regex in line.\n      (start_column, length, token_type) = m\n      if cur_line_number == start.line:\n        start_column += start.column\n      found_start = Cursor(cur_line_number, start_column)\n      found_end = found_start + length\n      return MakeToken(lines, found_start, found_end, token_type)\n    cur_line_number += 1\n  # We failed to find str in lines\n  return None\n\n\ndef SubString(lines, start, end):\n  \"\"\"Returns a substring in lines.\"\"\"\n\n  if end == Eof():\n    end = Cursor(len(lines) - 1, len(lines[-1]))\n\n  if start >= end:\n    return ''\n\n  if start.line == end.line:\n    return lines[start.line][start.column:end.column]\n\n  result_lines = ([lines[start.line][start.column:]] +\n                  lines[start.line + 1:end.line] +\n                  [lines[end.line][:end.column]])\n  return ''.join(result_lines)\n\n\ndef StripMetaComments(str):\n  \"\"\"Strip meta comments from each line in the given string.\"\"\"\n\n  # First, completely remove lines containing nothing but a meta\n  # comment, including the trailing \\n.\n  str = re.sub(r'^\\s*\\$\\$.*\\n', '', str)\n\n  # Then, remove meta comments from contentful lines.\n  return re.sub(r'\\s*\\$\\$.*', '', str)\n\n\ndef MakeToken(lines, start, end, token_type):\n  \"\"\"Creates a new instance of Token.\"\"\"\n\n  return Token(start, end, SubString(lines, start, end), token_type)\n\n\ndef ParseToken(lines, pos, regex, token_type):\n  line = lines[pos.line][pos.column:]\n  m = regex.search(line)\n  if m and not m.start():\n    return MakeToken(lines, pos, pos + m.end(), token_type)\n  else:\n    print 'ERROR: %s expected at %s.' % (token_type, pos)\n    sys.exit(1)\n\n\nID_REGEX = re.compile(r'[_A-Za-z]\\w*')\nEQ_REGEX = re.compile(r'=')\nREST_OF_LINE_REGEX = re.compile(r'.*?(?=$|\\$\\$)')\nOPTIONAL_WHITE_SPACES_REGEX = re.compile(r'\\s*')\nWHITE_SPACE_REGEX = re.compile(r'\\s')\nDOT_DOT_REGEX = re.compile(r'\\.\\.')\n\n\ndef Skip(lines, pos, regex):\n  line = lines[pos.line][pos.column:]\n  m = re.search(regex, line)\n  if m and not m.start():\n    return pos + m.end()\n  else:\n    return pos\n\n\ndef SkipUntil(lines, pos, regex, token_type):\n  line = lines[pos.line][pos.column:]\n  m = re.search(regex, line)\n  if m:\n    return pos + m.start()\n  else:\n    print ('ERROR: %s expected on line %s after column %s.' %\n           (token_type, pos.line + 1, pos.column))\n    sys.exit(1)\n\n\ndef ParseExpTokenInParens(lines, pos):\n  def ParseInParens(pos):\n    pos = Skip(lines, pos, OPTIONAL_WHITE_SPACES_REGEX)\n    pos = Skip(lines, pos, r'\\(')\n    pos = Parse(pos)\n    pos = Skip(lines, pos, r'\\)')\n    return pos\n\n  def Parse(pos):\n    pos = SkipUntil(lines, pos, r'\\(|\\)', ')')\n    if SubString(lines, pos, pos + 1) == '(':\n      pos = Parse(pos + 1)\n      pos = Skip(lines, pos, r'\\)')\n      return Parse(pos)\n    else:\n      return pos\n\n  start = pos.Clone()\n  pos = ParseInParens(pos)\n  return MakeToken(lines, start, pos, 'exp')\n\n\ndef RStripNewLineFromToken(token):\n  if token.value.endswith('\\n'):\n    return Token(token.start, token.end, token.value[:-1], token.token_type)\n  else:\n    return token\n\n\ndef TokenizeLines(lines, pos):\n  while True:\n    found = FindFirst(lines, TOKEN_TABLE, pos)\n    if not found:\n      yield MakeToken(lines, pos, Eof(), 'code')\n      return\n\n    if found.start == pos:\n      prev_token = None\n      prev_token_rstripped = None\n    else:\n      prev_token = MakeToken(lines, pos, found.start, 'code')\n      prev_token_rstripped = RStripNewLineFromToken(prev_token)\n\n    if found.token_type == '$var':\n      if prev_token_rstripped:\n        yield prev_token_rstripped\n      yield found\n      id_token = ParseToken(lines, found.end, ID_REGEX, 'id')\n      yield id_token\n      pos = Skip(lines, id_token.end, OPTIONAL_WHITE_SPACES_REGEX)\n\n      eq_token = ParseToken(lines, pos, EQ_REGEX, '=')\n      yield eq_token\n      pos = Skip(lines, eq_token.end, r'\\s*')\n\n      if SubString(lines, pos, pos + 2) != '[[':\n        exp_token = ParseToken(lines, pos, REST_OF_LINE_REGEX, 'exp')\n        yield exp_token\n        pos = Cursor(exp_token.end.line + 1, 0)\n    elif found.token_type == '$for':\n      if prev_token_rstripped:\n        yield prev_token_rstripped\n      yield found\n      id_token = ParseToken(lines, found.end, ID_REGEX, 'id')\n      yield id_token\n      pos = Skip(lines, id_token.end, WHITE_SPACE_REGEX)\n    elif found.token_type == '$range':\n      if prev_token_rstripped:\n        yield prev_token_rstripped\n      yield found\n      id_token = ParseToken(lines, found.end, ID_REGEX, 'id')\n      yield id_token\n      pos = Skip(lines, id_token.end, OPTIONAL_WHITE_SPACES_REGEX)\n\n      dots_pos = SkipUntil(lines, pos, DOT_DOT_REGEX, '..')\n      yield MakeToken(lines, pos, dots_pos, 'exp')\n      yield MakeToken(lines, dots_pos, dots_pos + 2, '..')\n      pos = dots_pos + 2\n      new_pos = Cursor(pos.line + 1, 0)\n      yield MakeToken(lines, pos, new_pos, 'exp')\n      pos = new_pos\n    elif found.token_type == '$':\n      if prev_token:\n        yield prev_token\n      yield found\n      exp_token = ParseExpTokenInParens(lines, found.end)\n      yield exp_token\n      pos = exp_token.end\n    elif (found.token_type == ']]' or found.token_type == '$if' or\n          found.token_type == '$elif' or found.token_type == '$else'):\n      if prev_token_rstripped:\n        yield prev_token_rstripped\n      yield found\n      pos = found.end\n    else:\n      if prev_token:\n        yield prev_token\n      yield found\n      pos = found.end\n\n\ndef Tokenize(s):\n  \"\"\"A generator that yields the tokens in the given string.\"\"\"\n  if s != '':\n    lines = s.splitlines(True)\n    for token in TokenizeLines(lines, Cursor(0, 0)):\n      yield token\n\n\nclass CodeNode:\n  def __init__(self, atomic_code_list=None):\n    self.atomic_code = atomic_code_list\n\n\nclass VarNode:\n  def __init__(self, identifier=None, atomic_code=None):\n    self.identifier = identifier\n    self.atomic_code = atomic_code\n\n\nclass RangeNode:\n  def __init__(self, identifier=None, exp1=None, exp2=None):\n    self.identifier = identifier\n    self.exp1 = exp1\n    self.exp2 = exp2\n\n\nclass ForNode:\n  def __init__(self, identifier=None, sep=None, code=None):\n    self.identifier = identifier\n    self.sep = sep\n    self.code = code\n\n\nclass ElseNode:\n  def __init__(self, else_branch=None):\n    self.else_branch = else_branch\n\n\nclass IfNode:\n  def __init__(self, exp=None, then_branch=None, else_branch=None):\n    self.exp = exp\n    self.then_branch = then_branch\n    self.else_branch = else_branch\n\n\nclass RawCodeNode:\n  def __init__(self, token=None):\n    self.raw_code = token\n\n\nclass LiteralDollarNode:\n  def __init__(self, token):\n    self.token = token\n\n\nclass ExpNode:\n  def __init__(self, token, python_exp):\n    self.token = token\n    self.python_exp = python_exp\n\n\ndef PopFront(a_list):\n  head = a_list[0]\n  a_list[:1] = []\n  return head\n\n\ndef PushFront(a_list, elem):\n  a_list[:0] = [elem]\n\n\ndef PopToken(a_list, token_type=None):\n  token = PopFront(a_list)\n  if token_type is not None and token.token_type != token_type:\n    print 'ERROR: %s expected at %s' % (token_type, token.start)\n    print 'ERROR: %s found instead' % (token,)\n    sys.exit(1)\n\n  return token\n\n\ndef PeekToken(a_list):\n  if not a_list:\n    return None\n\n  return a_list[0]\n\n\ndef ParseExpNode(token):\n  python_exp = re.sub(r'([_A-Za-z]\\w*)', r'self.GetValue(\"\\1\")', token.value)\n  return ExpNode(token, python_exp)\n\n\ndef ParseElseNode(tokens):\n  def Pop(token_type=None):\n    return PopToken(tokens, token_type)\n\n  next = PeekToken(tokens)\n  if not next:\n    return None\n  if next.token_type == '$else':\n    Pop('$else')\n    Pop('[[')\n    code_node = ParseCodeNode(tokens)\n    Pop(']]')\n    return code_node\n  elif next.token_type == '$elif':\n    Pop('$elif')\n    exp = Pop('code')\n    Pop('[[')\n    code_node = ParseCodeNode(tokens)\n    Pop(']]')\n    inner_else_node = ParseElseNode(tokens)\n    return CodeNode([IfNode(ParseExpNode(exp), code_node, inner_else_node)])\n  elif not next.value.strip():\n    Pop('code')\n    return ParseElseNode(tokens)\n  else:\n    return None\n\n\ndef ParseAtomicCodeNode(tokens):\n  def Pop(token_type=None):\n    return PopToken(tokens, token_type)\n\n  head = PopFront(tokens)\n  t = head.token_type\n  if t == 'code':\n    return RawCodeNode(head)\n  elif t == '$var':\n    id_token = Pop('id')\n    Pop('=')\n    next = PeekToken(tokens)\n    if next.token_type == 'exp':\n      exp_token = Pop()\n      return VarNode(id_token, ParseExpNode(exp_token))\n    Pop('[[')\n    code_node = ParseCodeNode(tokens)\n    Pop(']]')\n    return VarNode(id_token, code_node)\n  elif t == '$for':\n    id_token = Pop('id')\n    next_token = PeekToken(tokens)\n    if next_token.token_type == 'code':\n      sep_token = next_token\n      Pop('code')\n    else:\n      sep_token = None\n    Pop('[[')\n    code_node = ParseCodeNode(tokens)\n    Pop(']]')\n    return ForNode(id_token, sep_token, code_node)\n  elif t == '$if':\n    exp_token = Pop('code')\n    Pop('[[')\n    code_node = ParseCodeNode(tokens)\n    Pop(']]')\n    else_node = ParseElseNode(tokens)\n    return IfNode(ParseExpNode(exp_token), code_node, else_node)\n  elif t == '$range':\n    id_token = Pop('id')\n    exp1_token = Pop('exp')\n    Pop('..')\n    exp2_token = Pop('exp')\n    return RangeNode(id_token, ParseExpNode(exp1_token),\n                     ParseExpNode(exp2_token))\n  elif t == '$id':\n    return ParseExpNode(Token(head.start + 1, head.end, head.value[1:], 'id'))\n  elif t == '$($)':\n    return LiteralDollarNode(head)\n  elif t == '$':\n    exp_token = Pop('exp')\n    return ParseExpNode(exp_token)\n  elif t == '[[':\n    code_node = ParseCodeNode(tokens)\n    Pop(']]')\n    return code_node\n  else:\n    PushFront(tokens, head)\n    return None\n\n\ndef ParseCodeNode(tokens):\n  atomic_code_list = []\n  while True:\n    if not tokens:\n      break\n    atomic_code_node = ParseAtomicCodeNode(tokens)\n    if atomic_code_node:\n      atomic_code_list.append(atomic_code_node)\n    else:\n      break\n  return CodeNode(atomic_code_list)\n\n\ndef ParseToAST(pump_src_text):\n  \"\"\"Convert the given Pump source text into an AST.\"\"\"\n  tokens = list(Tokenize(pump_src_text))\n  code_node = ParseCodeNode(tokens)\n  return code_node\n\n\nclass Env:\n  def __init__(self):\n    self.variables = []\n    self.ranges = []\n\n  def Clone(self):\n    clone = Env()\n    clone.variables = self.variables[:]\n    clone.ranges = self.ranges[:]\n    return clone\n\n  def PushVariable(self, var, value):\n    # If value looks like an int, store it as an int.\n    try:\n      int_value = int(value)\n      if ('%s' % int_value) == value:\n        value = int_value\n    except Exception:\n      pass\n    self.variables[:0] = [(var, value)]\n\n  def PopVariable(self):\n    self.variables[:1] = []\n\n  def PushRange(self, var, lower, upper):\n    self.ranges[:0] = [(var, lower, upper)]\n\n  def PopRange(self):\n    self.ranges[:1] = []\n\n  def GetValue(self, identifier):\n    for (var, value) in self.variables:\n      if identifier == var:\n        return value\n\n    print 'ERROR: meta variable %s is undefined.' % (identifier,)\n    sys.exit(1)\n\n  def EvalExp(self, exp):\n    try:\n      result = eval(exp.python_exp)\n    except Exception, e:\n      print 'ERROR: caught exception %s: %s' % (e.__class__.__name__, e)\n      print ('ERROR: failed to evaluate meta expression %s at %s' %\n             (exp.python_exp, exp.token.start))\n      sys.exit(1)\n    return result\n\n  def GetRange(self, identifier):\n    for (var, lower, upper) in self.ranges:\n      if identifier == var:\n        return (lower, upper)\n\n    print 'ERROR: range %s is undefined.' % (identifier,)\n    sys.exit(1)\n\n\nclass Output:\n  def __init__(self):\n    self.string = ''\n\n  def GetLastLine(self):\n    index = self.string.rfind('\\n')\n    if index < 0:\n      return ''\n\n    return self.string[index + 1:]\n\n  def Append(self, s):\n    self.string += s\n\n\ndef RunAtomicCode(env, node, output):\n  if isinstance(node, VarNode):\n    identifier = node.identifier.value.strip()\n    result = Output()\n    RunAtomicCode(env.Clone(), node.atomic_code, result)\n    value = result.string\n    env.PushVariable(identifier, value)\n  elif isinstance(node, RangeNode):\n    identifier = node.identifier.value.strip()\n    lower = int(env.EvalExp(node.exp1))\n    upper = int(env.EvalExp(node.exp2))\n    env.PushRange(identifier, lower, upper)\n  elif isinstance(node, ForNode):\n    identifier = node.identifier.value.strip()\n    if node.sep is None:\n      sep = ''\n    else:\n      sep = node.sep.value\n    (lower, upper) = env.GetRange(identifier)\n    for i in range(lower, upper + 1):\n      new_env = env.Clone()\n      new_env.PushVariable(identifier, i)\n      RunCode(new_env, node.code, output)\n      if i != upper:\n        output.Append(sep)\n  elif isinstance(node, RawCodeNode):\n    output.Append(node.raw_code.value)\n  elif isinstance(node, IfNode):\n    cond = env.EvalExp(node.exp)\n    if cond:\n      RunCode(env.Clone(), node.then_branch, output)\n    elif node.else_branch is not None:\n      RunCode(env.Clone(), node.else_branch, output)\n  elif isinstance(node, ExpNode):\n    value = env.EvalExp(node)\n    output.Append('%s' % (value,))\n  elif isinstance(node, LiteralDollarNode):\n    output.Append('$')\n  elif isinstance(node, CodeNode):\n    RunCode(env.Clone(), node, output)\n  else:\n    print 'BAD'\n    print node\n    sys.exit(1)\n\n\ndef RunCode(env, code_node, output):\n  for atomic_code in code_node.atomic_code:\n    RunAtomicCode(env, atomic_code, output)\n\n\ndef IsSingleLineComment(cur_line):\n  return '//' in cur_line\n\n\ndef IsInPreprocessorDirective(prev_lines, cur_line):\n  if cur_line.lstrip().startswith('#'):\n    return True\n  return prev_lines and prev_lines[-1].endswith('\\\\')\n\n\ndef WrapComment(line, output):\n  loc = line.find('//')\n  before_comment = line[:loc].rstrip()\n  if before_comment == '':\n    indent = loc\n  else:\n    output.append(before_comment)\n    indent = len(before_comment) - len(before_comment.lstrip())\n  prefix = indent*' ' + '// '\n  max_len = 80 - len(prefix)\n  comment = line[loc + 2:].strip()\n  segs = [seg for seg in re.split(r'(\\w+\\W*)', comment) if seg != '']\n  cur_line = ''\n  for seg in segs:\n    if len((cur_line + seg).rstrip()) < max_len:\n      cur_line += seg\n    else:\n      if cur_line.strip() != '':\n        output.append(prefix + cur_line.rstrip())\n      cur_line = seg.lstrip()\n  if cur_line.strip() != '':\n    output.append(prefix + cur_line.strip())\n\n\ndef WrapCode(line, line_concat, output):\n  indent = len(line) - len(line.lstrip())\n  prefix = indent*' '  # Prefix of the current line\n  max_len = 80 - indent - len(line_concat)  # Maximum length of the current line\n  new_prefix = prefix + 4*' '  # Prefix of a continuation line\n  new_max_len = max_len - 4  # Maximum length of a continuation line\n  # Prefers to wrap a line after a ',' or ';'.\n  segs = [seg for seg in re.split(r'([^,;]+[,;]?)', line.strip()) if seg != '']\n  cur_line = ''  # The current line without leading spaces.\n  for seg in segs:\n    # If the line is still too long, wrap at a space.\n    while cur_line == '' and len(seg.strip()) > max_len:\n      seg = seg.lstrip()\n      split_at = seg.rfind(' ', 0, max_len)\n      output.append(prefix + seg[:split_at].strip() + line_concat)\n      seg = seg[split_at + 1:]\n      prefix = new_prefix\n      max_len = new_max_len\n\n    if len((cur_line + seg).rstrip()) < max_len:\n      cur_line = (cur_line + seg).lstrip()\n    else:\n      output.append(prefix + cur_line.rstrip() + line_concat)\n      prefix = new_prefix\n      max_len = new_max_len\n      cur_line = seg.lstrip()\n  if cur_line.strip() != '':\n    output.append(prefix + cur_line.strip())\n\n\ndef WrapPreprocessorDirective(line, output):\n  WrapCode(line, ' \\\\', output)\n\n\ndef WrapPlainCode(line, output):\n  WrapCode(line, '', output)\n\n\ndef IsMultiLineIWYUPragma(line):\n  return re.search(r'/\\* IWYU pragma: ', line)\n\n\ndef IsHeaderGuardIncludeOrOneLineIWYUPragma(line):\n  return (re.match(r'^#(ifndef|define|endif\\s*//)\\s*[\\w_]+\\s*$', line) or\n          re.match(r'^#include\\s', line) or\n          # Don't break IWYU pragmas, either; that causes iwyu.py problems.\n          re.search(r'// IWYU pragma: ', line))\n\n\ndef WrapLongLine(line, output):\n  line = line.rstrip()\n  if len(line) <= 80:\n    output.append(line)\n  elif IsSingleLineComment(line):\n    if IsHeaderGuardIncludeOrOneLineIWYUPragma(line):\n      # The style guide made an exception to allow long header guard lines,\n      # includes and IWYU pragmas.\n      output.append(line)\n    else:\n      WrapComment(line, output)\n  elif IsInPreprocessorDirective(output, line):\n    if IsHeaderGuardIncludeOrOneLineIWYUPragma(line):\n      # The style guide made an exception to allow long header guard lines,\n      # includes and IWYU pragmas.\n      output.append(line)\n    else:\n      WrapPreprocessorDirective(line, output)\n  elif IsMultiLineIWYUPragma(line):\n    output.append(line)\n  else:\n    WrapPlainCode(line, output)\n\n\ndef BeautifyCode(string):\n  lines = string.splitlines()\n  output = []\n  for line in lines:\n    WrapLongLine(line, output)\n  output2 = [line.rstrip() for line in output]\n  return '\\n'.join(output2) + '\\n'\n\n\ndef ConvertFromPumpSource(src_text):\n  \"\"\"Return the text generated from the given Pump source text.\"\"\"\n  ast = ParseToAST(StripMetaComments(src_text))\n  output = Output()\n  RunCode(Env(), ast, output)\n  return BeautifyCode(output.string)\n\n\ndef main(argv):\n  if len(argv) == 1:\n    print __doc__\n    sys.exit(1)\n\n  file_path = argv[-1]\n  output_str = ConvertFromPumpSource(file(file_path, 'r').read())\n  if file_path.endswith('.pump'):\n    output_file_path = file_path[:-5]\n  else:\n    output_file_path = '-'\n  if output_file_path == '-':\n    print output_str,\n  else:\n    output_file = file(output_file_path, 'w')\n    output_file.write('// This file was GENERATED by command:\\n')\n    output_file.write('//     %s %s\\n' %\n                      (os.path.basename(__file__), os.path.basename(file_path)))\n    output_file.write('// DO NOT EDIT BY HAND!!!\\n\\n')\n    output_file.write(output_str)\n    output_file.close()\n\n\nif __name__ == '__main__':\n  main(sys.argv)\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/scripts/release_docs.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2013 Google Inc. All Rights Reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Script for branching Google Test/Mock wiki pages for a new version.\n\nSYNOPSIS\n       release_docs.py NEW_RELEASE_VERSION\n\n       Google Test and Google Mock's external user documentation is in\n       interlinked wiki files.  When we release a new version of\n       Google Test or Google Mock, we need to branch the wiki files\n       such that users of a specific version of Google Test/Mock can\n       look up documenation relevant for that version.  This script\n       automates that process by:\n\n         - branching the current wiki pages (which document the\n           behavior of the SVN trunk head) to pages for the specified\n           version (e.g. branching FAQ.wiki to V2_6_FAQ.wiki when\n           NEW_RELEASE_VERSION is 2.6);\n         - updating the links in the branched files to point to the branched\n           version (e.g. a link in V2_6_FAQ.wiki that pointed to\n           Primer.wiki#Anchor will now point to V2_6_Primer.wiki#Anchor).\n\n       NOTE: NEW_RELEASE_VERSION must be a NEW version number for\n       which the wiki pages don't yet exist; otherwise you'll get SVN\n       errors like \"svn: Path 'V1_7_PumpManual.wiki' is not a\n       directory\" when running the script.\n\nEXAMPLE\n       $ cd PATH/TO/GTEST_SVN_WORKSPACE/trunk\n       $ scripts/release_docs.py 2.6  # create wiki pages for v2.6\n       $ svn status                   # verify the file list\n       $ svn diff                     # verify the file contents\n       $ svn commit -m \"release wiki pages for v2.6\"\n\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport re\nimport sys\n\nimport common\n\n\n# Wiki pages that shouldn't be branched for every gtest/gmock release.\nGTEST_UNVERSIONED_WIKIS = ['DevGuide.wiki']\nGMOCK_UNVERSIONED_WIKIS = [\n    'DesignDoc.wiki',\n    'DevGuide.wiki',\n    'KnownIssues.wiki'\n    ]\n\n\ndef DropWikiSuffix(wiki_filename):\n  \"\"\"Removes the .wiki suffix (if any) from the given filename.\"\"\"\n\n  return (wiki_filename[:-len('.wiki')] if wiki_filename.endswith('.wiki')\n          else wiki_filename)\n\n\nclass WikiBrancher(object):\n  \"\"\"Branches ...\"\"\"\n\n  def __init__(self, dot_version):\n    self.project, svn_root_path = common.GetSvnInfo()\n    if self.project not in ('googletest', 'googlemock'):\n      sys.exit('This script must be run in a gtest or gmock SVN workspace.')\n    self.wiki_dir = svn_root_path + '/wiki'\n    # Turn '2.6' to 'V2_6_'.\n    self.version_prefix = 'V' + dot_version.replace('.', '_') + '_'\n    self.files_to_branch = self.GetFilesToBranch()\n    page_names = [DropWikiSuffix(f) for f in self.files_to_branch]\n    # A link to Foo.wiki is in one of the following forms:\n    #   [Foo words]\n    #   [Foo#Anchor words]\n    #   [http://code.google.com/.../wiki/Foo words]\n    #   [http://code.google.com/.../wiki/Foo#Anchor words]\n    # We want to replace 'Foo' with 'V2_6_Foo' in the above cases.\n    self.search_for_re = re.compile(\n        # This regex matches either\n        #   [Foo\n        # or\n        #   /wiki/Foo\n        # followed by a space or a #, where Foo is the name of an\n        # unversioned wiki page.\n        r'(\\[|/wiki/)(%s)([ #])' % '|'.join(page_names))\n    self.replace_with = r'\\1%s\\2\\3' % (self.version_prefix,)\n\n  def GetFilesToBranch(self):\n    \"\"\"Returns a list of .wiki file names that need to be branched.\"\"\"\n\n    unversioned_wikis = (GTEST_UNVERSIONED_WIKIS if self.project == 'googletest'\n                         else GMOCK_UNVERSIONED_WIKIS)\n    return [f for f in os.listdir(self.wiki_dir)\n            if (f.endswith('.wiki') and\n                not re.match(r'^V\\d', f) and  # Excluded versioned .wiki files.\n                f not in unversioned_wikis)]\n\n  def BranchFiles(self):\n    \"\"\"Branches the .wiki files needed to be branched.\"\"\"\n\n    print 'Branching %d .wiki files:' % (len(self.files_to_branch),)\n    os.chdir(self.wiki_dir)\n    for f in self.files_to_branch:\n      command = 'svn cp %s %s%s' % (f, self.version_prefix, f)\n      print command\n      os.system(command)\n\n  def UpdateLinksInBranchedFiles(self):\n\n    for f in self.files_to_branch:\n      source_file = os.path.join(self.wiki_dir, f)\n      versioned_file = os.path.join(self.wiki_dir, self.version_prefix + f)\n      print 'Updating links in %s.' % (versioned_file,)\n      text = file(source_file, 'r').read()\n      new_text = self.search_for_re.sub(self.replace_with, text)\n      file(versioned_file, 'w').write(new_text)\n\n\ndef main():\n  if len(sys.argv) != 2:\n    sys.exit(__doc__)\n\n  brancher = WikiBrancher(sys.argv[1])\n  brancher.BranchFiles()\n  brancher.UpdateLinksInBranchedFiles()\n\n\nif __name__ == '__main__':\n  main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/scripts/upload.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2007 Google Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\"\"\"Tool for uploading diffs from a version control system to the codereview app.\n\nUsage summary: upload.py [options] [-- diff_options]\n\nDiff options are passed to the diff command of the underlying system.\n\nSupported version control systems:\n  Git\n  Mercurial\n  Subversion\n\nIt is important for Git/Mercurial users to specify a tree/node/branch to diff\nagainst by using the '--rev' option.\n\"\"\"\n# This code is derived from appcfg.py in the App Engine SDK (open source),\n# and from ASPN recipe #146306.\n\nimport cookielib\nimport getpass\nimport logging\nimport md5\nimport mimetypes\nimport optparse\nimport os\nimport re\nimport socket\nimport subprocess\nimport sys\nimport urllib\nimport urllib2\nimport urlparse\n\ntry:\n  import readline\nexcept ImportError:\n  pass\n\n# The logging verbosity:\n#  0: Errors only.\n#  1: Status messages.\n#  2: Info logs.\n#  3: Debug logs.\nverbosity = 1\n\n# Max size of patch or base file.\nMAX_UPLOAD_SIZE = 900 * 1024\n\n\ndef GetEmail(prompt):\n  \"\"\"Prompts the user for their email address and returns it.\n\n  The last used email address is saved to a file and offered up as a suggestion\n  to the user. If the user presses enter without typing in anything the last\n  used email address is used. If the user enters a new address, it is saved\n  for next time we prompt.\n\n  \"\"\"\n  last_email_file_name = os.path.expanduser(\"~/.last_codereview_email_address\")\n  last_email = \"\"\n  if os.path.exists(last_email_file_name):\n    try:\n      last_email_file = open(last_email_file_name, \"r\")\n      last_email = last_email_file.readline().strip(\"\\n\")\n      last_email_file.close()\n      prompt += \" [%s]\" % last_email\n    except IOError, e:\n      pass\n  email = raw_input(prompt + \": \").strip()\n  if email:\n    try:\n      last_email_file = open(last_email_file_name, \"w\")\n      last_email_file.write(email)\n      last_email_file.close()\n    except IOError, e:\n      pass\n  else:\n    email = last_email\n  return email\n\n\ndef StatusUpdate(msg):\n  \"\"\"Print a status message to stdout.\n\n  If 'verbosity' is greater than 0, print the message.\n\n  Args:\n    msg: The string to print.\n  \"\"\"\n  if verbosity > 0:\n    print msg\n\n\ndef ErrorExit(msg):\n  \"\"\"Print an error message to stderr and exit.\"\"\"\n  print >>sys.stderr, msg\n  sys.exit(1)\n\n\nclass ClientLoginError(urllib2.HTTPError):\n  \"\"\"Raised to indicate there was an error authenticating with ClientLogin.\"\"\"\n\n  def __init__(self, url, code, msg, headers, args):\n    urllib2.HTTPError.__init__(self, url, code, msg, headers, None)\n    self.args = args\n    self.reason = args[\"Error\"]\n\n\nclass AbstractRpcServer(object):\n  \"\"\"Provides a common interface for a simple RPC server.\"\"\"\n\n  def __init__(self, host, auth_function, host_override=None, extra_headers={},\n               save_cookies=False):\n    \"\"\"Creates a new HttpRpcServer.\n\n    Args:\n      host: The host to send requests to.\n      auth_function: A function that takes no arguments and returns an\n        (email, password) tuple when called. Will be called if authentication\n        is required.\n      host_override: The host header to send to the server (defaults to host).\n      extra_headers: A dict of extra headers to append to every request.\n      save_cookies: If True, save the authentication cookies to local disk.\n        If False, use an in-memory cookiejar instead.  Subclasses must\n        implement this functionality.  Defaults to False.\n    \"\"\"\n    self.host = host\n    self.host_override = host_override\n    self.auth_function = auth_function\n    self.authenticated = False\n    self.extra_headers = extra_headers\n    self.save_cookies = save_cookies\n    self.opener = self._GetOpener()\n    if self.host_override:\n      logging.info(\"Server: %s; Host: %s\", self.host, self.host_override)\n    else:\n      logging.info(\"Server: %s\", self.host)\n\n  def _GetOpener(self):\n    \"\"\"Returns an OpenerDirector for making HTTP requests.\n\n    Returns:\n      A urllib2.OpenerDirector object.\n    \"\"\"\n    raise NotImplementedError()\n\n  def _CreateRequest(self, url, data=None):\n    \"\"\"Creates a new urllib request.\"\"\"\n    logging.debug(\"Creating request for: '%s' with payload:\\n%s\", url, data)\n    req = urllib2.Request(url, data=data)\n    if self.host_override:\n      req.add_header(\"Host\", self.host_override)\n    for key, value in self.extra_headers.iteritems():\n      req.add_header(key, value)\n    return req\n\n  def _GetAuthToken(self, email, password):\n    \"\"\"Uses ClientLogin to authenticate the user, returning an auth token.\n\n    Args:\n      email:    The user's email address\n      password: The user's password\n\n    Raises:\n      ClientLoginError: If there was an error authenticating with ClientLogin.\n      HTTPError: If there was some other form of HTTP error.\n\n    Returns:\n      The authentication token returned by ClientLogin.\n    \"\"\"\n    account_type = \"GOOGLE\"\n    if self.host.endswith(\".google.com\"):\n      # Needed for use inside Google.\n      account_type = \"HOSTED\"\n    req = self._CreateRequest(\n        url=\"https://www.google.com/accounts/ClientLogin\",\n        data=urllib.urlencode({\n            \"Email\": email,\n            \"Passwd\": password,\n            \"service\": \"ah\",\n            \"source\": \"rietveld-codereview-upload\",\n            \"accountType\": account_type,\n        }),\n    )\n    try:\n      response = self.opener.open(req)\n      response_body = response.read()\n      response_dict = dict(x.split(\"=\")\n                           for x in response_body.split(\"\\n\") if x)\n      return response_dict[\"Auth\"]\n    except urllib2.HTTPError, e:\n      if e.code == 403:\n        body = e.read()\n        response_dict = dict(x.split(\"=\", 1) for x in body.split(\"\\n\") if x)\n        raise ClientLoginError(req.get_full_url(), e.code, e.msg,\n                               e.headers, response_dict)\n      else:\n        raise\n\n  def _GetAuthCookie(self, auth_token):\n    \"\"\"Fetches authentication cookies for an authentication token.\n\n    Args:\n      auth_token: The authentication token returned by ClientLogin.\n\n    Raises:\n      HTTPError: If there was an error fetching the authentication cookies.\n    \"\"\"\n    # This is a dummy value to allow us to identify when we're successful.\n    continue_location = \"http://localhost/\"\n    args = {\"continue\": continue_location, \"auth\": auth_token}\n    req = self._CreateRequest(\"http://%s/_ah/login?%s\" %\n                              (self.host, urllib.urlencode(args)))\n    try:\n      response = self.opener.open(req)\n    except urllib2.HTTPError, e:\n      response = e\n    if (response.code != 302 or\n        response.info()[\"location\"] != continue_location):\n      raise urllib2.HTTPError(req.get_full_url(), response.code, response.msg,\n                              response.headers, response.fp)\n    self.authenticated = True\n\n  def _Authenticate(self):\n    \"\"\"Authenticates the user.\n\n    The authentication process works as follows:\n     1) We get a username and password from the user\n     2) We use ClientLogin to obtain an AUTH token for the user\n        (see https://developers.google.com/identity/protocols/AuthForInstalledApps).\n     3) We pass the auth token to /_ah/login on the server to obtain an\n        authentication cookie. If login was successful, it tries to redirect\n        us to the URL we provided.\n\n    If we attempt to access the upload API without first obtaining an\n    authentication cookie, it returns a 401 response and directs us to\n    authenticate ourselves with ClientLogin.\n    \"\"\"\n    for i in range(3):\n      credentials = self.auth_function()\n      try:\n        auth_token = self._GetAuthToken(credentials[0], credentials[1])\n      except ClientLoginError, e:\n        if e.reason == \"BadAuthentication\":\n          print >>sys.stderr, \"Invalid username or password.\"\n          continue\n        if e.reason == \"CaptchaRequired\":\n          print >>sys.stderr, (\n              \"Please go to\\n\"\n              \"https://www.google.com/accounts/DisplayUnlockCaptcha\\n\"\n              \"and verify you are a human.  Then try again.\")\n          break\n        if e.reason == \"NotVerified\":\n          print >>sys.stderr, \"Account not verified.\"\n          break\n        if e.reason == \"TermsNotAgreed\":\n          print >>sys.stderr, \"User has not agreed to TOS.\"\n          break\n        if e.reason == \"AccountDeleted\":\n          print >>sys.stderr, \"The user account has been deleted.\"\n          break\n        if e.reason == \"AccountDisabled\":\n          print >>sys.stderr, \"The user account has been disabled.\"\n          break\n        if e.reason == \"ServiceDisabled\":\n          print >>sys.stderr, (\"The user's access to the service has been \"\n                               \"disabled.\")\n          break\n        if e.reason == \"ServiceUnavailable\":\n          print >>sys.stderr, \"The service is not available; try again later.\"\n          break\n        raise\n      self._GetAuthCookie(auth_token)\n      return\n\n  def Send(self, request_path, payload=None,\n           content_type=\"application/octet-stream\",\n           timeout=None,\n           **kwargs):\n    \"\"\"Sends an RPC and returns the response.\n\n    Args:\n      request_path: The path to send the request to, eg /api/appversion/create.\n      payload: The body of the request, or None to send an empty request.\n      content_type: The Content-Type header to use.\n      timeout: timeout in seconds; default None i.e. no timeout.\n        (Note: for large requests on OS X, the timeout doesn't work right.)\n      kwargs: Any keyword arguments are converted into query string parameters.\n\n    Returns:\n      The response body, as a string.\n    \"\"\"\n    # TODO: Don't require authentication.  Let the server say\n    # whether it is necessary.\n    if not self.authenticated:\n      self._Authenticate()\n\n    old_timeout = socket.getdefaulttimeout()\n    socket.setdefaulttimeout(timeout)\n    try:\n      tries = 0\n      while True:\n        tries += 1\n        args = dict(kwargs)\n        url = \"http://%s%s\" % (self.host, request_path)\n        if args:\n          url += \"?\" + urllib.urlencode(args)\n        req = self._CreateRequest(url=url, data=payload)\n        req.add_header(\"Content-Type\", content_type)\n        try:\n          f = self.opener.open(req)\n          response = f.read()\n          f.close()\n          return response\n        except urllib2.HTTPError, e:\n          if tries > 3:\n            raise\n          elif e.code == 401:\n            self._Authenticate()\n##           elif e.code >= 500 and e.code < 600:\n##             # Server Error - try again.\n##             continue\n          else:\n            raise\n    finally:\n      socket.setdefaulttimeout(old_timeout)\n\n\nclass HttpRpcServer(AbstractRpcServer):\n  \"\"\"Provides a simplified RPC-style interface for HTTP requests.\"\"\"\n\n  def _Authenticate(self):\n    \"\"\"Save the cookie jar after authentication.\"\"\"\n    super(HttpRpcServer, self)._Authenticate()\n    if self.save_cookies:\n      StatusUpdate(\"Saving authentication cookies to %s\" % self.cookie_file)\n      self.cookie_jar.save()\n\n  def _GetOpener(self):\n    \"\"\"Returns an OpenerDirector that supports cookies and ignores redirects.\n\n    Returns:\n      A urllib2.OpenerDirector object.\n    \"\"\"\n    opener = urllib2.OpenerDirector()\n    opener.add_handler(urllib2.ProxyHandler())\n    opener.add_handler(urllib2.UnknownHandler())\n    opener.add_handler(urllib2.HTTPHandler())\n    opener.add_handler(urllib2.HTTPDefaultErrorHandler())\n    opener.add_handler(urllib2.HTTPSHandler())\n    opener.add_handler(urllib2.HTTPErrorProcessor())\n    if self.save_cookies:\n      self.cookie_file = os.path.expanduser(\"~/.codereview_upload_cookies\")\n      self.cookie_jar = cookielib.MozillaCookieJar(self.cookie_file)\n      if os.path.exists(self.cookie_file):\n        try:\n          self.cookie_jar.load()\n          self.authenticated = True\n          StatusUpdate(\"Loaded authentication cookies from %s\" %\n                       self.cookie_file)\n        except (cookielib.LoadError, IOError):\n          # Failed to load cookies - just ignore them.\n          pass\n      else:\n        # Create an empty cookie file with mode 600\n        fd = os.open(self.cookie_file, os.O_CREAT, 0600)\n        os.close(fd)\n      # Always chmod the cookie file\n      os.chmod(self.cookie_file, 0600)\n    else:\n      # Don't save cookies across runs of update.py.\n      self.cookie_jar = cookielib.CookieJar()\n    opener.add_handler(urllib2.HTTPCookieProcessor(self.cookie_jar))\n    return opener\n\n\nparser = optparse.OptionParser(usage=\"%prog [options] [-- diff_options]\")\nparser.add_option(\"-y\", \"--assume_yes\", action=\"store_true\",\n                  dest=\"assume_yes\", default=False,\n                  help=\"Assume that the answer to yes/no questions is 'yes'.\")\n# Logging\ngroup = parser.add_option_group(\"Logging options\")\ngroup.add_option(\"-q\", \"--quiet\", action=\"store_const\", const=0,\n                 dest=\"verbose\", help=\"Print errors only.\")\ngroup.add_option(\"-v\", \"--verbose\", action=\"store_const\", const=2,\n                 dest=\"verbose\", default=1,\n                 help=\"Print info level logs (default).\")\ngroup.add_option(\"--noisy\", action=\"store_const\", const=3,\n                 dest=\"verbose\", help=\"Print all logs.\")\n# Review server\ngroup = parser.add_option_group(\"Review server options\")\ngroup.add_option(\"-s\", \"--server\", action=\"store\", dest=\"server\",\n                 default=\"codereview.appspot.com\",\n                 metavar=\"SERVER\",\n                 help=(\"The server to upload to. The format is host[:port]. \"\n                       \"Defaults to 'codereview.appspot.com'.\"))\ngroup.add_option(\"-e\", \"--email\", action=\"store\", dest=\"email\",\n                 metavar=\"EMAIL\", default=None,\n                 help=\"The username to use. Will prompt if omitted.\")\ngroup.add_option(\"-H\", \"--host\", action=\"store\", dest=\"host\",\n                 metavar=\"HOST\", default=None,\n                 help=\"Overrides the Host header sent with all RPCs.\")\ngroup.add_option(\"--no_cookies\", action=\"store_false\",\n                 dest=\"save_cookies\", default=True,\n                 help=\"Do not save authentication cookies to local disk.\")\n# Issue\ngroup = parser.add_option_group(\"Issue options\")\ngroup.add_option(\"-d\", \"--description\", action=\"store\", dest=\"description\",\n                 metavar=\"DESCRIPTION\", default=None,\n                 help=\"Optional description when creating an issue.\")\ngroup.add_option(\"-f\", \"--description_file\", action=\"store\",\n                 dest=\"description_file\", metavar=\"DESCRIPTION_FILE\",\n                 default=None,\n                 help=\"Optional path of a file that contains \"\n                      \"the description when creating an issue.\")\ngroup.add_option(\"-r\", \"--reviewers\", action=\"store\", dest=\"reviewers\",\n                 metavar=\"REVIEWERS\", default=None,\n                 help=\"Add reviewers (comma separated email addresses).\")\ngroup.add_option(\"--cc\", action=\"store\", dest=\"cc\",\n                 metavar=\"CC\", default=None,\n                 help=\"Add CC (comma separated email addresses).\")\n# Upload options\ngroup = parser.add_option_group(\"Patch options\")\ngroup.add_option(\"-m\", \"--message\", action=\"store\", dest=\"message\",\n                 metavar=\"MESSAGE\", default=None,\n                 help=\"A message to identify the patch. \"\n                      \"Will prompt if omitted.\")\ngroup.add_option(\"-i\", \"--issue\", type=\"int\", action=\"store\",\n                 metavar=\"ISSUE\", default=None,\n                 help=\"Issue number to which to add. Defaults to new issue.\")\ngroup.add_option(\"--download_base\", action=\"store_true\",\n                 dest=\"download_base\", default=False,\n                 help=\"Base files will be downloaded by the server \"\n                 \"(side-by-side diffs may not work on files with CRs).\")\ngroup.add_option(\"--rev\", action=\"store\", dest=\"revision\",\n                 metavar=\"REV\", default=None,\n                 help=\"Branch/tree/revision to diff against (used by DVCS).\")\ngroup.add_option(\"--send_mail\", action=\"store_true\",\n                 dest=\"send_mail\", default=False,\n                 help=\"Send notification email to reviewers.\")\n\n\ndef GetRpcServer(options):\n  \"\"\"Returns an instance of an AbstractRpcServer.\n\n  Returns:\n    A new AbstractRpcServer, on which RPC calls can be made.\n  \"\"\"\n\n  rpc_server_class = HttpRpcServer\n\n  def GetUserCredentials():\n    \"\"\"Prompts the user for a username and password.\"\"\"\n    email = options.email\n    if email is None:\n      email = GetEmail(\"Email (login for uploading to %s)\" % options.server)\n    password = getpass.getpass(\"Password for %s: \" % email)\n    return (email, password)\n\n  # If this is the dev_appserver, use fake authentication.\n  host = (options.host or options.server).lower()\n  if host == \"localhost\" or host.startswith(\"localhost:\"):\n    email = options.email\n    if email is None:\n      email = \"test@example.com\"\n      logging.info(\"Using debug user %s.  Override with --email\" % email)\n    server = rpc_server_class(\n        options.server,\n        lambda: (email, \"password\"),\n        host_override=options.host,\n        extra_headers={\"Cookie\":\n                       'dev_appserver_login=\"%s:False\"' % email},\n        save_cookies=options.save_cookies)\n    # Don't try to talk to ClientLogin.\n    server.authenticated = True\n    return server\n\n  return rpc_server_class(options.server, GetUserCredentials,\n                          host_override=options.host,\n                          save_cookies=options.save_cookies)\n\n\ndef EncodeMultipartFormData(fields, files):\n  \"\"\"Encode form fields for multipart/form-data.\n\n  Args:\n    fields: A sequence of (name, value) elements for regular form fields.\n    files: A sequence of (name, filename, value) elements for data to be\n           uploaded as files.\n  Returns:\n    (content_type, body) ready for httplib.HTTP instance.\n\n  Source:\n    https://web.archive.org/web/20160116052001/code.activestate.com/recipes/146306\n  \"\"\"\n  BOUNDARY = '-M-A-G-I-C---B-O-U-N-D-A-R-Y-'\n  CRLF = '\\r\\n'\n  lines = []\n  for (key, value) in fields:\n    lines.append('--' + BOUNDARY)\n    lines.append('Content-Disposition: form-data; name=\"%s\"' % key)\n    lines.append('')\n    lines.append(value)\n  for (key, filename, value) in files:\n    lines.append('--' + BOUNDARY)\n    lines.append('Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"' %\n             (key, filename))\n    lines.append('Content-Type: %s' % GetContentType(filename))\n    lines.append('')\n    lines.append(value)\n  lines.append('--' + BOUNDARY + '--')\n  lines.append('')\n  body = CRLF.join(lines)\n  content_type = 'multipart/form-data; boundary=%s' % BOUNDARY\n  return content_type, body\n\n\ndef GetContentType(filename):\n  \"\"\"Helper to guess the content-type from the filename.\"\"\"\n  return mimetypes.guess_type(filename)[0] or 'application/octet-stream'\n\n\n# Use a shell for subcommands on Windows to get a PATH search.\nuse_shell = sys.platform.startswith(\"win\")\n\ndef RunShellWithReturnCode(command, print_output=False,\n                           universal_newlines=True):\n  \"\"\"Executes a command and returns the output from stdout and the return code.\n\n  Args:\n    command: Command to execute.\n    print_output: If True, the output is printed to stdout.\n                  If False, both stdout and stderr are ignored.\n    universal_newlines: Use universal_newlines flag (default: True).\n\n  Returns:\n    Tuple (output, return code)\n  \"\"\"\n  logging.info(\"Running %s\", command)\n  p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,\n                       shell=use_shell, universal_newlines=universal_newlines)\n  if print_output:\n    output_array = []\n    while True:\n      line = p.stdout.readline()\n      if not line:\n        break\n      print line.strip(\"\\n\")\n      output_array.append(line)\n    output = \"\".join(output_array)\n  else:\n    output = p.stdout.read()\n  p.wait()\n  errout = p.stderr.read()\n  if print_output and errout:\n    print >>sys.stderr, errout\n  p.stdout.close()\n  p.stderr.close()\n  return output, p.returncode\n\n\ndef RunShell(command, silent_ok=False, universal_newlines=True,\n             print_output=False):\n  data, retcode = RunShellWithReturnCode(command, print_output,\n                                         universal_newlines)\n  if retcode:\n    ErrorExit(\"Got error status from %s:\\n%s\" % (command, data))\n  if not silent_ok and not data:\n    ErrorExit(\"No output from %s\" % command)\n  return data\n\n\nclass VersionControlSystem(object):\n  \"\"\"Abstract base class providing an interface to the VCS.\"\"\"\n\n  def __init__(self, options):\n    \"\"\"Constructor.\n\n    Args:\n      options: Command line options.\n    \"\"\"\n    self.options = options\n\n  def GenerateDiff(self, args):\n    \"\"\"Return the current diff as a string.\n\n    Args:\n      args: Extra arguments to pass to the diff command.\n    \"\"\"\n    raise NotImplementedError(\n        \"abstract method -- subclass %s must override\" % self.__class__)\n\n  def GetUnknownFiles(self):\n    \"\"\"Return a list of files unknown to the VCS.\"\"\"\n    raise NotImplementedError(\n        \"abstract method -- subclass %s must override\" % self.__class__)\n\n  def CheckForUnknownFiles(self):\n    \"\"\"Show an \"are you sure?\" prompt if there are unknown files.\"\"\"\n    unknown_files = self.GetUnknownFiles()\n    if unknown_files:\n      print \"The following files are not added to version control:\"\n      for line in unknown_files:\n        print line\n      prompt = \"Are you sure to continue?(y/N) \"\n      answer = raw_input(prompt).strip()\n      if answer != \"y\":\n        ErrorExit(\"User aborted\")\n\n  def GetBaseFile(self, filename):\n    \"\"\"Get the content of the upstream version of a file.\n\n    Returns:\n      A tuple (base_content, new_content, is_binary, status)\n        base_content: The contents of the base file.\n        new_content: For text files, this is empty.  For binary files, this is\n          the contents of the new file, since the diff output won't contain\n          information to reconstruct the current file.\n        is_binary: True iff the file is binary.\n        status: The status of the file.\n    \"\"\"\n\n    raise NotImplementedError(\n        \"abstract method -- subclass %s must override\" % self.__class__)\n\n\n  def GetBaseFiles(self, diff):\n    \"\"\"Helper that calls GetBase file for each file in the patch.\n\n    Returns:\n      A dictionary that maps from filename to GetBaseFile's tuple.  Filenames\n      are retrieved based on lines that start with \"Index:\" or\n      \"Property changes on:\".\n    \"\"\"\n    files = {}\n    for line in diff.splitlines(True):\n      if line.startswith('Index:') or line.startswith('Property changes on:'):\n        unused, filename = line.split(':', 1)\n        # On Windows if a file has property changes its filename uses '\\'\n        # instead of '/'.\n        filename = filename.strip().replace('\\\\', '/')\n        files[filename] = self.GetBaseFile(filename)\n    return files\n\n\n  def UploadBaseFiles(self, issue, rpc_server, patch_list, patchset, options,\n                      files):\n    \"\"\"Uploads the base files (and if necessary, the current ones as well).\"\"\"\n\n    def UploadFile(filename, file_id, content, is_binary, status, is_base):\n      \"\"\"Uploads a file to the server.\"\"\"\n      file_too_large = False\n      if is_base:\n        type = \"base\"\n      else:\n        type = \"current\"\n      if len(content) > MAX_UPLOAD_SIZE:\n        print (\"Not uploading the %s file for %s because it's too large.\" %\n               (type, filename))\n        file_too_large = True\n        content = \"\"\n      checksum = md5.new(content).hexdigest()\n      if options.verbose > 0 and not file_too_large:\n        print \"Uploading %s file for %s\" % (type, filename)\n      url = \"/%d/upload_content/%d/%d\" % (int(issue), int(patchset), file_id)\n      form_fields = [(\"filename\", filename),\n                     (\"status\", status),\n                     (\"checksum\", checksum),\n                     (\"is_binary\", str(is_binary)),\n                     (\"is_current\", str(not is_base)),\n                    ]\n      if file_too_large:\n        form_fields.append((\"file_too_large\", \"1\"))\n      if options.email:\n        form_fields.append((\"user\", options.email))\n      ctype, body = EncodeMultipartFormData(form_fields,\n                                            [(\"data\", filename, content)])\n      response_body = rpc_server.Send(url, body,\n                                      content_type=ctype)\n      if not response_body.startswith(\"OK\"):\n        StatusUpdate(\"  --> %s\" % response_body)\n        sys.exit(1)\n\n    patches = dict()\n    [patches.setdefault(v, k) for k, v in patch_list]\n    for filename in patches.keys():\n      base_content, new_content, is_binary, status = files[filename]\n      file_id_str = patches.get(filename)\n      if file_id_str.find(\"nobase\") != -1:\n        base_content = None\n        file_id_str = file_id_str[file_id_str.rfind(\"_\") + 1:]\n      file_id = int(file_id_str)\n      if base_content != None:\n        UploadFile(filename, file_id, base_content, is_binary, status, True)\n      if new_content != None:\n        UploadFile(filename, file_id, new_content, is_binary, status, False)\n\n  def IsImage(self, filename):\n    \"\"\"Returns true if the filename has an image extension.\"\"\"\n    mimetype =  mimetypes.guess_type(filename)[0]\n    if not mimetype:\n      return False\n    return mimetype.startswith(\"image/\")\n\n\nclass SubversionVCS(VersionControlSystem):\n  \"\"\"Implementation of the VersionControlSystem interface for Subversion.\"\"\"\n\n  def __init__(self, options):\n    super(SubversionVCS, self).__init__(options)\n    if self.options.revision:\n      match = re.match(r\"(\\d+)(:(\\d+))?\", self.options.revision)\n      if not match:\n        ErrorExit(\"Invalid Subversion revision %s.\" % self.options.revision)\n      self.rev_start = match.group(1)\n      self.rev_end = match.group(3)\n    else:\n      self.rev_start = self.rev_end = None\n    # Cache output from \"svn list -r REVNO dirname\".\n    # Keys: dirname, Values: 2-tuple (output for start rev and end rev).\n    self.svnls_cache = {}\n    # SVN base URL is required to fetch files deleted in an older revision.\n    # Result is cached to not guess it over and over again in GetBaseFile().\n    required = self.options.download_base or self.options.revision is not None\n    self.svn_base = self._GuessBase(required)\n\n  def GuessBase(self, required):\n    \"\"\"Wrapper for _GuessBase.\"\"\"\n    return self.svn_base\n\n  def _GuessBase(self, required):\n    \"\"\"Returns the SVN base URL.\n\n    Args:\n      required: If true, exits if the url can't be guessed, otherwise None is\n        returned.\n    \"\"\"\n    info = RunShell([\"svn\", \"info\"])\n    for line in info.splitlines():\n      words = line.split()\n      if len(words) == 2 and words[0] == \"URL:\":\n        url = words[1]\n        scheme, netloc, path, params, query, fragment = urlparse.urlparse(url)\n        username, netloc = urllib.splituser(netloc)\n        if username:\n          logging.info(\"Removed username from base URL\")\n        if netloc.endswith(\"svn.python.org\"):\n          if netloc == \"svn.python.org\":\n            if path.startswith(\"/projects/\"):\n              path = path[9:]\n          elif netloc != \"pythondev@svn.python.org\":\n            ErrorExit(\"Unrecognized Python URL: %s\" % url)\n          base = \"http://svn.python.org/view/*checkout*%s/\" % path\n          logging.info(\"Guessed Python base = %s\", base)\n        elif netloc.endswith(\"svn.collab.net\"):\n          if path.startswith(\"/repos/\"):\n            path = path[6:]\n          base = \"http://svn.collab.net/viewvc/*checkout*%s/\" % path\n          logging.info(\"Guessed CollabNet base = %s\", base)\n        elif netloc.endswith(\".googlecode.com\"):\n          path = path + \"/\"\n          base = urlparse.urlunparse((\"http\", netloc, path, params,\n                                      query, fragment))\n          logging.info(\"Guessed Google Code base = %s\", base)\n        else:\n          path = path + \"/\"\n          base = urlparse.urlunparse((scheme, netloc, path, params,\n                                      query, fragment))\n          logging.info(\"Guessed base = %s\", base)\n        return base\n    if required:\n      ErrorExit(\"Can't find URL in output from svn info\")\n    return None\n\n  def GenerateDiff(self, args):\n    cmd = [\"svn\", \"diff\"]\n    if self.options.revision:\n      cmd += [\"-r\", self.options.revision]\n    cmd.extend(args)\n    data = RunShell(cmd)\n    count = 0\n    for line in data.splitlines():\n      if line.startswith(\"Index:\") or line.startswith(\"Property changes on:\"):\n        count += 1\n        logging.info(line)\n    if not count:\n      ErrorExit(\"No valid patches found in output from svn diff\")\n    return data\n\n  def _CollapseKeywords(self, content, keyword_str):\n    \"\"\"Collapses SVN keywords.\"\"\"\n    # svn cat translates keywords but svn diff doesn't. As a result of this\n    # behavior patching.PatchChunks() fails with a chunk mismatch error.\n    # This part was originally written by the Review Board development team\n    # who had the same problem (https://reviews.reviewboard.org/r/276/).\n    # Mapping of keywords to known aliases\n    svn_keywords = {\n      # Standard keywords\n      'Date':                ['Date', 'LastChangedDate'],\n      'Revision':            ['Revision', 'LastChangedRevision', 'Rev'],\n      'Author':              ['Author', 'LastChangedBy'],\n      'HeadURL':             ['HeadURL', 'URL'],\n      'Id':                  ['Id'],\n\n      # Aliases\n      'LastChangedDate':     ['LastChangedDate', 'Date'],\n      'LastChangedRevision': ['LastChangedRevision', 'Rev', 'Revision'],\n      'LastChangedBy':       ['LastChangedBy', 'Author'],\n      'URL':                 ['URL', 'HeadURL'],\n    }\n\n    def repl(m):\n       if m.group(2):\n         return \"$%s::%s$\" % (m.group(1), \" \" * len(m.group(3)))\n       return \"$%s$\" % m.group(1)\n    keywords = [keyword\n                for name in keyword_str.split(\" \")\n                for keyword in svn_keywords.get(name, [])]\n    return re.sub(r\"\\$(%s):(:?)([^\\$]+)\\$\" % '|'.join(keywords), repl, content)\n\n  def GetUnknownFiles(self):\n    status = RunShell([\"svn\", \"status\", \"--ignore-externals\"], silent_ok=True)\n    unknown_files = []\n    for line in status.split(\"\\n\"):\n      if line and line[0] == \"?\":\n        unknown_files.append(line)\n    return unknown_files\n\n  def ReadFile(self, filename):\n    \"\"\"Returns the contents of a file.\"\"\"\n    file = open(filename, 'rb')\n    result = \"\"\n    try:\n      result = file.read()\n    finally:\n      file.close()\n    return result\n\n  def GetStatus(self, filename):\n    \"\"\"Returns the status of a file.\"\"\"\n    if not self.options.revision:\n      status = RunShell([\"svn\", \"status\", \"--ignore-externals\", filename])\n      if not status:\n        ErrorExit(\"svn status returned no output for %s\" % filename)\n      status_lines = status.splitlines()\n      # If file is in a cl, the output will begin with\n      # \"\\n--- Changelist 'cl_name':\\n\".  See\n      # https://web.archive.org/web/20090918234815/svn.collab.net/repos/svn/trunk/notes/changelist-design.txt\n      if (len(status_lines) == 3 and\n          not status_lines[0] and\n          status_lines[1].startswith(\"--- Changelist\")):\n        status = status_lines[2]\n      else:\n        status = status_lines[0]\n    # If we have a revision to diff against we need to run \"svn list\"\n    # for the old and the new revision and compare the results to get\n    # the correct status for a file.\n    else:\n      dirname, relfilename = os.path.split(filename)\n      if dirname not in self.svnls_cache:\n        cmd = [\"svn\", \"list\", \"-r\", self.rev_start, dirname or \".\"]\n        out, returncode = RunShellWithReturnCode(cmd)\n        if returncode:\n          ErrorExit(\"Failed to get status for %s.\" % filename)\n        old_files = out.splitlines()\n        args = [\"svn\", \"list\"]\n        if self.rev_end:\n          args += [\"-r\", self.rev_end]\n        cmd = args + [dirname or \".\"]\n        out, returncode = RunShellWithReturnCode(cmd)\n        if returncode:\n          ErrorExit(\"Failed to run command %s\" % cmd)\n        self.svnls_cache[dirname] = (old_files, out.splitlines())\n      old_files, new_files = self.svnls_cache[dirname]\n      if relfilename in old_files and relfilename not in new_files:\n        status = \"D   \"\n      elif relfilename in old_files and relfilename in new_files:\n        status = \"M   \"\n      else:\n        status = \"A   \"\n    return status\n\n  def GetBaseFile(self, filename):\n    status = self.GetStatus(filename)\n    base_content = None\n    new_content = None\n\n    # If a file is copied its status will be \"A  +\", which signifies\n    # \"addition-with-history\".  See \"svn st\" for more information.  We need to\n    # upload the original file or else diff parsing will fail if the file was\n    # edited.\n    if status[0] == \"A\" and status[3] != \"+\":\n      # We'll need to upload the new content if we're adding a binary file\n      # since diff's output won't contain it.\n      mimetype = RunShell([\"svn\", \"propget\", \"svn:mime-type\", filename],\n                          silent_ok=True)\n      base_content = \"\"\n      is_binary = mimetype and not mimetype.startswith(\"text/\")\n      if is_binary and self.IsImage(filename):\n        new_content = self.ReadFile(filename)\n    elif (status[0] in (\"M\", \"D\", \"R\") or\n          (status[0] == \"A\" and status[3] == \"+\") or  # Copied file.\n          (status[0] == \" \" and status[1] == \"M\")):  # Property change.\n      args = []\n      if self.options.revision:\n        url = \"%s/%s@%s\" % (self.svn_base, filename, self.rev_start)\n      else:\n        # Don't change filename, it's needed later.\n        url = filename\n        args += [\"-r\", \"BASE\"]\n      cmd = [\"svn\"] + args + [\"propget\", \"svn:mime-type\", url]\n      mimetype, returncode = RunShellWithReturnCode(cmd)\n      if returncode:\n        # File does not exist in the requested revision.\n        # Reset mimetype, it contains an error message.\n        mimetype = \"\"\n      get_base = False\n      is_binary = mimetype and not mimetype.startswith(\"text/\")\n      if status[0] == \" \":\n        # Empty base content just to force an upload.\n        base_content = \"\"\n      elif is_binary:\n        if self.IsImage(filename):\n          get_base = True\n          if status[0] == \"M\":\n            if not self.rev_end:\n              new_content = self.ReadFile(filename)\n            else:\n              url = \"%s/%s@%s\" % (self.svn_base, filename, self.rev_end)\n              new_content = RunShell([\"svn\", \"cat\", url],\n                                     universal_newlines=True, silent_ok=True)\n        else:\n          base_content = \"\"\n      else:\n        get_base = True\n\n      if get_base:\n        if is_binary:\n          universal_newlines = False\n        else:\n          universal_newlines = True\n        if self.rev_start:\n          # \"svn cat -r REV delete_file.txt\" doesn't work. cat requires\n          # the full URL with \"@REV\" appended instead of using \"-r\" option.\n          url = \"%s/%s@%s\" % (self.svn_base, filename, self.rev_start)\n          base_content = RunShell([\"svn\", \"cat\", url],\n                                  universal_newlines=universal_newlines,\n                                  silent_ok=True)\n        else:\n          base_content = RunShell([\"svn\", \"cat\", filename],\n                                  universal_newlines=universal_newlines,\n                                  silent_ok=True)\n        if not is_binary:\n          args = []\n          if self.rev_start:\n            url = \"%s/%s@%s\" % (self.svn_base, filename, self.rev_start)\n          else:\n            url = filename\n            args += [\"-r\", \"BASE\"]\n          cmd = [\"svn\"] + args + [\"propget\", \"svn:keywords\", url]\n          keywords, returncode = RunShellWithReturnCode(cmd)\n          if keywords and not returncode:\n            base_content = self._CollapseKeywords(base_content, keywords)\n    else:\n      StatusUpdate(\"svn status returned unexpected output: %s\" % status)\n      sys.exit(1)\n    return base_content, new_content, is_binary, status[0:5]\n\n\nclass GitVCS(VersionControlSystem):\n  \"\"\"Implementation of the VersionControlSystem interface for Git.\"\"\"\n\n  def __init__(self, options):\n    super(GitVCS, self).__init__(options)\n    # Map of filename -> hash of base file.\n    self.base_hashes = {}\n\n  def GenerateDiff(self, extra_args):\n    # This is more complicated than svn's GenerateDiff because we must convert\n    # the diff output to include an svn-style \"Index:\" line as well as record\n    # the hashes of the base files, so we can upload them along with our diff.\n    if self.options.revision:\n      extra_args = [self.options.revision] + extra_args\n    gitdiff = RunShell([\"git\", \"diff\", \"--full-index\"] + extra_args)\n    svndiff = []\n    filecount = 0\n    filename = None\n    for line in gitdiff.splitlines():\n      match = re.match(r\"diff --git a/(.*) b/.*$\", line)\n      if match:\n        filecount += 1\n        filename = match.group(1)\n        svndiff.append(\"Index: %s\\n\" % filename)\n      else:\n        # The \"index\" line in a git diff looks like this (long hashes elided):\n        #   index 82c0d44..b2cee3f 100755\n        # We want to save the left hash, as that identifies the base file.\n        match = re.match(r\"index (\\w+)\\.\\.\", line)\n        if match:\n          self.base_hashes[filename] = match.group(1)\n      svndiff.append(line + \"\\n\")\n    if not filecount:\n      ErrorExit(\"No valid patches found in output from git diff\")\n    return \"\".join(svndiff)\n\n  def GetUnknownFiles(self):\n    status = RunShell([\"git\", \"ls-files\", \"--exclude-standard\", \"--others\"],\n                      silent_ok=True)\n    return status.splitlines()\n\n  def GetBaseFile(self, filename):\n    hash = self.base_hashes[filename]\n    base_content = None\n    new_content = None\n    is_binary = False\n    if hash == \"0\" * 40:  # All-zero hash indicates no base file.\n      status = \"A\"\n      base_content = \"\"\n    else:\n      status = \"M\"\n      base_content, returncode = RunShellWithReturnCode([\"git\", \"show\", hash])\n      if returncode:\n        ErrorExit(\"Got error status from 'git show %s'\" % hash)\n    return (base_content, new_content, is_binary, status)\n\n\nclass MercurialVCS(VersionControlSystem):\n  \"\"\"Implementation of the VersionControlSystem interface for Mercurial.\"\"\"\n\n  def __init__(self, options, repo_dir):\n    super(MercurialVCS, self).__init__(options)\n    # Absolute path to repository (we can be in a subdir)\n    self.repo_dir = os.path.normpath(repo_dir)\n    # Compute the subdir\n    cwd = os.path.normpath(os.getcwd())\n    assert cwd.startswith(self.repo_dir)\n    self.subdir = cwd[len(self.repo_dir):].lstrip(r\"\\/\")\n    if self.options.revision:\n      self.base_rev = self.options.revision\n    else:\n      self.base_rev = RunShell([\"hg\", \"parent\", \"-q\"]).split(':')[1].strip()\n\n  def _GetRelPath(self, filename):\n    \"\"\"Get relative path of a file according to the current directory,\n    given its logical path in the repo.\"\"\"\n    assert filename.startswith(self.subdir), filename\n    return filename[len(self.subdir):].lstrip(r\"\\/\")\n\n  def GenerateDiff(self, extra_args):\n    # If no file specified, restrict to the current subdir\n    extra_args = extra_args or [\".\"]\n    cmd = [\"hg\", \"diff\", \"--git\", \"-r\", self.base_rev] + extra_args\n    data = RunShell(cmd, silent_ok=True)\n    svndiff = []\n    filecount = 0\n    for line in data.splitlines():\n      m = re.match(\"diff --git a/(\\S+) b/(\\S+)\", line)\n      if m:\n        # Modify line to make it look like as it comes from svn diff.\n        # With this modification no changes on the server side are required\n        # to make upload.py work with Mercurial repos.\n        # NOTE: for proper handling of moved/copied files, we have to use\n        # the second filename.\n        filename = m.group(2)\n        svndiff.append(\"Index: %s\" % filename)\n        svndiff.append(\"=\" * 67)\n        filecount += 1\n        logging.info(line)\n      else:\n        svndiff.append(line)\n    if not filecount:\n      ErrorExit(\"No valid patches found in output from hg diff\")\n    return \"\\n\".join(svndiff) + \"\\n\"\n\n  def GetUnknownFiles(self):\n    \"\"\"Return a list of files unknown to the VCS.\"\"\"\n    args = []\n    status = RunShell([\"hg\", \"status\", \"--rev\", self.base_rev, \"-u\", \".\"],\n        silent_ok=True)\n    unknown_files = []\n    for line in status.splitlines():\n      st, fn = line.split(\" \", 1)\n      if st == \"?\":\n        unknown_files.append(fn)\n    return unknown_files\n\n  def GetBaseFile(self, filename):\n    # \"hg status\" and \"hg cat\" both take a path relative to the current subdir\n    # rather than to the repo root, but \"hg diff\" has given us the full path\n    # to the repo root.\n    base_content = \"\"\n    new_content = None\n    is_binary = False\n    oldrelpath = relpath = self._GetRelPath(filename)\n    # \"hg status -C\" returns two lines for moved/copied files, one otherwise\n    out = RunShell([\"hg\", \"status\", \"-C\", \"--rev\", self.base_rev, relpath])\n    out = out.splitlines()\n    # HACK: strip error message about missing file/directory if it isn't in\n    # the working copy\n    if out[0].startswith('%s: ' % relpath):\n      out = out[1:]\n    if len(out) > 1:\n      # Moved/copied => considered as modified, use old filename to\n      # retrieve base contents\n      oldrelpath = out[1].strip()\n      status = \"M\"\n    else:\n      status, _ = out[0].split(' ', 1)\n    if status != \"A\":\n      base_content = RunShell([\"hg\", \"cat\", \"-r\", self.base_rev, oldrelpath],\n        silent_ok=True)\n      is_binary = \"\\0\" in base_content  # Mercurial's heuristic\n    if status != \"R\":\n      new_content = open(relpath, \"rb\").read()\n      is_binary = is_binary or \"\\0\" in new_content\n    if is_binary and base_content:\n      # Fetch again without converting newlines\n      base_content = RunShell([\"hg\", \"cat\", \"-r\", self.base_rev, oldrelpath],\n        silent_ok=True, universal_newlines=False)\n    if not is_binary or not self.IsImage(relpath):\n      new_content = None\n    return base_content, new_content, is_binary, status\n\n\n# NOTE: The SplitPatch function is duplicated in engine.py, keep them in sync.\ndef SplitPatch(data):\n  \"\"\"Splits a patch into separate pieces for each file.\n\n  Args:\n    data: A string containing the output of svn diff.\n\n  Returns:\n    A list of 2-tuple (filename, text) where text is the svn diff output\n      pertaining to filename.\n  \"\"\"\n  patches = []\n  filename = None\n  diff = []\n  for line in data.splitlines(True):\n    new_filename = None\n    if line.startswith('Index:'):\n      unused, new_filename = line.split(':', 1)\n      new_filename = new_filename.strip()\n    elif line.startswith('Property changes on:'):\n      unused, temp_filename = line.split(':', 1)\n      # When a file is modified, paths use '/' between directories, however\n      # when a property is modified '\\' is used on Windows.  Make them the same\n      # otherwise the file shows up twice.\n      temp_filename = temp_filename.strip().replace('\\\\', '/')\n      if temp_filename != filename:\n        # File has property changes but no modifications, create a new diff.\n        new_filename = temp_filename\n    if new_filename:\n      if filename and diff:\n        patches.append((filename, ''.join(diff)))\n      filename = new_filename\n      diff = [line]\n      continue\n    if diff is not None:\n      diff.append(line)\n  if filename and diff:\n    patches.append((filename, ''.join(diff)))\n  return patches\n\n\ndef UploadSeparatePatches(issue, rpc_server, patchset, data, options):\n  \"\"\"Uploads a separate patch for each file in the diff output.\n\n  Returns a list of [patch_key, filename] for each file.\n  \"\"\"\n  patches = SplitPatch(data)\n  rv = []\n  for patch in patches:\n    if len(patch[1]) > MAX_UPLOAD_SIZE:\n      print (\"Not uploading the patch for \" + patch[0] +\n             \" because the file is too large.\")\n      continue\n    form_fields = [(\"filename\", patch[0])]\n    if not options.download_base:\n      form_fields.append((\"content_upload\", \"1\"))\n    files = [(\"data\", \"data.diff\", patch[1])]\n    ctype, body = EncodeMultipartFormData(form_fields, files)\n    url = \"/%d/upload_patch/%d\" % (int(issue), int(patchset))\n    print \"Uploading patch for \" + patch[0]\n    response_body = rpc_server.Send(url, body, content_type=ctype)\n    lines = response_body.splitlines()\n    if not lines or lines[0] != \"OK\":\n      StatusUpdate(\"  --> %s\" % response_body)\n      sys.exit(1)\n    rv.append([lines[1], patch[0]])\n  return rv\n\n\ndef GuessVCS(options):\n  \"\"\"Helper to guess the version control system.\n\n  This examines the current directory, guesses which VersionControlSystem\n  we're using, and returns an instance of the appropriate class.  Exit with an\n  error if we can't figure it out.\n\n  Returns:\n    A VersionControlSystem instance. Exits if the VCS can't be guessed.\n  \"\"\"\n  # Mercurial has a command to get the base directory of a repository\n  # Try running it, but don't die if we don't have hg installed.\n  # NOTE: we try Mercurial first as it can sit on top of an SVN working copy.\n  try:\n    out, returncode = RunShellWithReturnCode([\"hg\", \"root\"])\n    if returncode == 0:\n      return MercurialVCS(options, out.strip())\n  except OSError, (errno, message):\n    if errno != 2:  # ENOENT -- they don't have hg installed.\n      raise\n\n  # Subversion has a .svn in all working directories.\n  if os.path.isdir('.svn'):\n    logging.info(\"Guessed VCS = Subversion\")\n    return SubversionVCS(options)\n\n  # Git has a command to test if you're in a git tree.\n  # Try running it, but don't die if we don't have git installed.\n  try:\n    out, returncode = RunShellWithReturnCode([\"git\", \"rev-parse\",\n                                              \"--is-inside-work-tree\"])\n    if returncode == 0:\n      return GitVCS(options)\n  except OSError, (errno, message):\n    if errno != 2:  # ENOENT -- they don't have git installed.\n      raise\n\n  ErrorExit((\"Could not guess version control system. \"\n             \"Are you in a working copy directory?\"))\n\n\ndef RealMain(argv, data=None):\n  \"\"\"The real main function.\n\n  Args:\n    argv: Command line arguments.\n    data: Diff contents. If None (default) the diff is generated by\n      the VersionControlSystem implementation returned by GuessVCS().\n\n  Returns:\n    A 2-tuple (issue id, patchset id).\n    The patchset id is None if the base files are not uploaded by this\n    script (applies only to SVN checkouts).\n  \"\"\"\n  logging.basicConfig(format=(\"%(asctime).19s %(levelname)s %(filename)s:\"\n                              \"%(lineno)s %(message)s \"))\n  os.environ['LC_ALL'] = 'C'\n  options, args = parser.parse_args(argv[1:])\n  global verbosity\n  verbosity = options.verbose\n  if verbosity >= 3:\n    logging.getLogger().setLevel(logging.DEBUG)\n  elif verbosity >= 2:\n    logging.getLogger().setLevel(logging.INFO)\n  vcs = GuessVCS(options)\n  if isinstance(vcs, SubversionVCS):\n    # base field is only allowed for Subversion.\n    # Note: Fetching base files may become deprecated in future releases.\n    base = vcs.GuessBase(options.download_base)\n  else:\n    base = None\n  if not base and options.download_base:\n    options.download_base = True\n    logging.info(\"Enabled upload of base file\")\n  if not options.assume_yes:\n    vcs.CheckForUnknownFiles()\n  if data is None:\n    data = vcs.GenerateDiff(args)\n  files = vcs.GetBaseFiles(data)\n  if verbosity >= 1:\n    print \"Upload server:\", options.server, \"(change with -s/--server)\"\n  if options.issue:\n    prompt = \"Message describing this patch set: \"\n  else:\n    prompt = \"New issue subject: \"\n  message = options.message or raw_input(prompt).strip()\n  if not message:\n    ErrorExit(\"A non-empty message is required\")\n  rpc_server = GetRpcServer(options)\n  form_fields = [(\"subject\", message)]\n  if base:\n    form_fields.append((\"base\", base))\n  if options.issue:\n    form_fields.append((\"issue\", str(options.issue)))\n  if options.email:\n    form_fields.append((\"user\", options.email))\n  if options.reviewers:\n    for reviewer in options.reviewers.split(','):\n      if \"@\" in reviewer and not reviewer.split(\"@\")[1].count(\".\") == 1:\n        ErrorExit(\"Invalid email address: %s\" % reviewer)\n    form_fields.append((\"reviewers\", options.reviewers))\n  if options.cc:\n    for cc in options.cc.split(','):\n      if \"@\" in cc and not cc.split(\"@\")[1].count(\".\") == 1:\n        ErrorExit(\"Invalid email address: %s\" % cc)\n    form_fields.append((\"cc\", options.cc))\n  description = options.description\n  if options.description_file:\n    if options.description:\n      ErrorExit(\"Can't specify description and description_file\")\n    file = open(options.description_file, 'r')\n    description = file.read()\n    file.close()\n  if description:\n    form_fields.append((\"description\", description))\n  # Send a hash of all the base file so the server can determine if a copy\n  # already exists in an earlier patchset.\n  base_hashes = \"\"\n  for file, info in files.iteritems():\n    if not info[0] is None:\n      checksum = md5.new(info[0]).hexdigest()\n      if base_hashes:\n        base_hashes += \"|\"\n      base_hashes += checksum + \":\" + file\n  form_fields.append((\"base_hashes\", base_hashes))\n  # If we're uploading base files, don't send the email before the uploads, so\n  # that it contains the file status.\n  if options.send_mail and options.download_base:\n    form_fields.append((\"send_mail\", \"1\"))\n  if not options.download_base:\n    form_fields.append((\"content_upload\", \"1\"))\n  if len(data) > MAX_UPLOAD_SIZE:\n    print \"Patch is large, so uploading file patches separately.\"\n    uploaded_diff_file = []\n    form_fields.append((\"separate_patches\", \"1\"))\n  else:\n    uploaded_diff_file = [(\"data\", \"data.diff\", data)]\n  ctype, body = EncodeMultipartFormData(form_fields, uploaded_diff_file)\n  response_body = rpc_server.Send(\"/upload\", body, content_type=ctype)\n  patchset = None\n  if not options.download_base or not uploaded_diff_file:\n    lines = response_body.splitlines()\n    if len(lines) >= 2:\n      msg = lines[0]\n      patchset = lines[1].strip()\n      patches = [x.split(\" \", 1) for x in lines[2:]]\n    else:\n      msg = response_body\n  else:\n    msg = response_body\n  StatusUpdate(msg)\n  if not response_body.startswith(\"Issue created.\") and \\\n  not response_body.startswith(\"Issue updated.\"):\n    sys.exit(0)\n  issue = msg[msg.rfind(\"/\")+1:]\n\n  if not uploaded_diff_file:\n    result = UploadSeparatePatches(issue, rpc_server, patchset, data, options)\n    if not options.download_base:\n      patches = result\n\n  if not options.download_base:\n    vcs.UploadBaseFiles(issue, rpc_server, patches, patchset, options, files)\n    if options.send_mail:\n      rpc_server.Send(\"/\" + issue + \"/mail\", payload=\"\")\n  return issue, patchset\n\n\ndef main():\n  try:\n    RealMain(sys.argv)\n  except KeyboardInterrupt:\n    print\n    StatusUpdate(\"Interrupted.\")\n    sys.exit(1)\n\n\nif __name__ == \"__main__\":\n  main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/scripts/upload_gtest.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"upload_gtest.py v0.1.0 -- uploads a Google Test patch for review.\n\nThis simple wrapper passes all command line flags and\n--cc=googletestframework@googlegroups.com to upload.py.\n\nUSAGE: upload_gtest.py [options for upload.py]\n\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport sys\n\nCC_FLAG = '--cc='\nGTEST_GROUP = 'googletestframework@googlegroups.com'\n\n\ndef main():\n  # Finds the path to upload.py, assuming it is in the same directory\n  # as this file.\n  my_dir = os.path.dirname(os.path.abspath(__file__))\n  upload_py_path = os.path.join(my_dir, 'upload.py')\n\n  # Adds Google Test discussion group to the cc line if it's not there\n  # already.\n  upload_py_argv = [upload_py_path]\n  found_cc_flag = False\n  for arg in sys.argv[1:]:\n    if arg.startswith(CC_FLAG):\n      found_cc_flag = True\n      cc_line = arg[len(CC_FLAG):]\n      cc_list = [addr for addr in cc_line.split(',') if addr]\n      if GTEST_GROUP not in cc_list:\n        cc_list.append(GTEST_GROUP)\n      upload_py_argv.append(CC_FLAG + ','.join(cc_list))\n    else:\n      upload_py_argv.append(arg)\n\n  if not found_cc_flag:\n    upload_py_argv.append(CC_FLAG + GTEST_GROUP)\n\n  # Invokes upload.py with the modified command line flags.\n  os.execv(upload_py_path, upload_py_argv)\n\n\nif __name__ == '__main__':\n  main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/src/gtest-all.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Google C++ Testing and Mocking Framework (Google Test)\n//\n// Sometimes it's desirable to build Google Test by compiling a single file.\n// This file serves this purpose.\n\n// This line ensures that gtest.h can be compiled on its own, even\n// when it's fused.\n#include \"gtest/gtest.h\"\n\n// The following lines pull in the real gtest *.cc files.\n#include \"src/gtest.cc\"\n#include \"src/gtest-death-test.cc\"\n#include \"src/gtest-filepath.cc\"\n#include \"src/gtest-port.cc\"\n#include \"src/gtest-printers.cc\"\n#include \"src/gtest-test-part.cc\"\n#include \"src/gtest-typed-test.cc\"\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/src/gtest-death-test.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// This file implements death tests.\n\n#include \"gtest/gtest-death-test.h\"\n#include \"gtest/internal/gtest-port.h\"\n#include \"gtest/internal/custom/gtest.h\"\n\n#if GTEST_HAS_DEATH_TEST\n\n# if GTEST_OS_MAC\n#  include <crt_externs.h>\n# endif  // GTEST_OS_MAC\n\n# include <errno.h>\n# include <fcntl.h>\n# include <limits.h>\n\n# if GTEST_OS_LINUX\n#  include <signal.h>\n# endif  // GTEST_OS_LINUX\n\n# include <stdarg.h>\n\n# if GTEST_OS_WINDOWS\n#  include <windows.h>\n# else\n#  include <sys/mman.h>\n#  include <sys/wait.h>\n# endif  // GTEST_OS_WINDOWS\n\n# if GTEST_OS_QNX\n#  include <spawn.h>\n# endif  // GTEST_OS_QNX\n\n# if GTEST_OS_FUCHSIA\n#  include <lib/fdio/io.h>\n#  include <lib/fdio/spawn.h>\n#  include <zircon/processargs.h>\n#  include <zircon/syscalls.h>\n#  include <zircon/syscalls/port.h>\n# endif  // GTEST_OS_FUCHSIA\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n#include \"gtest/gtest-message.h\"\n#include \"gtest/internal/gtest-string.h\"\n#include \"src/gtest-internal-inl.h\"\n\nnamespace testing {\n\n// Constants.\n\n// The default death test style.\n//\n// This is defined in internal/gtest-port.h as \"fast\", but can be overridden by\n// a definition in internal/custom/gtest-port.h. The recommended value, which is\n// used internally at Google, is \"threadsafe\".\nstatic const char kDefaultDeathTestStyle[] = GTEST_DEFAULT_DEATH_TEST_STYLE;\n\nGTEST_DEFINE_string_(\n    death_test_style,\n    internal::StringFromGTestEnv(\"death_test_style\", kDefaultDeathTestStyle),\n    \"Indicates how to run a death test in a forked child process: \"\n    \"\\\"threadsafe\\\" (child process re-executes the test binary \"\n    \"from the beginning, running only the specific death test) or \"\n    \"\\\"fast\\\" (child process runs the death test immediately \"\n    \"after forking).\");\n\nGTEST_DEFINE_bool_(\n    death_test_use_fork,\n    internal::BoolFromGTestEnv(\"death_test_use_fork\", false),\n    \"Instructs to use fork()/_exit() instead of clone() in death tests. \"\n    \"Ignored and always uses fork() on POSIX systems where clone() is not \"\n    \"implemented. Useful when running under valgrind or similar tools if \"\n    \"those do not support clone(). Valgrind 3.3.1 will just fail if \"\n    \"it sees an unsupported combination of clone() flags. \"\n    \"It is not recommended to use this flag w/o valgrind though it will \"\n    \"work in 99% of the cases. Once valgrind is fixed, this flag will \"\n    \"most likely be removed.\");\n\nnamespace internal {\nGTEST_DEFINE_string_(\n    internal_run_death_test, \"\",\n    \"Indicates the file, line number, temporal index of \"\n    \"the single death test to run, and a file descriptor to \"\n    \"which a success code may be sent, all separated by \"\n    \"the '|' characters.  This flag is specified if and only if the current \"\n    \"process is a sub-process launched for running a thread-safe \"\n    \"death test.  FOR INTERNAL USE ONLY.\");\n}  // namespace internal\n\n#if GTEST_HAS_DEATH_TEST\n\nnamespace internal {\n\n// Valid only for fast death tests. Indicates the code is running in the\n// child process of a fast style death test.\n# if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA\nstatic bool g_in_fast_death_test_child = false;\n# endif\n\n// Returns a Boolean value indicating whether the caller is currently\n// executing in the context of the death test child process.  Tools such as\n// Valgrind heap checkers may need this to modify their behavior in death\n// tests.  IMPORTANT: This is an internal utility.  Using it may break the\n// implementation of death tests.  User code MUST NOT use it.\nbool InDeathTestChild() {\n# if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA\n\n  // On Windows and Fuchsia, death tests are thread-safe regardless of the value\n  // of the death_test_style flag.\n  return !GTEST_FLAG(internal_run_death_test).empty();\n\n# else\n\n  if (GTEST_FLAG(death_test_style) == \"threadsafe\")\n    return !GTEST_FLAG(internal_run_death_test).empty();\n  else\n    return g_in_fast_death_test_child;\n#endif\n}\n\n}  // namespace internal\n\n// ExitedWithCode constructor.\nExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {\n}\n\n// ExitedWithCode function-call operator.\nbool ExitedWithCode::operator()(int exit_status) const {\n# if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA\n\n  return exit_status == exit_code_;\n\n# else\n\n  return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;\n\n# endif  // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA\n}\n\n# if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA\n// KilledBySignal constructor.\nKilledBySignal::KilledBySignal(int signum) : signum_(signum) {\n}\n\n// KilledBySignal function-call operator.\nbool KilledBySignal::operator()(int exit_status) const {\n#  if defined(GTEST_KILLED_BY_SIGNAL_OVERRIDE_)\n  {\n    bool result;\n    if (GTEST_KILLED_BY_SIGNAL_OVERRIDE_(signum_, exit_status, &result)) {\n      return result;\n    }\n  }\n#  endif  // defined(GTEST_KILLED_BY_SIGNAL_OVERRIDE_)\n  return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;\n}\n# endif  // !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA\n\nnamespace internal {\n\n// Utilities needed for death tests.\n\n// Generates a textual description of a given exit code, in the format\n// specified by wait(2).\nstatic std::string ExitSummary(int exit_code) {\n  Message m;\n\n# if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA\n\n  m << \"Exited with exit status \" << exit_code;\n\n# else\n\n  if (WIFEXITED(exit_code)) {\n    m << \"Exited with exit status \" << WEXITSTATUS(exit_code);\n  } else if (WIFSIGNALED(exit_code)) {\n    m << \"Terminated by signal \" << WTERMSIG(exit_code);\n  }\n#  ifdef WCOREDUMP\n  if (WCOREDUMP(exit_code)) {\n    m << \" (core dumped)\";\n  }\n#  endif\n# endif  // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA\n\n  return m.GetString();\n}\n\n// Returns true if exit_status describes a process that was terminated\n// by a signal, or exited normally with a nonzero exit code.\nbool ExitedUnsuccessfully(int exit_status) {\n  return !ExitedWithCode(0)(exit_status);\n}\n\n# if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA\n// Generates a textual failure message when a death test finds more than\n// one thread running, or cannot determine the number of threads, prior\n// to executing the given statement.  It is the responsibility of the\n// caller not to pass a thread_count of 1.\nstatic std::string DeathTestThreadWarning(size_t thread_count) {\n  Message msg;\n  msg << \"Death tests use fork(), which is unsafe particularly\"\n      << \" in a threaded context. For this test, \" << GTEST_NAME_ << \" \";\n  if (thread_count == 0) {\n    msg << \"couldn't detect the number of threads.\";\n  } else {\n    msg << \"detected \" << thread_count << \" threads.\";\n  }\n  msg << \" See \"\n         \"https://github.com/google/googletest/blob/master/googletest/docs/\"\n         \"advanced.md#death-tests-and-threads\"\n      << \" for more explanation and suggested solutions, especially if\"\n      << \" this is the last message you see before your test times out.\";\n  return msg.GetString();\n}\n# endif  // !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA\n\n// Flag characters for reporting a death test that did not die.\nstatic const char kDeathTestLived = 'L';\nstatic const char kDeathTestReturned = 'R';\nstatic const char kDeathTestThrew = 'T';\nstatic const char kDeathTestInternalError = 'I';\n\n#if GTEST_OS_FUCHSIA\n\n// File descriptor used for the pipe in the child process.\nstatic const int kFuchsiaReadPipeFd = 3;\n\n#endif\n\n// An enumeration describing all of the possible ways that a death test can\n// conclude.  DIED means that the process died while executing the test\n// code; LIVED means that process lived beyond the end of the test code;\n// RETURNED means that the test statement attempted to execute a return\n// statement, which is not allowed; THREW means that the test statement\n// returned control by throwing an exception.  IN_PROGRESS means the test\n// has not yet concluded.\n// FIXME: Unify names and possibly values for\n// AbortReason, DeathTestOutcome, and flag characters above.\nenum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };\n\n// Routine for aborting the program which is safe to call from an\n// exec-style death test child process, in which case the error\n// message is propagated back to the parent process.  Otherwise, the\n// message is simply printed to stderr.  In either case, the program\n// then exits with status 1.\nstatic void DeathTestAbort(const std::string& message) {\n  // On a POSIX system, this function may be called from a threadsafe-style\n  // death test child process, which operates on a very small stack.  Use\n  // the heap for any additional non-minuscule memory requirements.\n  const InternalRunDeathTestFlag* const flag =\n      GetUnitTestImpl()->internal_run_death_test_flag();\n  if (flag != NULL) {\n    FILE* parent = posix::FDOpen(flag->write_fd(), \"w\");\n    fputc(kDeathTestInternalError, parent);\n    fprintf(parent, \"%s\", message.c_str());\n    fflush(parent);\n    _exit(1);\n  } else {\n    fprintf(stderr, \"%s\", message.c_str());\n    fflush(stderr);\n    posix::Abort();\n  }\n}\n\n// A replacement for CHECK that calls DeathTestAbort if the assertion\n// fails.\n# define GTEST_DEATH_TEST_CHECK_(expression) \\\n  do { \\\n    if (!::testing::internal::IsTrue(expression)) { \\\n      DeathTestAbort( \\\n          ::std::string(\"CHECK failed: File \") + __FILE__ +  \", line \" \\\n          + ::testing::internal::StreamableToString(__LINE__) + \": \" \\\n          + #expression); \\\n    } \\\n  } while (::testing::internal::AlwaysFalse())\n\n// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for\n// evaluating any system call that fulfills two conditions: it must return\n// -1 on failure, and set errno to EINTR when it is interrupted and\n// should be tried again.  The macro expands to a loop that repeatedly\n// evaluates the expression as long as it evaluates to -1 and sets\n// errno to EINTR.  If the expression evaluates to -1 but errno is\n// something other than EINTR, DeathTestAbort is called.\n# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \\\n  do { \\\n    int gtest_retval; \\\n    do { \\\n      gtest_retval = (expression); \\\n    } while (gtest_retval == -1 && errno == EINTR); \\\n    if (gtest_retval == -1) { \\\n      DeathTestAbort( \\\n          ::std::string(\"CHECK failed: File \") + __FILE__ + \", line \" \\\n          + ::testing::internal::StreamableToString(__LINE__) + \": \" \\\n          + #expression + \" != -1\"); \\\n    } \\\n  } while (::testing::internal::AlwaysFalse())\n\n// Returns the message describing the last system error in errno.\nstd::string GetLastErrnoDescription() {\n    return errno == 0 ? \"\" : posix::StrError(errno);\n}\n\n// This is called from a death test parent process to read a failure\n// message from the death test child process and log it with the FATAL\n// severity. On Windows, the message is read from a pipe handle. On other\n// platforms, it is read from a file descriptor.\nstatic void FailFromInternalError(int fd) {\n  Message error;\n  char buffer[256];\n  int num_read;\n\n  do {\n    while ((num_read = posix::Read(fd, buffer, 255)) > 0) {\n      buffer[num_read] = '\\0';\n      error << buffer;\n    }\n  } while (num_read == -1 && errno == EINTR);\n\n  if (num_read == 0) {\n    GTEST_LOG_(FATAL) << error.GetString();\n  } else {\n    const int last_error = errno;\n    GTEST_LOG_(FATAL) << \"Error while reading death test internal: \"\n                      << GetLastErrnoDescription() << \" [\" << last_error << \"]\";\n  }\n}\n\n// Death test constructor.  Increments the running death test count\n// for the current test.\nDeathTest::DeathTest() {\n  TestInfo* const info = GetUnitTestImpl()->current_test_info();\n  if (info == NULL) {\n    DeathTestAbort(\"Cannot run a death test outside of a TEST or \"\n                   \"TEST_F construct\");\n  }\n}\n\n// Creates and returns a death test by dispatching to the current\n// death test factory.\nbool DeathTest::Create(const char* statement, const RE* regex,\n                       const char* file, int line, DeathTest** test) {\n  return GetUnitTestImpl()->death_test_factory()->Create(\n      statement, regex, file, line, test);\n}\n\nconst char* DeathTest::LastMessage() {\n  return last_death_test_message_.c_str();\n}\n\nvoid DeathTest::set_last_death_test_message(const std::string& message) {\n  last_death_test_message_ = message;\n}\n\nstd::string DeathTest::last_death_test_message_;\n\n// Provides cross platform implementation for some death functionality.\nclass DeathTestImpl : public DeathTest {\n protected:\n  DeathTestImpl(const char* a_statement, const RE* a_regex)\n      : statement_(a_statement),\n        regex_(a_regex),\n        spawned_(false),\n        status_(-1),\n        outcome_(IN_PROGRESS),\n        read_fd_(-1),\n        write_fd_(-1) {}\n\n  // read_fd_ is expected to be closed and cleared by a derived class.\n  ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }\n\n  void Abort(AbortReason reason);\n  virtual bool Passed(bool status_ok);\n\n  const char* statement() const { return statement_; }\n  const RE* regex() const { return regex_; }\n  bool spawned() const { return spawned_; }\n  void set_spawned(bool is_spawned) { spawned_ = is_spawned; }\n  int status() const { return status_; }\n  void set_status(int a_status) { status_ = a_status; }\n  DeathTestOutcome outcome() const { return outcome_; }\n  void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }\n  int read_fd() const { return read_fd_; }\n  void set_read_fd(int fd) { read_fd_ = fd; }\n  int write_fd() const { return write_fd_; }\n  void set_write_fd(int fd) { write_fd_ = fd; }\n\n  // Called in the parent process only. Reads the result code of the death\n  // test child process via a pipe, interprets it to set the outcome_\n  // member, and closes read_fd_.  Outputs diagnostics and terminates in\n  // case of unexpected codes.\n  void ReadAndInterpretStatusByte();\n\n private:\n  // The textual content of the code this object is testing.  This class\n  // doesn't own this string and should not attempt to delete it.\n  const char* const statement_;\n  // The regular expression which test output must match.  DeathTestImpl\n  // doesn't own this object and should not attempt to delete it.\n  const RE* const regex_;\n  // True if the death test child process has been successfully spawned.\n  bool spawned_;\n  // The exit status of the child process.\n  int status_;\n  // How the death test concluded.\n  DeathTestOutcome outcome_;\n  // Descriptor to the read end of the pipe to the child process.  It is\n  // always -1 in the child process.  The child keeps its write end of the\n  // pipe in write_fd_.\n  int read_fd_;\n  // Descriptor to the child's write end of the pipe to the parent process.\n  // It is always -1 in the parent process.  The parent keeps its end of the\n  // pipe in read_fd_.\n  int write_fd_;\n};\n\n// Called in the parent process only. Reads the result code of the death\n// test child process via a pipe, interprets it to set the outcome_\n// member, and closes read_fd_.  Outputs diagnostics and terminates in\n// case of unexpected codes.\nvoid DeathTestImpl::ReadAndInterpretStatusByte() {\n  char flag;\n  int bytes_read;\n\n  // The read() here blocks until data is available (signifying the\n  // failure of the death test) or until the pipe is closed (signifying\n  // its success), so it's okay to call this in the parent before\n  // the child process has exited.\n  do {\n    bytes_read = posix::Read(read_fd(), &flag, 1);\n  } while (bytes_read == -1 && errno == EINTR);\n\n  if (bytes_read == 0) {\n    set_outcome(DIED);\n  } else if (bytes_read == 1) {\n    switch (flag) {\n      case kDeathTestReturned:\n        set_outcome(RETURNED);\n        break;\n      case kDeathTestThrew:\n        set_outcome(THREW);\n        break;\n      case kDeathTestLived:\n        set_outcome(LIVED);\n        break;\n      case kDeathTestInternalError:\n        FailFromInternalError(read_fd());  // Does not return.\n        break;\n      default:\n        GTEST_LOG_(FATAL) << \"Death test child process reported \"\n                          << \"unexpected status byte (\"\n                          << static_cast<unsigned int>(flag) << \")\";\n    }\n  } else {\n    GTEST_LOG_(FATAL) << \"Read from death test child process failed: \"\n                      << GetLastErrnoDescription();\n  }\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));\n  set_read_fd(-1);\n}\n\n// Signals that the death test code which should have exited, didn't.\n// Should be called only in a death test child process.\n// Writes a status byte to the child's status file descriptor, then\n// calls _exit(1).\nvoid DeathTestImpl::Abort(AbortReason reason) {\n  // The parent process considers the death test to be a failure if\n  // it finds any data in our pipe.  So, here we write a single flag byte\n  // to the pipe, then exit.\n  const char status_ch =\n      reason == TEST_DID_NOT_DIE ? kDeathTestLived :\n      reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;\n\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));\n  // We are leaking the descriptor here because on some platforms (i.e.,\n  // when built as Windows DLL), destructors of global objects will still\n  // run after calling _exit(). On such systems, write_fd_ will be\n  // indirectly closed from the destructor of UnitTestImpl, causing double\n  // close if it is also closed here. On debug configurations, double close\n  // may assert. As there are no in-process buffers to flush here, we are\n  // relying on the OS to close the descriptor after the process terminates\n  // when the destructors are not run.\n  _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)\n}\n\n// Returns an indented copy of stderr output for a death test.\n// This makes distinguishing death test output lines from regular log lines\n// much easier.\nstatic ::std::string FormatDeathTestOutput(const ::std::string& output) {\n  ::std::string ret;\n  for (size_t at = 0; ; ) {\n    const size_t line_end = output.find('\\n', at);\n    ret += \"[  DEATH   ] \";\n    if (line_end == ::std::string::npos) {\n      ret += output.substr(at);\n      break;\n    }\n    ret += output.substr(at, line_end + 1 - at);\n    at = line_end + 1;\n  }\n  return ret;\n}\n\n// Assesses the success or failure of a death test, using both private\n// members which have previously been set, and one argument:\n//\n// Private data members:\n//   outcome:  An enumeration describing how the death test\n//             concluded: DIED, LIVED, THREW, or RETURNED.  The death test\n//             fails in the latter three cases.\n//   status:   The exit status of the child process. On *nix, it is in the\n//             in the format specified by wait(2). On Windows, this is the\n//             value supplied to the ExitProcess() API or a numeric code\n//             of the exception that terminated the program.\n//   regex:    A regular expression object to be applied to\n//             the test's captured standard error output; the death test\n//             fails if it does not match.\n//\n// Argument:\n//   status_ok: true if exit_status is acceptable in the context of\n//              this particular death test, which fails if it is false\n//\n// Returns true iff all of the above conditions are met.  Otherwise, the\n// first failing condition, in the order given above, is the one that is\n// reported. Also sets the last death test message string.\nbool DeathTestImpl::Passed(bool status_ok) {\n  if (!spawned())\n    return false;\n\n  const std::string error_message = GetCapturedStderr();\n\n  bool success = false;\n  Message buffer;\n\n  buffer << \"Death test: \" << statement() << \"\\n\";\n  switch (outcome()) {\n    case LIVED:\n      buffer << \"    Result: failed to die.\\n\"\n             << \" Error msg:\\n\" << FormatDeathTestOutput(error_message);\n      break;\n    case THREW:\n      buffer << \"    Result: threw an exception.\\n\"\n             << \" Error msg:\\n\" << FormatDeathTestOutput(error_message);\n      break;\n    case RETURNED:\n      buffer << \"    Result: illegal return in test statement.\\n\"\n             << \" Error msg:\\n\" << FormatDeathTestOutput(error_message);\n      break;\n    case DIED:\n      if (status_ok) {\n# if GTEST_USES_PCRE\n        // PCRE regexes support embedded NULs.\n        const bool matched = RE::PartialMatch(error_message, *regex());\n# else\n        const bool matched = RE::PartialMatch(error_message.c_str(), *regex());\n# endif  // GTEST_USES_PCRE\n        if (matched) {\n          success = true;\n        } else {\n          buffer << \"    Result: died but not with expected error.\\n\"\n                 << \"  Expected: \" << regex()->pattern() << \"\\n\"\n                 << \"Actual msg:\\n\" << FormatDeathTestOutput(error_message);\n        }\n      } else {\n        buffer << \"    Result: died but not with expected exit code:\\n\"\n               << \"            \" << ExitSummary(status()) << \"\\n\"\n               << \"Actual msg:\\n\" << FormatDeathTestOutput(error_message);\n      }\n      break;\n    case IN_PROGRESS:\n    default:\n      GTEST_LOG_(FATAL)\n          << \"DeathTest::Passed somehow called before conclusion of test\";\n  }\n\n  DeathTest::set_last_death_test_message(buffer.GetString());\n  return success;\n}\n\n# if GTEST_OS_WINDOWS\n// WindowsDeathTest implements death tests on Windows. Due to the\n// specifics of starting new processes on Windows, death tests there are\n// always threadsafe, and Google Test considers the\n// --gtest_death_test_style=fast setting to be equivalent to\n// --gtest_death_test_style=threadsafe there.\n//\n// A few implementation notes:  Like the Linux version, the Windows\n// implementation uses pipes for child-to-parent communication. But due to\n// the specifics of pipes on Windows, some extra steps are required:\n//\n// 1. The parent creates a communication pipe and stores handles to both\n//    ends of it.\n// 2. The parent starts the child and provides it with the information\n//    necessary to acquire the handle to the write end of the pipe.\n// 3. The child acquires the write end of the pipe and signals the parent\n//    using a Windows event.\n// 4. Now the parent can release the write end of the pipe on its side. If\n//    this is done before step 3, the object's reference count goes down to\n//    0 and it is destroyed, preventing the child from acquiring it. The\n//    parent now has to release it, or read operations on the read end of\n//    the pipe will not return when the child terminates.\n// 5. The parent reads child's output through the pipe (outcome code and\n//    any possible error messages) from the pipe, and its stderr and then\n//    determines whether to fail the test.\n//\n// Note: to distinguish Win32 API calls from the local method and function\n// calls, the former are explicitly resolved in the global namespace.\n//\nclass WindowsDeathTest : public DeathTestImpl {\n public:\n  WindowsDeathTest(const char* a_statement,\n                   const RE* a_regex,\n                   const char* file,\n                   int line)\n      : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}\n\n  // All of these virtual functions are inherited from DeathTest.\n  virtual int Wait();\n  virtual TestRole AssumeRole();\n\n private:\n  // The name of the file in which the death test is located.\n  const char* const file_;\n  // The line number on which the death test is located.\n  const int line_;\n  // Handle to the write end of the pipe to the child process.\n  AutoHandle write_handle_;\n  // Child process handle.\n  AutoHandle child_handle_;\n  // Event the child process uses to signal the parent that it has\n  // acquired the handle to the write end of the pipe. After seeing this\n  // event the parent can release its own handles to make sure its\n  // ReadFile() calls return when the child terminates.\n  AutoHandle event_handle_;\n};\n\n// Waits for the child in a death test to exit, returning its exit\n// status, or 0 if no child process exists.  As a side effect, sets the\n// outcome data member.\nint WindowsDeathTest::Wait() {\n  if (!spawned())\n    return 0;\n\n  // Wait until the child either signals that it has acquired the write end\n  // of the pipe or it dies.\n  const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };\n  switch (::WaitForMultipleObjects(2,\n                                   wait_handles,\n                                   FALSE,  // Waits for any of the handles.\n                                   INFINITE)) {\n    case WAIT_OBJECT_0:\n    case WAIT_OBJECT_0 + 1:\n      break;\n    default:\n      GTEST_DEATH_TEST_CHECK_(false);  // Should not get here.\n  }\n\n  // The child has acquired the write end of the pipe or exited.\n  // We release the handle on our side and continue.\n  write_handle_.Reset();\n  event_handle_.Reset();\n\n  ReadAndInterpretStatusByte();\n\n  // Waits for the child process to exit if it haven't already. This\n  // returns immediately if the child has already exited, regardless of\n  // whether previous calls to WaitForMultipleObjects synchronized on this\n  // handle or not.\n  GTEST_DEATH_TEST_CHECK_(\n      WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),\n                                             INFINITE));\n  DWORD status_code;\n  GTEST_DEATH_TEST_CHECK_(\n      ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);\n  child_handle_.Reset();\n  set_status(static_cast<int>(status_code));\n  return status();\n}\n\n// The AssumeRole process for a Windows death test.  It creates a child\n// process with the same executable as the current process to run the\n// death test.  The child process is given the --gtest_filter and\n// --gtest_internal_run_death_test flags such that it knows to run the\n// current death test only.\nDeathTest::TestRole WindowsDeathTest::AssumeRole() {\n  const UnitTestImpl* const impl = GetUnitTestImpl();\n  const InternalRunDeathTestFlag* const flag =\n      impl->internal_run_death_test_flag();\n  const TestInfo* const info = impl->current_test_info();\n  const int death_test_index = info->result()->death_test_count();\n\n  if (flag != NULL) {\n    // ParseInternalRunDeathTestFlag() has performed all the necessary\n    // processing.\n    set_write_fd(flag->write_fd());\n    return EXECUTE_TEST;\n  }\n\n  // WindowsDeathTest uses an anonymous pipe to communicate results of\n  // a death test.\n  SECURITY_ATTRIBUTES handles_are_inheritable = {\n    sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };\n  HANDLE read_handle, write_handle;\n  GTEST_DEATH_TEST_CHECK_(\n      ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,\n                   0)  // Default buffer size.\n      != FALSE);\n  set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),\n                                O_RDONLY));\n  write_handle_.Reset(write_handle);\n  event_handle_.Reset(::CreateEvent(\n      &handles_are_inheritable,\n      TRUE,    // The event will automatically reset to non-signaled state.\n      FALSE,   // The initial state is non-signalled.\n      NULL));  // The even is unnamed.\n  GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);\n  const std::string filter_flag =\n      std::string(\"--\") + GTEST_FLAG_PREFIX_ + kFilterFlag + \"=\" +\n      info->test_case_name() + \".\" + info->name();\n  const std::string internal_flag =\n      std::string(\"--\") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +\n      \"=\" + file_ + \"|\" + StreamableToString(line_) + \"|\" +\n      StreamableToString(death_test_index) + \"|\" +\n      StreamableToString(static_cast<unsigned int>(::GetCurrentProcessId())) +\n      // size_t has the same width as pointers on both 32-bit and 64-bit\n      // Windows platforms.\n      // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.\n      \"|\" + StreamableToString(reinterpret_cast<size_t>(write_handle)) +\n      \"|\" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));\n\n  char executable_path[_MAX_PATH + 1];  // NOLINT\n  GTEST_DEATH_TEST_CHECK_(\n      _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,\n                                            executable_path,\n                                            _MAX_PATH));\n\n  std::string command_line =\n      std::string(::GetCommandLineA()) + \" \" + filter_flag + \" \\\"\" +\n      internal_flag + \"\\\"\";\n\n  DeathTest::set_last_death_test_message(\"\");\n\n  CaptureStderr();\n  // Flush the log buffers since the log streams are shared with the child.\n  FlushInfoLog();\n\n  // The child process will share the standard handles with the parent.\n  STARTUPINFOA startup_info;\n  memset(&startup_info, 0, sizeof(STARTUPINFO));\n  startup_info.dwFlags = STARTF_USESTDHANDLES;\n  startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);\n  startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);\n  startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);\n\n  PROCESS_INFORMATION process_info;\n  GTEST_DEATH_TEST_CHECK_(::CreateProcessA(\n      executable_path,\n      const_cast<char*>(command_line.c_str()),\n      NULL,   // Retuned process handle is not inheritable.\n      NULL,   // Retuned thread handle is not inheritable.\n      TRUE,   // Child inherits all inheritable handles (for write_handle_).\n      0x0,    // Default creation flags.\n      NULL,   // Inherit the parent's environment.\n      UnitTest::GetInstance()->original_working_dir(),\n      &startup_info,\n      &process_info) != FALSE);\n  child_handle_.Reset(process_info.hProcess);\n  ::CloseHandle(process_info.hThread);\n  set_spawned(true);\n  return OVERSEE_TEST;\n}\n\n# elif GTEST_OS_FUCHSIA\n\nclass FuchsiaDeathTest : public DeathTestImpl {\n public:\n  FuchsiaDeathTest(const char* a_statement,\n                   const RE* a_regex,\n                   const char* file,\n                   int line)\n      : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}\n  virtual ~FuchsiaDeathTest() {\n    zx_status_t status = zx_handle_close(child_process_);\n    GTEST_DEATH_TEST_CHECK_(status == ZX_OK);\n    status = zx_handle_close(port_);\n    GTEST_DEATH_TEST_CHECK_(status == ZX_OK);\n  }\n\n  // All of these virtual functions are inherited from DeathTest.\n  virtual int Wait();\n  virtual TestRole AssumeRole();\n\n private:\n  // The name of the file in which the death test is located.\n  const char* const file_;\n  // The line number on which the death test is located.\n  const int line_;\n\n  zx_handle_t child_process_ = ZX_HANDLE_INVALID;\n  zx_handle_t port_ = ZX_HANDLE_INVALID;\n};\n\n// Utility class for accumulating command-line arguments.\nclass Arguments {\n public:\n  Arguments() {\n    args_.push_back(NULL);\n  }\n\n  ~Arguments() {\n    for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();\n         ++i) {\n      free(*i);\n    }\n  }\n  void AddArgument(const char* argument) {\n    args_.insert(args_.end() - 1, posix::StrDup(argument));\n  }\n\n  template <typename Str>\n  void AddArguments(const ::std::vector<Str>& arguments) {\n    for (typename ::std::vector<Str>::const_iterator i = arguments.begin();\n         i != arguments.end();\n         ++i) {\n      args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));\n    }\n  }\n  char* const* Argv() {\n    return &args_[0];\n  }\n\n  int size() {\n    return args_.size() - 1;\n  }\n\n private:\n  std::vector<char*> args_;\n};\n\n// Waits for the child in a death test to exit, returning its exit\n// status, or 0 if no child process exists.  As a side effect, sets the\n// outcome data member.\nint FuchsiaDeathTest::Wait() {\n  if (!spawned())\n    return 0;\n\n  // Register to wait for the child process to terminate.\n  zx_status_t status_zx;\n  status_zx = zx_object_wait_async(child_process_,\n                                   port_,\n                                   0 /* key */,\n                                   ZX_PROCESS_TERMINATED,\n                                   ZX_WAIT_ASYNC_ONCE);\n  GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);\n\n  // Wait for it to terminate, or an exception to be received.\n  zx_port_packet_t packet;\n  status_zx = zx_port_wait(port_, ZX_TIME_INFINITE, &packet);\n  GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);\n\n  if (ZX_PKT_IS_EXCEPTION(packet.type)) {\n    // Process encountered an exception. Kill it directly rather than letting\n    // other handlers process the event.\n    status_zx = zx_task_kill(child_process_);\n    GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);\n\n    // Now wait for |child_process_| to terminate.\n    zx_signals_t signals = 0;\n    status_zx = zx_object_wait_one(\n        child_process_, ZX_PROCESS_TERMINATED, ZX_TIME_INFINITE, &signals);\n    GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);\n    GTEST_DEATH_TEST_CHECK_(signals & ZX_PROCESS_TERMINATED);\n  } else {\n    // Process terminated.\n    GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type));\n    GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_PROCESS_TERMINATED);\n  }\n\n  ReadAndInterpretStatusByte();\n\n  zx_info_process_t buffer;\n  status_zx = zx_object_get_info(\n      child_process_,\n      ZX_INFO_PROCESS,\n      &buffer,\n      sizeof(buffer),\n      nullptr,\n      nullptr);\n  GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);\n\n  GTEST_DEATH_TEST_CHECK_(buffer.exited);\n  set_status(buffer.return_code);\n  return status();\n}\n\n// The AssumeRole process for a Fuchsia death test.  It creates a child\n// process with the same executable as the current process to run the\n// death test.  The child process is given the --gtest_filter and\n// --gtest_internal_run_death_test flags such that it knows to run the\n// current death test only.\nDeathTest::TestRole FuchsiaDeathTest::AssumeRole() {\n  const UnitTestImpl* const impl = GetUnitTestImpl();\n  const InternalRunDeathTestFlag* const flag =\n      impl->internal_run_death_test_flag();\n  const TestInfo* const info = impl->current_test_info();\n  const int death_test_index = info->result()->death_test_count();\n\n  if (flag != NULL) {\n    // ParseInternalRunDeathTestFlag() has performed all the necessary\n    // processing.\n    set_write_fd(kFuchsiaReadPipeFd);\n    return EXECUTE_TEST;\n  }\n\n  CaptureStderr();\n  // Flush the log buffers since the log streams are shared with the child.\n  FlushInfoLog();\n\n  // Build the child process command line.\n  const std::string filter_flag =\n      std::string(\"--\") + GTEST_FLAG_PREFIX_ + kFilterFlag + \"=\"\n      + info->test_case_name() + \".\" + info->name();\n  const std::string internal_flag =\n      std::string(\"--\") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + \"=\"\n      + file_ + \"|\"\n      + StreamableToString(line_) + \"|\"\n      + StreamableToString(death_test_index);\n  Arguments args;\n  args.AddArguments(GetInjectableArgvs());\n  args.AddArgument(filter_flag.c_str());\n  args.AddArgument(internal_flag.c_str());\n\n  // Build the pipe for communication with the child.\n  zx_status_t status;\n  zx_handle_t child_pipe_handle;\n  uint32_t type;\n  status = fdio_pipe_half(&child_pipe_handle, &type);\n  GTEST_DEATH_TEST_CHECK_(status >= 0);\n  set_read_fd(status);\n\n  // Set the pipe handle for the child.\n  fdio_spawn_action_t add_handle_action = {};\n  add_handle_action.action = FDIO_SPAWN_ACTION_ADD_HANDLE;\n  add_handle_action.h.id = PA_HND(type, kFuchsiaReadPipeFd);\n  add_handle_action.h.handle = child_pipe_handle;\n\n  // Spawn the child process.\n  status = fdio_spawn_etc(ZX_HANDLE_INVALID, FDIO_SPAWN_CLONE_ALL,\n                          args.Argv()[0], args.Argv(), nullptr, 1,\n                          &add_handle_action, &child_process_, nullptr);\n  GTEST_DEATH_TEST_CHECK_(status == ZX_OK);\n\n  // Create an exception port and attach it to the |child_process_|, to allow\n  // us to suppress the system default exception handler from firing.\n  status = zx_port_create(0, &port_);\n  GTEST_DEATH_TEST_CHECK_(status == ZX_OK);\n  status = zx_task_bind_exception_port(\n      child_process_, port_, 0 /* key */, 0 /*options */);\n  GTEST_DEATH_TEST_CHECK_(status == ZX_OK);\n\n  set_spawned(true);\n  return OVERSEE_TEST;\n}\n\n#else  // We are neither on Windows, nor on Fuchsia.\n\n// ForkingDeathTest provides implementations for most of the abstract\n// methods of the DeathTest interface.  Only the AssumeRole method is\n// left undefined.\nclass ForkingDeathTest : public DeathTestImpl {\n public:\n  ForkingDeathTest(const char* statement, const RE* regex);\n\n  // All of these virtual functions are inherited from DeathTest.\n  virtual int Wait();\n\n protected:\n  void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }\n\n private:\n  // PID of child process during death test; 0 in the child process itself.\n  pid_t child_pid_;\n};\n\n// Constructs a ForkingDeathTest.\nForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)\n    : DeathTestImpl(a_statement, a_regex),\n      child_pid_(-1) {}\n\n// Waits for the child in a death test to exit, returning its exit\n// status, or 0 if no child process exists.  As a side effect, sets the\n// outcome data member.\nint ForkingDeathTest::Wait() {\n  if (!spawned())\n    return 0;\n\n  ReadAndInterpretStatusByte();\n\n  int status_value;\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));\n  set_status(status_value);\n  return status_value;\n}\n\n// A concrete death test class that forks, then immediately runs the test\n// in the child process.\nclass NoExecDeathTest : public ForkingDeathTest {\n public:\n  NoExecDeathTest(const char* a_statement, const RE* a_regex) :\n      ForkingDeathTest(a_statement, a_regex) { }\n  virtual TestRole AssumeRole();\n};\n\n// The AssumeRole process for a fork-and-run death test.  It implements a\n// straightforward fork, with a simple pipe to transmit the status byte.\nDeathTest::TestRole NoExecDeathTest::AssumeRole() {\n  const size_t thread_count = GetThreadCount();\n  if (thread_count != 1) {\n    GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);\n  }\n\n  int pipe_fd[2];\n  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);\n\n  DeathTest::set_last_death_test_message(\"\");\n  CaptureStderr();\n  // When we fork the process below, the log file buffers are copied, but the\n  // file descriptors are shared.  We flush all log files here so that closing\n  // the file descriptors in the child process doesn't throw off the\n  // synchronization between descriptors and buffers in the parent process.\n  // This is as close to the fork as possible to avoid a race condition in case\n  // there are multiple threads running before the death test, and another\n  // thread writes to the log file.\n  FlushInfoLog();\n\n  const pid_t child_pid = fork();\n  GTEST_DEATH_TEST_CHECK_(child_pid != -1);\n  set_child_pid(child_pid);\n  if (child_pid == 0) {\n    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));\n    set_write_fd(pipe_fd[1]);\n    // Redirects all logging to stderr in the child process to prevent\n    // concurrent writes to the log files.  We capture stderr in the parent\n    // process and append the child process' output to a log.\n    LogToStderr();\n    // Event forwarding to the listeners of event listener API mush be shut\n    // down in death test subprocesses.\n    GetUnitTestImpl()->listeners()->SuppressEventForwarding();\n    g_in_fast_death_test_child = true;\n    return EXECUTE_TEST;\n  } else {\n    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));\n    set_read_fd(pipe_fd[0]);\n    set_spawned(true);\n    return OVERSEE_TEST;\n  }\n}\n\n// A concrete death test class that forks and re-executes the main\n// program from the beginning, with command-line flags set that cause\n// only this specific death test to be run.\nclass ExecDeathTest : public ForkingDeathTest {\n public:\n  ExecDeathTest(const char* a_statement, const RE* a_regex,\n                const char* file, int line) :\n      ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }\n  virtual TestRole AssumeRole();\n private:\n  static ::std::vector<std::string> GetArgvsForDeathTestChildProcess() {\n    ::std::vector<std::string> args = GetInjectableArgvs();\n#  if defined(GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_)\n    ::std::vector<std::string> extra_args =\n        GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_();\n    args.insert(args.end(), extra_args.begin(), extra_args.end());\n#  endif  // defined(GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_)\n    return args;\n  }\n  // The name of the file in which the death test is located.\n  const char* const file_;\n  // The line number on which the death test is located.\n  const int line_;\n};\n\n// Utility class for accumulating command-line arguments.\nclass Arguments {\n public:\n  Arguments() {\n    args_.push_back(NULL);\n  }\n\n  ~Arguments() {\n    for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();\n         ++i) {\n      free(*i);\n    }\n  }\n  void AddArgument(const char* argument) {\n    args_.insert(args_.end() - 1, posix::StrDup(argument));\n  }\n\n  template <typename Str>\n  void AddArguments(const ::std::vector<Str>& arguments) {\n    for (typename ::std::vector<Str>::const_iterator i = arguments.begin();\n         i != arguments.end();\n         ++i) {\n      args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));\n    }\n  }\n  char* const* Argv() {\n    return &args_[0];\n  }\n\n private:\n  std::vector<char*> args_;\n};\n\n// A struct that encompasses the arguments to the child process of a\n// threadsafe-style death test process.\nstruct ExecDeathTestArgs {\n  char* const* argv;  // Command-line arguments for the child's call to exec\n  int close_fd;       // File descriptor to close; the read end of a pipe\n};\n\n#  if GTEST_OS_MAC\ninline char** GetEnviron() {\n  // When Google Test is built as a framework on MacOS X, the environ variable\n  // is unavailable. Apple's documentation (man environ) recommends using\n  // _NSGetEnviron() instead.\n  return *_NSGetEnviron();\n}\n#  else\n// Some POSIX platforms expect you to declare environ. extern \"C\" makes\n// it reside in the global namespace.\nextern \"C\" char** environ;\ninline char** GetEnviron() { return environ; }\n#  endif  // GTEST_OS_MAC\n\n#  if !GTEST_OS_QNX\n// The main function for a threadsafe-style death test child process.\n// This function is called in a clone()-ed process and thus must avoid\n// any potentially unsafe operations like malloc or libc functions.\nstatic int ExecDeathTestChildMain(void* child_arg) {\n  ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));\n\n  // We need to execute the test program in the same environment where\n  // it was originally invoked.  Therefore we change to the original\n  // working directory first.\n  const char* const original_dir =\n      UnitTest::GetInstance()->original_working_dir();\n  // We can safely call chdir() as it's a direct system call.\n  if (chdir(original_dir) != 0) {\n    DeathTestAbort(std::string(\"chdir(\\\"\") + original_dir + \"\\\") failed: \" +\n                   GetLastErrnoDescription());\n    return EXIT_FAILURE;\n  }\n\n  // We can safely call execve() as it's a direct system call.  We\n  // cannot use execvp() as it's a libc function and thus potentially\n  // unsafe.  Since execve() doesn't search the PATH, the user must\n  // invoke the test program via a valid path that contains at least\n  // one path separator.\n  execve(args->argv[0], args->argv, GetEnviron());\n  DeathTestAbort(std::string(\"execve(\") + args->argv[0] + \", ...) in \" +\n                 original_dir + \" failed: \" +\n                 GetLastErrnoDescription());\n  return EXIT_FAILURE;\n}\n#  endif  // !GTEST_OS_QNX\n\n#  if GTEST_HAS_CLONE\n// Two utility routines that together determine the direction the stack\n// grows.\n// This could be accomplished more elegantly by a single recursive\n// function, but we want to guard against the unlikely possibility of\n// a smart compiler optimizing the recursion away.\n//\n// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining\n// StackLowerThanAddress into StackGrowsDown, which then doesn't give\n// correct answer.\nstatic void StackLowerThanAddress(const void* ptr,\n                                  bool* result) GTEST_NO_INLINE_;\nstatic void StackLowerThanAddress(const void* ptr, bool* result) {\n  int dummy;\n  *result = (&dummy < ptr);\n}\n\n// Make sure AddressSanitizer does not tamper with the stack here.\nGTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_\nstatic bool StackGrowsDown() {\n  int dummy;\n  bool result;\n  StackLowerThanAddress(&dummy, &result);\n  return result;\n}\n#  endif  // GTEST_HAS_CLONE\n\n// Spawns a child process with the same executable as the current process in\n// a thread-safe manner and instructs it to run the death test.  The\n// implementation uses fork(2) + exec.  On systems where clone(2) is\n// available, it is used instead, being slightly more thread-safe.  On QNX,\n// fork supports only single-threaded environments, so this function uses\n// spawn(2) there instead.  The function dies with an error message if\n// anything goes wrong.\nstatic pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {\n  ExecDeathTestArgs args = { argv, close_fd };\n  pid_t child_pid = -1;\n\n#  if GTEST_OS_QNX\n  // Obtains the current directory and sets it to be closed in the child\n  // process.\n  const int cwd_fd = open(\".\", O_RDONLY);\n  GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));\n  // We need to execute the test program in the same environment where\n  // it was originally invoked.  Therefore we change to the original\n  // working directory first.\n  const char* const original_dir =\n      UnitTest::GetInstance()->original_working_dir();\n  // We can safely call chdir() as it's a direct system call.\n  if (chdir(original_dir) != 0) {\n    DeathTestAbort(std::string(\"chdir(\\\"\") + original_dir + \"\\\") failed: \" +\n                   GetLastErrnoDescription());\n    return EXIT_FAILURE;\n  }\n\n  int fd_flags;\n  // Set close_fd to be closed after spawn.\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,\n                                        fd_flags | FD_CLOEXEC));\n  struct inheritance inherit = {0};\n  // spawn is a system call.\n  child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());\n  // Restores the current working directory.\n  GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));\n\n#  else   // GTEST_OS_QNX\n#   if GTEST_OS_LINUX\n  // When a SIGPROF signal is received while fork() or clone() are executing,\n  // the process may hang. To avoid this, we ignore SIGPROF here and re-enable\n  // it after the call to fork()/clone() is complete.\n  struct sigaction saved_sigprof_action;\n  struct sigaction ignore_sigprof_action;\n  memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));\n  sigemptyset(&ignore_sigprof_action.sa_mask);\n  ignore_sigprof_action.sa_handler = SIG_IGN;\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(\n      SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));\n#   endif  // GTEST_OS_LINUX\n\n#   if GTEST_HAS_CLONE\n  const bool use_fork = GTEST_FLAG(death_test_use_fork);\n\n  if (!use_fork) {\n    static const bool stack_grows_down = StackGrowsDown();\n    const size_t stack_size = getpagesize();\n    // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.\n    void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,\n                             MAP_ANON | MAP_PRIVATE, -1, 0);\n    GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);\n\n    // Maximum stack alignment in bytes:  For a downward-growing stack, this\n    // amount is subtracted from size of the stack space to get an address\n    // that is within the stack space and is aligned on all systems we care\n    // about.  As far as I know there is no ABI with stack alignment greater\n    // than 64.  We assume stack and stack_size already have alignment of\n    // kMaxStackAlignment.\n    const size_t kMaxStackAlignment = 64;\n    void* const stack_top =\n        static_cast<char*>(stack) +\n            (stack_grows_down ? stack_size - kMaxStackAlignment : 0);\n    GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&\n        reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0);\n\n    child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);\n\n    GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);\n  }\n#   else\n  const bool use_fork = true;\n#   endif  // GTEST_HAS_CLONE\n\n  if (use_fork && (child_pid = fork()) == 0) {\n      ExecDeathTestChildMain(&args);\n      _exit(0);\n  }\n#  endif  // GTEST_OS_QNX\n#  if GTEST_OS_LINUX\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(\n      sigaction(SIGPROF, &saved_sigprof_action, NULL));\n#  endif  // GTEST_OS_LINUX\n\n  GTEST_DEATH_TEST_CHECK_(child_pid != -1);\n  return child_pid;\n}\n\n// The AssumeRole process for a fork-and-exec death test.  It re-executes the\n// main program from the beginning, setting the --gtest_filter\n// and --gtest_internal_run_death_test flags to cause only the current\n// death test to be re-run.\nDeathTest::TestRole ExecDeathTest::AssumeRole() {\n  const UnitTestImpl* const impl = GetUnitTestImpl();\n  const InternalRunDeathTestFlag* const flag =\n      impl->internal_run_death_test_flag();\n  const TestInfo* const info = impl->current_test_info();\n  const int death_test_index = info->result()->death_test_count();\n\n  if (flag != NULL) {\n    set_write_fd(flag->write_fd());\n    return EXECUTE_TEST;\n  }\n\n  int pipe_fd[2];\n  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);\n  // Clear the close-on-exec flag on the write end of the pipe, lest\n  // it be closed when the child process does an exec:\n  GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);\n\n  const std::string filter_flag =\n      std::string(\"--\") + GTEST_FLAG_PREFIX_ + kFilterFlag + \"=\"\n      + info->test_case_name() + \".\" + info->name();\n  const std::string internal_flag =\n      std::string(\"--\") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + \"=\"\n      + file_ + \"|\" + StreamableToString(line_) + \"|\"\n      + StreamableToString(death_test_index) + \"|\"\n      + StreamableToString(pipe_fd[1]);\n  Arguments args;\n  args.AddArguments(GetArgvsForDeathTestChildProcess());\n  args.AddArgument(filter_flag.c_str());\n  args.AddArgument(internal_flag.c_str());\n\n  DeathTest::set_last_death_test_message(\"\");\n\n  CaptureStderr();\n  // See the comment in NoExecDeathTest::AssumeRole for why the next line\n  // is necessary.\n  FlushInfoLog();\n\n  const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));\n  set_child_pid(child_pid);\n  set_read_fd(pipe_fd[0]);\n  set_spawned(true);\n  return OVERSEE_TEST;\n}\n\n# endif  // !GTEST_OS_WINDOWS\n\n// Creates a concrete DeathTest-derived class that depends on the\n// --gtest_death_test_style flag, and sets the pointer pointed to\n// by the \"test\" argument to its address.  If the test should be\n// skipped, sets that pointer to NULL.  Returns true, unless the\n// flag is set to an invalid value.\nbool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,\n                                     const char* file, int line,\n                                     DeathTest** test) {\n  UnitTestImpl* const impl = GetUnitTestImpl();\n  const InternalRunDeathTestFlag* const flag =\n      impl->internal_run_death_test_flag();\n  const int death_test_index = impl->current_test_info()\n      ->increment_death_test_count();\n\n  if (flag != NULL) {\n    if (death_test_index > flag->index()) {\n      DeathTest::set_last_death_test_message(\n          \"Death test count (\" + StreamableToString(death_test_index)\n          + \") somehow exceeded expected maximum (\"\n          + StreamableToString(flag->index()) + \")\");\n      return false;\n    }\n\n    if (!(flag->file() == file && flag->line() == line &&\n          flag->index() == death_test_index)) {\n      *test = NULL;\n      return true;\n    }\n  }\n\n# if GTEST_OS_WINDOWS\n\n  if (GTEST_FLAG(death_test_style) == \"threadsafe\" ||\n      GTEST_FLAG(death_test_style) == \"fast\") {\n    *test = new WindowsDeathTest(statement, regex, file, line);\n  }\n\n# elif GTEST_OS_FUCHSIA\n\n  if (GTEST_FLAG(death_test_style) == \"threadsafe\" ||\n      GTEST_FLAG(death_test_style) == \"fast\") {\n    *test = new FuchsiaDeathTest(statement, regex, file, line);\n  }\n\n# else\n\n  if (GTEST_FLAG(death_test_style) == \"threadsafe\") {\n    *test = new ExecDeathTest(statement, regex, file, line);\n  } else if (GTEST_FLAG(death_test_style) == \"fast\") {\n    *test = new NoExecDeathTest(statement, regex);\n  }\n\n# endif  // GTEST_OS_WINDOWS\n\n  else {  // NOLINT - this is more readable than unbalanced brackets inside #if.\n    DeathTest::set_last_death_test_message(\n        \"Unknown death test style \\\"\" + GTEST_FLAG(death_test_style)\n        + \"\\\" encountered\");\n    return false;\n  }\n\n  return true;\n}\n\n# if GTEST_OS_WINDOWS\n// Recreates the pipe and event handles from the provided parameters,\n// signals the event, and returns a file descriptor wrapped around the pipe\n// handle. This function is called in the child process only.\nstatic int GetStatusFileDescriptor(unsigned int parent_process_id,\n                            size_t write_handle_as_size_t,\n                            size_t event_handle_as_size_t) {\n  AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,\n                                                   FALSE,  // Non-inheritable.\n                                                   parent_process_id));\n  if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {\n    DeathTestAbort(\"Unable to open parent process \" +\n                   StreamableToString(parent_process_id));\n  }\n\n  // FIXME: Replace the following check with a\n  // compile-time assertion when available.\n  GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));\n\n  const HANDLE write_handle =\n      reinterpret_cast<HANDLE>(write_handle_as_size_t);\n  HANDLE dup_write_handle;\n\n  // The newly initialized handle is accessible only in the parent\n  // process. To obtain one accessible within the child, we need to use\n  // DuplicateHandle.\n  if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,\n                         ::GetCurrentProcess(), &dup_write_handle,\n                         0x0,    // Requested privileges ignored since\n                                 // DUPLICATE_SAME_ACCESS is used.\n                         FALSE,  // Request non-inheritable handler.\n                         DUPLICATE_SAME_ACCESS)) {\n    DeathTestAbort(\"Unable to duplicate the pipe handle \" +\n                   StreamableToString(write_handle_as_size_t) +\n                   \" from the parent process \" +\n                   StreamableToString(parent_process_id));\n  }\n\n  const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);\n  HANDLE dup_event_handle;\n\n  if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,\n                         ::GetCurrentProcess(), &dup_event_handle,\n                         0x0,\n                         FALSE,\n                         DUPLICATE_SAME_ACCESS)) {\n    DeathTestAbort(\"Unable to duplicate the event handle \" +\n                   StreamableToString(event_handle_as_size_t) +\n                   \" from the parent process \" +\n                   StreamableToString(parent_process_id));\n  }\n\n  const int write_fd =\n      ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);\n  if (write_fd == -1) {\n    DeathTestAbort(\"Unable to convert pipe handle \" +\n                   StreamableToString(write_handle_as_size_t) +\n                   \" to a file descriptor\");\n  }\n\n  // Signals the parent that the write end of the pipe has been acquired\n  // so the parent can release its own write end.\n  ::SetEvent(dup_event_handle);\n\n  return write_fd;\n}\n# endif  // GTEST_OS_WINDOWS\n\n// Returns a newly created InternalRunDeathTestFlag object with fields\n// initialized from the GTEST_FLAG(internal_run_death_test) flag if\n// the flag is specified; otherwise returns NULL.\nInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {\n  if (GTEST_FLAG(internal_run_death_test) == \"\") return NULL;\n\n  // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we\n  // can use it here.\n  int line = -1;\n  int index = -1;\n  ::std::vector< ::std::string> fields;\n  SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);\n  int write_fd = -1;\n\n# if GTEST_OS_WINDOWS\n\n  unsigned int parent_process_id = 0;\n  size_t write_handle_as_size_t = 0;\n  size_t event_handle_as_size_t = 0;\n\n  if (fields.size() != 6\n      || !ParseNaturalNumber(fields[1], &line)\n      || !ParseNaturalNumber(fields[2], &index)\n      || !ParseNaturalNumber(fields[3], &parent_process_id)\n      || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)\n      || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {\n    DeathTestAbort(\"Bad --gtest_internal_run_death_test flag: \" +\n                   GTEST_FLAG(internal_run_death_test));\n  }\n  write_fd = GetStatusFileDescriptor(parent_process_id,\n                                     write_handle_as_size_t,\n                                     event_handle_as_size_t);\n\n# elif GTEST_OS_FUCHSIA\n\n  if (fields.size() != 3\n      || !ParseNaturalNumber(fields[1], &line)\n      || !ParseNaturalNumber(fields[2], &index)) {\n    DeathTestAbort(\"Bad --gtest_internal_run_death_test flag: \"\n        + GTEST_FLAG(internal_run_death_test));\n  }\n\n# else\n\n  if (fields.size() != 4\n      || !ParseNaturalNumber(fields[1], &line)\n      || !ParseNaturalNumber(fields[2], &index)\n      || !ParseNaturalNumber(fields[3], &write_fd)) {\n    DeathTestAbort(\"Bad --gtest_internal_run_death_test flag: \"\n        + GTEST_FLAG(internal_run_death_test));\n  }\n\n# endif  // GTEST_OS_WINDOWS\n\n  return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);\n}\n\n}  // namespace internal\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/src/gtest-filepath.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"gtest/internal/gtest-filepath.h\"\n\n#include <stdlib.h>\n#include \"gtest/internal/gtest-port.h\"\n#include \"gtest/gtest-message.h\"\n\n#if GTEST_OS_WINDOWS_MOBILE\n# include <windows.h>\n#elif GTEST_OS_WINDOWS\n# include <direct.h>\n# include <io.h>\n#elif GTEST_OS_SYMBIAN\n// Symbian OpenC has PATH_MAX in sys/syslimits.h\n# include <sys/syslimits.h>\n#else\n# include <limits.h>\n# include <climits>  // Some Linux distributions define PATH_MAX here.\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n#include \"gtest/internal/gtest-string.h\"\n\n#if GTEST_OS_WINDOWS\n# define GTEST_PATH_MAX_ _MAX_PATH\n#elif defined(PATH_MAX)\n# define GTEST_PATH_MAX_ PATH_MAX\n#elif defined(_XOPEN_PATH_MAX)\n# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX\n#else\n# define GTEST_PATH_MAX_ _POSIX_PATH_MAX\n#endif  // GTEST_OS_WINDOWS\n\nnamespace testing {\nnamespace internal {\n\n#if GTEST_OS_WINDOWS\n// On Windows, '\\\\' is the standard path separator, but many tools and the\n// Windows API also accept '/' as an alternate path separator. Unless otherwise\n// noted, a file path can contain either kind of path separators, or a mixture\n// of them.\nconst char kPathSeparator = '\\\\';\nconst char kAlternatePathSeparator = '/';\nconst char kAlternatePathSeparatorString[] = \"/\";\n# if GTEST_OS_WINDOWS_MOBILE\n// Windows CE doesn't have a current directory. You should not use\n// the current directory in tests on Windows CE, but this at least\n// provides a reasonable fallback.\nconst char kCurrentDirectoryString[] = \"\\\\\";\n// Windows CE doesn't define INVALID_FILE_ATTRIBUTES\nconst DWORD kInvalidFileAttributes = 0xffffffff;\n# else\nconst char kCurrentDirectoryString[] = \".\\\\\";\n# endif  // GTEST_OS_WINDOWS_MOBILE\n#else\nconst char kPathSeparator = '/';\nconst char kCurrentDirectoryString[] = \"./\";\n#endif  // GTEST_OS_WINDOWS\n\n// Returns whether the given character is a valid path separator.\nstatic bool IsPathSeparator(char c) {\n#if GTEST_HAS_ALT_PATH_SEP_\n  return (c == kPathSeparator) || (c == kAlternatePathSeparator);\n#else\n  return c == kPathSeparator;\n#endif\n}\n\n// Returns the current working directory, or \"\" if unsuccessful.\nFilePath FilePath::GetCurrentDir() {\n#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT\n  // Windows CE doesn't have a current directory, so we just return\n  // something reasonable.\n  return FilePath(kCurrentDirectoryString);\n#elif GTEST_OS_WINDOWS\n  char cwd[GTEST_PATH_MAX_ + 1] = { '\\0' };\n  return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? \"\" : cwd);\n#else\n  char cwd[GTEST_PATH_MAX_ + 1] = { '\\0' };\n  char* result = getcwd(cwd, sizeof(cwd));\n# if GTEST_OS_NACL\n  // getcwd will likely fail in NaCl due to the sandbox, so return something\n  // reasonable. The user may have provided a shim implementation for getcwd,\n  // however, so fallback only when failure is detected.\n  return FilePath(result == NULL ? kCurrentDirectoryString : cwd);\n# endif  // GTEST_OS_NACL\n  return FilePath(result == NULL ? \"\" : cwd);\n#endif  // GTEST_OS_WINDOWS_MOBILE\n}\n\n// Returns a copy of the FilePath with the case-insensitive extension removed.\n// Example: FilePath(\"dir/file.exe\").RemoveExtension(\"EXE\") returns\n// FilePath(\"dir/file\"). If a case-insensitive extension is not\n// found, returns a copy of the original FilePath.\nFilePath FilePath::RemoveExtension(const char* extension) const {\n  const std::string dot_extension = std::string(\".\") + extension;\n  if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) {\n    return FilePath(pathname_.substr(\n        0, pathname_.length() - dot_extension.length()));\n  }\n  return *this;\n}\n\n// Returns a pointer to the last occurrence of a valid path separator in\n// the FilePath. On Windows, for example, both '/' and '\\' are valid path\n// separators. Returns NULL if no path separator was found.\nconst char* FilePath::FindLastPathSeparator() const {\n  const char* const last_sep = strrchr(c_str(), kPathSeparator);\n#if GTEST_HAS_ALT_PATH_SEP_\n  const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);\n  // Comparing two pointers of which only one is NULL is undefined.\n  if (last_alt_sep != NULL &&\n      (last_sep == NULL || last_alt_sep > last_sep)) {\n    return last_alt_sep;\n  }\n#endif\n  return last_sep;\n}\n\n// Returns a copy of the FilePath with the directory part removed.\n// Example: FilePath(\"path/to/file\").RemoveDirectoryName() returns\n// FilePath(\"file\"). If there is no directory part (\"just_a_file\"), it returns\n// the FilePath unmodified. If there is no file part (\"just_a_dir/\") it\n// returns an empty FilePath (\"\").\n// On Windows platform, '\\' is the path separator, otherwise it is '/'.\nFilePath FilePath::RemoveDirectoryName() const {\n  const char* const last_sep = FindLastPathSeparator();\n  return last_sep ? FilePath(last_sep + 1) : *this;\n}\n\n// RemoveFileName returns the directory path with the filename removed.\n// Example: FilePath(\"path/to/file\").RemoveFileName() returns \"path/to/\".\n// If the FilePath is \"a_file\" or \"/a_file\", RemoveFileName returns\n// FilePath(\"./\") or, on Windows, FilePath(\".\\\\\"). If the filepath does\n// not have a file, like \"just/a/dir/\", it returns the FilePath unmodified.\n// On Windows platform, '\\' is the path separator, otherwise it is '/'.\nFilePath FilePath::RemoveFileName() const {\n  const char* const last_sep = FindLastPathSeparator();\n  std::string dir;\n  if (last_sep) {\n    dir = std::string(c_str(), last_sep + 1 - c_str());\n  } else {\n    dir = kCurrentDirectoryString;\n  }\n  return FilePath(dir);\n}\n\n// Helper functions for naming files in a directory for xml output.\n\n// Given directory = \"dir\", base_name = \"test\", number = 0,\n// extension = \"xml\", returns \"dir/test.xml\". If number is greater\n// than zero (e.g., 12), returns \"dir/test_12.xml\".\n// On Windows platform, uses \\ as the separator rather than /.\nFilePath FilePath::MakeFileName(const FilePath& directory,\n                                const FilePath& base_name,\n                                int number,\n                                const char* extension) {\n  std::string file;\n  if (number == 0) {\n    file = base_name.string() + \".\" + extension;\n  } else {\n    file = base_name.string() + \"_\" + StreamableToString(number)\n        + \".\" + extension;\n  }\n  return ConcatPaths(directory, FilePath(file));\n}\n\n// Given directory = \"dir\", relative_path = \"test.xml\", returns \"dir/test.xml\".\n// On Windows, uses \\ as the separator rather than /.\nFilePath FilePath::ConcatPaths(const FilePath& directory,\n                               const FilePath& relative_path) {\n  if (directory.IsEmpty())\n    return relative_path;\n  const FilePath dir(directory.RemoveTrailingPathSeparator());\n  return FilePath(dir.string() + kPathSeparator + relative_path.string());\n}\n\n// Returns true if pathname describes something findable in the file-system,\n// either a file, directory, or whatever.\nbool FilePath::FileOrDirectoryExists() const {\n#if GTEST_OS_WINDOWS_MOBILE\n  LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());\n  const DWORD attributes = GetFileAttributes(unicode);\n  delete [] unicode;\n  return attributes != kInvalidFileAttributes;\n#else\n  posix::StatStruct file_stat;\n  return posix::Stat(pathname_.c_str(), &file_stat) == 0;\n#endif  // GTEST_OS_WINDOWS_MOBILE\n}\n\n// Returns true if pathname describes a directory in the file-system\n// that exists.\nbool FilePath::DirectoryExists() const {\n  bool result = false;\n#if GTEST_OS_WINDOWS\n  // Don't strip off trailing separator if path is a root directory on\n  // Windows (like \"C:\\\\\").\n  const FilePath& path(IsRootDirectory() ? *this :\n                                           RemoveTrailingPathSeparator());\n#else\n  const FilePath& path(*this);\n#endif\n\n#if GTEST_OS_WINDOWS_MOBILE\n  LPCWSTR unicode = String::AnsiToUtf16(path.c_str());\n  const DWORD attributes = GetFileAttributes(unicode);\n  delete [] unicode;\n  if ((attributes != kInvalidFileAttributes) &&\n      (attributes & FILE_ATTRIBUTE_DIRECTORY)) {\n    result = true;\n  }\n#else\n  posix::StatStruct file_stat;\n  result = posix::Stat(path.c_str(), &file_stat) == 0 &&\n      posix::IsDir(file_stat);\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n  return result;\n}\n\n// Returns true if pathname describes a root directory. (Windows has one\n// root directory per disk drive.)\nbool FilePath::IsRootDirectory() const {\n#if GTEST_OS_WINDOWS\n  // FIXME: on Windows a network share like\n  // \\\\server\\share can be a root directory, although it cannot be the\n  // current directory.  Handle this properly.\n  return pathname_.length() == 3 && IsAbsolutePath();\n#else\n  return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);\n#endif\n}\n\n// Returns true if pathname describes an absolute path.\nbool FilePath::IsAbsolutePath() const {\n  const char* const name = pathname_.c_str();\n#if GTEST_OS_WINDOWS\n  return pathname_.length() >= 3 &&\n     ((name[0] >= 'a' && name[0] <= 'z') ||\n      (name[0] >= 'A' && name[0] <= 'Z')) &&\n     name[1] == ':' &&\n     IsPathSeparator(name[2]);\n#else\n  return IsPathSeparator(name[0]);\n#endif\n}\n\n// Returns a pathname for a file that does not currently exist. The pathname\n// will be directory/base_name.extension or\n// directory/base_name_<number>.extension if directory/base_name.extension\n// already exists. The number will be incremented until a pathname is found\n// that does not already exist.\n// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.\n// There could be a race condition if two or more processes are calling this\n// function at the same time -- they could both pick the same filename.\nFilePath FilePath::GenerateUniqueFileName(const FilePath& directory,\n                                          const FilePath& base_name,\n                                          const char* extension) {\n  FilePath full_pathname;\n  int number = 0;\n  do {\n    full_pathname.Set(MakeFileName(directory, base_name, number++, extension));\n  } while (full_pathname.FileOrDirectoryExists());\n  return full_pathname;\n}\n\n// Returns true if FilePath ends with a path separator, which indicates that\n// it is intended to represent a directory. Returns false otherwise.\n// This does NOT check that a directory (or file) actually exists.\nbool FilePath::IsDirectory() const {\n  return !pathname_.empty() &&\n         IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);\n}\n\n// Create directories so that path exists. Returns true if successful or if\n// the directories already exist; returns false if unable to create directories\n// for any reason.\nbool FilePath::CreateDirectoriesRecursively() const {\n  if (!this->IsDirectory()) {\n    return false;\n  }\n\n  if (pathname_.length() == 0 || this->DirectoryExists()) {\n    return true;\n  }\n\n  const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());\n  return parent.CreateDirectoriesRecursively() && this->CreateFolder();\n}\n\n// Create the directory so that path exists. Returns true if successful or\n// if the directory already exists; returns false if unable to create the\n// directory for any reason, including if the parent directory does not\n// exist. Not named \"CreateDirectory\" because that's a macro on Windows.\nbool FilePath::CreateFolder() const {\n#if GTEST_OS_WINDOWS_MOBILE\n  FilePath removed_sep(this->RemoveTrailingPathSeparator());\n  LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());\n  int result = CreateDirectory(unicode, NULL) ? 0 : -1;\n  delete [] unicode;\n#elif GTEST_OS_WINDOWS\n  int result = _mkdir(pathname_.c_str());\n#else\n  int result = mkdir(pathname_.c_str(), 0777);\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n  if (result == -1) {\n    return this->DirectoryExists();  // An error is OK if the directory exists.\n  }\n  return true;  // No error.\n}\n\n// If input name has a trailing separator character, remove it and return the\n// name, otherwise return the name string unmodified.\n// On Windows platform, uses \\ as the separator, other platforms use /.\nFilePath FilePath::RemoveTrailingPathSeparator() const {\n  return IsDirectory()\n      ? FilePath(pathname_.substr(0, pathname_.length() - 1))\n      : *this;\n}\n\n// Removes any redundant separators that might be in the pathname.\n// For example, \"bar///foo\" becomes \"bar/foo\". Does not eliminate other\n// redundancies that might be in a pathname involving \".\" or \"..\".\n// FIXME: handle Windows network shares (e.g. \\\\server\\share).\nvoid FilePath::Normalize() {\n  if (pathname_.c_str() == NULL) {\n    pathname_ = \"\";\n    return;\n  }\n  const char* src = pathname_.c_str();\n  char* const dest = new char[pathname_.length() + 1];\n  char* dest_ptr = dest;\n  memset(dest_ptr, 0, pathname_.length() + 1);\n\n  while (*src != '\\0') {\n    *dest_ptr = *src;\n    if (!IsPathSeparator(*src)) {\n      src++;\n    } else {\n#if GTEST_HAS_ALT_PATH_SEP_\n      if (*dest_ptr == kAlternatePathSeparator) {\n        *dest_ptr = kPathSeparator;\n      }\n#endif\n      while (IsPathSeparator(*src))\n        src++;\n    }\n    dest_ptr++;\n  }\n  *dest_ptr = '\\0';\n  pathname_ = dest;\n  delete[] dest;\n}\n\n}  // namespace internal\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/src/gtest-internal-inl.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Utility functions and classes used by the Google C++ testing framework.//\n// This file contains purely Google Test's internal implementation.  Please\n// DO NOT #INCLUDE IT IN A USER PROGRAM.\n\n#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_\n#define GTEST_SRC_GTEST_INTERNAL_INL_H_\n\n#ifndef _WIN32_WCE\n# include <errno.h>\n#endif  // !_WIN32_WCE\n#include <stddef.h>\n#include <stdlib.h>  // For strtoll/_strtoul64/malloc/free.\n#include <string.h>  // For memmove.\n\n#include <algorithm>\n#include <string>\n#include <vector>\n\n#include \"gtest/internal/gtest-port.h\"\n\n#if GTEST_CAN_STREAM_RESULTS_\n# include <arpa/inet.h>  // NOLINT\n# include <netdb.h>  // NOLINT\n#endif\n\n#if GTEST_OS_WINDOWS\n# include <windows.h>  // NOLINT\n#endif  // GTEST_OS_WINDOWS\n\n#include \"gtest/gtest.h\"\n#include \"gtest/gtest-spi.h\"\n\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \\\n/* class A needs to have dll-interface to be used by clients of class B */)\n\nnamespace testing {\n\n// Declares the flags.\n//\n// We don't want the users to modify this flag in the code, but want\n// Google Test's own unit tests to be able to access it. Therefore we\n// declare it here as opposed to in gtest.h.\nGTEST_DECLARE_bool_(death_test_use_fork);\n\nnamespace internal {\n\n// The value of GetTestTypeId() as seen from within the Google Test\n// library.  This is solely for testing GetTestTypeId().\nGTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;\n\n// Names of the flags (needed for parsing Google Test flags).\nconst char kAlsoRunDisabledTestsFlag[] = \"also_run_disabled_tests\";\nconst char kBreakOnFailureFlag[] = \"break_on_failure\";\nconst char kCatchExceptionsFlag[] = \"catch_exceptions\";\nconst char kColorFlag[] = \"color\";\nconst char kFilterFlag[] = \"filter\";\nconst char kListTestsFlag[] = \"list_tests\";\nconst char kOutputFlag[] = \"output\";\nconst char kPrintTimeFlag[] = \"print_time\";\nconst char kPrintUTF8Flag[] = \"print_utf8\";\nconst char kRandomSeedFlag[] = \"random_seed\";\nconst char kRepeatFlag[] = \"repeat\";\nconst char kShuffleFlag[] = \"shuffle\";\nconst char kStackTraceDepthFlag[] = \"stack_trace_depth\";\nconst char kStreamResultToFlag[] = \"stream_result_to\";\nconst char kThrowOnFailureFlag[] = \"throw_on_failure\";\nconst char kFlagfileFlag[] = \"flagfile\";\n\n// A valid random seed must be in [1, kMaxRandomSeed].\nconst int kMaxRandomSeed = 99999;\n\n// g_help_flag is true iff the --help flag or an equivalent form is\n// specified on the command line.\nGTEST_API_ extern bool g_help_flag;\n\n// Returns the current time in milliseconds.\nGTEST_API_ TimeInMillis GetTimeInMillis();\n\n// Returns true iff Google Test should use colors in the output.\nGTEST_API_ bool ShouldUseColor(bool stdout_is_tty);\n\n// Formats the given time in milliseconds as seconds.\nGTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);\n\n// Converts the given time in milliseconds to a date string in the ISO 8601\n// format, without the timezone information.  N.B.: due to the use the\n// non-reentrant localtime() function, this function is not thread safe.  Do\n// not use it in any code that can be called from multiple threads.\nGTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);\n\n// Parses a string for an Int32 flag, in the form of \"--flag=value\".\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\nGTEST_API_ bool ParseInt32Flag(\n    const char* str, const char* flag, Int32* value);\n\n// Returns a random seed in range [1, kMaxRandomSeed] based on the\n// given --gtest_random_seed flag value.\ninline int GetRandomSeedFromFlag(Int32 random_seed_flag) {\n  const unsigned int raw_seed = (random_seed_flag == 0) ?\n      static_cast<unsigned int>(GetTimeInMillis()) :\n      static_cast<unsigned int>(random_seed_flag);\n\n  // Normalizes the actual seed to range [1, kMaxRandomSeed] such that\n  // it's easy to type.\n  const int normalized_seed =\n      static_cast<int>((raw_seed - 1U) %\n                       static_cast<unsigned int>(kMaxRandomSeed)) + 1;\n  return normalized_seed;\n}\n\n// Returns the first valid random seed after 'seed'.  The behavior is\n// undefined if 'seed' is invalid.  The seed after kMaxRandomSeed is\n// considered to be 1.\ninline int GetNextRandomSeed(int seed) {\n  GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)\n      << \"Invalid random seed \" << seed << \" - must be in [1, \"\n      << kMaxRandomSeed << \"].\";\n  const int next_seed = seed + 1;\n  return (next_seed > kMaxRandomSeed) ? 1 : next_seed;\n}\n\n// This class saves the values of all Google Test flags in its c'tor, and\n// restores them in its d'tor.\nclass GTestFlagSaver {\n public:\n  // The c'tor.\n  GTestFlagSaver() {\n    also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);\n    break_on_failure_ = GTEST_FLAG(break_on_failure);\n    catch_exceptions_ = GTEST_FLAG(catch_exceptions);\n    color_ = GTEST_FLAG(color);\n    death_test_style_ = GTEST_FLAG(death_test_style);\n    death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);\n    filter_ = GTEST_FLAG(filter);\n    internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);\n    list_tests_ = GTEST_FLAG(list_tests);\n    output_ = GTEST_FLAG(output);\n    print_time_ = GTEST_FLAG(print_time);\n    print_utf8_ = GTEST_FLAG(print_utf8);\n    random_seed_ = GTEST_FLAG(random_seed);\n    repeat_ = GTEST_FLAG(repeat);\n    shuffle_ = GTEST_FLAG(shuffle);\n    stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);\n    stream_result_to_ = GTEST_FLAG(stream_result_to);\n    throw_on_failure_ = GTEST_FLAG(throw_on_failure);\n  }\n\n  // The d'tor is not virtual.  DO NOT INHERIT FROM THIS CLASS.\n  ~GTestFlagSaver() {\n    GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;\n    GTEST_FLAG(break_on_failure) = break_on_failure_;\n    GTEST_FLAG(catch_exceptions) = catch_exceptions_;\n    GTEST_FLAG(color) = color_;\n    GTEST_FLAG(death_test_style) = death_test_style_;\n    GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;\n    GTEST_FLAG(filter) = filter_;\n    GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;\n    GTEST_FLAG(list_tests) = list_tests_;\n    GTEST_FLAG(output) = output_;\n    GTEST_FLAG(print_time) = print_time_;\n    GTEST_FLAG(print_utf8) = print_utf8_;\n    GTEST_FLAG(random_seed) = random_seed_;\n    GTEST_FLAG(repeat) = repeat_;\n    GTEST_FLAG(shuffle) = shuffle_;\n    GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;\n    GTEST_FLAG(stream_result_to) = stream_result_to_;\n    GTEST_FLAG(throw_on_failure) = throw_on_failure_;\n  }\n\n private:\n  // Fields for saving the original values of flags.\n  bool also_run_disabled_tests_;\n  bool break_on_failure_;\n  bool catch_exceptions_;\n  std::string color_;\n  std::string death_test_style_;\n  bool death_test_use_fork_;\n  std::string filter_;\n  std::string internal_run_death_test_;\n  bool list_tests_;\n  std::string output_;\n  bool print_time_;\n  bool print_utf8_;\n  internal::Int32 random_seed_;\n  internal::Int32 repeat_;\n  bool shuffle_;\n  internal::Int32 stack_trace_depth_;\n  std::string stream_result_to_;\n  bool throw_on_failure_;\n} GTEST_ATTRIBUTE_UNUSED_;\n\n// Converts a Unicode code point to a narrow string in UTF-8 encoding.\n// code_point parameter is of type UInt32 because wchar_t may not be\n// wide enough to contain a code point.\n// If the code_point is not a valid Unicode code point\n// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted\n// to \"(Invalid Unicode 0xXXXXXXXX)\".\nGTEST_API_ std::string CodePointToUtf8(UInt32 code_point);\n\n// Converts a wide string to a narrow string in UTF-8 encoding.\n// The wide string is assumed to have the following encoding:\n//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)\n//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)\n// Parameter str points to a null-terminated wide string.\n// Parameter num_chars may additionally limit the number\n// of wchar_t characters processed. -1 is used when the entire string\n// should be processed.\n// If the string contains code points that are not valid Unicode code points\n// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output\n// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding\n// and contains invalid UTF-16 surrogate pairs, values in those pairs\n// will be encoded as individual Unicode characters from Basic Normal Plane.\nGTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars);\n\n// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file\n// if the variable is present. If a file already exists at this location, this\n// function will write over it. If the variable is present, but the file cannot\n// be created, prints an error and exits.\nvoid WriteToShardStatusFileIfNeeded();\n\n// Checks whether sharding is enabled by examining the relevant\n// environment variable values. If the variables are present,\n// but inconsistent (e.g., shard_index >= total_shards), prints\n// an error and exits. If in_subprocess_for_death_test, sharding is\n// disabled because it must only be applied to the original test\n// process. Otherwise, we could filter out death tests we intended to execute.\nGTEST_API_ bool ShouldShard(const char* total_shards_str,\n                            const char* shard_index_str,\n                            bool in_subprocess_for_death_test);\n\n// Parses the environment variable var as an Int32. If it is unset,\n// returns default_val. If it is not an Int32, prints an error and\n// and aborts.\nGTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);\n\n// Given the total number of shards, the shard index, and the test id,\n// returns true iff the test should be run on this shard. The test id is\n// some arbitrary but unique non-negative integer assigned to each test\n// method. Assumes that 0 <= shard_index < total_shards.\nGTEST_API_ bool ShouldRunTestOnShard(\n    int total_shards, int shard_index, int test_id);\n\n// STL container utilities.\n\n// Returns the number of elements in the given container that satisfy\n// the given predicate.\ntemplate <class Container, typename Predicate>\ninline int CountIf(const Container& c, Predicate predicate) {\n  // Implemented as an explicit loop since std::count_if() in libCstd on\n  // Solaris has a non-standard signature.\n  int count = 0;\n  for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {\n    if (predicate(*it))\n      ++count;\n  }\n  return count;\n}\n\n// Applies a function/functor to each element in the container.\ntemplate <class Container, typename Functor>\nvoid ForEach(const Container& c, Functor functor) {\n  std::for_each(c.begin(), c.end(), functor);\n}\n\n// Returns the i-th element of the vector, or default_value if i is not\n// in range [0, v.size()).\ntemplate <typename E>\ninline E GetElementOr(const std::vector<E>& v, int i, E default_value) {\n  return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];\n}\n\n// Performs an in-place shuffle of a range of the vector's elements.\n// 'begin' and 'end' are element indices as an STL-style range;\n// i.e. [begin, end) are shuffled, where 'end' == size() means to\n// shuffle to the end of the vector.\ntemplate <typename E>\nvoid ShuffleRange(internal::Random* random, int begin, int end,\n                  std::vector<E>* v) {\n  const int size = static_cast<int>(v->size());\n  GTEST_CHECK_(0 <= begin && begin <= size)\n      << \"Invalid shuffle range start \" << begin << \": must be in range [0, \"\n      << size << \"].\";\n  GTEST_CHECK_(begin <= end && end <= size)\n      << \"Invalid shuffle range finish \" << end << \": must be in range [\"\n      << begin << \", \" << size << \"].\";\n\n  // Fisher-Yates shuffle, from\n  // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle\n  for (int range_width = end - begin; range_width >= 2; range_width--) {\n    const int last_in_range = begin + range_width - 1;\n    const int selected = begin + random->Generate(range_width);\n    std::swap((*v)[selected], (*v)[last_in_range]);\n  }\n}\n\n// Performs an in-place shuffle of the vector's elements.\ntemplate <typename E>\ninline void Shuffle(internal::Random* random, std::vector<E>* v) {\n  ShuffleRange(random, 0, static_cast<int>(v->size()), v);\n}\n\n// A function for deleting an object.  Handy for being used as a\n// functor.\ntemplate <typename T>\nstatic void Delete(T* x) {\n  delete x;\n}\n\n// A predicate that checks the key of a TestProperty against a known key.\n//\n// TestPropertyKeyIs is copyable.\nclass TestPropertyKeyIs {\n public:\n  // Constructor.\n  //\n  // TestPropertyKeyIs has NO default constructor.\n  explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}\n\n  // Returns true iff the test name of test property matches on key_.\n  bool operator()(const TestProperty& test_property) const {\n    return test_property.key() == key_;\n  }\n\n private:\n  std::string key_;\n};\n\n// Class UnitTestOptions.\n//\n// This class contains functions for processing options the user\n// specifies when running the tests.  It has only static members.\n//\n// In most cases, the user can specify an option using either an\n// environment variable or a command line flag.  E.g. you can set the\n// test filter using either GTEST_FILTER or --gtest_filter.  If both\n// the variable and the flag are present, the latter overrides the\n// former.\nclass GTEST_API_ UnitTestOptions {\n public:\n  // Functions for processing the gtest_output flag.\n\n  // Returns the output format, or \"\" for normal printed output.\n  static std::string GetOutputFormat();\n\n  // Returns the absolute path of the requested output file, or the\n  // default (test_detail.xml in the original working directory) if\n  // none was explicitly specified.\n  static std::string GetAbsolutePathToOutputFile();\n\n  // Functions for processing the gtest_filter flag.\n\n  // Returns true iff the wildcard pattern matches the string.  The\n  // first ':' or '\\0' character in pattern marks the end of it.\n  //\n  // This recursive algorithm isn't very efficient, but is clear and\n  // works well enough for matching test names, which are short.\n  static bool PatternMatchesString(const char *pattern, const char *str);\n\n  // Returns true iff the user-specified filter matches the test case\n  // name and the test name.\n  static bool FilterMatchesTest(const std::string &test_case_name,\n                                const std::string &test_name);\n\n#if GTEST_OS_WINDOWS\n  // Function for supporting the gtest_catch_exception flag.\n\n  // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the\n  // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.\n  // This function is useful as an __except condition.\n  static int GTestShouldProcessSEH(DWORD exception_code);\n#endif  // GTEST_OS_WINDOWS\n\n  // Returns true if \"name\" matches the ':' separated list of glob-style\n  // filters in \"filter\".\n  static bool MatchesFilter(const std::string& name, const char* filter);\n};\n\n// Returns the current application's name, removing directory path if that\n// is present.  Used by UnitTestOptions::GetOutputFile.\nGTEST_API_ FilePath GetCurrentExecutableName();\n\n// The role interface for getting the OS stack trace as a string.\nclass OsStackTraceGetterInterface {\n public:\n  OsStackTraceGetterInterface() {}\n  virtual ~OsStackTraceGetterInterface() {}\n\n  // Returns the current OS stack trace as an std::string.  Parameters:\n  //\n  //   max_depth  - the maximum number of stack frames to be included\n  //                in the trace.\n  //   skip_count - the number of top frames to be skipped; doesn't count\n  //                against max_depth.\n  virtual std::string CurrentStackTrace(int max_depth, int skip_count) = 0;\n\n  // UponLeavingGTest() should be called immediately before Google Test calls\n  // user code. It saves some information about the current stack that\n  // CurrentStackTrace() will use to find and hide Google Test stack frames.\n  virtual void UponLeavingGTest() = 0;\n\n  // This string is inserted in place of stack frames that are part of\n  // Google Test's implementation.\n  static const char* const kElidedFramesMarker;\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);\n};\n\n// A working implementation of the OsStackTraceGetterInterface interface.\nclass OsStackTraceGetter : public OsStackTraceGetterInterface {\n public:\n  OsStackTraceGetter() {}\n\n  virtual std::string CurrentStackTrace(int max_depth, int skip_count);\n  virtual void UponLeavingGTest();\n\n private:\n#if GTEST_HAS_ABSL\n  Mutex mutex_;  // Protects all internal state.\n\n  // We save the stack frame below the frame that calls user code.\n  // We do this because the address of the frame immediately below\n  // the user code changes between the call to UponLeavingGTest()\n  // and any calls to the stack trace code from within the user code.\n  void* caller_frame_ = nullptr;\n#endif  // GTEST_HAS_ABSL\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);\n};\n\n// Information about a Google Test trace point.\nstruct TraceInfo {\n  const char* file;\n  int line;\n  std::string message;\n};\n\n// This is the default global test part result reporter used in UnitTestImpl.\n// This class should only be used by UnitTestImpl.\nclass DefaultGlobalTestPartResultReporter\n  : public TestPartResultReporterInterface {\n public:\n  explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);\n  // Implements the TestPartResultReporterInterface. Reports the test part\n  // result in the current test.\n  virtual void ReportTestPartResult(const TestPartResult& result);\n\n private:\n  UnitTestImpl* const unit_test_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);\n};\n\n// This is the default per thread test part result reporter used in\n// UnitTestImpl. This class should only be used by UnitTestImpl.\nclass DefaultPerThreadTestPartResultReporter\n    : public TestPartResultReporterInterface {\n public:\n  explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);\n  // Implements the TestPartResultReporterInterface. The implementation just\n  // delegates to the current global test part result reporter of *unit_test_.\n  virtual void ReportTestPartResult(const TestPartResult& result);\n\n private:\n  UnitTestImpl* const unit_test_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);\n};\n\n// The private implementation of the UnitTest class.  We don't protect\n// the methods under a mutex, as this class is not accessible by a\n// user and the UnitTest class that delegates work to this class does\n// proper locking.\nclass GTEST_API_ UnitTestImpl {\n public:\n  explicit UnitTestImpl(UnitTest* parent);\n  virtual ~UnitTestImpl();\n\n  // There are two different ways to register your own TestPartResultReporter.\n  // You can register your own repoter to listen either only for test results\n  // from the current thread or for results from all threads.\n  // By default, each per-thread test result repoter just passes a new\n  // TestPartResult to the global test result reporter, which registers the\n  // test part result for the currently running test.\n\n  // Returns the global test part result reporter.\n  TestPartResultReporterInterface* GetGlobalTestPartResultReporter();\n\n  // Sets the global test part result reporter.\n  void SetGlobalTestPartResultReporter(\n      TestPartResultReporterInterface* reporter);\n\n  // Returns the test part result reporter for the current thread.\n  TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();\n\n  // Sets the test part result reporter for the current thread.\n  void SetTestPartResultReporterForCurrentThread(\n      TestPartResultReporterInterface* reporter);\n\n  // Gets the number of successful test cases.\n  int successful_test_case_count() const;\n\n  // Gets the number of failed test cases.\n  int failed_test_case_count() const;\n\n  // Gets the number of all test cases.\n  int total_test_case_count() const;\n\n  // Gets the number of all test cases that contain at least one test\n  // that should run.\n  int test_case_to_run_count() const;\n\n  // Gets the number of successful tests.\n  int successful_test_count() const;\n\n  // Gets the number of failed tests.\n  int failed_test_count() const;\n\n  // Gets the number of disabled tests that will be reported in the XML report.\n  int reportable_disabled_test_count() const;\n\n  // Gets the number of disabled tests.\n  int disabled_test_count() const;\n\n  // Gets the number of tests to be printed in the XML report.\n  int reportable_test_count() const;\n\n  // Gets the number of all tests.\n  int total_test_count() const;\n\n  // Gets the number of tests that should run.\n  int test_to_run_count() const;\n\n  // Gets the time of the test program start, in ms from the start of the\n  // UNIX epoch.\n  TimeInMillis start_timestamp() const { return start_timestamp_; }\n\n  // Gets the elapsed time, in milliseconds.\n  TimeInMillis elapsed_time() const { return elapsed_time_; }\n\n  // Returns true iff the unit test passed (i.e. all test cases passed).\n  bool Passed() const { return !Failed(); }\n\n  // Returns true iff the unit test failed (i.e. some test case failed\n  // or something outside of all tests failed).\n  bool Failed() const {\n    return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();\n  }\n\n  // Gets the i-th test case among all the test cases. i can range from 0 to\n  // total_test_case_count() - 1. If i is not in that range, returns NULL.\n  const TestCase* GetTestCase(int i) const {\n    const int index = GetElementOr(test_case_indices_, i, -1);\n    return index < 0 ? NULL : test_cases_[i];\n  }\n\n  // Gets the i-th test case among all the test cases. i can range from 0 to\n  // total_test_case_count() - 1. If i is not in that range, returns NULL.\n  TestCase* GetMutableTestCase(int i) {\n    const int index = GetElementOr(test_case_indices_, i, -1);\n    return index < 0 ? NULL : test_cases_[index];\n  }\n\n  // Provides access to the event listener list.\n  TestEventListeners* listeners() { return &listeners_; }\n\n  // Returns the TestResult for the test that's currently running, or\n  // the TestResult for the ad hoc test if no test is running.\n  TestResult* current_test_result();\n\n  // Returns the TestResult for the ad hoc test.\n  const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }\n\n  // Sets the OS stack trace getter.\n  //\n  // Does nothing if the input and the current OS stack trace getter\n  // are the same; otherwise, deletes the old getter and makes the\n  // input the current getter.\n  void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);\n\n  // Returns the current OS stack trace getter if it is not NULL;\n  // otherwise, creates an OsStackTraceGetter, makes it the current\n  // getter, and returns it.\n  OsStackTraceGetterInterface* os_stack_trace_getter();\n\n  // Returns the current OS stack trace as an std::string.\n  //\n  // The maximum number of stack frames to be included is specified by\n  // the gtest_stack_trace_depth flag.  The skip_count parameter\n  // specifies the number of top frames to be skipped, which doesn't\n  // count against the number of frames to be included.\n  //\n  // For example, if Foo() calls Bar(), which in turn calls\n  // CurrentOsStackTraceExceptTop(1), Foo() will be included in the\n  // trace but Bar() and CurrentOsStackTraceExceptTop() won't.\n  std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;\n\n  // Finds and returns a TestCase with the given name.  If one doesn't\n  // exist, creates one and returns it.\n  //\n  // Arguments:\n  //\n  //   test_case_name: name of the test case\n  //   type_param:     the name of the test's type parameter, or NULL if\n  //                   this is not a typed or a type-parameterized test.\n  //   set_up_tc:      pointer to the function that sets up the test case\n  //   tear_down_tc:   pointer to the function that tears down the test case\n  TestCase* GetTestCase(const char* test_case_name,\n                        const char* type_param,\n                        Test::SetUpTestCaseFunc set_up_tc,\n                        Test::TearDownTestCaseFunc tear_down_tc);\n\n  // Adds a TestInfo to the unit test.\n  //\n  // Arguments:\n  //\n  //   set_up_tc:    pointer to the function that sets up the test case\n  //   tear_down_tc: pointer to the function that tears down the test case\n  //   test_info:    the TestInfo object\n  void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,\n                   Test::TearDownTestCaseFunc tear_down_tc,\n                   TestInfo* test_info) {\n    // In order to support thread-safe death tests, we need to\n    // remember the original working directory when the test program\n    // was first invoked.  We cannot do this in RUN_ALL_TESTS(), as\n    // the user may have changed the current directory before calling\n    // RUN_ALL_TESTS().  Therefore we capture the current directory in\n    // AddTestInfo(), which is called to register a TEST or TEST_F\n    // before main() is reached.\n    if (original_working_dir_.IsEmpty()) {\n      original_working_dir_.Set(FilePath::GetCurrentDir());\n      GTEST_CHECK_(!original_working_dir_.IsEmpty())\n          << \"Failed to get the current working directory.\";\n    }\n\n    GetTestCase(test_info->test_case_name(),\n                test_info->type_param(),\n                set_up_tc,\n                tear_down_tc)->AddTestInfo(test_info);\n  }\n\n  // Returns ParameterizedTestCaseRegistry object used to keep track of\n  // value-parameterized tests and instantiate and register them.\n  internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {\n    return parameterized_test_registry_;\n  }\n\n  // Sets the TestCase object for the test that's currently running.\n  void set_current_test_case(TestCase* a_current_test_case) {\n    current_test_case_ = a_current_test_case;\n  }\n\n  // Sets the TestInfo object for the test that's currently running.  If\n  // current_test_info is NULL, the assertion results will be stored in\n  // ad_hoc_test_result_.\n  void set_current_test_info(TestInfo* a_current_test_info) {\n    current_test_info_ = a_current_test_info;\n  }\n\n  // Registers all parameterized tests defined using TEST_P and\n  // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter\n  // combination. This method can be called more then once; it has guards\n  // protecting from registering the tests more then once.  If\n  // value-parameterized tests are disabled, RegisterParameterizedTests is\n  // present but does nothing.\n  void RegisterParameterizedTests();\n\n  // Runs all tests in this UnitTest object, prints the result, and\n  // returns true if all tests are successful.  If any exception is\n  // thrown during a test, this test is considered to be failed, but\n  // the rest of the tests will still be run.\n  bool RunAllTests();\n\n  // Clears the results of all tests, except the ad hoc tests.\n  void ClearNonAdHocTestResult() {\n    ForEach(test_cases_, TestCase::ClearTestCaseResult);\n  }\n\n  // Clears the results of ad-hoc test assertions.\n  void ClearAdHocTestResult() {\n    ad_hoc_test_result_.Clear();\n  }\n\n  // Adds a TestProperty to the current TestResult object when invoked in a\n  // context of a test or a test case, or to the global property set. If the\n  // result already contains a property with the same key, the value will be\n  // updated.\n  void RecordProperty(const TestProperty& test_property);\n\n  enum ReactionToSharding {\n    HONOR_SHARDING_PROTOCOL,\n    IGNORE_SHARDING_PROTOCOL\n  };\n\n  // Matches the full name of each test against the user-specified\n  // filter to decide whether the test should run, then records the\n  // result in each TestCase and TestInfo object.\n  // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests\n  // based on sharding variables in the environment.\n  // Returns the number of tests that should run.\n  int FilterTests(ReactionToSharding shard_tests);\n\n  // Prints the names of the tests matching the user-specified filter flag.\n  void ListTestsMatchingFilter();\n\n  const TestCase* current_test_case() const { return current_test_case_; }\n  TestInfo* current_test_info() { return current_test_info_; }\n  const TestInfo* current_test_info() const { return current_test_info_; }\n\n  // Returns the vector of environments that need to be set-up/torn-down\n  // before/after the tests are run.\n  std::vector<Environment*>& environments() { return environments_; }\n\n  // Getters for the per-thread Google Test trace stack.\n  std::vector<TraceInfo>& gtest_trace_stack() {\n    return *(gtest_trace_stack_.pointer());\n  }\n  const std::vector<TraceInfo>& gtest_trace_stack() const {\n    return gtest_trace_stack_.get();\n  }\n\n#if GTEST_HAS_DEATH_TEST\n  void InitDeathTestSubprocessControlInfo() {\n    internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());\n  }\n  // Returns a pointer to the parsed --gtest_internal_run_death_test\n  // flag, or NULL if that flag was not specified.\n  // This information is useful only in a death test child process.\n  // Must not be called before a call to InitGoogleTest.\n  const InternalRunDeathTestFlag* internal_run_death_test_flag() const {\n    return internal_run_death_test_flag_.get();\n  }\n\n  // Returns a pointer to the current death test factory.\n  internal::DeathTestFactory* death_test_factory() {\n    return death_test_factory_.get();\n  }\n\n  void SuppressTestEventsIfInSubprocess();\n\n  friend class ReplaceDeathTestFactory;\n#endif  // GTEST_HAS_DEATH_TEST\n\n  // Initializes the event listener performing XML output as specified by\n  // UnitTestOptions. Must not be called before InitGoogleTest.\n  void ConfigureXmlOutput();\n\n#if GTEST_CAN_STREAM_RESULTS_\n  // Initializes the event listener for streaming test results to a socket.\n  // Must not be called before InitGoogleTest.\n  void ConfigureStreamingOutput();\n#endif\n\n  // Performs initialization dependent upon flag values obtained in\n  // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to\n  // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest\n  // this function is also called from RunAllTests.  Since this function can be\n  // called more than once, it has to be idempotent.\n  void PostFlagParsingInit();\n\n  // Gets the random seed used at the start of the current test iteration.\n  int random_seed() const { return random_seed_; }\n\n  // Gets the random number generator.\n  internal::Random* random() { return &random_; }\n\n  // Shuffles all test cases, and the tests within each test case,\n  // making sure that death tests are still run first.\n  void ShuffleTests();\n\n  // Restores the test cases and tests to their order before the first shuffle.\n  void UnshuffleTests();\n\n  // Returns the value of GTEST_FLAG(catch_exceptions) at the moment\n  // UnitTest::Run() starts.\n  bool catch_exceptions() const { return catch_exceptions_; }\n\n private:\n  friend class ::testing::UnitTest;\n\n  // Used by UnitTest::Run() to capture the state of\n  // GTEST_FLAG(catch_exceptions) at the moment it starts.\n  void set_catch_exceptions(bool value) { catch_exceptions_ = value; }\n\n  // The UnitTest object that owns this implementation object.\n  UnitTest* const parent_;\n\n  // The working directory when the first TEST() or TEST_F() was\n  // executed.\n  internal::FilePath original_working_dir_;\n\n  // The default test part result reporters.\n  DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;\n  DefaultPerThreadTestPartResultReporter\n      default_per_thread_test_part_result_reporter_;\n\n  // Points to (but doesn't own) the global test part result reporter.\n  TestPartResultReporterInterface* global_test_part_result_repoter_;\n\n  // Protects read and write access to global_test_part_result_reporter_.\n  internal::Mutex global_test_part_result_reporter_mutex_;\n\n  // Points to (but doesn't own) the per-thread test part result reporter.\n  internal::ThreadLocal<TestPartResultReporterInterface*>\n      per_thread_test_part_result_reporter_;\n\n  // The vector of environments that need to be set-up/torn-down\n  // before/after the tests are run.\n  std::vector<Environment*> environments_;\n\n  // The vector of TestCases in their original order.  It owns the\n  // elements in the vector.\n  std::vector<TestCase*> test_cases_;\n\n  // Provides a level of indirection for the test case list to allow\n  // easy shuffling and restoring the test case order.  The i-th\n  // element of this vector is the index of the i-th test case in the\n  // shuffled order.\n  std::vector<int> test_case_indices_;\n\n  // ParameterizedTestRegistry object used to register value-parameterized\n  // tests.\n  internal::ParameterizedTestCaseRegistry parameterized_test_registry_;\n\n  // Indicates whether RegisterParameterizedTests() has been called already.\n  bool parameterized_tests_registered_;\n\n  // Index of the last death test case registered.  Initially -1.\n  int last_death_test_case_;\n\n  // This points to the TestCase for the currently running test.  It\n  // changes as Google Test goes through one test case after another.\n  // When no test is running, this is set to NULL and Google Test\n  // stores assertion results in ad_hoc_test_result_.  Initially NULL.\n  TestCase* current_test_case_;\n\n  // This points to the TestInfo for the currently running test.  It\n  // changes as Google Test goes through one test after another.  When\n  // no test is running, this is set to NULL and Google Test stores\n  // assertion results in ad_hoc_test_result_.  Initially NULL.\n  TestInfo* current_test_info_;\n\n  // Normally, a user only writes assertions inside a TEST or TEST_F,\n  // or inside a function called by a TEST or TEST_F.  Since Google\n  // Test keeps track of which test is current running, it can\n  // associate such an assertion with the test it belongs to.\n  //\n  // If an assertion is encountered when no TEST or TEST_F is running,\n  // Google Test attributes the assertion result to an imaginary \"ad hoc\"\n  // test, and records the result in ad_hoc_test_result_.\n  TestResult ad_hoc_test_result_;\n\n  // The list of event listeners that can be used to track events inside\n  // Google Test.\n  TestEventListeners listeners_;\n\n  // The OS stack trace getter.  Will be deleted when the UnitTest\n  // object is destructed.  By default, an OsStackTraceGetter is used,\n  // but the user can set this field to use a custom getter if that is\n  // desired.\n  OsStackTraceGetterInterface* os_stack_trace_getter_;\n\n  // True iff PostFlagParsingInit() has been called.\n  bool post_flag_parse_init_performed_;\n\n  // The random number seed used at the beginning of the test run.\n  int random_seed_;\n\n  // Our random number generator.\n  internal::Random random_;\n\n  // The time of the test program start, in ms from the start of the\n  // UNIX epoch.\n  TimeInMillis start_timestamp_;\n\n  // How long the test took to run, in milliseconds.\n  TimeInMillis elapsed_time_;\n\n#if GTEST_HAS_DEATH_TEST\n  // The decomposed components of the gtest_internal_run_death_test flag,\n  // parsed when RUN_ALL_TESTS is called.\n  internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;\n  internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;\n#endif  // GTEST_HAS_DEATH_TEST\n\n  // A per-thread stack of traces created by the SCOPED_TRACE() macro.\n  internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;\n\n  // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()\n  // starts.\n  bool catch_exceptions_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);\n};  // class UnitTestImpl\n\n// Convenience function for accessing the global UnitTest\n// implementation object.\ninline UnitTestImpl* GetUnitTestImpl() {\n  return UnitTest::GetInstance()->impl();\n}\n\n#if GTEST_USES_SIMPLE_RE\n\n// Internal helper functions for implementing the simple regular\n// expression matcher.\nGTEST_API_ bool IsInSet(char ch, const char* str);\nGTEST_API_ bool IsAsciiDigit(char ch);\nGTEST_API_ bool IsAsciiPunct(char ch);\nGTEST_API_ bool IsRepeat(char ch);\nGTEST_API_ bool IsAsciiWhiteSpace(char ch);\nGTEST_API_ bool IsAsciiWordChar(char ch);\nGTEST_API_ bool IsValidEscape(char ch);\nGTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);\nGTEST_API_ bool ValidateRegex(const char* regex);\nGTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);\nGTEST_API_ bool MatchRepetitionAndRegexAtHead(\n    bool escaped, char ch, char repeat, const char* regex, const char* str);\nGTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);\n\n#endif  // GTEST_USES_SIMPLE_RE\n\n// Parses the command line for Google Test flags, without initializing\n// other parts of Google Test.\nGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);\nGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);\n\n#if GTEST_HAS_DEATH_TEST\n\n// Returns the message describing the last system error, regardless of the\n// platform.\nGTEST_API_ std::string GetLastErrnoDescription();\n\n// Attempts to parse a string into a positive integer pointed to by the\n// number parameter.  Returns true if that is possible.\n// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use\n// it here.\ntemplate <typename Integer>\nbool ParseNaturalNumber(const ::std::string& str, Integer* number) {\n  // Fail fast if the given string does not begin with a digit;\n  // this bypasses strtoXXX's \"optional leading whitespace and plus\n  // or minus sign\" semantics, which are undesirable here.\n  if (str.empty() || !IsDigit(str[0])) {\n    return false;\n  }\n  errno = 0;\n\n  char* end;\n  // BiggestConvertible is the largest integer type that system-provided\n  // string-to-number conversion routines can return.\n\n# if GTEST_OS_WINDOWS && !defined(__GNUC__)\n\n  // MSVC and C++ Builder define __int64 instead of the standard long long.\n  typedef unsigned __int64 BiggestConvertible;\n  const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);\n\n# else\n\n  typedef unsigned long long BiggestConvertible;  // NOLINT\n  const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);\n\n# endif  // GTEST_OS_WINDOWS && !defined(__GNUC__)\n\n  const bool parse_success = *end == '\\0' && errno == 0;\n\n  // FIXME: Convert this to compile time assertion when it is\n  // available.\n  GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));\n\n  const Integer result = static_cast<Integer>(parsed);\n  if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {\n    *number = result;\n    return true;\n  }\n  return false;\n}\n#endif  // GTEST_HAS_DEATH_TEST\n\n// TestResult contains some private methods that should be hidden from\n// Google Test user but are required for testing. This class allow our tests\n// to access them.\n//\n// This class is supplied only for the purpose of testing Google Test's own\n// constructs. Do not use it in user tests, either directly or indirectly.\nclass TestResultAccessor {\n public:\n  static void RecordProperty(TestResult* test_result,\n                             const std::string& xml_element,\n                             const TestProperty& property) {\n    test_result->RecordProperty(xml_element, property);\n  }\n\n  static void ClearTestPartResults(TestResult* test_result) {\n    test_result->ClearTestPartResults();\n  }\n\n  static const std::vector<testing::TestPartResult>& test_part_results(\n      const TestResult& test_result) {\n    return test_result.test_part_results();\n  }\n};\n\n#if GTEST_CAN_STREAM_RESULTS_\n\n// Streams test results to the given port on the given host machine.\nclass StreamingListener : public EmptyTestEventListener {\n public:\n  // Abstract base class for writing strings to a socket.\n  class AbstractSocketWriter {\n   public:\n    virtual ~AbstractSocketWriter() {}\n\n    // Sends a string to the socket.\n    virtual void Send(const std::string& message) = 0;\n\n    // Closes the socket.\n    virtual void CloseConnection() {}\n\n    // Sends a string and a newline to the socket.\n    void SendLn(const std::string& message) { Send(message + \"\\n\"); }\n  };\n\n  // Concrete class for actually writing strings to a socket.\n  class SocketWriter : public AbstractSocketWriter {\n   public:\n    SocketWriter(const std::string& host, const std::string& port)\n        : sockfd_(-1), host_name_(host), port_num_(port) {\n      MakeConnection();\n    }\n\n    virtual ~SocketWriter() {\n      if (sockfd_ != -1)\n        CloseConnection();\n    }\n\n    // Sends a string to the socket.\n    virtual void Send(const std::string& message) {\n      GTEST_CHECK_(sockfd_ != -1)\n          << \"Send() can be called only when there is a connection.\";\n\n      const int len = static_cast<int>(message.length());\n      if (write(sockfd_, message.c_str(), len) != len) {\n        GTEST_LOG_(WARNING)\n            << \"stream_result_to: failed to stream to \"\n            << host_name_ << \":\" << port_num_;\n      }\n    }\n\n   private:\n    // Creates a client socket and connects to the server.\n    void MakeConnection();\n\n    // Closes the socket.\n    void CloseConnection() {\n      GTEST_CHECK_(sockfd_ != -1)\n          << \"CloseConnection() can be called only when there is a connection.\";\n\n      close(sockfd_);\n      sockfd_ = -1;\n    }\n\n    int sockfd_;  // socket file descriptor\n    const std::string host_name_;\n    const std::string port_num_;\n\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter);\n  };  // class SocketWriter\n\n  // Escapes '=', '&', '%', and '\\n' characters in str as \"%xx\".\n  static std::string UrlEncode(const char* str);\n\n  StreamingListener(const std::string& host, const std::string& port)\n      : socket_writer_(new SocketWriter(host, port)) {\n    Start();\n  }\n\n  explicit StreamingListener(AbstractSocketWriter* socket_writer)\n      : socket_writer_(socket_writer) { Start(); }\n\n  void OnTestProgramStart(const UnitTest& /* unit_test */) {\n    SendLn(\"event=TestProgramStart\");\n  }\n\n  void OnTestProgramEnd(const UnitTest& unit_test) {\n    // Note that Google Test current only report elapsed time for each\n    // test iteration, not for the entire test program.\n    SendLn(\"event=TestProgramEnd&passed=\" + FormatBool(unit_test.Passed()));\n\n    // Notify the streaming server to stop.\n    socket_writer_->CloseConnection();\n  }\n\n  void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {\n    SendLn(\"event=TestIterationStart&iteration=\" +\n           StreamableToString(iteration));\n  }\n\n  void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {\n    SendLn(\"event=TestIterationEnd&passed=\" +\n           FormatBool(unit_test.Passed()) + \"&elapsed_time=\" +\n           StreamableToString(unit_test.elapsed_time()) + \"ms\");\n  }\n\n  void OnTestCaseStart(const TestCase& test_case) {\n    SendLn(std::string(\"event=TestCaseStart&name=\") + test_case.name());\n  }\n\n  void OnTestCaseEnd(const TestCase& test_case) {\n    SendLn(\"event=TestCaseEnd&passed=\" + FormatBool(test_case.Passed())\n           + \"&elapsed_time=\" + StreamableToString(test_case.elapsed_time())\n           + \"ms\");\n  }\n\n  void OnTestStart(const TestInfo& test_info) {\n    SendLn(std::string(\"event=TestStart&name=\") + test_info.name());\n  }\n\n  void OnTestEnd(const TestInfo& test_info) {\n    SendLn(\"event=TestEnd&passed=\" +\n           FormatBool((test_info.result())->Passed()) +\n           \"&elapsed_time=\" +\n           StreamableToString((test_info.result())->elapsed_time()) + \"ms\");\n  }\n\n  void OnTestPartResult(const TestPartResult& test_part_result) {\n    const char* file_name = test_part_result.file_name();\n    if (file_name == NULL)\n      file_name = \"\";\n    SendLn(\"event=TestPartResult&file=\" + UrlEncode(file_name) +\n           \"&line=\" + StreamableToString(test_part_result.line_number()) +\n           \"&message=\" + UrlEncode(test_part_result.message()));\n  }\n\n private:\n  // Sends the given message and a newline to the socket.\n  void SendLn(const std::string& message) { socket_writer_->SendLn(message); }\n\n  // Called at the start of streaming to notify the receiver what\n  // protocol we are using.\n  void Start() { SendLn(\"gtest_streaming_protocol_version=1.0\"); }\n\n  std::string FormatBool(bool value) { return value ? \"1\" : \"0\"; }\n\n  const scoped_ptr<AbstractSocketWriter> socket_writer_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);\n};  // class StreamingListener\n\n#endif  // GTEST_CAN_STREAM_RESULTS_\n\n}  // namespace internal\n}  // namespace testing\n\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251\n\n#endif  // GTEST_SRC_GTEST_INTERNAL_INL_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/src/gtest-port.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include \"gtest/internal/gtest-port.h\"\n\n#include <limits.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <fstream>\n\n#if GTEST_OS_WINDOWS\n# include <windows.h>\n# include <io.h>\n# include <sys/stat.h>\n# include <map>  // Used in ThreadLocal.\n#else\n# include <unistd.h>\n#endif  // GTEST_OS_WINDOWS\n\n#if GTEST_OS_MAC\n# include <mach/mach_init.h>\n# include <mach/task.h>\n# include <mach/vm_map.h>\n#endif  // GTEST_OS_MAC\n\n#if GTEST_OS_QNX\n# include <devctl.h>\n# include <fcntl.h>\n# include <sys/procfs.h>\n#endif  // GTEST_OS_QNX\n\n#if GTEST_OS_AIX\n# include <procinfo.h>\n# include <sys/types.h>\n#endif  // GTEST_OS_AIX\n\n#if GTEST_OS_FUCHSIA\n# include <zircon/process.h>\n# include <zircon/syscalls.h>\n#endif  // GTEST_OS_FUCHSIA\n\n#include \"gtest/gtest-spi.h\"\n#include \"gtest/gtest-message.h\"\n#include \"gtest/internal/gtest-internal.h\"\n#include \"gtest/internal/gtest-string.h\"\n#include \"src/gtest-internal-inl.h\"\n\nnamespace testing {\nnamespace internal {\n\n#if defined(_MSC_VER) || defined(__BORLANDC__)\n// MSVC and C++Builder do not provide a definition of STDERR_FILENO.\nconst int kStdOutFileno = 1;\nconst int kStdErrFileno = 2;\n#else\nconst int kStdOutFileno = STDOUT_FILENO;\nconst int kStdErrFileno = STDERR_FILENO;\n#endif  // _MSC_VER\n\n#if GTEST_OS_LINUX\n\nnamespace {\ntemplate <typename T>\nT ReadProcFileField(const std::string& filename, int field) {\n  std::string dummy;\n  std::ifstream file(filename.c_str());\n  while (field-- > 0) {\n    file >> dummy;\n  }\n  T output = 0;\n  file >> output;\n  return output;\n}\n}  // namespace\n\n// Returns the number of active threads, or 0 when there is an error.\nsize_t GetThreadCount() {\n  const std::string filename =\n      (Message() << \"/proc/\" << getpid() << \"/stat\").GetString();\n  return ReadProcFileField<int>(filename, 19);\n}\n\n#elif GTEST_OS_MAC\n\nsize_t GetThreadCount() {\n  const task_t task = mach_task_self();\n  mach_msg_type_number_t thread_count;\n  thread_act_array_t thread_list;\n  const kern_return_t status = task_threads(task, &thread_list, &thread_count);\n  if (status == KERN_SUCCESS) {\n    // task_threads allocates resources in thread_list and we need to free them\n    // to avoid leaks.\n    vm_deallocate(task,\n                  reinterpret_cast<vm_address_t>(thread_list),\n                  sizeof(thread_t) * thread_count);\n    return static_cast<size_t>(thread_count);\n  } else {\n    return 0;\n  }\n}\n\n#elif GTEST_OS_QNX\n\n// Returns the number of threads running in the process, or 0 to indicate that\n// we cannot detect it.\nsize_t GetThreadCount() {\n  const int fd = open(\"/proc/self/as\", O_RDONLY);\n  if (fd < 0) {\n    return 0;\n  }\n  procfs_info process_info;\n  const int status =\n      devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL);\n  close(fd);\n  if (status == EOK) {\n    return static_cast<size_t>(process_info.num_threads);\n  } else {\n    return 0;\n  }\n}\n\n#elif GTEST_OS_AIX\n\nsize_t GetThreadCount() {\n  struct procentry64 entry;\n  pid_t pid = getpid();\n  int status = getprocs64(&entry, sizeof(entry), NULL, 0, &pid, 1);\n  if (status == 1) {\n    return entry.pi_thcount;\n  } else {\n    return 0;\n  }\n}\n\n#elif GTEST_OS_FUCHSIA\n\nsize_t GetThreadCount() {\n  int dummy_buffer;\n  size_t avail;\n  zx_status_t status = zx_object_get_info(\n      zx_process_self(),\n      ZX_INFO_PROCESS_THREADS,\n      &dummy_buffer,\n      0,\n      nullptr,\n      &avail);\n  if (status == ZX_OK) {\n    return avail;\n  } else {\n    return 0;\n  }\n}\n\n#else\n\nsize_t GetThreadCount() {\n  // There's no portable way to detect the number of threads, so we just\n  // return 0 to indicate that we cannot detect it.\n  return 0;\n}\n\n#endif  // GTEST_OS_LINUX\n\n#if GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS\n\nvoid SleepMilliseconds(int n) {\n  ::Sleep(n);\n}\n\nAutoHandle::AutoHandle()\n    : handle_(INVALID_HANDLE_VALUE) {}\n\nAutoHandle::AutoHandle(Handle handle)\n    : handle_(handle) {}\n\nAutoHandle::~AutoHandle() {\n  Reset();\n}\n\nAutoHandle::Handle AutoHandle::Get() const {\n  return handle_;\n}\n\nvoid AutoHandle::Reset() {\n  Reset(INVALID_HANDLE_VALUE);\n}\n\nvoid AutoHandle::Reset(HANDLE handle) {\n  // Resetting with the same handle we already own is invalid.\n  if (handle_ != handle) {\n    if (IsCloseable()) {\n      ::CloseHandle(handle_);\n    }\n    handle_ = handle;\n  } else {\n    GTEST_CHECK_(!IsCloseable())\n        << \"Resetting a valid handle to itself is likely a programmer error \"\n            \"and thus not allowed.\";\n  }\n}\n\nbool AutoHandle::IsCloseable() const {\n  // Different Windows APIs may use either of these values to represent an\n  // invalid handle.\n  return handle_ != NULL && handle_ != INVALID_HANDLE_VALUE;\n}\n\nNotification::Notification()\n    : event_(::CreateEvent(NULL,   // Default security attributes.\n                           TRUE,   // Do not reset automatically.\n                           FALSE,  // Initially unset.\n                           NULL)) {  // Anonymous event.\n  GTEST_CHECK_(event_.Get() != NULL);\n}\n\nvoid Notification::Notify() {\n  GTEST_CHECK_(::SetEvent(event_.Get()) != FALSE);\n}\n\nvoid Notification::WaitForNotification() {\n  GTEST_CHECK_(\n      ::WaitForSingleObject(event_.Get(), INFINITE) == WAIT_OBJECT_0);\n}\n\nMutex::Mutex()\n    : owner_thread_id_(0),\n      type_(kDynamic),\n      critical_section_init_phase_(0),\n      critical_section_(new CRITICAL_SECTION) {\n  ::InitializeCriticalSection(critical_section_);\n}\n\nMutex::~Mutex() {\n  // Static mutexes are leaked intentionally. It is not thread-safe to try\n  // to clean them up.\n  // FIXME: Switch to Slim Reader/Writer (SRW) Locks, which requires\n  // nothing to clean it up but is available only on Vista and later.\n  // https://docs.microsoft.com/en-us/windows/desktop/Sync/slim-reader-writer--srw--locks\n  if (type_ == kDynamic) {\n    ::DeleteCriticalSection(critical_section_);\n    delete critical_section_;\n    critical_section_ = NULL;\n  }\n}\n\nvoid Mutex::Lock() {\n  ThreadSafeLazyInit();\n  ::EnterCriticalSection(critical_section_);\n  owner_thread_id_ = ::GetCurrentThreadId();\n}\n\nvoid Mutex::Unlock() {\n  ThreadSafeLazyInit();\n  // We don't protect writing to owner_thread_id_ here, as it's the\n  // caller's responsibility to ensure that the current thread holds the\n  // mutex when this is called.\n  owner_thread_id_ = 0;\n  ::LeaveCriticalSection(critical_section_);\n}\n\n// Does nothing if the current thread holds the mutex. Otherwise, crashes\n// with high probability.\nvoid Mutex::AssertHeld() {\n  ThreadSafeLazyInit();\n  GTEST_CHECK_(owner_thread_id_ == ::GetCurrentThreadId())\n      << \"The current thread is not holding the mutex @\" << this;\n}\n\nnamespace {\n\n// Use the RAII idiom to flag mem allocs that are intentionally never\n// deallocated. The motivation is to silence the false positive mem leaks\n// that are reported by the debug version of MS's CRT which can only detect\n// if an alloc is missing a matching deallocation.\n// Example:\n//    MemoryIsNotDeallocated memory_is_not_deallocated;\n//    critical_section_ = new CRITICAL_SECTION;\n//\nclass MemoryIsNotDeallocated\n{\n public:\n  MemoryIsNotDeallocated() : old_crtdbg_flag_(0) {\n#ifdef _MSC_VER\n    old_crtdbg_flag_ = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);\n    // Set heap allocation block type to _IGNORE_BLOCK so that MS debug CRT\n    // doesn't report mem leak if there's no matching deallocation.\n    _CrtSetDbgFlag(old_crtdbg_flag_ & ~_CRTDBG_ALLOC_MEM_DF);\n#endif  //  _MSC_VER\n  }\n\n  ~MemoryIsNotDeallocated() {\n#ifdef _MSC_VER\n    // Restore the original _CRTDBG_ALLOC_MEM_DF flag\n    _CrtSetDbgFlag(old_crtdbg_flag_);\n#endif  //  _MSC_VER\n  }\n\n private:\n  int old_crtdbg_flag_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(MemoryIsNotDeallocated);\n};\n\n}  // namespace\n\n// Initializes owner_thread_id_ and critical_section_ in static mutexes.\nvoid Mutex::ThreadSafeLazyInit() {\n  // Dynamic mutexes are initialized in the constructor.\n  if (type_ == kStatic) {\n    switch (\n        ::InterlockedCompareExchange(&critical_section_init_phase_, 1L, 0L)) {\n      case 0:\n        // If critical_section_init_phase_ was 0 before the exchange, we\n        // are the first to test it and need to perform the initialization.\n        owner_thread_id_ = 0;\n        {\n          // Use RAII to flag that following mem alloc is never deallocated.\n          MemoryIsNotDeallocated memory_is_not_deallocated;\n          critical_section_ = new CRITICAL_SECTION;\n        }\n        ::InitializeCriticalSection(critical_section_);\n        // Updates the critical_section_init_phase_ to 2 to signal\n        // initialization complete.\n        GTEST_CHECK_(::InterlockedCompareExchange(\n                          &critical_section_init_phase_, 2L, 1L) ==\n                      1L);\n        break;\n      case 1:\n        // Somebody else is already initializing the mutex; spin until they\n        // are done.\n        while (::InterlockedCompareExchange(&critical_section_init_phase_,\n                                            2L,\n                                            2L) != 2L) {\n          // Possibly yields the rest of the thread's time slice to other\n          // threads.\n          ::Sleep(0);\n        }\n        break;\n\n      case 2:\n        break;  // The mutex is already initialized and ready for use.\n\n      default:\n        GTEST_CHECK_(false)\n            << \"Unexpected value of critical_section_init_phase_ \"\n            << \"while initializing a static mutex.\";\n    }\n  }\n}\n\nnamespace {\n\nclass ThreadWithParamSupport : public ThreadWithParamBase {\n public:\n  static HANDLE CreateThread(Runnable* runnable,\n                             Notification* thread_can_start) {\n    ThreadMainParam* param = new ThreadMainParam(runnable, thread_can_start);\n    DWORD thread_id;\n    // FIXME: Consider to use _beginthreadex instead.\n    HANDLE thread_handle = ::CreateThread(\n        NULL,    // Default security.\n        0,       // Default stack size.\n        &ThreadWithParamSupport::ThreadMain,\n        param,   // Parameter to ThreadMainStatic\n        0x0,     // Default creation flags.\n        &thread_id);  // Need a valid pointer for the call to work under Win98.\n    GTEST_CHECK_(thread_handle != NULL) << \"CreateThread failed with error \"\n                                        << ::GetLastError() << \".\";\n    if (thread_handle == NULL) {\n      delete param;\n    }\n    return thread_handle;\n  }\n\n private:\n  struct ThreadMainParam {\n    ThreadMainParam(Runnable* runnable, Notification* thread_can_start)\n        : runnable_(runnable),\n          thread_can_start_(thread_can_start) {\n    }\n    scoped_ptr<Runnable> runnable_;\n    // Does not own.\n    Notification* thread_can_start_;\n  };\n\n  static DWORD WINAPI ThreadMain(void* ptr) {\n    // Transfers ownership.\n    scoped_ptr<ThreadMainParam> param(static_cast<ThreadMainParam*>(ptr));\n    if (param->thread_can_start_ != NULL)\n      param->thread_can_start_->WaitForNotification();\n    param->runnable_->Run();\n    return 0;\n  }\n\n  // Prohibit instantiation.\n  ThreadWithParamSupport();\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParamSupport);\n};\n\n}  // namespace\n\nThreadWithParamBase::ThreadWithParamBase(Runnable *runnable,\n                                         Notification* thread_can_start)\n      : thread_(ThreadWithParamSupport::CreateThread(runnable,\n                                                     thread_can_start)) {\n}\n\nThreadWithParamBase::~ThreadWithParamBase() {\n  Join();\n}\n\nvoid ThreadWithParamBase::Join() {\n  GTEST_CHECK_(::WaitForSingleObject(thread_.Get(), INFINITE) == WAIT_OBJECT_0)\n      << \"Failed to join the thread with error \" << ::GetLastError() << \".\";\n}\n\n// Maps a thread to a set of ThreadIdToThreadLocals that have values\n// instantiated on that thread and notifies them when the thread exits.  A\n// ThreadLocal instance is expected to persist until all threads it has\n// values on have terminated.\nclass ThreadLocalRegistryImpl {\n public:\n  // Registers thread_local_instance as having value on the current thread.\n  // Returns a value that can be used to identify the thread from other threads.\n  static ThreadLocalValueHolderBase* GetValueOnCurrentThread(\n      const ThreadLocalBase* thread_local_instance) {\n    DWORD current_thread = ::GetCurrentThreadId();\n    MutexLock lock(&mutex_);\n    ThreadIdToThreadLocals* const thread_to_thread_locals =\n        GetThreadLocalsMapLocked();\n    ThreadIdToThreadLocals::iterator thread_local_pos =\n        thread_to_thread_locals->find(current_thread);\n    if (thread_local_pos == thread_to_thread_locals->end()) {\n      thread_local_pos = thread_to_thread_locals->insert(\n          std::make_pair(current_thread, ThreadLocalValues())).first;\n      StartWatcherThreadFor(current_thread);\n    }\n    ThreadLocalValues& thread_local_values = thread_local_pos->second;\n    ThreadLocalValues::iterator value_pos =\n        thread_local_values.find(thread_local_instance);\n    if (value_pos == thread_local_values.end()) {\n      value_pos =\n          thread_local_values\n              .insert(std::make_pair(\n                  thread_local_instance,\n                  linked_ptr<ThreadLocalValueHolderBase>(\n                      thread_local_instance->NewValueForCurrentThread())))\n              .first;\n    }\n    return value_pos->second.get();\n  }\n\n  static void OnThreadLocalDestroyed(\n      const ThreadLocalBase* thread_local_instance) {\n    std::vector<linked_ptr<ThreadLocalValueHolderBase> > value_holders;\n    // Clean up the ThreadLocalValues data structure while holding the lock, but\n    // defer the destruction of the ThreadLocalValueHolderBases.\n    {\n      MutexLock lock(&mutex_);\n      ThreadIdToThreadLocals* const thread_to_thread_locals =\n          GetThreadLocalsMapLocked();\n      for (ThreadIdToThreadLocals::iterator it =\n          thread_to_thread_locals->begin();\n          it != thread_to_thread_locals->end();\n          ++it) {\n        ThreadLocalValues& thread_local_values = it->second;\n        ThreadLocalValues::iterator value_pos =\n            thread_local_values.find(thread_local_instance);\n        if (value_pos != thread_local_values.end()) {\n          value_holders.push_back(value_pos->second);\n          thread_local_values.erase(value_pos);\n          // This 'if' can only be successful at most once, so theoretically we\n          // could break out of the loop here, but we don't bother doing so.\n        }\n      }\n    }\n    // Outside the lock, let the destructor for 'value_holders' deallocate the\n    // ThreadLocalValueHolderBases.\n  }\n\n  static void OnThreadExit(DWORD thread_id) {\n    GTEST_CHECK_(thread_id != 0) << ::GetLastError();\n    std::vector<linked_ptr<ThreadLocalValueHolderBase> > value_holders;\n    // Clean up the ThreadIdToThreadLocals data structure while holding the\n    // lock, but defer the destruction of the ThreadLocalValueHolderBases.\n    {\n      MutexLock lock(&mutex_);\n      ThreadIdToThreadLocals* const thread_to_thread_locals =\n          GetThreadLocalsMapLocked();\n      ThreadIdToThreadLocals::iterator thread_local_pos =\n          thread_to_thread_locals->find(thread_id);\n      if (thread_local_pos != thread_to_thread_locals->end()) {\n        ThreadLocalValues& thread_local_values = thread_local_pos->second;\n        for (ThreadLocalValues::iterator value_pos =\n            thread_local_values.begin();\n            value_pos != thread_local_values.end();\n            ++value_pos) {\n          value_holders.push_back(value_pos->second);\n        }\n        thread_to_thread_locals->erase(thread_local_pos);\n      }\n    }\n    // Outside the lock, let the destructor for 'value_holders' deallocate the\n    // ThreadLocalValueHolderBases.\n  }\n\n private:\n  // In a particular thread, maps a ThreadLocal object to its value.\n  typedef std::map<const ThreadLocalBase*,\n                   linked_ptr<ThreadLocalValueHolderBase> > ThreadLocalValues;\n  // Stores all ThreadIdToThreadLocals having values in a thread, indexed by\n  // thread's ID.\n  typedef std::map<DWORD, ThreadLocalValues> ThreadIdToThreadLocals;\n\n  // Holds the thread id and thread handle that we pass from\n  // StartWatcherThreadFor to WatcherThreadFunc.\n  typedef std::pair<DWORD, HANDLE> ThreadIdAndHandle;\n\n  static void StartWatcherThreadFor(DWORD thread_id) {\n    // The returned handle will be kept in thread_map and closed by\n    // watcher_thread in WatcherThreadFunc.\n    HANDLE thread = ::OpenThread(SYNCHRONIZE | THREAD_QUERY_INFORMATION,\n                                 FALSE,\n                                 thread_id);\n    GTEST_CHECK_(thread != NULL);\n    // We need to pass a valid thread ID pointer into CreateThread for it\n    // to work correctly under Win98.\n    DWORD watcher_thread_id;\n    HANDLE watcher_thread = ::CreateThread(\n        NULL,   // Default security.\n        0,      // Default stack size\n        &ThreadLocalRegistryImpl::WatcherThreadFunc,\n        reinterpret_cast<LPVOID>(new ThreadIdAndHandle(thread_id, thread)),\n        CREATE_SUSPENDED,\n        &watcher_thread_id);\n    GTEST_CHECK_(watcher_thread != NULL);\n    // Give the watcher thread the same priority as ours to avoid being\n    // blocked by it.\n    ::SetThreadPriority(watcher_thread,\n                        ::GetThreadPriority(::GetCurrentThread()));\n    ::ResumeThread(watcher_thread);\n    ::CloseHandle(watcher_thread);\n  }\n\n  // Monitors exit from a given thread and notifies those\n  // ThreadIdToThreadLocals about thread termination.\n  static DWORD WINAPI WatcherThreadFunc(LPVOID param) {\n    const ThreadIdAndHandle* tah =\n        reinterpret_cast<const ThreadIdAndHandle*>(param);\n    GTEST_CHECK_(\n        ::WaitForSingleObject(tah->second, INFINITE) == WAIT_OBJECT_0);\n    OnThreadExit(tah->first);\n    ::CloseHandle(tah->second);\n    delete tah;\n    return 0;\n  }\n\n  // Returns map of thread local instances.\n  static ThreadIdToThreadLocals* GetThreadLocalsMapLocked() {\n    mutex_.AssertHeld();\n    MemoryIsNotDeallocated memory_is_not_deallocated;\n    static ThreadIdToThreadLocals* map = new ThreadIdToThreadLocals();\n    return map;\n  }\n\n  // Protects access to GetThreadLocalsMapLocked() and its return value.\n  static Mutex mutex_;\n  // Protects access to GetThreadMapLocked() and its return value.\n  static Mutex thread_map_mutex_;\n};\n\nMutex ThreadLocalRegistryImpl::mutex_(Mutex::kStaticMutex);\nMutex ThreadLocalRegistryImpl::thread_map_mutex_(Mutex::kStaticMutex);\n\nThreadLocalValueHolderBase* ThreadLocalRegistry::GetValueOnCurrentThread(\n      const ThreadLocalBase* thread_local_instance) {\n  return ThreadLocalRegistryImpl::GetValueOnCurrentThread(\n      thread_local_instance);\n}\n\nvoid ThreadLocalRegistry::OnThreadLocalDestroyed(\n      const ThreadLocalBase* thread_local_instance) {\n  ThreadLocalRegistryImpl::OnThreadLocalDestroyed(thread_local_instance);\n}\n\n#endif  // GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS\n\n#if GTEST_USES_POSIX_RE\n\n// Implements RE.  Currently only needed for death tests.\n\nRE::~RE() {\n  if (is_valid_) {\n    // regfree'ing an invalid regex might crash because the content\n    // of the regex is undefined. Since the regex's are essentially\n    // the same, one cannot be valid (or invalid) without the other\n    // being so too.\n    regfree(&partial_regex_);\n    regfree(&full_regex_);\n  }\n  free(const_cast<char*>(pattern_));\n}\n\n// Returns true iff regular expression re matches the entire str.\nbool RE::FullMatch(const char* str, const RE& re) {\n  if (!re.is_valid_) return false;\n\n  regmatch_t match;\n  return regexec(&re.full_regex_, str, 1, &match, 0) == 0;\n}\n\n// Returns true iff regular expression re matches a substring of str\n// (including str itself).\nbool RE::PartialMatch(const char* str, const RE& re) {\n  if (!re.is_valid_) return false;\n\n  regmatch_t match;\n  return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;\n}\n\n// Initializes an RE from its string representation.\nvoid RE::Init(const char* regex) {\n  pattern_ = posix::StrDup(regex);\n\n  // Reserves enough bytes to hold the regular expression used for a\n  // full match.\n  const size_t full_regex_len = strlen(regex) + 10;\n  char* const full_pattern = new char[full_regex_len];\n\n  snprintf(full_pattern, full_regex_len, \"^(%s)$\", regex);\n  is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;\n  // We want to call regcomp(&partial_regex_, ...) even if the\n  // previous expression returns false.  Otherwise partial_regex_ may\n  // not be properly initialized can may cause trouble when it's\n  // freed.\n  //\n  // Some implementation of POSIX regex (e.g. on at least some\n  // versions of Cygwin) doesn't accept the empty string as a valid\n  // regex.  We change it to an equivalent form \"()\" to be safe.\n  if (is_valid_) {\n    const char* const partial_regex = (*regex == '\\0') ? \"()\" : regex;\n    is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;\n  }\n  EXPECT_TRUE(is_valid_)\n      << \"Regular expression \\\"\" << regex\n      << \"\\\" is not a valid POSIX Extended regular expression.\";\n\n  delete[] full_pattern;\n}\n\n#elif GTEST_USES_SIMPLE_RE\n\n// Returns true iff ch appears anywhere in str (excluding the\n// terminating '\\0' character).\nbool IsInSet(char ch, const char* str) {\n  return ch != '\\0' && strchr(str, ch) != NULL;\n}\n\n// Returns true iff ch belongs to the given classification.  Unlike\n// similar functions in <ctype.h>, these aren't affected by the\n// current locale.\nbool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }\nbool IsAsciiPunct(char ch) {\n  return IsInSet(ch, \"^-!\\\"#$%&'()*+,./:;<=>?@[\\\\]_`{|}~\");\n}\nbool IsRepeat(char ch) { return IsInSet(ch, \"?*+\"); }\nbool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, \" \\f\\n\\r\\t\\v\"); }\nbool IsAsciiWordChar(char ch) {\n  return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||\n      ('0' <= ch && ch <= '9') || ch == '_';\n}\n\n// Returns true iff \"\\\\c\" is a supported escape sequence.\nbool IsValidEscape(char c) {\n  return (IsAsciiPunct(c) || IsInSet(c, \"dDfnrsStvwW\"));\n}\n\n// Returns true iff the given atom (specified by escaped and pattern)\n// matches ch.  The result is undefined if the atom is invalid.\nbool AtomMatchesChar(bool escaped, char pattern_char, char ch) {\n  if (escaped) {  // \"\\\\p\" where p is pattern_char.\n    switch (pattern_char) {\n      case 'd': return IsAsciiDigit(ch);\n      case 'D': return !IsAsciiDigit(ch);\n      case 'f': return ch == '\\f';\n      case 'n': return ch == '\\n';\n      case 'r': return ch == '\\r';\n      case 's': return IsAsciiWhiteSpace(ch);\n      case 'S': return !IsAsciiWhiteSpace(ch);\n      case 't': return ch == '\\t';\n      case 'v': return ch == '\\v';\n      case 'w': return IsAsciiWordChar(ch);\n      case 'W': return !IsAsciiWordChar(ch);\n    }\n    return IsAsciiPunct(pattern_char) && pattern_char == ch;\n  }\n\n  return (pattern_char == '.' && ch != '\\n') || pattern_char == ch;\n}\n\n// Helper function used by ValidateRegex() to format error messages.\nstatic std::string FormatRegexSyntaxError(const char* regex, int index) {\n  return (Message() << \"Syntax error at index \" << index\n          << \" in simple regular expression \\\"\" << regex << \"\\\": \").GetString();\n}\n\n// Generates non-fatal failures and returns false if regex is invalid;\n// otherwise returns true.\nbool ValidateRegex(const char* regex) {\n  if (regex == NULL) {\n    // FIXME: fix the source file location in the\n    // assertion failures to match where the regex is used in user\n    // code.\n    ADD_FAILURE() << \"NULL is not a valid simple regular expression.\";\n    return false;\n  }\n\n  bool is_valid = true;\n\n  // True iff ?, *, or + can follow the previous atom.\n  bool prev_repeatable = false;\n  for (int i = 0; regex[i]; i++) {\n    if (regex[i] == '\\\\') {  // An escape sequence\n      i++;\n      if (regex[i] == '\\0') {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)\n                      << \"'\\\\' cannot appear at the end.\";\n        return false;\n      }\n\n      if (!IsValidEscape(regex[i])) {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)\n                      << \"invalid escape sequence \\\"\\\\\" << regex[i] << \"\\\".\";\n        is_valid = false;\n      }\n      prev_repeatable = true;\n    } else {  // Not an escape sequence.\n      const char ch = regex[i];\n\n      if (ch == '^' && i > 0) {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)\n                      << \"'^' can only appear at the beginning.\";\n        is_valid = false;\n      } else if (ch == '$' && regex[i + 1] != '\\0') {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)\n                      << \"'$' can only appear at the end.\";\n        is_valid = false;\n      } else if (IsInSet(ch, \"()[]{}|\")) {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)\n                      << \"'\" << ch << \"' is unsupported.\";\n        is_valid = false;\n      } else if (IsRepeat(ch) && !prev_repeatable) {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)\n                      << \"'\" << ch << \"' can only follow a repeatable token.\";\n        is_valid = false;\n      }\n\n      prev_repeatable = !IsInSet(ch, \"^$?*+\");\n    }\n  }\n\n  return is_valid;\n}\n\n// Matches a repeated regex atom followed by a valid simple regular\n// expression.  The regex atom is defined as c if escaped is false,\n// or \\c otherwise.  repeat is the repetition meta character (?, *,\n// or +).  The behavior is undefined if str contains too many\n// characters to be indexable by size_t, in which case the test will\n// probably time out anyway.  We are fine with this limitation as\n// std::string has it too.\nbool MatchRepetitionAndRegexAtHead(\n    bool escaped, char c, char repeat, const char* regex,\n    const char* str) {\n  const size_t min_count = (repeat == '+') ? 1 : 0;\n  const size_t max_count = (repeat == '?') ? 1 :\n      static_cast<size_t>(-1) - 1;\n  // We cannot call numeric_limits::max() as it conflicts with the\n  // max() macro on Windows.\n\n  for (size_t i = 0; i <= max_count; ++i) {\n    // We know that the atom matches each of the first i characters in str.\n    if (i >= min_count && MatchRegexAtHead(regex, str + i)) {\n      // We have enough matches at the head, and the tail matches too.\n      // Since we only care about *whether* the pattern matches str\n      // (as opposed to *how* it matches), there is no need to find a\n      // greedy match.\n      return true;\n    }\n    if (str[i] == '\\0' || !AtomMatchesChar(escaped, c, str[i]))\n      return false;\n  }\n  return false;\n}\n\n// Returns true iff regex matches a prefix of str.  regex must be a\n// valid simple regular expression and not start with \"^\", or the\n// result is undefined.\nbool MatchRegexAtHead(const char* regex, const char* str) {\n  if (*regex == '\\0')  // An empty regex matches a prefix of anything.\n    return true;\n\n  // \"$\" only matches the end of a string.  Note that regex being\n  // valid guarantees that there's nothing after \"$\" in it.\n  if (*regex == '$')\n    return *str == '\\0';\n\n  // Is the first thing in regex an escape sequence?\n  const bool escaped = *regex == '\\\\';\n  if (escaped)\n    ++regex;\n  if (IsRepeat(regex[1])) {\n    // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so\n    // here's an indirect recursion.  It terminates as the regex gets\n    // shorter in each recursion.\n    return MatchRepetitionAndRegexAtHead(\n        escaped, regex[0], regex[1], regex + 2, str);\n  } else {\n    // regex isn't empty, isn't \"$\", and doesn't start with a\n    // repetition.  We match the first atom of regex with the first\n    // character of str and recurse.\n    return (*str != '\\0') && AtomMatchesChar(escaped, *regex, *str) &&\n        MatchRegexAtHead(regex + 1, str + 1);\n  }\n}\n\n// Returns true iff regex matches any substring of str.  regex must be\n// a valid simple regular expression, or the result is undefined.\n//\n// The algorithm is recursive, but the recursion depth doesn't exceed\n// the regex length, so we won't need to worry about running out of\n// stack space normally.  In rare cases the time complexity can be\n// exponential with respect to the regex length + the string length,\n// but usually it's must faster (often close to linear).\nbool MatchRegexAnywhere(const char* regex, const char* str) {\n  if (regex == NULL || str == NULL)\n    return false;\n\n  if (*regex == '^')\n    return MatchRegexAtHead(regex + 1, str);\n\n  // A successful match can be anywhere in str.\n  do {\n    if (MatchRegexAtHead(regex, str))\n      return true;\n  } while (*str++ != '\\0');\n  return false;\n}\n\n// Implements the RE class.\n\nRE::~RE() {\n  free(const_cast<char*>(pattern_));\n  free(const_cast<char*>(full_pattern_));\n}\n\n// Returns true iff regular expression re matches the entire str.\nbool RE::FullMatch(const char* str, const RE& re) {\n  return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);\n}\n\n// Returns true iff regular expression re matches a substring of str\n// (including str itself).\nbool RE::PartialMatch(const char* str, const RE& re) {\n  return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);\n}\n\n// Initializes an RE from its string representation.\nvoid RE::Init(const char* regex) {\n  pattern_ = full_pattern_ = NULL;\n  if (regex != NULL) {\n    pattern_ = posix::StrDup(regex);\n  }\n\n  is_valid_ = ValidateRegex(regex);\n  if (!is_valid_) {\n    // No need to calculate the full pattern when the regex is invalid.\n    return;\n  }\n\n  const size_t len = strlen(regex);\n  // Reserves enough bytes to hold the regular expression used for a\n  // full match: we need space to prepend a '^', append a '$', and\n  // terminate the string with '\\0'.\n  char* buffer = static_cast<char*>(malloc(len + 3));\n  full_pattern_ = buffer;\n\n  if (*regex != '^')\n    *buffer++ = '^';  // Makes sure full_pattern_ starts with '^'.\n\n  // We don't use snprintf or strncpy, as they trigger a warning when\n  // compiled with VC++ 8.0.\n  memcpy(buffer, regex, len);\n  buffer += len;\n\n  if (len == 0 || regex[len - 1] != '$')\n    *buffer++ = '$';  // Makes sure full_pattern_ ends with '$'.\n\n  *buffer = '\\0';\n}\n\n#endif  // GTEST_USES_POSIX_RE\n\nconst char kUnknownFile[] = \"unknown file\";\n\n// Formats a source file path and a line number as they would appear\n// in an error message from the compiler used to compile this code.\nGTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {\n  const std::string file_name(file == NULL ? kUnknownFile : file);\n\n  if (line < 0) {\n    return file_name + \":\";\n  }\n#ifdef _MSC_VER\n  return file_name + \"(\" + StreamableToString(line) + \"):\";\n#else\n  return file_name + \":\" + StreamableToString(line) + \":\";\n#endif  // _MSC_VER\n}\n\n// Formats a file location for compiler-independent XML output.\n// Although this function is not platform dependent, we put it next to\n// FormatFileLocation in order to contrast the two functions.\n// Note that FormatCompilerIndependentFileLocation() does NOT append colon\n// to the file location it produces, unlike FormatFileLocation().\nGTEST_API_ ::std::string FormatCompilerIndependentFileLocation(\n    const char* file, int line) {\n  const std::string file_name(file == NULL ? kUnknownFile : file);\n\n  if (line < 0)\n    return file_name;\n  else\n    return file_name + \":\" + StreamableToString(line);\n}\n\nGTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)\n    : severity_(severity) {\n  const char* const marker =\n      severity == GTEST_INFO ?    \"[  INFO ]\" :\n      severity == GTEST_WARNING ? \"[WARNING]\" :\n      severity == GTEST_ERROR ?   \"[ ERROR ]\" : \"[ FATAL ]\";\n  GetStream() << ::std::endl << marker << \" \"\n              << FormatFileLocation(file, line).c_str() << \": \";\n}\n\n// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.\nGTestLog::~GTestLog() {\n  GetStream() << ::std::endl;\n  if (severity_ == GTEST_FATAL) {\n    fflush(stderr);\n    posix::Abort();\n  }\n}\n\n// Disable Microsoft deprecation warnings for POSIX functions called from\n// this class (creat, dup, dup2, and close)\nGTEST_DISABLE_MSC_DEPRECATED_PUSH_()\n\n#if GTEST_HAS_STREAM_REDIRECTION\n\n// Object that captures an output stream (stdout/stderr).\nclass CapturedStream {\n public:\n  // The ctor redirects the stream to a temporary file.\n  explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {\n# if GTEST_OS_WINDOWS\n    char temp_dir_path[MAX_PATH + 1] = { '\\0' };  // NOLINT\n    char temp_file_path[MAX_PATH + 1] = { '\\0' };  // NOLINT\n\n    ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);\n    const UINT success = ::GetTempFileNameA(temp_dir_path,\n                                            \"gtest_redir\",\n                                            0,  // Generate unique file name.\n                                            temp_file_path);\n    GTEST_CHECK_(success != 0)\n        << \"Unable to create a temporary file in \" << temp_dir_path;\n    const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);\n    GTEST_CHECK_(captured_fd != -1) << \"Unable to open temporary file \"\n                                    << temp_file_path;\n    filename_ = temp_file_path;\n# else\n    // There's no guarantee that a test has write access to the current\n    // directory, so we create the temporary file in the /tmp directory\n    // instead. We use /tmp on most systems, and /sdcard on Android.\n    // That's because Android doesn't have /tmp.\n#  if GTEST_OS_LINUX_ANDROID\n    // Note: Android applications are expected to call the framework's\n    // Context.getExternalStorageDirectory() method through JNI to get\n    // the location of the world-writable SD Card directory. However,\n    // this requires a Context handle, which cannot be retrieved\n    // globally from native code. Doing so also precludes running the\n    // code as part of a regular standalone executable, which doesn't\n    // run in a Dalvik process (e.g. when running it through 'adb shell').\n    //\n    // The location /sdcard is directly accessible from native code\n    // and is the only location (unofficially) supported by the Android\n    // team. It's generally a symlink to the real SD Card mount point\n    // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or\n    // other OEM-customized locations. Never rely on these, and always\n    // use /sdcard.\n    char name_template[] = \"/sdcard/gtest_captured_stream.XXXXXX\";\n#  else\n    char name_template[] = \"/tmp/captured_stream.XXXXXX\";\n#  endif  // GTEST_OS_LINUX_ANDROID\n    const int captured_fd = mkstemp(name_template);\n    filename_ = name_template;\n# endif  // GTEST_OS_WINDOWS\n    fflush(NULL);\n    dup2(captured_fd, fd_);\n    close(captured_fd);\n  }\n\n  ~CapturedStream() {\n    remove(filename_.c_str());\n  }\n\n  std::string GetCapturedString() {\n    if (uncaptured_fd_ != -1) {\n      // Restores the original stream.\n      fflush(NULL);\n      dup2(uncaptured_fd_, fd_);\n      close(uncaptured_fd_);\n      uncaptured_fd_ = -1;\n    }\n\n    FILE* const file = posix::FOpen(filename_.c_str(), \"r\");\n    const std::string content = ReadEntireFile(file);\n    posix::FClose(file);\n    return content;\n  }\n\n private:\n  const int fd_;  // A stream to capture.\n  int uncaptured_fd_;\n  // Name of the temporary file holding the stderr output.\n  ::std::string filename_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);\n};\n\nGTEST_DISABLE_MSC_DEPRECATED_POP_()\n\nstatic CapturedStream* g_captured_stderr = NULL;\nstatic CapturedStream* g_captured_stdout = NULL;\n\n// Starts capturing an output stream (stdout/stderr).\nstatic void CaptureStream(int fd, const char* stream_name,\n                          CapturedStream** stream) {\n  if (*stream != NULL) {\n    GTEST_LOG_(FATAL) << \"Only one \" << stream_name\n                      << \" capturer can exist at a time.\";\n  }\n  *stream = new CapturedStream(fd);\n}\n\n// Stops capturing the output stream and returns the captured string.\nstatic std::string GetCapturedStream(CapturedStream** captured_stream) {\n  const std::string content = (*captured_stream)->GetCapturedString();\n\n  delete *captured_stream;\n  *captured_stream = NULL;\n\n  return content;\n}\n\n// Starts capturing stdout.\nvoid CaptureStdout() {\n  CaptureStream(kStdOutFileno, \"stdout\", &g_captured_stdout);\n}\n\n// Starts capturing stderr.\nvoid CaptureStderr() {\n  CaptureStream(kStdErrFileno, \"stderr\", &g_captured_stderr);\n}\n\n// Stops capturing stdout and returns the captured string.\nstd::string GetCapturedStdout() {\n  return GetCapturedStream(&g_captured_stdout);\n}\n\n// Stops capturing stderr and returns the captured string.\nstd::string GetCapturedStderr() {\n  return GetCapturedStream(&g_captured_stderr);\n}\n\n#endif  // GTEST_HAS_STREAM_REDIRECTION\n\n\n\n\n\nsize_t GetFileSize(FILE* file) {\n  fseek(file, 0, SEEK_END);\n  return static_cast<size_t>(ftell(file));\n}\n\nstd::string ReadEntireFile(FILE* file) {\n  const size_t file_size = GetFileSize(file);\n  char* const buffer = new char[file_size];\n\n  size_t bytes_last_read = 0;  // # of bytes read in the last fread()\n  size_t bytes_read = 0;       // # of bytes read so far\n\n  fseek(file, 0, SEEK_SET);\n\n  // Keeps reading the file until we cannot read further or the\n  // pre-determined file size is reached.\n  do {\n    bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);\n    bytes_read += bytes_last_read;\n  } while (bytes_last_read > 0 && bytes_read < file_size);\n\n  const std::string content(buffer, bytes_read);\n  delete[] buffer;\n\n  return content;\n}\n\n#if GTEST_HAS_DEATH_TEST\nstatic const std::vector<std::string>* g_injected_test_argvs = NULL;  // Owned.\n\nstd::vector<std::string> GetInjectableArgvs() {\n  if (g_injected_test_argvs != NULL) {\n    return *g_injected_test_argvs;\n  }\n  return GetArgvs();\n}\n\nvoid SetInjectableArgvs(const std::vector<std::string>* new_argvs) {\n  if (g_injected_test_argvs != new_argvs) delete g_injected_test_argvs;\n  g_injected_test_argvs = new_argvs;\n}\n\nvoid SetInjectableArgvs(const std::vector<std::string>& new_argvs) {\n  SetInjectableArgvs(\n      new std::vector<std::string>(new_argvs.begin(), new_argvs.end()));\n}\n\n#if GTEST_HAS_GLOBAL_STRING\nvoid SetInjectableArgvs(const std::vector< ::string>& new_argvs) {\n  SetInjectableArgvs(\n      new std::vector<std::string>(new_argvs.begin(), new_argvs.end()));\n}\n#endif  // GTEST_HAS_GLOBAL_STRING\n\nvoid ClearInjectableArgvs() {\n  delete g_injected_test_argvs;\n  g_injected_test_argvs = NULL;\n}\n#endif  // GTEST_HAS_DEATH_TEST\n\n#if GTEST_OS_WINDOWS_MOBILE\nnamespace posix {\nvoid Abort() {\n  DebugBreak();\n  TerminateProcess(GetCurrentProcess(), 1);\n}\n}  // namespace posix\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n// Returns the name of the environment variable corresponding to the\n// given flag.  For example, FlagToEnvVar(\"foo\") will return\n// \"GTEST_FOO\" in the open-source version.\nstatic std::string FlagToEnvVar(const char* flag) {\n  const std::string full_flag =\n      (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();\n\n  Message env_var;\n  for (size_t i = 0; i != full_flag.length(); i++) {\n    env_var << ToUpper(full_flag.c_str()[i]);\n  }\n\n  return env_var.GetString();\n}\n\n// Parses 'str' for a 32-bit signed integer.  If successful, writes\n// the result to *value and returns true; otherwise leaves *value\n// unchanged and returns false.\nbool ParseInt32(const Message& src_text, const char* str, Int32* value) {\n  // Parses the environment variable as a decimal integer.\n  char* end = NULL;\n  const long long_value = strtol(str, &end, 10);  // NOLINT\n\n  // Has strtol() consumed all characters in the string?\n  if (*end != '\\0') {\n    // No - an invalid character was encountered.\n    Message msg;\n    msg << \"WARNING: \" << src_text\n        << \" is expected to be a 32-bit integer, but actually\"\n        << \" has value \\\"\" << str << \"\\\".\\n\";\n    printf(\"%s\", msg.GetString().c_str());\n    fflush(stdout);\n    return false;\n  }\n\n  // Is the parsed value in the range of an Int32?\n  const Int32 result = static_cast<Int32>(long_value);\n  if (long_value == LONG_MAX || long_value == LONG_MIN ||\n      // The parsed value overflows as a long.  (strtol() returns\n      // LONG_MAX or LONG_MIN when the input overflows.)\n      result != long_value\n      // The parsed value overflows as an Int32.\n      ) {\n    Message msg;\n    msg << \"WARNING: \" << src_text\n        << \" is expected to be a 32-bit integer, but actually\"\n        << \" has value \" << str << \", which overflows.\\n\";\n    printf(\"%s\", msg.GetString().c_str());\n    fflush(stdout);\n    return false;\n  }\n\n  *value = result;\n  return true;\n}\n\n// Reads and returns the Boolean environment variable corresponding to\n// the given flag; if it's not set, returns default_value.\n//\n// The value is considered true iff it's not \"0\".\nbool BoolFromGTestEnv(const char* flag, bool default_value) {\n#if defined(GTEST_GET_BOOL_FROM_ENV_)\n  return GTEST_GET_BOOL_FROM_ENV_(flag, default_value);\n#else\n  const std::string env_var = FlagToEnvVar(flag);\n  const char* const string_value = posix::GetEnv(env_var.c_str());\n  return string_value == NULL ?\n      default_value : strcmp(string_value, \"0\") != 0;\n#endif  // defined(GTEST_GET_BOOL_FROM_ENV_)\n}\n\n// Reads and returns a 32-bit integer stored in the environment\n// variable corresponding to the given flag; if it isn't set or\n// doesn't represent a valid 32-bit integer, returns default_value.\nInt32 Int32FromGTestEnv(const char* flag, Int32 default_value) {\n#if defined(GTEST_GET_INT32_FROM_ENV_)\n  return GTEST_GET_INT32_FROM_ENV_(flag, default_value);\n#else\n  const std::string env_var = FlagToEnvVar(flag);\n  const char* const string_value = posix::GetEnv(env_var.c_str());\n  if (string_value == NULL) {\n    // The environment variable is not set.\n    return default_value;\n  }\n\n  Int32 result = default_value;\n  if (!ParseInt32(Message() << \"Environment variable \" << env_var,\n                  string_value, &result)) {\n    printf(\"The default value %s is used.\\n\",\n           (Message() << default_value).GetString().c_str());\n    fflush(stdout);\n    return default_value;\n  }\n\n  return result;\n#endif  // defined(GTEST_GET_INT32_FROM_ENV_)\n}\n\n// As a special case for the 'output' flag, if GTEST_OUTPUT is not\n// set, we look for XML_OUTPUT_FILE, which is set by the Bazel build\n// system.  The value of XML_OUTPUT_FILE is a filename without the\n// \"xml:\" prefix of GTEST_OUTPUT.\n// Note that this is meant to be called at the call site so it does\n// not check that the flag is 'output'\n// In essence this checks an env variable called XML_OUTPUT_FILE\n// and if it is set we prepend \"xml:\" to its value, if it not set we return \"\"\nstd::string OutputFlagAlsoCheckEnvVar(){\n  std::string default_value_for_output_flag = \"\";\n  const char* xml_output_file_env = posix::GetEnv(\"XML_OUTPUT_FILE\");\n  if (NULL != xml_output_file_env) {\n    default_value_for_output_flag = std::string(\"xml:\") + xml_output_file_env;\n  }\n  return default_value_for_output_flag;\n}\n\n// Reads and returns the string environment variable corresponding to\n// the given flag; if it's not set, returns default_value.\nconst char* StringFromGTestEnv(const char* flag, const char* default_value) {\n#if defined(GTEST_GET_STRING_FROM_ENV_)\n  return GTEST_GET_STRING_FROM_ENV_(flag, default_value);\n#else\n  const std::string env_var = FlagToEnvVar(flag);\n  const char* const value = posix::GetEnv(env_var.c_str());\n  return value == NULL ? default_value : value;\n#endif  // defined(GTEST_GET_STRING_FROM_ENV_)\n}\n\n}  // namespace internal\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/src/gtest-printers.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Test - The Google C++ Testing and Mocking Framework\n//\n// This file implements a universal value printer that can print a\n// value of any type T:\n//\n//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);\n//\n// It uses the << operator when possible, and prints the bytes in the\n// object otherwise.  A user can override its behavior for a class\n// type Foo by defining either operator<<(::std::ostream&, const Foo&)\n// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that\n// defines Foo.\n\n#include \"gtest/gtest-printers.h\"\n#include <stdio.h>\n#include <cctype>\n#include <cwchar>\n#include <ostream>  // NOLINT\n#include <string>\n#include \"gtest/internal/gtest-port.h\"\n#include \"src/gtest-internal-inl.h\"\n\nnamespace testing {\n\nnamespace {\n\nusing ::std::ostream;\n\n// Prints a segment of bytes in the given object.\nGTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_\nGTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_\nGTEST_ATTRIBUTE_NO_SANITIZE_THREAD_\nvoid PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,\n                                size_t count, ostream* os) {\n  char text[5] = \"\";\n  for (size_t i = 0; i != count; i++) {\n    const size_t j = start + i;\n    if (i != 0) {\n      // Organizes the bytes into groups of 2 for easy parsing by\n      // human.\n      if ((j % 2) == 0)\n        *os << ' ';\n      else\n        *os << '-';\n    }\n    GTEST_SNPRINTF_(text, sizeof(text), \"%02X\", obj_bytes[j]);\n    *os << text;\n  }\n}\n\n// Prints the bytes in the given value to the given ostream.\nvoid PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,\n                              ostream* os) {\n  // Tells the user how big the object is.\n  *os << count << \"-byte object <\";\n\n  const size_t kThreshold = 132;\n  const size_t kChunkSize = 64;\n  // If the object size is bigger than kThreshold, we'll have to omit\n  // some details by printing only the first and the last kChunkSize\n  // bytes.\n  // FIXME: let the user control the threshold using a flag.\n  if (count < kThreshold) {\n    PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);\n  } else {\n    PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);\n    *os << \" ... \";\n    // Rounds up to 2-byte boundary.\n    const size_t resume_pos = (count - kChunkSize + 1)/2*2;\n    PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);\n  }\n  *os << \">\";\n}\n\n}  // namespace\n\nnamespace internal2 {\n\n// Delegates to PrintBytesInObjectToImpl() to print the bytes in the\n// given object.  The delegation simplifies the implementation, which\n// uses the << operator and thus is easier done outside of the\n// ::testing::internal namespace, which contains a << operator that\n// sometimes conflicts with the one in STL.\nvoid PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,\n                          ostream* os) {\n  PrintBytesInObjectToImpl(obj_bytes, count, os);\n}\n\n}  // namespace internal2\n\nnamespace internal {\n\n// Depending on the value of a char (or wchar_t), we print it in one\n// of three formats:\n//   - as is if it's a printable ASCII (e.g. 'a', '2', ' '),\n//   - as a hexadecimal escape sequence (e.g. '\\x7F'), or\n//   - as a special escape sequence (e.g. '\\r', '\\n').\nenum CharFormat {\n  kAsIs,\n  kHexEscape,\n  kSpecialEscape\n};\n\n// Returns true if c is a printable ASCII character.  We test the\n// value of c directly instead of calling isprint(), which is buggy on\n// Windows Mobile.\ninline bool IsPrintableAscii(wchar_t c) {\n  return 0x20 <= c && c <= 0x7E;\n}\n\n// Prints a wide or narrow char c as a character literal without the\n// quotes, escaping it when necessary; returns how c was formatted.\n// The template argument UnsignedChar is the unsigned version of Char,\n// which is the type of c.\ntemplate <typename UnsignedChar, typename Char>\nstatic CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {\n  switch (static_cast<wchar_t>(c)) {\n    case L'\\0':\n      *os << \"\\\\0\";\n      break;\n    case L'\\'':\n      *os << \"\\\\'\";\n      break;\n    case L'\\\\':\n      *os << \"\\\\\\\\\";\n      break;\n    case L'\\a':\n      *os << \"\\\\a\";\n      break;\n    case L'\\b':\n      *os << \"\\\\b\";\n      break;\n    case L'\\f':\n      *os << \"\\\\f\";\n      break;\n    case L'\\n':\n      *os << \"\\\\n\";\n      break;\n    case L'\\r':\n      *os << \"\\\\r\";\n      break;\n    case L'\\t':\n      *os << \"\\\\t\";\n      break;\n    case L'\\v':\n      *os << \"\\\\v\";\n      break;\n    default:\n      if (IsPrintableAscii(c)) {\n        *os << static_cast<char>(c);\n        return kAsIs;\n      } else {\n        ostream::fmtflags flags = os->flags();\n        *os << \"\\\\x\" << std::hex << std::uppercase\n            << static_cast<int>(static_cast<UnsignedChar>(c));\n        os->flags(flags);\n        return kHexEscape;\n      }\n  }\n  return kSpecialEscape;\n}\n\n// Prints a wchar_t c as if it's part of a string literal, escaping it when\n// necessary; returns how c was formatted.\nstatic CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {\n  switch (c) {\n    case L'\\'':\n      *os << \"'\";\n      return kAsIs;\n    case L'\"':\n      *os << \"\\\\\\\"\";\n      return kSpecialEscape;\n    default:\n      return PrintAsCharLiteralTo<wchar_t>(c, os);\n  }\n}\n\n// Prints a char c as if it's part of a string literal, escaping it when\n// necessary; returns how c was formatted.\nstatic CharFormat PrintAsStringLiteralTo(char c, ostream* os) {\n  return PrintAsStringLiteralTo(\n      static_cast<wchar_t>(static_cast<unsigned char>(c)), os);\n}\n\n// Prints a wide or narrow character c and its code.  '\\0' is printed\n// as \"'\\\\0'\", other unprintable characters are also properly escaped\n// using the standard C++ escape sequence.  The template argument\n// UnsignedChar is the unsigned version of Char, which is the type of c.\ntemplate <typename UnsignedChar, typename Char>\nvoid PrintCharAndCodeTo(Char c, ostream* os) {\n  // First, print c as a literal in the most readable form we can find.\n  *os << ((sizeof(c) > 1) ? \"L'\" : \"'\");\n  const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os);\n  *os << \"'\";\n\n  // To aid user debugging, we also print c's code in decimal, unless\n  // it's 0 (in which case c was printed as '\\\\0', making the code\n  // obvious).\n  if (c == 0)\n    return;\n  *os << \" (\" << static_cast<int>(c);\n\n  // For more convenience, we print c's code again in hexadecimal,\n  // unless c was already printed in the form '\\x##' or the code is in\n  // [1, 9].\n  if (format == kHexEscape || (1 <= c && c <= 9)) {\n    // Do nothing.\n  } else {\n    *os << \", 0x\" << String::FormatHexInt(static_cast<UnsignedChar>(c));\n  }\n  *os << \")\";\n}\n\nvoid PrintTo(unsigned char c, ::std::ostream* os) {\n  PrintCharAndCodeTo<unsigned char>(c, os);\n}\nvoid PrintTo(signed char c, ::std::ostream* os) {\n  PrintCharAndCodeTo<unsigned char>(c, os);\n}\n\n// Prints a wchar_t as a symbol if it is printable or as its internal\n// code otherwise and also as its code.  L'\\0' is printed as \"L'\\\\0'\".\nvoid PrintTo(wchar_t wc, ostream* os) {\n  PrintCharAndCodeTo<wchar_t>(wc, os);\n}\n\n// Prints the given array of characters to the ostream.  CharType must be either\n// char or wchar_t.\n// The array starts at begin, the length is len, it may include '\\0' characters\n// and may not be NUL-terminated.\ntemplate <typename CharType>\nGTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_\nGTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_\nGTEST_ATTRIBUTE_NO_SANITIZE_THREAD_\nstatic CharFormat PrintCharsAsStringTo(\n    const CharType* begin, size_t len, ostream* os) {\n  const char* const kQuoteBegin = sizeof(CharType) == 1 ? \"\\\"\" : \"L\\\"\";\n  *os << kQuoteBegin;\n  bool is_previous_hex = false;\n  CharFormat print_format = kAsIs;\n  for (size_t index = 0; index < len; ++index) {\n    const CharType cur = begin[index];\n    if (is_previous_hex && IsXDigit(cur)) {\n      // Previous character is of '\\x..' form and this character can be\n      // interpreted as another hexadecimal digit in its number. Break string to\n      // disambiguate.\n      *os << \"\\\" \" << kQuoteBegin;\n    }\n    is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape;\n    // Remember if any characters required hex escaping.\n    if (is_previous_hex) {\n      print_format = kHexEscape;\n    }\n  }\n  *os << \"\\\"\";\n  return print_format;\n}\n\n// Prints a (const) char/wchar_t array of 'len' elements, starting at address\n// 'begin'.  CharType must be either char or wchar_t.\ntemplate <typename CharType>\nGTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_\nGTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_\nGTEST_ATTRIBUTE_NO_SANITIZE_THREAD_\nstatic void UniversalPrintCharArray(\n    const CharType* begin, size_t len, ostream* os) {\n  // The code\n  //   const char kFoo[] = \"foo\";\n  // generates an array of 4, not 3, elements, with the last one being '\\0'.\n  //\n  // Therefore when printing a char array, we don't print the last element if\n  // it's '\\0', such that the output matches the string literal as it's\n  // written in the source code.\n  if (len > 0 && begin[len - 1] == '\\0') {\n    PrintCharsAsStringTo(begin, len - 1, os);\n    return;\n  }\n\n  // If, however, the last element in the array is not '\\0', e.g.\n  //    const char kFoo[] = { 'f', 'o', 'o' };\n  // we must print the entire array.  We also print a message to indicate\n  // that the array is not NUL-terminated.\n  PrintCharsAsStringTo(begin, len, os);\n  *os << \" (no terminating NUL)\";\n}\n\n// Prints a (const) char array of 'len' elements, starting at address 'begin'.\nvoid UniversalPrintArray(const char* begin, size_t len, ostream* os) {\n  UniversalPrintCharArray(begin, len, os);\n}\n\n// Prints a (const) wchar_t array of 'len' elements, starting at address\n// 'begin'.\nvoid UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {\n  UniversalPrintCharArray(begin, len, os);\n}\n\n// Prints the given C string to the ostream.\nvoid PrintTo(const char* s, ostream* os) {\n  if (s == NULL) {\n    *os << \"NULL\";\n  } else {\n    *os << ImplicitCast_<const void*>(s) << \" pointing to \";\n    PrintCharsAsStringTo(s, strlen(s), os);\n  }\n}\n\n// MSVC compiler can be configured to define whar_t as a typedef\n// of unsigned short. Defining an overload for const wchar_t* in that case\n// would cause pointers to unsigned shorts be printed as wide strings,\n// possibly accessing more memory than intended and causing invalid\n// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when\n// wchar_t is implemented as a native type.\n#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)\n// Prints the given wide C string to the ostream.\nvoid PrintTo(const wchar_t* s, ostream* os) {\n  if (s == NULL) {\n    *os << \"NULL\";\n  } else {\n    *os << ImplicitCast_<const void*>(s) << \" pointing to \";\n    PrintCharsAsStringTo(s, std::wcslen(s), os);\n  }\n}\n#endif  // wchar_t is native\n\nnamespace {\n\nbool ContainsUnprintableControlCodes(const char* str, size_t length) {\n  const unsigned char *s = reinterpret_cast<const unsigned char *>(str);\n\n  for (size_t i = 0; i < length; i++) {\n    unsigned char ch = *s++;\n    if (std::iscntrl(ch)) {\n        switch (ch) {\n        case '\\t':\n        case '\\n':\n        case '\\r':\n          break;\n        default:\n          return true;\n        }\n      }\n  }\n  return false;\n}\n\nbool IsUTF8TrailByte(unsigned char t) { return 0x80 <= t && t<= 0xbf; }\n\nbool IsValidUTF8(const char* str, size_t length) {\n  const unsigned char *s = reinterpret_cast<const unsigned char *>(str);\n\n  for (size_t i = 0; i < length;) {\n    unsigned char lead = s[i++];\n\n    if (lead <= 0x7f) {\n      continue;  // single-byte character (ASCII) 0..7F\n    }\n    if (lead < 0xc2) {\n      return false;  // trail byte or non-shortest form\n    } else if (lead <= 0xdf && (i + 1) <= length && IsUTF8TrailByte(s[i])) {\n      ++i;  // 2-byte character\n    } else if (0xe0 <= lead && lead <= 0xef && (i + 2) <= length &&\n               IsUTF8TrailByte(s[i]) &&\n               IsUTF8TrailByte(s[i + 1]) &&\n               // check for non-shortest form and surrogate\n               (lead != 0xe0 || s[i] >= 0xa0) &&\n               (lead != 0xed || s[i] < 0xa0)) {\n      i += 2;  // 3-byte character\n    } else if (0xf0 <= lead && lead <= 0xf4 && (i + 3) <= length &&\n               IsUTF8TrailByte(s[i]) &&\n               IsUTF8TrailByte(s[i + 1]) &&\n               IsUTF8TrailByte(s[i + 2]) &&\n               // check for non-shortest form\n               (lead != 0xf0 || s[i] >= 0x90) &&\n               (lead != 0xf4 || s[i] < 0x90)) {\n      i += 3;  // 4-byte character\n    } else {\n      return false;\n    }\n  }\n  return true;\n}\n\nvoid ConditionalPrintAsText(const char* str, size_t length, ostream* os) {\n  if (!ContainsUnprintableControlCodes(str, length) &&\n      IsValidUTF8(str, length)) {\n    *os << \"\\n    As Text: \\\"\" << str << \"\\\"\";\n  }\n}\n\n}  // anonymous namespace\n\n// Prints a ::string object.\n#if GTEST_HAS_GLOBAL_STRING\nvoid PrintStringTo(const ::string& s, ostream* os) {\n  if (PrintCharsAsStringTo(s.data(), s.size(), os) == kHexEscape) {\n    if (GTEST_FLAG(print_utf8)) {\n      ConditionalPrintAsText(s.data(), s.size(), os);\n    }\n  }\n}\n#endif  // GTEST_HAS_GLOBAL_STRING\n\nvoid PrintStringTo(const ::std::string& s, ostream* os) {\n  if (PrintCharsAsStringTo(s.data(), s.size(), os) == kHexEscape) {\n    if (GTEST_FLAG(print_utf8)) {\n      ConditionalPrintAsText(s.data(), s.size(), os);\n    }\n  }\n}\n\n// Prints a ::wstring object.\n#if GTEST_HAS_GLOBAL_WSTRING\nvoid PrintWideStringTo(const ::wstring& s, ostream* os) {\n  PrintCharsAsStringTo(s.data(), s.size(), os);\n}\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n#if GTEST_HAS_STD_WSTRING\nvoid PrintWideStringTo(const ::std::wstring& s, ostream* os) {\n  PrintCharsAsStringTo(s.data(), s.size(), os);\n}\n#endif  // GTEST_HAS_STD_WSTRING\n\n}  // namespace internal\n\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/src/gtest-test-part.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n\n#include \"gtest/gtest-test-part.h\"\n#include \"src/gtest-internal-inl.h\"\n\nnamespace testing {\n\nusing internal::GetUnitTestImpl;\n\n// Gets the summary of the failure message by omitting the stack trace\n// in it.\nstd::string TestPartResult::ExtractSummary(const char* message) {\n  const char* const stack_trace = strstr(message, internal::kStackTraceMarker);\n  return stack_trace == NULL ? message :\n      std::string(message, stack_trace);\n}\n\n// Prints a TestPartResult object.\nstd::ostream& operator<<(std::ostream& os, const TestPartResult& result) {\n  return os\n      << result.file_name() << \":\" << result.line_number() << \": \"\n      << (result.type() == TestPartResult::kSuccess ? \"Success\" :\n          result.type() == TestPartResult::kFatalFailure ? \"Fatal failure\" :\n          \"Non-fatal failure\") << \":\\n\"\n      << result.message() << std::endl;\n}\n\n// Appends a TestPartResult to the array.\nvoid TestPartResultArray::Append(const TestPartResult& result) {\n  array_.push_back(result);\n}\n\n// Returns the TestPartResult at the given index (0-based).\nconst TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {\n  if (index < 0 || index >= size()) {\n    printf(\"\\nInvalid index (%d) into TestPartResultArray.\\n\", index);\n    internal::posix::Abort();\n  }\n\n  return array_[index];\n}\n\n// Returns the number of TestPartResult objects in the array.\nint TestPartResultArray::size() const {\n  return static_cast<int>(array_.size());\n}\n\nnamespace internal {\n\nHasNewFatalFailureHelper::HasNewFatalFailureHelper()\n    : has_new_fatal_failure_(false),\n      original_reporter_(GetUnitTestImpl()->\n                         GetTestPartResultReporterForCurrentThread()) {\n  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);\n}\n\nHasNewFatalFailureHelper::~HasNewFatalFailureHelper() {\n  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(\n      original_reporter_);\n}\n\nvoid HasNewFatalFailureHelper::ReportTestPartResult(\n    const TestPartResult& result) {\n  if (result.fatally_failed())\n    has_new_fatal_failure_ = true;\n  original_reporter_->ReportTestPartResult(result);\n}\n\n}  // namespace internal\n\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/src/gtest-typed-test.cc",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include \"gtest/gtest-typed-test.h\"\n\n#include \"gtest/gtest.h\"\n\nnamespace testing {\nnamespace internal {\n\n#if GTEST_HAS_TYPED_TEST_P\n\n// Skips to the first non-space char in str. Returns an empty string if str\n// contains only whitespace characters.\nstatic const char* SkipSpaces(const char* str) {\n  while (IsSpace(*str))\n    str++;\n  return str;\n}\n\nstatic std::vector<std::string> SplitIntoTestNames(const char* src) {\n  std::vector<std::string> name_vec;\n  src = SkipSpaces(src);\n  for (; src != NULL; src = SkipComma(src)) {\n    name_vec.push_back(StripTrailingSpaces(GetPrefixUntilComma(src)));\n  }\n  return name_vec;\n}\n\n// Verifies that registered_tests match the test names in\n// registered_tests_; returns registered_tests if successful, or\n// aborts the program otherwise.\nconst char* TypedTestCasePState::VerifyRegisteredTestNames(\n    const char* file, int line, const char* registered_tests) {\n  typedef RegisteredTestsMap::const_iterator RegisteredTestIter;\n  registered_ = true;\n\n  std::vector<std::string> name_vec = SplitIntoTestNames(registered_tests);\n\n  Message errors;\n\n  std::set<std::string> tests;\n  for (std::vector<std::string>::const_iterator name_it = name_vec.begin();\n       name_it != name_vec.end(); ++name_it) {\n    const std::string& name = *name_it;\n    if (tests.count(name) != 0) {\n      errors << \"Test \" << name << \" is listed more than once.\\n\";\n      continue;\n    }\n\n    bool found = false;\n    for (RegisteredTestIter it = registered_tests_.begin();\n         it != registered_tests_.end();\n         ++it) {\n      if (name == it->first) {\n        found = true;\n        break;\n      }\n    }\n\n    if (found) {\n      tests.insert(name);\n    } else {\n      errors << \"No test named \" << name\n             << \" can be found in this test case.\\n\";\n    }\n  }\n\n  for (RegisteredTestIter it = registered_tests_.begin();\n       it != registered_tests_.end();\n       ++it) {\n    if (tests.count(it->first) == 0) {\n      errors << \"You forgot to list test \" << it->first << \".\\n\";\n    }\n  }\n\n  const std::string& errors_str = errors.GetString();\n  if (errors_str != \"\") {\n    fprintf(stderr, \"%s %s\", FormatFileLocation(file, line).c_str(),\n            errors_str.c_str());\n    fflush(stderr);\n    posix::Abort();\n  }\n\n  return registered_tests;\n}\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n\n}  // namespace internal\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/src/gtest.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n\n#include \"gtest/gtest.h\"\n#include \"gtest/internal/custom/gtest.h\"\n#include \"gtest/gtest-spi.h\"\n\n#include <ctype.h>\n#include <math.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <time.h>\n#include <wchar.h>\n#include <wctype.h>\n\n#include <algorithm>\n#include <iomanip>\n#include <limits>\n#include <list>\n#include <map>\n#include <ostream>  // NOLINT\n#include <sstream>\n#include <vector>\n\n#if GTEST_OS_LINUX\n\n// FIXME: Use autoconf to detect availability of\n// gettimeofday().\n# define GTEST_HAS_GETTIMEOFDAY_ 1\n\n# include <fcntl.h>  // NOLINT\n# include <limits.h>  // NOLINT\n# include <sched.h>  // NOLINT\n// Declares vsnprintf().  This header is not available on Windows.\n# include <strings.h>  // NOLINT\n# include <sys/mman.h>  // NOLINT\n# include <sys/time.h>  // NOLINT\n# include <unistd.h>  // NOLINT\n# include <string>\n\n#elif GTEST_OS_SYMBIAN\n# define GTEST_HAS_GETTIMEOFDAY_ 1\n# include <sys/time.h>  // NOLINT\n\n#elif GTEST_OS_ZOS\n# define GTEST_HAS_GETTIMEOFDAY_ 1\n# include <sys/time.h>  // NOLINT\n\n// On z/OS we additionally need strings.h for strcasecmp.\n# include <strings.h>  // NOLINT\n\n#elif GTEST_OS_WINDOWS_MOBILE  // We are on Windows CE.\n\n# include <windows.h>  // NOLINT\n# undef min\n\n#elif GTEST_OS_WINDOWS  // We are on Windows proper.\n\n# include <io.h>  // NOLINT\n# include <sys/timeb.h>  // NOLINT\n# include <sys/types.h>  // NOLINT\n# include <sys/stat.h>  // NOLINT\n\n# if GTEST_OS_WINDOWS_MINGW\n// MinGW has gettimeofday() but not _ftime64().\n// FIXME: Use autoconf to detect availability of\n//   gettimeofday().\n// FIXME: There are other ways to get the time on\n//   Windows, like GetTickCount() or GetSystemTimeAsFileTime().  MinGW\n//   supports these.  consider using them instead.\n#  define GTEST_HAS_GETTIMEOFDAY_ 1\n#  include <sys/time.h>  // NOLINT\n# endif  // GTEST_OS_WINDOWS_MINGW\n\n// cpplint thinks that the header is already included, so we want to\n// silence it.\n# include <windows.h>  // NOLINT\n# undef min\n\n#else\n\n// Assume other platforms have gettimeofday().\n// FIXME: Use autoconf to detect availability of\n//   gettimeofday().\n# define GTEST_HAS_GETTIMEOFDAY_ 1\n\n// cpplint thinks that the header is already included, so we want to\n// silence it.\n# include <sys/time.h>  // NOLINT\n# include <unistd.h>  // NOLINT\n\n#endif  // GTEST_OS_LINUX\n\n#if GTEST_HAS_EXCEPTIONS\n# include <stdexcept>\n#endif\n\n#if GTEST_CAN_STREAM_RESULTS_\n# include <arpa/inet.h>  // NOLINT\n# include <netdb.h>  // NOLINT\n# include <sys/socket.h>  // NOLINT\n# include <sys/types.h>  // NOLINT\n#endif\n\n#include \"src/gtest-internal-inl.h\"\n\n#if GTEST_OS_WINDOWS\n# define vsnprintf _vsnprintf\n#endif  // GTEST_OS_WINDOWS\n\n#if GTEST_OS_MAC\n#ifndef GTEST_OS_IOS\n#include <crt_externs.h>\n#endif\n#endif\n\n#if GTEST_HAS_ABSL\n#include \"absl/debugging/failure_signal_handler.h\"\n#include \"absl/debugging/stacktrace.h\"\n#include \"absl/debugging/symbolize.h\"\n#include \"absl/strings/str_cat.h\"\n#endif  // GTEST_HAS_ABSL\n\nnamespace testing {\n\nusing internal::CountIf;\nusing internal::ForEach;\nusing internal::GetElementOr;\nusing internal::Shuffle;\n\n// Constants.\n\n// A test whose test case name or test name matches this filter is\n// disabled and not run.\nstatic const char kDisableTestFilter[] = \"DISABLED_*:*/DISABLED_*\";\n\n// A test case whose name matches this filter is considered a death\n// test case and will be run before test cases whose name doesn't\n// match this filter.\nstatic const char kDeathTestCaseFilter[] = \"*DeathTest:*DeathTest/*\";\n\n// A test filter that matches everything.\nstatic const char kUniversalFilter[] = \"*\";\n\n// The default output format.\nstatic const char kDefaultOutputFormat[] = \"xml\";\n// The default output file.\nstatic const char kDefaultOutputFile[] = \"test_detail\";\n\n// The environment variable name for the test shard index.\nstatic const char kTestShardIndex[] = \"GTEST_SHARD_INDEX\";\n// The environment variable name for the total number of test shards.\nstatic const char kTestTotalShards[] = \"GTEST_TOTAL_SHARDS\";\n// The environment variable name for the test shard status file.\nstatic const char kTestShardStatusFile[] = \"GTEST_SHARD_STATUS_FILE\";\n\nnamespace internal {\n\n// The text used in failure messages to indicate the start of the\n// stack trace.\nconst char kStackTraceMarker[] = \"\\nStack trace:\\n\";\n\n// g_help_flag is true iff the --help flag or an equivalent form is\n// specified on the command line.\nbool g_help_flag = false;\n\n// Utilty function to Open File for Writing\nstatic FILE* OpenFileForWriting(const std::string& output_file) {\n  FILE* fileout = NULL;\n  FilePath output_file_path(output_file);\n  FilePath output_dir(output_file_path.RemoveFileName());\n\n  if (output_dir.CreateDirectoriesRecursively()) {\n    fileout = posix::FOpen(output_file.c_str(), \"w\");\n  }\n  if (fileout == NULL) {\n    GTEST_LOG_(FATAL) << \"Unable to open file \\\"\" << output_file << \"\\\"\";\n  }\n  return fileout;\n}\n\n}  // namespace internal\n\n// Bazel passes in the argument to '--test_filter' via the TESTBRIDGE_TEST_ONLY\n// environment variable.\nstatic const char* GetDefaultFilter() {\n  const char* const testbridge_test_only =\n      internal::posix::GetEnv(\"TESTBRIDGE_TEST_ONLY\");\n  if (testbridge_test_only != NULL) {\n    return testbridge_test_only;\n  }\n  return kUniversalFilter;\n}\n\nGTEST_DEFINE_bool_(\n    also_run_disabled_tests,\n    internal::BoolFromGTestEnv(\"also_run_disabled_tests\", false),\n    \"Run disabled tests too, in addition to the tests normally being run.\");\n\nGTEST_DEFINE_bool_(\n    break_on_failure,\n    internal::BoolFromGTestEnv(\"break_on_failure\", false),\n    \"True iff a failed assertion should be a debugger break-point.\");\n\nGTEST_DEFINE_bool_(\n    catch_exceptions,\n    internal::BoolFromGTestEnv(\"catch_exceptions\", true),\n    \"True iff \" GTEST_NAME_\n    \" should catch exceptions and treat them as test failures.\");\n\nGTEST_DEFINE_string_(\n    color,\n    internal::StringFromGTestEnv(\"color\", \"auto\"),\n    \"Whether to use colors in the output.  Valid values: yes, no, \"\n    \"and auto.  'auto' means to use colors if the output is \"\n    \"being sent to a terminal and the TERM environment variable \"\n    \"is set to a terminal type that supports colors.\");\n\nGTEST_DEFINE_string_(\n    filter,\n    internal::StringFromGTestEnv(\"filter\", GetDefaultFilter()),\n    \"A colon-separated list of glob (not regex) patterns \"\n    \"for filtering the tests to run, optionally followed by a \"\n    \"'-' and a : separated list of negative patterns (tests to \"\n    \"exclude).  A test is run if it matches one of the positive \"\n    \"patterns and does not match any of the negative patterns.\");\n\nGTEST_DEFINE_bool_(\n    install_failure_signal_handler,\n    internal::BoolFromGTestEnv(\"install_failure_signal_handler\", false),\n    \"If true and supported on the current platform, \" GTEST_NAME_ \" should \"\n    \"install a signal handler that dumps debugging information when fatal \"\n    \"signals are raised.\");\n\nGTEST_DEFINE_bool_(list_tests, false,\n                   \"List all tests without running them.\");\n\n// The net priority order after flag processing is thus:\n//   --gtest_output command line flag\n//   GTEST_OUTPUT environment variable\n//   XML_OUTPUT_FILE environment variable\n//   ''\nGTEST_DEFINE_string_(\n    output,\n    internal::StringFromGTestEnv(\"output\",\n      internal::OutputFlagAlsoCheckEnvVar().c_str()),\n    \"A format (defaults to \\\"xml\\\" but can be specified to be \\\"json\\\"), \"\n    \"optionally followed by a colon and an output file name or directory. \"\n    \"A directory is indicated by a trailing pathname separator. \"\n    \"Examples: \\\"xml:filename.xml\\\", \\\"xml::directoryname/\\\". \"\n    \"If a directory is specified, output files will be created \"\n    \"within that directory, with file-names based on the test \"\n    \"executable's name and, if necessary, made unique by adding \"\n    \"digits.\");\n\nGTEST_DEFINE_bool_(\n    print_time,\n    internal::BoolFromGTestEnv(\"print_time\", true),\n    \"True iff \" GTEST_NAME_\n    \" should display elapsed time in text output.\");\n\nGTEST_DEFINE_bool_(\n    print_utf8,\n    internal::BoolFromGTestEnv(\"print_utf8\", true),\n    \"True iff \" GTEST_NAME_\n    \" prints UTF8 characters as text.\");\n\nGTEST_DEFINE_int32_(\n    random_seed,\n    internal::Int32FromGTestEnv(\"random_seed\", 0),\n    \"Random number seed to use when shuffling test orders.  Must be in range \"\n    \"[1, 99999], or 0 to use a seed based on the current time.\");\n\nGTEST_DEFINE_int32_(\n    repeat,\n    internal::Int32FromGTestEnv(\"repeat\", 1),\n    \"How many times to repeat each test.  Specify a negative number \"\n    \"for repeating forever.  Useful for shaking out flaky tests.\");\n\nGTEST_DEFINE_bool_(\n    show_internal_stack_frames, false,\n    \"True iff \" GTEST_NAME_ \" should include internal stack frames when \"\n    \"printing test failure stack traces.\");\n\nGTEST_DEFINE_bool_(\n    shuffle,\n    internal::BoolFromGTestEnv(\"shuffle\", false),\n    \"True iff \" GTEST_NAME_\n    \" should randomize tests' order on every run.\");\n\nGTEST_DEFINE_int32_(\n    stack_trace_depth,\n    internal::Int32FromGTestEnv(\"stack_trace_depth\", kMaxStackTraceDepth),\n    \"The maximum number of stack frames to print when an \"\n    \"assertion fails.  The valid range is 0 through 100, inclusive.\");\n\nGTEST_DEFINE_string_(\n    stream_result_to,\n    internal::StringFromGTestEnv(\"stream_result_to\", \"\"),\n    \"This flag specifies the host name and the port number on which to stream \"\n    \"test results. Example: \\\"localhost:555\\\". The flag is effective only on \"\n    \"Linux.\");\n\nGTEST_DEFINE_bool_(\n    throw_on_failure,\n    internal::BoolFromGTestEnv(\"throw_on_failure\", false),\n    \"When this flag is specified, a failed assertion will throw an exception \"\n    \"if exceptions are enabled or exit the program with a non-zero code \"\n    \"otherwise. For use with an external test framework.\");\n\n#if GTEST_USE_OWN_FLAGFILE_FLAG_\nGTEST_DEFINE_string_(\n    flagfile,\n    internal::StringFromGTestEnv(\"flagfile\", \"\"),\n    \"This flag specifies the flagfile to read command-line flags from.\");\n#endif  // GTEST_USE_OWN_FLAGFILE_FLAG_\n\nnamespace internal {\n\n// Generates a random number from [0, range), using a Linear\n// Congruential Generator (LCG).  Crashes if 'range' is 0 or greater\n// than kMaxRange.\nUInt32 Random::Generate(UInt32 range) {\n  // These constants are the same as are used in glibc's rand(3).\n  // Use wider types than necessary to prevent unsigned overflow diagnostics.\n  state_ = static_cast<UInt32>(1103515245ULL*state_ + 12345U) % kMaxRange;\n\n  GTEST_CHECK_(range > 0)\n      << \"Cannot generate a number in the range [0, 0).\";\n  GTEST_CHECK_(range <= kMaxRange)\n      << \"Generation of a number in [0, \" << range << \") was requested, \"\n      << \"but this can only generate numbers in [0, \" << kMaxRange << \").\";\n\n  // Converting via modulus introduces a bit of downward bias, but\n  // it's simple, and a linear congruential generator isn't too good\n  // to begin with.\n  return state_ % range;\n}\n\n// GTestIsInitialized() returns true iff the user has initialized\n// Google Test.  Useful for catching the user mistake of not initializing\n// Google Test before calling RUN_ALL_TESTS().\nstatic bool GTestIsInitialized() { return GetArgvs().size() > 0; }\n\n// Iterates over a vector of TestCases, keeping a running sum of the\n// results of calling a given int-returning method on each.\n// Returns the sum.\nstatic int SumOverTestCaseList(const std::vector<TestCase*>& case_list,\n                               int (TestCase::*method)() const) {\n  int sum = 0;\n  for (size_t i = 0; i < case_list.size(); i++) {\n    sum += (case_list[i]->*method)();\n  }\n  return sum;\n}\n\n// Returns true iff the test case passed.\nstatic bool TestCasePassed(const TestCase* test_case) {\n  return test_case->should_run() && test_case->Passed();\n}\n\n// Returns true iff the test case failed.\nstatic bool TestCaseFailed(const TestCase* test_case) {\n  return test_case->should_run() && test_case->Failed();\n}\n\n// Returns true iff test_case contains at least one test that should\n// run.\nstatic bool ShouldRunTestCase(const TestCase* test_case) {\n  return test_case->should_run();\n}\n\n// AssertHelper constructor.\nAssertHelper::AssertHelper(TestPartResult::Type type,\n                           const char* file,\n                           int line,\n                           const char* message)\n    : data_(new AssertHelperData(type, file, line, message)) {\n}\n\nAssertHelper::~AssertHelper() {\n  delete data_;\n}\n\n// Message assignment, for assertion streaming support.\nvoid AssertHelper::operator=(const Message& message) const {\n  UnitTest::GetInstance()->\n    AddTestPartResult(data_->type, data_->file, data_->line,\n                      AppendUserMessage(data_->message, message),\n                      UnitTest::GetInstance()->impl()\n                      ->CurrentOsStackTraceExceptTop(1)\n                      // Skips the stack frame for this function itself.\n                      );  // NOLINT\n}\n\n// Mutex for linked pointers.\nGTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);\n\n// A copy of all command line arguments.  Set by InitGoogleTest().\nstatic ::std::vector<std::string> g_argvs;\n\n::std::vector<std::string> GetArgvs() {\n#if defined(GTEST_CUSTOM_GET_ARGVS_)\n  // GTEST_CUSTOM_GET_ARGVS_() may return a container of std::string or\n  // ::string. This code converts it to the appropriate type.\n  const auto& custom = GTEST_CUSTOM_GET_ARGVS_();\n  return ::std::vector<std::string>(custom.begin(), custom.end());\n#else   // defined(GTEST_CUSTOM_GET_ARGVS_)\n  return g_argvs;\n#endif  // defined(GTEST_CUSTOM_GET_ARGVS_)\n}\n\n// Returns the current application's name, removing directory path if that\n// is present.\nFilePath GetCurrentExecutableName() {\n  FilePath result;\n\n#if GTEST_OS_WINDOWS\n  result.Set(FilePath(GetArgvs()[0]).RemoveExtension(\"exe\"));\n#else\n  result.Set(FilePath(GetArgvs()[0]));\n#endif  // GTEST_OS_WINDOWS\n\n  return result.RemoveDirectoryName();\n}\n\n// Functions for processing the gtest_output flag.\n\n// Returns the output format, or \"\" for normal printed output.\nstd::string UnitTestOptions::GetOutputFormat() {\n  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();\n  const char* const colon = strchr(gtest_output_flag, ':');\n  return (colon == NULL) ?\n      std::string(gtest_output_flag) :\n      std::string(gtest_output_flag, colon - gtest_output_flag);\n}\n\n// Returns the name of the requested output file, or the default if none\n// was explicitly specified.\nstd::string UnitTestOptions::GetAbsolutePathToOutputFile() {\n  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();\n\n  std::string format = GetOutputFormat();\n  if (format.empty())\n    format = std::string(kDefaultOutputFormat);\n\n  const char* const colon = strchr(gtest_output_flag, ':');\n  if (colon == NULL)\n    return internal::FilePath::MakeFileName(\n        internal::FilePath(\n            UnitTest::GetInstance()->original_working_dir()),\n        internal::FilePath(kDefaultOutputFile), 0,\n        format.c_str()).string();\n\n  internal::FilePath output_name(colon + 1);\n  if (!output_name.IsAbsolutePath())\n    // FIXME: on Windows \\some\\path is not an absolute\n    // path (as its meaning depends on the current drive), yet the\n    // following logic for turning it into an absolute path is wrong.\n    // Fix it.\n    output_name = internal::FilePath::ConcatPaths(\n        internal::FilePath(UnitTest::GetInstance()->original_working_dir()),\n        internal::FilePath(colon + 1));\n\n  if (!output_name.IsDirectory())\n    return output_name.string();\n\n  internal::FilePath result(internal::FilePath::GenerateUniqueFileName(\n      output_name, internal::GetCurrentExecutableName(),\n      GetOutputFormat().c_str()));\n  return result.string();\n}\n\n// Returns true iff the wildcard pattern matches the string.  The\n// first ':' or '\\0' character in pattern marks the end of it.\n//\n// This recursive algorithm isn't very efficient, but is clear and\n// works well enough for matching test names, which are short.\nbool UnitTestOptions::PatternMatchesString(const char *pattern,\n                                           const char *str) {\n  switch (*pattern) {\n    case '\\0':\n    case ':':  // Either ':' or '\\0' marks the end of the pattern.\n      return *str == '\\0';\n    case '?':  // Matches any single character.\n      return *str != '\\0' && PatternMatchesString(pattern + 1, str + 1);\n    case '*':  // Matches any string (possibly empty) of characters.\n      return (*str != '\\0' && PatternMatchesString(pattern, str + 1)) ||\n          PatternMatchesString(pattern + 1, str);\n    default:  // Non-special character.  Matches itself.\n      return *pattern == *str &&\n          PatternMatchesString(pattern + 1, str + 1);\n  }\n}\n\nbool UnitTestOptions::MatchesFilter(\n    const std::string& name, const char* filter) {\n  const char *cur_pattern = filter;\n  for (;;) {\n    if (PatternMatchesString(cur_pattern, name.c_str())) {\n      return true;\n    }\n\n    // Finds the next pattern in the filter.\n    cur_pattern = strchr(cur_pattern, ':');\n\n    // Returns if no more pattern can be found.\n    if (cur_pattern == NULL) {\n      return false;\n    }\n\n    // Skips the pattern separater (the ':' character).\n    cur_pattern++;\n  }\n}\n\n// Returns true iff the user-specified filter matches the test case\n// name and the test name.\nbool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,\n                                        const std::string &test_name) {\n  const std::string& full_name = test_case_name + \".\" + test_name.c_str();\n\n  // Split --gtest_filter at '-', if there is one, to separate into\n  // positive filter and negative filter portions\n  const char* const p = GTEST_FLAG(filter).c_str();\n  const char* const dash = strchr(p, '-');\n  std::string positive;\n  std::string negative;\n  if (dash == NULL) {\n    positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter\n    negative = \"\";\n  } else {\n    positive = std::string(p, dash);   // Everything up to the dash\n    negative = std::string(dash + 1);  // Everything after the dash\n    if (positive.empty()) {\n      // Treat '-test1' as the same as '*-test1'\n      positive = kUniversalFilter;\n    }\n  }\n\n  // A filter is a colon-separated list of patterns.  It matches a\n  // test if any pattern in it matches the test.\n  return (MatchesFilter(full_name, positive.c_str()) &&\n          !MatchesFilter(full_name, negative.c_str()));\n}\n\n#if GTEST_HAS_SEH\n// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the\n// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.\n// This function is useful as an __except condition.\nint UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {\n  // Google Test should handle a SEH exception if:\n  //   1. the user wants it to, AND\n  //   2. this is not a breakpoint exception, AND\n  //   3. this is not a C++ exception (VC++ implements them via SEH,\n  //      apparently).\n  //\n  // SEH exception code for C++ exceptions.\n  // (see http://support.microsoft.com/kb/185294 for more information).\n  const DWORD kCxxExceptionCode = 0xe06d7363;\n\n  bool should_handle = true;\n\n  if (!GTEST_FLAG(catch_exceptions))\n    should_handle = false;\n  else if (exception_code == EXCEPTION_BREAKPOINT)\n    should_handle = false;\n  else if (exception_code == kCxxExceptionCode)\n    should_handle = false;\n\n  return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;\n}\n#endif  // GTEST_HAS_SEH\n\n}  // namespace internal\n\n// The c'tor sets this object as the test part result reporter used by\n// Google Test.  The 'result' parameter specifies where to report the\n// results. Intercepts only failures from the current thread.\nScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(\n    TestPartResultArray* result)\n    : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),\n      result_(result) {\n  Init();\n}\n\n// The c'tor sets this object as the test part result reporter used by\n// Google Test.  The 'result' parameter specifies where to report the\n// results.\nScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(\n    InterceptMode intercept_mode, TestPartResultArray* result)\n    : intercept_mode_(intercept_mode),\n      result_(result) {\n  Init();\n}\n\nvoid ScopedFakeTestPartResultReporter::Init() {\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {\n    old_reporter_ = impl->GetGlobalTestPartResultReporter();\n    impl->SetGlobalTestPartResultReporter(this);\n  } else {\n    old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();\n    impl->SetTestPartResultReporterForCurrentThread(this);\n  }\n}\n\n// The d'tor restores the test part result reporter used by Google Test\n// before.\nScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {\n    impl->SetGlobalTestPartResultReporter(old_reporter_);\n  } else {\n    impl->SetTestPartResultReporterForCurrentThread(old_reporter_);\n  }\n}\n\n// Increments the test part result count and remembers the result.\n// This method is from the TestPartResultReporterInterface interface.\nvoid ScopedFakeTestPartResultReporter::ReportTestPartResult(\n    const TestPartResult& result) {\n  result_->Append(result);\n}\n\nnamespace internal {\n\n// Returns the type ID of ::testing::Test.  We should always call this\n// instead of GetTypeId< ::testing::Test>() to get the type ID of\n// testing::Test.  This is to work around a suspected linker bug when\n// using Google Test as a framework on Mac OS X.  The bug causes\n// GetTypeId< ::testing::Test>() to return different values depending\n// on whether the call is from the Google Test framework itself or\n// from user test code.  GetTestTypeId() is guaranteed to always\n// return the same value, as it always calls GetTypeId<>() from the\n// gtest.cc, which is within the Google Test framework.\nTypeId GetTestTypeId() {\n  return GetTypeId<Test>();\n}\n\n// The value of GetTestTypeId() as seen from within the Google Test\n// library.  This is solely for testing GetTestTypeId().\nextern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();\n\n// This predicate-formatter checks that 'results' contains a test part\n// failure of the given type and that the failure message contains the\n// given substring.\nstatic AssertionResult HasOneFailure(const char* /* results_expr */,\n                                     const char* /* type_expr */,\n                                     const char* /* substr_expr */,\n                                     const TestPartResultArray& results,\n                                     TestPartResult::Type type,\n                                     const std::string& substr) {\n  const std::string expected(type == TestPartResult::kFatalFailure ?\n                        \"1 fatal failure\" :\n                        \"1 non-fatal failure\");\n  Message msg;\n  if (results.size() != 1) {\n    msg << \"Expected: \" << expected << \"\\n\"\n        << \"  Actual: \" << results.size() << \" failures\";\n    for (int i = 0; i < results.size(); i++) {\n      msg << \"\\n\" << results.GetTestPartResult(i);\n    }\n    return AssertionFailure() << msg;\n  }\n\n  const TestPartResult& r = results.GetTestPartResult(0);\n  if (r.type() != type) {\n    return AssertionFailure() << \"Expected: \" << expected << \"\\n\"\n                              << \"  Actual:\\n\"\n                              << r;\n  }\n\n  if (strstr(r.message(), substr.c_str()) == NULL) {\n    return AssertionFailure() << \"Expected: \" << expected << \" containing \\\"\"\n                              << substr << \"\\\"\\n\"\n                              << \"  Actual:\\n\"\n                              << r;\n  }\n\n  return AssertionSuccess();\n}\n\n// The constructor of SingleFailureChecker remembers where to look up\n// test part results, what type of failure we expect, and what\n// substring the failure message should contain.\nSingleFailureChecker::SingleFailureChecker(const TestPartResultArray* results,\n                                           TestPartResult::Type type,\n                                           const std::string& substr)\n    : results_(results), type_(type), substr_(substr) {}\n\n// The destructor of SingleFailureChecker verifies that the given\n// TestPartResultArray contains exactly one failure that has the given\n// type and contains the given substring.  If that's not the case, a\n// non-fatal failure will be generated.\nSingleFailureChecker::~SingleFailureChecker() {\n  EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);\n}\n\nDefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(\n    UnitTestImpl* unit_test) : unit_test_(unit_test) {}\n\nvoid DefaultGlobalTestPartResultReporter::ReportTestPartResult(\n    const TestPartResult& result) {\n  unit_test_->current_test_result()->AddTestPartResult(result);\n  unit_test_->listeners()->repeater()->OnTestPartResult(result);\n}\n\nDefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(\n    UnitTestImpl* unit_test) : unit_test_(unit_test) {}\n\nvoid DefaultPerThreadTestPartResultReporter::ReportTestPartResult(\n    const TestPartResult& result) {\n  unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);\n}\n\n// Returns the global test part result reporter.\nTestPartResultReporterInterface*\nUnitTestImpl::GetGlobalTestPartResultReporter() {\n  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);\n  return global_test_part_result_repoter_;\n}\n\n// Sets the global test part result reporter.\nvoid UnitTestImpl::SetGlobalTestPartResultReporter(\n    TestPartResultReporterInterface* reporter) {\n  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);\n  global_test_part_result_repoter_ = reporter;\n}\n\n// Returns the test part result reporter for the current thread.\nTestPartResultReporterInterface*\nUnitTestImpl::GetTestPartResultReporterForCurrentThread() {\n  return per_thread_test_part_result_reporter_.get();\n}\n\n// Sets the test part result reporter for the current thread.\nvoid UnitTestImpl::SetTestPartResultReporterForCurrentThread(\n    TestPartResultReporterInterface* reporter) {\n  per_thread_test_part_result_reporter_.set(reporter);\n}\n\n// Gets the number of successful test cases.\nint UnitTestImpl::successful_test_case_count() const {\n  return CountIf(test_cases_, TestCasePassed);\n}\n\n// Gets the number of failed test cases.\nint UnitTestImpl::failed_test_case_count() const {\n  return CountIf(test_cases_, TestCaseFailed);\n}\n\n// Gets the number of all test cases.\nint UnitTestImpl::total_test_case_count() const {\n  return static_cast<int>(test_cases_.size());\n}\n\n// Gets the number of all test cases that contain at least one test\n// that should run.\nint UnitTestImpl::test_case_to_run_count() const {\n  return CountIf(test_cases_, ShouldRunTestCase);\n}\n\n// Gets the number of successful tests.\nint UnitTestImpl::successful_test_count() const {\n  return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);\n}\n\n// Gets the number of failed tests.\nint UnitTestImpl::failed_test_count() const {\n  return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);\n}\n\n// Gets the number of disabled tests that will be reported in the XML report.\nint UnitTestImpl::reportable_disabled_test_count() const {\n  return SumOverTestCaseList(test_cases_,\n                             &TestCase::reportable_disabled_test_count);\n}\n\n// Gets the number of disabled tests.\nint UnitTestImpl::disabled_test_count() const {\n  return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);\n}\n\n// Gets the number of tests to be printed in the XML report.\nint UnitTestImpl::reportable_test_count() const {\n  return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count);\n}\n\n// Gets the number of all tests.\nint UnitTestImpl::total_test_count() const {\n  return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);\n}\n\n// Gets the number of tests that should run.\nint UnitTestImpl::test_to_run_count() const {\n  return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);\n}\n\n// Returns the current OS stack trace as an std::string.\n//\n// The maximum number of stack frames to be included is specified by\n// the gtest_stack_trace_depth flag.  The skip_count parameter\n// specifies the number of top frames to be skipped, which doesn't\n// count against the number of frames to be included.\n//\n// For example, if Foo() calls Bar(), which in turn calls\n// CurrentOsStackTraceExceptTop(1), Foo() will be included in the\n// trace but Bar() and CurrentOsStackTraceExceptTop() won't.\nstd::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {\n  return os_stack_trace_getter()->CurrentStackTrace(\n      static_cast<int>(GTEST_FLAG(stack_trace_depth)),\n      skip_count + 1\n      // Skips the user-specified number of frames plus this function\n      // itself.\n      );  // NOLINT\n}\n\n// Returns the current time in milliseconds.\nTimeInMillis GetTimeInMillis() {\n#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)\n  // Difference between 1970-01-01 and 1601-01-01 in milliseconds.\n  // http://analogous.blogspot.com/2005/04/epoch.html\n  const TimeInMillis kJavaEpochToWinFileTimeDelta =\n    static_cast<TimeInMillis>(116444736UL) * 100000UL;\n  const DWORD kTenthMicrosInMilliSecond = 10000;\n\n  SYSTEMTIME now_systime;\n  FILETIME now_filetime;\n  ULARGE_INTEGER now_int64;\n  // FIXME: Shouldn't this just use\n  //   GetSystemTimeAsFileTime()?\n  GetSystemTime(&now_systime);\n  if (SystemTimeToFileTime(&now_systime, &now_filetime)) {\n    now_int64.LowPart = now_filetime.dwLowDateTime;\n    now_int64.HighPart = now_filetime.dwHighDateTime;\n    now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -\n      kJavaEpochToWinFileTimeDelta;\n    return now_int64.QuadPart;\n  }\n  return 0;\n#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_\n  __timeb64 now;\n\n  // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996\n  // (deprecated function) there.\n  // FIXME: Use GetTickCount()?  Or use\n  //   SystemTimeToFileTime()\n  GTEST_DISABLE_MSC_DEPRECATED_PUSH_()\n  _ftime64(&now);\n  GTEST_DISABLE_MSC_DEPRECATED_POP_()\n\n  return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;\n#elif GTEST_HAS_GETTIMEOFDAY_\n  struct timeval now;\n  gettimeofday(&now, NULL);\n  return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;\n#else\n# error \"Don't know how to get the current time on your system.\"\n#endif\n}\n\n// Utilities\n\n// class String.\n\n#if GTEST_OS_WINDOWS_MOBILE\n// Creates a UTF-16 wide string from the given ANSI string, allocating\n// memory using new. The caller is responsible for deleting the return\n// value using delete[]. Returns the wide string, or NULL if the\n// input is NULL.\nLPCWSTR String::AnsiToUtf16(const char* ansi) {\n  if (!ansi) return NULL;\n  const int length = strlen(ansi);\n  const int unicode_length =\n      MultiByteToWideChar(CP_ACP, 0, ansi, length,\n                          NULL, 0);\n  WCHAR* unicode = new WCHAR[unicode_length + 1];\n  MultiByteToWideChar(CP_ACP, 0, ansi, length,\n                      unicode, unicode_length);\n  unicode[unicode_length] = 0;\n  return unicode;\n}\n\n// Creates an ANSI string from the given wide string, allocating\n// memory using new. The caller is responsible for deleting the return\n// value using delete[]. Returns the ANSI string, or NULL if the\n// input is NULL.\nconst char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {\n  if (!utf16_str) return NULL;\n  const int ansi_length =\n      WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,\n                          NULL, 0, NULL, NULL);\n  char* ansi = new char[ansi_length + 1];\n  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,\n                      ansi, ansi_length, NULL, NULL);\n  ansi[ansi_length] = 0;\n  return ansi;\n}\n\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n// Compares two C strings.  Returns true iff they have the same content.\n//\n// Unlike strcmp(), this function can handle NULL argument(s).  A NULL\n// C string is considered different to any non-NULL C string,\n// including the empty string.\nbool String::CStringEquals(const char * lhs, const char * rhs) {\n  if ( lhs == NULL ) return rhs == NULL;\n\n  if ( rhs == NULL ) return false;\n\n  return strcmp(lhs, rhs) == 0;\n}\n\n#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING\n\n// Converts an array of wide chars to a narrow string using the UTF-8\n// encoding, and streams the result to the given Message object.\nstatic void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,\n                                     Message* msg) {\n  for (size_t i = 0; i != length; ) {  // NOLINT\n    if (wstr[i] != L'\\0') {\n      *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));\n      while (i != length && wstr[i] != L'\\0')\n        i++;\n    } else {\n      *msg << '\\0';\n      i++;\n    }\n  }\n}\n\n#endif  // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING\n\nvoid SplitString(const ::std::string& str, char delimiter,\n                 ::std::vector< ::std::string>* dest) {\n  ::std::vector< ::std::string> parsed;\n  ::std::string::size_type pos = 0;\n  while (::testing::internal::AlwaysTrue()) {\n    const ::std::string::size_type colon = str.find(delimiter, pos);\n    if (colon == ::std::string::npos) {\n      parsed.push_back(str.substr(pos));\n      break;\n    } else {\n      parsed.push_back(str.substr(pos, colon - pos));\n      pos = colon + 1;\n    }\n  }\n  dest->swap(parsed);\n}\n\n}  // namespace internal\n\n// Constructs an empty Message.\n// We allocate the stringstream separately because otherwise each use of\n// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's\n// stack frame leading to huge stack frames in some cases; gcc does not reuse\n// the stack space.\nMessage::Message() : ss_(new ::std::stringstream) {\n  // By default, we want there to be enough precision when printing\n  // a double to a Message.\n  *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);\n}\n\n// These two overloads allow streaming a wide C string to a Message\n// using the UTF-8 encoding.\nMessage& Message::operator <<(const wchar_t* wide_c_str) {\n  return *this << internal::String::ShowWideCString(wide_c_str);\n}\nMessage& Message::operator <<(wchar_t* wide_c_str) {\n  return *this << internal::String::ShowWideCString(wide_c_str);\n}\n\n#if GTEST_HAS_STD_WSTRING\n// Converts the given wide string to a narrow string using the UTF-8\n// encoding, and streams the result to this Message object.\nMessage& Message::operator <<(const ::std::wstring& wstr) {\n  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);\n  return *this;\n}\n#endif  // GTEST_HAS_STD_WSTRING\n\n#if GTEST_HAS_GLOBAL_WSTRING\n// Converts the given wide string to a narrow string using the UTF-8\n// encoding, and streams the result to this Message object.\nMessage& Message::operator <<(const ::wstring& wstr) {\n  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);\n  return *this;\n}\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n// Gets the text streamed to this object so far as an std::string.\n// Each '\\0' character in the buffer is replaced with \"\\\\0\".\nstd::string Message::GetString() const {\n  return internal::StringStreamToString(ss_.get());\n}\n\n// AssertionResult constructors.\n// Used in EXPECT_TRUE/FALSE(assertion_result).\nAssertionResult::AssertionResult(const AssertionResult& other)\n    : success_(other.success_),\n      message_(other.message_.get() != NULL ?\n               new ::std::string(*other.message_) :\n               static_cast< ::std::string*>(NULL)) {\n}\n\n// Swaps two AssertionResults.\nvoid AssertionResult::swap(AssertionResult& other) {\n  using std::swap;\n  swap(success_, other.success_);\n  swap(message_, other.message_);\n}\n\n// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.\nAssertionResult AssertionResult::operator!() const {\n  AssertionResult negation(!success_);\n  if (message_.get() != NULL)\n    negation << *message_;\n  return negation;\n}\n\n// Makes a successful assertion result.\nAssertionResult AssertionSuccess() {\n  return AssertionResult(true);\n}\n\n// Makes a failed assertion result.\nAssertionResult AssertionFailure() {\n  return AssertionResult(false);\n}\n\n// Makes a failed assertion result with the given failure message.\n// Deprecated; use AssertionFailure() << message.\nAssertionResult AssertionFailure(const Message& message) {\n  return AssertionFailure() << message;\n}\n\nnamespace internal {\n\nnamespace edit_distance {\nstd::vector<EditType> CalculateOptimalEdits(const std::vector<size_t>& left,\n                                            const std::vector<size_t>& right) {\n  std::vector<std::vector<double> > costs(\n      left.size() + 1, std::vector<double>(right.size() + 1));\n  std::vector<std::vector<EditType> > best_move(\n      left.size() + 1, std::vector<EditType>(right.size() + 1));\n\n  // Populate for empty right.\n  for (size_t l_i = 0; l_i < costs.size(); ++l_i) {\n    costs[l_i][0] = static_cast<double>(l_i);\n    best_move[l_i][0] = kRemove;\n  }\n  // Populate for empty left.\n  for (size_t r_i = 1; r_i < costs[0].size(); ++r_i) {\n    costs[0][r_i] = static_cast<double>(r_i);\n    best_move[0][r_i] = kAdd;\n  }\n\n  for (size_t l_i = 0; l_i < left.size(); ++l_i) {\n    for (size_t r_i = 0; r_i < right.size(); ++r_i) {\n      if (left[l_i] == right[r_i]) {\n        // Found a match. Consume it.\n        costs[l_i + 1][r_i + 1] = costs[l_i][r_i];\n        best_move[l_i + 1][r_i + 1] = kMatch;\n        continue;\n      }\n\n      const double add = costs[l_i + 1][r_i];\n      const double remove = costs[l_i][r_i + 1];\n      const double replace = costs[l_i][r_i];\n      if (add < remove && add < replace) {\n        costs[l_i + 1][r_i + 1] = add + 1;\n        best_move[l_i + 1][r_i + 1] = kAdd;\n      } else if (remove < add && remove < replace) {\n        costs[l_i + 1][r_i + 1] = remove + 1;\n        best_move[l_i + 1][r_i + 1] = kRemove;\n      } else {\n        // We make replace a little more expensive than add/remove to lower\n        // their priority.\n        costs[l_i + 1][r_i + 1] = replace + 1.00001;\n        best_move[l_i + 1][r_i + 1] = kReplace;\n      }\n    }\n  }\n\n  // Reconstruct the best path. We do it in reverse order.\n  std::vector<EditType> best_path;\n  for (size_t l_i = left.size(), r_i = right.size(); l_i > 0 || r_i > 0;) {\n    EditType move = best_move[l_i][r_i];\n    best_path.push_back(move);\n    l_i -= move != kAdd;\n    r_i -= move != kRemove;\n  }\n  std::reverse(best_path.begin(), best_path.end());\n  return best_path;\n}\n\nnamespace {\n\n// Helper class to convert string into ids with deduplication.\nclass InternalStrings {\n public:\n  size_t GetId(const std::string& str) {\n    IdMap::iterator it = ids_.find(str);\n    if (it != ids_.end()) return it->second;\n    size_t id = ids_.size();\n    return ids_[str] = id;\n  }\n\n private:\n  typedef std::map<std::string, size_t> IdMap;\n  IdMap ids_;\n};\n\n}  // namespace\n\nstd::vector<EditType> CalculateOptimalEdits(\n    const std::vector<std::string>& left,\n    const std::vector<std::string>& right) {\n  std::vector<size_t> left_ids, right_ids;\n  {\n    InternalStrings intern_table;\n    for (size_t i = 0; i < left.size(); ++i) {\n      left_ids.push_back(intern_table.GetId(left[i]));\n    }\n    for (size_t i = 0; i < right.size(); ++i) {\n      right_ids.push_back(intern_table.GetId(right[i]));\n    }\n  }\n  return CalculateOptimalEdits(left_ids, right_ids);\n}\n\nnamespace {\n\n// Helper class that holds the state for one hunk and prints it out to the\n// stream.\n// It reorders adds/removes when possible to group all removes before all\n// adds. It also adds the hunk header before printint into the stream.\nclass Hunk {\n public:\n  Hunk(size_t left_start, size_t right_start)\n      : left_start_(left_start),\n        right_start_(right_start),\n        adds_(),\n        removes_(),\n        common_() {}\n\n  void PushLine(char edit, const char* line) {\n    switch (edit) {\n      case ' ':\n        ++common_;\n        FlushEdits();\n        hunk_.push_back(std::make_pair(' ', line));\n        break;\n      case '-':\n        ++removes_;\n        hunk_removes_.push_back(std::make_pair('-', line));\n        break;\n      case '+':\n        ++adds_;\n        hunk_adds_.push_back(std::make_pair('+', line));\n        break;\n    }\n  }\n\n  void PrintTo(std::ostream* os) {\n    PrintHeader(os);\n    FlushEdits();\n    for (std::list<std::pair<char, const char*> >::const_iterator it =\n             hunk_.begin();\n         it != hunk_.end(); ++it) {\n      *os << it->first << it->second << \"\\n\";\n    }\n  }\n\n  bool has_edits() const { return adds_ || removes_; }\n\n private:\n  void FlushEdits() {\n    hunk_.splice(hunk_.end(), hunk_removes_);\n    hunk_.splice(hunk_.end(), hunk_adds_);\n  }\n\n  // Print a unified diff header for one hunk.\n  // The format is\n  //   \"@@ -<left_start>,<left_length> +<right_start>,<right_length> @@\"\n  // where the left/right parts are omitted if unnecessary.\n  void PrintHeader(std::ostream* ss) const {\n    *ss << \"@@ \";\n    if (removes_) {\n      *ss << \"-\" << left_start_ << \",\" << (removes_ + common_);\n    }\n    if (removes_ && adds_) {\n      *ss << \" \";\n    }\n    if (adds_) {\n      *ss << \"+\" << right_start_ << \",\" << (adds_ + common_);\n    }\n    *ss << \" @@\\n\";\n  }\n\n  size_t left_start_, right_start_;\n  size_t adds_, removes_, common_;\n  std::list<std::pair<char, const char*> > hunk_, hunk_adds_, hunk_removes_;\n};\n\n}  // namespace\n\n// Create a list of diff hunks in Unified diff format.\n// Each hunk has a header generated by PrintHeader above plus a body with\n// lines prefixed with ' ' for no change, '-' for deletion and '+' for\n// addition.\n// 'context' represents the desired unchanged prefix/suffix around the diff.\n// If two hunks are close enough that their contexts overlap, then they are\n// joined into one hunk.\nstd::string CreateUnifiedDiff(const std::vector<std::string>& left,\n                              const std::vector<std::string>& right,\n                              size_t context) {\n  const std::vector<EditType> edits = CalculateOptimalEdits(left, right);\n\n  size_t l_i = 0, r_i = 0, edit_i = 0;\n  std::stringstream ss;\n  while (edit_i < edits.size()) {\n    // Find first edit.\n    while (edit_i < edits.size() && edits[edit_i] == kMatch) {\n      ++l_i;\n      ++r_i;\n      ++edit_i;\n    }\n\n    // Find the first line to include in the hunk.\n    const size_t prefix_context = std::min(l_i, context);\n    Hunk hunk(l_i - prefix_context + 1, r_i - prefix_context + 1);\n    for (size_t i = prefix_context; i > 0; --i) {\n      hunk.PushLine(' ', left[l_i - i].c_str());\n    }\n\n    // Iterate the edits until we found enough suffix for the hunk or the input\n    // is over.\n    size_t n_suffix = 0;\n    for (; edit_i < edits.size(); ++edit_i) {\n      if (n_suffix >= context) {\n        // Continue only if the next hunk is very close.\n        std::vector<EditType>::const_iterator it = edits.begin() + edit_i;\n        while (it != edits.end() && *it == kMatch) ++it;\n        if (it == edits.end() || (it - edits.begin()) - edit_i >= context) {\n          // There is no next edit or it is too far away.\n          break;\n        }\n      }\n\n      EditType edit = edits[edit_i];\n      // Reset count when a non match is found.\n      n_suffix = edit == kMatch ? n_suffix + 1 : 0;\n\n      if (edit == kMatch || edit == kRemove || edit == kReplace) {\n        hunk.PushLine(edit == kMatch ? ' ' : '-', left[l_i].c_str());\n      }\n      if (edit == kAdd || edit == kReplace) {\n        hunk.PushLine('+', right[r_i].c_str());\n      }\n\n      // Advance indices, depending on edit type.\n      l_i += edit != kAdd;\n      r_i += edit != kRemove;\n    }\n\n    if (!hunk.has_edits()) {\n      // We are done. We don't want this hunk.\n      break;\n    }\n\n    hunk.PrintTo(&ss);\n  }\n  return ss.str();\n}\n\n}  // namespace edit_distance\n\nnamespace {\n\n// The string representation of the values received in EqFailure() are already\n// escaped. Split them on escaped '\\n' boundaries. Leave all other escaped\n// characters the same.\nstd::vector<std::string> SplitEscapedString(const std::string& str) {\n  std::vector<std::string> lines;\n  size_t start = 0, end = str.size();\n  if (end > 2 && str[0] == '\"' && str[end - 1] == '\"') {\n    ++start;\n    --end;\n  }\n  bool escaped = false;\n  for (size_t i = start; i + 1 < end; ++i) {\n    if (escaped) {\n      escaped = false;\n      if (str[i] == 'n') {\n        lines.push_back(str.substr(start, i - start - 1));\n        start = i + 1;\n      }\n    } else {\n      escaped = str[i] == '\\\\';\n    }\n  }\n  lines.push_back(str.substr(start, end - start));\n  return lines;\n}\n\n}  // namespace\n\n// Constructs and returns the message for an equality assertion\n// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.\n//\n// The first four parameters are the expressions used in the assertion\n// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)\n// where foo is 5 and bar is 6, we have:\n//\n//   lhs_expression: \"foo\"\n//   rhs_expression: \"bar\"\n//   lhs_value:      \"5\"\n//   rhs_value:      \"6\"\n//\n// The ignoring_case parameter is true iff the assertion is a\n// *_STRCASEEQ*.  When it's true, the string \"Ignoring case\" will\n// be inserted into the message.\nAssertionResult EqFailure(const char* lhs_expression,\n                          const char* rhs_expression,\n                          const std::string& lhs_value,\n                          const std::string& rhs_value,\n                          bool ignoring_case) {\n  Message msg;\n  msg << \"Expected equality of these values:\";\n  msg << \"\\n  \" << lhs_expression;\n  if (lhs_value != lhs_expression) {\n    msg << \"\\n    Which is: \" << lhs_value;\n  }\n  msg << \"\\n  \" << rhs_expression;\n  if (rhs_value != rhs_expression) {\n    msg << \"\\n    Which is: \" << rhs_value;\n  }\n\n  if (ignoring_case) {\n    msg << \"\\nIgnoring case\";\n  }\n\n  if (!lhs_value.empty() && !rhs_value.empty()) {\n    const std::vector<std::string> lhs_lines =\n        SplitEscapedString(lhs_value);\n    const std::vector<std::string> rhs_lines =\n        SplitEscapedString(rhs_value);\n    if (lhs_lines.size() > 1 || rhs_lines.size() > 1) {\n      msg << \"\\nWith diff:\\n\"\n          << edit_distance::CreateUnifiedDiff(lhs_lines, rhs_lines);\n    }\n  }\n\n  return AssertionFailure() << msg;\n}\n\n// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.\nstd::string GetBoolAssertionFailureMessage(\n    const AssertionResult& assertion_result,\n    const char* expression_text,\n    const char* actual_predicate_value,\n    const char* expected_predicate_value) {\n  const char* actual_message = assertion_result.message();\n  Message msg;\n  msg << \"Value of: \" << expression_text\n      << \"\\n  Actual: \" << actual_predicate_value;\n  if (actual_message[0] != '\\0')\n    msg << \" (\" << actual_message << \")\";\n  msg << \"\\nExpected: \" << expected_predicate_value;\n  return msg.GetString();\n}\n\n// Helper function for implementing ASSERT_NEAR.\nAssertionResult DoubleNearPredFormat(const char* expr1,\n                                     const char* expr2,\n                                     const char* abs_error_expr,\n                                     double val1,\n                                     double val2,\n                                     double abs_error) {\n  const double diff = fabs(val1 - val2);\n  if (diff <= abs_error) return AssertionSuccess();\n\n  // FIXME: do not print the value of an expression if it's\n  // already a literal.\n  return AssertionFailure()\n      << \"The difference between \" << expr1 << \" and \" << expr2\n      << \" is \" << diff << \", which exceeds \" << abs_error_expr << \", where\\n\"\n      << expr1 << \" evaluates to \" << val1 << \",\\n\"\n      << expr2 << \" evaluates to \" << val2 << \", and\\n\"\n      << abs_error_expr << \" evaluates to \" << abs_error << \".\";\n}\n\n\n// Helper template for implementing FloatLE() and DoubleLE().\ntemplate <typename RawType>\nAssertionResult FloatingPointLE(const char* expr1,\n                                const char* expr2,\n                                RawType val1,\n                                RawType val2) {\n  // Returns success if val1 is less than val2,\n  if (val1 < val2) {\n    return AssertionSuccess();\n  }\n\n  // or if val1 is almost equal to val2.\n  const FloatingPoint<RawType> lhs(val1), rhs(val2);\n  if (lhs.AlmostEquals(rhs)) {\n    return AssertionSuccess();\n  }\n\n  // Note that the above two checks will both fail if either val1 or\n  // val2 is NaN, as the IEEE floating-point standard requires that\n  // any predicate involving a NaN must return false.\n\n  ::std::stringstream val1_ss;\n  val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)\n          << val1;\n\n  ::std::stringstream val2_ss;\n  val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)\n          << val2;\n\n  return AssertionFailure()\n      << \"Expected: (\" << expr1 << \") <= (\" << expr2 << \")\\n\"\n      << \"  Actual: \" << StringStreamToString(&val1_ss) << \" vs \"\n      << StringStreamToString(&val2_ss);\n}\n\n}  // namespace internal\n\n// Asserts that val1 is less than, or almost equal to, val2.  Fails\n// otherwise.  In particular, it fails if either val1 or val2 is NaN.\nAssertionResult FloatLE(const char* expr1, const char* expr2,\n                        float val1, float val2) {\n  return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);\n}\n\n// Asserts that val1 is less than, or almost equal to, val2.  Fails\n// otherwise.  In particular, it fails if either val1 or val2 is NaN.\nAssertionResult DoubleLE(const char* expr1, const char* expr2,\n                         double val1, double val2) {\n  return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);\n}\n\nnamespace internal {\n\n// The helper function for {ASSERT|EXPECT}_EQ with int or enum\n// arguments.\nAssertionResult CmpHelperEQ(const char* lhs_expression,\n                            const char* rhs_expression,\n                            BiggestInt lhs,\n                            BiggestInt rhs) {\n  if (lhs == rhs) {\n    return AssertionSuccess();\n  }\n\n  return EqFailure(lhs_expression,\n                   rhs_expression,\n                   FormatForComparisonFailureMessage(lhs, rhs),\n                   FormatForComparisonFailureMessage(rhs, lhs),\n                   false);\n}\n\n// A macro for implementing the helper functions needed to implement\n// ASSERT_?? and EXPECT_?? with integer or enum arguments.  It is here\n// just to avoid copy-and-paste of similar code.\n#define GTEST_IMPL_CMP_HELPER_(op_name, op)\\\nAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \\\n                                   BiggestInt val1, BiggestInt val2) {\\\n  if (val1 op val2) {\\\n    return AssertionSuccess();\\\n  } else {\\\n    return AssertionFailure() \\\n        << \"Expected: (\" << expr1 << \") \" #op \" (\" << expr2\\\n        << \"), actual: \" << FormatForComparisonFailureMessage(val1, val2)\\\n        << \" vs \" << FormatForComparisonFailureMessage(val2, val1);\\\n  }\\\n}\n\n// Implements the helper function for {ASSERT|EXPECT}_NE with int or\n// enum arguments.\nGTEST_IMPL_CMP_HELPER_(NE, !=)\n// Implements the helper function for {ASSERT|EXPECT}_LE with int or\n// enum arguments.\nGTEST_IMPL_CMP_HELPER_(LE, <=)\n// Implements the helper function for {ASSERT|EXPECT}_LT with int or\n// enum arguments.\nGTEST_IMPL_CMP_HELPER_(LT, < )\n// Implements the helper function for {ASSERT|EXPECT}_GE with int or\n// enum arguments.\nGTEST_IMPL_CMP_HELPER_(GE, >=)\n// Implements the helper function for {ASSERT|EXPECT}_GT with int or\n// enum arguments.\nGTEST_IMPL_CMP_HELPER_(GT, > )\n\n#undef GTEST_IMPL_CMP_HELPER_\n\n// The helper function for {ASSERT|EXPECT}_STREQ.\nAssertionResult CmpHelperSTREQ(const char* lhs_expression,\n                               const char* rhs_expression,\n                               const char* lhs,\n                               const char* rhs) {\n  if (String::CStringEquals(lhs, rhs)) {\n    return AssertionSuccess();\n  }\n\n  return EqFailure(lhs_expression,\n                   rhs_expression,\n                   PrintToString(lhs),\n                   PrintToString(rhs),\n                   false);\n}\n\n// The helper function for {ASSERT|EXPECT}_STRCASEEQ.\nAssertionResult CmpHelperSTRCASEEQ(const char* lhs_expression,\n                                   const char* rhs_expression,\n                                   const char* lhs,\n                                   const char* rhs) {\n  if (String::CaseInsensitiveCStringEquals(lhs, rhs)) {\n    return AssertionSuccess();\n  }\n\n  return EqFailure(lhs_expression,\n                   rhs_expression,\n                   PrintToString(lhs),\n                   PrintToString(rhs),\n                   true);\n}\n\n// The helper function for {ASSERT|EXPECT}_STRNE.\nAssertionResult CmpHelperSTRNE(const char* s1_expression,\n                               const char* s2_expression,\n                               const char* s1,\n                               const char* s2) {\n  if (!String::CStringEquals(s1, s2)) {\n    return AssertionSuccess();\n  } else {\n    return AssertionFailure() << \"Expected: (\" << s1_expression << \") != (\"\n                              << s2_expression << \"), actual: \\\"\"\n                              << s1 << \"\\\" vs \\\"\" << s2 << \"\\\"\";\n  }\n}\n\n// The helper function for {ASSERT|EXPECT}_STRCASENE.\nAssertionResult CmpHelperSTRCASENE(const char* s1_expression,\n                                   const char* s2_expression,\n                                   const char* s1,\n                                   const char* s2) {\n  if (!String::CaseInsensitiveCStringEquals(s1, s2)) {\n    return AssertionSuccess();\n  } else {\n    return AssertionFailure()\n        << \"Expected: (\" << s1_expression << \") != (\"\n        << s2_expression << \") (ignoring case), actual: \\\"\"\n        << s1 << \"\\\" vs \\\"\" << s2 << \"\\\"\";\n  }\n}\n\n}  // namespace internal\n\nnamespace {\n\n// Helper functions for implementing IsSubString() and IsNotSubstring().\n\n// This group of overloaded functions return true iff needle is a\n// substring of haystack.  NULL is considered a substring of itself\n// only.\n\nbool IsSubstringPred(const char* needle, const char* haystack) {\n  if (needle == NULL || haystack == NULL)\n    return needle == haystack;\n\n  return strstr(haystack, needle) != NULL;\n}\n\nbool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {\n  if (needle == NULL || haystack == NULL)\n    return needle == haystack;\n\n  return wcsstr(haystack, needle) != NULL;\n}\n\n// StringType here can be either ::std::string or ::std::wstring.\ntemplate <typename StringType>\nbool IsSubstringPred(const StringType& needle,\n                     const StringType& haystack) {\n  return haystack.find(needle) != StringType::npos;\n}\n\n// This function implements either IsSubstring() or IsNotSubstring(),\n// depending on the value of the expected_to_be_substring parameter.\n// StringType here can be const char*, const wchar_t*, ::std::string,\n// or ::std::wstring.\ntemplate <typename StringType>\nAssertionResult IsSubstringImpl(\n    bool expected_to_be_substring,\n    const char* needle_expr, const char* haystack_expr,\n    const StringType& needle, const StringType& haystack) {\n  if (IsSubstringPred(needle, haystack) == expected_to_be_substring)\n    return AssertionSuccess();\n\n  const bool is_wide_string = sizeof(needle[0]) > 1;\n  const char* const begin_string_quote = is_wide_string ? \"L\\\"\" : \"\\\"\";\n  return AssertionFailure()\n      << \"Value of: \" << needle_expr << \"\\n\"\n      << \"  Actual: \" << begin_string_quote << needle << \"\\\"\\n\"\n      << \"Expected: \" << (expected_to_be_substring ? \"\" : \"not \")\n      << \"a substring of \" << haystack_expr << \"\\n\"\n      << \"Which is: \" << begin_string_quote << haystack << \"\\\"\";\n}\n\n}  // namespace\n\n// IsSubstring() and IsNotSubstring() check whether needle is a\n// substring of haystack (NULL is considered a substring of itself\n// only), and return an appropriate error message when they fail.\n\nAssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const char* needle, const char* haystack) {\n  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const wchar_t* needle, const wchar_t* haystack) {\n  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const char* needle, const char* haystack) {\n  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const wchar_t* needle, const wchar_t* haystack) {\n  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::string& needle, const ::std::string& haystack) {\n  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::string& needle, const ::std::string& haystack) {\n  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);\n}\n\n#if GTEST_HAS_STD_WSTRING\nAssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::wstring& needle, const ::std::wstring& haystack) {\n  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::wstring& needle, const ::std::wstring& haystack) {\n  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);\n}\n#endif  // GTEST_HAS_STD_WSTRING\n\nnamespace internal {\n\n#if GTEST_OS_WINDOWS\n\nnamespace {\n\n// Helper function for IsHRESULT{SuccessFailure} predicates\nAssertionResult HRESULTFailureHelper(const char* expr,\n                                     const char* expected,\n                                     long hr) {  // NOLINT\n# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_TV_TITLE\n\n  // Windows CE doesn't support FormatMessage.\n  const char error_text[] = \"\";\n\n# else\n\n  // Looks up the human-readable system message for the HRESULT code\n  // and since we're not passing any params to FormatMessage, we don't\n  // want inserts expanded.\n  const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |\n                       FORMAT_MESSAGE_IGNORE_INSERTS;\n  const DWORD kBufSize = 4096;\n  // Gets the system's human readable message string for this HRESULT.\n  char error_text[kBufSize] = { '\\0' };\n  DWORD message_length = ::FormatMessageA(kFlags,\n                                          0,  // no source, we're asking system\n                                          hr,  // the error\n                                          0,  // no line width restrictions\n                                          error_text,  // output buffer\n                                          kBufSize,  // buf size\n                                          NULL);  // no arguments for inserts\n  // Trims tailing white space (FormatMessage leaves a trailing CR-LF)\n  for (; message_length && IsSpace(error_text[message_length - 1]);\n          --message_length) {\n    error_text[message_length - 1] = '\\0';\n  }\n\n# endif  // GTEST_OS_WINDOWS_MOBILE\n\n  const std::string error_hex(\"0x\" + String::FormatHexInt(hr));\n  return ::testing::AssertionFailure()\n      << \"Expected: \" << expr << \" \" << expected << \".\\n\"\n      << \"  Actual: \" << error_hex << \" \" << error_text << \"\\n\";\n}\n\n}  // namespace\n\nAssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NOLINT\n  if (SUCCEEDED(hr)) {\n    return AssertionSuccess();\n  }\n  return HRESULTFailureHelper(expr, \"succeeds\", hr);\n}\n\nAssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NOLINT\n  if (FAILED(hr)) {\n    return AssertionSuccess();\n  }\n  return HRESULTFailureHelper(expr, \"fails\", hr);\n}\n\n#endif  // GTEST_OS_WINDOWS\n\n// Utility functions for encoding Unicode text (wide strings) in\n// UTF-8.\n\n// A Unicode code-point can have up to 21 bits, and is encoded in UTF-8\n// like this:\n//\n// Code-point length   Encoding\n//   0 -  7 bits       0xxxxxxx\n//   8 - 11 bits       110xxxxx 10xxxxxx\n//  12 - 16 bits       1110xxxx 10xxxxxx 10xxxxxx\n//  17 - 21 bits       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n\n// The maximum code-point a one-byte UTF-8 sequence can represent.\nconst UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) <<  7) - 1;\n\n// The maximum code-point a two-byte UTF-8 sequence can represent.\nconst UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;\n\n// The maximum code-point a three-byte UTF-8 sequence can represent.\nconst UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;\n\n// The maximum code-point a four-byte UTF-8 sequence can represent.\nconst UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;\n\n// Chops off the n lowest bits from a bit pattern.  Returns the n\n// lowest bits.  As a side effect, the original bit pattern will be\n// shifted to the right by n bits.\ninline UInt32 ChopLowBits(UInt32* bits, int n) {\n  const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);\n  *bits >>= n;\n  return low_bits;\n}\n\n// Converts a Unicode code point to a narrow string in UTF-8 encoding.\n// code_point parameter is of type UInt32 because wchar_t may not be\n// wide enough to contain a code point.\n// If the code_point is not a valid Unicode code point\n// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted\n// to \"(Invalid Unicode 0xXXXXXXXX)\".\nstd::string CodePointToUtf8(UInt32 code_point) {\n  if (code_point > kMaxCodePoint4) {\n    return \"(Invalid Unicode 0x\" + String::FormatHexInt(code_point) + \")\";\n  }\n\n  char str[5];  // Big enough for the largest valid code point.\n  if (code_point <= kMaxCodePoint1) {\n    str[1] = '\\0';\n    str[0] = static_cast<char>(code_point);                          // 0xxxxxxx\n  } else if (code_point <= kMaxCodePoint2) {\n    str[2] = '\\0';\n    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[0] = static_cast<char>(0xC0 | code_point);                   // 110xxxxx\n  } else if (code_point <= kMaxCodePoint3) {\n    str[3] = '\\0';\n    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx\n  } else {  // code_point <= kMaxCodePoint4\n    str[4] = '\\0';\n    str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx\n  }\n  return str;\n}\n\n// The following two functions only make sense if the system\n// uses UTF-16 for wide string encoding. All supported systems\n// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.\n\n// Determines if the arguments constitute UTF-16 surrogate pair\n// and thus should be combined into a single Unicode code point\n// using CreateCodePointFromUtf16SurrogatePair.\ninline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {\n  return sizeof(wchar_t) == 2 &&\n      (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;\n}\n\n// Creates a Unicode code point from UTF16 surrogate pair.\ninline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,\n                                                    wchar_t second) {\n  const UInt32 mask = (1 << 10) - 1;\n  return (sizeof(wchar_t) == 2) ?\n      (((first & mask) << 10) | (second & mask)) + 0x10000 :\n      // This function should not be called when the condition is\n      // false, but we provide a sensible default in case it is.\n      static_cast<UInt32>(first);\n}\n\n// Converts a wide string to a narrow string in UTF-8 encoding.\n// The wide string is assumed to have the following encoding:\n//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)\n//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)\n// Parameter str points to a null-terminated wide string.\n// Parameter num_chars may additionally limit the number\n// of wchar_t characters processed. -1 is used when the entire string\n// should be processed.\n// If the string contains code points that are not valid Unicode code points\n// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output\n// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding\n// and contains invalid UTF-16 surrogate pairs, values in those pairs\n// will be encoded as individual Unicode characters from Basic Normal Plane.\nstd::string WideStringToUtf8(const wchar_t* str, int num_chars) {\n  if (num_chars == -1)\n    num_chars = static_cast<int>(wcslen(str));\n\n  ::std::stringstream stream;\n  for (int i = 0; i < num_chars; ++i) {\n    UInt32 unicode_code_point;\n\n    if (str[i] == L'\\0') {\n      break;\n    } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {\n      unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],\n                                                                 str[i + 1]);\n      i++;\n    } else {\n      unicode_code_point = static_cast<UInt32>(str[i]);\n    }\n\n    stream << CodePointToUtf8(unicode_code_point);\n  }\n  return StringStreamToString(&stream);\n}\n\n// Converts a wide C string to an std::string using the UTF-8 encoding.\n// NULL will be converted to \"(null)\".\nstd::string String::ShowWideCString(const wchar_t * wide_c_str) {\n  if (wide_c_str == NULL)  return \"(null)\";\n\n  return internal::WideStringToUtf8(wide_c_str, -1);\n}\n\n// Compares two wide C strings.  Returns true iff they have the same\n// content.\n//\n// Unlike wcscmp(), this function can handle NULL argument(s).  A NULL\n// C string is considered different to any non-NULL C string,\n// including the empty string.\nbool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {\n  if (lhs == NULL) return rhs == NULL;\n\n  if (rhs == NULL) return false;\n\n  return wcscmp(lhs, rhs) == 0;\n}\n\n// Helper function for *_STREQ on wide strings.\nAssertionResult CmpHelperSTREQ(const char* lhs_expression,\n                               const char* rhs_expression,\n                               const wchar_t* lhs,\n                               const wchar_t* rhs) {\n  if (String::WideCStringEquals(lhs, rhs)) {\n    return AssertionSuccess();\n  }\n\n  return EqFailure(lhs_expression,\n                   rhs_expression,\n                   PrintToString(lhs),\n                   PrintToString(rhs),\n                   false);\n}\n\n// Helper function for *_STRNE on wide strings.\nAssertionResult CmpHelperSTRNE(const char* s1_expression,\n                               const char* s2_expression,\n                               const wchar_t* s1,\n                               const wchar_t* s2) {\n  if (!String::WideCStringEquals(s1, s2)) {\n    return AssertionSuccess();\n  }\n\n  return AssertionFailure() << \"Expected: (\" << s1_expression << \") != (\"\n                            << s2_expression << \"), actual: \"\n                            << PrintToString(s1)\n                            << \" vs \" << PrintToString(s2);\n}\n\n// Compares two C strings, ignoring case.  Returns true iff they have\n// the same content.\n//\n// Unlike strcasecmp(), this function can handle NULL argument(s).  A\n// NULL C string is considered different to any non-NULL C string,\n// including the empty string.\nbool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {\n  if (lhs == NULL)\n    return rhs == NULL;\n  if (rhs == NULL)\n    return false;\n  return posix::StrCaseCmp(lhs, rhs) == 0;\n}\n\n  // Compares two wide C strings, ignoring case.  Returns true iff they\n  // have the same content.\n  //\n  // Unlike wcscasecmp(), this function can handle NULL argument(s).\n  // A NULL C string is considered different to any non-NULL wide C string,\n  // including the empty string.\n  // NB: The implementations on different platforms slightly differ.\n  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE\n  // environment variable. On GNU platform this method uses wcscasecmp\n  // which compares according to LC_CTYPE category of the current locale.\n  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the\n  // current locale.\nbool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,\n                                              const wchar_t* rhs) {\n  if (lhs == NULL) return rhs == NULL;\n\n  if (rhs == NULL) return false;\n\n#if GTEST_OS_WINDOWS\n  return _wcsicmp(lhs, rhs) == 0;\n#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID\n  return wcscasecmp(lhs, rhs) == 0;\n#else\n  // Android, Mac OS X and Cygwin don't define wcscasecmp.\n  // Other unknown OSes may not define it either.\n  wint_t left, right;\n  do {\n    left = towlower(*lhs++);\n    right = towlower(*rhs++);\n  } while (left && left == right);\n  return left == right;\n#endif  // OS selector\n}\n\n// Returns true iff str ends with the given suffix, ignoring case.\n// Any string is considered to end with an empty suffix.\nbool String::EndsWithCaseInsensitive(\n    const std::string& str, const std::string& suffix) {\n  const size_t str_len = str.length();\n  const size_t suffix_len = suffix.length();\n  return (str_len >= suffix_len) &&\n         CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len,\n                                      suffix.c_str());\n}\n\n// Formats an int value as \"%02d\".\nstd::string String::FormatIntWidth2(int value) {\n  std::stringstream ss;\n  ss << std::setfill('0') << std::setw(2) << value;\n  return ss.str();\n}\n\n// Formats an int value as \"%X\".\nstd::string String::FormatHexInt(int value) {\n  std::stringstream ss;\n  ss << std::hex << std::uppercase << value;\n  return ss.str();\n}\n\n// Formats a byte as \"%02X\".\nstd::string String::FormatByte(unsigned char value) {\n  std::stringstream ss;\n  ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase\n     << static_cast<unsigned int>(value);\n  return ss.str();\n}\n\n// Converts the buffer in a stringstream to an std::string, converting NUL\n// bytes to \"\\\\0\" along the way.\nstd::string StringStreamToString(::std::stringstream* ss) {\n  const ::std::string& str = ss->str();\n  const char* const start = str.c_str();\n  const char* const end = start + str.length();\n\n  std::string result;\n  result.reserve(2 * (end - start));\n  for (const char* ch = start; ch != end; ++ch) {\n    if (*ch == '\\0') {\n      result += \"\\\\0\";  // Replaces NUL with \"\\\\0\";\n    } else {\n      result += *ch;\n    }\n  }\n\n  return result;\n}\n\n// Appends the user-supplied message to the Google-Test-generated message.\nstd::string AppendUserMessage(const std::string& gtest_msg,\n                              const Message& user_msg) {\n  // Appends the user message if it's non-empty.\n  const std::string user_msg_string = user_msg.GetString();\n  if (user_msg_string.empty()) {\n    return gtest_msg;\n  }\n\n  return gtest_msg + \"\\n\" + user_msg_string;\n}\n\n}  // namespace internal\n\n// class TestResult\n\n// Creates an empty TestResult.\nTestResult::TestResult()\n    : death_test_count_(0),\n      elapsed_time_(0) {\n}\n\n// D'tor.\nTestResult::~TestResult() {\n}\n\n// Returns the i-th test part result among all the results. i can\n// range from 0 to total_part_count() - 1. If i is not in that range,\n// aborts the program.\nconst TestPartResult& TestResult::GetTestPartResult(int i) const {\n  if (i < 0 || i >= total_part_count())\n    internal::posix::Abort();\n  return test_part_results_.at(i);\n}\n\n// Returns the i-th test property. i can range from 0 to\n// test_property_count() - 1. If i is not in that range, aborts the\n// program.\nconst TestProperty& TestResult::GetTestProperty(int i) const {\n  if (i < 0 || i >= test_property_count())\n    internal::posix::Abort();\n  return test_properties_.at(i);\n}\n\n// Clears the test part results.\nvoid TestResult::ClearTestPartResults() {\n  test_part_results_.clear();\n}\n\n// Adds a test part result to the list.\nvoid TestResult::AddTestPartResult(const TestPartResult& test_part_result) {\n  test_part_results_.push_back(test_part_result);\n}\n\n// Adds a test property to the list. If a property with the same key as the\n// supplied property is already represented, the value of this test_property\n// replaces the old value for that key.\nvoid TestResult::RecordProperty(const std::string& xml_element,\n                                const TestProperty& test_property) {\n  if (!ValidateTestProperty(xml_element, test_property)) {\n    return;\n  }\n  internal::MutexLock lock(&test_properites_mutex_);\n  const std::vector<TestProperty>::iterator property_with_matching_key =\n      std::find_if(test_properties_.begin(), test_properties_.end(),\n                   internal::TestPropertyKeyIs(test_property.key()));\n  if (property_with_matching_key == test_properties_.end()) {\n    test_properties_.push_back(test_property);\n    return;\n  }\n  property_with_matching_key->SetValue(test_property.value());\n}\n\n// The list of reserved attributes used in the <testsuites> element of XML\n// output.\nstatic const char* const kReservedTestSuitesAttributes[] = {\n  \"disabled\",\n  \"errors\",\n  \"failures\",\n  \"name\",\n  \"random_seed\",\n  \"tests\",\n  \"time\",\n  \"timestamp\"\n};\n\n// The list of reserved attributes used in the <testsuite> element of XML\n// output.\nstatic const char* const kReservedTestSuiteAttributes[] = {\n  \"disabled\",\n  \"errors\",\n  \"failures\",\n  \"name\",\n  \"tests\",\n  \"time\"\n};\n\n// The list of reserved attributes used in the <testcase> element of XML output.\nstatic const char* const kReservedTestCaseAttributes[] = {\n    \"classname\",  \"name\",        \"status\", \"time\",\n    \"type_param\", \"value_param\", \"file\",   \"line\"};\n\ntemplate <int kSize>\nstd::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {\n  return std::vector<std::string>(array, array + kSize);\n}\n\nstatic std::vector<std::string> GetReservedAttributesForElement(\n    const std::string& xml_element) {\n  if (xml_element == \"testsuites\") {\n    return ArrayAsVector(kReservedTestSuitesAttributes);\n  } else if (xml_element == \"testsuite\") {\n    return ArrayAsVector(kReservedTestSuiteAttributes);\n  } else if (xml_element == \"testcase\") {\n    return ArrayAsVector(kReservedTestCaseAttributes);\n  } else {\n    GTEST_CHECK_(false) << \"Unrecognized xml_element provided: \" << xml_element;\n  }\n  // This code is unreachable but some compilers may not realizes that.\n  return std::vector<std::string>();\n}\n\nstatic std::string FormatWordList(const std::vector<std::string>& words) {\n  Message word_list;\n  for (size_t i = 0; i < words.size(); ++i) {\n    if (i > 0 && words.size() > 2) {\n      word_list << \", \";\n    }\n    if (i == words.size() - 1) {\n      word_list << \"and \";\n    }\n    word_list << \"'\" << words[i] << \"'\";\n  }\n  return word_list.GetString();\n}\n\nstatic bool ValidateTestPropertyName(\n    const std::string& property_name,\n    const std::vector<std::string>& reserved_names) {\n  if (std::find(reserved_names.begin(), reserved_names.end(), property_name) !=\n          reserved_names.end()) {\n    ADD_FAILURE() << \"Reserved key used in RecordProperty(): \" << property_name\n                  << \" (\" << FormatWordList(reserved_names)\n                  << \" are reserved by \" << GTEST_NAME_ << \")\";\n    return false;\n  }\n  return true;\n}\n\n// Adds a failure if the key is a reserved attribute of the element named\n// xml_element.  Returns true if the property is valid.\nbool TestResult::ValidateTestProperty(const std::string& xml_element,\n                                      const TestProperty& test_property) {\n  return ValidateTestPropertyName(test_property.key(),\n                                  GetReservedAttributesForElement(xml_element));\n}\n\n// Clears the object.\nvoid TestResult::Clear() {\n  test_part_results_.clear();\n  test_properties_.clear();\n  death_test_count_ = 0;\n  elapsed_time_ = 0;\n}\n\n// Returns true iff the test failed.\nbool TestResult::Failed() const {\n  for (int i = 0; i < total_part_count(); ++i) {\n    if (GetTestPartResult(i).failed())\n      return true;\n  }\n  return false;\n}\n\n// Returns true iff the test part fatally failed.\nstatic bool TestPartFatallyFailed(const TestPartResult& result) {\n  return result.fatally_failed();\n}\n\n// Returns true iff the test fatally failed.\nbool TestResult::HasFatalFailure() const {\n  return CountIf(test_part_results_, TestPartFatallyFailed) > 0;\n}\n\n// Returns true iff the test part non-fatally failed.\nstatic bool TestPartNonfatallyFailed(const TestPartResult& result) {\n  return result.nonfatally_failed();\n}\n\n// Returns true iff the test has a non-fatal failure.\nbool TestResult::HasNonfatalFailure() const {\n  return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;\n}\n\n// Gets the number of all test parts.  This is the sum of the number\n// of successful test parts and the number of failed test parts.\nint TestResult::total_part_count() const {\n  return static_cast<int>(test_part_results_.size());\n}\n\n// Returns the number of the test properties.\nint TestResult::test_property_count() const {\n  return static_cast<int>(test_properties_.size());\n}\n\n// class Test\n\n// Creates a Test object.\n\n// The c'tor saves the states of all flags.\nTest::Test()\n    : gtest_flag_saver_(new GTEST_FLAG_SAVER_) {\n}\n\n// The d'tor restores the states of all flags.  The actual work is\n// done by the d'tor of the gtest_flag_saver_ field, and thus not\n// visible here.\nTest::~Test() {\n}\n\n// Sets up the test fixture.\n//\n// A sub-class may override this.\nvoid Test::SetUp() {\n}\n\n// Tears down the test fixture.\n//\n// A sub-class may override this.\nvoid Test::TearDown() {\n}\n\n// Allows user supplied key value pairs to be recorded for later output.\nvoid Test::RecordProperty(const std::string& key, const std::string& value) {\n  UnitTest::GetInstance()->RecordProperty(key, value);\n}\n\n// Allows user supplied key value pairs to be recorded for later output.\nvoid Test::RecordProperty(const std::string& key, int value) {\n  Message value_message;\n  value_message << value;\n  RecordProperty(key, value_message.GetString().c_str());\n}\n\nnamespace internal {\n\nvoid ReportFailureInUnknownLocation(TestPartResult::Type result_type,\n                                    const std::string& message) {\n  // This function is a friend of UnitTest and as such has access to\n  // AddTestPartResult.\n  UnitTest::GetInstance()->AddTestPartResult(\n      result_type,\n      NULL,  // No info about the source file where the exception occurred.\n      -1,    // We have no info on which line caused the exception.\n      message,\n      \"\");   // No stack trace, either.\n}\n\n}  // namespace internal\n\n// Google Test requires all tests in the same test case to use the same test\n// fixture class.  This function checks if the current test has the\n// same fixture class as the first test in the current test case.  If\n// yes, it returns true; otherwise it generates a Google Test failure and\n// returns false.\nbool Test::HasSameFixtureClass() {\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  const TestCase* const test_case = impl->current_test_case();\n\n  // Info about the first test in the current test case.\n  const TestInfo* const first_test_info = test_case->test_info_list()[0];\n  const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;\n  const char* const first_test_name = first_test_info->name();\n\n  // Info about the current test.\n  const TestInfo* const this_test_info = impl->current_test_info();\n  const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;\n  const char* const this_test_name = this_test_info->name();\n\n  if (this_fixture_id != first_fixture_id) {\n    // Is the first test defined using TEST?\n    const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();\n    // Is this test defined using TEST?\n    const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();\n\n    if (first_is_TEST || this_is_TEST) {\n      // Both TEST and TEST_F appear in same test case, which is incorrect.\n      // Tell the user how to fix this.\n\n      // Gets the name of the TEST and the name of the TEST_F.  Note\n      // that first_is_TEST and this_is_TEST cannot both be true, as\n      // the fixture IDs are different for the two tests.\n      const char* const TEST_name =\n          first_is_TEST ? first_test_name : this_test_name;\n      const char* const TEST_F_name =\n          first_is_TEST ? this_test_name : first_test_name;\n\n      ADD_FAILURE()\n          << \"All tests in the same test case must use the same test fixture\\n\"\n          << \"class, so mixing TEST_F and TEST in the same test case is\\n\"\n          << \"illegal.  In test case \" << this_test_info->test_case_name()\n          << \",\\n\"\n          << \"test \" << TEST_F_name << \" is defined using TEST_F but\\n\"\n          << \"test \" << TEST_name << \" is defined using TEST.  You probably\\n\"\n          << \"want to change the TEST to TEST_F or move it to another test\\n\"\n          << \"case.\";\n    } else {\n      // Two fixture classes with the same name appear in two different\n      // namespaces, which is not allowed. Tell the user how to fix this.\n      ADD_FAILURE()\n          << \"All tests in the same test case must use the same test fixture\\n\"\n          << \"class.  However, in test case \"\n          << this_test_info->test_case_name() << \",\\n\"\n          << \"you defined test \" << first_test_name\n          << \" and test \" << this_test_name << \"\\n\"\n          << \"using two different test fixture classes.  This can happen if\\n\"\n          << \"the two classes are from different namespaces or translation\\n\"\n          << \"units and have the same name.  You should probably rename one\\n\"\n          << \"of the classes to put the tests into different test cases.\";\n    }\n    return false;\n  }\n\n  return true;\n}\n\n#if GTEST_HAS_SEH\n\n// Adds an \"exception thrown\" fatal failure to the current test.  This\n// function returns its result via an output parameter pointer because VC++\n// prohibits creation of objects with destructors on stack in functions\n// using __try (see error C2712).\nstatic std::string* FormatSehExceptionMessage(DWORD exception_code,\n                                              const char* location) {\n  Message message;\n  message << \"SEH exception with code 0x\" << std::setbase(16) <<\n    exception_code << std::setbase(10) << \" thrown in \" << location << \".\";\n\n  return new std::string(message.GetString());\n}\n\n#endif  // GTEST_HAS_SEH\n\nnamespace internal {\n\n#if GTEST_HAS_EXCEPTIONS\n\n// Adds an \"exception thrown\" fatal failure to the current test.\nstatic std::string FormatCxxExceptionMessage(const char* description,\n                                             const char* location) {\n  Message message;\n  if (description != NULL) {\n    message << \"C++ exception with description \\\"\" << description << \"\\\"\";\n  } else {\n    message << \"Unknown C++ exception\";\n  }\n  message << \" thrown in \" << location << \".\";\n\n  return message.GetString();\n}\n\nstatic std::string PrintTestPartResultToString(\n    const TestPartResult& test_part_result);\n\nGoogleTestFailureException::GoogleTestFailureException(\n    const TestPartResult& failure)\n    : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// We put these helper functions in the internal namespace as IBM's xlC\n// compiler rejects the code if they were declared static.\n\n// Runs the given method and handles SEH exceptions it throws, when\n// SEH is supported; returns the 0-value for type Result in case of an\n// SEH exception.  (Microsoft compilers cannot handle SEH and C++\n// exceptions in the same function.  Therefore, we provide a separate\n// wrapper function for handling SEH exceptions.)\ntemplate <class T, typename Result>\nResult HandleSehExceptionsInMethodIfSupported(\n    T* object, Result (T::*method)(), const char* location) {\n#if GTEST_HAS_SEH\n  __try {\n    return (object->*method)();\n  } __except (internal::UnitTestOptions::GTestShouldProcessSEH(  // NOLINT\n      GetExceptionCode())) {\n    // We create the exception message on the heap because VC++ prohibits\n    // creation of objects with destructors on stack in functions using __try\n    // (see error C2712).\n    std::string* exception_message = FormatSehExceptionMessage(\n        GetExceptionCode(), location);\n    internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,\n                                             *exception_message);\n    delete exception_message;\n    return static_cast<Result>(0);\n  }\n#else\n  (void)location;\n  return (object->*method)();\n#endif  // GTEST_HAS_SEH\n}\n\n// Runs the given method and catches and reports C++ and/or SEH-style\n// exceptions, if they are supported; returns the 0-value for type\n// Result in case of an SEH exception.\ntemplate <class T, typename Result>\nResult HandleExceptionsInMethodIfSupported(\n    T* object, Result (T::*method)(), const char* location) {\n  // NOTE: The user code can affect the way in which Google Test handles\n  // exceptions by setting GTEST_FLAG(catch_exceptions), but only before\n  // RUN_ALL_TESTS() starts. It is technically possible to check the flag\n  // after the exception is caught and either report or re-throw the\n  // exception based on the flag's value:\n  //\n  // try {\n  //   // Perform the test method.\n  // } catch (...) {\n  //   if (GTEST_FLAG(catch_exceptions))\n  //     // Report the exception as failure.\n  //   else\n  //     throw;  // Re-throws the original exception.\n  // }\n  //\n  // However, the purpose of this flag is to allow the program to drop into\n  // the debugger when the exception is thrown. On most platforms, once the\n  // control enters the catch block, the exception origin information is\n  // lost and the debugger will stop the program at the point of the\n  // re-throw in this function -- instead of at the point of the original\n  // throw statement in the code under test.  For this reason, we perform\n  // the check early, sacrificing the ability to affect Google Test's\n  // exception handling in the method where the exception is thrown.\n  if (internal::GetUnitTestImpl()->catch_exceptions()) {\n#if GTEST_HAS_EXCEPTIONS\n    try {\n      return HandleSehExceptionsInMethodIfSupported(object, method, location);\n    } catch (const AssertionException&) {  // NOLINT\n      // This failure was reported already.\n    } catch (const internal::GoogleTestFailureException&) {  // NOLINT\n      // This exception type can only be thrown by a failed Google\n      // Test assertion with the intention of letting another testing\n      // framework catch it.  Therefore we just re-throw it.\n      throw;\n    } catch (const std::exception& e) {  // NOLINT\n      internal::ReportFailureInUnknownLocation(\n          TestPartResult::kFatalFailure,\n          FormatCxxExceptionMessage(e.what(), location));\n    } catch (...) {  // NOLINT\n      internal::ReportFailureInUnknownLocation(\n          TestPartResult::kFatalFailure,\n          FormatCxxExceptionMessage(NULL, location));\n    }\n    return static_cast<Result>(0);\n#else\n    return HandleSehExceptionsInMethodIfSupported(object, method, location);\n#endif  // GTEST_HAS_EXCEPTIONS\n  } else {\n    return (object->*method)();\n  }\n}\n\n}  // namespace internal\n\n// Runs the test and updates the test result.\nvoid Test::Run() {\n  if (!HasSameFixtureClass()) return;\n\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, \"SetUp()\");\n  // We will run the test only if SetUp() was successful.\n  if (!HasFatalFailure()) {\n    impl->os_stack_trace_getter()->UponLeavingGTest();\n    internal::HandleExceptionsInMethodIfSupported(\n        this, &Test::TestBody, \"the test body\");\n  }\n\n  // However, we want to clean up as much as possible.  Hence we will\n  // always call TearDown(), even if SetUp() or the test body has\n  // failed.\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  internal::HandleExceptionsInMethodIfSupported(\n      this, &Test::TearDown, \"TearDown()\");\n}\n\n// Returns true iff the current test has a fatal failure.\nbool Test::HasFatalFailure() {\n  return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();\n}\n\n// Returns true iff the current test has a non-fatal failure.\nbool Test::HasNonfatalFailure() {\n  return internal::GetUnitTestImpl()->current_test_result()->\n      HasNonfatalFailure();\n}\n\n// class TestInfo\n\n// Constructs a TestInfo object. It assumes ownership of the test factory\n// object.\nTestInfo::TestInfo(const std::string& a_test_case_name,\n                   const std::string& a_name,\n                   const char* a_type_param,\n                   const char* a_value_param,\n                   internal::CodeLocation a_code_location,\n                   internal::TypeId fixture_class_id,\n                   internal::TestFactoryBase* factory)\n    : test_case_name_(a_test_case_name),\n      name_(a_name),\n      type_param_(a_type_param ? new std::string(a_type_param) : NULL),\n      value_param_(a_value_param ? new std::string(a_value_param) : NULL),\n      location_(a_code_location),\n      fixture_class_id_(fixture_class_id),\n      should_run_(false),\n      is_disabled_(false),\n      matches_filter_(false),\n      factory_(factory),\n      result_() {}\n\n// Destructs a TestInfo object.\nTestInfo::~TestInfo() { delete factory_; }\n\nnamespace internal {\n\n// Creates a new TestInfo object and registers it with Google Test;\n// returns the created object.\n//\n// Arguments:\n//\n//   test_case_name:   name of the test case\n//   name:             name of the test\n//   type_param:       the name of the test's type parameter, or NULL if\n//                     this is not a typed or a type-parameterized test.\n//   value_param:      text representation of the test's value parameter,\n//                     or NULL if this is not a value-parameterized test.\n//   code_location:    code location where the test is defined\n//   fixture_class_id: ID of the test fixture class\n//   set_up_tc:        pointer to the function that sets up the test case\n//   tear_down_tc:     pointer to the function that tears down the test case\n//   factory:          pointer to the factory that creates a test object.\n//                     The newly created TestInfo instance will assume\n//                     ownership of the factory object.\nTestInfo* MakeAndRegisterTestInfo(\n    const char* test_case_name,\n    const char* name,\n    const char* type_param,\n    const char* value_param,\n    CodeLocation code_location,\n    TypeId fixture_class_id,\n    SetUpTestCaseFunc set_up_tc,\n    TearDownTestCaseFunc tear_down_tc,\n    TestFactoryBase* factory) {\n  TestInfo* const test_info =\n      new TestInfo(test_case_name, name, type_param, value_param,\n                   code_location, fixture_class_id, factory);\n  GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);\n  return test_info;\n}\n\nvoid ReportInvalidTestCaseType(const char* test_case_name,\n                               CodeLocation code_location) {\n  Message errors;\n  errors\n      << \"Attempted redefinition of test case \" << test_case_name << \".\\n\"\n      << \"All tests in the same test case must use the same test fixture\\n\"\n      << \"class.  However, in test case \" << test_case_name << \", you tried\\n\"\n      << \"to define a test using a fixture class different from the one\\n\"\n      << \"used earlier. This can happen if the two fixture classes are\\n\"\n      << \"from different namespaces and have the same name. You should\\n\"\n      << \"probably rename one of the classes to put the tests into different\\n\"\n      << \"test cases.\";\n\n  GTEST_LOG_(ERROR) << FormatFileLocation(code_location.file.c_str(),\n                                          code_location.line)\n                    << \" \" << errors.GetString();\n}\n}  // namespace internal\n\nnamespace {\n\n// A predicate that checks the test name of a TestInfo against a known\n// value.\n//\n// This is used for implementation of the TestCase class only.  We put\n// it in the anonymous namespace to prevent polluting the outer\n// namespace.\n//\n// TestNameIs is copyable.\nclass TestNameIs {\n public:\n  // Constructor.\n  //\n  // TestNameIs has NO default constructor.\n  explicit TestNameIs(const char* name)\n      : name_(name) {}\n\n  // Returns true iff the test name of test_info matches name_.\n  bool operator()(const TestInfo * test_info) const {\n    return test_info && test_info->name() == name_;\n  }\n\n private:\n  std::string name_;\n};\n\n}  // namespace\n\nnamespace internal {\n\n// This method expands all parameterized tests registered with macros TEST_P\n// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.\n// This will be done just once during the program runtime.\nvoid UnitTestImpl::RegisterParameterizedTests() {\n  if (!parameterized_tests_registered_) {\n    parameterized_test_registry_.RegisterTests();\n    parameterized_tests_registered_ = true;\n  }\n}\n\n}  // namespace internal\n\n// Creates the test object, runs it, records its result, and then\n// deletes it.\nvoid TestInfo::Run() {\n  if (!should_run_) return;\n\n  // Tells UnitTest where to store test result.\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  impl->set_current_test_info(this);\n\n  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();\n\n  // Notifies the unit test event listeners that a test is about to start.\n  repeater->OnTestStart(*this);\n\n  const TimeInMillis start = internal::GetTimeInMillis();\n\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n\n  // Creates the test object.\n  Test* const test = internal::HandleExceptionsInMethodIfSupported(\n      factory_, &internal::TestFactoryBase::CreateTest,\n      \"the test fixture's constructor\");\n\n  // Runs the test if the constructor didn't generate a fatal failure.\n  // Note that the object will not be null\n  if (!Test::HasFatalFailure()) {\n    // This doesn't throw as all user code that can throw are wrapped into\n    // exception handling code.\n    test->Run();\n  }\n\n    // Deletes the test object.\n    impl->os_stack_trace_getter()->UponLeavingGTest();\n    internal::HandleExceptionsInMethodIfSupported(\n        test, &Test::DeleteSelf_, \"the test fixture's destructor\");\n\n  result_.set_elapsed_time(internal::GetTimeInMillis() - start);\n\n  // Notifies the unit test event listener that a test has just finished.\n  repeater->OnTestEnd(*this);\n\n  // Tells UnitTest to stop associating assertion results to this\n  // test.\n  impl->set_current_test_info(NULL);\n}\n\n// class TestCase\n\n// Gets the number of successful tests in this test case.\nint TestCase::successful_test_count() const {\n  return CountIf(test_info_list_, TestPassed);\n}\n\n// Gets the number of failed tests in this test case.\nint TestCase::failed_test_count() const {\n  return CountIf(test_info_list_, TestFailed);\n}\n\n// Gets the number of disabled tests that will be reported in the XML report.\nint TestCase::reportable_disabled_test_count() const {\n  return CountIf(test_info_list_, TestReportableDisabled);\n}\n\n// Gets the number of disabled tests in this test case.\nint TestCase::disabled_test_count() const {\n  return CountIf(test_info_list_, TestDisabled);\n}\n\n// Gets the number of tests to be printed in the XML report.\nint TestCase::reportable_test_count() const {\n  return CountIf(test_info_list_, TestReportable);\n}\n\n// Get the number of tests in this test case that should run.\nint TestCase::test_to_run_count() const {\n  return CountIf(test_info_list_, ShouldRunTest);\n}\n\n// Gets the number of all tests.\nint TestCase::total_test_count() const {\n  return static_cast<int>(test_info_list_.size());\n}\n\n// Creates a TestCase with the given name.\n//\n// Arguments:\n//\n//   name:         name of the test case\n//   a_type_param: the name of the test case's type parameter, or NULL if\n//                 this is not a typed or a type-parameterized test case.\n//   set_up_tc:    pointer to the function that sets up the test case\n//   tear_down_tc: pointer to the function that tears down the test case\nTestCase::TestCase(const char* a_name, const char* a_type_param,\n                   Test::SetUpTestCaseFunc set_up_tc,\n                   Test::TearDownTestCaseFunc tear_down_tc)\n    : name_(a_name),\n      type_param_(a_type_param ? new std::string(a_type_param) : NULL),\n      set_up_tc_(set_up_tc),\n      tear_down_tc_(tear_down_tc),\n      should_run_(false),\n      elapsed_time_(0) {\n}\n\n// Destructor of TestCase.\nTestCase::~TestCase() {\n  // Deletes every Test in the collection.\n  ForEach(test_info_list_, internal::Delete<TestInfo>);\n}\n\n// Returns the i-th test among all the tests. i can range from 0 to\n// total_test_count() - 1. If i is not in that range, returns NULL.\nconst TestInfo* TestCase::GetTestInfo(int i) const {\n  const int index = GetElementOr(test_indices_, i, -1);\n  return index < 0 ? NULL : test_info_list_[index];\n}\n\n// Returns the i-th test among all the tests. i can range from 0 to\n// total_test_count() - 1. If i is not in that range, returns NULL.\nTestInfo* TestCase::GetMutableTestInfo(int i) {\n  const int index = GetElementOr(test_indices_, i, -1);\n  return index < 0 ? NULL : test_info_list_[index];\n}\n\n// Adds a test to this test case.  Will delete the test upon\n// destruction of the TestCase object.\nvoid TestCase::AddTestInfo(TestInfo * test_info) {\n  test_info_list_.push_back(test_info);\n  test_indices_.push_back(static_cast<int>(test_indices_.size()));\n}\n\n// Runs every test in this TestCase.\nvoid TestCase::Run() {\n  if (!should_run_) return;\n\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  impl->set_current_test_case(this);\n\n  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();\n\n  repeater->OnTestCaseStart(*this);\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  internal::HandleExceptionsInMethodIfSupported(\n      this, &TestCase::RunSetUpTestCase, \"SetUpTestCase()\");\n\n  const internal::TimeInMillis start = internal::GetTimeInMillis();\n  for (int i = 0; i < total_test_count(); i++) {\n    GetMutableTestInfo(i)->Run();\n  }\n  elapsed_time_ = internal::GetTimeInMillis() - start;\n\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  internal::HandleExceptionsInMethodIfSupported(\n      this, &TestCase::RunTearDownTestCase, \"TearDownTestCase()\");\n\n  repeater->OnTestCaseEnd(*this);\n  impl->set_current_test_case(NULL);\n}\n\n// Clears the results of all tests in this test case.\nvoid TestCase::ClearResult() {\n  ad_hoc_test_result_.Clear();\n  ForEach(test_info_list_, TestInfo::ClearTestResult);\n}\n\n// Shuffles the tests in this test case.\nvoid TestCase::ShuffleTests(internal::Random* random) {\n  Shuffle(random, &test_indices_);\n}\n\n// Restores the test order to before the first shuffle.\nvoid TestCase::UnshuffleTests() {\n  for (size_t i = 0; i < test_indices_.size(); i++) {\n    test_indices_[i] = static_cast<int>(i);\n  }\n}\n\n// Formats a countable noun.  Depending on its quantity, either the\n// singular form or the plural form is used. e.g.\n//\n// FormatCountableNoun(1, \"formula\", \"formuli\") returns \"1 formula\".\n// FormatCountableNoun(5, \"book\", \"books\") returns \"5 books\".\nstatic std::string FormatCountableNoun(int count,\n                                       const char * singular_form,\n                                       const char * plural_form) {\n  return internal::StreamableToString(count) + \" \" +\n      (count == 1 ? singular_form : plural_form);\n}\n\n// Formats the count of tests.\nstatic std::string FormatTestCount(int test_count) {\n  return FormatCountableNoun(test_count, \"test\", \"tests\");\n}\n\n// Formats the count of test cases.\nstatic std::string FormatTestCaseCount(int test_case_count) {\n  return FormatCountableNoun(test_case_count, \"test case\", \"test cases\");\n}\n\n// Converts a TestPartResult::Type enum to human-friendly string\n// representation.  Both kNonFatalFailure and kFatalFailure are translated\n// to \"Failure\", as the user usually doesn't care about the difference\n// between the two when viewing the test result.\nstatic const char * TestPartResultTypeToString(TestPartResult::Type type) {\n  switch (type) {\n    case TestPartResult::kSuccess:\n      return \"Success\";\n\n    case TestPartResult::kNonFatalFailure:\n    case TestPartResult::kFatalFailure:\n#ifdef _MSC_VER\n      return \"error: \";\n#else\n      return \"Failure\\n\";\n#endif\n    default:\n      return \"Unknown result type\";\n  }\n}\n\nnamespace internal {\n\n// Prints a TestPartResult to an std::string.\nstatic std::string PrintTestPartResultToString(\n    const TestPartResult& test_part_result) {\n  return (Message()\n          << internal::FormatFileLocation(test_part_result.file_name(),\n                                          test_part_result.line_number())\n          << \" \" << TestPartResultTypeToString(test_part_result.type())\n          << test_part_result.message()).GetString();\n}\n\n// Prints a TestPartResult.\nstatic void PrintTestPartResult(const TestPartResult& test_part_result) {\n  const std::string& result =\n      PrintTestPartResultToString(test_part_result);\n  printf(\"%s\\n\", result.c_str());\n  fflush(stdout);\n  // If the test program runs in Visual Studio or a debugger, the\n  // following statements add the test part result message to the Output\n  // window such that the user can double-click on it to jump to the\n  // corresponding source code location; otherwise they do nothing.\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE\n  // We don't call OutputDebugString*() on Windows Mobile, as printing\n  // to stdout is done by OutputDebugString() there already - we don't\n  // want the same message printed twice.\n  ::OutputDebugStringA(result.c_str());\n  ::OutputDebugStringA(\"\\n\");\n#endif\n}\n\n// class PrettyUnitTestResultPrinter\n\nenum GTestColor {\n  COLOR_DEFAULT,\n  COLOR_RED,\n  COLOR_GREEN,\n  COLOR_YELLOW\n};\n\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && \\\n    !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT && !GTEST_OS_WINDOWS_MINGW\n\n// Returns the character attribute for the given color.\nstatic WORD GetColorAttribute(GTestColor color) {\n  switch (color) {\n    case COLOR_RED:    return FOREGROUND_RED;\n    case COLOR_GREEN:  return FOREGROUND_GREEN;\n    case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;\n    default:           return 0;\n  }\n}\n\nstatic int GetBitOffset(WORD color_mask) {\n  if (color_mask == 0) return 0;\n\n  int bitOffset = 0;\n  while ((color_mask & 1) == 0) {\n    color_mask >>= 1;\n    ++bitOffset;\n  }\n  return bitOffset;\n}\n\nstatic WORD GetNewColor(GTestColor color, WORD old_color_attrs) {\n  // Let's reuse the BG\n  static const WORD background_mask = BACKGROUND_BLUE | BACKGROUND_GREEN |\n                                      BACKGROUND_RED | BACKGROUND_INTENSITY;\n  static const WORD foreground_mask = FOREGROUND_BLUE | FOREGROUND_GREEN |\n                                      FOREGROUND_RED | FOREGROUND_INTENSITY;\n  const WORD existing_bg = old_color_attrs & background_mask;\n\n  WORD new_color =\n      GetColorAttribute(color) | existing_bg | FOREGROUND_INTENSITY;\n  static const int bg_bitOffset = GetBitOffset(background_mask);\n  static const int fg_bitOffset = GetBitOffset(foreground_mask);\n\n  if (((new_color & background_mask) >> bg_bitOffset) ==\n      ((new_color & foreground_mask) >> fg_bitOffset)) {\n    new_color ^= FOREGROUND_INTENSITY;  // invert intensity\n  }\n  return new_color;\n}\n\n#else\n\n// Returns the ANSI color code for the given color.  COLOR_DEFAULT is\n// an invalid input.\nstatic const char* GetAnsiColorCode(GTestColor color) {\n  switch (color) {\n    case COLOR_RED:     return \"1\";\n    case COLOR_GREEN:   return \"2\";\n    case COLOR_YELLOW:  return \"3\";\n    default:            return NULL;\n  };\n}\n\n#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE\n\n// Returns true iff Google Test should use colors in the output.\nbool ShouldUseColor(bool stdout_is_tty) {\n  const char* const gtest_color = GTEST_FLAG(color).c_str();\n\n  if (String::CaseInsensitiveCStringEquals(gtest_color, \"auto\")) {\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW\n    // On Windows the TERM variable is usually not set, but the\n    // console there does support colors.\n    return stdout_is_tty;\n#else\n    // On non-Windows platforms, we rely on the TERM variable.\n    const char* const term = posix::GetEnv(\"TERM\");\n    const bool term_supports_color =\n        String::CStringEquals(term, \"xterm\") ||\n        String::CStringEquals(term, \"xterm-color\") ||\n        String::CStringEquals(term, \"xterm-256color\") ||\n        String::CStringEquals(term, \"screen\") ||\n        String::CStringEquals(term, \"screen-256color\") ||\n        String::CStringEquals(term, \"tmux\") ||\n        String::CStringEquals(term, \"tmux-256color\") ||\n        String::CStringEquals(term, \"rxvt-unicode\") ||\n        String::CStringEquals(term, \"rxvt-unicode-256color\") ||\n        String::CStringEquals(term, \"linux\") ||\n        String::CStringEquals(term, \"cygwin\");\n    return stdout_is_tty && term_supports_color;\n#endif  // GTEST_OS_WINDOWS\n  }\n\n  return String::CaseInsensitiveCStringEquals(gtest_color, \"yes\") ||\n      String::CaseInsensitiveCStringEquals(gtest_color, \"true\") ||\n      String::CaseInsensitiveCStringEquals(gtest_color, \"t\") ||\n      String::CStringEquals(gtest_color, \"1\");\n  // We take \"yes\", \"true\", \"t\", and \"1\" as meaning \"yes\".  If the\n  // value is neither one of these nor \"auto\", we treat it as \"no\" to\n  // be conservative.\n}\n\n// Helpers for printing colored strings to stdout. Note that on Windows, we\n// cannot simply emit special characters and have the terminal change colors.\n// This routine must actually emit the characters rather than return a string\n// that would be colored when printed, as can be done on Linux.\nstatic void ColoredPrintf(GTestColor color, const char* fmt, ...) {\n  va_list args;\n  va_start(args, fmt);\n\n#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || \\\n    GTEST_OS_IOS || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT\n  const bool use_color = AlwaysFalse();\n#else\n  static const bool in_color_mode =\n      ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);\n  const bool use_color = in_color_mode && (color != COLOR_DEFAULT);\n#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS\n  // The '!= 0' comparison is necessary to satisfy MSVC 7.1.\n\n  if (!use_color) {\n    vprintf(fmt, args);\n    va_end(args);\n    return;\n  }\n\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && \\\n    !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT && !GTEST_OS_WINDOWS_MINGW\n  const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);\n\n  // Gets the current text color.\n  CONSOLE_SCREEN_BUFFER_INFO buffer_info;\n  GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);\n  const WORD old_color_attrs = buffer_info.wAttributes;\n  const WORD new_color = GetNewColor(color, old_color_attrs);\n\n  // We need to flush the stream buffers into the console before each\n  // SetConsoleTextAttribute call lest it affect the text that is already\n  // printed but has not yet reached the console.\n  fflush(stdout);\n  SetConsoleTextAttribute(stdout_handle, new_color);\n\n  vprintf(fmt, args);\n\n  fflush(stdout);\n  // Restores the text color.\n  SetConsoleTextAttribute(stdout_handle, old_color_attrs);\n#else\n  printf(\"\\033[0;3%sm\", GetAnsiColorCode(color));\n  vprintf(fmt, args);\n  printf(\"\\033[m\");  // Resets the terminal to default.\n#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE\n  va_end(args);\n}\n\n// Text printed in Google Test's text output and --gtest_list_tests\n// output to label the type parameter and value parameter for a test.\nstatic const char kTypeParamLabel[] = \"TypeParam\";\nstatic const char kValueParamLabel[] = \"GetParam()\";\n\nstatic void PrintFullTestCommentIfPresent(const TestInfo& test_info) {\n  const char* const type_param = test_info.type_param();\n  const char* const value_param = test_info.value_param();\n\n  if (type_param != NULL || value_param != NULL) {\n    printf(\", where \");\n    if (type_param != NULL) {\n      printf(\"%s = %s\", kTypeParamLabel, type_param);\n      if (value_param != NULL)\n        printf(\" and \");\n    }\n    if (value_param != NULL) {\n      printf(\"%s = %s\", kValueParamLabel, value_param);\n    }\n  }\n}\n\n// This class implements the TestEventListener interface.\n//\n// Class PrettyUnitTestResultPrinter is copyable.\nclass PrettyUnitTestResultPrinter : public TestEventListener {\n public:\n  PrettyUnitTestResultPrinter() {}\n  static void PrintTestName(const char * test_case, const char * test) {\n    printf(\"%s.%s\", test_case, test);\n  }\n\n  // The following methods override what's in the TestEventListener class.\n  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);\n  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);\n  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestCaseStart(const TestCase& test_case);\n  virtual void OnTestStart(const TestInfo& test_info);\n  virtual void OnTestPartResult(const TestPartResult& result);\n  virtual void OnTestEnd(const TestInfo& test_info);\n  virtual void OnTestCaseEnd(const TestCase& test_case);\n  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);\n  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);\n  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}\n\n private:\n  static void PrintFailedTests(const UnitTest& unit_test);\n};\n\n  // Fired before each iteration of tests starts.\nvoid PrettyUnitTestResultPrinter::OnTestIterationStart(\n    const UnitTest& unit_test, int iteration) {\n  if (GTEST_FLAG(repeat) != 1)\n    printf(\"\\nRepeating all tests (iteration %d) . . .\\n\\n\", iteration + 1);\n\n  const char* const filter = GTEST_FLAG(filter).c_str();\n\n  // Prints the filter if it's not *.  This reminds the user that some\n  // tests may be skipped.\n  if (!String::CStringEquals(filter, kUniversalFilter)) {\n    ColoredPrintf(COLOR_YELLOW,\n                  \"Note: %s filter = %s\\n\", GTEST_NAME_, filter);\n  }\n\n  if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {\n    const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);\n    ColoredPrintf(COLOR_YELLOW,\n                  \"Note: This is test shard %d of %s.\\n\",\n                  static_cast<int>(shard_index) + 1,\n                  internal::posix::GetEnv(kTestTotalShards));\n  }\n\n  if (GTEST_FLAG(shuffle)) {\n    ColoredPrintf(COLOR_YELLOW,\n                  \"Note: Randomizing tests' orders with a seed of %d .\\n\",\n                  unit_test.random_seed());\n  }\n\n  ColoredPrintf(COLOR_GREEN,  \"[==========] \");\n  printf(\"Running %s from %s.\\n\",\n         FormatTestCount(unit_test.test_to_run_count()).c_str(),\n         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(\n    const UnitTest& /*unit_test*/) {\n  ColoredPrintf(COLOR_GREEN,  \"[----------] \");\n  printf(\"Global test environment set-up.\\n\");\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {\n  const std::string counts =\n      FormatCountableNoun(test_case.test_to_run_count(), \"test\", \"tests\");\n  ColoredPrintf(COLOR_GREEN, \"[----------] \");\n  printf(\"%s from %s\", counts.c_str(), test_case.name());\n  if (test_case.type_param() == NULL) {\n    printf(\"\\n\");\n  } else {\n    printf(\", where %s = %s\\n\", kTypeParamLabel, test_case.type_param());\n  }\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {\n  ColoredPrintf(COLOR_GREEN,  \"[ RUN      ] \");\n  PrintTestName(test_info.test_case_name(), test_info.name());\n  printf(\"\\n\");\n  fflush(stdout);\n}\n\n// Called after an assertion failure.\nvoid PrettyUnitTestResultPrinter::OnTestPartResult(\n    const TestPartResult& result) {\n  // If the test part succeeded, we don't need to do anything.\n  if (result.type() == TestPartResult::kSuccess)\n    return;\n\n  // Print failure message from the assertion (e.g. expected this and got that).\n  PrintTestPartResult(result);\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {\n  if (test_info.result()->Passed()) {\n    ColoredPrintf(COLOR_GREEN, \"[       OK ] \");\n  } else {\n    ColoredPrintf(COLOR_RED, \"[  FAILED  ] \");\n  }\n  PrintTestName(test_info.test_case_name(), test_info.name());\n  if (test_info.result()->Failed())\n    PrintFullTestCommentIfPresent(test_info);\n\n  if (GTEST_FLAG(print_time)) {\n    printf(\" (%s ms)\\n\", internal::StreamableToString(\n           test_info.result()->elapsed_time()).c_str());\n  } else {\n    printf(\"\\n\");\n  }\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {\n  if (!GTEST_FLAG(print_time)) return;\n\n  const std::string counts =\n      FormatCountableNoun(test_case.test_to_run_count(), \"test\", \"tests\");\n  ColoredPrintf(COLOR_GREEN, \"[----------] \");\n  printf(\"%s from %s (%s ms total)\\n\\n\",\n         counts.c_str(), test_case.name(),\n         internal::StreamableToString(test_case.elapsed_time()).c_str());\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(\n    const UnitTest& /*unit_test*/) {\n  ColoredPrintf(COLOR_GREEN,  \"[----------] \");\n  printf(\"Global test environment tear-down\\n\");\n  fflush(stdout);\n}\n\n// Internal helper for printing the list of failed tests.\nvoid PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {\n  const int failed_test_count = unit_test.failed_test_count();\n  if (failed_test_count == 0) {\n    return;\n  }\n\n  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {\n    const TestCase& test_case = *unit_test.GetTestCase(i);\n    if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {\n      continue;\n    }\n    for (int j = 0; j < test_case.total_test_count(); ++j) {\n      const TestInfo& test_info = *test_case.GetTestInfo(j);\n      if (!test_info.should_run() || test_info.result()->Passed()) {\n        continue;\n      }\n      ColoredPrintf(COLOR_RED, \"[  FAILED  ] \");\n      printf(\"%s.%s\", test_case.name(), test_info.name());\n      PrintFullTestCommentIfPresent(test_info);\n      printf(\"\\n\");\n    }\n  }\n}\n\nvoid PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,\n                                                     int /*iteration*/) {\n  ColoredPrintf(COLOR_GREEN,  \"[==========] \");\n  printf(\"%s from %s ran.\",\n         FormatTestCount(unit_test.test_to_run_count()).c_str(),\n         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());\n  if (GTEST_FLAG(print_time)) {\n    printf(\" (%s ms total)\",\n           internal::StreamableToString(unit_test.elapsed_time()).c_str());\n  }\n  printf(\"\\n\");\n  ColoredPrintf(COLOR_GREEN,  \"[  PASSED  ] \");\n  printf(\"%s.\\n\", FormatTestCount(unit_test.successful_test_count()).c_str());\n\n  int num_failures = unit_test.failed_test_count();\n  if (!unit_test.Passed()) {\n    const int failed_test_count = unit_test.failed_test_count();\n    ColoredPrintf(COLOR_RED,  \"[  FAILED  ] \");\n    printf(\"%s, listed below:\\n\", FormatTestCount(failed_test_count).c_str());\n    PrintFailedTests(unit_test);\n    printf(\"\\n%2d FAILED %s\\n\", num_failures,\n                        num_failures == 1 ? \"TEST\" : \"TESTS\");\n  }\n\n  int num_disabled = unit_test.reportable_disabled_test_count();\n  if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {\n    if (!num_failures) {\n      printf(\"\\n\");  // Add a spacer if no FAILURE banner is displayed.\n    }\n    ColoredPrintf(COLOR_YELLOW,\n                  \"  YOU HAVE %d DISABLED %s\\n\\n\",\n                  num_disabled,\n                  num_disabled == 1 ? \"TEST\" : \"TESTS\");\n  }\n  // Ensure that Google Test output is printed before, e.g., heapchecker output.\n  fflush(stdout);\n}\n\n// End PrettyUnitTestResultPrinter\n\n// class TestEventRepeater\n//\n// This class forwards events to other event listeners.\nclass TestEventRepeater : public TestEventListener {\n public:\n  TestEventRepeater() : forwarding_enabled_(true) {}\n  virtual ~TestEventRepeater();\n  void Append(TestEventListener *listener);\n  TestEventListener* Release(TestEventListener* listener);\n\n  // Controls whether events will be forwarded to listeners_. Set to false\n  // in death test child processes.\n  bool forwarding_enabled() const { return forwarding_enabled_; }\n  void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }\n\n  virtual void OnTestProgramStart(const UnitTest& unit_test);\n  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);\n  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);\n  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);\n  virtual void OnTestCaseStart(const TestCase& test_case);\n  virtual void OnTestStart(const TestInfo& test_info);\n  virtual void OnTestPartResult(const TestPartResult& result);\n  virtual void OnTestEnd(const TestInfo& test_info);\n  virtual void OnTestCaseEnd(const TestCase& test_case);\n  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);\n  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);\n  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);\n  virtual void OnTestProgramEnd(const UnitTest& unit_test);\n\n private:\n  // Controls whether events will be forwarded to listeners_. Set to false\n  // in death test child processes.\n  bool forwarding_enabled_;\n  // The list of listeners that receive events.\n  std::vector<TestEventListener*> listeners_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);\n};\n\nTestEventRepeater::~TestEventRepeater() {\n  ForEach(listeners_, Delete<TestEventListener>);\n}\n\nvoid TestEventRepeater::Append(TestEventListener *listener) {\n  listeners_.push_back(listener);\n}\n\n// FIXME: Factor the search functionality into Vector::Find.\nTestEventListener* TestEventRepeater::Release(TestEventListener *listener) {\n  for (size_t i = 0; i < listeners_.size(); ++i) {\n    if (listeners_[i] == listener) {\n      listeners_.erase(listeners_.begin() + i);\n      return listener;\n    }\n  }\n\n  return NULL;\n}\n\n// Since most methods are very similar, use macros to reduce boilerplate.\n// This defines a member that forwards the call to all listeners.\n#define GTEST_REPEATER_METHOD_(Name, Type) \\\nvoid TestEventRepeater::Name(const Type& parameter) { \\\n  if (forwarding_enabled_) { \\\n    for (size_t i = 0; i < listeners_.size(); i++) { \\\n      listeners_[i]->Name(parameter); \\\n    } \\\n  } \\\n}\n// This defines a member that forwards the call to all listeners in reverse\n// order.\n#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \\\nvoid TestEventRepeater::Name(const Type& parameter) { \\\n  if (forwarding_enabled_) { \\\n    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \\\n      listeners_[i]->Name(parameter); \\\n    } \\\n  } \\\n}\n\nGTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)\nGTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)\nGTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)\nGTEST_REPEATER_METHOD_(OnTestStart, TestInfo)\nGTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)\nGTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)\nGTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)\nGTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)\nGTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)\nGTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)\nGTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)\n\n#undef GTEST_REPEATER_METHOD_\n#undef GTEST_REVERSE_REPEATER_METHOD_\n\nvoid TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,\n                                             int iteration) {\n  if (forwarding_enabled_) {\n    for (size_t i = 0; i < listeners_.size(); i++) {\n      listeners_[i]->OnTestIterationStart(unit_test, iteration);\n    }\n  }\n}\n\nvoid TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,\n                                           int iteration) {\n  if (forwarding_enabled_) {\n    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {\n      listeners_[i]->OnTestIterationEnd(unit_test, iteration);\n    }\n  }\n}\n\n// End TestEventRepeater\n\n// This class generates an XML output file.\nclass XmlUnitTestResultPrinter : public EmptyTestEventListener {\n public:\n  explicit XmlUnitTestResultPrinter(const char* output_file);\n\n  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);\n  void ListTestsMatchingFilter(const std::vector<TestCase*>& test_cases);\n\n  // Prints an XML summary of all unit tests.\n  static void PrintXmlTestsList(std::ostream* stream,\n                                const std::vector<TestCase*>& test_cases);\n\n private:\n  // Is c a whitespace character that is normalized to a space character\n  // when it appears in an XML attribute value?\n  static bool IsNormalizableWhitespace(char c) {\n    return c == 0x9 || c == 0xA || c == 0xD;\n  }\n\n  // May c appear in a well-formed XML document?\n  static bool IsValidXmlCharacter(char c) {\n    return IsNormalizableWhitespace(c) || c >= 0x20;\n  }\n\n  // Returns an XML-escaped copy of the input string str.  If\n  // is_attribute is true, the text is meant to appear as an attribute\n  // value, and normalizable whitespace is preserved by replacing it\n  // with character references.\n  static std::string EscapeXml(const std::string& str, bool is_attribute);\n\n  // Returns the given string with all characters invalid in XML removed.\n  static std::string RemoveInvalidXmlCharacters(const std::string& str);\n\n  // Convenience wrapper around EscapeXml when str is an attribute value.\n  static std::string EscapeXmlAttribute(const std::string& str) {\n    return EscapeXml(str, true);\n  }\n\n  // Convenience wrapper around EscapeXml when str is not an attribute value.\n  static std::string EscapeXmlText(const char* str) {\n    return EscapeXml(str, false);\n  }\n\n  // Verifies that the given attribute belongs to the given element and\n  // streams the attribute as XML.\n  static void OutputXmlAttribute(std::ostream* stream,\n                                 const std::string& element_name,\n                                 const std::string& name,\n                                 const std::string& value);\n\n  // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.\n  static void OutputXmlCDataSection(::std::ostream* stream, const char* data);\n\n  // Streams an XML representation of a TestInfo object.\n  static void OutputXmlTestInfo(::std::ostream* stream,\n                                const char* test_case_name,\n                                const TestInfo& test_info);\n\n  // Prints an XML representation of a TestCase object\n  static void PrintXmlTestCase(::std::ostream* stream,\n                               const TestCase& test_case);\n\n  // Prints an XML summary of unit_test to output stream out.\n  static void PrintXmlUnitTest(::std::ostream* stream,\n                               const UnitTest& unit_test);\n\n  // Produces a string representing the test properties in a result as space\n  // delimited XML attributes based on the property key=\"value\" pairs.\n  // When the std::string is not empty, it includes a space at the beginning,\n  // to delimit this attribute from prior attributes.\n  static std::string TestPropertiesAsXmlAttributes(const TestResult& result);\n\n  // Streams an XML representation of the test properties of a TestResult\n  // object.\n  static void OutputXmlTestProperties(std::ostream* stream,\n                                      const TestResult& result);\n\n  // The output file.\n  const std::string output_file_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);\n};\n\n// Creates a new XmlUnitTestResultPrinter.\nXmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)\n    : output_file_(output_file) {\n  if (output_file_.empty()) {\n    GTEST_LOG_(FATAL) << \"XML output file may not be null\";\n  }\n}\n\n// Called after the unit test ends.\nvoid XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,\n                                                  int /*iteration*/) {\n  FILE* xmlout = OpenFileForWriting(output_file_);\n  std::stringstream stream;\n  PrintXmlUnitTest(&stream, unit_test);\n  fprintf(xmlout, \"%s\", StringStreamToString(&stream).c_str());\n  fclose(xmlout);\n}\n\nvoid XmlUnitTestResultPrinter::ListTestsMatchingFilter(\n    const std::vector<TestCase*>& test_cases) {\n  FILE* xmlout = OpenFileForWriting(output_file_);\n  std::stringstream stream;\n  PrintXmlTestsList(&stream, test_cases);\n  fprintf(xmlout, \"%s\", StringStreamToString(&stream).c_str());\n  fclose(xmlout);\n}\n\n// Returns an XML-escaped copy of the input string str.  If is_attribute\n// is true, the text is meant to appear as an attribute value, and\n// normalizable whitespace is preserved by replacing it with character\n// references.\n//\n// Invalid XML characters in str, if any, are stripped from the output.\n// It is expected that most, if not all, of the text processed by this\n// module will consist of ordinary English text.\n// If this module is ever modified to produce version 1.1 XML output,\n// most invalid characters can be retained using character references.\n// FIXME: It might be nice to have a minimally invasive, human-readable\n// escaping scheme for invalid characters, rather than dropping them.\nstd::string XmlUnitTestResultPrinter::EscapeXml(\n    const std::string& str, bool is_attribute) {\n  Message m;\n\n  for (size_t i = 0; i < str.size(); ++i) {\n    const char ch = str[i];\n    switch (ch) {\n      case '<':\n        m << \"&lt;\";\n        break;\n      case '>':\n        m << \"&gt;\";\n        break;\n      case '&':\n        m << \"&amp;\";\n        break;\n      case '\\'':\n        if (is_attribute)\n          m << \"&apos;\";\n        else\n          m << '\\'';\n        break;\n      case '\"':\n        if (is_attribute)\n          m << \"&quot;\";\n        else\n          m << '\"';\n        break;\n      default:\n        if (IsValidXmlCharacter(ch)) {\n          if (is_attribute && IsNormalizableWhitespace(ch))\n            m << \"&#x\" << String::FormatByte(static_cast<unsigned char>(ch))\n              << \";\";\n          else\n            m << ch;\n        }\n        break;\n    }\n  }\n\n  return m.GetString();\n}\n\n// Returns the given string with all characters invalid in XML removed.\n// Currently invalid characters are dropped from the string. An\n// alternative is to replace them with certain characters such as . or ?.\nstd::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(\n    const std::string& str) {\n  std::string output;\n  output.reserve(str.size());\n  for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)\n    if (IsValidXmlCharacter(*it))\n      output.push_back(*it);\n\n  return output;\n}\n\n// The following routines generate an XML representation of a UnitTest\n// object.\n// GOOGLETEST_CM0009 DO NOT DELETE\n//\n// This is how Google Test concepts map to the DTD:\n//\n// <testsuites name=\"AllTests\">        <-- corresponds to a UnitTest object\n//   <testsuite name=\"testcase-name\">  <-- corresponds to a TestCase object\n//     <testcase name=\"test-name\">     <-- corresponds to a TestInfo object\n//       <failure message=\"...\">...</failure>\n//       <failure message=\"...\">...</failure>\n//       <failure message=\"...\">...</failure>\n//                                     <-- individual assertion failures\n//     </testcase>\n//   </testsuite>\n// </testsuites>\n\n// Formats the given time in milliseconds as seconds.\nstd::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {\n  ::std::stringstream ss;\n  ss << (static_cast<double>(ms) * 1e-3);\n  return ss.str();\n}\n\nstatic bool PortableLocaltime(time_t seconds, struct tm* out) {\n#if defined(_MSC_VER)\n  return localtime_s(out, &seconds) == 0;\n#elif defined(__MINGW32__) || defined(__MINGW64__)\n  // MINGW <time.h> provides neither localtime_r nor localtime_s, but uses\n  // Windows' localtime(), which has a thread-local tm buffer.\n  struct tm* tm_ptr = localtime(&seconds);  // NOLINT\n  if (tm_ptr == NULL)\n    return false;\n  *out = *tm_ptr;\n  return true;\n#else\n  return localtime_r(&seconds, out) != NULL;\n#endif\n}\n\n// Converts the given epoch time in milliseconds to a date string in the ISO\n// 8601 format, without the timezone information.\nstd::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {\n  struct tm time_struct;\n  if (!PortableLocaltime(static_cast<time_t>(ms / 1000), &time_struct))\n    return \"\";\n  // YYYY-MM-DDThh:mm:ss\n  return StreamableToString(time_struct.tm_year + 1900) + \"-\" +\n      String::FormatIntWidth2(time_struct.tm_mon + 1) + \"-\" +\n      String::FormatIntWidth2(time_struct.tm_mday) + \"T\" +\n      String::FormatIntWidth2(time_struct.tm_hour) + \":\" +\n      String::FormatIntWidth2(time_struct.tm_min) + \":\" +\n      String::FormatIntWidth2(time_struct.tm_sec);\n}\n\n// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.\nvoid XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,\n                                                     const char* data) {\n  const char* segment = data;\n  *stream << \"<![CDATA[\";\n  for (;;) {\n    const char* const next_segment = strstr(segment, \"]]>\");\n    if (next_segment != NULL) {\n      stream->write(\n          segment, static_cast<std::streamsize>(next_segment - segment));\n      *stream << \"]]>]]&gt;<![CDATA[\";\n      segment = next_segment + strlen(\"]]>\");\n    } else {\n      *stream << segment;\n      break;\n    }\n  }\n  *stream << \"]]>\";\n}\n\nvoid XmlUnitTestResultPrinter::OutputXmlAttribute(\n    std::ostream* stream,\n    const std::string& element_name,\n    const std::string& name,\n    const std::string& value) {\n  const std::vector<std::string>& allowed_names =\n      GetReservedAttributesForElement(element_name);\n\n  GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=\n                   allowed_names.end())\n      << \"Attribute \" << name << \" is not allowed for element <\" << element_name\n      << \">.\";\n\n  *stream << \" \" << name << \"=\\\"\" << EscapeXmlAttribute(value) << \"\\\"\";\n}\n\n// Prints an XML representation of a TestInfo object.\n// FIXME: There is also value in printing properties with the plain printer.\nvoid XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,\n                                                 const char* test_case_name,\n                                                 const TestInfo& test_info) {\n  const TestResult& result = *test_info.result();\n  const std::string kTestcase = \"testcase\";\n\n  if (test_info.is_in_another_shard()) {\n    return;\n  }\n\n  *stream << \"    <testcase\";\n  OutputXmlAttribute(stream, kTestcase, \"name\", test_info.name());\n\n  if (test_info.value_param() != NULL) {\n    OutputXmlAttribute(stream, kTestcase, \"value_param\",\n                       test_info.value_param());\n  }\n  if (test_info.type_param() != NULL) {\n    OutputXmlAttribute(stream, kTestcase, \"type_param\", test_info.type_param());\n  }\n  if (GTEST_FLAG(list_tests)) {\n    OutputXmlAttribute(stream, kTestcase, \"file\", test_info.file());\n    OutputXmlAttribute(stream, kTestcase, \"line\",\n                       StreamableToString(test_info.line()));\n    *stream << \" />\\n\";\n    return;\n  }\n\n  OutputXmlAttribute(stream, kTestcase, \"status\",\n                     test_info.should_run() ? \"run\" : \"notrun\");\n  OutputXmlAttribute(stream, kTestcase, \"time\",\n                     FormatTimeInMillisAsSeconds(result.elapsed_time()));\n  OutputXmlAttribute(stream, kTestcase, \"classname\", test_case_name);\n\n  int failures = 0;\n  for (int i = 0; i < result.total_part_count(); ++i) {\n    const TestPartResult& part = result.GetTestPartResult(i);\n    if (part.failed()) {\n      if (++failures == 1) {\n        *stream << \">\\n\";\n      }\n      const std::string location =\n          internal::FormatCompilerIndependentFileLocation(part.file_name(),\n                                                          part.line_number());\n      const std::string summary = location + \"\\n\" + part.summary();\n      *stream << \"      <failure message=\\\"\"\n              << EscapeXmlAttribute(summary.c_str())\n              << \"\\\" type=\\\"\\\">\";\n      const std::string detail = location + \"\\n\" + part.message();\n      OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());\n      *stream << \"</failure>\\n\";\n    }\n  }\n\n  if (failures == 0 && result.test_property_count() == 0) {\n    *stream << \" />\\n\";\n  } else {\n    if (failures == 0) {\n      *stream << \">\\n\";\n    }\n    OutputXmlTestProperties(stream, result);\n    *stream << \"    </testcase>\\n\";\n  }\n}\n\n// Prints an XML representation of a TestCase object\nvoid XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream,\n                                                const TestCase& test_case) {\n  const std::string kTestsuite = \"testsuite\";\n  *stream << \"  <\" << kTestsuite;\n  OutputXmlAttribute(stream, kTestsuite, \"name\", test_case.name());\n  OutputXmlAttribute(stream, kTestsuite, \"tests\",\n                     StreamableToString(test_case.reportable_test_count()));\n  if (!GTEST_FLAG(list_tests)) {\n    OutputXmlAttribute(stream, kTestsuite, \"failures\",\n                       StreamableToString(test_case.failed_test_count()));\n    OutputXmlAttribute(\n        stream, kTestsuite, \"disabled\",\n        StreamableToString(test_case.reportable_disabled_test_count()));\n    OutputXmlAttribute(stream, kTestsuite, \"errors\", \"0\");\n    OutputXmlAttribute(stream, kTestsuite, \"time\",\n                       FormatTimeInMillisAsSeconds(test_case.elapsed_time()));\n    *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result());\n  }\n  *stream << \">\\n\";\n  for (int i = 0; i < test_case.total_test_count(); ++i) {\n    if (test_case.GetTestInfo(i)->is_reportable())\n      OutputXmlTestInfo(stream, test_case.name(), *test_case.GetTestInfo(i));\n  }\n  *stream << \"  </\" << kTestsuite << \">\\n\";\n}\n\n// Prints an XML summary of unit_test to output stream out.\nvoid XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,\n                                                const UnitTest& unit_test) {\n  const std::string kTestsuites = \"testsuites\";\n\n  *stream << \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\";\n  *stream << \"<\" << kTestsuites;\n\n  OutputXmlAttribute(stream, kTestsuites, \"tests\",\n                     StreamableToString(unit_test.reportable_test_count()));\n  OutputXmlAttribute(stream, kTestsuites, \"failures\",\n                     StreamableToString(unit_test.failed_test_count()));\n  OutputXmlAttribute(\n      stream, kTestsuites, \"disabled\",\n      StreamableToString(unit_test.reportable_disabled_test_count()));\n  OutputXmlAttribute(stream, kTestsuites, \"errors\", \"0\");\n  OutputXmlAttribute(\n      stream, kTestsuites, \"timestamp\",\n      FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));\n  OutputXmlAttribute(stream, kTestsuites, \"time\",\n                     FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));\n\n  if (GTEST_FLAG(shuffle)) {\n    OutputXmlAttribute(stream, kTestsuites, \"random_seed\",\n                       StreamableToString(unit_test.random_seed()));\n  }\n  *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result());\n\n  OutputXmlAttribute(stream, kTestsuites, \"name\", \"AllTests\");\n  *stream << \">\\n\";\n\n  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {\n    if (unit_test.GetTestCase(i)->reportable_test_count() > 0)\n      PrintXmlTestCase(stream, *unit_test.GetTestCase(i));\n  }\n  *stream << \"</\" << kTestsuites << \">\\n\";\n}\n\nvoid XmlUnitTestResultPrinter::PrintXmlTestsList(\n    std::ostream* stream, const std::vector<TestCase*>& test_cases) {\n  const std::string kTestsuites = \"testsuites\";\n\n  *stream << \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\";\n  *stream << \"<\" << kTestsuites;\n\n  int total_tests = 0;\n  for (size_t i = 0; i < test_cases.size(); ++i) {\n    total_tests += test_cases[i]->total_test_count();\n  }\n  OutputXmlAttribute(stream, kTestsuites, \"tests\",\n                     StreamableToString(total_tests));\n  OutputXmlAttribute(stream, kTestsuites, \"name\", \"AllTests\");\n  *stream << \">\\n\";\n\n  for (size_t i = 0; i < test_cases.size(); ++i) {\n    PrintXmlTestCase(stream, *test_cases[i]);\n  }\n  *stream << \"</\" << kTestsuites << \">\\n\";\n}\n\n// Produces a string representing the test properties in a result as space\n// delimited XML attributes based on the property key=\"value\" pairs.\nstd::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(\n    const TestResult& result) {\n  Message attributes;\n  for (int i = 0; i < result.test_property_count(); ++i) {\n    const TestProperty& property = result.GetTestProperty(i);\n    attributes << \" \" << property.key() << \"=\"\n        << \"\\\"\" << EscapeXmlAttribute(property.value()) << \"\\\"\";\n  }\n  return attributes.GetString();\n}\n\nvoid XmlUnitTestResultPrinter::OutputXmlTestProperties(\n    std::ostream* stream, const TestResult& result) {\n  const std::string kProperties = \"properties\";\n  const std::string kProperty = \"property\";\n\n  if (result.test_property_count() <= 0) {\n    return;\n  }\n\n  *stream << \"<\" << kProperties << \">\\n\";\n  for (int i = 0; i < result.test_property_count(); ++i) {\n    const TestProperty& property = result.GetTestProperty(i);\n    *stream << \"<\" << kProperty;\n    *stream << \" name=\\\"\" << EscapeXmlAttribute(property.key()) << \"\\\"\";\n    *stream << \" value=\\\"\" << EscapeXmlAttribute(property.value()) << \"\\\"\";\n    *stream << \"/>\\n\";\n  }\n  *stream << \"</\" << kProperties << \">\\n\";\n}\n\n// End XmlUnitTestResultPrinter\n\n// This class generates an JSON output file.\nclass JsonUnitTestResultPrinter : public EmptyTestEventListener {\n public:\n  explicit JsonUnitTestResultPrinter(const char* output_file);\n\n  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);\n\n  // Prints an JSON summary of all unit tests.\n  static void PrintJsonTestList(::std::ostream* stream,\n                                const std::vector<TestCase*>& test_cases);\n\n private:\n  // Returns an JSON-escaped copy of the input string str.\n  static std::string EscapeJson(const std::string& str);\n\n  //// Verifies that the given attribute belongs to the given element and\n  //// streams the attribute as JSON.\n  static void OutputJsonKey(std::ostream* stream,\n                            const std::string& element_name,\n                            const std::string& name,\n                            const std::string& value,\n                            const std::string& indent,\n                            bool comma = true);\n  static void OutputJsonKey(std::ostream* stream,\n                            const std::string& element_name,\n                            const std::string& name,\n                            int value,\n                            const std::string& indent,\n                            bool comma = true);\n\n  // Streams a JSON representation of a TestInfo object.\n  static void OutputJsonTestInfo(::std::ostream* stream,\n                                 const char* test_case_name,\n                                 const TestInfo& test_info);\n\n  // Prints a JSON representation of a TestCase object\n  static void PrintJsonTestCase(::std::ostream* stream,\n                                const TestCase& test_case);\n\n  // Prints a JSON summary of unit_test to output stream out.\n  static void PrintJsonUnitTest(::std::ostream* stream,\n                                const UnitTest& unit_test);\n\n  // Produces a string representing the test properties in a result as\n  // a JSON dictionary.\n  static std::string TestPropertiesAsJson(const TestResult& result,\n                                          const std::string& indent);\n\n  // The output file.\n  const std::string output_file_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(JsonUnitTestResultPrinter);\n};\n\n// Creates a new JsonUnitTestResultPrinter.\nJsonUnitTestResultPrinter::JsonUnitTestResultPrinter(const char* output_file)\n    : output_file_(output_file) {\n  if (output_file_.empty()) {\n    GTEST_LOG_(FATAL) << \"JSON output file may not be null\";\n  }\n}\n\nvoid JsonUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,\n                                                  int /*iteration*/) {\n  FILE* jsonout = OpenFileForWriting(output_file_);\n  std::stringstream stream;\n  PrintJsonUnitTest(&stream, unit_test);\n  fprintf(jsonout, \"%s\", StringStreamToString(&stream).c_str());\n  fclose(jsonout);\n}\n\n// Returns an JSON-escaped copy of the input string str.\nstd::string JsonUnitTestResultPrinter::EscapeJson(const std::string& str) {\n  Message m;\n\n  for (size_t i = 0; i < str.size(); ++i) {\n    const char ch = str[i];\n    switch (ch) {\n      case '\\\\':\n      case '\"':\n      case '/':\n        m << '\\\\' << ch;\n        break;\n      case '\\b':\n        m << \"\\\\b\";\n        break;\n      case '\\t':\n        m << \"\\\\t\";\n        break;\n      case '\\n':\n        m << \"\\\\n\";\n        break;\n      case '\\f':\n        m << \"\\\\f\";\n        break;\n      case '\\r':\n        m << \"\\\\r\";\n        break;\n      default:\n        if (ch < ' ') {\n          m << \"\\\\u00\" << String::FormatByte(static_cast<unsigned char>(ch));\n        } else {\n          m << ch;\n        }\n        break;\n    }\n  }\n\n  return m.GetString();\n}\n\n// The following routines generate an JSON representation of a UnitTest\n// object.\n\n// Formats the given time in milliseconds as seconds.\nstatic std::string FormatTimeInMillisAsDuration(TimeInMillis ms) {\n  ::std::stringstream ss;\n  ss << (static_cast<double>(ms) * 1e-3) << \"s\";\n  return ss.str();\n}\n\n// Converts the given epoch time in milliseconds to a date string in the\n// RFC3339 format, without the timezone information.\nstatic std::string FormatEpochTimeInMillisAsRFC3339(TimeInMillis ms) {\n  struct tm time_struct;\n  if (!PortableLocaltime(static_cast<time_t>(ms / 1000), &time_struct))\n    return \"\";\n  // YYYY-MM-DDThh:mm:ss\n  return StreamableToString(time_struct.tm_year + 1900) + \"-\" +\n      String::FormatIntWidth2(time_struct.tm_mon + 1) + \"-\" +\n      String::FormatIntWidth2(time_struct.tm_mday) + \"T\" +\n      String::FormatIntWidth2(time_struct.tm_hour) + \":\" +\n      String::FormatIntWidth2(time_struct.tm_min) + \":\" +\n      String::FormatIntWidth2(time_struct.tm_sec) + \"Z\";\n}\n\nstatic inline std::string Indent(int width) {\n  return std::string(width, ' ');\n}\n\nvoid JsonUnitTestResultPrinter::OutputJsonKey(\n    std::ostream* stream,\n    const std::string& element_name,\n    const std::string& name,\n    const std::string& value,\n    const std::string& indent,\n    bool comma) {\n  const std::vector<std::string>& allowed_names =\n      GetReservedAttributesForElement(element_name);\n\n  GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=\n                   allowed_names.end())\n      << \"Key \\\"\" << name << \"\\\" is not allowed for value \\\"\" << element_name\n      << \"\\\".\";\n\n  *stream << indent << \"\\\"\" << name << \"\\\": \\\"\" << EscapeJson(value) << \"\\\"\";\n  if (comma)\n    *stream << \",\\n\";\n}\n\nvoid JsonUnitTestResultPrinter::OutputJsonKey(\n    std::ostream* stream,\n    const std::string& element_name,\n    const std::string& name,\n    int value,\n    const std::string& indent,\n    bool comma) {\n  const std::vector<std::string>& allowed_names =\n      GetReservedAttributesForElement(element_name);\n\n  GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=\n                   allowed_names.end())\n      << \"Key \\\"\" << name << \"\\\" is not allowed for value \\\"\" << element_name\n      << \"\\\".\";\n\n  *stream << indent << \"\\\"\" << name << \"\\\": \" << StreamableToString(value);\n  if (comma)\n    *stream << \",\\n\";\n}\n\n// Prints a JSON representation of a TestInfo object.\nvoid JsonUnitTestResultPrinter::OutputJsonTestInfo(::std::ostream* stream,\n                                                   const char* test_case_name,\n                                                   const TestInfo& test_info) {\n  const TestResult& result = *test_info.result();\n  const std::string kTestcase = \"testcase\";\n  const std::string kIndent = Indent(10);\n\n  *stream << Indent(8) << \"{\\n\";\n  OutputJsonKey(stream, kTestcase, \"name\", test_info.name(), kIndent);\n\n  if (test_info.value_param() != NULL) {\n    OutputJsonKey(stream, kTestcase, \"value_param\",\n                  test_info.value_param(), kIndent);\n  }\n  if (test_info.type_param() != NULL) {\n    OutputJsonKey(stream, kTestcase, \"type_param\", test_info.type_param(),\n                  kIndent);\n  }\n  if (GTEST_FLAG(list_tests)) {\n    OutputJsonKey(stream, kTestcase, \"file\", test_info.file(), kIndent);\n    OutputJsonKey(stream, kTestcase, \"line\", test_info.line(), kIndent, false);\n    *stream << \"\\n\" << Indent(8) << \"}\";\n    return;\n  }\n\n  OutputJsonKey(stream, kTestcase, \"status\",\n                test_info.should_run() ? \"RUN\" : \"NOTRUN\", kIndent);\n  OutputJsonKey(stream, kTestcase, \"time\",\n                FormatTimeInMillisAsDuration(result.elapsed_time()), kIndent);\n  OutputJsonKey(stream, kTestcase, \"classname\", test_case_name, kIndent, false);\n  *stream << TestPropertiesAsJson(result, kIndent);\n\n  int failures = 0;\n  for (int i = 0; i < result.total_part_count(); ++i) {\n    const TestPartResult& part = result.GetTestPartResult(i);\n    if (part.failed()) {\n      *stream << \",\\n\";\n      if (++failures == 1) {\n        *stream << kIndent << \"\\\"\" << \"failures\" << \"\\\": [\\n\";\n      }\n      const std::string location =\n          internal::FormatCompilerIndependentFileLocation(part.file_name(),\n                                                          part.line_number());\n      const std::string message = EscapeJson(location + \"\\n\" + part.message());\n      *stream << kIndent << \"  {\\n\"\n              << kIndent << \"    \\\"failure\\\": \\\"\" << message << \"\\\",\\n\"\n              << kIndent << \"    \\\"type\\\": \\\"\\\"\\n\"\n              << kIndent << \"  }\";\n    }\n  }\n\n  if (failures > 0)\n    *stream << \"\\n\" << kIndent << \"]\";\n  *stream << \"\\n\" << Indent(8) << \"}\";\n}\n\n// Prints an JSON representation of a TestCase object\nvoid JsonUnitTestResultPrinter::PrintJsonTestCase(std::ostream* stream,\n                                                  const TestCase& test_case) {\n  const std::string kTestsuite = \"testsuite\";\n  const std::string kIndent = Indent(6);\n\n  *stream << Indent(4) << \"{\\n\";\n  OutputJsonKey(stream, kTestsuite, \"name\", test_case.name(), kIndent);\n  OutputJsonKey(stream, kTestsuite, \"tests\", test_case.reportable_test_count(),\n                kIndent);\n  if (!GTEST_FLAG(list_tests)) {\n    OutputJsonKey(stream, kTestsuite, \"failures\", test_case.failed_test_count(),\n                  kIndent);\n    OutputJsonKey(stream, kTestsuite, \"disabled\",\n                  test_case.reportable_disabled_test_count(), kIndent);\n    OutputJsonKey(stream, kTestsuite, \"errors\", 0, kIndent);\n    OutputJsonKey(stream, kTestsuite, \"time\",\n                  FormatTimeInMillisAsDuration(test_case.elapsed_time()),\n                  kIndent, false);\n    *stream << TestPropertiesAsJson(test_case.ad_hoc_test_result(), kIndent)\n            << \",\\n\";\n  }\n\n  *stream << kIndent << \"\\\"\" << kTestsuite << \"\\\": [\\n\";\n\n  bool comma = false;\n  for (int i = 0; i < test_case.total_test_count(); ++i) {\n    if (test_case.GetTestInfo(i)->is_reportable()) {\n      if (comma) {\n        *stream << \",\\n\";\n      } else {\n        comma = true;\n      }\n      OutputJsonTestInfo(stream, test_case.name(), *test_case.GetTestInfo(i));\n    }\n  }\n  *stream << \"\\n\" << kIndent << \"]\\n\" << Indent(4) << \"}\";\n}\n\n// Prints a JSON summary of unit_test to output stream out.\nvoid JsonUnitTestResultPrinter::PrintJsonUnitTest(std::ostream* stream,\n                                                  const UnitTest& unit_test) {\n  const std::string kTestsuites = \"testsuites\";\n  const std::string kIndent = Indent(2);\n  *stream << \"{\\n\";\n\n  OutputJsonKey(stream, kTestsuites, \"tests\", unit_test.reportable_test_count(),\n                kIndent);\n  OutputJsonKey(stream, kTestsuites, \"failures\", unit_test.failed_test_count(),\n                kIndent);\n  OutputJsonKey(stream, kTestsuites, \"disabled\",\n                unit_test.reportable_disabled_test_count(), kIndent);\n  OutputJsonKey(stream, kTestsuites, \"errors\", 0, kIndent);\n  if (GTEST_FLAG(shuffle)) {\n    OutputJsonKey(stream, kTestsuites, \"random_seed\", unit_test.random_seed(),\n                  kIndent);\n  }\n  OutputJsonKey(stream, kTestsuites, \"timestamp\",\n                FormatEpochTimeInMillisAsRFC3339(unit_test.start_timestamp()),\n                kIndent);\n  OutputJsonKey(stream, kTestsuites, \"time\",\n                FormatTimeInMillisAsDuration(unit_test.elapsed_time()), kIndent,\n                false);\n\n  *stream << TestPropertiesAsJson(unit_test.ad_hoc_test_result(), kIndent)\n          << \",\\n\";\n\n  OutputJsonKey(stream, kTestsuites, \"name\", \"AllTests\", kIndent);\n  *stream << kIndent << \"\\\"\" << kTestsuites << \"\\\": [\\n\";\n\n  bool comma = false;\n  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {\n    if (unit_test.GetTestCase(i)->reportable_test_count() > 0) {\n      if (comma) {\n        *stream << \",\\n\";\n      } else {\n        comma = true;\n      }\n      PrintJsonTestCase(stream, *unit_test.GetTestCase(i));\n    }\n  }\n\n  *stream << \"\\n\" << kIndent << \"]\\n\" << \"}\\n\";\n}\n\nvoid JsonUnitTestResultPrinter::PrintJsonTestList(\n    std::ostream* stream, const std::vector<TestCase*>& test_cases) {\n  const std::string kTestsuites = \"testsuites\";\n  const std::string kIndent = Indent(2);\n  *stream << \"{\\n\";\n  int total_tests = 0;\n  for (size_t i = 0; i < test_cases.size(); ++i) {\n    total_tests += test_cases[i]->total_test_count();\n  }\n  OutputJsonKey(stream, kTestsuites, \"tests\", total_tests, kIndent);\n\n  OutputJsonKey(stream, kTestsuites, \"name\", \"AllTests\", kIndent);\n  *stream << kIndent << \"\\\"\" << kTestsuites << \"\\\": [\\n\";\n\n  for (size_t i = 0; i < test_cases.size(); ++i) {\n    if (i != 0) {\n      *stream << \",\\n\";\n    }\n    PrintJsonTestCase(stream, *test_cases[i]);\n  }\n\n  *stream << \"\\n\"\n          << kIndent << \"]\\n\"\n          << \"}\\n\";\n}\n// Produces a string representing the test properties in a result as\n// a JSON dictionary.\nstd::string JsonUnitTestResultPrinter::TestPropertiesAsJson(\n    const TestResult& result, const std::string& indent) {\n  Message attributes;\n  for (int i = 0; i < result.test_property_count(); ++i) {\n    const TestProperty& property = result.GetTestProperty(i);\n    attributes << \",\\n\" << indent << \"\\\"\" << property.key() << \"\\\": \"\n               << \"\\\"\" << EscapeJson(property.value()) << \"\\\"\";\n  }\n  return attributes.GetString();\n}\n\n// End JsonUnitTestResultPrinter\n\n#if GTEST_CAN_STREAM_RESULTS_\n\n// Checks if str contains '=', '&', '%' or '\\n' characters. If yes,\n// replaces them by \"%xx\" where xx is their hexadecimal value. For\n// example, replaces \"=\" with \"%3D\".  This algorithm is O(strlen(str))\n// in both time and space -- important as the input str may contain an\n// arbitrarily long test failure message and stack trace.\nstd::string StreamingListener::UrlEncode(const char* str) {\n  std::string result;\n  result.reserve(strlen(str) + 1);\n  for (char ch = *str; ch != '\\0'; ch = *++str) {\n    switch (ch) {\n      case '%':\n      case '=':\n      case '&':\n      case '\\n':\n        result.append(\"%\" + String::FormatByte(static_cast<unsigned char>(ch)));\n        break;\n      default:\n        result.push_back(ch);\n        break;\n    }\n  }\n  return result;\n}\n\nvoid StreamingListener::SocketWriter::MakeConnection() {\n  GTEST_CHECK_(sockfd_ == -1)\n      << \"MakeConnection() can't be called when there is already a connection.\";\n\n  addrinfo hints;\n  memset(&hints, 0, sizeof(hints));\n  hints.ai_family = AF_UNSPEC;    // To allow both IPv4 and IPv6 addresses.\n  hints.ai_socktype = SOCK_STREAM;\n  addrinfo* servinfo = NULL;\n\n  // Use the getaddrinfo() to get a linked list of IP addresses for\n  // the given host name.\n  const int error_num = getaddrinfo(\n      host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);\n  if (error_num != 0) {\n    GTEST_LOG_(WARNING) << \"stream_result_to: getaddrinfo() failed: \"\n                        << gai_strerror(error_num);\n  }\n\n  // Loop through all the results and connect to the first we can.\n  for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;\n       cur_addr = cur_addr->ai_next) {\n    sockfd_ = socket(\n        cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);\n    if (sockfd_ != -1) {\n      // Connect the client socket to the server socket.\n      if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {\n        close(sockfd_);\n        sockfd_ = -1;\n      }\n    }\n  }\n\n  freeaddrinfo(servinfo);  // all done with this structure\n\n  if (sockfd_ == -1) {\n    GTEST_LOG_(WARNING) << \"stream_result_to: failed to connect to \"\n                        << host_name_ << \":\" << port_num_;\n  }\n}\n\n// End of class Streaming Listener\n#endif  // GTEST_CAN_STREAM_RESULTS__\n\n// class OsStackTraceGetter\n\nconst char* const OsStackTraceGetterInterface::kElidedFramesMarker =\n    \"... \" GTEST_NAME_ \" internal frames ...\";\n\nstd::string OsStackTraceGetter::CurrentStackTrace(int max_depth, int skip_count)\n    GTEST_LOCK_EXCLUDED_(mutex_) {\n#if GTEST_HAS_ABSL\n  std::string result;\n\n  if (max_depth <= 0) {\n    return result;\n  }\n\n  max_depth = std::min(max_depth, kMaxStackTraceDepth);\n\n  std::vector<void*> raw_stack(max_depth);\n  // Skips the frames requested by the caller, plus this function.\n  const int raw_stack_size =\n      absl::GetStackTrace(&raw_stack[0], max_depth, skip_count + 1);\n\n  void* caller_frame = nullptr;\n  {\n    MutexLock lock(&mutex_);\n    caller_frame = caller_frame_;\n  }\n\n  for (int i = 0; i < raw_stack_size; ++i) {\n    if (raw_stack[i] == caller_frame &&\n        !GTEST_FLAG(show_internal_stack_frames)) {\n      // Add a marker to the trace and stop adding frames.\n      absl::StrAppend(&result, kElidedFramesMarker, \"\\n\");\n      break;\n    }\n\n    char tmp[1024];\n    const char* symbol = \"(unknown)\";\n    if (absl::Symbolize(raw_stack[i], tmp, sizeof(tmp))) {\n      symbol = tmp;\n    }\n\n    char line[1024];\n    snprintf(line, sizeof(line), \"  %p: %s\\n\", raw_stack[i], symbol);\n    result += line;\n  }\n\n  return result;\n\n#else  // !GTEST_HAS_ABSL\n  static_cast<void>(max_depth);\n  static_cast<void>(skip_count);\n  return \"\";\n#endif  // GTEST_HAS_ABSL\n}\n\nvoid OsStackTraceGetter::UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_) {\n#if GTEST_HAS_ABSL\n  void* caller_frame = nullptr;\n  if (absl::GetStackTrace(&caller_frame, 1, 3) <= 0) {\n    caller_frame = nullptr;\n  }\n\n  MutexLock lock(&mutex_);\n  caller_frame_ = caller_frame;\n#endif  // GTEST_HAS_ABSL\n}\n\n// A helper class that creates the premature-exit file in its\n// constructor and deletes the file in its destructor.\nclass ScopedPrematureExitFile {\n public:\n  explicit ScopedPrematureExitFile(const char* premature_exit_filepath)\n      : premature_exit_filepath_(premature_exit_filepath ?\n                                 premature_exit_filepath : \"\") {\n    // If a path to the premature-exit file is specified...\n    if (!premature_exit_filepath_.empty()) {\n      // create the file with a single \"0\" character in it.  I/O\n      // errors are ignored as there's nothing better we can do and we\n      // don't want to fail the test because of this.\n      FILE* pfile = posix::FOpen(premature_exit_filepath, \"w\");\n      fwrite(\"0\", 1, 1, pfile);\n      fclose(pfile);\n    }\n  }\n\n  ~ScopedPrematureExitFile() {\n    if (!premature_exit_filepath_.empty()) {\n      int retval = remove(premature_exit_filepath_.c_str());\n      if (retval) {\n        GTEST_LOG_(ERROR) << \"Failed to remove premature exit filepath \\\"\"\n                          << premature_exit_filepath_ << \"\\\" with error \"\n                          << retval;\n      }\n    }\n  }\n\n private:\n  const std::string premature_exit_filepath_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile);\n};\n\n}  // namespace internal\n\n// class TestEventListeners\n\nTestEventListeners::TestEventListeners()\n    : repeater_(new internal::TestEventRepeater()),\n      default_result_printer_(NULL),\n      default_xml_generator_(NULL) {\n}\n\nTestEventListeners::~TestEventListeners() { delete repeater_; }\n\n// Returns the standard listener responsible for the default console\n// output.  Can be removed from the listeners list to shut down default\n// console output.  Note that removing this object from the listener list\n// with Release transfers its ownership to the user.\nvoid TestEventListeners::Append(TestEventListener* listener) {\n  repeater_->Append(listener);\n}\n\n// Removes the given event listener from the list and returns it.  It then\n// becomes the caller's responsibility to delete the listener. Returns\n// NULL if the listener is not found in the list.\nTestEventListener* TestEventListeners::Release(TestEventListener* listener) {\n  if (listener == default_result_printer_)\n    default_result_printer_ = NULL;\n  else if (listener == default_xml_generator_)\n    default_xml_generator_ = NULL;\n  return repeater_->Release(listener);\n}\n\n// Returns repeater that broadcasts the TestEventListener events to all\n// subscribers.\nTestEventListener* TestEventListeners::repeater() { return repeater_; }\n\n// Sets the default_result_printer attribute to the provided listener.\n// The listener is also added to the listener list and previous\n// default_result_printer is removed from it and deleted. The listener can\n// also be NULL in which case it will not be added to the list. Does\n// nothing if the previous and the current listener objects are the same.\nvoid TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {\n  if (default_result_printer_ != listener) {\n    // It is an error to pass this method a listener that is already in the\n    // list.\n    delete Release(default_result_printer_);\n    default_result_printer_ = listener;\n    if (listener != NULL)\n      Append(listener);\n  }\n}\n\n// Sets the default_xml_generator attribute to the provided listener.  The\n// listener is also added to the listener list and previous\n// default_xml_generator is removed from it and deleted. The listener can\n// also be NULL in which case it will not be added to the list. Does\n// nothing if the previous and the current listener objects are the same.\nvoid TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {\n  if (default_xml_generator_ != listener) {\n    // It is an error to pass this method a listener that is already in the\n    // list.\n    delete Release(default_xml_generator_);\n    default_xml_generator_ = listener;\n    if (listener != NULL)\n      Append(listener);\n  }\n}\n\n// Controls whether events will be forwarded by the repeater to the\n// listeners in the list.\nbool TestEventListeners::EventForwardingEnabled() const {\n  return repeater_->forwarding_enabled();\n}\n\nvoid TestEventListeners::SuppressEventForwarding() {\n  repeater_->set_forwarding_enabled(false);\n}\n\n// class UnitTest\n\n// Gets the singleton UnitTest object.  The first time this method is\n// called, a UnitTest object is constructed and returned.  Consecutive\n// calls will return the same object.\n//\n// We don't protect this under mutex_ as a user is not supposed to\n// call this before main() starts, from which point on the return\n// value will never change.\nUnitTest* UnitTest::GetInstance() {\n  // When compiled with MSVC 7.1 in optimized mode, destroying the\n  // UnitTest object upon exiting the program messes up the exit code,\n  // causing successful tests to appear failed.  We have to use a\n  // different implementation in this case to bypass the compiler bug.\n  // This implementation makes the compiler happy, at the cost of\n  // leaking the UnitTest object.\n\n  // CodeGear C++Builder insists on a public destructor for the\n  // default implementation.  Use this implementation to keep good OO\n  // design with private destructor.\n\n#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)\n  static UnitTest* const instance = new UnitTest;\n  return instance;\n#else\n  static UnitTest instance;\n  return &instance;\n#endif  // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)\n}\n\n// Gets the number of successful test cases.\nint UnitTest::successful_test_case_count() const {\n  return impl()->successful_test_case_count();\n}\n\n// Gets the number of failed test cases.\nint UnitTest::failed_test_case_count() const {\n  return impl()->failed_test_case_count();\n}\n\n// Gets the number of all test cases.\nint UnitTest::total_test_case_count() const {\n  return impl()->total_test_case_count();\n}\n\n// Gets the number of all test cases that contain at least one test\n// that should run.\nint UnitTest::test_case_to_run_count() const {\n  return impl()->test_case_to_run_count();\n}\n\n// Gets the number of successful tests.\nint UnitTest::successful_test_count() const {\n  return impl()->successful_test_count();\n}\n\n// Gets the number of failed tests.\nint UnitTest::failed_test_count() const { return impl()->failed_test_count(); }\n\n// Gets the number of disabled tests that will be reported in the XML report.\nint UnitTest::reportable_disabled_test_count() const {\n  return impl()->reportable_disabled_test_count();\n}\n\n// Gets the number of disabled tests.\nint UnitTest::disabled_test_count() const {\n  return impl()->disabled_test_count();\n}\n\n// Gets the number of tests to be printed in the XML report.\nint UnitTest::reportable_test_count() const {\n  return impl()->reportable_test_count();\n}\n\n// Gets the number of all tests.\nint UnitTest::total_test_count() const { return impl()->total_test_count(); }\n\n// Gets the number of tests that should run.\nint UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }\n\n// Gets the time of the test program start, in ms from the start of the\n// UNIX epoch.\ninternal::TimeInMillis UnitTest::start_timestamp() const {\n    return impl()->start_timestamp();\n}\n\n// Gets the elapsed time, in milliseconds.\ninternal::TimeInMillis UnitTest::elapsed_time() const {\n  return impl()->elapsed_time();\n}\n\n// Returns true iff the unit test passed (i.e. all test cases passed).\nbool UnitTest::Passed() const { return impl()->Passed(); }\n\n// Returns true iff the unit test failed (i.e. some test case failed\n// or something outside of all tests failed).\nbool UnitTest::Failed() const { return impl()->Failed(); }\n\n// Gets the i-th test case among all the test cases. i can range from 0 to\n// total_test_case_count() - 1. If i is not in that range, returns NULL.\nconst TestCase* UnitTest::GetTestCase(int i) const {\n  return impl()->GetTestCase(i);\n}\n\n// Returns the TestResult containing information on test failures and\n// properties logged outside of individual test cases.\nconst TestResult& UnitTest::ad_hoc_test_result() const {\n  return *impl()->ad_hoc_test_result();\n}\n\n// Gets the i-th test case among all the test cases. i can range from 0 to\n// total_test_case_count() - 1. If i is not in that range, returns NULL.\nTestCase* UnitTest::GetMutableTestCase(int i) {\n  return impl()->GetMutableTestCase(i);\n}\n\n// Returns the list of event listeners that can be used to track events\n// inside Google Test.\nTestEventListeners& UnitTest::listeners() {\n  return *impl()->listeners();\n}\n\n// Registers and returns a global test environment.  When a test\n// program is run, all global test environments will be set-up in the\n// order they were registered.  After all tests in the program have\n// finished, all global test environments will be torn-down in the\n// *reverse* order they were registered.\n//\n// The UnitTest object takes ownership of the given environment.\n//\n// We don't protect this under mutex_, as we only support calling it\n// from the main thread.\nEnvironment* UnitTest::AddEnvironment(Environment* env) {\n  if (env == NULL) {\n    return NULL;\n  }\n\n  impl_->environments().push_back(env);\n  return env;\n}\n\n// Adds a TestPartResult to the current TestResult object.  All Google Test\n// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call\n// this to report their results.  The user code should use the\n// assertion macros instead of calling this directly.\nvoid UnitTest::AddTestPartResult(\n    TestPartResult::Type result_type,\n    const char* file_name,\n    int line_number,\n    const std::string& message,\n    const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) {\n  Message msg;\n  msg << message;\n\n  internal::MutexLock lock(&mutex_);\n  if (impl_->gtest_trace_stack().size() > 0) {\n    msg << \"\\n\" << GTEST_NAME_ << \" trace:\";\n\n    for (int i = static_cast<int>(impl_->gtest_trace_stack().size());\n         i > 0; --i) {\n      const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];\n      msg << \"\\n\" << internal::FormatFileLocation(trace.file, trace.line)\n          << \" \" << trace.message;\n    }\n  }\n\n  if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {\n    msg << internal::kStackTraceMarker << os_stack_trace;\n  }\n\n  const TestPartResult result =\n    TestPartResult(result_type, file_name, line_number,\n                   msg.GetString().c_str());\n  impl_->GetTestPartResultReporterForCurrentThread()->\n      ReportTestPartResult(result);\n\n  if (result_type != TestPartResult::kSuccess) {\n    // gtest_break_on_failure takes precedence over\n    // gtest_throw_on_failure.  This allows a user to set the latter\n    // in the code (perhaps in order to use Google Test assertions\n    // with another testing framework) and specify the former on the\n    // command line for debugging.\n    if (GTEST_FLAG(break_on_failure)) {\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT\n      // Using DebugBreak on Windows allows gtest to still break into a debugger\n      // when a failure happens and both the --gtest_break_on_failure and\n      // the --gtest_catch_exceptions flags are specified.\n      DebugBreak();\n#elif (!defined(__native_client__)) &&            \\\n    ((defined(__clang__) || defined(__GNUC__)) && \\\n     (defined(__x86_64__) || defined(__i386__)))\n      // with clang/gcc we can achieve the same effect on x86 by invoking int3\n      asm(\"int3\");\n#else\n      // Dereference NULL through a volatile pointer to prevent the compiler\n      // from removing. We use this rather than abort() or __builtin_trap() for\n      // portability: Symbian doesn't implement abort() well, and some debuggers\n      // don't correctly trap abort().\n      *static_cast<volatile int*>(NULL) = 1;\n#endif  // GTEST_OS_WINDOWS\n    } else if (GTEST_FLAG(throw_on_failure)) {\n#if GTEST_HAS_EXCEPTIONS\n      throw internal::GoogleTestFailureException(result);\n#else\n      // We cannot call abort() as it generates a pop-up in debug mode\n      // that cannot be suppressed in VC 7.1 or below.\n      exit(1);\n#endif\n    }\n  }\n}\n\n// Adds a TestProperty to the current TestResult object when invoked from\n// inside a test, to current TestCase's ad_hoc_test_result_ when invoked\n// from SetUpTestCase or TearDownTestCase, or to the global property set\n// when invoked elsewhere.  If the result already contains a property with\n// the same key, the value will be updated.\nvoid UnitTest::RecordProperty(const std::string& key,\n                              const std::string& value) {\n  impl_->RecordProperty(TestProperty(key, value));\n}\n\n// Runs all tests in this UnitTest object and prints the result.\n// Returns 0 if successful, or 1 otherwise.\n//\n// We don't protect this under mutex_, as we only support calling it\n// from the main thread.\nint UnitTest::Run() {\n  const bool in_death_test_child_process =\n      internal::GTEST_FLAG(internal_run_death_test).length() > 0;\n\n  // Google Test implements this protocol for catching that a test\n  // program exits before returning control to Google Test:\n  //\n  //   1. Upon start, Google Test creates a file whose absolute path\n  //      is specified by the environment variable\n  //      TEST_PREMATURE_EXIT_FILE.\n  //   2. When Google Test has finished its work, it deletes the file.\n  //\n  // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before\n  // running a Google-Test-based test program and check the existence\n  // of the file at the end of the test execution to see if it has\n  // exited prematurely.\n\n  // If we are in the child process of a death test, don't\n  // create/delete the premature exit file, as doing so is unnecessary\n  // and will confuse the parent process.  Otherwise, create/delete\n  // the file upon entering/leaving this function.  If the program\n  // somehow exits before this function has a chance to return, the\n  // premature-exit file will be left undeleted, causing a test runner\n  // that understands the premature-exit-file protocol to report the\n  // test as having failed.\n  const internal::ScopedPrematureExitFile premature_exit_file(\n      in_death_test_child_process ?\n      NULL : internal::posix::GetEnv(\"TEST_PREMATURE_EXIT_FILE\"));\n\n  // Captures the value of GTEST_FLAG(catch_exceptions).  This value will be\n  // used for the duration of the program.\n  impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));\n\n#if GTEST_OS_WINDOWS\n  // Either the user wants Google Test to catch exceptions thrown by the\n  // tests or this is executing in the context of death test child\n  // process. In either case the user does not want to see pop-up dialogs\n  // about crashes - they are expected.\n  if (impl()->catch_exceptions() || in_death_test_child_process) {\n# if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT\n    // SetErrorMode doesn't exist on CE.\n    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |\n                 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);\n# endif  // !GTEST_OS_WINDOWS_MOBILE\n\n# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE\n    // Death test children can be terminated with _abort().  On Windows,\n    // _abort() can show a dialog with a warning message.  This forces the\n    // abort message to go to stderr instead.\n    _set_error_mode(_OUT_TO_STDERR);\n# endif\n\n# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE\n    // In the debug version, Visual Studio pops up a separate dialog\n    // offering a choice to debug the aborted program. We need to suppress\n    // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement\n    // executed. Google Test will notify the user of any unexpected\n    // failure via stderr.\n    //\n    // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.\n    // Users of prior VC versions shall suffer the agony and pain of\n    // clicking through the countless debug dialogs.\n    // FIXME: find a way to suppress the abort dialog() in the\n    // debug mode when compiled with VC 7.1 or lower.\n    if (!GTEST_FLAG(break_on_failure))\n      _set_abort_behavior(\n          0x0,                                    // Clear the following flags:\n          _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.\n# endif\n  }\n#endif  // GTEST_OS_WINDOWS\n\n  return internal::HandleExceptionsInMethodIfSupported(\n      impl(),\n      &internal::UnitTestImpl::RunAllTests,\n      \"auxiliary test code (environments or event listeners)\") ? 0 : 1;\n}\n\n// Returns the working directory when the first TEST() or TEST_F() was\n// executed.\nconst char* UnitTest::original_working_dir() const {\n  return impl_->original_working_dir_.c_str();\n}\n\n// Returns the TestCase object for the test that's currently running,\n// or NULL if no test is running.\nconst TestCase* UnitTest::current_test_case() const\n    GTEST_LOCK_EXCLUDED_(mutex_) {\n  internal::MutexLock lock(&mutex_);\n  return impl_->current_test_case();\n}\n\n// Returns the TestInfo object for the test that's currently running,\n// or NULL if no test is running.\nconst TestInfo* UnitTest::current_test_info() const\n    GTEST_LOCK_EXCLUDED_(mutex_) {\n  internal::MutexLock lock(&mutex_);\n  return impl_->current_test_info();\n}\n\n// Returns the random seed used at the start of the current test run.\nint UnitTest::random_seed() const { return impl_->random_seed(); }\n\n// Returns ParameterizedTestCaseRegistry object used to keep track of\n// value-parameterized tests and instantiate and register them.\ninternal::ParameterizedTestCaseRegistry&\n    UnitTest::parameterized_test_registry()\n        GTEST_LOCK_EXCLUDED_(mutex_) {\n  return impl_->parameterized_test_registry();\n}\n\n// Creates an empty UnitTest.\nUnitTest::UnitTest() {\n  impl_ = new internal::UnitTestImpl(this);\n}\n\n// Destructor of UnitTest.\nUnitTest::~UnitTest() {\n  delete impl_;\n}\n\n// Pushes a trace defined by SCOPED_TRACE() on to the per-thread\n// Google Test trace stack.\nvoid UnitTest::PushGTestTrace(const internal::TraceInfo& trace)\n    GTEST_LOCK_EXCLUDED_(mutex_) {\n  internal::MutexLock lock(&mutex_);\n  impl_->gtest_trace_stack().push_back(trace);\n}\n\n// Pops a trace from the per-thread Google Test trace stack.\nvoid UnitTest::PopGTestTrace()\n    GTEST_LOCK_EXCLUDED_(mutex_) {\n  internal::MutexLock lock(&mutex_);\n  impl_->gtest_trace_stack().pop_back();\n}\n\nnamespace internal {\n\nUnitTestImpl::UnitTestImpl(UnitTest* parent)\n    : parent_(parent),\n      GTEST_DISABLE_MSC_WARNINGS_PUSH_(4355 /* using this in initializer */)\n      default_global_test_part_result_reporter_(this),\n      default_per_thread_test_part_result_reporter_(this),\n      GTEST_DISABLE_MSC_WARNINGS_POP_()\n      global_test_part_result_repoter_(\n          &default_global_test_part_result_reporter_),\n      per_thread_test_part_result_reporter_(\n          &default_per_thread_test_part_result_reporter_),\n      parameterized_test_registry_(),\n      parameterized_tests_registered_(false),\n      last_death_test_case_(-1),\n      current_test_case_(NULL),\n      current_test_info_(NULL),\n      ad_hoc_test_result_(),\n      os_stack_trace_getter_(NULL),\n      post_flag_parse_init_performed_(false),\n      random_seed_(0),  // Will be overridden by the flag before first use.\n      random_(0),  // Will be reseeded before first use.\n      start_timestamp_(0),\n      elapsed_time_(0),\n#if GTEST_HAS_DEATH_TEST\n      death_test_factory_(new DefaultDeathTestFactory),\n#endif\n      // Will be overridden by the flag before first use.\n      catch_exceptions_(false) {\n  listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);\n}\n\nUnitTestImpl::~UnitTestImpl() {\n  // Deletes every TestCase.\n  ForEach(test_cases_, internal::Delete<TestCase>);\n\n  // Deletes every Environment.\n  ForEach(environments_, internal::Delete<Environment>);\n\n  delete os_stack_trace_getter_;\n}\n\n// Adds a TestProperty to the current TestResult object when invoked in a\n// context of a test, to current test case's ad_hoc_test_result when invoke\n// from SetUpTestCase/TearDownTestCase, or to the global property set\n// otherwise.  If the result already contains a property with the same key,\n// the value will be updated.\nvoid UnitTestImpl::RecordProperty(const TestProperty& test_property) {\n  std::string xml_element;\n  TestResult* test_result;  // TestResult appropriate for property recording.\n\n  if (current_test_info_ != NULL) {\n    xml_element = \"testcase\";\n    test_result = &(current_test_info_->result_);\n  } else if (current_test_case_ != NULL) {\n    xml_element = \"testsuite\";\n    test_result = &(current_test_case_->ad_hoc_test_result_);\n  } else {\n    xml_element = \"testsuites\";\n    test_result = &ad_hoc_test_result_;\n  }\n  test_result->RecordProperty(xml_element, test_property);\n}\n\n#if GTEST_HAS_DEATH_TEST\n// Disables event forwarding if the control is currently in a death test\n// subprocess. Must not be called before InitGoogleTest.\nvoid UnitTestImpl::SuppressTestEventsIfInSubprocess() {\n  if (internal_run_death_test_flag_.get() != NULL)\n    listeners()->SuppressEventForwarding();\n}\n#endif  // GTEST_HAS_DEATH_TEST\n\n// Initializes event listeners performing XML output as specified by\n// UnitTestOptions. Must not be called before InitGoogleTest.\nvoid UnitTestImpl::ConfigureXmlOutput() {\n  const std::string& output_format = UnitTestOptions::GetOutputFormat();\n  if (output_format == \"xml\") {\n    listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(\n        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));\n  } else if (output_format == \"json\") {\n    listeners()->SetDefaultXmlGenerator(new JsonUnitTestResultPrinter(\n        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));\n  } else if (output_format != \"\") {\n    GTEST_LOG_(WARNING) << \"WARNING: unrecognized output format \\\"\"\n                        << output_format << \"\\\" ignored.\";\n  }\n}\n\n#if GTEST_CAN_STREAM_RESULTS_\n// Initializes event listeners for streaming test results in string form.\n// Must not be called before InitGoogleTest.\nvoid UnitTestImpl::ConfigureStreamingOutput() {\n  const std::string& target = GTEST_FLAG(stream_result_to);\n  if (!target.empty()) {\n    const size_t pos = target.find(':');\n    if (pos != std::string::npos) {\n      listeners()->Append(new StreamingListener(target.substr(0, pos),\n                                                target.substr(pos+1)));\n    } else {\n      GTEST_LOG_(WARNING) << \"unrecognized streaming target \\\"\" << target\n                          << \"\\\" ignored.\";\n    }\n  }\n}\n#endif  // GTEST_CAN_STREAM_RESULTS_\n\n// Performs initialization dependent upon flag values obtained in\n// ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to\n// ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest\n// this function is also called from RunAllTests.  Since this function can be\n// called more than once, it has to be idempotent.\nvoid UnitTestImpl::PostFlagParsingInit() {\n  // Ensures that this function does not execute more than once.\n  if (!post_flag_parse_init_performed_) {\n    post_flag_parse_init_performed_ = true;\n\n#if defined(GTEST_CUSTOM_TEST_EVENT_LISTENER_)\n    // Register to send notifications about key process state changes.\n    listeners()->Append(new GTEST_CUSTOM_TEST_EVENT_LISTENER_());\n#endif  // defined(GTEST_CUSTOM_TEST_EVENT_LISTENER_)\n\n#if GTEST_HAS_DEATH_TEST\n    InitDeathTestSubprocessControlInfo();\n    SuppressTestEventsIfInSubprocess();\n#endif  // GTEST_HAS_DEATH_TEST\n\n    // Registers parameterized tests. This makes parameterized tests\n    // available to the UnitTest reflection API without running\n    // RUN_ALL_TESTS.\n    RegisterParameterizedTests();\n\n    // Configures listeners for XML output. This makes it possible for users\n    // to shut down the default XML output before invoking RUN_ALL_TESTS.\n    ConfigureXmlOutput();\n\n#if GTEST_CAN_STREAM_RESULTS_\n    // Configures listeners for streaming test results to the specified server.\n    ConfigureStreamingOutput();\n#endif  // GTEST_CAN_STREAM_RESULTS_\n\n#if GTEST_HAS_ABSL\n    if (GTEST_FLAG(install_failure_signal_handler)) {\n      absl::FailureSignalHandlerOptions options;\n      absl::InstallFailureSignalHandler(options);\n    }\n#endif  // GTEST_HAS_ABSL\n  }\n}\n\n// A predicate that checks the name of a TestCase against a known\n// value.\n//\n// This is used for implementation of the UnitTest class only.  We put\n// it in the anonymous namespace to prevent polluting the outer\n// namespace.\n//\n// TestCaseNameIs is copyable.\nclass TestCaseNameIs {\n public:\n  // Constructor.\n  explicit TestCaseNameIs(const std::string& name)\n      : name_(name) {}\n\n  // Returns true iff the name of test_case matches name_.\n  bool operator()(const TestCase* test_case) const {\n    return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;\n  }\n\n private:\n  std::string name_;\n};\n\n// Finds and returns a TestCase with the given name.  If one doesn't\n// exist, creates one and returns it.  It's the CALLER'S\n// RESPONSIBILITY to ensure that this function is only called WHEN THE\n// TESTS ARE NOT SHUFFLED.\n//\n// Arguments:\n//\n//   test_case_name: name of the test case\n//   type_param:     the name of the test case's type parameter, or NULL if\n//                   this is not a typed or a type-parameterized test case.\n//   set_up_tc:      pointer to the function that sets up the test case\n//   tear_down_tc:   pointer to the function that tears down the test case\nTestCase* UnitTestImpl::GetTestCase(const char* test_case_name,\n                                    const char* type_param,\n                                    Test::SetUpTestCaseFunc set_up_tc,\n                                    Test::TearDownTestCaseFunc tear_down_tc) {\n  // Can we find a TestCase with the given name?\n  const std::vector<TestCase*>::const_reverse_iterator test_case =\n      std::find_if(test_cases_.rbegin(), test_cases_.rend(),\n                   TestCaseNameIs(test_case_name));\n\n  if (test_case != test_cases_.rend())\n    return *test_case;\n\n  // No.  Let's create one.\n  TestCase* const new_test_case =\n      new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);\n\n  // Is this a death test case?\n  if (internal::UnitTestOptions::MatchesFilter(test_case_name,\n                                               kDeathTestCaseFilter)) {\n    // Yes.  Inserts the test case after the last death test case\n    // defined so far.  This only works when the test cases haven't\n    // been shuffled.  Otherwise we may end up running a death test\n    // after a non-death test.\n    ++last_death_test_case_;\n    test_cases_.insert(test_cases_.begin() + last_death_test_case_,\n                       new_test_case);\n  } else {\n    // No.  Appends to the end of the list.\n    test_cases_.push_back(new_test_case);\n  }\n\n  test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));\n  return new_test_case;\n}\n\n// Helpers for setting up / tearing down the given environment.  They\n// are for use in the ForEach() function.\nstatic void SetUpEnvironment(Environment* env) { env->SetUp(); }\nstatic void TearDownEnvironment(Environment* env) { env->TearDown(); }\n\n// Runs all tests in this UnitTest object, prints the result, and\n// returns true if all tests are successful.  If any exception is\n// thrown during a test, the test is considered to be failed, but the\n// rest of the tests will still be run.\n//\n// When parameterized tests are enabled, it expands and registers\n// parameterized tests first in RegisterParameterizedTests().\n// All other functions called from RunAllTests() may safely assume that\n// parameterized tests are ready to be counted and run.\nbool UnitTestImpl::RunAllTests() {\n  // True iff Google Test is initialized before RUN_ALL_TESTS() is called.\n  const bool gtest_is_initialized_before_run_all_tests = GTestIsInitialized();\n\n  // Do not run any test if the --help flag was specified.\n  if (g_help_flag)\n    return true;\n\n  // Repeats the call to the post-flag parsing initialization in case the\n  // user didn't call InitGoogleTest.\n  PostFlagParsingInit();\n\n  // Even if sharding is not on, test runners may want to use the\n  // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding\n  // protocol.\n  internal::WriteToShardStatusFileIfNeeded();\n\n  // True iff we are in a subprocess for running a thread-safe-style\n  // death test.\n  bool in_subprocess_for_death_test = false;\n\n#if GTEST_HAS_DEATH_TEST\n  in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);\n# if defined(GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_)\n  if (in_subprocess_for_death_test) {\n    GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_();\n  }\n# endif  // defined(GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_)\n#endif  // GTEST_HAS_DEATH_TEST\n\n  const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,\n                                        in_subprocess_for_death_test);\n\n  // Compares the full test names with the filter to decide which\n  // tests to run.\n  const bool has_tests_to_run = FilterTests(should_shard\n                                              ? HONOR_SHARDING_PROTOCOL\n                                              : IGNORE_SHARDING_PROTOCOL) > 0;\n\n  // Lists the tests and exits if the --gtest_list_tests flag was specified.\n  if (GTEST_FLAG(list_tests)) {\n    // This must be called *after* FilterTests() has been called.\n    ListTestsMatchingFilter();\n    return true;\n  }\n\n  random_seed_ = GTEST_FLAG(shuffle) ?\n      GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;\n\n  // True iff at least one test has failed.\n  bool failed = false;\n\n  TestEventListener* repeater = listeners()->repeater();\n\n  start_timestamp_ = GetTimeInMillis();\n  repeater->OnTestProgramStart(*parent_);\n\n  // How many times to repeat the tests?  We don't want to repeat them\n  // when we are inside the subprocess of a death test.\n  const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);\n  // Repeats forever if the repeat count is negative.\n  const bool forever = repeat < 0;\n  for (int i = 0; forever || i != repeat; i++) {\n    // We want to preserve failures generated by ad-hoc test\n    // assertions executed before RUN_ALL_TESTS().\n    ClearNonAdHocTestResult();\n\n    const TimeInMillis start = GetTimeInMillis();\n\n    // Shuffles test cases and tests if requested.\n    if (has_tests_to_run && GTEST_FLAG(shuffle)) {\n      random()->Reseed(random_seed_);\n      // This should be done before calling OnTestIterationStart(),\n      // such that a test event listener can see the actual test order\n      // in the event.\n      ShuffleTests();\n    }\n\n    // Tells the unit test event listeners that the tests are about to start.\n    repeater->OnTestIterationStart(*parent_, i);\n\n    // Runs each test case if there is at least one test to run.\n    if (has_tests_to_run) {\n      // Sets up all environments beforehand.\n      repeater->OnEnvironmentsSetUpStart(*parent_);\n      ForEach(environments_, SetUpEnvironment);\n      repeater->OnEnvironmentsSetUpEnd(*parent_);\n\n      // Runs the tests only if there was no fatal failure during global\n      // set-up.\n      if (!Test::HasFatalFailure()) {\n        for (int test_index = 0; test_index < total_test_case_count();\n             test_index++) {\n          GetMutableTestCase(test_index)->Run();\n        }\n      }\n\n      // Tears down all environments in reverse order afterwards.\n      repeater->OnEnvironmentsTearDownStart(*parent_);\n      std::for_each(environments_.rbegin(), environments_.rend(),\n                    TearDownEnvironment);\n      repeater->OnEnvironmentsTearDownEnd(*parent_);\n    }\n\n    elapsed_time_ = GetTimeInMillis() - start;\n\n    // Tells the unit test event listener that the tests have just finished.\n    repeater->OnTestIterationEnd(*parent_, i);\n\n    // Gets the result and clears it.\n    if (!Passed()) {\n      failed = true;\n    }\n\n    // Restores the original test order after the iteration.  This\n    // allows the user to quickly repro a failure that happens in the\n    // N-th iteration without repeating the first (N - 1) iterations.\n    // This is not enclosed in \"if (GTEST_FLAG(shuffle)) { ... }\", in\n    // case the user somehow changes the value of the flag somewhere\n    // (it's always safe to unshuffle the tests).\n    UnshuffleTests();\n\n    if (GTEST_FLAG(shuffle)) {\n      // Picks a new random seed for each iteration.\n      random_seed_ = GetNextRandomSeed(random_seed_);\n    }\n  }\n\n  repeater->OnTestProgramEnd(*parent_);\n\n  if (!gtest_is_initialized_before_run_all_tests) {\n    ColoredPrintf(\n        COLOR_RED,\n        \"\\nIMPORTANT NOTICE - DO NOT IGNORE:\\n\"\n        \"This test program did NOT call \" GTEST_INIT_GOOGLE_TEST_NAME_\n        \"() before calling RUN_ALL_TESTS(). This is INVALID. Soon \" GTEST_NAME_\n        \" will start to enforce the valid usage. \"\n        \"Please fix it ASAP, or IT WILL START TO FAIL.\\n\");  // NOLINT\n#if GTEST_FOR_GOOGLE_\n    ColoredPrintf(COLOR_RED,\n                  \"For more details, see http://wiki/Main/ValidGUnitMain.\\n\");\n#endif  // GTEST_FOR_GOOGLE_\n  }\n\n  return !failed;\n}\n\n// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file\n// if the variable is present. If a file already exists at this location, this\n// function will write over it. If the variable is present, but the file cannot\n// be created, prints an error and exits.\nvoid WriteToShardStatusFileIfNeeded() {\n  const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);\n  if (test_shard_file != NULL) {\n    FILE* const file = posix::FOpen(test_shard_file, \"w\");\n    if (file == NULL) {\n      ColoredPrintf(COLOR_RED,\n                    \"Could not write to the test shard status file \\\"%s\\\" \"\n                    \"specified by the %s environment variable.\\n\",\n                    test_shard_file, kTestShardStatusFile);\n      fflush(stdout);\n      exit(EXIT_FAILURE);\n    }\n    fclose(file);\n  }\n}\n\n// Checks whether sharding is enabled by examining the relevant\n// environment variable values. If the variables are present,\n// but inconsistent (i.e., shard_index >= total_shards), prints\n// an error and exits. If in_subprocess_for_death_test, sharding is\n// disabled because it must only be applied to the original test\n// process. Otherwise, we could filter out death tests we intended to execute.\nbool ShouldShard(const char* total_shards_env,\n                 const char* shard_index_env,\n                 bool in_subprocess_for_death_test) {\n  if (in_subprocess_for_death_test) {\n    return false;\n  }\n\n  const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);\n  const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);\n\n  if (total_shards == -1 && shard_index == -1) {\n    return false;\n  } else if (total_shards == -1 && shard_index != -1) {\n    const Message msg = Message()\n      << \"Invalid environment variables: you have \"\n      << kTestShardIndex << \" = \" << shard_index\n      << \", but have left \" << kTestTotalShards << \" unset.\\n\";\n    ColoredPrintf(COLOR_RED, msg.GetString().c_str());\n    fflush(stdout);\n    exit(EXIT_FAILURE);\n  } else if (total_shards != -1 && shard_index == -1) {\n    const Message msg = Message()\n      << \"Invalid environment variables: you have \"\n      << kTestTotalShards << \" = \" << total_shards\n      << \", but have left \" << kTestShardIndex << \" unset.\\n\";\n    ColoredPrintf(COLOR_RED, msg.GetString().c_str());\n    fflush(stdout);\n    exit(EXIT_FAILURE);\n  } else if (shard_index < 0 || shard_index >= total_shards) {\n    const Message msg = Message()\n      << \"Invalid environment variables: we require 0 <= \"\n      << kTestShardIndex << \" < \" << kTestTotalShards\n      << \", but you have \" << kTestShardIndex << \"=\" << shard_index\n      << \", \" << kTestTotalShards << \"=\" << total_shards << \".\\n\";\n    ColoredPrintf(COLOR_RED, msg.GetString().c_str());\n    fflush(stdout);\n    exit(EXIT_FAILURE);\n  }\n\n  return total_shards > 1;\n}\n\n// Parses the environment variable var as an Int32. If it is unset,\n// returns default_val. If it is not an Int32, prints an error\n// and aborts.\nInt32 Int32FromEnvOrDie(const char* var, Int32 default_val) {\n  const char* str_val = posix::GetEnv(var);\n  if (str_val == NULL) {\n    return default_val;\n  }\n\n  Int32 result;\n  if (!ParseInt32(Message() << \"The value of environment variable \" << var,\n                  str_val, &result)) {\n    exit(EXIT_FAILURE);\n  }\n  return result;\n}\n\n// Given the total number of shards, the shard index, and the test id,\n// returns true iff the test should be run on this shard. The test id is\n// some arbitrary but unique non-negative integer assigned to each test\n// method. Assumes that 0 <= shard_index < total_shards.\nbool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {\n  return (test_id % total_shards) == shard_index;\n}\n\n// Compares the name of each test with the user-specified filter to\n// decide whether the test should be run, then records the result in\n// each TestCase and TestInfo object.\n// If shard_tests == true, further filters tests based on sharding\n// variables in the environment - see\n// https://github.com/google/googletest/blob/master/googletest/docs/advanced.md\n// . Returns the number of tests that should run.\nint UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {\n  const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?\n      Int32FromEnvOrDie(kTestTotalShards, -1) : -1;\n  const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?\n      Int32FromEnvOrDie(kTestShardIndex, -1) : -1;\n\n  // num_runnable_tests are the number of tests that will\n  // run across all shards (i.e., match filter and are not disabled).\n  // num_selected_tests are the number of tests to be run on\n  // this shard.\n  int num_runnable_tests = 0;\n  int num_selected_tests = 0;\n  for (size_t i = 0; i < test_cases_.size(); i++) {\n    TestCase* const test_case = test_cases_[i];\n    const std::string &test_case_name = test_case->name();\n    test_case->set_should_run(false);\n\n    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {\n      TestInfo* const test_info = test_case->test_info_list()[j];\n      const std::string test_name(test_info->name());\n      // A test is disabled if test case name or test name matches\n      // kDisableTestFilter.\n      const bool is_disabled =\n          internal::UnitTestOptions::MatchesFilter(test_case_name,\n                                                   kDisableTestFilter) ||\n          internal::UnitTestOptions::MatchesFilter(test_name,\n                                                   kDisableTestFilter);\n      test_info->is_disabled_ = is_disabled;\n\n      const bool matches_filter =\n          internal::UnitTestOptions::FilterMatchesTest(test_case_name,\n                                                       test_name);\n      test_info->matches_filter_ = matches_filter;\n\n      const bool is_runnable =\n          (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&\n          matches_filter;\n\n      const bool is_in_another_shard =\n          shard_tests != IGNORE_SHARDING_PROTOCOL &&\n          !ShouldRunTestOnShard(total_shards, shard_index, num_runnable_tests);\n      test_info->is_in_another_shard_ = is_in_another_shard;\n      const bool is_selected = is_runnable && !is_in_another_shard;\n\n      num_runnable_tests += is_runnable;\n      num_selected_tests += is_selected;\n\n      test_info->should_run_ = is_selected;\n      test_case->set_should_run(test_case->should_run() || is_selected);\n    }\n  }\n  return num_selected_tests;\n}\n\n// Prints the given C-string on a single line by replacing all '\\n'\n// characters with string \"\\\\n\".  If the output takes more than\n// max_length characters, only prints the first max_length characters\n// and \"...\".\nstatic void PrintOnOneLine(const char* str, int max_length) {\n  if (str != NULL) {\n    for (int i = 0; *str != '\\0'; ++str) {\n      if (i >= max_length) {\n        printf(\"...\");\n        break;\n      }\n      if (*str == '\\n') {\n        printf(\"\\\\n\");\n        i += 2;\n      } else {\n        printf(\"%c\", *str);\n        ++i;\n      }\n    }\n  }\n}\n\n// Prints the names of the tests matching the user-specified filter flag.\nvoid UnitTestImpl::ListTestsMatchingFilter() {\n  // Print at most this many characters for each type/value parameter.\n  const int kMaxParamLength = 250;\n\n  for (size_t i = 0; i < test_cases_.size(); i++) {\n    const TestCase* const test_case = test_cases_[i];\n    bool printed_test_case_name = false;\n\n    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {\n      const TestInfo* const test_info =\n          test_case->test_info_list()[j];\n      if (test_info->matches_filter_) {\n        if (!printed_test_case_name) {\n          printed_test_case_name = true;\n          printf(\"%s.\", test_case->name());\n          if (test_case->type_param() != NULL) {\n            printf(\"  # %s = \", kTypeParamLabel);\n            // We print the type parameter on a single line to make\n            // the output easy to parse by a program.\n            PrintOnOneLine(test_case->type_param(), kMaxParamLength);\n          }\n          printf(\"\\n\");\n        }\n        printf(\"  %s\", test_info->name());\n        if (test_info->value_param() != NULL) {\n          printf(\"  # %s = \", kValueParamLabel);\n          // We print the value parameter on a single line to make the\n          // output easy to parse by a program.\n          PrintOnOneLine(test_info->value_param(), kMaxParamLength);\n        }\n        printf(\"\\n\");\n      }\n    }\n  }\n  fflush(stdout);\n  const std::string& output_format = UnitTestOptions::GetOutputFormat();\n  if (output_format == \"xml\" || output_format == \"json\") {\n    FILE* fileout = OpenFileForWriting(\n        UnitTestOptions::GetAbsolutePathToOutputFile().c_str());\n    std::stringstream stream;\n    if (output_format == \"xml\") {\n      XmlUnitTestResultPrinter(\n          UnitTestOptions::GetAbsolutePathToOutputFile().c_str())\n          .PrintXmlTestsList(&stream, test_cases_);\n    } else if (output_format == \"json\") {\n      JsonUnitTestResultPrinter(\n          UnitTestOptions::GetAbsolutePathToOutputFile().c_str())\n          .PrintJsonTestList(&stream, test_cases_);\n    }\n    fprintf(fileout, \"%s\", StringStreamToString(&stream).c_str());\n    fclose(fileout);\n  }\n}\n\n// Sets the OS stack trace getter.\n//\n// Does nothing if the input and the current OS stack trace getter are\n// the same; otherwise, deletes the old getter and makes the input the\n// current getter.\nvoid UnitTestImpl::set_os_stack_trace_getter(\n    OsStackTraceGetterInterface* getter) {\n  if (os_stack_trace_getter_ != getter) {\n    delete os_stack_trace_getter_;\n    os_stack_trace_getter_ = getter;\n  }\n}\n\n// Returns the current OS stack trace getter if it is not NULL;\n// otherwise, creates an OsStackTraceGetter, makes it the current\n// getter, and returns it.\nOsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {\n  if (os_stack_trace_getter_ == NULL) {\n#ifdef GTEST_OS_STACK_TRACE_GETTER_\n    os_stack_trace_getter_ = new GTEST_OS_STACK_TRACE_GETTER_;\n#else\n    os_stack_trace_getter_ = new OsStackTraceGetter;\n#endif  // GTEST_OS_STACK_TRACE_GETTER_\n  }\n\n  return os_stack_trace_getter_;\n}\n\n// Returns the most specific TestResult currently running.\nTestResult* UnitTestImpl::current_test_result() {\n  if (current_test_info_ != NULL) {\n    return &current_test_info_->result_;\n  }\n  if (current_test_case_ != NULL) {\n    return &current_test_case_->ad_hoc_test_result_;\n  }\n  return &ad_hoc_test_result_;\n}\n\n// Shuffles all test cases, and the tests within each test case,\n// making sure that death tests are still run first.\nvoid UnitTestImpl::ShuffleTests() {\n  // Shuffles the death test cases.\n  ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);\n\n  // Shuffles the non-death test cases.\n  ShuffleRange(random(), last_death_test_case_ + 1,\n               static_cast<int>(test_cases_.size()), &test_case_indices_);\n\n  // Shuffles the tests inside each test case.\n  for (size_t i = 0; i < test_cases_.size(); i++) {\n    test_cases_[i]->ShuffleTests(random());\n  }\n}\n\n// Restores the test cases and tests to their order before the first shuffle.\nvoid UnitTestImpl::UnshuffleTests() {\n  for (size_t i = 0; i < test_cases_.size(); i++) {\n    // Unshuffles the tests in each test case.\n    test_cases_[i]->UnshuffleTests();\n    // Resets the index of each test case.\n    test_case_indices_[i] = static_cast<int>(i);\n  }\n}\n\n// Returns the current OS stack trace as an std::string.\n//\n// The maximum number of stack frames to be included is specified by\n// the gtest_stack_trace_depth flag.  The skip_count parameter\n// specifies the number of top frames to be skipped, which doesn't\n// count against the number of frames to be included.\n//\n// For example, if Foo() calls Bar(), which in turn calls\n// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in\n// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.\nstd::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,\n                                            int skip_count) {\n  // We pass skip_count + 1 to skip this wrapper function in addition\n  // to what the user really wants to skip.\n  return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);\n}\n\n// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to\n// suppress unreachable code warnings.\nnamespace {\nclass ClassUniqueToAlwaysTrue {};\n}\n\nbool IsTrue(bool condition) { return condition; }\n\nbool AlwaysTrue() {\n#if GTEST_HAS_EXCEPTIONS\n  // This condition is always false so AlwaysTrue() never actually throws,\n  // but it makes the compiler think that it may throw.\n  if (IsTrue(false))\n    throw ClassUniqueToAlwaysTrue();\n#endif  // GTEST_HAS_EXCEPTIONS\n  return true;\n}\n\n// If *pstr starts with the given prefix, modifies *pstr to be right\n// past the prefix and returns true; otherwise leaves *pstr unchanged\n// and returns false.  None of pstr, *pstr, and prefix can be NULL.\nbool SkipPrefix(const char* prefix, const char** pstr) {\n  const size_t prefix_len = strlen(prefix);\n  if (strncmp(*pstr, prefix, prefix_len) == 0) {\n    *pstr += prefix_len;\n    return true;\n  }\n  return false;\n}\n\n// Parses a string as a command line flag.  The string should have\n// the format \"--flag=value\".  When def_optional is true, the \"=value\"\n// part can be omitted.\n//\n// Returns the value of the flag, or NULL if the parsing failed.\nstatic const char* ParseFlagValue(const char* str, const char* flag,\n                                  bool def_optional) {\n  // str and flag must not be NULL.\n  if (str == NULL || flag == NULL) return NULL;\n\n  // The flag must start with \"--\" followed by GTEST_FLAG_PREFIX_.\n  const std::string flag_str = std::string(\"--\") + GTEST_FLAG_PREFIX_ + flag;\n  const size_t flag_len = flag_str.length();\n  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;\n\n  // Skips the flag name.\n  const char* flag_end = str + flag_len;\n\n  // When def_optional is true, it's OK to not have a \"=value\" part.\n  if (def_optional && (flag_end[0] == '\\0')) {\n    return flag_end;\n  }\n\n  // If def_optional is true and there are more characters after the\n  // flag name, or if def_optional is false, there must be a '=' after\n  // the flag name.\n  if (flag_end[0] != '=') return NULL;\n\n  // Returns the string after \"=\".\n  return flag_end + 1;\n}\n\n// Parses a string for a bool flag, in the form of either\n// \"--flag=value\" or \"--flag\".\n//\n// In the former case, the value is taken as true as long as it does\n// not start with '0', 'f', or 'F'.\n//\n// In the latter case, the value is taken as true.\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\nstatic bool ParseBoolFlag(const char* str, const char* flag, bool* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseFlagValue(str, flag, true);\n\n  // Aborts if the parsing failed.\n  if (value_str == NULL) return false;\n\n  // Converts the string value to a bool.\n  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');\n  return true;\n}\n\n// Parses a string for an Int32 flag, in the form of\n// \"--flag=value\".\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\nbool ParseInt32Flag(const char* str, const char* flag, Int32* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseFlagValue(str, flag, false);\n\n  // Aborts if the parsing failed.\n  if (value_str == NULL) return false;\n\n  // Sets *value to the value of the flag.\n  return ParseInt32(Message() << \"The value of flag --\" << flag,\n                    value_str, value);\n}\n\n// Parses a string for a string flag, in the form of\n// \"--flag=value\".\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\ntemplate <typename String>\nstatic bool ParseStringFlag(const char* str, const char* flag, String* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseFlagValue(str, flag, false);\n\n  // Aborts if the parsing failed.\n  if (value_str == NULL) return false;\n\n  // Sets *value to the value of the flag.\n  *value = value_str;\n  return true;\n}\n\n// Determines whether a string has a prefix that Google Test uses for its\n// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.\n// If Google Test detects that a command line flag has its prefix but is not\n// recognized, it will print its help message. Flags starting with\n// GTEST_INTERNAL_PREFIX_ followed by \"internal_\" are considered Google Test\n// internal flags and do not trigger the help message.\nstatic bool HasGoogleTestFlagPrefix(const char* str) {\n  return (SkipPrefix(\"--\", &str) ||\n          SkipPrefix(\"-\", &str) ||\n          SkipPrefix(\"/\", &str)) &&\n         !SkipPrefix(GTEST_FLAG_PREFIX_ \"internal_\", &str) &&\n         (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||\n          SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));\n}\n\n// Prints a string containing code-encoded text.  The following escape\n// sequences can be used in the string to control the text color:\n//\n//   @@    prints a single '@' character.\n//   @R    changes the color to red.\n//   @G    changes the color to green.\n//   @Y    changes the color to yellow.\n//   @D    changes to the default terminal text color.\n//\n// FIXME: Write tests for this once we add stdout\n// capturing to Google Test.\nstatic void PrintColorEncoded(const char* str) {\n  GTestColor color = COLOR_DEFAULT;  // The current color.\n\n  // Conceptually, we split the string into segments divided by escape\n  // sequences.  Then we print one segment at a time.  At the end of\n  // each iteration, the str pointer advances to the beginning of the\n  // next segment.\n  for (;;) {\n    const char* p = strchr(str, '@');\n    if (p == NULL) {\n      ColoredPrintf(color, \"%s\", str);\n      return;\n    }\n\n    ColoredPrintf(color, \"%s\", std::string(str, p).c_str());\n\n    const char ch = p[1];\n    str = p + 2;\n    if (ch == '@') {\n      ColoredPrintf(color, \"@\");\n    } else if (ch == 'D') {\n      color = COLOR_DEFAULT;\n    } else if (ch == 'R') {\n      color = COLOR_RED;\n    } else if (ch == 'G') {\n      color = COLOR_GREEN;\n    } else if (ch == 'Y') {\n      color = COLOR_YELLOW;\n    } else {\n      --str;\n    }\n  }\n}\n\nstatic const char kColorEncodedHelpMessage[] =\n\"This program contains tests written using \" GTEST_NAME_ \". You can use the\\n\"\n\"following command line flags to control its behavior:\\n\"\n\"\\n\"\n\"Test Selection:\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"list_tests@D\\n\"\n\"      List the names of all tests instead of running them. The name of\\n\"\n\"      TEST(Foo, Bar) is \\\"Foo.Bar\\\".\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"filter=@YPOSTIVE_PATTERNS\"\n    \"[@G-@YNEGATIVE_PATTERNS]@D\\n\"\n\"      Run only the tests whose name matches one of the positive patterns but\\n\"\n\"      none of the negative patterns. '?' matches any single character; '*'\\n\"\n\"      matches any substring; ':' separates two patterns.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"also_run_disabled_tests@D\\n\"\n\"      Run all disabled tests too.\\n\"\n\"\\n\"\n\"Test Execution:\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"repeat=@Y[COUNT]@D\\n\"\n\"      Run the tests repeatedly; use a negative count to repeat forever.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"shuffle@D\\n\"\n\"      Randomize tests' orders on every iteration.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"random_seed=@Y[NUMBER]@D\\n\"\n\"      Random number seed to use for shuffling test orders (between 1 and\\n\"\n\"      99999, or 0 to use a seed based on the current time).\\n\"\n\"\\n\"\n\"Test Output:\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\\n\"\n\"      Enable/disable colored output. The default is @Gauto@D.\\n\"\n\"  -@G-\" GTEST_FLAG_PREFIX_ \"print_time=0@D\\n\"\n\"      Don't print the elapsed time of each test.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"output=@Y(@Gjson@Y|@Gxml@Y)[@G:@YDIRECTORY_PATH@G\"\n    GTEST_PATH_SEP_ \"@Y|@G:@YFILE_PATH]@D\\n\"\n\"      Generate a JSON or XML report in the given directory or with the given\\n\"\n\"      file name. @YFILE_PATH@D defaults to @Gtest_details.xml@D.\\n\"\n# if GTEST_CAN_STREAM_RESULTS_\n\"  @G--\" GTEST_FLAG_PREFIX_ \"stream_result_to=@YHOST@G:@YPORT@D\\n\"\n\"      Stream test results to the given server.\\n\"\n# endif  // GTEST_CAN_STREAM_RESULTS_\n\"\\n\"\n\"Assertion Behavior:\\n\"\n# if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS\n\"  @G--\" GTEST_FLAG_PREFIX_ \"death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\\n\"\n\"      Set the default death test style.\\n\"\n# endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS\n\"  @G--\" GTEST_FLAG_PREFIX_ \"break_on_failure@D\\n\"\n\"      Turn assertion failures into debugger break-points.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"throw_on_failure@D\\n\"\n\"      Turn assertion failures into C++ exceptions for use by an external\\n\"\n\"      test framework.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"catch_exceptions=0@D\\n\"\n\"      Do not report exceptions as test failures. Instead, allow them\\n\"\n\"      to crash the program or throw a pop-up (on Windows).\\n\"\n\"\\n\"\n\"Except for @G--\" GTEST_FLAG_PREFIX_ \"list_tests@D, you can alternatively set \"\n    \"the corresponding\\n\"\n\"environment variable of a flag (all letters in upper-case). For example, to\\n\"\n\"disable colored text output, you can either specify @G--\" GTEST_FLAG_PREFIX_\n    \"color=no@D or set\\n\"\n\"the @G\" GTEST_FLAG_PREFIX_UPPER_ \"COLOR@D environment variable to @Gno@D.\\n\"\n\"\\n\"\n\"For more information, please read the \" GTEST_NAME_ \" documentation at\\n\"\n\"@G\" GTEST_PROJECT_URL_ \"@D. If you find a bug in \" GTEST_NAME_ \"\\n\"\n\"(not one in your own code or tests), please report it to\\n\"\n\"@G<\" GTEST_DEV_EMAIL_ \">@D.\\n\";\n\nstatic bool ParseGoogleTestFlag(const char* const arg) {\n  return ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,\n                       &GTEST_FLAG(also_run_disabled_tests)) ||\n      ParseBoolFlag(arg, kBreakOnFailureFlag,\n                    &GTEST_FLAG(break_on_failure)) ||\n      ParseBoolFlag(arg, kCatchExceptionsFlag,\n                    &GTEST_FLAG(catch_exceptions)) ||\n      ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||\n      ParseStringFlag(arg, kDeathTestStyleFlag,\n                      &GTEST_FLAG(death_test_style)) ||\n      ParseBoolFlag(arg, kDeathTestUseFork,\n                    &GTEST_FLAG(death_test_use_fork)) ||\n      ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||\n      ParseStringFlag(arg, kInternalRunDeathTestFlag,\n                      &GTEST_FLAG(internal_run_death_test)) ||\n      ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||\n      ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||\n      ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||\n      ParseBoolFlag(arg, kPrintUTF8Flag, &GTEST_FLAG(print_utf8)) ||\n      ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||\n      ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||\n      ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||\n      ParseInt32Flag(arg, kStackTraceDepthFlag,\n                     &GTEST_FLAG(stack_trace_depth)) ||\n      ParseStringFlag(arg, kStreamResultToFlag,\n                      &GTEST_FLAG(stream_result_to)) ||\n      ParseBoolFlag(arg, kThrowOnFailureFlag,\n                    &GTEST_FLAG(throw_on_failure));\n}\n\n#if GTEST_USE_OWN_FLAGFILE_FLAG_\nstatic void LoadFlagsFromFile(const std::string& path) {\n  FILE* flagfile = posix::FOpen(path.c_str(), \"r\");\n  if (!flagfile) {\n    GTEST_LOG_(FATAL) << \"Unable to open file \\\"\" << GTEST_FLAG(flagfile)\n                      << \"\\\"\";\n  }\n  std::string contents(ReadEntireFile(flagfile));\n  posix::FClose(flagfile);\n  std::vector<std::string> lines;\n  SplitString(contents, '\\n', &lines);\n  for (size_t i = 0; i < lines.size(); ++i) {\n    if (lines[i].empty())\n      continue;\n    if (!ParseGoogleTestFlag(lines[i].c_str()))\n      g_help_flag = true;\n  }\n}\n#endif  // GTEST_USE_OWN_FLAGFILE_FLAG_\n\n// Parses the command line for Google Test flags, without initializing\n// other parts of Google Test.  The type parameter CharType can be\n// instantiated to either char or wchar_t.\ntemplate <typename CharType>\nvoid ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {\n  for (int i = 1; i < *argc; i++) {\n    const std::string arg_string = StreamableToString(argv[i]);\n    const char* const arg = arg_string.c_str();\n\n    using internal::ParseBoolFlag;\n    using internal::ParseInt32Flag;\n    using internal::ParseStringFlag;\n\n    bool remove_flag = false;\n    if (ParseGoogleTestFlag(arg)) {\n      remove_flag = true;\n#if GTEST_USE_OWN_FLAGFILE_FLAG_\n    } else if (ParseStringFlag(arg, kFlagfileFlag, &GTEST_FLAG(flagfile))) {\n      LoadFlagsFromFile(GTEST_FLAG(flagfile));\n      remove_flag = true;\n#endif  // GTEST_USE_OWN_FLAGFILE_FLAG_\n    } else if (arg_string == \"--help\" || arg_string == \"-h\" ||\n               arg_string == \"-?\" || arg_string == \"/?\" ||\n               HasGoogleTestFlagPrefix(arg)) {\n      // Both help flag and unrecognized Google Test flags (excluding\n      // internal ones) trigger help display.\n      g_help_flag = true;\n    }\n\n    if (remove_flag) {\n      // Shift the remainder of the argv list left by one.  Note\n      // that argv has (*argc + 1) elements, the last one always being\n      // NULL.  The following loop moves the trailing NULL element as\n      // well.\n      for (int j = i; j != *argc; j++) {\n        argv[j] = argv[j + 1];\n      }\n\n      // Decrements the argument count.\n      (*argc)--;\n\n      // We also need to decrement the iterator as we just removed\n      // an element.\n      i--;\n    }\n  }\n\n  if (g_help_flag) {\n    // We print the help here instead of in RUN_ALL_TESTS(), as the\n    // latter may not be called at all if the user is using Google\n    // Test with another testing framework.\n    PrintColorEncoded(kColorEncodedHelpMessage);\n  }\n}\n\n// Parses the command line for Google Test flags, without initializing\n// other parts of Google Test.\nvoid ParseGoogleTestFlagsOnly(int* argc, char** argv) {\n  ParseGoogleTestFlagsOnlyImpl(argc, argv);\n\n  // Fix the value of *_NSGetArgc() on macOS, but iff\n  // *_NSGetArgv() == argv\n  // Only applicable to char** version of argv\n#if GTEST_OS_MAC\n#ifndef GTEST_OS_IOS\n  if (*_NSGetArgv() == argv) {\n    *_NSGetArgc() = *argc;\n  }\n#endif\n#endif\n}\nvoid ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {\n  ParseGoogleTestFlagsOnlyImpl(argc, argv);\n}\n\n// The internal implementation of InitGoogleTest().\n//\n// The type parameter CharType can be instantiated to either char or\n// wchar_t.\ntemplate <typename CharType>\nvoid InitGoogleTestImpl(int* argc, CharType** argv) {\n  // We don't want to run the initialization code twice.\n  if (GTestIsInitialized()) return;\n\n  if (*argc <= 0) return;\n\n  g_argvs.clear();\n  for (int i = 0; i != *argc; i++) {\n    g_argvs.push_back(StreamableToString(argv[i]));\n  }\n\n#if GTEST_HAS_ABSL\n  absl::InitializeSymbolizer(g_argvs[0].c_str());\n#endif  // GTEST_HAS_ABSL\n\n  ParseGoogleTestFlagsOnly(argc, argv);\n  GetUnitTestImpl()->PostFlagParsingInit();\n}\n\n}  // namespace internal\n\n// Initializes Google Test.  This must be called before calling\n// RUN_ALL_TESTS().  In particular, it parses a command line for the\n// flags that Google Test recognizes.  Whenever a Google Test flag is\n// seen, it is removed from argv, and *argc is decremented.\n//\n// No value is returned.  Instead, the Google Test flag variables are\n// updated.\n//\n// Calling the function for the second time has no user-visible effect.\nvoid InitGoogleTest(int* argc, char** argv) {\n#if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n  GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(argc, argv);\n#else  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n  internal::InitGoogleTestImpl(argc, argv);\n#endif  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n}\n\n// This overloaded version can be used in Windows programs compiled in\n// UNICODE mode.\nvoid InitGoogleTest(int* argc, wchar_t** argv) {\n#if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n  GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(argc, argv);\n#else  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n  internal::InitGoogleTestImpl(argc, argv);\n#endif  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)\n}\n\nstd::string TempDir() {\n#if defined(GTEST_CUSTOM_TEMPDIR_FUNCTION_)\n  return GTEST_CUSTOM_TEMPDIR_FUNCTION_();\n#endif\n\n#if GTEST_OS_WINDOWS_MOBILE\n  return \"\\\\temp\\\\\";\n#elif GTEST_OS_WINDOWS\n  const char* temp_dir = internal::posix::GetEnv(\"TEMP\");\n  if (temp_dir == NULL || temp_dir[0] == '\\0')\n    return \"\\\\temp\\\\\";\n  else if (temp_dir[strlen(temp_dir) - 1] == '\\\\')\n    return temp_dir;\n  else\n    return std::string(temp_dir) + \"\\\\\";\n#elif GTEST_OS_LINUX_ANDROID\n  return \"/sdcard/\";\n#else\n  return \"/tmp/\";\n#endif  // GTEST_OS_WINDOWS_MOBILE\n}\n\n// Class ScopedTrace\n\n// Pushes the given source file location and message onto a per-thread\n// trace stack maintained by Google Test.\nvoid ScopedTrace::PushTrace(const char* file, int line, std::string message) {\n  internal::TraceInfo trace;\n  trace.file = file;\n  trace.line = line;\n  trace.message.swap(message);\n\n  UnitTest::GetInstance()->PushGTestTrace(trace);\n}\n\n// Pops the info pushed by the c'tor.\nScopedTrace::~ScopedTrace()\n    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {\n  UnitTest::GetInstance()->PopGTestTrace();\n}\n\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/src/gtest_main.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <stdio.h>\n#include \"gtest/gtest.h\"\n\nGTEST_API_ int main(int argc, char **argv) {\n  printf(\"Running main() from %s\\n\", __FILE__);\n  testing::InitGoogleTest(&argc, argv);\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/BUILD.bazel",
    "content": "# Copyright 2017 Google Inc.\n# All Rights Reserved.\n#\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n# Author: misterg@google.com (Gennadiy Civil)\n#\n# Bazel BUILD for The Google C++ Testing Framework (Google Test)\n\nlicenses([\"notice\"])\n\nconfig_setting(\n    name = \"windows\",\n    values = {\"cpu\": \"x64_windows\"},\n)\n\nconfig_setting(\n    name = \"windows_msvc\",\n    values = {\"cpu\": \"x64_windows_msvc\"},\n)\n\nconfig_setting(\n    name = \"has_absl\",\n    values = {\"define\": \"absl=1\"},\n)\n\n#on windows exclude gtest-tuple.h and googletest-tuple-test.cc\ncc_test(\n    name = \"gtest_all_test\",\n    size = \"small\",\n    srcs = glob(\n        include = [\n            \"gtest-*.cc\",\n            \"googletest-*.cc\",\n            \"*.h\",\n            \"googletest/include/gtest/**/*.h\",\n        ],\n        exclude = [\n            \"gtest-unittest-api_test.cc\",\n            \"googletest-tuple-test.cc\",\n            \"googletest/src/gtest-all.cc\",\n            \"gtest_all_test.cc\",\n            \"gtest-death-test_ex_test.cc\",\n            \"gtest-listener_test.cc\",\n            \"gtest-unittest-api_test.cc\",\n            \"googletest-param-test-test.cc\",\n            \"googletest-catch-exceptions-test_.cc\",\n            \"googletest-color-test_.cc\",\n            \"googletest-env-var-test_.cc\",\n            \"googletest-filter-unittest_.cc\",\n            \"googletest-break-on-failure-unittest_.cc\",\n             \"googletest-listener-test.cc\",\n             \"googletest-output-test_.cc\",\n             \"googletest-list-tests-unittest_.cc\",\n             \"googletest-shuffle-test_.cc\",\n             \"googletest-uninitialized-test_.cc\",\n             \"googletest-death-test_ex_test.cc\",\n             \"googletest-param-test-test\",\n             \"googletest-throw-on-failure-test_.cc\",\n             \"googletest-param-test-invalid-name1-test_.cc\",\n             \"googletest-param-test-invalid-name2-test_.cc\",\n\n        ],\n    ) + select({\n        \"//:windows\": [],\n        \"//:windows_msvc\": [],\n        \"//conditions:default\": [\n            \"googletest-tuple-test.cc\",\n        ],\n    }),\n    copts = select({\n        \"//:windows\": [\"-DGTEST_USE_OWN_TR1_TUPLE=0\"],\n        \"//:windows_msvc\": [\"-DGTEST_USE_OWN_TR1_TUPLE=0\"],\n        \"//conditions:default\": [\"-DGTEST_USE_OWN_TR1_TUPLE=1\"],\n    }),\n    includes = [\n        \"googletest\",\n        \"googletest/include\",\n        \"googletest/include/internal\",\n        \"googletest/test\",\n    ],\n    linkopts = select({\n        \"//:windows\": [],\n        \"//:windows_msvc\": [],\n        \"//conditions:default\": [\n            \"-pthread\",\n        ],\n    }),\n    deps = [\"//:gtest_main\"],\n)\n\n\n# Tests death tests.\ncc_test(\n    name = \"googletest-death-test-test\",\n    size = \"medium\",\n    srcs = [\"googletest-death-test-test.cc\"],\n    deps = [\"//:gtest_main\"],\n)\n\ncc_test(\n    name = \"gtest_test_macro_stack_footprint_test\",\n    size = \"small\",\n    srcs = [\"gtest_test_macro_stack_footprint_test.cc\"],\n    deps = [\"//:gtest\"],\n)\n\n#These googletest tests have their own main()\ncc_test(\n    name = \"googletest-listener-test\",\n    size = \"small\",\n    srcs = [\"googletest-listener-test.cc\"],\n    deps = [\"//:gtest_main\"],\n)\n\ncc_test(\n    name = \"gtest-unittest-api_test\",\n    size = \"small\",\n    srcs = [\n        \"gtest-unittest-api_test.cc\",\n    ],\n    deps = [\n        \"//:gtest\",\n    ],\n)\n\ncc_test(\n    name = \"googletest-param-test-test\",\n    size = \"small\",\n    srcs = [\n        \"googletest-param-test-test.cc\",\n        \"googletest-param-test-test.h\",\n        \"googletest-param-test2-test.cc\",\n    ],\n    deps = [\"//:gtest\"],\n)\n\ncc_test(\n    name = \"gtest_unittest\",\n    size = \"small\",\n    srcs = [\"gtest_unittest.cc\"],\n    args = [\"--heap_check=strict\"],\n    shard_count = 2,\n    deps = [\"//:gtest_main\"],\n)\n\n#  Py tests\n\npy_library(\n    name = \"gtest_test_utils\",\n    testonly = 1,\n    srcs = [\"gtest_test_utils.py\"],\n)\n\ncc_binary(\n    name = \"gtest_help_test_\",\n    testonly = 1,\n    srcs = [\"gtest_help_test_.cc\"],\n    deps = [\"//:gtest_main\"],\n)\n\npy_test(\n    name = \"gtest_help_test\",\n    size = \"small\",\n    srcs = [\"gtest_help_test.py\"],\n    data = [\":gtest_help_test_\"],\n    deps = [\":gtest_test_utils\"],\n)\n\ncc_binary(\n    name = \"googletest-output-test_\",\n    testonly = 1,\n    srcs = [\"googletest-output-test_.cc\"],\n    deps = [\"//:gtest\"],\n)\n\n\npy_test(\n    name = \"googletest-output-test\",\n    size = \"small\",\n    srcs = [\"googletest-output-test.py\"],\n    args = select({\n        \":has_absl\": [],\n        \"//conditions:default\": [\"--no_stacktrace_support\"],\n    }),\n    data = [\n        \"googletest-output-test-golden-lin.txt\",\n        \":googletest-output-test_\",\n    ],\n    deps = [\":gtest_test_utils\"],\n)\n\ncc_binary(\n    name = \"googletest-color-test_\",\n    testonly = 1,\n    srcs = [\"googletest-color-test_.cc\"],\n    deps = [\"//:gtest\"],\n)\n\npy_test(\n    name = \"googletest-color-test\",\n    size = \"small\",\n    srcs = [\"googletest-color-test.py\"],\n    data = [\":googletest-color-test_\"],\n    deps = [\":gtest_test_utils\"],\n)\n\ncc_binary(\n    name = \"googletest-env-var-test_\",\n    testonly = 1,\n    srcs = [\"googletest-env-var-test_.cc\"],\n    deps = [\"//:gtest\"],\n)\n\npy_test(\n    name = \"googletest-env-var-test\",\n    size = \"medium\",\n    srcs = [\"googletest-env-var-test.py\"],\n    data = [\":googletest-env-var-test_\"],\n    deps = [\":gtest_test_utils\"],\n)\n\ncc_binary(\n    name = \"googletest-filter-unittest_\",\n    testonly = 1,\n    srcs = [\"googletest-filter-unittest_.cc\"],\n    deps = [\"//:gtest\"],\n)\n\npy_test(\n    name = \"googletest-filter-unittest\",\n    size = \"medium\",\n    srcs = [\"googletest-filter-unittest.py\"],\n    data = [\":googletest-filter-unittest_\"],\n    deps = [\":gtest_test_utils\"],\n)\n\n\ncc_binary(\n    name = \"googletest-break-on-failure-unittest_\",\n    testonly = 1,\n    srcs = [\"googletest-break-on-failure-unittest_.cc\"],\n    deps = [\"//:gtest\"],\n)\n\n\n\npy_test(\n    name = \"googletest-break-on-failure-unittest\",\n    size = \"small\",\n    srcs = [\"googletest-break-on-failure-unittest.py\"],\n    data = [\":googletest-break-on-failure-unittest_\"],\n    deps = [\":gtest_test_utils\"],\n)\n\n\ncc_test(\n    name = \"gtest_assert_by_exception_test\",\n    size = \"small\",\n    srcs = [\"gtest_assert_by_exception_test.cc\"],\n    deps = [\"//:gtest\"],\n)\n\n\n\ncc_binary(\n    name = \"googletest-throw-on-failure-test_\",\n    testonly = 1,\n    srcs = [\"googletest-throw-on-failure-test_.cc\"],\n    deps = [\"//:gtest\"],\n)\n\npy_test(\n    name = \"googletest-throw-on-failure-test\",\n    size = \"small\",\n    srcs = [\"googletest-throw-on-failure-test.py\"],\n    data = [\":googletest-throw-on-failure-test_\"],\n    deps = [\":gtest_test_utils\"],\n)\n\n\ncc_binary(\n    name = \"googletest-list-tests-unittest_\",\n    testonly = 1,\n    srcs = [\"googletest-list-tests-unittest_.cc\"],\n    deps = [\"//:gtest\"],\n)\n\npy_test(\n    name = \"googletest-list-tests-unittest\",\n    size = \"small\",\n    srcs = [\"googletest-list-tests-unittest.py\"],\n    data = [\":googletest-list-tests-unittest_\"],\n    deps = [\":gtest_test_utils\"],\n)\n\ncc_binary(\n    name = \"googletest-shuffle-test_\",\n    srcs = [\"googletest-shuffle-test_.cc\"],\n    deps = [\"//:gtest\"],\n)\n\npy_test(\n    name = \"googletest-shuffle-test\",\n    size = \"small\",\n    srcs = [\"googletest-shuffle-test.py\"],\n    data = [\":googletest-shuffle-test_\"],\n    deps = [\":gtest_test_utils\"],\n)\n\ncc_binary(\n    name = \"googletest-catch-exceptions-no-ex-test_\",\n    testonly = 1,\n    srcs = [\"googletest-catch-exceptions-test_.cc\"],\n    deps = [\"//:gtest_main\"],\n)\n\ncc_binary(\n    name = \"googletest-catch-exceptions-ex-test_\",\n    testonly = 1,\n    srcs = [\"googletest-catch-exceptions-test_.cc\"],\n    copts = [\"-fexceptions\"],\n    deps = [\"//:gtest_main\"],\n)\n\npy_test(\n    name = \"googletest-catch-exceptions-test\",\n    size = \"small\",\n    srcs = [\"googletest-catch-exceptions-test.py\"],\n    data = [\n        \":googletest-catch-exceptions-ex-test_\",\n        \":googletest-catch-exceptions-no-ex-test_\",\n    ],\n    deps = [\":gtest_test_utils\"],\n)\n\ncc_binary(\n    name = \"gtest_xml_output_unittest_\",\n    testonly = 1,\n    srcs = [\"gtest_xml_output_unittest_.cc\"],\n    deps = [\"//:gtest\"],\n)\n\ncc_test(\n    name = \"gtest_no_test_unittest\",\n    size = \"small\",\n    srcs = [\"gtest_no_test_unittest.cc\"],\n    deps = [\"//:gtest\"],\n)\n\npy_test(\n    name = \"gtest_xml_output_unittest\",\n    size = \"small\",\n    srcs = [\n        \"gtest_xml_output_unittest.py\",\n        \"gtest_xml_test_utils.py\",\n    ],\n    args = select({\n        \":has_absl\": [],\n        \"//conditions:default\": [\"--no_stacktrace_support\"],\n    }),\n    data = [\n        # We invoke gtest_no_test_unittest to verify the XML output\n        # when the test program contains no test definition.\n        \":gtest_no_test_unittest\",\n        \":gtest_xml_output_unittest_\",\n    ],\n    deps = [\":gtest_test_utils\"],\n)\n\ncc_binary(\n    name = \"gtest_xml_outfile1_test_\",\n    testonly = 1,\n    srcs = [\"gtest_xml_outfile1_test_.cc\"],\n    deps = [\"//:gtest_main\"],\n)\n\ncc_binary(\n    name = \"gtest_xml_outfile2_test_\",\n    testonly = 1,\n    srcs = [\"gtest_xml_outfile2_test_.cc\"],\n    deps = [\"//:gtest_main\"],\n)\n\npy_test(\n    name = \"gtest_xml_outfiles_test\",\n    size = \"small\",\n    srcs = [\n        \"gtest_xml_outfiles_test.py\",\n        \"gtest_xml_test_utils.py\",\n    ],\n    data = [\n        \":gtest_xml_outfile1_test_\",\n        \":gtest_xml_outfile2_test_\",\n    ],\n    deps = [\":gtest_test_utils\"],\n)\n\ncc_binary(\n    name = \"googletest-uninitialized-test_\",\n    testonly = 1,\n    srcs = [\"googletest-uninitialized-test_.cc\"],\n    deps = [\"//:gtest\"],\n)\n\npy_test(\n    name = \"googletest-uninitialized-test\",\n    size = \"medium\",\n    srcs = [\"googletest-uninitialized-test.py\"],\n    data = [\"googletest-uninitialized-test_\"],\n    deps = [\":gtest_test_utils\"],\n)\n\ncc_binary(\n    name = \"gtest_testbridge_test_\",\n    testonly = 1,\n    srcs = [\"gtest_testbridge_test_.cc\"],\n    deps = [\"//:gtest_main\"],\n)\n\n# Tests that filtering via testbridge works\npy_test(\n    name = \"gtest_testbridge_test\",\n    size = \"small\",\n    srcs = [\"gtest_testbridge_test.py\"],\n    data = [\":gtest_testbridge_test_\"],\n    deps = [\":gtest_test_utils\"],\n)\n\n\npy_test(\n    name = \"googletest-json-outfiles-test\",\n    size = \"small\",\n    srcs = [\n        \"googletest-json-outfiles-test.py\",\n        \"gtest_json_test_utils.py\",\n    ],\n    data = [\n        \":gtest_xml_outfile1_test_\",\n        \":gtest_xml_outfile2_test_\",\n    ],\n    deps = [\":gtest_test_utils\"],\n)\n\npy_test(\n    name = \"googletest-json-output-unittest\",\n    size = \"medium\",\n    srcs = [\n        \"googletest-json-output-unittest.py\",\n        \"gtest_json_test_utils.py\",\n    ],\n    data = [\n        # We invoke gtest_no_test_unittest to verify the JSON output\n        # when the test program contains no test definition.\n        \":gtest_no_test_unittest\",\n        \":gtest_xml_output_unittest_\",\n    ],\n    args = select({\n        \":has_absl\": [],\n        \"//conditions:default\": [\"--no_stacktrace_support\"],\n    }),\n    deps = [\":gtest_test_utils\"],\n)\n# Verifies interaction of death tests and exceptions.\ncc_test(\n    name = \"googletest-death-test_ex_catch_test\",\n    size = \"medium\",\n    srcs = [\"googletest-death-test_ex_test.cc\"],\n    copts = [\"-fexceptions\"],\n    defines = [\"GTEST_ENABLE_CATCH_EXCEPTIONS_=1\"],\n    deps = [\"//:gtest\"],\n)\n\ncc_binary(\n    name = \"googletest-param-test-invalid-name1-test_\",\n    testonly = 1,\n    srcs = [\"googletest-param-test-invalid-name1-test_.cc\"],\n    deps = [\"//:gtest\"],\n)\n\ncc_binary(\n    name = \"googletest-param-test-invalid-name2-test_\",\n    testonly = 1,\n    srcs = [\"googletest-param-test-invalid-name2-test_.cc\"],\n    deps = [\"//:gtest\"],\n)\n\npy_test(\n    name = \"googletest-param-test-invalid-name1-test\",\n    size = \"small\",\n    srcs = [\"googletest-param-test-invalid-name1-test.py\"],\n    data = [\":googletest-param-test-invalid-name1-test_\"],\n    deps = [\":gtest_test_utils\"],\n)\n\npy_test(\n    name = \"googletest-param-test-invalid-name2-test\",\n    size = \"small\",\n    srcs = [\"googletest-param-test-invalid-name2-test.py\"],\n    data = [\":googletest-param-test-invalid-name2-test_\"],\n    deps = [\":gtest_test_utils\"],\n)\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-break-on-failure-unittest.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test for Google Test's break-on-failure mode.\n\nA user can ask Google Test to seg-fault when an assertion fails, using\neither the GTEST_BREAK_ON_FAILURE environment variable or the\n--gtest_break_on_failure flag.  This script tests such functionality\nby invoking googletest-break-on-failure-unittest_ (a program written with\nGoogle Test) with different environments and command line flags.\n\"\"\"\n\nimport os\nimport gtest_test_utils\n\n# Constants.\n\nIS_WINDOWS = os.name == 'nt'\n\n# The environment variable for enabling/disabling the break-on-failure mode.\nBREAK_ON_FAILURE_ENV_VAR = 'GTEST_BREAK_ON_FAILURE'\n\n# The command line flag for enabling/disabling the break-on-failure mode.\nBREAK_ON_FAILURE_FLAG = 'gtest_break_on_failure'\n\n# The environment variable for enabling/disabling the throw-on-failure mode.\nTHROW_ON_FAILURE_ENV_VAR = 'GTEST_THROW_ON_FAILURE'\n\n# The environment variable for enabling/disabling the catch-exceptions mode.\nCATCH_EXCEPTIONS_ENV_VAR = 'GTEST_CATCH_EXCEPTIONS'\n\n# Path to the googletest-break-on-failure-unittest_ program.\nEXE_PATH = gtest_test_utils.GetTestExecutablePath(\n    'googletest-break-on-failure-unittest_')\n\n\nenviron = gtest_test_utils.environ\nSetEnvVar = gtest_test_utils.SetEnvVar\n\n# Tests in this file run a Google-Test-based test program and expect it\n# to terminate prematurely.  Therefore they are incompatible with\n# the premature-exit-file protocol by design.  Unset the\n# premature-exit filepath to prevent Google Test from creating\n# the file.\nSetEnvVar(gtest_test_utils.PREMATURE_EXIT_FILE_ENV_VAR, None)\n\n\ndef Run(command):\n  \"\"\"Runs a command; returns 1 if it was killed by a signal, or 0 otherwise.\"\"\"\n\n  p = gtest_test_utils.Subprocess(command, env=environ)\n  if p.terminated_by_signal:\n    return 1\n  else:\n    return 0\n\n\n# The tests.\n\n\nclass GTestBreakOnFailureUnitTest(gtest_test_utils.TestCase):\n  \"\"\"Tests using the GTEST_BREAK_ON_FAILURE environment variable or\n  the --gtest_break_on_failure flag to turn assertion failures into\n  segmentation faults.\n  \"\"\"\n\n  def RunAndVerify(self, env_var_value, flag_value, expect_seg_fault):\n    \"\"\"Runs googletest-break-on-failure-unittest_ and verifies that it does\n    (or does not) have a seg-fault.\n\n    Args:\n      env_var_value:    value of the GTEST_BREAK_ON_FAILURE environment\n                        variable; None if the variable should be unset.\n      flag_value:       value of the --gtest_break_on_failure flag;\n                        None if the flag should not be present.\n      expect_seg_fault: 1 if the program is expected to generate a seg-fault;\n                        0 otherwise.\n    \"\"\"\n\n    SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, env_var_value)\n\n    if env_var_value is None:\n      env_var_value_msg = ' is not set'\n    else:\n      env_var_value_msg = '=' + env_var_value\n\n    if flag_value is None:\n      flag = ''\n    elif flag_value == '0':\n      flag = '--%s=0' % BREAK_ON_FAILURE_FLAG\n    else:\n      flag = '--%s' % BREAK_ON_FAILURE_FLAG\n\n    command = [EXE_PATH]\n    if flag:\n      command.append(flag)\n\n    if expect_seg_fault:\n      should_or_not = 'should'\n    else:\n      should_or_not = 'should not'\n\n    has_seg_fault = Run(command)\n\n    SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, None)\n\n    msg = ('when %s%s, an assertion failure in \"%s\" %s cause a seg-fault.' %\n           (BREAK_ON_FAILURE_ENV_VAR, env_var_value_msg, ' '.join(command),\n            should_or_not))\n    self.assert_(has_seg_fault == expect_seg_fault, msg)\n\n  def testDefaultBehavior(self):\n    \"\"\"Tests the behavior of the default mode.\"\"\"\n\n    self.RunAndVerify(env_var_value=None,\n                      flag_value=None,\n                      expect_seg_fault=0)\n\n  def testEnvVar(self):\n    \"\"\"Tests using the GTEST_BREAK_ON_FAILURE environment variable.\"\"\"\n\n    self.RunAndVerify(env_var_value='0',\n                      flag_value=None,\n                      expect_seg_fault=0)\n    self.RunAndVerify(env_var_value='1',\n                      flag_value=None,\n                      expect_seg_fault=1)\n\n  def testFlag(self):\n    \"\"\"Tests using the --gtest_break_on_failure flag.\"\"\"\n\n    self.RunAndVerify(env_var_value=None,\n                      flag_value='0',\n                      expect_seg_fault=0)\n    self.RunAndVerify(env_var_value=None,\n                      flag_value='1',\n                      expect_seg_fault=1)\n\n  def testFlagOverridesEnvVar(self):\n    \"\"\"Tests that the flag overrides the environment variable.\"\"\"\n\n    self.RunAndVerify(env_var_value='0',\n                      flag_value='0',\n                      expect_seg_fault=0)\n    self.RunAndVerify(env_var_value='0',\n                      flag_value='1',\n                      expect_seg_fault=1)\n    self.RunAndVerify(env_var_value='1',\n                      flag_value='0',\n                      expect_seg_fault=0)\n    self.RunAndVerify(env_var_value='1',\n                      flag_value='1',\n                      expect_seg_fault=1)\n\n  def testBreakOnFailureOverridesThrowOnFailure(self):\n    \"\"\"Tests that gtest_break_on_failure overrides gtest_throw_on_failure.\"\"\"\n\n    SetEnvVar(THROW_ON_FAILURE_ENV_VAR, '1')\n    try:\n      self.RunAndVerify(env_var_value=None,\n                        flag_value='1',\n                        expect_seg_fault=1)\n    finally:\n      SetEnvVar(THROW_ON_FAILURE_ENV_VAR, None)\n\n  if IS_WINDOWS:\n    def testCatchExceptionsDoesNotInterfere(self):\n      \"\"\"Tests that gtest_catch_exceptions doesn't interfere.\"\"\"\n\n      SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, '1')\n      try:\n        self.RunAndVerify(env_var_value='1',\n                          flag_value='1',\n                          expect_seg_fault=1)\n      finally:\n        SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, None)\n\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-break-on-failure-unittest_.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Unit test for Google Test's break-on-failure mode.\n//\n// A user can ask Google Test to seg-fault when an assertion fails, using\n// either the GTEST_BREAK_ON_FAILURE environment variable or the\n// --gtest_break_on_failure flag.  This file is used for testing such\n// functionality.\n//\n// This program will be invoked from a Python unit test.  It is\n// expected to fail.  Don't run it directly.\n\n#include \"gtest/gtest.h\"\n\n#if GTEST_OS_WINDOWS\n# include <windows.h>\n# include <stdlib.h>\n#endif\n\nnamespace {\n\n// A test that's expected to fail.\nTEST(Foo, Bar) {\n  EXPECT_EQ(2, 3);\n}\n\n#if GTEST_HAS_SEH && !GTEST_OS_WINDOWS_MOBILE\n// On Windows Mobile global exception handlers are not supported.\nLONG WINAPI ExitWithExceptionCode(\n    struct _EXCEPTION_POINTERS* exception_pointers) {\n  exit(exception_pointers->ExceptionRecord->ExceptionCode);\n}\n#endif\n\n}  // namespace\n\nint main(int argc, char **argv) {\n#if GTEST_OS_WINDOWS\n  // Suppresses display of the Windows error dialog upon encountering\n  // a general protection fault (segment violation).\n  SetErrorMode(SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS);\n\n# if GTEST_HAS_SEH && !GTEST_OS_WINDOWS_MOBILE\n\n  // The default unhandled exception filter does not always exit\n  // with the exception code as exit code - for example it exits with\n  // 0 for EXCEPTION_ACCESS_VIOLATION and 1 for EXCEPTION_BREAKPOINT\n  // if the application is compiled in debug mode. Thus we use our own\n  // filter which always exits with the exception code for unhandled\n  // exceptions.\n  SetUnhandledExceptionFilter(ExitWithExceptionCode);\n\n# endif\n#endif  // GTEST_OS_WINDOWS\n  testing::InitGoogleTest(&argc, argv);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-catch-exceptions-test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2010 Google Inc.  All Rights Reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Tests Google Test's exception catching behavior.\n\nThis script invokes googletest-catch-exceptions-test_ and\ngoogletest-catch-exceptions-ex-test_ (programs written with\nGoogle Test) and verifies their output.\n\"\"\"\n\nimport gtest_test_utils\n\n# Constants.\nFLAG_PREFIX = '--gtest_'\nLIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'\nNO_CATCH_EXCEPTIONS_FLAG = FLAG_PREFIX + 'catch_exceptions=0'\nFILTER_FLAG = FLAG_PREFIX + 'filter'\n\n# Path to the googletest-catch-exceptions-ex-test_ binary, compiled with\n# exceptions enabled.\nEX_EXE_PATH = gtest_test_utils.GetTestExecutablePath(\n    'googletest-catch-exceptions-ex-test_')\n\n# Path to the googletest-catch-exceptions-test_ binary, compiled with\n# exceptions disabled.\nEXE_PATH = gtest_test_utils.GetTestExecutablePath(\n    'googletest-catch-exceptions-no-ex-test_')\n\nenviron = gtest_test_utils.environ\nSetEnvVar = gtest_test_utils.SetEnvVar\n\n# Tests in this file run a Google-Test-based test program and expect it\n# to terminate prematurely.  Therefore they are incompatible with\n# the premature-exit-file protocol by design.  Unset the\n# premature-exit filepath to prevent Google Test from creating\n# the file.\nSetEnvVar(gtest_test_utils.PREMATURE_EXIT_FILE_ENV_VAR, None)\n\nTEST_LIST = gtest_test_utils.Subprocess(\n    [EXE_PATH, LIST_TESTS_FLAG], env=environ).output\n\nSUPPORTS_SEH_EXCEPTIONS = 'ThrowsSehException' in TEST_LIST\n\nif SUPPORTS_SEH_EXCEPTIONS:\n  BINARY_OUTPUT = gtest_test_utils.Subprocess([EXE_PATH], env=environ).output\n\nEX_BINARY_OUTPUT = gtest_test_utils.Subprocess(\n    [EX_EXE_PATH], env=environ).output\n\n\n# The tests.\nif SUPPORTS_SEH_EXCEPTIONS:\n  # pylint:disable-msg=C6302\n  class CatchSehExceptionsTest(gtest_test_utils.TestCase):\n    \"\"\"Tests exception-catching behavior.\"\"\"\n\n\n    def TestSehExceptions(self, test_output):\n      self.assert_('SEH exception with code 0x2a thrown '\n                   'in the test fixture\\'s constructor'\n                   in test_output)\n      self.assert_('SEH exception with code 0x2a thrown '\n                   'in the test fixture\\'s destructor'\n                   in test_output)\n      self.assert_('SEH exception with code 0x2a thrown in SetUpTestCase()'\n                   in test_output)\n      self.assert_('SEH exception with code 0x2a thrown in TearDownTestCase()'\n                   in test_output)\n      self.assert_('SEH exception with code 0x2a thrown in SetUp()'\n                   in test_output)\n      self.assert_('SEH exception with code 0x2a thrown in TearDown()'\n                   in test_output)\n      self.assert_('SEH exception with code 0x2a thrown in the test body'\n                   in test_output)\n\n    def testCatchesSehExceptionsWithCxxExceptionsEnabled(self):\n      self.TestSehExceptions(EX_BINARY_OUTPUT)\n\n    def testCatchesSehExceptionsWithCxxExceptionsDisabled(self):\n      self.TestSehExceptions(BINARY_OUTPUT)\n\n\nclass CatchCxxExceptionsTest(gtest_test_utils.TestCase):\n  \"\"\"Tests C++ exception-catching behavior.\n\n     Tests in this test case verify that:\n     * C++ exceptions are caught and logged as C++ (not SEH) exceptions\n     * Exception thrown affect the remainder of the test work flow in the\n       expected manner.\n  \"\"\"\n\n  def testCatchesCxxExceptionsInFixtureConstructor(self):\n    self.assert_('C++ exception with description '\n                 '\"Standard C++ exception\" thrown '\n                 'in the test fixture\\'s constructor'\n                 in EX_BINARY_OUTPUT)\n    self.assert_('unexpected' not in EX_BINARY_OUTPUT,\n                 'This failure belongs in this test only if '\n                 '\"CxxExceptionInConstructorTest\" (no quotes) '\n                 'appears on the same line as words \"called unexpectedly\"')\n\n  if ('CxxExceptionInDestructorTest.ThrowsExceptionInDestructor' in\n      EX_BINARY_OUTPUT):\n\n    def testCatchesCxxExceptionsInFixtureDestructor(self):\n      self.assert_('C++ exception with description '\n                   '\"Standard C++ exception\" thrown '\n                   'in the test fixture\\'s destructor'\n                   in EX_BINARY_OUTPUT)\n      self.assert_('CxxExceptionInDestructorTest::TearDownTestCase() '\n                   'called as expected.'\n                   in EX_BINARY_OUTPUT)\n\n  def testCatchesCxxExceptionsInSetUpTestCase(self):\n    self.assert_('C++ exception with description \"Standard C++ exception\"'\n                 ' thrown in SetUpTestCase()'\n                 in EX_BINARY_OUTPUT)\n    self.assert_('CxxExceptionInConstructorTest::TearDownTestCase() '\n                 'called as expected.'\n                 in EX_BINARY_OUTPUT)\n    self.assert_('CxxExceptionInSetUpTestCaseTest constructor '\n                 'called as expected.'\n                 in EX_BINARY_OUTPUT)\n    self.assert_('CxxExceptionInSetUpTestCaseTest destructor '\n                 'called as expected.'\n                 in EX_BINARY_OUTPUT)\n    self.assert_('CxxExceptionInSetUpTestCaseTest::SetUp() '\n                 'called as expected.'\n                 in EX_BINARY_OUTPUT)\n    self.assert_('CxxExceptionInSetUpTestCaseTest::TearDown() '\n                 'called as expected.'\n                 in EX_BINARY_OUTPUT)\n    self.assert_('CxxExceptionInSetUpTestCaseTest test body '\n                 'called as expected.'\n                 in EX_BINARY_OUTPUT)\n\n  def testCatchesCxxExceptionsInTearDownTestCase(self):\n    self.assert_('C++ exception with description \"Standard C++ exception\"'\n                 ' thrown in TearDownTestCase()'\n                 in EX_BINARY_OUTPUT)\n\n  def testCatchesCxxExceptionsInSetUp(self):\n    self.assert_('C++ exception with description \"Standard C++ exception\"'\n                 ' thrown in SetUp()'\n                 in EX_BINARY_OUTPUT)\n    self.assert_('CxxExceptionInSetUpTest::TearDownTestCase() '\n                 'called as expected.'\n                 in EX_BINARY_OUTPUT)\n    self.assert_('CxxExceptionInSetUpTest destructor '\n                 'called as expected.'\n                 in EX_BINARY_OUTPUT)\n    self.assert_('CxxExceptionInSetUpTest::TearDown() '\n                 'called as expected.'\n                 in EX_BINARY_OUTPUT)\n    self.assert_('unexpected' not in EX_BINARY_OUTPUT,\n                 'This failure belongs in this test only if '\n                 '\"CxxExceptionInSetUpTest\" (no quotes) '\n                 'appears on the same line as words \"called unexpectedly\"')\n\n  def testCatchesCxxExceptionsInTearDown(self):\n    self.assert_('C++ exception with description \"Standard C++ exception\"'\n                 ' thrown in TearDown()'\n                 in EX_BINARY_OUTPUT)\n    self.assert_('CxxExceptionInTearDownTest::TearDownTestCase() '\n                 'called as expected.'\n                 in EX_BINARY_OUTPUT)\n    self.assert_('CxxExceptionInTearDownTest destructor '\n                 'called as expected.'\n                 in EX_BINARY_OUTPUT)\n\n  def testCatchesCxxExceptionsInTestBody(self):\n    self.assert_('C++ exception with description \"Standard C++ exception\"'\n                 ' thrown in the test body'\n                 in EX_BINARY_OUTPUT)\n    self.assert_('CxxExceptionInTestBodyTest::TearDownTestCase() '\n                 'called as expected.'\n                 in EX_BINARY_OUTPUT)\n    self.assert_('CxxExceptionInTestBodyTest destructor '\n                 'called as expected.'\n                 in EX_BINARY_OUTPUT)\n    self.assert_('CxxExceptionInTestBodyTest::TearDown() '\n                 'called as expected.'\n                 in EX_BINARY_OUTPUT)\n\n  def testCatchesNonStdCxxExceptions(self):\n    self.assert_('Unknown C++ exception thrown in the test body'\n                 in EX_BINARY_OUTPUT)\n\n  def testUnhandledCxxExceptionsAbortTheProgram(self):\n    # Filters out SEH exception tests on Windows. Unhandled SEH exceptions\n    # cause tests to show pop-up windows there.\n    FITLER_OUT_SEH_TESTS_FLAG = FILTER_FLAG + '=-*Seh*'\n    # By default, Google Test doesn't catch the exceptions.\n    uncaught_exceptions_ex_binary_output = gtest_test_utils.Subprocess(\n        [EX_EXE_PATH,\n         NO_CATCH_EXCEPTIONS_FLAG,\n         FITLER_OUT_SEH_TESTS_FLAG],\n        env=environ).output\n\n    self.assert_('Unhandled C++ exception terminating the program'\n                 in uncaught_exceptions_ex_binary_output)\n    self.assert_('unexpected' not in uncaught_exceptions_ex_binary_output)\n\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-catch-exceptions-test_.cc",
    "content": "// Copyright 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Tests for Google Test itself. Tests in this file throw C++ or SEH\n// exceptions, and the output is verified by\n// googletest-catch-exceptions-test.py.\n\n#include <stdio.h>  // NOLINT\n#include <stdlib.h>  // For exit().\n\n#include \"gtest/gtest.h\"\n\n#if GTEST_HAS_SEH\n# include <windows.h>\n#endif\n\n#if GTEST_HAS_EXCEPTIONS\n# include <exception>  // For set_terminate().\n# include <stdexcept>\n#endif\n\nusing testing::Test;\n\n#if GTEST_HAS_SEH\n\nclass SehExceptionInConstructorTest : public Test {\n public:\n  SehExceptionInConstructorTest() { RaiseException(42, 0, 0, NULL); }\n};\n\nTEST_F(SehExceptionInConstructorTest, ThrowsExceptionInConstructor) {}\n\nclass SehExceptionInDestructorTest : public Test {\n public:\n  ~SehExceptionInDestructorTest() { RaiseException(42, 0, 0, NULL); }\n};\n\nTEST_F(SehExceptionInDestructorTest, ThrowsExceptionInDestructor) {}\n\nclass SehExceptionInSetUpTestCaseTest : public Test {\n public:\n  static void SetUpTestCase() { RaiseException(42, 0, 0, NULL); }\n};\n\nTEST_F(SehExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {}\n\nclass SehExceptionInTearDownTestCaseTest : public Test {\n public:\n  static void TearDownTestCase() { RaiseException(42, 0, 0, NULL); }\n};\n\nTEST_F(SehExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {}\n\nclass SehExceptionInSetUpTest : public Test {\n protected:\n  virtual void SetUp() { RaiseException(42, 0, 0, NULL); }\n};\n\nTEST_F(SehExceptionInSetUpTest, ThrowsExceptionInSetUp) {}\n\nclass SehExceptionInTearDownTest : public Test {\n protected:\n  virtual void TearDown() { RaiseException(42, 0, 0, NULL); }\n};\n\nTEST_F(SehExceptionInTearDownTest, ThrowsExceptionInTearDown) {}\n\nTEST(SehExceptionTest, ThrowsSehException) {\n  RaiseException(42, 0, 0, NULL);\n}\n\n#endif  // GTEST_HAS_SEH\n\n#if GTEST_HAS_EXCEPTIONS\n\nclass CxxExceptionInConstructorTest : public Test {\n public:\n  CxxExceptionInConstructorTest() {\n    // Without this macro VC++ complains about unreachable code at the end of\n    // the constructor.\n    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(\n        throw std::runtime_error(\"Standard C++ exception\"));\n  }\n\n  static void TearDownTestCase() {\n    printf(\"%s\",\n           \"CxxExceptionInConstructorTest::TearDownTestCase() \"\n           \"called as expected.\\n\");\n  }\n\n protected:\n  ~CxxExceptionInConstructorTest() {\n    ADD_FAILURE() << \"CxxExceptionInConstructorTest destructor \"\n                  << \"called unexpectedly.\";\n  }\n\n  virtual void SetUp() {\n    ADD_FAILURE() << \"CxxExceptionInConstructorTest::SetUp() \"\n                  << \"called unexpectedly.\";\n  }\n\n  virtual void TearDown() {\n    ADD_FAILURE() << \"CxxExceptionInConstructorTest::TearDown() \"\n                  << \"called unexpectedly.\";\n  }\n};\n\nTEST_F(CxxExceptionInConstructorTest, ThrowsExceptionInConstructor) {\n  ADD_FAILURE() << \"CxxExceptionInConstructorTest test body \"\n                << \"called unexpectedly.\";\n}\n\n// Exceptions in destructors are not supported in C++11.\n#if !GTEST_LANG_CXX11\nclass CxxExceptionInDestructorTest : public Test {\n public:\n  static void TearDownTestCase() {\n    printf(\"%s\",\n           \"CxxExceptionInDestructorTest::TearDownTestCase() \"\n           \"called as expected.\\n\");\n  }\n\n protected:\n  ~CxxExceptionInDestructorTest() {\n    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(\n        throw std::runtime_error(\"Standard C++ exception\"));\n  }\n};\n\nTEST_F(CxxExceptionInDestructorTest, ThrowsExceptionInDestructor) {}\n#endif  // C++11 mode\n\nclass CxxExceptionInSetUpTestCaseTest : public Test {\n public:\n  CxxExceptionInSetUpTestCaseTest() {\n    printf(\"%s\",\n           \"CxxExceptionInSetUpTestCaseTest constructor \"\n           \"called as expected.\\n\");\n  }\n\n  static void SetUpTestCase() {\n    throw std::runtime_error(\"Standard C++ exception\");\n  }\n\n  static void TearDownTestCase() {\n    printf(\"%s\",\n           \"CxxExceptionInSetUpTestCaseTest::TearDownTestCase() \"\n           \"called as expected.\\n\");\n  }\n\n protected:\n  ~CxxExceptionInSetUpTestCaseTest() {\n    printf(\"%s\",\n           \"CxxExceptionInSetUpTestCaseTest destructor \"\n           \"called as expected.\\n\");\n  }\n\n  virtual void SetUp() {\n    printf(\"%s\",\n           \"CxxExceptionInSetUpTestCaseTest::SetUp() \"\n           \"called as expected.\\n\");\n  }\n\n  virtual void TearDown() {\n    printf(\"%s\",\n           \"CxxExceptionInSetUpTestCaseTest::TearDown() \"\n           \"called as expected.\\n\");\n  }\n};\n\nTEST_F(CxxExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {\n  printf(\"%s\",\n         \"CxxExceptionInSetUpTestCaseTest test body \"\n         \"called as expected.\\n\");\n}\n\nclass CxxExceptionInTearDownTestCaseTest : public Test {\n public:\n  static void TearDownTestCase() {\n    throw std::runtime_error(\"Standard C++ exception\");\n  }\n};\n\nTEST_F(CxxExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {}\n\nclass CxxExceptionInSetUpTest : public Test {\n public:\n  static void TearDownTestCase() {\n    printf(\"%s\",\n           \"CxxExceptionInSetUpTest::TearDownTestCase() \"\n           \"called as expected.\\n\");\n  }\n\n protected:\n  ~CxxExceptionInSetUpTest() {\n    printf(\"%s\",\n           \"CxxExceptionInSetUpTest destructor \"\n           \"called as expected.\\n\");\n  }\n\n  virtual void SetUp() { throw std::runtime_error(\"Standard C++ exception\"); }\n\n  virtual void TearDown() {\n    printf(\"%s\",\n           \"CxxExceptionInSetUpTest::TearDown() \"\n           \"called as expected.\\n\");\n  }\n};\n\nTEST_F(CxxExceptionInSetUpTest, ThrowsExceptionInSetUp) {\n  ADD_FAILURE() << \"CxxExceptionInSetUpTest test body \"\n                << \"called unexpectedly.\";\n}\n\nclass CxxExceptionInTearDownTest : public Test {\n public:\n  static void TearDownTestCase() {\n    printf(\"%s\",\n           \"CxxExceptionInTearDownTest::TearDownTestCase() \"\n           \"called as expected.\\n\");\n  }\n\n protected:\n  ~CxxExceptionInTearDownTest() {\n    printf(\"%s\",\n           \"CxxExceptionInTearDownTest destructor \"\n           \"called as expected.\\n\");\n  }\n\n  virtual void TearDown() {\n    throw std::runtime_error(\"Standard C++ exception\");\n  }\n};\n\nTEST_F(CxxExceptionInTearDownTest, ThrowsExceptionInTearDown) {}\n\nclass CxxExceptionInTestBodyTest : public Test {\n public:\n  static void TearDownTestCase() {\n    printf(\"%s\",\n           \"CxxExceptionInTestBodyTest::TearDownTestCase() \"\n           \"called as expected.\\n\");\n  }\n\n protected:\n  ~CxxExceptionInTestBodyTest() {\n    printf(\"%s\",\n           \"CxxExceptionInTestBodyTest destructor \"\n           \"called as expected.\\n\");\n  }\n\n  virtual void TearDown() {\n    printf(\"%s\",\n           \"CxxExceptionInTestBodyTest::TearDown() \"\n           \"called as expected.\\n\");\n  }\n};\n\nTEST_F(CxxExceptionInTestBodyTest, ThrowsStdCxxException) {\n  throw std::runtime_error(\"Standard C++ exception\");\n}\n\nTEST(CxxExceptionTest, ThrowsNonStdCxxException) {\n  throw \"C-string\";\n}\n\n// This terminate handler aborts the program using exit() rather than abort().\n// This avoids showing pop-ups on Windows systems and core dumps on Unix-like\n// ones.\nvoid TerminateHandler() {\n  fprintf(stderr, \"%s\\n\", \"Unhandled C++ exception terminating the program.\");\n  fflush(NULL);\n  exit(3);\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\nint main(int argc, char** argv) {\n#if GTEST_HAS_EXCEPTIONS\n  std::set_terminate(&TerminateHandler);\n#endif\n  testing::InitGoogleTest(&argc, argv);\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-color-test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Verifies that Google Test correctly determines whether to use colors.\"\"\"\n\nimport os\nimport gtest_test_utils\n\nIS_WINDOWS = os.name == 'nt'\n\nCOLOR_ENV_VAR = 'GTEST_COLOR'\nCOLOR_FLAG = 'gtest_color'\nCOMMAND = gtest_test_utils.GetTestExecutablePath('googletest-color-test_')\n\n\ndef SetEnvVar(env_var, value):\n  \"\"\"Sets the env variable to 'value'; unsets it when 'value' is None.\"\"\"\n\n  if value is not None:\n    os.environ[env_var] = value\n  elif env_var in os.environ:\n    del os.environ[env_var]\n\n\ndef UsesColor(term, color_env_var, color_flag):\n  \"\"\"Runs googletest-color-test_ and returns its exit code.\"\"\"\n\n  SetEnvVar('TERM', term)\n  SetEnvVar(COLOR_ENV_VAR, color_env_var)\n\n  if color_flag is None:\n    args = []\n  else:\n    args = ['--%s=%s' % (COLOR_FLAG, color_flag)]\n  p = gtest_test_utils.Subprocess([COMMAND] + args)\n  return not p.exited or p.exit_code\n\n\nclass GTestColorTest(gtest_test_utils.TestCase):\n  def testNoEnvVarNoFlag(self):\n    \"\"\"Tests the case when there's neither GTEST_COLOR nor --gtest_color.\"\"\"\n\n    if not IS_WINDOWS:\n      self.assert_(not UsesColor('dumb', None, None))\n      self.assert_(not UsesColor('emacs', None, None))\n      self.assert_(not UsesColor('xterm-mono', None, None))\n      self.assert_(not UsesColor('unknown', None, None))\n      self.assert_(not UsesColor(None, None, None))\n    self.assert_(UsesColor('linux', None, None))\n    self.assert_(UsesColor('cygwin', None, None))\n    self.assert_(UsesColor('xterm', None, None))\n    self.assert_(UsesColor('xterm-color', None, None))\n    self.assert_(UsesColor('xterm-256color', None, None))\n\n  def testFlagOnly(self):\n    \"\"\"Tests the case when there's --gtest_color but not GTEST_COLOR.\"\"\"\n\n    self.assert_(not UsesColor('dumb', None, 'no'))\n    self.assert_(not UsesColor('xterm-color', None, 'no'))\n    if not IS_WINDOWS:\n      self.assert_(not UsesColor('emacs', None, 'auto'))\n    self.assert_(UsesColor('xterm', None, 'auto'))\n    self.assert_(UsesColor('dumb', None, 'yes'))\n    self.assert_(UsesColor('xterm', None, 'yes'))\n\n  def testEnvVarOnly(self):\n    \"\"\"Tests the case when there's GTEST_COLOR but not --gtest_color.\"\"\"\n\n    self.assert_(not UsesColor('dumb', 'no', None))\n    self.assert_(not UsesColor('xterm-color', 'no', None))\n    if not IS_WINDOWS:\n      self.assert_(not UsesColor('dumb', 'auto', None))\n    self.assert_(UsesColor('xterm-color', 'auto', None))\n    self.assert_(UsesColor('dumb', 'yes', None))\n    self.assert_(UsesColor('xterm-color', 'yes', None))\n\n  def testEnvVarAndFlag(self):\n    \"\"\"Tests the case when there are both GTEST_COLOR and --gtest_color.\"\"\"\n\n    self.assert_(not UsesColor('xterm-color', 'no', 'no'))\n    self.assert_(UsesColor('dumb', 'no', 'yes'))\n    self.assert_(UsesColor('xterm-color', 'no', 'auto'))\n\n  def testAliasesOfYesAndNo(self):\n    \"\"\"Tests using aliases in specifying --gtest_color.\"\"\"\n\n    self.assert_(UsesColor('dumb', None, 'true'))\n    self.assert_(UsesColor('dumb', None, 'YES'))\n    self.assert_(UsesColor('dumb', None, 'T'))\n    self.assert_(UsesColor('dumb', None, '1'))\n\n    self.assert_(not UsesColor('xterm', None, 'f'))\n    self.assert_(not UsesColor('xterm', None, 'false'))\n    self.assert_(not UsesColor('xterm', None, '0'))\n    self.assert_(not UsesColor('xterm', None, 'unknown'))\n\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-color-test_.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// A helper program for testing how Google Test determines whether to use\n// colors in the output.  It prints \"YES\" and returns 1 if Google Test\n// decides to use colors, and prints \"NO\" and returns 0 otherwise.\n\n#include <stdio.h>\n\n#include \"gtest/gtest.h\"\n#include \"src/gtest-internal-inl.h\"\n\nusing testing::internal::ShouldUseColor;\n\n// The purpose of this is to ensure that the UnitTest singleton is\n// created before main() is entered, and thus that ShouldUseColor()\n// works the same way as in a real Google-Test-based test.  We don't actual\n// run the TEST itself.\nTEST(GTestColorTest, Dummy) {\n}\n\nint main(int argc, char** argv) {\n  testing::InitGoogleTest(&argc, argv);\n\n  if (ShouldUseColor(true)) {\n    // Google Test decides to use colors in the output (assuming it\n    // goes to a TTY).\n    printf(\"YES\\n\");\n    return 1;\n  } else {\n    // Google Test decides not to use colors in the output.\n    printf(\"NO\\n\");\n    return 0;\n  }\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-death-test-test.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Tests for death tests.\n\n#include \"gtest/gtest-death-test.h\"\n#include \"gtest/gtest.h\"\n#include \"gtest/internal/gtest-filepath.h\"\n\nusing testing::internal::AlwaysFalse;\nusing testing::internal::AlwaysTrue;\n\n#if GTEST_HAS_DEATH_TEST\n\n# if GTEST_OS_WINDOWS\n#  include <direct.h>          // For chdir().\n# else\n#  include <unistd.h>\n#  include <sys/wait.h>        // For waitpid.\n# endif  // GTEST_OS_WINDOWS\n\n# include <limits.h>\n# include <signal.h>\n# include <stdio.h>\n\n# if GTEST_OS_LINUX\n#  include <sys/time.h>\n# endif  // GTEST_OS_LINUX\n\n# include \"gtest/gtest-spi.h\"\n# include \"src/gtest-internal-inl.h\"\n\nnamespace posix = ::testing::internal::posix;\n\nusing testing::Message;\nusing testing::internal::DeathTest;\nusing testing::internal::DeathTestFactory;\nusing testing::internal::FilePath;\nusing testing::internal::GetLastErrnoDescription;\nusing testing::internal::GetUnitTestImpl;\nusing testing::internal::InDeathTestChild;\nusing testing::internal::ParseNaturalNumber;\n\nnamespace testing {\nnamespace internal {\n\n// A helper class whose objects replace the death test factory for a\n// single UnitTest object during their lifetimes.\nclass ReplaceDeathTestFactory {\n public:\n  explicit ReplaceDeathTestFactory(DeathTestFactory* new_factory)\n      : unit_test_impl_(GetUnitTestImpl()) {\n    old_factory_ = unit_test_impl_->death_test_factory_.release();\n    unit_test_impl_->death_test_factory_.reset(new_factory);\n  }\n\n  ~ReplaceDeathTestFactory() {\n    unit_test_impl_->death_test_factory_.release();\n    unit_test_impl_->death_test_factory_.reset(old_factory_);\n  }\n private:\n  // Prevents copying ReplaceDeathTestFactory objects.\n  ReplaceDeathTestFactory(const ReplaceDeathTestFactory&);\n  void operator=(const ReplaceDeathTestFactory&);\n\n  UnitTestImpl* unit_test_impl_;\n  DeathTestFactory* old_factory_;\n};\n\n}  // namespace internal\n}  // namespace testing\n\nvoid DieWithMessage(const ::std::string& message) {\n  fprintf(stderr, \"%s\", message.c_str());\n  fflush(stderr);  // Make sure the text is printed before the process exits.\n\n  // We call _exit() instead of exit(), as the former is a direct\n  // system call and thus safer in the presence of threads.  exit()\n  // will invoke user-defined exit-hooks, which may do dangerous\n  // things that conflict with death tests.\n  //\n  // Some compilers can recognize that _exit() never returns and issue the\n  // 'unreachable code' warning for code following this function, unless\n  // fooled by a fake condition.\n  if (AlwaysTrue())\n    _exit(1);\n}\n\nvoid DieInside(const ::std::string& function) {\n  DieWithMessage(\"death inside \" + function + \"().\");\n}\n\n// Tests that death tests work.\n\nclass TestForDeathTest : public testing::Test {\n protected:\n  TestForDeathTest() : original_dir_(FilePath::GetCurrentDir()) {}\n\n  virtual ~TestForDeathTest() {\n    posix::ChDir(original_dir_.c_str());\n  }\n\n  // A static member function that's expected to die.\n  static void StaticMemberFunction() { DieInside(\"StaticMemberFunction\"); }\n\n  // A method of the test fixture that may die.\n  void MemberFunction() {\n    if (should_die_)\n      DieInside(\"MemberFunction\");\n  }\n\n  // True iff MemberFunction() should die.\n  bool should_die_;\n  const FilePath original_dir_;\n};\n\n// A class with a member function that may die.\nclass MayDie {\n public:\n  explicit MayDie(bool should_die) : should_die_(should_die) {}\n\n  // A member function that may die.\n  void MemberFunction() const {\n    if (should_die_)\n      DieInside(\"MayDie::MemberFunction\");\n  }\n\n private:\n  // True iff MemberFunction() should die.\n  bool should_die_;\n};\n\n// A global function that's expected to die.\nvoid GlobalFunction() { DieInside(\"GlobalFunction\"); }\n\n// A non-void function that's expected to die.\nint NonVoidFunction() {\n  DieInside(\"NonVoidFunction\");\n  return 1;\n}\n\n// A unary function that may die.\nvoid DieIf(bool should_die) {\n  if (should_die)\n    DieInside(\"DieIf\");\n}\n\n// A binary function that may die.\nbool DieIfLessThan(int x, int y) {\n  if (x < y) {\n    DieInside(\"DieIfLessThan\");\n  }\n  return true;\n}\n\n// Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture.\nvoid DeathTestSubroutine() {\n  EXPECT_DEATH(GlobalFunction(), \"death.*GlobalFunction\");\n  ASSERT_DEATH(GlobalFunction(), \"death.*GlobalFunction\");\n}\n\n// Death in dbg, not opt.\nint DieInDebugElse12(int* sideeffect) {\n  if (sideeffect) *sideeffect = 12;\n\n# ifndef NDEBUG\n\n  DieInside(\"DieInDebugElse12\");\n\n# endif  // NDEBUG\n\n  return 12;\n}\n\n# if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA\n\n// Tests the ExitedWithCode predicate.\nTEST(ExitStatusPredicateTest, ExitedWithCode) {\n  // On Windows, the process's exit code is the same as its exit status,\n  // so the predicate just compares the its input with its parameter.\n  EXPECT_TRUE(testing::ExitedWithCode(0)(0));\n  EXPECT_TRUE(testing::ExitedWithCode(1)(1));\n  EXPECT_TRUE(testing::ExitedWithCode(42)(42));\n  EXPECT_FALSE(testing::ExitedWithCode(0)(1));\n  EXPECT_FALSE(testing::ExitedWithCode(1)(0));\n}\n\n# else\n\n// Returns the exit status of a process that calls _exit(2) with a\n// given exit code.  This is a helper function for the\n// ExitStatusPredicateTest test suite.\nstatic int NormalExitStatus(int exit_code) {\n  pid_t child_pid = fork();\n  if (child_pid == 0) {\n    _exit(exit_code);\n  }\n  int status;\n  waitpid(child_pid, &status, 0);\n  return status;\n}\n\n// Returns the exit status of a process that raises a given signal.\n// If the signal does not cause the process to die, then it returns\n// instead the exit status of a process that exits normally with exit\n// code 1.  This is a helper function for the ExitStatusPredicateTest\n// test suite.\nstatic int KilledExitStatus(int signum) {\n  pid_t child_pid = fork();\n  if (child_pid == 0) {\n    raise(signum);\n    _exit(1);\n  }\n  int status;\n  waitpid(child_pid, &status, 0);\n  return status;\n}\n\n// Tests the ExitedWithCode predicate.\nTEST(ExitStatusPredicateTest, ExitedWithCode) {\n  const int status0  = NormalExitStatus(0);\n  const int status1  = NormalExitStatus(1);\n  const int status42 = NormalExitStatus(42);\n  const testing::ExitedWithCode pred0(0);\n  const testing::ExitedWithCode pred1(1);\n  const testing::ExitedWithCode pred42(42);\n  EXPECT_PRED1(pred0,  status0);\n  EXPECT_PRED1(pred1,  status1);\n  EXPECT_PRED1(pred42, status42);\n  EXPECT_FALSE(pred0(status1));\n  EXPECT_FALSE(pred42(status0));\n  EXPECT_FALSE(pred1(status42));\n}\n\n// Tests the KilledBySignal predicate.\nTEST(ExitStatusPredicateTest, KilledBySignal) {\n  const int status_segv = KilledExitStatus(SIGSEGV);\n  const int status_kill = KilledExitStatus(SIGKILL);\n  const testing::KilledBySignal pred_segv(SIGSEGV);\n  const testing::KilledBySignal pred_kill(SIGKILL);\n  EXPECT_PRED1(pred_segv, status_segv);\n  EXPECT_PRED1(pred_kill, status_kill);\n  EXPECT_FALSE(pred_segv(status_kill));\n  EXPECT_FALSE(pred_kill(status_segv));\n}\n\n# endif  // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA\n\n// Tests that the death test macros expand to code which may or may not\n// be followed by operator<<, and that in either case the complete text\n// comprises only a single C++ statement.\nTEST_F(TestForDeathTest, SingleStatement) {\n  if (AlwaysFalse())\n    // This would fail if executed; this is a compilation test only\n    ASSERT_DEATH(return, \"\");\n\n  if (AlwaysTrue())\n    EXPECT_DEATH(_exit(1), \"\");\n  else\n    // This empty \"else\" branch is meant to ensure that EXPECT_DEATH\n    // doesn't expand into an \"if\" statement without an \"else\"\n    ;\n\n  if (AlwaysFalse())\n    ASSERT_DEATH(return, \"\") << \"did not die\";\n\n  if (AlwaysFalse())\n    ;\n  else\n    EXPECT_DEATH(_exit(1), \"\") << 1 << 2 << 3;\n}\n\nvoid DieWithEmbeddedNul() {\n  fprintf(stderr, \"Hello%cmy null world.\\n\", '\\0');\n  fflush(stderr);\n  _exit(1);\n}\n\n# if GTEST_USES_PCRE\n\n// Tests that EXPECT_DEATH and ASSERT_DEATH work when the error\n// message has a NUL character in it.\nTEST_F(TestForDeathTest, EmbeddedNulInMessage) {\n  EXPECT_DEATH(DieWithEmbeddedNul(), \"my null world\");\n  ASSERT_DEATH(DieWithEmbeddedNul(), \"my null world\");\n}\n\n# endif  // GTEST_USES_PCRE\n\n// Tests that death test macros expand to code which interacts well with switch\n// statements.\nTEST_F(TestForDeathTest, SwitchStatement) {\n  // Microsoft compiler usually complains about switch statements without\n  // case labels. We suppress that warning for this test.\n  GTEST_DISABLE_MSC_WARNINGS_PUSH_(4065)\n\n  switch (0)\n    default:\n      ASSERT_DEATH(_exit(1), \"\") << \"exit in default switch handler\";\n\n  switch (0)\n    case 0:\n      EXPECT_DEATH(_exit(1), \"\") << \"exit in switch case\";\n\n  GTEST_DISABLE_MSC_WARNINGS_POP_()\n}\n\n// Tests that a static member function can be used in a \"fast\" style\n// death test.\nTEST_F(TestForDeathTest, StaticMemberFunctionFastStyle) {\n  testing::GTEST_FLAG(death_test_style) = \"fast\";\n  ASSERT_DEATH(StaticMemberFunction(), \"death.*StaticMember\");\n}\n\n// Tests that a method of the test fixture can be used in a \"fast\"\n// style death test.\nTEST_F(TestForDeathTest, MemberFunctionFastStyle) {\n  testing::GTEST_FLAG(death_test_style) = \"fast\";\n  should_die_ = true;\n  EXPECT_DEATH(MemberFunction(), \"inside.*MemberFunction\");\n}\n\nvoid ChangeToRootDir() { posix::ChDir(GTEST_PATH_SEP_); }\n\n// Tests that death tests work even if the current directory has been\n// changed.\nTEST_F(TestForDeathTest, FastDeathTestInChangedDir) {\n  testing::GTEST_FLAG(death_test_style) = \"fast\";\n\n  ChangeToRootDir();\n  EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), \"\");\n\n  ChangeToRootDir();\n  ASSERT_DEATH(_exit(1), \"\");\n}\n\n# if GTEST_OS_LINUX\nvoid SigprofAction(int, siginfo_t*, void*) { /* no op */ }\n\n// Sets SIGPROF action and ITIMER_PROF timer (interval: 1ms).\nvoid SetSigprofActionAndTimer() {\n  struct itimerval timer;\n  timer.it_interval.tv_sec = 0;\n  timer.it_interval.tv_usec = 1;\n  timer.it_value = timer.it_interval;\n  ASSERT_EQ(0, setitimer(ITIMER_PROF, &timer, NULL));\n  struct sigaction signal_action;\n  memset(&signal_action, 0, sizeof(signal_action));\n  sigemptyset(&signal_action.sa_mask);\n  signal_action.sa_sigaction = SigprofAction;\n  signal_action.sa_flags = SA_RESTART | SA_SIGINFO;\n  ASSERT_EQ(0, sigaction(SIGPROF, &signal_action, NULL));\n}\n\n// Disables ITIMER_PROF timer and ignores SIGPROF signal.\nvoid DisableSigprofActionAndTimer(struct sigaction* old_signal_action) {\n  struct itimerval timer;\n  timer.it_interval.tv_sec = 0;\n  timer.it_interval.tv_usec = 0;\n  timer.it_value = timer.it_interval;\n  ASSERT_EQ(0, setitimer(ITIMER_PROF, &timer, NULL));\n  struct sigaction signal_action;\n  memset(&signal_action, 0, sizeof(signal_action));\n  sigemptyset(&signal_action.sa_mask);\n  signal_action.sa_handler = SIG_IGN;\n  ASSERT_EQ(0, sigaction(SIGPROF, &signal_action, old_signal_action));\n}\n\n// Tests that death tests work when SIGPROF handler and timer are set.\nTEST_F(TestForDeathTest, FastSigprofActionSet) {\n  testing::GTEST_FLAG(death_test_style) = \"fast\";\n  SetSigprofActionAndTimer();\n  EXPECT_DEATH(_exit(1), \"\");\n  struct sigaction old_signal_action;\n  DisableSigprofActionAndTimer(&old_signal_action);\n  EXPECT_TRUE(old_signal_action.sa_sigaction == SigprofAction);\n}\n\nTEST_F(TestForDeathTest, ThreadSafeSigprofActionSet) {\n  testing::GTEST_FLAG(death_test_style) = \"threadsafe\";\n  SetSigprofActionAndTimer();\n  EXPECT_DEATH(_exit(1), \"\");\n  struct sigaction old_signal_action;\n  DisableSigprofActionAndTimer(&old_signal_action);\n  EXPECT_TRUE(old_signal_action.sa_sigaction == SigprofAction);\n}\n# endif  // GTEST_OS_LINUX\n\n// Repeats a representative sample of death tests in the \"threadsafe\" style:\n\nTEST_F(TestForDeathTest, StaticMemberFunctionThreadsafeStyle) {\n  testing::GTEST_FLAG(death_test_style) = \"threadsafe\";\n  ASSERT_DEATH(StaticMemberFunction(), \"death.*StaticMember\");\n}\n\nTEST_F(TestForDeathTest, MemberFunctionThreadsafeStyle) {\n  testing::GTEST_FLAG(death_test_style) = \"threadsafe\";\n  should_die_ = true;\n  EXPECT_DEATH(MemberFunction(), \"inside.*MemberFunction\");\n}\n\nTEST_F(TestForDeathTest, ThreadsafeDeathTestInLoop) {\n  testing::GTEST_FLAG(death_test_style) = \"threadsafe\";\n\n  for (int i = 0; i < 3; ++i)\n    EXPECT_EXIT(_exit(i), testing::ExitedWithCode(i), \"\") << \": i = \" << i;\n}\n\nTEST_F(TestForDeathTest, ThreadsafeDeathTestInChangedDir) {\n  testing::GTEST_FLAG(death_test_style) = \"threadsafe\";\n\n  ChangeToRootDir();\n  EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), \"\");\n\n  ChangeToRootDir();\n  ASSERT_DEATH(_exit(1), \"\");\n}\n\nTEST_F(TestForDeathTest, MixedStyles) {\n  testing::GTEST_FLAG(death_test_style) = \"threadsafe\";\n  EXPECT_DEATH(_exit(1), \"\");\n  testing::GTEST_FLAG(death_test_style) = \"fast\";\n  EXPECT_DEATH(_exit(1), \"\");\n}\n\n# if GTEST_HAS_CLONE && GTEST_HAS_PTHREAD\n\nnamespace {\n\nbool pthread_flag;\n\nvoid SetPthreadFlag() {\n  pthread_flag = true;\n}\n\n}  // namespace\n\nTEST_F(TestForDeathTest, DoesNotExecuteAtforkHooks) {\n  if (!testing::GTEST_FLAG(death_test_use_fork)) {\n    testing::GTEST_FLAG(death_test_style) = \"threadsafe\";\n    pthread_flag = false;\n    ASSERT_EQ(0, pthread_atfork(&SetPthreadFlag, NULL, NULL));\n    ASSERT_DEATH(_exit(1), \"\");\n    ASSERT_FALSE(pthread_flag);\n  }\n}\n\n# endif  // GTEST_HAS_CLONE && GTEST_HAS_PTHREAD\n\n// Tests that a method of another class can be used in a death test.\nTEST_F(TestForDeathTest, MethodOfAnotherClass) {\n  const MayDie x(true);\n  ASSERT_DEATH(x.MemberFunction(), \"MayDie\\\\:\\\\:MemberFunction\");\n}\n\n// Tests that a global function can be used in a death test.\nTEST_F(TestForDeathTest, GlobalFunction) {\n  EXPECT_DEATH(GlobalFunction(), \"GlobalFunction\");\n}\n\n// Tests that any value convertible to an RE works as a second\n// argument to EXPECT_DEATH.\nTEST_F(TestForDeathTest, AcceptsAnythingConvertibleToRE) {\n  static const char regex_c_str[] = \"GlobalFunction\";\n  EXPECT_DEATH(GlobalFunction(), regex_c_str);\n\n  const testing::internal::RE regex(regex_c_str);\n  EXPECT_DEATH(GlobalFunction(), regex);\n\n# if GTEST_HAS_GLOBAL_STRING\n\n  const ::string regex_str(regex_c_str);\n  EXPECT_DEATH(GlobalFunction(), regex_str);\n\n# endif  // GTEST_HAS_GLOBAL_STRING\n\n# if !GTEST_USES_PCRE\n\n  const ::std::string regex_std_str(regex_c_str);\n  EXPECT_DEATH(GlobalFunction(), regex_std_str);\n\n# endif  // !GTEST_USES_PCRE\n}\n\n// Tests that a non-void function can be used in a death test.\nTEST_F(TestForDeathTest, NonVoidFunction) {\n  ASSERT_DEATH(NonVoidFunction(), \"NonVoidFunction\");\n}\n\n// Tests that functions that take parameter(s) can be used in a death test.\nTEST_F(TestForDeathTest, FunctionWithParameter) {\n  EXPECT_DEATH(DieIf(true), \"DieIf\\\\(\\\\)\");\n  EXPECT_DEATH(DieIfLessThan(2, 3), \"DieIfLessThan\");\n}\n\n// Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture.\nTEST_F(TestForDeathTest, OutsideFixture) {\n  DeathTestSubroutine();\n}\n\n// Tests that death tests can be done inside a loop.\nTEST_F(TestForDeathTest, InsideLoop) {\n  for (int i = 0; i < 5; i++) {\n    EXPECT_DEATH(DieIfLessThan(-1, i), \"DieIfLessThan\") << \"where i == \" << i;\n  }\n}\n\n// Tests that a compound statement can be used in a death test.\nTEST_F(TestForDeathTest, CompoundStatement) {\n  EXPECT_DEATH({  // NOLINT\n    const int x = 2;\n    const int y = x + 1;\n    DieIfLessThan(x, y);\n  },\n  \"DieIfLessThan\");\n}\n\n// Tests that code that doesn't die causes a death test to fail.\nTEST_F(TestForDeathTest, DoesNotDie) {\n  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(DieIf(false), \"DieIf\"),\n                          \"failed to die\");\n}\n\n// Tests that a death test fails when the error message isn't expected.\nTEST_F(TestForDeathTest, ErrorMessageMismatch) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_DEATH(DieIf(true), \"DieIfLessThan\") << \"End of death test message.\";\n  }, \"died but not with expected error\");\n}\n\n// On exit, *aborted will be true iff the EXPECT_DEATH() statement\n// aborted the function.\nvoid ExpectDeathTestHelper(bool* aborted) {\n  *aborted = true;\n  EXPECT_DEATH(DieIf(false), \"DieIf\");  // This assertion should fail.\n  *aborted = false;\n}\n\n// Tests that EXPECT_DEATH doesn't abort the test on failure.\nTEST_F(TestForDeathTest, EXPECT_DEATH) {\n  bool aborted = true;\n  EXPECT_NONFATAL_FAILURE(ExpectDeathTestHelper(&aborted),\n                          \"failed to die\");\n  EXPECT_FALSE(aborted);\n}\n\n// Tests that ASSERT_DEATH does abort the test on failure.\nTEST_F(TestForDeathTest, ASSERT_DEATH) {\n  static bool aborted;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    aborted = true;\n    ASSERT_DEATH(DieIf(false), \"DieIf\");  // This assertion should fail.\n    aborted = false;\n  }, \"failed to die\");\n  EXPECT_TRUE(aborted);\n}\n\n// Tests that EXPECT_DEATH evaluates the arguments exactly once.\nTEST_F(TestForDeathTest, SingleEvaluation) {\n  int x = 3;\n  EXPECT_DEATH(DieIf((++x) == 4), \"DieIf\");\n\n  const char* regex = \"DieIf\";\n  const char* regex_save = regex;\n  EXPECT_DEATH(DieIfLessThan(3, 4), regex++);\n  EXPECT_EQ(regex_save + 1, regex);\n}\n\n// Tests that run-away death tests are reported as failures.\nTEST_F(TestForDeathTest, RunawayIsFailure) {\n  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(static_cast<void>(0), \"Foo\"),\n                          \"failed to die.\");\n}\n\n// Tests that death tests report executing 'return' in the statement as\n// failure.\nTEST_F(TestForDeathTest, ReturnIsFailure) {\n  EXPECT_FATAL_FAILURE(ASSERT_DEATH(return, \"Bar\"),\n                       \"illegal return in test statement.\");\n}\n\n// Tests that EXPECT_DEBUG_DEATH works as expected, that is, you can stream a\n// message to it, and in debug mode it:\n// 1. Asserts on death.\n// 2. Has no side effect.\n//\n// And in opt mode, it:\n// 1.  Has side effects but does not assert.\nTEST_F(TestForDeathTest, TestExpectDebugDeath) {\n  int sideeffect = 0;\n\n  // Put the regex in a local variable to make sure we don't get an \"unused\"\n  // warning in opt mode.\n  const char* regex = \"death.*DieInDebugElse12\";\n\n  EXPECT_DEBUG_DEATH(DieInDebugElse12(&sideeffect), regex)\n      << \"Must accept a streamed message\";\n\n# ifdef NDEBUG\n\n  // Checks that the assignment occurs in opt mode (sideeffect).\n  EXPECT_EQ(12, sideeffect);\n\n# else\n\n  // Checks that the assignment does not occur in dbg mode (no sideeffect).\n  EXPECT_EQ(0, sideeffect);\n\n# endif\n}\n\n// Tests that ASSERT_DEBUG_DEATH works as expected, that is, you can stream a\n// message to it, and in debug mode it:\n// 1. Asserts on death.\n// 2. Has no side effect.\n//\n// And in opt mode, it:\n// 1.  Has side effects but does not assert.\nTEST_F(TestForDeathTest, TestAssertDebugDeath) {\n  int sideeffect = 0;\n\n  ASSERT_DEBUG_DEATH(DieInDebugElse12(&sideeffect), \"death.*DieInDebugElse12\")\n      << \"Must accept a streamed message\";\n\n# ifdef NDEBUG\n\n  // Checks that the assignment occurs in opt mode (sideeffect).\n  EXPECT_EQ(12, sideeffect);\n\n# else\n\n  // Checks that the assignment does not occur in dbg mode (no sideeffect).\n  EXPECT_EQ(0, sideeffect);\n\n# endif\n}\n\n# ifndef NDEBUG\n\nvoid ExpectDebugDeathHelper(bool* aborted) {\n  *aborted = true;\n  EXPECT_DEBUG_DEATH(return, \"\") << \"This is expected to fail.\";\n  *aborted = false;\n}\n\n#  if GTEST_OS_WINDOWS\nTEST(PopUpDeathTest, DoesNotShowPopUpOnAbort) {\n  printf(\"This test should be considered failing if it shows \"\n         \"any pop-up dialogs.\\n\");\n  fflush(stdout);\n\n  EXPECT_DEATH({\n    testing::GTEST_FLAG(catch_exceptions) = false;\n    abort();\n  }, \"\");\n}\n#  endif  // GTEST_OS_WINDOWS\n\n// Tests that EXPECT_DEBUG_DEATH in debug mode does not abort\n// the function.\nTEST_F(TestForDeathTest, ExpectDebugDeathDoesNotAbort) {\n  bool aborted = true;\n  EXPECT_NONFATAL_FAILURE(ExpectDebugDeathHelper(&aborted), \"\");\n  EXPECT_FALSE(aborted);\n}\n\nvoid AssertDebugDeathHelper(bool* aborted) {\n  *aborted = true;\n  GTEST_LOG_(INFO) << \"Before ASSERT_DEBUG_DEATH\";\n  ASSERT_DEBUG_DEATH(GTEST_LOG_(INFO) << \"In ASSERT_DEBUG_DEATH\"; return, \"\")\n      << \"This is expected to fail.\";\n  GTEST_LOG_(INFO) << \"After ASSERT_DEBUG_DEATH\";\n  *aborted = false;\n}\n\n// Tests that ASSERT_DEBUG_DEATH in debug mode aborts the function on\n// failure.\nTEST_F(TestForDeathTest, AssertDebugDeathAborts) {\n  static bool aborted;\n  aborted = false;\n  EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), \"\");\n  EXPECT_TRUE(aborted);\n}\n\nTEST_F(TestForDeathTest, AssertDebugDeathAborts2) {\n  static bool aborted;\n  aborted = false;\n  EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), \"\");\n  EXPECT_TRUE(aborted);\n}\n\nTEST_F(TestForDeathTest, AssertDebugDeathAborts3) {\n  static bool aborted;\n  aborted = false;\n  EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), \"\");\n  EXPECT_TRUE(aborted);\n}\n\nTEST_F(TestForDeathTest, AssertDebugDeathAborts4) {\n  static bool aborted;\n  aborted = false;\n  EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), \"\");\n  EXPECT_TRUE(aborted);\n}\n\nTEST_F(TestForDeathTest, AssertDebugDeathAborts5) {\n  static bool aborted;\n  aborted = false;\n  EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), \"\");\n  EXPECT_TRUE(aborted);\n}\n\nTEST_F(TestForDeathTest, AssertDebugDeathAborts6) {\n  static bool aborted;\n  aborted = false;\n  EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), \"\");\n  EXPECT_TRUE(aborted);\n}\n\nTEST_F(TestForDeathTest, AssertDebugDeathAborts7) {\n  static bool aborted;\n  aborted = false;\n  EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), \"\");\n  EXPECT_TRUE(aborted);\n}\n\nTEST_F(TestForDeathTest, AssertDebugDeathAborts8) {\n  static bool aborted;\n  aborted = false;\n  EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), \"\");\n  EXPECT_TRUE(aborted);\n}\n\nTEST_F(TestForDeathTest, AssertDebugDeathAborts9) {\n  static bool aborted;\n  aborted = false;\n  EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), \"\");\n  EXPECT_TRUE(aborted);\n}\n\nTEST_F(TestForDeathTest, AssertDebugDeathAborts10) {\n  static bool aborted;\n  aborted = false;\n  EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), \"\");\n  EXPECT_TRUE(aborted);\n}\n\n# endif  // _NDEBUG\n\n// Tests the *_EXIT family of macros, using a variety of predicates.\nstatic void TestExitMacros() {\n  EXPECT_EXIT(_exit(1),  testing::ExitedWithCode(1),  \"\");\n  ASSERT_EXIT(_exit(42), testing::ExitedWithCode(42), \"\");\n\n# if GTEST_OS_WINDOWS\n\n  // Of all signals effects on the process exit code, only those of SIGABRT\n  // are documented on Windows.\n  // See https://msdn.microsoft.com/en-us/query-bi/m/dwwzkt4c.\n  EXPECT_EXIT(raise(SIGABRT), testing::ExitedWithCode(3), \"\") << \"b_ar\";\n\n# elif !GTEST_OS_FUCHSIA\n\n  // Fuchsia has no unix signals.\n  EXPECT_EXIT(raise(SIGKILL), testing::KilledBySignal(SIGKILL), \"\") << \"foo\";\n  ASSERT_EXIT(raise(SIGUSR2), testing::KilledBySignal(SIGUSR2), \"\") << \"bar\";\n\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_EXIT(_exit(0), testing::KilledBySignal(SIGSEGV), \"\")\n      << \"This failure is expected, too.\";\n  }, \"This failure is expected, too.\");\n\n# endif  // GTEST_OS_WINDOWS\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_EXIT(raise(SIGSEGV), testing::ExitedWithCode(0), \"\")\n      << \"This failure is expected.\";\n  }, \"This failure is expected.\");\n}\n\nTEST_F(TestForDeathTest, ExitMacros) {\n  TestExitMacros();\n}\n\nTEST_F(TestForDeathTest, ExitMacrosUsingFork) {\n  testing::GTEST_FLAG(death_test_use_fork) = true;\n  TestExitMacros();\n}\n\nTEST_F(TestForDeathTest, InvalidStyle) {\n  testing::GTEST_FLAG(death_test_style) = \"rococo\";\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_DEATH(_exit(0), \"\") << \"This failure is expected.\";\n  }, \"This failure is expected.\");\n}\n\nTEST_F(TestForDeathTest, DeathTestFailedOutput) {\n  testing::GTEST_FLAG(death_test_style) = \"fast\";\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_DEATH(DieWithMessage(\"death\\n\"),\n                   \"expected message\"),\n      \"Actual msg:\\n\"\n      \"[  DEATH   ] death\\n\");\n}\n\nTEST_F(TestForDeathTest, DeathTestUnexpectedReturnOutput) {\n  testing::GTEST_FLAG(death_test_style) = \"fast\";\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_DEATH({\n          fprintf(stderr, \"returning\\n\");\n          fflush(stderr);\n          return;\n        }, \"\"),\n      \"    Result: illegal return in test statement.\\n\"\n      \" Error msg:\\n\"\n      \"[  DEATH   ] returning\\n\");\n}\n\nTEST_F(TestForDeathTest, DeathTestBadExitCodeOutput) {\n  testing::GTEST_FLAG(death_test_style) = \"fast\";\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_EXIT(DieWithMessage(\"exiting with rc 1\\n\"),\n                  testing::ExitedWithCode(3),\n                  \"expected message\"),\n      \"    Result: died but not with expected exit code:\\n\"\n      \"            Exited with exit status 1\\n\"\n      \"Actual msg:\\n\"\n      \"[  DEATH   ] exiting with rc 1\\n\");\n}\n\nTEST_F(TestForDeathTest, DeathTestMultiLineMatchFail) {\n  testing::GTEST_FLAG(death_test_style) = \"fast\";\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_DEATH(DieWithMessage(\"line 1\\nline 2\\nline 3\\n\"),\n                   \"line 1\\nxyz\\nline 3\\n\"),\n      \"Actual msg:\\n\"\n      \"[  DEATH   ] line 1\\n\"\n      \"[  DEATH   ] line 2\\n\"\n      \"[  DEATH   ] line 3\\n\");\n}\n\nTEST_F(TestForDeathTest, DeathTestMultiLineMatchPass) {\n  testing::GTEST_FLAG(death_test_style) = \"fast\";\n  EXPECT_DEATH(DieWithMessage(\"line 1\\nline 2\\nline 3\\n\"),\n               \"line 1\\nline 2\\nline 3\\n\");\n}\n\n// A DeathTestFactory that returns MockDeathTests.\nclass MockDeathTestFactory : public DeathTestFactory {\n public:\n  MockDeathTestFactory();\n  virtual bool Create(const char* statement,\n                      const ::testing::internal::RE* regex,\n                      const char* file, int line, DeathTest** test);\n\n  // Sets the parameters for subsequent calls to Create.\n  void SetParameters(bool create, DeathTest::TestRole role,\n                     int status, bool passed);\n\n  // Accessors.\n  int AssumeRoleCalls() const { return assume_role_calls_; }\n  int WaitCalls() const { return wait_calls_; }\n  size_t PassedCalls() const { return passed_args_.size(); }\n  bool PassedArgument(int n) const { return passed_args_[n]; }\n  size_t AbortCalls() const { return abort_args_.size(); }\n  DeathTest::AbortReason AbortArgument(int n) const {\n    return abort_args_[n];\n  }\n  bool TestDeleted() const { return test_deleted_; }\n\n private:\n  friend class MockDeathTest;\n  // If true, Create will return a MockDeathTest; otherwise it returns\n  // NULL.\n  bool create_;\n  // The value a MockDeathTest will return from its AssumeRole method.\n  DeathTest::TestRole role_;\n  // The value a MockDeathTest will return from its Wait method.\n  int status_;\n  // The value a MockDeathTest will return from its Passed method.\n  bool passed_;\n\n  // Number of times AssumeRole was called.\n  int assume_role_calls_;\n  // Number of times Wait was called.\n  int wait_calls_;\n  // The arguments to the calls to Passed since the last call to\n  // SetParameters.\n  std::vector<bool> passed_args_;\n  // The arguments to the calls to Abort since the last call to\n  // SetParameters.\n  std::vector<DeathTest::AbortReason> abort_args_;\n  // True if the last MockDeathTest returned by Create has been\n  // deleted.\n  bool test_deleted_;\n};\n\n\n// A DeathTest implementation useful in testing.  It returns values set\n// at its creation from its various inherited DeathTest methods, and\n// reports calls to those methods to its parent MockDeathTestFactory\n// object.\nclass MockDeathTest : public DeathTest {\n public:\n  MockDeathTest(MockDeathTestFactory *parent,\n                TestRole role, int status, bool passed) :\n      parent_(parent), role_(role), status_(status), passed_(passed) {\n  }\n  virtual ~MockDeathTest() {\n    parent_->test_deleted_ = true;\n  }\n  virtual TestRole AssumeRole() {\n    ++parent_->assume_role_calls_;\n    return role_;\n  }\n  virtual int Wait() {\n    ++parent_->wait_calls_;\n    return status_;\n  }\n  virtual bool Passed(bool exit_status_ok) {\n    parent_->passed_args_.push_back(exit_status_ok);\n    return passed_;\n  }\n  virtual void Abort(AbortReason reason) {\n    parent_->abort_args_.push_back(reason);\n  }\n\n private:\n  MockDeathTestFactory* const parent_;\n  const TestRole role_;\n  const int status_;\n  const bool passed_;\n};\n\n\n// MockDeathTestFactory constructor.\nMockDeathTestFactory::MockDeathTestFactory()\n    : create_(true),\n      role_(DeathTest::OVERSEE_TEST),\n      status_(0),\n      passed_(true),\n      assume_role_calls_(0),\n      wait_calls_(0),\n      passed_args_(),\n      abort_args_() {\n}\n\n\n// Sets the parameters for subsequent calls to Create.\nvoid MockDeathTestFactory::SetParameters(bool create,\n                                         DeathTest::TestRole role,\n                                         int status, bool passed) {\n  create_ = create;\n  role_ = role;\n  status_ = status;\n  passed_ = passed;\n\n  assume_role_calls_ = 0;\n  wait_calls_ = 0;\n  passed_args_.clear();\n  abort_args_.clear();\n}\n\n\n// Sets test to NULL (if create_ is false) or to the address of a new\n// MockDeathTest object with parameters taken from the last call\n// to SetParameters (if create_ is true).  Always returns true.\nbool MockDeathTestFactory::Create(const char* /*statement*/,\n                                  const ::testing::internal::RE* /*regex*/,\n                                  const char* /*file*/,\n                                  int /*line*/,\n                                  DeathTest** test) {\n  test_deleted_ = false;\n  if (create_) {\n    *test = new MockDeathTest(this, role_, status_, passed_);\n  } else {\n    *test = NULL;\n  }\n  return true;\n}\n\n// A test fixture for testing the logic of the GTEST_DEATH_TEST_ macro.\n// It installs a MockDeathTestFactory that is used for the duration\n// of the test case.\nclass MacroLogicDeathTest : public testing::Test {\n protected:\n  static testing::internal::ReplaceDeathTestFactory* replacer_;\n  static MockDeathTestFactory* factory_;\n\n  static void SetUpTestCase() {\n    factory_ = new MockDeathTestFactory;\n    replacer_ = new testing::internal::ReplaceDeathTestFactory(factory_);\n  }\n\n  static void TearDownTestCase() {\n    delete replacer_;\n    replacer_ = NULL;\n    delete factory_;\n    factory_ = NULL;\n  }\n\n  // Runs a death test that breaks the rules by returning.  Such a death\n  // test cannot be run directly from a test routine that uses a\n  // MockDeathTest, or the remainder of the routine will not be executed.\n  static void RunReturningDeathTest(bool* flag) {\n    ASSERT_DEATH({  // NOLINT\n      *flag = true;\n      return;\n    }, \"\");\n  }\n};\n\ntesting::internal::ReplaceDeathTestFactory* MacroLogicDeathTest::replacer_\n    = NULL;\nMockDeathTestFactory* MacroLogicDeathTest::factory_ = NULL;\n\n\n// Test that nothing happens when the factory doesn't return a DeathTest:\nTEST_F(MacroLogicDeathTest, NothingHappens) {\n  bool flag = false;\n  factory_->SetParameters(false, DeathTest::OVERSEE_TEST, 0, true);\n  EXPECT_DEATH(flag = true, \"\");\n  EXPECT_FALSE(flag);\n  EXPECT_EQ(0, factory_->AssumeRoleCalls());\n  EXPECT_EQ(0, factory_->WaitCalls());\n  EXPECT_EQ(0U, factory_->PassedCalls());\n  EXPECT_EQ(0U, factory_->AbortCalls());\n  EXPECT_FALSE(factory_->TestDeleted());\n}\n\n// Test that the parent process doesn't run the death test code,\n// and that the Passed method returns false when the (simulated)\n// child process exits with status 0:\nTEST_F(MacroLogicDeathTest, ChildExitsSuccessfully) {\n  bool flag = false;\n  factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 0, true);\n  EXPECT_DEATH(flag = true, \"\");\n  EXPECT_FALSE(flag);\n  EXPECT_EQ(1, factory_->AssumeRoleCalls());\n  EXPECT_EQ(1, factory_->WaitCalls());\n  ASSERT_EQ(1U, factory_->PassedCalls());\n  EXPECT_FALSE(factory_->PassedArgument(0));\n  EXPECT_EQ(0U, factory_->AbortCalls());\n  EXPECT_TRUE(factory_->TestDeleted());\n}\n\n// Tests that the Passed method was given the argument \"true\" when\n// the (simulated) child process exits with status 1:\nTEST_F(MacroLogicDeathTest, ChildExitsUnsuccessfully) {\n  bool flag = false;\n  factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 1, true);\n  EXPECT_DEATH(flag = true, \"\");\n  EXPECT_FALSE(flag);\n  EXPECT_EQ(1, factory_->AssumeRoleCalls());\n  EXPECT_EQ(1, factory_->WaitCalls());\n  ASSERT_EQ(1U, factory_->PassedCalls());\n  EXPECT_TRUE(factory_->PassedArgument(0));\n  EXPECT_EQ(0U, factory_->AbortCalls());\n  EXPECT_TRUE(factory_->TestDeleted());\n}\n\n// Tests that the (simulated) child process executes the death test\n// code, and is aborted with the correct AbortReason if it\n// executes a return statement.\nTEST_F(MacroLogicDeathTest, ChildPerformsReturn) {\n  bool flag = false;\n  factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true);\n  RunReturningDeathTest(&flag);\n  EXPECT_TRUE(flag);\n  EXPECT_EQ(1, factory_->AssumeRoleCalls());\n  EXPECT_EQ(0, factory_->WaitCalls());\n  EXPECT_EQ(0U, factory_->PassedCalls());\n  EXPECT_EQ(1U, factory_->AbortCalls());\n  EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT,\n            factory_->AbortArgument(0));\n  EXPECT_TRUE(factory_->TestDeleted());\n}\n\n// Tests that the (simulated) child process is aborted with the\n// correct AbortReason if it does not die.\nTEST_F(MacroLogicDeathTest, ChildDoesNotDie) {\n  bool flag = false;\n  factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true);\n  EXPECT_DEATH(flag = true, \"\");\n  EXPECT_TRUE(flag);\n  EXPECT_EQ(1, factory_->AssumeRoleCalls());\n  EXPECT_EQ(0, factory_->WaitCalls());\n  EXPECT_EQ(0U, factory_->PassedCalls());\n  // This time there are two calls to Abort: one since the test didn't\n  // die, and another from the ReturnSentinel when it's destroyed.  The\n  // sentinel normally isn't destroyed if a test doesn't die, since\n  // _exit(2) is called in that case by ForkingDeathTest, but not by\n  // our MockDeathTest.\n  ASSERT_EQ(2U, factory_->AbortCalls());\n  EXPECT_EQ(DeathTest::TEST_DID_NOT_DIE,\n            factory_->AbortArgument(0));\n  EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT,\n            factory_->AbortArgument(1));\n  EXPECT_TRUE(factory_->TestDeleted());\n}\n\n// Tests that a successful death test does not register a successful\n// test part.\nTEST(SuccessRegistrationDeathTest, NoSuccessPart) {\n  EXPECT_DEATH(_exit(1), \"\");\n  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());\n}\n\nTEST(StreamingAssertionsDeathTest, DeathTest) {\n  EXPECT_DEATH(_exit(1), \"\") << \"unexpected failure\";\n  ASSERT_DEATH(_exit(1), \"\") << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_DEATH(_exit(0), \"\") << \"expected failure\";\n  }, \"expected failure\");\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_DEATH(_exit(0), \"\") << \"expected failure\";\n  }, \"expected failure\");\n}\n\n// Tests that GetLastErrnoDescription returns an empty string when the\n// last error is 0 and non-empty string when it is non-zero.\nTEST(GetLastErrnoDescription, GetLastErrnoDescriptionWorks) {\n  errno = ENOENT;\n  EXPECT_STRNE(\"\", GetLastErrnoDescription().c_str());\n  errno = 0;\n  EXPECT_STREQ(\"\", GetLastErrnoDescription().c_str());\n}\n\n# if GTEST_OS_WINDOWS\nTEST(AutoHandleTest, AutoHandleWorks) {\n  HANDLE handle = ::CreateEvent(NULL, FALSE, FALSE, NULL);\n  ASSERT_NE(INVALID_HANDLE_VALUE, handle);\n\n  // Tests that the AutoHandle is correctly initialized with a handle.\n  testing::internal::AutoHandle auto_handle(handle);\n  EXPECT_EQ(handle, auto_handle.Get());\n\n  // Tests that Reset assigns INVALID_HANDLE_VALUE.\n  // Note that this cannot verify whether the original handle is closed.\n  auto_handle.Reset();\n  EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle.Get());\n\n  // Tests that Reset assigns the new handle.\n  // Note that this cannot verify whether the original handle is closed.\n  handle = ::CreateEvent(NULL, FALSE, FALSE, NULL);\n  ASSERT_NE(INVALID_HANDLE_VALUE, handle);\n  auto_handle.Reset(handle);\n  EXPECT_EQ(handle, auto_handle.Get());\n\n  // Tests that AutoHandle contains INVALID_HANDLE_VALUE by default.\n  testing::internal::AutoHandle auto_handle2;\n  EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle2.Get());\n}\n# endif  // GTEST_OS_WINDOWS\n\n# if GTEST_OS_WINDOWS\ntypedef unsigned __int64 BiggestParsable;\ntypedef signed __int64 BiggestSignedParsable;\n# else\ntypedef unsigned long long BiggestParsable;\ntypedef signed long long BiggestSignedParsable;\n# endif  // GTEST_OS_WINDOWS\n\n// We cannot use std::numeric_limits<T>::max() as it clashes with the\n// max() macro defined by <windows.h>.\nconst BiggestParsable kBiggestParsableMax = ULLONG_MAX;\nconst BiggestSignedParsable kBiggestSignedParsableMax = LLONG_MAX;\n\nTEST(ParseNaturalNumberTest, RejectsInvalidFormat) {\n  BiggestParsable result = 0;\n\n  // Rejects non-numbers.\n  EXPECT_FALSE(ParseNaturalNumber(\"non-number string\", &result));\n\n  // Rejects numbers with whitespace prefix.\n  EXPECT_FALSE(ParseNaturalNumber(\" 123\", &result));\n\n  // Rejects negative numbers.\n  EXPECT_FALSE(ParseNaturalNumber(\"-123\", &result));\n\n  // Rejects numbers starting with a plus sign.\n  EXPECT_FALSE(ParseNaturalNumber(\"+123\", &result));\n  errno = 0;\n}\n\nTEST(ParseNaturalNumberTest, RejectsOverflownNumbers) {\n  BiggestParsable result = 0;\n\n  EXPECT_FALSE(ParseNaturalNumber(\"99999999999999999999999\", &result));\n\n  signed char char_result = 0;\n  EXPECT_FALSE(ParseNaturalNumber(\"200\", &char_result));\n  errno = 0;\n}\n\nTEST(ParseNaturalNumberTest, AcceptsValidNumbers) {\n  BiggestParsable result = 0;\n\n  result = 0;\n  ASSERT_TRUE(ParseNaturalNumber(\"123\", &result));\n  EXPECT_EQ(123U, result);\n\n  // Check 0 as an edge case.\n  result = 1;\n  ASSERT_TRUE(ParseNaturalNumber(\"0\", &result));\n  EXPECT_EQ(0U, result);\n\n  result = 1;\n  ASSERT_TRUE(ParseNaturalNumber(\"00000\", &result));\n  EXPECT_EQ(0U, result);\n}\n\nTEST(ParseNaturalNumberTest, AcceptsTypeLimits) {\n  Message msg;\n  msg << kBiggestParsableMax;\n\n  BiggestParsable result = 0;\n  EXPECT_TRUE(ParseNaturalNumber(msg.GetString(), &result));\n  EXPECT_EQ(kBiggestParsableMax, result);\n\n  Message msg2;\n  msg2 << kBiggestSignedParsableMax;\n\n  BiggestSignedParsable signed_result = 0;\n  EXPECT_TRUE(ParseNaturalNumber(msg2.GetString(), &signed_result));\n  EXPECT_EQ(kBiggestSignedParsableMax, signed_result);\n\n  Message msg3;\n  msg3 << INT_MAX;\n\n  int int_result = 0;\n  EXPECT_TRUE(ParseNaturalNumber(msg3.GetString(), &int_result));\n  EXPECT_EQ(INT_MAX, int_result);\n\n  Message msg4;\n  msg4 << UINT_MAX;\n\n  unsigned int uint_result = 0;\n  EXPECT_TRUE(ParseNaturalNumber(msg4.GetString(), &uint_result));\n  EXPECT_EQ(UINT_MAX, uint_result);\n}\n\nTEST(ParseNaturalNumberTest, WorksForShorterIntegers) {\n  short short_result = 0;\n  ASSERT_TRUE(ParseNaturalNumber(\"123\", &short_result));\n  EXPECT_EQ(123, short_result);\n\n  signed char char_result = 0;\n  ASSERT_TRUE(ParseNaturalNumber(\"123\", &char_result));\n  EXPECT_EQ(123, char_result);\n}\n\n# if GTEST_OS_WINDOWS\nTEST(EnvironmentTest, HandleFitsIntoSizeT) {\n  // FIXME: Remove this test after this condition is verified\n  // in a static assertion in gtest-death-test.cc in the function\n  // GetStatusFileDescriptor.\n  ASSERT_TRUE(sizeof(HANDLE) <= sizeof(size_t));\n}\n# endif  // GTEST_OS_WINDOWS\n\n// Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED trigger\n// failures when death tests are available on the system.\nTEST(ConditionalDeathMacrosDeathTest, ExpectsDeathWhenDeathTestsAvailable) {\n  EXPECT_DEATH_IF_SUPPORTED(DieInside(\"CondDeathTestExpectMacro\"),\n                            \"death inside CondDeathTestExpectMacro\");\n  ASSERT_DEATH_IF_SUPPORTED(DieInside(\"CondDeathTestAssertMacro\"),\n                            \"death inside CondDeathTestAssertMacro\");\n\n  // Empty statement will not crash, which must trigger a failure.\n  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH_IF_SUPPORTED(;, \"\"), \"\");\n  EXPECT_FATAL_FAILURE(ASSERT_DEATH_IF_SUPPORTED(;, \"\"), \"\");\n}\n\nTEST(InDeathTestChildDeathTest, ReportsDeathTestCorrectlyInFastStyle) {\n  testing::GTEST_FLAG(death_test_style) = \"fast\";\n  EXPECT_FALSE(InDeathTestChild());\n  EXPECT_DEATH({\n    fprintf(stderr, InDeathTestChild() ? \"Inside\" : \"Outside\");\n    fflush(stderr);\n    _exit(1);\n  }, \"Inside\");\n}\n\nTEST(InDeathTestChildDeathTest, ReportsDeathTestCorrectlyInThreadSafeStyle) {\n  testing::GTEST_FLAG(death_test_style) = \"threadsafe\";\n  EXPECT_FALSE(InDeathTestChild());\n  EXPECT_DEATH({\n    fprintf(stderr, InDeathTestChild() ? \"Inside\" : \"Outside\");\n    fflush(stderr);\n    _exit(1);\n  }, \"Inside\");\n}\n\n#else  // !GTEST_HAS_DEATH_TEST follows\n\nusing testing::internal::CaptureStderr;\nusing testing::internal::GetCapturedStderr;\n\n// Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED are still\n// defined but do not trigger failures when death tests are not available on\n// the system.\nTEST(ConditionalDeathMacrosTest, WarnsWhenDeathTestsNotAvailable) {\n  // Empty statement will not crash, but that should not trigger a failure\n  // when death tests are not supported.\n  CaptureStderr();\n  EXPECT_DEATH_IF_SUPPORTED(;, \"\");\n  std::string output = GetCapturedStderr();\n  ASSERT_TRUE(NULL != strstr(output.c_str(),\n                             \"Death tests are not supported on this platform\"));\n  ASSERT_TRUE(NULL != strstr(output.c_str(), \";\"));\n\n  // The streamed message should not be printed as there is no test failure.\n  CaptureStderr();\n  EXPECT_DEATH_IF_SUPPORTED(;, \"\") << \"streamed message\";\n  output = GetCapturedStderr();\n  ASSERT_TRUE(NULL == strstr(output.c_str(), \"streamed message\"));\n\n  CaptureStderr();\n  ASSERT_DEATH_IF_SUPPORTED(;, \"\");  // NOLINT\n  output = GetCapturedStderr();\n  ASSERT_TRUE(NULL != strstr(output.c_str(),\n                             \"Death tests are not supported on this platform\"));\n  ASSERT_TRUE(NULL != strstr(output.c_str(), \";\"));\n\n  CaptureStderr();\n  ASSERT_DEATH_IF_SUPPORTED(;, \"\") << \"streamed message\";  // NOLINT\n  output = GetCapturedStderr();\n  ASSERT_TRUE(NULL == strstr(output.c_str(), \"streamed message\"));\n}\n\nvoid FuncWithAssert(int* n) {\n  ASSERT_DEATH_IF_SUPPORTED(return;, \"\");\n  (*n)++;\n}\n\n// Tests that ASSERT_DEATH_IF_SUPPORTED does not return from the current\n// function (as ASSERT_DEATH does) if death tests are not supported.\nTEST(ConditionalDeathMacrosTest, AssertDeatDoesNotReturnhIfUnsupported) {\n  int n = 0;\n  FuncWithAssert(&n);\n  EXPECT_EQ(1, n);\n}\n\n#endif  // !GTEST_HAS_DEATH_TEST\n\n// Tests that the death test macros expand to code which may or may not\n// be followed by operator<<, and that in either case the complete text\n// comprises only a single C++ statement.\n//\n// The syntax should work whether death tests are available or not.\nTEST(ConditionalDeathMacrosSyntaxDeathTest, SingleStatement) {\n  if (AlwaysFalse())\n    // This would fail if executed; this is a compilation test only\n    ASSERT_DEATH_IF_SUPPORTED(return, \"\");\n\n  if (AlwaysTrue())\n    EXPECT_DEATH_IF_SUPPORTED(_exit(1), \"\");\n  else\n    // This empty \"else\" branch is meant to ensure that EXPECT_DEATH\n    // doesn't expand into an \"if\" statement without an \"else\"\n    ;  // NOLINT\n\n  if (AlwaysFalse())\n    ASSERT_DEATH_IF_SUPPORTED(return, \"\") << \"did not die\";\n\n  if (AlwaysFalse())\n    ;  // NOLINT\n  else\n    EXPECT_DEATH_IF_SUPPORTED(_exit(1), \"\") << 1 << 2 << 3;\n}\n\n// Tests that conditional death test macros expand to code which interacts\n// well with switch statements.\nTEST(ConditionalDeathMacrosSyntaxDeathTest, SwitchStatement) {\n  // Microsoft compiler usually complains about switch statements without\n  // case labels. We suppress that warning for this test.\n  GTEST_DISABLE_MSC_WARNINGS_PUSH_(4065)\n\n  switch (0)\n    default:\n      ASSERT_DEATH_IF_SUPPORTED(_exit(1), \"\")\n          << \"exit in default switch handler\";\n\n  switch (0)\n    case 0:\n      EXPECT_DEATH_IF_SUPPORTED(_exit(1), \"\") << \"exit in switch case\";\n\n  GTEST_DISABLE_MSC_WARNINGS_POP_()\n}\n\n// Tests that a test case whose name ends with \"DeathTest\" works fine\n// on Windows.\nTEST(NotADeathTest, Test) {\n  SUCCEED();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-death-test_ex_test.cc",
    "content": "// Copyright 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Tests that verify interaction of exceptions and death tests.\n\n#include \"gtest/gtest-death-test.h\"\n#include \"gtest/gtest.h\"\n\n#if GTEST_HAS_DEATH_TEST\n\n# if GTEST_HAS_SEH\n#  include <windows.h>          // For RaiseException().\n# endif\n\n# include \"gtest/gtest-spi.h\"\n\n# if GTEST_HAS_EXCEPTIONS\n\n#  include <exception>  // For std::exception.\n\n// Tests that death tests report thrown exceptions as failures and that the\n// exceptions do not escape death test macros.\nTEST(CxxExceptionDeathTest, ExceptionIsFailure) {\n  try {\n    EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw 1, \"\"), \"threw an exception\");\n  } catch (...) {  // NOLINT\n    FAIL() << \"An exception escaped a death test macro invocation \"\n           << \"with catch_exceptions \"\n           << (testing::GTEST_FLAG(catch_exceptions) ? \"enabled\" : \"disabled\");\n  }\n}\n\nclass TestException : public std::exception {\n public:\n  virtual const char* what() const throw() { return \"exceptional message\"; }\n};\n\nTEST(CxxExceptionDeathTest, PrintsMessageForStdExceptions) {\n  // Verifies that the exception message is quoted in the failure text.\n  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw TestException(), \"\"),\n                          \"exceptional message\");\n  // Verifies that the location is mentioned in the failure text.\n  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw TestException(), \"\"),\n                          \"googletest-death-test_ex_test.cc\");\n}\n# endif  // GTEST_HAS_EXCEPTIONS\n\n# if GTEST_HAS_SEH\n// Tests that enabling interception of SEH exceptions with the\n// catch_exceptions flag does not interfere with SEH exceptions being\n// treated as death by death tests.\nTEST(SehExceptionDeasTest, CatchExceptionsDoesNotInterfere) {\n  EXPECT_DEATH(RaiseException(42, 0x0, 0, NULL), \"\")\n      << \"with catch_exceptions \"\n      << (testing::GTEST_FLAG(catch_exceptions) ? \"enabled\" : \"disabled\");\n}\n# endif\n\n#endif  // GTEST_HAS_DEATH_TEST\n\nint main(int argc, char** argv) {\n  testing::InitGoogleTest(&argc, argv);\n  testing::GTEST_FLAG(catch_exceptions) = GTEST_ENABLE_CATCH_EXCEPTIONS_ != 0;\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-env-var-test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Verifies that Google Test correctly parses environment variables.\"\"\"\n\nimport os\nimport gtest_test_utils\n\n\nIS_WINDOWS = os.name == 'nt'\nIS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'\n\nCOMMAND = gtest_test_utils.GetTestExecutablePath('googletest-env-var-test_')\n\nenviron = os.environ.copy()\n\n\ndef AssertEq(expected, actual):\n  if expected != actual:\n    print 'Expected: %s' % (expected,)\n    print '  Actual: %s' % (actual,)\n    raise AssertionError\n\n\ndef SetEnvVar(env_var, value):\n  \"\"\"Sets the env variable to 'value'; unsets it when 'value' is None.\"\"\"\n\n  if value is not None:\n    environ[env_var] = value\n  elif env_var in environ:\n    del environ[env_var]\n\n\ndef GetFlag(flag):\n  \"\"\"Runs googletest-env-var-test_ and returns its output.\"\"\"\n\n  args = [COMMAND]\n  if flag is not None:\n    args += [flag]\n  return gtest_test_utils.Subprocess(args, env=environ).output\n\n\ndef TestFlag(flag, test_val, default_val):\n  \"\"\"Verifies that the given flag is affected by the corresponding env var.\"\"\"\n\n  env_var = 'GTEST_' + flag.upper()\n  SetEnvVar(env_var, test_val)\n  AssertEq(test_val, GetFlag(flag))\n  SetEnvVar(env_var, None)\n  AssertEq(default_val, GetFlag(flag))\n\n\nclass GTestEnvVarTest(gtest_test_utils.TestCase):\n\n  def testEnvVarAffectsFlag(self):\n    \"\"\"Tests that environment variable should affect the corresponding flag.\"\"\"\n\n    TestFlag('break_on_failure', '1', '0')\n    TestFlag('color', 'yes', 'auto')\n    TestFlag('filter', 'FooTest.Bar', '*')\n    SetEnvVar('XML_OUTPUT_FILE', None)  # For 'output' test\n    TestFlag('output', 'xml:tmp/foo.xml', '')\n    TestFlag('print_time', '0', '1')\n    TestFlag('repeat', '999', '1')\n    TestFlag('throw_on_failure', '1', '0')\n    TestFlag('death_test_style', 'threadsafe', 'fast')\n    TestFlag('catch_exceptions', '0', '1')\n\n    if IS_LINUX:\n      TestFlag('death_test_use_fork', '1', '0')\n      TestFlag('stack_trace_depth', '0', '100')\n\n\n  def testXmlOutputFile(self):\n    \"\"\"Tests that $XML_OUTPUT_FILE affects the output flag.\"\"\"\n\n    SetEnvVar('GTEST_OUTPUT', None)\n    SetEnvVar('XML_OUTPUT_FILE', 'tmp/bar.xml')\n    AssertEq('xml:tmp/bar.xml', GetFlag('output'))\n\n  def testXmlOutputFileOverride(self):\n    \"\"\"Tests that $XML_OUTPUT_FILE is overridden by $GTEST_OUTPUT.\"\"\"\n\n    SetEnvVar('GTEST_OUTPUT', 'xml:tmp/foo.xml')\n    SetEnvVar('XML_OUTPUT_FILE', 'tmp/bar.xml')\n    AssertEq('xml:tmp/foo.xml', GetFlag('output'))\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-env-var-test_.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// A helper program for testing that Google Test parses the environment\n// variables correctly.\n\n#include <iostream>\n\n#include \"gtest/gtest.h\"\n#include \"src/gtest-internal-inl.h\"\n\nusing ::std::cout;\n\nnamespace testing {\n\n// The purpose of this is to make the test more realistic by ensuring\n// that the UnitTest singleton is created before main() is entered.\n// We don't actual run the TEST itself.\nTEST(GTestEnvVarTest, Dummy) {\n}\n\nvoid PrintFlag(const char* flag) {\n  if (strcmp(flag, \"break_on_failure\") == 0) {\n    cout << GTEST_FLAG(break_on_failure);\n    return;\n  }\n\n  if (strcmp(flag, \"catch_exceptions\") == 0) {\n    cout << GTEST_FLAG(catch_exceptions);\n    return;\n  }\n\n  if (strcmp(flag, \"color\") == 0) {\n    cout << GTEST_FLAG(color);\n    return;\n  }\n\n  if (strcmp(flag, \"death_test_style\") == 0) {\n    cout << GTEST_FLAG(death_test_style);\n    return;\n  }\n\n  if (strcmp(flag, \"death_test_use_fork\") == 0) {\n    cout << GTEST_FLAG(death_test_use_fork);\n    return;\n  }\n\n  if (strcmp(flag, \"filter\") == 0) {\n    cout << GTEST_FLAG(filter);\n    return;\n  }\n\n  if (strcmp(flag, \"output\") == 0) {\n    cout << GTEST_FLAG(output);\n    return;\n  }\n\n  if (strcmp(flag, \"print_time\") == 0) {\n    cout << GTEST_FLAG(print_time);\n    return;\n  }\n\n  if (strcmp(flag, \"repeat\") == 0) {\n    cout << GTEST_FLAG(repeat);\n    return;\n  }\n\n  if (strcmp(flag, \"stack_trace_depth\") == 0) {\n    cout << GTEST_FLAG(stack_trace_depth);\n    return;\n  }\n\n  if (strcmp(flag, \"throw_on_failure\") == 0) {\n    cout << GTEST_FLAG(throw_on_failure);\n    return;\n  }\n\n  cout << \"Invalid flag name \" << flag\n       << \".  Valid names are break_on_failure, color, filter, etc.\\n\";\n  exit(1);\n}\n\n}  // namespace testing\n\nint main(int argc, char** argv) {\n  testing::InitGoogleTest(&argc, argv);\n\n  if (argc != 2) {\n    cout << \"Usage: googletest-env-var-test_ NAME_OF_FLAG\\n\";\n    return 1;\n  }\n\n  testing::PrintFlag(argv[1]);\n  return 0;\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-filepath-test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Google Test filepath utilities\n//\n// This file tests classes and functions used internally by\n// Google Test.  They are subject to change without notice.\n//\n// This file is #included from gtest-internal.h.\n// Do not #include this file anywhere else!\n\n#include \"gtest/internal/gtest-filepath.h\"\n#include \"gtest/gtest.h\"\n#include \"src/gtest-internal-inl.h\"\n\n#if GTEST_OS_WINDOWS_MOBILE\n# include <windows.h>  // NOLINT\n#elif GTEST_OS_WINDOWS\n# include <direct.h>  // NOLINT\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\nnamespace testing {\nnamespace internal {\nnamespace {\n\n#if GTEST_OS_WINDOWS_MOBILE\n// FIXME: Move these to the POSIX adapter section in\n// gtest-port.h.\n\n// Windows CE doesn't have the remove C function.\nint remove(const char* path) {\n  LPCWSTR wpath = String::AnsiToUtf16(path);\n  int ret = DeleteFile(wpath) ? 0 : -1;\n  delete [] wpath;\n  return ret;\n}\n// Windows CE doesn't have the _rmdir C function.\nint _rmdir(const char* path) {\n  FilePath filepath(path);\n  LPCWSTR wpath = String::AnsiToUtf16(\n      filepath.RemoveTrailingPathSeparator().c_str());\n  int ret = RemoveDirectory(wpath) ? 0 : -1;\n  delete [] wpath;\n  return ret;\n}\n\n#else\n\nTEST(GetCurrentDirTest, ReturnsCurrentDir) {\n  const FilePath original_dir = FilePath::GetCurrentDir();\n  EXPECT_FALSE(original_dir.IsEmpty());\n\n  posix::ChDir(GTEST_PATH_SEP_);\n  const FilePath cwd = FilePath::GetCurrentDir();\n  posix::ChDir(original_dir.c_str());\n\n# if GTEST_OS_WINDOWS\n\n  // Skips the \":\".\n  const char* const cwd_without_drive = strchr(cwd.c_str(), ':');\n  ASSERT_TRUE(cwd_without_drive != NULL);\n  EXPECT_STREQ(GTEST_PATH_SEP_, cwd_without_drive + 1);\n\n# else\n\n  EXPECT_EQ(GTEST_PATH_SEP_, cwd.string());\n\n# endif\n}\n\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\nTEST(IsEmptyTest, ReturnsTrueForEmptyPath) {\n  EXPECT_TRUE(FilePath(\"\").IsEmpty());\n}\n\nTEST(IsEmptyTest, ReturnsFalseForNonEmptyPath) {\n  EXPECT_FALSE(FilePath(\"a\").IsEmpty());\n  EXPECT_FALSE(FilePath(\".\").IsEmpty());\n  EXPECT_FALSE(FilePath(\"a/b\").IsEmpty());\n  EXPECT_FALSE(FilePath(\"a\\\\b\\\\\").IsEmpty());\n}\n\n// RemoveDirectoryName \"\" -> \"\"\nTEST(RemoveDirectoryNameTest, WhenEmptyName) {\n  EXPECT_EQ(\"\", FilePath(\"\").RemoveDirectoryName().string());\n}\n\n// RemoveDirectoryName \"afile\" -> \"afile\"\nTEST(RemoveDirectoryNameTest, ButNoDirectory) {\n  EXPECT_EQ(\"afile\",\n      FilePath(\"afile\").RemoveDirectoryName().string());\n}\n\n// RemoveDirectoryName \"/afile\" -> \"afile\"\nTEST(RemoveDirectoryNameTest, RootFileShouldGiveFileName) {\n  EXPECT_EQ(\"afile\",\n      FilePath(GTEST_PATH_SEP_ \"afile\").RemoveDirectoryName().string());\n}\n\n// RemoveDirectoryName \"adir/\" -> \"\"\nTEST(RemoveDirectoryNameTest, WhereThereIsNoFileName) {\n  EXPECT_EQ(\"\",\n      FilePath(\"adir\" GTEST_PATH_SEP_).RemoveDirectoryName().string());\n}\n\n// RemoveDirectoryName \"adir/afile\" -> \"afile\"\nTEST(RemoveDirectoryNameTest, ShouldGiveFileName) {\n  EXPECT_EQ(\"afile\",\n      FilePath(\"adir\" GTEST_PATH_SEP_ \"afile\").RemoveDirectoryName().string());\n}\n\n// RemoveDirectoryName \"adir/subdir/afile\" -> \"afile\"\nTEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileName) {\n  EXPECT_EQ(\"afile\",\n      FilePath(\"adir\" GTEST_PATH_SEP_ \"subdir\" GTEST_PATH_SEP_ \"afile\")\n      .RemoveDirectoryName().string());\n}\n\n#if GTEST_HAS_ALT_PATH_SEP_\n\n// Tests that RemoveDirectoryName() works with the alternate separator\n// on Windows.\n\n// RemoveDirectoryName(\"/afile\") -> \"afile\"\nTEST(RemoveDirectoryNameTest, RootFileShouldGiveFileNameForAlternateSeparator) {\n  EXPECT_EQ(\"afile\", FilePath(\"/afile\").RemoveDirectoryName().string());\n}\n\n// RemoveDirectoryName(\"adir/\") -> \"\"\nTEST(RemoveDirectoryNameTest, WhereThereIsNoFileNameForAlternateSeparator) {\n  EXPECT_EQ(\"\", FilePath(\"adir/\").RemoveDirectoryName().string());\n}\n\n// RemoveDirectoryName(\"adir/afile\") -> \"afile\"\nTEST(RemoveDirectoryNameTest, ShouldGiveFileNameForAlternateSeparator) {\n  EXPECT_EQ(\"afile\", FilePath(\"adir/afile\").RemoveDirectoryName().string());\n}\n\n// RemoveDirectoryName(\"adir/subdir/afile\") -> \"afile\"\nTEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileNameForAlternateSeparator) {\n  EXPECT_EQ(\"afile\",\n            FilePath(\"adir/subdir/afile\").RemoveDirectoryName().string());\n}\n\n#endif\n\n// RemoveFileName \"\" -> \"./\"\nTEST(RemoveFileNameTest, EmptyName) {\n#if GTEST_OS_WINDOWS_MOBILE\n  // On Windows CE, we use the root as the current directory.\n  EXPECT_EQ(GTEST_PATH_SEP_, FilePath(\"\").RemoveFileName().string());\n#else\n  EXPECT_EQ(\".\" GTEST_PATH_SEP_, FilePath(\"\").RemoveFileName().string());\n#endif\n}\n\n// RemoveFileName \"adir/\" -> \"adir/\"\nTEST(RemoveFileNameTest, ButNoFile) {\n  EXPECT_EQ(\"adir\" GTEST_PATH_SEP_,\n      FilePath(\"adir\" GTEST_PATH_SEP_).RemoveFileName().string());\n}\n\n// RemoveFileName \"adir/afile\" -> \"adir/\"\nTEST(RemoveFileNameTest, GivesDirName) {\n  EXPECT_EQ(\"adir\" GTEST_PATH_SEP_,\n            FilePath(\"adir\" GTEST_PATH_SEP_ \"afile\").RemoveFileName().string());\n}\n\n// RemoveFileName \"adir/subdir/afile\" -> \"adir/subdir/\"\nTEST(RemoveFileNameTest, GivesDirAndSubDirName) {\n  EXPECT_EQ(\"adir\" GTEST_PATH_SEP_ \"subdir\" GTEST_PATH_SEP_,\n      FilePath(\"adir\" GTEST_PATH_SEP_ \"subdir\" GTEST_PATH_SEP_ \"afile\")\n      .RemoveFileName().string());\n}\n\n// RemoveFileName \"/afile\" -> \"/\"\nTEST(RemoveFileNameTest, GivesRootDir) {\n  EXPECT_EQ(GTEST_PATH_SEP_,\n      FilePath(GTEST_PATH_SEP_ \"afile\").RemoveFileName().string());\n}\n\n#if GTEST_HAS_ALT_PATH_SEP_\n\n// Tests that RemoveFileName() works with the alternate separator on\n// Windows.\n\n// RemoveFileName(\"adir/\") -> \"adir/\"\nTEST(RemoveFileNameTest, ButNoFileForAlternateSeparator) {\n  EXPECT_EQ(\"adir\" GTEST_PATH_SEP_,\n            FilePath(\"adir/\").RemoveFileName().string());\n}\n\n// RemoveFileName(\"adir/afile\") -> \"adir/\"\nTEST(RemoveFileNameTest, GivesDirNameForAlternateSeparator) {\n  EXPECT_EQ(\"adir\" GTEST_PATH_SEP_,\n            FilePath(\"adir/afile\").RemoveFileName().string());\n}\n\n// RemoveFileName(\"adir/subdir/afile\") -> \"adir/subdir/\"\nTEST(RemoveFileNameTest, GivesDirAndSubDirNameForAlternateSeparator) {\n  EXPECT_EQ(\"adir\" GTEST_PATH_SEP_ \"subdir\" GTEST_PATH_SEP_,\n            FilePath(\"adir/subdir/afile\").RemoveFileName().string());\n}\n\n// RemoveFileName(\"/afile\") -> \"\\\"\nTEST(RemoveFileNameTest, GivesRootDirForAlternateSeparator) {\n  EXPECT_EQ(GTEST_PATH_SEP_, FilePath(\"/afile\").RemoveFileName().string());\n}\n\n#endif\n\nTEST(MakeFileNameTest, GenerateWhenNumberIsZero) {\n  FilePath actual = FilePath::MakeFileName(FilePath(\"foo\"), FilePath(\"bar\"),\n      0, \"xml\");\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_ \"bar.xml\", actual.string());\n}\n\nTEST(MakeFileNameTest, GenerateFileNameNumberGtZero) {\n  FilePath actual = FilePath::MakeFileName(FilePath(\"foo\"), FilePath(\"bar\"),\n      12, \"xml\");\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_ \"bar_12.xml\", actual.string());\n}\n\nTEST(MakeFileNameTest, GenerateFileNameWithSlashNumberIsZero) {\n  FilePath actual = FilePath::MakeFileName(FilePath(\"foo\" GTEST_PATH_SEP_),\n      FilePath(\"bar\"), 0, \"xml\");\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_ \"bar.xml\", actual.string());\n}\n\nTEST(MakeFileNameTest, GenerateFileNameWithSlashNumberGtZero) {\n  FilePath actual = FilePath::MakeFileName(FilePath(\"foo\" GTEST_PATH_SEP_),\n      FilePath(\"bar\"), 12, \"xml\");\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_ \"bar_12.xml\", actual.string());\n}\n\nTEST(MakeFileNameTest, GenerateWhenNumberIsZeroAndDirIsEmpty) {\n  FilePath actual = FilePath::MakeFileName(FilePath(\"\"), FilePath(\"bar\"),\n      0, \"xml\");\n  EXPECT_EQ(\"bar.xml\", actual.string());\n}\n\nTEST(MakeFileNameTest, GenerateWhenNumberIsNotZeroAndDirIsEmpty) {\n  FilePath actual = FilePath::MakeFileName(FilePath(\"\"), FilePath(\"bar\"),\n      14, \"xml\");\n  EXPECT_EQ(\"bar_14.xml\", actual.string());\n}\n\nTEST(ConcatPathsTest, WorksWhenDirDoesNotEndWithPathSep) {\n  FilePath actual = FilePath::ConcatPaths(FilePath(\"foo\"),\n                                          FilePath(\"bar.xml\"));\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_ \"bar.xml\", actual.string());\n}\n\nTEST(ConcatPathsTest, WorksWhenPath1EndsWithPathSep) {\n  FilePath actual = FilePath::ConcatPaths(FilePath(\"foo\" GTEST_PATH_SEP_),\n                                          FilePath(\"bar.xml\"));\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_ \"bar.xml\", actual.string());\n}\n\nTEST(ConcatPathsTest, Path1BeingEmpty) {\n  FilePath actual = FilePath::ConcatPaths(FilePath(\"\"),\n                                          FilePath(\"bar.xml\"));\n  EXPECT_EQ(\"bar.xml\", actual.string());\n}\n\nTEST(ConcatPathsTest, Path2BeingEmpty) {\n  FilePath actual = FilePath::ConcatPaths(FilePath(\"foo\"), FilePath(\"\"));\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_, actual.string());\n}\n\nTEST(ConcatPathsTest, BothPathBeingEmpty) {\n  FilePath actual = FilePath::ConcatPaths(FilePath(\"\"),\n                                          FilePath(\"\"));\n  EXPECT_EQ(\"\", actual.string());\n}\n\nTEST(ConcatPathsTest, Path1ContainsPathSep) {\n  FilePath actual = FilePath::ConcatPaths(FilePath(\"foo\" GTEST_PATH_SEP_ \"bar\"),\n                                          FilePath(\"foobar.xml\"));\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_ \"bar\" GTEST_PATH_SEP_ \"foobar.xml\",\n            actual.string());\n}\n\nTEST(ConcatPathsTest, Path2ContainsPathSep) {\n  FilePath actual = FilePath::ConcatPaths(\n      FilePath(\"foo\" GTEST_PATH_SEP_),\n      FilePath(\"bar\" GTEST_PATH_SEP_ \"bar.xml\"));\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_ \"bar\" GTEST_PATH_SEP_ \"bar.xml\",\n            actual.string());\n}\n\nTEST(ConcatPathsTest, Path2EndsWithPathSep) {\n  FilePath actual = FilePath::ConcatPaths(FilePath(\"foo\"),\n                                          FilePath(\"bar\" GTEST_PATH_SEP_));\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_ \"bar\" GTEST_PATH_SEP_, actual.string());\n}\n\n// RemoveTrailingPathSeparator \"\" -> \"\"\nTEST(RemoveTrailingPathSeparatorTest, EmptyString) {\n  EXPECT_EQ(\"\", FilePath(\"\").RemoveTrailingPathSeparator().string());\n}\n\n// RemoveTrailingPathSeparator \"foo\" -> \"foo\"\nTEST(RemoveTrailingPathSeparatorTest, FileNoSlashString) {\n  EXPECT_EQ(\"foo\", FilePath(\"foo\").RemoveTrailingPathSeparator().string());\n}\n\n// RemoveTrailingPathSeparator \"foo/\" -> \"foo\"\nTEST(RemoveTrailingPathSeparatorTest, ShouldRemoveTrailingSeparator) {\n  EXPECT_EQ(\"foo\",\n      FilePath(\"foo\" GTEST_PATH_SEP_).RemoveTrailingPathSeparator().string());\n#if GTEST_HAS_ALT_PATH_SEP_\n  EXPECT_EQ(\"foo\", FilePath(\"foo/\").RemoveTrailingPathSeparator().string());\n#endif\n}\n\n// RemoveTrailingPathSeparator \"foo/bar/\" -> \"foo/bar/\"\nTEST(RemoveTrailingPathSeparatorTest, ShouldRemoveLastSeparator) {\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_ \"bar\",\n            FilePath(\"foo\" GTEST_PATH_SEP_ \"bar\" GTEST_PATH_SEP_)\n                .RemoveTrailingPathSeparator().string());\n}\n\n// RemoveTrailingPathSeparator \"foo/bar\" -> \"foo/bar\"\nTEST(RemoveTrailingPathSeparatorTest, ShouldReturnUnmodified) {\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_ \"bar\",\n            FilePath(\"foo\" GTEST_PATH_SEP_ \"bar\")\n                .RemoveTrailingPathSeparator().string());\n}\n\nTEST(DirectoryTest, RootDirectoryExists) {\n#if GTEST_OS_WINDOWS  // We are on Windows.\n  char current_drive[_MAX_PATH];  // NOLINT\n  current_drive[0] = static_cast<char>(_getdrive() + 'A' - 1);\n  current_drive[1] = ':';\n  current_drive[2] = '\\\\';\n  current_drive[3] = '\\0';\n  EXPECT_TRUE(FilePath(current_drive).DirectoryExists());\n#else\n  EXPECT_TRUE(FilePath(\"/\").DirectoryExists());\n#endif  // GTEST_OS_WINDOWS\n}\n\n#if GTEST_OS_WINDOWS\nTEST(DirectoryTest, RootOfWrongDriveDoesNotExists) {\n  const int saved_drive_ = _getdrive();\n  // Find a drive that doesn't exist. Start with 'Z' to avoid common ones.\n  for (char drive = 'Z'; drive >= 'A'; drive--)\n    if (_chdrive(drive - 'A' + 1) == -1) {\n      char non_drive[_MAX_PATH];  // NOLINT\n      non_drive[0] = drive;\n      non_drive[1] = ':';\n      non_drive[2] = '\\\\';\n      non_drive[3] = '\\0';\n      EXPECT_FALSE(FilePath(non_drive).DirectoryExists());\n      break;\n    }\n  _chdrive(saved_drive_);\n}\n#endif  // GTEST_OS_WINDOWS\n\n#if !GTEST_OS_WINDOWS_MOBILE\n// Windows CE _does_ consider an empty directory to exist.\nTEST(DirectoryTest, EmptyPathDirectoryDoesNotExist) {\n  EXPECT_FALSE(FilePath(\"\").DirectoryExists());\n}\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\nTEST(DirectoryTest, CurrentDirectoryExists) {\n#if GTEST_OS_WINDOWS  // We are on Windows.\n# ifndef _WIN32_CE  // Windows CE doesn't have a current directory.\n\n  EXPECT_TRUE(FilePath(\".\").DirectoryExists());\n  EXPECT_TRUE(FilePath(\".\\\\\").DirectoryExists());\n\n# endif  // _WIN32_CE\n#else\n  EXPECT_TRUE(FilePath(\".\").DirectoryExists());\n  EXPECT_TRUE(FilePath(\"./\").DirectoryExists());\n#endif  // GTEST_OS_WINDOWS\n}\n\n// \"foo/bar\" == foo//bar\" == \"foo///bar\"\nTEST(NormalizeTest, MultipleConsecutiveSepaparatorsInMidstring) {\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_ \"bar\",\n            FilePath(\"foo\" GTEST_PATH_SEP_ \"bar\").string());\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_ \"bar\",\n            FilePath(\"foo\" GTEST_PATH_SEP_ GTEST_PATH_SEP_ \"bar\").string());\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_ \"bar\",\n            FilePath(\"foo\" GTEST_PATH_SEP_ GTEST_PATH_SEP_\n                     GTEST_PATH_SEP_ \"bar\").string());\n}\n\n// \"/bar\" == //bar\" == \"///bar\"\nTEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringStart) {\n  EXPECT_EQ(GTEST_PATH_SEP_ \"bar\",\n    FilePath(GTEST_PATH_SEP_ \"bar\").string());\n  EXPECT_EQ(GTEST_PATH_SEP_ \"bar\",\n    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ \"bar\").string());\n  EXPECT_EQ(GTEST_PATH_SEP_ \"bar\",\n    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_ \"bar\").string());\n}\n\n// \"foo/\" == foo//\" == \"foo///\"\nTEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringEnd) {\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_,\n    FilePath(\"foo\" GTEST_PATH_SEP_).string());\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_,\n    FilePath(\"foo\" GTEST_PATH_SEP_ GTEST_PATH_SEP_).string());\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_,\n    FilePath(\"foo\" GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_).string());\n}\n\n#if GTEST_HAS_ALT_PATH_SEP_\n\n// Tests that separators at the end of the string are normalized\n// regardless of their combination (e.g. \"foo\\\" ==\"foo/\\\" ==\n// \"foo\\\\/\").\nTEST(NormalizeTest, MixAlternateSeparatorAtStringEnd) {\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_,\n            FilePath(\"foo/\").string());\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_,\n            FilePath(\"foo\" GTEST_PATH_SEP_ \"/\").string());\n  EXPECT_EQ(\"foo\" GTEST_PATH_SEP_,\n            FilePath(\"foo//\" GTEST_PATH_SEP_).string());\n}\n\n#endif\n\nTEST(AssignmentOperatorTest, DefaultAssignedToNonDefault) {\n  FilePath default_path;\n  FilePath non_default_path(\"path\");\n  non_default_path = default_path;\n  EXPECT_EQ(\"\", non_default_path.string());\n  EXPECT_EQ(\"\", default_path.string());  // RHS var is unchanged.\n}\n\nTEST(AssignmentOperatorTest, NonDefaultAssignedToDefault) {\n  FilePath non_default_path(\"path\");\n  FilePath default_path;\n  default_path = non_default_path;\n  EXPECT_EQ(\"path\", default_path.string());\n  EXPECT_EQ(\"path\", non_default_path.string());  // RHS var is unchanged.\n}\n\nTEST(AssignmentOperatorTest, ConstAssignedToNonConst) {\n  const FilePath const_default_path(\"const_path\");\n  FilePath non_default_path(\"path\");\n  non_default_path = const_default_path;\n  EXPECT_EQ(\"const_path\", non_default_path.string());\n}\n\nclass DirectoryCreationTest : public Test {\n protected:\n  virtual void SetUp() {\n    testdata_path_.Set(FilePath(\n        TempDir() + GetCurrentExecutableName().string() +\n        \"_directory_creation\" GTEST_PATH_SEP_ \"test\" GTEST_PATH_SEP_));\n    testdata_file_.Set(testdata_path_.RemoveTrailingPathSeparator());\n\n    unique_file0_.Set(FilePath::MakeFileName(testdata_path_, FilePath(\"unique\"),\n        0, \"txt\"));\n    unique_file1_.Set(FilePath::MakeFileName(testdata_path_, FilePath(\"unique\"),\n        1, \"txt\"));\n\n    remove(testdata_file_.c_str());\n    remove(unique_file0_.c_str());\n    remove(unique_file1_.c_str());\n    posix::RmDir(testdata_path_.c_str());\n  }\n\n  virtual void TearDown() {\n    remove(testdata_file_.c_str());\n    remove(unique_file0_.c_str());\n    remove(unique_file1_.c_str());\n    posix::RmDir(testdata_path_.c_str());\n  }\n\n  void CreateTextFile(const char* filename) {\n    FILE* f = posix::FOpen(filename, \"w\");\n    fprintf(f, \"text\\n\");\n    fclose(f);\n  }\n\n  // Strings representing a directory and a file, with identical paths\n  // except for the trailing separator character that distinquishes\n  // a directory named 'test' from a file named 'test'. Example names:\n  FilePath testdata_path_;  // \"/tmp/directory_creation/test/\"\n  FilePath testdata_file_;  // \"/tmp/directory_creation/test\"\n  FilePath unique_file0_;  // \"/tmp/directory_creation/test/unique.txt\"\n  FilePath unique_file1_;  // \"/tmp/directory_creation/test/unique_1.txt\"\n};\n\nTEST_F(DirectoryCreationTest, CreateDirectoriesRecursively) {\n  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();\n  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());\n  EXPECT_TRUE(testdata_path_.DirectoryExists());\n}\n\nTEST_F(DirectoryCreationTest, CreateDirectoriesForAlreadyExistingPath) {\n  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();\n  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());\n  // Call 'create' again... should still succeed.\n  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());\n}\n\nTEST_F(DirectoryCreationTest, CreateDirectoriesAndUniqueFilename) {\n  FilePath file_path(FilePath::GenerateUniqueFileName(testdata_path_,\n      FilePath(\"unique\"), \"txt\"));\n  EXPECT_EQ(unique_file0_.string(), file_path.string());\n  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file not there\n\n  testdata_path_.CreateDirectoriesRecursively();\n  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file still not there\n  CreateTextFile(file_path.c_str());\n  EXPECT_TRUE(file_path.FileOrDirectoryExists());\n\n  FilePath file_path2(FilePath::GenerateUniqueFileName(testdata_path_,\n      FilePath(\"unique\"), \"txt\"));\n  EXPECT_EQ(unique_file1_.string(), file_path2.string());\n  EXPECT_FALSE(file_path2.FileOrDirectoryExists());  // file not there\n  CreateTextFile(file_path2.c_str());\n  EXPECT_TRUE(file_path2.FileOrDirectoryExists());\n}\n\nTEST_F(DirectoryCreationTest, CreateDirectoriesFail) {\n  // force a failure by putting a file where we will try to create a directory.\n  CreateTextFile(testdata_file_.c_str());\n  EXPECT_TRUE(testdata_file_.FileOrDirectoryExists());\n  EXPECT_FALSE(testdata_file_.DirectoryExists());\n  EXPECT_FALSE(testdata_file_.CreateDirectoriesRecursively());\n}\n\nTEST(NoDirectoryCreationTest, CreateNoDirectoriesForDefaultXmlFile) {\n  const FilePath test_detail_xml(\"test_detail.xml\");\n  EXPECT_FALSE(test_detail_xml.CreateDirectoriesRecursively());\n}\n\nTEST(FilePathTest, DefaultConstructor) {\n  FilePath fp;\n  EXPECT_EQ(\"\", fp.string());\n}\n\nTEST(FilePathTest, CharAndCopyConstructors) {\n  const FilePath fp(\"spicy\");\n  EXPECT_EQ(\"spicy\", fp.string());\n\n  const FilePath fp_copy(fp);\n  EXPECT_EQ(\"spicy\", fp_copy.string());\n}\n\nTEST(FilePathTest, StringConstructor) {\n  const FilePath fp(std::string(\"cider\"));\n  EXPECT_EQ(\"cider\", fp.string());\n}\n\nTEST(FilePathTest, Set) {\n  const FilePath apple(\"apple\");\n  FilePath mac(\"mac\");\n  mac.Set(apple);  // Implement Set() since overloading operator= is forbidden.\n  EXPECT_EQ(\"apple\", mac.string());\n  EXPECT_EQ(\"apple\", apple.string());\n}\n\nTEST(FilePathTest, ToString) {\n  const FilePath file(\"drink\");\n  EXPECT_EQ(\"drink\", file.string());\n}\n\nTEST(FilePathTest, RemoveExtension) {\n  EXPECT_EQ(\"app\", FilePath(\"app.cc\").RemoveExtension(\"cc\").string());\n  EXPECT_EQ(\"app\", FilePath(\"app.exe\").RemoveExtension(\"exe\").string());\n  EXPECT_EQ(\"APP\", FilePath(\"APP.EXE\").RemoveExtension(\"exe\").string());\n}\n\nTEST(FilePathTest, RemoveExtensionWhenThereIsNoExtension) {\n  EXPECT_EQ(\"app\", FilePath(\"app\").RemoveExtension(\"exe\").string());\n}\n\nTEST(FilePathTest, IsDirectory) {\n  EXPECT_FALSE(FilePath(\"cola\").IsDirectory());\n  EXPECT_TRUE(FilePath(\"koala\" GTEST_PATH_SEP_).IsDirectory());\n#if GTEST_HAS_ALT_PATH_SEP_\n  EXPECT_TRUE(FilePath(\"koala/\").IsDirectory());\n#endif\n}\n\nTEST(FilePathTest, IsAbsolutePath) {\n  EXPECT_FALSE(FilePath(\"is\" GTEST_PATH_SEP_ \"relative\").IsAbsolutePath());\n  EXPECT_FALSE(FilePath(\"\").IsAbsolutePath());\n#if GTEST_OS_WINDOWS\n  EXPECT_TRUE(FilePath(\"c:\\\\\" GTEST_PATH_SEP_ \"is_not\"\n                       GTEST_PATH_SEP_ \"relative\").IsAbsolutePath());\n  EXPECT_FALSE(FilePath(\"c:foo\" GTEST_PATH_SEP_ \"bar\").IsAbsolutePath());\n  EXPECT_TRUE(FilePath(\"c:/\" GTEST_PATH_SEP_ \"is_not\"\n                       GTEST_PATH_SEP_ \"relative\").IsAbsolutePath());\n#else\n  EXPECT_TRUE(FilePath(GTEST_PATH_SEP_ \"is_not\" GTEST_PATH_SEP_ \"relative\")\n              .IsAbsolutePath());\n#endif  // GTEST_OS_WINDOWS\n}\n\nTEST(FilePathTest, IsRootDirectory) {\n#if GTEST_OS_WINDOWS\n  EXPECT_TRUE(FilePath(\"a:\\\\\").IsRootDirectory());\n  EXPECT_TRUE(FilePath(\"Z:/\").IsRootDirectory());\n  EXPECT_TRUE(FilePath(\"e://\").IsRootDirectory());\n  EXPECT_FALSE(FilePath(\"\").IsRootDirectory());\n  EXPECT_FALSE(FilePath(\"b:\").IsRootDirectory());\n  EXPECT_FALSE(FilePath(\"b:a\").IsRootDirectory());\n  EXPECT_FALSE(FilePath(\"8:/\").IsRootDirectory());\n  EXPECT_FALSE(FilePath(\"c|/\").IsRootDirectory());\n#else\n  EXPECT_TRUE(FilePath(\"/\").IsRootDirectory());\n  EXPECT_TRUE(FilePath(\"//\").IsRootDirectory());\n  EXPECT_FALSE(FilePath(\"\").IsRootDirectory());\n  EXPECT_FALSE(FilePath(\"\\\\\").IsRootDirectory());\n  EXPECT_FALSE(FilePath(\"/x\").IsRootDirectory());\n#endif\n}\n\n}  // namespace\n}  // namespace internal\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-filter-unittest.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2005 Google Inc. All Rights Reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test for Google Test test filters.\n\nA user can specify which test(s) in a Google Test program to run via either\nthe GTEST_FILTER environment variable or the --gtest_filter flag.\nThis script tests such functionality by invoking\ngoogletest-filter-unittest_ (a program written with Google Test) with different\nenvironments and command line flags.\n\nNote that test sharding may also influence which tests are filtered. Therefore,\nwe test that here also.\n\"\"\"\n\nimport os\nimport re\nimport sets\nimport sys\nimport gtest_test_utils\n\n# Constants.\n\n# Checks if this platform can pass empty environment variables to child\n# processes.  We set an env variable to an empty string and invoke a python\n# script in a subprocess to print whether the variable is STILL in\n# os.environ.  We then use 'eval' to parse the child's output so that an\n# exception is thrown if the input is anything other than 'True' nor 'False'.\nCAN_PASS_EMPTY_ENV = False\nif sys.executable:\n  os.environ['EMPTY_VAR'] = ''\n  child = gtest_test_utils.Subprocess(\n      [sys.executable, '-c', 'import os; print \\'EMPTY_VAR\\' in os.environ'])\n  CAN_PASS_EMPTY_ENV = eval(child.output)\n\n\n# Check if this platform can unset environment variables in child processes.\n# We set an env variable to a non-empty string, unset it, and invoke\n# a python script in a subprocess to print whether the variable\n# is NO LONGER in os.environ.\n# We use 'eval' to parse the child's output so that an exception\n# is thrown if the input is neither 'True' nor 'False'.\nCAN_UNSET_ENV = False\nif sys.executable:\n  os.environ['UNSET_VAR'] = 'X'\n  del os.environ['UNSET_VAR']\n  child = gtest_test_utils.Subprocess(\n      [sys.executable, '-c', 'import os; print \\'UNSET_VAR\\' not in os.environ'\n      ])\n  CAN_UNSET_ENV = eval(child.output)\n\n\n# Checks if we should test with an empty filter. This doesn't\n# make sense on platforms that cannot pass empty env variables (Win32)\n# and on platforms that cannot unset variables (since we cannot tell\n# the difference between \"\" and NULL -- Borland and Solaris < 5.10)\nCAN_TEST_EMPTY_FILTER = (CAN_PASS_EMPTY_ENV and CAN_UNSET_ENV)\n\n\n# The environment variable for specifying the test filters.\nFILTER_ENV_VAR = 'GTEST_FILTER'\n\n# The environment variables for test sharding.\nTOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'\nSHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'\nSHARD_STATUS_FILE_ENV_VAR = 'GTEST_SHARD_STATUS_FILE'\n\n# The command line flag for specifying the test filters.\nFILTER_FLAG = 'gtest_filter'\n\n# The command line flag for including disabled tests.\nALSO_RUN_DISABLED_TESTS_FLAG = 'gtest_also_run_disabled_tests'\n\n# Command to run the googletest-filter-unittest_ program.\nCOMMAND = gtest_test_utils.GetTestExecutablePath('googletest-filter-unittest_')\n\n# Regex for determining whether parameterized tests are enabled in the binary.\nPARAM_TEST_REGEX = re.compile(r'/ParamTest')\n\n# Regex for parsing test case names from Google Test's output.\nTEST_CASE_REGEX = re.compile(r'^\\[\\-+\\] \\d+ tests? from (\\w+(/\\w+)?)')\n\n# Regex for parsing test names from Google Test's output.\nTEST_REGEX = re.compile(r'^\\[\\s*RUN\\s*\\].*\\.(\\w+(/\\w+)?)')\n\n# The command line flag to tell Google Test to output the list of tests it\n# will run.\nLIST_TESTS_FLAG = '--gtest_list_tests'\n\n# Indicates whether Google Test supports death tests.\nSUPPORTS_DEATH_TESTS = 'HasDeathTest' in gtest_test_utils.Subprocess(\n    [COMMAND, LIST_TESTS_FLAG]).output\n\n# Full names of all tests in googletest-filter-unittests_.\nPARAM_TESTS = [\n    'SeqP/ParamTest.TestX/0',\n    'SeqP/ParamTest.TestX/1',\n    'SeqP/ParamTest.TestY/0',\n    'SeqP/ParamTest.TestY/1',\n    'SeqQ/ParamTest.TestX/0',\n    'SeqQ/ParamTest.TestX/1',\n    'SeqQ/ParamTest.TestY/0',\n    'SeqQ/ParamTest.TestY/1',\n    ]\n\nDISABLED_TESTS = [\n    'BarTest.DISABLED_TestFour',\n    'BarTest.DISABLED_TestFive',\n    'BazTest.DISABLED_TestC',\n    'DISABLED_FoobarTest.Test1',\n    'DISABLED_FoobarTest.DISABLED_Test2',\n    'DISABLED_FoobarbazTest.TestA',\n    ]\n\nif SUPPORTS_DEATH_TESTS:\n  DEATH_TESTS = [\n    'HasDeathTest.Test1',\n    'HasDeathTest.Test2',\n    ]\nelse:\n  DEATH_TESTS = []\n\n# All the non-disabled tests.\nACTIVE_TESTS = [\n    'FooTest.Abc',\n    'FooTest.Xyz',\n\n    'BarTest.TestOne',\n    'BarTest.TestTwo',\n    'BarTest.TestThree',\n\n    'BazTest.TestOne',\n    'BazTest.TestA',\n    'BazTest.TestB',\n    ] + DEATH_TESTS + PARAM_TESTS\n\nparam_tests_present = None\n\n# Utilities.\n\nenviron = os.environ.copy()\n\n\ndef SetEnvVar(env_var, value):\n  \"\"\"Sets the env variable to 'value'; unsets it when 'value' is None.\"\"\"\n\n  if value is not None:\n    environ[env_var] = value\n  elif env_var in environ:\n    del environ[env_var]\n\n\ndef RunAndReturnOutput(args = None):\n  \"\"\"Runs the test program and returns its output.\"\"\"\n\n  return gtest_test_utils.Subprocess([COMMAND] + (args or []),\n                                     env=environ).output\n\n\ndef RunAndExtractTestList(args = None):\n  \"\"\"Runs the test program and returns its exit code and a list of tests run.\"\"\"\n\n  p = gtest_test_utils.Subprocess([COMMAND] + (args or []), env=environ)\n  tests_run = []\n  test_case = ''\n  test = ''\n  for line in p.output.split('\\n'):\n    match = TEST_CASE_REGEX.match(line)\n    if match is not None:\n      test_case = match.group(1)\n    else:\n      match = TEST_REGEX.match(line)\n      if match is not None:\n        test = match.group(1)\n        tests_run.append(test_case + '.' + test)\n  return (tests_run, p.exit_code)\n\n\ndef InvokeWithModifiedEnv(extra_env, function, *args, **kwargs):\n  \"\"\"Runs the given function and arguments in a modified environment.\"\"\"\n  try:\n    original_env = environ.copy()\n    environ.update(extra_env)\n    return function(*args, **kwargs)\n  finally:\n    environ.clear()\n    environ.update(original_env)\n\n\ndef RunWithSharding(total_shards, shard_index, command):\n  \"\"\"Runs a test program shard and returns exit code and a list of tests run.\"\"\"\n\n  extra_env = {SHARD_INDEX_ENV_VAR: str(shard_index),\n               TOTAL_SHARDS_ENV_VAR: str(total_shards)}\n  return InvokeWithModifiedEnv(extra_env, RunAndExtractTestList, command)\n\n# The unit test.\n\n\nclass GTestFilterUnitTest(gtest_test_utils.TestCase):\n  \"\"\"Tests the env variable or the command line flag to filter tests.\"\"\"\n\n  # Utilities.\n\n  def AssertSetEqual(self, lhs, rhs):\n    \"\"\"Asserts that two sets are equal.\"\"\"\n\n    for elem in lhs:\n      self.assert_(elem in rhs, '%s in %s' % (elem, rhs))\n\n    for elem in rhs:\n      self.assert_(elem in lhs, '%s in %s' % (elem, lhs))\n\n  def AssertPartitionIsValid(self, set_var, list_of_sets):\n    \"\"\"Asserts that list_of_sets is a valid partition of set_var.\"\"\"\n\n    full_partition = []\n    for slice_var in list_of_sets:\n      full_partition.extend(slice_var)\n    self.assertEqual(len(set_var), len(full_partition))\n    self.assertEqual(sets.Set(set_var), sets.Set(full_partition))\n\n  def AdjustForParameterizedTests(self, tests_to_run):\n    \"\"\"Adjust tests_to_run in case value parameterized tests are disabled.\"\"\"\n\n    global param_tests_present\n    if not param_tests_present:\n      return list(sets.Set(tests_to_run) - sets.Set(PARAM_TESTS))\n    else:\n      return tests_to_run\n\n  def RunAndVerify(self, gtest_filter, tests_to_run):\n    \"\"\"Checks that the binary runs correct set of tests for a given filter.\"\"\"\n\n    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)\n\n    # First, tests using the environment variable.\n\n    # Windows removes empty variables from the environment when passing it\n    # to a new process.  This means it is impossible to pass an empty filter\n    # into a process using the environment variable.  However, we can still\n    # test the case when the variable is not supplied (i.e., gtest_filter is\n    # None).\n    # pylint: disable-msg=C6403\n    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':\n      SetEnvVar(FILTER_ENV_VAR, gtest_filter)\n      tests_run = RunAndExtractTestList()[0]\n      SetEnvVar(FILTER_ENV_VAR, None)\n      self.AssertSetEqual(tests_run, tests_to_run)\n    # pylint: enable-msg=C6403\n\n    # Next, tests using the command line flag.\n\n    if gtest_filter is None:\n      args = []\n    else:\n      args = ['--%s=%s' % (FILTER_FLAG, gtest_filter)]\n\n    tests_run = RunAndExtractTestList(args)[0]\n    self.AssertSetEqual(tests_run, tests_to_run)\n\n  def RunAndVerifyWithSharding(self, gtest_filter, total_shards, tests_to_run,\n                               args=None, check_exit_0=False):\n    \"\"\"Checks that binary runs correct tests for the given filter and shard.\n\n    Runs all shards of googletest-filter-unittest_ with the given filter, and\n    verifies that the right set of tests were run. The union of tests run\n    on each shard should be identical to tests_to_run, without duplicates.\n    If check_exit_0, .\n\n    Args:\n      gtest_filter: A filter to apply to the tests.\n      total_shards: A total number of shards to split test run into.\n      tests_to_run: A set of tests expected to run.\n      args   :      Arguments to pass to the to the test binary.\n      check_exit_0: When set to a true value, make sure that all shards\n                    return 0.\n    \"\"\"\n\n    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)\n\n    # Windows removes empty variables from the environment when passing it\n    # to a new process.  This means it is impossible to pass an empty filter\n    # into a process using the environment variable.  However, we can still\n    # test the case when the variable is not supplied (i.e., gtest_filter is\n    # None).\n    # pylint: disable-msg=C6403\n    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':\n      SetEnvVar(FILTER_ENV_VAR, gtest_filter)\n      partition = []\n      for i in range(0, total_shards):\n        (tests_run, exit_code) = RunWithSharding(total_shards, i, args)\n        if check_exit_0:\n          self.assertEqual(0, exit_code)\n        partition.append(tests_run)\n\n      self.AssertPartitionIsValid(tests_to_run, partition)\n      SetEnvVar(FILTER_ENV_VAR, None)\n    # pylint: enable-msg=C6403\n\n  def RunAndVerifyAllowingDisabled(self, gtest_filter, tests_to_run):\n    \"\"\"Checks that the binary runs correct set of tests for the given filter.\n\n    Runs googletest-filter-unittest_ with the given filter, and enables\n    disabled tests. Verifies that the right set of tests were run.\n\n    Args:\n      gtest_filter: A filter to apply to the tests.\n      tests_to_run: A set of tests expected to run.\n    \"\"\"\n\n    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)\n\n    # Construct the command line.\n    args = ['--%s' % ALSO_RUN_DISABLED_TESTS_FLAG]\n    if gtest_filter is not None:\n      args.append('--%s=%s' % (FILTER_FLAG, gtest_filter))\n\n    tests_run = RunAndExtractTestList(args)[0]\n    self.AssertSetEqual(tests_run, tests_to_run)\n\n  def setUp(self):\n    \"\"\"Sets up test case.\n\n    Determines whether value-parameterized tests are enabled in the binary and\n    sets the flags accordingly.\n    \"\"\"\n\n    global param_tests_present\n    if param_tests_present is None:\n      param_tests_present = PARAM_TEST_REGEX.search(\n          RunAndReturnOutput()) is not None\n\n  def testDefaultBehavior(self):\n    \"\"\"Tests the behavior of not specifying the filter.\"\"\"\n\n    self.RunAndVerify(None, ACTIVE_TESTS)\n\n  def testDefaultBehaviorWithShards(self):\n    \"\"\"Tests the behavior without the filter, with sharding enabled.\"\"\"\n\n    self.RunAndVerifyWithSharding(None, 1, ACTIVE_TESTS)\n    self.RunAndVerifyWithSharding(None, 2, ACTIVE_TESTS)\n    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) - 1, ACTIVE_TESTS)\n    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS), ACTIVE_TESTS)\n    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) + 1, ACTIVE_TESTS)\n\n  def testEmptyFilter(self):\n    \"\"\"Tests an empty filter.\"\"\"\n\n    self.RunAndVerify('', [])\n    self.RunAndVerifyWithSharding('', 1, [])\n    self.RunAndVerifyWithSharding('', 2, [])\n\n  def testBadFilter(self):\n    \"\"\"Tests a filter that matches nothing.\"\"\"\n\n    self.RunAndVerify('BadFilter', [])\n    self.RunAndVerifyAllowingDisabled('BadFilter', [])\n\n  def testFullName(self):\n    \"\"\"Tests filtering by full name.\"\"\"\n\n    self.RunAndVerify('FooTest.Xyz', ['FooTest.Xyz'])\n    self.RunAndVerifyAllowingDisabled('FooTest.Xyz', ['FooTest.Xyz'])\n    self.RunAndVerifyWithSharding('FooTest.Xyz', 5, ['FooTest.Xyz'])\n\n  def testUniversalFilters(self):\n    \"\"\"Tests filters that match everything.\"\"\"\n\n    self.RunAndVerify('*', ACTIVE_TESTS)\n    self.RunAndVerify('*.*', ACTIVE_TESTS)\n    self.RunAndVerifyWithSharding('*.*', len(ACTIVE_TESTS) - 3, ACTIVE_TESTS)\n    self.RunAndVerifyAllowingDisabled('*', ACTIVE_TESTS + DISABLED_TESTS)\n    self.RunAndVerifyAllowingDisabled('*.*', ACTIVE_TESTS + DISABLED_TESTS)\n\n  def testFilterByTestCase(self):\n    \"\"\"Tests filtering by test case name.\"\"\"\n\n    self.RunAndVerify('FooTest.*', ['FooTest.Abc', 'FooTest.Xyz'])\n\n    BAZ_TESTS = ['BazTest.TestOne', 'BazTest.TestA', 'BazTest.TestB']\n    self.RunAndVerify('BazTest.*', BAZ_TESTS)\n    self.RunAndVerifyAllowingDisabled('BazTest.*',\n                                      BAZ_TESTS + ['BazTest.DISABLED_TestC'])\n\n  def testFilterByTest(self):\n    \"\"\"Tests filtering by test name.\"\"\"\n\n    self.RunAndVerify('*.TestOne', ['BarTest.TestOne', 'BazTest.TestOne'])\n\n  def testFilterDisabledTests(self):\n    \"\"\"Select only the disabled tests to run.\"\"\"\n\n    self.RunAndVerify('DISABLED_FoobarTest.Test1', [])\n    self.RunAndVerifyAllowingDisabled('DISABLED_FoobarTest.Test1',\n                                      ['DISABLED_FoobarTest.Test1'])\n\n    self.RunAndVerify('*DISABLED_*', [])\n    self.RunAndVerifyAllowingDisabled('*DISABLED_*', DISABLED_TESTS)\n\n    self.RunAndVerify('*.DISABLED_*', [])\n    self.RunAndVerifyAllowingDisabled('*.DISABLED_*', [\n        'BarTest.DISABLED_TestFour',\n        'BarTest.DISABLED_TestFive',\n        'BazTest.DISABLED_TestC',\n        'DISABLED_FoobarTest.DISABLED_Test2',\n        ])\n\n    self.RunAndVerify('DISABLED_*', [])\n    self.RunAndVerifyAllowingDisabled('DISABLED_*', [\n        'DISABLED_FoobarTest.Test1',\n        'DISABLED_FoobarTest.DISABLED_Test2',\n        'DISABLED_FoobarbazTest.TestA',\n        ])\n\n  def testWildcardInTestCaseName(self):\n    \"\"\"Tests using wildcard in the test case name.\"\"\"\n\n    self.RunAndVerify('*a*.*', [\n        'BarTest.TestOne',\n        'BarTest.TestTwo',\n        'BarTest.TestThree',\n\n        'BazTest.TestOne',\n        'BazTest.TestA',\n        'BazTest.TestB', ] + DEATH_TESTS + PARAM_TESTS)\n\n  def testWildcardInTestName(self):\n    \"\"\"Tests using wildcard in the test name.\"\"\"\n\n    self.RunAndVerify('*.*A*', ['FooTest.Abc', 'BazTest.TestA'])\n\n  def testFilterWithoutDot(self):\n    \"\"\"Tests a filter that has no '.' in it.\"\"\"\n\n    self.RunAndVerify('*z*', [\n        'FooTest.Xyz',\n\n        'BazTest.TestOne',\n        'BazTest.TestA',\n        'BazTest.TestB',\n        ])\n\n  def testTwoPatterns(self):\n    \"\"\"Tests filters that consist of two patterns.\"\"\"\n\n    self.RunAndVerify('Foo*.*:*A*', [\n        'FooTest.Abc',\n        'FooTest.Xyz',\n\n        'BazTest.TestA',\n        ])\n\n    # An empty pattern + a non-empty one\n    self.RunAndVerify(':*A*', ['FooTest.Abc', 'BazTest.TestA'])\n\n  def testThreePatterns(self):\n    \"\"\"Tests filters that consist of three patterns.\"\"\"\n\n    self.RunAndVerify('*oo*:*A*:*One', [\n        'FooTest.Abc',\n        'FooTest.Xyz',\n\n        'BarTest.TestOne',\n\n        'BazTest.TestOne',\n        'BazTest.TestA',\n        ])\n\n    # The 2nd pattern is empty.\n    self.RunAndVerify('*oo*::*One', [\n        'FooTest.Abc',\n        'FooTest.Xyz',\n\n        'BarTest.TestOne',\n\n        'BazTest.TestOne',\n        ])\n\n    # The last 2 patterns are empty.\n    self.RunAndVerify('*oo*::', [\n        'FooTest.Abc',\n        'FooTest.Xyz',\n        ])\n\n  def testNegativeFilters(self):\n    self.RunAndVerify('*-BazTest.TestOne', [\n        'FooTest.Abc',\n        'FooTest.Xyz',\n\n        'BarTest.TestOne',\n        'BarTest.TestTwo',\n        'BarTest.TestThree',\n\n        'BazTest.TestA',\n        'BazTest.TestB',\n        ] + DEATH_TESTS + PARAM_TESTS)\n\n    self.RunAndVerify('*-FooTest.Abc:BazTest.*', [\n        'FooTest.Xyz',\n\n        'BarTest.TestOne',\n        'BarTest.TestTwo',\n        'BarTest.TestThree',\n        ] + DEATH_TESTS + PARAM_TESTS)\n\n    self.RunAndVerify('BarTest.*-BarTest.TestOne', [\n        'BarTest.TestTwo',\n        'BarTest.TestThree',\n        ])\n\n    # Tests without leading '*'.\n    self.RunAndVerify('-FooTest.Abc:FooTest.Xyz:BazTest.*', [\n        'BarTest.TestOne',\n        'BarTest.TestTwo',\n        'BarTest.TestThree',\n        ] + DEATH_TESTS + PARAM_TESTS)\n\n    # Value parameterized tests.\n    self.RunAndVerify('*/*', PARAM_TESTS)\n\n    # Value parameterized tests filtering by the sequence name.\n    self.RunAndVerify('SeqP/*', [\n        'SeqP/ParamTest.TestX/0',\n        'SeqP/ParamTest.TestX/1',\n        'SeqP/ParamTest.TestY/0',\n        'SeqP/ParamTest.TestY/1',\n        ])\n\n    # Value parameterized tests filtering by the test name.\n    self.RunAndVerify('*/0', [\n        'SeqP/ParamTest.TestX/0',\n        'SeqP/ParamTest.TestY/0',\n        'SeqQ/ParamTest.TestX/0',\n        'SeqQ/ParamTest.TestY/0',\n        ])\n\n  def testFlagOverridesEnvVar(self):\n    \"\"\"Tests that the filter flag overrides the filtering env. variable.\"\"\"\n\n    SetEnvVar(FILTER_ENV_VAR, 'Foo*')\n    args = ['--%s=%s' % (FILTER_FLAG, '*One')]\n    tests_run = RunAndExtractTestList(args)[0]\n    SetEnvVar(FILTER_ENV_VAR, None)\n\n    self.AssertSetEqual(tests_run, ['BarTest.TestOne', 'BazTest.TestOne'])\n\n  def testShardStatusFileIsCreated(self):\n    \"\"\"Tests that the shard file is created if specified in the environment.\"\"\"\n\n    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),\n                                     'shard_status_file')\n    self.assert_(not os.path.exists(shard_status_file))\n\n    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}\n    try:\n      InvokeWithModifiedEnv(extra_env, RunAndReturnOutput)\n    finally:\n      self.assert_(os.path.exists(shard_status_file))\n      os.remove(shard_status_file)\n\n  def testShardStatusFileIsCreatedWithListTests(self):\n    \"\"\"Tests that the shard file is created with the \"list_tests\" flag.\"\"\"\n\n    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),\n                                     'shard_status_file2')\n    self.assert_(not os.path.exists(shard_status_file))\n\n    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}\n    try:\n      output = InvokeWithModifiedEnv(extra_env,\n                                     RunAndReturnOutput,\n                                     [LIST_TESTS_FLAG])\n    finally:\n      # This assertion ensures that Google Test enumerated the tests as\n      # opposed to running them.\n      self.assert_('[==========]' not in output,\n                   'Unexpected output during test enumeration.\\n'\n                   'Please ensure that LIST_TESTS_FLAG is assigned the\\n'\n                   'correct flag value for listing Google Test tests.')\n\n      self.assert_(os.path.exists(shard_status_file))\n      os.remove(shard_status_file)\n\n  if SUPPORTS_DEATH_TESTS:\n    def testShardingWorksWithDeathTests(self):\n      \"\"\"Tests integration with death tests and sharding.\"\"\"\n\n      gtest_filter = 'HasDeathTest.*:SeqP/*'\n      expected_tests = [\n          'HasDeathTest.Test1',\n          'HasDeathTest.Test2',\n\n          'SeqP/ParamTest.TestX/0',\n          'SeqP/ParamTest.TestX/1',\n          'SeqP/ParamTest.TestY/0',\n          'SeqP/ParamTest.TestY/1',\n          ]\n\n      for flag in ['--gtest_death_test_style=threadsafe',\n                   '--gtest_death_test_style=fast']:\n        self.RunAndVerifyWithSharding(gtest_filter, 3, expected_tests,\n                                      check_exit_0=True, args=[flag])\n        self.RunAndVerifyWithSharding(gtest_filter, 5, expected_tests,\n                                      check_exit_0=True, args=[flag])\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-filter-unittest_.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Unit test for Google Test test filters.\n//\n// A user can specify which test(s) in a Google Test program to run via\n// either the GTEST_FILTER environment variable or the --gtest_filter\n// flag.  This is used for testing such functionality.\n//\n// The program will be invoked from a Python unit test.  Don't run it\n// directly.\n\n#include \"gtest/gtest.h\"\n\nnamespace {\n\n// Test case FooTest.\n\nclass FooTest : public testing::Test {\n};\n\nTEST_F(FooTest, Abc) {\n}\n\nTEST_F(FooTest, Xyz) {\n  FAIL() << \"Expected failure.\";\n}\n\n// Test case BarTest.\n\nTEST(BarTest, TestOne) {\n}\n\nTEST(BarTest, TestTwo) {\n}\n\nTEST(BarTest, TestThree) {\n}\n\nTEST(BarTest, DISABLED_TestFour) {\n  FAIL() << \"Expected failure.\";\n}\n\nTEST(BarTest, DISABLED_TestFive) {\n  FAIL() << \"Expected failure.\";\n}\n\n// Test case BazTest.\n\nTEST(BazTest, TestOne) {\n  FAIL() << \"Expected failure.\";\n}\n\nTEST(BazTest, TestA) {\n}\n\nTEST(BazTest, TestB) {\n}\n\nTEST(BazTest, DISABLED_TestC) {\n  FAIL() << \"Expected failure.\";\n}\n\n// Test case HasDeathTest\n\nTEST(HasDeathTest, Test1) {\n  EXPECT_DEATH_IF_SUPPORTED(exit(1), \".*\");\n}\n\n// We need at least two death tests to make sure that the all death tests\n// aren't on the first shard.\nTEST(HasDeathTest, Test2) {\n  EXPECT_DEATH_IF_SUPPORTED(exit(1), \".*\");\n}\n\n// Test case FoobarTest\n\nTEST(DISABLED_FoobarTest, Test1) {\n  FAIL() << \"Expected failure.\";\n}\n\nTEST(DISABLED_FoobarTest, DISABLED_Test2) {\n  FAIL() << \"Expected failure.\";\n}\n\n// Test case FoobarbazTest\n\nTEST(DISABLED_FoobarbazTest, TestA) {\n  FAIL() << \"Expected failure.\";\n}\n\nclass ParamTest : public testing::TestWithParam<int> {\n};\n\nTEST_P(ParamTest, TestX) {\n}\n\nTEST_P(ParamTest, TestY) {\n}\n\nINSTANTIATE_TEST_CASE_P(SeqP, ParamTest, testing::Values(1, 2));\nINSTANTIATE_TEST_CASE_P(SeqQ, ParamTest, testing::Values(5, 6));\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  ::testing::InitGoogleTest(&argc, argv);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-json-outfiles-test.py",
    "content": "#!/usr/bin/env python\n# Copyright 2018, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test for the gtest_json_output module.\"\"\"\n\nimport json\nimport os\nimport gtest_json_test_utils\nimport gtest_test_utils\n\nGTEST_OUTPUT_SUBDIR = 'json_outfiles'\nGTEST_OUTPUT_1_TEST = 'gtest_xml_outfile1_test_'\nGTEST_OUTPUT_2_TEST = 'gtest_xml_outfile2_test_'\n\nEXPECTED_1 = {\n    u'tests': 1,\n    u'failures': 0,\n    u'disabled': 0,\n    u'errors': 0,\n    u'time': u'*',\n    u'timestamp': u'*',\n    u'name': u'AllTests',\n    u'testsuites': [{\n        u'name': u'PropertyOne',\n        u'tests': 1,\n        u'failures': 0,\n        u'disabled': 0,\n        u'errors': 0,\n        u'time': u'*',\n        u'testsuite': [{\n            u'name': u'TestSomeProperties',\n            u'status': u'RUN',\n            u'time': u'*',\n            u'classname': u'PropertyOne',\n            u'SetUpProp': u'1',\n            u'TestSomeProperty': u'1',\n            u'TearDownProp': u'1',\n        }],\n    }],\n}\n\nEXPECTED_2 = {\n    u'tests': 1,\n    u'failures': 0,\n    u'disabled': 0,\n    u'errors': 0,\n    u'time': u'*',\n    u'timestamp': u'*',\n    u'name': u'AllTests',\n    u'testsuites': [{\n        u'name': u'PropertyTwo',\n        u'tests': 1,\n        u'failures': 0,\n        u'disabled': 0,\n        u'errors': 0,\n        u'time': u'*',\n        u'testsuite': [{\n            u'name': u'TestSomeProperties',\n            u'status': u'RUN',\n            u'time': u'*',\n            u'classname': u'PropertyTwo',\n            u'SetUpProp': u'2',\n            u'TestSomeProperty': u'2',\n            u'TearDownProp': u'2',\n        }],\n    }],\n}\n\n\nclass GTestJsonOutFilesTest(gtest_test_utils.TestCase):\n  \"\"\"Unit test for Google Test's JSON output functionality.\"\"\"\n\n  def setUp(self):\n    # We want the trailing '/' that the last \"\" provides in os.path.join, for\n    # telling Google Test to create an output directory instead of a single file\n    # for xml output.\n    self.output_dir_ = os.path.join(gtest_test_utils.GetTempDir(),\n                                    GTEST_OUTPUT_SUBDIR, '')\n    self.DeleteFilesAndDir()\n\n  def tearDown(self):\n    self.DeleteFilesAndDir()\n\n  def DeleteFilesAndDir(self):\n    try:\n      os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_1_TEST + '.json'))\n    except os.error:\n      pass\n    try:\n      os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_2_TEST + '.json'))\n    except os.error:\n      pass\n    try:\n      os.rmdir(self.output_dir_)\n    except os.error:\n      pass\n\n  def testOutfile1(self):\n    self._TestOutFile(GTEST_OUTPUT_1_TEST, EXPECTED_1)\n\n  def testOutfile2(self):\n    self._TestOutFile(GTEST_OUTPUT_2_TEST, EXPECTED_2)\n\n  def _TestOutFile(self, test_name, expected):\n    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(test_name)\n    command = [gtest_prog_path, '--gtest_output=json:%s' % self.output_dir_]\n    p = gtest_test_utils.Subprocess(command,\n                                    working_dir=gtest_test_utils.GetTempDir())\n    self.assert_(p.exited)\n    self.assertEquals(0, p.exit_code)\n\n    # FIXME: libtool causes the built test binary to be\n    #   named lt-gtest_xml_outfiles_test_ instead of\n    #   gtest_xml_outfiles_test_.  To account for this possibility, we\n    #   allow both names in the following code.  We should remove this\n    #   when libtool replacement tool is ready.\n    output_file_name1 = test_name + '.json'\n    output_file1 = os.path.join(self.output_dir_, output_file_name1)\n    output_file_name2 = 'lt-' + output_file_name1\n    output_file2 = os.path.join(self.output_dir_, output_file_name2)\n    self.assert_(os.path.isfile(output_file1) or os.path.isfile(output_file2),\n                 output_file1)\n\n    if os.path.isfile(output_file1):\n      with open(output_file1) as f:\n        actual = json.load(f)\n    else:\n      with open(output_file2) as f:\n        actual = json.load(f)\n    self.assertEqual(expected, gtest_json_test_utils.normalize(actual))\n\n\nif __name__ == '__main__':\n  os.environ['GTEST_STACK_TRACE_DEPTH'] = '0'\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-json-output-unittest.py",
    "content": "#!/usr/bin/env python\n# Copyright 2018, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test for the gtest_json_output module.\"\"\"\n\nimport datetime\nimport errno\nimport json\nimport os\nimport re\nimport sys\n\nimport gtest_json_test_utils\nimport gtest_test_utils\n\nGTEST_FILTER_FLAG = '--gtest_filter'\nGTEST_LIST_TESTS_FLAG = '--gtest_list_tests'\nGTEST_OUTPUT_FLAG = '--gtest_output'\nGTEST_DEFAULT_OUTPUT_FILE = 'test_detail.json'\nGTEST_PROGRAM_NAME = 'gtest_xml_output_unittest_'\n\n# The flag indicating stacktraces are not supported\nNO_STACKTRACE_SUPPORT_FLAG = '--no_stacktrace_support'\n\nSUPPORTS_STACK_TRACES = NO_STACKTRACE_SUPPORT_FLAG not in sys.argv\n\nif SUPPORTS_STACK_TRACES:\n  STACK_TRACE_TEMPLATE = '\\nStack trace:\\n*'\nelse:\n  STACK_TRACE_TEMPLATE = ''\n\nEXPECTED_NON_EMPTY = {\n    u'tests': 23,\n    u'failures': 4,\n    u'disabled': 2,\n    u'errors': 0,\n    u'timestamp': u'*',\n    u'time': u'*',\n    u'ad_hoc_property': u'42',\n    u'name': u'AllTests',\n    u'testsuites': [\n        {\n            u'name': u'SuccessfulTest',\n            u'tests': 1,\n            u'failures': 0,\n            u'disabled': 0,\n            u'errors': 0,\n            u'time': u'*',\n            u'testsuite': [\n                {\n                    u'name': u'Succeeds',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'SuccessfulTest'\n                }\n            ]\n        },\n        {\n            u'name': u'FailedTest',\n            u'tests': 1,\n            u'failures': 1,\n            u'disabled': 0,\n            u'errors': 0,\n            u'time': u'*',\n            u'testsuite': [\n                {\n                    u'name': u'Fails',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'FailedTest',\n                    u'failures': [\n                        {\n                            u'failure':\n                                u'gtest_xml_output_unittest_.cc:*\\n'\n                                u'Expected equality of these values:\\n'\n                                u'  1\\n  2' + STACK_TRACE_TEMPLATE,\n                            u'type': u''\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            u'name': u'DisabledTest',\n            u'tests': 1,\n            u'failures': 0,\n            u'disabled': 1,\n            u'errors': 0,\n            u'time': u'*',\n            u'testsuite': [\n                {\n                    u'name': u'DISABLED_test_not_run',\n                    u'status': u'NOTRUN',\n                    u'time': u'*',\n                    u'classname': u'DisabledTest'\n                }\n            ]\n        },\n        {\n            u'name': u'MixedResultTest',\n            u'tests': 3,\n            u'failures': 1,\n            u'disabled': 1,\n            u'errors': 0,\n            u'time': u'*',\n            u'testsuite': [\n                {\n                    u'name': u'Succeeds',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'MixedResultTest'\n                },\n                {\n                    u'name': u'Fails',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'MixedResultTest',\n                    u'failures': [\n                        {\n                            u'failure':\n                                u'gtest_xml_output_unittest_.cc:*\\n'\n                                u'Expected equality of these values:\\n'\n                                u'  1\\n  2' + STACK_TRACE_TEMPLATE,\n                            u'type': u''\n                        },\n                        {\n                            u'failure':\n                                u'gtest_xml_output_unittest_.cc:*\\n'\n                                u'Expected equality of these values:\\n'\n                                u'  2\\n  3' + STACK_TRACE_TEMPLATE,\n                            u'type': u''\n                        }\n                    ]\n                },\n                {\n                    u'name': u'DISABLED_test',\n                    u'status': u'NOTRUN',\n                    u'time': u'*',\n                    u'classname': u'MixedResultTest'\n                }\n            ]\n        },\n        {\n            u'name': u'XmlQuotingTest',\n            u'tests': 1,\n            u'failures': 1,\n            u'disabled': 0,\n            u'errors': 0,\n            u'time': u'*',\n            u'testsuite': [\n                {\n                    u'name': u'OutputsCData',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'XmlQuotingTest',\n                    u'failures': [\n                        {\n                            u'failure':\n                                u'gtest_xml_output_unittest_.cc:*\\n'\n                                u'Failed\\nXML output: <?xml encoding=\"utf-8\">'\n                                u'<top><![CDATA[cdata text]]></top>' +\n                                STACK_TRACE_TEMPLATE,\n                            u'type': u''\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            u'name': u'InvalidCharactersTest',\n            u'tests': 1,\n            u'failures': 1,\n            u'disabled': 0,\n            u'errors': 0,\n            u'time': u'*',\n            u'testsuite': [\n                {\n                    u'name': u'InvalidCharactersInMessage',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'InvalidCharactersTest',\n                    u'failures': [\n                        {\n                            u'failure':\n                                u'gtest_xml_output_unittest_.cc:*\\n'\n                                u'Failed\\nInvalid characters in brackets'\n                                u' [\\x01\\x02]' + STACK_TRACE_TEMPLATE,\n                            u'type': u''\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            u'name': u'PropertyRecordingTest',\n            u'tests': 4,\n            u'failures': 0,\n            u'disabled': 0,\n            u'errors': 0,\n            u'time': u'*',\n            u'SetUpTestCase': u'yes',\n            u'TearDownTestCase': u'aye',\n            u'testsuite': [\n                {\n                    u'name': u'OneProperty',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'PropertyRecordingTest',\n                    u'key_1': u'1'\n                },\n                {\n                    u'name': u'IntValuedProperty',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'PropertyRecordingTest',\n                    u'key_int': u'1'\n                },\n                {\n                    u'name': u'ThreeProperties',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'PropertyRecordingTest',\n                    u'key_1': u'1',\n                    u'key_2': u'2',\n                    u'key_3': u'3'\n                },\n                {\n                    u'name': u'TwoValuesForOneKeyUsesLastValue',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'PropertyRecordingTest',\n                    u'key_1': u'2'\n                }\n            ]\n        },\n        {\n            u'name': u'NoFixtureTest',\n            u'tests': 3,\n            u'failures': 0,\n            u'disabled': 0,\n            u'errors': 0,\n            u'time': u'*',\n            u'testsuite': [\n                {\n                    u'name': u'RecordProperty',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'NoFixtureTest',\n                    u'key': u'1'\n                },\n                {\n                    u'name': u'ExternalUtilityThatCallsRecordIntValuedProperty',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'NoFixtureTest',\n                    u'key_for_utility_int': u'1'\n                },\n                {\n                    u'name':\n                        u'ExternalUtilityThatCallsRecordStringValuedProperty',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'NoFixtureTest',\n                    u'key_for_utility_string': u'1'\n                }\n            ]\n        },\n        {\n            u'name': u'TypedTest/0',\n            u'tests': 1,\n            u'failures': 0,\n            u'disabled': 0,\n            u'errors': 0,\n            u'time': u'*',\n            u'testsuite': [\n                {\n                    u'name': u'HasTypeParamAttribute',\n                    u'type_param': u'int',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'TypedTest/0'\n                }\n            ]\n        },\n        {\n            u'name': u'TypedTest/1',\n            u'tests': 1,\n            u'failures': 0,\n            u'disabled': 0,\n            u'errors': 0,\n            u'time': u'*',\n            u'testsuite': [\n                {\n                    u'name': u'HasTypeParamAttribute',\n                    u'type_param': u'long',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'TypedTest/1'\n                }\n            ]\n        },\n        {\n            u'name': u'Single/TypeParameterizedTestCase/0',\n            u'tests': 1,\n            u'failures': 0,\n            u'disabled': 0,\n            u'errors': 0,\n            u'time': u'*',\n            u'testsuite': [\n                {\n                    u'name': u'HasTypeParamAttribute',\n                    u'type_param': u'int',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'Single/TypeParameterizedTestCase/0'\n                }\n            ]\n        },\n        {\n            u'name': u'Single/TypeParameterizedTestCase/1',\n            u'tests': 1,\n            u'failures': 0,\n            u'disabled': 0,\n            u'errors': 0,\n            u'time': u'*',\n            u'testsuite': [\n                {\n                    u'name': u'HasTypeParamAttribute',\n                    u'type_param': u'long',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'Single/TypeParameterizedTestCase/1'\n                }\n            ]\n        },\n        {\n            u'name': u'Single/ValueParamTest',\n            u'tests': 4,\n            u'failures': 0,\n            u'disabled': 0,\n            u'errors': 0,\n            u'time': u'*',\n            u'testsuite': [\n                {\n                    u'name': u'HasValueParamAttribute/0',\n                    u'value_param': u'33',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'Single/ValueParamTest'\n                },\n                {\n                    u'name': u'HasValueParamAttribute/1',\n                    u'value_param': u'42',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'Single/ValueParamTest'\n                },\n                {\n                    u'name': u'AnotherTestThatHasValueParamAttribute/0',\n                    u'value_param': u'33',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'Single/ValueParamTest'\n                },\n                {\n                    u'name': u'AnotherTestThatHasValueParamAttribute/1',\n                    u'value_param': u'42',\n                    u'status': u'RUN',\n                    u'time': u'*',\n                    u'classname': u'Single/ValueParamTest'\n                }\n            ]\n        }\n    ]\n}\n\nEXPECTED_FILTERED = {\n    u'tests': 1,\n    u'failures': 0,\n    u'disabled': 0,\n    u'errors': 0,\n    u'time': u'*',\n    u'timestamp': u'*',\n    u'name': u'AllTests',\n    u'ad_hoc_property': u'42',\n    u'testsuites': [{\n        u'name': u'SuccessfulTest',\n        u'tests': 1,\n        u'failures': 0,\n        u'disabled': 0,\n        u'errors': 0,\n        u'time': u'*',\n        u'testsuite': [{\n            u'name': u'Succeeds',\n            u'status': u'RUN',\n            u'time': u'*',\n            u'classname': u'SuccessfulTest',\n        }]\n    }],\n}\n\nEXPECTED_EMPTY = {\n    u'tests': 0,\n    u'failures': 0,\n    u'disabled': 0,\n    u'errors': 0,\n    u'time': u'*',\n    u'timestamp': u'*',\n    u'name': u'AllTests',\n    u'testsuites': [],\n}\n\nGTEST_PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath(GTEST_PROGRAM_NAME)\n\nSUPPORTS_TYPED_TESTS = 'TypedTest' in gtest_test_utils.Subprocess(\n    [GTEST_PROGRAM_PATH, GTEST_LIST_TESTS_FLAG], capture_stderr=False).output\n\n\nclass GTestJsonOutputUnitTest(gtest_test_utils.TestCase):\n  \"\"\"Unit test for Google Test's JSON output functionality.\n  \"\"\"\n\n  # This test currently breaks on platforms that do not support typed and\n  # type-parameterized tests, so we don't run it under them.\n  if SUPPORTS_TYPED_TESTS:\n\n    def testNonEmptyJsonOutput(self):\n      \"\"\"Verifies JSON output for a Google Test binary with non-empty output.\n\n      Runs a test program that generates a non-empty JSON output, and\n      tests that the JSON output is expected.\n      \"\"\"\n      self._TestJsonOutput(GTEST_PROGRAM_NAME, EXPECTED_NON_EMPTY, 1)\n\n  def testEmptyJsonOutput(self):\n    \"\"\"Verifies JSON output for a Google Test binary without actual tests.\n\n    Runs a test program that generates an empty JSON output, and\n    tests that the JSON output is expected.\n    \"\"\"\n\n    self._TestJsonOutput('gtest_no_test_unittest', EXPECTED_EMPTY, 0)\n\n  def testTimestampValue(self):\n    \"\"\"Checks whether the timestamp attribute in the JSON output is valid.\n\n    Runs a test program that generates an empty JSON output, and checks if\n    the timestamp attribute in the testsuites tag is valid.\n    \"\"\"\n    actual = self._GetJsonOutput('gtest_no_test_unittest', [], 0)\n    date_time_str = actual['timestamp']\n    # datetime.strptime() is only available in Python 2.5+ so we have to\n    # parse the expected datetime manually.\n    match = re.match(r'(\\d+)-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d):(\\d\\d)', date_time_str)\n    self.assertTrue(\n        re.match,\n        'JSON datettime string %s has incorrect format' % date_time_str)\n    date_time_from_json = datetime.datetime(\n        year=int(match.group(1)), month=int(match.group(2)),\n        day=int(match.group(3)), hour=int(match.group(4)),\n        minute=int(match.group(5)), second=int(match.group(6)))\n\n    time_delta = abs(datetime.datetime.now() - date_time_from_json)\n    # timestamp value should be near the current local time\n    self.assertTrue(time_delta < datetime.timedelta(seconds=600),\n                    'time_delta is %s' % time_delta)\n\n  def testDefaultOutputFile(self):\n    \"\"\"Verifies the default output file name.\n\n    Confirms that Google Test produces an JSON output file with the expected\n    default name if no name is explicitly specified.\n    \"\"\"\n    output_file = os.path.join(gtest_test_utils.GetTempDir(),\n                               GTEST_DEFAULT_OUTPUT_FILE)\n    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(\n        'gtest_no_test_unittest')\n    try:\n      os.remove(output_file)\n    except OSError:\n      e = sys.exc_info()[1]\n      if e.errno != errno.ENOENT:\n        raise\n\n    p = gtest_test_utils.Subprocess(\n        [gtest_prog_path, '%s=json' % GTEST_OUTPUT_FLAG],\n        working_dir=gtest_test_utils.GetTempDir())\n    self.assert_(p.exited)\n    self.assertEquals(0, p.exit_code)\n    self.assert_(os.path.isfile(output_file))\n\n  def testSuppressedJsonOutput(self):\n    \"\"\"Verifies that no JSON output is generated.\n\n    Tests that no JSON file is generated if the default JSON listener is\n    shut down before RUN_ALL_TESTS is invoked.\n    \"\"\"\n\n    json_path = os.path.join(gtest_test_utils.GetTempDir(),\n                             GTEST_PROGRAM_NAME + 'out.json')\n    if os.path.isfile(json_path):\n      os.remove(json_path)\n\n    command = [GTEST_PROGRAM_PATH,\n               '%s=json:%s' % (GTEST_OUTPUT_FLAG, json_path),\n               '--shut_down_xml']\n    p = gtest_test_utils.Subprocess(command)\n    if p.terminated_by_signal:\n      # p.signal is available only if p.terminated_by_signal is True.\n      self.assertFalse(\n          p.terminated_by_signal,\n          '%s was killed by signal %d' % (GTEST_PROGRAM_NAME, p.signal))\n    else:\n      self.assert_(p.exited)\n      self.assertEquals(1, p.exit_code,\n                        \"'%s' exited with code %s, which doesn't match \"\n                        'the expected exit code %s.'\n                        % (command, p.exit_code, 1))\n\n    self.assert_(not os.path.isfile(json_path))\n\n  def testFilteredTestJsonOutput(self):\n    \"\"\"Verifies JSON output when a filter is applied.\n\n    Runs a test program that executes only some tests and verifies that\n    non-selected tests do not show up in the JSON output.\n    \"\"\"\n\n    self._TestJsonOutput(GTEST_PROGRAM_NAME, EXPECTED_FILTERED, 0,\n                         extra_args=['%s=SuccessfulTest.*' % GTEST_FILTER_FLAG])\n\n  def _GetJsonOutput(self, gtest_prog_name, extra_args, expected_exit_code):\n    \"\"\"Returns the JSON output generated by running the program gtest_prog_name.\n\n    Furthermore, the program's exit code must be expected_exit_code.\n\n    Args:\n      gtest_prog_name: Google Test binary name.\n      extra_args: extra arguments to binary invocation.\n      expected_exit_code: program's exit code.\n    \"\"\"\n    json_path = os.path.join(gtest_test_utils.GetTempDir(),\n                             gtest_prog_name + 'out.json')\n    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(gtest_prog_name)\n\n    command = (\n        [gtest_prog_path, '%s=json:%s' % (GTEST_OUTPUT_FLAG, json_path)] +\n        extra_args\n    )\n    p = gtest_test_utils.Subprocess(command)\n    if p.terminated_by_signal:\n      self.assert_(False,\n                   '%s was killed by signal %d' % (gtest_prog_name, p.signal))\n    else:\n      self.assert_(p.exited)\n      self.assertEquals(expected_exit_code, p.exit_code,\n                        \"'%s' exited with code %s, which doesn't match \"\n                        'the expected exit code %s.'\n                        % (command, p.exit_code, expected_exit_code))\n    with open(json_path) as f:\n      actual = json.load(f)\n    return actual\n\n  def _TestJsonOutput(self, gtest_prog_name, expected,\n                      expected_exit_code, extra_args=None):\n    \"\"\"Checks the JSON output generated by the Google Test binary.\n\n    Asserts that the JSON document generated by running the program\n    gtest_prog_name matches expected_json, a string containing another\n    JSON document.  Furthermore, the program's exit code must be\n    expected_exit_code.\n\n    Args:\n      gtest_prog_name: Google Test binary name.\n      expected: expected output.\n      expected_exit_code: program's exit code.\n      extra_args: extra arguments to binary invocation.\n    \"\"\"\n\n    actual = self._GetJsonOutput(gtest_prog_name, extra_args or [],\n                                 expected_exit_code)\n    self.assertEqual(expected, gtest_json_test_utils.normalize(actual))\n\n\nif __name__ == '__main__':\n  if NO_STACKTRACE_SUPPORT_FLAG in sys.argv:\n    # unittest.main() can't handle unknown flags\n    sys.argv.remove(NO_STACKTRACE_SUPPORT_FLAG)\n\n  os.environ['GTEST_STACK_TRACE_DEPTH'] = '1'\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-linked-ptr-test.cc",
    "content": "// Copyright 2003, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <stdlib.h>\n\n#include \"gtest/internal/gtest-linked_ptr.h\"\n#include \"gtest/gtest.h\"\n\nnamespace {\n\nusing testing::Message;\nusing testing::internal::linked_ptr;\n\nint num;\nMessage* history = NULL;\n\n// Class which tracks allocation/deallocation\nclass A {\n public:\n  A(): mynum(num++) { *history << \"A\" << mynum << \" ctor\\n\"; }\n  virtual ~A() { *history << \"A\" << mynum << \" dtor\\n\"; }\n  virtual void Use() { *history << \"A\" << mynum << \" use\\n\"; }\n protected:\n  int mynum;\n};\n\n// Subclass\nclass B : public A {\n public:\n  B() { *history << \"B\" << mynum << \" ctor\\n\"; }\n  ~B() { *history << \"B\" << mynum << \" dtor\\n\"; }\n  virtual void Use() { *history << \"B\" << mynum << \" use\\n\"; }\n};\n\nclass LinkedPtrTest : public testing::Test {\n public:\n  LinkedPtrTest() {\n    num = 0;\n    history = new Message;\n  }\n\n  virtual ~LinkedPtrTest() {\n    delete history;\n    history = NULL;\n  }\n};\n\nTEST_F(LinkedPtrTest, GeneralTest) {\n  {\n    linked_ptr<A> a0, a1, a2;\n    // Use explicit function call notation here to suppress self-assign warning.\n    a0.operator=(a0);\n    a1 = a2;\n    ASSERT_EQ(a0.get(), static_cast<A*>(NULL));\n    ASSERT_EQ(a1.get(), static_cast<A*>(NULL));\n    ASSERT_EQ(a2.get(), static_cast<A*>(NULL));\n    ASSERT_TRUE(a0 == NULL);\n    ASSERT_TRUE(a1 == NULL);\n    ASSERT_TRUE(a2 == NULL);\n\n    {\n      linked_ptr<A> a3(new A);\n      a0 = a3;\n      ASSERT_TRUE(a0 == a3);\n      ASSERT_TRUE(a0 != NULL);\n      ASSERT_TRUE(a0.get() == a3);\n      ASSERT_TRUE(a0 == a3.get());\n      linked_ptr<A> a4(a0);\n      a1 = a4;\n      linked_ptr<A> a5(new A);\n      ASSERT_TRUE(a5.get() != a3);\n      ASSERT_TRUE(a5 != a3.get());\n      a2 = a5;\n      linked_ptr<B> b0(new B);\n      linked_ptr<A> a6(b0);\n      ASSERT_TRUE(b0 == a6);\n      ASSERT_TRUE(a6 == b0);\n      ASSERT_TRUE(b0 != NULL);\n      a5 = b0;\n      a5 = b0;\n      a3->Use();\n      a4->Use();\n      a5->Use();\n      a6->Use();\n      b0->Use();\n      (*b0).Use();\n      b0.get()->Use();\n    }\n\n    a0->Use();\n    a1->Use();\n    a2->Use();\n\n    a1 = a2;\n    a2.reset(new A);\n    a0.reset();\n\n    linked_ptr<A> a7;\n  }\n\n  ASSERT_STREQ(\n    \"A0 ctor\\n\"\n    \"A1 ctor\\n\"\n    \"A2 ctor\\n\"\n    \"B2 ctor\\n\"\n    \"A0 use\\n\"\n    \"A0 use\\n\"\n    \"B2 use\\n\"\n    \"B2 use\\n\"\n    \"B2 use\\n\"\n    \"B2 use\\n\"\n    \"B2 use\\n\"\n    \"B2 dtor\\n\"\n    \"A2 dtor\\n\"\n    \"A0 use\\n\"\n    \"A0 use\\n\"\n    \"A1 use\\n\"\n    \"A3 ctor\\n\"\n    \"A0 dtor\\n\"\n    \"A3 dtor\\n\"\n    \"A1 dtor\\n\",\n    history->GetString().c_str());\n}\n\n}  // Unnamed namespace\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-list-tests-unittest.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test for Google Test's --gtest_list_tests flag.\n\nA user can ask Google Test to list all tests by specifying the\n--gtest_list_tests flag.  This script tests such functionality\nby invoking googletest-list-tests-unittest_ (a program written with\nGoogle Test) the command line flags.\n\"\"\"\n\nimport re\nimport gtest_test_utils\n\n# Constants.\n\n# The command line flag for enabling/disabling listing all tests.\nLIST_TESTS_FLAG = 'gtest_list_tests'\n\n# Path to the googletest-list-tests-unittest_ program.\nEXE_PATH = gtest_test_utils.GetTestExecutablePath('googletest-list-tests-unittest_')\n\n# The expected output when running googletest-list-tests-unittest_ with\n# --gtest_list_tests\nEXPECTED_OUTPUT_NO_FILTER_RE = re.compile(r\"\"\"FooDeathTest\\.\n  Test1\nFoo\\.\n  Bar1\n  Bar2\n  DISABLED_Bar3\nAbc\\.\n  Xyz\n  Def\nFooBar\\.\n  Baz\nFooTest\\.\n  Test1\n  DISABLED_Test2\n  Test3\nTypedTest/0\\.  # TypeParam = (VeryLo{245}|class VeryLo{239})\\.\\.\\.\n  TestA\n  TestB\nTypedTest/1\\.  # TypeParam = int\\s*\\*( __ptr64)?\n  TestA\n  TestB\nTypedTest/2\\.  # TypeParam = .*MyArray<bool,\\s*42>\n  TestA\n  TestB\nMy/TypeParamTest/0\\.  # TypeParam = (VeryLo{245}|class VeryLo{239})\\.\\.\\.\n  TestA\n  TestB\nMy/TypeParamTest/1\\.  # TypeParam = int\\s*\\*( __ptr64)?\n  TestA\n  TestB\nMy/TypeParamTest/2\\.  # TypeParam = .*MyArray<bool,\\s*42>\n  TestA\n  TestB\nMyInstantiation/ValueParamTest\\.\n  TestA/0  # GetParam\\(\\) = one line\n  TestA/1  # GetParam\\(\\) = two\\\\nlines\n  TestA/2  # GetParam\\(\\) = a very\\\\nlo{241}\\.\\.\\.\n  TestB/0  # GetParam\\(\\) = one line\n  TestB/1  # GetParam\\(\\) = two\\\\nlines\n  TestB/2  # GetParam\\(\\) = a very\\\\nlo{241}\\.\\.\\.\n\"\"\")\n\n# The expected output when running googletest-list-tests-unittest_ with\n# --gtest_list_tests and --gtest_filter=Foo*.\nEXPECTED_OUTPUT_FILTER_FOO_RE = re.compile(r\"\"\"FooDeathTest\\.\n  Test1\nFoo\\.\n  Bar1\n  Bar2\n  DISABLED_Bar3\nFooBar\\.\n  Baz\nFooTest\\.\n  Test1\n  DISABLED_Test2\n  Test3\n\"\"\")\n\n# Utilities.\n\n\ndef Run(args):\n  \"\"\"Runs googletest-list-tests-unittest_ and returns the list of tests printed.\"\"\"\n\n  return gtest_test_utils.Subprocess([EXE_PATH] + args,\n                                     capture_stderr=False).output\n\n\n# The unit test.\n\n\nclass GTestListTestsUnitTest(gtest_test_utils.TestCase):\n  \"\"\"Tests using the --gtest_list_tests flag to list all tests.\"\"\"\n\n  def RunAndVerify(self, flag_value, expected_output_re, other_flag):\n    \"\"\"Runs googletest-list-tests-unittest_ and verifies that it prints\n    the correct tests.\n\n    Args:\n      flag_value:         value of the --gtest_list_tests flag;\n                          None if the flag should not be present.\n      expected_output_re: regular expression that matches the expected\n                          output after running command;\n      other_flag:         a different flag to be passed to command\n                          along with gtest_list_tests;\n                          None if the flag should not be present.\n    \"\"\"\n\n    if flag_value is None:\n      flag = ''\n      flag_expression = 'not set'\n    elif flag_value == '0':\n      flag = '--%s=0' % LIST_TESTS_FLAG\n      flag_expression = '0'\n    else:\n      flag = '--%s' % LIST_TESTS_FLAG\n      flag_expression = '1'\n\n    args = [flag]\n\n    if other_flag is not None:\n      args += [other_flag]\n\n    output = Run(args)\n\n    if expected_output_re:\n      self.assert_(\n          expected_output_re.match(output),\n          ('when %s is %s, the output of \"%s\" is \"%s\",\\n'\n           'which does not match regex \"%s\"' %\n           (LIST_TESTS_FLAG, flag_expression, ' '.join(args), output,\n            expected_output_re.pattern)))\n    else:\n      self.assert_(\n          not EXPECTED_OUTPUT_NO_FILTER_RE.match(output),\n          ('when %s is %s, the output of \"%s\" is \"%s\"'%\n           (LIST_TESTS_FLAG, flag_expression, ' '.join(args), output)))\n\n  def testDefaultBehavior(self):\n    \"\"\"Tests the behavior of the default mode.\"\"\"\n\n    self.RunAndVerify(flag_value=None,\n                      expected_output_re=None,\n                      other_flag=None)\n\n  def testFlag(self):\n    \"\"\"Tests using the --gtest_list_tests flag.\"\"\"\n\n    self.RunAndVerify(flag_value='0',\n                      expected_output_re=None,\n                      other_flag=None)\n    self.RunAndVerify(flag_value='1',\n                      expected_output_re=EXPECTED_OUTPUT_NO_FILTER_RE,\n                      other_flag=None)\n\n  def testOverrideNonFilterFlags(self):\n    \"\"\"Tests that --gtest_list_tests overrides the non-filter flags.\"\"\"\n\n    self.RunAndVerify(flag_value='1',\n                      expected_output_re=EXPECTED_OUTPUT_NO_FILTER_RE,\n                      other_flag='--gtest_break_on_failure')\n\n  def testWithFilterFlags(self):\n    \"\"\"Tests that --gtest_list_tests takes into account the\n    --gtest_filter flag.\"\"\"\n\n    self.RunAndVerify(flag_value='1',\n                      expected_output_re=EXPECTED_OUTPUT_FILTER_FOO_RE,\n                      other_flag='--gtest_filter=Foo*')\n\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-list-tests-unittest_.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Unit test for Google Test's --gtest_list_tests flag.\n//\n// A user can ask Google Test to list all tests that will run\n// so that when using a filter, a user will know what\n// tests to look for. The tests will not be run after listing.\n//\n// This program will be invoked from a Python unit test.\n// Don't run it directly.\n\n#include \"gtest/gtest.h\"\n\n// Several different test cases and tests that will be listed.\nTEST(Foo, Bar1) {\n}\n\nTEST(Foo, Bar2) {\n}\n\nTEST(Foo, DISABLED_Bar3) {\n}\n\nTEST(Abc, Xyz) {\n}\n\nTEST(Abc, Def) {\n}\n\nTEST(FooBar, Baz) {\n}\n\nclass FooTest : public testing::Test {\n};\n\nTEST_F(FooTest, Test1) {\n}\n\nTEST_F(FooTest, DISABLED_Test2) {\n}\n\nTEST_F(FooTest, Test3) {\n}\n\nTEST(FooDeathTest, Test1) {\n}\n\n// A group of value-parameterized tests.\n\nclass MyType {\n public:\n  explicit MyType(const std::string& a_value) : value_(a_value) {}\n\n  const std::string& value() const { return value_; }\n\n private:\n  std::string value_;\n};\n\n// Teaches Google Test how to print a MyType.\nvoid PrintTo(const MyType& x, std::ostream* os) {\n  *os << x.value();\n}\n\nclass ValueParamTest : public testing::TestWithParam<MyType> {\n};\n\nTEST_P(ValueParamTest, TestA) {\n}\n\nTEST_P(ValueParamTest, TestB) {\n}\n\nINSTANTIATE_TEST_CASE_P(\n    MyInstantiation, ValueParamTest,\n    testing::Values(MyType(\"one line\"),\n                    MyType(\"two\\nlines\"),\n                    MyType(\"a very\\nloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line\")));  // NOLINT\n\n// A group of typed tests.\n\n// A deliberately long type name for testing the line-truncating\n// behavior when printing a type parameter.\nclass VeryLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName {  // NOLINT\n};\n\ntemplate <typename T>\nclass TypedTest : public testing::Test {\n};\n\ntemplate <typename T, int kSize>\nclass MyArray {\n};\n\ntypedef testing::Types<VeryLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName,  // NOLINT\n                       int*, MyArray<bool, 42> > MyTypes;\n\nTYPED_TEST_CASE(TypedTest, MyTypes);\n\nTYPED_TEST(TypedTest, TestA) {\n}\n\nTYPED_TEST(TypedTest, TestB) {\n}\n\n// A group of type-parameterized tests.\n\ntemplate <typename T>\nclass TypeParamTest : public testing::Test {\n};\n\nTYPED_TEST_CASE_P(TypeParamTest);\n\nTYPED_TEST_P(TypeParamTest, TestA) {\n}\n\nTYPED_TEST_P(TypeParamTest, TestB) {\n}\n\nREGISTER_TYPED_TEST_CASE_P(TypeParamTest, TestA, TestB);\n\nINSTANTIATE_TYPED_TEST_CASE_P(My, TypeParamTest, MyTypes);\n\nint main(int argc, char **argv) {\n  ::testing::InitGoogleTest(&argc, argv);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-listener-test.cc",
    "content": "// Copyright 2009 Google Inc. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This file verifies Google Test event listeners receive events at the\n// right times.\n\n#include <vector>\n\n#include \"gtest/gtest.h\"\n\nusing ::testing::AddGlobalTestEnvironment;\nusing ::testing::Environment;\nusing ::testing::InitGoogleTest;\nusing ::testing::Test;\nusing ::testing::TestCase;\nusing ::testing::TestEventListener;\nusing ::testing::TestInfo;\nusing ::testing::TestPartResult;\nusing ::testing::UnitTest;\n\n// Used by tests to register their events.\nstd::vector<std::string>* g_events = NULL;\n\nnamespace testing {\nnamespace internal {\n\nclass EventRecordingListener : public TestEventListener {\n public:\n  explicit EventRecordingListener(const char* name) : name_(name) {}\n\n protected:\n  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {\n    g_events->push_back(GetFullMethodName(\"OnTestProgramStart\"));\n  }\n\n  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,\n                                    int iteration) {\n    Message message;\n    message << GetFullMethodName(\"OnTestIterationStart\")\n            << \"(\" << iteration << \")\";\n    g_events->push_back(message.GetString());\n  }\n\n  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {\n    g_events->push_back(GetFullMethodName(\"OnEnvironmentsSetUpStart\"));\n  }\n\n  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {\n    g_events->push_back(GetFullMethodName(\"OnEnvironmentsSetUpEnd\"));\n  }\n\n  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {\n    g_events->push_back(GetFullMethodName(\"OnTestCaseStart\"));\n  }\n\n  virtual void OnTestStart(const TestInfo& /*test_info*/) {\n    g_events->push_back(GetFullMethodName(\"OnTestStart\"));\n  }\n\n  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {\n    g_events->push_back(GetFullMethodName(\"OnTestPartResult\"));\n  }\n\n  virtual void OnTestEnd(const TestInfo& /*test_info*/) {\n    g_events->push_back(GetFullMethodName(\"OnTestEnd\"));\n  }\n\n  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {\n    g_events->push_back(GetFullMethodName(\"OnTestCaseEnd\"));\n  }\n\n  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {\n    g_events->push_back(GetFullMethodName(\"OnEnvironmentsTearDownStart\"));\n  }\n\n  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {\n    g_events->push_back(GetFullMethodName(\"OnEnvironmentsTearDownEnd\"));\n  }\n\n  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,\n                                  int iteration) {\n    Message message;\n    message << GetFullMethodName(\"OnTestIterationEnd\")\n            << \"(\"  << iteration << \")\";\n    g_events->push_back(message.GetString());\n  }\n\n  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {\n    g_events->push_back(GetFullMethodName(\"OnTestProgramEnd\"));\n  }\n\n private:\n  std::string GetFullMethodName(const char* name) {\n    return name_ + \".\" + name;\n  }\n\n  std::string name_;\n};\n\nclass EnvironmentInvocationCatcher : public Environment {\n protected:\n  virtual void SetUp() {\n    g_events->push_back(\"Environment::SetUp\");\n  }\n\n  virtual void TearDown() {\n    g_events->push_back(\"Environment::TearDown\");\n  }\n};\n\nclass ListenerTest : public Test {\n protected:\n  static void SetUpTestCase() {\n    g_events->push_back(\"ListenerTest::SetUpTestCase\");\n  }\n\n  static void TearDownTestCase() {\n    g_events->push_back(\"ListenerTest::TearDownTestCase\");\n  }\n\n  virtual void SetUp() {\n    g_events->push_back(\"ListenerTest::SetUp\");\n  }\n\n  virtual void TearDown() {\n    g_events->push_back(\"ListenerTest::TearDown\");\n  }\n};\n\nTEST_F(ListenerTest, DoesFoo) {\n  // Test execution order within a test case is not guaranteed so we are not\n  // recording the test name.\n  g_events->push_back(\"ListenerTest::* Test Body\");\n  SUCCEED();  // Triggers OnTestPartResult.\n}\n\nTEST_F(ListenerTest, DoesBar) {\n  g_events->push_back(\"ListenerTest::* Test Body\");\n  SUCCEED();  // Triggers OnTestPartResult.\n}\n\n}  // namespace internal\n\n}  // namespace testing\n\nusing ::testing::internal::EnvironmentInvocationCatcher;\nusing ::testing::internal::EventRecordingListener;\n\nvoid VerifyResults(const std::vector<std::string>& data,\n                   const char* const* expected_data,\n                   size_t expected_data_size) {\n  const size_t actual_size = data.size();\n  // If the following assertion fails, a new entry will be appended to\n  // data.  Hence we save data.size() first.\n  EXPECT_EQ(expected_data_size, actual_size);\n\n  // Compares the common prefix.\n  const size_t shorter_size = expected_data_size <= actual_size ?\n      expected_data_size : actual_size;\n  size_t i = 0;\n  for (; i < shorter_size; ++i) {\n    ASSERT_STREQ(expected_data[i], data[i].c_str())\n        << \"at position \" << i;\n  }\n\n  // Prints extra elements in the actual data.\n  for (; i < actual_size; ++i) {\n    printf(\"  Actual event #%lu: %s\\n\",\n        static_cast<unsigned long>(i), data[i].c_str());\n  }\n}\n\nint main(int argc, char **argv) {\n  std::vector<std::string> events;\n  g_events = &events;\n  InitGoogleTest(&argc, argv);\n\n  UnitTest::GetInstance()->listeners().Append(\n      new EventRecordingListener(\"1st\"));\n  UnitTest::GetInstance()->listeners().Append(\n      new EventRecordingListener(\"2nd\"));\n\n  AddGlobalTestEnvironment(new EnvironmentInvocationCatcher);\n\n  GTEST_CHECK_(events.size() == 0)\n      << \"AddGlobalTestEnvironment should not generate any events itself.\";\n\n  ::testing::GTEST_FLAG(repeat) = 2;\n  int ret_val = RUN_ALL_TESTS();\n\n  const char* const expected_events[] = {\n    \"1st.OnTestProgramStart\",\n    \"2nd.OnTestProgramStart\",\n    \"1st.OnTestIterationStart(0)\",\n    \"2nd.OnTestIterationStart(0)\",\n    \"1st.OnEnvironmentsSetUpStart\",\n    \"2nd.OnEnvironmentsSetUpStart\",\n    \"Environment::SetUp\",\n    \"2nd.OnEnvironmentsSetUpEnd\",\n    \"1st.OnEnvironmentsSetUpEnd\",\n    \"1st.OnTestCaseStart\",\n    \"2nd.OnTestCaseStart\",\n    \"ListenerTest::SetUpTestCase\",\n    \"1st.OnTestStart\",\n    \"2nd.OnTestStart\",\n    \"ListenerTest::SetUp\",\n    \"ListenerTest::* Test Body\",\n    \"1st.OnTestPartResult\",\n    \"2nd.OnTestPartResult\",\n    \"ListenerTest::TearDown\",\n    \"2nd.OnTestEnd\",\n    \"1st.OnTestEnd\",\n    \"1st.OnTestStart\",\n    \"2nd.OnTestStart\",\n    \"ListenerTest::SetUp\",\n    \"ListenerTest::* Test Body\",\n    \"1st.OnTestPartResult\",\n    \"2nd.OnTestPartResult\",\n    \"ListenerTest::TearDown\",\n    \"2nd.OnTestEnd\",\n    \"1st.OnTestEnd\",\n    \"ListenerTest::TearDownTestCase\",\n    \"2nd.OnTestCaseEnd\",\n    \"1st.OnTestCaseEnd\",\n    \"1st.OnEnvironmentsTearDownStart\",\n    \"2nd.OnEnvironmentsTearDownStart\",\n    \"Environment::TearDown\",\n    \"2nd.OnEnvironmentsTearDownEnd\",\n    \"1st.OnEnvironmentsTearDownEnd\",\n    \"2nd.OnTestIterationEnd(0)\",\n    \"1st.OnTestIterationEnd(0)\",\n    \"1st.OnTestIterationStart(1)\",\n    \"2nd.OnTestIterationStart(1)\",\n    \"1st.OnEnvironmentsSetUpStart\",\n    \"2nd.OnEnvironmentsSetUpStart\",\n    \"Environment::SetUp\",\n    \"2nd.OnEnvironmentsSetUpEnd\",\n    \"1st.OnEnvironmentsSetUpEnd\",\n    \"1st.OnTestCaseStart\",\n    \"2nd.OnTestCaseStart\",\n    \"ListenerTest::SetUpTestCase\",\n    \"1st.OnTestStart\",\n    \"2nd.OnTestStart\",\n    \"ListenerTest::SetUp\",\n    \"ListenerTest::* Test Body\",\n    \"1st.OnTestPartResult\",\n    \"2nd.OnTestPartResult\",\n    \"ListenerTest::TearDown\",\n    \"2nd.OnTestEnd\",\n    \"1st.OnTestEnd\",\n    \"1st.OnTestStart\",\n    \"2nd.OnTestStart\",\n    \"ListenerTest::SetUp\",\n    \"ListenerTest::* Test Body\",\n    \"1st.OnTestPartResult\",\n    \"2nd.OnTestPartResult\",\n    \"ListenerTest::TearDown\",\n    \"2nd.OnTestEnd\",\n    \"1st.OnTestEnd\",\n    \"ListenerTest::TearDownTestCase\",\n    \"2nd.OnTestCaseEnd\",\n    \"1st.OnTestCaseEnd\",\n    \"1st.OnEnvironmentsTearDownStart\",\n    \"2nd.OnEnvironmentsTearDownStart\",\n    \"Environment::TearDown\",\n    \"2nd.OnEnvironmentsTearDownEnd\",\n    \"1st.OnEnvironmentsTearDownEnd\",\n    \"2nd.OnTestIterationEnd(1)\",\n    \"1st.OnTestIterationEnd(1)\",\n    \"2nd.OnTestProgramEnd\",\n    \"1st.OnTestProgramEnd\"\n  };\n  VerifyResults(events,\n                expected_events,\n                sizeof(expected_events)/sizeof(expected_events[0]));\n\n  // We need to check manually for ad hoc test failures that happen after\n  // RUN_ALL_TESTS finishes.\n  if (UnitTest::GetInstance()->Failed())\n    ret_val = 1;\n\n  return ret_val;\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-message-test.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Tests for the Message class.\n\n#include \"gtest/gtest-message.h\"\n\n#include \"gtest/gtest.h\"\n\nnamespace {\n\nusing ::testing::Message;\n\n// Tests the testing::Message class\n\n// Tests the default constructor.\nTEST(MessageTest, DefaultConstructor) {\n  const Message msg;\n  EXPECT_EQ(\"\", msg.GetString());\n}\n\n// Tests the copy constructor.\nTEST(MessageTest, CopyConstructor) {\n  const Message msg1(\"Hello\");\n  const Message msg2(msg1);\n  EXPECT_EQ(\"Hello\", msg2.GetString());\n}\n\n// Tests constructing a Message from a C-string.\nTEST(MessageTest, ConstructsFromCString) {\n  Message msg(\"Hello\");\n  EXPECT_EQ(\"Hello\", msg.GetString());\n}\n\n// Tests streaming a float.\nTEST(MessageTest, StreamsFloat) {\n  const std::string s = (Message() << 1.23456F << \" \" << 2.34567F).GetString();\n  // Both numbers should be printed with enough precision.\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"1.234560\", s.c_str());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \" 2.345669\", s.c_str());\n}\n\n// Tests streaming a double.\nTEST(MessageTest, StreamsDouble) {\n  const std::string s = (Message() << 1260570880.4555497 << \" \"\n                                  << 1260572265.1954534).GetString();\n  // Both numbers should be printed with enough precision.\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"1260570880.45\", s.c_str());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \" 1260572265.19\", s.c_str());\n}\n\n// Tests streaming a non-char pointer.\nTEST(MessageTest, StreamsPointer) {\n  int n = 0;\n  int* p = &n;\n  EXPECT_NE(\"(null)\", (Message() << p).GetString());\n}\n\n// Tests streaming a NULL non-char pointer.\nTEST(MessageTest, StreamsNullPointer) {\n  int* p = NULL;\n  EXPECT_EQ(\"(null)\", (Message() << p).GetString());\n}\n\n// Tests streaming a C string.\nTEST(MessageTest, StreamsCString) {\n  EXPECT_EQ(\"Foo\", (Message() << \"Foo\").GetString());\n}\n\n// Tests streaming a NULL C string.\nTEST(MessageTest, StreamsNullCString) {\n  char* p = NULL;\n  EXPECT_EQ(\"(null)\", (Message() << p).GetString());\n}\n\n// Tests streaming std::string.\nTEST(MessageTest, StreamsString) {\n  const ::std::string str(\"Hello\");\n  EXPECT_EQ(\"Hello\", (Message() << str).GetString());\n}\n\n// Tests that we can output strings containing embedded NULs.\nTEST(MessageTest, StreamsStringWithEmbeddedNUL) {\n  const char char_array_with_nul[] =\n      \"Here's a NUL\\0 and some more string\";\n  const ::std::string string_with_nul(char_array_with_nul,\n                                      sizeof(char_array_with_nul) - 1);\n  EXPECT_EQ(\"Here's a NUL\\\\0 and some more string\",\n            (Message() << string_with_nul).GetString());\n}\n\n// Tests streaming a NUL char.\nTEST(MessageTest, StreamsNULChar) {\n  EXPECT_EQ(\"\\\\0\", (Message() << '\\0').GetString());\n}\n\n// Tests streaming int.\nTEST(MessageTest, StreamsInt) {\n  EXPECT_EQ(\"123\", (Message() << 123).GetString());\n}\n\n// Tests that basic IO manipulators (endl, ends, and flush) can be\n// streamed to Message.\nTEST(MessageTest, StreamsBasicIoManip) {\n  EXPECT_EQ(\"Line 1.\\nA NUL char \\\\0 in line 2.\",\n               (Message() << \"Line 1.\" << std::endl\n                         << \"A NUL char \" << std::ends << std::flush\n                         << \" in line 2.\").GetString());\n}\n\n// Tests Message::GetString()\nTEST(MessageTest, GetString) {\n  Message msg;\n  msg << 1 << \" lamb\";\n  EXPECT_EQ(\"1 lamb\", msg.GetString());\n}\n\n// Tests streaming a Message object to an ostream.\nTEST(MessageTest, StreamsToOStream) {\n  Message msg(\"Hello\");\n  ::std::stringstream ss;\n  ss << msg;\n  EXPECT_EQ(\"Hello\", testing::internal::StringStreamToString(&ss));\n}\n\n// Tests that a Message object doesn't take up too much stack space.\nTEST(MessageTest, DoesNotTakeUpMuchStackSpace) {\n  EXPECT_LE(sizeof(Message), 16U);\n}\n\n}  // namespace\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-options-test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Google Test UnitTestOptions tests\n//\n// This file tests classes and functions used internally by\n// Google Test.  They are subject to change without notice.\n//\n// This file is #included from gtest.cc, to avoid changing build or\n// make-files on Windows and other platforms. Do not #include this file\n// anywhere else!\n\n#include \"gtest/gtest.h\"\n\n#if GTEST_OS_WINDOWS_MOBILE\n# include <windows.h>\n#elif GTEST_OS_WINDOWS\n# include <direct.h>\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n#include \"src/gtest-internal-inl.h\"\n\nnamespace testing {\nnamespace internal {\nnamespace {\n\n// Turns the given relative path into an absolute path.\nFilePath GetAbsolutePathOf(const FilePath& relative_path) {\n  return FilePath::ConcatPaths(FilePath::GetCurrentDir(), relative_path);\n}\n\n// Testing UnitTestOptions::GetOutputFormat/GetOutputFile.\n\nTEST(XmlOutputTest, GetOutputFormatDefault) {\n  GTEST_FLAG(output) = \"\";\n  EXPECT_STREQ(\"\", UnitTestOptions::GetOutputFormat().c_str());\n}\n\nTEST(XmlOutputTest, GetOutputFormat) {\n  GTEST_FLAG(output) = \"xml:filename\";\n  EXPECT_STREQ(\"xml\", UnitTestOptions::GetOutputFormat().c_str());\n}\n\nTEST(XmlOutputTest, GetOutputFileDefault) {\n  GTEST_FLAG(output) = \"\";\n  EXPECT_EQ(GetAbsolutePathOf(FilePath(\"test_detail.xml\")).string(),\n            UnitTestOptions::GetAbsolutePathToOutputFile());\n}\n\nTEST(XmlOutputTest, GetOutputFileSingleFile) {\n  GTEST_FLAG(output) = \"xml:filename.abc\";\n  EXPECT_EQ(GetAbsolutePathOf(FilePath(\"filename.abc\")).string(),\n            UnitTestOptions::GetAbsolutePathToOutputFile());\n}\n\nTEST(XmlOutputTest, GetOutputFileFromDirectoryPath) {\n  GTEST_FLAG(output) = \"xml:path\" GTEST_PATH_SEP_;\n  const std::string expected_output_file =\n      GetAbsolutePathOf(\n          FilePath(std::string(\"path\") + GTEST_PATH_SEP_ +\n                   GetCurrentExecutableName().string() + \".xml\")).string();\n  const std::string& output_file =\n      UnitTestOptions::GetAbsolutePathToOutputFile();\n#if GTEST_OS_WINDOWS\n  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());\n#else\n  EXPECT_EQ(expected_output_file, output_file.c_str());\n#endif\n}\n\nTEST(OutputFileHelpersTest, GetCurrentExecutableName) {\n  const std::string exe_str = GetCurrentExecutableName().string();\n#if GTEST_OS_WINDOWS\n  const bool success =\n      _strcmpi(\"googletest-options-test\", exe_str.c_str()) == 0 ||\n      _strcmpi(\"gtest-options-ex_test\", exe_str.c_str()) == 0 ||\n      _strcmpi(\"gtest_all_test\", exe_str.c_str()) == 0 ||\n      _strcmpi(\"gtest_dll_test\", exe_str.c_str()) == 0;\n#elif GTEST_OS_FUCHSIA\n  const bool success = exe_str == \"app\";\n#else\n  // FIXME: remove the hard-coded \"lt-\" prefix when libtool replacement is ready\n  const bool success =\n      exe_str == \"googletest-options-test\" ||\n      exe_str == \"gtest_all_test\" ||\n      exe_str == \"lt-gtest_all_test\" ||\n      exe_str == \"gtest_dll_test\";\n#endif  // GTEST_OS_WINDOWS\n  if (!success)\n    FAIL() << \"GetCurrentExecutableName() returns \" << exe_str;\n}\n\n#if !GTEST_OS_FUCHSIA\n\nclass XmlOutputChangeDirTest : public Test {\n protected:\n  virtual void SetUp() {\n    original_working_dir_ = FilePath::GetCurrentDir();\n    posix::ChDir(\"..\");\n    // This will make the test fail if run from the root directory.\n    EXPECT_NE(original_working_dir_.string(),\n              FilePath::GetCurrentDir().string());\n  }\n\n  virtual void TearDown() {\n    posix::ChDir(original_working_dir_.string().c_str());\n  }\n\n  FilePath original_working_dir_;\n};\n\nTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefault) {\n  GTEST_FLAG(output) = \"\";\n  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,\n                                  FilePath(\"test_detail.xml\")).string(),\n            UnitTestOptions::GetAbsolutePathToOutputFile());\n}\n\nTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefaultXML) {\n  GTEST_FLAG(output) = \"xml\";\n  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,\n                                  FilePath(\"test_detail.xml\")).string(),\n            UnitTestOptions::GetAbsolutePathToOutputFile());\n}\n\nTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativeFile) {\n  GTEST_FLAG(output) = \"xml:filename.abc\";\n  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,\n                                  FilePath(\"filename.abc\")).string(),\n            UnitTestOptions::GetAbsolutePathToOutputFile());\n}\n\nTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativePath) {\n  GTEST_FLAG(output) = \"xml:path\" GTEST_PATH_SEP_;\n  const std::string expected_output_file =\n      FilePath::ConcatPaths(\n          original_working_dir_,\n          FilePath(std::string(\"path\") + GTEST_PATH_SEP_ +\n                   GetCurrentExecutableName().string() + \".xml\")).string();\n  const std::string& output_file =\n      UnitTestOptions::GetAbsolutePathToOutputFile();\n#if GTEST_OS_WINDOWS\n  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());\n#else\n  EXPECT_EQ(expected_output_file, output_file.c_str());\n#endif\n}\n\nTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsoluteFile) {\n#if GTEST_OS_WINDOWS\n  GTEST_FLAG(output) = \"xml:c:\\\\tmp\\\\filename.abc\";\n  EXPECT_EQ(FilePath(\"c:\\\\tmp\\\\filename.abc\").string(),\n            UnitTestOptions::GetAbsolutePathToOutputFile());\n#else\n  GTEST_FLAG(output) =\"xml:/tmp/filename.abc\";\n  EXPECT_EQ(FilePath(\"/tmp/filename.abc\").string(),\n            UnitTestOptions::GetAbsolutePathToOutputFile());\n#endif\n}\n\nTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsolutePath) {\n#if GTEST_OS_WINDOWS\n  const std::string path = \"c:\\\\tmp\\\\\";\n#else\n  const std::string path = \"/tmp/\";\n#endif\n\n  GTEST_FLAG(output) = \"xml:\" + path;\n  const std::string expected_output_file =\n      path + GetCurrentExecutableName().string() + \".xml\";\n  const std::string& output_file =\n      UnitTestOptions::GetAbsolutePathToOutputFile();\n\n#if GTEST_OS_WINDOWS\n  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());\n#else\n  EXPECT_EQ(expected_output_file, output_file.c_str());\n#endif\n}\n\n#endif  // !GTEST_OS_FUCHSIA\n\n}  // namespace\n}  // namespace internal\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-output-test-golden-lin.txt",
    "content": "The non-test part of the code is expected to have 2 failures.\n\ngoogletest-output-test_.cc:#: Failure\nValue of: false\n  Actual: false\nExpected: true\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  2\n  3\nStack trace: (omitted)\n\n\u001b[0;32m[==========] \u001b[mRunning 76 tests from 34 test cases.\n\u001b[0;32m[----------] \u001b[mGlobal test environment set-up.\nFooEnvironment::SetUp() called.\nBarEnvironment::SetUp() called.\n\u001b[0;32m[----------] \u001b[m1 test from ADeathTest\n\u001b[0;32m[ RUN      ] \u001b[mADeathTest.ShouldRunFirst\n\u001b[0;32m[       OK ] \u001b[mADeathTest.ShouldRunFirst\n\u001b[0;32m[----------] \u001b[m1 test from ATypedDeathTest/0, where TypeParam = int\n\u001b[0;32m[ RUN      ] \u001b[mATypedDeathTest/0.ShouldRunFirst\n\u001b[0;32m[       OK ] \u001b[mATypedDeathTest/0.ShouldRunFirst\n\u001b[0;32m[----------] \u001b[m1 test from ATypedDeathTest/1, where TypeParam = double\n\u001b[0;32m[ RUN      ] \u001b[mATypedDeathTest/1.ShouldRunFirst\n\u001b[0;32m[       OK ] \u001b[mATypedDeathTest/1.ShouldRunFirst\n\u001b[0;32m[----------] \u001b[m1 test from My/ATypeParamDeathTest/0, where TypeParam = int\n\u001b[0;32m[ RUN      ] \u001b[mMy/ATypeParamDeathTest/0.ShouldRunFirst\n\u001b[0;32m[       OK ] \u001b[mMy/ATypeParamDeathTest/0.ShouldRunFirst\n\u001b[0;32m[----------] \u001b[m1 test from My/ATypeParamDeathTest/1, where TypeParam = double\n\u001b[0;32m[ RUN      ] \u001b[mMy/ATypeParamDeathTest/1.ShouldRunFirst\n\u001b[0;32m[       OK ] \u001b[mMy/ATypeParamDeathTest/1.ShouldRunFirst\n\u001b[0;32m[----------] \u001b[m2 tests from PassingTest\n\u001b[0;32m[ RUN      ] \u001b[mPassingTest.PassingTest1\n\u001b[0;32m[       OK ] \u001b[mPassingTest.PassingTest1\n\u001b[0;32m[ RUN      ] \u001b[mPassingTest.PassingTest2\n\u001b[0;32m[       OK ] \u001b[mPassingTest.PassingTest2\n\u001b[0;32m[----------] \u001b[m2 tests from NonfatalFailureTest\n\u001b[0;32m[ RUN      ] \u001b[mNonfatalFailureTest.EscapesStringOperands\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  kGoldenString\n    Which is: \"\\\"Line\"\n  actual\n    Which is: \"actual \\\"string\\\"\"\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  golden\n    Which is: \"\\\"Line\"\n  actual\n    Which is: \"actual \\\"string\\\"\"\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mNonfatalFailureTest.EscapesStringOperands\n\u001b[0;32m[ RUN      ] \u001b[mNonfatalFailureTest.DiffForLongStrings\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  golden_str\n    Which is: \"\\\"Line\\0 1\\\"\\nLine 2\"\n  \"Line 2\"\nWith diff:\n@@ -1,2 @@\n-\\\"Line\\0 1\\\"\n Line 2\n\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mNonfatalFailureTest.DiffForLongStrings\n\u001b[0;32m[----------] \u001b[m3 tests from FatalFailureTest\n\u001b[0;32m[ RUN      ] \u001b[mFatalFailureTest.FatalFailureInSubroutine\n(expecting a failure that x should be 1)\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  1\n  x\n    Which is: 2\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureTest.FatalFailureInSubroutine\n\u001b[0;32m[ RUN      ] \u001b[mFatalFailureTest.FatalFailureInNestedSubroutine\n(expecting a failure that x should be 1)\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  1\n  x\n    Which is: 2\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureTest.FatalFailureInNestedSubroutine\n\u001b[0;32m[ RUN      ] \u001b[mFatalFailureTest.NonfatalFailureInSubroutine\n(expecting a failure on false)\ngoogletest-output-test_.cc:#: Failure\nValue of: false\n  Actual: false\nExpected: true\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureTest.NonfatalFailureInSubroutine\n\u001b[0;32m[----------] \u001b[m1 test from LoggingTest\n\u001b[0;32m[ RUN      ] \u001b[mLoggingTest.InterleavingLoggingAndAssertions\n(expecting 2 failures on (3) >= (a[i]))\ni == 0\ni == 1\ngoogletest-output-test_.cc:#: Failure\nExpected: (3) >= (a[i]), actual: 3 vs 9\nStack trace: (omitted)\n\ni == 2\ni == 3\ngoogletest-output-test_.cc:#: Failure\nExpected: (3) >= (a[i]), actual: 3 vs 6\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mLoggingTest.InterleavingLoggingAndAssertions\n\u001b[0;32m[----------] \u001b[m7 tests from SCOPED_TRACETest\n\u001b[0;32m[ RUN      ] \u001b[mSCOPED_TRACETest.AcceptedValues\ngoogletest-output-test_.cc:#: Failure\nFailed\nJust checking that all these values work fine.\nGoogle Test trace:\ngoogletest-output-test_.cc:#: (null)\ngoogletest-output-test_.cc:#: 1337\ngoogletest-output-test_.cc:#: std::string\ngoogletest-output-test_.cc:#: literal string\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.AcceptedValues\n\u001b[0;32m[ RUN      ] \u001b[mSCOPED_TRACETest.ObeysScopes\n(expected to fail)\ngoogletest-output-test_.cc:#: Failure\nFailed\nThis failure is expected, and shouldn't have a trace.\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nThis failure is expected, and should have a trace.\nGoogle Test trace:\ngoogletest-output-test_.cc:#: Expected trace\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nThis failure is expected, and shouldn't have a trace.\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.ObeysScopes\n\u001b[0;32m[ RUN      ] \u001b[mSCOPED_TRACETest.WorksInLoop\n(expected to fail)\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  2\n  n\n    Which is: 1\nGoogle Test trace:\ngoogletest-output-test_.cc:#: i = 1\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  1\n  n\n    Which is: 2\nGoogle Test trace:\ngoogletest-output-test_.cc:#: i = 2\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.WorksInLoop\n\u001b[0;32m[ RUN      ] \u001b[mSCOPED_TRACETest.WorksInSubroutine\n(expected to fail)\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  2\n  n\n    Which is: 1\nGoogle Test trace:\ngoogletest-output-test_.cc:#: n = 1\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  1\n  n\n    Which is: 2\nGoogle Test trace:\ngoogletest-output-test_.cc:#: n = 2\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.WorksInSubroutine\n\u001b[0;32m[ RUN      ] \u001b[mSCOPED_TRACETest.CanBeNested\n(expected to fail)\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  1\n  n\n    Which is: 2\nGoogle Test trace:\ngoogletest-output-test_.cc:#: n = 2\ngoogletest-output-test_.cc:#: \nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.CanBeNested\n\u001b[0;32m[ RUN      ] \u001b[mSCOPED_TRACETest.CanBeRepeated\n(expected to fail)\ngoogletest-output-test_.cc:#: Failure\nFailed\nThis failure is expected, and should contain trace point A.\nGoogle Test trace:\ngoogletest-output-test_.cc:#: A\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nThis failure is expected, and should contain trace point A and B.\nGoogle Test trace:\ngoogletest-output-test_.cc:#: B\ngoogletest-output-test_.cc:#: A\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nThis failure is expected, and should contain trace point A, B, and C.\nGoogle Test trace:\ngoogletest-output-test_.cc:#: C\ngoogletest-output-test_.cc:#: B\ngoogletest-output-test_.cc:#: A\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nThis failure is expected, and should contain trace point A, B, and D.\nGoogle Test trace:\ngoogletest-output-test_.cc:#: D\ngoogletest-output-test_.cc:#: B\ngoogletest-output-test_.cc:#: A\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.CanBeRepeated\n\u001b[0;32m[ RUN      ] \u001b[mSCOPED_TRACETest.WorksConcurrently\n(expecting 6 failures)\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #1 (in thread B, only trace B alive).\nGoogle Test trace:\ngoogletest-output-test_.cc:#: Trace B\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #2 (in thread A, trace A & B both alive).\nGoogle Test trace:\ngoogletest-output-test_.cc:#: Trace A\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #3 (in thread B, trace A & B both alive).\nGoogle Test trace:\ngoogletest-output-test_.cc:#: Trace B\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #4 (in thread B, only trace A alive).\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #5 (in thread A, only trace A alive).\nGoogle Test trace:\ngoogletest-output-test_.cc:#: Trace A\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #6 (in thread A, no trace alive).\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.WorksConcurrently\n\u001b[0;32m[----------] \u001b[m1 test from ScopedTraceTest\n\u001b[0;32m[ RUN      ] \u001b[mScopedTraceTest.WithExplicitFileAndLine\ngoogletest-output-test_.cc:#: Failure\nFailed\nCheck that the trace is attached to a particular location.\nGoogle Test trace:\nexplicit_file.cc:123: expected trace message\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mScopedTraceTest.WithExplicitFileAndLine\n\u001b[0;32m[----------] \u001b[m1 test from NonFatalFailureInFixtureConstructorTest\n\u001b[0;32m[ RUN      ] \u001b[mNonFatalFailureInFixtureConstructorTest.FailureInConstructor\n(expecting 5 failures)\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #1, in the test fixture c'tor.\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #2, in SetUp().\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #3, in the test body.\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #4, in TearDown.\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #5, in the test fixture d'tor.\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mNonFatalFailureInFixtureConstructorTest.FailureInConstructor\n\u001b[0;32m[----------] \u001b[m1 test from FatalFailureInFixtureConstructorTest\n\u001b[0;32m[ RUN      ] \u001b[mFatalFailureInFixtureConstructorTest.FailureInConstructor\n(expecting 2 failures)\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #1, in the test fixture c'tor.\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #2, in the test fixture d'tor.\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureInFixtureConstructorTest.FailureInConstructor\n\u001b[0;32m[----------] \u001b[m1 test from NonFatalFailureInSetUpTest\n\u001b[0;32m[ RUN      ] \u001b[mNonFatalFailureInSetUpTest.FailureInSetUp\n(expecting 4 failures)\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #1, in SetUp().\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #2, in the test function.\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #3, in TearDown().\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #4, in the test fixture d'tor.\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mNonFatalFailureInSetUpTest.FailureInSetUp\n\u001b[0;32m[----------] \u001b[m1 test from FatalFailureInSetUpTest\n\u001b[0;32m[ RUN      ] \u001b[mFatalFailureInSetUpTest.FailureInSetUp\n(expecting 3 failures)\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #1, in SetUp().\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #2, in TearDown().\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected failure #3, in the test fixture d'tor.\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureInSetUpTest.FailureInSetUp\n\u001b[0;32m[----------] \u001b[m1 test from AddFailureAtTest\n\u001b[0;32m[ RUN      ] \u001b[mAddFailureAtTest.MessageContainsSpecifiedFileAndLineNumber\nfoo.cc:42: Failure\nFailed\nExpected failure in foo.cc\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mAddFailureAtTest.MessageContainsSpecifiedFileAndLineNumber\n\u001b[0;32m[----------] \u001b[m4 tests from MixedUpTestCaseTest\n\u001b[0;32m[ RUN      ] \u001b[mMixedUpTestCaseTest.FirstTestFromNamespaceFoo\n\u001b[0;32m[       OK ] \u001b[mMixedUpTestCaseTest.FirstTestFromNamespaceFoo\n\u001b[0;32m[ RUN      ] \u001b[mMixedUpTestCaseTest.SecondTestFromNamespaceFoo\n\u001b[0;32m[       OK ] \u001b[mMixedUpTestCaseTest.SecondTestFromNamespaceFoo\n\u001b[0;32m[ RUN      ] \u001b[mMixedUpTestCaseTest.ThisShouldFail\ngtest.cc:#: Failure\nFailed\nAll tests in the same test case must use the same test fixture\nclass.  However, in test case MixedUpTestCaseTest,\nyou defined test FirstTestFromNamespaceFoo and test ThisShouldFail\nusing two different test fixture classes.  This can happen if\nthe two classes are from different namespaces or translation\nunits and have the same name.  You should probably rename one\nof the classes to put the tests into different test cases.\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mMixedUpTestCaseTest.ThisShouldFail\n\u001b[0;32m[ RUN      ] \u001b[mMixedUpTestCaseTest.ThisShouldFailToo\ngtest.cc:#: Failure\nFailed\nAll tests in the same test case must use the same test fixture\nclass.  However, in test case MixedUpTestCaseTest,\nyou defined test FirstTestFromNamespaceFoo and test ThisShouldFailToo\nusing two different test fixture classes.  This can happen if\nthe two classes are from different namespaces or translation\nunits and have the same name.  You should probably rename one\nof the classes to put the tests into different test cases.\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mMixedUpTestCaseTest.ThisShouldFailToo\n\u001b[0;32m[----------] \u001b[m2 tests from MixedUpTestCaseWithSameTestNameTest\n\u001b[0;32m[ RUN      ] \u001b[mMixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail\n\u001b[0;32m[       OK ] \u001b[mMixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail\n\u001b[0;32m[ RUN      ] \u001b[mMixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail\ngtest.cc:#: Failure\nFailed\nAll tests in the same test case must use the same test fixture\nclass.  However, in test case MixedUpTestCaseWithSameTestNameTest,\nyou defined test TheSecondTestWithThisNameShouldFail and test TheSecondTestWithThisNameShouldFail\nusing two different test fixture classes.  This can happen if\nthe two classes are from different namespaces or translation\nunits and have the same name.  You should probably rename one\nof the classes to put the tests into different test cases.\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mMixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail\n\u001b[0;32m[----------] \u001b[m2 tests from TEST_F_before_TEST_in_same_test_case\n\u001b[0;32m[ RUN      ] \u001b[mTEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F\n\u001b[0;32m[       OK ] \u001b[mTEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F\n\u001b[0;32m[ RUN      ] \u001b[mTEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail\ngtest.cc:#: Failure\nFailed\nAll tests in the same test case must use the same test fixture\nclass, so mixing TEST_F and TEST in the same test case is\nillegal.  In test case TEST_F_before_TEST_in_same_test_case,\ntest DefinedUsingTEST_F is defined using TEST_F but\ntest DefinedUsingTESTAndShouldFail is defined using TEST.  You probably\nwant to change the TEST to TEST_F or move it to another test\ncase.\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mTEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail\n\u001b[0;32m[----------] \u001b[m2 tests from TEST_before_TEST_F_in_same_test_case\n\u001b[0;32m[ RUN      ] \u001b[mTEST_before_TEST_F_in_same_test_case.DefinedUsingTEST\n\u001b[0;32m[       OK ] \u001b[mTEST_before_TEST_F_in_same_test_case.DefinedUsingTEST\n\u001b[0;32m[ RUN      ] \u001b[mTEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail\ngtest.cc:#: Failure\nFailed\nAll tests in the same test case must use the same test fixture\nclass, so mixing TEST_F and TEST in the same test case is\nillegal.  In test case TEST_before_TEST_F_in_same_test_case,\ntest DefinedUsingTEST_FAndShouldFail is defined using TEST_F but\ntest DefinedUsingTEST is defined using TEST.  You probably\nwant to change the TEST to TEST_F or move it to another test\ncase.\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mTEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail\n\u001b[0;32m[----------] \u001b[m8 tests from ExpectNonfatalFailureTest\n\u001b[0;32m[ RUN      ] \u001b[mExpectNonfatalFailureTest.CanReferenceGlobalVariables\n\u001b[0;32m[       OK ] \u001b[mExpectNonfatalFailureTest.CanReferenceGlobalVariables\n\u001b[0;32m[ RUN      ] \u001b[mExpectNonfatalFailureTest.CanReferenceLocalVariables\n\u001b[0;32m[       OK ] \u001b[mExpectNonfatalFailureTest.CanReferenceLocalVariables\n\u001b[0;32m[ RUN      ] \u001b[mExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure\n\u001b[0;32m[       OK ] \u001b[mExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual: 0 failures\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual: 2 failures\ngoogletest-output-test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure 1.\nStack trace: (omitted)\n\n\ngoogletest-output-test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure 2.\nStack trace: (omitted)\n\n\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures\n\u001b[0;32m[ RUN      ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual:\ngoogletest-output-test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\nStack trace: (omitted)\n\n\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectNonfatalFailureTest.FailsWhenStatementReturns\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual: 0 failures\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenStatementReturns\n\u001b[0;32m[ RUN      ] \u001b[mExpectNonfatalFailureTest.FailsWhenStatementThrows\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual: 0 failures\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenStatementThrows\n\u001b[0;32m[----------] \u001b[m8 tests from ExpectFatalFailureTest\n\u001b[0;32m[ RUN      ] \u001b[mExpectFatalFailureTest.CanReferenceGlobalVariables\n\u001b[0;32m[       OK ] \u001b[mExpectFatalFailureTest.CanReferenceGlobalVariables\n\u001b[0;32m[ RUN      ] \u001b[mExpectFatalFailureTest.CanReferenceLocalStaticVariables\n\u001b[0;32m[       OK ] \u001b[mExpectFatalFailureTest.CanReferenceLocalStaticVariables\n\u001b[0;32m[ RUN      ] \u001b[mExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure\n\u001b[0;32m[       OK ] \u001b[mExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual: 0 failures\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual: 2 failures\ngoogletest-output-test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\nStack trace: (omitted)\n\n\ngoogletest-output-test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\nStack trace: (omitted)\n\n\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures\n\u001b[0;32m[ RUN      ] \u001b[mExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual:\ngoogletest-output-test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure.\nStack trace: (omitted)\n\n\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectFatalFailureTest.FailsWhenStatementReturns\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual: 0 failures\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenStatementReturns\n\u001b[0;32m[ RUN      ] \u001b[mExpectFatalFailureTest.FailsWhenStatementThrows\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual: 0 failures\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenStatementThrows\n\u001b[0;32m[----------] \u001b[m2 tests from TypedTest/0, where TypeParam = int\n\u001b[0;32m[ RUN      ] \u001b[mTypedTest/0.Success\n\u001b[0;32m[       OK ] \u001b[mTypedTest/0.Success\n\u001b[0;32m[ RUN      ] \u001b[mTypedTest/0.Failure\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  1\n  TypeParam()\n    Which is: 0\nExpected failure\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mTypedTest/0.Failure, where TypeParam = int\n\u001b[0;32m[----------] \u001b[m2 tests from TypedTestWithNames/char0, where TypeParam = char\n\u001b[0;32m[ RUN      ] \u001b[mTypedTestWithNames/char0.Success\n\u001b[0;32m[       OK ] \u001b[mTypedTestWithNames/char0.Success\n\u001b[0;32m[ RUN      ] \u001b[mTypedTestWithNames/char0.Failure\ngoogletest-output-test_.cc:#: Failure\nFailed\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mTypedTestWithNames/char0.Failure, where TypeParam = char\n\u001b[0;32m[----------] \u001b[m2 tests from TypedTestWithNames/int1, where TypeParam = int\n\u001b[0;32m[ RUN      ] \u001b[mTypedTestWithNames/int1.Success\n\u001b[0;32m[       OK ] \u001b[mTypedTestWithNames/int1.Success\n\u001b[0;32m[ RUN      ] \u001b[mTypedTestWithNames/int1.Failure\ngoogletest-output-test_.cc:#: Failure\nFailed\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mTypedTestWithNames/int1.Failure, where TypeParam = int\n\u001b[0;32m[----------] \u001b[m2 tests from Unsigned/TypedTestP/0, where TypeParam = unsigned char\n\u001b[0;32m[ RUN      ] \u001b[mUnsigned/TypedTestP/0.Success\n\u001b[0;32m[       OK ] \u001b[mUnsigned/TypedTestP/0.Success\n\u001b[0;32m[ RUN      ] \u001b[mUnsigned/TypedTestP/0.Failure\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  1U\n    Which is: 1\n  TypeParam()\n    Which is: '\\0'\nExpected failure\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mUnsigned/TypedTestP/0.Failure, where TypeParam = unsigned char\n\u001b[0;32m[----------] \u001b[m2 tests from Unsigned/TypedTestP/1, where TypeParam = unsigned int\n\u001b[0;32m[ RUN      ] \u001b[mUnsigned/TypedTestP/1.Success\n\u001b[0;32m[       OK ] \u001b[mUnsigned/TypedTestP/1.Success\n\u001b[0;32m[ RUN      ] \u001b[mUnsigned/TypedTestP/1.Failure\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  1U\n    Which is: 1\n  TypeParam()\n    Which is: 0\nExpected failure\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mUnsigned/TypedTestP/1.Failure, where TypeParam = unsigned int\n\u001b[0;32m[----------] \u001b[m2 tests from UnsignedCustomName/TypedTestP/unsignedChar0, where TypeParam = unsigned char\n\u001b[0;32m[ RUN      ] \u001b[mUnsignedCustomName/TypedTestP/unsignedChar0.Success\n\u001b[0;32m[       OK ] \u001b[mUnsignedCustomName/TypedTestP/unsignedChar0.Success\n\u001b[0;32m[ RUN      ] \u001b[mUnsignedCustomName/TypedTestP/unsignedChar0.Failure\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  1U\n    Which is: 1\n  TypeParam()\n    Which is: '\\0'\nExpected failure\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mUnsignedCustomName/TypedTestP/unsignedChar0.Failure, where TypeParam = unsigned char\n\u001b[0;32m[----------] \u001b[m2 tests from UnsignedCustomName/TypedTestP/unsignedInt1, where TypeParam = unsigned int\n\u001b[0;32m[ RUN      ] \u001b[mUnsignedCustomName/TypedTestP/unsignedInt1.Success\n\u001b[0;32m[       OK ] \u001b[mUnsignedCustomName/TypedTestP/unsignedInt1.Success\n\u001b[0;32m[ RUN      ] \u001b[mUnsignedCustomName/TypedTestP/unsignedInt1.Failure\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  1U\n    Which is: 1\n  TypeParam()\n    Which is: 0\nExpected failure\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mUnsignedCustomName/TypedTestP/unsignedInt1.Failure, where TypeParam = unsigned int\n\u001b[0;32m[----------] \u001b[m4 tests from ExpectFailureTest\n\u001b[0;32m[ RUN      ] \u001b[mExpectFailureTest.ExpectFatalFailure\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual:\ngoogletest-output-test_.cc:#: Success:\nSucceeded\nStack trace: (omitted)\n\n\nStack trace: (omitted)\n\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual:\ngoogletest-output-test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure.\nStack trace: (omitted)\n\n\nStack trace: (omitted)\n\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure containing \"Some other fatal failure expected.\"\n  Actual:\ngoogletest-output-test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\nStack trace: (omitted)\n\n\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureTest.ExpectFatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectFailureTest.ExpectNonFatalFailure\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual:\ngoogletest-output-test_.cc:#: Success:\nSucceeded\nStack trace: (omitted)\n\n\nStack trace: (omitted)\n\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual:\ngoogletest-output-test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\nStack trace: (omitted)\n\n\nStack trace: (omitted)\n\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure containing \"Some other non-fatal failure.\"\n  Actual:\ngoogletest-output-test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure.\nStack trace: (omitted)\n\n\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureTest.ExpectNonFatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectFailureTest.ExpectFatalFailureOnAllThreads\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual:\ngoogletest-output-test_.cc:#: Success:\nSucceeded\nStack trace: (omitted)\n\n\nStack trace: (omitted)\n\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual:\ngoogletest-output-test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure.\nStack trace: (omitted)\n\n\nStack trace: (omitted)\n\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure containing \"Some other fatal failure expected.\"\n  Actual:\ngoogletest-output-test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\nStack trace: (omitted)\n\n\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureTest.ExpectFatalFailureOnAllThreads\n\u001b[0;32m[ RUN      ] \u001b[mExpectFailureTest.ExpectNonFatalFailureOnAllThreads\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual:\ngoogletest-output-test_.cc:#: Success:\nSucceeded\nStack trace: (omitted)\n\n\nStack trace: (omitted)\n\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual:\ngoogletest-output-test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\nStack trace: (omitted)\n\n\nStack trace: (omitted)\n\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure containing \"Some other non-fatal failure.\"\n  Actual:\ngoogletest-output-test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure.\nStack trace: (omitted)\n\n\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureTest.ExpectNonFatalFailureOnAllThreads\n\u001b[0;32m[----------] \u001b[m2 tests from ExpectFailureWithThreadsTest\n\u001b[0;32m[ RUN      ] \u001b[mExpectFailureWithThreadsTest.ExpectFatalFailure\n(expecting 2 failures)\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected fatal failure.\nStack trace: (omitted)\n\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual: 0 failures\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureWithThreadsTest.ExpectFatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectFailureWithThreadsTest.ExpectNonFatalFailure\n(expecting 2 failures)\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected non-fatal failure.\nStack trace: (omitted)\n\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual: 0 failures\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureWithThreadsTest.ExpectNonFatalFailure\n\u001b[0;32m[----------] \u001b[m1 test from ScopedFakeTestPartResultReporterTest\n\u001b[0;32m[ RUN      ] \u001b[mScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread\n(expecting 2 failures)\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected fatal failure.\nStack trace: (omitted)\n\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected non-fatal failure.\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread\n\u001b[0;32m[----------] \u001b[m1 test from PrintingFailingParams/FailingParamTest\n\u001b[0;32m[ RUN      ] \u001b[mPrintingFailingParams/FailingParamTest.Fails/0\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  1\n  GetParam()\n    Which is: 2\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mPrintingFailingParams/FailingParamTest.Fails/0, where GetParam() = 2\n\u001b[0;32m[----------] \u001b[m2 tests from PrintingStrings/ParamTest\n\u001b[0;32m[ RUN      ] \u001b[mPrintingStrings/ParamTest.Success/a\n\u001b[0;32m[       OK ] \u001b[mPrintingStrings/ParamTest.Success/a\n\u001b[0;32m[ RUN      ] \u001b[mPrintingStrings/ParamTest.Failure/a\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  \"b\"\n  GetParam()\n    Which is: \"a\"\nExpected failure\nStack trace: (omitted)\n\n\u001b[0;31m[  FAILED  ] \u001b[mPrintingStrings/ParamTest.Failure/a, where GetParam() = \"a\"\n\u001b[0;32m[----------] \u001b[mGlobal test environment tear-down\nBarEnvironment::TearDown() called.\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected non-fatal failure.\nStack trace: (omitted)\n\nFooEnvironment::TearDown() called.\ngoogletest-output-test_.cc:#: Failure\nFailed\nExpected fatal failure.\nStack trace: (omitted)\n\n\u001b[0;32m[==========] \u001b[m76 tests from 34 test cases ran.\n\u001b[0;32m[  PASSED  ] \u001b[m26 tests.\n\u001b[0;31m[  FAILED  ] \u001b[m50 tests, listed below:\n\u001b[0;31m[  FAILED  ] \u001b[mNonfatalFailureTest.EscapesStringOperands\n\u001b[0;31m[  FAILED  ] \u001b[mNonfatalFailureTest.DiffForLongStrings\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureTest.FatalFailureInSubroutine\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureTest.FatalFailureInNestedSubroutine\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureTest.NonfatalFailureInSubroutine\n\u001b[0;31m[  FAILED  ] \u001b[mLoggingTest.InterleavingLoggingAndAssertions\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.AcceptedValues\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.ObeysScopes\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.WorksInLoop\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.WorksInSubroutine\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.CanBeNested\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.CanBeRepeated\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.WorksConcurrently\n\u001b[0;31m[  FAILED  ] \u001b[mScopedTraceTest.WithExplicitFileAndLine\n\u001b[0;31m[  FAILED  ] \u001b[mNonFatalFailureInFixtureConstructorTest.FailureInConstructor\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureInFixtureConstructorTest.FailureInConstructor\n\u001b[0;31m[  FAILED  ] \u001b[mNonFatalFailureInSetUpTest.FailureInSetUp\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureInSetUpTest.FailureInSetUp\n\u001b[0;31m[  FAILED  ] \u001b[mAddFailureAtTest.MessageContainsSpecifiedFileAndLineNumber\n\u001b[0;31m[  FAILED  ] \u001b[mMixedUpTestCaseTest.ThisShouldFail\n\u001b[0;31m[  FAILED  ] \u001b[mMixedUpTestCaseTest.ThisShouldFailToo\n\u001b[0;31m[  FAILED  ] \u001b[mMixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail\n\u001b[0;31m[  FAILED  ] \u001b[mTEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail\n\u001b[0;31m[  FAILED  ] \u001b[mTEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenStatementReturns\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenStatementThrows\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenStatementReturns\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenStatementThrows\n\u001b[0;31m[  FAILED  ] \u001b[mTypedTest/0.Failure, where TypeParam = int\n\u001b[0;31m[  FAILED  ] \u001b[mTypedTestWithNames/char0.Failure, where TypeParam = char\n\u001b[0;31m[  FAILED  ] \u001b[mTypedTestWithNames/int1.Failure, where TypeParam = int\n\u001b[0;31m[  FAILED  ] \u001b[mUnsigned/TypedTestP/0.Failure, where TypeParam = unsigned char\n\u001b[0;31m[  FAILED  ] \u001b[mUnsigned/TypedTestP/1.Failure, where TypeParam = unsigned int\n\u001b[0;31m[  FAILED  ] \u001b[mUnsignedCustomName/TypedTestP/unsignedChar0.Failure, where TypeParam = unsigned char\n\u001b[0;31m[  FAILED  ] \u001b[mUnsignedCustomName/TypedTestP/unsignedInt1.Failure, where TypeParam = unsigned int\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureTest.ExpectFatalFailure\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureTest.ExpectNonFatalFailure\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureTest.ExpectFatalFailureOnAllThreads\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureTest.ExpectNonFatalFailureOnAllThreads\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureWithThreadsTest.ExpectFatalFailure\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureWithThreadsTest.ExpectNonFatalFailure\n\u001b[0;31m[  FAILED  ] \u001b[mScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread\n\u001b[0;31m[  FAILED  ] \u001b[mPrintingFailingParams/FailingParamTest.Fails/0, where GetParam() = 2\n\u001b[0;31m[  FAILED  ] \u001b[mPrintingStrings/ParamTest.Failure/a, where GetParam() = \"a\"\n\n50 FAILED TESTS\n\u001b[0;33m  YOU HAVE 1 DISABLED TEST\n\n\u001b[mNote: Google Test filter = FatalFailureTest.*:LoggingTest.*\n[==========] Running 4 tests from 2 test cases.\n[----------] Global test environment set-up.\n[----------] 3 tests from FatalFailureTest\n[ RUN      ] FatalFailureTest.FatalFailureInSubroutine\n(expecting a failure that x should be 1)\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  1\n  x\n    Which is: 2\nStack trace: (omitted)\n\n[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine (? ms)\n[ RUN      ] FatalFailureTest.FatalFailureInNestedSubroutine\n(expecting a failure that x should be 1)\ngoogletest-output-test_.cc:#: Failure\nExpected equality of these values:\n  1\n  x\n    Which is: 2\nStack trace: (omitted)\n\n[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine (? ms)\n[ RUN      ] FatalFailureTest.NonfatalFailureInSubroutine\n(expecting a failure on false)\ngoogletest-output-test_.cc:#: Failure\nValue of: false\n  Actual: false\nExpected: true\nStack trace: (omitted)\n\n[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine (? ms)\n[----------] 3 tests from FatalFailureTest (? ms total)\n\n[----------] 1 test from LoggingTest\n[ RUN      ] LoggingTest.InterleavingLoggingAndAssertions\n(expecting 2 failures on (3) >= (a[i]))\ni == 0\ni == 1\ngoogletest-output-test_.cc:#: Failure\nExpected: (3) >= (a[i]), actual: 3 vs 9\nStack trace: (omitted)\n\ni == 2\ni == 3\ngoogletest-output-test_.cc:#: Failure\nExpected: (3) >= (a[i]), actual: 3 vs 6\nStack trace: (omitted)\n\n[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions (? ms)\n[----------] 1 test from LoggingTest (? ms total)\n\n[----------] Global test environment tear-down\n[==========] 4 tests from 2 test cases ran. (? ms total)\n[  PASSED  ] 0 tests.\n[  FAILED  ] 4 tests, listed below:\n[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine\n[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine\n[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine\n[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions\n\n 4 FAILED TESTS\nNote: Google Test filter = *DISABLED_*\n[==========] Running 1 test from 1 test case.\n[----------] Global test environment set-up.\n[----------] 1 test from DisabledTestsWarningTest\n[ RUN      ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning\n[       OK ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning\n[----------] Global test environment tear-down\n[==========] 1 test from 1 test case ran.\n[  PASSED  ] 1 test.\nNote: Google Test filter = PassingTest.*\nNote: This is test shard 2 of 2.\n[==========] Running 1 test from 1 test case.\n[----------] Global test environment set-up.\n[----------] 1 test from PassingTest\n[ RUN      ] PassingTest.PassingTest2\n[       OK ] PassingTest.PassingTest2\n[----------] Global test environment tear-down\n[==========] 1 test from 1 test case ran.\n[  PASSED  ] 1 test.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-output-test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Tests the text output of Google C++ Testing and Mocking Framework.\n\nTo update the golden file:\ngoogletest_output_test.py --build_dir=BUILD/DIR --gengolden\nwhere BUILD/DIR contains the built googletest-output-test_ file.\ngoogletest_output_test.py --gengolden\ngoogletest_output_test.py\n\"\"\"\n\nimport difflib\nimport os\nimport re\nimport sys\nimport gtest_test_utils\n\n\n# The flag for generating the golden file\nGENGOLDEN_FLAG = '--gengolden'\nCATCH_EXCEPTIONS_ENV_VAR_NAME = 'GTEST_CATCH_EXCEPTIONS'\n\n# The flag indicating stacktraces are not supported\nNO_STACKTRACE_SUPPORT_FLAG = '--no_stacktrace_support'\n\nIS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'\nIS_WINDOWS = os.name == 'nt'\n\n# FIXME: remove the _lin suffix.\nGOLDEN_NAME = 'googletest-output-test-golden-lin.txt'\n\nPROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('googletest-output-test_')\n\n# At least one command we exercise must not have the\n# 'internal_skip_environment_and_ad_hoc_tests' argument.\nCOMMAND_LIST_TESTS = ({}, [PROGRAM_PATH, '--gtest_list_tests'])\nCOMMAND_WITH_COLOR = ({}, [PROGRAM_PATH, '--gtest_color=yes'])\nCOMMAND_WITH_TIME = ({}, [PROGRAM_PATH,\n                          '--gtest_print_time',\n                          'internal_skip_environment_and_ad_hoc_tests',\n                          '--gtest_filter=FatalFailureTest.*:LoggingTest.*'])\nCOMMAND_WITH_DISABLED = (\n    {}, [PROGRAM_PATH,\n         '--gtest_also_run_disabled_tests',\n         'internal_skip_environment_and_ad_hoc_tests',\n         '--gtest_filter=*DISABLED_*'])\nCOMMAND_WITH_SHARDING = (\n    {'GTEST_SHARD_INDEX': '1', 'GTEST_TOTAL_SHARDS': '2'},\n    [PROGRAM_PATH,\n     'internal_skip_environment_and_ad_hoc_tests',\n     '--gtest_filter=PassingTest.*'])\n\nGOLDEN_PATH = os.path.join(gtest_test_utils.GetSourceDir(), GOLDEN_NAME)\n\n\ndef ToUnixLineEnding(s):\n  \"\"\"Changes all Windows/Mac line endings in s to UNIX line endings.\"\"\"\n\n  return s.replace('\\r\\n', '\\n').replace('\\r', '\\n')\n\n\ndef RemoveLocations(test_output):\n  \"\"\"Removes all file location info from a Google Test program's output.\n\n  Args:\n       test_output:  the output of a Google Test program.\n\n  Returns:\n       output with all file location info (in the form of\n       'DIRECTORY/FILE_NAME:LINE_NUMBER: 'or\n       'DIRECTORY\\\\FILE_NAME(LINE_NUMBER): ') replaced by\n       'FILE_NAME:#: '.\n  \"\"\"\n\n  return re.sub(r'.*[/\\\\]((googletest-output-test_|gtest).cc)(\\:\\d+|\\(\\d+\\))\\: ',\n                r'\\1:#: ', test_output)\n\n\ndef RemoveStackTraceDetails(output):\n  \"\"\"Removes all stack traces from a Google Test program's output.\"\"\"\n\n  # *? means \"find the shortest string that matches\".\n  return re.sub(r'Stack trace:(.|\\n)*?\\n\\n',\n                'Stack trace: (omitted)\\n\\n', output)\n\n\ndef RemoveStackTraces(output):\n  \"\"\"Removes all traces of stack traces from a Google Test program's output.\"\"\"\n\n  # *? means \"find the shortest string that matches\".\n  return re.sub(r'Stack trace:(.|\\n)*?\\n\\n', '', output)\n\n\ndef RemoveTime(output):\n  \"\"\"Removes all time information from a Google Test program's output.\"\"\"\n\n  return re.sub(r'\\(\\d+ ms', '(? ms', output)\n\n\ndef RemoveTypeInfoDetails(test_output):\n  \"\"\"Removes compiler-specific type info from Google Test program's output.\n\n  Args:\n       test_output:  the output of a Google Test program.\n\n  Returns:\n       output with type information normalized to canonical form.\n  \"\"\"\n\n  # some compilers output the name of type 'unsigned int' as 'unsigned'\n  return re.sub(r'unsigned int', 'unsigned', test_output)\n\n\ndef NormalizeToCurrentPlatform(test_output):\n  \"\"\"Normalizes platform specific output details for easier comparison.\"\"\"\n\n  if IS_WINDOWS:\n    # Removes the color information that is not present on Windows.\n    test_output = re.sub('\\x1b\\\\[(0;3\\d)?m', '', test_output)\n    # Changes failure message headers into the Windows format.\n    test_output = re.sub(r': Failure\\n', r': error: ', test_output)\n    # Changes file(line_number) to file:line_number.\n    test_output = re.sub(r'((\\w|\\.)+)\\((\\d+)\\):', r'\\1:\\3:', test_output)\n\n  return test_output\n\n\ndef RemoveTestCounts(output):\n  \"\"\"Removes test counts from a Google Test program's output.\"\"\"\n\n  output = re.sub(r'\\d+ tests?, listed below',\n                  '? tests, listed below', output)\n  output = re.sub(r'\\d+ FAILED TESTS',\n                  '? FAILED TESTS', output)\n  output = re.sub(r'\\d+ tests? from \\d+ test cases?',\n                  '? tests from ? test cases', output)\n  output = re.sub(r'\\d+ tests? from ([a-zA-Z_])',\n                  r'? tests from \\1', output)\n  return re.sub(r'\\d+ tests?\\.', '? tests.', output)\n\n\ndef RemoveMatchingTests(test_output, pattern):\n  \"\"\"Removes output of specified tests from a Google Test program's output.\n\n  This function strips not only the beginning and the end of a test but also\n  all output in between.\n\n  Args:\n    test_output:       A string containing the test output.\n    pattern:           A regex string that matches names of test cases or\n                       tests to remove.\n\n  Returns:\n    Contents of test_output with tests whose names match pattern removed.\n  \"\"\"\n\n  test_output = re.sub(\n      r'.*\\[ RUN      \\] .*%s(.|\\n)*?\\[(  FAILED  |       OK )\\] .*%s.*\\n' % (\n          pattern, pattern),\n      '',\n      test_output)\n  return re.sub(r'.*%s.*\\n' % pattern, '', test_output)\n\n\ndef NormalizeOutput(output):\n  \"\"\"Normalizes output (the output of googletest-output-test_.exe).\"\"\"\n\n  output = ToUnixLineEnding(output)\n  output = RemoveLocations(output)\n  output = RemoveStackTraceDetails(output)\n  output = RemoveTime(output)\n  return output\n\n\ndef GetShellCommandOutput(env_cmd):\n  \"\"\"Runs a command in a sub-process, and returns its output in a string.\n\n  Args:\n    env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra\n             environment variables to set, and element 1 is a string with\n             the command and any flags.\n\n  Returns:\n    A string with the command's combined standard and diagnostic output.\n  \"\"\"\n\n  # Spawns cmd in a sub-process, and gets its standard I/O file objects.\n  # Set and save the environment properly.\n  environ = os.environ.copy()\n  environ.update(env_cmd[0])\n  p = gtest_test_utils.Subprocess(env_cmd[1], env=environ)\n\n  return p.output\n\n\ndef GetCommandOutput(env_cmd):\n  \"\"\"Runs a command and returns its output with all file location\n  info stripped off.\n\n  Args:\n    env_cmd:  The shell command. A 2-tuple where element 0 is a dict of extra\n              environment variables to set, and element 1 is a string with\n              the command and any flags.\n  \"\"\"\n\n  # Disables exception pop-ups on Windows.\n  environ, cmdline = env_cmd\n  environ = dict(environ)  # Ensures we are modifying a copy.\n  environ[CATCH_EXCEPTIONS_ENV_VAR_NAME] = '1'\n  return NormalizeOutput(GetShellCommandOutput((environ, cmdline)))\n\n\ndef GetOutputOfAllCommands():\n  \"\"\"Returns concatenated output from several representative commands.\"\"\"\n\n  return (GetCommandOutput(COMMAND_WITH_COLOR) +\n          GetCommandOutput(COMMAND_WITH_TIME) +\n          GetCommandOutput(COMMAND_WITH_DISABLED) +\n          GetCommandOutput(COMMAND_WITH_SHARDING))\n\n\ntest_list = GetShellCommandOutput(COMMAND_LIST_TESTS)\nSUPPORTS_DEATH_TESTS = 'DeathTest' in test_list\nSUPPORTS_TYPED_TESTS = 'TypedTest' in test_list\nSUPPORTS_THREADS = 'ExpectFailureWithThreadsTest' in test_list\nSUPPORTS_STACK_TRACES = NO_STACKTRACE_SUPPORT_FLAG not in sys.argv\n\nCAN_GENERATE_GOLDEN_FILE = (SUPPORTS_DEATH_TESTS and\n                            SUPPORTS_TYPED_TESTS and\n                            SUPPORTS_THREADS and\n                            SUPPORTS_STACK_TRACES)\n\nclass GTestOutputTest(gtest_test_utils.TestCase):\n  def RemoveUnsupportedTests(self, test_output):\n    if not SUPPORTS_DEATH_TESTS:\n      test_output = RemoveMatchingTests(test_output, 'DeathTest')\n    if not SUPPORTS_TYPED_TESTS:\n      test_output = RemoveMatchingTests(test_output, 'TypedTest')\n      test_output = RemoveMatchingTests(test_output, 'TypedDeathTest')\n      test_output = RemoveMatchingTests(test_output, 'TypeParamDeathTest')\n    if not SUPPORTS_THREADS:\n      test_output = RemoveMatchingTests(test_output,\n                                        'ExpectFailureWithThreadsTest')\n      test_output = RemoveMatchingTests(test_output,\n                                        'ScopedFakeTestPartResultReporterTest')\n      test_output = RemoveMatchingTests(test_output,\n                                        'WorksConcurrently')\n    if not SUPPORTS_STACK_TRACES:\n      test_output = RemoveStackTraces(test_output)\n\n    return test_output\n\n  def testOutput(self):\n    output = GetOutputOfAllCommands()\n\n    golden_file = open(GOLDEN_PATH, 'rb')\n    # A mis-configured source control system can cause \\r appear in EOL\n    # sequences when we read the golden file irrespective of an operating\n    # system used. Therefore, we need to strip those \\r's from newlines\n    # unconditionally.\n    golden = ToUnixLineEnding(golden_file.read())\n    golden_file.close()\n\n    # We want the test to pass regardless of certain features being\n    # supported or not.\n\n    # We still have to remove type name specifics in all cases.\n    normalized_actual = RemoveTypeInfoDetails(output)\n    normalized_golden = RemoveTypeInfoDetails(golden)\n\n    if CAN_GENERATE_GOLDEN_FILE:\n      self.assertEqual(normalized_golden, normalized_actual,\n                       '\\n'.join(difflib.unified_diff(\n                           normalized_golden.split('\\n'),\n                           normalized_actual.split('\\n'),\n                           'golden', 'actual')))\n    else:\n      normalized_actual = NormalizeToCurrentPlatform(\n          RemoveTestCounts(normalized_actual))\n      normalized_golden = NormalizeToCurrentPlatform(\n          RemoveTestCounts(self.RemoveUnsupportedTests(normalized_golden)))\n\n      # This code is very handy when debugging golden file differences:\n      if os.getenv('DEBUG_GTEST_OUTPUT_TEST'):\n        open(os.path.join(\n            gtest_test_utils.GetSourceDir(),\n            '_googletest-output-test_normalized_actual.txt'), 'wb').write(\n                normalized_actual)\n        open(os.path.join(\n            gtest_test_utils.GetSourceDir(),\n            '_googletest-output-test_normalized_golden.txt'), 'wb').write(\n                normalized_golden)\n\n      self.assertEqual(normalized_golden, normalized_actual)\n\n\nif __name__ == '__main__':\n  if NO_STACKTRACE_SUPPORT_FLAG in sys.argv:\n    # unittest.main() can't handle unknown flags\n    sys.argv.remove(NO_STACKTRACE_SUPPORT_FLAG)\n\n  if GENGOLDEN_FLAG in sys.argv:\n    if CAN_GENERATE_GOLDEN_FILE:\n      output = GetOutputOfAllCommands()\n      golden_file = open(GOLDEN_PATH, 'wb')\n      golden_file.write(output)\n      golden_file.close()\n    else:\n      message = (\n          \"\"\"Unable to write a golden file when compiled in an environment\nthat does not support all the required features (death tests,\ntyped tests, stack traces, and multiple threads).\nPlease build this test and generate the golden file using Blaze on Linux.\"\"\")\n\n      sys.stderr.write(message)\n      sys.exit(1)\n  else:\n    gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-output-test_.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// The purpose of this file is to generate Google Test output under\n// various conditions.  The output will then be verified by\n// googletest-output-test.py to ensure that Google Test generates the\n// desired messages.  Therefore, most tests in this file are MEANT TO\n// FAIL.\n\n#include \"gtest/gtest-spi.h\"\n#include \"gtest/gtest.h\"\n#include \"src/gtest-internal-inl.h\"\n\n#include <stdlib.h>\n\n#if _MSC_VER\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4127 /* conditional expression is constant */)\n#endif  //  _MSC_VER\n\n#if GTEST_IS_THREADSAFE\nusing testing::ScopedFakeTestPartResultReporter;\nusing testing::TestPartResultArray;\n\nusing testing::internal::Notification;\nusing testing::internal::ThreadWithParam;\n#endif\n\nnamespace posix = ::testing::internal::posix;\n\n// Tests catching fatal failures.\n\n// A subroutine used by the following test.\nvoid TestEq1(int x) {\n  ASSERT_EQ(1, x);\n}\n\n// This function calls a test subroutine, catches the fatal failure it\n// generates, and then returns early.\nvoid TryTestSubroutine() {\n  // Calls a subrountine that yields a fatal failure.\n  TestEq1(2);\n\n  // Catches the fatal failure and aborts the test.\n  //\n  // The testing::Test:: prefix is necessary when calling\n  // HasFatalFailure() outside of a TEST, TEST_F, or test fixture.\n  if (testing::Test::HasFatalFailure()) return;\n\n  // If we get here, something is wrong.\n  FAIL() << \"This should never be reached.\";\n}\n\nTEST(PassingTest, PassingTest1) {\n}\n\nTEST(PassingTest, PassingTest2) {\n}\n\n// Tests that parameters of failing parameterized tests are printed in the\n// failing test summary.\nclass FailingParamTest : public testing::TestWithParam<int> {};\n\nTEST_P(FailingParamTest, Fails) {\n  EXPECT_EQ(1, GetParam());\n}\n\n// This generates a test which will fail. Google Test is expected to print\n// its parameter when it outputs the list of all failed tests.\nINSTANTIATE_TEST_CASE_P(PrintingFailingParams,\n                        FailingParamTest,\n                        testing::Values(2));\n\nstatic const char kGoldenString[] = \"\\\"Line\\0 1\\\"\\nLine 2\";\n\nTEST(NonfatalFailureTest, EscapesStringOperands) {\n  std::string actual = \"actual \\\"string\\\"\";\n  EXPECT_EQ(kGoldenString, actual);\n\n  const char* golden = kGoldenString;\n  EXPECT_EQ(golden, actual);\n}\n\nTEST(NonfatalFailureTest, DiffForLongStrings) {\n  std::string golden_str(kGoldenString, sizeof(kGoldenString) - 1);\n  EXPECT_EQ(golden_str, \"Line 2\");\n}\n\n// Tests catching a fatal failure in a subroutine.\nTEST(FatalFailureTest, FatalFailureInSubroutine) {\n  printf(\"(expecting a failure that x should be 1)\\n\");\n\n  TryTestSubroutine();\n}\n\n// Tests catching a fatal failure in a nested subroutine.\nTEST(FatalFailureTest, FatalFailureInNestedSubroutine) {\n  printf(\"(expecting a failure that x should be 1)\\n\");\n\n  // Calls a subrountine that yields a fatal failure.\n  TryTestSubroutine();\n\n  // Catches the fatal failure and aborts the test.\n  //\n  // When calling HasFatalFailure() inside a TEST, TEST_F, or test\n  // fixture, the testing::Test:: prefix is not needed.\n  if (HasFatalFailure()) return;\n\n  // If we get here, something is wrong.\n  FAIL() << \"This should never be reached.\";\n}\n\n// Tests HasFatalFailure() after a failed EXPECT check.\nTEST(FatalFailureTest, NonfatalFailureInSubroutine) {\n  printf(\"(expecting a failure on false)\\n\");\n  EXPECT_TRUE(false);  // Generates a nonfatal failure\n  ASSERT_FALSE(HasFatalFailure());  // This should succeed.\n}\n\n// Tests interleaving user logging and Google Test assertions.\nTEST(LoggingTest, InterleavingLoggingAndAssertions) {\n  static const int a[4] = {\n    3, 9, 2, 6\n  };\n\n  printf(\"(expecting 2 failures on (3) >= (a[i]))\\n\");\n  for (int i = 0; i < static_cast<int>(sizeof(a)/sizeof(*a)); i++) {\n    printf(\"i == %d\\n\", i);\n    EXPECT_GE(3, a[i]);\n  }\n}\n\n// Tests the SCOPED_TRACE macro.\n\n// A helper function for testing SCOPED_TRACE.\nvoid SubWithoutTrace(int n) {\n  EXPECT_EQ(1, n);\n  ASSERT_EQ(2, n);\n}\n\n// Another helper function for testing SCOPED_TRACE.\nvoid SubWithTrace(int n) {\n  SCOPED_TRACE(testing::Message() << \"n = \" << n);\n\n  SubWithoutTrace(n);\n}\n\nTEST(SCOPED_TRACETest, AcceptedValues) {\n  SCOPED_TRACE(\"literal string\");\n  SCOPED_TRACE(std::string(\"std::string\"));\n  SCOPED_TRACE(1337);  // streamable type\n  const char* null_value = NULL;\n  SCOPED_TRACE(null_value);\n\n  ADD_FAILURE() << \"Just checking that all these values work fine.\";\n}\n\n// Tests that SCOPED_TRACE() obeys lexical scopes.\nTEST(SCOPED_TRACETest, ObeysScopes) {\n  printf(\"(expected to fail)\\n\");\n\n  // There should be no trace before SCOPED_TRACE() is invoked.\n  ADD_FAILURE() << \"This failure is expected, and shouldn't have a trace.\";\n\n  {\n    SCOPED_TRACE(\"Expected trace\");\n    // After SCOPED_TRACE(), a failure in the current scope should contain\n    // the trace.\n    ADD_FAILURE() << \"This failure is expected, and should have a trace.\";\n  }\n\n  // Once the control leaves the scope of the SCOPED_TRACE(), there\n  // should be no trace again.\n  ADD_FAILURE() << \"This failure is expected, and shouldn't have a trace.\";\n}\n\n// Tests that SCOPED_TRACE works inside a loop.\nTEST(SCOPED_TRACETest, WorksInLoop) {\n  printf(\"(expected to fail)\\n\");\n\n  for (int i = 1; i <= 2; i++) {\n    SCOPED_TRACE(testing::Message() << \"i = \" << i);\n\n    SubWithoutTrace(i);\n  }\n}\n\n// Tests that SCOPED_TRACE works in a subroutine.\nTEST(SCOPED_TRACETest, WorksInSubroutine) {\n  printf(\"(expected to fail)\\n\");\n\n  SubWithTrace(1);\n  SubWithTrace(2);\n}\n\n// Tests that SCOPED_TRACE can be nested.\nTEST(SCOPED_TRACETest, CanBeNested) {\n  printf(\"(expected to fail)\\n\");\n\n  SCOPED_TRACE(\"\");  // A trace without a message.\n\n  SubWithTrace(2);\n}\n\n// Tests that multiple SCOPED_TRACEs can be used in the same scope.\nTEST(SCOPED_TRACETest, CanBeRepeated) {\n  printf(\"(expected to fail)\\n\");\n\n  SCOPED_TRACE(\"A\");\n  ADD_FAILURE()\n      << \"This failure is expected, and should contain trace point A.\";\n\n  SCOPED_TRACE(\"B\");\n  ADD_FAILURE()\n      << \"This failure is expected, and should contain trace point A and B.\";\n\n  {\n    SCOPED_TRACE(\"C\");\n    ADD_FAILURE() << \"This failure is expected, and should \"\n                  << \"contain trace point A, B, and C.\";\n  }\n\n  SCOPED_TRACE(\"D\");\n  ADD_FAILURE() << \"This failure is expected, and should \"\n                << \"contain trace point A, B, and D.\";\n}\n\n#if GTEST_IS_THREADSAFE\n// Tests that SCOPED_TRACE()s can be used concurrently from multiple\n// threads.  Namely, an assertion should be affected by\n// SCOPED_TRACE()s in its own thread only.\n\n// Here's the sequence of actions that happen in the test:\n//\n//   Thread A (main)                | Thread B (spawned)\n//   ===============================|================================\n//   spawns thread B                |\n//   -------------------------------+--------------------------------\n//   waits for n1                   | SCOPED_TRACE(\"Trace B\");\n//                                  | generates failure #1\n//                                  | notifies n1\n//   -------------------------------+--------------------------------\n//   SCOPED_TRACE(\"Trace A\");       | waits for n2\n//   generates failure #2           |\n//   notifies n2                    |\n//   -------------------------------|--------------------------------\n//   waits for n3                   | generates failure #3\n//                                  | trace B dies\n//                                  | generates failure #4\n//                                  | notifies n3\n//   -------------------------------|--------------------------------\n//   generates failure #5           | finishes\n//   trace A dies                   |\n//   generates failure #6           |\n//   -------------------------------|--------------------------------\n//   waits for thread B to finish   |\n\nstruct CheckPoints {\n  Notification n1;\n  Notification n2;\n  Notification n3;\n};\n\nstatic void ThreadWithScopedTrace(CheckPoints* check_points) {\n  {\n    SCOPED_TRACE(\"Trace B\");\n    ADD_FAILURE()\n        << \"Expected failure #1 (in thread B, only trace B alive).\";\n    check_points->n1.Notify();\n    check_points->n2.WaitForNotification();\n\n    ADD_FAILURE()\n        << \"Expected failure #3 (in thread B, trace A & B both alive).\";\n  }  // Trace B dies here.\n  ADD_FAILURE()\n      << \"Expected failure #4 (in thread B, only trace A alive).\";\n  check_points->n3.Notify();\n}\n\nTEST(SCOPED_TRACETest, WorksConcurrently) {\n  printf(\"(expecting 6 failures)\\n\");\n\n  CheckPoints check_points;\n  ThreadWithParam<CheckPoints*> thread(&ThreadWithScopedTrace,\n                                       &check_points,\n                                       NULL);\n  check_points.n1.WaitForNotification();\n\n  {\n    SCOPED_TRACE(\"Trace A\");\n    ADD_FAILURE()\n        << \"Expected failure #2 (in thread A, trace A & B both alive).\";\n    check_points.n2.Notify();\n    check_points.n3.WaitForNotification();\n\n    ADD_FAILURE()\n        << \"Expected failure #5 (in thread A, only trace A alive).\";\n  }  // Trace A dies here.\n  ADD_FAILURE()\n      << \"Expected failure #6 (in thread A, no trace alive).\";\n  thread.Join();\n}\n#endif  // GTEST_IS_THREADSAFE\n\n// Tests basic functionality of the ScopedTrace utility (most of its features\n// are already tested in SCOPED_TRACETest).\nTEST(ScopedTraceTest, WithExplicitFileAndLine) {\n  testing::ScopedTrace trace(\"explicit_file.cc\", 123, \"expected trace message\");\n  ADD_FAILURE() << \"Check that the trace is attached to a particular location.\";\n}\n\nTEST(DisabledTestsWarningTest,\n     DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning) {\n  // This test body is intentionally empty.  Its sole purpose is for\n  // verifying that the --gtest_also_run_disabled_tests flag\n  // suppresses the \"YOU HAVE 12 DISABLED TESTS\" warning at the end of\n  // the test output.\n}\n\n// Tests using assertions outside of TEST and TEST_F.\n//\n// This function creates two failures intentionally.\nvoid AdHocTest() {\n  printf(\"The non-test part of the code is expected to have 2 failures.\\n\\n\");\n  EXPECT_TRUE(false);\n  EXPECT_EQ(2, 3);\n}\n\n// Runs all TESTs, all TEST_Fs, and the ad hoc test.\nint RunAllTests() {\n  AdHocTest();\n  return RUN_ALL_TESTS();\n}\n\n// Tests non-fatal failures in the fixture constructor.\nclass NonFatalFailureInFixtureConstructorTest : public testing::Test {\n protected:\n  NonFatalFailureInFixtureConstructorTest() {\n    printf(\"(expecting 5 failures)\\n\");\n    ADD_FAILURE() << \"Expected failure #1, in the test fixture c'tor.\";\n  }\n\n  ~NonFatalFailureInFixtureConstructorTest() {\n    ADD_FAILURE() << \"Expected failure #5, in the test fixture d'tor.\";\n  }\n\n  virtual void SetUp() {\n    ADD_FAILURE() << \"Expected failure #2, in SetUp().\";\n  }\n\n  virtual void TearDown() {\n    ADD_FAILURE() << \"Expected failure #4, in TearDown.\";\n  }\n};\n\nTEST_F(NonFatalFailureInFixtureConstructorTest, FailureInConstructor) {\n  ADD_FAILURE() << \"Expected failure #3, in the test body.\";\n}\n\n// Tests fatal failures in the fixture constructor.\nclass FatalFailureInFixtureConstructorTest : public testing::Test {\n protected:\n  FatalFailureInFixtureConstructorTest() {\n    printf(\"(expecting 2 failures)\\n\");\n    Init();\n  }\n\n  ~FatalFailureInFixtureConstructorTest() {\n    ADD_FAILURE() << \"Expected failure #2, in the test fixture d'tor.\";\n  }\n\n  virtual void SetUp() {\n    ADD_FAILURE() << \"UNEXPECTED failure in SetUp().  \"\n                  << \"We should never get here, as the test fixture c'tor \"\n                  << \"had a fatal failure.\";\n  }\n\n  virtual void TearDown() {\n    ADD_FAILURE() << \"UNEXPECTED failure in TearDown().  \"\n                  << \"We should never get here, as the test fixture c'tor \"\n                  << \"had a fatal failure.\";\n  }\n\n private:\n  void Init() {\n    FAIL() << \"Expected failure #1, in the test fixture c'tor.\";\n  }\n};\n\nTEST_F(FatalFailureInFixtureConstructorTest, FailureInConstructor) {\n  ADD_FAILURE() << \"UNEXPECTED failure in the test body.  \"\n                << \"We should never get here, as the test fixture c'tor \"\n                << \"had a fatal failure.\";\n}\n\n// Tests non-fatal failures in SetUp().\nclass NonFatalFailureInSetUpTest : public testing::Test {\n protected:\n  virtual ~NonFatalFailureInSetUpTest() {\n    Deinit();\n  }\n\n  virtual void SetUp() {\n    printf(\"(expecting 4 failures)\\n\");\n    ADD_FAILURE() << \"Expected failure #1, in SetUp().\";\n  }\n\n  virtual void TearDown() {\n    FAIL() << \"Expected failure #3, in TearDown().\";\n  }\n private:\n  void Deinit() {\n    FAIL() << \"Expected failure #4, in the test fixture d'tor.\";\n  }\n};\n\nTEST_F(NonFatalFailureInSetUpTest, FailureInSetUp) {\n  FAIL() << \"Expected failure #2, in the test function.\";\n}\n\n// Tests fatal failures in SetUp().\nclass FatalFailureInSetUpTest : public testing::Test {\n protected:\n  virtual ~FatalFailureInSetUpTest() {\n    Deinit();\n  }\n\n  virtual void SetUp() {\n    printf(\"(expecting 3 failures)\\n\");\n    FAIL() << \"Expected failure #1, in SetUp().\";\n  }\n\n  virtual void TearDown() {\n    FAIL() << \"Expected failure #2, in TearDown().\";\n  }\n private:\n  void Deinit() {\n    FAIL() << \"Expected failure #3, in the test fixture d'tor.\";\n  }\n};\n\nTEST_F(FatalFailureInSetUpTest, FailureInSetUp) {\n  FAIL() << \"UNEXPECTED failure in the test function.  \"\n         << \"We should never get here, as SetUp() failed.\";\n}\n\nTEST(AddFailureAtTest, MessageContainsSpecifiedFileAndLineNumber) {\n  ADD_FAILURE_AT(\"foo.cc\", 42) << \"Expected failure in foo.cc\";\n}\n\n#if GTEST_IS_THREADSAFE\n\n// A unary function that may die.\nvoid DieIf(bool should_die) {\n  GTEST_CHECK_(!should_die) << \" - death inside DieIf().\";\n}\n\n// Tests running death tests in a multi-threaded context.\n\n// Used for coordination between the main and the spawn thread.\nstruct SpawnThreadNotifications {\n  SpawnThreadNotifications() {}\n\n  Notification spawn_thread_started;\n  Notification spawn_thread_ok_to_terminate;\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(SpawnThreadNotifications);\n};\n\n// The function to be executed in the thread spawn by the\n// MultipleThreads test (below).\nstatic void ThreadRoutine(SpawnThreadNotifications* notifications) {\n  // Signals the main thread that this thread has started.\n  notifications->spawn_thread_started.Notify();\n\n  // Waits for permission to finish from the main thread.\n  notifications->spawn_thread_ok_to_terminate.WaitForNotification();\n}\n\n// This is a death-test test, but it's not named with a DeathTest\n// suffix.  It starts threads which might interfere with later\n// death tests, so it must run after all other death tests.\nclass DeathTestAndMultiThreadsTest : public testing::Test {\n protected:\n  // Starts a thread and waits for it to begin.\n  virtual void SetUp() {\n    thread_.reset(new ThreadWithParam<SpawnThreadNotifications*>(\n        &ThreadRoutine, &notifications_, NULL));\n    notifications_.spawn_thread_started.WaitForNotification();\n  }\n  // Tells the thread to finish, and reaps it.\n  // Depending on the version of the thread library in use,\n  // a manager thread might still be left running that will interfere\n  // with later death tests.  This is unfortunate, but this class\n  // cleans up after itself as best it can.\n  virtual void TearDown() {\n    notifications_.spawn_thread_ok_to_terminate.Notify();\n  }\n\n private:\n  SpawnThreadNotifications notifications_;\n  testing::internal::scoped_ptr<ThreadWithParam<SpawnThreadNotifications*> >\n      thread_;\n};\n\n#endif  // GTEST_IS_THREADSAFE\n\n// The MixedUpTestCaseTest test case verifies that Google Test will fail a\n// test if it uses a different fixture class than what other tests in\n// the same test case use.  It deliberately contains two fixture\n// classes with the same name but defined in different namespaces.\n\n// The MixedUpTestCaseWithSameTestNameTest test case verifies that\n// when the user defines two tests with the same test case name AND\n// same test name (but in different namespaces), the second test will\n// fail.\n\nnamespace foo {\n\nclass MixedUpTestCaseTest : public testing::Test {\n};\n\nTEST_F(MixedUpTestCaseTest, FirstTestFromNamespaceFoo) {}\nTEST_F(MixedUpTestCaseTest, SecondTestFromNamespaceFoo) {}\n\nclass MixedUpTestCaseWithSameTestNameTest : public testing::Test {\n};\n\nTEST_F(MixedUpTestCaseWithSameTestNameTest,\n       TheSecondTestWithThisNameShouldFail) {}\n\n}  // namespace foo\n\nnamespace bar {\n\nclass MixedUpTestCaseTest : public testing::Test {\n};\n\n// The following two tests are expected to fail.  We rely on the\n// golden file to check that Google Test generates the right error message.\nTEST_F(MixedUpTestCaseTest, ThisShouldFail) {}\nTEST_F(MixedUpTestCaseTest, ThisShouldFailToo) {}\n\nclass MixedUpTestCaseWithSameTestNameTest : public testing::Test {\n};\n\n// Expected to fail.  We rely on the golden file to check that Google Test\n// generates the right error message.\nTEST_F(MixedUpTestCaseWithSameTestNameTest,\n       TheSecondTestWithThisNameShouldFail) {}\n\n}  // namespace bar\n\n// The following two test cases verify that Google Test catches the user\n// error of mixing TEST and TEST_F in the same test case.  The first\n// test case checks the scenario where TEST_F appears before TEST, and\n// the second one checks where TEST appears before TEST_F.\n\nclass TEST_F_before_TEST_in_same_test_case : public testing::Test {\n};\n\nTEST_F(TEST_F_before_TEST_in_same_test_case, DefinedUsingTEST_F) {}\n\n// Expected to fail.  We rely on the golden file to check that Google Test\n// generates the right error message.\nTEST(TEST_F_before_TEST_in_same_test_case, DefinedUsingTESTAndShouldFail) {}\n\nclass TEST_before_TEST_F_in_same_test_case : public testing::Test {\n};\n\nTEST(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST) {}\n\n// Expected to fail.  We rely on the golden file to check that Google Test\n// generates the right error message.\nTEST_F(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST_FAndShouldFail) {\n}\n\n// Used for testing EXPECT_NONFATAL_FAILURE() and EXPECT_FATAL_FAILURE().\nint global_integer = 0;\n\n// Tests that EXPECT_NONFATAL_FAILURE() can reference global variables.\nTEST(ExpectNonfatalFailureTest, CanReferenceGlobalVariables) {\n  global_integer = 0;\n  EXPECT_NONFATAL_FAILURE({\n    EXPECT_EQ(1, global_integer) << \"Expected non-fatal failure.\";\n  }, \"Expected non-fatal failure.\");\n}\n\n// Tests that EXPECT_NONFATAL_FAILURE() can reference local variables\n// (static or not).\nTEST(ExpectNonfatalFailureTest, CanReferenceLocalVariables) {\n  int m = 0;\n  static int n;\n  n = 1;\n  EXPECT_NONFATAL_FAILURE({\n    EXPECT_EQ(m, n) << \"Expected non-fatal failure.\";\n  }, \"Expected non-fatal failure.\");\n}\n\n// Tests that EXPECT_NONFATAL_FAILURE() succeeds when there is exactly\n// one non-fatal failure and no fatal failure.\nTEST(ExpectNonfatalFailureTest, SucceedsWhenThereIsOneNonfatalFailure) {\n  EXPECT_NONFATAL_FAILURE({\n    ADD_FAILURE() << \"Expected non-fatal failure.\";\n  }, \"Expected non-fatal failure.\");\n}\n\n// Tests that EXPECT_NONFATAL_FAILURE() fails when there is no\n// non-fatal failure.\nTEST(ExpectNonfatalFailureTest, FailsWhenThereIsNoNonfatalFailure) {\n  printf(\"(expecting a failure)\\n\");\n  EXPECT_NONFATAL_FAILURE({\n  }, \"\");\n}\n\n// Tests that EXPECT_NONFATAL_FAILURE() fails when there are two\n// non-fatal failures.\nTEST(ExpectNonfatalFailureTest, FailsWhenThereAreTwoNonfatalFailures) {\n  printf(\"(expecting a failure)\\n\");\n  EXPECT_NONFATAL_FAILURE({\n    ADD_FAILURE() << \"Expected non-fatal failure 1.\";\n    ADD_FAILURE() << \"Expected non-fatal failure 2.\";\n  }, \"\");\n}\n\n// Tests that EXPECT_NONFATAL_FAILURE() fails when there is one fatal\n// failure.\nTEST(ExpectNonfatalFailureTest, FailsWhenThereIsOneFatalFailure) {\n  printf(\"(expecting a failure)\\n\");\n  EXPECT_NONFATAL_FAILURE({\n    FAIL() << \"Expected fatal failure.\";\n  }, \"\");\n}\n\n// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being\n// tested returns.\nTEST(ExpectNonfatalFailureTest, FailsWhenStatementReturns) {\n  printf(\"(expecting a failure)\\n\");\n  EXPECT_NONFATAL_FAILURE({\n    return;\n  }, \"\");\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\n// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being\n// tested throws.\nTEST(ExpectNonfatalFailureTest, FailsWhenStatementThrows) {\n  printf(\"(expecting a failure)\\n\");\n  try {\n    EXPECT_NONFATAL_FAILURE({\n      throw 0;\n    }, \"\");\n  } catch(int) {  // NOLINT\n  }\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// Tests that EXPECT_FATAL_FAILURE() can reference global variables.\nTEST(ExpectFatalFailureTest, CanReferenceGlobalVariables) {\n  global_integer = 0;\n  EXPECT_FATAL_FAILURE({\n    ASSERT_EQ(1, global_integer) << \"Expected fatal failure.\";\n  }, \"Expected fatal failure.\");\n}\n\n// Tests that EXPECT_FATAL_FAILURE() can reference local static\n// variables.\nTEST(ExpectFatalFailureTest, CanReferenceLocalStaticVariables) {\n  static int n;\n  n = 1;\n  EXPECT_FATAL_FAILURE({\n    ASSERT_EQ(0, n) << \"Expected fatal failure.\";\n  }, \"Expected fatal failure.\");\n}\n\n// Tests that EXPECT_FATAL_FAILURE() succeeds when there is exactly\n// one fatal failure and no non-fatal failure.\nTEST(ExpectFatalFailureTest, SucceedsWhenThereIsOneFatalFailure) {\n  EXPECT_FATAL_FAILURE({\n    FAIL() << \"Expected fatal failure.\";\n  }, \"Expected fatal failure.\");\n}\n\n// Tests that EXPECT_FATAL_FAILURE() fails when there is no fatal\n// failure.\nTEST(ExpectFatalFailureTest, FailsWhenThereIsNoFatalFailure) {\n  printf(\"(expecting a failure)\\n\");\n  EXPECT_FATAL_FAILURE({\n  }, \"\");\n}\n\n// A helper for generating a fatal failure.\nvoid FatalFailure() {\n  FAIL() << \"Expected fatal failure.\";\n}\n\n// Tests that EXPECT_FATAL_FAILURE() fails when there are two\n// fatal failures.\nTEST(ExpectFatalFailureTest, FailsWhenThereAreTwoFatalFailures) {\n  printf(\"(expecting a failure)\\n\");\n  EXPECT_FATAL_FAILURE({\n    FatalFailure();\n    FatalFailure();\n  }, \"\");\n}\n\n// Tests that EXPECT_FATAL_FAILURE() fails when there is one non-fatal\n// failure.\nTEST(ExpectFatalFailureTest, FailsWhenThereIsOneNonfatalFailure) {\n  printf(\"(expecting a failure)\\n\");\n  EXPECT_FATAL_FAILURE({\n    ADD_FAILURE() << \"Expected non-fatal failure.\";\n  }, \"\");\n}\n\n// Tests that EXPECT_FATAL_FAILURE() fails when the statement being\n// tested returns.\nTEST(ExpectFatalFailureTest, FailsWhenStatementReturns) {\n  printf(\"(expecting a failure)\\n\");\n  EXPECT_FATAL_FAILURE({\n    return;\n  }, \"\");\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\n// Tests that EXPECT_FATAL_FAILURE() fails when the statement being\n// tested throws.\nTEST(ExpectFatalFailureTest, FailsWhenStatementThrows) {\n  printf(\"(expecting a failure)\\n\");\n  try {\n    EXPECT_FATAL_FAILURE({\n      throw 0;\n    }, \"\");\n  } catch(int) {  // NOLINT\n  }\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// This #ifdef block tests the output of value-parameterized tests.\n\nstd::string ParamNameFunc(const testing::TestParamInfo<std::string>& info) {\n  return info.param;\n}\n\nclass ParamTest : public testing::TestWithParam<std::string> {\n};\n\nTEST_P(ParamTest, Success) {\n  EXPECT_EQ(\"a\", GetParam());\n}\n\nTEST_P(ParamTest, Failure) {\n  EXPECT_EQ(\"b\", GetParam()) << \"Expected failure\";\n}\n\nINSTANTIATE_TEST_CASE_P(PrintingStrings,\n                        ParamTest,\n                        testing::Values(std::string(\"a\")),\n                        ParamNameFunc);\n\n// This #ifdef block tests the output of typed tests.\n#if GTEST_HAS_TYPED_TEST\n\ntemplate <typename T>\nclass TypedTest : public testing::Test {\n};\n\nTYPED_TEST_CASE(TypedTest, testing::Types<int>);\n\nTYPED_TEST(TypedTest, Success) {\n  EXPECT_EQ(0, TypeParam());\n}\n\nTYPED_TEST(TypedTest, Failure) {\n  EXPECT_EQ(1, TypeParam()) << \"Expected failure\";\n}\n\ntypedef testing::Types<char, int> TypesForTestWithNames;\n\ntemplate <typename T>\nclass TypedTestWithNames : public testing::Test {};\n\nclass TypedTestNames {\n public:\n  template <typename T>\n  static std::string GetName(int i) {\n    if (testing::internal::IsSame<T, char>::value)\n      return std::string(\"char\") + ::testing::PrintToString(i);\n    if (testing::internal::IsSame<T, int>::value)\n      return std::string(\"int\") + ::testing::PrintToString(i);\n  }\n};\n\nTYPED_TEST_CASE(TypedTestWithNames, TypesForTestWithNames, TypedTestNames);\n\nTYPED_TEST(TypedTestWithNames, Success) {}\n\nTYPED_TEST(TypedTestWithNames, Failure) { FAIL(); }\n\n#endif  // GTEST_HAS_TYPED_TEST\n\n// This #ifdef block tests the output of type-parameterized tests.\n#if GTEST_HAS_TYPED_TEST_P\n\ntemplate <typename T>\nclass TypedTestP : public testing::Test {\n};\n\nTYPED_TEST_CASE_P(TypedTestP);\n\nTYPED_TEST_P(TypedTestP, Success) {\n  EXPECT_EQ(0U, TypeParam());\n}\n\nTYPED_TEST_P(TypedTestP, Failure) {\n  EXPECT_EQ(1U, TypeParam()) << \"Expected failure\";\n}\n\nREGISTER_TYPED_TEST_CASE_P(TypedTestP, Success, Failure);\n\ntypedef testing::Types<unsigned char, unsigned int> UnsignedTypes;\nINSTANTIATE_TYPED_TEST_CASE_P(Unsigned, TypedTestP, UnsignedTypes);\n\nclass TypedTestPNames {\n public:\n  template <typename T>\n  static std::string GetName(int i) {\n    if (testing::internal::IsSame<T, unsigned char>::value) {\n      return std::string(\"unsignedChar\") + ::testing::PrintToString(i);\n    }\n    if (testing::internal::IsSame<T, unsigned int>::value) {\n      return std::string(\"unsignedInt\") + ::testing::PrintToString(i);\n    }\n  }\n};\n\nINSTANTIATE_TYPED_TEST_CASE_P(UnsignedCustomName, TypedTestP, UnsignedTypes,\n                              TypedTestPNames);\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n\n#if GTEST_HAS_DEATH_TEST\n\n// We rely on the golden file to verify that tests whose test case\n// name ends with DeathTest are run first.\n\nTEST(ADeathTest, ShouldRunFirst) {\n}\n\n# if GTEST_HAS_TYPED_TEST\n\n// We rely on the golden file to verify that typed tests whose test\n// case name ends with DeathTest are run first.\n\ntemplate <typename T>\nclass ATypedDeathTest : public testing::Test {\n};\n\ntypedef testing::Types<int, double> NumericTypes;\nTYPED_TEST_CASE(ATypedDeathTest, NumericTypes);\n\nTYPED_TEST(ATypedDeathTest, ShouldRunFirst) {\n}\n\n# endif  // GTEST_HAS_TYPED_TEST\n\n# if GTEST_HAS_TYPED_TEST_P\n\n\n// We rely on the golden file to verify that type-parameterized tests\n// whose test case name ends with DeathTest are run first.\n\ntemplate <typename T>\nclass ATypeParamDeathTest : public testing::Test {\n};\n\nTYPED_TEST_CASE_P(ATypeParamDeathTest);\n\nTYPED_TEST_P(ATypeParamDeathTest, ShouldRunFirst) {\n}\n\nREGISTER_TYPED_TEST_CASE_P(ATypeParamDeathTest, ShouldRunFirst);\n\nINSTANTIATE_TYPED_TEST_CASE_P(My, ATypeParamDeathTest, NumericTypes);\n\n# endif  // GTEST_HAS_TYPED_TEST_P\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n// Tests various failure conditions of\n// EXPECT_{,NON}FATAL_FAILURE{,_ON_ALL_THREADS}.\nclass ExpectFailureTest : public testing::Test {\n public:  // Must be public and not protected due to a bug in g++ 3.4.2.\n  enum FailureMode {\n    FATAL_FAILURE,\n    NONFATAL_FAILURE\n  };\n  static void AddFailure(FailureMode failure) {\n    if (failure == FATAL_FAILURE) {\n      FAIL() << \"Expected fatal failure.\";\n    } else {\n      ADD_FAILURE() << \"Expected non-fatal failure.\";\n    }\n  }\n};\n\nTEST_F(ExpectFailureTest, ExpectFatalFailure) {\n  // Expected fatal failure, but succeeds.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_FATAL_FAILURE(SUCCEED(), \"Expected fatal failure.\");\n  // Expected fatal failure, but got a non-fatal failure.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_FATAL_FAILURE(AddFailure(NONFATAL_FAILURE), \"Expected non-fatal \"\n                       \"failure.\");\n  // Wrong message.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_FATAL_FAILURE(AddFailure(FATAL_FAILURE), \"Some other fatal failure \"\n                       \"expected.\");\n}\n\nTEST_F(ExpectFailureTest, ExpectNonFatalFailure) {\n  // Expected non-fatal failure, but succeeds.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_NONFATAL_FAILURE(SUCCEED(), \"Expected non-fatal failure.\");\n  // Expected non-fatal failure, but got a fatal failure.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_NONFATAL_FAILURE(AddFailure(FATAL_FAILURE), \"Expected fatal failure.\");\n  // Wrong message.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_NONFATAL_FAILURE(AddFailure(NONFATAL_FAILURE), \"Some other non-fatal \"\n                          \"failure.\");\n}\n\n#if GTEST_IS_THREADSAFE\n\nclass ExpectFailureWithThreadsTest : public ExpectFailureTest {\n protected:\n  static void AddFailureInOtherThread(FailureMode failure) {\n    ThreadWithParam<FailureMode> thread(&AddFailure, failure, NULL);\n    thread.Join();\n  }\n};\n\nTEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailure) {\n  // We only intercept the current thread.\n  printf(\"(expecting 2 failures)\\n\");\n  EXPECT_FATAL_FAILURE(AddFailureInOtherThread(FATAL_FAILURE),\n                       \"Expected fatal failure.\");\n}\n\nTEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailure) {\n  // We only intercept the current thread.\n  printf(\"(expecting 2 failures)\\n\");\n  EXPECT_NONFATAL_FAILURE(AddFailureInOtherThread(NONFATAL_FAILURE),\n                          \"Expected non-fatal failure.\");\n}\n\ntypedef ExpectFailureWithThreadsTest ScopedFakeTestPartResultReporterTest;\n\n// Tests that the ScopedFakeTestPartResultReporter only catches failures from\n// the current thread if it is instantiated with INTERCEPT_ONLY_CURRENT_THREAD.\nTEST_F(ScopedFakeTestPartResultReporterTest, InterceptOnlyCurrentThread) {\n  printf(\"(expecting 2 failures)\\n\");\n  TestPartResultArray results;\n  {\n    ScopedFakeTestPartResultReporter reporter(\n        ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD,\n        &results);\n    AddFailureInOtherThread(FATAL_FAILURE);\n    AddFailureInOtherThread(NONFATAL_FAILURE);\n  }\n  // The two failures should not have been intercepted.\n  EXPECT_EQ(0, results.size()) << \"This shouldn't fail.\";\n}\n\n#endif  // GTEST_IS_THREADSAFE\n\nTEST_F(ExpectFailureTest, ExpectFatalFailureOnAllThreads) {\n  // Expected fatal failure, but succeeds.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), \"Expected fatal failure.\");\n  // Expected fatal failure, but got a non-fatal failure.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),\n                                      \"Expected non-fatal failure.\");\n  // Wrong message.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),\n                                      \"Some other fatal failure expected.\");\n}\n\nTEST_F(ExpectFailureTest, ExpectNonFatalFailureOnAllThreads) {\n  // Expected non-fatal failure, but succeeds.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), \"Expected non-fatal \"\n                                         \"failure.\");\n  // Expected non-fatal failure, but got a fatal failure.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),\n                                         \"Expected fatal failure.\");\n  // Wrong message.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),\n                                         \"Some other non-fatal failure.\");\n}\n\n\n// Two test environments for testing testing::AddGlobalTestEnvironment().\n\nclass FooEnvironment : public testing::Environment {\n public:\n  virtual void SetUp() {\n    printf(\"%s\", \"FooEnvironment::SetUp() called.\\n\");\n  }\n\n  virtual void TearDown() {\n    printf(\"%s\", \"FooEnvironment::TearDown() called.\\n\");\n    FAIL() << \"Expected fatal failure.\";\n  }\n};\n\nclass BarEnvironment : public testing::Environment {\n public:\n  virtual void SetUp() {\n    printf(\"%s\", \"BarEnvironment::SetUp() called.\\n\");\n  }\n\n  virtual void TearDown() {\n    printf(\"%s\", \"BarEnvironment::TearDown() called.\\n\");\n    ADD_FAILURE() << \"Expected non-fatal failure.\";\n  }\n};\n\n// The main function.\n//\n// The idea is to use Google Test to run all the tests we have defined (some\n// of them are intended to fail), and then compare the test results\n// with the \"golden\" file.\nint main(int argc, char **argv) {\n  testing::GTEST_FLAG(print_time) = false;\n\n  // We just run the tests, knowing some of them are intended to fail.\n  // We will use a separate Python script to compare the output of\n  // this program with the golden file.\n\n  // It's hard to test InitGoogleTest() directly, as it has many\n  // global side effects.  The following line serves as a sanity test\n  // for it.\n  testing::InitGoogleTest(&argc, argv);\n  bool internal_skip_environment_and_ad_hoc_tests =\n      std::count(argv, argv + argc,\n                 std::string(\"internal_skip_environment_and_ad_hoc_tests\")) > 0;\n\n#if GTEST_HAS_DEATH_TEST\n  if (testing::internal::GTEST_FLAG(internal_run_death_test) != \"\") {\n    // Skip the usual output capturing if we're running as the child\n    // process of an threadsafe-style death test.\n# if GTEST_OS_WINDOWS\n    posix::FReopen(\"nul:\", \"w\", stdout);\n# else\n    posix::FReopen(\"/dev/null\", \"w\", stdout);\n# endif  // GTEST_OS_WINDOWS\n    return RUN_ALL_TESTS();\n  }\n#endif  // GTEST_HAS_DEATH_TEST\n\n  if (internal_skip_environment_and_ad_hoc_tests)\n    return RUN_ALL_TESTS();\n\n  // Registers two global test environments.\n  // The golden file verifies that they are set up in the order they\n  // are registered, and torn down in the reverse order.\n  testing::AddGlobalTestEnvironment(new FooEnvironment);\n  testing::AddGlobalTestEnvironment(new BarEnvironment);\n#if _MSC_VER\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4127\n#endif  //  _MSC_VER\n  return RunAllTests();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-param-test-invalid-name1-test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015 Google Inc. All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Verifies that Google Test warns the user when not initialized properly.\"\"\"\n\nimport gtest_test_utils\n\nbinary_name = 'googletest-param-test-invalid-name1-test_'\nCOMMAND = gtest_test_utils.GetTestExecutablePath(binary_name)\n\n\ndef Assert(condition):\n  if not condition:\n    raise AssertionError\n\n\ndef TestExitCodeAndOutput(command):\n  \"\"\"Runs the given command and verifies its exit code and output.\"\"\"\n\n  err = ('Parameterized test name \\'\"InvalidWithQuotes\"\\' is invalid')\n\n  p = gtest_test_utils.Subprocess(command)\n  Assert(p.terminated_by_signal)\n\n  # Verify the output message contains appropriate output\n  Assert(err in p.output)\n\n\nclass GTestParamTestInvalidName1Test(gtest_test_utils.TestCase):\n\n  def testExitCodeAndOutput(self):\n    TestExitCodeAndOutput(COMMAND)\n\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-param-test-invalid-name1-test_.cc",
    "content": "// Copyright 2015, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include \"gtest/gtest.h\"\n\nnamespace {\nclass DummyTest : public ::testing::TestWithParam<const char *> {};\n\nTEST_P(DummyTest, Dummy) {\n}\n\nINSTANTIATE_TEST_CASE_P(InvalidTestName,\n                        DummyTest,\n                        ::testing::Values(\"InvalidWithQuotes\"),\n                        ::testing::PrintToStringParamName());\n\n}  // namespace\n\nint main(int argc, char *argv[]) {\n  testing::InitGoogleTest(&argc, argv);\n  return RUN_ALL_TESTS();\n}\n\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-param-test-invalid-name2-test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015 Google Inc. All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Verifies that Google Test warns the user when not initialized properly.\"\"\"\n\nimport gtest_test_utils\n\nbinary_name = 'googletest-param-test-invalid-name2-test_'\nCOMMAND = gtest_test_utils.GetTestExecutablePath(binary_name)\n\n\ndef Assert(condition):\n  if not condition:\n    raise AssertionError\n\n\ndef TestExitCodeAndOutput(command):\n  \"\"\"Runs the given command and verifies its exit code and output.\"\"\"\n\n  err = ('Duplicate parameterized test name \\'a\\'')\n\n  p = gtest_test_utils.Subprocess(command)\n  Assert(p.terminated_by_signal)\n\n  # Check for appropriate output\n  Assert(err in p.output)\n\n\nclass GTestParamTestInvalidName2Test(gtest_test_utils.TestCase):\n\n  def testExitCodeAndOutput(self):\n    TestExitCodeAndOutput(COMMAND)\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-param-test-invalid-name2-test_.cc",
    "content": "// Copyright 2015, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include \"gtest/gtest.h\"\n\nnamespace {\nclass DummyTest : public ::testing::TestWithParam<const char *> {};\n\nstd::string StringParamTestSuffix(\n    const testing::TestParamInfo<const char*>& info) {\n  return std::string(info.param);\n}\n\nTEST_P(DummyTest, Dummy) {\n}\n\nINSTANTIATE_TEST_CASE_P(DuplicateTestNames,\n                        DummyTest,\n                        ::testing::Values(\"a\", \"b\", \"a\", \"c\"),\n                        StringParamTestSuffix);\n}  // namespace\n\nint main(int argc, char *argv[]) {\n  testing::InitGoogleTest(&argc, argv);\n  return RUN_ALL_TESTS();\n}\n\n\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-param-test-test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Tests for Google Test itself. This file verifies that the parameter\n// generators objects produce correct parameter sequences and that\n// Google Test runtime instantiates correct tests from those sequences.\n\n#include \"gtest/gtest.h\"\n\n# include <algorithm>\n# include <iostream>\n# include <list>\n# include <sstream>\n# include <string>\n# include <vector>\n\n# include \"src/gtest-internal-inl.h\"  // for UnitTestOptions\n# include \"test/googletest-param-test-test.h\"\n\nusing ::std::vector;\nusing ::std::sort;\n\nusing ::testing::AddGlobalTestEnvironment;\nusing ::testing::Bool;\nusing ::testing::Message;\nusing ::testing::Range;\nusing ::testing::TestWithParam;\nusing ::testing::Values;\nusing ::testing::ValuesIn;\n\n# if GTEST_HAS_COMBINE\nusing ::testing::Combine;\nusing ::testing::get;\nusing ::testing::make_tuple;\nusing ::testing::tuple;\n# endif  // GTEST_HAS_COMBINE\n\nusing ::testing::internal::ParamGenerator;\nusing ::testing::internal::UnitTestOptions;\n\n// Prints a value to a string.\n//\n// FIXME: remove PrintValue() when we move matchers and\n// EXPECT_THAT() from Google Mock to Google Test.  At that time, we\n// can write EXPECT_THAT(x, Eq(y)) to compare two tuples x and y, as\n// EXPECT_THAT() and the matchers know how to print tuples.\ntemplate <typename T>\n::std::string PrintValue(const T& value) {\n  ::std::stringstream stream;\n  stream << value;\n  return stream.str();\n}\n\n# if GTEST_HAS_COMBINE\n\n// These overloads allow printing tuples in our tests.  We cannot\n// define an operator<< for tuples, as that definition needs to be in\n// the std namespace in order to be picked up by Google Test via\n// Argument-Dependent Lookup, yet defining anything in the std\n// namespace in non-STL code is undefined behavior.\n\ntemplate <typename T1, typename T2>\n::std::string PrintValue(const tuple<T1, T2>& value) {\n  ::std::stringstream stream;\n  stream << \"(\" << get<0>(value) << \", \" << get<1>(value) << \")\";\n  return stream.str();\n}\n\ntemplate <typename T1, typename T2, typename T3>\n::std::string PrintValue(const tuple<T1, T2, T3>& value) {\n  ::std::stringstream stream;\n  stream << \"(\" << get<0>(value) << \", \" << get<1>(value)\n         << \", \"<< get<2>(value) << \")\";\n  return stream.str();\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n          typename T6, typename T7, typename T8, typename T9, typename T10>\n::std::string PrintValue(\n    const tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& value) {\n  ::std::stringstream stream;\n  stream << \"(\" << get<0>(value) << \", \" << get<1>(value)\n         << \", \"<< get<2>(value) << \", \" << get<3>(value)\n         << \", \"<< get<4>(value) << \", \" << get<5>(value)\n         << \", \"<< get<6>(value) << \", \" << get<7>(value)\n         << \", \"<< get<8>(value) << \", \" << get<9>(value) << \")\";\n  return stream.str();\n}\n\n# endif  // GTEST_HAS_COMBINE\n\n// Verifies that a sequence generated by the generator and accessed\n// via the iterator object matches the expected one using Google Test\n// assertions.\ntemplate <typename T, size_t N>\nvoid VerifyGenerator(const ParamGenerator<T>& generator,\n                     const T (&expected_values)[N]) {\n  typename ParamGenerator<T>::iterator it = generator.begin();\n  for (size_t i = 0; i < N; ++i) {\n    ASSERT_FALSE(it == generator.end())\n        << \"At element \" << i << \" when accessing via an iterator \"\n        << \"created with the copy constructor.\\n\";\n    // We cannot use EXPECT_EQ() here as the values may be tuples,\n    // which don't support <<.\n    EXPECT_TRUE(expected_values[i] == *it)\n        << \"where i is \" << i\n        << \", expected_values[i] is \" << PrintValue(expected_values[i])\n        << \", *it is \" << PrintValue(*it)\n        << \", and 'it' is an iterator created with the copy constructor.\\n\";\n    ++it;\n  }\n  EXPECT_TRUE(it == generator.end())\n        << \"At the presumed end of sequence when accessing via an iterator \"\n        << \"created with the copy constructor.\\n\";\n\n  // Test the iterator assignment. The following lines verify that\n  // the sequence accessed via an iterator initialized via the\n  // assignment operator (as opposed to a copy constructor) matches\n  // just the same.\n  it = generator.begin();\n  for (size_t i = 0; i < N; ++i) {\n    ASSERT_FALSE(it == generator.end())\n        << \"At element \" << i << \" when accessing via an iterator \"\n        << \"created with the assignment operator.\\n\";\n    EXPECT_TRUE(expected_values[i] == *it)\n        << \"where i is \" << i\n        << \", expected_values[i] is \" << PrintValue(expected_values[i])\n        << \", *it is \" << PrintValue(*it)\n        << \", and 'it' is an iterator created with the copy constructor.\\n\";\n    ++it;\n  }\n  EXPECT_TRUE(it == generator.end())\n        << \"At the presumed end of sequence when accessing via an iterator \"\n        << \"created with the assignment operator.\\n\";\n}\n\ntemplate <typename T>\nvoid VerifyGeneratorIsEmpty(const ParamGenerator<T>& generator) {\n  typename ParamGenerator<T>::iterator it = generator.begin();\n  EXPECT_TRUE(it == generator.end());\n\n  it = generator.begin();\n  EXPECT_TRUE(it == generator.end());\n}\n\n// Generator tests. They test that each of the provided generator functions\n// generates an expected sequence of values. The general test pattern\n// instantiates a generator using one of the generator functions,\n// checks the sequence produced by the generator using its iterator API,\n// and then resets the iterator back to the beginning of the sequence\n// and checks the sequence again.\n\n// Tests that iterators produced by generator functions conform to the\n// ForwardIterator concept.\nTEST(IteratorTest, ParamIteratorConformsToForwardIteratorConcept) {\n  const ParamGenerator<int> gen = Range(0, 10);\n  ParamGenerator<int>::iterator it = gen.begin();\n\n  // Verifies that iterator initialization works as expected.\n  ParamGenerator<int>::iterator it2 = it;\n  EXPECT_TRUE(*it == *it2) << \"Initialized iterators must point to the \"\n                           << \"element same as its source points to\";\n\n  // Verifies that iterator assignment works as expected.\n  ++it;\n  EXPECT_FALSE(*it == *it2);\n  it2 = it;\n  EXPECT_TRUE(*it == *it2) << \"Assigned iterators must point to the \"\n                           << \"element same as its source points to\";\n\n  // Verifies that prefix operator++() returns *this.\n  EXPECT_EQ(&it, &(++it)) << \"Result of the prefix operator++ must be \"\n                          << \"refer to the original object\";\n\n  // Verifies that the result of the postfix operator++ points to the value\n  // pointed to by the original iterator.\n  int original_value = *it;  // Have to compute it outside of macro call to be\n                             // unaffected by the parameter evaluation order.\n  EXPECT_EQ(original_value, *(it++));\n\n  // Verifies that prefix and postfix operator++() advance an iterator\n  // all the same.\n  it2 = it;\n  ++it;\n  ++it2;\n  EXPECT_TRUE(*it == *it2);\n}\n\n// Tests that Range() generates the expected sequence.\nTEST(RangeTest, IntRangeWithDefaultStep) {\n  const ParamGenerator<int> gen = Range(0, 3);\n  const int expected_values[] = {0, 1, 2};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Edge case. Tests that Range() generates the single element sequence\n// as expected when provided with range limits that are equal.\nTEST(RangeTest, IntRangeSingleValue) {\n  const ParamGenerator<int> gen = Range(0, 1);\n  const int expected_values[] = {0};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Edge case. Tests that Range() with generates empty sequence when\n// supplied with an empty range.\nTEST(RangeTest, IntRangeEmpty) {\n  const ParamGenerator<int> gen = Range(0, 0);\n  VerifyGeneratorIsEmpty(gen);\n}\n\n// Tests that Range() with custom step (greater then one) generates\n// the expected sequence.\nTEST(RangeTest, IntRangeWithCustomStep) {\n  const ParamGenerator<int> gen = Range(0, 9, 3);\n  const int expected_values[] = {0, 3, 6};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Tests that Range() with custom step (greater then one) generates\n// the expected sequence when the last element does not fall on the\n// upper range limit. Sequences generated by Range() must not have\n// elements beyond the range limits.\nTEST(RangeTest, IntRangeWithCustomStepOverUpperBound) {\n  const ParamGenerator<int> gen = Range(0, 4, 3);\n  const int expected_values[] = {0, 3};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Verifies that Range works with user-defined types that define\n// copy constructor, operator=(), operator+(), and operator<().\nclass DogAdder {\n public:\n  explicit DogAdder(const char* a_value) : value_(a_value) {}\n  DogAdder(const DogAdder& other) : value_(other.value_.c_str()) {}\n\n  DogAdder operator=(const DogAdder& other) {\n    if (this != &other)\n      value_ = other.value_;\n    return *this;\n  }\n  DogAdder operator+(const DogAdder& other) const {\n    Message msg;\n    msg << value_.c_str() << other.value_.c_str();\n    return DogAdder(msg.GetString().c_str());\n  }\n  bool operator<(const DogAdder& other) const {\n    return value_ < other.value_;\n  }\n  const std::string& value() const { return value_; }\n\n private:\n  std::string value_;\n};\n\nTEST(RangeTest, WorksWithACustomType) {\n  const ParamGenerator<DogAdder> gen =\n      Range(DogAdder(\"cat\"), DogAdder(\"catdogdog\"), DogAdder(\"dog\"));\n  ParamGenerator<DogAdder>::iterator it = gen.begin();\n\n  ASSERT_FALSE(it == gen.end());\n  EXPECT_STREQ(\"cat\", it->value().c_str());\n\n  ASSERT_FALSE(++it == gen.end());\n  EXPECT_STREQ(\"catdog\", it->value().c_str());\n\n  EXPECT_TRUE(++it == gen.end());\n}\n\nclass IntWrapper {\n public:\n  explicit IntWrapper(int a_value) : value_(a_value) {}\n  IntWrapper(const IntWrapper& other) : value_(other.value_) {}\n\n  IntWrapper operator=(const IntWrapper& other) {\n    value_ = other.value_;\n    return *this;\n  }\n  // operator+() adds a different type.\n  IntWrapper operator+(int other) const { return IntWrapper(value_ + other); }\n  bool operator<(const IntWrapper& other) const {\n    return value_ < other.value_;\n  }\n  int value() const { return value_; }\n\n private:\n  int value_;\n};\n\nTEST(RangeTest, WorksWithACustomTypeWithDifferentIncrementType) {\n  const ParamGenerator<IntWrapper> gen = Range(IntWrapper(0), IntWrapper(2));\n  ParamGenerator<IntWrapper>::iterator it = gen.begin();\n\n  ASSERT_FALSE(it == gen.end());\n  EXPECT_EQ(0, it->value());\n\n  ASSERT_FALSE(++it == gen.end());\n  EXPECT_EQ(1, it->value());\n\n  EXPECT_TRUE(++it == gen.end());\n}\n\n// Tests that ValuesIn() with an array parameter generates\n// the expected sequence.\nTEST(ValuesInTest, ValuesInArray) {\n  int array[] = {3, 5, 8};\n  const ParamGenerator<int> gen = ValuesIn(array);\n  VerifyGenerator(gen, array);\n}\n\n// Tests that ValuesIn() with a const array parameter generates\n// the expected sequence.\nTEST(ValuesInTest, ValuesInConstArray) {\n  const int array[] = {3, 5, 8};\n  const ParamGenerator<int> gen = ValuesIn(array);\n  VerifyGenerator(gen, array);\n}\n\n// Edge case. Tests that ValuesIn() with an array parameter containing a\n// single element generates the single element sequence.\nTEST(ValuesInTest, ValuesInSingleElementArray) {\n  int array[] = {42};\n  const ParamGenerator<int> gen = ValuesIn(array);\n  VerifyGenerator(gen, array);\n}\n\n// Tests that ValuesIn() generates the expected sequence for an STL\n// container (vector).\nTEST(ValuesInTest, ValuesInVector) {\n  typedef ::std::vector<int> ContainerType;\n  ContainerType values;\n  values.push_back(3);\n  values.push_back(5);\n  values.push_back(8);\n  const ParamGenerator<int> gen = ValuesIn(values);\n\n  const int expected_values[] = {3, 5, 8};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Tests that ValuesIn() generates the expected sequence.\nTEST(ValuesInTest, ValuesInIteratorRange) {\n  typedef ::std::vector<int> ContainerType;\n  ContainerType values;\n  values.push_back(3);\n  values.push_back(5);\n  values.push_back(8);\n  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());\n\n  const int expected_values[] = {3, 5, 8};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Edge case. Tests that ValuesIn() provided with an iterator range specifying a\n// single value generates a single-element sequence.\nTEST(ValuesInTest, ValuesInSingleElementIteratorRange) {\n  typedef ::std::vector<int> ContainerType;\n  ContainerType values;\n  values.push_back(42);\n  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());\n\n  const int expected_values[] = {42};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Edge case. Tests that ValuesIn() provided with an empty iterator range\n// generates an empty sequence.\nTEST(ValuesInTest, ValuesInEmptyIteratorRange) {\n  typedef ::std::vector<int> ContainerType;\n  ContainerType values;\n  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());\n\n  VerifyGeneratorIsEmpty(gen);\n}\n\n// Tests that the Values() generates the expected sequence.\nTEST(ValuesTest, ValuesWorks) {\n  const ParamGenerator<int> gen = Values(3, 5, 8);\n\n  const int expected_values[] = {3, 5, 8};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Tests that Values() generates the expected sequences from elements of\n// different types convertible to ParamGenerator's parameter type.\nTEST(ValuesTest, ValuesWorksForValuesOfCompatibleTypes) {\n  const ParamGenerator<double> gen = Values(3, 5.0f, 8.0);\n\n  const double expected_values[] = {3.0, 5.0, 8.0};\n  VerifyGenerator(gen, expected_values);\n}\n\nTEST(ValuesTest, ValuesWorksForMaxLengthList) {\n  const ParamGenerator<int> gen = Values(\n      10, 20, 30, 40, 50, 60, 70, 80, 90, 100,\n      110, 120, 130, 140, 150, 160, 170, 180, 190, 200,\n      210, 220, 230, 240, 250, 260, 270, 280, 290, 300,\n      310, 320, 330, 340, 350, 360, 370, 380, 390, 400,\n      410, 420, 430, 440, 450, 460, 470, 480, 490, 500);\n\n  const int expected_values[] = {\n      10, 20, 30, 40, 50, 60, 70, 80, 90, 100,\n      110, 120, 130, 140, 150, 160, 170, 180, 190, 200,\n      210, 220, 230, 240, 250, 260, 270, 280, 290, 300,\n      310, 320, 330, 340, 350, 360, 370, 380, 390, 400,\n      410, 420, 430, 440, 450, 460, 470, 480, 490, 500};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Edge case test. Tests that single-parameter Values() generates the sequence\n// with the single value.\nTEST(ValuesTest, ValuesWithSingleParameter) {\n  const ParamGenerator<int> gen = Values(42);\n\n  const int expected_values[] = {42};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Tests that Bool() generates sequence (false, true).\nTEST(BoolTest, BoolWorks) {\n  const ParamGenerator<bool> gen = Bool();\n\n  const bool expected_values[] = {false, true};\n  VerifyGenerator(gen, expected_values);\n}\n\n# if GTEST_HAS_COMBINE\n\n// Tests that Combine() with two parameters generates the expected sequence.\nTEST(CombineTest, CombineWithTwoParameters) {\n  const char* foo = \"foo\";\n  const char* bar = \"bar\";\n  const ParamGenerator<tuple<const char*, int> > gen =\n      Combine(Values(foo, bar), Values(3, 4));\n\n  tuple<const char*, int> expected_values[] = {\n    make_tuple(foo, 3), make_tuple(foo, 4),\n    make_tuple(bar, 3), make_tuple(bar, 4)};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Tests that Combine() with three parameters generates the expected sequence.\nTEST(CombineTest, CombineWithThreeParameters) {\n  const ParamGenerator<tuple<int, int, int> > gen = Combine(Values(0, 1),\n                                                            Values(3, 4),\n                                                            Values(5, 6));\n  tuple<int, int, int> expected_values[] = {\n    make_tuple(0, 3, 5), make_tuple(0, 3, 6),\n    make_tuple(0, 4, 5), make_tuple(0, 4, 6),\n    make_tuple(1, 3, 5), make_tuple(1, 3, 6),\n    make_tuple(1, 4, 5), make_tuple(1, 4, 6)};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Tests that the Combine() with the first parameter generating a single value\n// sequence generates a sequence with the number of elements equal to the\n// number of elements in the sequence generated by the second parameter.\nTEST(CombineTest, CombineWithFirstParameterSingleValue) {\n  const ParamGenerator<tuple<int, int> > gen = Combine(Values(42),\n                                                       Values(0, 1));\n\n  tuple<int, int> expected_values[] = {make_tuple(42, 0), make_tuple(42, 1)};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Tests that the Combine() with the second parameter generating a single value\n// sequence generates a sequence with the number of elements equal to the\n// number of elements in the sequence generated by the first parameter.\nTEST(CombineTest, CombineWithSecondParameterSingleValue) {\n  const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),\n                                                       Values(42));\n\n  tuple<int, int> expected_values[] = {make_tuple(0, 42), make_tuple(1, 42)};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Tests that when the first parameter produces an empty sequence,\n// Combine() produces an empty sequence, too.\nTEST(CombineTest, CombineWithFirstParameterEmptyRange) {\n  const ParamGenerator<tuple<int, int> > gen = Combine(Range(0, 0),\n                                                       Values(0, 1));\n  VerifyGeneratorIsEmpty(gen);\n}\n\n// Tests that when the second parameter produces an empty sequence,\n// Combine() produces an empty sequence, too.\nTEST(CombineTest, CombineWithSecondParameterEmptyRange) {\n  const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),\n                                                       Range(1, 1));\n  VerifyGeneratorIsEmpty(gen);\n}\n\n// Edge case. Tests that combine works with the maximum number\n// of parameters supported by Google Test (currently 10).\nTEST(CombineTest, CombineWithMaxNumberOfParameters) {\n  const char* foo = \"foo\";\n  const char* bar = \"bar\";\n  const ParamGenerator<tuple<const char*, int, int, int, int, int, int, int,\n                             int, int> > gen = Combine(Values(foo, bar),\n                                                       Values(1), Values(2),\n                                                       Values(3), Values(4),\n                                                       Values(5), Values(6),\n                                                       Values(7), Values(8),\n                                                       Values(9));\n\n  tuple<const char*, int, int, int, int, int, int, int, int, int>\n      expected_values[] = {make_tuple(foo, 1, 2, 3, 4, 5, 6, 7, 8, 9),\n                           make_tuple(bar, 1, 2, 3, 4, 5, 6, 7, 8, 9)};\n  VerifyGenerator(gen, expected_values);\n}\n\n#if GTEST_LANG_CXX11\n\nclass NonDefaultConstructAssignString {\n public:\n  NonDefaultConstructAssignString(const std::string& s) : str_(s) {}\n\n  const std::string& str() const { return str_; }\n\n private:\n  std::string str_;\n\n  // Not default constructible\n  NonDefaultConstructAssignString();\n  // Not assignable\n  void operator=(const NonDefaultConstructAssignString&);\n};\n\nTEST(CombineTest, NonDefaultConstructAssign) {\n  const ParamGenerator<tuple<int, NonDefaultConstructAssignString> > gen =\n      Combine(Values(0, 1), Values(NonDefaultConstructAssignString(\"A\"),\n                                   NonDefaultConstructAssignString(\"B\")));\n\n  ParamGenerator<tuple<int, NonDefaultConstructAssignString> >::iterator it =\n      gen.begin();\n\n  EXPECT_EQ(0, std::get<0>(*it));\n  EXPECT_EQ(\"A\", std::get<1>(*it).str());\n  ++it;\n\n  EXPECT_EQ(0, std::get<0>(*it));\n  EXPECT_EQ(\"B\", std::get<1>(*it).str());\n  ++it;\n\n  EXPECT_EQ(1, std::get<0>(*it));\n  EXPECT_EQ(\"A\", std::get<1>(*it).str());\n  ++it;\n\n  EXPECT_EQ(1, std::get<0>(*it));\n  EXPECT_EQ(\"B\", std::get<1>(*it).str());\n  ++it;\n\n  EXPECT_TRUE(it == gen.end());\n}\n\n#endif   // GTEST_LANG_CXX11\n# endif  // GTEST_HAS_COMBINE\n\n// Tests that an generator produces correct sequence after being\n// assigned from another generator.\nTEST(ParamGeneratorTest, AssignmentWorks) {\n  ParamGenerator<int> gen = Values(1, 2);\n  const ParamGenerator<int> gen2 = Values(3, 4);\n  gen = gen2;\n\n  const int expected_values[] = {3, 4};\n  VerifyGenerator(gen, expected_values);\n}\n\n// This test verifies that the tests are expanded and run as specified:\n// one test per element from the sequence produced by the generator\n// specified in INSTANTIATE_TEST_CASE_P. It also verifies that the test's\n// fixture constructor, SetUp(), and TearDown() have run and have been\n// supplied with the correct parameters.\n\n// The use of environment object allows detection of the case where no test\n// case functionality is run at all. In this case TestCaseTearDown will not\n// be able to detect missing tests, naturally.\ntemplate <int kExpectedCalls>\nclass TestGenerationEnvironment : public ::testing::Environment {\n public:\n  static TestGenerationEnvironment* Instance() {\n    static TestGenerationEnvironment* instance = new TestGenerationEnvironment;\n    return instance;\n  }\n\n  void FixtureConstructorExecuted() { fixture_constructor_count_++; }\n  void SetUpExecuted() { set_up_count_++; }\n  void TearDownExecuted() { tear_down_count_++; }\n  void TestBodyExecuted() { test_body_count_++; }\n\n  virtual void TearDown() {\n    // If all MultipleTestGenerationTest tests have been de-selected\n    // by the filter flag, the following checks make no sense.\n    bool perform_check = false;\n\n    for (int i = 0; i < kExpectedCalls; ++i) {\n      Message msg;\n      msg << \"TestsExpandedAndRun/\" << i;\n      if (UnitTestOptions::FilterMatchesTest(\n             \"TestExpansionModule/MultipleTestGenerationTest\",\n              msg.GetString().c_str())) {\n        perform_check = true;\n      }\n    }\n    if (perform_check) {\n      EXPECT_EQ(kExpectedCalls, fixture_constructor_count_)\n          << \"Fixture constructor of ParamTestGenerationTest test case \"\n          << \"has not been run as expected.\";\n      EXPECT_EQ(kExpectedCalls, set_up_count_)\n          << \"Fixture SetUp method of ParamTestGenerationTest test case \"\n          << \"has not been run as expected.\";\n      EXPECT_EQ(kExpectedCalls, tear_down_count_)\n          << \"Fixture TearDown method of ParamTestGenerationTest test case \"\n          << \"has not been run as expected.\";\n      EXPECT_EQ(kExpectedCalls, test_body_count_)\n          << \"Test in ParamTestGenerationTest test case \"\n          << \"has not been run as expected.\";\n    }\n  }\n\n private:\n  TestGenerationEnvironment() : fixture_constructor_count_(0), set_up_count_(0),\n                                tear_down_count_(0), test_body_count_(0) {}\n\n  int fixture_constructor_count_;\n  int set_up_count_;\n  int tear_down_count_;\n  int test_body_count_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationEnvironment);\n};\n\nconst int test_generation_params[] = {36, 42, 72};\n\nclass TestGenerationTest : public TestWithParam<int> {\n public:\n  enum {\n    PARAMETER_COUNT =\n        sizeof(test_generation_params)/sizeof(test_generation_params[0])\n  };\n\n  typedef TestGenerationEnvironment<PARAMETER_COUNT> Environment;\n\n  TestGenerationTest() {\n    Environment::Instance()->FixtureConstructorExecuted();\n    current_parameter_ = GetParam();\n  }\n  virtual void SetUp() {\n    Environment::Instance()->SetUpExecuted();\n    EXPECT_EQ(current_parameter_, GetParam());\n  }\n  virtual void TearDown() {\n    Environment::Instance()->TearDownExecuted();\n    EXPECT_EQ(current_parameter_, GetParam());\n  }\n\n  static void SetUpTestCase() {\n    bool all_tests_in_test_case_selected = true;\n\n    for (int i = 0; i < PARAMETER_COUNT; ++i) {\n      Message test_name;\n      test_name << \"TestsExpandedAndRun/\" << i;\n      if ( !UnitTestOptions::FilterMatchesTest(\n                \"TestExpansionModule/MultipleTestGenerationTest\",\n                test_name.GetString())) {\n        all_tests_in_test_case_selected = false;\n      }\n    }\n    EXPECT_TRUE(all_tests_in_test_case_selected)\n        << \"When running the TestGenerationTest test case all of its tests\\n\"\n        << \"must be selected by the filter flag for the test case to pass.\\n\"\n        << \"If not all of them are enabled, we can't reliably conclude\\n\"\n        << \"that the correct number of tests have been generated.\";\n\n    collected_parameters_.clear();\n  }\n\n  static void TearDownTestCase() {\n    vector<int> expected_values(test_generation_params,\n                                test_generation_params + PARAMETER_COUNT);\n    // Test execution order is not guaranteed by Google Test,\n    // so the order of values in collected_parameters_ can be\n    // different and we have to sort to compare.\n    sort(expected_values.begin(), expected_values.end());\n    sort(collected_parameters_.begin(), collected_parameters_.end());\n\n    EXPECT_TRUE(collected_parameters_ == expected_values);\n  }\n\n protected:\n  int current_parameter_;\n  static vector<int> collected_parameters_;\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationTest);\n};\nvector<int> TestGenerationTest::collected_parameters_;\n\nTEST_P(TestGenerationTest, TestsExpandedAndRun) {\n  Environment::Instance()->TestBodyExecuted();\n  EXPECT_EQ(current_parameter_, GetParam());\n  collected_parameters_.push_back(GetParam());\n}\nINSTANTIATE_TEST_CASE_P(TestExpansionModule, TestGenerationTest,\n                        ValuesIn(test_generation_params));\n\n// This test verifies that the element sequence (third parameter of\n// INSTANTIATE_TEST_CASE_P) is evaluated in InitGoogleTest() and neither at\n// the call site of INSTANTIATE_TEST_CASE_P nor in RUN_ALL_TESTS().  For\n// that, we declare param_value_ to be a static member of\n// GeneratorEvaluationTest and initialize it to 0.  We set it to 1 in\n// main(), just before invocation of InitGoogleTest().  After calling\n// InitGoogleTest(), we set the value to 2.  If the sequence is evaluated\n// before or after InitGoogleTest, INSTANTIATE_TEST_CASE_P will create a\n// test with parameter other than 1, and the test body will fail the\n// assertion.\nclass GeneratorEvaluationTest : public TestWithParam<int> {\n public:\n  static int param_value() { return param_value_; }\n  static void set_param_value(int param_value) { param_value_ = param_value; }\n\n private:\n  static int param_value_;\n};\nint GeneratorEvaluationTest::param_value_ = 0;\n\nTEST_P(GeneratorEvaluationTest, GeneratorsEvaluatedInMain) {\n  EXPECT_EQ(1, GetParam());\n}\nINSTANTIATE_TEST_CASE_P(GenEvalModule,\n                        GeneratorEvaluationTest,\n                        Values(GeneratorEvaluationTest::param_value()));\n\n// Tests that generators defined in a different translation unit are\n// functional. Generator extern_gen is defined in gtest-param-test_test2.cc.\nextern ParamGenerator<int> extern_gen;\nclass ExternalGeneratorTest : public TestWithParam<int> {};\nTEST_P(ExternalGeneratorTest, ExternalGenerator) {\n  // Sequence produced by extern_gen contains only a single value\n  // which we verify here.\n  EXPECT_EQ(GetParam(), 33);\n}\nINSTANTIATE_TEST_CASE_P(ExternalGeneratorModule,\n                        ExternalGeneratorTest,\n                        extern_gen);\n\n// Tests that a parameterized test case can be defined in one translation\n// unit and instantiated in another. This test will be instantiated in\n// gtest-param-test_test2.cc. ExternalInstantiationTest fixture class is\n// defined in gtest-param-test_test.h.\nTEST_P(ExternalInstantiationTest, IsMultipleOf33) {\n  EXPECT_EQ(0, GetParam() % 33);\n}\n\n// Tests that a parameterized test case can be instantiated with multiple\n// generators.\nclass MultipleInstantiationTest : public TestWithParam<int> {};\nTEST_P(MultipleInstantiationTest, AllowsMultipleInstances) {\n}\nINSTANTIATE_TEST_CASE_P(Sequence1, MultipleInstantiationTest, Values(1, 2));\nINSTANTIATE_TEST_CASE_P(Sequence2, MultipleInstantiationTest, Range(3, 5));\n\n// Tests that a parameterized test case can be instantiated\n// in multiple translation units. This test will be instantiated\n// here and in gtest-param-test_test2.cc.\n// InstantiationInMultipleTranslationUnitsTest fixture class\n// is defined in gtest-param-test_test.h.\nTEST_P(InstantiationInMultipleTranslaionUnitsTest, IsMultipleOf42) {\n  EXPECT_EQ(0, GetParam() % 42);\n}\nINSTANTIATE_TEST_CASE_P(Sequence1,\n                        InstantiationInMultipleTranslaionUnitsTest,\n                        Values(42, 42*2));\n\n// Tests that each iteration of parameterized test runs in a separate test\n// object.\nclass SeparateInstanceTest : public TestWithParam<int> {\n public:\n  SeparateInstanceTest() : count_(0) {}\n\n  static void TearDownTestCase() {\n    EXPECT_GE(global_count_, 2)\n        << \"If some (but not all) SeparateInstanceTest tests have been \"\n        << \"filtered out this test will fail. Make sure that all \"\n        << \"GeneratorEvaluationTest are selected or de-selected together \"\n        << \"by the test filter.\";\n  }\n\n protected:\n  int count_;\n  static int global_count_;\n};\nint SeparateInstanceTest::global_count_ = 0;\n\nTEST_P(SeparateInstanceTest, TestsRunInSeparateInstances) {\n  EXPECT_EQ(0, count_++);\n  global_count_++;\n}\nINSTANTIATE_TEST_CASE_P(FourElemSequence, SeparateInstanceTest, Range(1, 4));\n\n// Tests that all instantiations of a test have named appropriately. Test\n// defined with TEST_P(TestCaseName, TestName) and instantiated with\n// INSTANTIATE_TEST_CASE_P(SequenceName, TestCaseName, generator) must be named\n// SequenceName/TestCaseName.TestName/i, where i is the 0-based index of the\n// sequence element used to instantiate the test.\nclass NamingTest : public TestWithParam<int> {};\n\nTEST_P(NamingTest, TestsReportCorrectNamesAndParameters) {\n  const ::testing::TestInfo* const test_info =\n     ::testing::UnitTest::GetInstance()->current_test_info();\n\n  EXPECT_STREQ(\"ZeroToFiveSequence/NamingTest\", test_info->test_case_name());\n\n  Message index_stream;\n  index_stream << \"TestsReportCorrectNamesAndParameters/\" << GetParam();\n  EXPECT_STREQ(index_stream.GetString().c_str(), test_info->name());\n\n  EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());\n}\n\nINSTANTIATE_TEST_CASE_P(ZeroToFiveSequence, NamingTest, Range(0, 5));\n\n// Tests that macros in test names are expanded correctly.\nclass MacroNamingTest : public TestWithParam<int> {};\n\n#define PREFIX_WITH_FOO(test_name) Foo##test_name\n#define PREFIX_WITH_MACRO(test_name) Macro##test_name\n\nTEST_P(PREFIX_WITH_MACRO(NamingTest), PREFIX_WITH_FOO(SomeTestName)) {\n  const ::testing::TestInfo* const test_info =\n     ::testing::UnitTest::GetInstance()->current_test_info();\n\n  EXPECT_STREQ(\"FortyTwo/MacroNamingTest\", test_info->test_case_name());\n  EXPECT_STREQ(\"FooSomeTestName\", test_info->name());\n}\n\nINSTANTIATE_TEST_CASE_P(FortyTwo, MacroNamingTest, Values(42));\n\n// Tests the same thing for non-parametrized tests.\nclass MacroNamingTestNonParametrized : public ::testing::Test {};\n\nTEST_F(PREFIX_WITH_MACRO(NamingTestNonParametrized),\n       PREFIX_WITH_FOO(SomeTestName)) {\n  const ::testing::TestInfo* const test_info =\n     ::testing::UnitTest::GetInstance()->current_test_info();\n\n  EXPECT_STREQ(\"MacroNamingTestNonParametrized\", test_info->test_case_name());\n  EXPECT_STREQ(\"FooSomeTestName\", test_info->name());\n}\n\n// Tests that user supplied custom parameter names are working correctly.\n// Runs the test with a builtin helper method which uses PrintToString,\n// as well as a custom function and custom functor to ensure all possible\n// uses work correctly.\nclass CustomFunctorNamingTest : public TestWithParam<std::string> {};\nTEST_P(CustomFunctorNamingTest, CustomTestNames) {}\n\nstruct CustomParamNameFunctor {\n  std::string operator()(const ::testing::TestParamInfo<std::string>& inf) {\n    return inf.param;\n  }\n};\n\nINSTANTIATE_TEST_CASE_P(CustomParamNameFunctor,\n                        CustomFunctorNamingTest,\n                        Values(std::string(\"FunctorName\")),\n                        CustomParamNameFunctor());\n\nINSTANTIATE_TEST_CASE_P(AllAllowedCharacters,\n                        CustomFunctorNamingTest,\n                        Values(\"abcdefghijklmnopqrstuvwxyz\",\n                               \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",\n                               \"01234567890_\"),\n                        CustomParamNameFunctor());\n\ninline std::string CustomParamNameFunction(\n    const ::testing::TestParamInfo<std::string>& inf) {\n  return inf.param;\n}\n\nclass CustomFunctionNamingTest : public TestWithParam<std::string> {};\nTEST_P(CustomFunctionNamingTest, CustomTestNames) {}\n\nINSTANTIATE_TEST_CASE_P(CustomParamNameFunction,\n                        CustomFunctionNamingTest,\n                        Values(std::string(\"FunctionName\")),\n                        CustomParamNameFunction);\n\n#if GTEST_LANG_CXX11\n\n// Test custom naming with a lambda\n\nclass CustomLambdaNamingTest : public TestWithParam<std::string> {};\nTEST_P(CustomLambdaNamingTest, CustomTestNames) {}\n\nINSTANTIATE_TEST_CASE_P(CustomParamNameLambda, CustomLambdaNamingTest,\n                        Values(std::string(\"LambdaName\")),\n                        [](const ::testing::TestParamInfo<std::string>& inf) {\n                          return inf.param;\n                        });\n\n#endif  // GTEST_LANG_CXX11\n\nTEST(CustomNamingTest, CheckNameRegistry) {\n  ::testing::UnitTest* unit_test = ::testing::UnitTest::GetInstance();\n  std::set<std::string> test_names;\n  for (int case_num = 0;\n       case_num < unit_test->total_test_case_count();\n       ++case_num) {\n    const ::testing::TestCase* test_case = unit_test->GetTestCase(case_num);\n    for (int test_num = 0;\n         test_num < test_case->total_test_count();\n         ++test_num) {\n      const ::testing::TestInfo* test_info = test_case->GetTestInfo(test_num);\n      test_names.insert(std::string(test_info->name()));\n    }\n  }\n  EXPECT_EQ(1u, test_names.count(\"CustomTestNames/FunctorName\"));\n  EXPECT_EQ(1u, test_names.count(\"CustomTestNames/FunctionName\"));\n#if GTEST_LANG_CXX11\n  EXPECT_EQ(1u, test_names.count(\"CustomTestNames/LambdaName\"));\n#endif  // GTEST_LANG_CXX11\n}\n\n// Test a numeric name to ensure PrintToStringParamName works correctly.\n\nclass CustomIntegerNamingTest : public TestWithParam<int> {};\n\nTEST_P(CustomIntegerNamingTest, TestsReportCorrectNames) {\n  const ::testing::TestInfo* const test_info =\n     ::testing::UnitTest::GetInstance()->current_test_info();\n  Message test_name_stream;\n  test_name_stream << \"TestsReportCorrectNames/\" << GetParam();\n  EXPECT_STREQ(test_name_stream.GetString().c_str(), test_info->name());\n}\n\nINSTANTIATE_TEST_CASE_P(PrintToString,\n                        CustomIntegerNamingTest,\n                        Range(0, 5),\n                        ::testing::PrintToStringParamName());\n\n// Test a custom struct with PrintToString.\n\nstruct CustomStruct {\n  explicit CustomStruct(int value) : x(value) {}\n  int x;\n};\n\nstd::ostream& operator<<(std::ostream& stream, const CustomStruct& val) {\n  stream << val.x;\n  return stream;\n}\n\nclass CustomStructNamingTest : public TestWithParam<CustomStruct> {};\n\nTEST_P(CustomStructNamingTest, TestsReportCorrectNames) {\n  const ::testing::TestInfo* const test_info =\n     ::testing::UnitTest::GetInstance()->current_test_info();\n  Message test_name_stream;\n  test_name_stream << \"TestsReportCorrectNames/\" << GetParam();\n  EXPECT_STREQ(test_name_stream.GetString().c_str(), test_info->name());\n}\n\nINSTANTIATE_TEST_CASE_P(PrintToString,\n                        CustomStructNamingTest,\n                        Values(CustomStruct(0), CustomStruct(1)),\n                        ::testing::PrintToStringParamName());\n\n// Test that using a stateful parameter naming function works as expected.\n\nstruct StatefulNamingFunctor {\n  StatefulNamingFunctor() : sum(0) {}\n  std::string operator()(const ::testing::TestParamInfo<int>& info) {\n    int value = info.param + sum;\n    sum += info.param;\n    return ::testing::PrintToString(value);\n  }\n  int sum;\n};\n\nclass StatefulNamingTest : public ::testing::TestWithParam<int> {\n protected:\n  StatefulNamingTest() : sum_(0) {}\n  int sum_;\n};\n\nTEST_P(StatefulNamingTest, TestsReportCorrectNames) {\n  const ::testing::TestInfo* const test_info =\n     ::testing::UnitTest::GetInstance()->current_test_info();\n  sum_ += GetParam();\n  Message test_name_stream;\n  test_name_stream << \"TestsReportCorrectNames/\" << sum_;\n  EXPECT_STREQ(test_name_stream.GetString().c_str(), test_info->name());\n}\n\nINSTANTIATE_TEST_CASE_P(StatefulNamingFunctor,\n                        StatefulNamingTest,\n                        Range(0, 5),\n                        StatefulNamingFunctor());\n\n// Class that cannot be streamed into an ostream.  It needs to be copyable\n// (and, in case of MSVC, also assignable) in order to be a test parameter\n// type.  Its default copy constructor and assignment operator do exactly\n// what we need.\nclass Unstreamable {\n public:\n  explicit Unstreamable(int value) : value_(value) {}\n\n private:\n  int value_;\n};\n\nclass CommentTest : public TestWithParam<Unstreamable> {};\n\nTEST_P(CommentTest, TestsCorrectlyReportUnstreamableParams) {\n  const ::testing::TestInfo* const test_info =\n     ::testing::UnitTest::GetInstance()->current_test_info();\n\n  EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());\n}\n\nINSTANTIATE_TEST_CASE_P(InstantiationWithComments,\n                        CommentTest,\n                        Values(Unstreamable(1)));\n\n// Verify that we can create a hierarchy of test fixtures, where the base\n// class fixture is not parameterized and the derived class is. In this case\n// ParameterizedDerivedTest inherits from NonParameterizedBaseTest.  We\n// perform simple tests on both.\nclass NonParameterizedBaseTest : public ::testing::Test {\n public:\n  NonParameterizedBaseTest() : n_(17) { }\n protected:\n  int n_;\n};\n\nclass ParameterizedDerivedTest : public NonParameterizedBaseTest,\n                                 public ::testing::WithParamInterface<int> {\n protected:\n  ParameterizedDerivedTest() : count_(0) { }\n  int count_;\n  static int global_count_;\n};\n\nint ParameterizedDerivedTest::global_count_ = 0;\n\nTEST_F(NonParameterizedBaseTest, FixtureIsInitialized) {\n  EXPECT_EQ(17, n_);\n}\n\nTEST_P(ParameterizedDerivedTest, SeesSequence) {\n  EXPECT_EQ(17, n_);\n  EXPECT_EQ(0, count_++);\n  EXPECT_EQ(GetParam(), global_count_++);\n}\n\nclass ParameterizedDeathTest : public ::testing::TestWithParam<int> { };\n\nTEST_F(ParameterizedDeathTest, GetParamDiesFromTestF) {\n  EXPECT_DEATH_IF_SUPPORTED(GetParam(),\n                            \".* value-parameterized test .*\");\n}\n\nINSTANTIATE_TEST_CASE_P(RangeZeroToFive, ParameterizedDerivedTest, Range(0, 5));\n\n\nint main(int argc, char **argv) {\n  // Used in TestGenerationTest test case.\n  AddGlobalTestEnvironment(TestGenerationTest::Environment::Instance());\n  // Used in GeneratorEvaluationTest test case. Tests that the updated value\n  // will be picked up for instantiating tests in GeneratorEvaluationTest.\n  GeneratorEvaluationTest::set_param_value(1);\n\n  ::testing::InitGoogleTest(&argc, argv);\n\n  // Used in GeneratorEvaluationTest test case. Tests that value updated\n  // here will NOT be used for instantiating tests in\n  // GeneratorEvaluationTest.\n  GeneratorEvaluationTest::set_param_value(2);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-param-test-test.h",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This header file provides classes and functions used internally\n// for testing Google Test itself.\n\n#ifndef GTEST_TEST_GTEST_PARAM_TEST_TEST_H_\n#define GTEST_TEST_GTEST_PARAM_TEST_TEST_H_\n\n#include \"gtest/gtest.h\"\n\n// Test fixture for testing definition and instantiation of a test\n// in separate translation units.\nclass ExternalInstantiationTest : public ::testing::TestWithParam<int> {\n};\n\n// Test fixture for testing instantiation of a test in multiple\n// translation units.\nclass InstantiationInMultipleTranslaionUnitsTest\n    : public ::testing::TestWithParam<int> {\n};\n\n#endif  // GTEST_TEST_GTEST_PARAM_TEST_TEST_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-param-test2-test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Tests for Google Test itself.  This verifies that the basic constructs of\n// Google Test work.\n\n#include \"gtest/gtest.h\"\n#include \"test/googletest-param-test-test.h\"\n\nusing ::testing::Values;\nusing ::testing::internal::ParamGenerator;\n\n// Tests that generators defined in a different translation unit\n// are functional. The test using extern_gen is defined\n// in googletest-param-test-test.cc.\nParamGenerator<int> extern_gen = Values(33);\n\n// Tests that a parameterized test case can be defined in one translation unit\n// and instantiated in another. The test is defined in\n// googletest-param-test-test.cc and ExternalInstantiationTest fixture class is\n// defined in gtest-param-test_test.h.\nINSTANTIATE_TEST_CASE_P(MultiplesOf33,\n                        ExternalInstantiationTest,\n                        Values(33, 66));\n\n// Tests that a parameterized test case can be instantiated\n// in multiple translation units. Another instantiation is defined\n// in googletest-param-test-test.cc and\n// InstantiationInMultipleTranslaionUnitsTest fixture is defined in\n// gtest-param-test_test.h\nINSTANTIATE_TEST_CASE_P(Sequence2,\n                        InstantiationInMultipleTranslaionUnitsTest,\n                        Values(42*3, 42*4, 42*5));\n\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-port-test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// This file tests the internal cross-platform support utilities.\n#include <stdio.h>\n\n#include \"gtest/internal/gtest-port.h\"\n\n#if GTEST_OS_MAC\n# include <time.h>\n#endif  // GTEST_OS_MAC\n\n#include <list>\n#include <utility>  // For std::pair and std::make_pair.\n#include <vector>\n\n#include \"gtest/gtest.h\"\n#include \"gtest/gtest-spi.h\"\n#include \"src/gtest-internal-inl.h\"\n\nusing std::make_pair;\nusing std::pair;\n\nnamespace testing {\nnamespace internal {\n\nTEST(IsXDigitTest, WorksForNarrowAscii) {\n  EXPECT_TRUE(IsXDigit('0'));\n  EXPECT_TRUE(IsXDigit('9'));\n  EXPECT_TRUE(IsXDigit('A'));\n  EXPECT_TRUE(IsXDigit('F'));\n  EXPECT_TRUE(IsXDigit('a'));\n  EXPECT_TRUE(IsXDigit('f'));\n\n  EXPECT_FALSE(IsXDigit('-'));\n  EXPECT_FALSE(IsXDigit('g'));\n  EXPECT_FALSE(IsXDigit('G'));\n}\n\nTEST(IsXDigitTest, ReturnsFalseForNarrowNonAscii) {\n  EXPECT_FALSE(IsXDigit(static_cast<char>('\\x80')));\n  EXPECT_FALSE(IsXDigit(static_cast<char>('0' | '\\x80')));\n}\n\nTEST(IsXDigitTest, WorksForWideAscii) {\n  EXPECT_TRUE(IsXDigit(L'0'));\n  EXPECT_TRUE(IsXDigit(L'9'));\n  EXPECT_TRUE(IsXDigit(L'A'));\n  EXPECT_TRUE(IsXDigit(L'F'));\n  EXPECT_TRUE(IsXDigit(L'a'));\n  EXPECT_TRUE(IsXDigit(L'f'));\n\n  EXPECT_FALSE(IsXDigit(L'-'));\n  EXPECT_FALSE(IsXDigit(L'g'));\n  EXPECT_FALSE(IsXDigit(L'G'));\n}\n\nTEST(IsXDigitTest, ReturnsFalseForWideNonAscii) {\n  EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(0x80)));\n  EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(L'0' | 0x80)));\n  EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(L'0' | 0x100)));\n}\n\nclass Base {\n public:\n  // Copy constructor and assignment operator do exactly what we need, so we\n  // use them.\n  Base() : member_(0) {}\n  explicit Base(int n) : member_(n) {}\n  virtual ~Base() {}\n  int member() { return member_; }\n\n private:\n  int member_;\n};\n\nclass Derived : public Base {\n public:\n  explicit Derived(int n) : Base(n) {}\n};\n\nTEST(ImplicitCastTest, ConvertsPointers) {\n  Derived derived(0);\n  EXPECT_TRUE(&derived == ::testing::internal::ImplicitCast_<Base*>(&derived));\n}\n\nTEST(ImplicitCastTest, CanUseInheritance) {\n  Derived derived(1);\n  Base base = ::testing::internal::ImplicitCast_<Base>(derived);\n  EXPECT_EQ(derived.member(), base.member());\n}\n\nclass Castable {\n public:\n  explicit Castable(bool* converted) : converted_(converted) {}\n  operator Base() {\n    *converted_ = true;\n    return Base();\n  }\n\n private:\n  bool* converted_;\n};\n\nTEST(ImplicitCastTest, CanUseNonConstCastOperator) {\n  bool converted = false;\n  Castable castable(&converted);\n  Base base = ::testing::internal::ImplicitCast_<Base>(castable);\n  EXPECT_TRUE(converted);\n}\n\nclass ConstCastable {\n public:\n  explicit ConstCastable(bool* converted) : converted_(converted) {}\n  operator Base() const {\n    *converted_ = true;\n    return Base();\n  }\n\n private:\n  bool* converted_;\n};\n\nTEST(ImplicitCastTest, CanUseConstCastOperatorOnConstValues) {\n  bool converted = false;\n  const ConstCastable const_castable(&converted);\n  Base base = ::testing::internal::ImplicitCast_<Base>(const_castable);\n  EXPECT_TRUE(converted);\n}\n\nclass ConstAndNonConstCastable {\n public:\n  ConstAndNonConstCastable(bool* converted, bool* const_converted)\n      : converted_(converted), const_converted_(const_converted) {}\n  operator Base() {\n    *converted_ = true;\n    return Base();\n  }\n  operator Base() const {\n    *const_converted_ = true;\n    return Base();\n  }\n\n private:\n  bool* converted_;\n  bool* const_converted_;\n};\n\nTEST(ImplicitCastTest, CanSelectBetweenConstAndNonConstCasrAppropriately) {\n  bool converted = false;\n  bool const_converted = false;\n  ConstAndNonConstCastable castable(&converted, &const_converted);\n  Base base = ::testing::internal::ImplicitCast_<Base>(castable);\n  EXPECT_TRUE(converted);\n  EXPECT_FALSE(const_converted);\n\n  converted = false;\n  const_converted = false;\n  const ConstAndNonConstCastable const_castable(&converted, &const_converted);\n  base = ::testing::internal::ImplicitCast_<Base>(const_castable);\n  EXPECT_FALSE(converted);\n  EXPECT_TRUE(const_converted);\n}\n\nclass To {\n public:\n  To(bool* converted) { *converted = true; }  // NOLINT\n};\n\nTEST(ImplicitCastTest, CanUseImplicitConstructor) {\n  bool converted = false;\n  To to = ::testing::internal::ImplicitCast_<To>(&converted);\n  (void)to;\n  EXPECT_TRUE(converted);\n}\n\nTEST(IteratorTraitsTest, WorksForSTLContainerIterators) {\n  StaticAssertTypeEq<int,\n      IteratorTraits< ::std::vector<int>::const_iterator>::value_type>();\n  StaticAssertTypeEq<bool,\n      IteratorTraits< ::std::list<bool>::iterator>::value_type>();\n}\n\nTEST(IteratorTraitsTest, WorksForPointerToNonConst) {\n  StaticAssertTypeEq<char, IteratorTraits<char*>::value_type>();\n  StaticAssertTypeEq<const void*, IteratorTraits<const void**>::value_type>();\n}\n\nTEST(IteratorTraitsTest, WorksForPointerToConst) {\n  StaticAssertTypeEq<char, IteratorTraits<const char*>::value_type>();\n  StaticAssertTypeEq<const void*,\n      IteratorTraits<const void* const*>::value_type>();\n}\n\n// Tests that the element_type typedef is available in scoped_ptr and refers\n// to the parameter type.\nTEST(ScopedPtrTest, DefinesElementType) {\n  StaticAssertTypeEq<int, ::testing::internal::scoped_ptr<int>::element_type>();\n}\n\n// FIXME: Implement THE REST of scoped_ptr tests.\n\nTEST(GtestCheckSyntaxTest, BehavesLikeASingleStatement) {\n  if (AlwaysFalse())\n    GTEST_CHECK_(false) << \"This should never be executed; \"\n                           \"It's a compilation test only.\";\n\n  if (AlwaysTrue())\n    GTEST_CHECK_(true);\n  else\n    ;  // NOLINT\n\n  if (AlwaysFalse())\n    ;  // NOLINT\n  else\n    GTEST_CHECK_(true) << \"\";\n}\n\nTEST(GtestCheckSyntaxTest, WorksWithSwitch) {\n  switch (0) {\n    case 1:\n      break;\n    default:\n      GTEST_CHECK_(true);\n  }\n\n  switch (0)\n    case 0:\n      GTEST_CHECK_(true) << \"Check failed in switch case\";\n}\n\n// Verifies behavior of FormatFileLocation.\nTEST(FormatFileLocationTest, FormatsFileLocation) {\n  EXPECT_PRED_FORMAT2(IsSubstring, \"foo.cc\", FormatFileLocation(\"foo.cc\", 42));\n  EXPECT_PRED_FORMAT2(IsSubstring, \"42\", FormatFileLocation(\"foo.cc\", 42));\n}\n\nTEST(FormatFileLocationTest, FormatsUnknownFile) {\n  EXPECT_PRED_FORMAT2(\n      IsSubstring, \"unknown file\", FormatFileLocation(NULL, 42));\n  EXPECT_PRED_FORMAT2(IsSubstring, \"42\", FormatFileLocation(NULL, 42));\n}\n\nTEST(FormatFileLocationTest, FormatsUknownLine) {\n  EXPECT_EQ(\"foo.cc:\", FormatFileLocation(\"foo.cc\", -1));\n}\n\nTEST(FormatFileLocationTest, FormatsUknownFileAndLine) {\n  EXPECT_EQ(\"unknown file:\", FormatFileLocation(NULL, -1));\n}\n\n// Verifies behavior of FormatCompilerIndependentFileLocation.\nTEST(FormatCompilerIndependentFileLocationTest, FormatsFileLocation) {\n  EXPECT_EQ(\"foo.cc:42\", FormatCompilerIndependentFileLocation(\"foo.cc\", 42));\n}\n\nTEST(FormatCompilerIndependentFileLocationTest, FormatsUknownFile) {\n  EXPECT_EQ(\"unknown file:42\",\n            FormatCompilerIndependentFileLocation(NULL, 42));\n}\n\nTEST(FormatCompilerIndependentFileLocationTest, FormatsUknownLine) {\n  EXPECT_EQ(\"foo.cc\", FormatCompilerIndependentFileLocation(\"foo.cc\", -1));\n}\n\nTEST(FormatCompilerIndependentFileLocationTest, FormatsUknownFileAndLine) {\n  EXPECT_EQ(\"unknown file\", FormatCompilerIndependentFileLocation(NULL, -1));\n}\n\n#if GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_QNX || GTEST_OS_FUCHSIA\nvoid* ThreadFunc(void* data) {\n  internal::Mutex* mutex = static_cast<internal::Mutex*>(data);\n  mutex->Lock();\n  mutex->Unlock();\n  return NULL;\n}\n\nTEST(GetThreadCountTest, ReturnsCorrectValue) {\n  const size_t starting_count = GetThreadCount();\n  pthread_t       thread_id;\n\n  internal::Mutex mutex;\n  {\n    internal::MutexLock lock(&mutex);\n    pthread_attr_t  attr;\n    ASSERT_EQ(0, pthread_attr_init(&attr));\n    ASSERT_EQ(0, pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE));\n\n    const int status = pthread_create(&thread_id, &attr, &ThreadFunc, &mutex);\n    ASSERT_EQ(0, pthread_attr_destroy(&attr));\n    ASSERT_EQ(0, status);\n    EXPECT_EQ(starting_count + 1, GetThreadCount());\n  }\n\n  void* dummy;\n  ASSERT_EQ(0, pthread_join(thread_id, &dummy));\n\n  // The OS may not immediately report the updated thread count after\n  // joining a thread, causing flakiness in this test. To counter that, we\n  // wait for up to .5 seconds for the OS to report the correct value.\n  for (int i = 0; i < 5; ++i) {\n    if (GetThreadCount() == starting_count)\n      break;\n\n    SleepMilliseconds(100);\n  }\n\n  EXPECT_EQ(starting_count, GetThreadCount());\n}\n#else\nTEST(GetThreadCountTest, ReturnsZeroWhenUnableToCountThreads) {\n  EXPECT_EQ(0U, GetThreadCount());\n}\n#endif  // GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_QNX || GTEST_OS_FUCHSIA\n\nTEST(GtestCheckDeathTest, DiesWithCorrectOutputOnFailure) {\n  const bool a_false_condition = false;\n  const char regex[] =\n#ifdef _MSC_VER\n     \"googletest-port-test\\\\.cc\\\\(\\\\d+\\\\):\"\n#elif GTEST_USES_POSIX_RE\n     \"googletest-port-test\\\\.cc:[0-9]+\"\n#else\n     \"googletest-port-test\\\\.cc:\\\\d+\"\n#endif  // _MSC_VER\n     \".*a_false_condition.*Extra info.*\";\n\n  EXPECT_DEATH_IF_SUPPORTED(GTEST_CHECK_(a_false_condition) << \"Extra info\",\n                            regex);\n}\n\n#if GTEST_HAS_DEATH_TEST\n\nTEST(GtestCheckDeathTest, LivesSilentlyOnSuccess) {\n  EXPECT_EXIT({\n      GTEST_CHECK_(true) << \"Extra info\";\n      ::std::cerr << \"Success\\n\";\n      exit(0); },\n      ::testing::ExitedWithCode(0), \"Success\");\n}\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n// Verifies that Google Test choose regular expression engine appropriate to\n// the platform. The test will produce compiler errors in case of failure.\n// For simplicity, we only cover the most important platforms here.\nTEST(RegexEngineSelectionTest, SelectsCorrectRegexEngine) {\n#if !GTEST_USES_PCRE\n# if GTEST_HAS_POSIX_RE\n\n  EXPECT_TRUE(GTEST_USES_POSIX_RE);\n\n# else\n\n  EXPECT_TRUE(GTEST_USES_SIMPLE_RE);\n\n# endif\n#endif  // !GTEST_USES_PCRE\n}\n\n#if GTEST_USES_POSIX_RE\n\n# if GTEST_HAS_TYPED_TEST\n\ntemplate <typename Str>\nclass RETest : public ::testing::Test {};\n\n// Defines StringTypes as the list of all string types that class RE\n// supports.\ntypedef testing::Types<\n    ::std::string,\n#  if GTEST_HAS_GLOBAL_STRING\n    ::string,\n#  endif  // GTEST_HAS_GLOBAL_STRING\n    const char*> StringTypes;\n\nTYPED_TEST_CASE(RETest, StringTypes);\n\n// Tests RE's implicit constructors.\nTYPED_TEST(RETest, ImplicitConstructorWorks) {\n  const RE empty(TypeParam(\"\"));\n  EXPECT_STREQ(\"\", empty.pattern());\n\n  const RE simple(TypeParam(\"hello\"));\n  EXPECT_STREQ(\"hello\", simple.pattern());\n\n  const RE normal(TypeParam(\".*(\\\\w+)\"));\n  EXPECT_STREQ(\".*(\\\\w+)\", normal.pattern());\n}\n\n// Tests that RE's constructors reject invalid regular expressions.\nTYPED_TEST(RETest, RejectsInvalidRegex) {\n  EXPECT_NONFATAL_FAILURE({\n    const RE invalid(TypeParam(\"?\"));\n  }, \"\\\"?\\\" is not a valid POSIX Extended regular expression.\");\n}\n\n// Tests RE::FullMatch().\nTYPED_TEST(RETest, FullMatchWorks) {\n  const RE empty(TypeParam(\"\"));\n  EXPECT_TRUE(RE::FullMatch(TypeParam(\"\"), empty));\n  EXPECT_FALSE(RE::FullMatch(TypeParam(\"a\"), empty));\n\n  const RE re(TypeParam(\"a.*z\"));\n  EXPECT_TRUE(RE::FullMatch(TypeParam(\"az\"), re));\n  EXPECT_TRUE(RE::FullMatch(TypeParam(\"axyz\"), re));\n  EXPECT_FALSE(RE::FullMatch(TypeParam(\"baz\"), re));\n  EXPECT_FALSE(RE::FullMatch(TypeParam(\"azy\"), re));\n}\n\n// Tests RE::PartialMatch().\nTYPED_TEST(RETest, PartialMatchWorks) {\n  const RE empty(TypeParam(\"\"));\n  EXPECT_TRUE(RE::PartialMatch(TypeParam(\"\"), empty));\n  EXPECT_TRUE(RE::PartialMatch(TypeParam(\"a\"), empty));\n\n  const RE re(TypeParam(\"a.*z\"));\n  EXPECT_TRUE(RE::PartialMatch(TypeParam(\"az\"), re));\n  EXPECT_TRUE(RE::PartialMatch(TypeParam(\"axyz\"), re));\n  EXPECT_TRUE(RE::PartialMatch(TypeParam(\"baz\"), re));\n  EXPECT_TRUE(RE::PartialMatch(TypeParam(\"azy\"), re));\n  EXPECT_FALSE(RE::PartialMatch(TypeParam(\"zza\"), re));\n}\n\n# endif  // GTEST_HAS_TYPED_TEST\n\n#elif GTEST_USES_SIMPLE_RE\n\nTEST(IsInSetTest, NulCharIsNotInAnySet) {\n  EXPECT_FALSE(IsInSet('\\0', \"\"));\n  EXPECT_FALSE(IsInSet('\\0', \"\\0\"));\n  EXPECT_FALSE(IsInSet('\\0', \"a\"));\n}\n\nTEST(IsInSetTest, WorksForNonNulChars) {\n  EXPECT_FALSE(IsInSet('a', \"Ab\"));\n  EXPECT_FALSE(IsInSet('c', \"\"));\n\n  EXPECT_TRUE(IsInSet('b', \"bcd\"));\n  EXPECT_TRUE(IsInSet('b', \"ab\"));\n}\n\nTEST(IsAsciiDigitTest, IsFalseForNonDigit) {\n  EXPECT_FALSE(IsAsciiDigit('\\0'));\n  EXPECT_FALSE(IsAsciiDigit(' '));\n  EXPECT_FALSE(IsAsciiDigit('+'));\n  EXPECT_FALSE(IsAsciiDigit('-'));\n  EXPECT_FALSE(IsAsciiDigit('.'));\n  EXPECT_FALSE(IsAsciiDigit('a'));\n}\n\nTEST(IsAsciiDigitTest, IsTrueForDigit) {\n  EXPECT_TRUE(IsAsciiDigit('0'));\n  EXPECT_TRUE(IsAsciiDigit('1'));\n  EXPECT_TRUE(IsAsciiDigit('5'));\n  EXPECT_TRUE(IsAsciiDigit('9'));\n}\n\nTEST(IsAsciiPunctTest, IsFalseForNonPunct) {\n  EXPECT_FALSE(IsAsciiPunct('\\0'));\n  EXPECT_FALSE(IsAsciiPunct(' '));\n  EXPECT_FALSE(IsAsciiPunct('\\n'));\n  EXPECT_FALSE(IsAsciiPunct('a'));\n  EXPECT_FALSE(IsAsciiPunct('0'));\n}\n\nTEST(IsAsciiPunctTest, IsTrueForPunct) {\n  for (const char* p = \"^-!\\\"#$%&'()*+,./:;<=>?@[\\\\]_`{|}~\"; *p; p++) {\n    EXPECT_PRED1(IsAsciiPunct, *p);\n  }\n}\n\nTEST(IsRepeatTest, IsFalseForNonRepeatChar) {\n  EXPECT_FALSE(IsRepeat('\\0'));\n  EXPECT_FALSE(IsRepeat(' '));\n  EXPECT_FALSE(IsRepeat('a'));\n  EXPECT_FALSE(IsRepeat('1'));\n  EXPECT_FALSE(IsRepeat('-'));\n}\n\nTEST(IsRepeatTest, IsTrueForRepeatChar) {\n  EXPECT_TRUE(IsRepeat('?'));\n  EXPECT_TRUE(IsRepeat('*'));\n  EXPECT_TRUE(IsRepeat('+'));\n}\n\nTEST(IsAsciiWhiteSpaceTest, IsFalseForNonWhiteSpace) {\n  EXPECT_FALSE(IsAsciiWhiteSpace('\\0'));\n  EXPECT_FALSE(IsAsciiWhiteSpace('a'));\n  EXPECT_FALSE(IsAsciiWhiteSpace('1'));\n  EXPECT_FALSE(IsAsciiWhiteSpace('+'));\n  EXPECT_FALSE(IsAsciiWhiteSpace('_'));\n}\n\nTEST(IsAsciiWhiteSpaceTest, IsTrueForWhiteSpace) {\n  EXPECT_TRUE(IsAsciiWhiteSpace(' '));\n  EXPECT_TRUE(IsAsciiWhiteSpace('\\n'));\n  EXPECT_TRUE(IsAsciiWhiteSpace('\\r'));\n  EXPECT_TRUE(IsAsciiWhiteSpace('\\t'));\n  EXPECT_TRUE(IsAsciiWhiteSpace('\\v'));\n  EXPECT_TRUE(IsAsciiWhiteSpace('\\f'));\n}\n\nTEST(IsAsciiWordCharTest, IsFalseForNonWordChar) {\n  EXPECT_FALSE(IsAsciiWordChar('\\0'));\n  EXPECT_FALSE(IsAsciiWordChar('+'));\n  EXPECT_FALSE(IsAsciiWordChar('.'));\n  EXPECT_FALSE(IsAsciiWordChar(' '));\n  EXPECT_FALSE(IsAsciiWordChar('\\n'));\n}\n\nTEST(IsAsciiWordCharTest, IsTrueForLetter) {\n  EXPECT_TRUE(IsAsciiWordChar('a'));\n  EXPECT_TRUE(IsAsciiWordChar('b'));\n  EXPECT_TRUE(IsAsciiWordChar('A'));\n  EXPECT_TRUE(IsAsciiWordChar('Z'));\n}\n\nTEST(IsAsciiWordCharTest, IsTrueForDigit) {\n  EXPECT_TRUE(IsAsciiWordChar('0'));\n  EXPECT_TRUE(IsAsciiWordChar('1'));\n  EXPECT_TRUE(IsAsciiWordChar('7'));\n  EXPECT_TRUE(IsAsciiWordChar('9'));\n}\n\nTEST(IsAsciiWordCharTest, IsTrueForUnderscore) {\n  EXPECT_TRUE(IsAsciiWordChar('_'));\n}\n\nTEST(IsValidEscapeTest, IsFalseForNonPrintable) {\n  EXPECT_FALSE(IsValidEscape('\\0'));\n  EXPECT_FALSE(IsValidEscape('\\007'));\n}\n\nTEST(IsValidEscapeTest, IsFalseForDigit) {\n  EXPECT_FALSE(IsValidEscape('0'));\n  EXPECT_FALSE(IsValidEscape('9'));\n}\n\nTEST(IsValidEscapeTest, IsFalseForWhiteSpace) {\n  EXPECT_FALSE(IsValidEscape(' '));\n  EXPECT_FALSE(IsValidEscape('\\n'));\n}\n\nTEST(IsValidEscapeTest, IsFalseForSomeLetter) {\n  EXPECT_FALSE(IsValidEscape('a'));\n  EXPECT_FALSE(IsValidEscape('Z'));\n}\n\nTEST(IsValidEscapeTest, IsTrueForPunct) {\n  EXPECT_TRUE(IsValidEscape('.'));\n  EXPECT_TRUE(IsValidEscape('-'));\n  EXPECT_TRUE(IsValidEscape('^'));\n  EXPECT_TRUE(IsValidEscape('$'));\n  EXPECT_TRUE(IsValidEscape('('));\n  EXPECT_TRUE(IsValidEscape(']'));\n  EXPECT_TRUE(IsValidEscape('{'));\n  EXPECT_TRUE(IsValidEscape('|'));\n}\n\nTEST(IsValidEscapeTest, IsTrueForSomeLetter) {\n  EXPECT_TRUE(IsValidEscape('d'));\n  EXPECT_TRUE(IsValidEscape('D'));\n  EXPECT_TRUE(IsValidEscape('s'));\n  EXPECT_TRUE(IsValidEscape('S'));\n  EXPECT_TRUE(IsValidEscape('w'));\n  EXPECT_TRUE(IsValidEscape('W'));\n}\n\nTEST(AtomMatchesCharTest, EscapedPunct) {\n  EXPECT_FALSE(AtomMatchesChar(true, '\\\\', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, '\\\\', ' '));\n  EXPECT_FALSE(AtomMatchesChar(true, '_', '.'));\n  EXPECT_FALSE(AtomMatchesChar(true, '.', 'a'));\n\n  EXPECT_TRUE(AtomMatchesChar(true, '\\\\', '\\\\'));\n  EXPECT_TRUE(AtomMatchesChar(true, '_', '_'));\n  EXPECT_TRUE(AtomMatchesChar(true, '+', '+'));\n  EXPECT_TRUE(AtomMatchesChar(true, '.', '.'));\n}\n\nTEST(AtomMatchesCharTest, Escaped_d) {\n  EXPECT_FALSE(AtomMatchesChar(true, 'd', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'd', 'a'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'd', '.'));\n\n  EXPECT_TRUE(AtomMatchesChar(true, 'd', '0'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'd', '9'));\n}\n\nTEST(AtomMatchesCharTest, Escaped_D) {\n  EXPECT_FALSE(AtomMatchesChar(true, 'D', '0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'D', '9'));\n\n  EXPECT_TRUE(AtomMatchesChar(true, 'D', '\\0'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'D', 'a'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'D', '-'));\n}\n\nTEST(AtomMatchesCharTest, Escaped_s) {\n  EXPECT_FALSE(AtomMatchesChar(true, 's', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 's', 'a'));\n  EXPECT_FALSE(AtomMatchesChar(true, 's', '.'));\n  EXPECT_FALSE(AtomMatchesChar(true, 's', '9'));\n\n  EXPECT_TRUE(AtomMatchesChar(true, 's', ' '));\n  EXPECT_TRUE(AtomMatchesChar(true, 's', '\\n'));\n  EXPECT_TRUE(AtomMatchesChar(true, 's', '\\t'));\n}\n\nTEST(AtomMatchesCharTest, Escaped_S) {\n  EXPECT_FALSE(AtomMatchesChar(true, 'S', ' '));\n  EXPECT_FALSE(AtomMatchesChar(true, 'S', '\\r'));\n\n  EXPECT_TRUE(AtomMatchesChar(true, 'S', '\\0'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'S', 'a'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'S', '9'));\n}\n\nTEST(AtomMatchesCharTest, Escaped_w) {\n  EXPECT_FALSE(AtomMatchesChar(true, 'w', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'w', '+'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'w', ' '));\n  EXPECT_FALSE(AtomMatchesChar(true, 'w', '\\n'));\n\n  EXPECT_TRUE(AtomMatchesChar(true, 'w', '0'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'w', 'b'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'w', 'C'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'w', '_'));\n}\n\nTEST(AtomMatchesCharTest, Escaped_W) {\n  EXPECT_FALSE(AtomMatchesChar(true, 'W', 'A'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'W', 'b'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'W', '9'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'W', '_'));\n\n  EXPECT_TRUE(AtomMatchesChar(true, 'W', '\\0'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'W', '*'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'W', '\\n'));\n}\n\nTEST(AtomMatchesCharTest, EscapedWhiteSpace) {\n  EXPECT_FALSE(AtomMatchesChar(true, 'f', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'f', '\\n'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'n', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'n', '\\r'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'r', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'r', 'a'));\n  EXPECT_FALSE(AtomMatchesChar(true, 't', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 't', 't'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'v', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'v', '\\f'));\n\n  EXPECT_TRUE(AtomMatchesChar(true, 'f', '\\f'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'n', '\\n'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'r', '\\r'));\n  EXPECT_TRUE(AtomMatchesChar(true, 't', '\\t'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'v', '\\v'));\n}\n\nTEST(AtomMatchesCharTest, UnescapedDot) {\n  EXPECT_FALSE(AtomMatchesChar(false, '.', '\\n'));\n\n  EXPECT_TRUE(AtomMatchesChar(false, '.', '\\0'));\n  EXPECT_TRUE(AtomMatchesChar(false, '.', '.'));\n  EXPECT_TRUE(AtomMatchesChar(false, '.', 'a'));\n  EXPECT_TRUE(AtomMatchesChar(false, '.', ' '));\n}\n\nTEST(AtomMatchesCharTest, UnescapedChar) {\n  EXPECT_FALSE(AtomMatchesChar(false, 'a', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(false, 'a', 'b'));\n  EXPECT_FALSE(AtomMatchesChar(false, '$', 'a'));\n\n  EXPECT_TRUE(AtomMatchesChar(false, '$', '$'));\n  EXPECT_TRUE(AtomMatchesChar(false, '5', '5'));\n  EXPECT_TRUE(AtomMatchesChar(false, 'Z', 'Z'));\n}\n\nTEST(ValidateRegexTest, GeneratesFailureAndReturnsFalseForInvalid) {\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(NULL)),\n                          \"NULL is not a valid simple regular expression\");\n  EXPECT_NONFATAL_FAILURE(\n      ASSERT_FALSE(ValidateRegex(\"a\\\\\")),\n      \"Syntax error at index 1 in simple regular expression \\\"a\\\\\\\": \");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"a\\\\\")),\n                          \"'\\\\' cannot appear at the end\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"\\\\n\\\\\")),\n                          \"'\\\\' cannot appear at the end\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"\\\\s\\\\hb\")),\n                          \"invalid escape sequence \\\"\\\\h\\\"\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"^^\")),\n                          \"'^' can only appear at the beginning\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\".*^b\")),\n                          \"'^' can only appear at the beginning\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"$$\")),\n                          \"'$' can only appear at the end\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"^$a\")),\n                          \"'$' can only appear at the end\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"a(b\")),\n                          \"'(' is unsupported\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"ab)\")),\n                          \"')' is unsupported\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"[ab\")),\n                          \"'[' is unsupported\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"a{2\")),\n                          \"'{' is unsupported\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"?\")),\n                          \"'?' can only follow a repeatable token\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"^*\")),\n                          \"'*' can only follow a repeatable token\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"5*+\")),\n                          \"'+' can only follow a repeatable token\");\n}\n\nTEST(ValidateRegexTest, ReturnsTrueForValid) {\n  EXPECT_TRUE(ValidateRegex(\"\"));\n  EXPECT_TRUE(ValidateRegex(\"a\"));\n  EXPECT_TRUE(ValidateRegex(\".*\"));\n  EXPECT_TRUE(ValidateRegex(\"^a_+\"));\n  EXPECT_TRUE(ValidateRegex(\"^a\\\\t\\\\&?\"));\n  EXPECT_TRUE(ValidateRegex(\"09*$\"));\n  EXPECT_TRUE(ValidateRegex(\"^Z$\"));\n  EXPECT_TRUE(ValidateRegex(\"a\\\\^Z\\\\$\\\\(\\\\)\\\\|\\\\[\\\\]\\\\{\\\\}\"));\n}\n\nTEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrOne) {\n  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', \"a\", \"ba\"));\n  // Repeating more than once.\n  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', \"b\", \"aab\"));\n\n  // Repeating zero times.\n  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', \"b\", \"ba\"));\n  // Repeating once.\n  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', \"b\", \"ab\"));\n  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '#', '?', \".\", \"##\"));\n}\n\nTEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrMany) {\n  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '*', \"a$\", \"baab\"));\n\n  // Repeating zero times.\n  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', \"b\", \"bc\"));\n  // Repeating once.\n  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', \"b\", \"abc\"));\n  // Repeating more than once.\n  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '*', \"-\", \"ab_1-g\"));\n}\n\nTEST(MatchRepetitionAndRegexAtHeadTest, WorksForOneOrMany) {\n  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', \"a$\", \"baab\"));\n  // Repeating zero times.\n  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', \"b\", \"bc\"));\n\n  // Repeating once.\n  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '+', \"b\", \"abc\"));\n  // Repeating more than once.\n  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '+', \"-\", \"ab_1-g\"));\n}\n\nTEST(MatchRegexAtHeadTest, ReturnsTrueForEmptyRegex) {\n  EXPECT_TRUE(MatchRegexAtHead(\"\", \"\"));\n  EXPECT_TRUE(MatchRegexAtHead(\"\", \"ab\"));\n}\n\nTEST(MatchRegexAtHeadTest, WorksWhenDollarIsInRegex) {\n  EXPECT_FALSE(MatchRegexAtHead(\"$\", \"a\"));\n\n  EXPECT_TRUE(MatchRegexAtHead(\"$\", \"\"));\n  EXPECT_TRUE(MatchRegexAtHead(\"a$\", \"a\"));\n}\n\nTEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithEscapeSequence) {\n  EXPECT_FALSE(MatchRegexAtHead(\"\\\\w\", \"+\"));\n  EXPECT_FALSE(MatchRegexAtHead(\"\\\\W\", \"ab\"));\n\n  EXPECT_TRUE(MatchRegexAtHead(\"\\\\sa\", \"\\nab\"));\n  EXPECT_TRUE(MatchRegexAtHead(\"\\\\d\", \"1a\"));\n}\n\nTEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithRepetition) {\n  EXPECT_FALSE(MatchRegexAtHead(\".+a\", \"abc\"));\n  EXPECT_FALSE(MatchRegexAtHead(\"a?b\", \"aab\"));\n\n  EXPECT_TRUE(MatchRegexAtHead(\".*a\", \"bc12-ab\"));\n  EXPECT_TRUE(MatchRegexAtHead(\"a?b\", \"b\"));\n  EXPECT_TRUE(MatchRegexAtHead(\"a?b\", \"ab\"));\n}\n\nTEST(MatchRegexAtHeadTest,\n     WorksWhenRegexStartsWithRepetionOfEscapeSequence) {\n  EXPECT_FALSE(MatchRegexAtHead(\"\\\\.+a\", \"abc\"));\n  EXPECT_FALSE(MatchRegexAtHead(\"\\\\s?b\", \"  b\"));\n\n  EXPECT_TRUE(MatchRegexAtHead(\"\\\\(*a\", \"((((ab\"));\n  EXPECT_TRUE(MatchRegexAtHead(\"\\\\^?b\", \"^b\"));\n  EXPECT_TRUE(MatchRegexAtHead(\"\\\\\\\\?b\", \"b\"));\n  EXPECT_TRUE(MatchRegexAtHead(\"\\\\\\\\?b\", \"\\\\b\"));\n}\n\nTEST(MatchRegexAtHeadTest, MatchesSequentially) {\n  EXPECT_FALSE(MatchRegexAtHead(\"ab.*c\", \"acabc\"));\n\n  EXPECT_TRUE(MatchRegexAtHead(\"ab.*c\", \"ab-fsc\"));\n}\n\nTEST(MatchRegexAnywhereTest, ReturnsFalseWhenStringIsNull) {\n  EXPECT_FALSE(MatchRegexAnywhere(\"\", NULL));\n}\n\nTEST(MatchRegexAnywhereTest, WorksWhenRegexStartsWithCaret) {\n  EXPECT_FALSE(MatchRegexAnywhere(\"^a\", \"ba\"));\n  EXPECT_FALSE(MatchRegexAnywhere(\"^$\", \"a\"));\n\n  EXPECT_TRUE(MatchRegexAnywhere(\"^a\", \"ab\"));\n  EXPECT_TRUE(MatchRegexAnywhere(\"^\", \"ab\"));\n  EXPECT_TRUE(MatchRegexAnywhere(\"^$\", \"\"));\n}\n\nTEST(MatchRegexAnywhereTest, ReturnsFalseWhenNoMatch) {\n  EXPECT_FALSE(MatchRegexAnywhere(\"a\", \"bcde123\"));\n  EXPECT_FALSE(MatchRegexAnywhere(\"a.+a\", \"--aa88888888\"));\n}\n\nTEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingPrefix) {\n  EXPECT_TRUE(MatchRegexAnywhere(\"\\\\w+\", \"ab1_ - 5\"));\n  EXPECT_TRUE(MatchRegexAnywhere(\".*=\", \"=\"));\n  EXPECT_TRUE(MatchRegexAnywhere(\"x.*ab?.*bc\", \"xaaabc\"));\n}\n\nTEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingNonPrefix) {\n  EXPECT_TRUE(MatchRegexAnywhere(\"\\\\w+\", \"$$$ ab1_ - 5\"));\n  EXPECT_TRUE(MatchRegexAnywhere(\"\\\\.+=\", \"=  ...=\"));\n}\n\n// Tests RE's implicit constructors.\nTEST(RETest, ImplicitConstructorWorks) {\n  const RE empty(\"\");\n  EXPECT_STREQ(\"\", empty.pattern());\n\n  const RE simple(\"hello\");\n  EXPECT_STREQ(\"hello\", simple.pattern());\n}\n\n// Tests that RE's constructors reject invalid regular expressions.\nTEST(RETest, RejectsInvalidRegex) {\n  EXPECT_NONFATAL_FAILURE({\n    const RE normal(NULL);\n  }, \"NULL is not a valid simple regular expression\");\n\n  EXPECT_NONFATAL_FAILURE({\n    const RE normal(\".*(\\\\w+\");\n  }, \"'(' is unsupported\");\n\n  EXPECT_NONFATAL_FAILURE({\n    const RE invalid(\"^?\");\n  }, \"'?' can only follow a repeatable token\");\n}\n\n// Tests RE::FullMatch().\nTEST(RETest, FullMatchWorks) {\n  const RE empty(\"\");\n  EXPECT_TRUE(RE::FullMatch(\"\", empty));\n  EXPECT_FALSE(RE::FullMatch(\"a\", empty));\n\n  const RE re1(\"a\");\n  EXPECT_TRUE(RE::FullMatch(\"a\", re1));\n\n  const RE re(\"a.*z\");\n  EXPECT_TRUE(RE::FullMatch(\"az\", re));\n  EXPECT_TRUE(RE::FullMatch(\"axyz\", re));\n  EXPECT_FALSE(RE::FullMatch(\"baz\", re));\n  EXPECT_FALSE(RE::FullMatch(\"azy\", re));\n}\n\n// Tests RE::PartialMatch().\nTEST(RETest, PartialMatchWorks) {\n  const RE empty(\"\");\n  EXPECT_TRUE(RE::PartialMatch(\"\", empty));\n  EXPECT_TRUE(RE::PartialMatch(\"a\", empty));\n\n  const RE re(\"a.*z\");\n  EXPECT_TRUE(RE::PartialMatch(\"az\", re));\n  EXPECT_TRUE(RE::PartialMatch(\"axyz\", re));\n  EXPECT_TRUE(RE::PartialMatch(\"baz\", re));\n  EXPECT_TRUE(RE::PartialMatch(\"azy\", re));\n  EXPECT_FALSE(RE::PartialMatch(\"zza\", re));\n}\n\n#endif  // GTEST_USES_POSIX_RE\n\n#if !GTEST_OS_WINDOWS_MOBILE\n\nTEST(CaptureTest, CapturesStdout) {\n  CaptureStdout();\n  fprintf(stdout, \"abc\");\n  EXPECT_STREQ(\"abc\", GetCapturedStdout().c_str());\n\n  CaptureStdout();\n  fprintf(stdout, \"def%cghi\", '\\0');\n  EXPECT_EQ(::std::string(\"def\\0ghi\", 7), ::std::string(GetCapturedStdout()));\n}\n\nTEST(CaptureTest, CapturesStderr) {\n  CaptureStderr();\n  fprintf(stderr, \"jkl\");\n  EXPECT_STREQ(\"jkl\", GetCapturedStderr().c_str());\n\n  CaptureStderr();\n  fprintf(stderr, \"jkl%cmno\", '\\0');\n  EXPECT_EQ(::std::string(\"jkl\\0mno\", 7), ::std::string(GetCapturedStderr()));\n}\n\n// Tests that stdout and stderr capture don't interfere with each other.\nTEST(CaptureTest, CapturesStdoutAndStderr) {\n  CaptureStdout();\n  CaptureStderr();\n  fprintf(stdout, \"pqr\");\n  fprintf(stderr, \"stu\");\n  EXPECT_STREQ(\"pqr\", GetCapturedStdout().c_str());\n  EXPECT_STREQ(\"stu\", GetCapturedStderr().c_str());\n}\n\nTEST(CaptureDeathTest, CannotReenterStdoutCapture) {\n  CaptureStdout();\n  EXPECT_DEATH_IF_SUPPORTED(CaptureStdout(),\n                            \"Only one stdout capturer can exist at a time\");\n  GetCapturedStdout();\n\n  // We cannot test stderr capturing using death tests as they use it\n  // themselves.\n}\n\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\nTEST(ThreadLocalTest, DefaultConstructorInitializesToDefaultValues) {\n  ThreadLocal<int> t1;\n  EXPECT_EQ(0, t1.get());\n\n  ThreadLocal<void*> t2;\n  EXPECT_TRUE(t2.get() == NULL);\n}\n\nTEST(ThreadLocalTest, SingleParamConstructorInitializesToParam) {\n  ThreadLocal<int> t1(123);\n  EXPECT_EQ(123, t1.get());\n\n  int i = 0;\n  ThreadLocal<int*> t2(&i);\n  EXPECT_EQ(&i, t2.get());\n}\n\nclass NoDefaultContructor {\n public:\n  explicit NoDefaultContructor(const char*) {}\n  NoDefaultContructor(const NoDefaultContructor&) {}\n};\n\nTEST(ThreadLocalTest, ValueDefaultContructorIsNotRequiredForParamVersion) {\n  ThreadLocal<NoDefaultContructor> bar(NoDefaultContructor(\"foo\"));\n  bar.pointer();\n}\n\nTEST(ThreadLocalTest, GetAndPointerReturnSameValue) {\n  ThreadLocal<std::string> thread_local_string;\n\n  EXPECT_EQ(thread_local_string.pointer(), &(thread_local_string.get()));\n\n  // Verifies the condition still holds after calling set.\n  thread_local_string.set(\"foo\");\n  EXPECT_EQ(thread_local_string.pointer(), &(thread_local_string.get()));\n}\n\nTEST(ThreadLocalTest, PointerAndConstPointerReturnSameValue) {\n  ThreadLocal<std::string> thread_local_string;\n  const ThreadLocal<std::string>& const_thread_local_string =\n      thread_local_string;\n\n  EXPECT_EQ(thread_local_string.pointer(), const_thread_local_string.pointer());\n\n  thread_local_string.set(\"foo\");\n  EXPECT_EQ(thread_local_string.pointer(), const_thread_local_string.pointer());\n}\n\n#if GTEST_IS_THREADSAFE\n\nvoid AddTwo(int* param) { *param += 2; }\n\nTEST(ThreadWithParamTest, ConstructorExecutesThreadFunc) {\n  int i = 40;\n  ThreadWithParam<int*> thread(&AddTwo, &i, NULL);\n  thread.Join();\n  EXPECT_EQ(42, i);\n}\n\nTEST(MutexDeathTest, AssertHeldShouldAssertWhenNotLocked) {\n  // AssertHeld() is flaky only in the presence of multiple threads accessing\n  // the lock. In this case, the test is robust.\n  EXPECT_DEATH_IF_SUPPORTED({\n    Mutex m;\n    { MutexLock lock(&m); }\n    m.AssertHeld();\n  },\n  \"thread .*hold\");\n}\n\nTEST(MutexTest, AssertHeldShouldNotAssertWhenLocked) {\n  Mutex m;\n  MutexLock lock(&m);\n  m.AssertHeld();\n}\n\nclass AtomicCounterWithMutex {\n public:\n  explicit AtomicCounterWithMutex(Mutex* mutex) :\n    value_(0), mutex_(mutex), random_(42) {}\n\n  void Increment() {\n    MutexLock lock(mutex_);\n    int temp = value_;\n    {\n      // We need to put up a memory barrier to prevent reads and writes to\n      // value_ rearranged with the call to SleepMilliseconds when observed\n      // from other threads.\n#if GTEST_HAS_PTHREAD\n      // On POSIX, locking a mutex puts up a memory barrier.  We cannot use\n      // Mutex and MutexLock here or rely on their memory barrier\n      // functionality as we are testing them here.\n      pthread_mutex_t memory_barrier_mutex;\n      GTEST_CHECK_POSIX_SUCCESS_(\n          pthread_mutex_init(&memory_barrier_mutex, NULL));\n      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&memory_barrier_mutex));\n\n      SleepMilliseconds(random_.Generate(30));\n\n      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&memory_barrier_mutex));\n      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&memory_barrier_mutex));\n#elif GTEST_OS_WINDOWS\n      // On Windows, performing an interlocked access puts up a memory barrier.\n      volatile LONG dummy = 0;\n      ::InterlockedIncrement(&dummy);\n      SleepMilliseconds(random_.Generate(30));\n      ::InterlockedIncrement(&dummy);\n#else\n# error \"Memory barrier not implemented on this platform.\"\n#endif  // GTEST_HAS_PTHREAD\n    }\n    value_ = temp + 1;\n  }\n  int value() const { return value_; }\n\n private:\n  volatile int value_;\n  Mutex* const mutex_;  // Protects value_.\n  Random       random_;\n};\n\nvoid CountingThreadFunc(pair<AtomicCounterWithMutex*, int> param) {\n  for (int i = 0; i < param.second; ++i)\n      param.first->Increment();\n}\n\n// Tests that the mutex only lets one thread at a time to lock it.\nTEST(MutexTest, OnlyOneThreadCanLockAtATime) {\n  Mutex mutex;\n  AtomicCounterWithMutex locked_counter(&mutex);\n\n  typedef ThreadWithParam<pair<AtomicCounterWithMutex*, int> > ThreadType;\n  const int kCycleCount = 20;\n  const int kThreadCount = 7;\n  scoped_ptr<ThreadType> counting_threads[kThreadCount];\n  Notification threads_can_start;\n  // Creates and runs kThreadCount threads that increment locked_counter\n  // kCycleCount times each.\n  for (int i = 0; i < kThreadCount; ++i) {\n    counting_threads[i].reset(new ThreadType(&CountingThreadFunc,\n                                             make_pair(&locked_counter,\n                                                       kCycleCount),\n                                             &threads_can_start));\n  }\n  threads_can_start.Notify();\n  for (int i = 0; i < kThreadCount; ++i)\n    counting_threads[i]->Join();\n\n  // If the mutex lets more than one thread to increment the counter at a\n  // time, they are likely to encounter a race condition and have some\n  // increments overwritten, resulting in the lower then expected counter\n  // value.\n  EXPECT_EQ(kCycleCount * kThreadCount, locked_counter.value());\n}\n\ntemplate <typename T>\nvoid RunFromThread(void (func)(T), T param) {\n  ThreadWithParam<T> thread(func, param, NULL);\n  thread.Join();\n}\n\nvoid RetrieveThreadLocalValue(\n    pair<ThreadLocal<std::string>*, std::string*> param) {\n  *param.second = param.first->get();\n}\n\nTEST(ThreadLocalTest, ParameterizedConstructorSetsDefault) {\n  ThreadLocal<std::string> thread_local_string(\"foo\");\n  EXPECT_STREQ(\"foo\", thread_local_string.get().c_str());\n\n  thread_local_string.set(\"bar\");\n  EXPECT_STREQ(\"bar\", thread_local_string.get().c_str());\n\n  std::string result;\n  RunFromThread(&RetrieveThreadLocalValue,\n                make_pair(&thread_local_string, &result));\n  EXPECT_STREQ(\"foo\", result.c_str());\n}\n\n// Keeps track of whether of destructors being called on instances of\n// DestructorTracker.  On Windows, waits for the destructor call reports.\nclass DestructorCall {\n public:\n  DestructorCall() {\n    invoked_ = false;\n#if GTEST_OS_WINDOWS\n    wait_event_.Reset(::CreateEvent(NULL, TRUE, FALSE, NULL));\n    GTEST_CHECK_(wait_event_.Get() != NULL);\n#endif\n  }\n\n  bool CheckDestroyed() const {\n#if GTEST_OS_WINDOWS\n    if (::WaitForSingleObject(wait_event_.Get(), 1000) != WAIT_OBJECT_0)\n      return false;\n#endif\n    return invoked_;\n  }\n\n  void ReportDestroyed() {\n    invoked_ = true;\n#if GTEST_OS_WINDOWS\n    ::SetEvent(wait_event_.Get());\n#endif\n  }\n\n  static std::vector<DestructorCall*>& List() { return *list_; }\n\n  static void ResetList() {\n    for (size_t i = 0; i < list_->size(); ++i) {\n      delete list_->at(i);\n    }\n    list_->clear();\n  }\n\n private:\n  bool invoked_;\n#if GTEST_OS_WINDOWS\n  AutoHandle wait_event_;\n#endif\n  static std::vector<DestructorCall*>* const list_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(DestructorCall);\n};\n\nstd::vector<DestructorCall*>* const DestructorCall::list_ =\n    new std::vector<DestructorCall*>;\n\n// DestructorTracker keeps track of whether its instances have been\n// destroyed.\nclass DestructorTracker {\n public:\n  DestructorTracker() : index_(GetNewIndex()) {}\n  DestructorTracker(const DestructorTracker& /* rhs */)\n      : index_(GetNewIndex()) {}\n  ~DestructorTracker() {\n    // We never access DestructorCall::List() concurrently, so we don't need\n    // to protect this access with a mutex.\n    DestructorCall::List()[index_]->ReportDestroyed();\n  }\n\n private:\n  static size_t GetNewIndex() {\n    DestructorCall::List().push_back(new DestructorCall);\n    return DestructorCall::List().size() - 1;\n  }\n  const size_t index_;\n\n  GTEST_DISALLOW_ASSIGN_(DestructorTracker);\n};\n\ntypedef ThreadLocal<DestructorTracker>* ThreadParam;\n\nvoid CallThreadLocalGet(ThreadParam thread_local_param) {\n  thread_local_param->get();\n}\n\n// Tests that when a ThreadLocal object dies in a thread, it destroys\n// the managed object for that thread.\nTEST(ThreadLocalTest, DestroysManagedObjectForOwnThreadWhenDying) {\n  DestructorCall::ResetList();\n\n  {\n    ThreadLocal<DestructorTracker> thread_local_tracker;\n    ASSERT_EQ(0U, DestructorCall::List().size());\n\n    // This creates another DestructorTracker object for the main thread.\n    thread_local_tracker.get();\n    ASSERT_EQ(1U, DestructorCall::List().size());\n    ASSERT_FALSE(DestructorCall::List()[0]->CheckDestroyed());\n  }\n\n  // Now thread_local_tracker has died.\n  ASSERT_EQ(1U, DestructorCall::List().size());\n  EXPECT_TRUE(DestructorCall::List()[0]->CheckDestroyed());\n\n  DestructorCall::ResetList();\n}\n\n// Tests that when a thread exits, the thread-local object for that\n// thread is destroyed.\nTEST(ThreadLocalTest, DestroysManagedObjectAtThreadExit) {\n  DestructorCall::ResetList();\n\n  {\n    ThreadLocal<DestructorTracker> thread_local_tracker;\n    ASSERT_EQ(0U, DestructorCall::List().size());\n\n    // This creates another DestructorTracker object in the new thread.\n    ThreadWithParam<ThreadParam> thread(\n        &CallThreadLocalGet, &thread_local_tracker, NULL);\n    thread.Join();\n\n    // The thread has exited, and we should have a DestroyedTracker\n    // instance created for it. But it may not have been destroyed yet.\n    ASSERT_EQ(1U, DestructorCall::List().size());\n  }\n\n  // The thread has exited and thread_local_tracker has died.\n  ASSERT_EQ(1U, DestructorCall::List().size());\n  EXPECT_TRUE(DestructorCall::List()[0]->CheckDestroyed());\n\n  DestructorCall::ResetList();\n}\n\nTEST(ThreadLocalTest, ThreadLocalMutationsAffectOnlyCurrentThread) {\n  ThreadLocal<std::string> thread_local_string;\n  thread_local_string.set(\"Foo\");\n  EXPECT_STREQ(\"Foo\", thread_local_string.get().c_str());\n\n  std::string result;\n  RunFromThread(&RetrieveThreadLocalValue,\n                make_pair(&thread_local_string, &result));\n  EXPECT_TRUE(result.empty());\n}\n\n#endif  // GTEST_IS_THREADSAFE\n\n#if GTEST_OS_WINDOWS\nTEST(WindowsTypesTest, HANDLEIsVoidStar) {\n  StaticAssertTypeEq<HANDLE, void*>();\n}\n\n#if GTEST_OS_WINDOWS_MINGW && !defined(__MINGW64_VERSION_MAJOR)\nTEST(WindowsTypesTest, _CRITICAL_SECTIONIs_CRITICAL_SECTION) {\n  StaticAssertTypeEq<CRITICAL_SECTION, _CRITICAL_SECTION>();\n}\n#else\nTEST(WindowsTypesTest, CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION) {\n  StaticAssertTypeEq<CRITICAL_SECTION, _RTL_CRITICAL_SECTION>();\n}\n#endif\n\n#endif  // GTEST_OS_WINDOWS\n\n}  // namespace internal\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-printers-test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Google Test - The Google C++ Testing and Mocking Framework\n//\n// This file tests the universal value printer.\n\n#include <ctype.h>\n#include <limits.h>\n#include <string.h>\n#include <algorithm>\n#include <deque>\n#include <list>\n#include <map>\n#include <set>\n#include <sstream>\n#include <string>\n#include <utility>\n#include <vector>\n\n#include \"gtest/gtest-printers.h\"\n#include \"gtest/gtest.h\"\n\n#if GTEST_HAS_UNORDERED_MAP_\n# include <unordered_map>  // NOLINT\n#endif  // GTEST_HAS_UNORDERED_MAP_\n\n#if GTEST_HAS_UNORDERED_SET_\n# include <unordered_set>  // NOLINT\n#endif  // GTEST_HAS_UNORDERED_SET_\n\n#if GTEST_HAS_STD_FORWARD_LIST_\n# include <forward_list> // NOLINT\n#endif  // GTEST_HAS_STD_FORWARD_LIST_\n\n// Some user-defined types for testing the universal value printer.\n\n// An anonymous enum type.\nenum AnonymousEnum {\n  kAE1 = -1,\n  kAE2 = 1\n};\n\n// An enum without a user-defined printer.\nenum EnumWithoutPrinter {\n  kEWP1 = -2,\n  kEWP2 = 42\n};\n\n// An enum with a << operator.\nenum EnumWithStreaming {\n  kEWS1 = 10\n};\n\nstd::ostream& operator<<(std::ostream& os, EnumWithStreaming e) {\n  return os << (e == kEWS1 ? \"kEWS1\" : \"invalid\");\n}\n\n// An enum with a PrintTo() function.\nenum EnumWithPrintTo {\n  kEWPT1 = 1\n};\n\nvoid PrintTo(EnumWithPrintTo e, std::ostream* os) {\n  *os << (e == kEWPT1 ? \"kEWPT1\" : \"invalid\");\n}\n\n// A class implicitly convertible to BiggestInt.\nclass BiggestIntConvertible {\n public:\n  operator ::testing::internal::BiggestInt() const { return 42; }\n};\n\n// A user-defined unprintable class template in the global namespace.\ntemplate <typename T>\nclass UnprintableTemplateInGlobal {\n public:\n  UnprintableTemplateInGlobal() : value_() {}\n private:\n  T value_;\n};\n\n// A user-defined streamable type in the global namespace.\nclass StreamableInGlobal {\n public:\n  virtual ~StreamableInGlobal() {}\n};\n\ninline void operator<<(::std::ostream& os, const StreamableInGlobal& /* x */) {\n  os << \"StreamableInGlobal\";\n}\n\nvoid operator<<(::std::ostream& os, const StreamableInGlobal* /* x */) {\n  os << \"StreamableInGlobal*\";\n}\n\nnamespace foo {\n\n// A user-defined unprintable type in a user namespace.\nclass UnprintableInFoo {\n public:\n  UnprintableInFoo() : z_(0) { memcpy(xy_, \"\\xEF\\x12\\x0\\x0\\x34\\xAB\\x0\\x0\", 8); }\n  double z() const { return z_; }\n private:\n  char xy_[8];\n  double z_;\n};\n\n// A user-defined printable type in a user-chosen namespace.\nstruct PrintableViaPrintTo {\n  PrintableViaPrintTo() : value() {}\n  int value;\n};\n\nvoid PrintTo(const PrintableViaPrintTo& x, ::std::ostream* os) {\n  *os << \"PrintableViaPrintTo: \" << x.value;\n}\n\n// A type with a user-defined << for printing its pointer.\nstruct PointerPrintable {\n};\n\n::std::ostream& operator<<(::std::ostream& os,\n                           const PointerPrintable* /* x */) {\n  return os << \"PointerPrintable*\";\n}\n\n// A user-defined printable class template in a user-chosen namespace.\ntemplate <typename T>\nclass PrintableViaPrintToTemplate {\n public:\n  explicit PrintableViaPrintToTemplate(const T& a_value) : value_(a_value) {}\n\n  const T& value() const { return value_; }\n private:\n  T value_;\n};\n\ntemplate <typename T>\nvoid PrintTo(const PrintableViaPrintToTemplate<T>& x, ::std::ostream* os) {\n  *os << \"PrintableViaPrintToTemplate: \" << x.value();\n}\n\n// A user-defined streamable class template in a user namespace.\ntemplate <typename T>\nclass StreamableTemplateInFoo {\n public:\n  StreamableTemplateInFoo() : value_() {}\n\n  const T& value() const { return value_; }\n private:\n  T value_;\n};\n\ntemplate <typename T>\ninline ::std::ostream& operator<<(::std::ostream& os,\n                                  const StreamableTemplateInFoo<T>& x) {\n  return os << \"StreamableTemplateInFoo: \" << x.value();\n}\n\n// A user-defined streamable but recursivly-defined container type in\n// a user namespace, it mimics therefore std::filesystem::path or\n// boost::filesystem::path.\nclass PathLike {\n public:\n  struct iterator {\n    typedef PathLike value_type;\n  };\n\n  PathLike() {}\n\n  iterator begin() const { return iterator(); }\n  iterator end() const { return iterator(); }\n\n  friend ::std::ostream& operator<<(::std::ostream& os, const PathLike&) {\n    return os << \"Streamable-PathLike\";\n  }\n};\n\n}  // namespace foo\n\nnamespace testing {\nnamespace gtest_printers_test {\n\nusing ::std::deque;\nusing ::std::list;\nusing ::std::make_pair;\nusing ::std::map;\nusing ::std::multimap;\nusing ::std::multiset;\nusing ::std::pair;\nusing ::std::set;\nusing ::std::vector;\nusing ::testing::PrintToString;\nusing ::testing::internal::FormatForComparisonFailureMessage;\nusing ::testing::internal::ImplicitCast_;\nusing ::testing::internal::NativeArray;\nusing ::testing::internal::RE;\nusing ::testing::internal::RelationToSourceReference;\nusing ::testing::internal::Strings;\nusing ::testing::internal::UniversalPrint;\nusing ::testing::internal::UniversalPrinter;\nusing ::testing::internal::UniversalTersePrint;\n#if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_\nusing ::testing::internal::UniversalTersePrintTupleFieldsToStrings;\n#endif\n\n// Prints a value to a string using the universal value printer.  This\n// is a helper for testing UniversalPrinter<T>::Print() for various types.\ntemplate <typename T>\nstd::string Print(const T& value) {\n  ::std::stringstream ss;\n  UniversalPrinter<T>::Print(value, &ss);\n  return ss.str();\n}\n\n// Prints a value passed by reference to a string, using the universal\n// value printer.  This is a helper for testing\n// UniversalPrinter<T&>::Print() for various types.\ntemplate <typename T>\nstd::string PrintByRef(const T& value) {\n  ::std::stringstream ss;\n  UniversalPrinter<T&>::Print(value, &ss);\n  return ss.str();\n}\n\n// Tests printing various enum types.\n\nTEST(PrintEnumTest, AnonymousEnum) {\n  EXPECT_EQ(\"-1\", Print(kAE1));\n  EXPECT_EQ(\"1\", Print(kAE2));\n}\n\nTEST(PrintEnumTest, EnumWithoutPrinter) {\n  EXPECT_EQ(\"-2\", Print(kEWP1));\n  EXPECT_EQ(\"42\", Print(kEWP2));\n}\n\nTEST(PrintEnumTest, EnumWithStreaming) {\n  EXPECT_EQ(\"kEWS1\", Print(kEWS1));\n  EXPECT_EQ(\"invalid\", Print(static_cast<EnumWithStreaming>(0)));\n}\n\nTEST(PrintEnumTest, EnumWithPrintTo) {\n  EXPECT_EQ(\"kEWPT1\", Print(kEWPT1));\n  EXPECT_EQ(\"invalid\", Print(static_cast<EnumWithPrintTo>(0)));\n}\n\n// Tests printing a class implicitly convertible to BiggestInt.\n\nTEST(PrintClassTest, BiggestIntConvertible) {\n  EXPECT_EQ(\"42\", Print(BiggestIntConvertible()));\n}\n\n// Tests printing various char types.\n\n// char.\nTEST(PrintCharTest, PlainChar) {\n  EXPECT_EQ(\"'\\\\0'\", Print('\\0'));\n  EXPECT_EQ(\"'\\\\'' (39, 0x27)\", Print('\\''));\n  EXPECT_EQ(\"'\\\"' (34, 0x22)\", Print('\"'));\n  EXPECT_EQ(\"'?' (63, 0x3F)\", Print('?'));\n  EXPECT_EQ(\"'\\\\\\\\' (92, 0x5C)\", Print('\\\\'));\n  EXPECT_EQ(\"'\\\\a' (7)\", Print('\\a'));\n  EXPECT_EQ(\"'\\\\b' (8)\", Print('\\b'));\n  EXPECT_EQ(\"'\\\\f' (12, 0xC)\", Print('\\f'));\n  EXPECT_EQ(\"'\\\\n' (10, 0xA)\", Print('\\n'));\n  EXPECT_EQ(\"'\\\\r' (13, 0xD)\", Print('\\r'));\n  EXPECT_EQ(\"'\\\\t' (9)\", Print('\\t'));\n  EXPECT_EQ(\"'\\\\v' (11, 0xB)\", Print('\\v'));\n  EXPECT_EQ(\"'\\\\x7F' (127)\", Print('\\x7F'));\n  EXPECT_EQ(\"'\\\\xFF' (255)\", Print('\\xFF'));\n  EXPECT_EQ(\"' ' (32, 0x20)\", Print(' '));\n  EXPECT_EQ(\"'a' (97, 0x61)\", Print('a'));\n}\n\n// signed char.\nTEST(PrintCharTest, SignedChar) {\n  EXPECT_EQ(\"'\\\\0'\", Print(static_cast<signed char>('\\0')));\n  EXPECT_EQ(\"'\\\\xCE' (-50)\",\n            Print(static_cast<signed char>(-50)));\n}\n\n// unsigned char.\nTEST(PrintCharTest, UnsignedChar) {\n  EXPECT_EQ(\"'\\\\0'\", Print(static_cast<unsigned char>('\\0')));\n  EXPECT_EQ(\"'b' (98, 0x62)\",\n            Print(static_cast<unsigned char>('b')));\n}\n\n// Tests printing other simple, built-in types.\n\n// bool.\nTEST(PrintBuiltInTypeTest, Bool) {\n  EXPECT_EQ(\"false\", Print(false));\n  EXPECT_EQ(\"true\", Print(true));\n}\n\n// wchar_t.\nTEST(PrintBuiltInTypeTest, Wchar_t) {\n  EXPECT_EQ(\"L'\\\\0'\", Print(L'\\0'));\n  EXPECT_EQ(\"L'\\\\'' (39, 0x27)\", Print(L'\\''));\n  EXPECT_EQ(\"L'\\\"' (34, 0x22)\", Print(L'\"'));\n  EXPECT_EQ(\"L'?' (63, 0x3F)\", Print(L'?'));\n  EXPECT_EQ(\"L'\\\\\\\\' (92, 0x5C)\", Print(L'\\\\'));\n  EXPECT_EQ(\"L'\\\\a' (7)\", Print(L'\\a'));\n  EXPECT_EQ(\"L'\\\\b' (8)\", Print(L'\\b'));\n  EXPECT_EQ(\"L'\\\\f' (12, 0xC)\", Print(L'\\f'));\n  EXPECT_EQ(\"L'\\\\n' (10, 0xA)\", Print(L'\\n'));\n  EXPECT_EQ(\"L'\\\\r' (13, 0xD)\", Print(L'\\r'));\n  EXPECT_EQ(\"L'\\\\t' (9)\", Print(L'\\t'));\n  EXPECT_EQ(\"L'\\\\v' (11, 0xB)\", Print(L'\\v'));\n  EXPECT_EQ(\"L'\\\\x7F' (127)\", Print(L'\\x7F'));\n  EXPECT_EQ(\"L'\\\\xFF' (255)\", Print(L'\\xFF'));\n  EXPECT_EQ(\"L' ' (32, 0x20)\", Print(L' '));\n  EXPECT_EQ(\"L'a' (97, 0x61)\", Print(L'a'));\n  EXPECT_EQ(\"L'\\\\x576' (1398)\", Print(static_cast<wchar_t>(0x576)));\n  EXPECT_EQ(\"L'\\\\xC74D' (51021)\", Print(static_cast<wchar_t>(0xC74D)));\n}\n\n// Test that Int64 provides more storage than wchar_t.\nTEST(PrintTypeSizeTest, Wchar_t) {\n  EXPECT_LT(sizeof(wchar_t), sizeof(testing::internal::Int64));\n}\n\n// Various integer types.\nTEST(PrintBuiltInTypeTest, Integer) {\n  EXPECT_EQ(\"'\\\\xFF' (255)\", Print(static_cast<unsigned char>(255)));  // uint8\n  EXPECT_EQ(\"'\\\\x80' (-128)\", Print(static_cast<signed char>(-128)));  // int8\n  EXPECT_EQ(\"65535\", Print(USHRT_MAX));  // uint16\n  EXPECT_EQ(\"-32768\", Print(SHRT_MIN));  // int16\n  EXPECT_EQ(\"4294967295\", Print(UINT_MAX));  // uint32\n  EXPECT_EQ(\"-2147483648\", Print(INT_MIN));  // int32\n  EXPECT_EQ(\"18446744073709551615\",\n            Print(static_cast<testing::internal::UInt64>(-1)));  // uint64\n  EXPECT_EQ(\"-9223372036854775808\",\n            Print(static_cast<testing::internal::Int64>(1) << 63));  // int64\n}\n\n// Size types.\nTEST(PrintBuiltInTypeTest, Size_t) {\n  EXPECT_EQ(\"1\", Print(sizeof('a')));  // size_t.\n#if !GTEST_OS_WINDOWS\n  // Windows has no ssize_t type.\n  EXPECT_EQ(\"-2\", Print(static_cast<ssize_t>(-2)));  // ssize_t.\n#endif  // !GTEST_OS_WINDOWS\n}\n\n// Floating-points.\nTEST(PrintBuiltInTypeTest, FloatingPoints) {\n  EXPECT_EQ(\"1.5\", Print(1.5f));   // float\n  EXPECT_EQ(\"-2.5\", Print(-2.5));  // double\n}\n\n// Since ::std::stringstream::operator<<(const void *) formats the pointer\n// output differently with different compilers, we have to create the expected\n// output first and use it as our expectation.\nstatic std::string PrintPointer(const void* p) {\n  ::std::stringstream expected_result_stream;\n  expected_result_stream << p;\n  return expected_result_stream.str();\n}\n\n// Tests printing C strings.\n\n// const char*.\nTEST(PrintCStringTest, Const) {\n  const char* p = \"World\";\n  EXPECT_EQ(PrintPointer(p) + \" pointing to \\\"World\\\"\", Print(p));\n}\n\n// char*.\nTEST(PrintCStringTest, NonConst) {\n  char p[] = \"Hi\";\n  EXPECT_EQ(PrintPointer(p) + \" pointing to \\\"Hi\\\"\",\n            Print(static_cast<char*>(p)));\n}\n\n// NULL C string.\nTEST(PrintCStringTest, Null) {\n  const char* p = NULL;\n  EXPECT_EQ(\"NULL\", Print(p));\n}\n\n// Tests that C strings are escaped properly.\nTEST(PrintCStringTest, EscapesProperly) {\n  const char* p = \"'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\\x7F\\xFF a\";\n  EXPECT_EQ(PrintPointer(p) + \" pointing to \\\"'\\\\\\\"?\\\\\\\\\\\\a\\\\b\\\\f\"\n            \"\\\\n\\\\r\\\\t\\\\v\\\\x7F\\\\xFF a\\\"\",\n            Print(p));\n}\n\n// MSVC compiler can be configured to define whar_t as a typedef\n// of unsigned short. Defining an overload for const wchar_t* in that case\n// would cause pointers to unsigned shorts be printed as wide strings,\n// possibly accessing more memory than intended and causing invalid\n// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when\n// wchar_t is implemented as a native type.\n#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)\n\n// const wchar_t*.\nTEST(PrintWideCStringTest, Const) {\n  const wchar_t* p = L\"World\";\n  EXPECT_EQ(PrintPointer(p) + \" pointing to L\\\"World\\\"\", Print(p));\n}\n\n// wchar_t*.\nTEST(PrintWideCStringTest, NonConst) {\n  wchar_t p[] = L\"Hi\";\n  EXPECT_EQ(PrintPointer(p) + \" pointing to L\\\"Hi\\\"\",\n            Print(static_cast<wchar_t*>(p)));\n}\n\n// NULL wide C string.\nTEST(PrintWideCStringTest, Null) {\n  const wchar_t* p = NULL;\n  EXPECT_EQ(\"NULL\", Print(p));\n}\n\n// Tests that wide C strings are escaped properly.\nTEST(PrintWideCStringTest, EscapesProperly) {\n  const wchar_t s[] = {'\\'', '\"', '?', '\\\\', '\\a', '\\b', '\\f', '\\n', '\\r',\n                       '\\t', '\\v', 0xD3, 0x576, 0x8D3, 0xC74D, ' ', 'a', '\\0'};\n  EXPECT_EQ(PrintPointer(s) + \" pointing to L\\\"'\\\\\\\"?\\\\\\\\\\\\a\\\\b\\\\f\"\n            \"\\\\n\\\\r\\\\t\\\\v\\\\xD3\\\\x576\\\\x8D3\\\\xC74D a\\\"\",\n            Print(static_cast<const wchar_t*>(s)));\n}\n#endif  // native wchar_t\n\n// Tests printing pointers to other char types.\n\n// signed char*.\nTEST(PrintCharPointerTest, SignedChar) {\n  signed char* p = reinterpret_cast<signed char*>(0x1234);\n  EXPECT_EQ(PrintPointer(p), Print(p));\n  p = NULL;\n  EXPECT_EQ(\"NULL\", Print(p));\n}\n\n// const signed char*.\nTEST(PrintCharPointerTest, ConstSignedChar) {\n  signed char* p = reinterpret_cast<signed char*>(0x1234);\n  EXPECT_EQ(PrintPointer(p), Print(p));\n  p = NULL;\n  EXPECT_EQ(\"NULL\", Print(p));\n}\n\n// unsigned char*.\nTEST(PrintCharPointerTest, UnsignedChar) {\n  unsigned char* p = reinterpret_cast<unsigned char*>(0x1234);\n  EXPECT_EQ(PrintPointer(p), Print(p));\n  p = NULL;\n  EXPECT_EQ(\"NULL\", Print(p));\n}\n\n// const unsigned char*.\nTEST(PrintCharPointerTest, ConstUnsignedChar) {\n  const unsigned char* p = reinterpret_cast<const unsigned char*>(0x1234);\n  EXPECT_EQ(PrintPointer(p), Print(p));\n  p = NULL;\n  EXPECT_EQ(\"NULL\", Print(p));\n}\n\n// Tests printing pointers to simple, built-in types.\n\n// bool*.\nTEST(PrintPointerToBuiltInTypeTest, Bool) {\n  bool* p = reinterpret_cast<bool*>(0xABCD);\n  EXPECT_EQ(PrintPointer(p), Print(p));\n  p = NULL;\n  EXPECT_EQ(\"NULL\", Print(p));\n}\n\n// void*.\nTEST(PrintPointerToBuiltInTypeTest, Void) {\n  void* p = reinterpret_cast<void*>(0xABCD);\n  EXPECT_EQ(PrintPointer(p), Print(p));\n  p = NULL;\n  EXPECT_EQ(\"NULL\", Print(p));\n}\n\n// const void*.\nTEST(PrintPointerToBuiltInTypeTest, ConstVoid) {\n  const void* p = reinterpret_cast<const void*>(0xABCD);\n  EXPECT_EQ(PrintPointer(p), Print(p));\n  p = NULL;\n  EXPECT_EQ(\"NULL\", Print(p));\n}\n\n// Tests printing pointers to pointers.\nTEST(PrintPointerToPointerTest, IntPointerPointer) {\n  int** p = reinterpret_cast<int**>(0xABCD);\n  EXPECT_EQ(PrintPointer(p), Print(p));\n  p = NULL;\n  EXPECT_EQ(\"NULL\", Print(p));\n}\n\n// Tests printing (non-member) function pointers.\n\nvoid MyFunction(int /* n */) {}\n\nTEST(PrintPointerTest, NonMemberFunctionPointer) {\n  // We cannot directly cast &MyFunction to const void* because the\n  // standard disallows casting between pointers to functions and\n  // pointers to objects, and some compilers (e.g. GCC 3.4) enforce\n  // this limitation.\n  EXPECT_EQ(\n      PrintPointer(reinterpret_cast<const void*>(\n          reinterpret_cast<internal::BiggestInt>(&MyFunction))),\n      Print(&MyFunction));\n  int (*p)(bool) = NULL;  // NOLINT\n  EXPECT_EQ(\"NULL\", Print(p));\n}\n\n// An assertion predicate determining whether a one string is a prefix for\n// another.\ntemplate <typename StringType>\nAssertionResult HasPrefix(const StringType& str, const StringType& prefix) {\n  if (str.find(prefix, 0) == 0)\n    return AssertionSuccess();\n\n  const bool is_wide_string = sizeof(prefix[0]) > 1;\n  const char* const begin_string_quote = is_wide_string ? \"L\\\"\" : \"\\\"\";\n  return AssertionFailure()\n      << begin_string_quote << prefix << \"\\\" is not a prefix of \"\n      << begin_string_quote << str << \"\\\"\\n\";\n}\n\n// Tests printing member variable pointers.  Although they are called\n// pointers, they don't point to a location in the address space.\n// Their representation is implementation-defined.  Thus they will be\n// printed as raw bytes.\n\nstruct Foo {\n public:\n  virtual ~Foo() {}\n  int MyMethod(char x) { return x + 1; }\n  virtual char MyVirtualMethod(int /* n */) { return 'a'; }\n\n  int value;\n};\n\nTEST(PrintPointerTest, MemberVariablePointer) {\n  EXPECT_TRUE(HasPrefix(Print(&Foo::value),\n                        Print(sizeof(&Foo::value)) + \"-byte object \"));\n  int Foo::*p = NULL;  // NOLINT\n  EXPECT_TRUE(HasPrefix(Print(p),\n                        Print(sizeof(p)) + \"-byte object \"));\n}\n\n// Tests printing member function pointers.  Although they are called\n// pointers, they don't point to a location in the address space.\n// Their representation is implementation-defined.  Thus they will be\n// printed as raw bytes.\nTEST(PrintPointerTest, MemberFunctionPointer) {\n  EXPECT_TRUE(HasPrefix(Print(&Foo::MyMethod),\n                        Print(sizeof(&Foo::MyMethod)) + \"-byte object \"));\n  EXPECT_TRUE(\n      HasPrefix(Print(&Foo::MyVirtualMethod),\n                Print(sizeof((&Foo::MyVirtualMethod))) + \"-byte object \"));\n  int (Foo::*p)(char) = NULL;  // NOLINT\n  EXPECT_TRUE(HasPrefix(Print(p),\n                        Print(sizeof(p)) + \"-byte object \"));\n}\n\n// Tests printing C arrays.\n\n// The difference between this and Print() is that it ensures that the\n// argument is a reference to an array.\ntemplate <typename T, size_t N>\nstd::string PrintArrayHelper(T (&a)[N]) {\n  return Print(a);\n}\n\n// One-dimensional array.\nTEST(PrintArrayTest, OneDimensionalArray) {\n  int a[5] = { 1, 2, 3, 4, 5 };\n  EXPECT_EQ(\"{ 1, 2, 3, 4, 5 }\", PrintArrayHelper(a));\n}\n\n// Two-dimensional array.\nTEST(PrintArrayTest, TwoDimensionalArray) {\n  int a[2][5] = {\n    { 1, 2, 3, 4, 5 },\n    { 6, 7, 8, 9, 0 }\n  };\n  EXPECT_EQ(\"{ { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 0 } }\", PrintArrayHelper(a));\n}\n\n// Array of const elements.\nTEST(PrintArrayTest, ConstArray) {\n  const bool a[1] = { false };\n  EXPECT_EQ(\"{ false }\", PrintArrayHelper(a));\n}\n\n// char array without terminating NUL.\nTEST(PrintArrayTest, CharArrayWithNoTerminatingNul) {\n  // Array a contains '\\0' in the middle and doesn't end with '\\0'.\n  char a[] = { 'H', '\\0', 'i' };\n  EXPECT_EQ(\"\\\"H\\\\0i\\\" (no terminating NUL)\", PrintArrayHelper(a));\n}\n\n// const char array with terminating NUL.\nTEST(PrintArrayTest, ConstCharArrayWithTerminatingNul) {\n  const char a[] = \"\\0Hi\";\n  EXPECT_EQ(\"\\\"\\\\0Hi\\\"\", PrintArrayHelper(a));\n}\n\n// const wchar_t array without terminating NUL.\nTEST(PrintArrayTest, WCharArrayWithNoTerminatingNul) {\n  // Array a contains '\\0' in the middle and doesn't end with '\\0'.\n  const wchar_t a[] = { L'H', L'\\0', L'i' };\n  EXPECT_EQ(\"L\\\"H\\\\0i\\\" (no terminating NUL)\", PrintArrayHelper(a));\n}\n\n// wchar_t array with terminating NUL.\nTEST(PrintArrayTest, WConstCharArrayWithTerminatingNul) {\n  const wchar_t a[] = L\"\\0Hi\";\n  EXPECT_EQ(\"L\\\"\\\\0Hi\\\"\", PrintArrayHelper(a));\n}\n\n// Array of objects.\nTEST(PrintArrayTest, ObjectArray) {\n  std::string a[3] = {\"Hi\", \"Hello\", \"Ni hao\"};\n  EXPECT_EQ(\"{ \\\"Hi\\\", \\\"Hello\\\", \\\"Ni hao\\\" }\", PrintArrayHelper(a));\n}\n\n// Array with many elements.\nTEST(PrintArrayTest, BigArray) {\n  int a[100] = { 1, 2, 3 };\n  EXPECT_EQ(\"{ 1, 2, 3, 0, 0, 0, 0, 0, ..., 0, 0, 0, 0, 0, 0, 0, 0 }\",\n            PrintArrayHelper(a));\n}\n\n// Tests printing ::string and ::std::string.\n\n#if GTEST_HAS_GLOBAL_STRING\n// ::string.\nTEST(PrintStringTest, StringInGlobalNamespace) {\n  const char s[] = \"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\x7F\\xFF a\";\n  const ::string str(s, sizeof(s));\n  EXPECT_EQ(\"\\\"'\\\\\\\"?\\\\\\\\\\\\a\\\\b\\\\f\\\\n\\\\0\\\\r\\\\t\\\\v\\\\x7F\\\\xFF a\\\\0\\\"\",\n            Print(str));\n}\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n// ::std::string.\nTEST(PrintStringTest, StringInStdNamespace) {\n  const char s[] = \"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\x7F\\xFF a\";\n  const ::std::string str(s, sizeof(s));\n  EXPECT_EQ(\"\\\"'\\\\\\\"?\\\\\\\\\\\\a\\\\b\\\\f\\\\n\\\\0\\\\r\\\\t\\\\v\\\\x7F\\\\xFF a\\\\0\\\"\",\n            Print(str));\n}\n\nTEST(PrintStringTest, StringAmbiguousHex) {\n  // \"\\x6BANANA\" is ambiguous, it can be interpreted as starting with either of:\n  // '\\x6', '\\x6B', or '\\x6BA'.\n\n  // a hex escaping sequence following by a decimal digit\n  EXPECT_EQ(\"\\\"0\\\\x12\\\" \\\"3\\\"\", Print(::std::string(\"0\\x12\" \"3\")));\n  // a hex escaping sequence following by a hex digit (lower-case)\n  EXPECT_EQ(\"\\\"mm\\\\x6\\\" \\\"bananas\\\"\", Print(::std::string(\"mm\\x6\" \"bananas\")));\n  // a hex escaping sequence following by a hex digit (upper-case)\n  EXPECT_EQ(\"\\\"NOM\\\\x6\\\" \\\"BANANA\\\"\", Print(::std::string(\"NOM\\x6\" \"BANANA\")));\n  // a hex escaping sequence following by a non-xdigit\n  EXPECT_EQ(\"\\\"!\\\\x5-!\\\"\", Print(::std::string(\"!\\x5-!\")));\n}\n\n// Tests printing ::wstring and ::std::wstring.\n\n#if GTEST_HAS_GLOBAL_WSTRING\n// ::wstring.\nTEST(PrintWideStringTest, StringInGlobalNamespace) {\n  const wchar_t s[] = L\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\xD3\\x576\\x8D3\\xC74D a\";\n  const ::wstring str(s, sizeof(s)/sizeof(wchar_t));\n  EXPECT_EQ(\"L\\\"'\\\\\\\"?\\\\\\\\\\\\a\\\\b\\\\f\\\\n\\\\0\\\\r\\\\t\\\\v\"\n            \"\\\\xD3\\\\x576\\\\x8D3\\\\xC74D a\\\\0\\\"\",\n            Print(str));\n}\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n#if GTEST_HAS_STD_WSTRING\n// ::std::wstring.\nTEST(PrintWideStringTest, StringInStdNamespace) {\n  const wchar_t s[] = L\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\xD3\\x576\\x8D3\\xC74D a\";\n  const ::std::wstring str(s, sizeof(s)/sizeof(wchar_t));\n  EXPECT_EQ(\"L\\\"'\\\\\\\"?\\\\\\\\\\\\a\\\\b\\\\f\\\\n\\\\0\\\\r\\\\t\\\\v\"\n            \"\\\\xD3\\\\x576\\\\x8D3\\\\xC74D a\\\\0\\\"\",\n            Print(str));\n}\n\nTEST(PrintWideStringTest, StringAmbiguousHex) {\n  // same for wide strings.\n  EXPECT_EQ(\"L\\\"0\\\\x12\\\" L\\\"3\\\"\", Print(::std::wstring(L\"0\\x12\" L\"3\")));\n  EXPECT_EQ(\"L\\\"mm\\\\x6\\\" L\\\"bananas\\\"\",\n            Print(::std::wstring(L\"mm\\x6\" L\"bananas\")));\n  EXPECT_EQ(\"L\\\"NOM\\\\x6\\\" L\\\"BANANA\\\"\",\n            Print(::std::wstring(L\"NOM\\x6\" L\"BANANA\")));\n  EXPECT_EQ(\"L\\\"!\\\\x5-!\\\"\", Print(::std::wstring(L\"!\\x5-!\")));\n}\n#endif  // GTEST_HAS_STD_WSTRING\n\n// Tests printing types that support generic streaming (i.e. streaming\n// to std::basic_ostream<Char, CharTraits> for any valid Char and\n// CharTraits types).\n\n// Tests printing a non-template type that supports generic streaming.\n\nclass AllowsGenericStreaming {};\n\ntemplate <typename Char, typename CharTraits>\nstd::basic_ostream<Char, CharTraits>& operator<<(\n    std::basic_ostream<Char, CharTraits>& os,\n    const AllowsGenericStreaming& /* a */) {\n  return os << \"AllowsGenericStreaming\";\n}\n\nTEST(PrintTypeWithGenericStreamingTest, NonTemplateType) {\n  AllowsGenericStreaming a;\n  EXPECT_EQ(\"AllowsGenericStreaming\", Print(a));\n}\n\n// Tests printing a template type that supports generic streaming.\n\ntemplate <typename T>\nclass AllowsGenericStreamingTemplate {};\n\ntemplate <typename Char, typename CharTraits, typename T>\nstd::basic_ostream<Char, CharTraits>& operator<<(\n    std::basic_ostream<Char, CharTraits>& os,\n    const AllowsGenericStreamingTemplate<T>& /* a */) {\n  return os << \"AllowsGenericStreamingTemplate\";\n}\n\nTEST(PrintTypeWithGenericStreamingTest, TemplateType) {\n  AllowsGenericStreamingTemplate<int> a;\n  EXPECT_EQ(\"AllowsGenericStreamingTemplate\", Print(a));\n}\n\n// Tests printing a type that supports generic streaming and can be\n// implicitly converted to another printable type.\n\ntemplate <typename T>\nclass AllowsGenericStreamingAndImplicitConversionTemplate {\n public:\n  operator bool() const { return false; }\n};\n\ntemplate <typename Char, typename CharTraits, typename T>\nstd::basic_ostream<Char, CharTraits>& operator<<(\n    std::basic_ostream<Char, CharTraits>& os,\n    const AllowsGenericStreamingAndImplicitConversionTemplate<T>& /* a */) {\n  return os << \"AllowsGenericStreamingAndImplicitConversionTemplate\";\n}\n\nTEST(PrintTypeWithGenericStreamingTest, TypeImplicitlyConvertible) {\n  AllowsGenericStreamingAndImplicitConversionTemplate<int> a;\n  EXPECT_EQ(\"AllowsGenericStreamingAndImplicitConversionTemplate\", Print(a));\n}\n\n#if GTEST_HAS_ABSL\n\n// Tests printing ::absl::string_view.\n\nTEST(PrintStringViewTest, SimpleStringView) {\n  const ::absl::string_view sp = \"Hello\";\n  EXPECT_EQ(\"\\\"Hello\\\"\", Print(sp));\n}\n\nTEST(PrintStringViewTest, UnprintableCharacters) {\n  const char str[] = \"NUL (\\0) and \\r\\t\";\n  const ::absl::string_view sp(str, sizeof(str) - 1);\n  EXPECT_EQ(\"\\\"NUL (\\\\0) and \\\\r\\\\t\\\"\", Print(sp));\n}\n\n#endif  // GTEST_HAS_ABSL\n\n// Tests printing STL containers.\n\nTEST(PrintStlContainerTest, EmptyDeque) {\n  deque<char> empty;\n  EXPECT_EQ(\"{}\", Print(empty));\n}\n\nTEST(PrintStlContainerTest, NonEmptyDeque) {\n  deque<int> non_empty;\n  non_empty.push_back(1);\n  non_empty.push_back(3);\n  EXPECT_EQ(\"{ 1, 3 }\", Print(non_empty));\n}\n\n#if GTEST_HAS_UNORDERED_MAP_\n\nTEST(PrintStlContainerTest, OneElementHashMap) {\n  ::std::unordered_map<int, char> map1;\n  map1[1] = 'a';\n  EXPECT_EQ(\"{ (1, 'a' (97, 0x61)) }\", Print(map1));\n}\n\nTEST(PrintStlContainerTest, HashMultiMap) {\n  ::std::unordered_multimap<int, bool> map1;\n  map1.insert(make_pair(5, true));\n  map1.insert(make_pair(5, false));\n\n  // Elements of hash_multimap can be printed in any order.\n  const std::string result = Print(map1);\n  EXPECT_TRUE(result == \"{ (5, true), (5, false) }\" ||\n              result == \"{ (5, false), (5, true) }\")\n                  << \" where Print(map1) returns \\\"\" << result << \"\\\".\";\n}\n\n#endif  // GTEST_HAS_UNORDERED_MAP_\n\n#if GTEST_HAS_UNORDERED_SET_\n\nTEST(PrintStlContainerTest, HashSet) {\n  ::std::unordered_set<int> set1;\n  set1.insert(1);\n  EXPECT_EQ(\"{ 1 }\", Print(set1));\n}\n\nTEST(PrintStlContainerTest, HashMultiSet) {\n  const int kSize = 5;\n  int a[kSize] = { 1, 1, 2, 5, 1 };\n  ::std::unordered_multiset<int> set1(a, a + kSize);\n\n  // Elements of hash_multiset can be printed in any order.\n  const std::string result = Print(set1);\n  const std::string expected_pattern = \"{ d, d, d, d, d }\";  // d means a digit.\n\n  // Verifies the result matches the expected pattern; also extracts\n  // the numbers in the result.\n  ASSERT_EQ(expected_pattern.length(), result.length());\n  std::vector<int> numbers;\n  for (size_t i = 0; i != result.length(); i++) {\n    if (expected_pattern[i] == 'd') {\n      ASSERT_NE(isdigit(static_cast<unsigned char>(result[i])), 0);\n      numbers.push_back(result[i] - '0');\n    } else {\n      EXPECT_EQ(expected_pattern[i], result[i]) << \" where result is \"\n                                                << result;\n    }\n  }\n\n  // Makes sure the result contains the right numbers.\n  std::sort(numbers.begin(), numbers.end());\n  std::sort(a, a + kSize);\n  EXPECT_TRUE(std::equal(a, a + kSize, numbers.begin()));\n}\n\n#endif  //  GTEST_HAS_UNORDERED_SET_\n\nTEST(PrintStlContainerTest, List) {\n  const std::string a[] = {\"hello\", \"world\"};\n  const list<std::string> strings(a, a + 2);\n  EXPECT_EQ(\"{ \\\"hello\\\", \\\"world\\\" }\", Print(strings));\n}\n\nTEST(PrintStlContainerTest, Map) {\n  map<int, bool> map1;\n  map1[1] = true;\n  map1[5] = false;\n  map1[3] = true;\n  EXPECT_EQ(\"{ (1, true), (3, true), (5, false) }\", Print(map1));\n}\n\nTEST(PrintStlContainerTest, MultiMap) {\n  multimap<bool, int> map1;\n  // The make_pair template function would deduce the type as\n  // pair<bool, int> here, and since the key part in a multimap has to\n  // be constant, without a templated ctor in the pair class (as in\n  // libCstd on Solaris), make_pair call would fail to compile as no\n  // implicit conversion is found.  Thus explicit typename is used\n  // here instead.\n  map1.insert(pair<const bool, int>(true, 0));\n  map1.insert(pair<const bool, int>(true, 1));\n  map1.insert(pair<const bool, int>(false, 2));\n  EXPECT_EQ(\"{ (false, 2), (true, 0), (true, 1) }\", Print(map1));\n}\n\nTEST(PrintStlContainerTest, Set) {\n  const unsigned int a[] = { 3, 0, 5 };\n  set<unsigned int> set1(a, a + 3);\n  EXPECT_EQ(\"{ 0, 3, 5 }\", Print(set1));\n}\n\nTEST(PrintStlContainerTest, MultiSet) {\n  const int a[] = { 1, 1, 2, 5, 1 };\n  multiset<int> set1(a, a + 5);\n  EXPECT_EQ(\"{ 1, 1, 1, 2, 5 }\", Print(set1));\n}\n\n#if GTEST_HAS_STD_FORWARD_LIST_\n\nTEST(PrintStlContainerTest, SinglyLinkedList) {\n  int a[] = { 9, 2, 8 };\n  const std::forward_list<int> ints(a, a + 3);\n  EXPECT_EQ(\"{ 9, 2, 8 }\", Print(ints));\n}\n#endif  // GTEST_HAS_STD_FORWARD_LIST_\n\nTEST(PrintStlContainerTest, Pair) {\n  pair<const bool, int> p(true, 5);\n  EXPECT_EQ(\"(true, 5)\", Print(p));\n}\n\nTEST(PrintStlContainerTest, Vector) {\n  vector<int> v;\n  v.push_back(1);\n  v.push_back(2);\n  EXPECT_EQ(\"{ 1, 2 }\", Print(v));\n}\n\nTEST(PrintStlContainerTest, LongSequence) {\n  const int a[100] = { 1, 2, 3 };\n  const vector<int> v(a, a + 100);\n  EXPECT_EQ(\"{ 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \"\n            \"0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ... }\", Print(v));\n}\n\nTEST(PrintStlContainerTest, NestedContainer) {\n  const int a1[] = { 1, 2 };\n  const int a2[] = { 3, 4, 5 };\n  const list<int> l1(a1, a1 + 2);\n  const list<int> l2(a2, a2 + 3);\n\n  vector<list<int> > v;\n  v.push_back(l1);\n  v.push_back(l2);\n  EXPECT_EQ(\"{ { 1, 2 }, { 3, 4, 5 } }\", Print(v));\n}\n\nTEST(PrintStlContainerTest, OneDimensionalNativeArray) {\n  const int a[3] = { 1, 2, 3 };\n  NativeArray<int> b(a, 3, RelationToSourceReference());\n  EXPECT_EQ(\"{ 1, 2, 3 }\", Print(b));\n}\n\nTEST(PrintStlContainerTest, TwoDimensionalNativeArray) {\n  const int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };\n  NativeArray<int[3]> b(a, 2, RelationToSourceReference());\n  EXPECT_EQ(\"{ { 1, 2, 3 }, { 4, 5, 6 } }\", Print(b));\n}\n\n// Tests that a class named iterator isn't treated as a container.\n\nstruct iterator {\n  char x;\n};\n\nTEST(PrintStlContainerTest, Iterator) {\n  iterator it = {};\n  EXPECT_EQ(\"1-byte object <00>\", Print(it));\n}\n\n// Tests that a class named const_iterator isn't treated as a container.\n\nstruct const_iterator {\n  char x;\n};\n\nTEST(PrintStlContainerTest, ConstIterator) {\n  const_iterator it = {};\n  EXPECT_EQ(\"1-byte object <00>\", Print(it));\n}\n\n#if GTEST_HAS_TR1_TUPLE\n// Tests printing ::std::tr1::tuples.\n\n// Tuples of various arities.\nTEST(PrintTr1TupleTest, VariousSizes) {\n  ::std::tr1::tuple<> t0;\n  EXPECT_EQ(\"()\", Print(t0));\n\n  ::std::tr1::tuple<int> t1(5);\n  EXPECT_EQ(\"(5)\", Print(t1));\n\n  ::std::tr1::tuple<char, bool> t2('a', true);\n  EXPECT_EQ(\"('a' (97, 0x61), true)\", Print(t2));\n\n  ::std::tr1::tuple<bool, int, int> t3(false, 2, 3);\n  EXPECT_EQ(\"(false, 2, 3)\", Print(t3));\n\n  ::std::tr1::tuple<bool, int, int, int> t4(false, 2, 3, 4);\n  EXPECT_EQ(\"(false, 2, 3, 4)\", Print(t4));\n\n  ::std::tr1::tuple<bool, int, int, int, bool> t5(false, 2, 3, 4, true);\n  EXPECT_EQ(\"(false, 2, 3, 4, true)\", Print(t5));\n\n  ::std::tr1::tuple<bool, int, int, int, bool, int> t6(false, 2, 3, 4, true, 6);\n  EXPECT_EQ(\"(false, 2, 3, 4, true, 6)\", Print(t6));\n\n  ::std::tr1::tuple<bool, int, int, int, bool, int, int> t7(\n      false, 2, 3, 4, true, 6, 7);\n  EXPECT_EQ(\"(false, 2, 3, 4, true, 6, 7)\", Print(t7));\n\n  ::std::tr1::tuple<bool, int, int, int, bool, int, int, bool> t8(\n      false, 2, 3, 4, true, 6, 7, true);\n  EXPECT_EQ(\"(false, 2, 3, 4, true, 6, 7, true)\", Print(t8));\n\n  ::std::tr1::tuple<bool, int, int, int, bool, int, int, bool, int> t9(\n      false, 2, 3, 4, true, 6, 7, true, 9);\n  EXPECT_EQ(\"(false, 2, 3, 4, true, 6, 7, true, 9)\", Print(t9));\n\n  const char* const str = \"8\";\n  // VC++ 2010's implementation of tuple of C++0x is deficient, requiring\n  // an explicit type cast of NULL to be used.\n  ::std::tr1::tuple<bool, char, short, testing::internal::Int32,  // NOLINT\n                    testing::internal::Int64, float, double, const char*, void*,\n                    std::string>\n      t10(false, 'a', static_cast<short>(3), 4, 5, 1.5F, -2.5, str,  // NOLINT\n          ImplicitCast_<void*>(NULL), \"10\");\n  EXPECT_EQ(\"(false, 'a' (97, 0x61), 3, 4, 5, 1.5, -2.5, \" + PrintPointer(str) +\n            \" pointing to \\\"8\\\", NULL, \\\"10\\\")\",\n            Print(t10));\n}\n\n// Nested tuples.\nTEST(PrintTr1TupleTest, NestedTuple) {\n  ::std::tr1::tuple< ::std::tr1::tuple<int, bool>, char> nested(\n      ::std::tr1::make_tuple(5, true), 'a');\n  EXPECT_EQ(\"((5, true), 'a' (97, 0x61))\", Print(nested));\n}\n\n#endif  // GTEST_HAS_TR1_TUPLE\n\n#if GTEST_HAS_STD_TUPLE_\n// Tests printing ::std::tuples.\n\n// Tuples of various arities.\nTEST(PrintStdTupleTest, VariousSizes) {\n  ::std::tuple<> t0;\n  EXPECT_EQ(\"()\", Print(t0));\n\n  ::std::tuple<int> t1(5);\n  EXPECT_EQ(\"(5)\", Print(t1));\n\n  ::std::tuple<char, bool> t2('a', true);\n  EXPECT_EQ(\"('a' (97, 0x61), true)\", Print(t2));\n\n  ::std::tuple<bool, int, int> t3(false, 2, 3);\n  EXPECT_EQ(\"(false, 2, 3)\", Print(t3));\n\n  ::std::tuple<bool, int, int, int> t4(false, 2, 3, 4);\n  EXPECT_EQ(\"(false, 2, 3, 4)\", Print(t4));\n\n  ::std::tuple<bool, int, int, int, bool> t5(false, 2, 3, 4, true);\n  EXPECT_EQ(\"(false, 2, 3, 4, true)\", Print(t5));\n\n  ::std::tuple<bool, int, int, int, bool, int> t6(false, 2, 3, 4, true, 6);\n  EXPECT_EQ(\"(false, 2, 3, 4, true, 6)\", Print(t6));\n\n  ::std::tuple<bool, int, int, int, bool, int, int> t7(\n      false, 2, 3, 4, true, 6, 7);\n  EXPECT_EQ(\"(false, 2, 3, 4, true, 6, 7)\", Print(t7));\n\n  ::std::tuple<bool, int, int, int, bool, int, int, bool> t8(\n      false, 2, 3, 4, true, 6, 7, true);\n  EXPECT_EQ(\"(false, 2, 3, 4, true, 6, 7, true)\", Print(t8));\n\n  ::std::tuple<bool, int, int, int, bool, int, int, bool, int> t9(\n      false, 2, 3, 4, true, 6, 7, true, 9);\n  EXPECT_EQ(\"(false, 2, 3, 4, true, 6, 7, true, 9)\", Print(t9));\n\n  const char* const str = \"8\";\n  // VC++ 2010's implementation of tuple of C++0x is deficient, requiring\n  // an explicit type cast of NULL to be used.\n  ::std::tuple<bool, char, short, testing::internal::Int32,  // NOLINT\n               testing::internal::Int64, float, double, const char*, void*,\n               std::string>\n      t10(false, 'a', static_cast<short>(3), 4, 5, 1.5F, -2.5, str,  // NOLINT\n          ImplicitCast_<void*>(NULL), \"10\");\n  EXPECT_EQ(\"(false, 'a' (97, 0x61), 3, 4, 5, 1.5, -2.5, \" + PrintPointer(str) +\n            \" pointing to \\\"8\\\", NULL, \\\"10\\\")\",\n            Print(t10));\n}\n\n// Nested tuples.\nTEST(PrintStdTupleTest, NestedTuple) {\n  ::std::tuple< ::std::tuple<int, bool>, char> nested(\n      ::std::make_tuple(5, true), 'a');\n  EXPECT_EQ(\"((5, true), 'a' (97, 0x61))\", Print(nested));\n}\n\n#endif  // GTEST_LANG_CXX11\n\n#if GTEST_LANG_CXX11\nTEST(PrintNullptrT, Basic) {\n  EXPECT_EQ(\"(nullptr)\", Print(nullptr));\n}\n#endif  // GTEST_LANG_CXX11\n\n// Tests printing user-defined unprintable types.\n\n// Unprintable types in the global namespace.\nTEST(PrintUnprintableTypeTest, InGlobalNamespace) {\n  EXPECT_EQ(\"1-byte object <00>\",\n            Print(UnprintableTemplateInGlobal<char>()));\n}\n\n// Unprintable types in a user namespace.\nTEST(PrintUnprintableTypeTest, InUserNamespace) {\n  EXPECT_EQ(\"16-byte object <EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>\",\n            Print(::foo::UnprintableInFoo()));\n}\n\n// Unprintable types are that too big to be printed completely.\n\nstruct Big {\n  Big() { memset(array, 0, sizeof(array)); }\n  char array[257];\n};\n\nTEST(PrintUnpritableTypeTest, BigObject) {\n  EXPECT_EQ(\"257-byte object <00-00 00-00 00-00 00-00 00-00 00-00 \"\n            \"00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 \"\n            \"00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 \"\n            \"00-00 00-00 00-00 00-00 00-00 00-00 ... 00-00 00-00 00-00 \"\n            \"00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 \"\n            \"00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 \"\n            \"00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00>\",\n            Print(Big()));\n}\n\n// Tests printing user-defined streamable types.\n\n// Streamable types in the global namespace.\nTEST(PrintStreamableTypeTest, InGlobalNamespace) {\n  StreamableInGlobal x;\n  EXPECT_EQ(\"StreamableInGlobal\", Print(x));\n  EXPECT_EQ(\"StreamableInGlobal*\", Print(&x));\n}\n\n// Printable template types in a user namespace.\nTEST(PrintStreamableTypeTest, TemplateTypeInUserNamespace) {\n  EXPECT_EQ(\"StreamableTemplateInFoo: 0\",\n            Print(::foo::StreamableTemplateInFoo<int>()));\n}\n\n// Tests printing a user-defined recursive container type that has a <<\n// operator.\nTEST(PrintStreamableTypeTest, PathLikeInUserNamespace) {\n  ::foo::PathLike x;\n  EXPECT_EQ(\"Streamable-PathLike\", Print(x));\n  const ::foo::PathLike cx;\n  EXPECT_EQ(\"Streamable-PathLike\", Print(cx));\n}\n\n// Tests printing user-defined types that have a PrintTo() function.\nTEST(PrintPrintableTypeTest, InUserNamespace) {\n  EXPECT_EQ(\"PrintableViaPrintTo: 0\",\n            Print(::foo::PrintableViaPrintTo()));\n}\n\n// Tests printing a pointer to a user-defined type that has a <<\n// operator for its pointer.\nTEST(PrintPrintableTypeTest, PointerInUserNamespace) {\n  ::foo::PointerPrintable x;\n  EXPECT_EQ(\"PointerPrintable*\", Print(&x));\n}\n\n// Tests printing user-defined class template that have a PrintTo() function.\nTEST(PrintPrintableTypeTest, TemplateInUserNamespace) {\n  EXPECT_EQ(\"PrintableViaPrintToTemplate: 5\",\n            Print(::foo::PrintableViaPrintToTemplate<int>(5)));\n}\n\n// Tests that the universal printer prints both the address and the\n// value of a reference.\nTEST(PrintReferenceTest, PrintsAddressAndValue) {\n  int n = 5;\n  EXPECT_EQ(\"@\" + PrintPointer(&n) + \" 5\", PrintByRef(n));\n\n  int a[2][3] = {\n    { 0, 1, 2 },\n    { 3, 4, 5 }\n  };\n  EXPECT_EQ(\"@\" + PrintPointer(a) + \" { { 0, 1, 2 }, { 3, 4, 5 } }\",\n            PrintByRef(a));\n\n  const ::foo::UnprintableInFoo x;\n  EXPECT_EQ(\"@\" + PrintPointer(&x) + \" 16-byte object \"\n            \"<EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>\",\n            PrintByRef(x));\n}\n\n// Tests that the universal printer prints a function pointer passed by\n// reference.\nTEST(PrintReferenceTest, HandlesFunctionPointer) {\n  void (*fp)(int n) = &MyFunction;\n  const std::string fp_pointer_string =\n      PrintPointer(reinterpret_cast<const void*>(&fp));\n  // We cannot directly cast &MyFunction to const void* because the\n  // standard disallows casting between pointers to functions and\n  // pointers to objects, and some compilers (e.g. GCC 3.4) enforce\n  // this limitation.\n  const std::string fp_string = PrintPointer(reinterpret_cast<const void*>(\n      reinterpret_cast<internal::BiggestInt>(fp)));\n  EXPECT_EQ(\"@\" + fp_pointer_string + \" \" + fp_string,\n            PrintByRef(fp));\n}\n\n// Tests that the universal printer prints a member function pointer\n// passed by reference.\nTEST(PrintReferenceTest, HandlesMemberFunctionPointer) {\n  int (Foo::*p)(char ch) = &Foo::MyMethod;\n  EXPECT_TRUE(HasPrefix(\n      PrintByRef(p),\n      \"@\" + PrintPointer(reinterpret_cast<const void*>(&p)) + \" \" +\n          Print(sizeof(p)) + \"-byte object \"));\n\n  char (Foo::*p2)(int n) = &Foo::MyVirtualMethod;\n  EXPECT_TRUE(HasPrefix(\n      PrintByRef(p2),\n      \"@\" + PrintPointer(reinterpret_cast<const void*>(&p2)) + \" \" +\n          Print(sizeof(p2)) + \"-byte object \"));\n}\n\n// Tests that the universal printer prints a member variable pointer\n// passed by reference.\nTEST(PrintReferenceTest, HandlesMemberVariablePointer) {\n  int Foo::*p = &Foo::value;  // NOLINT\n  EXPECT_TRUE(HasPrefix(\n      PrintByRef(p),\n      \"@\" + PrintPointer(&p) + \" \" + Print(sizeof(p)) + \"-byte object \"));\n}\n\n// Tests that FormatForComparisonFailureMessage(), which is used to print\n// an operand in a comparison assertion (e.g. ASSERT_EQ) when the assertion\n// fails, formats the operand in the desired way.\n\n// scalar\nTEST(FormatForComparisonFailureMessageTest, WorksForScalar) {\n  EXPECT_STREQ(\"123\",\n               FormatForComparisonFailureMessage(123, 124).c_str());\n}\n\n// non-char pointer\nTEST(FormatForComparisonFailureMessageTest, WorksForNonCharPointer) {\n  int n = 0;\n  EXPECT_EQ(PrintPointer(&n),\n            FormatForComparisonFailureMessage(&n, &n).c_str());\n}\n\n// non-char array\nTEST(FormatForComparisonFailureMessageTest, FormatsNonCharArrayAsPointer) {\n  // In expression 'array == x', 'array' is compared by pointer.\n  // Therefore we want to print an array operand as a pointer.\n  int n[] = { 1, 2, 3 };\n  EXPECT_EQ(PrintPointer(n),\n            FormatForComparisonFailureMessage(n, n).c_str());\n}\n\n// Tests formatting a char pointer when it's compared with another pointer.\n// In this case we want to print it as a raw pointer, as the comparison is by\n// pointer.\n\n// char pointer vs pointer\nTEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsPointer) {\n  // In expression 'p == x', where 'p' and 'x' are (const or not) char\n  // pointers, the operands are compared by pointer.  Therefore we\n  // want to print 'p' as a pointer instead of a C string (we don't\n  // even know if it's supposed to point to a valid C string).\n\n  // const char*\n  const char* s = \"hello\";\n  EXPECT_EQ(PrintPointer(s),\n            FormatForComparisonFailureMessage(s, s).c_str());\n\n  // char*\n  char ch = 'a';\n  EXPECT_EQ(PrintPointer(&ch),\n            FormatForComparisonFailureMessage(&ch, &ch).c_str());\n}\n\n// wchar_t pointer vs pointer\nTEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsPointer) {\n  // In expression 'p == x', where 'p' and 'x' are (const or not) char\n  // pointers, the operands are compared by pointer.  Therefore we\n  // want to print 'p' as a pointer instead of a wide C string (we don't\n  // even know if it's supposed to point to a valid wide C string).\n\n  // const wchar_t*\n  const wchar_t* s = L\"hello\";\n  EXPECT_EQ(PrintPointer(s),\n            FormatForComparisonFailureMessage(s, s).c_str());\n\n  // wchar_t*\n  wchar_t ch = L'a';\n  EXPECT_EQ(PrintPointer(&ch),\n            FormatForComparisonFailureMessage(&ch, &ch).c_str());\n}\n\n// Tests formatting a char pointer when it's compared to a string object.\n// In this case we want to print the char pointer as a C string.\n\n#if GTEST_HAS_GLOBAL_STRING\n// char pointer vs ::string\nTEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsString) {\n  const char* s = \"hello \\\"world\";\n  EXPECT_STREQ(\"\\\"hello \\\\\\\"world\\\"\",  // The string content should be escaped.\n               FormatForComparisonFailureMessage(s, ::string()).c_str());\n\n  // char*\n  char str[] = \"hi\\1\";\n  char* p = str;\n  EXPECT_STREQ(\"\\\"hi\\\\x1\\\"\",  // The string content should be escaped.\n               FormatForComparisonFailureMessage(p, ::string()).c_str());\n}\n#endif\n\n// char pointer vs std::string\nTEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsStdString) {\n  const char* s = \"hello \\\"world\";\n  EXPECT_STREQ(\"\\\"hello \\\\\\\"world\\\"\",  // The string content should be escaped.\n               FormatForComparisonFailureMessage(s, ::std::string()).c_str());\n\n  // char*\n  char str[] = \"hi\\1\";\n  char* p = str;\n  EXPECT_STREQ(\"\\\"hi\\\\x1\\\"\",  // The string content should be escaped.\n               FormatForComparisonFailureMessage(p, ::std::string()).c_str());\n}\n\n#if GTEST_HAS_GLOBAL_WSTRING\n// wchar_t pointer vs ::wstring\nTEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsWString) {\n  const wchar_t* s = L\"hi \\\"world\";\n  EXPECT_STREQ(\"L\\\"hi \\\\\\\"world\\\"\",  // The string content should be escaped.\n               FormatForComparisonFailureMessage(s, ::wstring()).c_str());\n\n  // wchar_t*\n  wchar_t str[] = L\"hi\\1\";\n  wchar_t* p = str;\n  EXPECT_STREQ(\"L\\\"hi\\\\x1\\\"\",  // The string content should be escaped.\n               FormatForComparisonFailureMessage(p, ::wstring()).c_str());\n}\n#endif\n\n#if GTEST_HAS_STD_WSTRING\n// wchar_t pointer vs std::wstring\nTEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsStdWString) {\n  const wchar_t* s = L\"hi \\\"world\";\n  EXPECT_STREQ(\"L\\\"hi \\\\\\\"world\\\"\",  // The string content should be escaped.\n               FormatForComparisonFailureMessage(s, ::std::wstring()).c_str());\n\n  // wchar_t*\n  wchar_t str[] = L\"hi\\1\";\n  wchar_t* p = str;\n  EXPECT_STREQ(\"L\\\"hi\\\\x1\\\"\",  // The string content should be escaped.\n               FormatForComparisonFailureMessage(p, ::std::wstring()).c_str());\n}\n#endif\n\n// Tests formatting a char array when it's compared with a pointer or array.\n// In this case we want to print the array as a row pointer, as the comparison\n// is by pointer.\n\n// char array vs pointer\nTEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsPointer) {\n  char str[] = \"hi \\\"world\\\"\";\n  char* p = NULL;\n  EXPECT_EQ(PrintPointer(str),\n            FormatForComparisonFailureMessage(str, p).c_str());\n}\n\n// char array vs char array\nTEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsCharArray) {\n  const char str[] = \"hi \\\"world\\\"\";\n  EXPECT_EQ(PrintPointer(str),\n            FormatForComparisonFailureMessage(str, str).c_str());\n}\n\n// wchar_t array vs pointer\nTEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsPointer) {\n  wchar_t str[] = L\"hi \\\"world\\\"\";\n  wchar_t* p = NULL;\n  EXPECT_EQ(PrintPointer(str),\n            FormatForComparisonFailureMessage(str, p).c_str());\n}\n\n// wchar_t array vs wchar_t array\nTEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsWCharArray) {\n  const wchar_t str[] = L\"hi \\\"world\\\"\";\n  EXPECT_EQ(PrintPointer(str),\n            FormatForComparisonFailureMessage(str, str).c_str());\n}\n\n// Tests formatting a char array when it's compared with a string object.\n// In this case we want to print the array as a C string.\n\n#if GTEST_HAS_GLOBAL_STRING\n// char array vs string\nTEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsString) {\n  const char str[] = \"hi \\\"w\\0rld\\\"\";\n  EXPECT_STREQ(\"\\\"hi \\\\\\\"w\\\"\",  // The content should be escaped.\n                                // Embedded NUL terminates the string.\n               FormatForComparisonFailureMessage(str, ::string()).c_str());\n}\n#endif\n\n// char array vs std::string\nTEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsStdString) {\n  const char str[] = \"hi \\\"world\\\"\";\n  EXPECT_STREQ(\"\\\"hi \\\\\\\"world\\\\\\\"\\\"\",  // The content should be escaped.\n               FormatForComparisonFailureMessage(str, ::std::string()).c_str());\n}\n\n#if GTEST_HAS_GLOBAL_WSTRING\n// wchar_t array vs wstring\nTEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsWString) {\n  const wchar_t str[] = L\"hi \\\"world\\\"\";\n  EXPECT_STREQ(\"L\\\"hi \\\\\\\"world\\\\\\\"\\\"\",  // The content should be escaped.\n               FormatForComparisonFailureMessage(str, ::wstring()).c_str());\n}\n#endif\n\n#if GTEST_HAS_STD_WSTRING\n// wchar_t array vs std::wstring\nTEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsStdWString) {\n  const wchar_t str[] = L\"hi \\\"w\\0rld\\\"\";\n  EXPECT_STREQ(\n      \"L\\\"hi \\\\\\\"w\\\"\",  // The content should be escaped.\n                        // Embedded NUL terminates the string.\n      FormatForComparisonFailureMessage(str, ::std::wstring()).c_str());\n}\n#endif\n\n// Useful for testing PrintToString().  We cannot use EXPECT_EQ()\n// there as its implementation uses PrintToString().  The caller must\n// ensure that 'value' has no side effect.\n#define EXPECT_PRINT_TO_STRING_(value, expected_string)         \\\n  EXPECT_TRUE(PrintToString(value) == (expected_string))        \\\n      << \" where \" #value \" prints as \" << (PrintToString(value))\n\nTEST(PrintToStringTest, WorksForScalar) {\n  EXPECT_PRINT_TO_STRING_(123, \"123\");\n}\n\nTEST(PrintToStringTest, WorksForPointerToConstChar) {\n  const char* p = \"hello\";\n  EXPECT_PRINT_TO_STRING_(p, \"\\\"hello\\\"\");\n}\n\nTEST(PrintToStringTest, WorksForPointerToNonConstChar) {\n  char s[] = \"hello\";\n  char* p = s;\n  EXPECT_PRINT_TO_STRING_(p, \"\\\"hello\\\"\");\n}\n\nTEST(PrintToStringTest, EscapesForPointerToConstChar) {\n  const char* p = \"hello\\n\";\n  EXPECT_PRINT_TO_STRING_(p, \"\\\"hello\\\\n\\\"\");\n}\n\nTEST(PrintToStringTest, EscapesForPointerToNonConstChar) {\n  char s[] = \"hello\\1\";\n  char* p = s;\n  EXPECT_PRINT_TO_STRING_(p, \"\\\"hello\\\\x1\\\"\");\n}\n\nTEST(PrintToStringTest, WorksForArray) {\n  int n[3] = { 1, 2, 3 };\n  EXPECT_PRINT_TO_STRING_(n, \"{ 1, 2, 3 }\");\n}\n\nTEST(PrintToStringTest, WorksForCharArray) {\n  char s[] = \"hello\";\n  EXPECT_PRINT_TO_STRING_(s, \"\\\"hello\\\"\");\n}\n\nTEST(PrintToStringTest, WorksForCharArrayWithEmbeddedNul) {\n  const char str_with_nul[] = \"hello\\0 world\";\n  EXPECT_PRINT_TO_STRING_(str_with_nul, \"\\\"hello\\\\0 world\\\"\");\n\n  char mutable_str_with_nul[] = \"hello\\0 world\";\n  EXPECT_PRINT_TO_STRING_(mutable_str_with_nul, \"\\\"hello\\\\0 world\\\"\");\n}\n\n  TEST(PrintToStringTest, ContainsNonLatin) {\n  // Sanity test with valid UTF-8. Prints both in hex and as text.\n  std::string non_ascii_str = ::std::string(\"오전 4:30\");\n  EXPECT_PRINT_TO_STRING_(non_ascii_str,\n                          \"\\\"\\\\xEC\\\\x98\\\\xA4\\\\xEC\\\\xA0\\\\x84 4:30\\\"\\n\"\n                          \"    As Text: \\\"오전 4:30\\\"\");\n  non_ascii_str = ::std::string(\"From ä — ẑ\");\n  EXPECT_PRINT_TO_STRING_(non_ascii_str,\n                          \"\\\"From \\\\xC3\\\\xA4 \\\\xE2\\\\x80\\\\x94 \\\\xE1\\\\xBA\\\\x91\\\"\"\n                          \"\\n    As Text: \\\"From ä — ẑ\\\"\");\n}\n\nTEST(IsValidUTF8Test, IllFormedUTF8) {\n  // The following test strings are ill-formed UTF-8 and are printed\n  // as hex only (or ASCII, in case of ASCII bytes) because IsValidUTF8() is\n  // expected to fail, thus output does not contain \"As Text:\".\n\n  static const char *const kTestdata[][2] = {\n    // 2-byte lead byte followed by a single-byte character.\n    {\"\\xC3\\x74\", \"\\\"\\\\xC3t\\\"\"},\n    // Valid 2-byte character followed by an orphan trail byte.\n    {\"\\xC3\\x84\\xA4\", \"\\\"\\\\xC3\\\\x84\\\\xA4\\\"\"},\n    // Lead byte without trail byte.\n    {\"abc\\xC3\", \"\\\"abc\\\\xC3\\\"\"},\n    // 3-byte lead byte, single-byte character, orphan trail byte.\n    {\"x\\xE2\\x70\\x94\", \"\\\"x\\\\xE2p\\\\x94\\\"\"},\n    // Truncated 3-byte character.\n    {\"\\xE2\\x80\", \"\\\"\\\\xE2\\\\x80\\\"\"},\n    // Truncated 3-byte character followed by valid 2-byte char.\n    {\"\\xE2\\x80\\xC3\\x84\", \"\\\"\\\\xE2\\\\x80\\\\xC3\\\\x84\\\"\"},\n    // Truncated 3-byte character followed by a single-byte character.\n    {\"\\xE2\\x80\\x7A\", \"\\\"\\\\xE2\\\\x80z\\\"\"},\n    // 3-byte lead byte followed by valid 3-byte character.\n    {\"\\xE2\\xE2\\x80\\x94\", \"\\\"\\\\xE2\\\\xE2\\\\x80\\\\x94\\\"\"},\n    // 4-byte lead byte followed by valid 3-byte character.\n    {\"\\xF0\\xE2\\x80\\x94\", \"\\\"\\\\xF0\\\\xE2\\\\x80\\\\x94\\\"\"},\n    // Truncated 4-byte character.\n    {\"\\xF0\\xE2\\x80\", \"\\\"\\\\xF0\\\\xE2\\\\x80\\\"\"},\n     // Invalid UTF-8 byte sequences embedded in other chars.\n    {\"abc\\xE2\\x80\\x94\\xC3\\x74xyc\", \"\\\"abc\\\\xE2\\\\x80\\\\x94\\\\xC3txyc\\\"\"},\n    {\"abc\\xC3\\x84\\xE2\\x80\\xC3\\x84xyz\",\n     \"\\\"abc\\\\xC3\\\\x84\\\\xE2\\\\x80\\\\xC3\\\\x84xyz\\\"\"},\n    // Non-shortest UTF-8 byte sequences are also ill-formed.\n    // The classics: xC0, xC1 lead byte.\n    {\"\\xC0\\x80\", \"\\\"\\\\xC0\\\\x80\\\"\"},\n    {\"\\xC1\\x81\", \"\\\"\\\\xC1\\\\x81\\\"\"},\n    // Non-shortest sequences.\n    {\"\\xE0\\x80\\x80\", \"\\\"\\\\xE0\\\\x80\\\\x80\\\"\"},\n    {\"\\xf0\\x80\\x80\\x80\", \"\\\"\\\\xF0\\\\x80\\\\x80\\\\x80\\\"\"},\n    // Last valid code point before surrogate range, should be printed as text,\n    // too.\n    {\"\\xED\\x9F\\xBF\", \"\\\"\\\\xED\\\\x9F\\\\xBF\\\"\\n    As Text: \\\"퟿\\\"\"},\n    // Start of surrogate lead. Surrogates are not printed as text.\n    {\"\\xED\\xA0\\x80\", \"\\\"\\\\xED\\\\xA0\\\\x80\\\"\"},\n    // Last non-private surrogate lead.\n    {\"\\xED\\xAD\\xBF\", \"\\\"\\\\xED\\\\xAD\\\\xBF\\\"\"},\n    // First private-use surrogate lead.\n    {\"\\xED\\xAE\\x80\", \"\\\"\\\\xED\\\\xAE\\\\x80\\\"\"},\n    // Last private-use surrogate lead.\n    {\"\\xED\\xAF\\xBF\", \"\\\"\\\\xED\\\\xAF\\\\xBF\\\"\"},\n    // Mid-point of surrogate trail.\n    {\"\\xED\\xB3\\xBF\", \"\\\"\\\\xED\\\\xB3\\\\xBF\\\"\"},\n    // First valid code point after surrogate range, should be printed as text,\n    // too.\n    {\"\\xEE\\x80\\x80\", \"\\\"\\\\xEE\\\\x80\\\\x80\\\"\\n    As Text: \\\"\\\"\"}\n  };\n\n  for (int i = 0; i < int(sizeof(kTestdata)/sizeof(kTestdata[0])); ++i) {\n    EXPECT_PRINT_TO_STRING_(kTestdata[i][0], kTestdata[i][1]);\n  }\n}\n\n#undef EXPECT_PRINT_TO_STRING_\n\nTEST(UniversalTersePrintTest, WorksForNonReference) {\n  ::std::stringstream ss;\n  UniversalTersePrint(123, &ss);\n  EXPECT_EQ(\"123\", ss.str());\n}\n\nTEST(UniversalTersePrintTest, WorksForReference) {\n  const int& n = 123;\n  ::std::stringstream ss;\n  UniversalTersePrint(n, &ss);\n  EXPECT_EQ(\"123\", ss.str());\n}\n\nTEST(UniversalTersePrintTest, WorksForCString) {\n  const char* s1 = \"abc\";\n  ::std::stringstream ss1;\n  UniversalTersePrint(s1, &ss1);\n  EXPECT_EQ(\"\\\"abc\\\"\", ss1.str());\n\n  char* s2 = const_cast<char*>(s1);\n  ::std::stringstream ss2;\n  UniversalTersePrint(s2, &ss2);\n  EXPECT_EQ(\"\\\"abc\\\"\", ss2.str());\n\n  const char* s3 = NULL;\n  ::std::stringstream ss3;\n  UniversalTersePrint(s3, &ss3);\n  EXPECT_EQ(\"NULL\", ss3.str());\n}\n\nTEST(UniversalPrintTest, WorksForNonReference) {\n  ::std::stringstream ss;\n  UniversalPrint(123, &ss);\n  EXPECT_EQ(\"123\", ss.str());\n}\n\nTEST(UniversalPrintTest, WorksForReference) {\n  const int& n = 123;\n  ::std::stringstream ss;\n  UniversalPrint(n, &ss);\n  EXPECT_EQ(\"123\", ss.str());\n}\n\nTEST(UniversalPrintTest, WorksForCString) {\n  const char* s1 = \"abc\";\n  ::std::stringstream ss1;\n  UniversalPrint(s1, &ss1);\n  EXPECT_EQ(PrintPointer(s1) + \" pointing to \\\"abc\\\"\", std::string(ss1.str()));\n\n  char* s2 = const_cast<char*>(s1);\n  ::std::stringstream ss2;\n  UniversalPrint(s2, &ss2);\n  EXPECT_EQ(PrintPointer(s2) + \" pointing to \\\"abc\\\"\", std::string(ss2.str()));\n\n  const char* s3 = NULL;\n  ::std::stringstream ss3;\n  UniversalPrint(s3, &ss3);\n  EXPECT_EQ(\"NULL\", ss3.str());\n}\n\nTEST(UniversalPrintTest, WorksForCharArray) {\n  const char str[] = \"\\\"Line\\0 1\\\"\\nLine 2\";\n  ::std::stringstream ss1;\n  UniversalPrint(str, &ss1);\n  EXPECT_EQ(\"\\\"\\\\\\\"Line\\\\0 1\\\\\\\"\\\\nLine 2\\\"\", ss1.str());\n\n  const char mutable_str[] = \"\\\"Line\\0 1\\\"\\nLine 2\";\n  ::std::stringstream ss2;\n  UniversalPrint(mutable_str, &ss2);\n  EXPECT_EQ(\"\\\"\\\\\\\"Line\\\\0 1\\\\\\\"\\\\nLine 2\\\"\", ss2.str());\n}\n\n#if GTEST_HAS_TR1_TUPLE\n\nTEST(UniversalTersePrintTupleFieldsToStringsTestWithTr1, PrintsEmptyTuple) {\n  Strings result = UniversalTersePrintTupleFieldsToStrings(\n      ::std::tr1::make_tuple());\n  EXPECT_EQ(0u, result.size());\n}\n\nTEST(UniversalTersePrintTupleFieldsToStringsTestWithTr1, PrintsOneTuple) {\n  Strings result = UniversalTersePrintTupleFieldsToStrings(\n      ::std::tr1::make_tuple(1));\n  ASSERT_EQ(1u, result.size());\n  EXPECT_EQ(\"1\", result[0]);\n}\n\nTEST(UniversalTersePrintTupleFieldsToStringsTestWithTr1, PrintsTwoTuple) {\n  Strings result = UniversalTersePrintTupleFieldsToStrings(\n      ::std::tr1::make_tuple(1, 'a'));\n  ASSERT_EQ(2u, result.size());\n  EXPECT_EQ(\"1\", result[0]);\n  EXPECT_EQ(\"'a' (97, 0x61)\", result[1]);\n}\n\nTEST(UniversalTersePrintTupleFieldsToStringsTestWithTr1, PrintsTersely) {\n  const int n = 1;\n  Strings result = UniversalTersePrintTupleFieldsToStrings(\n      ::std::tr1::tuple<const int&, const char*>(n, \"a\"));\n  ASSERT_EQ(2u, result.size());\n  EXPECT_EQ(\"1\", result[0]);\n  EXPECT_EQ(\"\\\"a\\\"\", result[1]);\n}\n\n#endif  // GTEST_HAS_TR1_TUPLE\n\n#if GTEST_HAS_STD_TUPLE_\n\nTEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsEmptyTuple) {\n  Strings result = UniversalTersePrintTupleFieldsToStrings(::std::make_tuple());\n  EXPECT_EQ(0u, result.size());\n}\n\nTEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsOneTuple) {\n  Strings result = UniversalTersePrintTupleFieldsToStrings(\n      ::std::make_tuple(1));\n  ASSERT_EQ(1u, result.size());\n  EXPECT_EQ(\"1\", result[0]);\n}\n\nTEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsTwoTuple) {\n  Strings result = UniversalTersePrintTupleFieldsToStrings(\n      ::std::make_tuple(1, 'a'));\n  ASSERT_EQ(2u, result.size());\n  EXPECT_EQ(\"1\", result[0]);\n  EXPECT_EQ(\"'a' (97, 0x61)\", result[1]);\n}\n\nTEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsTersely) {\n  const int n = 1;\n  Strings result = UniversalTersePrintTupleFieldsToStrings(\n      ::std::tuple<const int&, const char*>(n, \"a\"));\n  ASSERT_EQ(2u, result.size());\n  EXPECT_EQ(\"1\", result[0]);\n  EXPECT_EQ(\"\\\"a\\\"\", result[1]);\n}\n\n#endif  // GTEST_HAS_STD_TUPLE_\n\n#if GTEST_HAS_ABSL\n\nTEST(PrintOptionalTest, Basic) {\n  absl::optional<int> value;\n  EXPECT_EQ(\"(nullopt)\", PrintToString(value));\n  value = {7};\n  EXPECT_EQ(\"(7)\", PrintToString(value));\n  EXPECT_EQ(\"(1.1)\", PrintToString(absl::optional<double>{1.1}));\n  EXPECT_EQ(\"(\\\"A\\\")\", PrintToString(absl::optional<std::string>{\"A\"}));\n}\n\nstruct NonPrintable {\n  unsigned char contents = 17;\n};\n\nTEST(PrintOneofTest, Basic) {\n  using Type = absl::variant<int, StreamableInGlobal, NonPrintable>;\n  EXPECT_EQ(\"('int' with value 7)\", PrintToString(Type(7)));\n  EXPECT_EQ(\"('StreamableInGlobal' with value StreamableInGlobal)\",\n            PrintToString(Type(StreamableInGlobal{})));\n  EXPECT_EQ(\n      \"('testing::gtest_printers_test::NonPrintable' with value 1-byte object \"\n      \"<11>)\",\n      PrintToString(Type(NonPrintable{})));\n}\n#endif  // GTEST_HAS_ABSL\n\n}  // namespace gtest_printers_test\n}  // namespace testing\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-shuffle-test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009 Google Inc. All Rights Reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Verifies that test shuffling works.\"\"\"\n\nimport os\nimport gtest_test_utils\n\n# Command to run the googletest-shuffle-test_ program.\nCOMMAND = gtest_test_utils.GetTestExecutablePath('googletest-shuffle-test_')\n\n# The environment variables for test sharding.\nTOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'\nSHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'\n\nTEST_FILTER = 'A*.A:A*.B:C*'\n\nALL_TESTS = []\nACTIVE_TESTS = []\nFILTERED_TESTS = []\nSHARDED_TESTS = []\n\nSHUFFLED_ALL_TESTS = []\nSHUFFLED_ACTIVE_TESTS = []\nSHUFFLED_FILTERED_TESTS = []\nSHUFFLED_SHARDED_TESTS = []\n\n\ndef AlsoRunDisabledTestsFlag():\n  return '--gtest_also_run_disabled_tests'\n\n\ndef FilterFlag(test_filter):\n  return '--gtest_filter=%s' % (test_filter,)\n\n\ndef RepeatFlag(n):\n  return '--gtest_repeat=%s' % (n,)\n\n\ndef ShuffleFlag():\n  return '--gtest_shuffle'\n\n\ndef RandomSeedFlag(n):\n  return '--gtest_random_seed=%s' % (n,)\n\n\ndef RunAndReturnOutput(extra_env, args):\n  \"\"\"Runs the test program and returns its output.\"\"\"\n\n  environ_copy = os.environ.copy()\n  environ_copy.update(extra_env)\n\n  return gtest_test_utils.Subprocess([COMMAND] + args, env=environ_copy).output\n\n\ndef GetTestsForAllIterations(extra_env, args):\n  \"\"\"Runs the test program and returns a list of test lists.\n\n  Args:\n    extra_env: a map from environment variables to their values\n    args: command line flags to pass to googletest-shuffle-test_\n\n  Returns:\n    A list where the i-th element is the list of tests run in the i-th\n    test iteration.\n  \"\"\"\n\n  test_iterations = []\n  for line in RunAndReturnOutput(extra_env, args).split('\\n'):\n    if line.startswith('----'):\n      tests = []\n      test_iterations.append(tests)\n    elif line.strip():\n      tests.append(line.strip())  # 'TestCaseName.TestName'\n\n  return test_iterations\n\n\ndef GetTestCases(tests):\n  \"\"\"Returns a list of test cases in the given full test names.\n\n  Args:\n    tests: a list of full test names\n\n  Returns:\n    A list of test cases from 'tests', in their original order.\n    Consecutive duplicates are removed.\n  \"\"\"\n\n  test_cases = []\n  for test in tests:\n    test_case = test.split('.')[0]\n    if not test_case in test_cases:\n      test_cases.append(test_case)\n\n  return test_cases\n\n\ndef CalculateTestLists():\n  \"\"\"Calculates the list of tests run under different flags.\"\"\"\n\n  if not ALL_TESTS:\n    ALL_TESTS.extend(\n        GetTestsForAllIterations({}, [AlsoRunDisabledTestsFlag()])[0])\n\n  if not ACTIVE_TESTS:\n    ACTIVE_TESTS.extend(GetTestsForAllIterations({}, [])[0])\n\n  if not FILTERED_TESTS:\n    FILTERED_TESTS.extend(\n        GetTestsForAllIterations({}, [FilterFlag(TEST_FILTER)])[0])\n\n  if not SHARDED_TESTS:\n    SHARDED_TESTS.extend(\n        GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',\n                                  SHARD_INDEX_ENV_VAR: '1'},\n                                 [])[0])\n\n  if not SHUFFLED_ALL_TESTS:\n    SHUFFLED_ALL_TESTS.extend(GetTestsForAllIterations(\n        {}, [AlsoRunDisabledTestsFlag(), ShuffleFlag(), RandomSeedFlag(1)])[0])\n\n  if not SHUFFLED_ACTIVE_TESTS:\n    SHUFFLED_ACTIVE_TESTS.extend(GetTestsForAllIterations(\n        {}, [ShuffleFlag(), RandomSeedFlag(1)])[0])\n\n  if not SHUFFLED_FILTERED_TESTS:\n    SHUFFLED_FILTERED_TESTS.extend(GetTestsForAllIterations(\n        {}, [ShuffleFlag(), RandomSeedFlag(1), FilterFlag(TEST_FILTER)])[0])\n\n  if not SHUFFLED_SHARDED_TESTS:\n    SHUFFLED_SHARDED_TESTS.extend(\n        GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',\n                                  SHARD_INDEX_ENV_VAR: '1'},\n                                 [ShuffleFlag(), RandomSeedFlag(1)])[0])\n\n\nclass GTestShuffleUnitTest(gtest_test_utils.TestCase):\n  \"\"\"Tests test shuffling.\"\"\"\n\n  def setUp(self):\n    CalculateTestLists()\n\n  def testShufflePreservesNumberOfTests(self):\n    self.assertEqual(len(ALL_TESTS), len(SHUFFLED_ALL_TESTS))\n    self.assertEqual(len(ACTIVE_TESTS), len(SHUFFLED_ACTIVE_TESTS))\n    self.assertEqual(len(FILTERED_TESTS), len(SHUFFLED_FILTERED_TESTS))\n    self.assertEqual(len(SHARDED_TESTS), len(SHUFFLED_SHARDED_TESTS))\n\n  def testShuffleChangesTestOrder(self):\n    self.assert_(SHUFFLED_ALL_TESTS != ALL_TESTS, SHUFFLED_ALL_TESTS)\n    self.assert_(SHUFFLED_ACTIVE_TESTS != ACTIVE_TESTS, SHUFFLED_ACTIVE_TESTS)\n    self.assert_(SHUFFLED_FILTERED_TESTS != FILTERED_TESTS,\n                 SHUFFLED_FILTERED_TESTS)\n    self.assert_(SHUFFLED_SHARDED_TESTS != SHARDED_TESTS,\n                 SHUFFLED_SHARDED_TESTS)\n\n  def testShuffleChangesTestCaseOrder(self):\n    self.assert_(GetTestCases(SHUFFLED_ALL_TESTS) != GetTestCases(ALL_TESTS),\n                 GetTestCases(SHUFFLED_ALL_TESTS))\n    self.assert_(\n        GetTestCases(SHUFFLED_ACTIVE_TESTS) != GetTestCases(ACTIVE_TESTS),\n        GetTestCases(SHUFFLED_ACTIVE_TESTS))\n    self.assert_(\n        GetTestCases(SHUFFLED_FILTERED_TESTS) != GetTestCases(FILTERED_TESTS),\n        GetTestCases(SHUFFLED_FILTERED_TESTS))\n    self.assert_(\n        GetTestCases(SHUFFLED_SHARDED_TESTS) != GetTestCases(SHARDED_TESTS),\n        GetTestCases(SHUFFLED_SHARDED_TESTS))\n\n  def testShuffleDoesNotRepeatTest(self):\n    for test in SHUFFLED_ALL_TESTS:\n      self.assertEqual(1, SHUFFLED_ALL_TESTS.count(test),\n                       '%s appears more than once' % (test,))\n    for test in SHUFFLED_ACTIVE_TESTS:\n      self.assertEqual(1, SHUFFLED_ACTIVE_TESTS.count(test),\n                       '%s appears more than once' % (test,))\n    for test in SHUFFLED_FILTERED_TESTS:\n      self.assertEqual(1, SHUFFLED_FILTERED_TESTS.count(test),\n                       '%s appears more than once' % (test,))\n    for test in SHUFFLED_SHARDED_TESTS:\n      self.assertEqual(1, SHUFFLED_SHARDED_TESTS.count(test),\n                       '%s appears more than once' % (test,))\n\n  def testShuffleDoesNotCreateNewTest(self):\n    for test in SHUFFLED_ALL_TESTS:\n      self.assert_(test in ALL_TESTS, '%s is an invalid test' % (test,))\n    for test in SHUFFLED_ACTIVE_TESTS:\n      self.assert_(test in ACTIVE_TESTS, '%s is an invalid test' % (test,))\n    for test in SHUFFLED_FILTERED_TESTS:\n      self.assert_(test in FILTERED_TESTS, '%s is an invalid test' % (test,))\n    for test in SHUFFLED_SHARDED_TESTS:\n      self.assert_(test in SHARDED_TESTS, '%s is an invalid test' % (test,))\n\n  def testShuffleIncludesAllTests(self):\n    for test in ALL_TESTS:\n      self.assert_(test in SHUFFLED_ALL_TESTS, '%s is missing' % (test,))\n    for test in ACTIVE_TESTS:\n      self.assert_(test in SHUFFLED_ACTIVE_TESTS, '%s is missing' % (test,))\n    for test in FILTERED_TESTS:\n      self.assert_(test in SHUFFLED_FILTERED_TESTS, '%s is missing' % (test,))\n    for test in SHARDED_TESTS:\n      self.assert_(test in SHUFFLED_SHARDED_TESTS, '%s is missing' % (test,))\n\n  def testShuffleLeavesDeathTestsAtFront(self):\n    non_death_test_found = False\n    for test in SHUFFLED_ACTIVE_TESTS:\n      if 'DeathTest.' in test:\n        self.assert_(not non_death_test_found,\n                     '%s appears after a non-death test' % (test,))\n      else:\n        non_death_test_found = True\n\n  def _VerifyTestCasesDoNotInterleave(self, tests):\n    test_cases = []\n    for test in tests:\n      [test_case, _] = test.split('.')\n      if test_cases and test_cases[-1] != test_case:\n        test_cases.append(test_case)\n        self.assertEqual(1, test_cases.count(test_case),\n                         'Test case %s is not grouped together in %s' %\n                         (test_case, tests))\n\n  def testShuffleDoesNotInterleaveTestCases(self):\n    self._VerifyTestCasesDoNotInterleave(SHUFFLED_ALL_TESTS)\n    self._VerifyTestCasesDoNotInterleave(SHUFFLED_ACTIVE_TESTS)\n    self._VerifyTestCasesDoNotInterleave(SHUFFLED_FILTERED_TESTS)\n    self._VerifyTestCasesDoNotInterleave(SHUFFLED_SHARDED_TESTS)\n\n  def testShuffleRestoresOrderAfterEachIteration(self):\n    # Get the test lists in all 3 iterations, using random seed 1, 2,\n    # and 3 respectively.  Google Test picks a different seed in each\n    # iteration, and this test depends on the current implementation\n    # picking successive numbers.  This dependency is not ideal, but\n    # makes the test much easier to write.\n    [tests_in_iteration1, tests_in_iteration2, tests_in_iteration3] = (\n        GetTestsForAllIterations(\n            {}, [ShuffleFlag(), RandomSeedFlag(1), RepeatFlag(3)]))\n\n    # Make sure running the tests with random seed 1 gets the same\n    # order as in iteration 1 above.\n    [tests_with_seed1] = GetTestsForAllIterations(\n        {}, [ShuffleFlag(), RandomSeedFlag(1)])\n    self.assertEqual(tests_in_iteration1, tests_with_seed1)\n\n    # Make sure running the tests with random seed 2 gets the same\n    # order as in iteration 2 above.  Success means that Google Test\n    # correctly restores the test order before re-shuffling at the\n    # beginning of iteration 2.\n    [tests_with_seed2] = GetTestsForAllIterations(\n        {}, [ShuffleFlag(), RandomSeedFlag(2)])\n    self.assertEqual(tests_in_iteration2, tests_with_seed2)\n\n    # Make sure running the tests with random seed 3 gets the same\n    # order as in iteration 3 above.  Success means that Google Test\n    # correctly restores the test order before re-shuffling at the\n    # beginning of iteration 3.\n    [tests_with_seed3] = GetTestsForAllIterations(\n        {}, [ShuffleFlag(), RandomSeedFlag(3)])\n    self.assertEqual(tests_in_iteration3, tests_with_seed3)\n\n  def testShuffleGeneratesNewOrderInEachIteration(self):\n    [tests_in_iteration1, tests_in_iteration2, tests_in_iteration3] = (\n        GetTestsForAllIterations(\n            {}, [ShuffleFlag(), RandomSeedFlag(1), RepeatFlag(3)]))\n\n    self.assert_(tests_in_iteration1 != tests_in_iteration2,\n                 tests_in_iteration1)\n    self.assert_(tests_in_iteration1 != tests_in_iteration3,\n                 tests_in_iteration1)\n    self.assert_(tests_in_iteration2 != tests_in_iteration3,\n                 tests_in_iteration2)\n\n  def testShuffleShardedTestsPreservesPartition(self):\n    # If we run M tests on N shards, the same M tests should be run in\n    # total, regardless of the random seeds used by the shards.\n    [tests1] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',\n                                         SHARD_INDEX_ENV_VAR: '0'},\n                                        [ShuffleFlag(), RandomSeedFlag(1)])\n    [tests2] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',\n                                         SHARD_INDEX_ENV_VAR: '1'},\n                                        [ShuffleFlag(), RandomSeedFlag(20)])\n    [tests3] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',\n                                         SHARD_INDEX_ENV_VAR: '2'},\n                                        [ShuffleFlag(), RandomSeedFlag(25)])\n    sorted_sharded_tests = tests1 + tests2 + tests3\n    sorted_sharded_tests.sort()\n    sorted_active_tests = []\n    sorted_active_tests.extend(ACTIVE_TESTS)\n    sorted_active_tests.sort()\n    self.assertEqual(sorted_active_tests, sorted_sharded_tests)\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-shuffle-test_.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Verifies that test shuffling works.\n\n#include \"gtest/gtest.h\"\n\nnamespace {\n\nusing ::testing::EmptyTestEventListener;\nusing ::testing::InitGoogleTest;\nusing ::testing::Message;\nusing ::testing::Test;\nusing ::testing::TestEventListeners;\nusing ::testing::TestInfo;\nusing ::testing::UnitTest;\nusing ::testing::internal::scoped_ptr;\n\n// The test methods are empty, as the sole purpose of this program is\n// to print the test names before/after shuffling.\n\nclass A : public Test {};\nTEST_F(A, A) {}\nTEST_F(A, B) {}\n\nTEST(ADeathTest, A) {}\nTEST(ADeathTest, B) {}\nTEST(ADeathTest, C) {}\n\nTEST(B, A) {}\nTEST(B, B) {}\nTEST(B, C) {}\nTEST(B, DISABLED_D) {}\nTEST(B, DISABLED_E) {}\n\nTEST(BDeathTest, A) {}\nTEST(BDeathTest, B) {}\n\nTEST(C, A) {}\nTEST(C, B) {}\nTEST(C, C) {}\nTEST(C, DISABLED_D) {}\n\nTEST(CDeathTest, A) {}\n\nTEST(DISABLED_D, A) {}\nTEST(DISABLED_D, DISABLED_B) {}\n\n// This printer prints the full test names only, starting each test\n// iteration with a \"----\" marker.\nclass TestNamePrinter : public EmptyTestEventListener {\n public:\n  virtual void OnTestIterationStart(const UnitTest& /* unit_test */,\n                                    int /* iteration */) {\n    printf(\"----\\n\");\n  }\n\n  virtual void OnTestStart(const TestInfo& test_info) {\n    printf(\"%s.%s\\n\", test_info.test_case_name(), test_info.name());\n  }\n};\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  InitGoogleTest(&argc, argv);\n\n  // Replaces the default printer with TestNamePrinter, which prints\n  // the test name only.\n  TestEventListeners& listeners = UnitTest::GetInstance()->listeners();\n  delete listeners.Release(listeners.default_result_printer());\n  listeners.Append(new TestNamePrinter);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-test-part-test.cc",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"gtest/gtest-test-part.h\"\n\n#include \"gtest/gtest.h\"\n\nusing testing::Message;\nusing testing::Test;\nusing testing::TestPartResult;\nusing testing::TestPartResultArray;\n\nnamespace {\n\n// Tests the TestPartResult class.\n\n// The test fixture for testing TestPartResult.\nclass TestPartResultTest : public Test {\n protected:\n  TestPartResultTest()\n      : r1_(TestPartResult::kSuccess, \"foo/bar.cc\", 10, \"Success!\"),\n        r2_(TestPartResult::kNonFatalFailure, \"foo/bar.cc\", -1, \"Failure!\"),\n        r3_(TestPartResult::kFatalFailure, NULL, -1, \"Failure!\") {}\n\n  TestPartResult r1_, r2_, r3_;\n};\n\n\nTEST_F(TestPartResultTest, ConstructorWorks) {\n  Message message;\n  message << \"something is terribly wrong\";\n  message << static_cast<const char*>(testing::internal::kStackTraceMarker);\n  message << \"some unimportant stack trace\";\n\n  const TestPartResult result(TestPartResult::kNonFatalFailure,\n                              \"some_file.cc\",\n                              42,\n                              message.GetString().c_str());\n\n  EXPECT_EQ(TestPartResult::kNonFatalFailure, result.type());\n  EXPECT_STREQ(\"some_file.cc\", result.file_name());\n  EXPECT_EQ(42, result.line_number());\n  EXPECT_STREQ(message.GetString().c_str(), result.message());\n  EXPECT_STREQ(\"something is terribly wrong\", result.summary());\n}\n\nTEST_F(TestPartResultTest, ResultAccessorsWork) {\n  const TestPartResult success(TestPartResult::kSuccess,\n                               \"file.cc\",\n                               42,\n                               \"message\");\n  EXPECT_TRUE(success.passed());\n  EXPECT_FALSE(success.failed());\n  EXPECT_FALSE(success.nonfatally_failed());\n  EXPECT_FALSE(success.fatally_failed());\n\n  const TestPartResult nonfatal_failure(TestPartResult::kNonFatalFailure,\n                                        \"file.cc\",\n                                        42,\n                                        \"message\");\n  EXPECT_FALSE(nonfatal_failure.passed());\n  EXPECT_TRUE(nonfatal_failure.failed());\n  EXPECT_TRUE(nonfatal_failure.nonfatally_failed());\n  EXPECT_FALSE(nonfatal_failure.fatally_failed());\n\n  const TestPartResult fatal_failure(TestPartResult::kFatalFailure,\n                                     \"file.cc\",\n                                     42,\n                                     \"message\");\n  EXPECT_FALSE(fatal_failure.passed());\n  EXPECT_TRUE(fatal_failure.failed());\n  EXPECT_FALSE(fatal_failure.nonfatally_failed());\n  EXPECT_TRUE(fatal_failure.fatally_failed());\n}\n\n// Tests TestPartResult::type().\nTEST_F(TestPartResultTest, type) {\n  EXPECT_EQ(TestPartResult::kSuccess, r1_.type());\n  EXPECT_EQ(TestPartResult::kNonFatalFailure, r2_.type());\n  EXPECT_EQ(TestPartResult::kFatalFailure, r3_.type());\n}\n\n// Tests TestPartResult::file_name().\nTEST_F(TestPartResultTest, file_name) {\n  EXPECT_STREQ(\"foo/bar.cc\", r1_.file_name());\n  EXPECT_STREQ(NULL, r3_.file_name());\n}\n\n// Tests TestPartResult::line_number().\nTEST_F(TestPartResultTest, line_number) {\n  EXPECT_EQ(10, r1_.line_number());\n  EXPECT_EQ(-1, r2_.line_number());\n}\n\n// Tests TestPartResult::message().\nTEST_F(TestPartResultTest, message) {\n  EXPECT_STREQ(\"Success!\", r1_.message());\n}\n\n// Tests TestPartResult::passed().\nTEST_F(TestPartResultTest, Passed) {\n  EXPECT_TRUE(r1_.passed());\n  EXPECT_FALSE(r2_.passed());\n  EXPECT_FALSE(r3_.passed());\n}\n\n// Tests TestPartResult::failed().\nTEST_F(TestPartResultTest, Failed) {\n  EXPECT_FALSE(r1_.failed());\n  EXPECT_TRUE(r2_.failed());\n  EXPECT_TRUE(r3_.failed());\n}\n\n// Tests TestPartResult::fatally_failed().\nTEST_F(TestPartResultTest, FatallyFailed) {\n  EXPECT_FALSE(r1_.fatally_failed());\n  EXPECT_FALSE(r2_.fatally_failed());\n  EXPECT_TRUE(r3_.fatally_failed());\n}\n\n// Tests TestPartResult::nonfatally_failed().\nTEST_F(TestPartResultTest, NonfatallyFailed) {\n  EXPECT_FALSE(r1_.nonfatally_failed());\n  EXPECT_TRUE(r2_.nonfatally_failed());\n  EXPECT_FALSE(r3_.nonfatally_failed());\n}\n\n// Tests the TestPartResultArray class.\n\nclass TestPartResultArrayTest : public Test {\n protected:\n  TestPartResultArrayTest()\n      : r1_(TestPartResult::kNonFatalFailure, \"foo/bar.cc\", -1, \"Failure 1\"),\n        r2_(TestPartResult::kFatalFailure, \"foo/bar.cc\", -1, \"Failure 2\") {}\n\n  const TestPartResult r1_, r2_;\n};\n\n// Tests that TestPartResultArray initially has size 0.\nTEST_F(TestPartResultArrayTest, InitialSizeIsZero) {\n  TestPartResultArray results;\n  EXPECT_EQ(0, results.size());\n}\n\n// Tests that TestPartResultArray contains the given TestPartResult\n// after one Append() operation.\nTEST_F(TestPartResultArrayTest, ContainsGivenResultAfterAppend) {\n  TestPartResultArray results;\n  results.Append(r1_);\n  EXPECT_EQ(1, results.size());\n  EXPECT_STREQ(\"Failure 1\", results.GetTestPartResult(0).message());\n}\n\n// Tests that TestPartResultArray contains the given TestPartResults\n// after two Append() operations.\nTEST_F(TestPartResultArrayTest, ContainsGivenResultsAfterTwoAppends) {\n  TestPartResultArray results;\n  results.Append(r1_);\n  results.Append(r2_);\n  EXPECT_EQ(2, results.size());\n  EXPECT_STREQ(\"Failure 1\", results.GetTestPartResult(0).message());\n  EXPECT_STREQ(\"Failure 2\", results.GetTestPartResult(1).message());\n}\n\ntypedef TestPartResultArrayTest TestPartResultArrayDeathTest;\n\n// Tests that the program dies when GetTestPartResult() is called with\n// an invalid index.\nTEST_F(TestPartResultArrayDeathTest, DiesWhenIndexIsOutOfBound) {\n  TestPartResultArray results;\n  results.Append(r1_);\n\n  EXPECT_DEATH_IF_SUPPORTED(results.GetTestPartResult(-1), \"\");\n  EXPECT_DEATH_IF_SUPPORTED(results.GetTestPartResult(1), \"\");\n}\n\n// FIXME: Add a test for the class HasNewFatalFailureHelper.\n\n}  // namespace\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-test2_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Tests for Google Test itself.  This verifies that the basic constructs of\n// Google Test work.\n\n#include \"gtest/gtest.h\"\n#include \"googletest-param-test-test.h\"\n\nusing ::testing::Values;\nusing ::testing::internal::ParamGenerator;\n\n// Tests that generators defined in a different translation unit\n// are functional. The test using extern_gen_2 is defined\n// in googletest-param-test-test.cc.\nParamGenerator<int> extern_gen_2 = Values(33);\n\n// Tests that a parameterized test case can be defined in one translation unit\n// and instantiated in another. The test is defined in\n// googletest-param-test-test.cc and ExternalInstantiationTest fixture class is\n// defined in gtest-param-test_test.h.\nINSTANTIATE_TEST_CASE_P(MultiplesOf33,\n                        ExternalInstantiationTest,\n                        Values(33, 66));\n\n// Tests that a parameterized test case can be instantiated\n// in multiple translation units. Another instantiation is defined\n// in googletest-param-test-test.cc and\n// InstantiationInMultipleTranslaionUnitsTest fixture is defined in\n// gtest-param-test_test.h\nINSTANTIATE_TEST_CASE_P(Sequence2,\n                        InstantiationInMultipleTranslaionUnitsTest,\n                        Values(42*3, 42*4, 42*5));\n\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-throw-on-failure-test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Tests Google Test's throw-on-failure mode with exceptions disabled.\n\nThis script invokes googletest-throw-on-failure-test_ (a program written with\nGoogle Test) with different environments and command line flags.\n\"\"\"\n\nimport os\nimport gtest_test_utils\n\n\n# Constants.\n\n# The command line flag for enabling/disabling the throw-on-failure mode.\nTHROW_ON_FAILURE = 'gtest_throw_on_failure'\n\n# Path to the googletest-throw-on-failure-test_ program, compiled with\n# exceptions disabled.\nEXE_PATH = gtest_test_utils.GetTestExecutablePath(\n    'googletest-throw-on-failure-test_')\n\n\n# Utilities.\n\n\ndef SetEnvVar(env_var, value):\n  \"\"\"Sets an environment variable to a given value; unsets it when the\n  given value is None.\n  \"\"\"\n\n  env_var = env_var.upper()\n  if value is not None:\n    os.environ[env_var] = value\n  elif env_var in os.environ:\n    del os.environ[env_var]\n\n\ndef Run(command):\n  \"\"\"Runs a command; returns True/False if its exit code is/isn't 0.\"\"\"\n\n  print 'Running \"%s\". . .' % ' '.join(command)\n  p = gtest_test_utils.Subprocess(command)\n  return p.exited and p.exit_code == 0\n\n\n# The tests.  FIXME: refactor the class to share common\n# logic with code in googletest-break-on-failure-unittest.py.\nclass ThrowOnFailureTest(gtest_test_utils.TestCase):\n  \"\"\"Tests the throw-on-failure mode.\"\"\"\n\n  def RunAndVerify(self, env_var_value, flag_value, should_fail):\n    \"\"\"Runs googletest-throw-on-failure-test_ and verifies that it does\n    (or does not) exit with a non-zero code.\n\n    Args:\n      env_var_value:    value of the GTEST_BREAK_ON_FAILURE environment\n                        variable; None if the variable should be unset.\n      flag_value:       value of the --gtest_break_on_failure flag;\n                        None if the flag should not be present.\n      should_fail:      True iff the program is expected to fail.\n    \"\"\"\n\n    SetEnvVar(THROW_ON_FAILURE, env_var_value)\n\n    if env_var_value is None:\n      env_var_value_msg = ' is not set'\n    else:\n      env_var_value_msg = '=' + env_var_value\n\n    if flag_value is None:\n      flag = ''\n    elif flag_value == '0':\n      flag = '--%s=0' % THROW_ON_FAILURE\n    else:\n      flag = '--%s' % THROW_ON_FAILURE\n\n    command = [EXE_PATH]\n    if flag:\n      command.append(flag)\n\n    if should_fail:\n      should_or_not = 'should'\n    else:\n      should_or_not = 'should not'\n\n    failed = not Run(command)\n\n    SetEnvVar(THROW_ON_FAILURE, None)\n\n    msg = ('when %s%s, an assertion failure in \"%s\" %s cause a non-zero '\n           'exit code.' %\n           (THROW_ON_FAILURE, env_var_value_msg, ' '.join(command),\n            should_or_not))\n    self.assert_(failed == should_fail, msg)\n\n  def testDefaultBehavior(self):\n    \"\"\"Tests the behavior of the default mode.\"\"\"\n\n    self.RunAndVerify(env_var_value=None, flag_value=None, should_fail=False)\n\n  def testThrowOnFailureEnvVar(self):\n    \"\"\"Tests using the GTEST_THROW_ON_FAILURE environment variable.\"\"\"\n\n    self.RunAndVerify(env_var_value='0',\n                      flag_value=None,\n                      should_fail=False)\n    self.RunAndVerify(env_var_value='1',\n                      flag_value=None,\n                      should_fail=True)\n\n  def testThrowOnFailureFlag(self):\n    \"\"\"Tests using the --gtest_throw_on_failure flag.\"\"\"\n\n    self.RunAndVerify(env_var_value=None,\n                      flag_value='0',\n                      should_fail=False)\n    self.RunAndVerify(env_var_value=None,\n                      flag_value='1',\n                      should_fail=True)\n\n  def testThrowOnFailureFlagOverridesEnvVar(self):\n    \"\"\"Tests that --gtest_throw_on_failure overrides GTEST_THROW_ON_FAILURE.\"\"\"\n\n    self.RunAndVerify(env_var_value='0',\n                      flag_value='0',\n                      should_fail=False)\n    self.RunAndVerify(env_var_value='0',\n                      flag_value='1',\n                      should_fail=True)\n    self.RunAndVerify(env_var_value='1',\n                      flag_value='0',\n                      should_fail=False)\n    self.RunAndVerify(env_var_value='1',\n                      flag_value='1',\n                      should_fail=True)\n\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-throw-on-failure-test_.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Tests Google Test's throw-on-failure mode with exceptions disabled.\n//\n// This program must be compiled with exceptions disabled.  It will be\n// invoked by googletest-throw-on-failure-test.py, and is expected to exit\n// with non-zero in the throw-on-failure mode or 0 otherwise.\n\n#include \"gtest/gtest.h\"\n\n#include <stdio.h>                      // for fflush, fprintf, NULL, etc.\n#include <stdlib.h>                     // for exit\n#include <exception>                    // for set_terminate\n\n// This terminate handler aborts the program using exit() rather than abort().\n// This avoids showing pop-ups on Windows systems and core dumps on Unix-like\n// ones.\nvoid TerminateHandler() {\n  fprintf(stderr, \"%s\\n\", \"Unhandled C++ exception terminating the program.\");\n  fflush(NULL);\n  exit(1);\n}\n\nint main(int argc, char** argv) {\n#if GTEST_HAS_EXCEPTIONS\n  std::set_terminate(&TerminateHandler);\n#endif\n  testing::InitGoogleTest(&argc, argv);\n\n  // We want to ensure that people can use Google Test assertions in\n  // other testing frameworks, as long as they initialize Google Test\n  // properly and set the throw-on-failure mode.  Therefore, we don't\n  // use Google Test's constructs for defining and running tests\n  // (e.g. TEST and RUN_ALL_TESTS) here.\n\n  // In the throw-on-failure mode with exceptions disabled, this\n  // assertion will cause the program to exit with a non-zero code.\n  EXPECT_EQ(2, 3);\n\n  // When not in the throw-on-failure mode, the control will reach\n  // here.\n  return 0;\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-tuple-test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include \"gtest/internal/gtest-tuple.h\"\n#include <utility>\n#include \"gtest/gtest.h\"\n\nnamespace {\n\nusing ::std::tr1::get;\nusing ::std::tr1::make_tuple;\nusing ::std::tr1::tuple;\nusing ::std::tr1::tuple_element;\nusing ::std::tr1::tuple_size;\nusing ::testing::StaticAssertTypeEq;\n\n// Tests that tuple_element<K, tuple<T0, T1, ..., TN> >::type returns TK.\nTEST(tuple_element_Test, ReturnsElementType) {\n  StaticAssertTypeEq<int, tuple_element<0, tuple<int, char> >::type>();\n  StaticAssertTypeEq<int&, tuple_element<1, tuple<double, int&> >::type>();\n  StaticAssertTypeEq<bool, tuple_element<2, tuple<double, int, bool> >::type>();\n}\n\n// Tests that tuple_size<T>::value gives the number of fields in tuple\n// type T.\nTEST(tuple_size_Test, ReturnsNumberOfFields) {\n  EXPECT_EQ(0, +tuple_size<tuple<> >::value);\n  EXPECT_EQ(1, +tuple_size<tuple<void*> >::value);\n  EXPECT_EQ(1, +tuple_size<tuple<char> >::value);\n  EXPECT_EQ(1, +(tuple_size<tuple<tuple<int, double> > >::value));\n  EXPECT_EQ(2, +(tuple_size<tuple<int&, const char> >::value));\n  EXPECT_EQ(3, +(tuple_size<tuple<char*, void, const bool&> >::value));\n}\n\n// Tests comparing a tuple with itself.\nTEST(ComparisonTest, ComparesWithSelf) {\n  const tuple<int, char, bool> a(5, 'a', false);\n\n  EXPECT_TRUE(a == a);\n  EXPECT_FALSE(a != a);\n}\n\n// Tests comparing two tuples with the same value.\nTEST(ComparisonTest, ComparesEqualTuples) {\n  const tuple<int, bool> a(5, true), b(5, true);\n\n  EXPECT_TRUE(a == b);\n  EXPECT_FALSE(a != b);\n}\n\n// Tests comparing two different tuples that have no reference fields.\nTEST(ComparisonTest, ComparesUnequalTuplesWithoutReferenceFields) {\n  typedef tuple<const int, char> FooTuple;\n\n  const FooTuple a(0, 'x');\n  const FooTuple b(1, 'a');\n\n  EXPECT_TRUE(a != b);\n  EXPECT_FALSE(a == b);\n\n  const FooTuple c(1, 'b');\n\n  EXPECT_TRUE(b != c);\n  EXPECT_FALSE(b == c);\n}\n\n// Tests comparing two different tuples that have reference fields.\nTEST(ComparisonTest, ComparesUnequalTuplesWithReferenceFields) {\n  typedef tuple<int&, const char&> FooTuple;\n\n  int i = 5;\n  const char ch = 'a';\n  const FooTuple a(i, ch);\n\n  int j = 6;\n  const FooTuple b(j, ch);\n\n  EXPECT_TRUE(a != b);\n  EXPECT_FALSE(a == b);\n\n  j = 5;\n  const char ch2 = 'b';\n  const FooTuple c(j, ch2);\n\n  EXPECT_TRUE(b != c);\n  EXPECT_FALSE(b == c);\n}\n\n// Tests that a tuple field with a reference type is an alias of the\n// variable it's supposed to reference.\nTEST(ReferenceFieldTest, IsAliasOfReferencedVariable) {\n  int n = 0;\n  tuple<bool, int&> t(true, n);\n\n  n = 1;\n  EXPECT_EQ(n, get<1>(t))\n      << \"Changing a underlying variable should update the reference field.\";\n\n  // Makes sure that the implementation doesn't do anything funny with\n  // the & operator for the return type of get<>().\n  EXPECT_EQ(&n, &(get<1>(t)))\n      << \"The address of a reference field should equal the address of \"\n      << \"the underlying variable.\";\n\n  get<1>(t) = 2;\n  EXPECT_EQ(2, n)\n      << \"Changing a reference field should update the underlying variable.\";\n}\n\n// Tests that tuple's default constructor default initializes each field.\n// This test needs to compile without generating warnings.\nTEST(TupleConstructorTest, DefaultConstructorDefaultInitializesEachField) {\n  // The TR1 report requires that tuple's default constructor default\n  // initializes each field, even if it's a primitive type.  If the\n  // implementation forgets to do this, this test will catch it by\n  // generating warnings about using uninitialized variables (assuming\n  // a decent compiler).\n\n  tuple<> empty;\n\n  tuple<int> a1, b1;\n  b1 = a1;\n  EXPECT_EQ(0, get<0>(b1));\n\n  tuple<int, double> a2, b2;\n  b2 = a2;\n  EXPECT_EQ(0, get<0>(b2));\n  EXPECT_EQ(0.0, get<1>(b2));\n\n  tuple<double, char, bool*> a3, b3;\n  b3 = a3;\n  EXPECT_EQ(0.0, get<0>(b3));\n  EXPECT_EQ('\\0', get<1>(b3));\n  EXPECT_TRUE(get<2>(b3) == NULL);\n\n  tuple<int, int, int, int, int, int, int, int, int, int> a10, b10;\n  b10 = a10;\n  EXPECT_EQ(0, get<0>(b10));\n  EXPECT_EQ(0, get<1>(b10));\n  EXPECT_EQ(0, get<2>(b10));\n  EXPECT_EQ(0, get<3>(b10));\n  EXPECT_EQ(0, get<4>(b10));\n  EXPECT_EQ(0, get<5>(b10));\n  EXPECT_EQ(0, get<6>(b10));\n  EXPECT_EQ(0, get<7>(b10));\n  EXPECT_EQ(0, get<8>(b10));\n  EXPECT_EQ(0, get<9>(b10));\n}\n\n// Tests constructing a tuple from its fields.\nTEST(TupleConstructorTest, ConstructsFromFields) {\n  int n = 1;\n  // Reference field.\n  tuple<int&> a(n);\n  EXPECT_EQ(&n, &(get<0>(a)));\n\n  // Non-reference fields.\n  tuple<int, char> b(5, 'a');\n  EXPECT_EQ(5, get<0>(b));\n  EXPECT_EQ('a', get<1>(b));\n\n  // Const reference field.\n  const int m = 2;\n  tuple<bool, const int&> c(true, m);\n  EXPECT_TRUE(get<0>(c));\n  EXPECT_EQ(&m, &(get<1>(c)));\n}\n\n// Tests tuple's copy constructor.\nTEST(TupleConstructorTest, CopyConstructor) {\n  tuple<double, bool> a(0.0, true);\n  tuple<double, bool> b(a);\n\n  EXPECT_DOUBLE_EQ(0.0, get<0>(b));\n  EXPECT_TRUE(get<1>(b));\n}\n\n// Tests constructing a tuple from another tuple that has a compatible\n// but different type.\nTEST(TupleConstructorTest, ConstructsFromDifferentTupleType) {\n  tuple<int, int, char> a(0, 1, 'a');\n  tuple<double, long, int> b(a);\n\n  EXPECT_DOUBLE_EQ(0.0, get<0>(b));\n  EXPECT_EQ(1, get<1>(b));\n  EXPECT_EQ('a', get<2>(b));\n}\n\n// Tests constructing a 2-tuple from an std::pair.\nTEST(TupleConstructorTest, ConstructsFromPair) {\n  ::std::pair<int, char> a(1, 'a');\n  tuple<int, char> b(a);\n  tuple<int, const char&> c(a);\n}\n\n// Tests assigning a tuple to another tuple with the same type.\nTEST(TupleAssignmentTest, AssignsToSameTupleType) {\n  const tuple<int, long> a(5, 7L);\n  tuple<int, long> b;\n  b = a;\n  EXPECT_EQ(5, get<0>(b));\n  EXPECT_EQ(7L, get<1>(b));\n}\n\n// Tests assigning a tuple to another tuple with a different but\n// compatible type.\nTEST(TupleAssignmentTest, AssignsToDifferentTupleType) {\n  const tuple<int, long, bool> a(1, 7L, true);\n  tuple<long, int, bool> b;\n  b = a;\n  EXPECT_EQ(1L, get<0>(b));\n  EXPECT_EQ(7, get<1>(b));\n  EXPECT_TRUE(get<2>(b));\n}\n\n// Tests assigning an std::pair to a 2-tuple.\nTEST(TupleAssignmentTest, AssignsFromPair) {\n  const ::std::pair<int, bool> a(5, true);\n  tuple<int, bool> b;\n  b = a;\n  EXPECT_EQ(5, get<0>(b));\n  EXPECT_TRUE(get<1>(b));\n\n  tuple<long, bool> c;\n  c = a;\n  EXPECT_EQ(5L, get<0>(c));\n  EXPECT_TRUE(get<1>(c));\n}\n\n// A fixture for testing big tuples.\nclass BigTupleTest : public testing::Test {\n protected:\n  typedef tuple<int, int, int, int, int, int, int, int, int, int> BigTuple;\n\n  BigTupleTest() :\n      a_(1, 0, 0, 0, 0, 0, 0, 0, 0, 2),\n      b_(1, 0, 0, 0, 0, 0, 0, 0, 0, 3) {}\n\n  BigTuple a_, b_;\n};\n\n// Tests constructing big tuples.\nTEST_F(BigTupleTest, Construction) {\n  BigTuple a;\n  BigTuple b(b_);\n}\n\n// Tests that get<N>(t) returns the N-th (0-based) field of tuple t.\nTEST_F(BigTupleTest, get) {\n  EXPECT_EQ(1, get<0>(a_));\n  EXPECT_EQ(2, get<9>(a_));\n\n  // Tests that get() works on a const tuple too.\n  const BigTuple a(a_);\n  EXPECT_EQ(1, get<0>(a));\n  EXPECT_EQ(2, get<9>(a));\n}\n\n// Tests comparing big tuples.\nTEST_F(BigTupleTest, Comparisons) {\n  EXPECT_TRUE(a_ == a_);\n  EXPECT_FALSE(a_ != a_);\n\n  EXPECT_TRUE(a_ != b_);\n  EXPECT_FALSE(a_ == b_);\n}\n\nTEST(MakeTupleTest, WorksForScalarTypes) {\n  tuple<bool, int> a;\n  a = make_tuple(true, 5);\n  EXPECT_TRUE(get<0>(a));\n  EXPECT_EQ(5, get<1>(a));\n\n  tuple<char, int, long> b;\n  b = make_tuple('a', 'b', 5);\n  EXPECT_EQ('a', get<0>(b));\n  EXPECT_EQ('b', get<1>(b));\n  EXPECT_EQ(5, get<2>(b));\n}\n\nTEST(MakeTupleTest, WorksForPointers) {\n  int a[] = { 1, 2, 3, 4 };\n  const char* const str = \"hi\";\n  int* const p = a;\n\n  tuple<const char*, int*> t;\n  t = make_tuple(str, p);\n  EXPECT_EQ(str, get<0>(t));\n  EXPECT_EQ(p, get<1>(t));\n}\n\n}  // namespace\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-uninitialized-test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Verifies that Google Test warns the user when not initialized properly.\"\"\"\n\nimport gtest_test_utils\n\nCOMMAND = gtest_test_utils.GetTestExecutablePath('googletest-uninitialized-test_')\n\n\ndef Assert(condition):\n  if not condition:\n    raise AssertionError\n\n\ndef AssertEq(expected, actual):\n  if expected != actual:\n    print 'Expected: %s' % (expected,)\n    print '  Actual: %s' % (actual,)\n    raise AssertionError\n\n\ndef TestExitCodeAndOutput(command):\n  \"\"\"Runs the given command and verifies its exit code and output.\"\"\"\n\n  # Verifies that 'command' exits with code 1.\n  p = gtest_test_utils.Subprocess(command)\n  if p.exited and p.exit_code == 0:\n    Assert('IMPORTANT NOTICE' in p.output);\n  Assert('InitGoogleTest' in p.output)\n\n\nclass GTestUninitializedTest(gtest_test_utils.TestCase):\n  def testExitCodeAndOutput(self):\n    TestExitCodeAndOutput(COMMAND)\n\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/googletest-uninitialized-test_.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include \"gtest/gtest.h\"\n\nTEST(DummyTest, Dummy) {\n  // This test doesn't verify anything.  We just need it to create a\n  // realistic stage for testing the behavior of Google Test when\n  // RUN_ALL_TESTS() is called without\n  // testing::InitGoogleTest() being called first.\n}\n\nint main() {\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest-typed-test2_test.cc",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include <vector>\n\n#include \"test/gtest-typed-test_test.h\"\n#include \"gtest/gtest.h\"\n\n#if GTEST_HAS_TYPED_TEST_P\n\n// Tests that the same type-parameterized test case can be\n// instantiated in different translation units linked together.\n// (ContainerTest is also instantiated in gtest-typed-test_test.cc.)\nINSTANTIATE_TYPED_TEST_CASE_P(Vector, ContainerTest,\n                              testing::Types<std::vector<int> >);\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest-typed-test_test.cc",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include \"test/gtest-typed-test_test.h\"\n\n#include <set>\n#include <vector>\n\n#include \"gtest/gtest.h\"\n\n#if _MSC_VER\nGTEST_DISABLE_MSC_WARNINGS_PUSH_(4127 /* conditional expression is constant */)\n#endif  //  _MSC_VER\n\nusing testing::Test;\n\n// Used for testing that SetUpTestCase()/TearDownTestCase(), fixture\n// ctor/dtor, and SetUp()/TearDown() work correctly in typed tests and\n// type-parameterized test.\ntemplate <typename T>\nclass CommonTest : public Test {\n  // For some technical reason, SetUpTestCase() and TearDownTestCase()\n  // must be public.\n public:\n  static void SetUpTestCase() {\n    shared_ = new T(5);\n  }\n\n  static void TearDownTestCase() {\n    delete shared_;\n    shared_ = NULL;\n  }\n\n  // This 'protected:' is optional.  There's no harm in making all\n  // members of this fixture class template public.\n protected:\n  // We used to use std::list here, but switched to std::vector since\n  // MSVC's <list> doesn't compile cleanly with /W4.\n  typedef std::vector<T> Vector;\n  typedef std::set<int> IntSet;\n\n  CommonTest() : value_(1) {}\n\n  virtual ~CommonTest() { EXPECT_EQ(3, value_); }\n\n  virtual void SetUp() {\n    EXPECT_EQ(1, value_);\n    value_++;\n  }\n\n  virtual void TearDown() {\n    EXPECT_EQ(2, value_);\n    value_++;\n  }\n\n  T value_;\n  static T* shared_;\n};\n\ntemplate <typename T>\nT* CommonTest<T>::shared_ = NULL;\n\n// This #ifdef block tests typed tests.\n#if GTEST_HAS_TYPED_TEST\n\nusing testing::Types;\n\n// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor,\n// and SetUp()/TearDown() work correctly in typed tests\n\ntypedef Types<char, int> TwoTypes;\nTYPED_TEST_CASE(CommonTest, TwoTypes);\n\nTYPED_TEST(CommonTest, ValuesAreCorrect) {\n  // Static members of the fixture class template can be visited via\n  // the TestFixture:: prefix.\n  EXPECT_EQ(5, *TestFixture::shared_);\n\n  // Typedefs in the fixture class template can be visited via the\n  // \"typename TestFixture::\" prefix.\n  typename TestFixture::Vector empty;\n  EXPECT_EQ(0U, empty.size());\n\n  typename TestFixture::IntSet empty2;\n  EXPECT_EQ(0U, empty2.size());\n\n  // Non-static members of the fixture class must be visited via\n  // 'this', as required by C++ for class templates.\n  EXPECT_EQ(2, this->value_);\n}\n\n// The second test makes sure shared_ is not deleted after the first\n// test.\nTYPED_TEST(CommonTest, ValuesAreStillCorrect) {\n  // Static members of the fixture class template can also be visited\n  // via 'this'.\n  ASSERT_TRUE(this->shared_ != NULL);\n  EXPECT_EQ(5, *this->shared_);\n\n  // TypeParam can be used to refer to the type parameter.\n  EXPECT_EQ(static_cast<TypeParam>(2), this->value_);\n}\n\n// Tests that multiple TYPED_TEST_CASE's can be defined in the same\n// translation unit.\n\ntemplate <typename T>\nclass TypedTest1 : public Test {\n};\n\n// Verifies that the second argument of TYPED_TEST_CASE can be a\n// single type.\nTYPED_TEST_CASE(TypedTest1, int);\nTYPED_TEST(TypedTest1, A) {}\n\ntemplate <typename T>\nclass TypedTest2 : public Test {\n};\n\n// Verifies that the second argument of TYPED_TEST_CASE can be a\n// Types<...> type list.\nTYPED_TEST_CASE(TypedTest2, Types<int>);\n\n// This also verifies that tests from different typed test cases can\n// share the same name.\nTYPED_TEST(TypedTest2, A) {}\n\n// Tests that a typed test case can be defined in a namespace.\n\nnamespace library1 {\n\ntemplate <typename T>\nclass NumericTest : public Test {\n};\n\ntypedef Types<int, long> NumericTypes;\nTYPED_TEST_CASE(NumericTest, NumericTypes);\n\nTYPED_TEST(NumericTest, DefaultIsZero) {\n  EXPECT_EQ(0, TypeParam());\n}\n\n}  // namespace library1\n\n// Tests that custom names work.\ntemplate <typename T>\nclass TypedTestWithNames : public Test {};\n\nclass TypedTestNames {\n public:\n  template <typename T>\n  static std::string GetName(int i) {\n    if (testing::internal::IsSame<T, char>::value) {\n      return std::string(\"char\") + ::testing::PrintToString(i);\n    }\n    if (testing::internal::IsSame<T, int>::value) {\n      return std::string(\"int\") + ::testing::PrintToString(i);\n    }\n  }\n};\n\nTYPED_TEST_CASE(TypedTestWithNames, TwoTypes, TypedTestNames);\n\nTYPED_TEST(TypedTestWithNames, TestCaseName) {\n  if (testing::internal::IsSame<TypeParam, char>::value) {\n    EXPECT_STREQ(::testing::UnitTest::GetInstance()\n                     ->current_test_info()\n                     ->test_case_name(),\n                 \"TypedTestWithNames/char0\");\n  }\n  if (testing::internal::IsSame<TypeParam, int>::value) {\n    EXPECT_STREQ(::testing::UnitTest::GetInstance()\n                     ->current_test_info()\n                     ->test_case_name(),\n                 \"TypedTestWithNames/int1\");\n  }\n}\n\n#endif  // GTEST_HAS_TYPED_TEST\n\n// This #ifdef block tests type-parameterized tests.\n#if GTEST_HAS_TYPED_TEST_P\n\nusing testing::Types;\nusing testing::internal::TypedTestCasePState;\n\n// Tests TypedTestCasePState.\n\nclass TypedTestCasePStateTest : public Test {\n protected:\n  virtual void SetUp() {\n    state_.AddTestName(\"foo.cc\", 0, \"FooTest\", \"A\");\n    state_.AddTestName(\"foo.cc\", 0, \"FooTest\", \"B\");\n    state_.AddTestName(\"foo.cc\", 0, \"FooTest\", \"C\");\n  }\n\n  TypedTestCasePState state_;\n};\n\nTEST_F(TypedTestCasePStateTest, SucceedsForMatchingList) {\n  const char* tests = \"A, B, C\";\n  EXPECT_EQ(tests,\n            state_.VerifyRegisteredTestNames(\"foo.cc\", 1, tests));\n}\n\n// Makes sure that the order of the tests and spaces around the names\n// don't matter.\nTEST_F(TypedTestCasePStateTest, IgnoresOrderAndSpaces) {\n  const char* tests = \"A,C,   B\";\n  EXPECT_EQ(tests,\n            state_.VerifyRegisteredTestNames(\"foo.cc\", 1, tests));\n}\n\ntypedef TypedTestCasePStateTest TypedTestCasePStateDeathTest;\n\nTEST_F(TypedTestCasePStateDeathTest, DetectsDuplicates) {\n  EXPECT_DEATH_IF_SUPPORTED(\n      state_.VerifyRegisteredTestNames(\"foo.cc\", 1, \"A, B, A, C\"),\n      \"foo\\\\.cc.1.?: Test A is listed more than once\\\\.\");\n}\n\nTEST_F(TypedTestCasePStateDeathTest, DetectsExtraTest) {\n  EXPECT_DEATH_IF_SUPPORTED(\n      state_.VerifyRegisteredTestNames(\"foo.cc\", 1, \"A, B, C, D\"),\n      \"foo\\\\.cc.1.?: No test named D can be found in this test case\\\\.\");\n}\n\nTEST_F(TypedTestCasePStateDeathTest, DetectsMissedTest) {\n  EXPECT_DEATH_IF_SUPPORTED(\n      state_.VerifyRegisteredTestNames(\"foo.cc\", 1, \"A, C\"),\n      \"foo\\\\.cc.1.?: You forgot to list test B\\\\.\");\n}\n\n// Tests that defining a test for a parameterized test case generates\n// a run-time error if the test case has been registered.\nTEST_F(TypedTestCasePStateDeathTest, DetectsTestAfterRegistration) {\n  state_.VerifyRegisteredTestNames(\"foo.cc\", 1, \"A, B, C\");\n  EXPECT_DEATH_IF_SUPPORTED(\n      state_.AddTestName(\"foo.cc\", 2, \"FooTest\", \"D\"),\n      \"foo\\\\.cc.2.?: Test D must be defined before REGISTER_TYPED_TEST_CASE_P\"\n      \"\\\\(FooTest, \\\\.\\\\.\\\\.\\\\)\\\\.\");\n}\n\n// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor,\n// and SetUp()/TearDown() work correctly in type-parameterized tests.\n\ntemplate <typename T>\nclass DerivedTest : public CommonTest<T> {\n};\n\nTYPED_TEST_CASE_P(DerivedTest);\n\nTYPED_TEST_P(DerivedTest, ValuesAreCorrect) {\n  // Static members of the fixture class template can be visited via\n  // the TestFixture:: prefix.\n  EXPECT_EQ(5, *TestFixture::shared_);\n\n  // Non-static members of the fixture class must be visited via\n  // 'this', as required by C++ for class templates.\n  EXPECT_EQ(2, this->value_);\n}\n\n// The second test makes sure shared_ is not deleted after the first\n// test.\nTYPED_TEST_P(DerivedTest, ValuesAreStillCorrect) {\n  // Static members of the fixture class template can also be visited\n  // via 'this'.\n  ASSERT_TRUE(this->shared_ != NULL);\n  EXPECT_EQ(5, *this->shared_);\n  EXPECT_EQ(2, this->value_);\n}\n\nREGISTER_TYPED_TEST_CASE_P(DerivedTest,\n                           ValuesAreCorrect, ValuesAreStillCorrect);\n\ntypedef Types<short, long> MyTwoTypes;\nINSTANTIATE_TYPED_TEST_CASE_P(My, DerivedTest, MyTwoTypes);\n\n// Tests that custom names work with type parametrized tests. We reuse the\n// TwoTypes from above here.\ntemplate <typename T>\nclass TypeParametrizedTestWithNames : public Test {};\n\nTYPED_TEST_CASE_P(TypeParametrizedTestWithNames);\n\nTYPED_TEST_P(TypeParametrizedTestWithNames, TestCaseName) {\n  if (testing::internal::IsSame<TypeParam, char>::value) {\n    EXPECT_STREQ(::testing::UnitTest::GetInstance()\n                     ->current_test_info()\n                     ->test_case_name(),\n                 \"CustomName/TypeParametrizedTestWithNames/parChar0\");\n  }\n  if (testing::internal::IsSame<TypeParam, int>::value) {\n    EXPECT_STREQ(::testing::UnitTest::GetInstance()\n                     ->current_test_info()\n                     ->test_case_name(),\n                 \"CustomName/TypeParametrizedTestWithNames/parInt1\");\n  }\n}\n\nREGISTER_TYPED_TEST_CASE_P(TypeParametrizedTestWithNames, TestCaseName);\n\nclass TypeParametrizedTestNames {\n public:\n  template <typename T>\n  static std::string GetName(int i) {\n    if (testing::internal::IsSame<T, char>::value) {\n      return std::string(\"parChar\") + ::testing::PrintToString(i);\n    }\n    if (testing::internal::IsSame<T, int>::value) {\n      return std::string(\"parInt\") + ::testing::PrintToString(i);\n    }\n  }\n};\n\nINSTANTIATE_TYPED_TEST_CASE_P(CustomName, TypeParametrizedTestWithNames,\n                              TwoTypes, TypeParametrizedTestNames);\n\n// Tests that multiple TYPED_TEST_CASE_P's can be defined in the same\n// translation unit.\n\ntemplate <typename T>\nclass TypedTestP1 : public Test {\n};\n\nTYPED_TEST_CASE_P(TypedTestP1);\n\n// For testing that the code between TYPED_TEST_CASE_P() and\n// TYPED_TEST_P() is not enclosed in a namespace.\ntypedef int IntAfterTypedTestCaseP;\n\nTYPED_TEST_P(TypedTestP1, A) {}\nTYPED_TEST_P(TypedTestP1, B) {}\n\n// For testing that the code between TYPED_TEST_P() and\n// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace.\ntypedef int IntBeforeRegisterTypedTestCaseP;\n\nREGISTER_TYPED_TEST_CASE_P(TypedTestP1, A, B);\n\ntemplate <typename T>\nclass TypedTestP2 : public Test {\n};\n\nTYPED_TEST_CASE_P(TypedTestP2);\n\n// This also verifies that tests from different type-parameterized\n// test cases can share the same name.\nTYPED_TEST_P(TypedTestP2, A) {}\n\nREGISTER_TYPED_TEST_CASE_P(TypedTestP2, A);\n\n// Verifies that the code between TYPED_TEST_CASE_P() and\n// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace.\nIntAfterTypedTestCaseP after = 0;\nIntBeforeRegisterTypedTestCaseP before = 0;\n\n// Verifies that the last argument of INSTANTIATE_TYPED_TEST_CASE_P()\n// can be either a single type or a Types<...> type list.\nINSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP1, int);\nINSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP2, Types<int>);\n\n// Tests that the same type-parameterized test case can be\n// instantiated more than once in the same translation unit.\nINSTANTIATE_TYPED_TEST_CASE_P(Double, TypedTestP2, Types<double>);\n\n// Tests that the same type-parameterized test case can be\n// instantiated in different translation units linked together.\n// (ContainerTest is also instantiated in gtest-typed-test_test.cc.)\ntypedef Types<std::vector<double>, std::set<char> > MyContainers;\nINSTANTIATE_TYPED_TEST_CASE_P(My, ContainerTest, MyContainers);\n\n// Tests that a type-parameterized test case can be defined and\n// instantiated in a namespace.\n\nnamespace library2 {\n\ntemplate <typename T>\nclass NumericTest : public Test {\n};\n\nTYPED_TEST_CASE_P(NumericTest);\n\nTYPED_TEST_P(NumericTest, DefaultIsZero) {\n  EXPECT_EQ(0, TypeParam());\n}\n\nTYPED_TEST_P(NumericTest, ZeroIsLessThanOne) {\n  EXPECT_LT(TypeParam(0), TypeParam(1));\n}\n\nREGISTER_TYPED_TEST_CASE_P(NumericTest,\n                           DefaultIsZero, ZeroIsLessThanOne);\ntypedef Types<int, double> NumericTypes;\nINSTANTIATE_TYPED_TEST_CASE_P(My, NumericTest, NumericTypes);\n\nstatic const char* GetTestName() {\n  return testing::UnitTest::GetInstance()->current_test_info()->name();\n}\n// Test the stripping of space from test names\ntemplate <typename T> class TrimmedTest : public Test { };\nTYPED_TEST_CASE_P(TrimmedTest);\nTYPED_TEST_P(TrimmedTest, Test1) { EXPECT_STREQ(\"Test1\", GetTestName()); }\nTYPED_TEST_P(TrimmedTest, Test2) { EXPECT_STREQ(\"Test2\", GetTestName()); }\nTYPED_TEST_P(TrimmedTest, Test3) { EXPECT_STREQ(\"Test3\", GetTestName()); }\nTYPED_TEST_P(TrimmedTest, Test4) { EXPECT_STREQ(\"Test4\", GetTestName()); }\nTYPED_TEST_P(TrimmedTest, Test5) { EXPECT_STREQ(\"Test5\", GetTestName()); }\nREGISTER_TYPED_TEST_CASE_P(\n    TrimmedTest,\n    Test1, Test2,Test3 , Test4 ,Test5 );  // NOLINT\ntemplate <typename T1, typename T2> struct MyPair {};\n// Be sure to try a type with a comma in its name just in case it matters.\ntypedef Types<int, double, MyPair<int, int> > TrimTypes;\nINSTANTIATE_TYPED_TEST_CASE_P(My, TrimmedTest, TrimTypes);\n\n}  // namespace library2\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n\n#if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P)\n\n// Google Test may not support type-parameterized tests with some\n// compilers. If we use conditional compilation to compile out all\n// code referring to the gtest_main library, MSVC linker will not link\n// that library at all and consequently complain about missing entry\n// point defined in that library (fatal error LNK1561: entry point\n// must be defined). This dummy test keeps gtest_main linked in.\nTEST(DummyTest, TypedTestsAreNotSupportedOnThisPlatform) {}\n\n#if _MSC_VER\nGTEST_DISABLE_MSC_WARNINGS_POP_()  //  4127\n#endif                             //  _MSC_VER\n\n#endif  // #if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P)\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest-typed-test_test.h",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#ifndef GTEST_TEST_GTEST_TYPED_TEST_TEST_H_\n#define GTEST_TEST_GTEST_TYPED_TEST_TEST_H_\n\n#include \"gtest/gtest.h\"\n\n#if GTEST_HAS_TYPED_TEST_P\n\nusing testing::Test;\n\n// For testing that the same type-parameterized test case can be\n// instantiated in different translation units linked together.\n// ContainerTest will be instantiated in both gtest-typed-test_test.cc\n// and gtest-typed-test2_test.cc.\n\ntemplate <typename T>\nclass ContainerTest : public Test {\n};\n\nTYPED_TEST_CASE_P(ContainerTest);\n\nTYPED_TEST_P(ContainerTest, CanBeDefaultConstructed) {\n  TypeParam container;\n}\n\nTYPED_TEST_P(ContainerTest, InitialSizeIsZero) {\n  TypeParam container;\n  EXPECT_EQ(0U, container.size());\n}\n\nREGISTER_TYPED_TEST_CASE_P(ContainerTest,\n                           CanBeDefaultConstructed, InitialSizeIsZero);\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n\n#endif  // GTEST_TEST_GTEST_TYPED_TEST_TEST_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest-unittest-api_test.cc",
    "content": "// Copyright 2009 Google Inc.  All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// The Google C++ Testing and Mocking Framework (Google Test)\n//\n// This file contains tests verifying correctness of data provided via\n// UnitTest's public methods.\n\n#include \"gtest/gtest.h\"\n\n#include <string.h>  // For strcmp.\n#include <algorithm>\n\nusing ::testing::InitGoogleTest;\n\nnamespace testing {\nnamespace internal {\n\ntemplate <typename T>\nstruct LessByName {\n  bool operator()(const T* a, const T* b) {\n    return strcmp(a->name(), b->name()) < 0;\n  }\n};\n\nclass UnitTestHelper {\n public:\n  // Returns the array of pointers to all test cases sorted by the test case\n  // name.  The caller is responsible for deleting the array.\n  static TestCase const** GetSortedTestCases() {\n    UnitTest& unit_test = *UnitTest::GetInstance();\n    TestCase const** const test_cases =\n        new const TestCase*[unit_test.total_test_case_count()];\n\n    for (int i = 0; i < unit_test.total_test_case_count(); ++i)\n      test_cases[i] = unit_test.GetTestCase(i);\n\n    std::sort(test_cases,\n              test_cases + unit_test.total_test_case_count(),\n              LessByName<TestCase>());\n    return test_cases;\n  }\n\n  // Returns the test case by its name.  The caller doesn't own the returned\n  // pointer.\n  static const TestCase* FindTestCase(const char* name) {\n    UnitTest& unit_test = *UnitTest::GetInstance();\n    for (int i = 0; i < unit_test.total_test_case_count(); ++i) {\n      const TestCase* test_case = unit_test.GetTestCase(i);\n      if (0 == strcmp(test_case->name(), name))\n        return test_case;\n    }\n    return NULL;\n  }\n\n  // Returns the array of pointers to all tests in a particular test case\n  // sorted by the test name.  The caller is responsible for deleting the\n  // array.\n  static TestInfo const** GetSortedTests(const TestCase* test_case) {\n    TestInfo const** const tests =\n        new const TestInfo*[test_case->total_test_count()];\n\n    for (int i = 0; i < test_case->total_test_count(); ++i)\n      tests[i] = test_case->GetTestInfo(i);\n\n    std::sort(tests, tests + test_case->total_test_count(),\n              LessByName<TestInfo>());\n    return tests;\n  }\n};\n\n#if GTEST_HAS_TYPED_TEST\ntemplate <typename T> class TestCaseWithCommentTest : public Test {};\nTYPED_TEST_CASE(TestCaseWithCommentTest, Types<int>);\nTYPED_TEST(TestCaseWithCommentTest, Dummy) {}\n\nconst int kTypedTestCases = 1;\nconst int kTypedTests = 1;\n#else\nconst int kTypedTestCases = 0;\nconst int kTypedTests = 0;\n#endif  // GTEST_HAS_TYPED_TEST\n\n// We can only test the accessors that do not change value while tests run.\n// Since tests can be run in any order, the values the accessors that track\n// test execution (such as failed_test_count) can not be predicted.\nTEST(ApiTest, UnitTestImmutableAccessorsWork) {\n  UnitTest* unit_test = UnitTest::GetInstance();\n\n  ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count());\n  EXPECT_EQ(1 + kTypedTestCases, unit_test->test_case_to_run_count());\n  EXPECT_EQ(2, unit_test->disabled_test_count());\n  EXPECT_EQ(5 + kTypedTests, unit_test->total_test_count());\n  EXPECT_EQ(3 + kTypedTests, unit_test->test_to_run_count());\n\n  const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases();\n\n  EXPECT_STREQ(\"ApiTest\", test_cases[0]->name());\n  EXPECT_STREQ(\"DISABLED_Test\", test_cases[1]->name());\n#if GTEST_HAS_TYPED_TEST\n  EXPECT_STREQ(\"TestCaseWithCommentTest/0\", test_cases[2]->name());\n#endif  // GTEST_HAS_TYPED_TEST\n\n  delete[] test_cases;\n\n  // The following lines initiate actions to verify certain methods in\n  // FinalSuccessChecker::TearDown.\n\n  // Records a test property to verify TestResult::GetTestProperty().\n  RecordProperty(\"key\", \"value\");\n}\n\nAssertionResult IsNull(const char* str) {\n  if (str != NULL) {\n    return testing::AssertionFailure() << \"argument is \" << str;\n  }\n  return AssertionSuccess();\n}\n\nTEST(ApiTest, TestCaseImmutableAccessorsWork) {\n  const TestCase* test_case = UnitTestHelper::FindTestCase(\"ApiTest\");\n  ASSERT_TRUE(test_case != NULL);\n\n  EXPECT_STREQ(\"ApiTest\", test_case->name());\n  EXPECT_TRUE(IsNull(test_case->type_param()));\n  EXPECT_TRUE(test_case->should_run());\n  EXPECT_EQ(1, test_case->disabled_test_count());\n  EXPECT_EQ(3, test_case->test_to_run_count());\n  ASSERT_EQ(4, test_case->total_test_count());\n\n  const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case);\n\n  EXPECT_STREQ(\"DISABLED_Dummy1\", tests[0]->name());\n  EXPECT_STREQ(\"ApiTest\", tests[0]->test_case_name());\n  EXPECT_TRUE(IsNull(tests[0]->value_param()));\n  EXPECT_TRUE(IsNull(tests[0]->type_param()));\n  EXPECT_FALSE(tests[0]->should_run());\n\n  EXPECT_STREQ(\"TestCaseDisabledAccessorsWork\", tests[1]->name());\n  EXPECT_STREQ(\"ApiTest\", tests[1]->test_case_name());\n  EXPECT_TRUE(IsNull(tests[1]->value_param()));\n  EXPECT_TRUE(IsNull(tests[1]->type_param()));\n  EXPECT_TRUE(tests[1]->should_run());\n\n  EXPECT_STREQ(\"TestCaseImmutableAccessorsWork\", tests[2]->name());\n  EXPECT_STREQ(\"ApiTest\", tests[2]->test_case_name());\n  EXPECT_TRUE(IsNull(tests[2]->value_param()));\n  EXPECT_TRUE(IsNull(tests[2]->type_param()));\n  EXPECT_TRUE(tests[2]->should_run());\n\n  EXPECT_STREQ(\"UnitTestImmutableAccessorsWork\", tests[3]->name());\n  EXPECT_STREQ(\"ApiTest\", tests[3]->test_case_name());\n  EXPECT_TRUE(IsNull(tests[3]->value_param()));\n  EXPECT_TRUE(IsNull(tests[3]->type_param()));\n  EXPECT_TRUE(tests[3]->should_run());\n\n  delete[] tests;\n  tests = NULL;\n\n#if GTEST_HAS_TYPED_TEST\n  test_case = UnitTestHelper::FindTestCase(\"TestCaseWithCommentTest/0\");\n  ASSERT_TRUE(test_case != NULL);\n\n  EXPECT_STREQ(\"TestCaseWithCommentTest/0\", test_case->name());\n  EXPECT_STREQ(GetTypeName<int>().c_str(), test_case->type_param());\n  EXPECT_TRUE(test_case->should_run());\n  EXPECT_EQ(0, test_case->disabled_test_count());\n  EXPECT_EQ(1, test_case->test_to_run_count());\n  ASSERT_EQ(1, test_case->total_test_count());\n\n  tests = UnitTestHelper::GetSortedTests(test_case);\n\n  EXPECT_STREQ(\"Dummy\", tests[0]->name());\n  EXPECT_STREQ(\"TestCaseWithCommentTest/0\", tests[0]->test_case_name());\n  EXPECT_TRUE(IsNull(tests[0]->value_param()));\n  EXPECT_STREQ(GetTypeName<int>().c_str(), tests[0]->type_param());\n  EXPECT_TRUE(tests[0]->should_run());\n\n  delete[] tests;\n#endif  // GTEST_HAS_TYPED_TEST\n}\n\nTEST(ApiTest, TestCaseDisabledAccessorsWork) {\n  const TestCase* test_case = UnitTestHelper::FindTestCase(\"DISABLED_Test\");\n  ASSERT_TRUE(test_case != NULL);\n\n  EXPECT_STREQ(\"DISABLED_Test\", test_case->name());\n  EXPECT_TRUE(IsNull(test_case->type_param()));\n  EXPECT_FALSE(test_case->should_run());\n  EXPECT_EQ(1, test_case->disabled_test_count());\n  EXPECT_EQ(0, test_case->test_to_run_count());\n  ASSERT_EQ(1, test_case->total_test_count());\n\n  const TestInfo* const test_info = test_case->GetTestInfo(0);\n  EXPECT_STREQ(\"Dummy2\", test_info->name());\n  EXPECT_STREQ(\"DISABLED_Test\", test_info->test_case_name());\n  EXPECT_TRUE(IsNull(test_info->value_param()));\n  EXPECT_TRUE(IsNull(test_info->type_param()));\n  EXPECT_FALSE(test_info->should_run());\n}\n\n// These two tests are here to provide support for testing\n// test_case_to_run_count, disabled_test_count, and test_to_run_count.\nTEST(ApiTest, DISABLED_Dummy1) {}\nTEST(DISABLED_Test, Dummy2) {}\n\nclass FinalSuccessChecker : public Environment {\n protected:\n  virtual void TearDown() {\n    UnitTest* unit_test = UnitTest::GetInstance();\n\n    EXPECT_EQ(1 + kTypedTestCases, unit_test->successful_test_case_count());\n    EXPECT_EQ(3 + kTypedTests, unit_test->successful_test_count());\n    EXPECT_EQ(0, unit_test->failed_test_case_count());\n    EXPECT_EQ(0, unit_test->failed_test_count());\n    EXPECT_TRUE(unit_test->Passed());\n    EXPECT_FALSE(unit_test->Failed());\n    ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count());\n\n    const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases();\n\n    EXPECT_STREQ(\"ApiTest\", test_cases[0]->name());\n    EXPECT_TRUE(IsNull(test_cases[0]->type_param()));\n    EXPECT_TRUE(test_cases[0]->should_run());\n    EXPECT_EQ(1, test_cases[0]->disabled_test_count());\n    ASSERT_EQ(4, test_cases[0]->total_test_count());\n    EXPECT_EQ(3, test_cases[0]->successful_test_count());\n    EXPECT_EQ(0, test_cases[0]->failed_test_count());\n    EXPECT_TRUE(test_cases[0]->Passed());\n    EXPECT_FALSE(test_cases[0]->Failed());\n\n    EXPECT_STREQ(\"DISABLED_Test\", test_cases[1]->name());\n    EXPECT_TRUE(IsNull(test_cases[1]->type_param()));\n    EXPECT_FALSE(test_cases[1]->should_run());\n    EXPECT_EQ(1, test_cases[1]->disabled_test_count());\n    ASSERT_EQ(1, test_cases[1]->total_test_count());\n    EXPECT_EQ(0, test_cases[1]->successful_test_count());\n    EXPECT_EQ(0, test_cases[1]->failed_test_count());\n\n#if GTEST_HAS_TYPED_TEST\n    EXPECT_STREQ(\"TestCaseWithCommentTest/0\", test_cases[2]->name());\n    EXPECT_STREQ(GetTypeName<int>().c_str(), test_cases[2]->type_param());\n    EXPECT_TRUE(test_cases[2]->should_run());\n    EXPECT_EQ(0, test_cases[2]->disabled_test_count());\n    ASSERT_EQ(1, test_cases[2]->total_test_count());\n    EXPECT_EQ(1, test_cases[2]->successful_test_count());\n    EXPECT_EQ(0, test_cases[2]->failed_test_count());\n    EXPECT_TRUE(test_cases[2]->Passed());\n    EXPECT_FALSE(test_cases[2]->Failed());\n#endif  // GTEST_HAS_TYPED_TEST\n\n    const TestCase* test_case = UnitTestHelper::FindTestCase(\"ApiTest\");\n    const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case);\n    EXPECT_STREQ(\"DISABLED_Dummy1\", tests[0]->name());\n    EXPECT_STREQ(\"ApiTest\", tests[0]->test_case_name());\n    EXPECT_FALSE(tests[0]->should_run());\n\n    EXPECT_STREQ(\"TestCaseDisabledAccessorsWork\", tests[1]->name());\n    EXPECT_STREQ(\"ApiTest\", tests[1]->test_case_name());\n    EXPECT_TRUE(IsNull(tests[1]->value_param()));\n    EXPECT_TRUE(IsNull(tests[1]->type_param()));\n    EXPECT_TRUE(tests[1]->should_run());\n    EXPECT_TRUE(tests[1]->result()->Passed());\n    EXPECT_EQ(0, tests[1]->result()->test_property_count());\n\n    EXPECT_STREQ(\"TestCaseImmutableAccessorsWork\", tests[2]->name());\n    EXPECT_STREQ(\"ApiTest\", tests[2]->test_case_name());\n    EXPECT_TRUE(IsNull(tests[2]->value_param()));\n    EXPECT_TRUE(IsNull(tests[2]->type_param()));\n    EXPECT_TRUE(tests[2]->should_run());\n    EXPECT_TRUE(tests[2]->result()->Passed());\n    EXPECT_EQ(0, tests[2]->result()->test_property_count());\n\n    EXPECT_STREQ(\"UnitTestImmutableAccessorsWork\", tests[3]->name());\n    EXPECT_STREQ(\"ApiTest\", tests[3]->test_case_name());\n    EXPECT_TRUE(IsNull(tests[3]->value_param()));\n    EXPECT_TRUE(IsNull(tests[3]->type_param()));\n    EXPECT_TRUE(tests[3]->should_run());\n    EXPECT_TRUE(tests[3]->result()->Passed());\n    EXPECT_EQ(1, tests[3]->result()->test_property_count());\n    const TestProperty& property = tests[3]->result()->GetTestProperty(0);\n    EXPECT_STREQ(\"key\", property.key());\n    EXPECT_STREQ(\"value\", property.value());\n\n    delete[] tests;\n\n#if GTEST_HAS_TYPED_TEST\n    test_case = UnitTestHelper::FindTestCase(\"TestCaseWithCommentTest/0\");\n    tests = UnitTestHelper::GetSortedTests(test_case);\n\n    EXPECT_STREQ(\"Dummy\", tests[0]->name());\n    EXPECT_STREQ(\"TestCaseWithCommentTest/0\", tests[0]->test_case_name());\n    EXPECT_TRUE(IsNull(tests[0]->value_param()));\n    EXPECT_STREQ(GetTypeName<int>().c_str(), tests[0]->type_param());\n    EXPECT_TRUE(tests[0]->should_run());\n    EXPECT_TRUE(tests[0]->result()->Passed());\n    EXPECT_EQ(0, tests[0]->result()->test_property_count());\n\n    delete[] tests;\n#endif  // GTEST_HAS_TYPED_TEST\n    delete[] test_cases;\n  }\n};\n\n}  // namespace internal\n}  // namespace testing\n\nint main(int argc, char **argv) {\n  InitGoogleTest(&argc, argv);\n\n  AddGlobalTestEnvironment(new testing::internal::FinalSuccessChecker());\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_all_test.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Tests for Google C++ Testing and Mocking Framework (Google Test)\n//\n// Sometimes it's desirable to build most of Google Test's own tests\n// by compiling a single file.  This file serves this purpose.\n#include \"test/googletest-filepath-test.cc\"\n#include \"test/googletest-linked-ptr-test.cc\"\n#include \"test/googletest-message-test.cc\"\n#include \"test/googletest-options-test.cc\"\n#include \"test/googletest-port-test.cc\"\n#include \"test/gtest_pred_impl_unittest.cc\"\n#include \"test/gtest_prod_test.cc\"\n#include \"test/googletest-test-part-test.cc\"\n#include \"test/gtest-typed-test_test.cc\"\n#include \"test/gtest-typed-test2_test.cc\"\n#include \"test/gtest_unittest.cc\"\n#include \"test/production.cc\"\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_assert_by_exception_test.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Tests Google Test's assert-by-exception mode with exceptions enabled.\n\n#include \"gtest/gtest.h\"\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdexcept>\n\nclass ThrowListener : public testing::EmptyTestEventListener {\n  void OnTestPartResult(const testing::TestPartResult& result) override {\n    if (result.type() == testing::TestPartResult::kFatalFailure) {\n      throw testing::AssertionException(result);\n    }\n  }\n};\n\n// Prints the given failure message and exits the program with\n// non-zero.  We use this instead of a Google Test assertion to\n// indicate a failure, as the latter is been tested and cannot be\n// relied on.\nvoid Fail(const char* msg) {\n  printf(\"FAILURE: %s\\n\", msg);\n  fflush(stdout);\n  exit(1);\n}\n\nstatic void AssertFalse() {\n  ASSERT_EQ(2, 3) << \"Expected failure\";\n}\n\n// Tests that an assertion failure throws a subclass of\n// std::runtime_error.\nTEST(Test, Test) {\n  // A successful assertion shouldn't throw.\n  try {\n    EXPECT_EQ(3, 3);\n  } catch(...) {\n    Fail(\"A successful assertion wrongfully threw.\");\n  }\n\n  // A successful assertion shouldn't throw.\n  try {\n    EXPECT_EQ(3, 4);\n  } catch(...) {\n    Fail(\"A failed non-fatal assertion wrongfully threw.\");\n  }\n\n  // A failed assertion should throw.\n  try {\n    AssertFalse();\n  } catch(const testing::AssertionException& e) {\n    if (strstr(e.what(), \"Expected failure\") != NULL)\n      throw;\n\n    printf(\"%s\",\n           \"A failed assertion did throw an exception of the right type, \"\n           \"but the message is incorrect.  Instead of containing \\\"Expected \"\n           \"failure\\\", it is:\\n\");\n    Fail(e.what());\n  } catch(...) {\n    Fail(\"A failed assertion threw the wrong type of exception.\");\n  }\n  Fail(\"A failed assertion should've thrown but didn't.\");\n}\n\nint kTestForContinuingTest = 0;\n\nTEST(Test, Test2) {\n  // FIXME: how to force Test2 to be after Test?\n  kTestForContinuingTest = 1;\n}\n\nint main(int argc, char** argv) {\n  testing::InitGoogleTest(&argc, argv);\n  testing::UnitTest::GetInstance()->listeners().Append(new ThrowListener);\n\n  int result = RUN_ALL_TESTS();\n  if (result == 0) {\n    printf(\"RUN_ALL_TESTS returned %d\\n\", result);\n    Fail(\"Expected failure instead.\");\n  }\n\n  if (kTestForContinuingTest == 0) {\n    Fail(\"Should have continued with other tests, but did not.\");\n  }\n  return 0;\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_environment_test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Tests using global test environments.\n\n#include <stdlib.h>\n#include <stdio.h>\n#include \"gtest/gtest.h\"\n#include \"src/gtest-internal-inl.h\"\n\nnamespace testing {\nGTEST_DECLARE_string_(filter);\n}\n\nnamespace {\n\nenum FailureType {\n  NO_FAILURE, NON_FATAL_FAILURE, FATAL_FAILURE\n};\n\n// For testing using global test environments.\nclass MyEnvironment : public testing::Environment {\n public:\n  MyEnvironment() { Reset(); }\n\n  // Depending on the value of failure_in_set_up_, SetUp() will\n  // generate a non-fatal failure, generate a fatal failure, or\n  // succeed.\n  virtual void SetUp() {\n    set_up_was_run_ = true;\n\n    switch (failure_in_set_up_) {\n      case NON_FATAL_FAILURE:\n        ADD_FAILURE() << \"Expected non-fatal failure in global set-up.\";\n        break;\n      case FATAL_FAILURE:\n        FAIL() << \"Expected fatal failure in global set-up.\";\n        break;\n      default:\n        break;\n    }\n  }\n\n  // Generates a non-fatal failure.\n  virtual void TearDown() {\n    tear_down_was_run_ = true;\n    ADD_FAILURE() << \"Expected non-fatal failure in global tear-down.\";\n  }\n\n  // Resets the state of the environment s.t. it can be reused.\n  void Reset() {\n    failure_in_set_up_ = NO_FAILURE;\n    set_up_was_run_ = false;\n    tear_down_was_run_ = false;\n  }\n\n  // We call this function to set the type of failure SetUp() should\n  // generate.\n  void set_failure_in_set_up(FailureType type) {\n    failure_in_set_up_ = type;\n  }\n\n  // Was SetUp() run?\n  bool set_up_was_run() const { return set_up_was_run_; }\n\n  // Was TearDown() run?\n  bool tear_down_was_run() const { return tear_down_was_run_; }\n\n private:\n  FailureType failure_in_set_up_;\n  bool set_up_was_run_;\n  bool tear_down_was_run_;\n};\n\n// Was the TEST run?\nbool test_was_run;\n\n// The sole purpose of this TEST is to enable us to check whether it\n// was run.\nTEST(FooTest, Bar) {\n  test_was_run = true;\n}\n\n// Prints the message and aborts the program if condition is false.\nvoid Check(bool condition, const char* msg) {\n  if (!condition) {\n    printf(\"FAILED: %s\\n\", msg);\n    testing::internal::posix::Abort();\n  }\n}\n\n// Runs the tests.  Return true iff successful.\n//\n// The 'failure' parameter specifies the type of failure that should\n// be generated by the global set-up.\nint RunAllTests(MyEnvironment* env, FailureType failure) {\n  env->Reset();\n  env->set_failure_in_set_up(failure);\n  test_was_run = false;\n  testing::internal::GetUnitTestImpl()->ClearAdHocTestResult();\n  return RUN_ALL_TESTS();\n}\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  testing::InitGoogleTest(&argc, argv);\n\n  // Registers a global test environment, and verifies that the\n  // registration function returns its argument.\n  MyEnvironment* const env = new MyEnvironment;\n  Check(testing::AddGlobalTestEnvironment(env) == env,\n        \"AddGlobalTestEnvironment() should return its argument.\");\n\n  // Verifies that RUN_ALL_TESTS() runs the tests when the global\n  // set-up is successful.\n  Check(RunAllTests(env, NO_FAILURE) != 0,\n        \"RUN_ALL_TESTS() should return non-zero, as the global tear-down \"\n        \"should generate a failure.\");\n  Check(test_was_run,\n        \"The tests should run, as the global set-up should generate no \"\n        \"failure\");\n  Check(env->tear_down_was_run(),\n        \"The global tear-down should run, as the global set-up was run.\");\n\n  // Verifies that RUN_ALL_TESTS() runs the tests when the global\n  // set-up generates no fatal failure.\n  Check(RunAllTests(env, NON_FATAL_FAILURE) != 0,\n        \"RUN_ALL_TESTS() should return non-zero, as both the global set-up \"\n        \"and the global tear-down should generate a non-fatal failure.\");\n  Check(test_was_run,\n        \"The tests should run, as the global set-up should generate no \"\n        \"fatal failure.\");\n  Check(env->tear_down_was_run(),\n        \"The global tear-down should run, as the global set-up was run.\");\n\n  // Verifies that RUN_ALL_TESTS() runs no test when the global set-up\n  // generates a fatal failure.\n  Check(RunAllTests(env, FATAL_FAILURE) != 0,\n        \"RUN_ALL_TESTS() should return non-zero, as the global set-up \"\n        \"should generate a fatal failure.\");\n  Check(!test_was_run,\n        \"The tests should not run, as the global set-up should generate \"\n        \"a fatal failure.\");\n  Check(env->tear_down_was_run(),\n        \"The global tear-down should run, as the global set-up was run.\");\n\n  // Verifies that RUN_ALL_TESTS() doesn't do global set-up or\n  // tear-down when there is no test to run.\n  testing::GTEST_FLAG(filter) = \"-*\";\n  Check(RunAllTests(env, NO_FAILURE) == 0,\n        \"RUN_ALL_TESTS() should return zero, as there is no test to run.\");\n  Check(!env->set_up_was_run(),\n        \"The global set-up should not run, as there is no test to run.\");\n  Check(!env->tear_down_was_run(),\n        \"The global tear-down should not run, \"\n        \"as the global set-up was not run.\");\n\n  printf(\"PASS\\n\");\n  return 0;\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_help_test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Tests the --help flag of Google C++ Testing and Mocking Framework.\n\nSYNOPSIS\n       gtest_help_test.py --build_dir=BUILD/DIR\n         # where BUILD/DIR contains the built gtest_help_test_ file.\n       gtest_help_test.py\n\"\"\"\n\nimport os\nimport re\nimport gtest_test_utils\n\n\nIS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'\nIS_WINDOWS = os.name == 'nt'\n\nPROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_help_test_')\nFLAG_PREFIX = '--gtest_'\nDEATH_TEST_STYLE_FLAG = FLAG_PREFIX + 'death_test_style'\nSTREAM_RESULT_TO_FLAG = FLAG_PREFIX + 'stream_result_to'\nUNKNOWN_FLAG = FLAG_PREFIX + 'unknown_flag_for_testing'\nLIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'\nINCORRECT_FLAG_VARIANTS = [re.sub('^--', '-', LIST_TESTS_FLAG),\n                           re.sub('^--', '/', LIST_TESTS_FLAG),\n                           re.sub('_', '-', LIST_TESTS_FLAG)]\nINTERNAL_FLAG_FOR_TESTING = FLAG_PREFIX + 'internal_flag_for_testing'\n\nSUPPORTS_DEATH_TESTS = \"DeathTest\" in gtest_test_utils.Subprocess(\n    [PROGRAM_PATH, LIST_TESTS_FLAG]).output\n\n# The help message must match this regex.\nHELP_REGEX = re.compile(\n    FLAG_PREFIX + r'list_tests.*' +\n    FLAG_PREFIX + r'filter=.*' +\n    FLAG_PREFIX + r'also_run_disabled_tests.*' +\n    FLAG_PREFIX + r'repeat=.*' +\n    FLAG_PREFIX + r'shuffle.*' +\n    FLAG_PREFIX + r'random_seed=.*' +\n    FLAG_PREFIX + r'color=.*' +\n    FLAG_PREFIX + r'print_time.*' +\n    FLAG_PREFIX + r'output=.*' +\n    FLAG_PREFIX + r'break_on_failure.*' +\n    FLAG_PREFIX + r'throw_on_failure.*' +\n    FLAG_PREFIX + r'catch_exceptions=0.*',\n    re.DOTALL)\n\n\ndef RunWithFlag(flag):\n  \"\"\"Runs gtest_help_test_ with the given flag.\n\n  Returns:\n    the exit code and the text output as a tuple.\n  Args:\n    flag: the command-line flag to pass to gtest_help_test_, or None.\n  \"\"\"\n\n  if flag is None:\n    command = [PROGRAM_PATH]\n  else:\n    command = [PROGRAM_PATH, flag]\n  child = gtest_test_utils.Subprocess(command)\n  return child.exit_code, child.output\n\n\nclass GTestHelpTest(gtest_test_utils.TestCase):\n  \"\"\"Tests the --help flag and its equivalent forms.\"\"\"\n\n  def TestHelpFlag(self, flag):\n    \"\"\"Verifies correct behavior when help flag is specified.\n\n    The right message must be printed and the tests must\n    skipped when the given flag is specified.\n\n    Args:\n      flag:  A flag to pass to the binary or None.\n    \"\"\"\n\n    exit_code, output = RunWithFlag(flag)\n    self.assertEquals(0, exit_code)\n    self.assert_(HELP_REGEX.search(output), output)\n\n    if IS_LINUX:\n      self.assert_(STREAM_RESULT_TO_FLAG in output, output)\n    else:\n      self.assert_(STREAM_RESULT_TO_FLAG not in output, output)\n\n    if SUPPORTS_DEATH_TESTS and not IS_WINDOWS:\n      self.assert_(DEATH_TEST_STYLE_FLAG in output, output)\n    else:\n      self.assert_(DEATH_TEST_STYLE_FLAG not in output, output)\n\n  def TestNonHelpFlag(self, flag):\n    \"\"\"Verifies correct behavior when no help flag is specified.\n\n    Verifies that when no help flag is specified, the tests are run\n    and the help message is not printed.\n\n    Args:\n      flag:  A flag to pass to the binary or None.\n    \"\"\"\n\n    exit_code, output = RunWithFlag(flag)\n    self.assert_(exit_code != 0)\n    self.assert_(not HELP_REGEX.search(output), output)\n\n  def testPrintsHelpWithFullFlag(self):\n    self.TestHelpFlag('--help')\n\n  def testPrintsHelpWithShortFlag(self):\n    self.TestHelpFlag('-h')\n\n  def testPrintsHelpWithQuestionFlag(self):\n    self.TestHelpFlag('-?')\n\n  def testPrintsHelpWithWindowsStyleQuestionFlag(self):\n    self.TestHelpFlag('/?')\n\n  def testPrintsHelpWithUnrecognizedGoogleTestFlag(self):\n    self.TestHelpFlag(UNKNOWN_FLAG)\n\n  def testPrintsHelpWithIncorrectFlagStyle(self):\n    for incorrect_flag in INCORRECT_FLAG_VARIANTS:\n      self.TestHelpFlag(incorrect_flag)\n\n  def testRunsTestsWithoutHelpFlag(self):\n    \"\"\"Verifies that when no help flag is specified, the tests are run\n    and the help message is not printed.\"\"\"\n\n    self.TestNonHelpFlag(None)\n\n  def testRunsTestsWithGtestInternalFlag(self):\n    \"\"\"Verifies that the tests are run and no help message is printed when\n    a flag starting with Google Test prefix and 'internal_' is supplied.\"\"\"\n\n    self.TestNonHelpFlag(INTERNAL_FLAG_FOR_TESTING)\n\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_help_test_.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// This program is meant to be run by gtest_help_test.py.  Do not run\n// it directly.\n\n#include \"gtest/gtest.h\"\n\n// When a help flag is specified, this program should skip the tests\n// and exit with 0; otherwise the following test will be executed,\n// causing this program to exit with a non-zero code.\nTEST(HelpFlagTest, ShouldNotBeRun) {\n  ASSERT_TRUE(false) << \"Tests shouldn't be run when --help is specified.\";\n}\n\n#if GTEST_HAS_DEATH_TEST\nTEST(DeathTest, UsedByPythonScriptToDetectSupportForDeathTestsInThisBinary) {}\n#endif\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_json_test_utils.py",
    "content": "# Copyright 2018, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test utilities for gtest_json_output.\"\"\"\n\nimport re\n\n\ndef normalize(obj):\n  \"\"\"Normalize output object.\n\n  Args:\n     obj: Google Test's JSON output object to normalize.\n\n  Returns:\n     Normalized output without any references to transient information that may\n     change from run to run.\n  \"\"\"\n  def _normalize(key, value):\n    if key == 'time':\n      return re.sub(r'^\\d+(\\.\\d+)?s$', '*', value)\n    elif key == 'timestamp':\n      return re.sub(r'^\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\dZ$', '*', value)\n    elif key == 'failure':\n      value = re.sub(r'^.*[/\\\\](.*:)\\d+\\n', '\\\\1*\\n', value)\n      return re.sub(r'Stack trace:\\n(.|\\n)*', 'Stack trace:\\n*', value)\n    else:\n      return normalize(value)\n  if isinstance(obj, dict):\n    return {k: _normalize(k, v) for k, v in obj.items()}\n  if isinstance(obj, list):\n    return [normalize(x) for x in obj]\n  else:\n    return obj\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_list_output_unittest.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\"\"\"Unit test for Google Test's --gtest_list_tests flag.\n\nA user can ask Google Test to list all tests by specifying the\n--gtest_list_tests flag. If output is requested, via --gtest_output=xml\nor --gtest_output=json, the tests are listed, with extra information in the\noutput file.\nThis script tests such functionality by invoking gtest_list_output_unittest_\n (a program written with Google Test) the command line flags.\n\"\"\"\n\nimport os\nimport re\nimport gtest_test_utils\n\nGTEST_LIST_TESTS_FLAG = '--gtest_list_tests'\nGTEST_OUTPUT_FLAG = '--gtest_output'\n\nEXPECTED_XML = \"\"\"<\\?xml version=\"1.0\" encoding=\"UTF-8\"\\?>\n<testsuites tests=\"2\" name=\"AllTests\">\n  <testsuite name=\"FooTest\" tests=\"2\">\n    <testcase name=\"Test1\" file=\".*gtest_list_output_unittest_.cc\" line=\"43\" />\n    <testcase name=\"Test2\" file=\".*gtest_list_output_unittest_.cc\" line=\"45\" />\n  </testsuite>\n</testsuites>\n\"\"\"\n\nEXPECTED_JSON = \"\"\"{\n  \"tests\": 2,\n  \"name\": \"AllTests\",\n  \"testsuites\": \\[\n    {\n      \"name\": \"FooTest\",\n      \"tests\": 2,\n      \"testsuite\": \\[\n        {\n          \"name\": \"Test1\",\n          \"file\": \".*gtest_list_output_unittest_.cc\",\n          \"line\": 43\n        },\n        {\n          \"name\": \"Test2\",\n          \"file\": \".*gtest_list_output_unittest_.cc\",\n          \"line\": 45\n        }\n      \\]\n    }\n  \\]\n}\n\"\"\"\n\n\nclass GTestListTestsOutputUnitTest(gtest_test_utils.TestCase):\n  \"\"\"Unit test for Google Test's list tests with output to file functionality.\n  \"\"\"\n\n  def testXml(self):\n    \"\"\"Verifies XML output for listing tests in a Google Test binary.\n\n    Runs a test program that generates an empty XML output, and\n    tests that the XML output is expected.\n    \"\"\"\n    self._TestOutput('xml', EXPECTED_XML)\n\n  def testJSON(self):\n    \"\"\"Verifies XML output for listing tests in a Google Test binary.\n\n    Runs a test program that generates an empty XML output, and\n    tests that the XML output is expected.\n    \"\"\"\n    self._TestOutput('json', EXPECTED_JSON)\n\n  def _GetOutput(self, out_format):\n    file_path = os.path.join(gtest_test_utils.GetTempDir(),\n                             'test_out.' + out_format)\n    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(\n        'gtest_list_output_unittest_')\n\n    command = ([\n        gtest_prog_path,\n        '%s=%s:%s' % (GTEST_OUTPUT_FLAG, out_format, file_path),\n        '--gtest_list_tests'\n    ])\n    environ_copy = os.environ.copy()\n    p = gtest_test_utils.Subprocess(\n        command, env=environ_copy, working_dir=gtest_test_utils.GetTempDir())\n\n    self.assert_(p.exited)\n    self.assertEquals(0, p.exit_code)\n    with open(file_path) as f:\n      result = f.read()\n    return result\n\n  def _TestOutput(self, test_format, expected_output):\n    actual = self._GetOutput(test_format)\n    actual_lines = actual.splitlines()\n    expected_lines = expected_output.splitlines()\n    line_count = 0\n    for actual_line in actual_lines:\n      expected_line = expected_lines[line_count]\n      expected_line_re = re.compile(expected_line.strip())\n      self.assert_(\n          expected_line_re.match(actual_line.strip()),\n          ('actual output of \"%s\",\\n'\n           'which does not match expected regex of \"%s\"\\n'\n           'on line %d' % (actual, expected_output, line_count)))\n      line_count = line_count + 1\n\n\nif __name__ == '__main__':\n  os.environ['GTEST_STACK_TRACE_DEPTH'] = '1'\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_list_output_unittest_.cc",
    "content": "// Copyright 2018, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: david.schuldenfrei@gmail.com (David Schuldenfrei)\n\n// Unit test for Google Test's --gtest_list_tests and --gtest_output flag.\n//\n// A user can ask Google Test to list all tests that will run,\n// and have the output saved in a Json/Xml file.\n// The tests will not be run after listing.\n//\n// This program will be invoked from a Python unit test.\n// Don't run it directly.\n\n#include \"gtest/gtest.h\"\n\nTEST(FooTest, Test1) {}\n\nTEST(FooTest, Test2) {}\n\nint main(int argc, char **argv) {\n  ::testing::InitGoogleTest(&argc, argv);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_main_unittest.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include \"gtest/gtest.h\"\n\n// Tests that we don't have to define main() when we link to\n// gtest_main instead of gtest.\n\nnamespace {\n\nTEST(GTestMainTest, ShouldSucceed) {\n}\n\n}  // namespace\n\n// We are using the main() function defined in gtest_main.cc, so we\n// don't define it here.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_no_test_unittest.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Tests that a Google Test program that has no test defined can run\n// successfully.\n\n#include \"gtest/gtest.h\"\n\nint main(int argc, char **argv) {\n  testing::InitGoogleTest(&argc, argv);\n\n  // An ad-hoc assertion outside of all tests.\n  //\n  // This serves three purposes:\n  //\n  // 1. It verifies that an ad-hoc assertion can be executed even if\n  //    no test is defined.\n  // 2. It verifies that a failed ad-hoc assertion causes the test\n  //    program to fail.\n  // 3. We had a bug where the XML output won't be generated if an\n  //    assertion is executed before RUN_ALL_TESTS() is called, even\n  //    though --gtest_output=xml is specified.  This makes sure the\n  //    bug is fixed and doesn't regress.\n  EXPECT_EQ(1, 2);\n\n  // The above EXPECT_EQ() should cause RUN_ALL_TESTS() to return non-zero.\n  return RUN_ALL_TESTS() ? 0 : 1;\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_pred_impl_unittest.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// This file is AUTOMATICALLY GENERATED on 01/02/2018 by command\n// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!\n\n// Regression test for gtest_pred_impl.h\n//\n// This file is generated by a script and quite long.  If you intend to\n// learn how Google Test works by reading its unit tests, read\n// gtest_unittest.cc instead.\n//\n// This is intended as a regression test for the Google Test predicate\n// assertions.  We compile it as part of the gtest_unittest target\n// only to keep the implementation tidy and compact, as it is quite\n// involved to set up the stage for testing Google Test using Google\n// Test itself.\n//\n// Currently, gtest_unittest takes ~11 seconds to run in the testing\n// daemon.  In the future, if it grows too large and needs much more\n// time to finish, we should consider separating this file into a\n// stand-alone regression test.\n\n#include <iostream>\n\n#include \"gtest/gtest.h\"\n#include \"gtest/gtest-spi.h\"\n\n// A user-defined data type.\nstruct Bool {\n  explicit Bool(int val) : value(val != 0) {}\n\n  bool operator>(int n) const { return value > Bool(n).value; }\n\n  Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); }\n\n  bool operator==(const Bool& rhs) const { return value == rhs.value; }\n\n  bool value;\n};\n\n// Enables Bool to be used in assertions.\nstd::ostream& operator<<(std::ostream& os, const Bool& x) {\n  return os << (x.value ? \"true\" : \"false\");\n}\n\n// Sample functions/functors for testing unary predicate assertions.\n\n// A unary predicate function.\ntemplate <typename T1>\nbool PredFunction1(T1 v1) {\n  return v1 > 0;\n}\n\n// The following two functions are needed to circumvent a bug in\n// gcc 2.95.3, which sometimes has problem with the above template\n// function.\nbool PredFunction1Int(int v1) {\n  return v1 > 0;\n}\nbool PredFunction1Bool(Bool v1) {\n  return v1 > 0;\n}\n\n// A unary predicate functor.\nstruct PredFunctor1 {\n  template <typename T1>\n  bool operator()(const T1& v1) {\n    return v1 > 0;\n  }\n};\n\n// A unary predicate-formatter function.\ntemplate <typename T1>\ntesting::AssertionResult PredFormatFunction1(const char* e1,\n                                             const T1& v1) {\n  if (PredFunction1(v1))\n    return testing::AssertionSuccess();\n\n  return testing::AssertionFailure()\n      << e1\n      << \" is expected to be positive, but evaluates to \"\n      << v1 << \".\";\n}\n\n// A unary predicate-formatter functor.\nstruct PredFormatFunctor1 {\n  template <typename T1>\n  testing::AssertionResult operator()(const char* e1,\n                                      const T1& v1) const {\n    return PredFormatFunction1(e1, v1);\n  }\n};\n\n// Tests for {EXPECT|ASSERT}_PRED_FORMAT1.\n\nclass Predicate1Test : public testing::Test {\n protected:\n  virtual void SetUp() {\n    expected_to_finish_ = true;\n    finished_ = false;\n    n1_ = 0;\n  }\n\n  virtual void TearDown() {\n    // Verifies that each of the predicate's arguments was evaluated\n    // exactly once.\n    EXPECT_EQ(1, n1_) <<\n        \"The predicate assertion didn't evaluate argument 2 \"\n        \"exactly once.\";\n\n    // Verifies that the control flow in the test function is expected.\n    if (expected_to_finish_ && !finished_) {\n      FAIL() << \"The predicate assertion unexpactedly aborted the test.\";\n    } else if (!expected_to_finish_ && finished_) {\n      FAIL() << \"The failed predicate assertion didn't abort the test \"\n                \"as expected.\";\n    }\n  }\n\n  // true iff the test function is expected to run to finish.\n  static bool expected_to_finish_;\n\n  // true iff the test function did run to finish.\n  static bool finished_;\n\n  static int n1_;\n};\n\nbool Predicate1Test::expected_to_finish_;\nbool Predicate1Test::finished_;\nint Predicate1Test::n1_;\n\ntypedef Predicate1Test EXPECT_PRED_FORMAT1Test;\ntypedef Predicate1Test ASSERT_PRED_FORMAT1Test;\ntypedef Predicate1Test EXPECT_PRED1Test;\ntypedef Predicate1Test ASSERT_PRED1Test;\n\n// Tests a successful EXPECT_PRED1 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED1Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED1(PredFunction1Int,\n               ++n1_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED1 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED1Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED1(PredFunction1Bool,\n               Bool(++n1_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED1 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED1Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED1(PredFunctor1(),\n               ++n1_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED1 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED1Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED1(PredFunctor1(),\n               Bool(++n1_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED1 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED1Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED1(PredFunction1Int,\n                 n1_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED1 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED1Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED1(PredFunction1Bool,\n                 Bool(n1_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED1 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED1Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED1(PredFunctor1(),\n                 n1_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED1 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED1Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED1(PredFunctor1(),\n                 Bool(n1_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED1 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED1Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED1(PredFunction1Int,\n               ++n1_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED1 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED1Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED1(PredFunction1Bool,\n               Bool(++n1_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED1 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED1Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED1(PredFunctor1(),\n               ++n1_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED1 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED1Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED1(PredFunctor1(),\n               Bool(++n1_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED1 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED1Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED1(PredFunction1Int,\n                 n1_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED1 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED1Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED1(PredFunction1Bool,\n                 Bool(n1_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED1 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED1Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED1(PredFunctor1(),\n                 n1_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED1 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED1Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED1(PredFunctor1(),\n                 Bool(n1_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful EXPECT_PRED_FORMAT1 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT1(PredFormatFunction1,\n                      ++n1_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT1 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT1(PredFormatFunction1,\n                      Bool(++n1_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT1 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT1(PredFormatFunctor1(),\n                      ++n1_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT1 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT1(PredFormatFunctor1(),\n                      Bool(++n1_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED_FORMAT1 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT1(PredFormatFunction1,\n                        n1_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT1 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT1(PredFormatFunction1,\n                        Bool(n1_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT1 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT1(PredFormatFunctor1(),\n                        n1_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT1 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT1(PredFormatFunctor1(),\n                        Bool(n1_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED_FORMAT1 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT1(PredFormatFunction1,\n                      ++n1_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT1 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT1(PredFormatFunction1,\n                      Bool(++n1_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT1 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT1(PredFormatFunctor1(),\n                      ++n1_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT1 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT1(PredFormatFunctor1(),\n                      Bool(++n1_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED_FORMAT1 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT1(PredFormatFunction1,\n                        n1_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT1 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT1(PredFormatFunction1,\n                        Bool(n1_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT1 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT1(PredFormatFunctor1(),\n                        n1_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT1 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT1(PredFormatFunctor1(),\n                        Bool(n1_++));\n    finished_ = true;\n  }, \"\");\n}\n// Sample functions/functors for testing binary predicate assertions.\n\n// A binary predicate function.\ntemplate <typename T1, typename T2>\nbool PredFunction2(T1 v1, T2 v2) {\n  return v1 + v2 > 0;\n}\n\n// The following two functions are needed to circumvent a bug in\n// gcc 2.95.3, which sometimes has problem with the above template\n// function.\nbool PredFunction2Int(int v1, int v2) {\n  return v1 + v2 > 0;\n}\nbool PredFunction2Bool(Bool v1, Bool v2) {\n  return v1 + v2 > 0;\n}\n\n// A binary predicate functor.\nstruct PredFunctor2 {\n  template <typename T1, typename T2>\n  bool operator()(const T1& v1,\n                  const T2& v2) {\n    return v1 + v2 > 0;\n  }\n};\n\n// A binary predicate-formatter function.\ntemplate <typename T1, typename T2>\ntesting::AssertionResult PredFormatFunction2(const char* e1,\n                                             const char* e2,\n                                             const T1& v1,\n                                             const T2& v2) {\n  if (PredFunction2(v1, v2))\n    return testing::AssertionSuccess();\n\n  return testing::AssertionFailure()\n      << e1 << \" + \" << e2\n      << \" is expected to be positive, but evaluates to \"\n      << v1 + v2 << \".\";\n}\n\n// A binary predicate-formatter functor.\nstruct PredFormatFunctor2 {\n  template <typename T1, typename T2>\n  testing::AssertionResult operator()(const char* e1,\n                                      const char* e2,\n                                      const T1& v1,\n                                      const T2& v2) const {\n    return PredFormatFunction2(e1, e2, v1, v2);\n  }\n};\n\n// Tests for {EXPECT|ASSERT}_PRED_FORMAT2.\n\nclass Predicate2Test : public testing::Test {\n protected:\n  virtual void SetUp() {\n    expected_to_finish_ = true;\n    finished_ = false;\n    n1_ = n2_ = 0;\n  }\n\n  virtual void TearDown() {\n    // Verifies that each of the predicate's arguments was evaluated\n    // exactly once.\n    EXPECT_EQ(1, n1_) <<\n        \"The predicate assertion didn't evaluate argument 2 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n2_) <<\n        \"The predicate assertion didn't evaluate argument 3 \"\n        \"exactly once.\";\n\n    // Verifies that the control flow in the test function is expected.\n    if (expected_to_finish_ && !finished_) {\n      FAIL() << \"The predicate assertion unexpactedly aborted the test.\";\n    } else if (!expected_to_finish_ && finished_) {\n      FAIL() << \"The failed predicate assertion didn't abort the test \"\n                \"as expected.\";\n    }\n  }\n\n  // true iff the test function is expected to run to finish.\n  static bool expected_to_finish_;\n\n  // true iff the test function did run to finish.\n  static bool finished_;\n\n  static int n1_;\n  static int n2_;\n};\n\nbool Predicate2Test::expected_to_finish_;\nbool Predicate2Test::finished_;\nint Predicate2Test::n1_;\nint Predicate2Test::n2_;\n\ntypedef Predicate2Test EXPECT_PRED_FORMAT2Test;\ntypedef Predicate2Test ASSERT_PRED_FORMAT2Test;\ntypedef Predicate2Test EXPECT_PRED2Test;\ntypedef Predicate2Test ASSERT_PRED2Test;\n\n// Tests a successful EXPECT_PRED2 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED2Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED2(PredFunction2Int,\n               ++n1_,\n               ++n2_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED2 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED2Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED2(PredFunction2Bool,\n               Bool(++n1_),\n               Bool(++n2_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED2 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED2Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED2(PredFunctor2(),\n               ++n1_,\n               ++n2_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED2 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED2Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED2(PredFunctor2(),\n               Bool(++n1_),\n               Bool(++n2_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED2 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED2Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED2(PredFunction2Int,\n                 n1_++,\n                 n2_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED2 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED2Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED2(PredFunction2Bool,\n                 Bool(n1_++),\n                 Bool(n2_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED2 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED2Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED2(PredFunctor2(),\n                 n1_++,\n                 n2_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED2 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED2Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED2(PredFunctor2(),\n                 Bool(n1_++),\n                 Bool(n2_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED2 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED2Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED2(PredFunction2Int,\n               ++n1_,\n               ++n2_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED2 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED2Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED2(PredFunction2Bool,\n               Bool(++n1_),\n               Bool(++n2_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED2 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED2Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED2(PredFunctor2(),\n               ++n1_,\n               ++n2_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED2 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED2Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED2(PredFunctor2(),\n               Bool(++n1_),\n               Bool(++n2_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED2 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED2Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED2(PredFunction2Int,\n                 n1_++,\n                 n2_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED2 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED2Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED2(PredFunction2Bool,\n                 Bool(n1_++),\n                 Bool(n2_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED2 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED2Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED2(PredFunctor2(),\n                 n1_++,\n                 n2_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED2 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED2Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED2(PredFunctor2(),\n                 Bool(n1_++),\n                 Bool(n2_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful EXPECT_PRED_FORMAT2 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT2(PredFormatFunction2,\n                      ++n1_,\n                      ++n2_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT2 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT2(PredFormatFunction2,\n                      Bool(++n1_),\n                      Bool(++n2_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT2 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT2(PredFormatFunctor2(),\n                      ++n1_,\n                      ++n2_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT2 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT2(PredFormatFunctor2(),\n                      Bool(++n1_),\n                      Bool(++n2_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED_FORMAT2 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(PredFormatFunction2,\n                        n1_++,\n                        n2_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT2 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(PredFormatFunction2,\n                        Bool(n1_++),\n                        Bool(n2_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT2 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(PredFormatFunctor2(),\n                        n1_++,\n                        n2_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT2 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(PredFormatFunctor2(),\n                        Bool(n1_++),\n                        Bool(n2_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED_FORMAT2 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT2(PredFormatFunction2,\n                      ++n1_,\n                      ++n2_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT2 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT2(PredFormatFunction2,\n                      Bool(++n1_),\n                      Bool(++n2_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT2 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT2(PredFormatFunctor2(),\n                      ++n1_,\n                      ++n2_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT2 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT2(PredFormatFunctor2(),\n                      Bool(++n1_),\n                      Bool(++n2_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED_FORMAT2 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT2(PredFormatFunction2,\n                        n1_++,\n                        n2_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT2 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT2(PredFormatFunction2,\n                        Bool(n1_++),\n                        Bool(n2_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT2 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT2(PredFormatFunctor2(),\n                        n1_++,\n                        n2_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT2 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT2(PredFormatFunctor2(),\n                        Bool(n1_++),\n                        Bool(n2_++));\n    finished_ = true;\n  }, \"\");\n}\n// Sample functions/functors for testing ternary predicate assertions.\n\n// A ternary predicate function.\ntemplate <typename T1, typename T2, typename T3>\nbool PredFunction3(T1 v1, T2 v2, T3 v3) {\n  return v1 + v2 + v3 > 0;\n}\n\n// The following two functions are needed to circumvent a bug in\n// gcc 2.95.3, which sometimes has problem with the above template\n// function.\nbool PredFunction3Int(int v1, int v2, int v3) {\n  return v1 + v2 + v3 > 0;\n}\nbool PredFunction3Bool(Bool v1, Bool v2, Bool v3) {\n  return v1 + v2 + v3 > 0;\n}\n\n// A ternary predicate functor.\nstruct PredFunctor3 {\n  template <typename T1, typename T2, typename T3>\n  bool operator()(const T1& v1,\n                  const T2& v2,\n                  const T3& v3) {\n    return v1 + v2 + v3 > 0;\n  }\n};\n\n// A ternary predicate-formatter function.\ntemplate <typename T1, typename T2, typename T3>\ntesting::AssertionResult PredFormatFunction3(const char* e1,\n                                             const char* e2,\n                                             const char* e3,\n                                             const T1& v1,\n                                             const T2& v2,\n                                             const T3& v3) {\n  if (PredFunction3(v1, v2, v3))\n    return testing::AssertionSuccess();\n\n  return testing::AssertionFailure()\n      << e1 << \" + \" << e2 << \" + \" << e3\n      << \" is expected to be positive, but evaluates to \"\n      << v1 + v2 + v3 << \".\";\n}\n\n// A ternary predicate-formatter functor.\nstruct PredFormatFunctor3 {\n  template <typename T1, typename T2, typename T3>\n  testing::AssertionResult operator()(const char* e1,\n                                      const char* e2,\n                                      const char* e3,\n                                      const T1& v1,\n                                      const T2& v2,\n                                      const T3& v3) const {\n    return PredFormatFunction3(e1, e2, e3, v1, v2, v3);\n  }\n};\n\n// Tests for {EXPECT|ASSERT}_PRED_FORMAT3.\n\nclass Predicate3Test : public testing::Test {\n protected:\n  virtual void SetUp() {\n    expected_to_finish_ = true;\n    finished_ = false;\n    n1_ = n2_ = n3_ = 0;\n  }\n\n  virtual void TearDown() {\n    // Verifies that each of the predicate's arguments was evaluated\n    // exactly once.\n    EXPECT_EQ(1, n1_) <<\n        \"The predicate assertion didn't evaluate argument 2 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n2_) <<\n        \"The predicate assertion didn't evaluate argument 3 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n3_) <<\n        \"The predicate assertion didn't evaluate argument 4 \"\n        \"exactly once.\";\n\n    // Verifies that the control flow in the test function is expected.\n    if (expected_to_finish_ && !finished_) {\n      FAIL() << \"The predicate assertion unexpactedly aborted the test.\";\n    } else if (!expected_to_finish_ && finished_) {\n      FAIL() << \"The failed predicate assertion didn't abort the test \"\n                \"as expected.\";\n    }\n  }\n\n  // true iff the test function is expected to run to finish.\n  static bool expected_to_finish_;\n\n  // true iff the test function did run to finish.\n  static bool finished_;\n\n  static int n1_;\n  static int n2_;\n  static int n3_;\n};\n\nbool Predicate3Test::expected_to_finish_;\nbool Predicate3Test::finished_;\nint Predicate3Test::n1_;\nint Predicate3Test::n2_;\nint Predicate3Test::n3_;\n\ntypedef Predicate3Test EXPECT_PRED_FORMAT3Test;\ntypedef Predicate3Test ASSERT_PRED_FORMAT3Test;\ntypedef Predicate3Test EXPECT_PRED3Test;\ntypedef Predicate3Test ASSERT_PRED3Test;\n\n// Tests a successful EXPECT_PRED3 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED3Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED3(PredFunction3Int,\n               ++n1_,\n               ++n2_,\n               ++n3_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED3 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED3Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED3(PredFunction3Bool,\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED3 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED3Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED3(PredFunctor3(),\n               ++n1_,\n               ++n2_,\n               ++n3_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED3 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED3Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED3(PredFunctor3(),\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED3 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED3Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED3(PredFunction3Int,\n                 n1_++,\n                 n2_++,\n                 n3_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED3 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED3Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED3(PredFunction3Bool,\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED3 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED3Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED3(PredFunctor3(),\n                 n1_++,\n                 n2_++,\n                 n3_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED3 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED3Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED3(PredFunctor3(),\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED3 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED3Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED3(PredFunction3Int,\n               ++n1_,\n               ++n2_,\n               ++n3_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED3 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED3Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED3(PredFunction3Bool,\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED3 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED3Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED3(PredFunctor3(),\n               ++n1_,\n               ++n2_,\n               ++n3_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED3 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED3Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED3(PredFunctor3(),\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED3 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED3Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED3(PredFunction3Int,\n                 n1_++,\n                 n2_++,\n                 n3_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED3 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED3Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED3(PredFunction3Bool,\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED3 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED3Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED3(PredFunctor3(),\n                 n1_++,\n                 n2_++,\n                 n3_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED3 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED3Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED3(PredFunctor3(),\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful EXPECT_PRED_FORMAT3 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT3(PredFormatFunction3,\n                      ++n1_,\n                      ++n2_,\n                      ++n3_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT3 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT3(PredFormatFunction3,\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT3 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT3(PredFormatFunctor3(),\n                      ++n1_,\n                      ++n2_,\n                      ++n3_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT3 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT3(PredFormatFunctor3(),\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED_FORMAT3 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT3(PredFormatFunction3,\n                        n1_++,\n                        n2_++,\n                        n3_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT3 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT3(PredFormatFunction3,\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT3 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT3(PredFormatFunctor3(),\n                        n1_++,\n                        n2_++,\n                        n3_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT3 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT3(PredFormatFunctor3(),\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED_FORMAT3 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT3(PredFormatFunction3,\n                      ++n1_,\n                      ++n2_,\n                      ++n3_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT3 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT3(PredFormatFunction3,\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT3 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT3(PredFormatFunctor3(),\n                      ++n1_,\n                      ++n2_,\n                      ++n3_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT3 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT3(PredFormatFunctor3(),\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED_FORMAT3 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT3(PredFormatFunction3,\n                        n1_++,\n                        n2_++,\n                        n3_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT3 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT3(PredFormatFunction3,\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT3 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT3(PredFormatFunctor3(),\n                        n1_++,\n                        n2_++,\n                        n3_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT3 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT3(PredFormatFunctor3(),\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++));\n    finished_ = true;\n  }, \"\");\n}\n// Sample functions/functors for testing 4-ary predicate assertions.\n\n// A 4-ary predicate function.\ntemplate <typename T1, typename T2, typename T3, typename T4>\nbool PredFunction4(T1 v1, T2 v2, T3 v3, T4 v4) {\n  return v1 + v2 + v3 + v4 > 0;\n}\n\n// The following two functions are needed to circumvent a bug in\n// gcc 2.95.3, which sometimes has problem with the above template\n// function.\nbool PredFunction4Int(int v1, int v2, int v3, int v4) {\n  return v1 + v2 + v3 + v4 > 0;\n}\nbool PredFunction4Bool(Bool v1, Bool v2, Bool v3, Bool v4) {\n  return v1 + v2 + v3 + v4 > 0;\n}\n\n// A 4-ary predicate functor.\nstruct PredFunctor4 {\n  template <typename T1, typename T2, typename T3, typename T4>\n  bool operator()(const T1& v1,\n                  const T2& v2,\n                  const T3& v3,\n                  const T4& v4) {\n    return v1 + v2 + v3 + v4 > 0;\n  }\n};\n\n// A 4-ary predicate-formatter function.\ntemplate <typename T1, typename T2, typename T3, typename T4>\ntesting::AssertionResult PredFormatFunction4(const char* e1,\n                                             const char* e2,\n                                             const char* e3,\n                                             const char* e4,\n                                             const T1& v1,\n                                             const T2& v2,\n                                             const T3& v3,\n                                             const T4& v4) {\n  if (PredFunction4(v1, v2, v3, v4))\n    return testing::AssertionSuccess();\n\n  return testing::AssertionFailure()\n      << e1 << \" + \" << e2 << \" + \" << e3 << \" + \" << e4\n      << \" is expected to be positive, but evaluates to \"\n      << v1 + v2 + v3 + v4 << \".\";\n}\n\n// A 4-ary predicate-formatter functor.\nstruct PredFormatFunctor4 {\n  template <typename T1, typename T2, typename T3, typename T4>\n  testing::AssertionResult operator()(const char* e1,\n                                      const char* e2,\n                                      const char* e3,\n                                      const char* e4,\n                                      const T1& v1,\n                                      const T2& v2,\n                                      const T3& v3,\n                                      const T4& v4) const {\n    return PredFormatFunction4(e1, e2, e3, e4, v1, v2, v3, v4);\n  }\n};\n\n// Tests for {EXPECT|ASSERT}_PRED_FORMAT4.\n\nclass Predicate4Test : public testing::Test {\n protected:\n  virtual void SetUp() {\n    expected_to_finish_ = true;\n    finished_ = false;\n    n1_ = n2_ = n3_ = n4_ = 0;\n  }\n\n  virtual void TearDown() {\n    // Verifies that each of the predicate's arguments was evaluated\n    // exactly once.\n    EXPECT_EQ(1, n1_) <<\n        \"The predicate assertion didn't evaluate argument 2 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n2_) <<\n        \"The predicate assertion didn't evaluate argument 3 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n3_) <<\n        \"The predicate assertion didn't evaluate argument 4 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n4_) <<\n        \"The predicate assertion didn't evaluate argument 5 \"\n        \"exactly once.\";\n\n    // Verifies that the control flow in the test function is expected.\n    if (expected_to_finish_ && !finished_) {\n      FAIL() << \"The predicate assertion unexpactedly aborted the test.\";\n    } else if (!expected_to_finish_ && finished_) {\n      FAIL() << \"The failed predicate assertion didn't abort the test \"\n                \"as expected.\";\n    }\n  }\n\n  // true iff the test function is expected to run to finish.\n  static bool expected_to_finish_;\n\n  // true iff the test function did run to finish.\n  static bool finished_;\n\n  static int n1_;\n  static int n2_;\n  static int n3_;\n  static int n4_;\n};\n\nbool Predicate4Test::expected_to_finish_;\nbool Predicate4Test::finished_;\nint Predicate4Test::n1_;\nint Predicate4Test::n2_;\nint Predicate4Test::n3_;\nint Predicate4Test::n4_;\n\ntypedef Predicate4Test EXPECT_PRED_FORMAT4Test;\ntypedef Predicate4Test ASSERT_PRED_FORMAT4Test;\ntypedef Predicate4Test EXPECT_PRED4Test;\ntypedef Predicate4Test ASSERT_PRED4Test;\n\n// Tests a successful EXPECT_PRED4 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED4Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED4(PredFunction4Int,\n               ++n1_,\n               ++n2_,\n               ++n3_,\n               ++n4_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED4 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED4Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED4(PredFunction4Bool,\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_),\n               Bool(++n4_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED4 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED4Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED4(PredFunctor4(),\n               ++n1_,\n               ++n2_,\n               ++n3_,\n               ++n4_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED4 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED4Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED4(PredFunctor4(),\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_),\n               Bool(++n4_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED4 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED4Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED4(PredFunction4Int,\n                 n1_++,\n                 n2_++,\n                 n3_++,\n                 n4_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED4 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED4Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED4(PredFunction4Bool,\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++),\n                 Bool(n4_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED4 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED4Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED4(PredFunctor4(),\n                 n1_++,\n                 n2_++,\n                 n3_++,\n                 n4_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED4 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED4Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED4(PredFunctor4(),\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++),\n                 Bool(n4_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED4 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED4Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED4(PredFunction4Int,\n               ++n1_,\n               ++n2_,\n               ++n3_,\n               ++n4_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED4 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED4Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED4(PredFunction4Bool,\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_),\n               Bool(++n4_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED4 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED4Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED4(PredFunctor4(),\n               ++n1_,\n               ++n2_,\n               ++n3_,\n               ++n4_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED4 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED4Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED4(PredFunctor4(),\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_),\n               Bool(++n4_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED4 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED4Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED4(PredFunction4Int,\n                 n1_++,\n                 n2_++,\n                 n3_++,\n                 n4_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED4 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED4Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED4(PredFunction4Bool,\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++),\n                 Bool(n4_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED4 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED4Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED4(PredFunctor4(),\n                 n1_++,\n                 n2_++,\n                 n3_++,\n                 n4_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED4 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED4Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED4(PredFunctor4(),\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++),\n                 Bool(n4_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful EXPECT_PRED_FORMAT4 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT4(PredFormatFunction4,\n                      ++n1_,\n                      ++n2_,\n                      ++n3_,\n                      ++n4_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT4 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT4(PredFormatFunction4,\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_),\n                      Bool(++n4_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT4 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT4(PredFormatFunctor4(),\n                      ++n1_,\n                      ++n2_,\n                      ++n3_,\n                      ++n4_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT4 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT4(PredFormatFunctor4(),\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_),\n                      Bool(++n4_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED_FORMAT4 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT4(PredFormatFunction4,\n                        n1_++,\n                        n2_++,\n                        n3_++,\n                        n4_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT4 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT4(PredFormatFunction4,\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++),\n                        Bool(n4_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT4 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT4(PredFormatFunctor4(),\n                        n1_++,\n                        n2_++,\n                        n3_++,\n                        n4_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT4 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT4(PredFormatFunctor4(),\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++),\n                        Bool(n4_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED_FORMAT4 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT4(PredFormatFunction4,\n                      ++n1_,\n                      ++n2_,\n                      ++n3_,\n                      ++n4_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT4 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT4(PredFormatFunction4,\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_),\n                      Bool(++n4_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT4 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT4(PredFormatFunctor4(),\n                      ++n1_,\n                      ++n2_,\n                      ++n3_,\n                      ++n4_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT4 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT4(PredFormatFunctor4(),\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_),\n                      Bool(++n4_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED_FORMAT4 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT4(PredFormatFunction4,\n                        n1_++,\n                        n2_++,\n                        n3_++,\n                        n4_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT4 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT4(PredFormatFunction4,\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++),\n                        Bool(n4_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT4 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT4(PredFormatFunctor4(),\n                        n1_++,\n                        n2_++,\n                        n3_++,\n                        n4_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT4 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT4(PredFormatFunctor4(),\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++),\n                        Bool(n4_++));\n    finished_ = true;\n  }, \"\");\n}\n// Sample functions/functors for testing 5-ary predicate assertions.\n\n// A 5-ary predicate function.\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nbool PredFunction5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) {\n  return v1 + v2 + v3 + v4 + v5 > 0;\n}\n\n// The following two functions are needed to circumvent a bug in\n// gcc 2.95.3, which sometimes has problem with the above template\n// function.\nbool PredFunction5Int(int v1, int v2, int v3, int v4, int v5) {\n  return v1 + v2 + v3 + v4 + v5 > 0;\n}\nbool PredFunction5Bool(Bool v1, Bool v2, Bool v3, Bool v4, Bool v5) {\n  return v1 + v2 + v3 + v4 + v5 > 0;\n}\n\n// A 5-ary predicate functor.\nstruct PredFunctor5 {\n  template <typename T1, typename T2, typename T3, typename T4, typename T5>\n  bool operator()(const T1& v1,\n                  const T2& v2,\n                  const T3& v3,\n                  const T4& v4,\n                  const T5& v5) {\n    return v1 + v2 + v3 + v4 + v5 > 0;\n  }\n};\n\n// A 5-ary predicate-formatter function.\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\ntesting::AssertionResult PredFormatFunction5(const char* e1,\n                                             const char* e2,\n                                             const char* e3,\n                                             const char* e4,\n                                             const char* e5,\n                                             const T1& v1,\n                                             const T2& v2,\n                                             const T3& v3,\n                                             const T4& v4,\n                                             const T5& v5) {\n  if (PredFunction5(v1, v2, v3, v4, v5))\n    return testing::AssertionSuccess();\n\n  return testing::AssertionFailure()\n      << e1 << \" + \" << e2 << \" + \" << e3 << \" + \" << e4 << \" + \" << e5\n      << \" is expected to be positive, but evaluates to \"\n      << v1 + v2 + v3 + v4 + v5 << \".\";\n}\n\n// A 5-ary predicate-formatter functor.\nstruct PredFormatFunctor5 {\n  template <typename T1, typename T2, typename T3, typename T4, typename T5>\n  testing::AssertionResult operator()(const char* e1,\n                                      const char* e2,\n                                      const char* e3,\n                                      const char* e4,\n                                      const char* e5,\n                                      const T1& v1,\n                                      const T2& v2,\n                                      const T3& v3,\n                                      const T4& v4,\n                                      const T5& v5) const {\n    return PredFormatFunction5(e1, e2, e3, e4, e5, v1, v2, v3, v4, v5);\n  }\n};\n\n// Tests for {EXPECT|ASSERT}_PRED_FORMAT5.\n\nclass Predicate5Test : public testing::Test {\n protected:\n  virtual void SetUp() {\n    expected_to_finish_ = true;\n    finished_ = false;\n    n1_ = n2_ = n3_ = n4_ = n5_ = 0;\n  }\n\n  virtual void TearDown() {\n    // Verifies that each of the predicate's arguments was evaluated\n    // exactly once.\n    EXPECT_EQ(1, n1_) <<\n        \"The predicate assertion didn't evaluate argument 2 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n2_) <<\n        \"The predicate assertion didn't evaluate argument 3 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n3_) <<\n        \"The predicate assertion didn't evaluate argument 4 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n4_) <<\n        \"The predicate assertion didn't evaluate argument 5 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n5_) <<\n        \"The predicate assertion didn't evaluate argument 6 \"\n        \"exactly once.\";\n\n    // Verifies that the control flow in the test function is expected.\n    if (expected_to_finish_ && !finished_) {\n      FAIL() << \"The predicate assertion unexpactedly aborted the test.\";\n    } else if (!expected_to_finish_ && finished_) {\n      FAIL() << \"The failed predicate assertion didn't abort the test \"\n                \"as expected.\";\n    }\n  }\n\n  // true iff the test function is expected to run to finish.\n  static bool expected_to_finish_;\n\n  // true iff the test function did run to finish.\n  static bool finished_;\n\n  static int n1_;\n  static int n2_;\n  static int n3_;\n  static int n4_;\n  static int n5_;\n};\n\nbool Predicate5Test::expected_to_finish_;\nbool Predicate5Test::finished_;\nint Predicate5Test::n1_;\nint Predicate5Test::n2_;\nint Predicate5Test::n3_;\nint Predicate5Test::n4_;\nint Predicate5Test::n5_;\n\ntypedef Predicate5Test EXPECT_PRED_FORMAT5Test;\ntypedef Predicate5Test ASSERT_PRED_FORMAT5Test;\ntypedef Predicate5Test EXPECT_PRED5Test;\ntypedef Predicate5Test ASSERT_PRED5Test;\n\n// Tests a successful EXPECT_PRED5 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED5Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED5(PredFunction5Int,\n               ++n1_,\n               ++n2_,\n               ++n3_,\n               ++n4_,\n               ++n5_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED5 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED5Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED5(PredFunction5Bool,\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_),\n               Bool(++n4_),\n               Bool(++n5_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED5 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED5Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED5(PredFunctor5(),\n               ++n1_,\n               ++n2_,\n               ++n3_,\n               ++n4_,\n               ++n5_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED5 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED5Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED5(PredFunctor5(),\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_),\n               Bool(++n4_),\n               Bool(++n5_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED5 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED5Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED5(PredFunction5Int,\n                 n1_++,\n                 n2_++,\n                 n3_++,\n                 n4_++,\n                 n5_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED5 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED5Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED5(PredFunction5Bool,\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++),\n                 Bool(n4_++),\n                 Bool(n5_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED5 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED5Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED5(PredFunctor5(),\n                 n1_++,\n                 n2_++,\n                 n3_++,\n                 n4_++,\n                 n5_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED5 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED5Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED5(PredFunctor5(),\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++),\n                 Bool(n4_++),\n                 Bool(n5_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED5 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED5Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED5(PredFunction5Int,\n               ++n1_,\n               ++n2_,\n               ++n3_,\n               ++n4_,\n               ++n5_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED5 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED5Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED5(PredFunction5Bool,\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_),\n               Bool(++n4_),\n               Bool(++n5_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED5 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED5Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED5(PredFunctor5(),\n               ++n1_,\n               ++n2_,\n               ++n3_,\n               ++n4_,\n               ++n5_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED5 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED5Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED5(PredFunctor5(),\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_),\n               Bool(++n4_),\n               Bool(++n5_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED5 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED5Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED5(PredFunction5Int,\n                 n1_++,\n                 n2_++,\n                 n3_++,\n                 n4_++,\n                 n5_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED5 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED5Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED5(PredFunction5Bool,\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++),\n                 Bool(n4_++),\n                 Bool(n5_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED5 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED5Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED5(PredFunctor5(),\n                 n1_++,\n                 n2_++,\n                 n3_++,\n                 n4_++,\n                 n5_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED5 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED5Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED5(PredFunctor5(),\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++),\n                 Bool(n4_++),\n                 Bool(n5_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful EXPECT_PRED_FORMAT5 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT5(PredFormatFunction5,\n                      ++n1_,\n                      ++n2_,\n                      ++n3_,\n                      ++n4_,\n                      ++n5_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT5 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT5(PredFormatFunction5,\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_),\n                      Bool(++n4_),\n                      Bool(++n5_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT5 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT5(PredFormatFunctor5(),\n                      ++n1_,\n                      ++n2_,\n                      ++n3_,\n                      ++n4_,\n                      ++n5_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT5 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT5(PredFormatFunctor5(),\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_),\n                      Bool(++n4_),\n                      Bool(++n5_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED_FORMAT5 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT5(PredFormatFunction5,\n                        n1_++,\n                        n2_++,\n                        n3_++,\n                        n4_++,\n                        n5_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT5 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT5(PredFormatFunction5,\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++),\n                        Bool(n4_++),\n                        Bool(n5_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT5 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT5(PredFormatFunctor5(),\n                        n1_++,\n                        n2_++,\n                        n3_++,\n                        n4_++,\n                        n5_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT5 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT5(PredFormatFunctor5(),\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++),\n                        Bool(n4_++),\n                        Bool(n5_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED_FORMAT5 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT5(PredFormatFunction5,\n                      ++n1_,\n                      ++n2_,\n                      ++n3_,\n                      ++n4_,\n                      ++n5_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT5 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT5(PredFormatFunction5,\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_),\n                      Bool(++n4_),\n                      Bool(++n5_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT5 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT5(PredFormatFunctor5(),\n                      ++n1_,\n                      ++n2_,\n                      ++n3_,\n                      ++n4_,\n                      ++n5_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT5 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT5(PredFormatFunctor5(),\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_),\n                      Bool(++n4_),\n                      Bool(++n5_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED_FORMAT5 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT5(PredFormatFunction5,\n                        n1_++,\n                        n2_++,\n                        n3_++,\n                        n4_++,\n                        n5_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT5 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT5(PredFormatFunction5,\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++),\n                        Bool(n4_++),\n                        Bool(n5_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT5 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT5(PredFormatFunctor5(),\n                        n1_++,\n                        n2_++,\n                        n3_++,\n                        n4_++,\n                        n5_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT5 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT5(PredFormatFunctor5(),\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++),\n                        Bool(n4_++),\n                        Bool(n5_++));\n    finished_ = true;\n  }, \"\");\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_premature_exit_test.cc",
    "content": "// Copyright 2013, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Tests that Google Test manipulates the premature-exit-detection\n// file correctly.\n\n#include <stdio.h>\n\n#include \"gtest/gtest.h\"\n\nusing ::testing::InitGoogleTest;\nusing ::testing::Test;\nusing ::testing::internal::posix::GetEnv;\nusing ::testing::internal::posix::Stat;\nusing ::testing::internal::posix::StatStruct;\n\nnamespace {\n\nclass PrematureExitTest : public Test {\n public:\n  // Returns true iff the given file exists.\n  static bool FileExists(const char* filepath) {\n    StatStruct stat;\n    return Stat(filepath, &stat) == 0;\n  }\n\n protected:\n  PrematureExitTest() {\n    premature_exit_file_path_ = GetEnv(\"TEST_PREMATURE_EXIT_FILE\");\n\n    // Normalize NULL to \"\" for ease of handling.\n    if (premature_exit_file_path_ == NULL) {\n      premature_exit_file_path_ = \"\";\n    }\n  }\n\n  // Returns true iff the premature-exit file exists.\n  bool PrematureExitFileExists() const {\n    return FileExists(premature_exit_file_path_);\n  }\n\n  const char* premature_exit_file_path_;\n};\n\ntypedef PrematureExitTest PrematureExitDeathTest;\n\n// Tests that:\n//   - the premature-exit file exists during the execution of a\n//     death test (EXPECT_DEATH*), and\n//   - a death test doesn't interfere with the main test process's\n//     handling of the premature-exit file.\nTEST_F(PrematureExitDeathTest, FileExistsDuringExecutionOfDeathTest) {\n  if (*premature_exit_file_path_ == '\\0') {\n    return;\n  }\n\n  EXPECT_DEATH_IF_SUPPORTED({\n      // If the file exists, crash the process such that the main test\n      // process will catch the (expected) crash and report a success;\n      // otherwise don't crash, which will cause the main test process\n      // to report that the death test has failed.\n      if (PrematureExitFileExists()) {\n        exit(1);\n      }\n    }, \"\");\n}\n\n// Tests that the premature-exit file exists during the execution of a\n// normal (non-death) test.\nTEST_F(PrematureExitTest, PrematureExitFileExistsDuringTestExecution) {\n  if (*premature_exit_file_path_ == '\\0') {\n    return;\n  }\n\n  EXPECT_TRUE(PrematureExitFileExists())\n      << \" file \" << premature_exit_file_path_\n      << \" should exist during test execution, but doesn't.\";\n}\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  InitGoogleTest(&argc, argv);\n  const int exit_code = RUN_ALL_TESTS();\n\n  // Test that the premature-exit file is deleted upon return from\n  // RUN_ALL_TESTS().\n  const char* const filepath = GetEnv(\"TEST_PREMATURE_EXIT_FILE\");\n  if (filepath != NULL && *filepath != '\\0') {\n    if (PrematureExitTest::FileExists(filepath)) {\n      printf(\n          \"File %s shouldn't exist after the test program finishes, but does.\",\n          filepath);\n      return 1;\n    }\n  }\n\n  return exit_code;\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_prod_test.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Unit test for gtest_prod.h.\n\n#include \"production.h\"\n#include \"gtest/gtest.h\"\n\n// Tests that private members can be accessed from a TEST declared as\n// a friend of the class.\nTEST(PrivateCodeTest, CanAccessPrivateMembers) {\n  PrivateCode a;\n  EXPECT_EQ(0, a.x_);\n\n  a.set_x(1);\n  EXPECT_EQ(1, a.x_);\n}\n\ntypedef testing::Test PrivateCodeFixtureTest;\n\n// Tests that private members can be accessed from a TEST_F declared\n// as a friend of the class.\nTEST_F(PrivateCodeFixtureTest, CanAccessPrivateMembers) {\n  PrivateCode a;\n  EXPECT_EQ(0, a.x_);\n\n  a.set_x(2);\n  EXPECT_EQ(2, a.x_);\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_repeat_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Tests the --gtest_repeat=number flag.\n\n#include <stdlib.h>\n#include <iostream>\n#include \"gtest/gtest.h\"\n#include \"src/gtest-internal-inl.h\"\n\nnamespace testing {\n\nGTEST_DECLARE_string_(death_test_style);\nGTEST_DECLARE_string_(filter);\nGTEST_DECLARE_int32_(repeat);\n\n}  // namespace testing\n\nusing testing::GTEST_FLAG(death_test_style);\nusing testing::GTEST_FLAG(filter);\nusing testing::GTEST_FLAG(repeat);\n\nnamespace {\n\n// We need this when we are testing Google Test itself and therefore\n// cannot use Google Test assertions.\n#define GTEST_CHECK_INT_EQ_(expected, actual) \\\n  do {\\\n    const int expected_val = (expected);\\\n    const int actual_val = (actual);\\\n    if (::testing::internal::IsTrue(expected_val != actual_val)) {\\\n      ::std::cout << \"Value of: \" #actual \"\\n\"\\\n                  << \"  Actual: \" << actual_val << \"\\n\"\\\n                  << \"Expected: \" #expected \"\\n\"\\\n                  << \"Which is: \" << expected_val << \"\\n\";\\\n      ::testing::internal::posix::Abort();\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n\n// Used for verifying that global environment set-up and tear-down are\n// inside the --gtest_repeat loop.\n\nint g_environment_set_up_count = 0;\nint g_environment_tear_down_count = 0;\n\nclass MyEnvironment : public testing::Environment {\n public:\n  MyEnvironment() {}\n  virtual void SetUp() { g_environment_set_up_count++; }\n  virtual void TearDown() { g_environment_tear_down_count++; }\n};\n\n// A test that should fail.\n\nint g_should_fail_count = 0;\n\nTEST(FooTest, ShouldFail) {\n  g_should_fail_count++;\n  EXPECT_EQ(0, 1) << \"Expected failure.\";\n}\n\n// A test that should pass.\n\nint g_should_pass_count = 0;\n\nTEST(FooTest, ShouldPass) {\n  g_should_pass_count++;\n}\n\n// A test that contains a thread-safe death test and a fast death\n// test.  It should pass.\n\nint g_death_test_count = 0;\n\nTEST(BarDeathTest, ThreadSafeAndFast) {\n  g_death_test_count++;\n\n  GTEST_FLAG(death_test_style) = \"threadsafe\";\n  EXPECT_DEATH_IF_SUPPORTED(::testing::internal::posix::Abort(), \"\");\n\n  GTEST_FLAG(death_test_style) = \"fast\";\n  EXPECT_DEATH_IF_SUPPORTED(::testing::internal::posix::Abort(), \"\");\n}\n\nint g_param_test_count = 0;\n\nconst int kNumberOfParamTests = 10;\n\nclass MyParamTest : public testing::TestWithParam<int> {};\n\nTEST_P(MyParamTest, ShouldPass) {\n  // FIXME: Make parameter value checking robust WRT order of tests.\n  GTEST_CHECK_INT_EQ_(g_param_test_count % kNumberOfParamTests, GetParam());\n  g_param_test_count++;\n}\nINSTANTIATE_TEST_CASE_P(MyParamSequence,\n                        MyParamTest,\n                        testing::Range(0, kNumberOfParamTests));\n\n// Resets the count for each test.\nvoid ResetCounts() {\n  g_environment_set_up_count = 0;\n  g_environment_tear_down_count = 0;\n  g_should_fail_count = 0;\n  g_should_pass_count = 0;\n  g_death_test_count = 0;\n  g_param_test_count = 0;\n}\n\n// Checks that the count for each test is expected.\nvoid CheckCounts(int expected) {\n  GTEST_CHECK_INT_EQ_(expected, g_environment_set_up_count);\n  GTEST_CHECK_INT_EQ_(expected, g_environment_tear_down_count);\n  GTEST_CHECK_INT_EQ_(expected, g_should_fail_count);\n  GTEST_CHECK_INT_EQ_(expected, g_should_pass_count);\n  GTEST_CHECK_INT_EQ_(expected, g_death_test_count);\n  GTEST_CHECK_INT_EQ_(expected * kNumberOfParamTests, g_param_test_count);\n}\n\n// Tests the behavior of Google Test when --gtest_repeat is not specified.\nvoid TestRepeatUnspecified() {\n  ResetCounts();\n  GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());\n  CheckCounts(1);\n}\n\n// Tests the behavior of Google Test when --gtest_repeat has the given value.\nvoid TestRepeat(int repeat) {\n  GTEST_FLAG(repeat) = repeat;\n\n  ResetCounts();\n  GTEST_CHECK_INT_EQ_(repeat > 0 ? 1 : 0, RUN_ALL_TESTS());\n  CheckCounts(repeat);\n}\n\n// Tests using --gtest_repeat when --gtest_filter specifies an empty\n// set of tests.\nvoid TestRepeatWithEmptyFilter(int repeat) {\n  GTEST_FLAG(repeat) = repeat;\n  GTEST_FLAG(filter) = \"None\";\n\n  ResetCounts();\n  GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());\n  CheckCounts(0);\n}\n\n// Tests using --gtest_repeat when --gtest_filter specifies a set of\n// successful tests.\nvoid TestRepeatWithFilterForSuccessfulTests(int repeat) {\n  GTEST_FLAG(repeat) = repeat;\n  GTEST_FLAG(filter) = \"*-*ShouldFail\";\n\n  ResetCounts();\n  GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());\n  GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);\n  GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);\n  GTEST_CHECK_INT_EQ_(0, g_should_fail_count);\n  GTEST_CHECK_INT_EQ_(repeat, g_should_pass_count);\n  GTEST_CHECK_INT_EQ_(repeat, g_death_test_count);\n  GTEST_CHECK_INT_EQ_(repeat * kNumberOfParamTests, g_param_test_count);\n}\n\n// Tests using --gtest_repeat when --gtest_filter specifies a set of\n// failed tests.\nvoid TestRepeatWithFilterForFailedTests(int repeat) {\n  GTEST_FLAG(repeat) = repeat;\n  GTEST_FLAG(filter) = \"*ShouldFail\";\n\n  ResetCounts();\n  GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());\n  GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);\n  GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);\n  GTEST_CHECK_INT_EQ_(repeat, g_should_fail_count);\n  GTEST_CHECK_INT_EQ_(0, g_should_pass_count);\n  GTEST_CHECK_INT_EQ_(0, g_death_test_count);\n  GTEST_CHECK_INT_EQ_(0, g_param_test_count);\n}\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  testing::InitGoogleTest(&argc, argv);\n\n  testing::AddGlobalTestEnvironment(new MyEnvironment);\n\n  TestRepeatUnspecified();\n  TestRepeat(0);\n  TestRepeat(1);\n  TestRepeat(5);\n\n  TestRepeatWithEmptyFilter(2);\n  TestRepeatWithEmptyFilter(3);\n\n  TestRepeatWithFilterForSuccessfulTests(3);\n\n  TestRepeatWithFilterForFailedTests(4);\n\n  // It would be nice to verify that the tests indeed loop forever\n  // when GTEST_FLAG(repeat) is negative, but this test will be quite\n  // complicated to write.  Since this flag is for interactive\n  // debugging only and doesn't affect the normal test result, such a\n  // test would be an overkill.\n\n  printf(\"PASS\\n\");\n  return 0;\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_sole_header_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// This test verifies that it's possible to use Google Test by including\n// the gtest.h header file alone.\n\n#include \"gtest/gtest.h\"\n\nnamespace {\n\nvoid Subroutine() {\n  EXPECT_EQ(42, 42);\n}\n\nTEST(NoFatalFailureTest, ExpectNoFatalFailure) {\n  EXPECT_NO_FATAL_FAILURE(;);\n  EXPECT_NO_FATAL_FAILURE(SUCCEED());\n  EXPECT_NO_FATAL_FAILURE(Subroutine());\n  EXPECT_NO_FATAL_FAILURE({ SUCCEED(); });\n}\n\nTEST(NoFatalFailureTest, AssertNoFatalFailure) {\n  ASSERT_NO_FATAL_FAILURE(;);\n  ASSERT_NO_FATAL_FAILURE(SUCCEED());\n  ASSERT_NO_FATAL_FAILURE(Subroutine());\n  ASSERT_NO_FATAL_FAILURE({ SUCCEED(); });\n}\n\n}  // namespace\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_stress_test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Tests that SCOPED_TRACE() and various Google Test assertions can be\n// used in a large number of threads concurrently.\n\n#include \"gtest/gtest.h\"\n\n#include <vector>\n\n#include \"src/gtest-internal-inl.h\"\n\n#if GTEST_IS_THREADSAFE\n\nnamespace testing {\nnamespace {\n\nusing internal::Notification;\nusing internal::TestPropertyKeyIs;\nusing internal::ThreadWithParam;\nusing internal::scoped_ptr;\n\n// In order to run tests in this file, for platforms where Google Test is\n// thread safe, implement ThreadWithParam. See the description of its API\n// in gtest-port.h, where it is defined for already supported platforms.\n\n// How many threads to create?\nconst int kThreadCount = 50;\n\nstd::string IdToKey(int id, const char* suffix) {\n  Message key;\n  key << \"key_\" << id << \"_\" << suffix;\n  return key.GetString();\n}\n\nstd::string IdToString(int id) {\n  Message id_message;\n  id_message << id;\n  return id_message.GetString();\n}\n\nvoid ExpectKeyAndValueWereRecordedForId(\n    const std::vector<TestProperty>& properties,\n    int id, const char* suffix) {\n  TestPropertyKeyIs matches_key(IdToKey(id, suffix).c_str());\n  const std::vector<TestProperty>::const_iterator property =\n      std::find_if(properties.begin(), properties.end(), matches_key);\n  ASSERT_TRUE(property != properties.end())\n      << \"expecting \" << suffix << \" value for id \" << id;\n  EXPECT_STREQ(IdToString(id).c_str(), property->value());\n}\n\n// Calls a large number of Google Test assertions, where exactly one of them\n// will fail.\nvoid ManyAsserts(int id) {\n  GTEST_LOG_(INFO) << \"Thread #\" << id << \" running...\";\n\n  SCOPED_TRACE(Message() << \"Thread #\" << id);\n\n  for (int i = 0; i < kThreadCount; i++) {\n    SCOPED_TRACE(Message() << \"Iteration #\" << i);\n\n    // A bunch of assertions that should succeed.\n    EXPECT_TRUE(true);\n    ASSERT_FALSE(false) << \"This shouldn't fail.\";\n    EXPECT_STREQ(\"a\", \"a\");\n    ASSERT_LE(5, 6);\n    EXPECT_EQ(i, i) << \"This shouldn't fail.\";\n\n    // RecordProperty() should interact safely with other threads as well.\n    // The shared_key forces property updates.\n    Test::RecordProperty(IdToKey(id, \"string\").c_str(), IdToString(id).c_str());\n    Test::RecordProperty(IdToKey(id, \"int\").c_str(), id);\n    Test::RecordProperty(\"shared_key\", IdToString(id).c_str());\n\n    // This assertion should fail kThreadCount times per thread.  It\n    // is for testing whether Google Test can handle failed assertions in a\n    // multi-threaded context.\n    EXPECT_LT(i, 0) << \"This should always fail.\";\n  }\n}\n\nvoid CheckTestFailureCount(int expected_failures) {\n  const TestInfo* const info = UnitTest::GetInstance()->current_test_info();\n  const TestResult* const result = info->result();\n  GTEST_CHECK_(expected_failures == result->total_part_count())\n      << \"Logged \" << result->total_part_count() << \" failures \"\n      << \" vs. \" << expected_failures << \" expected\";\n}\n\n// Tests using SCOPED_TRACE() and Google Test assertions in many threads\n// concurrently.\nTEST(StressTest, CanUseScopedTraceAndAssertionsInManyThreads) {\n  {\n    scoped_ptr<ThreadWithParam<int> > threads[kThreadCount];\n    Notification threads_can_start;\n    for (int i = 0; i != kThreadCount; i++)\n      threads[i].reset(new ThreadWithParam<int>(&ManyAsserts,\n                                                i,\n                                                &threads_can_start));\n\n    threads_can_start.Notify();\n\n    // Blocks until all the threads are done.\n    for (int i = 0; i != kThreadCount; i++)\n      threads[i]->Join();\n  }\n\n  // Ensures that kThreadCount*kThreadCount failures have been reported.\n  const TestInfo* const info = UnitTest::GetInstance()->current_test_info();\n  const TestResult* const result = info->result();\n\n  std::vector<TestProperty> properties;\n  // We have no access to the TestResult's list of properties but we can\n  // copy them one by one.\n  for (int i = 0; i < result->test_property_count(); ++i)\n    properties.push_back(result->GetTestProperty(i));\n\n  EXPECT_EQ(kThreadCount * 2 + 1, result->test_property_count())\n      << \"String and int values recorded on each thread, \"\n      << \"as well as one shared_key\";\n  for (int i = 0; i < kThreadCount; ++i) {\n    ExpectKeyAndValueWereRecordedForId(properties, i, \"string\");\n    ExpectKeyAndValueWereRecordedForId(properties, i, \"int\");\n  }\n  CheckTestFailureCount(kThreadCount*kThreadCount);\n}\n\nvoid FailingThread(bool is_fatal) {\n  if (is_fatal)\n    FAIL() << \"Fatal failure in some other thread. \"\n           << \"(This failure is expected.)\";\n  else\n    ADD_FAILURE() << \"Non-fatal failure in some other thread. \"\n                  << \"(This failure is expected.)\";\n}\n\nvoid GenerateFatalFailureInAnotherThread(bool is_fatal) {\n  ThreadWithParam<bool> thread(&FailingThread, is_fatal, NULL);\n  thread.Join();\n}\n\nTEST(NoFatalFailureTest, ExpectNoFatalFailureIgnoresFailuresInOtherThreads) {\n  EXPECT_NO_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true));\n  // We should only have one failure (the one from\n  // GenerateFatalFailureInAnotherThread()), since the EXPECT_NO_FATAL_FAILURE\n  // should succeed.\n  CheckTestFailureCount(1);\n}\n\nvoid AssertNoFatalFailureIgnoresFailuresInOtherThreads() {\n  ASSERT_NO_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true));\n}\nTEST(NoFatalFailureTest, AssertNoFatalFailureIgnoresFailuresInOtherThreads) {\n  // Using a subroutine, to make sure, that the test continues.\n  AssertNoFatalFailureIgnoresFailuresInOtherThreads();\n  // We should only have one failure (the one from\n  // GenerateFatalFailureInAnotherThread()), since the EXPECT_NO_FATAL_FAILURE\n  // should succeed.\n  CheckTestFailureCount(1);\n}\n\nTEST(FatalFailureTest, ExpectFatalFailureIgnoresFailuresInOtherThreads) {\n  // This statement should fail, since the current thread doesn't generate a\n  // fatal failure, only another one does.\n  EXPECT_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true), \"expected\");\n  CheckTestFailureCount(2);\n}\n\nTEST(FatalFailureOnAllThreadsTest, ExpectFatalFailureOnAllThreads) {\n  // This statement should succeed, because failures in all threads are\n  // considered.\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(\n      GenerateFatalFailureInAnotherThread(true), \"expected\");\n  CheckTestFailureCount(0);\n  // We need to add a failure, because main() checks that there are failures.\n  // But when only this test is run, we shouldn't have any failures.\n  ADD_FAILURE() << \"This is an expected non-fatal failure.\";\n}\n\nTEST(NonFatalFailureTest, ExpectNonFatalFailureIgnoresFailuresInOtherThreads) {\n  // This statement should fail, since the current thread doesn't generate a\n  // fatal failure, only another one does.\n  EXPECT_NONFATAL_FAILURE(GenerateFatalFailureInAnotherThread(false),\n                          \"expected\");\n  CheckTestFailureCount(2);\n}\n\nTEST(NonFatalFailureOnAllThreadsTest, ExpectNonFatalFailureOnAllThreads) {\n  // This statement should succeed, because failures in all threads are\n  // considered.\n  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(\n      GenerateFatalFailureInAnotherThread(false), \"expected\");\n  CheckTestFailureCount(0);\n  // We need to add a failure, because main() checks that there are failures,\n  // But when only this test is run, we shouldn't have any failures.\n  ADD_FAILURE() << \"This is an expected non-fatal failure.\";\n}\n\n}  // namespace\n}  // namespace testing\n\nint main(int argc, char **argv) {\n  testing::InitGoogleTest(&argc, argv);\n\n  const int result = RUN_ALL_TESTS();  // Expected to fail.\n  GTEST_CHECK_(result == 1) << \"RUN_ALL_TESTS() did not fail as expected\";\n\n  printf(\"\\nPASS\\n\");\n  return 0;\n}\n\n#else\nTEST(StressTest,\n     DISABLED_ThreadSafetyTestsAreSkippedWhenGoogleTestIsNotThreadSafe) {\n}\n\nint main(int argc, char **argv) {\n  testing::InitGoogleTest(&argc, argv);\n  return RUN_ALL_TESTS();\n}\n#endif  // GTEST_IS_THREADSAFE\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_test_macro_stack_footprint_test.cc",
    "content": "// Copyright 2013, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Each TEST() expands to some static registration logic.  GCC puts all\n// such static initialization logic for a translation unit in a common,\n// internal function.  Since Google's build system restricts how much\n// stack space a function can use, there's a limit on how many TEST()s\n// one can put in a single C++ test file.  This test ensures that a large\n// number of TEST()s can be defined in the same translation unit.\n\n#include \"gtest/gtest.h\"\n\n// This macro defines 10 dummy tests.\n#define TEN_TESTS_(test_case_name) \\\n  TEST(test_case_name, T0) {} \\\n  TEST(test_case_name, T1) {} \\\n  TEST(test_case_name, T2) {} \\\n  TEST(test_case_name, T3) {} \\\n  TEST(test_case_name, T4) {} \\\n  TEST(test_case_name, T5) {} \\\n  TEST(test_case_name, T6) {} \\\n  TEST(test_case_name, T7) {} \\\n  TEST(test_case_name, T8) {} \\\n  TEST(test_case_name, T9) {}\n\n// This macro defines 100 dummy tests.\n#define HUNDRED_TESTS_(test_case_name_prefix) \\\n  TEN_TESTS_(test_case_name_prefix ## 0) \\\n  TEN_TESTS_(test_case_name_prefix ## 1) \\\n  TEN_TESTS_(test_case_name_prefix ## 2) \\\n  TEN_TESTS_(test_case_name_prefix ## 3) \\\n  TEN_TESTS_(test_case_name_prefix ## 4) \\\n  TEN_TESTS_(test_case_name_prefix ## 5) \\\n  TEN_TESTS_(test_case_name_prefix ## 6) \\\n  TEN_TESTS_(test_case_name_prefix ## 7) \\\n  TEN_TESTS_(test_case_name_prefix ## 8) \\\n  TEN_TESTS_(test_case_name_prefix ## 9)\n\n// This macro defines 1000 dummy tests.\n#define THOUSAND_TESTS_(test_case_name_prefix) \\\n  HUNDRED_TESTS_(test_case_name_prefix ## 0) \\\n  HUNDRED_TESTS_(test_case_name_prefix ## 1) \\\n  HUNDRED_TESTS_(test_case_name_prefix ## 2) \\\n  HUNDRED_TESTS_(test_case_name_prefix ## 3) \\\n  HUNDRED_TESTS_(test_case_name_prefix ## 4) \\\n  HUNDRED_TESTS_(test_case_name_prefix ## 5) \\\n  HUNDRED_TESTS_(test_case_name_prefix ## 6) \\\n  HUNDRED_TESTS_(test_case_name_prefix ## 7) \\\n  HUNDRED_TESTS_(test_case_name_prefix ## 8) \\\n  HUNDRED_TESTS_(test_case_name_prefix ## 9)\n\n// Ensures that we can define 1000 TEST()s in the same translation\n// unit.\nTHOUSAND_TESTS_(T)\n\nint main(int argc, char **argv) {\n  testing::InitGoogleTest(&argc, argv);\n\n  // We don't actually need to run the dummy tests - the purpose is to\n  // ensure that they compile.\n  return 0;\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_test_utils.py",
    "content": "# Copyright 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test utilities for Google C++ Testing and Mocking Framework.\"\"\"\n# Suppresses the 'Import not at the top of the file' lint complaint.\n# pylint: disable-msg=C6204\n\nimport os\nimport sys\n\nIS_WINDOWS = os.name == 'nt'\nIS_CYGWIN = os.name == 'posix' and 'CYGWIN' in os.uname()[0]\n\nimport atexit\nimport shutil\nimport tempfile\nimport unittest as _test_module\n\ntry:\n  import subprocess\n  _SUBPROCESS_MODULE_AVAILABLE = True\nexcept:\n  import popen2\n  _SUBPROCESS_MODULE_AVAILABLE = False\n# pylint: enable-msg=C6204\n\nGTEST_OUTPUT_VAR_NAME = 'GTEST_OUTPUT'\n\n# The environment variable for specifying the path to the premature-exit file.\nPREMATURE_EXIT_FILE_ENV_VAR = 'TEST_PREMATURE_EXIT_FILE'\n\nenviron = os.environ.copy()\n\n\ndef SetEnvVar(env_var, value):\n  \"\"\"Sets/unsets an environment variable to a given value.\"\"\"\n\n  if value is not None:\n    environ[env_var] = value\n  elif env_var in environ:\n    del environ[env_var]\n\n\n# Here we expose a class from a particular module, depending on the\n# environment. The comment suppresses the 'Invalid variable name' lint\n# complaint.\nTestCase = _test_module.TestCase  # pylint: disable=C6409\n\n# Initially maps a flag to its default value. After\n# _ParseAndStripGTestFlags() is called, maps a flag to its actual value.\n_flag_map = {'source_dir': os.path.dirname(sys.argv[0]),\n             'build_dir': os.path.dirname(sys.argv[0])}\n_gtest_flags_are_parsed = False\n\n\ndef _ParseAndStripGTestFlags(argv):\n  \"\"\"Parses and strips Google Test flags from argv.  This is idempotent.\"\"\"\n\n  # Suppresses the lint complaint about a global variable since we need it\n  # here to maintain module-wide state.\n  global _gtest_flags_are_parsed  # pylint: disable=W0603\n  if _gtest_flags_are_parsed:\n    return\n\n  _gtest_flags_are_parsed = True\n  for flag in _flag_map:\n    # The environment variable overrides the default value.\n    if flag.upper() in os.environ:\n      _flag_map[flag] = os.environ[flag.upper()]\n\n    # The command line flag overrides the environment variable.\n    i = 1  # Skips the program name.\n    while i < len(argv):\n      prefix = '--' + flag + '='\n      if argv[i].startswith(prefix):\n        _flag_map[flag] = argv[i][len(prefix):]\n        del argv[i]\n        break\n      else:\n        # We don't increment i in case we just found a --gtest_* flag\n        # and removed it from argv.\n        i += 1\n\n\ndef GetFlag(flag):\n  \"\"\"Returns the value of the given flag.\"\"\"\n\n  # In case GetFlag() is called before Main(), we always call\n  # _ParseAndStripGTestFlags() here to make sure the --gtest_* flags\n  # are parsed.\n  _ParseAndStripGTestFlags(sys.argv)\n\n  return _flag_map[flag]\n\n\ndef GetSourceDir():\n  \"\"\"Returns the absolute path of the directory where the .py files are.\"\"\"\n\n  return os.path.abspath(GetFlag('source_dir'))\n\n\ndef GetBuildDir():\n  \"\"\"Returns the absolute path of the directory where the test binaries are.\"\"\"\n\n  return os.path.abspath(GetFlag('build_dir'))\n\n\n_temp_dir = None\n\ndef _RemoveTempDir():\n  if _temp_dir:\n    shutil.rmtree(_temp_dir, ignore_errors=True)\n\natexit.register(_RemoveTempDir)\n\n\ndef GetTempDir():\n  global _temp_dir\n  if not _temp_dir:\n    _temp_dir = tempfile.mkdtemp()\n  return _temp_dir\n\n\ndef GetTestExecutablePath(executable_name, build_dir=None):\n  \"\"\"Returns the absolute path of the test binary given its name.\n\n  The function will print a message and abort the program if the resulting file\n  doesn't exist.\n\n  Args:\n    executable_name: name of the test binary that the test script runs.\n    build_dir:       directory where to look for executables, by default\n                     the result of GetBuildDir().\n\n  Returns:\n    The absolute path of the test binary.\n  \"\"\"\n\n  path = os.path.abspath(os.path.join(build_dir or GetBuildDir(),\n                                      executable_name))\n  if (IS_WINDOWS or IS_CYGWIN) and not path.endswith('.exe'):\n    path += '.exe'\n\n  if not os.path.exists(path):\n    message = (\n        'Unable to find the test binary \"%s\". Please make sure to provide\\n'\n        'a path to the binary via the --build_dir flag or the BUILD_DIR\\n'\n        'environment variable.' % path)\n    print >> sys.stderr, message\n    sys.exit(1)\n\n  return path\n\n\ndef GetExitStatus(exit_code):\n  \"\"\"Returns the argument to exit(), or -1 if exit() wasn't called.\n\n  Args:\n    exit_code: the result value of os.system(command).\n  \"\"\"\n\n  if os.name == 'nt':\n    # On Windows, os.WEXITSTATUS() doesn't work and os.system() returns\n    # the argument to exit() directly.\n    return exit_code\n  else:\n    # On Unix, os.WEXITSTATUS() must be used to extract the exit status\n    # from the result of os.system().\n    if os.WIFEXITED(exit_code):\n      return os.WEXITSTATUS(exit_code)\n    else:\n      return -1\n\n\nclass Subprocess:\n  def __init__(self, command, working_dir=None, capture_stderr=True, env=None):\n    \"\"\"Changes into a specified directory, if provided, and executes a command.\n\n    Restores the old directory afterwards.\n\n    Args:\n      command:        The command to run, in the form of sys.argv.\n      working_dir:    The directory to change into.\n      capture_stderr: Determines whether to capture stderr in the output member\n                      or to discard it.\n      env:            Dictionary with environment to pass to the subprocess.\n\n    Returns:\n      An object that represents outcome of the executed process. It has the\n      following attributes:\n        terminated_by_signal   True iff the child process has been terminated\n                               by a signal.\n        signal                 Sygnal that terminated the child process.\n        exited                 True iff the child process exited normally.\n        exit_code              The code with which the child process exited.\n        output                 Child process's stdout and stderr output\n                               combined in a string.\n    \"\"\"\n\n    # The subprocess module is the preferrable way of running programs\n    # since it is available and behaves consistently on all platforms,\n    # including Windows. But it is only available starting in python 2.4.\n    # In earlier python versions, we revert to the popen2 module, which is\n    # available in python 2.0 and later but doesn't provide required\n    # functionality (Popen4) under Windows. This allows us to support Mac\n    # OS X 10.4 Tiger, which has python 2.3 installed.\n    if _SUBPROCESS_MODULE_AVAILABLE:\n      if capture_stderr:\n        stderr = subprocess.STDOUT\n      else:\n        stderr = subprocess.PIPE\n\n      p = subprocess.Popen(command,\n                           stdout=subprocess.PIPE, stderr=stderr,\n                           cwd=working_dir, universal_newlines=True, env=env)\n      # communicate returns a tuple with the file object for the child's\n      # output.\n      self.output = p.communicate()[0]\n      self._return_code = p.returncode\n    else:\n      old_dir = os.getcwd()\n\n      def _ReplaceEnvDict(dest, src):\n        # Changes made by os.environ.clear are not inheritable by child\n        # processes until Python 2.6. To produce inheritable changes we have\n        # to delete environment items with the del statement.\n        for key in dest.keys():\n          del dest[key]\n        dest.update(src)\n\n      # When 'env' is not None, backup the environment variables and replace\n      # them with the passed 'env'. When 'env' is None, we simply use the\n      # current 'os.environ' for compatibility with the subprocess.Popen\n      # semantics used above.\n      if env is not None:\n        old_environ = os.environ.copy()\n        _ReplaceEnvDict(os.environ, env)\n\n      try:\n        if working_dir is not None:\n          os.chdir(working_dir)\n        if capture_stderr:\n          p = popen2.Popen4(command)\n        else:\n          p = popen2.Popen3(command)\n        p.tochild.close()\n        self.output = p.fromchild.read()\n        ret_code = p.wait()\n      finally:\n        os.chdir(old_dir)\n\n        # Restore the old environment variables\n        # if they were replaced.\n        if env is not None:\n          _ReplaceEnvDict(os.environ, old_environ)\n\n      # Converts ret_code to match the semantics of\n      # subprocess.Popen.returncode.\n      if os.WIFSIGNALED(ret_code):\n        self._return_code = -os.WTERMSIG(ret_code)\n      else:  # os.WIFEXITED(ret_code) should return True here.\n        self._return_code = os.WEXITSTATUS(ret_code)\n\n    if self._return_code < 0:\n      self.terminated_by_signal = True\n      self.exited = False\n      self.signal = -self._return_code\n    else:\n      self.terminated_by_signal = False\n      self.exited = True\n      self.exit_code = self._return_code\n\n\ndef Main():\n  \"\"\"Runs the unit test.\"\"\"\n\n  # We must call _ParseAndStripGTestFlags() before calling\n  # unittest.main().  Otherwise the latter will be confused by the\n  # --gtest_* flags.\n  _ParseAndStripGTestFlags(sys.argv)\n  # The tested binaries should not be writing XML output files unless the\n  # script explicitly instructs them to.\n  # FIXME: Move this into Subprocess when we implement\n  # passing environment into it as a parameter.\n  if GTEST_OUTPUT_VAR_NAME in os.environ:\n    del os.environ[GTEST_OUTPUT_VAR_NAME]\n\n  _test_module.main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_testbridge_test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2018 Google LLC. All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\"\"\"Verifies that Google Test uses filter provided via testbridge.\"\"\"\n\nimport os\n\nimport gtest_test_utils\n\nbinary_name = 'gtest_testbridge_test_'\nCOMMAND = gtest_test_utils.GetTestExecutablePath(binary_name)\nTESTBRIDGE_NAME = 'TESTBRIDGE_TEST_ONLY'\n\n\ndef Assert(condition):\n  if not condition:\n    raise AssertionError\n\n\nclass GTestTestFilterTest(gtest_test_utils.TestCase):\n\n  def testTestExecutionIsFiltered(self):\n    \"\"\"Tests that the test filter is picked up from the testbridge env var.\"\"\"\n    subprocess_env = os.environ.copy()\n\n    subprocess_env[TESTBRIDGE_NAME] = '*.TestThatSucceeds'\n    p = gtest_test_utils.Subprocess(COMMAND, env=subprocess_env)\n\n    self.assertEquals(0, p.exit_code)\n\n    Assert('filter = *.TestThatSucceeds' in p.output)\n    Assert('[       OK ] TestFilterTest.TestThatSucceeds' in p.output)\n    Assert('[  PASSED  ] 1 test.' in p.output)\n\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_testbridge_test_.cc",
    "content": "// Copyright 2018, Google LLC.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// This program is meant to be run by gtest_test_filter_test.py.  Do not run\n// it directly.\n\n#include \"gtest/gtest.h\"\n\n// These tests are used to detect if filtering is working. Only\n// 'TestThatSucceeds' should ever run.\n\nTEST(TestFilterTest, TestThatSucceeds) {}\n\nTEST(TestFilterTest, TestThatFails) {\n  ASSERT_TRUE(false) << \"This test should never be run.\";\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_throw_on_failure_ex_test.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// Tests Google Test's throw-on-failure mode with exceptions enabled.\n\n#include \"gtest/gtest.h\"\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdexcept>\n\n// Prints the given failure message and exits the program with\n// non-zero.  We use this instead of a Google Test assertion to\n// indicate a failure, as the latter is been tested and cannot be\n// relied on.\nvoid Fail(const char* msg) {\n  printf(\"FAILURE: %s\\n\", msg);\n  fflush(stdout);\n  exit(1);\n}\n\n// Tests that an assertion failure throws a subclass of\n// std::runtime_error.\nvoid TestFailureThrowsRuntimeError() {\n  testing::GTEST_FLAG(throw_on_failure) = true;\n\n  // A successful assertion shouldn't throw.\n  try {\n    EXPECT_EQ(3, 3);\n  } catch(...) {\n    Fail(\"A successful assertion wrongfully threw.\");\n  }\n\n  // A failed assertion should throw a subclass of std::runtime_error.\n  try {\n    EXPECT_EQ(2, 3) << \"Expected failure\";\n  } catch(const std::runtime_error& e) {\n    if (strstr(e.what(), \"Expected failure\") != NULL)\n      return;\n\n    printf(\"%s\",\n           \"A failed assertion did throw an exception of the right type, \"\n           \"but the message is incorrect.  Instead of containing \\\"Expected \"\n           \"failure\\\", it is:\\n\");\n    Fail(e.what());\n  } catch(...) {\n    Fail(\"A failed assertion threw the wrong type of exception.\");\n  }\n  Fail(\"A failed assertion should've thrown but didn't.\");\n}\n\nint main(int argc, char** argv) {\n  testing::InitGoogleTest(&argc, argv);\n\n  // We want to ensure that people can use Google Test assertions in\n  // other testing frameworks, as long as they initialize Google Test\n  // properly and set the thrown-on-failure mode.  Therefore, we don't\n  // use Google Test's constructs for defining and running tests\n  // (e.g. TEST and RUN_ALL_TESTS) here.\n\n  TestFailureThrowsRuntimeError();\n  return 0;\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_unittest.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Tests for Google Test itself.  This verifies that the basic constructs of\n// Google Test work.\n\n#include \"gtest/gtest.h\"\n\n// Verifies that the command line flag variables can be accessed in\n// code once \"gtest.h\" has been #included.\n// Do not move it after other gtest #includes.\nTEST(CommandLineFlagsTest, CanBeAccessedInCodeOnceGTestHIsIncluded) {\n  bool dummy = testing::GTEST_FLAG(also_run_disabled_tests)\n      || testing::GTEST_FLAG(break_on_failure)\n      || testing::GTEST_FLAG(catch_exceptions)\n      || testing::GTEST_FLAG(color) != \"unknown\"\n      || testing::GTEST_FLAG(filter) != \"unknown\"\n      || testing::GTEST_FLAG(list_tests)\n      || testing::GTEST_FLAG(output) != \"unknown\"\n      || testing::GTEST_FLAG(print_time)\n      || testing::GTEST_FLAG(random_seed)\n      || testing::GTEST_FLAG(repeat) > 0\n      || testing::GTEST_FLAG(show_internal_stack_frames)\n      || testing::GTEST_FLAG(shuffle)\n      || testing::GTEST_FLAG(stack_trace_depth) > 0\n      || testing::GTEST_FLAG(stream_result_to) != \"unknown\"\n      || testing::GTEST_FLAG(throw_on_failure);\n  EXPECT_TRUE(dummy || !dummy);  // Suppresses warning that dummy is unused.\n}\n\n#include <limits.h>  // For INT_MAX.\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n\n#include <map>\n#include <vector>\n#include <ostream>\n#if GTEST_LANG_CXX11\n#include <unordered_set>\n#endif  // GTEST_LANG_CXX11\n\n#include \"gtest/gtest-spi.h\"\n#include \"src/gtest-internal-inl.h\"\n\nnamespace testing {\nnamespace internal {\n\n#if GTEST_CAN_STREAM_RESULTS_\n\nclass StreamingListenerTest : public Test {\n public:\n  class FakeSocketWriter : public StreamingListener::AbstractSocketWriter {\n   public:\n    // Sends a string to the socket.\n    virtual void Send(const std::string& message) { output_ += message; }\n\n    std::string output_;\n  };\n\n  StreamingListenerTest()\n      : fake_sock_writer_(new FakeSocketWriter),\n        streamer_(fake_sock_writer_),\n        test_info_obj_(\"FooTest\", \"Bar\", NULL, NULL,\n                       CodeLocation(__FILE__, __LINE__), 0, NULL) {}\n\n protected:\n  std::string* output() { return &(fake_sock_writer_->output_); }\n\n  FakeSocketWriter* const fake_sock_writer_;\n  StreamingListener streamer_;\n  UnitTest unit_test_;\n  TestInfo test_info_obj_;  // The name test_info_ was taken by testing::Test.\n};\n\nTEST_F(StreamingListenerTest, OnTestProgramEnd) {\n  *output() = \"\";\n  streamer_.OnTestProgramEnd(unit_test_);\n  EXPECT_EQ(\"event=TestProgramEnd&passed=1\\n\", *output());\n}\n\nTEST_F(StreamingListenerTest, OnTestIterationEnd) {\n  *output() = \"\";\n  streamer_.OnTestIterationEnd(unit_test_, 42);\n  EXPECT_EQ(\"event=TestIterationEnd&passed=1&elapsed_time=0ms\\n\", *output());\n}\n\nTEST_F(StreamingListenerTest, OnTestCaseStart) {\n  *output() = \"\";\n  streamer_.OnTestCaseStart(TestCase(\"FooTest\", \"Bar\", NULL, NULL));\n  EXPECT_EQ(\"event=TestCaseStart&name=FooTest\\n\", *output());\n}\n\nTEST_F(StreamingListenerTest, OnTestCaseEnd) {\n  *output() = \"\";\n  streamer_.OnTestCaseEnd(TestCase(\"FooTest\", \"Bar\", NULL, NULL));\n  EXPECT_EQ(\"event=TestCaseEnd&passed=1&elapsed_time=0ms\\n\", *output());\n}\n\nTEST_F(StreamingListenerTest, OnTestStart) {\n  *output() = \"\";\n  streamer_.OnTestStart(test_info_obj_);\n  EXPECT_EQ(\"event=TestStart&name=Bar\\n\", *output());\n}\n\nTEST_F(StreamingListenerTest, OnTestEnd) {\n  *output() = \"\";\n  streamer_.OnTestEnd(test_info_obj_);\n  EXPECT_EQ(\"event=TestEnd&passed=1&elapsed_time=0ms\\n\", *output());\n}\n\nTEST_F(StreamingListenerTest, OnTestPartResult) {\n  *output() = \"\";\n  streamer_.OnTestPartResult(TestPartResult(\n      TestPartResult::kFatalFailure, \"foo.cc\", 42, \"failed=\\n&%\"));\n\n  // Meta characters in the failure message should be properly escaped.\n  EXPECT_EQ(\n      \"event=TestPartResult&file=foo.cc&line=42&message=failed%3D%0A%26%25\\n\",\n      *output());\n}\n\n#endif  // GTEST_CAN_STREAM_RESULTS_\n\n// Provides access to otherwise private parts of the TestEventListeners class\n// that are needed to test it.\nclass TestEventListenersAccessor {\n public:\n  static TestEventListener* GetRepeater(TestEventListeners* listeners) {\n    return listeners->repeater();\n  }\n\n  static void SetDefaultResultPrinter(TestEventListeners* listeners,\n                                      TestEventListener* listener) {\n    listeners->SetDefaultResultPrinter(listener);\n  }\n  static void SetDefaultXmlGenerator(TestEventListeners* listeners,\n                                     TestEventListener* listener) {\n    listeners->SetDefaultXmlGenerator(listener);\n  }\n\n  static bool EventForwardingEnabled(const TestEventListeners& listeners) {\n    return listeners.EventForwardingEnabled();\n  }\n\n  static void SuppressEventForwarding(TestEventListeners* listeners) {\n    listeners->SuppressEventForwarding();\n  }\n};\n\nclass UnitTestRecordPropertyTestHelper : public Test {\n protected:\n  UnitTestRecordPropertyTestHelper() {}\n\n  // Forwards to UnitTest::RecordProperty() to bypass access controls.\n  void UnitTestRecordProperty(const char* key, const std::string& value) {\n    unit_test_.RecordProperty(key, value);\n  }\n\n  UnitTest unit_test_;\n};\n\n}  // namespace internal\n}  // namespace testing\n\nusing testing::AssertionFailure;\nusing testing::AssertionResult;\nusing testing::AssertionSuccess;\nusing testing::DoubleLE;\nusing testing::EmptyTestEventListener;\nusing testing::Environment;\nusing testing::FloatLE;\nusing testing::GTEST_FLAG(also_run_disabled_tests);\nusing testing::GTEST_FLAG(break_on_failure);\nusing testing::GTEST_FLAG(catch_exceptions);\nusing testing::GTEST_FLAG(color);\nusing testing::GTEST_FLAG(death_test_use_fork);\nusing testing::GTEST_FLAG(filter);\nusing testing::GTEST_FLAG(list_tests);\nusing testing::GTEST_FLAG(output);\nusing testing::GTEST_FLAG(print_time);\nusing testing::GTEST_FLAG(random_seed);\nusing testing::GTEST_FLAG(repeat);\nusing testing::GTEST_FLAG(show_internal_stack_frames);\nusing testing::GTEST_FLAG(shuffle);\nusing testing::GTEST_FLAG(stack_trace_depth);\nusing testing::GTEST_FLAG(stream_result_to);\nusing testing::GTEST_FLAG(throw_on_failure);\nusing testing::IsNotSubstring;\nusing testing::IsSubstring;\nusing testing::Message;\nusing testing::ScopedFakeTestPartResultReporter;\nusing testing::StaticAssertTypeEq;\nusing testing::Test;\nusing testing::TestCase;\nusing testing::TestEventListeners;\nusing testing::TestInfo;\nusing testing::TestPartResult;\nusing testing::TestPartResultArray;\nusing testing::TestProperty;\nusing testing::TestResult;\nusing testing::TimeInMillis;\nusing testing::UnitTest;\nusing testing::internal::AddReference;\nusing testing::internal::AlwaysFalse;\nusing testing::internal::AlwaysTrue;\nusing testing::internal::AppendUserMessage;\nusing testing::internal::ArrayAwareFind;\nusing testing::internal::ArrayEq;\nusing testing::internal::CodePointToUtf8;\nusing testing::internal::CompileAssertTypesEqual;\nusing testing::internal::CopyArray;\nusing testing::internal::CountIf;\nusing testing::internal::EqFailure;\nusing testing::internal::FloatingPoint;\nusing testing::internal::ForEach;\nusing testing::internal::FormatEpochTimeInMillisAsIso8601;\nusing testing::internal::FormatTimeInMillisAsSeconds;\nusing testing::internal::GTestFlagSaver;\nusing testing::internal::GetCurrentOsStackTraceExceptTop;\nusing testing::internal::GetElementOr;\nusing testing::internal::GetNextRandomSeed;\nusing testing::internal::GetRandomSeedFromFlag;\nusing testing::internal::GetTestTypeId;\nusing testing::internal::GetTimeInMillis;\nusing testing::internal::GetTypeId;\nusing testing::internal::GetUnitTestImpl;\nusing testing::internal::ImplicitlyConvertible;\nusing testing::internal::Int32;\nusing testing::internal::Int32FromEnvOrDie;\nusing testing::internal::IsAProtocolMessage;\nusing testing::internal::IsContainer;\nusing testing::internal::IsContainerTest;\nusing testing::internal::IsNotContainer;\nusing testing::internal::NativeArray;\nusing testing::internal::OsStackTraceGetter;\nusing testing::internal::OsStackTraceGetterInterface;\nusing testing::internal::ParseInt32Flag;\nusing testing::internal::RelationToSourceCopy;\nusing testing::internal::RelationToSourceReference;\nusing testing::internal::RemoveConst;\nusing testing::internal::RemoveReference;\nusing testing::internal::ShouldRunTestOnShard;\nusing testing::internal::ShouldShard;\nusing testing::internal::ShouldUseColor;\nusing testing::internal::Shuffle;\nusing testing::internal::ShuffleRange;\nusing testing::internal::SkipPrefix;\nusing testing::internal::StreamableToString;\nusing testing::internal::String;\nusing testing::internal::TestEventListenersAccessor;\nusing testing::internal::TestResultAccessor;\nusing testing::internal::UInt32;\nusing testing::internal::UnitTestImpl;\nusing testing::internal::WideStringToUtf8;\nusing testing::internal::edit_distance::CalculateOptimalEdits;\nusing testing::internal::edit_distance::CreateUnifiedDiff;\nusing testing::internal::edit_distance::EditType;\nusing testing::internal::kMaxRandomSeed;\nusing testing::internal::kTestTypeIdInGoogleTest;\nusing testing::kMaxStackTraceDepth;\n\n#if GTEST_HAS_STREAM_REDIRECTION\nusing testing::internal::CaptureStdout;\nusing testing::internal::GetCapturedStdout;\n#endif\n\n#if GTEST_IS_THREADSAFE\nusing testing::internal::ThreadWithParam;\n#endif\n\nclass TestingVector : public std::vector<int> {\n};\n\n::std::ostream& operator<<(::std::ostream& os,\n                           const TestingVector& vector) {\n  os << \"{ \";\n  for (size_t i = 0; i < vector.size(); i++) {\n    os << vector[i] << \" \";\n  }\n  os << \"}\";\n  return os;\n}\n\n// This line tests that we can define tests in an unnamed namespace.\nnamespace {\n\nTEST(GetRandomSeedFromFlagTest, HandlesZero) {\n  const int seed = GetRandomSeedFromFlag(0);\n  EXPECT_LE(1, seed);\n  EXPECT_LE(seed, static_cast<int>(kMaxRandomSeed));\n}\n\nTEST(GetRandomSeedFromFlagTest, PreservesValidSeed) {\n  EXPECT_EQ(1, GetRandomSeedFromFlag(1));\n  EXPECT_EQ(2, GetRandomSeedFromFlag(2));\n  EXPECT_EQ(kMaxRandomSeed - 1, GetRandomSeedFromFlag(kMaxRandomSeed - 1));\n  EXPECT_EQ(static_cast<int>(kMaxRandomSeed),\n            GetRandomSeedFromFlag(kMaxRandomSeed));\n}\n\nTEST(GetRandomSeedFromFlagTest, NormalizesInvalidSeed) {\n  const int seed1 = GetRandomSeedFromFlag(-1);\n  EXPECT_LE(1, seed1);\n  EXPECT_LE(seed1, static_cast<int>(kMaxRandomSeed));\n\n  const int seed2 = GetRandomSeedFromFlag(kMaxRandomSeed + 1);\n  EXPECT_LE(1, seed2);\n  EXPECT_LE(seed2, static_cast<int>(kMaxRandomSeed));\n}\n\nTEST(GetNextRandomSeedTest, WorksForValidInput) {\n  EXPECT_EQ(2, GetNextRandomSeed(1));\n  EXPECT_EQ(3, GetNextRandomSeed(2));\n  EXPECT_EQ(static_cast<int>(kMaxRandomSeed),\n            GetNextRandomSeed(kMaxRandomSeed - 1));\n  EXPECT_EQ(1, GetNextRandomSeed(kMaxRandomSeed));\n\n  // We deliberately don't test GetNextRandomSeed() with invalid\n  // inputs, as that requires death tests, which are expensive.  This\n  // is fine as GetNextRandomSeed() is internal and has a\n  // straightforward definition.\n}\n\nstatic void ClearCurrentTestPartResults() {\n  TestResultAccessor::ClearTestPartResults(\n      GetUnitTestImpl()->current_test_result());\n}\n\n// Tests GetTypeId.\n\nTEST(GetTypeIdTest, ReturnsSameValueForSameType) {\n  EXPECT_EQ(GetTypeId<int>(), GetTypeId<int>());\n  EXPECT_EQ(GetTypeId<Test>(), GetTypeId<Test>());\n}\n\nclass SubClassOfTest : public Test {};\nclass AnotherSubClassOfTest : public Test {};\n\nTEST(GetTypeIdTest, ReturnsDifferentValuesForDifferentTypes) {\n  EXPECT_NE(GetTypeId<int>(), GetTypeId<const int>());\n  EXPECT_NE(GetTypeId<int>(), GetTypeId<char>());\n  EXPECT_NE(GetTypeId<int>(), GetTestTypeId());\n  EXPECT_NE(GetTypeId<SubClassOfTest>(), GetTestTypeId());\n  EXPECT_NE(GetTypeId<AnotherSubClassOfTest>(), GetTestTypeId());\n  EXPECT_NE(GetTypeId<AnotherSubClassOfTest>(), GetTypeId<SubClassOfTest>());\n}\n\n// Verifies that GetTestTypeId() returns the same value, no matter it\n// is called from inside Google Test or outside of it.\nTEST(GetTestTypeIdTest, ReturnsTheSameValueInsideOrOutsideOfGoogleTest) {\n  EXPECT_EQ(kTestTypeIdInGoogleTest, GetTestTypeId());\n}\n\n// Tests CanonicalizeForStdLibVersioning.\n\nusing ::testing::internal::CanonicalizeForStdLibVersioning;\n\nTEST(CanonicalizeForStdLibVersioning, LeavesUnversionedNamesUnchanged) {\n  EXPECT_EQ(\"std::bind\", CanonicalizeForStdLibVersioning(\"std::bind\"));\n  EXPECT_EQ(\"std::_\", CanonicalizeForStdLibVersioning(\"std::_\"));\n  EXPECT_EQ(\"std::__foo\", CanonicalizeForStdLibVersioning(\"std::__foo\"));\n  EXPECT_EQ(\"gtl::__1::x\", CanonicalizeForStdLibVersioning(\"gtl::__1::x\"));\n  EXPECT_EQ(\"__1::x\", CanonicalizeForStdLibVersioning(\"__1::x\"));\n  EXPECT_EQ(\"::__1::x\", CanonicalizeForStdLibVersioning(\"::__1::x\"));\n}\n\nTEST(CanonicalizeForStdLibVersioning, ElidesDoubleUnderNames) {\n  EXPECT_EQ(\"std::bind\", CanonicalizeForStdLibVersioning(\"std::__1::bind\"));\n  EXPECT_EQ(\"std::_\", CanonicalizeForStdLibVersioning(\"std::__1::_\"));\n\n  EXPECT_EQ(\"std::bind\", CanonicalizeForStdLibVersioning(\"std::__g::bind\"));\n  EXPECT_EQ(\"std::_\", CanonicalizeForStdLibVersioning(\"std::__g::_\"));\n\n  EXPECT_EQ(\"std::bind\",\n            CanonicalizeForStdLibVersioning(\"std::__google::bind\"));\n  EXPECT_EQ(\"std::_\", CanonicalizeForStdLibVersioning(\"std::__google::_\"));\n}\n\n// Tests FormatTimeInMillisAsSeconds().\n\nTEST(FormatTimeInMillisAsSecondsTest, FormatsZero) {\n  EXPECT_EQ(\"0\", FormatTimeInMillisAsSeconds(0));\n}\n\nTEST(FormatTimeInMillisAsSecondsTest, FormatsPositiveNumber) {\n  EXPECT_EQ(\"0.003\", FormatTimeInMillisAsSeconds(3));\n  EXPECT_EQ(\"0.01\", FormatTimeInMillisAsSeconds(10));\n  EXPECT_EQ(\"0.2\", FormatTimeInMillisAsSeconds(200));\n  EXPECT_EQ(\"1.2\", FormatTimeInMillisAsSeconds(1200));\n  EXPECT_EQ(\"3\", FormatTimeInMillisAsSeconds(3000));\n}\n\nTEST(FormatTimeInMillisAsSecondsTest, FormatsNegativeNumber) {\n  EXPECT_EQ(\"-0.003\", FormatTimeInMillisAsSeconds(-3));\n  EXPECT_EQ(\"-0.01\", FormatTimeInMillisAsSeconds(-10));\n  EXPECT_EQ(\"-0.2\", FormatTimeInMillisAsSeconds(-200));\n  EXPECT_EQ(\"-1.2\", FormatTimeInMillisAsSeconds(-1200));\n  EXPECT_EQ(\"-3\", FormatTimeInMillisAsSeconds(-3000));\n}\n\n// Tests FormatEpochTimeInMillisAsIso8601().  The correctness of conversion\n// for particular dates below was verified in Python using\n// datetime.datetime.fromutctimestamp(<timetamp>/1000).\n\n// FormatEpochTimeInMillisAsIso8601 depends on the current timezone, so we\n// have to set up a particular timezone to obtain predictable results.\nclass FormatEpochTimeInMillisAsIso8601Test : public Test {\n public:\n  // On Cygwin, GCC doesn't allow unqualified integer literals to exceed\n  // 32 bits, even when 64-bit integer types are available.  We have to\n  // force the constants to have a 64-bit type here.\n  static const TimeInMillis kMillisPerSec = 1000;\n\n private:\n  virtual void SetUp() {\n    saved_tz_ = NULL;\n\n    GTEST_DISABLE_MSC_DEPRECATED_PUSH_(/* getenv, strdup: deprecated */)\n    if (getenv(\"TZ\"))\n      saved_tz_ = strdup(getenv(\"TZ\"));\n    GTEST_DISABLE_MSC_DEPRECATED_POP_()\n\n    // Set up the time zone for FormatEpochTimeInMillisAsIso8601 to use.  We\n    // cannot use the local time zone because the function's output depends\n    // on the time zone.\n    SetTimeZone(\"UTC+00\");\n  }\n\n  virtual void TearDown() {\n    SetTimeZone(saved_tz_);\n    free(const_cast<char*>(saved_tz_));\n    saved_tz_ = NULL;\n  }\n\n  static void SetTimeZone(const char* time_zone) {\n    // tzset() distinguishes between the TZ variable being present and empty\n    // and not being present, so we have to consider the case of time_zone\n    // being NULL.\n#if _MSC_VER || GTEST_OS_WINDOWS_MINGW\n    // ...Unless it's MSVC, whose standard library's _putenv doesn't\n    // distinguish between an empty and a missing variable.\n    const std::string env_var =\n        std::string(\"TZ=\") + (time_zone ? time_zone : \"\");\n    _putenv(env_var.c_str());\n    GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996 /* deprecated function */)\n    tzset();\n    GTEST_DISABLE_MSC_WARNINGS_POP_()\n#else\n    if (time_zone) {\n      setenv((\"TZ\"), time_zone, 1);\n    } else {\n      unsetenv(\"TZ\");\n    }\n    tzset();\n#endif\n  }\n\n  const char* saved_tz_;\n};\n\nconst TimeInMillis FormatEpochTimeInMillisAsIso8601Test::kMillisPerSec;\n\nTEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsTwoDigitSegments) {\n  EXPECT_EQ(\"2011-10-31T18:52:42\",\n            FormatEpochTimeInMillisAsIso8601(1320087162 * kMillisPerSec));\n}\n\nTEST_F(FormatEpochTimeInMillisAsIso8601Test, MillisecondsDoNotAffectResult) {\n  EXPECT_EQ(\n      \"2011-10-31T18:52:42\",\n      FormatEpochTimeInMillisAsIso8601(1320087162 * kMillisPerSec + 234));\n}\n\nTEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsLeadingZeroes) {\n  EXPECT_EQ(\"2011-09-03T05:07:02\",\n            FormatEpochTimeInMillisAsIso8601(1315026422 * kMillisPerSec));\n}\n\nTEST_F(FormatEpochTimeInMillisAsIso8601Test, Prints24HourTime) {\n  EXPECT_EQ(\"2011-09-28T17:08:22\",\n            FormatEpochTimeInMillisAsIso8601(1317229702 * kMillisPerSec));\n}\n\nTEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsEpochStart) {\n  EXPECT_EQ(\"1970-01-01T00:00:00\", FormatEpochTimeInMillisAsIso8601(0));\n}\n\n#if GTEST_CAN_COMPARE_NULL\n\n# ifdef __BORLANDC__\n// Silences warnings: \"Condition is always true\", \"Unreachable code\"\n#  pragma option push -w-ccc -w-rch\n# endif\n\n// Tests that GTEST_IS_NULL_LITERAL_(x) is true when x is a null\n// pointer literal.\nTEST(NullLiteralTest, IsTrueForNullLiterals) {\n  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(NULL));\n  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0));\n  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0U));\n  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0L));\n}\n\n// Tests that GTEST_IS_NULL_LITERAL_(x) is false when x is not a null\n// pointer literal.\nTEST(NullLiteralTest, IsFalseForNonNullLiterals) {\n  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(1));\n  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(0.0));\n  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_('a'));\n  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(static_cast<void*>(NULL)));\n}\n\n# ifdef __BORLANDC__\n// Restores warnings after previous \"#pragma option push\" suppressed them.\n#  pragma option pop\n# endif\n\n#endif  // GTEST_CAN_COMPARE_NULL\n//\n// Tests CodePointToUtf8().\n\n// Tests that the NUL character L'\\0' is encoded correctly.\nTEST(CodePointToUtf8Test, CanEncodeNul) {\n  EXPECT_EQ(\"\", CodePointToUtf8(L'\\0'));\n}\n\n// Tests that ASCII characters are encoded correctly.\nTEST(CodePointToUtf8Test, CanEncodeAscii) {\n  EXPECT_EQ(\"a\", CodePointToUtf8(L'a'));\n  EXPECT_EQ(\"Z\", CodePointToUtf8(L'Z'));\n  EXPECT_EQ(\"&\", CodePointToUtf8(L'&'));\n  EXPECT_EQ(\"\\x7F\", CodePointToUtf8(L'\\x7F'));\n}\n\n// Tests that Unicode code-points that have 8 to 11 bits are encoded\n// as 110xxxxx 10xxxxxx.\nTEST(CodePointToUtf8Test, CanEncode8To11Bits) {\n  // 000 1101 0011 => 110-00011 10-010011\n  EXPECT_EQ(\"\\xC3\\x93\", CodePointToUtf8(L'\\xD3'));\n\n  // 101 0111 0110 => 110-10101 10-110110\n  // Some compilers (e.g., GCC on MinGW) cannot handle non-ASCII codepoints\n  // in wide strings and wide chars. In order to accommodate them, we have to\n  // introduce such character constants as integers.\n  EXPECT_EQ(\"\\xD5\\xB6\",\n            CodePointToUtf8(static_cast<wchar_t>(0x576)));\n}\n\n// Tests that Unicode code-points that have 12 to 16 bits are encoded\n// as 1110xxxx 10xxxxxx 10xxxxxx.\nTEST(CodePointToUtf8Test, CanEncode12To16Bits) {\n  // 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011\n  EXPECT_EQ(\"\\xE0\\xA3\\x93\",\n            CodePointToUtf8(static_cast<wchar_t>(0x8D3)));\n\n  // 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101\n  EXPECT_EQ(\"\\xEC\\x9D\\x8D\",\n            CodePointToUtf8(static_cast<wchar_t>(0xC74D)));\n}\n\n#if !GTEST_WIDE_STRING_USES_UTF16_\n// Tests in this group require a wchar_t to hold > 16 bits, and thus\n// are skipped on Windows, Cygwin, and Symbian, where a wchar_t is\n// 16-bit wide. This code may not compile on those systems.\n\n// Tests that Unicode code-points that have 17 to 21 bits are encoded\n// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx.\nTEST(CodePointToUtf8Test, CanEncode17To21Bits) {\n  // 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011\n  EXPECT_EQ(\"\\xF0\\x90\\xA3\\x93\", CodePointToUtf8(L'\\x108D3'));\n\n  // 0 0001 0000 0100 0000 0000 => 11110-000 10-010000 10-010000 10-000000\n  EXPECT_EQ(\"\\xF0\\x90\\x90\\x80\", CodePointToUtf8(L'\\x10400'));\n\n  // 1 0000 1000 0110 0011 0100 => 11110-100 10-001000 10-011000 10-110100\n  EXPECT_EQ(\"\\xF4\\x88\\x98\\xB4\", CodePointToUtf8(L'\\x108634'));\n}\n\n// Tests that encoding an invalid code-point generates the expected result.\nTEST(CodePointToUtf8Test, CanEncodeInvalidCodePoint) {\n  EXPECT_EQ(\"(Invalid Unicode 0x1234ABCD)\", CodePointToUtf8(L'\\x1234ABCD'));\n}\n\n#endif  // !GTEST_WIDE_STRING_USES_UTF16_\n\n// Tests WideStringToUtf8().\n\n// Tests that the NUL character L'\\0' is encoded correctly.\nTEST(WideStringToUtf8Test, CanEncodeNul) {\n  EXPECT_STREQ(\"\", WideStringToUtf8(L\"\", 0).c_str());\n  EXPECT_STREQ(\"\", WideStringToUtf8(L\"\", -1).c_str());\n}\n\n// Tests that ASCII strings are encoded correctly.\nTEST(WideStringToUtf8Test, CanEncodeAscii) {\n  EXPECT_STREQ(\"a\", WideStringToUtf8(L\"a\", 1).c_str());\n  EXPECT_STREQ(\"ab\", WideStringToUtf8(L\"ab\", 2).c_str());\n  EXPECT_STREQ(\"a\", WideStringToUtf8(L\"a\", -1).c_str());\n  EXPECT_STREQ(\"ab\", WideStringToUtf8(L\"ab\", -1).c_str());\n}\n\n// Tests that Unicode code-points that have 8 to 11 bits are encoded\n// as 110xxxxx 10xxxxxx.\nTEST(WideStringToUtf8Test, CanEncode8To11Bits) {\n  // 000 1101 0011 => 110-00011 10-010011\n  EXPECT_STREQ(\"\\xC3\\x93\", WideStringToUtf8(L\"\\xD3\", 1).c_str());\n  EXPECT_STREQ(\"\\xC3\\x93\", WideStringToUtf8(L\"\\xD3\", -1).c_str());\n\n  // 101 0111 0110 => 110-10101 10-110110\n  const wchar_t s[] = { 0x576, '\\0' };\n  EXPECT_STREQ(\"\\xD5\\xB6\", WideStringToUtf8(s, 1).c_str());\n  EXPECT_STREQ(\"\\xD5\\xB6\", WideStringToUtf8(s, -1).c_str());\n}\n\n// Tests that Unicode code-points that have 12 to 16 bits are encoded\n// as 1110xxxx 10xxxxxx 10xxxxxx.\nTEST(WideStringToUtf8Test, CanEncode12To16Bits) {\n  // 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011\n  const wchar_t s1[] = { 0x8D3, '\\0' };\n  EXPECT_STREQ(\"\\xE0\\xA3\\x93\", WideStringToUtf8(s1, 1).c_str());\n  EXPECT_STREQ(\"\\xE0\\xA3\\x93\", WideStringToUtf8(s1, -1).c_str());\n\n  // 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101\n  const wchar_t s2[] = { 0xC74D, '\\0' };\n  EXPECT_STREQ(\"\\xEC\\x9D\\x8D\", WideStringToUtf8(s2, 1).c_str());\n  EXPECT_STREQ(\"\\xEC\\x9D\\x8D\", WideStringToUtf8(s2, -1).c_str());\n}\n\n// Tests that the conversion stops when the function encounters \\0 character.\nTEST(WideStringToUtf8Test, StopsOnNulCharacter) {\n  EXPECT_STREQ(\"ABC\", WideStringToUtf8(L\"ABC\\0XYZ\", 100).c_str());\n}\n\n// Tests that the conversion stops when the function reaches the limit\n// specified by the 'length' parameter.\nTEST(WideStringToUtf8Test, StopsWhenLengthLimitReached) {\n  EXPECT_STREQ(\"ABC\", WideStringToUtf8(L\"ABCDEF\", 3).c_str());\n}\n\n#if !GTEST_WIDE_STRING_USES_UTF16_\n// Tests that Unicode code-points that have 17 to 21 bits are encoded\n// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx. This code may not compile\n// on the systems using UTF-16 encoding.\nTEST(WideStringToUtf8Test, CanEncode17To21Bits) {\n  // 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011\n  EXPECT_STREQ(\"\\xF0\\x90\\xA3\\x93\", WideStringToUtf8(L\"\\x108D3\", 1).c_str());\n  EXPECT_STREQ(\"\\xF0\\x90\\xA3\\x93\", WideStringToUtf8(L\"\\x108D3\", -1).c_str());\n\n  // 1 0000 1000 0110 0011 0100 => 11110-100 10-001000 10-011000 10-110100\n  EXPECT_STREQ(\"\\xF4\\x88\\x98\\xB4\", WideStringToUtf8(L\"\\x108634\", 1).c_str());\n  EXPECT_STREQ(\"\\xF4\\x88\\x98\\xB4\", WideStringToUtf8(L\"\\x108634\", -1).c_str());\n}\n\n// Tests that encoding an invalid code-point generates the expected result.\nTEST(WideStringToUtf8Test, CanEncodeInvalidCodePoint) {\n  EXPECT_STREQ(\"(Invalid Unicode 0xABCDFF)\",\n               WideStringToUtf8(L\"\\xABCDFF\", -1).c_str());\n}\n#else  // !GTEST_WIDE_STRING_USES_UTF16_\n// Tests that surrogate pairs are encoded correctly on the systems using\n// UTF-16 encoding in the wide strings.\nTEST(WideStringToUtf8Test, CanEncodeValidUtf16SUrrogatePairs) {\n  const wchar_t s[] = { 0xD801, 0xDC00, '\\0' };\n  EXPECT_STREQ(\"\\xF0\\x90\\x90\\x80\", WideStringToUtf8(s, -1).c_str());\n}\n\n// Tests that encoding an invalid UTF-16 surrogate pair\n// generates the expected result.\nTEST(WideStringToUtf8Test, CanEncodeInvalidUtf16SurrogatePair) {\n  // Leading surrogate is at the end of the string.\n  const wchar_t s1[] = { 0xD800, '\\0' };\n  EXPECT_STREQ(\"\\xED\\xA0\\x80\", WideStringToUtf8(s1, -1).c_str());\n  // Leading surrogate is not followed by the trailing surrogate.\n  const wchar_t s2[] = { 0xD800, 'M', '\\0' };\n  EXPECT_STREQ(\"\\xED\\xA0\\x80M\", WideStringToUtf8(s2, -1).c_str());\n  // Trailing surrogate appearas without a leading surrogate.\n  const wchar_t s3[] = { 0xDC00, 'P', 'Q', 'R', '\\0' };\n  EXPECT_STREQ(\"\\xED\\xB0\\x80PQR\", WideStringToUtf8(s3, -1).c_str());\n}\n#endif  // !GTEST_WIDE_STRING_USES_UTF16_\n\n// Tests that codepoint concatenation works correctly.\n#if !GTEST_WIDE_STRING_USES_UTF16_\nTEST(WideStringToUtf8Test, ConcatenatesCodepointsCorrectly) {\n  const wchar_t s[] = { 0x108634, 0xC74D, '\\n', 0x576, 0x8D3, 0x108634, '\\0'};\n  EXPECT_STREQ(\n      \"\\xF4\\x88\\x98\\xB4\"\n          \"\\xEC\\x9D\\x8D\"\n          \"\\n\"\n          \"\\xD5\\xB6\"\n          \"\\xE0\\xA3\\x93\"\n          \"\\xF4\\x88\\x98\\xB4\",\n      WideStringToUtf8(s, -1).c_str());\n}\n#else\nTEST(WideStringToUtf8Test, ConcatenatesCodepointsCorrectly) {\n  const wchar_t s[] = { 0xC74D, '\\n', 0x576, 0x8D3, '\\0'};\n  EXPECT_STREQ(\n      \"\\xEC\\x9D\\x8D\" \"\\n\" \"\\xD5\\xB6\" \"\\xE0\\xA3\\x93\",\n      WideStringToUtf8(s, -1).c_str());\n}\n#endif  // !GTEST_WIDE_STRING_USES_UTF16_\n\n// Tests the Random class.\n\nTEST(RandomDeathTest, GeneratesCrashesOnInvalidRange) {\n  testing::internal::Random random(42);\n  EXPECT_DEATH_IF_SUPPORTED(\n      random.Generate(0),\n      \"Cannot generate a number in the range \\\\[0, 0\\\\)\");\n  EXPECT_DEATH_IF_SUPPORTED(\n      random.Generate(testing::internal::Random::kMaxRange + 1),\n      \"Generation of a number in \\\\[0, 2147483649\\\\) was requested, \"\n      \"but this can only generate numbers in \\\\[0, 2147483648\\\\)\");\n}\n\nTEST(RandomTest, GeneratesNumbersWithinRange) {\n  const UInt32 kRange = 10000;\n  testing::internal::Random random(12345);\n  for (int i = 0; i < 10; i++) {\n    EXPECT_LT(random.Generate(kRange), kRange) << \" for iteration \" << i;\n  }\n\n  testing::internal::Random random2(testing::internal::Random::kMaxRange);\n  for (int i = 0; i < 10; i++) {\n    EXPECT_LT(random2.Generate(kRange), kRange) << \" for iteration \" << i;\n  }\n}\n\nTEST(RandomTest, RepeatsWhenReseeded) {\n  const int kSeed = 123;\n  const int kArraySize = 10;\n  const UInt32 kRange = 10000;\n  UInt32 values[kArraySize];\n\n  testing::internal::Random random(kSeed);\n  for (int i = 0; i < kArraySize; i++) {\n    values[i] = random.Generate(kRange);\n  }\n\n  random.Reseed(kSeed);\n  for (int i = 0; i < kArraySize; i++) {\n    EXPECT_EQ(values[i], random.Generate(kRange)) << \" for iteration \" << i;\n  }\n}\n\n// Tests STL container utilities.\n\n// Tests CountIf().\n\nstatic bool IsPositive(int n) { return n > 0; }\n\nTEST(ContainerUtilityTest, CountIf) {\n  std::vector<int> v;\n  EXPECT_EQ(0, CountIf(v, IsPositive));  // Works for an empty container.\n\n  v.push_back(-1);\n  v.push_back(0);\n  EXPECT_EQ(0, CountIf(v, IsPositive));  // Works when no value satisfies.\n\n  v.push_back(2);\n  v.push_back(-10);\n  v.push_back(10);\n  EXPECT_EQ(2, CountIf(v, IsPositive));\n}\n\n// Tests ForEach().\n\nstatic int g_sum = 0;\nstatic void Accumulate(int n) { g_sum += n; }\n\nTEST(ContainerUtilityTest, ForEach) {\n  std::vector<int> v;\n  g_sum = 0;\n  ForEach(v, Accumulate);\n  EXPECT_EQ(0, g_sum);  // Works for an empty container;\n\n  g_sum = 0;\n  v.push_back(1);\n  ForEach(v, Accumulate);\n  EXPECT_EQ(1, g_sum);  // Works for a container with one element.\n\n  g_sum = 0;\n  v.push_back(20);\n  v.push_back(300);\n  ForEach(v, Accumulate);\n  EXPECT_EQ(321, g_sum);\n}\n\n// Tests GetElementOr().\nTEST(ContainerUtilityTest, GetElementOr) {\n  std::vector<char> a;\n  EXPECT_EQ('x', GetElementOr(a, 0, 'x'));\n\n  a.push_back('a');\n  a.push_back('b');\n  EXPECT_EQ('a', GetElementOr(a, 0, 'x'));\n  EXPECT_EQ('b', GetElementOr(a, 1, 'x'));\n  EXPECT_EQ('x', GetElementOr(a, -2, 'x'));\n  EXPECT_EQ('x', GetElementOr(a, 2, 'x'));\n}\n\nTEST(ContainerUtilityDeathTest, ShuffleRange) {\n  std::vector<int> a;\n  a.push_back(0);\n  a.push_back(1);\n  a.push_back(2);\n  testing::internal::Random random(1);\n\n  EXPECT_DEATH_IF_SUPPORTED(\n      ShuffleRange(&random, -1, 1, &a),\n      \"Invalid shuffle range start -1: must be in range \\\\[0, 3\\\\]\");\n  EXPECT_DEATH_IF_SUPPORTED(\n      ShuffleRange(&random, 4, 4, &a),\n      \"Invalid shuffle range start 4: must be in range \\\\[0, 3\\\\]\");\n  EXPECT_DEATH_IF_SUPPORTED(\n      ShuffleRange(&random, 3, 2, &a),\n      \"Invalid shuffle range finish 2: must be in range \\\\[3, 3\\\\]\");\n  EXPECT_DEATH_IF_SUPPORTED(\n      ShuffleRange(&random, 3, 4, &a),\n      \"Invalid shuffle range finish 4: must be in range \\\\[3, 3\\\\]\");\n}\n\nclass VectorShuffleTest : public Test {\n protected:\n  static const int kVectorSize = 20;\n\n  VectorShuffleTest() : random_(1) {\n    for (int i = 0; i < kVectorSize; i++) {\n      vector_.push_back(i);\n    }\n  }\n\n  static bool VectorIsCorrupt(const TestingVector& vector) {\n    if (kVectorSize != static_cast<int>(vector.size())) {\n      return true;\n    }\n\n    bool found_in_vector[kVectorSize] = { false };\n    for (size_t i = 0; i < vector.size(); i++) {\n      const int e = vector[i];\n      if (e < 0 || e >= kVectorSize || found_in_vector[e]) {\n        return true;\n      }\n      found_in_vector[e] = true;\n    }\n\n    // Vector size is correct, elements' range is correct, no\n    // duplicate elements.  Therefore no corruption has occurred.\n    return false;\n  }\n\n  static bool VectorIsNotCorrupt(const TestingVector& vector) {\n    return !VectorIsCorrupt(vector);\n  }\n\n  static bool RangeIsShuffled(const TestingVector& vector, int begin, int end) {\n    for (int i = begin; i < end; i++) {\n      if (i != vector[i]) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  static bool RangeIsUnshuffled(\n      const TestingVector& vector, int begin, int end) {\n    return !RangeIsShuffled(vector, begin, end);\n  }\n\n  static bool VectorIsShuffled(const TestingVector& vector) {\n    return RangeIsShuffled(vector, 0, static_cast<int>(vector.size()));\n  }\n\n  static bool VectorIsUnshuffled(const TestingVector& vector) {\n    return !VectorIsShuffled(vector);\n  }\n\n  testing::internal::Random random_;\n  TestingVector vector_;\n};  // class VectorShuffleTest\n\nconst int VectorShuffleTest::kVectorSize;\n\nTEST_F(VectorShuffleTest, HandlesEmptyRange) {\n  // Tests an empty range at the beginning...\n  ShuffleRange(&random_, 0, 0, &vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  ASSERT_PRED1(VectorIsUnshuffled, vector_);\n\n  // ...in the middle...\n  ShuffleRange(&random_, kVectorSize/2, kVectorSize/2, &vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  ASSERT_PRED1(VectorIsUnshuffled, vector_);\n\n  // ...at the end...\n  ShuffleRange(&random_, kVectorSize - 1, kVectorSize - 1, &vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  ASSERT_PRED1(VectorIsUnshuffled, vector_);\n\n  // ...and past the end.\n  ShuffleRange(&random_, kVectorSize, kVectorSize, &vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  ASSERT_PRED1(VectorIsUnshuffled, vector_);\n}\n\nTEST_F(VectorShuffleTest, HandlesRangeOfSizeOne) {\n  // Tests a size one range at the beginning...\n  ShuffleRange(&random_, 0, 1, &vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  ASSERT_PRED1(VectorIsUnshuffled, vector_);\n\n  // ...in the middle...\n  ShuffleRange(&random_, kVectorSize/2, kVectorSize/2 + 1, &vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  ASSERT_PRED1(VectorIsUnshuffled, vector_);\n\n  // ...and at the end.\n  ShuffleRange(&random_, kVectorSize - 1, kVectorSize, &vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  ASSERT_PRED1(VectorIsUnshuffled, vector_);\n}\n\n// Because we use our own random number generator and a fixed seed,\n// we can guarantee that the following \"random\" tests will succeed.\n\nTEST_F(VectorShuffleTest, ShufflesEntireVector) {\n  Shuffle(&random_, &vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  EXPECT_FALSE(VectorIsUnshuffled(vector_)) << vector_;\n\n  // Tests the first and last elements in particular to ensure that\n  // there are no off-by-one problems in our shuffle algorithm.\n  EXPECT_NE(0, vector_[0]);\n  EXPECT_NE(kVectorSize - 1, vector_[kVectorSize - 1]);\n}\n\nTEST_F(VectorShuffleTest, ShufflesStartOfVector) {\n  const int kRangeSize = kVectorSize/2;\n\n  ShuffleRange(&random_, 0, kRangeSize, &vector_);\n\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  EXPECT_PRED3(RangeIsShuffled, vector_, 0, kRangeSize);\n  EXPECT_PRED3(RangeIsUnshuffled, vector_, kRangeSize, kVectorSize);\n}\n\nTEST_F(VectorShuffleTest, ShufflesEndOfVector) {\n  const int kRangeSize = kVectorSize / 2;\n  ShuffleRange(&random_, kRangeSize, kVectorSize, &vector_);\n\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize);\n  EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, kVectorSize);\n}\n\nTEST_F(VectorShuffleTest, ShufflesMiddleOfVector) {\n  int kRangeSize = kVectorSize/3;\n  ShuffleRange(&random_, kRangeSize, 2*kRangeSize, &vector_);\n\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize);\n  EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, 2*kRangeSize);\n  EXPECT_PRED3(RangeIsUnshuffled, vector_, 2*kRangeSize, kVectorSize);\n}\n\nTEST_F(VectorShuffleTest, ShufflesRepeatably) {\n  TestingVector vector2;\n  for (int i = 0; i < kVectorSize; i++) {\n    vector2.push_back(i);\n  }\n\n  random_.Reseed(1234);\n  Shuffle(&random_, &vector_);\n  random_.Reseed(1234);\n  Shuffle(&random_, &vector2);\n\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector2);\n\n  for (int i = 0; i < kVectorSize; i++) {\n    EXPECT_EQ(vector_[i], vector2[i]) << \" where i is \" << i;\n  }\n}\n\n// Tests the size of the AssertHelper class.\n\nTEST(AssertHelperTest, AssertHelperIsSmall) {\n  // To avoid breaking clients that use lots of assertions in one\n  // function, we cannot grow the size of AssertHelper.\n  EXPECT_LE(sizeof(testing::internal::AssertHelper), sizeof(void*));\n}\n\n// Tests String::EndsWithCaseInsensitive().\nTEST(StringTest, EndsWithCaseInsensitive) {\n  EXPECT_TRUE(String::EndsWithCaseInsensitive(\"foobar\", \"BAR\"));\n  EXPECT_TRUE(String::EndsWithCaseInsensitive(\"foobaR\", \"bar\"));\n  EXPECT_TRUE(String::EndsWithCaseInsensitive(\"foobar\", \"\"));\n  EXPECT_TRUE(String::EndsWithCaseInsensitive(\"\", \"\"));\n\n  EXPECT_FALSE(String::EndsWithCaseInsensitive(\"Foobar\", \"foo\"));\n  EXPECT_FALSE(String::EndsWithCaseInsensitive(\"foobar\", \"Foo\"));\n  EXPECT_FALSE(String::EndsWithCaseInsensitive(\"\", \"foo\"));\n}\n\n// C++Builder's preprocessor is buggy; it fails to expand macros that\n// appear in macro parameters after wide char literals.  Provide an alias\n// for NULL as a workaround.\nstatic const wchar_t* const kNull = NULL;\n\n// Tests String::CaseInsensitiveWideCStringEquals\nTEST(StringTest, CaseInsensitiveWideCStringEquals) {\n  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(NULL, NULL));\n  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(kNull, L\"\"));\n  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(L\"\", kNull));\n  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(kNull, L\"foobar\"));\n  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(L\"foobar\", kNull));\n  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L\"foobar\", L\"foobar\"));\n  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L\"foobar\", L\"FOOBAR\"));\n  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L\"FOOBAR\", L\"foobar\"));\n}\n\n#if GTEST_OS_WINDOWS\n\n// Tests String::ShowWideCString().\nTEST(StringTest, ShowWideCString) {\n  EXPECT_STREQ(\"(null)\",\n               String::ShowWideCString(NULL).c_str());\n  EXPECT_STREQ(\"\", String::ShowWideCString(L\"\").c_str());\n  EXPECT_STREQ(\"foo\", String::ShowWideCString(L\"foo\").c_str());\n}\n\n# if GTEST_OS_WINDOWS_MOBILE\nTEST(StringTest, AnsiAndUtf16Null) {\n  EXPECT_EQ(NULL, String::AnsiToUtf16(NULL));\n  EXPECT_EQ(NULL, String::Utf16ToAnsi(NULL));\n}\n\nTEST(StringTest, AnsiAndUtf16ConvertBasic) {\n  const char* ansi = String::Utf16ToAnsi(L\"str\");\n  EXPECT_STREQ(\"str\", ansi);\n  delete [] ansi;\n  const WCHAR* utf16 = String::AnsiToUtf16(\"str\");\n  EXPECT_EQ(0, wcsncmp(L\"str\", utf16, 3));\n  delete [] utf16;\n}\n\nTEST(StringTest, AnsiAndUtf16ConvertPathChars) {\n  const char* ansi = String::Utf16ToAnsi(L\".:\\\\ \\\"*?\");\n  EXPECT_STREQ(\".:\\\\ \\\"*?\", ansi);\n  delete [] ansi;\n  const WCHAR* utf16 = String::AnsiToUtf16(\".:\\\\ \\\"*?\");\n  EXPECT_EQ(0, wcsncmp(L\".:\\\\ \\\"*?\", utf16, 3));\n  delete [] utf16;\n}\n# endif  // GTEST_OS_WINDOWS_MOBILE\n\n#endif  // GTEST_OS_WINDOWS\n\n// Tests TestProperty construction.\nTEST(TestPropertyTest, StringValue) {\n  TestProperty property(\"key\", \"1\");\n  EXPECT_STREQ(\"key\", property.key());\n  EXPECT_STREQ(\"1\", property.value());\n}\n\n// Tests TestProperty replacing a value.\nTEST(TestPropertyTest, ReplaceStringValue) {\n  TestProperty property(\"key\", \"1\");\n  EXPECT_STREQ(\"1\", property.value());\n  property.SetValue(\"2\");\n  EXPECT_STREQ(\"2\", property.value());\n}\n\n// AddFatalFailure() and AddNonfatalFailure() must be stand-alone\n// functions (i.e. their definitions cannot be inlined at the call\n// sites), or C++Builder won't compile the code.\nstatic void AddFatalFailure() {\n  FAIL() << \"Expected fatal failure.\";\n}\n\nstatic void AddNonfatalFailure() {\n  ADD_FAILURE() << \"Expected non-fatal failure.\";\n}\n\nclass ScopedFakeTestPartResultReporterTest : public Test {\n public:  // Must be public and not protected due to a bug in g++ 3.4.2.\n  enum FailureMode {\n    FATAL_FAILURE,\n    NONFATAL_FAILURE\n  };\n  static void AddFailure(FailureMode failure) {\n    if (failure == FATAL_FAILURE) {\n      AddFatalFailure();\n    } else {\n      AddNonfatalFailure();\n    }\n  }\n};\n\n// Tests that ScopedFakeTestPartResultReporter intercepts test\n// failures.\nTEST_F(ScopedFakeTestPartResultReporterTest, InterceptsTestFailures) {\n  TestPartResultArray results;\n  {\n    ScopedFakeTestPartResultReporter reporter(\n        ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD,\n        &results);\n    AddFailure(NONFATAL_FAILURE);\n    AddFailure(FATAL_FAILURE);\n  }\n\n  EXPECT_EQ(2, results.size());\n  EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed());\n  EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed());\n}\n\nTEST_F(ScopedFakeTestPartResultReporterTest, DeprecatedConstructor) {\n  TestPartResultArray results;\n  {\n    // Tests, that the deprecated constructor still works.\n    ScopedFakeTestPartResultReporter reporter(&results);\n    AddFailure(NONFATAL_FAILURE);\n  }\n  EXPECT_EQ(1, results.size());\n}\n\n#if GTEST_IS_THREADSAFE\n\nclass ScopedFakeTestPartResultReporterWithThreadsTest\n  : public ScopedFakeTestPartResultReporterTest {\n protected:\n  static void AddFailureInOtherThread(FailureMode failure) {\n    ThreadWithParam<FailureMode> thread(&AddFailure, failure, NULL);\n    thread.Join();\n  }\n};\n\nTEST_F(ScopedFakeTestPartResultReporterWithThreadsTest,\n       InterceptsTestFailuresInAllThreads) {\n  TestPartResultArray results;\n  {\n    ScopedFakeTestPartResultReporter reporter(\n        ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, &results);\n    AddFailure(NONFATAL_FAILURE);\n    AddFailure(FATAL_FAILURE);\n    AddFailureInOtherThread(NONFATAL_FAILURE);\n    AddFailureInOtherThread(FATAL_FAILURE);\n  }\n\n  EXPECT_EQ(4, results.size());\n  EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed());\n  EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed());\n  EXPECT_TRUE(results.GetTestPartResult(2).nonfatally_failed());\n  EXPECT_TRUE(results.GetTestPartResult(3).fatally_failed());\n}\n\n#endif  // GTEST_IS_THREADSAFE\n\n// Tests EXPECT_FATAL_FAILURE{,ON_ALL_THREADS}.  Makes sure that they\n// work even if the failure is generated in a called function rather than\n// the current context.\n\ntypedef ScopedFakeTestPartResultReporterTest ExpectFatalFailureTest;\n\nTEST_F(ExpectFatalFailureTest, CatchesFatalFaliure) {\n  EXPECT_FATAL_FAILURE(AddFatalFailure(), \"Expected fatal failure.\");\n}\n\n#if GTEST_HAS_GLOBAL_STRING\nTEST_F(ExpectFatalFailureTest, AcceptsStringObject) {\n  EXPECT_FATAL_FAILURE(AddFatalFailure(), ::string(\"Expected fatal failure.\"));\n}\n#endif\n\nTEST_F(ExpectFatalFailureTest, AcceptsStdStringObject) {\n  EXPECT_FATAL_FAILURE(AddFatalFailure(),\n                       ::std::string(\"Expected fatal failure.\"));\n}\n\nTEST_F(ExpectFatalFailureTest, CatchesFatalFailureOnAllThreads) {\n  // We have another test below to verify that the macro catches fatal\n  // failures generated on another thread.\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFatalFailure(),\n                                      \"Expected fatal failure.\");\n}\n\n#ifdef __BORLANDC__\n// Silences warnings: \"Condition is always true\"\n# pragma option push -w-ccc\n#endif\n\n// Tests that EXPECT_FATAL_FAILURE() can be used in a non-void\n// function even when the statement in it contains ASSERT_*.\n\nint NonVoidFunction() {\n  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), \"\");\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), \"\");\n  return 0;\n}\n\nTEST_F(ExpectFatalFailureTest, CanBeUsedInNonVoidFunction) {\n  NonVoidFunction();\n}\n\n// Tests that EXPECT_FATAL_FAILURE(statement, ...) doesn't abort the\n// current function even though 'statement' generates a fatal failure.\n\nvoid DoesNotAbortHelper(bool* aborted) {\n  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), \"\");\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), \"\");\n\n  *aborted = false;\n}\n\n#ifdef __BORLANDC__\n// Restores warnings after previous \"#pragma option push\" suppressed them.\n# pragma option pop\n#endif\n\nTEST_F(ExpectFatalFailureTest, DoesNotAbort) {\n  bool aborted = true;\n  DoesNotAbortHelper(&aborted);\n  EXPECT_FALSE(aborted);\n}\n\n// Tests that the EXPECT_FATAL_FAILURE{,_ON_ALL_THREADS} accepts a\n// statement that contains a macro which expands to code containing an\n// unprotected comma.\n\nstatic int global_var = 0;\n#define GTEST_USE_UNPROTECTED_COMMA_ global_var++, global_var++\n\nTEST_F(ExpectFatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) {\n#ifndef __BORLANDC__\n  // ICE's in C++Builder.\n  EXPECT_FATAL_FAILURE({\n    GTEST_USE_UNPROTECTED_COMMA_;\n    AddFatalFailure();\n  }, \"\");\n#endif\n\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS({\n    GTEST_USE_UNPROTECTED_COMMA_;\n    AddFatalFailure();\n  }, \"\");\n}\n\n// Tests EXPECT_NONFATAL_FAILURE{,ON_ALL_THREADS}.\n\ntypedef ScopedFakeTestPartResultReporterTest ExpectNonfatalFailureTest;\n\nTEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailure) {\n  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(),\n                          \"Expected non-fatal failure.\");\n}\n\n#if GTEST_HAS_GLOBAL_STRING\nTEST_F(ExpectNonfatalFailureTest, AcceptsStringObject) {\n  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(),\n                          ::string(\"Expected non-fatal failure.\"));\n}\n#endif\n\nTEST_F(ExpectNonfatalFailureTest, AcceptsStdStringObject) {\n  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(),\n                          ::std::string(\"Expected non-fatal failure.\"));\n}\n\nTEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailureOnAllThreads) {\n  // We have another test below to verify that the macro catches\n  // non-fatal failures generated on another thread.\n  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddNonfatalFailure(),\n                                         \"Expected non-fatal failure.\");\n}\n\n// Tests that the EXPECT_NONFATAL_FAILURE{,_ON_ALL_THREADS} accepts a\n// statement that contains a macro which expands to code containing an\n// unprotected comma.\nTEST_F(ExpectNonfatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) {\n  EXPECT_NONFATAL_FAILURE({\n    GTEST_USE_UNPROTECTED_COMMA_;\n    AddNonfatalFailure();\n  }, \"\");\n\n  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS({\n    GTEST_USE_UNPROTECTED_COMMA_;\n    AddNonfatalFailure();\n  }, \"\");\n}\n\n#if GTEST_IS_THREADSAFE\n\ntypedef ScopedFakeTestPartResultReporterWithThreadsTest\n    ExpectFailureWithThreadsTest;\n\nTEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailureOnAllThreads) {\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailureInOtherThread(FATAL_FAILURE),\n                                      \"Expected fatal failure.\");\n}\n\nTEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailureOnAllThreads) {\n  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(\n      AddFailureInOtherThread(NONFATAL_FAILURE), \"Expected non-fatal failure.\");\n}\n\n#endif  // GTEST_IS_THREADSAFE\n\n// Tests the TestProperty class.\n\nTEST(TestPropertyTest, ConstructorWorks) {\n  const TestProperty property(\"key\", \"value\");\n  EXPECT_STREQ(\"key\", property.key());\n  EXPECT_STREQ(\"value\", property.value());\n}\n\nTEST(TestPropertyTest, SetValue) {\n  TestProperty property(\"key\", \"value_1\");\n  EXPECT_STREQ(\"key\", property.key());\n  property.SetValue(\"value_2\");\n  EXPECT_STREQ(\"key\", property.key());\n  EXPECT_STREQ(\"value_2\", property.value());\n}\n\n// Tests the TestResult class\n\n// The test fixture for testing TestResult.\nclass TestResultTest : public Test {\n protected:\n  typedef std::vector<TestPartResult> TPRVector;\n\n  // We make use of 2 TestPartResult objects,\n  TestPartResult * pr1, * pr2;\n\n  // ... and 3 TestResult objects.\n  TestResult * r0, * r1, * r2;\n\n  virtual void SetUp() {\n    // pr1 is for success.\n    pr1 = new TestPartResult(TestPartResult::kSuccess,\n                             \"foo/bar.cc\",\n                             10,\n                             \"Success!\");\n\n    // pr2 is for fatal failure.\n    pr2 = new TestPartResult(TestPartResult::kFatalFailure,\n                             \"foo/bar.cc\",\n                             -1,  // This line number means \"unknown\"\n                             \"Failure!\");\n\n    // Creates the TestResult objects.\n    r0 = new TestResult();\n    r1 = new TestResult();\n    r2 = new TestResult();\n\n    // In order to test TestResult, we need to modify its internal\n    // state, in particular the TestPartResult vector it holds.\n    // test_part_results() returns a const reference to this vector.\n    // We cast it to a non-const object s.t. it can be modified\n    TPRVector* results1 = const_cast<TPRVector*>(\n        &TestResultAccessor::test_part_results(*r1));\n    TPRVector* results2 = const_cast<TPRVector*>(\n        &TestResultAccessor::test_part_results(*r2));\n\n    // r0 is an empty TestResult.\n\n    // r1 contains a single SUCCESS TestPartResult.\n    results1->push_back(*pr1);\n\n    // r2 contains a SUCCESS, and a FAILURE.\n    results2->push_back(*pr1);\n    results2->push_back(*pr2);\n  }\n\n  virtual void TearDown() {\n    delete pr1;\n    delete pr2;\n\n    delete r0;\n    delete r1;\n    delete r2;\n  }\n\n  // Helper that compares two TestPartResults.\n  static void CompareTestPartResult(const TestPartResult& expected,\n                                    const TestPartResult& actual) {\n    EXPECT_EQ(expected.type(), actual.type());\n    EXPECT_STREQ(expected.file_name(), actual.file_name());\n    EXPECT_EQ(expected.line_number(), actual.line_number());\n    EXPECT_STREQ(expected.summary(), actual.summary());\n    EXPECT_STREQ(expected.message(), actual.message());\n    EXPECT_EQ(expected.passed(), actual.passed());\n    EXPECT_EQ(expected.failed(), actual.failed());\n    EXPECT_EQ(expected.nonfatally_failed(), actual.nonfatally_failed());\n    EXPECT_EQ(expected.fatally_failed(), actual.fatally_failed());\n  }\n};\n\n// Tests TestResult::total_part_count().\nTEST_F(TestResultTest, total_part_count) {\n  ASSERT_EQ(0, r0->total_part_count());\n  ASSERT_EQ(1, r1->total_part_count());\n  ASSERT_EQ(2, r2->total_part_count());\n}\n\n// Tests TestResult::Passed().\nTEST_F(TestResultTest, Passed) {\n  ASSERT_TRUE(r0->Passed());\n  ASSERT_TRUE(r1->Passed());\n  ASSERT_FALSE(r2->Passed());\n}\n\n// Tests TestResult::Failed().\nTEST_F(TestResultTest, Failed) {\n  ASSERT_FALSE(r0->Failed());\n  ASSERT_FALSE(r1->Failed());\n  ASSERT_TRUE(r2->Failed());\n}\n\n// Tests TestResult::GetTestPartResult().\n\ntypedef TestResultTest TestResultDeathTest;\n\nTEST_F(TestResultDeathTest, GetTestPartResult) {\n  CompareTestPartResult(*pr1, r2->GetTestPartResult(0));\n  CompareTestPartResult(*pr2, r2->GetTestPartResult(1));\n  EXPECT_DEATH_IF_SUPPORTED(r2->GetTestPartResult(2), \"\");\n  EXPECT_DEATH_IF_SUPPORTED(r2->GetTestPartResult(-1), \"\");\n}\n\n// Tests TestResult has no properties when none are added.\nTEST(TestResultPropertyTest, NoPropertiesFoundWhenNoneAreAdded) {\n  TestResult test_result;\n  ASSERT_EQ(0, test_result.test_property_count());\n}\n\n// Tests TestResult has the expected property when added.\nTEST(TestResultPropertyTest, OnePropertyFoundWhenAdded) {\n  TestResult test_result;\n  TestProperty property(\"key_1\", \"1\");\n  TestResultAccessor::RecordProperty(&test_result, \"testcase\", property);\n  ASSERT_EQ(1, test_result.test_property_count());\n  const TestProperty& actual_property = test_result.GetTestProperty(0);\n  EXPECT_STREQ(\"key_1\", actual_property.key());\n  EXPECT_STREQ(\"1\", actual_property.value());\n}\n\n// Tests TestResult has multiple properties when added.\nTEST(TestResultPropertyTest, MultiplePropertiesFoundWhenAdded) {\n  TestResult test_result;\n  TestProperty property_1(\"key_1\", \"1\");\n  TestProperty property_2(\"key_2\", \"2\");\n  TestResultAccessor::RecordProperty(&test_result, \"testcase\", property_1);\n  TestResultAccessor::RecordProperty(&test_result, \"testcase\", property_2);\n  ASSERT_EQ(2, test_result.test_property_count());\n  const TestProperty& actual_property_1 = test_result.GetTestProperty(0);\n  EXPECT_STREQ(\"key_1\", actual_property_1.key());\n  EXPECT_STREQ(\"1\", actual_property_1.value());\n\n  const TestProperty& actual_property_2 = test_result.GetTestProperty(1);\n  EXPECT_STREQ(\"key_2\", actual_property_2.key());\n  EXPECT_STREQ(\"2\", actual_property_2.value());\n}\n\n// Tests TestResult::RecordProperty() overrides values for duplicate keys.\nTEST(TestResultPropertyTest, OverridesValuesForDuplicateKeys) {\n  TestResult test_result;\n  TestProperty property_1_1(\"key_1\", \"1\");\n  TestProperty property_2_1(\"key_2\", \"2\");\n  TestProperty property_1_2(\"key_1\", \"12\");\n  TestProperty property_2_2(\"key_2\", \"22\");\n  TestResultAccessor::RecordProperty(&test_result, \"testcase\", property_1_1);\n  TestResultAccessor::RecordProperty(&test_result, \"testcase\", property_2_1);\n  TestResultAccessor::RecordProperty(&test_result, \"testcase\", property_1_2);\n  TestResultAccessor::RecordProperty(&test_result, \"testcase\", property_2_2);\n\n  ASSERT_EQ(2, test_result.test_property_count());\n  const TestProperty& actual_property_1 = test_result.GetTestProperty(0);\n  EXPECT_STREQ(\"key_1\", actual_property_1.key());\n  EXPECT_STREQ(\"12\", actual_property_1.value());\n\n  const TestProperty& actual_property_2 = test_result.GetTestProperty(1);\n  EXPECT_STREQ(\"key_2\", actual_property_2.key());\n  EXPECT_STREQ(\"22\", actual_property_2.value());\n}\n\n// Tests TestResult::GetTestProperty().\nTEST(TestResultPropertyTest, GetTestProperty) {\n  TestResult test_result;\n  TestProperty property_1(\"key_1\", \"1\");\n  TestProperty property_2(\"key_2\", \"2\");\n  TestProperty property_3(\"key_3\", \"3\");\n  TestResultAccessor::RecordProperty(&test_result, \"testcase\", property_1);\n  TestResultAccessor::RecordProperty(&test_result, \"testcase\", property_2);\n  TestResultAccessor::RecordProperty(&test_result, \"testcase\", property_3);\n\n  const TestProperty& fetched_property_1 = test_result.GetTestProperty(0);\n  const TestProperty& fetched_property_2 = test_result.GetTestProperty(1);\n  const TestProperty& fetched_property_3 = test_result.GetTestProperty(2);\n\n  EXPECT_STREQ(\"key_1\", fetched_property_1.key());\n  EXPECT_STREQ(\"1\", fetched_property_1.value());\n\n  EXPECT_STREQ(\"key_2\", fetched_property_2.key());\n  EXPECT_STREQ(\"2\", fetched_property_2.value());\n\n  EXPECT_STREQ(\"key_3\", fetched_property_3.key());\n  EXPECT_STREQ(\"3\", fetched_property_3.value());\n\n  EXPECT_DEATH_IF_SUPPORTED(test_result.GetTestProperty(3), \"\");\n  EXPECT_DEATH_IF_SUPPORTED(test_result.GetTestProperty(-1), \"\");\n}\n\n// Tests the Test class.\n//\n// It's difficult to test every public method of this class (we are\n// already stretching the limit of Google Test by using it to test itself!).\n// Fortunately, we don't have to do that, as we are already testing\n// the functionalities of the Test class extensively by using Google Test\n// alone.\n//\n// Therefore, this section only contains one test.\n\n// Tests that GTestFlagSaver works on Windows and Mac.\n\nclass GTestFlagSaverTest : public Test {\n protected:\n  // Saves the Google Test flags such that we can restore them later, and\n  // then sets them to their default values.  This will be called\n  // before the first test in this test case is run.\n  static void SetUpTestCase() {\n    saver_ = new GTestFlagSaver;\n\n    GTEST_FLAG(also_run_disabled_tests) = false;\n    GTEST_FLAG(break_on_failure) = false;\n    GTEST_FLAG(catch_exceptions) = false;\n    GTEST_FLAG(death_test_use_fork) = false;\n    GTEST_FLAG(color) = \"auto\";\n    GTEST_FLAG(filter) = \"\";\n    GTEST_FLAG(list_tests) = false;\n    GTEST_FLAG(output) = \"\";\n    GTEST_FLAG(print_time) = true;\n    GTEST_FLAG(random_seed) = 0;\n    GTEST_FLAG(repeat) = 1;\n    GTEST_FLAG(shuffle) = false;\n    GTEST_FLAG(stack_trace_depth) = kMaxStackTraceDepth;\n    GTEST_FLAG(stream_result_to) = \"\";\n    GTEST_FLAG(throw_on_failure) = false;\n  }\n\n  // Restores the Google Test flags that the tests have modified.  This will\n  // be called after the last test in this test case is run.\n  static void TearDownTestCase() {\n    delete saver_;\n    saver_ = NULL;\n  }\n\n  // Verifies that the Google Test flags have their default values, and then\n  // modifies each of them.\n  void VerifyAndModifyFlags() {\n    EXPECT_FALSE(GTEST_FLAG(also_run_disabled_tests));\n    EXPECT_FALSE(GTEST_FLAG(break_on_failure));\n    EXPECT_FALSE(GTEST_FLAG(catch_exceptions));\n    EXPECT_STREQ(\"auto\", GTEST_FLAG(color).c_str());\n    EXPECT_FALSE(GTEST_FLAG(death_test_use_fork));\n    EXPECT_STREQ(\"\", GTEST_FLAG(filter).c_str());\n    EXPECT_FALSE(GTEST_FLAG(list_tests));\n    EXPECT_STREQ(\"\", GTEST_FLAG(output).c_str());\n    EXPECT_TRUE(GTEST_FLAG(print_time));\n    EXPECT_EQ(0, GTEST_FLAG(random_seed));\n    EXPECT_EQ(1, GTEST_FLAG(repeat));\n    EXPECT_FALSE(GTEST_FLAG(shuffle));\n    EXPECT_EQ(kMaxStackTraceDepth, GTEST_FLAG(stack_trace_depth));\n    EXPECT_STREQ(\"\", GTEST_FLAG(stream_result_to).c_str());\n    EXPECT_FALSE(GTEST_FLAG(throw_on_failure));\n\n    GTEST_FLAG(also_run_disabled_tests) = true;\n    GTEST_FLAG(break_on_failure) = true;\n    GTEST_FLAG(catch_exceptions) = true;\n    GTEST_FLAG(color) = \"no\";\n    GTEST_FLAG(death_test_use_fork) = true;\n    GTEST_FLAG(filter) = \"abc\";\n    GTEST_FLAG(list_tests) = true;\n    GTEST_FLAG(output) = \"xml:foo.xml\";\n    GTEST_FLAG(print_time) = false;\n    GTEST_FLAG(random_seed) = 1;\n    GTEST_FLAG(repeat) = 100;\n    GTEST_FLAG(shuffle) = true;\n    GTEST_FLAG(stack_trace_depth) = 1;\n    GTEST_FLAG(stream_result_to) = \"localhost:1234\";\n    GTEST_FLAG(throw_on_failure) = true;\n  }\n\n private:\n  // For saving Google Test flags during this test case.\n  static GTestFlagSaver* saver_;\n};\n\nGTestFlagSaver* GTestFlagSaverTest::saver_ = NULL;\n\n// Google Test doesn't guarantee the order of tests.  The following two\n// tests are designed to work regardless of their order.\n\n// Modifies the Google Test flags in the test body.\nTEST_F(GTestFlagSaverTest, ModifyGTestFlags) {\n  VerifyAndModifyFlags();\n}\n\n// Verifies that the Google Test flags in the body of the previous test were\n// restored to their original values.\nTEST_F(GTestFlagSaverTest, VerifyGTestFlags) {\n  VerifyAndModifyFlags();\n}\n\n// Sets an environment variable with the given name to the given\n// value.  If the value argument is \"\", unsets the environment\n// variable.  The caller must ensure that both arguments are not NULL.\nstatic void SetEnv(const char* name, const char* value) {\n#if GTEST_OS_WINDOWS_MOBILE\n  // Environment variables are not supported on Windows CE.\n  return;\n#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)\n  // C++Builder's putenv only stores a pointer to its parameter; we have to\n  // ensure that the string remains valid as long as it might be needed.\n  // We use an std::map to do so.\n  static std::map<std::string, std::string*> added_env;\n\n  // Because putenv stores a pointer to the string buffer, we can't delete the\n  // previous string (if present) until after it's replaced.\n  std::string *prev_env = NULL;\n  if (added_env.find(name) != added_env.end()) {\n    prev_env = added_env[name];\n  }\n  added_env[name] = new std::string(\n      (Message() << name << \"=\" << value).GetString());\n\n  // The standard signature of putenv accepts a 'char*' argument. Other\n  // implementations, like C++Builder's, accept a 'const char*'.\n  // We cast away the 'const' since that would work for both variants.\n  putenv(const_cast<char*>(added_env[name]->c_str()));\n  delete prev_env;\n#elif GTEST_OS_WINDOWS  // If we are on Windows proper.\n  _putenv((Message() << name << \"=\" << value).GetString().c_str());\n#else\n  if (*value == '\\0') {\n    unsetenv(name);\n  } else {\n    setenv(name, value, 1);\n  }\n#endif  // GTEST_OS_WINDOWS_MOBILE\n}\n\n#if !GTEST_OS_WINDOWS_MOBILE\n// Environment variables are not supported on Windows CE.\n\nusing testing::internal::Int32FromGTestEnv;\n\n// Tests Int32FromGTestEnv().\n\n// Tests that Int32FromGTestEnv() returns the default value when the\n// environment variable is not set.\nTEST(Int32FromGTestEnvTest, ReturnsDefaultWhenVariableIsNotSet) {\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"TEMP\", \"\");\n  EXPECT_EQ(10, Int32FromGTestEnv(\"temp\", 10));\n}\n\n# if !defined(GTEST_GET_INT32_FROM_ENV_)\n\n// Tests that Int32FromGTestEnv() returns the default value when the\n// environment variable overflows as an Int32.\nTEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueOverflows) {\n  printf(\"(expecting 2 warnings)\\n\");\n\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"TEMP\", \"12345678987654321\");\n  EXPECT_EQ(20, Int32FromGTestEnv(\"temp\", 20));\n\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"TEMP\", \"-12345678987654321\");\n  EXPECT_EQ(30, Int32FromGTestEnv(\"temp\", 30));\n}\n\n// Tests that Int32FromGTestEnv() returns the default value when the\n// environment variable does not represent a valid decimal integer.\nTEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueIsInvalid) {\n  printf(\"(expecting 2 warnings)\\n\");\n\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"TEMP\", \"A1\");\n  EXPECT_EQ(40, Int32FromGTestEnv(\"temp\", 40));\n\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"TEMP\", \"12X\");\n  EXPECT_EQ(50, Int32FromGTestEnv(\"temp\", 50));\n}\n\n# endif  // !defined(GTEST_GET_INT32_FROM_ENV_)\n\n// Tests that Int32FromGTestEnv() parses and returns the value of the\n// environment variable when it represents a valid decimal integer in\n// the range of an Int32.\nTEST(Int32FromGTestEnvTest, ParsesAndReturnsValidValue) {\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"TEMP\", \"123\");\n  EXPECT_EQ(123, Int32FromGTestEnv(\"temp\", 0));\n\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"TEMP\", \"-321\");\n  EXPECT_EQ(-321, Int32FromGTestEnv(\"temp\", 0));\n}\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\n// Tests ParseInt32Flag().\n\n// Tests that ParseInt32Flag() returns false and doesn't change the\n// output value when the flag has wrong format\nTEST(ParseInt32FlagTest, ReturnsFalseForInvalidFlag) {\n  Int32 value = 123;\n  EXPECT_FALSE(ParseInt32Flag(\"--a=100\", \"b\", &value));\n  EXPECT_EQ(123, value);\n\n  EXPECT_FALSE(ParseInt32Flag(\"a=100\", \"a\", &value));\n  EXPECT_EQ(123, value);\n}\n\n// Tests that ParseInt32Flag() returns false and doesn't change the\n// output value when the flag overflows as an Int32.\nTEST(ParseInt32FlagTest, ReturnsDefaultWhenValueOverflows) {\n  printf(\"(expecting 2 warnings)\\n\");\n\n  Int32 value = 123;\n  EXPECT_FALSE(ParseInt32Flag(\"--abc=12345678987654321\", \"abc\", &value));\n  EXPECT_EQ(123, value);\n\n  EXPECT_FALSE(ParseInt32Flag(\"--abc=-12345678987654321\", \"abc\", &value));\n  EXPECT_EQ(123, value);\n}\n\n// Tests that ParseInt32Flag() returns false and doesn't change the\n// output value when the flag does not represent a valid decimal\n// integer.\nTEST(ParseInt32FlagTest, ReturnsDefaultWhenValueIsInvalid) {\n  printf(\"(expecting 2 warnings)\\n\");\n\n  Int32 value = 123;\n  EXPECT_FALSE(ParseInt32Flag(\"--abc=A1\", \"abc\", &value));\n  EXPECT_EQ(123, value);\n\n  EXPECT_FALSE(ParseInt32Flag(\"--abc=12X\", \"abc\", &value));\n  EXPECT_EQ(123, value);\n}\n\n// Tests that ParseInt32Flag() parses the value of the flag and\n// returns true when the flag represents a valid decimal integer in\n// the range of an Int32.\nTEST(ParseInt32FlagTest, ParsesAndReturnsValidValue) {\n  Int32 value = 123;\n  EXPECT_TRUE(ParseInt32Flag(\"--\" GTEST_FLAG_PREFIX_ \"abc=456\", \"abc\", &value));\n  EXPECT_EQ(456, value);\n\n  EXPECT_TRUE(ParseInt32Flag(\"--\" GTEST_FLAG_PREFIX_ \"abc=-789\",\n                             \"abc\", &value));\n  EXPECT_EQ(-789, value);\n}\n\n// Tests that Int32FromEnvOrDie() parses the value of the var or\n// returns the correct default.\n// Environment variables are not supported on Windows CE.\n#if !GTEST_OS_WINDOWS_MOBILE\nTEST(Int32FromEnvOrDieTest, ParsesAndReturnsValidValue) {\n  EXPECT_EQ(333, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ \"UnsetVar\", 333));\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"UnsetVar\", \"123\");\n  EXPECT_EQ(123, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ \"UnsetVar\", 333));\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"UnsetVar\", \"-123\");\n  EXPECT_EQ(-123, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ \"UnsetVar\", 333));\n}\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\n// Tests that Int32FromEnvOrDie() aborts with an error message\n// if the variable is not an Int32.\nTEST(Int32FromEnvOrDieDeathTest, AbortsOnFailure) {\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"VAR\", \"xxx\");\n  EXPECT_DEATH_IF_SUPPORTED(\n      Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ \"VAR\", 123),\n      \".*\");\n}\n\n// Tests that Int32FromEnvOrDie() aborts with an error message\n// if the variable cannot be represented by an Int32.\nTEST(Int32FromEnvOrDieDeathTest, AbortsOnInt32Overflow) {\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"VAR\", \"1234567891234567891234\");\n  EXPECT_DEATH_IF_SUPPORTED(\n      Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ \"VAR\", 123),\n      \".*\");\n}\n\n// Tests that ShouldRunTestOnShard() selects all tests\n// where there is 1 shard.\nTEST(ShouldRunTestOnShardTest, IsPartitionWhenThereIsOneShard) {\n  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 0));\n  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 1));\n  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 2));\n  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 3));\n  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 4));\n}\n\nclass ShouldShardTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    index_var_ = GTEST_FLAG_PREFIX_UPPER_ \"INDEX\";\n    total_var_ = GTEST_FLAG_PREFIX_UPPER_ \"TOTAL\";\n  }\n\n  virtual void TearDown() {\n    SetEnv(index_var_, \"\");\n    SetEnv(total_var_, \"\");\n  }\n\n  const char* index_var_;\n  const char* total_var_;\n};\n\n// Tests that sharding is disabled if neither of the environment variables\n// are set.\nTEST_F(ShouldShardTest, ReturnsFalseWhenNeitherEnvVarIsSet) {\n  SetEnv(index_var_, \"\");\n  SetEnv(total_var_, \"\");\n\n  EXPECT_FALSE(ShouldShard(total_var_, index_var_, false));\n  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));\n}\n\n// Tests that sharding is not enabled if total_shards  == 1.\nTEST_F(ShouldShardTest, ReturnsFalseWhenTotalShardIsOne) {\n  SetEnv(index_var_, \"0\");\n  SetEnv(total_var_, \"1\");\n  EXPECT_FALSE(ShouldShard(total_var_, index_var_, false));\n  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));\n}\n\n// Tests that sharding is enabled if total_shards > 1 and\n// we are not in a death test subprocess.\n// Environment variables are not supported on Windows CE.\n#if !GTEST_OS_WINDOWS_MOBILE\nTEST_F(ShouldShardTest, WorksWhenShardEnvVarsAreValid) {\n  SetEnv(index_var_, \"4\");\n  SetEnv(total_var_, \"22\");\n  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));\n  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));\n\n  SetEnv(index_var_, \"8\");\n  SetEnv(total_var_, \"9\");\n  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));\n  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));\n\n  SetEnv(index_var_, \"0\");\n  SetEnv(total_var_, \"9\");\n  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));\n  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));\n}\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\n// Tests that we exit in error if the sharding values are not valid.\n\ntypedef ShouldShardTest ShouldShardDeathTest;\n\nTEST_F(ShouldShardDeathTest, AbortsWhenShardingEnvVarsAreInvalid) {\n  SetEnv(index_var_, \"4\");\n  SetEnv(total_var_, \"4\");\n  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), \".*\");\n\n  SetEnv(index_var_, \"4\");\n  SetEnv(total_var_, \"-2\");\n  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), \".*\");\n\n  SetEnv(index_var_, \"5\");\n  SetEnv(total_var_, \"\");\n  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), \".*\");\n\n  SetEnv(index_var_, \"\");\n  SetEnv(total_var_, \"5\");\n  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), \".*\");\n}\n\n// Tests that ShouldRunTestOnShard is a partition when 5\n// shards are used.\nTEST(ShouldRunTestOnShardTest, IsPartitionWhenThereAreFiveShards) {\n  // Choose an arbitrary number of tests and shards.\n  const int num_tests = 17;\n  const int num_shards = 5;\n\n  // Check partitioning: each test should be on exactly 1 shard.\n  for (int test_id = 0; test_id < num_tests; test_id++) {\n    int prev_selected_shard_index = -1;\n    for (int shard_index = 0; shard_index < num_shards; shard_index++) {\n      if (ShouldRunTestOnShard(num_shards, shard_index, test_id)) {\n        if (prev_selected_shard_index < 0) {\n          prev_selected_shard_index = shard_index;\n        } else {\n          ADD_FAILURE() << \"Shard \" << prev_selected_shard_index << \" and \"\n            << shard_index << \" are both selected to run test \" << test_id;\n        }\n      }\n    }\n  }\n\n  // Check balance: This is not required by the sharding protocol, but is a\n  // desirable property for performance.\n  for (int shard_index = 0; shard_index < num_shards; shard_index++) {\n    int num_tests_on_shard = 0;\n    for (int test_id = 0; test_id < num_tests; test_id++) {\n      num_tests_on_shard +=\n        ShouldRunTestOnShard(num_shards, shard_index, test_id);\n    }\n    EXPECT_GE(num_tests_on_shard, num_tests / num_shards);\n  }\n}\n\n// For the same reason we are not explicitly testing everything in the\n// Test class, there are no separate tests for the following classes\n// (except for some trivial cases):\n//\n//   TestCase, UnitTest, UnitTestResultPrinter.\n//\n// Similarly, there are no separate tests for the following macros:\n//\n//   TEST, TEST_F, RUN_ALL_TESTS\n\nTEST(UnitTestTest, CanGetOriginalWorkingDir) {\n  ASSERT_TRUE(UnitTest::GetInstance()->original_working_dir() != NULL);\n  EXPECT_STRNE(UnitTest::GetInstance()->original_working_dir(), \"\");\n}\n\nTEST(UnitTestTest, ReturnsPlausibleTimestamp) {\n  EXPECT_LT(0, UnitTest::GetInstance()->start_timestamp());\n  EXPECT_LE(UnitTest::GetInstance()->start_timestamp(), GetTimeInMillis());\n}\n\n// When a property using a reserved key is supplied to this function, it\n// tests that a non-fatal failure is added, a fatal failure is not added,\n// and that the property is not recorded.\nvoid ExpectNonFatalFailureRecordingPropertyWithReservedKey(\n    const TestResult& test_result, const char* key) {\n  EXPECT_NONFATAL_FAILURE(Test::RecordProperty(key, \"1\"), \"Reserved key\");\n  ASSERT_EQ(0, test_result.test_property_count()) << \"Property for key '\" << key\n                                                  << \"' recorded unexpectedly.\";\n}\n\nvoid ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(\n    const char* key) {\n  const TestInfo* test_info = UnitTest::GetInstance()->current_test_info();\n  ASSERT_TRUE(test_info != NULL);\n  ExpectNonFatalFailureRecordingPropertyWithReservedKey(*test_info->result(),\n                                                        key);\n}\n\nvoid ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(\n    const char* key) {\n  const TestCase* test_case = UnitTest::GetInstance()->current_test_case();\n  ASSERT_TRUE(test_case != NULL);\n  ExpectNonFatalFailureRecordingPropertyWithReservedKey(\n      test_case->ad_hoc_test_result(), key);\n}\n\nvoid ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(\n    const char* key) {\n  ExpectNonFatalFailureRecordingPropertyWithReservedKey(\n      UnitTest::GetInstance()->ad_hoc_test_result(), key);\n}\n\n// Tests that property recording functions in UnitTest outside of tests\n// functions correcly.  Creating a separate instance of UnitTest ensures it\n// is in a state similar to the UnitTest's singleton's between tests.\nclass UnitTestRecordPropertyTest :\n    public testing::internal::UnitTestRecordPropertyTestHelper {\n public:\n  static void SetUpTestCase() {\n    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(\n        \"disabled\");\n    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(\n        \"errors\");\n    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(\n        \"failures\");\n    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(\n        \"name\");\n    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(\n        \"tests\");\n    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(\n        \"time\");\n\n    Test::RecordProperty(\"test_case_key_1\", \"1\");\n    const TestCase* test_case = UnitTest::GetInstance()->current_test_case();\n    ASSERT_TRUE(test_case != NULL);\n\n    ASSERT_EQ(1, test_case->ad_hoc_test_result().test_property_count());\n    EXPECT_STREQ(\"test_case_key_1\",\n                 test_case->ad_hoc_test_result().GetTestProperty(0).key());\n    EXPECT_STREQ(\"1\",\n                 test_case->ad_hoc_test_result().GetTestProperty(0).value());\n  }\n};\n\n// Tests TestResult has the expected property when added.\nTEST_F(UnitTestRecordPropertyTest, OnePropertyFoundWhenAdded) {\n  UnitTestRecordProperty(\"key_1\", \"1\");\n\n  ASSERT_EQ(1, unit_test_.ad_hoc_test_result().test_property_count());\n\n  EXPECT_STREQ(\"key_1\",\n               unit_test_.ad_hoc_test_result().GetTestProperty(0).key());\n  EXPECT_STREQ(\"1\",\n               unit_test_.ad_hoc_test_result().GetTestProperty(0).value());\n}\n\n// Tests TestResult has multiple properties when added.\nTEST_F(UnitTestRecordPropertyTest, MultiplePropertiesFoundWhenAdded) {\n  UnitTestRecordProperty(\"key_1\", \"1\");\n  UnitTestRecordProperty(\"key_2\", \"2\");\n\n  ASSERT_EQ(2, unit_test_.ad_hoc_test_result().test_property_count());\n\n  EXPECT_STREQ(\"key_1\",\n               unit_test_.ad_hoc_test_result().GetTestProperty(0).key());\n  EXPECT_STREQ(\"1\", unit_test_.ad_hoc_test_result().GetTestProperty(0).value());\n\n  EXPECT_STREQ(\"key_2\",\n               unit_test_.ad_hoc_test_result().GetTestProperty(1).key());\n  EXPECT_STREQ(\"2\", unit_test_.ad_hoc_test_result().GetTestProperty(1).value());\n}\n\n// Tests TestResult::RecordProperty() overrides values for duplicate keys.\nTEST_F(UnitTestRecordPropertyTest, OverridesValuesForDuplicateKeys) {\n  UnitTestRecordProperty(\"key_1\", \"1\");\n  UnitTestRecordProperty(\"key_2\", \"2\");\n  UnitTestRecordProperty(\"key_1\", \"12\");\n  UnitTestRecordProperty(\"key_2\", \"22\");\n\n  ASSERT_EQ(2, unit_test_.ad_hoc_test_result().test_property_count());\n\n  EXPECT_STREQ(\"key_1\",\n               unit_test_.ad_hoc_test_result().GetTestProperty(0).key());\n  EXPECT_STREQ(\"12\",\n               unit_test_.ad_hoc_test_result().GetTestProperty(0).value());\n\n  EXPECT_STREQ(\"key_2\",\n               unit_test_.ad_hoc_test_result().GetTestProperty(1).key());\n  EXPECT_STREQ(\"22\",\n               unit_test_.ad_hoc_test_result().GetTestProperty(1).value());\n}\n\nTEST_F(UnitTestRecordPropertyTest,\n       AddFailureInsideTestsWhenUsingTestCaseReservedKeys) {\n  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(\n      \"name\");\n  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(\n      \"value_param\");\n  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(\n      \"type_param\");\n  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(\n      \"status\");\n  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(\n      \"time\");\n  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(\n      \"classname\");\n}\n\nTEST_F(UnitTestRecordPropertyTest,\n       AddRecordWithReservedKeysGeneratesCorrectPropertyList) {\n  EXPECT_NONFATAL_FAILURE(\n      Test::RecordProperty(\"name\", \"1\"),\n      \"'classname', 'name', 'status', 'time', 'type_param', 'value_param',\"\n      \" 'file', and 'line' are reserved\");\n}\n\nclass UnitTestRecordPropertyTestEnvironment : public Environment {\n public:\n  virtual void TearDown() {\n    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(\n        \"tests\");\n    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(\n        \"failures\");\n    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(\n        \"disabled\");\n    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(\n        \"errors\");\n    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(\n        \"name\");\n    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(\n        \"timestamp\");\n    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(\n        \"time\");\n    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(\n        \"random_seed\");\n  }\n};\n\n// This will test property recording outside of any test or test case.\nstatic Environment* record_property_env =\n    AddGlobalTestEnvironment(new UnitTestRecordPropertyTestEnvironment);\n\n// This group of tests is for predicate assertions (ASSERT_PRED*, etc)\n// of various arities.  They do not attempt to be exhaustive.  Rather,\n// view them as smoke tests that can be easily reviewed and verified.\n// A more complete set of tests for predicate assertions can be found\n// in gtest_pred_impl_unittest.cc.\n\n// First, some predicates and predicate-formatters needed by the tests.\n\n// Returns true iff the argument is an even number.\nbool IsEven(int n) {\n  return (n % 2) == 0;\n}\n\n// A functor that returns true iff the argument is an even number.\nstruct IsEvenFunctor {\n  bool operator()(int n) { return IsEven(n); }\n};\n\n// A predicate-formatter function that asserts the argument is an even\n// number.\nAssertionResult AssertIsEven(const char* expr, int n) {\n  if (IsEven(n)) {\n    return AssertionSuccess();\n  }\n\n  Message msg;\n  msg << expr << \" evaluates to \" << n << \", which is not even.\";\n  return AssertionFailure(msg);\n}\n\n// A predicate function that returns AssertionResult for use in\n// EXPECT/ASSERT_TRUE/FALSE.\nAssertionResult ResultIsEven(int n) {\n  if (IsEven(n))\n    return AssertionSuccess() << n << \" is even\";\n  else\n    return AssertionFailure() << n << \" is odd\";\n}\n\n// A predicate function that returns AssertionResult but gives no\n// explanation why it succeeds. Needed for testing that\n// EXPECT/ASSERT_FALSE handles such functions correctly.\nAssertionResult ResultIsEvenNoExplanation(int n) {\n  if (IsEven(n))\n    return AssertionSuccess();\n  else\n    return AssertionFailure() << n << \" is odd\";\n}\n\n// A predicate-formatter functor that asserts the argument is an even\n// number.\nstruct AssertIsEvenFunctor {\n  AssertionResult operator()(const char* expr, int n) {\n    return AssertIsEven(expr, n);\n  }\n};\n\n// Returns true iff the sum of the arguments is an even number.\nbool SumIsEven2(int n1, int n2) {\n  return IsEven(n1 + n2);\n}\n\n// A functor that returns true iff the sum of the arguments is an even\n// number.\nstruct SumIsEven3Functor {\n  bool operator()(int n1, int n2, int n3) {\n    return IsEven(n1 + n2 + n3);\n  }\n};\n\n// A predicate-formatter function that asserts the sum of the\n// arguments is an even number.\nAssertionResult AssertSumIsEven4(\n    const char* e1, const char* e2, const char* e3, const char* e4,\n    int n1, int n2, int n3, int n4) {\n  const int sum = n1 + n2 + n3 + n4;\n  if (IsEven(sum)) {\n    return AssertionSuccess();\n  }\n\n  Message msg;\n  msg << e1 << \" + \" << e2 << \" + \" << e3 << \" + \" << e4\n      << \" (\" << n1 << \" + \" << n2 << \" + \" << n3 << \" + \" << n4\n      << \") evaluates to \" << sum << \", which is not even.\";\n  return AssertionFailure(msg);\n}\n\n// A predicate-formatter functor that asserts the sum of the arguments\n// is an even number.\nstruct AssertSumIsEven5Functor {\n  AssertionResult operator()(\n      const char* e1, const char* e2, const char* e3, const char* e4,\n      const char* e5, int n1, int n2, int n3, int n4, int n5) {\n    const int sum = n1 + n2 + n3 + n4 + n5;\n    if (IsEven(sum)) {\n      return AssertionSuccess();\n    }\n\n    Message msg;\n    msg << e1 << \" + \" << e2 << \" + \" << e3 << \" + \" << e4 << \" + \" << e5\n        << \" (\"\n        << n1 << \" + \" << n2 << \" + \" << n3 << \" + \" << n4 << \" + \" << n5\n        << \") evaluates to \" << sum << \", which is not even.\";\n    return AssertionFailure(msg);\n  }\n};\n\n\n// Tests unary predicate assertions.\n\n// Tests unary predicate assertions that don't use a custom formatter.\nTEST(Pred1Test, WithoutFormat) {\n  // Success cases.\n  EXPECT_PRED1(IsEvenFunctor(), 2) << \"This failure is UNEXPECTED!\";\n  ASSERT_PRED1(IsEven, 4);\n\n  // Failure cases.\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED1(IsEven, 5) << \"This failure is expected.\";\n  }, \"This failure is expected.\");\n  EXPECT_FATAL_FAILURE(ASSERT_PRED1(IsEvenFunctor(), 5),\n                       \"evaluates to false\");\n}\n\n// Tests unary predicate assertions that use a custom formatter.\nTEST(Pred1Test, WithFormat) {\n  // Success cases.\n  EXPECT_PRED_FORMAT1(AssertIsEven, 2);\n  ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), 4)\n    << \"This failure is UNEXPECTED!\";\n\n  // Failure cases.\n  const int n = 5;\n  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT1(AssertIsEvenFunctor(), n),\n                          \"n evaluates to 5, which is not even.\");\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT1(AssertIsEven, 5) << \"This failure is expected.\";\n  }, \"This failure is expected.\");\n}\n\n// Tests that unary predicate assertions evaluates their arguments\n// exactly once.\nTEST(Pred1Test, SingleEvaluationOnFailure) {\n  // A success case.\n  static int n = 0;\n  EXPECT_PRED1(IsEven, n++);\n  EXPECT_EQ(1, n) << \"The argument is not evaluated exactly once.\";\n\n  // A failure case.\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), n++)\n        << \"This failure is expected.\";\n  }, \"This failure is expected.\");\n  EXPECT_EQ(2, n) << \"The argument is not evaluated exactly once.\";\n}\n\n\n// Tests predicate assertions whose arity is >= 2.\n\n// Tests predicate assertions that don't use a custom formatter.\nTEST(PredTest, WithoutFormat) {\n  // Success cases.\n  ASSERT_PRED2(SumIsEven2, 2, 4) << \"This failure is UNEXPECTED!\";\n  EXPECT_PRED3(SumIsEven3Functor(), 4, 6, 8);\n\n  // Failure cases.\n  const int n1 = 1;\n  const int n2 = 2;\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED2(SumIsEven2, n1, n2) << \"This failure is expected.\";\n  }, \"This failure is expected.\");\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED3(SumIsEven3Functor(), 1, 2, 4);\n  }, \"evaluates to false\");\n}\n\n// Tests predicate assertions that use a custom formatter.\nTEST(PredTest, WithFormat) {\n  // Success cases.\n  ASSERT_PRED_FORMAT4(AssertSumIsEven4, 4, 6, 8, 10) <<\n    \"This failure is UNEXPECTED!\";\n  EXPECT_PRED_FORMAT5(AssertSumIsEven5Functor(), 2, 4, 6, 8, 10);\n\n  // Failure cases.\n  const int n1 = 1;\n  const int n2 = 2;\n  const int n3 = 4;\n  const int n4 = 6;\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT4(AssertSumIsEven4, n1, n2, n3, n4);\n  }, \"evaluates to 13, which is not even.\");\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(), 1, 2, 4, 6, 8)\n        << \"This failure is expected.\";\n  }, \"This failure is expected.\");\n}\n\n// Tests that predicate assertions evaluates their arguments\n// exactly once.\nTEST(PredTest, SingleEvaluationOnFailure) {\n  // A success case.\n  int n1 = 0;\n  int n2 = 0;\n  EXPECT_PRED2(SumIsEven2, n1++, n2++);\n  EXPECT_EQ(1, n1) << \"Argument 1 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n2) << \"Argument 2 is not evaluated exactly once.\";\n\n  // Another success case.\n  n1 = n2 = 0;\n  int n3 = 0;\n  int n4 = 0;\n  int n5 = 0;\n  ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(),\n                      n1++, n2++, n3++, n4++, n5++)\n                        << \"This failure is UNEXPECTED!\";\n  EXPECT_EQ(1, n1) << \"Argument 1 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n2) << \"Argument 2 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n3) << \"Argument 3 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n4) << \"Argument 4 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n5) << \"Argument 5 is not evaluated exactly once.\";\n\n  // A failure case.\n  n1 = n2 = n3 = 0;\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED3(SumIsEven3Functor(), ++n1, n2++, n3++)\n        << \"This failure is expected.\";\n  }, \"This failure is expected.\");\n  EXPECT_EQ(1, n1) << \"Argument 1 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n2) << \"Argument 2 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n3) << \"Argument 3 is not evaluated exactly once.\";\n\n  // Another failure case.\n  n1 = n2 = n3 = n4 = 0;\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT4(AssertSumIsEven4, ++n1, n2++, n3++, n4++);\n  }, \"evaluates to 1, which is not even.\");\n  EXPECT_EQ(1, n1) << \"Argument 1 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n2) << \"Argument 2 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n3) << \"Argument 3 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n4) << \"Argument 4 is not evaluated exactly once.\";\n}\n\n\n// Some helper functions for testing using overloaded/template\n// functions with ASSERT_PREDn and EXPECT_PREDn.\n\nbool IsPositive(double x) {\n  return x > 0;\n}\n\ntemplate <typename T>\nbool IsNegative(T x) {\n  return x < 0;\n}\n\ntemplate <typename T1, typename T2>\nbool GreaterThan(T1 x1, T2 x2) {\n  return x1 > x2;\n}\n\n// Tests that overloaded functions can be used in *_PRED* as long as\n// their types are explicitly specified.\nTEST(PredicateAssertionTest, AcceptsOverloadedFunction) {\n  // C++Builder requires C-style casts rather than static_cast.\n  EXPECT_PRED1((bool (*)(int))(IsPositive), 5);  // NOLINT\n  ASSERT_PRED1((bool (*)(double))(IsPositive), 6.0);  // NOLINT\n}\n\n// Tests that template functions can be used in *_PRED* as long as\n// their types are explicitly specified.\nTEST(PredicateAssertionTest, AcceptsTemplateFunction) {\n  EXPECT_PRED1(IsNegative<int>, -5);\n  // Makes sure that we can handle templates with more than one\n  // parameter.\n  ASSERT_PRED2((GreaterThan<int, int>), 5, 0);\n}\n\n\n// Some helper functions for testing using overloaded/template\n// functions with ASSERT_PRED_FORMATn and EXPECT_PRED_FORMATn.\n\nAssertionResult IsPositiveFormat(const char* /* expr */, int n) {\n  return n > 0 ? AssertionSuccess() :\n      AssertionFailure(Message() << \"Failure\");\n}\n\nAssertionResult IsPositiveFormat(const char* /* expr */, double x) {\n  return x > 0 ? AssertionSuccess() :\n      AssertionFailure(Message() << \"Failure\");\n}\n\ntemplate <typename T>\nAssertionResult IsNegativeFormat(const char* /* expr */, T x) {\n  return x < 0 ? AssertionSuccess() :\n      AssertionFailure(Message() << \"Failure\");\n}\n\ntemplate <typename T1, typename T2>\nAssertionResult EqualsFormat(const char* /* expr1 */, const char* /* expr2 */,\n                             const T1& x1, const T2& x2) {\n  return x1 == x2 ? AssertionSuccess() :\n      AssertionFailure(Message() << \"Failure\");\n}\n\n// Tests that overloaded functions can be used in *_PRED_FORMAT*\n// without explicitly specifying their types.\nTEST(PredicateFormatAssertionTest, AcceptsOverloadedFunction) {\n  EXPECT_PRED_FORMAT1(IsPositiveFormat, 5);\n  ASSERT_PRED_FORMAT1(IsPositiveFormat, 6.0);\n}\n\n// Tests that template functions can be used in *_PRED_FORMAT* without\n// explicitly specifying their types.\nTEST(PredicateFormatAssertionTest, AcceptsTemplateFunction) {\n  EXPECT_PRED_FORMAT1(IsNegativeFormat, -5);\n  ASSERT_PRED_FORMAT2(EqualsFormat, 3, 3);\n}\n\n\n// Tests string assertions.\n\n// Tests ASSERT_STREQ with non-NULL arguments.\nTEST(StringAssertionTest, ASSERT_STREQ) {\n  const char * const p1 = \"good\";\n  ASSERT_STREQ(p1, p1);\n\n  // Let p2 have the same content as p1, but be at a different address.\n  const char p2[] = \"good\";\n  ASSERT_STREQ(p1, p2);\n\n  EXPECT_FATAL_FAILURE(ASSERT_STREQ(\"bad\", \"good\"),\n                       \"  \\\"bad\\\"\\n  \\\"good\\\"\");\n}\n\n// Tests ASSERT_STREQ with NULL arguments.\nTEST(StringAssertionTest, ASSERT_STREQ_Null) {\n  ASSERT_STREQ(static_cast<const char *>(NULL), NULL);\n  EXPECT_FATAL_FAILURE(ASSERT_STREQ(NULL, \"non-null\"),\n                       \"non-null\");\n}\n\n// Tests ASSERT_STREQ with NULL arguments.\nTEST(StringAssertionTest, ASSERT_STREQ_Null2) {\n  EXPECT_FATAL_FAILURE(ASSERT_STREQ(\"non-null\", NULL),\n                       \"non-null\");\n}\n\n// Tests ASSERT_STRNE.\nTEST(StringAssertionTest, ASSERT_STRNE) {\n  ASSERT_STRNE(\"hi\", \"Hi\");\n  ASSERT_STRNE(\"Hi\", NULL);\n  ASSERT_STRNE(NULL, \"Hi\");\n  ASSERT_STRNE(\"\", NULL);\n  ASSERT_STRNE(NULL, \"\");\n  ASSERT_STRNE(\"\", \"Hi\");\n  ASSERT_STRNE(\"Hi\", \"\");\n  EXPECT_FATAL_FAILURE(ASSERT_STRNE(\"Hi\", \"Hi\"),\n                       \"\\\"Hi\\\" vs \\\"Hi\\\"\");\n}\n\n// Tests ASSERT_STRCASEEQ.\nTEST(StringAssertionTest, ASSERT_STRCASEEQ) {\n  ASSERT_STRCASEEQ(\"hi\", \"Hi\");\n  ASSERT_STRCASEEQ(static_cast<const char *>(NULL), NULL);\n\n  ASSERT_STRCASEEQ(\"\", \"\");\n  EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ(\"Hi\", \"hi2\"),\n                       \"Ignoring case\");\n}\n\n// Tests ASSERT_STRCASENE.\nTEST(StringAssertionTest, ASSERT_STRCASENE) {\n  ASSERT_STRCASENE(\"hi1\", \"Hi2\");\n  ASSERT_STRCASENE(\"Hi\", NULL);\n  ASSERT_STRCASENE(NULL, \"Hi\");\n  ASSERT_STRCASENE(\"\", NULL);\n  ASSERT_STRCASENE(NULL, \"\");\n  ASSERT_STRCASENE(\"\", \"Hi\");\n  ASSERT_STRCASENE(\"Hi\", \"\");\n  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE(\"Hi\", \"hi\"),\n                       \"(ignoring case)\");\n}\n\n// Tests *_STREQ on wide strings.\nTEST(StringAssertionTest, STREQ_Wide) {\n  // NULL strings.\n  ASSERT_STREQ(static_cast<const wchar_t *>(NULL), NULL);\n\n  // Empty strings.\n  ASSERT_STREQ(L\"\", L\"\");\n\n  // Non-null vs NULL.\n  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L\"non-null\", NULL),\n                          \"non-null\");\n\n  // Equal strings.\n  EXPECT_STREQ(L\"Hi\", L\"Hi\");\n\n  // Unequal strings.\n  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L\"abc\", L\"Abc\"),\n                          \"Abc\");\n\n  // Strings containing wide characters.\n  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L\"abc\\x8119\", L\"abc\\x8120\"),\n                          \"abc\");\n\n  // The streaming variation.\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_STREQ(L\"abc\\x8119\", L\"abc\\x8121\") << \"Expected failure\";\n  }, \"Expected failure\");\n}\n\n// Tests *_STRNE on wide strings.\nTEST(StringAssertionTest, STRNE_Wide) {\n  // NULL strings.\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_STRNE(static_cast<const wchar_t *>(NULL), NULL);\n  }, \"\");\n\n  // Empty strings.\n  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L\"\", L\"\"),\n                          \"L\\\"\\\"\");\n\n  // Non-null vs NULL.\n  ASSERT_STRNE(L\"non-null\", NULL);\n\n  // Equal strings.\n  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L\"Hi\", L\"Hi\"),\n                          \"L\\\"Hi\\\"\");\n\n  // Unequal strings.\n  EXPECT_STRNE(L\"abc\", L\"Abc\");\n\n  // Strings containing wide characters.\n  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L\"abc\\x8119\", L\"abc\\x8119\"),\n                          \"abc\");\n\n  // The streaming variation.\n  ASSERT_STRNE(L\"abc\\x8119\", L\"abc\\x8120\") << \"This shouldn't happen\";\n}\n\n// Tests for ::testing::IsSubstring().\n\n// Tests that IsSubstring() returns the correct result when the input\n// argument type is const char*.\nTEST(IsSubstringTest, ReturnsCorrectResultForCString) {\n  EXPECT_FALSE(IsSubstring(\"\", \"\", NULL, \"a\"));\n  EXPECT_FALSE(IsSubstring(\"\", \"\", \"b\", NULL));\n  EXPECT_FALSE(IsSubstring(\"\", \"\", \"needle\", \"haystack\"));\n\n  EXPECT_TRUE(IsSubstring(\"\", \"\", static_cast<const char*>(NULL), NULL));\n  EXPECT_TRUE(IsSubstring(\"\", \"\", \"needle\", \"two needles\"));\n}\n\n// Tests that IsSubstring() returns the correct result when the input\n// argument type is const wchar_t*.\nTEST(IsSubstringTest, ReturnsCorrectResultForWideCString) {\n  EXPECT_FALSE(IsSubstring(\"\", \"\", kNull, L\"a\"));\n  EXPECT_FALSE(IsSubstring(\"\", \"\", L\"b\", kNull));\n  EXPECT_FALSE(IsSubstring(\"\", \"\", L\"needle\", L\"haystack\"));\n\n  EXPECT_TRUE(IsSubstring(\"\", \"\", static_cast<const wchar_t*>(NULL), NULL));\n  EXPECT_TRUE(IsSubstring(\"\", \"\", L\"needle\", L\"two needles\"));\n}\n\n// Tests that IsSubstring() generates the correct message when the input\n// argument type is const char*.\nTEST(IsSubstringTest, GeneratesCorrectMessageForCString) {\n  EXPECT_STREQ(\"Value of: needle_expr\\n\"\n               \"  Actual: \\\"needle\\\"\\n\"\n               \"Expected: a substring of haystack_expr\\n\"\n               \"Which is: \\\"haystack\\\"\",\n               IsSubstring(\"needle_expr\", \"haystack_expr\",\n                           \"needle\", \"haystack\").failure_message());\n}\n\n// Tests that IsSubstring returns the correct result when the input\n// argument type is ::std::string.\nTEST(IsSubstringTest, ReturnsCorrectResultsForStdString) {\n  EXPECT_TRUE(IsSubstring(\"\", \"\", std::string(\"hello\"), \"ahellob\"));\n  EXPECT_FALSE(IsSubstring(\"\", \"\", \"hello\", std::string(\"world\")));\n}\n\n#if GTEST_HAS_STD_WSTRING\n// Tests that IsSubstring returns the correct result when the input\n// argument type is ::std::wstring.\nTEST(IsSubstringTest, ReturnsCorrectResultForStdWstring) {\n  EXPECT_TRUE(IsSubstring(\"\", \"\", ::std::wstring(L\"needle\"), L\"two needles\"));\n  EXPECT_FALSE(IsSubstring(\"\", \"\", L\"needle\", ::std::wstring(L\"haystack\")));\n}\n\n// Tests that IsSubstring() generates the correct message when the input\n// argument type is ::std::wstring.\nTEST(IsSubstringTest, GeneratesCorrectMessageForWstring) {\n  EXPECT_STREQ(\"Value of: needle_expr\\n\"\n               \"  Actual: L\\\"needle\\\"\\n\"\n               \"Expected: a substring of haystack_expr\\n\"\n               \"Which is: L\\\"haystack\\\"\",\n               IsSubstring(\n                   \"needle_expr\", \"haystack_expr\",\n                   ::std::wstring(L\"needle\"), L\"haystack\").failure_message());\n}\n\n#endif  // GTEST_HAS_STD_WSTRING\n\n// Tests for ::testing::IsNotSubstring().\n\n// Tests that IsNotSubstring() returns the correct result when the input\n// argument type is const char*.\nTEST(IsNotSubstringTest, ReturnsCorrectResultForCString) {\n  EXPECT_TRUE(IsNotSubstring(\"\", \"\", \"needle\", \"haystack\"));\n  EXPECT_FALSE(IsNotSubstring(\"\", \"\", \"needle\", \"two needles\"));\n}\n\n// Tests that IsNotSubstring() returns the correct result when the input\n// argument type is const wchar_t*.\nTEST(IsNotSubstringTest, ReturnsCorrectResultForWideCString) {\n  EXPECT_TRUE(IsNotSubstring(\"\", \"\", L\"needle\", L\"haystack\"));\n  EXPECT_FALSE(IsNotSubstring(\"\", \"\", L\"needle\", L\"two needles\"));\n}\n\n// Tests that IsNotSubstring() generates the correct message when the input\n// argument type is const wchar_t*.\nTEST(IsNotSubstringTest, GeneratesCorrectMessageForWideCString) {\n  EXPECT_STREQ(\"Value of: needle_expr\\n\"\n               \"  Actual: L\\\"needle\\\"\\n\"\n               \"Expected: not a substring of haystack_expr\\n\"\n               \"Which is: L\\\"two needles\\\"\",\n               IsNotSubstring(\n                   \"needle_expr\", \"haystack_expr\",\n                   L\"needle\", L\"two needles\").failure_message());\n}\n\n// Tests that IsNotSubstring returns the correct result when the input\n// argument type is ::std::string.\nTEST(IsNotSubstringTest, ReturnsCorrectResultsForStdString) {\n  EXPECT_FALSE(IsNotSubstring(\"\", \"\", std::string(\"hello\"), \"ahellob\"));\n  EXPECT_TRUE(IsNotSubstring(\"\", \"\", \"hello\", std::string(\"world\")));\n}\n\n// Tests that IsNotSubstring() generates the correct message when the input\n// argument type is ::std::string.\nTEST(IsNotSubstringTest, GeneratesCorrectMessageForStdString) {\n  EXPECT_STREQ(\"Value of: needle_expr\\n\"\n               \"  Actual: \\\"needle\\\"\\n\"\n               \"Expected: not a substring of haystack_expr\\n\"\n               \"Which is: \\\"two needles\\\"\",\n               IsNotSubstring(\n                   \"needle_expr\", \"haystack_expr\",\n                   ::std::string(\"needle\"), \"two needles\").failure_message());\n}\n\n#if GTEST_HAS_STD_WSTRING\n\n// Tests that IsNotSubstring returns the correct result when the input\n// argument type is ::std::wstring.\nTEST(IsNotSubstringTest, ReturnsCorrectResultForStdWstring) {\n  EXPECT_FALSE(\n      IsNotSubstring(\"\", \"\", ::std::wstring(L\"needle\"), L\"two needles\"));\n  EXPECT_TRUE(IsNotSubstring(\"\", \"\", L\"needle\", ::std::wstring(L\"haystack\")));\n}\n\n#endif  // GTEST_HAS_STD_WSTRING\n\n// Tests floating-point assertions.\n\ntemplate <typename RawType>\nclass FloatingPointTest : public Test {\n protected:\n  // Pre-calculated numbers to be used by the tests.\n  struct TestValues {\n    RawType close_to_positive_zero;\n    RawType close_to_negative_zero;\n    RawType further_from_negative_zero;\n\n    RawType close_to_one;\n    RawType further_from_one;\n\n    RawType infinity;\n    RawType close_to_infinity;\n    RawType further_from_infinity;\n\n    RawType nan1;\n    RawType nan2;\n  };\n\n  typedef typename testing::internal::FloatingPoint<RawType> Floating;\n  typedef typename Floating::Bits Bits;\n\n  virtual void SetUp() {\n    const size_t max_ulps = Floating::kMaxUlps;\n\n    // The bits that represent 0.0.\n    const Bits zero_bits = Floating(0).bits();\n\n    // Makes some numbers close to 0.0.\n    values_.close_to_positive_zero = Floating::ReinterpretBits(\n        zero_bits + max_ulps/2);\n    values_.close_to_negative_zero = -Floating::ReinterpretBits(\n        zero_bits + max_ulps - max_ulps/2);\n    values_.further_from_negative_zero = -Floating::ReinterpretBits(\n        zero_bits + max_ulps + 1 - max_ulps/2);\n\n    // The bits that represent 1.0.\n    const Bits one_bits = Floating(1).bits();\n\n    // Makes some numbers close to 1.0.\n    values_.close_to_one = Floating::ReinterpretBits(one_bits + max_ulps);\n    values_.further_from_one = Floating::ReinterpretBits(\n        one_bits + max_ulps + 1);\n\n    // +infinity.\n    values_.infinity = Floating::Infinity();\n\n    // The bits that represent +infinity.\n    const Bits infinity_bits = Floating(values_.infinity).bits();\n\n    // Makes some numbers close to infinity.\n    values_.close_to_infinity = Floating::ReinterpretBits(\n        infinity_bits - max_ulps);\n    values_.further_from_infinity = Floating::ReinterpretBits(\n        infinity_bits - max_ulps - 1);\n\n    // Makes some NAN's.  Sets the most significant bit of the fraction so that\n    // our NaN's are quiet; trying to process a signaling NaN would raise an\n    // exception if our environment enables floating point exceptions.\n    values_.nan1 = Floating::ReinterpretBits(Floating::kExponentBitMask\n        | (static_cast<Bits>(1) << (Floating::kFractionBitCount - 1)) | 1);\n    values_.nan2 = Floating::ReinterpretBits(Floating::kExponentBitMask\n        | (static_cast<Bits>(1) << (Floating::kFractionBitCount - 1)) | 200);\n  }\n\n  void TestSize() {\n    EXPECT_EQ(sizeof(RawType), sizeof(Bits));\n  }\n\n  static TestValues values_;\n};\n\ntemplate <typename RawType>\ntypename FloatingPointTest<RawType>::TestValues\n    FloatingPointTest<RawType>::values_;\n\n// Instantiates FloatingPointTest for testing *_FLOAT_EQ.\ntypedef FloatingPointTest<float> FloatTest;\n\n// Tests that the size of Float::Bits matches the size of float.\nTEST_F(FloatTest, Size) {\n  TestSize();\n}\n\n// Tests comparing with +0 and -0.\nTEST_F(FloatTest, Zeros) {\n  EXPECT_FLOAT_EQ(0.0, -0.0);\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(-0.0, 1.0),\n                          \"1.0\");\n  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.5),\n                       \"1.5\");\n}\n\n// Tests comparing numbers close to 0.\n//\n// This ensures that *_FLOAT_EQ handles the sign correctly and no\n// overflow occurs when comparing numbers whose absolute value is very\n// small.\nTEST_F(FloatTest, AlmostZeros) {\n  // In C++Builder, names within local classes (such as used by\n  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the\n  // scoping class.  Use a static local alias as a workaround.\n  // We use the assignment syntax since some compilers, like Sun Studio,\n  // don't allow initializing references using construction syntax\n  // (parentheses).\n  static const FloatTest::TestValues& v = this->values_;\n\n  EXPECT_FLOAT_EQ(0.0, v.close_to_positive_zero);\n  EXPECT_FLOAT_EQ(-0.0, v.close_to_negative_zero);\n  EXPECT_FLOAT_EQ(v.close_to_positive_zero, v.close_to_negative_zero);\n\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_FLOAT_EQ(v.close_to_positive_zero,\n                    v.further_from_negative_zero);\n  }, \"v.further_from_negative_zero\");\n}\n\n// Tests comparing numbers close to each other.\nTEST_F(FloatTest, SmallDiff) {\n  EXPECT_FLOAT_EQ(1.0, values_.close_to_one);\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, values_.further_from_one),\n                          \"values_.further_from_one\");\n}\n\n// Tests comparing numbers far apart.\nTEST_F(FloatTest, LargeDiff) {\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(2.5, 3.0),\n                          \"3.0\");\n}\n\n// Tests comparing with infinity.\n//\n// This ensures that no overflow occurs when comparing numbers whose\n// absolute value is very large.\nTEST_F(FloatTest, Infinity) {\n  EXPECT_FLOAT_EQ(values_.infinity, values_.close_to_infinity);\n  EXPECT_FLOAT_EQ(-values_.infinity, -values_.close_to_infinity);\n#if !GTEST_OS_SYMBIAN\n  // Nokia's STLport crashes if we try to output infinity or NaN.\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.infinity, -values_.infinity),\n                          \"-values_.infinity\");\n\n  // This is interesting as the representations of infinity and nan1\n  // are only 1 DLP apart.\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.infinity, values_.nan1),\n                          \"values_.nan1\");\n#endif  // !GTEST_OS_SYMBIAN\n}\n\n// Tests that comparing with NAN always returns false.\nTEST_F(FloatTest, NaN) {\n#if !GTEST_OS_SYMBIAN\n// Nokia's STLport crashes if we try to output infinity or NaN.\n\n  // In C++Builder, names within local classes (such as used by\n  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the\n  // scoping class.  Use a static local alias as a workaround.\n  // We use the assignment syntax since some compilers, like Sun Studio,\n  // don't allow initializing references using construction syntax\n  // (parentheses).\n  static const FloatTest::TestValues& v = this->values_;\n\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(v.nan1, v.nan1),\n                          \"v.nan1\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(v.nan1, v.nan2),\n                          \"v.nan2\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, v.nan1),\n                          \"v.nan1\");\n\n  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(v.nan1, v.infinity),\n                       \"v.infinity\");\n#endif  // !GTEST_OS_SYMBIAN\n}\n\n// Tests that *_FLOAT_EQ are reflexive.\nTEST_F(FloatTest, Reflexive) {\n  EXPECT_FLOAT_EQ(0.0, 0.0);\n  EXPECT_FLOAT_EQ(1.0, 1.0);\n  ASSERT_FLOAT_EQ(values_.infinity, values_.infinity);\n}\n\n// Tests that *_FLOAT_EQ are commutative.\nTEST_F(FloatTest, Commutative) {\n  // We already tested EXPECT_FLOAT_EQ(1.0, values_.close_to_one).\n  EXPECT_FLOAT_EQ(values_.close_to_one, 1.0);\n\n  // We already tested EXPECT_FLOAT_EQ(1.0, values_.further_from_one).\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.further_from_one, 1.0),\n                          \"1.0\");\n}\n\n// Tests EXPECT_NEAR.\nTEST_F(FloatTest, EXPECT_NEAR) {\n  EXPECT_NEAR(-1.0f, -1.1f, 0.2f);\n  EXPECT_NEAR(2.0f, 3.0f, 1.0f);\n  EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0f,1.5f, 0.25f),  // NOLINT\n                          \"The difference between 1.0f and 1.5f is 0.5, \"\n                          \"which exceeds 0.25f\");\n  // To work around a bug in gcc 2.95.0, there is intentionally no\n  // space after the first comma in the previous line.\n}\n\n// Tests ASSERT_NEAR.\nTEST_F(FloatTest, ASSERT_NEAR) {\n  ASSERT_NEAR(-1.0f, -1.1f, 0.2f);\n  ASSERT_NEAR(2.0f, 3.0f, 1.0f);\n  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0f,1.5f, 0.25f),  // NOLINT\n                       \"The difference between 1.0f and 1.5f is 0.5, \"\n                       \"which exceeds 0.25f\");\n  // To work around a bug in gcc 2.95.0, there is intentionally no\n  // space after the first comma in the previous line.\n}\n\n// Tests the cases where FloatLE() should succeed.\nTEST_F(FloatTest, FloatLESucceeds) {\n  EXPECT_PRED_FORMAT2(FloatLE, 1.0f, 2.0f);  // When val1 < val2,\n  ASSERT_PRED_FORMAT2(FloatLE, 1.0f, 1.0f);  // val1 == val2,\n\n  // or when val1 is greater than, but almost equals to, val2.\n  EXPECT_PRED_FORMAT2(FloatLE, values_.close_to_positive_zero, 0.0f);\n}\n\n// Tests the cases where FloatLE() should fail.\nTEST_F(FloatTest, FloatLEFails) {\n  // When val1 is greater than val2 by a large margin,\n  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(FloatLE, 2.0f, 1.0f),\n                          \"(2.0f) <= (1.0f)\");\n\n  // or by a small yet non-negligible margin,\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(FloatLE, values_.further_from_one, 1.0f);\n  }, \"(values_.further_from_one) <= (1.0f)\");\n\n#if !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)\n  // Nokia's STLport crashes if we try to output infinity or NaN.\n  // C++Builder gives bad results for ordered comparisons involving NaNs\n  // due to compiler bugs.\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(FloatLE, values_.nan1, values_.infinity);\n  }, \"(values_.nan1) <= (values_.infinity)\");\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(FloatLE, -values_.infinity, values_.nan1);\n  }, \"(-values_.infinity) <= (values_.nan1)\");\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT2(FloatLE, values_.nan1, values_.nan1);\n  }, \"(values_.nan1) <= (values_.nan1)\");\n#endif  // !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)\n}\n\n// Instantiates FloatingPointTest for testing *_DOUBLE_EQ.\ntypedef FloatingPointTest<double> DoubleTest;\n\n// Tests that the size of Double::Bits matches the size of double.\nTEST_F(DoubleTest, Size) {\n  TestSize();\n}\n\n// Tests comparing with +0 and -0.\nTEST_F(DoubleTest, Zeros) {\n  EXPECT_DOUBLE_EQ(0.0, -0.0);\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(-0.0, 1.0),\n                          \"1.0\");\n  EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(0.0, 1.0),\n                       \"1.0\");\n}\n\n// Tests comparing numbers close to 0.\n//\n// This ensures that *_DOUBLE_EQ handles the sign correctly and no\n// overflow occurs when comparing numbers whose absolute value is very\n// small.\nTEST_F(DoubleTest, AlmostZeros) {\n  // In C++Builder, names within local classes (such as used by\n  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the\n  // scoping class.  Use a static local alias as a workaround.\n  // We use the assignment syntax since some compilers, like Sun Studio,\n  // don't allow initializing references using construction syntax\n  // (parentheses).\n  static const DoubleTest::TestValues& v = this->values_;\n\n  EXPECT_DOUBLE_EQ(0.0, v.close_to_positive_zero);\n  EXPECT_DOUBLE_EQ(-0.0, v.close_to_negative_zero);\n  EXPECT_DOUBLE_EQ(v.close_to_positive_zero, v.close_to_negative_zero);\n\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_DOUBLE_EQ(v.close_to_positive_zero,\n                     v.further_from_negative_zero);\n  }, \"v.further_from_negative_zero\");\n}\n\n// Tests comparing numbers close to each other.\nTEST_F(DoubleTest, SmallDiff) {\n  EXPECT_DOUBLE_EQ(1.0, values_.close_to_one);\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, values_.further_from_one),\n                          \"values_.further_from_one\");\n}\n\n// Tests comparing numbers far apart.\nTEST_F(DoubleTest, LargeDiff) {\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(2.0, 3.0),\n                          \"3.0\");\n}\n\n// Tests comparing with infinity.\n//\n// This ensures that no overflow occurs when comparing numbers whose\n// absolute value is very large.\nTEST_F(DoubleTest, Infinity) {\n  EXPECT_DOUBLE_EQ(values_.infinity, values_.close_to_infinity);\n  EXPECT_DOUBLE_EQ(-values_.infinity, -values_.close_to_infinity);\n#if !GTEST_OS_SYMBIAN\n  // Nokia's STLport crashes if we try to output infinity or NaN.\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.infinity, -values_.infinity),\n                          \"-values_.infinity\");\n\n  // This is interesting as the representations of infinity_ and nan1_\n  // are only 1 DLP apart.\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.infinity, values_.nan1),\n                          \"values_.nan1\");\n#endif  // !GTEST_OS_SYMBIAN\n}\n\n// Tests that comparing with NAN always returns false.\nTEST_F(DoubleTest, NaN) {\n#if !GTEST_OS_SYMBIAN\n  // In C++Builder, names within local classes (such as used by\n  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the\n  // scoping class.  Use a static local alias as a workaround.\n  // We use the assignment syntax since some compilers, like Sun Studio,\n  // don't allow initializing references using construction syntax\n  // (parentheses).\n  static const DoubleTest::TestValues& v = this->values_;\n\n  // Nokia's STLport crashes if we try to output infinity or NaN.\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(v.nan1, v.nan1),\n                          \"v.nan1\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(v.nan1, v.nan2), \"v.nan2\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, v.nan1), \"v.nan1\");\n  EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(v.nan1, v.infinity),\n                       \"v.infinity\");\n#endif  // !GTEST_OS_SYMBIAN\n}\n\n// Tests that *_DOUBLE_EQ are reflexive.\nTEST_F(DoubleTest, Reflexive) {\n  EXPECT_DOUBLE_EQ(0.0, 0.0);\n  EXPECT_DOUBLE_EQ(1.0, 1.0);\n#if !GTEST_OS_SYMBIAN\n  // Nokia's STLport crashes if we try to output infinity or NaN.\n  ASSERT_DOUBLE_EQ(values_.infinity, values_.infinity);\n#endif  // !GTEST_OS_SYMBIAN\n}\n\n// Tests that *_DOUBLE_EQ are commutative.\nTEST_F(DoubleTest, Commutative) {\n  // We already tested EXPECT_DOUBLE_EQ(1.0, values_.close_to_one).\n  EXPECT_DOUBLE_EQ(values_.close_to_one, 1.0);\n\n  // We already tested EXPECT_DOUBLE_EQ(1.0, values_.further_from_one).\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.further_from_one, 1.0),\n                          \"1.0\");\n}\n\n// Tests EXPECT_NEAR.\nTEST_F(DoubleTest, EXPECT_NEAR) {\n  EXPECT_NEAR(-1.0, -1.1, 0.2);\n  EXPECT_NEAR(2.0, 3.0, 1.0);\n  EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0, 1.5, 0.25),  // NOLINT\n                          \"The difference between 1.0 and 1.5 is 0.5, \"\n                          \"which exceeds 0.25\");\n  // To work around a bug in gcc 2.95.0, there is intentionally no\n  // space after the first comma in the previous statement.\n}\n\n// Tests ASSERT_NEAR.\nTEST_F(DoubleTest, ASSERT_NEAR) {\n  ASSERT_NEAR(-1.0, -1.1, 0.2);\n  ASSERT_NEAR(2.0, 3.0, 1.0);\n  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0, 1.5, 0.25),  // NOLINT\n                       \"The difference between 1.0 and 1.5 is 0.5, \"\n                       \"which exceeds 0.25\");\n  // To work around a bug in gcc 2.95.0, there is intentionally no\n  // space after the first comma in the previous statement.\n}\n\n// Tests the cases where DoubleLE() should succeed.\nTEST_F(DoubleTest, DoubleLESucceeds) {\n  EXPECT_PRED_FORMAT2(DoubleLE, 1.0, 2.0);  // When val1 < val2,\n  ASSERT_PRED_FORMAT2(DoubleLE, 1.0, 1.0);  // val1 == val2,\n\n  // or when val1 is greater than, but almost equals to, val2.\n  EXPECT_PRED_FORMAT2(DoubleLE, values_.close_to_positive_zero, 0.0);\n}\n\n// Tests the cases where DoubleLE() should fail.\nTEST_F(DoubleTest, DoubleLEFails) {\n  // When val1 is greater than val2 by a large margin,\n  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(DoubleLE, 2.0, 1.0),\n                          \"(2.0) <= (1.0)\");\n\n  // or by a small yet non-negligible margin,\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(DoubleLE, values_.further_from_one, 1.0);\n  }, \"(values_.further_from_one) <= (1.0)\");\n\n#if !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)\n  // Nokia's STLport crashes if we try to output infinity or NaN.\n  // C++Builder gives bad results for ordered comparisons involving NaNs\n  // due to compiler bugs.\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(DoubleLE, values_.nan1, values_.infinity);\n  }, \"(values_.nan1) <= (values_.infinity)\");\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(DoubleLE, -values_.infinity, values_.nan1);\n  }, \" (-values_.infinity) <= (values_.nan1)\");\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT2(DoubleLE, values_.nan1, values_.nan1);\n  }, \"(values_.nan1) <= (values_.nan1)\");\n#endif  // !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)\n}\n\n\n// Verifies that a test or test case whose name starts with DISABLED_ is\n// not run.\n\n// A test whose name starts with DISABLED_.\n// Should not run.\nTEST(DisabledTest, DISABLED_TestShouldNotRun) {\n  FAIL() << \"Unexpected failure: Disabled test should not be run.\";\n}\n\n// A test whose name does not start with DISABLED_.\n// Should run.\nTEST(DisabledTest, NotDISABLED_TestShouldRun) {\n  EXPECT_EQ(1, 1);\n}\n\n// A test case whose name starts with DISABLED_.\n// Should not run.\nTEST(DISABLED_TestCase, TestShouldNotRun) {\n  FAIL() << \"Unexpected failure: Test in disabled test case should not be run.\";\n}\n\n// A test case and test whose names start with DISABLED_.\n// Should not run.\nTEST(DISABLED_TestCase, DISABLED_TestShouldNotRun) {\n  FAIL() << \"Unexpected failure: Test in disabled test case should not be run.\";\n}\n\n// Check that when all tests in a test case are disabled, SetUpTestCase() and\n// TearDownTestCase() are not called.\nclass DisabledTestsTest : public Test {\n protected:\n  static void SetUpTestCase() {\n    FAIL() << \"Unexpected failure: All tests disabled in test case. \"\n              \"SetUpTestCase() should not be called.\";\n  }\n\n  static void TearDownTestCase() {\n    FAIL() << \"Unexpected failure: All tests disabled in test case. \"\n              \"TearDownTestCase() should not be called.\";\n  }\n};\n\nTEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_1) {\n  FAIL() << \"Unexpected failure: Disabled test should not be run.\";\n}\n\nTEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_2) {\n  FAIL() << \"Unexpected failure: Disabled test should not be run.\";\n}\n\n// Tests that disabled typed tests aren't run.\n\n#if GTEST_HAS_TYPED_TEST\n\ntemplate <typename T>\nclass TypedTest : public Test {\n};\n\ntypedef testing::Types<int, double> NumericTypes;\nTYPED_TEST_CASE(TypedTest, NumericTypes);\n\nTYPED_TEST(TypedTest, DISABLED_ShouldNotRun) {\n  FAIL() << \"Unexpected failure: Disabled typed test should not run.\";\n}\n\ntemplate <typename T>\nclass DISABLED_TypedTest : public Test {\n};\n\nTYPED_TEST_CASE(DISABLED_TypedTest, NumericTypes);\n\nTYPED_TEST(DISABLED_TypedTest, ShouldNotRun) {\n  FAIL() << \"Unexpected failure: Disabled typed test should not run.\";\n}\n\n#endif  // GTEST_HAS_TYPED_TEST\n\n// Tests that disabled type-parameterized tests aren't run.\n\n#if GTEST_HAS_TYPED_TEST_P\n\ntemplate <typename T>\nclass TypedTestP : public Test {\n};\n\nTYPED_TEST_CASE_P(TypedTestP);\n\nTYPED_TEST_P(TypedTestP, DISABLED_ShouldNotRun) {\n  FAIL() << \"Unexpected failure: \"\n         << \"Disabled type-parameterized test should not run.\";\n}\n\nREGISTER_TYPED_TEST_CASE_P(TypedTestP, DISABLED_ShouldNotRun);\n\nINSTANTIATE_TYPED_TEST_CASE_P(My, TypedTestP, NumericTypes);\n\ntemplate <typename T>\nclass DISABLED_TypedTestP : public Test {\n};\n\nTYPED_TEST_CASE_P(DISABLED_TypedTestP);\n\nTYPED_TEST_P(DISABLED_TypedTestP, ShouldNotRun) {\n  FAIL() << \"Unexpected failure: \"\n         << \"Disabled type-parameterized test should not run.\";\n}\n\nREGISTER_TYPED_TEST_CASE_P(DISABLED_TypedTestP, ShouldNotRun);\n\nINSTANTIATE_TYPED_TEST_CASE_P(My, DISABLED_TypedTestP, NumericTypes);\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n\n// Tests that assertion macros evaluate their arguments exactly once.\n\nclass SingleEvaluationTest : public Test {\n public:  // Must be public and not protected due to a bug in g++ 3.4.2.\n  // This helper function is needed by the FailedASSERT_STREQ test\n  // below.  It's public to work around C++Builder's bug with scoping local\n  // classes.\n  static void CompareAndIncrementCharPtrs() {\n    ASSERT_STREQ(p1_++, p2_++);\n  }\n\n  // This helper function is needed by the FailedASSERT_NE test below.  It's\n  // public to work around C++Builder's bug with scoping local classes.\n  static void CompareAndIncrementInts() {\n    ASSERT_NE(a_++, b_++);\n  }\n\n protected:\n  SingleEvaluationTest() {\n    p1_ = s1_;\n    p2_ = s2_;\n    a_ = 0;\n    b_ = 0;\n  }\n\n  static const char* const s1_;\n  static const char* const s2_;\n  static const char* p1_;\n  static const char* p2_;\n\n  static int a_;\n  static int b_;\n};\n\nconst char* const SingleEvaluationTest::s1_ = \"01234\";\nconst char* const SingleEvaluationTest::s2_ = \"abcde\";\nconst char* SingleEvaluationTest::p1_;\nconst char* SingleEvaluationTest::p2_;\nint SingleEvaluationTest::a_;\nint SingleEvaluationTest::b_;\n\n// Tests that when ASSERT_STREQ fails, it evaluates its arguments\n// exactly once.\nTEST_F(SingleEvaluationTest, FailedASSERT_STREQ) {\n  EXPECT_FATAL_FAILURE(SingleEvaluationTest::CompareAndIncrementCharPtrs(),\n                       \"p2_++\");\n  EXPECT_EQ(s1_ + 1, p1_);\n  EXPECT_EQ(s2_ + 1, p2_);\n}\n\n// Tests that string assertion arguments are evaluated exactly once.\nTEST_F(SingleEvaluationTest, ASSERT_STR) {\n  // successful EXPECT_STRNE\n  EXPECT_STRNE(p1_++, p2_++);\n  EXPECT_EQ(s1_ + 1, p1_);\n  EXPECT_EQ(s2_ + 1, p2_);\n\n  // failed EXPECT_STRCASEEQ\n  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ(p1_++, p2_++),\n                          \"Ignoring case\");\n  EXPECT_EQ(s1_ + 2, p1_);\n  EXPECT_EQ(s2_ + 2, p2_);\n}\n\n// Tests that when ASSERT_NE fails, it evaluates its arguments exactly\n// once.\nTEST_F(SingleEvaluationTest, FailedASSERT_NE) {\n  EXPECT_FATAL_FAILURE(SingleEvaluationTest::CompareAndIncrementInts(),\n                       \"(a_++) != (b_++)\");\n  EXPECT_EQ(1, a_);\n  EXPECT_EQ(1, b_);\n}\n\n// Tests that assertion arguments are evaluated exactly once.\nTEST_F(SingleEvaluationTest, OtherCases) {\n  // successful EXPECT_TRUE\n  EXPECT_TRUE(0 == a_++);  // NOLINT\n  EXPECT_EQ(1, a_);\n\n  // failed EXPECT_TRUE\n  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(-1 == a_++), \"-1 == a_++\");\n  EXPECT_EQ(2, a_);\n\n  // successful EXPECT_GT\n  EXPECT_GT(a_++, b_++);\n  EXPECT_EQ(3, a_);\n  EXPECT_EQ(1, b_);\n\n  // failed EXPECT_LT\n  EXPECT_NONFATAL_FAILURE(EXPECT_LT(a_++, b_++), \"(a_++) < (b_++)\");\n  EXPECT_EQ(4, a_);\n  EXPECT_EQ(2, b_);\n\n  // successful ASSERT_TRUE\n  ASSERT_TRUE(0 < a_++);  // NOLINT\n  EXPECT_EQ(5, a_);\n\n  // successful ASSERT_GT\n  ASSERT_GT(a_++, b_++);\n  EXPECT_EQ(6, a_);\n  EXPECT_EQ(3, b_);\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\nvoid ThrowAnInteger() {\n  throw 1;\n}\n\n// Tests that assertion arguments are evaluated exactly once.\nTEST_F(SingleEvaluationTest, ExceptionTests) {\n  // successful EXPECT_THROW\n  EXPECT_THROW({  // NOLINT\n    a_++;\n    ThrowAnInteger();\n  }, int);\n  EXPECT_EQ(1, a_);\n\n  // failed EXPECT_THROW, throws different\n  EXPECT_NONFATAL_FAILURE(EXPECT_THROW({  // NOLINT\n    a_++;\n    ThrowAnInteger();\n  }, bool), \"throws a different type\");\n  EXPECT_EQ(2, a_);\n\n  // failed EXPECT_THROW, throws nothing\n  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(a_++, bool), \"throws nothing\");\n  EXPECT_EQ(3, a_);\n\n  // successful EXPECT_NO_THROW\n  EXPECT_NO_THROW(a_++);\n  EXPECT_EQ(4, a_);\n\n  // failed EXPECT_NO_THROW\n  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW({  // NOLINT\n    a_++;\n    ThrowAnInteger();\n  }), \"it throws\");\n  EXPECT_EQ(5, a_);\n\n  // successful EXPECT_ANY_THROW\n  EXPECT_ANY_THROW({  // NOLINT\n    a_++;\n    ThrowAnInteger();\n  });\n  EXPECT_EQ(6, a_);\n\n  // failed EXPECT_ANY_THROW\n  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(a_++), \"it doesn't\");\n  EXPECT_EQ(7, a_);\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// Tests {ASSERT|EXPECT}_NO_FATAL_FAILURE.\nclass NoFatalFailureTest : public Test {\n protected:\n  void Succeeds() {}\n  void FailsNonFatal() {\n    ADD_FAILURE() << \"some non-fatal failure\";\n  }\n  void Fails() {\n    FAIL() << \"some fatal failure\";\n  }\n\n  void DoAssertNoFatalFailureOnFails() {\n    ASSERT_NO_FATAL_FAILURE(Fails());\n    ADD_FAILURE() << \"should not reach here.\";\n  }\n\n  void DoExpectNoFatalFailureOnFails() {\n    EXPECT_NO_FATAL_FAILURE(Fails());\n    ADD_FAILURE() << \"other failure\";\n  }\n};\n\nTEST_F(NoFatalFailureTest, NoFailure) {\n  EXPECT_NO_FATAL_FAILURE(Succeeds());\n  ASSERT_NO_FATAL_FAILURE(Succeeds());\n}\n\nTEST_F(NoFatalFailureTest, NonFatalIsNoFailure) {\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_NO_FATAL_FAILURE(FailsNonFatal()),\n      \"some non-fatal failure\");\n  EXPECT_NONFATAL_FAILURE(\n      ASSERT_NO_FATAL_FAILURE(FailsNonFatal()),\n      \"some non-fatal failure\");\n}\n\nTEST_F(NoFatalFailureTest, AssertNoFatalFailureOnFatalFailure) {\n  TestPartResultArray gtest_failures;\n  {\n    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);\n    DoAssertNoFatalFailureOnFails();\n  }\n  ASSERT_EQ(2, gtest_failures.size());\n  EXPECT_EQ(TestPartResult::kFatalFailure,\n            gtest_failures.GetTestPartResult(0).type());\n  EXPECT_EQ(TestPartResult::kFatalFailure,\n            gtest_failures.GetTestPartResult(1).type());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"some fatal failure\",\n                      gtest_failures.GetTestPartResult(0).message());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"it does\",\n                      gtest_failures.GetTestPartResult(1).message());\n}\n\nTEST_F(NoFatalFailureTest, ExpectNoFatalFailureOnFatalFailure) {\n  TestPartResultArray gtest_failures;\n  {\n    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);\n    DoExpectNoFatalFailureOnFails();\n  }\n  ASSERT_EQ(3, gtest_failures.size());\n  EXPECT_EQ(TestPartResult::kFatalFailure,\n            gtest_failures.GetTestPartResult(0).type());\n  EXPECT_EQ(TestPartResult::kNonFatalFailure,\n            gtest_failures.GetTestPartResult(1).type());\n  EXPECT_EQ(TestPartResult::kNonFatalFailure,\n            gtest_failures.GetTestPartResult(2).type());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"some fatal failure\",\n                      gtest_failures.GetTestPartResult(0).message());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"it does\",\n                      gtest_failures.GetTestPartResult(1).message());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"other failure\",\n                      gtest_failures.GetTestPartResult(2).message());\n}\n\nTEST_F(NoFatalFailureTest, MessageIsStreamable) {\n  TestPartResultArray gtest_failures;\n  {\n    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);\n    EXPECT_NO_FATAL_FAILURE(FAIL() << \"foo\") << \"my message\";\n  }\n  ASSERT_EQ(2, gtest_failures.size());\n  EXPECT_EQ(TestPartResult::kNonFatalFailure,\n            gtest_failures.GetTestPartResult(0).type());\n  EXPECT_EQ(TestPartResult::kNonFatalFailure,\n            gtest_failures.GetTestPartResult(1).type());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"foo\",\n                      gtest_failures.GetTestPartResult(0).message());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"my message\",\n                      gtest_failures.GetTestPartResult(1).message());\n}\n\n// Tests non-string assertions.\n\nstd::string EditsToString(const std::vector<EditType>& edits) {\n  std::string out;\n  for (size_t i = 0; i < edits.size(); ++i) {\n    static const char kEdits[] = \" +-/\";\n    out.append(1, kEdits[edits[i]]);\n  }\n  return out;\n}\n\nstd::vector<size_t> CharsToIndices(const std::string& str) {\n  std::vector<size_t> out;\n  for (size_t i = 0; i < str.size(); ++i) {\n    out.push_back(str[i]);\n  }\n  return out;\n}\n\nstd::vector<std::string> CharsToLines(const std::string& str) {\n  std::vector<std::string> out;\n  for (size_t i = 0; i < str.size(); ++i) {\n    out.push_back(str.substr(i, 1));\n  }\n  return out;\n}\n\nTEST(EditDistance, TestCases) {\n  struct Case {\n    int line;\n    const char* left;\n    const char* right;\n    const char* expected_edits;\n    const char* expected_diff;\n  };\n  static const Case kCases[] = {\n      // No change.\n      {__LINE__, \"A\", \"A\", \" \", \"\"},\n      {__LINE__, \"ABCDE\", \"ABCDE\", \"     \", \"\"},\n      // Simple adds.\n      {__LINE__, \"X\", \"XA\", \" +\", \"@@ +1,2 @@\\n X\\n+A\\n\"},\n      {__LINE__, \"X\", \"XABCD\", \" ++++\", \"@@ +1,5 @@\\n X\\n+A\\n+B\\n+C\\n+D\\n\"},\n      // Simple removes.\n      {__LINE__, \"XA\", \"X\", \" -\", \"@@ -1,2 @@\\n X\\n-A\\n\"},\n      {__LINE__, \"XABCD\", \"X\", \" ----\", \"@@ -1,5 @@\\n X\\n-A\\n-B\\n-C\\n-D\\n\"},\n      // Simple replaces.\n      {__LINE__, \"A\", \"a\", \"/\", \"@@ -1,1 +1,1 @@\\n-A\\n+a\\n\"},\n      {__LINE__, \"ABCD\", \"abcd\", \"////\",\n       \"@@ -1,4 +1,4 @@\\n-A\\n-B\\n-C\\n-D\\n+a\\n+b\\n+c\\n+d\\n\"},\n      // Path finding.\n      {__LINE__, \"ABCDEFGH\", \"ABXEGH1\", \"  -/ -  +\",\n       \"@@ -1,8 +1,7 @@\\n A\\n B\\n-C\\n-D\\n+X\\n E\\n-F\\n G\\n H\\n+1\\n\"},\n      {__LINE__, \"AAAABCCCC\", \"ABABCDCDC\", \"- /   + / \",\n       \"@@ -1,9 +1,9 @@\\n-A\\n A\\n-A\\n+B\\n A\\n B\\n C\\n+D\\n C\\n-C\\n+D\\n C\\n\"},\n      {__LINE__, \"ABCDE\", \"BCDCD\", \"-   +/\",\n       \"@@ -1,5 +1,5 @@\\n-A\\n B\\n C\\n D\\n-E\\n+C\\n+D\\n\"},\n      {__LINE__, \"ABCDEFGHIJKL\", \"BCDCDEFGJKLJK\", \"- ++     --   ++\",\n       \"@@ -1,4 +1,5 @@\\n-A\\n B\\n+C\\n+D\\n C\\n D\\n\"\n       \"@@ -6,7 +7,7 @@\\n F\\n G\\n-H\\n-I\\n J\\n K\\n L\\n+J\\n+K\\n\"},\n      {}};\n  for (const Case* c = kCases; c->left; ++c) {\n    EXPECT_TRUE(c->expected_edits ==\n                EditsToString(CalculateOptimalEdits(CharsToIndices(c->left),\n                                                    CharsToIndices(c->right))))\n        << \"Left <\" << c->left << \"> Right <\" << c->right << \"> Edits <\"\n        << EditsToString(CalculateOptimalEdits(\n               CharsToIndices(c->left), CharsToIndices(c->right))) << \">\";\n    EXPECT_TRUE(c->expected_diff == CreateUnifiedDiff(CharsToLines(c->left),\n                                                      CharsToLines(c->right)))\n        << \"Left <\" << c->left << \"> Right <\" << c->right << \"> Diff <\"\n        << CreateUnifiedDiff(CharsToLines(c->left), CharsToLines(c->right))\n        << \">\";\n  }\n}\n\n// Tests EqFailure(), used for implementing *EQ* assertions.\nTEST(AssertionTest, EqFailure) {\n  const std::string foo_val(\"5\"), bar_val(\"6\");\n  const std::string msg1(\n      EqFailure(\"foo\", \"bar\", foo_val, bar_val, false)\n      .failure_message());\n  EXPECT_STREQ(\n      \"Expected equality of these values:\\n\"\n      \"  foo\\n\"\n      \"    Which is: 5\\n\"\n      \"  bar\\n\"\n      \"    Which is: 6\",\n      msg1.c_str());\n\n  const std::string msg2(\n      EqFailure(\"foo\", \"6\", foo_val, bar_val, false)\n      .failure_message());\n  EXPECT_STREQ(\n      \"Expected equality of these values:\\n\"\n      \"  foo\\n\"\n      \"    Which is: 5\\n\"\n      \"  6\",\n      msg2.c_str());\n\n  const std::string msg3(\n      EqFailure(\"5\", \"bar\", foo_val, bar_val, false)\n      .failure_message());\n  EXPECT_STREQ(\n      \"Expected equality of these values:\\n\"\n      \"  5\\n\"\n      \"  bar\\n\"\n      \"    Which is: 6\",\n      msg3.c_str());\n\n  const std::string msg4(\n      EqFailure(\"5\", \"6\", foo_val, bar_val, false).failure_message());\n  EXPECT_STREQ(\n      \"Expected equality of these values:\\n\"\n      \"  5\\n\"\n      \"  6\",\n      msg4.c_str());\n\n  const std::string msg5(\n      EqFailure(\"foo\", \"bar\",\n                std::string(\"\\\"x\\\"\"), std::string(\"\\\"y\\\"\"),\n                true).failure_message());\n  EXPECT_STREQ(\n      \"Expected equality of these values:\\n\"\n      \"  foo\\n\"\n      \"    Which is: \\\"x\\\"\\n\"\n      \"  bar\\n\"\n      \"    Which is: \\\"y\\\"\\n\"\n      \"Ignoring case\",\n      msg5.c_str());\n}\n\nTEST(AssertionTest, EqFailureWithDiff) {\n  const std::string left(\n      \"1\\\\n2XXX\\\\n3\\\\n5\\\\n6\\\\n7\\\\n8\\\\n9\\\\n10\\\\n11\\\\n12XXX\\\\n13\\\\n14\\\\n15\");\n  const std::string right(\n      \"1\\\\n2\\\\n3\\\\n4\\\\n5\\\\n6\\\\n7\\\\n8\\\\n9\\\\n11\\\\n12\\\\n13\\\\n14\");\n  const std::string msg1(\n      EqFailure(\"left\", \"right\", left, right, false).failure_message());\n  EXPECT_STREQ(\n      \"Expected equality of these values:\\n\"\n      \"  left\\n\"\n      \"    Which is: \"\n      \"1\\\\n2XXX\\\\n3\\\\n5\\\\n6\\\\n7\\\\n8\\\\n9\\\\n10\\\\n11\\\\n12XXX\\\\n13\\\\n14\\\\n15\\n\"\n      \"  right\\n\"\n      \"    Which is: 1\\\\n2\\\\n3\\\\n4\\\\n5\\\\n6\\\\n7\\\\n8\\\\n9\\\\n11\\\\n12\\\\n13\\\\n14\\n\"\n      \"With diff:\\n@@ -1,5 +1,6 @@\\n 1\\n-2XXX\\n+2\\n 3\\n+4\\n 5\\n 6\\n\"\n      \"@@ -7,8 +8,6 @@\\n 8\\n 9\\n-10\\n 11\\n-12XXX\\n+12\\n 13\\n 14\\n-15\\n\",\n      msg1.c_str());\n}\n\n// Tests AppendUserMessage(), used for implementing the *EQ* macros.\nTEST(AssertionTest, AppendUserMessage) {\n  const std::string foo(\"foo\");\n\n  Message msg;\n  EXPECT_STREQ(\"foo\",\n               AppendUserMessage(foo, msg).c_str());\n\n  msg << \"bar\";\n  EXPECT_STREQ(\"foo\\nbar\",\n               AppendUserMessage(foo, msg).c_str());\n}\n\n#ifdef __BORLANDC__\n// Silences warnings: \"Condition is always true\", \"Unreachable code\"\n# pragma option push -w-ccc -w-rch\n#endif\n\n// Tests ASSERT_TRUE.\nTEST(AssertionTest, ASSERT_TRUE) {\n  ASSERT_TRUE(2 > 1);  // NOLINT\n  EXPECT_FATAL_FAILURE(ASSERT_TRUE(2 < 1),\n                       \"2 < 1\");\n}\n\n// Tests ASSERT_TRUE(predicate) for predicates returning AssertionResult.\nTEST(AssertionTest, AssertTrueWithAssertionResult) {\n  ASSERT_TRUE(ResultIsEven(2));\n#ifndef __BORLANDC__\n  // ICE's in C++Builder.\n  EXPECT_FATAL_FAILURE(ASSERT_TRUE(ResultIsEven(3)),\n                       \"Value of: ResultIsEven(3)\\n\"\n                       \"  Actual: false (3 is odd)\\n\"\n                       \"Expected: true\");\n#endif\n  ASSERT_TRUE(ResultIsEvenNoExplanation(2));\n  EXPECT_FATAL_FAILURE(ASSERT_TRUE(ResultIsEvenNoExplanation(3)),\n                       \"Value of: ResultIsEvenNoExplanation(3)\\n\"\n                       \"  Actual: false (3 is odd)\\n\"\n                       \"Expected: true\");\n}\n\n// Tests ASSERT_FALSE.\nTEST(AssertionTest, ASSERT_FALSE) {\n  ASSERT_FALSE(2 < 1);  // NOLINT\n  EXPECT_FATAL_FAILURE(ASSERT_FALSE(2 > 1),\n                       \"Value of: 2 > 1\\n\"\n                       \"  Actual: true\\n\"\n                       \"Expected: false\");\n}\n\n// Tests ASSERT_FALSE(predicate) for predicates returning AssertionResult.\nTEST(AssertionTest, AssertFalseWithAssertionResult) {\n  ASSERT_FALSE(ResultIsEven(3));\n#ifndef __BORLANDC__\n  // ICE's in C++Builder.\n  EXPECT_FATAL_FAILURE(ASSERT_FALSE(ResultIsEven(2)),\n                       \"Value of: ResultIsEven(2)\\n\"\n                       \"  Actual: true (2 is even)\\n\"\n                       \"Expected: false\");\n#endif\n  ASSERT_FALSE(ResultIsEvenNoExplanation(3));\n  EXPECT_FATAL_FAILURE(ASSERT_FALSE(ResultIsEvenNoExplanation(2)),\n                       \"Value of: ResultIsEvenNoExplanation(2)\\n\"\n                       \"  Actual: true\\n\"\n                       \"Expected: false\");\n}\n\n#ifdef __BORLANDC__\n// Restores warnings after previous \"#pragma option push\" suppressed them\n# pragma option pop\n#endif\n\n// Tests using ASSERT_EQ on double values.  The purpose is to make\n// sure that the specialization we did for integer and anonymous enums\n// isn't used for double arguments.\nTEST(ExpectTest, ASSERT_EQ_Double) {\n  // A success.\n  ASSERT_EQ(5.6, 5.6);\n\n  // A failure.\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(5.1, 5.2),\n                       \"5.1\");\n}\n\n// Tests ASSERT_EQ.\nTEST(AssertionTest, ASSERT_EQ) {\n  ASSERT_EQ(5, 2 + 3);\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(5, 2*3),\n                       \"Expected equality of these values:\\n\"\n                       \"  5\\n\"\n                       \"  2*3\\n\"\n                       \"    Which is: 6\");\n}\n\n// Tests ASSERT_EQ(NULL, pointer).\n#if GTEST_CAN_COMPARE_NULL\nTEST(AssertionTest, ASSERT_EQ_NULL) {\n  // A success.\n  const char* p = NULL;\n  // Some older GCC versions may issue a spurious warning in this or the next\n  // assertion statement. This warning should not be suppressed with\n  // static_cast since the test verifies the ability to use bare NULL as the\n  // expected parameter to the macro.\n  ASSERT_EQ(NULL, p);\n\n  // A failure.\n  static int n = 0;\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(NULL, &n),\n                       \"  &n\\n    Which is:\");\n}\n#endif  // GTEST_CAN_COMPARE_NULL\n\n// Tests ASSERT_EQ(0, non_pointer).  Since the literal 0 can be\n// treated as a null pointer by the compiler, we need to make sure\n// that ASSERT_EQ(0, non_pointer) isn't interpreted by Google Test as\n// ASSERT_EQ(static_cast<void*>(NULL), non_pointer).\nTEST(ExpectTest, ASSERT_EQ_0) {\n  int n = 0;\n\n  // A success.\n  ASSERT_EQ(0, n);\n\n  // A failure.\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(0, 5.6),\n                       \"  0\\n  5.6\");\n}\n\n// Tests ASSERT_NE.\nTEST(AssertionTest, ASSERT_NE) {\n  ASSERT_NE(6, 7);\n  EXPECT_FATAL_FAILURE(ASSERT_NE('a', 'a'),\n                       \"Expected: ('a') != ('a'), \"\n                       \"actual: 'a' (97, 0x61) vs 'a' (97, 0x61)\");\n}\n\n// Tests ASSERT_LE.\nTEST(AssertionTest, ASSERT_LE) {\n  ASSERT_LE(2, 3);\n  ASSERT_LE(2, 2);\n  EXPECT_FATAL_FAILURE(ASSERT_LE(2, 0),\n                       \"Expected: (2) <= (0), actual: 2 vs 0\");\n}\n\n// Tests ASSERT_LT.\nTEST(AssertionTest, ASSERT_LT) {\n  ASSERT_LT(2, 3);\n  EXPECT_FATAL_FAILURE(ASSERT_LT(2, 2),\n                       \"Expected: (2) < (2), actual: 2 vs 2\");\n}\n\n// Tests ASSERT_GE.\nTEST(AssertionTest, ASSERT_GE) {\n  ASSERT_GE(2, 1);\n  ASSERT_GE(2, 2);\n  EXPECT_FATAL_FAILURE(ASSERT_GE(2, 3),\n                       \"Expected: (2) >= (3), actual: 2 vs 3\");\n}\n\n// Tests ASSERT_GT.\nTEST(AssertionTest, ASSERT_GT) {\n  ASSERT_GT(2, 1);\n  EXPECT_FATAL_FAILURE(ASSERT_GT(2, 2),\n                       \"Expected: (2) > (2), actual: 2 vs 2\");\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\nvoid ThrowNothing() {}\n\n// Tests ASSERT_THROW.\nTEST(AssertionTest, ASSERT_THROW) {\n  ASSERT_THROW(ThrowAnInteger(), int);\n\n# ifndef __BORLANDC__\n\n  // ICE's in C++Builder 2007 and 2009.\n  EXPECT_FATAL_FAILURE(\n      ASSERT_THROW(ThrowAnInteger(), bool),\n      \"Expected: ThrowAnInteger() throws an exception of type bool.\\n\"\n      \"  Actual: it throws a different type.\");\n# endif\n\n  EXPECT_FATAL_FAILURE(\n      ASSERT_THROW(ThrowNothing(), bool),\n      \"Expected: ThrowNothing() throws an exception of type bool.\\n\"\n      \"  Actual: it throws nothing.\");\n}\n\n// Tests ASSERT_NO_THROW.\nTEST(AssertionTest, ASSERT_NO_THROW) {\n  ASSERT_NO_THROW(ThrowNothing());\n  EXPECT_FATAL_FAILURE(ASSERT_NO_THROW(ThrowAnInteger()),\n                       \"Expected: ThrowAnInteger() doesn't throw an exception.\"\n                       \"\\n  Actual: it throws.\");\n}\n\n// Tests ASSERT_ANY_THROW.\nTEST(AssertionTest, ASSERT_ANY_THROW) {\n  ASSERT_ANY_THROW(ThrowAnInteger());\n  EXPECT_FATAL_FAILURE(\n      ASSERT_ANY_THROW(ThrowNothing()),\n      \"Expected: ThrowNothing() throws an exception.\\n\"\n      \"  Actual: it doesn't.\");\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// Makes sure we deal with the precedence of <<.  This test should\n// compile.\nTEST(AssertionTest, AssertPrecedence) {\n  ASSERT_EQ(1 < 2, true);\n  bool false_value = false;\n  ASSERT_EQ(true && false_value, false);\n}\n\n// A subroutine used by the following test.\nvoid TestEq1(int x) {\n  ASSERT_EQ(1, x);\n}\n\n// Tests calling a test subroutine that's not part of a fixture.\nTEST(AssertionTest, NonFixtureSubroutine) {\n  EXPECT_FATAL_FAILURE(TestEq1(2),\n                       \"  x\\n    Which is: 2\");\n}\n\n// An uncopyable class.\nclass Uncopyable {\n public:\n  explicit Uncopyable(int a_value) : value_(a_value) {}\n\n  int value() const { return value_; }\n  bool operator==(const Uncopyable& rhs) const {\n    return value() == rhs.value();\n  }\n private:\n  // This constructor deliberately has no implementation, as we don't\n  // want this class to be copyable.\n  Uncopyable(const Uncopyable&);  // NOLINT\n\n  int value_;\n};\n\n::std::ostream& operator<<(::std::ostream& os, const Uncopyable& value) {\n  return os << value.value();\n}\n\n\nbool IsPositiveUncopyable(const Uncopyable& x) {\n  return x.value() > 0;\n}\n\n// A subroutine used by the following test.\nvoid TestAssertNonPositive() {\n  Uncopyable y(-1);\n  ASSERT_PRED1(IsPositiveUncopyable, y);\n}\n// A subroutine used by the following test.\nvoid TestAssertEqualsUncopyable() {\n  Uncopyable x(5);\n  Uncopyable y(-1);\n  ASSERT_EQ(x, y);\n}\n\n// Tests that uncopyable objects can be used in assertions.\nTEST(AssertionTest, AssertWorksWithUncopyableObject) {\n  Uncopyable x(5);\n  ASSERT_PRED1(IsPositiveUncopyable, x);\n  ASSERT_EQ(x, x);\n  EXPECT_FATAL_FAILURE(TestAssertNonPositive(),\n    \"IsPositiveUncopyable(y) evaluates to false, where\\ny evaluates to -1\");\n  EXPECT_FATAL_FAILURE(TestAssertEqualsUncopyable(),\n                       \"Expected equality of these values:\\n\"\n                       \"  x\\n    Which is: 5\\n  y\\n    Which is: -1\");\n}\n\n// Tests that uncopyable objects can be used in expects.\nTEST(AssertionTest, ExpectWorksWithUncopyableObject) {\n  Uncopyable x(5);\n  EXPECT_PRED1(IsPositiveUncopyable, x);\n  Uncopyable y(-1);\n  EXPECT_NONFATAL_FAILURE(EXPECT_PRED1(IsPositiveUncopyable, y),\n    \"IsPositiveUncopyable(y) evaluates to false, where\\ny evaluates to -1\");\n  EXPECT_EQ(x, x);\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y),\n                          \"Expected equality of these values:\\n\"\n                          \"  x\\n    Which is: 5\\n  y\\n    Which is: -1\");\n}\n\nenum NamedEnum {\n  kE1 = 0,\n  kE2 = 1\n};\n\nTEST(AssertionTest, NamedEnum) {\n  EXPECT_EQ(kE1, kE1);\n  EXPECT_LT(kE1, kE2);\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(kE1, kE2), \"Which is: 0\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(kE1, kE2), \"Which is: 1\");\n}\n\n// The version of gcc used in XCode 2.2 has a bug and doesn't allow\n// anonymous enums in assertions.  Therefore the following test is not\n// done on Mac.\n// Sun Studio and HP aCC also reject this code.\n#if !GTEST_OS_MAC && !defined(__SUNPRO_CC) && !defined(__HP_aCC)\n\n// Tests using assertions with anonymous enums.\nenum {\n  kCaseA = -1,\n\n# if GTEST_OS_LINUX\n\n  // We want to test the case where the size of the anonymous enum is\n  // larger than sizeof(int), to make sure our implementation of the\n  // assertions doesn't truncate the enums.  However, MSVC\n  // (incorrectly) doesn't allow an enum value to exceed the range of\n  // an int, so this has to be conditionally compiled.\n  //\n  // On Linux, kCaseB and kCaseA have the same value when truncated to\n  // int size.  We want to test whether this will confuse the\n  // assertions.\n  kCaseB = testing::internal::kMaxBiggestInt,\n\n# else\n\n  kCaseB = INT_MAX,\n\n# endif  // GTEST_OS_LINUX\n\n  kCaseC = 42\n};\n\nTEST(AssertionTest, AnonymousEnum) {\n# if GTEST_OS_LINUX\n\n  EXPECT_EQ(static_cast<int>(kCaseA), static_cast<int>(kCaseB));\n\n# endif  // GTEST_OS_LINUX\n\n  EXPECT_EQ(kCaseA, kCaseA);\n  EXPECT_NE(kCaseA, kCaseB);\n  EXPECT_LT(kCaseA, kCaseB);\n  EXPECT_LE(kCaseA, kCaseB);\n  EXPECT_GT(kCaseB, kCaseA);\n  EXPECT_GE(kCaseA, kCaseA);\n  EXPECT_NONFATAL_FAILURE(EXPECT_GE(kCaseA, kCaseB),\n                          \"(kCaseA) >= (kCaseB)\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_GE(kCaseA, kCaseC),\n                          \"-1 vs 42\");\n\n  ASSERT_EQ(kCaseA, kCaseA);\n  ASSERT_NE(kCaseA, kCaseB);\n  ASSERT_LT(kCaseA, kCaseB);\n  ASSERT_LE(kCaseA, kCaseB);\n  ASSERT_GT(kCaseB, kCaseA);\n  ASSERT_GE(kCaseA, kCaseA);\n\n# ifndef __BORLANDC__\n\n  // ICE's in C++Builder.\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseB),\n                       \"  kCaseB\\n    Which is: \");\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseC),\n                       \"\\n    Which is: 42\");\n# endif\n\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseC),\n                       \"\\n    Which is: -1\");\n}\n\n#endif  // !GTEST_OS_MAC && !defined(__SUNPRO_CC)\n\n#if GTEST_OS_WINDOWS\n\nstatic HRESULT UnexpectedHRESULTFailure() {\n  return E_UNEXPECTED;\n}\n\nstatic HRESULT OkHRESULTSuccess() {\n  return S_OK;\n}\n\nstatic HRESULT FalseHRESULTSuccess() {\n  return S_FALSE;\n}\n\n// HRESULT assertion tests test both zero and non-zero\n// success codes as well as failure message for each.\n//\n// Windows CE doesn't support message texts.\nTEST(HRESULTAssertionTest, EXPECT_HRESULT_SUCCEEDED) {\n  EXPECT_HRESULT_SUCCEEDED(S_OK);\n  EXPECT_HRESULT_SUCCEEDED(S_FALSE);\n\n  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()),\n    \"Expected: (UnexpectedHRESULTFailure()) succeeds.\\n\"\n    \"  Actual: 0x8000FFFF\");\n}\n\nTEST(HRESULTAssertionTest, ASSERT_HRESULT_SUCCEEDED) {\n  ASSERT_HRESULT_SUCCEEDED(S_OK);\n  ASSERT_HRESULT_SUCCEEDED(S_FALSE);\n\n  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()),\n    \"Expected: (UnexpectedHRESULTFailure()) succeeds.\\n\"\n    \"  Actual: 0x8000FFFF\");\n}\n\nTEST(HRESULTAssertionTest, EXPECT_HRESULT_FAILED) {\n  EXPECT_HRESULT_FAILED(E_UNEXPECTED);\n\n  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(OkHRESULTSuccess()),\n    \"Expected: (OkHRESULTSuccess()) fails.\\n\"\n    \"  Actual: 0x0\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(FalseHRESULTSuccess()),\n    \"Expected: (FalseHRESULTSuccess()) fails.\\n\"\n    \"  Actual: 0x1\");\n}\n\nTEST(HRESULTAssertionTest, ASSERT_HRESULT_FAILED) {\n  ASSERT_HRESULT_FAILED(E_UNEXPECTED);\n\n# ifndef __BORLANDC__\n\n  // ICE's in C++Builder 2007 and 2009.\n  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(OkHRESULTSuccess()),\n    \"Expected: (OkHRESULTSuccess()) fails.\\n\"\n    \"  Actual: 0x0\");\n# endif\n\n  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(FalseHRESULTSuccess()),\n    \"Expected: (FalseHRESULTSuccess()) fails.\\n\"\n    \"  Actual: 0x1\");\n}\n\n// Tests that streaming to the HRESULT macros works.\nTEST(HRESULTAssertionTest, Streaming) {\n  EXPECT_HRESULT_SUCCEEDED(S_OK) << \"unexpected failure\";\n  ASSERT_HRESULT_SUCCEEDED(S_OK) << \"unexpected failure\";\n  EXPECT_HRESULT_FAILED(E_UNEXPECTED) << \"unexpected failure\";\n  ASSERT_HRESULT_FAILED(E_UNEXPECTED) << \"unexpected failure\";\n\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_HRESULT_SUCCEEDED(E_UNEXPECTED) << \"expected failure\",\n      \"expected failure\");\n\n# ifndef __BORLANDC__\n\n  // ICE's in C++Builder 2007 and 2009.\n  EXPECT_FATAL_FAILURE(\n      ASSERT_HRESULT_SUCCEEDED(E_UNEXPECTED) << \"expected failure\",\n      \"expected failure\");\n# endif\n\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_HRESULT_FAILED(S_OK) << \"expected failure\",\n      \"expected failure\");\n\n  EXPECT_FATAL_FAILURE(\n      ASSERT_HRESULT_FAILED(S_OK) << \"expected failure\",\n      \"expected failure\");\n}\n\n#endif  // GTEST_OS_WINDOWS\n\n#ifdef __BORLANDC__\n// Silences warnings: \"Condition is always true\", \"Unreachable code\"\n# pragma option push -w-ccc -w-rch\n#endif\n\n// Tests that the assertion macros behave like single statements.\nTEST(AssertionSyntaxTest, BasicAssertionsBehavesLikeSingleStatement) {\n  if (AlwaysFalse())\n    ASSERT_TRUE(false) << \"This should never be executed; \"\n                          \"It's a compilation test only.\";\n\n  if (AlwaysTrue())\n    EXPECT_FALSE(false);\n  else\n    ;  // NOLINT\n\n  if (AlwaysFalse())\n    ASSERT_LT(1, 3);\n\n  if (AlwaysFalse())\n    ;  // NOLINT\n  else\n    EXPECT_GT(3, 2) << \"\";\n}\n\n#if GTEST_HAS_EXCEPTIONS\n// Tests that the compiler will not complain about unreachable code in the\n// EXPECT_THROW/EXPECT_ANY_THROW/EXPECT_NO_THROW macros.\nTEST(ExpectThrowTest, DoesNotGenerateUnreachableCodeWarning) {\n  int n = 0;\n\n  EXPECT_THROW(throw 1, int);\n  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(n++, int), \"\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(throw 1, const char*), \"\");\n  EXPECT_NO_THROW(n++);\n  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(throw 1), \"\");\n  EXPECT_ANY_THROW(throw 1);\n  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(n++), \"\");\n}\n\nTEST(AssertionSyntaxTest, ExceptionAssertionsBehavesLikeSingleStatement) {\n  if (AlwaysFalse())\n    EXPECT_THROW(ThrowNothing(), bool);\n\n  if (AlwaysTrue())\n    EXPECT_THROW(ThrowAnInteger(), int);\n  else\n    ;  // NOLINT\n\n  if (AlwaysFalse())\n    EXPECT_NO_THROW(ThrowAnInteger());\n\n  if (AlwaysTrue())\n    EXPECT_NO_THROW(ThrowNothing());\n  else\n    ;  // NOLINT\n\n  if (AlwaysFalse())\n    EXPECT_ANY_THROW(ThrowNothing());\n\n  if (AlwaysTrue())\n    EXPECT_ANY_THROW(ThrowAnInteger());\n  else\n    ;  // NOLINT\n}\n#endif  // GTEST_HAS_EXCEPTIONS\n\nTEST(AssertionSyntaxTest, NoFatalFailureAssertionsBehavesLikeSingleStatement) {\n  if (AlwaysFalse())\n    EXPECT_NO_FATAL_FAILURE(FAIL()) << \"This should never be executed. \"\n                                    << \"It's a compilation test only.\";\n  else\n    ;  // NOLINT\n\n  if (AlwaysFalse())\n    ASSERT_NO_FATAL_FAILURE(FAIL()) << \"\";\n  else\n    ;  // NOLINT\n\n  if (AlwaysTrue())\n    EXPECT_NO_FATAL_FAILURE(SUCCEED());\n  else\n    ;  // NOLINT\n\n  if (AlwaysFalse())\n    ;  // NOLINT\n  else\n    ASSERT_NO_FATAL_FAILURE(SUCCEED());\n}\n\n// Tests that the assertion macros work well with switch statements.\nTEST(AssertionSyntaxTest, WorksWithSwitch) {\n  switch (0) {\n    case 1:\n      break;\n    default:\n      ASSERT_TRUE(true);\n  }\n\n  switch (0)\n    case 0:\n      EXPECT_FALSE(false) << \"EXPECT_FALSE failed in switch case\";\n\n  // Binary assertions are implemented using a different code path\n  // than the Boolean assertions.  Hence we test them separately.\n  switch (0) {\n    case 1:\n    default:\n      ASSERT_EQ(1, 1) << \"ASSERT_EQ failed in default switch handler\";\n  }\n\n  switch (0)\n    case 0:\n      EXPECT_NE(1, 2);\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\nvoid ThrowAString() {\n    throw \"std::string\";\n}\n\n// Test that the exception assertion macros compile and work with const\n// type qualifier.\nTEST(AssertionSyntaxTest, WorksWithConst) {\n    ASSERT_THROW(ThrowAString(), const char*);\n\n    EXPECT_THROW(ThrowAString(), const char*);\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n}  // namespace\n\nnamespace testing {\n\n// Tests that Google Test tracks SUCCEED*.\nTEST(SuccessfulAssertionTest, SUCCEED) {\n  SUCCEED();\n  SUCCEED() << \"OK\";\n  EXPECT_EQ(2, GetUnitTestImpl()->current_test_result()->total_part_count());\n}\n\n// Tests that Google Test doesn't track successful EXPECT_*.\nTEST(SuccessfulAssertionTest, EXPECT) {\n  EXPECT_TRUE(true);\n  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());\n}\n\n// Tests that Google Test doesn't track successful EXPECT_STR*.\nTEST(SuccessfulAssertionTest, EXPECT_STR) {\n  EXPECT_STREQ(\"\", \"\");\n  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());\n}\n\n// Tests that Google Test doesn't track successful ASSERT_*.\nTEST(SuccessfulAssertionTest, ASSERT) {\n  ASSERT_TRUE(true);\n  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());\n}\n\n// Tests that Google Test doesn't track successful ASSERT_STR*.\nTEST(SuccessfulAssertionTest, ASSERT_STR) {\n  ASSERT_STREQ(\"\", \"\");\n  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());\n}\n\n}  // namespace testing\n\nnamespace {\n\n// Tests the message streaming variation of assertions.\n\nTEST(AssertionWithMessageTest, EXPECT) {\n  EXPECT_EQ(1, 1) << \"This should succeed.\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_NE(1, 1) << \"Expected failure #1.\",\n                          \"Expected failure #1\");\n  EXPECT_LE(1, 2) << \"This should succeed.\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_LT(1, 0) << \"Expected failure #2.\",\n                          \"Expected failure #2.\");\n  EXPECT_GE(1, 0) << \"This should succeed.\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_GT(1, 2) << \"Expected failure #3.\",\n                          \"Expected failure #3.\");\n\n  EXPECT_STREQ(\"1\", \"1\") << \"This should succeed.\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(\"1\", \"1\") << \"Expected failure #4.\",\n                          \"Expected failure #4.\");\n  EXPECT_STRCASEEQ(\"a\", \"A\") << \"This should succeed.\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASENE(\"a\", \"A\") << \"Expected failure #5.\",\n                          \"Expected failure #5.\");\n\n  EXPECT_FLOAT_EQ(1, 1) << \"This should succeed.\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1, 1.2) << \"Expected failure #6.\",\n                          \"Expected failure #6.\");\n  EXPECT_NEAR(1, 1.1, 0.2) << \"This should succeed.\";\n}\n\nTEST(AssertionWithMessageTest, ASSERT) {\n  ASSERT_EQ(1, 1) << \"This should succeed.\";\n  ASSERT_NE(1, 2) << \"This should succeed.\";\n  ASSERT_LE(1, 2) << \"This should succeed.\";\n  ASSERT_LT(1, 2) << \"This should succeed.\";\n  ASSERT_GE(1, 0) << \"This should succeed.\";\n  EXPECT_FATAL_FAILURE(ASSERT_GT(1, 2) << \"Expected failure.\",\n                       \"Expected failure.\");\n}\n\nTEST(AssertionWithMessageTest, ASSERT_STR) {\n  ASSERT_STREQ(\"1\", \"1\") << \"This should succeed.\";\n  ASSERT_STRNE(\"1\", \"2\") << \"This should succeed.\";\n  ASSERT_STRCASEEQ(\"a\", \"A\") << \"This should succeed.\";\n  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE(\"a\", \"A\") << \"Expected failure.\",\n                       \"Expected failure.\");\n}\n\nTEST(AssertionWithMessageTest, ASSERT_FLOATING) {\n  ASSERT_FLOAT_EQ(1, 1) << \"This should succeed.\";\n  ASSERT_DOUBLE_EQ(1, 1) << \"This should succeed.\";\n  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1,1.2, 0.1) << \"Expect failure.\",  // NOLINT\n                       \"Expect failure.\");\n  // To work around a bug in gcc 2.95.0, there is intentionally no\n  // space after the first comma in the previous statement.\n}\n\n// Tests using ASSERT_FALSE with a streamed message.\nTEST(AssertionWithMessageTest, ASSERT_FALSE) {\n  ASSERT_FALSE(false) << \"This shouldn't fail.\";\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_FALSE(true) << \"Expected failure: \" << 2 << \" > \" << 1\n                       << \" evaluates to \" << true;\n  }, \"Expected failure\");\n}\n\n// Tests using FAIL with a streamed message.\nTEST(AssertionWithMessageTest, FAIL) {\n  EXPECT_FATAL_FAILURE(FAIL() << 0,\n                       \"0\");\n}\n\n// Tests using SUCCEED with a streamed message.\nTEST(AssertionWithMessageTest, SUCCEED) {\n  SUCCEED() << \"Success == \" << 1;\n}\n\n// Tests using ASSERT_TRUE with a streamed message.\nTEST(AssertionWithMessageTest, ASSERT_TRUE) {\n  ASSERT_TRUE(true) << \"This should succeed.\";\n  ASSERT_TRUE(true) << true;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_TRUE(false) << static_cast<const char *>(NULL)\n                       << static_cast<char *>(NULL);\n  }, \"(null)(null)\");\n}\n\n#if GTEST_OS_WINDOWS\n// Tests using wide strings in assertion messages.\nTEST(AssertionWithMessageTest, WideStringMessage) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_TRUE(false) << L\"This failure is expected.\\x8119\";\n  }, \"This failure is expected.\");\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_EQ(1, 2) << \"This failure is \"\n                    << L\"expected too.\\x8120\";\n  }, \"This failure is expected too.\");\n}\n#endif  // GTEST_OS_WINDOWS\n\n// Tests EXPECT_TRUE.\nTEST(ExpectTest, EXPECT_TRUE) {\n  EXPECT_TRUE(true) << \"Intentional success\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << \"Intentional failure #1.\",\n                          \"Intentional failure #1.\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << \"Intentional failure #2.\",\n                          \"Intentional failure #2.\");\n  EXPECT_TRUE(2 > 1);  // NOLINT\n  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 < 1),\n                          \"Value of: 2 < 1\\n\"\n                          \"  Actual: false\\n\"\n                          \"Expected: true\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 > 3),\n                          \"2 > 3\");\n}\n\n// Tests EXPECT_TRUE(predicate) for predicates returning AssertionResult.\nTEST(ExpectTest, ExpectTrueWithAssertionResult) {\n  EXPECT_TRUE(ResultIsEven(2));\n  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(ResultIsEven(3)),\n                          \"Value of: ResultIsEven(3)\\n\"\n                          \"  Actual: false (3 is odd)\\n\"\n                          \"Expected: true\");\n  EXPECT_TRUE(ResultIsEvenNoExplanation(2));\n  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(ResultIsEvenNoExplanation(3)),\n                          \"Value of: ResultIsEvenNoExplanation(3)\\n\"\n                          \"  Actual: false (3 is odd)\\n\"\n                          \"Expected: true\");\n}\n\n// Tests EXPECT_FALSE with a streamed message.\nTEST(ExpectTest, EXPECT_FALSE) {\n  EXPECT_FALSE(2 < 1);  // NOLINT\n  EXPECT_FALSE(false) << \"Intentional success\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << \"Intentional failure #1.\",\n                          \"Intentional failure #1.\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << \"Intentional failure #2.\",\n                          \"Intentional failure #2.\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 > 1),\n                          \"Value of: 2 > 1\\n\"\n                          \"  Actual: true\\n\"\n                          \"Expected: false\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 < 3),\n                          \"2 < 3\");\n}\n\n// Tests EXPECT_FALSE(predicate) for predicates returning AssertionResult.\nTEST(ExpectTest, ExpectFalseWithAssertionResult) {\n  EXPECT_FALSE(ResultIsEven(3));\n  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(ResultIsEven(2)),\n                          \"Value of: ResultIsEven(2)\\n\"\n                          \"  Actual: true (2 is even)\\n\"\n                          \"Expected: false\");\n  EXPECT_FALSE(ResultIsEvenNoExplanation(3));\n  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(ResultIsEvenNoExplanation(2)),\n                          \"Value of: ResultIsEvenNoExplanation(2)\\n\"\n                          \"  Actual: true\\n\"\n                          \"Expected: false\");\n}\n\n#ifdef __BORLANDC__\n// Restores warnings after previous \"#pragma option push\" suppressed them\n# pragma option pop\n#endif\n\n// Tests EXPECT_EQ.\nTEST(ExpectTest, EXPECT_EQ) {\n  EXPECT_EQ(5, 2 + 3);\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2*3),\n                          \"Expected equality of these values:\\n\"\n                          \"  5\\n\"\n                          \"  2*3\\n\"\n                          \"    Which is: 6\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2 - 3),\n                          \"2 - 3\");\n}\n\n// Tests using EXPECT_EQ on double values.  The purpose is to make\n// sure that the specialization we did for integer and anonymous enums\n// isn't used for double arguments.\nTEST(ExpectTest, EXPECT_EQ_Double) {\n  // A success.\n  EXPECT_EQ(5.6, 5.6);\n\n  // A failure.\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5.1, 5.2),\n                          \"5.1\");\n}\n\n#if GTEST_CAN_COMPARE_NULL\n// Tests EXPECT_EQ(NULL, pointer).\nTEST(ExpectTest, EXPECT_EQ_NULL) {\n  // A success.\n  const char* p = NULL;\n  // Some older GCC versions may issue a spurious warning in this or the next\n  // assertion statement. This warning should not be suppressed with\n  // static_cast since the test verifies the ability to use bare NULL as the\n  // expected parameter to the macro.\n  EXPECT_EQ(NULL, p);\n\n  // A failure.\n  int n = 0;\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(NULL, &n),\n                          \"  &n\\n    Which is:\");\n}\n#endif  // GTEST_CAN_COMPARE_NULL\n\n// Tests EXPECT_EQ(0, non_pointer).  Since the literal 0 can be\n// treated as a null pointer by the compiler, we need to make sure\n// that EXPECT_EQ(0, non_pointer) isn't interpreted by Google Test as\n// EXPECT_EQ(static_cast<void*>(NULL), non_pointer).\nTEST(ExpectTest, EXPECT_EQ_0) {\n  int n = 0;\n\n  // A success.\n  EXPECT_EQ(0, n);\n\n  // A failure.\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(0, 5.6),\n                          \"  0\\n  5.6\");\n}\n\n// Tests EXPECT_NE.\nTEST(ExpectTest, EXPECT_NE) {\n  EXPECT_NE(6, 7);\n\n  EXPECT_NONFATAL_FAILURE(EXPECT_NE('a', 'a'),\n                          \"Expected: ('a') != ('a'), \"\n                          \"actual: 'a' (97, 0x61) vs 'a' (97, 0x61)\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_NE(2, 2),\n                          \"2\");\n  char* const p0 = NULL;\n  EXPECT_NONFATAL_FAILURE(EXPECT_NE(p0, p0),\n                          \"p0\");\n  // Only way to get the Nokia compiler to compile the cast\n  // is to have a separate void* variable first. Putting\n  // the two casts on the same line doesn't work, neither does\n  // a direct C-style to char*.\n  void* pv1 = (void*)0x1234;  // NOLINT\n  char* const p1 = reinterpret_cast<char*>(pv1);\n  EXPECT_NONFATAL_FAILURE(EXPECT_NE(p1, p1),\n                          \"p1\");\n}\n\n// Tests EXPECT_LE.\nTEST(ExpectTest, EXPECT_LE) {\n  EXPECT_LE(2, 3);\n  EXPECT_LE(2, 2);\n  EXPECT_NONFATAL_FAILURE(EXPECT_LE(2, 0),\n                          \"Expected: (2) <= (0), actual: 2 vs 0\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_LE(1.1, 0.9),\n                          \"(1.1) <= (0.9)\");\n}\n\n// Tests EXPECT_LT.\nTEST(ExpectTest, EXPECT_LT) {\n  EXPECT_LT(2, 3);\n  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 2),\n                          \"Expected: (2) < (2), actual: 2 vs 2\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1),\n                          \"(2) < (1)\");\n}\n\n// Tests EXPECT_GE.\nTEST(ExpectTest, EXPECT_GE) {\n  EXPECT_GE(2, 1);\n  EXPECT_GE(2, 2);\n  EXPECT_NONFATAL_FAILURE(EXPECT_GE(2, 3),\n                          \"Expected: (2) >= (3), actual: 2 vs 3\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_GE(0.9, 1.1),\n                          \"(0.9) >= (1.1)\");\n}\n\n// Tests EXPECT_GT.\nTEST(ExpectTest, EXPECT_GT) {\n  EXPECT_GT(2, 1);\n  EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 2),\n                          \"Expected: (2) > (2), actual: 2 vs 2\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 3),\n                          \"(2) > (3)\");\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\n// Tests EXPECT_THROW.\nTEST(ExpectTest, EXPECT_THROW) {\n  EXPECT_THROW(ThrowAnInteger(), int);\n  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(ThrowAnInteger(), bool),\n                          \"Expected: ThrowAnInteger() throws an exception of \"\n                          \"type bool.\\n  Actual: it throws a different type.\");\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_THROW(ThrowNothing(), bool),\n      \"Expected: ThrowNothing() throws an exception of type bool.\\n\"\n      \"  Actual: it throws nothing.\");\n}\n\n// Tests EXPECT_NO_THROW.\nTEST(ExpectTest, EXPECT_NO_THROW) {\n  EXPECT_NO_THROW(ThrowNothing());\n  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(ThrowAnInteger()),\n                          \"Expected: ThrowAnInteger() doesn't throw an \"\n                          \"exception.\\n  Actual: it throws.\");\n}\n\n// Tests EXPECT_ANY_THROW.\nTEST(ExpectTest, EXPECT_ANY_THROW) {\n  EXPECT_ANY_THROW(ThrowAnInteger());\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_ANY_THROW(ThrowNothing()),\n      \"Expected: ThrowNothing() throws an exception.\\n\"\n      \"  Actual: it doesn't.\");\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// Make sure we deal with the precedence of <<.\nTEST(ExpectTest, ExpectPrecedence) {\n  EXPECT_EQ(1 < 2, true);\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(true, true && false),\n                          \"  true && false\\n    Which is: false\");\n}\n\n\n// Tests the StreamableToString() function.\n\n// Tests using StreamableToString() on a scalar.\nTEST(StreamableToStringTest, Scalar) {\n  EXPECT_STREQ(\"5\", StreamableToString(5).c_str());\n}\n\n// Tests using StreamableToString() on a non-char pointer.\nTEST(StreamableToStringTest, Pointer) {\n  int n = 0;\n  int* p = &n;\n  EXPECT_STRNE(\"(null)\", StreamableToString(p).c_str());\n}\n\n// Tests using StreamableToString() on a NULL non-char pointer.\nTEST(StreamableToStringTest, NullPointer) {\n  int* p = NULL;\n  EXPECT_STREQ(\"(null)\", StreamableToString(p).c_str());\n}\n\n// Tests using StreamableToString() on a C string.\nTEST(StreamableToStringTest, CString) {\n  EXPECT_STREQ(\"Foo\", StreamableToString(\"Foo\").c_str());\n}\n\n// Tests using StreamableToString() on a NULL C string.\nTEST(StreamableToStringTest, NullCString) {\n  char* p = NULL;\n  EXPECT_STREQ(\"(null)\", StreamableToString(p).c_str());\n}\n\n// Tests using streamable values as assertion messages.\n\n// Tests using std::string as an assertion message.\nTEST(StreamableTest, string) {\n  static const std::string str(\n      \"This failure message is a std::string, and is expected.\");\n  EXPECT_FATAL_FAILURE(FAIL() << str,\n                       str.c_str());\n}\n\n// Tests that we can output strings containing embedded NULs.\n// Limited to Linux because we can only do this with std::string's.\nTEST(StreamableTest, stringWithEmbeddedNUL) {\n  static const char char_array_with_nul[] =\n      \"Here's a NUL\\0 and some more string\";\n  static const std::string string_with_nul(char_array_with_nul,\n                                           sizeof(char_array_with_nul)\n                                           - 1);  // drops the trailing NUL\n  EXPECT_FATAL_FAILURE(FAIL() << string_with_nul,\n                       \"Here's a NUL\\\\0 and some more string\");\n}\n\n// Tests that we can output a NUL char.\nTEST(StreamableTest, NULChar) {\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    FAIL() << \"A NUL\" << '\\0' << \" and some more string\";\n  }, \"A NUL\\\\0 and some more string\");\n}\n\n// Tests using int as an assertion message.\nTEST(StreamableTest, int) {\n  EXPECT_FATAL_FAILURE(FAIL() << 900913,\n                       \"900913\");\n}\n\n// Tests using NULL char pointer as an assertion message.\n//\n// In MSVC, streaming a NULL char * causes access violation.  Google Test\n// implemented a workaround (substituting \"(null)\" for NULL).  This\n// tests whether the workaround works.\nTEST(StreamableTest, NullCharPtr) {\n  EXPECT_FATAL_FAILURE(FAIL() << static_cast<const char*>(NULL),\n                       \"(null)\");\n}\n\n// Tests that basic IO manipulators (endl, ends, and flush) can be\n// streamed to testing::Message.\nTEST(StreamableTest, BasicIoManip) {\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    FAIL() << \"Line 1.\" << std::endl\n           << \"A NUL char \" << std::ends << std::flush << \" in line 2.\";\n  }, \"Line 1.\\nA NUL char \\\\0 in line 2.\");\n}\n\n// Tests the macros that haven't been covered so far.\n\nvoid AddFailureHelper(bool* aborted) {\n  *aborted = true;\n  ADD_FAILURE() << \"Intentional failure.\";\n  *aborted = false;\n}\n\n// Tests ADD_FAILURE.\nTEST(MacroTest, ADD_FAILURE) {\n  bool aborted = true;\n  EXPECT_NONFATAL_FAILURE(AddFailureHelper(&aborted),\n                          \"Intentional failure.\");\n  EXPECT_FALSE(aborted);\n}\n\n// Tests ADD_FAILURE_AT.\nTEST(MacroTest, ADD_FAILURE_AT) {\n  // Verifies that ADD_FAILURE_AT does generate a nonfatal failure and\n  // the failure message contains the user-streamed part.\n  EXPECT_NONFATAL_FAILURE(ADD_FAILURE_AT(\"foo.cc\", 42) << \"Wrong!\", \"Wrong!\");\n\n  // Verifies that the user-streamed part is optional.\n  EXPECT_NONFATAL_FAILURE(ADD_FAILURE_AT(\"foo.cc\", 42), \"Failed\");\n\n  // Unfortunately, we cannot verify that the failure message contains\n  // the right file path and line number the same way, as\n  // EXPECT_NONFATAL_FAILURE() doesn't get to see the file path and\n  // line number.  Instead, we do that in googletest-output-test_.cc.\n}\n\n// Tests FAIL.\nTEST(MacroTest, FAIL) {\n  EXPECT_FATAL_FAILURE(FAIL(),\n                       \"Failed\");\n  EXPECT_FATAL_FAILURE(FAIL() << \"Intentional failure.\",\n                       \"Intentional failure.\");\n}\n\n// Tests SUCCEED\nTEST(MacroTest, SUCCEED) {\n  SUCCEED();\n  SUCCEED() << \"Explicit success.\";\n}\n\n// Tests for EXPECT_EQ() and ASSERT_EQ().\n//\n// These tests fail *intentionally*, s.t. the failure messages can be\n// generated and tested.\n//\n// We have different tests for different argument types.\n\n// Tests using bool values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, Bool) {\n  EXPECT_EQ(true,  true);\n  EXPECT_FATAL_FAILURE({\n      bool false_value = false;\n      ASSERT_EQ(false_value, true);\n    }, \"  false_value\\n    Which is: false\\n  true\");\n}\n\n// Tests using int values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, Int) {\n  ASSERT_EQ(32, 32);\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(32, 33),\n                          \"  32\\n  33\");\n}\n\n// Tests using time_t values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, Time_T) {\n  EXPECT_EQ(static_cast<time_t>(0),\n            static_cast<time_t>(0));\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<time_t>(0),\n                                 static_cast<time_t>(1234)),\n                       \"1234\");\n}\n\n// Tests using char values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, Char) {\n  ASSERT_EQ('z', 'z');\n  const char ch = 'b';\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ('\\0', ch),\n                          \"  ch\\n    Which is: 'b'\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ('a', ch),\n                          \"  ch\\n    Which is: 'b'\");\n}\n\n// Tests using wchar_t values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, WideChar) {\n  EXPECT_EQ(L'b', L'b');\n\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'\\0', L'x'),\n                          \"Expected equality of these values:\\n\"\n                          \"  L'\\0'\\n\"\n                          \"    Which is: L'\\0' (0, 0x0)\\n\"\n                          \"  L'x'\\n\"\n                          \"    Which is: L'x' (120, 0x78)\");\n\n  static wchar_t wchar;\n  wchar = L'b';\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'a', wchar),\n                          \"wchar\");\n  wchar = 0x8119;\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<wchar_t>(0x8120), wchar),\n                       \"  wchar\\n    Which is: L'\");\n}\n\n// Tests using ::std::string values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, StdString) {\n  // Compares a const char* to an std::string that has identical\n  // content.\n  ASSERT_EQ(\"Test\", ::std::string(\"Test\"));\n\n  // Compares two identical std::strings.\n  static const ::std::string str1(\"A * in the middle\");\n  static const ::std::string str2(str1);\n  EXPECT_EQ(str1, str2);\n\n  // Compares a const char* to an std::string that has different\n  // content\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(\"Test\", ::std::string(\"test\")),\n                          \"\\\"test\\\"\");\n\n  // Compares an std::string to a char* that has different content.\n  char* const p1 = const_cast<char*>(\"foo\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::std::string(\"bar\"), p1),\n                          \"p1\");\n\n  // Compares two std::strings that have different contents, one of\n  // which having a NUL character in the middle.  This should fail.\n  static ::std::string str3(str1);\n  str3.at(2) = '\\0';\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(str1, str3),\n                       \"  str3\\n    Which is: \\\"A \\\\0 in the middle\\\"\");\n}\n\n#if GTEST_HAS_STD_WSTRING\n\n// Tests using ::std::wstring values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, StdWideString) {\n  // Compares two identical std::wstrings.\n  const ::std::wstring wstr1(L\"A * in the middle\");\n  const ::std::wstring wstr2(wstr1);\n  ASSERT_EQ(wstr1, wstr2);\n\n  // Compares an std::wstring to a const wchar_t* that has identical\n  // content.\n  const wchar_t kTestX8119[] = { 'T', 'e', 's', 't', 0x8119, '\\0' };\n  EXPECT_EQ(::std::wstring(kTestX8119), kTestX8119);\n\n  // Compares an std::wstring to a const wchar_t* that has different\n  // content.\n  const wchar_t kTestX8120[] = { 'T', 'e', 's', 't', 0x8120, '\\0' };\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_EQ(::std::wstring(kTestX8119), kTestX8120);\n  }, \"kTestX8120\");\n\n  // Compares two std::wstrings that have different contents, one of\n  // which having a NUL character in the middle.\n  ::std::wstring wstr3(wstr1);\n  wstr3.at(2) = L'\\0';\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(wstr1, wstr3),\n                          \"wstr3\");\n\n  // Compares a wchar_t* to an std::wstring that has different\n  // content.\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_EQ(const_cast<wchar_t*>(L\"foo\"), ::std::wstring(L\"bar\"));\n  }, \"\");\n}\n\n#endif  // GTEST_HAS_STD_WSTRING\n\n#if GTEST_HAS_GLOBAL_STRING\n// Tests using ::string values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, GlobalString) {\n  // Compares a const char* to a ::string that has identical content.\n  EXPECT_EQ(\"Test\", ::string(\"Test\"));\n\n  // Compares two identical ::strings.\n  const ::string str1(\"A * in the middle\");\n  const ::string str2(str1);\n  ASSERT_EQ(str1, str2);\n\n  // Compares a ::string to a const char* that has different content.\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::string(\"Test\"), \"test\"),\n                          \"test\");\n\n  // Compares two ::strings that have different contents, one of which\n  // having a NUL character in the middle.\n  ::string str3(str1);\n  str3.at(2) = '\\0';\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(str1, str3),\n                          \"str3\");\n\n  // Compares a ::string to a char* that has different content.\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_EQ(::string(\"bar\"), const_cast<char*>(\"foo\"));\n  }, \"\");\n}\n\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n#if GTEST_HAS_GLOBAL_WSTRING\n\n// Tests using ::wstring values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, GlobalWideString) {\n  // Compares two identical ::wstrings.\n  static const ::wstring wstr1(L\"A * in the middle\");\n  static const ::wstring wstr2(wstr1);\n  EXPECT_EQ(wstr1, wstr2);\n\n  // Compares a const wchar_t* to a ::wstring that has identical content.\n  const wchar_t kTestX8119[] = { 'T', 'e', 's', 't', 0x8119, '\\0' };\n  ASSERT_EQ(kTestX8119, ::wstring(kTestX8119));\n\n  // Compares a const wchar_t* to a ::wstring that has different\n  // content.\n  const wchar_t kTestX8120[] = { 'T', 'e', 's', 't', 0x8120, '\\0' };\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_EQ(kTestX8120, ::wstring(kTestX8119));\n  }, \"Test\\\\x8119\");\n\n  // Compares a wchar_t* to a ::wstring that has different content.\n  wchar_t* const p1 = const_cast<wchar_t*>(L\"foo\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, ::wstring(L\"bar\")),\n                          \"bar\");\n\n  // Compares two ::wstrings that have different contents, one of which\n  // having a NUL character in the middle.\n  static ::wstring wstr3;\n  wstr3 = wstr1;\n  wstr3.at(2) = L'\\0';\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(wstr1, wstr3),\n                       \"wstr3\");\n}\n\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n// Tests using char pointers in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, CharPointer) {\n  char* const p0 = NULL;\n  // Only way to get the Nokia compiler to compile the cast\n  // is to have a separate void* variable first. Putting\n  // the two casts on the same line doesn't work, neither does\n  // a direct C-style to char*.\n  void* pv1 = (void*)0x1234;  // NOLINT\n  void* pv2 = (void*)0xABC0;  // NOLINT\n  char* const p1 = reinterpret_cast<char*>(pv1);\n  char* const p2 = reinterpret_cast<char*>(pv2);\n  ASSERT_EQ(p1, p1);\n\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2),\n                          \"  p2\\n    Which is:\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2),\n                          \"  p2\\n    Which is:\");\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(reinterpret_cast<char*>(0x1234),\n                                 reinterpret_cast<char*>(0xABC0)),\n                       \"ABC0\");\n}\n\n// Tests using wchar_t pointers in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, WideCharPointer) {\n  wchar_t* const p0 = NULL;\n  // Only way to get the Nokia compiler to compile the cast\n  // is to have a separate void* variable first. Putting\n  // the two casts on the same line doesn't work, neither does\n  // a direct C-style to char*.\n  void* pv1 = (void*)0x1234;  // NOLINT\n  void* pv2 = (void*)0xABC0;  // NOLINT\n  wchar_t* const p1 = reinterpret_cast<wchar_t*>(pv1);\n  wchar_t* const p2 = reinterpret_cast<wchar_t*>(pv2);\n  EXPECT_EQ(p0, p0);\n\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2),\n                          \"  p2\\n    Which is:\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2),\n                          \"  p2\\n    Which is:\");\n  void* pv3 = (void*)0x1234;  // NOLINT\n  void* pv4 = (void*)0xABC0;  // NOLINT\n  const wchar_t* p3 = reinterpret_cast<const wchar_t*>(pv3);\n  const wchar_t* p4 = reinterpret_cast<const wchar_t*>(pv4);\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p3, p4),\n                          \"p4\");\n}\n\n// Tests using other types of pointers in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, OtherPointer) {\n  ASSERT_EQ(static_cast<const int*>(NULL),\n            static_cast<const int*>(NULL));\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<const int*>(NULL),\n                                 reinterpret_cast<const int*>(0x1234)),\n                       \"0x1234\");\n}\n\n// A class that supports binary comparison operators but not streaming.\nclass UnprintableChar {\n public:\n  explicit UnprintableChar(char ch) : char_(ch) {}\n\n  bool operator==(const UnprintableChar& rhs) const {\n    return char_ == rhs.char_;\n  }\n  bool operator!=(const UnprintableChar& rhs) const {\n    return char_ != rhs.char_;\n  }\n  bool operator<(const UnprintableChar& rhs) const {\n    return char_ < rhs.char_;\n  }\n  bool operator<=(const UnprintableChar& rhs) const {\n    return char_ <= rhs.char_;\n  }\n  bool operator>(const UnprintableChar& rhs) const {\n    return char_ > rhs.char_;\n  }\n  bool operator>=(const UnprintableChar& rhs) const {\n    return char_ >= rhs.char_;\n  }\n\n private:\n  char char_;\n};\n\n// Tests that ASSERT_EQ() and friends don't require the arguments to\n// be printable.\nTEST(ComparisonAssertionTest, AcceptsUnprintableArgs) {\n  const UnprintableChar x('x'), y('y');\n  ASSERT_EQ(x, x);\n  EXPECT_NE(x, y);\n  ASSERT_LT(x, y);\n  EXPECT_LE(x, y);\n  ASSERT_GT(y, x);\n  EXPECT_GE(x, x);\n\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y), \"1-byte object <78>\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y), \"1-byte object <79>\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_LT(y, y), \"1-byte object <79>\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_GT(x, y), \"1-byte object <78>\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_GT(x, y), \"1-byte object <79>\");\n\n  // Code tested by EXPECT_FATAL_FAILURE cannot reference local\n  // variables, so we have to write UnprintableChar('x') instead of x.\n#ifndef __BORLANDC__\n  // ICE's in C++Builder.\n  EXPECT_FATAL_FAILURE(ASSERT_NE(UnprintableChar('x'), UnprintableChar('x')),\n                       \"1-byte object <78>\");\n  EXPECT_FATAL_FAILURE(ASSERT_LE(UnprintableChar('y'), UnprintableChar('x')),\n                       \"1-byte object <78>\");\n#endif\n  EXPECT_FATAL_FAILURE(ASSERT_LE(UnprintableChar('y'), UnprintableChar('x')),\n                       \"1-byte object <79>\");\n  EXPECT_FATAL_FAILURE(ASSERT_GE(UnprintableChar('x'), UnprintableChar('y')),\n                       \"1-byte object <78>\");\n  EXPECT_FATAL_FAILURE(ASSERT_GE(UnprintableChar('x'), UnprintableChar('y')),\n                       \"1-byte object <79>\");\n}\n\n// Tests the FRIEND_TEST macro.\n\n// This class has a private member we want to test.  We will test it\n// both in a TEST and in a TEST_F.\nclass Foo {\n public:\n  Foo() {}\n\n private:\n  int Bar() const { return 1; }\n\n  // Declares the friend tests that can access the private member\n  // Bar().\n  FRIEND_TEST(FRIEND_TEST_Test, TEST);\n  FRIEND_TEST(FRIEND_TEST_Test2, TEST_F);\n};\n\n// Tests that the FRIEND_TEST declaration allows a TEST to access a\n// class's private members.  This should compile.\nTEST(FRIEND_TEST_Test, TEST) {\n  ASSERT_EQ(1, Foo().Bar());\n}\n\n// The fixture needed to test using FRIEND_TEST with TEST_F.\nclass FRIEND_TEST_Test2 : public Test {\n protected:\n  Foo foo;\n};\n\n// Tests that the FRIEND_TEST declaration allows a TEST_F to access a\n// class's private members.  This should compile.\nTEST_F(FRIEND_TEST_Test2, TEST_F) {\n  ASSERT_EQ(1, foo.Bar());\n}\n\n// Tests the life cycle of Test objects.\n\n// The test fixture for testing the life cycle of Test objects.\n//\n// This class counts the number of live test objects that uses this\n// fixture.\nclass TestLifeCycleTest : public Test {\n protected:\n  // Constructor.  Increments the number of test objects that uses\n  // this fixture.\n  TestLifeCycleTest() { count_++; }\n\n  // Destructor.  Decrements the number of test objects that uses this\n  // fixture.\n  ~TestLifeCycleTest() { count_--; }\n\n  // Returns the number of live test objects that uses this fixture.\n  int count() const { return count_; }\n\n private:\n  static int count_;\n};\n\nint TestLifeCycleTest::count_ = 0;\n\n// Tests the life cycle of test objects.\nTEST_F(TestLifeCycleTest, Test1) {\n  // There should be only one test object in this test case that's\n  // currently alive.\n  ASSERT_EQ(1, count());\n}\n\n// Tests the life cycle of test objects.\nTEST_F(TestLifeCycleTest, Test2) {\n  // After Test1 is done and Test2 is started, there should still be\n  // only one live test object, as the object for Test1 should've been\n  // deleted.\n  ASSERT_EQ(1, count());\n}\n\n}  // namespace\n\n// Tests that the copy constructor works when it is NOT optimized away by\n// the compiler.\nTEST(AssertionResultTest, CopyConstructorWorksWhenNotOptimied) {\n  // Checks that the copy constructor doesn't try to dereference NULL pointers\n  // in the source object.\n  AssertionResult r1 = AssertionSuccess();\n  AssertionResult r2 = r1;\n  // The following line is added to prevent the compiler from optimizing\n  // away the constructor call.\n  r1 << \"abc\";\n\n  AssertionResult r3 = r1;\n  EXPECT_EQ(static_cast<bool>(r3), static_cast<bool>(r1));\n  EXPECT_STREQ(\"abc\", r1.message());\n}\n\n// Tests that AssertionSuccess and AssertionFailure construct\n// AssertionResult objects as expected.\nTEST(AssertionResultTest, ConstructionWorks) {\n  AssertionResult r1 = AssertionSuccess();\n  EXPECT_TRUE(r1);\n  EXPECT_STREQ(\"\", r1.message());\n\n  AssertionResult r2 = AssertionSuccess() << \"abc\";\n  EXPECT_TRUE(r2);\n  EXPECT_STREQ(\"abc\", r2.message());\n\n  AssertionResult r3 = AssertionFailure();\n  EXPECT_FALSE(r3);\n  EXPECT_STREQ(\"\", r3.message());\n\n  AssertionResult r4 = AssertionFailure() << \"def\";\n  EXPECT_FALSE(r4);\n  EXPECT_STREQ(\"def\", r4.message());\n\n  AssertionResult r5 = AssertionFailure(Message() << \"ghi\");\n  EXPECT_FALSE(r5);\n  EXPECT_STREQ(\"ghi\", r5.message());\n}\n\n// Tests that the negation flips the predicate result but keeps the message.\nTEST(AssertionResultTest, NegationWorks) {\n  AssertionResult r1 = AssertionSuccess() << \"abc\";\n  EXPECT_FALSE(!r1);\n  EXPECT_STREQ(\"abc\", (!r1).message());\n\n  AssertionResult r2 = AssertionFailure() << \"def\";\n  EXPECT_TRUE(!r2);\n  EXPECT_STREQ(\"def\", (!r2).message());\n}\n\nTEST(AssertionResultTest, StreamingWorks) {\n  AssertionResult r = AssertionSuccess();\n  r << \"abc\" << 'd' << 0 << true;\n  EXPECT_STREQ(\"abcd0true\", r.message());\n}\n\nTEST(AssertionResultTest, CanStreamOstreamManipulators) {\n  AssertionResult r = AssertionSuccess();\n  r << \"Data\" << std::endl << std::flush << std::ends << \"Will be visible\";\n  EXPECT_STREQ(\"Data\\n\\\\0Will be visible\", r.message());\n}\n\n// The next test uses explicit conversion operators -- a C++11 feature.\n#if GTEST_LANG_CXX11\n\nTEST(AssertionResultTest, ConstructibleFromContextuallyConvertibleToBool) {\n  struct ExplicitlyConvertibleToBool {\n    explicit operator bool() const { return value; }\n    bool value;\n  };\n  ExplicitlyConvertibleToBool v1 = {false};\n  ExplicitlyConvertibleToBool v2 = {true};\n  EXPECT_FALSE(v1);\n  EXPECT_TRUE(v2);\n}\n\n#endif  // GTEST_LANG_CXX11\n\nstruct ConvertibleToAssertionResult {\n  operator AssertionResult() const { return AssertionResult(true); }\n};\n\nTEST(AssertionResultTest, ConstructibleFromImplicitlyConvertible) {\n  ConvertibleToAssertionResult obj;\n  EXPECT_TRUE(obj);\n}\n\n// Tests streaming a user type whose definition and operator << are\n// both in the global namespace.\nclass Base {\n public:\n  explicit Base(int an_x) : x_(an_x) {}\n  int x() const { return x_; }\n private:\n  int x_;\n};\nstd::ostream& operator<<(std::ostream& os,\n                         const Base& val) {\n  return os << val.x();\n}\nstd::ostream& operator<<(std::ostream& os,\n                         const Base* pointer) {\n  return os << \"(\" << pointer->x() << \")\";\n}\n\nTEST(MessageTest, CanStreamUserTypeInGlobalNameSpace) {\n  Message msg;\n  Base a(1);\n\n  msg << a << &a;  // Uses ::operator<<.\n  EXPECT_STREQ(\"1(1)\", msg.GetString().c_str());\n}\n\n// Tests streaming a user type whose definition and operator<< are\n// both in an unnamed namespace.\nnamespace {\nclass MyTypeInUnnamedNameSpace : public Base {\n public:\n  explicit MyTypeInUnnamedNameSpace(int an_x): Base(an_x) {}\n};\nstd::ostream& operator<<(std::ostream& os,\n                         const MyTypeInUnnamedNameSpace& val) {\n  return os << val.x();\n}\nstd::ostream& operator<<(std::ostream& os,\n                         const MyTypeInUnnamedNameSpace* pointer) {\n  return os << \"(\" << pointer->x() << \")\";\n}\n}  // namespace\n\nTEST(MessageTest, CanStreamUserTypeInUnnamedNameSpace) {\n  Message msg;\n  MyTypeInUnnamedNameSpace a(1);\n\n  msg << a << &a;  // Uses <unnamed_namespace>::operator<<.\n  EXPECT_STREQ(\"1(1)\", msg.GetString().c_str());\n}\n\n// Tests streaming a user type whose definition and operator<< are\n// both in a user namespace.\nnamespace namespace1 {\nclass MyTypeInNameSpace1 : public Base {\n public:\n  explicit MyTypeInNameSpace1(int an_x): Base(an_x) {}\n};\nstd::ostream& operator<<(std::ostream& os,\n                         const MyTypeInNameSpace1& val) {\n  return os << val.x();\n}\nstd::ostream& operator<<(std::ostream& os,\n                         const MyTypeInNameSpace1* pointer) {\n  return os << \"(\" << pointer->x() << \")\";\n}\n}  // namespace namespace1\n\nTEST(MessageTest, CanStreamUserTypeInUserNameSpace) {\n  Message msg;\n  namespace1::MyTypeInNameSpace1 a(1);\n\n  msg << a << &a;  // Uses namespace1::operator<<.\n  EXPECT_STREQ(\"1(1)\", msg.GetString().c_str());\n}\n\n// Tests streaming a user type whose definition is in a user namespace\n// but whose operator<< is in the global namespace.\nnamespace namespace2 {\nclass MyTypeInNameSpace2 : public ::Base {\n public:\n  explicit MyTypeInNameSpace2(int an_x): Base(an_x) {}\n};\n}  // namespace namespace2\nstd::ostream& operator<<(std::ostream& os,\n                         const namespace2::MyTypeInNameSpace2& val) {\n  return os << val.x();\n}\nstd::ostream& operator<<(std::ostream& os,\n                         const namespace2::MyTypeInNameSpace2* pointer) {\n  return os << \"(\" << pointer->x() << \")\";\n}\n\nTEST(MessageTest, CanStreamUserTypeInUserNameSpaceWithStreamOperatorInGlobal) {\n  Message msg;\n  namespace2::MyTypeInNameSpace2 a(1);\n\n  msg << a << &a;  // Uses ::operator<<.\n  EXPECT_STREQ(\"1(1)\", msg.GetString().c_str());\n}\n\n// Tests streaming NULL pointers to testing::Message.\nTEST(MessageTest, NullPointers) {\n  Message msg;\n  char* const p1 = NULL;\n  unsigned char* const p2 = NULL;\n  int* p3 = NULL;\n  double* p4 = NULL;\n  bool* p5 = NULL;\n  Message* p6 = NULL;\n\n  msg << p1 << p2 << p3 << p4 << p5 << p6;\n  ASSERT_STREQ(\"(null)(null)(null)(null)(null)(null)\",\n               msg.GetString().c_str());\n}\n\n// Tests streaming wide strings to testing::Message.\nTEST(MessageTest, WideStrings) {\n  // Streams a NULL of type const wchar_t*.\n  const wchar_t* const_wstr = NULL;\n  EXPECT_STREQ(\"(null)\",\n               (Message() << const_wstr).GetString().c_str());\n\n  // Streams a NULL of type wchar_t*.\n  wchar_t* wstr = NULL;\n  EXPECT_STREQ(\"(null)\",\n               (Message() << wstr).GetString().c_str());\n\n  // Streams a non-NULL of type const wchar_t*.\n  const_wstr = L\"abc\\x8119\";\n  EXPECT_STREQ(\"abc\\xe8\\x84\\x99\",\n               (Message() << const_wstr).GetString().c_str());\n\n  // Streams a non-NULL of type wchar_t*.\n  wstr = const_cast<wchar_t*>(const_wstr);\n  EXPECT_STREQ(\"abc\\xe8\\x84\\x99\",\n               (Message() << wstr).GetString().c_str());\n}\n\n\n// This line tests that we can define tests in the testing namespace.\nnamespace testing {\n\n// Tests the TestInfo class.\n\nclass TestInfoTest : public Test {\n protected:\n  static const TestInfo* GetTestInfo(const char* test_name) {\n    const TestCase* const test_case = GetUnitTestImpl()->\n        GetTestCase(\"TestInfoTest\", \"\", NULL, NULL);\n\n    for (int i = 0; i < test_case->total_test_count(); ++i) {\n      const TestInfo* const test_info = test_case->GetTestInfo(i);\n      if (strcmp(test_name, test_info->name()) == 0)\n        return test_info;\n    }\n    return NULL;\n  }\n\n  static const TestResult* GetTestResult(\n      const TestInfo* test_info) {\n    return test_info->result();\n  }\n};\n\n// Tests TestInfo::test_case_name() and TestInfo::name().\nTEST_F(TestInfoTest, Names) {\n  const TestInfo* const test_info = GetTestInfo(\"Names\");\n\n  ASSERT_STREQ(\"TestInfoTest\", test_info->test_case_name());\n  ASSERT_STREQ(\"Names\", test_info->name());\n}\n\n// Tests TestInfo::result().\nTEST_F(TestInfoTest, result) {\n  const TestInfo* const test_info = GetTestInfo(\"result\");\n\n  // Initially, there is no TestPartResult for this test.\n  ASSERT_EQ(0, GetTestResult(test_info)->total_part_count());\n\n  // After the previous assertion, there is still none.\n  ASSERT_EQ(0, GetTestResult(test_info)->total_part_count());\n}\n\n#define VERIFY_CODE_LOCATION \\\n  const int expected_line = __LINE__ - 1; \\\n  const TestInfo* const test_info = GetUnitTestImpl()->current_test_info(); \\\n  ASSERT_TRUE(test_info); \\\n  EXPECT_STREQ(__FILE__, test_info->file()); \\\n  EXPECT_EQ(expected_line, test_info->line())\n\nTEST(CodeLocationForTEST, Verify) {\n  VERIFY_CODE_LOCATION;\n}\n\nclass CodeLocationForTESTF : public Test {\n};\n\nTEST_F(CodeLocationForTESTF, Verify) {\n  VERIFY_CODE_LOCATION;\n}\n\nclass CodeLocationForTESTP : public TestWithParam<int> {\n};\n\nTEST_P(CodeLocationForTESTP, Verify) {\n  VERIFY_CODE_LOCATION;\n}\n\nINSTANTIATE_TEST_CASE_P(, CodeLocationForTESTP, Values(0));\n\ntemplate <typename T>\nclass CodeLocationForTYPEDTEST : public Test {\n};\n\nTYPED_TEST_CASE(CodeLocationForTYPEDTEST, int);\n\nTYPED_TEST(CodeLocationForTYPEDTEST, Verify) {\n  VERIFY_CODE_LOCATION;\n}\n\ntemplate <typename T>\nclass CodeLocationForTYPEDTESTP : public Test {\n};\n\nTYPED_TEST_CASE_P(CodeLocationForTYPEDTESTP);\n\nTYPED_TEST_P(CodeLocationForTYPEDTESTP, Verify) {\n  VERIFY_CODE_LOCATION;\n}\n\nREGISTER_TYPED_TEST_CASE_P(CodeLocationForTYPEDTESTP, Verify);\n\nINSTANTIATE_TYPED_TEST_CASE_P(My, CodeLocationForTYPEDTESTP, int);\n\n#undef VERIFY_CODE_LOCATION\n\n// Tests setting up and tearing down a test case.\n\nclass SetUpTestCaseTest : public Test {\n protected:\n  // This will be called once before the first test in this test case\n  // is run.\n  static void SetUpTestCase() {\n    printf(\"Setting up the test case . . .\\n\");\n\n    // Initializes some shared resource.  In this simple example, we\n    // just create a C string.  More complex stuff can be done if\n    // desired.\n    shared_resource_ = \"123\";\n\n    // Increments the number of test cases that have been set up.\n    counter_++;\n\n    // SetUpTestCase() should be called only once.\n    EXPECT_EQ(1, counter_);\n  }\n\n  // This will be called once after the last test in this test case is\n  // run.\n  static void TearDownTestCase() {\n    printf(\"Tearing down the test case . . .\\n\");\n\n    // Decrements the number of test cases that have been set up.\n    counter_--;\n\n    // TearDownTestCase() should be called only once.\n    EXPECT_EQ(0, counter_);\n\n    // Cleans up the shared resource.\n    shared_resource_ = NULL;\n  }\n\n  // This will be called before each test in this test case.\n  virtual void SetUp() {\n    // SetUpTestCase() should be called only once, so counter_ should\n    // always be 1.\n    EXPECT_EQ(1, counter_);\n  }\n\n  // Number of test cases that have been set up.\n  static int counter_;\n\n  // Some resource to be shared by all tests in this test case.\n  static const char* shared_resource_;\n};\n\nint SetUpTestCaseTest::counter_ = 0;\nconst char* SetUpTestCaseTest::shared_resource_ = NULL;\n\n// A test that uses the shared resource.\nTEST_F(SetUpTestCaseTest, Test1) {\n  EXPECT_STRNE(NULL, shared_resource_);\n}\n\n// Another test that uses the shared resource.\nTEST_F(SetUpTestCaseTest, Test2) {\n  EXPECT_STREQ(\"123\", shared_resource_);\n}\n\n\n// The ParseFlagsTest test case tests ParseGoogleTestFlagsOnly.\n\n// The Flags struct stores a copy of all Google Test flags.\nstruct Flags {\n  // Constructs a Flags struct where each flag has its default value.\n  Flags() : also_run_disabled_tests(false),\n            break_on_failure(false),\n            catch_exceptions(false),\n            death_test_use_fork(false),\n            filter(\"\"),\n            list_tests(false),\n            output(\"\"),\n            print_time(true),\n            random_seed(0),\n            repeat(1),\n            shuffle(false),\n            stack_trace_depth(kMaxStackTraceDepth),\n            stream_result_to(\"\"),\n            throw_on_failure(false) {}\n\n  // Factory methods.\n\n  // Creates a Flags struct where the gtest_also_run_disabled_tests flag has\n  // the given value.\n  static Flags AlsoRunDisabledTests(bool also_run_disabled_tests) {\n    Flags flags;\n    flags.also_run_disabled_tests = also_run_disabled_tests;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_break_on_failure flag has\n  // the given value.\n  static Flags BreakOnFailure(bool break_on_failure) {\n    Flags flags;\n    flags.break_on_failure = break_on_failure;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_catch_exceptions flag has\n  // the given value.\n  static Flags CatchExceptions(bool catch_exceptions) {\n    Flags flags;\n    flags.catch_exceptions = catch_exceptions;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_death_test_use_fork flag has\n  // the given value.\n  static Flags DeathTestUseFork(bool death_test_use_fork) {\n    Flags flags;\n    flags.death_test_use_fork = death_test_use_fork;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_filter flag has the given\n  // value.\n  static Flags Filter(const char* filter) {\n    Flags flags;\n    flags.filter = filter;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_list_tests flag has the\n  // given value.\n  static Flags ListTests(bool list_tests) {\n    Flags flags;\n    flags.list_tests = list_tests;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_output flag has the given\n  // value.\n  static Flags Output(const char* output) {\n    Flags flags;\n    flags.output = output;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_print_time flag has the given\n  // value.\n  static Flags PrintTime(bool print_time) {\n    Flags flags;\n    flags.print_time = print_time;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_random_seed flag has the given\n  // value.\n  static Flags RandomSeed(Int32 random_seed) {\n    Flags flags;\n    flags.random_seed = random_seed;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_repeat flag has the given\n  // value.\n  static Flags Repeat(Int32 repeat) {\n    Flags flags;\n    flags.repeat = repeat;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_shuffle flag has the given\n  // value.\n  static Flags Shuffle(bool shuffle) {\n    Flags flags;\n    flags.shuffle = shuffle;\n    return flags;\n  }\n\n  // Creates a Flags struct where the GTEST_FLAG(stack_trace_depth) flag has\n  // the given value.\n  static Flags StackTraceDepth(Int32 stack_trace_depth) {\n    Flags flags;\n    flags.stack_trace_depth = stack_trace_depth;\n    return flags;\n  }\n\n  // Creates a Flags struct where the GTEST_FLAG(stream_result_to) flag has\n  // the given value.\n  static Flags StreamResultTo(const char* stream_result_to) {\n    Flags flags;\n    flags.stream_result_to = stream_result_to;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_throw_on_failure flag has\n  // the given value.\n  static Flags ThrowOnFailure(bool throw_on_failure) {\n    Flags flags;\n    flags.throw_on_failure = throw_on_failure;\n    return flags;\n  }\n\n  // These fields store the flag values.\n  bool also_run_disabled_tests;\n  bool break_on_failure;\n  bool catch_exceptions;\n  bool death_test_use_fork;\n  const char* filter;\n  bool list_tests;\n  const char* output;\n  bool print_time;\n  Int32 random_seed;\n  Int32 repeat;\n  bool shuffle;\n  Int32 stack_trace_depth;\n  const char* stream_result_to;\n  bool throw_on_failure;\n};\n\n// Fixture for testing ParseGoogleTestFlagsOnly().\nclass ParseFlagsTest : public Test {\n protected:\n  // Clears the flags before each test.\n  virtual void SetUp() {\n    GTEST_FLAG(also_run_disabled_tests) = false;\n    GTEST_FLAG(break_on_failure) = false;\n    GTEST_FLAG(catch_exceptions) = false;\n    GTEST_FLAG(death_test_use_fork) = false;\n    GTEST_FLAG(filter) = \"\";\n    GTEST_FLAG(list_tests) = false;\n    GTEST_FLAG(output) = \"\";\n    GTEST_FLAG(print_time) = true;\n    GTEST_FLAG(random_seed) = 0;\n    GTEST_FLAG(repeat) = 1;\n    GTEST_FLAG(shuffle) = false;\n    GTEST_FLAG(stack_trace_depth) = kMaxStackTraceDepth;\n    GTEST_FLAG(stream_result_to) = \"\";\n    GTEST_FLAG(throw_on_failure) = false;\n  }\n\n  // Asserts that two narrow or wide string arrays are equal.\n  template <typename CharType>\n  static void AssertStringArrayEq(size_t size1, CharType** array1,\n                                  size_t size2, CharType** array2) {\n    ASSERT_EQ(size1, size2) << \" Array sizes different.\";\n\n    for (size_t i = 0; i != size1; i++) {\n      ASSERT_STREQ(array1[i], array2[i]) << \" where i == \" << i;\n    }\n  }\n\n  // Verifies that the flag values match the expected values.\n  static void CheckFlags(const Flags& expected) {\n    EXPECT_EQ(expected.also_run_disabled_tests,\n              GTEST_FLAG(also_run_disabled_tests));\n    EXPECT_EQ(expected.break_on_failure, GTEST_FLAG(break_on_failure));\n    EXPECT_EQ(expected.catch_exceptions, GTEST_FLAG(catch_exceptions));\n    EXPECT_EQ(expected.death_test_use_fork, GTEST_FLAG(death_test_use_fork));\n    EXPECT_STREQ(expected.filter, GTEST_FLAG(filter).c_str());\n    EXPECT_EQ(expected.list_tests, GTEST_FLAG(list_tests));\n    EXPECT_STREQ(expected.output, GTEST_FLAG(output).c_str());\n    EXPECT_EQ(expected.print_time, GTEST_FLAG(print_time));\n    EXPECT_EQ(expected.random_seed, GTEST_FLAG(random_seed));\n    EXPECT_EQ(expected.repeat, GTEST_FLAG(repeat));\n    EXPECT_EQ(expected.shuffle, GTEST_FLAG(shuffle));\n    EXPECT_EQ(expected.stack_trace_depth, GTEST_FLAG(stack_trace_depth));\n    EXPECT_STREQ(expected.stream_result_to,\n                 GTEST_FLAG(stream_result_to).c_str());\n    EXPECT_EQ(expected.throw_on_failure, GTEST_FLAG(throw_on_failure));\n  }\n\n  // Parses a command line (specified by argc1 and argv1), then\n  // verifies that the flag values are expected and that the\n  // recognized flags are removed from the command line.\n  template <typename CharType>\n  static void TestParsingFlags(int argc1, const CharType** argv1,\n                               int argc2, const CharType** argv2,\n                               const Flags& expected, bool should_print_help) {\n    const bool saved_help_flag = ::testing::internal::g_help_flag;\n    ::testing::internal::g_help_flag = false;\n\n# if GTEST_HAS_STREAM_REDIRECTION\n    CaptureStdout();\n# endif\n\n    // Parses the command line.\n    internal::ParseGoogleTestFlagsOnly(&argc1, const_cast<CharType**>(argv1));\n\n# if GTEST_HAS_STREAM_REDIRECTION\n    const std::string captured_stdout = GetCapturedStdout();\n# endif\n\n    // Verifies the flag values.\n    CheckFlags(expected);\n\n    // Verifies that the recognized flags are removed from the command\n    // line.\n    AssertStringArrayEq(argc1 + 1, argv1, argc2 + 1, argv2);\n\n    // ParseGoogleTestFlagsOnly should neither set g_help_flag nor print the\n    // help message for the flags it recognizes.\n    EXPECT_EQ(should_print_help, ::testing::internal::g_help_flag);\n\n# if GTEST_HAS_STREAM_REDIRECTION\n    const char* const expected_help_fragment =\n        \"This program contains tests written using\";\n    if (should_print_help) {\n      EXPECT_PRED_FORMAT2(IsSubstring, expected_help_fragment, captured_stdout);\n    } else {\n      EXPECT_PRED_FORMAT2(IsNotSubstring,\n                          expected_help_fragment, captured_stdout);\n    }\n# endif  // GTEST_HAS_STREAM_REDIRECTION\n\n    ::testing::internal::g_help_flag = saved_help_flag;\n  }\n\n  // This macro wraps TestParsingFlags s.t. the user doesn't need\n  // to specify the array sizes.\n\n# define GTEST_TEST_PARSING_FLAGS_(argv1, argv2, expected, should_print_help) \\\n  TestParsingFlags(sizeof(argv1)/sizeof(*argv1) - 1, argv1, \\\n                   sizeof(argv2)/sizeof(*argv2) - 1, argv2, \\\n                   expected, should_print_help)\n};\n\n// Tests parsing an empty command line.\nTEST_F(ParseFlagsTest, Empty) {\n  const char* argv[] = {\n    NULL\n  };\n\n  const char* argv2[] = {\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false);\n}\n\n// Tests parsing a command line that has no flag.\nTEST_F(ParseFlagsTest, NoFlag) {\n  const char* argv[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false);\n}\n\n// Tests parsing a bad --gtest_filter flag.\nTEST_F(ParseFlagsTest, FilterBad) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_filter\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    \"--gtest_filter\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(\"\"), true);\n}\n\n// Tests parsing an empty --gtest_filter flag.\nTEST_F(ParseFlagsTest, FilterEmpty) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_filter=\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(\"\"), false);\n}\n\n// Tests parsing a non-empty --gtest_filter flag.\nTEST_F(ParseFlagsTest, FilterNonEmpty) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_filter=abc\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(\"abc\"), false);\n}\n\n// Tests parsing --gtest_break_on_failure.\nTEST_F(ParseFlagsTest, BreakOnFailureWithoutValue) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_break_on_failure\",\n    NULL\n};\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(true), false);\n}\n\n// Tests parsing --gtest_break_on_failure=0.\nTEST_F(ParseFlagsTest, BreakOnFailureFalse_0) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_break_on_failure=0\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);\n}\n\n// Tests parsing --gtest_break_on_failure=f.\nTEST_F(ParseFlagsTest, BreakOnFailureFalse_f) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_break_on_failure=f\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);\n}\n\n// Tests parsing --gtest_break_on_failure=F.\nTEST_F(ParseFlagsTest, BreakOnFailureFalse_F) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_break_on_failure=F\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);\n}\n\n// Tests parsing a --gtest_break_on_failure flag that has a \"true\"\n// definition.\nTEST_F(ParseFlagsTest, BreakOnFailureTrue) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_break_on_failure=1\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(true), false);\n}\n\n// Tests parsing --gtest_catch_exceptions.\nTEST_F(ParseFlagsTest, CatchExceptions) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_catch_exceptions\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::CatchExceptions(true), false);\n}\n\n// Tests parsing --gtest_death_test_use_fork.\nTEST_F(ParseFlagsTest, DeathTestUseFork) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_death_test_use_fork\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::DeathTestUseFork(true), false);\n}\n\n// Tests having the same flag twice with different values.  The\n// expected behavior is that the one coming last takes precedence.\nTEST_F(ParseFlagsTest, DuplicatedFlags) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_filter=a\",\n    \"--gtest_filter=b\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(\"b\"), false);\n}\n\n// Tests having an unrecognized flag on the command line.\nTEST_F(ParseFlagsTest, UnrecognizedFlag) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_break_on_failure\",\n    \"bar\",  // Unrecognized by Google Test.\n    \"--gtest_filter=b\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    \"bar\",\n    NULL\n  };\n\n  Flags flags;\n  flags.break_on_failure = true;\n  flags.filter = \"b\";\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, flags, false);\n}\n\n// Tests having a --gtest_list_tests flag\nTEST_F(ParseFlagsTest, ListTestsFlag) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_list_tests\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(true), false);\n}\n\n// Tests having a --gtest_list_tests flag with a \"true\" value\nTEST_F(ParseFlagsTest, ListTestsTrue) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_list_tests=1\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(true), false);\n}\n\n// Tests having a --gtest_list_tests flag with a \"false\" value\nTEST_F(ParseFlagsTest, ListTestsFalse) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_list_tests=0\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);\n}\n\n// Tests parsing --gtest_list_tests=f.\nTEST_F(ParseFlagsTest, ListTestsFalse_f) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_list_tests=f\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);\n}\n\n// Tests parsing --gtest_list_tests=F.\nTEST_F(ParseFlagsTest, ListTestsFalse_F) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_list_tests=F\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);\n}\n\n// Tests parsing --gtest_output (invalid).\nTEST_F(ParseFlagsTest, OutputEmpty) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_output\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    \"--gtest_output\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), true);\n}\n\n// Tests parsing --gtest_output=xml\nTEST_F(ParseFlagsTest, OutputXml) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_output=xml\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Output(\"xml\"), false);\n}\n\n// Tests parsing --gtest_output=xml:file\nTEST_F(ParseFlagsTest, OutputXmlFile) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_output=xml:file\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Output(\"xml:file\"), false);\n}\n\n// Tests parsing --gtest_output=xml:directory/path/\nTEST_F(ParseFlagsTest, OutputXmlDirectory) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_output=xml:directory/path/\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2,\n                            Flags::Output(\"xml:directory/path/\"), false);\n}\n\n// Tests having a --gtest_print_time flag\nTEST_F(ParseFlagsTest, PrintTimeFlag) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_print_time\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(true), false);\n}\n\n// Tests having a --gtest_print_time flag with a \"true\" value\nTEST_F(ParseFlagsTest, PrintTimeTrue) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_print_time=1\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(true), false);\n}\n\n// Tests having a --gtest_print_time flag with a \"false\" value\nTEST_F(ParseFlagsTest, PrintTimeFalse) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_print_time=0\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);\n}\n\n// Tests parsing --gtest_print_time=f.\nTEST_F(ParseFlagsTest, PrintTimeFalse_f) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_print_time=f\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);\n}\n\n// Tests parsing --gtest_print_time=F.\nTEST_F(ParseFlagsTest, PrintTimeFalse_F) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_print_time=F\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);\n}\n\n// Tests parsing --gtest_random_seed=number\nTEST_F(ParseFlagsTest, RandomSeed) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_random_seed=1000\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::RandomSeed(1000), false);\n}\n\n// Tests parsing --gtest_repeat=number\nTEST_F(ParseFlagsTest, Repeat) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_repeat=1000\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Repeat(1000), false);\n}\n\n// Tests having a --gtest_also_run_disabled_tests flag\nTEST_F(ParseFlagsTest, AlsoRunDisabledTestsFlag) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_also_run_disabled_tests\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2,\n                              Flags::AlsoRunDisabledTests(true), false);\n}\n\n// Tests having a --gtest_also_run_disabled_tests flag with a \"true\" value\nTEST_F(ParseFlagsTest, AlsoRunDisabledTestsTrue) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_also_run_disabled_tests=1\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2,\n                              Flags::AlsoRunDisabledTests(true), false);\n}\n\n// Tests having a --gtest_also_run_disabled_tests flag with a \"false\" value\nTEST_F(ParseFlagsTest, AlsoRunDisabledTestsFalse) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_also_run_disabled_tests=0\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2,\n                              Flags::AlsoRunDisabledTests(false), false);\n}\n\n// Tests parsing --gtest_shuffle.\nTEST_F(ParseFlagsTest, ShuffleWithoutValue) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_shuffle\",\n    NULL\n};\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true), false);\n}\n\n// Tests parsing --gtest_shuffle=0.\nTEST_F(ParseFlagsTest, ShuffleFalse_0) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_shuffle=0\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(false), false);\n}\n\n// Tests parsing a --gtest_shuffle flag that has a \"true\" definition.\nTEST_F(ParseFlagsTest, ShuffleTrue) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_shuffle=1\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true), false);\n}\n\n// Tests parsing --gtest_stack_trace_depth=number.\nTEST_F(ParseFlagsTest, StackTraceDepth) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_stack_trace_depth=5\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::StackTraceDepth(5), false);\n}\n\nTEST_F(ParseFlagsTest, StreamResultTo) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_stream_result_to=localhost:1234\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(\n      argv, argv2, Flags::StreamResultTo(\"localhost:1234\"), false);\n}\n\n// Tests parsing --gtest_throw_on_failure.\nTEST_F(ParseFlagsTest, ThrowOnFailureWithoutValue) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_throw_on_failure\",\n    NULL\n};\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(true), false);\n}\n\n// Tests parsing --gtest_throw_on_failure=0.\nTEST_F(ParseFlagsTest, ThrowOnFailureFalse_0) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_throw_on_failure=0\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(false), false);\n}\n\n// Tests parsing a --gtest_throw_on_failure flag that has a \"true\"\n// definition.\nTEST_F(ParseFlagsTest, ThrowOnFailureTrue) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_throw_on_failure=1\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(true), false);\n}\n\n# if GTEST_OS_WINDOWS\n// Tests parsing wide strings.\nTEST_F(ParseFlagsTest, WideStrings) {\n  const wchar_t* argv[] = {\n    L\"foo.exe\",\n    L\"--gtest_filter=Foo*\",\n    L\"--gtest_list_tests=1\",\n    L\"--gtest_break_on_failure\",\n    L\"--non_gtest_flag\",\n    NULL\n  };\n\n  const wchar_t* argv2[] = {\n    L\"foo.exe\",\n    L\"--non_gtest_flag\",\n    NULL\n  };\n\n  Flags expected_flags;\n  expected_flags.break_on_failure = true;\n  expected_flags.filter = \"Foo*\";\n  expected_flags.list_tests = true;\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, expected_flags, false);\n}\n# endif  // GTEST_OS_WINDOWS\n\n#if GTEST_USE_OWN_FLAGFILE_FLAG_\nclass FlagfileTest : public ParseFlagsTest {\n public:\n  virtual void SetUp() {\n    ParseFlagsTest::SetUp();\n\n    testdata_path_.Set(internal::FilePath(\n        testing::TempDir() + internal::GetCurrentExecutableName().string() +\n        \"_flagfile_test\"));\n    testing::internal::posix::RmDir(testdata_path_.c_str());\n    EXPECT_TRUE(testdata_path_.CreateFolder());\n  }\n\n  virtual void TearDown() {\n    testing::internal::posix::RmDir(testdata_path_.c_str());\n    ParseFlagsTest::TearDown();\n  }\n\n  internal::FilePath CreateFlagfile(const char* contents) {\n    internal::FilePath file_path(internal::FilePath::GenerateUniqueFileName(\n        testdata_path_, internal::FilePath(\"unique\"), \"txt\"));\n    FILE* f = testing::internal::posix::FOpen(file_path.c_str(), \"w\");\n    fprintf(f, \"%s\", contents);\n    fclose(f);\n    return file_path;\n  }\n\n private:\n  internal::FilePath testdata_path_;\n};\n\n// Tests an empty flagfile.\nTEST_F(FlagfileTest, Empty) {\n  internal::FilePath flagfile_path(CreateFlagfile(\"\"));\n  std::string flagfile_flag =\n      std::string(\"--\" GTEST_FLAG_PREFIX_ \"flagfile=\") + flagfile_path.c_str();\n\n  const char* argv[] = {\n    \"foo.exe\",\n    flagfile_flag.c_str(),\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false);\n}\n\n// Tests passing a non-empty --gtest_filter flag via --gtest_flagfile.\nTEST_F(FlagfileTest, FilterNonEmpty) {\n  internal::FilePath flagfile_path(CreateFlagfile(\n      \"--\"  GTEST_FLAG_PREFIX_  \"filter=abc\"));\n  std::string flagfile_flag =\n      std::string(\"--\" GTEST_FLAG_PREFIX_ \"flagfile=\") + flagfile_path.c_str();\n\n  const char* argv[] = {\n    \"foo.exe\",\n    flagfile_flag.c_str(),\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(\"abc\"), false);\n}\n\n// Tests passing several flags via --gtest_flagfile.\nTEST_F(FlagfileTest, SeveralFlags) {\n  internal::FilePath flagfile_path(CreateFlagfile(\n      \"--\"  GTEST_FLAG_PREFIX_  \"filter=abc\\n\"\n      \"--\"  GTEST_FLAG_PREFIX_  \"break_on_failure\\n\"\n      \"--\"  GTEST_FLAG_PREFIX_  \"list_tests\"));\n  std::string flagfile_flag =\n      std::string(\"--\" GTEST_FLAG_PREFIX_ \"flagfile=\") + flagfile_path.c_str();\n\n  const char* argv[] = {\n    \"foo.exe\",\n    flagfile_flag.c_str(),\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  Flags expected_flags;\n  expected_flags.break_on_failure = true;\n  expected_flags.filter = \"abc\";\n  expected_flags.list_tests = true;\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, expected_flags, false);\n}\n#endif  // GTEST_USE_OWN_FLAGFILE_FLAG_\n\n// Tests current_test_info() in UnitTest.\nclass CurrentTestInfoTest : public Test {\n protected:\n  // Tests that current_test_info() returns NULL before the first test in\n  // the test case is run.\n  static void SetUpTestCase() {\n    // There should be no tests running at this point.\n    const TestInfo* test_info =\n      UnitTest::GetInstance()->current_test_info();\n    EXPECT_TRUE(test_info == NULL)\n        << \"There should be no tests running at this point.\";\n  }\n\n  // Tests that current_test_info() returns NULL after the last test in\n  // the test case has run.\n  static void TearDownTestCase() {\n    const TestInfo* test_info =\n      UnitTest::GetInstance()->current_test_info();\n    EXPECT_TRUE(test_info == NULL)\n        << \"There should be no tests running at this point.\";\n  }\n};\n\n// Tests that current_test_info() returns TestInfo for currently running\n// test by checking the expected test name against the actual one.\nTEST_F(CurrentTestInfoTest, WorksForFirstTestInATestCase) {\n  const TestInfo* test_info =\n    UnitTest::GetInstance()->current_test_info();\n  ASSERT_TRUE(NULL != test_info)\n      << \"There is a test running so we should have a valid TestInfo.\";\n  EXPECT_STREQ(\"CurrentTestInfoTest\", test_info->test_case_name())\n      << \"Expected the name of the currently running test case.\";\n  EXPECT_STREQ(\"WorksForFirstTestInATestCase\", test_info->name())\n      << \"Expected the name of the currently running test.\";\n}\n\n// Tests that current_test_info() returns TestInfo for currently running\n// test by checking the expected test name against the actual one.  We\n// use this test to see that the TestInfo object actually changed from\n// the previous invocation.\nTEST_F(CurrentTestInfoTest, WorksForSecondTestInATestCase) {\n  const TestInfo* test_info =\n    UnitTest::GetInstance()->current_test_info();\n  ASSERT_TRUE(NULL != test_info)\n      << \"There is a test running so we should have a valid TestInfo.\";\n  EXPECT_STREQ(\"CurrentTestInfoTest\", test_info->test_case_name())\n      << \"Expected the name of the currently running test case.\";\n  EXPECT_STREQ(\"WorksForSecondTestInATestCase\", test_info->name())\n      << \"Expected the name of the currently running test.\";\n}\n\n}  // namespace testing\n\n\n// These two lines test that we can define tests in a namespace that\n// has the name \"testing\" and is nested in another namespace.\nnamespace my_namespace {\nnamespace testing {\n\n// Makes sure that TEST knows to use ::testing::Test instead of\n// ::my_namespace::testing::Test.\nclass Test {};\n\n// Makes sure that an assertion knows to use ::testing::Message instead of\n// ::my_namespace::testing::Message.\nclass Message {};\n\n// Makes sure that an assertion knows to use\n// ::testing::AssertionResult instead of\n// ::my_namespace::testing::AssertionResult.\nclass AssertionResult {};\n\n// Tests that an assertion that should succeed works as expected.\nTEST(NestedTestingNamespaceTest, Success) {\n  EXPECT_EQ(1, 1) << \"This shouldn't fail.\";\n}\n\n// Tests that an assertion that should fail works as expected.\nTEST(NestedTestingNamespaceTest, Failure) {\n  EXPECT_FATAL_FAILURE(FAIL() << \"This failure is expected.\",\n                       \"This failure is expected.\");\n}\n\n}  // namespace testing\n}  // namespace my_namespace\n\n// Tests that one can call superclass SetUp and TearDown methods--\n// that is, that they are not private.\n// No tests are based on this fixture; the test \"passes\" if it compiles\n// successfully.\nclass ProtectedFixtureMethodsTest : public Test {\n protected:\n  virtual void SetUp() {\n    Test::SetUp();\n  }\n  virtual void TearDown() {\n    Test::TearDown();\n  }\n};\n\n// StreamingAssertionsTest tests the streaming versions of a representative\n// sample of assertions.\nTEST(StreamingAssertionsTest, Unconditional) {\n  SUCCEED() << \"expected success\";\n  EXPECT_NONFATAL_FAILURE(ADD_FAILURE() << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(FAIL() << \"expected failure\",\n                       \"expected failure\");\n}\n\n#ifdef __BORLANDC__\n// Silences warnings: \"Condition is always true\", \"Unreachable code\"\n# pragma option push -w-ccc -w-rch\n#endif\n\nTEST(StreamingAssertionsTest, Truth) {\n  EXPECT_TRUE(true) << \"unexpected failure\";\n  ASSERT_TRUE(true) << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false) << \"expected failure\",\n                       \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, Truth2) {\n  EXPECT_FALSE(false) << \"unexpected failure\";\n  ASSERT_FALSE(false) << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_FALSE(true) << \"expected failure\",\n                       \"expected failure\");\n}\n\n#ifdef __BORLANDC__\n// Restores warnings after previous \"#pragma option push\" suppressed them\n# pragma option pop\n#endif\n\nTEST(StreamingAssertionsTest, IntegerEquals) {\n  EXPECT_EQ(1, 1) << \"unexpected failure\";\n  ASSERT_EQ(1, 1) << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(1, 2) << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(1, 2) << \"expected failure\",\n                       \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, IntegerLessThan) {\n  EXPECT_LT(1, 2) << \"unexpected failure\";\n  ASSERT_LT(1, 2) << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1) << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_LT(2, 1) << \"expected failure\",\n                       \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, StringsEqual) {\n  EXPECT_STREQ(\"foo\", \"foo\") << \"unexpected failure\";\n  ASSERT_STREQ(\"foo\", \"foo\") << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(\"foo\", \"bar\") << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_STREQ(\"foo\", \"bar\") << \"expected failure\",\n                       \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, StringsNotEqual) {\n  EXPECT_STRNE(\"foo\", \"bar\") << \"unexpected failure\";\n  ASSERT_STRNE(\"foo\", \"bar\") << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(\"foo\", \"foo\") << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_STRNE(\"foo\", \"foo\") << \"expected failure\",\n                       \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, StringsEqualIgnoringCase) {\n  EXPECT_STRCASEEQ(\"foo\", \"FOO\") << \"unexpected failure\";\n  ASSERT_STRCASEEQ(\"foo\", \"FOO\") << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ(\"foo\", \"bar\") << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ(\"foo\", \"bar\") << \"expected failure\",\n                       \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, StringNotEqualIgnoringCase) {\n  EXPECT_STRCASENE(\"foo\", \"bar\") << \"unexpected failure\";\n  ASSERT_STRCASENE(\"foo\", \"bar\") << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASENE(\"foo\", \"FOO\") << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE(\"bar\", \"BAR\") << \"expected failure\",\n                       \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, FloatingPointEquals) {\n  EXPECT_FLOAT_EQ(1.0, 1.0) << \"unexpected failure\";\n  ASSERT_FLOAT_EQ(1.0, 1.0) << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(0.0, 1.0) << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.0) << \"expected failure\",\n                       \"expected failure\");\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\nTEST(StreamingAssertionsTest, Throw) {\n  EXPECT_THROW(ThrowAnInteger(), int) << \"unexpected failure\";\n  ASSERT_THROW(ThrowAnInteger(), int) << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(ThrowAnInteger(), bool) <<\n                          \"expected failure\", \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_THROW(ThrowAnInteger(), bool) <<\n                       \"expected failure\", \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, NoThrow) {\n  EXPECT_NO_THROW(ThrowNothing()) << \"unexpected failure\";\n  ASSERT_NO_THROW(ThrowNothing()) << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(ThrowAnInteger()) <<\n                          \"expected failure\", \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_NO_THROW(ThrowAnInteger()) <<\n                       \"expected failure\", \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, AnyThrow) {\n  EXPECT_ANY_THROW(ThrowAnInteger()) << \"unexpected failure\";\n  ASSERT_ANY_THROW(ThrowAnInteger()) << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(ThrowNothing()) <<\n                          \"expected failure\", \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_ANY_THROW(ThrowNothing()) <<\n                       \"expected failure\", \"expected failure\");\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// Tests that Google Test correctly decides whether to use colors in the output.\n\nTEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsYes) {\n  GTEST_FLAG(color) = \"yes\";\n\n  SetEnv(\"TERM\", \"xterm\");  // TERM supports colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.\n\n  SetEnv(\"TERM\", \"dumb\");  // TERM doesn't support colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.\n}\n\nTEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsAliasOfYes) {\n  SetEnv(\"TERM\", \"dumb\");  // TERM doesn't support colors.\n\n  GTEST_FLAG(color) = \"True\";\n  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.\n\n  GTEST_FLAG(color) = \"t\";\n  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.\n\n  GTEST_FLAG(color) = \"1\";\n  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.\n}\n\nTEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsNo) {\n  GTEST_FLAG(color) = \"no\";\n\n  SetEnv(\"TERM\", \"xterm\");  // TERM supports colors.\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.\n\n  SetEnv(\"TERM\", \"dumb\");  // TERM doesn't support colors.\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.\n}\n\nTEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsInvalid) {\n  SetEnv(\"TERM\", \"xterm\");  // TERM supports colors.\n\n  GTEST_FLAG(color) = \"F\";\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  GTEST_FLAG(color) = \"0\";\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  GTEST_FLAG(color) = \"unknown\";\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n}\n\nTEST(ColoredOutputTest, UsesColorsWhenStdoutIsTty) {\n  GTEST_FLAG(color) = \"auto\";\n\n  SetEnv(\"TERM\", \"xterm\");  // TERM supports colors.\n  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.\n  EXPECT_TRUE(ShouldUseColor(true));    // Stdout is a TTY.\n}\n\nTEST(ColoredOutputTest, UsesColorsWhenTermSupportsColors) {\n  GTEST_FLAG(color) = \"auto\";\n\n#if GTEST_OS_WINDOWS\n  // On Windows, we ignore the TERM variable as it's usually not set.\n\n  SetEnv(\"TERM\", \"dumb\");\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"\");\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"xterm\");\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n#else\n  // On non-Windows platforms, we rely on TERM to determine if the\n  // terminal supports colors.\n\n  SetEnv(\"TERM\", \"dumb\");  // TERM doesn't support colors.\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"emacs\");  // TERM doesn't support colors.\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"vt100\");  // TERM doesn't support colors.\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"xterm-mono\");  // TERM doesn't support colors.\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"xterm\");  // TERM supports colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"xterm-color\");  // TERM supports colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"xterm-256color\");  // TERM supports colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"screen\");  // TERM supports colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"screen-256color\");  // TERM supports colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"tmux\");  // TERM supports colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"tmux-256color\");  // TERM supports colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"rxvt-unicode\");  // TERM supports colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"rxvt-unicode-256color\");  // TERM supports colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"linux\");  // TERM supports colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"cygwin\");  // TERM supports colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n#endif  // GTEST_OS_WINDOWS\n}\n\n// Verifies that StaticAssertTypeEq works in a namespace scope.\n\nstatic bool dummy1 GTEST_ATTRIBUTE_UNUSED_ = StaticAssertTypeEq<bool, bool>();\nstatic bool dummy2 GTEST_ATTRIBUTE_UNUSED_ =\n    StaticAssertTypeEq<const int, const int>();\n\n// Verifies that StaticAssertTypeEq works in a class.\n\ntemplate <typename T>\nclass StaticAssertTypeEqTestHelper {\n public:\n  StaticAssertTypeEqTestHelper() { StaticAssertTypeEq<bool, T>(); }\n};\n\nTEST(StaticAssertTypeEqTest, WorksInClass) {\n  StaticAssertTypeEqTestHelper<bool>();\n}\n\n// Verifies that StaticAssertTypeEq works inside a function.\n\ntypedef int IntAlias;\n\nTEST(StaticAssertTypeEqTest, CompilesForEqualTypes) {\n  StaticAssertTypeEq<int, IntAlias>();\n  StaticAssertTypeEq<int*, IntAlias*>();\n}\n\nTEST(HasNonfatalFailureTest, ReturnsFalseWhenThereIsNoFailure) {\n  EXPECT_FALSE(HasNonfatalFailure());\n}\n\nstatic void FailFatally() { FAIL(); }\n\nTEST(HasNonfatalFailureTest, ReturnsFalseWhenThereIsOnlyFatalFailure) {\n  FailFatally();\n  const bool has_nonfatal_failure = HasNonfatalFailure();\n  ClearCurrentTestPartResults();\n  EXPECT_FALSE(has_nonfatal_failure);\n}\n\nTEST(HasNonfatalFailureTest, ReturnsTrueWhenThereIsNonfatalFailure) {\n  ADD_FAILURE();\n  const bool has_nonfatal_failure = HasNonfatalFailure();\n  ClearCurrentTestPartResults();\n  EXPECT_TRUE(has_nonfatal_failure);\n}\n\nTEST(HasNonfatalFailureTest, ReturnsTrueWhenThereAreFatalAndNonfatalFailures) {\n  FailFatally();\n  ADD_FAILURE();\n  const bool has_nonfatal_failure = HasNonfatalFailure();\n  ClearCurrentTestPartResults();\n  EXPECT_TRUE(has_nonfatal_failure);\n}\n\n// A wrapper for calling HasNonfatalFailure outside of a test body.\nstatic bool HasNonfatalFailureHelper() {\n  return testing::Test::HasNonfatalFailure();\n}\n\nTEST(HasNonfatalFailureTest, WorksOutsideOfTestBody) {\n  EXPECT_FALSE(HasNonfatalFailureHelper());\n}\n\nTEST(HasNonfatalFailureTest, WorksOutsideOfTestBody2) {\n  ADD_FAILURE();\n  const bool has_nonfatal_failure = HasNonfatalFailureHelper();\n  ClearCurrentTestPartResults();\n  EXPECT_TRUE(has_nonfatal_failure);\n}\n\nTEST(HasFailureTest, ReturnsFalseWhenThereIsNoFailure) {\n  EXPECT_FALSE(HasFailure());\n}\n\nTEST(HasFailureTest, ReturnsTrueWhenThereIsFatalFailure) {\n  FailFatally();\n  const bool has_failure = HasFailure();\n  ClearCurrentTestPartResults();\n  EXPECT_TRUE(has_failure);\n}\n\nTEST(HasFailureTest, ReturnsTrueWhenThereIsNonfatalFailure) {\n  ADD_FAILURE();\n  const bool has_failure = HasFailure();\n  ClearCurrentTestPartResults();\n  EXPECT_TRUE(has_failure);\n}\n\nTEST(HasFailureTest, ReturnsTrueWhenThereAreFatalAndNonfatalFailures) {\n  FailFatally();\n  ADD_FAILURE();\n  const bool has_failure = HasFailure();\n  ClearCurrentTestPartResults();\n  EXPECT_TRUE(has_failure);\n}\n\n// A wrapper for calling HasFailure outside of a test body.\nstatic bool HasFailureHelper() { return testing::Test::HasFailure(); }\n\nTEST(HasFailureTest, WorksOutsideOfTestBody) {\n  EXPECT_FALSE(HasFailureHelper());\n}\n\nTEST(HasFailureTest, WorksOutsideOfTestBody2) {\n  ADD_FAILURE();\n  const bool has_failure = HasFailureHelper();\n  ClearCurrentTestPartResults();\n  EXPECT_TRUE(has_failure);\n}\n\nclass TestListener : public EmptyTestEventListener {\n public:\n  TestListener() : on_start_counter_(NULL), is_destroyed_(NULL) {}\n  TestListener(int* on_start_counter, bool* is_destroyed)\n      : on_start_counter_(on_start_counter),\n        is_destroyed_(is_destroyed) {}\n\n  virtual ~TestListener() {\n    if (is_destroyed_)\n      *is_destroyed_ = true;\n  }\n\n protected:\n  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {\n    if (on_start_counter_ != NULL)\n      (*on_start_counter_)++;\n  }\n\n private:\n  int* on_start_counter_;\n  bool* is_destroyed_;\n};\n\n// Tests the constructor.\nTEST(TestEventListenersTest, ConstructionWorks) {\n  TestEventListeners listeners;\n\n  EXPECT_TRUE(TestEventListenersAccessor::GetRepeater(&listeners) != NULL);\n  EXPECT_TRUE(listeners.default_result_printer() == NULL);\n  EXPECT_TRUE(listeners.default_xml_generator() == NULL);\n}\n\n// Tests that the TestEventListeners destructor deletes all the listeners it\n// owns.\nTEST(TestEventListenersTest, DestructionWorks) {\n  bool default_result_printer_is_destroyed = false;\n  bool default_xml_printer_is_destroyed = false;\n  bool extra_listener_is_destroyed = false;\n  TestListener* default_result_printer = new TestListener(\n      NULL, &default_result_printer_is_destroyed);\n  TestListener* default_xml_printer = new TestListener(\n      NULL, &default_xml_printer_is_destroyed);\n  TestListener* extra_listener = new TestListener(\n      NULL, &extra_listener_is_destroyed);\n\n  {\n    TestEventListeners listeners;\n    TestEventListenersAccessor::SetDefaultResultPrinter(&listeners,\n                                                        default_result_printer);\n    TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners,\n                                                       default_xml_printer);\n    listeners.Append(extra_listener);\n  }\n  EXPECT_TRUE(default_result_printer_is_destroyed);\n  EXPECT_TRUE(default_xml_printer_is_destroyed);\n  EXPECT_TRUE(extra_listener_is_destroyed);\n}\n\n// Tests that a listener Append'ed to a TestEventListeners list starts\n// receiving events.\nTEST(TestEventListenersTest, Append) {\n  int on_start_counter = 0;\n  bool is_destroyed = false;\n  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);\n  {\n    TestEventListeners listeners;\n    listeners.Append(listener);\n    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n        *UnitTest::GetInstance());\n    EXPECT_EQ(1, on_start_counter);\n  }\n  EXPECT_TRUE(is_destroyed);\n}\n\n// Tests that listeners receive events in the order they were appended to\n// the list, except for *End requests, which must be received in the reverse\n// order.\nclass SequenceTestingListener : public EmptyTestEventListener {\n public:\n  SequenceTestingListener(std::vector<std::string>* vector, const char* id)\n      : vector_(vector), id_(id) {}\n\n protected:\n  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {\n    vector_->push_back(GetEventDescription(\"OnTestProgramStart\"));\n  }\n\n  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {\n    vector_->push_back(GetEventDescription(\"OnTestProgramEnd\"));\n  }\n\n  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,\n                                    int /*iteration*/) {\n    vector_->push_back(GetEventDescription(\"OnTestIterationStart\"));\n  }\n\n  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,\n                                  int /*iteration*/) {\n    vector_->push_back(GetEventDescription(\"OnTestIterationEnd\"));\n  }\n\n private:\n  std::string GetEventDescription(const char* method) {\n    Message message;\n    message << id_ << \".\" << method;\n    return message.GetString();\n  }\n\n  std::vector<std::string>* vector_;\n  const char* const id_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(SequenceTestingListener);\n};\n\nTEST(EventListenerTest, AppendKeepsOrder) {\n  std::vector<std::string> vec;\n  TestEventListeners listeners;\n  listeners.Append(new SequenceTestingListener(&vec, \"1st\"));\n  listeners.Append(new SequenceTestingListener(&vec, \"2nd\"));\n  listeners.Append(new SequenceTestingListener(&vec, \"3rd\"));\n\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n      *UnitTest::GetInstance());\n  ASSERT_EQ(3U, vec.size());\n  EXPECT_STREQ(\"1st.OnTestProgramStart\", vec[0].c_str());\n  EXPECT_STREQ(\"2nd.OnTestProgramStart\", vec[1].c_str());\n  EXPECT_STREQ(\"3rd.OnTestProgramStart\", vec[2].c_str());\n\n  vec.clear();\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramEnd(\n      *UnitTest::GetInstance());\n  ASSERT_EQ(3U, vec.size());\n  EXPECT_STREQ(\"3rd.OnTestProgramEnd\", vec[0].c_str());\n  EXPECT_STREQ(\"2nd.OnTestProgramEnd\", vec[1].c_str());\n  EXPECT_STREQ(\"1st.OnTestProgramEnd\", vec[2].c_str());\n\n  vec.clear();\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestIterationStart(\n      *UnitTest::GetInstance(), 0);\n  ASSERT_EQ(3U, vec.size());\n  EXPECT_STREQ(\"1st.OnTestIterationStart\", vec[0].c_str());\n  EXPECT_STREQ(\"2nd.OnTestIterationStart\", vec[1].c_str());\n  EXPECT_STREQ(\"3rd.OnTestIterationStart\", vec[2].c_str());\n\n  vec.clear();\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestIterationEnd(\n      *UnitTest::GetInstance(), 0);\n  ASSERT_EQ(3U, vec.size());\n  EXPECT_STREQ(\"3rd.OnTestIterationEnd\", vec[0].c_str());\n  EXPECT_STREQ(\"2nd.OnTestIterationEnd\", vec[1].c_str());\n  EXPECT_STREQ(\"1st.OnTestIterationEnd\", vec[2].c_str());\n}\n\n// Tests that a listener removed from a TestEventListeners list stops receiving\n// events and is not deleted when the list is destroyed.\nTEST(TestEventListenersTest, Release) {\n  int on_start_counter = 0;\n  bool is_destroyed = false;\n  // Although Append passes the ownership of this object to the list,\n  // the following calls release it, and we need to delete it before the\n  // test ends.\n  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);\n  {\n    TestEventListeners listeners;\n    listeners.Append(listener);\n    EXPECT_EQ(listener, listeners.Release(listener));\n    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n        *UnitTest::GetInstance());\n    EXPECT_TRUE(listeners.Release(listener) == NULL);\n  }\n  EXPECT_EQ(0, on_start_counter);\n  EXPECT_FALSE(is_destroyed);\n  delete listener;\n}\n\n// Tests that no events are forwarded when event forwarding is disabled.\nTEST(EventListenerTest, SuppressEventForwarding) {\n  int on_start_counter = 0;\n  TestListener* listener = new TestListener(&on_start_counter, NULL);\n\n  TestEventListeners listeners;\n  listeners.Append(listener);\n  ASSERT_TRUE(TestEventListenersAccessor::EventForwardingEnabled(listeners));\n  TestEventListenersAccessor::SuppressEventForwarding(&listeners);\n  ASSERT_FALSE(TestEventListenersAccessor::EventForwardingEnabled(listeners));\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n      *UnitTest::GetInstance());\n  EXPECT_EQ(0, on_start_counter);\n}\n\n// Tests that events generated by Google Test are not forwarded in\n// death test subprocesses.\nTEST(EventListenerDeathTest, EventsNotForwardedInDeathTestSubprecesses) {\n  EXPECT_DEATH_IF_SUPPORTED({\n      GTEST_CHECK_(TestEventListenersAccessor::EventForwardingEnabled(\n          *GetUnitTestImpl()->listeners())) << \"expected failure\";},\n      \"expected failure\");\n}\n\n// Tests that a listener installed via SetDefaultResultPrinter() starts\n// receiving events and is returned via default_result_printer() and that\n// the previous default_result_printer is removed from the list and deleted.\nTEST(EventListenerTest, default_result_printer) {\n  int on_start_counter = 0;\n  bool is_destroyed = false;\n  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);\n\n  TestEventListeners listeners;\n  TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, listener);\n\n  EXPECT_EQ(listener, listeners.default_result_printer());\n\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n      *UnitTest::GetInstance());\n\n  EXPECT_EQ(1, on_start_counter);\n\n  // Replacing default_result_printer with something else should remove it\n  // from the list and destroy it.\n  TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, NULL);\n\n  EXPECT_TRUE(listeners.default_result_printer() == NULL);\n  EXPECT_TRUE(is_destroyed);\n\n  // After broadcasting an event the counter is still the same, indicating\n  // the listener is not in the list anymore.\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n      *UnitTest::GetInstance());\n  EXPECT_EQ(1, on_start_counter);\n}\n\n// Tests that the default_result_printer listener stops receiving events\n// when removed via Release and that is not owned by the list anymore.\nTEST(EventListenerTest, RemovingDefaultResultPrinterWorks) {\n  int on_start_counter = 0;\n  bool is_destroyed = false;\n  // Although Append passes the ownership of this object to the list,\n  // the following calls release it, and we need to delete it before the\n  // test ends.\n  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);\n  {\n    TestEventListeners listeners;\n    TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, listener);\n\n    EXPECT_EQ(listener, listeners.Release(listener));\n    EXPECT_TRUE(listeners.default_result_printer() == NULL);\n    EXPECT_FALSE(is_destroyed);\n\n    // Broadcasting events now should not affect default_result_printer.\n    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n        *UnitTest::GetInstance());\n    EXPECT_EQ(0, on_start_counter);\n  }\n  // Destroying the list should not affect the listener now, too.\n  EXPECT_FALSE(is_destroyed);\n  delete listener;\n}\n\n// Tests that a listener installed via SetDefaultXmlGenerator() starts\n// receiving events and is returned via default_xml_generator() and that\n// the previous default_xml_generator is removed from the list and deleted.\nTEST(EventListenerTest, default_xml_generator) {\n  int on_start_counter = 0;\n  bool is_destroyed = false;\n  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);\n\n  TestEventListeners listeners;\n  TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, listener);\n\n  EXPECT_EQ(listener, listeners.default_xml_generator());\n\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n      *UnitTest::GetInstance());\n\n  EXPECT_EQ(1, on_start_counter);\n\n  // Replacing default_xml_generator with something else should remove it\n  // from the list and destroy it.\n  TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, NULL);\n\n  EXPECT_TRUE(listeners.default_xml_generator() == NULL);\n  EXPECT_TRUE(is_destroyed);\n\n  // After broadcasting an event the counter is still the same, indicating\n  // the listener is not in the list anymore.\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n      *UnitTest::GetInstance());\n  EXPECT_EQ(1, on_start_counter);\n}\n\n// Tests that the default_xml_generator listener stops receiving events\n// when removed via Release and that is not owned by the list anymore.\nTEST(EventListenerTest, RemovingDefaultXmlGeneratorWorks) {\n  int on_start_counter = 0;\n  bool is_destroyed = false;\n  // Although Append passes the ownership of this object to the list,\n  // the following calls release it, and we need to delete it before the\n  // test ends.\n  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);\n  {\n    TestEventListeners listeners;\n    TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, listener);\n\n    EXPECT_EQ(listener, listeners.Release(listener));\n    EXPECT_TRUE(listeners.default_xml_generator() == NULL);\n    EXPECT_FALSE(is_destroyed);\n\n    // Broadcasting events now should not affect default_xml_generator.\n    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n        *UnitTest::GetInstance());\n    EXPECT_EQ(0, on_start_counter);\n  }\n  // Destroying the list should not affect the listener now, too.\n  EXPECT_FALSE(is_destroyed);\n  delete listener;\n}\n\n// Sanity tests to ensure that the alternative, verbose spellings of\n// some of the macros work.  We don't test them thoroughly as that\n// would be quite involved.  Since their implementations are\n// straightforward, and they are rarely used, we'll just rely on the\n// users to tell us when they are broken.\nGTEST_TEST(AlternativeNameTest, Works) {  // GTEST_TEST is the same as TEST.\n  GTEST_SUCCEED() << \"OK\";  // GTEST_SUCCEED is the same as SUCCEED.\n\n  // GTEST_FAIL is the same as FAIL.\n  EXPECT_FATAL_FAILURE(GTEST_FAIL() << \"An expected failure\",\n                       \"An expected failure\");\n\n  // GTEST_ASSERT_XY is the same as ASSERT_XY.\n\n  GTEST_ASSERT_EQ(0, 0);\n  EXPECT_FATAL_FAILURE(GTEST_ASSERT_EQ(0, 1) << \"An expected failure\",\n                       \"An expected failure\");\n  EXPECT_FATAL_FAILURE(GTEST_ASSERT_EQ(1, 0) << \"An expected failure\",\n                       \"An expected failure\");\n\n  GTEST_ASSERT_NE(0, 1);\n  GTEST_ASSERT_NE(1, 0);\n  EXPECT_FATAL_FAILURE(GTEST_ASSERT_NE(0, 0) << \"An expected failure\",\n                       \"An expected failure\");\n\n  GTEST_ASSERT_LE(0, 0);\n  GTEST_ASSERT_LE(0, 1);\n  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LE(1, 0) << \"An expected failure\",\n                       \"An expected failure\");\n\n  GTEST_ASSERT_LT(0, 1);\n  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LT(0, 0) << \"An expected failure\",\n                       \"An expected failure\");\n  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LT(1, 0) << \"An expected failure\",\n                       \"An expected failure\");\n\n  GTEST_ASSERT_GE(0, 0);\n  GTEST_ASSERT_GE(1, 0);\n  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GE(0, 1) << \"An expected failure\",\n                       \"An expected failure\");\n\n  GTEST_ASSERT_GT(1, 0);\n  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GT(0, 1) << \"An expected failure\",\n                       \"An expected failure\");\n  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GT(1, 1) << \"An expected failure\",\n                       \"An expected failure\");\n}\n\n// Tests for internal utilities necessary for implementation of the universal\n// printing.\n// FIXME: Find a better home for them.\n\nclass ConversionHelperBase {};\nclass ConversionHelperDerived : public ConversionHelperBase {};\n\n// Tests that IsAProtocolMessage<T>::value is a compile-time constant.\nTEST(IsAProtocolMessageTest, ValueIsCompileTimeConstant) {\n  GTEST_COMPILE_ASSERT_(IsAProtocolMessage<ProtocolMessage>::value,\n                        const_true);\n  GTEST_COMPILE_ASSERT_(!IsAProtocolMessage<int>::value, const_false);\n}\n\n// Tests that IsAProtocolMessage<T>::value is true when T is\n// proto2::Message or a sub-class of it.\nTEST(IsAProtocolMessageTest, ValueIsTrueWhenTypeIsAProtocolMessage) {\n  EXPECT_TRUE(IsAProtocolMessage< ::proto2::Message>::value);\n  EXPECT_TRUE(IsAProtocolMessage<ProtocolMessage>::value);\n}\n\n// Tests that IsAProtocolMessage<T>::value is false when T is neither\n// ProtocolMessage nor a sub-class of it.\nTEST(IsAProtocolMessageTest, ValueIsFalseWhenTypeIsNotAProtocolMessage) {\n  EXPECT_FALSE(IsAProtocolMessage<int>::value);\n  EXPECT_FALSE(IsAProtocolMessage<const ConversionHelperBase>::value);\n}\n\n// Tests that CompileAssertTypesEqual compiles when the type arguments are\n// equal.\nTEST(CompileAssertTypesEqual, CompilesWhenTypesAreEqual) {\n  CompileAssertTypesEqual<void, void>();\n  CompileAssertTypesEqual<int*, int*>();\n}\n\n// Tests that RemoveReference does not affect non-reference types.\nTEST(RemoveReferenceTest, DoesNotAffectNonReferenceType) {\n  CompileAssertTypesEqual<int, RemoveReference<int>::type>();\n  CompileAssertTypesEqual<const char, RemoveReference<const char>::type>();\n}\n\n// Tests that RemoveReference removes reference from reference types.\nTEST(RemoveReferenceTest, RemovesReference) {\n  CompileAssertTypesEqual<int, RemoveReference<int&>::type>();\n  CompileAssertTypesEqual<const char, RemoveReference<const char&>::type>();\n}\n\n// Tests GTEST_REMOVE_REFERENCE_.\n\ntemplate <typename T1, typename T2>\nvoid TestGTestRemoveReference() {\n  CompileAssertTypesEqual<T1, GTEST_REMOVE_REFERENCE_(T2)>();\n}\n\nTEST(RemoveReferenceTest, MacroVersion) {\n  TestGTestRemoveReference<int, int>();\n  TestGTestRemoveReference<const char, const char&>();\n}\n\n\n// Tests that RemoveConst does not affect non-const types.\nTEST(RemoveConstTest, DoesNotAffectNonConstType) {\n  CompileAssertTypesEqual<int, RemoveConst<int>::type>();\n  CompileAssertTypesEqual<char&, RemoveConst<char&>::type>();\n}\n\n// Tests that RemoveConst removes const from const types.\nTEST(RemoveConstTest, RemovesConst) {\n  CompileAssertTypesEqual<int, RemoveConst<const int>::type>();\n  CompileAssertTypesEqual<char[2], RemoveConst<const char[2]>::type>();\n  CompileAssertTypesEqual<char[2][3], RemoveConst<const char[2][3]>::type>();\n}\n\n// Tests GTEST_REMOVE_CONST_.\n\ntemplate <typename T1, typename T2>\nvoid TestGTestRemoveConst() {\n  CompileAssertTypesEqual<T1, GTEST_REMOVE_CONST_(T2)>();\n}\n\nTEST(RemoveConstTest, MacroVersion) {\n  TestGTestRemoveConst<int, int>();\n  TestGTestRemoveConst<double&, double&>();\n  TestGTestRemoveConst<char, const char>();\n}\n\n// Tests GTEST_REMOVE_REFERENCE_AND_CONST_.\n\ntemplate <typename T1, typename T2>\nvoid TestGTestRemoveReferenceAndConst() {\n  CompileAssertTypesEqual<T1, GTEST_REMOVE_REFERENCE_AND_CONST_(T2)>();\n}\n\nTEST(RemoveReferenceToConstTest, Works) {\n  TestGTestRemoveReferenceAndConst<int, int>();\n  TestGTestRemoveReferenceAndConst<double, double&>();\n  TestGTestRemoveReferenceAndConst<char, const char>();\n  TestGTestRemoveReferenceAndConst<char, const char&>();\n  TestGTestRemoveReferenceAndConst<const char*, const char*>();\n}\n\n// Tests that AddReference does not affect reference types.\nTEST(AddReferenceTest, DoesNotAffectReferenceType) {\n  CompileAssertTypesEqual<int&, AddReference<int&>::type>();\n  CompileAssertTypesEqual<const char&, AddReference<const char&>::type>();\n}\n\n// Tests that AddReference adds reference to non-reference types.\nTEST(AddReferenceTest, AddsReference) {\n  CompileAssertTypesEqual<int&, AddReference<int>::type>();\n  CompileAssertTypesEqual<const char&, AddReference<const char>::type>();\n}\n\n// Tests GTEST_ADD_REFERENCE_.\n\ntemplate <typename T1, typename T2>\nvoid TestGTestAddReference() {\n  CompileAssertTypesEqual<T1, GTEST_ADD_REFERENCE_(T2)>();\n}\n\nTEST(AddReferenceTest, MacroVersion) {\n  TestGTestAddReference<int&, int>();\n  TestGTestAddReference<const char&, const char&>();\n}\n\n// Tests GTEST_REFERENCE_TO_CONST_.\n\ntemplate <typename T1, typename T2>\nvoid TestGTestReferenceToConst() {\n  CompileAssertTypesEqual<T1, GTEST_REFERENCE_TO_CONST_(T2)>();\n}\n\nTEST(GTestReferenceToConstTest, Works) {\n  TestGTestReferenceToConst<const char&, char>();\n  TestGTestReferenceToConst<const int&, const int>();\n  TestGTestReferenceToConst<const double&, double>();\n  TestGTestReferenceToConst<const std::string&, const std::string&>();\n}\n\n// Tests that ImplicitlyConvertible<T1, T2>::value is a compile-time constant.\nTEST(ImplicitlyConvertibleTest, ValueIsCompileTimeConstant) {\n  GTEST_COMPILE_ASSERT_((ImplicitlyConvertible<int, int>::value), const_true);\n  GTEST_COMPILE_ASSERT_((!ImplicitlyConvertible<void*, int*>::value),\n                        const_false);\n}\n\n// Tests that ImplicitlyConvertible<T1, T2>::value is true when T1 can\n// be implicitly converted to T2.\nTEST(ImplicitlyConvertibleTest, ValueIsTrueWhenConvertible) {\n  EXPECT_TRUE((ImplicitlyConvertible<int, double>::value));\n  EXPECT_TRUE((ImplicitlyConvertible<double, int>::value));\n  EXPECT_TRUE((ImplicitlyConvertible<int*, void*>::value));\n  EXPECT_TRUE((ImplicitlyConvertible<int*, const int*>::value));\n  EXPECT_TRUE((ImplicitlyConvertible<ConversionHelperDerived&,\n                                     const ConversionHelperBase&>::value));\n  EXPECT_TRUE((ImplicitlyConvertible<const ConversionHelperBase,\n                                     ConversionHelperBase>::value));\n}\n\n// Tests that ImplicitlyConvertible<T1, T2>::value is false when T1\n// cannot be implicitly converted to T2.\nTEST(ImplicitlyConvertibleTest, ValueIsFalseWhenNotConvertible) {\n  EXPECT_FALSE((ImplicitlyConvertible<double, int*>::value));\n  EXPECT_FALSE((ImplicitlyConvertible<void*, int*>::value));\n  EXPECT_FALSE((ImplicitlyConvertible<const int*, int*>::value));\n  EXPECT_FALSE((ImplicitlyConvertible<ConversionHelperBase&,\n                                      ConversionHelperDerived&>::value));\n}\n\n// Tests IsContainerTest.\n\nclass NonContainer {};\n\nTEST(IsContainerTestTest, WorksForNonContainer) {\n  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<int>(0)));\n  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<char[5]>(0)));\n  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<NonContainer>(0)));\n}\n\nTEST(IsContainerTestTest, WorksForContainer) {\n  EXPECT_EQ(sizeof(IsContainer),\n            sizeof(IsContainerTest<std::vector<bool> >(0)));\n  EXPECT_EQ(sizeof(IsContainer),\n            sizeof(IsContainerTest<std::map<int, double> >(0)));\n}\n\n#if GTEST_LANG_CXX11\nstruct ConstOnlyContainerWithPointerIterator {\n  using const_iterator = int*;\n  const_iterator begin() const;\n  const_iterator end() const;\n};\n\nstruct ConstOnlyContainerWithClassIterator {\n  struct const_iterator {\n    const int& operator*() const;\n    const_iterator& operator++(/* pre-increment */);\n  };\n  const_iterator begin() const;\n  const_iterator end() const;\n};\n\nTEST(IsContainerTestTest, ConstOnlyContainer) {\n  EXPECT_EQ(sizeof(IsContainer),\n            sizeof(IsContainerTest<ConstOnlyContainerWithPointerIterator>(0)));\n  EXPECT_EQ(sizeof(IsContainer),\n            sizeof(IsContainerTest<ConstOnlyContainerWithClassIterator>(0)));\n}\n#endif  // GTEST_LANG_CXX11\n\n// Tests IsHashTable.\nstruct AHashTable {\n  typedef void hasher;\n};\nstruct NotReallyAHashTable {\n  typedef void hasher;\n  typedef void reverse_iterator;\n};\nTEST(IsHashTable, Basic) {\n  EXPECT_TRUE(testing::internal::IsHashTable<AHashTable>::value);\n  EXPECT_FALSE(testing::internal::IsHashTable<NotReallyAHashTable>::value);\n#if GTEST_LANG_CXX11\n  EXPECT_FALSE(testing::internal::IsHashTable<std::vector<int>>::value);\n  EXPECT_TRUE(testing::internal::IsHashTable<std::unordered_set<int>>::value);\n#endif  // GTEST_LANG_CXX11\n#if GTEST_HAS_HASH_SET_\n  EXPECT_TRUE(testing::internal::IsHashTable<__gnu_cxx::hash_set<int>>::value);\n#endif  // GTEST_HAS_HASH_SET_\n}\n\n// Tests ArrayEq().\n\nTEST(ArrayEqTest, WorksForDegeneratedArrays) {\n  EXPECT_TRUE(ArrayEq(5, 5L));\n  EXPECT_FALSE(ArrayEq('a', 0));\n}\n\nTEST(ArrayEqTest, WorksForOneDimensionalArrays) {\n  // Note that a and b are distinct but compatible types.\n  const int a[] = { 0, 1 };\n  long b[] = { 0, 1 };\n  EXPECT_TRUE(ArrayEq(a, b));\n  EXPECT_TRUE(ArrayEq(a, 2, b));\n\n  b[0] = 2;\n  EXPECT_FALSE(ArrayEq(a, b));\n  EXPECT_FALSE(ArrayEq(a, 1, b));\n}\n\nTEST(ArrayEqTest, WorksForTwoDimensionalArrays) {\n  const char a[][3] = { \"hi\", \"lo\" };\n  const char b[][3] = { \"hi\", \"lo\" };\n  const char c[][3] = { \"hi\", \"li\" };\n\n  EXPECT_TRUE(ArrayEq(a, b));\n  EXPECT_TRUE(ArrayEq(a, 2, b));\n\n  EXPECT_FALSE(ArrayEq(a, c));\n  EXPECT_FALSE(ArrayEq(a, 2, c));\n}\n\n// Tests ArrayAwareFind().\n\nTEST(ArrayAwareFindTest, WorksForOneDimensionalArray) {\n  const char a[] = \"hello\";\n  EXPECT_EQ(a + 4, ArrayAwareFind(a, a + 5, 'o'));\n  EXPECT_EQ(a + 5, ArrayAwareFind(a, a + 5, 'x'));\n}\n\nTEST(ArrayAwareFindTest, WorksForTwoDimensionalArray) {\n  int a[][2] = { { 0, 1 }, { 2, 3 }, { 4, 5 } };\n  const int b[2] = { 2, 3 };\n  EXPECT_EQ(a + 1, ArrayAwareFind(a, a + 3, b));\n\n  const int c[2] = { 6, 7 };\n  EXPECT_EQ(a + 3, ArrayAwareFind(a, a + 3, c));\n}\n\n// Tests CopyArray().\n\nTEST(CopyArrayTest, WorksForDegeneratedArrays) {\n  int n = 0;\n  CopyArray('a', &n);\n  EXPECT_EQ('a', n);\n}\n\nTEST(CopyArrayTest, WorksForOneDimensionalArrays) {\n  const char a[3] = \"hi\";\n  int b[3];\n#ifndef __BORLANDC__  // C++Builder cannot compile some array size deductions.\n  CopyArray(a, &b);\n  EXPECT_TRUE(ArrayEq(a, b));\n#endif\n\n  int c[3];\n  CopyArray(a, 3, c);\n  EXPECT_TRUE(ArrayEq(a, c));\n}\n\nTEST(CopyArrayTest, WorksForTwoDimensionalArrays) {\n  const int a[2][3] = { { 0, 1, 2 }, { 3, 4, 5 } };\n  int b[2][3];\n#ifndef __BORLANDC__  // C++Builder cannot compile some array size deductions.\n  CopyArray(a, &b);\n  EXPECT_TRUE(ArrayEq(a, b));\n#endif\n\n  int c[2][3];\n  CopyArray(a, 2, c);\n  EXPECT_TRUE(ArrayEq(a, c));\n}\n\n// Tests NativeArray.\n\nTEST(NativeArrayTest, ConstructorFromArrayWorks) {\n  const int a[3] = { 0, 1, 2 };\n  NativeArray<int> na(a, 3, RelationToSourceReference());\n  EXPECT_EQ(3U, na.size());\n  EXPECT_EQ(a, na.begin());\n}\n\nTEST(NativeArrayTest, CreatesAndDeletesCopyOfArrayWhenAskedTo) {\n  typedef int Array[2];\n  Array* a = new Array[1];\n  (*a)[0] = 0;\n  (*a)[1] = 1;\n  NativeArray<int> na(*a, 2, RelationToSourceCopy());\n  EXPECT_NE(*a, na.begin());\n  delete[] a;\n  EXPECT_EQ(0, na.begin()[0]);\n  EXPECT_EQ(1, na.begin()[1]);\n\n  // We rely on the heap checker to verify that na deletes the copy of\n  // array.\n}\n\nTEST(NativeArrayTest, TypeMembersAreCorrect) {\n  StaticAssertTypeEq<char, NativeArray<char>::value_type>();\n  StaticAssertTypeEq<int[2], NativeArray<int[2]>::value_type>();\n\n  StaticAssertTypeEq<const char*, NativeArray<char>::const_iterator>();\n  StaticAssertTypeEq<const bool(*)[2], NativeArray<bool[2]>::const_iterator>();\n}\n\nTEST(NativeArrayTest, MethodsWork) {\n  const int a[3] = { 0, 1, 2 };\n  NativeArray<int> na(a, 3, RelationToSourceCopy());\n  ASSERT_EQ(3U, na.size());\n  EXPECT_EQ(3, na.end() - na.begin());\n\n  NativeArray<int>::const_iterator it = na.begin();\n  EXPECT_EQ(0, *it);\n  ++it;\n  EXPECT_EQ(1, *it);\n  it++;\n  EXPECT_EQ(2, *it);\n  ++it;\n  EXPECT_EQ(na.end(), it);\n\n  EXPECT_TRUE(na == na);\n\n  NativeArray<int> na2(a, 3, RelationToSourceReference());\n  EXPECT_TRUE(na == na2);\n\n  const int b1[3] = { 0, 1, 1 };\n  const int b2[4] = { 0, 1, 2, 3 };\n  EXPECT_FALSE(na == NativeArray<int>(b1, 3, RelationToSourceReference()));\n  EXPECT_FALSE(na == NativeArray<int>(b2, 4, RelationToSourceCopy()));\n}\n\nTEST(NativeArrayTest, WorksForTwoDimensionalArray) {\n  const char a[2][3] = { \"hi\", \"lo\" };\n  NativeArray<char[3]> na(a, 2, RelationToSourceReference());\n  ASSERT_EQ(2U, na.size());\n  EXPECT_EQ(a, na.begin());\n}\n\n// Tests SkipPrefix().\n\nTEST(SkipPrefixTest, SkipsWhenPrefixMatches) {\n  const char* const str = \"hello\";\n\n  const char* p = str;\n  EXPECT_TRUE(SkipPrefix(\"\", &p));\n  EXPECT_EQ(str, p);\n\n  p = str;\n  EXPECT_TRUE(SkipPrefix(\"hell\", &p));\n  EXPECT_EQ(str + 4, p);\n}\n\nTEST(SkipPrefixTest, DoesNotSkipWhenPrefixDoesNotMatch) {\n  const char* const str = \"world\";\n\n  const char* p = str;\n  EXPECT_FALSE(SkipPrefix(\"W\", &p));\n  EXPECT_EQ(str, p);\n\n  p = str;\n  EXPECT_FALSE(SkipPrefix(\"world!\", &p));\n  EXPECT_EQ(str, p);\n}\n\n// Tests ad_hoc_test_result().\n\nclass AdHocTestResultTest : public testing::Test {\n protected:\n  static void SetUpTestCase() {\n    FAIL() << \"A failure happened inside SetUpTestCase().\";\n  }\n};\n\nTEST_F(AdHocTestResultTest, AdHocTestResultForTestCaseShowsFailure) {\n  const testing::TestResult& test_result = testing::UnitTest::GetInstance()\n                                               ->current_test_case()\n                                               ->ad_hoc_test_result();\n  EXPECT_TRUE(test_result.Failed());\n}\n\nTEST_F(AdHocTestResultTest, AdHocTestResultTestForUnitTestDoesNotShowFailure) {\n  const testing::TestResult& test_result =\n      testing::UnitTest::GetInstance()->ad_hoc_test_result();\n  EXPECT_FALSE(test_result.Failed());\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_xml_outfile1_test_.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// gtest_xml_outfile1_test_ writes some xml via TestProperty used by\n// gtest_xml_outfiles_test.py\n\n#include \"gtest/gtest.h\"\n\nclass PropertyOne : public testing::Test {\n protected:\n  virtual void SetUp() {\n    RecordProperty(\"SetUpProp\", 1);\n  }\n  virtual void TearDown() {\n    RecordProperty(\"TearDownProp\", 1);\n  }\n};\n\nTEST_F(PropertyOne, TestSomeProperties) {\n  RecordProperty(\"TestSomeProperty\", 1);\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_xml_outfile2_test_.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// gtest_xml_outfile2_test_ writes some xml via TestProperty used by\n// gtest_xml_outfiles_test.py\n\n#include \"gtest/gtest.h\"\n\nclass PropertyTwo : public testing::Test {\n protected:\n  virtual void SetUp() {\n    RecordProperty(\"SetUpProp\", 2);\n  }\n  virtual void TearDown() {\n    RecordProperty(\"TearDownProp\", 2);\n  }\n};\n\nTEST_F(PropertyTwo, TestSomeProperties) {\n  RecordProperty(\"TestSomeProperty\", 2);\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_xml_outfiles_test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test for the gtest_xml_output module.\"\"\"\n\nimport os\nfrom xml.dom import minidom, Node\nimport gtest_test_utils\nimport gtest_xml_test_utils\n\nGTEST_OUTPUT_SUBDIR = \"xml_outfiles\"\nGTEST_OUTPUT_1_TEST = \"gtest_xml_outfile1_test_\"\nGTEST_OUTPUT_2_TEST = \"gtest_xml_outfile2_test_\"\n\nEXPECTED_XML_1 = \"\"\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\" timestamp=\"*\" name=\"AllTests\">\n  <testsuite name=\"PropertyOne\" tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"TestSomeProperties\" status=\"run\" time=\"*\" classname=\"PropertyOne\">\n      <properties>\n        <property name=\"SetUpProp\" value=\"1\"/>\n        <property name=\"TestSomeProperty\" value=\"1\"/>\n        <property name=\"TearDownProp\" value=\"1\"/>\n      </properties>\n    </testcase>\n  </testsuite>\n</testsuites>\n\"\"\"\n\nEXPECTED_XML_2 = \"\"\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\" timestamp=\"*\" name=\"AllTests\">\n  <testsuite name=\"PropertyTwo\" tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"TestSomeProperties\" status=\"run\" time=\"*\" classname=\"PropertyTwo\">\n      <properties>\n        <property name=\"SetUpProp\" value=\"2\"/>\n        <property name=\"TestSomeProperty\" value=\"2\"/>\n        <property name=\"TearDownProp\" value=\"2\"/>\n      </properties>\n    </testcase>\n  </testsuite>\n</testsuites>\n\"\"\"\n\n\nclass GTestXMLOutFilesTest(gtest_xml_test_utils.GTestXMLTestCase):\n  \"\"\"Unit test for Google Test's XML output functionality.\"\"\"\n\n  def setUp(self):\n    # We want the trailing '/' that the last \"\" provides in os.path.join, for\n    # telling Google Test to create an output directory instead of a single file\n    # for xml output.\n    self.output_dir_ = os.path.join(gtest_test_utils.GetTempDir(),\n                                    GTEST_OUTPUT_SUBDIR, \"\")\n    self.DeleteFilesAndDir()\n\n  def tearDown(self):\n    self.DeleteFilesAndDir()\n\n  def DeleteFilesAndDir(self):\n    try:\n      os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_1_TEST + \".xml\"))\n    except os.error:\n      pass\n    try:\n      os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_2_TEST + \".xml\"))\n    except os.error:\n      pass\n    try:\n      os.rmdir(self.output_dir_)\n    except os.error:\n      pass\n\n  def testOutfile1(self):\n    self._TestOutFile(GTEST_OUTPUT_1_TEST, EXPECTED_XML_1)\n\n  def testOutfile2(self):\n    self._TestOutFile(GTEST_OUTPUT_2_TEST, EXPECTED_XML_2)\n\n  def _TestOutFile(self, test_name, expected_xml):\n    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(test_name)\n    command = [gtest_prog_path, \"--gtest_output=xml:%s\" % self.output_dir_]\n    p = gtest_test_utils.Subprocess(command,\n                                    working_dir=gtest_test_utils.GetTempDir())\n    self.assert_(p.exited)\n    self.assertEquals(0, p.exit_code)\n\n    # FIXME: libtool causes the built test binary to be\n    #   named lt-gtest_xml_outfiles_test_ instead of\n    #   gtest_xml_outfiles_test_.  To account for this possibility, we\n    #   allow both names in the following code.  We should remove this\n    #   when libtool replacement tool is ready.\n    output_file_name1 = test_name + \".xml\"\n    output_file1 = os.path.join(self.output_dir_, output_file_name1)\n    output_file_name2 = 'lt-' + output_file_name1\n    output_file2 = os.path.join(self.output_dir_, output_file_name2)\n    self.assert_(os.path.isfile(output_file1) or os.path.isfile(output_file2),\n                 output_file1)\n\n    expected = minidom.parseString(expected_xml)\n    if os.path.isfile(output_file1):\n      actual = minidom.parse(output_file1)\n    else:\n      actual = minidom.parse(output_file2)\n    self.NormalizeXml(actual.documentElement)\n    self.AssertEquivalentNodes(expected.documentElement,\n                               actual.documentElement)\n    expected.unlink()\n    actual.unlink()\n\n\nif __name__ == \"__main__\":\n  os.environ[\"GTEST_STACK_TRACE_DEPTH\"] = \"0\"\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_xml_output_unittest.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test for the gtest_xml_output module\"\"\"\n\nimport datetime\nimport errno\nimport os\nimport re\nimport sys\nfrom xml.dom import minidom, Node\n\nimport gtest_test_utils\nimport gtest_xml_test_utils\n\nGTEST_FILTER_FLAG = '--gtest_filter'\nGTEST_LIST_TESTS_FLAG = '--gtest_list_tests'\nGTEST_OUTPUT_FLAG = '--gtest_output'\nGTEST_DEFAULT_OUTPUT_FILE = 'test_detail.xml'\nGTEST_PROGRAM_NAME = 'gtest_xml_output_unittest_'\n\n# The flag indicating stacktraces are not supported\nNO_STACKTRACE_SUPPORT_FLAG = '--no_stacktrace_support'\n\n# The environment variables for test sharding.\nTOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'\nSHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'\nSHARD_STATUS_FILE_ENV_VAR = 'GTEST_SHARD_STATUS_FILE'\n\nSUPPORTS_STACK_TRACES = NO_STACKTRACE_SUPPORT_FLAG not in sys.argv\n\nif SUPPORTS_STACK_TRACES:\n  STACK_TRACE_TEMPLATE = '\\nStack trace:\\n*'\nelse:\n  STACK_TRACE_TEMPLATE = ''\n  # unittest.main() can't handle unknown flags\n  sys.argv.remove(NO_STACKTRACE_SUPPORT_FLAG)\n\nEXPECTED_NON_EMPTY_XML = \"\"\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites tests=\"23\" failures=\"4\" disabled=\"2\" errors=\"0\" time=\"*\" timestamp=\"*\" name=\"AllTests\" ad_hoc_property=\"42\">\n  <testsuite name=\"SuccessfulTest\" tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"Succeeds\" status=\"run\" time=\"*\" classname=\"SuccessfulTest\"/>\n  </testsuite>\n  <testsuite name=\"FailedTest\" tests=\"1\" failures=\"1\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"Fails\" status=\"run\" time=\"*\" classname=\"FailedTest\">\n      <failure message=\"gtest_xml_output_unittest_.cc:*&#x0A;Expected equality of these values:&#x0A;  1&#x0A;  2\" type=\"\"><![CDATA[gtest_xml_output_unittest_.cc:*\nExpected equality of these values:\n  1\n  2%(stack)s]]></failure>\n    </testcase>\n  </testsuite>\n  <testsuite name=\"MixedResultTest\" tests=\"3\" failures=\"1\" disabled=\"1\" errors=\"0\" time=\"*\">\n    <testcase name=\"Succeeds\" status=\"run\" time=\"*\" classname=\"MixedResultTest\"/>\n    <testcase name=\"Fails\" status=\"run\" time=\"*\" classname=\"MixedResultTest\">\n      <failure message=\"gtest_xml_output_unittest_.cc:*&#x0A;Expected equality of these values:&#x0A;  1&#x0A;  2\" type=\"\"><![CDATA[gtest_xml_output_unittest_.cc:*\nExpected equality of these values:\n  1\n  2%(stack)s]]></failure>\n      <failure message=\"gtest_xml_output_unittest_.cc:*&#x0A;Expected equality of these values:&#x0A;  2&#x0A;  3\" type=\"\"><![CDATA[gtest_xml_output_unittest_.cc:*\nExpected equality of these values:\n  2\n  3%(stack)s]]></failure>\n    </testcase>\n    <testcase name=\"DISABLED_test\" status=\"notrun\" time=\"*\" classname=\"MixedResultTest\"/>\n  </testsuite>\n  <testsuite name=\"XmlQuotingTest\" tests=\"1\" failures=\"1\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"OutputsCData\" status=\"run\" time=\"*\" classname=\"XmlQuotingTest\">\n      <failure message=\"gtest_xml_output_unittest_.cc:*&#x0A;Failed&#x0A;XML output: &lt;?xml encoding=&quot;utf-8&quot;&gt;&lt;top&gt;&lt;![CDATA[cdata text]]&gt;&lt;/top&gt;\" type=\"\"><![CDATA[gtest_xml_output_unittest_.cc:*\nFailed\nXML output: <?xml encoding=\"utf-8\"><top><![CDATA[cdata text]]>]]&gt;<![CDATA[</top>%(stack)s]]></failure>\n    </testcase>\n  </testsuite>\n  <testsuite name=\"InvalidCharactersTest\" tests=\"1\" failures=\"1\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"InvalidCharactersInMessage\" status=\"run\" time=\"*\" classname=\"InvalidCharactersTest\">\n      <failure message=\"gtest_xml_output_unittest_.cc:*&#x0A;Failed&#x0A;Invalid characters in brackets []\" type=\"\"><![CDATA[gtest_xml_output_unittest_.cc:*\nFailed\nInvalid characters in brackets []%(stack)s]]></failure>\n    </testcase>\n  </testsuite>\n  <testsuite name=\"DisabledTest\" tests=\"1\" failures=\"0\" disabled=\"1\" errors=\"0\" time=\"*\">\n    <testcase name=\"DISABLED_test_not_run\" status=\"notrun\" time=\"*\" classname=\"DisabledTest\"/>\n  </testsuite>\n  <testsuite name=\"PropertyRecordingTest\" tests=\"4\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\" SetUpTestCase=\"yes\" TearDownTestCase=\"aye\">\n    <testcase name=\"OneProperty\" status=\"run\" time=\"*\" classname=\"PropertyRecordingTest\">\n      <properties>\n        <property name=\"key_1\" value=\"1\"/>\n      </properties>\n    </testcase>\n    <testcase name=\"IntValuedProperty\" status=\"run\" time=\"*\" classname=\"PropertyRecordingTest\">\n      <properties>\n        <property name=\"key_int\" value=\"1\"/>\n      </properties>\n    </testcase>\n    <testcase name=\"ThreeProperties\" status=\"run\" time=\"*\" classname=\"PropertyRecordingTest\">\n      <properties>\n        <property name=\"key_1\" value=\"1\"/>\n        <property name=\"key_2\" value=\"2\"/>\n        <property name=\"key_3\" value=\"3\"/>\n      </properties>\n    </testcase>\n    <testcase name=\"TwoValuesForOneKeyUsesLastValue\" status=\"run\" time=\"*\" classname=\"PropertyRecordingTest\">\n      <properties>\n        <property name=\"key_1\" value=\"2\"/>\n      </properties>\n    </testcase>\n  </testsuite>\n  <testsuite name=\"NoFixtureTest\" tests=\"3\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n     <testcase name=\"RecordProperty\" status=\"run\" time=\"*\" classname=\"NoFixtureTest\">\n       <properties>\n         <property name=\"key\" value=\"1\"/>\n       </properties>\n     </testcase>\n     <testcase name=\"ExternalUtilityThatCallsRecordIntValuedProperty\" status=\"run\" time=\"*\" classname=\"NoFixtureTest\">\n       <properties>\n         <property name=\"key_for_utility_int\" value=\"1\"/>\n       </properties>\n     </testcase>\n     <testcase name=\"ExternalUtilityThatCallsRecordStringValuedProperty\" status=\"run\" time=\"*\" classname=\"NoFixtureTest\">\n       <properties>\n         <property name=\"key_for_utility_string\" value=\"1\"/>\n       </properties>\n     </testcase>\n  </testsuite>\n  <testsuite name=\"Single/ValueParamTest\" tests=\"4\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"HasValueParamAttribute/0\" value_param=\"33\" status=\"run\" time=\"*\" classname=\"Single/ValueParamTest\" />\n    <testcase name=\"HasValueParamAttribute/1\" value_param=\"42\" status=\"run\" time=\"*\" classname=\"Single/ValueParamTest\" />\n    <testcase name=\"AnotherTestThatHasValueParamAttribute/0\" value_param=\"33\" status=\"run\" time=\"*\" classname=\"Single/ValueParamTest\" />\n    <testcase name=\"AnotherTestThatHasValueParamAttribute/1\" value_param=\"42\" status=\"run\" time=\"*\" classname=\"Single/ValueParamTest\" />\n  </testsuite>\n  <testsuite name=\"TypedTest/0\" tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"HasTypeParamAttribute\" type_param=\"*\" status=\"run\" time=\"*\" classname=\"TypedTest/0\" />\n  </testsuite>\n  <testsuite name=\"TypedTest/1\" tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"HasTypeParamAttribute\" type_param=\"*\" status=\"run\" time=\"*\" classname=\"TypedTest/1\" />\n  </testsuite>\n  <testsuite name=\"Single/TypeParameterizedTestCase/0\" tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"HasTypeParamAttribute\" type_param=\"*\" status=\"run\" time=\"*\" classname=\"Single/TypeParameterizedTestCase/0\" />\n  </testsuite>\n  <testsuite name=\"Single/TypeParameterizedTestCase/1\" tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"HasTypeParamAttribute\" type_param=\"*\" status=\"run\" time=\"*\" classname=\"Single/TypeParameterizedTestCase/1\" />\n  </testsuite>\n</testsuites>\"\"\" % {'stack': STACK_TRACE_TEMPLATE}\n\nEXPECTED_FILTERED_TEST_XML = \"\"\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\"\n            timestamp=\"*\" name=\"AllTests\" ad_hoc_property=\"42\">\n  <testsuite name=\"SuccessfulTest\" tests=\"1\" failures=\"0\" disabled=\"0\"\n             errors=\"0\" time=\"*\">\n    <testcase name=\"Succeeds\" status=\"run\" time=\"*\" classname=\"SuccessfulTest\"/>\n  </testsuite>\n</testsuites>\"\"\"\n\nEXPECTED_SHARDED_TEST_XML = \"\"\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites tests=\"3\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\" timestamp=\"*\" name=\"AllTests\" ad_hoc_property=\"42\">\n  <testsuite name=\"SuccessfulTest\" tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"Succeeds\" status=\"run\" time=\"*\" classname=\"SuccessfulTest\"/>\n  </testsuite>\n  <testsuite name=\"NoFixtureTest\" tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n     <testcase name=\"RecordProperty\" status=\"run\" time=\"*\" classname=\"NoFixtureTest\">\n       <properties>\n         <property name=\"key\" value=\"1\"/>\n       </properties>\n     </testcase>\n  </testsuite>\n  <testsuite name=\"Single/ValueParamTest\" tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"AnotherTestThatHasValueParamAttribute/1\" value_param=\"42\" status=\"run\" time=\"*\" classname=\"Single/ValueParamTest\" />\n  </testsuite>\n</testsuites>\"\"\"\n\nEXPECTED_EMPTY_XML = \"\"\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites tests=\"0\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\"\n            timestamp=\"*\" name=\"AllTests\">\n</testsuites>\"\"\"\n\nGTEST_PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath(GTEST_PROGRAM_NAME)\n\nSUPPORTS_TYPED_TESTS = 'TypedTest' in gtest_test_utils.Subprocess(\n    [GTEST_PROGRAM_PATH, GTEST_LIST_TESTS_FLAG], capture_stderr=False).output\n\n\nclass GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):\n  \"\"\"\n  Unit test for Google Test's XML output functionality.\n  \"\"\"\n\n  # This test currently breaks on platforms that do not support typed and\n  # type-parameterized tests, so we don't run it under them.\n  if SUPPORTS_TYPED_TESTS:\n    def testNonEmptyXmlOutput(self):\n      \"\"\"\n      Runs a test program that generates a non-empty XML output, and\n      tests that the XML output is expected.\n      \"\"\"\n      self._TestXmlOutput(GTEST_PROGRAM_NAME, EXPECTED_NON_EMPTY_XML, 1)\n\n  def testEmptyXmlOutput(self):\n    \"\"\"Verifies XML output for a Google Test binary without actual tests.\n\n    Runs a test program that generates an empty XML output, and\n    tests that the XML output is expected.\n    \"\"\"\n\n    self._TestXmlOutput('gtest_no_test_unittest', EXPECTED_EMPTY_XML, 0)\n\n  def testTimestampValue(self):\n    \"\"\"Checks whether the timestamp attribute in the XML output is valid.\n\n    Runs a test program that generates an empty XML output, and checks if\n    the timestamp attribute in the testsuites tag is valid.\n    \"\"\"\n    actual = self._GetXmlOutput('gtest_no_test_unittest', [], {}, 0)\n    date_time_str = actual.documentElement.getAttributeNode('timestamp').value\n    # datetime.strptime() is only available in Python 2.5+ so we have to\n    # parse the expected datetime manually.\n    match = re.match(r'(\\d+)-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d):(\\d\\d)', date_time_str)\n    self.assertTrue(\n        re.match,\n        'XML datettime string %s has incorrect format' % date_time_str)\n    date_time_from_xml = datetime.datetime(\n        year=int(match.group(1)), month=int(match.group(2)),\n        day=int(match.group(3)), hour=int(match.group(4)),\n        minute=int(match.group(5)), second=int(match.group(6)))\n\n    time_delta = abs(datetime.datetime.now() - date_time_from_xml)\n    # timestamp value should be near the current local time\n    self.assertTrue(time_delta < datetime.timedelta(seconds=600),\n                    'time_delta is %s' % time_delta)\n    actual.unlink()\n\n  def testDefaultOutputFile(self):\n    \"\"\"\n    Confirms that Google Test produces an XML output file with the expected\n    default name if no name is explicitly specified.\n    \"\"\"\n    output_file = os.path.join(gtest_test_utils.GetTempDir(),\n                               GTEST_DEFAULT_OUTPUT_FILE)\n    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(\n        'gtest_no_test_unittest')\n    try:\n      os.remove(output_file)\n    except OSError, e:\n      if e.errno != errno.ENOENT:\n        raise\n\n    p = gtest_test_utils.Subprocess(\n        [gtest_prog_path, '%s=xml' % GTEST_OUTPUT_FLAG],\n        working_dir=gtest_test_utils.GetTempDir())\n    self.assert_(p.exited)\n    self.assertEquals(0, p.exit_code)\n    self.assert_(os.path.isfile(output_file))\n\n  def testSuppressedXmlOutput(self):\n    \"\"\"\n    Tests that no XML file is generated if the default XML listener is\n    shut down before RUN_ALL_TESTS is invoked.\n    \"\"\"\n\n    xml_path = os.path.join(gtest_test_utils.GetTempDir(),\n                            GTEST_PROGRAM_NAME + 'out.xml')\n    if os.path.isfile(xml_path):\n      os.remove(xml_path)\n\n    command = [GTEST_PROGRAM_PATH,\n               '%s=xml:%s' % (GTEST_OUTPUT_FLAG, xml_path),\n               '--shut_down_xml']\n    p = gtest_test_utils.Subprocess(command)\n    if p.terminated_by_signal:\n      # p.signal is available only if p.terminated_by_signal is True.\n      self.assertFalse(\n          p.terminated_by_signal,\n          '%s was killed by signal %d' % (GTEST_PROGRAM_NAME, p.signal))\n    else:\n      self.assert_(p.exited)\n      self.assertEquals(1, p.exit_code,\n                        \"'%s' exited with code %s, which doesn't match \"\n                        'the expected exit code %s.'\n                        % (command, p.exit_code, 1))\n\n    self.assert_(not os.path.isfile(xml_path))\n\n  def testFilteredTestXmlOutput(self):\n    \"\"\"Verifies XML output when a filter is applied.\n\n    Runs a test program that executes only some tests and verifies that\n    non-selected tests do not show up in the XML output.\n    \"\"\"\n\n    self._TestXmlOutput(GTEST_PROGRAM_NAME, EXPECTED_FILTERED_TEST_XML, 0,\n                        extra_args=['%s=SuccessfulTest.*' % GTEST_FILTER_FLAG])\n\n  def testShardedTestXmlOutput(self):\n    \"\"\"Verifies XML output when run using multiple shards.\n\n    Runs a test program that executes only one shard and verifies that tests\n    from other shards do not show up in the XML output.\n    \"\"\"\n\n    self._TestXmlOutput(\n        GTEST_PROGRAM_NAME,\n        EXPECTED_SHARDED_TEST_XML,\n        0,\n        extra_env={SHARD_INDEX_ENV_VAR: '0',\n                   TOTAL_SHARDS_ENV_VAR: '10'})\n\n  def _GetXmlOutput(self, gtest_prog_name, extra_args, extra_env,\n                    expected_exit_code):\n    \"\"\"\n    Returns the xml output generated by running the program gtest_prog_name.\n    Furthermore, the program's exit code must be expected_exit_code.\n    \"\"\"\n    xml_path = os.path.join(gtest_test_utils.GetTempDir(),\n                            gtest_prog_name + 'out.xml')\n    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(gtest_prog_name)\n\n    command = ([gtest_prog_path, '%s=xml:%s' % (GTEST_OUTPUT_FLAG, xml_path)] +\n               extra_args)\n    environ_copy = os.environ.copy()\n    if extra_env:\n      environ_copy.update(extra_env)\n    p = gtest_test_utils.Subprocess(command, env=environ_copy)\n\n    if p.terminated_by_signal:\n      self.assert_(False,\n                   '%s was killed by signal %d' % (gtest_prog_name, p.signal))\n    else:\n      self.assert_(p.exited)\n      self.assertEquals(expected_exit_code, p.exit_code,\n                        \"'%s' exited with code %s, which doesn't match \"\n                        'the expected exit code %s.'\n                        % (command, p.exit_code, expected_exit_code))\n    actual = minidom.parse(xml_path)\n    return actual\n\n  def _TestXmlOutput(self, gtest_prog_name, expected_xml,\n                     expected_exit_code, extra_args=None, extra_env=None):\n    \"\"\"\n    Asserts that the XML document generated by running the program\n    gtest_prog_name matches expected_xml, a string containing another\n    XML document.  Furthermore, the program's exit code must be\n    expected_exit_code.\n    \"\"\"\n\n    actual = self._GetXmlOutput(gtest_prog_name, extra_args or [],\n                                extra_env or {}, expected_exit_code)\n    expected = minidom.parseString(expected_xml)\n    self.NormalizeXml(actual.documentElement)\n    self.AssertEquivalentNodes(expected.documentElement,\n                               actual.documentElement)\n    expected.unlink()\n    actual.unlink()\n\n\nif __name__ == '__main__':\n  os.environ['GTEST_STACK_TRACE_DEPTH'] = '1'\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_xml_output_unittest_.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Unit test for Google Test XML output.\n//\n// A user can specify XML output in a Google Test program to run via\n// either the GTEST_OUTPUT environment variable or the --gtest_output\n// flag.  This is used for testing such functionality.\n//\n// This program will be invoked from a Python unit test.  Don't run it\n// directly.\n\n#include \"gtest/gtest.h\"\n\nusing ::testing::InitGoogleTest;\nusing ::testing::TestEventListeners;\nusing ::testing::TestWithParam;\nusing ::testing::UnitTest;\nusing ::testing::Test;\nusing ::testing::Values;\n\nclass SuccessfulTest : public Test {\n};\n\nTEST_F(SuccessfulTest, Succeeds) {\n  SUCCEED() << \"This is a success.\";\n  ASSERT_EQ(1, 1);\n}\n\nclass FailedTest : public Test {\n};\n\nTEST_F(FailedTest, Fails) {\n  ASSERT_EQ(1, 2);\n}\n\nclass DisabledTest : public Test {\n};\n\nTEST_F(DisabledTest, DISABLED_test_not_run) {\n  FAIL() << \"Unexpected failure: Disabled test should not be run\";\n}\n\nTEST(MixedResultTest, Succeeds) {\n  EXPECT_EQ(1, 1);\n  ASSERT_EQ(1, 1);\n}\n\nTEST(MixedResultTest, Fails) {\n  EXPECT_EQ(1, 2);\n  ASSERT_EQ(2, 3);\n}\n\nTEST(MixedResultTest, DISABLED_test) {\n  FAIL() << \"Unexpected failure: Disabled test should not be run\";\n}\n\nTEST(XmlQuotingTest, OutputsCData) {\n  FAIL() << \"XML output: \"\n            \"<?xml encoding=\\\"utf-8\\\"><top><![CDATA[cdata text]]></top>\";\n}\n\n// Helps to test that invalid characters produced by test code do not make\n// it into the XML file.\nTEST(InvalidCharactersTest, InvalidCharactersInMessage) {\n  FAIL() << \"Invalid characters in brackets [\\x1\\x2]\";\n}\n\nclass PropertyRecordingTest : public Test {\n public:\n  static void SetUpTestCase() { RecordProperty(\"SetUpTestCase\", \"yes\"); }\n  static void TearDownTestCase() { RecordProperty(\"TearDownTestCase\", \"aye\"); }\n};\n\nTEST_F(PropertyRecordingTest, OneProperty) {\n  RecordProperty(\"key_1\", \"1\");\n}\n\nTEST_F(PropertyRecordingTest, IntValuedProperty) {\n  RecordProperty(\"key_int\", 1);\n}\n\nTEST_F(PropertyRecordingTest, ThreeProperties) {\n  RecordProperty(\"key_1\", \"1\");\n  RecordProperty(\"key_2\", \"2\");\n  RecordProperty(\"key_3\", \"3\");\n}\n\nTEST_F(PropertyRecordingTest, TwoValuesForOneKeyUsesLastValue) {\n  RecordProperty(\"key_1\", \"1\");\n  RecordProperty(\"key_1\", \"2\");\n}\n\nTEST(NoFixtureTest, RecordProperty) {\n  RecordProperty(\"key\", \"1\");\n}\n\nvoid ExternalUtilityThatCallsRecordProperty(const std::string& key, int value) {\n  testing::Test::RecordProperty(key, value);\n}\n\nvoid ExternalUtilityThatCallsRecordProperty(const std::string& key,\n                                            const std::string& value) {\n  testing::Test::RecordProperty(key, value);\n}\n\nTEST(NoFixtureTest, ExternalUtilityThatCallsRecordIntValuedProperty) {\n  ExternalUtilityThatCallsRecordProperty(\"key_for_utility_int\", 1);\n}\n\nTEST(NoFixtureTest, ExternalUtilityThatCallsRecordStringValuedProperty) {\n  ExternalUtilityThatCallsRecordProperty(\"key_for_utility_string\", \"1\");\n}\n\n// Verifies that the test parameter value is output in the 'value_param'\n// XML attribute for value-parameterized tests.\nclass ValueParamTest : public TestWithParam<int> {};\nTEST_P(ValueParamTest, HasValueParamAttribute) {}\nTEST_P(ValueParamTest, AnotherTestThatHasValueParamAttribute) {}\nINSTANTIATE_TEST_CASE_P(Single, ValueParamTest, Values(33, 42));\n\n#if GTEST_HAS_TYPED_TEST\n// Verifies that the type parameter name is output in the 'type_param'\n// XML attribute for typed tests.\ntemplate <typename T> class TypedTest : public Test {};\ntypedef testing::Types<int, long> TypedTestTypes;\nTYPED_TEST_CASE(TypedTest, TypedTestTypes);\nTYPED_TEST(TypedTest, HasTypeParamAttribute) {}\n#endif\n\n#if GTEST_HAS_TYPED_TEST_P\n// Verifies that the type parameter name is output in the 'type_param'\n// XML attribute for type-parameterized tests.\ntemplate <typename T> class TypeParameterizedTestCase : public Test {};\nTYPED_TEST_CASE_P(TypeParameterizedTestCase);\nTYPED_TEST_P(TypeParameterizedTestCase, HasTypeParamAttribute) {}\nREGISTER_TYPED_TEST_CASE_P(TypeParameterizedTestCase, HasTypeParamAttribute);\ntypedef testing::Types<int, long> TypeParameterizedTestCaseTypes;\nINSTANTIATE_TYPED_TEST_CASE_P(Single,\n                              TypeParameterizedTestCase,\n                              TypeParameterizedTestCaseTypes);\n#endif\n\nint main(int argc, char** argv) {\n  InitGoogleTest(&argc, argv);\n\n  if (argc > 1 && strcmp(argv[1], \"--shut_down_xml\") == 0) {\n    TestEventListeners& listeners = UnitTest::GetInstance()->listeners();\n    delete listeners.Release(listeners.default_xml_generator());\n  }\n  testing::Test::RecordProperty(\"ad_hoc_property\", \"42\");\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/gtest_xml_test_utils.py",
    "content": "# Copyright 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test utilities for gtest_xml_output\"\"\"\n\nimport re\nfrom xml.dom import minidom, Node\nimport gtest_test_utils\n\nGTEST_DEFAULT_OUTPUT_FILE = 'test_detail.xml'\n\nclass GTestXMLTestCase(gtest_test_utils.TestCase):\n  \"\"\"\n  Base class for tests of Google Test's XML output functionality.\n  \"\"\"\n\n\n  def AssertEquivalentNodes(self, expected_node, actual_node):\n    \"\"\"\n    Asserts that actual_node (a DOM node object) is equivalent to\n    expected_node (another DOM node object), in that either both of\n    them are CDATA nodes and have the same value, or both are DOM\n    elements and actual_node meets all of the following conditions:\n\n    *  It has the same tag name as expected_node.\n    *  It has the same set of attributes as expected_node, each with\n       the same value as the corresponding attribute of expected_node.\n       Exceptions are any attribute named \"time\", which needs only be\n       convertible to a floating-point number and any attribute named\n       \"type_param\" which only has to be non-empty.\n    *  It has an equivalent set of child nodes (including elements and\n       CDATA sections) as expected_node.  Note that we ignore the\n       order of the children as they are not guaranteed to be in any\n       particular order.\n    \"\"\"\n\n    if expected_node.nodeType == Node.CDATA_SECTION_NODE:\n      self.assertEquals(Node.CDATA_SECTION_NODE, actual_node.nodeType)\n      self.assertEquals(expected_node.nodeValue, actual_node.nodeValue)\n      return\n\n    self.assertEquals(Node.ELEMENT_NODE, actual_node.nodeType)\n    self.assertEquals(Node.ELEMENT_NODE, expected_node.nodeType)\n    self.assertEquals(expected_node.tagName, actual_node.tagName)\n\n    expected_attributes = expected_node.attributes\n    actual_attributes   = actual_node  .attributes\n    self.assertEquals(\n        expected_attributes.length, actual_attributes.length,\n        'attribute numbers differ in element %s:\\nExpected: %r\\nActual: %r' % (\n            actual_node.tagName, expected_attributes.keys(),\n            actual_attributes.keys()))\n    for i in range(expected_attributes.length):\n      expected_attr = expected_attributes.item(i)\n      actual_attr   = actual_attributes.get(expected_attr.name)\n      self.assert_(\n          actual_attr is not None,\n          'expected attribute %s not found in element %s' %\n          (expected_attr.name, actual_node.tagName))\n      self.assertEquals(\n          expected_attr.value, actual_attr.value,\n          ' values of attribute %s in element %s differ: %s vs %s' %\n          (expected_attr.name, actual_node.tagName,\n           expected_attr.value, actual_attr.value))\n\n    expected_children = self._GetChildren(expected_node)\n    actual_children = self._GetChildren(actual_node)\n    self.assertEquals(\n        len(expected_children), len(actual_children),\n        'number of child elements differ in element ' + actual_node.tagName)\n    for child_id, child in expected_children.iteritems():\n      self.assert_(child_id in actual_children,\n                   '<%s> is not in <%s> (in element %s)' %\n                   (child_id, actual_children, actual_node.tagName))\n      self.AssertEquivalentNodes(child, actual_children[child_id])\n\n  identifying_attribute = {\n      'testsuites': 'name',\n      'testsuite': 'name',\n      'testcase': 'name',\n      'failure': 'message',\n      'property': 'name',\n  }\n\n  def _GetChildren(self, element):\n    \"\"\"\n    Fetches all of the child nodes of element, a DOM Element object.\n    Returns them as the values of a dictionary keyed by the IDs of the\n    children.  For <testsuites>, <testsuite>, <testcase>, and <property>\n    elements, the ID is the value of their \"name\" attribute; for <failure>\n    elements, it is the value of the \"message\" attribute; for <properties>\n    elements, it is the value of their parent's \"name\" attribute plus the\n    literal string \"properties\"; CDATA sections and non-whitespace\n    text nodes are concatenated into a single CDATA section with ID\n    \"detail\".  An exception is raised if any element other than the above\n    four is encountered, if two child elements with the same identifying\n    attributes are encountered, or if any other type of node is encountered.\n    \"\"\"\n\n    children = {}\n    for child in element.childNodes:\n      if child.nodeType == Node.ELEMENT_NODE:\n        if child.tagName == 'properties':\n          self.assert_(child.parentNode is not None,\n                       'Encountered <properties> element without a parent')\n          child_id = child.parentNode.getAttribute('name') + '-properties'\n        else:\n          self.assert_(child.tagName in self.identifying_attribute,\n                       'Encountered unknown element <%s>' % child.tagName)\n          child_id = child.getAttribute(\n              self.identifying_attribute[child.tagName])\n        self.assert_(child_id not in children)\n        children[child_id] = child\n      elif child.nodeType in [Node.TEXT_NODE, Node.CDATA_SECTION_NODE]:\n        if 'detail' not in children:\n          if (child.nodeType == Node.CDATA_SECTION_NODE or\n              not child.nodeValue.isspace()):\n            children['detail'] = child.ownerDocument.createCDATASection(\n                child.nodeValue)\n        else:\n          children['detail'].nodeValue += child.nodeValue\n      else:\n        self.fail('Encountered unexpected node type %d' % child.nodeType)\n    return children\n\n  def NormalizeXml(self, element):\n    \"\"\"\n    Normalizes Google Test's XML output to eliminate references to transient\n    information that may change from run to run.\n\n    *  The \"time\" attribute of <testsuites>, <testsuite> and <testcase>\n       elements is replaced with a single asterisk, if it contains\n       only digit characters.\n    *  The \"timestamp\" attribute of <testsuites> elements is replaced with a\n       single asterisk, if it contains a valid ISO8601 datetime value.\n    *  The \"type_param\" attribute of <testcase> elements is replaced with a\n       single asterisk (if it sn non-empty) as it is the type name returned\n       by the compiler and is platform dependent.\n    *  The line info reported in the first line of the \"message\"\n       attribute and CDATA section of <failure> elements is replaced with the\n       file's basename and a single asterisk for the line number.\n    *  The directory names in file paths are removed.\n    *  The stack traces are removed.\n    \"\"\"\n\n    if element.tagName == 'testsuites':\n      timestamp = element.getAttributeNode('timestamp')\n      timestamp.value = re.sub(r'^\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d$',\n                               '*', timestamp.value)\n    if element.tagName in ('testsuites', 'testsuite', 'testcase'):\n      time = element.getAttributeNode('time')\n      time.value = re.sub(r'^\\d+(\\.\\d+)?$', '*', time.value)\n      type_param = element.getAttributeNode('type_param')\n      if type_param and type_param.value:\n        type_param.value = '*'\n    elif element.tagName == 'failure':\n      source_line_pat = r'^.*[/\\\\](.*:)\\d+\\n'\n      # Replaces the source line information with a normalized form.\n      message = element.getAttributeNode('message')\n      message.value = re.sub(source_line_pat, '\\\\1*\\n', message.value)\n      for child in element.childNodes:\n        if child.nodeType == Node.CDATA_SECTION_NODE:\n          # Replaces the source line information with a normalized form.\n          cdata = re.sub(source_line_pat, '\\\\1*\\n', child.nodeValue)\n          # Removes the actual stack trace.\n          child.nodeValue = re.sub(r'Stack trace:\\n(.|\\n)*',\n                                   'Stack trace:\\n*', cdata)\n    for child in element.childNodes:\n      if child.nodeType == Node.ELEMENT_NODE:\n        self.NormalizeXml(child)\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/production.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// This is part of the unit test for gtest_prod.h.\n\n#include \"production.h\"\n\nPrivateCode::PrivateCode() : x_(0) {}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/test/production.h",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// This is part of the unit test for gtest_prod.h.\n\n#ifndef GTEST_TEST_PRODUCTION_H_\n#define GTEST_TEST_PRODUCTION_H_\n\n#include \"gtest/gtest_prod.h\"\n\nclass PrivateCode {\n public:\n  // Declares a friend test that does not use a fixture.\n  FRIEND_TEST(PrivateCodeTest, CanAccessPrivateMembers);\n\n  // Declares a friend test that uses a fixture.\n  FRIEND_TEST(PrivateCodeFixtureTest, CanAccessPrivateMembers);\n\n  PrivateCode();\n\n  int x() const { return x_; }\n private:\n  void set_x(int an_x) { x_ = an_x; }\n  int x_;\n};\n\n#endif  // GTEST_TEST_PRODUCTION_H_\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/xcode/Config/DebugProject.xcconfig",
    "content": "//\n//  DebugProject.xcconfig\n//\n//  These are Debug Configuration project settings for the gtest framework and\n//  examples. It is set in the \"Based On:\" dropdown in the \"Project\" info\n//  dialog.\n//  This file is based on the Xcode Configuration files in:\n//  https://github.com/google/google-toolbox-for-mac\n// \n\n#include \"General.xcconfig\"\n\n// No optimization\nGCC_OPTIMIZATION_LEVEL = 0\n\n// Deployment postprocessing is what triggers Xcode to strip, turn it off\nDEPLOYMENT_POSTPROCESSING = NO\n\n// Dead code stripping off\nDEAD_CODE_STRIPPING = NO\n\n// Debug symbols should be on obviously\nGCC_GENERATE_DEBUGGING_SYMBOLS = YES\n\n// Define the DEBUG macro in all debug builds\nOTHER_CFLAGS = $(OTHER_CFLAGS) -DDEBUG=1\n\n// These are turned off to avoid STL incompatibilities with client code\n// // Turns on special C++ STL checks to \"encourage\" good STL use\n// GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS) _GLIBCXX_DEBUG_PEDANTIC _GLIBCXX_DEBUG _GLIBCPP_CONCEPT_CHECKS\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/xcode/Config/FrameworkTarget.xcconfig",
    "content": "//\n//  FrameworkTarget.xcconfig\n//\n//  These are Framework target settings for the gtest framework and examples. It\n//  is set in the \"Based On:\" dropdown in the \"Target\" info dialog.\n//  This file is based on the Xcode Configuration files in:\n//  https://github.com/google/google-toolbox-for-mac\n// \n\n// Dynamic libs need to be position independent\nGCC_DYNAMIC_NO_PIC = NO\n\n// Dynamic libs should not have their external symbols stripped.\nSTRIP_STYLE = non-global\n\n// Let the user install by specifying the $DSTROOT with xcodebuild\nSKIP_INSTALL = NO\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/xcode/Config/General.xcconfig",
    "content": "//\n//  General.xcconfig\n//\n//  These are General configuration settings for the gtest framework and\n//  examples.\n//  This file is based on the Xcode Configuration files in:\n//  https://github.com/google/google-toolbox-for-mac\n// \n\n// Build for PPC and Intel, 32- and 64-bit\nARCHS = i386 x86_64 ppc ppc64\n\n// Zerolink prevents link warnings so turn it off\nZERO_LINK = NO\n\n// Prebinding considered unhelpful in 10.3 and later\nPREBINDING = NO\n\n// Strictest warning policy\nWARNING_CFLAGS = -Wall -Werror -Wendif-labels -Wnewline-eof -Wno-sign-compare -Wshadow\n\n// Work around Xcode bugs by using external strip. See:\n// http://lists.apple.com/archives/Xcode-users/2006/Feb/msg00050.html\nSEPARATE_STRIP = YES\n\n// Force C99 dialect\nGCC_C_LANGUAGE_STANDARD = c99\n\n// not sure why apple defaults this on, but it's pretty risky\nALWAYS_SEARCH_USER_PATHS = NO\n\n// Turn on position dependent code for most cases (overridden where appropriate)\nGCC_DYNAMIC_NO_PIC = YES\n\n// Default SDK and minimum OS version is 10.4\nSDKROOT = $(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk\nMACOSX_DEPLOYMENT_TARGET = 10.4\nGCC_VERSION = 4.0\n\n// VERSIONING BUILD SETTINGS (used in Info.plist)\nGTEST_VERSIONINFO_ABOUT =  © 2008 Google Inc.\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/xcode/Config/ReleaseProject.xcconfig",
    "content": "//\n//  ReleaseProject.xcconfig\n//\n//  These are Release Configuration project settings for the gtest framework\n//  and examples. It is set in the \"Based On:\" dropdown in the \"Project\" info\n//  dialog.\n//  This file is based on the Xcode Configuration files in:\n//  https://github.com/google/google-toolbox-for-mac\n// \n\n#include \"General.xcconfig\"\n\n// subconfig/Release.xcconfig\n\n// Optimize for space and size (Apple recommendation)\nGCC_OPTIMIZATION_LEVEL = s\n\n// Deploment postprocessing is what triggers Xcode to strip\nDEPLOYMENT_POSTPROCESSING = YES\n\n// No symbols\nGCC_GENERATE_DEBUGGING_SYMBOLS = NO\n\n// Dead code strip does not affect ObjC code but can help for C\nDEAD_CODE_STRIPPING = YES\n\n// NDEBUG is used by things like assert.h, so define it for general compat.\n// ASSERT going away in release tends to create unused vars.\nOTHER_CFLAGS = $(OTHER_CFLAGS) -DNDEBUG=1 -Wno-unused-variable\n\n// When we strip we want to strip all symbols in release, but save externals.\nSTRIP_STYLE = all\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/xcode/Config/StaticLibraryTarget.xcconfig",
    "content": "//\n//  StaticLibraryTarget.xcconfig\n//\n//  These are static library target settings for libgtest.a. It\n//  is set in the \"Based On:\" dropdown in the \"Target\" info dialog.\n//  This file is based on the Xcode Configuration files in:\n//  https://github.com/google/google-toolbox-for-mac\n// \n\n// Static libs can be included in bundles so make them position independent\nGCC_DYNAMIC_NO_PIC = NO\n\n// Static libs should not have their internal globals or external symbols\n// stripped.\nSTRIP_STYLE = debugging\n\n// Let the user install by specifying the $DSTROOT with xcodebuild\nSKIP_INSTALL = NO\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/xcode/Config/TestTarget.xcconfig",
    "content": "//\n//  TestTarget.xcconfig\n//\n//  These are Test target settings for the gtest framework and examples. It\n//  is set in the \"Based On:\" dropdown in the \"Target\" info dialog.\n\nPRODUCT_NAME = $(TARGET_NAME)\nHEADER_SEARCH_PATHS = ../include\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/xcode/Resources/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.google.${PRODUCT_NAME}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>GTEST_VERSIONINFO_LONG</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>GTEST_VERSIONINFO_SHORT</string>\n\t<key>CFBundleGetInfoString</key>\n\t<string>${PRODUCT_NAME} GTEST_VERSIONINFO_LONG, ${GTEST_VERSIONINFO_ABOUT}</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>${GTEST_VERSIONINFO_ABOUT}</string>\n\t<key>CSResourcesFileMapped</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/xcode/Samples/FrameworkSample/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.google.gtest.${PRODUCT_NAME:identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>CSResourcesFileMapped</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 42;\n\tobjects = {\n\n/* Begin PBXAggregateTarget section */\n\t\t4024D162113D7D2400C7059E /* Test */ = {\n\t\t\tisa = PBXAggregateTarget;\n\t\t\tbuildConfigurationList = 4024D169113D7D4600C7059E /* Build configuration list for PBXAggregateTarget \"Test\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t4024D161113D7D2400C7059E /* ShellScript */,\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t4024D166113D7D3100C7059E /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Test;\n\t\t\tproductName = TestAndBuild;\n\t\t};\n\t\t4024D1E9113D83FF00C7059E /* TestAndBuild */ = {\n\t\t\tisa = PBXAggregateTarget;\n\t\t\tbuildConfigurationList = 4024D1F0113D842B00C7059E /* Build configuration list for PBXAggregateTarget \"TestAndBuild\" */;\n\t\t\tbuildPhases = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t4024D1ED113D840900C7059E /* PBXTargetDependency */,\n\t\t\t\t4024D1EF113D840D00C7059E /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = TestAndBuild;\n\t\t\tproductName = TestAndBuild;\n\t\t};\n/* End PBXAggregateTarget section */\n\n/* Begin PBXBuildFile section */\n\t\t3B7EB1250E5AEE3500C7F239 /* widget.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B7EB1230E5AEE3500C7F239 /* widget.cc */; };\n\t\t3B7EB1260E5AEE3500C7F239 /* widget.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B7EB1240E5AEE3500C7F239 /* widget.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t3B7EB1280E5AEE4600C7F239 /* widget_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B7EB1270E5AEE4600C7F239 /* widget_test.cc */; };\n\t\t3B7EB1480E5AF3B400C7F239 /* Widget.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D07F2C80486CC7A007CD1D0 /* Widget.framework */; };\n\t\t4024D188113D7D7800C7059E /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4024D185113D7D5500C7059E /* libgtest.a */; };\n\t\t4024D189113D7D7A00C7059E /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4024D183113D7D5500C7059E /* libgtest_main.a */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t3B07BDF00E3F3FAE00647869 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0;\n\t\t\tremoteInfo = gTestExample;\n\t\t};\n\t\t4024D165113D7D3100C7059E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 3B07BDE90E3F3F9E00647869;\n\t\t\tremoteInfo = WidgetFrameworkTest;\n\t\t};\n\t\t4024D1EC113D840900C7059E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0;\n\t\t\tremoteInfo = WidgetFramework;\n\t\t};\n\t\t4024D1EE113D840D00C7059E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 4024D162113D7D2400C7059E;\n\t\t\tremoteInfo = Test;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t3B07BDEA0E3F3F9E00647869 /* WidgetFrameworkTest */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = WidgetFrameworkTest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t3B7EB1230E5AEE3500C7F239 /* widget.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = widget.cc; sourceTree = \"<group>\"; };\n\t\t3B7EB1240E5AEE3500C7F239 /* widget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = widget.h; sourceTree = \"<group>\"; };\n\t\t3B7EB1270E5AEE4600C7F239 /* widget_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = widget_test.cc; sourceTree = \"<group>\"; };\n\t\t4024D183113D7D5500C7059E /* libgtest_main.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgtest_main.a; path = /usr/local/lib/libgtest_main.a; sourceTree = \"<absolute>\"; };\n\t\t4024D185113D7D5500C7059E /* libgtest.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgtest.a; path = /usr/local/lib/libgtest.a; sourceTree = \"<absolute>\"; };\n\t\t4024D1E2113D838200C7059E /* runtests.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = runtests.sh; sourceTree = \"<group>\"; };\n\t\t8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t8D07F2C80486CC7A007CD1D0 /* Widget.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Widget.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t3B07BDE80E3F3F9E00647869 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t4024D189113D7D7A00C7059E /* libgtest_main.a in Frameworks */,\n\t\t\t\t4024D188113D7D7800C7059E /* libgtest.a in Frameworks */,\n\t\t\t\t3B7EB1480E5AF3B400C7F239 /* Widget.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8D07F2C30486CC7A007CD1D0 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t034768DDFF38A45A11DB9C8B /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8D07F2C80486CC7A007CD1D0 /* Widget.framework */,\n\t\t\t\t3B07BDEA0E3F3F9E00647869 /* WidgetFrameworkTest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0867D691FE84028FC02AAC07 /* gTestExample */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4024D1E1113D836C00C7059E /* Scripts */,\n\t\t\t\t08FB77ACFE841707C02AAC07 /* Source */,\n\t\t\t\t089C1665FE841158C02AAC07 /* Resources */,\n\t\t\t\t3B07BE350E4094E400647869 /* Test */,\n\t\t\t\t0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */,\n\t\t\t\t034768DDFF38A45A11DB9C8B /* Products */,\n\t\t\t);\n\t\t\tname = gTestExample;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4024D183113D7D5500C7059E /* libgtest_main.a */,\n\t\t\t\t4024D185113D7D5500C7059E /* libgtest.a */,\n\t\t\t);\n\t\t\tname = \"External Frameworks and Libraries\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t089C1665FE841158C02AAC07 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8D07F2C70486CC7A007CD1D0 /* Info.plist */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t08FB77ACFE841707C02AAC07 /* Source */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B7EB1230E5AEE3500C7F239 /* widget.cc */,\n\t\t\t\t3B7EB1240E5AEE3500C7F239 /* widget.h */,\n\t\t\t);\n\t\t\tname = Source;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3B07BE350E4094E400647869 /* Test */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B7EB1270E5AEE4600C7F239 /* widget_test.cc */,\n\t\t\t);\n\t\t\tname = Test;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4024D1E1113D836C00C7059E /* Scripts */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4024D1E2113D838200C7059E /* runtests.sh */,\n\t\t\t);\n\t\t\tname = Scripts;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t8D07F2BD0486CC7A007CD1D0 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t3B7EB1260E5AEE3500C7F239 /* widget.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t3B07BDE90E3F3F9E00647869 /* WidgetFrameworkTest */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 3B07BDF40E3F3FB600647869 /* Build configuration list for PBXNativeTarget \"WidgetFrameworkTest\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t3B07BDE70E3F3F9E00647869 /* Sources */,\n\t\t\t\t3B07BDE80E3F3F9E00647869 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t3B07BDF10E3F3FAE00647869 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = WidgetFrameworkTest;\n\t\t\tproductName = gTestExampleTest;\n\t\t\tproductReference = 3B07BDEA0E3F3F9E00647869 /* WidgetFrameworkTest */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget \"WidgetFramework\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8D07F2C10486CC7A007CD1D0 /* Sources */,\n\t\t\t\t8D07F2C30486CC7A007CD1D0 /* Frameworks */,\n\t\t\t\t8D07F2BD0486CC7A007CD1D0 /* Headers */,\n\t\t\t\t8D07F2BF0486CC7A007CD1D0 /* Resources */,\n\t\t\t\t8D07F2C50486CC7A007CD1D0 /* Rez */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = WidgetFramework;\n\t\t\tproductInstallPath = \"$(HOME)/Library/Frameworks\";\n\t\t\tproductName = gTestExample;\n\t\t\tproductReference = 8D07F2C80486CC7A007CD1D0 /* Widget.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t0867D690FE84028FC02AAC07 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tbuildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject \"WidgetFramework\" */;\n\t\t\tcompatibilityVersion = \"Xcode 2.4\";\n\t\t\thasScannedForEncodings = 1;\n\t\t\tmainGroup = 0867D691FE84028FC02AAC07 /* gTestExample */;\n\t\t\tproductRefGroup = 034768DDFF38A45A11DB9C8B /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */,\n\t\t\t\t3B07BDE90E3F3F9E00647869 /* WidgetFrameworkTest */,\n\t\t\t\t4024D162113D7D2400C7059E /* Test */,\n\t\t\t\t4024D1E9113D83FF00C7059E /* TestAndBuild */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t8D07F2BF0486CC7A007CD1D0 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXRezBuildPhase section */\n\t\t8D07F2C50486CC7A007CD1D0 /* Rez */ = {\n\t\t\tisa = PBXRezBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXRezBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t4024D161113D7D2400C7059E /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/bash $SRCROOT/runtests.sh $BUILT_PRODUCTS_DIR/WidgetFrameworkTest\\n\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t3B07BDE70E3F3F9E00647869 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t3B7EB1280E5AEE4600C7F239 /* widget_test.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8D07F2C10486CC7A007CD1D0 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t3B7EB1250E5AEE3500C7F239 /* widget.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t3B07BDF10E3F3FAE00647869 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */;\n\t\t\ttargetProxy = 3B07BDF00E3F3FAE00647869 /* PBXContainerItemProxy */;\n\t\t};\n\t\t4024D166113D7D3100C7059E /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 3B07BDE90E3F3F9E00647869 /* WidgetFrameworkTest */;\n\t\t\ttargetProxy = 4024D165113D7D3100C7059E /* PBXContainerItemProxy */;\n\t\t};\n\t\t4024D1ED113D840900C7059E /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */;\n\t\t\ttargetProxy = 4024D1EC113D840900C7059E /* PBXContainerItemProxy */;\n\t\t};\n\t\t4024D1EF113D840D00C7059E /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 4024D162113D7D2400C7059E /* Test */;\n\t\t\ttargetProxy = 4024D1EE113D840D00C7059E /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t3B07BDEC0E3F3F9F00647869 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = WidgetFrameworkTest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t3B07BDED0E3F3F9F00647869 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = WidgetFrameworkTest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4024D163113D7D2400C7059E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = TestAndBuild;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4024D164113D7D2400C7059E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = TestAndBuild;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4024D1EA113D83FF00C7059E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = TestAndBuild;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4024D1EB113D83FF00C7059E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = TestAndBuild;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4FADC24308B4156D00ABE55E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"@loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_NAME = Widget;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4FADC24408B4156D00ABE55E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"@loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_NAME = Widget;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4FADC24708B4156D00ABE55E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_VERSION = 4.0;\n\t\t\t\tSDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4FADC24808B4156D00ABE55E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_VERSION = 4.0;\n\t\t\t\tSDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t3B07BDF40E3F3FB600647869 /* Build configuration list for PBXNativeTarget \"WidgetFrameworkTest\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t3B07BDEC0E3F3F9F00647869 /* Debug */,\n\t\t\t\t3B07BDED0E3F3F9F00647869 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4024D169113D7D4600C7059E /* Build configuration list for PBXAggregateTarget \"Test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4024D163113D7D2400C7059E /* Debug */,\n\t\t\t\t4024D164113D7D2400C7059E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4024D1F0113D842B00C7059E /* Build configuration list for PBXAggregateTarget \"TestAndBuild\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4024D1EA113D83FF00C7059E /* Debug */,\n\t\t\t\t4024D1EB113D83FF00C7059E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget \"WidgetFramework\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4FADC24308B4156D00ABE55E /* Debug */,\n\t\t\t\t4FADC24408B4156D00ABE55E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject \"WidgetFramework\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4FADC24708B4156D00ABE55E /* Debug */,\n\t\t\t\t4FADC24808B4156D00ABE55E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 0867D690FE84028FC02AAC07 /* Project object */;\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/xcode/Samples/FrameworkSample/runtests.sh",
    "content": "#!/bin/bash\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n# Executes the samples and tests for the Google Test Framework.\n\n# Help the dynamic linker find the path to the libraries.\nexport DYLD_FRAMEWORK_PATH=$BUILT_PRODUCTS_DIR\nexport DYLD_LIBRARY_PATH=$BUILT_PRODUCTS_DIR\n\n# Create some executables.\ntest_executables=$@\n\n# Now execute each one in turn keeping track of how many succeeded and failed.\nsucceeded=0\nfailed=0\nfailed_list=()\nfor test in ${test_executables[*]}; do\n  \"$test\"\n  result=$?\n  if [ $result -eq 0 ]; then\n    succeeded=$(( $succeeded + 1 ))\n  else\n    failed=$(( failed + 1 ))\n    failed_list=\"$failed_list $test\"\n  fi\ndone\n\n# Report the successes and failures to the console.\necho \"Tests complete with $succeeded successes and $failed failures.\"\nif [ $failed -ne 0 ]; then\n  echo \"The following tests failed:\"\n  echo $failed_list\nfi\nexit $failed\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/xcode/Samples/FrameworkSample/widget.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: preston.a.jackson@gmail.com (Preston Jackson)\n//\n// Google Test - FrameworkSample\n// widget.cc\n//\n\n// Widget is a very simple class used for demonstrating the use of gtest\n\n#include \"widget.h\"\n\nWidget::Widget(int number, const std::string& name)\n    : number_(number),\n      name_(name) {}\n\nWidget::~Widget() {}\n\nfloat Widget::GetFloatValue() const {\n  return number_;\n}\n\nint Widget::GetIntValue() const {\n  return static_cast<int>(number_);\n}\n\nstd::string Widget::GetStringValue() const {\n  return name_;\n}\n\nvoid Widget::GetCharPtrValue(char* buffer, size_t max_size) const {\n  // Copy the char* representation of name_ into buffer, up to max_size.\n  strncpy(buffer, name_.c_str(), max_size-1);\n  buffer[max_size-1] = '\\0';\n  return;\n}\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/xcode/Samples/FrameworkSample/widget.h",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: preston.a.jackson@gmail.com (Preston Jackson)\n//\n// Google Test - FrameworkSample\n// widget.h\n//\n\n// Widget is a very simple class used for demonstrating the use of gtest. It\n// simply stores two values a string and an integer, which are returned via\n// public accessors in multiple forms.\n\n#import <string>\n\nclass Widget {\n public:\n  Widget(int number, const std::string& name);\n  ~Widget();\n\n  // Public accessors to number data\n  float GetFloatValue() const;\n  int GetIntValue() const;\n\n  // Public accessors to the string data\n  std::string GetStringValue() const;\n  void GetCharPtrValue(char* buffer, size_t max_size) const;\n\n private:\n  // Data members\n  float number_;\n  std::string name_;\n};\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/xcode/Samples/FrameworkSample/widget_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: preston.a.jackson@gmail.com (Preston Jackson)\n//\n// Google Test - FrameworkSample\n// widget_test.cc\n//\n\n// This is a simple test file for the Widget class in the Widget.framework\n\n#include <string>\n#include \"gtest/gtest.h\"\n\n#include <Widget/widget.h>\n\n// This test verifies that the constructor sets the internal state of the\n// Widget class correctly.\nTEST(WidgetInitializerTest, TestConstructor) {\n  Widget widget(1.0f, \"name\");\n  EXPECT_FLOAT_EQ(1.0f, widget.GetFloatValue());\n  EXPECT_EQ(std::string(\"name\"), widget.GetStringValue());\n}\n\n// This test verifies the conversion of the float and string values to int and\n// char*, respectively.\nTEST(WidgetInitializerTest, TestConversion) {\n  Widget widget(1.0f, \"name\");\n  EXPECT_EQ(1, widget.GetIntValue());\n\n  size_t max_size = 128;\n  char buffer[max_size];\n  widget.GetCharPtrValue(buffer, max_size);\n  EXPECT_STREQ(\"name\", buffer);\n}\n\n// Use the Google Test main that is linked into the framework. It does something\n// like this:\n// int main(int argc, char** argv) {\n//   testing::InitGoogleTest(&argc, argv);\n//   return RUN_ALL_TESTS();\n// }\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/xcode/Scripts/runtests.sh",
    "content": "#!/bin/bash\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n# Executes the samples and tests for the Google Test Framework.\n\n# Help the dynamic linker find the path to the libraries.\nexport DYLD_FRAMEWORK_PATH=$BUILT_PRODUCTS_DIR\nexport DYLD_LIBRARY_PATH=$BUILT_PRODUCTS_DIR\n\n# Create some executables.\ntest_executables=(\"$BUILT_PRODUCTS_DIR/gtest_unittest-framework\"\n                  \"$BUILT_PRODUCTS_DIR/gtest_unittest\"\n                  \"$BUILT_PRODUCTS_DIR/sample1_unittest-framework\"\n                  \"$BUILT_PRODUCTS_DIR/sample1_unittest-static\")\n\n# Now execute each one in turn keeping track of how many succeeded and failed. \nsucceeded=0\nfailed=0\nfailed_list=()\nfor test in ${test_executables[*]}; do\n  \"$test\"\n  result=$?\n  if [ $result -eq 0 ]; then\n    succeeded=$(( $succeeded + 1 ))\n  else\n    failed=$(( failed + 1 ))\n    failed_list=\"$failed_list $test\"\n  fi\ndone\n\n# Report the successes and failures to the console.\necho \"Tests complete with $succeeded successes and $failed failures.\"\nif [ $failed -ne 0 ]; then\n  echo \"The following tests failed:\"\n  echo $failed_list\nfi\nexit $failed\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/xcode/Scripts/versiongenerate.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"A script to prepare version information for use the gtest Info.plist file.\n\n  This script extracts the version information from the configure.ac file and\n  uses it to generate a header file containing the same information. The\n  #defines in this header file will be included in during the generation of\n  the Info.plist of the framework, giving the correct value to the version\n  shown in the Finder.\n\n  This script makes the following assumptions (these are faults of the script,\n  not problems with the Autoconf):\n    1. The AC_INIT macro will be contained within the first 1024 characters\n       of configure.ac\n    2. The version string will be 3 integers separated by periods and will be\n       surrounded by square brackets, \"[\" and \"]\" (e.g. [1.0.1]). The first\n       segment represents the major version, the second represents the minor\n       version and the third represents the fix version.\n    3. No \")\" character exists between the opening \"(\" and closing \")\" of\n       AC_INIT, including in comments and character strings.\n\"\"\"\n\nimport sys\nimport re\n\n# Read the command line argument (the output directory for Version.h)\nif (len(sys.argv) < 3):\n  print \"Usage: versiongenerate.py input_dir output_dir\"\n  sys.exit(1)\nelse:\n  input_dir = sys.argv[1]\n  output_dir = sys.argv[2]\n\n# Read the first 1024 characters of the configure.ac file\nconfig_file = open(\"%s/configure.ac\" % input_dir, 'r')\nbuffer_size = 1024\nopening_string = config_file.read(buffer_size)\nconfig_file.close()\n\n# Extract the version string from the AC_INIT macro\n#   The following init_expression means:\n#     Extract three integers separated by periods and surrounded by square\n#     brackets(e.g. \"[1.0.1]\") between \"AC_INIT(\" and \")\". Do not be greedy\n#     (*? is the non-greedy flag) since that would pull in everything between\n#     the first \"(\" and the last \")\" in the file.\nversion_expression = re.compile(r\"AC_INIT\\(.*?\\[(\\d+)\\.(\\d+)\\.(\\d+)\\].*?\\)\",\n                                re.DOTALL)\nversion_values = version_expression.search(opening_string)\nmajor_version = version_values.group(1)\nminor_version = version_values.group(2)\nfix_version = version_values.group(3)\n\n# Write the version information to a header file to be included in the\n# Info.plist file.\nfile_data = \"\"\"//\n// DO NOT MODIFY THIS FILE (but you can delete it)\n//\n// This file is autogenerated by the versiongenerate.py script. This script\n// is executed in a \"Run Script\" build phase when creating gtest.framework. This\n// header file is not used during compilation of C-source. Rather, it simply\n// defines some version strings for substitution in the Info.plist. Because of\n// this, we are not restricted to C-syntax nor are we using include guards.\n//\n\n#define GTEST_VERSIONINFO_SHORT %s.%s\n#define GTEST_VERSIONINFO_LONG %s.%s.%s\n\n\"\"\" % (major_version, minor_version, major_version, minor_version, fix_version)\nversion_file = open(\"%s/Version.h\" % output_dir, 'w')\nversion_file.write(file_data)\nversion_file.close()\n"
  },
  {
    "path": "src/third-party/googletest-1.8.1/googletest/xcode/gtest.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXAggregateTarget section */\n\t\t3B238F5F0E828B5400846E11 /* Check */ = {\n\t\t\tisa = PBXAggregateTarget;\n\t\t\tbuildConfigurationList = 3B238FA30E828BB600846E11 /* Build configuration list for PBXAggregateTarget \"Check\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t3B238F5E0E828B5400846E11 /* ShellScript */,\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t40899F9D0FFA740F000B29AE /* PBXTargetDependency */,\n\t\t\t\t40C849F7101A43440083642A /* PBXTargetDependency */,\n\t\t\t\t4089A0980FFAD34A000B29AE /* PBXTargetDependency */,\n\t\t\t\t40C849F9101A43490083642A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Check;\n\t\t\tproductName = Check;\n\t\t};\n\t\t40C44ADC0E3798F4008FCC51 /* Version Info */ = {\n\t\t\tisa = PBXAggregateTarget;\n\t\t\tbuildConfigurationList = 40C44AE40E379905008FCC51 /* Build configuration list for PBXAggregateTarget \"Version Info\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t40C44ADB0E3798F4008FCC51 /* Generate Version.h */,\n\t\t\t);\n\t\t\tcomments = \"The generation of Version.h must be performed in its own target. Since the Info.plist is preprocessed before any of the other build phases in gtest, the Version.h file would not be ready if included as a build phase of that target.\";\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Version Info\";\n\t\t\tproductName = Version.h;\n\t\t};\n/* End PBXAggregateTarget section */\n\n/* Begin PBXBuildFile section */\n\t\t224A12A30E9EADCC00BD17FD /* gtest-test-part.h in Headers */ = {isa = PBXBuildFile; fileRef = 224A12A20E9EADCC00BD17FD /* gtest-test-part.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t3BF6F2A00E79B5AD000F2EEE /* gtest-type-util.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 3BF6F29F0E79B5AD000F2EEE /* gtest-type-util.h */; };\n\t\t3BF6F2A50E79B616000F2EEE /* gtest-typed-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BF6F2A40E79B616000F2EEE /* gtest-typed-test.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t404884380E2F799B00CF7658 /* gtest-death-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DB0E2F799B00CF7658 /* gtest-death-test.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t404884390E2F799B00CF7658 /* gtest-message.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DC0E2F799B00CF7658 /* gtest-message.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t4048843A0E2F799B00CF7658 /* gtest-spi.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DD0E2F799B00CF7658 /* gtest-spi.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t4048843B0E2F799B00CF7658 /* gtest.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DE0E2F799B00CF7658 /* gtest.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t4048843C0E2F799B00CF7658 /* gtest_pred_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DF0E2F799B00CF7658 /* gtest_pred_impl.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t4048843D0E2F799B00CF7658 /* gtest_prod.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883E00E2F799B00CF7658 /* gtest_prod.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t404884500E2F799B00CF7658 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 404883F60E2F799B00CF7658 /* README.md */; };\n\t\t404884A00E2F7BE600CF7658 /* gtest-death-test-internal.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E20E2F799B00CF7658 /* gtest-death-test-internal.h */; };\n\t\t404884A10E2F7BE600CF7658 /* gtest-filepath.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E30E2F799B00CF7658 /* gtest-filepath.h */; };\n\t\t404884A20E2F7BE600CF7658 /* gtest-internal.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E40E2F799B00CF7658 /* gtest-internal.h */; };\n\t\t404884A30E2F7BE600CF7658 /* gtest-port.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E50E2F799B00CF7658 /* gtest-port.h */; };\n\t\t404884A40E2F7BE600CF7658 /* gtest-string.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E60E2F799B00CF7658 /* gtest-string.h */; };\n\t\t404884AC0E2F7CD900CF7658 /* CHANGES in Resources */ = {isa = PBXBuildFile; fileRef = 404884A90E2F7CD900CF7658 /* CHANGES */; };\n\t\t404884AD0E2F7CD900CF7658 /* CONTRIBUTORS in Resources */ = {isa = PBXBuildFile; fileRef = 404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */; };\n\t\t404884AE0E2F7CD900CF7658 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 404884AB0E2F7CD900CF7658 /* LICENSE */; };\n\t\t40899F3A0FFA70D4000B29AE /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = 224A12A10E9EADA700BD17FD /* gtest-all.cc */; };\n\t\t40899F500FFA7281000B29AE /* gtest-tuple.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 40899F4D0FFA7271000B29AE /* gtest-tuple.h */; };\n\t\t40899F530FFA72A0000B29AE /* gtest_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B238C120E7FE13C00846E11 /* gtest_unittest.cc */; };\n\t\t4089A0440FFAD1BE000B29AE /* sample1.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02C0FFACF7F000B29AE /* sample1.cc */; };\n\t\t4089A0460FFAD1BE000B29AE /* sample1_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */; };\n\t\t40C848FF101A21150083642A /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = 224A12A10E9EADA700BD17FD /* gtest-all.cc */; };\n\t\t40C84915101A21DF0083642A /* gtest_main.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4048840D0E2F799B00CF7658 /* gtest_main.cc */; };\n\t\t40C84916101A235B0083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };\n\t\t40C84921101A23AD0083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };\n\t\t40C84978101A36540083642A /* libgtest_main.a in Resources */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };\n\t\t40C84980101A36850083642A /* gtest_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B238C120E7FE13C00846E11 /* gtest_unittest.cc */; };\n\t\t40C84982101A36850083642A /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C848FA101A209C0083642A /* libgtest.a */; };\n\t\t40C84983101A36850083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };\n\t\t40C8498F101A36A60083642A /* sample1.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02C0FFACF7F000B29AE /* sample1.cc */; };\n\t\t40C84990101A36A60083642A /* sample1_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */; };\n\t\t40C84992101A36A60083642A /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C848FA101A209C0083642A /* libgtest.a */; };\n\t\t40C84993101A36A60083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };\n\t\t40C849A2101A37050083642A /* gtest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4539C8FF0EC27F6400A70F4C /* gtest.framework */; };\n\t\t40C849A4101A37150083642A /* gtest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4539C8FF0EC27F6400A70F4C /* gtest.framework */; };\n\t\t4539C9340EC280AE00A70F4C /* gtest-param-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 4539C9330EC280AE00A70F4C /* gtest-param-test.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t4539C9380EC280E200A70F4C /* gtest-linked_ptr.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 4539C9350EC280E200A70F4C /* gtest-linked_ptr.h */; };\n\t\t4539C9390EC280E200A70F4C /* gtest-param-util-generated.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 4539C9360EC280E200A70F4C /* gtest-param-util-generated.h */; };\n\t\t4539C93A0EC280E200A70F4C /* gtest-param-util.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 4539C9370EC280E200A70F4C /* gtest-param-util.h */; };\n\t\t4567C8181264FF71007740BE /* gtest-printers.h in Headers */ = {isa = PBXBuildFile; fileRef = 4567C8171264FF71007740BE /* gtest-printers.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tF67D4F3E1C7F5D8B0017C729 /* gtest-port-arch.h in Headers */ = {isa = PBXBuildFile; fileRef = F67D4F3D1C7F5D8B0017C729 /* gtest-port-arch.h */; };\n\t\tF67D4F3F1C7F5DA70017C729 /* gtest-port-arch.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = F67D4F3D1C7F5D8B0017C729 /* gtest-port-arch.h */; };\n\t\tF67D4F441C7F5DD00017C729 /* gtest-port.h in Headers */ = {isa = PBXBuildFile; fileRef = F67D4F411C7F5DD00017C729 /* gtest-port.h */; };\n\t\tF67D4F451C7F5DD00017C729 /* gtest-printers.h in Headers */ = {isa = PBXBuildFile; fileRef = F67D4F421C7F5DD00017C729 /* gtest-printers.h */; };\n\t\tF67D4F461C7F5DD00017C729 /* gtest.h in Headers */ = {isa = PBXBuildFile; fileRef = F67D4F431C7F5DD00017C729 /* gtest.h */; };\n\t\tF67D4F481C7F5E160017C729 /* gtest-port.h in Copy Headers Internal Custom */ = {isa = PBXBuildFile; fileRef = F67D4F411C7F5DD00017C729 /* gtest-port.h */; };\n\t\tF67D4F491C7F5E260017C729 /* gtest-printers.h in Copy Headers Internal Custom */ = {isa = PBXBuildFile; fileRef = F67D4F421C7F5DD00017C729 /* gtest-printers.h */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t40899F9C0FFA740F000B29AE /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40899F420FFA7184000B29AE;\n\t\t\tremoteInfo = gtest_unittest;\n\t\t};\n\t\t4089A0970FFAD34A000B29AE /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 4089A0120FFACEFC000B29AE;\n\t\t\tremoteInfo = sample1_unittest;\n\t\t};\n\t\t408BEC0F1046CFE900DEF522 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C848F9101A209C0083642A;\n\t\t\tremoteInfo = \"gtest-static\";\n\t\t};\n\t\t40C44AE50E379922008FCC51 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C44ADC0E3798F4008FCC51;\n\t\t\tremoteInfo = Version.h;\n\t\t};\n\t\t40C8497C101A36850083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C848F9101A209C0083642A;\n\t\t\tremoteInfo = \"gtest-static\";\n\t\t};\n\t\t40C8497E101A36850083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C8490A101A217E0083642A;\n\t\t\tremoteInfo = \"gtest_main-static\";\n\t\t};\n\t\t40C8498B101A36A60083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C848F9101A209C0083642A;\n\t\t\tremoteInfo = \"gtest-static\";\n\t\t};\n\t\t40C8498D101A36A60083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C8490A101A217E0083642A;\n\t\t\tremoteInfo = \"gtest_main-static\";\n\t\t};\n\t\t40C8499B101A36DC0083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C8490A101A217E0083642A;\n\t\t\tremoteInfo = \"gtest_main-static\";\n\t\t};\n\t\t40C8499D101A36E50083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0;\n\t\t\tremoteInfo = \"gtest-framework\";\n\t\t};\n\t\t40C8499F101A36F10083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0;\n\t\t\tremoteInfo = \"gtest-framework\";\n\t\t};\n\t\t40C849F6101A43440083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C8497A101A36850083642A;\n\t\t\tremoteInfo = \"gtest_unittest-static\";\n\t\t};\n\t\t40C849F8101A43490083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C84989101A36A60083642A;\n\t\t\tremoteInfo = \"sample1_unittest-static\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t404884A50E2F7C0400CF7658 /* Copy Headers Internal */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = Headers/internal;\n\t\t\tdstSubfolderSpec = 6;\n\t\t\tfiles = (\n\t\t\t\tF67D4F3F1C7F5DA70017C729 /* gtest-port-arch.h in Copy Headers Internal */,\n\t\t\t\t404884A00E2F7BE600CF7658 /* gtest-death-test-internal.h in Copy Headers Internal */,\n\t\t\t\t404884A10E2F7BE600CF7658 /* gtest-filepath.h in Copy Headers Internal */,\n\t\t\t\t404884A20E2F7BE600CF7658 /* gtest-internal.h in Copy Headers Internal */,\n\t\t\t\t4539C9380EC280E200A70F4C /* gtest-linked_ptr.h in Copy Headers Internal */,\n\t\t\t\t4539C9390EC280E200A70F4C /* gtest-param-util-generated.h in Copy Headers Internal */,\n\t\t\t\t4539C93A0EC280E200A70F4C /* gtest-param-util.h in Copy Headers Internal */,\n\t\t\t\t404884A30E2F7BE600CF7658 /* gtest-port.h in Copy Headers Internal */,\n\t\t\t\t404884A40E2F7BE600CF7658 /* gtest-string.h in Copy Headers Internal */,\n\t\t\t\t40899F500FFA7281000B29AE /* gtest-tuple.h in Copy Headers Internal */,\n\t\t\t\t3BF6F2A00E79B5AD000F2EEE /* gtest-type-util.h in Copy Headers Internal */,\n\t\t\t);\n\t\t\tname = \"Copy Headers Internal\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF67D4F471C7F5DF60017C729 /* Copy Headers Internal Custom */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = Headers/internal/custom;\n\t\t\tdstSubfolderSpec = 6;\n\t\t\tfiles = (\n\t\t\t\tF67D4F491C7F5E260017C729 /* gtest-printers.h in Copy Headers Internal Custom */,\n\t\t\t\tF67D4F481C7F5E160017C729 /* gtest-port.h in Copy Headers Internal Custom */,\n\t\t\t);\n\t\t\tname = \"Copy Headers Internal Custom\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t224A12A10E9EADA700BD17FD /* gtest-all.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = \"gtest-all.cc\"; sourceTree = \"<group>\"; };\n\t\t224A12A20E9EADCC00BD17FD /* gtest-test-part.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = \"gtest-test-part.h\"; sourceTree = \"<group>\"; };\n\t\t3B238C120E7FE13C00846E11 /* gtest_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gtest_unittest.cc; sourceTree = \"<group>\"; };\n\t\t3B87D2100E96B92E000D1852 /* runtests.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = runtests.sh; sourceTree = \"<group>\"; };\n\t\t3BF6F29F0E79B5AD000F2EEE /* gtest-type-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-type-util.h\"; sourceTree = \"<group>\"; };\n\t\t3BF6F2A40E79B616000F2EEE /* gtest-typed-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-typed-test.h\"; sourceTree = \"<group>\"; };\n\t\t403EE37C0E377822004BD1E2 /* versiongenerate.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = versiongenerate.py; sourceTree = \"<group>\"; };\n\t\t404883DB0E2F799B00CF7658 /* gtest-death-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-death-test.h\"; sourceTree = \"<group>\"; };\n\t\t404883DC0E2F799B00CF7658 /* gtest-message.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-message.h\"; sourceTree = \"<group>\"; };\n\t\t404883DD0E2F799B00CF7658 /* gtest-spi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-spi.h\"; sourceTree = \"<group>\"; };\n\t\t404883DE0E2F799B00CF7658 /* gtest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest.h; sourceTree = \"<group>\"; };\n\t\t404883DF0E2F799B00CF7658 /* gtest_pred_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest_pred_impl.h; sourceTree = \"<group>\"; };\n\t\t404883E00E2F799B00CF7658 /* gtest_prod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest_prod.h; sourceTree = \"<group>\"; };\n\t\t404883E20E2F799B00CF7658 /* gtest-death-test-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-death-test-internal.h\"; sourceTree = \"<group>\"; };\n\t\t404883E30E2F799B00CF7658 /* gtest-filepath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-filepath.h\"; sourceTree = \"<group>\"; };\n\t\t404883E40E2F799B00CF7658 /* gtest-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-internal.h\"; sourceTree = \"<group>\"; };\n\t\t404883E50E2F799B00CF7658 /* gtest-port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-port.h\"; sourceTree = \"<group>\"; };\n\t\t404883E60E2F799B00CF7658 /* gtest-string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-string.h\"; sourceTree = \"<group>\"; };\n\t\t404883F60E2F799B00CF7658 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.md; path = ../README.md; sourceTree = SOURCE_ROOT; };\n\t\t4048840D0E2F799B00CF7658 /* gtest_main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gtest_main.cc; sourceTree = \"<group>\"; };\n\t\t404884A90E2F7CD900CF7658 /* CHANGES */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CHANGES; path = ../CHANGES; sourceTree = SOURCE_ROOT; };\n\t\t404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CONTRIBUTORS; path = ../CONTRIBUTORS; sourceTree = SOURCE_ROOT; };\n\t\t404884AB0E2F7CD900CF7658 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = SOURCE_ROOT; };\n\t\t40899F430FFA7184000B29AE /* gtest_unittest-framework */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = \"gtest_unittest-framework\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t40899F4D0FFA7271000B29AE /* gtest-tuple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-tuple.h\"; sourceTree = \"<group>\"; };\n\t\t40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = StaticLibraryTarget.xcconfig; sourceTree = \"<group>\"; };\n\t\t4089A0130FFACEFC000B29AE /* sample1_unittest-framework */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = \"sample1_unittest-framework\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t4089A02C0FFACF7F000B29AE /* sample1.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sample1.cc; sourceTree = \"<group>\"; };\n\t\t4089A02D0FFACF7F000B29AE /* sample1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sample1.h; sourceTree = \"<group>\"; };\n\t\t4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sample1_unittest.cc; sourceTree = \"<group>\"; };\n\t\t40C848FA101A209C0083642A /* libgtest.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgtest.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t40C8490B101A217E0083642A /* libgtest_main.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgtest_main.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t40C84987101A36850083642A /* gtest_unittest */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = gtest_unittest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t40C84997101A36A60083642A /* sample1_unittest-static */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = \"sample1_unittest-static\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t40D4CDF10E30E07400294801 /* DebugProject.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = DebugProject.xcconfig; sourceTree = \"<group>\"; };\n\t\t40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = FrameworkTarget.xcconfig; sourceTree = \"<group>\"; };\n\t\t40D4CDF30E30E07400294801 /* General.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = General.xcconfig; sourceTree = \"<group>\"; };\n\t\t40D4CDF40E30E07400294801 /* ReleaseProject.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ReleaseProject.xcconfig; sourceTree = \"<group>\"; };\n\t\t40D4CF510E30F5E200294801 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t4539C8FF0EC27F6400A70F4C /* gtest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = gtest.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t4539C9330EC280AE00A70F4C /* gtest-param-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-param-test.h\"; sourceTree = \"<group>\"; };\n\t\t4539C9350EC280E200A70F4C /* gtest-linked_ptr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-linked_ptr.h\"; sourceTree = \"<group>\"; };\n\t\t4539C9360EC280E200A70F4C /* gtest-param-util-generated.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-param-util-generated.h\"; sourceTree = \"<group>\"; };\n\t\t4539C9370EC280E200A70F4C /* gtest-param-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-param-util.h\"; sourceTree = \"<group>\"; };\n\t\t4567C8171264FF71007740BE /* gtest-printers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-printers.h\"; sourceTree = \"<group>\"; };\n\t\tF67D4F3D1C7F5D8B0017C729 /* gtest-port-arch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-port-arch.h\"; sourceTree = \"<group>\"; };\n\t\tF67D4F411C7F5DD00017C729 /* gtest-port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-port.h\"; sourceTree = \"<group>\"; };\n\t\tF67D4F421C7F5DD00017C729 /* gtest-printers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-printers.h\"; sourceTree = \"<group>\"; };\n\t\tF67D4F431C7F5DD00017C729 /* gtest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest.h; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t40899F410FFA7184000B29AE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40C849A4101A37150083642A /* gtest.framework in Frameworks */,\n\t\t\t\t40C84916101A235B0083642A /* libgtest_main.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t4089A0110FFACEFC000B29AE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40C849A2101A37050083642A /* gtest.framework in Frameworks */,\n\t\t\t\t40C84921101A23AD0083642A /* libgtest_main.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t40C84981101A36850083642A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40C84982101A36850083642A /* libgtest.a in Frameworks */,\n\t\t\t\t40C84983101A36850083642A /* libgtest_main.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t40C84991101A36A60083642A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40C84992101A36A60083642A /* libgtest.a in Frameworks */,\n\t\t\t\t40C84993101A36A60083642A /* libgtest_main.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t034768DDFF38A45A11DB9C8B /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4539C8FF0EC27F6400A70F4C /* gtest.framework */,\n\t\t\t\t40C848FA101A209C0083642A /* libgtest.a */,\n\t\t\t\t40C8490B101A217E0083642A /* libgtest_main.a */,\n\t\t\t\t40899F430FFA7184000B29AE /* gtest_unittest-framework */,\n\t\t\t\t40C84987101A36850083642A /* gtest_unittest */,\n\t\t\t\t4089A0130FFACEFC000B29AE /* sample1_unittest-framework */,\n\t\t\t\t40C84997101A36A60083642A /* sample1_unittest-static */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0867D691FE84028FC02AAC07 /* gtest */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t40D4CDF00E30E07400294801 /* Config */,\n\t\t\t\t08FB77ACFE841707C02AAC07 /* Source */,\n\t\t\t\t40D4CF4E0E30F5E200294801 /* Resources */,\n\t\t\t\t403EE37B0E377822004BD1E2 /* Scripts */,\n\t\t\t\t034768DDFF38A45A11DB9C8B /* Products */,\n\t\t\t);\n\t\t\tname = gtest;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t08FB77ACFE841707C02AAC07 /* Source */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t404884A90E2F7CD900CF7658 /* CHANGES */,\n\t\t\t\t404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */,\n\t\t\t\t404884AB0E2F7CD900CF7658 /* LICENSE */,\n\t\t\t\t404883F60E2F799B00CF7658 /* README.md */,\n\t\t\t\t404883D90E2F799B00CF7658 /* include */,\n\t\t\t\t4089A02F0FFACF84000B29AE /* samples */,\n\t\t\t\t404884070E2F799B00CF7658 /* src */,\n\t\t\t\t3B238BF00E7FE13B00846E11 /* test */,\n\t\t\t);\n\t\t\tname = Source;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3B238BF00E7FE13B00846E11 /* test */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B238C120E7FE13C00846E11 /* gtest_unittest.cc */,\n\t\t\t);\n\t\t\tname = test;\n\t\t\tpath = ../test;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\t403EE37B0E377822004BD1E2 /* Scripts */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t403EE37C0E377822004BD1E2 /* versiongenerate.py */,\n\t\t\t\t3B87D2100E96B92E000D1852 /* runtests.sh */,\n\t\t\t);\n\t\t\tpath = Scripts;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t404883D90E2F799B00CF7658 /* include */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t404883DA0E2F799B00CF7658 /* gtest */,\n\t\t\t);\n\t\t\tname = include;\n\t\t\tpath = ../include;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\t404883DA0E2F799B00CF7658 /* gtest */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t404883E10E2F799B00CF7658 /* internal */,\n\t\t\t\t224A12A20E9EADCC00BD17FD /* gtest-test-part.h */,\n\t\t\t\t404883DB0E2F799B00CF7658 /* gtest-death-test.h */,\n\t\t\t\t404883DC0E2F799B00CF7658 /* gtest-message.h */,\n\t\t\t\t4539C9330EC280AE00A70F4C /* gtest-param-test.h */,\n\t\t\t\t4567C8171264FF71007740BE /* gtest-printers.h */,\n\t\t\t\t404883DD0E2F799B00CF7658 /* gtest-spi.h */,\n\t\t\t\t404883DE0E2F799B00CF7658 /* gtest.h */,\n\t\t\t\t404883DF0E2F799B00CF7658 /* gtest_pred_impl.h */,\n\t\t\t\t404883E00E2F799B00CF7658 /* gtest_prod.h */,\n\t\t\t\t3BF6F2A40E79B616000F2EEE /* gtest-typed-test.h */,\n\t\t\t);\n\t\t\tpath = gtest;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t404883E10E2F799B00CF7658 /* internal */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF67D4F401C7F5DD00017C729 /* custom */,\n\t\t\t\t404883E20E2F799B00CF7658 /* gtest-death-test-internal.h */,\n\t\t\t\t404883E30E2F799B00CF7658 /* gtest-filepath.h */,\n\t\t\t\t404883E40E2F799B00CF7658 /* gtest-internal.h */,\n\t\t\t\t4539C9350EC280E200A70F4C /* gtest-linked_ptr.h */,\n\t\t\t\t4539C9360EC280E200A70F4C /* gtest-param-util-generated.h */,\n\t\t\t\t4539C9370EC280E200A70F4C /* gtest-param-util.h */,\n\t\t\t\t404883E50E2F799B00CF7658 /* gtest-port.h */,\n\t\t\t\tF67D4F3D1C7F5D8B0017C729 /* gtest-port-arch.h */,\n\t\t\t\t404883E60E2F799B00CF7658 /* gtest-string.h */,\n\t\t\t\t40899F4D0FFA7271000B29AE /* gtest-tuple.h */,\n\t\t\t\t3BF6F29F0E79B5AD000F2EEE /* gtest-type-util.h */,\n\t\t\t);\n\t\t\tpath = internal;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t404884070E2F799B00CF7658 /* src */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t224A12A10E9EADA700BD17FD /* gtest-all.cc */,\n\t\t\t\t4048840D0E2F799B00CF7658 /* gtest_main.cc */,\n\t\t\t);\n\t\t\tname = src;\n\t\t\tpath = ../src;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\t4089A02F0FFACF84000B29AE /* samples */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4089A02C0FFACF7F000B29AE /* sample1.cc */,\n\t\t\t\t4089A02D0FFACF7F000B29AE /* sample1.h */,\n\t\t\t\t4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */,\n\t\t\t);\n\t\t\tname = samples;\n\t\t\tpath = ../samples;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\t40D4CDF00E30E07400294801 /* Config */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t40D4CDF10E30E07400294801 /* DebugProject.xcconfig */,\n\t\t\t\t40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */,\n\t\t\t\t40D4CDF30E30E07400294801 /* General.xcconfig */,\n\t\t\t\t40D4CDF40E30E07400294801 /* ReleaseProject.xcconfig */,\n\t\t\t\t40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */,\n\t\t\t);\n\t\t\tpath = Config;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t40D4CF4E0E30F5E200294801 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t40D4CF510E30F5E200294801 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF67D4F401C7F5DD00017C729 /* custom */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF67D4F411C7F5DD00017C729 /* gtest-port.h */,\n\t\t\t\tF67D4F421C7F5DD00017C729 /* gtest-printers.h */,\n\t\t\t\tF67D4F431C7F5DD00017C729 /* gtest.h */,\n\t\t\t);\n\t\t\tpath = custom;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t8D07F2BD0486CC7A007CD1D0 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF67D4F451C7F5DD00017C729 /* gtest-printers.h in Headers */,\n\t\t\t\t404884380E2F799B00CF7658 /* gtest-death-test.h in Headers */,\n\t\t\t\t404884390E2F799B00CF7658 /* gtest-message.h in Headers */,\n\t\t\t\t4539C9340EC280AE00A70F4C /* gtest-param-test.h in Headers */,\n\t\t\t\tF67D4F461C7F5DD00017C729 /* gtest.h in Headers */,\n\t\t\t\tF67D4F441C7F5DD00017C729 /* gtest-port.h in Headers */,\n\t\t\t\t4567C8181264FF71007740BE /* gtest-printers.h in Headers */,\n\t\t\t\tF67D4F3E1C7F5D8B0017C729 /* gtest-port-arch.h in Headers */,\n\t\t\t\t3BF6F2A50E79B616000F2EEE /* gtest-typed-test.h in Headers */,\n\t\t\t\t4048843A0E2F799B00CF7658 /* gtest-spi.h in Headers */,\n\t\t\t\t4048843B0E2F799B00CF7658 /* gtest.h in Headers */,\n\t\t\t\t4048843C0E2F799B00CF7658 /* gtest_pred_impl.h in Headers */,\n\t\t\t\t4048843D0E2F799B00CF7658 /* gtest_prod.h in Headers */,\n\t\t\t\t224A12A30E9EADCC00BD17FD /* gtest-test-part.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t40899F420FFA7184000B29AE /* gtest_unittest-framework */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 40899F4A0FFA71BC000B29AE /* Build configuration list for PBXNativeTarget \"gtest_unittest-framework\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t40899F400FFA7184000B29AE /* Sources */,\n\t\t\t\t40899F410FFA7184000B29AE /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t40C849A0101A36F10083642A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"gtest_unittest-framework\";\n\t\t\tproductName = gtest_unittest;\n\t\t\tproductReference = 40899F430FFA7184000B29AE /* gtest_unittest-framework */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t4089A0120FFACEFC000B29AE /* sample1_unittest-framework */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 4089A0240FFACF01000B29AE /* Build configuration list for PBXNativeTarget \"sample1_unittest-framework\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t4089A0100FFACEFC000B29AE /* Sources */,\n\t\t\t\t4089A0110FFACEFC000B29AE /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t40C8499E101A36E50083642A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"sample1_unittest-framework\";\n\t\t\tproductName = sample1_unittest;\n\t\t\tproductReference = 4089A0130FFACEFC000B29AE /* sample1_unittest-framework */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t40C848F9101A209C0083642A /* gtest-static */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 40C84902101A212E0083642A /* Build configuration list for PBXNativeTarget \"gtest-static\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t40C848F7101A209C0083642A /* Sources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"gtest-static\";\n\t\t\tproductName = \"gtest-static\";\n\t\t\tproductReference = 40C848FA101A209C0083642A /* libgtest.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t40C8490A101A217E0083642A /* gtest_main-static */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 40C84912101A21D20083642A /* Build configuration list for PBXNativeTarget \"gtest_main-static\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t40C84908101A217E0083642A /* Sources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"gtest_main-static\";\n\t\t\tproductName = \"gtest_main-static\";\n\t\t\tproductReference = 40C8490B101A217E0083642A /* libgtest_main.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t40C8497A101A36850083642A /* gtest_unittest-static */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 40C84984101A36850083642A /* Build configuration list for PBXNativeTarget \"gtest_unittest-static\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t40C8497F101A36850083642A /* Sources */,\n\t\t\t\t40C84981101A36850083642A /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t40C8497B101A36850083642A /* PBXTargetDependency */,\n\t\t\t\t40C8497D101A36850083642A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"gtest_unittest-static\";\n\t\t\tproductName = gtest_unittest;\n\t\t\tproductReference = 40C84987101A36850083642A /* gtest_unittest */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t40C84989101A36A60083642A /* sample1_unittest-static */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 40C84994101A36A60083642A /* Build configuration list for PBXNativeTarget \"sample1_unittest-static\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t40C8498E101A36A60083642A /* Sources */,\n\t\t\t\t40C84991101A36A60083642A /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t40C8498A101A36A60083642A /* PBXTargetDependency */,\n\t\t\t\t40C8498C101A36A60083642A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"sample1_unittest-static\";\n\t\t\tproductName = sample1_unittest;\n\t\t\tproductReference = 40C84997101A36A60083642A /* sample1_unittest-static */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t8D07F2BC0486CC7A007CD1D0 /* gtest-framework */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget \"gtest-framework\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8D07F2C10486CC7A007CD1D0 /* Sources */,\n\t\t\t\t8D07F2BD0486CC7A007CD1D0 /* Headers */,\n\t\t\t\t404884A50E2F7C0400CF7658 /* Copy Headers Internal */,\n\t\t\t\tF67D4F471C7F5DF60017C729 /* Copy Headers Internal Custom */,\n\t\t\t\t8D07F2BF0486CC7A007CD1D0 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t40C44AE60E379922008FCC51 /* PBXTargetDependency */,\n\t\t\t\t408BEC101046CFE900DEF522 /* PBXTargetDependency */,\n\t\t\t\t40C8499C101A36DC0083642A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"gtest-framework\";\n\t\t\tproductInstallPath = \"$(HOME)/Library/Frameworks\";\n\t\t\tproductName = gtest;\n\t\t\tproductReference = 4539C8FF0EC27F6400A70F4C /* gtest.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t0867D690FE84028FC02AAC07 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0460;\n\t\t\t};\n\t\t\tbuildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject \"gtest\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 1;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\tJapanese,\n\t\t\t\tFrench,\n\t\t\t\tGerman,\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 0867D691FE84028FC02AAC07 /* gtest */;\n\t\t\tproductRefGroup = 034768DDFF38A45A11DB9C8B /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t8D07F2BC0486CC7A007CD1D0 /* gtest-framework */,\n\t\t\t\t40C848F9101A209C0083642A /* gtest-static */,\n\t\t\t\t40C8490A101A217E0083642A /* gtest_main-static */,\n\t\t\t\t40899F420FFA7184000B29AE /* gtest_unittest-framework */,\n\t\t\t\t40C8497A101A36850083642A /* gtest_unittest-static */,\n\t\t\t\t4089A0120FFACEFC000B29AE /* sample1_unittest-framework */,\n\t\t\t\t40C84989101A36A60083642A /* sample1_unittest-static */,\n\t\t\t\t3B238F5F0E828B5400846E11 /* Check */,\n\t\t\t\t40C44ADC0E3798F4008FCC51 /* Version Info */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t8D07F2BF0486CC7A007CD1D0 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t404884500E2F799B00CF7658 /* README.md in Resources */,\n\t\t\t\t404884AC0E2F7CD900CF7658 /* CHANGES in Resources */,\n\t\t\t\t404884AD0E2F7CD900CF7658 /* CONTRIBUTORS in Resources */,\n\t\t\t\t404884AE0E2F7CD900CF7658 /* LICENSE in Resources */,\n\t\t\t\t40C84978101A36540083642A /* libgtest_main.a in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B238F5E0E828B5400846E11 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"# Remember, this \\\"Run Script\\\" build phase will be executed from $SRCROOT\\n/bin/bash Scripts/runtests.sh\";\n\t\t};\n\t\t40C44ADB0E3798F4008FCC51 /* Generate Version.h */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"$(SRCROOT)/Scripts/versiongenerate.py\",\n\t\t\t\t\"$(SRCROOT)/../configure.ac\",\n\t\t\t);\n\t\t\tname = \"Generate Version.h\";\n\t\t\toutputPaths = (\n\t\t\t\t\"$(PROJECT_TEMP_DIR)/Version.h\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"# Remember, this \\\"Run Script\\\" build phase will be executed from $SRCROOT\\n/usr/bin/python Scripts/versiongenerate.py ../ $PROJECT_TEMP_DIR\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t40899F400FFA7184000B29AE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40899F530FFA72A0000B29AE /* gtest_unittest.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t4089A0100FFACEFC000B29AE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t4089A0440FFAD1BE000B29AE /* sample1.cc in Sources */,\n\t\t\t\t4089A0460FFAD1BE000B29AE /* sample1_unittest.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t40C848F7101A209C0083642A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40C848FF101A21150083642A /* gtest-all.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t40C84908101A217E0083642A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40C84915101A21DF0083642A /* gtest_main.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t40C8497F101A36850083642A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40C84980101A36850083642A /* gtest_unittest.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t40C8498E101A36A60083642A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40C8498F101A36A60083642A /* sample1.cc in Sources */,\n\t\t\t\t40C84990101A36A60083642A /* sample1_unittest.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8D07F2C10486CC7A007CD1D0 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40899F3A0FFA70D4000B29AE /* gtest-all.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t40899F9D0FFA740F000B29AE /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40899F420FFA7184000B29AE /* gtest_unittest-framework */;\n\t\t\ttargetProxy = 40899F9C0FFA740F000B29AE /* PBXContainerItemProxy */;\n\t\t};\n\t\t4089A0980FFAD34A000B29AE /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 4089A0120FFACEFC000B29AE /* sample1_unittest-framework */;\n\t\t\ttargetProxy = 4089A0970FFAD34A000B29AE /* PBXContainerItemProxy */;\n\t\t};\n\t\t408BEC101046CFE900DEF522 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C848F9101A209C0083642A /* gtest-static */;\n\t\t\ttargetProxy = 408BEC0F1046CFE900DEF522 /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C44AE60E379922008FCC51 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C44ADC0E3798F4008FCC51 /* Version Info */;\n\t\t\ttargetProxy = 40C44AE50E379922008FCC51 /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C8497B101A36850083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C848F9101A209C0083642A /* gtest-static */;\n\t\t\ttargetProxy = 40C8497C101A36850083642A /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C8497D101A36850083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C8490A101A217E0083642A /* gtest_main-static */;\n\t\t\ttargetProxy = 40C8497E101A36850083642A /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C8498A101A36A60083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C848F9101A209C0083642A /* gtest-static */;\n\t\t\ttargetProxy = 40C8498B101A36A60083642A /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C8498C101A36A60083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C8490A101A217E0083642A /* gtest_main-static */;\n\t\t\ttargetProxy = 40C8498D101A36A60083642A /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C8499C101A36DC0083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C8490A101A217E0083642A /* gtest_main-static */;\n\t\t\ttargetProxy = 40C8499B101A36DC0083642A /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C8499E101A36E50083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 8D07F2BC0486CC7A007CD1D0 /* gtest-framework */;\n\t\t\ttargetProxy = 40C8499D101A36E50083642A /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C849A0101A36F10083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 8D07F2BC0486CC7A007CD1D0 /* gtest-framework */;\n\t\t\ttargetProxy = 40C8499F101A36F10083642A /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C849F7101A43440083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C8497A101A36850083642A /* gtest_unittest-static */;\n\t\t\ttargetProxy = 40C849F6101A43440083642A /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C849F9101A43490083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C84989101A36A60083642A /* sample1_unittest-static */;\n\t\t\ttargetProxy = 40C849F8101A43490083642A /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t3B238F600E828B5400846E11 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tPRODUCT_NAME = Check;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t3B238F610E828B5400846E11 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tPRODUCT_NAME = Check;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tZERO_LINK = NO;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t40899F450FFA7185000B29AE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tHEADER_SEARCH_PATHS = ../;\n\t\t\t\tPRODUCT_NAME = \"gtest_unittest-framework\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t40899F460FFA7185000B29AE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tHEADER_SEARCH_PATHS = ../;\n\t\t\t\tPRODUCT_NAME = \"gtest_unittest-framework\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4089A0150FFACEFD000B29AE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tPRODUCT_NAME = \"sample1_unittest-framework\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4089A0160FFACEFD000B29AE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tPRODUCT_NAME = \"sample1_unittest-framework\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t40C44ADF0E3798F4008FCC51 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.7;\n\t\t\t\tPRODUCT_NAME = gtest;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tTARGET_NAME = gtest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t40C44AE00E3798F4008FCC51 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.7;\n\t\t\t\tPRODUCT_NAME = gtest;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tTARGET_NAME = gtest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t40C848FB101A209D0083642A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tGCC_INLINES_ARE_PRIVATE_EXTERN = YES;\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = YES;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../,\n\t\t\t\t\t../include/,\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = gtest;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t40C848FC101A209D0083642A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tGCC_INLINES_ARE_PRIVATE_EXTERN = YES;\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = YES;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../,\n\t\t\t\t\t../include/,\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = gtest;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t40C8490E101A217F0083642A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../,\n\t\t\t\t\t../include/,\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = gtest_main;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t40C8490F101A217F0083642A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../,\n\t\t\t\t\t../include/,\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = gtest_main;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t40C84985101A36850083642A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tHEADER_SEARCH_PATHS = ../;\n\t\t\t\tPRODUCT_NAME = gtest_unittest;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t40C84986101A36850083642A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tHEADER_SEARCH_PATHS = ../;\n\t\t\t\tPRODUCT_NAME = gtest_unittest;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t40C84995101A36A60083642A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tPRODUCT_NAME = \"sample1_unittest-static\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t40C84996101A36A60083642A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tPRODUCT_NAME = \"sample1_unittest-static\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4FADC24308B4156D00ABE55E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../,\n\t\t\t\t\t../include/,\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Resources/Info.plist;\n\t\t\t\tINFOPLIST_PREFIX_HEADER = \"$(PROJECT_TEMP_DIR)/Version.h\";\n\t\t\t\tINFOPLIST_PREPROCESS = YES;\n\t\t\t\tPRODUCT_NAME = gtest;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4FADC24408B4156D00ABE55E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../,\n\t\t\t\t\t../include/,\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Resources/Info.plist;\n\t\t\t\tINFOPLIST_PREFIX_HEADER = \"$(PROJECT_TEMP_DIR)/Version.h\";\n\t\t\t\tINFOPLIST_PREPROCESS = YES;\n\t\t\t\tPRODUCT_NAME = gtest;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4FADC24708B4156D00ABE55E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40D4CDF10E30E07400294801 /* DebugProject.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.7;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4FADC24808B4156D00ABE55E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40D4CDF40E30E07400294801 /* ReleaseProject.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.7;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t3B238FA30E828BB600846E11 /* Build configuration list for PBXAggregateTarget \"Check\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t3B238F600E828B5400846E11 /* Debug */,\n\t\t\t\t3B238F610E828B5400846E11 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t40899F4A0FFA71BC000B29AE /* Build configuration list for PBXNativeTarget \"gtest_unittest-framework\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t40899F450FFA7185000B29AE /* Debug */,\n\t\t\t\t40899F460FFA7185000B29AE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4089A0240FFACF01000B29AE /* Build configuration list for PBXNativeTarget \"sample1_unittest-framework\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4089A0150FFACEFD000B29AE /* Debug */,\n\t\t\t\t4089A0160FFACEFD000B29AE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t40C44AE40E379905008FCC51 /* Build configuration list for PBXAggregateTarget \"Version Info\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t40C44ADF0E3798F4008FCC51 /* Debug */,\n\t\t\t\t40C44AE00E3798F4008FCC51 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t40C84902101A212E0083642A /* Build configuration list for PBXNativeTarget \"gtest-static\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t40C848FB101A209D0083642A /* Debug */,\n\t\t\t\t40C848FC101A209D0083642A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t40C84912101A21D20083642A /* Build configuration list for PBXNativeTarget \"gtest_main-static\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t40C8490E101A217F0083642A /* Debug */,\n\t\t\t\t40C8490F101A217F0083642A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t40C84984101A36850083642A /* Build configuration list for PBXNativeTarget \"gtest_unittest-static\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t40C84985101A36850083642A /* Debug */,\n\t\t\t\t40C84986101A36850083642A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t40C84994101A36A60083642A /* Build configuration list for PBXNativeTarget \"sample1_unittest-static\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t40C84995101A36A60083642A /* Debug */,\n\t\t\t\t40C84996101A36A60083642A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget \"gtest-framework\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4FADC24308B4156D00ABE55E /* Debug */,\n\t\t\t\t4FADC24408B4156D00ABE55E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject \"gtest\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4FADC24708B4156D00ABE55E /* Debug */,\n\t\t\t\t4FADC24808B4156D00ABE55E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 0867D690FE84028FC02AAC07 /* Project object */;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/CMakeLists.txt",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\nset(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/sources/cmake)\n\nproject(libssh2 C)\n\ninclude(FeatureSummary)\ninclude(CheckFunctionExists)\ninclude(CheckSymbolExists)\ninclude(CheckFunctionExistsMayNeedLibrary)\ninclude(CheckIncludeFiles)\ninclude(CheckTypeSize)\ninclude(CheckSymbolExists)\ninclude(CheckNonblockingSocketSupport)\ninclude(SocketLibraries)\n\nset(HAVE_EVP_AES_128_CTR YES)\n\n## Library definition\nset(SOURCES\n  openssl.c\n  openssl.h\n  agent.c\n  channel.c\n  channel.h\n  comp.c\n  comp.h\n  crypt.c\n  crypto.h\n  global.c\n  hostkey.c\n  keepalive.c\n  kex.c\n  knownhost.c\n  libssh2_priv.h\n  mac.c\n  mac.h\n  misc.c\n  misc.h\n  packet.c\n  packet.h\n  pem.c\n  publickey.c\n  scp.c\n  session.c\n  session.h\n  sftp.c\n  sftp.h\n  transport.c\n  transport.h\n  userauth.c\n  userauth.h\n  version.c)\n\nif(WIN32)\n  list(APPEND SOURCES ../win32/libssh2.rc)\nendif()\n\nforeach (source ${SOURCES})\n  list (APPEND sources sources/src/${source})\nendforeach ()\n\nadd_library(libssh2 ${sources})\n# we want it to be called libssh2 on all platforms\nset_target_properties(libssh2 PROPERTIES PREFIX \"\")\n\ntarget_compile_definitions(libssh2\n    PRIVATE\n        LIBSSH2_OPENSSL)\n\ntarget_link_libraries(libssh2\n    PUBLIC\n       ssl crypto)\n\ntarget_include_directories(libssh2\n    PUBLIC\n        $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/sources/include>\n        $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>)\n\n## Options\n\noption(ENABLE_ZLIB_COMPRESSION \"Use zlib for compression\")\nadd_feature_info(Compression ENABLE_ZLIB_COMPRESSION\n  \"using zlib for compression\")\nif(ENABLE_ZLIB_COMPRESSION)\n  find_package(ZLIB REQUIRED)\n\n  target_include_directories(libssh2 PRIVATE ${ZLIB_INCLUDE_DIRS})\n  list(APPEND LIBRARIES ${ZLIB_LIBRARIES})\n  list(APPEND PC_REQUIRES_PRIVATE zlib)\n  if(ZLIB_FOUND)\n    target_compile_definitions(libssh2 PRIVATE LIBSSH2_HAVE_ZLIB=1)\n  endif()\nendif()\n\n# Enable debugging logging by default if the user configured a debug build\nif(CMAKE_BUILD_TYPE STREQUAL \"Debug\")\n  set(DEBUG_LOGGING_DEFAULT ON)\nelse()\n  set(DEBUG_LOGGING_DEFAULT OFF)\nendif()\n\noption(ENABLE_DEBUG_LOGGING \"log execution with debug trace\"\n  ${DEBUG_LOGGING_DEFAULT})\nadd_feature_info(Logging ENABLE_DEBUG_LOGGING\n   \"Logging of execution with debug trace\")\nif(ENABLE_DEBUG_LOGGING)\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2DEBUG)\nendif()\n\n## Platform checks\ncheck_include_files(unistd.h HAVE_UNISTD_H)\ncheck_include_files(inttypes.h HAVE_INTTYPES_H)\ncheck_include_files(stdlib.h HAVE_STDLIB_H)\ncheck_include_files(sys/select.h HAVE_SYS_SELECT_H)\n\ncheck_include_files(sys/uio.h HAVE_SYS_UIO_H)\ncheck_include_files(sys/socket.h HAVE_SYS_SOCKET_H)\ncheck_include_files(sys/ioctl.h HAVE_SYS_IOCTL_H)\ncheck_include_files(sys/time.h HAVE_SYS_TIME_H)\ncheck_include_files(sys/un.h HAVE_SYS_UN_H)\ncheck_include_files(windows.h HAVE_WINDOWS_H)\ncheck_include_files(ws2tcpip.h HAVE_WS2TCPIP_H)\ncheck_include_files(winsock2.h HAVE_WINSOCK2_H)\n\ncheck_type_size(\"long long\" LONGLONG)\n\nif(HAVE_SYS_TIME_H)\n  check_symbol_exists(gettimeofday sys/time.h HAVE_GETTIMEOFDAY)\nelse()\n  check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)\nendif()\nif(HAVE_STDLIB_H)\n  check_symbol_exists(strtoll stdlib.h HAVE_STRTOLL)\nelse()\n  check_function_exists(strtoll HAVE_STRTOLL)\nendif()\nif (NOT HAVE_STRTOLL)\n  # Try _strtoi64 if strtoll isn't available\n  check_symbol_exists(_strtoi64 stdlib.h HAVE_STRTOI64)\nendif()\ncheck_symbol_exists(snprintf stdio.h HAVE_SNPRINTF)\n\nif(${CMAKE_SYSTEM_NAME} STREQUAL \"Darwin\" OR\n   ${CMAKE_SYSTEM_NAME} STREQUAL \"Interix\")\n  # poll() does not work on these platforms\n  #\n  # Interix: \"does provide poll(), but the implementing developer must\n  # have been in a bad mood, because poll() only works on the /proc\n  # filesystem here\"\n  #\n  # Mac OS X's poll has funny behaviors, like:\n  # not being able to do poll on no fildescriptors (10.3?)\n  # not being able to poll on some files (like anything in /dev)\n  # not having reliable timeout support\n  # inconsistent return of POLLHUP where other implementations give POLLIN\n  message(\"poll use is disabled on this platform\")\nelse()\n  check_function_exists(poll HAVE_POLL)\nendif()\n\nappend_needed_socket_libraries(LIBRARIES)\n\n# Non-blocking socket support tests.  Must be after after library tests to\n# link correctly\nset(SAVE_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})\nset(CMAKE_REQUIRED_LIBRARIES ${LIBRARIES})\ncheck_nonblocking_socket_support()\nset(CMAKE_REQUIRED_LIBRARIES ${SAVE_CMAKE_REQUIRED_LIBRARIES})\n\nconfigure_file(\n  ${CMAKE_CURRENT_SOURCE_DIR}/sources/src/libssh2_config_cmake.h.in\n  ${CMAKE_CURRENT_BINARY_DIR}/libssh2_config.h)\n# to find generated header\ntarget_include_directories(libssh2 PRIVATE ${CMAKE_CURRENT_BINARY_DIR})\n\n# Check for the OS.\n# Daniel's note: this should not be necessary and we need to work to\n# get this removed.\nif(${CMAKE_SYSTEM_NAME} STREQUAL \"Windows\")\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2_WIN32)\nelseif(${CMAKE_SYSTEM_NAME} STREQUAL \"Darwin\")\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2_DARWIN)\nendif()\n\nif(CMAKE_VERSION VERSION_LESS \"2.8.12\")\n  # Fall back to over-linking dependencies\n  target_link_libraries(libssh2 ${LIBRARIES})\nelse()\n  target_link_libraries(libssh2 PRIVATE ${LIBRARIES})\nendif()\n\n# Ignore single compiler warning for this third-party project\nif(COMPILER_MSVC)\n  set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} /wd4133\")\nendif()\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/README.md",
    "content": "What is libssh2\n===============\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/.gitattribute",
    "content": "win32/msvcproj.head -crlf\nwin32/msvcproj.foot -crlf\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/.gitignore",
    "content": ".deps\n.libs\n*.lib\n*.pdb\n*.dll\n*.exe\n*.obj\n.*.swp\nDebug\nRelease\n*.exp\nMakefile\nMakefile.in\naclocal.m4\nautom4te.cache\nconfig.guess\nconfig.log\nconfig.status\nconfig.sub\nconfigure\ndepcomp\nlibtool\nltmain.sh\nmissing\nssh2_sample\nlibssh2-*.tar.gz\ninstall-sh\n*.o\n*.lo\n*.la\nmkinstalldirs\ntags\nlibssh2.pc\nTAGS\n*~\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/.travis.yml",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\nlanguage: c\n\ncompiler:\n  - gcc\n  - clang\n\nenv:\n  matrix:\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=OFF\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=OFF\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=ON\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=ON\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=Libgcrypt BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=OFF\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=Libgcrypt BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=OFF\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=Libgcrypt BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=ON\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=Libgcrypt BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=ON\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=OFF\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=OFF\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=ON\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=ON\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=Libgcrypt BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=OFF\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=Libgcrypt BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=OFF\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=Libgcrypt BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=ON\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=Libgcrypt BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=ON\n\nbefore_install:\n  - sudo add-apt-repository --yes ppa:kalakris/cmake\n  - sudo apt-get update\n  - sudo apt-get -y install cmake\n  - if [ $ADDRESS_SIZE = '64' ]; then sudo apt-get install -y libgcrypt11-dev libssl-dev zlib1g-dev; fi\n  - if [ $ADDRESS_SIZE = '32' ]; then sudo apt-get install -y linux-libc-dev linux-libc-dev:i386; fi\n  - if [ $ADDRESS_SIZE = '32' ]; then sudo apt-get install -y gcc-multilib libgcrypt11-dev:i386 libssl-dev:i386 zlib1g-dev:i386; fi\n  - if [ $ADDRESS_SIZE = '32' ]; then export TOOLCHAIN_OPTION=\"-DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-Linux-32.cmake\"; fi\n\ninstall:\n  - mkdir bin\n  - cd bin\n\nscript:\n  - cmake $TOOLCHAIN_OPTION -DCRYPTO_BACKEND=$CRYPTO_BACKEND -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS -DENABLE_ZLIB_COMPRESSION=$ENABLE_ZLIB_COMPRESSION .. && cmake --build . && CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target test && cmake --build . --target package\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/CMakeLists.txt",
    "content": "# Copyright (c) 2014, 2015  Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\ncmake_minimum_required(VERSION 2.8.11)\n\nset(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)\n\nproject(libssh2 C)\nset(PROJECT_URL \"https://www.libssh2.org/\")\nset(PROJECT_DESCRIPTION \"The SSH library\")\n\noption(BUILD_SHARED_LIBS \"Build Shared Libraries\" OFF)\n\n# Parse version\n\nfile(READ ${CMAKE_CURRENT_SOURCE_DIR}/include/libssh2.h _HEADER_CONTENTS)\nstring(\n  REGEX REPLACE \".*#define LIBSSH2_VERSION[ \\t]+\\\"([^\\\"]+)\\\".*\" \"\\\\1\"\n  LIBSSH2_VERSION \"${_HEADER_CONTENTS}\")\nstring(\n  REGEX REPLACE \".*#define LIBSSH2_VERSION_MAJOR[ \\t]+([0-9]+).*\" \"\\\\1\"\n  LIBSSH2_VERSION_MAJOR \"${_HEADER_CONTENTS}\")\nstring(\n  REGEX REPLACE \".*#define LIBSSH2_VERSION_MINOR[ \\t]+([0-9]+).*\" \"\\\\1\"\n  LIBSSH2_VERSION_MINOR \"${_HEADER_CONTENTS}\")\nstring(\n  REGEX REPLACE \".*#define LIBSSH2_VERSION_PATCH[ \\t]+([0-9]+).*\" \"\\\\1\"\n  LIBSSH2_VERSION_PATCH \"${_HEADER_CONTENTS}\")\n\nif(NOT LIBSSH2_VERSION OR\n   NOT LIBSSH2_VERSION_MAJOR MATCHES \"^[0-9]+$\" OR\n   NOT LIBSSH2_VERSION_MINOR MATCHES \"^[0-9]+$\" OR\n   NOT LIBSSH2_VERSION_PATCH MATCHES \"^[0-9]+$\")\n  message(\n    FATAL_ERROR\n    \"Unable to parse version from\"\n    \"${CMAKE_CURRENT_SOURCE_DIR}/include/libssh2.h\")\nendif()\n\ninclude(GNUInstallDirs)\ninstall(\n  FILES docs/AUTHORS COPYING docs/HACKING README RELEASE-NOTES NEWS\n  DESTINATION ${CMAKE_INSTALL_DOCDIR})\n\ninclude(max_warnings)\ninclude(FeatureSummary)\n\nadd_subdirectory(src)\n\noption(BUILD_EXAMPLES \"Build libssh2 examples\" ON)\nif(BUILD_EXAMPLES)\n  add_subdirectory(example)\nendif()\n\noption(BUILD_TESTING \"Build libssh2 test suite\" ON)\nif(BUILD_TESTING)\n  enable_testing()\n  add_subdirectory(tests)\nendif()\n\nadd_subdirectory(docs)\n\nfeature_summary(WHAT ALL)\n\nset(CPACK_PACKAGE_VERSION_MAJOR ${LIBSSH2_VERSION_MAJOR})\nset(CPACK_PACKAGE_VERSION_MINOR ${LIBSSH2_VERSION_MINOR})\nset(CPACK_PACKAGE_VERSION_PATCH ${LIBSSH2_VERSION_PATCH})\nset(CPACK_PACKAGE_VERSION ${LIBSSH2_VERSION})\ninclude(CPack)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/COPYING",
    "content": "/* Copyright (c) 2004-2007 Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2005,2006 Mikhail Gusarov <dottedmag@dottedmag.net>\n * Copyright (c) 2006-2007 The Written Word, Inc.\n * Copyright (c) 2007 Eli Fant <elifantu@mail.ru>\n * Copyright (c) 2009-2014 Daniel Stenberg\n * Copyright (C) 2008, 2009 Simon Josefsson\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/Makefile.OpenSSL.inc",
    "content": "CRYPTO_CSOURCES = openssl.c\nCRYPTO_HHEADERS = openssl.h\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/Makefile.WinCNG.inc",
    "content": "CRYPTO_CSOURCES = wincng.c\nCRYPTO_HHEADERS = wincng.h\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/Makefile.am",
    "content": "AUTOMAKE_OPTIONS = foreign nostdinc\n\nSUBDIRS = src tests docs\nif BUILD_EXAMPLES\nSUBDIRS += example\nendif\n\npkgconfigdir = $(libdir)/pkgconfig\npkgconfig_DATA = libssh2.pc\n\ninclude_HEADERS =\t\t\t\\\n\tinclude/libssh2.h\t\t\\\n\tinclude/libssh2_publickey.h\t\\\n\tinclude/libssh2_sftp.h\n\nNETWAREFILES =  nw/keepscreen.c \\\n\tnw/nwlib.c \\\n\tnw/GNUmakefile \\\n\tnw/test/GNUmakefile\n\nDSP = win32/libssh2.dsp\nVCPROJ = win32/libssh2.vcproj\n\nDISTCLEANFILES = $(DSP)\n\nVMSFILES = vms/libssh2_make_example.dcl vms/libssh2_make_help.dcl\t\\\nvms/libssh2_make_kit.dcl vms/libssh2_make_lib.dcl vms/man2help.c\t\\\nvms/readme.vms vms/libssh2_config.h\n\nWIN32FILES = win32/GNUmakefile win32/test/GNUmakefile\t\t\\\nwin32/libssh2_config.h win32/config.mk win32/rules.mk\t\t\\\nwin32/Makefile.Watcom win32/libssh2.dsw win32/tests.dsp $(DSP)\t\\\nwin32/msvcproj.head win32/msvcproj.foot win32/libssh2.rc\n\nOS400FILES = os400/README400 os400/initscript.sh os400/make.sh\t\t\\\nos400/make-src.sh os400/make-rpg.sh os400/make-include.sh\t\t\\\nos400/os400sys.c os400/ccsid.c\t\t\t\t\t\t\\\nos400/libssh2_config.h os400/macros.h os400/libssh2_ccsid.h\t\t\\\nos400/include/alloca.h os400/include/sys/socket.h os400/include/stdio.h\t\\\nos400/libssh2rpg/libssh2.rpgle.in\t\t\t\t\t\\\nos400/libssh2rpg/libssh2_ccsid.rpgle.in\t\t\t\t\t\\\nos400/libssh2rpg/libssh2_publickey.rpgle\t\t\t\t\\\nos400/libssh2rpg/libssh2_sftp.rpgle\t\t\t\t\t\\\nMakefile.os400qc3.inc\n\nEXTRA_DIST = $(WIN32FILES) buildconf $(NETWAREFILES) get_ver.awk \\\n maketgz NMakefile RELEASE-NOTES libssh2.pc.in $(VMSFILES) config.rpath \\\n CMakeLists.txt cmake $(OS400FILES)\n\nACLOCAL_AMFLAGS = -I m4\n\n.PHONY: ChangeLog\nChangeLog:\n\techo \"see NEWS\" > ./ChangeLog\nDISTCLEANFILES += ChangeLog\n\ndist-hook:\n\trm -rf $(top_builddir)/tests/log\n\tfind $(distdir) -name \"*.dist\" -exec rm {} \\;\n\t(distit=`find $(srcdir) -name \"*.dist\"`; \\\n\tfor file in $$distit; do \\\n\t  strip=`echo $$file | sed -e s/^$(srcdir)// -e s/\\.dist//`; \\\n\t  cp $$file $(distdir)$$strip; \\\n\tdone)\n\n# Code Coverage\n\ninit-coverage:\n\tmake clean\n\tlcov --directory . --zerocounters\n\nCOVERAGE_CCOPTS ?= \"-g --coverage\"\nCOVERAGE_OUT ?= docs/coverage\n\nbuild-coverage:\n\tmake CFLAGS=$(COVERAGE_CCOPTS) check\n\tmkdir -p $(COVERAGE_OUT)\n\tlcov --directory . --output-file $(COVERAGE_OUT)/$(PACKAGE).info \\\n\t\t--capture\n\ngen-coverage:\n\tgenhtml --output-directory $(COVERAGE_OUT) \\\n\t\t$(COVERAGE_OUT)/$(PACKAGE).info \\\n\t\t--highlight --frames --legend \\\n\t\t--title \"$(PACKAGE_NAME)\"\n\ncoverage: init-coverage build-coverage gen-coverage\n\n# DSP/VCPROJ generation adapted from libcurl\n# only OpenSSL and WinCNG are supported with this build system\nCRYPTO_CSOURCES = openssl.c wincng.c\nCRYPTO_HHEADERS = openssl.h wincng.h\n# Makefile.inc provides the CSOURCES and HHEADERS defines\ninclude Makefile.inc\n\nWIN32SOURCES = $(CSOURCES)\nWIN32HEADERS = $(HHEADERS) libssh2_config.h\n\n$(DSP): win32/msvcproj.head win32/msvcproj.foot Makefile.am\n\techo \"creating $(DSP)\"\n\t@( (cat $(srcdir)/win32/msvcproj.head; \\\n\techo \"# Begin Group \\\"Source Files\\\"\"; \\\n\techo \"\"; \\\n\techo \"# PROP Default_Filter \\\"cpp;c;cxx\\\"\"; \\\n\twin32_srcs='$(WIN32SOURCES)'; \\\n\tsorted_srcs=`for file in $$win32_srcs; do echo $$file; done | sort`; \\\n\tfor file in $$sorted_srcs; do \\\n\t\techo \"# Begin Source File\"; \\\n\t\techo \"\"; \\\n\t\techo \"SOURCE=..\\\\src\\\\\"$$file; \\\n\t\techo \"# End Source File\"; \\\n\tdone; \\\n\techo \"# End Group\"; \\\n\techo \"# Begin Group \\\"Header Files\\\"\"; \\\n\techo \"\"; \\\n\techo \"# PROP Default_Filter \\\"h;hpp;hxx\\\"\"; \\\n\twin32_hdrs='$(WIN32HEADERS)'; \\\n\tsorted_hdrs=`for file in $$win32_hdrs; do echo $$file; done | sort`; \\\n\tfor file in $$sorted_hdrs; do \\\n\t\techo \"# Begin Source File\"; \\\n\t\techo \"\"; \\\n\t\tif [ \"$$file\" == \"libssh2_config.h\" ]; \\\n\t\tthen \\\n\t\t\techo \"SOURCE=.\\\\\"$$file; \\\n\t\telse \\\n\t\t\techo \"SOURCE=..\\\\src\\\\\"$$file; \\\n\t\tfi; \\\n\t\techo \"# End Source File\"; \\\n\tdone; \\\n\techo \"# End Group\"; \\\n\tcat $(srcdir)/win32/msvcproj.foot) | \\\n\tawk '{printf(\"%s\\r\\n\", gensub(\"\\r\", \"\", \"g\"))}' > $@ )\n\n$(VCPROJ): win32/vc8proj.head win32/vc8proj.foot Makefile.am\n\techo \"creating $(VCPROJ)\"\n\t@( (cat $(srcdir)/vc8proj.head; \\\n\twin32_srcs='$(WIN32SOURCES)'; \\\n\tsorted_srcs=`for file in $$win32_srcs; do echo $$file; done | sort`; \\\n\tfor file in $$sorted_srcs; do \\\n\t\techo \"<File RelativePath=\\\"\"..\\src\\$$file\"\\\"></File>\"; \\\n\tdone; \\\n\techo \"</Filter><Filter\tName=\\\"Header Files\\\">\"; \\\n\twin32_hdrs='$(WIN32HEADERS)'; \\\n\tsorted_hdrs=`for file in $$win32_hdrs; do echo $$file; done | sort`; \\\n\tfor file in $$sorted_hdrs; do \\\n\t\techo \"<File RelativePath=\\\"\"..\\src\\$$file\"\\\"></File>\"; \\\n\tdone; \\\n\tcat $(srcdir)/vc8proj.foot) | \\\n\tawk '{printf(\"%s\\r\\n\", gensub(\"\\r\", \"\", \"g\"))}' > $@ )\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/Makefile.inc",
    "content": "CSOURCES = channel.c comp.c crypt.c hostkey.c kex.c mac.c misc.c \\\n packet.c publickey.c scp.c session.c sftp.c userauth.c transport.c \\\n version.c knownhost.c agent.c $(CRYPTO_CSOURCES) pem.c keepalive.c global.c\n\nHHEADERS = libssh2_priv.h $(CRYPTO_HHEADERS) transport.h channel.h comp.h \\\n mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/Makefile.libgcrypt.inc",
    "content": "CRYPTO_CSOURCES = libgcrypt.c\nCRYPTO_HHEADERS = libgcrypt.h\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/Makefile.os400qc3.inc",
    "content": "CRYPTO_CSOURCES = os400qc3.c\nCRYPTO_HHEADERS = os400qc3.h\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/NEWS",
    "content": "The old NEWS file.\n\nNEWS is now generated from git and put into the release tarballs.\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/NMakefile",
    "content": "!include \"win32/config.mk\"\n\n!if \"$(WITH_WINCNG)\" == \"1\"\n!include \"Makefile.WinCNG.inc\"\n!else\n!include \"Makefile.OpenSSL.inc\"\n!endif\n!include \"Makefile.inc\"\n\nOBJECTS=$(CSOURCES:.c=.obj)\n\n# SUBDIRS=src example\nSUBDIRS=src\n\nall-sub: win32\\objects.mk\n\t-for %D in ($(SUBDIRS)) do $(MAKE) /nologo /f %D/NMakefile BUILD=$(BUILD) SUBDIR=%D all-sub\n\nclean: \n\t-rmdir 2>NUL /s/q $(TARGET)\n\t-del 2>NUL win32\\objects.mk\n\nreal-clean vclean: clean\n\t-del 2>NUL libssh2.dll\n\t-del 2>NUL libssh2.exp\n\t-del 2>NUL libssh2.ilk\n\t-del 2>NUL libssh2.lib\n\t-del 2>NUL *.pdb\n\nwin32\\objects.mk: Makefile.inc\n\t@echo OBJECTS = \\>$@\n\t@for %O in ($(OBJECTS)) do @echo $$(INTDIR)\\%O \\>>$@\n\t@echo $$(EOL)>>$@\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/README",
    "content": "libssh2 - SSH2 library\n======================\n\nlibssh2 is a library implementing the SSH2 protocol, available under\nthe revised BSD license.\n\nWeb site: https://www.libssh2.org/\n\nMailing list: https://cool.haxx.se/mailman/listinfo/libssh2-devel\n\nLicense: see COPYING\n\nSource code: https://github.com/libssh2/libssh2\n\nWeb site source code: https://github.com/libssh2/www\n\nInstallation instructions are in:\n - docs/INSTALL_CMAKE for CMake\n - docs/INSTALL_AUTOTOOLS for Autotools\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/RELEASE-NOTES",
    "content": "libssh2 1.7.0\n\nThis release includes the following changes:\n\n o libssh2_session_set_last_error: Add function\n o mac: Add support for HMAC-SHA-256 and HMAC-SHA-512\n o WinCNG: support for SHA256/512 HMAC\n o kex: Added diffie-hellman-group-exchange-sha256 support\n o OS/400 crypto library QC3 support\n\nThis release includes the following security advisory:\n\n o diffie_hellman_sha256: convert bytes to bits\n   CVE-2016-0787: https://www.libssh2.org/adv_20160223.html\n\nThis release includes the following bugfixes:\n\n o SFTP: Increase speed and datasize in SFTP read\n o openssl: make libssh2_sha1 return error code\n o openssl: fix memleak in _libssh2_dsa_sha1_verify()\n o cmake: include CMake files in the release tarballs\n o Fix builds with Visual Studio 2015\n o hostkey.c: Fix compiling error when OPENSSL_NO_MD5 is defined\n o GNUmakefile: add support for LIBSSH2_LDFLAG_EXTRAS\n o GNUmakefile: add -m64 CFLAGS when targeting mingw64\n o kex: free server host key before allocating it (again)\n o SCP: add libssh2_scp_recv2 to support large (> 2GB) files on windows\n o channel: Detect bad usage of libssh2_channel_process_startup\n o userauth: Fix off by one error when reading public key file\n o kex: removed dupe entry from libssh2_kex_methods\n o _libssh2_error: Support allocating the error message\n o hostkey: fix invalid memory access if libssh2_dsa_new fails\n o hostkey: align code path of ssh_rsa_init to ssh_dss_init\n o libssh2.pc.in: fix the output of pkg-config --libs\n o wincng: fixed possible memory leak in _libssh2_wincng_hash\n o wincng: fixed _libssh2_wincng_hash_final return value\n o add OpenSSL 1.1.0-pre2 compatibility\n o agent_disconnect_unix: unset the agent fd after closing it\n o sftp: stop reading when buffer is full\n o sftp: Send at least one read request before reading\n o sftp: Don't return EAGAIN if data was written to buffer\n o sftp: Check read packet file offset\n o configure: build \"silent\" if possible\n o openssl: add OpenSSL 1.1.0-pre3-dev compatibility\n o GNUmakefile: list system libs after user libs\n \nThis release would not have looked like this without help, code, reports and\nadvice from friends like these:\n\n  Alexander Lamaison, Andreas Schneider, brian m. carlson, Daniel Stenberg,\n  David Byron, Jakob Egger, Kamil Dudka, Marc Hoersken, Mizunashi Mana,\n  Patrick Monnerat, Paul Howarth, Salvador Fandiño, Viktor Szakats,\n  Will Cosgrove\n  (14 contributors)\n\n        Thanks! (and sorry if I forgot to mention someone)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/acinclude.m4",
    "content": "\ndnl **********************************************************************\ndnl CURL_DETECT_ICC ([ACTION-IF-YES])\ndnl\ndnl check if this is the Intel ICC compiler, and if so run the ACTION-IF-YES\ndnl sets the $ICC variable to \"yes\" or \"no\"\ndnl **********************************************************************\nAC_DEFUN([CURL_DETECT_ICC],\n[\n    ICC=\"no\"\n    AC_MSG_CHECKING([for icc in use])\n    if test \"$GCC\" = \"yes\"; then\n       dnl check if this is icc acting as gcc in disguise\n       AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],\n         dnl action if the text is found, this it has not been replaced by the\n         dnl cpp\n         ICC=\"no\",\n         dnl the text was not found, it was replaced by the cpp\n         ICC=\"yes\"\n         AC_MSG_RESULT([yes])\n         [$1]\n       )\n    fi\n    if test \"$ICC\" = \"no\"; then\n        # this is not ICC\n        AC_MSG_RESULT([no])\n    fi\n])\n\ndnl We create a function for detecting which compiler we use and then set as\ndnl pendantic compiler options as possible for that particular compiler. The\ndnl options are only used for debug-builds.\n\nAC_DEFUN([CURL_CC_DEBUG_OPTS],\n[\n    if test \"z$ICC\" = \"z\"; then\n      CURL_DETECT_ICC\n    fi\n\n    if test \"$GCC\" = \"yes\"; then\n\n       dnl figure out gcc version!\n       AC_MSG_CHECKING([gcc version])\n       gccver=`$CC -dumpversion`\n       num1=`echo $gccver | cut -d . -f1`\n       num2=`echo $gccver | cut -d . -f2`\n       gccnum=`(expr $num1 \"*\" 100 + $num2) 2>/dev/null`\n       AC_MSG_RESULT($gccver)\n\n       if test \"$ICC\" = \"yes\"; then\n         dnl this is icc, not gcc.\n\n         dnl ICC warnings we ignore:\n         dnl * 269 warns on our \"%Od\" printf formatters for curl_off_t output:\n         dnl   \"invalid format string conversion\"\n         dnl * 279 warns on static conditions in while expressions\n         dnl * 981 warns on \"operands are evaluated in unspecified order\"\n         dnl * 1418 \"external definition with no prior declaration\"\n         dnl * 1419 warns on \"external declaration in primary source file\"\n         dnl   which we know and do on purpose.\n\n         WARN=\"-wd279,269,981,1418,1419\"\n\n         if test \"$gccnum\" -gt \"600\"; then\n            dnl icc 6.0 and older doesn't have the -Wall flag\n            WARN=\"-Wall $WARN\"\n         fi\n       else dnl $ICC = yes\n         dnl this is a set of options we believe *ALL* gcc versions support:\n         WARN=\"-W -Wall -Wwrite-strings -pedantic -Wpointer-arith -Wnested-externs -Winline -Wmissing-prototypes\"\n\n         dnl -Wcast-align is a bit too annoying on all gcc versions ;-)\n\n         if test \"$gccnum\" -ge \"207\"; then\n           dnl gcc 2.7 or later\n           WARN=\"$WARN -Wmissing-declarations\"\n         fi\n\n         if test \"$gccnum\" -gt \"295\"; then\n           dnl only if the compiler is newer than 2.95 since we got lots of\n           dnl \"`_POSIX_C_SOURCE' is not defined\" in system headers with\n           dnl gcc 2.95.4 on FreeBSD 4.9!\n           WARN=\"$WARN -Wundef -Wno-long-long -Wsign-compare\"\n         fi\n\n         if test \"$gccnum\" -ge \"296\"; then\n           dnl gcc 2.96 or later\n           WARN=\"$WARN -Wfloat-equal\"\n         fi\n\n         if test \"$gccnum\" -gt \"296\"; then\n           dnl this option does not exist in 2.96\n           WARN=\"$WARN -Wno-format-nonliteral\"\n         fi\n\n         dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on\n         dnl on i686-Linux as it gives us heaps with false positives.\n         dnl Also, on gcc 4.0.X it is totally unbearable and complains all\n         dnl over making it unusable for generic purposes. Let's not use it.\n\n         if test \"$gccnum\" -ge \"303\"; then\n           dnl gcc 3.3 and later\n           WARN=\"$WARN -Wendif-labels -Wstrict-prototypes\"\n         fi\n\n         if test \"$gccnum\" -ge \"304\"; then\n           # try these on gcc 3.4\n           WARN=\"$WARN -Wdeclaration-after-statement\"\n         fi\n\n         for flag in $CPPFLAGS; do\n           case \"$flag\" in\n            -I*)\n              dnl Include path, provide a -isystem option for the same dir\n              dnl to prevent warnings in those dirs. The -isystem was not very\n              dnl reliable on earlier gcc versions.\n              add=`echo $flag | sed 's/^-I/-isystem /g'`\n              WARN=\"$WARN $add\"\n              ;;\n           esac\n         done\n\n       fi dnl $ICC = no\n\n       CFLAGS=\"$CFLAGS $WARN\"\n\n      AC_MSG_NOTICE([Added this set of compiler options: $WARN])\n\n    else dnl $GCC = yes\n\n      AC_MSG_NOTICE([Added no extra compiler options])\n\n    fi dnl $GCC = yes\n\n    dnl strip off optimizer flags\n    NEWFLAGS=\"\"\n    for flag in $CFLAGS; do\n      case \"$flag\" in\n      -O*)\n        dnl echo \"cut off $flag\"\n        ;;\n      *)\n        NEWFLAGS=\"$NEWFLAGS $flag\"\n        ;;\n      esac\n    done\n    CFLAGS=$NEWFLAGS\n\n]) dnl end of AC_DEFUN()\n\ndnl CURL_CHECK_NONBLOCKING_SOCKET\ndnl -------------------------------------------------\ndnl Check for how to set a socket to non-blocking state. There seems to exist\ndnl four known different ways, with the one used almost everywhere being POSIX\ndnl and XPG3, while the other different ways for different systems (old BSD,\ndnl Windows and Amiga).\ndnl\ndnl There are two known platforms (AIX 3.x and SunOS 4.1.x) where the\ndnl O_NONBLOCK define is found but does not work. This condition is attempted\ndnl to get caught in this script by using an excessive number of #ifdefs...\ndnl\nAC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET],\n[\n  AC_MSG_CHECKING([non-blocking sockets style])\n\n  AC_TRY_COMPILE([\n/* headers for O_NONBLOCK test */\n#include <sys/types.h>\n#include <unistd.h>\n#include <fcntl.h>\n],[\n/* try to compile O_NONBLOCK */\n\n#if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)\n# if defined(__SVR4) || defined(__srv4__)\n#  define PLATFORM_SOLARIS\n# else\n#  define PLATFORM_SUNOS4\n# endif\n#endif\n#if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX41)\n# define PLATFORM_AIX_V3\n#endif\n\n#if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__)\n#error \"O_NONBLOCK does not work on this platform\"\n#endif\n  int socket;\n  int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK);\n],[\ndnl the O_NONBLOCK test was fine\nnonblock=\"O_NONBLOCK\"\nAC_DEFINE(HAVE_O_NONBLOCK, 1, [use O_NONBLOCK for non-blocking sockets])\n],[\ndnl the code was bad, try a different program now, test 2\n\n  AC_TRY_COMPILE([\n/* headers for FIONBIO test */\n#include <unistd.h>\n#include <stropts.h>\n],[\n/* FIONBIO source test (old-style unix) */\n int socket;\n int flags = ioctl(socket, FIONBIO, &flags);\n],[\ndnl FIONBIO test was good\nnonblock=\"FIONBIO\"\nAC_DEFINE(HAVE_FIONBIO, 1, [use FIONBIO for non-blocking sockets])\n],[\ndnl FIONBIO test was also bad\ndnl the code was bad, try a different program now, test 3\n\n  AC_TRY_COMPILE([\n/* headers for ioctlsocket test (Windows) */\n#undef inline\n#ifdef HAVE_WINDOWS_H\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n#include <windows.h>\n#ifdef HAVE_WINSOCK2_H\n#include <winsock2.h>\n#else\n#ifdef HAVE_WINSOCK_H\n#include <winsock.h>\n#endif\n#endif\n#endif\n],[\n/* ioctlsocket source code */\n SOCKET sd;\n unsigned long flags = 0;\n sd = socket(0, 0, 0);\n ioctlsocket(sd, FIONBIO, &flags);\n],[\ndnl ioctlsocket test was good\nnonblock=\"ioctlsocket\"\nAC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets])\n],[\ndnl ioctlsocket didnt compile!, go to test 4\n\n  AC_TRY_LINK([\n/* headers for IoctlSocket test (Amiga?) */\n#include <sys/ioctl.h>\n],[\n/* IoctlSocket source code */\n int socket;\n int flags = IoctlSocket(socket, FIONBIO, (long)1);\n],[\ndnl ioctlsocket test was good\nnonblock=\"IoctlSocket\"\nAC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets])\n],[\ndnl Ioctlsocket didnt compile, do test 5!\n  AC_TRY_COMPILE([\n/* headers for SO_NONBLOCK test (BeOS) */\n#include <socket.h>\n],[\n/* SO_NONBLOCK source code */\n long b = 1;\n int socket;\n int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));\n],[\ndnl the SO_NONBLOCK test was good\nnonblock=\"SO_NONBLOCK\"\nAC_DEFINE(HAVE_SO_NONBLOCK, 1, [use SO_NONBLOCK for non-blocking sockets])\n],[\ndnl test 5 didnt compile!\nnonblock=\"nada\"\nAC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets])\n])\ndnl end of fifth test\n\n])\ndnl end of forth test\n\n])\ndnl end of third test\n\n])\ndnl end of second test\n\n])\ndnl end of non-blocking try-compile test\n  AC_MSG_RESULT($nonblock)\n\n  if test \"$nonblock\" = \"nada\"; then\n    AC_MSG_WARN([non-block sockets disabled])\n  fi\n])\n\ndnl CURL_CHECK_NEED_REENTRANT_SYSTEM\ndnl -------------------------------------------------\ndnl Checks if the preprocessor _REENTRANT definition\ndnl must be unconditionally done for this platform.\ndnl Internal macro for CURL_CONFIGURE_REENTRANT.\n\nAC_DEFUN([CURL_CHECK_NEED_REENTRANT_SYSTEM], [\n  case $host in\n    *-*-solaris* | *-*-hpux*)\n      tmp_need_reentrant=\"yes\"\n      ;;\n    *)\n      tmp_need_reentrant=\"no\"\n      ;;\n  esac\n])\n\n\ndnl CURL_CONFIGURE_FROM_NOW_ON_WITH_REENTRANT\ndnl -------------------------------------------------\ndnl This macro ensures that configuration tests done\ndnl after this will execute with preprocessor symbol\ndnl _REENTRANT defined. This macro also ensures that\ndnl the generated config file defines NEED_REENTRANT\ndnl and that in turn setup.h will define _REENTRANT.\ndnl Internal macro for CURL_CONFIGURE_REENTRANT.\n\nAC_DEFUN([CURL_CONFIGURE_FROM_NOW_ON_WITH_REENTRANT], [\nAC_DEFINE(NEED_REENTRANT, 1,\n  [Define to 1 if _REENTRANT preprocessor symbol must be defined.])\ncat >>confdefs.h <<_EOF\n#ifndef _REENTRANT\n#  define _REENTRANT\n#endif\n_EOF\n])\n\n\ndnl CURL_CONFIGURE_REENTRANT\ndnl -------------------------------------------------\ndnl This first checks if the preprocessor _REENTRANT\ndnl symbol is already defined. If it isn't currently\ndnl defined a set of checks are performed to verify\ndnl if its definition is required to make visible to\ndnl the compiler a set of *_r functions. Finally, if\ndnl _REENTRANT is already defined or needed it takes\ndnl care of making adjustments necessary to ensure\ndnl that it is defined equally for further configure\ndnl tests and generated config file.\n\nAC_DEFUN([CURL_CONFIGURE_REENTRANT], [\n  AC_PREREQ([2.50])dnl\n  #\n  AC_MSG_CHECKING([if _REENTRANT is already defined])\n  AC_COMPILE_IFELSE([\n    AC_LANG_PROGRAM([[\n    ]],[[\n#ifdef _REENTRANT\n      int dummy=1;\n#else\n      force compilation error\n#endif\n    ]])\n  ],[\n    AC_MSG_RESULT([yes])\n    tmp_reentrant_initially_defined=\"yes\"\n  ],[\n    AC_MSG_RESULT([no])\n    tmp_reentrant_initially_defined=\"no\"\n  ])\n  #\n  if test \"$tmp_reentrant_initially_defined\" = \"no\"; then\n    AC_MSG_CHECKING([if _REENTRANT is actually needed])\n    CURL_CHECK_NEED_REENTRANT_SYSTEM\n\n    if test \"$tmp_need_reentrant\" = \"yes\"; then\n      AC_MSG_RESULT([yes])\n    else\n      AC_MSG_RESULT([no])\n    fi\n  fi\n  #\n  AC_MSG_CHECKING([if _REENTRANT is onwards defined])\n  if test \"$tmp_reentrant_initially_defined\" = \"yes\" ||\n    test \"$tmp_need_reentrant\" = \"yes\"; then\n    CURL_CONFIGURE_FROM_NOW_ON_WITH_REENTRANT\n    AC_MSG_RESULT([yes])\n  else\n    AC_MSG_RESULT([no])\n  fi\n  #\n])\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/appveyor.yml",
    "content": "# Copyright (c) 2014, Ruslan Baratov\n# Copyright (c) 2014, 2016 Alexander Lamaison\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are met:\n#\n# * Redistributions of source code must retain the above copyright notice, this\n#   list of conditions and the following disclaimer.\n#\n# * Redistributions in binary form must reproduce the above copyright notice,\n#   this list of conditions and the following disclaimer in the documentation\n#   and/or other materials provided with the distribution.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nos: Visual Studio 2015\n\nenvironment:\n  matrix:\n    - GENERATOR: \"Visual Studio 14 2015\"\n      BUILD_SHARED_LIBS: ON\n\n    - GENERATOR: \"Visual Studio 14 2015\"\n      BUILD_SHARED_LIBS: OFF\n\n    - GENERATOR: \"Visual Studio 12 2013\"\n      BUILD_SHARED_LIBS: ON\n\n    - GENERATOR: \"Visual Studio 12 2013\"\n      BUILD_SHARED_LIBS: OFF\n\n    - GENERATOR: \"Visual Studio 11 2012\"\n      BUILD_SHARED_LIBS: ON\n\n    - GENERATOR: \"Visual Studio 11 2012\"\n      BUILD_SHARED_LIBS: OFF\n\n    - GENERATOR: \"Visual Studio 10 2010\"\n      BUILD_SHARED_LIBS: ON\n\n    - GENERATOR: \"Visual Studio 10 2010\"\n      BUILD_SHARED_LIBS: OFF\n\n    - GENERATOR: \"Visual Studio 9 2008\"\n      BUILD_SHARED_LIBS: ON\n\n    - GENERATOR: \"Visual Studio 9 2008\"\n      BUILD_SHARED_LIBS: OFF\n\nplatform:\n  - x86\n  - x64\n\nconfiguration:\n# - Debug\n  - Release\n\nmatrix:\n  allow_failures:\n    - GENERATOR: \"Visual Studio 9 2008\"\n      platform: x64\n\nbuild_script:\n  - ps: if($env:PLATFORM -eq \"x64\") { $env:CMAKE_GEN_SUFFIX=\" Win64\" }\n  - cmake \"-G%GENERATOR%%CMAKE_GEN_SUFFIX%\" -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS% -H. -B_builds\n  - cmake --build _builds --config \"%CONFIGURATION%\"\n\ntest_script:\n  - ps: cd _builds\n  - ctest -VV -C \"%CONFIGURATION%\" -E ssh2 --output-on-failure\n\non_failure:\n  - ps: if (Test-Path _builds/CMakeFiles/CMakeOutput.log) { cat _builds/CMakeFiles/CMakeOutput.log }\n  - ps: if (Test-Path _builds/CMakeFiles/CMakeError.log) { cat _builds/CMakeFiles/CMakeError.log }\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/buildconf",
    "content": "#!/bin/sh\n\nLIBTOOLIZE=\"libtoolize\"\n\nif [ \"x`which $LIBTOOLIZE`\" = \"x\" ]; then\n    LIBTOOLIZE=\"glibtoolize\"\nfi\n\nif [ \"x`which $LIBTOOLIZE`\" = \"x\" ]; then\n    echo \"Neither libtoolize nor glibtoolize could be found!\"\n    exit 1\nfi\n\n${LIBTOOLIZE} --copy --automake --force\n${ACLOCAL:-aclocal} -I m4 $ACLOCAL_FLAGS\n${AUTOHEADER:-autoheader}\n# copy the private libssh2_config.h.in to the examples dir so that\n# it can be included without pointing the include path to the private\n# source dir\ncp src/libssh2_config.h.in example/libssh2_config.h.in\n${AUTOCONF:-autoconf}\n${AUTOMAKE:-automake} --add-missing --copy\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/cmake/CheckFunctionExistsMayNeedLibrary.cmake",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\n\n# - check_function_exists_maybe_need_library(<function> <var> [lib1 ... libn])\n#\n# Check if function is available for linking, first without extra libraries, and\n# then, if not found that way, linking in each optional library as well.  This\n# function is similar to autotools AC_SEARCH_LIBS.\n#\n# If the function if found, this will define <var>.\n#\n# If the function was only found by linking in an additional library, this\n# will define NEED_LIB_LIBX, where LIBX is the one of lib1 to libn that\n# makes the function available, in uppercase.\n#\n# The following variables may be set before calling this macro to\n# modify the way the check is run:\n#\n#  CMAKE_REQUIRED_FLAGS = string of compile command line flags\n#  CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)\n#  CMAKE_REQUIRED_INCLUDES = list of include directories\n#  CMAKE_REQUIRED_LIBRARIES = list of libraries to link\n#\n\ninclude(CheckFunctionExists)\ninclude(CheckLibraryExists)\n\nfunction(check_function_exists_may_need_library function variable)\n\n  check_function_exists(${function} ${variable})\n\n  if(NOT ${variable})\n    foreach(lib ${ARGN})\n      string(TOUPPER ${lib} UP_LIB)\n      # Use new variable to prevent cache from previous step shortcircuiting\n      # new test\n      check_library_exists(${lib} ${function} \"\" HAVE_${function}_IN_${lib})\n      if(HAVE_${function}_IN_${lib})\n\tset(${variable} 1 CACHE INTERNAL\n\t  \"Function ${function} found in library ${lib}\")\n\tset(NEED_LIB_${UP_LIB} 1 CACHE INTERNAL\n\t  \"Need to link ${lib}\")\n\tbreak()\n      endif()\n    endforeach()\n  endif()\n\nendfunction()"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/cmake/CheckNonblockingSocketSupport.cmake",
    "content": "include(CheckCSourceCompiles)\n\n# - check_nonblocking_socket_support()\n#\n# Check for how to set a socket to non-blocking state. There seems to exist\n# four known different ways, with the one used almost everywhere being POSIX\n# and XPG3, while the other different ways for different systems (old BSD,\n# Windows and Amiga).\n#\n# One of the following variables will be set indicating the supported\n# method (if any):\n#   HAVE_O_NONBLOCK\n#   HAVE_FIONBIO\n#   HAVE_IOCTLSOCKET\n#   HAVE_IOCTLSOCKET_CASE\n#   HAVE_SO_NONBLOCK\n#   HAVE_DISABLED_NONBLOCKING\n#\n# The following variables may be set before calling this macro to\n# modify the way the check is run:\n#\n#  CMAKE_REQUIRED_FLAGS = string of compile command line flags\n#  CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)\n#  CMAKE_REQUIRED_INCLUDES = list of include directories\n#  CMAKE_REQUIRED_LIBRARIES = list of libraries to link\n#\nmacro(check_nonblocking_socket_support)\n  # There are two known platforms (AIX 3.x and SunOS 4.1.x) where the\n  # O_NONBLOCK define is found but does not work.\n  check_c_source_compiles(\"\n#include <sys/types.h>\n#include <unistd.h>\n#include <fcntl.h>\n\n#if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)\n# if defined(__SVR4) || defined(__srv4__)\n#  define PLATFORM_SOLARIS\n# else\n#  define PLATFORM_SUNOS4\n# endif\n#endif\n#if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX41)\n# define PLATFORM_AIX_V3\n#endif\n\n#if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__)\n#error \\\"O_NONBLOCK does not work on this platform\\\"\n#endif\n\nint main()\n{\n    int socket;\n    int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK);\n}\"\n  HAVE_O_NONBLOCK)\n\n  if(NOT HAVE_O_NONBLOCK)\n    check_c_source_compiles(\"/* FIONBIO test (old-style unix) */\n#include <unistd.h>\n#include <stropts.h>\n\nint main()\n{\n    int socket;\n    int flags = ioctl(socket, FIONBIO, &flags);\n}\"\n    HAVE_FIONBIO)\n\n    if(NOT HAVE_FIONBIO)\n      check_c_source_compiles(\"/* ioctlsocket test (Windows) */\n#undef inline\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n\n#include <windows.h>\n#include <winsock2.h>\n\nint main()\n{\n    SOCKET sd;\n    unsigned long flags = 0;\n    sd = socket(0, 0, 0);\n    ioctlsocket(sd, FIONBIO, &flags);\n}\"\n      HAVE_IOCTLSOCKET)\n\n      if(NOT HAVE_IOCTLSOCKET)\n\tcheck_c_source_compiles(\"/* IoctlSocket test (Amiga?) */\n#include <sys/ioctl.h>\n\nint main()\n{\n    int socket;\n    int flags = IoctlSocket(socket, FIONBIO, (long)1);\n}\"\n        HAVE_IOCTLSOCKET_CASE)\n\n        if(NOT HAVE_IOCTLSOCKET_CASE)\n\t  check_c_source_compiles(\"/* SO_NONBLOCK test (BeOS) */\n#include <socket.h>\n\nint main()\n{\n    long b = 1;\n    int socket;\n    int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));\n}\"\n          HAVE_SO_NONBLOCK)\n\n\t  if(NOT HAVE_SO_NONBLOCK)\n\t    # No non-blocking socket method found\n\t    set(HAVE_DISABLED_NONBLOCKING 1)\n\t  endif()\n\tendif()\n      endif()\n    endif()\n  endif()\nendmacro()"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/cmake/CopyRuntimeDependencies.cmake",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\ninclude(CMakeParseArguments)\n\nfunction(ADD_TARGET_TO_COPY_DEPENDENCIES)\n  set(options)\n  set(oneValueArgs TARGET)\n  set(multiValueArgs DEPENDENCIES BEFORE_TARGETS)\n  cmake_parse_arguments(COPY\n    \"${options}\" \"${oneValueArgs}\" \"${multiValueArgs}\" ${ARGN})\n\n  if(NOT COPY_DEPENDENCIES)\n    return()\n  endif()\n\n  # Using a custom target to drive custom commands stops multiple\n  # parallel builds trying to kick off the commands at the same time\n  add_custom_target(${COPY_TARGET})\n\n  foreach(target ${COPY_BEFORE_TARGETS})\n    add_dependencies(${target} ${COPY_TARGET})\n  endforeach()\n\n  foreach(dependency ${COPY_DEPENDENCIES})\n\n    add_custom_command(\n      TARGET ${COPY_TARGET}\n      DEPENDS ${dependency}\n      # Make directory first otherwise file is copied in place of\n      # directory instead of into it\n      COMMAND ${CMAKE_COMMAND}\n      ARGS -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}\n      COMMAND ${CMAKE_COMMAND}\n      ARGS -E copy ${dependency} ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}\n      VERBATIM)\n\n  endforeach()\n\nendfunction()\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/cmake/FindLibgcrypt.cmake",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\n# - Try to find Libgcrypt\n# This will define all or none of:\n#  LIBGCRYPT_FOUND - if Libgcrypt headers and library was found\n#  LIBGCRYPT_INCLUDE_DIRS - The Libgcrypt include directories\n#  LIBGCRYPT_LIBRARIES - The libraries needed to use Libgcrypt\n\nfind_path(LIBGCRYPT_INCLUDE_DIR gcrypt.h)\n\nfind_library(LIBGCRYPT_LIBRARY NAMES gcrypt libgcrypt)\n\nset(LIBGCRYPT_LIBRARIES ${LIBGCRYPT_LIBRARY})\nset(LIBGCRYPT_INCLUDE_DIRS ${LIBGCRYPT_INCLUDE_DIR})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Libgcrypt DEFAULT_MSG\n                                  LIBGCRYPT_LIBRARY LIBGCRYPT_INCLUDE_DIR)\n\nmark_as_advanced(LIBGCRYPT_INCLUDE_DIR LIBGCRYPT_LIBRARY)"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/cmake/SocketLibraries.cmake",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\n# Some systems have their socket functions in a library.\n# (Solaris -lsocket/-lnsl, Windows -lws2_32).  This macro appends those\n# libraries to the given list\nmacro(append_needed_socket_libraries LIBRARIES_LIST)\n  if(CMAKE_SYSTEM_NAME STREQUAL \"Windows\" AND CMAKE_SIZEOF_VOID_P EQUAL 4)\n    # x86 Windows uses STDCALL for these functions, so their names are mangled,\n    # meaning the platform checks don't work. Hardcoding these until we get\n    # a better solution.\n    set(HAVE_SOCKET 1)\n    set(HAVE_SELECT 1)\n    set(HAVE_INET_ADDR 1)\n    set(NEED_LIB_WS2_32 1)\n  else()\n    check_function_exists_may_need_library(socket HAVE_SOCKET socket ws2_32)\n    check_function_exists_may_need_library(select HAVE_SELECT ws2_32)\n    check_function_exists_may_need_library(inet_addr HAVE_INET_ADDR nsl ws2_32)\n  endif()\n\n  if(NEED_LIB_SOCKET)\n    list(APPEND ${LIBRARIES_LIST} socket)\n  endif()\n  if(NEED_LIB_NSL)\n    list(APPEND ${LIBRARIES_LIST} nsl)\n  endif()\n  if(NEED_LIB_WS2_32)\n    list(APPEND ${LIBRARIES_LIST} ws2_32)\n  endif()\n\nendmacro()"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/cmake/Toolchain-Linux-32.cmake",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\n# Cross-compile 32-bit binary on 64-bit linux host\nset(CMAKE_SYSTEM_NAME Linux)\nset(CMAKE_SYSTEM_VERSION 1)\nset(CMAKE_SYSTEM_PROCESSOR \"i386\")\n\nset(CMAKE_CXX_COMPILER_ARG1 \"-m32\")\nset(CMAKE_C_COMPILER_ARG1 \"-m32\")"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/cmake/max_warnings.cmake",
    "content": "if(MSVC)\n  # Use the highest warning level for visual studio.\n  if(CMAKE_CXX_FLAGS MATCHES \"/W[0-4]\")\n    string(REGEX REPLACE \"/W[0-4]\" \"/W4\" CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS}\")\n  else()\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} /W4\")\n  endif()\n  if(CMAKE_C_FLAGS MATCHES \"/W[0-4]\")\n    string(REGEX REPLACE \"/W[0-4]\" \"/W4\" CMAKE_C_FLAGS \"${CMAKE_C_FLAGS}\")\n  else()\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} /W4\")\n  endif()\n\n  # Disable broken warnings\n  add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)\nelseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)\n  if(NOT CMAKE_CXX_FLAGS MATCHES \"-Wall\")\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wall\")\n  endif()\n  if(NOT CMAKE_C_FLAGS MATCHES \"-Wall\")\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Wall\")\n  endif()\nendif()\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/config.rpath",
    "content": "#! /bin/sh\n# Output a system dependent set of variables, describing how to set the\n# run time search path of shared libraries in an executable.\n#\n#   Copyright 1996-2006 Free Software Foundation, Inc.\n#   Taken from GNU libtool, 2001\n#   Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996\n#\n#   This file is free software; the Free Software Foundation gives\n#   unlimited permission to copy and/or distribute it, with or without\n#   modifications, as long as this notice is preserved.\n#\n# The first argument passed to this file is the canonical host specification,\n#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM\n# or\n#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM\n# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld\n# should be set by the caller.\n#\n# The set of defined variables is at the end of this script.\n\n# Known limitations:\n# - On IRIX 6.5 with CC=\"cc\", the run time search patch must not be longer\n#   than 256 bytes, otherwise the compiler driver will dump core. The only\n#   known workaround is to choose shorter directory names for the build\n#   directory and/or the installation directory.\n\n# All known linkers require a `.a' archive for static linking (except MSVC,\n# which needs '.lib').\nlibext=a\nshrext=.so\n\nhost=\"$1\"\nhost_cpu=`echo \"$host\" | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\1/'`\nhost_vendor=`echo \"$host\" | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\2/'`\nhost_os=`echo \"$host\" | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\3/'`\n\n# Code taken from libtool.m4's _LT_CC_BASENAME.\n\nfor cc_temp in $CC\"\"; do\n  case $cc_temp in\n    compile | *[\\\\/]compile | ccache | *[\\\\/]ccache ) ;;\n    distcc | *[\\\\/]distcc | purify | *[\\\\/]purify ) ;;\n    \\-*) ;;\n    *) break;;\n  esac\ndone\ncc_basename=`echo \"$cc_temp\" | sed -e 's%^.*/%%'`\n\n# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC.\n\nwl=\nif test \"$GCC\" = yes; then\n  wl='-Wl,'\nelse\n  case \"$host_os\" in\n    aix*)\n      wl='-Wl,'\n      ;;\n    darwin*)\n      case $cc_basename in\n        xlc*)\n          wl='-Wl,'\n          ;;\n      esac\n      ;;\n    mingw* | pw32* | os2*)\n      ;;\n    hpux9* | hpux10* | hpux11*)\n      wl='-Wl,'\n      ;;\n    irix5* | irix6* | nonstopux*)\n      wl='-Wl,'\n      ;;\n    newsos6)\n      ;;\n    linux*)\n      case $cc_basename in\n        icc* | ecc*)\n          wl='-Wl,'\n          ;;\n        pgcc | pgf77 | pgf90)\n          wl='-Wl,'\n          ;;\n        ccc*)\n          wl='-Wl,'\n          ;;\n        como)\n          wl='-lopt='\n          ;;\n        *)\n          case `$CC -V 2>&1 | sed 5q` in\n            *Sun\\ C*)\n              wl='-Wl,'\n              ;;\n          esac\n          ;;\n      esac\n      ;;\n    osf3* | osf4* | osf5*)\n      wl='-Wl,'\n      ;;\n    sco3.2v5*)\n      ;;\n    solaris*)\n      wl='-Wl,'\n      ;;\n    sunos4*)\n      wl='-Qoption ld '\n      ;;\n    sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n      wl='-Wl,'\n      ;;\n    sysv4*MP*)\n      ;;\n    unicos*)\n      wl='-Wl,'\n      ;;\n    uts4*)\n      ;;\n  esac\nfi\n\n# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS.\n\nhardcode_libdir_flag_spec=\nhardcode_libdir_separator=\nhardcode_direct=no\nhardcode_minus_L=no\n\ncase \"$host_os\" in\n  cygwin* | mingw* | pw32*)\n    # FIXME: the MSVC++ port hasn't been tested in a loooong time\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++.\n    if test \"$GCC\" != yes; then\n      with_gnu_ld=no\n    fi\n    ;;\n  interix*)\n    # we just hope/assume this is gcc and not c89 (= MSVC++)\n    with_gnu_ld=yes\n    ;;\n  openbsd*)\n    with_gnu_ld=no\n    ;;\nesac\n\nld_shlibs=yes\nif test \"$with_gnu_ld\" = yes; then\n  # Set some defaults for GNU ld with shared library support. These\n  # are reset later if shared libraries are not supported. Putting them\n  # here allows them to be overridden if necessary.\n  # Unlike libtool, we use -rpath here, not --rpath, since the documented\n  # option of GNU ld is called -rpath, not --rpath.\n  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n  case \"$host_os\" in\n    aix3* | aix4* | aix5*)\n      # On AIX/PPC, the GNU linker is very broken\n      if test \"$host_cpu\" != ia64; then\n        ld_shlibs=no\n      fi\n      ;;\n    amigaos*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_minus_L=yes\n      # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports\n      # that the semantics of dynamic libraries on AmigaOS, at least up\n      # to version 4, is to share data among multiple programs linked\n      # with the same dynamic library.  Since this doesn't match the\n      # behavior of shared libraries on other platforms, we cannot use\n      # them.\n      ld_shlibs=no\n      ;;\n    beos*)\n      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then\n        :\n      else\n        ld_shlibs=no\n      fi\n      ;;\n    cygwin* | mingw* | pw32*)\n      # hardcode_libdir_flag_spec is actually meaningless, as there is\n      # no search path for DLLs.\n      hardcode_libdir_flag_spec='-L$libdir'\n      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then\n        :\n      else\n        ld_shlibs=no\n      fi\n      ;;\n    interix3*)\n      hardcode_direct=no\n      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n      ;;\n    linux*)\n      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then\n        :\n      else\n        ld_shlibs=no\n      fi\n      ;;\n    netbsd*)\n      ;;\n    solaris*)\n      if $LD -v 2>&1 | grep 'BFD 2\\.8' > /dev/null; then\n        ld_shlibs=no\n      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then\n        :\n      else\n        ld_shlibs=no\n      fi\n      ;;\n    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)\n      case `$LD -v 2>&1` in\n        *\\ [01].* | *\\ 2.[0-9].* | *\\ 2.1[0-5].*)\n          ld_shlibs=no\n          ;;\n        *)\n          if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then\n            hardcode_libdir_flag_spec='`test -z \"$SCOABSPATH\" && echo ${wl}-rpath,$libdir`'\n          else\n            ld_shlibs=no\n          fi\n          ;;\n      esac\n      ;;\n    sunos4*)\n      hardcode_direct=yes\n      ;;\n    *)\n      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then\n        :\n      else\n        ld_shlibs=no\n      fi\n      ;;\n  esac\n  if test \"$ld_shlibs\" = no; then\n    hardcode_libdir_flag_spec=\n  fi\nelse\n  case \"$host_os\" in\n    aix3*)\n      # Note: this linker hardcodes the directories in LIBPATH if there\n      # are no directories specified by -L.\n      hardcode_minus_L=yes\n      if test \"$GCC\" = yes; then\n        # Neither direct hardcoding nor static linking is supported with a\n        # broken collect2.\n        hardcode_direct=unsupported\n      fi\n      ;;\n    aix4* | aix5*)\n      if test \"$host_cpu\" = ia64; then\n        # On IA64, the linker does run time linking by default, so we don't\n        # have to do anything special.\n        aix_use_runtimelinking=no\n      else\n        aix_use_runtimelinking=no\n        # Test if we are trying to use run time linking or normal\n        # AIX style linking. If -brtl is somewhere in LDFLAGS, we\n        # need to do runtime linking.\n        case $host_os in aix4.[23]|aix4.[23].*|aix5*)\n          for ld_flag in $LDFLAGS; do\n            if (test $ld_flag = \"-brtl\" || test $ld_flag = \"-Wl,-brtl\"); then\n              aix_use_runtimelinking=yes\n              break\n            fi\n          done\n          ;;\n        esac\n      fi\n      hardcode_direct=yes\n      hardcode_libdir_separator=':'\n      if test \"$GCC\" = yes; then\n        case $host_os in aix4.[012]|aix4.[012].*)\n          collect2name=`${CC} -print-prog-name=collect2`\n          if test -f \"$collect2name\" && \\\n            strings \"$collect2name\" | grep resolve_lib_name >/dev/null\n          then\n            # We have reworked collect2\n            hardcode_direct=yes\n          else\n            # We have old collect2\n            hardcode_direct=unsupported\n            hardcode_minus_L=yes\n            hardcode_libdir_flag_spec='-L$libdir'\n            hardcode_libdir_separator=\n          fi\n          ;;\n        esac\n      fi\n      # Begin _LT_AC_SYS_LIBPATH_AIX.\n      echo 'int main () { return 0; }' > conftest.c\n      ${CC} ${LDFLAGS} conftest.c -o conftest\n      aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\\(.*\\)$/\\1/; p; }\n}'`\n      if test -z \"$aix_libpath\"; then\n        aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\\(.*\\)$/\\1/; p; }\n}'`\n      fi\n      if test -z \"$aix_libpath\"; then\n        aix_libpath=\"/usr/lib:/lib\"\n      fi\n      rm -f conftest.c conftest\n      # End _LT_AC_SYS_LIBPATH_AIX.\n      if test \"$aix_use_runtimelinking\" = yes; then\n        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n      else\n        if test \"$host_cpu\" = ia64; then\n          hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'\n        else\n          hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n        fi\n      fi\n      ;;\n    amigaos*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_minus_L=yes\n      # see comment about different semantics on the GNU ld section\n      ld_shlibs=no\n      ;;\n    bsdi[45]*)\n      ;;\n    cygwin* | mingw* | pw32*)\n      # When not using gcc, we currently assume that we are using\n      # Microsoft Visual C++.\n      # hardcode_libdir_flag_spec is actually meaningless, as there is\n      # no search path for DLLs.\n      hardcode_libdir_flag_spec=' '\n      libext=lib\n      ;;\n    darwin* | rhapsody*)\n      hardcode_direct=no\n      if test \"$GCC\" = yes ; then\n        :\n      else\n        case $cc_basename in\n          xlc*)\n            ;;\n          *)\n            ld_shlibs=no\n            ;;\n        esac\n      fi\n      ;;\n    dgux*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      ;;\n    freebsd1*)\n      ld_shlibs=no\n      ;;\n    freebsd2.2*)\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      ;;\n    freebsd2*)\n      hardcode_direct=yes\n      hardcode_minus_L=yes\n      ;;\n    freebsd* | kfreebsd*-gnu | dragonfly*)\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      ;;\n    hpux9*)\n      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n      hardcode_libdir_separator=:\n      hardcode_direct=yes\n      # hardcode_minus_L: Not really in the search PATH,\n      # but as the default location of the library.\n      hardcode_minus_L=yes\n      ;;\n    hpux10*)\n      if test \"$with_gnu_ld\" = no; then\n        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n        hardcode_libdir_separator=:\n        hardcode_direct=yes\n        # hardcode_minus_L: Not really in the search PATH,\n        # but as the default location of the library.\n        hardcode_minus_L=yes\n      fi\n      ;;\n    hpux11*)\n      if test \"$with_gnu_ld\" = no; then\n        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n        hardcode_libdir_separator=:\n        case $host_cpu in\n          hppa*64*|ia64*)\n            hardcode_direct=no\n            ;;\n          *)\n            hardcode_direct=yes\n            # hardcode_minus_L: Not really in the search PATH,\n            # but as the default location of the library.\n            hardcode_minus_L=yes\n            ;;\n        esac\n      fi\n      ;;\n    irix5* | irix6* | nonstopux*)\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      ;;\n    netbsd*)\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      ;;\n    newsos6)\n      hardcode_direct=yes\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      ;;\n    openbsd*)\n      hardcode_direct=yes\n      if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n        hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n      else\n        case \"$host_os\" in\n          openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)\n            hardcode_libdir_flag_spec='-R$libdir'\n            ;;\n          *)\n            hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n            ;;\n        esac\n      fi\n      ;;\n    os2*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_minus_L=yes\n      ;;\n    osf3*)\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      ;;\n    osf4* | osf5*)\n      if test \"$GCC\" = yes; then\n        hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      else\n        # Both cc and cxx compiler support -rpath directly\n        hardcode_libdir_flag_spec='-rpath $libdir'\n      fi\n      hardcode_libdir_separator=:\n      ;;\n    solaris*)\n      hardcode_libdir_flag_spec='-R$libdir'\n      ;;\n    sunos4*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_direct=yes\n      hardcode_minus_L=yes\n      ;;\n    sysv4)\n      case $host_vendor in\n        sni)\n          hardcode_direct=yes # is this really true???\n          ;;\n        siemens)\n          hardcode_direct=no\n          ;;\n        motorola)\n          hardcode_direct=no #Motorola manual says yes, but my tests say they lie\n          ;;\n      esac\n      ;;\n    sysv4.3*)\n      ;;\n    sysv4*MP*)\n      if test -d /usr/nec; then\n        ld_shlibs=yes\n      fi\n      ;;\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)\n      ;;\n    sysv5* | sco3.2v5* | sco5v6*)\n      hardcode_libdir_flag_spec='`test -z \"$SCOABSPATH\" && echo ${wl}-R,$libdir`'\n      hardcode_libdir_separator=':'\n      ;;\n    uts4*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      ;;\n    *)\n      ld_shlibs=no\n      ;;\n  esac\nfi\n\n# Check dynamic linker characteristics\n# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.\n# Unlike libtool.m4, here we don't care about _all_ names of the library, but\n# only about the one the linker finds when passed -lNAME. This is the last\n# element of library_names_spec in libtool.m4, or possibly two of them if the\n# linker has special search rules.\nlibrary_names_spec=      # the last element of library_names_spec in libtool.m4\nlibname_spec='lib$name'\ncase \"$host_os\" in\n  aix3*)\n    library_names_spec='$libname.a'\n    ;;\n  aix4* | aix5*)\n    library_names_spec='$libname$shrext'\n    ;;\n  amigaos*)\n    library_names_spec='$libname.a'\n    ;;\n  beos*)\n    library_names_spec='$libname$shrext'\n    ;;\n  bsdi[45]*)\n    library_names_spec='$libname$shrext'\n    ;;\n  cygwin* | mingw* | pw32*)\n    shrext=.dll\n    library_names_spec='$libname.dll.a $libname.lib'\n    ;;\n  darwin* | rhapsody*)\n    shrext=.dylib\n    library_names_spec='$libname$shrext'\n    ;;\n  dgux*)\n    library_names_spec='$libname$shrext'\n    ;;\n  freebsd1*)\n    ;;\n  kfreebsd*-gnu)\n    library_names_spec='$libname$shrext'\n    ;;\n  freebsd* | dragonfly*)\n    case \"$host_os\" in\n      freebsd[123]*)\n        library_names_spec='$libname$shrext$versuffix' ;;\n      *)\n        library_names_spec='$libname$shrext' ;;\n    esac\n    ;;\n  gnu*)\n    library_names_spec='$libname$shrext'\n    ;;\n  hpux9* | hpux10* | hpux11*)\n    case $host_cpu in\n      ia64*)\n        shrext=.so\n        ;;\n      hppa*64*)\n        shrext=.sl\n        ;;\n      *)\n        shrext=.sl\n        ;;\n    esac\n    library_names_spec='$libname$shrext'\n    ;;\n  interix3*)\n    library_names_spec='$libname$shrext'\n    ;;\n  irix5* | irix6* | nonstopux*)\n    library_names_spec='$libname$shrext'\n    case \"$host_os\" in\n      irix5* | nonstopux*)\n        libsuff= shlibsuff=\n        ;;\n      *)\n        case $LD in\n          *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \") libsuff= shlibsuff= ;;\n          *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \") libsuff=32 shlibsuff=N32 ;;\n          *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \") libsuff=64 shlibsuff=64 ;;\n          *) libsuff= shlibsuff= ;;\n        esac\n        ;;\n    esac\n    ;;\n  linux*oldld* | linux*aout* | linux*coff*)\n    ;;\n  linux*)\n    library_names_spec='$libname$shrext'\n    ;;\n  knetbsd*-gnu)\n    library_names_spec='$libname$shrext'\n    ;;\n  netbsd*)\n    library_names_spec='$libname$shrext'\n    ;;\n  newsos6)\n    library_names_spec='$libname$shrext'\n    ;;\n  nto-qnx*)\n    library_names_spec='$libname$shrext'\n    ;;\n  openbsd*)\n    library_names_spec='$libname$shrext$versuffix'\n    ;;\n  os2*)\n    libname_spec='$name'\n    shrext=.dll\n    library_names_spec='$libname.a'\n    ;;\n  osf3* | osf4* | osf5*)\n    library_names_spec='$libname$shrext'\n    ;;\n  solaris*)\n    library_names_spec='$libname$shrext'\n    ;;\n  sunos4*)\n    library_names_spec='$libname$shrext$versuffix'\n    ;;\n  sysv4 | sysv4.3*)\n    library_names_spec='$libname$shrext'\n    ;;\n  sysv4*MP*)\n    library_names_spec='$libname$shrext'\n    ;;\n  sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n    library_names_spec='$libname$shrext'\n    ;;\n  uts4*)\n    library_names_spec='$libname$shrext'\n    ;;\nesac\n\nsed_quote_subst='s/\\([\"`$\\\\]\\)/\\\\\\1/g'\nescaped_wl=`echo \"X$wl\" | sed -e 's/^X//' -e \"$sed_quote_subst\"`\nshlibext=`echo \"$shrext\" | sed -e 's,^\\.,,'`\nescaped_libname_spec=`echo \"X$libname_spec\" | sed -e 's/^X//' -e \"$sed_quote_subst\"`\nescaped_library_names_spec=`echo \"X$library_names_spec\" | sed -e 's/^X//' -e \"$sed_quote_subst\"`\nescaped_hardcode_libdir_flag_spec=`echo \"X$hardcode_libdir_flag_spec\" | sed -e 's/^X//' -e \"$sed_quote_subst\"`\n\nLC_ALL=C sed -e 's/^\\([a-zA-Z0-9_]*\\)=/acl_cv_\\1=/' <<EOF\n\n# How to pass a linker flag through the compiler.\nwl=\"$escaped_wl\"\n\n# Static library suffix (normally \"a\").\nlibext=\"$libext\"\n\n# Shared library suffix (normally \"so\").\nshlibext=\"$shlibext\"\n\n# Format of library name prefix.\nlibname_spec=\"$escaped_libname_spec\"\n\n# Library names that the linker finds when passed -lNAME.\nlibrary_names_spec=\"$escaped_library_names_spec\"\n\n# Flag to hardcode \\$libdir into a binary during linking.\n# This must work even if \\$libdir does not exist.\nhardcode_libdir_flag_spec=\"$escaped_hardcode_libdir_flag_spec\"\n\n# Whether we need a single -rpath flag with a separated argument.\nhardcode_libdir_separator=\"$hardcode_libdir_separator\"\n\n# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the\n# resulting binary.\nhardcode_direct=\"$hardcode_direct\"\n\n# Set to yes if using the -LDIR flag during linking hardcodes DIR into the\n# resulting binary.\nhardcode_minus_L=\"$hardcode_minus_L\"\n\nEOF\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/configure.ac",
    "content": "# AC_PREREQ(2.57)\nAC_INIT(libssh2, [-], libssh2-devel@cool.haxx.se)\nAC_CONFIG_MACRO_DIR([m4])\nAC_CONFIG_SRCDIR([src])\nAC_CONFIG_HEADERS([src/libssh2_config.h example/libssh2_config.h])\nAM_MAINTAINER_MODE\nm4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])\n\ndnl SED is needed by some of the tools\nAC_PATH_PROG( SED, sed, sed-was-not-found-by-configure,\n              $PATH:/usr/bin:/usr/local/bin)\nAC_SUBST(SED)\n\nif test \"x$SED\" = \"xsed-was-not-found-by-configure\"; then\n  AC_MSG_WARN([sed was not found, this may ruin your chances to build fine])\nfi\n\ndnl figure out the libssh2 version\nLIBSSH2VER=`$SED -ne 's/^#define LIBSSH2_VERSION *\"\\(.*\\)\"/\\1/p' ${srcdir}/include/libssh2.h`\nAM_INIT_AUTOMAKE\nAC_MSG_CHECKING([libssh2 version])\nAC_MSG_RESULT($LIBSSH2VER)\n\nAC_SUBST(LIBSSH2VER)\n\nAB_VERSION=$LIBSSH2VER\n\nAB_INIT\n\n# Check for the OS.\n# Daniel's note: this should not be necessary and we need to work to\n# get this removed.\nAC_CANONICAL_HOST\ncase \"$host\" in\n    *-mingw*)\n    CFLAGS=\"$CFLAGS -DLIBSSH2_WIN32\"\n    LIBS=\"$LIBS -lws2_32\"\n    ;;\n\t*-cygwin)\n\tCFLAGS=\"$CFLAGS -DLIBSSH2_WIN32\"\n    ;;\n\t*darwin*)\n\tCFLAGS=\"$CFLAGS -DLIBSSH2_DARWIN\"\n\t;;\n    *hpux*)\n    ;;\n    *osf*)\n    CFLAGS=\"$CFLAGS -D_POSIX_PII_SOCKET\"\n    ;;\n    *)\n    ;;\nesac\n\nAC_CHECK_TYPE(long long,\n   [AC_DEFINE(HAVE_LONGLONG, 1,\n      [Define to 1 if the compiler supports the 'long long' data type.])]\n   longlong=\"yes\"\n)\n\ndnl Our configure and build reentrant settings\nCURL_CONFIGURE_REENTRANT\n\n# Some systems (Solaris?) have socket() in -lsocket.\nAC_SEARCH_LIBS(socket, socket)\n\n# Solaris has inet_addr() in -lnsl.\nAC_SEARCH_LIBS(inet_addr, nsl)\n\nAC_SUBST(LIBS)\n\nAC_PROG_CC\nAC_PROG_INSTALL\nAC_PROG_LN_S\nAC_PROG_MAKE_SET\nAC_PATH_PROGS(SSHD, [sshd], [],\n     [$PATH$PATH_SEPARATOR/usr/libexec$PATH_SEPARATOR]dnl\n     [/usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc])\nAM_CONDITIONAL(SSHD, test -n \"$SSHD\")\nAC_LIBTOOL_WIN32_DLL\nAC_PROG_LIBTOOL\nAC_C_BIGENDIAN\n\ndnl check for how to do large files\nAC_SYS_LARGEFILE\n\n# Configure parameters\nAC_ARG_WITH(openssl,\n  AC_HELP_STRING([--with-openssl],[Use OpenSSL for crypto]),\n  use_openssl=$withval,use_openssl=auto)\nAC_ARG_WITH(libgcrypt,\n  AC_HELP_STRING([--with-libgcrypt],[Use libgcrypt for crypto]),\n  use_libgcrypt=$withval,use_libgcrypt=auto)\nAC_ARG_WITH(wincng,\n  AC_HELP_STRING([--with-wincng],[Use Windows CNG for crypto]),\n  use_wincng=$withval,use_wincng=auto)\nAC_ARG_WITH(libz,\n  AC_HELP_STRING([--with-libz],[Use zlib for compression]),\n  use_libz=$withval,use_libz=auto)\n\nfound_crypto=none\nsupport_clear_memory=no\n\n# Look for OpenSSL\nif test \"$found_crypto\" = \"none\" && test \"$use_openssl\" != \"no\"; then\n  AC_LIB_HAVE_LINKFLAGS([ssl], [crypto], [#include <openssl/ssl.h>])\nfi\nif test \"$ac_cv_libssl\" = \"yes\"; then\n  AC_DEFINE(LIBSSH2_OPENSSL, 1, [Use OpenSSL])\n  LIBSREQUIRED=libssl,libcrypto\n\n  # Not all OpenSSL have AES-CTR functions.\n  save_LIBS=\"$LIBS\"\n  LIBS=\"$LIBS $LIBSSL\"\n  AC_CHECK_FUNCS(EVP_aes_128_ctr)\n  LIBS=\"$save_LIBS\"\n\n  found_crypto=\"OpenSSL (AES-CTR: ${ac_cv_func_EVP_aes_128_ctr:-N/A})\"\nfi\nAM_CONDITIONAL(OPENSSL, test \"$ac_cv_libssl\" = \"yes\")\n\n# Look for libgcrypt\nif test \"$found_crypto\" = \"none\" && test \"$use_libgcrypt\" != \"no\"; then\n  AC_LIB_HAVE_LINKFLAGS([gcrypt], [], [#include <gcrypt.h>])\nfi\nif test \"$ac_cv_libgcrypt\" = \"yes\"; then\n  AC_DEFINE(LIBSSH2_LIBGCRYPT, 1, [Use libgcrypt])\n  LIBSREQUIRED= # libgcrypt doesn't provide a .pc file. sad face.\n  LIBS=\"$LIBS -lgcrypt\"\n  found_crypto=libgcrypt\nfi\nAM_CONDITIONAL(LIBGCRYPT, test \"$ac_cv_libgcrypt\" = \"yes\")\n\n# Look for Windows Cryptography API: Next Generation\nif test \"$found_crypto\" = \"none\" && test \"$use_wincng\" != \"no\"; then\n  AC_LIB_HAVE_LINKFLAGS([bcrypt], [], [\n    #include <windows.h>\n    #include <bcrypt.h>\n  ])\n  AC_LIB_HAVE_LINKFLAGS([crypt32], [], [\n    #include <windows.h>\n    #include <wincrypt.h>\n  ])\n  AC_CHECK_HEADERS([ntdef.h ntstatus.h], [], [], [\n    #include <windows.h>\n  ])\n  AC_CHECK_DECLS([SecureZeroMemory], [], [], [\n    #include <windows.h>\n  ])\nfi\nif test \"$ac_cv_libbcrypt\" = \"yes\"; then\n  AC_DEFINE(LIBSSH2_WINCNG, 1, [Use Windows CNG])\n  LIBSREQUIRED= # wincng doesn't provide a .pc file. sad face.\n  LIBS=\"$LIBS -lbcrypt\"\n  if test \"$ac_cv_libcrypt32\" = \"yes\"; then\n    LIBS=\"$LIBS -lcrypt32\"\n  fi\n  found_crypto=\"Windows Cryptography API: Next Generation\"\n  if test \"$ac_cv_have_decl_SecureZeroMemory\" = \"yes\"; then\n    support_clear_memory=yes\n  fi\nfi\nAM_CONDITIONAL(WINCNG, test \"$ac_cv_libbcrypt\" = \"yes\")\n\nAM_CONDITIONAL(OS400QC3, false)\n\n# Check if crypto library was found\nif test \"$found_crypto\" = \"none\"; then\n  AC_MSG_ERROR([No crypto library found!\nTry --with-libssl-prefix=PATH\n or --with-libgcrypt-prefix=PATH\n or --with-wincng on Windows\\\n])\nfi\n\n# Look for Libz\nif test \"$use_libz\" != \"no\"; then\n  AC_LIB_HAVE_LINKFLAGS([z], [], [#include <zlib.h>])\n  if test \"$ac_cv_libz\" != yes; then\n    AC_MSG_NOTICE([Cannot find zlib, disabling compression])\n    AC_MSG_NOTICE([Try --with-libz-prefix=PATH if you know you have it])\n  else\n    AC_DEFINE(LIBSSH2_HAVE_ZLIB, 1, [Compile in zlib support])\n    if test \"${LIBSREQUIRED}\" != \"\"; then\n      LIBSREQUIRED=\"${LIBSREQUIRED},\"\n    fi\n    LIBSREQUIRED=\"${LIBSREQUIRED}zlib\"\n  fi\nfi\n\nAC_SUBST(LIBSREQUIRED)\n\n#\n# Optional Settings\n#\nAC_ARG_ENABLE(crypt-none,\n  AC_HELP_STRING([--enable-crypt-none],[Permit \"none\" cipher -- NOT RECOMMENDED]),\n  [AC_DEFINE(LIBSSH2_CRYPT_NONE, 1, [Enable \"none\" cipher -- NOT RECOMMENDED])])\n\nAC_ARG_ENABLE(mac-none,\n  AC_HELP_STRING([--enable-mac-none],[Permit \"none\" MAC -- NOT RECOMMENDED]),\n  [AC_DEFINE(LIBSSH2_MAC_NONE, 1, [Enable \"none\" MAC -- NOT RECOMMENDED])])\n\nAC_ARG_ENABLE(gex-new,\n  AC_HELP_STRING([--disable-gex-new],[Disable \"new\" diffie-hellman-group-exchange-sha1 method]),\n  [GEX_NEW=$enableval])\nif test \"$GEX_NEW\" != \"no\"; then\n  AC_DEFINE(LIBSSH2_DH_GEX_NEW, 1, [Enable newer diffie-hellman-group-exchange-sha1 syntax])\nfi\n\nAC_ARG_ENABLE(clear-memory,\n  AC_HELP_STRING([--disable-clear-memory],[Disable clearing of memory before being freed]),\n  [CLEAR_MEMORY=$enableval])\nif test \"$CLEAR_MEMORY\" != \"no\"; then\n  if test \"$support_clear_memory\" = \"yes\"; then\n    AC_DEFINE(LIBSSH2_CLEAR_MEMORY, 1, [Enable clearing of memory before being freed])\n    enable_clear_memory=yes\n  else\n    if test \"$CLEAR_MEMORY\" = \"yes\"; then\n      AC_MSG_ERROR([secure clearing/zeroing of memory is not supported by the selected crypto backend])\n    else\n      AC_MSG_WARN([secure clearing/zeroing of memory is not supported by the selected crypto backend])\n    fi\n    enable_clear_memory=unsupported\n  fi\nelse\n  if test \"$support_clear_memory\" = \"yes\"; then\n    enable_clear_memory=no\n  else\n    AC_MSG_WARN([secure clearing/zeroing of memory is not supported by the selected crypto backend])\n    enable_clear_memory=unsupported\n  fi\nfi\n\ndnl ************************************************************\ndnl option to switch on compiler debug options\ndnl\nAC_MSG_CHECKING([whether to enable pedantic and debug compiler options])\nAC_ARG_ENABLE(debug,\nAC_HELP_STRING([--enable-debug],[Enable pedantic and debug options])\nAC_HELP_STRING([--disable-debug],[Disable debug options]),\n[ case \"$enable_debug\" in\n  no)\n       AC_MSG_RESULT(no)\n       ;;\n  *)   AC_MSG_RESULT(yes)\n    enable_debug=yes\n    CPPFLAGS=\"$CPPFLAGS -DLIBSSH2DEBUG\"\n    CFLAGS=\"$CFLAGS -g\"\n\n    dnl set compiler \"debug\" options to become more picky, and remove\n    dnl optimize options from CFLAGS\n    CURL_CC_DEBUG_OPTS\n       ;;\n  esac\n ],\n       enable_debug=no\n       AC_MSG_RESULT(no)\n)\n\ndnl ************************************************************\ndnl Enable hiding of internal symbols in library to reduce its size and\ndnl speed dynamic linking of applications.  This currently is only supported\ndnl on gcc >= 4.0 and SunPro C.\ndnl\nAC_MSG_CHECKING([whether to enable hidden symbols in the library])\nAC_ARG_ENABLE(hidden-symbols,\nAC_HELP_STRING([--enable-hidden-symbols],[Hide internal symbols in library])\nAC_HELP_STRING([--disable-hidden-symbols],[Leave all symbols with default visibility in library]),\n[ case \"$enableval\" in\n  no)\n       AC_MSG_RESULT(no)\n       ;;\n  *)\n       AC_MSG_CHECKING([whether $CC supports it])\n       if test \"$GCC\" = yes ; then\n         if $CC --help --verbose 2>&1 | grep fvisibility= > /dev/null ; then\n           AC_MSG_RESULT(yes)\n           AC_DEFINE(LIBSSH2_API, [__attribute__ ((visibility (\"default\")))], [to make a symbol visible])\n           CFLAGS=\"$CFLAGS -fvisibility=hidden\"\n         else\n            AC_MSG_RESULT(no)\n          fi\n\n       else\n         dnl Test for SunPro cc\n         if $CC 2>&1 | grep flags >/dev/null && $CC -flags | grep xldscope= >/dev/null ; then\n           AC_MSG_RESULT(yes)\n           AC_DEFINE(LIBSSH2_API, [__global], [to make a symbol visible])\n           CFLAGS=\"$CFLAGS -xldscope=hidden\"\n         else\n           AC_MSG_RESULT(no)\n         fi\n       fi\n       ;;\n  esac ],\n       AC_MSG_RESULT(no)\n)\n\n# Build example applications?\nAC_MSG_CHECKING([whether to build example applications])\nAC_ARG_ENABLE([examples-build],\nAC_HELP_STRING([--enable-examples-build], [Build example applications (this is the default)])\nAC_HELP_STRING([--disable-examples-build], [Do not build example applications]),\n[case \"$enableval\" in\n  no | false)\n    build_examples='no'\n    ;;\n  *)\n    build_examples='yes'\n    ;;\nesac], [build_examples='yes'])\nAC_MSG_RESULT($build_examples)\nAM_CONDITIONAL([BUILD_EXAMPLES], [test \"x$build_examples\" != \"xno\"])\n\n# Checks for header files.\n# AC_HEADER_STDC\nAC_CHECK_HEADERS([errno.h fcntl.h stdio.h stdlib.h unistd.h sys/uio.h])\nAC_CHECK_HEADERS([sys/select.h sys/socket.h sys/ioctl.h sys/time.h])\nAC_CHECK_HEADERS([arpa/inet.h netinet/in.h])\nAC_CHECK_HEADERS([sys/un.h], [have_sys_un_h=yes], [have_sys_un_h=no])\nAM_CONDITIONAL([HAVE_SYS_UN_H], test \"x$have_sys_un_h\" = xyes)\n\ncase $host in\n  *-*-cygwin* | *-*-cegcc*)\n    # These are POSIX-like systems using BSD-like sockets API.\n    ;;\n  *)\n    AC_CHECK_HEADERS([windows.h winsock2.h ws2tcpip.h])\n    ;;\nesac\n\ncase $host in\n  *darwin*|*interix*)\n    dnl poll() does not work on these platforms\n    dnl Interix: \"does provide poll(), but the implementing developer must\n    dnl have been in a bad mood, because poll() only works on the /proc\n    dnl filesystem here\"\n    dnl Mac OS X's poll has funny behaviors, like:\n    dnl not being able to do poll on no fildescriptors (10.3?)\n    dnl not being able to poll on some files (like anything in /dev)\n    dnl not having reliable timeout support\n    dnl inconsistent return of POLLHUP where other implementations give POLLIN\n    AC_MSG_NOTICE([poll use is disabled on this platform])\n    ;;\n  *)\n    AC_CHECK_FUNCS(poll)\n    ;;\nesac\n\nAC_CHECK_FUNCS(gettimeofday select strtoll)\n\ndnl Check for select() into ws2_32 for Msys/Mingw\nif test \"$ac_cv_func_select\" != \"yes\"; then\n  AC_MSG_CHECKING([for select in ws2_32])\n  AC_TRY_LINK([\n#ifdef HAVE_WINSOCK2_H\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n#include <winsock2.h>\n#endif\n    ],[\n      select(0,(fd_set *)NULL,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL);\n    ],[\n      AC_MSG_RESULT([yes])\n      HAVE_SELECT=\"1\"\n      AC_DEFINE_UNQUOTED(HAVE_SELECT, 1,\n        [Define to 1 if you have the select function.])\n    ],[\n      AC_MSG_RESULT([no])\n  ])\nfi\n\nAC_FUNC_ALLOCA\n\n# Checks for typedefs, structures, and compiler characteristics.\nAC_C_CONST\nAC_C_INLINE\n\nCURL_CHECK_NONBLOCKING_SOCKET\n\nAC_CONFIG_FILES([Makefile\n                 src/Makefile\n                 tests/Makefile\n                 example/Makefile\n                 docs/Makefile\n                 libssh2.pc])\nAC_OUTPUT\n\nAC_MSG_NOTICE([summary of build options:\n\n  version:          ${LIBSSH2VER}\n  Host type:        ${host}\n  Install prefix:   ${prefix}\n  Compiler:         ${CC}\n  Compiler flags:   ${CFLAGS}\n  Library types:    Shared=${enable_shared}, Static=${enable_static}\n  Crypto library:   ${found_crypto}\n  Clear memory:     $enable_clear_memory\n  Debug build:      $enable_debug\n  Build examples:   $build_examples\n  Path to sshd:     $ac_cv_path_SSHD (only for self-tests)\n  zlib compression: $ac_cv_libz\n])\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/.gitignore",
    "content": "Makefile\nMakefile.in\ncoverage\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/AUTHORS",
    "content": " libssh2 is the result of many friendly people. This list is an attempt to\n mention all contributors. If we've missed anyone, tell us!\n\n This list of names is a-z sorted.\n\nAdam Gobiowski\nAlexander Holyapin\nAlexander Lamaison\nAlfred Gebert\nBen Kibbey\nBjorn Stenborg\nCarlo Bramini\nCristian Rodríguez\nDaiki Ueno\nDan Casey\nDan Fandrich\nDaniel Stenberg\nDave Hayden\nDave McCaldon\nDavid J Sullivan\nDavid Robins\nDmitry Smirnov\nDouglas Masterson\nEdink Kadribasic\nErik Brossler\nFrancois Dupoux\nGellule Xg\nGrubsky Grigory\nGuenter Knauf\nHeiner Steven\nHenrik Nordstrom\nJames Housleys\nJasmeet Bagga\nJean-Louis Charton\nJernej Kovacic\nJoey Degges\nJohn Little\nJose Baars\nJussi Mononen\nKamil Dudka\nLars Nordin\nMark McPherson\nMark Smith\nMarkus Moeller\nMatt Lilley\nMatthew Booth\nMaxime Larocque\nMike Protts\nMikhail Gusarov\nNeil Gierman\nOlivier Hervieu\nPaul Howarth\nPaul Querna\nPaul Veldkamp\nPeter Krempa\nPeter O'Gorman\nPeter Stuge\nPierre Joye\nRafael Kitover\nRomain Bondue\nSara Golemon\nSatish Mittal\nSean Peterson\nSelcuk Gueney\nSimon Hart\nSimon Josefsson\nSofian Brabez\nSteven Ayre\nSteven Dake\nSteven Van Ingelgem\nTJ Saunders\nTommy Lindgren\nTor Arntsen\nVincent Jaulin\nVincent Torri\nVlad Grachov\nWez Furlong\nYang Tse\nZl Liu\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/BINDINGS",
    "content": "\nCreative people have written bindings or interfaces for various environments\nand programming languages. Using one of these bindings allows you to take\nadvantage of libssh2 directly from within your favourite language.\n\nThe bindings listed below are not part of the libssh2 distribution archives,\nbut must be downloaded and installed separately.\n\nCocoa/Objective-C\n  https://github.com/karelia/libssh2_sftp-Cocoa-wrapper\n\nHaskell\n  FFI bindings - https://hackage.haskell.org/package/libssh2\n\nPerl\n  Net::SSH2 - https://metacpan.org/pod/Net::SSH2\n\nPHP\n  ssh2 - https://pecl.php.net/package/ssh2\n\nPython\n  pylibssh2 - https://pypi.python.org/pypi/pylibssh2\n\nPython-ctypes\n\n  PySsh2 - https://github.com/gellule/PySsh2\n\nRuby\n  libssh2-ruby - https://github.com/mitchellh/libssh2-ruby\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/CMakeLists.txt",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\nset(MAN_PAGES\n  libssh2_agent_connect.3\n  libssh2_agent_disconnect.3\n  libssh2_agent_free.3\n  libssh2_agent_get_identity.3\n  libssh2_agent_init.3\n  libssh2_agent_list_identities.3\n  libssh2_agent_userauth.3\n  libssh2_banner_set.3\n  libssh2_base64_decode.3\n  libssh2_channel_close.3\n  libssh2_channel_direct_tcpip.3\n  libssh2_channel_direct_tcpip_ex.3\n  libssh2_channel_eof.3\n  libssh2_channel_exec.3\n  libssh2_channel_flush.3\n  libssh2_channel_flush_ex.3\n  libssh2_channel_flush_stderr.3\n  libssh2_channel_forward_accept.3\n  libssh2_channel_forward_cancel.3\n  libssh2_channel_forward_listen.3\n  libssh2_channel_forward_listen_ex.3\n  libssh2_channel_free.3\n  libssh2_channel_get_exit_signal.3\n  libssh2_channel_get_exit_status.3\n  libssh2_channel_handle_extended_data.3\n  libssh2_channel_handle_extended_data2.3\n  libssh2_channel_ignore_extended_data.3\n  libssh2_channel_open_ex.3\n  libssh2_channel_open_session.3\n  libssh2_channel_process_startup.3\n  libssh2_channel_read.3\n  libssh2_channel_read_ex.3\n  libssh2_channel_read_stderr.3\n  libssh2_channel_receive_window_adjust.3\n  libssh2_channel_receive_window_adjust2.3\n  libssh2_channel_request_pty.3\n  libssh2_channel_request_pty_ex.3\n  libssh2_channel_request_pty_size.3\n  libssh2_channel_request_pty_size_ex.3\n  libssh2_channel_send_eof.3\n  libssh2_channel_set_blocking.3\n  libssh2_channel_setenv.3\n  libssh2_channel_setenv_ex.3\n  libssh2_channel_shell.3\n  libssh2_channel_subsystem.3\n  libssh2_channel_wait_closed.3\n  libssh2_channel_wait_eof.3\n  libssh2_channel_window_read.3\n  libssh2_channel_window_read_ex.3\n  libssh2_channel_window_write.3\n  libssh2_channel_window_write_ex.3\n  libssh2_channel_write.3\n  libssh2_channel_write_ex.3\n  libssh2_channel_write_stderr.3\n  libssh2_channel_x11_req.3\n  libssh2_channel_x11_req_ex.3\n  libssh2_exit.3\n  libssh2_free.3\n  libssh2_hostkey_hash.3\n  libssh2_init.3\n  libssh2_keepalive_config.3\n  libssh2_keepalive_send.3\n  libssh2_knownhost_add.3\n  libssh2_knownhost_addc.3\n  libssh2_knownhost_check.3\n  libssh2_knownhost_checkp.3\n  libssh2_knownhost_del.3\n  libssh2_knownhost_free.3\n  libssh2_knownhost_get.3\n  libssh2_knownhost_init.3\n  libssh2_knownhost_readfile.3\n  libssh2_knownhost_readline.3\n  libssh2_knownhost_writefile.3\n  libssh2_knownhost_writeline.3\n  libssh2_poll.3\n  libssh2_poll_channel_read.3\n  libssh2_publickey_add.3\n  libssh2_publickey_add_ex.3\n  libssh2_publickey_init.3\n  libssh2_publickey_list_fetch.3\n  libssh2_publickey_list_free.3\n  libssh2_publickey_remove.3\n  libssh2_publickey_remove_ex.3\n  libssh2_publickey_shutdown.3\n  libssh2_scp_recv.3\n  libssh2_scp_recv2.3\n  libssh2_scp_send.3\n  libssh2_scp_send64.3\n  libssh2_scp_send_ex.3\n  libssh2_session_abstract.3\n  libssh2_session_banner_get.3\n  libssh2_session_banner_set.3\n  libssh2_session_block_directions.3\n  libssh2_session_callback_set.3\n  libssh2_session_disconnect.3\n  libssh2_session_disconnect_ex.3\n  libssh2_session_flag.3\n  libssh2_session_free.3\n  libssh2_session_get_blocking.3\n  libssh2_session_get_timeout.3\n  libssh2_session_hostkey.3\n  libssh2_session_init.3\n  libssh2_session_init_ex.3\n  libssh2_session_last_errno.3\n  libssh2_session_last_error.3\n  libssh2_session_set_last_error.3\n  libssh2_session_method_pref.3\n  libssh2_session_methods.3\n  libssh2_session_set_blocking.3\n  libssh2_session_set_timeout.3\n  libssh2_session_startup.3\n  libssh2_session_supported_algs.3\n  libssh2_sftp_close.3\n  libssh2_sftp_close_handle.3\n  libssh2_sftp_closedir.3\n  libssh2_sftp_fsetstat.3\n  libssh2_sftp_fstat.3\n  libssh2_sftp_fstat_ex.3\n  libssh2_sftp_fstatvfs.3\n  libssh2_sftp_fsync.3\n  libssh2_sftp_get_channel.3\n  libssh2_sftp_init.3\n  libssh2_sftp_last_error.3\n  libssh2_sftp_lstat.3\n  libssh2_sftp_mkdir.3\n  libssh2_sftp_mkdir_ex.3\n  libssh2_sftp_open.3\n  libssh2_sftp_open_ex.3\n  libssh2_sftp_opendir.3\n  libssh2_sftp_read.3\n  libssh2_sftp_readdir.3\n  libssh2_sftp_readdir_ex.3\n  libssh2_sftp_readlink.3\n  libssh2_sftp_realpath.3\n  libssh2_sftp_rename.3\n  libssh2_sftp_rename_ex.3\n  libssh2_sftp_rewind.3\n  libssh2_sftp_rmdir.3\n  libssh2_sftp_rmdir_ex.3\n  libssh2_sftp_seek.3\n  libssh2_sftp_seek64.3\n  libssh2_sftp_setstat.3\n  libssh2_sftp_shutdown.3\n  libssh2_sftp_stat.3\n  libssh2_sftp_stat_ex.3\n  libssh2_sftp_statvfs.3\n  libssh2_sftp_symlink.3\n  libssh2_sftp_symlink_ex.3\n  libssh2_sftp_tell.3\n  libssh2_sftp_tell64.3\n  libssh2_sftp_unlink.3\n  libssh2_sftp_unlink_ex.3\n  libssh2_sftp_write.3\n  libssh2_trace.3\n  libssh2_trace_sethandler.3\n  libssh2_userauth_authenticated.3\n  libssh2_userauth_hostbased_fromfile.3\n  libssh2_userauth_hostbased_fromfile_ex.3\n  libssh2_userauth_keyboard_interactive.3\n  libssh2_userauth_keyboard_interactive_ex.3\n  libssh2_userauth_list.3\n  libssh2_userauth_password.3\n  libssh2_userauth_password_ex.3\n  libssh2_userauth_publickey.3\n  libssh2_userauth_publickey_fromfile.3\n  libssh2_userauth_publickey_fromfile_ex.3\n  libssh2_version.3)\n\ninclude(GNUInstallDirs)\ninstall(FILES ${MAN_PAGES} DESTINATION ${CMAKE_INSTALL_MANDIR}/man3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/HACKING",
    "content": "\nlibssh2 source code style guide:\n\n - 4 level indent\n - spaces-only (no tabs)\n - open braces on the if/for line:\n\n     if (banana) {\n         go_nuts();\n     }\n\n - keep source lines shorter than 80 columns\n - See libssh2-style.el for how to achieve this within Emacs\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/HACKING.CRYPTO",
    "content": "\tDefinitions needed to implement a specific crypto library\n\nThis document offers some hints about implementing a new crypto library\ninterface.\n\nA crypto library interface consists of at least a header file, defining\nentities referenced from the libssh2 core modules.\nReal code implementation (if needed), is left at the implementor's choice.\n\nThis document lists the entities that must/may be defined in the header file.\n\nProcedures listed as \"void\" may indeed have a result type: the void indication\nindicates the libssh2 core modules never use the function result.\n\n\n1) Crypto library initialization/termination.\n\nvoid libssh2_crypto_init(void);\nInitializes the crypto library. May be an empty macro if not needed.\n\nvoid libssh2_crypto_exit(void);\nTerminates the crypto library use. May be an empty macro if not needed.\n\n\n2) HMAC\n\nlibssh2_hmac_ctx\nType of an HMAC computation context. Generally a struct.\nUsed for all hash algorithms.\n\nvoid libssh2_hmac_ctx_init(libssh2_hmac_ctx ctx);\nInitializes the HMAC computation context ctx.\nCalled before setting-up the hash algorithm.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nvoid libssh2_hmac_update(libssh2_hmac_ctx ctx,\n\t                 const unsigned char *data,\n\t                 int datalen);\nContinue computation of an HMAC on datalen bytes at data using context ctx.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nvoid libssh2_hmac_final(libssh2_hmac_ctx ctx,\n\t                unsigned char output[]);\nGet the computed HMAC from context ctx into the output buffer. The\nminimum data buffer size depends on the HMAC hash algorithm.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nvoid libssh2_hmac_cleanup(libssh2_hmac_ctx *ctx);\nReleases the HMAC computation context at ctx.\n\n\n3) Hash algorithms.\n\n3.1) SHA-1\nMust always be implemented.\n\nSHA_DIGEST_LENGTH\n#define to 20, the SHA-1 digest length.\n\nlibssh2_sha1_ctx\nType of an SHA1 computation context. Generally a struct.\n\nint libssh2_sha1_init(libssh2_sha1_ctx *x);\nInitializes the SHA-1 computation context at x.\nReturns 1 for success and 0 for failure\n\nvoid libssh2_sha1_update(libssh2_sha1_ctx ctx,\n\t                 const unsigned char *data,\n\t                 size_t len);\nContinue computation of SHA-1 on len bytes at data using context ctx.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nvoid libssh2_sha1_final(libssh2_sha1_ctx ctx,\n                        unsigned char output[SHA1_DIGEST_LEN]);\nGet the computed SHA-1 signature from context ctx and store it into the\noutput buffer.\nRelease the context.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nvoid libssh2_hmac_sha1_init(libssh2_hmac_ctx *ctx,\n\t                    const void *key,\n\t                    int keylen);\nSetup the HMAC computation context ctx for an HMAC-SHA-1 computation using the\nkeylen-byte key. Is invoked just after libssh2_hmac_ctx_init().\n\n3.2) SHA-256\nMust always be implemented.\n\nSHA256_DIGEST_LENGTH\n#define to 32, the SHA-256 digest length.\n\nlibssh2_sha256_ctx\nType of an SHA-256 computation context. Generally a struct.\n\nint libssh2_sha256_init(libssh2_sha256_ctx *x);\nInitializes the SHA-256 computation context at x.\nReturns 1 for success and 0 for failure\n\nvoid libssh2_sha256_update(libssh2_sha256_ctx ctx,\n\t                   const unsigned char *data,\n\t                   size_t len);\nContinue computation of SHA-256 on len bytes at data using context ctx.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nvoid libssh2_sha256_final(libssh2_sha256_ctx ctx,\n\t                  unsigned char output[SHA256_DIGEST_LENGTH]);\nGets the computed SHA-256 signature from context ctx into the output buffer.\nRelease the context.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nint libssh2_sha256(const unsigned char *message,\n                   unsigned long len,\n                   unsigned char output[SHA256_DIGEST_LENGTH]);\nComputes the SHA-256 signature over the given message of length len and\nstore the result into the output buffer.\nReturn 1 if error, else 0.\nNote: Seems unused in current code, but defined in each crypto library backend.\n\nLIBSSH2_HMAC_SHA256\n#define as 1 if the crypto library supports HMAC-SHA-256, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\nvoid libssh2_hmac_sha256_init(libssh2_hmac_ctx *ctx,\n\t                      const void *key,\n\t                      int keylen);\nSetup the HMAC computation context ctx for an HMAC-256 computation using the\nkeylen-byte key. Is invoked just after libssh2_hmac_ctx_init().\n\n3.3) SHA-512\nLIBSSH2_HMAC_SHA512\n#define as 1 if the crypto library supports HMAC-SHA-512, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\nSHA512_DIGEST_LENGTH\n#define to 64, the SHA-512 digest length.\n\nvoid libssh2_hmac_sha512_init(libssh2_hmac_ctx *ctx,\n\t                      const void *key,\n\t                      int keylen);\nSetup the HMAC computation context ctx for an HMAC-512 computation using the\nkeylen-byte key. Is invoked just after libssh2_hmac_ctx_init().\n\n3.4) MD5\nLIBSSH2_MD5\n#define to 1 if the crypto library supports MD5, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\nMD5_DIGEST_LENGTH\n#define to 16, the MD5 digest length.\n\nlibssh2_md5_ctx\nType of an MD5 computation context. Generally a struct.\n\nint libssh2_md5_init(libssh2_md5_ctx *x);\nInitializes the MD5 computation context at x.\nReturns 1 for success and 0 for failure\n\nvoid libssh2_md5_update(libssh2_md5_ctx ctx,\n\t                const unsigned char *data,\n\t                size_t len);\nContinues computation of MD5 on len bytes at data using context ctx.\nReturns 1 for success and 0 for failure.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nvoid libssh2_md5_final(libssh2_md5_ctx ctx,\n\t               unsigned char output[MD5_DIGEST_LENGTH]);\nGets the computed MD5 signature from context ctx into the output buffer.\nRelease the context.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nvoid libssh2_hmac_md5_init(libssh2_hmac_ctx *ctx,\n\t                   const void *key,\n\t                   int keylen);\nSetup the HMAC computation context ctx for an HMAC-MD5 computation using the\nkeylen-byte key. Is invoked just after libssh2_hmac_ctx_init().\n\n3.5) RIPEMD-160\nLIBSSH2_HMAC_RIPEMD\n#define as 1 if the crypto library supports HMAC-RIPEMD-160, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\nvoid libssh2_hmac_ripemd160_init(libssh2_hmac_ctx *ctx,\n\t                         const void *key,\n\t                         int keylen);\nSetup the HMAC computation context ctx for an HMAC-RIPEMD-160 computation using\nthe keylen-byte key. Is invoked just after libssh2_hmac_ctx_init().\nReturns 1 for success and 0 for failure.\n\n\n4) Bidirectional Key ciphers.\n\n_libssh2_cipher_ctx\nType of a cipher computation context.\n\n_libssh2_cipher_type(name);\nMacro defining name as storage identifying a cipher algorithm for\nthe crypto library interface. No trailing semicolon.\n\nint _libssh2_cipher_init(_libssh2_cipher_ctx *h,\n                         _libssh2_cipher_type(algo),\n                         unsigned char *iv,\n                         unsigned char *secret,\n                         int encrypt);\nCreates a cipher context for the given algorithm with the initialization vector\niv and the secret key secret. Prepare for encryption or decryption depending on\nencrypt.\nReturn 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_cipher_crypt(_libssh2_cipher_ctx *ctx,\n                          _libssh2_cipher_type(algo),\n                          int encrypt,\n                          unsigned char *block,\n                          size_t blocksize);\nEncrypt or decrypt in-place data at (block, blocksize) using the given\ncontext and/or algorithm.\nReturn 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nvoid _libssh2_cipher_dtor(_libssh2_cipher_ctx *ctx);\nRelease cipher context at ctx.\n\n4.1) AES\n4.1.1) AES in CBC block mode.\nLIBSSH2_AES\n#define as 1 if the crypto library supports AES in CBC mode, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\n_libssh2_cipher_aes128\nAES-128-CBC algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n_libssh2_cipher_aes192\nAES-192-CBC algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n_libssh2_cipher_aes256\nAES-256-CBC algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n4.1.2) AES in CTR block mode.\nLIBSSH2_AES_CTR\n#define as 1 if the crypto library supports AES in CTR mode, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\nvoid _libssh2_init_aes_ctr(void);\nInitialize static AES CTR ciphers.\nThis procedure is already prototyped in crypto.h.\n\n_libssh2_cipher_aes128ctr\nAES-128-CTR algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n_libssh2_cipher_aes192ctr\nAES-192-CTR algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n_libssh2_cipher_aes256ctr\nAES-256-CTR algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n4.2) Blowfish in CBC block mode.\nLIBSSH2_BLOWFISH\n#define as 1 if the crypto library supports blowfish in CBC mode, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\n_libssh2_cipher_blowfish\nBlowfish-CBC algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n4.3) RC4.\nLIBSSH2_RC4\n#define as 1 if the crypto library supports RC4 (arcfour), else 0.\nIf defined as 0, the rest of this section can be omitted.\n\n_libssh2_cipher_arcfour\nRC4 algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n4.4) CAST5 in CBC block mode.\nLIBSSH2_CAST\n#define 1 if the crypto library supports cast, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\n_libssh2_cipher_cast5\nCAST5-CBC algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n4.5) Tripple DES in CBC block mode.\nLIBSSH2_3DES\n#define as 1 if the crypto library supports TripleDES in CBC mode, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\n_libssh2_cipher_3des\nTripleDES-CBC algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n\n5) Big numbers.\nPositive multi-byte integers support is sufficient.\n\n5.1) Computation contexts.\nThis has a real meaning if the big numbers computations need some context\nstorage. If not, use a dummy type and functions (macros).\n\n_libssh2_bn_ctx\nType of multiple precision computation context. May not be empty. if not used,\n#define as char, for example.\n\nlibssh2_bn_ctx _libssh2_bn_ctx_new(void);\nReturns a new multiple precision computation context.\n\nvoid _libssh2_bn_ctx_free(_libssh2_bn_ctx ctx);\nReleases a multiple precision computation context.\n\n5.2) Computation support.\n_libssh2_bn\nType of multiple precision numbers (aka bignumbers or huge integers) for the\ncrypto library.\n\n_libssh2_bn * _libssh2_bn_init(void);\nCreates a multiple precision number (preset to zero).\n\n_libssh2_bn * _libssh2_bn_init_from_bin(void);\nCreate a multiple precision number intended to be set by the\n_libssh2_bn_from_bin() function (see below). Unlike _libssh2_bn_init(), this\ncode may be a dummy initializer if the _libssh2_bn_from_bin() actually\nallocates the number. Returns a value of type _libssh2_bn *.\n\nvoid _libssh2_bn_free(_libssh2_bn *bn);\nDestroys the multiple precision number at bn.\n\nunsigned long _libssh2_bn_bytes(libssh2_bn *bn);\nGet the number of bytes needed to store the bits of the multiple precision\nnumber at bn.\n\nunsigned long _libssh2_bn_bits(_libssh2_bn *bn);\nReturns the number of bits of multiple precision number at bn.\n\nint _libssh2_bn_set_word(_libssh2_bn *bn, unsigned long val);\nSets the value of bn to val.\nReturns 1 on success, 0 otherwise.\n\n_libssh2_bn * _libssh2_bn_from_bin(_libssh2_bn *bn, int len,\n\t                           const unsigned char *val);\nConverts the positive integer in big-endian form of length len at val\ninto a _libssh2_bn and place it in bn. If bn is NULL, a new _libssh2_bn is\ncreated.\nReturns a pointer to target _libssh2_bn or NULL if error.\n\nint _libssh2_bn_to_bin(_libssh2_bn *bn, unsigned char *val);\nConverts the absolute value of bn into big-endian form and store it at\nval. val must point to _libssh2_bn_bytes(bn) bytes of memory.\nReturns the length of the big-endian number.\n\nvoid _libssh2_bn_rand(_libssh2_bn *bn, int bits, int top, int bottom);\nGenerates a cryptographically strong pseudo-random number of bits in\nlength and stores it in bn. If top is -1, the most significant bit of the\nrandom number can be zero. If top is 0, it is set to 1, and if top is 1, the\ntwo most significant bits of the number will be set to 1, so that the product\nof two such random numbers will always have 2*bits length. If bottom is true,\nthe number will be odd.\n\nvoid _libssh2_bn_mod_exp(_libssh2_bn *r, _libssh2_bn *a,\n\t                 _libssh2_bn *p, _libssh2_bn *m,\n\t                 _libssh2_bn_ctx *ctx);\nComputes a to the p-th power modulo m and stores the result into r (r=a^p % m).\nMay use the given context.\n\n\n6) Private key algorithms.\nFormat of an RSA public key:\na) \"ssh-rsa\".\nb) RSA exponent, MSB first, with high order bit = 0.\nc) RSA modulus, MSB first, with high order bit = 0.\nEach item is preceded by its 32-bit byte length, MSB first.\n\nFormat of a DSA public key:\na) \"ssh-dss\".\nb) p, MSB first, with high order bit = 0.\nc) q, MSB first, with high order bit = 0.\nd) g, MSB first, with high order bit = 0.\ne) pub_key, MSB first, with high order bit = 0.\nEach item is preceded by its 32-bit byte length, MSB first.\n\nint _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session,\n                              unsigned char **method,\n                              size_t *method_len,\n                              unsigned char **pubkeydata,\n                              size_t *pubkeydata_len,\n                              const char *privatekey,\n                              const char *passphrase);\nReads a private key from file privatekey and extract the public key -->\n(pubkeydata, pubkeydata_len). Store the associated method (ssh-rsa or ssh-dss)\ninto (method, method_len).\nBoth buffers have to be allocated using LIBSSH2_ALLOC().\nReturns 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session,\n                                    unsigned char **method,\n                                    size_t *method_len,\n                                    unsigned char **pubkeydata,\n                                    size_t *pubkeydata_len,\n                                    const char *privatekeydata,\n                                    size_t privatekeydata_len,\n                                    const char *passphrase);\nGets a private key from bytes at (privatekeydata, privatekeydata_len) and\nextract the public key --> (pubkeydata, pubkeydata_len). Store the associated\nmethod (ssh-rsa or ssh-dss) into (method, method_len).\nBoth buffers have to be allocated using LIBSSH2_ALLOC().\nReturns 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\n6.1) RSA\nLIBSSH2_RSA\n#define as 1 if the crypto library supports RSA, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\nlibssh2_rsa_ctx\nType of an RSA computation context. Generally a struct.\n\nint _libssh2_rsa_new(libssh2_rsa_ctx **rsa,\n                     const unsigned char *edata,\n                     unsigned long elen,\n                     const unsigned char *ndata,\n                     unsigned long nlen,\n                     const unsigned char *ddata,\n                     unsigned long dlen,\n                     const unsigned char *pdata,\n                     unsigned long plen,\n                     const unsigned char *qdata,\n                     unsigned long qlen,\n                     const unsigned char *e1data,\n                     unsigned long e1len,\n                     const unsigned char *e2data,\n                     unsigned long e2len,\n                     const unsigned char *coeffdata, unsigned long coefflen);\nCreates a new context for RSA computations from key source values:\n\tpdata, plen\tPrime number p. Only used if private key known (ddata).\n\tqdata, qlen\tPrime number q. Only used if private key known (ddata).\n\tndata, nlen\tModulus n.\n\tedata, elen\tExponent e.\n\tddata, dlen\te^-1 % phi(n) = private key. May be NULL if unknown.\n\te1data, e1len\tdp = d % (p-1). Only used if private key known (dtata).\n\te2data, e2len\tdq = d % (q-1). Only used if private key known (dtata).\n\tcoeffdata, coefflen\tq^-1 % p. Only used if private key known.\nReturns 0 if OK.\nThis procedure is already prototyped in crypto.h.\nNote: the current generic code only calls this function with e and n (public\nkey parameters): unless used internally by the backend, it is not needed to\nsupport the private key and the other parameters here.\n\nint _libssh2_rsa_new_private(libssh2_rsa_ctx **rsa,\n                             LIBSSH2_SESSION *session,\n                             const char *filename,\n                             unsigned const char *passphrase);\nReads an RSA private key from file filename into a new RSA context.\nMust call _libssh2_init_if_needed().\nReturn 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx **rsa,\n                                        LIBSSH2_SESSION *session,\n                                        const char *data,\n\t\t\t\t\tsize_t data_len,\n                                        unsigned const char *passphrase);\nGets an RSA private key from data into a new RSA context.\nMust call _libssh2_init_if_needed().\nReturn 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_rsa_sha1_verify(libssh2_rsa_ctx *rsa,\n                             const unsigned char *sig,\n                             unsigned long sig_len,\n                             const unsigned char *m, unsigned long m_len);\nVerify (sig, siglen) signature of (m, m_len) using an SHA-1 hash and the\nRSA context.\nReturn 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_rsa_sha1_signv(LIBSSH2_SESSION *session,\n\t                    unsigned char **sig, size_t *siglen,\n\t                    int count, const struct iovec vector[],\n\t                    libssh2_rsa_ctx *ctx);\nRSA signs the SHA-1 hash computed over the count data chunks in vector.\nSignature is stored at (sig, siglen).\nSignature buffer must be allocated from the given session.\nReturns 0 if OK, else -1.\nNote: this procedure is optional: if provided, it MUST be defined as a macro.\n\nint _libssh2_rsa_sha1_sign(LIBSSH2_SESSION *session,\n                           libssh2_rsa_ctx *rsactx,\n                           const unsigned char *hash,\n                           size_t hash_len,\n                           unsigned char **signature,\n                           size_t *signature_len);\nRSA signs the (hash, hashlen) SHA-1 hash bytes and stores the allocated\nsignature at (signature, signature_len).\nSignature buffer must be allocated from the given session.\nReturns 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\nNote: this procedure is not used if macro _libssh2_rsa_sha1_signv() is defined.\n\nvoid _libssh2_rsa_free(libssh2_rsa_ctx *rsactx);\nReleases the RSA computation context at rsactx.\n\n\n6.2) DSA\nLIBSSH2_DSA\n#define as 1 if the crypto library supports DSA, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\n\nlibssh2_dsa_ctx\nType of a DSA computation context. Generally a struct.\n\nint _libssh2_dsa_new(libssh2_dsa_ctx **dsa,\n                     const unsigned char *pdata,\n                     unsigned long plen,\n                     const unsigned char *qdata,\n                     unsigned long qlen,\n                     const unsigned char *gdata,\n                     unsigned long glen,\n                     const unsigned char *ydata,\n                     unsigned long ylen,\n                     const unsigned char *x, unsigned long x_len);\nCreates a new context for DSA computations from source key values:\n\tpdata, plen\tPrime number p. Only used if private key known (ddata).\n\tqdata, qlen\tPrime number q. Only used if private key known (ddata).\n\tgdata, glen\tG number.\n\tydata, ylen\tPublic key.\n\txdata, xlen\tPrivate key. Only taken if xlen non-zero.\nReturns 0 if OK.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_dsa_new_private(libssh2_dsa_ctx **dsa,\n                             LIBSSH2_SESSION *session,\n                             const char *filename,\n                             unsigned const char *passphrase);\nGets a DSA private key from file filename into a new DSA context.\nMust call _libssh2_init_if_needed().\nReturn 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_dsa_new_private_frommemory(libssh2_dsa_ctx **dsa,\n                                        LIBSSH2_SESSION *session,\n                                        const char *data,\n\t\t\t\t\tsize_t data_len,\n                                        unsigned const char *passphrase);\nGets a DSA private key from the data_len-bytes data into a new DSA context.\nMust call _libssh2_init_if_needed().\nReturns 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_dsa_sha1_verify(libssh2_dsa_ctx *dsactx,\n                             const unsigned char *sig,\n                             const unsigned char *m, unsigned long m_len);\nVerify (sig, siglen) signature of (m, m_len) using an SHA1 hash and the\nDSA context.\nReturns 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_dsa_sha1_sign(libssh2_dsa_ctx *dsactx,\n                           const unsigned char *hash,\n                           unsigned long hash_len, unsigned char *sig);\nDSA signs the (hash, hash_len) data using SHA-1 and store the signature at sig.\nReturns 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nvoid _libssh2_dsa_free(libssh2_dsa_ctx *dsactx);\nReleases the DSA computation context at dsactx.\n\n\n7) Miscellaneous\n\nvoid libssh2_prepare_iovec(struct iovec *vector, unsigned int len);\nPrepare len consecutive iovec slots before using them.\nIn example, this is needed to preset unused structure slacks on platforms\nrequiring it.\nIf this is not needed, it should be defined as an empty macro.\n\nvoid _libssh2_random(unsigned char *buf, int len);\nStore len random bytes at buf.\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/INSTALL_AUTOTOOLS",
    "content": "Installation Instructions\n*************************\n\nCopyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free\nSoftware Foundation, Inc.\n\nThis file is free documentation; the Free Software Foundation gives\nunlimited permission to copy, distribute and modify it.\n\nBasic Installation\n==================\n\nThese are generic installation instructions.\n\n   The `configure' shell script attempts to guess correct values for\nvarious system-dependent variables used during compilation.  It uses\nthose values to create a `Makefile' in each directory of the package.\nIt may also create one or more `.h' files containing system-dependent\ndefinitions.  Finally, it creates a shell script `config.status' that\nyou can run in the future to recreate the current configuration, and a\nfile `config.log' containing compiler output (useful mainly for\ndebugging `configure').\n\n   It can also use an optional file (typically called `config.cache'\nand enabled with `--cache-file=config.cache' or simply `-C') that saves\nthe results of its tests to speed up reconfiguring.  (Caching is\ndisabled by default to prevent problems with accidental use of stale\ncache files.)\n\n   If you need to do unusual things to compile the package, please try\nto figure out how `configure' could check whether to do them, and mail\ndiffs or instructions to the address given in the `README' so they can\nbe considered for the next release.  If you are using the cache, and at\nsome point `config.cache' contains results you don't want to keep, you\nmay remove or edit it.\n\n   The file `configure.ac' (or `configure.in') is used to create\n`configure' by a program called `autoconf'.  You only need\n`configure.ac' if you want to change it or regenerate `configure' using\na newer version of `autoconf'.\n\nThe simplest way to compile this package is:\n\n  1. `cd' to the directory containing the package's source code and type\n     `./configure' to configure the package for your system.  If you're\n     using `csh' on an old version of System V, you might need to type\n     `sh ./configure' instead to prevent `csh' from trying to execute\n     `configure' itself.\n\n     Running `configure' takes awhile.  While running, it prints some\n     messages telling which features it is checking for.\n\n  2. Type `make' to compile the package.\n\n  3. Optionally, type `make check' to run any self-tests that come with\n     the package.\n\n  4. Type `make install' to install the programs and any data files and\n     documentation.\n\n  5. You can remove the program binaries and object files from the\n     source code directory by typing `make clean'.  To also remove the\n     files that `configure' created (so you can compile the package for\n     a different kind of computer), type `make distclean'.  There is\n     also a `make maintainer-clean' target, but that is intended mainly\n     for the package's developers.  If you use it, you may have to get\n     all sorts of other programs in order to regenerate files that came\n     with the distribution.\n\nCompilers and Options\n=====================\n\nSome systems require unusual options for compilation or linking that the\n`configure' script does not know about.  Run `./configure --help' for\ndetails on some of the pertinent environment variables.\n\n   You can give `configure' initial values for configuration parameters\nby setting variables in the command line or in the environment.  Here\nis an example:\n\n     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix\n\n   *Note Defining Variables::, for more details.\n\nCompiling For Multiple Architectures\n====================================\n\nYou can compile the package for more than one kind of computer at the\nsame time, by placing the object files for each architecture in their\nown directory.  To do this, you must use a version of `make' that\nsupports the `VPATH' variable, such as GNU `make'.  `cd' to the\ndirectory where you want the object files and executables to go and run\nthe `configure' script.  `configure' automatically checks for the\nsource code in the directory that `configure' is in and in `..'.\n\n   If you have to use a `make' that does not support the `VPATH'\nvariable, you have to compile the package for one architecture at a\ntime in the source code directory.  After you have installed the\npackage for one architecture, use `make distclean' before reconfiguring\nfor another architecture.\n\nInstallation Names\n==================\n\nBy default, `make install' installs the package's commands under\n`/usr/local/bin', include files under `/usr/local/include', etc.  You\ncan specify an installation prefix other than `/usr/local' by giving\n`configure' the option `--prefix=PREFIX'.\n\n   You can specify separate installation prefixes for\narchitecture-specific files and architecture-independent files.  If you\npass the option `--exec-prefix=PREFIX' to `configure', the package uses\nPREFIX as the prefix for installing programs and libraries.\nDocumentation and other data files still use the regular prefix.\n\n   In addition, if you use an unusual directory layout you can give\noptions like `--bindir=DIR' to specify different values for particular\nkinds of files.  Run `configure --help' for a list of the directories\nyou can set and what kinds of files go in them.\n\n   If the package supports it, you can cause programs to be installed\nwith an extra prefix or suffix on their names by giving `configure' the\noption `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.\n\nOptional Features\n=================\n\nSome packages pay attention to `--enable-FEATURE' options to\n`configure', where FEATURE indicates an optional part of the package.\nThey may also pay attention to `--with-PACKAGE' options, where PACKAGE\nis something like `gnu-as' or `x' (for the X Window System).  The\n`README' should mention any `--enable-' and `--with-' options that the\npackage recognizes.\n\n   For packages that use the X Window System, `configure' can usually\nfind the X include and library files automatically, but if it doesn't,\nyou can use the `configure' options `--x-includes=DIR' and\n`--x-libraries=DIR' to specify their locations.\n\nSpecifying the System Type\n==========================\n\nThere may be some features `configure' cannot figure out automatically,\nbut needs to determine by the type of machine the package will run on.\nUsually, assuming the package is built to be run on the _same_\narchitectures, `configure' can figure that out, but if it prints a\nmessage saying it cannot guess the machine type, give it the\n`--build=TYPE' option.  TYPE can either be a short name for the system\ntype, such as `sun4', or a canonical name which has the form:\n\n     CPU-COMPANY-SYSTEM\n\nwhere SYSTEM can have one of these forms:\n\n     OS KERNEL-OS\n\n   See the file `config.sub' for the possible values of each field.  If\n`config.sub' isn't included in this package, then this package doesn't\nneed to know the machine type.\n\n   If you are _building_ compiler tools for cross-compiling, you should\nuse the option `--target=TYPE' to select the type of system they will\nproduce code for.\n\n   If you want to _use_ a cross compiler, that generates code for a\nplatform different from the build platform, you should specify the\n\"host\" platform (i.e., that on which the generated programs will\neventually be run) with `--host=TYPE'.\n\nSharing Defaults\n================\n\nIf you want to set default values for `configure' scripts to share, you\ncan create a site shell script called `config.site' that gives default\nvalues for variables like `CC', `cache_file', and `prefix'.\n`configure' looks for `PREFIX/share/config.site' if it exists, then\n`PREFIX/etc/config.site' if it exists.  Or, you can set the\n`CONFIG_SITE' environment variable to the location of the site script.\nA warning: not all `configure' scripts look for a site script.\n\nDefining Variables\n==================\n\nVariables not defined in a site shell script can be set in the\nenvironment passed to `configure'.  However, some packages may run\nconfigure again during the build, and the customized values of these\nvariables may be lost.  In order to avoid this problem, you should set\nthem in the `configure' command line, using `VAR=value'.  For example:\n\n     ./configure CC=/usr/local2/bin/gcc\n\ncauses the specified `gcc' to be used as the C compiler (unless it is\noverridden in the site shell script).  Here is a another example:\n\n     /bin/bash ./configure CONFIG_SHELL=/bin/bash\n\nHere the `CONFIG_SHELL=/bin/bash' operand causes subsequent\nconfiguration-related scripts to be executed by `/bin/bash'.\n\n`configure' Invocation\n======================\n\n`configure' recognizes the following options to control how it operates.\n\n`--help'\n`-h'\n     Print a summary of the options to `configure', and exit.\n\n`--version'\n`-V'\n     Print the version of Autoconf used to generate the `configure'\n     script, and exit.\n\n`--cache-file=FILE'\n     Enable the cache: use and save the results of the tests in FILE,\n     traditionally `config.cache'.  FILE defaults to `/dev/null' to\n     disable caching.\n\n`--config-cache'\n`-C'\n     Alias for `--cache-file=config.cache'.\n\n`--quiet'\n`--silent'\n`-q'\n     Do not print messages saying which checks are being made.  To\n     suppress all normal output, redirect it to `/dev/null' (any error\n     messages will still be shown).\n\n`--srcdir=DIR'\n     Look for the package's source code in directory DIR.  Usually\n     `configure' can determine that directory automatically.\n\n`configure' also accepts some other, not widely useful, options.  Run\n`configure --help' for more details.\n\nMore configure options\n======================\n\nSome ./configure options deserve additional comments:\n\n * --enable-crypt-none\n\n\tThe SSH2 Transport allows for unencrypted data\n\ttransmission using the \"none\" cipher.  Because this is\n\tsuch a huge security hole, it is typically disabled on\n\tSSH2 implementations and is disabled in libssh2 by\n\tdefault as well.\n\n\tEnabling this option will allow for \"none\" as a\n\tnegotiable method, however it still requires that the\n\tmethod be advertized by the remote end and that no\n\tmore-preferable methods are available.\n\n * --enable-mac-none\n\n\tThe SSH2 Transport also allows implementations to\n\tforego a message authentication code.  While this is\n\tless of a security risk than using a \"none\" cipher, it\n\tis still not recommended as disabling MAC hashes\n\tremoves a layer of security.\n\n\tEnabling this option will allow for \"none\" as a\n\tnegotiable method, however it still requires that the\n\tmethod be advertized by the remote end and that no\n\tmore-preferable methods are available.\n\n * --disable-gex-new\n\n\tThe diffie-hellman-group-exchange-sha1 (dh-gex) key\n\texchange method originally defined an exchange\n\tnegotiation using packet type 30 to request a\n\tgeneration pair based on a single target value.  Later\n\trefinement of dh-gex provided for range and target\n\tvalues.  By default libssh2 will use the newer range\n\tmethod.\n\n\tIf you experience trouble connecting to an old SSH\n\tserver using dh-gex, try this option to fallback on\n\tthe older more reliable method.\n\n * --with-libgcrypt\n * --without-libgcrypt\n * --with-libgcrypt-prefix=DIR\n\n\tlibssh2 can use the Libgcrypt library\n\t(https://www.gnupg.org/) for cryptographic operations.\n\tEither Libgcrypt or OpenSSL is required.\n\n\tConfigure will attempt to locate Libgcrypt\n\tautomatically.\n\n\tIf your installation of Libgcrypt is in another\n\tlocation, specify it using --with-libgcrypt-prefix.\n\n * --with-openssl\n * --without-openssl\n * --with-libssl-prefix=[DIR]\n\n\tlibssh2 can use the OpenSSL library\n\t(https://www.openssl.org) for cryptographic operations.\n\tEither Libgcrypt or OpenSSL is required.\n\n\tConfigure will attempt to locate OpenSSL in the\n\tdefault location.\n\n\tIf your installation of OpenSSL is in another\n\tlocation, specify it using --with-libssl-prefix.\n\n * --with-libz\n * --without-libz\n * --with-libz-prefix=[DIR]\n\n\tIf present, libssh2 will attempt to use the zlib\n\t(http://www.zlib.org) for payload compression, however\n\tzlib is not required.\n\n\tIf your installation of Libz is in another location,\n\tspecify it using --with-libz-prefix.\n\n * --enable-debug\n\n\tWill make the build use more pedantic and strict compiler\n\toptions as well as enable the libssh2_trace() function (for\n\tshowing debug traces).\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/INSTALL_CMAKE",
    "content": "License: see COPYING\n\nSource code: https://github.com/libssh2/libssh2\n\nWeb site source code: https://github.com/libssh2/www\n\nInstallation instructions are in docs/INSTALL\n=======\nTo build libssh2 you will need CMake v2.8 or later [1] and one of the\nfollowing cryptography libraries:\n\n* OpenSSL\n* Libgcrypt\n* WinCNG\n\nGetting started\n---------------\n\nIf you are happy with the default options, make a new build directory,\nchange to it, configure the build environment and build the project:\n\n  mkdir bin\n  cd bin\n  cmake ..\n  cmake --build .\n\nlibssh2 will be built as a static library and will use any\ncryptography library available.  The library binary will be put in\n`bin/src`, with the examples in `bin/example` and the tests in\n`bin/tests`.\n\nCustomising the build\n---------------------\n\nOf course, you might want to customise the build options.  You can\npass the options to CMake on the command line:\n\n  cmake -D<option>=<value> ..\n\nThe following options are available:\n\n * `BUILD_SHARED_LIBS=OFF`\n\n    Determines whether libssh2 is built as a static library or as a\n    shared library (.dll/.so).  Can be `ON` or `OFF`.\n\n * `CRYPTO_BACKEND=`\n\n    Chooses a specific cryptography library to use for cryptographic\n    operations.  Can be `OpenSSL` (https://www.openssl.org),\n    `Libgcrypt` (https://www.gnupg.org/), `WinCNG` (Windows Vista+) or\n    blank to use any library available.\n\n    CMake will attempt to locate the libraries automatically.  See [2]\n    for more information.\n\n * `ENABLE_ZLIB_COMPRESSION=OFF`\n\n    Will use zlib (http://www.zlib.org) for payload compression.  Can\n    be `ON` or `OFF`.\n\n * `ENABLE_CRYPT_NONE=OFF`\n\n    The SSH2 Transport allows for unencrypted data transmission using\n    the \"none\" cipher.  Because this is such a huge security hole, it\n    is typically disabled on SSH2 implementations and is disabled in\n    libssh2 by default as well.\n\n    Enabling this option will allow for \"none\" as a negotiable method,\n    however it still requires that the method be advertized by the\n    remote end and that no more-preferable methods are available.\n\n * `ENABLE_MAC_NONE=OFF`\n\n    The SSH2 Transport also allows implementations to forego a message\n    authentication code.  While this is less of a security risk than\n    using a \"none\" cipher, it is still not recommended as disabling\n    MAC hashes removes a layer of security.\n\n    Enabling this option will allow for \"none\" as a negotiable method,\n    however it still requires that the method be advertized by the\n    remote end and that no more-preferable methods are available.\n\n * `ENABLE_GEX_NEW=ON`\n\n    The diffie-hellman-group-exchange-sha1 (dh-gex) key exchange\n    method originally defined an exchange negotiation using packet\n    type 30 to request a generation pair based on a single target\n    value.  Later refinement of dh-gex provided for range and target\n    values.  By default libssh2 will use the newer range method.\n\n    If you experience trouble connecting to an old SSH server using\n    dh-gex, try this option to fallback on the older more reliable\n    method.\n\n * `ENABLE_DEBUG_LOGGING=ON` in Debug, `=OFF` in Release\n\n    Will enable the libssh2_trace() function for showing debug traces.\n\nBuild tools\n-----------\n\nThe previous examples used CMake to start the build using:\n\n  cmake --build .\n\nAlternatively, once CMake has configured your project, you can just\nuse your own build tool, e.g GNU make, Visual Studio, etc., from that\npoint onwards.\n\nTests\n-----\n\nTo test the build, run the appropriate test target for your build\nsystem.  For example:\n\n  cmake --build . --target test\nor\n  cmake --build . --target RUN_TESTS\n\nHow do I use libssh2 in my project if my project doesn't use CMake?\n-------------------------------------------------------------------\n\nIf you are not using CMake for your own project, install libssh2\n\n  cmake <libssh2 source location>\n  cmake --build .\n  cmake --build . --target install\nor\n  cmake --build . --target INSTALL\n\nand then specify the install location to your project in the normal\nway for your build environment.  If you don't like the default install\nlocation, add `-DCMAKE_INSTALL_PREFIX=<chosen prefix>` when initially\nconfiguring the project.\n\nHow can I use libssh2 in my project if it also uses CMake?\n----------------------------------------------------------\n\nIf your own project also uses CMake, you don't need to worry about\nsetting it up with libssh2's location.  Just add just the following\nlines and CMake will find libssh2 on your system, set up the necessary\npaths and link the library with your binary.\n\n    find_package(Libssh2 REQUIRED CONFIG)\n    target_link_libraries(my_project_target Libssh2::libssh2)\n\nOf course, you still have to make libssh2 available on your system\nfirst.  You can install it in the traditional way shown above, but you\ndon't have to.  Instead you can just build it, which will export its\nlocation to the user package registry [3] where `find_package` will\nfind it.\n\nYou can even combine the two steps using a so-called 'superbuild'\nproject [4] that downloads, builds and exports libssh2, and then\nbuilds your project:\n\n    include(ExternalProject)\n\n    ExternalProject_Add(\n        Libssh2\n        URL <libssh2 download location>\n        URL_HASH SHA1=<libssh2 archive SHA1>\n        INSTALL_COMMAND \"\")\n\n    ExternalProject_Add(\n        MyProject DEPENDS Libssh2\n        SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src\n        INSTALL_COMMAND \"\")\n\n[1] https://www.cmake.org/cmake/resources/software.html\n[2] https://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html\n[3] https://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html#package-registry\n[4] http://www.kitware.com/media/html/BuildingExternalProjectsWithCMake2.8.html\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/Makefile.am",
    "content": "# $Id: Makefile.am,v 1.37 2009/03/26 15:41:15 bagder Exp $\n\nEXTRA_DIST = template.3 BINDINGS INSTALL_AUTOTOOLS INSTALL_CMAKE HACKING TODO\t\\\n AUTHORS CMakeLists.txt HACKING.CRYPTO\n\ndist_man_MANS = \\\n\tlibssh2_agent_connect.3 \\\n\tlibssh2_agent_disconnect.3 \\\n\tlibssh2_agent_free.3 \\\n\tlibssh2_agent_get_identity.3 \\\n\tlibssh2_agent_init.3 \\\n\tlibssh2_agent_list_identities.3 \\\n\tlibssh2_agent_userauth.3 \\\n\tlibssh2_banner_set.3 \\\n\tlibssh2_base64_decode.3 \\\n\tlibssh2_channel_close.3 \\\n\tlibssh2_channel_direct_tcpip.3 \\\n\tlibssh2_channel_direct_tcpip_ex.3 \\\n\tlibssh2_channel_eof.3 \\\n\tlibssh2_channel_exec.3 \\\n\tlibssh2_channel_flush.3 \\\n\tlibssh2_channel_flush_ex.3 \\\n\tlibssh2_channel_flush_stderr.3 \\\n\tlibssh2_channel_forward_accept.3 \\\n\tlibssh2_channel_forward_cancel.3 \\\n\tlibssh2_channel_forward_listen.3 \\\n\tlibssh2_channel_forward_listen_ex.3 \\\n\tlibssh2_channel_free.3 \\\n\tlibssh2_channel_get_exit_signal.3 \\\n\tlibssh2_channel_get_exit_status.3 \\\n\tlibssh2_channel_handle_extended_data.3 \\\n\tlibssh2_channel_handle_extended_data2.3 \\\n\tlibssh2_channel_ignore_extended_data.3 \\\n\tlibssh2_channel_open_ex.3 \\\n\tlibssh2_channel_open_session.3 \\\n\tlibssh2_channel_process_startup.3 \\\n\tlibssh2_channel_read.3 \\\n\tlibssh2_channel_read_ex.3 \\\n\tlibssh2_channel_read_stderr.3 \\\n\tlibssh2_channel_receive_window_adjust.3 \\\n\tlibssh2_channel_receive_window_adjust2.3 \\\n\tlibssh2_channel_request_pty.3 \\\n\tlibssh2_channel_request_pty_ex.3 \\\n\tlibssh2_channel_request_pty_size.3 \\\n\tlibssh2_channel_request_pty_size_ex.3 \\\n\tlibssh2_channel_send_eof.3 \\\n\tlibssh2_channel_set_blocking.3 \\\n\tlibssh2_channel_setenv.3 \\\n\tlibssh2_channel_setenv_ex.3 \\\n\tlibssh2_channel_shell.3 \\\n\tlibssh2_channel_subsystem.3 \\\n\tlibssh2_channel_wait_closed.3 \\\n\tlibssh2_channel_wait_eof.3 \\\n\tlibssh2_channel_window_read.3 \\\n\tlibssh2_channel_window_read_ex.3 \\\n\tlibssh2_channel_window_write.3 \\\n\tlibssh2_channel_window_write_ex.3 \\\n\tlibssh2_channel_write.3 \\\n\tlibssh2_channel_write_ex.3 \\\n\tlibssh2_channel_write_stderr.3 \\\n\tlibssh2_channel_x11_req.3 \\\n\tlibssh2_channel_x11_req_ex.3 \\\n\tlibssh2_exit.3 \\\n\tlibssh2_free.3 \\\n\tlibssh2_hostkey_hash.3 \\\n\tlibssh2_init.3 \\\n\tlibssh2_keepalive_config.3 \\\n\tlibssh2_keepalive_send.3 \\\n\tlibssh2_knownhost_add.3 \\\n\tlibssh2_knownhost_addc.3 \\\n\tlibssh2_knownhost_check.3 \\\n\tlibssh2_knownhost_checkp.3 \\\n\tlibssh2_knownhost_del.3 \\\n\tlibssh2_knownhost_free.3 \\\n\tlibssh2_knownhost_get.3 \\\n\tlibssh2_knownhost_init.3 \\\n\tlibssh2_knownhost_readfile.3 \\\n\tlibssh2_knownhost_readline.3 \\\n\tlibssh2_knownhost_writefile.3 \\\n\tlibssh2_knownhost_writeline.3 \\\n\tlibssh2_poll.3 \\\n\tlibssh2_poll_channel_read.3 \\\n\tlibssh2_publickey_add.3 \\\n\tlibssh2_publickey_add_ex.3 \\\n\tlibssh2_publickey_init.3 \\\n\tlibssh2_publickey_list_fetch.3 \\\n\tlibssh2_publickey_list_free.3 \\\n\tlibssh2_publickey_remove.3 \\\n\tlibssh2_publickey_remove_ex.3 \\\n\tlibssh2_publickey_shutdown.3 \\\n\tlibssh2_scp_recv.3 \\\n\tlibssh2_scp_recv2.3 \\\n\tlibssh2_scp_send.3 \\\n\tlibssh2_scp_send64.3 \\\n\tlibssh2_scp_send_ex.3 \\\n\tlibssh2_session_abstract.3 \\\n\tlibssh2_session_banner_get.3 \\\n\tlibssh2_session_banner_set.3 \\\n\tlibssh2_session_block_directions.3 \\\n\tlibssh2_session_callback_set.3 \\\n\tlibssh2_session_disconnect.3 \\\n\tlibssh2_session_disconnect_ex.3 \\\n\tlibssh2_session_flag.3 \\\n\tlibssh2_session_free.3 \\\n\tlibssh2_session_get_blocking.3 \\\n\tlibssh2_session_get_timeout.3 \\\n\tlibssh2_session_handshake.3 \\\n\tlibssh2_session_hostkey.3 \\\n\tlibssh2_session_init.3 \\\n\tlibssh2_session_init_ex.3 \\\n\tlibssh2_session_last_errno.3 \\\n\tlibssh2_session_last_error.3 \\\n\tlibssh2_session_set_last_error.3 \\\n\tlibssh2_session_method_pref.3 \\\n\tlibssh2_session_methods.3 \\\n\tlibssh2_session_set_blocking.3 \\\n\tlibssh2_session_set_timeout.3 \\\n\tlibssh2_session_startup.3 \\\n\tlibssh2_session_supported_algs.3 \\\n\tlibssh2_sftp_close.3 \\\n\tlibssh2_sftp_close_handle.3 \\\n\tlibssh2_sftp_closedir.3 \\\n\tlibssh2_sftp_fsetstat.3 \\\n\tlibssh2_sftp_fstat.3 \\\n\tlibssh2_sftp_fstat_ex.3 \\\n\tlibssh2_sftp_fstatvfs.3 \\\n\tlibssh2_sftp_fsync.3 \\\n\tlibssh2_sftp_get_channel.3 \\\n\tlibssh2_sftp_init.3 \\\n\tlibssh2_sftp_last_error.3 \\\n\tlibssh2_sftp_lstat.3 \\\n\tlibssh2_sftp_mkdir.3 \\\n\tlibssh2_sftp_mkdir_ex.3 \\\n\tlibssh2_sftp_open.3 \\\n\tlibssh2_sftp_open_ex.3 \\\n\tlibssh2_sftp_opendir.3 \\\n\tlibssh2_sftp_read.3 \\\n\tlibssh2_sftp_readdir.3 \\\n\tlibssh2_sftp_readdir_ex.3 \\\n\tlibssh2_sftp_readlink.3 \\\n\tlibssh2_sftp_realpath.3 \\\n\tlibssh2_sftp_rename.3 \\\n\tlibssh2_sftp_rename_ex.3 \\\n\tlibssh2_sftp_rewind.3 \\\n\tlibssh2_sftp_rmdir.3 \\\n\tlibssh2_sftp_rmdir_ex.3 \\\n\tlibssh2_sftp_seek.3 \\\n\tlibssh2_sftp_seek64.3 \\\n\tlibssh2_sftp_setstat.3 \\\n\tlibssh2_sftp_shutdown.3 \\\n\tlibssh2_sftp_stat.3 \\\n\tlibssh2_sftp_stat_ex.3 \\\n\tlibssh2_sftp_statvfs.3 \\\n\tlibssh2_sftp_symlink.3 \\\n\tlibssh2_sftp_symlink_ex.3 \\\n\tlibssh2_sftp_tell.3 \\\n\tlibssh2_sftp_tell64.3 \\\n\tlibssh2_sftp_unlink.3 \\\n\tlibssh2_sftp_unlink_ex.3 \\\n\tlibssh2_sftp_write.3 \\\n\tlibssh2_trace.3 \\\n\tlibssh2_trace_sethandler.3 \\\n\tlibssh2_userauth_authenticated.3 \\\n\tlibssh2_userauth_hostbased_fromfile.3 \\\n\tlibssh2_userauth_hostbased_fromfile_ex.3 \\\n\tlibssh2_userauth_keyboard_interactive.3 \\\n\tlibssh2_userauth_keyboard_interactive_ex.3 \\\n\tlibssh2_userauth_list.3 \\\n\tlibssh2_userauth_password.3 \\\n\tlibssh2_userauth_password_ex.3 \\\n\tlibssh2_userauth_publickey.3 \\\n\tlibssh2_userauth_publickey_fromfile.3 \\\n\tlibssh2_userauth_publickey_fromfile_ex.3 \\\n\tlibssh2_userauth_publickey_frommemory.3 \\\n\tlibssh2_version.3\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/TODO",
    "content": "Things TODO\n===========\n\n* Fix the numerous malloc+copy operations for sending data, see \"Buffering\n  Improvements\" below for details\n\n* make sure the windowing code adapts better to slow situations so that it\n  doesn't then use as much memory as today. Possibly by an app-controllable\n  \"Window mode\"?\n\n* Decrease the number of mallocs. Everywhere. Will get easier once the\n  buffering improvements have been done.\n\n* Use SO_NOSIGPIPE for Mac OS/BSD systems where MSG_NOSIGNAL doesn't\n  exist/work\n\n* Extend the test suite to actually test lots of aspects of libssh2\n\n* Fix all compiler warnings (some can't be done without API changes)\n\n* Expose error messages sent by the server\n\n* select() is troublesome with libssh2 when using multiple channels over\n  the same session. See \"New Transport API\" below for more details.\n\nAt next SONAME bump\n===================\n\n* stop using #defined macros as part of the official API. The macros should\n  either be turned into real functions or discarded from the API.\n\n* fix the parts of the API where object pointers and function pointers are\n  mixed like libssh2_session_callback_set()\n\n* remove the following functions from the API/ABI\n\n  libssh2_base64_decode()\n  libssh2_session_flag()\n  libssh2_channel_handle_extended_data()\n  libssh2_channel_receive_window_adjust()\n  libssh2_poll()\n  libssh2_poll_channel_read()\n  libssh2_session_startup() (libssh2_session_handshake() is the replacement)\n  libssh2_banner_set() (libssh2_session_banner_set() is the repacement)\n\n* Rename a few function:\n\n  libssh2_hostkey_hash => libssh2_session_hostkey_hash\n  libssh2_banner_set => libssh2_session_banner_set\n\n* change 'int' to 'libssh2_socket_t' in the public API for sockets.\n\n* Use 'size_t' for string lengths in all functions.\n\n* Add a comment field to struct libssh2_knownhost.\n\n* remove the existing libssh2_knownhost_add() function and rename\n  libssh2_knownhost_addc to become the new libssh2_knownhost_add instead\n\n* remove the existing libssh2_scp_send_ex() function and rename\n  libssh2_scp_send64 to become the new libssh2_scp_send instead.\n\n* remove the existing libssh2_knownhost_check() functin and rename\n  libssh2_knownhost_checkp() to become the new libssh2_knownhost_check instead\n\nBuffering Improvements\n======================\n\ntransport_write\n\n  - If this function gets called with a total packet size that is larger than\n  32K, it should create more than one SSH packet so that it keeps the largest\n  one below 32K\n\nsftp_write\n\n  - should not copy/allocate anything for the data, only create a header chunk\n  and pass on the payload data to channel_write \"pointed to\"\n\nNew Transport API\n=================\n\nTHE PROBLEM\n\nThe problem in a nutshell is that when an application opens up multiple\nchannels over a single session, those are all using the same socket. If the\napplication is then using select() to wait for traffic (like any sensible app\ndoes) and wants to act on the data when select() tells there is something to\nfor example read, what does an application do?\n\nWith our current API, you have to loop over all the channels and read from\nthem to see if they have data. This effectively makes blocking reads\nimpossible. If the app has many channels in a setup like this, it even becomes\nslow. (The original API had the libssh2_poll_channel_read() and libssh2_poll()\nto somewhat overcome this hurdle, but they too have pretty much the same\nproblems plus a few others.)\n\nTraffic in the other direction is similarly limited: the app has to try\nsending to all channels, even though some of them may very well not accept any\ndata at that point.\n\nA SOLUTION\n\nI suggest we introduce two new helper functions:\n\n libssh2_transport_read()\n\n - Read \"a bunch\" of data from the given socket and returns information to the\n   app about what channels that are now readable (ie they will not block when\n   read from). The function can be called over and over and it will repeatedly\n   return info about what channels that are readable at that moment.\n\n libssh2_transport_write()\n\n - Returns information about what channels that are writable, in the sense\n   that they have windows set from the remote side that allows data to get\n   sent. Writing to one of those channels will not block. Of course, the\n   underlying socket may only accept a certain amount of data, so at the first\n   short return, nothing more should be attempted to get sent until select()\n   (or equivalent) has been used on the master socket again.\n\nI haven't yet figured out a sensible API for how these functions should return\nthat info, but if we agree on the general principles I guess we can work that\nout.\n\nVOLUNTARY\n\n  I wanted to mention that these two helper functions would not be mandatory\n  in any way. They would just be there for those who want them, and existing\n  programs can remain using the old functions only if they prefer to.\n\nNew SFTP API\n============\n\nPURPOSE\n\n Provide API functions that explicitly tells at once that a (full) SFTP file\n transfer is wanted, to allow libssh2 to leverage on that knowledge to speed\n up things internally. It can for example do read ahead, buffer writes (merge\n small writes into larger chunks), better tune the SSH window and more. This\n sort of API is already provided for SCP transfers.\n\nAPI\n\n New functions:\n\n    LIBSSH2_SFTP_HANDLE *libssh2_sftp_send(SFTP_SESSION *sftp,\n                                           uint64_t filesize,\n                                           char *remote_path,\n                                           size_t remote_path_len,\n                                           long mode);\n\n Tell libssh2 that a local file with a given size is about to get sent to\n the SFTP server.\n\n    LIBSSH2_SFTP_HANDLE *libssh2_sftp_recv();\n\n Tell libssh2 that a remote file is requested to get downloaded from the SFTP\n server.\n\n Only the setup of the file transfer is different from an application's point\n of view. Depending on direction of the transfer(s), the following already\n existing functions should then be used until the transfer is complete:\n\n libssh2_sftp_read()\n libssh2_sftp_write()\n\nHOW TO USE\n\n 1. Setup the transfer using one of the two new functions.\n\n 2. Loop through the reading or writing of data.\n\n 3. Cleanup the transfer\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_agent_connect.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daiki Ueno\n.\\\"\n.TH libssh2_agent_connect 3 \"23 Dec 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_agent_connect - connect to an ssh-agent\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_agent_connect(LIBSSH2_AGENT *agent);\n.SH DESCRIPTION\nConnect to an ssh-agent running on the system.\n\nCall \\fBlibssh2_agent_disconnect(3)\\fP to close the connection after\nyou're doing using it.\n.SH RETURN VALUE\nReturns 0 if succeeded, or a negative value for error.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_agent_init(3)\n.BR libssh2_agent_disconnect(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_agent_disconnect.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daiki Ueno\n.\\\"\n.TH libssh2_agent_disconnect 3 \"23 Dec 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_agent_disconnect - close a connection to an ssh-agent\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_agent_disconnect(LIBSSH2_AGENT *agent);\n.SH DESCRIPTION\nClose a connection to an ssh-agent.\n\n.SH RETURN VALUE\nReturns 0 if succeeded, or a negative value for error.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_agent_connect(3)\n.BR libssh2_agent_free(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_agent_free.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daiki Ueno\n.\\\"\n.TH libssh2_agent_free 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_agent_free - free an ssh-agent handle\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid libssh2_agent_free(LIBSSH2_AGENT *agent);\n.SH DESCRIPTION\nFree an ssh-agent handle.  This function also frees the internal\ncollection of public keys.\n.SH RETURN VALUE\nNone.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_agent_init(3)\n.BR libssh2_agent_disconnect(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_agent_get_identity.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daiki Ueno\n.\\\"\n.TH libssh2_agent_get_identity 3 \"23 Dec 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_agent_get_identity - get a public key off the collection of public keys managed by ssh-agent\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_agent_get_identity(LIBSSH2_AGENT *agent,\n                               struct libssh2_agent_publickey **store,\n                               struct libssh2_agent_publickey *prev);\n.SH DESCRIPTION\n\\fIlibssh2_agent_get_identity(3)\\fP allows an application to iterate\nover all public keys in the collection managed by ssh-agent.\n\n\\fIstore\\fP should point to a pointer that gets filled in to point to the\npublic key data.\n\n\\fIprev\\fP is a pointer to a previous 'struct libssh2_agent_publickey'\nas returned by a previous invoke of this function, or NULL to get the\nfirst entry in the internal collection.\n.SH RETURN VALUE\nReturns 0 if everything is fine and information about a host was stored in\nthe \\fIstore\\fP struct.\n\nReturns 1 if it reached the end of public keys.\n\nReturns negative values for error\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_agent_list_identities(3)\n.BR libssh2_agent_userauth(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_agent_init.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daiki Ueno\n.\\\"\n.TH libssh2_agent_init 3 \"23 Dec 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_agent_init - init an ssh-agent handle\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_AGENT *libssh2_agent_init(LIBSSH2_SESSION *session);\n.SH DESCRIPTION\nInit an ssh-agent handle. Returns the handle to an internal\nrepresentation of an ssh-agent connection.  After the successful\ninitialization, an application can call \\fBlibssh2_agent_connect(3)\\fP\nto connect to a running ssh-agent.\n\nCall \\fBlibssh2_agent_free(3)\\fP to free the handle again after you're\ndoing using it.\n.SH RETURN VALUE\nReturns a handle pointer or NULL if something went wrong. The returned handle\nis used as input to all other ssh-agent related functions libssh2 provides.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_agent_connect(3)\n.BR libssh2_agent_free(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_agent_list_identities.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daiki Ueno\n.\\\"\n.TH libssh2_agent_list_identities 3 \"23 Dec 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_agent_list_identities - request an ssh-agent to list of public keys.\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_agent_list_identities(LIBSSH2_AGENT *agent);\n.SH DESCRIPTION\nRequest an ssh-agent to list of public keys, and stores them in the\ninternal collection of the handle.  Call\n\\fIlibssh2_agent_get_identity(3)\\fP to get a public key off the\ncollection.\n\n.SH RETURN VALUE\nReturns 0 if succeeded, or a negative value for error.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_agent_connect(3)\n.BR libssh2_agent_get_identity(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_agent_userauth.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daiki Ueno\n.\\\"\n.TH libssh2_agent_userauth 3 \"23 Dec 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_agent_userauth - authenticate a session with a public key, with the help of ssh-agent\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_agent_userauth(LIBSSH2_AGENT *agent,\n                           const char *username,\n                           struct libssh2_agent_publickey *identity);\n.SH DESCRIPTION\n\\fIagent\\fP - ssh-agent handle as returned by \n.BR libssh2_agent_init(3)\n\n\\fIusername\\fP - Remote user name to authenticate as.\n\n\\fIidentity\\fP - Public key to authenticate with, as returned by \n.BR libssh2_agent_get_identity(3)\n\nAttempt public key authentication with the help of ssh-agent.\n.SH RETURN VALUE\nReturns 0 if succeeded, or a negative value for error.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_agent_init(3)\n.BR libssh2_agent_get_identity(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_banner_set.3",
    "content": ".TH libssh2_banner_set 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_banner_set - set the SSH protocol banner for the local client\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_banner_set(LIBSSH2_SESSION *session, const char *banner);\n\n.SH DESCRIPTION\nThis function is \\fBDEPRECATED\\fP. Use \\fIlibssh2_session_banner_set(3)\\fP\ninstead!\n\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIbanner\\fP - A pointer to a user defined banner\n\nSet the banner that will be sent to the remote host when the SSH session is \nstarted with \n.BR libssh2_session_handshake(3)\n  This is optional; a banner corresponding to the protocol and libssh2 version will be sent by default.\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH AVAILABILITY\nMarked as deprecated since 1.4.0\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n.SH SEE ALSO\n.BR libssh2_session_handshake(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_base64_decode.3",
    "content": ".TH libssh2_base64_decode 3 \"23 Dec 2008\" \"libssh2 1.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_base64_decode - decode a base64 encoded string\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_base64_decode(LIBSSH2_SESSION *session, char **dest,\n                          unsigned int *dest_len, const char *src,\n                          unsigned int src_len);\n.SH DESCRIPTION\nThis function is deemed DEPRECATED and will be removed from libssh2 in a\nfuture version. Don't use it!\n\nDecode a base64 chunk and store it into a newly allocated buffer. 'dest_len'\nwill be set to hold the length of the returned buffer that '*dest' will point\nto.\n\nThe returned buffer is allocated by this function, but it is not clear how to\nfree that memory!\n.SH BUGS\nThe memory that *dest points to is allocated by the malloc function libssh2\nuses, but there's no way for an application to free this data in a safe and\nreliable way!\n.SH RETURN VALUE\n0 if successful, \\-1 if any error occurred.\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_close.3",
    "content": ".TH libssh2_channel_close 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_close - close a channel\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_close(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\n\\fIchannel\\fP - active channel stream to set closed status on.\n\nClose an active data channel. In practice this means sending an SSH_MSG_CLOSE \npacket to the remote host which serves as instruction that no further data \nwill be sent to it. The remote host may still send data back until it sends \nits own close message in response. To wait for the remote end to close its \nconnection as well, follow this command with \n.BR libssh2_channel_wait_closed(3)\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_direct_tcpip.3",
    "content": ".TH libssh2_channel_direct_tcpip 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_direct_tcpip - convenience macro for \\fIlibssh2_channel_direct_tcpip_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_channel_direct_tcpip(LIBSSH2_SESSION *session, const char *host, int port);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_direct_tcpip_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_direct_tcpip_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_direct_tcpip_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_direct_tcpip_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_direct_tcpip_ex.3",
    "content": ".TH libssh2_channel_direct_tcpip_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_direct_tcpip_ex - Tunnel a TCP connection through an SSH session\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL * \nlibssh2_channel_direct_tcpip_ex(LIBSSH2_SESSION *session, const char *host, int port, const char *shost, int sport);\n\nLIBSSH2_CHANNEL * \nlibssh2_channel_direct_tcpip(LIBSSH2_SESSION *session, const char *host, int port);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIhost\\fP - Third party host to connect to using the SSH host as a proxy.\n\n\\fIport\\fP - Port on third party host to connect to.\n\n\\fIshost\\fP - Host to tell the SSH server the connection originated on.\n\n\\fIsport\\fP - Port to tell the SSH server the connection originated from.\n\nTunnel a TCP/IP connection through the SSH transport via the remote host to \na third party. Communication from the client to the SSH server remains \nencrypted, communication from the server to the 3rd party host travels \nin cleartext.\n\n.SH RETURN VALUE\nPointer to a newly allocated LIBSSH2_CHANNEL instance, or NULL on errors.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_eof.3",
    "content": ".TH libssh2_channel_eof 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_eof - check a channel's EOF status\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_eof(LIBSSH2_CHANNEL *channel);\n.SH DESCRIPTION\n\\fIchannel\\fP - active channel stream to set closed status on.\n\nCheck if the remote host has sent an EOF status for the selected stream.\n.SH RETURN VALUE\nReturns 1 if the remote host has sent EOF, otherwise 0. Negative on\nfailure.\n.SH SEE ALSO\n.BR libssh2_channel_close(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_exec.3",
    "content": ".TH libssh2_channel_exec 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_exec - convenience macro for \\fIlibssh2_channel_process_startup(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_exec(LIBSSH2_CHANNEL *channel, const char *command);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_process_startup(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_process_startup(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_process_startup(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_process_startup(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_flush.3",
    "content": ".TH libssh2_channel_flush 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_flush - convenience macro for \\fIlibssh2_channel_flush_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_flush(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_flush_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_flush_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_flush_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_flush_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_flush_ex.3",
    "content": ".TH libssh2_channel_flush_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_flush_ex - flush a channel\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_flush_ex(LIBSSH2_CHANNEL *channel, int streamid);\n\nint \nlibssh2_channel_flush(LIBSSH2_CHANNEL *channel);\n\nint \nlibssh2_channel_flush_stderr(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\n\\fIchannel\\fP - Active channel stream to flush.\n\n\\fIstreamid\\fP - Specific substream number to flush. Groups of substreams may \nbe flushed by passing on of the following Constants.\n.br\n\\fBLIBSSH2_CHANNEL_FLUSH_EXTENDED_DATA\\fP: Flush all extended data substreams\n.br\n\\fBLIBSSH2_CHANNEL_FLUSH_ALL\\fP: Flush all substreams\n\nFlush the read buffer for a given channel instance. Individual substreams may \nbe flushed by number or using one of the provided macros.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_flush_stderr.3",
    "content": ".TH libssh2_channel_flush_stderr 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_flush_stderr - convenience macro for \\fIlibssh2_channel_flush_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_flush_stderr(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_flush_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_flush_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_flush_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_flush_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_forward_accept.3",
    "content": ".TH libssh2_channel_forward_accept 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_forward_accept - accept a queued connection\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_channel_forward_accept(LIBSSH2_LISTENER *listener);\n\n.SH DESCRIPTION\n\\fIlistener\\fP is a forwarding listener instance as returned by\n\\fBlibssh2_channel_forward_listen_ex(3)\\fP.\n.SH RETURN VALUE\nA newly allocated channel instance or NULL on failure.\n.SH ERRORS\nWhen this function returns NULL use \\fIlibssh2_session_last_errno(3)\\fP to\nextract the error code. If that code is \\fILIBSSH2_ERROR_EAGAIN\\fP, the\nsession is set to do non-blocking I/O but the call would block.\n.SH SEE ALSO\n.BR libssh2_channel_forward_listen_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_forward_cancel.3",
    "content": ".TH libssh2_channel_forward_cancel 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_forward_cancel - cancel a forwarded TCP port\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_forward_cancel(LIBSSH2_LISTENER *listener);\n\n.SH DESCRIPTION\n\\fIlistener\\fP - Forwarding listener instance as returned by \n.BR libssh2_channel_forward_listen_ex(3)\n\nInstruct the remote host to stop listening for new connections on a previously requested host/port.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n.SH SEE ALSO\n.BR libssh2_channel_forward_listen_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_forward_listen.3",
    "content": ".TH libssh2_channel_forward_listen 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_forward_listen - convenience macro for \\fIlibssh2_channel_forward_listen_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_forward_listen(LIBSSH2_SESSION *session, int port);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_forward_listen_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_forward_listen_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_forward_listen_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_forward_listen_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_forward_listen_ex.3",
    "content": ".TH libssh2_channel_forward_listen_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_forward_listen_ex - listen to inbound connections\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_LISTENER * \nlibssh2_channel_forward_listen_ex(LIBSSH2_SESSION *session, char *host, int port, int *bound_port, int queue_maxsize);\n\nLIBSSH2_LISTENER * \nlibssh2_channel_forward_listen(LIBSSH2_SESSION *session, int port);\n\n.SH DESCRIPTION\nInstruct the remote SSH server to begin listening for inbound TCP/IP\nconnections. New connections will be queued by the library until accepted by\n\\fIlibssh2_channel_forward_accept(3)\\fP.\n\n\\fIsession\\fP - instance as returned by libssh2_session_init(). \n\n\\fIhost\\fP - specific address to bind to on the remote host. Binding to\n0.0.0.0 (default when NULL is passed) will bind to all available addresses.\n\n\\fIport\\fP - port to bind to on the remote host. When 0 is passed, the remote\nhost will select the first available dynamic port.\n\n\\fIbound_port\\fP - Populated with the actual port bound on the remote\nhost. Useful when requesting dynamic port numbers.\n\n\\fIqueue_maxsize\\fP - Maximum number of pending connections to queue before\nrejecting further attempts.\n\n\\fIlibssh2_channel_forward_listen(3)\\fP is a macro.\n.SH RETURN VALUE\nA newly allocated LIBSSH2_LISTENER instance or NULL on failure.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP - An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_PROTO\\fP - An invalid SSH protocol response was received on the socket.\n\n\\fILIBSSH2_ERROR_REQUEST_DENIED\\fP - The remote server refused the request.\n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would block.\n.SH SEE ALSO\n.BR libssh2_channel_forward_accept(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_free.3",
    "content": ".TH libssh2_channel_free 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_free - free all resources associated with a channel\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_free(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\n\\fIchannel\\fP - Channel stream to free.\n\nRelease all resources associated with a channel stream. If the channel has \nnot yet been closed with \n.BR libssh2_channel_close(3)\n, it will be called automatically so that the remote end may know that it \ncan safely free its own resources.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH SEE ALSO\n.BR libssh2_channel_close(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_get_exit_signal.3",
    "content": ".TH libssh2_channel_get_exit_signal 3 \"4 Oct 2010\" \"libssh2 1.2.8\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_get_exit_signal - get the remote exit signal\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_get_exit_signal(LIBSSH2_CHANNEL *channel, char **exitsignal, size_t *exitsignal_len, char **errmsg, size_t *errmsg_len, char **langtag, size_t *langtag_len);\n\n.SH DESCRIPTION\n\\fIchannel\\fP - Closed channel stream to retrieve exit signal from.\n\n\\fIexitsignal\\fP - If not NULL, is populated by reference with the exit signal\n(without leading \"SIG\"). Note that the string is stored in a newly allocated\nbuffer. If the remote program exited cleanly, the referenced string pointer\nwill be set to NULL. \n\n\\fIexitsignal_len\\fP - If not NULL, is populated by reference with the length\nof exitsignal. \n\n\\fIerrmsg\\fP - If not NULL, is populated by reference with the error message\n(if provided by remote server, if not it will be set to NULL). Note that the\nstring is stored in a newly allocated buffer.\n\n\\fIerrmsg_len\\fP - If not NULL, is populated by reference with the length of errmsg.\n\n\\fIlangtag\\fP - If not NULL, is populated by reference with the language tag \n(if provided by remote server, if not it will be set to NULL). Note that the\nstring is stored in a newly allocated buffer.\n\n\\fIlangtag_len\\fP - If not NULL, is populated by reference with the length of langtag.\n\n.SH RETURN VALUE\nNumeric error code corresponding to the the Error Code constants.\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_get_exit_status.3",
    "content": ".TH libssh2_channel_get_exit_status 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_get_exit_status - get the remote exit code\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_get_exit_status(LIBSSH2_CHANNEL* channel)\n\n.SH DESCRIPTION\n\\fIchannel\\fP - Closed channel stream to retrieve exit status from.\n\nReturns the exit code raised by the process running on the remote host at \nthe other end of the named channel. Note that the exit status may not be \navailable if the remote end has not yet set its status to closed.\n\n.SH RETURN VALUE\nReturns 0 on failure, otherwise the \\fIExit Status\\fP reported by remote host\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_handle_extended_data.3",
    "content": ".TH libssh2_channel_handle_extended_data 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_handle_extended_data - set extended data handling mode\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid \nlibssh2_channel_handle_extended_data(LIBSSH2_CHANNEL *channel, int ignore_mode);\n\n.SH DESCRIPTION\nThis function is deprecated. Use the\n\\fIlibssh2_channel_handle_extended_data2(3)\\fP function instead!\n\n\\fIchannel\\fP - Active channel stream to change extended data handling on.\n\n\\fIignore_mode\\fP - One of the three LIBSSH2_CHANNEL_EXTENDED_DATA_* Constants.\n.br\n\\fBLIBSSH2_CHANNEL_EXTENDED_DATA_NORMAL\\fP: Queue extended data for eventual \nreading\n.br\n\\fBLIBSSH2_CHANNEL_EXTENDED_DATA_MERGE\\fP: Treat extended data and ordinary\ndata the same. Merge all substreams such that calls to\n\\fIlibssh2_channel_read(3)\\fP will pull from all substreams on a\nfirst-in/first-out basis.\n.br\n\\fBLIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE\\fP: Discard all extended data as it \narrives.\n\nChange how a channel deals with extended data packets. By default all extended\ndata is queued until read by \\fIlibssh2_channel_read_ex(3)\\fP\n.SH RETURN VALUE\nNone.\n.SH SEE ALSO\n.BR libssh2_channel_handle_extended_data2(3)\n.BR libssh2_channel_read_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_handle_extended_data2.3",
    "content": ".TH libssh2_channel_handle_extended_data2 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_handle_extended_data2 - set extended data handling mode\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_handle_extended_data2(LIBSSH2_CHANNEL *channel, int ignore_mode);\n\n.SH DESCRIPTION\n\\fIchannel\\fP - Active channel stream to change extended data handling on.\n\n\\fIignore_mode\\fP - One of the three LIBSSH2_CHANNEL_EXTENDED_DATA_* Constants.\n.br\n\\fBLIBSSH2_CHANNEL_EXTENDED_DATA_NORMAL\\fP: Queue extended data for eventual \nreading\n.br\n\\fBLIBSSH2_CHANNEL_EXTENDED_DATA_MERGE\\fP: Treat extended data and ordinary \ndata the same. Merge all substreams such that calls to \n.BR libssh2_channel_read(3)\nwill pull from all substreams on a first-in/first-out basis.\n.br\n\\fBLIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE\\fP: Discard all extended data as it \narrives.\n\nChange how a channel deals with extended data packets. By default all \nextended data is queued until read by \n.BR libssh2_channel_read_ex(3)\n\n.SH RETURN VALUE\nReturn 0 on success or LIBSSH2_ERROR_EAGAIN when it would otherwise block.\n\n.SH SEE ALSO\n.BR libssh2_channel_handle_extended_data(3)\n.BR libssh2_channel_read_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_ignore_extended_data.3",
    "content": ".TH libssh2_channel_ignore_extended_data 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_ignore_extended_data - convenience macro for \\fIlibssh2_channel_handle_extended_data(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nlibssh2_channel_ignore_extended_data(arguments)\n\n.SH DESCRIPTION\nThis function is deprecated. Use the\n\\fIlibssh2_channel_handle_extended_data2(3)\\fP function instead!\n\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_handle_extended_data(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_handle_extended_data(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_handle_extended_data(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_handle_extended_data(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_open_ex.3",
    "content": ".TH libssh2_channel_open_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_open_ex - establish a generic session channel\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_channel_open_ex(LIBSSH2_SESSION *session, const char *channel_type, unsigned int channel_type_len, unsigned int window_size, unsigned int packet_size, const char *message, unsigned int message_len);\n\nLIBSSH2_CHANNEL *\nlibssh2_channel_open_session(session);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIchannel_type\\fP - Channel type to open. Typically one of session, \ndirect-tcpip, or tcpip-forward. The SSH2 protocol allowed for additional \ntypes including local, custom channel types.\n\n\\fIchannel_type_len\\fP - Length of channel_type\n\n\\fIwindow_size\\fP - Maximum amount of unacknowledged data remote host is \nallowed to send before receiving an SSH_MSG_CHANNEL_WINDOW_ADJUST packet.\n\n\\fIpacket_size\\fP - Maximum number of bytes remote host is allowed to send \nin a single SSH_MSG_CHANNEL_DATA or SSG_MSG_CHANNEL_EXTENDED_DATA packet.\n\n\\fImessage\\fP - Additional data as required by the selected channel_type.\n\n\\fImessage_len\\fP - Length of message parameter.\n\nAllocate a new channel for exchanging data with the server. This method is \ntypically called through its macroized form: \n.BR libssh2_channel_open_session(3)\nor via \n.BR libssh2_channel_direct_tcpip(3)\nor\n.BR libssh2_channel_forward_listen(3)\n\n.SH RETURN VALUE\nPointer to a newly allocated LIBSSH2_CHANNEL instance, or NULL on errors.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_CHANNEL_FAILURE\\fP - \n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would block.\n\n.SH SEE ALSO\nAdd related functions\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_open_session.3",
    "content": ".TH libssh2_channel_open_session 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_open_session - convenience macro for \\fIlibssh2_channel_open_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_channel_open_session(LIBSSH2_SESSION *session);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_open_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_open_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_open_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_process_startup.3",
    "content": ".TH libssh2_channel_process_startup 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_process_startup - request a shell on a channel\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nint libssh2_channel_process_startup(LIBSSH2_CHANNEL *channel,\n                                    const char *request,\n                                    unsigned int request_len,\n                                    const char *message,\n                                    unsigned int message_len);\n.SH DESCRIPTION\n\\fIchannel\\fP - Active session channel instance.\n\n\\fIrequest\\fP - Type of process to startup. The SSH2 protocol currently \ndefines shell, exec, and subsystem as standard process services.\n\n\\fIrequest_len\\fP - Length of request parameter.\n\n\\fImessage\\fP - Request specific message data to include.\n\n\\fImessage_len\\fP - Length of message parameter.\n\nInitiate a request on a session type channel such as returned by \n.BR libssh2_channel_open_ex(3)\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_CHANNEL_REQUEST_DENIED\\fP - \n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_read.3",
    "content": ".TH libssh2_channel_read 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_read - convenience macro for \\fIlibssh2_channel_read_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nssize_t libssh2_channel_read(LIBSSH2_CHANNEL *channel, char *buf, size_t buflen);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_read_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_read_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_read_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_read_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_read_ex.3",
    "content": ".TH libssh2_channel_read_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_read_ex - read data from a channel stream\n.SH SYNOPSIS\n#include <libssh2.h>\n\nssize_t\nlibssh2_channel_read_ex(LIBSSH2_CHANNEL *channel, int stream_id, char *buf, size_t buflen);\n\nssize_t\nlibssh2_channel_read(LIBSSH2_CHANNEL *channel, char *buf, size_t buflen);\n\nssize_t\nlibssh2_channel_read_stderr(LIBSSH2_CHANNEL *channel, char *buf, size_t buflen);\n\n.SH DESCRIPTION\nAttempt to read data from an active channel stream. All channel streams have\none standard I/O substream (stream_id == 0), and may have up to 2^32 extended\ndata streams as identified by the selected \\fIstream_id\\fP. The SSH2 protocol\ncurrently defines a stream ID of 1 to be the stderr substream.\n\n\\fIchannel\\fP - active channel stream to read from. \n\n\\fIstream_id\\fP - substream ID number (e.g. 0 or SSH_EXTENDED_DATA_STDERR) \n\n\\fIbuf\\fP - pointer to storage buffer to read data into\n\n\\fIbuflen\\fP - size of the buf storage\n\n\\fIlibssh2_channel_read(3)\\fP and \\fIlibssh2_channel_read_stderr(3)\\fP are\nmacros.\n.SH RETURN VALUE\nActual number of bytes read or negative on failure. It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\nNote that a return value of zero (0) can in fact be a legitimate value and\nonly signals that no payload data was read. It is not an error.\n.SH ERRORS\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_CHANNEL_CLOSED\\fP - The channel has been closed.\n\n.SH SEE ALSO\n.BR libssh2_poll_channel_read(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_read_stderr.3",
    "content": ".TH libssh2_channel_read_stderr 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_read_stderr - convenience macro for \\fIlibssh2_channel_read_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nssize_t libssh2_channel_read_stderr(LIBSSH2_CHANNEL *channel, char *buf, size_t buflen);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_read_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_read_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_read_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_read_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_receive_window_adjust.3",
    "content": ".TH libssh2_channel_receive_window_adjust 3 \"15 Mar 2009\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_receive_window_adjust - adjust the channel window\n.SH SYNOPSIS\n#include <libssh2.h>\n\nunsigned long\nlibssh2_channel_receive_window_adjust(LIBSSH2_CHANNEL * channel,\n                                      unsigned long adjustment,\n                                      unsigned char force);\n\n.SH DESCRIPTION\nThis function is deprecated in 1.1. Use\n\\fIlibssh2_channel_receive_window_adjust2(3)\\fP!\n\nAdjust the receive window for a channel by adjustment bytes. If the amount to\nbe adjusted is less than LIBSSH2_CHANNEL_MINADJUST and force is 0 the\nadjustment amount will be queued for a later packet.\n.SH RETURN VALUE\nReturns the new size of the receive window (as understood by remote end). Note\nthat the window value sent over the wire is strictly 32bit, but this API is\nmade to return a 'long' which may not be 32 bit on all platforms.\n.SH ERRORS\nIn 1.0 and earlier, this function returns LIBSSH2_ERROR_EAGAIN for\nnon-blocking channels where it would otherwise block. However, that is a\nnegative number and this function only returns an unsigned value and this then\nleads to a very strange value being returned.\n.SH SEE ALSO\n.BR libssh2_channel_window_read_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_receive_window_adjust2.3",
    "content": ".TH libssh2_channel_receive_window_adjust2 3 \"26 Mar 2009\" \"libssh2 1.1\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_receive_window_adjust2 - adjust the channel window\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_channel_receive_window_adjust2(LIBSSH2_CHANNEL * channel,\n                                       unsigned long adjustment,\n                                       unsigned char force,\n                                       unsigned int *window);\n\n.SH DESCRIPTION\nAdjust the receive window for a channel by adjustment bytes. If the amount to\nbe adjusted is less than LIBSSH2_CHANNEL_MINADJUST and force is 0 the\nadjustment amount will be queued for a later packet.\n\nThis function stores the new size of the receive window (as understood by\nremote end) in the variable 'window' points to.\n.SH RETURN VALUE\nReturn 0 on success and a negative value on error. If used in non-blocking\nmode it will return LIBSSH2_ERROR_EAGAIN when it would otherwise block.\n.SH ERRORS\n.SH AVAILABILITY\nAdded in libssh2 1.1 since the previous API has deficiencies.\n.SH SEE ALSO\n.BR libssh2_channel_window_read_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_request_pty.3",
    "content": ".TH libssh2_channel_request_pty 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_request_pty - convenience macro for \\fIlibssh2_channel_request_pty_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_request_pty(LIBSSH2_SESSION *session, const char *term);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_request_pty_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_request_pty_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_request_pty_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_request_pty_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_request_pty_ex.3",
    "content": ".TH libssh2_channel_request_pty_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_request_pty_ex - short function description\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_request_pty_ex(LIBSSH2_CHANNEL *channel, const char *term, unsigned int term_len, const char *modes, unsigned int modes_len, int width, int height, int width_px, int height_px);\n\nint \nlibssh2_channel_request_pty(LIBSSH2_CHANNEL *channel, char *term);\n\n.SH DESCRIPTION\n\\fIchannel\\fP - Previously opened channel instance such as returned by \n.BR libssh2_channel_open_ex(3)\n\n\\fIterm\\fP - Terminal emulation (e.g. vt102, ansi, etc...)\n\n\\fIterm_len\\fP - Length of term parameter\n\n\\fImodes\\fP - Terminal mode modifier values\n\n\\fImodes_len\\fP - Length of modes parameter.\n\n\\fIwidth\\fP - Width of pty in characters\n\n\\fIheight\\fP - Height of pty in characters\n\n\\fIwidth_px\\fP - Width of pty in pixels\n\n\\fIheight_px\\fP - Height of pty in pixels\n\nRequest a PTY on an established channel. Note that this does not make sense \nfor all channel types and may be ignored by the server despite returning \nsuccess.\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_CHANNEL_REQUEST_DENIED\\fP - \n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_request_pty_size.3",
    "content": ".TH libssh2_channel_request_pty_size 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_request_pty_size - convenience macro for \\fIlibssh2_channel_request_pty_size_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_request_pty_size(LIBSSH2_CHANNEL *channel, int width, int height);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_request_pty_size_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_request_pty_size_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_request_pty_size_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_request_pty_size_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_request_pty_size_ex.3",
    "content": ".TH libssh2_channel_request_pty_size_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_request_pty_size_ex - TODO\n.SH SYNOPSIS\n\n.SH DESCRIPTION\n\n.SH RETURN VALUE\n\n.SH ERRORS\n\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_send_eof.3",
    "content": ".TH libssh2_channel_send_eof 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_send_eof - send EOF to remote server\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_send_eof(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\nTell the remote host that no further data will be sent on the specified \nchannel. Processes typically interpret this as a closed stdin descriptor.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n.SH SEE ALSO\n.BR libssh2_channel_wait_eof(3)\n.BR libssh2_channel_eof(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_set_blocking.3",
    "content": ".TH libssh2_channel_set_blocking 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_set_blocking - set or clear blocking mode on channel\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid \nlibssh2_channel_set_blocking(LIBSSH2_CHANNEL *channel, int blocking);\n.SH DESCRIPTION\n\\fIchannel\\fP - channel stream to set or clean blocking status on.\n\n\\fIblocking\\fP - Set to a non-zero value to make the channel block, or zero to\nmake it non-blocking.\n\nCurrently this is just a short cut call to \n.BR libssh2_session_set_blocking(3)\nand therefore will affect the session and all channels.\n.SH RETURN VALUE\nNone\n.SH SEE ALSO\n.BR libssh2_session_set_blocking(3)\n.BR libssh2_channel_read_ex(3)\n.BR libssh2_channel_write_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_setenv.3",
    "content": ".TH libssh2_channel_setenv 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_setenv - convenience macro for \\fIlibssh2_channel_setenv_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_setenv(LIBSSH2_CHANNEL *channel, const char *varname, const char *value);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_setenv_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_setenv_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_setenv_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_setenv_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_setenv_ex.3",
    "content": ".TH libssh2_channel_setenv_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_setenv_ex - set an environment variable on the channel\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_channel_setenv_ex(LIBSSH2_CHANNEL *channel, char *varname, unsigned int varname_len, const char *value, unsigned int value_len);\n\nint\nlibssh2_channel_setenv(LIBSSH2_CHANNEL *channel, char *varname, const char *value);\n\n.SH DESCRIPTION\n\\fIchannel\\fP - Previously opened channel instance such as returned by \n.BR libssh2_channel_open_ex(3)\n\n\\fIvarname\\fP - Name of environment variable to set on the remote \nchannel instance.\n\n\\fIvarname_len\\fP - Length of passed varname parameter.\n\n\\fIvalue\\fP - Value to set varname to.\n\n\\fIvalue_len\\fP - Length of value parameter.\n\nSet an environment variable in the remote channel's process space. Note that\nthis does not make sense for all channel types and may be ignored by the\nserver despite returning success.\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_CHANNEL_REQUEST_DENIED\\fP - \n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_shell.3",
    "content": ".TH libssh2_channel_shell 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_shell - convenience macro for \\fIlibssh2_channel_process_startup(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_shell(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_process_startup(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_process_startup(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_process_startup(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_process_startup(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_subsystem.3",
    "content": ".TH libssh2_channel_subsystem 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_subsystem - convenience macro for \\fIlibssh2_channel_process_startup(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_subsystem(LIBSSH2_CHANNEL *channel, const char *subsystem);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_process_startup(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_process_startup(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_process_startup(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_process_startup(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_wait_closed.3",
    "content": ".TH libssh2_channel_wait_closed 3 \"29 Nov 2007\" \"libssh2 0.19\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_wait_closed - wait for the remote to close the channel\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_wait_closed(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\nEnter a temporary blocking state until the remote host closes the named\nchannel. Typically sent after \\fIlibssh2_channel_close(3)\\fP in order to\nexamine the exit status.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure. It returns LIBSSH2_ERROR_EAGAIN\nwhen it would otherwise block. While LIBSSH2_ERROR_EAGAIN is a negative\nnumber, it isn't really a failure per se.\n.SH SEE ALSO\n.BR libssh2_channel_send_eof(3)\n.BR libssh2_channel_eof(3)\n.BR libssh2_channel_wait_eof(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_wait_eof.3",
    "content": ".TH libssh2_channel_wait_eof 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_wait_eof - wait for the remote to reply to an EOF request\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_wait_eof(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\nWait for the remote end to acknowledge an EOF request.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure. It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH SEE ALSO\n.BR libssh2_channel_send_eof(3)\n.BR libssh2_channel_eof(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_window_read.3",
    "content": ".TH libssh2_channel_window_read 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_window_read - convenience macro for \\fIlibssh2_channel_window_read_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nunsigned long libssh2_channel_window_read(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_window_read_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_window_read_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_window_read_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_window_read_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_window_read_ex.3",
    "content": ".TH libssh2_channel_window_read_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_window_read_ex - Check the status of the read window\n.SH SYNOPSIS\n#include <libssh2.h>\n\nunsigned long\nlibssh2_channel_window_read_ex(LIBSSH2_CHANNEL *channel,\n                               unsigned long *read_avail,\n                               unsigned long *window_size_initial)\n.SH DESCRIPTION\nCheck the status of the read window. Returns the number of bytes which the\nremote end may send without overflowing the window limit read_avail (if\npassed) will be populated with the number of bytes actually available to be\nread window_size_initial (if passed) will be populated with the\nwindow_size_initial as defined by the channel_open request\n.SH RETURN VALUE\nThe number of bytes which the remote end may send without overflowing the\nwindow limit\n.SH ERRORS\n\n.SH SEE ALSO\n.BR libssh2_channel_receive_window_adjust(3),\n.BR libssh2_channel_window_write_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_window_write.3",
    "content": ".TH libssh2_channel_window_write 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_window_write - convenience macro for \\fIlibssh2_channel_window_write_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nunsigned long libssh2_channel_window_write(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_window_write_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_window_write_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_window_write_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_window_write_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_window_write_ex.3",
    "content": ".TH libssh2_channel_window_write_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_window_write_ex - Check the status of the write window\n.SH SYNOPSIS\n#include <libssh2.h>\n\nunsigned long\nlibssh2_channel_window_write_ex(LIBSSH2_CHANNEL *channel,\n                                unsigned long *window_size_initial)\n.SH DESCRIPTION\nCheck the status of the write window Returns the number of bytes which may be\nsafely written on the channel without blocking. 'window_size_initial' (if\npassed) will be populated with the size of the initial window as defined by\nthe channel_open request\n.SH RETURN VALUE\nNumber of bytes which may be safely written on the channel without blocking.\n.SH ERRORS\n\n.SH SEE ALSO\n.BR libssh2_channel_window_read_ex(3),\n.BR libssh2_channel_receive_window_adjust(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_write.3",
    "content": ".TH libssh2_channel_write 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_write - convenience macro for \\fIlibssh2_channel_write_ex(3)\\fP\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nssize_t libssh2_channel_write(LIBSSH2_CHANNEL *channel, const char *buf, size_t buflen);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_write_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_write_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_write_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_write_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_write_ex.3",
    "content": ".TH libssh2_channel_write_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_write_ex - write data to a channel stream blocking\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nssize_t libssh2_channel_write_ex(LIBSSH2_CHANNEL *channel,\n                                 int stream_id, char *buf,\n                                 size_t buflen);\n.SH DESCRIPTION\nWrite data to a channel stream. All channel streams have one standard I/O\nsubstream (stream_id == 0), and may have up to 2^32 extended data streams as\nidentified by the selected \\fIstream_id\\fP. The SSH2 protocol currently\ndefines a stream ID of 1 to be the stderr substream.\n\n\\fIchannel\\fP - active channel stream to write to. \n\n\\fIstream_id\\fP - substream ID number (e.g. 0 or SSH_EXTENDED_DATA_STDERR) \n\n\\fIbuf\\fP - pointer to buffer to write\n\n\\fIbuflen\\fP - size of the data to write\n\n\\fIlibssh2_channel_write(3)\\fP and \\fIlibssh2_channel_write_stderr(3)\\fP are\nconvenience macros for this function.\n\n\\fIlibssh2_channel_write_ex(3)\\fP will use as much as possible of the buffer\nand put it into a single SSH protocol packet. This means that to get maximum\nperformance when sending larger files, you should try to always pass in at\nleast 32K of data to this function.\n.SH RETURN VALUE\nActual number of bytes written or negative on failure.\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP - An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_CHANNEL_CLOSED\\fP - The channel has been closed.\n\n\\fILIBSSH2_ERROR_CHANNEL_EOF_SENT\\fP - The channel has been requested to be\nclosed.\n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n.BR libssh2_channel_read_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_write_stderr.3",
    "content": ".TH libssh2_channel_write_stderr 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_write_stderr - convenience macro for \\fIlibssh2_channel_write_ex(3)\\fP\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nssize_t libssh2_channel_write_stderr(LIBSSH2_CHANNEL *channel, const char *buf, size_t buflen);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_write_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_write_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_write_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_write_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_x11_req.3",
    "content": ".TH libssh2_channel_x11_req 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_x11_req - convenience macro for \\fIlibssh2_channel_x11_req_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_x11_req(LIBSSH2_CHANNEL *channel, int screen_number);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_x11_req_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_x11_req_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_x11_req_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_x11_req_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_channel_x11_req_ex.3",
    "content": ".TH libssh2_channel_x11_req_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_x11_req_ex - request an X11 forwarding channel\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_channel_x11_req_ex(LIBSSH2_CHANNEL *channel, int single_connection, const char *auth_proto, const char *auth_cookie, int screen_number);\n\nint\nlibssh2_channel_x11_req(LIBSSH2_CHANNEL *channel, int screen_number);\n\n.SH DESCRIPTION\n\\fIchannel\\fP - Previously opened channel instance such as returned by \n.BR libssh2_channel_open_ex(3)\n\n\\fIsingle_connection\\fP - non-zero to only forward a single connection.\n\n\\fIauth_proto\\fP - X11 authentication protocol to use\n\n\\fIauth_cookie\\fP - the cookie (hexadecimal encoded).\n\n\\fIscreen_number\\fP - the XLL screen to forward\n\nRequest an X11 forwarding on \\fIchannel\\fP. To use X11 forwarding, \n.BR libssh2_session_callback_set(3)\nmust first be called to set \\fBLIBSSH2_CALLBACK_X11\\fP. This callback will be\ninvoked when the remote host accepts the X11 forwarding.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_CHANNEL_REQUEST_DENIED\\fP - \n\n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n.BR libssh2_session_callback_set(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_exit.3",
    "content": ".TH libssh2_exit 3 \"19 Mar 2010\" \"libssh2 1.2.5\" \"libssh2 manual\"\n.SH NAME\nlibssh2_exit - global library deinitialization\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid\nlibssh2_exit(void);\n.SH DESCRIPTION\nExit the libssh2 functions and free's all memory used internal.\n.SH AVAILABILITY\nAdded in libssh2 1.2.5\n.SH SEE ALSO\n.BR libssh2_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_free.3",
    "content": ".TH libssh2_exit 3 \"13 Oct 2010\" \"libssh2 1.2.8\" \"libssh2 manual\"\n.SH NAME\nlibssh2_free - deallocate libssh2 memory\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid\nlibssh2_free(LIBSSH2_SESSION *session, void *ptr);\n.SH DESCRIPTION\nDeallocate memory allocated by earlier call to libssh2 functions.  It\nuses the memory allocation callbacks provided by the application, if\nany.  Otherwise, this will just call free().\n\nThis function is mostly useful under Windows when libssh2 is linked to\none run-time library and the application to another.\n.SH AVAILABILITY\nAdded in libssh2 1.2.8\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_hostkey_hash.3",
    "content": ".TH libssh2_hostkey_hash 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_hostkey_hash - return a hash of the remote host's key\n.SH SYNOPSIS\n#include <libssh2.h>\n\nconst char *\nlibssh2_hostkey_hash(LIBSSH2_SESSION *session, int hash_type);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIhash_type\\fP - One of: \\fBLIBSSH2_HOSTKEY_HASH_MD5\\fP or \n\\fBLIBSSH2_HOSTKEY_HASH_SHA1\\fP.\n\nReturns the computed digest of the remote system's hostkey. The length of \nthe returned string is hash_type specific (e.g. 16 bytes for MD5, \n20 bytes for SHA1).\n.SH RETURN VALUE\nComputed hostkey hash value, or NULL if the information is not available\n(either the session has not yet been started up, or the requested hash\nalgorithm was not available). The hash consists of raw binary bytes, not hex\ndigits, so it is not directly printable.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_init.3",
    "content": ".TH libssh2_init 3 \"19 Mar 2010\" \"libssh2 1.2.5\" \"libssh2 manual\"\n.SH NAME\nlibssh2_init - global library initialization\n.SH SYNOPSIS\n#include <libssh2.h>\n\n#define LIBSSH2_INIT_NO_CRYPTO 0x0001\n\nint\nlibssh2_init(int flags);\n.SH DESCRIPTION\nInitialize the libssh2 functions.  This typically initialize the\ncrypto library.  It uses a global state, and is not thread safe -- you\nmust make sure this function is not called concurrently.\n.SH RETURN VALUE\nReturns 0 if succeeded, or a negative value for error.\n.SH AVAILABILITY\nAdded in libssh2 1.2.5\n.SH SEE ALSO\n.BR libssh2_exit(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_keepalive_config.3",
    "content": ".TH libssh2_keepalive_config 3 \"12 Apr 2011\" \"libssh2 1.2.5\" \"libssh2 manual\"\n.SH NAME\nlibssh2_keepalive_config - short function description\n.SH SYNOPSIS\n#include <libssh2.h>\n.nf\n\nvoid libssh2_keepalive_config(LIBSSH2_SESSION *session,\n                              int want_reply,\n                              unsigned interval);\n.fi\n.SH DESCRIPTION\nSet how often keepalive messages should be sent. \\fBwant_reply\\fP indicates\nwhether the keepalive messages should request a response from the server.\n\\fBinterval\\fP is number of seconds that can pass without any I/O, use 0 (the\ndefault) to disable keepalives.  To avoid some busy-loop corner-cases, if you\nspecify an interval of 1 it will be treated as 2.\n\nNote that non-blocking applications are responsible for sending the keepalive\nmessages using \\fBlibssh2_keepalive_send(3)\\fP.\n.SH RETURN VALUE\nNothing\n.SH AVAILABILITY\nAdded in libssh2 1.2.5\n.SH SEE ALSO\n.BR libssh2_keepalive_send(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_keepalive_send.3",
    "content": ".TH libssh2_keepalive_send 3 \"13 Apr 2011\" \"libssh2 1.2.5\" \"libssh2 manual\"\n.SH NAME\nlibssh2_keepalive_send - short function description\n.SH SYNOPSIS\n#include <libssh2.h>\n.nf\n\nint libssh2_keepalive_send(LIBSSH2_SESSION *session,\n                           int *seconds_to_next);\n.SH DESCRIPTION\nSend a keepalive message if needed.  \\fBseconds_to_next\\fP indicates how many\nseconds you can sleep after this call before you need to call it again.\n.SH RETURN VALUE\nReturns 0 on success, or LIBSSH2_ERROR_SOCKET_SEND on I/O errors.\n.SH AVAILABILITY\nAdded in libssh2 1.2.5\n.SH SEE ALSO\n.BR libssh2_keepalive_config(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_knownhost_add.3",
    "content": "\n.\\\" Copyright (c) 2009, 2010 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_add 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_add - add a known host\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nint libssh2_knownhost_add(LIBSSH2_KNOWNHOSTS *hosts,\n                          char *host, char *salt,\n                          char *key, size_t keylen,\n                          int typemask,\n                          struct libssh2_knownhost **store);\n.SH DESCRIPTION\nWe discourage use of this function as of libssh2 1.2.5. Instead we strongly\nurge users to use \\fIlibssh2_knownhost_addc(3)\\fP instead, which as a more\ncomplete API. \\fIlibssh2_knownhost_add(3)\\fP is subject for removal in a\nfuture release.\n\nAdds a known host to the collection of known hosts identified by the 'hosts'\nhandle.\n\n\\fIhost\\fP is a pointer the host name in plain text or hashed. If hashed, it\nmust be provided base64 encoded. The host name can be the IP numerical address\nof the host or the full name.\n\n\\fIsalt\\P is a pointer to the salt used for the host hashing, if the host is\nprovided hashed. If the host is provided in plain text, salt has no meaning.\nThe salt has to be provided base64 encoded with a trailing zero byte.\n\n\\fIkey\\fP is a pointer to the key for the given host.\n\n\\fIkeylen\\fP is the total size in bytes of the key pointed to by the \\fIkey\\fP\nargument\n\n\\fItypemask\\fP is a bitmask that specifies format and info about the data\npassed to this function. Specifically, it details what format the host name is,\nwhat format the key is and what key type it is.\n\nThe host name is given as one of the following types:\nLIBSSH2_KNOWNHOST_TYPE_PLAIN, LIBSSH2_KNOWNHOST_TYPE_SHA1 or\nLIBSSH2_KNOWNHOST_TYPE_CUSTOM.\n\nThe key is encoded using one of the following encodings:\nLIBSSH2_KNOWNHOST_KEYENC_RAW or LIBSSH2_KNOWNHOST_KEYENC_BASE64.\n\nThe key is using one of these algorithms:\nLIBSSH2_KNOWNHOST_KEY_RSA1, LIBSSH2_KNOWNHOST_KEY_SSHRSA or\nLIBSSH2_KNOWNHOST_KEY_SSHDSS.\n\n\\fIstore\\fP should point to a pointer that gets filled in to point to the\nknown host data after the addition. NULL can be passed if you don't care about\nthis pointer.\n.SH RETURN VALUE\nReturns a regular libssh2 error code, where negative values are error codes\nand 0 indicates success.\n.SH AVAILABILITY\nAdded in libssh2 1.2, deprecated since libssh2 1.2.5. Use\n\\fIlibssh2_knownhost_addc(3)\\fP instead!\n.SH SEE ALSO\n.BR libssh2_knownhost_init(3)\n.BR libssh2_knownhost_free(3)\n.BR libssh2_knownhost_check(3)\n.BR libssh2_knownhost_addc(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_knownhost_addc.3",
    "content": "\n.\\\" Copyright (c) 2009, 2010 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_add 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_add - add a known host\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_knownhost_addc(LIBSSH2_KNOWNHOSTS *hosts,\n                           char *host, char *salt,\n                           char *key, size_t keylen,\n                           const char *comment, size_t commentlen,\n                           int typemask,\n                           struct libssh2_knownhost **store);\n.SH DESCRIPTION\nAdds a known host to the collection of known hosts identified by the 'hosts'\nhandle.\n\n\\fIhost\\fP is a pointer the host name in plain text or hashed. If hashed, it\nmust be provided base64 encoded. The host name can be the IP numerical address\nof the host or the full name.\n\nIf you want to add a key for a specific port number for the given host, you\nmust provide the host name like '[host]:port' with the actual characters '['\nand ']' enclosing the host name and a colon separating the host part from the\nport number. For example: \\&\"[host.example.com]:222\".\n\n\\fIsalt\\fP is a pointer to the salt used for the host hashing, if the host is\nprovided hashed. If the host is provided in plain text, salt has no meaning.\nThe salt has to be provided base64 encoded with a trailing zero byte.\n\n\\fIkey\\fP is a pointer to the key for the given host.\n\n\\fIkeylen\\fP is the total size in bytes of the key pointed to by the \\fIkey\\fP\nargument\n\n\\fIcomment\\fP is a pointer to a comment for the key.\n\n\\fIcommentlen\\fP is the total size in bytes of the comment pointed to by the \\fIcomment\\fP argument\n\n\\fItypemask\\fP is a bitmask that specifies format and info about the data\npassed to this function. Specifically, it details what format the host name is,\nwhat format the key is and what key type it is.\n\nThe host name is given as one of the following types:\nLIBSSH2_KNOWNHOST_TYPE_PLAIN, LIBSSH2_KNOWNHOST_TYPE_SHA1 or\nLIBSSH2_KNOWNHOST_TYPE_CUSTOM.\n\nThe key is encoded using one of the following encodings:\nLIBSSH2_KNOWNHOST_KEYENC_RAW or LIBSSH2_KNOWNHOST_KEYENC_BASE64.\n\nThe key is using one of these algorithms:\nLIBSSH2_KNOWNHOST_KEY_RSA1, LIBSSH2_KNOWNHOST_KEY_SSHRSA or\nLIBSSH2_KNOWNHOST_KEY_SSHDSS.\n\n\\fIstore\\fP should point to a pointer that gets filled in to point to the\nknown host data after the addition. NULL can be passed if you don't care about\nthis pointer.\n.SH RETURN VALUE\nReturns a regular libssh2 error code, where negative values are error codes\nand 0 indicates success.\n.SH AVAILABILITY\nAdded in libssh2 1.2.5\n.SH SEE ALSO\n.BR libssh2_knownhost_init(3)\n.BR libssh2_knownhost_free(3)\n.BR libssh2_knownhost_check(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_knownhost_check.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_check 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_check - check a host+key against the list of known hosts\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_knownhost_check(LIBSSH2_KNOWNHOSTS *hosts,\n                            const char *host,\n                            const char *key, size_t keylen,\n                            int typemask,\n                            struct libssh2_knownhost **knownhost);\n.SH DESCRIPTION\nChecks a host and its associated key against the collection of known hosts,\nand returns info back about the (partially) matched entry.\n\n\\fIhost\\fP is a pointer the host name in plain text. The host name can be the\nIP numerical address of the host or the full name.\n\n\\fIkey\\fP is a pointer to the key for the given host.\n\n\\fIkeylen\\fP is the total size in bytes of the key pointed to by the \\fIkey\\fP\nargument\n\n\\fItypemask\\fP is a bitmask that specifies format and info about the data\npassed to this function. Specifically, it details what format the host name is,\nwhat format the key is and what key type it is.\n\nThe host name is given as one of the following types:\nLIBSSH2_KNOWNHOST_TYPE_PLAIN or LIBSSH2_KNOWNHOST_TYPE_CUSTOM.\n\nThe key is encoded using one of the following encodings:\nLIBSSH2_KNOWNHOST_KEYENC_RAW or LIBSSH2_KNOWNHOST_KEYENC_BASE64.\n\n\\fIknownhost\\fP if set to non-NULL, it must be a pointer to a 'struct\nlibssh2_knownhost' pointer that gets filled in to point to info about a known\nhost that matches or partially matches.\n.SH RETURN VALUE\n\\fIlibssh2_knownhost_check(3)\\fP returns info about how well the provided\nhost + key pair matched one of the entries in the list of known hosts.\n\nLIBSSH2_KNOWNHOST_CHECK_FAILURE - something prevented the check to be made\n\nLIBSSH2_KNOWNHOST_CHECK_NOTFOUND - no host match was found\n\nLIBSSH2_KNOWNHOST_CHECK_MATCH - hosts and keys match.\n\nLIBSSH2_KNOWNHOST_CHECK_MISMATCH - host was found, but the keys didn't match!\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH EXAMPLE\nSee the ssh2_exec.c example as provided in the tarball.\n.SH SEE ALSO\n.BR libssh2_knownhost_init(3)\n.BR libssh2_knownhost_free(3)\n.BR libssh2_knownhost_add(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_knownhost_checkp.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009-2010 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_check 3 \"1 May 2010\" \"libssh2 1.2.6\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_checkp - check a host+key against the list of known hosts\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_knownhost_checkp(LIBSSH2_KNOWNHOSTS *hosts,\n                             const char *host, int port,\n                             const char *key, size_t keylen,\n                             int typemask,\n                             struct libssh2_knownhost **knownhost);\n.SH DESCRIPTION\nChecks a host and its associated key against the collection of known hosts,\nand returns info back about the (partially) matched entry.\n\n\\fIhost\\fP is a pointer the host name in plain text. The host name can be the\nIP numerical address of the host or the full name.\n\n\\fIport\\fP is the port number used by the host (or a negative number\nto check the generic host). If the port number is given, libssh2 will\ncheck the key for the specific host + port number combination in\naddition to the plain host name only check.\n\n\\fIkey\\fP is a pointer to the key for the given host.\n\n\\fIkeylen\\fP is the total size in bytes of the key pointed to by the \\fIkey\\fP\nargument\n\n\\fItypemask\\fP is a bitmask that specifies format and info about the data\npassed to this function. Specifically, it details what format the host name is,\nwhat format the key is and what key type it is.\n\nThe host name is given as one of the following types:\nLIBSSH2_KNOWNHOST_TYPE_PLAIN or LIBSSH2_KNOWNHOST_TYPE_CUSTOM.\n\nThe key is encoded using one of the following encodings:\nLIBSSH2_KNOWNHOST_KEYENC_RAW or LIBSSH2_KNOWNHOST_KEYENC_BASE64.\n\n\\fIknownhost\\fP if set to non-NULL, it must be a pointer to a 'struct\nlibssh2_knownhost' pointer that gets filled in to point to info about a known\nhost that matches or partially matches.\n.SH RETURN VALUE\n\\fIlibssh2_knownhost_check(3)\\fP returns info about how well the provided\nhost + key pair matched one of the entries in the list of known hosts.\n\nLIBSSH2_KNOWNHOST_CHECK_FAILURE - something prevented the check to be made\n\nLIBSSH2_KNOWNHOST_CHECK_NOTFOUND - no host match was found\n\nLIBSSH2_KNOWNHOST_CHECK_MATCH - hosts and keys match.\n\nLIBSSH2_KNOWNHOST_CHECK_MISMATCH - host was found, but the keys didn't match!\n.SH AVAILABILITY\nAdded in libssh2 1.2.6\n.SH EXAMPLE\nSee the ssh2_exec.c example as provided in the tarball.\n.SH SEE ALSO\n.BR libssh2_knownhost_init(3)\n.BR libssh2_knownhost_free(3)\n.BR libssh2_knownhost_add(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_knownhost_del.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_del 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_del - delete a known host entry\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_knownhost_del(LIBSSH2_KNOWNHOSTS *hosts,\n                          struct libssh2_knownhost *entry);\n.SH DESCRIPTION\nDelete a known host entry from the collection of known hosts.\n\n\\fIentry\\fP is a pointer to a struct that you can extract with\n\\fIlibssh2_knownhost_check(3)\\fP or \\fIlibssh2_knownhost_get(3)\\fP.\n.SH RETURN VALUE\nReturns a regular libssh2 error code, where negative values are error codes\nand 0 indicates success.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_knownhost_init(3)\n.BR libssh2_knownhost_free(3)\n.BR libssh2_knownhost_add(3)\n.BR libssh2_knownhost_check(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_knownhost_free.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_free 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_free - free a collection of known hosts\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid libssh2_knownhost_free(LIBSSH2_KNOWNHOSTS *hosts);\n.SH DESCRIPTION\nFree a collection of known hosts.\n.SH RETURN VALUE\nNone.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_knownhost_init(3)\n.BR libssh2_knownhost_add(3)\n.BR libssh2_knownhost_check(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_knownhost_get.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_get 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_get - get a known host off the collection of known hosts\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_knownhost_get(LIBSSH2_KNOWNHOSTS *hosts,\n                          struct libssh2_knownhost **store,\n                          struct libssh2_knownhost *prev):\n.SH DESCRIPTION\n\\fIlibssh2_knownhost_get(3)\\fP allows an application to iterate over all known\nhosts in the collection.\n\n\\fIstore\\fP should point to a pointer that gets filled in to point to the\nknown host data.\n\n\\fIprev\\fP is a pointer to a previous 'struct libssh2_knownhost' as returned\nby a previous invoke of this function, or NULL to get the first entry in the\ninternal collection.\n.SH RETURN VALUE\nReturns 0 if everything is fine and information about a host was stored in\nthe \\fIstore\\fP struct.\n\nReturns 1 if it reached the end of hosts.\n\nReturns negative values for error\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_knownhost_readfile(3)\n.BR libssh2_knownhost_writefile(3)\n.BR libssh2_knownhost_add(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_knownhost_init.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_init 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_init - init a collection of known hosts\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_KNOWNHOSTS *libssh2_knownhost_init(LIBSSH2_SESSION *session);\n.SH DESCRIPTION\nInit a collection of known hosts for this session. Returns the handle to an\ninternal representation of a known host collection.\n\nCall \\fBlibssh2_knownhost_free(3)\\fP to free the collection again after you're\ndoing using it.\n.SH RETURN VALUE\nReturns a handle pointer or NULL if something went wrong. The returned handle\nis used as input to all other known host related functions libssh2 provides.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_knownhost_free(3)\n.BR libssh2_knownhost_add(3)\n.BR libssh2_knownhost_check(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_knownhost_readfile.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009-2011 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_readfile 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_readfile - parse a file of known hosts\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_knownhost_readfile(LIBSSH2_KNOWNHOSTS *hosts,\n                               const char *filename, int type);\n.SH DESCRIPTION\nReads a collection of known hosts from a specified file and adds them to the\ncollection of known hosts.\n\n\\fIfilename\\fP specifies which file to read\n\n\\fItype\\fP specifies what file type it is, and\n\\fILIBSSH2_KNOWNHOST_FILE_OPENSSH\\fP is the only currently supported\nformat. This file is normally found named ~/.ssh/known_hosts\n.SH RETURN VALUE\nReturns a negative value, a regular libssh2 error code for errors, or a\npositive number as number of parsed known hosts in the file.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_knownhost_init(3)\n.BR libssh2_knownhost_free(3)\n.BR libssh2_knownhost_check(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_knownhost_readline.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_readline 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_readline - read a known host line\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_knownhost_readline(LIBSSH2_KNOWNHOSTS *hosts,\n                               const char *line, size_t len, int type):\n.SH DESCRIPTION\nTell libssh2 to read a buffer as it if is a line from a known hosts file.\n\n\\fIline\\fP points to the start of the line\n\n\\fIlen\\fP is the length of the line in bytes\n\n\\fItype\\fP specifies what file type it is, and\n\\fILIBSSH2_KNOWNHOST_FILE_OPENSSH\\fP is the only currently supported\nformat. This file is normally found named ~/.ssh/known_hosts\n.SH RETURN VALUE\nReturns a regular libssh2 error code, where negative values are error codes\nand 0 indicates success.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_knownhost_get(3)\n.BR libssh2_knownhost_writeline(3)\n.BR libssh2_knownhost_readfile(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_knownhost_writefile.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_writefile 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_writefile - write a collection of known hosts to a file\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_knownhost_writefile(LIBSSH2_KNOWNHOSTS *hosts,\n                                const char *filename, int type);\n.SH DESCRIPTION\nWrites all the known hosts to the specified file using the specified file\nformat.\n\n\\fIfilename\\fP specifies what filename to create\n\n\\fItype\\fP specifies what file type it is, and\n\\fILIBSSH2_KNOWNHOST_FILE_OPENSSH\\fP is the only currently supported\nformat.\n.SH RETURN VALUE\nReturns a regular libssh2 error code, where negative values are error codes\nand 0 indicates success.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_knownhost_readfile(3)\n.BR libssh2_knownhost_add(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_knownhost_writeline.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_writeline 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_writeline - convert a known host to a line for storage\n.SH SYNOPSIS\n#include <libssh2.h>\n\nlibssh2_knownhost_writeline(LIBSSH2_KNOWNHOSTS *hosts,\n                            struct libssh2_knownhost *known,\n                            char *buffer, size_t buflen,\n                            size_t *outlen,\n                            int type);\n.SH DESCRIPTION\nConverts a single known host to a single line of output for storage, using\nthe 'type' output format.\n\n\\fIknown\\fP identifies which particular known host\n\n\\fIbuffer\\fP points to an allocated buffer\n\n\\fIbuflen\\fP is the size of the \\fIbuffer\\fP. See RETURN VALUE about the size.\n\n\\fIoutlen\\fP must be a pointer to a size_t variable that will get the output\nlength of the stored data chunk. The number does not included the trailing\nzero!\n\n\\fItype\\fP specifies what file type it is, and\n\\fILIBSSH2_KNOWNHOST_FILE_OPENSSH\\fP is the only currently supported\nformat.\n.SH RETURN VALUE\nReturns a regular libssh2 error code, where negative values are error codes\nand 0 indicates success.\n\nIf the provided buffer is deemed too small to fit the data libssh2 wants to\nstore in it, LIBSSH2_ERROR_BUFFER_TOO_SMALL will be returned. The application\nis then advised to call the function again with a larger buffer. The\n\\fIoutlen\\fP size will then hold the requested size.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_knownhost_get(3)\n.BR libssh2_knownhost_readline(3)\n.BR libssh2_knownhost_writefile(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_poll.3",
    "content": ".TH libssh2_poll 3 \"14 Dec 2006\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_poll - poll for activity on a socket, channel or listener\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_poll(LIBSSH2_POLLFD *fds, unsigned int nfds, long timeout);\n.SH DESCRIPTION\nThis function is deprecated. Do note use. We encourage users to instead use\nthe \\fIpoll(3)\\fP or \\fIselect(3)\\fP functions to check for socket activity or\nwhen specific sockets are ready to get received from or send to.\n\nPoll for activity on a socket, channel, listener, or any combination of these\nthree types. The calling semantics for this function generally match\n\\fIpoll(2)\\fP however the structure of fds is somewhat more complex in order\nto accommodate the disparate datatypes, POLLFD constants have been namespaced\nto avoid platform discrepancies, and revents has additional values defined.\n.SH \"RETURN VALUE\"\nNumber of fds with interesting events.\n.SH SEE ALSO\n.BR libssh2_poll_channel_read(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_poll_channel_read.3",
    "content": ".TH libssh2_poll_channel_read 3 \"14 Dec 2006\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_poll_channel_read - check if data is available\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_poll_channel_read(LIBSSH2_CHANNEL *channel, int extended);\n.SH DESCRIPTION\nThis function is deprecated. Do note use.\n\n\\fIlibssh2_poll_channel_read(3)\\fP checks to see if data is available in the\n\\fIchannel\\fP's read buffer. No attempt is made with this method to see if\npackets are available to be processed. For full polling support, use\n\\fIlibssh2_poll(3)\\fP.\n.SH RETURN VALUE\nReturns 1 when data is available and 0 otherwise.\n.SH SEE ALSO\n.BR libssh2_poll(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_publickey_add.3",
    "content": ".TH libssh2_publickey_add 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_publickey_add - convenience macro for \\fIlibssh2_publickey_add_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_publickey_add(LIBSSH2_PUBLICKEY *pkey,\n\t\t\t  const unsigned char *name,\n                          const unsigned char *blob, unsigned long blob_len, char overwrite,\n                          unsigned long num_attrs, const libssh2_publickey_attribute attrs[]);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_publickey_add_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_publickey_add_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_publickey_add_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_publickey_add_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_publickey_add_ex.3",
    "content": ".TH libssh2_publickey_add_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_publickey_add_ex - Add a public key entry\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_publickey_add_ex(LIBSSH2_PUBLICKEY *pkey, const unsigned char *name,\n                         unsigned long name_len, const unsigned char *blob,\n                         unsigned long blob_len, char overwrite,\n                         unsigned long num_attrs,\n                         const libssh2_publickey_attribute attrs[])\n\n.SH DESCRIPTION\nTBD\n.SH RETURN VALUE\nReturns 0 on success, negative on failure.\n.SH ERRORS\nLIBSSH2_ERROR_BAD_USE\nLIBSSH2_ERROR_ALLOC,\nLIBSSH2_ERROR_EAGAIN\nLIBSSH2_ERROR_SOCKET_SEND,\nLIBSSH2_ERROR_SOCKET_TIMEOUT,\nLIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_publickey_init.3",
    "content": ".TH libssh2_publickey_init 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_publickey_init - TODO\n.SH SYNOPSIS\n\n.SH DESCRIPTION\n\n.SH RETURN VALUE\n\n.SH ERRORS\n\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_publickey_list_fetch.3",
    "content": ".TH libssh2_publickey_list_fetch 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_publickey_list_fetch - TODO\n.SH SYNOPSIS\n\n.SH DESCRIPTION\n\n.SH RETURN VALUE\n\n.SH ERRORS\n\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_publickey_list_free.3",
    "content": ".TH libssh2_publickey_list_free 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_publickey_list_free - TODO\n.SH SYNOPSIS\n\n.SH DESCRIPTION\n\n.SH RETURN VALUE\n\n.SH ERRORS\n\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_publickey_remove.3",
    "content": ".TH libssh2_publickey_remove 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_publickey_remove - convenience macro for \\fIlibssh2_publickey_remove_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_publickey_remove(LIBSSH2_PUBLICKEY *pkey,\n\t\t\t     const unsigned char *name, unsigned long name_len,\n\t\t\t     const unsigned char *blob, unsigned long blob_len);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_publickey_remove_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_publickey_remove_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_publickey_remove_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_publickey_remove_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_publickey_remove_ex.3",
    "content": ".TH libssh2_publickey_list_remove_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_publickey_list_remove_ex - TODO\n.SH SYNOPSIS\n\n.SH DESCRIPTION\n\n.SH RETURN VALUE\n\n.SH ERRORS\n\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_publickey_shutdown.3",
    "content": ".TH libssh2_publickey_shutdown 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_publickey_shutdown - TODO\n.SH SYNOPSIS\n\n.SH DESCRIPTION\n\n.SH RETURN VALUE\n\n.SH ERRORS\n\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_scp_recv.3",
    "content": ".TH libssh2_scp_recv 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_scp_recv - request a remote file via SCP\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_scp_recv(LIBSSH2_SESSION *session, const char *path, struct stat *sb);\n\n.SH DESCRIPTION\nThis function is \\fBDEPRECATED\\fP. Use \\fIlibssh2_scp_recv2(3)\\fP\ninstead!\n\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIpath\\fP - Full path and filename of file to transfer. That is the remote\nfile name.\n\n\\fIsb\\fP - Populated with remote file's size, mode, mtime, and atime\n\nRequest a file from the remote host via SCP.\n.SH RETURN VALUE\nPointer to a newly allocated LIBSSH2_CHANNEL instance, or NULL on errors.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SCP_PROTOCOL\\fP - \n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would\nblock.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n.BR libssh2_channel_open_ex(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_scp_recv2.3",
    "content": ".TH libssh2_scp_recv2 3 \"29 Jun 2015\" \"libssh2 1.6.1\" \"libssh2 manual\"\n.SH NAME\nlibssh2_scp_recv2 - request a remote file via SCP\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_scp_recv2(LIBSSH2_SESSION *session, const char *path, struct_stat *sb);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIpath\\fP - Full path and filename of file to transfer. That is the remote\nfile name.\n\n\\fIsb\\fP - Populated with remote file's size, mode, mtime, and atime\n\nRequest a file from the remote host via SCP.\n.SH RETURN VALUE\nPointer to a newly allocated LIBSSH2_CHANNEL instance, or NULL on errors.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SCP_PROTOCOL\\fP - \n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would\nblock.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n.BR libssh2_channel_open_ex(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_scp_send.3",
    "content": ".TH libssh2_scp_send 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_scp_send - convenience macro for \\fIlibssh2_scp_send_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_scp_send(LIBSSH2_SESSION *session, const char *path, int mode, size_t size);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_scp_send_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_scp_send_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_scp_send_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_scp_send_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_scp_send64.3",
    "content": ".TH libssh2_scp_send64 3 \"17 Apr 2010\" \"libssh2 1.2.6\" \"libssh2 manual\"\n.SH NAME\nlibssh2_scp_send64 - Send a file via SCP\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_scp_send64(LIBSSH2_SESSION *session, const char *path, int mode,\n                   libssh2_uint64_t size, time_t mtime, time_t atime);\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIpath\\fP - Full path and filename of file to transfer to. That is the remote\nfile name.\n\n\\fImode\\fP - File access mode to create file with\n\n\\fIsize\\fP - Size of file being transmitted (Must be known ahead of\ntime). Note that this needs to be passed on as variable type\nlibssh2_uint64_t. This type is 64 bit on modern operating systems and\ncompilers.\n\n\\fImtime\\fP - mtime to assign to file being created\n\n\\fIatime\\fP - atime to assign to file being created (Set this and \nmtime to zero to instruct remote host to use current time).\n\nSend a file to the remote host via SCP.\n.SH RETURN VALUE\nPointer to a newly allocated LIBSSH2_CHANNEL instance, or NULL on errors.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SCP_PROTOCOL\\fP - \n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would\nblock.\n.SH AVAILABILITY\nThis function was added in libssh2 1.2.6 and is meant to replace the former\n\\fIlibssh2_scp_send_ex(3)\\fP function.\n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_scp_send_ex.3",
    "content": ".TH libssh2_scp_send_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_scp_send_ex - Send a file via SCP\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_scp_send_ex(LIBSSH2_SESSION *session, const char *path, int mode,\n                    size_t size, long mtime, long atime);\n.SH DESCRIPTION\nThis function has been deemed deprecated since libssh2 1.2.6. See\n\\fIlibssh2_scp_send64(3)\\fP.\n\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIpath\\fP - Full path and filename of file to transfer to. That is the remote\nfile name.\n\n\\fImode\\fP - File access mode to create file with\n\n\\fIsize\\fP - Size of file being transmitted (Must be known \nahead of time precisely)\n\n\\fImtime\\fP - mtime to assign to file being created\n\n\\fIatime\\fP - atime to assign to file being created (Set this and \nmtime to zero to instruct remote host to use current time).\n\nSend a file to the remote host via SCP.\n.SH RETURN VALUE\nPointer to a newly allocated LIBSSH2_CHANNEL instance, or NULL on errors.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SCP_PROTOCOL\\fP - \n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would\nblock.\n.SH AVAILABILITY\nThis function was marked deprecated in libssh2 1.2.6 as\n \\fIlibssh2_scp_send64(3)\\fP has been introduced to replace this function.\n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_abstract.3",
    "content": ".TH libssh2_session_abstract 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_abstract - return a pointer to a session's abstract pointer\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid **\nlibssh2_session_abstract(LIBSSH2_SESSION *session);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\nReturn a pointer to where the abstract pointer provided to\n\\fBlibssh2_session_init_ex(3)\\fP is stored. By providing a doubly\nde-referenced pointer, the internal storage of the session instance may be\nmodified in place.\n\n.SH RETURN VALUE\nA pointer to session internal storage who's contents point to previously\nprovided abstract data.\n\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_banner_get.3",
    "content": ".TH libssh2_session_banner_get 3 \"9 Sep 2011\" \"libssh2 1.4.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_banner_get - get the remote banner\n.SH SYNOPSIS\n#include <libssh2.h>\n\nconst char *libssh2_session_banner_get(oLIBSSH2_SESSION *session);\n.SH DESCRIPTION\nOnce the session has been setup and \\fIlibssh2_session_handshake(3)\\fP has\ncompleted successfully, this function can be used to get the server id from\nthe banner each server presents.\n.SH RETURN VALUE\nA pointer to a string or NULL if something failed. The data pointed to will be\nallocated and associated to the session handle and will be freed by libssh2\nwhen \\fIlibssh2_session_free(3)\\fP is used.\n.SH AVAILABILITY\nAdded in 1.4.0\n.SH SEE ALSO\n.BR libssh2_session_banner_set(3),\n.BR libssh2_session_handshake(3),\n.BR libssh2_session_free(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_banner_set.3",
    "content": ".TH libssh2_session_banner_set 3 \"9 Sep 2011\" \"libssh2 1.4.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_banner_set - set the SSH protocol banner for the local client\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_session_banner_set(LIBSSH2_SESSION *session, const char *banner);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIbanner\\fP - A pointer to a zero-terminated string holding the user defined\nbanner\n\nSet the banner that will be sent to the remote host when the SSH session is\nstarted with \\fIlibssh2_session_handshake(3)\\fP This is optional; a banner\ncorresponding to the protocol and libssh2 version will be sent by default.\n.SH RETURN VALUE\nReturns 0 on success or negative on failure.  It returns LIBSSH2_ERROR_EAGAIN\nwhen it would otherwise block. While LIBSSH2_ERROR_EAGAIN is a negative\nnumber, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n.SH AVAILABILITY\nAdded in 1.4.0.\n\nBefore 1.4.0 this function was known as libssh2_banner_set(3)\n.SH SEE ALSO\n.BR libssh2_session_handshake(3),\n.BR libssh2_session_banner_get(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_block_directions.3",
    "content": ".TH libssh2_session_block_directions 3 \"1 Oct 2008\" \"libssh2 1.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_block_directions - get directions to wait for\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_session_block_directions(LIBSSH2_SESSION *session);\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \\fBlibssh2_session_init_ex(3)\\fP\n\nWhen any of libssh2 functions return \\fBLIBSSH2_ERROR_EAGAIN\\fP an application\nshould wait for the socket to have data available for reading or\nwriting. Depending on the return value of\n\\fIlibssh2_session_block_directions(3)\\fP an application should wait for read,\nwrite or both.\n.SH RETURN VALUE\nReturns the set of directions as a binary mask. Can be a combination of:\n\nLIBSSH2_SESSION_BLOCK_INBOUND: Inbound direction blocked.\n\nLIBSSH2_SESSION_BLOCK_OUTBOUND: Outbound direction blocked.\n\nApplication should wait for data to be available for socket prior to calling a\nlibssh2 function again. If \\fBLIBSSH2_SESSION_BLOCK_INBOUND\\fP is set select\nshould contain the session socket in readfds set.  Correspondingly in case of\n\\fBLIBSSH2_SESSION_BLOCK_OUTBOUND\\fP writefds set should contain the socket.\n.SH AVAILABILITY\nAdded in 1.0\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_callback_set.3",
    "content": ".TH libssh2_session_callback_set 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_callback_set - set a callback function\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nvoid *libssh2_session_callback_set(LIBSSH2_SESSION *session,\n                                   int cbtype, void *callback);\n.SH DESCRIPTION\nSets a custom callback handler for a previously initialized session\nobject. Callbacks are triggered by the receipt of special packets at the\nTransport layer. To disable a callback, set it to NULL.\n\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIcbtype\\fP - Callback type. One of the types listed in Callback Types.\n\n\\fIcallback\\fP - Pointer to custom callback function. The prototype for \nthis function must match the associated callback declaration macro.\n.SH CALLBACK TYPES\n.IP LIBSSH2_CALLBACK_IGNORE\nCalled when a SSH_MSG_IGNORE message is received\n.IP LIBSSH2_CALLBACK_DEBUG\nCalled when a SSH_MSG_DEBUG message is received\n.IP LIBSSH2_CALLBACK_DISCONNECT\nCalled when a SSH_MSG_DISCONNECT message is received\n.IP LIBSSH2_CALLBACK_MACERROR\nCalled when a mismatched MAC has been detected in the transport layer. If the\nfunction returns 0, the packet will be accepted nonetheless.\n.IP LIBSSH2_CALLBACK_X11\nCalled when an X11 connection has been accepted\n.IP LIBSSH2_CALLBACK_SEND\nCalled when libssh2 wants to send some data on the connection.\nCan be set to a custom function to handle I/O your own way.\n.IP LIBSSH2_CALLBACK_RECV\nCalled when libssh2 wants to receive some data from the connection.\nCan be set to a custom function to handle I/O your own way.\n.SH RETURN VALUE\nPointer to previous callback handler. Returns NULL if no prior callback\nhandler was set or the callback type was unknown.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_disconnect.3",
    "content": ".TH libssh2_session_disconnect 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_disconnect - convenience macro for \\fIlibssh2_session_disconnect_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_session_disconnect(LIBSSH2_SESSION *session, const char *description);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_session_disconnect_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_session_disconnect_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_session_disconnect_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_session_disconnect_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_disconnect_ex.3",
    "content": ".TH libssh2_session_disconnect_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_disconnect_ex - terminate transport layer\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_session_disconnect_ex(LIBSSH2_SESSION *session, int reason, const char *description, const char *lang);\n\nint \nlibssh2_session_disconnect(LIBSSH2_SESSION *session, const char *description);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIreason\\fP - One of the Disconnect Reason constants.\n\n\\fIdescription\\fP - Human readable reason for disconnection.\n\n\\fIlang\\fP - Localization string describing the language/encoding of the description provided.\n\nSend a disconnect message to the remote host associated with \\fIsession\\fP, \nalong with a \\fIreason\\fP symbol and a verbose \\fIdescription\\fP.\n\nAs a convenience, the macro \n.BR libssh2_session_disconnect(3)\nis provided. It calls\n.BR libssh2_session_disconnect_ex(3)\nwith \\fIreason\\fP set to SSH_DISCONNECT_BY_APPLICATION \nand \\fIlang\\fP set to an empty string.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_flag.3",
    "content": ".TH libssh2_session_flag 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_flag - TODO\n.SH SYNOPSIS\nint\nlibssh2_session_flag(LIBSSH2_SESSION *session, int flag, int value);\n.SH DESCRIPTION\nSet options for the created session. \\fIflag\\fP is the option to set, while\n\\fIvalue\\fP is typically set to 1 or 0 to enable or disable the option.\n.SH FLAGS\n.IP LIBSSH2_FLAG_SIGPIPE\nIf set, libssh2 will not attempt to block SIGPIPEs but will let them trigger\nfrom the underlying socket layer.\n.IP LIBSSH2_FLAG_COMPRESS\nIf set - before the connection negotiation is performed - libssh2 will try to\nnegotiate compression enabling for this connection. By default libssh2 will\nnot attempt to use compression.\n.SH RETURN VALUE\nReturns regular libssh2 error code.\n.SH AVAILABILITY\nThis function has existed since the age of dawn. LIBSSH2_FLAG_COMPRESS was\nadded in version 1.2.8.\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_free.3",
    "content": ".TH libssh2_session_free 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_free - frees resources associated with a session instance\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_session_free(LIBSSH2_SESSION *session);\n.SH DESCRIPTION\nFrees all resources associated with a session instance. Typically called after\n.BR libssh2_session_disconnect_ex(3)\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n.BR libssh2_session_disconnect_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_get_blocking.3",
    "content": ".TH libssh2_session_get_blocking 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_get_blocking - TODO\n.SH SYNOPSIS\nint libssh2_session_get_blocking(LIBSSH2_SESSION *session);\n.SH DESCRIPTION\nReturns 0 if the state of the session has previously be set to non-blocking\nand it returns 1 if the state was set to blocking.\n.SH RETURN VALUE\nSee description.\n.SH SEE ALSO\n.BR libssh2_session_set_blocking(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_get_timeout.3",
    "content": ".TH libssh2_session_get_timeout 3 \"4 May 2011\" \"libssh2 1.2.9\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_get_timeout - get the timeout for blocking functions\n.SH SYNOPSIS\n#include <libssh2.h>\n.nf\nlong libssh2_session_get_timeout(LIBSSH2_SESSION *session);\n.SH DESCRIPTION\nReturns the \\fBtimeout\\fP (in milliseconds) for how long a blocking the\nlibssh2 function calls may wait until they consider the situation an error and\nreturn LIBSSH2_ERROR_TIMEOUT.\n\nBy default libssh2 has no timeout (zero) for blocking functions.\n.SH RETURN VALUE\nThe value of the timeout setting.\n.SH AVAILABILITY\nAdded in 1.2.9\n.SH SEE ALSO\n.BR libssh2_session_set_timeout(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_handshake.3",
    "content": ".TH libssh2_session_handshake 3 \"7 Oct 2010\" \"libssh2 1.2.8\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_handshake - perform the SSH handshake\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_session_handshake(LIBSSH2_SESSION *session, libssh2_socket_t socket);\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by\n.BR libssh2_session_init_ex(3)\n\n\\fIsocket\\fP - Connected socket descriptor. Typically a TCP connection\nthough the protocol allows for any reliable transport and the library will\nattempt to use any berkeley socket.\n\nBegin transport layer protocol negotiation with the connected host.\n.SH RETURN VALUE\nReturns 0 on success, negative on failure.\n.SH ERRORS\n\\fILIBSSH2_ERROR_SOCKET_NONE\\fP - The socket is invalid.\n\n\\fILIBSSH2_ERROR_BANNER_SEND\\fP - Unable to send banner to remote host.\n\n\\fILIBSSH2_ERROR_KEX_FAILURE\\fP - >Encryption key exchange with the remote\nhost failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_DISCONNECT\\fP - The socket was disconnected.\n\n\\fILIBSSH2_ERROR_PROTO\\fP - An invalid SSH protocol response was received on\nthe socket.\n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would block.\n.SH AVAILABILITY\nAdded in 1.2.8\n.SH SEE ALSO\n.BR libssh2_session_free(3)\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_hostkey.3",
    "content": ".TH libssh2_session_hostkey 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_hostkey - get the remote key\n.SH SYNOPSIS\n#include <libssh2.h>\n\nconst char *libssh2_session_hostkey(LIBSSH2_SESSION *session,\n                                    size_t *len, int *type);\n.SH DESCRIPTION\nReturns a pointer to the current host key, the value \\fIlen\\fP points to will\nget the length of the key.\n\nThe value \\fItype\\fP points to the type of hostkey which is one of:\nLIBSSH2_HOSTKEY_TYPE_RSA, LIBSSH2_HOSTKEY_TYPE_DSS, or\nLIBSSH2_HOSTKEY_TYPE_UNKNOWN.\n\n.SH RETURN VALUE\nA pointer, or NULL if something went wrong.\n.SH SEE ALSO\n.BR libssh2_knownhost_check(3)\n.BR libssh2_knownhost_add(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_init.3",
    "content": ".TH libssh2_session_init 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_init - convenience macro for \\fIlibssh2_session_init_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_SESSION *\nlibssh2_session_init(void);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_session_init_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_session_init_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_session_init_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_init_ex.3",
    "content": ".TH libssh2_session_init_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_init_ex - initializes an SSH session object\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_SESSION * \nlibssh2_session_init_ex(LIBSSH2_ALLOC_FUNC((*myalloc)), LIBSSH2_FREE_FUNC((*myfree)), LIBSSH2_REALLOC_FUNC((*myrealloc)), void *abstract);\n\nLIBSSH2_SESSION *\nlibssh2_session_init(void);\n\n.SH DESCRIPTION\n\\fImyalloc\\fP - Custom allocator function. Refer to the section on Callbacks \nfor implementing an allocator callback. Pass a value of NULL to use the \ndefault system allocator.\n\n\\fImyfree\\fP - Custom de-allocator function. Refer to the section on Callbacks \nfor implementing a deallocator callback. Pass a value of NULL to use the \ndefault system deallocator.\n\n\\fImyrealloc\\fP - Custom re-allocator function. Refer to the section on \nCallbacks for implementing a reallocator callback. Pass a value of NULL to \nuse the default system reallocator.\n\n\\fIabstract\\fP - Arbitrary pointer to application specific callback data. \nThis value will be passed to any callback function associated with the named \nsession instance.\n\nInitializes an SSH session object. By default system memory allocators\n(malloc(), free(), realloc()) will be used for any dynamically allocated memory\nblocks. Alternate memory allocation functions may be specified using the\nextended version of this API call, and/or optional application specific data\nmay be attached to the session object.\n\nThis method must be called first, prior to configuring session options or\nstarting up an SSH session with a remote server.\n.SH RETURN VALUE\nPointer to a newly allocated LIBSSH2_SESSION instance, or NULL on errors.\n.SH SEE ALSO\n.BR libssh2_session_free(3)\n.BR libssh2_session_handshake(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_last_errno.3",
    "content": ".TH libssh2_session_last_errno 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_last_errno - get the most recent error number\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_session_last_errno(LIBSSH2_SESSION *session);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\nDetermine the most recent error condition.\n\n.SH RETURN VALUE\nNumeric error code corresponding to the the Error Code constants.\n\n.SH SEE ALSO\n.BR libssh2_session_last_error(3)\n.BR libssh2_session_set_last_error(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_last_error.3",
    "content": ".TH libssh2_session_last_error 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_last_error - get the most recent error\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_session_last_error(LIBSSH2_SESSION *session, char **errmsg, int *errmsg_len, int want_buf);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIerrmsg\\fP - If not NULL, is populated by reference with the human \nreadable form of the most recent error message.\n\n\\fIerrmsg_len\\fP - If not NULL, is populated by reference with the length \nof errmsg. (The string is NUL-terminated, so the length is only useful as \nan optimization, to avoid calling strlen.)\n\n\\fIwant_buf\\fP - If set to a non-zero value, \"ownership\" of the errmsg \nbuffer will be given to the calling scope. If necessary, the errmsg buffer \nwill be duplicated.\n\nDetermine the most recent error condition and its cause.\n\n.SH RETURN VALUE\nNumeric error code corresponding to the the Error Code constants.\n\n.SH SEE ALSO\n.BR libssh2_session_last_errno(3)\n.BR libssh2_session_set_last_error(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_method_pref.3",
    "content": ".TH libssh2_session_method_pref 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_method_pref - set preferred key exchange method\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_session_method_pref(LIBSSH2_SESSION *session, int method_type, const char *prefs);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fImethod_type\\fP - One of the Method Type constants.\n\n\\fIprefs\\fP - Coma delimited list of preferred methods to use with \nthe most preferred listed first and the least preferred listed last. \nIf a method is listed which is not supported by libssh2 it will be \nignored and not sent to the remote host during protocol negotiation.\n\nSet preferred methods to be negotiated. These \npreferences must be set prior to calling\n.BR libssh2_session_handshake(3)\nas they are used during the protocol initiation phase.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_INVAL\\fP - The requested method type was invalid.\n\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_METHOD_NOT_SUPPORTED\\fP - The requested method is not supported.\n\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n.BR libssh2_session_handshake(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_methods.3",
    "content": ".TH libssh2_session_methods 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_methods - return the currently active algorithms\n.SH SYNOPSIS\n#include <libssh2.h>\n\nconst char *\nlibssh2_session_methods(LIBSSH2_SESSION *session, int method_type);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fImethod_type\\fP - one of the method type constants: LIBSSH2_METHOD_KEX,\nLIBSSH2_METHOD_HOSTKEY, LIBSSH2_METHOD_CRYPT_CS, LIBSSH2_METHOD_CRYPT_SC,\nLIBSSH2_METHOD_MAC_CS, LIBSSH2_METHOD_MAC_SC, LIBSSH2_METHOD_COMP_CS,\nLIBSSH2_METHOD_COMP_SC, LIBSSH2_METHOD_LANG_CS, LIBSSH2_METHOD_LANG_SC.\n\nReturns the actual method negotiated for a particular transport parameter.\n.SH RETURN VALUE\nNegotiated method or NULL if the session has not yet been started.\n.SH ERRORS\n\\fILIBSSH2_ERROR_INVAL\\fP - The requested method type was invalid.\n\n\\fILIBSSH2_ERROR_METHOD_NONE\\fP - no method has been set\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_set_blocking.3",
    "content": ".TH libssh2_session_set_blocking 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_set_blocking - set or clear blocking mode on session\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid \nlibssh2_session_set_blocking(LIBSSH2_SESSION *session, int blocking);\n\n.SH DESCRIPTION\n\\fIsession\\fP - session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIblocking\\fP - Set to a non-zero value to make the channel block, or zero to\nmake it non-blocking.\n\nSet or clear blocking mode on the selected on the session.  This will\ninstantly affect any channels associated with this session. If a read is\nperformed on a session with no data currently available, a blocking session\nwill wait for data to arrive and return what it receives.  A non-blocking\nsession will return immediately with an empty buffer.  If a write is performed\non a session with no room for more data, a blocking session will wait for\nroom.  A non-blocking session will return immediately without writing\nanything.\n\n.SH RETURN VALUE\nNone\n\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_set_last_error.3",
    "content": ".TH libssh2_session_set_last_error 3 \"26 Oct 2015\" \"libssh2 1.6.1\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_set_last_error - sets the internal error state\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_session_set_last_error(LIBSSH2_SESSION *session, int errcode, const char *errmsg)\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by\n.BR libssh2_session_init_ex(3)\n\n\\fIerrcode\\fP - One of the error codes as defined in the public\nlibssh2 header file.\n\n\\fIerrmsg\\fP - If not NULL, a copy of the given string is stored\ninside the session object as the error message.\n\nThis function is provided for high level language wrappers\n(i.e. Python or Perl) and other libraries that may extend libssh2 with\nadditional features while still relying on its error reporting\nmechanism.\n\n.SH RETURN VALUE\nNumeric error code corresponding to the the Error Code constants.\n\n.SH AVAILABILITY\nAdded in 1.6.1\n\n.SH SEE ALSO\n.BR libssh2_session_last_error(3)\n.BR libssh2_session_last_errno(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_set_timeout.3",
    "content": ".TH libssh2_session_set_timeout 3 \"4 May 2011\" \"libssh2 1.2.9\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_set_timeout - set timeout for blocking functions\n.SH SYNOPSIS\n#include <libssh2.h>\n.nf\nvoid libssh2_session_set_timeout(LIBSSH2_SESSION *session, long timeout);\n.SH DESCRIPTION\nSet the \\fBtimeout\\fP in milliseconds for how long a blocking the libssh2\nfunction calls may wait until they consider the situation an error and return\nLIBSSH2_ERROR_TIMEOUT.\n\nBy default or if you set the timeout to zero, libssh2 has no timeout for\nblocking functions.\n.SH RETURN VALUE\nNothing\n.SH AVAILABILITY\nAdded in 1.2.9\n.SH SEE ALSO\n.BR libssh2_session_get_timeout(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_startup.3",
    "content": ".TH libssh2_session_startup 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_startup - begin transport layer\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_session_startup(LIBSSH2_SESSION *session, int socket);\n.SH DESCRIPTION\nStarting in libssh2 version 1.2.8 this function is considered deprecated. Use\n\\fIlibssh2_session_handshake(3)\\fP instead.\n\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIsocket\\fP - Connected socket descriptor. Typically a TCP connection \nthough the protocol allows for any reliable transport and the library will \nattempt to use any berkeley socket.\n\nBegin transport layer protocol negotiation with the connected host.\n.SH RETURN VALUE\nReturns 0 on success, negative on failure.\n.SH ERRORS\n\\fILIBSSH2_ERROR_SOCKET_NONE\\fP - The socket is invalid.\n\n\\fILIBSSH2_ERROR_BANNER_SEND\\fP - Unable to send banner to remote host.\n\n\\fILIBSSH2_ERROR_KEX_FAILURE\\fP - >Encryption key exchange with the remote \nhost failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_DISCONNECT\\fP - The socket was disconnected.\n\n\\fILIBSSH2_ERROR_PROTO\\fP - An invalid SSH protocol response was received on \nthe socket.\n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would block.\n\n.SH SEE ALSO\n.BR libssh2_session_free(3)\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_session_supported_algs.3",
    "content": ".TH libssh2_session_supported_algs 3 \"23 Oct 2011\" \"libssh2 1.4.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_supported_algs - get list of supported algorithms\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nint libssh2_session_supported_algs(LIBSSH2_SESSION* session,\n                                   int method_type,\n                                   const char*** algs);\n.SH DESCRIPTION\n\\fIsession\\fP - An instance of initialized LIBSSH2_SESSION (the function will\nuse its pointer to the memory allocation function).  \\fImethod_type\\fP - Method\ntype. See .BR \\fIlibssh2_session_method_pref(3)\\fP.  \\fIalgs\\fP - Address of a\npointer that will point to an array of returned algorithms\n\nGet a list of supported algorithms for the given \\fImethod_type\\fP. The\nmethod_type parameter is equivalent to method_type in\n\\fIlibssh2_session_method_pref(3)\\fP. If successful, the function will\nallocate the appropriate amount of memory. When not needed anymore, it must be\ndeallocated by calling \\fIlibssh2_free(3)\\fP. When this function is\nunsuccessful, this must not be done.\n\nIn order to get a list of all supported compression algorithms,\nlibssh2_session_flag(session, LIBSSH2_FLAG_COMPRESS, 1) must be called before\ncalling this function, otherwise only \"none\" will be returned.\n\nIf successful, the function will allocate and fill the array with supported\nalgorithms (the same names as defined in RFC 4253).  The array is not NULL\nterminated.\n.SH EXAMPLE\n.nf\n#include \"libssh2.h\"\n\nconst char **algorithms;\nint rc, i;\nLIBSSH2_SESSION *session;\n\n/* initialize session */\nsession = libssh2_session_init();\nrc = libssh2_session_supported_algs(session,\n                                    LIBSSH2_METHOD_CRYPT_CS,\n                                    &algorithms);\nif (rc>0) {\n    /* the call succeeded, do sth. with the list of algorithms\n       (e.g. list them)... */\n    printf(\"Supported symmetric algorithms:\\n\");\n    for ( i=0; i<rc; i++ )\n        printf(\"\\t%s\\n\", algorithms[i]);\n\n    /* ... and free the allocated memory when not needed anymore */\n    libssh2_free(session, algorithms);\n}\nelse {\n    /* call failed, error handling */\n}\n.SH RETURN VALUE\nOn success, a number of returned algorithms (i.e a positive number will be\nreturned).  In case of a failure, an error code (a negative number, see below)\nis returned.  0 should never be returned.\n.SH ERRORS\n\\fILIBSSH2_ERROR_BAD_USE\\fP - Invalid address of algs.\n\n\\fILIBSSH2_ERROR_METHOD_NOT_SUPPORTED\\fP -  Unknown method type.\n\n\\fILIBSSH2_ERROR_INVAL\\fP - Internal error (normally should not occur).\n\n\\fILIBSSH2_ERROR_ALLOC\\fP - Allocation of memory failed.\n.SH AVAILABILITY\nAdded in 1.4.0\n.SH SEE ALSO\n.BR libssh2_session_methods(3),\n.BR libssh2_session_method_pref(3)\n.BR libssh2_free(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_close.3",
    "content": ".TH libssh2_sftp_close 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_close - convenience macro for \\fIlibssh2_sftp_close_handle(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_close(LIBSSH2_SFTP_HANDLE *handle);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_close_handle(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_close_handle(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_close_handle(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_close_handle(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_close_handle.3",
    "content": ".TH libssh2_sftp_close_handle 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_close_handle - close filehandle\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint \nlibssh2_sftp_close_handle(LIBSSH2_SFTP_HANDLE *handle);\n\nint \nlibssh2_sftp_close(LIBSSH2_SFTP_HANDLE *handle);\n\nint \nlibssh2_sftp_closedir(LIBSSH2_SFTP_HANDLE *handle);\n\n.SH DESCRIPTION\n\\fIhandle\\fP - SFTP File Handle as returned by \\fBlibssh2_sftp_open_ex(3)\\fP\nor \\fBlibssh2_sftp_opendir(3)\\fP (which is a macro).\n\nClose an active LIBSSH2_SFTP_HANDLE. Because files and directories share the\nsame underlying storage mechanism these methods may be used\ninterchangeably. \\fBlibssh2_sftp_close(3)\\fP and \\fBlibssh2_sftp_closedir(3)\\fP\nare macros for \\fBlibssh2_sftp_close_handle(3)\\fP.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to \nbe returned by the server.\n\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_closedir.3",
    "content": ".TH libssh2_sftp_closedir 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_closedir - convenience macro for \\fIlibssh2_sftp_close_handle(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_closedir(LIBSSH2_SFTP_HANDLE *handle)\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_close_handle(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_close_handle(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_close_handle(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_close_handle(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_fsetstat.3",
    "content": ".TH libssh2_sftp_fsetstat 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_fsetstat - convenience macro for \\fIlibssh2_sftp_fstat_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_fsetstat(LIBSSH2_SFTP_HANDLE *handle, LIBSSH2_SFTP_ATTRIBUTES *attrs);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_fstat_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_fstat_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_fstat_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_fstat_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_fstat.3",
    "content": ".TH libssh2_sftp_fstat 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_fstat - convenience macro for \\fIlibssh2_sftp_fstat_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_fstat(LIBSSH2_SFTP_HANDLE *handle, LIBSSH2_SFTP_ATTRIBUTES *attrs);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_fstat_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_fstat_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_fstat_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_fstat_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_fstat_ex.3",
    "content": ".TH libssh2_sftp_fstat_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_fstat_ex - get or set attributes on an SFTP file handle\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint \nlibssh2_sftp_fstat_ex(LIBSSH2_SFTP_HANDLE *handle,\n                      LIBSSH2_SFTP_ATTRIBUTES *attrs, int setstat)\n\n#define libssh2_sftp_fstat(handle, attrs) \\\\\n    libssh2_sftp_fstat_ex((handle), (attrs), 0)\n#define libssh2_sftp_fsetstat(handle, attrs) \\\\\n    libssh2_sftp_fstat_ex((handle), (attrs), 1)\n.fi\n.SH DESCRIPTION\n\\fIhandle\\fP - SFTP File Handle as returned by \n.BR libssh2_sftp_open_ex(3)\n\n\\fIattrs\\fP - Pointer to an LIBSSH2_SFTP_ATTRIBUTES structure to set file\nmetadata from or into depending on the value of setstat.\n\n\\fIsetstat\\fP - When non-zero, the file's metadata will be updated \nwith the data found in attrs according to the values of attrs->flags \nand other relevant member attributes.\n\nGet or Set statbuf type data for a given LIBSSH2_SFTP_HANDLE instance.\n.SH DATA TYPES\nLIBSSH2_SFTP_ATTRIBUTES is a typedefed struct that is defined as below\n\n.nf\nstruct _LIBSSH2_SFTP_ATTRIBUTES {\n\n    /* If flags & ATTR_* bit is set, then the value in this\n     * struct will be meaningful Otherwise it should be ignored\n     */\n    unsigned long flags;\n\n    /* size of file, in bytes */\n    libssh2_uint64_t filesize;\n\n    /* numerical representation of the user and group owner of\n     * the file\n     */\n    unsigned long uid, gid;\n\n    /* bitmask of permissions */\n    unsigned long permissions;\n\n    /* access time and modified time of file */\n    unsigned long atime, mtime;\n};\n.fi\n\nYou will find a full set of defines and macros to identify flags and\npermissions on the \\fBlibssh2_sftp.h\\fP header file, but some of the\nmost common ones are:\n\nTo check for specific user permissions, the set of defines are in the\npattern LIBSSH2_SFTP_S_I<action><who> where <action> is R, W or X for\nread, write and executable and <who> is USR, GRP and OTH for user,\ngroup and other. So, you check for a user readable file, use the bit\n\\fILIBSSH2_SFTP_S_IRUSR\\fP while you want to see if it is executable\nfor other, you use \\fILIBSSH2_SFTP_S_IXOTH\\fP and so on.\n\nTo check for specific file types, you would previously (before libssh2\n1.2.5) use the standard posix S_IS***() macros, but since 1.2.5\nlibssh2 offers its own set of macros for this functionality:\n.IP LIBSSH2_SFTP_S_ISLNK\nTest for a symbolic link\n.IP LIBSSH2_SFTP_S_ISREG\nTest for a regular file\n.IP LIBSSH2_SFTP_S_ISDIR\nTest for a directory\n.IP LIBSSH2_SFTP_S_ISCHR\nTest for a character special file\n.IP LIBSSH2_SFTP_S_ISBLK\nTest for a block special file\n.IP LIBSSH2_SFTP_S_ISFIFO\nTest for a pipe or FIFO special file\n.IP LIBSSH2_SFTP_S_ISSOCK\nTest for a socket\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to \nbe returned by the server.\n.SH AVAILABILITY\nThis function has been around since forever, but most of the\nLIBSSH2_SFTP_S_* defines were introduced in libssh2 0.14 and the\nLIBSSH2_SFTP_S_IS***() macros were introduced in libssh2 1.2.5.\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_fstatvfs.3",
    "content": ".so man3/libssh2_sftp_statvfs.3\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_fsync.3",
    "content": ".TH libssh2_sftp_fsync 3 \"8 Apr 2013\" \"libssh2 1.4.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_fsync - synchronize file to disk\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint\nlibssh2_sftp_fsync(LIBSSH2_SFTP_HANDLE *handle)\n.fi\n.SH DESCRIPTION\nThis function causes the remote server to synchronize the file\ndata and metadata to disk (like fsync(2)).\n\nFor this to work requires fsync@openssh.com support on the server.\n\n\\fIhandle\\fP - SFTP File Handle as returned by\n.BR libssh2_sftp_open_ex(3)\n\n.SH RETURN VALUE\nReturns 0 on success or negative on failure. If used in non-blocking mode, it\nreturns LIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response\nwas received on the socket, or an SFTP operation caused an errorcode\nto be returned by the server.  In particular, this can be returned if\nthe SSH server does not support the fsync operation: the SFTP subcode\n\\fILIBSSH2_FX_OP_UNSUPPORTED\\fP will be returned in this case.\n\n.SH AVAILABILITY\nAdded in libssh2 1.4.4 and OpenSSH 6.3.\n.SH SEE ALSO\n.BR fsync(2)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_get_channel.3",
    "content": ".TH libssh2_sftp_get_channel 3 \"9 Sep 2011\" \"libssh2 1.4.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_get_channel - return the channel of sftp\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n.fi\nLIBSSH2_CHANNEL *libssh2_sftp_get_channel(LIBSSH2_SFTP *sftp);\n.SH DESCRIPTION\n\\fIsftp\\fP - SFTP instance as returned by\n.BR libssh2_sftp_init(3)\n\nReturn the channel of the given sftp handle.\n.SH RETURN VALUE\nThe channel of the SFTP instance or NULL if something was wrong.\n.SH AVAILABILITY\nAdded in 1.4.0\n.SH SEE ALSO\n.BR libssh2_sftp_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_init.3",
    "content": ".TH libssh2_sftp_init 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_init - open SFTP channel for the given SSH session.\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nLIBSSH2_SFTP *\nlibssh2_sftp_init(LIBSSH2_SESSION *session);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\nOpen a channel and initialize the SFTP subsystem. Although the SFTP subsystem\noperates over the same type of channel as those exported by the Channel API,\nthe protocol itself implements its own unique binary packet protocol which\nmust be managed with the libssh2_sftp_*() family of functions. When an SFTP\nsession is complete, it must be destroyed using the\n.BR libssh2_sftp_shutdown(3)\nfunction.\n.SH RETURN VALUE\nA pointer to the newly allocated SFTP instance or NULL on failure.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to be \nreturned by the server.\n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would\nblock.\n.SH SEE ALSO\n.BR libssh2_sftp_shutdown(3)\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_last_error.3",
    "content": ".TH libssh2_sftp_last_error 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_last_error - return the last SFTP-specific error code\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nunsigned long \nlibssh2_sftp_last_error(LIBSSH2_SFTP *sftp);\n\n.SH DESCRIPTION\n\\fIsftp\\fP - SFTP instance as returned by \n.BR libssh2_sftp_init(3)\n\nReturns the last error code produced by the SFTP layer. Note that this only\nreturns a sensible error code if libssh2 returned LIBSSH2_ERROR_SFTP_PROTOCOL\nin a previous call. Using \\fBlibssh2_sftp_last_error(3)\\fP without a\npreceding SFTP protocol error, it will return an unspecified value.\n\n.SH RETURN VALUE\nCurrent error code state of the SFTP instance.\n\n.SH SEE ALSO\n.BR libssh2_sftp_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_lstat.3",
    "content": ".TH libssh2_sftp_lstat 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_lstat - convenience macro for \\fIlibssh2_sftp_stat_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_lstat(LIBSSH2_SFTP *sftp, const char *path, LIBSSH2_SFTP_ATTRIBUTES *attrs);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_stat_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_stat_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_stat_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_stat_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_mkdir.3",
    "content": ".TH libssh2_sftp_mkdir 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_mkdir - convenience macro for \\fIlibssh2_sftp_mkdir_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_mkdir(LIBSSH2_SFTP *sftp, const char *path, long mode);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_mkdir_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_mkdir_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_mkdir_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_mkdir_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_mkdir_ex.3",
    "content": ".TH libssh2_sftp_mkdir_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_mkdir_ex - create a directory on the remote file system\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint \nlibssh2_sftp_mkdir_ex(LIBSSH2_SFTP *sftp, const char *path, unsigned int path_len, long mode);\n\nint \nlibssh2_sftp_mkdir(LIBSSH2_SFTP *sftp, const char *path, long mode);\n.SH DESCRIPTION\n\\fIsftp\\fP - SFTP instance as returned by \n.BR libssh2_sftp_init(3)\n\n\\fIpath\\fP - full path of the new directory to create. Note that the new \ndirectory's parents must all exist prior to making this call.\n\n\\fIpath_len\\fP - length of the full path of the new directory to create.\n\n\\fImode\\fP - directory creation mode (e.g. 0755).\n\nCreate a directory on the remote file system.\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to be \nreturned by the server.\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_open.3",
    "content": ".TH libssh2_sftp_open 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_open - convenience macro for \\fIlibssh2_sftp_open_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_SFTP_HANDLE *\nlibssh2_sftp_open(LIBSSH2_SFTP *sftp, const char *path, unsigned long flags, long mode);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_open_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_open_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_open_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_open_ex.3",
    "content": ".TH libssh2_sftp_open_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_open - open filehandle for file on SFTP.\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nLIBSSH2_SFTP_HANDLE *\nlibssh2_sftp_open_ex(LIBSSH2_SFTP *sftp, const char *filename,\n                     unsigned int filename_len, unsigned long flags,\n                     long mode, int open_type);\n.SH DESCRIPTION\n\\fIsftp\\fP - SFTP instance as returned by \\fIlibssh2_sftp_init(3)\\fP\n\n\\fIfilename\\fP - Remote file/directory resource to open \n\n\\fIfilename_len\\fP - Length of filename \n\n\\fIflags\\fP - Any reasonable combination of the LIBSSH2_FXF_* constants:\n.RS\n.IP LIBSSH2_FXF_READ\nOpen the file for reading.\n.IP LIBSSH2_FXF_WRITE\nOpen the file for writing.  If both this and LIBSSH2_FXF_READ are specified,\nthe file is opened for both reading and writing.\n.IP LIBSSH2_FXF_APPEND\nForce all writes to append data at the end of the file.\n.IP LIBSSH2_FXF_CREAT,\nIf this flag is specified, then a new file will be created if one does not\nalready exist (if LIBSSH2_FXF_TRUNC is specified, the new file will be\ntruncated to zero length if it previously exists)\n.IP LIBSSH2_FXF_TRUNC\nForces an existing file with the same name to be truncated to zero length when\ncreating a file by specifying LIBSSH2_FXF_CREAT. LIBSSH2_FXF_CREAT MUST also\nbe specified if this flag is used.\n.IP LIBSSH2_FXF_EXCL\nCauses the request to fail if the named file already exists.\nLIBSSH2_FXF_CREAT MUST also be specified if this flag is used.\n\n.RE\n\\fImode\\fP - POSIX file permissions to assign if the file is being newly\ncreated. See the LIBSSH2_SFTP_S_* convenience defines in <libssh2_sftp.h>\n\n\\fIopen_type\\fP - Either of LIBSSH2_SFTP_OPENFILE (to open a file) or\nLIBSSH2_SFTP_OPENDIR (to open a directory).\n.SH RETURN VALUE\nA pointer to the newly created LIBSSH2_SFTP_HANDLE instance or NULL on\nfailure.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to be \nreturned by the server.\n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would\nblock.\n.SH SEE ALSO\n.BR libssh2_sftp_close_handle(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_opendir.3",
    "content": ".TH libssh2_sftp_opendir 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_opendir - convenience macro for \\fIlibssh2_sftp_open_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_SFTP_HANDLE *\nlibssh2_sftp_opendir(LIBSSH2_SFTP *sftp, const char *path);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_open_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_open_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_open_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_read.3",
    "content": ".TH libssh2_sftp_read 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_read - read data from an SFTP handle\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nssize_t \nlibssh2_sftp_read(LIBSSH2_SFTP_HANDLE *handle, char *buffer, size_t buffer_maxlen);\n\n.SH DESCRIPTION\n\\fIhandle\\fP is the SFTP File Handle as returned by \n.BR libssh2_sftp_open_ex(3)\n\n\\fIbuffer\\fP is a pointer to a pre-allocated buffer of at least\n\n\\fIbuffer_maxlen\\fP bytes to read data into.\n\nReads a block of data from an LIBSSH2_SFTP_HANDLE. This method is modelled\nafter the POSIX \n.BR read(2)\nfunction and uses the same calling semantics. \n.BR libssh2_sftp_read(3)\nwill attempt to read as much as possible however it may not fill all of buffer\nif the file pointer reaches the end or if further reads would cause the socket\nto block.\n.SH RETURN VALUE\nNumber of bytes actually populated into buffer, or negative on failure.  \nIt returns LIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was\nreceived on the socket, or an SFTP operation caused an errorcode to be\nreturned by the server.\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n.BR libssh2_sftp_read(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_readdir.3",
    "content": ".TH libssh2_sftp_readdir 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_readdir - convenience macro for \\fIlibssh2_sftp_readdir_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_readdir(LIBSSH2_SFTP_HANDLE *handle, char *buffer, size_t buffer_maxlen, LIBSSH2_SFTP_ATTRIBUTES *attrs);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_readdir_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_readdir_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_readdir_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_readdir_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_readdir_ex.3",
    "content": ".TH libssh2_sftp_readdir_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_readdir_ex - read directory data from an SFTP handle\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint \nlibssh2_sftp_readdir_ex(LIBSSH2_SFTP_HANDLE *handle,\n                        char *buffer, size_t buffer_maxlen,\n                        char *longentry, size_t longentry_maxlen,\n                        LIBSSH2_SFTP_ATTRIBUTES *attrs);\n.SH DESCRIPTION\nReads a block of data from a LIBSSH2_SFTP_HANDLE and returns file entry\ninformation for the next entry, if any.\n\n\\fIhandle\\fP - is the SFTP File Handle as returned by \n.BR libssh2_sftp_open_ex(3)\n\n\\fIbuffer\\fP - is a pointer to a pre-allocated buffer of at least\n\\fIbuffer_maxlen\\fP bytes to read data into.\n\n\\fIbuffer_maxlen\\fP - is the length of buffer in bytes. If the length of the \nfilename is longer than the space provided by buffer_maxlen it will be \ntruncated to fit.\n\n\\fIlongentry\\fP - is a pointer to a pre-allocated buffer of at least\n\\fIlongentry_maxlen\\fP bytes to read data into. The format of the `longname'\nfield is unspecified by SFTP protocol. It MUST be suitable for use in the\noutput of a directory listing command (in fact, the recommended operation for\na directory listing command is to simply display this data).\n\n\\fIlongentry_maxlen\\fP - is the length of longentry in bytes. If the length of\nthe full directory entry is longer than the space provided by\n\\fIlongentry_maxlen\\fP it will be truncated to fit.\n\n\\fIattrs\\fP - is a pointer to LIBSSH2_SFTP_ATTRIBUTES storage to populate \nstatbuf style data into.\n.SH RETURN VALUE\nNumber of bytes actually populated into buffer (not counting the terminating\nzero), or negative on failure.  It returns LIBSSH2_ERROR_EAGAIN when it would\notherwise block. While LIBSSH2_ERROR_EAGAIN is a negative number, it isn't\nreally a failure per se.\n.SH BUG\nPassing in a too small buffer for 'buffer' or 'longentry' when receiving data\nonly results in libssh2 1.2.7 or earlier to not copy the entire data amount,\nand it is not possible for the application to tell when it happens!\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to be \nreturned by the server.\n\nFrom 1.2.8, LIBSSH2_ERROR_BUFFER_TOO_SMALL is returned if any of the\ngiven 'buffer' or 'longentry' buffers are too small to fit the requested\nobject name.\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3),\n.BR libssh2_sftp_close_handle(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_readlink.3",
    "content": ".TH libssh2_sftp_readlink 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_readlink - convenience macro for \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\n#define libssh2_sftp_readlink(sftp, path, target, maxlen) \\\\\n    libssh2_sftp_symlink_ex((sftp), (path), strlen(path), (target), (maxlen), \\\\\n    LIBSSH2_SFTP_READLINK)\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_symlink_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_symlink_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_realpath.3",
    "content": ".TH libssh2_sftp_realpath 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_realpath - convenience macro for \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\n#define libssh2_sftp_realpath(sftp, path, target, maxlen) \\\\\n  libssh2_sftp_symlink_ex((sftp), (path), strlen(path), (target), (maxlen), \\\\\n                          LIBSSH2_SFTP_REALPATH)\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_symlink_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_symlink_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_rename.3",
    "content": ".TH libssh2_sftp_rename 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_rename - convenience macro for \\fIlibssh2_sftp_rename_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_rename(LIBSSH2_SFTP *sftp, const char *source_filename, const char *destination_filename);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_rename_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_rename_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_rename_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_rename_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_rename_ex.3",
    "content": ".TH libssh2_sftp_rename_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_rename_ex - rename an SFTP file\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint \nlibssh2_sftp_rename_ex(LIBSSH2_SFTP *sftp, const char *source_filename, unsigned int source_filename_len, const char *dest_filename, unsigned int dest_filename_len, long flags);\n\nint \nlibssh2_sftp_rename_ex(LIBSSH2_SFTP *sftp, const char *source_filename, const char *dest_filename);\n\n.SH DESCRIPTION\n\\fIsftp\\fP - SFTP instance as returned by \n.BR libssh2_sftp_init(3)\n\n\\fIsourcefile\\fP - Path and name of the existing filesystem entry\n\n\\fIsourcefile_len\\fP - Length of the path and name of the existing \nfilesystem entry\n\n\\fIdestfile\\fP - Path and name of the target filesystem entry\n\n\\fIdestfile_len\\fP - Length of the path and name of the target \nfilesystem entry\n\n\\fIflags\\fP - \nBitmask flags made up of LIBSSH2_SFTP_RENAME_* constants.\n\nRename a filesystem object on the remote filesystem. The semantics of \nthis command typically include the ability to move a filesystem object \nbetween folders and/or filesystem mounts. If the LIBSSH2_SFTP_RENAME_OVERWRITE \nflag is not set and the destfile entry already exists, the operation \nwill fail. Use of the other two flags indicate a preference (but not a \nrequirement) for the remote end to perform an atomic rename operation \nand/or using native system calls when possible.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to \nbe returned by the server.\n\n.SH SEE ALSO\n.BR libssh2_sftp_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_rewind.3",
    "content": ".TH libssh2_sftp_rewind 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_rewind - convenience macro for \\fIlibssh2_sftp_seek64(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_rewind(LIBSSH2_SFTP_HANDLE *handle);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_seek64(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_seek64(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_seek64(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_seek64(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_rmdir.3",
    "content": ".TH libssh2_sftp_rmdir 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_rmdir - convenience macro for \\fIlibssh2_sftp_rmdir_ex(3)\\fP\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\n#define libssh2_sftp_rmdir(sftp, path) \\\\\n    libssh2_sftp_rmdir_ex((sftp), (path), strlen(path))\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_rmdir_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_rmdir_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_rmdir_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_rmdir_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_rmdir_ex.3",
    "content": ".TH libssh2_sftp_rmdir_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_rmdir_ex - remove an SFTP directory\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint libssh2_sftp_rmdir_ex(LIBSSH2_SFTP *sftp, const char *path,\n                          unsigned int path_len);\n.SH DESCRIPTION\nRemove a directory from the remote file system.\n\n\\fIsftp\\fP - SFTP instance as returned by \n.BR libssh2_sftp_init(3)\n\n\\fIsourcefile\\fP - Full path of the existing directory to remove.\n\n\\fIsourcefile_len\\fP - Length of the full path of the existing directory to\nremove.\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to \nbe returned by the server.\n.SH SEE ALSO\n.BR libssh2_sftp_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_seek.3",
    "content": ".TH libssh2_sftp_seek 3 \"22 Dec 2008\" \"libssh2 1.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_seek - set the read/write position indicator within a file\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nvoid libssh2_sftp_seek(LIBSSH2_SFTP_HANDLE *handle, size_t offset);\n.SH DESCRIPTION\nDeprecated function. Use \\fIlibssh2_sftp_seek64(3)\\fP instead!\n\n\\fIhandle\\fP - SFTP File Handle as returned by \n.BR libssh2_sftp_open_ex(3)\n\n\\fIoffset\\fP - Number of bytes from the beginning of file to seek to.\n\nMove the file handle's internal pointer to an arbitrary location. \nNote that libssh2 implements file pointers as a localized concept to make \nfile access appear more POSIX like. No packets are exchanged with the server \nduring a seek operation. The localized file pointer is simply used as a \nconvenience offset during read/write operations.\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3),\n.BR libssh2_sftp_seek64(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_seek64.3",
    "content": ".TH libssh2_sftp_seek64 3 \"22 Dec 2008\" \"libssh2 1.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_seek64 - set the read/write position within a file\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nvoid libssh2_sftp_seek64(LIBSSH2_SFTP_HANDLE *handle,\n                         libssh2_uint64_t offset);\n.SH DESCRIPTION\n\\fIhandle\\fP - SFTP File Handle as returned by \n.BR libssh2_sftp_open_ex(3)\n\n\\fIoffset\\fP - Number of bytes from the beginning of file to seek to.\n\nMove the file handle's internal pointer to an arbitrary location. libssh2\nimplements file pointers as a localized concept to make file access appear\nmore POSIX like. No packets are exchanged with the server during a seek\noperation. The localized file pointer is simply used as a convenience offset\nduring read/write operations.\n\nYou MUST NOT seek during writing or reading a file with SFTP, as the internals\nuse outstanding packets and changing the \"file position\" during transit will\nresults in badness.\n.SH AVAILABILITY\nAdded in 1.0\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_setstat.3",
    "content": ".TH libssh2_sftp_setstat 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_setstat - convenience macro for \\fIlibssh2_sftp_stat_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_setstat(LIBSSH2_SFTP *sftp, const char *path, LIBSSH2_SFTP_ATTRIBUTES *attr);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_stat_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_stat_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_stat_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_stat_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_shutdown.3",
    "content": ".TH libssh2_sftp_shutdown 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_shutdown - shut down an SFTP session\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint \nlibssh2_sftp_shutdown(LIBSSH2_SFTP *sftp);\n\n.SH DESCRIPTION\n\\fIsftp\\fP - SFTP instance as returned by \n.BR libssh2_sftp_init(3)\n\nDestroys a previously initialized SFTP session and frees all resources \nassociated with it.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH SEE ALSO\n.BR libssh2_sftp_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_stat.3",
    "content": ".TH libssh2_sftp_stat 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_stat - convenience macro for \\fIlibssh2_sftp_fstat_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_stat(LIBSSH2_SFTP *sftp, const char *path, LIBSSH2_SFTP_ATTRIBUTES *attrs);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_fstat_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_fstat_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_fstat_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_fstat_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_stat_ex.3",
    "content": ".TH libssh2_sftp_stat_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_stat_ex - get status about an SFTP file\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint libssh2_sftp_stat_ex(LIBSSH2_SFTP *sftp, const char *path,\n                         unsigned int path_len, int stat_type,\n                         LIBSSH2_SFTP_ATTRIBUTES *attrs);\n.SH DESCRIPTION\n\\fIsftp\\fP - SFTP instance as returned by \n.BR libssh2_sftp_init(3)\n\n\\fIpath\\fP - Remote filesystem object to stat/lstat/setstat.\n\n\\fIpath_len\\fP - Length of the name of the remote filesystem object \nto stat/lstat/setstat.\n\n\\fIstat_type\\fP - One of the three constants specifying the type of \nstat operation to perform:\n\n.br\n\\fBLIBSSH2_SFTP_STAT\\fP: performs stat(2) operation\n.br\n\\fBLIBSSH2_SFTP_LSTAT\\fP: performs lstat(2) operation\n.br\n\\fBLIBSSH2_SFTP_SETSTAT\\fP: performs operation to set stat info on file\n\n\\fIattrs\\fP - Pointer to a \\fBLIBSSH2_SFTP_ATTRIBUTES\\fP structure to set file\nmetadata from or into depending on the value of stat_type.\n\nGet or Set statbuf type data on a remote filesystem object. When getting\nstatbuf data,\n.BR libssh2_sftp_stat(3)\nwill follow all symlinks, while \n.BR libssh2_sftp_lstat(3)\nwill return data about the object encountered, even if that object \nhappens to be a symlink.\n\nThe LIBSSH2_SFTP_ATTRIBUTES struct looks like this:\n\n.nf\nstruct LIBSSH2_SFTP_ATTRIBUTES {\n    /* If flags & ATTR_* bit is set, then the value in this struct will be\n     * meaningful Otherwise it should be ignored\n     */\n    unsigned long flags;\n\n    libssh2_uint64_t filesize;\n    unsigned long uid;\n    unsigned long gid;\n    unsigned long permissions;\n    unsigned long atime;\n    unsigned long mtime;\n};\n.fi\n.SH RETURN VALUE\nReturns 0 on success or negative on failure.  It returns LIBSSH2_ERROR_EAGAIN\nwhen it would otherwise block. While LIBSSH2_ERROR_EAGAIN is a negative\nnumber, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to \nbe returned by the server.\n.SH SEE ALSO\n.BR libssh2_sftp_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_statvfs.3",
    "content": ".TH libssh2_sftp_statvfs 3 \"22 May 2010\" \"libssh2 1.2.6\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_statvfs, libssh2_sftp_fstatvfs - get file system statistics\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint\nlibssh2_sftp_statvfs(LIBSSH2_SFTP *sftp, const char *path,\n                     size_t path_len, LIBSSH2_SFTP_STATVFS *st);\n\nint\nlibssh2_sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle,\n                      LIBSSH2_SFTP_STATVFS *st)\n.fi\n.SH DESCRIPTION\nThese functions provide statvfs(2)-like operations and require\nstatvfs@openssh.com and fstatvfs@openssh.com extension support on the server.\n\n\\fIsftp\\fP - SFTP instance as returned by\n.BR libssh2_sftp_init(3)\n\n\\fIhandle\\fP - SFTP File Handle as returned by\n.BR libssh2_sftp_open_ex(3)\n\n\\fIpath\\fP - full path of any file within the mounted file system.\n\n\\fIpath_len\\fP - length of the full path.\n\n\\fIst\\fP - Pointer to a LIBSSH2_SFTP_STATVFS structure to place file system\nstatistics into.\n\n.SH DATA TYPES\nLIBSSH2_SFTP_STATVFS is a typedefed struct that is defined as below\n\n.nf\nstruct _LIBSSH2_SFTP_STATVFS {\n    libssh2_uint64_t  f_bsize;    /* file system block size */\n    libssh2_uint64_t  f_frsize;   /* fragment size */\n    libssh2_uint64_t  f_blocks;   /* size of fs in f_frsize units */\n    libssh2_uint64_t  f_bfree;    /* # free blocks */\n    libssh2_uint64_t  f_bavail;   /* # free blocks for non-root */\n    libssh2_uint64_t  f_files;    /* # inodes */\n    libssh2_uint64_t  f_ffree;    /* # free inodes */\n    libssh2_uint64_t  f_favail;   /* # free inodes for non-root */\n    libssh2_uint64_t  f_fsid;     /* file system ID */\n    libssh2_uint64_t  f_flag;     /* mount flags */\n    libssh2_uint64_t  f_namemax;  /* maximum filename length */\n};\n.fi\n\nIt is unspecified whether all members of the returned struct have meaningful\nvalues on all file systems.\n\nThe field \\fIf_flag\\fP is a bit mask. Bits are defined as follows:\n.IP LIBSSH2_SFTP_ST_RDONLY\nRead-only file system.\n.IP LIBSSH2_SFTP_ST_NOSUID\nSet-user-ID/set-group-ID bits are ignored by \\fBexec\\fP(3).\n\n.SH RETURN VALUE\nReturns 0 on success or negative on failure. If used in non-blocking mode, it\nreturns LIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was\nreceived on the socket, or an SFTP operation caused an errorcode to be returned\nby the server.\n.SH AVAILABILITY\nAdded in libssh2 1.2.6\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_symlink.3",
    "content": ".TH libssh2_sftp_symlink 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_symlink - convenience macro for \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\n#define libssh2_sftp_symlink(sftp, orig, linkpath) \\\\\n    libssh2_sftp_symlink_ex((sftp), (orig), strlen(orig), (linkpath), \\\\\n                            strlen(linkpath), LIBSSH2_SFTP_SYMLINK)\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_symlink_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_symlink_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_symlink_ex.3",
    "content": ".TH libssh2_sftp_symlink_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_symlink_ex - read or set a symbolic link\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint \nlibssh2_sftp_symlink_ex(LIBSSH2_SFTP *sftp, const char *path,\n                        unsigned int path_len, char *target,\n                        unsigned int target_len, int link_type);\n.SH DESCRIPTION\nCreate a symlink or read out symlink information from the remote side.\n\n\\fIsftp\\fP - SFTP instance as returned by \n.BR libssh2_sftp_init(3)\n\n\\fIpath\\fP - Remote filesystem object to create a symlink from or resolve.\n\n\\fIpath_len\\fP - Length of the name of the remote filesystem object to \ncreate a symlink from or resolve.\n\n\\fItarget\\fP - a pointer to a buffer. The buffer has different uses depending\nwhat the \\fIlink_type\\fP argument is set to.\n.br\n\\fBLIBSSH2_SFTP_SYMLINK\\fP: Remote filesystem object to link to.\n.br\n\\fBLIBSSH2_SFTP_READLINK\\fP: Pre-allocated buffer to resolve symlink target\ninto.\n.br\n\\fBLIBSSH2_SFTP_REALPATH\\fP: Pre-allocated buffer to resolve realpath target\ninto.\n\n\\fItarget_len\\fP - Length of the name of the remote filesystem target object.\n\n\\fIlink_type\\fP - One of the three previously mentioned constants which \ndetermines the resulting behavior of this function.\n\nThese are convenience macros:\n\n.BR libssh2_sftp_symlink(3)\n: Create a symbolic link between two filesystem objects.\n.br\n.BR libssh2_sftp_readlink(3)\n: Resolve a symbolic link filesystem object to its next target.\n.br\n.BR libssh2_sftp_realpath(3)\n: Resolve a complex, relative, or symlinked filepath to its effective target.\n.SH RETURN VALUE\nWhen using LIBSSH2_SFTP_SYMLINK, this function returns 0 on success or negative\non failure.\n\nWhen using LIBSSH2_SFTP_READLINK or LIBSSH2_SFTP_REALPATH, it returns the\nnumber of bytes it copied to the target buffer (not including the terminating\nzero) or negative on failure.\n\nIt returns LIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\nFrom 1.2.8, LIBSSH2_ERROR_BUFFER_TOO_SMALL is returned if the given 'target'\nbuffer is too small to fit the requested object name.\n.SH BUG\nPassing in a too small buffer when receiving data only results in libssh2\n1.2.7 or earlier to not copy the entire data amount, and it is not possible\nfor the application to tell when it happens!\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to \nbe returned by the server.\n\n.SH SEE ALSO\n.BR libssh2_sftp_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_tell.3",
    "content": ".TH libssh2_sftp_tell 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_tell - get the current read/write position indicator for a file\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nsize_t \nlibssh2_sftp_tell(LIBSSH2_SFTP_HANDLE *handle);\n\n.SH DESCRIPTION\n\\fIhandle\\fP - SFTP File Handle as returned by \\fBlibssh2_sftp_open_ex(3)\\fP.\n\nReturns the current offset of the file handle's internal pointer. Note that\nthis is now deprecated. Use the newer \\fBlibssh2_sftp_tell64(3)\\fP instead!\n.SH RETURN VALUE\nCurrent offset from beginning of file in bytes.\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3),\n.BR libssh2_sftp_tell64(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_tell64.3",
    "content": ".TH libssh2_sftp_tell64 3 \"22 Dec 2008\" \"libssh2 1.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_tell64 - get the current read/write position indicator for a file\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nlibssh2_uint64_t\nlibssh2_sftp_tell64(LIBSSH2_SFTP_HANDLE *handle);\n\n.SH DESCRIPTION\n\\fIhandle\\fP - SFTP File Handle as returned by \\fBlibssh2_sftp_open_ex(3)\\fP\n\nIdentify the current offset of the file handle's internal pointer.\n.SH RETURN VALUE\nCurrent offset from beginning of file in bytes.\n.SH AVAILABILITY\nAdded in libssh2 1.0\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3),\n.BR libssh2_sftp_tell(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_unlink.3",
    "content": ".TH libssh2_sftp_unlink 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_unlink - convenience macro for \\fIlibssh2_sftp_unlink_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_unlink(LIBSSH2_SFTP *sftp, const char *filename);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_unlink_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_unlink_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_unlink_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_unlink_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_unlink_ex.3",
    "content": ".TH libssh2_sftp_unlink_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_unlink_ex - unlink an SFTP file\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint \nlibssh2_sftp_unlink_ex(LIBSSH2_SFTP *sftp, const char *filename, unsigned int filename_len);\n\nint \nlibssh2_sftp_unlink(LIBSSH2_SFTP *sftp, const char *filename);\n\n.SH DESCRIPTION\n\\fIsftp\\fP - SFTP instance as returned by \n.BR libssh2_sftp_init(3)\n\n\\fIfilename\\fP - Path and name of the existing filesystem entry\n\n\\fIfilename_len\\fP - Length of the path and name of the existing \nfilesystem entry\n\nUnlink (delete) a file from the remote filesystem.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to \nbe returned by the server.\n\n.SH SEE ALSO\n.BR libssh2_sftp_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_sftp_write.3",
    "content": ".TH libssh2_sftp_write 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_write - write SFTP data\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nssize_t libssh2_sftp_write(LIBSSH2_SFTP_HANDLE *handle,\n                           const char *buffer,\n                           size_t count);\n.SH DESCRIPTION\n\\fBlibssh2_sftp_write(3)\\fP writes a block of data to the SFTP server. This\nmethod is modeled after the POSIX write() function and uses the same calling\nsemantics.\n\n\\fIhandle\\fP - SFTP file handle as returned by \\fIlibssh2_sftp_open_ex(3)\\fP.\n\n\\fIbuffer\\fP - points to the data to send off.\n\n\\fIcount\\fP - Number of bytes from 'buffer' to write. Note that it may not be\npossible to write all bytes as requested.\n\n\\fIlibssh2_sftp_handle(3)\\fP will use as much as possible of the buffer and\nput it into a single SFTP protocol packet. This means that to get maximum\nperformance when sending larger files, you should try to always pass in at\nleast 32K of data to this function.\n\n.SH WRITE AHEAD\nStarting in libssh2 version 1.2.8, the default behavior of libssh2 is to\ncreate several smaller outgoing packets for all data you pass to this function\nand it will return a positive number as soon as the first packet is\nacknowledged from the server.\n\nThis has the effect that sometimes more data has been sent off but isn't acked\nyet when this function returns, and when this function is subsequently called\nagain to write more data, libssh2 will immediately figure out that the data is\nalready received remotely.\n\nIn most normal situation this should not cause any problems, but it should be\nnoted that if you've once called libssh2_sftp_write() with data and it returns\nshort, you MUST still assume that the rest of the data might've been cached so\nyou need to make sure you don't alter that data and think that the version you\nhave in your next function invoke will be detected or used.\n\nThe reason for this funny behavior is that SFTP can only send 32K data in each\npacket and it gets all packets acked individually. This means we cannot use a\nsimple serial approach if we want to reach high performance even on high\nlatency connections. And we want that.\n.SH RETURN VALUE\nActual number of bytes written or negative on failure.\n\nIf used in non-blocking mode, it returns LIBSSH2_ERROR_EAGAIN when it would\notherwise block. While LIBSSH2_ERROR_EAGAIN is a negative number, it isn't\nreally a failure per se.\n\nIf this function returns 0 (zero) it should not be considered an error, but\nsimply that there was no error but yet no payload data got sent to the other\nend.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to \nbe returned by the server.\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_trace.3",
    "content": ".TH libssh2_trace 3 \"26 Dec 2008\" \"libssh2 1.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_trace - enable debug info from inside libssh2\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid libssh2_trace(LIBSSH2_SESSION *session, int bitmask);\n\n.SH DESCRIPTION\nThis is a function present in the library that can be used to get debug info\nfrom within libssh2 when it is running. Helpful when trying to trace or debug\nbehaviors. Note that this function has no effect unless libssh2 was built to\nsupport tracing! It is usually disabled in release builds.\n\n\\fBbitmask\\fP can be set to the logical OR of none, one or more of these:\n.RS\n.IP LIBSSH2_TRACE_SOCKET\nSocket low-level debugging\n.IP LIBSSH2_TRACE_TRANS\nTransport layer debugging\n.IP LIBSSH2_TRACE_KEX\nKey exchange debugging\n.IP LIBSSH2_TRACE_AUTH\nAuthentication debugging\n.IP LIBSSH2_TRACE_CONN\nConnection layer debugging\n.IP LIBSSH2_TRACE_SCP\nSCP debugging\n.IP LIBSSH2_TRACE_SFTP\nSFTP debugging\n.IP LIBSSH2_TRACE_ERROR\nError debugging\n.IP LIBSSH2_TRACE_PUBLICKEY\nPublic Key debugging\n.RE\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_trace_sethandler.3",
    "content": ".TH libssh2_trace_sethandler 3 \"15 Jan 2010\" \"libssh2 1.2.3\" \"libssh2 manual\"\n.SH NAME\nlibssh2_trace_sethandler - set a trace output handler\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\ntypedef void (*libssh2_trace_handler_func)(LIBSSH2_SESSION *session,\n                                           void* context,\n                                           const char *data,\n                                           size_t length);\n\nint libssh2_trace_sethandler(LIBSSH2_SESSION *session,\n                             void* context,\n                             libssh2_trace_handler_func callback);\n.SH DESCRIPTION\nlibssh2_trace_sethandler installs a trace output handler for your application.\nBy default, when tracing has been switched on via a call to libssh2_trace(),\nall output is written to stderr.  By calling this method and passing a\nfunction pointer that matches the libssh2_trace_handler_func prototype,\nlibssh2 will call back as it generates trace output.  This can be used to\ncapture the trace output and put it into a log file or diagnostic window.\nThis function has no effect unless libssh2 was built to support this option,\nand a typical \"release build\" might not.\n\n\\fBcontext\\fP can be used to pass arbitrary user defined data back into the callback when invoked.\n.SH AVAILABILITY\nAdded in libssh2 version 1.2.3\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_userauth_authenticated.3",
    "content": ".TH libssh2_userauth_authenticated 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_authenticated - return authentication status\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_userauth_authenticated(LIBSSH2_SESSION *session);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\nIndicates whether or not the named session has been successfully authenticated.\n\n.SH RETURN VALUE\nReturns 1 if authenticated and 0 if not.\n\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_userauth_hostbased_fromfile.3",
    "content": ".TH libssh2_userauth_hostbased_fromfile 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_hostbased_fromfile - convenience macro for \\fIlibssh2_userauth_hostbased_fromfile_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_userauth_hostbased_fromfile(LIBSSH2_SESSION *session, const char *username, const char *publickey, const char *privatekey, const char *passphrase, const char *hostname);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_userauth_hostbased_fromfile_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_userauth_hostbased_fromfile_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_userauth_hostbased_fromfile_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_userauth_hostbased_fromfile_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_userauth_hostbased_fromfile_ex.3",
    "content": ".TH libssh2_userauth_hostbased_fromfile_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_hostbased_fromfile_ex - TODO\n.SH SYNOPSIS\n\n.SH DESCRIPTION\n\n.SH RETURN VALUE\n\n.SH ERRORS\n\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_userauth_keyboard_interactive.3",
    "content": ".TH libssh2_userauth_keyboard_interactive 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_keyboard_interactive - convenience macro for \\fIlibssh2_userauth_keyboard_interactive_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n.nf\n\nint\nlibssh2_userauth_keyboard_interactive(LIBSSH2_SESSION* session,\n                                      const char *username,\n           LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC((*response_callback)));\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_userauth_keyboard_interactive_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_userauth_keyboard_interactive_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_userauth_keyboard_interactive_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_userauth_keyboard_interactive_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_userauth_keyboard_interactive_ex.3",
    "content": ".TH libssh2_userauth_keyboard_interactive_ex 3 \"8 Mar 2008\" \"libssh2 0.19\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_keyboard_interactive_ex - authenticate a session using\nkeyboard-interactive authentication\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nint\nlibssh2_userauth_keyboard_interactive_ex(LIBSSH2_SESSION *session,\n                                         const char *username,\n                                         unsigned int username_len,\n            LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC(*response_callback));\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by\n\\fIlibssh2_session_init_ex(3)\\fP.\n\n\\fIusername\\fP - Name of user to attempt keyboard-interactive authentication\nfor.\n\n\\fIusername_len\\fP - Length of username parameter.\n\n\\fIresponse_callback\\fP - As authentication proceeds, the host issues several\n(1 or more) challenges and requires responses. This callback will be called at\nthis moment. The callback is responsible to obtain responses for the\nchallenges, fill the provided data structure and then return\ncontrol. Responses will be sent to the host. String values will be free(3)ed\nby the library. The callback prototype must match this:\n\n.nf\n void response(const char *name,\n               int name_len, const char *instruction,\n               int instruction_len,\n               int num_prompts,\n               const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,\n               LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses,\n               void **abstract);\n.fi\n\nAttempts keyboard-interactive (challenge/response) authentication.\n\nNote that many SSH servers will always issue a single \"password\" challenge,\nrequesting actual password as response, but it is not required by the\nprotocol, and various authentication schemes, such as smartcard authentication\nmay use keyboard-interactive authentication type too.\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns LIBSSH2_ERROR_EAGAIN\nwhen it would otherwise block. While LIBSSH2_ERROR_EAGAIN is a negative\nnumber, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fLIBSSH2_ERROR_AUTHENTICATION_FAILED\\fP - failed, invalid username/password\nor public/private key.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_userauth_list.3",
    "content": ".TH libssh2_userauth_list 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_list - list supported authentication methods\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nchar *\nlibssh2_userauth_list(LIBSSH2_SESSION *session, const char *username,\n                      unsigned int username_len);\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIusername\\fP - Username which will be used while authenticating. Note that\nmost server implementations do not permit attempting authentication with\ndifferent usernames between requests. Therefore this must be the same username\nyou will use on later userauth calls.\n\n\\fIusername_len\\fP - Length of username parameter.\n\nSend a \\fBSSH_USERAUTH_NONE\\fP request to the remote host. Unless the remote\nhost is configured to accept none as a viable authentication scheme\n(unlikely), it will return \\fBSSH_USERAUTH_FAILURE\\fP along with a listing of\nwhat authentication schemes it does support. In the unlikely event that none\nauthentication succeeds, this method with return NULL. This case may be\ndistinguished from a failing case by examining\n\\fIlibssh2_userauth_authenticated(3)\\fP.\n.SH RETURN VALUE\nOn success a comma delimited list of supported authentication schemes.  This\nlist is internally managed by libssh2.  On failure returns NULL.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_userauth_password.3",
    "content": ".TH libssh2_userauth_password 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_password - convenience macro for \\fIlibssh2_userauth_password_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_userauth_password(LIBSSH2_SESSION *session,\n                              const char *username,\n                              const char *password);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_userauth_password_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_userauth_password_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_userauth_password_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_userauth_password_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_userauth_password_ex.3",
    "content": ".TH libssh2_userauth_password_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_password_ex - authenticate a session with username and password\n.SH SYNOPSIS\n#include <libssh2.h>\n.nf\nint libssh2_userauth_password_ex(LIBSSH2_SESSION *session,\n                    const char *username,\n                    unsigned int username_len,\n                    const char *password,\n                    unsigned int password_len,\n                    LIBSSH2_PASSWD_CHANGEREQ_FUNC((*passwd_change_cb)));\n\n#define libssh2_userauth_password(session, username, password) \\\\\n libssh2_userauth_password_ex((session), (username), \\\\\n                              strlen(username), \\\\\n                              (password), strlen(password), NULL)\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIusername\\fP - Name of user to attempt plain password authentication for.\n\n\\fIusername_len\\fP - Length of username parameter.\n\n\\fIpassword\\fP - Password to use for authenticating username.\n\n\\fIpassword_len\\fP - Length of password parameter.\n\n\\fIpasswd_change_cb\\fP - If the host accepts authentication but \nrequests that the password be changed, this callback will be issued. \nIf no callback is defined, but server required password change, \nauthentication will fail.\n\nAttempt basic password authentication. Note that many SSH servers \nwhich appear to support ordinary password authentication actually have \nit disabled and use Keyboard Interactive authentication (routed via \nPAM or another authentication backed) instead.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\nSome of the errors this function may return include:\n\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_PASSWORD_EXPIRED\\fP - \n\n\\fLIBSSH2_ERROR_AUTHENTICATION_FAILED\\fP - failed, invalid username/password\nor public/private key.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_userauth_publickey.3",
    "content": ".TH libssh2_userauth_publickey 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_publickey - authenticate using a callback function\n.SH SYNOPSIS\n#include <libssh2.h>\n\n.nf\nint libssh2_userauth_publickey(LIBSSH2_SESSION *session,\n                               const char *user,\n                               const unsigned char *pubkeydata,\n                               size_t pubkeydata_len,\n                               sign_callback,\n                               void **abstract);\n.SH DESCRIPTION\nAuthenticate with the \\fIsign_callback\\fP callback that matches the prototype\nbelow\n.SH CALLBACK\n.nf\nint name(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len,\n         const unsigned char *data, size_t data_len, void **abstract);\n.fi\n\nThis function gets called...\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.\n.SH SEE ALSO\n.BR libssh2_userauth_publickey_fromfile_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_userauth_publickey_fromfile.3",
    "content": ".TH libssh2_userauth_publickey_fromfile 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_publickey_fromfile - convenience macro for \\fIlibssh2_userauth_publickey_fromfile_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_userauth_publickey_fromfile(LIBSSH2_SESSION *session,\n                                    const char *username,\n                                    const char *publickey,\n                                    const char *privatekey,\n                                    const char *passphrase);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_userauth_publickey_fromfile_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_userauth_publickey_fromfile_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_userauth_publickey_fromfile_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_userauth_publickey_fromfile_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_userauth_publickey_fromfile_ex.3",
    "content": ".TH libssh2_userauth_publickey_fromfile 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_publickey_fromfile - authenticate a session with a public key, read from a file\n.SH SYNOPSIS\n#include <libssh2.h>\n\n.nf\nint libssh2_userauth_publickey_fromfile_ex(LIBSSH2_SESSION *session,\n                                           const char *username,\n                                           unsigned int ousername_len,\n                                           const char *publickey,\n                                           const char *privatekey,\n                                           const char *passphrase);\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by\n\\fBlibssh2_session_init_ex(3)\\fP\n\n\\fIusername\\fP - Pointer to user name to authenticate as.\n\n\\fIusername_len\\fP - Length of \\fIusername\\fP.\n\n\\fIpublickey\\fP - Path name of the public key file.\n(e.g. /etc/ssh/hostkey.pub). If libssh2 is built against OpenSSL, this option\ncan be set to NULL.\n\n\\fIprivatekey\\fP - Path name of the private key file. (e.g. /etc/ssh/hostkey)\n\n\\fIpassphrase\\fP - Passphrase to use when decoding \\fIprivatekey\\fP.\n\nAttempt public key authentication using a PEM encoded private key file stored\non disk\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_PUBLICKEY_UNVERIFIED\\fP - The username/public key\ncombination was invalid.\n\n\\fILIBSSH2_ERROR_AUTHENTICATION_FAILED\\fP - Authentication using the supplied\npublic key was not accepted.\n\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_userauth_publickey_frommemory.3",
    "content": ".TH libssh2_userauth_publickey_frommemory 3 \"1 Sep 2014\" \"libssh2 1.5\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_publickey_frommemory - authenticate a session with a public key, read from memory\n.SH SYNOPSIS\n#include <libssh2.h>\n\n.nf\nint libssh2_userauth_publickey_frommemory(LIBSSH2_SESSION *session,\n                                           const char *username,\n                                           size_t username_len,\n                                           const char *publickeydata,\n                                           size_t publickeydata_len,\n                                           const char *privatekeydata,\n                                           size_t privatekeydata_len,\n                                           const char *passphrase);\n.SH DESCRIPTION\nThis function allows to authenticate a session with a public key read from memory.\nIt's only supported when libssh2 is backed by OpenSSL.\n\\fIsession\\fP - Session instance as returned by\n.BR libssh2_session_init_ex(3)\n\n\\fIusername\\fP - Remote user name to authenticate as.\n\n\\fIusername_len\\fP - Length of username.\n\n\\fIpublickeydata\\fP - Buffer containing the contents of a public key file.\n\n\\fIpublickeydata_len\\fP - Length of public key data.\n\n\\fIprivatekeydata\\fP - Buffer containing the contents of a private key file.\n\n\\fIprivatekeydata_len\\fP - Length of private key data.\n\n\\fIpassphrase\\fP - Passphrase to use when decoding private key file.\n\nAttempt public key authentication using a PEM encoded private key file stored in memory.\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_PUBLICKEY_UNVERIFIED\\fP - The username/public key\ncombination was invalid.\n\n\\fILIBSSH2_ERROR_AUTHENTICATION_FAILED\\fP - Authentication using the supplied\npublic key was not accepted.\n.SH AVAILABILITY\nlibssh2_userauth_publickey_frommemory was added in libssh2 1.6.0\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/libssh2_version.3",
    "content": ".TH libssh2_version 3 \"23 Feb 2009\" \"libssh2 1.1\" \"libssh2 manual\"\n.SH NAME\nlibssh2_version - return the libssh2 version number\n.SH SYNOPSIS\n#include <libssh2.h>\n\nconst char *\nlibssh2_version(int required_version);\n.SH DESCRIPTION\nIf \\fIrequired_version\\fP is lower than or equal to the version number of the\nlibssh2 in use, the version number of libssh2 is returned as a pointer to a\nzero terminated string.\n\nThe \\fIrequired_version\\fP should be the version number as constructed by the\nLIBSSH2_VERSION_NUM define in the libssh2.h public header file, which is a 24\nbit number in the 0xMMmmpp format. MM for major, mm for minor and pp for patch\nnumber.\n.SH RETURN VALUE\nThe version number of libssh2 is returned as a pointer to a zero terminated\nstring or NULL if the \\fIrequired_version\\fP isn't fulfilled.\n.SH EXAMPLE\nTo make sure you run with the correct libssh2 version:\n\n.nf\nif (!libssh2_version(LIBSSH2_VERSION_NUM)) {\n  fprintf (stderr, \\&\"Runtime libssh2 version too old!\\&\");\n  exit(1);\n}\n.fi\n\nUnconditionally get the version number:\n\nprintf(\\&\"libssh2 version: %s\\&\", libssh2_version(0) );\n.SH AVAILABILITY\nThis function was added in libssh2 1.1, in previous versions there way no way\nto extract this info in run-time.\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/docs/template.3",
    "content": ".TH libssh2_template 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_template - short function description\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid \nlibssh2_template(void);\n\n.SH DESCRIPTION\nLong text describing the function and its input arguments.\n\n.SH RETURN VALUE\nDescribe what the function returns.\n\n.SH ERRORS\nAdd error codes\n\n.SH SEE ALSO\nAdd related functions\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/.gitignore",
    "content": "Makefile\nMakefile.in\n*.gcno\n*.gcda\ndirect_tcpip\nscp\nscp_nonblock\nscp_write\nscp_write_nonblock\nsftp\nsftp_nonblock\nsftpdir\nsftpdir_nonblock\nssh2\nsftp_RW_nonblock\nsftp_mkdir\nsftp_mkdir_nonblock\nsftp_write\nsftp_write_nonblock\nconfig.h.in\nssh2_exec\nssh2_agent\nlibssh2_config.h\nlibssh2_config.h.in\nstamp-h2\nsftp_append\nsftp_write_sliding\nssh2_echo\nsubsystem_netconf\ntest-scp\ntest-sftp_append\ntest-sftp_nonblock\ntest-sftp_write\ntest-sftp_write_nonblock\ntest-ssh2_echo\ntcpip-forward\nx11\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/CMakeLists.txt",
    "content": "# Copyright (c) 2014, 2015 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\ninclude(CheckIncludeFiles)\ninclude(CheckSymbolExists)\ninclude(CopyRuntimeDependencies)\ninclude(SocketLibraries)\n\nset(EXAMPLES\n  direct_tcpip\n  ssh2\n  scp\n  scp_nonblock\n  scp_write\n  scp_write_nonblock\n  sftp\n  sftp_nonblock\n  sftp_write\n  sftp_write_nonblock\n  sftp_mkdir\n  sftp_mkdir_nonblock\n  sftp_RW_nonblock\n  sftp_write_sliding\n  sftpdir\n  sftpdir_nonblock\n  ssh2_exec\n  ssh2_agent\n  ssh2_echo\n  sftp_append\n  subsystem_netconf\n  tcpip-forward)\n\nappend_needed_socket_libraries(LIBRARIES)\n\nforeach(example ${EXAMPLES})\n  add_executable(example-${example} ${example}.c)\n  list(APPEND EXAMPLE_TARGETS example-${example})\n  # to find generated header\n  target_include_directories(example-${example} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})\n  target_link_libraries(example-${example} libssh2 ${LIBRARIES})\nendforeach()\nadd_target_to_copy_dependencies(\n  TARGET copy_example_dependencies\n  DEPENDENCIES ${RUNTIME_DEPENDENCIES}\n  BEFORE_TARGETS ${EXAMPLE_TARGETS})\n\n## Platform checks\ncheck_include_files(inttypes.h HAVE_INTTYPES_H)\ncheck_include_files(unistd.h HAVE_UNISTD_H)\ncheck_include_files(stdlib.h HAVE_STDLIB_H)\ncheck_include_files(sys/select.h HAVE_SYS_SELECT_H)\ncheck_include_files(sys/socket.h HAVE_SYS_SOCKET_H)\ncheck_include_files(sys/time.h HAVE_SYS_TIME_H)\ncheck_include_files(arpa/inet.h HAVE_ARPA_INET_H)\ncheck_include_files(netinet/in.h HAVE_NETINET_IN_H)\ncheck_include_files(winsock2.h HAVE_WINSOCK2_H)\n\ncheck_symbol_exists(strcasecmp strings.h HAVE_STRCASECMP)\ncheck_symbol_exists(_stricmp string.h HAVE__STRICMP)\ncheck_symbol_exists(snprintf stdio.h HAVE_SNPRINTF)\ncheck_symbol_exists(_snprintf stdio.h HAVE__SNPRINTF)\n\ncheck_symbol_exists(__func__ \"\" HAVE___FUNC__)\ncheck_symbol_exists(__FUNCTION__ \"\" HAVE___FUNCTION__)\n\nconfigure_file(\n  ${CMAKE_CURRENT_SOURCE_DIR}/libssh2_config_cmake.h.in\n  ${CMAKE_CURRENT_BINARY_DIR}/libssh2_config.h)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/Makefile.am",
    "content": "AUTOMAKE_OPTIONS = foreign nostdinc\n\nEXTRA_DIST = libssh2_config.h.in libssh2_config_cmake.h.in CMakeLists.txt\n\n# samples\nnoinst_PROGRAMS = direct_tcpip ssh2 scp scp_nonblock scp_write\t\t\\\n scp_write_nonblock sftp sftp_nonblock sftp_write sftp_write_nonblock\t\\\n sftp_mkdir sftp_mkdir_nonblock sftp_RW_nonblock sftp_write_sliding\t\\\n sftpdir sftpdir_nonblock ssh2_exec ssh2_agent ssh2_echo sftp_append\t\\\n subsystem_netconf tcpip-forward\n\nif HAVE_SYS_UN_H\nnoinst_PROGRAMS += x11\nendif\n\nAM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/example\nLDADD = $(top_builddir)/src/libssh2.la\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/direct_tcpip.c",
    "content": "#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef WIN32\n#include <windows.h>\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#else\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <sys/time.h>\n#endif\n\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#include <sys/types.h>\n#ifdef HAVE_SYS_SELECT_H\n#include <sys/select.h>\n#endif\n\n#ifndef INADDR_NONE\n#define INADDR_NONE (in_addr_t)-1\n#endif\n\nconst char *keyfile1 = \"/home/username/.ssh/id_rsa.pub\";\nconst char *keyfile2 = \"/home/username/.ssh/id_rsa\";\nconst char *username = \"username\";\nconst char *password = \"\";\n\nconst char *server_ip = \"127.0.0.1\";\n\nconst char *local_listenip = \"127.0.0.1\";\nunsigned int local_listenport = 2222;\n\nconst char *remote_desthost = \"localhost\"; /* resolved by the server */\nunsigned int remote_destport = 22;\n\nenum {\n    AUTH_NONE = 0,\n    AUTH_PASSWORD,\n    AUTH_PUBLICKEY\n};\n\nint main(int argc, char *argv[])\n{\n    int rc, i, auth = AUTH_NONE;\n    struct sockaddr_in sin;\n    socklen_t sinlen;\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel = NULL;\n    const char *shost;\n    unsigned int sport;\n    fd_set fds;\n    struct timeval tv;\n    ssize_t len, wr;\n    char buf[16384];\n\n#ifdef WIN32\n    char sockopt;\n    SOCKET sock = INVALID_SOCKET;\n    SOCKET listensock = INVALID_SOCKET, forwardsock = INVALID_SOCKET;\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#else\n    int sockopt, sock = -1;\n    int listensock = -1, forwardsock = -1;\n#endif\n\n    if (argc > 1)\n        server_ip = argv[1];\n    if (argc > 2)\n        username = argv[2];\n    if (argc > 3)\n        password = argv[3];\n    if (argc > 4)\n        local_listenip = argv[4];\n    if (argc > 5)\n        local_listenport = atoi(argv[5]);\n    if (argc > 6)\n        remote_desthost = argv[6];\n    if (argc > 7)\n        remote_destport = atoi(argv[7]);\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Connect to SSH server */\n    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);\n#ifdef WIN32\n    if (sock == INVALID_SOCKET) {\n        fprintf(stderr, \"failed to open socket!\\n\");\n        return -1;\n    }\n#else\n    if (sock == -1) {\n        perror(\"socket\");\n        return -1;\n    }\n#endif\n\n    sin.sin_family = AF_INET;\n    if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(server_ip))) {\n        perror(\"inet_addr\");\n        return -1;\n    }\n    sin.sin_port = htons(22);\n    if (connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if(!session) {\n        fprintf(stderr, \"Could not initialize SSH session!\\n\");\n        return -1;\n    }\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Error when starting up SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++)\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    fprintf(stderr, \"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    fprintf(stderr, \"Authentication methods: %s\\n\", userauthlist);\n    if (strstr(userauthlist, \"password\"))\n        auth |= AUTH_PASSWORD;\n    if (strstr(userauthlist, \"publickey\"))\n        auth |= AUTH_PUBLICKEY;\n\n    /* check for options */\n    if(argc > 8) {\n        if ((auth & AUTH_PASSWORD) && !strcasecmp(argv[8], \"-p\"))\n            auth = AUTH_PASSWORD;\n        if ((auth & AUTH_PUBLICKEY) && !strcasecmp(argv[8], \"-k\"))\n            auth = AUTH_PUBLICKEY;\n    }\n\n    if (auth & AUTH_PASSWORD) {\n        if (libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else if (auth & AUTH_PUBLICKEY) {\n        if (libssh2_userauth_publickey_fromfile(session, username, keyfile1,\n                                                keyfile2, password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed!\\n\");\n            goto shutdown;\n        }\n        fprintf(stderr, \"\\tAuthentication by public key succeeded.\\n\");\n    } else {\n        fprintf(stderr, \"No supported authentication methods found!\\n\");\n        goto shutdown;\n    }\n\n    listensock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);\n#ifdef WIN32\n    if (listensock == INVALID_SOCKET) {\n        fprintf(stderr, \"failed to open listen socket!\\n\");\n        return -1;\n    }\n#else\n    if (listensock == -1) {\n        perror(\"socket\");\n        return -1;\n    }\n#endif\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(local_listenport);\n    if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(local_listenip))) {\n        perror(\"inet_addr\");\n        goto shutdown;\n    }\n    sockopt = 1;\n    setsockopt(listensock, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt));\n    sinlen=sizeof(sin);\n    if (-1 == bind(listensock, (struct sockaddr *)&sin, sinlen)) {\n        perror(\"bind\");\n        goto shutdown;\n    }\n    if (-1 == listen(listensock, 2)) {\n        perror(\"listen\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"Waiting for TCP connection on %s:%d...\\n\",\n        inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));\n\n    forwardsock = accept(listensock, (struct sockaddr *)&sin, &sinlen);\n#ifdef WIN32\n    if (forwardsock == INVALID_SOCKET) {\n        fprintf(stderr, \"failed to accept forward socket!\\n\");\n        goto shutdown;\n    }\n#else\n    if (forwardsock == -1) {\n        perror(\"accept\");\n        goto shutdown;\n    }\n#endif\n\n    shost = inet_ntoa(sin.sin_addr);\n    sport = ntohs(sin.sin_port);\n\n    fprintf(stderr, \"Forwarding connection from %s:%d here to remote %s:%d\\n\",\n        shost, sport, remote_desthost, remote_destport);\n\n    channel = libssh2_channel_direct_tcpip_ex(session, remote_desthost,\n        remote_destport, shost, sport);\n    if (!channel) {\n        fprintf(stderr, \"Could not open the direct-tcpip channel!\\n\"\n                \"(Note that this can be a problem at the server!\"\n                \" Please review the server logs.)\\n\");\n        goto shutdown;\n    }\n\n    /* Must use non-blocking IO hereafter due to the current libssh2 API */\n    libssh2_session_set_blocking(session, 0);\n\n    while (1) {\n        FD_ZERO(&fds);\n        FD_SET(forwardsock, &fds);\n        tv.tv_sec = 0;\n        tv.tv_usec = 100000;\n        rc = select(forwardsock + 1, &fds, NULL, NULL, &tv);\n        if (-1 == rc) {\n            perror(\"select\");\n            goto shutdown;\n        }\n        if (rc && FD_ISSET(forwardsock, &fds)) {\n            len = recv(forwardsock, buf, sizeof(buf), 0);\n            if (len < 0) {\n                perror(\"read\");\n                goto shutdown;\n            } else if (0 == len) {\n                fprintf(stderr, \"The client at %s:%d disconnected!\\n\", shost,\n                    sport);\n                goto shutdown;\n            }\n            wr = 0;\n            while(wr < len) {\n                i = libssh2_channel_write(channel, buf + wr, len - wr);\n                if (LIBSSH2_ERROR_EAGAIN == i) {\n                    continue;\n                }\n                if (i < 0) {\n                    fprintf(stderr, \"libssh2_channel_write: %d\\n\", i);\n                    goto shutdown;\n                }\n                wr += i;\n            }\n        }\n        while (1) {\n            len = libssh2_channel_read(channel, buf, sizeof(buf));\n            if (LIBSSH2_ERROR_EAGAIN == len)\n                break;\n            else if (len < 0) {\n                fprintf(stderr, \"libssh2_channel_read: %d\", (int)len);\n                goto shutdown;\n            }\n            wr = 0;\n            while (wr < len) {\n                i = send(forwardsock, buf + wr, len - wr, 0);\n                if (i <= 0) {\n                    perror(\"write\");\n                    goto shutdown;\n                }\n                wr += i;\n            }\n            if (libssh2_channel_eof(channel)) {\n                fprintf(stderr, \"The server at %s:%d disconnected!\\n\",\n                    remote_desthost, remote_destport);\n                goto shutdown;\n            }\n        }\n    }\n\nshutdown:\n#ifdef WIN32\n    closesocket(forwardsock);\n    closesocket(listensock);\n#else\n    close(forwardsock);\n    close(listensock);\n#endif\n    if (channel)\n        libssh2_channel_free(channel);\n    libssh2_session_disconnect(session, \"Client disconnecting normally\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/libssh2_config_cmake.h.in",
    "content": "/* Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* Headers */\n#cmakedefine HAVE_UNISTD_H\n#cmakedefine HAVE_INTTYPES_H\n#cmakedefine HAVE_STDLIB_H\n#cmakedefine HAVE_SYS_SELECT_H\n#cmakedefine HAVE_SYS_SOCKET_H\n#cmakedefine HAVE_SYS_TIME_H\n#cmakedefine HAVE_ARPA_INET_H\n#cmakedefine HAVE_NETINET_IN_H\n#cmakedefine HAVE_WINSOCK2_H\n\n/* Functions */\n#cmakedefine HAVE_STRCASECMP\n#cmakedefine HAVE__STRICMP\n#cmakedefine HAVE_SNPRINTF\n#cmakedefine HAVE__SNPRINTF\n\n/* Workaround for platforms without POSIX strcasecmp (e.g. Windows) */\n#ifndef HAVE_STRCASECMP\n# ifdef HAVE__STRICMP\n# define strcasecmp _stricmp\n# define HAVE_STRCASECMP\n# endif\n#endif\n\n/* Symbols */\n#cmakedefine HAVE___FUNC__\n#cmakedefine HAVE___FUNCTION__\n\n/* Workaround for platforms without C90 __func__ */\n#ifndef HAVE___FUNC__\n# ifdef HAVE___FUNCTION__\n# define __func__ __FUNCTION__\n# define HAVE___FUNC__\n# endif\n#endif\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/scp.c",
    "content": "/*\n * Sample showing how to do a simple SCP transfer.\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel;\n    const char *username=\"username\";\n    const char *password=\"password\";\n    const char *scppath=\"/tmp/TEST\";\n    libssh2_struct_stat fileinfo;\n    int rc;\n    libssh2_struct_stat_size got = 0;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    } else {\n        hostaddr = htonl(0x7F000001);\n    }\n    if (argc > 2) {\n        username = argv[2];\n    }\n    if (argc > 3) {\n        password = argv[3];\n    }\n    if (argc > 4) {\n        scppath = argv[4];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Ultra basic \"connect to port 22 on localhost\"\n     * Your code is responsible for creating the socket establishing the\n     * connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n            sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if (auth_pw) {\n        /* We could authenticate via password */\n        if (libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else {\n        /* Or by public key */\n        if (libssh2_userauth_publickey_fromfile(session, username,\n                            \"/home/username/.ssh/id_rsa.pub\",\n                            \"/home/username/.ssh/id_rsa\",\n                            password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    /* Request a file via SCP */\n    channel = libssh2_scp_recv2(session, scppath, &fileinfo);\n\n    if (!channel) {\n        fprintf(stderr, \"Unable to open a session: %d\\n\",\n                libssh2_session_last_errno(session));\n        goto shutdown;\n    }\n\n\n    while(got < fileinfo.st_size) {\n        char mem[1024];\n        int amount=sizeof(mem);\n\n        if((fileinfo.st_size -got) < amount) {\n            amount = (int)(fileinfo.st_size -got);\n        }\n\n        rc = libssh2_channel_read(channel, mem, amount);\n        if(rc > 0) {\n            write(1, mem, rc);\n        }\n        else if(rc < 0) {\n            fprintf(stderr, \"libssh2_channel_read() failed: %d\\n\", rc);\n            break;\n        }\n        got += rc;\n    }\n\n    libssh2_channel_free(channel);\n    channel = NULL;\n\n shutdown:\n\n    libssh2_session_disconnect(session, \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/scp_nonblock.c",
    "content": "/*\n * Sample showing how to do SCP transfers in a non-blocking manner.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"scp_nonblock 192.168.0.1 user password /tmp/secrets\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\n#ifdef HAVE_GETTIMEOFDAY\n/* diff in ms */\nstatic long tvdiff(struct timeval newer, struct timeval older)\n{\n  return (newer.tv_sec-older.tv_sec)*1000+\n      (newer.tv_usec-older.tv_usec)/1000;\n}\n#endif\n\nstatic int waitsocket(int socket_fd, LIBSSH2_SESSION *session)\n{\n    struct timeval timeout;\n    int rc;\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n    int dir;\n\n    timeout.tv_sec = 10;\n    timeout.tv_usec = 0;\n\n    FD_ZERO(&fd);\n\n    FD_SET(socket_fd, &fd);\n\n    /* now make sure we wait in the correct direction */\n    dir = libssh2_session_block_directions(session);\n\n    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n        readfd = &fd;\n\n    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n        writefd = &fd;\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n\n    return rc;\n}\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel;\n    const char *username=\"username\";\n    const char *password=\"password\";\n    const char *scppath=\"/tmp/TEST\";\n    libssh2_struct_stat fileinfo;\n#ifdef HAVE_GETTIMEOFDAY\n    struct timeval start;\n    struct timeval end;\n    long time_ms;\n#endif\n    int rc;\n    int spin = 0;\n    libssh2_struct_stat_size got = 0;\n    libssh2_struct_stat_size total = 0;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    } else {\n        hostaddr = htonl(0x7F000001);\n    }\n    if (argc > 2) {\n        username = argv[2];\n    }\n    if (argc > 3) {\n        password = argv[3];\n    }\n    if (argc > 4) {\n        scppath = argv[4];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Ultra basic \"connect to port 22 on localhost\"\n     * Your code is responsible for creating the socket establishing the\n     * connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if (!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n#ifdef HAVE_GETTIMEOFDAY\n    gettimeofday(&start, NULL);\n#endif\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    while ((rc = libssh2_session_handshake(session, sock)) ==\n           LIBSSH2_ERROR_EAGAIN);\n    if (rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n        * is check the hostkey's fingerprint against our known hosts Your app\n        * may have it hard coded, may go to a file, may present it to the\n        * user, that's your call\n        */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if (auth_pw) {\n        /* We could authenticate via password */\n        while ((rc = libssh2_userauth_password(session, username, password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n        if (rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else {\n        /* Or by public key */\n        while ((rc = libssh2_userauth_publickey_fromfile(session, username,\n                                                         \"/home/username/\"\n                                                         \".ssh/id_rsa.pub\",\n                                                         \"/home/username/\"\n                                                         \".ssh/id_rsa\",\n                                                         password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n    if (rc) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n#if 0\n    libssh2_trace(session, LIBSSH2_TRACE_CONN);\n#endif\n\n    /* Request a file via SCP */\n    fprintf(stderr, \"libssh2_scp_recv2()!\\n\");\n    do {\n        channel = libssh2_scp_recv2(session, scppath, &fileinfo);\n\n        if (!channel) {\n            if(libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN) {\n                char *err_msg;\n\n                libssh2_session_last_error(session, &err_msg, NULL, 0);\n                fprintf(stderr, \"%s\\n\", err_msg);\n                goto shutdown;\n            }\n            else {\n                fprintf(stderr, \"libssh2_scp_recv() spin\\n\");\n                waitsocket(sock, session);\n            }\n        }\n    } while (!channel);\n    fprintf(stderr, \"libssh2_scp_recv() is done, now receive data!\\n\");\n\n    while(got < fileinfo.st_size) {\n        char mem[1024*24];\n        int rc;\n\n        do {\n            int amount=sizeof(mem);\n\n            if ((fileinfo.st_size -got) < amount) {\n                amount = (int)(fileinfo.st_size - got);\n            }\n\n            /* loop until we block */\n            rc = libssh2_channel_read(channel, mem, amount);\n            if (rc > 0) {\n                write(1, mem, rc);\n                got += rc;\n                total += rc;\n            }\n        } while (rc > 0);\n\n        if ((rc == LIBSSH2_ERROR_EAGAIN) && (got < fileinfo.st_size)) {\n            /* this is due to blocking that would occur otherwise\n            so we loop on this condition */\n\n            spin++;\n            waitsocket(sock, session); /* now we wait */\n            continue;\n        }\n        break;\n    }\n\n#ifdef HAVE_GETTIMEOFDAY\n    gettimeofday(&end, NULL);\n\n    time_ms = tvdiff(end, start);\n    fprintf(stderr, \"Got \" LIBSSH2_STRUCT_STAT_SIZE_FORMAT \" bytes in %ld ms = %.1f bytes/sec spin: %d\\n\", total,\n           time_ms, total/(time_ms/1000.0), spin);\n#else\n    fprintf(stderr, \"Got \" LIBSSH2_STRUCT_STAT_SIZE_FORMAT \" bytes spin: %d\\n\", total, spin);\n#endif\n\n    libssh2_channel_free(channel);\n    channel = NULL;\n\nshutdown:\n\n    libssh2_session_disconnect(session,\n                               \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/scp_write.c",
    "content": "/*\n * Sample showing how to do an SCP upload.\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session = NULL;\n    LIBSSH2_CHANNEL *channel;\n    const char *username=\"username\";\n    const char *password=\"password\";\n    const char *loclfile=\"scp_write.c\";\n    const char *scppath=\"/tmp/TEST\";\n    FILE *local;\n    int rc;\n    char mem[1024];\n    size_t nread;\n    char *ptr;\n    struct stat fileinfo;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    } else {\n        hostaddr = htonl(0x7F000001);\n    }\n    if (argc > 2) {\n        username = argv[2];\n    }\n    if (argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        loclfile = argv[4];\n    }\n    if (argc > 5) {\n        scppath = argv[5];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    local = fopen(loclfile, \"rb\");\n    if (!local) {\n        fprintf(stderr, \"Can't open local file %s\\n\", loclfile);\n        return -1;\n    }\n\n    stat(loclfile, &fileinfo);\n\n    /* Ultra basic \"connect to port 22 on localhost\"\n     * Your code is responsible for creating the socket establishing the\n     * connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n    if(-1 == sock) {\n        fprintf(stderr, \"failed to create socket!\\n\");\n        return -1;\n    }\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n            sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if (auth_pw) {\n        /* We could authenticate via password */\n        if (libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else {\n        /* Or by public key */\n        if (libssh2_userauth_publickey_fromfile(session, username,\n                            \"/home/username/.ssh/id_rsa.pub\",\n                            \"/home/username/.ssh/id_rsa\",\n                            password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    /* Send a file via scp. The mode parameter must only have permissions! */\n    channel = libssh2_scp_send(session, scppath, fileinfo.st_mode & 0777,\n                               (unsigned long)fileinfo.st_size);\n\n    if (!channel) {\n        char *errmsg;\n        int errlen;\n        int err = libssh2_session_last_error(session, &errmsg, &errlen, 0);\n        fprintf(stderr, \"Unable to open a session: (%d) %s\\n\", err, errmsg);\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"SCP session waiting to send file\\n\");\n    do {\n        nread = fread(mem, 1, sizeof(mem), local);\n        if (nread <= 0) {\n            /* end of file */\n            break;\n        }\n        ptr = mem;\n\n        do {\n            /* write the same data over and over, until error or completion */\n            rc = libssh2_channel_write(channel, ptr, nread);\n            if (rc < 0) {\n                fprintf(stderr, \"ERROR %d\\n\", rc);\n                break;\n            }\n            else {\n                /* rc indicates how many bytes were written this time */\n                ptr += rc;\n                nread -= rc;\n            }\n        } while (nread);\n\n    } while (1);\n\n    fprintf(stderr, \"Sending EOF\\n\");\n    libssh2_channel_send_eof(channel);\n\n    fprintf(stderr, \"Waiting for EOF\\n\");\n    libssh2_channel_wait_eof(channel);\n\n    fprintf(stderr, \"Waiting for channel to close\\n\");\n    libssh2_channel_wait_closed(channel);\n\n    libssh2_channel_free(channel);\n    channel = NULL;\n\n shutdown:\n\n    if(session) {\n        libssh2_session_disconnect(session, \"Normal Shutdown, Thank you for playing\");\n        libssh2_session_free(session);\n    }\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    if (local)\n        fclose(local);\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/scp_write_nonblock.c",
    "content": "/*\n * Sample showing how to do an SCP non-blocking upload transfer.\n */\n\n#include \"libssh2_config.h\"\n\n#include <libssh2.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <time.h>\n\nstatic int waitsocket(int socket_fd, LIBSSH2_SESSION *session)\n{\n    struct timeval timeout;\n    int rc;\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n    int dir;\n\n    timeout.tv_sec = 10;\n    timeout.tv_usec = 0;\n\n    FD_ZERO(&fd);\n\n    FD_SET(socket_fd, &fd);\n\n    /* now make sure we wait in the correct direction */\n    dir = libssh2_session_block_directions(session);\n\n    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n        readfd = &fd;\n\n    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n        writefd = &fd;\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n\n    return rc;\n}\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session = NULL;\n    LIBSSH2_CHANNEL *channel;\n    const char *username=\"username\";\n    const char *password=\"password\";\n    const char *loclfile=\"scp_write.c\";\n    const char *scppath=\"/tmp/TEST\";\n    FILE *local;\n    int rc;\n    char mem[1024*100];\n    size_t nread;\n    char *ptr;\n    struct stat fileinfo;\n    time_t start;\n    long total = 0;\n    int duration;\n    size_t prev;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    } else {\n        hostaddr = htonl(0x7F000001);\n    }\n    if (argc > 2) {\n        username = argv[2];\n    }\n    if (argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        loclfile = argv[4];\n    }\n    if (argc > 5) {\n        scppath = argv[5];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    local = fopen(loclfile, \"rb\");\n    if (!local) {\n        fprintf(stderr, \"Can't local file %s\\n\", loclfile);\n        return -1;\n    }\n\n    stat(loclfile, &fileinfo);\n\n    /* Ultra basic \"connect to port 22 on localhost\"\n     * Your code is responsible for creating the socket establishing the\n     * connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n            sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    while ((rc = libssh2_session_handshake(session, sock))\n           == LIBSSH2_ERROR_EAGAIN);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if (auth_pw) {\n        /* We could authenticate via password */\n        while ((rc = libssh2_userauth_password(session, username, password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n        if (rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else {\n        /* Or by public key */\n        while ((rc = libssh2_userauth_publickey_fromfile(session, username,\n                                                         \"/home/username/.ssh/id_rsa.pub\",\n                                                         \"/home/username/.ssh/id_rsa\",\n                                                         password)) == LIBSSH2_ERROR_EAGAIN);\n        if (rc) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    /* Send a file via scp. The mode parameter must only have permissions! */\n    do {\n        channel = libssh2_scp_send(session, scppath, fileinfo.st_mode & 0777,\n                                   (unsigned long)fileinfo.st_size);\n\n        if ((!channel) && (libssh2_session_last_errno(session) !=\n                           LIBSSH2_ERROR_EAGAIN)) {\n            char *err_msg;\n\n            libssh2_session_last_error(session, &err_msg, NULL, 0);\n            fprintf(stderr, \"%s\\n\", err_msg);\n            goto shutdown;\n        }\n    } while (!channel);\n\n    fprintf(stderr, \"SCP session waiting to send file\\n\");\n    start = time(NULL);\n    do {\n        nread = fread(mem, 1, sizeof(mem), local);\n        if (nread <= 0) {\n            /* end of file */\n            break;\n        }\n        ptr = mem;\n\n        total += nread;\n\n        prev = 0;\n        do {\n            while ((rc = libssh2_channel_write(channel, ptr, nread)) ==\n                   LIBSSH2_ERROR_EAGAIN) {\n                waitsocket(sock, session);\n                prev = 0;\n            }\n            if (rc < 0) {\n                fprintf(stderr, \"ERROR %d total %ld / %d prev %d\\n\", rc,\n                        total, (int)nread, (int)prev);\n                break;\n            }\n            else {\n                prev = nread;\n\n                /* rc indicates how many bytes were written this time */\n                nread -= rc;\n                ptr += rc;\n            }\n        } while (nread);\n    } while (!nread); /* only continue if nread was drained */\n\n    duration = (int)(time(NULL)-start);\n\n    fprintf(stderr, \"%ld bytes in %d seconds makes %.1f bytes/sec\\n\",\n           total, duration, total/(double)duration);\n\n    fprintf(stderr, \"Sending EOF\\n\");\n    while (libssh2_channel_send_eof(channel) == LIBSSH2_ERROR_EAGAIN);\n\n    fprintf(stderr, \"Waiting for EOF\\n\");\n    while (libssh2_channel_wait_eof(channel) == LIBSSH2_ERROR_EAGAIN);\n\n    fprintf(stderr, \"Waiting for channel to close\\n\");\n    while (libssh2_channel_wait_closed(channel) == LIBSSH2_ERROR_EAGAIN);\n\n    libssh2_channel_free(channel);\n    channel = NULL;\n\n shutdown:\n\n    while (libssh2_session_disconnect(session,\n                                      \"Normal Shutdown, Thank you for playing\") ==\n           LIBSSH2_ERROR_EAGAIN);\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/sftp.c",
    "content": "/*\n * Sample showing how to do SFTP transfers.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"sftp 192.168.0.1 user password /tmp/secrets -p|-i|-k\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\n\nconst char *keyfile1=\"~/.ssh/id_rsa.pub\";\nconst char *keyfile2=\"~/.ssh/id_rsa\";\nconst char *username=\"username\";\nconst char *password=\"password\";\nconst char *sftppath=\"/tmp/TEST\";\n\n\nstatic void kbd_callback(const char *name, int name_len, \n             const char *instruction, int instruction_len, int num_prompts,\n             const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,\n             LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses,\n             void **abstract)\n{\n    int i;\n    size_t n;\n    char buf[1024];\n    (void)abstract;\n\n    fprintf(stderr, \"Performing keyboard-interactive authentication.\\n\");\n\n    fprintf(stderr, \"Authentication name: '\");\n    fwrite(name, 1, name_len, stderr);\n    fprintf(stderr, \"'\\n\");\n\n    fprintf(stderr, \"Authentication instruction: '\");\n    fwrite(instruction, 1, instruction_len, stderr);\n    fprintf(stderr, \"'\\n\");\n\n    fprintf(stderr, \"Number of prompts: %d\\n\\n\", num_prompts);\n\n    for (i = 0; i < num_prompts; i++) {\n        fprintf(stderr, \"Prompt %d from server: '\", i);\n        fwrite(prompts[i].text, 1, prompts[i].length, stderr);\n        fprintf(stderr, \"'\\n\");\n\n        fprintf(stderr, \"Please type response: \");\n        fgets(buf, sizeof(buf), stdin);\n        n = strlen(buf);\n        while (n > 0 && strchr(\"\\r\\n\", buf[n - 1]))\n          n--;\n        buf[n] = 0;\n\n        responses[i].text = strdup(buf);\n        responses[i].length = n;\n\n        fprintf(stderr, \"Response %d from user is '\", i);\n        fwrite(responses[i].text, 1, responses[i].length, stderr);\n        fprintf(stderr, \"'\\n\\n\");\n    }\n\n    fprintf(stderr,\n        \"Done. Sending keyboard-interactive responses to server now.\\n\");\n}\n\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 0;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session;\n    int rc;\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    } else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        sftppath = argv[4];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are blocking */\n    libssh2_session_set_blocking(session, 1);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    fprintf(stderr, \"Authentication methods: %s\\n\", userauthlist);\n    if (strstr(userauthlist, \"password\") != NULL) {\n        auth_pw |= 1;\n    }\n    if (strstr(userauthlist, \"keyboard-interactive\") != NULL) {\n        auth_pw |= 2;\n    }\n    if (strstr(userauthlist, \"publickey\") != NULL) {\n        auth_pw |= 4;\n    }\n\n    /* if we got an 4. argument we set this option if supported */ \n    if(argc > 5) {\n        if ((auth_pw & 1) && !strcasecmp(argv[5], \"-p\")) {\n            auth_pw = 1;\n        }\n        if ((auth_pw & 2) && !strcasecmp(argv[5], \"-i\")) {\n            auth_pw = 2;\n        }\n        if ((auth_pw & 4) && !strcasecmp(argv[5], \"-k\")) {\n            auth_pw = 4;\n        }\n    }\n\n    if (auth_pw & 1) {\n        /* We could authenticate via password */\n        if (libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else if (auth_pw & 2) {\n        /* Or via keyboard-interactive */\n        if (libssh2_userauth_keyboard_interactive(session, username, &kbd_callback) ) {\n            fprintf(stderr,\n                \"\\tAuthentication by keyboard-interactive failed!\\n\");\n            goto shutdown;\n        } else {\n            fprintf(stderr,\n                \"\\tAuthentication by keyboard-interactive succeeded.\\n\");\n        }\n    } else if (auth_pw & 4) {\n        /* Or by public key */\n        if (libssh2_userauth_publickey_fromfile(session, username, keyfile1, keyfile2, password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed!\\n\");\n            goto shutdown;\n        } else {\n            fprintf(stderr, \"\\tAuthentication by public key succeeded.\\n\");\n        }\n    } else {\n        fprintf(stderr, \"No supported authentication methods found!\\n\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    sftp_session = libssh2_sftp_init(session);\n\n    if (!sftp_session) {\n        fprintf(stderr, \"Unable to init SFTP session\\n\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"libssh2_sftp_open()!\\n\");\n    /* Request a file via SFTP */\n    sftp_handle =\n        libssh2_sftp_open(sftp_session, sftppath, LIBSSH2_FXF_READ, 0);\n\n    if (!sftp_handle) {\n        fprintf(stderr, \"Unable to open file with SFTP: %ld\\n\",\n                libssh2_sftp_last_error(sftp_session));\n        goto shutdown;\n    }\n    fprintf(stderr, \"libssh2_sftp_open() is done, now receive data!\\n\");\n    do {\n        char mem[1024];\n\n        /* loop until we fail */\n        fprintf(stderr, \"libssh2_sftp_read()!\\n\");\n        rc = libssh2_sftp_read(sftp_handle, mem, sizeof(mem));\n        if (rc > 0) {\n            write(1, mem, rc);\n        } else {\n            break;\n        }\n    } while (1);\n\n    libssh2_sftp_close(sftp_handle);\n    libssh2_sftp_shutdown(sftp_session);\n\n  shutdown:\n\n    libssh2_session_disconnect(session, \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/sftp_RW_nonblock.c",
    "content": "/*\n * Sample showing how to do SFTP transfers in a non-blocking manner.\n *\n * It will first download a given source file, store it locally and then\n * upload the file again to a given destination file.\n *\n * Using the SFTP server running on 127.0.0.1\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\n#define STORAGE \"/tmp/sftp-storage\" /* this is the local file name this\n                                       example uses to store the downloaded\n                                       file in */\n\nstatic int waitsocket(int socket_fd, LIBSSH2_SESSION *session)\n{\n    struct timeval timeout;\n    int rc;\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n    int dir;\n\n    timeout.tv_sec = 10;\n    timeout.tv_usec = 0;\n\n    FD_ZERO(&fd);\n\n    FD_SET(socket_fd, &fd);\n\n    /* now make sure we wait in the correct direction */\n    dir = libssh2_session_block_directions(session);\n\n    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n        readfd = &fd;\n\n    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n        writefd = &fd;\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n\n    return rc;\n}\n\nint main(int argc, char *argv[])\n{\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username=\"username\";\n    const char *password=\"password\";\n    const char *sftppath=\"/tmp/TEST\"; /* source path */\n    const char *dest=\"/tmp/TEST2\";    /* destination path */\n    int rc;\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n    FILE *tempstorage;\n    char mem[1000];\n    struct timeval timeout;\n    fd_set fd;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Ultra basic \"connect to port 22 on localhost\"\n     * The application is responsible for creating the socket establishing\n     * the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = htonl(0x7F000001);\n    if (connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    libssh2_session_set_blocking(session, 0);\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if(argc > 1) {\n        username = argv[1];\n    }\n    if(argc > 2) {\n        password = argv[2];\n    }\n    if(argc > 3) {\n        sftppath = argv[3];\n    }\n    if(argc > 4) {\n        dest = argv[4];\n    }\n\n    tempstorage = fopen(STORAGE, \"wb\");\n    if(!tempstorage) {\n        fprintf(stderr, \"Can't open temp storage file %s\\n\", STORAGE);\n        goto shutdown;\n    }\n\n    if (auth_pw) {\n        /* We could authenticate via password */\n        while ((rc = libssh2_userauth_password(session, username, password))\n               == LIBSSH2_ERROR_EAGAIN);\n        if (rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else {\n        /* Or by public key */\n        while ((rc =\n                libssh2_userauth_publickey_fromfile(session, username,\n                                                    \"/home/username/\"\n                                                    \".ssh/id_rsa.pub\",\n                                                    \"/home/username/\"\n                                                    \".ssh/id_rsa\",\n                                                    password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n        if (rc) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    do {\n        sftp_session = libssh2_sftp_init(session);\n\n        if(!sftp_session) {\n            if(libssh2_session_last_errno(session) ==\n               LIBSSH2_ERROR_EAGAIN) {\n                fprintf(stderr, \"non-blocking init\\n\");\n                waitsocket(sock, session); /* now we wait */\n            }\n            else {\n                fprintf(stderr, \"Unable to init SFTP session\\n\");\n                goto shutdown;\n            }\n        }\n    } while (!sftp_session);\n\n    /* Request a file via SFTP */\n    do {\n        sftp_handle = libssh2_sftp_open(sftp_session, sftppath,\n                                        LIBSSH2_FXF_READ, 0);\n\n        if (!sftp_handle) {\n            if (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN) {\n                fprintf(stderr, \"Unable to open file with SFTP\\n\");\n                goto shutdown;\n            }\n            else {\n                fprintf(stderr, \"non-blocking open\\n\");\n                waitsocket(sock, session); /* now we wait */\n            }\n        }\n    } while (!sftp_handle);\n\n    fprintf(stderr, \"libssh2_sftp_open() is done, now receive data!\\n\");\n    do {\n        do {\n            /* read in a loop until we block */\n            rc = libssh2_sftp_read(sftp_handle, mem, sizeof(mem));\n            fprintf(stderr, \"libssh2_sftp_read returned %d\\n\",\n                    rc);\n\n            if(rc > 0) {\n                /* write to stderr */\n                write(2, mem, rc);\n                /* write to temporary storage area */\n                fwrite(mem, rc, 1, tempstorage);\n            }\n        } while (rc > 0);\n\n        if(rc != LIBSSH2_ERROR_EAGAIN) {\n            /* error or end of file */\n            break;\n        }\n\n        timeout.tv_sec = 10;\n        timeout.tv_usec = 0;\n\n        FD_ZERO(&fd);\n\n        FD_SET(sock, &fd);\n\n        /* wait for readable or writeable */\n        rc = select(sock+1, &fd, &fd, NULL, &timeout);\n        if(rc <= 0) {\n            /* negative is error\n               0 is timeout */\n            fprintf(stderr, \"SFTP download timed out: %d\\n\", rc);\n            break;\n        }\n\n    } while (1);\n\n    libssh2_sftp_close(sftp_handle);\n    fclose(tempstorage);\n\n    tempstorage = fopen(STORAGE, \"rb\");\n    if(!tempstorage) {\n        /* weird, we can't read the file we just wrote to... */\n        fprintf(stderr, \"can't open %s for reading\\n\", STORAGE);\n        goto shutdown;\n    }\n\n    /* we're done downloading, now reverse the process and upload the\n       temporarily stored data to the destination path */\n    sftp_handle =\n        libssh2_sftp_open(sftp_session, dest,\n                          LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT,\n                          LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR|\n                          LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH);\n    if(sftp_handle) {\n        size_t nread;\n        char *ptr;\n        do {\n            nread = fread(mem, 1, sizeof(mem), tempstorage);\n            if(nread <= 0) {\n                /* end of file */\n                break;\n            }\n            ptr = mem;\n\n            do {\n                /* write data in a loop until we block */\n                rc = libssh2_sftp_write(sftp_handle, ptr,\n                                        nread);\n                ptr += rc;\n                nread -= nread;\n            } while (rc >= 0);\n\n            if(rc != LIBSSH2_ERROR_EAGAIN) {\n                /* error or end of file */\n                break;\n            }\n\n            timeout.tv_sec = 10;\n            timeout.tv_usec = 0;\n\n            FD_ZERO(&fd);\n\n            FD_SET(sock, &fd);\n\n            /* wait for readable or writeable */\n            rc = select(sock+1, &fd, &fd, NULL, &timeout);\n            if(rc <= 0) {\n                /* negative is error\n                   0 is timeout */\n                fprintf(stderr, \"SFTP upload timed out: %d\\n\",\n                        rc);\n                break;\n            }\n        } while (1);\n        fprintf(stderr, \"SFTP upload done!\\n\");\n    }\n    else {\n        fprintf(stderr, \"SFTP failed to open destination path: %s\\n\",\n                dest);\n    }\n\n    libssh2_sftp_shutdown(sftp_session);\n\n  shutdown:\n\n    libssh2_session_disconnect(session, \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    if (tempstorage)\n        fclose(tempstorage);\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/sftp_append.c",
    "content": "/*\n * Sample showing how to do SFTP append of a local file onto a remote one.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * sftp_append 192.168.0.1 user password localfile /tmp/remotefile\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username=\"username\";\n    const char *password=\"password\";\n    const char *loclfile=\"sftp_write.c\";\n    const char *sftppath=\"/tmp/TEST\";\n    int rc;\n    FILE *local;\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n    LIBSSH2_SFTP_ATTRIBUTES attrs;\n    char mem[1024*100];\n    size_t nread;\n    char *ptr;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    } else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        loclfile = argv[4];\n    }\n    if(argc > 5) {\n        sftppath = argv[5];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    local = fopen(loclfile, \"rb\");\n    if (!local) {\n        fprintf(stderr, \"Can't open local file %s\\n\", loclfile);\n        return -1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n            sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are blocking */\n    libssh2_session_set_blocking(session, 1);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if (auth_pw) {\n        /* We could authenticate via password */\n        if (libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else {\n        /* Or by public key */\n        if (libssh2_userauth_publickey_fromfile(session, username,\n                            \"/home/username/.ssh/id_rsa.pub\",\n                            \"/home/username/.ssh/id_rsa\",\n                            password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    sftp_session = libssh2_sftp_init(session);\n\n    if (!sftp_session) {\n        fprintf(stderr, \"Unable to init SFTP session\\n\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"libssh2_sftp_open() for READ and WRITE!\\n\");\n    /* Request a file via SFTP */\n\n    sftp_handle =\n        libssh2_sftp_open(sftp_session, sftppath,\n                          LIBSSH2_FXF_WRITE|LIBSSH2_FXF_READ,\n                          LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR|\n                          LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH);\n    if (!sftp_handle) {\n        fprintf(stderr, \"Unable to open file with SFTP\\n\");\n        goto shutdown;\n    }\n\n    if(libssh2_sftp_fstat_ex(sftp_handle, &attrs, 0) < 0) {\n        fprintf(stderr, \"libssh2_sftp_fstat_ex failed\\n\");\n        goto shutdown;\n    }\n    else\n        libssh2_sftp_seek64(sftp_handle, attrs.filesize);\n    fprintf(stderr, \"Did a seek to position %ld\\n\", (long) attrs.filesize);\n\n    fprintf(stderr, \"libssh2_sftp_open() a handle for APPEND\\n\");\n\n    if (!sftp_handle) {\n        fprintf(stderr, \"Unable to open file with SFTP\\n\");\n        goto shutdown;\n    }\n    fprintf(stderr, \"libssh2_sftp_open() is done, now send data!\\n\");\n    do {\n        nread = fread(mem, 1, sizeof(mem), local);\n        if (nread <= 0) {\n            /* end of file */\n            break;\n        }\n        ptr = mem;\n\n        do {\n            /* write data in a loop until we block */\n            rc = libssh2_sftp_write(sftp_handle, ptr, nread);\n            if(rc < 0)\n                break;\n            ptr += rc;\n            nread -= rc;\n        } while (nread);\n\n    } while (rc > 0);\n\n    libssh2_sftp_close(sftp_handle);\n    libssh2_sftp_shutdown(sftp_session);\n\nshutdown:\n    libssh2_session_disconnect(session,\n                               \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    if (local)\n        fclose(local);\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/sftp_mkdir.c",
    "content": "/*\n * Sample showing how to do SFTP mkdir\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"sftp 192.168.0.1 user password /tmp/sftp_mkdir\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username=\"username\";\n    const char *password=\"password\";\n    const char *sftppath=\"/tmp/sftp_mkdir\";\n    int rc;\n    LIBSSH2_SFTP *sftp_session;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    } else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        sftppath = argv[4];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n            sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if (auth_pw) {\n        /* We could authenticate via password */\n        if (libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else {\n        /* Or by public key */\n        if (libssh2_userauth_publickey_fromfile(session, username,\n                            \"/home/username/.ssh/id_rsa.pub\",\n                            \"/home/username/.ssh/id_rsa\",\n                            password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    sftp_session = libssh2_sftp_init(session);\n\n    if (!sftp_session) {\n        fprintf(stderr, \"Unable to init SFTP session\\n\");\n        goto shutdown;\n    }\n\n    /* Since we have not set non-blocking, tell libssh2 we are blocking */\n    libssh2_session_set_blocking(session, 1);\n\n    /* Make a directory via SFTP */\n    rc = libssh2_sftp_mkdir(sftp_session, sftppath,\n                            LIBSSH2_SFTP_S_IRWXU|\n                            LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IXGRP|\n                            LIBSSH2_SFTP_S_IROTH|LIBSSH2_SFTP_S_IXOTH);\n\n    if(rc)\n        fprintf(stderr, \"libssh2_sftp_mkdir failed: %d\\n\", rc);\n\n    libssh2_sftp_shutdown(sftp_session);\n\n shutdown:\n\n    libssh2_session_disconnect(session, \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/sftp_mkdir_nonblock.c",
    "content": "/*\n * Sample showing how to do SFTP non-blocking mkdir.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"sftp 192.168.0.1 user password /tmp/sftp_write_nonblock.c\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username=\"username\";\n    const char *password=\"password\";\n    const char *sftppath=\"/tmp/sftp_mkdir_nonblock\";\n    int rc;\n    LIBSSH2_SFTP *sftp_session;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    } else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        sftppath = argv[4];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n            sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if (auth_pw) {\n        /* We could authenticate via password */\n        if (libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else {\n        /* Or by public key */\n        if (libssh2_userauth_publickey_fromfile(session, username,\n                            \"/home/username/.ssh/id_rsa.pub\",\n                            \"/home/username/.ssh/id_rsa\",\n                            password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    sftp_session = libssh2_sftp_init(session);\n\n    if (!sftp_session) {\n        fprintf(stderr, \"Unable to init SFTP session\\n\");\n        goto shutdown;\n    }\n\n    /* Since we have set non-blocking, tell libssh2 we are non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n    fprintf(stderr, \"libssh2_sftp_mkdirnb()!\\n\");\n    /* Make a directory via SFTP */\n    while (libssh2_sftp_mkdir(sftp_session, sftppath,\n                              LIBSSH2_SFTP_S_IRWXU|\n                              LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IXGRP|\n                              LIBSSH2_SFTP_S_IROTH|LIBSSH2_SFTP_S_IXOTH)\n           == LIBSSH2_ERROR_EAGAIN);\n\n    libssh2_sftp_shutdown(sftp_session);\n\n shutdown:\n\n    libssh2_session_disconnect(session, \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/sftp_nonblock.c",
    "content": "/*\n * Sample showing how to do SFTP non-blocking transfers.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"sftp_nonblock 192.168.0.1 user password /tmp/secrets\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\n#ifdef HAVE_GETTIMEOFDAY\n/* diff in ms */\nstatic long tvdiff(struct timeval newer, struct timeval older)\n{\n  return (newer.tv_sec-older.tv_sec)*1000+\n      (newer.tv_usec-older.tv_usec)/1000;\n}\n#endif\n\nstatic int waitsocket(int socket_fd, LIBSSH2_SESSION *session)\n{\n    struct timeval timeout;\n    int rc;\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n    int dir;\n\n    timeout.tv_sec = 10;\n    timeout.tv_usec = 0;\n\n    FD_ZERO(&fd);\n\n    FD_SET(socket_fd, &fd);\n\n    /* now make sure we wait in the correct direction */\n    dir = libssh2_session_block_directions(session);\n\n    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n        readfd = &fd;\n\n    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n        writefd = &fd;\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n\n    return rc;\n}\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username=\"username\";\n    const char *password=\"password\";\n    const char *sftppath=\"/tmp/TEST\";\n#ifdef HAVE_GETTIMEOFDAY\n    struct timeval start;\n    struct timeval end;\n    long time_ms;\n#endif\n    int rc;\n    int total = 0;\n    int spin = 0;\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    } else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if (argc > 2) {\n        username = argv[2];\n    }\n    if (argc > 3) {\n        password = argv[3];\n    }\n    if (argc > 4) {\n        sftppath = argv[4];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if (!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n#ifdef HAVE_GETTIMEOFDAY\n    gettimeofday(&start, NULL);\n#endif\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n        * and setup crypto, compression, and MAC layers\n        */\n    while ((rc = libssh2_session_handshake(session, sock)) ==\n           LIBSSH2_ERROR_EAGAIN);\n    if (rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n        * is check the hostkey's fingerprint against our known hosts Your app\n        * may have it hard coded, may go to a file, may present it to the\n        * user, that's your call\n        */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if (auth_pw) {\n        /* We could authenticate via password */\n        while ((rc = libssh2_userauth_password(session, username, password))\n               == LIBSSH2_ERROR_EAGAIN);\n        if (rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else {\n        /* Or by public key */\n        while ((rc =\n                libssh2_userauth_publickey_fromfile(session, username,\n                                                    \"/home/username/\"\n                                                    \".ssh/id_rsa.pub\",\n                                                    \"/home/username/\"\n                                                    \".ssh/id_rsa\",\n                                                    password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n        if (rc) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n#if 0\n    libssh2_trace(session, LIBSSH2_TRACE_CONN);\n#endif\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    do {\n        sftp_session = libssh2_sftp_init(session);\n\n        if(!sftp_session) {\n            if(libssh2_session_last_errno(session) ==\n               LIBSSH2_ERROR_EAGAIN) {\n                fprintf(stderr, \"non-blocking init\\n\");\n                waitsocket(sock, session); /* now we wait */\n            }\n            else {\n                fprintf(stderr, \"Unable to init SFTP session\\n\");\n                goto shutdown;\n            }\n        }\n    } while (!sftp_session);\n\n    fprintf(stderr, \"libssh2_sftp_open()!\\n\");\n    /* Request a file via SFTP */\n    do {\n        sftp_handle = libssh2_sftp_open(sftp_session, sftppath,\n                                        LIBSSH2_FXF_READ, 0);\n\n        if (!sftp_handle) {\n            if (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN) {\n                fprintf(stderr, \"Unable to open file with SFTP\\n\");\n                goto shutdown;\n            }\n            else {\n                fprintf(stderr, \"non-blocking open\\n\");\n                waitsocket(sock, session); /* now we wait */\n            }\n        }\n    } while (!sftp_handle);\n\n    fprintf(stderr, \"libssh2_sftp_open() is done, now receive data!\\n\");\n    do {\n        char mem[1024*24];\n\n        /* loop until we fail */\n        while ((rc = libssh2_sftp_read(sftp_handle, mem,\n                                       sizeof(mem))) == LIBSSH2_ERROR_EAGAIN) {\n            spin++;\n            waitsocket(sock, session); /* now we wait */\n        }\n        if (rc > 0) {\n            total += rc;\n            write(1, mem, rc);\n        } else {\n            break;\n        }\n    } while (1);\n\n#ifdef HAVE_GETTIMEOFDAY\n    gettimeofday(&end, NULL);\n    time_ms = tvdiff(end, start);\n    fprintf(stderr, \"Got %d bytes in %ld ms = %.1f bytes/sec spin: %d\\n\", total,\n           time_ms, total/(time_ms/1000.0), spin );\n#else\n    fprintf(stderr, \"Got %d bytes spin: %d\\n\", total, spin);\n#endif\n\n    libssh2_sftp_close(sftp_handle);\n    libssh2_sftp_shutdown(sftp_session);\n\nshutdown:\n\n    fprintf(stderr, \"libssh2_session_disconnect\\n\");\n    while (libssh2_session_disconnect(session,\n                                      \"Normal Shutdown, Thank you\") ==\n           LIBSSH2_ERROR_EAGAIN);\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/sftp_write.c",
    "content": "/*\n * Sample showing how to do SFTP write transfers.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"sftp 192.168.0.1 user password sftp_write.c /tmp/secrets\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username=\"username\";\n    const char *password=\"password\";\n    const char *loclfile=\"sftp_write.c\";\n    const char *sftppath=\"/tmp/TEST\";\n    int rc;\n    FILE *local;\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n    char mem[1024*100];\n    size_t nread;\n    char *ptr;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    } else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        loclfile = argv[4];\n    }\n    if(argc > 5) {\n        sftppath = argv[5];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    local = fopen(loclfile, \"rb\");\n    if (!local) {\n        fprintf(stderr, \"Can't open local file %s\\n\", loclfile);\n        return -1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n            sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are blocking */\n    libssh2_session_set_blocking(session, 1);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if (auth_pw) {\n        /* We could authenticate via password */\n        if (libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else {\n        /* Or by public key */\n        if (libssh2_userauth_publickey_fromfile(session, username,\n                            \"/home/username/.ssh/id_rsa.pub\",\n                            \"/home/username/.ssh/id_rsa\",\n                            password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    sftp_session = libssh2_sftp_init(session);\n\n    if (!sftp_session) {\n        fprintf(stderr, \"Unable to init SFTP session\\n\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"libssh2_sftp_open()!\\n\");\n    /* Request a file via SFTP */\n    sftp_handle =\n        libssh2_sftp_open(sftp_session, sftppath,\n                      LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC,\n                      LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR|\n                      LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH);\n\n    if (!sftp_handle) {\n        fprintf(stderr, \"Unable to open file with SFTP\\n\");\n        goto shutdown;\n    }\n    fprintf(stderr, \"libssh2_sftp_open() is done, now send data!\\n\");\n    do {\n        nread = fread(mem, 1, sizeof(mem), local);\n        if (nread <= 0) {\n            /* end of file */\n            break;\n        }\n        ptr = mem;\n\n        do {\n            /* write data in a loop until we block */\n            rc = libssh2_sftp_write(sftp_handle, ptr, nread);\n            if(rc < 0)\n                break;\n            ptr += rc;\n            nread -= rc;\n        } while (nread);\n\n    } while (rc > 0);\n\n    libssh2_sftp_close(sftp_handle);\n    libssh2_sftp_shutdown(sftp_session);\n\nshutdown:\n    libssh2_session_disconnect(session,\n                               \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    if (local)\n        fclose(local);\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/sftp_write_nonblock.c",
    "content": "/*\n * Sample showing how to do SFTP non-blocking write transfers.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"sftp 192.168.0.1 user password sftp_write_nonblock.c /tmp/sftp_write_nonblock.c\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <time.h>\n\nstatic int waitsocket(int socket_fd, LIBSSH2_SESSION *session)\n{\n    struct timeval timeout;\n    int rc;\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n    int dir;\n\n    timeout.tv_sec = 10;\n    timeout.tv_usec = 0;\n\n    FD_ZERO(&fd);\n\n    FD_SET(socket_fd, &fd);\n\n    /* now make sure we wait in the correct direction */\n    dir = libssh2_session_block_directions(session);\n\n    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n        readfd = &fd;\n\n    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n        writefd = &fd;\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n\n    return rc;\n}\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username=\"username\";\n    const char *password=\"password\";\n    const char *loclfile=\"sftp_write_nonblock.c\";\n    const char *sftppath=\"/tmp/sftp_write_nonblock.c\";\n    int rc;\n    FILE *local;\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n    char mem[1024 * 100];\n    size_t nread;\n    char *ptr;\n    time_t start;\n    long total = 0;\n    int duration;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    } else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if (argc > 2) {\n        username = argv[2];\n    }\n    if (argc > 3) {\n        password = argv[3];\n    }\n    if (argc > 4) {\n        loclfile = argv[4];\n    }\n    if (argc > 5) {\n        sftppath = argv[5];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    local = fopen(loclfile, \"rb\");\n    if (!local) {\n        fprintf(stderr, \"Can't open local file %s\\n\", loclfile);\n        return -1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n        */\n    session = libssh2_session_init();\n    if (!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n        * and setup crypto, compression, and MAC layers\n        */\n    while ((rc = libssh2_session_handshake(session, sock))\n           == LIBSSH2_ERROR_EAGAIN);\n    if (rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do is\n     * check the hostkey's fingerprint against our known hosts Your app may\n     * have it hard coded, may go to a file, may present it to the user,\n     * that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if (auth_pw) {\n        /* We could authenticate via password */\n        while ((rc = libssh2_userauth_password(session, username, password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n        if (rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else {\n        /* Or by public key */\n        while ((rc = libssh2_userauth_publickey_fromfile(session, username,\n                                                         \"/home/username/.ssh/id_rsa.pub\",\n                                                         \"/home/username/.ssh/id_rsa\",\n                                                         password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n    if (rc) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    do {\n        sftp_session = libssh2_sftp_init(session);\n\n        if (!sftp_session &&\n            (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN)) {\n            fprintf(stderr, \"Unable to init SFTP session\\n\");\n            goto shutdown;\n        }\n    } while (!sftp_session);\n\n    fprintf(stderr, \"libssh2_sftp_open()!\\n\");\n    /* Request a file via SFTP */\n    do {\n        sftp_handle =\n        libssh2_sftp_open(sftp_session, sftppath,\n                          LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC,\n                          LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR|\n                          LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH);\n\n        if (!sftp_handle &&\n            (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN)) {\n            fprintf(stderr, \"Unable to open file with SFTP\\n\");\n            goto shutdown;\n        }\n    } while (!sftp_handle);\n\n    fprintf(stderr, \"libssh2_sftp_open() is done, now send data!\\n\");\n\n    start = time(NULL);\n\n    do {\n        nread = fread(mem, 1, sizeof(mem), local);\n        if (nread <= 0) {\n            /* end of file */\n            break;\n        }\n        ptr = mem;\n\n        total += nread;\n\n        do {\n            /* write data in a loop until we block */\n            while ((rc = libssh2_sftp_write(sftp_handle, ptr, nread)) ==\n                   LIBSSH2_ERROR_EAGAIN) {\n                waitsocket(sock, session);\n            }\n            if(rc < 0)\n                break;\n            ptr += rc;\n            nread -= rc;\n\n        } while (nread);\n    } while (rc > 0);\n\n    duration = (int)(time(NULL)-start);\n\n    fprintf(stderr, \"%ld bytes in %d seconds makes %.1f bytes/sec\\n\",\n           total, duration, total/(double)duration);\n\n\n    fclose(local);\n    libssh2_sftp_close(sftp_handle);\n    libssh2_sftp_shutdown(sftp_session);\n\nshutdown:\n\n    while (libssh2_session_disconnect(session, \"Normal Shutdown, Thank you for playing\")\n           == LIBSSH2_ERROR_EAGAIN);\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/sftp_write_sliding.c",
    "content": "/*\n * Sample showing how to do SFTP non-blocking write transfers.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"sftp 192.168.0.1 user password sftp_write_nonblock.c /tmp/sftp_write_nonblock.c\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <time.h>\n\nstatic int waitsocket(int socket_fd, LIBSSH2_SESSION *session)\n{\n    struct timeval timeout;\n    int rc;\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n    int dir;\n\n    timeout.tv_sec = 10;\n    timeout.tv_usec = 0;\n\n    FD_ZERO(&fd);\n\n    FD_SET(socket_fd, &fd);\n\n    /* now make sure we wait in the correct direction */\n    dir = libssh2_session_block_directions(session);\n\n    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n        readfd = &fd;\n\n    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n        writefd = &fd;\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n\n    return rc;\n}\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username=\"username\";\n    const char *password=\"password\";\n    const char *loclfile=\"sftp_write_nonblock.c\";\n    const char *sftppath=\"/tmp/sftp_write_nonblock.c\";\n    int rc;\n    FILE *local;\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n    char mem[1024 * 1000];\n    size_t nread;\n    size_t memuse;\n    time_t start;\n    long total = 0;\n    int duration;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    } else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if (argc > 2) {\n        username = argv[2];\n    }\n    if (argc > 3) {\n        password = argv[3];\n    }\n    if (argc > 4) {\n        loclfile = argv[4];\n    }\n    if (argc > 5) {\n        sftppath = argv[5];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    local = fopen(loclfile, \"rb\");\n    if (!local) {\n        fprintf(stderr, \"Can't open local file %s\\n\", loclfile);\n        return -1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n        */\n    session = libssh2_session_init();\n    if (!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n        * and setup crypto, compression, and MAC layers\n        */\n    while ((rc = libssh2_session_handshake(session, sock))\n           == LIBSSH2_ERROR_EAGAIN);\n    if (rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do is\n     * check the hostkey's fingerprint against our known hosts Your app may\n     * have it hard coded, may go to a file, may present it to the user,\n     * that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if (auth_pw) {\n        /* We could authenticate via password */\n        while ((rc = libssh2_userauth_password(session, username, password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n        if (rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else {\n        /* Or by public key */\n        while ((rc = libssh2_userauth_publickey_fromfile(session, username,\n                                                         \"/home/username/.ssh/id_rsa.pub\",\n                                                         \"/home/username/.ssh/id_rsa\",\n                                                         password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n    if (rc) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    do {\n        sftp_session = libssh2_sftp_init(session);\n\n        if (!sftp_session &&\n            (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN)) {\n            fprintf(stderr, \"Unable to init SFTP session\\n\");\n            goto shutdown;\n        }\n    } while (!sftp_session);\n\n    fprintf(stderr, \"libssh2_sftp_open()!\\n\");\n    /* Request a file via SFTP */\n    do {\n        sftp_handle =\n        libssh2_sftp_open(sftp_session, sftppath,\n                          LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC,\n                          LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR|\n                          LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH);\n\n        if (!sftp_handle &&\n            (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN)) {\n            fprintf(stderr, \"Unable to open file with SFTP\\n\");\n            goto shutdown;\n        }\n    } while (!sftp_handle);\n\n    fprintf(stderr, \"libssh2_sftp_open() is done, now send data!\\n\");\n\n    start = time(NULL);\n\n    memuse = 0; /* it starts blank */\n    do {\n        nread = fread(&mem[memuse], 1, sizeof(mem)-memuse, local);\n        if (nread <= 0) {\n            /* end of file */\n            if (memuse > 0)\n                /* the previous sending is not finished */\n                nread = 0;\n            else\n                break;\n        }\n        memuse += nread;\n        total += nread;\n\n        /* write data in a loop until we block */\n        while ((rc = libssh2_sftp_write(sftp_handle, mem, memuse)) ==\n               LIBSSH2_ERROR_EAGAIN) {\n            waitsocket(sock, session);\n        }\n        if(rc < 0)\n            break;\n\n        if(memuse - rc) {\n            /* make room for more data at the end of the buffer */\n            memmove(&mem[0], &mem[rc], memuse - rc);\n            memuse -= rc;\n        }\n        else\n            /* 'mem' was consumed fully */\n            memuse = 0;\n\n    } while (rc > 0);\n\n    duration = (int)(time(NULL)-start);\n\n    fprintf(stderr, \"%ld bytes in %d seconds makes %.1f bytes/sec\\n\",\n           total, duration, total/(double)duration);\n\n\n    fclose(local);\n    libssh2_sftp_close(sftp_handle);\n    libssh2_sftp_shutdown(sftp_session);\n\nshutdown:\n\n    while (libssh2_session_disconnect(session, \"Normal Shutdown, Thank you for playing\")\n           == LIBSSH2_ERROR_EAGAIN);\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/sftpdir.c",
    "content": "/*\n * Sample doing an SFTP directory listing.\n *\n * The sample code has default values for host name, user name, password and\n * path, but you can specify them on the command line like:\n *\n * \"sftpdir 192.168.0.1 user password /tmp/secretdir\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\n/* last resort for systems not defining PRIu64 in inttypes.h */\n#ifndef __PRI64_PREFIX\n#ifdef WIN32\n#define __PRI64_PREFIX \"I64\"\n#else\n#if __WORDSIZE == 64\n#define __PRI64_PREFIX \"l\"\n#else\n#define __PRI64_PREFIX \"ll\"\n#endif /* __WORDSIZE */\n#endif /* WIN32 */\n#endif /* !__PRI64_PREFIX */\n#ifndef PRIu64\n#define PRIu64 __PRI64_PREFIX \"u\"\n#endif  /* PRIu64 */\n\nconst char *keyfile1=\"~/.ssh/id_rsa.pub\";\nconst char *keyfile2=\"~/.ssh/id_rsa\";\nconst char *username=\"username\";\nconst char *password=\"password\";\n\nstatic void kbd_callback(const char *name, int name_len,\n                         const char *instruction, int instruction_len,\n                         int num_prompts,\n                         const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,\n                         LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses,\n                         void **abstract)\n{\n    (void)name;\n    (void)name_len;\n    (void)instruction;\n    (void)instruction_len;\n    if (num_prompts == 1) {\n        responses[0].text = strdup(password);\n        responses[0].length = strlen(password);\n    }\n    (void)prompts;\n    (void)abstract;\n} /* kbd_callback */\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int rc, sock, i, auth_pw = 0;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session;\n    const char *sftppath=\"/tmp/secretdir\";\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    } else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        sftppath = argv[4];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n            sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    fprintf(stderr, \"Authentication methods: %s\\n\", userauthlist);\n    if (strstr(userauthlist, \"password\") != NULL) {\n        auth_pw |= 1;\n    }\n    if (strstr(userauthlist, \"keyboard-interactive\") != NULL) {\n        auth_pw |= 2;\n    }\n    if (strstr(userauthlist, \"publickey\") != NULL) {\n        auth_pw |= 4;\n    }\n\n    /* if we got an 5. argument we set this option if supported */\n    if(argc > 5) {\n        if ((auth_pw & 1) && !strcasecmp(argv[5], \"-p\")) {\n            auth_pw = 1;\n        }\n        if ((auth_pw & 2) && !strcasecmp(argv[5], \"-i\")) {\n            auth_pw = 2;\n        }\n        if ((auth_pw & 4) && !strcasecmp(argv[5], \"-k\")) {\n            auth_pw = 4;\n        }\n    }\n\n    if (auth_pw & 1) {\n        /* We could authenticate via password */\n        if (libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"\\tAuthentication by password failed!\\n\");\n            goto shutdown;\n        } else {\n            fprintf(stderr, \"\\tAuthentication by password succeeded.\\n\");\n        }\n    } else if (auth_pw & 2) {\n        /* Or via keyboard-interactive */\n        if (libssh2_userauth_keyboard_interactive(session, username,\n                                                  &kbd_callback) ) {\n            fprintf(stderr,\n                \"\\tAuthentication by keyboard-interactive failed!\\n\");\n            goto shutdown;\n        } else {\n            fprintf(stderr,\n                \"\\tAuthentication by keyboard-interactive succeeded.\\n\");\n        }\n    } else if (auth_pw & 4) {\n        /* Or by public key */\n        if (libssh2_userauth_publickey_fromfile(session, username, keyfile1,\n                                                keyfile2, password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed!\\n\");\n            goto shutdown;\n        } else {\n            fprintf(stderr, \"\\tAuthentication by public key succeeded.\\n\");\n        }\n    } else {\n        fprintf(stderr, \"No supported authentication methods found!\\n\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    sftp_session = libssh2_sftp_init(session);\n\n    if (!sftp_session) {\n        fprintf(stderr, \"Unable to init SFTP session\\n\");\n        goto shutdown;\n    }\n\n    /* Since we have not set non-blocking, tell libssh2 we are blocking */\n    libssh2_session_set_blocking(session, 1);\n\n    fprintf(stderr, \"libssh2_sftp_opendir()!\\n\");\n    /* Request a dir listing via SFTP */\n    sftp_handle = libssh2_sftp_opendir(sftp_session, sftppath);\n\n    if (!sftp_handle) {\n        fprintf(stderr, \"Unable to open dir with SFTP\\n\");\n        goto shutdown;\n    }\n    fprintf(stderr, \"libssh2_sftp_opendir() is done, now receive listing!\\n\");\n    do {\n        char mem[512];\n        char longentry[512];\n        LIBSSH2_SFTP_ATTRIBUTES attrs;\n\n        /* loop until we fail */\n        rc = libssh2_sftp_readdir_ex(sftp_handle, mem, sizeof(mem),\n                                     longentry, sizeof(longentry), &attrs);\n        if(rc > 0) {\n            /* rc is the length of the file name in the mem\n               buffer */\n\n            if (longentry[0] != '\\0') {\n                printf(\"%s\\n\", longentry);\n            } else {\n                if(attrs.flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) {\n                    /* this should check what permissions it\n                       is and print the output accordingly */\n                    printf(\"--fix----- \");\n                }\n                else {\n                    printf(\"---------- \");\n                }\n\n                if(attrs.flags & LIBSSH2_SFTP_ATTR_UIDGID) {\n                    printf(\"%4ld %4ld \", attrs.uid, attrs.gid);\n                }\n                else {\n                    printf(\"   -    - \");\n                }\n\n                if(attrs.flags & LIBSSH2_SFTP_ATTR_SIZE) {\n                    printf(\"%8\" PRIu64 \" \", attrs.filesize);\n                }\n\n                printf(\"%s\\n\", mem);\n            }\n        }\n        else\n            break;\n\n    } while (1);\n\n    libssh2_sftp_closedir(sftp_handle);\n    libssh2_sftp_shutdown(sftp_session);\n\n shutdown:\n\n    libssh2_session_disconnect(session, \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/sftpdir_nonblock.c",
    "content": "/*\n * Sample doing an SFTP directory listing.\n *\n * The sample code has default values for host name, user name, password and\n * path, but you can specify them on the command line like:\n *\n * \"sftpdir 192.168.0.1 user password /tmp/secretdir\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\n/* last resort for systems not defining PRIu64 in inttypes.h */\n#ifndef __PRI64_PREFIX\n#ifdef WIN32\n#define __PRI64_PREFIX \"I64\"\n#else\n#if __WORDSIZE == 64\n#define __PRI64_PREFIX \"l\"\n#else\n#define __PRI64_PREFIX \"ll\"\n#endif /* __WORDSIZE */\n#endif /* WIN32 */\n#endif /* !__PRI64_PREFIX */\n#ifndef PRIu64\n#define PRIu64 __PRI64_PREFIX \"u\"\n#endif  /* PRIu64 */\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username=\"username\";\n    const char *password=\"password\";\n    const char *sftppath=\"/tmp/secretdir\";\n    int rc;\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    } else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        sftppath = argv[4];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    while ((rc = libssh2_session_handshake(session, sock)) ==\n           LIBSSH2_ERROR_EAGAIN);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if (auth_pw) {\n        /* We could authenticate via password */\n        while ((rc = libssh2_userauth_password(session, username, password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n        if (rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else {\n        /* Or by public key */\n        while ((rc = libssh2_userauth_publickey_fromfile(session, username,\n                                                         \"/home/username/.ssh/id_rsa.pub\",\n                                                         \"/home/username/.ssh/id_rsa\",\n                                                         password)) == LIBSSH2_ERROR_EAGAIN);\n        if (rc) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    do {\n        sftp_session = libssh2_sftp_init(session);\n\n        if ((!sftp_session) && (libssh2_session_last_errno(session) !=\n                                LIBSSH2_ERROR_EAGAIN)) {\n            fprintf(stderr, \"Unable to init SFTP session\\n\");\n            goto shutdown;\n        }\n    } while (!sftp_session);\n\n    fprintf(stderr, \"libssh2_sftp_opendir()!\\n\");\n    /* Request a dir listing via SFTP */\n    do {\n        sftp_handle = libssh2_sftp_opendir(sftp_session, sftppath);\n\n        if ((!sftp_handle) && (libssh2_session_last_errno(session) !=\n                               LIBSSH2_ERROR_EAGAIN)) {\n            fprintf(stderr, \"Unable to open dir with SFTP\\n\");\n            goto shutdown;\n        }\n    } while (!sftp_handle);\n\n    fprintf(stderr, \"libssh2_sftp_opendir() is done, now receive listing!\\n\");\n    do {\n        char mem[512];\n        LIBSSH2_SFTP_ATTRIBUTES attrs;\n\n        /* loop until we fail */\n        while ((rc = libssh2_sftp_readdir(sftp_handle, mem, sizeof(mem),\n                                          &attrs)) == LIBSSH2_ERROR_EAGAIN) {\n            ;\n        }\n        if(rc > 0) {\n            /* rc is the length of the file name in the mem\n               buffer */\n\n            if(attrs.flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) {\n                /* this should check what permissions it\n                   is and print the output accordingly */\n                printf(\"--fix----- \");\n            } else {\n                printf(\"---------- \");\n            }\n\n            if(attrs.flags & LIBSSH2_SFTP_ATTR_UIDGID) {\n                printf(\"%4ld %4ld \", attrs.uid, attrs.gid);\n            } else {\n                printf(\"   -    - \");\n            }\n\n            if(attrs.flags & LIBSSH2_SFTP_ATTR_SIZE) {\n                printf(\"%8\" PRIu64 \" \", attrs.filesize);\n            }\n\n            printf(\"%s\\n\", mem);\n        }\n        else if (rc == LIBSSH2_ERROR_EAGAIN) {\n            /* blocking */\n            fprintf(stderr, \"Blocking\\n\");\n        } else {\n            break;\n        }\n\n    } while (1);\n\n    libssh2_sftp_closedir(sftp_handle);\n    libssh2_sftp_shutdown(sftp_session);\n\n  shutdown:\n\n    libssh2_session_disconnect(session, \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/ssh2.c",
    "content": "/*\n * Sample showing how to do SSH2 connect.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"ssh2 host user password [-p|-i|-k]\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINDOWS_H\n# include <windows.h>\n#endif\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n# ifdef HAVE_ARPA_INET_H\n#include <arpa/inet.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\n\nconst char *keyfile1=\"~/.ssh/id_rsa.pub\";\nconst char *keyfile2=\"~/.ssh/id_rsa\";\nconst char *username=\"username\";\nconst char *password=\"password\";\n\n\nstatic void kbd_callback(const char *name, int name_len,\n                         const char *instruction, int instruction_len,\n                         int num_prompts,\n                         const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,\n                         LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses,\n                         void **abstract)\n{\n    (void)name;\n    (void)name_len;\n    (void)instruction;\n    (void)instruction_len;\n    if (num_prompts == 1) {\n        responses[0].text = strdup(password);\n        responses[0].length = strlen(password);\n    }\n    (void)prompts;\n    (void)abstract;\n} /* kbd_callback */\n\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int rc, sock, i, auth_pw = 0;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    } else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Ultra basic \"connect to port 22 on localhost\".  Your code is\n     * responsible for creating the socket establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance and start it up. This will trade welcome\n     * banners, exchange keys, and setup crypto, compression, and MAC layers\n     */\n    session = libssh2_session_init();\n    if (libssh2_session_handshake(session, sock)) {\n        fprintf(stderr, \"Failure establishing SSH session\\n\");\n        return -1;\n    }\n\n    /* At this point we havn't authenticated. The first thing to do is check\n     * the hostkey's fingerprint against our known hosts Your app may have it\n     * hard coded, may go to a file, may present it to the user, that's your\n     * call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    fprintf(stderr, \"Authentication methods: %s\\n\", userauthlist);\n    if (strstr(userauthlist, \"password\") != NULL) {\n        auth_pw |= 1;\n    }\n    if (strstr(userauthlist, \"keyboard-interactive\") != NULL) {\n        auth_pw |= 2;\n    }\n    if (strstr(userauthlist, \"publickey\") != NULL) {\n        auth_pw |= 4;\n    }\n\n    /* if we got an 4. argument we set this option if supported */\n    if(argc > 4) {\n        if ((auth_pw & 1) && !strcasecmp(argv[4], \"-p\")) {\n            auth_pw = 1;\n        }\n        if ((auth_pw & 2) && !strcasecmp(argv[4], \"-i\")) {\n            auth_pw = 2;\n        }\n        if ((auth_pw & 4) && !strcasecmp(argv[4], \"-k\")) {\n            auth_pw = 4;\n        }\n    }\n\n    if (auth_pw & 1) {\n        /* We could authenticate via password */\n        if (libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"\\tAuthentication by password failed!\\n\");\n            goto shutdown;\n        } else {\n            fprintf(stderr, \"\\tAuthentication by password succeeded.\\n\");\n        }\n    } else if (auth_pw & 2) {\n        /* Or via keyboard-interactive */\n        if (libssh2_userauth_keyboard_interactive(session, username,\n                                                  &kbd_callback) ) {\n            fprintf(stderr,\n                \"\\tAuthentication by keyboard-interactive failed!\\n\");\n            goto shutdown;\n        } else {\n            fprintf(stderr,\n                \"\\tAuthentication by keyboard-interactive succeeded.\\n\");\n        }\n    } else if (auth_pw & 4) {\n        /* Or by public key */\n        if (libssh2_userauth_publickey_fromfile(session, username, keyfile1,\n                                                keyfile2, password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed!\\n\");\n            goto shutdown;\n        } else {\n            fprintf(stderr, \"\\tAuthentication by public key succeeded.\\n\");\n        }\n    } else {\n        fprintf(stderr, \"No supported authentication methods found!\\n\");\n        goto shutdown;\n    }\n\n    /* Request a shell */\n    if (!(channel = libssh2_channel_open_session(session))) {\n        fprintf(stderr, \"Unable to open a session\\n\");\n        goto shutdown;\n    }\n\n    /* Some environment variables may be set,\n     * It's up to the server which ones it'll allow though\n     */\n    libssh2_channel_setenv(channel, \"FOO\", \"bar\");\n\n    /* Request a terminal with 'vanilla' terminal emulation\n     * See /etc/termcap for more options\n     */\n    if (libssh2_channel_request_pty(channel, \"vanilla\")) {\n        fprintf(stderr, \"Failed requesting pty\\n\");\n        goto skip_shell;\n    }\n\n    /* Open a SHELL on that pty */\n    if (libssh2_channel_shell(channel)) {\n        fprintf(stderr, \"Unable to request shell on allocated pty\\n\");\n        goto shutdown;\n    }\n\n    /* At this point the shell can be interacted with using\n     * libssh2_channel_read()\n     * libssh2_channel_read_stderr()\n     * libssh2_channel_write()\n     * libssh2_channel_write_stderr()\n     *\n     * Blocking mode may be (en|dis)abled with: libssh2_channel_set_blocking()\n     * If the server send EOF, libssh2_channel_eof() will return non-0\n     * To send EOF to the server use: libssh2_channel_send_eof()\n     * A channel can be closed with: libssh2_channel_close()\n     * A channel can be freed with: libssh2_channel_free()\n     */\n\n  skip_shell:\n    if (channel) {\n        libssh2_channel_free(channel);\n        channel = NULL;\n    }\n\n    /* Other channel types are supported via:\n     * libssh2_scp_send()\n     * libssh2_scp_recv2()\n     * libssh2_channel_direct_tcpip()\n     */\n\n  shutdown:\n\n    libssh2_session_disconnect(session,\n                               \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done!\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/ssh2_agent.c",
    "content": "/*\n * Sample showing how to do SSH2 connect using ssh-agent.\n *\n * The sample code has default values for host name, user name:\n *\n * \"ssh2_agent host user\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINDOWS_H\n# include <windows.h>\n#endif\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n# ifdef HAVE_ARPA_INET_H\n#include <arpa/inet.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <stdlib.h>\n\nconst char *username=\"username\";\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock = -1, i, rc;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session = NULL;\n    LIBSSH2_CHANNEL *channel;\n    LIBSSH2_AGENT *agent = NULL;\n    struct libssh2_agent_publickey *identity, *prev_identity = NULL;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    } else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Ultra basic \"connect to port 22 on localhost\".  Your code is\n     * responsible for creating the socket establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n    if (sock == -1) {\n        fprintf(stderr, \"failed to create socket!\\n\");\n        rc = 1;\n        goto shutdown;\n    }\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        goto shutdown;\n    }\n\n    /* Create a session instance and start it up. This will trade welcome\n     * banners, exchange keys, and setup crypto, compression, and MAC layers\n     */\n    session = libssh2_session_init();\n    if (libssh2_session_handshake(session, sock)) {\n        fprintf(stderr, \"Failure establishing SSH session\\n\");\n        return 1;\n    }\n\n    /* At this point we havn't authenticated. The first thing to do is check\n     * the hostkey's fingerprint against our known hosts Your app may have it\n     * hard coded, may go to a file, may present it to the user, that's your\n     * call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    fprintf(stderr, \"Authentication methods: %s\\n\", userauthlist);\n    if (strstr(userauthlist, \"publickey\") == NULL) {\n        fprintf(stderr, \"\\\"publickey\\\" authentication is not supported\\n\");\n        goto shutdown;\n    }\n\n    /* Connect to the ssh-agent */\n    agent = libssh2_agent_init(session);\n    if (!agent) {\n        fprintf(stderr, \"Failure initializing ssh-agent support\\n\");\n        rc = 1;\n        goto shutdown;\n    }\n    if (libssh2_agent_connect(agent)) {\n        fprintf(stderr, \"Failure connecting to ssh-agent\\n\");\n        rc = 1;\n        goto shutdown;\n    }\n    if (libssh2_agent_list_identities(agent)) {\n        fprintf(stderr, \"Failure requesting identities to ssh-agent\\n\");\n        rc = 1;\n        goto shutdown;\n    }\n    while (1) {\n        rc = libssh2_agent_get_identity(agent, &identity, prev_identity);\n        if (rc == 1)\n            break;\n        if (rc < 0) {\n            fprintf(stderr,\n                    \"Failure obtaining identity from ssh-agent support\\n\");\n            rc = 1;\n            goto shutdown;\n        }\n        if (libssh2_agent_userauth(agent, username, identity)) {\n            fprintf(stderr, \"\\tAuthentication with username %s and \"\n                   \"public key %s failed!\\n\",\n                   username, identity->comment);\n        } else {\n            fprintf(stderr, \"\\tAuthentication with username %s and \"\n                   \"public key %s succeeded!\\n\",\n                   username, identity->comment);\n            break;\n        }\n        prev_identity = identity;\n    }\n    if (rc) {\n        fprintf(stderr, \"Couldn't continue authentication\\n\");\n        goto shutdown;\n    }\n\n    /* We're authenticated now. */\n\n    /* Request a shell */\n    if (!(channel = libssh2_channel_open_session(session))) {\n        fprintf(stderr, \"Unable to open a session\\n\");\n        goto shutdown;\n    }\n\n    /* Some environment variables may be set,\n     * It's up to the server which ones it'll allow though\n     */\n    libssh2_channel_setenv(channel, \"FOO\", \"bar\");\n\n    /* Request a terminal with 'vanilla' terminal emulation\n     * See /etc/termcap for more options\n     */\n    if (libssh2_channel_request_pty(channel, \"vanilla\")) {\n        fprintf(stderr, \"Failed requesting pty\\n\");\n        goto skip_shell;\n    }\n\n    /* Open a SHELL on that pty */\n    if (libssh2_channel_shell(channel)) {\n        fprintf(stderr, \"Unable to request shell on allocated pty\\n\");\n        goto shutdown;\n    }\n\n    /* At this point the shell can be interacted with using\n     * libssh2_channel_read()\n     * libssh2_channel_read_stderr()\n     * libssh2_channel_write()\n     * libssh2_channel_write_stderr()\n     *\n     * Blocking mode may be (en|dis)abled with: libssh2_channel_set_blocking()\n     * If the server send EOF, libssh2_channel_eof() will return non-0\n     * To send EOF to the server use: libssh2_channel_send_eof()\n     * A channel can be closed with: libssh2_channel_close()\n     * A channel can be freed with: libssh2_channel_free()\n     */\n\n  skip_shell:\n    if (channel) {\n        libssh2_channel_free(channel);\n        channel = NULL;\n    }\n\n    /* Other channel types are supported via:\n     * libssh2_scp_send()\n     * libssh2_scp_recv2()\n     * libssh2_channel_direct_tcpip()\n     */\n\n  shutdown:\n\n    libssh2_agent_disconnect(agent);\n    libssh2_agent_free(agent);\n\n    if(session) {\n        libssh2_session_disconnect(session,\n                                   \"Normal Shutdown, Thank you for playing\");\n        libssh2_session_free(session);\n    }\n\n    if (sock != -1) {\n#ifdef WIN32\n        closesocket(sock);\n#else\n        close(sock);\n#endif\n    }\n\n    fprintf(stderr, \"all done!\\n\");\n\n    libssh2_exit();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/ssh2_echo.c",
    "content": "/*\n * Run it like this:\n *\n * $ ./ssh2_echo 127.0.0.1 user password\n *\n * The code sends a 'cat' command, and then writes a lot of data to it only to\n * check that reading the returned data sums up to the same amount.\n *\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif\n#include <sys/types.h>\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\nstatic int waitsocket(int socket_fd, LIBSSH2_SESSION *session)\n{\n    struct timeval timeout;\n    int rc;\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n    int dir;\n\n    timeout.tv_sec = 10;\n    timeout.tv_usec = 0;\n\n    FD_ZERO(&fd);\n\n    FD_SET(socket_fd, &fd);\n\n    /* now make sure we wait in the correct direction */\n    dir = libssh2_session_block_directions(session);\n\n    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n        readfd = &fd;\n\n    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n        writefd = &fd;\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n\n    return rc;\n}\n\n#define BUFSIZE 32000\n\nint main(int argc, char *argv[])\n{\n    const char *hostname = \"127.0.0.1\";\n    const char *commandline = \"cat\";\n    const char *username    = \"user\";\n    const char *password    = \"password\";\n    unsigned long hostaddr;\n    int sock;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel;\n    int rc;\n    int exitcode = 0;\n    char *exitsignal=(char *)\"none\";\n    size_t len;\n    LIBSSH2_KNOWNHOSTS *nh;\n    int type;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1)\n        /* must be ip address only */\n        hostname = argv[1];\n\n    if (argc > 2) {\n        username = argv[2];\n    }\n    if (argc > 3) {\n        password = argv[3];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    hostaddr = inet_addr(hostname);\n\n    /* Ultra basic \"connect to port 22 on localhost\"\n     * Your code is responsible for creating the socket establishing the\n     * connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if (!session)\n        return -1;\n\n    /* tell libssh2 we want it all done non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    while ((rc = libssh2_session_handshake(session, sock)) ==\n           LIBSSH2_ERROR_EAGAIN);\n    if (rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    nh = libssh2_knownhost_init(session);\n    if(!nh) {\n        /* eeek, do cleanup here */\n        return 2;\n    }\n\n    /* read all hosts from here */\n    libssh2_knownhost_readfile(nh, \"known_hosts\",\n                               LIBSSH2_KNOWNHOST_FILE_OPENSSH);\n\n    /* store all known hosts to here */\n    libssh2_knownhost_writefile(nh, \"dumpfile\",\n                                LIBSSH2_KNOWNHOST_FILE_OPENSSH);\n\n    fingerprint = libssh2_session_hostkey(session, &len, &type);\n    if(fingerprint) {\n        struct libssh2_knownhost *host;\n        int check = libssh2_knownhost_checkp(nh, hostname, 22,\n                                             fingerprint, len,\n                                             LIBSSH2_KNOWNHOST_TYPE_PLAIN|\n                                             LIBSSH2_KNOWNHOST_KEYENC_RAW,\n                                             &host);\n\n        fprintf(stderr, \"Host check: %d, key: %s\\n\", check,\n                (check <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH)?\n                host->key:\"<none>\");\n\n        /*****\n         * At this point, we could verify that 'check' tells us the key is\n         * fine or bail out.\n         *****/\n    }\n    else {\n        /* eeek, do cleanup here */\n        return 3;\n    }\n    libssh2_knownhost_free(nh);\n\n    if ( strlen(password) != 0 ) {\n        /* We could authenticate via password */\n        while ((rc = libssh2_userauth_password(session, username, password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n        if (rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            exit(1);\n        }\n    }\n\n    libssh2_trace(session, LIBSSH2_TRACE_SOCKET);\n\n    /* Exec non-blocking on the remove host */\n    while( (channel = libssh2_channel_open_session(session)) == NULL &&\n           libssh2_session_last_error(session,NULL,NULL,0) ==\n           LIBSSH2_ERROR_EAGAIN ) {\n        waitsocket(sock, session);\n    }\n    if( channel == NULL ) {\n        fprintf(stderr,\"Error\\n\");\n        exit( 1 );\n    }\n    while( (rc = libssh2_channel_exec(channel, commandline)) ==\n           LIBSSH2_ERROR_EAGAIN )\n        waitsocket(sock, session);\n\n    if( rc != 0 ) {\n        fprintf(stderr, \"exec error\\n\");\n        exit( 1 );\n    }\n    else {\n        LIBSSH2_POLLFD *fds = NULL;\n        int running = 1;\n        int bufsize = BUFSIZE;\n        char buffer[BUFSIZE];\n        int totsize = 1500000;\n        int totwritten = 0;\n        int totread = 0;\n        int partials = 0;\n        int rereads = 0;\n        int rewrites = 0;\n        int i;\n\n        for (i = 0; i < BUFSIZE; i++)\n            buffer[i] = 'A';\n\n        if ((fds = malloc (sizeof (LIBSSH2_POLLFD))) == NULL) {\n            fprintf(stderr, \"malloc failed\\n\");\n            exit(1);\n        }\n\n        fds[0].type = LIBSSH2_POLLFD_CHANNEL;\n        fds[0].fd.channel = channel;\n        fds[0].events = LIBSSH2_POLLFD_POLLIN | LIBSSH2_POLLFD_POLLOUT;\n\n        do {\n            int rc = (libssh2_poll(fds, 1, 10));\n            int act = 0;\n\n            if (rc < 1)\n                continue;\n\n            if (fds[0].revents & LIBSSH2_POLLFD_POLLIN) {\n                int n = libssh2_channel_read(channel, buffer, sizeof(buffer));\n                act++;\n\n                if (n == LIBSSH2_ERROR_EAGAIN) {\n                    rereads++;\n                    fprintf(stderr, \"will read again\\n\");\n                }\n                else if (n < 0) {\n                    fprintf(stderr, \"read failed\\n\");\n                    exit(1);\n                }\n                else {\n                    totread += n;\n                    fprintf(stderr, \"read %d bytes (%d in total)\\n\",\n                            n, totread);\n                }\n            }\n\n            if (fds[0].revents & LIBSSH2_POLLFD_POLLOUT) {\n                act++;\n\n                if (totwritten < totsize) {\n                    /* we have not written all data yet */\n                    int left = totsize - totwritten;\n                    int size = (left < bufsize) ? left : bufsize;\n                    int n = libssh2_channel_write_ex(channel, 0, buffer, size);\n\n                    if (n == LIBSSH2_ERROR_EAGAIN) {\n                        rewrites++;\n                        fprintf(stderr, \"will write again\\n\");\n                    }\n                    else if (n < 0) {\n                        fprintf(stderr, \"write failed\\n\");\n                        exit(1);\n                    }\n                    else {\n                        totwritten += n;\n                        fprintf(stderr, \"wrote %d bytes (%d in total)\",\n                                n, totwritten);\n                        if (left >= bufsize && n != bufsize) {\n                            partials++;\n                            fprintf(stderr, \" PARTIAL\");\n                        }\n                        fprintf(stderr, \"\\n\");\n                    }\n                } else {\n                    /* all data written, send EOF */\n                    rc = libssh2_channel_send_eof(channel);\n\n                    if (rc == LIBSSH2_ERROR_EAGAIN) {\n                        fprintf(stderr, \"will send eof again\\n\");\n                    }\n                    else if (rc < 0) {\n                        fprintf(stderr, \"send eof failed\\n\");\n                        exit(1);\n                    }\n                    else {\n                        fprintf(stderr, \"sent eof\\n\");\n                        /* we're done writing, stop listening for OUT events */\n                        fds[0].events &= ~LIBSSH2_POLLFD_POLLOUT;\n                    }\n                }\n            }\n\n            if (fds[0].revents & LIBSSH2_POLLFD_CHANNEL_CLOSED) {\n                if (!act) /* don't leave loop until we have read all data */\n                    running = 0;\n            }\n        } while(running);\n\n        exitcode = 127;\n        while( (rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN )\n            waitsocket(sock, session);\n\n        if( rc == 0 ) {\n            exitcode = libssh2_channel_get_exit_status( channel );\n            libssh2_channel_get_exit_signal(channel, &exitsignal,\n                                            NULL, NULL, NULL, NULL, NULL);\n        }\n\n        if (exitsignal)\n            fprintf(stderr, \"\\nGot signal: %s\\n\", exitsignal);\n\n        libssh2_channel_free(channel);\n        channel = NULL;\n\n        fprintf(stderr, \"\\nrereads: %d rewrites: %d totwritten %d\\n\",\n                rereads, rewrites, totwritten);\n\n        if (totwritten != totread) {\n            fprintf(stderr, \"\\n*** FAIL bytes written: %d bytes \"\n                    \"read: %d ***\\n\", totwritten, totread);\n            exit(1);\n        }\n    }\n\n    libssh2_session_disconnect(session,\n                               \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return exitcode;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/ssh2_exec.c",
    "content": "/*\n * Sample showing how to use libssh2 to execute a command remotely.\n *\n * The sample code has fixed values for host name, user name, password\n * and command to run.\n *\n * Run it like this:\n *\n * $ ./ssh2_exec 127.0.0.1 user password \"uptime\"\n *\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif\n#include <sys/types.h>\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\nstatic int waitsocket(int socket_fd, LIBSSH2_SESSION *session)\n{\n    struct timeval timeout;\n    int rc;\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n    int dir;\n\n    timeout.tv_sec = 10;\n    timeout.tv_usec = 0;\n\n    FD_ZERO(&fd);\n\n    FD_SET(socket_fd, &fd);\n\n    /* now make sure we wait in the correct direction */\n    dir = libssh2_session_block_directions(session);\n\n    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n        readfd = &fd;\n\n    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n        writefd = &fd;\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n\n    return rc;\n}\n\nint main(int argc, char *argv[])\n{\n    const char *hostname = \"127.0.0.1\";\n    const char *commandline = \"uptime\";\n    const char *username    = \"user\";\n    const char *password    = \"password\";\n    unsigned long hostaddr;\n    int sock;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel;\n    int rc;\n    int exitcode;\n    char *exitsignal=(char *)\"none\";\n    int bytecount = 0;\n    size_t len;\n    LIBSSH2_KNOWNHOSTS *nh;\n    int type;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if (argc > 1)\n        /* must be ip address only */\n        hostname = argv[1];\n\n    if (argc > 2) {\n        username = argv[2];\n    }\n    if (argc > 3) {\n        password = argv[3];\n    }\n    if (argc > 4) {\n        commandline = argv[4];\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    hostaddr = inet_addr(hostname);\n\n    /* Ultra basic \"connect to port 22 on localhost\"\n     * Your code is responsible for creating the socket establishing the\n     * connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if (!session)\n        return -1;\n\n    /* tell libssh2 we want it all done non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    while ((rc = libssh2_session_handshake(session, sock)) ==\n           LIBSSH2_ERROR_EAGAIN);\n    if (rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    nh = libssh2_knownhost_init(session);\n    if(!nh) {\n        /* eeek, do cleanup here */\n        return 2;\n    }\n\n    /* read all hosts from here */\n    libssh2_knownhost_readfile(nh, \"known_hosts\",\n                               LIBSSH2_KNOWNHOST_FILE_OPENSSH);\n\n    /* store all known hosts to here */\n    libssh2_knownhost_writefile(nh, \"dumpfile\",\n                                LIBSSH2_KNOWNHOST_FILE_OPENSSH);\n\n    fingerprint = libssh2_session_hostkey(session, &len, &type);\n    if(fingerprint) {\n        struct libssh2_knownhost *host;\n#if LIBSSH2_VERSION_NUM >= 0x010206\n        /* introduced in 1.2.6 */\n        int check = libssh2_knownhost_checkp(nh, hostname, 22,\n                                             fingerprint, len,\n                                             LIBSSH2_KNOWNHOST_TYPE_PLAIN|\n                                             LIBSSH2_KNOWNHOST_KEYENC_RAW,\n                                             &host);\n#else\n        /* 1.2.5 or older */\n        int check = libssh2_knownhost_check(nh, hostname,\n                                            fingerprint, len,\n                                            LIBSSH2_KNOWNHOST_TYPE_PLAIN|\n                                            LIBSSH2_KNOWNHOST_KEYENC_RAW,\n                                            &host);\n#endif\n        fprintf(stderr, \"Host check: %d, key: %s\\n\", check,\n                (check <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH)?\n                host->key:\"<none>\");\n\n        /*****\n         * At this point, we could verify that 'check' tells us the key is\n         * fine or bail out.\n         *****/\n    }\n    else {\n        /* eeek, do cleanup here */\n        return 3;\n    }\n    libssh2_knownhost_free(nh);\n\n    if ( strlen(password) != 0 ) {\n        /* We could authenticate via password */\n        while ((rc = libssh2_userauth_password(session, username, password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n        if (rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else {\n        /* Or by public key */\n        while ((rc = libssh2_userauth_publickey_fromfile(session, username,\n                                                         \"/home/user/\"\n                                                         \".ssh/id_rsa.pub\",\n                                                         \"/home/user/\"\n                                                         \".ssh/id_rsa\",\n                                                         password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n        if (rc) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n#if 0\n    libssh2_trace(session, ~0 );\n#endif\n\n    /* Exec non-blocking on the remove host */\n    while( (channel = libssh2_channel_open_session(session)) == NULL &&\n           libssh2_session_last_error(session,NULL,NULL,0) ==\n           LIBSSH2_ERROR_EAGAIN )\n    {\n        waitsocket(sock, session);\n    }\n    if( channel == NULL )\n    {\n        fprintf(stderr,\"Error\\n\");\n        exit( 1 );\n    }\n    while( (rc = libssh2_channel_exec(channel, commandline)) ==\n           LIBSSH2_ERROR_EAGAIN )\n    {\n        waitsocket(sock, session);\n    }\n    if( rc != 0 )\n    {\n        fprintf(stderr,\"Error\\n\");\n        exit( 1 );\n    }\n    for( ;; )\n    {\n        /* loop until we block */\n        int rc;\n        do\n        {\n            char buffer[0x4000];\n            rc = libssh2_channel_read( channel, buffer, sizeof(buffer) );\n            if( rc > 0 )\n            {\n                int i;\n                bytecount += rc;\n                fprintf(stderr, \"We read:\\n\");\n                for( i=0; i < rc; ++i )\n                    fputc( buffer[i], stderr);\n                fprintf(stderr, \"\\n\");\n            }\n            else {\n                if( rc != LIBSSH2_ERROR_EAGAIN )\n                    /* no need to output this for the EAGAIN case */\n                    fprintf(stderr, \"libssh2_channel_read returned %d\\n\", rc);\n            }\n        }\n        while( rc > 0 );\n\n        /* this is due to blocking that would occur otherwise so we loop on\n           this condition */\n        if( rc == LIBSSH2_ERROR_EAGAIN )\n        {\n            waitsocket(sock, session);\n        }\n        else\n            break;\n    }\n    exitcode = 127;\n    while( (rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN )\n        waitsocket(sock, session);\n\n    if( rc == 0 )\n    {\n        exitcode = libssh2_channel_get_exit_status( channel );\n        libssh2_channel_get_exit_signal(channel, &exitsignal,\n                                        NULL, NULL, NULL, NULL, NULL);\n    }\n\n    if (exitsignal)\n        fprintf(stderr, \"\\nGot signal: %s\\n\", exitsignal);\n    else \n        fprintf(stderr, \"\\nEXIT: %d bytecount: %d\\n\", exitcode, bytecount);\n\n    libssh2_channel_free(channel);\n    channel = NULL;\n\nshutdown:\n\n    libssh2_session_disconnect(session,\n                               \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/subsystem_netconf.c",
    "content": "#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef WIN32\n#include <windows.h>\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#else\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <sys/time.h>\n#endif\n\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <string.h>\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#include <sys/types.h>\n#ifdef HAVE_SYS_SELECT_H\n#include <sys/select.h>\n#endif\n\n#ifndef INADDR_NONE\n#define INADDR_NONE (in_addr_t)~0\n#endif\n\n#ifndef HAVE_SNPRINTF\n# ifdef HAVE__SNPRINTF\n# define snprintf _snprintf\n# endif\n#endif\n\nconst char *keyfile1 = \"/home/username/.ssh/id_rsa.pub\";\nconst char *keyfile2 = \"/home/username/.ssh/id_rsa\";\nconst char *username = \"username\";\nconst char *password = \"\";\n\nconst char *server_ip = \"127.0.0.1\";\n\nenum {\n    AUTH_NONE = 0,\n    AUTH_PASSWORD,\n    AUTH_PUBLICKEY\n};\n\nstatic int netconf_write(LIBSSH2_CHANNEL *channel, const char *buf, size_t len)\n{\n    int i;\n    ssize_t wr = 0;\n\n    do {\n        i = libssh2_channel_write(channel, buf, len);\n        if (i < 0) {\n            fprintf(stderr, \"libssh2_channel_write: %d\\n\", i);\n            return -1;\n        }\n        wr += i;\n    } while (i > 0 && wr < (ssize_t)len);\n\n    return 0;\n}\n\nstatic int netconf_read_until(LIBSSH2_CHANNEL *channel, const char *endtag,\n                              char *buf, size_t buflen)\n{\n    ssize_t len;\n    size_t rd = 0;\n    char *endreply = NULL, *specialsequence = NULL;\n\n    memset(buf, 0, buflen);\n\n    do {\n        len = libssh2_channel_read(channel, buf + rd, buflen - rd);\n        if (LIBSSH2_ERROR_EAGAIN == len)\n            continue;\n        else if (len < 0) {\n            fprintf(stderr, \"libssh2_channel_read: %d\\n\", (int)len);\n            return -1;\n        }\n        rd += len;\n\n        /* read more data until we see a rpc-reply closing tag followed by\n         * the special sequence ]]>]]> */\n\n        /* really, this MUST be replaced with proper XML parsing! */\n\n        endreply = strstr(buf, endtag);\n        if (endreply)\n            specialsequence = strstr(endreply, \"]]>]]>\");\n\n    } while (!specialsequence && rd < buflen);\n\n    if (!specialsequence) {\n        fprintf(stderr, \"%s: ]]>]]> not found! read buffer too small?\\n\", __func__);\n        return -1;\n    }\n\n    /* discard the special sequence so that only XML is returned */\n    rd = specialsequence - buf;\n    buf[rd] = 0;\n\n    return rd;\n}\n\nint main(int argc, char *argv[])\n{\n    int rc, i, auth = AUTH_NONE;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel = NULL;\n    char buf[1048576]; /* avoid any buffer reallocation for simplicity */\n    ssize_t len;\n\n#ifdef WIN32\n    SOCKET sock = INVALID_SOCKET;\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#else\n    int sock = -1;\n#endif\n\n    if (argc > 1)\n        server_ip = argv[1];\n    if (argc > 2)\n        username = argv[2];\n    if (argc > 3)\n        password = argv[3];\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Connect to SSH server */\n    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);\n#ifdef WIN32\n    if (sock == INVALID_SOCKET) {\n        fprintf(stderr, \"failed to open socket!\\n\");\n        return -1;\n    }\n#else\n    if (sock == -1) {\n        perror(\"socket\");\n        return -1;\n    }\n#endif\n\n    sin.sin_family = AF_INET;\n    if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(server_ip))) {\n        fprintf(stderr, \"inet_addr: Invalid IP address \\\"%s\\\"\\n\", server_ip);\n        return -1;\n    }\n    sin.sin_port = htons(830);\n    if (connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"Failed to connect to %s!\\n\", inet_ntoa(sin.sin_addr));\n        return -1;\n    }\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if(!session) {\n        fprintf(stderr, \"Could not initialize SSH session!\\n\");\n        return -1;\n    }\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Error when starting up SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++)\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    fprintf(stderr, \"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    fprintf(stderr, \"Authentication methods: %s\\n\", userauthlist);\n    if (strstr(userauthlist, \"password\"))\n        auth |= AUTH_PASSWORD;\n    if (strstr(userauthlist, \"publickey\"))\n        auth |= AUTH_PUBLICKEY;\n\n    /* check for options */\n    if(argc > 4) {\n        if ((auth & AUTH_PASSWORD) && !strcasecmp(argv[4], \"-p\"))\n            auth = AUTH_PASSWORD;\n        if ((auth & AUTH_PUBLICKEY) && !strcasecmp(argv[4], \"-k\"))\n            auth = AUTH_PUBLICKEY;\n    }\n\n    if (auth & AUTH_PASSWORD) {\n        if (libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else if (auth & AUTH_PUBLICKEY) {\n        if (libssh2_userauth_publickey_fromfile(session, username, keyfile1,\n                                                keyfile2, password)) {\n            fprintf(stderr, \"Authentication by public key failed!\\n\");\n            goto shutdown;\n        }\n        fprintf(stderr, \"Authentication by public key succeeded.\\n\");\n    } else {\n        fprintf(stderr, \"No supported authentication methods found!\\n\");\n        goto shutdown;\n    }\n\n    /* open a channel */\n    channel = libssh2_channel_open_session(session);\n    if (!channel) {\n        fprintf(stderr, \"Could not open the channel!\\n\"\n                \"(Note that this can be a problem at the server!\"\n                \" Please review the server logs.)\\n\");\n        goto shutdown;\n    }\n\n    /* execute the subsystem on our channel */\n    if (libssh2_channel_subsystem(channel, \"netconf\")) {\n        fprintf(stderr, \"Could not execute the \\\"netconf\\\" subsystem!\\n\"\n                \"(Note that this can be a problem at the server!\"\n                \" Please review the server logs.)\\n\");\n        goto shutdown;\n    }\n\n    /* NETCONF: https://tools.ietf.org/html/draft-ietf-netconf-ssh-06 */\n\n    fprintf(stderr, \"Sending NETCONF client <hello>\\n\");\n    snprintf(buf, sizeof(buf),\n      \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\"\n      \"<hello>\"\n      \"<capabilities>\"\n      \"<capability>urn:ietf:params:xml:ns:netconf:base:1.0</capability>\"\n      \"</capabilities>\"\n      \"</hello>\\n\"\n      \"]]>]]>\\n%n\", (int *)&len);\n    if (-1 == netconf_write(channel, buf, len))\n        goto shutdown;\n\n    fprintf(stderr, \"Reading NETCONF server <hello>\\n\");\n    len = netconf_read_until(channel, \"</hello>\", buf, sizeof(buf));\n    if (-1 == len)\n        goto shutdown;\n\n    fprintf(stderr, \"Got %d bytes:\\n----------------------\\n%s\", (int)len, buf);\n\n    fprintf(stderr, \"Sending NETCONF <rpc>\\n\");\n    snprintf(buf, sizeof(buf),\n      \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\"\n      \"<rpc xmlns=\\\"urn:ietf:params:xml:ns:netconf:base:1.0\\\">\"\n      \"<get-interface-information><terse/></get-interface-information>\"\n      \"</rpc>\\n\"\n      \"]]>]]>\\n%n\", (int *)&len);\n    if (-1 == netconf_write(channel, buf, len))\n        goto shutdown;\n\n    fprintf(stderr, \"Reading NETCONF <rpc-reply>\\n\");\n    len = netconf_read_until(channel, \"</rpc-reply>\", buf, sizeof(buf));\n    if (-1 == len)\n        goto shutdown;\n\n    fprintf(stderr, \"Got %d bytes:\\n----------------------\\n%s\", (int)len, buf);\n\nshutdown:\n    if (channel)\n        libssh2_channel_free(channel);\n    libssh2_session_disconnect(session, \"Client disconnecting normally\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/tcpip-forward.c",
    "content": "#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef WIN32\n#include <windows.h>\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#else\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <sys/time.h>\n#endif\n\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#include <sys/types.h>\n#ifdef HAVE_SYS_SELECT_H\n#include <sys/select.h>\n#endif\n\n#ifndef INADDR_NONE\n#define INADDR_NONE (in_addr_t)-1\n#endif\n\nconst char *keyfile1 = \"/home/username/.ssh/id_rsa.pub\";\nconst char *keyfile2 = \"/home/username/.ssh/id_rsa\";\nconst char *username = \"username\";\nconst char *password = \"\";\n\nconst char *server_ip = \"127.0.0.1\";\n\nconst char *remote_listenhost = \"localhost\"; /* resolved by the server */\nint remote_wantport = 2222;\nint remote_listenport;\n\nconst char *local_destip = \"127.0.0.1\";\nint local_destport = 22;\n\nenum {\n    AUTH_NONE = 0,\n    AUTH_PASSWORD,\n    AUTH_PUBLICKEY\n};\n\nint main(int argc, char *argv[])\n{\n    int rc, i, auth = AUTH_NONE;\n    struct sockaddr_in sin;\n    socklen_t sinlen = sizeof(sin);\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_LISTENER *listener = NULL;\n    LIBSSH2_CHANNEL *channel = NULL;\n    fd_set fds;\n    struct timeval tv;\n    ssize_t len, wr;\n    char buf[16384];\n\n#ifdef WIN32\n    SOCKET sock = INVALID_SOCKET, forwardsock = INVALID_SOCKET;\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#else\n    int sock = -1, forwardsock = -1;\n#endif\n\n    if (argc > 1)\n        server_ip = argv[1];\n    if (argc > 2)\n        username = argv[2];\n    if (argc > 3)\n        password = argv[3];\n    if (argc > 4)\n        remote_listenhost = argv[4];\n    if (argc > 5)\n        remote_wantport = atoi(argv[5]);\n    if (argc > 6)\n        local_destip = argv[6];\n    if (argc > 7)\n        local_destport = atoi(argv[7]);\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Connect to SSH server */\n    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);\n#ifdef WIN32\n    if (sock == INVALID_SOCKET) {\n        fprintf(stderr, \"failed to open socket!\\n\");\n        return -1;\n    }\n#else\n    if (sock == -1) {\n        perror(\"socket\");\n        return -1;\n    }\n#endif\n\n    sin.sin_family = AF_INET;\n    if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(server_ip))) {\n        perror(\"inet_addr\");\n        return -1;\n    }\n    sin.sin_port = htons(22);\n    if (connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if(!session) {\n        fprintf(stderr, \"Could not initialize SSH session!\\n\");\n        return -1;\n    }\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Error when starting up SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++)\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    fprintf(stderr, \"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    fprintf(stderr, \"Authentication methods: %s\\n\", userauthlist);\n    if (strstr(userauthlist, \"password\"))\n        auth |= AUTH_PASSWORD;\n    if (strstr(userauthlist, \"publickey\"))\n        auth |= AUTH_PUBLICKEY;\n\n    /* check for options */\n    if(argc > 8) {\n        if ((auth & AUTH_PASSWORD) && !strcasecmp(argv[8], \"-p\"))\n            auth = AUTH_PASSWORD;\n        if ((auth & AUTH_PUBLICKEY) && !strcasecmp(argv[8], \"-k\"))\n            auth = AUTH_PUBLICKEY;\n    }\n\n    if (auth & AUTH_PASSWORD) {\n        if (libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    } else if (auth & AUTH_PUBLICKEY) {\n        if (libssh2_userauth_publickey_fromfile(session, username, keyfile1,\n                                                keyfile2, password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed!\\n\");\n            goto shutdown;\n        }\n        fprintf(stderr, \"\\tAuthentication by public key succeeded.\\n\");\n    } else {\n        fprintf(stderr, \"No supported authentication methods found!\\n\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"Asking server to listen on remote %s:%d\\n\",\n        remote_listenhost, remote_wantport);\n\n    listener = libssh2_channel_forward_listen_ex(session, remote_listenhost,\n        remote_wantport, &remote_listenport, 1);\n    if (!listener) {\n        fprintf(stderr, \"Could not start the tcpip-forward listener!\\n\"\n                \"(Note that this can be a problem at the server!\"\n                \" Please review the server logs.)\\n\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"Server is listening on %s:%d\\n\", remote_listenhost,\n        remote_listenport);\n\n    fprintf(stderr, \"Waiting for remote connection\\n\");\n    channel = libssh2_channel_forward_accept(listener);\n    if (!channel) {\n        fprintf(stderr, \"Could not accept connection!\\n\"\n                \"(Note that this can be a problem at the server!\"\n                \" Please review the server logs.)\\n\");\n        goto shutdown;\n    }\n\n    fprintf(stderr,\n        \"Accepted remote connection. Connecting to local server %s:%d\\n\",\n        local_destip, local_destport);\n    forwardsock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);\n#ifdef WIN32\n    if (forwardsock == INVALID_SOCKET) {\n        fprintf(stderr, \"failed to open forward socket!\\n\");\n        goto shutdown;\n    }\n#else\n    if (forwardsock == -1) {\n        perror(\"socket\");\n        goto shutdown;\n    }\n#endif\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(local_destport);\n    if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(local_destip))) {\n        perror(\"inet_addr\");\n        goto shutdown;\n    }\n    if (-1 == connect(forwardsock, (struct sockaddr *)&sin, sinlen)) {\n        perror(\"connect\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"Forwarding connection from remote %s:%d to local %s:%d\\n\",\n        remote_listenhost, remote_listenport, local_destip, local_destport);\n\n    /* Must use non-blocking IO hereafter due to the current libssh2 API */\n    libssh2_session_set_blocking(session, 0);\n\n    while (1) {\n        FD_ZERO(&fds);\n        FD_SET(forwardsock, &fds);\n        tv.tv_sec = 0;\n        tv.tv_usec = 100000;\n        rc = select(forwardsock + 1, &fds, NULL, NULL, &tv);\n        if (-1 == rc) {\n            perror(\"select\");\n            goto shutdown;\n        }\n        if (rc && FD_ISSET(forwardsock, &fds)) {\n            len = recv(forwardsock, buf, sizeof(buf), 0);\n            if (len < 0) {\n                perror(\"read\");\n                goto shutdown;\n            } else if (0 == len) {\n                fprintf(stderr, \"The local server at %s:%d disconnected!\\n\",\n                    local_destip, local_destport);\n                goto shutdown;\n            }\n            wr = 0;\n            do {\n                i = libssh2_channel_write(channel, buf, len);\n                if (i < 0) {\n                    fprintf(stderr, \"libssh2_channel_write: %d\\n\", i);\n                    goto shutdown;\n                }\n                wr += i;\n            } while(i > 0 && wr < len);\n        }\n        while (1) {\n            len = libssh2_channel_read(channel, buf, sizeof(buf));\n            if (LIBSSH2_ERROR_EAGAIN == len)\n                break;\n            else if (len < 0) {\n                fprintf(stderr, \"libssh2_channel_read: %d\", (int)len);\n                goto shutdown;\n            }\n            wr = 0;\n            while (wr < len) {\n                i = send(forwardsock, buf + wr, len - wr, 0);\n                if (i <= 0) {\n                    perror(\"write\");\n                    goto shutdown;\n                }\n                wr += i;\n            }\n            if (libssh2_channel_eof(channel)) {\n                fprintf(stderr, \"The remote client at %s:%d disconnected!\\n\",\n                    remote_listenhost, remote_listenport);\n                goto shutdown;\n            }\n        }\n    }\n\nshutdown:\n#ifdef WIN32\n    closesocket(forwardsock);\n#else\n    close(forwardsock);\n#endif\n    if (channel)\n        libssh2_channel_free(channel);\n    if (listener)\n        libssh2_channel_forward_cancel(listener);\n    libssh2_session_disconnect(session, \"Client disconnecting normally\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/example/x11.c",
    "content": "/*\n *\n * Sample showing how to makes SSH2 with X11 Forwarding works.\n *\n * Usage :\n * \"ssh2 host user password [DEBUG]\"\n */\n\n#include <string.h>\n#include <sys/ioctl.h>\n#include <netinet/in.h>\n#include <sys/socket.h>\n#include <sys/select.h>\n#include <arpa/inet.h>\n#include <unistd.h>\n#include <sys/types.h>\n#include <sys/un.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <stdlib.h>\n#include <termios.h>\n\n#include <libssh2.h>\n\n#define _PATH_UNIX_X \"/tmp/.X11-unix/X%d\"\n\n/*\n * Chained list that contains channels and associated X11 socket for each X11\n * connections\n */\nstruct chan_X11_list {\n    LIBSSH2_CHANNEL  *chan;\n    int               sock;\n    struct chan_X11_list *next;\n};\n\nstruct chan_X11_list * gp_x11_chan = NULL;\nstruct termios         _saved_tio;\n\n/*\n * Utility function to remove a Node of the chained list\n */\nstatic void remove_node(struct chan_X11_list *elem)\n{\n    struct chan_X11_list *current_node = NULL;\n\n    current_node = gp_x11_chan;\n\n    if (gp_x11_chan == elem) {\n        gp_x11_chan = gp_x11_chan->next;\n        free(current_node);\n        return;\n    }\n\n    while (current_node->next != NULL) {\n        if (current_node->next == elem) {\n            current_node->next = current_node->next->next;\n            current_node = current_node->next;\n            free(current_node);\n            break;\n        }\n    }\n}\n\n\nstatic void session_shutdown(LIBSSH2_SESSION *session)\n{\n    libssh2_session_disconnect(session,\n                                \"Session Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n}\n\nstatic int _raw_mode(void)\n{\n    int rc;\n    struct termios tio;\n\n    rc = tcgetattr(fileno(stdin), &tio);\n    if (rc != -1) {\n        _saved_tio = tio;\n        /* do the equivalent of cfmakeraw() manually, to build on Solaris */\n        tio.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);\n        tio.c_oflag &= ~OPOST;\n        tio.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);\n        tio.c_cflag &= ~(CSIZE|PARENB);\n        tio.c_cflag |= CS8;\n        rc = tcsetattr(fileno(stdin), TCSADRAIN, &tio);\n    }\n    return rc;\n}\n\nstatic int _normal_mode(void)\n{\n    int rc;\n    rc = tcsetattr(fileno(stdin), TCSADRAIN, &_saved_tio);\n    return rc;\n}\n\n/*\n * CallBack to initialize the forwarding.\n * Save the channel to loop on it, save the X11 forwarded socket to send\n * and receive info from our X server.\n */\nstatic void x11_callback(LIBSSH2_SESSION *session, LIBSSH2_CHANNEL *channel,\n                         char *shost, int sport, void **abstract)\n{\n    const char * display      = NULL;\n    char * ptr          = NULL;\n    char * temp_buff    = NULL;\n    int   display_port = 0;\n    int   sock         = 0;\n    int   rc           = 0;\n    struct sockaddr_un addr;\n    struct chan_X11_list *new;\n    struct chan_X11_list *chan_iter;\n\n    /*\n     * Connect to the display\n     * Inspired by x11_connect_display in openssh\n     */\n    display = getenv(\"DISPLAY\");\n    if ( display != NULL) {\n        if (strncmp( display, \"unix:\", 5) == 0 ||\n            display[0] == ':') {\n            /* Connect to the local unix domain */\n            ptr = strrchr(display, ':');\n            temp_buff = (char *) calloc(strlen(ptr+1), sizeof(char));\n            if (!temp_buff) {\n                perror(\"calloc\");\n                return;\n            }\n            memcpy(temp_buff, ptr+1, strlen(ptr+1));\n            display_port = atoi(temp_buff);\n            free(temp_buff);\n\n            sock = socket(AF_UNIX, SOCK_STREAM, 0);\n            if (sock < 0)\n                return;\n            memset(&addr, 0, sizeof(addr));\n            addr.sun_family = AF_UNIX;\n            snprintf(addr.sun_path, sizeof(addr.sun_path),\n                     _PATH_UNIX_X, display_port);\n            rc = connect(sock, (struct sockaddr *) &addr, sizeof(addr));\n\n            if (rc != -1){\n                /* Connection Successfull */\n                if (gp_x11_chan == NULL) {\n                    /* Calloc ensure that gp_X11_chan is full of 0 */\n                    gp_x11_chan = (struct chan_X11_list *)\n                        calloc(1, sizeof(struct chan_X11_list));\n                    gp_x11_chan->sock = sock;\n                    gp_x11_chan->chan = channel;\n                    gp_x11_chan->next = NULL;\n                }\n                else {\n                    chan_iter = gp_x11_chan;\n                    while (chan_iter->next != NULL)\n                        chan_iter = chan_iter->next;\n                    /* Create the new Node */\n                    new = (struct chan_X11_list *)\n                        malloc(sizeof(struct chan_X11_list));\n                    new->sock = sock;\n                    new->chan = channel;\n                    new->next = NULL;\n                    chan_iter->next = new;\n                }\n            }\n            else\n                close(sock);\n        }\n    }\n    return;\n}\n\n/*\n * Send and receive Data for the X11 channel.\n * If the connection is closed, returns -1, 0 either.\n */\nstatic int x11_send_receive(LIBSSH2_CHANNEL *channel, int sock)\n{\n    char * buf          = NULL;\n    int    bufsize      = 8192;\n    int    rc           = 0;\n    int    nfds         = 1;\n    LIBSSH2_POLLFD  *fds      = NULL;\n    fd_set set;\n    struct timeval timeval_out;\n    timeval_out.tv_sec = 0;\n    timeval_out.tv_usec = 0;\n\n\n    FD_ZERO(&set);\n    FD_SET(sock,&set);\n\n    if ((buf = calloc (bufsize, sizeof(char))) == NULL)\n        return 0;\n\n    if ((fds = malloc (sizeof (LIBSSH2_POLLFD))) == NULL) {\n        free(buf);\n        return 0;\n    }\n\n    fds[0].type = LIBSSH2_POLLFD_CHANNEL;\n    fds[0].fd.channel = channel;\n    fds[0].events = LIBSSH2_POLLFD_POLLIN;\n    fds[0].revents = LIBSSH2_POLLFD_POLLIN;\n\n    rc = libssh2_poll(fds, nfds, 0);\n    if (rc >0) {\n        rc = libssh2_channel_read(channel, buf, bufsize);\n        write(sock, buf, rc);\n    }\n\n    rc = select(sock+1, &set, NULL, NULL, &timeval_out);\n    if (rc > 0) {\n        memset((void *)buf, 0, bufsize);\n\n        /* Data in sock*/\n        rc = read(sock, buf, bufsize);\n        if (rc > 0) {\n            libssh2_channel_write(channel, buf, rc);\n        }\n        else {\n            free(buf);\n            return -1;\n        }\n    }\n\n    free(fds);\n    free(buf);\n    if (libssh2_channel_eof(channel) == 1) {\n        return -1;\n    }\n    return 0;\n}\n\n/*\n * Main, more than inspired by ssh2.c by Bagder\n */\nint\nmain (int argc, char *argv[])\n{\n    unsigned long hostaddr = 0;\n    int sock = 0;\n    int rc = 0;\n    struct sockaddr_in sin;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel;\n    char *username = NULL;\n    char *password = NULL;\n    size_t bufsiz = 8193;\n    char *buf = NULL;\n    int set_debug_on = 0;\n    int nfds = 1;\n    LIBSSH2_POLLFD *fds = NULL;\n\n    /* Chan List struct */\n    struct chan_X11_list *current_node = NULL;\n\n    /* Struct winsize for term size */\n    struct winsize w_size;\n    struct winsize w_size_bck;\n\n    /* For select on stdin */\n    fd_set set;\n    struct timeval timeval_out;\n    timeval_out.tv_sec = 0;\n    timeval_out.tv_usec = 10;\n\n\n    if (argc > 3) {\n      hostaddr = inet_addr(argv[1]);\n      username = argv[2];\n      password = argv[3];\n    }\n    else {\n        fprintf(stderr, \"Usage: %s destination username password\",\n                argv[0]);\n        return -1;\n    }\n\n    if (argc > 4) {\n        set_debug_on = 1;\n        fprintf (stderr, \"DEBUG is ON: %d\\n\", set_debug_on);\n    }\n\n    rc = libssh2_init (0);\n    if (rc != 0) {\n        fprintf (stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    sock = socket (AF_INET, SOCK_STREAM, 0);\n    if (sock == -1) {\n        perror(\"socket\");\n        return -1;\n    }\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons (22);\n    sin.sin_addr.s_addr = hostaddr;\n\n    rc = connect(sock, (struct sockaddr *) &sin,\n                 sizeof(struct sockaddr_in));\n    if (rc != 0) {\n        fprintf (stderr, \"Failed to established connection!\\n\");\n        return -1;\n    }\n    /* Open a session */\n    session = libssh2_session_init();\n    rc      = libssh2_session_handshake(session, sock);\n    if (rc != 0) {\n        fprintf(stderr, \"Failed Start the SSH session\\n\");\n        return -1;\n    }\n\n    if (set_debug_on == 1)\n        libssh2_trace(session, LIBSSH2_TRACE_CONN);\n\n    /* Set X11 Callback */\n    libssh2_session_callback_set(session, LIBSSH2_CALLBACK_X11,\n                                 (void *)x11_callback);\n\n    /* Authenticate via password */\n    rc = libssh2_userauth_password(session, username, password);\n    if (rc != 0) {\n        fprintf(stderr, \"Failed to authenticate\\n\");\n        session_shutdown(session);\n        close(sock);\n        return -1;\n    }\n\n    /* Open a channel */\n    channel  = libssh2_channel_open_session(session);\n    if ( channel == NULL ) {\n        fprintf(stderr, \"Failed to open a new channel\\n\");\n        session_shutdown(session);\n        close(sock);\n        return -1;\n    }\n\n\n    /* Request a PTY */\n    rc = libssh2_channel_request_pty( channel, \"xterm\");\n    if (rc != 0) {\n        fprintf(stderr, \"Failed to request a pty\\n\");\n        session_shutdown(session);\n        close(sock);\n        return -1;\n    }\n\n    /* Request X11 */\n    rc = libssh2_channel_x11_req(channel,0);\n    if(rc!=0) {\n        fprintf(stderr, \"Failed to request X11 forwarding\\n\");\n        session_shutdown(session);\n        close(sock);\n        return -1;\n    }\n\n    /* Request a shell */\n    rc = libssh2_channel_shell(channel);\n    if (rc!=0) {\n        fprintf(stderr, \"Failed to open a shell\\n\");\n        session_shutdown(session);\n        close(sock);\n        return -1;\n    }\n\n    rc = _raw_mode();\n    if (rc != 0) {\n        fprintf(stderr, \"Failed to entered in raw mode\\n\");\n        session_shutdown(session);\n        close(sock);\n        return -1;\n    }\n\n    memset(&w_size, 0, sizeof(struct winsize));\n    memset(&w_size_bck, 0, sizeof(struct winsize));\n\n    while (1) {\n\n        FD_ZERO(&set);\n        FD_SET(fileno(stdin),&set);\n\n        /* Search if a resize pty has to be send */\n        ioctl(fileno(stdin), TIOCGWINSZ, &w_size);\n        if ((w_size.ws_row != w_size_bck.ws_row) ||\n            (w_size.ws_col != w_size_bck.ws_col))   {\n            w_size_bck = w_size;\n\n            libssh2_channel_request_pty_size(channel,\n                                             w_size.ws_col,\n                                             w_size.ws_row);\n        }\n\n        if ((buf = calloc (bufsiz, sizeof(char))) == NULL)\n            break;\n\n        if ((fds = malloc (sizeof (LIBSSH2_POLLFD))) == NULL) {\n            free(buf);\n            break;\n        }\n\n        fds[0].type = LIBSSH2_POLLFD_CHANNEL;\n        fds[0].fd.channel = channel;\n        fds[0].events = LIBSSH2_POLLFD_POLLIN;\n        fds[0].revents = LIBSSH2_POLLFD_POLLIN;\n\n        rc = libssh2_poll(fds, nfds, 0);\n        if (rc >0) {\n            libssh2_channel_read(channel, buf, sizeof(buf));\n            fprintf(stdout, \"%s\", buf);\n            fflush(stdout);\n        }\n\n        /* Looping on X clients */\n        if (gp_x11_chan != NULL) {\n            current_node = gp_x11_chan;\n        }\n        else\n            current_node = NULL;\n\n        while (current_node != NULL) {\n            struct chan_X11_list *next_node;\n            rc = x11_send_receive(current_node->chan, current_node->sock);\n            next_node = current_node->next;\n            if (rc == -1){\n                shutdown(current_node->sock,SHUT_RDWR);\n                close(current_node->sock);\n                remove_node(current_node);\n            }\n\n            current_node = next_node;\n        }\n\n\n        rc = select(fileno(stdin)+1,&set,NULL,NULL,&timeval_out);\n        if (rc > 0) {\n            /* Data in stdin*/\n            rc = read(fileno(stdin), buf,1);\n            if (rc > 0)\n                libssh2_channel_write(channel,buf, sizeof(buf));\n        }\n\n        free (fds);\n        free (buf);\n\n        if (libssh2_channel_eof (channel) == 1) {\n          break;\n        }\n    }\n\n    if (channel) {\n      libssh2_channel_free (channel);\n      channel = NULL;\n    }\n    _normal_mode();\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/get_ver.awk",
    "content": "# fetch libssh2 version number from input file and write them to STDOUT\nBEGIN {\n  while ((getline < ARGV[1]) > 0) {\n    if (match ($0, /^#define LIBSSH2_COPYRIGHT \"[^\"]+\"$/)) {\n      my_copyright_str = substr($0, 28, length($0)-28);\n    }\n    else if (match ($0, /^#define LIBSSH2_VERSION[ |\\t]+\"[^\"]+\"/)) {\n      my_ver_str = substr($3, 2, length($3) - 2);\n      split(my_ver_str, v, \".\");\n      if (v[3])\n        gsub(\"[^0-9].*$\", \"\", v[3]);\n      else\n        v[3] = 0;\n      if (v[2])\n        gsub(\"[^0-9].*$\", \"\", v[2]);\n      else\n        v[2] = 0;\n      my_ver = v[1] \",\" v[2] \",\" v[3];\n    }\n  }\n  print \"LIBSSH2_VERSION = \" my_ver \"\";\n  print \"LIBSSH2_VERSION_STR = \" my_ver_str \"\";\n  print \"LIBSSH2_COPYRIGHT_STR = \" my_copyright_str \"\";\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/git2news.pl",
    "content": "#!/usr/bin/perl\n\n# git log --pretty=fuller --no-color --date=short --decorate=full\n\nmy @mname = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n             'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' );\n\nsub nicedate {\n    my ($date)=$_;\n\n    if($date =~ /(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)/) {\n        return sprintf(\"%d %s %4d\", $3, $mname[$2-1], $1);\n    }\n    return $date;\n}\n\nprint \n'   Changelog for the libssh2 project. Generated with git2news.pl\n';\n\nmy $line;\nmy $tag;\nwhile(<STDIN>) {\n    my $l = $_;\n\n    if($l =~/^commit ([[:xdigit:]]*) ?(.*)/) {\n        $co = $1;\n        my $ref = $2;\n        if ($ref =~ /refs\\/tags\\/(libssh2-|VERSION\\.)([0-9._]*)/) {\n            $tag = $2;\n        } else {\n            $tag = '';\n        }\n    }\n    elsif($l =~ /^Author: *(.*) +</) {\n        $a = $1;\n    }\n    elsif($l =~ /^Commit: *(.*) +</) {\n        $c = $1;\n    }\n    elsif($l =~ /^CommitDate: (.*)/) {\n        $date = nicedate($1);\n    }\n    elsif($l =~ /^(    )(.*)/) {\n        my $extra;\n        if ($tag) {\n            # Version entries have a special format\n            print \"\\nVersion \" . $tag.\" ($date)\\n\";\n            $oldc = \"\";\n            $tag = \"\";\n        }\n        if($a ne $c) {\n            $extra=sprintf(\"\\n- [%s brought this change]\\n\\n  \", $a);\n        }\n        else {\n            $extra=\"\\n- \";\n        }\n        if($co ne $oldco) {\n            if($c ne $oldc) {\n                print \"\\n$c ($date)$extra\";\n            }\n            else {\n                print \"$extra\";\n            }\n            $line =0;\n        }\n\n        $oldco = $co;\n        $oldc = $c;\n        $olddate = $date;\n        if($line++) {\n            print \"  \";\n        }\n        print $2.\"\\n\";\n    }\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/include/libssh2.h",
    "content": "/* Copyright (c) 2004-2009, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2009-2015 Daniel Stenberg\n * Copyright (c) 2010 Simon Josefsson <simon@josefsson.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_H\n#define LIBSSH2_H 1\n\n#define LIBSSH2_COPYRIGHT \"2004-2016 The libssh2 project and its contributors.\"\n\n/* We use underscore instead of dash when appending DEV in dev versions just\n   to make the BANNER define (used by src/session.c) be a valid SSH\n   banner. Release versions have no appended strings and may of course not\n   have dashes either. */\n#define LIBSSH2_VERSION                             \"1.7.0_DEV\"\n\n/* The numeric version number is also available \"in parts\" by using these\n   defines: */\n#define LIBSSH2_VERSION_MAJOR                       1\n#define LIBSSH2_VERSION_MINOR                       7\n#define LIBSSH2_VERSION_PATCH                       0\n\n/* This is the numeric version of the libssh2 version number, meant for easier\n   parsing and comparions by programs. The LIBSSH2_VERSION_NUM define will\n   always follow this syntax:\n\n         0xXXYYZZ\n\n   Where XX, YY and ZZ are the main version, release and patch numbers in\n   hexadecimal (using 8 bits each). All three numbers are always represented\n   using two digits.  1.2 would appear as \"0x010200\" while version 9.11.7\n   appears as \"0x090b07\".\n\n   This 6-digit (24 bits) hexadecimal number does not show pre-release number,\n   and it is always a greater number in a more recent release. It makes\n   comparisons with greater than and less than work.\n*/\n#define LIBSSH2_VERSION_NUM                         0x010700\n\n/*\n * This is the date and time when the full source package was created. The\n * timestamp is not stored in the source code repo, as the timestamp is\n * properly set in the tarballs by the maketgz script.\n *\n * The format of the date should follow this template:\n *\n * \"Mon Feb 12 11:35:33 UTC 2007\"\n */\n#define LIBSSH2_TIMESTAMP \"DEV\"\n\n#ifndef RC_INVOKED\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#ifdef _WIN32\n# include <basetsd.h>\n# include <winsock2.h>\n#endif\n\n#include <stddef.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n\n/* Allow alternate API prefix from CFLAGS or calling app */\n#ifndef LIBSSH2_API\n# ifdef LIBSSH2_WIN32\n#  ifdef _WINDLL\n#   ifdef LIBSSH2_LIBRARY\n#    define LIBSSH2_API __declspec(dllexport)\n#   else\n#    define LIBSSH2_API __declspec(dllimport)\n#   endif /* LIBSSH2_LIBRARY */\n#  else\n#   define LIBSSH2_API\n#  endif\n# else /* !LIBSSH2_WIN32 */\n#  define LIBSSH2_API\n# endif /* LIBSSH2_WIN32 */\n#endif /* LIBSSH2_API */\n\n#ifdef HAVE_SYS_UIO_H\n# include <sys/uio.h>\n#endif\n\n#if (defined(NETWARE) && !defined(__NOVELL_LIBC__))\n# include <sys/bsdskt.h>\ntypedef unsigned char uint8_t;\ntypedef unsigned int uint32_t;\n#endif\n\n#ifdef _MSC_VER\ntypedef unsigned char uint8_t;\ntypedef unsigned int uint32_t;\ntypedef unsigned __int64 libssh2_uint64_t;\ntypedef __int64 libssh2_int64_t;\n#ifndef ssize_t\ntypedef SSIZE_T ssize_t;\n#endif\n#else\ntypedef unsigned long long libssh2_uint64_t;\ntypedef long long libssh2_int64_t;\n#endif\n\n#ifdef WIN32\ntypedef SOCKET libssh2_socket_t;\n#define LIBSSH2_INVALID_SOCKET INVALID_SOCKET\n#else /* !WIN32 */\ntypedef int libssh2_socket_t;\n#define LIBSSH2_INVALID_SOCKET -1\n#endif /* WIN32 */\n\n/*\n * Determine whether there is small or large file support on windows.\n */\n\n#if defined(_MSC_VER) && !defined(_WIN32_WCE)\n#  if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64)\n#    define LIBSSH2_USE_WIN32_LARGE_FILES\n#  else\n#    define LIBSSH2_USE_WIN32_SMALL_FILES\n#  endif\n#endif\n\n#if defined(__MINGW32__) && !defined(LIBSSH2_USE_WIN32_LARGE_FILES)\n#  define LIBSSH2_USE_WIN32_LARGE_FILES\n#endif\n\n#if defined(__WATCOMC__) && !defined(LIBSSH2_USE_WIN32_LARGE_FILES)\n#  define LIBSSH2_USE_WIN32_LARGE_FILES\n#endif\n\n#if defined(__POCC__)\n#  undef LIBSSH2_USE_WIN32_LARGE_FILES\n#endif\n\n#if defined(_WIN32) && !defined(LIBSSH2_USE_WIN32_LARGE_FILES) && \\\n    !defined(LIBSSH2_USE_WIN32_SMALL_FILES)\n#  define LIBSSH2_USE_WIN32_SMALL_FILES\n#endif\n\n/*\n * Large file (>2Gb) support using WIN32 functions.\n */\n\n#ifdef LIBSSH2_USE_WIN32_LARGE_FILES\n#  include <io.h>\n#  include <sys/types.h>\n#  include <sys/stat.h>\n#  define LIBSSH2_STRUCT_STAT_SIZE_FORMAT    \"%I64d\"\ntypedef struct _stati64 libssh2_struct_stat;\ntypedef __int64 libssh2_struct_stat_size;\n#endif\n\n/*\n * Small file (<2Gb) support using WIN32 functions.\n */\n\n#ifdef LIBSSH2_USE_WIN32_SMALL_FILES\n#  include <sys/types.h>\n#  include <sys/stat.h>\n#  ifndef _WIN32_WCE\n#    define LIBSSH2_STRUCT_STAT_SIZE_FORMAT    \"%d\"\ntypedef struct _stat libssh2_struct_stat;\ntypedef off_t libssh2_struct_stat_size;\n#  endif\n#endif\n\n#ifndef LIBSSH2_STRUCT_STAT_SIZE_FORMAT\n#  ifdef __VMS\n/* We have to roll our own format here because %z is a C99-ism we don't have. */\n#    if __USE_OFF64_T || __USING_STD_STAT\n#      define LIBSSH2_STRUCT_STAT_SIZE_FORMAT      \"%Ld\"\n#    else\n#      define LIBSSH2_STRUCT_STAT_SIZE_FORMAT      \"%d\"\n#    endif\n#  else\n#    define LIBSSH2_STRUCT_STAT_SIZE_FORMAT      \"%zd\"\n#  endif\ntypedef struct stat libssh2_struct_stat;\ntypedef off_t libssh2_struct_stat_size;\n#endif\n\n/* Part of every banner, user specified or not */\n#define LIBSSH2_SSH_BANNER                  \"SSH-2.0-libssh2_\" LIBSSH2_VERSION\n\n/* We *could* add a comment here if we so chose */\n#define LIBSSH2_SSH_DEFAULT_BANNER                  LIBSSH2_SSH_BANNER\n#define LIBSSH2_SSH_DEFAULT_BANNER_WITH_CRLF        LIBSSH2_SSH_DEFAULT_BANNER \"\\r\\n\"\n\n/* Default generate and safe prime sizes for diffie-hellman-group-exchange-sha1 */\n#define LIBSSH2_DH_GEX_MINGROUP     1024\n#define LIBSSH2_DH_GEX_OPTGROUP     1536\n#define LIBSSH2_DH_GEX_MAXGROUP     2048\n\n/* Defaults for pty requests */\n#define LIBSSH2_TERM_WIDTH      80\n#define LIBSSH2_TERM_HEIGHT     24\n#define LIBSSH2_TERM_WIDTH_PX   0\n#define LIBSSH2_TERM_HEIGHT_PX  0\n\n/* 1/4 second */\n#define LIBSSH2_SOCKET_POLL_UDELAY      250000\n/* 0.25 * 120 == 30 seconds */\n#define LIBSSH2_SOCKET_POLL_MAXLOOPS    120\n\n/* Maximum size to allow a payload to compress to, plays it safe by falling\n   short of spec limits */\n#define LIBSSH2_PACKET_MAXCOMP      32000\n\n/* Maximum size to allow a payload to deccompress to, plays it safe by\n   allowing more than spec requires */\n#define LIBSSH2_PACKET_MAXDECOMP    40000\n\n/* Maximum size for an inbound compressed payload, plays it safe by\n   overshooting spec limits */\n#define LIBSSH2_PACKET_MAXPAYLOAD   40000\n\n/* Malloc callbacks */\n#define LIBSSH2_ALLOC_FUNC(name)   void *name(size_t count, void **abstract)\n#define LIBSSH2_REALLOC_FUNC(name) void *name(void *ptr, size_t count, \\\n                                              void **abstract)\n#define LIBSSH2_FREE_FUNC(name)    void name(void *ptr, void **abstract)\n\ntypedef struct _LIBSSH2_USERAUTH_KBDINT_PROMPT\n{\n    char* text;\n    unsigned int length;\n    unsigned char echo;\n} LIBSSH2_USERAUTH_KBDINT_PROMPT;\n\ntypedef struct _LIBSSH2_USERAUTH_KBDINT_RESPONSE\n{\n    char* text;\n    unsigned int length;\n} LIBSSH2_USERAUTH_KBDINT_RESPONSE;\n\n/* 'publickey' authentication callback */\n#define LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC(name) \\\n  int name(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, \\\n           const unsigned char *data, size_t data_len, void **abstract)\n\n/* 'keyboard-interactive' authentication callback */\n#define LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC(name_) \\\n void name_(const char* name, int name_len, const char* instruction, \\\n            int instruction_len, int num_prompts, \\\n            const LIBSSH2_USERAUTH_KBDINT_PROMPT* prompts, \\\n            LIBSSH2_USERAUTH_KBDINT_RESPONSE* responses, void **abstract)\n\n/* Callbacks for special SSH packets */\n#define LIBSSH2_IGNORE_FUNC(name) \\\n void name(LIBSSH2_SESSION *session, const char *message, int message_len, \\\n           void **abstract)\n\n#define LIBSSH2_DEBUG_FUNC(name) \\\n void name(LIBSSH2_SESSION *session, int always_display, const char *message, \\\n           int message_len, const char *language, int language_len, \\\n           void **abstract)\n\n#define LIBSSH2_DISCONNECT_FUNC(name) \\\n void name(LIBSSH2_SESSION *session, int reason, const char *message, \\\n           int message_len, const char *language, int language_len, \\\n           void **abstract)\n\n#define LIBSSH2_PASSWD_CHANGEREQ_FUNC(name) \\\n void name(LIBSSH2_SESSION *session, char **newpw, int *newpw_len, \\\n           void **abstract)\n\n#define LIBSSH2_MACERROR_FUNC(name) \\\n int name(LIBSSH2_SESSION *session, const char *packet, int packet_len, \\\n          void **abstract)\n\n#define LIBSSH2_X11_OPEN_FUNC(name) \\\n void name(LIBSSH2_SESSION *session, LIBSSH2_CHANNEL *channel, \\\n           const char *shost, int sport, void **abstract)\n\n#define LIBSSH2_CHANNEL_CLOSE_FUNC(name) \\\n  void name(LIBSSH2_SESSION *session, void **session_abstract, \\\n            LIBSSH2_CHANNEL *channel, void **channel_abstract)\n\n/* I/O callbacks */\n#define LIBSSH2_RECV_FUNC(name)  ssize_t name(libssh2_socket_t socket, \\\n                                              void *buffer, size_t length, \\\n                                              int flags, void **abstract)\n#define LIBSSH2_SEND_FUNC(name)  ssize_t name(libssh2_socket_t socket, \\\n                                              const void *buffer, size_t length,\\\n                                              int flags, void **abstract)\n\n/* libssh2_session_callback_set() constants */\n#define LIBSSH2_CALLBACK_IGNORE             0\n#define LIBSSH2_CALLBACK_DEBUG              1\n#define LIBSSH2_CALLBACK_DISCONNECT         2\n#define LIBSSH2_CALLBACK_MACERROR           3\n#define LIBSSH2_CALLBACK_X11                4\n#define LIBSSH2_CALLBACK_SEND               5\n#define LIBSSH2_CALLBACK_RECV               6\n\n/* libssh2_session_method_pref() constants */\n#define LIBSSH2_METHOD_KEX          0\n#define LIBSSH2_METHOD_HOSTKEY      1\n#define LIBSSH2_METHOD_CRYPT_CS     2\n#define LIBSSH2_METHOD_CRYPT_SC     3\n#define LIBSSH2_METHOD_MAC_CS       4\n#define LIBSSH2_METHOD_MAC_SC       5\n#define LIBSSH2_METHOD_COMP_CS      6\n#define LIBSSH2_METHOD_COMP_SC      7\n#define LIBSSH2_METHOD_LANG_CS      8\n#define LIBSSH2_METHOD_LANG_SC      9\n\n/* flags */\n#define LIBSSH2_FLAG_SIGPIPE        1\n#define LIBSSH2_FLAG_COMPRESS       2\n\ntypedef struct _LIBSSH2_SESSION                     LIBSSH2_SESSION;\ntypedef struct _LIBSSH2_CHANNEL                     LIBSSH2_CHANNEL;\ntypedef struct _LIBSSH2_LISTENER                    LIBSSH2_LISTENER;\ntypedef struct _LIBSSH2_KNOWNHOSTS                  LIBSSH2_KNOWNHOSTS;\ntypedef struct _LIBSSH2_AGENT                       LIBSSH2_AGENT;\n\ntypedef struct _LIBSSH2_POLLFD {\n    unsigned char type; /* LIBSSH2_POLLFD_* below */\n\n    union {\n        libssh2_socket_t socket; /* File descriptors -- examined with\n                                    system select() call */\n        LIBSSH2_CHANNEL *channel; /* Examined by checking internal state */\n        LIBSSH2_LISTENER *listener; /* Read polls only -- are inbound\n                                       connections waiting to be accepted? */\n    } fd;\n\n    unsigned long events; /* Requested Events */\n    unsigned long revents; /* Returned Events */\n} LIBSSH2_POLLFD;\n\n/* Poll FD Descriptor Types */\n#define LIBSSH2_POLLFD_SOCKET       1\n#define LIBSSH2_POLLFD_CHANNEL      2\n#define LIBSSH2_POLLFD_LISTENER     3\n\n/* Note: Win32 Doesn't actually have a poll() implementation, so some of these\n   values are faked with select() data */\n/* Poll FD events/revents -- Match sys/poll.h where possible */\n#define LIBSSH2_POLLFD_POLLIN           0x0001 /* Data available to be read or\n                                                  connection available --\n                                                  All */\n#define LIBSSH2_POLLFD_POLLPRI          0x0002 /* Priority data available to\n                                                  be read -- Socket only */\n#define LIBSSH2_POLLFD_POLLEXT          0x0002 /* Extended data available to\n                                                  be read -- Channel only */\n#define LIBSSH2_POLLFD_POLLOUT          0x0004 /* Can may be written --\n                                                  Socket/Channel */\n/* revents only */\n#define LIBSSH2_POLLFD_POLLERR          0x0008 /* Error Condition -- Socket */\n#define LIBSSH2_POLLFD_POLLHUP          0x0010 /* HangUp/EOF -- Socket */\n#define LIBSSH2_POLLFD_SESSION_CLOSED   0x0010 /* Session Disconnect */\n#define LIBSSH2_POLLFD_POLLNVAL         0x0020 /* Invalid request -- Socket\n                                                  Only */\n#define LIBSSH2_POLLFD_POLLEX           0x0040 /* Exception Condition --\n                                                  Socket/Win32 */\n#define LIBSSH2_POLLFD_CHANNEL_CLOSED   0x0080 /* Channel Disconnect */\n#define LIBSSH2_POLLFD_LISTENER_CLOSED  0x0080 /* Listener Disconnect */\n\n#define HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION\n/* Block Direction Types */\n#define LIBSSH2_SESSION_BLOCK_INBOUND                  0x0001\n#define LIBSSH2_SESSION_BLOCK_OUTBOUND                 0x0002\n\n/* Hash Types */\n#define LIBSSH2_HOSTKEY_HASH_MD5                            1\n#define LIBSSH2_HOSTKEY_HASH_SHA1                           2\n\n/* Hostkey Types */\n#define LIBSSH2_HOSTKEY_TYPE_UNKNOWN\t\t\t    0\n#define LIBSSH2_HOSTKEY_TYPE_RSA\t\t\t    1\n#define LIBSSH2_HOSTKEY_TYPE_DSS\t\t\t    2\n\n/* Disconnect Codes (defined by SSH protocol) */\n#define SSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT          1\n#define SSH_DISCONNECT_PROTOCOL_ERROR                       2\n#define SSH_DISCONNECT_KEY_EXCHANGE_FAILED                  3\n#define SSH_DISCONNECT_RESERVED                             4\n#define SSH_DISCONNECT_MAC_ERROR                            5\n#define SSH_DISCONNECT_COMPRESSION_ERROR                    6\n#define SSH_DISCONNECT_SERVICE_NOT_AVAILABLE                7\n#define SSH_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED       8\n#define SSH_DISCONNECT_HOST_KEY_NOT_VERIFIABLE              9\n#define SSH_DISCONNECT_CONNECTION_LOST                      10\n#define SSH_DISCONNECT_BY_APPLICATION                       11\n#define SSH_DISCONNECT_TOO_MANY_CONNECTIONS                 12\n#define SSH_DISCONNECT_AUTH_CANCELLED_BY_USER               13\n#define SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE       14\n#define SSH_DISCONNECT_ILLEGAL_USER_NAME                    15\n\n/* Error Codes (defined by libssh2) */\n#define LIBSSH2_ERROR_NONE                      0\n\n/* The library once used -1 as a generic error return value on numerous places\n   through the code, which subsequently was converted to\n   LIBSSH2_ERROR_SOCKET_NONE uses over time. As this is a generic error code,\n   the goal is to never ever return this code but instead make sure that a\n   more accurate and descriptive error code is used. */\n#define LIBSSH2_ERROR_SOCKET_NONE               -1\n\n#define LIBSSH2_ERROR_BANNER_RECV               -2\n#define LIBSSH2_ERROR_BANNER_SEND               -3\n#define LIBSSH2_ERROR_INVALID_MAC               -4\n#define LIBSSH2_ERROR_KEX_FAILURE               -5\n#define LIBSSH2_ERROR_ALLOC                     -6\n#define LIBSSH2_ERROR_SOCKET_SEND               -7\n#define LIBSSH2_ERROR_KEY_EXCHANGE_FAILURE      -8\n#define LIBSSH2_ERROR_TIMEOUT                   -9\n#define LIBSSH2_ERROR_HOSTKEY_INIT              -10\n#define LIBSSH2_ERROR_HOSTKEY_SIGN              -11\n#define LIBSSH2_ERROR_DECRYPT                   -12\n#define LIBSSH2_ERROR_SOCKET_DISCONNECT         -13\n#define LIBSSH2_ERROR_PROTO                     -14\n#define LIBSSH2_ERROR_PASSWORD_EXPIRED          -15\n#define LIBSSH2_ERROR_FILE                      -16\n#define LIBSSH2_ERROR_METHOD_NONE               -17\n#define LIBSSH2_ERROR_AUTHENTICATION_FAILED     -18\n#define LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED    LIBSSH2_ERROR_AUTHENTICATION_FAILED\n#define LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED      -19\n#define LIBSSH2_ERROR_CHANNEL_OUTOFORDER        -20\n#define LIBSSH2_ERROR_CHANNEL_FAILURE           -21\n#define LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED    -22\n#define LIBSSH2_ERROR_CHANNEL_UNKNOWN           -23\n#define LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED   -24\n#define LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED   -25\n#define LIBSSH2_ERROR_CHANNEL_CLOSED            -26\n#define LIBSSH2_ERROR_CHANNEL_EOF_SENT          -27\n#define LIBSSH2_ERROR_SCP_PROTOCOL              -28\n#define LIBSSH2_ERROR_ZLIB                      -29\n#define LIBSSH2_ERROR_SOCKET_TIMEOUT            -30\n#define LIBSSH2_ERROR_SFTP_PROTOCOL             -31\n#define LIBSSH2_ERROR_REQUEST_DENIED            -32\n#define LIBSSH2_ERROR_METHOD_NOT_SUPPORTED      -33\n#define LIBSSH2_ERROR_INVAL                     -34\n#define LIBSSH2_ERROR_INVALID_POLL_TYPE         -35\n#define LIBSSH2_ERROR_PUBLICKEY_PROTOCOL        -36\n#define LIBSSH2_ERROR_EAGAIN                    -37\n#define LIBSSH2_ERROR_BUFFER_TOO_SMALL          -38\n#define LIBSSH2_ERROR_BAD_USE                   -39\n#define LIBSSH2_ERROR_COMPRESS                  -40\n#define LIBSSH2_ERROR_OUT_OF_BOUNDARY           -41\n#define LIBSSH2_ERROR_AGENT_PROTOCOL            -42\n#define LIBSSH2_ERROR_SOCKET_RECV               -43\n#define LIBSSH2_ERROR_ENCRYPT                   -44\n#define LIBSSH2_ERROR_BAD_SOCKET                -45\n#define LIBSSH2_ERROR_KNOWN_HOSTS               -46\n\n/* this is a define to provide the old (<= 1.2.7) name */\n#define LIBSSH2_ERROR_BANNER_NONE LIBSSH2_ERROR_BANNER_RECV\n\n/* Global API */\n#define LIBSSH2_INIT_NO_CRYPTO        0x0001\n\n/*\n * libssh2_init()\n *\n * Initialize the libssh2 functions.  This typically initialize the\n * crypto library.  It uses a global state, and is not thread safe --\n * you must make sure this function is not called concurrently.\n *\n * Flags can be:\n * 0:                              Normal initialize\n * LIBSSH2_INIT_NO_CRYPTO:         Do not initialize the crypto library (ie.\n *                                 OPENSSL_add_cipher_algoritms() for OpenSSL\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int libssh2_init(int flags);\n\n/*\n * libssh2_exit()\n *\n * Exit the libssh2 functions and free's all memory used internal.\n */\nLIBSSH2_API void libssh2_exit(void);\n\n/*\n * libssh2_free()\n *\n * Deallocate memory allocated by earlier call to libssh2 functions.\n */\nLIBSSH2_API void libssh2_free(LIBSSH2_SESSION *session, void *ptr);\n\n/*\n * libssh2_session_supported_algs()\n *\n * Fills algs with a list of supported acryptographic algorithms. Returns a\n * non-negative number (number of supported algorithms) on success or a\n * negative number (an eror code) on failure.\n *\n * NOTE: on success, algs must be deallocated (by calling libssh2_free) when\n * not needed anymore\n */\nLIBSSH2_API int libssh2_session_supported_algs(LIBSSH2_SESSION* session,\n                                               int method_type,\n                                               const char*** algs);\n\n/* Session API */\nLIBSSH2_API LIBSSH2_SESSION *\nlibssh2_session_init_ex(LIBSSH2_ALLOC_FUNC((*my_alloc)),\n                        LIBSSH2_FREE_FUNC((*my_free)),\n                        LIBSSH2_REALLOC_FUNC((*my_realloc)), void *abstract);\n#define libssh2_session_init() libssh2_session_init_ex(NULL, NULL, NULL, NULL)\n\nLIBSSH2_API void **libssh2_session_abstract(LIBSSH2_SESSION *session);\n\nLIBSSH2_API void *libssh2_session_callback_set(LIBSSH2_SESSION *session,\n                                               int cbtype, void *callback);\nLIBSSH2_API int libssh2_session_banner_set(LIBSSH2_SESSION *session,\n                                           const char *banner);\nLIBSSH2_API int libssh2_banner_set(LIBSSH2_SESSION *session,\n                                   const char *banner);\n\nLIBSSH2_API int libssh2_session_startup(LIBSSH2_SESSION *session, int sock);\nLIBSSH2_API int libssh2_session_handshake(LIBSSH2_SESSION *session,\n                                          libssh2_socket_t sock);\nLIBSSH2_API int libssh2_session_disconnect_ex(LIBSSH2_SESSION *session,\n                                              int reason,\n                                              const char *description,\n                                              const char *lang);\n#define libssh2_session_disconnect(session, description) \\\n  libssh2_session_disconnect_ex((session), SSH_DISCONNECT_BY_APPLICATION, \\\n                                (description), \"\")\n\nLIBSSH2_API int libssh2_session_free(LIBSSH2_SESSION *session);\n\nLIBSSH2_API const char *libssh2_hostkey_hash(LIBSSH2_SESSION *session,\n                                             int hash_type);\n\nLIBSSH2_API const char *libssh2_session_hostkey(LIBSSH2_SESSION *session,\n                                                size_t *len, int *type);\n\nLIBSSH2_API int libssh2_session_method_pref(LIBSSH2_SESSION *session,\n                                            int method_type,\n                                            const char *prefs);\nLIBSSH2_API const char *libssh2_session_methods(LIBSSH2_SESSION *session,\n                                                int method_type);\nLIBSSH2_API int libssh2_session_last_error(LIBSSH2_SESSION *session,\n                                           char **errmsg,\n                                           int *errmsg_len, int want_buf);\nLIBSSH2_API int libssh2_session_last_errno(LIBSSH2_SESSION *session);\nLIBSSH2_API int libssh2_session_set_last_error(LIBSSH2_SESSION* session,\n                                               int errcode,\n                                               const char* errmsg);\nLIBSSH2_API int libssh2_session_block_directions(LIBSSH2_SESSION *session);\n\nLIBSSH2_API int libssh2_session_flag(LIBSSH2_SESSION *session, int flag,\n                                     int value);\nLIBSSH2_API const char *libssh2_session_banner_get(LIBSSH2_SESSION *session);\n\n/* Userauth API */\nLIBSSH2_API char *libssh2_userauth_list(LIBSSH2_SESSION *session,\n                                        const char *username,\n                                        unsigned int username_len);\nLIBSSH2_API int libssh2_userauth_authenticated(LIBSSH2_SESSION *session);\n\nLIBSSH2_API int libssh2_userauth_password_ex(LIBSSH2_SESSION *session,\n                                             const char *username,\n                                             unsigned int username_len,\n                                             const char *password,\n                                             unsigned int password_len,\n                                             LIBSSH2_PASSWD_CHANGEREQ_FUNC((*passwd_change_cb)));\n\n#define libssh2_userauth_password(session, username, password) \\\n libssh2_userauth_password_ex((session), (username),           \\\n                              (unsigned int)strlen(username),  \\\n                              (password), (unsigned int)strlen(password), NULL)\n\nLIBSSH2_API int\nlibssh2_userauth_publickey_fromfile_ex(LIBSSH2_SESSION *session,\n                                       const char *username,\n                                       unsigned int username_len,\n                                       const char *publickey,\n                                       const char *privatekey,\n                                       const char *passphrase);\n\n#define libssh2_userauth_publickey_fromfile(session, username, publickey, \\\n                                            privatekey, passphrase)     \\\n    libssh2_userauth_publickey_fromfile_ex((session), (username),       \\\n                                           (unsigned int)strlen(username), \\\n                                           (publickey),                 \\\n                                           (privatekey), (passphrase))\n\nLIBSSH2_API int\nlibssh2_userauth_publickey(LIBSSH2_SESSION *session,\n                           const char *username,\n                           const unsigned char *pubkeydata,\n                           size_t pubkeydata_len,\n                           LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC((*sign_callback)),\n                           void **abstract);\n\nLIBSSH2_API int\nlibssh2_userauth_hostbased_fromfile_ex(LIBSSH2_SESSION *session,\n                                       const char *username,\n                                       unsigned int username_len,\n                                       const char *publickey,\n                                       const char *privatekey,\n                                       const char *passphrase,\n                                       const char *hostname,\n                                       unsigned int hostname_len,\n                                       const char *local_username,\n                                       unsigned int local_username_len);\n\n#define libssh2_userauth_hostbased_fromfile(session, username, publickey, \\\n                                            privatekey, passphrase, hostname) \\\n libssh2_userauth_hostbased_fromfile_ex((session), (username), \\\n                                        (unsigned int)strlen(username), \\\n                                        (publickey),                    \\\n                                        (privatekey), (passphrase),     \\\n                                        (hostname),                     \\\n                                        (unsigned int)strlen(hostname), \\\n                                        (username),                     \\\n                                        (unsigned int)strlen(username))\n\nLIBSSH2_API int\nlibssh2_userauth_publickey_frommemory(LIBSSH2_SESSION *session,\n                                      const char *username,\n                                      size_t username_len,\n                                      const char *publickeyfiledata,\n                                      size_t publickeyfiledata_len,\n                                      const char *privatekeyfiledata,\n                                      size_t privatekeyfiledata_len,\n                                      const char *passphrase);\n\n/*\n * response_callback is provided with filled by library prompts array,\n * but client must allocate and fill individual responses. Responses\n * array is already allocated. Responses data will be freed by libssh2\n * after callback return, but before subsequent callback invokation.\n */\nLIBSSH2_API int\nlibssh2_userauth_keyboard_interactive_ex(LIBSSH2_SESSION* session,\n                                         const char *username,\n                                         unsigned int username_len,\n                                         LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC(\n                                                       (*response_callback)));\n\n#define libssh2_userauth_keyboard_interactive(session, username,        \\\n                                              response_callback)        \\\n    libssh2_userauth_keyboard_interactive_ex((session), (username),     \\\n                                             (unsigned int)strlen(username), \\\n                                             (response_callback))\n\nLIBSSH2_API int libssh2_poll(LIBSSH2_POLLFD *fds, unsigned int nfds,\n                             long timeout);\n\n/* Channel API */\n#define LIBSSH2_CHANNEL_WINDOW_DEFAULT  (2*1024*1024)\n#define LIBSSH2_CHANNEL_PACKET_DEFAULT  32768\n#define LIBSSH2_CHANNEL_MINADJUST       1024\n\n/* Extended Data Handling */\n#define LIBSSH2_CHANNEL_EXTENDED_DATA_NORMAL        0\n#define LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE        1\n#define LIBSSH2_CHANNEL_EXTENDED_DATA_MERGE         2\n\n#define SSH_EXTENDED_DATA_STDERR 1\n\n/* Returned by any function that would block during a read/write opperation */\n#define LIBSSH2CHANNEL_EAGAIN LIBSSH2_ERROR_EAGAIN\n\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_open_ex(LIBSSH2_SESSION *session, const char *channel_type,\n                        unsigned int channel_type_len,\n                        unsigned int window_size, unsigned int packet_size,\n                        const char *message, unsigned int message_len);\n\n#define libssh2_channel_open_session(session) \\\n  libssh2_channel_open_ex((session), \"session\", sizeof(\"session\") - 1, \\\n                          LIBSSH2_CHANNEL_WINDOW_DEFAULT, \\\n                          LIBSSH2_CHANNEL_PACKET_DEFAULT, NULL, 0)\n\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_direct_tcpip_ex(LIBSSH2_SESSION *session, const char *host,\n                                int port, const char *shost, int sport);\n#define libssh2_channel_direct_tcpip(session, host, port) \\\n  libssh2_channel_direct_tcpip_ex((session), (host), (port), \"127.0.0.1\", 22)\n\nLIBSSH2_API LIBSSH2_LISTENER *\nlibssh2_channel_forward_listen_ex(LIBSSH2_SESSION *session, const char *host,\n                                  int port, int *bound_port, int queue_maxsize);\n#define libssh2_channel_forward_listen(session, port) \\\n libssh2_channel_forward_listen_ex((session), NULL, (port), NULL, 16)\n\nLIBSSH2_API int libssh2_channel_forward_cancel(LIBSSH2_LISTENER *listener);\n\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_forward_accept(LIBSSH2_LISTENER *listener);\n\nLIBSSH2_API int libssh2_channel_setenv_ex(LIBSSH2_CHANNEL *channel,\n                                          const char *varname,\n                                          unsigned int varname_len,\n                                          const char *value,\n                                          unsigned int value_len);\n\n#define libssh2_channel_setenv(channel, varname, value)                 \\\n    libssh2_channel_setenv_ex((channel), (varname),                     \\\n                              (unsigned int)strlen(varname), (value),   \\\n                              (unsigned int)strlen(value))\n\nLIBSSH2_API int libssh2_channel_request_pty_ex(LIBSSH2_CHANNEL *channel,\n                                               const char *term,\n                                               unsigned int term_len,\n                                               const char *modes,\n                                               unsigned int modes_len,\n                                               int width, int height,\n                                               int width_px, int height_px);\n#define libssh2_channel_request_pty(channel, term)                      \\\n    libssh2_channel_request_pty_ex((channel), (term),                   \\\n                                   (unsigned int)strlen(term),          \\\n                                   NULL, 0,                             \\\n                                   LIBSSH2_TERM_WIDTH, LIBSSH2_TERM_HEIGHT, \\\n                                   LIBSSH2_TERM_WIDTH_PX, LIBSSH2_TERM_HEIGHT_PX)\n\nLIBSSH2_API int libssh2_channel_request_pty_size_ex(LIBSSH2_CHANNEL *channel,\n                                                    int width, int height,\n                                                    int width_px,\n                                                    int height_px);\n#define libssh2_channel_request_pty_size(channel, width, height) \\\n  libssh2_channel_request_pty_size_ex( (channel), (width), (height), 0, 0)\n\nLIBSSH2_API int libssh2_channel_x11_req_ex(LIBSSH2_CHANNEL *channel,\n                                           int single_connection,\n                                           const char *auth_proto,\n                                           const char *auth_cookie,\n                                           int screen_number);\n#define libssh2_channel_x11_req(channel, screen_number) \\\n libssh2_channel_x11_req_ex((channel), 0, NULL, NULL, (screen_number))\n\nLIBSSH2_API int libssh2_channel_process_startup(LIBSSH2_CHANNEL *channel,\n                                                const char *request,\n                                                unsigned int request_len,\n                                                const char *message,\n                                                unsigned int message_len);\n#define libssh2_channel_shell(channel) \\\n  libssh2_channel_process_startup((channel), \"shell\", sizeof(\"shell\") - 1, \\\n                                  NULL, 0)\n#define libssh2_channel_exec(channel, command) \\\n  libssh2_channel_process_startup((channel), \"exec\", sizeof(\"exec\") - 1, \\\n                                  (command), (unsigned int)strlen(command))\n#define libssh2_channel_subsystem(channel, subsystem) \\\n  libssh2_channel_process_startup((channel), \"subsystem\",              \\\n                                  sizeof(\"subsystem\") - 1, (subsystem), \\\n                                  (unsigned int)strlen(subsystem))\n\nLIBSSH2_API ssize_t libssh2_channel_read_ex(LIBSSH2_CHANNEL *channel,\n                                            int stream_id, char *buf,\n                                            size_t buflen);\n#define libssh2_channel_read(channel, buf, buflen) \\\n  libssh2_channel_read_ex((channel), 0, (buf), (buflen))\n#define libssh2_channel_read_stderr(channel, buf, buflen) \\\n  libssh2_channel_read_ex((channel), SSH_EXTENDED_DATA_STDERR, (buf), (buflen))\n\nLIBSSH2_API int libssh2_poll_channel_read(LIBSSH2_CHANNEL *channel,\n                                          int extended);\n\nLIBSSH2_API unsigned long\nlibssh2_channel_window_read_ex(LIBSSH2_CHANNEL *channel,\n                               unsigned long *read_avail,\n                               unsigned long *window_size_initial);\n#define libssh2_channel_window_read(channel) \\\n  libssh2_channel_window_read_ex((channel), NULL, NULL)\n\n/* libssh2_channel_receive_window_adjust is DEPRECATED, do not use! */\nLIBSSH2_API unsigned long\nlibssh2_channel_receive_window_adjust(LIBSSH2_CHANNEL *channel,\n                                      unsigned long adjustment,\n                                      unsigned char force);\n\nLIBSSH2_API int\nlibssh2_channel_receive_window_adjust2(LIBSSH2_CHANNEL *channel,\n                                       unsigned long adjustment,\n                                       unsigned char force,\n                                       unsigned int *storewindow);\n\nLIBSSH2_API ssize_t libssh2_channel_write_ex(LIBSSH2_CHANNEL *channel,\n                                             int stream_id, const char *buf,\n                                             size_t buflen);\n\n#define libssh2_channel_write(channel, buf, buflen) \\\n  libssh2_channel_write_ex((channel), 0, (buf), (buflen))\n#define libssh2_channel_write_stderr(channel, buf, buflen)  \\\n  libssh2_channel_write_ex((channel), SSH_EXTENDED_DATA_STDERR, (buf), (buflen))\n\nLIBSSH2_API unsigned long\nlibssh2_channel_window_write_ex(LIBSSH2_CHANNEL *channel,\n                                unsigned long *window_size_initial);\n#define libssh2_channel_window_write(channel) \\\n  libssh2_channel_window_write_ex((channel), NULL)\n\nLIBSSH2_API void libssh2_session_set_blocking(LIBSSH2_SESSION* session,\n                                              int blocking);\nLIBSSH2_API int libssh2_session_get_blocking(LIBSSH2_SESSION* session);\n\nLIBSSH2_API void libssh2_channel_set_blocking(LIBSSH2_CHANNEL *channel,\n                                              int blocking);\n\nLIBSSH2_API void libssh2_session_set_timeout(LIBSSH2_SESSION* session,\n                                             long timeout);\nLIBSSH2_API long libssh2_session_get_timeout(LIBSSH2_SESSION* session);\n\n/* libssh2_channel_handle_extended_data is DEPRECATED, do not use! */\nLIBSSH2_API void libssh2_channel_handle_extended_data(LIBSSH2_CHANNEL *channel,\n                                                      int ignore_mode);\nLIBSSH2_API int libssh2_channel_handle_extended_data2(LIBSSH2_CHANNEL *channel,\n                                                      int ignore_mode);\n\n/* libssh2_channel_ignore_extended_data() is defined below for BC with version\n * 0.1\n *\n * Future uses should use libssh2_channel_handle_extended_data() directly if\n * LIBSSH2_CHANNEL_EXTENDED_DATA_MERGE is passed, extended data will be read\n * (FIFO) from the standard data channel\n */\n/* DEPRECATED */\n#define libssh2_channel_ignore_extended_data(channel, ignore) \\\n  libssh2_channel_handle_extended_data((channel),                       \\\n                                       (ignore) ?                       \\\n                                       LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE : \\\n                                       LIBSSH2_CHANNEL_EXTENDED_DATA_NORMAL )\n\n#define LIBSSH2_CHANNEL_FLUSH_EXTENDED_DATA     -1\n#define LIBSSH2_CHANNEL_FLUSH_ALL               -2\nLIBSSH2_API int libssh2_channel_flush_ex(LIBSSH2_CHANNEL *channel,\n                                         int streamid);\n#define libssh2_channel_flush(channel) libssh2_channel_flush_ex((channel), 0)\n#define libssh2_channel_flush_stderr(channel) \\\n libssh2_channel_flush_ex((channel), SSH_EXTENDED_DATA_STDERR)\n\nLIBSSH2_API int libssh2_channel_get_exit_status(LIBSSH2_CHANNEL* channel);\nLIBSSH2_API int libssh2_channel_get_exit_signal(LIBSSH2_CHANNEL* channel,\n                                                char **exitsignal,\n                                                size_t *exitsignal_len,\n                                                char **errmsg,\n                                                size_t *errmsg_len,\n                                                char **langtag,\n                                                size_t *langtag_len);\nLIBSSH2_API int libssh2_channel_send_eof(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_eof(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_wait_eof(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_close(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_wait_closed(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_free(LIBSSH2_CHANNEL *channel);\n\n/* libssh2_scp_recv is DEPRECATED, do not use! */\nLIBSSH2_API LIBSSH2_CHANNEL *libssh2_scp_recv(LIBSSH2_SESSION *session,\n                                              const char *path,\n                                              struct stat *sb);\n/* Use libssh2_scp_recv2 for large (> 2GB) file support on windows */\nLIBSSH2_API LIBSSH2_CHANNEL *libssh2_scp_recv2(LIBSSH2_SESSION *session,\n                                               const char *path,\n                                               libssh2_struct_stat *sb);\nLIBSSH2_API LIBSSH2_CHANNEL *libssh2_scp_send_ex(LIBSSH2_SESSION *session,\n                                                 const char *path, int mode,\n                                                 size_t size, long mtime,\n                                                 long atime);\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_scp_send64(LIBSSH2_SESSION *session, const char *path, int mode,\n                   libssh2_int64_t size, time_t mtime, time_t atime);\n\n#define libssh2_scp_send(session, path, mode, size) \\\n  libssh2_scp_send_ex((session), (path), (mode), (size), 0, 0)\n\nLIBSSH2_API int libssh2_base64_decode(LIBSSH2_SESSION *session, char **dest,\n                                      unsigned int *dest_len,\n                                      const char *src, unsigned int src_len);\n\nLIBSSH2_API\nconst char *libssh2_version(int req_version_num);\n\n#define HAVE_LIBSSH2_KNOWNHOST_API 0x010101 /* since 1.1.1 */\n#define HAVE_LIBSSH2_VERSION_API   0x010100 /* libssh2_version since 1.1 */\n\nstruct libssh2_knownhost {\n    unsigned int magic;  /* magic stored by the library */\n    void *node; /* handle to the internal representation of this host */\n    char *name; /* this is NULL if no plain text host name exists */\n    char *key;  /* key in base64/printable format */\n    int typemask;\n};\n\n/*\n * libssh2_knownhost_init\n *\n * Init a collection of known hosts. Returns the pointer to a collection.\n *\n */\nLIBSSH2_API LIBSSH2_KNOWNHOSTS *\nlibssh2_knownhost_init(LIBSSH2_SESSION *session);\n\n/*\n * libssh2_knownhost_add\n *\n * Add a host and its associated key to the collection of known hosts.\n *\n * The 'type' argument specifies on what format the given host and keys are:\n *\n * plain  - ascii \"hostname.domain.tld\"\n * sha1   - SHA1(<salt> <host>) base64-encoded!\n * custom - another hash\n *\n * If 'sha1' is selected as type, the salt must be provided to the salt\n * argument. This too base64 encoded.\n *\n * The SHA-1 hash is what OpenSSH can be told to use in known_hosts files.  If\n * a custom type is used, salt is ignored and you must provide the host\n * pre-hashed when checking for it in the libssh2_knownhost_check() function.\n *\n * The keylen parameter may be omitted (zero) if the key is provided as a\n * NULL-terminated base64-encoded string.\n */\n\n/* host format (2 bits) */\n#define LIBSSH2_KNOWNHOST_TYPE_MASK    0xffff\n#define LIBSSH2_KNOWNHOST_TYPE_PLAIN   1\n#define LIBSSH2_KNOWNHOST_TYPE_SHA1    2 /* always base64 encoded */\n#define LIBSSH2_KNOWNHOST_TYPE_CUSTOM  3\n\n/* key format (2 bits) */\n#define LIBSSH2_KNOWNHOST_KEYENC_MASK     (3<<16)\n#define LIBSSH2_KNOWNHOST_KEYENC_RAW      (1<<16)\n#define LIBSSH2_KNOWNHOST_KEYENC_BASE64   (2<<16)\n\n/* type of key (2 bits) */\n#define LIBSSH2_KNOWNHOST_KEY_MASK     (7<<18)\n#define LIBSSH2_KNOWNHOST_KEY_SHIFT    18\n#define LIBSSH2_KNOWNHOST_KEY_RSA1     (1<<18)\n#define LIBSSH2_KNOWNHOST_KEY_SSHRSA   (2<<18)\n#define LIBSSH2_KNOWNHOST_KEY_SSHDSS   (3<<18)\n#define LIBSSH2_KNOWNHOST_KEY_UNKNOWN  (7<<18)\n\nLIBSSH2_API int\nlibssh2_knownhost_add(LIBSSH2_KNOWNHOSTS *hosts,\n                      const char *host,\n                      const char *salt,\n                      const char *key, size_t keylen, int typemask,\n                      struct libssh2_knownhost **store);\n\n/*\n * libssh2_knownhost_addc\n *\n * Add a host and its associated key to the collection of known hosts.\n *\n * Takes a comment argument that may be NULL.  A NULL comment indicates\n * there is no comment and the entry will end directly after the key\n * when written out to a file.  An empty string \"\" comment will indicate an\n * empty comment which will cause a single space to be written after the key.\n *\n * The 'type' argument specifies on what format the given host and keys are:\n *\n * plain  - ascii \"hostname.domain.tld\"\n * sha1   - SHA1(<salt> <host>) base64-encoded!\n * custom - another hash\n *\n * If 'sha1' is selected as type, the salt must be provided to the salt\n * argument. This too base64 encoded.\n *\n * The SHA-1 hash is what OpenSSH can be told to use in known_hosts files.  If\n * a custom type is used, salt is ignored and you must provide the host\n * pre-hashed when checking for it in the libssh2_knownhost_check() function.\n *\n * The keylen parameter may be omitted (zero) if the key is provided as a\n * NULL-terminated base64-encoded string.\n */\n\nLIBSSH2_API int\nlibssh2_knownhost_addc(LIBSSH2_KNOWNHOSTS *hosts,\n                       const char *host,\n                       const char *salt,\n                       const char *key, size_t keylen,\n                       const char *comment, size_t commentlen, int typemask,\n                       struct libssh2_knownhost **store);\n\n/*\n * libssh2_knownhost_check\n *\n * Check a host and its associated key against the collection of known hosts.\n *\n * The type is the type/format of the given host name.\n *\n * plain  - ascii \"hostname.domain.tld\"\n * custom - prehashed base64 encoded. Note that this cannot use any salts.\n *\n *\n * 'knownhost' may be set to NULL if you don't care about that info.\n *\n * Returns:\n *\n * LIBSSH2_KNOWNHOST_CHECK_* values, see below\n *\n */\n\n#define LIBSSH2_KNOWNHOST_CHECK_MATCH    0\n#define LIBSSH2_KNOWNHOST_CHECK_MISMATCH 1\n#define LIBSSH2_KNOWNHOST_CHECK_NOTFOUND 2\n#define LIBSSH2_KNOWNHOST_CHECK_FAILURE  3\n\nLIBSSH2_API int\nlibssh2_knownhost_check(LIBSSH2_KNOWNHOSTS *hosts,\n                        const char *host, const char *key, size_t keylen,\n                        int typemask,\n                        struct libssh2_knownhost **knownhost);\n\n/* this function is identital to the above one, but also takes a port\n   argument that allows libssh2 to do a better check */\nLIBSSH2_API int\nlibssh2_knownhost_checkp(LIBSSH2_KNOWNHOSTS *hosts,\n                         const char *host, int port,\n                         const char *key, size_t keylen,\n                         int typemask,\n                         struct libssh2_knownhost **knownhost);\n\n/*\n * libssh2_knownhost_del\n *\n * Remove a host from the collection of known hosts. The 'entry' struct is\n * retrieved by a call to libssh2_knownhost_check().\n *\n */\nLIBSSH2_API int\nlibssh2_knownhost_del(LIBSSH2_KNOWNHOSTS *hosts,\n                      struct libssh2_knownhost *entry);\n\n/*\n * libssh2_knownhost_free\n *\n * Free an entire collection of known hosts.\n *\n */\nLIBSSH2_API void\nlibssh2_knownhost_free(LIBSSH2_KNOWNHOSTS *hosts);\n\n/*\n * libssh2_knownhost_readline()\n *\n * Pass in a line of a file of 'type'. It makes libssh2 read this line.\n *\n * LIBSSH2_KNOWNHOST_FILE_OPENSSH is the only supported type.\n *\n */\nLIBSSH2_API int\nlibssh2_knownhost_readline(LIBSSH2_KNOWNHOSTS *hosts,\n                           const char *line, size_t len, int type);\n\n/*\n * libssh2_knownhost_readfile\n *\n * Add hosts+key pairs from a given file.\n *\n * Returns a negative value for error or number of successfully added hosts.\n *\n * This implementation currently only knows one 'type' (openssh), all others\n * are reserved for future use.\n */\n\n#define LIBSSH2_KNOWNHOST_FILE_OPENSSH 1\n\nLIBSSH2_API int\nlibssh2_knownhost_readfile(LIBSSH2_KNOWNHOSTS *hosts,\n                           const char *filename, int type);\n\n/*\n * libssh2_knownhost_writeline()\n *\n * Ask libssh2 to convert a known host to an output line for storage.\n *\n * Note that this function returns LIBSSH2_ERROR_BUFFER_TOO_SMALL if the given\n * output buffer is too small to hold the desired output.\n *\n * This implementation currently only knows one 'type' (openssh), all others\n * are reserved for future use.\n *\n */\nLIBSSH2_API int\nlibssh2_knownhost_writeline(LIBSSH2_KNOWNHOSTS *hosts,\n                            struct libssh2_knownhost *known,\n                            char *buffer, size_t buflen,\n                            size_t *outlen, /* the amount of written data */\n                            int type);\n\n/*\n * libssh2_knownhost_writefile\n *\n * Write hosts+key pairs to a given file.\n *\n * This implementation currently only knows one 'type' (openssh), all others\n * are reserved for future use.\n */\n\nLIBSSH2_API int\nlibssh2_knownhost_writefile(LIBSSH2_KNOWNHOSTS *hosts,\n                            const char *filename, int type);\n\n/*\n * libssh2_knownhost_get()\n *\n * Traverse the internal list of known hosts. Pass NULL to 'prev' to get\n * the first one. Or pass a poiner to the previously returned one to get the\n * next.\n *\n * Returns:\n * 0 if a fine host was stored in 'store'\n * 1 if end of hosts\n * [negative] on errors\n */\nLIBSSH2_API int\nlibssh2_knownhost_get(LIBSSH2_KNOWNHOSTS *hosts,\n                      struct libssh2_knownhost **store,\n                      struct libssh2_knownhost *prev);\n\n#define HAVE_LIBSSH2_AGENT_API 0x010202 /* since 1.2.2 */\n\nstruct libssh2_agent_publickey {\n    unsigned int magic;              /* magic stored by the library */\n    void *node;     /* handle to the internal representation of key */\n    unsigned char *blob;           /* public key blob */\n    size_t blob_len;               /* length of the public key blob */\n    char *comment;                 /* comment in printable format */\n};\n\n/*\n * libssh2_agent_init\n *\n * Init an ssh-agent handle. Returns the pointer to the handle.\n *\n */\nLIBSSH2_API LIBSSH2_AGENT *\nlibssh2_agent_init(LIBSSH2_SESSION *session);\n\n/*\n * libssh2_agent_connect()\n *\n * Connect to an ssh-agent.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_connect(LIBSSH2_AGENT *agent);\n\n/*\n * libssh2_agent_list_identities()\n *\n * Request an ssh-agent to list identities.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_list_identities(LIBSSH2_AGENT *agent);\n\n/*\n * libssh2_agent_get_identity()\n *\n * Traverse the internal list of public keys. Pass NULL to 'prev' to get\n * the first one. Or pass a poiner to the previously returned one to get the\n * next.\n *\n * Returns:\n * 0 if a fine public key was stored in 'store'\n * 1 if end of public keys\n * [negative] on errors\n */\nLIBSSH2_API int\nlibssh2_agent_get_identity(LIBSSH2_AGENT *agent,\n               struct libssh2_agent_publickey **store,\n               struct libssh2_agent_publickey *prev);\n\n/*\n * libssh2_agent_userauth()\n *\n * Do publickey user authentication with the help of ssh-agent.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_userauth(LIBSSH2_AGENT *agent,\n               const char *username,\n               struct libssh2_agent_publickey *identity);\n\n/*\n * libssh2_agent_disconnect()\n *\n * Close a connection to an ssh-agent.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_disconnect(LIBSSH2_AGENT *agent);\n\n/*\n * libssh2_agent_free()\n *\n * Free an ssh-agent handle.  This function also frees the internal\n * collection of public keys.\n */\nLIBSSH2_API void\nlibssh2_agent_free(LIBSSH2_AGENT *agent);\n\n\n/*\n * libssh2_keepalive_config()\n *\n * Set how often keepalive messages should be sent.  WANT_REPLY\n * indicates whether the keepalive messages should request a response\n * from the server.  INTERVAL is number of seconds that can pass\n * without any I/O, use 0 (the default) to disable keepalives.  To\n * avoid some busy-loop corner-cases, if you specify an interval of 1\n * it will be treated as 2.\n *\n * Note that non-blocking applications are responsible for sending the\n * keepalive messages using libssh2_keepalive_send().\n */\nLIBSSH2_API void libssh2_keepalive_config (LIBSSH2_SESSION *session,\n                                           int want_reply,\n                                           unsigned interval);\n\n/*\n * libssh2_keepalive_send()\n *\n * Send a keepalive message if needed.  SECONDS_TO_NEXT indicates how\n * many seconds you can sleep after this call before you need to call\n * it again.  Returns 0 on success, or LIBSSH2_ERROR_SOCKET_SEND on\n * I/O errors.\n */\nLIBSSH2_API int libssh2_keepalive_send (LIBSSH2_SESSION *session,\n                                        int *seconds_to_next);\n\n/* NOTE NOTE NOTE\n   libssh2_trace() has no function in builds that aren't built with debug\n   enabled\n */\nLIBSSH2_API int libssh2_trace(LIBSSH2_SESSION *session, int bitmask);\n#define LIBSSH2_TRACE_TRANS (1<<1)\n#define LIBSSH2_TRACE_KEX   (1<<2)\n#define LIBSSH2_TRACE_AUTH  (1<<3)\n#define LIBSSH2_TRACE_CONN  (1<<4)\n#define LIBSSH2_TRACE_SCP   (1<<5)\n#define LIBSSH2_TRACE_SFTP  (1<<6)\n#define LIBSSH2_TRACE_ERROR (1<<7)\n#define LIBSSH2_TRACE_PUBLICKEY (1<<8)\n#define LIBSSH2_TRACE_SOCKET (1<<9)\n\ntypedef void (*libssh2_trace_handler_func)(LIBSSH2_SESSION*,\n                                           void*,\n                                           const char *,\n                                           size_t);\nLIBSSH2_API int libssh2_trace_sethandler(LIBSSH2_SESSION *session,\n                                         void* context,\n                                         libssh2_trace_handler_func callback);\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n\n#endif /* !RC_INVOKED */\n\n#endif /* LIBSSH2_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/include/libssh2_publickey.h",
    "content": "/* Copyright (c) 2004-2006, Sara Golemon <sarag@libssh2.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* Note: This include file is only needed for using the\n * publickey SUBSYSTEM which is not the same as publickey\n * authentication.  For authentication you only need libssh2.h\n *\n * For more information on the publickey subsystem,\n * refer to IETF draft: secsh-publickey\n */\n\n#ifndef LIBSSH2_PUBLICKEY_H\n#define LIBSSH2_PUBLICKEY_H 1\n\n#include \"libssh2.h\"\n\ntypedef struct _LIBSSH2_PUBLICKEY               LIBSSH2_PUBLICKEY;\n\ntypedef struct _libssh2_publickey_attribute {\n    const char *name;\n    unsigned long name_len;\n    const char *value;\n    unsigned long value_len;\n    char mandatory;\n} libssh2_publickey_attribute;\n\ntypedef struct _libssh2_publickey_list {\n    unsigned char *packet; /* For freeing */\n\n    const unsigned char *name;\n    unsigned long name_len;\n    const unsigned char *blob;\n    unsigned long blob_len;\n    unsigned long num_attrs;\n    libssh2_publickey_attribute *attrs; /* free me */\n} libssh2_publickey_list;\n\n/* Generally use the first macro here, but if both name and value are string\n   literals, you can use _fast() to take advantage of preprocessing */\n#define libssh2_publickey_attribute(name, value, mandatory) \\\n  { (name), strlen(name), (value), strlen(value), (mandatory) },\n#define libssh2_publickey_attribute_fast(name, value, mandatory) \\\n  { (name), sizeof(name) - 1, (value), sizeof(value) - 1, (mandatory) },\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Publickey Subsystem */\nLIBSSH2_API LIBSSH2_PUBLICKEY *libssh2_publickey_init(LIBSSH2_SESSION *session);\n\nLIBSSH2_API int libssh2_publickey_add_ex(LIBSSH2_PUBLICKEY *pkey,\n                                         const unsigned char *name,\n                                         unsigned long name_len,\n                                         const unsigned char *blob,\n                                         unsigned long blob_len, char overwrite,\n                                         unsigned long num_attrs,\n                                         const libssh2_publickey_attribute attrs[]);\n#define libssh2_publickey_add(pkey, name, blob, blob_len, overwrite, \\\n                              num_attrs, attrs)                         \\\n  libssh2_publickey_add_ex((pkey), (name), strlen(name), (blob), (blob_len), \\\n                           (overwrite), (num_attrs), (attrs))\n\nLIBSSH2_API int libssh2_publickey_remove_ex(LIBSSH2_PUBLICKEY *pkey,\n                                            const unsigned char *name,\n                                            unsigned long name_len,\n                                            const unsigned char *blob,\n                                            unsigned long blob_len);\n#define libssh2_publickey_remove(pkey, name, blob, blob_len) \\\n  libssh2_publickey_remove_ex((pkey), (name), strlen(name), (blob), (blob_len))\n\nLIBSSH2_API int\nlibssh2_publickey_list_fetch(LIBSSH2_PUBLICKEY *pkey,\n                             unsigned long *num_keys,\n                             libssh2_publickey_list **pkey_list);\nLIBSSH2_API void libssh2_publickey_list_free(LIBSSH2_PUBLICKEY *pkey,\n                                             libssh2_publickey_list *pkey_list);\n\nLIBSSH2_API int libssh2_publickey_shutdown(LIBSSH2_PUBLICKEY *pkey);\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n\n#endif /* ifndef: LIBSSH2_PUBLICKEY_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/include/libssh2_sftp.h",
    "content": "/* Copyright (c) 2004-2008, Sara Golemon <sarag@libssh2.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_SFTP_H\n#define LIBSSH2_SFTP_H 1\n\n#include \"libssh2.h\"\n\n#ifndef WIN32\n#include <unistd.h>\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Note: Version 6 was documented at the time of writing\n * However it was marked as \"DO NOT IMPLEMENT\" due to pending changes\n *\n * Let's start with Version 3 (The version found in OpenSSH) and go from there\n */\n#define LIBSSH2_SFTP_VERSION        3\n\ntypedef struct _LIBSSH2_SFTP                LIBSSH2_SFTP;\ntypedef struct _LIBSSH2_SFTP_HANDLE         LIBSSH2_SFTP_HANDLE;\ntypedef struct _LIBSSH2_SFTP_ATTRIBUTES     LIBSSH2_SFTP_ATTRIBUTES;\ntypedef struct _LIBSSH2_SFTP_STATVFS        LIBSSH2_SFTP_STATVFS;\n\n/* Flags for open_ex() */\n#define LIBSSH2_SFTP_OPENFILE           0\n#define LIBSSH2_SFTP_OPENDIR            1\n\n/* Flags for rename_ex() */\n#define LIBSSH2_SFTP_RENAME_OVERWRITE   0x00000001\n#define LIBSSH2_SFTP_RENAME_ATOMIC      0x00000002\n#define LIBSSH2_SFTP_RENAME_NATIVE      0x00000004\n\n/* Flags for stat_ex() */\n#define LIBSSH2_SFTP_STAT               0\n#define LIBSSH2_SFTP_LSTAT              1\n#define LIBSSH2_SFTP_SETSTAT            2\n\n/* Flags for symlink_ex() */\n#define LIBSSH2_SFTP_SYMLINK            0\n#define LIBSSH2_SFTP_READLINK           1\n#define LIBSSH2_SFTP_REALPATH           2\n\n/* SFTP attribute flag bits */\n#define LIBSSH2_SFTP_ATTR_SIZE              0x00000001\n#define LIBSSH2_SFTP_ATTR_UIDGID            0x00000002\n#define LIBSSH2_SFTP_ATTR_PERMISSIONS       0x00000004\n#define LIBSSH2_SFTP_ATTR_ACMODTIME         0x00000008\n#define LIBSSH2_SFTP_ATTR_EXTENDED          0x80000000\n\n/* SFTP statvfs flag bits */\n#define LIBSSH2_SFTP_ST_RDONLY              0x00000001\n#define LIBSSH2_SFTP_ST_NOSUID              0x00000002\n\nstruct _LIBSSH2_SFTP_ATTRIBUTES {\n    /* If flags & ATTR_* bit is set, then the value in this struct will be\n     * meaningful Otherwise it should be ignored\n     */\n    unsigned long flags;\n\n    libssh2_uint64_t filesize;\n    unsigned long uid, gid;\n    unsigned long permissions;\n    unsigned long atime, mtime;\n};\n\nstruct _LIBSSH2_SFTP_STATVFS {\n    libssh2_uint64_t  f_bsize;    /* file system block size */\n    libssh2_uint64_t  f_frsize;   /* fragment size */\n    libssh2_uint64_t  f_blocks;   /* size of fs in f_frsize units */\n    libssh2_uint64_t  f_bfree;    /* # free blocks */\n    libssh2_uint64_t  f_bavail;   /* # free blocks for non-root */\n    libssh2_uint64_t  f_files;    /* # inodes */\n    libssh2_uint64_t  f_ffree;    /* # free inodes */\n    libssh2_uint64_t  f_favail;   /* # free inodes for non-root */\n    libssh2_uint64_t  f_fsid;     /* file system ID */\n    libssh2_uint64_t  f_flag;     /* mount flags */\n    libssh2_uint64_t  f_namemax;  /* maximum filename length */\n};\n\n/* SFTP filetypes */\n#define LIBSSH2_SFTP_TYPE_REGULAR           1\n#define LIBSSH2_SFTP_TYPE_DIRECTORY         2\n#define LIBSSH2_SFTP_TYPE_SYMLINK           3\n#define LIBSSH2_SFTP_TYPE_SPECIAL           4\n#define LIBSSH2_SFTP_TYPE_UNKNOWN           5\n#define LIBSSH2_SFTP_TYPE_SOCKET            6\n#define LIBSSH2_SFTP_TYPE_CHAR_DEVICE       7\n#define LIBSSH2_SFTP_TYPE_BLOCK_DEVICE      8\n#define LIBSSH2_SFTP_TYPE_FIFO              9\n\n/*\n * Reproduce the POSIX file modes here for systems that are not POSIX\n * compliant.\n *\n * These is used in \"permissions\" of \"struct _LIBSSH2_SFTP_ATTRIBUTES\"\n */\n/* File type */\n#define LIBSSH2_SFTP_S_IFMT         0170000     /* type of file mask */\n#define LIBSSH2_SFTP_S_IFIFO        0010000     /* named pipe (fifo) */\n#define LIBSSH2_SFTP_S_IFCHR        0020000     /* character special */\n#define LIBSSH2_SFTP_S_IFDIR        0040000     /* directory */\n#define LIBSSH2_SFTP_S_IFBLK        0060000     /* block special */\n#define LIBSSH2_SFTP_S_IFREG        0100000     /* regular */\n#define LIBSSH2_SFTP_S_IFLNK        0120000     /* symbolic link */\n#define LIBSSH2_SFTP_S_IFSOCK       0140000     /* socket */\n\n/* File mode */\n/* Read, write, execute/search by owner */\n#define LIBSSH2_SFTP_S_IRWXU        0000700     /* RWX mask for owner */\n#define LIBSSH2_SFTP_S_IRUSR        0000400     /* R for owner */\n#define LIBSSH2_SFTP_S_IWUSR        0000200     /* W for owner */\n#define LIBSSH2_SFTP_S_IXUSR        0000100     /* X for owner */\n/* Read, write, execute/search by group */\n#define LIBSSH2_SFTP_S_IRWXG        0000070     /* RWX mask for group */\n#define LIBSSH2_SFTP_S_IRGRP        0000040     /* R for group */\n#define LIBSSH2_SFTP_S_IWGRP        0000020     /* W for group */\n#define LIBSSH2_SFTP_S_IXGRP        0000010     /* X for group */\n/* Read, write, execute/search by others */\n#define LIBSSH2_SFTP_S_IRWXO        0000007     /* RWX mask for other */\n#define LIBSSH2_SFTP_S_IROTH        0000004     /* R for other */\n#define LIBSSH2_SFTP_S_IWOTH        0000002     /* W for other */\n#define LIBSSH2_SFTP_S_IXOTH        0000001     /* X for other */\n\n/* macros to check for specific file types, added in 1.2.5 */\n#define LIBSSH2_SFTP_S_ISLNK(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFLNK)\n#define LIBSSH2_SFTP_S_ISREG(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFREG)\n#define LIBSSH2_SFTP_S_ISDIR(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFDIR)\n#define LIBSSH2_SFTP_S_ISCHR(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFCHR)\n#define LIBSSH2_SFTP_S_ISBLK(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFBLK)\n#define LIBSSH2_SFTP_S_ISFIFO(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFIFO)\n#define LIBSSH2_SFTP_S_ISSOCK(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFSOCK)\n\n/* SFTP File Transfer Flags -- (e.g. flags parameter to sftp_open())\n * Danger will robinson... APPEND doesn't have any effect on OpenSSH servers */\n#define LIBSSH2_FXF_READ                        0x00000001\n#define LIBSSH2_FXF_WRITE                       0x00000002\n#define LIBSSH2_FXF_APPEND                      0x00000004\n#define LIBSSH2_FXF_CREAT                       0x00000008\n#define LIBSSH2_FXF_TRUNC                       0x00000010\n#define LIBSSH2_FXF_EXCL                        0x00000020\n\n/* SFTP Status Codes (returned by libssh2_sftp_last_error() ) */\n#define LIBSSH2_FX_OK                       0\n#define LIBSSH2_FX_EOF                      1\n#define LIBSSH2_FX_NO_SUCH_FILE             2\n#define LIBSSH2_FX_PERMISSION_DENIED        3\n#define LIBSSH2_FX_FAILURE                  4\n#define LIBSSH2_FX_BAD_MESSAGE              5\n#define LIBSSH2_FX_NO_CONNECTION            6\n#define LIBSSH2_FX_CONNECTION_LOST          7\n#define LIBSSH2_FX_OP_UNSUPPORTED           8\n#define LIBSSH2_FX_INVALID_HANDLE           9\n#define LIBSSH2_FX_NO_SUCH_PATH             10\n#define LIBSSH2_FX_FILE_ALREADY_EXISTS      11\n#define LIBSSH2_FX_WRITE_PROTECT            12\n#define LIBSSH2_FX_NO_MEDIA                 13\n#define LIBSSH2_FX_NO_SPACE_ON_FILESYSTEM   14\n#define LIBSSH2_FX_QUOTA_EXCEEDED           15\n#define LIBSSH2_FX_UNKNOWN_PRINCIPLE        16 /* Initial mis-spelling */\n#define LIBSSH2_FX_UNKNOWN_PRINCIPAL        16\n#define LIBSSH2_FX_LOCK_CONFlICT            17 /* Initial mis-spelling */\n#define LIBSSH2_FX_LOCK_CONFLICT            17\n#define LIBSSH2_FX_DIR_NOT_EMPTY            18\n#define LIBSSH2_FX_NOT_A_DIRECTORY          19\n#define LIBSSH2_FX_INVALID_FILENAME         20\n#define LIBSSH2_FX_LINK_LOOP                21\n\n/* Returned by any function that would block during a read/write opperation */\n#define LIBSSH2SFTP_EAGAIN LIBSSH2_ERROR_EAGAIN\n\n/* SFTP API */\nLIBSSH2_API LIBSSH2_SFTP *libssh2_sftp_init(LIBSSH2_SESSION *session);\nLIBSSH2_API int libssh2_sftp_shutdown(LIBSSH2_SFTP *sftp);\nLIBSSH2_API unsigned long libssh2_sftp_last_error(LIBSSH2_SFTP *sftp);\nLIBSSH2_API LIBSSH2_CHANNEL *libssh2_sftp_get_channel(LIBSSH2_SFTP *sftp);\n\n/* File / Directory Ops */\nLIBSSH2_API LIBSSH2_SFTP_HANDLE *libssh2_sftp_open_ex(LIBSSH2_SFTP *sftp,\n                                                      const char *filename,\n                                                      unsigned int filename_len,\n                                                      unsigned long flags,\n                                                      long mode, int open_type);\n#define libssh2_sftp_open(sftp, filename, flags, mode) \\\n    libssh2_sftp_open_ex((sftp), (filename), strlen(filename), (flags), \\\n                         (mode), LIBSSH2_SFTP_OPENFILE)\n#define libssh2_sftp_opendir(sftp, path) \\\n    libssh2_sftp_open_ex((sftp), (path), strlen(path), 0, 0, \\\n                         LIBSSH2_SFTP_OPENDIR)\n\nLIBSSH2_API ssize_t libssh2_sftp_read(LIBSSH2_SFTP_HANDLE *handle,\n                                      char *buffer, size_t buffer_maxlen);\n\nLIBSSH2_API int libssh2_sftp_readdir_ex(LIBSSH2_SFTP_HANDLE *handle, \\\n                                        char *buffer, size_t buffer_maxlen,\n                                        char *longentry,\n                                        size_t longentry_maxlen,\n                                        LIBSSH2_SFTP_ATTRIBUTES *attrs);\n#define libssh2_sftp_readdir(handle, buffer, buffer_maxlen, attrs)      \\\n    libssh2_sftp_readdir_ex((handle), (buffer), (buffer_maxlen), NULL, 0, \\\n                            (attrs))\n\nLIBSSH2_API ssize_t libssh2_sftp_write(LIBSSH2_SFTP_HANDLE *handle,\n                                       const char *buffer, size_t count);\nLIBSSH2_API int libssh2_sftp_fsync(LIBSSH2_SFTP_HANDLE *handle);\n\nLIBSSH2_API int libssh2_sftp_close_handle(LIBSSH2_SFTP_HANDLE *handle);\n#define libssh2_sftp_close(handle) libssh2_sftp_close_handle(handle)\n#define libssh2_sftp_closedir(handle) libssh2_sftp_close_handle(handle)\n\nLIBSSH2_API void libssh2_sftp_seek(LIBSSH2_SFTP_HANDLE *handle, size_t offset);\nLIBSSH2_API void libssh2_sftp_seek64(LIBSSH2_SFTP_HANDLE *handle,\n                                     libssh2_uint64_t offset);\n#define libssh2_sftp_rewind(handle) libssh2_sftp_seek64((handle), 0)\n\nLIBSSH2_API size_t libssh2_sftp_tell(LIBSSH2_SFTP_HANDLE *handle);\nLIBSSH2_API libssh2_uint64_t libssh2_sftp_tell64(LIBSSH2_SFTP_HANDLE *handle);\n\nLIBSSH2_API int libssh2_sftp_fstat_ex(LIBSSH2_SFTP_HANDLE *handle,\n                                      LIBSSH2_SFTP_ATTRIBUTES *attrs,\n                                      int setstat);\n#define libssh2_sftp_fstat(handle, attrs) \\\n    libssh2_sftp_fstat_ex((handle), (attrs), 0)\n#define libssh2_sftp_fsetstat(handle, attrs) \\\n    libssh2_sftp_fstat_ex((handle), (attrs), 1)\n\n/* Miscellaneous Ops */\nLIBSSH2_API int libssh2_sftp_rename_ex(LIBSSH2_SFTP *sftp,\n                                       const char *source_filename,\n                                       unsigned int srouce_filename_len,\n                                       const char *dest_filename,\n                                       unsigned int dest_filename_len,\n                                       long flags);\n#define libssh2_sftp_rename(sftp, sourcefile, destfile) \\\n    libssh2_sftp_rename_ex((sftp), (sourcefile), strlen(sourcefile), \\\n                           (destfile), strlen(destfile),                \\\n                           LIBSSH2_SFTP_RENAME_OVERWRITE | \\\n                           LIBSSH2_SFTP_RENAME_ATOMIC | \\\n                           LIBSSH2_SFTP_RENAME_NATIVE)\n\nLIBSSH2_API int libssh2_sftp_unlink_ex(LIBSSH2_SFTP *sftp,\n                                       const char *filename,\n                                       unsigned int filename_len);\n#define libssh2_sftp_unlink(sftp, filename) \\\n    libssh2_sftp_unlink_ex((sftp), (filename), strlen(filename))\n\nLIBSSH2_API int libssh2_sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle,\n                                      LIBSSH2_SFTP_STATVFS *st);\n\nLIBSSH2_API int libssh2_sftp_statvfs(LIBSSH2_SFTP *sftp,\n                                     const char *path,\n                                     size_t path_len,\n                                     LIBSSH2_SFTP_STATVFS *st);\n\nLIBSSH2_API int libssh2_sftp_mkdir_ex(LIBSSH2_SFTP *sftp,\n                                      const char *path,\n                                      unsigned int path_len, long mode);\n#define libssh2_sftp_mkdir(sftp, path, mode) \\\n    libssh2_sftp_mkdir_ex((sftp), (path), strlen(path), (mode))\n\nLIBSSH2_API int libssh2_sftp_rmdir_ex(LIBSSH2_SFTP *sftp,\n                                      const char *path,\n                                      unsigned int path_len);\n#define libssh2_sftp_rmdir(sftp, path) \\\n    libssh2_sftp_rmdir_ex((sftp), (path), strlen(path))\n\nLIBSSH2_API int libssh2_sftp_stat_ex(LIBSSH2_SFTP *sftp,\n                                     const char *path,\n                                     unsigned int path_len,\n                                     int stat_type,\n                                     LIBSSH2_SFTP_ATTRIBUTES *attrs);\n#define libssh2_sftp_stat(sftp, path, attrs) \\\n    libssh2_sftp_stat_ex((sftp), (path), strlen(path), LIBSSH2_SFTP_STAT, \\\n                         (attrs))\n#define libssh2_sftp_lstat(sftp, path, attrs) \\\n    libssh2_sftp_stat_ex((sftp), (path), strlen(path), LIBSSH2_SFTP_LSTAT, \\\n                         (attrs))\n#define libssh2_sftp_setstat(sftp, path, attrs) \\\n    libssh2_sftp_stat_ex((sftp), (path), strlen(path), LIBSSH2_SFTP_SETSTAT, \\\n                         (attrs))\n\nLIBSSH2_API int libssh2_sftp_symlink_ex(LIBSSH2_SFTP *sftp,\n                                        const char *path,\n                                        unsigned int path_len,\n                                        char *target,\n                                        unsigned int target_len, int link_type);\n#define libssh2_sftp_symlink(sftp, orig, linkpath) \\\n    libssh2_sftp_symlink_ex((sftp), (orig), strlen(orig), (linkpath), \\\n                            strlen(linkpath), LIBSSH2_SFTP_SYMLINK)\n#define libssh2_sftp_readlink(sftp, path, target, maxlen) \\\n    libssh2_sftp_symlink_ex((sftp), (path), strlen(path), (target), (maxlen), \\\n    LIBSSH2_SFTP_READLINK)\n#define libssh2_sftp_realpath(sftp, path, target, maxlen) \\\n    libssh2_sftp_symlink_ex((sftp), (path), strlen(path), (target), (maxlen), \\\n                            LIBSSH2_SFTP_REALPATH)\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n\n#endif /* LIBSSH2_SFTP_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/libssh2-style.el",
    "content": ";;;; Emacs Lisp help for writing libssh2 code. ;;;;\n;;;; $Id: libssh2-style.el,v 1.1 2008/12/20 12:36:50 bagder Exp $\n\n;;; The libssh2 hacker's C conventions.\n;;; See the sample.emacs file on how this file can be made to take\n;;; effect automatically when editing libssh2 source files.\n\n(defconst libssh2-c-style\n  '((c-basic-offset . 4)\n    (c-comment-only-line-offset . 0)\n    (c-hanging-braces-alist     . ((substatement-open before after)))\n    (c-offsets-alist . ((topmost-intro        . 0)\n\t\t\t(topmost-intro-cont   . 0)\n\t\t\t(substatement         . +)\n\t\t\t(substatement-open    . 0)\n\t\t\t(statement-case-intro . +)\n\t\t\t(statement-case-open  . 0)\n\t\t\t(case-label           . 0)\n\t\t\t))\n    )\n  \"Libssh2 C Programming Style\")\n\n(defun libssh2-code-cleanup ()\n  \"tabify and delete trailing whitespace\"\n  (interactive)\n  (untabify (point-min) (point-max))\n  (delete-trailing-whitespace)\n)\n\n;; Customizations for all of c-mode, c++-mode, and objc-mode\n(defun libssh2-c-mode-common-hook ()\n  \"Libssh2 C mode hook\"\n  ;; add libssh2 style and set it for the current buffer\n  (c-add-style \"libssh2\" libssh2-c-style t)\n  (setq tab-width 8\n\tindent-tabs-mode nil\t\t; Use spaces, not tabs.\n\tcomment-column 40\n\tc-font-lock-extra-types (append '(\"libssh2_int64_t\" \"LIBSSH2_USERAUTH_KBDINT_PROMPT\" \"LIBSSH2_SESSION\" \"LIBSSH2_CHANNEL\" \"ssize_t\" \"size_t\" \"uint32_t\" \"LIBSSH2_LISTENER\" \"LIBSSH2_POLLFD\"))\n\t)\n  ;; keybindings for C, C++, and Objective-C.  We can put these in\n  ;; c-mode-base-map because of inheritance ...\n  (define-key c-mode-base-map \"\\M-q\" 'c-fill-paragraph)\n  (define-key c-mode-base-map \"\\M-m\" 'libssh2-code-cleanup)\n  (setq c-recognize-knr-p nil)\n  ;;; (add-hook 'write-file-hooks 'delete-trailing-whitespace t)\n  (setq show-trailing-whitespace t)\n  )\n\n;; Set this is in your .emacs if you want to use the c-mode-hook as\n;; defined here right out of the box.\n; (add-hook 'c-mode-common-hook 'libssh2-c-mode-common-hook)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/libssh2.pc.in",
    "content": "###########################################################################\n# libssh2 installation details\n###########################################################################\n\nprefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: libssh2\nURL: https://www.libssh2.org/\nDescription: Library for SSH-based communication\nVersion: @LIBSSH2VER@\nRequires.private: @LIBSREQUIRED@\nLibs: -L${libdir} -lssh2 @LIBS@\nLibs.private: @LIBS@\nCflags: -I${includedir}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/m4/.gitignore",
    "content": "libtool.m4\nltoptions.m4\nltsugar.m4\nltversion.m4\nlt~obsolete.m4\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/m4/autobuild.m4",
    "content": "# autobuild.m4 serial 3\n# Copyright (C) 2004, 2006 Simon Josefsson\n#\n# This file is free software, distributed under the terms of the GNU\n# General Public License.  As a special exception to the GNU General\n# Public License, this file may be distributed as part of a program\n# that contains a configuration script generated by Autoconf, under\n# the same distribution terms as the rest of that program.\n#\n# This file can can be used in projects which are not available under\n# the GNU General Public License or the GNU Library General Public\n# License but which still want to provide support for Autobuild.\n\n# Usage: AB_INIT([MODE]).\nAC_DEFUN([AB_INIT],\n[\n\tAC_REQUIRE([AC_CANONICAL_BUILD])\n\tAC_REQUIRE([AC_CANONICAL_HOST])\n\n\tif test -z \"$AB_PACKAGE\"; then\n\t   AB_PACKAGE=${PACKAGE_NAME:-$PACKAGE}\n\tfi\n\tAC_MSG_NOTICE([autobuild project... $AB_PACKAGE])\n\n\tif test -z \"$AB_VERSION\"; then\n\t   AB_VERSION=${PACKAGE_VERSION:-$VERSION}\n\tfi\n\tAC_MSG_NOTICE([autobuild revision... $AB_VERSION])\n\n\thostname=`hostname`\n\tif test \"$hostname\"; then\n\t   AC_MSG_NOTICE([autobuild hostname... $hostname])\n\tfi\n\n\tifelse([$1],[],,[AC_MSG_NOTICE([autobuild mode... $1])])\n\n\tdate=`date +%Y%m%d-%H%M%S`\n\tif test \"$?\" != 0; then\n\t   date=`date`\n\tfi\n\tif test \"$date\"; then\n\t   AC_MSG_NOTICE([autobuild timestamp... $date])\n\tfi\n])\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/m4/lib-ld.m4",
    "content": "# lib-ld.m4 serial 3 (gettext-0.13)\ndnl Copyright (C) 1996-2003 Free Software Foundation, Inc.\ndnl This file is free software; the Free Software Foundation\ndnl gives unlimited permission to copy and/or distribute it,\ndnl with or without modifications, as long as this notice is preserved.\n\ndnl Subroutines of libtool.m4,\ndnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision\ndnl with libtool.m4.\n\ndnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.\nAC_DEFUN([AC_LIB_PROG_LD_GNU],\n[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,\n[# I'd rather use --version here, but apparently some GNU ld's only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  acl_cv_prog_gnu_ld=yes ;;\n*)\n  acl_cv_prog_gnu_ld=no ;;\nesac])\nwith_gnu_ld=$acl_cv_prog_gnu_ld\n])\n\ndnl From libtool-1.4. Sets the variable LD.\nAC_DEFUN([AC_LIB_PROG_LD],\n[AC_ARG_WITH(gnu-ld,\n[  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]],\ntest \"$withval\" = no || with_gnu_ld=yes, with_gnu_ld=no)\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([AC_CANONICAL_HOST])dnl\n# Prepare PATH_SEPARATOR.\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  echo \"#! /bin/sh\" >conf$$.sh\n  echo  \"exit 0\"   >>conf$$.sh\n  chmod +x conf$$.sh\n  if (PATH=\"/nonexistent;.\"; conf$$.sh) >/dev/null 2>&1; then\n    PATH_SEPARATOR=';'\n  else\n    PATH_SEPARATOR=:\n  fi\n  rm -f conf$$.sh\nfi\nac_prog=ld\nif test \"$GCC\" = yes; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  AC_MSG_CHECKING([for ld used by GCC])\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [[\\\\/]* | [A-Za-z]:[\\\\/]*)]\n      [re_direlt='/[^/][^/]*/\\.\\./']\n      # Canonicalize the path of ld\n      ac_prog=`echo $ac_prog| sed 's%\\\\\\\\%/%g'`\n      while echo $ac_prog | grep \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`echo $ac_prog| sed \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test \"$with_gnu_ld\" = yes; then\n  AC_MSG_CHECKING([for GNU ld])\nelse\n  AC_MSG_CHECKING([for non-GNU ld])\nfi\nAC_CACHE_VAL(acl_cv_path_LD,\n[if test -z \"$LD\"; then\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\"${IFS}${PATH_SEPARATOR-:}\"\n  for ac_dir in $PATH; do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      acl_cv_path_LD=\"$ac_dir/$ac_prog\"\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some GNU ld's only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$acl_cv_path_LD\" -v 2>&1 < /dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest \"$with_gnu_ld\" != no && break ;;\n      *)\n\ttest \"$with_gnu_ld\" != yes && break ;;\n      esac\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\nelse\n  acl_cv_path_LD=\"$LD\" # Let the user override the test with a path.\nfi])\nLD=\"$acl_cv_path_LD\"\nif test -n \"$LD\"; then\n  AC_MSG_RESULT($LD)\nelse\n  AC_MSG_RESULT(no)\nfi\ntest -z \"$LD\" && AC_MSG_ERROR([no acceptable ld found in \\$PATH])\nAC_LIB_PROG_LD_GNU\n])\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/m4/lib-link.m4",
    "content": "# lib-link.m4 serial 13 (gettext-0.16.2)\ndnl Copyright (C) 2001-2007 Free Software Foundation, Inc.\ndnl This file is free software; the Free Software Foundation\ndnl gives unlimited permission to copy and/or distribute it,\ndnl with or without modifications, as long as this notice is preserved.\n\ndnl From Bruno Haible.\n\nAC_PREREQ(2.54)\n\ndnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and\ndnl the libraries corresponding to explicit and implicit dependencies.\ndnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and\ndnl augments the CPPFLAGS variable.\ndnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname\ndnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.\nAC_DEFUN([AC_LIB_LINKFLAGS],\n[\n  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])\n  AC_REQUIRE([AC_LIB_RPATH])\n  define([Name],[translit([$1],[./-], [___])])\n  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],\n                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])\n  AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [\n    AC_LIB_LINKFLAGS_BODY([$1], [$2])\n    ac_cv_lib[]Name[]_libs=\"$LIB[]NAME\"\n    ac_cv_lib[]Name[]_ltlibs=\"$LTLIB[]NAME\"\n    ac_cv_lib[]Name[]_cppflags=\"$INC[]NAME\"\n    ac_cv_lib[]Name[]_prefix=\"$LIB[]NAME[]_PREFIX\"\n  ])\n  LIB[]NAME=\"$ac_cv_lib[]Name[]_libs\"\n  LTLIB[]NAME=\"$ac_cv_lib[]Name[]_ltlibs\"\n  INC[]NAME=\"$ac_cv_lib[]Name[]_cppflags\"\n  LIB[]NAME[]_PREFIX=\"$ac_cv_lib[]Name[]_prefix\"\n  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)\n  AC_SUBST([LIB]NAME)\n  AC_SUBST([LTLIB]NAME)\n  AC_SUBST([LIB]NAME[_PREFIX])\n  dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the\n  dnl results of this search when this library appears as a dependency.\n  HAVE_LIB[]NAME=yes\n  undefine([Name])\n  undefine([NAME])\n])\n\ndnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)\ndnl searches for libname and the libraries corresponding to explicit and\ndnl implicit dependencies, together with the specified include files and\ndnl the ability to compile and link the specified testcode. If found, it\ndnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and\ndnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and\ndnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs\ndnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.\ndnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname\ndnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.\nAC_DEFUN([AC_LIB_HAVE_LINKFLAGS],\n[\n  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])\n  AC_REQUIRE([AC_LIB_RPATH])\n  define([Name],[translit([$1],[./-], [___])])\n  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],\n                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])\n\n  dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME\n  dnl accordingly.\n  AC_LIB_LINKFLAGS_BODY([$1], [$2])\n\n  dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,\n  dnl because if the user has installed lib[]Name and not disabled its use\n  dnl via --without-lib[]Name-prefix, he wants to use it.\n  ac_save_CPPFLAGS=\"$CPPFLAGS\"\n  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)\n\n  AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [\n    ac_save_LIBS=\"$LIBS\"\n    LIBS=\"$LIBS $LIB[]NAME\"\n    AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])\n    LIBS=\"$ac_save_LIBS\"\n  ])\n  if test \"$ac_cv_lib[]Name\" = yes; then\n    HAVE_LIB[]NAME=yes\n    AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])\n    AC_MSG_CHECKING([how to link with lib[]$1])\n    AC_MSG_RESULT([$LIB[]NAME])\n  else\n    HAVE_LIB[]NAME=no\n    dnl If $LIB[]NAME didn't lead to a usable library, we don't need\n    dnl $INC[]NAME either.\n    CPPFLAGS=\"$ac_save_CPPFLAGS\"\n    LIB[]NAME=\n    LTLIB[]NAME=\n    LIB[]NAME[]_PREFIX=\n  fi\n  AC_SUBST([HAVE_LIB]NAME)\n  AC_SUBST([LIB]NAME)\n  AC_SUBST([LTLIB]NAME)\n  AC_SUBST([LIB]NAME[_PREFIX])\n  undefine([Name])\n  undefine([NAME])\n])\n\ndnl Determine the platform dependent parameters needed to use rpath:\ndnl   acl_libext,\ndnl   acl_shlibext,\ndnl   acl_hardcode_libdir_flag_spec,\ndnl   acl_hardcode_libdir_separator,\ndnl   acl_hardcode_direct,\ndnl   acl_hardcode_minus_L.\nAC_DEFUN([AC_LIB_RPATH],\n[\n  dnl Tell automake >= 1.10 to complain if config.rpath is missing.\n  m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])\n  AC_REQUIRE([AC_PROG_CC])                dnl we use $CC, $GCC, $LDFLAGS\n  AC_REQUIRE([AC_LIB_PROG_LD])            dnl we use $LD, $with_gnu_ld\n  AC_REQUIRE([AC_CANONICAL_HOST])         dnl we use $host\n  AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir\n  AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [\n    CC=\"$CC\" GCC=\"$GCC\" LDFLAGS=\"$LDFLAGS\" LD=\"$LD\" with_gnu_ld=\"$with_gnu_ld\" \\\n    ${CONFIG_SHELL-/bin/sh} \"$ac_aux_dir/config.rpath\" \"$host\" > conftest.sh\n    . ./conftest.sh\n    rm -f ./conftest.sh\n    acl_cv_rpath=done\n  ])\n  wl=\"$acl_cv_wl\"\n  acl_libext=\"$acl_cv_libext\"\n  acl_shlibext=\"$acl_cv_shlibext\"\n  acl_libname_spec=\"$acl_cv_libname_spec\"\n  acl_library_names_spec=\"$acl_cv_library_names_spec\"\n  acl_hardcode_libdir_flag_spec=\"$acl_cv_hardcode_libdir_flag_spec\"\n  acl_hardcode_libdir_separator=\"$acl_cv_hardcode_libdir_separator\"\n  acl_hardcode_direct=\"$acl_cv_hardcode_direct\"\n  acl_hardcode_minus_L=\"$acl_cv_hardcode_minus_L\"\n  dnl Determine whether the user wants rpath handling at all.\n  AC_ARG_ENABLE(rpath,\n    [  --disable-rpath         do not hardcode runtime library paths],\n    :, enable_rpath=yes)\n])\n\ndnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and\ndnl the libraries corresponding to explicit and implicit dependencies.\ndnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.\ndnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found\ndnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.\nAC_DEFUN([AC_LIB_LINKFLAGS_BODY],\n[\n  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])\n  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],\n                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])\n  dnl Autoconf >= 2.61 supports dots in --with options.\n  define([N_A_M_E],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit([$1],[.],[_])],[$1])])\n  dnl By default, look in $includedir and $libdir.\n  use_additional=yes\n  AC_LIB_WITH_FINAL_PREFIX([\n    eval additional_includedir=\\\"$includedir\\\"\n    eval additional_libdir=\\\"$libdir\\\"\n  ])\n  AC_LIB_ARG_WITH([lib]N_A_M_E[-prefix],\n[  --with-lib]N_A_M_E[-prefix[=DIR]  search for lib$1 in DIR/include and DIR/lib\n  --without-lib]N_A_M_E[-prefix     don't search for lib$1 in includedir and libdir],\n[\n    if test \"X$withval\" = \"Xno\"; then\n      use_additional=no\n    else\n      if test \"X$withval\" = \"X\"; then\n        AC_LIB_WITH_FINAL_PREFIX([\n          eval additional_includedir=\\\"$includedir\\\"\n          eval additional_libdir=\\\"$libdir\\\"\n        ])\n      else\n        additional_includedir=\"$withval/include\"\n        additional_libdir=\"$withval/$acl_libdirstem\"\n      fi\n    fi\n])\n  dnl Search the library and its dependencies in $additional_libdir and\n  dnl $LDFLAGS. Using breadth-first-seach.\n  LIB[]NAME=\n  LTLIB[]NAME=\n  INC[]NAME=\n  LIB[]NAME[]_PREFIX=\n  rpathdirs=\n  ltrpathdirs=\n  names_already_handled=\n  names_next_round='$1 $2'\n  while test -n \"$names_next_round\"; do\n    names_this_round=\"$names_next_round\"\n    names_next_round=\n    for name in $names_this_round; do\n      already_handled=\n      for n in $names_already_handled; do\n        if test \"$n\" = \"$name\"; then\n          already_handled=yes\n          break\n        fi\n      done\n      if test -z \"$already_handled\"; then\n        names_already_handled=\"$names_already_handled $name\"\n        dnl See if it was already located by an earlier AC_LIB_LINKFLAGS\n        dnl or AC_LIB_HAVE_LINKFLAGS call.\n        uppername=`echo \"$name\" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`\n        eval value=\\\"\\$HAVE_LIB$uppername\\\"\n        if test -n \"$value\"; then\n          if test \"$value\" = yes; then\n            eval value=\\\"\\$LIB$uppername\\\"\n            test -z \"$value\" || LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$value\"\n            eval value=\\\"\\$LTLIB$uppername\\\"\n            test -z \"$value\" || LTLIB[]NAME=\"${LTLIB[]NAME}${LTLIB[]NAME:+ }$value\"\n          else\n            dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined\n            dnl that this library doesn't exist. So just drop it.\n            :\n          fi\n        else\n          dnl Search the library lib$name in $additional_libdir and $LDFLAGS\n          dnl and the already constructed $LIBNAME/$LTLIBNAME.\n          found_dir=\n          found_la=\n          found_so=\n          found_a=\n          eval libname=\\\"$acl_libname_spec\\\"    # typically: libname=lib$name\n          if test -n \"$acl_shlibext\"; then\n            shrext=\".$acl_shlibext\"             # typically: shrext=.so\n          else\n            shrext=\n          fi\n          if test $use_additional = yes; then\n            dir=\"$additional_libdir\"\n            dnl The same code as in the loop below:\n            dnl First look for a shared library.\n            if test -n \"$acl_shlibext\"; then\n              if test -f \"$dir/$libname$shrext\"; then\n                found_dir=\"$dir\"\n                found_so=\"$dir/$libname$shrext\"\n              else\n                if test \"$acl_library_names_spec\" = '$libname$shrext$versuffix'; then\n                  ver=`(cd \"$dir\" && \\\n                        for f in \"$libname$shrext\".*; do echo \"$f\"; done \\\n                        | sed -e \"s,^$libname$shrext\\\\\\\\.,,\" \\\n                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \\\n                        | sed 1q ) 2>/dev/null`\n                  if test -n \"$ver\" && test -f \"$dir/$libname$shrext.$ver\"; then\n                    found_dir=\"$dir\"\n                    found_so=\"$dir/$libname$shrext.$ver\"\n                  fi\n                else\n                  eval library_names=\\\"$acl_library_names_spec\\\"\n                  for f in $library_names; do\n                    if test -f \"$dir/$f\"; then\n                      found_dir=\"$dir\"\n                      found_so=\"$dir/$f\"\n                      break\n                    fi\n                  done\n                fi\n              fi\n            fi\n            dnl Then look for a static library.\n            if test \"X$found_dir\" = \"X\"; then\n              if test -f \"$dir/$libname.$acl_libext\"; then\n                found_dir=\"$dir\"\n                found_a=\"$dir/$libname.$acl_libext\"\n              fi\n            fi\n            if test \"X$found_dir\" != \"X\"; then\n              if test -f \"$dir/$libname.la\"; then\n                found_la=\"$dir/$libname.la\"\n              fi\n            fi\n          fi\n          if test \"X$found_dir\" = \"X\"; then\n            for x in $LDFLAGS $LTLIB[]NAME; do\n              AC_LIB_WITH_FINAL_PREFIX([eval x=\\\"$x\\\"])\n              case \"$x\" in\n                -L*)\n                  dir=`echo \"X$x\" | sed -e 's/^X-L//'`\n                  dnl First look for a shared library.\n                  if test -n \"$acl_shlibext\"; then\n                    if test -f \"$dir/$libname$shrext\"; then\n                      found_dir=\"$dir\"\n                      found_so=\"$dir/$libname$shrext\"\n                    else\n                      if test \"$acl_library_names_spec\" = '$libname$shrext$versuffix'; then\n                        ver=`(cd \"$dir\" && \\\n                              for f in \"$libname$shrext\".*; do echo \"$f\"; done \\\n                              | sed -e \"s,^$libname$shrext\\\\\\\\.,,\" \\\n                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \\\n                              | sed 1q ) 2>/dev/null`\n                        if test -n \"$ver\" && test -f \"$dir/$libname$shrext.$ver\"; then\n                          found_dir=\"$dir\"\n                          found_so=\"$dir/$libname$shrext.$ver\"\n                        fi\n                      else\n                        eval library_names=\\\"$acl_library_names_spec\\\"\n                        for f in $library_names; do\n                          if test -f \"$dir/$f\"; then\n                            found_dir=\"$dir\"\n                            found_so=\"$dir/$f\"\n                            break\n                          fi\n                        done\n                      fi\n                    fi\n                  fi\n                  dnl Then look for a static library.\n                  if test \"X$found_dir\" = \"X\"; then\n                    if test -f \"$dir/$libname.$acl_libext\"; then\n                      found_dir=\"$dir\"\n                      found_a=\"$dir/$libname.$acl_libext\"\n                    fi\n                  fi\n                  if test \"X$found_dir\" != \"X\"; then\n                    if test -f \"$dir/$libname.la\"; then\n                      found_la=\"$dir/$libname.la\"\n                    fi\n                  fi\n                  ;;\n              esac\n              if test \"X$found_dir\" != \"X\"; then\n                break\n              fi\n            done\n          fi\n          if test \"X$found_dir\" != \"X\"; then\n            dnl Found the library.\n            LTLIB[]NAME=\"${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name\"\n            if test \"X$found_so\" != \"X\"; then\n              dnl Linking with a shared library. We attempt to hardcode its\n              dnl directory into the executable's runpath, unless it's the\n              dnl standard /usr/lib.\n              if test \"$enable_rpath\" = no || test \"X$found_dir\" = \"X/usr/$acl_libdirstem\"; then\n                dnl No hardcoding is needed.\n                LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$found_so\"\n              else\n                dnl Use an explicit option to hardcode DIR into the resulting\n                dnl binary.\n                dnl Potentially add DIR to ltrpathdirs.\n                dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.\n                haveit=\n                for x in $ltrpathdirs; do\n                  if test \"X$x\" = \"X$found_dir\"; then\n                    haveit=yes\n                    break\n                  fi\n                done\n                if test -z \"$haveit\"; then\n                  ltrpathdirs=\"$ltrpathdirs $found_dir\"\n                fi\n                dnl The hardcoding into $LIBNAME is system dependent.\n                if test \"$acl_hardcode_direct\" = yes; then\n                  dnl Using DIR/libNAME.so during linking hardcodes DIR into the\n                  dnl resulting binary.\n                  LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$found_so\"\n                else\n                  if test -n \"$acl_hardcode_libdir_flag_spec\" && test \"$acl_hardcode_minus_L\" = no; then\n                    dnl Use an explicit option to hardcode DIR into the resulting\n                    dnl binary.\n                    LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$found_so\"\n                    dnl Potentially add DIR to rpathdirs.\n                    dnl The rpathdirs will be appended to $LIBNAME at the end.\n                    haveit=\n                    for x in $rpathdirs; do\n                      if test \"X$x\" = \"X$found_dir\"; then\n                        haveit=yes\n                        break\n                      fi\n                    done\n                    if test -z \"$haveit\"; then\n                      rpathdirs=\"$rpathdirs $found_dir\"\n                    fi\n                  else\n                    dnl Rely on \"-L$found_dir\".\n                    dnl But don't add it if it's already contained in the LDFLAGS\n                    dnl or the already constructed $LIBNAME\n                    haveit=\n                    for x in $LDFLAGS $LIB[]NAME; do\n                      AC_LIB_WITH_FINAL_PREFIX([eval x=\\\"$x\\\"])\n                      if test \"X$x\" = \"X-L$found_dir\"; then\n                        haveit=yes\n                        break\n                      fi\n                    done\n                    if test -z \"$haveit\"; then\n                      LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir\"\n                    fi\n                    if test \"$acl_hardcode_minus_L\" != no; then\n                      dnl FIXME: Not sure whether we should use\n                      dnl \"-L$found_dir -l$name\" or \"-L$found_dir $found_so\"\n                      dnl here.\n                      LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$found_so\"\n                    else\n                      dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH\n                      dnl here, because this doesn't fit in flags passed to the\n                      dnl compiler. So give up. No hardcoding. This affects only\n                      dnl very old systems.\n                      dnl FIXME: Not sure whether we should use\n                      dnl \"-L$found_dir -l$name\" or \"-L$found_dir $found_so\"\n                      dnl here.\n                      LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }-l$name\"\n                    fi\n                  fi\n                fi\n              fi\n            else\n              if test \"X$found_a\" != \"X\"; then\n                dnl Linking with a static library.\n                LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$found_a\"\n              else\n                dnl We shouldn't come here, but anyway it's good to have a\n                dnl fallback.\n                LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name\"\n              fi\n            fi\n            dnl Assume the include files are nearby.\n            additional_includedir=\n            case \"$found_dir\" in\n              */$acl_libdirstem | */$acl_libdirstem/)\n                basedir=`echo \"X$found_dir\" | sed -e 's,^X,,' -e \"s,/$acl_libdirstem/\"'*$,,'`\n                LIB[]NAME[]_PREFIX=\"$basedir\"\n                additional_includedir=\"$basedir/include\"\n                ;;\n            esac\n            if test \"X$additional_includedir\" != \"X\"; then\n              dnl Potentially add $additional_includedir to $INCNAME.\n              dnl But don't add it\n              dnl   1. if it's the standard /usr/include,\n              dnl   2. if it's /usr/local/include and we are using GCC on Linux,\n              dnl   3. if it's already present in $CPPFLAGS or the already\n              dnl      constructed $INCNAME,\n              dnl   4. if it doesn't exist as a directory.\n              if test \"X$additional_includedir\" != \"X/usr/include\"; then\n                haveit=\n                if test \"X$additional_includedir\" = \"X/usr/local/include\"; then\n                  if test -n \"$GCC\"; then\n                    case $host_os in\n                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;\n                    esac\n                  fi\n                fi\n                if test -z \"$haveit\"; then\n                  for x in $CPPFLAGS $INC[]NAME; do\n                    AC_LIB_WITH_FINAL_PREFIX([eval x=\\\"$x\\\"])\n                    if test \"X$x\" = \"X-I$additional_includedir\"; then\n                      haveit=yes\n                      break\n                    fi\n                  done\n                  if test -z \"$haveit\"; then\n                    if test -d \"$additional_includedir\"; then\n                      dnl Really add $additional_includedir to $INCNAME.\n                      INC[]NAME=\"${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir\"\n                    fi\n                  fi\n                fi\n              fi\n            fi\n            dnl Look for dependencies.\n            if test -n \"$found_la\"; then\n              dnl Read the .la file. It defines the variables\n              dnl dlname, library_names, old_library, dependency_libs, current,\n              dnl age, revision, installed, dlopen, dlpreopen, libdir.\n              save_libdir=\"$libdir\"\n              case \"$found_la\" in\n                */* | *\\\\*) . \"$found_la\" ;;\n                *) . \"./$found_la\" ;;\n              esac\n              libdir=\"$save_libdir\"\n              dnl We use only dependency_libs.\n              for dep in $dependency_libs; do\n                case \"$dep\" in\n                  -L*)\n                    additional_libdir=`echo \"X$dep\" | sed -e 's/^X-L//'`\n                    dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.\n                    dnl But don't add it\n                    dnl   1. if it's the standard /usr/lib,\n                    dnl   2. if it's /usr/local/lib and we are using GCC on Linux,\n                    dnl   3. if it's already present in $LDFLAGS or the already\n                    dnl      constructed $LIBNAME,\n                    dnl   4. if it doesn't exist as a directory.\n                    if test \"X$additional_libdir\" != \"X/usr/$acl_libdirstem\"; then\n                      haveit=\n                      if test \"X$additional_libdir\" = \"X/usr/local/$acl_libdirstem\"; then\n                        if test -n \"$GCC\"; then\n                          case $host_os in\n                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;\n                          esac\n                        fi\n                      fi\n                      if test -z \"$haveit\"; then\n                        haveit=\n                        for x in $LDFLAGS $LIB[]NAME; do\n                          AC_LIB_WITH_FINAL_PREFIX([eval x=\\\"$x\\\"])\n                          if test \"X$x\" = \"X-L$additional_libdir\"; then\n                            haveit=yes\n                            break\n                          fi\n                        done\n                        if test -z \"$haveit\"; then\n                          if test -d \"$additional_libdir\"; then\n                            dnl Really add $additional_libdir to $LIBNAME.\n                            LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir\"\n                          fi\n                        fi\n                        haveit=\n                        for x in $LDFLAGS $LTLIB[]NAME; do\n                          AC_LIB_WITH_FINAL_PREFIX([eval x=\\\"$x\\\"])\n                          if test \"X$x\" = \"X-L$additional_libdir\"; then\n                            haveit=yes\n                            break\n                          fi\n                        done\n                        if test -z \"$haveit\"; then\n                          if test -d \"$additional_libdir\"; then\n                            dnl Really add $additional_libdir to $LTLIBNAME.\n                            LTLIB[]NAME=\"${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir\"\n                          fi\n                        fi\n                      fi\n                    fi\n                    ;;\n                  -R*)\n                    dir=`echo \"X$dep\" | sed -e 's/^X-R//'`\n                    if test \"$enable_rpath\" != no; then\n                      dnl Potentially add DIR to rpathdirs.\n                      dnl The rpathdirs will be appended to $LIBNAME at the end.\n                      haveit=\n                      for x in $rpathdirs; do\n                        if test \"X$x\" = \"X$dir\"; then\n                          haveit=yes\n                          break\n                        fi\n                      done\n                      if test -z \"$haveit\"; then\n                        rpathdirs=\"$rpathdirs $dir\"\n                      fi\n                      dnl Potentially add DIR to ltrpathdirs.\n                      dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.\n                      haveit=\n                      for x in $ltrpathdirs; do\n                        if test \"X$x\" = \"X$dir\"; then\n                          haveit=yes\n                          break\n                        fi\n                      done\n                      if test -z \"$haveit\"; then\n                        ltrpathdirs=\"$ltrpathdirs $dir\"\n                      fi\n                    fi\n                    ;;\n                  -l*)\n                    dnl Handle this in the next round.\n                    names_next_round=\"$names_next_round \"`echo \"X$dep\" | sed -e 's/^X-l//'`\n                    ;;\n                  *.la)\n                    dnl Handle this in the next round. Throw away the .la's\n                    dnl directory; it is already contained in a preceding -L\n                    dnl option.\n                    names_next_round=\"$names_next_round \"`echo \"X$dep\" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\\.la$,,'`\n                    ;;\n                  *)\n                    dnl Most likely an immediate library name.\n                    LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$dep\"\n                    LTLIB[]NAME=\"${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep\"\n                    ;;\n                esac\n              done\n            fi\n          else\n            dnl Didn't find the library; assume it is in the system directories\n            dnl known to the linker and runtime loader. (All the system\n            dnl directories known to the linker should also be known to the\n            dnl runtime loader, otherwise the system is severely misconfigured.)\n            LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }-l$name\"\n            LTLIB[]NAME=\"${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name\"\n          fi\n        fi\n      fi\n    done\n  done\n  if test \"X$rpathdirs\" != \"X\"; then\n    if test -n \"$acl_hardcode_libdir_separator\"; then\n      dnl Weird platform: only the last -rpath option counts, the user must\n      dnl pass all path elements in one option. We can arrange that for a\n      dnl single library, but not when more than one $LIBNAMEs are used.\n      alldirs=\n      for found_dir in $rpathdirs; do\n        alldirs=\"${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir\"\n      done\n      dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.\n      acl_save_libdir=\"$libdir\"\n      libdir=\"$alldirs\"\n      eval flag=\\\"$acl_hardcode_libdir_flag_spec\\\"\n      libdir=\"$acl_save_libdir\"\n      LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$flag\"\n    else\n      dnl The -rpath options are cumulative.\n      for found_dir in $rpathdirs; do\n        acl_save_libdir=\"$libdir\"\n        libdir=\"$found_dir\"\n        eval flag=\\\"$acl_hardcode_libdir_flag_spec\\\"\n        libdir=\"$acl_save_libdir\"\n        LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$flag\"\n      done\n    fi\n  fi\n  if test \"X$ltrpathdirs\" != \"X\"; then\n    dnl When using libtool, the option that works for both libraries and\n    dnl executables is -R. The -R options are cumulative.\n    for found_dir in $ltrpathdirs; do\n      LTLIB[]NAME=\"${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir\"\n    done\n  fi\n])\n\ndnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,\ndnl unless already present in VAR.\ndnl Works only for CPPFLAGS, not for LIB* variables because that sometimes\ndnl contains two or three consecutive elements that belong together.\nAC_DEFUN([AC_LIB_APPENDTOVAR],\n[\n  for element in [$2]; do\n    haveit=\n    for x in $[$1]; do\n      AC_LIB_WITH_FINAL_PREFIX([eval x=\\\"$x\\\"])\n      if test \"X$x\" = \"X$element\"; then\n        haveit=yes\n        break\n      fi\n    done\n    if test -z \"$haveit\"; then\n      [$1]=\"${[$1]}${[$1]:+ }$element\"\n    fi\n  done\n])\n\ndnl For those cases where a variable contains several -L and -l options\ndnl referring to unknown libraries and directories, this macro determines the\ndnl necessary additional linker options for the runtime path.\ndnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])\ndnl sets LDADDVAR to linker options needed together with LIBSVALUE.\ndnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,\ndnl otherwise linking without libtool is assumed.\nAC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],\n[\n  AC_REQUIRE([AC_LIB_RPATH])\n  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])\n  $1=\n  if test \"$enable_rpath\" != no; then\n    if test -n \"$acl_hardcode_libdir_flag_spec\" && test \"$acl_hardcode_minus_L\" = no; then\n      dnl Use an explicit option to hardcode directories into the resulting\n      dnl binary.\n      rpathdirs=\n      next=\n      for opt in $2; do\n        if test -n \"$next\"; then\n          dir=\"$next\"\n          dnl No need to hardcode the standard /usr/lib.\n          if test \"X$dir\" != \"X/usr/$acl_libdirstem\"; then\n            rpathdirs=\"$rpathdirs $dir\"\n          fi\n          next=\n        else\n          case $opt in\n            -L) next=yes ;;\n            -L*) dir=`echo \"X$opt\" | sed -e 's,^X-L,,'`\n                 dnl No need to hardcode the standard /usr/lib.\n                 if test \"X$dir\" != \"X/usr/$acl_libdirstem\"; then\n                   rpathdirs=\"$rpathdirs $dir\"\n                 fi\n                 next= ;;\n            *) next= ;;\n          esac\n        fi\n      done\n      if test \"X$rpathdirs\" != \"X\"; then\n        if test -n \"\"$3\"\"; then\n          dnl libtool is used for linking. Use -R options.\n          for dir in $rpathdirs; do\n            $1=\"${$1}${$1:+ }-R$dir\"\n          done\n        else\n          dnl The linker is used for linking directly.\n          if test -n \"$acl_hardcode_libdir_separator\"; then\n            dnl Weird platform: only the last -rpath option counts, the user\n            dnl must pass all path elements in one option.\n            alldirs=\n            for dir in $rpathdirs; do\n              alldirs=\"${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir\"\n            done\n            acl_save_libdir=\"$libdir\"\n            libdir=\"$alldirs\"\n            eval flag=\\\"$acl_hardcode_libdir_flag_spec\\\"\n            libdir=\"$acl_save_libdir\"\n            $1=\"$flag\"\n          else\n            dnl The -rpath options are cumulative.\n            for dir in $rpathdirs; do\n              acl_save_libdir=\"$libdir\"\n              libdir=\"$dir\"\n              eval flag=\\\"$acl_hardcode_libdir_flag_spec\\\"\n              libdir=\"$acl_save_libdir\"\n              $1=\"${$1}${$1:+ }$flag\"\n            done\n          fi\n        fi\n      fi\n    fi\n  fi\n  AC_SUBST([$1])\n])\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/m4/lib-prefix.m4",
    "content": "# lib-prefix.m4 serial 5 (gettext-0.15)\ndnl Copyright (C) 2001-2005 Free Software Foundation, Inc.\ndnl This file is free software; the Free Software Foundation\ndnl gives unlimited permission to copy and/or distribute it,\ndnl with or without modifications, as long as this notice is preserved.\n\ndnl From Bruno Haible.\n\ndnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and\ndnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't\ndnl require excessive bracketing.\nifdef([AC_HELP_STRING],\n[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],\n[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])\n\ndnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed\ndnl to access previously installed libraries. The basic assumption is that\ndnl a user will want packages to use other packages he previously installed\ndnl with the same --prefix option.\ndnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate\ndnl libraries, but is otherwise very convenient.\nAC_DEFUN([AC_LIB_PREFIX],\n[\n  AC_BEFORE([$0], [AC_LIB_LINKFLAGS])\n  AC_REQUIRE([AC_PROG_CC])\n  AC_REQUIRE([AC_CANONICAL_HOST])\n  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])\n  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])\n  dnl By default, look in $includedir and $libdir.\n  use_additional=yes\n  AC_LIB_WITH_FINAL_PREFIX([\n    eval additional_includedir=\\\"$includedir\\\"\n    eval additional_libdir=\\\"$libdir\\\"\n  ])\n  AC_LIB_ARG_WITH([lib-prefix],\n[  --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib\n  --without-lib-prefix    don't search for libraries in includedir and libdir],\n[\n    if test \"X$withval\" = \"Xno\"; then\n      use_additional=no\n    else\n      if test \"X$withval\" = \"X\"; then\n        AC_LIB_WITH_FINAL_PREFIX([\n          eval additional_includedir=\\\"$includedir\\\"\n          eval additional_libdir=\\\"$libdir\\\"\n        ])\n      else\n        additional_includedir=\"$withval/include\"\n        additional_libdir=\"$withval/$acl_libdirstem\"\n      fi\n    fi\n])\n  if test $use_additional = yes; then\n    dnl Potentially add $additional_includedir to $CPPFLAGS.\n    dnl But don't add it\n    dnl   1. if it's the standard /usr/include,\n    dnl   2. if it's already present in $CPPFLAGS,\n    dnl   3. if it's /usr/local/include and we are using GCC on Linux,\n    dnl   4. if it doesn't exist as a directory.\n    if test \"X$additional_includedir\" != \"X/usr/include\"; then\n      haveit=\n      for x in $CPPFLAGS; do\n        AC_LIB_WITH_FINAL_PREFIX([eval x=\\\"$x\\\"])\n        if test \"X$x\" = \"X-I$additional_includedir\"; then\n          haveit=yes\n          break\n        fi\n      done\n      if test -z \"$haveit\"; then\n        if test \"X$additional_includedir\" = \"X/usr/local/include\"; then\n          if test -n \"$GCC\"; then\n            case $host_os in\n              linux* | gnu* | k*bsd*-gnu) haveit=yes;;\n            esac\n          fi\n        fi\n        if test -z \"$haveit\"; then\n          if test -d \"$additional_includedir\"; then\n            dnl Really add $additional_includedir to $CPPFLAGS.\n            CPPFLAGS=\"${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir\"\n          fi\n        fi\n      fi\n    fi\n    dnl Potentially add $additional_libdir to $LDFLAGS.\n    dnl But don't add it\n    dnl   1. if it's the standard /usr/lib,\n    dnl   2. if it's already present in $LDFLAGS,\n    dnl   3. if it's /usr/local/lib and we are using GCC on Linux,\n    dnl   4. if it doesn't exist as a directory.\n    if test \"X$additional_libdir\" != \"X/usr/$acl_libdirstem\"; then\n      haveit=\n      for x in $LDFLAGS; do\n        AC_LIB_WITH_FINAL_PREFIX([eval x=\\\"$x\\\"])\n        if test \"X$x\" = \"X-L$additional_libdir\"; then\n          haveit=yes\n          break\n        fi\n      done\n      if test -z \"$haveit\"; then\n        if test \"X$additional_libdir\" = \"X/usr/local/$acl_libdirstem\"; then\n          if test -n \"$GCC\"; then\n            case $host_os in\n              linux*) haveit=yes;;\n            esac\n          fi\n        fi\n        if test -z \"$haveit\"; then\n          if test -d \"$additional_libdir\"; then\n            dnl Really add $additional_libdir to $LDFLAGS.\n            LDFLAGS=\"${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir\"\n          fi\n        fi\n      fi\n    fi\n  fi\n])\n\ndnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,\ndnl acl_final_exec_prefix, containing the values to which $prefix and\ndnl $exec_prefix will expand at the end of the configure script.\nAC_DEFUN([AC_LIB_PREPARE_PREFIX],\n[\n  dnl Unfortunately, prefix and exec_prefix get only finally determined\n  dnl at the end of configure.\n  if test \"X$prefix\" = \"XNONE\"; then\n    acl_final_prefix=\"$ac_default_prefix\"\n  else\n    acl_final_prefix=\"$prefix\"\n  fi\n  if test \"X$exec_prefix\" = \"XNONE\"; then\n    acl_final_exec_prefix='${prefix}'\n  else\n    acl_final_exec_prefix=\"$exec_prefix\"\n  fi\n  acl_save_prefix=\"$prefix\"\n  prefix=\"$acl_final_prefix\"\n  eval acl_final_exec_prefix=\\\"$acl_final_exec_prefix\\\"\n  prefix=\"$acl_save_prefix\"\n])\n\ndnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the\ndnl variables prefix and exec_prefix bound to the values they will have\ndnl at the end of the configure script.\nAC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],\n[\n  acl_save_prefix=\"$prefix\"\n  prefix=\"$acl_final_prefix\"\n  acl_save_exec_prefix=\"$exec_prefix\"\n  exec_prefix=\"$acl_final_exec_prefix\"\n  $1\n  exec_prefix=\"$acl_save_exec_prefix\"\n  prefix=\"$acl_save_prefix\"\n])\n\ndnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing\ndnl the basename of the libdir, either \"lib\" or \"lib64\".\nAC_DEFUN([AC_LIB_PREPARE_MULTILIB],\n[\n  dnl There is no formal standard regarding lib and lib64. The current\n  dnl practice is that on a system supporting 32-bit and 64-bit instruction\n  dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit\n  dnl libraries go under $prefix/lib. We determine the compiler's default\n  dnl mode by looking at the compiler's library search path. If at least\n  dnl of its elements ends in /lib64 or points to a directory whose absolute\n  dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the\n  dnl default, namely \"lib\".\n  acl_libdirstem=lib\n  searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`\n  if test -n \"$searchpath\"; then\n    acl_save_IFS=\"${IFS= \t}\"; IFS=\":\"\n    for searchdir in $searchpath; do\n      if test -d \"$searchdir\"; then\n        case \"$searchdir\" in\n          */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;\n          *) searchdir=`cd \"$searchdir\" && pwd`\n             case \"$searchdir\" in\n               */lib64 ) acl_libdirstem=lib64 ;;\n             esac ;;\n        esac\n      fi\n    done\n    IFS=\"$acl_save_IFS\"\n  fi\n])\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/maketgz",
    "content": "#! /bin/sh\n# Script to build release-archives with\n#\n\nversion=$1\n\nif [ -z \"$version\" ]; then\n  echo \"Specify a version number!\"\n  exit\nfi\n\nlibversion=\"$version\"\n\nmajor=`echo $libversion |cut -d. -f1 | sed -e \"s/[^0-9]//g\"`\nminor=`echo $libversion |cut -d. -f2 | sed -e \"s/[^0-9]//g\"`\npatch=`echo $libversion |cut -d. -f3 | cut -d- -f1 | sed -e \"s/[^0-9]//g\"`\n\nnumeric=`perl -e 'printf(\"%02x%02x%02x\\n\", '\"$major, $minor, $patch);\"`\n\nHEADER=include/libssh2.h\n\n# requires a date command that knows -u for UTC time zone\ndatestamp=`date -u`\n\n# Replace version number in header file:\nsed -e 's/^#define LIBSSH2_VERSION .*/#define LIBSSH2_VERSION \"'$libversion'\"/g' \\\n    -e 's/^#define LIBSSH2_VERSION_NUM .*/#define LIBSSH2_VERSION_NUM 0x'$numeric'/g' \\\n    -e 's/^#define LIBSSH2_VERSION_MAJOR .*/#define LIBSSH2_VERSION_MAJOR '$major'/g' \\\n    -e 's/^#define LIBSSH2_VERSION_MINOR .*/#define LIBSSH2_VERSION_MINOR '$minor'/g' \\\n    -e 's/^#define LIBSSH2_VERSION_PATCH .*/#define LIBSSH2_VERSION_PATCH '$patch'/g' \\\n    -e \"s/^#define LIBSSH2_TIMESTAMP .*/#define LIBSSH2_TIMESTAMP \\\"$datestamp\\\"/g\" \\\n $HEADER >$HEADER.dist\n\necho \"libssh2 version $libversion\"\necho \"libssh2 numerical $numeric\"\necho \"datestamp $datestamp\"\n\nfindprog()\n{\n  file=\"$1\"\n  for part in `echo $PATH| tr ':' ' '`; do\n    path=\"$part/$file\"\n    if [ -x \"$path\" ]; then\n      # there it is!\n      return 1\n    fi\n  done\n\n  # no such executable\n  return 0\n}\n\n############################################################################\n#\n# automake is needed to run to make a non-GNU Makefile.in if Makefile.am has\n# been modified.\n#\n\nif { findprog automake >/dev/null 2>/dev/null; } then\n  echo \"- Could not find or run automake, I hope you know what you're doing!\"\nelse\n  echo \"Runs automake --include-deps\"\n  automake --include-deps Makefile >/dev/null\nfi\n\n#######################################################################\n#\n# Generate the changelog\n#\necho \"generate NEWS\"\ngit log --pretty=fuller --no-color --date=short --decorate=full -1000 | ./git2news.pl > NEWS.dist\n\n############################################################################\n#\n# Now run make dist to generate a tar.gz archive\n#\n\necho \"make dist\"\ntargz=\"libssh2-$version.tar.gz\"\nmake -s dist VERSION=$version\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/nw/GNUmakefile",
    "content": "#########################################################################\n#\n## Makefile for building libssh2 (NetWare version - gnu make)\n## Use: make [help|all|clean|dev|devclean|dist|distclean|lib|nlm|objclean]\n##\n## Hacked by: Guenter Knauf\n#\n#########################################################################\n\n# Edit the path below to point to the base of your Novell NDK.\nifndef NDKBASE\nNDKBASE\t= c:/novell\nendif\n\n# Edit the path below to point to the base of your Zlib sources.\nifndef ZLIB_PATH\nZLIB_PATH = ../../zlib-1.2.8\nendif\n\n# Edit the path below to point to the base of your OpenSSL package.\nifndef OPENSSL_PATH\nOPENSSL_PATH = ../../openssl-0.9.8zc\nendif\n\n# Edit the path below to point to your Distribution folder.\nifndef DISTDIR\nDISTDIR\t= libssh2-$(LIBSSH2_VERSION_STR)-bin-nw\nendif\nDISTARC\t= $(DISTDIR).zip\n\n# Edit the path below to point to your Development folder.\nifndef DEVLDIR\nDEVLDIR\t= libssh2-$(LIBSSH2_VERSION_STR)-dev-nw\nendif\nDEVLARC\t= $(DEVLDIR).zip\n\n# Edit the vars below to change NLM target settings.\nTARGET\t= libssh2\nVERSION\t= $(LIBSSH2_VERSION)\nCPRIGHT\t= Copyright (c) $(LIBSSH2_COPYRIGHT_STR)\nWWWURL\t= https://www.libssh2.org/\nDESCR\t= libssh2 $(LIBSSH2_VERSION_STR) ($(LIBARCH)) - $(WWWURL)\nMTSAFE\t= YES\nSTACK\t= 64000\nSCREEN\t= none\nEXPORTS\t= @$(TARGET).imp\n\n# Edit the var below to point to your lib architecture.\nifndef LIBARCH\nLIBARCH = LIBC\nendif\n\n# must be equal to DEBUG or NDEBUG\nifndef DB\n\tDB\t= NDEBUG\n\t# DB\t= DEBUG\nendif\n# Optimization: -O<n> or debugging: -g\nifeq ($(DB),NDEBUG)\n\tOPT\t= -O2\n\tOBJDIR\t= release\nelse\n\tOPT\t= -g\n\tOPT\t+= -DLIBSSH2DEBUG\n\tOBJDIR\t= debug\nendif\n\n# The following lines defines your compiler.\nifdef CWFolder\n\tMETROWERKS = $(CWFolder)\nendif\nifdef METROWERKS\n\t# MWCW_PATH = $(subst \\,/,$(METROWERKS))/Novell Support\n\tMWCW_PATH = $(subst \\,/,$(METROWERKS))/Novell Support/Metrowerks Support\n\tCC = mwccnlm\nelse\n\tCC = $(CROSSPREFIX)gcc\nendif\n\n# Here you can find a native Win32 binary of the original awk:\n# http://www.gknw.net/development/prgtools/awk-20100523.zip\nAWK\t= awk\n# If you want to mark the target as MTSAFE you will need a tool for\n# generating the xdc data for the linker; here's a minimal tool:\n# http://www.gknw.net/development/prgtools/mkxdc.zip\nMPKXDC\t= mkxdc\nZIP\t= zip -qzr9\n\n# Platform-dependent helper tool macros\nifeq ($(findstring /sh,$(SHELL)),/sh)\nDEL\t= rm -f $1\nRMDIR\t= rm -fr $1\nMKDIR\t= mkdir -p $1\nCOPY\t= -cp -afv $1 $2\n#COPYR\t= -cp -afr $1/* $2\nCOPYR\t= -rsync -aC $1/* $2\nTOUCH\t= touch $1\nCAT\t= cat\nECHONL\t= echo \"\"\nDL\t= '\nelse\nifeq \"$(OS)\" \"Windows_NT\"\nDEL\t= -del 2>NUL /q /f $(subst /,\\,$1)\nRMDIR\t= -rd 2>NUL /q /s $(subst /,\\,$1)\nelse\nDEL\t= -del 2>NUL $(subst /,\\,$1)\nRMDIR\t= -deltree 2>NUL /y $(subst /,\\,$1)\nendif     \nMKDIR\t= -md 2>NUL $(subst /,\\,$1)\nCOPY\t= -copy 2>NUL /y $(subst /,\\,$1) $(subst /,\\,$2)\nCOPYR\t= -xcopy 2>NUL /q /y /e $(subst /,\\,$1) $(subst /,\\,$2)\nTOUCH\t= copy 2>&1>NUL /b $(subst /,\\,$1) +,,\nCAT\t= type\nECHONL\t= $(ComSpec) /c echo.\nendif\n\n# LIBARCH_U = $(shell $(AWK) 'BEGIN {print toupper(ARGV[1])}' $(LIBARCH))\nLIBARCH_L = $(shell $(AWK) 'BEGIN {print tolower(ARGV[1])}' $(LIBARCH))\n\n# Include the version info retrieved from libssh2.h\n-include $(OBJDIR)/version.inc\n\n# Global flags for all compilers\nCFLAGS\t+= $(OPT) -D$(DB) -DNETWARE -nostdinc\n#CFLAGS\t+= -DHAVE_CONFIG_H\n\nifeq ($(CC),mwccnlm)\nLD\t= mwldnlm\nLDFLAGS\t= -nostdlib $(PRELUDE) $(OBJL) -o $@ -commandfile\nAR\t= mwldnlm\nARFLAGS\t= -nostdlib -type library -o\nLIBEXT\t= lib\nCFLAGS\t+= -msgstyle gcc -gccinc -inline on -opt nointrinsics -proc 586\nCFLAGS\t+= -relax_pointers\n#CFLAGS\t+= -w on\nifeq ($(LIBARCH),LIBC)\n\tPRELUDE = $(SDK_LIBC)/imports/libcpre.o\n\tCFLAGS += -align 4\nelse\n\t# PRELUDE = $(SDK_CLIB)/imports/clibpre.o\n\t# to avoid the __init_* / __deinit_* whoes dont use prelude from NDK\n\tPRELUDE = \"$(MWCW_PATH)/libraries/runtime/prelude.obj\"\n\t# CFLAGS += -include \"$(MWCW_PATH)/headers/nlm_clib_prefix.h\"\n\tCFLAGS += -align 1\nendif\nelse\nLD\t= $(CROSSPREFIX)nlmconv\nLDFLAGS\t= -UT\nAR\t= $(CROSSPREFIX)ar\nARFLAGS\t= -cq\nLIBEXT\t= a\nRANLIB\t= $(CROSSPREFIX)ranlib\nCFLAGS\t+= -m32\nCFLAGS\t+= -fno-builtin -fpcc-struct-return\nCFLAGS\t+= -fno-strict-aliasing\nCFLAGS\t+= -Wall # -pedantic\n#CFLAGS\t+= -Wno-pointer-sign\nifeq ($(LIBARCH),LIBC)\n\tPRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o\nelse\n\t# PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o\n\t# to avoid the __init_* / __deinit_* whoes dont use prelude from NDK\n\t# http://www.gknw.net/development/mk_nlm/gcc_pre.zip\n\tPRELUDE = $(NDK_ROOT)/pre/prelude.o\n\tCFLAGS += -include $(NDKBASE)/nlmconv/genlm.h\nendif\nendif\n\nLDLIBS\t=\n\nNDK_ROOT = $(NDKBASE)/ndk\nSDK_CLIB = $(NDK_ROOT)/nwsdk\nSDK_LIBC = $(NDK_ROOT)/libc\nSNPRINTF = $(NDKBASE)/snprintf\n\nINCLUDES = -I. -I../include\n\nifdef WITH_ZLIB\n\tINCLUDES += -I$(ZLIB_PATH)\nifdef LINK_STATIC\n\tLDLIBS += $(ZLIB_PATH)/nw/$(LIBARCH)/libz.$(LIBEXT)\nelse\n\tMODULES += libz.nlm\n\tIMPORTS += @$(ZLIB_PATH)/nw/$(LIBARCH)/libz.imp\nendif\nendif\nINCLUDES += -I$(OPENSSL_PATH)/outinc_nw_$(LIBARCH_L)\nLDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/ssl.$(LIBEXT)\nLDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/crypto.$(LIBEXT)\nIMPORTS += GetProcessSwitchCount RunningProcess\n\nifeq ($(LIBARCH),LIBC)\n\tINCLUDES += -I$(SDK_LIBC)/include\n\t# INCLUDES += -I$(SDK_LIBC)/include/nks\n\t# INCLUDES += -I$(SDK_LIBC)/include/winsock\n\tCFLAGS += -D_POSIX_SOURCE\nelse\n\tINCLUDES += -I$(SDK_CLIB)/include/nlm\n\t# INCLUDES += -I$(SDK_CLIB)/include/nlm/obsolete\n\t# INCLUDES += -I$(SDK_CLIB)/include\nendif\nCFLAGS\t+= $(INCLUDES)\n\nifeq ($(MTSAFE),YES)\n\tXDCOPT = -n\nendif\nifeq ($(MTSAFE),NO)\n\tXDCOPT = -u\nendif\nifdef XDCOPT\n\tXDCDATA = $(OBJDIR)/$(TARGET).xdc\nendif\n\nvpath %.c . ../src\n\n# only OpenSSL is supported with this build system\nCFLAGS += -DLIBSSH2_OPENSSL\ninclude ../Makefile.OpenSSL.inc\n\n# include Makefile.inc to get CSOURCES define\ninclude ../Makefile.inc\n\nOBJECTS := $(patsubst %.c,%.o,$(CSOURCES))\nifeq ($(LIBARCH),CLIB)\n# CLIB lacks of snprint() function - here's a replacement:\n# https://www.ijs.si/software/snprintf/\nOBJECTS += snprintf.o\nvpath %.c $(SNPRINTF)\nendif\n\nOBJS\t:= $(addprefix $(OBJDIR)/,$(OBJECTS))\nOBJL\t= $(OBJS) $(OBJDIR)/nwlib.o $(LDLIBS)\n\nall: lib nlm\n\nnlm: prebuild $(TARGET).nlm\n\nlib: prebuild $(TARGET).$(LIBEXT)\n\nprebuild: $(OBJDIR) $(OBJDIR)/version.inc libssh2_config.h\n\ntest: all\n\t$(MAKE) -C test\n\n$(OBJDIR)/%.o: %.c\n#\t@echo Compiling $<\n\t$(CC) $(CFLAGS) -c $< -o $@\n\n$(OBJDIR)/version.inc: ../get_ver.awk ../include/libssh2.h $(OBJDIR)\n\t@echo Creating $@\n\t@$(AWK) -f $^ > $@\n\ndist: all $(DISTDIR) $(DISTDIR)/readme.txt\n\t@$(call MKDIR, $(DISTDIR)/bin)\n\t@$(call COPY, ../AUTHORS, $(DISTDIR))\n\t@$(call COPY, ../COPYING, $(DISTDIR))\n\t@$(call COPY, ../INSTALL, $(DISTDIR))\n\t@$(call COPY, ../README, $(DISTDIR))\n\t@$(call COPY, ../RELEASE-NOTES, $(DISTDIR))\n\t@$(call COPY, $(TARGET).nlm, $(DISTDIR)/bin)\n\t@echo Creating $(DISTARC)\n\t@$(ZIP) $(DISTARC) $(DISTDIR)/* < $(DISTDIR)/readme.txt\n\ndev: all $(DEVLDIR) $(DEVLDIR)/readme.txt\n\t@$(call MKDIR, $(DEVLDIR)/bin)\n\t@$(call MKDIR, $(DEVLDIR)/include)\n\t@$(call MKDIR, $(DEVLDIR)/nw)\n\t@$(call COPY, ../AUTHORS, $(DEVLDIR))\n\t@$(call COPY, ../COPYING, $(DEVLDIR))\n\t@$(call COPY, ../INSTALL, $(DEVLDIR))\n\t@$(call COPY, ../README, $(DEVLDIR))\n\t@$(call COPY, ../RELEASE-NOTES, $(DEVLDIR))\n\t@$(call COPY, ../include/*.h, $(DEVLDIR)/include)\n\t@$(call COPY, libssh2_config.h, $(DEVLDIR)/include)\n\t@$(call COPY, $(TARGET).nlm, $(DEVLDIR)/bin)\n\t@$(call COPY, $(TARGET).imp, $(DEVLDIR)/nw)\n\t@$(call COPY, $(TARGET).$(LIBEXT), $(DEVLDIR)/nw)\n\t@echo Creating $(DEVLARC)\n\t@$(ZIP) $(DEVLARC) $(DEVLDIR)/* < $(DEVLDIR)/readme.txt\n\ndistclean: clean\n\t$(call RMDIR, $(DISTDIR))\n\t$(call DEL, $(DISTARC))\n\ndevclean: clean\n\t$(call RMDIR, $(DEVLDIR))\n\t$(call DEL, $(DEVLARC))\n\nobjclean:\n\t$(call RMDIR, $(OBJDIR))\n\ntestclean: clean\n\t$(MAKE) -C test clean\n\nclean: objclean\n\t$(call DEL, libssh2_config.h)\n\t$(call DEL, $(TARGET).*)\n\n$(OBJDIR):\n\t@$(call MKDIR, $@)\n\n$(DISTDIR):\n\t@$(call MKDIR, $@)\n\n$(DEVLDIR):\n\t@$(call MKDIR, $@)\n\n$(TARGET).$(LIBEXT): $(OBJS)\n\t@echo Creating $@\n\t@$(call DEL, $@)\n\t@$(AR) $(ARFLAGS) $@ $^\nifdef RANLIB\n\t@$(RANLIB) $@\nendif\n\n$(TARGET).nlm: $(OBJDIR)/$(TARGET).def $(TARGET).imp $(OBJL) $(XDCDATA)\n\t@echo Linking $@\n\t@$(call DEL, $@)\n\t@$(LD) $(LDFLAGS) $<\n\n$(OBJDIR)/%.xdc: GNUmakefile\n\t@echo Creating $@\n\t@$(MPKXDC) $(XDCOPT) $@\n\n$(OBJDIR)/%.def: GNUmakefile\n\t@echo $(DL)# DEF file for linking with $(LD)$(DL) > $@\n\t@echo $(DL)# Do not edit this file - it is created by make!$(DL) >> $@\n\t@echo $(DL)# All your changes will be lost!!$(DL) >> $@\n\t@echo $(DL)#$(DL) >> $@\n\t@echo $(DL)copyright \"$(CPRIGHT)\"$(DL) >> $@\n\t@echo $(DL)description \"$(DESCR)\"$(DL) >> $@\n\t@echo $(DL)version $(VERSION)$(DL) >> $@\nifdef NLMTYPE\n\t@echo $(DL)type $(NLMTYPE)$(DL) >> $@\nendif\nifdef STACK\n\t@echo $(DL)stack $(STACK)$(DL) >> $@\nendif\nifdef SCREEN\n\t@echo $(DL)screenname \"$(SCREEN)\"$(DL) >> $@\nelse\n\t@echo $(DL)screenname \"DEFAULT\"$(DL) >> $@\nendif\nifeq ($(DB),DEBUG)\n\t@echo $(DL)debug$(DL) >> $@\nendif\n\t@echo $(DL)threadname \"$(TARGET)\"$(DL) >> $@\nifdef XDCDATA\n\t@echo $(DL)xdcdata $(XDCDATA)$(DL) >> $@\nendif\n\t@echo $(DL)flag_on 64$(DL) >> $@\nifeq ($(LIBARCH),CLIB)\n\t@echo $(DL)start _Prelude$(DL) >> $@\n\t@echo $(DL)exit _Stop$(DL) >> $@\n\t@echo $(DL)import @$(SDK_CLIB)/imports/clib.imp$(DL) >> $@\n\t@echo $(DL)import @$(SDK_CLIB)/imports/threads.imp$(DL) >> $@\n\t@echo $(DL)import @$(SDK_CLIB)/imports/nlmlib.imp$(DL) >> $@\n\t@echo $(DL)import @$(SDK_CLIB)/imports/socklib.imp$(DL) >> $@\n\t@echo $(DL)module clib$(DL) >> $@\nelse\n\t@echo $(DL)pseudopreemption$(DL) >> $@\n\t@echo $(DL)start _LibCPrelude$(DL) >> $@\n\t@echo $(DL)exit _LibCPostlude$(DL) >> $@\n\t@echo $(DL)check _LibCCheckUnload$(DL) >> $@\n\t@echo $(DL)import @$(SDK_LIBC)/imports/libc.imp$(DL) >> $@\n\t@echo $(DL)import @$(SDK_LIBC)/imports/netware.imp$(DL) >> $@\n\t@echo $(DL)module libc$(DL) >> $@\nendif\nifdef MODULES\n\t@echo $(DL)module $(MODULES)$(DL) >> $@\nendif\nifdef EXPORTS\n\t@echo $(DL)export $(EXPORTS)$(DL) >> $@\nendif\nifdef IMPORTS\n\t@echo $(DL)import $(IMPORTS)$(DL) >> $@\nendif\nifeq ($(LD),nlmconv)\n\t@echo $(DL)input $(OBJL)$(DL) >> $@\n\t@echo $(DL)input $(PRELUDE)$(DL) >> $@\n\t@echo $(DL)output $(TARGET).nlm$(DL) >> $@\nendif\n\nlibssh2_config.h: GNUmakefile\n\t@echo Creating $@\n\t@echo $(DL)/* $@ for NetWare target.$(DL) > $@\n\t@echo $(DL)** Do not edit this file - it is created by make!$(DL) >> $@\n\t@echo $(DL)** All your changes will be lost!!$(DL) >> $@\n\t@echo $(DL)*/$(DL) >> $@\n\t@echo $(DL)#define VERSION \"$(LIBSSH2_VERSION_STR)\"$(DL) >> $@\n\t@echo $(DL)#define PACKAGE_BUGREPORT \"https://github.com/libssh2/libssh2/issues\"$(DL) >> $@\nifeq ($(LIBARCH),CLIB)\n\t@echo $(DL)#define OS \"i586-pc-clib-NetWare\"$(DL) >> $@\n\t@echo $(DL)#define NETDB_USE_INTERNET 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRICMP 1$(DL) >> $@\n\t@echo $(DL)#define socklen_t int$(DL) >> $@\n\t@echo $(DL)#define sleep(s) delay(1000 * s)$(DL) >> $@\n\t@echo $(DL)#define strcasecmp stricmp$(DL) >> $@\n\t@echo $(DL)#define strncasecmp strnicmp$(DL) >> $@\nelse\n\t@echo $(DL)#define OS \"i586-pc-libc-NetWare\"$(DL) >> $@\n\t@echo $(DL)#define HAVE_DLFCN_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_DLOPEN 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_FTRUNCATE 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_GETTIMEOFDAY 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_INET_PTON 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_INTTYPES_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_LIMITS_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_LONGLONG 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STDINT_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRCASECMP 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRLCAT 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRLCPY 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRTOLL 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SYS_PARAM_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SYS_SELECT_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_TERMIOS_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@\n\t@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@\nifdef ENABLE_IPV6\n\t@echo $(DL)#define ENABLE_IPV6 1$(DL) >> $@\nendif\nendif\n\t@echo $(DL)#define HAVE_ARPA_INET_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_ASSERT_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_CTYPE_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_ERR_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_ERRNO_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_FCNTL_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_FIONBIO 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_GETHOSTBYADDR 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_GETHOSTBYNAME 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_GETPROTOBYNAME 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_GMTIME_R 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_INET_ADDR 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_INET_NTOA 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_LL 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_LOCALTIME_R 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_MALLOC_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_NETINET_IN_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SELECT 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SETJMP_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SIGNAL 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SIGNAL_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SIG_ATOMIC_T 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SOCKET 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STDLIB_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRDUP 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRFTIME 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRING_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRSTR 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRUCT_TIMEVAL 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SYS_IOCTL_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SYS_STAT_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SYS_TIME_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_TIME_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_UNAME 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_UNISTD_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_UTIME 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_UTIME_H 1$(DL) >> $@\n\t@echo $(DL)#define RETSIGTYPE void$(DL) >> $@\n\t@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@\n\t@echo $(DL)#define STDC_HEADERS 1$(DL) >> $@\n\t@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@\n\t@echo $(DL)#define USE_SSLEAY 1$(DL) >> $@\n\t@echo $(DL)#define USE_OPENSSL 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_OPENSSL_SSL_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_OPENSSL_RSA_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_OPENSSL_PEM_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_OPENSSL_ERR_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_OPENSSL_CRYPTO_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_OPENSSL_ENGINE_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_O_NONBLOCK 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_LIBSSL 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_LIBCRYPTO 1$(DL) >> $@\n\t@echo $(DL)#define OPENSSL_NO_KRB5 1$(DL) >> $@\nifdef WITH_ZLIB\n\t@echo $(DL)#define HAVE_ZLIB_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_LIBZ 1$(DL) >> $@\n\t@echo $(DL)#define LIBSSH2_HAVE_ZLIB 1$(DL) >> $@\nendif\nifdef NW_WINSOCK\n\t@echo $(DL)#define HAVE_CLOSESOCKET 1$(DL) >> $@\nelse\n\t@echo $(DL)#define HAVE_SYS_TYPES_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SYS_SOCKET_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SYS_SOCKIO_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_NETDB_H 1$(DL) >> $@\nendif\nifdef OLD_NOVELLSDK\n\t@echo $(DL)#define socklen_t int$(DL) >> $@\nendif\n\t@echo $(DL)#define LIBSSH2_DH_GEX_NEW 1$(DL) >> $@\nifeq ($(DB),DEBUG)\n\t@echo $(DL)#define LIBSSH2_DEBUG_CONNECTION 1$(DL) >> $@\n\t@echo $(DL)#define LIBSSH2_DEBUG_ERRORS 1$(DL) >> $@\n\t@echo $(DL)#define LIBSSH2_DEBUG_KEX 1$(DL) >> $@\n\t@echo $(DL)#define LIBSSH2_DEBUG_PUBLICKEY 1$(DL) >> $@\n\t@echo $(DL)#define LIBSSH2_DEBUG_SCP 1$(DL) >> $@\n\t@echo $(DL)#define LIBSSH2_DEBUG_SFTP 1$(DL) >> $@\n\t@echo $(DL)#define LIBSSH2_DEBUG_TRANSPORT 1$(DL) >> $@\n\t@echo $(DL)#define LIBSSH2_DEBUG_USERAUTH 1$(DL) >> $@\nendif\n\nlibssh2.imp: GNUmakefile\n\t@echo Creating $@\n\t@echo $(DL)# $@ for NetWare target.$(DL) > $@\n\t@echo $(DL)# Do not edit this file - it is created by make!$(DL) >> $@\n\t@echo $(DL)# All your changes will be lost!!$(DL) >> $@\nifeq ($(LIBARCH),CLIB)\n\t@echo $(DL)  (CLIB_LIBSSH2)$(DL) >> $@\nelse\n\t@echo $(DL)  (LIBC_LIBSSH2)$(DL) >> $@\nendif\n\t@echo $(DL)  libssh2_banner_set,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_close,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_direct_tcpip_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_eof,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_flush_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_free,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_get_exit_status,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_open_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_process_startup,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_read_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_request_pty_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_send_eof,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_set_blocking,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_setenv_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_wait_closed,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_wait_eof,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_write_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_exit,$(DL) >> $@\n\t@echo $(DL)  libssh2_hostkey_hash,$(DL) >> $@\n\t@echo $(DL)  libssh2_init,$(DL) >> $@\n\t@echo $(DL)  libssh2_knownhost_add,$(DL) >> $@\n\t@echo $(DL)  libssh2_knownhost_check,$(DL) >> $@\n\t@echo $(DL)  libssh2_knownhost_checkp,$(DL) >> $@\n\t@echo $(DL)  libssh2_knownhost_free,$(DL) >> $@\n\t@echo $(DL)  libssh2_knownhost_init,$(DL) >> $@\n\t@echo $(DL)  libssh2_knownhost_readfile,$(DL) >> $@\n\t@echo $(DL)  libssh2_knownhost_writefile,$(DL) >> $@\n\t@echo $(DL)  libssh2_scp_recv,$(DL) >> $@\n\t@echo $(DL)  libssh2_scp_recv2,$(DL) >> $@\n\t@echo $(DL)  libssh2_scp_send64,$(DL) >> $@\n\t@echo $(DL)  libssh2_scp_send_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_abstract,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_block_directions,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_callback_set,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_disconnect_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_free,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_handshake,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_hostkey,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_init_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_last_errno,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_last_error,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_method_pref,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_methods,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_set_blocking,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_startup,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_close_handle,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_fstat_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_init,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_last_error,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_mkdir_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_open_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_read,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_readdir_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_rename_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_rmdir_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_seek,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_seek64,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_shutdown,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_stat_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_symlink_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_tell,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_unlink_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_write,$(DL) >> $@\n\t@echo $(DL)  libssh2_trace,$(DL) >> $@\n\t@echo $(DL)  libssh2_userauth_authenticated,$(DL) >> $@\n\t@echo $(DL)  libssh2_userauth_keyboard_interactive_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_userauth_list,$(DL) >> $@\n\t@echo $(DL)  libssh2_userauth_password_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_userauth_publickey_fromfile_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_version$(DL) >> $@\n\n$(DISTDIR)/readme.txt: GNUmakefile\n\t@echo Creating $@\n\t@echo $(DL)This is a binary distribution for NetWare platform.$(DL) > $@\n\t@echo $(DL)libssh2 version $(LIBSSH2_VERSION_STR)$(DL) >> $@\n\t@echo $(DL)Please download the complete libssh package for$(DL) >> $@\n\t@echo $(DL)any further documentation:$(DL) >> $@\n\t@echo $(DL)$(WWWURL)$(DL) >> $@\n\n$(DEVLDIR)/readme.txt: GNUmakefile\n\t@echo Creating $@\n\t@echo $(DL)This is a development distribution for NetWare platform.$(DL) > $@\n\t@echo $(DL)libssh2 version $(LIBSSH2_VERSION_STR)$(DL) >> $@\n\t@echo $(DL)Please download the complete libssh2 package for$(DL) >> $@\n\t@echo $(DL)any further documentation:$(DL) >> $@\n\t@echo $(DL)$(WWWURL)$(DL) >> $@\n\nhelp: $(OBJDIR)/version.inc\n\t@echo $(DL)===========================================================$(DL)\nifeq ($(LIBARCH),LIBC)\n\t@echo $(DL)Novell LibC NDK = $(SDK_LIBC)$(DL)\nelse\n\t@echo $(DL)Novell CLib NDK = $(SDK_CLIB)$(DL)\nendif\n\t@echo $(DL)OpenSSL path    = $(OPENSSL_PATH)$(DL)\n\t@echo $(DL)Zlib path       = $(ZLIB_PATH)$(DL)\n\t@echo $(DL)===========================================================$(DL)\n\t@echo $(DL)libssh $(LIBSSH2_VERSION_STR) - available targets are:$(DL)\n\t@echo $(DL)$(MAKE) all$(DL)\n\t@echo $(DL)$(MAKE) nlm$(DL)\n\t@echo $(DL)$(MAKE) lib$(DL)\n\t@echo $(DL)$(MAKE) clean$(DL)\n\t@echo $(DL)$(MAKE) dev$(DL)\n\t@echo $(DL)$(MAKE) devclean$(DL)\n\t@echo $(DL)$(MAKE) dist$(DL)\n\t@echo $(DL)$(MAKE) distclean$(DL)\n\t@echo $(DL)$(MAKE) objclean$(DL)\n\t@echo $(DL)$(MAKE) test$(DL)\n\t@echo $(DL)===========================================================$(DL)\n\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/nw/keepscreen.c",
    "content": "/* Simple _NonAppStop() implementation which can be linked to your \n * NLM in order to keep the screen open when the NLM terminates\n * (the good old clib behaviour).\n * You dont have to call it, its done automatically from LibC.\n *\n * 2004-Aug-11  by Guenter Knauf \n *\n * URL: http://www.gknw.net/development/mk_nlm/\n */\n \n#include <stdio.h>\n#include <screen.h>\n\nvoid _NonAppStop()\n{\n    uint16_t row, col;\n    \n    GetScreenSize(&row, &col);\n    gotorowcol(row-1, 0);\n    /* pressanykey(); */\n    printf(\"<Press any key to close screen> \");\n    getcharacter();\n}\n\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/nw/nwlib.c",
    "content": "/*********************************************************************\n * Universal NetWare library stub.                                   *\n * written by Ulrich Neuman and given to OpenSource copyright-free.  *\n * Extended for CLIB support by Guenter Knauf.                       *\n *********************************************************************/\n\n#ifdef NETWARE /* Novell NetWare */\n\n#include <stdlib.h>\n\n#ifdef __NOVELL_LIBC__\n/* For native LibC-based NLM we need to register as a real lib. */\n#include <errno.h>\n#include <string.h>\n#include <library.h>\n#include <netware.h>\n#include <screen.h>\n#include <nks/thread.h>\n#include <nks/synch.h>\n\ntypedef struct\n{\n  int     _errno;\n  void    *twentybytes;\n} libthreaddata_t;\n\ntypedef struct\n{\n  int         x;\n  int         y;\n  int         z;\n  void        *tenbytes;\n  NXKey_t     perthreadkey;   /* if -1, no key obtained... */\n  NXMutex_t   *lock;\n} libdata_t;\n\nint         gLibId      = -1;\nvoid        *gLibHandle = (void *) NULL;\nrtag_t      gAllocTag   = (rtag_t) NULL;\nNXMutex_t   *gLibLock   = (NXMutex_t *) NULL;\n\n/* internal library function prototypes... */\nint     DisposeLibraryData ( void * );\nvoid    DisposeThreadData ( void * );\nint     GetOrSetUpData ( int id, libdata_t **data, libthreaddata_t **threaddata );\n\n\nint _NonAppStart( void        *NLMHandle,\n                  void        *errorScreen,\n                  const char  *cmdLine,\n                  const char  *loadDirPath,\n                  size_t      uninitializedDataLength,\n                  void        *NLMFileHandle,\n                  int         (*readRoutineP)( int conn,\n                                               void *fileHandle, size_t offset,\n                                               size_t nbytes,\n                                               size_t *bytesRead,\n                                               void *buffer ),\n                  size_t      customDataOffset,\n                  size_t      customDataSize,\n                  int         messageCount,\n                  const char  **messages )\n{\n  NX_LOCK_INFO_ALLOC(liblock, \"Per-Application Data Lock\", 0);\n\n#ifndef __GNUC__\n#pragma unused(cmdLine)\n#pragma unused(loadDirPath)\n#pragma unused(uninitializedDataLength)\n#pragma unused(NLMFileHandle)\n#pragma unused(readRoutineP)\n#pragma unused(customDataOffset)\n#pragma unused(customDataSize)\n#pragma unused(messageCount)\n#pragma unused(messages)\n#endif\n\n/*\n** Here we process our command line, post errors (to the error screen),\n** perform initializations and anything else we need to do before being able\n** to accept calls into us. If we succeed, we return non-zero and the NetWare\n** Loader will leave us up, otherwise we fail to load and get dumped.\n*/\n  gAllocTag = AllocateResourceTag(NLMHandle,\n                   \"<library-name> memory allocations\", AllocSignature);\n\n  if (!gAllocTag) {\n    OutputToScreen(errorScreen, \"Unable to allocate resource tag for \"\n                     \"library memory allocations.\\n\");\n    return -1;\n  }\n\n  gLibId = register_library(DisposeLibraryData);\n\n  if (gLibId < -1) {\n    OutputToScreen(errorScreen, \"Unable to register library with kernel.\\n\");\n    return -1;\n  }\n\n  gLibHandle = NLMHandle;\n\n  gLibLock = NXMutexAlloc(0, 0, &liblock);\n\n  if (!gLibLock) {\n    OutputToScreen(errorScreen, \"Unable to allocate library data lock.\\n\");\n    return -1;\n  }\n\n  return 0;\n}\n\n/*\n** Here we clean up any resources we allocated. Resource tags is a big part\n** of what we created, but NetWare doesn't ask us to free those.\n*/\nvoid _NonAppStop( void )\n{\n  (void) unregister_library(gLibId);\n  NXMutexFree(gLibLock);\n}\n\n/*\n** This function cannot be the first in the file for if the file is linked\n** first, then the check-unload function's offset will be nlmname.nlm+0\n** which is how to tell that there isn't one. When the check function is\n** first in the linked objects, it is ambiguous. For this reason, we will\n** put it inside this file after the stop function.\n**\n** Here we check to see if it's alright to ourselves to be unloaded. If not,\n** we return a non-zero value. Right now, there isn't any reason not to allow\n** it.\n*/\nint _NonAppCheckUnload( void )\n{\n  return 0;\n}\n\nint GetOrSetUpData(int id, libdata_t **appData, libthreaddata_t **threadData)\n{\n  int              err;\n  libdata_t        *app_data;\n  libthreaddata_t  *thread_data;\n  NXKey_t          key;\n  NX_LOCK_INFO_ALLOC(liblock, \"Application Data Lock\", 0);\n\n  err         = 0;\n  thread_data = (libthreaddata_t *) NULL;\n\n/*\n** Attempt to get our data for the application calling us. This is where we\n** store whatever application-specific information we need to carry in support\n** of calling applications.\n*/\n  app_data = (libdata_t *) get_app_data(id);\n\n  if (!app_data) {\n/*\n** This application hasn't called us before; set up application AND per-thread\n** data. Of course, just in case a thread from this same application is calling\n** us simultaneously, we better lock our application data-creation mutex. We\n** also need to recheck for data after we acquire the lock because WE might be\n** that other thread that was too late to create the data and the first thread\n** in will have created it.\n*/\n    NXLock(gLibLock);\n\n    if (!(app_data = (libdata_t *) get_app_data(id))) {\n      app_data = (libdata_t *) malloc(sizeof(libdata_t));\n\n      if (app_data) {\n        memset(app_data, 0, sizeof(libdata_t));\n\n        app_data->tenbytes = malloc(10);\n        app_data->lock     = NXMutexAlloc(0, 0, &liblock);\n\n        if (!app_data->tenbytes || !app_data->lock) {\n          if (app_data->lock)\n            NXMutexFree(app_data->lock);\n\n          free(app_data);\n          app_data = (libdata_t *) NULL;\n          err      = ENOMEM;\n        }\n\n        if (app_data) {\n/*\n** Here we burn in the application data that we were trying to get by calling\n** get_app_data(). Next time we call the first function, we'll get this data\n** we're just now setting. We also go on here to establish the per-thread data\n** for the calling thread, something we'll have to do on each application\n** thread the first time it calls us.\n*/\n          err = set_app_data(gLibId, app_data);\n\n          if (err) {\n            free(app_data);\n            app_data = (libdata_t *) NULL;\n            err      = ENOMEM;\n          }\n          else {\n            /* create key for thread-specific data... */\n            err = NXKeyCreate(DisposeThreadData, (void *) NULL, &key);\n\n            if (err)                /* (no more keys left?) */\n              key = -1;\n\n            app_data->perthreadkey = key;\n          }\n        }\n      }\n    }\n\n    NXUnlock(gLibLock);\n  }\n\n  if (app_data) {\n    key = app_data->perthreadkey;\n\n    if (key != -1 /* couldn't create a key? no thread data */\n        && !(err = NXKeyGetValue(key, (void **) &thread_data))\n        && !thread_data) {\n/*\n** Allocate the per-thread data for the calling thread. Regardless of whether\n** there was already application data or not, this may be the first call by a\n** a new thread. The fact that we allocation 20 bytes on a pointer is not very\n** important, this just helps to demonstrate that we can have arbitrarily\n** complex per-thread data.\n*/\n      thread_data = (libthreaddata_t *) malloc(sizeof(libthreaddata_t));\n\n      if (thread_data) {\n        thread_data->_errno      = 0;\n        thread_data->twentybytes = malloc(20);\n\n        if (!thread_data->twentybytes) {\n          free(thread_data);\n          thread_data = (libthreaddata_t *) NULL;\n          err         = ENOMEM;\n        }\n\n        if ((err = NXKeySetValue(key, thread_data))) {\n          free(thread_data->twentybytes);\n          free(thread_data);\n          thread_data = (libthreaddata_t *) NULL;\n        }\n      }\n    }\n  }\n\n  if (appData)\n    *appData = app_data;\n\n  if (threadData)\n    *threadData = thread_data;\n\n  return err;\n}\n\nint DisposeLibraryData( void *data )\n{\n  if (data) {\n    void *tenbytes = ((libdata_t *) data)->tenbytes;\n\n    if (tenbytes)\n      free(tenbytes);\n\n    free(data);\n  }\n\n  return 0;\n}\n\nvoid DisposeThreadData( void *data )\n{\n  if (data) {\n    void *twentybytes = ((libthreaddata_t *) data)->twentybytes;\n\n    if (twentybytes)\n      free(twentybytes);\n\n    free(data);\n  }\n}\n\n#else /* __NOVELL_LIBC__ */\n/* For native CLib-based NLM seems we can do a bit more simple. */\n#include <nwthread.h>\n\nint main ( void )\n{\n  /* initialize any globals here... */\n\n  /* do this if any global initializing was done\n  SynchronizeStart();\n  */\n  ExitThread (TSR_THREAD, 0);\n  return 0;\n}\n\n#endif /* __NOVELL_LIBC__ */\n\n#endif /* NETWARE */\n\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/nw/test/GNUmakefile",
    "content": "#########################################################################\n#\n## Makefile for building libssh2 (NetWare version - gnu make)\n##\n## Hacked by: Guenter Knauf\n#\n#########################################################################\n\n# Edit the path below to point to the base of your Novell NDK.\nifndef NDKBASE\nNDKBASE\t= c:/novell\nendif\n\n# Edit the path below to point to the base of your Zlib sources.\nifndef ZLIB_PATH\nZLIB_PATH = ../../../zlib-1.2.8\nendif\n\n# Edit the path below to point to the base of your OpenSSL package.\nifndef OPENSSL_PATH\nOPENSSL_PATH = ../../../openssl-0.9.8zc\nendif\n\n# Edit the var below to enable static linking of libssh2 and libz\nLINK_STATIC = 1\n\n# Edit the vars below to change NLM target settings.\nSAMPLES\t= ../../example\nTARGETS := $(filter-out x11.nlm,$(patsubst $(SAMPLES)/%.c,%.nlm,$(strip $(wildcard $(SAMPLES)/*.c))))\nVERSION\t= $(LIBSSH2_VERSION)\nCOPYR   = Copyright (c) $(LIBSSH2_COPYRIGHT_STR)\nWWWURL\t= http://www.libssh2.org/\nDESCR\t= libssh2 $(notdir $(@:.def=)) $(LIBSSH2_VERSION_STR) ($(LIBARCH)) - $(WWWURL)\nMTSAFE\t= YES\nSTACK\t= 64000\nSCREEN\t= NONE\n#SCREEN\t= libssh2 $(notdir $(@:.def=))\n# Comment the line below if you dont want to load protected automatically.\n#LDRING\t= 3\n\n# Edit the var below to point to your lib architecture.\nifndef LIBARCH\nLIBARCH = LIBC\nendif\n\n# must be equal to DEBUG or NDEBUG\nifndef DB\n\tDB\t= NDEBUG\n\t# DB\t= DEBUG\nendif\n# Optimization: -O<n> or debugging: -g\nifeq ($(DB),NDEBUG)\n\tOPT\t= -O2\n\tOBJDIR\t= release\nelse\n\tOPT\t= -g\n\tOPT\t+= -DLIBSSH2DEBUG\n\tOBJDIR\t= debug\nendif\n\n# The following lines defines your compiler.\nifdef CWFolder\n\tMETROWERKS = $(CWFolder)\nendif\nifdef METROWERKS\n\t# MWCW_PATH = $(subst \\,/,$(METROWERKS))/Novell Support\n\tMWCW_PATH = $(subst \\,/,$(METROWERKS))/Novell Support/Metrowerks Support\n\tCC = mwccnlm\nelse\n\tCC = $(CROSSPREFIX)gcc\nendif\n\n# Here you can find a native Win32 binary of the original awk:\n# http://www.gknw.net/development/prgtools/awk-20100523.zip\nAWK\t= awk\n# If you want to mark the target as MTSAFE you will need a tool for\n# generating the xdc data for the linker; here's a minimal tool:\n# http://www.gknw.net/development/prgtools/mkxdc.zip\nMPKXDC\t= mkxdc\n\n# Platform-dependent helper tool macros\nifeq ($(findstring /sh,$(SHELL)),/sh)\nDEL\t= rm -f $1\nRMDIR\t= rm -fr $1\nMKDIR\t= mkdir -p $1\nCOPY\t= -cp -afv $1 $2\n#COPYR\t= -cp -afr $1/* $2\nCOPYR\t= -rsync -aC $1/* $2\nTOUCH\t= touch $1\nCAT\t= cat\nECHONL\t= echo \"\"\nDL\t= '\nelse\nifeq \"$(OS)\" \"Windows_NT\"\nDEL\t= -del 2>NUL /q /f $(subst /,\\,$1)\nRMDIR\t= -rd 2>NUL /q /s $(subst /,\\,$1)\nelse\nDEL\t= -del 2>NUL $(subst /,\\,$1)\nRMDIR\t= -deltree 2>NUL /y $(subst /,\\,$1)\nendif     \nMKDIR\t= -md 2>NUL $(subst /,\\,$1)\nCOPY\t= -copy 2>NUL /y $(subst /,\\,$1) $(subst /,\\,$2)\nCOPYR\t= -xcopy 2>NUL /q /y /e $(subst /,\\,$1) $(subst /,\\,$2)\nTOUCH\t= copy 2>&1>NUL /b $(subst /,\\,$1) +,,\nCAT\t= type\nECHONL\t= $(ComSpec) /c echo.\nendif\n\n# LIBARCH_U = $(shell $(AWK) 'BEGIN {print toupper(ARGV[1])}' $(LIBARCH))\nLIBARCH_L = $(shell $(AWK) 'BEGIN {print tolower(ARGV[1])}' $(LIBARCH))\n\n# Include the version info retrieved from libssh2.h\n-include $(OBJDIR)/version.inc\n\n# Global flags for all compilers\nCFLAGS\t+= $(OPT) -D$(DB) -DNETWARE -nostdinc\n\nifeq ($(CC),mwccnlm)\nLD\t= mwldnlm\nLDFLAGS\t= -nostdlib $(<:.def=.o) $(PRELUDE) $(LDLIBS) -o $@ -commandfile\nAR\t= mwldnlm\nARFLAGS\t= -type library -w nocmdline $(OBJS) -o\nLIBEXT\t= lib\nCFLAGS\t+= -msgstyle gcc -gccinc -inline off -opt nointrinsics -proc 586\nCFLAGS\t+= -relax_pointers\n#CFLAGS\t+= -w on\nifeq ($(LIBARCH),LIBC)\n\tPRELUDE = $(SDK_LIBC)/imports/libcpre.o\n\tCFLAGS += -align 4\nelse\n\t# PRELUDE = $(SDK_CLIB)/imports/clibpre.o\n\t# to avoid the __init_* / __deinit_* whoes dont use prelude from NDK\n\tPRELUDE = \"$(MWCW_PATH)/libraries/runtime/prelude.obj\"\n\t# CFLAGS += -include \"$(MWCW_PATH)/headers/nlm_clib_prefix.h\"\n\tCFLAGS += -align 1\nendif\nelse\nLD\t= nlmconv\nLDFLAGS\t= -UT\nAR\t= ar\nARFLAGS\t= -cq\nLIBEXT\t= a\nCFLAGS\t+= -m32\nCFLAGS\t+= -fno-builtin -fpcc-struct-return\nCFLAGS\t+= -fno-strict-aliasing\nCFLAGS\t+= -Wall # -pedantic\nifeq ($(LIBARCH),LIBC)\n\tPRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o\nelse\n\t# PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o\n        # to avoid the __init_* / __deinit_* whoes dont use prelude from NDK\n        # http://www.gknw.net/development/mk_nlm/gcc_pre.zip\n        PRELUDE = $(NDK_ROOT)/pre/prelude.o\n\tCFLAGS += -include $(NDKBASE)/nlmconv/genlm.h\nendif\nendif\n\nNDK_ROOT = $(NDKBASE)/ndk\nSDK_CLIB = $(NDK_ROOT)/nwsdk\nSDK_LIBC = $(NDK_ROOT)/libc\nSNPRINTF = $(NDKBASE)/snprintf\n\nINCLUDES = -I.. -I../../include\n\nLDLIBS =\n \nifdef LINK_STATIC\n\tLDLIBS += ../libssh2.$(LIBEXT)\nelse\n\tIMPORTS += @../libssh2.imp\n\tMODULES += libssh2.nlm\nendif\n\nINCLUDES += -I$(OPENSSL_PATH)/outinc_nw_$(LIBARCH_L)\nLDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/ssl.$(LIBEXT)\nLDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/crypto.$(LIBEXT)\nIMPORTS += GetProcessSwitchCount RunningProcess\n\nifdef WITH_ZLIB\n\tINCLUDES += -I$(ZLIB_PATH)\nifdef LINK_STATIC\n\tLDLIBS += $(ZLIB_PATH)/nw/$(LIBARCH)/libz.$(LIBEXT)\nelse\n\tMODULES += libz.nlm\n\tIMPORTS += @$(ZLIB_PATH)/nw/$(LIBARCH)/libz.imp\nendif\nendif\n\nifeq ($(LIBARCH),LIBC)\n\tINCLUDES += -I$(SDK_LIBC)/include\n\t# INCLUDES += -I$(SDK_LIBC)/include/nks\n\t# INCLUDES += -I$(SDK_LIBC)/include/winsock\n\tCFLAGS += -D_POSIX_SOURCE\nelse\n\tINCLUDES += -I$(SDK_CLIB)/include/nlm\n\t# INCLUDES += -I$(SDK_CLIB)/include/nlm/obsolete\n\t# INCLUDES += -I$(SDK_CLIB)/include\n\t# CFLAGS += -DNETDB_USE_INTERNET\nendif\nCFLAGS\t+= $(INCLUDES)\n\nifeq ($(MTSAFE),YES)\n\tXDCOPT = -n\nendif\nifeq ($(MTSAFE),NO)\n\tXDCOPT = -u\nendif\n\nvpath %.c $(SAMPLES)\n\n.PRECIOUS: $(OBJDIR)/%.o $(OBJDIR)/%.def $(OBJDIR)/%.xdc\n\n\nall: prebuild $(TARGETS) \n\nprebuild: $(OBJDIR) $(OBJDIR)/version.inc\n\n$(OBJDIR)/%.o: %.c\n#\t@echo Compiling $<\n\t$(CC) $(CFLAGS) -c $< -o $@\n\n$(OBJDIR)/version.inc: ../../get_ver.awk ../../include/libssh2.h $(OBJDIR)\n\t@echo Creating $@\n\t@$(AWK) -f $^ > $@\n\nobjclean:\n\t$(call RMDIR, $(OBJDIR))\n\nclean: objclean\n\t$(foreach f, $(TARGETS), $(call DEL, $(f)))\n\n$(OBJDIR):\n\t@$(call MKDIR, $@)\n\n%.nlm: $(OBJDIR)/%.def $(OBJDIR)/%.o $(OBJDIR)/%.xdc\n\t@echo Linking $@\n\t@$(call DEL, $@)\n\t@$(LD) $(LDFLAGS) $<\n\n$(OBJDIR)/%.xdc: GNUmakefile\n\t@echo Creating $@\n\t@$(MPKXDC) $(XDCOPT) $@\n\n$(OBJDIR)/%.def: GNUmakefile\n\t@echo $(DL)# DEF file for linking with $(LD)$(DL) > $@\n\t@echo $(DL)# Do not edit this file - it is created by make!$(DL) >> $@\n\t@echo $(DL)# All your changes will be lost!!$(DL) >> $@\n\t@echo $(DL)#$(DL) >> $@\n\t@echo $(DL)copyright \"$(COPYR)\"$(DL) >> $@\n\t@echo $(DL)description \"$(DESCR)\"$(DL) >> $@\n\t@echo $(DL)version $(VERSION)$(DL) >> $@\nifdef NLMTYPE\n\t@echo $(DL)type $(NLMTYPE)$(DL) >> $@\nendif\nifdef STACK\n\t@echo $(DL)stack $(STACK)$(DL) >> $@\nendif\nifdef SCREEN\n\t@echo $(DL)screenname \"$(SCREEN)\"$(DL) >> $@\nelse\n\t@echo $(DL)screenname \"DEFAULT\"$(DL) >> $@\nendif\nifeq ($(DB),DEBUG)\n\t@echo $(DL)debug$(DL) >> $@\nendif\n\t@echo $(DL)threadname \"$(notdir $(@:.def=))\"$(DL) >> $@\nifdef XDCOPT\n\t@echo $(DL)xdcdata $(@:.def=.xdc)$(DL) >> $@\nendif\nifeq ($(LDRING),0)\n\t@echo $(DL)flag_on 16$(DL) >> $@\nendif\nifeq ($(LDRING),3)\n\t@echo $(DL)flag_on 512$(DL) >> $@\nendif\nifeq ($(LIBARCH),CLIB)\n\t@echo $(DL)start _Prelude$(DL) >> $@\n\t@echo $(DL)exit _Stop$(DL) >> $@\n\t@echo $(DL)import @$(SDK_CLIB)/imports/clib.imp$(DL) >> $@\n\t@echo $(DL)import @$(SDK_CLIB)/imports/threads.imp$(DL) >> $@\n\t@echo $(DL)import @$(SDK_CLIB)/imports/nlmlib.imp$(DL) >> $@\n\t@echo $(DL)import @$(SDK_CLIB)/imports/socklib.imp$(DL) >> $@\n\t@echo $(DL)module clib$(DL) >> $@\nelse\n\t@echo $(DL)flag_on 64$(DL) >> $@\n\t@echo $(DL)pseudopreemption$(DL) >> $@\n\t@echo $(DL)start _LibCPrelude$(DL) >> $@\n\t@echo $(DL)exit _LibCPostlude$(DL) >> $@\n\t@echo $(DL)check _LibCCheckUnload$(DL) >> $@\n\t@echo $(DL)import @$(SDK_LIBC)/imports/libc.imp$(DL) >> $@\n\t@echo $(DL)import @$(SDK_LIBC)/imports/netware.imp$(DL) >> $@\n\t@echo $(DL)module libc$(DL) >> $@\nendif\nifdef MODULES\n\t@echo $(DL)module $(MODULES)$(DL) >> $@\nendif\nifdef EXPORTS\n\t@echo $(DL)export $(EXPORTS)$(DL) >> $@\nendif\nifdef IMPORTS\n\t@echo $(DL)import $(IMPORTS)$(DL) >> $@\nendif\nifeq ($(LD),nlmconv)\n\t@echo $(DL)input $(@:.def=.o)$(DL) >> $@\n\t@echo $(DL)input $(PRELUDE)$(DL) >> $@\nifdef LDLIBS\n\t@echo $(DL)input $(LDLIBS)$(DL) >> $@\nendif\n\t@echo $(DL)output $(notdir $(@:.def=.nlm))$(DL) >> $@\nendif\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/README400",
    "content": "\nImplementation notes:\n\n  This is a true OS/400 implementation, not a PASE implementation (for PASE,\nuse AIX implementation).\n\nIt uses ASCII as internal character set. This has been accomplished using the\nQADRT library and include files, a C and system procedures ASCII wrapper\nlibrary. See IBM QADRT description for more information.\n  This results in libssh2 being an ASCII library: any function string\nargument is taken/returned in ASCII and a C/C++ calling program built around\nQADRT may use libssh2 functions as on any other platform.\n  QADRT does not define ASCII wrappers for all C/system procedures: an\nadditional module (os400sys.c) define some more of them, that are used by\nlibssh2 and that QADRT left out.\n  Since standard library entry points expect and return ASCII character strings,\nadditional procedures are provided for string transcoding (see below). No\nwrappers to standard procedures are provided: however, nested calls to\ntranscoding procedures may be used.\n\nCrypto API is provided by the IBM QC3 API library. It supports RSA, but not DSA.\n\n\n  Standard compilation environment does support neither autotools nor make;\nin fact, very few common utilities are available. As a consequence, the\nlibssh2_config.h has been coded manually and the compilation scripts are\na set of shell scripts stored in subdirectory os400.\n\n  The test environment is currently not supported on OS/400.\n\n\n\nCompiling on OS/400:\n\n  These instructions target people who knows about OS/400, compiling, IFS and\narchive extraction. Do not ask questions about these subjects if you're not\nfamiliar with.\n\n_ As a prerequisite, QADRT development environment must be installed.\n_ Install the libssh2 sources directory in IFS.\n_ Enter shell (QSH)\n_ Change current directory to the libssh2 sources installation directory\n_ Change current directory to os400\n_ Edit file iniscript.sh. You may want to change tunable configuration\n  parameters, like debug info generation, optimisation level, listing option,\n  target library, zlib availability and location, etc.\n_ Copy any file in the current directory to makelog (i.e.:\n  cp initscript.sh makelog): this is intended to create the makelog file with\n  an ASCII CCSID!\n_ Enter the command \"sh make.sh > makelog 2>&1'\n_ Examine the makelog file to check for compilation errors.\n\n  Leaving file initscript.sh unchanged, this will produce the following OS/400\nobjects:\n_ Library LIBSSH2. All other objects will be stored in this library.\n_ Modules for all libssh2 units.\n_ Binding directory LIBSSH2_A, to be used at calling program link time for\n  statically binding the modules (specify BNDSRVPGM(QADRTTS) when creating a\n  program using LIBSSH2_A. Also give access to the zlib BNDDIR/SRVPGM if\n  libssh2 is compiled with zlib).\n_ Service program LIBSSH2.<soname>, where <soname> is extracted from the\n  src/Makefile.am VERSION variable. To be used at calling program run-time\n  when this program has dynamically bound libssh2 at link time.\n_ Binding directory LIBSSH2. To be used to dynamically bind libssh2 when\n  linking a calling program.\n_ Source file H. It contains all the include members needed to compile a C/C++\n  module using libssh2.\n_ LIBSSH2, SSH2_PKEY, SSH2_SFTP members in file H. These are the C/C++ header\n  files. Original fames have been mangled to fit member name allowed syntax.\n_ Source file LIBSSH2RPG. It contains all the ILE/RPG /INCLUDE members\n  needed to compile an ILE/RPG program calling libssh2 procedures.\n_ LIBSSH2, SSH2_PKEY, SSH2_SFTP members in file LIBSSH2RPG. These are\n  ILE/RPG translations of the corresponding C header files.\n\n\n\nSpecial programming consideration:\n\nQADRT being used, the following points must be considered:\n_ If static binding is used, service program QADRTTS must be linked too.\n_ Likewise, if libssh2 has been compiled with zlib support, access to the\n  zlib objects must be provided at link time.\n_ The EBCDIC CCSID used by QADRT is 37 by default, NOT THE JOB'S CCSID. If\n  another EBCDIC CCSID is required, it must be set via a locale through a call\n  to setlocale_a (QADRT's setlocale() ASCII wrapper) with category LC_ALL or\n  LC_CTYPE, or by setting environment variable QADRT_ENV_LOCALE to the locale\n  object path before executing the program.\n_ Do not use original source include files unless you know what you are doing.\n  Use the installed members instead (in /QSYS.LIB/LIBSSH2.LIB/H.FILE).\n\n\n\nString transcoding support:\n\n  To help passing arbitrarily encoded string arguments and/or receiving string\nvalues from/to the libssh2 API, three non-standard additional procedures are\nprovided. They use a session pointer and a \"string cache\" pointer.\n  Each time a string is transcoded, it is cached in the given cache. It is\nthe responsibility of the caller to release the cache when its associted strings\nare no longer needed. These procedures and the string cache type are defined\nin a new libssh2_ccsid.h header file.\n  To create a string cache, use:\n\n#include <libssh2_ccsid.h>\nlibssh2_string_cache *  cache = NULL;\n\n  To release all strings in a cache, call:\n\nlibssh2_release_string_cache(session, &cache);\n\n  The transcoding procedures are:\n\nchar * libssh2_from_ccsid(LIBSSH2_SESSION *session,\n                          libssh2_string_cache **cache,\n                          unsigned short ccsid,\n                          const char *string, ssize_t inlen,\n                          size_t *outlen);\nchar * libssh2_to_ccsid(LIBSSH2_SESSION *session,\n                        libssh2_string_cache **cache,\n                        unsigned short ccsid,\n                        const char *string, ssize_t inlen,\n                        size_t *outlen);\n\nwhere:\n    session      is a libssh2 session used for memory allocation.\n    cache        is the address of a string cache.\n    ccsid        is the external (i.e.: non libssh2) coded character set id.\n                 65535 means no conversion and 0 means the current job's CCSID.\n    string       is the string to convert.\n    inlen        is the source string length in bytes: set to -1 if\n                 null-terminated.\n    outlen       if not NULL, is the address of a variable that will receive\n                 the transcoded string length upon return.\n\n  libssh2_from_ccsid() transcodes the string from the given CCSID to libssh2\ninternal encoding (UTF-8). It is intended to be used to convert API input\nparameters.\n  libssh2_to_ccsid() transcodes the string from libssh2 internal encoding\n(UTF-8) to the given CCSID. This has been implemented to get standard API\nstring results in a program's native encoding.\n\n  Both these functions return a pointer to the null-terminated converted string,\nor NULL if an error occurred. In addition, the variable pointed by outlen\nreceives the effective byte length of the (cached) translated string, or -1\nin case of error.\n\n\n\nILE/RPG support:\n\n  Since 95% of the OS/400 programmers use ILE/RPG exclusively, a definition\n  /INCLUDE member is provided for this language. To include libssh2\n  definitions in an ILE/RPG module, line\n\n     h bnddir('LIBSSH2/LIBSSH2')\n\nmust figure in the program header, and line\n\n     d/include libssh2/libssh2rpg,libssh2\n\nin the global data section of the module's source code.\nIf required, members ssh2_sftp, ssh2_pkey and ssh2_ccsid may also be included.\n\nFor IFS source compilations, include members are located in directory\n/libssh2/include/libssh2rpg and have their original names retained.\n\nILE/RPG lacks a serious macro preprocessor, thus C macros requiring this\nfeature have not been translated. However, function-like C macros have been\nimplemented as procedures and therefore supported in ILE/RPG.\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/ccsid.c",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* Character encoding wrappers. */\n\n#include \"libssh2_priv.h\"\n#include \"libssh2_ccsid.h\"\n\n#include <qtqiconv.h>\n#include <iconv.h>\n#include <errno.h>\n#include <string.h>\n#include <stdio.h>\n\n\n\n#define CCSID_UTF8      1208\n#define CCSID_UTF16BE   13488\n#define STRING_GRANULE  256\n#define MAX_CHAR_SIZE   4\n\n#define OFFSET_OF(t, f) ((size_t) ((char *) &((t *) 0)->f - (char *) 0))\n\n\nstruct _libssh2_string_cache {\n    libssh2_string_cache *  next;\n    char                    string[1];\n};\n\n\nstatic const QtqCode_T  utf8code = { CCSID_UTF8 };\n\n\nstatic ssize_t\nterminator_size(unsigned short ccsid)\n{\n    QtqCode_T outcode;\n    iconv_t cd;\n    char *inp;\n    char *outp;\n    size_t ilen;\n    size_t olen;\n    char buf[MAX_CHAR_SIZE];\n\n    /* Return the null-terminator size for the given CCSID. */\n\n    /* Fast check usual CCSIDs. */\n    switch (ccsid) {\n    case CCSID_UTF8:\n    case 0:                                 /* Job CCSID is SBCS EBCDIC. */\n        return 1;\n    case CCSID_UTF16BE:\n        return 2;\n    }\n\n    /* Convert an UTF-8 NUL to the target CCSID: use the converted size as\n       result. */\n    memset((void *) &outcode, 0, sizeof outcode);\n    outcode.CCSID = ccsid;\n    cd = QtqIconvOpen(&outcode, (QtqCode_T *) &utf8code);\n    if (cd.return_value == -1)\n        return -1;\n    inp = \"\";\n    ilen = 1;\n    outp = buf;\n    olen = sizeof buf;\n    iconv(cd, &inp, &ilen, &outp, &olen);\n    iconv_close(cd);\n    olen = sizeof buf - olen;\n    return olen? olen: -1;\n}\n\nstatic char *\nconvert_ccsid(LIBSSH2_SESSION *session, libssh2_string_cache **cache,\n              unsigned short outccsid, unsigned short inccsid,\n              const char *instring, ssize_t inlen, size_t *outlen)\n{\n    char *inp;\n    char *outp;\n    size_t olen;\n    size_t ilen;\n    size_t buflen;\n    size_t curlen;\n    ssize_t termsize;\n    int i;\n    char *dst;\n    libssh2_string_cache *outstring;\n    QtqCode_T incode;\n    QtqCode_T outcode;\n    iconv_t cd;\n\n    if (!instring) {\n        if (outlen)\n            *outlen = 0;\n        return NULL;\n    }\n    if (outlen)\n        *outlen = -1;\n    if (!session || !cache)\n        return NULL;\n\n    /* Get terminator size. */\n    termsize = terminator_size(outccsid);\n    if (termsize < 0)\n        return NULL;\n \n    /* Prepare conversion parameters. */\n    memset((void *) &incode, 0, sizeof incode);\n    memset((void *) &outcode, 0, sizeof outcode);\n    incode.CCSID = inccsid;\n    outcode.CCSID = outccsid;\n    curlen = OFFSET_OF(libssh2_string_cache, string);\n    inp = (char *) instring;\n    ilen = inlen;\n    buflen = inlen + curlen;\n    if (inlen < 0) {\n        incode.length_option = 1;\n        buflen = STRING_GRANULE;\n        ilen = 0;\n    }\n\n    /* Allocate output string buffer and open conversion descriptor. */\n    dst = LIBSSH2_ALLOC(session, buflen + termsize);\n    if (!dst)\n        return NULL;\n    cd = QtqIconvOpen(&outcode, &incode);\n    if (cd.return_value == -1) {\n        LIBSSH2_FREE(session, (char *) dst);\n        return NULL;\n    }\n\n    /* Convert string. */\n    for (;;) {\n        outp = dst + curlen;\n        olen = buflen - curlen;\n        i = iconv(cd, &inp, &ilen, &outp, &olen);\n        if (inlen < 0 && olen == buflen - curlen) {\n            /* Special case: converted 0-length (sub)strings do not store the\n               terminator. */\n            if (termsize) {\n                memset(outp, 0, termsize);\n                olen -= termsize;\n            }\n        }\n        curlen = buflen - olen;\n        if (i >= 0 || errno != E2BIG)\n            break;\n        /* Must expand buffer. */\n        buflen += STRING_GRANULE;\n        outp = LIBSSH2_REALLOC(session, dst, buflen + termsize);\n        if (!outp)\n            break;\n        dst = outp;\n    }\n\n    iconv_close(cd);\n\n    /* Check for error. */\n    if (i < 0 || !outp) {\n        LIBSSH2_FREE(session, dst);\n        return NULL;\n    }\n\n    /* Process terminator. */\n    if (inlen < 0)\n        curlen -= termsize;\n    else if (termsize)\n        memset(dst + curlen, 0, termsize);\n\n    /* Shorten buffer if possible. */\n    if (curlen < buflen)\n        dst = LIBSSH2_REALLOC(session, dst, curlen + termsize);\n\n    /* Link to cache. */\n    outstring = (libssh2_string_cache *) dst;\n    outstring->next = *cache;\n    *cache = outstring;\n\n    /* Return length if required. */\n    if (outlen)\n        *outlen = curlen - OFFSET_OF(libssh2_string_cache, string);\n\n    return outstring->string;\n}\n\nLIBSSH2_API char *\nlibssh2_from_ccsid(LIBSSH2_SESSION *session, libssh2_string_cache **cache,\n                   unsigned short ccsid, const char *string, ssize_t inlen,\n                   size_t *outlen)\n{\n    return convert_ccsid(session, cache,\n                         CCSID_UTF8, ccsid, string, inlen, outlen);\n}\n\nLIBSSH2_API char *\nlibssh2_to_ccsid(LIBSSH2_SESSION *session, libssh2_string_cache **cache,\n                 unsigned short ccsid, const char *string, ssize_t inlen,\n                 size_t *outlen)\n{\n    return convert_ccsid(session, cache,\n                         ccsid, CCSID_UTF8, string, inlen, outlen);\n}\n\nLIBSSH2_API void\nlibssh2_release_string_cache(LIBSSH2_SESSION *session,\n                             libssh2_string_cache **cache)\n{\n    libssh2_string_cache *p;\n\n    if (session && cache)\n        while ((p = *cache)) {\n            *cache = p->next;\n            LIBSSH2_FREE(session, (char *) p);\n        }\n}\n\n/* vim: set expandtab ts=4 sw=4: */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/include/alloca.h",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_ALLOCA_H\n#define LIBSSH2_ALLOCA_H\n\n/* alloca() emulation. */\n\n#include <modasa.mih>\n\n#define alloca(n)       _MODASA(n)\n\n#endif\n\n/* vim: set expandtab ts=4 sw=4: */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/include/stdio.h",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_STDIO_H\n#define LIBSSH2_STDIO_H\n\n/*\n *  <stdio.h> wrapper.\n *  Its goal is to redefine snprintf/vsnprintf which are not supported by QADRT.\n */\n\n#include <qadrt.h>\n\n#if __ILEC400_TGTVRM__ >= 710\n# include_next <stdio.h>\n#elif __ILEC400_TGTVRM__ >= 510\n# ifndef __SRCSTMF__\n#  include <QADRT/h/stdio>\n# else\n#  include </QIBM/ProdData/qadrt/include/stdio.h>\n# endif\n#endif\n\nextern int  _libssh2_os400_vsnprintf(char *dst, size_t len,\n                                     const char *fmt, va_list args);\nextern int  _libssh2_os400_snprintf(char *dst, size_t len,\n                                    const char *fmt, ...);\n\n#ifndef LIBSSH2_DISABLE_QADRT_EXT\n# define vsnprintf(dst, len, fmt, args)                                     \\\n                        _libssh2_os400_vsnprintf((dst), (len), (fmt), (args))\n# define snprintf       _libssh2_os400_snprintf\n#endif\n\n#endif\n\n/* vim: set expandtab ts=4 sw=4: */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/include/sys/socket.h",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_SYS_SOCKET_H\n#define LIBSSH2_SYS_SOCKET_H\n\n/*\n *  <sys/socket.h> wrapper.\n *  Redefines connect().\n */\n\n#include <qadrt.h>\n\n#ifndef _QADRT_LT\n# define _QADRT_LT <\n#endif\n#ifndef _QADRT_GT\n# define _QADRT_GT >\n#endif\n\n#ifdef QADRT_SYSINC\n# include _QADRT_LT QADRT_SYSINC/sys/socket.h _QADRT_GT\n#elif __ILEC400_TGTVRM__ >= 710\n# include_next <sys/socket.h>\n#elif !defined(__SRCSTMF__)\n# include <QSYSINC/sys/socket>\n#else\n# include </QIBM/include/sys/socket.h>\n#endif\n\nextern int  _libssh2_os400_connect(int sd,\n                                   struct sockaddr * destaddr, int addrlen);\n\n#ifndef LIBSSH2_DISABLE_QADRT_EXT\n#define connect(sd, addr, len)  _libssh2_os400_connect((sd), (addr), (len))\n#endif\n\n#endif\n\n/* vim: set expandtab ts=4 sw=4: */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/initscript.sh",
    "content": "#!/bin/sh\n\n\nsetenv()\n\n{\n        #       Define and export.\n\n        eval ${1}=\"${2}\"\n        export ${1}\n}\n\n\ncase \"${SCRIPTDIR}\" in\n/*)     ;;\n*)      SCRIPTDIR=\"`pwd`/${SCRIPTDIR}\"\nesac\n\nwhile true\ndo      case \"${SCRIPTDIR}\" in\n        */.)    SCRIPTDIR=\"${SCRIPTDIR%/.}\";;\n        *)      break;;\n        esac\ndone\n\n#  The script directory is supposed to be in $TOPDIR/os400.\n\nTOPDIR=`dirname \"${SCRIPTDIR}\"`\nexport SCRIPTDIR TOPDIR\n\n#  Extract the SONAME from the library makefile.\n\nSONAME=`sed -e '/^VERSION=/!d' -e 's/^.* \\([0-9]*\\):.*$/\\1/' -e 'q'     \\\n                                                < \"${TOPDIR}/src/Makefile.am\"`\nexport SONAME\n\n\n################################################################################\n#\n#                       Tunable configuration parameters.\n#\n################################################################################\n\nsetenv TARGETLIB        'LIBSSH2'               # Target OS/400 program library.\nsetenv STATBNDDIR       'LIBSSH2_A'             # Static binding directory.\nsetenv DYNBNDDIR        'LIBSSH2'               # Dynamic binding directory.\nsetenv SRVPGM           \"LIBSSH2.${SONAME}\"     # Service program.\nsetenv TGTCCSID         '500'                   # Target CCSID of objects.\nsetenv DEBUG            '*ALL'                  # Debug level.\nsetenv OPTIMIZE         '10'                    # Optimisation level\nsetenv OUTPUT           '*NONE'                 # Compilation output option.\nsetenv TGTRLS           'V5R3M0'                # Target OS release.\nsetenv IFSDIR           '/libssh2'              # Installation IFS directory.\n\n#       Define ZLIB availability and locations.\n\nsetenv WITH_ZLIB        0                       # Define to 1 to enable.\nsetenv ZLIB_INCLUDE     '/zlib/include'         # ZLIB include IFS directory.\nsetenv ZLIB_LIB         'ZLIB'                  # ZLIB library.\nsetenv ZLIB_BNDDIR      'ZLIB_A'                # ZLIB binding directory.\n\n\n################################################################################\n\n#       Need to get the version definitions.\n\nLIBSSH2_VERSION=`grep '^#define  *LIBSSH2_VERSION '                     \\\n                        \"${TOPDIR}/include/libssh2.h\"                   |\n                sed 's/.*\"\\(.*\\)\".*/\\1/'`\nLIBSSH2_VERSION_MAJOR=`grep '^#define  *LIBSSH2_VERSION_MAJOR '         \\\n                        \"${TOPDIR}/include/libssh2.h\"                   |\n                sed 's/^#define  *LIBSSH2_VERSION_MAJOR  *\\([^ ]*\\).*/\\1/'`\nLIBSSH2_VERSION_MINOR=`grep '^#define  *LIBSSH2_VERSION_MINOR '         \\\n                        \"${TOPDIR}/include/libssh2.h\"                   |\n                sed 's/^#define  *LIBSSH2_VERSION_MINOR  *\\([^ ]*\\).*/\\1/'`\nLIBSSH2_VERSION_PATCH=`grep '^#define  *LIBSSH2_VERSION_PATCH '         \\\n                        \"${TOPDIR}/include/libssh2.h\"                   |\n                sed 's/^#define  *LIBSSH2_VERSION_PATCH  *\\([^ ]*\\).*/\\1/'`\nLIBSSH2_VERSION_NUM=`grep '^#define  *LIBSSH2_VERSION_NUM '             \\\n                        \"${TOPDIR}/include/libssh2.h\"                   |\n                sed 's/^#define  *LIBSSH2_VERSION_NUM  *0x\\([^ ]*\\).*/\\1/'`\nLIBSSH2_TIMESTAMP=`grep '^#define  *LIBSSH2_TIMESTAMP '                 \\\n                        \"${TOPDIR}/include/libssh2.h\"                   |\n                sed 's/.*\"\\(.*\\)\".*/\\1/'`\nexport LIBSSH2_VERSION\nexport LIBSSH2_VERSION_MAJOR LIBSSH2_VERSION_MINOR LIBSSH2_VERSION_PATCH\nexport LIBSSH2_VERSION_NUM LIBSSH2_TIMESTAMP\n\n################################################################################\n#\n#                       OS/400 specific definitions.\n#\n################################################################################\n\nLIBIFSNAME=\"/QSYS.LIB/${TARGETLIB}.LIB\"\n\n\n################################################################################\n#\n#                               Procedures.\n#\n################################################################################\n\n#       action_needed dest [src]\n#\n#       dest is an object to build\n#       if specified, src is an object on which dest depends.\n#\n#       exit 0 (succeeds) if some action has to be taken, else 1.\n\naction_needed()\n\n{\n        [ ! -e \"${1}\" ] && return 0\n        [ \"${2}\" ] || return 1\n        [ \"${1}\" -ot \"${2}\" ] && return 0\n        return 1\n}\n\n\n#       canonicalize_path path\n#\n#       Return canonicalized path as:\n#       - Absolute\n#       - No . or .. component.\n\ncanonicalize_path()\n\n{\n        if expr \"${1}\" : '^/' > /dev/null\n        then    P=\"${1}\"\n        else    P=\"`pwd`/${1}\"\n        fi\n\n        R=\n        IFSSAVE=\"${IFS}\"\n        IFS=\"/\"\n\n        for C in ${P}\n        do      IFS=\"${IFSSAVE}\"\n                case \"${C}\" in\n                .)      ;;\n                ..)     R=`expr \"${R}\" : '^\\(.*/\\)..*'`\n                        ;;\n                ?*)     R=\"${R}${C}/\"\n                        ;;\n                *)      ;;\n                esac\n        done\n\n        IFS=\"${IFSSAVE}\"\n        echo \"/`expr \"${R}\" : '^\\(.*\\)/'`\"\n}\n\n\n#       make_module module_name source_name [additional_definitions]\n#\n#       Compile source name into ASCII module if needed.\n#       As side effect, append the module name to variable MODULES.\n#       Set LINK to \"YES\" if the module has been compiled.\n\nmake_module()\n\n{\n        MODULES=\"${MODULES} ${1}\"\n        MODIFSNAME=\"${LIBIFSNAME}/${1}.MODULE\"\n        action_needed \"${MODIFSNAME}\" \"${2}\" || return 0;\n        SRCDIR=`dirname \\`canonicalize_path \"${2}\"\\``\n\n        #       #pragma convert has to be in the source file itself, i.e.\n        #               putting it in an include file makes it only active\n        #               for that include file.\n        #       Thus we build a temporary file with the pragma prepended to\n        #               the source file and we compile that temporary file.\n\n        echo \"#line 1 \\\"${2}\\\"\" > __tmpsrcf.c\n        echo \"#pragma convert(819)\" >> __tmpsrcf.c\n        echo \"#line 1\" >> __tmpsrcf.c\n        cat \"${2}\" >> __tmpsrcf.c\n        CMD=\"CRTCMOD MODULE(${TARGETLIB}/${1}) SRCSTMF('__tmpsrcf.c')\"\n#       CMD=\"${CMD} SYSIFCOPT(*IFS64IO) OPTION(*INCDIRFIRST *SHOWINC *SHOWSYS)\"\n        CMD=\"${CMD} SYSIFCOPT(*IFS64IO) OPTION(*INCDIRFIRST)\"\n        CMD=\"${CMD} LOCALETYPE(*LOCALE)\"\n        CMD=\"${CMD} INCDIR('${TOPDIR}/os400/include'\"\n        CMD=\"${CMD} '/QIBM/ProdData/qadrt/include' '${TOPDIR}/include'\"\n        CMD=\"${CMD} '${TOPDIR}/os400' '${SRCDIR}'\"\n\n        if [ \"${WITH_ZLIB}\" != \"0\" ]\n        then    CMD=\"${CMD} '${ZLIB_INCLUDE}'\"\n        fi\n\n        CMD=\"${CMD} ${INCLUDES})\"\n        CMD=\"${CMD} TGTCCSID(${TGTCCSID}) TGTRLS(${TGTRLS})\"\n        CMD=\"${CMD} OUTPUT(${OUTPUT})\"\n        CMD=\"${CMD} OPTIMIZE(${OPTIMIZE})\"\n        CMD=\"${CMD} DBGVIEW(${DEBUG})\"\n\n        DEFINES=\"${3}\"\n\n        if [ \"${WITH_ZLIB}\" != \"0\" ]\n        then    DEFINES=\"${DEFINES} HAVE_LIBZ LIBSSH2_HAVE_ZLIB\"\n        fi\n\n        if [ \"${DEFINES}\" ]\n        then    CMD=\"${CMD} DEFINE(${DEFINES})\"\n        fi\n\n        system \"${CMD}\"\n        rm -f __tmpsrcf.c\n        LINK=YES\n}\n\n\n#       Determine DB2 object name from IFS name.\n\ndb2_name()\n\n{\n        if [ \"${2}\" = 'nomangle' ]\n        then    basename \"${1}\"                                         |\n                tr 'a-z-' 'A-Z_'                                        |\n                sed -e 's/\\..*//;s/^\\(.\\).*\\(.........\\)$/\\1\\2/'\n        else    basename \"${1}\"                                         |\n                tr 'a-z-' 'A-Z_'                                        |\n                sed -e 's/\\..*//;s/^LIBSSH2_/SSH2_/'                    \\\n                    -e 's/^\\(.\\).*\\(.........\\)$/\\1\\2/'                 \\\n                    -e 's/^SPUBLICKEY$/SSH2_PKEY/'\n        fi\n}\n\n\n#       Copy stream replacing version info.\n\nversioned_copy()\n\n{\n        sed -e \"s/@LIBSSH2_VERSION@/${LIBSSH2_VERSION}/g\"               \\\n            -e \"s/@LIBSSH2_VERSION_MAJOR@/${LIBSSH2_VERSION_MAJOR}/g\"   \\\n            -e \"s/@LIBSSH2_VERSION_MINOR@/${LIBSSH2_VERSION_MINOR}/g\"   \\\n            -e \"s/@LIBSSH2_VERSION_PATCH@/${LIBSSH2_VERSION_PATCH}/g\"   \\\n            -e \"s/@LIBSSH2_VERSION_NUM@/${LIBSSH2_VERSION_NUM}/g\"       \\\n            -e \"s/@LIBSSH2_TIMESTAMP@/${LIBSSH2_TIMESTAMP}/g\"\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/libssh2_ccsid.h",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* CCSID conversion support. */\n\n#ifndef LIBSSH2_CCSID_H_\n#define LIBSSH2_CCSID_H_\n\n#include \"libssh2.h\"\n\ntypedef struct _libssh2_string_cache    libssh2_string_cache;\n\n\nLIBSSH2_API char *\nlibssh2_from_ccsid(LIBSSH2_SESSION *session, libssh2_string_cache **cache,\n                   unsigned short ccsid, const char *string, ssize_t inlen,\n                   size_t *outlen);\nLIBSSH2_API char *\nlibssh2_to_ccsid(LIBSSH2_SESSION *session, libssh2_string_cache **cache,\n                 unsigned short ccsid, const char *string, ssize_t inlen,\n                 size_t *outlen);\nLIBSSH2_API void\nlibssh2_release_string_cache(LIBSSH2_SESSION *session,\n                             libssh2_string_cache **cache);\n\n#endif\n\n/* vim: set expandtab ts=4 sw=4: */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/libssh2_config.h",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_CONFIG_H\n#define LIBSSH2_CONFIG_H\n\n/* Define if building universal (internal helper macro) */\n#undef AC_APPLE_UNIVERSAL_BUILD\n\n/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP\n   systems. This function is required for `alloca.c' support on those systems.\n*/\n#undef CRAY_STACKSEG_END\n\n/* Define to 1 if using `alloca.c'. */\n#undef C_ALLOCA\n\n/* Define to 1 if you have `alloca', as a function or macro. */\n#define HAVE_ALLOCA 1\n\n/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix). */\n#define HAVE_ALLOCA_H 1\n\n/* Define to 1 if you have the <arpa/inet.h> header file. */\n#define HAVE_ARPA_INET_H 1\n\n/* Define to 1 if you have the declaration of `SecureZeroMemory', and to 0 if\n   you don't. */\n#undef HAVE_DECL_SECUREZEROMEMORY\n\n/* disabled non-blocking sockets */\n#undef HAVE_DISABLED_NONBLOCKING\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#undef HAVE_DLFCN_H\n\n/* Define to 1 if you have the <errno.h> header file. */\n#define HAVE_ERRNO_H 1\n\n/* Define to 1 if you have the `EVP_aes_128_ctr' function. */\n#undef HAVE_EVP_AES_128_CTR\n\n/* Define to 1 if you have the <fcntl.h> header file. */\n#define HAVE_FCNTL_H 1\n\n/* use FIONBIO for non-blocking sockets */\n#undef HAVE_FIONBIO\n\n/* Define to 1 if you have the `gettimeofday' function. */\n#define HAVE_GETTIMEOFDAY 1\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#define HAVE_INTTYPES_H 1\n\n/* use ioctlsocket() for non-blocking sockets */\n#undef HAVE_IOCTLSOCKET\n\n/* use Ioctlsocket() for non-blocking sockets */\n#undef HAVE_IOCTLSOCKET_CASE\n\n/* Define if you have the bcrypt library. */\n#undef HAVE_LIBBCRYPT\n\n/* Define if you have the crypt32 library. */\n#undef HAVE_LIBCRYPT32\n\n/* Define if you have the gcrypt library. */\n#undef HAVE_LIBGCRYPT\n\n/* Define if you have the ssl library. */\n#undef HAVE_LIBSSL\n\n/* Define if you have the z library. */\n/* #undef HAVE_LIBZ */\n\n/* Define to 1 if the compiler supports the 'long long' data type. */\n#define HAVE_LONGLONG 1\n\n/* Define to 1 if you have the <memory.h> header file. */\n#undef HAVE_MEMORY_H\n\n/* Define to 1 if you have the <netinet/in.h> header file. */\n#define HAVE_NETINET_IN_H 1\n\n/* Define to 1 if you have the <ntdef.h> header file. */\n#undef HAVE_NTDEF_H\n\n/* Define to 1 if you have the <ntstatus.h> header file. */\n#undef HAVE_NTSTATUS_H\n\n/* use O_NONBLOCK for non-blocking sockets */\n#define HAVE_O_NONBLOCK 1\n\n/* Define to 1 if you have the `poll' function. */\n#undef HAVE_POLL\n\n/* Define to 1 if you have the select function. */\n#define HAVE_SELECT 1\n\n/* use SO_NONBLOCK for non-blocking sockets */\n#undef HAVE_SO_NONBLOCK\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#define HAVE_STDINT_H 1\n\n/* Define to 1 if you have the <stdio.h> header file. */\n#define HAVE_STDIO_H 1\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#define HAVE_STDLIB_H 1\n\n/* Define to 1 if you have the <strings.h> header file. */\n#define HAVE_STRINGS_H 1\n\n/* Define to 1 if you have the <string.h> header file. */\n#define HAVE_STRING_H 1\n\n/* Define to 1 if you have the `strtoll' function. */\n#define HAVE_STRTOLL 1\n\n/* Define to 1 if you have the <sys/ioctl.h> header file. */\n#define HAVE_SYS_IOCTL_H 1\n\n/* Define to 1 if you have the <sys/select.h> header file. */\n#undef HAVE_SYS_SELECT_H\n\n/* Define to 1 if you have the <sys/socket.h> header file. */\n#define HAVE_SYS_SOCKET_H 1\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#define HAVE_SYS_STAT_H 1\n\n/* Define to 1 if you have the <sys/time.h> header file. */\n#define HAVE_SYS_TIME_H 1\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#define HAVE_SYS_TYPES_H 1\n\n/* Define to 1 if you have the <sys/uio.h> header file. */\n#define HAVE_SYS_UIO_H 1\n\n/* Define to 1 if you have the <sys/un.h> header file. */\n#define HAVE_SYS_UN_H 1\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#define HAVE_UNISTD_H 1\n\n/* Define to 1 if you have the <windows.h> header file. */\n#undef HAVE_WINDOWS_H\n\n/* Define to 1 if you have the <winsock2.h> header file. */\n#undef HAVE_WINSOCK2_H\n\n/* Define to 1 if you have the <ws2tcpip.h> header file. */\n#undef HAVE_WS2TCPIP_H\n\n/* to make a symbol visible */\n#undef LIBSSH2_API\n\n/* Enable clearing of memory before being freed */\n#define LIBSSH2_CLEAR_MEMORY 1\n\n/* Enable \"none\" cipher -- NOT RECOMMENDED */\n#undef LIBSSH2_CRYPT_NONE\n\n/* Enable newer diffie-hellman-group-exchange-sha1 syntax */\n#define LIBSSH2_DH_GEX_NEW 1\n\n/* Compile in zlib support */\n/* #undef LIBSSH2_HAVE_ZLIB */\n\n/* Use libgcrypt */\n#undef LIBSSH2_LIBGCRYPT\n\n/* Enable \"none\" MAC -- NOT RECOMMENDED */\n#undef LIBSSH2_MAC_NONE\n\n/* Use OpenSSL */\n#undef LIBSSH2_OPENSSL\n\n/* Use Windows CNG */\n#undef LIBSSH2_WINCNG\n\n/* Use OS/400 Qc3 */\n#define LIBSSH2_OS400QC3\n\n/* Define to the sub-directory in which libtool stores uninstalled libraries.\n*/\n#define LT_OBJDIR \".libs/\"\n\n/* Define to 1 if _REENTRANT preprocessor symbol must be defined. */\n#undef NEED_REENTRANT\n\n/* Name of package */\n#define PACKAGE \"libssh2\"\n\n/* Define to the address where bug reports for this package should be sent. */\n#define PACKAGE_BUGREPORT \"libssh2-devel@cool.haxx.se\"\n\n/* Define to the full name of this package. */\n#define PACKAGE_NAME \"libssh2\"\n\n/* Define to the full name and version of this package. */\n#define PACKAGE_STRING \"libssh2 -\"\n\n/* Define to the one symbol short name of this package. */\n#define PACKAGE_TARNAME \"libssh2\"\n\n/* Define to the home page for this package. */\n#define PACKAGE_URL \"\"\n\n/* Define to the version of this package. */\n#define PACKAGE_VERSION \"-\"\n\n/* If using the C implementation of alloca, define if you know the\n   direction of stack growth for your system; otherwise it will be\n   automatically deduced at runtime.\n\tSTACK_DIRECTION > 0 => grows toward higher addresses\n\tSTACK_DIRECTION < 0 => grows toward lower addresses\n\tSTACK_DIRECTION = 0 => direction of growth unknown */\n#undef STACK_DIRECTION\n\n/* Define to 1 if you have the ANSI C header files. */\n#define STDC_HEADERS 1\n\n/* Version number of package */\n#define VERSION \"-\"\n\n/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most\n   significant byte first (like Motorola and SPARC, unlike Intel). */\n#define WORDS_BIGENDIAN 1\n\n/* Enable large inode numbers on Mac OS X 10.5.  */\n#ifndef _DARWIN_USE_64_BIT_INODE\n# define _DARWIN_USE_64_BIT_INODE 1\n#endif\n\n/* Number of bits in a file offset, on hosts where this is settable. */\n#undef _FILE_OFFSET_BITS\n\n/* Define for large files, on AIX-style hosts. */\n#undef _LARGE_FILES\n\n/* Define to empty if `const' does not conform to ANSI C. */\n#undef const\n\n/* Define to `__inline__' or `__inline' if that's what the C compiler\n   calls it, or to nothing if 'inline' is not supported under any name.  */\n#ifndef __cplusplus\n#define inline\n#endif\n\n/* Define to `unsigned int' if <sys/types.h> does not define. */\n#undef size_t\n\n\n#ifndef LIBSSH2_DISABLE_QADRT_EXT\n/* Remap zlib procedures to ASCII versions. */\n#pragma map(inflateInit_, \"_libssh2_os400_inflateInit_\")\n#pragma map(deflateInit_, \"_libssh2_os400_deflateInit_\")\n#endif\n\n#endif\n/* vim: set expandtab ts=4 sw=4: */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/libssh2rpg/libssh2.rpgle.in",
    "content": "      * Copyright (c) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n      * All rights reserved.\n      *\n      * Redistribution and use in source and binary forms,\n      * with or without modification, are permitted provided\n      * that the following conditions are met:\n      *\n      *   Redistributions of source code must retain the above\n      *   copyright notice, this list of conditions and the\n      *   following disclaimer.\n      *\n      *   Redistributions in binary form must reproduce the above\n      *   copyright notice, this list of conditions and the following\n      *   disclaimer in the documentation and/or other materials\n      *   provided with the distribution.\n      *\n      *   Neither the name of the copyright holder nor the names\n      *   of any other contributors may be used to endorse or\n      *   promote products derived from this software without\n      *   specific prior written permission.\n      *\n      * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n      * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n      * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n      * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n      * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n      * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n      * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n      * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n      * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n      * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n      * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n      * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n      * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n      * OF SUCH DAMAGE.\n\n      /if not defined(LIBSSH2_H_)\n      /define LIBSSH2_H_\n\n     d LIBSSH2_COPYRIGHT...\n     d                 c                   '2004-2015 The libssh2 project and +\n     d                                     its contributors.'\n\n      * We use underscore instead of dash when appending DEV in dev versions\n      * just to make the BANNER define (used by src/session.c) be a valid SSH\n      * banner. Release versions have no appended strings and may of course not\n      * have dashes either.\n     d LIBSSH2_VERSION...\n     d                 c                   '@LIBSSH2_VERSION@'\n\n      * The numeric version number is also available \"in parts\" by using these\n      * defines:\n     d LIBSSH2_VERSION_MAJOR...\n     d                 c                   @LIBSSH2_VERSION_MAJOR@\n     d LIBSSH2_VERSION_MINOR...\n     d                 c                   @LIBSSH2_VERSION_MINOR@\n     d LIBSSH2_VERSION_PATCH...\n     d                 c                   @LIBSSH2_VERSION_PATCH@\n\n      * This is the numeric version of the libssh2 version number, meant for\n      * easier parsing and comparions by programs. The LIBSSH2_VERSION_NUM\n      * define will always follow this syntax:\n      *\n      *  X'XXYYZZ'\n      *\n      * Where XX, YY and ZZ are the main version, release and patch numbers in\n      * hexadecimal (using 8 bits each). All three numbers are always\n      * represented using two digits.  1.2 would appear as \"0x010200\" while\n      * version 9.11.7 appears as X'090b07'.\n      *\n      * This 6-digit (24 bits) hexadecimal number does not show pre-release\n      * number, and it is always a greater number in a more recent release. It\n      * makes comparisons with greater than and less than work.\n\n     d LIBSSH2_VERSION_NUM...\n     d                 c                   X'@LIBSSH2_VERSION_NUM@'\n\n      * This is the date and time when the full source package was created. The\n      * timestamp is not stored in the source code repo, as the timestamp is\n      * properly set in the tarballs by the maketgz script.\n      *\n      * The format of the date should follow this template:\n      *\n      * \"Mon Feb 12 11:35:33 UTC 2007\"\n\n     d LIBSSH2_TIMESTAMP...\n     d                 c                   '@LIBSSH2_TIMESTAMP@'\n\n     d libssh2_Cchar   s              3i 0 based(######typedef######)\n     d libssh2_Cuchar  s              3u 0 based(######typedef######)\n     d libssh2_Cshort  s              5i 0 based(######typedef######)\n     d libssh2_Cushort...\n     d                 s              5u 0 based(######typedef######)\n     d libssh2_Cint    s             10i 0 based(######typedef######)\n     d libssh2_CuInt   s             10u 0 based(######typedef######)\n     d libssh2_Clong   s             10i 0 based(######typedef######)\n     d libssh2_Culong  s             10u 0 based(######typedef######)\n     d libssh2_Clonglong...\n     d                 s             20i 0 based(######typedef######)\n     d libssh2_Culonglong...\n     d                 s             20u 0 based(######typedef######)\n     d libssh2_Cenum   s             10i 0 based(######typedef######)\n     d libssh2_Cssize_t...\n     d                 s             10i 0 based(######typedef######)\n     d libssh2_Csize_t...\n     d                 s             10u 0 based(######typedef######)\n     d libssh2_Cfloat  s              4f   based(######typedef######)\n     d libssh2_Cdouble...\n     d                 s              8f   based(######typedef######)\n\n     d libssh2_uint8_t...\n     d                 s              3u 0 based(######typedef######)\n     d libssh2_uint32_t...\n     d                 s             10u 0 based(######typedef######)\n     d libssh2_uint64_t...\n     d                 s             20u 0 based(######typedef######)\n     d libssh2_int64_t...\n     d                 s             20i 0 based(######typedef######)\n\n     d libssh2_socket_t...\n     d                 s             10i 0 based(######typedef######)\n     d LIBSSH2_INVALID_SOCKET...\n     d                 c                   -1\n\n     d libssh2_mode_t  s             10u 0 based(######typedef######)\n     d libssh2_ino_t   s             10u 0 based(######typedef######)\n     d libssh2_uid_t   s             10u 0 based(######typedef######)\n     d libssh2_gid_t   s             10u 0 based(######typedef######)\n     d libssh2_dev_t   s             10u 0 based(######typedef######)\n     d libssh2_off_t   s             20i 0 based(######typedef######)           Use *IFS64IO\n     d libssh2_time_t  s             10i 0 based(######typedef######)\n     d libssh2_nlink_t...\n     d                 s              5u 0 based(######typedef######)\n     d libssh2_qp0l_objtype_t...                                                AS400 object type\n     d                 s             11\n\n     d libssh2_struct_stat_size...\n     d                 s                   based(######typedef######)\n     d                                     like(libssh2_off_t)\n\n     d libssh2_struct_stat...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n     d  st_mode                            like(libssh2_mode_t)                 Mode flags\n     d  st_ino                             like(libssh2_ino_t)                  File serial number\n     d  st_nlink                           like(libssh2_nlink_t)                Number of links\n     d  st_uid                             like(libssh2_uid_t)                  Owner ID\n     d  st_gid                             like(libssh2_gid_t)                  Group ID\n     d  st_size                            like(libssh2_off_t)                  File size\n     d  st_atime                           like(libssh2_time_t)                 Last access time\n     d  st_mtime                           like(libssh2_time_t)                 Last update time\n     d  st_ctime                           like(libssh2_time_t)                 Creation time\n     d  st_dev                             like(libssh2_dev_t)                  File root device\n     d  st_blksize                         like(libssh2_Csize_t)                Block size\n     d  st_allocsize                       like(libssh2_Culong)                 Allocation size\n     d  st_objtype                         like(libssh2_qp0l_objtype_t)         AS400 object type\n     d  st_codepage                        like(libssh2_Cushort)                Object data codepage\n     d                               62                                         Reserved\n     d  st_ino_gen_id                      like(libssh2_Cuint)                  File SN gen. ID\n\n     d LIBSSH2_STRUCT_STAT_SIZE_FORMAT...\n     d                 c                   '%lld'\n\n      * Part of every banner, user specified or not.\n     d LIBSSH2_SSH_BANNER...\n     d                 c                   'SSH-2.0-libssh2_1.6.1_DEV'\n     d LIBSSH2_SSH_DEFAULT_BANNER...\n     d                 c                   'SSH-2.0-libssh2_1.6.1_DEV'\n\n      * Default generate and safe prime sizes for\n      * diffie-hellman-group-exchange-sha1.\n     d LIBSSH2_DH_GEX_MINGROUP...\n     d                 c                   1024\n     d LIBSSH2_DH_GEX_OPTGROUP...\n     d                 c                   1536\n     d LIBSSH2_DH_GEX_MAXGROUP...\n     d                 c                   2048\n\n      * Defaults for pty requests.\n     d LIBSSH2_TERM_WIDTH...\n     d                 c                   80\n     d LIBSSH2_TERM_HEIGHT...\n     d                 c                   24\n     d LIBSSH2_TERM_WIDTH_PX...\n     d                 c                   0\n     d LIBSSH2_TERM_HEIGHT_PX...\n     d                 c                   0\n\n      * 1/4 second.\n     d LIBSSH2_SOCKET_POLL_UDELAY...\n     d                 c                   250000\n      * 0.25 * 120 == 30 seconds.\n     d LIBSSH2_SOCKET_POLL_MAXLOOPS...\n     d                 c                   120\n\n      * Maximum size to allow a payload to compress to, plays it safe by\n      * falling short of spec limits.\n     d LIBSSH2_PACKET_MAXCOMP...\n     d                 c                   32000\n\n      * Maximum size to allow a payload to deccompress to, plays it safe by\n      * allowing more than spec requires.\n     d LIBSSH2_PACKET_MAXDECOMP...\n     d                 c                   40000\n\n      * Maximum size for an inbound compressed payload, plays it safe by\n      * overshooting spec limits.\n     d LIBSSH2_PACKET_MAXPAYLOAD...\n     d                 c                   40000\n\n     d LIBSSH2_USERAUTH_KBDINT_PROMPT...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n     d  text                           *                                        char *\n     d  length                             like(libssh2_Cuint)\n     d  echo                               like(libssh2_Cuchar)\n\n     d LIBSSH2_USERAUTH_KBDINT_RESPONSE...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n     d  text                           *                                        char *\n     d  length                             like(libssh2_Cuint)\n\n      * libssh2_session_callback_set() constants.\n     d LIBSSH2_CALLBACK_IGNORE...\n     d                 c                   0\n     d LIBSSH2_CALLBACK_DEBUG...\n     d                 c                   1\n     d LIBSSH2_CALLBACK_DISCONNECT...\n     d                 c                   2\n     d LIBSSH2_CALLBACK_MACERROR...\n     d                 c                   3\n     d LIBSSH2_CALLBACK_X11...\n     d                 c                   4\n     d LIBSSH2_CALLBACK_SEND...\n     d                 c                   5\n     d LIBSSH2_CALLBACK_RECV...\n     d                 c                   6\n\n      * libssh2_session_method_pref() constants.\n     d LIBSSH2_METHOD_KEX...\n     d                 c                   0\n     d LIBSSH2_METHOD_HOSTKEY...\n     d                 c                   1\n     d LIBSSH2_METHOD_CRYPT_CS...\n     d                 c                   2\n     d LIBSSH2_METHOD_CRYPT_SC...\n     d                 c                   3\n     d LIBSSH2_METHOD_MAC_CS...\n     d                 c                   4\n     d LIBSSH2_METHOD_MAC_SC...\n     d                 c                   5\n     d LIBSSH2_METHOD_COMP_CS...\n     d                 c                   6\n     d LIBSSH2_METHOD_COMP_SC...\n     d                 c                   7\n     d LIBSSH2_METHOD_LANG_CS...\n     d                 c                   8\n     d LIBSSH2_METHOD_LANG_SC...\n     d                 c                   9\n\n      * flags.\n     d LIBSSH2_FLAG_SIGPIPE...\n     d                 c                   X'0001'\n     d LIBSSH2_FLAG_COMPRESS...\n     d                 c                   X'0002'\n\n     d LIBSSH2_POLLFD  ds                  based(######typedef######)\n     d                                     align qualified\n     d  type                               like(libssh2_Cuchar)\n     d  fd                             *                                        Union\n     d   socket                            overlay(fd) like(libssh2_socket_t)\n     d   channel                       *   overlay(fd)                          LIBSSH2_CHANNEL *\n     d   listener                      *   overlay(fd)                          LIBSSH2_LISTENER *\n     d  events                             like(libssh2_Culong)\n     d  revents                            like(libssh2_Culong)\n\n      * Poll FD Descriptor Types.\n     d LIBSSH2_POLLFD_SOCKET...\n     d                 c                   1\n     d LIBSSH2_POLLFD_CHANNEL...\n     d                 c                   2\n     d LIBSSH2_POLLFD_LISTENER...\n     d                 c                   3\n\n      * Poll FD events/revents -- Match sys/poll.h where possible.\n     d LIBSSH2_POLLFD_POLLIN...                                                 Input data ready or\n     d                 c                   X'0001'                              connection available\n     d LIBSSH2_POLLFD_POLLPRI...                                                Prio data ready to\n     d                 c                   X'0002'                              be read. Socket only\n     d LIBSSH2_POLLFD_POLLEXT...                                                Ext data ready to be\n     d                 c                   X'0002'                              read. Channel only\n     d LIBSSH2_POLLFD_POLLOUT...                                                Can may be written:\n     d                 c                   X'0004'                              Socket/Channel\n\n      * revents only.\n     d LIBSSH2_POLLFD_POLLERR...                                                Error Condition:\n     d                 c                   X'0008'                              Socket\n     d LIBSSH2_POLLFD_POLLHUP...                                                HangUp/EOF\n     d                 c                   X'0010'                              Socket\n     d LIBSSH2_POLLFD_SESSION_CLOSED...                                         Session Disconnect\n     d                 c                   X'0010'\n     d LIBSSH2_POLLFD_POLLNVAL...                                               Invalid request\n     d                 c                   X'0020'                              Socket\n     d LIBSSH2_POLLFD_POLLEX...                                                 Exception Condition\n     d                 c                   X'0040'                              Socket/Win32\n     d LIBSSH2_POLLFD_CHANNEL_CLOSED...                                         Channel Disconnect\n     d                 c                   X'0080'\n     d LIBSSH2_POLLFD_LISTENER_CLOSED...                                        Listener Disconnect\n     d                 c                   X'0080'\n\n      /define HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION\n      * Block Direction Types.\n     d LIBSSH2_SESSION_BLOCK_INBOUND...\n     d                 c                   X'0001'\n     d LIBSSH2_SESSION_BLOCK_OUTBOUND...\n     d                 c                   X'0002'\n\n      * Hash Types.\n     d LIBSSH2_HOSTKEY_HASH_MD5...\n     d                 c                   1\n     d LIBSSH2_HOSTKEY_HASH_SHA1...\n     d                 c                   2\n\n      * Hostkey Types.\n     d LIBSSH2_HOSTKEY_TYPE_UNKNOWN...\n     d                 c                   0\n     d LIBSSH2_HOSTKEY_TYPE_RSA...\n     d                 c                   1\n     d LIBSSH2_HOSTKEY_TYPE_DSS...\n     d                 c                   2\n\n      * Disconnect Codes (defined by SSH protocol).\n     d SSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT...\n     d                 c                   1\n     d SSH_DISCONNECT_PROTOCOL_ERROR...\n     d                 c                   2\n     d SSH_DISCONNECT_KEY_EXCHANGE_FAILED...\n     d                 c                   3\n     d SSH_DISCONNECT_RESERVED...\n     d                 c                   4\n     d SSH_DISCONNECT_MAC_ERROR...\n     d                 c                   5\n     d SSH_DISCONNECT_COMPRESSION_ERROR...\n     d                 c                   6\n     d SSH_DISCONNECT_SERVICE_NOT_AVAILABLE...\n     d                 c                   7\n     d SSH_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED...\n     d                 c                   8\n     d SSH_DISCONNECT_HOST_KEY_NOT_VERIFIABLE...\n     d                 c                   9\n     d SSH_DISCONNECT_CONNECTION_LOST...\n     d                 c                   10\n     d SSH_DISCONNECT_BY_APPLICATION...\n     d                 c                   11\n     d SSH_DISCONNECT_TOO_MANY_CONNECTIONS...\n     d                 c                   12\n     d SSH_DISCONNECT_AUTH_CANCELLED_BY_USER...\n     d                 c                   13\n     d SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE...\n     d                 c                   14\n     d SSH_DISCONNECT_ILLEGAL_USER_NAME...\n     d                 c                   15\n\n      * Error Codes (defined by libssh2).\n     d LIBSSH2_ERROR_NONE...\n     d                 c                   0\n\n      * The library once used -1 as a generic error return value on numerous\n      * places through the code, which subsequently was converted to\n      * LIBSSH2_ERROR_SOCKET_NONE uses over time. As this is a generic error\n      * code, the goal is to never ever return this code but instead make sure\n      * that a more accurate and descriptive error code is used.\n     d  LIBSSH2_ERROR_SOCKET_NONE...\n     d                 c                   -1\n\n     d LIBSSH2_ERROR_BANNER_RECV...\n     d                 c                   -2\n     d LIBSSH2_ERROR_BANNER_SEND...\n     d                 c                   -3\n     d LIBSSH2_ERROR_INVALID_MAC...\n     d                 c                   -4\n     d LIBSSH2_ERROR_KEX_FAILURE...\n     d                 c                   -5\n     d LIBSSH2_ERROR_ALLOC...\n     d                 c                   -6\n     d LIBSSH2_ERROR_SOCKET_SEND...\n     d                 c                   -7\n     d LIBSSH2_ERROR_KEY_EXCHANGE_FAILURE...\n     d                 c                   -8\n     d LIBSSH2_ERROR_TIMEOUT...\n     d                 c                   -9\n     d LIBSSH2_ERROR_HOSTKEY_INIT...\n     d                 c                   -10\n     d LIBSSH2_ERROR_HOSTKEY_SIGN...\n     d                 c                   -11\n     d LIBSSH2_ERROR_DECRYPT...\n     d                 c                   -12\n     d LIBSSH2_ERROR_SOCKET_DISCONNECT...\n     d                 c                   -13\n     d LIBSSH2_ERROR_PROTO...\n     d                 c                   -14\n     d LIBSSH2_ERROR_PASSWORD_EXPIRED...\n     d                 c                   -15\n     d LIBSSH2_ERROR_FILE...\n     d                 c                   -16\n     d LIBSSH2_ERROR_METHOD_NONE...\n     d                 c                   -17\n     d LIBSSH2_ERROR_AUTHENTICATION_FAILED...\n     d                 c                   -18\n     d LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED...\n     d                 c                   -18\n     d LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED...\n     d                 c                   -19\n     d LIBSSH2_ERROR_CHANNEL_OUTOFORDER...\n     d                 c                   -20\n     d LIBSSH2_ERROR_CHANNEL_FAILURE...\n     d                 c                   -21\n     d LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED...\n     d                 c                   -22\n     d LIBSSH2_ERROR_CHANNEL_UNKNOWN...\n     d                 c                   -23\n     d LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED...\n     d                 c                   -24\n     d LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED...\n     d                 c                   -25\n     d LIBSSH2_ERROR_CHANNEL_CLOSED...\n     d                 c                   -26\n     d LIBSSH2_ERROR_CHANNEL_EOF_SENT...\n     d                 c                   -27\n     d LIBSSH2_ERROR_SCP_PROTOCOL...\n     d                 c                   -28\n     d LIBSSH2_ERROR_ZLIB...\n     d                 c                   -29\n     d LIBSSH2_ERROR_SOCKET_TIMEOUT...\n     d                 c                   -30\n     d LIBSSH2_ERROR_SFTP_PROTOCOL...\n     d                 c                   -31\n     d LIBSSH2_ERROR_REQUEST_DENIED...\n     d                 c                   -32\n     d LIBSSH2_ERROR_METHOD_NOT_SUPPORTED...\n     d                 c                   -33\n     d LIBSSH2_ERROR_INVAL...\n     d                 c                   -34\n     d LIBSSH2_ERROR_INVALID_POLL_TYPE...\n     d                 c                   -35\n     d LIBSSH2_ERROR_PUBLICKEY_PROTOCOL...\n     d                 c                   -36\n     d LIBSSH2_ERROR_EAGAIN...\n     d                 c                   -37\n     d LIBSSH2_ERROR_BUFFER_TOO_SMALL...\n     d                 c                   -38\n     d LIBSSH2_ERROR_BAD_USE...\n     d                 c                   -39\n     d LIBSSH2_ERROR_COMPRESS...\n     d                 c                   -40\n     d LIBSSH2_ERROR_OUT_OF_BOUNDARY...\n     d                 c                   -41\n     d LIBSSH2_ERROR_AGENT_PROTOCOL...\n     d                 c                   -42\n     d LIBSSH2_ERROR_SOCKET_RECV...\n     d                 c                   -43\n     d LIBSSH2_ERROR_ENCRYPT...\n     d                 c                   -44\n     d LIBSSH2_ERROR_BAD_SOCKET...\n     d                 c                   -45\n     d LIBSSH2_ERROR_KNOWN_HOSTS...\n     d                 c                   -46\n\n      * this is a define to provide the old (<= 1.2.7) name.\n     d LIBSSH2_ERROR_BANNER_NONE...\n     d                 c                   -2\n\n      * Global API.\n     d LIBSSH2_INIT_NO_CRYPTO...\n     d                 c                   X'0001'\n\n      * libssh2_init()\n      *\n      * Initialize the libssh2 functions.  This typically initialize the\n      * crypto library.  It uses a global state, and is not thread safe --\n      * you must make sure this function is not called concurrently.\n      *\n      * Flags can be:\n      * 0:                              Normal initialize\n      * LIBSSH2_INIT_NO_CRYPTO:         Do not initialize the crypto library\n      *                                 (ie. OPENSSL_add_cipher_algorithms() for\n      *                                 OpenSSL)\n      *\n      * Returns 0 if succeeded, or a negative value for error.\n\n     d libssh2_init    pr                  extproc('libssh2_init')\n     d                                     like(libssh2_Cint)\n     d  flags                              value like(libssh2_Cint)\n\n      * libssh2_exit()\n      *\n      * Exit the libssh2 functions and free's all memory used internal.\n\n     d libssh2_exit    pr                  extproc('libssh2_exit')\n\n      * libssh2_free()\n      *\n      * Deallocate memory allocated by earlier call to libssh2 functions.\n\n     d libssh2_free    pr                  extproc('libssh2_free')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  ptr                            *   value                                void *\n\n      * libssh2_session_supported_algs()\n      *\n      * Fills algs with a list of supported cryptographic algorithms. Returns a\n      * non-negative number (number of supported algorithms) on success or a\n      * negative number (an eror code) on failure.\n      *\n      * NOTE: on success, algs must be deallocated (by calling libssh2_free)\n      * when not needed anymore\n\n     d libssh2_session_supported_algs...\n     d                 pr                  extproc(\n     d                                       'libssh2_session_supported_algs')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  method_type                        value like(libssh2_Cint)\n     d  algs                           *                                        const char **(*)\n\n      * Session API.\n     d libssh2_session_init_ex...\n     d                 pr              *   extproc('libssh2_session_init_ex')   LIBSSH2_SESSION *\n     d  my_alloc                       *   value procptr\n     d  my_free                        *   value procptr\n     d  my_realloc                     *   value procptr\n     d  abstract                       *   value                                void *\n\n      * Implementation of C macro.\n     d libssh2_session_init...\n     d                 pr              *   extproc('libssh2_session_init')      LIBSSH2_SESSION *\n\n     d libssh2_session_abstract...\n     d                 pr              *   extproc('libssh2_session_abstract')  void * *\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_session_callback_set...\n     d                 pr              *   extproc(                             void *\n     d                                     'libssh2_session_callback_set')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  cbtype                             value like(libssh2_Cint)\n     d  callback                       *   value                                void *\n\n     d libssh2_session_banner_set...\n     d                 pr                  extproc('libssh2_session_banner_set')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  banner                         *   value options(*string)               const char *\n\n     d libssh2_banner_set...\n     d                 pr                  extproc('libssh2_banner_set')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  banner                         *   value options(*string)               const char *\n\n     d libssh2_session_startup...\n     d                 pr                  extproc('libssh2_session_startup')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  sock                               value like(libssh2_Cint)\n\n     d libssh2_session_handshake...\n     d                 pr                  extproc('libssh2_session_handshake')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  sock                               value like(libssh2_socket_t)\n\n     d libssh2_session_disconnect_ex...\n     d                 pr                  extproc(\n     d                                     'libssh2_session_disconnect_ex')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  reason                             value like(libssh2_Cint)\n     d  description                    *   value options(*string)               const char *\n     d  lang                           *   value options(*string)               const char *\n\n      * Implementation of C macro.\n     d libssh2_session_disconnect...\n     d                 pr                  extproc('libssh2_session_disconnect')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  description                    *   value options(*string)               const char *\n\n     d libssh2_session_free...\n     d                 pr                  extproc('libssh2_session_free')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_hostkey_hash...\n     d                 pr              *   extproc('libssh2_hostkey_hash')      const char *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  hash_type                          value like(libssh2_Cint)\n\n     d libssh2_session_hostkey...\n     d                 pr              *   extproc('libssh2_session_hostkey')   const char *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  len                                like(libssh2_Csize_t)\n     d  type                               like(libssh2_Cint)\n\n     d libssh2_session_method_pref...\n     d                 pr                  extproc(\n     d                                     'libssh2_session_method_pref')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  method_type                        value like(libssh2_Cint)\n     d  prefs                          *   value options(*string)               const char *\n\n     d libssh2_session_methods...\n     d                 pr              *   extproc('libssh2_session_methods')   const char *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  method_type                        value like(libssh2_Cint)\n\n     d libssh2_session_last_error...\n     d                 pr                  extproc('libssh2_session_last_error')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  errmsg                         *                                        char *(*)\n     d  errmsg_len                         like(libssh2_Cint)\n     d  want_buf                           value like(libssh2_Cint)\n\n     d libssh2_session_last_errno...\n     d                 pr                  extproc('libssh2_session_last_errno')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_session_set_last_error...\n     d                 pr                  extproc(\n     d                                     'libssh2_session_set_last_error')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  errcode                            value like(libssh2_Cint)\n     d  errmsg                         *   value options(*string)               const char *\n\n     d libssh2_session_block_directions...\n     d                 pr                  extproc(\n     d                                     'libssh2_session_block_directions')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_session_flag...\n     d                 pr                  extproc('libssh2_session_flag')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  flag                               value like(libssh2_Cint)\n     d  value                              value like(libssh2_Cint)\n\n     d libssh2_session_banner_get...\n     d                 pr              *   extproc('libssh2_session_banner_get') const char *\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n      * Userauth API.\n\n     d libssh2_userauth_list...\n     d                 pr              *   extproc('libssh2_userauth_list')     char *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  username_len                       value like(libssh2_Cuint)\n\n     d libssh2_userauth_authenticated...\n     d                 pr                  extproc(\n     d                                     'libssh2_userauth_authenticated')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_userauth_password_ex...\n     d                 pr                  extproc(\n     d                                     'libssh2_userauth_password_ex')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  username_len                       value like(libssh2_Cuint)\n     d  password                       *   value options(*string)               const char *\n     d  password_len                       value like(libssh2_Cuint)\n     d  passwd_change_cb...\n     d                                 *   value procptr\n\n      * Implementation of C macro.\n     d libssh2_userauth_password...\n     d                 pr                  extproc('libssh2_userauth_password')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  password                       *   value options(*string)               const char *\n\n     d libssh2_userauth_publickey_fromfile_ex...\n     d                 pr                  extproc('libssh2_userauth_publickey_-\n     d                                     fromfile_ex')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  username_len                       value like(libssh2_Cuint)\n     d  publickey                      *   value options(*string)               const char *\n     d  privatekey                     *   value options(*string)               const char *\n     d  passphrase                     *   value options(*string)               const char *\n\n      * Implementation of C macro.\n     d libssh2_userauth_publickey_fromfile...\n     d                 pr                  extproc(\n     d                                     'libssh2_userauth_publickey_fromfile'\n     d                                     )\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  publickey                      *   value options(*string)               const char *\n     d  privatekey                     *   value options(*string)               const char *\n     d  passphrase                     *   value options(*string)               const char *\n\n     d libssh2_userauth_publickey...\n     d                 pr                  extproc('libssh2_userauth_publickey')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  pubkeydata                     *   value options(*string)               const unsigned char*\n     d  pubkeydata_len...\n     d                                     value like(libssh2_Csize_t)\n     d  sign_callback                  *   value procptr\n     d  abstract                       *                                        void *(*)\n\n     d libssh2_userauth_hostbased_fromfile_ex...\n     d                 pr                  extproc('libssh2_userauth_hostbased_-\n     d                                     fromfile_ex')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  username_len                       value like(libssh2_Cuint)\n     d  publickey                      *   value options(*string)               const char *\n     d  privatekey                     *   value options(*string)               const char *\n     d  passphrase                     *   value options(*string)               const char *\n     d  hostname                       *   value options(*string)               const char *\n     d  hostname_len                       value like(libssh2_Cuint)\n     d  local_username...\n     d                                 *   value options(*string)               const char *\n     d  local_username_len...\n     d                                     value like(libssh2_Cuint)\n\n      * C macro implementation.\n     d libssh2_userauth_hostbased_fromfile...\n     d                 pr                  extproc(\n     d                                     'libssh2_userauth_hostbased_fromfile'\n     d                                     )\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  publickey                      *   value options(*string)               const char *\n     d  privatekey                     *   value options(*string)               const char *\n     d  passphrase                     *   value options(*string)               const char *\n     d  hostname                       *   value options(*string)               const char *\n\n     d libssh2_userauth_publickey_frommemory...\n     d                 pr                  extproc('libssh2_userauth_publickey_-\n     d                                     frommemory')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  username_len                       value like(libssh2_Csize_t)\n     d  publickeyfiledata...\n     d                                 *   value options(*string)               const char *\n     d  publickeyfiledata_len...\n     d                                     value like(libssh2_Csize_t)\n     d  privatekeyfiledata...\n     d                                 *   value options(*string)               const char *\n     d  privatekeyfiledata_len...\n     d                                     value like(libssh2_Csize_t)\n     d  passphrase                     *   value options(*string)               const char *\n\n      * response_callback is provided with filled by library prompts array,\n      * but client must allocate and fill individual responses. Responses\n      * array is already allocated. Responses data will be freed by libssh2\n      * after callback return, but before subsequent callback invokation.\n\n     d libssh2_userauth_keyboard_interactive_ex...\n     d                 pr                  extproc('libssh2_userauth_keyboard_i-\n     d                                     nteractive_ex')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  username_len                       value like(libssh2_Cuint)\n     d  response_callback...\n     d                                 *   value procptr\n\n      * C macro implementation.\n     d libssh2_userauth_keyboard_interactive...\n     d                 pr                  extproc('libssh2_userauth_keyboard_i-\n     d                                     nteractive')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  response_callback...\n     d                                 *   value procptr\n\n     d libssh2_poll    pr                  extproc('libssh2_poll')\n     d                                     like(libssh2_Cint)\n     d  fds                            *   value                                LIBSSH2_POLLFD *\n     d  nfds                               value like(libssh2_Cuint)\n     d  timeout                            value like(libssh2_Clong)\n\n      * Channel API.\n     d LIBSSH2_CHANNEL_WINDOW_DEFAULT...\n     d                 c                   X'00200000'\n     d LIBSSH2_CHANNEL_PACKET_DEFAULT...\n     d                 c                   32768\n     d LIBSSH2_CHANNEL_MINADJUST...\n     d                 c                   1024\n\n      * Extended Data Handling.\n     d LIBSSH2_CHANNEL_EXTENDED_DATA_NORMAL...\n     d                 c                   0\n     d LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE...\n     d                 c                   1\n     d LIBSSH2_CHANNEL_EXTENDED_DATA_MERGE...\n     d                 c                   2\n\n     d SSH_EXTENDED_DATA_STDERR...\n     d                 c                   1\n\n      * Returned by any function that would block during a read/write\n      * operation.\n     d LIBSSH2CHANNEL_EAGAIN...                                                 LIBSSH2_ERROR_EAGAIN\n     d                 c                   -37\n\n     d libssh2_channel_open_ex...\n     d                 pr              *   extproc('libssh2_channel_open_ex')   LIBSSH2_CHANNEL *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  channel_type                   *   value options(*string)               const char *\n     d  channel_type_len...\n     d                                     value like(libssh2_Cuint)\n     d  window_size                        value like(libssh2_Cuint)\n     d  packet_size                        value like(libssh2_Cuint)\n     d  message                        *   value options(*string)               const char *\n     d  message_len                        value like(libssh2_Cuint)\n\n      * C macro implementation.\n     d libssh2_channel_open_session...\n     d                 pr              *   extproc(                             LIBSSH2_CHANNEL *\n     d                                     'libssh2_channel_open_session')\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_channel_direct_tcpip_ex...\n     d                 pr              *   extproc(                             LIBSSH2_CHANNEL *\n     d                                     'libssh2_channel_direct_tcpip_ex')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  host                           *   value options(*string)               const char *\n     d  port                               value like(libssh2_Cint)\n     d  shost                          *   value options(*string)               const char *\n     d  sport                              value like(libssh2_Cint)\n\n      * C macro implementation.\n     d libssh2_channel_direct_tcpip...\n     d                 pr              *   extproc(                             LIBSSH2_CHANNEL *\n     d                                     'libssh2_channel_direct_tcpip')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  host                           *   value options(*string)               const char *\n     d  port                               value like(libssh2_Cint)\n\n     d libssh2_channel_forward_listen_ex...\n     d                 pr              *   extproc(                             LIBSSH2_LISTENER *\n     d                                     'libssh2_channel_forward_listen_ex')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  host                           *   value options(*string)               const char *\n     d  port                               value like(libssh2_Cint)\n     d  bound_port                         like(libssh2_Cint)\n     d  queue_maxsize                      value like(libssh2_Cint)\n\n      * C macro implementation.\n     d libssh2_channel_forward_listen...\n     d                 pr              *   extproc(                             LIBSSH2_LISTENER *\n     d                                     'libssh2_channel_forward_listen')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  port                               value like(libssh2_Cint)\n\n     d libssh2_channel_forward_cancel...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_forward_cancel')\n     d                                     like(libssh2_Cint)\n     d  listener                       *   value                                LIBSSH2_LISTENER *\n\n     d libssh2_channel_forward_accept...\n     d                 pr              *   extproc(                             LIBSSH2_CHANNEL *\n     d                                     'libssh2_channel_forward_accept')\n     d  listener                       *   value                                LIBSSH2_LISTENER *\n\n     d libssh2_channel_setenv_ex...\n     d                 pr                  extproc('libssh2_channel_setenv_ex')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  varname                        *   value options(*string)               const char *\n     d  varname_len                        value like(libssh2_Cuint)\n     d  value                          *   value options(*string)               const char *\n     d  value_len                          value like(libssh2_Cuint)\n\n      * C macro implementation.\n     d libssh2_channel_setenv...\n     d                 pr                  extproc('libssh2_channel_setenv')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  varname                        *   value options(*string)               const char *\n     d  value                          *   value options(*string)               const char *\n\n     d libssh2_channel_request_pty_ex...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_request_pty_ex')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  term                           *   value options(*string)               const char *\n     d  term_len                           value like(libssh2_Cuint)\n     d  modes                          *   value options(*string)               const char *\n     d  modes_len                          value like(libssh2_Cuint)\n     d  width                              value like(libssh2_Cint)\n     d  height                             value like(libssh2_Cint)\n     d  width_px                           value like(libssh2_Cint)\n     d  height_px                          value like(libssh2_Cint)\n\n      * C macro implementation.\n     d libssh2_channel_request_pty...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_request_pty')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  term                           *   value options(*string)               const char *\n\n     d libssh2_channel_request_pty_size_ex...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_request_pty_size_ex'\n     d                                     )\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  width                              value like(libssh2_Cint)\n     d  height                             value like(libssh2_Cint)\n     d  width_px                           value like(libssh2_Cint)\n     d  height_px                          value like(libssh2_Cint)\n\n      * C macro implementation.\n     d libssh2_channel_request_pty_size...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_request_pty_size')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  width                              value like(libssh2_Cint)\n     d  height                             value like(libssh2_Cint)\n\n     d libssh2_channel_x11_req_ex...\n     d                 pr                  extproc('libssh2_channel_x11_req_ex')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  single_connection...\n     d                                     value like(libssh2_Cint)\n     d  auth_proto                     *   value options(*string)               const char *\n     d  auth_cookie                    *   value options(*string)               const char *\n     d  screen_number                      value like(libssh2_Cint)\n\n      * C macro implementation.\n     d libssh2_channel_x11_req...\n     d                 pr                  extproc('libssh2_channel_x11_req')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  screen_number                      value like(libssh2_Cint)\n\n     d libssh2_channel_process_startup...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_process_startup')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  request                        *   value options(*string)               const char *\n     d  request_len                        value like(libssh2_Cuint)\n     d  message                        *   value options(*string)               const char *\n     d  message_len                        value like(libssh2_Cuint)\n\n      * C macro implementation.\n     d libssh2_channel_shell...\n     d                 pr                  extproc('libssh2_channel_shell')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n      * C macro implementation.\n     d libssh2_channel_exec...\n     d                 pr                  extproc('libssh2_channel_exec')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  command                        *   value options(*string)               const char *\n\n      * C macro implementation.\n     d libssh2_channel_subsystem...\n     d                 pr                  extproc('libssh2_channel_subsystem')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  subsystem                      *   value options(*string)               const char *\n\n     d libssh2_channel_read_ex...\n     d                 pr                  extproc('libssh2_channel_read_ex')\n     d                                     like(libssh2_Cssize_t)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  stream_id                          value like(libssh2_Cint)\n     d  buf                            *   value                                char *\n     d  buflen                             value like(libssh2_Csize_t)\n\n      * C macro implementation.\n     d libssh2_channel_read...\n     d                 pr                  extproc('libssh2_channel_read')\n     d                                     like(libssh2_Cssize_t)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  buf                            *   value                                char *\n     d  buflen                             value like(libssh2_Csize_t)\n\n      * C macro implementation.\n     d libssh2_channel_read_stderr...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_read_stderr')\n     d                                     like(libssh2_Cssize_t)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  buf                            *   value                                char *\n     d  buflen                             value like(libssh2_Csize_t)\n\n     d libssh2_poll_channel_read...\n     d                 pr                  extproc('libssh2_poll_channel_read')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  extended                           value like(libssh2_Cint)\n\n     d libssh2_channel_window_read_ex...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_window_read_ex')\n     d                                     like(libssh2_Culong)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  read_avail                         like(libssh2_Culong)\n     d  window_size_initial...\n     d                                     like(libssh2_Culong)\n\n      * C macro implementation.\n     d libssh2_channel_window_read...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_window_read')\n     d                                     like(libssh2_Culong)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_channel_receive_window_adjust2...\n     d                 pr                  extproc('libssh2_channel_receive_win-\n     d                                     dow_adjust2')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  adjustment                         value like(libssh2_Culong)\n     d  force                              value like(libssh2_Cuchar)\n     d  storewindow                        like(libssh2_Cuint)\n\n     d libssh2_channel_write_ex...\n     d                 pr                  extproc('libssh2_channel_write_ex')\n     d                                     like(libssh2_Cssize_t)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  stream_id                          value like(libssh2_Cint)\n     d  buf                            *   value options(*string)               const char *\n     d  buflen                             value like(libssh2_Csize_t)\n\n      * C macro implementation.\n     d libssh2_channel_write...\n     d                 pr                  extproc('libssh2_channel_write')\n     d                                     like(libssh2_Cssize_t)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  buf                            *   value options(*string)               const char *\n     d  buflen                             value like(libssh2_Csize_t)\n\n      * C macro implementation.\n     d libssh2_channel_write_stderr...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_write_stderr')\n     d                                     like(libssh2_Cssize_t)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  buf                            *   value options(*string)               const char *\n     d  buflen                             value like(libssh2_Csize_t)\n\n     d libssh2_channel_window_write_ex...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_window_write_ex')\n     d                                     like(libssh2_Culong)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  window_size_initial...\n     d                                     like(libssh2_Culong)\n\n      * C macro implementation.\n     d libssh2_channel_window_write...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_window_write')\n     d                                     like(libssh2_Culong)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_session_set_blocking...\n     d                 pr                  extproc(\n     d                                     'libssh2_session_set_blocking')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  blocking                           value like(libssh2_Cint)\n\n     d libssh2_session_get_blocking...\n     d                 pr                  extproc(\n     d                                     'libssh2_session_get_blocking')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_channel_set_blocking...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_set_blocking')\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  blocking                           value like(libssh2_Cint)\n\n     d libssh2_session_set_timeout...\n     d                 pr                  extproc(\n     d                                     'libssh2_session_set_timeout')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  timeout                            value like(libssh2_Clong)\n\n     d libssh2_session_get_timeout...\n     d                 pr                  extproc(\n     d                                     'libssh2_session_get_timeout')\n     d                                     like(libssh2_Clong)\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_channel_handle_extended_data2...\n     d                 pr                  extproc('libssh2_channel_handle_exte-\n     d                                     nded_data2')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  ignore_mode                        value like(libssh2_Cint)\n\n      * libssh2_channel_ignore_extended_data() is defined below for BC with\n      * version 0.1.\n\n     d LIBSSH2_CHANNEL_FLUSH_EXTENDED_DATA...\n     d                 c                   -1\n     d LIBSSH2_CHANNEL_FLUSH_ALL...\n     d                 c                   -2\n\n     d libssh2_channel_flush_ex...\n     d                 pr                  extproc('libssh2_channel_flush_ex')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  streamid                           value like(libssh2_Cint)\n\n      * C macro implementation.\n     d libssh2_channel_flush...\n     d                 pr                  extproc('libssh2_channel_flush')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n      * C macro implementation.\n     d libssh2_channel_flush_stderr...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_flush_stderr')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_channel_get_exit_status...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_get_exit_status')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_channel_get_exit_signal...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_get_exit_signal')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  exitsignal                     *                                        char *(*)\n     d  exitsignal_len...\n     d                                     like(libssh2_Csize_t)\n     d  errmsg                         *                                        char *(*)\n     d  errmsg_len                         like(libssh2_Csize_t)\n     d  langtag                        *                                        char *(*)\n     d  langtag_len                        like(libssh2_Csize_t)\n\n     d libssh2_channel_send_eof...\n     d                 pr                  extproc('libssh2_channel_send_eof')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_channel_eof...\n     d                 pr                  extproc('libssh2_channel_eof')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_channel_wait_eof...\n     d                 pr                  extproc('libssh2_channel_wait_eof')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_channel_close...\n     d                 pr                  extproc('libssh2_channel_close')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_channel_wait_closed...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_wait_closed')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_channel_free...\n     d                 pr                  extproc('libssh2_channel_free')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n      * Use libssh2_scp_recv2 for large (> 2GB) file support.\n     d libssh2_scp_recv2...\n     d                 pr              *   extproc('libssh2_scp_recv2')         LIBSSH2_CHANNEL *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  path                           *   value options(*string)               const char *\n     d  sb                                 likeds(libssh2_struct_stat)\n\n     d libssh2_scp_send_ex...\n     d                 pr              *   extproc('libssh2_scp_send_ex')       LIBSSH2_CHANNEL *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  path                           *   value options(*string)               const char *\n     d  mode                               value like(libssh2_Cint)\n     d  size                               value like(libssh2_Csize_t)\n     d  mtime                              value like(libssh2_Clong)\n     d  atime                              value like(libssh2_Clong)\n\n     d libssh2_scp_send64...\n     d                 pr              *   extproc('libssh2_scp_send64')        LIBSSH2_CHANNEL *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  path                           *   value options(*string)               const char *\n     d  mode                               value like(libssh2_Cint)\n     d  size                               value like(libssh2_int64_t)\n     d  mtime                              value like(libssh2_time_t)\n     d  atime                              value like(libssh2_time_t)\n\n      * C macro implementation.\n     d libssh2_scp_send...\n     d                 pr              *   extproc('libssh2_scp_send')          LIBSSH2_CHANNEL *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  path                           *   value options(*string)               const char *\n     d  mode                               value like(libssh2_Cint)\n     d  size                               value like(libssh2_int64_t)\n\n     d libssh2_base64_decode...\n     d                 pr                  extproc('libssh2_base64_decode')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  dest                           *   value                                char * *\n     d  dest_len                       *   value                                unsigned int *\n     d  src                            *   value options(*string)               const char *\n     d  src_len                            value like(libssh2_Cuint)\n\n      * Procedure libssh2_version renamed to avoid upper/lower case name clash.\n     d libssh2_get_version...\n     d                 pr              *   extproc('libssh2_version')           const char *\n     d  req_version_num...\n     d                                     value like(libssh2_Cint)\n\n     d HAVE_LIBSSH2_KNOWNHOST_API...                                            since 1.1.1\n     d                 c                   X'010101'\n     d HAVE_LIBSSH2_VERSION_API...                                              since 1.1\n     d                 c                   X'010100'\n\n     d libssh2_knownhost...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n     d  magic                              like(libssh2_Cuint)\n     d  node                           *                                        void *\n     d  name                           *                                        char *\n     d  key                            *                                        char *\n     d  typemask                           like(libssh2_Cint)\n\n      * libssh2_knownhost_init\n      *\n      * Init a collection of known hosts. Returns the pointer to a collection.\n\n     d libssh2_knownhost_init...\n     d                 pr              *   extproc('libssh2_knownhost_init')    LIBSSH2_KNOWNHOSTS *\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n      * libssh2_knownhost_add\n      *\n      * Add a host and its associated key to the collection of known hosts.\n      *\n      * The 'type' argument specifies on what format the given host and\n      * keys are:\n      *\n      * plain  - ascii \"hostname.domain.tld\"\n      * sha1   - SHA1(<salt> <host>) base64-encoded!\n      * custom - another hash\n      *\n      * If 'sha1' is selected as type, the salt must be provided to the salt\n      * argument. This too base64 encoded.\n      *\n      * The SHA-1 hash is what OpenSSH can be told to use in known_hosts files.\n      * If a custom type is used, salt is ignored and you must provide the host\n      * pre-hashed when checking for it in the libssh2_knownhost_check()\n      * function.\n      *\n      * The keylen parameter may be omitted (zero) if the key is provided as a\n      * NULL-terminated base64-encoded string.\n\n      * host format (2 bits).\n     d LIBSSH2_KNOWNHOST_TYPE_MASK...\n     d                 c                   X'FFFF'\n     d  LIBSSH2_KNOWNHOST_TYPE_PLAIN...\n     d                 c                   1\n     d LIBSSH2_KNOWNHOST_TYPE_SHA1...                                           always base64 ncoded\n     d                 c                   2\n     d LIBSSH2_KNOWNHOST_TYPE_CUSTOM...\n     d                 c                   3\n\n      * key format (2 bits).\n     d LIBSSH2_KNOWNHOST_KEYENC_MASK...\n     d                 c                   X'00030000'\n     d LIBSSH2_KNOWNHOST_KEYENC_RAW...\n     d                 c                   X'00010000'\n     d LIBSSH2_KNOWNHOST_KEYENC_BASE64...\n     d                 c                   X'00020000'\n\n      * type of key (3 bits).\n     d LIBSSH2_KNOWNHOST_KEY_MASK...\n     d                 c                   X'001C0000'\n     d LIBSSH2_KNOWNHOST_KEY_SHIFT...\n     d                 c                   18\n     d LIBSSH2_KNOWNHOST_KEY_RSA1...\n     d                 c                   X'00040000'\n     d LIBSSH2_KNOWNHOST_KEY_SSHRSA...\n     d                 c                   X'00080000'\n     d LIBSSH2_KNOWNHOST_KEY_SSHDSS...\n     d                 c                   X'000C0000'\n     d LIBSSH2_KNOWNHOST_KEY_UNKNOWN...\n     d                 c                   X'001C0000'\n\n     d libssh2_knownhost_add...\n     d                 pr                  extproc('libssh2_knownhost_add')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  host                           *   value options(*string)               const char *\n     d  salt                           *   value options(*string)               const char *\n     d  key                            *   value options(*string)               const char *\n     d  keylen                             value like(libssh2_Csize_t)\n     d  typemask                           value like(libssh2_Cint)\n     d  store                          *                                        libssh2_knownhost *\n\n      * libssh2_knownhost_addc\n      *\n      * Add a host and its associated key to the collection of known hosts.\n      *\n      * Takes a comment argument that may be NULL.  A NULL comment indicates\n      * there is no comment and the entry will end directly after the key\n      * when written out to a file.  An empty string \"\" comment will indicate an\n      * empty comment which will cause a single space to be written after the\n      * key.\n      *\n      * The 'type' argument specifies on what format the given host and keys\n      * are:\n      *\n      * plain  - ascii \"hostname.domain.tld\"\n      * sha1   - SHA1(<salt> <host>) base64-encoded!\n      * custom - another hash\n      *\n      * If 'sha1' is selected as type, the salt must be provided to the salt\n      * argument. This too base64 encoded.\n      *\n      * The SHA-1 hash is what OpenSSH can be told to use in known_hosts files.\n      * If a custom type is used, salt is ignored and you must provide the host\n      * pre-hashed when checking for it in the libssh2_knownhost_check()\n      * function.\n      *\n      * The keylen parameter may be omitted (zero) if the key is provided as a\n      * NULL-terminated base64-encoded string.\n\n     d libssh2_knownhost_addc...\n     d                 pr                  extproc('libssh2_knownhost_addc')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  host                           *   value options(*string)               const char *\n     d  salt                           *   value options(*string)               const char *\n     d  key                            *   value options(*string)               const char *\n     d  keylen                             value like(libssh2_Csize_t)\n     d  comment                        *   value options(*string)               const char *\n     d  commentlen                         value like(libssh2_Csize_t)\n     d  typemask                           value like(libssh2_Cint)\n     d  store                          *                                        libssh2_knownhost *\n\n\n      * libssh2_knownhost_check\n      *\n      * Check a host and its associated key against the collection of known\n      * hosts.\n      *\n      * The type is the type/format of the given host name.\n      *\n      * plain  - ascii \"hostname.domain.tld\"\n      * custom - prehashed base64 encoded. Note that this cannot use any salts.\n      *\n      *\n      * 'knownhost' may be set to NULL if you don't care about that info.\n      *\n      * Returns:\n      *\n      * LIBSSH2_KNOWNHOST_CHECK_* values, see below.\n\n     d LIBSSH2_KNOWNHOST_CHECK_MATCH...\n     d                 c                   0\n     d LIBSSH2_KNOWNHOST_CHECK_MISMATCH...\n     d                 c                   1\n     d LIBSSH2_KNOWNHOST_CHECK_NOTFOUND...\n     d                 c                   2\n     d LIBSSH2_KNOWNHOST_CHECK_FAILURE...\n     d                 c                   3\n\n     d libssh2_knownhost_check...\n     d                 pr                  extproc('libssh2_knownhost_check')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  host                           *   value options(*string)               const char *\n     d  key                            *   value options(*string)               const char *\n     d  keylen                             value like(libssh2_Csize_t)\n     d  typemask                           value like(libssh2_Cint)\n     d  knownhost                      *                                        libssh2_knownhost *\n\n      * this function is identital to the above one, but also takes a port\n      * argument that allows libssh2 to do a better check.\n     d libssh2_knownhost_checkp...\n     d                 pr                  extproc('libssh2_knownhost_checkp')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  host                           *   value options(*string)               const char *\n     d  port                               value like(libssh2_Cint)\n     d  key                            *   value options(*string)               const char *\n     d  keylen                             value like(libssh2_Csize_t)\n     d  typemask                           value like(libssh2_Cint)\n     d  knownhost                      *                                        libssh2_knownhost *\n\n      * libssh2_knownhost_del\n      *\n      * Remove a host from the collection of known hosts. The 'entry' struct is\n      * retrieved by a call to libssh2_knownhost_check().\n\n     d libssh2_knownhost_del...\n     d                 pr                  extproc('libssh2_knownhost_del')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  entry                              likeds(libssh2_knownhost)\n\n      * libssh2_knownhost_free\n      *\n      * Free an entire collection of known hosts.\n\n     d libssh2_knownhost_free...\n     d                 pr                  extproc('libssh2_knownhost_free')\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n\n      * libssh2_knownhost_readline()\n      *\n      * Pass in a line of a file of 'type'. It makes libssh2 read this line.\n      *\n      * LIBSSH2_KNOWNHOST_FILE_OPENSSH is the only supported type.\n\n     d libssh2_knownhost_readline...\n     d                 pr                  extproc('libssh2_knownhost_readline')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  line                           *   value options(*string)               const char *\n     d  len                                value like(libssh2_Csize_t)\n     d  type                               value like(libssh2_Cint)\n\n      * libssh2_knownhost_readfile\n      *\n      * Add hosts+key pairs from a given file.\n      *\n      * Returns a negative value for error or number of successfully added\n      * hosts.\n      *\n      * This implementation currently only knows one 'type' (openssh), all\n      * others are reserved for future use.\n\n     d LIBSSH2_KNOWNHOST_FILE_OPENSSH...\n     d                 c                   1\n\n     d libssh2_knownhost_readfile...\n     d                 pr                  extproc('libssh2_knownhost_readfile')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  filename                       *   value options(*string)               const char *\n     d  type                               value like(libssh2_Cint)\n\n      * libssh2_knownhost_writeline()\n      *\n      * Ask libssh2 to convert a known host to an output line for storage.\n      *\n      * Note that this function returns LIBSSH2_ERROR_BUFFER_TOO_SMALL if the\n      * given output buffer is too small to hold the desired output.\n      *\n      * This implementation currently only knows one 'type' (openssh), all\n      * others are reserved for future use.\n\n     d libssh2_knownhost_writeline...\n     d                 pr                  extproc(\n     d                                     'libssh2_knownhost_writeline')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  known                              likeds(libssh2_knownhost)\n     d  buffer                         *   value options(*string)               char *\n     d  buflen                             value like(libssh2_Csize_t)\n     d  outlen                             like(libssh2_Csize_t)                Written data amount\n     d  type                               value like(libssh2_Cint)\n\n      * libssh2_knownhost_writefile\n      *\n      * Write hosts+key pairs to a given file.\n      *\n      * This implementation currently only knows one 'type' (openssh), all\n      * others are reserved for future use.\n\n     d libssh2_knownhost_writefile...\n     d                 pr                  extproc(\n     d                                     'libssh2_knownhost_writefile')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  filename                       *   value options(*string)               const char *\n     d  type                               value like(libssh2_Cint)\n\n      * libssh2_knownhost_get()\n      *\n      * Traverse the internal list of known hosts. Pass NULL to 'prev' to get\n      * the first one. Or pass a poiner to the previously returned one to\n      * get the next.\n      *\n      * Returns:\n      * 0 if a fine host was stored in 'store'\n      * 1 if end of hosts\n      * [negative] on errors\n\n     d libssh2_knownhost_get...\n     d                 pr                  extproc('libssh2_knownhost_get')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  store                          *                                        libssh2_knownhost *\n     d  prev                               likeds(libssh2_knownhost)\n\n     d HAVE_LIBSSH2_AGENT_API...                                                since 1.2.2\n     d                 c                   X'010202'\n\n     d libssh2_agent_publickey...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n     d  magic                              like(libssh2_Cuint)\n     d  node                           *                                        void *\n     d  blob                           *                                        unsigned char *\n     d  blob_len                           like(libssh2_Csize_t)\n     d  comment                        *                                        char *\n\n      * libssh2_agent_init\n      *\n      * Init an ssh-agent handle. Returns the pointer to the handle.\n\n     d libssh2_agent_init...\n     d                 pr              *   extproc('libssh2_agent_init')        LIBSSH2_AGENT *\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n      * libssh2_agent_connect()\n      *\n      * Connect to an ssh-agent.\n      *\n      * Returns 0 if succeeded, or a negative value for error.\n\n     d libssh2_agent_connect...\n     d                 pr                  extproc('libssh2_agent_connect')\n     d                                     like(libssh2_Cint)\n     d  agent                          *   value                                LIBSSH2_AGENT *\n\n      * libssh2_agent_list_identities()\n      *\n      * Request an ssh-agent to list identities.\n      *\n      * Returns 0 if succeeded, or a negative value for error.\n\n     d libssh2_agent_list_identities...\n     d                 pr                  extproc(\n     d                                     'libssh2_agent_list_identities')\n     d                                     like(libssh2_Cint)\n     d  agent                          *   value                                LIBSSH2_AGENT *\n\n      * libssh2_agent_get_identity()\n      *\n      * Traverse the internal list of public keys. Pass NULL to 'prev' to get\n      * the first one. Or pass a poiner to the previously returned one to\n      * get the next.\n      *\n      * Returns:\n      * 0 if a fine public key was stored in 'store'\n      * 1 if end of public keys\n      * [negative] on errors\n\n     d libssh2_agent_get_identity...\n     d                 pr                  extproc('libssh2_agent_get_identity')\n     d                                     like(libssh2_Cint)\n     d  agent                          *   value                                LIBSSH2_AGENT *\n     d  store                          *                                        libssh2_agent_...\n     d                                                                          publickey *(*)\n     d  prev                               likeds(libssh2_agent_publickey)\n\n      * libssh2_agent_userauth()\n      *\n      * Do publickey user authentication with the help of ssh-agent.\n      *\n      * Returns 0 if succeeded, or a negative value for error.\n\n     d libssh2_agent_userauth...\n     d                 pr                  extproc('libssh2_agent_userauth')\n     d                                     like(libssh2_Cint)\n     d  agent                          *   value                                LIBSSH2_AGENT *\n     d  username                       *   value options(*string)               const char *\n     d  identity                           likeds(libssh2_agent_publickey)\n\n      * libssh2_agent_disconnect()\n      *\n      * Close a connection to an ssh-agent.\n      *\n      * Returns 0 if succeeded, or a negative value for error.\n\n     d libssh2_agent_disconnect...\n     d                 pr                  extproc('libssh2_agent_disconnect')\n     d                                     like(libssh2_Cint)\n     d  agent                          *   value                                LIBSSH2_AGENT *\n\n      * libssh2_agent_free()\n      *\n      * Free an ssh-agent handle. This function also frees the internal\n      * collection of public keys.\n\n     d libssh2_agent_free...\n     d                 pr                  extproc('libssh2_agent_free')\n     d  agent                          *   value                                LIBSSH2_AGENT *\n\n\n      * libssh2_keepalive_config()\n      *\n      * Set how often keepalive messages should be sent.  WANT_REPLY\n      * indicates whether the keepalive messages should request a response\n      * from the server.  INTERVAL is number of seconds that can pass\n      * without any I/O, use 0 (the default) to disable keepalives.  To\n      * avoid some busy-loop corner-cases, if you specify an interval of 1\n      * it will be treated as 2.\n      *\n      * Note that non-blocking applications are responsible for sending the\n      * keepalive messages using libssh2_keepalive_send().\n\n     d libssh2_keepalive_config...\n     d                 pr                  extproc('libssh2_keepalive_config')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  want_reply                         value like(libssh2_Cint)\n     d  interval                           value like(libssh2_Cuint)\n\n      * libssh2_keepalive_send()\n      *\n      * Send a keepalive message if needed.  SECONDS_TO_NEXT indicates how\n      * many seconds you can sleep after this call before you need to call\n      * it again.  Returns 0 on success, or LIBSSH2_ERROR_SOCKET_SEND on\n      * I/O errors.\n\n     d libssh2_keepalive_send...\n     d                 pr                  extproc('libssh2_keepalive_send')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  seconds_to_next...\n     d                                     like(libssh2_Cint)\n\n      * NOTE NOTE NOTE\n      * libssh2_trace() has no function in builds that aren't built with debug\n      * enabled.\n\n     d libssh2_trace   pr                  extproc('libssh2_trace')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  bitmask                            value like(libssh2_Cint)\n\n     d LIBSSH2_TRACE_TRANS...\n     d                 c                   X'0002'\n     d LIBSSH2_TRACE_KEX...\n     d                 c                   X'0004'\n     d LIBSSH2_TRACE_AUTH...\n     d                 c                   X'0008'\n     d LIBSSH2_TRACE_CONN...\n     d                 c                   X'0010'\n     d LIBSSH2_TRACE_SCP...\n     d                 c                   X'0020'\n     d LIBSSH2_TRACE_SFTP...\n     d                 c                   X'0040'\n     d LIBSSH2_TRACE_ERROR...\n     d                 c                   X'0080'\n     d LIBSSH2_TRACE_PUBLICKEY...\n     d                 c                   X'0100'\n     d LIBSSH2_TRACE_SOCKET...\n     d                 c                   X'0200'\n\n     d libssh2_trace_handler_func...\n     d                 s               *   based(######typedef######) procptr\n\n     d libssh2_trace_sethandler...\n     d                 pr                  extproc('libssh2_trace_sethandler')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  context                        *   value                                void *\n     d  callback                           value\n     d                                     like(libssh2_trace_handler_func)\n\n      /endif                                                                    LIBSSH2_H_\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/libssh2rpg/libssh2_ccsid.rpgle.in",
    "content": "      * Copyright (c) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n      * All rights reserved.\n      *\n      * Redistribution and use in source and binary forms,\n      * with or without modification, are permitted provided\n      * that the following conditions are met:\n      *\n      *   Redistributions of source code must retain the above\n      *   copyright notice, this list of conditions and the\n      *   following disclaimer.\n      *\n      *   Redistributions in binary form must reproduce the above\n      *   copyright notice, this list of conditions and the following\n      *   disclaimer in the documentation and/or other materials\n      *   provided with the distribution.\n      *\n      *   Neither the name of the copyright holder nor the names\n      *   of any other contributors may be used to endorse or\n      *   promote products derived from this software without\n      *   specific prior written permission.\n      *\n      * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n      * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n      * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n      * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n      * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n      * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n      * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n      * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n      * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n      * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n      * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n      * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n      * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n      * OF SUCH DAMAGE.\n\n      /if not defined(LIBSSH2_CCSID_H_)\n      /define LIBSSH2_CCSID_H_\n\n      /include \"libssh2rpg/libssh2\"\n\n     d libssh2_from_ccsid...\n     d                 pr              *   extproc('libssh2_from_ccsid')        char *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  cache                          *                                        libssh2_string_cache\n     d                                                                          *(*)\n     d  ccsid                              value like(libssh2_Cushort)\n     d  string                         *   value options(*string)               const char *\n     d  inlen                              value like(libssh2_Cssize_t)\n     d  outlen                             like(libssh2_Csize_t) options(*omit)\n\n     d libssh2_to_ccsid...\n     d                 pr              *   extproc('libssh2_to_ccsid')          char *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  cache                          *                                        libssh2_string_cache\n     d                                                                          *(*)\n     d  ccsid                              value like(libssh2_Cushort)\n     d  string                         *   value options(*string)               const char *\n     d  inlen                              value like(libssh2_Cssize_t)\n     d  outlen                             like(libssh2_Csize_t) options(*omit)\n\n     d libssh2_release_string_cache...\n     d                 pr                  extproc(\n     d                                     'libssh2_release_string_cache')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  cache                          *                                        libssh2_string_cache\n     d                                                                          *(*)\n\n      /endif                                                                    LIBSSH2_CCSID_H_\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/libssh2rpg/libssh2_publickey.rpgle",
    "content": "      * Copyright (c) 2015, Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n      * All rights reserved.\n      *\n      * Redistribution and use in source and binary forms,\n      * with or without modification, are permitted provided\n      * that the following conditions are met:\n      *\n      *   Redistributions of source code must retain the above\n      *   copyright notice, this list of conditions and the\n      *   following disclaimer.\n      *\n      *   Redistributions in binary form must reproduce the above\n      *   copyright notice, this list of conditions and the following\n      *   disclaimer in the documentation and/or other materials\n      *   provided with the distribution.\n      *\n      *   Neither the name of the copyright holder nor the names\n      *   of any other contributors may be used to endorse or\n      *   promote products derived from this software without\n      *   specific prior written permission.\n      *\n      * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n      * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n      * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n      * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n      * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n      * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n      * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n      * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n      * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n      * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n      * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n      * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n      * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n      * OF SUCH DAMAGE.\n\n      * Note: This include file is only needed for using the\n      * publickey SUBSYSTEM which is not the same as publickey\n      * authentication.  For authentication you only need libssh2.h\n      *\n      * For more information on the publickey subsystem,\n      * refer to IETF draft: secsh-publickey\n\n      /if not defined(LIBSSH2_PUBLICKEY_H_)\n      /define LIBSSH2_PUBLICKEY_H_\n\n      /include \"libssh2rpg/libssh2\"\n\n     d libssh2_publickey_attribute...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n     d  name                           *                                        const char *\n     d  name_len                           like(libssh2_Culong)\n     d  value                          *                                        const char *\n     d  value_len                          like(libssh2_Culong)\n     d  mandatory                          like(libssh2_Cchar)\n\n     d libssh2_publickey_list...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n     d  name                           *                                        const char *\n     d  name_len                           like(libssh2_Culong)\n     d  blob                           *                                        const uns char *\n     d  blob_len                           like(libssh2_Culong)\n     d  num_attrs                          like(libssh2_Culong)\n     d  attrs                          *                                        libssh2_publickey...\n     d                                                                          attribute *\n\n      * Publickey Subsystem.\n     d libssh2_publickey_init...\n     d                 pr              *   extproc('libssh2_publickey_init')    LIBSSH2_PUBLICKEY *\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_publickey_add_ex...\n     d                 pr                  extproc('libssh2_publickey_add_ex')\n     d                                     like(libssh2_Cint)\n     d  pkey                           *   value                                LIBSSH2_PUBLICKEY *\n     d  name                           *   value options(*string)               const uns char *\n     d  name_len                           value like(libssh2_Culong)\n     d  blob                           *   value options(*string)               const uns char *\n     d  blob_len                           value like(libssh2_Culong)\n     d  overwrite                          value like(libssh2_Cchar)\n     d  num_attrs                          value like(libssh2_Culong)\n     d  attrs                              likeds(libssh2_publickey_attribute)\n     d                                     dim(1000)\n\n      * C macro implementation.\n     d libssh2_publickey_add...\n     d                 pr                  extproc('libssh2_publickey_add')\n     d                                     like(libssh2_Cint)\n     d  pkey                           *   value                                LIBSSH2_PUBLICKEY *\n     d  name                           *   value options(*string)               const unsigned char\n     d                                                                          *\n     d  blob                           *   value options(*string)               const unsigned char\n     d                                                                          *\n     d  blob_len                           value like(libssh2_Culong)\n     d  overwrite                          value like(libssh2_Cchar)\n     d  num_attrs                          value like(libssh2_Culong)\n     d  attrs                              likeds(libssh2_publickey_attribute)\n     d                                     dim(1000)\n\n     d libssh2_publickey_remove_ex...\n     d                 pr                  extproc(\n     d                                     'libssh2_publickey_remove_ex')\n     d                                     like(libssh2_Cint)\n     d  pkey                           *   value                                LIBSSH2_PUBLICKEY *\n     d  name                           *   value options(*string)               const uns char *\n     d  name_len                           value like(libssh2_Culong)\n     d  blob                           *   value options(*string)               const uns char *\n     d  blob_len                           value like(libssh2_Culong)\n\n      * C macro implementation.\n     d libssh2_publickey_remove...\n     d                 pr                  extproc('libssh2_publickey_remove')\n     d                                     like(libssh2_Cint)\n     d  pkey                           *   value                                LIBSSH2_PUBLICKEY *\n     d  name                           *   value options(*string)               const uns char *\n     d  blob                           *   value options(*string)               const uns char *\n     d  blob_len                           value like(libssh2_Culong)\n\n     d libssh2_publickey_list_fetch...\n     d                 pr                  extproc(\n     d                                     'libssh2_publickey_list_fetch')\n     d                                     like(libssh2_Cint)\n     d  pkey                           *   value                                LIBSSH2_PUBLICKEY *\n     d  num_keys                       *   value                                unsigned long *\n     d  pkey_list                      *                                        libssh2_publickey...\n     d                                                                          _list *(*)\n\n     d libssh2_publickey_list_free...\n     d                 pr                  extproc(\n     d                                     'libssh2_publickey_list_free')\n     d  pkey                           *   value                                LIBSSH2_PUBLICKEY *\n     d  pkey_list                          likeds(libssh2_publickey_list)\n\n     d libssh2_publickey_shutdown...\n     d                 pr                  extproc('libssh2_publickey_shutdown')\n     d                                     like(libssh2_Cint)\n     d  pkey                           *   value                                LIBSSH2_PUBLICKEY *\n\n      /endif                                                                    LIBSSH2_PUBLICKEY_H_\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/libssh2rpg/libssh2_sftp.rpgle",
    "content": "      * Copyright (c) 2015, Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n      * All rights reserved.\n      *\n      * Redistribution and use in source and binary forms,\n      * with or without modification, are permitted provided\n      * that the following conditions are met:\n      *\n      *   Redistributions of source code must retain the above\n      *   copyright notice, this list of conditions and the\n      *   following disclaimer.\n      *\n      *   Redistributions in binary form must reproduce the above\n      *   copyright notice, this list of conditions and the following\n      *   disclaimer in the documentation and/or other materials\n      *   provided with the distribution.\n      *\n      *   Neither the name of the copyright holder nor the names\n      *   of any other contributors may be used to endorse or\n      *   promote products derived from this software without\n      *   specific prior written permission.\n      *\n      * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n      * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n      * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n      * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n      * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n      * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n      * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n      * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n      * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n      * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n      * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n      * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n      * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n      * OF SUCH DAMAGE.\n\n      /if not defined(LIBSSH2_SFTP_H_)\n      /define LIBSSH2_SFTP_H_\n\n      /include \"libssh2rpg/libssh2\"\n\n      * Note: Version 6 was documented at the time of writing\n      * However it was marked as \"DO NOT IMPLEMENT\" due to pending changes\n      *\n      * Let's start with Version 3 (The version found in OpenSSH) and go from\n      * there.\n     d LIBSSH2_SFTP_VERSION...\n     d                 c                   3\n\n      * Flags for open_ex().\n     d LIBSSH2_SFTP_OPENFILE...\n     d                 c                   0\n     d LIBSSH2_SFTP_OPENDIR...\n     d                 c                   1\n\n      * Flags for rename_ex().\n     d LIBSSH2_SFTP_RENAME_OVERWRITE...\n     d                 c                   X'00000001'\n     d LIBSSH2_SFTP_RENAME_ATOMIC...\n     d                 c                   X'00000002'\n     d LIBSSH2_SFTP_RENAME_NATIVE...\n     d                 c                   X'00000004'\n\n      * Flags for stat_ex().\n     d LIBSSH2_SFTP_STAT...\n     d                 c                   0\n     d LIBSSH2_SFTP_LSTAT...\n     d                 c                   1\n     d LIBSSH2_SFTP_SETSTAT...\n     d                 c                   2\n\n      * Flags for symlink_ex().\n     d LIBSSH2_SFTP_SYMLINK...\n     d                 c                   0\n     d LIBSSH2_SFTP_READLINK...\n     d                 c                   1\n     d LIBSSH2_SFTP_REALPATH...\n     d                 c                   2\n\n      * SFTP attribute flag bits.\n     d LIBSSH2_SFTP_ATTR_SIZE...\n     d                 c                   X'00000001'\n     d LIBSSH2_SFTP_ATTR_UIDGID...\n     d                 c                   X'00000002'\n     d LIBSSH2_SFTP_ATTR_PERMISSIONS...\n     d                 c                   X'00000004'\n     d LIBSSH2_SFTP_ATTR_ACMODTIME...\n     d                 c                   X'00000008'\n     d LIBSSH2_SFTP_ATTR_EXTENDED...\n     d                 c                   X'80000000'\n\n      * SFTP statvfs flag bits.\n     d LIBSSH2_SFTP_ST_RDONLY...\n     d                 c                   X'00000001'\n     d LIBSSH2_SFTP_ST_NOSUID...\n     d                 c                   X'00000002'\n\n     d #LIBSSH2_SFTP_ATTRIBUTES...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n      * If flags & ATTR_* bit is set, then the value in this struct will be\n      * meaningful Otherwise it should be ignored.\n     d  flags                              like(libssh2_Culong)\n     d  filesize                           like(libssh2_uint64_t)\n     d  uid                                like(libssh2_Culong)\n     d  gid                                like(libssh2_Culong)\n     d  permissions                        like(libssh2_Culong)\n     d  atime                              like(libssh2_Culong)\n     d  mtime                              like(libssh2_Culong)\n\n     d #LIBSSH2_SFTP_STATVFS...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n     d  f_bsize                            like(libssh2_uint64_t)               Filesys block size\n     d  f_frsize                           like(libssh2_uint64_t)               Fragment size\n     d  f_blocks                           like(libssh2_uint64_t)               FS size in f_frsize\n     d  f_bfree                            like(libssh2_uint64_t)               Free blocks\n     d  f_bavail                           like(libssh2_uint64_t)               Free blks f. nonroot\n     d  f_files                            like(libssh2_uint64_t)               Inodes\n     d  f_ffree                            like(libssh2_uint64_t)               Free inodes\n     d  f_favail                           like(libssh2_uint64_t)               Free inds f. nonroot\n     d  f_fsid                             like(libssh2_uint64_t)               File system ID\n     d  f_flag                             like(libssh2_uint64_t)               Mount flags\n     d  f_namemax                          like(libssh2_uint64_t)               Max filename length\n\n      * SFTP filetypes.\n     d LIBSSH2_SFTP_TYPE_REGULAR...\n     d                 c                   1\n     d LIBSSH2_SFTP_TYPE_DIRECTORY...\n     d                 c                   2\n     d LIBSSH2_SFTP_TYPE_SYMLINK...\n     d                 c                   3\n     d LIBSSH2_SFTP_TYPE_SPECIAL...\n     d                 c                   4\n     d LIBSSH2_SFTP_TYPE_UNKNOWN...\n     d                 c                   5\n     d LIBSSH2_SFTP_TYPE_SOCKET...\n     d                 c                   6\n     d LIBSSH2_SFTP_TYPE_CHAR_DEVICE...\n     d                 c                   7\n     d LIBSSH2_SFTP_TYPE_BLOCK_DEVICE...\n     d                 c                   8\n     d LIBSSH2_SFTP_TYPE_FIFO...\n     d                 c                   9\n\n      * Reproduce the POSIX file modes here for systems that are not POSIX\n      * compliant.\n      *\n      * These is used in \"permissions\" of \"struct _LIBSSH2_SFTP_ATTRIBUTES\"\n\n      * File type.\n     d LIBSSH2_SFTP_S_IFMT...                                                   type of file mask\n     d                 c                   X'F000'\n     d LIBSSH2_SFTP_S_IFIFO...                                                  named pipe (fifo)\n     d                 c                   X'1000'\n     d LIBSSH2_SFTP_S_IFCHR...                                                  character special\n     d                 c                   X'2000'\n     d LIBSSH2_SFTP_S_IFDIR...                                                  directory\n     d                 c                   X'4000'\n     d LIBSSH2_SFTP_S_IFBLK...                                                  block special\n     d                 c                   X'6000'\n     d LIBSSH2_SFTP_S_IFREG...                                                  regular\n     d                 c                   X'8000'\n     d LIBSSH2_SFTP_S_IFLNK...                                                  symbolic link\n     d                 c                   X'A000'\n     d LIBSSH2_SFTP_S_IFSOCK...                                                 socket\n     d                 c                   X'C000'\n\n      * File mode.\n      * Read, write, execute/search by owner.\n     d LIBSSH2_SFTP_S_IRWXU...                                                  RWX mask for owner\n     d                 c                   X'01C0'\n     d LIBSSH2_SFTP_S_IRUSR...                                                  R for owner\n     d                 c                   X'0100'\n     d LIBSSH2_SFTP_S_IWUSR...                                                  W for owner\n     d                 c                   X'0080'\n     d LIBSSH2_SFTP_S_IXUSR...                                                  X for owner\n     d                 c                   X'0040'\n      * Read, write, execute/search by group.\n     d LIBSSH2_SFTP_S_IRWXG...                                                  RWX mask for group\n     d                 c                   X'0038'\n     d LIBSSH2_SFTP_S_IRGRP...                                                  R for group\n     d                 c                   X'0020'\n     d LIBSSH2_SFTP_S_IWGRP...                                                  W for group\n     d                 c                   X'0010'\n     d LIBSSH2_SFTP_S_IXGRP...                                                  X for group\n     d                 c                   X'0008'\n      * Read, write, execute/search by others.\n     d LIBSSH2_SFTP_S_IRWXO...                                                  RWX mask for other\n     d                 c                   X'0007'\n     d LIBSSH2_SFTP_S_IROTH...                                                  R for other\n     d                 c                   X'0004'\n     d LIBSSH2_SFTP_S_IWOTH...                                                  W for other\n     d                 c                   X'0002'\n     d LIBSSH2_SFTP_S_IXOTH...                                                  X for other\n     d                 c                   X'0001'\n\n      * C macro implementation.\n     d LIBSSH2_SFTP_S_ISLNK...\n     d                 pr                  extproc('LIBSSH2_SFTP_S_ISLNK')\n     d                                     like(libssh2_Cint)\n     d  permissions                        value like(libssh2_Culong)\n\n      * C macro implementation.\n     d LIBSSH2_SFTP_S_ISREG...\n     d                 pr                  extproc('LIBSSH2_SFTP_S_ISREG')\n     d                                     like(libssh2_Cint)\n     d  permissions                        value like(libssh2_Culong)\n\n      * C macro implementation.\n     d LIBSSH2_SFTP_S_ISDIR...\n     d                 pr                  extproc('LIBSSH2_SFTP_S_ISDIR')\n     d                                     like(libssh2_Cint)\n     d  permissions                        value like(libssh2_Culong)\n\n      * C macro implementation.\n     d LIBSSH2_SFTP_S_ISCHR...\n     d                 pr                  extproc('LIBSSH2_SFTP_S_ISCHR')\n     d                                     like(libssh2_Cint)\n     d  permissions                        value like(libssh2_Culong)\n\n      * C macro implementation.\n     d LIBSSH2_SFTP_S_ISBLK...\n     d                 pr                  extproc('LIBSSH2_SFTP_S_ISBLK')\n     d                                     like(libssh2_Cint)\n     d  permissions                        value like(libssh2_Culong)\n\n      * C macro implementation.\n     d LIBSSH2_SFTP_S_ISFIFO...\n     d                 pr                  extproc('LIBSSH2_SFTP_S_ISFIFO')\n     d                                     like(libssh2_Cint)\n     d  permissions                        value like(libssh2_Culong)\n\n      * C macro implementation.\n     d LIBSSH2_SFTP_S_ISSOCK...\n     d                 pr                  extproc('LIBSSH2_SFTP_S_ISSOCK')\n     d                                     like(libssh2_Cint)\n     d  permissions                        value like(libssh2_Culong)\n\n      * SFTP File Transfer Flags -- (e.g. flags parameter to sftp_open())\n      * Danger will robinson... APPEND doesn't have any effect on OpenSSH\n      * servers.\n     d LIBSSH2_FXF_READ...\n     d                 c                   X'00000001'\n     d LIBSSH2_FXF_WRITE...\n     d                 c                   X'00000002'\n     d LIBSSH2_FXF_APPEND...\n     d                 c                   X'00000004'\n     d LIBSSH2_FXF_CREAT...\n     d                 c                   X'00000008'\n     d LIBSSH2_FXF_TRUNC...\n     d                 c                   X'00000010'\n     d LIBSSH2_FXF_EXCL...\n     d                 c                   X'00000020'\n\n      * SFTP Status Codes (returned by libssh2_sftp_last_error()).\n     d LIBSSH2_FX_OK...\n     d                 c                   0\n     d LIBSSH2_FX_EOF...\n     d                 c                   1\n     d LIBSSH2_FX_NO_SUCH_FILE...\n     d                 c                   2\n     d LIBSSH2_FX_PERMISSION_DENIED...\n     d                 c                   3\n     d LIBSSH2_FX_FAILURE...\n     d                 c                   4\n     d LIBSSH2_FX_BAD_MESSAGE...\n     d                 c                   5\n     d LIBSSH2_FX_NO_CONNECTION...\n     d                 c                   6\n     d LIBSSH2_FX_CONNECTION_LOST...\n     d                 c                   7\n     d LIBSSH2_FX_OP_UNSUPPORTED...\n     d                 c                   8\n     d LIBSSH2_FX_INVALID_HANDLE...\n     d                 c                   9\n     d LIBSSH2_FX_NO_SUCH_PATH...\n     d                 c                   10\n     d LIBSSH2_FX_FILE_ALREADY_EXISTS...\n     d                 c                   11\n     d LIBSSH2_FX_WRITE_PROTECT...\n     d                 c                   12\n     d LIBSSH2_FX_NO_MEDIA...\n     d                 c                   13\n     d LIBSSH2_FX_NO_SPACE_ON_FILESYSTEM...\n     d                 c                   14\n     d LIBSSH2_FX_QUOTA_EXCEEDED...\n     d                 c                   15\n     d LIBSSH2_FX_UNKNOWN_PRINCIPAL...\n     d                 c                   16\n     d LIBSSH2_FX_LOCK_CONFLICT...\n     d                 c                   17\n     d LIBSSH2_FX_DIR_NOT_EMPTY...\n     d                 c                   18\n     d LIBSSH2_FX_NOT_A_DIRECTORY...\n     d                 c                   19\n     d LIBSSH2_FX_INVALID_FILENAME...\n     d                 c                   20\n     d LIBSSH2_FX_LINK_LOOP...\n     d                 c                   21\n\n      * Returned by any function that would block during a read/write operation.\n     d LIBSSH2SFTP_EAGAIN...\n     d                 c                   -37\n\n      * SFTP API.\n     d libssh2_sftp_init...\n     d                 pr              *   extproc('libssh2_sftp_init')         LIBSSH2_SFTP *\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_sftp_shutdown...\n     d                 pr                  extproc('libssh2_sftp_shutdown')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n\n     d libssh2_sftp_last_error...\n     d                 pr                  extproc('libssh2_sftp_last_error')\n     d                                     like(libssh2_Culong)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n\n     d libssh2_sftp_get_channel...\n     d                 pr              *   extproc('libssh2_sftp_get_channel')  LIBSSH2_CHANNEL *\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n\n      * File / Directory Ops.\n     d libssh2_sftp_open_ex...\n     d                 pr              *   extproc('libssh2_sftp_open_ex')      LIBSSH2_SFTP_HANDLE*\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  filename                       *   value options(*string)               const char *\n     d  filename_len                       value like(libssh2_Cuint)\n     d  flags                              value like(libssh2_Culong)\n     d  mode                               value like(libssh2_Clong)\n     d  open_type                          value like(libssh2_Cint)\n\n      * C macro implementation.\n     d libssh2_sftp_open...\n     d                 pr              *   extproc('libssh2_sftp_open')         LIBSSH2_SFTP_HANDLE\n     d                                                                          *\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  filename                       *   value options(*string)               const char *\n     d  flags                              value like(libssh2_Culong)\n     d  mode                               value like(libssh2_Clong)\n\n      * C macro libssh2_sftp_opendir implementation.\n      * Renamed to avoid upper/lower case name clash.\n     d libssh2_sftp_open_dir...\n     d                 pr              *   extproc('libssh2_sftp_opendir')      LIBSSH2_SFTP_HANDLE\n     d                                                                          *\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n\n     d libssh2_sftp_read...\n     d                 pr                  extproc('libssh2_sftp_read')\n     d                                     like(libssh2_Cssize_t)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  buffer                         *   value options(*string)               char *\n     d  buffer_maxlen                      value like(libssh2_Csize_t)\n\n     d libssh2_sftp_readdir_ex...\n     d                 pr                  extproc('libssh2_sftp_readdir_ex')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  buffer                         *   value                                char *\n     d  buffer_maxlen                      value like(libssh2_Csize_t)\n     d  longentry                      *   value                                char *\n     d  longentry_maxlen...\n     d                                     value like(libssh2_Csize_t)\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n\n      * C macro implementation.\n     d libssh2_sftp_readdir...\n     d                 pr                  extproc('libssh2_sftp_readdir')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  buffer                         *   value                                char *\n     d  buffer_maxlen                      value like(libssh2_Csize_t)\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n\n     d libssh2_sftp_write...\n     d                 pr                  extproc('libssh2_sftp_write')\n     d                                     like(libssh2_Cssize_t)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  buffer                         *   value options(*string)               const char *\n     d  count                              value like(libssh2_Csize_t)\n\n     d libssh2_sftp_fsync...\n     d                 pr                  extproc('libssh2_sftp_fsync')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n\n     d libssh2_sftp_close_handle...\n     d                 pr                  extproc('libssh2_sftp_close_handle')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n\n      * C macro implementation.\n     d libssh2_sftp_close...\n     d                 pr                  extproc('libssh2_sftp_close_handle')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n\n      * C macro implementation.\n     d libssh2_sftp_closedir...\n     d                 pr                  extproc('libssh2_sftp_close_handle')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n\n     d libssh2_sftp_seek...\n     d                 pr                  extproc('libssh2_sftp_seek')\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  offset                             value like(libssh2_Csize_t)\n\n     d libssh2_sftp_seek64...\n     d                 pr                  extproc('libssh2_sftp_seek64')\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  offset                             value like(libssh2_uint64_t)\n\n      * C macro implementation.\n     d libssh2_sftp_rewind...\n     d                 pr                  extproc('libssh2_sftp_rewind')\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n\n     d libssh2_sftp_tell...\n     d                 pr                  extproc('libssh2_sftp_tell')\n     d                                     like(libssh2_Csize_t)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n\n     d libssh2_sftp_tell64...\n     d                 pr                  extproc('libssh2_sftp_tell64')\n     d                                     like(libssh2_uint64_t)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n\n     d libssh2_sftp_fstat_ex...\n     d                 pr                  extproc('libssh2_sftp_fstat_ex')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n     d  setstat                            value like(libssh2_Cint)\n\n      * C macro implementation.\n     d libssh2_sftp_fstat...\n     d                 pr                  extproc('libssh2_sftp_fstat')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n\n      * C macro implementation.\n     d libssh2_sftp_fsetstat...\n     d                 pr                  extproc('libssh2_sftp_fsetstat')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n\n      * Miscellaneous Ops.\n     d libssh2_sftp_rename_ex...\n     d                 pr                  extproc('libssh2_sftp_rename_ex')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  source_filename...\n     d                                 *   value options(*string)               const char *\n     d  source_filename_len...\n     d                                     value like(libssh2_Cuint)\n     d  dest_filename                  *   value options(*string)               const char *\n     d  dest_filename_len...\n     d                                     value like(libssh2_Cuint)\n     d  flags                              value like(libssh2_Clong)\n\n      * C macro implementation.\n     d libssh2_sftp_rename...\n     d                 pr                  extproc('libssh2_sftp_rename')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  source_filename...\n     d                                 *   value options(*string)               const char *\n     d  dest_filename                  *   value options(*string)               const char *\n\n     d libssh2_sftp_unlink_ex...\n     d                 pr                  extproc('libssh2_sftp_unlink_ex')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  filename                       *   value options(*string)               const char *\n     d  filename_len                       value like(libssh2_Cuint)\n\n      * C macro implementation.\n     d libssh2_sftp_unlink...\n     d                 pr                  extproc('libssh2_sftp_unlink')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  filename                       *   value options(*string)               const char *\n\n     d libssh2_sftp_fstatvfs...\n     d                 pr                  extproc('libssh2_sftp_fstatvfs')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  st                             *   value                                LIBSSH2_SFTP_STATVFS\n     d                                                                          *\n\n     d libssh2_sftp_statvfs...\n     d                 pr                  extproc('libssh2_sftp_statvfs')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  path_len                           value like(libssh2_Csize_t)\n     d  st                             *   value                                LIBSSH2_SFTP_STATVFS\n     d                                                                          *\n\n     d libssh2_sftp_mkdir_ex...\n     d                 pr                  extproc('libssh2_sftp_mkdir_ex')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  path_len                           value like(libssh2_Cuint)\n     d  mode                               value like(libssh2_Clong)\n\n      * C macro implementation.\n     d libssh2_sftp_mkdir...\n     d                 pr                  extproc('libssh2_sftp_mkdir')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  mode                               value like(libssh2_Clong)\n\n     d libssh2_sftp_rmdir_ex...\n     d                 pr                  extproc('libssh2_sftp_rmdir_ex')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  path_len                           value like(libssh2_Cuint)\n\n      * C macro implementation.\n     d libssh2_sftp_rmdir...\n     d                 pr                  extproc('libssh2_sftp_rmdir')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n\n     d libssh2_sftp_stat_ex...\n     d                 pr                  extproc('libssh2_sftp_stat_ex')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  path_len                           value like(libssh2_Cuint)\n     d  stat_type                          value like(libssh2_Cint)\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n\n      * C macro libssh2_sftp_stat implementation.\n      * Renamed to avoid upper/lower case name clash.\n     d libssh2_sftp_get_stat...\n     d                 pr                  extproc('libssh2_sftp_stat')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n\n      * C macro libssh2_sftp_lstat implementation.\n      * Renamed to avoid upper/lower case name clash.\n     d libssh2_sftp_get_lstat...\n     d                 pr                  extproc('libssh2_sftp_lstat')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n\n      * C macro libssh2_sftp_setstat implementation.\n      * Renamed to avoid upper/lower case name clash.\n     d libssh2_sftp_set_stat...\n     d                 pr                  extproc('libssh2_sftp_setstat')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n\n     d libssh2_sftp_symlink_ex...\n     d                 pr                  extproc('libssh2_sftp_symlink_ex')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  path_len                           value like(libssh2_Cuint)\n     d  target                         *   value options(*string)               char *\n     d  target_len                         value like(libssh2_Cuint)\n     d  link_type                          value like(libssh2_Cint)\n\n      * C macro libssh2_sftp_symlink implementation.\n      * Renamed to avoid upper/lower case name clash.\n     d libssh2_sftp_sym_link...\n     d                 pr                  extproc('libssh2_sftp_symlink')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  orig                           *   value options(*string)               const char *\n     d  linkpath                       *   value options(*string)               char *\n\n      * C macro libssh2_sftp_readlink implementation.\n      * Renamed to avoid upper/lower case name clash.\n     d libssh2_sftp_read_link...\n     d                 pr                  extproc('libssh2_sftp_readlink')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  target                         *   value                                char *\n     d  maxlen                             value like(libssh2_Cuint)\n\n      * C macro libssh2_sftp_realpath implementation.\n      * Renamed to avoid upper/lower case name clash.\n     d libssh2_sftp_real_path...\n     d                 pr                  extproc('libssh2_sftp_realpath')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  target                         *   value                                char *\n     d  maxlen                             value like(libssh2_Cuint)\n\n      /endif                                                                    LIBSSH2_SFTP_H_\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/macros.h",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_MACROS_H_\n#define LIBSSH2_MACROS_H_\n\n#include \"libssh2.h\"\n#include \"libssh2_publickey.h\"\n#include \"libssh2_sftp.h\"\n\n/*\n * Dummy prototypes to generate wrapper procedures to C macros.\n * This is a helper for languages without a clever preprocessor (ILE/RPG).\n */\n\nLIBSSH2_API LIBSSH2_SESSION * libssh2_session_init(void);\nLIBSSH2_API int libssh2_session_disconnect(LIBSSH2_SESSION *session,\n                                           const char *description);\nLIBSSH2_API int libssh2_userauth_password(LIBSSH2_SESSION *session,\n                                          const char *username,\n                                          const char *password);\nLIBSSH2_API int\nlibssh2_userauth_publickey_fromfile(LIBSSH2_SESSION *session,\n                                    const char *username,\n                                    const char *publickey,\n                                    const char *privatekey,\n                                    const char *passphrase);\nLIBSSH2_API int\nlibssh2_userauth_hostbased_fromfile(LIBSSH2_SESSION *session,\n                                    const char *username,\n                                    const char *publickey,\n                                    const char *privatekey,\n                                    const char *passphrase,\n                                    const char *hostname);\nLIBSSH2_API int\nlibssh2_userauth_keyboard_interactive(LIBSSH2_SESSION* session,\n                                      const char *username,\n                                      LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC(\n                                                       (*response_callback)));\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_open_session(LIBSSH2_SESSION *session);\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_direct_tcpip(LIBSSH2_SESSION *session, const char *host,\n                             int port);\nLIBSSH2_API LIBSSH2_LISTENER *\nlibssh2_channel_forward_listen(LIBSSH2_SESSION *session, int port);\nLIBSSH2_API int\nlibssh2_channel_setenv(LIBSSH2_CHANNEL *channel,\n                       const char *varname, const char *value);\nLIBSSH2_API int\nlibssh2_channel_request_pty(LIBSSH2_CHANNEL *channel, const char *term);\nLIBSSH2_API int\nlibssh2_channel_request_pty_size(LIBSSH2_CHANNEL *channel,\n                                 int width, int height);\nLIBSSH2_API int\nlibssh2_channel_x11_req(LIBSSH2_CHANNEL *channel, int screen_number);\nLIBSSH2_API int\nlibssh2_channel_shell(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int\nlibssh2_channel_exec(LIBSSH2_CHANNEL *channel, const char *command);\nLIBSSH2_API int\nlibssh2_channel_subsystem(LIBSSH2_CHANNEL *channel, const char *subsystem);\nLIBSSH2_API ssize_t\nlibssh2_channel_read(LIBSSH2_CHANNEL *channel, char *buf, size_t buflen);\nLIBSSH2_API ssize_t\nlibssh2_channel_read_stderr(LIBSSH2_CHANNEL *channel, char *buf, size_t buflen);\nLIBSSH2_API unsigned long\nlibssh2_channel_window_read(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API ssize_t\nlibssh2_channel_write(LIBSSH2_CHANNEL *channel, const char *buf, size_t buflen);\nLIBSSH2_API ssize_t\nlibssh2_channel_write_stderr(LIBSSH2_CHANNEL *channel,\n                             const char *buf, size_t buflen);\nLIBSSH2_API unsigned long\nlibssh2_channel_window_write(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_flush(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_flush_stderr(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_scp_send(LIBSSH2_SESSION *session,\n                 const char *path, int mode, libssh2_int64_t size);\n\nLIBSSH2_API int\nlibssh2_publickey_add(LIBSSH2_PUBLICKEY *pkey, const unsigned char *name,\n\t\t      const unsigned char *blob, unsigned long blob_len,\n                      char overwrite, unsigned long num_attrs,\n\t\t      const libssh2_publickey_attribute attrs[]);\nLIBSSH2_API int\nlibssh2_publickey_remove(LIBSSH2_PUBLICKEY *pkey, const unsigned char *name,\n                         const unsigned char *blob, unsigned long blob_len);\n\nLIBSSH2_API int LIBSSH2_SFTP_S_ISLNK(unsigned long permissions);\nLIBSSH2_API int LIBSSH2_SFTP_S_ISREG(unsigned long permissions);\nLIBSSH2_API int LIBSSH2_SFTP_S_ISDIR(unsigned long permissions);\nLIBSSH2_API int LIBSSH2_SFTP_S_ISCHR(unsigned long permissions);\nLIBSSH2_API int LIBSSH2_SFTP_S_ISBLK(unsigned long permissions);\nLIBSSH2_API int LIBSSH2_SFTP_S_ISFIFO(unsigned long permissions);\nLIBSSH2_API int LIBSSH2_SFTP_S_ISSOCK(unsigned long permissions);\nLIBSSH2_API LIBSSH2_SFTP_HANDLE *\nlibssh2_sftp_open(LIBSSH2_SFTP *sftp, const char *filename,\n                  unsigned long flags, long mode);\nLIBSSH2_API LIBSSH2_SFTP_HANDLE *\nlibssh2_sftp_opendir(LIBSSH2_SFTP *sftp, const char *path);\nLIBSSH2_API int libssh2_sftp_readdir(LIBSSH2_SFTP_HANDLE *handle,\n                                     char *buffer, size_t buffer_maxlen,\n                                     LIBSSH2_SFTP_ATTRIBUTES *attrs);\nLIBSSH2_API int libssh2_sftp_close(LIBSSH2_SFTP_HANDLE *handle);\nLIBSSH2_API int libssh2_sftp_closedir(LIBSSH2_SFTP_HANDLE *handle);\nLIBSSH2_API void libssh2_sftp_rewind(LIBSSH2_SFTP_HANDLE *handle);\nLIBSSH2_API int libssh2_sftp_fstat(LIBSSH2_SFTP_HANDLE *handle,\n                                   LIBSSH2_SFTP_ATTRIBUTES *attrs);\nLIBSSH2_API int libssh2_sftp_fsetstat(LIBSSH2_SFTP_HANDLE *handle,\n                                      LIBSSH2_SFTP_ATTRIBUTES *attrs);\nLIBSSH2_API int libssh2_sftp_rename(LIBSSH2_SFTP *sftp,\n                                    const char *source_filename,\n                                    const char *dest_filename);\nLIBSSH2_API int libssh2_sftp_unlink(LIBSSH2_SFTP *sftp, const char *filename);\nLIBSSH2_API int libssh2_sftp_mkdir(LIBSSH2_SFTP *sftp,\n                                   const char *path, long mode);\nLIBSSH2_API int libssh2_sftp_rmdir(LIBSSH2_SFTP *sftp, const char *path);\nLIBSSH2_API int libssh2_sftp_stat(LIBSSH2_SFTP *sftp, const char *path,\n                                  LIBSSH2_SFTP_ATTRIBUTES *attrs);\nLIBSSH2_API int libssh2_sftp_lstat(LIBSSH2_SFTP *sftp, const char *path,\n                                   LIBSSH2_SFTP_ATTRIBUTES *attrs);\nLIBSSH2_API int libssh2_sftp_setstat(LIBSSH2_SFTP *sftp, const char *path,\n                                     LIBSSH2_SFTP_ATTRIBUTES *attrs);\nLIBSSH2_API int libssh2_sftp_symlink(LIBSSH2_SFTP *sftp, const char *orig,\n                                     char *linkpath);\nLIBSSH2_API int libssh2_sftp_readlink(LIBSSH2_SFTP *sftp, const char *path,\n                                      char *target, unsigned int maxlen);\nLIBSSH2_API int libssh2_sftp_realpath(LIBSSH2_SFTP *sftp, const char *path,\n                                      char *target, unsigned int maxlen);\n\n#endif\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/make-include.sh",
    "content": "#!/bin/sh\n#\n#       Installation of the header files in the OS/400 library.\n#\n\nSCRIPTDIR=`dirname \"${0}\"`\n. \"${SCRIPTDIR}/initscript.sh\"\ncd \"${TOPDIR}/include\"\n\n\n#       Create the OS/400 source program file for the header files.\n\nSRCPF=\"${LIBIFSNAME}/H.FILE\"\n\nif action_needed \"${SRCPF}\"\nthen    CMD=\"CRTSRCPF FILE(${TARGETLIB}/H) RCDLEN(112)\"\n        CMD=\"${CMD} CCSID(${TGTCCSID}) TEXT('libssh2: Header files')\"\n        system \"${CMD}\"\nfi\n\n\n#       Create the IFS directory for the header files.\n\nIFSINCLUDE=\"${IFSDIR}/include\"\n\nif action_needed \"${IFSINCLUDE}\"\nthen    mkdir -p \"${IFSINCLUDE}\"\nfi\n\n\ncopy_hfile()\n\n{\n        destfile=\"${1}\"\n        srcfile=\"${2}\"\n        shift\n        shift\n        sed -e '1i\\\n#pragma datamodel(P128)\\\n' \"${@}\" -e '$a\\\n#pragma datamodel(pop)\\\n' < \"${srcfile}\" > \"${destfile}\"\n}\n\n#       Copy the header files.\n\nfor HFILE in *.h \"${TOPDIR}/os400/libssh2_ccsid.h\"\ndo      DEST=\"${SRCPF}/`db2_name \\\"${HFILE}\\\"`.MBR\"\n\n        if action_needed \"${DEST}\" \"${HFILE}\"\n        then    copy_hfile \"${DEST}\" \"${HFILE}\"\n                IFSDEST=\"${IFSINCLUDE}/`basename \\\"${HFILE}\\\"`\"\n                rm -f \"${IFSDEST}\"\n                ln -s \"${DEST}\" \"${IFSDEST}\"\n        fi\ndone\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/make-rpg.sh",
    "content": "#!/bin/sh\n#\n#       Installation of the ILE/RPG header files in the OS/400 library.\n#\n\nSCRIPTDIR=`dirname \"${0}\"`\n. \"${SCRIPTDIR}/initscript.sh\"\ncd \"${TOPDIR}/os400/libssh2rpg\"\n\n\n#       Create the OS/400 source program file for the ILE/RPG header files.\n\nSRCPF=\"${LIBIFSNAME}/LIBSSH2RPG.FILE\"\n\nif action_needed \"${SRCPF}\"\nthen    CMD=\"CRTSRCPF FILE(${TARGETLIB}/LIBSSH2RPG) RCDLEN(112)\"\n        CMD=\"${CMD} CCSID(${TGTCCSID}) TEXT('libssh2: ILE/RPG header files')\"\n        system \"${CMD}\"\nfi\n\n\n#       Map file names to DB2 name syntax.\n\nfor HFILE in *.rpgle *.rpgle.in\ndo      NAME=\"`basename \\\"${HFILE}\\\" .in`\"\n        VAR=\"`basename \\\"${NAME}\\\" .rpgle`\"\n        VAL=\"`db2_name \\\"${NAME}\\\"`\"\n\n        eval \"VAR_${VAR}=\\\"${VAL}\\\"\"\n        echo \"${VAR} s/${VAR}/${VAL}/g\"\ndone > tmpsubstfile1\n\n#       Order substitution commands so that a prefix appears after all\n#               file names beginning with the prefix.\n\nsort -r tmpsubstfile1 | sed 's/^[^ ]*[ ]*//' > tmpsubstfile2\n\n\nchange_include()\n\n{\n        sed -e '\\#^....../include  *\"libssh2rpg/#{'                     \\\n            -e 's///'                                                   \\\n            -e 's/\".*//'                                                \\\n            -f tmpsubstfile2                                            \\\n            -e 's#.*#      /include libssh2rpg,&#'                      \\\n            -e '}'\n}\n\n\n#       Create the IFS directory for the ILE/RPG header files.\n\nRPGIFSDIR=\"${IFSDIR}/include/libssh2rpg\"\n\nif action_needed \"${RPGIFSDIR}\"\nthen    mkdir -p \"${RPGIFSDIR}\"\nfi\n\n#       Copy the header files to IFS ILE/RPG include directory.\n#       Copy them with include path editing to the DB2 library.\n\nfor HFILE in *.rpgle *.rpgle.in\ndo      IFSCMD=\"cat \\\"${HFILE}\\\"\"\n        DB2CMD=\"change_include < \\\"${HFILE}\\\"\"\n        IFSFILE=\"`basename \\\"${HFILE}\\\" .in`\"\n\n        case \"${HFILE}\" in\n\n        *.in)   IFSCMD=\"${IFSCMD} | versioned_copy\"\n                DB2CMD=\"${DB2CMD} | versioned_copy\"\n                ;;\n        esac\n\n        IFSDEST=\"${RPGIFSDIR}/${IFSFILE}\"\n\n        if action_needed \"${IFSDEST}\" \"${HFILE}\"\n        then    eval \"${IFSCMD}\" > \"${IFSDEST}\"\n        fi\n\n        eval DB2MBR=\"\\\"\\${VAR_`basename \\\"${IFSDEST}\\\" .rpgle`}\\\"\"\n        DB2DEST=\"${SRCPF}/${DB2MBR}.MBR\"\n\n        if action_needed \"${DB2DEST}\" \"${HFILE}\"\n        then    eval \"${DB2CMD}\" | change_include > tmphdrfile\n\n                #       Need to translate to target CCSID.\n\n                CMD=\"CPY OBJ('`pwd`/tmphdrfile') TOOBJ('${DB2DEST}')\"\n                CMD=\"${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)\"\n                system \"${CMD}\"\n        fi\ndone\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/make-src.sh",
    "content": "#!/bin/sh\n#\n#       libssh2 compilation script for the OS/400.\n#\n\nSCRIPTDIR=`dirname \"${0}\"`\n. \"${SCRIPTDIR}/initscript.sh\"\ncd \"${TOPDIR}/src\"\n\n\n#       Function to extract external prototypes from header files.\n#       Input: concatenated header files.\n#       Output: external prototypes, one per (long) line.\n\nextproto()\n{\n        sed -e 'x;G;s/^\\n//;s/\\n/ /g'                                   \\\n            -e 's#[[:space:]]*/\\*[^*]*\\(\\*\\([^/*][^*]*\\)\\{0,1\\}\\)*\\*/[[:space:]]*##g' \\\n            -e 'h'                                                      \\\n            -e '/\\/\\*/!{'                                               \\\n            -e '/^#/{s/^.*[^\\\\]$//;h;d'                                 \\\n            -e '}'                                                      \\\n            -e 's/[{}]/;/g;s/\\\\$//'                                     \\\n            -e ':loop1'                                                 \\\n            -e '/;/{'                                                   \\\n            -e 's/^[^;]*;//;x;s/;.*//'                                  \\\n            -e '/^[[:space:]]*LIBSSH2_API[[:space:]].*(/{'              \\\n            -e 's/^[[:space:]]*LIBSSH2_API[[:space:]]*//'               \\\n            -e 's/[[:space:]]*$//'                                      \\\n            -e 's/[[:space:]][[:space:]]*/ /g'                          \\\n            -e 'p'                                                      \\\n            -e '}'                                                      \\\n            -e 'g;bloop1'                                               \\\n            -e '}'                                                      \\\n            -e '}'                                                      \\\n            -n\n}\n\n#       Need to have IFS access to the mih/modasa header file.\n\nif action_needed modasa.mih '/QSYS.LIB/QSYSINC.LIB/MIH.FILE/MODASA.MBR'\nthen    rm -f modasa.mih\n        ln -s '/QSYS.LIB/QSYSINC.LIB/MIH.FILE/MODASA.MBR' modasa.mih\nfi\n\n\n#      Create and compile the identification source file.\n\necho '#pragma comment(user, \"libssh2 version '\"${LIBSSH2_VERSION}\"'\")' > os400.c\necho '#pragma comment(user, __DATE__)' >> os400.c\necho '#pragma comment(user, __TIME__)' >> os400.c\necho '#pragma comment(copyright, \"See COPYING file. OS/400 version by P. Monnerat\")' >> os400.c\nmake_module     OS400           os400.c\nLINK=                           # No need to rebuild service program yet.\nMODULES=\n\n\n#       Generate the procedures implementing macros.\n\nif action_needed macros.c \"${TOPDIR}/os400/macros.h\"\nthen    (\n                echo '#include \"libssh2_publickey.h\"'\n                echo '#include \"libssh2_sftp.h\"'\n                extproto < \"${TOPDIR}/os400/macros.h\"                   |\n                sed -e 'h;s/^[^(]*[ *]\\([^ (]*\\) *(.*/\\1/'              \\\n                    -e 's/.*/#pragma map(_&, \"&\")/;p'                   \\\n                    -e 'g;s/^\\([^(]*[ *]\\)\\([^ (]*\\)\\( *(.*\\)/\\1_\\2\\3 {/;p' \\\n                    -e 'g;s/^[^(]*(\\(.*\\))$/,\\1,/;s/[^A-Za-z0-9_,]/ /g' \\\n                    -e 's/  *,/,/g;s/,[^,]* \\([^ ,]*\\)/,\\1/g'           \\\n                    -e 's/ //g;s/^,void,$/,,/'                          \\\n                    -e 's/^,\\(.*\\),$/(\\1); }/;s/,/, /g'                 \\\n                    -e 'x;s/(.*//;s/ *$//;G;s/\\n//g'                    \\\n                    -e 's/^void\\([ *]\\)/\\1/;s/^ *//'                    \\\n                    -e 's/^[^(]*[ *]\\([A-Za-z][A-Za-z0-9_]* *(\\)/return \\1/' \\\n                    -e 's/.*/    &/'\n        ) > macros.c\nfi\n\n#       Get source list.\n\ncat ../Makefile.inc ../Makefile.os400qc3.inc                            |\n  sed -e ':begin'                                                       \\\n    -e '/\\\\$/{'                                                         \\\n    -e 's/\\\\$/ /'                                                       \\\n    -e 'N'                                                              \\\n    -e 'bbegin'                                                         \\\n    -e '}'                                                              \\\n    -e 's/\\n//g'                                                        \\\n    -e 's/[[:space:]]*$//'                                              \\\n    -e 's/^\\([A-Za-z][A-Za-z0-9_]*\\)[[:space:]]*=[[:space:]]*\\(.*\\)/\\1=\"\\2\"/' \\\n    -e 's/\\$(\\([A-Za-z][A-Za-z0-9_]*\\))/${\\1}/g'                        \\\n        > tmpscript.sh\n. ./tmpscript.sh\n\n\n#       Compile the sources into modules.\n\nINCLUDES=\"'`pwd`'\"\n\nfor SRC in \"${TOPDIR}/os400/os400sys.c\" \"${TOPDIR}/os400/ccsid.c\"       \\\n           ${CSOURCES} ${CRYPTO_CSOURCES} macros.c\ndo      MODULE=`db2_name \"${SRC}\"`\n        make_module \"${MODULE}\" \"${SRC}\"\ndone\n\n\n#       If needed, (re)create the static binding directory.\n\nif action_needed \"${LIBIFSNAME}/${STATBNDDIR}.BNDDIR\"\nthen    LINK=YES\nfi\n\nif [ \"${LINK}\" ]\nthen    rm -rf \"${LIBIFSNAME}/${STATBNDDIR}.BNDDIR\"\n        CMD=\"CRTBNDDIR BNDDIR(${TARGETLIB}/${STATBNDDIR})\"\n        CMD=\"${CMD} TEXT('libssh2 API static binding directory')\"\n        system \"${CMD}\"\n\n        for MODULE in ${MODULES}\n        do      CMD=\"ADDBNDDIRE BNDDIR(${TARGETLIB}/${STATBNDDIR})\"\n                CMD=\"${CMD} OBJ((${TARGETLIB}/${MODULE} *MODULE))\"\n                system \"${CMD}\"\n        done\n\n#       V6R1M0 does not list system service program QC3PBEXT in the\n#       implicit binding directory: thus we add it here in ours.\n\n        CMD=\"ADDBNDDIRE BNDDIR(${TARGETLIB}/${STATBNDDIR})\"\n        CMD=\"${CMD} OBJ((QSYS/QC3PBEXT *SRVPGM))\"\n        system \"${CMD}\"\nfi\n\n\n#       The exportation file for service program creation must be in a DB2\n#               source file, so make sure it exists.\n\nif action_needed \"${LIBIFSNAME}/TOOLS.FILE\"\nthen    CMD=\"CRTSRCPF FILE(${TARGETLIB}/TOOLS) RCDLEN(112)\"\n        CMD=\"${CMD} TEXT('libssh2: build tools')\"\n        system \"${CMD}\"\nfi\n\n\n#       Gather the list of symbols to export.\n\nEXPORTS=`cat \"${TOPDIR}\"/include/*.h \"${TOPDIR}/os400/macros.h\"         \\\n             \"${TOPDIR}/os400/libssh2_ccsid.h\"                          |\n         extproto                                                       |\n         sed -e 's/(.*//;s/[^A-Za-z0-9_]/ /g;s/ *$//;s/^.* //'`\n\n#       Create the service program exportation file in DB2 member if needed.\n\nBSF=\"${LIBIFSNAME}/TOOLS.FILE/BNDSRC.MBR\"\n\nif action_needed \"${BSF}\" Makefile.am\nthen    LINK=YES\nfi\n\nif [ \"${LINK}\" ]\nthen    echo \" STRPGMEXP PGMLVL(*CURRENT) SIGNATURE('LIBSSH2_${SONAME}')\" \\\n            > \"${BSF}\"\n        for EXPORT in ${EXPORTS}\n        do      echo ' EXPORT    SYMBOL(\"'\"${EXPORT}\"'\")' >> \"${BSF}\"\n        done\n\n        echo ' ENDPGMEXP' >> \"${BSF}\"\nfi\n\n\n#       Build the service program if needed.\n\nif action_needed \"${LIBIFSNAME}/${SRVPGM}.SRVPGM\"\nthen    LINK=YES\nfi\n\nif [ \"${LINK}\" ]\nthen    CMD=\"CRTSRVPGM SRVPGM(${TARGETLIB}/${SRVPGM})\"\n        CMD=\"${CMD} SRCFILE(${TARGETLIB}/TOOLS) SRCMBR(BNDSRC)\"\n        CMD=\"${CMD} MODULE(${TARGETLIB}/OS400)\"\n        CMD=\"${CMD} BNDDIR(${TARGETLIB}/${STATBNDDIR}\"\n        if [ \"${WITH_ZLIB}\" != 0 ]\n        then    CMD=\"${CMD} ${ZLIB_LIB}/${ZLIB_BNDDIR}\"\n                liblist -a \"${ZLIB_LIB}\"\n        fi\n        CMD=\"${CMD})\"\n        CMD=\"${CMD} BNDSRVPGM(QADRTTS)\"\n        CMD=\"${CMD} TEXT('libssh2 API library')\"\n        CMD=\"${CMD} TGTRLS(${TGTRLS})\"\n        system \"${CMD}\"\n        LINK=YES\nfi\n\n\n#       If needed, (re)create the dynamic binding directory.\n\nif action_needed \"${LIBIFSNAME}/${DYNBNDDIR}.BNDDIR\"\nthen    LINK=YES\nfi\n\nif [ \"${LINK}\" ]\nthen    rm -rf \"${LIBIFSNAME}/${DYNBNDDIR}.BNDDIR\"\n        CMD=\"CRTBNDDIR BNDDIR(${TARGETLIB}/${DYNBNDDIR})\"\n        CMD=\"${CMD} TEXT('libssh2 API dynamic binding directory')\"\n        system \"${CMD}\"\n        CMD=\"ADDBNDDIRE BNDDIR(${TARGETLIB}/${DYNBNDDIR})\"\n        CMD=\"${CMD} OBJ((*LIBL/${SRVPGM} *SRVPGM))\"\n        system \"${CMD}\"\nfi\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/make.sh",
    "content": "#!/bin/sh\n#\n#       libssh2 compilation script for the OS/400.\n#\n#\n#       This is a shell script since make is not a standard component of OS/400.\n\nSCRIPTDIR=`dirname \"${0}\"`\n. \"${SCRIPTDIR}/initscript.sh\"\ncd \"${TOPDIR}\"\n\n\n#       Create the OS/400 library if it does not exist.\n\nif action_needed \"${LIBIFSNAME}\"\nthen    CMD=\"CRTLIB LIB(${TARGETLIB}) TEXT('libssh2: SSH2 protocol API')\"\n        system \"${CMD}\"\nfi\n\n\n#       Create the DOCS source file if it does not exist.\n\nif action_needed \"${LIBIFSNAME}/DOCS.FILE\"\nthen    CMD=\"CRTSRCPF FILE(${TARGETLIB}/DOCS) RCDLEN(240)\"\n        CMD=\"${CMD} CCSID(${TGTCCSID}) TEXT('Documentation texts')\"\n        system \"${CMD}\"\nfi\n\n\n#       Copy some documentation files if needed.\n\nfor TEXT in \"${TOPDIR}/COPYING\" \"${SCRIPTDIR}/README400\"                \\\n    \"${TOPDIR}/NEWS\" \"${TOPDIR}/README\" \"${TOPDIR}/docs/AUTHORS\"        \\\n    \"${TOPDIR}/docs/BINDINGS\"\ndo      MEMBER=\"${LIBIFSNAME}/DOCS.FILE/`db2_name \\\"${TEXT}\\\"`.MBR\"\n\n        if action_needed \"${MEMBER}\" \"${TEXT}\"\n        then    CMD=\"CPY OBJ('${TEXT}') TOOBJ('${MEMBER}') TOCCSID(${TGTCCSID})\"\n                CMD=\"${CMD} DTAFMT(*TEXT) REPLACE(*YES)\"\n                system \"${CMD}\"\n        fi\ndone\n\n\n#       Build in each directory.\n\nfor SUBDIR in include rpg src\ndo      \"${SCRIPTDIR}/make-${SUBDIR}.sh\"\ndone\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/os400/os400sys.c",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* OS/400 additional support. */\n\n#define LIBSSH2_DISABLE_QADRT_EXT\n\n#include \"libssh2_priv.h\"\n\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <sys/un.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <stddef.h>\n#include <stdarg.h>\n#include <string.h>\n#include <alloca.h>\n#include <netdb.h>\n#include <qadrt.h>\n#include <errno.h>\n\n#include <netinet/in.h>\n#include <arpa/inet.h>\n\n#ifdef LIBSSH2_HAVE_ZLIB\n# include <zlib.h>\n#endif\n\n\n/**\n***     QADRT OS/400 ASCII runtime defines only the most used procedures, but\n***             a lot of them are not supported. This module implements\n***             ASCII wrappers for those that are used by libssh2, but not\n***             defined by QADRT.\n**/\n\n#pragma convert(37)                             /* Restore EBCDIC. */\n\n\nstatic int\nconvert_sockaddr(struct sockaddr_storage * dstaddr,\n                                const struct sockaddr * srcaddr, int srclen)\n\n{\n  const struct sockaddr_un * srcu;\n  struct sockaddr_un * dstu;\n  unsigned int i;\n  unsigned int dstsize;\n\n  /* Convert a socket address into job CCSID, if needed. */\n\n  if(!srcaddr || srclen < offsetof(struct sockaddr, sa_family) +\n     sizeof srcaddr->sa_family || srclen > sizeof *dstaddr) {\n    errno = EINVAL;\n    return -1;\n    }\n\n  memcpy((char *) dstaddr, (char *) srcaddr, srclen);\n\n  switch (srcaddr->sa_family) {\n\n  case AF_UNIX:\n    srcu = (const struct sockaddr_un *) srcaddr;\n    dstu = (struct sockaddr_un *) dstaddr;\n    dstsize = sizeof *dstaddr - offsetof(struct sockaddr_un, sun_path);\n    srclen -= offsetof(struct sockaddr_un, sun_path);\n    i = QadrtConvertA2E(dstu->sun_path, srcu->sun_path, dstsize - 1, srclen);\n    dstu->sun_path[i] = '\\0';\n    i += offsetof(struct sockaddr_un, sun_path);\n    srclen = i;\n    }\n\n  return srclen;\n}\n\n\nint\n_libssh2_os400_connect(int sd, struct sockaddr * destaddr, int addrlen)\n\n{\n  int i;\n  struct sockaddr_storage laddr;\n\n  i = convert_sockaddr(&laddr, destaddr, addrlen);\n\n  if(i < 0)\n    return -1;\n\n  return connect(sd, (struct sockaddr *) &laddr, i);\n}\n\n\nint\n_libssh2_os400_vsnprintf(char *dst, size_t len, const char *fmt, va_list args)\n{\n    size_t l = 4096;\n    int i;\n    char *buf;\n\n    if (!dst || !len) {\n        errno = EINVAL;\n        return -1;\n    }\n\n    if (l < len)\n        l = len;\n\n    buf = alloca(l);\n\n    if (!buf) {\n        errno = ENOMEM;\n        return -1;\n    }\n\n    i = vsprintf(buf, fmt, args);\n\n    if (i < 0)\n        return i;\n\n    if (--len > i)\n        len = i;\n\n    if (len)\n        memcpy(dst, buf, len);\n\n    dst[len] = '\\0';\n    return len;\n}\n\n/* VARARGS3 */\nint\n_libssh2_os400_snprintf(char *dst, size_t len, const char *fmt, ...)\n{\n    va_list args;\n    int ret;\n\n    va_start(args, fmt);\n    ret = _libssh2_os400_vsnprintf(dst, len, fmt, args);\n    va_end(args);\n    return ret;\n}\n\n\n#ifdef LIBSSH2_HAVE_ZLIB\nint\n_libssh2_os400_inflateInit_(z_streamp strm,\n                            const char *version, int stream_size)\n{\n    char *ebcversion;\n    int i;\n\n    if (!version)\n        return Z_VERSION_ERROR;\n    i = strlen(version);\n    ebcversion = alloca(i + 1);\n    if (!ebcversion)\n        return Z_VERSION_ERROR;\n    i = QadrtConvertA2E(ebcversion, version, i, i - 1);\n    ebcversion[i] = '\\0';\n    return inflateInit_(strm, ebcversion, stream_size);\n}\n\nint\n_libssh2_os400_deflateInit_(z_streamp strm, int level,\n                            const char *version, int stream_size)\n{\n    char *ebcversion;\n    int i;\n\n    if (!version)\n        return Z_VERSION_ERROR;\n    i = strlen(version);\n    ebcversion = alloca(i + 1);\n    if (!ebcversion)\n        return Z_VERSION_ERROR;\n    i = QadrtConvertA2E(ebcversion, version, i, i - 1);\n    ebcversion[i] = '\\0';\n    return deflateInit_(strm, level, ebcversion, stream_size);\n}\n\n#endif\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/.gitignore",
    "content": "libssh2_config.h\nlibssh2_config.h.in\nstamp-h1\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/CMakeLists.txt",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\ninclude(CheckFunctionExists)\ninclude(CheckSymbolExists)\ninclude(CheckFunctionExistsMayNeedLibrary)\ninclude(CheckIncludeFiles)\ninclude(CheckTypeSize)\ninclude(CheckSymbolExists)\ninclude(CheckNonblockingSocketSupport)\ninclude(SocketLibraries)\n\n## Cryptography backend choice\n\nset(CRYPTO_BACKEND\n  \"\"\n  CACHE\n  STRING\n  \"The backend to use for cryptography: OpenSSL, Libgcrypt or WinCNG,\nor empty to try any available\")\n\n# If the crypto backend was given, rather than searching for the first\n# we are able to find, the find_package commands must abort configuration\n# and report to the user.\nif(CRYPTO_BACKEND)\n  set(SPECIFIC_CRYPTO_REQUIREMENT REQUIRED)\nendif()\n\nif(CRYPTO_BACKEND STREQUAL \"OpenSSL\" OR NOT CRYPTO_BACKEND)\n\n  find_package(OpenSSL ${SPECIFIC_CRYPTO_REQUIREMENT})\n\n  if(OPENSSL_FOUND)\n    set(CRYPTO_BACKEND \"OpenSSL\")\n    set(CRYPTO_SOURCES openssl.c openssl.h)\n    list(APPEND PRIVATE_COMPILE_DEFINITIONS LIBSSH2_OPENSSL)\n    list(APPEND PRIVATE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR})\n    list(APPEND LIBRARIES ${OPENSSL_LIBRARIES})\n    list(APPEND PC_REQUIRES_PRIVATE libssl libcrypto)\n\n    if (WIN32)\n      # Statically linking to OpenSSL requires crypt32 for some Windows APIs.\n      # This should really be handled by FindOpenSSL.cmake.\n      list(APPEND LIBRARIES crypt32)\n      list(APPEND PC_LIBS -lcrypt32)\n\n      find_file(DLL_LIBEAY32\n\tNAMES libeay32.dll crypto.dll\n        HINTS ${_OPENSSL_ROOT_HINTS} PATHS ${_OPENSSL_ROOT_PATHS}\n        PATH_SUFFIXES bin)\n      if (NOT DLL_LIBEAY32)\n        message(WARNING\n          \"Unable to find OpenSSL libeay32 DLL, executables may not run\")\n      endif()\n\n      find_file(DLL_SSLEAY32\n        NAMES ssleay32.dll ssl.dll\n        HINTS ${_OPENSSL_ROOT_HINTS} PATHS ${_OPENSSL_ROOT_PATHS}\n        PATH_SUFFIXES bin)\n      if (NOT DLL_SSLEAY32)\n        message(WARNING\n          \"Unable to find OpenSSL ssleay32 DLL, executables may not run\")\n      endif()\n\n      if(DLL_LIBEAY32 AND DLL_SSLEAY32)\n        list(APPEND _RUNTIME_DEPENDENCIES ${DLL_LIBEAY32} ${DLL_SSLEAY32})\n      endif()\n    endif()\n\n    # Not all OpenSSL have AES-CTR functions.\n    set(SAVE_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})\n    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES})\n    check_function_exists(EVP_aes_128_ctr HAVE_EVP_AES_128_CTR)\n    set(CMAKE_REQUIRED_LIBRARIES ${SAVE_CMAKE_REQUIRED_LIBRARIES})\n  endif()\nendif()\n\nif(CRYPTO_BACKEND STREQUAL \"Libgcrypt\" OR NOT CRYPTO_BACKEND)\n\n  find_package(Libgcrypt ${SPECIFIC_CRYPTO_REQUIREMENT})\n\n  if(LIBGCRYPT_FOUND)\n    set(CRYPTO_BACKEND \"Libgcrypt\")\n    set(CRYPTO_SOURCES libgcrypt.c libgcrypt.h)\n    list(APPEND PRIVATE_COMPILE_DEFINITIONS LIBSSH2_LIBGCRYPT)\n    list(APPEND PRIVATE_INCLUDE_DIRECTORIES ${LIBGCRYPT_INCLUDE_DIRS})\n    list(APPEND LIBRARIES ${LIBGCRYPT_LIBRARIES})\n    list(APPEND PC_LIBS -lgcrypt)\n  endif()\nendif()\n\nif(CRYPTO_BACKEND STREQUAL \"WinCNG\" OR NOT CRYPTO_BACKEND)\n\n  # The check actually compiles the header.  This requires windows.h.\n  check_include_files(\"windows.h;bcrypt.h\" HAVE_BCRYPT_H)\n\n  if(HAVE_BCRYPT_H)\n    set(CRYPTO_BACKEND \"WinCNG\")\n    set(CRYPTO_SOURCES wincng.c wincng.h)\n    list(APPEND PRIVATE_COMPILE_DEFINITIONS LIBSSH2_WINCNG)\n\n    set(HAVE_LIBCRYPT32 TRUE)\n    list(APPEND LIBRARIES bcrypt)\n    list(APPEND PC_LIBS -lbcrypt)\n\n    check_include_files(ntdef.h HAVE_NTDEF_H)\n    check_include_files(ntstatus.h HAVE_NTSTATUS_H)\n\n    # Reading keys from files is optional and depends on Wincrypt\n    check_include_files(\"windows.h;wincrypt.h\" HAVE_WINCRYPT_H)\n\n    if(HAVE_WINCRYPT_H)\n      list(APPEND LIBRARIES crypt32)\n      list(APPEND PC_LIBS -lcrypt32)\n    endif()\n\n  elseif(${SPECIFIC_CRYPTO_REQUIREMENT} STREQUAL ${REQUIRED})\n    message(FATAL_ERROR \"WinCNG not available\")\n  endif()\nendif()\n\nif(NOT CRYPTO_BACKEND)\n  message(FATAL_ERROR \"No suitable cryptography backend found.\")\nendif()\n\n## Library definition\n\ninclude(GNUInstallDirs)\nset(SOURCES\n  ${CRYPTO_SOURCES}\n  agent.c\n  channel.c\n  channel.h\n  comp.c\n  comp.h\n  crypt.c\n  crypto.h\n  global.c\n  hostkey.c\n  keepalive.c\n  kex.c\n  knownhost.c\n  libssh2_priv.h\n  mac.c\n  mac.h\n  misc.c\n  misc.h\n  packet.c\n  packet.h\n  pem.c\n  publickey.c\n  scp.c\n  session.c\n  session.h\n  sftp.c\n  sftp.h\n  transport.c\n  transport.h\n  userauth.c\n  userauth.h\n  version.c)\n\nif(WIN32)\n  list(APPEND SOURCES ${PROJECT_SOURCE_DIR}/win32/libssh2.rc)\nendif()\n\nadd_library(libssh2 ${SOURCES})\n# we want it to be called libssh2 on all platforms\nset_target_properties(libssh2 PROPERTIES PREFIX \"\")\n\ntarget_compile_definitions(libssh2 PRIVATE ${PRIVATE_COMPILE_DEFINITIONS})\ntarget_include_directories(libssh2\n  PRIVATE ${PRIVATE_INCLUDE_DIRECTORIES}\n  PUBLIC\n    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>\n    $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>)\n\n## Options\n\nadd_feature_info(\"Shared library\" BUILD_SHARED_LIBS\n  \"creating libssh2 as a shared library (.so/.dll)\")\n\noption(ENABLE_ZLIB_COMPRESSION \"Use zlib for compression\")\nadd_feature_info(Compression ENABLE_ZLIB_COMPRESSION\n  \"using zlib for compression\")\nif(ENABLE_ZLIB_COMPRESSION)\n  find_package(ZLIB REQUIRED)\n\n  target_include_directories(libssh2 PRIVATE ${ZLIB_INCLUDE_DIRS})\n  list(APPEND LIBRARIES ${ZLIB_LIBRARIES})\n  list(APPEND PC_REQUIRES_PRIVATE zlib)\n  if(ZLIB_FOUND)\n    target_compile_definitions(libssh2 PRIVATE LIBSSH2_HAVE_ZLIB=1)\n  endif()\nendif()\n\noption(ENABLE_CRYPT_NONE \"Permit \\\"none\\\" cipher -- NOT RECOMMENDED\")\nadd_feature_info(\"\\\"none\\\" cipher\" ENABLE_CRYPT_NONE \"\")\nif(ENABLE_CRYPT_NONE)\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2_CRYPT_NONE=1)\nendif()\n\noption(ENABLE_MAC_NONE \"Permit \\\"none\\\" MAC -- NOT RECOMMMENDED\")\nadd_feature_info(\"\\\"none\\\" MAC\" ENABLE_MAC_NONE \"\")\nif(ENABLE_MAC_NONE)\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2_MAC_NONE=1)\nendif()\n\noption(ENABLE_GEX_NEW\n  \"Enable diffie-hellman-group-exchange-sha1 method\" ON)\nadd_feature_info(\"diffie-hellman-group-exchange-sha1\" ENABLE_GEX_NEW\n  \"\\\"new\\\" diffie-hellman-group-exchange-sha1 method\")\nif(ENABLE_GEX_NEW)\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2_DH_GEX_NEW=1)\nendif()\n\n# Enable debugging logging by default if the user configured a debug build\nif(CMAKE_BUILD_TYPE STREQUAL \"Debug\")\n  set(DEBUG_LOGGING_DEFAULT ON)\nelse()\n  set(DEBUG_LOGGING_DEFAULT OFF)\nendif()\noption(ENABLE_DEBUG_LOGGING \"log execution with debug trace\"\n  ${DEBUG_LOGGING_DEFAULT})\nadd_feature_info(Logging ENABLE_DEBUG_LOGGING\n   \"Logging of execution with debug trace\")\nif(ENABLE_DEBUG_LOGGING)\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2DEBUG)\nendif()\n\n## Platform checks\ncheck_include_files(unistd.h HAVE_UNISTD_H)\ncheck_include_files(inttypes.h HAVE_INTTYPES_H)\ncheck_include_files(stdlib.h HAVE_STDLIB_H)\ncheck_include_files(sys/select.h HAVE_SYS_SELECT_H)\n\ncheck_include_files(sys/uio.h HAVE_SYS_UIO_H)\ncheck_include_files(sys/socket.h HAVE_SYS_SOCKET_H)\ncheck_include_files(sys/ioctl.h HAVE_SYS_IOCTL_H)\ncheck_include_files(sys/time.h HAVE_SYS_TIME_H)\ncheck_include_files(sys/un.h HAVE_SYS_UN_H)\ncheck_include_files(windows.h HAVE_WINDOWS_H)\ncheck_include_files(ws2tcpip.h HAVE_WS2TCPIP_H)\ncheck_include_files(winsock2.h HAVE_WINSOCK2_H)\n\ncheck_type_size(\"long long\" LONGLONG)\n\nif(HAVE_SYS_TIME_H)\n  check_symbol_exists(gettimeofday sys/time.h HAVE_GETTIMEOFDAY)\nelse()\n  check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)\nendif()\nif(HAVE_STDLIB_H)\n  check_symbol_exists(strtoll stdlib.h HAVE_STRTOLL)\nelse()\n  check_function_exists(strtoll HAVE_STRTOLL)\nendif()\nif (NOT HAVE_STRTOLL)\n  # Try _strtoi64 if strtoll isn't available\n  check_symbol_exists(_strtoi64 stdlib.h HAVE_STRTOI64)\nendif()\ncheck_symbol_exists(snprintf stdio.h HAVE_SNPRINTF)\n\nif(${CMAKE_SYSTEM_NAME} STREQUAL \"Darwin\" OR\n   ${CMAKE_SYSTEM_NAME} STREQUAL \"Interix\")\n  # poll() does not work on these platforms\n  #\n  # Interix: \"does provide poll(), but the implementing developer must\n  # have been in a bad mood, because poll() only works on the /proc\n  # filesystem here\"\n  #\n  # Mac OS X's poll has funny behaviors, like:\n  # not being able to do poll on no fildescriptors (10.3?)\n  # not being able to poll on some files (like anything in /dev)\n  # not having reliable timeout support\n  # inconsistent return of POLLHUP where other implementations give POLLIN\n  message(\"poll use is disabled on this platform\")\nelse()\n  check_function_exists(poll HAVE_POLL)\nendif()\n\nappend_needed_socket_libraries(LIBRARIES)\n\n# Non-blocking socket support tests.  Must be after after library tests to\n# link correctly\nset(SAVE_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})\nset(CMAKE_REQUIRED_LIBRARIES ${LIBRARIES})\ncheck_nonblocking_socket_support()\nset(CMAKE_REQUIRED_LIBRARIES ${SAVE_CMAKE_REQUIRED_LIBRARIES})\n\nconfigure_file(\n  ${CMAKE_CURRENT_SOURCE_DIR}/libssh2_config_cmake.h.in\n  ${CMAKE_CURRENT_BINARY_DIR}/libssh2_config.h)\n# to find generated header\ntarget_include_directories(libssh2 PRIVATE ${CMAKE_CURRENT_BINARY_DIR})\n\n# Check for the OS.\n# Daniel's note: this should not be necessary and we need to work to\n# get this removed.\nif(${CMAKE_SYSTEM_NAME} STREQUAL \"Windows\")\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2_WIN32)\nelseif(${CMAKE_SYSTEM_NAME} STREQUAL \"Darwin\")\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2_DARWIN)\nendif()\n\nif(CMAKE_VERSION VERSION_LESS \"2.8.12\")\n  # Fall back to over-linking dependencies\n  target_link_libraries(libssh2 ${LIBRARIES})\nelse()\n  target_link_libraries(libssh2 PRIVATE ${LIBRARIES})\nendif()\n\n## Installation\n\ninstall(FILES\n  ${PROJECT_SOURCE_DIR}/include/libssh2.h\n  ${PROJECT_SOURCE_DIR}/include/libssh2_publickey.h\n  ${PROJECT_SOURCE_DIR}/include/libssh2_sftp.h\n  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})\n\ninstall(TARGETS libssh2\n  EXPORT Libssh2Config\n  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}\n  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}\n  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})\n\nif(BUILD_SHARED_LIBS)\n  list(APPEND _RUNTIME_DEPENDENCIES $<TARGET_FILE:libssh2>)\nendif()\n\nset(RUNTIME_DEPENDENCIES ${_RUNTIME_DEPENDENCIES} CACHE INTERNAL\n    \"Files that must be in the same directory as the executables at runtime.\")\n\n# Package config\n\n## During package installation, install Libssh2Config.cmake\ninstall(EXPORT Libssh2Config\n  NAMESPACE Libssh2::\n  DESTINATION lib/cmake/libssh2)\n\n## During build, register directly from build tree\n# create Libssh2Config.cmake\nexport(TARGETS libssh2 NAMESPACE Libssh2:: FILE Libssh2Config.cmake)\nexport(PACKAGE Libssh2) # register it\n\n## Export a .pc file for client projects not using CMaek\nif(PC_REQUIRES_PRIVATE)\n  string(REPLACE \";\" \",\" PC_REQUIRES_PRIVATE \"${PC_REQUIRES_PRIVATE}\")\nendif()\nif(PC_LIBS)\n  string(REPLACE \";\" \" \" PC_LIBS \"${PC_LIBS}\")\nendif()\nconfigure_file(libssh2.pc.in libssh2.pc @ONLY)\ninstall(\n  FILES ${CMAKE_CURRENT_BINARY_DIR}/libssh2.pc\n  DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)\n\n## Versioning\n\nset_target_properties(libssh2 PROPERTIES\n  SOVERSION 1\n  VERSION 1.0.1)\n\ninclude(CMakePackageConfigHelpers)\nwrite_basic_package_version_file(\n  ${CMAKE_CURRENT_BINARY_DIR}/Libssh2ConfigVersion.cmake\n  VERSION \"${LIBSSH2_VERSION_MAJOR}.${LIBSSH2_VERSION_MINOR}.${LIBSSH2_VERSION_PATCH}\"\n  COMPATIBILITY SameMajorVersion)\ninstall(\n  FILES ${CMAKE_CURRENT_BINARY_DIR}/Libssh2ConfigVersion.cmake\n  DESTINATION lib/cmake/libssh2)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/Makefile.am",
    "content": "# $Id: Makefile.am,v 1.21 2009/05/07 17:21:56 bagder Exp $\nAUTOMAKE_OPTIONS = foreign nostdinc\n\n# Get the CRYPTO_CSOURCES and CRYPTO_HHEADERS defines\nif OPENSSL\ninclude ../Makefile.OpenSSL.inc\nendif\nif LIBGCRYPT\ninclude ../Makefile.libgcrypt.inc\nendif\nif WINCNG\ninclude ../Makefile.WinCNG.inc\nendif\nif OS400QC3\ninclude ../Makefile.os400qc3.inc\nendif\n\n# Makefile.inc provides the CSOURCES and HHEADERS defines\ninclude ../Makefile.inc\n\nlibssh2_la_SOURCES = $(CSOURCES) $(HHEADERS)\n\nEXTRA_DIST = libssh2_config.h.in libssh2_config_cmake.h.in libssh2.pc.in\nEXTRA_DIST += CMakeLists.txt NMakefile\n\nlib_LTLIBRARIES = libssh2.la\n\n# srcdir/include for the shipped headers\n# builddir/src for the generated config header when building out of the source\n# tree\nAM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/src\n\nVERSION=-version-info 1:1:0\n\n# This flag accepts an argument of the form current[:revision[:age]]. So,\n# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to\n# 1.\n#\n# If either revision or age are omitted, they default to 0. Also note that age\n# must be less than or equal to the current interface number.\n#\n# Here are a set of rules to help you update your library version information:\n#\n# 1.Start with version information of 0:0:0 for each libtool library.\n#\n# 2.Update the version information only immediately before a public release of\n# your software. More frequent updates are unnecessary, and only guarantee\n# that the current interface number gets larger faster.\n#\n# 3.If the library source code has changed at all since the last update, then\n# increment revision (c:r+1:a)\n#\n# 4.If any interfaces have been added, removed, or changed since the last\n# update, increment current, and set revision to 0. (c+1:r=0:a)\n#\n# 5.If any interfaces have been added since the last public release, then\n# increment age. (c:r:a+1)\n#\n# 6.If any interfaces have been removed since the last public release, then\n# set age to 0. (c:r:a=0)\n#\n\nlibssh2_la_LDFLAGS = $(VERSION) -no-undefined \\\n\t-export-symbols-regex '^libssh2_.*' \\\n\t$(LTLIBGCRYPT) $(LTLIBSSL) $(LTLIBZ)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/NMakefile",
    "content": "!include \"win32/config.mk\"\n\n!include \"win32/objects.mk\"\n\nCFLAGS=$(CFLAGS)\n\nAR = lib\nARFLAGS = -nologo /LTCG\n\nRESOURCE=$(INTDIR)\\libssh2.res\nDLL=libssh2$(SUFFIX).dll\nSTATICLIB=$(INTDIR)\\libssh2.lib\n\n!if \"$(BUILD_STATIC_LIB)\" == \"\"\nall: $(DLL)\n!else\nall: $(STATICLIB)\n!endif\n\n$(DLL): $(OBJECTS) $(RESOURCE)\n\t$(CC) -o $(DLL) $(DLLFLAGS) $(OBJECTS) $(RESOURCE) $(LIBS)\n\n$(STATICLIB): $(OBJECTS)\n\t$(AR) $(ARFLAGS) -out:$@ $(OBJECTS)\n\n$(RESOURCE): win32\\libssh2.rc\n\t$(RC) $(RCFLAGS) /Fo\"$@\" $?\n\n!include \"win32/rules.mk\"\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/agent.c",
    "content": "/*\n * Copyright (c) 2009 by Daiki Ueno\n * Copyright (C) 2010-2014 by Daniel Stenberg\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include \"misc.h\"\n#include <errno.h>\n#ifdef HAVE_SYS_UN_H\n#include <sys/un.h>\n#else\n/* Use the existence of sys/un.h as a test if Unix domain socket is\n   supported.  winsock*.h define PF_UNIX/AF_UNIX but do not actually\n   support them. */\n#undef PF_UNIX\n#endif\n#include \"userauth.h\"\n#include \"session.h\"\n\n/* Requests from client to agent for protocol 1 key operations */\n#define SSH_AGENTC_REQUEST_RSA_IDENTITIES 1\n#define SSH_AGENTC_RSA_CHALLENGE 3\n#define SSH_AGENTC_ADD_RSA_IDENTITY 7\n#define SSH_AGENTC_REMOVE_RSA_IDENTITY 8\n#define SSH_AGENTC_REMOVE_ALL_RSA_IDENTITIES 9\n#define SSH_AGENTC_ADD_RSA_ID_CONSTRAINED 24\n\n/* Requests from client to agent for protocol 2 key operations */\n#define SSH2_AGENTC_REQUEST_IDENTITIES 11\n#define SSH2_AGENTC_SIGN_REQUEST 13\n#define SSH2_AGENTC_ADD_IDENTITY 17\n#define SSH2_AGENTC_REMOVE_IDENTITY 18\n#define SSH2_AGENTC_REMOVE_ALL_IDENTITIES 19\n#define SSH2_AGENTC_ADD_ID_CONSTRAINED 25\n\n/* Key-type independent requests from client to agent */\n#define SSH_AGENTC_ADD_SMARTCARD_KEY 20\n#define SSH_AGENTC_REMOVE_SMARTCARD_KEY 21\n#define SSH_AGENTC_LOCK 22\n#define SSH_AGENTC_UNLOCK 23\n#define SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED 26\n\n/* Generic replies from agent to client */\n#define SSH_AGENT_FAILURE 5\n#define SSH_AGENT_SUCCESS 6\n\n/* Replies from agent to client for protocol 1 key operations */\n#define SSH_AGENT_RSA_IDENTITIES_ANSWER 2\n#define SSH_AGENT_RSA_RESPONSE 4\n\n/* Replies from agent to client for protocol 2 key operations */\n#define SSH2_AGENT_IDENTITIES_ANSWER 12\n#define SSH2_AGENT_SIGN_RESPONSE 14\n\n/* Key constraint identifiers */\n#define SSH_AGENT_CONSTRAIN_LIFETIME 1\n#define SSH_AGENT_CONSTRAIN_CONFIRM 2\n\n/* non-blocking mode on agent connection is not yet implemented, but\n   for future use. */\ntypedef enum {\n    agent_NB_state_init = 0,\n    agent_NB_state_request_created,\n    agent_NB_state_request_length_sent,\n    agent_NB_state_request_sent,\n    agent_NB_state_response_length_received,\n    agent_NB_state_response_received\n} agent_nonblocking_states;\n\ntypedef struct agent_transaction_ctx {\n    unsigned char *request;\n    size_t request_len;\n    unsigned char *response;\n    size_t response_len;\n    agent_nonblocking_states state;\n} *agent_transaction_ctx_t;\n\ntypedef int (*agent_connect_func)(LIBSSH2_AGENT *agent);\ntypedef int (*agent_transact_func)(LIBSSH2_AGENT *agent,\n                                   agent_transaction_ctx_t transctx);\ntypedef int (*agent_disconnect_func)(LIBSSH2_AGENT *agent);\n\nstruct agent_publickey {\n    struct list_node node;\n\n    /* this is the struct we expose externally */\n    struct libssh2_agent_publickey external;\n};\n\nstruct agent_ops {\n    agent_connect_func connect;\n    agent_transact_func transact;\n    agent_disconnect_func disconnect;\n};\n\nstruct _LIBSSH2_AGENT\n{\n    LIBSSH2_SESSION *session;  /* the session this \"belongs to\" */\n\n    libssh2_socket_t fd;\n\n    struct agent_ops *ops;\n\n    struct agent_transaction_ctx transctx;\n    struct agent_publickey *identity;\n    struct list_head head;              /* list of public keys */\n};\n\n#ifdef PF_UNIX\nstatic int\nagent_connect_unix(LIBSSH2_AGENT *agent)\n{\n    const char *path;\n    struct sockaddr_un s_un;\n\n    path = getenv(\"SSH_AUTH_SOCK\");\n    if (!path)\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_BAD_USE,\n                              \"no auth sock variable\");\n\n    agent->fd = socket(PF_UNIX, SOCK_STREAM, 0);\n    if (agent->fd < 0)\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_BAD_SOCKET,\n                              \"failed creating socket\");\n\n    s_un.sun_family = AF_UNIX;\n    strncpy (s_un.sun_path, path, sizeof s_un.sun_path);\n    s_un.sun_path[sizeof(s_un.sun_path)-1]=0; /* make sure there's a trailing\n                                                 zero */\n    if (connect(agent->fd, (struct sockaddr*)(&s_un), sizeof s_un) != 0) {\n        close (agent->fd);\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL,\n                              \"failed connecting with agent\");\n    }\n\n    return LIBSSH2_ERROR_NONE;\n}\n\nstatic int\nagent_transact_unix(LIBSSH2_AGENT *agent, agent_transaction_ctx_t transctx)\n{\n    unsigned char buf[4];\n    int rc;\n\n    /* Send the length of the request */\n    if (transctx->state == agent_NB_state_request_created) {\n        _libssh2_htonu32(buf, transctx->request_len);\n        rc = LIBSSH2_SEND_FD(agent->session, agent->fd, buf, sizeof buf, 0);\n        if (rc == -EAGAIN)\n            return LIBSSH2_ERROR_EAGAIN;\n        else if (rc < 0)\n            return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"agent send failed\");\n        transctx->state = agent_NB_state_request_length_sent;\n    }\n\n    /* Send the request body */\n    if (transctx->state == agent_NB_state_request_length_sent) {\n        rc = LIBSSH2_SEND_FD(agent->session, agent->fd, transctx->request,\n                           transctx->request_len, 0);\n        if (rc == -EAGAIN)\n            return LIBSSH2_ERROR_EAGAIN;\n        else if (rc < 0)\n            return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"agent send failed\");\n        transctx->state = agent_NB_state_request_sent;\n    }\n\n    /* Receive the length of a response */\n    if (transctx->state == agent_NB_state_request_sent) {\n        rc = LIBSSH2_RECV_FD(agent->session, agent->fd, buf, sizeof buf, 0);\n        if (rc < 0) {\n            if (rc == -EAGAIN)\n                return LIBSSH2_ERROR_EAGAIN;\n            return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_RECV,\n                                  \"agent recv failed\");\n        }\n        transctx->response_len = _libssh2_ntohu32(buf);\n        transctx->response = LIBSSH2_ALLOC(agent->session,\n                                           transctx->response_len);\n        if (!transctx->response)\n            return LIBSSH2_ERROR_ALLOC;\n\n        transctx->state = agent_NB_state_response_length_received;\n    }\n\n    /* Receive the response body */\n    if (transctx->state == agent_NB_state_response_length_received) {\n        rc = LIBSSH2_RECV_FD(agent->session, agent->fd, transctx->response,\n                           transctx->response_len, 0);\n        if (rc < 0) {\n            if (rc == -EAGAIN)\n                return LIBSSH2_ERROR_EAGAIN;\n            return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"agent recv failed\");\n        }\n        transctx->state = agent_NB_state_response_received;\n    }\n\n    return 0;\n}\n\nstatic int\nagent_disconnect_unix(LIBSSH2_AGENT *agent)\n{\n    int ret;\n    ret = close(agent->fd);\n    if(ret != -1)\n        agent->fd = LIBSSH2_INVALID_SOCKET;\n    else\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_DISCONNECT,\n                              \"failed closing the agent socket\");\n    return LIBSSH2_ERROR_NONE;\n}\n\nstruct agent_ops agent_ops_unix = {\n    agent_connect_unix,\n    agent_transact_unix,\n    agent_disconnect_unix\n};\n#endif  /* PF_UNIX */\n\n#ifdef WIN32\n/* Code to talk to Pageant was taken from PuTTY.\n *\n * Portions copyright Robert de Bath, Joris van Rantwijk, Delian\n * Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas\n * Barry, Justin Bradford, Ben Harris, Malcolm Smith, Ahmad Khalifa,\n * Markus Kuhn, Colin Watson, and CORE SDI S.A.\n */\n#define PAGEANT_COPYDATA_ID 0x804e50ba   /* random goop */\n#define PAGEANT_MAX_MSGLEN  8192\n\nstatic int\nagent_connect_pageant(LIBSSH2_AGENT *agent)\n{\n    HWND hwnd;\n    hwnd = FindWindow(\"Pageant\", \"Pageant\");\n    if (!hwnd)\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL,\n                              \"failed connecting agent\");\n    agent->fd = 0;         /* Mark as the connection has been established */\n    return LIBSSH2_ERROR_NONE;\n}\n\nstatic int\nagent_transact_pageant(LIBSSH2_AGENT *agent, agent_transaction_ctx_t transctx)\n{\n    HWND hwnd;\n    char mapname[23];\n    HANDLE filemap;\n    unsigned char *p;\n    unsigned char *p2;\n    int id;\n    COPYDATASTRUCT cds;\n\n    if (!transctx || 4 + transctx->request_len > PAGEANT_MAX_MSGLEN)\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_INVAL,\n                              \"illegal input\");\n\n    hwnd = FindWindow(\"Pageant\", \"Pageant\");\n    if (!hwnd)\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL,\n                              \"found no pageant\");\n\n    sprintf(mapname, \"PageantRequest%08x\", (unsigned)GetCurrentThreadId());\n    filemap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,\n                                0, PAGEANT_MAX_MSGLEN, mapname);\n\n    if (filemap == NULL || filemap == INVALID_HANDLE_VALUE)\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL,\n                              \"failed setting up pageant filemap\");\n\n    p2 = p = MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, 0);\n    if (p == NULL || p2 == NULL) {\n        CloseHandle(filemap);\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL,\n                              \"failed to open pageant filemap for writing\");\n    }\n\n    _libssh2_store_str(&p2, (const char *)transctx->request,\n                       transctx->request_len);\n\n    cds.dwData = PAGEANT_COPYDATA_ID;\n    cds.cbData = 1 + strlen(mapname);\n    cds.lpData = mapname;\n\n    id = SendMessage(hwnd, WM_COPYDATA, (WPARAM) NULL, (LPARAM) &cds);\n    if (id > 0) {\n        transctx->response_len = _libssh2_ntohu32(p);\n        if (transctx->response_len > PAGEANT_MAX_MSGLEN) {\n            UnmapViewOfFile(p);\n            CloseHandle(filemap);\n            return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL,\n                                  \"agent setup fail\");\n        }\n        transctx->response = LIBSSH2_ALLOC(agent->session,\n                                           transctx->response_len);\n        if (!transctx->response) {\n            UnmapViewOfFile(p);\n            CloseHandle(filemap);\n            return _libssh2_error(agent->session, LIBSSH2_ERROR_ALLOC,\n                                  \"agent malloc\");\n        }\n        memcpy(transctx->response, p + 4, transctx->response_len);\n    }\n\n    UnmapViewOfFile(p);\n    CloseHandle(filemap);\n    return 0;\n}\n\nstatic int\nagent_disconnect_pageant(LIBSSH2_AGENT *agent)\n{\n    agent->fd = LIBSSH2_INVALID_SOCKET;\n    return 0;\n}\n\nstruct agent_ops agent_ops_pageant = {\n    agent_connect_pageant,\n    agent_transact_pageant,\n    agent_disconnect_pageant\n};\n#endif  /* WIN32 */\n\nstatic struct {\n    const char *name;\n    struct agent_ops *ops;\n} supported_backends[] = {\n#ifdef WIN32\n    {\"Pageant\", &agent_ops_pageant},\n#endif  /* WIN32 */\n#ifdef PF_UNIX\n    {\"Unix\", &agent_ops_unix},\n#endif  /* PF_UNIX */\n    {NULL, NULL}\n};\n\nstatic int\nagent_sign(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len,\n           const unsigned char *data, size_t data_len, void **abstract)\n{\n    LIBSSH2_AGENT *agent = (LIBSSH2_AGENT *) (*abstract);\n    agent_transaction_ctx_t transctx = &agent->transctx;\n    struct agent_publickey *identity = agent->identity;\n    ssize_t len = 1 + 4 + identity->external.blob_len + 4 + data_len + 4;\n    ssize_t method_len;\n    unsigned char *s;\n    int rc;\n\n    /* Create a request to sign the data */\n    if (transctx->state == agent_NB_state_init) {\n        s = transctx->request = LIBSSH2_ALLOC(session, len);\n        if (!transctx->request)\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"out of memory\");\n\n        *s++ = SSH2_AGENTC_SIGN_REQUEST;\n        /* key blob */\n        _libssh2_store_str(&s, (const char *)identity->external.blob,\n                           identity->external.blob_len);\n        /* data */\n        _libssh2_store_str(&s, (const char *)data, data_len);\n\n        /* flags */\n        _libssh2_store_u32(&s, 0);\n\n        transctx->request_len = s - transctx->request;\n        transctx->state = agent_NB_state_request_created;\n    }\n\n    /* Make sure to be re-called as a result of EAGAIN. */\n    if (*transctx->request != SSH2_AGENTC_SIGN_REQUEST)\n        return _libssh2_error(session, LIBSSH2_ERROR_BAD_USE,\n                              \"illegal request\");\n\n    if (!agent->ops)\n        /* if no agent has been connected, bail out */\n        return _libssh2_error(session, LIBSSH2_ERROR_BAD_USE,\n                              \"agent not connected\");\n\n    rc = agent->ops->transact(agent, transctx);\n    if (rc) {\n        goto error;\n    }\n    LIBSSH2_FREE(session, transctx->request);\n    transctx->request = NULL;\n\n    len = transctx->response_len;\n    s = transctx->response;\n    len--;\n    if (len < 0) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    if (*s != SSH2_AGENT_SIGN_RESPONSE) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    s++;\n\n    /* Skip the entire length of the signature */\n    len -= 4;\n    if (len < 0) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    s += 4;\n\n    /* Skip signing method */\n    len -= 4;\n    if (len < 0) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    method_len = _libssh2_ntohu32(s);\n    s += 4;\n    len -= method_len;\n    if (len < 0) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    s += method_len;\n\n    /* Read the signature */\n    len -= 4;\n    if (len < 0) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    *sig_len = _libssh2_ntohu32(s);\n    s += 4;\n    len -= *sig_len;\n    if (len < 0) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n\n    *sig = LIBSSH2_ALLOC(session, *sig_len);\n    if (!*sig) {\n        rc = LIBSSH2_ERROR_ALLOC;\n        goto error;\n    }\n    memcpy(*sig, s, *sig_len);\n\n  error:\n    LIBSSH2_FREE(session, transctx->request);\n    transctx->request = NULL;\n\n    LIBSSH2_FREE(session, transctx->response);\n    transctx->response = NULL;\n\n    return _libssh2_error(session, rc, \"agent sign failure\");\n}\n\nstatic int\nagent_list_identities(LIBSSH2_AGENT *agent)\n{\n    agent_transaction_ctx_t transctx = &agent->transctx;\n    ssize_t len, num_identities;\n    unsigned char *s;\n    int rc;\n    unsigned char c = SSH2_AGENTC_REQUEST_IDENTITIES;\n\n    /* Create a request to list identities */\n    if (transctx->state == agent_NB_state_init) {\n        transctx->request = &c;\n        transctx->request_len = 1;\n        transctx->state = agent_NB_state_request_created;\n    }\n\n    /* Make sure to be re-called as a result of EAGAIN. */\n    if (*transctx->request != SSH2_AGENTC_REQUEST_IDENTITIES)\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_BAD_USE,\n                              \"illegal agent request\");\n\n    if (!agent->ops)\n        /* if no agent has been connected, bail out */\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_BAD_USE,\n                              \"agent not connected\");\n\n    rc = agent->ops->transact(agent, transctx);\n    if (rc) {\n        goto error;\n    }\n    transctx->request = NULL;\n\n    len = transctx->response_len;\n    s = transctx->response;\n    len--;\n    if (len < 0) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    if (*s != SSH2_AGENT_IDENTITIES_ANSWER) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    s++;\n\n    /* Read the length of identities */\n    len -= 4;\n    if (len < 0) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    num_identities = _libssh2_ntohu32(s);\n    s += 4;\n\n    while (num_identities--) {\n        struct agent_publickey *identity;\n        ssize_t comment_len;\n\n        /* Read the length of the blob */\n        len -= 4;\n        if (len < 0) {\n            rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n            goto error;\n        }\n        identity = LIBSSH2_ALLOC(agent->session, sizeof *identity);\n        if (!identity) {\n            rc = LIBSSH2_ERROR_ALLOC;\n            goto error;\n        }\n        identity->external.blob_len = _libssh2_ntohu32(s);\n        s += 4;\n\n        /* Read the blob */\n        len -= identity->external.blob_len;\n        if (len < 0) {\n            rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n            LIBSSH2_FREE(agent->session, identity);\n            goto error;\n        }\n\n        identity->external.blob = LIBSSH2_ALLOC(agent->session,\n                                                identity->external.blob_len);\n        if (!identity->external.blob) {\n            rc = LIBSSH2_ERROR_ALLOC;\n            LIBSSH2_FREE(agent->session, identity);\n            goto error;\n        }\n        memcpy(identity->external.blob, s, identity->external.blob_len);\n        s += identity->external.blob_len;\n\n        /* Read the length of the comment */\n        len -= 4;\n        if (len < 0) {\n            rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n            LIBSSH2_FREE(agent->session, identity->external.blob);\n            LIBSSH2_FREE(agent->session, identity);\n            goto error;\n        }\n        comment_len = _libssh2_ntohu32(s);\n        s += 4;\n\n        /* Read the comment */\n        len -= comment_len;\n        if (len < 0) {\n            rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n            LIBSSH2_FREE(agent->session, identity->external.blob);\n            LIBSSH2_FREE(agent->session, identity);\n            goto error;\n        }\n\n        identity->external.comment = LIBSSH2_ALLOC(agent->session,\n                                                   comment_len + 1);\n        if (!identity->external.comment) {\n            rc = LIBSSH2_ERROR_ALLOC;\n            LIBSSH2_FREE(agent->session, identity->external.blob);\n            LIBSSH2_FREE(agent->session, identity);\n            goto error;\n        }\n        identity->external.comment[comment_len] = '\\0';\n        memcpy(identity->external.comment, s, comment_len);\n        s += comment_len;\n\n        _libssh2_list_add(&agent->head, &identity->node);\n    }\n error:\n    LIBSSH2_FREE(agent->session, transctx->response);\n    transctx->response = NULL;\n\n    return _libssh2_error(agent->session, rc,\n                          \"agent list id failed\");\n}\n\nstatic void\nagent_free_identities(LIBSSH2_AGENT *agent) {\n    struct agent_publickey *node;\n    struct agent_publickey *next;\n\n    for (node = _libssh2_list_first(&agent->head); node; node = next) {\n        next = _libssh2_list_next(&node->node);\n        LIBSSH2_FREE(agent->session, node->external.blob);\n        LIBSSH2_FREE(agent->session, node->external.comment);\n        LIBSSH2_FREE(agent->session, node);\n    }\n    _libssh2_list_init(&agent->head);\n}\n\n#define AGENT_PUBLICKEY_MAGIC 0x3bdefed2\n/*\n * agent_publickey_to_external()\n *\n * Copies data from the internal to the external representation struct.\n *\n */\nstatic struct libssh2_agent_publickey *\nagent_publickey_to_external(struct agent_publickey *node)\n{\n    struct libssh2_agent_publickey *ext = &node->external;\n\n    ext->magic = AGENT_PUBLICKEY_MAGIC;\n    ext->node = node;\n\n    return ext;\n}\n\n/*\n * libssh2_agent_init\n *\n * Init an ssh-agent handle. Returns the pointer to the handle.\n *\n */\nLIBSSH2_API LIBSSH2_AGENT *\nlibssh2_agent_init(LIBSSH2_SESSION *session)\n{\n    LIBSSH2_AGENT *agent;\n\n    agent = LIBSSH2_CALLOC(session, sizeof *agent);\n    if (!agent) {\n        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                       \"Unable to allocate space for agent connection\");\n        return NULL;\n    }\n    agent->fd = LIBSSH2_INVALID_SOCKET;\n    agent->session = session;\n    _libssh2_list_init(&agent->head);\n\n    return agent;\n}\n\n/*\n * libssh2_agent_connect()\n *\n * Connect to an ssh-agent.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_connect(LIBSSH2_AGENT *agent)\n{\n    int i, rc = -1;\n    for (i = 0; supported_backends[i].name; i++) {\n        agent->ops = supported_backends[i].ops;\n        rc = (agent->ops->connect)(agent);\n        if (!rc)\n            return 0;\n    }\n    return rc;\n}\n\n/*\n * libssh2_agent_list_identities()\n *\n * Request ssh-agent to list identities.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_list_identities(LIBSSH2_AGENT *agent)\n{\n    memset(&agent->transctx, 0, sizeof agent->transctx);\n    /* Abondon the last fetched identities */\n    agent_free_identities(agent);\n    return agent_list_identities(agent);\n}\n\n/*\n * libssh2_agent_get_identity()\n *\n * Traverse the internal list of public keys. Pass NULL to 'prev' to get\n * the first one. Or pass a pointer to the previously returned one to get the\n * next.\n *\n * Returns:\n * 0 if a fine public key was stored in 'store'\n * 1 if end of public keys\n * [negative] on errors\n */\nLIBSSH2_API int\nlibssh2_agent_get_identity(LIBSSH2_AGENT *agent,\n                           struct libssh2_agent_publickey **ext,\n                           struct libssh2_agent_publickey *oprev)\n{\n    struct agent_publickey *node;\n    if (oprev && oprev->node) {\n        /* we have a starting point */\n        struct agent_publickey *prev = oprev->node;\n\n        /* get the next node in the list */\n        node = _libssh2_list_next(&prev->node);\n    }\n    else\n        node = _libssh2_list_first(&agent->head);\n\n    if (!node)\n        /* no (more) node */\n        return 1;\n\n    *ext = agent_publickey_to_external(node);\n\n    return 0;\n}\n\n/*\n * libssh2_agent_userauth()\n *\n * Do publickey user authentication with the help of ssh-agent.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_userauth(LIBSSH2_AGENT *agent,\n                       const char *username,\n                       struct libssh2_agent_publickey *identity)\n{\n    void *abstract = agent;\n    int rc;\n\n    if (agent->session->userauth_pblc_state == libssh2_NB_state_idle) {\n        memset(&agent->transctx, 0, sizeof agent->transctx);\n        agent->identity = identity->node;\n    }\n\n    BLOCK_ADJUST(rc, agent->session,\n                 _libssh2_userauth_publickey(agent->session, username,\n                                             strlen(username),\n                                             identity->blob,\n                                             identity->blob_len,\n                                             agent_sign,\n                                             &abstract));\n    return rc;\n}\n\n/*\n * libssh2_agent_disconnect()\n *\n * Close a connection to an ssh-agent.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_disconnect(LIBSSH2_AGENT *agent)\n{\n    if (agent->ops && agent->fd != LIBSSH2_INVALID_SOCKET)\n        return agent->ops->disconnect(agent);\n    return 0;\n}\n\n/*\n * libssh2_agent_free()\n *\n * Free an ssh-agent handle.  This function also frees the internal\n * collection of public keys.\n */\nLIBSSH2_API void\nlibssh2_agent_free(LIBSSH2_AGENT *agent) {\n    /* Allow connection freeing when the socket has lost its connection */\n    if (agent->fd != LIBSSH2_INVALID_SOCKET) {\n        libssh2_agent_disconnect(agent);\n    }\n    agent_free_identities(agent);\n    LIBSSH2_FREE(agent->session, agent);\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/channel.c",
    "content": "/* Copyright (c) 2004-2007 Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2005 Mikhail Gusarov <dottedmag@dottedmag.net>\n * Copyright (c) 2008-2014 by Daniel Stenberg\n *\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#include <fcntl.h>\n#ifdef HAVE_INTTYPES_H\n#include <inttypes.h>\n#endif\n#include <assert.h>\n\n#include \"channel.h\"\n#include \"transport.h\"\n#include \"packet.h\"\n#include \"session.h\"\n\n/*\n *  _libssh2_channel_nextid\n *\n * Determine the next channel ID we can use at our end\n */\nuint32_t\n_libssh2_channel_nextid(LIBSSH2_SESSION * session)\n{\n    uint32_t id = session->next_channel;\n    LIBSSH2_CHANNEL *channel;\n\n    channel = _libssh2_list_first(&session->channels);\n\n    while (channel) {\n        if (channel->local.id > id) {\n            id = channel->local.id;\n        }\n        channel = _libssh2_list_next(&channel->node);\n    }\n\n    /* This is a shortcut to avoid waiting for close packets on channels we've\n     * forgotten about, This *could* be a problem if we request and close 4\n     * billion or so channels in too rapid succession for the remote end to\n     * respond, but the worst case scenario is that some data meant for\n     * another channel Gets picked up by the new one.... Pretty unlikely all\n     * told...\n     */\n    session->next_channel = id + 1;\n    _libssh2_debug(session, LIBSSH2_TRACE_CONN, \"Allocated new channel ID#%lu\",\n                   id);\n    return id;\n}\n\n/*\n * _libssh2_channel_locate\n *\n * Locate a channel pointer by number\n */\nLIBSSH2_CHANNEL *\n_libssh2_channel_locate(LIBSSH2_SESSION *session, uint32_t channel_id)\n{\n    LIBSSH2_CHANNEL *channel;\n    LIBSSH2_LISTENER *l;\n\n    for(channel = _libssh2_list_first(&session->channels);\n        channel;\n        channel = _libssh2_list_next(&channel->node)) {\n        if (channel->local.id == channel_id)\n            return channel;\n    }\n\n    /* We didn't find the channel in the session, let's then check its\n       listeners since each listener may have its own set of pending channels\n    */\n    for(l = _libssh2_list_first(&session->listeners); l;\n        l = _libssh2_list_next(&l->node)) {\n        for(channel = _libssh2_list_first(&l->queue);\n            channel;\n            channel = _libssh2_list_next(&channel->node)) {\n            if (channel->local.id == channel_id)\n                return channel;\n        }\n    }\n\n    return NULL;\n}\n\n/*\n * _libssh2_channel_open\n *\n * Establish a generic session channel\n */\nLIBSSH2_CHANNEL *\n_libssh2_channel_open(LIBSSH2_SESSION * session, const char *channel_type,\n                      uint32_t channel_type_len,\n                      uint32_t window_size,\n                      uint32_t packet_size,\n                      const unsigned char *message,\n                      size_t message_len)\n{\n    static const unsigned char reply_codes[3] = {\n        SSH_MSG_CHANNEL_OPEN_CONFIRMATION,\n        SSH_MSG_CHANNEL_OPEN_FAILURE,\n        0\n    };\n    unsigned char *s;\n    int rc;\n\n    if (session->open_state == libssh2_NB_state_idle) {\n        session->open_channel = NULL;\n        session->open_packet = NULL;\n        session->open_data = NULL;\n        /* 17 = packet_type(1) + channel_type_len(4) + sender_channel(4) +\n         * window_size(4) + packet_size(4) */\n        session->open_packet_len = channel_type_len + 17;\n        session->open_local_channel = _libssh2_channel_nextid(session);\n\n        /* Zero the whole thing out */\n        memset(&session->open_packet_requirev_state, 0,\n               sizeof(session->open_packet_requirev_state));\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Opening Channel - win %d pack %d\", window_size,\n                       packet_size);\n        session->open_channel =\n            LIBSSH2_CALLOC(session, sizeof(LIBSSH2_CHANNEL));\n        if (!session->open_channel) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate space for channel data\");\n            return NULL;\n        }\n        session->open_channel->channel_type_len = channel_type_len;\n        session->open_channel->channel_type =\n            LIBSSH2_ALLOC(session, channel_type_len);\n        if (!session->open_channel->channel_type) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Failed allocating memory for channel type name\");\n            LIBSSH2_FREE(session, session->open_channel);\n            session->open_channel = NULL;\n            return NULL;\n        }\n        memcpy(session->open_channel->channel_type, channel_type,\n               channel_type_len);\n\n        /* REMEMBER: local as in locally sourced */\n        session->open_channel->local.id = session->open_local_channel;\n        session->open_channel->remote.window_size = window_size;\n        session->open_channel->remote.window_size_initial = window_size;\n        session->open_channel->remote.packet_size = packet_size;\n        session->open_channel->session = session;\n\n        _libssh2_list_add(&session->channels,\n                          &session->open_channel->node);\n\n        s = session->open_packet =\n            LIBSSH2_ALLOC(session, session->open_packet_len);\n        if (!session->open_packet) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate temporary space for packet\");\n            goto channel_error;\n        }\n        *(s++) = SSH_MSG_CHANNEL_OPEN;\n        _libssh2_store_str(&s, channel_type, channel_type_len);\n        _libssh2_store_u32(&s, session->open_local_channel);\n        _libssh2_store_u32(&s, window_size);\n        _libssh2_store_u32(&s, packet_size);\n\n        /* Do not copy the message */\n\n        session->open_state = libssh2_NB_state_created;\n    }\n\n    if (session->open_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session,\n                                     session->open_packet,\n                                     session->open_packet_len,\n                                     message, message_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, rc,\n                           \"Would block sending channel-open request\");\n            return NULL;\n        }\n        else if (rc) {\n            _libssh2_error(session, rc,\n                           \"Unable to send channel-open request\");\n            goto channel_error;\n        }\n\n        session->open_state = libssh2_NB_state_sent;\n    }\n\n    if (session->open_state == libssh2_NB_state_sent) {\n        rc = _libssh2_packet_requirev(session, reply_codes,\n                                      &session->open_data,\n                                      &session->open_data_len, 1,\n                                      session->open_packet + 5 +\n                                      channel_type_len, 4,\n                                      &session->open_packet_requirev_state);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, \"Would block\");\n            return NULL;\n        } else if (rc) {\n            goto channel_error;\n        }\n\n        if (session->open_data[0] == SSH_MSG_CHANNEL_OPEN_CONFIRMATION) {\n            session->open_channel->remote.id =\n                _libssh2_ntohu32(session->open_data + 5);\n            session->open_channel->local.window_size =\n                _libssh2_ntohu32(session->open_data + 9);\n            session->open_channel->local.window_size_initial =\n                _libssh2_ntohu32(session->open_data + 9);\n            session->open_channel->local.packet_size =\n                _libssh2_ntohu32(session->open_data + 13);\n            _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                           \"Connection Established - ID: %lu/%lu win: %lu/%lu\"\n                           \" pack: %lu/%lu\",\n                           session->open_channel->local.id,\n                           session->open_channel->remote.id,\n                           session->open_channel->local.window_size,\n                           session->open_channel->remote.window_size,\n                           session->open_channel->local.packet_size,\n                           session->open_channel->remote.packet_size);\n            LIBSSH2_FREE(session, session->open_packet);\n            session->open_packet = NULL;\n            LIBSSH2_FREE(session, session->open_data);\n            session->open_data = NULL;\n\n            session->open_state = libssh2_NB_state_idle;\n            return session->open_channel;\n        }\n\n        if (session->open_data[0] == SSH_MSG_CHANNEL_OPEN_FAILURE) {\n            unsigned int reason_code = _libssh2_ntohu32(session->open_data + 5);\n            switch (reason_code) {\n            case SSH_OPEN_ADMINISTRATIVELY_PROHIBITED:\n                _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                               \"Channel open failure (administratively prohibited)\");\n                break;\n            case SSH_OPEN_CONNECT_FAILED:\n                _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                               \"Channel open failure (connect failed)\");\n                break;\n            case SSH_OPEN_UNKNOWN_CHANNELTYPE:\n                _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                               \"Channel open failure (unknown channel type)\");\n                break;\n            case SSH_OPEN_RESOURCE_SHORTAGE:\n                _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                               \"Channel open failure (resource shortage)\");\n                break;\n            default:\n                _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                               \"Channel open failure\");\n            }\n        }\n    }\n\n  channel_error:\n\n    if (session->open_data) {\n        LIBSSH2_FREE(session, session->open_data);\n        session->open_data = NULL;\n    }\n    if (session->open_packet) {\n        LIBSSH2_FREE(session, session->open_packet);\n        session->open_packet = NULL;\n    }\n    if (session->open_channel) {\n        unsigned char channel_id[4];\n        LIBSSH2_FREE(session, session->open_channel->channel_type);\n\n        _libssh2_list_remove(&session->open_channel->node);\n\n        /* Clear out packets meant for this channel */\n        _libssh2_htonu32(channel_id, session->open_channel->local.id);\n        while ((_libssh2_packet_ask(session, SSH_MSG_CHANNEL_DATA,\n                                    &session->open_data,\n                                    &session->open_data_len, 1,\n                                    channel_id, 4) >= 0)\n               ||\n               (_libssh2_packet_ask(session, SSH_MSG_CHANNEL_EXTENDED_DATA,\n                                    &session->open_data,\n                                    &session->open_data_len, 1,\n                                    channel_id, 4) >= 0)) {\n            LIBSSH2_FREE(session, session->open_data);\n            session->open_data = NULL;\n        }\n\n        LIBSSH2_FREE(session, session->open_channel);\n        session->open_channel = NULL;\n    }\n\n    session->open_state = libssh2_NB_state_idle;\n    return NULL;\n}\n\n/*\n * libssh2_channel_open_ex\n *\n * Establish a generic session channel\n */\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_open_ex(LIBSSH2_SESSION *session, const char *type,\n                        unsigned int type_len,\n                        unsigned int window_size, unsigned int packet_size,\n                        const char *msg, unsigned int msg_len)\n{\n    LIBSSH2_CHANNEL *ptr;\n\n    if(!session)\n        return NULL;\n\n    BLOCK_ADJUST_ERRNO(ptr, session,\n                       _libssh2_channel_open(session, type, type_len,\n                                             window_size, packet_size,\n                                             (unsigned char *)msg,\n                                             msg_len));\n    return ptr;\n}\n\n/*\n * libssh2_channel_direct_tcpip_ex\n *\n * Tunnel TCP/IP connect through the SSH session to direct host/port\n */\nstatic LIBSSH2_CHANNEL *\nchannel_direct_tcpip(LIBSSH2_SESSION * session, const char *host,\n                     int port, const char *shost, int sport)\n{\n    LIBSSH2_CHANNEL *channel;\n    unsigned char *s;\n\n    if (session->direct_state == libssh2_NB_state_idle) {\n        session->direct_host_len = strlen(host);\n        session->direct_shost_len = strlen(shost);\n        /* host_len(4) + port(4) + shost_len(4) + sport(4) */\n        session->direct_message_len =\n            session->direct_host_len + session->direct_shost_len + 16;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Requesting direct-tcpip session to from %s:%d to %s:%d\",\n                       shost, sport, host, port);\n\n        s = session->direct_message =\n            LIBSSH2_ALLOC(session, session->direct_message_len);\n        if (!session->direct_message) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate memory for direct-tcpip connection\");\n            return NULL;\n        }\n        _libssh2_store_str(&s, host, session->direct_host_len);\n        _libssh2_store_u32(&s, port);\n        _libssh2_store_str(&s, shost, session->direct_shost_len);\n        _libssh2_store_u32(&s, sport);\n    }\n\n    channel =\n        _libssh2_channel_open(session, \"direct-tcpip\",\n                              sizeof(\"direct-tcpip\") - 1,\n                              LIBSSH2_CHANNEL_WINDOW_DEFAULT,\n                              LIBSSH2_CHANNEL_PACKET_DEFAULT,\n                              session->direct_message,\n                              session->direct_message_len);\n\n    if (!channel &&\n        libssh2_session_last_errno(session) == LIBSSH2_ERROR_EAGAIN) {\n        /* The error code is still set to LIBSSH2_ERROR_EAGAIN, set our state\n           to created to avoid re-creating the package on next invoke */\n        session->direct_state = libssh2_NB_state_created;\n        return NULL;\n    }\n    /* by default we set (keep?) idle state... */\n    session->direct_state = libssh2_NB_state_idle;\n\n    LIBSSH2_FREE(session, session->direct_message);\n    session->direct_message = NULL;\n\n    return channel;\n}\n\n/*\n * libssh2_channel_direct_tcpip_ex\n *\n * Tunnel TCP/IP connect through the SSH session to direct host/port\n */\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_direct_tcpip_ex(LIBSSH2_SESSION *session, const char *host,\n                                int port, const char *shost, int sport)\n{\n    LIBSSH2_CHANNEL *ptr;\n\n    if(!session)\n        return NULL;\n\n    BLOCK_ADJUST_ERRNO(ptr, session,\n                       channel_direct_tcpip(session, host, port, shost, sport));\n    return ptr;\n}\n\n/*\n * channel_forward_listen\n *\n * Bind a port on the remote host and listen for connections\n */\nstatic LIBSSH2_LISTENER *\nchannel_forward_listen(LIBSSH2_SESSION * session, const char *host,\n                       int port, int *bound_port, int queue_maxsize)\n{\n    unsigned char *s;\n    static const unsigned char reply_codes[3] =\n        { SSH_MSG_REQUEST_SUCCESS, SSH_MSG_REQUEST_FAILURE, 0 };\n    int rc;\n\n    if(!host)\n        host = \"0.0.0.0\";\n\n    if (session->fwdLstn_state == libssh2_NB_state_idle) {\n        session->fwdLstn_host_len = strlen(host);\n        /* 14 = packet_type(1) + request_len(4) + want_replay(1) + host_len(4)\n           + port(4) */\n        session->fwdLstn_packet_len =\n            session->fwdLstn_host_len + (sizeof(\"tcpip-forward\") - 1) + 14;\n\n        /* Zero the whole thing out */\n        memset(&session->fwdLstn_packet_requirev_state, 0,\n               sizeof(session->fwdLstn_packet_requirev_state));\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Requesting tcpip-forward session for %s:%d\", host,\n                       port);\n\n        s = session->fwdLstn_packet =\n            LIBSSH2_ALLOC(session, session->fwdLstn_packet_len);\n        if (!session->fwdLstn_packet) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate memory for setenv packet\");\n            return NULL;\n        }\n\n        *(s++) = SSH_MSG_GLOBAL_REQUEST;\n        _libssh2_store_str(&s, \"tcpip-forward\", sizeof(\"tcpip-forward\") - 1);\n        *(s++) = 0x01;          /* want_reply */\n\n        _libssh2_store_str(&s, host, session->fwdLstn_host_len);\n        _libssh2_store_u32(&s, port);\n\n        session->fwdLstn_state = libssh2_NB_state_created;\n    }\n\n    if (session->fwdLstn_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session,\n                                     session->fwdLstn_packet,\n                                     session->fwdLstn_packet_len,\n                                     NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block sending global-request packet for \"\n                           \"forward listen request\");\n            return NULL;\n        }\n        else if (rc) {\n            _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                           \"Unable to send global-request packet for forward \"\n                           \"listen request\");\n            LIBSSH2_FREE(session, session->fwdLstn_packet);\n            session->fwdLstn_packet = NULL;\n            session->fwdLstn_state = libssh2_NB_state_idle;\n            return NULL;\n        }\n        LIBSSH2_FREE(session, session->fwdLstn_packet);\n        session->fwdLstn_packet = NULL;\n\n        session->fwdLstn_state = libssh2_NB_state_sent;\n    }\n\n    if (session->fwdLstn_state == libssh2_NB_state_sent) {\n        unsigned char *data;\n        size_t data_len;\n        rc = _libssh2_packet_requirev(session, reply_codes, &data, &data_len,\n                                      0, NULL, 0,\n                                      &session->fwdLstn_packet_requirev_state);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, \"Would block\");\n            return NULL;\n        } else if (rc) {\n            _libssh2_error(session, LIBSSH2_ERROR_PROTO, \"Unknown\");\n            session->fwdLstn_state = libssh2_NB_state_idle;\n            return NULL;\n        }\n\n        if (data[0] == SSH_MSG_REQUEST_SUCCESS) {\n            LIBSSH2_LISTENER *listener;\n\n            listener = LIBSSH2_CALLOC(session, sizeof(LIBSSH2_LISTENER));\n            if (!listener)\n                _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                               \"Unable to allocate memory for listener queue\");\n            else {\n                listener->host =\n                    LIBSSH2_ALLOC(session, session->fwdLstn_host_len + 1);\n                if (!listener->host) {\n                    _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                   \"Unable to allocate memory for listener queue\");\n                    LIBSSH2_FREE(session, listener);\n                    listener = NULL;\n                }\n                else {\n                    listener->session = session;\n                    memcpy(listener->host, host, session->fwdLstn_host_len);\n                    listener->host[session->fwdLstn_host_len] = 0;\n                    if (data_len >= 5 && !port) {\n                        listener->port = _libssh2_ntohu32(data + 1);\n                        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                                       \"Dynamic tcpip-forward port allocated: %d\",\n                                       listener->port);\n                    }\n                    else\n                        listener->port = port;\n\n                    listener->queue_size = 0;\n                    listener->queue_maxsize = queue_maxsize;\n\n                    /* append this to the parent's list of listeners */\n                    _libssh2_list_add(&session->listeners, &listener->node);\n\n                    if (bound_port) {\n                        *bound_port = listener->port;\n                    }\n                }\n            }\n\n            LIBSSH2_FREE(session, data);\n            session->fwdLstn_state = libssh2_NB_state_idle;\n            return listener;\n        }\n        else if (data[0] == SSH_MSG_REQUEST_FAILURE) {\n            LIBSSH2_FREE(session, data);\n            _libssh2_error(session, LIBSSH2_ERROR_REQUEST_DENIED,\n                           \"Unable to complete request for forward-listen\");\n            session->fwdLstn_state = libssh2_NB_state_idle;\n            return NULL;\n        }\n    }\n\n    session->fwdLstn_state = libssh2_NB_state_idle;\n\n    return NULL;\n}\n\n/*\n * libssh2_channel_forward_listen_ex\n *\n * Bind a port on the remote host and listen for connections\n */\nLIBSSH2_API LIBSSH2_LISTENER *\nlibssh2_channel_forward_listen_ex(LIBSSH2_SESSION *session, const char *host,\n                                  int port, int *bound_port, int queue_maxsize)\n{\n    LIBSSH2_LISTENER *ptr;\n\n    if(!session)\n        return NULL;\n\n    BLOCK_ADJUST_ERRNO(ptr, session,\n                       channel_forward_listen(session, host, port, bound_port,\n                                              queue_maxsize));\n    return ptr;\n}\n\n/*\n * _libssh2_channel_forward_cancel\n *\n * Stop listening on a remote port and free the listener\n * Toss out any pending (un-accept()ed) connections\n *\n * Return 0 on success, LIBSSH2_ERROR_EAGAIN if would block, -1 on error\n */\nint _libssh2_channel_forward_cancel(LIBSSH2_LISTENER *listener)\n{\n    LIBSSH2_SESSION *session = listener->session;\n    LIBSSH2_CHANNEL *queued;\n    unsigned char *packet, *s;\n    size_t host_len = strlen(listener->host);\n    /* 14 = packet_type(1) + request_len(4) + want_replay(1) + host_len(4) +\n       port(4) */\n    size_t packet_len =\n        host_len + 14 + sizeof(\"cancel-tcpip-forward\") - 1;\n    int rc;\n    int retcode = 0;\n\n    if (listener->chanFwdCncl_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Cancelling tcpip-forward session for %s:%d\",\n                       listener->host, listener->port);\n\n        s = packet = LIBSSH2_ALLOC(session, packet_len);\n        if (!packet) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate memory for setenv packet\");\n            return LIBSSH2_ERROR_ALLOC;\n        }\n\n        *(s++) = SSH_MSG_GLOBAL_REQUEST;\n        _libssh2_store_str(&s, \"cancel-tcpip-forward\",\n                           sizeof(\"cancel-tcpip-forward\") - 1);\n        *(s++) = 0x00;          /* want_reply */\n\n        _libssh2_store_str(&s, listener->host, host_len);\n        _libssh2_store_u32(&s, listener->port);\n\n        listener->chanFwdCncl_state = libssh2_NB_state_created;\n    } else {\n        packet = listener->chanFwdCncl_data;\n    }\n\n    if (listener->chanFwdCncl_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, packet, packet_len, NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, rc,\n                           \"Would block sending forward request\");\n            listener->chanFwdCncl_data = packet;\n            return rc;\n        }\n        else if (rc) {\n            _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                           \"Unable to send global-request packet for forward \"\n                           \"listen request\");\n            /* set the state to something we don't check for, for the\n               unfortunate situation where we get an EAGAIN further down\n               when trying to bail out due to errors! */\n            listener->chanFwdCncl_state = libssh2_NB_state_sent;\n            retcode = LIBSSH2_ERROR_SOCKET_SEND;\n        }\n        LIBSSH2_FREE(session, packet);\n\n        listener->chanFwdCncl_state = libssh2_NB_state_sent;\n    }\n\n    queued = _libssh2_list_first(&listener->queue);\n    while (queued) {\n        LIBSSH2_CHANNEL *next = _libssh2_list_next(&queued->node);\n\n        rc = _libssh2_channel_free(queued);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        queued = next;\n    }\n    LIBSSH2_FREE(session, listener->host);\n\n    /* remove this entry from the parent's list of listeners */\n    _libssh2_list_remove(&listener->node);\n\n    LIBSSH2_FREE(session, listener);\n\n    return retcode;\n}\n\n/*\n * libssh2_channel_forward_cancel\n *\n * Stop listening on a remote port and free the listener\n * Toss out any pending (un-accept()ed) connections\n *\n * Return 0 on success, LIBSSH2_ERROR_EAGAIN if would block, -1 on error\n */\nLIBSSH2_API int\nlibssh2_channel_forward_cancel(LIBSSH2_LISTENER *listener)\n{\n    int rc;\n\n    if(!listener)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, listener->session,\n                 _libssh2_channel_forward_cancel(listener));\n    return rc;\n}\n\n/*\n * channel_forward_accept\n *\n * Accept a connection\n */\nstatic LIBSSH2_CHANNEL *\nchannel_forward_accept(LIBSSH2_LISTENER *listener)\n{\n    int rc;\n\n    do {\n        rc = _libssh2_transport_read(listener->session);\n    } while (rc > 0);\n\n    if (_libssh2_list_first(&listener->queue)) {\n        LIBSSH2_CHANNEL *channel = _libssh2_list_first(&listener->queue);\n\n        /* detach channel from listener's queue */\n        _libssh2_list_remove(&channel->node);\n\n        listener->queue_size--;\n\n        /* add channel to session's channel list */\n        _libssh2_list_add(&channel->session->channels, &channel->node);\n\n        return channel;\n    }\n\n    if (rc == LIBSSH2_ERROR_EAGAIN) {\n        _libssh2_error(listener->session, LIBSSH2_ERROR_EAGAIN,\n                       \"Would block waiting for packet\");\n    }\n    else\n        _libssh2_error(listener->session, LIBSSH2_ERROR_CHANNEL_UNKNOWN,\n                       \"Channel not found\");\n    return NULL;\n}\n\n/*\n * libssh2_channel_forward_accept\n *\n * Accept a connection\n */\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_forward_accept(LIBSSH2_LISTENER *listener)\n{\n    LIBSSH2_CHANNEL *ptr;\n\n    if(!listener)\n        return NULL;\n\n    BLOCK_ADJUST_ERRNO(ptr, listener->session,\n                       channel_forward_accept(listener));\n    return ptr;\n\n}\n\n/*\n * channel_setenv\n *\n * Set an environment variable prior to requesting a shell/program/subsystem\n */\nstatic int channel_setenv(LIBSSH2_CHANNEL *channel,\n                          const char *varname, unsigned int varname_len,\n                          const char *value, unsigned int value_len)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char *s, *data;\n    static const unsigned char reply_codes[3] =\n        { SSH_MSG_CHANNEL_SUCCESS, SSH_MSG_CHANNEL_FAILURE, 0 };\n    size_t data_len;\n    int rc;\n\n    if (channel->setenv_state == libssh2_NB_state_idle) {\n        /* 21 = packet_type(1) + channel_id(4) + request_len(4) +\n         * request(3)\"env\" + want_reply(1) + varname_len(4) + value_len(4) */\n        channel->setenv_packet_len = varname_len + value_len + 21;\n\n        /* Zero the whole thing out */\n        memset(&channel->setenv_packet_requirev_state, 0,\n               sizeof(channel->setenv_packet_requirev_state));\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Setting remote environment variable: %s=%s on \"\n                       \"channel %lu/%lu\",\n                       varname, value, channel->local.id, channel->remote.id);\n\n        s = channel->setenv_packet =\n            LIBSSH2_ALLOC(session, channel->setenv_packet_len);\n        if (!channel->setenv_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory \"\n                                  \"for setenv packet\");\n        }\n\n        *(s++) = SSH_MSG_CHANNEL_REQUEST;\n        _libssh2_store_u32(&s, channel->remote.id);\n        _libssh2_store_str(&s, \"env\", sizeof(\"env\") - 1);\n        *(s++) = 0x01;\n        _libssh2_store_str(&s, varname, varname_len);\n        _libssh2_store_str(&s, value, value_len);\n\n        channel->setenv_state = libssh2_NB_state_created;\n    }\n\n    if (channel->setenv_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session,\n                                     channel->setenv_packet,\n                                     channel->setenv_packet_len,\n                                     NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, rc,\n                           \"Would block sending setenv request\");\n            return rc;\n        } else if (rc) {\n            LIBSSH2_FREE(session, channel->setenv_packet);\n            channel->setenv_packet = NULL;\n            channel->setenv_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send channel-request packet for \"\n                                  \"setenv request\");\n        }\n        LIBSSH2_FREE(session, channel->setenv_packet);\n        channel->setenv_packet = NULL;\n\n        _libssh2_htonu32(channel->setenv_local_channel, channel->local.id);\n\n        channel->setenv_state = libssh2_NB_state_sent;\n    }\n\n    if (channel->setenv_state == libssh2_NB_state_sent) {\n        rc = _libssh2_packet_requirev(session, reply_codes, &data, &data_len,\n                                      1, channel->setenv_local_channel, 4,\n                                      &channel->\n                                      setenv_packet_requirev_state);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        if (rc) {\n            channel->setenv_state = libssh2_NB_state_idle;\n            return rc;\n        }\n\n        if (data[0] == SSH_MSG_CHANNEL_SUCCESS) {\n            LIBSSH2_FREE(session, data);\n            channel->setenv_state = libssh2_NB_state_idle;\n            return 0;\n        }\n\n        LIBSSH2_FREE(session, data);\n    }\n\n    channel->setenv_state = libssh2_NB_state_idle;\n    return _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED,\n                          \"Unable to complete request for channel-setenv\");\n}\n\n/*\n * libssh2_channel_setenv_ex\n *\n * Set an environment variable prior to requesting a shell/program/subsystem\n */\nLIBSSH2_API int\nlibssh2_channel_setenv_ex(LIBSSH2_CHANNEL *channel,\n                          const char *varname, unsigned int varname_len,\n                          const char *value, unsigned int value_len)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 channel_setenv(channel, varname, varname_len,\n                                value, value_len));\n    return rc;\n}\n\n/*\n * channel_request_pty\n * Duh... Request a PTY\n */\nstatic int channel_request_pty(LIBSSH2_CHANNEL *channel,\n                               const char *term, unsigned int term_len,\n                               const char *modes, unsigned int modes_len,\n                               int width, int height,\n                               int width_px, int height_px)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char *s;\n    static const unsigned char reply_codes[3] =\n        { SSH_MSG_CHANNEL_SUCCESS, SSH_MSG_CHANNEL_FAILURE, 0 };\n    int rc;\n\n    if (channel->reqPTY_state == libssh2_NB_state_idle) {\n        /* 41 = packet_type(1) + channel(4) + pty_req_len(4) + \"pty_req\"(7) +\n         * want_reply(1) + term_len(4) + width(4) + height(4) + width_px(4) +\n         * height_px(4) + modes_len(4) */\n        if(term_len + modes_len > 256) {\n            return _libssh2_error(session, LIBSSH2_ERROR_INVAL,\n                                  \"term + mode lengths too large\");\n        }\n\n        channel->reqPTY_packet_len = term_len + modes_len + 41;\n\n        /* Zero the whole thing out */\n        memset(&channel->reqPTY_packet_requirev_state, 0,\n               sizeof(channel->reqPTY_packet_requirev_state));\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Allocating tty on channel %lu/%lu\", channel->local.id,\n                       channel->remote.id);\n\n        s = channel->reqPTY_packet;\n\n        *(s++) = SSH_MSG_CHANNEL_REQUEST;\n        _libssh2_store_u32(&s, channel->remote.id);\n        _libssh2_store_str(&s, (char *)\"pty-req\", sizeof(\"pty-req\") - 1);\n\n        *(s++) = 0x01;\n\n        _libssh2_store_str(&s, term, term_len);\n        _libssh2_store_u32(&s, width);\n        _libssh2_store_u32(&s, height);\n        _libssh2_store_u32(&s, width_px);\n        _libssh2_store_u32(&s, height_px);\n        _libssh2_store_str(&s, modes, modes_len);\n\n        channel->reqPTY_state = libssh2_NB_state_created;\n    }\n\n    if (channel->reqPTY_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, channel->reqPTY_packet,\n                                     channel->reqPTY_packet_len,\n                                     NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, rc,\n                           \"Would block sending pty request\");\n            return rc;\n        } else if (rc) {\n            channel->reqPTY_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, rc,\n                                  \"Unable to send pty-request packet\");\n        }\n        _libssh2_htonu32(channel->reqPTY_local_channel, channel->local.id);\n\n        channel->reqPTY_state = libssh2_NB_state_sent;\n    }\n\n    if (channel->reqPTY_state == libssh2_NB_state_sent) {\n        unsigned char *data;\n        size_t data_len;\n        unsigned char code;\n        rc = _libssh2_packet_requirev(session, reply_codes, &data, &data_len,\n                                      1, channel->reqPTY_local_channel, 4,\n                                      &channel->reqPTY_packet_requirev_state);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc) {\n            channel->reqPTY_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                  \"Failed to require the PTY package\");\n        }\n\n        code = data[0];\n\n        LIBSSH2_FREE(session, data);\n        channel->reqPTY_state = libssh2_NB_state_idle;\n\n        if (code == SSH_MSG_CHANNEL_SUCCESS)\n            return 0;\n    }\n\n    return _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED,\n                          \"Unable to complete request for channel request-pty\");\n}\n\n/*\n * libssh2_channel_request_pty_ex\n * Duh... Request a PTY\n */\nLIBSSH2_API int\nlibssh2_channel_request_pty_ex(LIBSSH2_CHANNEL *channel, const char *term,\n                               unsigned int term_len, const char *modes,\n                               unsigned int modes_len, int width, int height,\n                               int width_px, int height_px)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 channel_request_pty(channel, term, term_len, modes,\n                                     modes_len, width, height,\n                                     width_px, height_px));\n    return rc;\n}\n\nstatic int\nchannel_request_pty_size(LIBSSH2_CHANNEL * channel, int width,\n                         int height, int width_px, int height_px)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char *s;\n    int rc;\n    int retcode = LIBSSH2_ERROR_PROTO;\n\n    if (channel->reqPTY_state == libssh2_NB_state_idle) {\n        channel->reqPTY_packet_len = 39;\n\n        /* Zero the whole thing out */\n        memset(&channel->reqPTY_packet_requirev_state, 0,\n               sizeof(channel->reqPTY_packet_requirev_state));\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n            \"changing tty size on channel %lu/%lu\",\n            channel->local.id,\n            channel->remote.id);\n\n        s = channel->reqPTY_packet;\n\n        *(s++) = SSH_MSG_CHANNEL_REQUEST;\n        _libssh2_store_u32(&s, channel->remote.id);\n        _libssh2_store_str(&s, (char *)\"window-change\",\n                           sizeof(\"window-change\") - 1);\n        *(s++) = 0x00; /* Don't reply */\n        _libssh2_store_u32(&s, width);\n        _libssh2_store_u32(&s, height);\n        _libssh2_store_u32(&s, width_px);\n        _libssh2_store_u32(&s, height_px);\n\n        channel->reqPTY_state = libssh2_NB_state_created;\n    }\n\n    if (channel->reqPTY_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, channel->reqPTY_packet,\n                                     channel->reqPTY_packet_len,\n                                     NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, rc,\n                           \"Would block sending window-change request\");\n            return rc;\n        } else if (rc) {\n            channel->reqPTY_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, rc,\n                                  \"Unable to send window-change packet\");\n        }\n        _libssh2_htonu32(channel->reqPTY_local_channel, channel->local.id);\n        retcode = LIBSSH2_ERROR_NONE;\n    }\n\n    channel->reqPTY_state = libssh2_NB_state_idle;\n    return retcode;\n}\n\nLIBSSH2_API int\nlibssh2_channel_request_pty_size_ex(LIBSSH2_CHANNEL *channel, int width,\n                                    int height, int width_px, int height_px)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 channel_request_pty_size(channel, width, height, width_px,\n                                          height_px));\n    return rc;\n}\n\n/* Keep this an even number */\n#define LIBSSH2_X11_RANDOM_COOKIE_LEN       32\n\n/*\n * channel_x11_req\n * Request X11 forwarding\n */\nstatic int\nchannel_x11_req(LIBSSH2_CHANNEL *channel, int single_connection,\n                const char *auth_proto, const char *auth_cookie,\n                int screen_number)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char *s;\n    static const unsigned char reply_codes[3] =\n        { SSH_MSG_CHANNEL_SUCCESS, SSH_MSG_CHANNEL_FAILURE, 0 };\n    size_t proto_len =\n        auth_proto ? strlen(auth_proto) : (sizeof(\"MIT-MAGIC-COOKIE-1\") - 1);\n    size_t cookie_len =\n        auth_cookie ? strlen(auth_cookie) : LIBSSH2_X11_RANDOM_COOKIE_LEN;\n    int rc;\n\n    if (channel->reqX11_state == libssh2_NB_state_idle) {\n        /* 30 = packet_type(1) + channel(4) + x11_req_len(4) + \"x11-req\"(7) +\n         * want_reply(1) + single_cnx(1) + proto_len(4) + cookie_len(4) +\n         * screen_num(4) */\n        channel->reqX11_packet_len = proto_len + cookie_len + 30;\n\n        /* Zero the whole thing out */\n        memset(&channel->reqX11_packet_requirev_state, 0,\n               sizeof(channel->reqX11_packet_requirev_state));\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Requesting x11-req for channel %lu/%lu: single=%d \"\n                       \"proto=%s cookie=%s screen=%d\",\n                       channel->local.id, channel->remote.id,\n                       single_connection,\n                       auth_proto ? auth_proto : \"MIT-MAGIC-COOKIE-1\",\n                       auth_cookie ? auth_cookie : \"<random>\", screen_number);\n\n        s = channel->reqX11_packet =\n            LIBSSH2_ALLOC(session, channel->reqX11_packet_len);\n        if (!channel->reqX11_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for pty-request\");\n        }\n\n        *(s++) = SSH_MSG_CHANNEL_REQUEST;\n        _libssh2_store_u32(&s, channel->remote.id);\n        _libssh2_store_str(&s, \"x11-req\", sizeof(\"x11-req\") - 1);\n\n        *(s++) = 0x01;          /* want_reply */\n        *(s++) = single_connection ? 0x01 : 0x00;\n\n        _libssh2_store_str(&s, auth_proto?auth_proto:\"MIT-MAGIC-COOKIE-1\",\n                           proto_len);\n\n        _libssh2_store_u32(&s, cookie_len);\n        if (auth_cookie) {\n            memcpy(s, auth_cookie, cookie_len);\n        } else {\n            int i;\n            /* note: the extra +1 below is necessary since the sprintf()\n               loop will always write 3 bytes so the last one will write\n               the trailing zero at the LIBSSH2_X11_RANDOM_COOKIE_LEN/2\n               border */\n            unsigned char buffer[(LIBSSH2_X11_RANDOM_COOKIE_LEN / 2) +1];\n\n            _libssh2_random(buffer, LIBSSH2_X11_RANDOM_COOKIE_LEN / 2);\n            for(i = 0; i < (LIBSSH2_X11_RANDOM_COOKIE_LEN / 2); i++) {\n                sprintf((char *)&s[i*2], \"%02X\", buffer[i]);\n            }\n        }\n        s += cookie_len;\n\n        _libssh2_store_u32(&s, screen_number);\n        channel->reqX11_state = libssh2_NB_state_created;\n    }\n\n    if (channel->reqX11_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, channel->reqX11_packet,\n                                     channel->reqX11_packet_len,\n                                     NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, rc,\n                           \"Would block sending X11-req packet\");\n            return rc;\n        }\n        if (rc) {\n            LIBSSH2_FREE(session, channel->reqX11_packet);\n            channel->reqX11_packet = NULL;\n            channel->reqX11_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, rc,\n                                  \"Unable to send x11-req packet\");\n        }\n        LIBSSH2_FREE(session, channel->reqX11_packet);\n        channel->reqX11_packet = NULL;\n\n        _libssh2_htonu32(channel->reqX11_local_channel, channel->local.id);\n\n        channel->reqX11_state = libssh2_NB_state_sent;\n    }\n\n    if (channel->reqX11_state == libssh2_NB_state_sent) {\n        size_t data_len;\n        unsigned char *data;\n        unsigned char code;\n\n        rc = _libssh2_packet_requirev(session, reply_codes, &data, &data_len,\n                                      1, channel->reqX11_local_channel, 4,\n                                      &channel->reqX11_packet_requirev_state);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc) {\n            channel->reqX11_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, rc,\n                                  \"waiting for x11-req response packet\");\n        }\n\n        code = data[0];\n        LIBSSH2_FREE(session, data);\n        channel->reqX11_state = libssh2_NB_state_idle;\n\n        if (code == SSH_MSG_CHANNEL_SUCCESS)\n            return 0;\n    }\n\n    return _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED,\n                          \"Unable to complete request for channel x11-req\");\n}\n\n/*\n * libssh2_channel_x11_req_ex\n * Request X11 forwarding\n */\nLIBSSH2_API int\nlibssh2_channel_x11_req_ex(LIBSSH2_CHANNEL *channel, int single_connection,\n                           const char *auth_proto, const char *auth_cookie,\n                           int screen_number)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 channel_x11_req(channel, single_connection, auth_proto,\n                                 auth_cookie, screen_number));\n    return rc;\n}\n\n\n/*\n * _libssh2_channel_process_startup\n *\n * Primitive for libssh2_channel_(shell|exec|subsystem)\n */\nint\n_libssh2_channel_process_startup(LIBSSH2_CHANNEL *channel,\n                                 const char *request, size_t request_len,\n                                 const char *message, size_t message_len)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char *s;\n    static const unsigned char reply_codes[3] =\n        { SSH_MSG_CHANNEL_SUCCESS, SSH_MSG_CHANNEL_FAILURE, 0 };\n    int rc;\n\n    if (channel->process_state == libssh2_NB_state_end) {\n        return _libssh2_error(session, LIBSSH2_ERROR_BAD_USE,\n                              \"Channel can not be reused\");\n    }\n\n    if (channel->process_state == libssh2_NB_state_idle) {\n        /* 10 = packet_type(1) + channel(4) + request_len(4) + want_reply(1) */\n        channel->process_packet_len = request_len + 10;\n\n        /* Zero the whole thing out */\n        memset(&channel->process_packet_requirev_state, 0,\n               sizeof(channel->process_packet_requirev_state));\n\n        if (message)\n            channel->process_packet_len += + 4;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"starting request(%s) on channel %lu/%lu, message=%s\",\n                       request, channel->local.id, channel->remote.id,\n                       message?message:\"<null>\");\n        s = channel->process_packet =\n            LIBSSH2_ALLOC(session, channel->process_packet_len);\n        if (!channel->process_packet)\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory \"\n                                  \"for channel-process request\");\n\n        *(s++) = SSH_MSG_CHANNEL_REQUEST;\n        _libssh2_store_u32(&s, channel->remote.id);\n        _libssh2_store_str(&s, request, request_len);\n        *(s++) = 0x01;\n\n        if (message)\n            _libssh2_store_u32(&s, message_len);\n\n        channel->process_state = libssh2_NB_state_created;\n    }\n\n    if (channel->process_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session,\n                                     channel->process_packet,\n                                     channel->process_packet_len,\n                                     (unsigned char *)message, message_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, rc,\n                           \"Would block sending channel request\");\n            return rc;\n        }\n        else if (rc) {\n            LIBSSH2_FREE(session, channel->process_packet);\n            channel->process_packet = NULL;\n            channel->process_state = libssh2_NB_state_end;\n            return _libssh2_error(session, rc,\n                                  \"Unable to send channel request\");\n        }\n        LIBSSH2_FREE(session, channel->process_packet);\n        channel->process_packet = NULL;\n\n        _libssh2_htonu32(channel->process_local_channel, channel->local.id);\n\n        channel->process_state = libssh2_NB_state_sent;\n    }\n\n    if (channel->process_state == libssh2_NB_state_sent) {\n        unsigned char *data;\n        size_t data_len;\n        unsigned char code;\n        rc = _libssh2_packet_requirev(session, reply_codes, &data, &data_len,\n                                      1, channel->process_local_channel, 4,\n                                      &channel->process_packet_requirev_state);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc) {\n            channel->process_state = libssh2_NB_state_end;\n            return _libssh2_error(session, rc,\n                                  \"Failed waiting for channel success\");\n        }\n\n        code = data[0];\n        LIBSSH2_FREE(session, data);\n        channel->process_state = libssh2_NB_state_end;\n\n        if (code == SSH_MSG_CHANNEL_SUCCESS)\n            return 0;\n    }\n\n    return _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED,\n                          \"Unable to complete request for \"\n                          \"channel-process-startup\");\n}\n\n/*\n * libssh2_channel_process_startup\n *\n * Primitive for libssh2_channel_(shell|exec|subsystem)\n */\nLIBSSH2_API int\nlibssh2_channel_process_startup(LIBSSH2_CHANNEL *channel,\n                                const char *req, unsigned int req_len,\n                                const char *msg, unsigned int msg_len)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 _libssh2_channel_process_startup(channel, req, req_len,\n                                                  msg, msg_len));\n    return rc;\n}\n\n\n/*\n * libssh2_channel_set_blocking\n *\n * Set a channel's BEHAVIOR blocking on or off. The socket will remain non-\n * blocking.\n */\nLIBSSH2_API void\nlibssh2_channel_set_blocking(LIBSSH2_CHANNEL * channel, int blocking)\n{\n    if(channel)\n        (void) _libssh2_session_set_blocking(channel->session, blocking);\n}\n\n/*\n * _libssh2_channel_flush\n *\n * Flush data from one (or all) stream\n * Returns number of bytes flushed, or negative on failure\n */\nint\n_libssh2_channel_flush(LIBSSH2_CHANNEL *channel, int streamid)\n{\n    if (channel->flush_state == libssh2_NB_state_idle) {\n        LIBSSH2_PACKET *packet =\n            _libssh2_list_first(&channel->session->packets);\n        channel->flush_refund_bytes = 0;\n        channel->flush_flush_bytes = 0;\n\n        while (packet) {\n            LIBSSH2_PACKET *next = _libssh2_list_next(&packet->node);\n            unsigned char packet_type = packet->data[0];\n\n            if (((packet_type == SSH_MSG_CHANNEL_DATA)\n                 || (packet_type == SSH_MSG_CHANNEL_EXTENDED_DATA))\n                && (_libssh2_ntohu32(packet->data + 1) == channel->local.id)) {\n                /* It's our channel at least */\n                long packet_stream_id =\n                    (packet_type == SSH_MSG_CHANNEL_DATA) ? 0 :\n                    _libssh2_ntohu32(packet->data + 5);\n                if ((streamid == LIBSSH2_CHANNEL_FLUSH_ALL)\n                    || ((packet_type == SSH_MSG_CHANNEL_EXTENDED_DATA)\n                        && ((streamid == LIBSSH2_CHANNEL_FLUSH_EXTENDED_DATA)\n                            || (streamid == packet_stream_id)))\n                    || ((packet_type == SSH_MSG_CHANNEL_DATA)\n                        && (streamid == 0))) {\n                    int bytes_to_flush = packet->data_len - packet->data_head;\n\n                    _libssh2_debug(channel->session, LIBSSH2_TRACE_CONN,\n                                   \"Flushing %d bytes of data from stream \"\n                                   \"%lu on channel %lu/%lu\",\n                                   bytes_to_flush, packet_stream_id,\n                                   channel->local.id, channel->remote.id);\n\n                    /* It's one of the streams we wanted to flush */\n                    channel->flush_refund_bytes += packet->data_len - 13;\n                    channel->flush_flush_bytes += bytes_to_flush;\n\n                    LIBSSH2_FREE(channel->session, packet->data);\n\n                    /* remove this packet from the parent's list */\n                    _libssh2_list_remove(&packet->node);\n                    LIBSSH2_FREE(channel->session, packet);\n                }\n            }\n            packet = next;\n        }\n\n        channel->flush_state = libssh2_NB_state_created;\n    }\n\n    channel->read_avail -= channel->flush_flush_bytes;\n    channel->remote.window_size -= channel->flush_flush_bytes;\n\n    if (channel->flush_refund_bytes) {\n        int rc;\n\n        rc = _libssh2_channel_receive_window_adjust(channel,\n                                                    channel->flush_refund_bytes,\n                                                    1, NULL);\n        if (rc == LIBSSH2_ERROR_EAGAIN)\n            return rc;\n    }\n\n    channel->flush_state = libssh2_NB_state_idle;\n\n    return channel->flush_flush_bytes;\n}\n\n/*\n * libssh2_channel_flush_ex\n *\n * Flush data from one (or all) stream\n * Returns number of bytes flushed, or negative on failure\n */\nLIBSSH2_API int\nlibssh2_channel_flush_ex(LIBSSH2_CHANNEL *channel, int stream)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 _libssh2_channel_flush(channel, stream));\n    return rc;\n}\n\n/*\n * libssh2_channel_get_exit_status\n *\n * Return the channel's program exit status. Note that the actual protocol\n * provides the full 32bit this function returns.  We cannot abuse it to\n * return error values in case of errors so we return a zero if channel is\n * NULL.\n */\nLIBSSH2_API int\nlibssh2_channel_get_exit_status(LIBSSH2_CHANNEL *channel)\n{\n    if(!channel)\n        return 0;\n\n    return channel->exit_status;\n}\n\n/*\n * libssh2_channel_get_exit_signal\n *\n * Get exit signal (without leading \"SIG\"), error message, and language\n * tag into newly allocated buffers of indicated length.  Caller can\n * use NULL pointers to indicate that the value should not be set.  The\n * *_len variables are set if they are non-NULL even if the\n * corresponding string parameter is NULL.  Returns LIBSSH2_ERROR_NONE\n * on success, or an API error code.\n */\nLIBSSH2_API int\nlibssh2_channel_get_exit_signal(LIBSSH2_CHANNEL *channel,\n                                char **exitsignal,\n                                size_t *exitsignal_len,\n                                char **errmsg,\n                                size_t *errmsg_len,\n                                char **langtag,\n                                size_t *langtag_len)\n{\n    size_t namelen = 0;\n\n    if (channel) {\n        LIBSSH2_SESSION *session = channel->session;\n\n        if (channel->exit_signal) {\n            namelen = strlen(channel->exit_signal);\n            if (exitsignal) {\n               *exitsignal = LIBSSH2_ALLOC(session, namelen + 1);\n                if (!*exitsignal) {\n                    return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                        \"Unable to allocate memory for signal name\");\n                }\n                memcpy(*exitsignal, channel->exit_signal, namelen);\n                (*exitsignal)[namelen] = '\\0';\n            }\n            if (exitsignal_len)\n                *exitsignal_len = namelen;\n        } else {\n            if (exitsignal)\n                *exitsignal = NULL;\n            if (exitsignal_len)\n                *exitsignal_len = 0;\n        }\n\n        /* TODO: set error message and language tag */\n\n        if (errmsg)\n            *errmsg = NULL;\n\n        if (errmsg_len)\n            *errmsg_len = 0;\n\n        if (langtag)\n            *langtag = NULL;\n\n        if (langtag_len)\n            *langtag_len = 0;\n    }\n\n    return LIBSSH2_ERROR_NONE;\n}\n\n/*\n * _libssh2_channel_receive_window_adjust\n *\n * Adjust the receive window for a channel by adjustment bytes. If the amount\n * to be adjusted is less than LIBSSH2_CHANNEL_MINADJUST and force is 0 the\n * adjustment amount will be queued for a later packet.\n *\n * Calls _libssh2_error() !\n */\nint\n_libssh2_channel_receive_window_adjust(LIBSSH2_CHANNEL * channel,\n                                       uint32_t adjustment,\n                                       unsigned char force,\n                                       unsigned int *store)\n{\n    int rc;\n\n    if(store)\n        *store = channel->remote.window_size;\n\n    if (channel->adjust_state == libssh2_NB_state_idle) {\n        if (!force\n            && (adjustment + channel->adjust_queue <\n                LIBSSH2_CHANNEL_MINADJUST)) {\n            _libssh2_debug(channel->session, LIBSSH2_TRACE_CONN,\n                           \"Queueing %lu bytes for receive window adjustment \"\n                           \"for channel %lu/%lu\",\n                           adjustment, channel->local.id, channel->remote.id);\n            channel->adjust_queue += adjustment;\n            return 0;\n        }\n\n        if (!adjustment && !channel->adjust_queue) {\n            return 0;\n        }\n\n        adjustment += channel->adjust_queue;\n        channel->adjust_queue = 0;\n\n        /* Adjust the window based on the block we just freed */\n        channel->adjust_adjust[0] = SSH_MSG_CHANNEL_WINDOW_ADJUST;\n        _libssh2_htonu32(&channel->adjust_adjust[1], channel->remote.id);\n        _libssh2_htonu32(&channel->adjust_adjust[5], adjustment);\n        _libssh2_debug(channel->session, LIBSSH2_TRACE_CONN,\n                       \"Adjusting window %lu bytes for data on \"\n                       \"channel %lu/%lu\",\n                       adjustment, channel->local.id, channel->remote.id);\n\n        channel->adjust_state = libssh2_NB_state_created;\n    }\n\n    rc = _libssh2_transport_send(channel->session, channel->adjust_adjust, 9,\n                                 NULL, 0);\n    if (rc == LIBSSH2_ERROR_EAGAIN) {\n        _libssh2_error(channel->session, rc,\n                       \"Would block sending window adjust\");\n        return rc;\n    }\n    else if (rc) {\n        channel->adjust_queue = adjustment;\n        return _libssh2_error(channel->session, LIBSSH2_ERROR_SOCKET_SEND,\n                              \"Unable to send transfer-window adjustment \"\n                              \"packet, deferring\");\n    }\n    else {\n        channel->remote.window_size += adjustment;\n    }\n\n    channel->adjust_state = libssh2_NB_state_idle;\n\n    return 0;\n}\n\n/*\n * libssh2_channel_receive_window_adjust\n *\n * DEPRECATED\n *\n * Adjust the receive window for a channel by adjustment bytes. If the amount\n * to be adjusted is less than LIBSSH2_CHANNEL_MINADJUST and force is 0 the\n * adjustment amount will be queued for a later packet.\n *\n * Returns the new size of the receive window (as understood by remote end).\n * Note that it might return EAGAIN too which is highly stupid.\n *\n */\nLIBSSH2_API unsigned long\nlibssh2_channel_receive_window_adjust(LIBSSH2_CHANNEL *channel,\n                                      unsigned long adj,\n                                      unsigned char force)\n{\n    unsigned int window;\n    int rc;\n\n    if(!channel)\n        return (unsigned long)LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 _libssh2_channel_receive_window_adjust(channel, adj,\n                                                        force, &window));\n\n    /* stupid - but this is how it was made to work before and this is just\n       kept for backwards compatibility */\n    return rc?(unsigned long)rc:window;\n}\n\n/*\n * libssh2_channel_receive_window_adjust2\n *\n * Adjust the receive window for a channel by adjustment bytes. If the amount\n * to be adjusted is less than LIBSSH2_CHANNEL_MINADJUST and force is 0 the\n * adjustment amount will be queued for a later packet.\n *\n * Stores the new size of the receive window in the data 'window' points to.\n *\n * Returns the \"normal\" error code: 0 for success, negative for failure.\n */\nLIBSSH2_API int\nlibssh2_channel_receive_window_adjust2(LIBSSH2_CHANNEL *channel,\n                                       unsigned long adj,\n                                       unsigned char force,\n                                       unsigned int *window)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 _libssh2_channel_receive_window_adjust(channel, adj, force,\n                                                        window));\n    return rc;\n}\n\nint\n_libssh2_channel_extended_data(LIBSSH2_CHANNEL *channel, int ignore_mode)\n{\n    if (channel->extData2_state == libssh2_NB_state_idle) {\n        _libssh2_debug(channel->session, LIBSSH2_TRACE_CONN,\n                       \"Setting channel %lu/%lu handle_extended_data\"\n                       \" mode to %d\",\n                       channel->local.id, channel->remote.id, ignore_mode);\n        channel->remote.extended_data_ignore_mode = (char)ignore_mode;\n\n        channel->extData2_state = libssh2_NB_state_created;\n    }\n\n    if (channel->extData2_state == libssh2_NB_state_idle) {\n        if (ignore_mode == LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE) {\n            int rc =\n                _libssh2_channel_flush(channel,\n                                       LIBSSH2_CHANNEL_FLUSH_EXTENDED_DATA);\n            if(LIBSSH2_ERROR_EAGAIN == rc)\n                return rc;\n        }\n    }\n\n    channel->extData2_state = libssh2_NB_state_idle;\n    return 0;\n}\n\n/*\n * libssh2_channel_handle_extended_data2()\n *\n */\nLIBSSH2_API int\nlibssh2_channel_handle_extended_data2(LIBSSH2_CHANNEL *channel,\n                                      int mode)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session, _libssh2_channel_extended_data(channel,\n                                                                      mode));\n    return rc;\n}\n\n/*\n * libssh2_channel_handle_extended_data\n *\n * DEPRECATED DO NOTE USE!\n *\n * How should extended data look to the calling app?  Keep it in separate\n * channels[_read() _read_stdder()]? (NORMAL) Merge the extended data to the\n * standard data? [everything via _read()]? (MERGE) Ignore it entirely [toss\n * out packets as they come in]? (IGNORE)\n */\nLIBSSH2_API void\nlibssh2_channel_handle_extended_data(LIBSSH2_CHANNEL *channel,\n                                     int ignore_mode)\n{\n    (void)libssh2_channel_handle_extended_data2(channel, ignore_mode);\n}\n\n\n\n/*\n * _libssh2_channel_read\n *\n * Read data from a channel\n *\n * It is important to not return 0 until the currently read channel is\n * complete. If we read stuff from the wire but it was no payload data to fill\n * in the buffer with, we MUST make sure to return LIBSSH2_ERROR_EAGAIN.\n *\n * The receive window must be maintained (enlarged) by the user of this\n * function.\n */\nssize_t _libssh2_channel_read(LIBSSH2_CHANNEL *channel, int stream_id,\n                              char *buf, size_t buflen)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    int rc;\n    int bytes_read = 0;\n    int bytes_want;\n    int unlink_packet;\n    LIBSSH2_PACKET *read_packet;\n    LIBSSH2_PACKET *read_next;\n\n    _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                   \"channel_read() wants %d bytes from channel %lu/%lu \"\n                   \"stream #%d\",\n                   (int) buflen, channel->local.id, channel->remote.id,\n                   stream_id);\n\n    /* expand the receiving window first if it has become too narrow */\n    if( (channel->read_state == libssh2_NB_state_jump1) ||\n        (channel->remote.window_size < channel->remote.window_size_initial / 4 * 3 + buflen) ) {\n\n        uint32_t adjustment = channel->remote.window_size_initial + buflen - channel->remote.window_size;\n        if (adjustment < LIBSSH2_CHANNEL_MINADJUST)\n            adjustment = LIBSSH2_CHANNEL_MINADJUST;\n\n        /* the actual window adjusting may not finish so we need to deal with\n           this special state here */\n        channel->read_state = libssh2_NB_state_jump1;\n        rc = _libssh2_channel_receive_window_adjust(channel, adjustment,\n                                                    0, NULL);\n        if (rc)\n            return rc;\n\n        channel->read_state = libssh2_NB_state_idle;\n    }\n\n    /* Process all pending incoming packets. Tests prove that this way\n       produces faster transfers. */\n    do {\n        rc = _libssh2_transport_read(session);\n    } while (rc > 0);\n\n    if ((rc < 0) && (rc != LIBSSH2_ERROR_EAGAIN))\n        return _libssh2_error(session, rc, \"transport read\");\n\n    read_packet = _libssh2_list_first(&session->packets);\n    while (read_packet && (bytes_read < (int) buflen)) {\n        /* previously this loop condition also checked for\n           !channel->remote.close but we cannot let it do this:\n\n           We may have a series of packets to read that are still pending even\n           if a close has been received. Acknowledging the close too early\n           makes us flush buffers prematurely and loose data.\n        */\n\n        LIBSSH2_PACKET *readpkt = read_packet;\n\n        /* In case packet gets destroyed during this iteration */\n        read_next = _libssh2_list_next(&readpkt->node);\n\n        channel->read_local_id =\n            _libssh2_ntohu32(readpkt->data + 1);\n\n        /*\n         * Either we asked for a specific extended data stream\n         * (and data was available),\n         * or the standard stream (and data was available),\n         * or the standard stream with extended_data_merge\n         * enabled and data was available\n         */\n        if ((stream_id\n             && (readpkt->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA)\n             && (channel->local.id == channel->read_local_id)\n             && (stream_id == (int) _libssh2_ntohu32(readpkt->data + 5)))\n            || (!stream_id && (readpkt->data[0] == SSH_MSG_CHANNEL_DATA)\n                && (channel->local.id == channel->read_local_id))\n            || (!stream_id\n                && (readpkt->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA)\n                && (channel->local.id == channel->read_local_id)\n                && (channel->remote.extended_data_ignore_mode ==\n                    LIBSSH2_CHANNEL_EXTENDED_DATA_MERGE))) {\n\n            /* figure out much more data we want to read */\n            bytes_want = buflen - bytes_read;\n            unlink_packet = FALSE;\n\n            if (bytes_want >= (int) (readpkt->data_len - readpkt->data_head)) {\n                /* we want more than this node keeps, so adjust the number and\n                   delete this node after the copy */\n                bytes_want = readpkt->data_len - readpkt->data_head;\n                unlink_packet = TRUE;\n            }\n\n            _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                           \"channel_read() got %d of data from %lu/%lu/%d%s\",\n                           bytes_want, channel->local.id,\n                           channel->remote.id, stream_id,\n                           unlink_packet?\" [ul]\":\"\");\n\n            /* copy data from this struct to the target buffer */\n            memcpy(&buf[bytes_read],\n                   &readpkt->data[readpkt->data_head], bytes_want);\n\n            /* advance pointer and counter */\n            readpkt->data_head += bytes_want;\n            bytes_read += bytes_want;\n\n            /* if drained, remove from list */\n            if (unlink_packet) {\n                /* detach readpkt from session->packets list */\n                _libssh2_list_remove(&readpkt->node);\n\n                LIBSSH2_FREE(session, readpkt->data);\n                LIBSSH2_FREE(session, readpkt);\n            }\n        }\n\n        /* check the next struct in the chain */\n        read_packet = read_next;\n    }\n\n    if (!bytes_read) {\n        /* If the channel is already at EOF or even closed, we need to signal\n           that back. We may have gotten that info while draining the incoming\n           transport layer until EAGAIN so we must not be fooled by that\n           return code. */\n        if(channel->remote.eof || channel->remote.close)\n            return 0;\n        else if(rc != LIBSSH2_ERROR_EAGAIN)\n            return 0;\n\n        /* if the transport layer said EAGAIN then we say so as well */\n        return _libssh2_error(session, rc, \"would block\");\n    }\n\n    channel->read_avail -= bytes_read;\n    channel->remote.window_size -= bytes_read;\n\n    return bytes_read;\n}\n\n/*\n * libssh2_channel_read_ex\n *\n * Read data from a channel (blocking or non-blocking depending on set state)\n *\n * When this is done non-blocking, it is important to not return 0 until the\n * currently read channel is complete. If we read stuff from the wire but it\n * was no payload data to fill in the buffer with, we MUST make sure to return\n * LIBSSH2_ERROR_EAGAIN.\n *\n * This function will first make sure there's a receive window enough to\n * receive a full buffer's wort of contents. An application may choose to\n * adjust the receive window more to increase transfer performance.\n */\nLIBSSH2_API ssize_t\nlibssh2_channel_read_ex(LIBSSH2_CHANNEL *channel, int stream_id, char *buf,\n                        size_t buflen)\n{\n    int rc;\n    unsigned long recv_window;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    recv_window = libssh2_channel_window_read_ex(channel, NULL, NULL);\n\n    if(buflen > recv_window) {\n        BLOCK_ADJUST(rc, channel->session,\n                     _libssh2_channel_receive_window_adjust(channel, buflen,\n                                                            1, NULL));\n    }\n\n    BLOCK_ADJUST(rc, channel->session,\n                 _libssh2_channel_read(channel, stream_id, buf, buflen));\n    return rc;\n}\n\n/*\n * _libssh2_channel_packet_data_len\n *\n * Return the size of the data block of the current packet, or 0 if there\n * isn't a packet.\n */\nsize_t\n_libssh2_channel_packet_data_len(LIBSSH2_CHANNEL * channel, int stream_id)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    LIBSSH2_PACKET *read_packet;\n    uint32_t read_local_id;\n\n    read_packet = _libssh2_list_first(&session->packets);\n    if (read_packet == NULL)\n        return 0;\n\n    while (read_packet) {\n        read_local_id = _libssh2_ntohu32(read_packet->data + 1);\n\n        /*\n         * Either we asked for a specific extended data stream\n         * (and data was available),\n         * or the standard stream (and data was available),\n         * or the standard stream with extended_data_merge\n         * enabled and data was available\n         */\n        if ((stream_id\n             && (read_packet->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA)\n             && (channel->local.id == read_local_id)\n             && (stream_id == (int) _libssh2_ntohu32(read_packet->data + 5)))\n            ||\n            (!stream_id\n             && (read_packet->data[0] == SSH_MSG_CHANNEL_DATA)\n             && (channel->local.id == read_local_id))\n            ||\n            (!stream_id\n             && (read_packet->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA)\n             && (channel->local.id == read_local_id)\n             && (channel->remote.extended_data_ignore_mode\n                 == LIBSSH2_CHANNEL_EXTENDED_DATA_MERGE)))\n        {\n            return (read_packet->data_len - read_packet->data_head);\n        }\n        read_packet = _libssh2_list_next(&read_packet->node);\n    }\n\n    return 0;\n}\n\n/*\n * _libssh2_channel_write\n *\n * Send data to a channel. Note that if this returns EAGAIN, the caller must\n * call this function again with the SAME input arguments.\n *\n * Returns: number of bytes sent, or if it returns a negative number, that is\n * the error code!\n */\nssize_t\n_libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id,\n                       const unsigned char *buf, size_t buflen)\n{\n    int rc = 0;\n    LIBSSH2_SESSION *session = channel->session;\n    ssize_t wrote = 0; /* counter for this specific this call */\n\n    /* In theory we could split larger buffers into several smaller packets\n     * but it turns out to be really hard and nasty to do while still offering\n     * the API/prototype.\n     *\n     * Instead we only deal with the first 32K in this call and for the parent\n     * function to call it again with the remainder! 32K is a conservative\n     * limit based on the text in RFC4253 section 6.1.\n     */\n    if(buflen > 32700)\n        buflen = 32700;\n\n    if (channel->write_state == libssh2_NB_state_idle) {\n        unsigned char *s = channel->write_packet;\n\n        _libssh2_debug(channel->session, LIBSSH2_TRACE_CONN,\n                       \"Writing %d bytes on channel %lu/%lu, stream #%d\",\n                       (int) buflen, channel->local.id, channel->remote.id,\n                       stream_id);\n\n        if (channel->local.close)\n            return _libssh2_error(channel->session,\n                                  LIBSSH2_ERROR_CHANNEL_CLOSED,\n                                  \"We've already closed this channel\");\n        else if (channel->local.eof)\n            return _libssh2_error(channel->session,\n                                  LIBSSH2_ERROR_CHANNEL_EOF_SENT,\n                                  \"EOF has already been received, \"\n                                  \"data might be ignored\");\n\n        /* drain the incoming flow first, mostly to make sure we get all\n         * pending window adjust packets */\n        do\n            rc = _libssh2_transport_read(session);\n        while (rc > 0);\n\n        if((rc < 0) && (rc != LIBSSH2_ERROR_EAGAIN)) {\n            return _libssh2_error(channel->session, rc,\n                                  \"Failure while draining incoming flow\");\n        }\n\n        if(channel->local.window_size <= 0) {\n            /* there's no room for data so we stop */\n\n            /* Waiting on the socket to be writable would be wrong because we\n             * would be back here immediately, but a readable socket might\n             * herald an incoming window adjustment.\n             */\n            session->socket_block_directions = LIBSSH2_SESSION_BLOCK_INBOUND;\n\n            return (rc==LIBSSH2_ERROR_EAGAIN?rc:0);\n        }\n\n        channel->write_bufwrite = buflen;\n\n        *(s++) = stream_id ? SSH_MSG_CHANNEL_EXTENDED_DATA :\n            SSH_MSG_CHANNEL_DATA;\n        _libssh2_store_u32(&s, channel->remote.id);\n        if (stream_id)\n            _libssh2_store_u32(&s, stream_id);\n\n        /* Don't exceed the remote end's limits */\n        /* REMEMBER local means local as the SOURCE of the data */\n        if (channel->write_bufwrite > channel->local.window_size) {\n            _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                           \"Splitting write block due to %lu byte \"\n                           \"window_size on %lu/%lu/%d\",\n                           channel->local.window_size, channel->local.id,\n                           channel->remote.id, stream_id);\n            channel->write_bufwrite = channel->local.window_size;\n        }\n        if (channel->write_bufwrite > channel->local.packet_size) {\n            _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                           \"Splitting write block due to %lu byte \"\n                           \"packet_size on %lu/%lu/%d\",\n                           channel->local.packet_size, channel->local.id,\n                           channel->remote.id, stream_id);\n            channel->write_bufwrite = channel->local.packet_size;\n        }\n        /* store the size here only, the buffer is passed in as-is to\n           _libssh2_transport_send() */\n        _libssh2_store_u32(&s, channel->write_bufwrite);\n        channel->write_packet_len = s - channel->write_packet;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Sending %d bytes on channel %lu/%lu, stream_id=%d\",\n                       (int) channel->write_bufwrite, channel->local.id,\n                       channel->remote.id, stream_id);\n\n        channel->write_state = libssh2_NB_state_created;\n    }\n\n    if (channel->write_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, channel->write_packet,\n                                     channel->write_packet_len,\n                                     buf, channel->write_bufwrite);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return _libssh2_error(session, rc,\n                                  \"Unable to send channel data\");\n        }\n        else if (rc) {\n            channel->write_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, rc,\n                                  \"Unable to send channel data\");\n        }\n        /* Shrink local window size */\n        channel->local.window_size -= channel->write_bufwrite;\n\n        wrote += channel->write_bufwrite;\n\n        /* Since _libssh2_transport_write() succeeded, we must return\n           now to allow the caller to provide the next chunk of data.\n\n           We cannot move on to send the next piece of data that may\n           already have been provided in this same function call, as we\n           risk getting EAGAIN for that and we can't return information\n           both about sent data as well as EAGAIN. So, by returning short\n           now, the caller will call this function again with new data to\n           send */\n\n        channel->write_state = libssh2_NB_state_idle;\n\n        return wrote;\n    }\n\n    return LIBSSH2_ERROR_INVAL; /* reaching this point is really bad */\n}\n\n/*\n * libssh2_channel_write_ex\n *\n * Send data to a channel\n */\nLIBSSH2_API ssize_t\nlibssh2_channel_write_ex(LIBSSH2_CHANNEL *channel, int stream_id,\n                         const char *buf, size_t buflen)\n{\n    ssize_t rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 _libssh2_channel_write(channel, stream_id,\n                                        (unsigned char *)buf, buflen));\n    return rc;\n}\n\n/*\n * channel_send_eof\n *\n * Send EOF on channel\n */\nstatic int channel_send_eof(LIBSSH2_CHANNEL *channel)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char packet[5];    /* packet_type(1) + channelno(4) */\n    int rc;\n\n    _libssh2_debug(session, LIBSSH2_TRACE_CONN, \"Sending EOF on channel %lu/%lu\",\n                   channel->local.id, channel->remote.id);\n    packet[0] = SSH_MSG_CHANNEL_EOF;\n    _libssh2_htonu32(packet + 1, channel->remote.id);\n    rc = _libssh2_transport_send(session, packet, 5, NULL, 0);\n    if (rc == LIBSSH2_ERROR_EAGAIN) {\n        _libssh2_error(session, rc,\n                       \"Would block sending EOF\");\n        return rc;\n    }\n    else if (rc) {\n        return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                              \"Unable to send EOF on channel\");\n    }\n    channel->local.eof = 1;\n\n    return 0;\n}\n\n/*\n * libssh2_channel_send_eof\n *\n * Send EOF on channel\n */\nLIBSSH2_API int\nlibssh2_channel_send_eof(LIBSSH2_CHANNEL *channel)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session, channel_send_eof(channel));\n    return rc;\n}\n\n/*\n * libssh2_channel_eof\n *\n * Read channel's eof status\n */\nLIBSSH2_API int\nlibssh2_channel_eof(LIBSSH2_CHANNEL * channel)\n{\n    LIBSSH2_SESSION *session;\n    LIBSSH2_PACKET *packet;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    session = channel->session;\n    packet = _libssh2_list_first(&session->packets);\n\n    while (packet) {\n        if (((packet->data[0] == SSH_MSG_CHANNEL_DATA)\n             || (packet->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA))\n            && (channel->local.id == _libssh2_ntohu32(packet->data + 1))) {\n            /* There's data waiting to be read yet, mask the EOF status */\n            return 0;\n        }\n        packet = _libssh2_list_next(&packet->node);\n    }\n\n    return channel->remote.eof;\n}\n\n/*\n * channel_wait_eof\n *\n * Awaiting channel EOF\n */\nstatic int channel_wait_eof(LIBSSH2_CHANNEL *channel)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    int rc;\n\n    if (channel->wait_eof_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Awaiting close of channel %lu/%lu\", channel->local.id,\n                       channel->remote.id);\n\n        channel->wait_eof_state = libssh2_NB_state_created;\n    }\n\n    /*\n     * While channel is not eof, read more packets from the network.\n     * Either the EOF will be set or network timeout will occur.\n     */\n    do {\n        if (channel->remote.eof) {\n            break;\n        }\n        rc = _libssh2_transport_read(session);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if (rc < 0) {\n            channel->wait_eof_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, rc,\n                                  \"_libssh2_transport_read() bailed out!\");\n        }\n    } while (1);\n\n    channel->wait_eof_state = libssh2_NB_state_idle;\n\n    return 0;\n}\n\n/*\n * libssh2_channel_wait_eof\n *\n * Awaiting channel EOF\n */\nLIBSSH2_API int\nlibssh2_channel_wait_eof(LIBSSH2_CHANNEL *channel)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session, channel_wait_eof(channel));\n    return rc;\n}\n\nint _libssh2_channel_close(LIBSSH2_CHANNEL * channel)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    int rc = 0;\n\n    if (channel->local.close) {\n        /* Already closed, act like we sent another close,\n         * even though we didn't... shhhhhh */\n        channel->close_state = libssh2_NB_state_idle;\n        return 0;\n    }\n\n    if (!channel->local.eof) {\n        if ((rc = channel_send_eof(channel))) {\n            if (rc == LIBSSH2_ERROR_EAGAIN) {\n                return rc;\n            }\n            _libssh2_error(session, rc,\n                \"Unable to send EOF, but closing channel anyway\");\n        }\n    }\n\n    /* ignore if we have received a remote eof or not, as it is now too\n       late for us to wait for it. Continue closing! */\n\n    if (channel->close_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN, \"Closing channel %lu/%lu\",\n                       channel->local.id, channel->remote.id);\n\n        channel->close_packet[0] = SSH_MSG_CHANNEL_CLOSE;\n        _libssh2_htonu32(channel->close_packet + 1, channel->remote.id);\n\n        channel->close_state = libssh2_NB_state_created;\n    }\n\n    if (channel->close_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, channel->close_packet, 5,\n                                     NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, rc,\n                           \"Would block sending close-channel\");\n            return rc;\n\n        } else if (rc) {\n            _libssh2_error(session, rc,\n                           \"Unable to send close-channel request, \"\n                           \"but closing anyway\");\n            /* skip waiting for the response and fall through to\n               LIBSSH2_CHANNEL_CLOSE below */\n\n        } else\n            channel->close_state = libssh2_NB_state_sent;\n    }\n\n    if (channel->close_state == libssh2_NB_state_sent) {\n        /* We must wait for the remote SSH_MSG_CHANNEL_CLOSE message */\n\n        while (!channel->remote.close && !rc &&\n               (session->socket_state != LIBSSH2_SOCKET_DISCONNECTED))\n            rc = _libssh2_transport_read(session);\n    }\n\n    if(rc != LIBSSH2_ERROR_EAGAIN) {\n        /* set the local close state first when we're perfectly confirmed to not\n           do any more EAGAINs */\n        channel->local.close = 1;\n\n        /* We call the callback last in this function to make it keep the local\n           data as long as EAGAIN is returned. */\n        if (channel->close_cb) {\n            LIBSSH2_CHANNEL_CLOSE(session, channel);\n        }\n\n        channel->close_state = libssh2_NB_state_idle;\n    }\n\n    /* return 0 or an error */\n    return rc>=0?0:rc;\n}\n\n/*\n * libssh2_channel_close\n *\n * Close a channel\n */\nLIBSSH2_API int\nlibssh2_channel_close(LIBSSH2_CHANNEL *channel)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session, _libssh2_channel_close(channel) );\n    return rc;\n}\n\n/*\n * channel_wait_closed\n *\n * Awaiting channel close after EOF\n */\nstatic int channel_wait_closed(LIBSSH2_CHANNEL *channel)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    int rc;\n\n    if (!libssh2_channel_eof(channel)) {\n        return _libssh2_error(session, LIBSSH2_ERROR_INVAL,\n                              \"libssh2_channel_wait_closed() invoked when \"\n                              \"channel is not in EOF state\");\n    }\n\n    if (channel->wait_closed_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Awaiting close of channel %lu/%lu\", channel->local.id,\n                       channel->remote.id);\n\n        channel->wait_closed_state = libssh2_NB_state_created;\n    }\n\n    /*\n     * While channel is not closed, read more packets from the network.\n     * Either the channel will be closed or network timeout will occur.\n     */\n    if (!channel->remote.close) {\n        do {\n            rc = _libssh2_transport_read(session);\n            if (channel->remote.close)\n                /* it is now closed, move on! */\n                break;\n        } while (rc > 0);\n        if(rc < 0)\n            return rc;\n    }\n\n    channel->wait_closed_state = libssh2_NB_state_idle;\n\n    return 0;\n}\n\n/*\n * libssh2_channel_wait_closed\n *\n * Awaiting channel close after EOF\n */\nLIBSSH2_API int\nlibssh2_channel_wait_closed(LIBSSH2_CHANNEL *channel)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session, channel_wait_closed(channel));\n    return rc;\n}\n\n/*\n * _libssh2_channel_free\n *\n * Make sure a channel is closed, then remove the channel from the session\n * and free its resource(s)\n *\n * Returns 0 on success, negative on failure\n */\nint _libssh2_channel_free(LIBSSH2_CHANNEL *channel)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char channel_id[4];\n    unsigned char *data;\n    size_t data_len;\n    int rc;\n\n    assert(session);\n\n    if (channel->free_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Freeing channel %lu/%lu resources\", channel->local.id,\n                       channel->remote.id);\n\n        channel->free_state = libssh2_NB_state_created;\n    }\n\n    /* Allow channel freeing even when the socket has lost its connection */\n    if (!channel->local.close\n        && (session->socket_state == LIBSSH2_SOCKET_CONNECTED)) {\n        rc = _libssh2_channel_close(channel);\n\n        if(rc == LIBSSH2_ERROR_EAGAIN)\n            return rc;\n\n        /* ignore all other errors as they otherwise risk blocking the channel\n           free from happening */\n    }\n\n    channel->free_state = libssh2_NB_state_idle;\n\n    if (channel->exit_signal) {\n        LIBSSH2_FREE(session, channel->exit_signal);\n    }\n\n    /*\n     * channel->remote.close *might* not be set yet, Well...\n     * We've sent the close packet, what more do you want?\n     * Just let packet_add ignore it when it finally arrives\n     */\n\n    /* Clear out packets meant for this channel */\n    _libssh2_htonu32(channel_id, channel->local.id);\n    while ((_libssh2_packet_ask(session, SSH_MSG_CHANNEL_DATA, &data,\n                                &data_len, 1, channel_id, 4) >= 0)\n           ||\n           (_libssh2_packet_ask(session, SSH_MSG_CHANNEL_EXTENDED_DATA, &data,\n                                &data_len, 1, channel_id, 4) >= 0)) {\n        LIBSSH2_FREE(session, data);\n    }\n\n    /* free \"channel_type\" */\n    if (channel->channel_type) {\n        LIBSSH2_FREE(session, channel->channel_type);\n    }\n\n    /* Unlink from channel list */\n    _libssh2_list_remove(&channel->node);\n\n    /*\n     * Make sure all memory used in the state variables are free\n     */\n    if (channel->setenv_packet) {\n        LIBSSH2_FREE(session, channel->setenv_packet);\n    }\n    if (channel->reqX11_packet) {\n        LIBSSH2_FREE(session, channel->reqX11_packet);\n    }\n    if (channel->process_packet) {\n        LIBSSH2_FREE(session, channel->process_packet);\n    }\n\n    LIBSSH2_FREE(session, channel);\n\n    return 0;\n}\n\n/*\n * libssh2_channel_free\n *\n * Make sure a channel is closed, then remove the channel from the session\n * and free its resource(s)\n *\n * Returns 0 on success, negative on failure\n */\nLIBSSH2_API int\nlibssh2_channel_free(LIBSSH2_CHANNEL *channel)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session, _libssh2_channel_free(channel));\n    return rc;\n}\n/*\n * libssh2_channel_window_read_ex\n *\n * Check the status of the read window. Returns the number of bytes which the\n * remote end may send without overflowing the window limit read_avail (if\n * passed) will be populated with the number of bytes actually available to be\n * read window_size_initial (if passed) will be populated with the\n * window_size_initial as defined by the channel_open request\n */\nLIBSSH2_API unsigned long\nlibssh2_channel_window_read_ex(LIBSSH2_CHANNEL *channel,\n                               unsigned long *read_avail,\n                               unsigned long *window_size_initial)\n{\n    if(!channel)\n        return 0; /* no channel, no window! */\n\n    if (window_size_initial) {\n        *window_size_initial = channel->remote.window_size_initial;\n    }\n\n    if (read_avail) {\n        size_t bytes_queued = 0;\n        LIBSSH2_PACKET *packet =\n            _libssh2_list_first(&channel->session->packets);\n\n        while (packet) {\n            unsigned char packet_type = packet->data[0];\n\n            if (((packet_type == SSH_MSG_CHANNEL_DATA)\n                 || (packet_type == SSH_MSG_CHANNEL_EXTENDED_DATA))\n                && (_libssh2_ntohu32(packet->data + 1) == channel->local.id)) {\n                bytes_queued += packet->data_len - packet->data_head;\n            }\n\n            packet = _libssh2_list_next(&packet->node);\n        }\n\n        *read_avail = bytes_queued;\n    }\n\n    return channel->remote.window_size;\n}\n\n/*\n * libssh2_channel_window_write_ex\n *\n * Check the status of the write window Returns the number of bytes which may\n * be safely written on the channel without blocking window_size_initial (if\n * passed) will be populated with the size of the initial window as defined by\n * the channel_open request\n */\nLIBSSH2_API unsigned long\nlibssh2_channel_window_write_ex(LIBSSH2_CHANNEL *channel,\n                                unsigned long *window_size_initial)\n{\n    if(!channel)\n        return 0; /* no channel, no window! */\n\n    if (window_size_initial) {\n        /* For locally initiated channels this is very often 0, so it's not\n         * *that* useful as information goes */\n        *window_size_initial = channel->local.window_size_initial;\n    }\n\n    return channel->local.window_size;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/channel.h",
    "content": "#ifndef __LIBSSH2_CHANNEL_H\n#define __LIBSSH2_CHANNEL_H\n/* Copyright (c) 2008-2010 by Daniel Stenberg\n *\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/*\n * _libssh2_channel_receive_window_adjust\n *\n * Adjust the receive window for a channel by adjustment bytes. If the amount\n * to be adjusted is less than LIBSSH2_CHANNEL_MINADJUST and force is 0 the\n * adjustment amount will be queued for a later packet.\n *\n * Always non-blocking.\n */\nint _libssh2_channel_receive_window_adjust(LIBSSH2_CHANNEL * channel,\n                                           uint32_t adjustment,\n                                           unsigned char force,\n                                           unsigned int *store);\n\n/*\n * _libssh2_channel_flush\n *\n * Flush data from one (or all) stream\n * Returns number of bytes flushed, or negative on failure\n */\nint _libssh2_channel_flush(LIBSSH2_CHANNEL *channel, int streamid);\n\n/*\n * _libssh2_channel_free\n *\n * Make sure a channel is closed, then remove the channel from the session\n * and free its resource(s)\n *\n * Returns 0 on success, negative on failure\n */\nint _libssh2_channel_free(LIBSSH2_CHANNEL *channel);\n\nint\n_libssh2_channel_extended_data(LIBSSH2_CHANNEL *channel, int ignore_mode);\n\n/*\n * _libssh2_channel_write\n *\n * Send data to a channel\n */\nssize_t\n_libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id,\n                       const unsigned char *buf, size_t buflen);\n\n/*\n * _libssh2_channel_open\n *\n * Establish a generic session channel\n */\nLIBSSH2_CHANNEL *\n_libssh2_channel_open(LIBSSH2_SESSION * session, const char *channel_type,\n                      uint32_t channel_type_len,\n                      uint32_t window_size,\n                      uint32_t packet_size,\n                      const unsigned char *message, size_t message_len);\n\n\n/*\n * _libssh2_channel_process_startup\n *\n * Primitive for libssh2_channel_(shell|exec|subsystem)\n */\nint\n_libssh2_channel_process_startup(LIBSSH2_CHANNEL *channel,\n                                 const char *request, size_t request_len,\n                                 const char *message, size_t message_len);\n\n/*\n * _libssh2_channel_read\n *\n * Read data from a channel\n *\n * It is important to not return 0 until the currently read channel is\n * complete. If we read stuff from the wire but it was no payload data to fill\n * in the buffer with, we MUST make sure to return PACKET_EAGAIN.\n */\nssize_t _libssh2_channel_read(LIBSSH2_CHANNEL *channel, int stream_id,\n                              char *buf, size_t buflen);\n\nuint32_t _libssh2_channel_nextid(LIBSSH2_SESSION * session);\n\nLIBSSH2_CHANNEL *_libssh2_channel_locate(LIBSSH2_SESSION * session,\n                                         uint32_t channel_id);\n\nsize_t _libssh2_channel_packet_data_len(LIBSSH2_CHANNEL * channel,\n                                        int stream_id);\n\nint _libssh2_channel_close(LIBSSH2_CHANNEL * channel);\n\n/*\n * _libssh2_channel_forward_cancel\n *\n * Stop listening on a remote port and free the listener\n * Toss out any pending (un-accept()ed) connections\n *\n * Return 0 on success, LIBSSH2_ERROR_EAGAIN if would block, -1 on error\n */\nint _libssh2_channel_forward_cancel(LIBSSH2_LISTENER *listener);\n\n#endif /* __LIBSSH2_CHANNEL_H */\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/comp.c",
    "content": "/* Copyright (c) 2004-2007, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2010-2014, Daniel Stenberg <daniel@haxx.se>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#ifdef LIBSSH2_HAVE_ZLIB\n# include <zlib.h>\n#endif\n\n#include \"comp.h\"\n\n/* ********\n * none *\n ******** */\n\n/*\n * comp_method_none_comp\n *\n * Minimalist compression: Absolutely none\n */\nstatic int\ncomp_method_none_comp(LIBSSH2_SESSION *session,\n                      unsigned char *dest,\n                      size_t *dest_len,\n                      const unsigned char *src,\n                      size_t src_len,\n                      void **abstract)\n{\n    (void) session;\n    (void) abstract;\n    (void) dest;\n    (void) dest_len;\n    (void) src;\n    (void) src_len;\n\n    return 0;\n}\n\n/*\n * comp_method_none_decomp\n *\n * Minimalist decompression: Absolutely none\n */\nstatic int\ncomp_method_none_decomp(LIBSSH2_SESSION * session,\n                        unsigned char **dest,\n                        size_t *dest_len,\n                        size_t payload_limit,\n                        const unsigned char *src,\n                        size_t src_len, void **abstract)\n{\n    (void) session;\n    (void) payload_limit;\n    (void) abstract;\n    *dest = (unsigned char *) src;\n    *dest_len = src_len;\n    return 0;\n}\n\n\n\nstatic const LIBSSH2_COMP_METHOD comp_method_none = {\n    \"none\",\n    0, /* not really compressing */\n    0, /* isn't used in userauth, go figure */\n    NULL,\n    comp_method_none_comp,\n    comp_method_none_decomp,\n    NULL\n};\n\n#ifdef LIBSSH2_HAVE_ZLIB\n/* ********\n * zlib *\n ******** */\n\n/* Memory management wrappers\n * Yes, I realize we're doing a callback to a callback,\n * Deal...\n */\n\nstatic voidpf\ncomp_method_zlib_alloc(voidpf opaque, uInt items, uInt size)\n{\n    LIBSSH2_SESSION *session = (LIBSSH2_SESSION *) opaque;\n\n    return (voidpf) LIBSSH2_ALLOC(session, items * size);\n}\n\nstatic void\ncomp_method_zlib_free(voidpf opaque, voidpf address)\n{\n    LIBSSH2_SESSION *session = (LIBSSH2_SESSION *) opaque;\n\n    LIBSSH2_FREE(session, address);\n}\n\n\n\n/* libssh2_comp_method_zlib_init\n * All your bandwidth are belong to us (so save some)\n */\nstatic int\ncomp_method_zlib_init(LIBSSH2_SESSION * session, int compr,\n                      void **abstract)\n{\n    z_stream *strm;\n    int status;\n\n    strm = LIBSSH2_CALLOC(session, sizeof(z_stream));\n    if (!strm) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Unable to allocate memory for \"\n                              \"zlib compression/decompression\");\n    }\n\n    strm->opaque = (voidpf) session;\n    strm->zalloc = (alloc_func) comp_method_zlib_alloc;\n    strm->zfree = (free_func) comp_method_zlib_free;\n    if (compr) {\n        /* deflate */\n        status = deflateInit(strm, Z_DEFAULT_COMPRESSION);\n    } else {\n        /* inflate */\n        status = inflateInit(strm);\n    }\n\n    if (status != Z_OK) {\n        LIBSSH2_FREE(session, strm);\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                       \"unhandled zlib error %d\", status);\n        return LIBSSH2_ERROR_COMPRESS;\n    }\n    *abstract = strm;\n\n    return LIBSSH2_ERROR_NONE;\n}\n\n/*\n * libssh2_comp_method_zlib_comp\n *\n * Compresses source to destination. Without allocation.\n */\nstatic int\ncomp_method_zlib_comp(LIBSSH2_SESSION *session,\n                      unsigned char *dest,\n\n                      /* dest_len is a pointer to allow this function to\n                         update it with the final actual size used */\n                      size_t *dest_len,\n                      const unsigned char *src,\n                      size_t src_len,\n                      void **abstract)\n{\n    z_stream *strm = *abstract;\n    int out_maxlen = *dest_len;\n    int status;\n\n    strm->next_in = (unsigned char *) src;\n    strm->avail_in = src_len;\n    strm->next_out = dest;\n    strm->avail_out = out_maxlen;\n\n    status = deflate(strm, Z_PARTIAL_FLUSH);\n\n    if ((status == Z_OK) && (strm->avail_out > 0)) {\n        *dest_len = out_maxlen - strm->avail_out;\n        return 0;\n    }\n\n    _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                   \"unhandled zlib compression error %d, avail_out\", status, strm->avail_out);\n    return _libssh2_error(session, LIBSSH2_ERROR_ZLIB, \"compression failure\");\n}\n\n/*\n * libssh2_comp_method_zlib_decomp\n *\n * Decompresses source to destination. Allocates the output memory.\n */\nstatic int\ncomp_method_zlib_decomp(LIBSSH2_SESSION * session,\n                        unsigned char **dest,\n                        size_t *dest_len,\n                        size_t payload_limit,\n                        const unsigned char *src,\n                        size_t src_len, void **abstract)\n{\n    z_stream *strm = *abstract;\n    /* A short-term alloc of a full data chunk is better than a series of\n       reallocs */\n    char *out;\n    int out_maxlen = 4 * src_len;\n\n    /* If strm is null, then we have not yet been initialized. */\n    if (strm == NULL)\n        return _libssh2_error(session, LIBSSH2_ERROR_COMPRESS,\n                              \"decompression uninitialized\");;\n\n    /* In practice they never come smaller than this */\n    if (out_maxlen < 25)\n        out_maxlen = 25;\n\n    if (out_maxlen > (int) payload_limit)\n        out_maxlen = payload_limit;\n\n    strm->next_in = (unsigned char *) src;\n    strm->avail_in = src_len;\n    strm->next_out = (unsigned char *) LIBSSH2_ALLOC(session, out_maxlen);\n    out = (char *) strm->next_out;\n    strm->avail_out = out_maxlen;\n    if (!strm->next_out)\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Unable to allocate decompression buffer\");\n\n    /* Loop until it's all inflated or hit error */\n    for (;;) {\n        int status;\n        size_t out_ofs;\n        char *newout;\n\n        status = inflate(strm, Z_PARTIAL_FLUSH);\n\n        if (status == Z_OK) {\n            if (strm->avail_out > 0)\n                /* status is OK and the output buffer has not been exhausted so we're done */\n                break;\n        } else if (status == Z_BUF_ERROR) {\n            /* the input data has been exhausted so we are done */\n            break;\n        } else {\n            /* error state */\n            LIBSSH2_FREE(session, out);\n            _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                           \"unhandled zlib error %d\", status);\n            return _libssh2_error(session, LIBSSH2_ERROR_ZLIB,\n                                  \"decompression failure\");\n        }\n\n        if (out_maxlen >= (int) payload_limit) {\n            LIBSSH2_FREE(session, out);\n            return _libssh2_error(session, LIBSSH2_ERROR_ZLIB,\n                                  \"Excessive growth in decompression phase\");\n        }\n\n        /* If we get here we need to grow the output buffer and try again */\n        out_ofs = out_maxlen - strm->avail_out;\n        out_maxlen *= 2;\n        newout = LIBSSH2_REALLOC(session, out, out_maxlen);\n        if (!newout) {\n            LIBSSH2_FREE(session, out);\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to expand decompression buffer\");\n        }\n        out = newout;\n        strm->next_out = (unsigned char *) out + out_ofs;\n        strm->avail_out = out_maxlen - out_ofs;\n    }\n\n    *dest = (unsigned char *) out;\n    *dest_len = out_maxlen - strm->avail_out;\n\n    return 0;\n}\n\n\n/* libssh2_comp_method_zlib_dtor\n * All done, no more compression for you\n */\nstatic int\ncomp_method_zlib_dtor(LIBSSH2_SESSION *session, int compr, void **abstract)\n{\n    z_stream *strm = *abstract;\n\n    if (strm) {\n        if (compr)\n            deflateEnd(strm);\n        else\n            inflateEnd(strm);\n        LIBSSH2_FREE(session, strm);\n    }\n\n    *abstract = NULL;\n    return 0;\n}\n\nstatic const LIBSSH2_COMP_METHOD comp_method_zlib = {\n    \"zlib\",\n    1, /* yes, this compresses */\n    1, /* do compression during userauth */\n    comp_method_zlib_init,\n    comp_method_zlib_comp,\n    comp_method_zlib_decomp,\n    comp_method_zlib_dtor,\n};\n\nstatic const LIBSSH2_COMP_METHOD comp_method_zlib_openssh = {\n    \"zlib@openssh.com\",\n    1, /* yes, this compresses */\n    0, /* don't use compression during userauth */\n    comp_method_zlib_init,\n    comp_method_zlib_comp,\n    comp_method_zlib_decomp,\n    comp_method_zlib_dtor,\n};\n#endif /* LIBSSH2_HAVE_ZLIB */\n\n/* If compression is enabled by the API, then this array is used which then\n   may allow compression if zlib is available at build time */\nstatic const LIBSSH2_COMP_METHOD *comp_methods[] = {\n#ifdef LIBSSH2_HAVE_ZLIB\n    &comp_method_zlib,\n    &comp_method_zlib_openssh,\n#endif /* LIBSSH2_HAVE_ZLIB */\n    &comp_method_none,\n    NULL\n};\n\n/* If compression is disabled by the API, then this array is used */\nstatic const LIBSSH2_COMP_METHOD *no_comp_methods[] = {\n    &comp_method_none,\n    NULL\n};\n\nconst LIBSSH2_COMP_METHOD **\n_libssh2_comp_methods(LIBSSH2_SESSION *session)\n{\n    if(session->flag.compress)\n        return comp_methods;\n    else\n        return no_comp_methods;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/comp.h",
    "content": "#ifndef __LIBSSH2_COMP_H\n#define __LIBSSH2_COMP_H\n\n/* Copyright (C) 2009-2010 by Daniel Stenberg\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n */\n\n#include \"libssh2_priv.h\"\n\nconst LIBSSH2_COMP_METHOD **_libssh2_comp_methods(LIBSSH2_SESSION *session);\n\n#endif /* __LIBSSH2_COMP_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/crypt.c",
    "content": "/* Copyright (c) 2009, 2010 Simon Josefsson <simon@josefsson.org>\n * Copyright (c) 2004-2007, Sara Golemon <sarag@libssh2.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\n#ifdef LIBSSH2_CRYPT_NONE\n\n/* crypt_none_crypt\n * Minimalist cipher: VERY secure *wink*\n */\nstatic int\ncrypt_none_crypt(LIBSSH2_SESSION * session, unsigned char *buf,\n                         void **abstract)\n{\n    /* Do nothing to the data! */\n    return 0;\n}\n\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_none = {\n    \"none\",\n    8,                     /* blocksize (SSH2 defines minimum blocksize as 8) */\n    0,                     /* iv_len */\n    0,                     /* secret_len */\n    0,                     /* flags */\n    NULL,\n    crypt_none_crypt,\n    NULL\n};\n#endif /* LIBSSH2_CRYPT_NONE */\n\nstruct crypt_ctx\n{\n    int encrypt;\n    _libssh2_cipher_type(algo);\n    _libssh2_cipher_ctx h;\n};\n\nstatic int\ncrypt_init(LIBSSH2_SESSION * session,\n           const LIBSSH2_CRYPT_METHOD * method,\n           unsigned char *iv, int *free_iv,\n           unsigned char *secret, int *free_secret,\n           int encrypt, void **abstract)\n{\n    struct crypt_ctx *ctx = LIBSSH2_ALLOC(session,\n                                          sizeof(struct crypt_ctx));\n    if (!ctx)\n        return LIBSSH2_ERROR_ALLOC;\n\n    ctx->encrypt = encrypt;\n    ctx->algo = method->algo;\n    if (_libssh2_cipher_init(&ctx->h, ctx->algo, iv, secret, encrypt)) {\n        LIBSSH2_FREE(session, ctx);\n        return -1;\n    }\n    *abstract = ctx;\n    *free_iv = 1;\n    *free_secret = 1;\n    return 0;\n}\n\nstatic int\ncrypt_encrypt(LIBSSH2_SESSION * session, unsigned char *block,\n              size_t blocksize, void **abstract)\n{\n    struct crypt_ctx *cctx = *(struct crypt_ctx **) abstract;\n    (void) session;\n    return _libssh2_cipher_crypt(&cctx->h, cctx->algo, cctx->encrypt, block,\n                                 blocksize);\n}\n\nstatic int\ncrypt_dtor(LIBSSH2_SESSION * session, void **abstract)\n{\n    struct crypt_ctx **cctx = (struct crypt_ctx **) abstract;\n    if (cctx && *cctx) {\n        _libssh2_cipher_dtor(&(*cctx)->h);\n        LIBSSH2_FREE(session, *cctx);\n        *abstract = NULL;\n    }\n    return 0;\n}\n\n#if LIBSSH2_AES_CTR\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes128_ctr = {\n    \"aes128-ctr\",\n    16,                         /* blocksize */\n    16,                         /* initial value length */\n    16,                         /* secret length -- 16*8 == 128bit */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_aes128ctr\n};\n\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes192_ctr = {\n    \"aes192-ctr\",\n    16,                         /* blocksize */\n    16,                         /* initial value length */\n    24,                         /* secret length -- 24*8 == 192bit */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_aes192ctr\n};\n\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes256_ctr = {\n    \"aes256-ctr\",\n    16,                         /* blocksize */\n    16,                         /* initial value length */\n    32,                         /* secret length -- 32*8 == 256bit */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_aes256ctr\n};\n#endif\n\n#if LIBSSH2_AES\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes128_cbc = {\n    \"aes128-cbc\",\n    16,                         /* blocksize */\n    16,                         /* initial value length */\n    16,                         /* secret length -- 16*8 == 128bit */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_aes128\n};\n\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes192_cbc = {\n    \"aes192-cbc\",\n    16,                         /* blocksize */\n    16,                         /* initial value length */\n    24,                         /* secret length -- 24*8 == 192bit */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_aes192\n};\n\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes256_cbc = {\n    \"aes256-cbc\",\n    16,                         /* blocksize */\n    16,                         /* initial value length */\n    32,                         /* secret length -- 32*8 == 256bit */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_aes256\n};\n\n/* rijndael-cbc@lysator.liu.se == aes256-cbc */\nstatic const LIBSSH2_CRYPT_METHOD\n    libssh2_crypt_method_rijndael_cbc_lysator_liu_se = {\n    \"rijndael-cbc@lysator.liu.se\",\n    16,                         /* blocksize */\n    16,                         /* initial value length */\n    32,                         /* secret length -- 32*8 == 256bit */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_aes256\n};\n#endif /* LIBSSH2_AES */\n\n#if LIBSSH2_BLOWFISH\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_blowfish_cbc = {\n    \"blowfish-cbc\",\n    8,                          /* blocksize */\n    8,                          /* initial value length */\n    16,                         /* secret length */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_blowfish\n};\n#endif /* LIBSSH2_BLOWFISH */\n\n#if LIBSSH2_RC4\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_arcfour = {\n    \"arcfour\",\n    8,                          /* blocksize */\n    8,                          /* initial value length */\n    16,                         /* secret length */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_arcfour\n};\n\nstatic int\ncrypt_init_arcfour128(LIBSSH2_SESSION * session,\n                      const LIBSSH2_CRYPT_METHOD * method,\n                      unsigned char *iv, int *free_iv,\n                      unsigned char *secret, int *free_secret,\n                      int encrypt, void **abstract)\n{\n    int rc;\n\n    rc = crypt_init (session, method, iv, free_iv, secret, free_secret,\n                     encrypt, abstract);\n    if (rc == 0) {\n        struct crypt_ctx *cctx = *(struct crypt_ctx **) abstract;\n        unsigned char block[8];\n        size_t discard = 1536;\n        for (; discard; discard -= 8)\n            _libssh2_cipher_crypt(&cctx->h, cctx->algo, cctx->encrypt, block,\n                                  method->blocksize);\n    }\n\n    return rc;\n}\n\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_arcfour128 = {\n    \"arcfour128\",\n    8,                          /* blocksize */\n    8,                          /* initial value length */\n    16,                         /* secret length */\n    0,                          /* flags */\n    &crypt_init_arcfour128,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_arcfour\n};\n#endif /* LIBSSH2_RC4 */\n\n#if LIBSSH2_CAST\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_cast128_cbc = {\n    \"cast128-cbc\",\n    8,                          /* blocksize */\n    8,                          /* initial value length */\n    16,                         /* secret length */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_cast5\n};\n#endif /* LIBSSH2_CAST */\n\n#if LIBSSH2_3DES\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_3des_cbc = {\n    \"3des-cbc\",\n    8,                          /* blocksize */\n    8,                          /* initial value length */\n    24,                         /* secret length */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_3des\n};\n#endif\n\nstatic const LIBSSH2_CRYPT_METHOD *_libssh2_crypt_methods[] = {\n#if LIBSSH2_AES_CTR\n  &libssh2_crypt_method_aes128_ctr,\n  &libssh2_crypt_method_aes192_ctr,\n  &libssh2_crypt_method_aes256_ctr,\n#endif /* LIBSSH2_AES */\n#if LIBSSH2_AES\n    &libssh2_crypt_method_aes256_cbc,\n    &libssh2_crypt_method_rijndael_cbc_lysator_liu_se,  /* == aes256-cbc */\n    &libssh2_crypt_method_aes192_cbc,\n    &libssh2_crypt_method_aes128_cbc,\n#endif /* LIBSSH2_AES */\n#if LIBSSH2_BLOWFISH\n    &libssh2_crypt_method_blowfish_cbc,\n#endif /* LIBSSH2_BLOWFISH */\n#if LIBSSH2_RC4\n    &libssh2_crypt_method_arcfour128,\n    &libssh2_crypt_method_arcfour,\n#endif /* LIBSSH2_RC4 */\n#if LIBSSH2_CAST\n    &libssh2_crypt_method_cast128_cbc,\n#endif /* LIBSSH2_CAST */\n#if LIBSSH2_3DES\n    &libssh2_crypt_method_3des_cbc,\n#endif /*  LIBSSH2_DES */\n#ifdef LIBSSH2_CRYPT_NONE\n    &libssh2_crypt_method_none,\n#endif\n    NULL\n};\n\n/* Expose to kex.c */\nconst LIBSSH2_CRYPT_METHOD **\nlibssh2_crypt_methods(void)\n{\n    return _libssh2_crypt_methods;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/crypto.h",
    "content": "/* Copyright (C) 2009, 2010 Simon Josefsson\n * Copyright (C) 2006, 2007 The Written Word, Inc.  All rights reserved.\n * Copyright (C) 2010 Daniel Stenberg\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n#ifndef LIBSSH2_CRYPTO_H\n#define LIBSSH2_CRYPTO_H\n\n#ifdef LIBSSH2_OPENSSL\n#include \"openssl.h\"\n#endif\n\n#ifdef LIBSSH2_LIBGCRYPT\n#include \"libgcrypt.h\"\n#endif\n\n#ifdef LIBSSH2_WINCNG\n#include \"wincng.h\"\n#endif\n\n#ifdef LIBSSH2_OS400QC3\n#include \"os400qc3.h\"\n#endif\n\nint _libssh2_rsa_new(libssh2_rsa_ctx ** rsa,\n                     const unsigned char *edata,\n                     unsigned long elen,\n                     const unsigned char *ndata,\n                     unsigned long nlen,\n                     const unsigned char *ddata,\n                     unsigned long dlen,\n                     const unsigned char *pdata,\n                     unsigned long plen,\n                     const unsigned char *qdata,\n                     unsigned long qlen,\n                     const unsigned char *e1data,\n                     unsigned long e1len,\n                     const unsigned char *e2data,\n                     unsigned long e2len,\n                     const unsigned char *coeffdata, unsigned long coefflen);\nint _libssh2_rsa_new_private(libssh2_rsa_ctx ** rsa,\n                             LIBSSH2_SESSION * session,\n                             const char *filename,\n                             unsigned const char *passphrase);\nint _libssh2_rsa_sha1_verify(libssh2_rsa_ctx * rsa,\n                             const unsigned char *sig,\n                             unsigned long sig_len,\n                             const unsigned char *m, unsigned long m_len);\nint _libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session,\n                           libssh2_rsa_ctx * rsactx,\n                           const unsigned char *hash,\n                           size_t hash_len,\n                           unsigned char **signature,\n                           size_t *signature_len);\nint _libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx ** rsa,\n                                        LIBSSH2_SESSION * session,\n                                        const char *filedata, size_t filedata_len,\n                                        unsigned const char *passphrase);\n\n#if LIBSSH2_DSA\nint _libssh2_dsa_new(libssh2_dsa_ctx ** dsa,\n                     const unsigned char *pdata,\n                     unsigned long plen,\n                     const unsigned char *qdata,\n                     unsigned long qlen,\n                     const unsigned char *gdata,\n                     unsigned long glen,\n                     const unsigned char *ydata,\n                     unsigned long ylen,\n                     const unsigned char *x, unsigned long x_len);\nint _libssh2_dsa_new_private(libssh2_dsa_ctx ** dsa,\n                             LIBSSH2_SESSION * session,\n                             const char *filename,\n                             unsigned const char *passphrase);\nint _libssh2_dsa_sha1_verify(libssh2_dsa_ctx * dsactx,\n                             const unsigned char *sig,\n                             const unsigned char *m, unsigned long m_len);\nint _libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx,\n                           const unsigned char *hash,\n                           unsigned long hash_len, unsigned char *sig);\nint _libssh2_dsa_new_private_frommemory(libssh2_dsa_ctx ** dsa,\n                                        LIBSSH2_SESSION * session,\n                                        const char *filedata, size_t filedata_len,\n                                        unsigned const char *passphrase);\n#endif\n\nint _libssh2_cipher_init(_libssh2_cipher_ctx * h,\n                         _libssh2_cipher_type(algo),\n                         unsigned char *iv,\n                         unsigned char *secret, int encrypt);\n\nint _libssh2_cipher_crypt(_libssh2_cipher_ctx * ctx,\n                          _libssh2_cipher_type(algo),\n                          int encrypt, unsigned char *block, size_t blocksize);\n\nint _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session,\n                              unsigned char **method,\n                              size_t *method_len,\n                              unsigned char **pubkeydata,\n                              size_t *pubkeydata_len,\n                              const char *privatekey,\n                              const char *passphrase);\nint _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session,\n                                    unsigned char **method,\n                                    size_t *method_len,\n                                    unsigned char **pubkeydata,\n                                    size_t *pubkeydata_len,\n                                    const char *privatekeydata,\n                                    size_t privatekeydata_len,\n                                    const char *passphrase);\n\nvoid _libssh2_init_aes_ctr(void);\n\n#endif\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/global.c",
    "content": "/* Copyright (c) 2010 Lars Nordin <Lars.Nordin@SDlabs.se>\n * Copyright (C) 2010 Simon Josefsson <simon@josefsson.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\nstatic int _libssh2_initialized = 0;\nstatic int _libssh2_init_flags = 0;\n\nLIBSSH2_API int\nlibssh2_init(int flags)\n{\n    if (_libssh2_initialized == 0 && !(flags & LIBSSH2_INIT_NO_CRYPTO)) {\n        libssh2_crypto_init();\n        _libssh2_init_aes_ctr();\n    }\n\n    _libssh2_initialized++;\n    _libssh2_init_flags |= flags;\n\n    return 0;\n}\n\nLIBSSH2_API void\nlibssh2_exit(void)\n{\n    if (_libssh2_initialized == 0)\n        return;\n\n    _libssh2_initialized--;\n\n    if (!(_libssh2_init_flags & LIBSSH2_INIT_NO_CRYPTO)) {\n        libssh2_crypto_exit();\n    }\n\n    return;\n}\n\nvoid\n_libssh2_init_if_needed(void)\n{\n    if (_libssh2_initialized == 0)\n        (void)libssh2_init (0);\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/hostkey.c",
    "content": "/* Copyright (c) 2004-2006, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2009-2014 by Daniel Stenberg\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include \"misc.h\"\n\n/* Needed for struct iovec on some platforms */\n#ifdef HAVE_SYS_UIO_H\n#include <sys/uio.h>\n#endif\n\n#if LIBSSH2_RSA\n/* ***********\n * ssh-rsa *\n *********** */\n\nstatic int hostkey_method_ssh_rsa_dtor(LIBSSH2_SESSION * session,\n                                       void **abstract);\n\n/*\n * hostkey_method_ssh_rsa_init\n *\n * Initialize the server hostkey working area with e/n pair\n */\nstatic int\nhostkey_method_ssh_rsa_init(LIBSSH2_SESSION * session,\n                            const unsigned char *hostkey_data,\n                            size_t hostkey_data_len,\n                            void **abstract)\n{\n    libssh2_rsa_ctx *rsactx;\n    const unsigned char *s, *e, *n;\n    unsigned long len, e_len, n_len;\n    int ret;\n\n    (void) hostkey_data_len;\n\n    if (*abstract) {\n        hostkey_method_ssh_rsa_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    s = hostkey_data;\n    len = _libssh2_ntohu32(s);\n    s += 4;\n\n    if (len != 7 || strncmp((char *) s, \"ssh-rsa\", 7) != 0) {\n        return -1;\n    }\n    s += 7;\n\n    e_len = _libssh2_ntohu32(s);\n    s += 4;\n\n    e = s;\n    s += e_len;\n    n_len = _libssh2_ntohu32(s);\n    s += 4;\n    n = s;\n\n    ret = _libssh2_rsa_new(&rsactx, e, e_len, n, n_len, NULL, 0,\n                           NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0);\n    if (ret) {\n        return -1;\n    }\n\n    *abstract = rsactx;\n\n    return 0;\n}\n\n/*\n * hostkey_method_ssh_rsa_initPEM\n *\n * Load a Private Key from a PEM file\n */\nstatic int\nhostkey_method_ssh_rsa_initPEM(LIBSSH2_SESSION * session,\n                               const char *privkeyfile,\n                               unsigned const char *passphrase,\n                               void **abstract)\n{\n    libssh2_rsa_ctx *rsactx;\n    int ret;\n\n    if (*abstract) {\n        hostkey_method_ssh_rsa_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    ret = _libssh2_rsa_new_private(&rsactx, session, privkeyfile, passphrase);\n    if (ret) {\n        return -1;\n    }\n\n    *abstract = rsactx;\n\n    return 0;\n}\n\n/*\n * hostkey_method_ssh_rsa_initPEMFromMemory\n *\n * Load a Private Key from a memory\n */\nstatic int\nhostkey_method_ssh_rsa_initPEMFromMemory(LIBSSH2_SESSION * session,\n                                         const char *privkeyfiledata,\n                                         size_t privkeyfiledata_len,\n                                         unsigned const char *passphrase,\n                                         void **abstract)\n{\n    libssh2_rsa_ctx *rsactx;\n    int ret;\n\n    if (*abstract) {\n        hostkey_method_ssh_rsa_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    ret = _libssh2_rsa_new_private_frommemory(&rsactx, session,\n                                              privkeyfiledata,\n                                              privkeyfiledata_len, passphrase);\n    if (ret) {\n        return -1;\n    }\n\n    *abstract = rsactx;\n\n    return 0;\n}\n\n/*\n * hostkey_method_ssh_rsa_sign\n *\n * Verify signature created by remote\n */\nstatic int\nhostkey_method_ssh_rsa_sig_verify(LIBSSH2_SESSION * session,\n                                  const unsigned char *sig,\n                                  size_t sig_len,\n                                  const unsigned char *m,\n                                  size_t m_len, void **abstract)\n{\n    libssh2_rsa_ctx *rsactx = (libssh2_rsa_ctx *) (*abstract);\n    (void) session;\n\n    /* Skip past keyname_len(4) + keyname(7){\"ssh-rsa\"} + signature_len(4) */\n    sig += 15;\n    sig_len -= 15;\n    return _libssh2_rsa_sha1_verify(rsactx, sig, sig_len, m, m_len);\n}\n\n/*\n * hostkey_method_ssh_rsa_signv\n *\n * Construct a signature from an array of vectors\n */\nstatic int\nhostkey_method_ssh_rsa_signv(LIBSSH2_SESSION * session,\n                             unsigned char **signature,\n                             size_t *signature_len,\n                             int veccount,\n                             const struct iovec datavec[],\n                             void **abstract)\n{\n    libssh2_rsa_ctx *rsactx = (libssh2_rsa_ctx *) (*abstract);\n\n#ifdef _libssh2_rsa_sha1_signv\n    return _libssh2_rsa_sha1_signv(session, signature, signature_len,\n                                   veccount, datavec, rsactx);\n#else\n    int ret;\n    int i;\n    unsigned char hash[SHA_DIGEST_LENGTH];\n    libssh2_sha1_ctx ctx;\n\n    libssh2_sha1_init(&ctx);\n    for(i = 0; i < veccount; i++) {\n        libssh2_sha1_update(ctx, datavec[i].iov_base, datavec[i].iov_len);\n    }\n    libssh2_sha1_final(ctx, hash);\n\n    ret = _libssh2_rsa_sha1_sign(session, rsactx, hash, SHA_DIGEST_LENGTH,\n                                 signature, signature_len);\n    if (ret) {\n        return -1;\n    }\n\n    return 0;\n#endif\n}\n\n/*\n * hostkey_method_ssh_rsa_dtor\n *\n * Shutdown the hostkey\n */\nstatic int\nhostkey_method_ssh_rsa_dtor(LIBSSH2_SESSION * session, void **abstract)\n{\n    libssh2_rsa_ctx *rsactx = (libssh2_rsa_ctx *) (*abstract);\n    (void) session;\n\n    _libssh2_rsa_free(rsactx);\n\n    *abstract = NULL;\n\n    return 0;\n}\n\n#ifdef OPENSSL_NO_MD5\n#define MD5_DIGEST_LENGTH 16\n#endif\n\nstatic const LIBSSH2_HOSTKEY_METHOD hostkey_method_ssh_rsa = {\n    \"ssh-rsa\",\n    MD5_DIGEST_LENGTH,\n    hostkey_method_ssh_rsa_init,\n    hostkey_method_ssh_rsa_initPEM,\n    hostkey_method_ssh_rsa_initPEMFromMemory,\n    hostkey_method_ssh_rsa_sig_verify,\n    hostkey_method_ssh_rsa_signv,\n    NULL,                       /* encrypt */\n    hostkey_method_ssh_rsa_dtor,\n};\n#endif /* LIBSSH2_RSA */\n\n#if LIBSSH2_DSA\n/* ***********\n * ssh-dss *\n *********** */\n\nstatic int hostkey_method_ssh_dss_dtor(LIBSSH2_SESSION * session,\n                                       void **abstract);\n\n/*\n * hostkey_method_ssh_dss_init\n *\n * Initialize the server hostkey working area with p/q/g/y set\n */\nstatic int\nhostkey_method_ssh_dss_init(LIBSSH2_SESSION * session,\n                            const unsigned char *hostkey_data,\n                            size_t hostkey_data_len,\n                            void **abstract)\n{\n    libssh2_dsa_ctx *dsactx;\n    const unsigned char *p, *q, *g, *y, *s;\n    unsigned long p_len, q_len, g_len, y_len, len;\n    int ret;\n\n    (void) hostkey_data_len;\n\n    if (*abstract) {\n        hostkey_method_ssh_dss_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    s = hostkey_data;\n    len = _libssh2_ntohu32(s);\n    s += 4;\n    if (len != 7 || strncmp((char *) s, \"ssh-dss\", 7) != 0) {\n        return -1;\n    }\n    s += 7;\n\n    p_len = _libssh2_ntohu32(s);\n    s += 4;\n    p = s;\n    s += p_len;\n    q_len = _libssh2_ntohu32(s);\n    s += 4;\n    q = s;\n    s += q_len;\n    g_len = _libssh2_ntohu32(s);\n    s += 4;\n    g = s;\n    s += g_len;\n    y_len = _libssh2_ntohu32(s);\n    s += 4;\n    y = s;\n    /* s += y_len; */\n\n    ret = _libssh2_dsa_new(&dsactx, p, p_len, q, q_len,\n                           g, g_len, y, y_len, NULL, 0);\n    if (ret) {\n        return -1;\n    }\n\n    *abstract = dsactx;\n\n    return 0;\n}\n\n/*\n * hostkey_method_ssh_dss_initPEM\n *\n * Load a Private Key from a PEM file\n */\nstatic int\nhostkey_method_ssh_dss_initPEM(LIBSSH2_SESSION * session,\n                               const char *privkeyfile,\n                               unsigned const char *passphrase,\n                               void **abstract)\n{\n    libssh2_dsa_ctx *dsactx;\n    int ret;\n\n    if (*abstract) {\n        hostkey_method_ssh_dss_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    ret = _libssh2_dsa_new_private(&dsactx, session, privkeyfile, passphrase);\n    if (ret) {\n        return -1;\n    }\n\n    *abstract = dsactx;\n\n    return 0;\n}\n\n/*\n * hostkey_method_ssh_dss_initPEMFromMemory\n *\n * Load a Private Key from memory\n */\nstatic int\nhostkey_method_ssh_dss_initPEMFromMemory(LIBSSH2_SESSION * session,\n                                         const char *privkeyfiledata,\n                                         size_t privkeyfiledata_len,\n                                         unsigned const char *passphrase,\n                                         void **abstract)\n{\n    libssh2_dsa_ctx *dsactx;\n    int ret;\n\n    if (*abstract) {\n        hostkey_method_ssh_dss_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    ret = _libssh2_dsa_new_private_frommemory(&dsactx, session,\n                                              privkeyfiledata,\n                                              privkeyfiledata_len, passphrase);\n    if (ret) {\n        return -1;\n    }\n\n    *abstract = dsactx;\n\n    return 0;\n}\n\n/*\n * libssh2_hostkey_method_ssh_dss_sign\n *\n * Verify signature created by remote\n */\nstatic int\nhostkey_method_ssh_dss_sig_verify(LIBSSH2_SESSION * session,\n                                  const unsigned char *sig,\n                                  size_t sig_len,\n                                  const unsigned char *m,\n                                  size_t m_len, void **abstract)\n{\n    libssh2_dsa_ctx *dsactx = (libssh2_dsa_ctx *) (*abstract);\n\n    /* Skip past keyname_len(4) + keyname(7){\"ssh-dss\"} + signature_len(4) */\n    sig += 15;\n    sig_len -= 15;\n    if (sig_len != 40) {\n        return _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                              \"Invalid DSS signature length\");\n    }\n    return _libssh2_dsa_sha1_verify(dsactx, sig, m, m_len);\n}\n\n/*\n * hostkey_method_ssh_dss_signv\n *\n * Construct a signature from an array of vectors\n */\nstatic int\nhostkey_method_ssh_dss_signv(LIBSSH2_SESSION * session,\n                             unsigned char **signature,\n                             size_t *signature_len,\n                             int veccount,\n                             const struct iovec datavec[],\n                             void **abstract)\n{\n    libssh2_dsa_ctx *dsactx = (libssh2_dsa_ctx *) (*abstract);\n    unsigned char hash[SHA_DIGEST_LENGTH];\n    libssh2_sha1_ctx ctx;\n    int i;\n\n    *signature = LIBSSH2_CALLOC(session, 2 * SHA_DIGEST_LENGTH);\n    if (!*signature) {\n        return -1;\n    }\n\n    *signature_len = 2 * SHA_DIGEST_LENGTH;\n\n    libssh2_sha1_init(&ctx);\n    for(i = 0; i < veccount; i++) {\n        libssh2_sha1_update(ctx, datavec[i].iov_base, datavec[i].iov_len);\n    }\n    libssh2_sha1_final(ctx, hash);\n\n    if (_libssh2_dsa_sha1_sign(dsactx, hash, SHA_DIGEST_LENGTH, *signature)) {\n        LIBSSH2_FREE(session, *signature);\n        return -1;\n    }\n\n    return 0;\n}\n\n/*\n * libssh2_hostkey_method_ssh_dss_dtor\n *\n * Shutdown the hostkey method\n */\nstatic int\nhostkey_method_ssh_dss_dtor(LIBSSH2_SESSION * session, void **abstract)\n{\n    libssh2_dsa_ctx *dsactx = (libssh2_dsa_ctx *) (*abstract);\n    (void) session;\n\n    _libssh2_dsa_free(dsactx);\n\n    *abstract = NULL;\n\n    return 0;\n}\n\nstatic const LIBSSH2_HOSTKEY_METHOD hostkey_method_ssh_dss = {\n    \"ssh-dss\",\n    MD5_DIGEST_LENGTH,\n    hostkey_method_ssh_dss_init,\n    hostkey_method_ssh_dss_initPEM,\n    hostkey_method_ssh_dss_initPEMFromMemory,\n    hostkey_method_ssh_dss_sig_verify,\n    hostkey_method_ssh_dss_signv,\n    NULL,                       /* encrypt */\n    hostkey_method_ssh_dss_dtor,\n};\n#endif /* LIBSSH2_DSA */\n\nstatic const LIBSSH2_HOSTKEY_METHOD *hostkey_methods[] = {\n#if LIBSSH2_RSA\n    &hostkey_method_ssh_rsa,\n#endif /* LIBSSH2_RSA */\n#if LIBSSH2_DSA\n    &hostkey_method_ssh_dss,\n#endif /* LIBSSH2_DSA */\n    NULL\n};\n\nconst LIBSSH2_HOSTKEY_METHOD **\nlibssh2_hostkey_methods(void)\n{\n    return hostkey_methods;\n}\n\n/*\n * libssh2_hostkey_hash\n *\n * Returns hash signature\n * Returned buffer should NOT be freed\n * Length of buffer is determined by hash type\n * i.e. MD5 == 16, SHA1 == 20\n */\nLIBSSH2_API const char *\nlibssh2_hostkey_hash(LIBSSH2_SESSION * session, int hash_type)\n{\n    switch (hash_type) {\n#if LIBSSH2_MD5\n    case LIBSSH2_HOSTKEY_HASH_MD5:\n        return (session->server_hostkey_md5_valid)\n          ? (char *) session->server_hostkey_md5\n          : NULL;\n        break;\n#endif /* LIBSSH2_MD5 */\n    case LIBSSH2_HOSTKEY_HASH_SHA1:\n        return (session->server_hostkey_sha1_valid)\n          ? (char *) session->server_hostkey_sha1\n          : NULL;\n        break;\n    default:\n        return NULL;\n    }\n}\n\nstatic int hostkey_type(const unsigned char *hostkey, size_t len)\n{\n    const unsigned char rsa[] = {\n        0, 0, 0, 0x07, 's', 's', 'h', '-', 'r', 's', 'a'\n    };\n    const unsigned char dss[] = {\n        0, 0, 0, 0x07, 's', 's', 'h', '-', 'd', 's', 's'\n    };\n\n    if (len < 11)\n        return LIBSSH2_HOSTKEY_TYPE_UNKNOWN;\n\n    if (!memcmp(rsa, hostkey, 11))\n        return LIBSSH2_HOSTKEY_TYPE_RSA;\n\n    if (!memcmp(dss, hostkey, 11))\n        return LIBSSH2_HOSTKEY_TYPE_DSS;\n\n    return LIBSSH2_HOSTKEY_TYPE_UNKNOWN;\n}\n\n/*\n * libssh2_session_hostkey()\n *\n * Returns the server key and length.\n *\n */\nLIBSSH2_API const char *\nlibssh2_session_hostkey(LIBSSH2_SESSION *session, size_t *len, int *type)\n{\n    if(session->server_hostkey_len) {\n        if(len)\n            *len = session->server_hostkey_len;\n        if (type)\n            *type = hostkey_type(session->server_hostkey,\n                                 session->server_hostkey_len);\n        return (char *) session->server_hostkey;\n    }\n    if(len)\n        *len = 0;\n    return NULL;\n}\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/keepalive.c",
    "content": "/* Copyright (C) 2010  Simon Josefsson\n * Author: Simon Josefsson\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n */\n\n#include \"libssh2_priv.h\"\n#include \"transport.h\" /* _libssh2_transport_write */\n\n/* Keep-alive stuff. */\n\nLIBSSH2_API void\nlibssh2_keepalive_config (LIBSSH2_SESSION *session,\n                          int want_reply,\n                          unsigned interval)\n{\n    if (interval == 1)\n        session->keepalive_interval = 2;\n    else\n        session->keepalive_interval = interval;\n    session->keepalive_want_reply = want_reply ? 1 : 0;\n}\n\nLIBSSH2_API int\nlibssh2_keepalive_send (LIBSSH2_SESSION *session,\n                        int *seconds_to_next)\n{\n    time_t now;\n\n    if (!session->keepalive_interval) {\n        if (seconds_to_next)\n            *seconds_to_next = 0;\n        return 0;\n    }\n\n    now = time (NULL);\n\n    if (session->keepalive_last_sent + session->keepalive_interval <= now) {\n        /* Format is\n           \"SSH_MSG_GLOBAL_REQUEST || 4-byte len || str || want-reply\". */\n        unsigned char keepalive_data[]\n            = \"\\x50\\x00\\x00\\x00\\x15keepalive@libssh2.orgW\";\n        size_t len = sizeof (keepalive_data) - 1;\n        int rc;\n\n        keepalive_data[len - 1] =\n            (unsigned char)session->keepalive_want_reply;\n\n        rc = _libssh2_transport_send(session, keepalive_data, len, NULL, 0);\n        /* Silently ignore PACKET_EAGAIN here: if the write buffer is\n           already full, sending another keepalive is not useful. */\n        if (rc && rc != LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                           \"Unable to send keepalive message\");\n            return rc;\n        }\n\n        session->keepalive_last_sent = now;\n        if (seconds_to_next)\n            *seconds_to_next = session->keepalive_interval;\n    } else if (seconds_to_next) {\n        *seconds_to_next = (int) (session->keepalive_last_sent - now)\n            + session->keepalive_interval;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/kex.c",
    "content": "/* Copyright (c) 2004-2007, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2010, Daniel Stenberg <daniel@haxx.se>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\n#include \"transport.h\"\n#include \"comp.h\"\n#include \"mac.h\"\n\n/* TODO: Switch this to an inline and handle alloc() failures */\n/* Helper macro called from kex_method_diffie_hellman_group1_sha1_key_exchange */\n#define LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(value, reqlen, version) \\\n    {                                                                   \\\n        libssh2_sha1_ctx hash;                                          \\\n        unsigned long len = 0;                                          \\\n        if (!(value)) {                                                 \\\n            value = LIBSSH2_ALLOC(session, reqlen + SHA_DIGEST_LENGTH); \\\n        }                                                               \\\n        if (value)                                                      \\\n            while (len < (unsigned long)reqlen) {                       \\\n                libssh2_sha1_init(&hash);                               \\\n                libssh2_sha1_update(hash, exchange_state->k_value,      \\\n                                    exchange_state->k_value_len);       \\\n                libssh2_sha1_update(hash, exchange_state->h_sig_comp,   \\\n                                    SHA_DIGEST_LENGTH);                 \\\n                if (len > 0) {                                          \\\n                    libssh2_sha1_update(hash, value, len);              \\\n                } else {                                                \\\n                    libssh2_sha1_update(hash, (version), 1);            \\\n                    libssh2_sha1_update(hash, session->session_id,      \\\n                                        session->session_id_len);       \\\n                }                                                       \\\n                libssh2_sha1_final(hash, (value) + len);                \\\n                len += SHA_DIGEST_LENGTH;                               \\\n            }                                                           \\\n    }\n\n\n/* Helper macro called from kex_method_diffie_hellman_group1_sha256_key_exchange */\n#define LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA256_HASH(value, reqlen, version) \\\n    {                                                                      \\\n        libssh2_sha256_ctx hash;                                           \\\n        unsigned long len = 0;                                             \\\n        if (!(value)) {                                                    \\\n            value = LIBSSH2_ALLOC(session, reqlen + SHA256_DIGEST_LENGTH); \\\n        }                                                                  \\\n        if (value)                                                         \\\n            while (len < (unsigned long)reqlen) {                          \\\n                libssh2_sha256_init(&hash);                                \\\n                libssh2_sha256_update(hash, exchange_state->k_value,       \\\n                                      exchange_state->k_value_len);        \\\n                libssh2_sha256_update(hash, exchange_state->h_sig_comp,    \\\n                                      SHA256_DIGEST_LENGTH);               \\\n                if (len > 0) {                                             \\\n                    libssh2_sha256_update(hash, value, len);               \\\n                } else {                                                   \\\n                    libssh2_sha256_update(hash, (version), 1);             \\\n                    libssh2_sha256_update(hash, session->session_id,       \\\n                                          session->session_id_len);        \\\n                }                                                          \\\n                libssh2_sha256_final(hash, (value) + len);                 \\\n                len += SHA256_DIGEST_LENGTH;                               \\\n            }                                                              \\\n    }\n\n\n/*\n * diffie_hellman_sha1\n *\n * Diffie Hellman Key Exchange, Group Agnostic\n */\nstatic int diffie_hellman_sha1(LIBSSH2_SESSION *session,\n                               _libssh2_bn *g,\n                               _libssh2_bn *p,\n                               int group_order,\n                               unsigned char packet_type_init,\n                               unsigned char packet_type_reply,\n                               unsigned char *midhash,\n                               unsigned long midhash_len,\n                               kmdhgGPshakex_state_t *exchange_state)\n{\n    int ret = 0;\n    int rc;\n    libssh2_sha1_ctx exchange_hash_ctx;\n\n    if (exchange_state->state == libssh2_NB_state_idle) {\n        /* Setup initial values */\n        exchange_state->e_packet = NULL;\n        exchange_state->s_packet = NULL;\n        exchange_state->k_value = NULL;\n        exchange_state->ctx = _libssh2_bn_ctx_new();\n        exchange_state->x = _libssh2_bn_init(); /* Random from client */\n        exchange_state->e = _libssh2_bn_init(); /* g^x mod p */\n        exchange_state->f = _libssh2_bn_init_from_bin(); /* g^(Random from server) mod p */\n        exchange_state->k = _libssh2_bn_init(); /* The shared secret: f^x mod p */\n\n        /* Zero the whole thing out */\n        memset(&exchange_state->req_state, 0, sizeof(packet_require_state_t));\n\n        /* Generate x and e */\n        _libssh2_bn_rand(exchange_state->x, group_order, 0, -1);\n        _libssh2_bn_mod_exp(exchange_state->e, g, exchange_state->x, p,\n                            exchange_state->ctx);\n\n        /* Send KEX init */\n        /* packet_type(1) + String Length(4) + leading 0(1) */\n        exchange_state->e_packet_len =\n            _libssh2_bn_bytes(exchange_state->e) + 6;\n        if (_libssh2_bn_bits(exchange_state->e) % 8) {\n            /* Leading 00 not needed */\n            exchange_state->e_packet_len--;\n        }\n\n        exchange_state->e_packet =\n            LIBSSH2_ALLOC(session, exchange_state->e_packet_len);\n        if (!exchange_state->e_packet) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Out of memory error\");\n            goto clean_exit;\n        }\n        exchange_state->e_packet[0] = packet_type_init;\n        _libssh2_htonu32(exchange_state->e_packet + 1,\n                         exchange_state->e_packet_len - 5);\n        if (_libssh2_bn_bits(exchange_state->e) % 8) {\n            _libssh2_bn_to_bin(exchange_state->e,\n                               exchange_state->e_packet + 5);\n        } else {\n            exchange_state->e_packet[5] = 0;\n            _libssh2_bn_to_bin(exchange_state->e,\n                               exchange_state->e_packet + 6);\n        }\n\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sending KEX packet %d\",\n                       (int) packet_type_init);\n        exchange_state->state = libssh2_NB_state_created;\n    }\n\n    if (exchange_state->state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, exchange_state->e_packet,\n                                     exchange_state->e_packet_len,\n                                     NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Unable to send KEX init message\");\n            goto clean_exit;\n        }\n        exchange_state->state = libssh2_NB_state_sent;\n    }\n\n    if (exchange_state->state == libssh2_NB_state_sent) {\n        if (session->burn_optimistic_kexinit) {\n            /* The first KEX packet to come along will be the guess initially\n             * sent by the server.  That guess turned out to be wrong so we\n             * need to silently ignore it */\n            int burn_type;\n\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Waiting for badly guessed KEX packet (to be ignored)\");\n            burn_type =\n                _libssh2_packet_burn(session, &exchange_state->burn_state);\n            if (burn_type == LIBSSH2_ERROR_EAGAIN) {\n                return burn_type;\n            } else if (burn_type <= 0) {\n                /* Failed to receive a packet */\n                ret = burn_type;\n                goto clean_exit;\n            }\n            session->burn_optimistic_kexinit = 0;\n\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Burnt packet of type: %02x\",\n                           (unsigned int) burn_type);\n        }\n\n        exchange_state->state = libssh2_NB_state_sent1;\n    }\n\n    if (exchange_state->state == libssh2_NB_state_sent1) {\n        /* Wait for KEX reply */\n        rc = _libssh2_packet_require(session, packet_type_reply,\n                                     &exchange_state->s_packet,\n                                     &exchange_state->s_packet_len, 0, NULL,\n                                     0, &exchange_state->req_state);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        if (rc) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_TIMEOUT,\n                                 \"Timed out waiting for KEX reply\");\n            goto clean_exit;\n        }\n\n        /* Parse KEXDH_REPLY */\n        exchange_state->s = exchange_state->s_packet + 1;\n\n        session->server_hostkey_len = _libssh2_ntohu32(exchange_state->s);\n        exchange_state->s += 4;\n\n        if (session->server_hostkey)\n            LIBSSH2_FREE(session, session->server_hostkey);\n\n        session->server_hostkey =\n            LIBSSH2_ALLOC(session, session->server_hostkey_len);\n        if (!session->server_hostkey) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Unable to allocate memory for a copy \"\n                                 \"of the host key\");\n            goto clean_exit;\n        }\n        memcpy(session->server_hostkey, exchange_state->s,\n               session->server_hostkey_len);\n        exchange_state->s += session->server_hostkey_len;\n\n#if LIBSSH2_MD5\n        {\n            libssh2_md5_ctx fingerprint_ctx;\n\n            if (libssh2_md5_init(&fingerprint_ctx)) {\n                libssh2_md5_update(fingerprint_ctx, session->server_hostkey,\n                                   session->server_hostkey_len);\n                libssh2_md5_final(fingerprint_ctx,\n                                  session->server_hostkey_md5);\n                session->server_hostkey_md5_valid = TRUE;\n            }\n            else {\n                session->server_hostkey_md5_valid = FALSE;\n            }\n        }\n#ifdef LIBSSH2DEBUG\n        {\n            char fingerprint[50], *fprint = fingerprint;\n            int i;\n            for(i = 0; i < 16; i++, fprint += 3) {\n                snprintf(fprint, 4, \"%02x:\", session->server_hostkey_md5[i]);\n            }\n            *(--fprint) = '\\0';\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Server's MD5 Fingerprint: %s\", fingerprint);\n        }\n#endif /* LIBSSH2DEBUG */\n#endif /* ! LIBSSH2_MD5 */\n\n        {\n            libssh2_sha1_ctx fingerprint_ctx;\n\n            if (libssh2_sha1_init(&fingerprint_ctx)) {\n                libssh2_sha1_update(fingerprint_ctx, session->server_hostkey,\n                                    session->server_hostkey_len);\n                libssh2_sha1_final(fingerprint_ctx,\n                                   session->server_hostkey_sha1);\n                session->server_hostkey_sha1_valid = TRUE;\n            }\n            else {\n                session->server_hostkey_sha1_valid = FALSE;\n            }\n        }\n#ifdef LIBSSH2DEBUG\n        {\n            char fingerprint[64], *fprint = fingerprint;\n            int i;\n\n            for(i = 0; i < 20; i++, fprint += 3) {\n                snprintf(fprint, 4, \"%02x:\", session->server_hostkey_sha1[i]);\n            }\n            *(--fprint) = '\\0';\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Server's SHA1 Fingerprint: %s\", fingerprint);\n        }\n#endif /* LIBSSH2DEBUG */\n\n        if (session->hostkey->init(session, session->server_hostkey,\n                                   session->server_hostkey_len,\n                                   &session->server_hostkey_abstract)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT,\n                                 \"Unable to initialize hostkey importer\");\n            goto clean_exit;\n        }\n\n        exchange_state->f_value_len = _libssh2_ntohu32(exchange_state->s);\n        exchange_state->s += 4;\n        exchange_state->f_value = exchange_state->s;\n        exchange_state->s += exchange_state->f_value_len;\n        _libssh2_bn_from_bin(exchange_state->f, exchange_state->f_value_len,\n                             exchange_state->f_value);\n\n        exchange_state->h_sig_len = _libssh2_ntohu32(exchange_state->s);\n        exchange_state->s += 4;\n        exchange_state->h_sig = exchange_state->s;\n\n        /* Compute the shared secret */\n        _libssh2_bn_mod_exp(exchange_state->k, exchange_state->f,\n                            exchange_state->x, p, exchange_state->ctx);\n        exchange_state->k_value_len = _libssh2_bn_bytes(exchange_state->k) + 5;\n        if (_libssh2_bn_bits(exchange_state->k) % 8) {\n            /* don't need leading 00 */\n            exchange_state->k_value_len--;\n        }\n        exchange_state->k_value =\n            LIBSSH2_ALLOC(session, exchange_state->k_value_len);\n        if (!exchange_state->k_value) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Unable to allocate buffer for K\");\n            goto clean_exit;\n        }\n        _libssh2_htonu32(exchange_state->k_value,\n                         exchange_state->k_value_len - 4);\n        if (_libssh2_bn_bits(exchange_state->k) % 8) {\n            _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 4);\n        } else {\n            exchange_state->k_value[4] = 0;\n            _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 5);\n        }\n\n        exchange_state->exchange_hash = (void*)&exchange_hash_ctx;\n        libssh2_sha1_init(&exchange_hash_ctx);\n\n        if (session->local.banner) {\n            _libssh2_htonu32(exchange_state->h_sig_comp,\n                             strlen((char *) session->local.banner) - 2);\n            libssh2_sha1_update(exchange_hash_ctx,\n                                exchange_state->h_sig_comp, 4);\n            libssh2_sha1_update(exchange_hash_ctx,\n                                (char *) session->local.banner,\n                                strlen((char *) session->local.banner) - 2);\n        } else {\n            _libssh2_htonu32(exchange_state->h_sig_comp,\n                             sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1);\n            libssh2_sha1_update(exchange_hash_ctx,\n                                exchange_state->h_sig_comp, 4);\n            libssh2_sha1_update(exchange_hash_ctx,\n                                LIBSSH2_SSH_DEFAULT_BANNER,\n                                sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1);\n        }\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         strlen((char *) session->remote.banner));\n        libssh2_sha1_update(exchange_hash_ctx,\n                            exchange_state->h_sig_comp, 4);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            session->remote.banner,\n                            strlen((char *) session->remote.banner));\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         session->local.kexinit_len);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            exchange_state->h_sig_comp, 4);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            session->local.kexinit,\n                            session->local.kexinit_len);\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         session->remote.kexinit_len);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            exchange_state->h_sig_comp, 4);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            session->remote.kexinit,\n                            session->remote.kexinit_len);\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         session->server_hostkey_len);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            exchange_state->h_sig_comp, 4);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            session->server_hostkey,\n                            session->server_hostkey_len);\n\n        if (packet_type_init == SSH_MSG_KEX_DH_GEX_INIT) {\n            /* diffie-hellman-group-exchange hashes additional fields */\n#ifdef LIBSSH2_DH_GEX_NEW\n            _libssh2_htonu32(exchange_state->h_sig_comp,\n                             LIBSSH2_DH_GEX_MINGROUP);\n            _libssh2_htonu32(exchange_state->h_sig_comp + 4,\n                             LIBSSH2_DH_GEX_OPTGROUP);\n            _libssh2_htonu32(exchange_state->h_sig_comp + 8,\n                             LIBSSH2_DH_GEX_MAXGROUP);\n            libssh2_sha1_update(exchange_hash_ctx,\n                                exchange_state->h_sig_comp, 12);\n#else\n            _libssh2_htonu32(exchange_state->h_sig_comp,\n                             LIBSSH2_DH_GEX_OPTGROUP);\n            libssh2_sha1_update(exchange_hash_ctx,\n                                exchange_state->h_sig_comp, 4);\n#endif\n        }\n\n        if (midhash) {\n            libssh2_sha1_update(exchange_hash_ctx, midhash,\n                                midhash_len);\n        }\n\n        libssh2_sha1_update(exchange_hash_ctx,\n                            exchange_state->e_packet + 1,\n                            exchange_state->e_packet_len - 1);\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         exchange_state->f_value_len);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            exchange_state->h_sig_comp, 4);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            exchange_state->f_value,\n                            exchange_state->f_value_len);\n\n        libssh2_sha1_update(exchange_hash_ctx,\n                            exchange_state->k_value,\n                            exchange_state->k_value_len);\n\n        libssh2_sha1_final(exchange_hash_ctx,\n                           exchange_state->h_sig_comp);\n\n        if (session->hostkey->\n            sig_verify(session, exchange_state->h_sig,\n                       exchange_state->h_sig_len, exchange_state->h_sig_comp,\n                       20, &session->server_hostkey_abstract)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_SIGN,\n                                 \"Unable to verify hostkey signature\");\n            goto clean_exit;\n        }\n\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sending NEWKEYS message\");\n        exchange_state->c = SSH_MSG_NEWKEYS;\n\n        exchange_state->state = libssh2_NB_state_sent2;\n    }\n\n    if (exchange_state->state == libssh2_NB_state_sent2) {\n        rc = _libssh2_transport_send(session, &exchange_state->c, 1, NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc) {\n            ret = _libssh2_error(session, rc, \"Unable to send NEWKEYS message\");\n            goto clean_exit;\n        }\n\n        exchange_state->state = libssh2_NB_state_sent3;\n    }\n\n    if (exchange_state->state == libssh2_NB_state_sent3) {\n        rc = _libssh2_packet_require(session, SSH_MSG_NEWKEYS,\n                                     &exchange_state->tmp,\n                                     &exchange_state->tmp_len, 0, NULL, 0,\n                                     &exchange_state->req_state);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc) {\n            ret = _libssh2_error(session, rc, \"Timed out waiting for NEWKEYS\");\n            goto clean_exit;\n        }\n        /* The first key exchange has been performed,\n           switch to active crypt/comp/mac mode */\n        session->state |= LIBSSH2_STATE_NEWKEYS;\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Received NEWKEYS message\");\n\n        /* This will actually end up being just packet_type(1)\n           for this packet type anyway */\n        LIBSSH2_FREE(session, exchange_state->tmp);\n\n        if (!session->session_id) {\n            session->session_id = LIBSSH2_ALLOC(session, SHA_DIGEST_LENGTH);\n            if (!session->session_id) {\n                ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                     \"Unable to allocate buffer for SHA digest\");\n                goto clean_exit;\n            }\n            memcpy(session->session_id, exchange_state->h_sig_comp,\n                   SHA_DIGEST_LENGTH);\n            session->session_id_len = SHA_DIGEST_LENGTH;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"session_id calculated\");\n        }\n\n        /* Cleanup any existing cipher */\n        if (session->local.crypt->dtor) {\n            session->local.crypt->dtor(session,\n                                       &session->local.crypt_abstract);\n        }\n\n        /* Calculate IV/Secret/Key for each direction */\n        if (session->local.crypt->init) {\n            unsigned char *iv = NULL, *secret = NULL;\n            int free_iv = 0, free_secret = 0;\n\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(iv,\n                                                        session->local.crypt->\n                                                        iv_len, \"A\");\n            if (!iv) {\n                ret = -1;\n                goto clean_exit;\n            }\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(secret,\n                                                        session->local.crypt->\n                                                        secret_len, \"C\");\n            if (!secret) {\n                LIBSSH2_FREE(session, iv);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            if (session->local.crypt->\n                init(session, session->local.crypt, iv, &free_iv, secret,\n                     &free_secret, 1, &session->local.crypt_abstract)) {\n                LIBSSH2_FREE(session, iv);\n                LIBSSH2_FREE(session, secret);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n\n            if (free_iv) {\n                memset(iv, 0, session->local.crypt->iv_len);\n                LIBSSH2_FREE(session, iv);\n            }\n\n            if (free_secret) {\n                memset(secret, 0, session->local.crypt->secret_len);\n                LIBSSH2_FREE(session, secret);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Client to Server IV and Key calculated\");\n\n        if (session->remote.crypt->dtor) {\n            /* Cleanup any existing cipher */\n            session->remote.crypt->dtor(session,\n                                        &session->remote.crypt_abstract);\n        }\n\n        if (session->remote.crypt->init) {\n            unsigned char *iv = NULL, *secret = NULL;\n            int free_iv = 0, free_secret = 0;\n\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(iv,\n                                                        session->remote.crypt->\n                                                        iv_len, \"B\");\n            if (!iv) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(secret,\n                                                        session->remote.crypt->\n                                                        secret_len, \"D\");\n            if (!secret) {\n                LIBSSH2_FREE(session, iv);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            if (session->remote.crypt->\n                init(session, session->remote.crypt, iv, &free_iv, secret,\n                     &free_secret, 0, &session->remote.crypt_abstract)) {\n                LIBSSH2_FREE(session, iv);\n                LIBSSH2_FREE(session, secret);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n\n            if (free_iv) {\n                memset(iv, 0, session->remote.crypt->iv_len);\n                LIBSSH2_FREE(session, iv);\n            }\n\n            if (free_secret) {\n                memset(secret, 0, session->remote.crypt->secret_len);\n                LIBSSH2_FREE(session, secret);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Server to Client IV and Key calculated\");\n\n        if (session->local.mac->dtor) {\n            session->local.mac->dtor(session, &session->local.mac_abstract);\n        }\n\n        if (session->local.mac->init) {\n            unsigned char *key = NULL;\n            int free_key = 0;\n\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(key,\n                                                        session->local.mac->\n                                                        key_len, \"E\");\n            if (!key) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            session->local.mac->init(session, key, &free_key,\n                                     &session->local.mac_abstract);\n\n            if (free_key) {\n                memset(key, 0, session->local.mac->key_len);\n                LIBSSH2_FREE(session, key);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Client to Server HMAC Key calculated\");\n\n        if (session->remote.mac->dtor) {\n            session->remote.mac->dtor(session, &session->remote.mac_abstract);\n        }\n\n        if (session->remote.mac->init) {\n            unsigned char *key = NULL;\n            int free_key = 0;\n\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(key,\n                                                        session->remote.mac->\n                                                        key_len, \"F\");\n            if (!key) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            session->remote.mac->init(session, key, &free_key,\n                                      &session->remote.mac_abstract);\n\n            if (free_key) {\n                memset(key, 0, session->remote.mac->key_len);\n                LIBSSH2_FREE(session, key);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Server to Client HMAC Key calculated\");\n\n        /* Initialize compression for each direction */\n\n        /* Cleanup any existing compression */\n        if (session->local.comp && session->local.comp->dtor) {\n            session->local.comp->dtor(session, 1,\n                                      &session->local.comp_abstract);\n        }\n\n        if (session->local.comp && session->local.comp->init) {\n            if (session->local.comp->init(session, 1,\n                                          &session->local.comp_abstract)) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Client to Server compression initialized\");\n\n        if (session->remote.comp && session->remote.comp->dtor) {\n            session->remote.comp->dtor(session, 0,\n                                       &session->remote.comp_abstract);\n        }\n\n        if (session->remote.comp && session->remote.comp->init) {\n            if (session->remote.comp->init(session, 0,\n                                           &session->remote.comp_abstract)) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Server to Client compression initialized\");\n\n    }\n\n  clean_exit:\n    _libssh2_bn_free(exchange_state->x);\n    exchange_state->x = NULL;\n    _libssh2_bn_free(exchange_state->e);\n    exchange_state->e = NULL;\n    _libssh2_bn_free(exchange_state->f);\n    exchange_state->f = NULL;\n    _libssh2_bn_free(exchange_state->k);\n    exchange_state->k = NULL;\n    _libssh2_bn_ctx_free(exchange_state->ctx);\n    exchange_state->ctx = NULL;\n\n    if (exchange_state->e_packet) {\n        LIBSSH2_FREE(session, exchange_state->e_packet);\n        exchange_state->e_packet = NULL;\n    }\n\n    if (exchange_state->s_packet) {\n        LIBSSH2_FREE(session, exchange_state->s_packet);\n        exchange_state->s_packet = NULL;\n    }\n\n    if (exchange_state->k_value) {\n        LIBSSH2_FREE(session, exchange_state->k_value);\n        exchange_state->k_value = NULL;\n    }\n\n    exchange_state->state = libssh2_NB_state_idle;\n\n    return ret;\n}\n\n\n/*\n * diffie_hellman_sha256\n *\n * Diffie Hellman Key Exchange, Group Agnostic\n */\nstatic int diffie_hellman_sha256(LIBSSH2_SESSION *session,\n                                 _libssh2_bn *g,\n                                 _libssh2_bn *p,\n                                 int group_order,\n                                 unsigned char packet_type_init,\n                                 unsigned char packet_type_reply,\n                                 unsigned char *midhash,\n                                 unsigned long midhash_len,\n                                 kmdhgGPshakex_state_t *exchange_state)\n{\n    int ret = 0;\n    int rc;\n    libssh2_sha256_ctx exchange_hash_ctx;\n\n    if (exchange_state->state == libssh2_NB_state_idle) {\n        /* Setup initial values */\n        exchange_state->e_packet = NULL;\n        exchange_state->s_packet = NULL;\n        exchange_state->k_value = NULL;\n        exchange_state->ctx = _libssh2_bn_ctx_new();\n        exchange_state->x = _libssh2_bn_init(); /* Random from client */\n        exchange_state->e = _libssh2_bn_init(); /* g^x mod p */\n        exchange_state->f = _libssh2_bn_init_from_bin(); /* g^(Random from server) mod p */\n        exchange_state->k = _libssh2_bn_init(); /* The shared secret: f^x mod p */\n\n        /* Zero the whole thing out */\n        memset(&exchange_state->req_state, 0, sizeof(packet_require_state_t));\n\n        /* Generate x and e */\n        _libssh2_bn_rand(exchange_state->x, group_order * 8 - 1, 0, -1);\n        _libssh2_bn_mod_exp(exchange_state->e, g, exchange_state->x, p,\n                            exchange_state->ctx);\n\n        /* Send KEX init */\n        /* packet_type(1) + String Length(4) + leading 0(1) */\n        exchange_state->e_packet_len =\n            _libssh2_bn_bytes(exchange_state->e) + 6;\n        if (_libssh2_bn_bits(exchange_state->e) % 8) {\n            /* Leading 00 not needed */\n            exchange_state->e_packet_len--;\n        }\n\n        exchange_state->e_packet =\n            LIBSSH2_ALLOC(session, exchange_state->e_packet_len);\n        if (!exchange_state->e_packet) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Out of memory error\");\n            goto clean_exit;\n        }\n        exchange_state->e_packet[0] = packet_type_init;\n        _libssh2_htonu32(exchange_state->e_packet + 1,\n                         exchange_state->e_packet_len - 5);\n        if (_libssh2_bn_bits(exchange_state->e) % 8) {\n            _libssh2_bn_to_bin(exchange_state->e,\n                               exchange_state->e_packet + 5);\n        } else {\n            exchange_state->e_packet[5] = 0;\n            _libssh2_bn_to_bin(exchange_state->e,\n                               exchange_state->e_packet + 6);\n        }\n\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sending KEX packet %d\",\n                       (int) packet_type_init);\n        exchange_state->state = libssh2_NB_state_created;\n    }\n\n    if (exchange_state->state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, exchange_state->e_packet,\n                                     exchange_state->e_packet_len,\n                                     NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Unable to send KEX init message\");\n            goto clean_exit;\n        }\n        exchange_state->state = libssh2_NB_state_sent;\n    }\n\n    if (exchange_state->state == libssh2_NB_state_sent) {\n        if (session->burn_optimistic_kexinit) {\n            /* The first KEX packet to come along will be the guess initially\n             * sent by the server.  That guess turned out to be wrong so we\n             * need to silently ignore it */\n            int burn_type;\n\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Waiting for badly guessed KEX packet (to be ignored)\");\n            burn_type =\n                _libssh2_packet_burn(session, &exchange_state->burn_state);\n            if (burn_type == LIBSSH2_ERROR_EAGAIN) {\n                return burn_type;\n            } else if (burn_type <= 0) {\n                /* Failed to receive a packet */\n                ret = burn_type;\n                goto clean_exit;\n            }\n            session->burn_optimistic_kexinit = 0;\n\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Burnt packet of type: %02x\",\n                           (unsigned int) burn_type);\n        }\n\n        exchange_state->state = libssh2_NB_state_sent1;\n    }\n\n    if (exchange_state->state == libssh2_NB_state_sent1) {\n        /* Wait for KEX reply */\n        rc = _libssh2_packet_require(session, packet_type_reply,\n                                     &exchange_state->s_packet,\n                                     &exchange_state->s_packet_len, 0, NULL,\n                                     0, &exchange_state->req_state);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        if (rc) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_TIMEOUT,\n                                 \"Timed out waiting for KEX reply\");\n            goto clean_exit;\n        }\n\n        /* Parse KEXDH_REPLY */\n        exchange_state->s = exchange_state->s_packet + 1;\n\n        session->server_hostkey_len = _libssh2_ntohu32(exchange_state->s);\n        exchange_state->s += 4;\n\n        if (session->server_hostkey)\n            LIBSSH2_FREE(session, session->server_hostkey);\n\n        session->server_hostkey =\n            LIBSSH2_ALLOC(session, session->server_hostkey_len);\n        if (!session->server_hostkey) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Unable to allocate memory for a copy \"\n                                 \"of the host key\");\n            goto clean_exit;\n        }\n        memcpy(session->server_hostkey, exchange_state->s,\n               session->server_hostkey_len);\n        exchange_state->s += session->server_hostkey_len;\n\n#if LIBSSH2_MD5\n        {\n            libssh2_md5_ctx fingerprint_ctx;\n\n            if (libssh2_md5_init(&fingerprint_ctx)) {\n                libssh2_md5_update(fingerprint_ctx, session->server_hostkey,\n                                   session->server_hostkey_len);\n                libssh2_md5_final(fingerprint_ctx,\n                                  session->server_hostkey_md5);\n                session->server_hostkey_md5_valid = TRUE;\n            }\n            else {\n                session->server_hostkey_md5_valid = FALSE;\n            }\n        }\n#ifdef LIBSSH2DEBUG\n        {\n            char fingerprint[50], *fprint = fingerprint;\n            int i;\n            for(i = 0; i < 16; i++, fprint += 3) {\n                snprintf(fprint, 4, \"%02x:\", session->server_hostkey_md5[i]);\n            }\n            *(--fprint) = '\\0';\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Server's MD5 Fingerprint: %s\", fingerprint);\n        }\n#endif /* LIBSSH2DEBUG */\n#endif /* ! LIBSSH2_MD5 */\n\n        {\n            libssh2_sha1_ctx fingerprint_ctx;\n\n            if (libssh2_sha1_init(&fingerprint_ctx)) {\n                libssh2_sha1_update(fingerprint_ctx, session->server_hostkey,\n                                    session->server_hostkey_len);\n                libssh2_sha1_final(fingerprint_ctx,\n                                   session->server_hostkey_sha1);\n                session->server_hostkey_sha1_valid = TRUE;\n            }\n            else {\n                session->server_hostkey_sha1_valid = FALSE;\n            }\n        }\n#ifdef LIBSSH2DEBUG\n        {\n            char fingerprint[64], *fprint = fingerprint;\n            int i;\n\n            for(i = 0; i < 20; i++, fprint += 3) {\n                snprintf(fprint, 4, \"%02x:\", session->server_hostkey_sha1[i]);\n            }\n            *(--fprint) = '\\0';\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Server's SHA1 Fingerprint: %s\", fingerprint);\n        }\n#endif /* LIBSSH2DEBUG */\n\n        if (session->hostkey->init(session, session->server_hostkey,\n                                   session->server_hostkey_len,\n                                   &session->server_hostkey_abstract)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT,\n                                 \"Unable to initialize hostkey importer\");\n            goto clean_exit;\n        }\n\n        exchange_state->f_value_len = _libssh2_ntohu32(exchange_state->s);\n        exchange_state->s += 4;\n        exchange_state->f_value = exchange_state->s;\n        exchange_state->s += exchange_state->f_value_len;\n        _libssh2_bn_from_bin(exchange_state->f, exchange_state->f_value_len,\n                             exchange_state->f_value);\n\n        exchange_state->h_sig_len = _libssh2_ntohu32(exchange_state->s);\n        exchange_state->s += 4;\n        exchange_state->h_sig = exchange_state->s;\n\n        /* Compute the shared secret */\n        _libssh2_bn_mod_exp(exchange_state->k, exchange_state->f,\n                            exchange_state->x, p, exchange_state->ctx);\n        exchange_state->k_value_len = _libssh2_bn_bytes(exchange_state->k) + 5;\n        if (_libssh2_bn_bits(exchange_state->k) % 8) {\n            /* don't need leading 00 */\n            exchange_state->k_value_len--;\n        }\n        exchange_state->k_value =\n            LIBSSH2_ALLOC(session, exchange_state->k_value_len);\n        if (!exchange_state->k_value) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Unable to allocate buffer for K\");\n            goto clean_exit;\n        }\n        _libssh2_htonu32(exchange_state->k_value,\n                         exchange_state->k_value_len - 4);\n        if (_libssh2_bn_bits(exchange_state->k) % 8) {\n            _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 4);\n        } else {\n            exchange_state->k_value[4] = 0;\n            _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 5);\n        }\n\n        exchange_state->exchange_hash = (void*)&exchange_hash_ctx;\n        libssh2_sha256_init(&exchange_hash_ctx);\n\n        if (session->local.banner) {\n            _libssh2_htonu32(exchange_state->h_sig_comp,\n                             strlen((char *) session->local.banner) - 2);\n            libssh2_sha256_update(exchange_hash_ctx,\n                                  exchange_state->h_sig_comp, 4);\n            libssh2_sha256_update(exchange_hash_ctx,\n                                  (char *) session->local.banner,\n                                  strlen((char *) session->local.banner) - 2);\n        } else {\n            _libssh2_htonu32(exchange_state->h_sig_comp,\n                             sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1);\n            libssh2_sha256_update(exchange_hash_ctx,\n                                  exchange_state->h_sig_comp, 4);\n            libssh2_sha256_update(exchange_hash_ctx,\n                                  LIBSSH2_SSH_DEFAULT_BANNER,\n                                  sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1);\n        }\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         strlen((char *) session->remote.banner));\n        libssh2_sha256_update(exchange_hash_ctx,\n                              exchange_state->h_sig_comp, 4);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              session->remote.banner,\n                              strlen((char *) session->remote.banner));\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         session->local.kexinit_len);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              exchange_state->h_sig_comp, 4);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              session->local.kexinit,\n                              session->local.kexinit_len);\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         session->remote.kexinit_len);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              exchange_state->h_sig_comp, 4);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              session->remote.kexinit,\n                              session->remote.kexinit_len);\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         session->server_hostkey_len);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              exchange_state->h_sig_comp, 4);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              session->server_hostkey,\n                              session->server_hostkey_len);\n\n        if (packet_type_init == SSH_MSG_KEX_DH_GEX_INIT) {\n            /* diffie-hellman-group-exchange hashes additional fields */\n#ifdef LIBSSH2_DH_GEX_NEW\n            _libssh2_htonu32(exchange_state->h_sig_comp,\n                             LIBSSH2_DH_GEX_MINGROUP);\n            _libssh2_htonu32(exchange_state->h_sig_comp + 4,\n                             LIBSSH2_DH_GEX_OPTGROUP);\n            _libssh2_htonu32(exchange_state->h_sig_comp + 8,\n                             LIBSSH2_DH_GEX_MAXGROUP);\n            libssh2_sha256_update(exchange_hash_ctx,\n                                  exchange_state->h_sig_comp, 12);\n#else\n            _libssh2_htonu32(exchange_state->h_sig_comp,\n                             LIBSSH2_DH_GEX_OPTGROUP);\n            libssh2_sha256_update(exchange_hash_ctx,\n                                  exchange_state->h_sig_comp, 4);\n#endif\n        }\n\n        if (midhash) {\n            libssh2_sha256_update(exchange_hash_ctx, midhash,\n                                  midhash_len);\n        }\n\n        libssh2_sha256_update(exchange_hash_ctx,\n                              exchange_state->e_packet + 1,\n                              exchange_state->e_packet_len - 1);\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         exchange_state->f_value_len);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              exchange_state->h_sig_comp, 4);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              exchange_state->f_value,\n                              exchange_state->f_value_len);\n\n        libssh2_sha256_update(exchange_hash_ctx,\n                              exchange_state->k_value,\n                              exchange_state->k_value_len);\n\n        libssh2_sha256_final(exchange_hash_ctx,\n                             exchange_state->h_sig_comp);\n\n        if (session->hostkey->\n            sig_verify(session, exchange_state->h_sig,\n                       exchange_state->h_sig_len, exchange_state->h_sig_comp,\n                       SHA256_DIGEST_LENGTH, &session->server_hostkey_abstract)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_SIGN,\n                                 \"Unable to verify hostkey signature\");\n            goto clean_exit;\n        }\n\n\n\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sending NEWKEYS message\");\n        exchange_state->c = SSH_MSG_NEWKEYS;\n\n        exchange_state->state = libssh2_NB_state_sent2;\n    }\n\n    if (exchange_state->state == libssh2_NB_state_sent2) {\n        rc = _libssh2_transport_send(session, &exchange_state->c, 1, NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc) {\n            ret = _libssh2_error(session, rc, \"Unable to send NEWKEYS message\");\n            goto clean_exit;\n        }\n\n        exchange_state->state = libssh2_NB_state_sent3;\n    }\n\n    if (exchange_state->state == libssh2_NB_state_sent3) {\n        rc = _libssh2_packet_require(session, SSH_MSG_NEWKEYS,\n                                     &exchange_state->tmp,\n                                     &exchange_state->tmp_len, 0, NULL, 0,\n                                     &exchange_state->req_state);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc) {\n            ret = _libssh2_error(session, rc, \"Timed out waiting for NEWKEYS\");\n            goto clean_exit;\n        }\n        /* The first key exchange has been performed,\n           switch to active crypt/comp/mac mode */\n        session->state |= LIBSSH2_STATE_NEWKEYS;\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Received NEWKEYS message\");\n\n        /* This will actually end up being just packet_type(1)\n           for this packet type anyway */\n        LIBSSH2_FREE(session, exchange_state->tmp);\n\n        if (!session->session_id) {\n            session->session_id = LIBSSH2_ALLOC(session, SHA256_DIGEST_LENGTH);\n            if (!session->session_id) {\n                ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                     \"Unable to allocate buffer for SHA digest\");\n                goto clean_exit;\n            }\n            memcpy(session->session_id, exchange_state->h_sig_comp,\n                   SHA256_DIGEST_LENGTH);\n            session->session_id_len = SHA256_DIGEST_LENGTH;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"session_id calculated\");\n        }\n\n        /* Cleanup any existing cipher */\n        if (session->local.crypt->dtor) {\n            session->local.crypt->dtor(session,\n                                       &session->local.crypt_abstract);\n        }\n\n        /* Calculate IV/Secret/Key for each direction */\n        if (session->local.crypt->init) {\n            unsigned char *iv = NULL, *secret = NULL;\n            int free_iv = 0, free_secret = 0;\n\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA256_HASH(iv,\n                                                          session->local.crypt->\n                                                          iv_len, \"A\");\n            if (!iv) {\n                ret = -1;\n                goto clean_exit;\n            }\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA256_HASH(secret,\n                                                          session->local.crypt->\n                                                          secret_len, \"C\");\n            if (!secret) {\n                LIBSSH2_FREE(session, iv);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            if (session->local.crypt->\n                init(session, session->local.crypt, iv, &free_iv, secret,\n                     &free_secret, 1, &session->local.crypt_abstract)) {\n                LIBSSH2_FREE(session, iv);\n                LIBSSH2_FREE(session, secret);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n\n            if (free_iv) {\n                memset(iv, 0, session->local.crypt->iv_len);\n                LIBSSH2_FREE(session, iv);\n            }\n\n            if (free_secret) {\n                memset(secret, 0, session->local.crypt->secret_len);\n                LIBSSH2_FREE(session, secret);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Client to Server IV and Key calculated\");\n\n        if (session->remote.crypt->dtor) {\n            /* Cleanup any existing cipher */\n            session->remote.crypt->dtor(session,\n                                        &session->remote.crypt_abstract);\n        }\n\n        if (session->remote.crypt->init) {\n            unsigned char *iv = NULL, *secret = NULL;\n            int free_iv = 0, free_secret = 0;\n\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA256_HASH(iv,\n                                                          session->remote.crypt->\n                                                          iv_len, \"B\");\n            if (!iv) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA256_HASH(secret,\n                                                          session->remote.crypt->\n                                                          secret_len, \"D\");\n            if (!secret) {\n                LIBSSH2_FREE(session, iv);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            if (session->remote.crypt->\n                init(session, session->remote.crypt, iv, &free_iv, secret,\n                     &free_secret, 0, &session->remote.crypt_abstract)) {\n                LIBSSH2_FREE(session, iv);\n                LIBSSH2_FREE(session, secret);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n\n            if (free_iv) {\n                memset(iv, 0, session->remote.crypt->iv_len);\n                LIBSSH2_FREE(session, iv);\n            }\n\n            if (free_secret) {\n                memset(secret, 0, session->remote.crypt->secret_len);\n                LIBSSH2_FREE(session, secret);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Server to Client IV and Key calculated\");\n\n        if (session->local.mac->dtor) {\n            session->local.mac->dtor(session, &session->local.mac_abstract);\n        }\n\n        if (session->local.mac->init) {\n            unsigned char *key = NULL;\n            int free_key = 0;\n\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA256_HASH(key,\n                                                          session->local.mac->\n                                                          key_len, \"E\");\n            if (!key) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            session->local.mac->init(session, key, &free_key,\n                                     &session->local.mac_abstract);\n\n            if (free_key) {\n                memset(key, 0, session->local.mac->key_len);\n                LIBSSH2_FREE(session, key);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Client to Server HMAC Key calculated\");\n\n        if (session->remote.mac->dtor) {\n            session->remote.mac->dtor(session, &session->remote.mac_abstract);\n        }\n\n        if (session->remote.mac->init) {\n            unsigned char *key = NULL;\n            int free_key = 0;\n\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA256_HASH(key,\n                                                          session->remote.mac->\n                                                          key_len, \"F\");\n            if (!key) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            session->remote.mac->init(session, key, &free_key,\n                                      &session->remote.mac_abstract);\n\n            if (free_key) {\n                memset(key, 0, session->remote.mac->key_len);\n                LIBSSH2_FREE(session, key);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Server to Client HMAC Key calculated\");\n\n        /* Initialize compression for each direction */\n\n        /* Cleanup any existing compression */\n        if (session->local.comp && session->local.comp->dtor) {\n            session->local.comp->dtor(session, 1,\n                                      &session->local.comp_abstract);\n        }\n\n        if (session->local.comp && session->local.comp->init) {\n            if (session->local.comp->init(session, 1,\n                                          &session->local.comp_abstract)) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Client to Server compression initialized\");\n\n        if (session->remote.comp && session->remote.comp->dtor) {\n            session->remote.comp->dtor(session, 0,\n                                       &session->remote.comp_abstract);\n        }\n\n        if (session->remote.comp && session->remote.comp->init) {\n            if (session->remote.comp->init(session, 0,\n                                           &session->remote.comp_abstract)) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Server to Client compression initialized\");\n\n    }\n\n  clean_exit:\n    _libssh2_bn_free(exchange_state->x);\n    exchange_state->x = NULL;\n    _libssh2_bn_free(exchange_state->e);\n    exchange_state->e = NULL;\n    _libssh2_bn_free(exchange_state->f);\n    exchange_state->f = NULL;\n    _libssh2_bn_free(exchange_state->k);\n    exchange_state->k = NULL;\n    _libssh2_bn_ctx_free(exchange_state->ctx);\n    exchange_state->ctx = NULL;\n\n    if (exchange_state->e_packet) {\n        LIBSSH2_FREE(session, exchange_state->e_packet);\n        exchange_state->e_packet = NULL;\n    }\n\n    if (exchange_state->s_packet) {\n        LIBSSH2_FREE(session, exchange_state->s_packet);\n        exchange_state->s_packet = NULL;\n    }\n\n    if (exchange_state->k_value) {\n        LIBSSH2_FREE(session, exchange_state->k_value);\n        exchange_state->k_value = NULL;\n    }\n\n    exchange_state->state = libssh2_NB_state_idle;\n\n    return ret;\n}\n\n\n\n/* kex_method_diffie_hellman_group1_sha1_key_exchange\n * Diffie-Hellman Group1 (Actually Group2) Key Exchange using SHA1\n */\nstatic int\nkex_method_diffie_hellman_group1_sha1_key_exchange(LIBSSH2_SESSION *session,\n                                                   key_exchange_state_low_t\n                                                   * key_state)\n{\n    static const unsigned char p_value[128] = {\n        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n        0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,\n        0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,\n        0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,\n        0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,\n        0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,\n        0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,\n        0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,\n        0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,\n        0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,\n        0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,\n        0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,\n        0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,\n        0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,\n        0x49, 0x28, 0x66, 0x51, 0xEC, 0xE6, 0x53, 0x81,\n        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\n    };\n\n    int ret;\n\n    if (key_state->state == libssh2_NB_state_idle) {\n        /* g == 2 */\n        key_state->p = _libssh2_bn_init_from_bin();      /* SSH2 defined value (p_value) */\n        key_state->g = _libssh2_bn_init();      /* SSH2 defined value (2) */\n\n        /* Initialize P and G */\n        _libssh2_bn_set_word(key_state->g, 2);\n        _libssh2_bn_from_bin(key_state->p, 128, p_value);\n\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Initiating Diffie-Hellman Group1 Key Exchange\");\n\n        key_state->state = libssh2_NB_state_created;\n    }\n    ret = diffie_hellman_sha1(session, key_state->g, key_state->p, 128,\n                              SSH_MSG_KEXDH_INIT, SSH_MSG_KEXDH_REPLY,\n                              NULL, 0, &key_state->exchange_state);\n    if (ret == LIBSSH2_ERROR_EAGAIN) {\n        return ret;\n    }\n\n    _libssh2_bn_free(key_state->p);\n    key_state->p = NULL;\n    _libssh2_bn_free(key_state->g);\n    key_state->g = NULL;\n    key_state->state = libssh2_NB_state_idle;\n\n    return ret;\n}\n\n\n\n/* kex_method_diffie_hellman_group14_sha1_key_exchange\n * Diffie-Hellman Group14 Key Exchange using SHA1\n */\nstatic int\nkex_method_diffie_hellman_group14_sha1_key_exchange(LIBSSH2_SESSION *session,\n                                                    key_exchange_state_low_t\n                                                    * key_state)\n{\n    static const unsigned char p_value[256] = {\n        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n        0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,\n        0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,\n        0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,\n        0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,\n        0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,\n        0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,\n        0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,\n        0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,\n        0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,\n        0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,\n        0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,\n        0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,\n        0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,\n        0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,\n        0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,\n        0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,\n        0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,\n        0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,\n        0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,\n        0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,\n        0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,\n        0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,\n        0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,\n        0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,\n        0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,\n        0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,\n        0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,\n        0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,\n        0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,\n        0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68,\n        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\n    };\n    int ret;\n\n    if (key_state->state == libssh2_NB_state_idle) {\n        key_state->p = _libssh2_bn_init_from_bin();      /* SSH2 defined value (p_value) */\n        key_state->g = _libssh2_bn_init();      /* SSH2 defined value (2) */\n\n        /* g == 2 */\n        /* Initialize P and G */\n        _libssh2_bn_set_word(key_state->g, 2);\n        _libssh2_bn_from_bin(key_state->p, 256, p_value);\n\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Initiating Diffie-Hellman Group14 Key Exchange\");\n\n        key_state->state = libssh2_NB_state_created;\n    }\n    ret = diffie_hellman_sha1(session, key_state->g, key_state->p,\n                              256, SSH_MSG_KEXDH_INIT, SSH_MSG_KEXDH_REPLY,\n                              NULL, 0, &key_state->exchange_state);\n    if (ret == LIBSSH2_ERROR_EAGAIN) {\n        return ret;\n    }\n\n    key_state->state = libssh2_NB_state_idle;\n    _libssh2_bn_free(key_state->p);\n    key_state->p = NULL;\n    _libssh2_bn_free(key_state->g);\n    key_state->g = NULL;\n\n    return ret;\n}\n\n\n\n/* kex_method_diffie_hellman_group_exchange_sha1_key_exchange\n * Diffie-Hellman Group Exchange Key Exchange using SHA1\n * Negotiates random(ish) group for secret derivation\n */\nstatic int\nkex_method_diffie_hellman_group_exchange_sha1_key_exchange\n(LIBSSH2_SESSION * session, key_exchange_state_low_t * key_state)\n{\n    unsigned long p_len, g_len;\n    int ret = 0;\n    int rc;\n\n    if (key_state->state == libssh2_NB_state_idle) {\n        key_state->p = _libssh2_bn_init_from_bin();\n        key_state->g = _libssh2_bn_init_from_bin();\n        /* Ask for a P and G pair */\n#ifdef LIBSSH2_DH_GEX_NEW\n        key_state->request[0] = SSH_MSG_KEX_DH_GEX_REQUEST;\n        _libssh2_htonu32(key_state->request + 1, LIBSSH2_DH_GEX_MINGROUP);\n        _libssh2_htonu32(key_state->request + 5, LIBSSH2_DH_GEX_OPTGROUP);\n        _libssh2_htonu32(key_state->request + 9, LIBSSH2_DH_GEX_MAXGROUP);\n        key_state->request_len = 13;\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Initiating Diffie-Hellman Group-Exchange (New Method)\");\n#else\n        key_state->request[0] = SSH_MSG_KEX_DH_GEX_REQUEST_OLD;\n        _libssh2_htonu32(key_state->request + 1, LIBSSH2_DH_GEX_OPTGROUP);\n        key_state->request_len = 5;\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Initiating Diffie-Hellman Group-Exchange (Old Method)\");\n#endif\n\n        key_state->state = libssh2_NB_state_created;\n    }\n\n    if (key_state->state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, key_state->request,\n                                     key_state->request_len, NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Unable to send Group Exchange Request\");\n            goto dh_gex_clean_exit;\n        }\n\n        key_state->state = libssh2_NB_state_sent;\n    }\n\n    if (key_state->state == libssh2_NB_state_sent) {\n        rc = _libssh2_packet_require(session, SSH_MSG_KEX_DH_GEX_GROUP,\n                                     &key_state->data, &key_state->data_len,\n                                     0, NULL, 0, &key_state->req_state);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Timeout waiting for GEX_GROUP reply\");\n            goto dh_gex_clean_exit;\n        }\n\n        key_state->state = libssh2_NB_state_sent1;\n    }\n\n    if (key_state->state == libssh2_NB_state_sent1) {\n        unsigned char *s = key_state->data + 1;\n        p_len = _libssh2_ntohu32(s);\n        s += 4;\n        _libssh2_bn_from_bin(key_state->p, p_len, s);\n        s += p_len;\n\n        g_len = _libssh2_ntohu32(s);\n        s += 4;\n        _libssh2_bn_from_bin(key_state->g, g_len, s);\n\n        ret = diffie_hellman_sha1(session, key_state->g, key_state->p, p_len,\n                                  SSH_MSG_KEX_DH_GEX_INIT,\n                                  SSH_MSG_KEX_DH_GEX_REPLY,\n                                  key_state->data + 1,\n                                  key_state->data_len - 1,\n                                  &key_state->exchange_state);\n        if (ret == LIBSSH2_ERROR_EAGAIN) {\n            return ret;\n        }\n\n        LIBSSH2_FREE(session, key_state->data);\n    }\n\n  dh_gex_clean_exit:\n    key_state->state = libssh2_NB_state_idle;\n    _libssh2_bn_free(key_state->g);\n    key_state->g = NULL;\n    _libssh2_bn_free(key_state->p);\n    key_state->p = NULL;\n\n    return ret;\n}\n\n\n\n/* kex_method_diffie_hellman_group_exchange_sha256_key_exchange\n * Diffie-Hellman Group Exchange Key Exchange using SHA256\n * Negotiates random(ish) group for secret derivation\n */\nstatic int\nkex_method_diffie_hellman_group_exchange_sha256_key_exchange\n(LIBSSH2_SESSION * session, key_exchange_state_low_t * key_state)\n{\n    unsigned long p_len, g_len;\n    int ret = 0;\n    int rc;\n\n    if (key_state->state == libssh2_NB_state_idle) {\n        key_state->p = _libssh2_bn_init();\n        key_state->g = _libssh2_bn_init();\n        /* Ask for a P and G pair */\n#ifdef LIBSSH2_DH_GEX_NEW\n        key_state->request[0] = SSH_MSG_KEX_DH_GEX_REQUEST;\n        _libssh2_htonu32(key_state->request + 1, LIBSSH2_DH_GEX_MINGROUP);\n        _libssh2_htonu32(key_state->request + 5, LIBSSH2_DH_GEX_OPTGROUP);\n        _libssh2_htonu32(key_state->request + 9, LIBSSH2_DH_GEX_MAXGROUP);\n        key_state->request_len = 13;\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Initiating Diffie-Hellman Group-Exchange (New Method SHA256)\");\n#else\n        key_state->request[0] = SSH_MSG_KEX_DH_GEX_REQUEST_OLD;\n        _libssh2_htonu32(key_state->request + 1, LIBSSH2_DH_GEX_OPTGROUP);\n        key_state->request_len = 5;\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Initiating Diffie-Hellman Group-Exchange (Old Method SHA256)\");\n#endif\n\n        key_state->state = libssh2_NB_state_created;\n    }\n\n    if (key_state->state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, key_state->request,\n                                     key_state->request_len, NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Unable to send Group Exchange Request SHA256\");\n            goto dh_gex_clean_exit;\n        }\n\n        key_state->state = libssh2_NB_state_sent;\n    }\n\n    if (key_state->state == libssh2_NB_state_sent) {\n        rc = _libssh2_packet_require(session, SSH_MSG_KEX_DH_GEX_GROUP,\n                                     &key_state->data, &key_state->data_len,\n                                     0, NULL, 0, &key_state->req_state);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Timeout waiting for GEX_GROUP reply SHA256\");\n            goto dh_gex_clean_exit;\n        }\n\n        key_state->state = libssh2_NB_state_sent1;\n    }\n\n    if (key_state->state == libssh2_NB_state_sent1) {\n        unsigned char *s = key_state->data + 1;\n        p_len = _libssh2_ntohu32(s);\n        s += 4;\n        _libssh2_bn_from_bin(key_state->p, p_len, s);\n        s += p_len;\n\n        g_len = _libssh2_ntohu32(s);\n        s += 4;\n        _libssh2_bn_from_bin(key_state->g, g_len, s);\n\n        ret = diffie_hellman_sha256(session, key_state->g, key_state->p, p_len,\n                                    SSH_MSG_KEX_DH_GEX_INIT,\n                                    SSH_MSG_KEX_DH_GEX_REPLY,\n                                    key_state->data + 1,\n                                    key_state->data_len - 1,\n                                    &key_state->exchange_state);\n        if (ret == LIBSSH2_ERROR_EAGAIN) {\n            return ret;\n        }\n\n        LIBSSH2_FREE(session, key_state->data);\n    }\n\n  dh_gex_clean_exit:\n    key_state->state = libssh2_NB_state_idle;\n    _libssh2_bn_free(key_state->g);\n    key_state->g = NULL;\n    _libssh2_bn_free(key_state->p);\n    key_state->p = NULL;\n\n    return ret;\n}\n\n\n#define LIBSSH2_KEX_METHOD_FLAG_REQ_ENC_HOSTKEY     0x0001\n#define LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY    0x0002\n\nstatic const LIBSSH2_KEX_METHOD kex_method_diffie_helman_group1_sha1 = {\n    \"diffie-hellman-group1-sha1\",\n    kex_method_diffie_hellman_group1_sha1_key_exchange,\n    LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY,\n};\n\nstatic const LIBSSH2_KEX_METHOD kex_method_diffie_helman_group14_sha1 = {\n    \"diffie-hellman-group14-sha1\",\n    kex_method_diffie_hellman_group14_sha1_key_exchange,\n    LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY,\n};\n\nstatic const LIBSSH2_KEX_METHOD\nkex_method_diffie_helman_group_exchange_sha1 = {\n    \"diffie-hellman-group-exchange-sha1\",\n    kex_method_diffie_hellman_group_exchange_sha1_key_exchange,\n    LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY,\n};\n\nstatic const LIBSSH2_KEX_METHOD\nkex_method_diffie_helman_group_exchange_sha256 = {\n    \"diffie-hellman-group-exchange-sha256\",\n    kex_method_diffie_hellman_group_exchange_sha256_key_exchange,\n    LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY,\n};\n\nstatic const LIBSSH2_KEX_METHOD *libssh2_kex_methods[] = {\n    &kex_method_diffie_helman_group14_sha1,\n    &kex_method_diffie_helman_group1_sha1,\n    &kex_method_diffie_helman_group_exchange_sha1,\n    &kex_method_diffie_helman_group_exchange_sha256,\n    NULL\n};\n\ntypedef struct _LIBSSH2_COMMON_METHOD\n{\n    const char *name;\n} LIBSSH2_COMMON_METHOD;\n\n/* kex_method_strlen\n * Calculate the length of a particular method list's resulting string\n * Includes SUM(strlen() of each individual method plus 1 (for coma)) - 1 (because the last coma isn't used)\n * Another sign of bad coding practices gone mad.  Pretend you don't see this.\n */\nstatic size_t\nkex_method_strlen(LIBSSH2_COMMON_METHOD ** method)\n{\n    size_t len = 0;\n\n    if (!method || !*method) {\n        return 0;\n    }\n\n    while (*method && (*method)->name) {\n        len += strlen((*method)->name) + 1;\n        method++;\n    }\n\n    return len - 1;\n}\n\n\n\n/* kex_method_list\n * Generate formatted preference list in buf\n */\nstatic size_t\nkex_method_list(unsigned char *buf, size_t list_strlen,\n                LIBSSH2_COMMON_METHOD ** method)\n{\n    _libssh2_htonu32(buf, list_strlen);\n    buf += 4;\n\n    if (!method || !*method) {\n        return 4;\n    }\n\n    while (*method && (*method)->name) {\n        int mlen = strlen((*method)->name);\n        memcpy(buf, (*method)->name, mlen);\n        buf += mlen;\n        *(buf++) = ',';\n        method++;\n    }\n\n    return list_strlen + 4;\n}\n\n\n\n#define LIBSSH2_METHOD_PREFS_LEN(prefvar, defaultvar)           \\\n    ((prefvar) ? strlen(prefvar) :                              \\\n     kex_method_strlen((LIBSSH2_COMMON_METHOD**)(defaultvar)))\n\n#define LIBSSH2_METHOD_PREFS_STR(buf, prefvarlen, prefvar, defaultvar)  \\\n    if (prefvar) {                                                      \\\n        _libssh2_htonu32((buf), (prefvarlen));                          \\\n        buf += 4;                                                       \\\n        memcpy((buf), (prefvar), (prefvarlen));                         \\\n        buf += (prefvarlen);                                            \\\n    } else {                                                            \\\n        buf += kex_method_list((buf), (prefvarlen),                     \\\n                               (LIBSSH2_COMMON_METHOD**)(defaultvar));  \\\n    }\n\n/* kexinit\n * Send SSH_MSG_KEXINIT packet\n */\nstatic int kexinit(LIBSSH2_SESSION * session)\n{\n    /* 62 = packet_type(1) + cookie(16) + first_packet_follows(1) +\n       reserved(4) + length longs(40) */\n    size_t data_len = 62;\n    size_t kex_len, hostkey_len = 0;\n    size_t crypt_cs_len, crypt_sc_len;\n    size_t comp_cs_len, comp_sc_len;\n    size_t mac_cs_len, mac_sc_len;\n    size_t lang_cs_len, lang_sc_len;\n    unsigned char *data, *s;\n    int rc;\n\n    if (session->kexinit_state == libssh2_NB_state_idle) {\n        kex_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->kex_prefs, libssh2_kex_methods);\n        hostkey_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->hostkey_prefs,\n                                     libssh2_hostkey_methods());\n        crypt_cs_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->local.crypt_prefs,\n                                     libssh2_crypt_methods());\n        crypt_sc_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->remote.crypt_prefs,\n                                     libssh2_crypt_methods());\n        mac_cs_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->local.mac_prefs,\n                                     _libssh2_mac_methods());\n        mac_sc_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->remote.mac_prefs,\n                                     _libssh2_mac_methods());\n        comp_cs_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->local.comp_prefs,\n                                     _libssh2_comp_methods(session));\n        comp_sc_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->remote.comp_prefs,\n                                     _libssh2_comp_methods(session));\n        lang_cs_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->local.lang_prefs, NULL);\n        lang_sc_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->remote.lang_prefs, NULL);\n\n        data_len += kex_len + hostkey_len + crypt_cs_len + crypt_sc_len +\n            comp_cs_len + comp_sc_len + mac_cs_len + mac_sc_len +\n            lang_cs_len + lang_sc_len;\n\n        s = data = LIBSSH2_ALLOC(session, data_len);\n        if (!data) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory\");\n        }\n\n        *(s++) = SSH_MSG_KEXINIT;\n\n        _libssh2_random(s, 16);\n        s += 16;\n\n        /* Ennumerating through these lists twice is probably (certainly?)\n           inefficient from a CPU standpoint, but it saves multiple\n           malloc/realloc calls */\n        LIBSSH2_METHOD_PREFS_STR(s, kex_len, session->kex_prefs,\n                                 libssh2_kex_methods);\n        LIBSSH2_METHOD_PREFS_STR(s, hostkey_len, session->hostkey_prefs,\n                                 libssh2_hostkey_methods());\n        LIBSSH2_METHOD_PREFS_STR(s, crypt_cs_len, session->local.crypt_prefs,\n                                 libssh2_crypt_methods());\n        LIBSSH2_METHOD_PREFS_STR(s, crypt_sc_len, session->remote.crypt_prefs,\n                                 libssh2_crypt_methods());\n        LIBSSH2_METHOD_PREFS_STR(s, mac_cs_len, session->local.mac_prefs,\n                                 _libssh2_mac_methods());\n        LIBSSH2_METHOD_PREFS_STR(s, mac_sc_len, session->remote.mac_prefs,\n                                 _libssh2_mac_methods());\n        LIBSSH2_METHOD_PREFS_STR(s, comp_cs_len, session->local.comp_prefs,\n                                 _libssh2_comp_methods(session));\n        LIBSSH2_METHOD_PREFS_STR(s, comp_sc_len, session->remote.comp_prefs,\n                                 _libssh2_comp_methods(session));\n        LIBSSH2_METHOD_PREFS_STR(s, lang_cs_len, session->local.lang_prefs,\n                                 NULL);\n        LIBSSH2_METHOD_PREFS_STR(s, lang_sc_len, session->remote.lang_prefs,\n                                 NULL);\n\n        /* No optimistic KEX packet follows */\n        /* Deal with optimistic packets\n         * session->flags |= KEXINIT_OPTIMISTIC\n         * session->flags |= KEXINIT_METHODSMATCH\n         */\n        *(s++) = 0;\n\n        /* Reserved == 0 */\n        _libssh2_htonu32(s, 0);\n\n#ifdef LIBSSH2DEBUG\n        {\n            /* Funnily enough, they'll all \"appear\" to be '\\0' terminated */\n            unsigned char *p = data + 21;       /* type(1) + cookie(16) + len(4) */\n\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent KEX: %s\", p);\n            p += kex_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent HOSTKEY: %s\", p);\n            p += hostkey_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent CRYPT_CS: %s\", p);\n            p += crypt_cs_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent CRYPT_SC: %s\", p);\n            p += crypt_sc_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent MAC_CS: %s\", p);\n            p += mac_cs_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent MAC_SC: %s\", p);\n            p += mac_sc_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent COMP_CS: %s\", p);\n            p += comp_cs_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent COMP_SC: %s\", p);\n            p += comp_sc_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent LANG_CS: %s\", p);\n            p += lang_cs_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent LANG_SC: %s\", p);\n            p += lang_sc_len + 4;\n        }\n#endif /* LIBSSH2DEBUG */\n\n        session->kexinit_state = libssh2_NB_state_created;\n    } else {\n        data = session->kexinit_data;\n        data_len = session->kexinit_data_len;\n        /* zap the variables to ensure there is NOT a double free later */\n        session->kexinit_data = NULL;\n        session->kexinit_data_len = 0;\n    }\n\n    rc = _libssh2_transport_send(session, data, data_len, NULL, 0);\n    if (rc == LIBSSH2_ERROR_EAGAIN) {\n        session->kexinit_data = data;\n        session->kexinit_data_len = data_len;\n        return rc;\n    }\n    else if (rc) {\n        LIBSSH2_FREE(session, data);\n        session->kexinit_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Unable to send KEXINIT packet to remote host\");\n\n    }\n\n    if (session->local.kexinit) {\n        LIBSSH2_FREE(session, session->local.kexinit);\n    }\n\n    session->local.kexinit = data;\n    session->local.kexinit_len = data_len;\n\n    session->kexinit_state = libssh2_NB_state_idle;\n\n    return 0;\n}\n\n/* kex_agree_instr\n * Kex specific variant of strstr()\n * Needle must be preceed by BOL or ',', and followed by ',' or EOL\n */\nstatic unsigned char *\nkex_agree_instr(unsigned char *haystack, unsigned long haystack_len,\n                const unsigned char *needle, unsigned long needle_len)\n{\n    unsigned char *s;\n\n    /* Haystack too short to bother trying */\n    if (haystack_len < needle_len) {\n        return NULL;\n    }\n\n    /* Needle at start of haystack */\n    if ((strncmp((char *) haystack, (char *) needle, needle_len) == 0) &&\n        (needle_len == haystack_len || haystack[needle_len] == ',')) {\n        return haystack;\n    }\n\n    s = haystack;\n    /* Search until we run out of comas or we run out of haystack,\n       whichever comes first */\n    while ((s = (unsigned char *) strchr((char *) s, ','))\n           && ((haystack_len - (s - haystack)) > needle_len)) {\n        s++;\n        /* Needle at X position */\n        if ((strncmp((char *) s, (char *) needle, needle_len) == 0) &&\n            (((s - haystack) + needle_len) == haystack_len\n             || s[needle_len] == ',')) {\n            return s;\n        }\n    }\n\n    return NULL;\n}\n\n\n\n/* kex_get_method_by_name\n */\nstatic const LIBSSH2_COMMON_METHOD *\nkex_get_method_by_name(const char *name, size_t name_len,\n                       const LIBSSH2_COMMON_METHOD ** methodlist)\n{\n    while (*methodlist) {\n        if ((strlen((*methodlist)->name) == name_len) &&\n            (strncmp((*methodlist)->name, name, name_len) == 0)) {\n            return *methodlist;\n        }\n        methodlist++;\n    }\n    return NULL;\n}\n\n\n\n/* kex_agree_hostkey\n * Agree on a Hostkey which works with this kex\n */\nstatic int kex_agree_hostkey(LIBSSH2_SESSION * session,\n                             unsigned long kex_flags,\n                             unsigned char *hostkey, unsigned long hostkey_len)\n{\n    const LIBSSH2_HOSTKEY_METHOD **hostkeyp = libssh2_hostkey_methods();\n    unsigned char *s;\n\n    if (session->hostkey_prefs) {\n        s = (unsigned char *) session->hostkey_prefs;\n\n        while (s && *s) {\n            unsigned char *p = (unsigned char *) strchr((char *) s, ',');\n            size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s));\n            if (kex_agree_instr(hostkey, hostkey_len, s, method_len)) {\n                const LIBSSH2_HOSTKEY_METHOD *method =\n                    (const LIBSSH2_HOSTKEY_METHOD *)\n                    kex_get_method_by_name((char *) s, method_len,\n                                           (const LIBSSH2_COMMON_METHOD **)\n                                           hostkeyp);\n\n                if (!method) {\n                    /* Invalid method -- Should never be reached */\n                    return -1;\n                }\n\n                /* So far so good, but does it suit our purposes? (Encrypting\n                   vs Signing) */\n                if (((kex_flags & LIBSSH2_KEX_METHOD_FLAG_REQ_ENC_HOSTKEY) ==\n                     0) || (method->encrypt)) {\n                    /* Either this hostkey can do encryption or this kex just\n                       doesn't require it */\n                    if (((kex_flags & LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY)\n                         == 0) || (method->sig_verify)) {\n                        /* Either this hostkey can do signing or this kex just\n                           doesn't require it */\n                        session->hostkey = method;\n                        return 0;\n                    }\n                }\n            }\n\n            s = p ? p + 1 : NULL;\n        }\n        return -1;\n    }\n\n    while (hostkeyp && (*hostkeyp) && (*hostkeyp)->name) {\n        s = kex_agree_instr(hostkey, hostkey_len,\n                            (unsigned char *) (*hostkeyp)->name,\n                            strlen((*hostkeyp)->name));\n        if (s) {\n            /* So far so good, but does it suit our purposes? (Encrypting vs\n               Signing) */\n            if (((kex_flags & LIBSSH2_KEX_METHOD_FLAG_REQ_ENC_HOSTKEY) == 0) ||\n                ((*hostkeyp)->encrypt)) {\n                /* Either this hostkey can do encryption or this kex just\n                   doesn't require it */\n                if (((kex_flags & LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY) ==\n                     0) || ((*hostkeyp)->sig_verify)) {\n                    /* Either this hostkey can do signing or this kex just\n                       doesn't require it */\n                    session->hostkey = *hostkeyp;\n                    return 0;\n                }\n            }\n        }\n        hostkeyp++;\n    }\n\n    return -1;\n}\n\n\n\n/* kex_agree_kex_hostkey\n * Agree on a Key Exchange method and a hostkey encoding type\n */\nstatic int kex_agree_kex_hostkey(LIBSSH2_SESSION * session, unsigned char *kex,\n                                 unsigned long kex_len, unsigned char *hostkey,\n                                 unsigned long hostkey_len)\n{\n    const LIBSSH2_KEX_METHOD **kexp = libssh2_kex_methods;\n    unsigned char *s;\n\n    if (session->kex_prefs) {\n        s = (unsigned char *) session->kex_prefs;\n\n        while (s && *s) {\n            unsigned char *q, *p = (unsigned char *) strchr((char *) s, ',');\n            size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s));\n            if ((q = kex_agree_instr(kex, kex_len, s, method_len))) {\n                const LIBSSH2_KEX_METHOD *method = (const LIBSSH2_KEX_METHOD *)\n                    kex_get_method_by_name((char *) s, method_len,\n                                           (const LIBSSH2_COMMON_METHOD **)\n                                           kexp);\n\n                if (!method) {\n                    /* Invalid method -- Should never be reached */\n                    return -1;\n                }\n\n                /* We've agreed on a key exchange method,\n                 * Can we agree on a hostkey that works with this kex?\n                 */\n                if (kex_agree_hostkey(session, method->flags, hostkey,\n                                      hostkey_len) == 0) {\n                    session->kex = method;\n                    if (session->burn_optimistic_kexinit && (kex == q)) {\n                        /* Server sent an optimistic packet,\n                         * and client agrees with preference\n                         * cancel burning the first KEX_INIT packet that comes in */\n                        session->burn_optimistic_kexinit = 0;\n                    }\n                    return 0;\n                }\n            }\n\n            s = p ? p + 1 : NULL;\n        }\n        return -1;\n    }\n\n    while (*kexp && (*kexp)->name) {\n        s = kex_agree_instr(kex, kex_len,\n                            (unsigned char *) (*kexp)->name,\n                            strlen((*kexp)->name));\n        if (s) {\n            /* We've agreed on a key exchange method,\n             * Can we agree on a hostkey that works with this kex?\n             */\n            if (kex_agree_hostkey(session, (*kexp)->flags, hostkey,\n                                  hostkey_len) == 0) {\n                session->kex = *kexp;\n                if (session->burn_optimistic_kexinit && (kex == s)) {\n                    /* Server sent an optimistic packet,\n                     * and client agrees with preference\n                     * cancel burning the first KEX_INIT packet that comes in */\n                    session->burn_optimistic_kexinit = 0;\n                }\n                return 0;\n            }\n        }\n        kexp++;\n    }\n    return -1;\n}\n\n\n\n/* kex_agree_crypt\n * Agree on a cipher algo\n */\nstatic int kex_agree_crypt(LIBSSH2_SESSION * session,\n                           libssh2_endpoint_data *endpoint,\n                           unsigned char *crypt,\n                           unsigned long crypt_len)\n{\n    const LIBSSH2_CRYPT_METHOD **cryptp = libssh2_crypt_methods();\n    unsigned char *s;\n\n    (void) session;\n\n    if (endpoint->crypt_prefs) {\n        s = (unsigned char *) endpoint->crypt_prefs;\n\n        while (s && *s) {\n            unsigned char *p = (unsigned char *) strchr((char *) s, ',');\n            size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s));\n\n            if (kex_agree_instr(crypt, crypt_len, s, method_len)) {\n                const LIBSSH2_CRYPT_METHOD *method =\n                    (const LIBSSH2_CRYPT_METHOD *)\n                    kex_get_method_by_name((char *) s, method_len,\n                                           (const LIBSSH2_COMMON_METHOD **)\n                                           cryptp);\n\n                if (!method) {\n                    /* Invalid method -- Should never be reached */\n                    return -1;\n                }\n\n                endpoint->crypt = method;\n                return 0;\n            }\n\n            s = p ? p + 1 : NULL;\n        }\n        return -1;\n    }\n\n    while (*cryptp && (*cryptp)->name) {\n        s = kex_agree_instr(crypt, crypt_len,\n                            (unsigned char *) (*cryptp)->name,\n                            strlen((*cryptp)->name));\n        if (s) {\n            endpoint->crypt = *cryptp;\n            return 0;\n        }\n        cryptp++;\n    }\n\n    return -1;\n}\n\n\n\n/* kex_agree_mac\n * Agree on a message authentication hash\n */\nstatic int kex_agree_mac(LIBSSH2_SESSION * session,\n                         libssh2_endpoint_data * endpoint, unsigned char *mac,\n                         unsigned long mac_len)\n{\n    const LIBSSH2_MAC_METHOD **macp = _libssh2_mac_methods();\n    unsigned char *s;\n    (void) session;\n\n    if (endpoint->mac_prefs) {\n        s = (unsigned char *) endpoint->mac_prefs;\n\n        while (s && *s) {\n            unsigned char *p = (unsigned char *) strchr((char *) s, ',');\n            size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s));\n\n            if (kex_agree_instr(mac, mac_len, s, method_len)) {\n                const LIBSSH2_MAC_METHOD *method = (const LIBSSH2_MAC_METHOD *)\n                    kex_get_method_by_name((char *) s, method_len,\n                                           (const LIBSSH2_COMMON_METHOD **)\n                                           macp);\n\n                if (!method) {\n                    /* Invalid method -- Should never be reached */\n                    return -1;\n                }\n\n                endpoint->mac = method;\n                return 0;\n            }\n\n            s = p ? p + 1 : NULL;\n        }\n        return -1;\n    }\n\n    while (*macp && (*macp)->name) {\n        s = kex_agree_instr(mac, mac_len, (unsigned char *) (*macp)->name,\n                            strlen((*macp)->name));\n        if (s) {\n            endpoint->mac = *macp;\n            return 0;\n        }\n        macp++;\n    }\n\n    return -1;\n}\n\n\n\n/* kex_agree_comp\n * Agree on a compression scheme\n */\nstatic int kex_agree_comp(LIBSSH2_SESSION *session,\n                          libssh2_endpoint_data *endpoint, unsigned char *comp,\n                          unsigned long comp_len)\n{\n    const LIBSSH2_COMP_METHOD **compp = _libssh2_comp_methods(session);\n    unsigned char *s;\n    (void) session;\n\n    if (endpoint->comp_prefs) {\n        s = (unsigned char *) endpoint->comp_prefs;\n\n        while (s && *s) {\n            unsigned char *p = (unsigned char *) strchr((char *) s, ',');\n            size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s));\n\n            if (kex_agree_instr(comp, comp_len, s, method_len)) {\n                const LIBSSH2_COMP_METHOD *method =\n                    (const LIBSSH2_COMP_METHOD *)\n                    kex_get_method_by_name((char *) s, method_len,\n                                           (const LIBSSH2_COMMON_METHOD **)\n                                           compp);\n\n                if (!method) {\n                    /* Invalid method -- Should never be reached */\n                    return -1;\n                }\n\n                endpoint->comp = method;\n                return 0;\n            }\n\n            s = p ? p + 1 : NULL;\n        }\n        return -1;\n    }\n\n    while (*compp && (*compp)->name) {\n        s = kex_agree_instr(comp, comp_len, (unsigned char *) (*compp)->name,\n                            strlen((*compp)->name));\n        if (s) {\n            endpoint->comp = *compp;\n            return 0;\n        }\n        compp++;\n    }\n\n    return -1;\n}\n\n\n\n/* TODO: When in server mode we need to turn this logic on its head\n * The Client gets to make the final call on \"agreed methods\"\n */\n\n/*\n * kex_string_pair() extracts a string from the packet and makes sure it fits\n * within the given packet.\n */\nstatic int kex_string_pair(unsigned char **sp,   /* parsing position */\n                           unsigned char *data,  /* start pointer to packet */\n                           size_t data_len,      /* size of total packet */\n                           size_t *lenp,         /* length of the string */\n                           unsigned char **strp) /* pointer to string start */\n{\n    unsigned char *s = *sp;\n    *lenp = _libssh2_ntohu32(s);\n\n    /* the length of the string must fit within the current pointer and the\n       end of the packet */\n    if (*lenp > (data_len - (s - data) -4))\n        return 1;\n    *strp = s + 4;\n    s += 4 + *lenp;\n\n    *sp = s;\n    return 0;\n}\n\n/* kex_agree_methods\n * Decide which specific method to use of the methods offered by each party\n */\nstatic int kex_agree_methods(LIBSSH2_SESSION * session, unsigned char *data,\n                             unsigned data_len)\n{\n    unsigned char *kex, *hostkey, *crypt_cs, *crypt_sc, *comp_cs, *comp_sc,\n        *mac_cs, *mac_sc;\n    size_t kex_len, hostkey_len, crypt_cs_len, crypt_sc_len, comp_cs_len;\n    size_t comp_sc_len, mac_cs_len, mac_sc_len;\n    unsigned char *s = data;\n\n    /* Skip packet_type, we know it already */\n    s++;\n\n    /* Skip cookie, don't worry, it's preserved in the kexinit field */\n    s += 16;\n\n    /* Locate each string */\n    if(kex_string_pair(&s, data, data_len, &kex_len, &kex))\n        return -1;\n    if(kex_string_pair(&s, data, data_len, &hostkey_len, &hostkey))\n        return -1;\n    if(kex_string_pair(&s, data, data_len, &crypt_cs_len, &crypt_cs))\n        return -1;\n    if(kex_string_pair(&s, data, data_len, &crypt_sc_len, &crypt_sc))\n        return -1;\n    if(kex_string_pair(&s, data, data_len, &mac_cs_len, &mac_cs))\n        return -1;\n    if(kex_string_pair(&s, data, data_len, &mac_sc_len, &mac_sc))\n        return -1;\n    if(kex_string_pair(&s, data, data_len, &comp_cs_len, &comp_cs))\n        return -1;\n    if(kex_string_pair(&s, data, data_len, &comp_sc_len, &comp_sc))\n        return -1;\n\n    /* If the server sent an optimistic packet, assume that it guessed wrong.\n     * If the guess is determined to be right (by kex_agree_kex_hostkey)\n     * This flag will be reset to zero so that it's not ignored */\n    session->burn_optimistic_kexinit = *(s++);\n    /* Next uint32 in packet is all zeros (reserved) */\n\n    if (data_len < (unsigned) (s - data))\n        return -1;              /* short packet */\n\n    if (kex_agree_kex_hostkey(session, kex, kex_len, hostkey, hostkey_len)) {\n        return -1;\n    }\n\n    if (kex_agree_crypt(session, &session->local, crypt_cs, crypt_cs_len)\n        || kex_agree_crypt(session, &session->remote, crypt_sc, crypt_sc_len)) {\n        return -1;\n    }\n\n    if (kex_agree_mac(session, &session->local, mac_cs, mac_cs_len) ||\n        kex_agree_mac(session, &session->remote, mac_sc, mac_sc_len)) {\n        return -1;\n    }\n\n    if (kex_agree_comp(session, &session->local, comp_cs, comp_cs_len) ||\n        kex_agree_comp(session, &session->remote, comp_sc, comp_sc_len)) {\n        return -1;\n    }\n\n#if 0\n    if (libssh2_kex_agree_lang(session, &session->local, lang_cs, lang_cs_len)\n        || libssh2_kex_agree_lang(session, &session->remote, lang_sc,\n                                  lang_sc_len)) {\n        return -1;\n    }\n#endif\n\n    _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Agreed on KEX method: %s\",\n                   session->kex->name);\n    _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Agreed on HOSTKEY method: %s\",\n                   session->hostkey->name);\n    _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Agreed on CRYPT_CS method: %s\",\n                   session->local.crypt->name);\n    _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Agreed on CRYPT_SC method: %s\",\n                   session->remote.crypt->name);\n    _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Agreed on MAC_CS method: %s\",\n                   session->local.mac->name);\n    _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Agreed on MAC_SC method: %s\",\n                   session->remote.mac->name);\n    _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Agreed on COMP_CS method: %s\",\n                   session->local.comp->name);\n    _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Agreed on COMP_SC method: %s\",\n                   session->remote.comp->name);\n\n    return 0;\n}\n\n\n\n/* _libssh2_kex_exchange\n * Exchange keys\n * Returns 0 on success, non-zero on failure\n *\n * Returns some errors without _libssh2_error()\n */\nint\n_libssh2_kex_exchange(LIBSSH2_SESSION * session, int reexchange,\n                      key_exchange_state_t * key_state)\n{\n    int rc = 0;\n    int retcode;\n\n    session->state |= LIBSSH2_STATE_KEX_ACTIVE;\n\n    if (key_state->state == libssh2_NB_state_idle) {\n        /* Prevent loop in packet_add() */\n        session->state |= LIBSSH2_STATE_EXCHANGING_KEYS;\n\n        if (reexchange) {\n            session->kex = NULL;\n\n            if (session->hostkey && session->hostkey->dtor) {\n                session->hostkey->dtor(session,\n                                       &session->server_hostkey_abstract);\n            }\n            session->hostkey = NULL;\n        }\n\n        key_state->state = libssh2_NB_state_created;\n    }\n\n    if (!session->kex || !session->hostkey) {\n        if (key_state->state == libssh2_NB_state_created) {\n            /* Preserve in case of failure */\n            key_state->oldlocal = session->local.kexinit;\n            key_state->oldlocal_len = session->local.kexinit_len;\n\n            session->local.kexinit = NULL;\n\n            key_state->state = libssh2_NB_state_sent;\n        }\n\n        if (key_state->state == libssh2_NB_state_sent) {\n            retcode = kexinit(session);\n            if (retcode == LIBSSH2_ERROR_EAGAIN) {\n                session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;\n                return retcode;\n            } else if (retcode) {\n                session->local.kexinit = key_state->oldlocal;\n                session->local.kexinit_len = key_state->oldlocal_len;\n                key_state->state = libssh2_NB_state_idle;\n                session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;\n                session->state &= ~LIBSSH2_STATE_EXCHANGING_KEYS;\n                return -1;\n            }\n\n            key_state->state = libssh2_NB_state_sent1;\n        }\n\n        if (key_state->state == libssh2_NB_state_sent1) {\n            retcode =\n                _libssh2_packet_require(session, SSH_MSG_KEXINIT,\n                                        &key_state->data,\n                                        &key_state->data_len, 0, NULL, 0,\n                                        &key_state->req_state);\n            if (retcode == LIBSSH2_ERROR_EAGAIN) {\n                session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;\n                return retcode;\n            }\n            else if (retcode) {\n                if (session->local.kexinit) {\n                    LIBSSH2_FREE(session, session->local.kexinit);\n                }\n                session->local.kexinit = key_state->oldlocal;\n                session->local.kexinit_len = key_state->oldlocal_len;\n                key_state->state = libssh2_NB_state_idle;\n                session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;\n                session->state &= ~LIBSSH2_STATE_EXCHANGING_KEYS;\n                return -1;\n            }\n\n            if (session->remote.kexinit) {\n                LIBSSH2_FREE(session, session->remote.kexinit);\n            }\n            session->remote.kexinit = key_state->data;\n            session->remote.kexinit_len = key_state->data_len;\n\n            if (kex_agree_methods(session, key_state->data,\n                                  key_state->data_len))\n                rc = LIBSSH2_ERROR_KEX_FAILURE;\n\n            key_state->state = libssh2_NB_state_sent2;\n        }\n    } else {\n        key_state->state = libssh2_NB_state_sent2;\n    }\n\n    if (rc == 0 && session->kex) {\n        if (key_state->state == libssh2_NB_state_sent2) {\n            retcode = session->kex->exchange_keys(session,\n                                                  &key_state->key_state_low);\n            if (retcode == LIBSSH2_ERROR_EAGAIN) {\n                session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;\n                return retcode;\n            } else if (retcode) {\n                rc = _libssh2_error(session, LIBSSH2_ERROR_KEY_EXCHANGE_FAILURE,\n                                    \"Unrecoverable error exchanging keys\");\n            }\n        }\n    }\n\n    /* Done with kexinit buffers */\n    if (session->local.kexinit) {\n        LIBSSH2_FREE(session, session->local.kexinit);\n        session->local.kexinit = NULL;\n    }\n    if (session->remote.kexinit) {\n        LIBSSH2_FREE(session, session->remote.kexinit);\n        session->remote.kexinit = NULL;\n    }\n\n    session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;\n    session->state &= ~LIBSSH2_STATE_EXCHANGING_KEYS;\n\n    key_state->state = libssh2_NB_state_idle;\n\n    return rc;\n}\n\n\n\n/* libssh2_session_method_pref\n * Set preferred method\n */\nLIBSSH2_API int\nlibssh2_session_method_pref(LIBSSH2_SESSION * session, int method_type,\n                            const char *prefs)\n{\n    char **prefvar, *s, *newprefs;\n    int prefs_len = strlen(prefs);\n    const LIBSSH2_COMMON_METHOD **mlist;\n\n    switch (method_type) {\n    case LIBSSH2_METHOD_KEX:\n        prefvar = &session->kex_prefs;\n        mlist = (const LIBSSH2_COMMON_METHOD **) libssh2_kex_methods;\n        break;\n\n    case LIBSSH2_METHOD_HOSTKEY:\n        prefvar = &session->hostkey_prefs;\n        mlist = (const LIBSSH2_COMMON_METHOD **) libssh2_hostkey_methods();\n        break;\n\n    case LIBSSH2_METHOD_CRYPT_CS:\n        prefvar = &session->local.crypt_prefs;\n        mlist = (const LIBSSH2_COMMON_METHOD **) libssh2_crypt_methods();\n        break;\n\n    case LIBSSH2_METHOD_CRYPT_SC:\n        prefvar = &session->remote.crypt_prefs;\n        mlist = (const LIBSSH2_COMMON_METHOD **) libssh2_crypt_methods();\n        break;\n\n    case LIBSSH2_METHOD_MAC_CS:\n        prefvar = &session->local.mac_prefs;\n        mlist = (const LIBSSH2_COMMON_METHOD **) _libssh2_mac_methods();\n        break;\n\n    case LIBSSH2_METHOD_MAC_SC:\n        prefvar = &session->remote.mac_prefs;\n        mlist = (const LIBSSH2_COMMON_METHOD **) _libssh2_mac_methods();\n        break;\n\n    case LIBSSH2_METHOD_COMP_CS:\n        prefvar = &session->local.comp_prefs;\n        mlist = (const LIBSSH2_COMMON_METHOD **)\n            _libssh2_comp_methods(session);\n        break;\n\n    case LIBSSH2_METHOD_COMP_SC:\n        prefvar = &session->remote.comp_prefs;\n        mlist = (const LIBSSH2_COMMON_METHOD **)\n            _libssh2_comp_methods(session);\n        break;\n\n    case LIBSSH2_METHOD_LANG_CS:\n        prefvar = &session->local.lang_prefs;\n        mlist = NULL;\n        break;\n\n    case LIBSSH2_METHOD_LANG_SC:\n        prefvar = &session->remote.lang_prefs;\n        mlist = NULL;\n        break;\n\n    default:\n        return _libssh2_error(session, LIBSSH2_ERROR_INVAL,\n                              \"Invalid parameter specified for method_type\");\n    }\n\n    s = newprefs = LIBSSH2_ALLOC(session, prefs_len + 1);\n    if (!newprefs) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Error allocated space for method preferences\");\n    }\n    memcpy(s, prefs, prefs_len + 1);\n\n    while (s && *s && mlist) {\n        char *p = strchr(s, ',');\n        int method_len = p ? (p - s) : (int) strlen(s);\n\n        if (!kex_get_method_by_name(s, method_len, mlist)) {\n            /* Strip out unsupported method */\n            if (p) {\n                memcpy(s, p + 1, strlen(s) - method_len);\n            } else {\n                if (s > newprefs) {\n                    *(--s) = '\\0';\n                } else {\n                    *s = '\\0';\n                }\n            }\n        }\n\n        s = p ? (p + 1) : NULL;\n    }\n\n    if (strlen(newprefs) == 0) {\n        LIBSSH2_FREE(session, newprefs);\n        return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"The requested method(s) are not currently \"\n                              \"supported\");\n    }\n\n    if (*prefvar) {\n        LIBSSH2_FREE(session, *prefvar);\n    }\n    *prefvar = newprefs;\n\n    return 0;\n}\n\n/*\n * libssh2_session_supported_algs()\n * returns a number of returned algorithms (a positive number) on success,\n * a negative number on failure\n */\n\nLIBSSH2_API int libssh2_session_supported_algs(LIBSSH2_SESSION* session,\n                                               int method_type,\n                                               const char*** algs)\n{\n    unsigned int i;\n    unsigned int j;\n    unsigned int ialg;\n    const LIBSSH2_COMMON_METHOD **mlist;\n\n    /* to prevent coredumps due to dereferencing of NULL */\n    if (NULL == algs)\n        return _libssh2_error(session, LIBSSH2_ERROR_BAD_USE,\n                              \"algs must not be NULL\");\n\n    switch (method_type) {\n    case LIBSSH2_METHOD_KEX:\n        mlist = (const LIBSSH2_COMMON_METHOD **) libssh2_kex_methods;\n        break;\n\n    case LIBSSH2_METHOD_HOSTKEY:\n        mlist = (const LIBSSH2_COMMON_METHOD **) libssh2_hostkey_methods();\n        break;\n\n    case LIBSSH2_METHOD_CRYPT_CS:\n    case LIBSSH2_METHOD_CRYPT_SC:\n        mlist = (const LIBSSH2_COMMON_METHOD **) libssh2_crypt_methods();\n        break;\n\n    case LIBSSH2_METHOD_MAC_CS:\n    case LIBSSH2_METHOD_MAC_SC:\n        mlist = (const LIBSSH2_COMMON_METHOD **) _libssh2_mac_methods();\n        break;\n\n    case LIBSSH2_METHOD_COMP_CS:\n    case LIBSSH2_METHOD_COMP_SC:\n        mlist = (const LIBSSH2_COMMON_METHOD **) _libssh2_comp_methods(session);\n        break;\n\n    default:\n        return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Unknown method type\");\n    }  /* switch */\n\n    /* weird situation */\n    if (NULL==mlist)\n        return _libssh2_error(session, LIBSSH2_ERROR_INVAL,\n                              \"No algorithm found\");\n\n    /*\n      mlist is looped through twice. The first time to find the number od\n      supported algorithms (needed to allocate the proper size of array) and\n      the second time to actually copy the pointers.  Typically this function\n      will not be called often (typically at the beginning of a session) and\n      the number of algorithms (i.e. niumber of iterations in one loop) will\n      not be high (typically it will not exceed 20) for quite a long time.\n\n      So double looping really shouldn't be an issue and it is definitely a\n      better solution than reallocation several times.\n    */\n\n    /* count the number of supported algorithms */\n    for ( i=0, ialg=0; NULL!=mlist[i]; i++) {\n        /* do not count fields with NULL name */\n        if (mlist[i]->name)\n            ialg++;\n    }\n\n    /* weird situation, no algorithm found */\n    if (0==ialg)\n        return _libssh2_error(session, LIBSSH2_ERROR_INVAL,\n                              \"No algorithm found\");\n\n    /* allocate buffer */\n    *algs = (const char**) LIBSSH2_ALLOC(session, ialg*sizeof(const char*));\n    if ( NULL==*algs ) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Memory allocation failed\");\n    }\n    /* Past this point *algs must be deallocated in case of an error!! */\n\n    /* copy non-NULL pointers only */\n    for ( i=0, j=0; NULL!=mlist[i] && j<ialg; i++ ) {\n        if ( NULL==mlist[i]->name ){\n            /* maybe a weird situation but if it occurs, do not include NULL\n               pointers */\n            continue;\n        }\n\n        /* note that [] has higher priority than * (dereferencing) */\n        (*algs)[j++] = mlist[i]->name;\n    }\n\n    /* correct number of pointers copied? (test the code above) */\n    if ( j!=ialg ) {\n        /* deallocate buffer */\n        LIBSSH2_FREE(session, (void *)*algs);\n        *algs = NULL;\n\n        return _libssh2_error(session, LIBSSH2_ERROR_BAD_USE,\n                              \"Internal error\");\n    }\n\n    return ialg;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/knownhost.c",
    "content": "/*\n * Copyright (c) 2009-2014 by Daniel Stenberg\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include \"misc.h\"\n\nstruct known_host {\n    struct list_node node;\n    char *name;      /* points to the name or the hash (allocated) */\n    size_t name_len; /* needed for hashed data */\n    int port;        /* if non-zero, a specific port this key is for on this\n                        host */\n    int typemask;    /* plain, sha1, custom, ... */\n    char *salt;      /* points to binary salt (allocated) */\n    size_t salt_len; /* size of salt */\n    char *key;       /* the (allocated) associated key. This is kept base64\n                        encoded in memory. */\n    char *key_type_name; /* the (allocated) key type name */\n    size_t key_type_len; /* size of key_type_name */\n    char *comment;       /* the (allocated) optional comment text, may be\n                            NULL */\n    size_t comment_len;  /* the size of comment */\n\n    /* this is the struct we expose externally */\n    struct libssh2_knownhost external;\n};\n\nstruct _LIBSSH2_KNOWNHOSTS\n{\n    LIBSSH2_SESSION *session;  /* the session this \"belongs to\" */\n    struct list_head head;\n};\n\nstatic void free_host(LIBSSH2_SESSION *session, struct known_host *entry)\n{\n    if(entry) {\n        if(entry->comment)\n            LIBSSH2_FREE(session, entry->comment);\n        if (entry->key_type_name)\n            LIBSSH2_FREE(session, entry->key_type_name);\n        if(entry->key)\n            LIBSSH2_FREE(session, entry->key);\n        if(entry->salt)\n            LIBSSH2_FREE(session, entry->salt);\n        if(entry->name)\n            LIBSSH2_FREE(session, entry->name);\n        LIBSSH2_FREE(session, entry);\n    }\n}\n\n/*\n * libssh2_knownhost_init\n *\n * Init a collection of known hosts. Returns the pointer to a collection.\n *\n */\nLIBSSH2_API LIBSSH2_KNOWNHOSTS *\nlibssh2_knownhost_init(LIBSSH2_SESSION *session)\n{\n    LIBSSH2_KNOWNHOSTS *knh =\n        LIBSSH2_ALLOC(session, sizeof(struct _LIBSSH2_KNOWNHOSTS));\n\n    if(!knh) {\n        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                       \"Unable to allocate memory for known-hosts \"\n                       \"collection\");\n        return NULL;\n    }\n\n    knh->session = session;\n\n    _libssh2_list_init(&knh->head);\n\n    return knh;\n}\n\n#define KNOWNHOST_MAGIC 0xdeadcafe\n/*\n * knownhost_to_external()\n *\n * Copies data from the internal to the external representation struct.\n *\n */\nstatic struct libssh2_knownhost *knownhost_to_external(struct known_host *node)\n{\n    struct libssh2_knownhost *ext = &node->external;\n\n    ext->magic = KNOWNHOST_MAGIC;\n    ext->node = node;\n    ext->name = ((node->typemask & LIBSSH2_KNOWNHOST_TYPE_MASK) ==\n                 LIBSSH2_KNOWNHOST_TYPE_PLAIN)? node->name:NULL;\n    ext->key = node->key;\n    ext->typemask = node->typemask;\n\n    return ext;\n}\n\nstatic int\nknownhost_add(LIBSSH2_KNOWNHOSTS *hosts,\n              const char *host, const char *salt,\n              const char *key_type_name, size_t key_type_len,\n              const char *key, size_t keylen,\n              const char *comment, size_t commentlen,\n              int typemask, struct libssh2_knownhost **store)\n{\n    struct known_host *entry;\n    size_t hostlen = strlen(host);\n    int rc;\n    char *ptr;\n    unsigned int ptrlen;\n\n    /* make sure we have a key type set */\n    if(!(typemask & LIBSSH2_KNOWNHOST_KEY_MASK))\n        return _libssh2_error(hosts->session, LIBSSH2_ERROR_INVAL,\n                              \"No key type set\");\n\n    if(!(entry = LIBSSH2_CALLOC(hosts->session, sizeof(struct known_host))))\n        return _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                              \"Unable to allocate memory for known host \"\n                              \"entry\");\n\n    entry->typemask = typemask;\n\n    switch(entry->typemask  & LIBSSH2_KNOWNHOST_TYPE_MASK) {\n    case LIBSSH2_KNOWNHOST_TYPE_PLAIN:\n    case LIBSSH2_KNOWNHOST_TYPE_CUSTOM:\n        entry->name = LIBSSH2_ALLOC(hosts->session, hostlen+1);\n        if(!entry->name) {\n            rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                                \"Unable to allocate memory for host name\");\n            goto error;\n        }\n        memcpy(entry->name, host, hostlen+1);\n        entry->name_len = hostlen;\n        break;\n    case LIBSSH2_KNOWNHOST_TYPE_SHA1:\n        rc = libssh2_base64_decode(hosts->session, &ptr, &ptrlen,\n                                   host, hostlen);\n        if(rc)\n            goto error;\n        entry->name = ptr;\n        entry->name_len = ptrlen;\n\n        rc = libssh2_base64_decode(hosts->session, &ptr, &ptrlen,\n                                   salt, strlen(salt));\n        if(rc)\n            goto error;\n        entry->salt = ptr;\n        entry->salt_len = ptrlen;\n        break;\n    default:\n        rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                            \"Unknown host name type\");\n        goto error;\n    }\n\n    if(typemask & LIBSSH2_KNOWNHOST_KEYENC_BASE64) {\n        /* the provided key is base64 encoded already */\n        if(!keylen)\n            keylen = strlen(key);\n        entry->key = LIBSSH2_ALLOC(hosts->session, keylen+1);\n        if(!entry->key) {\n            rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                                \"Unable to allocate memory for key\");\n            goto error;\n        }\n        memcpy(entry->key, key, keylen+1);\n        entry->key[keylen]=0; /* force a terminating zero trailer */\n    }\n    else {\n        /* key is raw, we base64 encode it and store it as such */\n        size_t nlen = _libssh2_base64_encode(hosts->session, key, keylen,\n                                             &ptr);\n        if(!nlen) {\n            rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                                \"Unable to allocate memory for \"\n                                \"base64-encoded key\");\n            goto error;\n        }\n\n        entry->key = ptr;\n    }\n\n    if (key_type_name && ((typemask & LIBSSH2_KNOWNHOST_KEY_MASK) ==\n                          LIBSSH2_KNOWNHOST_KEY_UNKNOWN)) {\n        entry->key_type_name = LIBSSH2_ALLOC(hosts->session, key_type_len+1);\n        if (!entry->key_type_name) {\n            rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                                \"Unable to allocate memory for key type\");\n            goto error;\n        }\n        memcpy(entry->key_type_name, key_type_name, key_type_len);\n        entry->key_type_name[key_type_len]=0;\n        entry->key_type_len = key_type_len;\n    }\n\n    if (comment) {\n        entry->comment = LIBSSH2_ALLOC(hosts->session, commentlen+1);\n        if(!entry->comment) {\n            rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                                \"Unable to allocate memory for comment\");\n            goto error;\n        }\n        memcpy(entry->comment, comment, commentlen+1);\n        entry->comment[commentlen]=0; /* force a terminating zero trailer */\n        entry->comment_len = commentlen;\n    }\n    else {\n        entry->comment = NULL;\n    }\n\n    /* add this new host to the big list of known hosts */\n    _libssh2_list_add(&hosts->head, &entry->node);\n\n    if(store)\n        *store = knownhost_to_external(entry);\n\n    return LIBSSH2_ERROR_NONE;\n  error:\n    free_host(hosts->session, entry);\n    return rc;\n}\n\n/*\n * libssh2_knownhost_add\n *\n * Add a host and its associated key to the collection of known hosts.\n *\n * The 'type' argument specifies on what format the given host and keys are:\n *\n * plain  - ascii \"hostname.domain.tld\"\n * sha1   - SHA1(<salt> <host>) base64-encoded!\n * custom - another hash\n *\n * If 'sha1' is selected as type, the salt must be provided to the salt\n * argument. This too base64 encoded.\n *\n * The SHA-1 hash is what OpenSSH can be told to use in known_hosts files.  If\n * a custom type is used, salt is ignored and you must provide the host\n * pre-hashed when checking for it in the libssh2_knownhost_check() function.\n *\n * The keylen parameter may be omitted (zero) if the key is provided as a\n * NULL-terminated base64-encoded string.\n */\n\nLIBSSH2_API int\nlibssh2_knownhost_add(LIBSSH2_KNOWNHOSTS *hosts,\n                      const char *host, const char *salt,\n                      const char *key, size_t keylen,\n                      int typemask, struct libssh2_knownhost **store)\n{\n    return knownhost_add(hosts, host, salt, NULL, 0, key, keylen, NULL,\n                         0, typemask, store);\n}\n\n\n/*\n * libssh2_knownhost_addc\n *\n * Add a host and its associated key to the collection of known hosts.\n *\n * Takes a comment argument that may be NULL.  A NULL comment indicates\n * there is no comment and the entry will end directly after the key\n * when written out to a file.  An empty string \"\" comment will indicate an\n * empty comment which will cause a single space to be written after the key.\n *\n * The 'type' argument specifies on what format the given host and keys are:\n *\n * plain  - ascii \"hostname.domain.tld\"\n * sha1   - SHA1(<salt> <host>) base64-encoded!\n * custom - another hash\n *\n * If 'sha1' is selected as type, the salt must be provided to the salt\n * argument. This too base64 encoded.\n *\n * The SHA-1 hash is what OpenSSH can be told to use in known_hosts files.  If\n * a custom type is used, salt is ignored and you must provide the host\n * pre-hashed when checking for it in the libssh2_knownhost_check() function.\n *\n * The keylen parameter may be omitted (zero) if the key is provided as a\n * NULL-terminated base64-encoded string.\n */\n\nLIBSSH2_API int\nlibssh2_knownhost_addc(LIBSSH2_KNOWNHOSTS *hosts,\n                       const char *host, const char *salt,\n                       const char *key, size_t keylen,\n                       const char *comment, size_t commentlen,\n                       int typemask, struct libssh2_knownhost **store)\n{\n    return knownhost_add(hosts, host, salt, NULL, 0, key, keylen,\n                         comment, commentlen, typemask, store);\n}\n\n/*\n * knownhost_check\n *\n * Check a host and its associated key against the collection of known hosts.\n *\n * The typemask is the type/format of the given host name and key\n *\n * plain  - ascii \"hostname.domain.tld\"\n * sha1   - NOT SUPPORTED AS INPUT\n * custom - prehashed base64 encoded. Note that this cannot use any salts.\n *\n * Returns:\n *\n * LIBSSH2_KNOWNHOST_CHECK_FAILURE\n * LIBSSH2_KNOWNHOST_CHECK_NOTFOUND\n * LIBSSH2_KNOWNHOST_CHECK_MATCH\n * LIBSSH2_KNOWNHOST_CHECK_MISMATCH\n */\nstatic int\nknownhost_check(LIBSSH2_KNOWNHOSTS *hosts,\n                const char *hostp, int port,\n                const char *key, size_t keylen,\n                int typemask,\n                struct libssh2_knownhost **ext)\n{\n    struct known_host *node;\n    struct known_host *badkey = NULL;\n    int type = typemask & LIBSSH2_KNOWNHOST_TYPE_MASK;\n    char *keyalloc = NULL;\n    int rc = LIBSSH2_KNOWNHOST_CHECK_NOTFOUND;\n    char hostbuff[270]; /* most host names can't be longer than like 256 */\n    const char *host;\n    int numcheck; /* number of host combos to check */\n    int match = 0;\n\n    if(type == LIBSSH2_KNOWNHOST_TYPE_SHA1)\n        /* we can't work with a sha1 as given input */\n        return LIBSSH2_KNOWNHOST_CHECK_MISMATCH;\n\n    /* if a port number is given, check for a '[host]:port' first before the\n       plain 'host' */\n    if(port >= 0) {\n        int len = snprintf(hostbuff, sizeof(hostbuff), \"[%s]:%d\", hostp, port);\n        if (len < 0 || len >= (int)sizeof(hostbuff)) {\n            _libssh2_error(hosts->session,\n                           LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                           \"Known-host write buffer too small\");\n            return LIBSSH2_KNOWNHOST_CHECK_FAILURE;\n        }\n        host = hostbuff;\n        numcheck = 2; /* check both combos, start with this */\n    }\n    else {\n        host = hostp;\n        numcheck = 1; /* only check this host version */\n    }\n\n    if(!(typemask & LIBSSH2_KNOWNHOST_KEYENC_BASE64)) {\n        /* we got a raw key input, convert it to base64 for the checks below */\n        size_t nlen = _libssh2_base64_encode(hosts->session, key, keylen,\n                                             &keyalloc);\n        if(!nlen) {\n            _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate memory for base64-encoded \"\n                           \"key\");\n            return LIBSSH2_KNOWNHOST_CHECK_FAILURE;\n        }\n\n        /* make the key point to this */\n        key = keyalloc;\n    }\n\n    do {\n        node = _libssh2_list_first(&hosts->head);\n        while (node) {\n            switch(node->typemask & LIBSSH2_KNOWNHOST_TYPE_MASK) {\n            case LIBSSH2_KNOWNHOST_TYPE_PLAIN:\n                if(type == LIBSSH2_KNOWNHOST_TYPE_PLAIN)\n                    match = !strcmp(host, node->name);\n                break;\n            case LIBSSH2_KNOWNHOST_TYPE_CUSTOM:\n                if(type == LIBSSH2_KNOWNHOST_TYPE_CUSTOM)\n                    match = !strcmp(host, node->name);\n                break;\n            case LIBSSH2_KNOWNHOST_TYPE_SHA1:\n                if(type == LIBSSH2_KNOWNHOST_TYPE_PLAIN) {\n                    /* when we have the sha1 version stored, we can use a\n                       plain input to produce a hash to compare with the\n                       stored hash.\n                    */\n                    unsigned char hash[SHA_DIGEST_LENGTH];\n                    libssh2_hmac_ctx ctx;\n                    libssh2_hmac_ctx_init(ctx);\n\n                    if(SHA_DIGEST_LENGTH != node->name_len) {\n                        /* the name hash length must be the sha1 size or\n                           we can't match it */\n                        break;\n                    }\n                    libssh2_hmac_sha1_init(&ctx, (unsigned char *)node->salt,\n                                           node->salt_len);\n                    libssh2_hmac_update(ctx, (unsigned char *)host,\n                                        strlen(host));\n                    libssh2_hmac_final(ctx, hash);\n                    libssh2_hmac_cleanup(&ctx);\n\n                    if(!memcmp(hash, node->name, SHA_DIGEST_LENGTH))\n                        /* this is a node we're interested in */\n                        match = 1;\n                }\n                break;\n            default: /* unsupported type */\n                break;\n            }\n            if(match) {\n                int host_key_type = typemask & LIBSSH2_KNOWNHOST_KEY_MASK;\n                int known_key_type =\n                    node->typemask & LIBSSH2_KNOWNHOST_KEY_MASK;\n                /* match on key type as follows:\n                   - never match on an unknown key type\n                   - if key_type is set to zero, ignore it an match always\n                   - otherwise match when both key types are equal\n                */\n                if ( (host_key_type != LIBSSH2_KNOWNHOST_KEY_UNKNOWN ) &&\n                     ( (host_key_type == 0) ||\n                       (host_key_type == known_key_type) ) ) {\n                    /* host name and key type match, now compare the keys */\n                    if(!strcmp(key, node->key)) {\n                        /* they match! */\n                        if (ext)\n                            *ext = knownhost_to_external(node);\n                        badkey = NULL;\n                        rc = LIBSSH2_KNOWNHOST_CHECK_MATCH;\n                        break;\n                    }\n                    else {\n                        /* remember the first node that had a host match but a\n                           failed key match since we continue our search from\n                           here */\n                        if(!badkey)\n                            badkey = node;\n                    }\n                }\n                match = 0; /* don't count this as a match anymore */\n            }\n            node= _libssh2_list_next(&node->node);\n        }\n        host = hostp;\n    } while(!match && --numcheck);\n\n    if(badkey) {\n        /* key mismatch */\n        if (ext)\n            *ext = knownhost_to_external(badkey);\n        rc = LIBSSH2_KNOWNHOST_CHECK_MISMATCH;\n    }\n\n    if(keyalloc)\n        LIBSSH2_FREE(hosts->session, keyalloc);\n\n    return rc;\n}\n\n/*\n * libssh2_knownhost_check\n *\n * Check a host and its associated key against the collection of known hosts.\n *\n * The typemask is the type/format of the given host name and key\n *\n * plain  - ascii \"hostname.domain.tld\"\n * sha1   - NOT SUPPORTED AS INPUT\n * custom - prehashed base64 encoded. Note that this cannot use any salts.\n *\n * Returns:\n *\n * LIBSSH2_KNOWNHOST_CHECK_FAILURE\n * LIBSSH2_KNOWNHOST_CHECK_NOTFOUND\n * LIBSSH2_KNOWNHOST_CHECK_MATCH\n * LIBSSH2_KNOWNHOST_CHECK_MISMATCH\n */\nLIBSSH2_API int\nlibssh2_knownhost_check(LIBSSH2_KNOWNHOSTS *hosts,\n                        const char *hostp, const char *key, size_t keylen,\n                        int typemask,\n                        struct libssh2_knownhost **ext)\n{\n    return knownhost_check(hosts, hostp, -1, key, keylen,\n                           typemask, ext);\n}\n\n/*\n * libssh2_knownhost_checkp\n *\n * Check a host+port and its associated key against the collection of known\n * hosts.\n *\n * Note that if 'port' is specified as greater than zero, the check function\n * will be able to check for a dedicated key for this particular host+port\n * combo, and if 'port' is negative it only checks for the generic host key.\n *\n * The typemask is the type/format of the given host name and key\n *\n * plain  - ascii \"hostname.domain.tld\"\n * sha1   - NOT SUPPORTED AS INPUT\n * custom - prehashed base64 encoded. Note that this cannot use any salts.\n *\n * Returns:\n *\n * LIBSSH2_KNOWNHOST_CHECK_FAILURE\n * LIBSSH2_KNOWNHOST_CHECK_NOTFOUND\n * LIBSSH2_KNOWNHOST_CHECK_MATCH\n * LIBSSH2_KNOWNHOST_CHECK_MISMATCH\n */\nLIBSSH2_API int\nlibssh2_knownhost_checkp(LIBSSH2_KNOWNHOSTS *hosts,\n                         const char *hostp, int port,\n                         const char *key, size_t keylen,\n                         int typemask,\n                         struct libssh2_knownhost **ext)\n{\n    return knownhost_check(hosts, hostp, port, key, keylen,\n                           typemask, ext);\n}\n\n\n/*\n * libssh2_knownhost_del\n *\n * Remove a host from the collection of known hosts.\n *\n */\nLIBSSH2_API int\nlibssh2_knownhost_del(LIBSSH2_KNOWNHOSTS *hosts,\n                      struct libssh2_knownhost *entry)\n{\n    struct known_host *node;\n\n    /* check that this was retrieved the right way or get out */\n    if(!entry || (entry->magic != KNOWNHOST_MAGIC))\n        return _libssh2_error(hosts->session, LIBSSH2_ERROR_INVAL,\n                              \"Invalid host information\");\n\n    /* get the internal node pointer */\n    node = entry->node;\n\n    /* unlink from the list of all hosts */\n    _libssh2_list_remove(&node->node);\n\n    /* clear the struct now since the memory in which it is allocated is\n       about to be freed! */\n    memset(entry, 0, sizeof(struct libssh2_knownhost));\n\n    /* free all resources */\n    free_host(hosts->session, node);\n\n    return 0;\n}\n\n/*\n * libssh2_knownhost_free\n *\n * Free an entire collection of known hosts.\n *\n */\nLIBSSH2_API void\nlibssh2_knownhost_free(LIBSSH2_KNOWNHOSTS *hosts)\n{\n    struct known_host *node;\n    struct known_host *next;\n\n    for(node = _libssh2_list_first(&hosts->head); node; node = next) {\n        next = _libssh2_list_next(&node->node);\n        free_host(hosts->session, node);\n    }\n    LIBSSH2_FREE(hosts->session, hosts);\n}\n\n\n/* old style plain text: [name]([,][name])*\n\n   for the sake of simplicity, we add them as separate hosts with the same\n   key\n*/\nstatic int oldstyle_hostline(LIBSSH2_KNOWNHOSTS *hosts,\n                             const char *host, size_t hostlen,\n                             const char *key_type_name, size_t key_type_len,\n                             const char *key, size_t keylen, int key_type,\n                             const char *comment, size_t commentlen)\n{\n    int rc = 0;\n    size_t namelen = 0;\n    const char *name = host + hostlen;\n\n    if(hostlen < 1)\n        return _libssh2_error(hosts->session,\n                              LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Failed to parse known_hosts line \"\n                              \"(no host names)\");\n\n    while(name > host) {\n        --name;\n        ++namelen;\n\n        /* when we get the the start or see a comma coming up, add the host\n           name to the collection */\n        if((name == host) || (*(name-1) == ',')) {\n\n            char hostbuf[256];\n\n            /* make sure we don't overflow the buffer */\n            if(namelen >= sizeof(hostbuf)-1)\n                return _libssh2_error(hosts->session,\n                                      LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                                      \"Failed to parse known_hosts line \"\n                                      \"(unexpected length)\");\n\n            /* copy host name to the temp buffer and zero terminate */\n            memcpy(hostbuf, name, namelen);\n            hostbuf[namelen]=0;\n\n            rc = knownhost_add(hosts, hostbuf, NULL,\n                               key_type_name, key_type_len,\n                               key, keylen,\n                               comment, commentlen,\n                               key_type | LIBSSH2_KNOWNHOST_TYPE_PLAIN |\n                               LIBSSH2_KNOWNHOST_KEYENC_BASE64, NULL);\n            if(rc)\n                return rc;\n\n            if(name > host) {\n                namelen = 0;\n                --name; /* skip comma */\n            }\n        }\n    }\n\n    return rc;\n}\n\n/* |1|[salt]|[hash] */\nstatic int hashed_hostline(LIBSSH2_KNOWNHOSTS *hosts,\n                           const char *host, size_t hostlen,\n                           const char *key_type_name, size_t key_type_len,\n                           const char *key, size_t keylen, int key_type,\n                           const char *comment, size_t commentlen)\n{\n    const char *p;\n    char saltbuf[32];\n    char hostbuf[256];\n\n    const char *salt = &host[3]; /* skip the magic marker */\n    hostlen -= 3;    /* deduct the marker */\n\n    /* this is where the salt starts, find the end of it */\n    for(p = salt; *p && (*p != '|'); p++)\n        ;\n\n    if(*p=='|') {\n        const char *hash = NULL;\n        size_t saltlen = p - salt;\n        if(saltlen >= (sizeof(saltbuf)-1)) /* weird length */\n            return _libssh2_error(hosts->session,\n                                  LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                                  \"Failed to parse known_hosts line \"\n                                  \"(unexpectedly long salt)\");\n\n        memcpy(saltbuf, salt, saltlen);\n        saltbuf[saltlen] = 0; /* zero terminate */\n        salt = saltbuf; /* point to the stack based buffer */\n\n        hash = p+1; /* the host hash is after the separator */\n\n        /* now make the host point to the hash */\n        host = hash;\n        hostlen -= saltlen+1; /* deduct the salt and separator */\n\n        /* check that the lengths seem sensible */\n        if(hostlen >= sizeof(hostbuf)-1)\n            return _libssh2_error(hosts->session,\n                                  LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                                  \"Failed to parse known_hosts line \"\n                                  \"(unexpected length)\");\n\n        memcpy(hostbuf, host, hostlen);\n        hostbuf[hostlen]=0;\n\n        return knownhost_add(hosts, hostbuf, salt,\n                             key_type_name, key_type_len,\n                             key, keylen,\n                             comment, commentlen,\n                             key_type | LIBSSH2_KNOWNHOST_TYPE_SHA1 |\n                             LIBSSH2_KNOWNHOST_KEYENC_BASE64, NULL);\n    }\n    else\n        return 0; /* XXX: This should be an error, shouldn't it? */\n}\n\n/*\n * hostline()\n *\n * Parse a single known_host line pre-split into host and key.\n *\n * The key part may include an optional comment which will be parsed here\n * for ssh-rsa and ssh-dsa keys.  Comments in other key types aren't handled.\n *\n * The function assumes new-lines have already been removed from the arguments.\n */\nstatic int hostline(LIBSSH2_KNOWNHOSTS *hosts,\n                    const char *host, size_t hostlen,\n                    const char *key, size_t keylen)\n{\n    const char *comment = NULL;\n    const char *key_type_name = NULL;\n    size_t commentlen = 0;\n    size_t key_type_len = 0;\n    int key_type;\n\n    /* make some checks that the lengths seem sensible */\n    if(keylen < 20)\n        return _libssh2_error(hosts->session,\n                              LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Failed to parse known_hosts line \"\n                              \"(key too short)\");\n\n    switch(key[0]) {\n    case '0': case '1': case '2': case '3': case '4':\n    case '5': case '6': case '7': case '8': case '9':\n        key_type = LIBSSH2_KNOWNHOST_KEY_RSA1;\n\n        /* Note that the old-style keys (RSA1) aren't truly base64, but we\n         * claim it is for now since we can get away with strcmp()ing the\n         * entire anything anyway! We need to check and fix these to make them\n         * work properly.\n         */\n        break;\n\n    default:\n        key_type_name = key;\n        while (keylen && *key &&\n               (*key != ' ') && (*key != '\\t')) {\n            key++;\n            keylen--;\n        }\n        key_type_len = key - key_type_name;\n\n        if (!strncmp(key_type_name, \"ssh-dss\", key_type_len))\n            key_type = LIBSSH2_KNOWNHOST_KEY_SSHDSS;\n        else if (!strncmp(key_type_name, \"ssh-rsa\", key_type_len))\n            key_type = LIBSSH2_KNOWNHOST_KEY_SSHRSA;\n        else\n            key_type = LIBSSH2_KNOWNHOST_KEY_UNKNOWN;\n\n        /* skip whitespaces */\n        while((*key ==' ') || (*key == '\\t')) {\n            key++;\n            keylen--;\n        }\n\n        comment = key;\n        commentlen = keylen;\n\n        /* move over key */\n        while(commentlen && *comment &&\n              (*comment != ' ') && (*comment != '\\t')) {\n            comment++;\n            commentlen--;\n        }\n\n        /* reduce key by comment length */\n        keylen -= commentlen;\n\n        /* Distinguish empty comment (a space) from no comment (no space) */\n        if (commentlen == 0)\n            comment = NULL;\n\n        /* skip whitespaces */\n        while(commentlen && *comment &&\n              ((*comment ==' ') || (*comment == '\\t'))) {\n            comment++;\n            commentlen--;\n        }\n        break;\n    }\n\n    /* Figure out host format */\n    if((hostlen >2) && memcmp(host, \"|1|\", 3)) {\n        /* old style plain text: [name]([,][name])*\n\n           for the sake of simplicity, we add them as separate hosts with the\n           same key\n        */\n        return oldstyle_hostline(hosts, host, hostlen, key_type_name,\n                                 key_type_len, key, keylen, key_type,\n                                 comment, commentlen);\n    }\n    else {\n        /* |1|[salt]|[hash] */\n        return hashed_hostline(hosts, host, hostlen, key_type_name,\n                               key_type_len, key, keylen, key_type,\n                               comment, commentlen);\n    }\n}\n\n/*\n * libssh2_knownhost_readline()\n *\n * Pass in a line of a file of 'type'.\n *\n * LIBSSH2_KNOWNHOST_FILE_OPENSSH is the only supported type.\n *\n * OpenSSH line format:\n *\n * <host> <key>\n *\n * Where the two parts can be created like:\n *\n * <host> can be either\n * <name> or <hash>\n *\n * <name> consists of\n * [name] optionally followed by [,name] one or more times\n *\n * <hash> consists of\n * |1|<salt>|hash\n *\n * <key> can be one of:\n * [RSA bits] [e] [n as a decimal number]\n * 'ssh-dss' [base64-encoded-key]\n * 'ssh-rsa' [base64-encoded-key]\n *\n */\nLIBSSH2_API int\nlibssh2_knownhost_readline(LIBSSH2_KNOWNHOSTS *hosts,\n                           const char *line, size_t len, int type)\n{\n    const char *cp;\n    const char *hostp;\n    const char *keyp;\n    size_t hostlen;\n    size_t keylen;\n    int rc;\n\n    if(type != LIBSSH2_KNOWNHOST_FILE_OPENSSH)\n        return _libssh2_error(hosts->session,\n                              LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Unsupported type of known-host information \"\n                              \"store\");\n\n    cp = line;\n\n    /* skip leading whitespaces */\n    while(len && ((*cp==' ') || (*cp == '\\t'))) {\n        cp++;\n        len--;\n    }\n\n    if(!len || !*cp || (*cp == '#') || (*cp == '\\n'))\n        /* comment or empty line */\n        return LIBSSH2_ERROR_NONE;\n\n    /* the host part starts here */\n    hostp = cp;\n\n    /* move over the host to the separator */\n    while(len && *cp && (*cp!=' ') && (*cp != '\\t')) {\n        cp++;\n        len--;\n    }\n\n    hostlen = cp - hostp;\n\n    /* the key starts after the whitespaces */\n    while(len && *cp && ((*cp==' ') || (*cp == '\\t'))) {\n        cp++;\n        len--;\n    }\n\n    if(!*cp || !len) /* illegal line */\n        return _libssh2_error(hosts->session,\n                              LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Failed to parse known_hosts line\");\n\n    keyp = cp; /* the key starts here */\n    keylen = len;\n\n    /* check if the line (key) ends with a newline and if so kill it */\n    while(len && *cp && (*cp != '\\n')) {\n        cp++;\n        len--;\n    }\n\n    /* zero terminate where the newline is */\n    if(*cp == '\\n')\n        keylen--; /* don't include this in the count */\n\n    /* deal with this one host+key line */\n    rc = hostline(hosts, hostp, hostlen, keyp, keylen);\n    if(rc)\n        return rc; /* failed */\n\n    return LIBSSH2_ERROR_NONE; /* success */\n}\n\n/*\n * libssh2_knownhost_readfile\n *\n * Read hosts+key pairs from a given file.\n *\n * Returns a negative value for error or number of successfully added hosts.\n *\n */\n\nLIBSSH2_API int\nlibssh2_knownhost_readfile(LIBSSH2_KNOWNHOSTS *hosts,\n                           const char *filename, int type)\n{\n    FILE *file;\n    int num = 0;\n    char buf[2048];\n\n    if(type != LIBSSH2_KNOWNHOST_FILE_OPENSSH)\n        return _libssh2_error(hosts->session,\n                              LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Unsupported type of known-host information \"\n                              \"store\");\n\n    file = fopen(filename, \"r\");\n    if(file) {\n        while(fgets(buf, sizeof(buf), file)) {\n            if(libssh2_knownhost_readline(hosts, buf, strlen(buf), type)) {\n                num = _libssh2_error(hosts->session, LIBSSH2_ERROR_KNOWN_HOSTS,\n                                     \"Failed to parse known hosts file\");\n                break;\n            }\n            num++;\n        }\n        fclose(file);\n    }\n    else\n        return _libssh2_error(hosts->session, LIBSSH2_ERROR_FILE,\n                              \"Failed to open file\");\n\n    return num;\n}\n\n/*\n * knownhost_writeline()\n *\n * Ask libssh2 to convert a known host to an output line for storage.\n *\n * Note that this function returns LIBSSH2_ERROR_BUFFER_TOO_SMALL if the given\n * output buffer is too small to hold the desired output. The 'outlen' field\n * will then contain the size libssh2 wanted to store, which then is the\n * smallest sufficient buffer it would require.\n *\n */\nstatic int\nknownhost_writeline(LIBSSH2_KNOWNHOSTS *hosts,\n                    struct known_host *node,\n                    char *buf, size_t buflen,\n                    size_t *outlen, int type)\n{\n    size_t required_size;\n\n    const char *key_type_name;\n    size_t key_type_len;\n\n    /* we only support this single file type for now, bail out on all other\n       attempts */\n    if(type != LIBSSH2_KNOWNHOST_FILE_OPENSSH)\n        return _libssh2_error(hosts->session,\n                              LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Unsupported type of known-host information \"\n                              \"store\");\n\n    switch(node->typemask & LIBSSH2_KNOWNHOST_KEY_MASK) {\n    case LIBSSH2_KNOWNHOST_KEY_RSA1:\n        key_type_name = NULL;\n        key_type_len = 0;\n        break;\n    case LIBSSH2_KNOWNHOST_KEY_SSHRSA:\n        key_type_name = \"ssh-rsa\";\n        key_type_len = 7;\n        break;\n    case LIBSSH2_KNOWNHOST_KEY_SSHDSS:\n        key_type_name = \"ssh-dss\";\n        key_type_len = 7;\n        break;\n    case LIBSSH2_KNOWNHOST_KEY_UNKNOWN:\n        key_type_name = node->key_type_name;\n        if (key_type_name) {\n            key_type_len = node->key_type_len;\n            break;\n        }\n        /* otherwise fallback to default and error */\n    default:\n        return _libssh2_error(hosts->session,\n                              LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Unsupported type of known-host entry\");\n    }\n\n    /* When putting together the host line there are three aspects to consider:\n       - Hashed (SHA1) or unhashed hostname\n       - key name or no key name (RSA1)\n       - comment or no comment\n      \n       This means there are 2^3 different formats:\n       (\"|1|%s|%s %s %s %s\\n\", salt, hashed_host, key_name, key, comment)\n       (\"|1|%s|%s %s %s\\n\", salt, hashed_host, key_name, key)\n       (\"|1|%s|%s %s %s\\n\", salt, hashed_host, key, comment)\n       (\"|1|%s|%s %s\\n\", salt, hashed_host, key)\n       (\"%s %s %s %s\\n\", host, key_name, key, comment)\n       (\"%s %s %s\\n\", host, key_name, key)\n       (\"%s %s %s\\n\", host, key, comment)\n       (\"%s %s\\n\", host, key)\n      \n       Even if the buffer is too small, we have to set outlen to the number of\n       characters the complete line would have taken.  We also don't write\n       anything to the buffer unless we are sure we can write everything to the\n       buffer. */\n\n    required_size = strlen(node->key);\n\n    if(key_type_len)\n        required_size += key_type_len + 1; /* ' ' = 1 */\n    if(node->comment)\n        required_size += node->comment_len + 1; /* ' ' = 1 */\n\n    if((node->typemask & LIBSSH2_KNOWNHOST_TYPE_MASK) ==\n       LIBSSH2_KNOWNHOST_TYPE_SHA1) {\n        char *namealloc;\n        size_t name_base64_len;\n        char *saltalloc;\n        size_t salt_base64_len;\n\n        name_base64_len = _libssh2_base64_encode(hosts->session, node->name,\n                                                 node->name_len, &namealloc);\n        if(!name_base64_len)\n            return _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"base64-encoded host name\");\n\n        salt_base64_len = _libssh2_base64_encode(hosts->session,\n                                                 node->salt, node->salt_len,\n                                                 &saltalloc);\n        if(!salt_base64_len) {\n            LIBSSH2_FREE(hosts->session, namealloc);\n            return _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"base64-encoded salt\");\n        }\n\n        required_size += salt_base64_len + name_base64_len + 7;\n        /* |1| + | + ' ' + \\n + \\0 = 7 */\n\n        if(required_size <= buflen) {\n            if(node->comment && key_type_len)\n                snprintf(buf, buflen, \"|1|%s|%s %s %s %s\\n\", saltalloc,\n                         namealloc, key_type_name, node->key, node->comment);\n            else if (node->comment)\n                snprintf(buf, buflen, \"|1|%s|%s %s %s\\n\", saltalloc, namealloc,\n                         node->key, node->comment);\n            else if (key_type_len)\n                snprintf(buf, buflen, \"|1|%s|%s %s %s\\n\", saltalloc, namealloc,\n                         key_type_name, node->key);\n            else\n                snprintf(buf, buflen, \"|1|%s|%s %s\\n\", saltalloc, namealloc,\n                         node->key);\n        }\n\n        LIBSSH2_FREE(hosts->session, namealloc);\n        LIBSSH2_FREE(hosts->session, saltalloc);\n    }\n    else {\n        required_size += node->name_len + 3;\n        /* ' ' + '\\n' + \\0 = 3 */\n\n        if(required_size <= buflen) {\n            if(node->comment && key_type_len)\n                snprintf(buf, buflen, \"%s %s %s %s\\n\", node->name,\n                         key_type_name, node->key, node->comment);\n            else if (node->comment)\n                snprintf(buf, buflen, \"%s %s %s\\n\", node->name, node->key,\n                         node->comment);\n            else if (key_type_len)\n                snprintf(buf, buflen, \"%s %s %s\\n\", node->name, key_type_name,\n                         node->key);\n            else\n                snprintf(buf, buflen, \"%s %s\\n\", node->name, node->key);\n        }\n    }\n\n    /* we report the full length of the data with the trailing zero excluded */\n    *outlen = required_size-1;\n\n    if(required_size <= buflen)\n        return LIBSSH2_ERROR_NONE;\n    else\n        return _libssh2_error(hosts->session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                              \"Known-host write buffer too small\");\n}\n\n/*\n * libssh2_knownhost_writeline()\n *\n * Ask libssh2 to convert a known host to an output line for storage.\n *\n * Note that this function returns LIBSSH2_ERROR_BUFFER_TOO_SMALL if the given\n * output buffer is too small to hold the desired output.\n */\nLIBSSH2_API int\nlibssh2_knownhost_writeline(LIBSSH2_KNOWNHOSTS *hosts,\n                            struct libssh2_knownhost *known,\n                            char *buffer, size_t buflen,\n                            size_t *outlen, /* the amount of written data */\n                            int type)\n{\n    struct known_host *node;\n\n    if(known->magic != KNOWNHOST_MAGIC)\n        return _libssh2_error(hosts->session, LIBSSH2_ERROR_INVAL,\n                              \"Invalid host information\");\n\n    node = known->node;\n\n    return knownhost_writeline(hosts, node, buffer, buflen, outlen, type);\n}\n\n/*\n * libssh2_knownhost_writefile()\n *\n * Write hosts+key pairs to the given file.\n */\nLIBSSH2_API int\nlibssh2_knownhost_writefile(LIBSSH2_KNOWNHOSTS *hosts,\n                            const char *filename, int type)\n{\n    struct known_host *node;\n    FILE *file;\n    int rc = LIBSSH2_ERROR_NONE;\n    char buffer[2048];\n\n    /* we only support this single file type for now, bail out on all other\n       attempts */\n    if(type != LIBSSH2_KNOWNHOST_FILE_OPENSSH)\n        return _libssh2_error(hosts->session,\n                              LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Unsupported type of known-host information \"\n                              \"store\");\n\n    file = fopen(filename, \"w\");\n    if(!file)\n        return _libssh2_error(hosts->session, LIBSSH2_ERROR_FILE,\n                              \"Failed to open file\");\n\n    for(node = _libssh2_list_first(&hosts->head);\n        node;\n        node = _libssh2_list_next(&node->node)) {\n        size_t wrote = 0;\n        size_t nwrote;\n        rc = knownhost_writeline(hosts, node, buffer, sizeof(buffer), &wrote,\n                                 type);\n        if(rc)\n            break;\n\n        nwrote = fwrite(buffer, 1, wrote, file);\n        if(nwrote != wrote) {\n            /* failed to write the whole thing, bail out */\n            rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_FILE,\n                                \"Write failed\");\n            break;\n        }\n    }\n    fclose(file);\n\n    return rc;\n}\n\n\n/*\n * libssh2_knownhost_get()\n *\n * Traverse the internal list of known hosts. Pass NULL to 'prev' to get\n * the first one.\n *\n * Returns:\n * 0 if a fine host was stored in 'store'\n * 1 if end of hosts\n * [negative] on errors\n */\nLIBSSH2_API int\nlibssh2_knownhost_get(LIBSSH2_KNOWNHOSTS *hosts,\n                      struct libssh2_knownhost **ext,\n                      struct libssh2_knownhost *oprev)\n{\n    struct known_host *node;\n    if(oprev && oprev->node) {\n        /* we have a starting point */\n        struct known_host *prev = oprev->node;\n\n        /* get the next node in the list */\n        node = _libssh2_list_next(&prev->node);\n\n    }\n    else\n        node = _libssh2_list_first(&hosts->head);\n\n    if(!node)\n        /* no (more) node */\n        return 1;\n\n    *ext = knownhost_to_external(node);\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/libgcrypt.c",
    "content": "/* Copyright (C) 2008, 2009, Simon Josefsson\n * Copyright (C) 2006, 2007, The Written Word, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\n#ifdef LIBSSH2_LIBGCRYPT /* compile only if we build with libgcrypt */\n\n#include <string.h>\n\nint\n_libssh2_rsa_new(libssh2_rsa_ctx ** rsa,\n                 const unsigned char *edata,\n                 unsigned long elen,\n                 const unsigned char *ndata,\n                 unsigned long nlen,\n                 const unsigned char *ddata,\n                 unsigned long dlen,\n                 const unsigned char *pdata,\n                 unsigned long plen,\n                 const unsigned char *qdata,\n                 unsigned long qlen,\n                 const unsigned char *e1data,\n                 unsigned long e1len,\n                 const unsigned char *e2data,\n                 unsigned long e2len,\n                 const unsigned char *coeffdata, unsigned long coefflen)\n{\n    int rc;\n    (void) e1data;\n    (void) e1len;\n    (void) e2data;\n    (void) e2len;\n\n    if (ddata) {\n        rc = gcry_sexp_build\n            (rsa, NULL,\n             \"(private-key(rsa(n%b)(e%b)(d%b)(q%b)(p%b)(u%b)))\",\n             nlen, ndata, elen, edata, dlen, ddata, plen, pdata,\n             qlen, qdata, coefflen, coeffdata);\n    } else {\n        rc = gcry_sexp_build(rsa, NULL, \"(public-key(rsa(n%b)(e%b)))\",\n                             nlen, ndata, elen, edata);\n    }\n    if (rc) {\n        *rsa = NULL;\n        return -1;\n    }\n\n    return 0;\n}\n\nint\n_libssh2_rsa_sha1_verify(libssh2_rsa_ctx * rsa,\n                         const unsigned char *sig,\n                         unsigned long sig_len,\n                         const unsigned char *m, unsigned long m_len)\n{\n    unsigned char hash[SHA_DIGEST_LENGTH];\n    gcry_sexp_t s_sig, s_hash;\n    int rc = -1;\n\n    libssh2_sha1(m, m_len, hash);\n\n    rc = gcry_sexp_build(&s_hash, NULL,\n                         \"(data (flags pkcs1) (hash sha1 %b))\",\n                         SHA_DIGEST_LENGTH, hash);\n    if (rc != 0) {\n        return -1;\n    }\n\n    rc = gcry_sexp_build(&s_sig, NULL, \"(sig-val(rsa(s %b)))\", sig_len, sig);\n    if (rc != 0) {\n        gcry_sexp_release(s_hash);\n        return -1;\n    }\n\n    rc = gcry_pk_verify(s_sig, s_hash, rsa);\n    gcry_sexp_release(s_sig);\n    gcry_sexp_release(s_hash);\n\n    return (rc == 0) ? 0 : -1;\n}\n\nint\n_libssh2_dsa_new(libssh2_dsa_ctx ** dsactx,\n                 const unsigned char *p,\n                 unsigned long p_len,\n                 const unsigned char *q,\n                 unsigned long q_len,\n                 const unsigned char *g,\n                 unsigned long g_len,\n                 const unsigned char *y,\n                 unsigned long y_len,\n                 const unsigned char *x, unsigned long x_len)\n{\n    int rc;\n\n    if (x_len) {\n        rc = gcry_sexp_build\n            (dsactx, NULL,\n             \"(private-key(dsa(p%b)(q%b)(g%b)(y%b)(x%b)))\",\n             p_len, p, q_len, q, g_len, g, y_len, y, x_len, x);\n    } else {\n        rc = gcry_sexp_build(dsactx, NULL,\n                             \"(public-key(dsa(p%b)(q%b)(g%b)(y%b)))\",\n                             p_len, p, q_len, q, g_len, g, y_len, y);\n    }\n\n    if (rc) {\n        *dsactx = NULL;\n        return -1;\n    }\n\n    return 0;\n}\n\nint\n_libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx ** rsa,\n                                    LIBSSH2_SESSION * session,\n                                    const char *filedata, size_t filedata_len,\n                                    unsigned const char *passphrase)\n{\n    return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                         \"Unable to extract private key from memory: \"\n                         \"Method unimplemented in libgcrypt backend\");\n}\n\nint\n_libssh2_rsa_new_private(libssh2_rsa_ctx ** rsa,\n                         LIBSSH2_SESSION * session,\n                         const char *filename, unsigned const char *passphrase)\n{\n    FILE *fp;\n    unsigned char *data, *save_data;\n    unsigned int datalen;\n    int ret;\n    unsigned char *n, *e, *d, *p, *q, *e1, *e2, *coeff;\n    unsigned int nlen, elen, dlen, plen, qlen, e1len, e2len, coefflen;\n\n    (void) passphrase;\n\n    fp = fopen(filename, \"r\");\n    if (!fp) {\n        return -1;\n    }\n\n    ret = _libssh2_pem_parse(session,\n                             \"-----BEGIN RSA PRIVATE KEY-----\",\n                             \"-----END RSA PRIVATE KEY-----\",\n                             fp, &data, &datalen);\n    fclose(fp);\n    if (ret) {\n        return -1;\n    }\n\n    save_data = data;\n\n    if (_libssh2_pem_decode_sequence(&data, &datalen)) {\n        ret = -1;\n        goto fail;\n    }\n/* First read Version field (should be 0). */\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &n, &nlen);\n    if (ret != 0 || (nlen != 1 && *n != '\\0')) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &n, &nlen);\n    if (ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &e, &elen);\n    if (ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &d, &dlen);\n    if (ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &p, &plen);\n    if (ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &q, &qlen);\n    if (ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &e1, &e1len);\n    if (ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &e2, &e2len);\n    if (ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &coeff, &coefflen);\n    if (ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    if (_libssh2_rsa_new(rsa, e, elen, n, nlen, d, dlen, p, plen,\n                         q, qlen, e1, e1len, e2, e2len, coeff, coefflen)) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = 0;\n\n  fail:\n    LIBSSH2_FREE(session, save_data);\n    return ret;\n}\n\nint\n_libssh2_dsa_new_private_frommemory(libssh2_dsa_ctx ** dsa,\n                                    LIBSSH2_SESSION * session,\n                                    const char *filedata, size_t filedata_len,\n                                    unsigned const char *passphrase)\n{\n    return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                         \"Unable to extract private key from memory: \"\n                         \"Method unimplemented in libgcrypt backend\");\n}\n\nint\n_libssh2_dsa_new_private(libssh2_dsa_ctx ** dsa,\n                         LIBSSH2_SESSION * session,\n                         const char *filename, unsigned const char *passphrase)\n{\n    FILE *fp;\n    unsigned char *data, *save_data;\n    unsigned int datalen;\n    int ret;\n    unsigned char *p, *q, *g, *y, *x;\n    unsigned int plen, qlen, glen, ylen, xlen;\n\n    (void) passphrase;\n\n    fp = fopen(filename, \"r\");\n    if (!fp) {\n        return -1;\n    }\n\n    ret = _libssh2_pem_parse(session,\n                             \"-----BEGIN DSA PRIVATE KEY-----\",\n                             \"-----END DSA PRIVATE KEY-----\",\n                             fp, &data, &datalen);\n    fclose(fp);\n    if (ret) {\n        return -1;\n    }\n\n    save_data = data;\n\n    if (_libssh2_pem_decode_sequence(&data, &datalen)) {\n        ret = -1;\n        goto fail;\n    }\n\n/* First read Version field (should be 0). */\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &p, &plen);\n    if (ret != 0 || (plen != 1 && *p != '\\0')) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &p, &plen);\n    if (ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &q, &qlen);\n    if (ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &g, &glen);\n    if (ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &y, &ylen);\n    if (ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &x, &xlen);\n    if (ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    if (datalen != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    if (_libssh2_dsa_new(dsa, p, plen, q, qlen, g, glen, y, ylen, x, xlen)) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = 0;\n\n  fail:\n    LIBSSH2_FREE(session, save_data);\n    return ret;\n}\n\nint\n_libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session,\n                       libssh2_rsa_ctx * rsactx,\n                       const unsigned char *hash,\n                       size_t hash_len,\n                       unsigned char **signature, size_t *signature_len)\n{\n    gcry_sexp_t sig_sexp;\n    gcry_sexp_t data;\n    int rc;\n    const char *tmp;\n    size_t size;\n\n    if (hash_len != SHA_DIGEST_LENGTH) {\n        return -1;\n    }\n\n    if (gcry_sexp_build(&data, NULL,\n                        \"(data (flags pkcs1) (hash sha1 %b))\",\n                        hash_len, hash)) {\n        return -1;\n    }\n\n    rc = gcry_pk_sign(&sig_sexp, data, rsactx);\n\n    gcry_sexp_release(data);\n\n    if (rc != 0) {\n        return -1;\n    }\n\n    data = gcry_sexp_find_token(sig_sexp, \"s\", 0);\n    if (!data) {\n        return -1;\n    }\n\n    tmp = gcry_sexp_nth_data(data, 1, &size);\n    if (!tmp) {\n        return -1;\n    }\n\n    if (tmp[0] == '\\0') {\n        tmp++;\n        size--;\n    }\n\n    *signature = LIBSSH2_ALLOC(session, size);\n    if (!*signature) {\n        return -1;\n    }\n    memcpy(*signature, tmp, size);\n    *signature_len = size;\n\n    return rc;\n}\n\nint\n_libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx,\n                       const unsigned char *hash,\n                       unsigned long hash_len, unsigned char *sig)\n{\n    unsigned char zhash[SHA_DIGEST_LENGTH + 1];\n    gcry_sexp_t sig_sexp;\n    gcry_sexp_t data;\n    int ret;\n    const char *tmp;\n    size_t size;\n\n    if (hash_len != SHA_DIGEST_LENGTH) {\n        return -1;\n    }\n\n    memcpy(zhash + 1, hash, hash_len);\n    zhash[0] = 0;\n\n    if (gcry_sexp_build(&data, NULL, \"(data (value %b))\", hash_len + 1, zhash)) {\n        return -1;\n    }\n\n    ret = gcry_pk_sign(&sig_sexp, data, dsactx);\n\n    gcry_sexp_release(data);\n\n    if (ret != 0) {\n        return -1;\n    }\n\n    memset(sig, 0, 40);\n\n/* Extract R. */\n\n    data = gcry_sexp_find_token(sig_sexp, \"r\", 0);\n    if (!data)\n        goto err;\n\n    tmp = gcry_sexp_nth_data(data, 1, &size);\n    if (!tmp)\n        goto err;\n\n    if (tmp[0] == '\\0') {\n        tmp++;\n        size--;\n    }\n\n    if (size < 1 || size > 20)\n        goto err;\n\n    memcpy(sig + (20 - size), tmp, size);\n\n    gcry_sexp_release(data);\n\n/* Extract S. */\n\n    data = gcry_sexp_find_token(sig_sexp, \"s\", 0);\n    if (!data)\n        goto err;\n\n    tmp = gcry_sexp_nth_data(data, 1, &size);\n    if (!tmp)\n        goto err;\n\n    if (tmp[0] == '\\0') {\n        tmp++;\n        size--;\n    }\n\n    if (size < 1 || size > 20)\n        goto err;\n\n    memcpy(sig + 20 + (20 - size), tmp, size);\n    goto out;\n\n  err:\n    ret = -1;\n\n  out:\n    if (sig_sexp) {\n        gcry_sexp_release(sig_sexp);\n    }\n    if (data) {\n        gcry_sexp_release(data);\n    }\n    return ret;\n}\n\nint\n_libssh2_dsa_sha1_verify(libssh2_dsa_ctx * dsactx,\n                         const unsigned char *sig,\n                         const unsigned char *m, unsigned long m_len)\n{\n    unsigned char hash[SHA_DIGEST_LENGTH + 1];\n    gcry_sexp_t s_sig, s_hash;\n    int rc = -1;\n\n    libssh2_sha1(m, m_len, hash + 1);\n    hash[0] = 0;\n\n    if (gcry_sexp_build(&s_hash, NULL, \"(data(flags raw)(value %b))\",\n                        SHA_DIGEST_LENGTH + 1, hash)) {\n        return -1;\n    }\n\n    if (gcry_sexp_build(&s_sig, NULL, \"(sig-val(dsa(r %b)(s %b)))\",\n                        20, sig, 20, sig + 20)) {\n        gcry_sexp_release(s_hash);\n        return -1;\n    }\n\n    rc = gcry_pk_verify(s_sig, s_hash, dsactx);\n    gcry_sexp_release(s_sig);\n    gcry_sexp_release(s_hash);\n\n    return (rc == 0) ? 0 : -1;\n}\n\nint\n_libssh2_cipher_init(_libssh2_cipher_ctx * h,\n                     _libssh2_cipher_type(algo),\n                     unsigned char *iv, unsigned char *secret, int encrypt)\n{\n    int ret;\n    int cipher = _libssh2_gcry_cipher (algo);\n    int mode = _libssh2_gcry_mode (algo);\n    int keylen = gcry_cipher_get_algo_keylen(cipher);\n\n    (void) encrypt;\n\n    ret = gcry_cipher_open(h, cipher, mode, 0);\n    if (ret) {\n        return -1;\n    }\n\n    ret = gcry_cipher_setkey(*h, secret, keylen);\n    if (ret) {\n        gcry_cipher_close(*h);\n        return -1;\n    }\n\n    if (mode != GCRY_CIPHER_MODE_STREAM) {\n        int blklen = gcry_cipher_get_algo_blklen(cipher);\n        if (mode == GCRY_CIPHER_MODE_CTR)\n            ret = gcry_cipher_setctr(*h, iv, blklen);\n        else\n            ret = gcry_cipher_setiv(*h, iv, blklen);\n        if (ret) {\n            gcry_cipher_close(*h);\n            return -1;\n        }\n    }\n\n    return 0;\n}\n\nint\n_libssh2_cipher_crypt(_libssh2_cipher_ctx * ctx,\n                      _libssh2_cipher_type(algo),\n                      int encrypt, unsigned char *block, size_t blklen)\n{\n    int cipher = _libssh2_gcry_cipher (algo);\n    int ret;\n\n    if (encrypt) {\n        ret = gcry_cipher_encrypt(*ctx, block, blklen, block, blklen);\n    } else {\n        ret = gcry_cipher_decrypt(*ctx, block, blklen, block, blklen);\n    }\n    return ret;\n}\n\nint\n_libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session,\n                                unsigned char **method,\n                                size_t *method_len,\n                                unsigned char **pubkeydata,\n                                size_t *pubkeydata_len,\n                                const char *privatekeydata,\n                                size_t privatekeydata_len,\n                                const char *passphrase)\n{\n    return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                         \"Unable to extract public key from private key in memory: \"\n                         \"Method unimplemented in libgcrypt backend\");\n}\n\nint\n_libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session,\n                          unsigned char **method,\n                          size_t *method_len,\n                          unsigned char **pubkeydata,\n                          size_t *pubkeydata_len,\n                          const char *privatekey,\n                          const char *passphrase)\n{\n    return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                         \"Unable to extract public key from private key file: \"\n                         \"Method unimplemented in libgcrypt backend\");\n}\n\nvoid _libssh2_init_aes_ctr(void)\n{\n    /* no implementation */\n}\n#endif /* LIBSSH2_LIBGCRYPT */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/libgcrypt.h",
    "content": "/*\n * Copyright (C) 2008, 2009, 2010 Simon Josefsson\n * Copyright (C) 2006, 2007, The Written Word, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include <gcrypt.h>\n\n#define LIBSSH2_MD5 1\n\n#define LIBSSH2_HMAC_RIPEMD 1\n#define LIBSSH2_HMAC_SHA256 1\n#define LIBSSH2_HMAC_SHA512 1\n\n#define LIBSSH2_AES 1\n#define LIBSSH2_AES_CTR 1\n#define LIBSSH2_BLOWFISH 1\n#define LIBSSH2_RC4 1\n#define LIBSSH2_CAST 1\n#define LIBSSH2_3DES 1\n\n#define LIBSSH2_RSA 1\n#define LIBSSH2_DSA 1\n\n#define MD5_DIGEST_LENGTH 16\n#define SHA_DIGEST_LENGTH 20\n#define SHA256_DIGEST_LENGTH 32\n\n#define _libssh2_random(buf, len)                \\\n  (gcry_randomize ((buf), (len), GCRY_STRONG_RANDOM), 1)\n\n#define libssh2_prepare_iovec(vec, len)  /* Empty. */\n\n#define libssh2_sha1_ctx gcry_md_hd_t\n\n/* returns 0 in case of failure */\n#define libssh2_sha1_init(ctx) \\\n  (GPG_ERR_NO_ERROR == gcry_md_open (ctx,  GCRY_MD_SHA1, 0))\n#define libssh2_sha1_update(ctx, data, len) \\\n  gcry_md_write (ctx, (unsigned char *) data, len)\n#define libssh2_sha1_final(ctx, out) \\\n  memcpy (out, gcry_md_read (ctx, 0), SHA_DIGEST_LENGTH), gcry_md_close (ctx)\n#define libssh2_sha1(message, len, out) \\\n  gcry_md_hash_buffer (GCRY_MD_SHA1, out, message, len)\n\n#define libssh2_sha256_ctx gcry_md_hd_t\n\n#define libssh2_sha256_init(ctx) \\\n  (GPG_ERR_NO_ERROR == gcry_md_open (ctx,  GCRY_MD_SHA256, 0))\n#define libssh2_sha256_update(ctx, data, len) \\\n  gcry_md_write (ctx, (unsigned char *) data, len)\n#define libssh2_sha256_final(ctx, out) \\\n  memcpy (out, gcry_md_read (ctx, 0), SHA256_DIGEST_LENGTH), gcry_md_close (ctx)\n#define libssh2_sha256(message, len, out) \\\n  gcry_md_hash_buffer (GCRY_MD_SHA256, out, message, len)\n\n#define libssh2_md5_ctx gcry_md_hd_t\n\n/* returns 0 in case of failure */\n#define libssh2_md5_init(ctx) \\\n  (GPG_ERR_NO_ERROR == gcry_md_open (ctx,  GCRY_MD_MD5, 0))\n\n#define libssh2_md5_update(ctx, data, len) \\\n  gcry_md_write (ctx, (unsigned char *) data, len)\n#define libssh2_md5_final(ctx, out) \\\n  memcpy (out, gcry_md_read (ctx, 0), MD5_DIGEST_LENGTH), gcry_md_close (ctx)\n#define libssh2_md5(message, len, out) \\\n  gcry_md_hash_buffer (GCRY_MD_MD5, out, message, len)\n\n#define libssh2_hmac_ctx gcry_md_hd_t\n#define libssh2_hmac_ctx_init(ctx)\n#define libssh2_hmac_sha1_init(ctx, key, keylen) \\\n  gcry_md_open (ctx, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC), \\\n    gcry_md_setkey (*ctx, key, keylen)\n#define libssh2_hmac_md5_init(ctx, key, keylen) \\\n  gcry_md_open (ctx, GCRY_MD_MD5, GCRY_MD_FLAG_HMAC), \\\n    gcry_md_setkey (*ctx, key, keylen)\n#define libssh2_hmac_ripemd160_init(ctx, key, keylen) \\\n  gcry_md_open (ctx, GCRY_MD_RMD160, GCRY_MD_FLAG_HMAC), \\\n    gcry_md_setkey (*ctx, key, keylen)\n#define libssh2_hmac_sha256_init(ctx, key, keylen) \\\n  gcry_md_open (ctx, GCRY_MD_SHA256, GCRY_MD_FLAG_HMAC), \\\n    gcry_md_setkey (*ctx, key, keylen)\n#define libssh2_hmac_sha512_init(ctx, key, keylen) \\\n  gcry_md_open (ctx, GCRY_MD_SHA512, GCRY_MD_FLAG_HMAC), \\\n    gcry_md_setkey (*ctx, key, keylen)\n#define libssh2_hmac_update(ctx, data, datalen) \\\n  gcry_md_write (ctx, (unsigned char *) data, datalen)\n#define libssh2_hmac_final(ctx, data) \\\n  memcpy (data, gcry_md_read (ctx, 0), \\\n      gcry_md_get_algo_dlen (gcry_md_get_algo (ctx)))\n#define libssh2_hmac_cleanup(ctx) gcry_md_close (*ctx);\n\n#define libssh2_crypto_init() gcry_control (GCRYCTL_DISABLE_SECMEM)\n#define libssh2_crypto_exit()\n\n#define libssh2_rsa_ctx struct gcry_sexp\n\n#define _libssh2_rsa_free(rsactx)  gcry_sexp_release (rsactx)\n\n#define libssh2_dsa_ctx struct gcry_sexp\n\n#define _libssh2_dsa_free(dsactx)  gcry_sexp_release (dsactx)\n\n#define _libssh2_cipher_type(name) int name\n#define _libssh2_cipher_ctx gcry_cipher_hd_t\n\n#define _libssh2_gcry_ciphermode(c,m) ((c << 8) | m)\n#define _libssh2_gcry_cipher(c) (c >> 8)\n#define _libssh2_gcry_mode(m) (m & 0xFF)\n\n#define _libssh2_cipher_aes256ctr \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CTR)\n#define _libssh2_cipher_aes192ctr \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CTR)\n#define _libssh2_cipher_aes128ctr \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CTR)\n#define _libssh2_cipher_aes256 \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CBC)\n#define _libssh2_cipher_aes192 \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CBC)\n#define _libssh2_cipher_aes128 \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CBC)\n#define _libssh2_cipher_blowfish \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_CBC)\n#define _libssh2_cipher_arcfour \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_ARCFOUR, GCRY_CIPHER_MODE_STREAM)\n#define _libssh2_cipher_cast5 \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_CAST5, GCRY_CIPHER_MODE_CBC)\n#define _libssh2_cipher_3des \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_CBC)\n\n\n#define _libssh2_cipher_dtor(ctx) gcry_cipher_close(*(ctx))\n\n#define _libssh2_bn struct gcry_mpi\n#define _libssh2_bn_ctx int\n#define _libssh2_bn_ctx_new() 0\n#define _libssh2_bn_ctx_free(bnctx) ((void)0)\n#define _libssh2_bn_init() gcry_mpi_new(0)\n#define _libssh2_bn_init_from_bin() NULL /* because gcry_mpi_scan() creates a new bignum */\n#define _libssh2_bn_rand(bn, bits, top, bottom) gcry_mpi_randomize (bn, bits, GCRY_WEAK_RANDOM)\n#define _libssh2_bn_mod_exp(r, a, p, m, ctx) gcry_mpi_powm (r, a, p, m)\n#define _libssh2_bn_set_word(bn, val) gcry_mpi_set_ui(bn, val)\n#define _libssh2_bn_from_bin(bn, len, val) gcry_mpi_scan(&((bn)), GCRYMPI_FMT_USG, val, len, NULL)\n#define _libssh2_bn_to_bin(bn, val) gcry_mpi_print (GCRYMPI_FMT_USG, val, _libssh2_bn_bytes(bn), NULL, bn)\n#define _libssh2_bn_bytes(bn) (gcry_mpi_get_nbits (bn) / 8 + ((gcry_mpi_get_nbits (bn) % 8 == 0) ? 0 : 1))\n#define _libssh2_bn_bits(bn) gcry_mpi_get_nbits (bn)\n#define _libssh2_bn_free(bn) gcry_mpi_release(bn)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/libssh2.pc.in",
    "content": "###########################################################################\n# libssh2 installation details\n###########################################################################\n\nprefix=@CMAKE_INSTALL_PREFIX@\nexec_prefix=${prefix}\nlibdir=${prefix}/@CMAKE_INSTALL_LIBDIR@\nincludedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@\n\nName: @PROJECT_NAME@\nURL: @PROJECT_URL@\nDescription: @PROJECT_DESCRIPTION@\nVersion: @LIBSSH2_VERSION@\nRequires.private: @PC_REQUIRES_PRIVATE@\nLibs: -L${libdir} -lssh2 @PC_LIBS@\nLibs.private: @PC_LIBS@\nCflags: -I${includedir}"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/libssh2_config_cmake.h.in",
    "content": "/* Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n * Copyright (c) 1999-2011 Douglas Gilbert. All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* Headers */\n#cmakedefine HAVE_UNISTD_H\n#cmakedefine HAVE_INTTYPES_H\n#cmakedefine HAVE_STDLIB_H\n#cmakedefine HAVE_SYS_SELECT_H\n#cmakedefine HAVE_SYS_UIO_H\n#cmakedefine HAVE_SYS_SOCKET_H\n#cmakedefine HAVE_SYS_IOCTL_H\n#cmakedefine HAVE_SYS_TIME_H\n#cmakedefine HAVE_SYS_UN_H\n#cmakedefine HAVE_WINDOWS_H\n#cmakedefine HAVE_WS2TCPIP_H\n#cmakedefine HAVE_WINSOCK2_H\n#cmakedefine HAVE_NTDEF_H\n#cmakedefine HAVE_NTSTATUS_H\n\n/* Libraries */\n#cmakedefine HAVE_LIBCRYPT32\n\n/* Types */\n#cmakedefine HAVE_LONGLONG\n\n/* Functions */\n#cmakedefine HAVE_GETTIMEOFDAY\n#cmakedefine HAVE_INET_ADDR\n#cmakedefine HAVE_POLL\n#cmakedefine HAVE_SELECT\n#cmakedefine HAVE_SOCKET\n#cmakedefine HAVE_STRTOLL\n#cmakedefine HAVE_STRTOI64\n#cmakedefine HAVE_SNPRINTF\n\n/* OpenSSL functions */\n#cmakedefine HAVE_EVP_AES_128_CTR\n\n/* Socket non-blocking support */\n#cmakedefine HAVE_O_NONBLOCK\n#cmakedefine HAVE_FIONBIO\n#cmakedefine HAVE_IOCTLSOCKET\n#cmakedefine HAVE_IOCTLSOCKET_CASE\n#cmakedefine HAVE_SO_NONBLOCK\n#cmakedefine HAVE_DISABLED_NONBLOCKING\n\n/* snprintf not in Visual Studio CRT and _snprintf dangerously incompatible.\n   We provide a safe wrapper if snprintf not found */\n#ifndef HAVE_SNPRINTF\n#include <stdio.h>\n#include <stdarg.h>\n/* Want safe, 'n += snprintf(b + n ...)' like function. If cp_max_len is 1\n* then assume cp is pointing to a null char and do nothing. Returns number\n* number of chars placed in cp excluding the trailing null char. So for\n* cp_max_len > 0 the return value is always < cp_max_len; for cp_max_len\n* <= 0 the return value is 0 (and no chars are written to cp). */\nstatic int snprintf(char * cp, int cp_max_len, const char * fmt, ...)\n{\n    va_list args;\n    int n;\n\n    if (cp_max_len < 2)\n        return 0;\n    va_start(args, fmt);\n    n = vsnprintf(cp, cp_max_len, fmt, args);\n    va_end(args);\n    return (n < cp_max_len) ? n : (cp_max_len - 1);\n}\n\n#define HAVE_SNPRINTF\n#endif\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/libssh2_priv.h",
    "content": "/* Copyright (c) 2004-2008, 2010, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2009-2014 by Daniel Stenberg\n * Copyright (c) 2010 Simon Josefsson\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_PRIV_H\n#define LIBSSH2_PRIV_H 1\n\n#define LIBSSH2_LIBRARY\n#include \"libssh2_config.h\"\n\n#ifdef HAVE_WINDOWS_H\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n#include <windows.h>\n#undef WIN32_LEAN_AND_MEAN\n#endif\n\n#ifdef HAVE_WS2TCPIP_H\n#include <ws2tcpip.h>\n#endif\n\n#include <stdio.h>\n#include <time.h>\n\n/* The following CPP block should really only be in session.c and\n   packet.c.  However, AIX have #define's for 'events' and 'revents'\n   and we are using those names in libssh2.h, so we need to include\n   the AIX headers first, to make sure all code is compiled with\n   consistent names of these fields.  While arguable the best would to\n   change libssh2.h to use other names, that would break backwards\n   compatibility.  For more information, see:\n   https://www.mail-archive.com/libssh2-devel%40lists.sourceforge.net/msg00003.html\n   https://www.mail-archive.com/libssh2-devel%40lists.sourceforge.net/msg00224.html\n*/\n#ifdef HAVE_POLL\n# include <sys/poll.h>\n#else\n# if defined(HAVE_SELECT) && !defined(WIN32)\n# ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n# else\n# include <sys/time.h>\n# include <sys/types.h>\n# endif\n# endif\n#endif\n\n/* Needed for struct iovec on some platforms */\n#ifdef HAVE_SYS_UIO_H\n#include <sys/uio.h>\n#endif\n\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_SYS_IOCTL_H\n# include <sys/ioctl.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n#include <inttypes.h>\n#endif\n\n#include \"libssh2.h\"\n#include \"libssh2_publickey.h\"\n#include \"libssh2_sftp.h\"\n#include \"misc.h\" /* for the linked list stuff */\n\n#ifndef FALSE\n#define FALSE 0\n#endif\n#ifndef TRUE\n#define TRUE 1\n#endif\n\n#ifdef _MSC_VER\n/* \"inline\" keyword is valid only with C++ engine! */\n#define inline __inline\n#endif\n\n/* Provide iovec / writev on WIN32 platform. */\n#ifdef WIN32\n\nstruct iovec {\n    size_t iov_len;\n    void * iov_base;\n};\n\nstatic inline int writev(int sock, struct iovec *iov, int nvecs)\n{\n    DWORD ret;\n    if (WSASend(sock, (LPWSABUF)iov, nvecs, &ret, 0, NULL, NULL) == 0) {\n        return ret;\n    }\n    return -1;\n}\n\n#endif /* WIN32 */\n\n#ifdef __OS400__\n/* Force parameter type. */\n#define send(s, b, l, f)    send((s), (unsigned char *) (b), (l), (f))\n#endif\n\n#include \"crypto.h\"\n\n#ifdef HAVE_WINSOCK2_H\n\n#include <winsock2.h>\n#include <ws2tcpip.h>\n\n#endif\n\n/* RFC4253 section 6.1 Maximum Packet Length says:\n *\n * \"All implementations MUST be able to process packets with\n * uncompressed payload length of 32768 bytes or less and\n * total packet size of 35000 bytes or less (including length,\n * padding length, payload, padding, and MAC.).\"\n */\n#define MAX_SSH_PACKET_LEN 35000\n#define MAX_SHA_DIGEST_LEN SHA256_DIGEST_LENGTH\n\n#define LIBSSH2_ALLOC(session, count) \\\n  session->alloc((count), &(session)->abstract)\n#define LIBSSH2_CALLOC(session, count) _libssh2_calloc(session, count)\n#define LIBSSH2_REALLOC(session, ptr, count) \\\n ((ptr) ? session->realloc((ptr), (count), &(session)->abstract) : \\\n session->alloc((count), &(session)->abstract))\n#define LIBSSH2_FREE(session, ptr) \\\n session->free((ptr), &(session)->abstract)\n#define LIBSSH2_IGNORE(session, data, datalen) \\\n session->ssh_msg_ignore((session), (data), (datalen), &(session)->abstract)\n#define LIBSSH2_DEBUG(session, always_display, message, message_len, \\\n                      language, language_len)    \\\n    session->ssh_msg_debug((session), (always_display), (message), \\\n                           (message_len), (language), (language_len), \\\n                           &(session)->abstract)\n#define LIBSSH2_DISCONNECT(session, reason, message, message_len, \\\n                           language, language_len)                \\\n    session->ssh_msg_disconnect((session), (reason), (message),   \\\n                                (message_len), (language), (language_len), \\\n                                &(session)->abstract)\n\n#define LIBSSH2_MACERROR(session, data, datalen)         \\\n    session->macerror((session), (data), (datalen), &(session)->abstract)\n#define LIBSSH2_X11_OPEN(channel, shost, sport)          \\\n    channel->session->x11(((channel)->session), (channel), \\\n                          (shost), (sport), (&(channel)->session->abstract))\n\n#define LIBSSH2_CHANNEL_CLOSE(session, channel)          \\\n    channel->close_cb((session), &(session)->abstract, \\\n                      (channel), &(channel)->abstract)\n\n#define LIBSSH2_SEND_FD(session, fd, buffer, length, flags) \\\n    (session->send)(fd, buffer, length, flags, &session->abstract)\n#define LIBSSH2_RECV_FD(session, fd, buffer, length, flags) \\\n    (session->recv)(fd, buffer, length, flags, &session->abstract)\n\n#define LIBSSH2_SEND(session, buffer, length, flags)  \\\n    LIBSSH2_SEND_FD(session, session->socket_fd, buffer, length, flags)\n#define LIBSSH2_RECV(session, buffer, length, flags)                    \\\n    LIBSSH2_RECV_FD(session, session->socket_fd, buffer, length, flags)\n\ntypedef struct _LIBSSH2_KEX_METHOD LIBSSH2_KEX_METHOD;\ntypedef struct _LIBSSH2_HOSTKEY_METHOD LIBSSH2_HOSTKEY_METHOD;\ntypedef struct _LIBSSH2_CRYPT_METHOD LIBSSH2_CRYPT_METHOD;\ntypedef struct _LIBSSH2_COMP_METHOD LIBSSH2_COMP_METHOD;\n\ntypedef struct _LIBSSH2_PACKET LIBSSH2_PACKET;\n\ntypedef enum\n{\n    libssh2_NB_state_idle = 0,\n    libssh2_NB_state_allocated,\n    libssh2_NB_state_created,\n    libssh2_NB_state_sent,\n    libssh2_NB_state_sent1,\n    libssh2_NB_state_sent2,\n    libssh2_NB_state_sent3,\n    libssh2_NB_state_sent4,\n    libssh2_NB_state_sent5,\n    libssh2_NB_state_sent6,\n    libssh2_NB_state_sent7,\n    libssh2_NB_state_jump1,\n    libssh2_NB_state_jump2,\n    libssh2_NB_state_jump3,\n    libssh2_NB_state_jump4,\n    libssh2_NB_state_jump5,\n    libssh2_NB_state_end\n} libssh2_nonblocking_states;\n\ntypedef struct packet_require_state_t\n{\n    libssh2_nonblocking_states state;\n    time_t start;\n} packet_require_state_t;\n\ntypedef struct packet_requirev_state_t\n{\n    time_t start;\n} packet_requirev_state_t;\n\ntypedef struct kmdhgGPshakex_state_t\n{\n    libssh2_nonblocking_states state;\n    unsigned char *e_packet;\n    unsigned char *s_packet;\n    unsigned char *tmp;\n    unsigned char h_sig_comp[MAX_SHA_DIGEST_LEN];\n    unsigned char c;\n    size_t e_packet_len;\n    size_t s_packet_len;\n    size_t tmp_len;\n    _libssh2_bn_ctx *ctx;\n    _libssh2_bn *x;\n    _libssh2_bn *e;\n    _libssh2_bn *f;\n    _libssh2_bn *k;\n    unsigned char *s;\n    unsigned char *f_value;\n    unsigned char *k_value;\n    unsigned char *h_sig;\n    size_t f_value_len;\n    size_t k_value_len;\n    size_t h_sig_len;\n    void *exchange_hash;\n    packet_require_state_t req_state;\n    libssh2_nonblocking_states burn_state;\n} kmdhgGPshakex_state_t;\n\ntypedef struct key_exchange_state_low_t\n{\n    libssh2_nonblocking_states state;\n    packet_require_state_t req_state;\n    kmdhgGPshakex_state_t exchange_state;\n    _libssh2_bn *p;             /* SSH2 defined value (p_value) */\n    _libssh2_bn *g;             /* SSH2 defined value (2) */\n    unsigned char request[13];\n    unsigned char *data;\n    size_t request_len;\n    size_t data_len;\n} key_exchange_state_low_t;\n\ntypedef struct key_exchange_state_t\n{\n    libssh2_nonblocking_states state;\n    packet_require_state_t req_state;\n    key_exchange_state_low_t key_state_low;\n    unsigned char *data;\n    size_t data_len;\n    unsigned char *oldlocal;\n    size_t oldlocal_len;\n} key_exchange_state_t;\n\n#define FwdNotReq \"Forward not requested\"\n\ntypedef struct packet_queue_listener_state_t\n{\n    libssh2_nonblocking_states state;\n    unsigned char packet[17 + (sizeof(FwdNotReq) - 1)];\n    unsigned char *host;\n    unsigned char *shost;\n    uint32_t sender_channel;\n    uint32_t initial_window_size;\n    uint32_t packet_size;\n    uint32_t port;\n    uint32_t sport;\n    uint32_t host_len;\n    uint32_t shost_len;\n    LIBSSH2_CHANNEL *channel;\n} packet_queue_listener_state_t;\n\n#define X11FwdUnAvil \"X11 Forward Unavailable\"\n\ntypedef struct packet_x11_open_state_t\n{\n    libssh2_nonblocking_states state;\n    unsigned char packet[17 + (sizeof(X11FwdUnAvil) - 1)];\n    unsigned char *shost;\n    uint32_t sender_channel;\n    uint32_t initial_window_size;\n    uint32_t packet_size;\n    uint32_t sport;\n    uint32_t shost_len;\n    LIBSSH2_CHANNEL *channel;\n} packet_x11_open_state_t;\n\nstruct _LIBSSH2_PACKET\n{\n    struct list_node node; /* linked list header */\n\n    /* the raw unencrypted payload */\n    unsigned char *data;\n    size_t data_len;\n\n    /* Where to start reading data from,\n     * used for channel data that's been partially consumed */\n    size_t data_head;\n};\n\ntypedef struct _libssh2_channel_data\n{\n    /* Identifier */\n    uint32_t id;\n\n    /* Limits and restrictions */\n    uint32_t window_size_initial, window_size, packet_size;\n\n    /* Set to 1 when CHANNEL_CLOSE / CHANNEL_EOF sent/received */\n    char close, eof, extended_data_ignore_mode;\n} libssh2_channel_data;\n\nstruct _LIBSSH2_CHANNEL\n{\n    struct list_node node;\n\n    unsigned char *channel_type;\n    unsigned channel_type_len;\n\n    /* channel's program exit status */\n    int exit_status;\n\n    /* channel's program exit signal (without the SIG prefix) */\n    char *exit_signal;\n\n    libssh2_channel_data local, remote;\n    /* Amount of bytes to be refunded to receive window (but not yet sent) */\n    uint32_t adjust_queue;\n    /* Data immediately available for reading */\n    uint32_t read_avail;\n\n    LIBSSH2_SESSION *session;\n\n    void *abstract;\n      LIBSSH2_CHANNEL_CLOSE_FUNC((*close_cb));\n\n    /* State variables used in libssh2_channel_setenv_ex() */\n    libssh2_nonblocking_states setenv_state;\n    unsigned char *setenv_packet;\n    size_t setenv_packet_len;\n    unsigned char setenv_local_channel[4];\n    packet_requirev_state_t setenv_packet_requirev_state;\n\n    /* State variables used in libssh2_channel_request_pty_ex()\n       libssh2_channel_request_pty_size_ex() */\n    libssh2_nonblocking_states reqPTY_state;\n    unsigned char reqPTY_packet[41 + 256];\n    size_t reqPTY_packet_len;\n    unsigned char reqPTY_local_channel[4];\n    packet_requirev_state_t reqPTY_packet_requirev_state;\n\n    /* State variables used in libssh2_channel_x11_req_ex() */\n    libssh2_nonblocking_states reqX11_state;\n    unsigned char *reqX11_packet;\n    size_t reqX11_packet_len;\n    unsigned char reqX11_local_channel[4];\n    packet_requirev_state_t reqX11_packet_requirev_state;\n\n    /* State variables used in libssh2_channel_process_startup() */\n    libssh2_nonblocking_states process_state;\n    unsigned char *process_packet;\n    size_t process_packet_len;\n    unsigned char process_local_channel[4];\n    packet_requirev_state_t process_packet_requirev_state;\n\n    /* State variables used in libssh2_channel_flush_ex() */\n    libssh2_nonblocking_states flush_state;\n    size_t flush_refund_bytes;\n    size_t flush_flush_bytes;\n\n    /* State variables used in libssh2_channel_receive_window_adjust() */\n    libssh2_nonblocking_states adjust_state;\n    unsigned char adjust_adjust[9];     /* packet_type(1) + channel(4) + adjustment(4) */\n\n    /* State variables used in libssh2_channel_read_ex() */\n    libssh2_nonblocking_states read_state;\n\n    uint32_t read_local_id;\n\n    /* State variables used in libssh2_channel_write_ex() */\n    libssh2_nonblocking_states write_state;\n    unsigned char write_packet[13];\n    size_t write_packet_len;\n    size_t write_bufwrite;\n\n    /* State variables used in libssh2_channel_close() */\n    libssh2_nonblocking_states close_state;\n    unsigned char close_packet[5];\n\n    /* State variables used in libssh2_channel_wait_closedeof() */\n    libssh2_nonblocking_states wait_eof_state;\n\n    /* State variables used in libssh2_channel_wait_closed() */\n    libssh2_nonblocking_states wait_closed_state;\n\n    /* State variables used in libssh2_channel_free() */\n    libssh2_nonblocking_states free_state;\n\n    /* State variables used in libssh2_channel_handle_extended_data2() */\n    libssh2_nonblocking_states extData2_state;\n\n};\n\nstruct _LIBSSH2_LISTENER\n{\n    struct list_node node; /* linked list header */\n\n    LIBSSH2_SESSION *session;\n\n    char *host;\n    int port;\n\n    /* a list of CHANNELs for this listener */\n    struct list_head queue;\n\n    int queue_size;\n    int queue_maxsize;\n\n    /* State variables used in libssh2_channel_forward_cancel() */\n    libssh2_nonblocking_states chanFwdCncl_state;\n    unsigned char *chanFwdCncl_data;\n    size_t chanFwdCncl_data_len;\n};\n\ntypedef struct _libssh2_endpoint_data\n{\n    unsigned char *banner;\n\n    unsigned char *kexinit;\n    size_t kexinit_len;\n\n    const LIBSSH2_CRYPT_METHOD *crypt;\n    void *crypt_abstract;\n\n    const struct _LIBSSH2_MAC_METHOD *mac;\n    uint32_t seqno;\n    void *mac_abstract;\n\n    const LIBSSH2_COMP_METHOD *comp;\n    void *comp_abstract;\n\n    /* Method Preferences -- NULL yields \"load order\" */\n    char *crypt_prefs;\n    char *mac_prefs;\n    char *comp_prefs;\n    char *lang_prefs;\n} libssh2_endpoint_data;\n\n#define PACKETBUFSIZE (1024*16)\n\nstruct transportpacket\n{\n    /* ------------- for incoming data --------------- */\n    unsigned char buf[PACKETBUFSIZE];\n    unsigned char init[5];  /* first 5 bytes of the incoming data stream,\n                               still encrypted */\n    size_t writeidx;        /* at what array index we do the next write into\n                               the buffer */\n    size_t readidx;         /* at what array index we do the next read from\n                               the buffer */\n    uint32_t packet_length; /* the most recent packet_length as read from the\n                               network data */\n    uint8_t padding_length; /* the most recent padding_length as read from the\n                               network data */\n    size_t data_num;        /* How much of the total package that has been read\n                               so far. */\n    size_t total_num;       /* How much a total package is supposed to be, in\n                               number of bytes. A full package is\n                               packet_length + padding_length + 4 +\n                               mac_length. */\n    unsigned char *payload; /* this is a pointer to a LIBSSH2_ALLOC()\n                               area to which we write decrypted data */\n    unsigned char *wptr;    /* write pointer into the payload to where we\n                               are currently writing decrypted data */\n\n    /* ------------- for outgoing data --------------- */\n    unsigned char outbuf[MAX_SSH_PACKET_LEN]; /* area for the outgoing data */\n\n    int ototal_num;         /* size of outbuf in number of bytes */\n    const unsigned char *odata; /* original pointer to the data */\n    size_t olen;            /* original size of the data we stored in\n                               outbuf */\n    size_t osent;           /* number of bytes already sent */\n};\n\nstruct _LIBSSH2_PUBLICKEY\n{\n    LIBSSH2_CHANNEL *channel;\n    uint32_t version;\n\n    /* State variables used in libssh2_publickey_packet_receive() */\n    libssh2_nonblocking_states receive_state;\n    unsigned char *receive_packet;\n    size_t receive_packet_len;\n\n    /* State variables used in libssh2_publickey_add_ex() */\n    libssh2_nonblocking_states add_state;\n    unsigned char *add_packet;\n    unsigned char *add_s;\n\n    /* State variables used in libssh2_publickey_remove_ex() */\n    libssh2_nonblocking_states remove_state;\n    unsigned char *remove_packet;\n    unsigned char *remove_s;\n\n    /* State variables used in libssh2_publickey_list_fetch() */\n    libssh2_nonblocking_states listFetch_state;\n    unsigned char *listFetch_s;\n    unsigned char listFetch_buffer[12];\n    unsigned char *listFetch_data;\n    size_t listFetch_data_len;\n};\n\n#define LIBSSH2_SCP_RESPONSE_BUFLEN     256\n\nstruct flags {\n    int sigpipe;  /* LIBSSH2_FLAG_SIGPIPE */\n    int compress; /* LIBSSH2_FLAG_COMPRESS */\n};\n\nstruct _LIBSSH2_SESSION\n{\n    /* Memory management callbacks */\n    void *abstract;\n      LIBSSH2_ALLOC_FUNC((*alloc));\n      LIBSSH2_REALLOC_FUNC((*realloc));\n      LIBSSH2_FREE_FUNC((*free));\n\n    /* Other callbacks */\n      LIBSSH2_IGNORE_FUNC((*ssh_msg_ignore));\n      LIBSSH2_DEBUG_FUNC((*ssh_msg_debug));\n      LIBSSH2_DISCONNECT_FUNC((*ssh_msg_disconnect));\n      LIBSSH2_MACERROR_FUNC((*macerror));\n      LIBSSH2_X11_OPEN_FUNC((*x11));\n      LIBSSH2_SEND_FUNC((*send));\n      LIBSSH2_RECV_FUNC((*recv));\n\n    /* Method preferences -- NULL yields \"load order\" */\n    char *kex_prefs;\n    char *hostkey_prefs;\n\n    int state;\n\n    /* Flag options */\n    struct flags flag;\n\n    /* Agreed Key Exchange Method */\n    const LIBSSH2_KEX_METHOD *kex;\n    unsigned int burn_optimistic_kexinit:1;\n\n    unsigned char *session_id;\n    uint32_t session_id_len;\n\n    /* this is set to TRUE if a blocking API behavior is requested */\n    int api_block_mode;\n\n    /* Timeout used when blocking API behavior is active */\n    long api_timeout;\n\n    /* Server's public key */\n    const LIBSSH2_HOSTKEY_METHOD *hostkey;\n    void *server_hostkey_abstract;\n\n    /* Either set with libssh2_session_hostkey() (for server mode)\n     * Or read from server in (eg) KEXDH_INIT (for client mode)\n     */\n    unsigned char *server_hostkey;\n    uint32_t server_hostkey_len;\n#if LIBSSH2_MD5\n    unsigned char server_hostkey_md5[MD5_DIGEST_LENGTH];\n    int server_hostkey_md5_valid;\n#endif                          /* ! LIBSSH2_MD5 */\n    unsigned char server_hostkey_sha1[SHA_DIGEST_LENGTH];\n    int server_hostkey_sha1_valid;\n\n    /* (remote as source of data -- packet_read ) */\n    libssh2_endpoint_data remote;\n\n    /* (local as source of data -- packet_write ) */\n    libssh2_endpoint_data local;\n\n    /* Inbound Data linked list -- Sometimes the packet that comes in isn't the\n       packet we're ready for */\n    struct list_head packets;\n\n    /* Active connection channels */\n    struct list_head channels;\n\n    uint32_t next_channel;\n\n    struct list_head listeners; /* list of LIBSSH2_LISTENER structs */\n\n    /* Actual I/O socket */\n    libssh2_socket_t socket_fd;\n    int socket_state;\n    int socket_block_directions;\n    int socket_prev_blockstate; /* stores the state of the socket blockiness\n                                   when libssh2_session_startup() is called */\n\n    /* Error tracking */\n    const char *err_msg;\n    int err_code;\n    int err_flags;\n\n    /* struct members for packet-level reading */\n    struct transportpacket packet;\n#ifdef LIBSSH2DEBUG\n    int showmask;               /* what debug/trace messages to display */\n    libssh2_trace_handler_func tracehandler; /* callback to display trace messages */\n    void* tracehandler_context; /* context for the trace handler */\n#endif\n\n    /* State variables used in libssh2_banner_send() */\n    libssh2_nonblocking_states banner_TxRx_state;\n    char banner_TxRx_banner[256];\n    ssize_t banner_TxRx_total_send;\n\n    /* State variables used in libssh2_kexinit() */\n    libssh2_nonblocking_states kexinit_state;\n    unsigned char *kexinit_data;\n    size_t kexinit_data_len;\n\n    /* State variables used in libssh2_session_startup() */\n    libssh2_nonblocking_states startup_state;\n    unsigned char *startup_data;\n    size_t startup_data_len;\n    unsigned char startup_service[sizeof(\"ssh-userauth\") + 5 - 1];\n    size_t startup_service_length;\n    packet_require_state_t startup_req_state;\n    key_exchange_state_t startup_key_state;\n\n    /* State variables used in libssh2_session_free() */\n    libssh2_nonblocking_states free_state;\n\n    /* State variables used in libssh2_session_disconnect_ex() */\n    libssh2_nonblocking_states disconnect_state;\n    unsigned char disconnect_data[256 + 13];\n    size_t disconnect_data_len;\n\n    /* State variables used in libssh2_packet_read() */\n    libssh2_nonblocking_states readPack_state;\n    int readPack_encrypted;\n\n    /* State variables used in libssh2_userauth_list() */\n    libssh2_nonblocking_states userauth_list_state;\n    unsigned char *userauth_list_data;\n    size_t userauth_list_data_len;\n    packet_requirev_state_t userauth_list_packet_requirev_state;\n\n    /* State variables used in libssh2_userauth_password_ex() */\n    libssh2_nonblocking_states userauth_pswd_state;\n    unsigned char *userauth_pswd_data;\n    unsigned char userauth_pswd_data0;\n    size_t userauth_pswd_data_len;\n    char *userauth_pswd_newpw;\n    int userauth_pswd_newpw_len;\n    packet_requirev_state_t userauth_pswd_packet_requirev_state;\n\n    /* State variables used in libssh2_userauth_hostbased_fromfile_ex() */\n    libssh2_nonblocking_states userauth_host_state;\n    unsigned char *userauth_host_data;\n    size_t userauth_host_data_len;\n    unsigned char *userauth_host_packet;\n    size_t userauth_host_packet_len;\n    unsigned char *userauth_host_method;\n    size_t userauth_host_method_len;\n    unsigned char *userauth_host_s;\n    packet_requirev_state_t userauth_host_packet_requirev_state;\n\n    /* State variables used in libssh2_userauth_publickey_fromfile_ex() */\n    libssh2_nonblocking_states userauth_pblc_state;\n    unsigned char *userauth_pblc_data;\n    size_t userauth_pblc_data_len;\n    unsigned char *userauth_pblc_packet;\n    size_t userauth_pblc_packet_len;\n    unsigned char *userauth_pblc_method;\n    size_t userauth_pblc_method_len;\n    unsigned char *userauth_pblc_s;\n    unsigned char *userauth_pblc_b;\n    packet_requirev_state_t userauth_pblc_packet_requirev_state;\n\n    /* State variables used in libssh2_userauth_keyboard_interactive_ex() */\n    libssh2_nonblocking_states userauth_kybd_state;\n    unsigned char *userauth_kybd_data;\n    size_t userauth_kybd_data_len;\n    unsigned char *userauth_kybd_packet;\n    size_t userauth_kybd_packet_len;\n    unsigned int userauth_kybd_auth_name_len;\n    char *userauth_kybd_auth_name;\n    unsigned userauth_kybd_auth_instruction_len;\n    char *userauth_kybd_auth_instruction;\n    unsigned int userauth_kybd_num_prompts;\n    int userauth_kybd_auth_failure;\n    LIBSSH2_USERAUTH_KBDINT_PROMPT *userauth_kybd_prompts;\n    LIBSSH2_USERAUTH_KBDINT_RESPONSE *userauth_kybd_responses;\n    packet_requirev_state_t userauth_kybd_packet_requirev_state;\n\n    /* State variables used in libssh2_channel_open_ex() */\n    libssh2_nonblocking_states open_state;\n    packet_requirev_state_t open_packet_requirev_state;\n    LIBSSH2_CHANNEL *open_channel;\n    unsigned char *open_packet;\n    size_t open_packet_len;\n    unsigned char *open_data;\n    size_t open_data_len;\n    uint32_t open_local_channel;\n\n    /* State variables used in libssh2_channel_direct_tcpip_ex() */\n    libssh2_nonblocking_states direct_state;\n    unsigned char *direct_message;\n    size_t direct_host_len;\n    size_t direct_shost_len;\n    size_t direct_message_len;\n\n    /* State variables used in libssh2_channel_forward_listen_ex() */\n    libssh2_nonblocking_states fwdLstn_state;\n    unsigned char *fwdLstn_packet;\n    uint32_t fwdLstn_host_len;\n    uint32_t fwdLstn_packet_len;\n    packet_requirev_state_t fwdLstn_packet_requirev_state;\n\n    /* State variables used in libssh2_publickey_init() */\n    libssh2_nonblocking_states pkeyInit_state;\n    LIBSSH2_PUBLICKEY *pkeyInit_pkey;\n    LIBSSH2_CHANNEL *pkeyInit_channel;\n    unsigned char *pkeyInit_data;\n    size_t pkeyInit_data_len;\n    /* 19 = packet_len(4) + version_len(4) + \"version\"(7) + version_num(4) */\n    unsigned char pkeyInit_buffer[19];\n    size_t pkeyInit_buffer_sent; /* how much of buffer that has been sent */\n\n    /* State variables used in libssh2_packet_add() */\n    libssh2_nonblocking_states packAdd_state;\n    LIBSSH2_CHANNEL *packAdd_channelp; /* keeper of the channel during EAGAIN\n                                          states */\n    packet_queue_listener_state_t packAdd_Qlstn_state;\n    packet_x11_open_state_t packAdd_x11open_state;\n\n    /* State variables used in fullpacket() */\n    libssh2_nonblocking_states fullpacket_state;\n    int fullpacket_macstate;\n    size_t fullpacket_payload_len;\n    int fullpacket_packet_type;\n\n    /* State variables used in libssh2_sftp_init() */\n    libssh2_nonblocking_states sftpInit_state;\n    LIBSSH2_SFTP *sftpInit_sftp;\n    LIBSSH2_CHANNEL *sftpInit_channel;\n    unsigned char sftpInit_buffer[9];   /* sftp_header(5){excludes request_id}\n                                           + version_id(4) */\n    int sftpInit_sent; /* number of bytes from the buffer that have been\n                          sent */\n\n    /* State variables used in libssh2_scp_recv() / libssh_scp_recv2() */\n    libssh2_nonblocking_states scpRecv_state;\n    unsigned char *scpRecv_command;\n    size_t scpRecv_command_len;\n    unsigned char scpRecv_response[LIBSSH2_SCP_RESPONSE_BUFLEN];\n    size_t scpRecv_response_len;\n    long scpRecv_mode;\n#if defined(HAVE_LONGLONG) && defined(HAVE_STRTOLL)\n    /* we have the type and we can parse such numbers */\n    long long scpRecv_size;\n#define scpsize_strtol strtoll\n#elif defined(HAVE_STRTOI64)\n    __int64 scpRecv_size;\n#define scpsize_strtol _strtoi64\n#else\n    long scpRecv_size;\n#define scpsize_strtol strtol\n#endif\n    long scpRecv_mtime;\n    long scpRecv_atime;\n    LIBSSH2_CHANNEL *scpRecv_channel;\n\n    /* State variables used in libssh2_scp_send_ex() */\n    libssh2_nonblocking_states scpSend_state;\n    unsigned char *scpSend_command;\n    size_t scpSend_command_len;\n    unsigned char scpSend_response[LIBSSH2_SCP_RESPONSE_BUFLEN];\n    size_t scpSend_response_len;\n    LIBSSH2_CHANNEL *scpSend_channel;\n\n    /* Keepalive variables used by keepalive.c. */\n    int keepalive_interval;\n    int keepalive_want_reply;\n    time_t keepalive_last_sent;\n};\n\n/* session.state bits */\n#define LIBSSH2_STATE_EXCHANGING_KEYS   0x00000001\n#define LIBSSH2_STATE_NEWKEYS           0x00000002\n#define LIBSSH2_STATE_AUTHENTICATED     0x00000004\n#define LIBSSH2_STATE_KEX_ACTIVE        0x00000008\n\n/* session.flag helpers */\n#ifdef MSG_NOSIGNAL\n#define LIBSSH2_SOCKET_SEND_FLAGS(session)              \\\n    (((session)->flag.sigpipe) ? 0 : MSG_NOSIGNAL)\n#define LIBSSH2_SOCKET_RECV_FLAGS(session)              \\\n    (((session)->flag.sigpipe) ? 0 : MSG_NOSIGNAL)\n#else\n/* If MSG_NOSIGNAL isn't defined we're SOL on blocking SIGPIPE */\n#define LIBSSH2_SOCKET_SEND_FLAGS(session)      0\n#define LIBSSH2_SOCKET_RECV_FLAGS(session)      0\n#endif\n\n/* --------- */\n\n/* libssh2 extensible ssh api, ultimately I'd like to allow loading additional\n   methods via .so/.dll */\n\nstruct _LIBSSH2_KEX_METHOD\n{\n    const char *name;\n\n    /* Key exchange, populates session->* and returns 0 on success, non-0 on error */\n    int (*exchange_keys) (LIBSSH2_SESSION * session,\n                          key_exchange_state_low_t * key_state);\n\n    long flags;\n};\n\nstruct _LIBSSH2_HOSTKEY_METHOD\n{\n    const char *name;\n    unsigned long hash_len;\n\n    int (*init) (LIBSSH2_SESSION * session, const unsigned char *hostkey_data,\n                 size_t hostkey_data_len, void **abstract);\n    int (*initPEM) (LIBSSH2_SESSION * session, const char *privkeyfile,\n                    unsigned const char *passphrase, void **abstract);\n    int (*initPEMFromMemory) (LIBSSH2_SESSION * session,\n                              const char *privkeyfiledata, size_t privkeyfiledata_len,\n                              unsigned const char *passphrase, void **abstract);\n    int (*sig_verify) (LIBSSH2_SESSION * session, const unsigned char *sig,\n                       size_t sig_len, const unsigned char *m,\n                       size_t m_len, void **abstract);\n    int (*signv) (LIBSSH2_SESSION * session, unsigned char **signature,\n                  size_t *signature_len, int veccount,\n                  const struct iovec datavec[], void **abstract);\n    int (*encrypt) (LIBSSH2_SESSION * session, unsigned char **dst,\n                    size_t *dst_len, const unsigned char *src,\n                    size_t src_len, void **abstract);\n    int (*dtor) (LIBSSH2_SESSION * session, void **abstract);\n};\n\nstruct _LIBSSH2_CRYPT_METHOD\n{\n    const char *name;\n\n    int blocksize;\n\n    /* iv and key sizes (-1 for variable length) */\n    int iv_len;\n    int secret_len;\n\n    long flags;\n\n    int (*init) (LIBSSH2_SESSION * session,\n                 const LIBSSH2_CRYPT_METHOD * method, unsigned char *iv,\n                 int *free_iv, unsigned char *secret, int *free_secret,\n                 int encrypt, void **abstract);\n    int (*crypt) (LIBSSH2_SESSION * session, unsigned char *block,\n                  size_t blocksize, void **abstract);\n    int (*dtor) (LIBSSH2_SESSION * session, void **abstract);\n\n      _libssh2_cipher_type(algo);\n};\n\nstruct _LIBSSH2_COMP_METHOD\n{\n    const char *name;\n    int compress; /* 1 if it does compress, 0 if it doesn't */\n    int use_in_auth; /* 1 if compression should be used in userauth */\n    int (*init) (LIBSSH2_SESSION *session, int compress, void **abstract);\n    int (*comp) (LIBSSH2_SESSION *session,\n                 unsigned char *dest,\n                 size_t *dest_len,\n                 const unsigned char *src,\n                 size_t src_len,\n                 void **abstract);\n    int (*decomp) (LIBSSH2_SESSION *session,\n                   unsigned char **dest,\n                   size_t *dest_len,\n                   size_t payload_limit,\n                   const unsigned char *src,\n                   size_t src_len,\n                   void **abstract);\n    int (*dtor) (LIBSSH2_SESSION * session, int compress, void **abstract);\n};\n\n#ifdef LIBSSH2DEBUG\nvoid _libssh2_debug(LIBSSH2_SESSION * session, int context, const char *format,\n                    ...);\n#else\n#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || defined(__GNUC__)\n/* C99 supported and also by older GCC */\n#define _libssh2_debug(x,y,z,...) do {} while (0)\n#else\n/* no gcc and not C99, do static and hopefully inline */\nstatic inline void\n_libssh2_debug(LIBSSH2_SESSION * session, int context, const char *format, ...)\n{\n    (void)session;\n    (void)context;\n    (void)format;\n}\n#endif\n#endif\n\n#define LIBSSH2_SOCKET_UNKNOWN                   1\n#define LIBSSH2_SOCKET_CONNECTED                 0\n#define LIBSSH2_SOCKET_DISCONNECTED             -1\n\n/* Initial packet state, prior to MAC check */\n#define LIBSSH2_MAC_UNCONFIRMED                  1\n/* When MAC type is \"none\" (proto initiation phase) all packets are deemed \"confirmed\" */\n#define LIBSSH2_MAC_CONFIRMED                    0\n/* Something very bad is going on */\n#define LIBSSH2_MAC_INVALID                     -1\n\n/* Flags for _libssh2_error_flags */\n/* Error message is allocated on the heap */\n#define LIBSSH2_ERR_FLAG_DUP                     1\n\n/* SSH Packet Types -- Defined by internet draft */\n/* Transport Layer */\n#define SSH_MSG_DISCONNECT                          1\n#define SSH_MSG_IGNORE                              2\n#define SSH_MSG_UNIMPLEMENTED                       3\n#define SSH_MSG_DEBUG                               4\n#define SSH_MSG_SERVICE_REQUEST                     5\n#define SSH_MSG_SERVICE_ACCEPT                      6\n\n#define SSH_MSG_KEXINIT                             20\n#define SSH_MSG_NEWKEYS                             21\n\n/* diffie-hellman-group1-sha1 */\n#define SSH_MSG_KEXDH_INIT                          30\n#define SSH_MSG_KEXDH_REPLY                         31\n\n/* diffie-hellman-group-exchange-sha1 and diffie-hellman-group-exchange-sha256 */\n#define SSH_MSG_KEX_DH_GEX_REQUEST_OLD              30\n#define SSH_MSG_KEX_DH_GEX_REQUEST                  34\n#define SSH_MSG_KEX_DH_GEX_GROUP                    31\n#define SSH_MSG_KEX_DH_GEX_INIT                     32\n#define SSH_MSG_KEX_DH_GEX_REPLY                    33\n\n/* User Authentication */\n#define SSH_MSG_USERAUTH_REQUEST                    50\n#define SSH_MSG_USERAUTH_FAILURE                    51\n#define SSH_MSG_USERAUTH_SUCCESS                    52\n#define SSH_MSG_USERAUTH_BANNER                     53\n\n/* \"public key\" method */\n#define SSH_MSG_USERAUTH_PK_OK                      60\n/* \"password\" method */\n#define SSH_MSG_USERAUTH_PASSWD_CHANGEREQ           60\n/* \"keyboard-interactive\" method */\n#define SSH_MSG_USERAUTH_INFO_REQUEST               60\n#define SSH_MSG_USERAUTH_INFO_RESPONSE              61\n\n/* Channels */\n#define SSH_MSG_GLOBAL_REQUEST                      80\n#define SSH_MSG_REQUEST_SUCCESS                     81\n#define SSH_MSG_REQUEST_FAILURE                     82\n\n#define SSH_MSG_CHANNEL_OPEN                        90\n#define SSH_MSG_CHANNEL_OPEN_CONFIRMATION           91\n#define SSH_MSG_CHANNEL_OPEN_FAILURE                92\n#define SSH_MSG_CHANNEL_WINDOW_ADJUST               93\n#define SSH_MSG_CHANNEL_DATA                        94\n#define SSH_MSG_CHANNEL_EXTENDED_DATA               95\n#define SSH_MSG_CHANNEL_EOF                         96\n#define SSH_MSG_CHANNEL_CLOSE                       97\n#define SSH_MSG_CHANNEL_REQUEST                     98\n#define SSH_MSG_CHANNEL_SUCCESS                     99\n#define SSH_MSG_CHANNEL_FAILURE                     100\n\n/* Error codes returned in SSH_MSG_CHANNEL_OPEN_FAILURE message\n   (see RFC4254) */\n#define SSH_OPEN_ADMINISTRATIVELY_PROHIBITED 1\n#define SSH_OPEN_CONNECT_FAILED              2\n#define SSH_OPEN_UNKNOWN_CHANNELTYPE         3\n#define SSH_OPEN_RESOURCE_SHORTAGE           4\n\nssize_t _libssh2_recv(libssh2_socket_t socket, void *buffer,\n                      size_t length, int flags, void **abstract);\nssize_t _libssh2_send(libssh2_socket_t socket, const void *buffer,\n                      size_t length, int flags, void **abstract);\n\n#define LIBSSH2_READ_TIMEOUT 60 /* generic timeout in seconds used when\n                                   waiting for more data to arrive */\n\n\nint _libssh2_kex_exchange(LIBSSH2_SESSION * session, int reexchange,\n                          key_exchange_state_t * state);\n\n/* Let crypt.c/hostkey.c expose their method structs */\nconst LIBSSH2_CRYPT_METHOD **libssh2_crypt_methods(void);\nconst LIBSSH2_HOSTKEY_METHOD **libssh2_hostkey_methods(void);\n\n/* pem.c */\nint _libssh2_pem_parse(LIBSSH2_SESSION * session,\n                       const char *headerbegin,\n                       const char *headerend,\n                       FILE * fp, unsigned char **data, unsigned int *datalen);\nint _libssh2_pem_parse_memory(LIBSSH2_SESSION * session,\n                              const char *headerbegin,\n                              const char *headerend,\n                              const char *filedata, size_t filedata_len,\n                              unsigned char **data, unsigned int *datalen);\nint _libssh2_pem_decode_sequence(unsigned char **data, unsigned int *datalen);\nint _libssh2_pem_decode_integer(unsigned char **data, unsigned int *datalen,\n                                unsigned char **i, unsigned int *ilen);\n\n/* global.c */\nvoid _libssh2_init_if_needed (void);\n\n\n#define ARRAY_SIZE(a) (sizeof ((a)) / sizeof ((a)[0]))\n\n/* define to output the libssh2_int64_t type in a *printf() */\n#if defined( __BORLANDC__ ) || defined( _MSC_VER ) || defined( __MINGW32__ )\n#define LIBSSH2_INT64_T_FORMAT \"I64d\"\n#else\n#define LIBSSH2_INT64_T_FORMAT \"lld\"\n#endif\n\n#endif /* LIBSSH2_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/mac.c",
    "content": "/* Copyright (c) 2004-2007, Sara Golemon <sarag@libssh2.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include \"mac.h\"\n\n#ifdef LIBSSH2_MAC_NONE\n/* mac_none_MAC\n * Minimalist MAC: No MAC\n */\nstatic int\nmac_none_MAC(LIBSSH2_SESSION * session, unsigned char *buf,\n             uint32_t seqno, const unsigned char *packet,\n             uint32_t packet_len, const unsigned char *addtl,\n             uint32_t addtl_len, void **abstract)\n{\n    return 0;\n}\n\n\n\n\nstatic LIBSSH2_MAC_METHOD mac_method_none = {\n    \"none\",\n    0,\n    0,\n    NULL,\n    mac_none_MAC,\n    NULL\n};\n#endif /* LIBSSH2_MAC_NONE */\n\n/* mac_method_common_init\n * Initialize simple mac methods\n */\nstatic int\nmac_method_common_init(LIBSSH2_SESSION * session, unsigned char *key,\n                       int *free_key, void **abstract)\n{\n    *abstract = key;\n    *free_key = 0;\n    (void) session;\n\n    return 0;\n}\n\n\n\n/* mac_method_common_dtor\n * Cleanup simple mac methods\n */\nstatic int\nmac_method_common_dtor(LIBSSH2_SESSION * session, void **abstract)\n{\n    if (*abstract) {\n        LIBSSH2_FREE(session, *abstract);\n    }\n    *abstract = NULL;\n\n    return 0;\n}\n\n\n\n#if LIBSSH2_HMAC_SHA512\n/* mac_method_hmac_sha512_hash\n * Calculate hash using full sha512 value\n */\nstatic int\nmac_method_hmac_sha2_512_hash(LIBSSH2_SESSION * session,\n                          unsigned char *buf, uint32_t seqno,\n                          const unsigned char *packet,\n                          uint32_t packet_len,\n                          const unsigned char *addtl,\n                          uint32_t addtl_len, void **abstract)\n{\n    libssh2_hmac_ctx ctx;\n    unsigned char seqno_buf[4];\n    (void) session;\n\n    _libssh2_htonu32(seqno_buf, seqno);\n\n    libssh2_hmac_ctx_init(ctx);\n    libssh2_hmac_sha512_init(&ctx, *abstract, 64);\n    libssh2_hmac_update(ctx, seqno_buf, 4);\n    libssh2_hmac_update(ctx, packet, packet_len);\n    if (addtl && addtl_len) {\n        libssh2_hmac_update(ctx, addtl, addtl_len);\n    }\n    libssh2_hmac_final(ctx, buf);\n    libssh2_hmac_cleanup(&ctx);\n\n    return 0;\n}\n\n\n\nstatic const LIBSSH2_MAC_METHOD mac_method_hmac_sha2_512 = {\n    \"hmac-sha2-512\",\n    64,\n    64,\n    mac_method_common_init,\n    mac_method_hmac_sha2_512_hash,\n    mac_method_common_dtor,\n};\n#endif\n\n\n\n#if LIBSSH2_HMAC_SHA256\n/* mac_method_hmac_sha256_hash\n * Calculate hash using full sha256 value\n */\nstatic int\nmac_method_hmac_sha2_256_hash(LIBSSH2_SESSION * session,\n                          unsigned char *buf, uint32_t seqno,\n                          const unsigned char *packet,\n                          uint32_t packet_len,\n                          const unsigned char *addtl,\n                          uint32_t addtl_len, void **abstract)\n{\n    libssh2_hmac_ctx ctx;\n    unsigned char seqno_buf[4];\n    (void) session;\n\n    _libssh2_htonu32(seqno_buf, seqno);\n\n    libssh2_hmac_ctx_init(ctx);\n    libssh2_hmac_sha256_init(&ctx, *abstract, 32);\n    libssh2_hmac_update(ctx, seqno_buf, 4);\n    libssh2_hmac_update(ctx, packet, packet_len);\n    if (addtl && addtl_len) {\n        libssh2_hmac_update(ctx, addtl, addtl_len);\n    }\n    libssh2_hmac_final(ctx, buf);\n    libssh2_hmac_cleanup(&ctx);\n\n    return 0;\n}\n\n\n\nstatic const LIBSSH2_MAC_METHOD mac_method_hmac_sha2_256 = {\n    \"hmac-sha2-256\",\n    32,\n    32,\n    mac_method_common_init,\n    mac_method_hmac_sha2_256_hash,\n    mac_method_common_dtor,\n};\n#endif\n\n\n\n\n/* mac_method_hmac_sha1_hash\n * Calculate hash using full sha1 value\n */\nstatic int\nmac_method_hmac_sha1_hash(LIBSSH2_SESSION * session,\n                          unsigned char *buf, uint32_t seqno,\n                          const unsigned char *packet,\n                          uint32_t packet_len,\n                          const unsigned char *addtl,\n                          uint32_t addtl_len, void **abstract)\n{\n    libssh2_hmac_ctx ctx;\n    unsigned char seqno_buf[4];\n    (void) session;\n\n    _libssh2_htonu32(seqno_buf, seqno);\n\n    libssh2_hmac_ctx_init(ctx);\n    libssh2_hmac_sha1_init(&ctx, *abstract, 20);\n    libssh2_hmac_update(ctx, seqno_buf, 4);\n    libssh2_hmac_update(ctx, packet, packet_len);\n    if (addtl && addtl_len) {\n        libssh2_hmac_update(ctx, addtl, addtl_len);\n    }\n    libssh2_hmac_final(ctx, buf);\n    libssh2_hmac_cleanup(&ctx);\n\n    return 0;\n}\n\n\n\nstatic const LIBSSH2_MAC_METHOD mac_method_hmac_sha1 = {\n    \"hmac-sha1\",\n    20,\n    20,\n    mac_method_common_init,\n    mac_method_hmac_sha1_hash,\n    mac_method_common_dtor,\n};\n\n/* mac_method_hmac_sha1_96_hash\n * Calculate hash using first 96 bits of sha1 value\n */\nstatic int\nmac_method_hmac_sha1_96_hash(LIBSSH2_SESSION * session,\n                             unsigned char *buf, uint32_t seqno,\n                             const unsigned char *packet,\n                             uint32_t packet_len,\n                             const unsigned char *addtl,\n                             uint32_t addtl_len, void **abstract)\n{\n    unsigned char temp[SHA_DIGEST_LENGTH];\n\n    mac_method_hmac_sha1_hash(session, temp, seqno, packet, packet_len,\n                              addtl, addtl_len, abstract);\n    memcpy(buf, (char *) temp, 96 / 8);\n\n    return 0;\n}\n\n\n\nstatic const LIBSSH2_MAC_METHOD mac_method_hmac_sha1_96 = {\n    \"hmac-sha1-96\",\n    12,\n    20,\n    mac_method_common_init,\n    mac_method_hmac_sha1_96_hash,\n    mac_method_common_dtor,\n};\n\n#if LIBSSH2_MD5\n/* mac_method_hmac_md5_hash\n * Calculate hash using full md5 value\n */\nstatic int\nmac_method_hmac_md5_hash(LIBSSH2_SESSION * session, unsigned char *buf,\n                         uint32_t seqno,\n                         const unsigned char *packet,\n                         uint32_t packet_len,\n                         const unsigned char *addtl,\n                         uint32_t addtl_len, void **abstract)\n{\n    libssh2_hmac_ctx ctx;\n    unsigned char seqno_buf[4];\n    (void) session;\n\n    _libssh2_htonu32(seqno_buf, seqno);\n\n    libssh2_hmac_ctx_init(ctx);\n    libssh2_hmac_md5_init(&ctx, *abstract, 16);\n    libssh2_hmac_update(ctx, seqno_buf, 4);\n    libssh2_hmac_update(ctx, packet, packet_len);\n    if (addtl && addtl_len) {\n        libssh2_hmac_update(ctx, addtl, addtl_len);\n    }\n    libssh2_hmac_final(ctx, buf);\n    libssh2_hmac_cleanup(&ctx);\n\n    return 0;\n}\n\n\n\nstatic const LIBSSH2_MAC_METHOD mac_method_hmac_md5 = {\n    \"hmac-md5\",\n    16,\n    16,\n    mac_method_common_init,\n    mac_method_hmac_md5_hash,\n    mac_method_common_dtor,\n};\n\n/* mac_method_hmac_md5_96_hash\n * Calculate hash using first 96 bits of md5 value\n */\nstatic int\nmac_method_hmac_md5_96_hash(LIBSSH2_SESSION * session,\n                            unsigned char *buf, uint32_t seqno,\n                            const unsigned char *packet,\n                            uint32_t packet_len,\n                            const unsigned char *addtl,\n                            uint32_t addtl_len, void **abstract)\n{\n    unsigned char temp[MD5_DIGEST_LENGTH];\n    mac_method_hmac_md5_hash(session, temp, seqno, packet, packet_len,\n                             addtl, addtl_len, abstract);\n    memcpy(buf, (char *) temp, 96 / 8);\n    return 0;\n}\n\n\n\nstatic const LIBSSH2_MAC_METHOD mac_method_hmac_md5_96 = {\n    \"hmac-md5-96\",\n    12,\n    16,\n    mac_method_common_init,\n    mac_method_hmac_md5_96_hash,\n    mac_method_common_dtor,\n};\n#endif /* LIBSSH2_MD5 */\n\n#if LIBSSH2_HMAC_RIPEMD\n/* mac_method_hmac_ripemd160_hash\n * Calculate hash using ripemd160 value\n */\nstatic int\nmac_method_hmac_ripemd160_hash(LIBSSH2_SESSION * session,\n                               unsigned char *buf, uint32_t seqno,\n                               const unsigned char *packet,\n                               uint32_t packet_len,\n                               const unsigned char *addtl,\n                               uint32_t addtl_len,\n                               void **abstract)\n{\n    libssh2_hmac_ctx ctx;\n    unsigned char seqno_buf[4];\n    (void) session;\n\n    _libssh2_htonu32(seqno_buf, seqno);\n\n    libssh2_hmac_ctx_init(ctx);\n    libssh2_hmac_ripemd160_init(&ctx, *abstract, 20);\n    libssh2_hmac_update(ctx, seqno_buf, 4);\n    libssh2_hmac_update(ctx, packet, packet_len);\n    if (addtl && addtl_len) {\n        libssh2_hmac_update(ctx, addtl, addtl_len);\n    }\n    libssh2_hmac_final(ctx, buf);\n    libssh2_hmac_cleanup(&ctx);\n\n    return 0;\n}\n\n\n\nstatic const LIBSSH2_MAC_METHOD mac_method_hmac_ripemd160 = {\n    \"hmac-ripemd160\",\n    20,\n    20,\n    mac_method_common_init,\n    mac_method_hmac_ripemd160_hash,\n    mac_method_common_dtor,\n};\n\nstatic const LIBSSH2_MAC_METHOD mac_method_hmac_ripemd160_openssh_com = {\n    \"hmac-ripemd160@openssh.com\",\n    20,\n    20,\n    mac_method_common_init,\n    mac_method_hmac_ripemd160_hash,\n    mac_method_common_dtor,\n};\n#endif /* LIBSSH2_HMAC_RIPEMD */\n\nstatic const LIBSSH2_MAC_METHOD *mac_methods[] = {\n#if LIBSSH2_HMAC_SHA256\n    &mac_method_hmac_sha2_256,\n#endif\n#if LIBSSH2_HMAC_SHA512\n    &mac_method_hmac_sha2_512,\n#endif\n    &mac_method_hmac_sha1,\n    &mac_method_hmac_sha1_96,\n#if LIBSSH2_MD5\n    &mac_method_hmac_md5,\n    &mac_method_hmac_md5_96,\n#endif\n#if LIBSSH2_HMAC_RIPEMD\n    &mac_method_hmac_ripemd160,\n    &mac_method_hmac_ripemd160_openssh_com,\n#endif /* LIBSSH2_HMAC_RIPEMD */\n#ifdef LIBSSH2_MAC_NONE\n    &mac_method_none,\n#endif /* LIBSSH2_MAC_NONE */\n    NULL\n};\n\nconst LIBSSH2_MAC_METHOD **\n_libssh2_mac_methods(void)\n{\n    return mac_methods;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/mac.h",
    "content": "#ifndef __LIBSSH2_MAC_H\n#define __LIBSSH2_MAC_H\n\n/* Copyright (C) 2009-2010 by Daniel Stenberg\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n */\n\n#include \"libssh2_priv.h\"\n\nstruct _LIBSSH2_MAC_METHOD\n{\n    const char *name;\n\n    /* The length of a given MAC packet */\n    int mac_len;\n\n    /* integrity key length */\n    int key_len;\n\n    /* Message Authentication Code Hashing algo */\n    int (*init) (LIBSSH2_SESSION * session, unsigned char *key, int *free_key,\n                 void **abstract);\n    int (*hash) (LIBSSH2_SESSION * session, unsigned char *buf,\n                 uint32_t seqno, const unsigned char *packet,\n                 uint32_t packet_len, const unsigned char *addtl,\n                 uint32_t addtl_len, void **abstract);\n    int (*dtor) (LIBSSH2_SESSION * session, void **abstract);\n};\n\ntypedef struct _LIBSSH2_MAC_METHOD LIBSSH2_MAC_METHOD;\n\nconst LIBSSH2_MAC_METHOD **_libssh2_mac_methods(void);\n\n#endif /* __LIBSSH2_MAC_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/misc.c",
    "content": "/* Copyright (c) 2004-2007 Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2009-2014 by Daniel Stenberg\n * Copyright (c) 2010  Simon Josefsson\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include \"misc.h\"\n\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif\n\n#include <stdio.h>\n#include <errno.h>\n\nint _libssh2_error_flags(LIBSSH2_SESSION* session, int errcode, const char* errmsg, int errflags)\n{\n    if (session->err_flags & LIBSSH2_ERR_FLAG_DUP)\n        LIBSSH2_FREE(session, (char *)session->err_msg);\n\n    session->err_code = errcode;\n    session->err_flags = 0;\n\n    if ((errmsg != NULL) && ((errflags & LIBSSH2_ERR_FLAG_DUP) != 0)) {\n        size_t len = strlen(errmsg);\n        char *copy = LIBSSH2_ALLOC(session, len + 1);\n        if (copy) {\n            memcpy(copy, errmsg, len + 1);\n            session->err_flags = LIBSSH2_ERR_FLAG_DUP;\n            session->err_msg = copy;\n        }\n        else\n            /* Out of memory: this code path is very unlikely */\n            session->err_msg = \"former error forgotten (OOM)\";\n    }\n    else\n        session->err_msg = errmsg;\n\n#ifdef LIBSSH2DEBUG\n    if((errcode == LIBSSH2_ERROR_EAGAIN) && !session->api_block_mode)\n        /* if this is EAGAIN and we're in non-blocking mode, don't generate\n           a debug output for this */\n        return errcode;\n    _libssh2_debug(session, LIBSSH2_TRACE_ERROR, \"%d - %s\", session->err_code,\n                   session->err_msg);\n#endif\n\n    return errcode;\n}\n\nint _libssh2_error(LIBSSH2_SESSION* session, int errcode, const char* errmsg)\n{\n    return _libssh2_error_flags(session, errcode, errmsg, 0);\n}\n\n#ifdef WIN32\nstatic int wsa2errno(void)\n{\n    switch (WSAGetLastError()) {\n    case WSAEWOULDBLOCK:\n        return EAGAIN;\n\n    case WSAENOTSOCK:\n        return EBADF;\n\n    case WSAEINTR:\n        return EINTR;\n\n    default:\n        /* It is most important to ensure errno does not stay at EAGAIN\n         * when a different error occurs so just set errno to a generic\n         * error */\n        return EIO;\n    }\n}\n#endif\n\n/* _libssh2_recv\n *\n * Replacement for the standard recv, return -errno on failure.\n */\nssize_t\n_libssh2_recv(libssh2_socket_t sock, void *buffer, size_t length,\n              int flags, void **abstract)\n{\n    ssize_t rc;\n\n    (void) abstract;\n\n    rc = recv(sock, buffer, length, flags);\n#ifdef WIN32\n    if (rc < 0 )\n        return -wsa2errno();\n#elif defined(__VMS)\n    if (rc < 0 ){\n        if ( errno == EWOULDBLOCK )\n            return -EAGAIN;\n        else\n            return -errno;\n    }\n#else\n    if (rc < 0 ){\n        /* Sometimes the first recv() function call sets errno to ENOENT on\n           Solaris and HP-UX */\n        if ( errno == ENOENT )\n            return -EAGAIN;\n        else\n            return -errno;\n    }\n#endif\n    return rc;\n}\n\n/* _libssh2_send\n *\n * Replacement for the standard send, return -errno on failure.\n */\nssize_t\n_libssh2_send(libssh2_socket_t sock, const void *buffer, size_t length,\n              int flags, void **abstract)\n{\n    ssize_t rc;\n\n    (void) abstract;\n\n    rc = send(sock, buffer, length, flags);\n#ifdef WIN32\n    if (rc < 0 )\n        return -wsa2errno();\n#elif defined(__VMS)\n    if (rc < 0 ) {\n        if ( errno == EWOULDBLOCK )\n            return -EAGAIN;\n        else\n            return -errno;\n    }\n#else\n    if (rc < 0 )\n        return -errno;\n#endif\n    return rc;\n}\n\n/* libssh2_ntohu32\n */\nunsigned int\n_libssh2_ntohu32(const unsigned char *buf)\n{\n    return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];\n}\n\n\n/* _libssh2_ntohu64\n */\nlibssh2_uint64_t\n_libssh2_ntohu64(const unsigned char *buf)\n{\n    unsigned long msl, lsl;\n\n    msl = ((libssh2_uint64_t)buf[0] << 24) | ((libssh2_uint64_t)buf[1] << 16)\n        | ((libssh2_uint64_t)buf[2] << 8) | (libssh2_uint64_t)buf[3];\n    lsl = ((libssh2_uint64_t)buf[4] << 24) | ((libssh2_uint64_t)buf[5] << 16)\n        | ((libssh2_uint64_t)buf[6] << 8) | (libssh2_uint64_t)buf[7];\n\n    return ((libssh2_uint64_t)msl <<32) | lsl;\n}\n\n/* _libssh2_htonu32\n */\nvoid\n_libssh2_htonu32(unsigned char *buf, uint32_t value)\n{\n    buf[0] = (value >> 24) & 0xFF;\n    buf[1] = (value >> 16) & 0xFF;\n    buf[2] = (value >> 8) & 0xFF;\n    buf[3] = value & 0xFF;\n}\n\n/* _libssh2_store_u32\n */\nvoid _libssh2_store_u32(unsigned char **buf, uint32_t value)\n{\n    _libssh2_htonu32(*buf, value);\n    *buf += sizeof(uint32_t);\n}\n\n/* _libssh2_store_str\n */\nvoid _libssh2_store_str(unsigned char **buf, const char *str, size_t len)\n{\n    _libssh2_store_u32(buf, (uint32_t)len);\n    if(len) {\n        memcpy(*buf, str, len);\n        *buf += len;\n    }\n}\n\n/* Base64 Conversion */\n\nstatic const char base64_table[] =\n{\n    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n    'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',\n    'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',\n    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '\\0'\n};\n\nstatic const char base64_pad = '=';\n\nstatic const short base64_reverse_table[256] = {\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,\n    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,\n    -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\n    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,\n    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,\n    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1\n};\n\n/* libssh2_base64_decode\n *\n * Decode a base64 chunk and store it into a newly alloc'd buffer\n */\nLIBSSH2_API int\nlibssh2_base64_decode(LIBSSH2_SESSION *session, char **data,\n                      unsigned int *datalen, const char *src,\n                      unsigned int src_len)\n{\n    unsigned char *s, *d;\n    short v;\n    int i = 0, len = 0;\n\n    *data = LIBSSH2_ALLOC(session, (3 * src_len / 4) + 1);\n    d = (unsigned char *) *data;\n    if (!d) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Unable to allocate memory for base64 decoding\");\n    }\n\n    for(s = (unsigned char *) src; ((char *) s) < (src + src_len); s++) {\n        if ((v = base64_reverse_table[*s]) < 0)\n            continue;\n        switch (i % 4) {\n        case 0:\n            d[len] = (unsigned char)(v << 2);\n            break;\n        case 1:\n            d[len++] |= v >> 4;\n            d[len] = (unsigned char)(v << 4);\n            break;\n        case 2:\n            d[len++] |= v >> 2;\n            d[len] = (unsigned char)(v << 6);\n            break;\n        case 3:\n            d[len++] |= v;\n            break;\n        }\n        i++;\n    }\n    if ((i % 4) == 1) {\n        /* Invalid -- We have a byte which belongs exclusively to a partial\n           octet */\n        LIBSSH2_FREE(session, *data);\n        return _libssh2_error(session, LIBSSH2_ERROR_INVAL, \"Invalid base64\");\n    }\n\n    *datalen = len;\n    return 0;\n}\n\n/* ---- Base64 Encoding/Decoding Table --- */\nstatic const char table64[]=\n  \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n/*\n * _libssh2_base64_encode()\n *\n * Returns the length of the newly created base64 string. The third argument\n * is a pointer to an allocated area holding the base64 data. If something\n * went wrong, 0 is returned.\n *\n */\nsize_t _libssh2_base64_encode(LIBSSH2_SESSION *session,\n                              const char *inp, size_t insize, char **outptr)\n{\n  unsigned char ibuf[3];\n  unsigned char obuf[4];\n  int i;\n  int inputparts;\n  char *output;\n  char *base64data;\n  const char *indata = inp;\n\n  *outptr = NULL; /* set to NULL in case of failure before we reach the end */\n\n  if(0 == insize)\n    insize = strlen(indata);\n\n  base64data = output = LIBSSH2_ALLOC(session, insize*4/3+4);\n  if(NULL == output)\n    return 0;\n\n  while(insize > 0) {\n    for (i = inputparts = 0; i < 3; i++) {\n      if(insize > 0) {\n        inputparts++;\n        ibuf[i] = *indata;\n        indata++;\n        insize--;\n      }\n      else\n        ibuf[i] = 0;\n    }\n\n    obuf[0] = (unsigned char)  ((ibuf[0] & 0xFC) >> 2);\n    obuf[1] = (unsigned char) (((ibuf[0] & 0x03) << 4) | \\\n                               ((ibuf[1] & 0xF0) >> 4));\n    obuf[2] = (unsigned char) (((ibuf[1] & 0x0F) << 2) | \\\n                               ((ibuf[2] & 0xC0) >> 6));\n    obuf[3] = (unsigned char)   (ibuf[2] & 0x3F);\n\n    switch(inputparts) {\n    case 1: /* only one byte read */\n      snprintf(output, 5, \"%c%c==\",\n               table64[obuf[0]],\n               table64[obuf[1]]);\n      break;\n    case 2: /* two bytes read */\n      snprintf(output, 5, \"%c%c%c=\",\n               table64[obuf[0]],\n               table64[obuf[1]],\n               table64[obuf[2]]);\n      break;\n    default:\n      snprintf(output, 5, \"%c%c%c%c\",\n               table64[obuf[0]],\n               table64[obuf[1]],\n               table64[obuf[2]],\n               table64[obuf[3]] );\n      break;\n    }\n    output += 4;\n  }\n  *output=0;\n  *outptr = base64data; /* make it return the actual data memory */\n\n  return strlen(base64data); /* return the length of the new data */\n}\n/* ---- End of Base64 Encoding ---- */\n\nLIBSSH2_API void\nlibssh2_free(LIBSSH2_SESSION *session, void *ptr)\n{\n    LIBSSH2_FREE(session, ptr);\n}\n\n#ifdef LIBSSH2DEBUG\n#include <stdarg.h>\n\nLIBSSH2_API int\nlibssh2_trace(LIBSSH2_SESSION * session, int bitmask)\n{\n    session->showmask = bitmask;\n    return 0;\n}\n\nLIBSSH2_API int\nlibssh2_trace_sethandler(LIBSSH2_SESSION *session, void* handler_context,\n                         libssh2_trace_handler_func callback)\n{\n    session->tracehandler = callback;\n    session->tracehandler_context = handler_context;\n    return 0;\n}\n\nvoid\n_libssh2_debug(LIBSSH2_SESSION * session, int context, const char *format, ...)\n{\n    char buffer[1536];\n    int len, msglen, buflen = sizeof(buffer);\n    va_list vargs;\n    struct timeval now;\n    static int firstsec;\n    static const char *const contexts[] = {\n        \"Unknown\",\n        \"Transport\",\n        \"Key Ex\",\n        \"Userauth\",\n        \"Conn\",\n        \"SCP\",\n        \"SFTP\",\n        \"Failure Event\",\n        \"Publickey\",\n        \"Socket\",\n    };\n    const char* contexttext = contexts[0];\n    unsigned int contextindex;\n\n    if (!(session->showmask & context)) {\n        /* no such output asked for */\n        return;\n    }\n\n    /* Find the first matching context string for this message */\n    for (contextindex = 0; contextindex < ARRAY_SIZE(contexts);\n         contextindex++) {\n        if ((context & (1 << contextindex)) != 0) {\n            contexttext = contexts[contextindex];\n            break;\n        }\n    }\n\n    _libssh2_gettimeofday(&now, NULL);\n    if(!firstsec) {\n        firstsec = now.tv_sec;\n    }\n    now.tv_sec -= firstsec;\n\n    len = snprintf(buffer, buflen, \"[libssh2] %d.%06d %s: \",\n                   (int)now.tv_sec, (int)now.tv_usec, contexttext);\n\n    if (len >= buflen)\n        msglen = buflen - 1;\n    else {\n        buflen -= len;\n        msglen = len;\n        va_start(vargs, format);\n        len = vsnprintf(buffer + msglen, buflen, format, vargs);\n        va_end(vargs);\n        msglen += len < buflen ? len : buflen - 1;\n    }\n\n    if (session->tracehandler)\n        (session->tracehandler)(session, session->tracehandler_context, buffer,\n                                msglen);\n    else\n        fprintf(stderr, \"%s\\n\", buffer);\n}\n\n#else\nLIBSSH2_API int\nlibssh2_trace(LIBSSH2_SESSION * session, int bitmask)\n{\n    (void) session;\n    (void) bitmask;\n    return 0;\n}\n\nLIBSSH2_API int\nlibssh2_trace_sethandler(LIBSSH2_SESSION *session, void* handler_context,\n                         libssh2_trace_handler_func callback)\n{\n    (void) session;\n    (void) handler_context;\n    (void) callback;\n    return 0;\n}\n#endif\n\n/* init the list head */\nvoid _libssh2_list_init(struct list_head *head)\n{\n    head->first = head->last = NULL;\n}\n\n/* add a node to the list */\nvoid _libssh2_list_add(struct list_head *head,\n                       struct list_node *entry)\n{\n    /* store a pointer to the head */\n    entry->head = head;\n\n    /* we add this entry at the \"top\" so it has no next */\n    entry->next = NULL;\n\n    /* make our prev point to what the head thinks is last */\n    entry->prev = head->last;\n\n    /* and make head's last be us now */\n    head->last = entry;\n\n    /* make sure our 'prev' node points to us next */\n    if(entry->prev)\n        entry->prev->next = entry;\n    else\n        head->first = entry;\n}\n\n/* return the \"first\" node in the list this head points to */\nvoid *_libssh2_list_first(struct list_head *head)\n{\n    return head->first;\n}\n\n/* return the next node in the list */\nvoid *_libssh2_list_next(struct list_node *node)\n{\n    return node->next;\n}\n\n/* return the prev node in the list */\nvoid *_libssh2_list_prev(struct list_node *node)\n{\n    return node->prev;\n}\n\n/* remove this node from the list */\nvoid _libssh2_list_remove(struct list_node *entry)\n{\n    if(entry->prev)\n        entry->prev->next = entry->next;\n    else\n        entry->head->first = entry->next;\n\n    if(entry->next)\n        entry->next->prev = entry->prev;\n    else\n        entry->head->last = entry->prev;\n}\n\n#if 0\n/* insert a node before the given 'after' entry */\nvoid _libssh2_list_insert(struct list_node *after, /* insert before this */\n                          struct list_node *entry)\n{\n    /* 'after' is next to 'entry' */\n    bentry->next = after;\n\n    /* entry's prev is then made to be the prev after current has */\n    entry->prev = after->prev;\n\n    /* the node that is now before 'entry' was previously before 'after'\n       and must be made to point to 'entry' correctly */\n    if(entry->prev)\n        entry->prev->next = entry;\n    else\n      /* there was no node before this, so we make sure we point the head\n         pointer to this node */\n      after->head->first = entry;\n\n    /* after's prev entry points back to entry */\n    after->prev = entry;\n\n    /* after's next entry is still the same as before */\n\n    /* entry's head is the same as after's */\n    entry->head = after->head;\n}\n\n#endif\n\n/* this define is defined in misc.h for the correct platforms */\n#ifdef LIBSSH2_GETTIMEOFDAY_WIN32\n/*\n * gettimeofday\n * Implementation according to:\n * The Open Group Base Specifications Issue 6\n * IEEE Std 1003.1, 2004 Edition\n */\n\n/*\n *  THIS SOFTWARE IS NOT COPYRIGHTED\n *\n *  This source code is offered for use in the public domain. You may\n *  use, modify or distribute it freely.\n *\n *  This code is distributed in the hope that it will be useful but\n *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY\n *  DISCLAIMED. This includes but is not limited to warranties of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n *\n *  Contributed by:\n *  Danny Smith <dannysmith@users.sourceforge.net>\n */\n\n/* Offset between 1/1/1601 and 1/1/1970 in 100 nanosec units */\n#define _W32_FT_OFFSET (116444736000000000)\n\nint __cdecl _libssh2_gettimeofday(struct timeval *tp, void *tzp)\n {\n  union {\n    unsigned __int64 ns100; /*time since 1 Jan 1601 in 100ns units */\n    FILETIME ft;\n  }  _now;\n  (void)tzp;\n  if(tp)\n    {\n      GetSystemTimeAsFileTime (&_now.ft);\n      tp->tv_usec=(long)((_now.ns100 / 10) % 1000000 );\n      tp->tv_sec= (long)((_now.ns100 - _W32_FT_OFFSET) / 10000000);\n    }\n  /* Always return 0 as per Open Group Base Specifications Issue 6.\n     Do not set errno on error.  */\n  return 0;\n}\n\n\n#endif\n\nvoid *_libssh2_calloc(LIBSSH2_SESSION* session, size_t size)\n{\n    void *p = LIBSSH2_ALLOC(session, size);\n    if(p) {\n        memset(p, 0, size);\n    }\n    return p;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/misc.h",
    "content": "#ifndef __LIBSSH2_MISC_H\n#define __LIBSSH2_MISC_H\n/* Copyright (c) 2009-2014 by Daniel Stenberg\n *\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\nstruct list_head {\n    struct list_node *last;\n    struct list_node *first;\n};\n\nstruct list_node {\n    struct list_node *next;\n    struct list_node *prev;\n    struct list_head *head;\n};\n\nint _libssh2_error_flags(LIBSSH2_SESSION* session, int errcode, const char* errmsg, int errflags);\nint _libssh2_error(LIBSSH2_SESSION* session, int errcode, const char* errmsg);\n\nvoid _libssh2_list_init(struct list_head *head);\n\n/* add a node last in the list */\nvoid _libssh2_list_add(struct list_head *head,\n                       struct list_node *entry);\n\n/* return the \"first\" node in the list this head points to */\nvoid *_libssh2_list_first(struct list_head *head);\n\n/* return the next node in the list */\nvoid *_libssh2_list_next(struct list_node *node);\n\n/* return the prev node in the list */\nvoid *_libssh2_list_prev(struct list_node *node);\n\n/* remove this node from the list */\nvoid _libssh2_list_remove(struct list_node *entry);\n\nsize_t _libssh2_base64_encode(struct _LIBSSH2_SESSION *session,\n                              const char *inp, size_t insize, char **outptr);\n\nunsigned int _libssh2_ntohu32(const unsigned char *buf);\nlibssh2_uint64_t _libssh2_ntohu64(const unsigned char *buf);\nvoid _libssh2_htonu32(unsigned char *buf, uint32_t val);\nvoid _libssh2_store_u32(unsigned char **buf, uint32_t value);\nvoid _libssh2_store_str(unsigned char **buf, const char *str, size_t len);\nvoid *_libssh2_calloc(LIBSSH2_SESSION* session, size_t size);\n\n#if defined(LIBSSH2_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)\n/* provide a private one */\n#undef HAVE_GETTIMEOFDAY\nint __cdecl _libssh2_gettimeofday(struct timeval *tp, void *tzp);\n#define HAVE_LIBSSH2_GETTIMEOFDAY\n#define LIBSSH2_GETTIMEOFDAY_WIN32 /* enable the win32 implementation */\n#else\n#ifdef HAVE_GETTIMEOFDAY\n#define _libssh2_gettimeofday(x,y) gettimeofday(x,y)\n#define HAVE_LIBSSH2_GETTIMEOFDAY\n#endif\n#endif\n\n#endif /* _LIBSSH2_MISC_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/openssl.c",
    "content": "/* Copyright (C) 2009, 2010 Simon Josefsson\n * Copyright (C) 2006, 2007 The Written Word, Inc.  All rights reserved.\n * Copyright (c) 2004-2006, Sara Golemon <sarag@libssh2.org>\n *\n * Author: Simon Josefsson\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\n#ifdef LIBSSH2_OPENSSL /* compile only if we build with openssl */\n\n#include <string.h>\n\n#ifndef EVP_MAX_BLOCK_LENGTH\n#define EVP_MAX_BLOCK_LENGTH 32\n#endif\n\nint\n_libssh2_rsa_new(libssh2_rsa_ctx ** rsa,\n                 const unsigned char *edata,\n                 unsigned long elen,\n                 const unsigned char *ndata,\n                 unsigned long nlen,\n                 const unsigned char *ddata,\n                 unsigned long dlen,\n                 const unsigned char *pdata,\n                 unsigned long plen,\n                 const unsigned char *qdata,\n                 unsigned long qlen,\n                 const unsigned char *e1data,\n                 unsigned long e1len,\n                 const unsigned char *e2data,\n                 unsigned long e2len,\n                 const unsigned char *coeffdata, unsigned long coefflen)\n{\n    *rsa = RSA_new();\n\n    (*rsa)->e = BN_new();\n    BN_bin2bn(edata, elen, (*rsa)->e);\n\n    (*rsa)->n = BN_new();\n    BN_bin2bn(ndata, nlen, (*rsa)->n);\n\n    if (ddata) {\n        (*rsa)->d = BN_new();\n        BN_bin2bn(ddata, dlen, (*rsa)->d);\n\n        (*rsa)->p = BN_new();\n        BN_bin2bn(pdata, plen, (*rsa)->p);\n\n        (*rsa)->q = BN_new();\n        BN_bin2bn(qdata, qlen, (*rsa)->q);\n\n        (*rsa)->dmp1 = BN_new();\n        BN_bin2bn(e1data, e1len, (*rsa)->dmp1);\n\n        (*rsa)->dmq1 = BN_new();\n        BN_bin2bn(e2data, e2len, (*rsa)->dmq1);\n\n        (*rsa)->iqmp = BN_new();\n        BN_bin2bn(coeffdata, coefflen, (*rsa)->iqmp);\n    }\n    return 0;\n}\n\nint\n_libssh2_rsa_sha1_verify(libssh2_rsa_ctx * rsactx,\n                         const unsigned char *sig,\n                         unsigned long sig_len,\n                         const unsigned char *m, unsigned long m_len)\n{\n    unsigned char hash[SHA_DIGEST_LENGTH];\n    int ret;\n\n    if (_libssh2_sha1(m, m_len, hash))\n        return -1; /* failure */\n    ret = RSA_verify(NID_sha1, hash, SHA_DIGEST_LENGTH,\n                     (unsigned char *) sig, sig_len, rsactx);\n    return (ret == 1) ? 0 : -1;\n}\n\n#if LIBSSH2_DSA\nint\n_libssh2_dsa_new(libssh2_dsa_ctx ** dsactx,\n                 const unsigned char *p,\n                 unsigned long p_len,\n                 const unsigned char *q,\n                 unsigned long q_len,\n                 const unsigned char *g,\n                 unsigned long g_len,\n                 const unsigned char *y,\n                 unsigned long y_len,\n                 const unsigned char *x, unsigned long x_len)\n{\n    *dsactx = DSA_new();\n\n    (*dsactx)->p = BN_new();\n    BN_bin2bn(p, p_len, (*dsactx)->p);\n\n    (*dsactx)->q = BN_new();\n    BN_bin2bn(q, q_len, (*dsactx)->q);\n\n    (*dsactx)->g = BN_new();\n    BN_bin2bn(g, g_len, (*dsactx)->g);\n\n    (*dsactx)->pub_key = BN_new();\n    BN_bin2bn(y, y_len, (*dsactx)->pub_key);\n\n    if (x_len) {\n        (*dsactx)->priv_key = BN_new();\n        BN_bin2bn(x, x_len, (*dsactx)->priv_key);\n    }\n\n    return 0;\n}\n\nint\n_libssh2_dsa_sha1_verify(libssh2_dsa_ctx * dsactx,\n                         const unsigned char *sig,\n                         const unsigned char *m, unsigned long m_len)\n{\n    unsigned char hash[SHA_DIGEST_LENGTH];\n    DSA_SIG dsasig;\n    int ret = -1;\n\n    dsasig.r = BN_new();\n    BN_bin2bn(sig, 20, dsasig.r);\n    dsasig.s = BN_new();\n    BN_bin2bn(sig + 20, 20, dsasig.s);\n\n    if (!_libssh2_sha1(m, m_len, hash))\n        /* _libssh2_sha1() succeeded */\n        ret = DSA_do_verify(hash, SHA_DIGEST_LENGTH, &dsasig, dsactx);\n\n    BN_clear_free(dsasig.s);\n    BN_clear_free(dsasig.r);\n\n    return (ret == 1) ? 0 : -1;\n}\n#endif /* LIBSSH_DSA */\n\nint\n_libssh2_cipher_init(_libssh2_cipher_ctx * h,\n                     _libssh2_cipher_type(algo),\n                     unsigned char *iv, unsigned char *secret, int encrypt)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    *h = EVP_CIPHER_CTX_new();\n    return !EVP_CipherInit(*h, algo(), secret, iv, encrypt);\n#else\n    EVP_CIPHER_CTX_init(h);\n    return !EVP_CipherInit(h, algo(), secret, iv, encrypt);\n#endif\n}\n\nint\n_libssh2_cipher_crypt(_libssh2_cipher_ctx * ctx,\n                      _libssh2_cipher_type(algo),\n                      int encrypt, unsigned char *block, size_t blocksize)\n{\n    unsigned char buf[EVP_MAX_BLOCK_LENGTH];\n    int ret;\n    (void) algo;\n    (void) encrypt;\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    ret = EVP_Cipher(*ctx, buf, block, blocksize);\n#else\n    ret = EVP_Cipher(ctx, buf, block, blocksize);\n#endif\n    if (ret == 1) {\n        memcpy(block, buf, blocksize);\n    }\n    return ret == 1 ? 0 : 1;\n}\n\n#if LIBSSH2_AES_CTR\n\n#include <openssl/aes.h>\n#include <openssl/evp.h>\n\ntypedef struct\n{\n    AES_KEY       key;\n    EVP_CIPHER_CTX *aes_ctx;\n    unsigned char ctr[AES_BLOCK_SIZE];\n} aes_ctr_ctx;\n\nstatic int\naes_ctr_init(EVP_CIPHER_CTX *ctx, const unsigned char *key,\n             const unsigned char *iv, int enc) /* init key */\n{\n    /*\n     * variable \"c\" is leaked from this scope, but is later freed\n     * in aes_ctr_cleanup\n     */\n    aes_ctr_ctx *c;\n    const EVP_CIPHER *aes_cipher;\n    (void) enc;\n\n    switch (EVP_CIPHER_CTX_key_length(ctx)) {\n    case 16:\n        aes_cipher = EVP_aes_128_ecb();\n        break;\n    case 24:\n        aes_cipher = EVP_aes_192_ecb();\n        break;\n    case 32:\n        aes_cipher = EVP_aes_256_ecb();\n        break;\n    default:\n        return 0;\n    }\n\n    c = malloc(sizeof(*c));\n    if (c == NULL)\n        return 0;\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    c->aes_ctx = EVP_CIPHER_CTX_new();\n#else\n    c->aes_ctx = malloc(sizeof(EVP_CIPHER_CTX));\n#endif\n    if (c->aes_ctx == NULL) {\n        free(c);\n        return 0;\n    }\n\n    if (EVP_EncryptInit(c->aes_ctx, aes_cipher, key, NULL) != 1) {\n#ifdef HAVE_OPAQUE_STRUCTS\n        EVP_CIPHER_CTX_free(c->aes_ctx);\n#else\n        free(c->aes_ctx);\n#endif\n        free(c);\n        return 0;\n    }\n\n    EVP_CIPHER_CTX_set_padding(c->aes_ctx, 0);\n\n    memcpy(c->ctr, iv, AES_BLOCK_SIZE);\n\n    EVP_CIPHER_CTX_set_app_data(ctx, c);\n\n    return 1;\n}\n\nstatic int\naes_ctr_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,\n                  const unsigned char *in,\n                  size_t inl) /* encrypt/decrypt data */\n{\n    aes_ctr_ctx *c = EVP_CIPHER_CTX_get_app_data(ctx);\n    unsigned char b1[AES_BLOCK_SIZE];\n    size_t i = 0;\n    int outlen = 0;\n\n    if (inl != 16) /* libssh2 only ever encrypt one block */\n        return 0;\n\n    if (c == NULL) {\n        return 0;\n    }\n\n/*\n  To encrypt a packet P=P1||P2||...||Pn (where P1, P2, ..., Pn are each\n  blocks of length L), the encryptor first encrypts <X> with <cipher>\n  to obtain a block B1.  The block B1 is then XORed with P1 to generate\n  the ciphertext block C1.  The counter X is then incremented\n*/\n\n    if (EVP_EncryptUpdate(c->aes_ctx, b1, &outlen, c->ctr, AES_BLOCK_SIZE) != 1) {\n        return 0;\n    }\n\n    for (i = 0; i < 16; i++)\n        *out++ = *in++ ^ b1[i];\n\n    i = 15;\n    while (c->ctr[i]++ == 0xFF) {\n        if (i == 0)\n            break;\n        i--;\n    }\n\n    return 1;\n}\n\nstatic int\naes_ctr_cleanup(EVP_CIPHER_CTX *ctx) /* cleanup ctx */\n{\n    aes_ctr_ctx *c = EVP_CIPHER_CTX_get_app_data(ctx);\n\n    if (c == NULL) {\n        return 1;\n    }\n\n    if (c->aes_ctx != NULL) {\n#ifdef HAVE_OPAQUE_STRUCTS\n        EVP_CIPHER_CTX_free(c->aes_ctx);\n#else\n        _libssh2_cipher_dtor(c->aes_ctx);\n        free(c->aes_ctx);\n#endif\n    }\n\n    free(c);\n\n    return 1;\n}\n\nstatic const EVP_CIPHER *\nmake_ctr_evp (size_t keylen, EVP_CIPHER *aes_ctr_cipher, int type)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    aes_ctr_cipher = EVP_CIPHER_meth_new(type, 16, keylen);\n    if (aes_ctr_cipher) {\n        EVP_CIPHER_meth_set_iv_length(aes_ctr_cipher, 16);\n        EVP_CIPHER_meth_set_init(aes_ctr_cipher, aes_ctr_init);\n        EVP_CIPHER_meth_set_do_cipher(aes_ctr_cipher, aes_ctr_do_cipher);\n        EVP_CIPHER_meth_set_cleanup(aes_ctr_cipher, aes_ctr_cleanup);\n    }\n#else\n    aes_ctr_cipher->nid = type;\n    aes_ctr_cipher->block_size = 16;\n    aes_ctr_cipher->key_len = keylen;\n    aes_ctr_cipher->iv_len = 16;\n    aes_ctr_cipher->init = aes_ctr_init;\n    aes_ctr_cipher->do_cipher = aes_ctr_do_cipher;\n    aes_ctr_cipher->cleanup = aes_ctr_cleanup;\n#endif\n\n    return aes_ctr_cipher;\n}\n\nconst EVP_CIPHER *\n_libssh2_EVP_aes_128_ctr(void)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    static EVP_CIPHER * aes_ctr_cipher;\n    return !aes_ctr_cipher?\n        make_ctr_evp (16, aes_ctr_cipher, NID_aes_128_ctr) : aes_ctr_cipher;\n#else\n    static EVP_CIPHER aes_ctr_cipher;\n    return !aes_ctr_cipher.key_len?\n        make_ctr_evp (16, &aes_ctr_cipher, 0) : &aes_ctr_cipher;\n#endif\n}\n\nconst EVP_CIPHER *\n_libssh2_EVP_aes_192_ctr(void)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    static EVP_CIPHER * aes_ctr_cipher;\n    return !aes_ctr_cipher?\n        make_ctr_evp (24, aes_ctr_cipher, NID_aes_192_ctr) : aes_ctr_cipher;\n#else\n    static EVP_CIPHER aes_ctr_cipher;\n    return !aes_ctr_cipher.key_len?\n        make_ctr_evp (24, &aes_ctr_cipher, 0) : &aes_ctr_cipher;\n#endif\n}\n\nconst EVP_CIPHER *\n_libssh2_EVP_aes_256_ctr(void)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    static EVP_CIPHER * aes_ctr_cipher;\n    return !aes_ctr_cipher?\n        make_ctr_evp (32, aes_ctr_cipher, NID_aes_256_ctr) : aes_ctr_cipher;\n#else\n    static EVP_CIPHER aes_ctr_cipher;\n    return !aes_ctr_cipher.key_len?\n        make_ctr_evp (32, &aes_ctr_cipher, 0) : &aes_ctr_cipher;\n#endif\n}\n\nvoid _libssh2_init_aes_ctr(void)\n{\n    _libssh2_EVP_aes_128_ctr();\n    _libssh2_EVP_aes_192_ctr();\n    _libssh2_EVP_aes_256_ctr();\n}\n\n#else\nvoid _libssh2_init_aes_ctr(void) {}\n#endif /* LIBSSH2_AES_CTR */\n\n/* TODO: Optionally call a passphrase callback specified by the\n * calling program\n */\nstatic int\npassphrase_cb(char *buf, int size, int rwflag, char *passphrase)\n{\n    int passphrase_len = strlen(passphrase);\n    (void) rwflag;\n\n    if (passphrase_len > (size - 1)) {\n        passphrase_len = size - 1;\n    }\n    memcpy(buf, passphrase, passphrase_len);\n    buf[passphrase_len] = '\\0';\n\n    return passphrase_len;\n}\n\ntypedef void * (*pem_read_bio_func)(BIO *, void **, pem_password_cb *,\n                                    void * u);\n\nstatic int\nread_private_key_from_memory(void ** key_ctx,\n                             pem_read_bio_func read_private_key,\n                             const char * filedata,\n                             size_t filedata_len,\n                             unsigned const char *passphrase)\n{\n    BIO * bp;\n\n    *key_ctx = NULL;\n\n    bp = BIO_new_mem_buf((char *)filedata, filedata_len);\n    if (!bp) {\n        return -1;\n    }\n    *key_ctx = read_private_key(bp, NULL, (pem_password_cb *) passphrase_cb,\n                                (void *) passphrase);\n\n    BIO_free(bp);\n    return (*key_ctx) ? 0 : -1;\n}\n\nstatic int\nread_private_key_from_file(void ** key_ctx,\n                           pem_read_bio_func read_private_key,\n                           const char * filename,\n                           unsigned const char *passphrase)\n{\n    BIO * bp;\n\n    *key_ctx = NULL;\n\n    bp = BIO_new_file(filename, \"r\");\n    if (!bp) {\n        return -1;\n    }\n\n    *key_ctx = read_private_key(bp, NULL, (pem_password_cb *) passphrase_cb,\n                                (void *) passphrase);\n\n    BIO_free(bp);\n    return (*key_ctx) ? 0 : -1;\n}\n\nint\n_libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx ** rsa,\n                                    LIBSSH2_SESSION * session,\n                                    const char *filedata, size_t filedata_len,\n                                    unsigned const char *passphrase)\n{\n    pem_read_bio_func read_rsa =\n        (pem_read_bio_func) &PEM_read_bio_RSAPrivateKey;\n    (void) session;\n\n    _libssh2_init_if_needed();\n\n    return read_private_key_from_memory((void **) rsa, read_rsa,\n                                        filedata, filedata_len, passphrase);\n}\n\nint\n_libssh2_rsa_new_private(libssh2_rsa_ctx ** rsa,\n                         LIBSSH2_SESSION * session,\n                         const char *filename, unsigned const char *passphrase)\n{\n    pem_read_bio_func read_rsa =\n        (pem_read_bio_func) &PEM_read_bio_RSAPrivateKey;\n    (void) session;\n\n    _libssh2_init_if_needed ();\n\n    return read_private_key_from_file((void **) rsa, read_rsa,\n                                      filename, passphrase);\n}\n\n#if LIBSSH2_DSA\nint\n_libssh2_dsa_new_private_frommemory(libssh2_dsa_ctx ** dsa,\n                                    LIBSSH2_SESSION * session,\n                                    const char *filedata, size_t filedata_len,\n                                    unsigned const char *passphrase)\n{\n    pem_read_bio_func read_dsa =\n        (pem_read_bio_func) &PEM_read_bio_DSAPrivateKey;\n    (void) session;\n\n    _libssh2_init_if_needed();\n\n    return read_private_key_from_memory((void **) dsa, read_dsa,\n                                        filedata, filedata_len, passphrase);\n}\n\nint\n_libssh2_dsa_new_private(libssh2_dsa_ctx ** dsa,\n                         LIBSSH2_SESSION * session,\n                         const char *filename, unsigned const char *passphrase)\n{\n    pem_read_bio_func read_dsa =\n        (pem_read_bio_func) &PEM_read_bio_DSAPrivateKey;\n    (void) session;\n\n    _libssh2_init_if_needed ();\n\n    return read_private_key_from_file((void **) dsa, read_dsa,\n                                      filename, passphrase);\n}\n#endif /* LIBSSH_DSA */\n\nint\n_libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session,\n                       libssh2_rsa_ctx * rsactx,\n                       const unsigned char *hash,\n                       size_t hash_len,\n                       unsigned char **signature, size_t *signature_len)\n{\n    int ret;\n    unsigned char *sig;\n    unsigned int sig_len;\n\n    sig_len = RSA_size(rsactx);\n    sig = LIBSSH2_ALLOC(session, sig_len);\n\n    if (!sig) {\n        return -1;\n    }\n\n    ret = RSA_sign(NID_sha1, hash, hash_len, sig, &sig_len, rsactx);\n\n    if (!ret) {\n        LIBSSH2_FREE(session, sig);\n        return -1;\n    }\n\n    *signature = sig;\n    *signature_len = sig_len;\n\n    return 0;\n}\n\n#if LIBSSH2_DSA\nint\n_libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx,\n                       const unsigned char *hash,\n                       unsigned long hash_len, unsigned char *signature)\n{\n    DSA_SIG *sig;\n    int r_len, s_len;\n    (void) hash_len;\n\n    sig = DSA_do_sign(hash, SHA_DIGEST_LENGTH, dsactx);\n    if (!sig) {\n        return -1;\n    }\n\n    r_len = BN_num_bytes(sig->r);\n    if (r_len < 1 || r_len > 20) {\n        DSA_SIG_free(sig);\n        return -1;\n    }\n    s_len = BN_num_bytes(sig->s);\n    if (s_len < 1 || s_len > 20) {\n        DSA_SIG_free(sig);\n        return -1;\n    }\n\n    memset(signature, 0, 40);\n\n    BN_bn2bin(sig->r, signature + (20 - r_len));\n    BN_bn2bin(sig->s, signature + 20 + (20 - s_len));\n\n    DSA_SIG_free(sig);\n\n    return 0;\n}\n#endif /* LIBSSH_DSA */\n\nint\n_libssh2_sha1_init(libssh2_sha1_ctx *ctx)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    *ctx = EVP_MD_CTX_new();\n\n    if (*ctx == NULL)\n        return 0;\n\n    if (EVP_DigestInit(*ctx, EVP_get_digestbyname(\"sha1\")))\n        return 1;\n\n    EVP_MD_CTX_free(*ctx);\n    *ctx = NULL;\n\n    return 0;\n#else\n    EVP_MD_CTX_init(ctx);\n    return EVP_DigestInit(ctx, EVP_get_digestbyname(\"sha1\"));\n#endif\n}\n\nint\n_libssh2_sha1(const unsigned char *message, unsigned long len,\n              unsigned char *out)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    EVP_MD_CTX * ctx = EVP_MD_CTX_new();\n\n    if (ctx == NULL)\n        return 1; /* error */\n\n    if (EVP_DigestInit(ctx, EVP_get_digestbyname(\"sha1\"))) {\n        EVP_DigestUpdate(ctx, message, len);\n        EVP_DigestFinal(ctx, out, NULL);\n        EVP_MD_CTX_free(ctx);\n        return 0; /* success */\n    }\n    EVP_MD_CTX_free(ctx);\n#else\n    EVP_MD_CTX ctx;\n\n    EVP_MD_CTX_init(&ctx);\n    if (EVP_DigestInit(&ctx, EVP_get_digestbyname(\"sha1\"))) {\n        EVP_DigestUpdate(&ctx, message, len);\n        EVP_DigestFinal(&ctx, out, NULL);\n        return 0; /* success */\n    }\n#endif\n    return 1; /* error */\n}\n\nint\n_libssh2_sha256_init(libssh2_sha256_ctx *ctx)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    *ctx = EVP_MD_CTX_new();\n\n    if (*ctx == NULL)\n        return 0;\n\n    if (EVP_DigestInit(*ctx, EVP_get_digestbyname(\"sha256\")))\n        return 1;\n\n    EVP_MD_CTX_free(*ctx);\n    *ctx = NULL;\n\n    return 0;\n#else\n    EVP_MD_CTX_init(ctx);\n    return EVP_DigestInit(ctx, EVP_get_digestbyname(\"sha256\"));\n#endif\n}\n\nint\n_libssh2_sha256(const unsigned char *message, unsigned long len,\n                unsigned char *out)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    EVP_MD_CTX * ctx = EVP_MD_CTX_new();\n\n    if (ctx == NULL)\n        return 1; /* error */\n\n    if(EVP_DigestInit(ctx, EVP_get_digestbyname(\"sha256\"))) {\n        EVP_DigestUpdate(ctx, message, len);\n        EVP_DigestFinal(ctx, out, NULL);\n        EVP_MD_CTX_free(ctx);\n        return 0; /* success */\n    }\n    EVP_MD_CTX_free(ctx);\n#else\n    EVP_MD_CTX ctx;\n\n    EVP_MD_CTX_init(&ctx);\n    if(EVP_DigestInit(&ctx, EVP_get_digestbyname(\"sha256\"))) {\n        EVP_DigestUpdate(&ctx, message, len);\n        EVP_DigestFinal(&ctx, out, NULL);\n        return 0; /* success */\n    }\n#endif\n    return 1; /* error */\n}\n\nint\n_libssh2_md5_init(libssh2_md5_ctx *ctx)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    *ctx = EVP_MD_CTX_new();\n\n    if (*ctx == NULL)\n        return 0;\n\n    if (EVP_DigestInit(*ctx, EVP_get_digestbyname(\"md5\")))\n        return 1;\n\n    EVP_MD_CTX_free(*ctx);\n    *ctx = NULL;\n\n    return 0;\n#else\n    EVP_MD_CTX_init(ctx);\n    return EVP_DigestInit(ctx, EVP_get_digestbyname(\"md5\"));\n#endif\n}\n\nstatic unsigned char *\nwrite_bn(unsigned char *buf, const BIGNUM *bn, int bn_bytes)\n{\n    unsigned char *p = buf;\n\n    /* Left space for bn size which will be written below. */\n    p += 4;\n\n    *p = 0;\n    BN_bn2bin(bn, p + 1);\n    if (!(*(p + 1) & 0x80)) {\n        memmove(p, p + 1, --bn_bytes);\n    }\n    _libssh2_htonu32(p - 4, bn_bytes);  /* Post write bn size. */\n\n    return p + bn_bytes;\n}\n\nstatic unsigned char *\ngen_publickey_from_rsa(LIBSSH2_SESSION *session, RSA *rsa,\n                       size_t *key_len)\n{\n    int            e_bytes, n_bytes;\n    unsigned long  len;\n    unsigned char* key;\n    unsigned char* p;\n\n    e_bytes = BN_num_bytes(rsa->e) + 1;\n    n_bytes = BN_num_bytes(rsa->n) + 1;\n\n    /* Key form is \"ssh-rsa\" + e + n. */\n    len = 4 + 7 + 4 + e_bytes + 4 + n_bytes;\n\n    key = LIBSSH2_ALLOC(session, len);\n    if (key == NULL) {\n        return NULL;\n    }\n\n    /* Process key encoding. */\n    p = key;\n\n    _libssh2_htonu32(p, 7);  /* Key type. */\n    p += 4;\n    memcpy(p, \"ssh-rsa\", 7);\n    p += 7;\n\n    p = write_bn(p, rsa->e, e_bytes);\n    p = write_bn(p, rsa->n, n_bytes);\n\n    *key_len = (size_t)(p - key);\n    return key;\n}\n\n#if LIBSSH2_DSA\nstatic unsigned char *\ngen_publickey_from_dsa(LIBSSH2_SESSION* session, DSA *dsa,\n                       size_t *key_len)\n{\n    int            p_bytes, q_bytes, g_bytes, k_bytes;\n    unsigned long  len;\n    unsigned char* key;\n    unsigned char* p;\n\n    p_bytes = BN_num_bytes(dsa->p) + 1;\n    q_bytes = BN_num_bytes(dsa->q) + 1;\n    g_bytes = BN_num_bytes(dsa->g) + 1;\n    k_bytes = BN_num_bytes(dsa->pub_key) + 1;\n\n    /* Key form is \"ssh-dss\" + p + q + g + pub_key. */\n    len = 4 + 7 + 4 + p_bytes + 4 + q_bytes + 4 + g_bytes + 4 + k_bytes;\n\n    key = LIBSSH2_ALLOC(session, len);\n    if (key == NULL) {\n        return NULL;\n    }\n\n    /* Process key encoding. */\n    p = key;\n\n    _libssh2_htonu32(p, 7);  /* Key type. */\n    p += 4;\n    memcpy(p, \"ssh-dss\", 7);\n    p += 7;\n\n    p = write_bn(p, dsa->p, p_bytes);\n    p = write_bn(p, dsa->q, q_bytes);\n    p = write_bn(p, dsa->g, g_bytes);\n    p = write_bn(p, dsa->pub_key, k_bytes);\n\n    *key_len = (size_t)(p - key);\n    return key;\n}\n#endif /* LIBSSH_DSA */\n\nstatic int\ngen_publickey_from_rsa_evp(LIBSSH2_SESSION *session,\n                           unsigned char **method,\n                           size_t *method_len,\n                           unsigned char **pubkeydata,\n                           size_t *pubkeydata_len,\n                           EVP_PKEY *pk)\n{\n    RSA*           rsa = NULL;\n    unsigned char* key;\n    unsigned char* method_buf = NULL;\n    size_t  key_len;\n\n    _libssh2_debug(session,\n                   LIBSSH2_TRACE_AUTH,\n                   \"Computing public key from RSA private key envelop\");\n\n    rsa = EVP_PKEY_get1_RSA(pk);\n    if (rsa == NULL) {\n        /* Assume memory allocation error... what else could it be ? */\n        goto __alloc_error;\n    }\n\n    method_buf = LIBSSH2_ALLOC(session, 7);  /* ssh-rsa. */\n    if (method_buf == NULL) {\n        goto __alloc_error;\n    }\n\n    key = gen_publickey_from_rsa(session, rsa, &key_len);\n    if (key == NULL) {\n        goto __alloc_error;\n    }\n    RSA_free(rsa);\n\n    memcpy(method_buf, \"ssh-rsa\", 7);\n    *method         = method_buf;\n    *method_len     = 7;\n    *pubkeydata     = key;\n    *pubkeydata_len = key_len;\n    return 0;\n\n  __alloc_error:\n    if (rsa != NULL) {\n        RSA_free(rsa);\n    }\n    if (method_buf != NULL) {\n        LIBSSH2_FREE(session, method_buf);\n    }\n\n    return _libssh2_error(session,\n                          LIBSSH2_ERROR_ALLOC,\n                          \"Unable to allocate memory for private key data\");\n}\n\n#if LIBSSH2_DSA\nstatic int\ngen_publickey_from_dsa_evp(LIBSSH2_SESSION *session,\n                           unsigned char **method,\n                           size_t *method_len,\n                           unsigned char **pubkeydata,\n                           size_t *pubkeydata_len,\n                           EVP_PKEY *pk)\n{\n    DSA*           dsa = NULL;\n    unsigned char* key;\n    unsigned char* method_buf = NULL;\n    size_t  key_len;\n\n    _libssh2_debug(session,\n                   LIBSSH2_TRACE_AUTH,\n                   \"Computing public key from DSA private key envelop\");\n\n    dsa = EVP_PKEY_get1_DSA(pk);\n    if (dsa == NULL) {\n        /* Assume memory allocation error... what else could it be ? */\n        goto __alloc_error;\n    }\n\n    method_buf = LIBSSH2_ALLOC(session, 7);  /* ssh-dss. */\n    if (method_buf == NULL) {\n        goto __alloc_error;\n    }\n\n    key = gen_publickey_from_dsa(session, dsa, &key_len);\n    if (key == NULL) {\n        goto __alloc_error;\n    }\n    DSA_free(dsa);\n\n    memcpy(method_buf, \"ssh-dss\", 7);\n    *method         = method_buf;\n    *method_len     = 7;\n    *pubkeydata     = key;\n    *pubkeydata_len = key_len;\n    return 0;\n\n  __alloc_error:\n    if (dsa != NULL) {\n        DSA_free(dsa);\n    }\n    if (method_buf != NULL) {\n        LIBSSH2_FREE(session, method_buf);\n    }\n\n    return _libssh2_error(session,\n                          LIBSSH2_ERROR_ALLOC,\n                          \"Unable to allocate memory for private key data\");\n}\n#endif /* LIBSSH_DSA */\n\nint\n_libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session,\n                          unsigned char **method,\n                          size_t *method_len,\n                          unsigned char **pubkeydata,\n                          size_t *pubkeydata_len,\n                          const char *privatekey,\n                          const char *passphrase)\n{\n    int       st;\n    BIO*      bp;\n    EVP_PKEY* pk;\n    int       pktype;\n\n    _libssh2_debug(session,\n                   LIBSSH2_TRACE_AUTH,\n                   \"Computing public key from private key file: %s\",\n                   privatekey);\n\n    bp = BIO_new_file(privatekey, \"r\");\n    if (bp == NULL) {\n        return _libssh2_error(session,\n                              LIBSSH2_ERROR_FILE,\n                              \"Unable to extract public key from private key \"\n                              \"file: Unable to open private key file\");\n    }\n    if (!EVP_get_cipherbyname(\"des\")) {\n        /* If this cipher isn't loaded it's a pretty good indication that none\n         * are.  I have *NO DOUBT* that there's a better way to deal with this\n         * ($#&%#$(%$#( Someone buy me an OpenSSL manual and I'll read up on\n         * it.\n         */\n        OpenSSL_add_all_ciphers();\n    }\n    BIO_reset(bp);\n    pk = PEM_read_bio_PrivateKey(bp, NULL, NULL, (void*)passphrase);\n    BIO_free(bp);\n\n    if (pk == NULL) {\n        return _libssh2_error(session,\n                              LIBSSH2_ERROR_FILE,\n                              \"Unable to extract public key \"\n                              \"from private key file: \"\n                              \"Wrong passphrase or invalid/unrecognized \"\n                              \"private key file format\");\n    }\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    pktype = EVP_PKEY_id(pk);\n#else\n    pktype = pk->type;\n#endif\n\n    switch (pktype) {\n    case EVP_PKEY_RSA :\n        st = gen_publickey_from_rsa_evp(\n            session, method, method_len, pubkeydata, pubkeydata_len, pk);\n        break;\n\n#if LIBSSH2_DSA\n    case EVP_PKEY_DSA :\n        st = gen_publickey_from_dsa_evp(\n            session, method, method_len, pubkeydata, pubkeydata_len, pk);\n        break;\n#endif /* LIBSSH_DSA */\n\n    default :\n        st = _libssh2_error(session,\n                            LIBSSH2_ERROR_FILE,\n                            \"Unable to extract public key \"\n                            \"from private key file: \"\n                            \"Unsupported private key file format\");\n        break;\n    }\n\n    EVP_PKEY_free(pk);\n    return st;\n}\n\nint\n_libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session,\n                                unsigned char **method,\n                                size_t *method_len,\n                                unsigned char **pubkeydata,\n                                size_t *pubkeydata_len,\n                                const char *privatekeydata,\n                                size_t privatekeydata_len,\n                                const char *passphrase)\n{\n    int       st;\n    BIO*      bp;\n    EVP_PKEY* pk;\n    int       pktype;\n\n    _libssh2_debug(session,\n                   LIBSSH2_TRACE_AUTH,\n                   \"Computing public key from private key.\");\n\n    bp = BIO_new_mem_buf((char *)privatekeydata, privatekeydata_len);\n    if (!bp) {\n        return -1;\n    }\n    if (!EVP_get_cipherbyname(\"des\")) {\n        /* If this cipher isn't loaded it's a pretty good indication that none\n         * are.  I have *NO DOUBT* that there's a better way to deal with this\n         * ($#&%#$(%$#( Someone buy me an OpenSSL manual and I'll read up on\n         * it.\n         */\n        OpenSSL_add_all_ciphers();\n    }\n    BIO_reset(bp);\n    pk = PEM_read_bio_PrivateKey(bp, NULL, NULL, (void*)passphrase);\n    BIO_free(bp);\n\n    if (pk == NULL) {\n        return _libssh2_error(session,\n                              LIBSSH2_ERROR_FILE,\n                              \"Unable to extract public key \"\n                              \"from private key file: \"\n                              \"Wrong passphrase or invalid/unrecognized \"\n                              \"private key file format\");\n    }\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    pktype = EVP_PKEY_id(pk);\n#else\n    pktype = pk->type;\n#endif\n\n    switch (pktype) {\n    case EVP_PKEY_RSA :\n        st = gen_publickey_from_rsa_evp(session, method, method_len,\n                                        pubkeydata, pubkeydata_len, pk);\n        break;\n#if LIBSSH2_DSA\n    case EVP_PKEY_DSA :\n        st = gen_publickey_from_dsa_evp(session, method, method_len,\n                                        pubkeydata, pubkeydata_len, pk);\n        break;\n#endif /* LIBSSH_DSA */\n    default :\n        st = _libssh2_error(session,\n                            LIBSSH2_ERROR_FILE,\n                            \"Unable to extract public key \"\n                            \"from private key file: \"\n                            \"Unsupported private key file format\");\n        break;\n    }\n\n    EVP_PKEY_free(pk);\n    return st;\n}\n\n#endif /* LIBSSH2_OPENSSL */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/openssl.h",
    "content": "/* Copyright (C) 2009, 2010 Simon Josefsson\n * Copyright (C) 2006, 2007 The Written Word, Inc.  All rights reserved.\n *\n * Author: Simon Josefsson\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include <openssl/opensslconf.h>\n#include <openssl/sha.h>\n#include <openssl/rsa.h>\n#include <openssl/engine.h>\n#ifndef OPENSSL_NO_DSA\n#include <openssl/dsa.h>\n#endif\n#ifndef OPENSSL_NO_MD5\n#include <openssl/md5.h>\n#endif\n#include <openssl/evp.h>\n#include <openssl/hmac.h>\n#include <openssl/bn.h>\n#include <openssl/pem.h>\n#include <openssl/rand.h>\n\n#if OPENSSL_VERSION_NUMBER >= 0x10100000L && \\\n    !defined(LIBRESSL_VERSION_NUMBER)\n# define HAVE_OPAQUE_STRUCTS 1\n#endif\n\n#ifdef OPENSSL_NO_RSA\n# define LIBSSH2_RSA 0\n#else\n# define LIBSSH2_RSA 1\n#endif\n\n#ifdef OPENSSL_NO_DSA\n# define LIBSSH2_DSA 0\n#else\n# define LIBSSH2_DSA 1\n#endif\n\n#ifdef OPENSSL_NO_MD5\n# define LIBSSH2_MD5 0\n#else\n# define LIBSSH2_MD5 1\n#endif\n\n#ifdef OPENSSL_NO_RIPEMD\n# define LIBSSH2_HMAC_RIPEMD 0\n#else\n# define LIBSSH2_HMAC_RIPEMD 1\n#endif\n\n#define LIBSSH2_HMAC_SHA256 1\n#define LIBSSH2_HMAC_SHA512 1\n\n#if OPENSSL_VERSION_NUMBER >= 0x00907000L && !defined(OPENSSL_NO_AES)\n# define LIBSSH2_AES_CTR 1\n# define LIBSSH2_AES 1\n#else\n# define LIBSSH2_AES_CTR 0\n# define LIBSSH2_AES 0\n#endif\n\n#ifdef OPENSSL_NO_BF\n# define LIBSSH2_BLOWFISH 0\n#else\n# define LIBSSH2_BLOWFISH 1\n#endif\n\n#ifdef OPENSSL_NO_RC4\n# define LIBSSH2_RC4 0\n#else\n# define LIBSSH2_RC4 1\n#endif\n\n#ifdef OPENSSL_NO_CAST\n# define LIBSSH2_CAST 0\n#else\n# define LIBSSH2_CAST 1\n#endif\n\n#ifdef OPENSSL_NO_DES\n# define LIBSSH2_3DES 0\n#else\n# define LIBSSH2_3DES 1\n#endif\n\n#define _libssh2_random(buf, len) RAND_bytes ((buf), (len))\n\n#define libssh2_prepare_iovec(vec, len)  /* Empty. */\n\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_sha1_ctx EVP_MD_CTX *\n#else\n#define libssh2_sha1_ctx EVP_MD_CTX\n#endif\n\n/* returns 0 in case of failure */\nint _libssh2_sha1_init(libssh2_sha1_ctx *ctx);\n#define libssh2_sha1_init(x) _libssh2_sha1_init(x)\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_sha1_update(ctx, data, len) EVP_DigestUpdate(ctx, data, len)\n#define libssh2_sha1_final(ctx, out) do { \\\n                                         EVP_DigestFinal(ctx, out, NULL); \\\n                                         EVP_MD_CTX_free(ctx); \\\n                                     } while(0)\n#else\n#define libssh2_sha1_update(ctx, data, len) EVP_DigestUpdate(&(ctx), data, len)\n#define libssh2_sha1_final(ctx, out) EVP_DigestFinal(&(ctx), out, NULL)\n#endif\nint _libssh2_sha1(const unsigned char *message, unsigned long len,\n                  unsigned char *out);\n#define libssh2_sha1(x,y,z) _libssh2_sha1(x,y,z)\n\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_sha256_ctx EVP_MD_CTX *\n#else\n#define libssh2_sha256_ctx EVP_MD_CTX\n#endif\n\n/* returns 0 in case of failure */\nint _libssh2_sha256_init(libssh2_sha256_ctx *ctx);\n#define libssh2_sha256_init(x) _libssh2_sha256_init(x)\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_sha256_update(ctx, data, len) EVP_DigestUpdate(ctx, data, len)\n#define libssh2_sha256_final(ctx, out) do { \\\n                                           EVP_DigestFinal(ctx, out, NULL); \\\n                                           EVP_MD_CTX_free(ctx); \\\n                                       } while(0)\n#else\n#define libssh2_sha256_update(ctx, data, len) EVP_DigestUpdate(&(ctx), data, len)\n#define libssh2_sha256_final(ctx, out) EVP_DigestFinal(&(ctx), out, NULL)\n#endif\nint _libssh2_sha256(const unsigned char *message, unsigned long len,\n                  unsigned char *out);\n#define libssh2_sha256(x,y,z) _libssh2_sha256(x,y,z)\n\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_md5_ctx EVP_MD_CTX *\n#else\n#define libssh2_md5_ctx EVP_MD_CTX\n#endif\n\n/* returns 0 in case of failure */\nint _libssh2_md5_init(libssh2_md5_ctx *ctx);\n#define libssh2_md5_init(x) _libssh2_md5_init(x)\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_md5_update(ctx, data, len) EVP_DigestUpdate(ctx, data, len)\n#define libssh2_md5_final(ctx, out) do { \\\n                                        EVP_DigestFinal(ctx, out, NULL); \\\n                                        EVP_MD_CTX_free(ctx); \\\n                                    } while(0)\n#else\n#define libssh2_md5_update(ctx, data, len) EVP_DigestUpdate(&(ctx), data, len)\n#define libssh2_md5_final(ctx, out) EVP_DigestFinal(&(ctx), out, NULL)\n#endif\n\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_hmac_ctx HMAC_CTX *\n#define libssh2_hmac_ctx_init(ctx) ctx = HMAC_CTX_new()\n#define libssh2_hmac_sha1_init(ctx, key, keylen) \\\n  HMAC_Init_ex(*(ctx), key, keylen, EVP_sha1(), NULL)\n#define libssh2_hmac_md5_init(ctx, key, keylen) \\\n  HMAC_Init_ex(*(ctx), key, keylen, EVP_md5(), NULL)\n#define libssh2_hmac_ripemd160_init(ctx, key, keylen) \\\n  HMAC_Init_ex(*(ctx), key, keylen, EVP_ripemd160(), NULL)\n#define libssh2_hmac_sha256_init(ctx, key, keylen) \\\n  HMAC_Init_ex(*(ctx), key, keylen, EVP_sha256(), NULL)\n#define libssh2_hmac_sha512_init(ctx, key, keylen) \\\n  HMAC_Init_ex(*(ctx), key, keylen, EVP_sha512(), NULL)\n\n#define libssh2_hmac_update(ctx, data, datalen) \\\n  HMAC_Update(ctx, data, datalen)\n#define libssh2_hmac_final(ctx, data) HMAC_Final(ctx, data, NULL)\n#define libssh2_hmac_cleanup(ctx) HMAC_CTX_free(*(ctx))\n#else\n#define libssh2_hmac_ctx HMAC_CTX\n#define libssh2_hmac_ctx_init(ctx) \\\n  HMAC_CTX_init(&ctx)\n#define libssh2_hmac_sha1_init(ctx, key, keylen) \\\n  HMAC_Init_ex(ctx, key, keylen, EVP_sha1(), NULL)\n#define libssh2_hmac_md5_init(ctx, key, keylen) \\\n  HMAC_Init_ex(ctx, key, keylen, EVP_md5(), NULL)\n#define libssh2_hmac_ripemd160_init(ctx, key, keylen) \\\n  HMAC_Init_ex(ctx, key, keylen, EVP_ripemd160(), NULL)\n#define libssh2_hmac_sha256_init(ctx, key, keylen) \\\n  HMAC_Init_ex(ctx, key, keylen, EVP_sha256(), NULL)\n#define libssh2_hmac_sha512_init(ctx, key, keylen) \\\n  HMAC_Init_ex(ctx, key, keylen, EVP_sha512(), NULL)\n\n#define libssh2_hmac_update(ctx, data, datalen) \\\n  HMAC_Update(&(ctx), data, datalen)\n#define libssh2_hmac_final(ctx, data) HMAC_Final(&(ctx), data, NULL)\n#define libssh2_hmac_cleanup(ctx) HMAC_cleanup(ctx)\n#endif\n\n#define libssh2_crypto_init() \\\n  OpenSSL_add_all_algorithms(); \\\n  ENGINE_load_builtin_engines(); \\\n  ENGINE_register_all_complete()\n\n#define libssh2_crypto_exit()\n\n#define libssh2_rsa_ctx RSA\n\n#define _libssh2_rsa_free(rsactx) RSA_free(rsactx)\n\n#define libssh2_dsa_ctx DSA\n\n\n#define _libssh2_dsa_free(dsactx) DSA_free(dsactx)\n\n#define _libssh2_cipher_type(name) const EVP_CIPHER *(*name)(void)\n#ifdef HAVE_OPAQUE_STRUCTS\n#define _libssh2_cipher_ctx EVP_CIPHER_CTX *\n#else\n#define _libssh2_cipher_ctx EVP_CIPHER_CTX\n#endif\n\n#define _libssh2_cipher_aes256 EVP_aes_256_cbc\n#define _libssh2_cipher_aes192 EVP_aes_192_cbc\n#define _libssh2_cipher_aes128 EVP_aes_128_cbc\n#ifdef HAVE_EVP_AES_128_CTR\n#define _libssh2_cipher_aes128ctr EVP_aes_128_ctr\n#define _libssh2_cipher_aes192ctr EVP_aes_192_ctr\n#define _libssh2_cipher_aes256ctr EVP_aes_256_ctr\n#else\n#define _libssh2_cipher_aes128ctr _libssh2_EVP_aes_128_ctr\n#define _libssh2_cipher_aes192ctr _libssh2_EVP_aes_192_ctr\n#define _libssh2_cipher_aes256ctr _libssh2_EVP_aes_256_ctr\n#endif\n#define _libssh2_cipher_blowfish EVP_bf_cbc\n#define _libssh2_cipher_arcfour EVP_rc4\n#define _libssh2_cipher_cast5 EVP_cast5_cbc\n#define _libssh2_cipher_3des EVP_des_ede3_cbc\n\n#ifdef HAVE_OPAQUE_STRUCTS\n#define _libssh2_cipher_dtor(ctx) EVP_CIPHER_CTX_reset(*(ctx))\n#else\n#define _libssh2_cipher_dtor(ctx) EVP_CIPHER_CTX_cleanup(ctx)\n#endif\n\n#define _libssh2_bn BIGNUM\n#define _libssh2_bn_ctx BN_CTX\n#define _libssh2_bn_ctx_new() BN_CTX_new()\n#define _libssh2_bn_ctx_free(bnctx) BN_CTX_free(bnctx)\n#define _libssh2_bn_init() BN_new()\n#define _libssh2_bn_init_from_bin() _libssh2_bn_init()\n#define _libssh2_bn_rand(bn, bits, top, bottom) BN_rand(bn, bits, top, bottom)\n#define _libssh2_bn_mod_exp(r, a, p, m, ctx) BN_mod_exp(r, a, p, m, ctx)\n#define _libssh2_bn_set_word(bn, val) BN_set_word(bn, val)\n#define _libssh2_bn_from_bin(bn, len, val) BN_bin2bn(val, len, bn)\n#define _libssh2_bn_to_bin(bn, val) BN_bn2bin(bn, val)\n#define _libssh2_bn_bytes(bn) BN_num_bytes(bn)\n#define _libssh2_bn_bits(bn) BN_num_bits(bn)\n#define _libssh2_bn_free(bn) BN_clear_free(bn)\n\nconst EVP_CIPHER *_libssh2_EVP_aes_128_ctr(void);\nconst EVP_CIPHER *_libssh2_EVP_aes_192_ctr(void);\nconst EVP_CIPHER *_libssh2_EVP_aes_256_ctr(void);\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/os400qc3.c",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\n#ifdef LIBSSH2_OS400QC3 /* compile only if we build with OS/400 QC3 library */\n\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n\n#include <stdio.h>\n#include <stdarg.h>\n#include <alloca.h>\n#include <sys/uio.h>\n\n#include <arpa/inet.h>\n\n\n#ifdef OS400_DEBUG\n/* In debug mode, all system library errors cause an exception. */\n#define set_EC_length(ec, length)   ((ec).Bytes_Provided =                  \\\n                                     (ec).Bytes_Available = 0)\n#else\n#define set_EC_length(ec, length)   ((ec).Bytes_Provided = (length))\n#endif\n\n\n/* Ensure va_list operations are not on an array. */\ntypedef struct {\n    va_list     list;\n}       valiststr;\n\n\ntypedef int (*loadkeyproc)(LIBSSH2_SESSION *session,\n                           const unsigned char *data, unsigned int datalen,\n                           const unsigned char *passphrase, void *loadkeydata);\n\n/* Public key extraction data. */\ntypedef struct {\n    const char *            method;\n    const unsigned char *   data;\n    unsigned int            length;\n}       loadpubkeydata;\n\n\n/* Support for ASN.1 elements. */\n\ntypedef struct {\n    char *          header;         /* Pointer to header byte. */\n    char *          beg;            /* Pointer to element data. */\n    char *          end;            /* Pointer to 1st byte after element. */\n    unsigned char   class;          /* ASN.1 element class. */\n    unsigned char   tag;            /* ASN.1 element tag. */\n    unsigned char   constructed;    /* Element is constructed. */\n}       asn1Element;\n\n#define ASN1_INTEGER        2\n#define ASN1_BIT_STRING     3\n#define ASN1_OCTET_STRING   4\n#define ASN1_NULL           5\n#define ASN1_OBJ_ID         6\n#define ASN1_SEQ            16\n\n#define ASN1_CONSTRUCTED    0x20\n\n/* rsaEncryption OID: 1.2.840.113549.1.1.1 */\nstatic unsigned char    OID_rsaEncryption[] =\n                            {9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 1, 1, 1};\nstatic int  sshrsapubkey(LIBSSH2_SESSION *session, char **sshpubkey,\n                         asn1Element *params, asn1Element *key,\n                         const char *method);\n\n#if LIBSSH2_DSA != 0\n/* dsaEncryption OID: 1.2.840.10040.4.1 */\nstatic unsigned char    OID_dsaEncryption[] =\n                            {7, 40 + 2, 0x86, 0x48, 0xCE, 0x38, 4, 1};\nstatic int  sshdsapubkey(LIBSSH2_SESSION *session, char **sshpubkey,\n                         asn1Element *params, asn1Element *key,\n                         const char *method);\n#endif\n\n\n/* PKCS#5 support. */\n\ntypedef struct pkcs5params  pkcs5params;\nstruct pkcs5params {\n    int         cipher;         /* Encryption cipher. */\n    int         blocksize;      /* Cipher block size. */\n    char        mode;           /* Block encryption mode. */\n    char        padopt;         /* Pad option. */\n    char        padchar;        /* Pad character. */\n    int         (*kdf)(LIBSSH2_SESSION *session, char **dk,\n                       const unsigned char * passphrase, pkcs5params *pkcs5);\n    int         hash;           /* KDF hash algorithm. */\n    size_t      hashlen;        /* KDF hash digest length. */\n    char *      salt;           /* Salt. */\n    size_t      saltlen;        /* Salt length. */\n    char *      iv;             /* Initialization vector. */\n    size_t      ivlen;          /* Initialization vector length. */\n    int         itercount;      /* KDF iteration count. */\n    int         dklen;          /* Derived key length (#bytes). */\n    int         effkeysize;     /* RC2 effective key size (#bits) or 0. */\n};\n\ntypedef struct pkcs5algo    pkcs5algo;\nstruct pkcs5algo {\n    const unsigned char *   oid;\n    int         (*parse)(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                         pkcs5algo *algo, asn1Element *param);\n    int         cipher;         /* Encryption cipher. */\n    size_t      blocksize;      /* Cipher block size. */\n    char        mode;           /* Block encryption mode. */\n    char        padopt;         /* Pad option. */\n    char        padchar;        /* Pad character. */\n    size_t      keylen;         /* Key length (#bytes). */\n    int         hash;           /* Hash algorithm. */\n    size_t      hashlen;        /* Hash digest length. */\n    size_t      saltlen;        /* Salt length. */\n    size_t      ivlen;          /* Initialisation vector length. */\n    int         effkeysize;     /* RC2 effective key size (#bits) or 0. */\n};\n\n/* id-PBES2 OID: 1.2.840.113549.1.5.13 */\nstatic const unsigned char  OID_id_PBES2[] = {\n    9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x0D\n};\nstatic int  parse_pbes2(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                        pkcs5algo *algo, asn1Element *param);\nstatic const pkcs5algo  PBES2 = {\n    OID_id_PBES2,   parse_pbes2,    0,  0,  '\\0',   '\\0',   '\\0',   0,\n    0,  0,  0,  0,  0\n};\n\n/* id-PBKDF2 OID: 1.2.840.113549.1.5.12 */\nstatic const unsigned char  OID_id_PBKDF2[] = {\n    9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x0C\n};\nstatic int  parse_pbkdf2(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                         pkcs5algo *algo, asn1Element *param);\nstatic const pkcs5algo  PBKDF2 = {\n    OID_id_PBKDF2,  parse_pbkdf2,   0,  0,  '\\0',   '\\0',   '\\0',\n    SHA_DIGEST_LENGTH,  Qc3_SHA1,   SHA_DIGEST_LENGTH,  8,  8,  0\n};\n\n/* id-hmacWithSHA1 OID: 1.2.840.113549.2.7 */\nstatic const unsigned char  OID_id_hmacWithSHA1[] = {\n    8, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x07\n};\nstatic int  parse_hmacWithSHA1(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                               pkcs5algo *algo, asn1Element *param);\nstatic const pkcs5algo  hmacWithSHA1 = {\n    OID_id_hmacWithSHA1,    parse_hmacWithSHA1, 0,  0,  '\\0',   '\\0',   '\\0',\n    SHA_DIGEST_LENGTH,  Qc3_SHA1,   SHA_DIGEST_LENGTH,  8,  8,  0\n};\n\n/* desCBC OID: 1.3.14.3.2.7 */\nstatic const unsigned char  OID_desCBC[] = {5, 40 + 3, 0x0E, 0x03, 0x02, 0x07};\nstatic int  parse_iv(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                     pkcs5algo *algo, asn1Element *param);\nstatic const pkcs5algo  desCBC = {\n    OID_desCBC, parse_iv,   Qc3_DES,    8,  Qc3_CBC,    Qc3_Pad_Counter,\n   '\\0',   8,   0,  0,  8,  8,  0\n};\n\n/* des-EDE3-CBC OID: 1.2.840.113549.3.7 */\nstatic const unsigned char  OID_des_EDE3_CBC[] = {\n    8, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x03, 0x07\n};\nstatic const pkcs5algo  des_EDE3_CBC = {\n    OID_des_EDE3_CBC,   parse_iv,   Qc3_TDES,   8,  Qc3_CBC, Qc3_Pad_Counter,\n    '\\0',   24, 0,  0,  8,  8,  0\n};\n \n/* rc2CBC OID: 1.2.840.113549.3.2 */\nstatic const unsigned char  OID_rc2CBC[] = {\n    8, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x03, 0x02\n};\nstatic int  parse_rc2(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                      pkcs5algo *algo, asn1Element *param);\nstatic const pkcs5algo  rc2CBC = {\n    OID_rc2CBC, parse_rc2,  Qc3_RC2,    8,  Qc3_CBC,    Qc3_Pad_Counter,\n    '\\0',   0,  0,  0,  8,  0,  32\n};\n\n/* pbeWithMD5AndDES-CBC OID: 1.2.840.113549.1.5.3 */\nstatic const unsigned char  OID_pbeWithMD5AndDES_CBC[] = {\n    9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x03\n};\nstatic int  parse_pbes1(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                        pkcs5algo *algo, asn1Element *param);\nstatic const pkcs5algo  pbeWithMD5AndDES_CBC = {\n    OID_pbeWithMD5AndDES_CBC,   parse_pbes1,    Qc3_DES,    8,  Qc3_CBC,\n    Qc3_Pad_Counter,    '\\0',   8,  Qc3_MD5,    MD5_DIGEST_LENGTH,  8,  0,  0\n};\n\n/* pbeWithMD5AndRC2-CBC OID: 1.2.840.113549.1.5.6 */\nstatic const unsigned char  OID_pbeWithMD5AndRC2_CBC[] = {\n    9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x06\n};\nstatic const pkcs5algo  pbeWithMD5AndRC2_CBC = {\n    OID_pbeWithMD5AndRC2_CBC,   parse_pbes1,    Qc3_RC2,    8,  Qc3_CBC,\n    Qc3_Pad_Counter,    '\\0',   0,  Qc3_MD5,    MD5_DIGEST_LENGTH,  8,  0,  64\n};\n\n/* pbeWithSHA1AndDES-CBC OID: 1.2.840.113549.1.5.10 */\nstatic const unsigned char  OID_pbeWithSHA1AndDES_CBC[] = {\n    9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x0A\n};\nstatic const pkcs5algo  pbeWithSHA1AndDES_CBC = {\n    OID_pbeWithSHA1AndDES_CBC,   parse_pbes1,    Qc3_DES,    8,  Qc3_CBC,\n    Qc3_Pad_Counter,    '\\0',   8,  Qc3_SHA1,   SHA_DIGEST_LENGTH,  8,  0, 0\n};\n\n/* pbeWithSHA1AndRC2-CBC OID: 1.2.840.113549.1.5.11 */\nstatic const unsigned char  OID_pbeWithSHA1AndRC2_CBC[] = {\n    9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x0B\n};\nstatic const pkcs5algo  pbeWithSHA1AndRC2_CBC = {\n    OID_pbeWithSHA1AndRC2_CBC,   parse_pbes1,    Qc3_RC2,    8,  Qc3_CBC,\n    Qc3_Pad_Counter,    '\\0',   0,  Qc3_SHA1,   SHA_DIGEST_LENGTH,  8,  0,  64\n};\n\n/* rc5-CBC-PAD OID: 1.2.840.113549.3.9: RC5 not implemented in Qc3. */\n/* pbeWithMD2AndDES-CBC OID: 1.2.840.113549.1.5.1: MD2 not implemented. */\n/* pbeWithMD2AndRC2-CBC OID: 1.2.840.113549.1.5.4: MD2 not implemented. */\n\nstatic const pkcs5algo *    pbestable[] = {\n    &pbeWithMD5AndDES_CBC,\n    &pbeWithMD5AndRC2_CBC,\n    &pbeWithSHA1AndDES_CBC,\n    &pbeWithSHA1AndRC2_CBC,\n    &PBES2,\n    NULL\n};\n\nstatic const pkcs5algo *    pbkdf2table[] = {\n    &PBKDF2,\n    NULL\n};\n\nstatic const pkcs5algo *    pbes2enctable[] = {\n    &desCBC,\n    &des_EDE3_CBC,\n    &rc2CBC,\n    NULL\n};\n\nstatic const pkcs5algo *    kdf2prftable[] = {\n    &hmacWithSHA1,\n    NULL\n};\n\n\n/* Public key extraction support. */\nstatic struct {\n    unsigned char * oid;\n    int             (*sshpubkey)(LIBSSH2_SESSION *session, char **pubkey,\n                                 asn1Element *params, asn1Element *key,\n                                 const char *method);\n    const char *    method;\n}       pka[] = {\n#if LIBSSH2_RSA != 0\n    {   OID_rsaEncryption,  sshrsapubkey,   \"ssh-rsa\"   },\n#endif\n#if LIBSSH2_DSA != 0\n    {   OID_dsaEncryption,  sshdsapubkey,   \"ssh-dss\"   },\n#endif\n    {   NULL,               NULL,           NULL        }\n};\n\n/* Define ASCII strings. */\nstatic const char   beginencprivkeyhdr[] =\n                                    \"-----BEGIN ENCRYPTED PRIVATE KEY-----\";\nstatic const char   endencprivkeyhdr[] = \"-----END ENCRYPTED PRIVATE KEY-----\";\nstatic const char   beginprivkeyhdr[] = \"-----BEGIN PRIVATE KEY-----\";\nstatic const char   endprivkeyhdr[] = \"-----END PRIVATE KEY-----\";\nstatic const char   beginrsaprivkeyhdr[] = \"-----BEGIN RSA PRIVATE KEY-----\";\nstatic const char   endrsaprivkeyhdr[] = \"-----END RSA PRIVATE KEY-----\";\nstatic const char   fopenrmode[] = \"r\";\nstatic const char   fopenrbmode[] = \"rb\";\n\n\n/* The rest of character literals in this module are in EBCDIC. */\n#pragma convert(37)\n\n#include <qusec.h>\n#include <qc3prng.h>\n#include <qc3dtaen.h>\n#include <qc3dtade.h>\n#include <qc3ctx.h>\n#include <qc3hash.h>\n#include <qc3hmac.h>\n#include <qc3pbext.h>\n#include <qc3sigvr.h>\n#include <qc3sigcl.h>\n#include <qc3pbext.h>\n\nstatic Qc3_Format_KEYD0100_T    nulltoken = {\"\"};\n\nstatic int      zero = 0;\nstatic int      rsaprivate[] = { Qc3_RSA_Private };\nstatic char     anycsp[] = { Qc3_Any_CSP };\nstatic char     binstring[] = { Qc3_Bin_String };\nstatic char     berstring[] = { Qc3_BER_String };\nstatic char     qc3clear[] = { Qc3_Clear };\n\nstatic const Qus_EC_t ecnull = {0};     /* Error causes an exception. */\n\nstatic asn1Element  lastbytebitcount = {\n    (char *) &zero, NULL, (char *) &zero + 1\n};\n\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: ASN.1 support.\n *\n *******************************************************************/\n\nstatic char *\ngetASN1Element(asn1Element *elem, char *beg, char *end)\n{\n    unsigned char b;\n    unsigned long len;\n    asn1Element lelem;\n\n    /* Get a single ASN.1 element into `elem', parse ASN.1 string at `beg'\n     * ending at `end'.\n     * Returns a pointer in source string after the parsed element, or NULL\n     * if an error occurs.\n     */\n\n    if (beg >= end || !*beg)\n        return NULL;\n\n    /* Process header byte. */\n    elem->header = beg;\n    b = (unsigned char) *beg++;\n    elem->constructed = (b & 0x20) != 0;\n    elem->class = (b >> 6) & 3;\n    b &= 0x1F;\n    if (b == 0x1F)\n        return NULL;            /* Long tag values not supported here. */\n    elem->tag = b;\n\n    /* Process length. */\n    if (beg >= end)\n        return NULL;\n    b = (unsigned char) *beg++;\n    if (!(b & 0x80))\n        len = b;\n    else if (!(b &= 0x7F)) {\n        /* Unspecified length. Since we have all the data, we can determine the\n         * effective length by skipping element until an end element is\n         * found.\n         */\n        if (!elem->constructed)\n            return NULL;\n        elem->beg = beg;\n        while (beg < end && *beg) {\n            beg = getASN1Element(&lelem, beg, end);\n        if (!beg)\n            return NULL;\n        }\n        if (beg >= end)\n            return NULL;\n        elem->end = beg;\n        return beg + 1;\n    } else if (beg + b > end)\n        return NULL;                        /* Does not fit in source. */\n    else {\n        /* Get long length. */\n        len = 0;\n        do {\n            if (len & 0xFF000000L)\n                return NULL;    /* Lengths > 32 bits are not supported. */\n            len = (len << 8) | (unsigned char) *beg++;\n        } while (--b);\n    }\n    if ((unsigned long) (end - beg) < len)\n        return NULL;            /* Element data does not fit in source. */\n    elem->beg = beg;\n    elem->end = beg + len;\n    return elem->end;\n}\n\nstatic asn1Element *\nasn1_new(unsigned int type, unsigned int length)\n{\n    asn1Element *e;\n    unsigned int hdrl = 2;\n    unsigned int i;\n    unsigned char *buf;\n\n    e = (asn1Element *) malloc(sizeof *e);\n\n    if (e) {\n        if (length >= 0x80)\n            for (i = length; i; i >>= 8)\n                hdrl++;\n\n        buf = (unsigned char *) malloc(hdrl + length);\n\n        if (buf) {\n            e->header = buf;\n            e->beg = buf + hdrl;\n            e->end = e->beg + length;\n            e->class = (type >> 6) & 0x03;\n            e->tag = type & 0x1F;\n            e->constructed = (type >> 5) & 0x01;\n            e->header[0] = type;\n\n            if (length < 0x80)\n                e->header[1] = length;\n            else {\n                e->header[1] = (hdrl - 2) | 0x80;\n                do {\n                    e->header[--hdrl] = length;\n                    length >>= 8;\n                } while (length);\n            }\n        } else {\n            free((char *) e);\n            e = NULL;\n        }\n    }\n\n    return e;\n}\n\nstatic asn1Element *\nasn1_new_from_bytes(const unsigned char *data, unsigned int length)\n{\n    asn1Element *e;\n    asn1Element te;\n\n    getASN1Element(&te,\n                   (unsigned char *) data, (unsigned char *) data + length);\n    e = asn1_new(te.tag, te.end - te.beg);\n\n    if (e)\n        memcpy(e->header, data, e->end - e->header);\n\n    return e;\n}\n\nstatic void\nasn1delete(asn1Element *e)\n{\n    if (e) {\n        if (e->header)\n            free((char *) e->header);\n        free((char *) e);\n    }\n}\n\nstatic asn1Element *\nasn1uint(_libssh2_bn *bn)\n{\n    asn1Element *e;\n    int bits;\n    int length;\n    unsigned char * p;\n\n    if (!bn)\n        return NULL;\n\n    bits = _libssh2_bn_bits(bn);\n    length = (bits + 8) >> 3;\n    e = asn1_new(ASN1_INTEGER, length);\n\n    if (e) {\n        p = e->beg;\n        if (!(bits & 0x07))\n            *p++ = 0;\n        _libssh2_bn_to_bin(bn, p);\n    }\n\n    return e;\n}\n\nstatic asn1Element *\nasn1containerv(unsigned int type, valiststr args)\n{\n    valiststr va;\n    asn1Element *e;\n    asn1Element *p;\n    unsigned char *bp;\n    unsigned int length = 0;\n\n    memcpy((char *) &va, (char *) &args, sizeof args);\n    while ((p = va_arg(va.list, asn1Element *)))\n        length += p->end - p->header;\n    va_end(va.list);\n    e = asn1_new(type, length);\n    if (e) {\n        bp = e->beg;\n        while ((p = va_arg(args.list, asn1Element *))) {\n            memcpy(bp, p->header, p->end - p->header);\n            bp += p->end - p->header;\n        }\n    }\n    return e;\n}\n\n/* VARARGS1 */\nstatic asn1Element *\nasn1container(unsigned int type, ...)\n{\n    valiststr va;\n    asn1Element *e;\n\n    va_start(va.list, type);\n    e = asn1containerv(type, va);\n    va_end(va.list);\n    return e;\n}\n\nstatic asn1Element *\nasn1bytes(unsigned int type, const unsigned char *bytes, unsigned int length)\n{\n    asn1Element *e;\n\n    e = asn1_new(type, length);\n    if (e && length)\n        memcpy(e->beg, bytes, length);\n    return e;\n}\n\nstatic asn1Element *\nrsapublickey(_libssh2_bn *e, _libssh2_bn *m)\n{\n    asn1Element *publicexponent;\n    asn1Element *modulus;\n    asn1Element *rsapubkey;\n\n    /* Build a PKCS#1 RSAPublicKey. */\n\n    modulus = asn1uint(m);\n    publicexponent = asn1uint(e);\n    rsapubkey = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED,\n                              modulus, publicexponent, NULL);\n    asn1delete(modulus);\n    asn1delete(publicexponent);\n\n    if (!modulus || !publicexponent) {\n        asn1delete(rsapubkey);\n        rsapubkey = NULL;\n    }\n\n    return rsapubkey;\n}\n\nstatic asn1Element *\nrsaprivatekey(_libssh2_bn *e, _libssh2_bn *m, _libssh2_bn *d,\n              _libssh2_bn *p, _libssh2_bn *q,\n              _libssh2_bn *exp1, _libssh2_bn *exp2, _libssh2_bn *coeff)\n{\n    asn1Element *version;\n    asn1Element *modulus;\n    asn1Element *publicexponent;\n    asn1Element *privateexponent;\n    asn1Element *prime1;\n    asn1Element *prime2;\n    asn1Element *exponent1;\n    asn1Element *exponent2;\n    asn1Element *coefficient;\n    asn1Element *rsaprivkey;\n\n    /* Build a PKCS#1 RSAPrivateKey. */\n    version = asn1bytes(ASN1_INTEGER, \"\\0\", 1);\n    modulus = asn1uint(m);\n    publicexponent = asn1uint(e);\n    privateexponent = asn1uint(d);\n    prime1 = asn1uint(p);\n    prime2 = asn1uint(q);\n    exponent1 = asn1uint(exp1);\n    exponent2 = asn1uint(exp2);\n    coefficient = asn1uint(coeff);\n    rsaprivkey = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED, version, modulus,\n                               publicexponent, privateexponent, prime1, prime2,\n                               exponent1, exponent2, coefficient, NULL);\n    asn1delete(version);\n    asn1delete(modulus);\n    asn1delete(publicexponent);\n    asn1delete(privateexponent);\n    asn1delete(prime1);\n    asn1delete(prime2);\n    asn1delete(exponent1);\n    asn1delete(exponent2);\n    asn1delete(coefficient);\n\n    if (!version || !modulus || !publicexponent || !privateexponent ||\n        !prime1 || !prime2 || !exponent1 || !exponent2 || !coefficient) {\n        asn1delete(rsaprivkey);\n        rsaprivkey = NULL;\n    }\n\n    return rsaprivkey;\n}\n\nstatic asn1Element *\nsubjectpublickeyinfo(asn1Element *pubkey, const unsigned char *algo,\n                     asn1Element *parameters)\n{\n    asn1Element *subjpubkey;\n    asn1Element *algorithm;\n    asn1Element *algorithmid;\n    asn1Element *subjpubkeyinfo;\n    unsigned int algosize = *algo++;\n\n    algorithm = asn1bytes(ASN1_OBJ_ID, algo, algosize);\n    algorithmid = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED,\n                                algorithm, parameters, NULL);\n    subjpubkey = asn1container(ASN1_BIT_STRING, &lastbytebitcount,\n                               pubkey, NULL);\n    subjpubkeyinfo = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED,\n                                   algorithmid, subjpubkey, NULL);\n    asn1delete(algorithm);\n    asn1delete(algorithmid);\n    asn1delete(subjpubkey);\n    if (!algorithm || !algorithmid || !subjpubkey) {\n        asn1delete(subjpubkeyinfo);\n        subjpubkeyinfo = NULL;\n    }\n    return subjpubkeyinfo;\n}\n\nstatic asn1Element *\nrsasubjectpublickeyinfo(asn1Element *pubkey)\n{\n    asn1Element *parameters;\n    asn1Element *subjpubkeyinfo;\n\n    parameters = asn1bytes(ASN1_NULL, NULL, 0);\n    subjpubkeyinfo = subjectpublickeyinfo(pubkey,\n                                          OID_rsaEncryption, parameters);\n    asn1delete(parameters);\n    if (!parameters) {\n        asn1delete(subjpubkeyinfo);\n        subjpubkeyinfo = NULL;\n    }\n    return subjpubkeyinfo;\n}\n\nstatic asn1Element *\nprivatekeyinfo(asn1Element *privkey, const unsigned char *algo,\n               asn1Element *parameters)\n{\n    asn1Element *version;\n    asn1Element *privatekey;\n    asn1Element *algorithm;\n    asn1Element *privatekeyalgorithm;\n    asn1Element *privkeyinfo;\n    unsigned int algosize = *algo++;\n\n    /* Build a PKCS#8 PrivateKeyInfo. */\n    version = asn1bytes(ASN1_INTEGER, \"\\0\", 1);\n    algorithm = asn1bytes(ASN1_OBJ_ID, algo, algosize);\n    privatekeyalgorithm = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED,\n                                        algorithm, parameters, NULL);\n    privatekey = asn1container(ASN1_OCTET_STRING, privkey, NULL);\n    privkeyinfo = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED, version,\n                                privatekeyalgorithm, privatekey, NULL);\n    asn1delete(version);\n    asn1delete(algorithm);\n    asn1delete(privatekeyalgorithm);\n    if (!version || !algorithm || !privatekeyalgorithm) {\n        asn1delete(privkeyinfo);\n        privkeyinfo = NULL;\n    }\n    return privkeyinfo;\n}\n\nstatic asn1Element *\nrsaprivatekeyinfo(asn1Element *privkey)\n{\n    asn1Element *parameters;\n    asn1Element *privkeyinfo;\n\n    parameters = asn1bytes(ASN1_NULL, NULL, 0);\n    privkeyinfo = privatekeyinfo(privkey, OID_rsaEncryption, parameters);\n    asn1delete(parameters);\n    if (!parameters) {\n        asn1delete(privkeyinfo);\n        privkeyinfo = NULL;\n    }\n    return privkeyinfo;\n}\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: big numbers support.\n *\n *******************************************************************/\n\n\n_libssh2_bn *\n_libssh2_bn_init(void)\n{\n    _libssh2_bn *bignum;\n\n    bignum = (_libssh2_bn *) malloc(sizeof *bignum);\n    if (bignum) {\n        bignum->bignum = NULL;\n        bignum->length = 0;\n    }\n\n    return bignum;\n}\n\nvoid\n_libssh2_bn_free(_libssh2_bn *bn)\n{\n    if (bn) {\n        if (bn->bignum) {\n#ifdef LIBSSH2_CLEAR_MEMORY\n            if (bn->length)\n                memset((char *) bn->bignum, 0, bn->length);\n#endif\n            free(bn->bignum);\n        }\n\n        free((char *) bn);\n    }\n}\n\nstatic int\n_libssh2_bn_resize(_libssh2_bn *bn, size_t newlen)\n{\n    unsigned char *bignum;\n\n    if (!bn)\n        return -1;\n    if (newlen == bn->length)\n        return 0;\n\n    if (!bn->bignum)\n        bignum = (unsigned char *) malloc(newlen);\n    else {\n#ifdef LIBSSH2_CLEAR_MEMORY\n        if (newlen < bn->length)\n            memset((char *) bn->bignum + newlen, 0, bn->length - newlen);\n#endif\n        if (!newlen) {\n            free((char *) bn->bignum);\n            bn->bignum = NULL;\n            bn->length = 0;\n            return 0;\n        }\n        bignum = (unsigned char *) realloc((char *) bn->bignum, newlen);\n    }\n\n    if (!bignum)\n        return -1;\n\n    if (newlen > bn->length)\n        memset((char *) bignum + bn->length, 0, newlen - bn->length);\n\n    bn->bignum = bignum;\n    bn->length = newlen;\n    return 0;\n}\n\nunsigned long\n_libssh2_bn_bits(_libssh2_bn *bn)\n{\n    unsigned int i;\n    unsigned char b;\n\n    if (bn && bn->bignum) {\n        for (i = bn->length; i--;)\n            if ((b = bn->bignum[i])) {\n                i *= 8;\n                do {\n                    i++;\n                } while (b >>= 1);\n                return i;\n            }\n    }\n\n    return 0;\n}\n\nint\n_libssh2_bn_from_bin(_libssh2_bn *bn, int len, const unsigned char *val)\n{\n    int i;\n\n    if (!bn || (len && !val))\n        return -1;\n\n    for (; len && !*val; len--)\n        val++;\n\n    if (_libssh2_bn_resize(bn, len))\n        return -1;\n\n    for (i = len; i--;)\n        bn->bignum[i] = *val++;\n\n    return 0;\n}\n\nint\n_libssh2_bn_set_word(_libssh2_bn *bn, unsigned long val)\n{\n    val = htonl(val);\n    return _libssh2_bn_from_bin(bn, sizeof val, (unsigned char *) &val);\n}\n\nint\n_libssh2_bn_to_bin(_libssh2_bn *bn, unsigned char *val)\n{\n    int i;\n\n    if (!bn || !val)\n        return -1;\n\n    for (i = bn->length; i--;)\n        *val++ = bn->bignum[i];\n\n    return 0;\n}\n\nstatic int\n_libssh2_bn_from_bn(_libssh2_bn *to, _libssh2_bn *from)\n{\n    int i;\n\n    if (!to || !from)\n        return -1;\n\n    if (_libssh2_bn_resize(to, from->length))\n        return -1;\n\n    for (i = to->length; i--;)\n        to->bignum[i] = from->bignum[i];\n\n    return 0;\n}\n\nvoid\n_libssh2_random(unsigned char *buf, int len)\n{\n    Qc3GenPRNs(buf, len,\n        Qc3PRN_TYPE_NORMAL, Qc3PRN_NO_PARITY, (char *) &ecnull);\n}\n\nint\n_libssh2_bn_rand(_libssh2_bn *bn, int bits, int top, int bottom)\n{\n    int len;\n    int i;\n\n    if (!bn || bits <= 0)\n        return -1;\n    len = (bits + 7) >> 3;\n    if (_libssh2_bn_resize(bn, len))\n        return -1;\n    _libssh2_random(bn->bignum, len);\n    i = ((bits - 1) & 07) + 1;\n    bn->bignum[len - 1] &= (1 << i) - 1;\n    switch (top) {\n    case 1:\n        if (bits > 1)\n            if (i > 1)\n                bn->bignum[len - 1] |= 1 << (i - 2);\n            else\n                bn->bignum[len - 2] |= 0x80;\n        /* Fall into. */\n    case 0:\n        bn->bignum[len - 1] |= 1 << (i - 1);\n        break;\n    }\n    if (bottom)\n        *bn->bignum |= 0x01;\n    return 0;\n}\n\nstatic int\n_libssh2_bn_lshift(_libssh2_bn *bn)\n{\n    int i;\n    int c = 0;\n\n    if (!bn)\n        return -1;\n\n    if (_libssh2_bn_resize(bn, (_libssh2_bn_bits(bn) + 8) >> 3))\n        return -1;\n\n    for (i = 0; i < bn->length; i++) {\n        if (bn->bignum[i] & 0x80)\n            c |= 0x02;\n        bn->bignum[i] = (bn->bignum[i] << 1) | (c & 0x01);\n        c >>= 1;\n    }\n\n    return 0;\n}\n\nstatic int\n_libssh2_bn_rshift(_libssh2_bn *bn)\n{\n    int i;\n    int c = 0;\n\n    if (!bn)\n        return -1;\n\n    for (i = bn->length; i--;) {\n        if (bn->bignum[i] & 0x01)\n            c |= 0x100;\n        bn->bignum[i] = (bn->bignum[i] >> 1) | (c & 0x80);\n        c >>= 1;\n    }\n\n    if (_libssh2_bn_resize(bn, (_libssh2_bn_bits(bn) + 7) >> 3))\n        return -1;\n\n    return 0;\n}\n\nstatic void\n_libssh2_bn_swap(_libssh2_bn *bn1, _libssh2_bn *bn2)\n{\n    _libssh2_bn t = *bn1;\n\n    *bn1 = *bn2;\n    *bn2 = t;\n}\n\nstatic int\n_libssh2_bn_subtract(_libssh2_bn *d, _libssh2_bn *bn1, _libssh2_bn *bn2)\n{\n    int c = 0;\n    int i;\n\n    if (bn1->length < bn2->length)\n        return -1;\n\n    if (_libssh2_bn_resize(d, bn1->length))\n        return -1;\n\n    for (i = 0; i < bn2->length; i++) {\n        c += (int) bn1->bignum[i] - (int) bn2->bignum[i];\n        d->bignum[i] = c;\n        c = c < 0? -1: 0;\n    }\n\n    for (; c && i < bn1->length; i++) {\n        c += (int) bn1->bignum[i];\n        d->bignum[i] = c;\n        c = c < 0? -1: 0;\n    }\n\n    if (_libssh2_bn_resize(d, (_libssh2_bn_bits(d) + 7) >> 3))\n        return -1;\n\n    return c;\n}\n\nint\n_libssh2_os400qc3_bn_mod_exp(_libssh2_bn *r, _libssh2_bn *a, _libssh2_bn *p,\n                             _libssh2_bn *m)\n{\n    _libssh2_bn *mp;\n    _libssh2_bn *rp;\n    asn1Element *rsapubkey;\n    asn1Element *subjpubkeyinfo;\n    unsigned char *av;\n    unsigned char *rv;\n    char *keydbuf;\n    Qc3_Format_ALGD0400_T algd;\n    Qc3_Format_KEYD0200_T *keyd;\n    Qus_EC_t errcode;\n    int sc;\n    int outlen;\n    int ret = -1;\n\n    /* There is no support for this function in the Qc3 crypto-library.\n       Since a RSA encryption performs this function, we can emulate it\n       by creating an RSA public key in ASN.1 SubjectPublicKeyInfo format\n       from p (exponent) and m (modulus) and encrypt a with this key. The\n       encryption output is the function result.\n       Problem: the Qc3EncryptData procedure only succeeds if the data bit\n       count is less than the modulus bit count. To satisfy this condition,\n       we multiply the modulus by a power of two and adjust the result\n       accordingly. */\n\n    if (!r || !a || !p)\n        return ret;\n \n    mp = _libssh2_bn_init();\n    if (!mp)\n        return ret;\n    if (_libssh2_bn_from_bn(mp, m)) {\n        _libssh2_bn_free(mp);\n        return ret;\n    }\n    for (sc = 0; _libssh2_bn_bits(mp) <= 8 * a->length; sc++)\n        if (_libssh2_bn_lshift(mp)) {\n            _libssh2_bn_free(mp);\n            return ret;\n        }\n\n    rsapubkey = rsapublickey(p, mp);\n    subjpubkeyinfo = rsasubjectpublickeyinfo(rsapubkey);\n    asn1delete(rsapubkey);\n\n    if (!rsapubkey || !subjpubkeyinfo) {\n        asn1delete(rsapubkey);\n        asn1delete(subjpubkeyinfo);\n        _libssh2_bn_free(mp);\n        return ret;\n    }\n\n    av = (unsigned char *) alloca(a->length);\n    rv = (unsigned char *) alloca(mp->length);\n    keydbuf = alloca(sizeof *keyd +\n                     subjpubkeyinfo->end - subjpubkeyinfo->header);\n\n    if (av && rv && keydbuf) {\n        _libssh2_bn_to_bin(a, av);\n        algd.Public_Key_Alg = Qc3_RSA;\n        algd.PKA_Block_Format = Qc3_Zero_Pad;\n        memset(algd.Reserved, 0, sizeof algd.Reserved);\n        algd.Signing_Hash_Alg = 0;\n        keyd = (Qc3_Format_KEYD0200_T *) keydbuf;\n        keyd->Key_Type = Qc3_RSA_Public;\n        keyd->Key_String_Len = subjpubkeyinfo->end - subjpubkeyinfo->header;\n        keyd->Key_Format = Qc3_BER_String;\n        memset(keyd->Reserved, 0, sizeof keyd->Reserved);\n        memcpy(keydbuf + sizeof *keyd, subjpubkeyinfo->header,\n               keyd->Key_String_Len);\n        set_EC_length(errcode, sizeof errcode);\n        Qc3EncryptData(av, (int *) &a->length, Qc3_Data, (char *) &algd,\n                       Qc3_Alg_Public_Key, keydbuf, Qc3_Key_Parms, anycsp,\n                       NULL, rv, (int *) &mp->length, &outlen, &errcode);\n        if (!errcode.Bytes_Available) {\n            _libssh2_bn_from_bin(r, outlen, rv);\n            if (!sc)\n                ret = 0;\n            else {\n                rp = _libssh2_bn_init();\n                if (rp) {\n                    do {\n                        _libssh2_bn_rshift(mp);\n                        if (!_libssh2_bn_subtract(rp, r, mp))\n                            _libssh2_bn_swap(r, rp);\n                    } while (--sc);\n                    _libssh2_bn_free(rp);\n                    ret = 0;\n                }\n            }\n        }\n    }\n    asn1delete(subjpubkeyinfo);\n    _libssh2_bn_free(mp);\n    return ret;\n}\n\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: crypto context support.\n *\n *******************************************************************/\n\nstatic _libssh2_os400qc3_crypto_ctx *\nlibssh2_init_crypto_ctx(_libssh2_os400qc3_crypto_ctx *ctx)\n{\n    if (!ctx)\n        ctx = (_libssh2_os400qc3_crypto_ctx *) malloc(sizeof *ctx);\n\n    if (ctx) {\n        memset((char *) ctx, 0, sizeof *ctx);\n        ctx->hash.Final_Op_Flag = Qc3_Continue;\n    }\n\n    return ctx;\n}\n\nstatic int\nnull_token(const char *token)\n{\n    return !memcmp(token, nulltoken.Key_Context_Token,\n                   sizeof nulltoken.Key_Context_Token);\n}\n\nvoid\n_libssh2_os400qc3_crypto_dtor(_libssh2_os400qc3_crypto_ctx *x)\n{\n    if (!x)\n        return;\n    if (!null_token(x->hash.Alg_Context_Token)) {\n        Qc3DestroyAlgorithmContext(x->hash.Alg_Context_Token, (char *) &ecnull);\n        memset(x->hash.Alg_Context_Token, 0, sizeof x->hash.Alg_Context_Token);\n    }\n    if (!null_token(x->key.Key_Context_Token)) {\n        Qc3DestroyKeyContext(x->key.Key_Context_Token, (char *) &ecnull);\n        memset(x->key.Key_Context_Token, 0, sizeof x->key.Key_Context_Token);\n    }\n    if (x->kek) {\n        _libssh2_os400qc3_crypto_dtor(x->kek);\n        free((char *) x->kek);\n        x->kek = NULL;\n    }\n}\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: hash algorithms support.\n *\n *******************************************************************/\n\nint\nlibssh2_os400qc3_hash_init(Qc3_Format_ALGD0100_T *x, unsigned int algorithm)\n{\n    Qc3_Format_ALGD0500_T algd;\n    Qus_EC_t errcode;\n\n    if (!x)\n        return 0;\n\n    memset((char *) x, 0, sizeof *x);\n    x->Final_Op_Flag = Qc3_Continue;\n    algd.Hash_Alg = algorithm;\n    set_EC_length(errcode, sizeof errcode);\n    Qc3CreateAlgorithmContext((char *) &algd, Qc3_Alg_Hash,\n                              x->Alg_Context_Token, &errcode);\n    return errcode.Bytes_Available? 0: 1;\n}\n\nvoid\nlibssh2_os400qc3_hash_update(Qc3_Format_ALGD0100_T *ctx,\n                             unsigned char *data, int len)\n{\n    char dummy[64];\n\n    ctx->Final_Op_Flag = Qc3_Continue;\n    Qc3CalculateHash((char *) data, &len, Qc3_Data, (char *) ctx,\n                     Qc3_Alg_Token, anycsp, NULL, dummy, (char *) &ecnull);\n}\n\nvoid\nlibssh2_os400qc3_hash_final(Qc3_Format_ALGD0100_T *ctx, unsigned char *out)\n{\n    char data;\n\n    ctx->Final_Op_Flag = Qc3_Final;\n    Qc3CalculateHash(&data, &zero, Qc3_Data, (char *) ctx, Qc3_Alg_Token,\n                     anycsp, NULL, (char *) out, (char *) &ecnull);\n    Qc3DestroyAlgorithmContext(ctx->Alg_Context_Token, (char *) &ecnull);\n    memset(ctx->Alg_Context_Token, 0, sizeof ctx->Alg_Context_Token);\n}\n\nint\nlibssh2_os400qc3_hash(const unsigned char *message, unsigned long len,\n                      unsigned char *out, unsigned int algo)\n{\n    Qc3_Format_ALGD0100_T ctx;\n\n    if (!libssh2_os400qc3_hash_init(&ctx, algo))\n        return 1;\n\n    libssh2_os400qc3_hash_update(&ctx, (unsigned char *) message, len);\n    libssh2_os400qc3_hash_final(&ctx, out);\n    return 0;\n}\n\nvoid\nlibssh2_os400qc3_hmac_init(_libssh2_os400qc3_crypto_ctx *ctx,\n                           int algo, size_t minkeylen, void *key, int keylen)\n{\n    if (keylen < minkeylen) {\n        char *lkey = alloca(minkeylen);\n\n        /* Pad key with zeroes if too short. */\n        if (!lkey)\n            return;\n        memcpy(lkey, (char *) key, keylen);\n        memset(lkey + keylen, 0, minkeylen - keylen);\n        key = (void *) lkey;\n        keylen = minkeylen;\n    }\n    libssh2_os400qc3_hash_init(&ctx->hash, algo);\n    Qc3CreateKeyContext((char *) key, &keylen, binstring, &algo, qc3clear,\n                        NULL, NULL, ctx->key.Key_Context_Token,\n                        (char *) &ecnull);\n}\n\nvoid\nlibssh2_os400qc3_hmac_update(_libssh2_os400qc3_crypto_ctx *ctx,\n                             unsigned char *data, int len)\n{\n    char dummy[64];\n\n    ctx->hash.Final_Op_Flag = Qc3_Continue;\n    Qc3CalculateHMAC((char *) data, &len, Qc3_Data, (char *) &ctx->hash,\n                     Qc3_Alg_Token, ctx->key.Key_Context_Token, Qc3_Key_Token,\n                     anycsp, NULL, dummy, (char *) &ecnull);\n}\n\nvoid\nlibssh2_os400qc3_hmac_final(_libssh2_os400qc3_crypto_ctx *ctx,\n                            unsigned char *out)\n{\n    char data;\n\n    ctx->hash.Final_Op_Flag = Qc3_Final;\n    Qc3CalculateHMAC((char *) data, &zero, Qc3_Data, (char *) &ctx->hash,\n                     Qc3_Alg_Token, ctx->key.Key_Context_Token, Qc3_Key_Token,\n                     anycsp, NULL, (char *) out, (char *) &ecnull);\n}\n\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: cipher algorithms support.\n *\n *******************************************************************/\n\nint\n_libssh2_cipher_init(_libssh2_cipher_ctx *h, _libssh2_cipher_type(algo),\n                     unsigned char *iv, unsigned char *secret, int encrypt)\n{\n    Qc3_Format_ALGD0200_T algd;\n    Qus_EC_t errcode;\n\n    (void) encrypt;\n\n    if (!h)\n        return -1;\n\n    libssh2_init_crypto_ctx(h);\n    algd.Block_Cipher_Alg = algo.algo;\n    algd.Block_Length = algo.size;\n    algd.Mode = algo.mode;\n    algd.Pad_Option = Qc3_No_Pad;\n    algd.Pad_Character = 0;\n    algd.Reserved = 0;\n    algd.MAC_Length = 0;\n    algd.Effective_Key_Size = 0;\n    memset(algd.Init_Vector, 0 , sizeof algd.Init_Vector);\n    if (algo.mode != Qc3_ECB && algo.size)\n        memcpy(algd.Init_Vector, iv, algo.size);\n    set_EC_length(errcode, sizeof errcode);\n    Qc3CreateAlgorithmContext((char *) &algd, algo.fmt,\n                              h->hash.Alg_Context_Token, &errcode);\n    if (errcode.Bytes_Available)\n        return -1;\n    Qc3CreateKeyContext((char *) secret, &algo.keylen, binstring,\n                        &algo.algo, qc3clear, NULL, NULL,\n                        h->key.Key_Context_Token, (char *) &errcode);\n    if (errcode.Bytes_Available) {\n        _libssh2_os400qc3_crypto_dtor(h);\n        return -1;\n    }\n\n    return 0;\n}\n\nint\n_libssh2_cipher_crypt(_libssh2_cipher_ctx *ctx,\n                      _libssh2_cipher_type(algo),\n                      int encrypt, unsigned char *block, size_t blocksize)\n{\n    Qus_EC_t errcode;\n    int outlen;\n    int blksize = blocksize;\n\n    (void) algo;\n\n    set_EC_length(errcode, sizeof errcode);\n    if (encrypt)\n        Qc3EncryptData((char *) block, &blksize, Qc3_Data,\n                       ctx->hash.Alg_Context_Token, Qc3_Alg_Token,\n                       ctx->key.Key_Context_Token, Qc3_Key_Token, anycsp, NULL,\n                       (char *) block, &blksize, &outlen, (char *) &errcode);\n    else\n        Qc3DecryptData((char *) block, &blksize,\n                       ctx->hash.Alg_Context_Token, Qc3_Alg_Token,\n                       ctx->key.Key_Context_Token, Qc3_Key_Token, anycsp, NULL,\n                       (char *) block, &blksize, &outlen, (char *) &errcode);\n\n    return errcode.Bytes_Available? -1: 0;\n}\n\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: RSA support.\n *\n *******************************************************************/\n\nint\n_libssh2_rsa_new(libssh2_rsa_ctx **rsa,\n                 const unsigned char *edata, unsigned long elen,\n                 const unsigned char *ndata, unsigned long nlen,\n                 const unsigned char *ddata, unsigned long dlen,\n                 const unsigned char *pdata, unsigned long plen,\n                 const unsigned char *qdata, unsigned long qlen,\n                 const unsigned char *e1data, unsigned long e1len,\n                 const unsigned char *e2data, unsigned long e2len,\n                 const unsigned char *coeffdata, unsigned long coefflen)\n{\n    libssh2_rsa_ctx *ctx;\n    _libssh2_bn *e = _libssh2_bn_init_from_bin();\n    _libssh2_bn *n = _libssh2_bn_init_from_bin();\n    _libssh2_bn *d = NULL;\n    _libssh2_bn *p = NULL;\n    _libssh2_bn *q = NULL;\n    _libssh2_bn *e1 = NULL;\n    _libssh2_bn *e2 = NULL;\n    _libssh2_bn *coeff = NULL;\n    asn1Element *key = NULL;\n    asn1Element *structkey = NULL;\n    Qc3_Format_ALGD0400_T algd;\n    Qus_EC_t errcode;\n    int keytype;\n    int ret = 0;\n    int i;\n\n    ctx = libssh2_init_crypto_ctx(NULL);\n    if (!ctx)\n        ret = -1;\n    if (!ret) {\n        _libssh2_bn_from_bin(e, elen, edata);\n        _libssh2_bn_from_bin(n, nlen, ndata);\n        if (!e || !n)\n            ret = -1;\n    }\n    if (!ret && ddata) {\n        /* Private key. */\n        d = _libssh2_bn_init_from_bin();\n        _libssh2_bn_from_bin(d, dlen, ddata);\n        p = _libssh2_bn_init_from_bin();\n        _libssh2_bn_from_bin(p, plen, pdata);\n        q = _libssh2_bn_init_from_bin();\n        _libssh2_bn_from_bin(q, qlen, qdata);\n        e1 = _libssh2_bn_init_from_bin();\n        _libssh2_bn_from_bin(e1, e1len, e1data);\n        e2 = _libssh2_bn_init_from_bin();\n        _libssh2_bn_from_bin(e2, e2len, e2data);\n        coeff = _libssh2_bn_init_from_bin();\n        _libssh2_bn_from_bin(coeff, coefflen, coeffdata);\n        if (!d || !p || !q ||!e1 || !e2 || !coeff)\n            ret = -1;\n\n        if (!ret) {\n            /* Build a PKCS#8 private key. */\n            key = rsaprivatekey(e, n, d, p, q, e1, e2, coeff);\n            structkey = rsaprivatekeyinfo(key);\n        }\n        keytype = Qc3_RSA_Private;\n    } else if (!ret) {\n        key = rsapublickey(e, n);\n        structkey = rsasubjectpublickeyinfo(key);\n        keytype = Qc3_RSA_Public;\n    }\n    if (!key || !structkey)\n        ret = -1;\n\n    set_EC_length(errcode, sizeof errcode);\n\n    if (!ret) {\n        /* Create the algorithm context. */\n        algd.Public_Key_Alg = Qc3_RSA;\n        algd.PKA_Block_Format = Qc3_PKCS1_01;\n        memset(algd.Reserved, 0, sizeof algd.Reserved);\n        algd.Signing_Hash_Alg = Qc3_SHA1;\n        Qc3CreateAlgorithmContext((char *) &algd, Qc3_Alg_Public_Key,\n                                  ctx->hash.Alg_Context_Token, &errcode);\n        if (errcode.Bytes_Available)\n            ret = -1;\n        ctx->hash.Final_Op_Flag = Qc3_Continue;\n    }\n\n    /* Create the key context. */\n    if (!ret) {\n        i = structkey->end - structkey->header;\n        Qc3CreateKeyContext(structkey->header, &i, berstring, &keytype,\n                            qc3clear, NULL, NULL, ctx->key.Key_Context_Token,\n                            (char *) &errcode);\n        if (errcode.Bytes_Available)\n            ret = -1;\n    }\n\n    _libssh2_bn_free(e);\n    _libssh2_bn_free(n);\n    _libssh2_bn_free(d);\n    _libssh2_bn_free(p);\n    _libssh2_bn_free(q);\n    _libssh2_bn_free(e1);\n    _libssh2_bn_free(e2);\n    _libssh2_bn_free(coeff);\n    asn1delete(key);\n    asn1delete(structkey);\n    if (ret && ctx) {\n        _libssh2_rsa_free(ctx);\n        ctx = NULL;\n    }\n    *rsa = ctx;\n    return ret;\n}\n\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: PKCS#5 supplement.\n *\n *******************************************************************/\n\nstatic int\noidcmp(const asn1Element *e, const unsigned char *oid)\n{\n    int i = e->end - e->beg - *oid++;\n\n    if (*e->header != ASN1_OBJ_ID)\n        return -2;\n    if (!i)\n        i = memcmp(e->beg, oid, oid[-1]);\n    return i;\n}\n\nstatic int\nasn1getword(asn1Element *e, unsigned long *v)\n{\n    unsigned long a;\n    const unsigned char *cp;\n\n    if (*e->header != ASN1_INTEGER)\n        return -1;\n    for (cp = e->beg; cp < e->end && !*cp; cp++)\n        ;\n    if (e->end - cp > sizeof a)\n        return -1;\n    for (a = 0; cp < e->end; cp++)\n        a = (a << 8) | *cp;\n    *v = a;\n    return 0;\n}\n\nstatic int\npbkdf1(LIBSSH2_SESSION *session, char **dk, const unsigned char * passphrase,\n       pkcs5params *pkcs5)\n{\n    int i;\n    Qc3_Format_ALGD0100_T hctx;\n    int len = pkcs5->saltlen;\n    char *data = (char *) pkcs5->salt;\n\n    *dk = NULL;\n    if (pkcs5->dklen > pkcs5->hashlen)\n        return -1;\n\n    /* Allocate the derived key buffer. */\n    if (!(*dk = LIBSSH2_ALLOC(session, pkcs5->hashlen)))\n        return -1;\n\n    /* Initial hash. */\n    libssh2_os400qc3_hash_init(&hctx, pkcs5->hash);\n    libssh2_os400qc3_hash_update(&hctx, (unsigned char *) passphrase,\n                                 strlen(passphrase));\n    hctx.Final_Op_Flag = Qc3_Final;\n    Qc3CalculateHash((char *) pkcs5->salt, &len, Qc3_Data, (char *) &hctx,\n                     Qc3_Alg_Token, anycsp, NULL, *dk, (char *) &ecnull);\n\n    /* Iterate. */\n    len = pkcs5->hashlen;\n    for (i = 1; i < pkcs5->itercount; i++)\n        Qc3CalculateHash((char *) *dk, &len, Qc3_Data, (char *) &hctx,\n                         Qc3_Alg_Token, anycsp, NULL, *dk, (char *) &ecnull);\n\n    /* Special stuff for PBES1: split derived key into 8-byte key and 8-byte\n       initialization vector. */\n    pkcs5->dklen = 8;\n    pkcs5->ivlen = 8;\n    pkcs5->iv = *dk + 8;\n\n    /* Clean-up and exit. */\n    Qc3DestroyAlgorithmContext(hctx.Alg_Context_Token, (char *) &ecnull);\n    return 0;\n}\n\nstatic int\npbkdf2(LIBSSH2_SESSION *session, char **dk, const unsigned char * passphrase,\n       pkcs5params *pkcs5)\n{\n    size_t i;\n    size_t k;\n    int j;\n    int l;\n    uint32_t ni;\n    unsigned long long t;\n    char *mac;\n    char *buf;\n    _libssh2_os400qc3_crypto_ctx hctx;\n\n    *dk = NULL;\n    t = ((unsigned long long) pkcs5->dklen + pkcs5->hashlen - 1) /\n        pkcs5->hashlen;\n    if (t > 0xFFFFFFFF)\n        return -1;\n    mac = alloca(pkcs5->hashlen);\n    if (!mac)\n        return -1;\n\n    /* Allocate the derived key buffer. */\n    l = t;\n    if (!(buf = LIBSSH2_ALLOC(session, l * pkcs5->hashlen)))\n        return -1;\n    *dk = buf;\n\n    /* Create an HMAC context for our computations. */\n    libssh2_os400qc3_hmac_init(&hctx, pkcs5->hash, pkcs5->hashlen,\n                               (void *) passphrase, strlen(passphrase));\n\n    /* Process each hLen-size blocks. */\n    for (i = 1; i <= l; i++) {\n        ni = htonl(i);\n        libssh2_os400qc3_hmac_update(&hctx, pkcs5->salt, pkcs5->saltlen);\n        libssh2_os400qc3_hmac_update(&hctx, (char *) &ni, sizeof ni);\n        libssh2_os400qc3_hmac_final(&hctx, mac);\n        memcpy(buf, mac, pkcs5->hashlen);\n        for (j = 1; j < pkcs5->itercount; j++) {\n            libssh2_os400qc3_hmac_update(&hctx, mac, pkcs5->hashlen);\n            libssh2_os400qc3_hmac_final(&hctx, mac);\n            for (k = 0; k < pkcs5->hashlen; k++)\n                buf[k] ^= mac[k];\n        }\n        buf += pkcs5->hashlen;\n    }\n\n    /* Computation done. Release HMAC context. */\n    _libssh2_os400qc3_crypto_dtor(&hctx);\n    return 0;\n}\n\nstatic int\nparse_pkcs5_algorithm(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                      asn1Element *algid, pkcs5algo **algotable)\n{\n    asn1Element oid;\n    asn1Element param;\n    char *cp;\n\n    cp = getASN1Element(&oid, algid->beg, algid->end);\n    if (!cp || *oid.header != ASN1_OBJ_ID)\n        return -1;\n    param.header = NULL;\n    if (cp < algid->end)\n        cp = getASN1Element(&param, cp, algid->end);\n    if (cp != algid->end)\n        return -1;\n    for (; *algotable; algotable++)\n        if (!oidcmp(&oid, (*algotable)->oid))\n            return (*(*algotable)->parse)(session, pkcs5, *algotable,\n                                          param.header? &param: NULL);\n    return -1;\n}\n\nstatic int\nparse_pbes2(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n            pkcs5algo *algo, asn1Element *param)\n{\n    asn1Element keyDerivationFunc;\n    asn1Element encryptionScheme;\n    char *cp;\n\n    if (!param || *param->header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    cp = getASN1Element(&keyDerivationFunc, param->beg, param->end);\n    if (!cp || *keyDerivationFunc.header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    if (getASN1Element(&encryptionScheme, cp, param->end) != param->end ||\n        *encryptionScheme.header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    if (parse_pkcs5_algorithm(session, pkcs5, &encryptionScheme, pbes2enctable))\n        return -1;\n    if (parse_pkcs5_algorithm(session, pkcs5, &keyDerivationFunc, pbkdf2table))\n        return -1;\n    return 0;\n}\n\nstatic int\nparse_pbkdf2(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n             pkcs5algo *algo, asn1Element *param)\n{\n    asn1Element salt;\n    asn1Element iterationCount;\n    asn1Element keyLength;\n    asn1Element prf;\n    unsigned long itercount;\n    char *cp;\n\n    if (!param || *param->header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    cp = getASN1Element(&salt, param->beg, param->end);\n    /* otherSource not supported. */\n    if (!cp || *salt.header != ASN1_OCTET_STRING)\n        return -1;\n    cp = getASN1Element(&iterationCount, cp, param->end);\n    if (!cp || *iterationCount.header != ASN1_INTEGER)\n        return -1;\n    keyLength.header = prf.header = NULL;\n    if (cp < param->end) {\n        cp = getASN1Element(&prf, cp, param->end);\n        if (!cp)\n            return -1;\n        if (*prf.header == ASN1_INTEGER) {\n            keyLength = prf;\n            prf.header = NULL;\n            if (cp < param->end)\n                cp = getASN1Element(&prf, cp, param->end);\n        }\n        if (cp != param->end)\n            return -1;\n    }\n    pkcs5->hash = algo->hash;\n    pkcs5->hashlen = algo->hashlen;\n    if (prf.header) {\n        if (*prf.header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n            return -1;\n        if (parse_pkcs5_algorithm(session, pkcs5, &prf, kdf2prftable))\n            return -1;\n    }\n    pkcs5->saltlen = salt.end - salt.beg;\n    pkcs5->salt = salt.beg;\n    if (asn1getword(&iterationCount, &itercount) ||\n        !itercount || itercount > 100000)\n        return -1;\n    pkcs5->itercount = itercount;\n    pkcs5->kdf = pbkdf2;\n    return 0;\n}\n\nstatic int\nparse_hmacWithSHA1(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                   pkcs5algo *algo, asn1Element *param)\n{\n    if (!param || *param->header != ASN1_NULL)\n        return -1;\n    pkcs5->hash = algo->hash;\n    pkcs5->hashlen = algo->hashlen;\n    return 0;\n}\n\nstatic int\nparse_iv(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n         pkcs5algo *algo, asn1Element *param)\n{\n    if (!param || *param->header != ASN1_OCTET_STRING ||\n        param->end - param->beg != algo->ivlen)\n        return -1;\n    pkcs5->cipher = algo->cipher;\n    pkcs5->blocksize = algo->blocksize;\n    pkcs5->mode = algo->mode;\n    pkcs5->padopt = algo->padopt;\n    pkcs5->padchar = algo->padchar;\n    pkcs5->dklen = algo->keylen;\n    pkcs5->ivlen = algo->ivlen;\n    pkcs5->iv = param->beg;\n    return 0;\n}\n\nstatic int\nparse_rc2(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n          pkcs5algo *algo, asn1Element *param)\n{\n    asn1Element iv;\n    unsigned long effkeysize;\n    char *cp;\n\n    if (!param || *param->header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    cp = getASN1Element(&iv, param->beg, param->end);\n    if (!cp)\n        return -1;\n    effkeysize = algo->effkeysize;\n    if (*iv.header == ASN1_INTEGER) {\n        if (asn1getword(&iv, &effkeysize) || effkeysize > 1024)\n            return -1;\n\n        cp = getASN1Element(&iv, cp, param->end);\n        if (effkeysize < 256)\n            switch (effkeysize) {\n            case 160:\n                effkeysize = 40;\n            case 120:\n                effkeysize = 64;\n            case 58:\n                effkeysize = 128;\n                break;\n            default:\n                return -1;\n            }\n    }\n    if (effkeysize > 1024 || cp != param->end ||\n        *iv.header != ASN1_OCTET_STRING || iv.end - iv.beg != algo->ivlen)\n        return -1;\n    pkcs5->cipher = algo->cipher;\n    pkcs5->blocksize = algo->blocksize;\n    pkcs5->mode = algo->mode;\n    pkcs5->padopt = algo->padopt;\n    pkcs5->padchar = algo->padchar;\n    pkcs5->ivlen = algo->ivlen;\n    pkcs5->iv = iv.beg;\n    pkcs5->effkeysize = effkeysize;\n    pkcs5->dklen = (effkeysize + 8 - 1) / 8;\n    return 0;\n}\n\nstatic int\nparse_pbes1(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n            pkcs5algo *algo, asn1Element *param)\n{\n    asn1Element salt;\n    asn1Element iterationCount;\n    unsigned long itercount;\n    char *cp;\n\n    if (!param || *param->header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n\n    cp = getASN1Element(&salt, param->beg, param->end);\n    if (!cp || *salt.header != ASN1_OCTET_STRING ||\n        salt.end - salt.beg != algo->saltlen)\n        return -1;\n    if (getASN1Element(&iterationCount, cp, param->end) != param->end ||\n        *iterationCount.header != ASN1_INTEGER)\n        return -1;\n    if (asn1getword(&iterationCount, &itercount) ||\n        !itercount || itercount > 100000)\n        return -1;\n    pkcs5->cipher = algo->cipher;\n    pkcs5->blocksize = algo->blocksize;\n    pkcs5->mode = algo->mode;\n    pkcs5->padopt = algo->padopt;\n    pkcs5->padchar = algo->padchar;\n    pkcs5->hash = algo->hash;\n    pkcs5->hashlen = algo->hashlen;\n    pkcs5->dklen = 16;\n    pkcs5->saltlen = algo->saltlen;\n    pkcs5->effkeysize = algo->effkeysize;\n    pkcs5->salt = salt.beg;\n    pkcs5->kdf = pbkdf1;\n    pkcs5->itercount = itercount;\n    return 0;\n}\n\nstatic int\npkcs8kek(LIBSSH2_SESSION *session, _libssh2_os400qc3_crypto_ctx **ctx,\n         const unsigned char *data, unsigned int datalen,\n         const unsigned char *passphrase, asn1Element *privkeyinfo)\n{\n    asn1Element encprivkeyinfo;\n    asn1Element pkcs5alg;\n    pkcs5params pkcs5;\n    size_t pplen;\n    char *cp;\n    unsigned long t;\n    int i;\n    char *dk = NULL;\n    Qc3_Format_ALGD0200_T algd;\n    Qus_EC_t errcode;\n\n    /* Determine if the PKCS#8 data is encrypted and, if so, set-up a\n       key encryption key and algorithm in context.\n       Return 1 if encrypted, 0, if not, -1 if error. */\n\n    *ctx = NULL;\n    privkeyinfo->beg = (char *) data;\n    privkeyinfo->end = privkeyinfo->beg + datalen;\n\n    /* If no passphrase is given, it cannot be an encrypted key. */\n    if (!passphrase || !*passphrase)\n        return 0;\n\n    /* Parse PKCS#8 data, checking if ASN.1 format is PrivateKeyInfo or\n       EncryptedPrivateKeyInfo. */\n    if (getASN1Element(&encprivkeyinfo, privkeyinfo->beg, privkeyinfo->end) !=\n        (char *) data + datalen ||\n        *encprivkeyinfo.header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    cp = getASN1Element(&pkcs5alg, encprivkeyinfo.beg, encprivkeyinfo.end);\n    if (!cp)\n        return -1;\n\n    switch (*pkcs5alg.header) {\n    case ASN1_INTEGER:                          /* Version. */\n        return 0;       /* This is a PrivateKeyInfo --> not encrypted. */\n    case ASN1_SEQ | ASN1_CONSTRUCTED:           /* AlgorithIdentifier. */\n        break;          /* This is an EncryptedPrivateKeyInfo --> encrypted. */\n    default:\n        return -1;      /* Unrecognized: error. */\n    }\n\n    /* Get the encrypted key data. */\n    if (getASN1Element(privkeyinfo, cp, encprivkeyinfo.end) !=\n        encprivkeyinfo.end || *privkeyinfo->header != ASN1_OCTET_STRING)\n        return -1;\n\n    /* PKCS#5: parse the PBES AlgorithmIdentifier and recursively get all\n       encryption parameters. */\n    memset((char *) &pkcs5, 0, sizeof pkcs5);\n    if (parse_pkcs5_algorithm(session, &pkcs5, &pkcs5alg, pbestable))\n        return -1;\n\n    /* Compute the derived key. */\n    if ((*pkcs5.kdf)(session, &dk, passphrase, &pkcs5))\n        return -1;\n\n    /* Prepare the algorithm descriptor. */\n    memset((char *) &algd, 0, sizeof algd);\n    algd.Block_Cipher_Alg = pkcs5.cipher;\n    algd.Block_Length = pkcs5.blocksize;\n    algd.Mode = pkcs5.mode;\n    algd.Pad_Option = pkcs5.padopt;\n    algd.Pad_Character = pkcs5.padchar;\n    algd.Effective_Key_Size = pkcs5.effkeysize;\n    memcpy(algd.Init_Vector, pkcs5.iv, pkcs5.ivlen);\n\n    /* Create the key and algorithm context tokens. */\n    *ctx = libssh2_init_crypto_ctx(NULL);\n    if (!*ctx) {\n        LIBSSH2_FREE(session, dk);\n        return -1;\n    }\n    libssh2_init_crypto_ctx(*ctx);\n    set_EC_length(errcode, sizeof errcode);\n    Qc3CreateKeyContext(dk, &pkcs5.dklen, binstring, &algd.Block_Cipher_Alg,\n                        qc3clear, NULL, NULL, (*ctx)->key.Key_Context_Token,\n                        (char *) &errcode);\n    LIBSSH2_FREE(session, dk);\n    if (errcode.Bytes_Available) {\n        free((char *) *ctx);\n        *ctx = NULL;\n        return -1;\n    }\n\n    Qc3CreateAlgorithmContext((char *) &algd, Qc3_Alg_Block_Cipher,\n                              (*ctx)->hash.Alg_Context_Token, &errcode);\n    if (errcode.Bytes_Available) {\n        Qc3DestroyKeyContext((*ctx)->key.Key_Context_Token, (char *) &ecnull);\n        free((char *) *ctx);\n        *ctx = NULL;\n        return -1;\n    }\n    return 1;       /* Tell it's encrypted. */\n}\n\nstatic int\nrsapkcs8privkey(LIBSSH2_SESSION *session,\n                const unsigned char *data, unsigned int datalen,\n                const unsigned char *passphrase, void *loadkeydata)\n{\n    libssh2_rsa_ctx *ctx = (libssh2_rsa_ctx *) loadkeydata;\n    char keyform = Qc3_Clear;\n    char *kek = NULL;\n    char *kea = NULL;\n    _libssh2_os400qc3_crypto_ctx *kekctx;\n    asn1Element pki;\n    int pkilen;\n    Qus_EC_t errcode;\n\n    switch (pkcs8kek(session, &kekctx, data, datalen, passphrase, &pki)) {\n    case 1:\n        keyform = Qc3_Encrypted;\n        kek = kekctx->key.Key_Context_Token;\n        kea = kekctx->hash.Alg_Context_Token;\n    case 0:\n        break;\n    default:\n        return -1;\n    }\n\n    set_EC_length(errcode, sizeof errcode);\n    pkilen = pki.end - pki.beg;\n    Qc3CreateKeyContext((unsigned char *) pki.beg, &pkilen, berstring,\n                        rsaprivate, &keyform, kek, kea,\n                        ctx->key.Key_Context_Token, (char *) &errcode);\n    if (errcode.Bytes_Available) {\n        if (kekctx)\n            _libssh2_os400qc3_crypto_dtor(kekctx);\n        return -1;\n    }\n    ctx->kek = kekctx;\n    return 0;\n}\n\nstatic char *\nstorewithlength(char *p, const char *data, int length)\n{\n    _libssh2_htonu32(p, length);\n    if (length)\n        memcpy(p + 4, data, length);\n    return p + 4 + length;\n}\n\nstatic int\nsshrsapubkey(LIBSSH2_SESSION *session, char **sshpubkey,\n             asn1Element *params, asn1Element *key, const char *method)\n{\n    int methlen = strlen(method);\n    asn1Element keyseq;\n    asn1Element m;\n    asn1Element e;\n    int len;\n    char *cp;\n\n    if (getASN1Element(&keyseq, key->beg + 1, key->end) != key->end ||\n        *keyseq.header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    if (!getASN1Element(&m, keyseq.beg, keyseq.end) ||\n        *m.header != ASN1_INTEGER)\n        return -1;\n    if (getASN1Element(&e, m.end, keyseq.end) != keyseq.end ||\n        *e.header != ASN1_INTEGER)\n        return -1;\n    len = 4 + methlen + 4 + (e.end - e.beg) + 4 + (m.end - m.beg);\n    cp = LIBSSH2_ALLOC(session, len);\n    if (!cp)\n        return -1;\n    *sshpubkey = cp;\n    cp = storewithlength(cp, method, methlen);\n    cp = storewithlength(cp, e.beg, e.end - e.beg);\n    cp = storewithlength(cp, m.beg, m.end - m.beg);\n    return len;\n}\n\nstatic int\nrsapkcs8pubkey(LIBSSH2_SESSION *session,\n               const unsigned char *data, unsigned int datalen,\n               const unsigned char *passphrase, void *loadkeydata)\n{\n    loadpubkeydata *p = (loadpubkeydata *) loadkeydata;\n    char *buf;\n    int len;\n    char *cp;\n    int i;\n    char keyform = Qc3_Clear;\n    char *kek = NULL;\n    char *kea = NULL;\n    _libssh2_os400qc3_crypto_ctx *kekctx;\n    asn1Element subjpubkeyinfo;\n    asn1Element algorithmid;\n    asn1Element algorithm;\n    asn1Element subjpubkey;\n    asn1Element parameters;\n    asn1Element pki;\n    int pkilen;\n    Qus_EC_t errcode;\n\n    if (!(buf = alloca(datalen)))\n        return -1;\n\n    switch (pkcs8kek(session, &kekctx, data, datalen, passphrase, &pki)) {\n    case 1:\n        keyform = Qc3_Encrypted;\n        kek = kekctx->key.Key_Context_Token;\n        kea = kekctx->hash.Alg_Context_Token;\n    case 0:\n        break;\n    default:\n        return -1;\n    }\n\n    set_EC_length(errcode, sizeof errcode);\n    pkilen = pki.end - pki.beg;\n    Qc3ExtractPublicKey(pki.beg, &pkilen, berstring, &keyform,\n                        kek, kea, buf, (int *) &datalen, &len, &errcode);\n    _libssh2_os400qc3_crypto_dtor(kekctx);\n    if (errcode.Bytes_Available)\n        return -1;\n    /* Get the algorithm OID and key data from SubjectPublicKeyInfo. */\n    if (getASN1Element(&subjpubkeyinfo, buf, buf + len) != buf + len ||\n        *subjpubkeyinfo.header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    cp = getASN1Element(&algorithmid, subjpubkeyinfo.beg, subjpubkeyinfo.end);\n    if (!cp || *algorithmid.header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    if (!getASN1Element(&algorithm, algorithmid.beg, algorithmid.end) ||\n        *algorithm.header != ASN1_OBJ_ID)\n        return -1;\n    if (getASN1Element(&subjpubkey, cp, subjpubkeyinfo.end) !=\n        subjpubkeyinfo.end || *subjpubkey.header != ASN1_BIT_STRING)\n        return -1;\n    /* Check for supported algorithm. */\n    for (i = 0; pka[i].oid; i++)\n        if (!oidcmp(&algorithm, pka[i].oid)) {\n            len = (*pka[i].sshpubkey)(session, &p->data, &algorithmid,\n                                      &subjpubkey, pka[i].method);\n            if (len < 0)\n                return -1;\n            p->length = len;\n            p->method = pka[i].method;\n            return 0;\n        }\n    return -1;                              /* Algorithm not supported. */\n}\n\nstatic int\npkcs1topkcs8(LIBSSH2_SESSION *session,\n             const unsigned char **data8, unsigned int *datalen8,\n             const unsigned char *data1, unsigned int datalen1)\n{\n    asn1Element *prvk;\n    asn1Element *pkcs8;\n    unsigned char *data;\n\n    *data8 = NULL;\n    *datalen8 = 0;\n    if (datalen1 < 2)\n        return -1;\n    prvk = asn1_new_from_bytes(data1, datalen1);\n    if (!prvk)\n        return -1;\n    pkcs8 = rsaprivatekeyinfo(prvk);\n    asn1delete(prvk);\n    if (!prvk) {\n        asn1delete(pkcs8);\n        pkcs8 = NULL;\n    }\n    if (!pkcs8)\n        return -1;\n    data = (unsigned char *) LIBSSH2_ALLOC(session, pkcs8->end - pkcs8->header);\n    if (!data) {\n        asn1delete(pkcs8);\n        return -1;\n    }\n    *data8 = data;\n    *datalen8 = pkcs8->end - pkcs8->header;\n    memcpy((char *) data, (char *) pkcs8->header, *datalen8);\n    asn1delete(pkcs8);\n    return 0;\n}\n\nstatic int\nrsapkcs1privkey(LIBSSH2_SESSION *session,\n                const unsigned char *data, unsigned int datalen,\n                const unsigned char *passphrase, void *loadkeydata)\n{\n    const unsigned char *data8;\n    unsigned int datalen8;\n    int ret;\n\n    if (pkcs1topkcs8(session, &data8, &datalen8, data, datalen))\n        return -1;\n    ret = rsapkcs8privkey(session, data8, datalen8, passphrase, loadkeydata);\n    LIBSSH2_FREE(session, (char *) data8);\n    return ret;\n}\n\nstatic int\nrsapkcs1pubkey(LIBSSH2_SESSION *session,\n               const unsigned char *data, unsigned int datalen,\n               const unsigned char *passphrase, void *loadkeydata)\n{\n    const unsigned char *data8;\n    unsigned int datalen8;\n    int ret;\n\n    if (pkcs1topkcs8(session, &data8, &datalen8, data, datalen))\n        return -1;\n    ret = rsapkcs8pubkey(session, data8, datalen8, passphrase, loadkeydata);\n    LIBSSH2_FREE(session, (char *) data8);\n    return ret;\n}\n\nstatic int\ntry_pem_load(LIBSSH2_SESSION *session, FILE *fp,\n             const unsigned char *passphrase,\n             const char *header, const char *trailer,\n             loadkeyproc proc, void *loadkeydata)\n{\n    unsigned char *data = NULL;\n    unsigned int datalen = 0;\n    int c;\n    int ret;\n\n    fseek(fp, 0L, SEEK_SET);\n    for (;;) {\n        ret = _libssh2_pem_parse(session, header, trailer,\n                                 fp, &data, &datalen);\n\n        if (!ret) {\n            ret = (*proc)(session, data, datalen, passphrase, loadkeydata);\n            if (!ret)\n                return 0;\n        }\n\n        if (data) {\n            LIBSSH2_FREE(session, data);\n            data = NULL;\n        }\n        c = getc(fp);\n\n        if (c == EOF)\n            break;\n\n        ungetc(c, fp);\n    }\n\n    return -1;\n}\n\nstatic int\nload_rsa_private_file(LIBSSH2_SESSION *session, const char *filename,\n                      unsigned const char *passphrase,\n                      loadkeyproc proc1, loadkeyproc proc8, void *loadkeydata)\n{\n    FILE *fp = fopen(filename, fopenrmode);\n    unsigned char *data = NULL;\n    size_t datalen = 0;\n    int ret;\n    long filesize;\n\n    if (!fp)\n        return -1;\n\n    /* Try with \"ENCRYPTED PRIVATE KEY\" PEM armor.\n       --> PKCS#8 EncryptedPrivateKeyInfo */\n    ret = try_pem_load(session, fp, passphrase, beginencprivkeyhdr,\n                       endencprivkeyhdr, proc8, loadkeydata);\n\n    /* Try with \"PRIVATE KEY\" PEM armor.\n       --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */\n    if (ret)\n        ret = try_pem_load(session, fp, passphrase, beginprivkeyhdr,\n                           endprivkeyhdr, proc8, loadkeydata);\n\n    /* Try with \"RSA PRIVATE KEY\" PEM armor.\n       --> PKCS#1 RSAPrivateKey */\n    if (ret)\n        ret = try_pem_load(session, fp, passphrase, beginrsaprivkeyhdr,\n                           endrsaprivkeyhdr, proc1, loadkeydata);\n    fclose(fp);\n\n    if (ret) {\n        /* Try DER encoding. */\n        fp = fopen(filename, fopenrbmode);\n        fseek(fp, 0L, SEEK_END);\n        filesize = ftell(fp);\n\n        if (filesize <= 32768) {        /* Limit to a reasonable size. */\n            datalen = filesize;\n            data = (unsigned char *) alloca(datalen);\n            if (data) {\n                fseek(fp, 0L, SEEK_SET);\n                fread(data, datalen, 1, fp);\n\n                /* Try as PKCS#8 DER data.\n                   --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */\n                ret = (*proc8)(session, data, datalen, passphrase,\n                               loadkeydata);\n\n                /* Try as PKCS#1 DER data.\n                   --> PKCS#1 RSAPrivateKey */\n                if (ret)\n                    ret = (*proc1)(session, data, datalen, passphrase,\n                                   loadkeydata);\n            }\n        }\n        fclose(fp);\n    }\n\n    return ret;\n}\n\nint\n_libssh2_rsa_new_private(libssh2_rsa_ctx **rsa, LIBSSH2_SESSION *session,\n                         const char *filename, unsigned const char *passphrase)\n{\n    libssh2_rsa_ctx *ctx = libssh2_init_crypto_ctx(NULL);\n    int ret;\n    Qc3_Format_ALGD0400_T algd;\n    Qus_EC_t errcode;\n\n    if (!ctx)\n        return -1;\n    ret = load_rsa_private_file(session, filename, passphrase,\n                                rsapkcs1privkey, rsapkcs8privkey, (void *) ctx);\n    if (!ret) {\n        /* Create the algorithm context. */\n        algd.Public_Key_Alg = Qc3_RSA;\n        algd.PKA_Block_Format = Qc3_PKCS1_01;\n        memset(algd.Reserved, 0, sizeof algd.Reserved);\n        algd.Signing_Hash_Alg = Qc3_SHA1;\n        set_EC_length(errcode, sizeof errcode);\n        Qc3CreateAlgorithmContext((char *) &algd, Qc3_Alg_Public_Key,\n                                  ctx->hash.Alg_Context_Token, &errcode);\n        if (errcode.Bytes_Available)\n            ret = -1;\n    }\n    if (ret) {\n        _libssh2_os400qc3_crypto_dtor(ctx);\n        ctx = NULL;\n    }\n    *rsa = ctx;\n    return ret;\n}\n\nint\n_libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session,\n                          unsigned char **method, size_t *method_len,\n                          unsigned char **pubkeydata, size_t *pubkeydata_len,\n                          const char *privatekey, const char *passphrase)\n\n{\n    loadpubkeydata p;\n    int ret;\n\n    *method = NULL;\n    *method_len = 0;\n    *pubkeydata = NULL;\n    *pubkeydata_len = 0;\n\n    ret = load_rsa_private_file(session, privatekey, passphrase,\n                                rsapkcs1pubkey, rsapkcs8pubkey, (void *) &p);\n    if (!ret) {\n        *method_len = strlen(p.method);\n        if ((*method = LIBSSH2_ALLOC(session, *method_len)))\n            memcpy((char *) *method, p.method, *method_len);\n        else\n            ret = -1;\n    }\n\n    if (ret) {\n        if (*method)\n            LIBSSH2_FREE(session, *method);\n        if (p.data)\n            LIBSSH2_FREE(session, (void *) p.data);\n        *method = NULL;\n        *method_len = 0;\n    } else {\n        *pubkeydata = (unsigned char *) p.data;\n        *pubkeydata_len = p.length;\n    }\n\n    return ret;\n}\n\nint\n_libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx **rsa,\n                                    LIBSSH2_SESSION *session,\n                                    const char *filedata,\n                                    size_t filedata_len,\n                                    unsigned const char *passphrase)\n{\n    libssh2_rsa_ctx *ctx = libssh2_init_crypto_ctx(NULL);\n    unsigned char *data = NULL;\n    unsigned int datalen = 0;\n    int ret;\n    Qc3_Format_ALGD0400_T algd;\n    Qus_EC_t errcode;\n\n    if (!ctx)\n        return -1;\n\n    /* Try with \"ENCRYPTED PRIVATE KEY\" PEM armor.\n       --> PKCS#8 EncryptedPrivateKeyInfo */\n    ret = _libssh2_pem_parse_memory(session,\n                                    beginencprivkeyhdr, endencprivkeyhdr,\n                                    filedata, filedata_len, &data, &datalen);\n\n    /* Try with \"PRIVATE KEY\" PEM armor.\n       --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */\n    if (ret)\n        ret = _libssh2_pem_parse_memory(session,\n                                        beginprivkeyhdr, endprivkeyhdr,\n                                        filedata, filedata_len,\n                                        &data, &datalen);\n\n    if (!ret) {\n        /* Process PKCS#8. */\n        ret = rsapkcs8privkey(session,\n                              data, datalen, passphrase, (void *) &ctx);\n    } else {\n        /* Try with \"RSA PRIVATE KEY\" PEM armor.\n           --> PKCS#1 RSAPrivateKey */\n        ret = _libssh2_pem_parse_memory(session,\n                                        beginrsaprivkeyhdr, endrsaprivkeyhdr,\n                                        filedata, filedata_len,\n                                        &data, &datalen);\n        if (!ret)\n            ret = rsapkcs1privkey(session,\n                                  data, datalen, passphrase, (void *) &ctx);\n    }\n\n    if (ret) {\n        /* Try as PKCS#8 DER data.\n           --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */\n        ret = rsapkcs8privkey(session, filedata, filedata_len,\n                              passphrase, (void *) &ctx);\n\n        /* Try as PKCS#1 DER data.\n           --> PKCS#1 RSAPrivateKey */\n        if (ret)\n            ret = rsapkcs1privkey(session, filedata, filedata_len,\n                                  passphrase, (void *) &ctx);\n    }\n\n    if (data)\n        LIBSSH2_FREE(session, data);\n\n    if (!ret) {\n        /* Create the algorithm context. */\n        algd.Public_Key_Alg = Qc3_RSA;\n        algd.PKA_Block_Format = Qc3_PKCS1_01;\n        memset(algd.Reserved, 0, sizeof algd.Reserved);\n        algd.Signing_Hash_Alg = Qc3_SHA1;\n        set_EC_length(errcode, sizeof errcode);\n        Qc3CreateAlgorithmContext((char *) &algd, Qc3_Alg_Public_Key,\n                                  ctx->hash.Alg_Context_Token, &errcode);\n        if (errcode.Bytes_Available)\n            ret = -1;\n    }\n\n    if (ret) {\n        _libssh2_os400qc3_crypto_dtor(ctx);\n        ctx = NULL;\n    }\n\n    *rsa = ctx;\n    return ret;\n}\n\nint\n_libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session,\n                                unsigned char **method, size_t *method_len,\n                                unsigned char **pubkeydata,\n                                size_t *pubkeydata_len,\n                                const char *privatekeydata,\n                                size_t privatekeydata_len,\n                                const char *passphrase)\n{\n    loadpubkeydata p;\n    unsigned char *data = NULL;\n    unsigned int datalen = 0;\n    const char *meth;\n    int ret;\n\n    *method = NULL;\n    *method_len = 0;\n    *pubkeydata = NULL;\n    *pubkeydata_len = 0;\n\n    /* Try with \"ENCRYPTED PRIVATE KEY\" PEM armor.\n       --> PKCS#8 EncryptedPrivateKeyInfo */\n    ret = _libssh2_pem_parse_memory(session,\n                                    beginencprivkeyhdr, endencprivkeyhdr,\n                                    privatekeydata, privatekeydata_len,\n                                    &data, &datalen);\n\n    /* Try with \"PRIVATE KEY\" PEM armor.\n       --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */\n    if (ret)\n        ret = _libssh2_pem_parse_memory(session,\n                                        beginprivkeyhdr, endprivkeyhdr,\n                                        privatekeydata, privatekeydata_len,\n                                        &data, &datalen);\n\n    if (!ret) {\n        /* Process PKCS#8. */\n        ret = rsapkcs8pubkey(session,\n                             data, datalen, passphrase, (void *) &p);\n    } else {\n        /* Try with \"RSA PRIVATE KEY\" PEM armor.\n           --> PKCS#1 RSAPrivateKey */\n        ret = _libssh2_pem_parse_memory(session,\n                                        beginrsaprivkeyhdr, endrsaprivkeyhdr,\n                                        privatekeydata, privatekeydata_len,\n                                        &data, &datalen);\n        if (!ret)\n            ret = rsapkcs1pubkey(session,\n                                 data, datalen, passphrase, (void *) &p);\n    }\n\n    if (ret) {\n        /* Try as PKCS#8 DER data.\n           --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */\n        ret = rsapkcs8pubkey(session, privatekeydata, privatekeydata_len,\n                             passphrase, (void *) &p);\n\n        /* Try as PKCS#1 DER data.\n           --> PKCS#1 RSAPrivateKey */\n        if (ret)\n            ret = rsapkcs1pubkey(session, privatekeydata, privatekeydata_len,\n                                 passphrase, (void *) &p);\n    }\n\n    if (data)\n        LIBSSH2_FREE(session, data);\n\n    if (!ret) {\n        *method_len = strlen(p.method);\n        if ((*method = LIBSSH2_ALLOC(session, *method_len)))\n            memcpy((char *) *method, p.method, *method_len);\n        else\n            ret = -1;\n    }\n    if (ret) {\n        if (*method)\n            LIBSSH2_FREE(session, *method);\n        if (p.data)\n            LIBSSH2_FREE(session, (void *) p.data);\n        *method = NULL;\n        *method_len = 0;\n    } else {\n        *pubkeydata = (unsigned char *) p.data;\n        *pubkeydata_len = p.length;\n    }\n\n    return ret;\n}\n\nint\n_libssh2_rsa_sha1_verify(libssh2_rsa_ctx *rsa,\n                         const unsigned char *sig, unsigned long sig_len,\n                         const unsigned char *m, unsigned long m_len)\n{\n    Qus_EC_t errcode;\n    int slen = sig_len;\n    int mlen = m_len;\n\n    set_EC_length(errcode, sizeof errcode);\n    Qc3VerifySignature((char *) sig, &slen, (char *) m, &mlen, Qc3_Data,\n                       rsa->hash.Alg_Context_Token, Qc3_Alg_Token,\n                       rsa->key.Key_Context_Token, Qc3_Key_Token, anycsp,\n                       NULL, (char *) &errcode);\n    return errcode.Bytes_Available? -1: 0;\n}\n\nint\n_libssh2_os400qc3_rsa_sha1_signv(LIBSSH2_SESSION *session,\n                                 unsigned char **signature,\n                                 size_t *signature_len,\n                                 int veccount,\n                                 const struct iovec vector[],\n                                 libssh2_rsa_ctx *ctx)\n{\n    Qus_EC_t errcode;\n    int siglen;\n    unsigned char *sig;\n    char sigbuf[8192];\n    int sigbufsize = sizeof sigbuf;\n\n    ctx->hash.Final_Op_Flag = Qc3_Final;\n    set_EC_length(errcode, sizeof errcode);\n    Qc3CalculateSignature((char *) vector, &veccount, Qc3_Array,\n                          (char *) &ctx->hash, Qc3_Alg_Token,\n                          (char *) &ctx->key, Qc3_Key_Token,\n                          anycsp, NULL, sigbuf, &sigbufsize, &siglen,\n                          (char *) &errcode);\n    ctx->hash.Final_Op_Flag = Qc3_Continue;\n    if (errcode.Bytes_Available)\n        return -1;\n    sig = LIBSSH2_ALLOC(session, siglen);\n    if (!sig)\n        return -1;\n    memcpy((char *) sig, sigbuf, siglen);\n    *signature = sig;\n    *signature_len = siglen;\n    return 0;\n}\n\nvoid\n_libssh2_init_aes_ctr(void)\n{\n}\n\n#endif /* LIBSSH2_OS400QC3 */\n\n/* vim: set expandtab ts=4 sw=4: */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/os400qc3.h",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_OS400QC3_H\n#define LIBSSH2_OS400QC3_H\n\n#include <stdlib.h>\n#include <string.h>\n\n#include <qc3cci.h>\n\n\n/* Redefine character/string literals as always EBCDIC. */\n#undef Qc3_Alg_Token\n#define Qc3_Alg_Token       \"\\xC1\\xD3\\xC7\\xC4\\xF0\\xF1\\xF0\\xF0\"  /* ALGD0100 */\n#undef Qc3_Alg_Block_Cipher\n#define Qc3_Alg_Block_Cipher \"\\xC1\\xD3\\xC7\\xC4\\xF0\\xF2\\xF0\\xF0\" /* ALGD0200 */\n#undef Qc3_Alg_Block_CipherAuth\n#define Qc3_Alg_Block_CipherAuth                                            \\\n                            \"\\xC1\\xD3\\xC7\\xC4\\xF0\\xF2\\xF1\\xF0\"  /* ALGD0210 */\n#undef Qc3_Alg_Stream_Cipher\n#define Qc3_Alg_Stream_Cipher                                               \\\n                            \"\\xC1\\xD3\\xC7\\xC4\\xF0\\xF3\\xF0\\xF0\"  /* ALGD0300 */\n#undef Qc3_Alg_Public_Key\n#define Qc3_Alg_Public_Key  \"\\xC1\\xD3\\xC7\\xC4\\xF0\\xF4\\xF0\\xF0\"  /* ALGD0400 */\n#undef Qc3_Alg_Hash\n#define Qc3_Alg_Hash        \"\\xC1\\xD3\\xC7\\xC4\\xF0\\xF5\\xF0\\xF0\"  /* ALGD0500 */\n#undef Qc3_Data\n#define Qc3_Data            \"\\xC4\\xC1\\xE3\\xC1\\xF0\\xF1\\xF0\\xF0\"  /* DATA0100 */\n#undef Qc3_Array\n#define Qc3_Array           \"\\xC4\\xC1\\xE3\\xC1\\xF0\\xF2\\xF0\\xF0\"  /* DATA0200 */\n#undef Qc3_Key_Token\n#define Qc3_Key_Token       \"\\xD2\\xC5\\xE8\\xC4\\xF0\\xF1\\xF0\\xF0\"  /* KEYD0100 */\n#undef Qc3_Key_Parms\n#define Qc3_Key_Parms       \"\\xD2\\xC5\\xE8\\xC4\\xF0\\xF2\\xF0\\xF0\"  /* KEYD0200 */\n#undef Qc3_Key_KSLabel\n#define Qc3_Key_KSLabel     \"\\xD2\\xC5\\xE8\\xC4\\xF0\\xF4\\xF0\\xF0\"  /* KEYD0400 */\n#undef Qc3_Key_PKCS5\n#define Qc3_Key_PKCS5       \"\\xD2\\xC5\\xE8\\xC4\\xF0\\xF5\\xF0\\xF0\"  /* KEYD0500 */\n#undef Qc3_Key_PEMCert\n#define Qc3_Key_PEMCert     \"\\xD2\\xC5\\xE8\\xC4\\xF0\\xF6\\xF0\\xF0\"  /* KEYD0600 */\n#undef Qc3_Key_CSLabel\n#define Qc3_Key_CSLabel     \"\\xD2\\xC5\\xE8\\xC4\\xF0\\xF7\\xF0\\xF0\"  /* KEYD0700 */\n#undef Qc3_Key_CSDN\n#define Qc3_Key_CSDN        \"\\xD2\\xC5\\xE8\\xC4\\xF0\\xF8\\xF0\\xF0\"  /* KEYD0800 */\n#undef Qc3_Key_AppID\n#define Qc3_Key_AppID       \"\\xD2\\xC5\\xE8\\xC4\\xF0\\xF9\\xF0\\xF0\"  /* KEYD0900 */\n\n#undef Qc3_ECB\n#define Qc3_ECB             '\\xF0'      /* '0' */\n#undef Qc3_CBC\n#define Qc3_CBC             '\\xF1'      /* '1' */\n#undef Qc3_OFB\n#define Qc3_OFB             '\\xF2'      /* '2' */\n#undef Qc3_CFB1Bit\n#define Qc3_CFB1Bit         '\\xF3'      /* '3' */\n#undef Qc3_CFB8Bit\n#define Qc3_CFB8Bit         '\\xF4'      /* '4' */\n#undef Qc3_CFB64Bit\n#define Qc3_CFB64Bit        '\\xF5'      /* '5' */\n#undef Qc3_CUSP\n#define Qc3_CUSP            '\\xF6'      /* '6' */\n#undef Qc3_CTR\n#define Qc3_CTR             '\\xF7'      /* '7' */\n#undef Qc3_CCM\n#define Qc3_CCM             '\\xF8'      /* '8' */\n#undef Qc3_No_Pad\n#define Qc3_No_Pad          '\\xF0'      /* '0' */\n#undef Qc3_Pad_Char\n#define Qc3_Pad_Char        '\\xF1'      /* '1' */\n#undef Qc3_Pad_Counter\n#define Qc3_Pad_Counter     '\\xF2'      /* '2' */\n#undef Qc3_PKCS1_00\n#define Qc3_PKCS1_00        '\\xF0'      /* '0' */\n#undef Qc3_PKCS1_01\n#define Qc3_PKCS1_01        '\\xF1'      /* '1' */\n#undef Qc3_PKCS1_02\n#define Qc3_PKCS1_02        '\\xF2'      /* '2' */\n#undef Qc3_ISO9796\n#define Qc3_ISO9796         '\\xF3'      /* '3' */\n#undef Qc3_Zero_Pad\n#define Qc3_Zero_Pad        '\\xF4'      /* '4' */\n#undef Qc3_ANSI_X931\n#define Qc3_ANSI_X931       '\\xF5'      /* '5' */\n#undef Qc3_OAEP\n#define Qc3_OAEP            '\\xF6'      /* '6' */\n#undef Qc3_Bin_String\n#define Qc3_Bin_String      '\\xF0'      /* '0' */\n#undef Qc3_BER_String\n#define Qc3_BER_String      '\\xF1'      /* '1' */\n#undef Qc3_MK_Struct\n#define Qc3_MK_Struct       '\\xF3'      /* '3' */\n#undef Qc3_KSLabel_Struct\n#define Qc3_KSLabel_Struct  '\\xF4'      /* '4' */\n#undef Qc3_PKCS5_Struct\n#define Qc3_PKCS5_Struct    '\\xF5'      /* '5' */\n#undef Qc3_PEMCert_String\n#define Qc3_PEMCert_String  '\\xF6'      /* '6' */\n#undef Qc3_CSLabel_String\n#define Qc3_CSLabel_String  '\\xF7'      /* '7' */\n#undef Qc3_CSDN_String\n#define Qc3_CSDN_String     '\\xF8'      /* '8' */\n#undef Qc3_Clear\n#define Qc3_Clear           '\\xF0'      /* '0' */\n#undef Qc3_Encrypted\n#define Qc3_Encrypted       '\\xF1'      /* '1' */\n#undef Qc3_MK_Encrypted\n#define Qc3_MK_Encrypted    '\\xF2'      /* '2' */\n#undef Qc3_Any_CSP\n#define Qc3_Any_CSP         '\\xF0'      /* '0' */\n#undef Qc3_Sfw_CSP\n#define Qc3_Sfw_CSP         '\\xF1'      /* '1' */\n#undef Qc3_Hdw_CSP\n#define Qc3_Hdw_CSP         '\\xF2'      /* '2' */\n#undef Qc3_Continue\n#define Qc3_Continue        '\\xF0'      /* '0' */\n#undef Qc3_Final\n#define Qc3_Final           '\\xF1'      /* '1' */\n#undef Qc3_MK_New\n#define Qc3_MK_New          '\\xF0'      /* '0' */\n#undef Qc3_MK_Current\n#define Qc3_MK_Current      '\\xF1'      /* '1' */\n#undef Qc3_MK_Old\n#define Qc3_MK_Old          '\\xF2'      /* '2' */\n#undef Qc3_MK_Pending\n#define Qc3_MK_Pending      '\\xF3'      /* '3' */\n\n\n/* Define which features are supported. */\n#define LIBSSH2_MD5             1\n#define LIBSSH2_HMAC_RIPEMD     0\n#define LIBSSH2_HMAC_SHA256     1\n#define LIBSSH2_HMAC_SHA512     1\n\n#define LIBSSH2_AES             1\n#define LIBSSH2_AES_CTR         1\n#define LIBSSH2_BLOWFISH        0\n#define LIBSSH2_RC4             1\n#define LIBSSH2_CAST            0\n#define LIBSSH2_3DES            1\n\n#define LIBSSH2_RSA             1\n#define LIBSSH2_DSA             0\n\n#define MD5_DIGEST_LENGTH       16\n#define SHA_DIGEST_LENGTH       20\n#define SHA256_DIGEST_LENGTH    32\n#define SHA512_DIGEST_LENGTH    64\n\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: global handles structures.\n *\n *******************************************************************/\n\n/* HMAC & private key algorithms support structure. */\ntypedef struct _libssh2_os400qc3_crypto_ctx _libssh2_os400qc3_crypto_ctx;\nstruct _libssh2_os400qc3_crypto_ctx {\n    Qc3_Format_ALGD0100_T           hash;           /* Hash algorithm. */\n    Qc3_Format_KEYD0100_T           key;            /* Key. */\n    _libssh2_os400qc3_crypto_ctx *  kek;            /* Key encryption. */\n};\n\ntypedef struct {        /* Big number. */\n    unsigned char *         bignum;         /* Number bits, little-endian. */\n    unsigned int            length;         /* Length of bignum (# bytes). */\n}       _libssh2_bn;\n\ntypedef struct {        /* Algorithm description. */\n    char *                  fmt;            /* Format of Qc3 structure. */\n    int                     algo;           /* Algorithm identifier. */\n    unsigned char           size;           /* Block length. */\n    unsigned char           mode;           /* Block mode. */\n    int                     keylen;         /* Key length. */\n}       _libssh2_os400qc3_cipher_t;\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: Define global types/codes.\n *\n *******************************************************************/\n\n#define libssh2_crypto_init()\n#define libssh2_crypto_exit()\n\n#define libssh2_sha1_ctx        Qc3_Format_ALGD0100_T\n#define libssh2_sha256_ctx      Qc3_Format_ALGD0100_T\n#define libssh2_md5_ctx         Qc3_Format_ALGD0100_T\n#define libssh2_hmac_ctx        _libssh2_os400qc3_crypto_ctx\n#define _libssh2_cipher_ctx     _libssh2_os400qc3_crypto_ctx\n\n#define libssh2_sha1_init(x)    libssh2_os400qc3_hash_init(x, Qc3_SHA1)\n#define libssh2_sha1_update(ctx, data, len)                                 \\\n                                libssh2_os400qc3_hash_update(&(ctx), data, len)\n#define libssh2_sha1_final(ctx, out)                                        \\\n                                libssh2_os400qc3_hash_final(&(ctx), out)\n#define libssh2_sha256_init(x)  libssh2_os400qc3_hash_init(x, Qc3_SHA256)\n#define libssh2_sha256_update(ctx, data, len)                               \\\n                                libssh2_os400qc3_hash_update(&(ctx), data, len)\n#define libssh2_sha256_final(ctx, out)                                      \\\n                                libssh2_os400qc3_hash_final(&(ctx), out)\n#define libssh2_sha256(message, len, out)                                   \\\n                                libssh2_os400qc3_hash(message, len, out,    \\\n                                                      Qc3_SHA256)\n#define libssh2_md5_init(x)     libssh2_os400qc3_hash_init(x, Qc3_MD5)\n#define libssh2_md5_update(ctx, data, len)                                  \\\n                                libssh2_os400qc3_hash_update(&(ctx), data, len)\n#define libssh2_md5_final(ctx, out)                                         \\\n                                libssh2_os400qc3_hash_final(&(ctx), out)\n#define libssh2_hmac_ctx_init(ctx)                                          \\\n                                memset((char *) &(ctx), 0,                  \\\n                                       sizeof(libssh2_hmac_ctx))\n#define libssh2_hmac_md5_init(ctx, key, keylen)                             \\\n                                libssh2_os400qc3_hmac_init(ctx, Qc3_MD5,    \\\n                                                           MD5_DIGEST_LENGTH, \\\n                                                           key, keylen)\n#define libssh2_hmac_sha1_init(ctx, key, keylen)                            \\\n                                libssh2_os400qc3_hmac_init(ctx, Qc3_SHA1,   \\\n                                                           SHA_DIGEST_LENGTH, \\\n                                                           key, keylen)\n#define libssh2_hmac_sha256_init(ctx, key, keylen)                          \\\n                                libssh2_os400qc3_hmac_init(ctx, Qc3_SHA256, \\\n                                                         SHA256_DIGEST_LENGTH, \\\n                                                         key, keylen)\n#define libssh2_hmac_sha512_init(ctx, key, keylen)                          \\\n                                libssh2_os400qc3_hmac_init(ctx, Qc3_SHA512, \\\n                                                         SHA512_DIGEST_LENGTH, \\\n                                                         key, keylen)\n#define libssh2_hmac_update(ctx, data, datalen)                             \\\n                                libssh2_os400qc3_hmac_update(&(ctx),        \\\n                                                             data, datalen)\n#define libssh2_hmac_final(ctx, data)                                       \\\n                                libssh2_os400qc3_hmac_final(&(ctx), data)\n#define libssh2_hmac_cleanup(ctx)                                           \\\n                                _libssh2_os400qc3_crypto_dtor(ctx)\n\n\n#define _libssh2_bn_ctx         int                 /* Not used. */\n\n#define _libssh2_bn_ctx_new()           0\n#define _libssh2_bn_ctx_free(bnctx)     ((void) 0)\n\n#define _libssh2_bn_init_from_bin() _libssh2_bn_init()\n#define _libssh2_bn_mod_exp(r, a, p, m, ctx)                                \\\n                                _libssh2_os400qc3_bn_mod_exp(r, a, p, m)\n#define _libssh2_bn_bytes(bn)   ((bn)->length)\n\n#define _libssh2_cipher_type(name)  _libssh2_os400qc3_cipher_t name\n#define _libssh2_cipher_aes128 {Qc3_Alg_Block_Cipher, Qc3_AES, 16,          \\\n                                Qc3_CBC, 16}\n#define _libssh2_cipher_aes192 {Qc3_Alg_Block_Cipher, Qc3_AES, 24,          \\\n                                Qc3_CBC, 24}\n#define _libssh2_cipher_aes256 {Qc3_Alg_Block_Cipher, Qc3_AES, 32,          \\\n                                Qc3_CBC, 32}\n#define _libssh2_cipher_aes128ctr {Qc3_Alg_Block_Cipher, Qc3_AES, 16,       \\\n                                   Qc3_CTR, 16}\n#define _libssh2_cipher_aes192ctr {Qc3_Alg_Block_Cipher, Qc3_AES, 24,       \\\n                                   Qc3_CTR, 24}\n#define _libssh2_cipher_aes256ctr {Qc3_Alg_Block_Cipher, Qc3_AES, 32,       \\\n                                   Qc3_CTR, 32}\n#define _libssh2_cipher_3des   {Qc3_Alg_Block_Cipher, Qc3_TDES, 0,          \\\n                                Qc3_CBC, 24}\n#define _libssh2_cipher_arcfour {Qc3_Alg_Stream_Cipher, Qc3_RC4, 0, 0, 16}\n\n#define _libssh2_cipher_dtor(ctx) _libssh2_os400qc3_crypto_dtor(ctx)\n\n#define libssh2_rsa_ctx         _libssh2_os400qc3_crypto_ctx\n#define _libssh2_rsa_free(ctx)  (_libssh2_os400qc3_crypto_dtor(ctx),        \\\n                                 free((char *) ctx))\n#define libssh2_prepare_iovec(vec, len) memset((char *) (vec), 0,           \\\n                                               (len) * sizeof(struct iovec))\n#define _libssh2_rsa_sha1_signv(session, sig, siglen, count, vector, ctx)   \\\n            _libssh2_os400qc3_rsa_sha1_signv(session, sig, siglen,          \\\n                                             count, vector, ctx)\n\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: Support procedure prototypes.\n *\n *******************************************************************/\n\nextern _libssh2_bn *    _libssh2_bn_init(void);\nextern void     _libssh2_bn_free(_libssh2_bn *bn);\nextern unsigned long    _libssh2_bn_bits(_libssh2_bn *bn);\nextern int      _libssh2_bn_from_bin(_libssh2_bn *bn, int len,\n                                     const unsigned char *v);\nextern int      _libssh2_bn_set_word(_libssh2_bn *bn, unsigned long val);\nextern int      _libssh2_bn_to_bin(_libssh2_bn *bn, unsigned char *val);\nextern void     _libssh2_random(unsigned char *buf, int len);\nextern int      _libssh2_bn_rand(_libssh2_bn *bn, int bits,\n                                int top, int bottom);\nextern int      _libssh2_os400qc3_bn_mod_exp(_libssh2_bn *r, _libssh2_bn *a,\n                                             _libssh2_bn *p, _libssh2_bn *m);\nextern void     _libssh2_os400qc3_crypto_dtor(_libssh2_os400qc3_crypto_ctx *x);\nextern int      libssh2_os400qc3_hash_init(Qc3_Format_ALGD0100_T *x,\n                                           unsigned int algo);\nextern void     libssh2_os400qc3_hash_update(Qc3_Format_ALGD0100_T *ctx,\n                                             unsigned char *data, int len);\nextern void     libssh2_os400qc3_hash_final(Qc3_Format_ALGD0100_T *ctx,\n                                            unsigned char *out);\nextern int      libssh2_os400qc3_hash(const unsigned char *message,\n                                      unsigned long len, unsigned char *out,\n                                      unsigned int algo);\nextern void     libssh2_os400qc3_hmac_init(_libssh2_os400qc3_crypto_ctx *x,\n                                           int algo, size_t minkeylen,\n                                           void *key, int keylen);\nextern void     libssh2_os400qc3_hmac_update(_libssh2_os400qc3_crypto_ctx *ctx,\n                                             const unsigned char *data,\n                                             int len);\nextern void     libssh2_os400qc3_hmac_final(_libssh2_os400qc3_crypto_ctx *ctx,\n                                            unsigned char *out);\nextern int      _libssh2_os400qc3_rsa_sha1_signv(LIBSSH2_SESSION *session,\n                                                 unsigned char **signature,\n                                                 size_t *signature_len,\n                                                 int veccount,\n                                                 const struct iovec vector[],\n                                                 libssh2_rsa_ctx *ctx);\n\n#endif\n\n/* vim: set expandtab ts=4 sw=4: */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/packet.c",
    "content": "/* Copyright (c) 2004-2007, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2005,2006 Mikhail Gusarov\n * Copyright (c) 2009-2014 by Daniel Stenberg\n * Copyright (c) 2010 Simon Josefsson\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include <errno.h>\n#include <fcntl.h>\n\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif\n\n#ifdef HAVE_INTTYPES_H\n#include <inttypes.h>\n#endif\n\n/* Needed for struct iovec on some platforms */\n#ifdef HAVE_SYS_UIO_H\n#include <sys/uio.h>\n#endif\n\n#include <sys/types.h>\n\n#include \"transport.h\"\n#include \"channel.h\"\n#include \"packet.h\"\n\n/*\n * libssh2_packet_queue_listener\n *\n * Queue a connection request for a listener\n */\nstatic inline int\npacket_queue_listener(LIBSSH2_SESSION * session, unsigned char *data,\n                      unsigned long datalen,\n                      packet_queue_listener_state_t *listen_state)\n{\n    /*\n     * Look for a matching listener\n     */\n    /* 17 = packet_type(1) + channel(4) + reason(4) + descr(4) + lang(4) */\n    unsigned long packet_len = 17 + (sizeof(FwdNotReq) - 1);\n    unsigned char *p;\n    LIBSSH2_LISTENER *listn = _libssh2_list_first(&session->listeners);\n    char failure_code = SSH_OPEN_ADMINISTRATIVELY_PROHIBITED;\n    int rc;\n\n    (void) datalen;\n\n    if (listen_state->state == libssh2_NB_state_idle) {\n        unsigned char *s = data + (sizeof(\"forwarded-tcpip\") - 1) + 5;\n        listen_state->sender_channel = _libssh2_ntohu32(s);\n        s += 4;\n\n        listen_state->initial_window_size = _libssh2_ntohu32(s);\n        s += 4;\n        listen_state->packet_size = _libssh2_ntohu32(s);\n        s += 4;\n\n        listen_state->host_len = _libssh2_ntohu32(s);\n        s += 4;\n        listen_state->host = s;\n        s += listen_state->host_len;\n        listen_state->port = _libssh2_ntohu32(s);\n        s += 4;\n\n        listen_state->shost_len = _libssh2_ntohu32(s);\n        s += 4;\n        listen_state->shost = s;\n        s += listen_state->shost_len;\n        listen_state->sport = _libssh2_ntohu32(s);\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Remote received connection from %s:%ld to %s:%ld\",\n                       listen_state->shost, listen_state->sport,\n                       listen_state->host, listen_state->port);\n\n        listen_state->state = libssh2_NB_state_allocated;\n    }\n\n    if (listen_state->state != libssh2_NB_state_sent) {\n        while (listn) {\n            if ((listn->port == (int) listen_state->port) &&\n                (strlen(listn->host) == listen_state->host_len) &&\n                (memcmp (listn->host, listen_state->host,\n                         listen_state->host_len) == 0)) {\n                /* This is our listener */\n                LIBSSH2_CHANNEL *channel = NULL;\n                listen_state->channel = NULL;\n\n                if (listen_state->state == libssh2_NB_state_allocated) {\n                    if (listn->queue_maxsize &&\n                        (listn->queue_maxsize <= listn->queue_size)) {\n                        /* Queue is full */\n                        failure_code = SSH_OPEN_RESOURCE_SHORTAGE;\n                        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                                       \"Listener queue full, ignoring\");\n                        listen_state->state = libssh2_NB_state_sent;\n                        break;\n                    }\n\n                    channel = LIBSSH2_CALLOC(session, sizeof(LIBSSH2_CHANNEL));\n                    if (!channel) {\n                        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                       \"Unable to allocate a channel for \"\n                                       \"new connection\");\n                        failure_code = SSH_OPEN_RESOURCE_SHORTAGE;\n                        listen_state->state = libssh2_NB_state_sent;\n                        break;\n                    }\n                    listen_state->channel = channel;\n\n                    channel->session = session;\n                    channel->channel_type_len = sizeof(\"forwarded-tcpip\") - 1;\n                    channel->channel_type = LIBSSH2_ALLOC(session,\n                                                          channel->\n                                                          channel_type_len +\n                                                          1);\n                    if (!channel->channel_type) {\n                        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                       \"Unable to allocate a channel for new\"\n                                       \" connection\");\n                        LIBSSH2_FREE(session, channel);\n                        failure_code = SSH_OPEN_RESOURCE_SHORTAGE;\n                        listen_state->state = libssh2_NB_state_sent;\n                        break;\n                    }\n                    memcpy(channel->channel_type, \"forwarded-tcpip\",\n                           channel->channel_type_len + 1);\n\n                    channel->remote.id = listen_state->sender_channel;\n                    channel->remote.window_size_initial =\n                        LIBSSH2_CHANNEL_WINDOW_DEFAULT;\n                    channel->remote.window_size =\n                        LIBSSH2_CHANNEL_WINDOW_DEFAULT;\n                    channel->remote.packet_size =\n                        LIBSSH2_CHANNEL_PACKET_DEFAULT;\n\n                    channel->local.id = _libssh2_channel_nextid(session);\n                    channel->local.window_size_initial =\n                        listen_state->initial_window_size;\n                    channel->local.window_size =\n                        listen_state->initial_window_size;\n                    channel->local.packet_size = listen_state->packet_size;\n\n                    _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                                   \"Connection queued: channel %lu/%lu \"\n                                   \"win %lu/%lu packet %lu/%lu\",\n                                   channel->local.id, channel->remote.id,\n                                   channel->local.window_size,\n                                   channel->remote.window_size,\n                                   channel->local.packet_size,\n                                   channel->remote.packet_size);\n\n                    p = listen_state->packet;\n                    *(p++) = SSH_MSG_CHANNEL_OPEN_CONFIRMATION;\n                    _libssh2_store_u32(&p, channel->remote.id);\n                    _libssh2_store_u32(&p, channel->local.id);\n                    _libssh2_store_u32(&p,\n                                       channel->remote.window_size_initial);\n                    _libssh2_store_u32(&p, channel->remote.packet_size);\n\n                    listen_state->state = libssh2_NB_state_created;\n                }\n\n                if (listen_state->state == libssh2_NB_state_created) {\n                    rc = _libssh2_transport_send(session, listen_state->packet,\n                                                 17, NULL, 0);\n                    if (rc == LIBSSH2_ERROR_EAGAIN)\n                        return rc;\n                    else if (rc) {\n                        listen_state->state = libssh2_NB_state_idle;\n                        return _libssh2_error(session, rc,\n                                              \"Unable to send channel \"\n                                              \"open confirmation\");\n                    }\n\n                    /* Link the channel into the end of the queue list */\n                    if (listen_state->channel) {\n                        _libssh2_list_add(&listn->queue,\n                                          &listen_state->channel->node);\n                        listn->queue_size++;\n                    }\n\n                    listen_state->state = libssh2_NB_state_idle;\n                    return 0;\n                }\n            }\n\n            listn = _libssh2_list_next(&listn->node);\n        }\n\n        listen_state->state = libssh2_NB_state_sent;\n    }\n\n    /* We're not listening to you */\n    p = listen_state->packet;\n    *(p++) = SSH_MSG_CHANNEL_OPEN_FAILURE;\n    _libssh2_store_u32(&p, listen_state->sender_channel);\n    _libssh2_store_u32(&p, failure_code);\n    _libssh2_store_str(&p, FwdNotReq, sizeof(FwdNotReq) - 1);\n    _libssh2_htonu32(p, 0);\n\n    rc = _libssh2_transport_send(session, listen_state->packet,\n                                 packet_len, NULL, 0);\n    if (rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    } else if (rc) {\n        listen_state->state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc, \"Unable to send open failure\");\n\n    }\n    listen_state->state = libssh2_NB_state_idle;\n    return 0;\n}\n\n/*\n * packet_x11_open\n *\n * Accept a forwarded X11 connection\n */\nstatic inline int\npacket_x11_open(LIBSSH2_SESSION * session, unsigned char *data,\n                unsigned long datalen,\n                packet_x11_open_state_t *x11open_state)\n{\n    int failure_code = SSH_OPEN_CONNECT_FAILED;\n    /* 17 = packet_type(1) + channel(4) + reason(4) + descr(4) + lang(4) */\n    unsigned long packet_len = 17 + (sizeof(X11FwdUnAvil) - 1);\n    unsigned char *p;\n    LIBSSH2_CHANNEL *channel = x11open_state->channel;\n    int rc;\n\n    (void) datalen;\n\n    if (x11open_state->state == libssh2_NB_state_idle) {\n        unsigned char *s = data + (sizeof(\"x11\") - 1) + 5;\n        x11open_state->sender_channel = _libssh2_ntohu32(s);\n        s += 4;\n        x11open_state->initial_window_size = _libssh2_ntohu32(s);\n        s += 4;\n        x11open_state->packet_size = _libssh2_ntohu32(s);\n        s += 4;\n        x11open_state->shost_len = _libssh2_ntohu32(s);\n        s += 4;\n        x11open_state->shost = s;\n        s += x11open_state->shost_len;\n        x11open_state->sport = _libssh2_ntohu32(s);\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"X11 Connection Received from %s:%ld on channel %lu\",\n                       x11open_state->shost, x11open_state->sport,\n                       x11open_state->sender_channel);\n\n        x11open_state->state = libssh2_NB_state_allocated;\n    }\n\n    if (session->x11) {\n        if (x11open_state->state == libssh2_NB_state_allocated) {\n            channel = LIBSSH2_CALLOC(session, sizeof(LIBSSH2_CHANNEL));\n            if (!channel) {\n                _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                               \"allocate a channel for new connection\");\n                failure_code = SSH_OPEN_RESOURCE_SHORTAGE;\n                goto x11_exit;\n            }\n\n            channel->session = session;\n            channel->channel_type_len = sizeof(\"x11\") - 1;\n            channel->channel_type = LIBSSH2_ALLOC(session,\n                                                  channel->channel_type_len +\n                                                  1);\n            if (!channel->channel_type) {\n                _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                               \"allocate a channel for new connection\");\n                LIBSSH2_FREE(session, channel);\n                failure_code = SSH_OPEN_RESOURCE_SHORTAGE;\n                goto x11_exit;\n            }\n            memcpy(channel->channel_type, \"x11\",\n                   channel->channel_type_len + 1);\n\n            channel->remote.id = x11open_state->sender_channel;\n            channel->remote.window_size_initial =\n                LIBSSH2_CHANNEL_WINDOW_DEFAULT;\n            channel->remote.window_size = LIBSSH2_CHANNEL_WINDOW_DEFAULT;\n            channel->remote.packet_size = LIBSSH2_CHANNEL_PACKET_DEFAULT;\n\n            channel->local.id = _libssh2_channel_nextid(session);\n            channel->local.window_size_initial =\n                x11open_state->initial_window_size;\n            channel->local.window_size = x11open_state->initial_window_size;\n            channel->local.packet_size = x11open_state->packet_size;\n\n            _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                           \"X11 Connection established: channel %lu/%lu \"\n                           \"win %lu/%lu packet %lu/%lu\",\n                           channel->local.id, channel->remote.id,\n                           channel->local.window_size,\n                           channel->remote.window_size,\n                           channel->local.packet_size,\n                           channel->remote.packet_size);\n            p = x11open_state->packet;\n            *(p++) = SSH_MSG_CHANNEL_OPEN_CONFIRMATION;\n            _libssh2_store_u32(&p, channel->remote.id);\n            _libssh2_store_u32(&p, channel->local.id);\n            _libssh2_store_u32(&p, channel->remote.window_size_initial);\n            _libssh2_store_u32(&p, channel->remote.packet_size);\n\n            x11open_state->state = libssh2_NB_state_created;\n        }\n\n        if (x11open_state->state == libssh2_NB_state_created) {\n            rc = _libssh2_transport_send(session, x11open_state->packet, 17,\n                                         NULL, 0);\n            if (rc == LIBSSH2_ERROR_EAGAIN) {\n                return rc;\n            } else if (rc) {\n                x11open_state->state = libssh2_NB_state_idle;\n                return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                      \"Unable to send channel open \"\n                                      \"confirmation\");\n            }\n\n            /* Link the channel into the session */\n            _libssh2_list_add(&session->channels, &channel->node);\n\n            /*\n             * Pass control to the callback, they may turn right around and\n             * free the channel, or actually use it\n             */\n            LIBSSH2_X11_OPEN(channel, (char *)x11open_state->shost,\n                             x11open_state->sport);\n\n            x11open_state->state = libssh2_NB_state_idle;\n            return 0;\n        }\n    }\n    else\n        failure_code = SSH_OPEN_RESOURCE_SHORTAGE;\n    /* fall-trough */\n  x11_exit:\n    p = x11open_state->packet;\n    *(p++) = SSH_MSG_CHANNEL_OPEN_FAILURE;\n    _libssh2_store_u32(&p, x11open_state->sender_channel);\n    _libssh2_store_u32(&p, failure_code);\n    _libssh2_store_str(&p, X11FwdUnAvil, sizeof(X11FwdUnAvil) - 1);\n    _libssh2_htonu32(p, 0);\n\n    rc = _libssh2_transport_send(session, x11open_state->packet, packet_len,\n                                 NULL, 0);\n    if (rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    } else if (rc) {\n        x11open_state->state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc, \"Unable to send open failure\");\n    }\n    x11open_state->state = libssh2_NB_state_idle;\n    return 0;\n}\n\n/*\n * _libssh2_packet_add\n *\n * Create a new packet and attach it to the brigade. Called from the transport\n * layer when it has received a packet.\n *\n * The input pointer 'data' is pointing to allocated data that this function\n * is asked to deal with so on failure OR success, it must be freed fine.\n * The only exception is when the return code is LIBSSH2_ERROR_EAGAIN.\n *\n * This function will always be called with 'datalen' greater than zero.\n */\nint\n_libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data,\n                    size_t datalen, int macstate)\n{\n    int rc = 0;\n    char *message=NULL;\n    char *language=NULL;\n    size_t message_len=0;\n    size_t language_len=0;\n    LIBSSH2_CHANNEL *channelp = NULL;\n    size_t data_head = 0;\n    unsigned char msg = data[0];\n\n    switch(session->packAdd_state) {\n    case libssh2_NB_state_idle:\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                       \"Packet type %d received, length=%d\",\n                       (int) msg, (int) datalen);\n\n        if ((macstate == LIBSSH2_MAC_INVALID) &&\n            (!session->macerror ||\n             LIBSSH2_MACERROR(session, (char *) data, datalen))) {\n            /* Bad MAC input, but no callback set or non-zero return from the\n               callback */\n\n            LIBSSH2_FREE(session, data);\n            return _libssh2_error(session, LIBSSH2_ERROR_INVALID_MAC,\n                                  \"Invalid MAC received\");\n        }\n        session->packAdd_state = libssh2_NB_state_allocated;\n        break;\n    case libssh2_NB_state_jump1:\n        goto libssh2_packet_add_jump_point1;\n    case libssh2_NB_state_jump2:\n        goto libssh2_packet_add_jump_point2;\n    case libssh2_NB_state_jump3:\n        goto libssh2_packet_add_jump_point3;\n    case libssh2_NB_state_jump4:\n        goto libssh2_packet_add_jump_point4;\n    case libssh2_NB_state_jump5:\n        goto libssh2_packet_add_jump_point5;\n    default: /* nothing to do */\n        break;\n    }\n\n    if (session->packAdd_state == libssh2_NB_state_allocated) {\n        /* A couple exceptions to the packet adding rule: */\n        switch (msg) {\n\n            /*\n              byte      SSH_MSG_DISCONNECT\n              uint32    reason code\n              string    description in ISO-10646 UTF-8 encoding [RFC3629]\n              string    language tag [RFC3066]\n            */\n\n        case SSH_MSG_DISCONNECT:\n            if(datalen >= 5) {\n                size_t reason = _libssh2_ntohu32(data + 1);\n\n                if(datalen >= 9) {\n                    message_len = _libssh2_ntohu32(data + 5);\n\n                    if(message_len < datalen-13) {\n                        /* 9 = packet_type(1) + reason(4) + message_len(4) */\n                        message = (char *) data + 9;\n\n                        language_len = _libssh2_ntohu32(data + 9 + message_len);\n                        language = (char *) data + 9 + message_len + 4;\n\n                        if(language_len > (datalen-13-message_len)) {\n                            /* bad input, clear info */\n                            language = message = NULL;\n                            language_len = message_len = 0;\n                        }\n                    }\n                    else\n                        /* bad size, clear it */\n                        message_len=0;\n                }\n                if (session->ssh_msg_disconnect) {\n                    LIBSSH2_DISCONNECT(session, reason, message,\n                                       message_len, language, language_len);\n                }\n                _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                               \"Disconnect(%d): %s(%s)\", reason,\n                               message, language);\n            }\n\n            LIBSSH2_FREE(session, data);\n            session->socket_state = LIBSSH2_SOCKET_DISCONNECTED;\n            session->packAdd_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_DISCONNECT,\n                                  \"socket disconnect\");\n            /*\n              byte      SSH_MSG_IGNORE\n              string    data\n            */\n\n        case SSH_MSG_IGNORE:\n            if (datalen >= 2) {\n                if (session->ssh_msg_ignore) {\n                    LIBSSH2_IGNORE(session, (char *) data + 1, datalen - 1);\n                }\n            } else if (session->ssh_msg_ignore) {\n                LIBSSH2_IGNORE(session, \"\", 0);\n            }\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return 0;\n\n            /*\n              byte      SSH_MSG_DEBUG\n              boolean   always_display\n              string    message in ISO-10646 UTF-8 encoding [RFC3629]\n              string    language tag [RFC3066]\n            */\n\n        case SSH_MSG_DEBUG:\n            if(datalen >= 2) {\n                int always_display= data[1];\n\n                if(datalen >= 6) {\n                    message_len = _libssh2_ntohu32(data + 2);\n\n                    if(message_len <= (datalen - 10)) {\n                        /* 6 = packet_type(1) + display(1) + message_len(4) */\n                        message = (char *) data + 6;\n                        language_len = _libssh2_ntohu32(data + 6 + message_len);\n\n                        if(language_len <= (datalen - 10 - message_len))\n                            language = (char *) data + 10 + message_len;\n                    }\n                }\n\n                if (session->ssh_msg_debug) {\n                    LIBSSH2_DEBUG(session, always_display, message,\n                                  message_len, language, language_len);\n                }\n            }\n            /*\n             * _libssh2_debug will actually truncate this for us so\n             * that it's not an inordinate about of data\n             */\n            _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                           \"Debug Packet: %s\", message);\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return 0;\n\n            /*\n              byte      SSH_MSG_GLOBAL_REQUEST\n              string    request name in US-ASCII only\n              boolean   want reply\n              ....      request-specific data follows\n            */\n\n        case SSH_MSG_GLOBAL_REQUEST:\n            if(datalen >= 5) {\n                uint32_t len =0;\n                unsigned char want_reply=0;\n                len = _libssh2_ntohu32(data + 1);\n                if(datalen >= (6 + len)) {\n                    want_reply = data[5 + len];\n                    _libssh2_debug(session,\n                                   LIBSSH2_TRACE_CONN,\n                                   \"Received global request type %.*s (wr %X)\",\n                                   len, data + 5, want_reply);\n                }\n\n\n                if (want_reply) {\n                    static const unsigned char packet =\n                        SSH_MSG_REQUEST_FAILURE;\n                  libssh2_packet_add_jump_point5:\n                    session->packAdd_state = libssh2_NB_state_jump5;\n                    rc = _libssh2_transport_send(session, &packet, 1, NULL, 0);\n                    if (rc == LIBSSH2_ERROR_EAGAIN)\n                        return rc;\n                }\n            }\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return 0;\n\n            /*\n              byte      SSH_MSG_CHANNEL_EXTENDED_DATA\n              uint32    recipient channel\n              uint32    data_type_code\n              string    data\n            */\n\n        case SSH_MSG_CHANNEL_EXTENDED_DATA:\n            /* streamid(4) */\n            data_head += 4;\n\n            /* fall-through */\n\n            /*\n              byte      SSH_MSG_CHANNEL_DATA\n              uint32    recipient channel\n              string    data\n            */\n\n        case SSH_MSG_CHANNEL_DATA:\n            /* packet_type(1) + channelno(4) + datalen(4) */\n            data_head += 9;\n\n            if(datalen >= data_head)\n                channelp =\n                    _libssh2_channel_locate(session,\n                                            _libssh2_ntohu32(data + 1));\n\n            if (!channelp) {\n                _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_UNKNOWN,\n                               \"Packet received for unknown channel\");\n                LIBSSH2_FREE(session, data);\n                session->packAdd_state = libssh2_NB_state_idle;\n                return 0;\n            }\n#ifdef LIBSSH2DEBUG\n            {\n                uint32_t stream_id = 0;\n                if (msg == SSH_MSG_CHANNEL_EXTENDED_DATA)\n                    stream_id = _libssh2_ntohu32(data + 5);\n\n                _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                               \"%d bytes packet_add() for %lu/%lu/%lu\",\n                               (int) (datalen - data_head),\n                               channelp->local.id,\n                               channelp->remote.id,\n                               stream_id);\n            }\n#endif\n            if ((channelp->remote.extended_data_ignore_mode ==\n                 LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE) &&\n                (msg == SSH_MSG_CHANNEL_EXTENDED_DATA)) {\n                /* Pretend we didn't receive this */\n                LIBSSH2_FREE(session, data);\n\n                _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                               \"Ignoring extended data and refunding %d bytes\",\n                               (int) (datalen - 13));\n                if (channelp->read_avail + datalen - data_head >=\n                    channelp->remote.window_size)\n                    datalen = channelp->remote.window_size -\n                        channelp->read_avail + data_head;\n\n                channelp->remote.window_size -= datalen - data_head;\n                _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                               \"shrinking window size by %lu bytes to %lu, read_avail %lu\",\n                               datalen - data_head,\n                               channelp->remote.window_size,\n                               channelp->read_avail);\n\n                session->packAdd_channelp = channelp;\n\n                /* Adjust the window based on the block we just freed */\n              libssh2_packet_add_jump_point1:\n                session->packAdd_state = libssh2_NB_state_jump1;\n                rc = _libssh2_channel_receive_window_adjust(session->\n                                                            packAdd_channelp,\n                                                            datalen - 13,\n                                                            1, NULL);\n                if (rc == LIBSSH2_ERROR_EAGAIN)\n                    return rc;\n\n                session->packAdd_state = libssh2_NB_state_idle;\n                return 0;\n            }\n\n            /*\n             * REMEMBER! remote means remote as source of data,\n             * NOT remote window!\n             */\n            if (channelp->remote.packet_size < (datalen - data_head)) {\n                /*\n                 * Spec says we MAY ignore bytes sent beyond\n                 * packet_size\n                 */\n                _libssh2_error(session,\n                               LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED,\n                               \"Packet contains more data than we offered\"\n                               \" to receive, truncating\");\n                datalen = channelp->remote.packet_size + data_head;\n            }\n            if (channelp->remote.window_size <= channelp->read_avail) {\n                /*\n                 * Spec says we MAY ignore bytes sent beyond\n                 * window_size\n                 */\n                _libssh2_error(session,\n                               LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED,\n                               \"The current receive window is full,\"\n                               \" data ignored\");\n                LIBSSH2_FREE(session, data);\n                session->packAdd_state = libssh2_NB_state_idle;\n                return 0;\n            }\n            /* Reset EOF status */\n            channelp->remote.eof = 0;\n\n            if (channelp->read_avail + datalen - data_head >\n                channelp->remote.window_size) {\n                _libssh2_error(session,\n                               LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED,\n                               \"Remote sent more data than current \"\n                               \"window allows, truncating\");\n                datalen = channelp->remote.window_size -\n                    channelp->read_avail + data_head;\n            }\n\n            /* Update the read_avail counter. The window size will be\n             * updated once the data is actually read from the queue\n             * from an upper layer */\n            channelp->read_avail += datalen - data_head;\n\n            _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                           \"increasing read_avail by %lu bytes to %lu/%lu\",\n                           (long)(datalen - data_head),\n                           (long)channelp->read_avail,\n                           (long)channelp->remote.window_size);\n\n            break;\n\n            /*\n              byte      SSH_MSG_CHANNEL_EOF\n              uint32    recipient channel\n            */\n\n        case SSH_MSG_CHANNEL_EOF:\n            if(datalen >= 5)\n                channelp =\n                    _libssh2_channel_locate(session,\n                                            _libssh2_ntohu32(data + 1));\n            if (!channelp)\n                /* We may have freed already, just quietly ignore this... */\n                ;\n            else {\n                _libssh2_debug(session,\n                               LIBSSH2_TRACE_CONN,\n                               \"EOF received for channel %lu/%lu\",\n                               channelp->local.id,\n                               channelp->remote.id);\n                channelp->remote.eof = 1;\n            }\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return 0;\n\n            /*\n              byte      SSH_MSG_CHANNEL_REQUEST\n              uint32    recipient channel\n              string    request type in US-ASCII characters only\n              boolean   want reply\n              ....      type-specific data follows\n            */\n\n        case SSH_MSG_CHANNEL_REQUEST:\n            if(datalen >= 9) {\n                uint32_t channel = _libssh2_ntohu32(data + 1);\n                uint32_t len = _libssh2_ntohu32(data + 5);\n                unsigned char want_reply = 1;\n\n                if(len < (datalen - 10))\n                    want_reply = data[9 + len];\n\n                _libssh2_debug(session,\n                               LIBSSH2_TRACE_CONN,\n                               \"Channel %d received request type %.*s (wr %X)\",\n                               channel, len, data + 9, want_reply);\n\n                if (len == sizeof(\"exit-status\") - 1\n                    && !memcmp(\"exit-status\", data + 9,\n                               sizeof(\"exit-status\") - 1)) {\n\n                    /* we've got \"exit-status\" packet. Set the session value */\n                    if(datalen >= 20)\n                        channelp =\n                            _libssh2_channel_locate(session, channel);\n\n                    if (channelp) {\n                        channelp->exit_status =\n                            _libssh2_ntohu32(data + 9 + sizeof(\"exit-status\"));\n                        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                                       \"Exit status %lu received for \"\n                                       \"channel %lu/%lu\",\n                                       channelp->exit_status,\n                                       channelp->local.id,\n                                       channelp->remote.id);\n                    }\n\n                }\n                else if (len == sizeof(\"exit-signal\") - 1\n                         && !memcmp(\"exit-signal\", data + 9,\n                                    sizeof(\"exit-signal\") - 1)) {\n                    /* command terminated due to signal */\n                    if(datalen >= 20)\n                        channelp = _libssh2_channel_locate(session, channel);\n\n                    if (channelp) {\n                        /* set signal name (without SIG prefix) */\n                        uint32_t namelen =\n                            _libssh2_ntohu32(data + 9 + sizeof(\"exit-signal\"));\n                        channelp->exit_signal =\n                            LIBSSH2_ALLOC(session, namelen + 1);\n                        if (!channelp->exit_signal)\n                            rc = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                                \"memory for signal name\");\n                        else {\n                            memcpy(channelp->exit_signal,\n                                   data + 13 + sizeof(\"exit_signal\"), namelen);\n                            channelp->exit_signal[namelen] = '\\0';\n                            /* TODO: save error message and language tag */\n                            _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                                           \"Exit signal %s received for \"\n                                           \"channel %lu/%lu\",\n                                           channelp->exit_signal,\n                                           channelp->local.id,\n                                           channelp->remote.id);\n                        }\n                    }\n                }\n\n\n                if (want_reply) {\n                    unsigned char packet[5];\n                  libssh2_packet_add_jump_point4:\n                    session->packAdd_state = libssh2_NB_state_jump4;\n                    packet[0] = SSH_MSG_CHANNEL_FAILURE;\n                    memcpy(&packet[1], data+1, 4);\n                    rc = _libssh2_transport_send(session, packet, 5, NULL, 0);\n                    if (rc == LIBSSH2_ERROR_EAGAIN)\n                        return rc;\n                }\n            }\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return rc;\n\n            /*\n              byte      SSH_MSG_CHANNEL_CLOSE\n              uint32    recipient channel\n            */\n\n        case SSH_MSG_CHANNEL_CLOSE:\n            if(datalen >= 5)\n                channelp =\n                    _libssh2_channel_locate(session,\n                                            _libssh2_ntohu32(data + 1));\n            if (!channelp) {\n                /* We may have freed already, just quietly ignore this... */\n                LIBSSH2_FREE(session, data);\n                session->packAdd_state = libssh2_NB_state_idle;\n                return 0;\n            }\n            _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                           \"Close received for channel %lu/%lu\",\n                           channelp->local.id,\n                           channelp->remote.id);\n\n            channelp->remote.close = 1;\n            channelp->remote.eof = 1;\n\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return 0;\n\n            /*\n              byte      SSH_MSG_CHANNEL_OPEN\n              string    \"session\"\n              uint32    sender channel\n              uint32    initial window size\n              uint32    maximum packet size\n            */\n\n        case SSH_MSG_CHANNEL_OPEN:\n            if(datalen < 17)\n                ;\n            else if ((datalen >= (sizeof(\"forwarded-tcpip\") + 4)) &&\n                     ((sizeof(\"forwarded-tcpip\") - 1) ==\n                      _libssh2_ntohu32(data + 1))\n                     &&\n                     (memcmp(data + 5, \"forwarded-tcpip\",\n                             sizeof(\"forwarded-tcpip\") - 1) == 0)) {\n\n                /* init the state struct */\n                memset(&session->packAdd_Qlstn_state, 0,\n                       sizeof(session->packAdd_Qlstn_state));\n\n              libssh2_packet_add_jump_point2:\n                session->packAdd_state = libssh2_NB_state_jump2;\n                rc = packet_queue_listener(session, data, datalen,\n                                           &session->packAdd_Qlstn_state);\n            }\n            else if ((datalen >= (sizeof(\"x11\") + 4)) &&\n                     ((sizeof(\"x11\") - 1) == _libssh2_ntohu32(data + 1)) &&\n                     (memcmp(data + 5, \"x11\", sizeof(\"x11\") - 1) == 0)) {\n\n                /* init the state struct */\n                memset(&session->packAdd_x11open_state, 0,\n                       sizeof(session->packAdd_x11open_state));\n\n              libssh2_packet_add_jump_point3:\n                session->packAdd_state = libssh2_NB_state_jump3;\n                rc = packet_x11_open(session, data, datalen,\n                                     &session->packAdd_x11open_state);\n            }\n            if (rc == LIBSSH2_ERROR_EAGAIN)\n                return rc;\n\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return rc;\n\n            /*\n              byte      SSH_MSG_CHANNEL_WINDOW_ADJUST\n              uint32    recipient channel\n              uint32    bytes to add\n            */\n        case SSH_MSG_CHANNEL_WINDOW_ADJUST:\n            if(datalen < 9)\n                ;\n            else {\n                uint32_t bytestoadd = _libssh2_ntohu32(data + 5);\n                channelp =\n                    _libssh2_channel_locate(session,\n                                            _libssh2_ntohu32(data + 1));\n                if(channelp) {\n                    channelp->local.window_size += bytestoadd;\n\n                    _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                                   \"Window adjust for channel %lu/%lu, \"\n                                   \"adding %lu bytes, new window_size=%lu\",\n                                   channelp->local.id,\n                                   channelp->remote.id,\n                                   bytestoadd,\n                                   channelp->local.window_size);\n                }\n            }\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return 0;\n        default:\n            break;\n        }\n\n        session->packAdd_state = libssh2_NB_state_sent;\n    }\n\n    if (session->packAdd_state == libssh2_NB_state_sent) {\n        LIBSSH2_PACKET *packetp =\n            LIBSSH2_ALLOC(session, sizeof(LIBSSH2_PACKET));\n        if (!packetp) {\n            _libssh2_debug(session, LIBSSH2_ERROR_ALLOC,\n                           \"memory for packet\");\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return LIBSSH2_ERROR_ALLOC;\n        }\n        packetp->data = data;\n        packetp->data_len = datalen;\n        packetp->data_head = data_head;\n\n        _libssh2_list_add(&session->packets, &packetp->node);\n\n        session->packAdd_state = libssh2_NB_state_sent1;\n    }\n\n    if ((msg == SSH_MSG_KEXINIT &&\n         !(session->state & LIBSSH2_STATE_EXCHANGING_KEYS)) ||\n        (session->packAdd_state == libssh2_NB_state_sent2)) {\n        if (session->packAdd_state == libssh2_NB_state_sent1) {\n            /*\n             * Remote wants new keys\n             * Well, it's already in the brigade,\n             * let's just call back into ourselves\n             */\n            _libssh2_debug(session, LIBSSH2_TRACE_TRANS, \"Renegotiating Keys\");\n\n            session->packAdd_state = libssh2_NB_state_sent2;\n        }\n\n        /*\n         * The KEXINIT message has been added to the queue.  The packAdd and\n         * readPack states need to be reset because _libssh2_kex_exchange\n         * (eventually) calls upon _libssh2_transport_read to read the rest of\n         * the key exchange conversation.\n         */\n        session->readPack_state = libssh2_NB_state_idle;\n        session->packet.total_num = 0;\n        session->packAdd_state = libssh2_NB_state_idle;\n        session->fullpacket_state = libssh2_NB_state_idle;\n\n        memset(&session->startup_key_state, 0, sizeof(key_exchange_state_t));\n\n        /*\n         * If there was a key reexchange failure, let's just hope we didn't\n         * send NEWKEYS yet, otherwise remote will drop us like a rock\n         */\n        rc = _libssh2_kex_exchange(session, 1, &session->startup_key_state);\n        if (rc == LIBSSH2_ERROR_EAGAIN)\n            return rc;\n    }\n\n    session->packAdd_state = libssh2_NB_state_idle;\n    return 0;\n}\n\n/*\n * _libssh2_packet_ask\n *\n * Scan the brigade for a matching packet type, optionally poll the socket for\n * a packet first\n */\nint\n_libssh2_packet_ask(LIBSSH2_SESSION * session, unsigned char packet_type,\n                    unsigned char **data, size_t *data_len,\n                    int match_ofs, const unsigned char *match_buf,\n                    size_t match_len)\n{\n    LIBSSH2_PACKET *packet = _libssh2_list_first(&session->packets);\n\n    _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                   \"Looking for packet of type: %d\", (int) packet_type);\n\n    while (packet) {\n        if (packet->data[0] == packet_type\n            && (packet->data_len >= (match_ofs + match_len))\n            && (!match_buf ||\n                (memcmp(packet->data + match_ofs, match_buf,\n                        match_len) == 0))) {\n            *data = packet->data;\n            *data_len = packet->data_len;\n\n            /* unlink struct from session->packets */\n            _libssh2_list_remove(&packet->node);\n\n            LIBSSH2_FREE(session, packet);\n\n            return 0;\n        }\n        packet = _libssh2_list_next(&packet->node);\n    }\n    return -1;\n}\n\n/*\n * libssh2_packet_askv\n *\n * Scan for any of a list of packet types in the brigade, optionally poll the\n * socket for a packet first\n */\nint\n_libssh2_packet_askv(LIBSSH2_SESSION * session,\n                     const unsigned char *packet_types,\n                     unsigned char **data, size_t *data_len,\n                     int match_ofs,\n                     const unsigned char *match_buf,\n                     size_t match_len)\n{\n    int i, packet_types_len = strlen((char *) packet_types);\n\n    for(i = 0; i < packet_types_len; i++) {\n        if (0 == _libssh2_packet_ask(session, packet_types[i], data,\n                                     data_len, match_ofs,\n                                     match_buf, match_len)) {\n            return 0;\n        }\n    }\n\n    return -1;\n}\n\n/*\n * _libssh2_packet_require\n *\n * Loops _libssh2_transport_read() until the packet requested is available\n * SSH_DISCONNECT or a SOCKET_DISCONNECTED will cause a bailout\n *\n * Returns negative on error\n * Returns 0 when it has taken care of the requested packet.\n */\nint\n_libssh2_packet_require(LIBSSH2_SESSION * session, unsigned char packet_type,\n                        unsigned char **data, size_t *data_len,\n                        int match_ofs,\n                        const unsigned char *match_buf,\n                        size_t match_len,\n                        packet_require_state_t *state)\n{\n    if (state->start == 0) {\n        if (_libssh2_packet_ask(session, packet_type, data, data_len,\n                                match_ofs, match_buf,\n                                match_len) == 0) {\n            /* A packet was available in the packet brigade */\n            return 0;\n        }\n\n        state->start = time(NULL);\n    }\n\n    while (session->socket_state == LIBSSH2_SOCKET_CONNECTED) {\n        int ret = _libssh2_transport_read(session);\n        if (ret == LIBSSH2_ERROR_EAGAIN)\n            return ret;\n        else if (ret < 0) {\n            state->start = 0;\n            /* an error which is not just because of blocking */\n            return ret;\n        } else if (ret == packet_type) {\n            /* Be lazy, let packet_ask pull it out of the brigade */\n            ret = _libssh2_packet_ask(session, packet_type, data, data_len,\n                                      match_ofs, match_buf, match_len);\n            state->start = 0;\n            return ret;\n        } else if (ret == 0) {\n            /* nothing available, wait until data arrives or we time out */\n            long left = LIBSSH2_READ_TIMEOUT - (long)(time(NULL) -\n                                                      state->start);\n\n            if (left <= 0) {\n                state->start = 0;\n                return LIBSSH2_ERROR_TIMEOUT;\n            }\n            return -1; /* no packet available yet */\n        }\n    }\n\n    /* Only reached if the socket died */\n    return LIBSSH2_ERROR_SOCKET_DISCONNECT;\n}\n\n/*\n * _libssh2_packet_burn\n *\n * Loops _libssh2_transport_read() until any packet is available and promptly\n * discards it.\n * Used during KEX exchange to discard badly guessed KEX_INIT packets\n */\nint\n_libssh2_packet_burn(LIBSSH2_SESSION * session,\n                     libssh2_nonblocking_states * state)\n{\n    unsigned char *data;\n    size_t data_len;\n    unsigned char i, all_packets[255];\n    int ret;\n\n    if (*state == libssh2_NB_state_idle) {\n        for(i = 1; i < 255; i++) {\n            all_packets[i - 1] = i;\n        }\n        all_packets[254] = 0;\n\n        if (_libssh2_packet_askv(session, all_packets, &data, &data_len, 0,\n                                 NULL, 0) == 0) {\n            i = data[0];\n            /* A packet was available in the packet brigade, burn it */\n            LIBSSH2_FREE(session, data);\n            return i;\n        }\n\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                       \"Blocking until packet becomes available to burn\");\n        *state = libssh2_NB_state_created;\n    }\n\n    while (session->socket_state == LIBSSH2_SOCKET_CONNECTED) {\n        ret = _libssh2_transport_read(session);\n        if (ret == LIBSSH2_ERROR_EAGAIN) {\n            return ret;\n        } else if (ret < 0) {\n            *state = libssh2_NB_state_idle;\n            return ret;\n        } else if (ret == 0) {\n            /* FIXME: this might busyloop */\n            continue;\n        }\n\n        /* Be lazy, let packet_ask pull it out of the brigade */\n        if (0 ==\n            _libssh2_packet_ask(session, (unsigned char)ret,\n                                         &data, &data_len, 0, NULL, 0)) {\n            /* Smoke 'em if you got 'em */\n            LIBSSH2_FREE(session, data);\n            *state = libssh2_NB_state_idle;\n            return ret;\n        }\n    }\n\n    /* Only reached if the socket died */\n    return LIBSSH2_ERROR_SOCKET_DISCONNECT;\n}\n\n/*\n * _libssh2_packet_requirev\n *\n * Loops _libssh2_transport_read() until one of a list of packet types\n * requested is available. SSH_DISCONNECT or a SOCKET_DISCONNECTED will cause\n * a bailout. packet_types is a null terminated list of packet_type numbers\n */\n\nint\n_libssh2_packet_requirev(LIBSSH2_SESSION *session,\n                         const unsigned char *packet_types,\n                         unsigned char **data, size_t *data_len,\n                         int match_ofs,\n                         const unsigned char *match_buf, size_t match_len,\n                         packet_requirev_state_t * state)\n{\n    if (_libssh2_packet_askv(session, packet_types, data, data_len, match_ofs,\n                             match_buf, match_len) == 0) {\n        /* One of the packets listed was available in the packet brigade */\n        state->start = 0;\n        return 0;\n    }\n\n    if (state->start == 0) {\n        state->start = time(NULL);\n    }\n\n    while (session->socket_state != LIBSSH2_SOCKET_DISCONNECTED) {\n        int ret = _libssh2_transport_read(session);\n        if ((ret < 0) && (ret != LIBSSH2_ERROR_EAGAIN)) {\n            state->start = 0;\n            return ret;\n        }\n        if (ret <= 0) {\n            long left = LIBSSH2_READ_TIMEOUT -\n                (long)(time(NULL) - state->start);\n\n            if (left <= 0) {\n                state->start = 0;\n                return LIBSSH2_ERROR_TIMEOUT;\n            }\n            else if (ret == LIBSSH2_ERROR_EAGAIN) {\n                return ret;\n            }\n        }\n\n        if (strchr((char *) packet_types, ret)) {\n            /* Be lazy, let packet_ask pull it out of the brigade */\n            return _libssh2_packet_askv(session, packet_types, data,\n                                        data_len, match_ofs, match_buf,\n                                        match_len);\n        }\n    }\n\n    /* Only reached if the socket died */\n    state->start = 0;\n    return LIBSSH2_ERROR_SOCKET_DISCONNECT;\n}\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/packet.h",
    "content": "#ifndef LIBSSH2_PACKET_H\n#define LIBSSH2_PACKET_H\n/*\n * Copyright (C) 2010 by Daniel Stenberg\n * Author: Daniel Stenberg <daniel@haxx.se>\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n */\n\nint _libssh2_packet_read(LIBSSH2_SESSION * session);\n\nint _libssh2_packet_ask(LIBSSH2_SESSION * session, unsigned char packet_type,\n                        unsigned char **data, size_t *data_len,\n                        int match_ofs,\n                        const unsigned char *match_buf,\n                        size_t match_len);\n\nint _libssh2_packet_askv(LIBSSH2_SESSION * session,\n                         const unsigned char *packet_types,\n                         unsigned char **data, size_t *data_len,\n                         int match_ofs,\n                         const unsigned char *match_buf,\n                         size_t match_len);\nint _libssh2_packet_require(LIBSSH2_SESSION * session,\n                            unsigned char packet_type, unsigned char **data,\n                            size_t *data_len, int match_ofs,\n                            const unsigned char *match_buf,\n                            size_t match_len,\n                            packet_require_state_t * state);\nint _libssh2_packet_requirev(LIBSSH2_SESSION *session,\n                             const unsigned char *packet_types,\n                             unsigned char **data, size_t *data_len,\n                             int match_ofs,\n                             const unsigned char *match_buf,\n                             size_t match_len,\n                             packet_requirev_state_t * state);\nint _libssh2_packet_burn(LIBSSH2_SESSION * session,\n                         libssh2_nonblocking_states * state);\nint _libssh2_packet_write(LIBSSH2_SESSION * session, unsigned char *data,\n                          unsigned long data_len);\nint _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data,\n                        size_t datalen, int macstate);\n\n#endif /* LIBSSH2_PACKET_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/pem.c",
    "content": "/* Copyright (C) 2007 The Written Word, Inc.\n * Copyright (C) 2008, Simon Josefsson\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\nstatic int\nreadline(char *line, int line_size, FILE * fp)\n{\n    size_t len;\n\n    if (!line) {\n        return -1;\n    }\n    if (!fgets(line, line_size, fp)) {\n        return -1;\n    }\n\n    if (*line) {\n        len = strlen(line);\n        if (len > 0 && line[len - 1] == '\\n') {\n            line[len - 1] = '\\0';\n        }\n    }\n\n    if (*line) {\n        len = strlen(line);\n        if (len > 0 && line[len - 1] == '\\r') {\n            line[len - 1] = '\\0';\n        }\n    }\n\n    return 0;\n}\n\nstatic int\nreadline_memory(char *line, size_t line_size,\n                const char *filedata, size_t filedata_len,\n                size_t *filedata_offset)\n{\n    size_t off, len;\n\n    off = *filedata_offset;\n\n    for (len = 0; off + len < filedata_len && len < line_size; len++) {\n        if (filedata[off + len] == '\\n' ||\n            filedata[off + len] == '\\r') {\n                break;\n        }\n    }\n\n    if (len) {\n        memcpy(line, filedata + off, len);\n        *filedata_offset += len;\n    }\n\n    line[len] = '\\0';\n    *filedata_offset += 1;\n\n    return 0;\n}\n\n#define LINE_SIZE 128\n\nint\n_libssh2_pem_parse(LIBSSH2_SESSION * session,\n                   const char *headerbegin,\n                   const char *headerend,\n                   FILE * fp, unsigned char **data, unsigned int *datalen)\n{\n    char line[LINE_SIZE];\n    char *b64data = NULL;\n    unsigned int b64datalen = 0;\n    int ret;\n\n    do {\n        *line = '\\0';\n\n        if (readline(line, LINE_SIZE, fp)) {\n            return -1;\n        }\n    }\n    while (strcmp(line, headerbegin) != 0);\n\n    *line = '\\0';\n\n    do {\n        if (*line) {\n            char *tmp;\n            size_t linelen;\n\n            linelen = strlen(line);\n            tmp = LIBSSH2_REALLOC(session, b64data, b64datalen + linelen);\n            if (!tmp) {\n                ret = -1;\n                goto out;\n            }\n            memcpy(tmp + b64datalen, line, linelen);\n            b64data = tmp;\n            b64datalen += linelen;\n        }\n\n        *line = '\\0';\n\n        if (readline(line, LINE_SIZE, fp)) {\n            ret = -1;\n            goto out;\n        }\n    } while (strcmp(line, headerend) != 0);\n\n    if (!b64data) {\n        return -1;\n    }\n\n    if (libssh2_base64_decode(session, (char**) data, datalen,\n                              b64data, b64datalen)) {\n        ret = -1;\n        goto out;\n    }\n\n    ret = 0;\n  out:\n    if (b64data) {\n        LIBSSH2_FREE(session, b64data);\n    }\n    return ret;\n}\n\nint\n_libssh2_pem_parse_memory(LIBSSH2_SESSION * session,\n                          const char *headerbegin,\n                          const char *headerend,\n                          const char *filedata, size_t filedata_len,\n                          unsigned char **data, unsigned int *datalen)\n{\n    char line[LINE_SIZE];\n    char *b64data = NULL;\n    unsigned int b64datalen = 0;\n    size_t off = 0;\n    int ret;\n\n    do {\n        *line = '\\0';\n\n        if (readline_memory(line, LINE_SIZE, filedata, filedata_len, &off)) {\n            return -1;\n        }\n    }\n    while (strcmp(line, headerbegin) != 0);\n\n    *line = '\\0';\n\n    do {\n        if (*line) {\n            char *tmp;\n            size_t linelen;\n\n            linelen = strlen(line);\n            tmp = LIBSSH2_REALLOC(session, b64data, b64datalen + linelen);\n            if (!tmp) {\n                ret = -1;\n                goto out;\n            }\n            memcpy(tmp + b64datalen, line, linelen);\n            b64data = tmp;\n            b64datalen += linelen;\n        }\n\n        *line = '\\0';\n\n        if (readline_memory(line, LINE_SIZE, filedata, filedata_len, &off)) {\n            ret = -1;\n            goto out;\n        }\n    } while (strcmp(line, headerend) != 0);\n\n    if (!b64data) {\n        return -1;\n    }\n\n    if (libssh2_base64_decode(session, (char**) data, datalen,\n                              b64data, b64datalen)) {\n        ret = -1;\n        goto out;\n    }\n\n    ret = 0;\n  out:\n    if (b64data) {\n        LIBSSH2_FREE(session, b64data);\n    }\n    return ret;\n}\n\nstatic int\nread_asn1_length(const unsigned char *data,\n                 unsigned int datalen, unsigned int *len)\n{\n    unsigned int lenlen;\n    int nextpos;\n\n    if (datalen < 1) {\n        return -1;\n    }\n    *len = data[0];\n\n    if (*len >= 0x80) {\n        lenlen = *len & 0x7F;\n        *len = data[1];\n        if (1 + lenlen > datalen) {\n            return -1;\n        }\n        if (lenlen > 1) {\n            *len <<= 8;\n            *len |= data[2];\n        }\n    } else {\n        lenlen = 0;\n    }\n\n    nextpos = 1 + lenlen;\n    if (lenlen > 2 || 1 + lenlen + *len > datalen) {\n        return -1;\n    }\n\n    return nextpos;\n}\n\nint\n_libssh2_pem_decode_sequence(unsigned char **data, unsigned int *datalen)\n{\n    unsigned int len;\n    int lenlen;\n\n    if (*datalen < 1) {\n        return -1;\n    }\n\n    if ((*data)[0] != '\\x30') {\n        return -1;\n    }\n\n    (*data)++;\n    (*datalen)--;\n\n    lenlen = read_asn1_length(*data, *datalen, &len);\n    if (lenlen < 0 || lenlen + len != *datalen) {\n        return -1;\n    }\n\n    *data += lenlen;\n    *datalen -= lenlen;\n\n    return 0;\n}\n\nint\n_libssh2_pem_decode_integer(unsigned char **data, unsigned int *datalen,\n                            unsigned char **i, unsigned int *ilen)\n{\n    unsigned int len;\n    int lenlen;\n\n    if (*datalen < 1) {\n        return -1;\n    }\n\n    if ((*data)[0] != '\\x02') {\n        return -1;\n    }\n\n    (*data)++;\n    (*datalen)--;\n\n    lenlen = read_asn1_length(*data, *datalen, &len);\n    if (lenlen < 0 || lenlen + len > *datalen) {\n        return -1;\n    }\n\n    *data += lenlen;\n    *datalen -= lenlen;\n\n    *i = *data;\n    *ilen = len;\n\n    *data += len;\n    *datalen -= len;\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/publickey.c",
    "content": "/* Copyright (c) 2004-2007, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2010-2014 by Daniel Stenberg\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include \"libssh2_publickey.h\"\n#include \"channel.h\"\n#include \"session.h\"\n\n#define LIBSSH2_PUBLICKEY_VERSION               2\n\n/* Numericised response codes -- Not IETF, just local representation */\n#define LIBSSH2_PUBLICKEY_RESPONSE_STATUS       0\n#define LIBSSH2_PUBLICKEY_RESPONSE_VERSION      1\n#define LIBSSH2_PUBLICKEY_RESPONSE_PUBLICKEY    2\n\ntypedef struct _LIBSSH2_PUBLICKEY_CODE_LIST\n{\n    int code;\n    const char *name;\n    int name_len;\n} LIBSSH2_PUBLICKEY_CODE_LIST;\n\nstatic const LIBSSH2_PUBLICKEY_CODE_LIST publickey_response_codes[] =\n{\n    {LIBSSH2_PUBLICKEY_RESPONSE_STATUS, \"status\", sizeof(\"status\") - 1},\n    {LIBSSH2_PUBLICKEY_RESPONSE_VERSION, \"version\", sizeof(\"version\") - 1},\n    {LIBSSH2_PUBLICKEY_RESPONSE_PUBLICKEY, \"publickey\",\n     sizeof(\"publickey\") - 1} ,\n    {0, NULL, 0}\n};\n\n/* PUBLICKEY status codes -- IETF defined */\n#define LIBSSH2_PUBLICKEY_SUCCESS               0\n#define LIBSSH2_PUBLICKEY_ACCESS_DENIED         1\n#define LIBSSH2_PUBLICKEY_STORAGE_EXCEEDED      2\n#define LIBSSH2_PUBLICKEY_VERSION_NOT_SUPPORTED 3\n#define LIBSSH2_PUBLICKEY_KEY_NOT_FOUND         4\n#define LIBSSH2_PUBLICKEY_KEY_NOT_SUPPORTED     5\n#define LIBSSH2_PUBLICKEY_KEY_ALREADY_PRESENT   6\n#define LIBSSH2_PUBLICKEY_GENERAL_FAILURE       7\n#define LIBSSH2_PUBLICKEY_REQUEST_NOT_SUPPORTED 8\n\n#define LIBSSH2_PUBLICKEY_STATUS_CODE_MAX       8\n\nstatic const LIBSSH2_PUBLICKEY_CODE_LIST publickey_status_codes[] = {\n    {LIBSSH2_PUBLICKEY_SUCCESS, \"success\", sizeof(\"success\") - 1} ,\n    {LIBSSH2_PUBLICKEY_ACCESS_DENIED, \"access denied\",\n     sizeof(\"access denied\") - 1},\n    {LIBSSH2_PUBLICKEY_STORAGE_EXCEEDED, \"storage exceeded\",\n     sizeof(\"storage exceeded\") - 1} ,\n    {LIBSSH2_PUBLICKEY_VERSION_NOT_SUPPORTED, \"version not supported\",\n     sizeof(\"version not supported\") - 1} ,\n    {LIBSSH2_PUBLICKEY_KEY_NOT_FOUND, \"key not found\",\n     sizeof(\"key not found\") - 1},\n    {LIBSSH2_PUBLICKEY_KEY_NOT_SUPPORTED, \"key not supported\",\n     sizeof(\"key not supported\") - 1},\n    {LIBSSH2_PUBLICKEY_KEY_ALREADY_PRESENT, \"key already present\",\n     sizeof(\"key already present\") - 1},\n    {LIBSSH2_PUBLICKEY_GENERAL_FAILURE, \"general failure\",\n     sizeof(\"general failure\") - 1},\n    {LIBSSH2_PUBLICKEY_REQUEST_NOT_SUPPORTED, \"request not supported\",\n     sizeof(\"request not supported\") - 1},\n    {0, NULL, 0}\n};\n\n/*\n * publickey_status_error\n *\n * Format an error message from a status code\n */\nstatic void\npublickey_status_error(const LIBSSH2_PUBLICKEY *pkey,\n                       LIBSSH2_SESSION *session, int status)\n{\n    const char *msg;\n\n    /* GENERAL_FAILURE got remapped between version 1 and 2 */\n    if (status == 6 && pkey && pkey->version == 1) {\n        status = 7;\n    }\n\n    if (status < 0 || status > LIBSSH2_PUBLICKEY_STATUS_CODE_MAX) {\n        msg = \"unknown\";\n    } else {\n        msg = publickey_status_codes[status].name;\n    }\n\n    _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL, msg);\n}\n\n/*\n * publickey_packet_receive\n *\n * Read a packet from the subsystem\n */\nstatic int\npublickey_packet_receive(LIBSSH2_PUBLICKEY * pkey,\n                         unsigned char **data, size_t *data_len)\n{\n    LIBSSH2_CHANNEL *channel = pkey->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char buffer[4];\n    int rc;\n    *data = NULL; /* default to nothing returned */\n    *data_len = 0;\n\n    if (pkey->receive_state == libssh2_NB_state_idle) {\n        rc = _libssh2_channel_read(channel, 0, (char *) buffer, 4);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc != 4) {\n            return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                                  \"Invalid response from publickey subsystem\");\n        }\n\n        pkey->receive_packet_len = _libssh2_ntohu32(buffer);\n        pkey->receive_packet =\n            LIBSSH2_ALLOC(session, pkey->receive_packet_len);\n        if (!pkey->receive_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate publickey response \"\n                                  \"buffer\");\n        }\n\n        pkey->receive_state = libssh2_NB_state_sent;\n    }\n\n    if (pkey->receive_state == libssh2_NB_state_sent) {\n        rc = _libssh2_channel_read(channel, 0, (char *) pkey->receive_packet,\n                                   pkey->receive_packet_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc != (int)pkey->receive_packet_len) {\n            LIBSSH2_FREE(session, pkey->receive_packet);\n            pkey->receive_packet = NULL;\n            pkey->receive_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_TIMEOUT,\n                                  \"Timeout waiting for publickey subsystem \"\n                                  \"response packet\");\n        }\n\n        *data = pkey->receive_packet;\n        *data_len = pkey->receive_packet_len;\n    }\n\n    pkey->receive_state = libssh2_NB_state_idle;\n\n    return 0;\n}\n\n/* publickey_response_id\n *\n * Translate a string response name to a numeric code\n * Data will be incremented by 4 + response_len on success only\n */\nstatic int\npublickey_response_id(unsigned char **pdata, size_t data_len)\n{\n    size_t response_len;\n    unsigned char *data = *pdata;\n    const LIBSSH2_PUBLICKEY_CODE_LIST *codes = publickey_response_codes;\n\n    if (data_len < 4) {\n        /* Malformed response */\n        return -1;\n    }\n    response_len = _libssh2_ntohu32(data);\n    data += 4;\n    data_len -= 4;\n    if (data_len < response_len) {\n        /* Malformed response */\n        return -1;\n    }\n\n    while (codes->name) {\n        if ((unsigned long)codes->name_len == response_len &&\n            strncmp(codes->name, (char *) data, response_len) == 0) {\n            *pdata = data + response_len;\n            return codes->code;\n        }\n        codes++;\n    }\n\n    return -1;\n}\n\n/* publickey_response_success\n *\n * Generic helper routine to wait for success response and nothing else\n */\nstatic int\npublickey_response_success(LIBSSH2_PUBLICKEY * pkey)\n{\n    LIBSSH2_SESSION *session = pkey->channel->session;\n    unsigned char *data, *s;\n    size_t data_len;\n    int response;\n\n    while (1) {\n        int rc = publickey_packet_receive(pkey, &data, &data_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc) {\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_TIMEOUT,\n                                  \"Timeout waiting for response from \"\n                                  \"publickey subsystem\");\n        }\n\n        s = data;\n        response = publickey_response_id(&s, data_len);\n\n        switch (response) {\n        case LIBSSH2_PUBLICKEY_RESPONSE_STATUS:\n            /* Error, or processing complete */\n        {\n            unsigned long status = _libssh2_ntohu32(s);\n\n            LIBSSH2_FREE(session, data);\n\n            if (status == LIBSSH2_PUBLICKEY_SUCCESS)\n                return 0;\n\n            publickey_status_error(pkey, session, status);\n            return -1;\n        }\n        default:\n            LIBSSH2_FREE(session, data);\n            if (response < 0) {\n                return _libssh2_error(session,\n                                      LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                                      \"Invalid publickey subsystem response\");\n            }\n            /* Unknown/Unexpected */\n            _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                           \"Unexpected publickey subsystem response\");\n            data = NULL;\n        }\n    }\n    /* never reached, but include `return` to silence compiler warnings */\n    return -1;\n}\n\n/* *****************\n * Publickey API *\n ***************** */\n\n/*\n * publickey_init\n *\n * Startup the publickey subsystem\n */\nstatic LIBSSH2_PUBLICKEY *publickey_init(LIBSSH2_SESSION *session)\n{\n    int response;\n    int rc;\n\n    if (session->pkeyInit_state == libssh2_NB_state_idle) {\n        session->pkeyInit_data = NULL;\n        session->pkeyInit_pkey = NULL;\n        session->pkeyInit_channel = NULL;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY,\n                       \"Initializing publickey subsystem\");\n\n        session->pkeyInit_state = libssh2_NB_state_allocated;\n    }\n\n    if (session->pkeyInit_state == libssh2_NB_state_allocated) {\n\n        session->pkeyInit_channel =\n            _libssh2_channel_open(session, \"session\",\n                                  sizeof(\"session\") - 1,\n                                  LIBSSH2_CHANNEL_WINDOW_DEFAULT,\n                                  LIBSSH2_CHANNEL_PACKET_DEFAULT, NULL,\n                                  0);\n        if (!session->pkeyInit_channel) {\n            if (libssh2_session_last_errno(session) == LIBSSH2_ERROR_EAGAIN)\n                /* The error state is already set, so leave it */\n                return NULL;\n            _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                           \"Unable to startup channel\");\n            goto err_exit;\n        }\n\n        session->pkeyInit_state = libssh2_NB_state_sent;\n    }\n\n    if (session->pkeyInit_state == libssh2_NB_state_sent) {\n        rc = _libssh2_channel_process_startup(session->pkeyInit_channel,\n                                              \"subsystem\",\n                                              sizeof(\"subsystem\") - 1,\n                                              \"publickey\",\n                                              sizeof(\"publickey\") - 1);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block starting publickey subsystem\");\n            return NULL;\n        } else if (rc) {\n            _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                           \"Unable to request publickey subsystem\");\n            goto err_exit;\n        }\n\n        session->pkeyInit_state = libssh2_NB_state_sent1;\n    }\n\n    if (session->pkeyInit_state == libssh2_NB_state_sent1) {\n        unsigned char *s;\n        rc = _libssh2_channel_extended_data(session->pkeyInit_channel,\n                                            LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block starting publickey subsystem\");\n            return NULL;\n        }\n\n        session->pkeyInit_pkey =\n            LIBSSH2_CALLOC(session, sizeof(LIBSSH2_PUBLICKEY));\n        if (!session->pkeyInit_pkey) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate a new publickey structure\");\n            goto err_exit;\n        }\n        session->pkeyInit_pkey->channel = session->pkeyInit_channel;\n        session->pkeyInit_pkey->version = 0;\n\n        s = session->pkeyInit_buffer;\n        _libssh2_htonu32(s, 4 + (sizeof(\"version\") - 1) + 4);\n        s += 4;\n        _libssh2_htonu32(s, sizeof(\"version\") - 1);\n        s += 4;\n        memcpy(s, \"version\", sizeof(\"version\") - 1);\n        s += sizeof(\"version\") - 1;\n        _libssh2_htonu32(s, LIBSSH2_PUBLICKEY_VERSION);\n\n        session->pkeyInit_buffer_sent = 0;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY,\n                       \"Sending publickey advertising version %d support\",\n                       (int) LIBSSH2_PUBLICKEY_VERSION);\n\n        session->pkeyInit_state = libssh2_NB_state_sent2;\n    }\n\n    if (session->pkeyInit_state == libssh2_NB_state_sent2) {\n        rc = _libssh2_channel_write(session->pkeyInit_channel, 0,\n                                    session->pkeyInit_buffer,\n                                    19 - session->pkeyInit_buffer_sent);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block sending publickey version packet\");\n            return NULL;\n        } else if (rc < 0) {\n            _libssh2_error(session, rc,\n                           \"Unable to send publickey version packet\");\n            goto err_exit;\n        }\n        session->pkeyInit_buffer_sent += rc;\n        if(session->pkeyInit_buffer_sent < 19) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Need to be called again to complete this\");\n            return NULL;\n        }\n\n        session->pkeyInit_state = libssh2_NB_state_sent3;\n    }\n\n    if (session->pkeyInit_state == libssh2_NB_state_sent3) {\n        while (1) {\n            unsigned char *s;\n            rc = publickey_packet_receive(session->pkeyInit_pkey,\n                                          &session->pkeyInit_data,\n                                          &session->pkeyInit_data_len);\n            if (rc == LIBSSH2_ERROR_EAGAIN) {\n                _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                               \"Would block waiting for response from \"\n                               \"publickey subsystem\");\n                return NULL;\n            } else if (rc) {\n                _libssh2_error(session, LIBSSH2_ERROR_SOCKET_TIMEOUT,\n                               \"Timeout waiting for response from \"\n                               \"publickey subsystem\");\n                goto err_exit;\n            }\n\n            s = session->pkeyInit_data;\n            if ((response =\n                 publickey_response_id(&s, session->pkeyInit_data_len)) < 0) {\n                _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                               \"Invalid publickey subsystem response code\");\n                goto err_exit;\n            }\n\n            switch (response) {\n            case LIBSSH2_PUBLICKEY_RESPONSE_STATUS:\n                /* Error */\n            {\n                unsigned long status, descr_len, lang_len;\n\n                status = _libssh2_ntohu32(s);\n                s += 4;\n                descr_len = _libssh2_ntohu32(s);\n                s += 4;\n                /* description starts here */\n                s += descr_len;\n                lang_len = _libssh2_ntohu32(s);\n                s += 4;\n                /* lang starts here */\n                s += lang_len;\n\n                if (s >\n                    session->pkeyInit_data + session->pkeyInit_data_len) {\n                    _libssh2_error(session,\n                                   LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                                   \"Malformed publickey subsystem packet\");\n                    goto err_exit;\n                }\n\n                publickey_status_error(NULL, session, status);\n\n                goto err_exit;\n            }\n\n            case LIBSSH2_PUBLICKEY_RESPONSE_VERSION:\n                /* What we want */\n                session->pkeyInit_pkey->version = _libssh2_ntohu32(s);\n                if (session->pkeyInit_pkey->version >\n                    LIBSSH2_PUBLICKEY_VERSION) {\n                    _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY,\n                                   \"Truncate remote publickey version from %lu\",\n                                   session->pkeyInit_pkey->version);\n                    session->pkeyInit_pkey->version =\n                        LIBSSH2_PUBLICKEY_VERSION;\n                }\n                _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY,\n                               \"Enabling publickey subsystem version %lu\",\n                               session->pkeyInit_pkey->version);\n                LIBSSH2_FREE(session, session->pkeyInit_data);\n                session->pkeyInit_data = NULL;\n                session->pkeyInit_state = libssh2_NB_state_idle;\n                return session->pkeyInit_pkey;\n\n            default:\n                /* Unknown/Unexpected */\n                _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                               \"Unexpected publickey subsystem response, \"\n                               \"ignoring\");\n                LIBSSH2_FREE(session, session->pkeyInit_data);\n                session->pkeyInit_data = NULL;\n            }\n        }\n    }\n\n    /* Never reached except by direct goto */\n  err_exit:\n    session->pkeyInit_state = libssh2_NB_state_sent4;\n    if (session->pkeyInit_channel) {\n        rc = _libssh2_channel_close(session->pkeyInit_channel);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block closing channel\");\n            return NULL;\n        }\n    }\n    if (session->pkeyInit_pkey) {\n        LIBSSH2_FREE(session, session->pkeyInit_pkey);\n        session->pkeyInit_pkey = NULL;\n    }\n    if (session->pkeyInit_data) {\n        LIBSSH2_FREE(session, session->pkeyInit_data);\n        session->pkeyInit_data = NULL;\n    }\n    session->pkeyInit_state = libssh2_NB_state_idle;\n    return NULL;\n}\n\n/*\n * libssh2_publickey_init\n *\n * Startup the publickey subsystem\n */\nLIBSSH2_API LIBSSH2_PUBLICKEY *\nlibssh2_publickey_init(LIBSSH2_SESSION *session)\n{\n    LIBSSH2_PUBLICKEY *ptr;\n\n    BLOCK_ADJUST_ERRNO(ptr, session,\n                       publickey_init(session));\n    return ptr;\n}\n\n\n\n/*\n * libssh2_publickey_add_ex\n *\n * Add a new public key entry\n */\nLIBSSH2_API int\nlibssh2_publickey_add_ex(LIBSSH2_PUBLICKEY *pkey, const unsigned char *name,\n                         unsigned long name_len, const unsigned char *blob,\n                         unsigned long blob_len, char overwrite,\n                         unsigned long num_attrs,\n                         const libssh2_publickey_attribute attrs[])\n{\n    LIBSSH2_CHANNEL *channel;\n    LIBSSH2_SESSION *session;\n    /*  19 = packet_len(4) + add_len(4) + \"add\"(3) + name_len(4) + {name}\n        blob_len(4) + {blob} */\n    unsigned long i, packet_len = 19 + name_len + blob_len;\n    unsigned char *comment = NULL;\n    unsigned long comment_len = 0;\n    int rc;\n\n    if(!pkey)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    channel = pkey->channel;\n    session = channel->session;\n\n    if (pkey->add_state == libssh2_NB_state_idle) {\n        pkey->add_packet = NULL;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY, \"Adding %s publickey\",\n                       name);\n\n        if (pkey->version == 1) {\n            for(i = 0; i < num_attrs; i++) {\n                /* Search for a comment attribute */\n                if (attrs[i].name_len == (sizeof(\"comment\") - 1) &&\n                    strncmp(attrs[i].name, \"comment\",\n                            sizeof(\"comment\") - 1) == 0) {\n                    comment = (unsigned char *) attrs[i].value;\n                    comment_len = attrs[i].value_len;\n                    break;\n                }\n            }\n            packet_len += 4 + comment_len;\n        } else {\n            packet_len += 5;    /* overwrite(1) + attribute_count(4) */\n            for(i = 0; i < num_attrs; i++) {\n                packet_len += 9 + attrs[i].name_len + attrs[i].value_len;\n                /* name_len(4) + value_len(4) + mandatory(1) */\n            }\n        }\n\n        pkey->add_packet = LIBSSH2_ALLOC(session, packet_len);\n        if (!pkey->add_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"publickey \\\"add\\\" packet\");\n        }\n\n        pkey->add_s = pkey->add_packet;\n        _libssh2_htonu32(pkey->add_s, packet_len - 4);\n        pkey->add_s += 4;\n        _libssh2_htonu32(pkey->add_s, sizeof(\"add\") - 1);\n        pkey->add_s += 4;\n        memcpy(pkey->add_s, \"add\", sizeof(\"add\") - 1);\n        pkey->add_s += sizeof(\"add\") - 1;\n        if (pkey->version == 1) {\n            _libssh2_htonu32(pkey->add_s, comment_len);\n            pkey->add_s += 4;\n            if (comment) {\n                memcpy(pkey->add_s, comment, comment_len);\n                pkey->add_s += comment_len;\n            }\n\n            _libssh2_htonu32(pkey->add_s, name_len);\n            pkey->add_s += 4;\n            memcpy(pkey->add_s, name, name_len);\n            pkey->add_s += name_len;\n            _libssh2_htonu32(pkey->add_s, blob_len);\n            pkey->add_s += 4;\n            memcpy(pkey->add_s, blob, blob_len);\n            pkey->add_s += blob_len;\n        } else {\n            /* Version == 2 */\n\n            _libssh2_htonu32(pkey->add_s, name_len);\n            pkey->add_s += 4;\n            memcpy(pkey->add_s, name, name_len);\n            pkey->add_s += name_len;\n            _libssh2_htonu32(pkey->add_s, blob_len);\n            pkey->add_s += 4;\n            memcpy(pkey->add_s, blob, blob_len);\n            pkey->add_s += blob_len;\n            *(pkey->add_s++) = overwrite ? 0x01 : 0;\n            _libssh2_htonu32(pkey->add_s, num_attrs);\n            pkey->add_s += 4;\n            for(i = 0; i < num_attrs; i++) {\n                _libssh2_htonu32(pkey->add_s, attrs[i].name_len);\n                pkey->add_s += 4;\n                memcpy(pkey->add_s, attrs[i].name, attrs[i].name_len);\n                pkey->add_s += attrs[i].name_len;\n                _libssh2_htonu32(pkey->add_s, attrs[i].value_len);\n                pkey->add_s += 4;\n                memcpy(pkey->add_s, attrs[i].value, attrs[i].value_len);\n                pkey->add_s += attrs[i].value_len;\n                *(pkey->add_s++) = attrs[i].mandatory ? 0x01 : 0;\n            }\n        }\n\n        _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY,\n                       \"Sending publickey \\\"add\\\" packet: \"\n                       \"type=%s blob_len=%ld num_attrs=%ld\",\n                       name, blob_len, num_attrs);\n\n        pkey->add_state = libssh2_NB_state_created;\n    }\n\n    if (pkey->add_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, pkey->add_packet,\n                                    (pkey->add_s - pkey->add_packet));\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if ((pkey->add_s - pkey->add_packet) != rc) {\n            LIBSSH2_FREE(session, pkey->add_packet);\n            pkey->add_packet = NULL;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send publickey add packet\");\n        }\n        LIBSSH2_FREE(session, pkey->add_packet);\n        pkey->add_packet = NULL;\n\n        pkey->add_state = libssh2_NB_state_sent;\n    }\n\n    rc = publickey_response_success(pkey);\n    if (rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    }\n\n    pkey->add_state = libssh2_NB_state_idle;\n\n    return rc;\n}\n\n/* libssh2_publickey_remove_ex\n * Remove an existing publickey so that authentication can no longer be\n * performed using it\n */\nLIBSSH2_API int\nlibssh2_publickey_remove_ex(LIBSSH2_PUBLICKEY * pkey,\n                            const unsigned char *name, unsigned long name_len,\n                            const unsigned char *blob, unsigned long blob_len)\n{\n    LIBSSH2_CHANNEL *channel;\n    LIBSSH2_SESSION *session;\n    /* 22 = packet_len(4) + remove_len(4) + \"remove\"(6) + name_len(4) + {name}\n       + blob_len(4) + {blob} */\n    unsigned long packet_len = 22 + name_len + blob_len;\n    int rc;\n\n    if(!pkey)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    channel = pkey->channel;\n    session = channel->session;\n\n    if (pkey->remove_state == libssh2_NB_state_idle) {\n        pkey->remove_packet = NULL;\n\n        pkey->remove_packet = LIBSSH2_ALLOC(session, packet_len);\n        if (!pkey->remove_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"publickey \\\"remove\\\" packet\");\n        }\n\n        pkey->remove_s = pkey->remove_packet;\n        _libssh2_htonu32(pkey->remove_s, packet_len - 4);\n        pkey->remove_s += 4;\n        _libssh2_htonu32(pkey->remove_s, sizeof(\"remove\") - 1);\n        pkey->remove_s += 4;\n        memcpy(pkey->remove_s, \"remove\", sizeof(\"remove\") - 1);\n        pkey->remove_s += sizeof(\"remove\") - 1;\n        _libssh2_htonu32(pkey->remove_s, name_len);\n        pkey->remove_s += 4;\n        memcpy(pkey->remove_s, name, name_len);\n        pkey->remove_s += name_len;\n        _libssh2_htonu32(pkey->remove_s, blob_len);\n        pkey->remove_s += 4;\n        memcpy(pkey->remove_s, blob, blob_len);\n        pkey->remove_s += blob_len;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY,\n                       \"Sending publickey \\\"remove\\\" packet: \"\n                       \"type=%s blob_len=%ld\",\n                       name, blob_len);\n\n        pkey->remove_state = libssh2_NB_state_created;\n    }\n\n    if (pkey->remove_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, pkey->remove_packet,\n                                    (pkey->remove_s - pkey->remove_packet));\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if ((pkey->remove_s - pkey->remove_packet) != rc) {\n            LIBSSH2_FREE(session, pkey->remove_packet);\n            pkey->remove_packet = NULL;\n            pkey->remove_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send publickey remove packet\");\n        }\n        LIBSSH2_FREE(session, pkey->remove_packet);\n        pkey->remove_packet = NULL;\n\n        pkey->remove_state = libssh2_NB_state_sent;\n    }\n\n    rc = publickey_response_success(pkey);\n    if (rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    }\n\n    pkey->remove_state = libssh2_NB_state_idle;\n\n    return rc;\n}\n\n/* libssh2_publickey_list_fetch\n * Fetch a list of supported public key from a server\n */\nLIBSSH2_API int\nlibssh2_publickey_list_fetch(LIBSSH2_PUBLICKEY * pkey, unsigned long *num_keys,\n                             libssh2_publickey_list ** pkey_list)\n{\n    LIBSSH2_CHANNEL *channel;\n    LIBSSH2_SESSION *session;\n    libssh2_publickey_list *list = NULL;\n    unsigned long buffer_len = 12, keys = 0, max_keys = 0, i;\n    /* 12 = packet_len(4) + list_len(4) + \"list\"(4) */\n    int response;\n    int rc;\n\n    if(!pkey)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    channel = pkey->channel;\n    session = channel->session;\n\n    if (pkey->listFetch_state == libssh2_NB_state_idle) {\n        pkey->listFetch_data = NULL;\n\n        pkey->listFetch_s = pkey->listFetch_buffer;\n        _libssh2_htonu32(pkey->listFetch_s, buffer_len - 4);\n        pkey->listFetch_s += 4;\n        _libssh2_htonu32(pkey->listFetch_s, sizeof(\"list\") - 1);\n        pkey->listFetch_s += 4;\n        memcpy(pkey->listFetch_s, \"list\", sizeof(\"list\") - 1);\n        pkey->listFetch_s += sizeof(\"list\") - 1;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY,\n                       \"Sending publickey \\\"list\\\" packet\");\n\n        pkey->listFetch_state = libssh2_NB_state_created;\n    }\n\n    if (pkey->listFetch_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0,\n                                    pkey->listFetch_buffer,\n                                    (pkey->listFetch_s -\n                                     pkey->listFetch_buffer));\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if ((pkey->listFetch_s - pkey->listFetch_buffer) != rc) {\n            pkey->listFetch_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send publickey list packet\");\n        }\n\n        pkey->listFetch_state = libssh2_NB_state_sent;\n    }\n\n    while (1) {\n        rc = publickey_packet_receive(pkey, &pkey->listFetch_data,\n                                      &pkey->listFetch_data_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (rc) {\n            _libssh2_error(session, LIBSSH2_ERROR_SOCKET_TIMEOUT,\n                           \"Timeout waiting for response from \"\n                           \"publickey subsystem\");\n            goto err_exit;\n        }\n\n        pkey->listFetch_s = pkey->listFetch_data;\n        if ((response =\n             publickey_response_id(&pkey->listFetch_s,\n                                   pkey->listFetch_data_len)) < 0) {\n            _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                           \"Invalid publickey subsystem response code\");\n            goto err_exit;\n        }\n\n        switch (response) {\n        case LIBSSH2_PUBLICKEY_RESPONSE_STATUS:\n            /* Error, or processing complete */\n        {\n            unsigned long status, descr_len, lang_len;\n\n            status = _libssh2_ntohu32(pkey->listFetch_s);\n            pkey->listFetch_s += 4;\n            descr_len = _libssh2_ntohu32(pkey->listFetch_s);\n            pkey->listFetch_s += 4;\n            /* description starts at pkey->listFetch_s */\n            pkey->listFetch_s += descr_len;\n            lang_len = _libssh2_ntohu32(pkey->listFetch_s);\n            pkey->listFetch_s += 4;\n            /* lang starts at pkey->listFetch_s */\n            pkey->listFetch_s += lang_len;\n\n            if (pkey->listFetch_s >\n                pkey->listFetch_data + pkey->listFetch_data_len) {\n                _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                               \"Malformed publickey subsystem packet\");\n                goto err_exit;\n            }\n\n            if (status == LIBSSH2_PUBLICKEY_SUCCESS) {\n                LIBSSH2_FREE(session, pkey->listFetch_data);\n                pkey->listFetch_data = NULL;\n                *pkey_list = list;\n                *num_keys = keys;\n                pkey->listFetch_state = libssh2_NB_state_idle;\n                return 0;\n            }\n\n            publickey_status_error(pkey, session, status);\n            goto err_exit;\n        }\n        case LIBSSH2_PUBLICKEY_RESPONSE_PUBLICKEY:\n            /* What we want */\n            if (keys >= max_keys) {\n                libssh2_publickey_list *newlist;\n                /* Grow the key list if necessary */\n                max_keys += 8;\n                newlist =\n                    LIBSSH2_REALLOC(session, list,\n                                    (max_keys +\n                                     1) * sizeof(libssh2_publickey_list));\n                if (!newlist) {\n                    _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                   \"Unable to allocate memory for \"\n                                   \"publickey list\");\n                    goto err_exit;\n                }\n                list = newlist;\n            }\n            if (pkey->version == 1) {\n                unsigned long comment_len;\n\n                comment_len = _libssh2_ntohu32(pkey->listFetch_s);\n                pkey->listFetch_s += 4;\n                if (comment_len) {\n                    list[keys].num_attrs = 1;\n                    list[keys].attrs =\n                        LIBSSH2_ALLOC(session,\n                                      sizeof(libssh2_publickey_attribute));\n                    if (!list[keys].attrs) {\n                        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                       \"Unable to allocate memory for \"\n                                       \"publickey attributes\");\n                        goto err_exit;\n                    }\n                    list[keys].attrs[0].name = \"comment\";\n                    list[keys].attrs[0].name_len = sizeof(\"comment\") - 1;\n                    list[keys].attrs[0].value = (char *) pkey->listFetch_s;\n                    list[keys].attrs[0].value_len = comment_len;\n                    list[keys].attrs[0].mandatory = 0;\n\n                    pkey->listFetch_s += comment_len;\n                } else {\n                    list[keys].num_attrs = 0;\n                    list[keys].attrs = NULL;\n                }\n                list[keys].name_len = _libssh2_ntohu32(pkey->listFetch_s);\n                pkey->listFetch_s += 4;\n                list[keys].name = pkey->listFetch_s;\n                pkey->listFetch_s += list[keys].name_len;\n                list[keys].blob_len = _libssh2_ntohu32(pkey->listFetch_s);\n                pkey->listFetch_s += 4;\n                list[keys].blob = pkey->listFetch_s;\n                pkey->listFetch_s += list[keys].blob_len;\n            } else {\n                /* Version == 2 */\n                list[keys].name_len = _libssh2_ntohu32(pkey->listFetch_s);\n                pkey->listFetch_s += 4;\n                list[keys].name = pkey->listFetch_s;\n                pkey->listFetch_s += list[keys].name_len;\n                list[keys].blob_len = _libssh2_ntohu32(pkey->listFetch_s);\n                pkey->listFetch_s += 4;\n                list[keys].blob = pkey->listFetch_s;\n                pkey->listFetch_s += list[keys].blob_len;\n                list[keys].num_attrs = _libssh2_ntohu32(pkey->listFetch_s);\n                pkey->listFetch_s += 4;\n                if (list[keys].num_attrs) {\n                    list[keys].attrs =\n                        LIBSSH2_ALLOC(session,\n                                      list[keys].num_attrs *\n                                      sizeof(libssh2_publickey_attribute));\n                    if (!list[keys].attrs) {\n                        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                       \"Unable to allocate memory for \"\n                                       \"publickey attributes\");\n                        goto err_exit;\n                    }\n                    for(i = 0; i < list[keys].num_attrs; i++) {\n                        list[keys].attrs[i].name_len =\n                            _libssh2_ntohu32(pkey->listFetch_s);\n                        pkey->listFetch_s += 4;\n                        list[keys].attrs[i].name = (char *) pkey->listFetch_s;\n                        pkey->listFetch_s += list[keys].attrs[i].name_len;\n                        list[keys].attrs[i].value_len =\n                            _libssh2_ntohu32(pkey->listFetch_s);\n                        pkey->listFetch_s += 4;\n                        list[keys].attrs[i].value = (char *) pkey->listFetch_s;\n                        pkey->listFetch_s += list[keys].attrs[i].value_len;\n\n                        /* actually an ignored value */\n                        list[keys].attrs[i].mandatory = 0;\n                    }\n                } else {\n                    list[keys].attrs = NULL;\n                }\n            }\n            /* To be FREEd in libssh2_publickey_list_free() */\n            list[keys].packet = pkey->listFetch_data;\n            keys++;\n\n            list[keys].packet = NULL;   /* Terminate the list */\n            pkey->listFetch_data = NULL;\n            break;\n        default:\n            /* Unknown/Unexpected */\n            _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                           \"Unexpected publickey subsystem response\");\n            LIBSSH2_FREE(session, pkey->listFetch_data);\n            pkey->listFetch_data = NULL;\n        }\n    }\n\n    /* Only reached via explicit goto */\n  err_exit:\n    if (pkey->listFetch_data) {\n        LIBSSH2_FREE(session, pkey->listFetch_data);\n        pkey->listFetch_data = NULL;\n    }\n    if (list) {\n        libssh2_publickey_list_free(pkey, list);\n    }\n    pkey->listFetch_state = libssh2_NB_state_idle;\n    return -1;\n}\n\n/* libssh2_publickey_list_free\n * Free a previously fetched list of public keys\n */\nLIBSSH2_API void\nlibssh2_publickey_list_free(LIBSSH2_PUBLICKEY * pkey,\n                            libssh2_publickey_list * pkey_list)\n{\n    LIBSSH2_SESSION *session;\n    libssh2_publickey_list *p = pkey_list;\n\n    if(!pkey || !p)\n        return;\n\n    session = pkey->channel->session;\n\n    while (p->packet) {\n        if (p->attrs) {\n            LIBSSH2_FREE(session, p->attrs);\n        }\n        LIBSSH2_FREE(session, p->packet);\n        p++;\n    }\n\n    LIBSSH2_FREE(session, pkey_list);\n}\n\n/* libssh2_publickey_shutdown\n * Shutdown the publickey subsystem\n */\nLIBSSH2_API int\nlibssh2_publickey_shutdown(LIBSSH2_PUBLICKEY *pkey)\n{\n    LIBSSH2_SESSION *session;\n    int rc;\n\n    if(!pkey)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    session = pkey->channel->session;\n\n    /*\n     * Make sure all memory used in the state variables are free\n     */\n    if (pkey->receive_packet) {\n        LIBSSH2_FREE(session, pkey->receive_packet);\n        pkey->receive_packet = NULL;\n    }\n    if (pkey->add_packet) {\n        LIBSSH2_FREE(session, pkey->add_packet);\n        pkey->add_packet = NULL;\n    }\n    if (pkey->remove_packet) {\n        LIBSSH2_FREE(session, pkey->remove_packet);\n        pkey->remove_packet = NULL;\n    }\n    if (pkey->listFetch_data) {\n        LIBSSH2_FREE(session, pkey->listFetch_data);\n        pkey->listFetch_data = NULL;\n    }\n\n    rc = _libssh2_channel_free(pkey->channel);\n    if (rc == LIBSSH2_ERROR_EAGAIN)\n        return rc;\n\n    LIBSSH2_FREE(session, pkey);\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/scp.c",
    "content": "/* Copyright (c) 2009-2010 by Daniel Stenberg\n * Copyright (c) 2004-2008, Sara Golemon <sarag@libssh2.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include <errno.h>\n#include <stdlib.h>\n\n#include \"channel.h\"\n#include \"session.h\"\n\n\n/* Max. length of a quoted string after libssh2_shell_quotearg() processing */\n#define _libssh2_shell_quotedsize(s)     (3 * strlen(s) + 2)\n\n/*\n  This function quotes a string in a way suitable to be used with a\n  shell, e.g. the file name\n  one two\n  becomes\n  'one two'\n\n  The resulting output string is crafted in a way that makes it usable\n  with the two most common shell types: Bourne Shell derived shells\n  (sh, ksh, ksh93, bash, zsh) and C-Shell derivates (csh, tcsh).\n\n  The following special cases are handled:\n  o  If the string contains an apostrophy itself, the apostrophy\n  character is written in quotation marks, e.g. \"'\".\n  The shell cannot handle the syntax 'doesn\\'t', so we close the\n  current argument word, add the apostrophe in quotation marks \"\",\n  and open a new argument word instead (_ indicate the input\n  string characters):\n  _____   _   _\n  'doesn' \"'\" 't'\n\n  Sequences of apostrophes are combined in one pair of quotation marks:\n  a'''b\n  becomes\n  _  ___  _\n  'a'\"'''\"'b'\n\n  o  If the string contains an exclamation mark (!), the C-Shell\n  interprets it as an event number. Using \\! (not within quotation\n  marks or single quotation marks) is a mechanism understood by\n  both Bourne Shell and C-Shell.\n\n  If a quotation was already started, the argument word is closed\n  first:\n  a!b\n\n  become\n  _  _ _\n  'a'\\!'b'\n\n  The result buffer must be large enough for the expanded result. A\n  bad case regarding expansion is alternating characters and\n  apostrophes:\n\n  a'b'c'd'                   (length 8) gets converted to\n  'a'\"'\"'b'\"'\"'c'\"'\"'d'\"'\"   (length 24)\n\n  This is the worst case.\n\n  Maximum length of the result:\n  1 + 6 * (length(input) + 1) / 2) + 1\n\n  => 3 * length(input) + 2\n\n  Explanation:\n  o  leading apostrophe\n  o  one character / apostrophe pair (two characters) can get\n  represented as 6 characters: a' -> a'\"'\"'\n  o  String terminator (+1)\n\n  A result buffer three times the size of the input buffer + 2\n  characters should be safe.\n\n  References:\n  o  csh-compatible quotation (special handling for '!' etc.), see\n  http://www.grymoire.com/Unix/Csh.html#toc-uh-10\n\n  Return value:\n  Length of the resulting string (not counting the terminating '\\0'),\n  or 0 in case of errors, e.g. result buffer too small\n\n  Note: this function could possible be used elsewhere within libssh2, but\n  until then it is kept static and in this source file.\n*/\n\nstatic unsigned\nshell_quotearg(const char *path, unsigned char *buf,\n               unsigned bufsize)\n{\n    const char *src;\n    unsigned char *dst, *endp;\n\n    /*\n     * Processing States:\n     *  UQSTRING:       unquoted string: ... -- used for quoting exclamation\n     *                  marks. This is the initial state\n     *  SQSTRING:       single-quoted-string: '... -- any character may follow\n     *  QSTRING:        quoted string: \"... -- only apostrophes may follow\n     */\n    enum { UQSTRING, SQSTRING, QSTRING } state = UQSTRING;\n\n    endp = &buf[bufsize];\n    src = path;\n    dst = buf;\n    while (*src && dst < endp - 1) {\n\n        switch (*src) {\n            /*\n             * Special handling for apostrophe.\n             * An apostrophe is always written in quotation marks, e.g.\n             * ' -> \"'\".\n             */\n\n        case '\\'':\n            switch (state) {\n            case UQSTRING:      /* Unquoted string */\n                if (dst+1 >= endp)\n                    return 0;\n                *dst++ = '\"';\n                break;\n            case QSTRING:       /* Continue quoted string */\n                break;\n            case SQSTRING:      /* Close single quoted string */\n                if (dst+2 >= endp)\n                    return 0;\n                *dst++ = '\\'';\n                *dst++ = '\"';\n                break;\n            default:\n                break;\n            }\n            state = QSTRING;\n            break;\n\n            /*\n             * Special handling for exclamation marks. CSH interprets\n             * exclamation marks even when quoted with apostrophes. We convert\n             * it to the plain string \\!, because both Bourne Shell and CSH\n             * interpret that as a verbatim exclamation mark.\n             */\n\n        case '!':\n            switch (state) {\n            case UQSTRING:\n                if (dst+1 >= endp)\n                    return 0;\n                *dst++ = '\\\\';\n                break;\n            case QSTRING:\n                if (dst+2 >= endp)\n                    return 0;\n                *dst++ = '\"';           /* Closing quotation mark */\n                *dst++ = '\\\\';\n                break;\n            case SQSTRING:              /* Close single quoted string */\n                if (dst+2 >= endp)\n                    return 0;\n                *dst++ = '\\'';\n                *dst++ = '\\\\';\n                break;\n            default:\n                break;\n            }\n            state = UQSTRING;\n            break;\n\n            /*\n             * Ordinary character: prefer single-quoted string\n             */\n\n        default:\n            switch (state) {\n            case UQSTRING:\n                if (dst+1 >= endp)\n                    return 0;\n                *dst++ = '\\'';\n                break;\n            case QSTRING:\n                if (dst+2 >= endp)\n                    return 0;\n                *dst++ = '\"';           /* Closing quotation mark */\n                *dst++ = '\\'';\n                break;\n            case SQSTRING:      /* Continue single quoted string */\n                break;\n            default:\n                break;\n            }\n            state = SQSTRING;   /* Start single-quoted string */\n            break;\n        }\n\n        if (dst+1 >= endp)\n            return 0;\n        *dst++ = *src++;\n    }\n\n    switch (state) {\n    case UQSTRING:\n        break;\n    case QSTRING:           /* Close quoted string */\n        if (dst+1 >= endp)\n            return 0;\n        *dst++ = '\"';\n        break;\n    case SQSTRING:          /* Close single quoted string */\n        if (dst+1 >= endp)\n            return 0;\n        *dst++ = '\\'';\n        break;\n    default:\n        break;\n    }\n\n    if (dst+1 >= endp)\n        return 0;\n    *dst = '\\0';\n\n    /* The result cannot be larger than 3 * strlen(path) + 2 */\n    /* assert((dst - buf) <= (3 * (src - path) + 2)); */\n\n    return dst - buf;\n}\n\n/*\n * scp_recv\n *\n * Open a channel and request a remote file via SCP\n *\n */\nstatic LIBSSH2_CHANNEL *\nscp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb)\n{\n    int cmd_len;\n    int rc;\n    int tmp_err_code;\n    const char *tmp_err_msg;\n\n    if (session->scpRecv_state == libssh2_NB_state_idle) {\n        session->scpRecv_mode = 0;\n        session->scpRecv_size = 0;\n        session->scpRecv_mtime = 0;\n        session->scpRecv_atime = 0;\n\n        session->scpRecv_command_len =\n            _libssh2_shell_quotedsize(path) + sizeof(\"scp -f \") + (sb?1:0);\n\n        session->scpRecv_command =\n            LIBSSH2_ALLOC(session, session->scpRecv_command_len);\n\n        if (!session->scpRecv_command) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate a command buffer for \"\n                           \"SCP session\");\n            return NULL;\n        }\n\n        snprintf((char *)session->scpRecv_command,\n                 session->scpRecv_command_len,\n                 \"scp -%sf \", sb?\"p\":\"\");\n\n        cmd_len = strlen((char *)session->scpRecv_command);\n        cmd_len += shell_quotearg(path,\n                                  &session->scpRecv_command[cmd_len],\n                                  session->scpRecv_command_len - cmd_len);\n\n        session->scpRecv_command[cmd_len] = '\\0';\n        session->scpRecv_command_len = cmd_len + 1;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_SCP,\n                       \"Opening channel for SCP receive\");\n\n        session->scpRecv_state = libssh2_NB_state_created;\n    }\n\n    if (session->scpRecv_state == libssh2_NB_state_created) {\n        /* Allocate a channel */\n        session->scpRecv_channel =\n            _libssh2_channel_open(session, \"session\",\n                                  sizeof(\"session\") - 1,\n                                  LIBSSH2_CHANNEL_WINDOW_DEFAULT,\n                                  LIBSSH2_CHANNEL_PACKET_DEFAULT, NULL,\n                                  0);\n        if (!session->scpRecv_channel) {\n            if (libssh2_session_last_errno(session) !=\n                LIBSSH2_ERROR_EAGAIN) {\n                LIBSSH2_FREE(session, session->scpRecv_command);\n                session->scpRecv_command = NULL;\n                session->scpRecv_state = libssh2_NB_state_idle;\n            }\n            else {\n                _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                               \"Would block starting up channel\");\n            }\n            return NULL;\n        }\n\n        session->scpRecv_state = libssh2_NB_state_sent;\n    }\n\n    if (session->scpRecv_state == libssh2_NB_state_sent) {\n        /* Request SCP for the desired file */\n        rc = _libssh2_channel_process_startup(session->scpRecv_channel, \"exec\",\n                                              sizeof(\"exec\") - 1,\n                                              (char *) session->scpRecv_command,\n                                              session->scpRecv_command_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block requesting SCP startup\");\n            return NULL;\n        } else if (rc) {\n            LIBSSH2_FREE(session, session->scpRecv_command);\n            session->scpRecv_command = NULL;\n            goto scp_recv_error;\n        }\n        LIBSSH2_FREE(session, session->scpRecv_command);\n        session->scpRecv_command = NULL;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_SCP, \"Sending initial wakeup\");\n        /* SCP ACK */\n        session->scpRecv_response[0] = '\\0';\n\n        session->scpRecv_state = libssh2_NB_state_sent1;\n    }\n\n    if (session->scpRecv_state == libssh2_NB_state_sent1) {\n        rc = _libssh2_channel_write(session->scpRecv_channel, 0,\n                                    session->scpRecv_response, 1);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block sending initial wakeup\");\n            return NULL;\n        } else if (rc != 1) {\n            goto scp_recv_error;\n        }\n\n        /* Parse SCP response */\n        session->scpRecv_response_len = 0;\n\n        session->scpRecv_state = libssh2_NB_state_sent2;\n    }\n\n    if ((session->scpRecv_state == libssh2_NB_state_sent2)\n        || (session->scpRecv_state == libssh2_NB_state_sent3)) {\n        while (sb && (session->scpRecv_response_len <\n                      LIBSSH2_SCP_RESPONSE_BUFLEN)) {\n            unsigned char *s, *p;\n\n            if (session->scpRecv_state == libssh2_NB_state_sent2) {\n                rc = _libssh2_channel_read(session->scpRecv_channel, 0,\n                                           (char *) session->\n                                           scpRecv_response +\n                                           session->scpRecv_response_len, 1);\n                if (rc == LIBSSH2_ERROR_EAGAIN) {\n                    _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                   \"Would block waiting for SCP response\");\n                    return NULL;\n                }\n                else if (rc < 0) {\n                    /* error, give up */\n                    _libssh2_error(session, rc, \"Failed reading SCP response\");\n                    goto scp_recv_error;\n                }\n                else if(rc == 0)\n                    goto scp_recv_empty_channel;\n\n                session->scpRecv_response_len++;\n\n                if (session->scpRecv_response[0] != 'T') {\n                    size_t err_len;\n                    char *err_msg;\n\n                    /* there can be\n                       01 for warnings\n                       02 for errors\n\n                       The following string MUST be newline terminated\n                    */\n                    err_len =\n                        _libssh2_channel_packet_data_len(session->\n                                                         scpRecv_channel, 0);\n                    err_msg = LIBSSH2_ALLOC(session, err_len + 1);\n                    if (!err_msg) {\n                        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                       \"Failed to get memory \");\n                        goto scp_recv_error;\n                    }\n\n                    /* Read the remote error message */\n                    (void)_libssh2_channel_read(session->scpRecv_channel, 0,\n                                                err_msg, err_len);\n                    /* If it failed for any reason, we ignore it anyway. */\n\n                    /* zero terminate the error */\n                    err_msg[err_len]=0;\n\n                    _libssh2_debug(session, LIBSSH2_TRACE_SCP,\n                                   \"got %02x %s\", session->scpRecv_response[0],\n                                   err_msg);\n\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Failed to recv file\");\n\n                    LIBSSH2_FREE(session, err_msg);\n                    goto scp_recv_error;\n                }\n\n                if ((session->scpRecv_response_len > 1) &&\n                    ((session->\n                      scpRecv_response[session->scpRecv_response_len - 1] <\n                      '0')\n                     || (session->\n                         scpRecv_response[session->scpRecv_response_len - 1] >\n                         '9'))\n                    && (session->\n                        scpRecv_response[session->scpRecv_response_len - 1] !=\n                        ' ')\n                    && (session->\n                        scpRecv_response[session->scpRecv_response_len - 1] !=\n                        '\\r')\n                    && (session->\n                        scpRecv_response[session->scpRecv_response_len - 1] !=\n                        '\\n')) {\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid data in SCP response\");\n                    goto scp_recv_error;\n                }\n\n                if ((session->scpRecv_response_len < 9)\n                    || (session->\n                        scpRecv_response[session->scpRecv_response_len - 1] !=\n                        '\\n')) {\n                    if (session->scpRecv_response_len ==\n                        LIBSSH2_SCP_RESPONSE_BUFLEN) {\n                        /* You had your chance */\n                        _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                       \"Unterminated response from SCP server\");\n                        goto scp_recv_error;\n                    }\n                    /* Way too short to be an SCP response, or not done yet,\n                       short circuit */\n                    continue;\n                }\n\n                /* We're guaranteed not to go under response_len == 0 by the\n                   logic above */\n                while ((session->\n                        scpRecv_response[session->scpRecv_response_len - 1] ==\n                        '\\r')\n                       || (session->\n                           scpRecv_response[session->scpRecv_response_len -\n                                            1] == '\\n'))\n                    session->scpRecv_response_len--;\n                session->scpRecv_response[session->scpRecv_response_len] =\n                    '\\0';\n\n                if (session->scpRecv_response_len < 8) {\n                    /* EOL came too soon */\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, \"\n                                   \"too short\" );\n                    goto scp_recv_error;\n                }\n\n                s = session->scpRecv_response + 1;\n\n                p = (unsigned char *) strchr((char *) s, ' ');\n                if (!p || ((p - s) <= 0)) {\n                    /* No spaces or space in the wrong spot */\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, \"\n                                   \"malformed mtime\");\n                    goto scp_recv_error;\n                }\n\n                *(p++) = '\\0';\n                /* Make sure we don't get fooled by leftover values */\n                session->scpRecv_mtime = strtol((char *) s, NULL, 10);\n\n                s = (unsigned char *) strchr((char *) p, ' ');\n                if (!s || ((s - p) <= 0)) {\n                    /* No spaces or space in the wrong spot */\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, malformed mtime.usec\");\n                    goto scp_recv_error;\n                }\n\n                /* Ignore mtime.usec */\n                s++;\n                p = (unsigned char *) strchr((char *) s, ' ');\n                if (!p || ((p - s) <= 0)) {\n                    /* No spaces or space in the wrong spot */\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, too short or malformed\");\n                    goto scp_recv_error;\n                }\n\n                *p = '\\0';\n                /* Make sure we don't get fooled by leftover values */\n                session->scpRecv_atime = strtol((char *) s, NULL, 10);\n\n                /* SCP ACK */\n                session->scpRecv_response[0] = '\\0';\n\n                session->scpRecv_state = libssh2_NB_state_sent3;\n            }\n\n            if (session->scpRecv_state == libssh2_NB_state_sent3) {\n                rc = _libssh2_channel_write(session->scpRecv_channel, 0,\n                                            session->scpRecv_response, 1);\n                if (rc == LIBSSH2_ERROR_EAGAIN) {\n                    _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                   \"Would block waiting to send SCP ACK\");\n                    return NULL;\n                } else if (rc != 1) {\n                    goto scp_recv_error;\n                }\n\n                _libssh2_debug(session, LIBSSH2_TRACE_SCP,\n                               \"mtime = %ld, atime = %ld\",\n                               session->scpRecv_mtime, session->scpRecv_atime);\n\n                /* We *should* check that atime.usec is valid, but why let\n                   that stop use? */\n                break;\n            }\n        }\n\n        session->scpRecv_state = libssh2_NB_state_sent4;\n    }\n\n    if (session->scpRecv_state == libssh2_NB_state_sent4) {\n        session->scpRecv_response_len = 0;\n\n        session->scpRecv_state = libssh2_NB_state_sent5;\n    }\n\n    if ((session->scpRecv_state == libssh2_NB_state_sent5)\n        || (session->scpRecv_state == libssh2_NB_state_sent6)) {\n        while (session->scpRecv_response_len < LIBSSH2_SCP_RESPONSE_BUFLEN) {\n            char *s, *p, *e = NULL;\n\n            if (session->scpRecv_state == libssh2_NB_state_sent5) {\n                rc = _libssh2_channel_read(session->scpRecv_channel, 0,\n                                           (char *) session->\n                                           scpRecv_response +\n                                           session->scpRecv_response_len, 1);\n                if (rc == LIBSSH2_ERROR_EAGAIN) {\n                    _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                   \"Would block waiting for SCP response\");\n                    return NULL;\n                }\n                else if (rc < 0) {\n                    /* error, bail out*/\n                    _libssh2_error(session, rc, \"Failed reading SCP response\");\n                    goto scp_recv_error;\n                }\n                else if(rc == 0)\n                    goto scp_recv_empty_channel;\n\n                session->scpRecv_response_len++;\n\n                if (session->scpRecv_response[0] != 'C') {\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server\");\n                    goto scp_recv_error;\n                }\n\n                if ((session->scpRecv_response_len > 1) &&\n                    (session->\n                     scpRecv_response[session->scpRecv_response_len - 1] !=\n                     '\\r')\n                    && (session->\n                        scpRecv_response[session->scpRecv_response_len - 1] !=\n                        '\\n')\n                    &&\n                    (session->\n                     scpRecv_response[session->scpRecv_response_len - 1]\n                     < 32)) {\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid data in SCP response\");\n                    goto scp_recv_error;\n                }\n\n                if ((session->scpRecv_response_len < 7)\n                    || (session->\n                        scpRecv_response[session->scpRecv_response_len - 1] !=\n                        '\\n')) {\n                    if (session->scpRecv_response_len ==\n                        LIBSSH2_SCP_RESPONSE_BUFLEN) {\n                        /* You had your chance */\n                        _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                       \"Unterminated response from SCP server\");\n                        goto scp_recv_error;\n                    }\n                    /* Way too short to be an SCP response, or not done yet,\n                       short circuit */\n                    continue;\n                }\n\n                /* We're guaranteed not to go under response_len == 0 by the\n                   logic above */\n                while ((session->\n                        scpRecv_response[session->scpRecv_response_len - 1] ==\n                        '\\r')\n                       || (session->\n                           scpRecv_response[session->scpRecv_response_len -\n                                            1] == '\\n')) {\n                    session->scpRecv_response_len--;\n                }\n                session->scpRecv_response[session->scpRecv_response_len] =\n                    '\\0';\n\n                if (session->scpRecv_response_len < 6) {\n                    /* EOL came too soon */\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, too short\");\n                    goto scp_recv_error;\n                }\n\n                s = (char *) session->scpRecv_response + 1;\n\n                p = strchr(s, ' ');\n                if (!p || ((p - s) <= 0)) {\n                    /* No spaces or space in the wrong spot */\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, malformed mode\");\n                    goto scp_recv_error;\n                }\n\n                *(p++) = '\\0';\n                /* Make sure we don't get fooled by leftover values */\n\n                session->scpRecv_mode = strtol(s, &e, 8);\n                if (e && *e) {\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, invalid mode\");\n                    goto scp_recv_error;\n                }\n\n                s = strchr(p, ' ');\n                if (!s || ((s - p) <= 0)) {\n                    /* No spaces or space in the wrong spot */\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, too short or malformed\");\n                    goto scp_recv_error;\n                }\n\n                *s = '\\0';\n                /* Make sure we don't get fooled by leftover values */\n                session->scpRecv_size = scpsize_strtol(p, &e, 10);\n                if (e && *e) {\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, invalid size\");\n                    goto scp_recv_error;\n                }\n\n                /* SCP ACK */\n                session->scpRecv_response[0] = '\\0';\n\n                session->scpRecv_state = libssh2_NB_state_sent6;\n            }\n\n            if (session->scpRecv_state == libssh2_NB_state_sent6) {\n                rc = _libssh2_channel_write(session->scpRecv_channel, 0,\n                                            session->scpRecv_response, 1);\n                if (rc == LIBSSH2_ERROR_EAGAIN) {\n                    _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                   \"Would block sending SCP ACK\");\n                    return NULL;\n                } else if (rc != 1) {\n                    goto scp_recv_error;\n                }\n                _libssh2_debug(session, LIBSSH2_TRACE_SCP,\n                               \"mode = 0%lo size = %ld\", session->scpRecv_mode,\n                               session->scpRecv_size);\n\n                /* We *should* check that basename is valid, but why let that\n                   stop us? */\n                break;\n            }\n        }\n\n        session->scpRecv_state = libssh2_NB_state_sent7;\n    }\n\n    if (sb) {\n        memset(sb, 0, sizeof(libssh2_struct_stat));\n\n        sb->st_mtime = session->scpRecv_mtime;\n        sb->st_atime = session->scpRecv_atime;\n        sb->st_size = session->scpRecv_size;\n        sb->st_mode = (unsigned short)session->scpRecv_mode;\n    }\n\n    session->scpRecv_state = libssh2_NB_state_idle;\n    return session->scpRecv_channel;\n\n  scp_recv_empty_channel:\n    /* the code only jumps here as a result of a zero read from channel_read()\n       so we check EOF status to avoid getting stuck in a loop */\n    if(libssh2_channel_eof(session->scpRecv_channel))\n        _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                       \"Unexpected channel close\");\n    else\n        return session->scpRecv_channel;\n    /* fall-through */\n  scp_recv_error:\n    tmp_err_code = session->err_code;\n    tmp_err_msg = session->err_msg;\n    while (libssh2_channel_free(session->scpRecv_channel) ==\n           LIBSSH2_ERROR_EAGAIN);\n    session->err_code = tmp_err_code;\n    session->err_msg = tmp_err_msg;\n    session->scpRecv_channel = NULL;\n    session->scpRecv_state = libssh2_NB_state_idle;\n    return NULL;\n}\n\n/*\n * libssh2_scp_recv\n *\n * DEPRECATED\n *\n * Open a channel and request a remote file via SCP.  This receives files larger\n * than 2 GB, but is unable to report the proper size on platforms where the\n * st_size member of struct stat is limited to 2 GB (e.g. windows).\n *\n */\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_scp_recv(LIBSSH2_SESSION *session, const char *path, struct stat * sb)\n{\n    LIBSSH2_CHANNEL *ptr;\n\n    /* scp_recv uses libssh2_struct_stat, so pass one if the caller gave us a struct to populate... */\n    libssh2_struct_stat sb_intl;\n    libssh2_struct_stat *sb_ptr;\n    sb_ptr = sb ? &sb_intl : NULL;\n\n    BLOCK_ADJUST_ERRNO(ptr, session, scp_recv(session, path, sb_ptr));\n\n    /* ...and populate the caller's with as much info as fits. */\n    if (sb) {\n        memset(sb, 0, sizeof(struct stat));\n\n        sb->st_mtime = sb_intl.st_mtime;\n        sb->st_atime = sb_intl.st_atime;\n        sb->st_size = (off_t)sb_intl.st_size;\n        sb->st_mode = sb_intl.st_mode;\n    }\n\n    return ptr;\n}\n\n/*\n * libssh2_scp_recv2\n *\n * Open a channel and request a remote file via SCP.  This supports files > 2GB\n * on platforms that support it.\n *\n */\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_scp_recv2(LIBSSH2_SESSION *session, const char *path, libssh2_struct_stat * sb)\n{\n    LIBSSH2_CHANNEL *ptr;\n    BLOCK_ADJUST_ERRNO(ptr, session, scp_recv(session, path, sb));\n    return ptr;\n}\n\n/*\n * scp_send()\n *\n * Send a file using SCP\n *\n */\nstatic LIBSSH2_CHANNEL *\nscp_send(LIBSSH2_SESSION * session, const char *path, int mode,\n         libssh2_int64_t size, time_t mtime, time_t atime)\n{\n    int cmd_len;\n    int rc;\n    int tmp_err_code;\n    const char *tmp_err_msg;\n\n    if (session->scpSend_state == libssh2_NB_state_idle) {\n        session->scpSend_command_len =\n            _libssh2_shell_quotedsize(path) + sizeof(\"scp -t \") +\n            ((mtime || atime)?1:0);\n\n        session->scpSend_command =\n            LIBSSH2_ALLOC(session, session->scpSend_command_len);\n\n        if (!session->scpSend_command) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate a command buffer for \"\n                           \"SCP session\");\n            return NULL;\n        }\n\n        snprintf((char *)session->scpSend_command,\n                 session->scpSend_command_len,\n                 \"scp -%st \", (mtime || atime)?\"p\":\"\");\n\n        cmd_len = strlen((char *)session->scpSend_command);\n        cmd_len += shell_quotearg(path,\n                                  &session->scpSend_command[cmd_len],\n                                  session->scpSend_command_len - cmd_len);\n\n        session->scpSend_command[cmd_len] = '\\0';\n        session->scpSend_command_len = cmd_len + 1;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_SCP,\n                       \"Opening channel for SCP send\");\n        /* Allocate a channel */\n\n        session->scpSend_state = libssh2_NB_state_created;\n    }\n\n    if (session->scpSend_state == libssh2_NB_state_created) {\n        session->scpSend_channel =\n            _libssh2_channel_open(session, \"session\", sizeof(\"session\") - 1,\n                                  LIBSSH2_CHANNEL_WINDOW_DEFAULT,\n                                  LIBSSH2_CHANNEL_PACKET_DEFAULT, NULL, 0);\n        if (!session->scpSend_channel) {\n            if (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN) {\n                /* previous call set libssh2_session_last_error(), pass it\n                   through */\n                LIBSSH2_FREE(session, session->scpSend_command);\n                session->scpSend_command = NULL;\n                session->scpSend_state = libssh2_NB_state_idle;\n            }\n            else {\n                _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                               \"Would block starting up channel\");\n            }\n            return NULL;\n        }\n\n        session->scpSend_state = libssh2_NB_state_sent;\n    }\n\n    if (session->scpSend_state == libssh2_NB_state_sent) {\n        /* Request SCP for the desired file */\n        rc = _libssh2_channel_process_startup(session->scpSend_channel, \"exec\",\n                                              sizeof(\"exec\") - 1,\n                                              (char *) session->scpSend_command,\n                                              session->scpSend_command_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block requesting SCP startup\");\n            return NULL;\n        }\n        else if (rc) {\n            /* previous call set libssh2_session_last_error(), pass it\n               through */\n            LIBSSH2_FREE(session, session->scpSend_command);\n            session->scpSend_command = NULL;\n            _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                           \"Unknown error while getting error string\");\n            goto scp_send_error;\n        }\n        LIBSSH2_FREE(session, session->scpSend_command);\n        session->scpSend_command = NULL;\n\n        session->scpSend_state = libssh2_NB_state_sent1;\n    }\n\n    if (session->scpSend_state == libssh2_NB_state_sent1) {\n        /* Wait for ACK */\n        rc = _libssh2_channel_read(session->scpSend_channel, 0,\n                                   (char *) session->scpSend_response, 1);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block waiting for response from remote\");\n            return NULL;\n        }\n        else if (rc < 0) {\n            _libssh2_error(session, rc, \"SCP failure\");\n            goto scp_send_error;\n        }\n        else if(!rc)\n            /* remain in the same state */\n            goto scp_send_empty_channel;\n        else if (session->scpSend_response[0] != 0) {\n            _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                           \"Invalid ACK response from remote\");\n            goto scp_send_error;\n        }\n        if (mtime || atime) {\n            /* Send mtime and atime to be used for file */\n            session->scpSend_response_len =\n                snprintf((char *) session->scpSend_response,\n                         LIBSSH2_SCP_RESPONSE_BUFLEN, \"T%ld 0 %ld 0\\n\",\n                         (long)mtime, (long)atime);\n            _libssh2_debug(session, LIBSSH2_TRACE_SCP, \"Sent %s\",\n                           session->scpSend_response);\n        }\n\n        session->scpSend_state = libssh2_NB_state_sent2;\n    }\n\n    /* Send mtime and atime to be used for file */\n    if (mtime || atime) {\n        if (session->scpSend_state == libssh2_NB_state_sent2) {\n            rc = _libssh2_channel_write(session->scpSend_channel, 0,\n                                        session->scpSend_response,\n                                        session->scpSend_response_len);\n            if (rc == LIBSSH2_ERROR_EAGAIN) {\n                _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                               \"Would block sending time data for SCP file\");\n                return NULL;\n            } else if (rc != (int)session->scpSend_response_len) {\n                _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                               \"Unable to send time data for SCP file\");\n                goto scp_send_error;\n            }\n\n            session->scpSend_state = libssh2_NB_state_sent3;\n        }\n\n        if (session->scpSend_state == libssh2_NB_state_sent3) {\n            /* Wait for ACK */\n            rc = _libssh2_channel_read(session->scpSend_channel, 0,\n                                       (char *) session->scpSend_response, 1);\n            if (rc == LIBSSH2_ERROR_EAGAIN) {\n                _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                               \"Would block waiting for response\");\n                return NULL;\n            }\n            else if (rc < 0) {\n                _libssh2_error(session, rc, \"SCP failure\");\n                goto scp_send_error;\n            }\n            else if(!rc)\n                /* remain in the same state */\n                goto scp_send_empty_channel;\n            else if (session->scpSend_response[0] != 0) {\n                _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                               \"Invalid SCP ACK response\");\n                goto scp_send_error;\n            }\n\n            session->scpSend_state = libssh2_NB_state_sent4;\n        }\n    } else {\n        if (session->scpSend_state == libssh2_NB_state_sent2) {\n            session->scpSend_state = libssh2_NB_state_sent4;\n        }\n    }\n\n    if (session->scpSend_state == libssh2_NB_state_sent4) {\n        /* Send mode, size, and basename */\n        const char *base = strrchr(path, '/');\n        if (base)\n            base++;\n        else\n            base = path;\n\n        session->scpSend_response_len =\n            snprintf((char *) session->scpSend_response,\n                     LIBSSH2_SCP_RESPONSE_BUFLEN, \"C0%o %\"\n                     LIBSSH2_INT64_T_FORMAT \" %s\\n\", mode,\n                     size, base);\n        _libssh2_debug(session, LIBSSH2_TRACE_SCP, \"Sent %s\",\n                       session->scpSend_response);\n\n        session->scpSend_state = libssh2_NB_state_sent5;\n    }\n\n    if (session->scpSend_state == libssh2_NB_state_sent5) {\n        rc = _libssh2_channel_write(session->scpSend_channel, 0,\n                                    session->scpSend_response,\n                                    session->scpSend_response_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block send core file data for SCP file\");\n            return NULL;\n        } else if (rc != (int)session->scpSend_response_len) {\n            _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                           \"Unable to send core file data for SCP file\");\n            goto scp_send_error;\n        }\n\n        session->scpSend_state = libssh2_NB_state_sent6;\n    }\n\n    if (session->scpSend_state == libssh2_NB_state_sent6) {\n        /* Wait for ACK */\n        rc = _libssh2_channel_read(session->scpSend_channel, 0,\n                                   (char *) session->scpSend_response, 1);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block waiting for response\");\n            return NULL;\n        }\n        else if (rc < 0) {\n            _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                           \"Invalid ACK response from remote\");\n            goto scp_send_error;\n        }\n        else if (rc == 0)\n            goto scp_send_empty_channel;\n\n        else if (session->scpSend_response[0] != 0) {\n            size_t err_len;\n            char *err_msg;\n\n            err_len =\n                _libssh2_channel_packet_data_len(session->scpSend_channel, 0);\n            err_msg = LIBSSH2_ALLOC(session, err_len + 1);\n            if (!err_msg) {\n                _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                               \"failed to get memory\");\n                goto scp_send_error;\n            }\n\n            /* Read the remote error message */\n            rc = _libssh2_channel_read(session->scpSend_channel, 0,\n                                       err_msg, err_len);\n            if (rc > 0) {\n                err_msg[err_len]=0;\n                _libssh2_debug(session, LIBSSH2_TRACE_SCP,\n                               \"got %02x %s\", session->scpSend_response[0],\n                               err_msg);\n            }\n            LIBSSH2_FREE(session, err_msg);\n            _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                           \"failed to send file\");\n            goto scp_send_error;\n        }\n    }\n\n    session->scpSend_state = libssh2_NB_state_idle;\n    return session->scpSend_channel;\n\n  scp_send_empty_channel:\n    /* the code only jumps here as a result of a zero read from channel_read()\n       so we check EOF status to avoid getting stuck in a loop */\n    if(libssh2_channel_eof(session->scpSend_channel)) {\n        _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                       \"Unexpected channel close\");\n    }\n    else\n        return session->scpSend_channel;\n    /* fall-through */\n  scp_send_error:\n    tmp_err_code = session->err_code;\n    tmp_err_msg = session->err_msg;\n    while (libssh2_channel_free(session->scpSend_channel) ==\n           LIBSSH2_ERROR_EAGAIN);\n    session->err_code = tmp_err_code;\n    session->err_msg = tmp_err_msg;\n    session->scpSend_channel = NULL;\n    session->scpSend_state = libssh2_NB_state_idle;\n    return NULL;\n}\n\n/*\n * libssh2_scp_send_ex\n *\n * Send a file using SCP. Old API.\n */\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_scp_send_ex(LIBSSH2_SESSION *session, const char *path, int mode,\n                    size_t size, long mtime, long atime)\n{\n    LIBSSH2_CHANNEL *ptr;\n    BLOCK_ADJUST_ERRNO(ptr, session,\n                       scp_send(session, path, mode, size,\n                                (time_t)mtime, (time_t)atime));\n    return ptr;\n}\n\n/*\n * libssh2_scp_send64\n *\n * Send a file using SCP\n */\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_scp_send64(LIBSSH2_SESSION *session, const char *path, int mode,\n                   libssh2_int64_t size, time_t mtime, time_t atime)\n{\n    LIBSSH2_CHANNEL *ptr;\n    BLOCK_ADJUST_ERRNO(ptr, session,\n                       scp_send(session, path, mode, size, mtime, atime));\n    return ptr;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/session.c",
    "content": "/* Copyright (c) 2004-2007 Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2009-2015 by Daniel Stenberg\n * Copyright (c) 2010 Simon Josefsson <simon@josefsson.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include <errno.h>\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#include <stdlib.h>\n#include <fcntl.h>\n\n#ifdef HAVE_GETTIMEOFDAY\n#include <sys/time.h>\n#endif\n#ifdef HAVE_ALLOCA_H\n#include <alloca.h>\n#endif\n\n#include \"transport.h\"\n#include \"session.h\"\n#include \"channel.h\"\n#include \"mac.h\"\n#include \"misc.h\"\n\n/* libssh2_default_alloc\n */\nstatic\nLIBSSH2_ALLOC_FUNC(libssh2_default_alloc)\n{\n    (void) abstract;\n    return malloc(count);\n}\n\n/* libssh2_default_free\n */\nstatic\nLIBSSH2_FREE_FUNC(libssh2_default_free)\n{\n    (void) abstract;\n    free(ptr);\n}\n\n/* libssh2_default_realloc\n */\nstatic\nLIBSSH2_REALLOC_FUNC(libssh2_default_realloc)\n{\n    (void) abstract;\n    return realloc(ptr, count);\n}\n\n/*\n * banner_receive\n *\n * Wait for a hello from the remote host\n * Allocate a buffer and store the banner in session->remote.banner\n * Returns: 0 on success, LIBSSH2_ERROR_EAGAIN if read would block, negative\n * on failure\n */\nstatic int\nbanner_receive(LIBSSH2_SESSION * session)\n{\n    int ret;\n    int banner_len;\n\n    if (session->banner_TxRx_state == libssh2_NB_state_idle) {\n        banner_len = 0;\n\n        session->banner_TxRx_state = libssh2_NB_state_created;\n    } else {\n        banner_len = session->banner_TxRx_total_send;\n    }\n\n    while ((banner_len < (int) sizeof(session->banner_TxRx_banner)) &&\n           ((banner_len == 0)\n            || (session->banner_TxRx_banner[banner_len - 1] != '\\n'))) {\n        char c = '\\0';\n\n        /* no incoming block yet! */\n        session->socket_block_directions &= ~LIBSSH2_SESSION_BLOCK_INBOUND;\n\n        ret = LIBSSH2_RECV(session, &c, 1,\n                            LIBSSH2_SOCKET_RECV_FLAGS(session));\n        if (ret < 0) {\n            if(session->api_block_mode || (ret != -EAGAIN))\n                /* ignore EAGAIN when non-blocking */\n                _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                               \"Error recving %d bytes: %d\", 1, -ret);\n        }\n        else\n            _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                           \"Recved %d bytes banner\", ret);\n\n        if (ret < 0) {\n            if (ret == -EAGAIN) {\n                session->socket_block_directions =\n                    LIBSSH2_SESSION_BLOCK_INBOUND;\n                session->banner_TxRx_total_send = banner_len;\n                return LIBSSH2_ERROR_EAGAIN;\n            }\n\n            /* Some kinda error */\n            session->banner_TxRx_state = libssh2_NB_state_idle;\n            session->banner_TxRx_total_send = 0;\n            return LIBSSH2_ERROR_SOCKET_RECV;\n        }\n\n        if (ret == 0) {\n            session->socket_state = LIBSSH2_SOCKET_DISCONNECTED;\n            return LIBSSH2_ERROR_SOCKET_DISCONNECT;\n        }\n\n        if (c == '\\0') {\n            /* NULLs are not allowed in SSH banners */\n            session->banner_TxRx_state = libssh2_NB_state_idle;\n            session->banner_TxRx_total_send = 0;\n            return LIBSSH2_ERROR_BANNER_RECV;\n        }\n\n        session->banner_TxRx_banner[banner_len++] = c;\n    }\n\n    while (banner_len &&\n           ((session->banner_TxRx_banner[banner_len - 1] == '\\n') ||\n            (session->banner_TxRx_banner[banner_len - 1] == '\\r'))) {\n        banner_len--;\n    }\n\n    /* From this point on, we are done here */\n    session->banner_TxRx_state = libssh2_NB_state_idle;\n    session->banner_TxRx_total_send = 0;\n\n    if (!banner_len)\n        return LIBSSH2_ERROR_BANNER_RECV;\n\n    session->remote.banner = LIBSSH2_ALLOC(session, banner_len + 1);\n    if (!session->remote.banner) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Error allocating space for remote banner\");\n    }\n    memcpy(session->remote.banner, session->banner_TxRx_banner, banner_len);\n    session->remote.banner[banner_len] = '\\0';\n    _libssh2_debug(session, LIBSSH2_TRACE_TRANS, \"Received Banner: %s\",\n                   session->remote.banner);\n    return LIBSSH2_ERROR_NONE;\n}\n\n/*\n * banner_send\n *\n * Send the default banner, or the one set via libssh2_setopt_string\n *\n * Returns LIBSSH2_ERROR_EAGAIN if it would block - and if it does so, you\n * should call this function again as soon as it is likely that more data can\n * be sent, and this function should then be called with the same argument set\n * (same data pointer and same data_len) until zero or failure is returned.\n */\nstatic int\nbanner_send(LIBSSH2_SESSION * session)\n{\n    char *banner = (char *) LIBSSH2_SSH_DEFAULT_BANNER_WITH_CRLF;\n    int banner_len = sizeof(LIBSSH2_SSH_DEFAULT_BANNER_WITH_CRLF) - 1;\n    ssize_t ret;\n#ifdef LIBSSH2DEBUG\n    char banner_dup[256];\n#endif\n\n    if (session->banner_TxRx_state == libssh2_NB_state_idle) {\n        if (session->local.banner) {\n            /* setopt_string will have given us our \\r\\n characters */\n            banner_len = strlen((char *) session->local.banner);\n            banner = (char *) session->local.banner;\n        }\n#ifdef LIBSSH2DEBUG\n        /* Hack and slash to avoid sending CRLF in debug output */\n        if (banner_len < 256) {\n            memcpy(banner_dup, banner, banner_len - 2);\n            banner_dup[banner_len - 2] = '\\0';\n        } else {\n            memcpy(banner_dup, banner, 255);\n            banner[255] = '\\0';\n        }\n\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS, \"Sending Banner: %s\",\n                       banner_dup);\n#endif\n\n        session->banner_TxRx_state = libssh2_NB_state_created;\n    }\n\n    /* no outgoing block yet! */\n    session->socket_block_directions &= ~LIBSSH2_SESSION_BLOCK_OUTBOUND;\n\n    ret = LIBSSH2_SEND(session,\n                        banner + session->banner_TxRx_total_send,\n                        banner_len - session->banner_TxRx_total_send,\n                        LIBSSH2_SOCKET_SEND_FLAGS(session));\n    if (ret < 0)\n        _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                       \"Error sending %d bytes: %d\",\n                       banner_len - session->banner_TxRx_total_send, -ret);\n    else\n        _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                       \"Sent %d/%d bytes at %p+%d\", ret,\n                       banner_len - session->banner_TxRx_total_send,\n                       banner, session->banner_TxRx_total_send);\n\n    if (ret != (banner_len - session->banner_TxRx_total_send)) {\n        if (ret >= 0 || ret == -EAGAIN) {\n            /* the whole packet could not be sent, save the what was */\n            session->socket_block_directions =\n                LIBSSH2_SESSION_BLOCK_OUTBOUND;\n            if (ret > 0)\n                session->banner_TxRx_total_send += ret;\n            return LIBSSH2_ERROR_EAGAIN;\n        }\n        session->banner_TxRx_state = libssh2_NB_state_idle;\n        session->banner_TxRx_total_send = 0;\n        return LIBSSH2_ERROR_SOCKET_RECV;\n    }\n\n    /* Set the state back to idle */\n    session->banner_TxRx_state = libssh2_NB_state_idle;\n    session->banner_TxRx_total_send = 0;\n\n    return 0;\n}\n\n/*\n * session_nonblock() sets the given socket to either blocking or\n * non-blocking mode based on the 'nonblock' boolean argument. This function\n * is copied from the libcurl sources with permission.\n */\nstatic int\nsession_nonblock(libssh2_socket_t sockfd,   /* operate on this */\n                 int nonblock /* TRUE or FALSE */ )\n{\n#undef SETBLOCK\n#define SETBLOCK 0\n#ifdef HAVE_O_NONBLOCK\n    /* most recent unix versions */\n    int flags;\n\n    flags = fcntl(sockfd, F_GETFL, 0);\n    if (nonblock)\n        return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);\n    else\n        return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));\n#undef SETBLOCK\n#define SETBLOCK 1\n#endif\n\n#if defined(HAVE_FIONBIO) && (SETBLOCK == 0)\n    /* older unix versions and VMS*/\n    int flags;\n\n    flags = nonblock;\n    return ioctl(sockfd, FIONBIO, &flags);\n#undef SETBLOCK\n#define SETBLOCK 2\n#endif\n\n#if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0)\n    /* Windows? */\n    unsigned long flags;\n    flags = nonblock;\n\n    return ioctlsocket(sockfd, FIONBIO, &flags);\n#undef SETBLOCK\n#define SETBLOCK 3\n#endif\n\n#if defined(HAVE_IOCTLSOCKET_CASE) && (SETBLOCK == 0)\n    /* presumably for Amiga */\n    return IoctlSocket(sockfd, FIONBIO, (long) nonblock);\n#undef SETBLOCK\n#define SETBLOCK 4\n#endif\n\n#if defined(HAVE_SO_NONBLOCK) && (SETBLOCK == 0)\n    /* BeOS */\n    long b = nonblock ? 1 : 0;\n    return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));\n#undef SETBLOCK\n#define SETBLOCK 5\n#endif\n\n#ifdef HAVE_DISABLED_NONBLOCKING\n    return 0;                   /* returns success */\n#undef SETBLOCK\n#define SETBLOCK 6\n#endif\n\n#if (SETBLOCK == 0)\n#error \"no non-blocking method was found/used/set\"\n#endif\n}\n\n/*\n * get_socket_nonblocking()\n *\n * gets the given blocking or non-blocking state of the socket.\n */\nstatic int\nget_socket_nonblocking(int sockfd)\n{                               /* operate on this */\n#undef GETBLOCK\n#define GETBLOCK 0\n#ifdef HAVE_O_NONBLOCK\n    /* most recent unix versions */\n    int flags;\n\n    if ((flags = fcntl(sockfd, F_GETFL, 0)) == -1) {\n        /* Assume blocking on error */\n        return 1;\n    }\n    return (flags & O_NONBLOCK);\n#undef GETBLOCK\n#define GETBLOCK 1\n#endif\n\n#if defined(WSAEWOULDBLOCK) && (GETBLOCK == 0)\n    /* Windows? */\n    unsigned int option_value;\n    socklen_t option_len = sizeof(option_value);\n\n    if (getsockopt\n        (sockfd, SOL_SOCKET, SO_ERROR, (void *) &option_value, &option_len)) {\n        /* Assume blocking on error */\n        return 1;\n    }\n    return (int) option_value;\n#undef GETBLOCK\n#define GETBLOCK 2\n#endif\n\n#if defined(HAVE_SO_NONBLOCK) && (GETBLOCK == 0)\n    /* BeOS */\n    long b;\n    if (getsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b))) {\n        /* Assume blocking on error */\n        return 1;\n    }\n    return (int) b;\n#undef GETBLOCK\n#define GETBLOCK 5\n#endif\n\n#if defined(SO_STATE) && defined( __VMS ) && (GETBLOCK == 0)\n\n    /* VMS TCP/IP Services */\n\n    size_t sockstat = 0;\n    int    callstat = 0;\n    size_t size = sizeof( int );\n\n    callstat = getsockopt(sockfd, SOL_SOCKET, SO_STATE,\n                                  (char *)&sockstat, &size);\n    if ( callstat == -1 ) return(0);\n    if ( (sockstat&SS_NBIO) )return(1);\n    return(0);\n\n#undef GETBLOCK\n#define GETBLOCK 6\n#endif\n\n#ifdef HAVE_DISABLED_NONBLOCKING\n    return 1;                   /* returns blocking */\n#undef GETBLOCK\n#define GETBLOCK 7\n#endif\n\n#if (GETBLOCK == 0)\n#error \"no non-blocking method was found/used/get\"\n#endif\n}\n\n/* libssh2_session_banner_set\n * Set the local banner to use in the server handshake.\n */\nLIBSSH2_API int\nlibssh2_session_banner_set(LIBSSH2_SESSION * session, const char *banner)\n{\n    size_t banner_len = banner ? strlen(banner) : 0;\n\n    if (session->local.banner) {\n        LIBSSH2_FREE(session, session->local.banner);\n        session->local.banner = NULL;\n    }\n\n    if (!banner_len)\n        return 0;\n\n    session->local.banner = LIBSSH2_ALLOC(session, banner_len + 3);\n    if (!session->local.banner) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Unable to allocate memory for local banner\");\n    }\n\n    memcpy(session->local.banner, banner, banner_len);\n\n    /* first zero terminate like this so that the debug output is nice */\n    session->local.banner[banner_len] = '\\0';\n    _libssh2_debug(session, LIBSSH2_TRACE_TRANS, \"Setting local Banner: %s\",\n                   session->local.banner);\n    session->local.banner[banner_len++] = '\\r';\n    session->local.banner[banner_len++] = '\\n';\n    session->local.banner[banner_len] = '\\0';\n\n    return 0;\n}\n\n/* libssh2_banner_set\n * Set the local banner. DEPRECATED VERSION\n */\nLIBSSH2_API int\nlibssh2_banner_set(LIBSSH2_SESSION * session, const char *banner)\n{\n    return libssh2_session_banner_set(session, banner);\n}\n\n/*\n * libssh2_session_init_ex\n *\n * Allocate and initialize a libssh2 session structure. Allows for malloc\n * callbacks in case the calling program has its own memory manager It's\n * allowable (but unadvisable) to define some but not all of the malloc\n * callbacks An additional pointer value may be optionally passed to be sent\n * to the callbacks (so they know who's asking)\n */\nLIBSSH2_API LIBSSH2_SESSION *\nlibssh2_session_init_ex(LIBSSH2_ALLOC_FUNC((*my_alloc)),\n                        LIBSSH2_FREE_FUNC((*my_free)),\n                        LIBSSH2_REALLOC_FUNC((*my_realloc)), void *abstract)\n{\n    LIBSSH2_ALLOC_FUNC((*local_alloc)) = libssh2_default_alloc;\n    LIBSSH2_FREE_FUNC((*local_free)) = libssh2_default_free;\n    LIBSSH2_REALLOC_FUNC((*local_realloc)) = libssh2_default_realloc;\n    LIBSSH2_SESSION *session;\n\n    if (my_alloc) {\n        local_alloc = my_alloc;\n    }\n    if (my_free) {\n        local_free = my_free;\n    }\n    if (my_realloc) {\n        local_realloc = my_realloc;\n    }\n\n    session = local_alloc(sizeof(LIBSSH2_SESSION), &abstract);\n    if (session) {\n        memset(session, 0, sizeof(LIBSSH2_SESSION));\n        session->alloc = local_alloc;\n        session->free = local_free;\n        session->realloc = local_realloc;\n        session->send = _libssh2_send;\n        session->recv = _libssh2_recv;\n        session->abstract = abstract;\n        session->api_timeout = 0; /* timeout-free API by default */\n        session->api_block_mode = 1; /* blocking API by default */\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                       \"New session resource allocated\");\n        _libssh2_init_if_needed ();\n    }\n    return session;\n}\n\n/*\n * libssh2_session_callback_set\n *\n * Set (or reset) a callback function\n * Returns the prior address\n *\n * FIXME: this function relies on that we can typecast function pointers\n * to void pointers, which isn't allowed in ISO C!\n */\nLIBSSH2_API void *\nlibssh2_session_callback_set(LIBSSH2_SESSION * session,\n                             int cbtype, void *callback)\n{\n    void *oldcb;\n\n    switch (cbtype) {\n    case LIBSSH2_CALLBACK_IGNORE:\n        oldcb = session->ssh_msg_ignore;\n        session->ssh_msg_ignore = callback;\n        return oldcb;\n\n    case LIBSSH2_CALLBACK_DEBUG:\n        oldcb = session->ssh_msg_debug;\n        session->ssh_msg_debug = callback;\n        return oldcb;\n\n    case LIBSSH2_CALLBACK_DISCONNECT:\n        oldcb = session->ssh_msg_disconnect;\n        session->ssh_msg_disconnect = callback;\n        return oldcb;\n\n    case LIBSSH2_CALLBACK_MACERROR:\n        oldcb = session->macerror;\n        session->macerror = callback;\n        return oldcb;\n\n    case LIBSSH2_CALLBACK_X11:\n        oldcb = session->x11;\n        session->x11 = callback;\n        return oldcb;\n\n    case LIBSSH2_CALLBACK_SEND:\n        oldcb = session->send;\n        session->send = callback;\n        return oldcb;\n\n    case LIBSSH2_CALLBACK_RECV:\n        oldcb = session->recv;\n        session->recv = callback;\n        return oldcb;\n    }\n    _libssh2_debug(session, LIBSSH2_TRACE_TRANS, \"Setting Callback %d\", cbtype);\n\n    return NULL;\n}\n\n/*\n * _libssh2_wait_socket()\n *\n * Utility function that waits for action on the socket. Returns 0 when ready\n * to run again or error on timeout.\n */\nint _libssh2_wait_socket(LIBSSH2_SESSION *session, time_t start_time)\n{\n    int rc;\n    int seconds_to_next;\n    int dir;\n    int has_timeout;\n    long ms_to_next = 0;\n    long elapsed_ms;\n\n    /* since libssh2 often sets EAGAIN internally before this function is\n       called, we can decrease some amount of confusion in user programs by\n       resetting the error code in this function to reduce the risk of EAGAIN\n       being stored as error when a blocking function has returned */\n    session->err_code = LIBSSH2_ERROR_NONE;\n\n    rc = libssh2_keepalive_send (session, &seconds_to_next);\n    if (rc < 0)\n        return rc;\n\n    ms_to_next = seconds_to_next * 1000;\n\n    /* figure out what to wait for */\n    dir = libssh2_session_block_directions(session);\n\n    if(!dir) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                       \"Nothing to wait for in wait_socket\");\n        /* To avoid that we hang below just because there's nothing set to\n           wait for, we timeout on 1 second to also avoid busy-looping\n           during this condition */\n        ms_to_next = 1000;\n    }\n\n    if (session->api_timeout > 0 &&\n        (seconds_to_next == 0 ||\n         seconds_to_next > session->api_timeout)) {\n        time_t now = time (NULL);\n        elapsed_ms = (long)(1000*difftime(now, start_time));\n        if (elapsed_ms > session->api_timeout) {\n            session->err_code = LIBSSH2_ERROR_TIMEOUT;\n            return LIBSSH2_ERROR_TIMEOUT;\n        }\n        ms_to_next = (session->api_timeout - elapsed_ms);\n        has_timeout = 1;\n    }\n    else if (ms_to_next > 0) {\n        has_timeout = 1;\n    }\n    else\n        has_timeout = 0;\n\n#ifdef HAVE_POLL\n    {\n        struct pollfd sockets[1];\n\n        sockets[0].fd = session->socket_fd;\n        sockets[0].events = 0;\n        sockets[0].revents = 0;\n\n        if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n            sockets[0].events |= POLLIN;\n\n        if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n            sockets[0].events |= POLLOUT;\n\n        rc = poll(sockets, 1, has_timeout?ms_to_next: -1);\n    }\n#else\n    {\n        fd_set rfd;\n        fd_set wfd;\n        fd_set *writefd = NULL;\n        fd_set *readfd = NULL;\n        struct timeval tv;\n\n        tv.tv_sec = ms_to_next / 1000;\n        tv.tv_usec = (ms_to_next - tv.tv_sec*1000) * 1000;\n\n        if(dir & LIBSSH2_SESSION_BLOCK_INBOUND) {\n            FD_ZERO(&rfd);\n            FD_SET(session->socket_fd, &rfd);\n            readfd = &rfd;\n        }\n\n        if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND) {\n            FD_ZERO(&wfd);\n            FD_SET(session->socket_fd, &wfd);\n            writefd = &wfd;\n        }\n\n        rc = select(session->socket_fd + 1, readfd, writefd, NULL,\n                    has_timeout ? &tv : NULL);\n    }\n#endif\n    if(rc <= 0) {\n        /* timeout (or error), bail out with a timeout error */\n        session->err_code = LIBSSH2_ERROR_TIMEOUT;\n        return LIBSSH2_ERROR_TIMEOUT;\n    }\n\n    return 0; /* ready to try again */\n}\n\nstatic int\nsession_startup(LIBSSH2_SESSION *session, libssh2_socket_t sock)\n{\n    int rc;\n\n    if (session->startup_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                       \"session_startup for socket %d\", sock);\n        if (LIBSSH2_INVALID_SOCKET == sock) {\n            /* Did we forget something? */\n            return _libssh2_error(session, LIBSSH2_ERROR_BAD_SOCKET,\n                                  \"Bad socket provided\");\n        }\n        session->socket_fd = sock;\n\n        session->socket_prev_blockstate =\n            !get_socket_nonblocking(session->socket_fd);\n\n        if (session->socket_prev_blockstate) {\n            /* If in blocking state change to non-blocking */\n            rc = session_nonblock(session->socket_fd, 1);\n            if (rc) {\n                return _libssh2_error(session, rc,\n                                      \"Failed changing socket's \"\n                                      \"blocking state to non-blocking\");\n            }\n        }\n\n        session->startup_state = libssh2_NB_state_created;\n    }\n\n    if (session->startup_state == libssh2_NB_state_created) {\n        rc = banner_send(session);\n        if (rc) {\n            return _libssh2_error(session, rc,\n                                  \"Failed sending banner\");\n        }\n        session->startup_state = libssh2_NB_state_sent;\n        session->banner_TxRx_state = libssh2_NB_state_idle;\n    }\n\n    if (session->startup_state == libssh2_NB_state_sent) {\n        do {\n            rc = banner_receive(session);\n            if (rc)\n                return _libssh2_error(session, rc,\n                                      \"Failed getting banner\");\n        } while(strncmp(\"SSH-\", (char *)session->remote.banner, 4));\n\n        session->startup_state = libssh2_NB_state_sent1;\n    }\n\n    if (session->startup_state == libssh2_NB_state_sent1) {\n        rc = _libssh2_kex_exchange(session, 0, &session->startup_key_state);\n        if (rc)\n            return _libssh2_error(session, rc,\n                                  \"Unable to exchange encryption keys\");\n\n        session->startup_state = libssh2_NB_state_sent2;\n    }\n\n    if (session->startup_state == libssh2_NB_state_sent2) {\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                       \"Requesting userauth service\");\n\n        /* Request the userauth service */\n        session->startup_service[0] = SSH_MSG_SERVICE_REQUEST;\n        _libssh2_htonu32(session->startup_service + 1,\n                         sizeof(\"ssh-userauth\") - 1);\n        memcpy(session->startup_service + 5, \"ssh-userauth\",\n               sizeof(\"ssh-userauth\") - 1);\n\n        session->startup_state = libssh2_NB_state_sent3;\n    }\n\n    if (session->startup_state == libssh2_NB_state_sent3) {\n        rc = _libssh2_transport_send(session, session->startup_service,\n                                     sizeof(\"ssh-userauth\") + 5 - 1,\n                                     NULL, 0);\n        if (rc) {\n            return _libssh2_error(session, rc,\n                                  \"Unable to ask for ssh-userauth service\");\n        }\n\n        session->startup_state = libssh2_NB_state_sent4;\n    }\n\n    if (session->startup_state == libssh2_NB_state_sent4) {\n        rc = _libssh2_packet_require(session, SSH_MSG_SERVICE_ACCEPT,\n                                     &session->startup_data,\n                                     &session->startup_data_len, 0, NULL, 0,\n                                     &session->startup_req_state);\n        if (rc)\n            return rc;\n\n        session->startup_service_length =\n            _libssh2_ntohu32(session->startup_data + 1);\n\n        if ((session->startup_service_length != (sizeof(\"ssh-userauth\") - 1))\n            || strncmp(\"ssh-userauth\", (char *) session->startup_data + 5,\n                       session->startup_service_length)) {\n            LIBSSH2_FREE(session, session->startup_data);\n            session->startup_data = NULL;\n            return _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                  \"Invalid response received from server\");\n        }\n        LIBSSH2_FREE(session, session->startup_data);\n        session->startup_data = NULL;\n\n        session->startup_state = libssh2_NB_state_idle;\n\n        return 0;\n    }\n\n    /* just for safety return some error */\n    return LIBSSH2_ERROR_INVAL;\n}\n\n/*\n * libssh2_session_handshake()\n *\n * session: LIBSSH2_SESSION struct allocated and owned by the calling program\n * sock:    *must* be populated with an opened and connected socket.\n *\n * Returns: 0 on success, or non-zero on failure\n */\nLIBSSH2_API int\nlibssh2_session_handshake(LIBSSH2_SESSION *session, libssh2_socket_t sock)\n{\n    int rc;\n\n    BLOCK_ADJUST(rc, session, session_startup(session, sock) );\n\n    return rc;\n}\n\n/*\n * libssh2_session_startup()\n *\n * DEPRECATED. Use libssh2_session_handshake() instead! This function is not\n * portable enough.\n *\n * session: LIBSSH2_SESSION struct allocated and owned by the calling program\n * sock:    *must* be populated with an opened and connected socket.\n *\n * Returns: 0 on success, or non-zero on failure\n */\nLIBSSH2_API int\nlibssh2_session_startup(LIBSSH2_SESSION *session, int sock)\n{\n    return libssh2_session_handshake(session, (libssh2_socket_t) sock);\n}\n\n/*\n * libssh2_session_free\n *\n * Frees the memory allocated to the session\n * Also closes and frees any channels attached to this session\n */\nstatic int\nsession_free(LIBSSH2_SESSION *session)\n{\n    int rc;\n    LIBSSH2_PACKET *pkg;\n    LIBSSH2_CHANNEL *ch;\n    LIBSSH2_LISTENER *l;\n    int packets_left = 0;\n\n    if (session->free_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS, \"Freeing session resource\",\n                       session->remote.banner);\n\n        session->free_state = libssh2_NB_state_created;\n    }\n\n    if (session->free_state == libssh2_NB_state_created) {\n        while ((ch = _libssh2_list_first(&session->channels))) {\n\n            rc = _libssh2_channel_free(ch);\n            if (rc == LIBSSH2_ERROR_EAGAIN)\n                return rc;\n        }\n\n        session->free_state = libssh2_NB_state_sent;\n    }\n\n    if (session->free_state == libssh2_NB_state_sent) {\n        while ((l = _libssh2_list_first(&session->listeners))) {\n            rc = _libssh2_channel_forward_cancel(l);\n            if (rc == LIBSSH2_ERROR_EAGAIN)\n                return rc;\n        }\n\n        session->free_state = libssh2_NB_state_sent1;\n    }\n\n    if (session->state & LIBSSH2_STATE_NEWKEYS) {\n        /* hostkey */\n        if (session->hostkey && session->hostkey->dtor) {\n            session->hostkey->dtor(session, &session->server_hostkey_abstract);\n        }\n\n        /* Client to Server */\n        /* crypt */\n        if (session->local.crypt && session->local.crypt->dtor) {\n            session->local.crypt->dtor(session,\n                                       &session->local.crypt_abstract);\n        }\n        /* comp */\n        if (session->local.comp && session->local.comp->dtor) {\n            session->local.comp->dtor(session, 1,\n                                      &session->local.comp_abstract);\n        }\n        /* mac */\n        if (session->local.mac && session->local.mac->dtor) {\n            session->local.mac->dtor(session, &session->local.mac_abstract);\n        }\n\n        /* Server to Client */\n        /* crypt */\n        if (session->remote.crypt && session->remote.crypt->dtor) {\n            session->remote.crypt->dtor(session,\n                                        &session->remote.crypt_abstract);\n        }\n        /* comp */\n        if (session->remote.comp && session->remote.comp->dtor) {\n            session->remote.comp->dtor(session, 0,\n                                       &session->remote.comp_abstract);\n        }\n        /* mac */\n        if (session->remote.mac && session->remote.mac->dtor) {\n            session->remote.mac->dtor(session, &session->remote.mac_abstract);\n        }\n\n        /* session_id */\n        if (session->session_id) {\n            LIBSSH2_FREE(session, session->session_id);\n        }\n    }\n\n    /* Free banner(s) */\n    if (session->remote.banner) {\n        LIBSSH2_FREE(session, session->remote.banner);\n    }\n    if (session->local.banner) {\n        LIBSSH2_FREE(session, session->local.banner);\n    }\n\n    /* Free preference(s) */\n    if (session->kex_prefs) {\n        LIBSSH2_FREE(session, session->kex_prefs);\n    }\n    if (session->hostkey_prefs) {\n        LIBSSH2_FREE(session, session->hostkey_prefs);\n    }\n\n    if (session->local.kexinit) {\n        LIBSSH2_FREE(session, session->local.kexinit);\n    }\n    if (session->local.crypt_prefs) {\n        LIBSSH2_FREE(session, session->local.crypt_prefs);\n    }\n    if (session->local.mac_prefs) {\n        LIBSSH2_FREE(session, session->local.mac_prefs);\n    }\n    if (session->local.comp_prefs) {\n        LIBSSH2_FREE(session, session->local.comp_prefs);\n    }\n    if (session->local.lang_prefs) {\n        LIBSSH2_FREE(session, session->local.lang_prefs);\n    }\n\n    if (session->remote.kexinit) {\n        LIBSSH2_FREE(session, session->remote.kexinit);\n    }\n    if (session->remote.crypt_prefs) {\n        LIBSSH2_FREE(session, session->remote.crypt_prefs);\n    }\n    if (session->remote.mac_prefs) {\n        LIBSSH2_FREE(session, session->remote.mac_prefs);\n    }\n    if (session->remote.comp_prefs) {\n        LIBSSH2_FREE(session, session->remote.comp_prefs);\n    }\n    if (session->remote.lang_prefs) {\n        LIBSSH2_FREE(session, session->remote.lang_prefs);\n    }\n\n    /*\n     * Make sure all memory used in the state variables are free\n     */\n    if (session->kexinit_data) {\n        LIBSSH2_FREE(session, session->kexinit_data);\n    }\n    if (session->startup_data) {\n        LIBSSH2_FREE(session, session->startup_data);\n    }\n    if (session->userauth_list_data) {\n        LIBSSH2_FREE(session, session->userauth_list_data);\n    }\n    if (session->userauth_pswd_data) {\n        LIBSSH2_FREE(session, session->userauth_pswd_data);\n    }\n    if (session->userauth_pswd_newpw) {\n        LIBSSH2_FREE(session, session->userauth_pswd_newpw);\n    }\n    if (session->userauth_host_packet) {\n        LIBSSH2_FREE(session, session->userauth_host_packet);\n    }\n    if (session->userauth_host_method) {\n        LIBSSH2_FREE(session, session->userauth_host_method);\n    }\n    if (session->userauth_host_data) {\n        LIBSSH2_FREE(session, session->userauth_host_data);\n    }\n    if (session->userauth_pblc_data) {\n        LIBSSH2_FREE(session, session->userauth_pblc_data);\n    }\n    if (session->userauth_pblc_packet) {\n        LIBSSH2_FREE(session, session->userauth_pblc_packet);\n    }\n    if (session->userauth_pblc_method) {\n        LIBSSH2_FREE(session, session->userauth_pblc_method);\n    }\n    if (session->userauth_kybd_data) {\n        LIBSSH2_FREE(session, session->userauth_kybd_data);\n    }\n    if (session->userauth_kybd_packet) {\n        LIBSSH2_FREE(session, session->userauth_kybd_packet);\n    }\n    if (session->userauth_kybd_auth_instruction) {\n        LIBSSH2_FREE(session, session->userauth_kybd_auth_instruction);\n    }\n    if (session->open_packet) {\n        LIBSSH2_FREE(session, session->open_packet);\n    }\n    if (session->open_data) {\n        LIBSSH2_FREE(session, session->open_data);\n    }\n    if (session->direct_message) {\n        LIBSSH2_FREE(session, session->direct_message);\n    }\n    if (session->fwdLstn_packet) {\n        LIBSSH2_FREE(session, session->fwdLstn_packet);\n    }\n    if (session->pkeyInit_data) {\n        LIBSSH2_FREE(session, session->pkeyInit_data);\n    }\n    if (session->scpRecv_command) {\n        LIBSSH2_FREE(session, session->scpRecv_command);\n    }\n    if (session->scpSend_command) {\n        LIBSSH2_FREE(session, session->scpSend_command);\n    }\n    if (session->sftpInit_sftp) {\n        LIBSSH2_FREE(session, session->sftpInit_sftp);\n    }\n\n    /* Free payload buffer */\n    if (session->packet.total_num) {\n        LIBSSH2_FREE(session, session->packet.payload);\n    }\n\n    /* Cleanup all remaining packets */\n    while ((pkg = _libssh2_list_first(&session->packets))) {\n        packets_left++;\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n            \"packet left with id %d\", pkg->data[0]);\n        /* unlink the node */\n        _libssh2_list_remove(&pkg->node);\n\n        /* free */\n        LIBSSH2_FREE(session, pkg->data);\n        LIBSSH2_FREE(session, pkg);\n    }\n    _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n         \"Extra packets left %d\", packets_left);\n\n    if(session->socket_prev_blockstate) {\n        /* if the socket was previously blocking, put it back so */\n        rc = session_nonblock(session->socket_fd, 0);\n        if (rc) {\n            _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n             \"unable to reset socket's blocking state\");\n        }\n    }\n\n    if (session->server_hostkey) {\n        LIBSSH2_FREE(session, session->server_hostkey);\n    }\n\n    /* error string */\n    if (session->err_msg && ((session->err_flags & LIBSSH2_ERR_FLAG_DUP) != 0)) {\n        LIBSSH2_FREE(session, (char *)session->err_msg);\n    }\n\n    LIBSSH2_FREE(session, session);\n\n    return 0;\n}\n\n/*\n * libssh2_session_free\n *\n * Frees the memory allocated to the session\n * Also closes and frees any channels attached to this session\n */\nLIBSSH2_API int\nlibssh2_session_free(LIBSSH2_SESSION * session)\n{\n    int rc;\n\n    BLOCK_ADJUST(rc, session, session_free(session) );\n\n    return rc;\n}\n\n/*\n * libssh2_session_disconnect_ex\n */\nstatic int\nsession_disconnect(LIBSSH2_SESSION *session, int reason,\n                   const char *description,\n                   const char *lang)\n{\n    unsigned char *s;\n    unsigned long descr_len = 0, lang_len = 0;\n    int rc;\n\n    if (session->disconnect_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                       \"Disconnecting: reason=%d, desc=%s, lang=%s\", reason,\n                       description, lang);\n        if (description)\n            descr_len = strlen(description);\n\n        if (lang)\n            lang_len = strlen(lang);\n\n        if(descr_len > 256)\n            return _libssh2_error(session, LIBSSH2_ERROR_INVAL,\n                                  \"too long description\");\n\n        /* 13 = packet_type(1) + reason code(4) + descr_len(4) + lang_len(4) */\n        session->disconnect_data_len = descr_len + lang_len + 13;\n\n        s = session->disconnect_data;\n\n        *(s++) = SSH_MSG_DISCONNECT;\n        _libssh2_store_u32(&s, reason);\n        _libssh2_store_str(&s, description, descr_len);\n        /* store length only, lang is sent separately */\n        _libssh2_store_u32(&s, lang_len);\n\n        session->disconnect_state = libssh2_NB_state_created;\n    }\n\n    rc = _libssh2_transport_send(session, session->disconnect_data,\n                                 session->disconnect_data_len,\n                                 (unsigned char *)lang, lang_len);\n    if (rc == LIBSSH2_ERROR_EAGAIN)\n        return rc;\n\n    session->disconnect_state = libssh2_NB_state_idle;\n\n    return 0;\n}\n\n/*\n * libssh2_session_disconnect_ex\n */\nLIBSSH2_API int\nlibssh2_session_disconnect_ex(LIBSSH2_SESSION *session, int reason,\n                              const char *desc, const char *lang)\n{\n    int rc;\n\n    BLOCK_ADJUST(rc, session,\n                 session_disconnect(session, reason, desc, lang));\n\n    return rc;\n}\n\n/* libssh2_session_methods\n *\n * Return the currently active methods for method_type\n *\n * NOTE: Currently lang_cs and lang_sc are ALWAYS set to empty string\n * regardless of actual negotiation Strings should NOT be freed\n */\nLIBSSH2_API const char *\nlibssh2_session_methods(LIBSSH2_SESSION * session, int method_type)\n{\n    /* All methods have char *name as their first element */\n    const LIBSSH2_KEX_METHOD *method = NULL;\n\n    switch (method_type) {\n    case LIBSSH2_METHOD_KEX:\n        method = session->kex;\n        break;\n\n    case LIBSSH2_METHOD_HOSTKEY:\n        method = (LIBSSH2_KEX_METHOD *) session->hostkey;\n        break;\n\n    case LIBSSH2_METHOD_CRYPT_CS:\n        method = (LIBSSH2_KEX_METHOD *) session->local.crypt;\n        break;\n\n    case LIBSSH2_METHOD_CRYPT_SC:\n        method = (LIBSSH2_KEX_METHOD *) session->remote.crypt;\n        break;\n\n    case LIBSSH2_METHOD_MAC_CS:\n        method = (LIBSSH2_KEX_METHOD *) session->local.mac;\n        break;\n\n    case LIBSSH2_METHOD_MAC_SC:\n        method = (LIBSSH2_KEX_METHOD *) session->remote.mac;\n        break;\n\n    case LIBSSH2_METHOD_COMP_CS:\n        method = (LIBSSH2_KEX_METHOD *) session->local.comp;\n        break;\n\n    case LIBSSH2_METHOD_COMP_SC:\n        method = (LIBSSH2_KEX_METHOD *) session->remote.comp;\n        break;\n\n    case LIBSSH2_METHOD_LANG_CS:\n        return \"\";\n\n    case LIBSSH2_METHOD_LANG_SC:\n        return \"\";\n\n    default:\n        _libssh2_error(session, LIBSSH2_ERROR_INVAL,\n                       \"Invalid parameter specified for method_type\");\n        return NULL;\n    }\n\n    if (!method) {\n        _libssh2_error(session, LIBSSH2_ERROR_METHOD_NONE,\n                       \"No method negotiated\");\n        return NULL;\n    }\n\n    return method->name;\n}\n\n/* libssh2_session_abstract\n * Retrieve a pointer to the abstract property\n */\nLIBSSH2_API void **\nlibssh2_session_abstract(LIBSSH2_SESSION * session)\n{\n    return &session->abstract;\n}\n\n/* libssh2_session_last_error\n *\n * Returns error code and populates an error string into errmsg If want_buf is\n * non-zero then the string placed into errmsg must be freed by the calling\n * program. Otherwise it is assumed to be owned by libssh2\n */\nLIBSSH2_API int\nlibssh2_session_last_error(LIBSSH2_SESSION * session, char **errmsg,\n                           int *errmsg_len, int want_buf)\n{\n    size_t msglen = 0;\n\n    /* No error to report */\n    if (!session->err_code) {\n        if (errmsg) {\n            if (want_buf) {\n                *errmsg = LIBSSH2_ALLOC(session, 1);\n                if (*errmsg) {\n                    **errmsg = 0;\n                }\n            } else {\n                *errmsg = (char *) \"\";\n            }\n        }\n        if (errmsg_len) {\n            *errmsg_len = 0;\n        }\n        return 0;\n    }\n\n    if (errmsg) {\n        const char *error = session->err_msg ? session->err_msg : \"\";\n\n        msglen = strlen(error);\n\n        if (want_buf) {\n            /* Make a copy so the calling program can own it */\n            *errmsg = LIBSSH2_ALLOC(session, msglen + 1);\n            if (*errmsg) {\n                memcpy(*errmsg, error, msglen);\n                (*errmsg)[msglen] = 0;\n            }\n        }\n        else\n            *errmsg = (char *)error;\n    }\n\n    if (errmsg_len) {\n        *errmsg_len = msglen;\n    }\n\n    return session->err_code;\n}\n\n/* libssh2_session_last_errno\n *\n * Returns error code\n */\nLIBSSH2_API int\nlibssh2_session_last_errno(LIBSSH2_SESSION * session)\n{\n    return session->err_code;\n}\n\n/* libssh2_session_set_last_error\n *\n * Sets the internal error code for the session.\n *\n * This function is available specifically to be used by high level\n * language wrappers (i.e. Python or Perl) that may extend the library\n * features while still relying on its error reporting mechanism.\n */\nLIBSSH2_API int\nlibssh2_session_set_last_error(LIBSSH2_SESSION* session,\n                               int errcode,\n                               const char* errmsg)\n{\n    return _libssh2_error_flags(session, errcode, errmsg,\n                                LIBSSH2_ERR_FLAG_DUP);\n}\n\n/* Libssh2_session_flag\n *\n * Set/Get session flags\n *\n * Return error code.\n */\nLIBSSH2_API int\nlibssh2_session_flag(LIBSSH2_SESSION * session, int flag, int value)\n{\n    switch(flag) {\n    case LIBSSH2_FLAG_SIGPIPE:\n        session->flag.sigpipe = value;\n        break;\n    case LIBSSH2_FLAG_COMPRESS:\n        session->flag.compress = value;\n        break;\n    default:\n        /* unknown flag */\n        return LIBSSH2_ERROR_INVAL;\n    }\n\n    return LIBSSH2_ERROR_NONE;\n}\n\n/* _libssh2_session_set_blocking\n *\n * Set a session's blocking mode on or off, return the previous status when\n * this function is called. Note this function does not alter the state of the\n * actual socket involved.\n */\nint\n_libssh2_session_set_blocking(LIBSSH2_SESSION *session, int blocking)\n{\n    int bl = session->api_block_mode;\n    _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                   \"Setting blocking mode %s\", blocking?\"ON\":\"OFF\");\n    session->api_block_mode = blocking;\n\n    return bl;\n}\n\n/* libssh2_session_set_blocking\n *\n * Set a channel's blocking mode on or off, similar to a socket's\n * fcntl(fd, F_SETFL, O_NONBLOCK); type command\n */\nLIBSSH2_API void\nlibssh2_session_set_blocking(LIBSSH2_SESSION * session, int blocking)\n{\n    (void) _libssh2_session_set_blocking(session, blocking);\n}\n\n/* libssh2_session_get_blocking\n *\n * Returns a session's blocking mode on or off\n */\nLIBSSH2_API int\nlibssh2_session_get_blocking(LIBSSH2_SESSION * session)\n{\n    return session->api_block_mode;\n}\n\n\n/* libssh2_session_set_timeout\n *\n * Set a session's timeout (in msec) for blocking mode,\n * or 0 to disable timeouts.\n */\nLIBSSH2_API void\nlibssh2_session_set_timeout(LIBSSH2_SESSION * session, long timeout)\n{\n    session->api_timeout = timeout;\n}\n\n/* libssh2_session_get_timeout\n *\n * Returns a session's timeout, or 0 if disabled\n */\nLIBSSH2_API long\nlibssh2_session_get_timeout(LIBSSH2_SESSION * session)\n{\n    return session->api_timeout;\n}\n\n/*\n * libssh2_poll_channel_read\n *\n * Returns 0 if no data is waiting on channel,\n * non-0 if data is available\n */\nLIBSSH2_API int\nlibssh2_poll_channel_read(LIBSSH2_CHANNEL *channel, int extended)\n{\n    LIBSSH2_SESSION *session;\n    LIBSSH2_PACKET *packet;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    session = channel->session;\n    packet = _libssh2_list_first(&session->packets);\n\n    while (packet) {\n        if ( channel->local.id == _libssh2_ntohu32(packet->data + 1)) {\n            if ( extended == 1 &&\n                 (packet->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA\n                  || packet->data[0] == SSH_MSG_CHANNEL_DATA )) {\n                return 1;\n            } else if ( extended == 0 &&\n                        packet->data[0] == SSH_MSG_CHANNEL_DATA) {\n                return 1;\n            }\n            /* else - no data of any type is ready to be read */\n        }\n        packet = _libssh2_list_next(&packet->node);\n    }\n\n    return 0;\n}\n\n/*\n * poll_channel_write\n *\n * Returns 0 if writing to channel would block,\n * non-0 if data can be written without blocking\n */\nstatic inline int\npoll_channel_write(LIBSSH2_CHANNEL * channel)\n{\n    return channel->local.window_size ? 1 : 0;\n}\n\n/* poll_listener_queued\n *\n * Returns 0 if no connections are waiting to be accepted\n * non-0 if one or more connections are available\n */\nstatic inline int\npoll_listener_queued(LIBSSH2_LISTENER * listener)\n{\n    return _libssh2_list_first(&listener->queue) ? 1 : 0;\n}\n\n/*\n * libssh2_poll\n *\n * Poll sockets, channels, and listeners for activity\n */\nLIBSSH2_API int\nlibssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout)\n{\n    long timeout_remaining;\n    unsigned int i, active_fds;\n#ifdef HAVE_POLL\n    LIBSSH2_SESSION *session = NULL;\n#ifdef HAVE_ALLOCA\n    struct pollfd *sockets = alloca(sizeof(struct pollfd) * nfds);\n#else\n    struct pollfd sockets[256];\n\n    if (nfds > 256)\n        /* systems without alloca use a fixed-size array, this can be fixed if\n           we really want to, at least if the compiler is a C99 capable one */\n        return -1;\n#endif\n    /* Setup sockets for polling */\n    for(i = 0; i < nfds; i++) {\n        fds[i].revents = 0;\n        switch (fds[i].type) {\n        case LIBSSH2_POLLFD_SOCKET:\n            sockets[i].fd = fds[i].fd.socket;\n            sockets[i].events = fds[i].events;\n            sockets[i].revents = 0;\n            break;\n\n        case LIBSSH2_POLLFD_CHANNEL:\n            sockets[i].fd = fds[i].fd.channel->session->socket_fd;\n            sockets[i].events = POLLIN;\n            sockets[i].revents = 0;\n            if (!session)\n                session = fds[i].fd.channel->session;\n            break;\n\n        case LIBSSH2_POLLFD_LISTENER:\n            sockets[i].fd = fds[i].fd.listener->session->socket_fd;\n            sockets[i].events = POLLIN;\n            sockets[i].revents = 0;\n            if (!session)\n                session = fds[i].fd.listener->session;\n            break;\n\n        default:\n            if (session)\n                _libssh2_error(session, LIBSSH2_ERROR_INVALID_POLL_TYPE,\n                               \"Invalid descriptor passed to libssh2_poll()\");\n            return -1;\n        }\n    }\n#elif defined(HAVE_SELECT)\n    LIBSSH2_SESSION *session = NULL;\n    libssh2_socket_t maxfd = 0;\n    fd_set rfds, wfds;\n    struct timeval tv;\n\n    FD_ZERO(&rfds);\n    FD_ZERO(&wfds);\n    for(i = 0; i < nfds; i++) {\n        fds[i].revents = 0;\n        switch (fds[i].type) {\n        case LIBSSH2_POLLFD_SOCKET:\n            if (fds[i].events & LIBSSH2_POLLFD_POLLIN) {\n                FD_SET(fds[i].fd.socket, &rfds);\n                if (fds[i].fd.socket > maxfd)\n                    maxfd = fds[i].fd.socket;\n            }\n            if (fds[i].events & LIBSSH2_POLLFD_POLLOUT) {\n                FD_SET(fds[i].fd.socket, &wfds);\n                if (fds[i].fd.socket > maxfd)\n                    maxfd = fds[i].fd.socket;\n            }\n            break;\n\n        case LIBSSH2_POLLFD_CHANNEL:\n            FD_SET(fds[i].fd.channel->session->socket_fd, &rfds);\n            if (fds[i].fd.channel->session->socket_fd > maxfd)\n                maxfd = fds[i].fd.channel->session->socket_fd;\n            if (!session)\n                session = fds[i].fd.channel->session;\n            break;\n\n        case LIBSSH2_POLLFD_LISTENER:\n            FD_SET(fds[i].fd.listener->session->socket_fd, &rfds);\n            if (fds[i].fd.listener->session->socket_fd > maxfd)\n                maxfd = fds[i].fd.listener->session->socket_fd;\n            if (!session)\n                session = fds[i].fd.listener->session;\n            break;\n\n        default:\n            if (session)\n                _libssh2_error(session, LIBSSH2_ERROR_INVALID_POLL_TYPE,\n                               \"Invalid descriptor passed to libssh2_poll()\");\n            return -1;\n        }\n    }\n#else\n    /* No select() or poll()\n     * no sockets structure to setup\n     */\n\n    timeout = 0;\n#endif /* HAVE_POLL or HAVE_SELECT */\n\n    timeout_remaining = timeout;\n    do {\n#if defined(HAVE_POLL) || defined(HAVE_SELECT)\n        int sysret;\n#endif\n\n        active_fds = 0;\n\n        for(i = 0; i < nfds; i++) {\n            if (fds[i].events != fds[i].revents) {\n                switch (fds[i].type) {\n                case LIBSSH2_POLLFD_CHANNEL:\n                    if ((fds[i].events & LIBSSH2_POLLFD_POLLIN) &&\n                        /* Want to be ready for read */\n                        ((fds[i].revents & LIBSSH2_POLLFD_POLLIN) == 0)) {\n                        /* Not yet known to be ready for read */\n                        fds[i].revents |=\n                            libssh2_poll_channel_read(fds[i].fd.channel,\n                                                      0) ?\n                            LIBSSH2_POLLFD_POLLIN : 0;\n                    }\n                    if ((fds[i].events & LIBSSH2_POLLFD_POLLEXT) &&\n                        /* Want to be ready for extended read */\n                        ((fds[i].revents & LIBSSH2_POLLFD_POLLEXT) == 0)) {\n                        /* Not yet known to be ready for extended read */\n                        fds[i].revents |=\n                            libssh2_poll_channel_read(fds[i].fd.channel,\n                                                      1) ?\n                            LIBSSH2_POLLFD_POLLEXT : 0;\n                    }\n                    if ((fds[i].events & LIBSSH2_POLLFD_POLLOUT) &&\n                        /* Want to be ready for write */\n                        ((fds[i].revents & LIBSSH2_POLLFD_POLLOUT) == 0)) {\n                        /* Not yet known to be ready for write */\n                        fds[i].revents |=\n                            poll_channel_write(fds[i].fd. channel) ?\n                            LIBSSH2_POLLFD_POLLOUT : 0;\n                    }\n                    if (fds[i].fd.channel->remote.close\n                        || fds[i].fd.channel->local.close) {\n                        fds[i].revents |= LIBSSH2_POLLFD_CHANNEL_CLOSED;\n                    }\n                    if (fds[i].fd.channel->session->socket_state ==\n                        LIBSSH2_SOCKET_DISCONNECTED) {\n                        fds[i].revents |=\n                            LIBSSH2_POLLFD_CHANNEL_CLOSED |\n                            LIBSSH2_POLLFD_SESSION_CLOSED;\n                    }\n                    break;\n\n                case LIBSSH2_POLLFD_LISTENER:\n                    if ((fds[i].events & LIBSSH2_POLLFD_POLLIN) &&\n                        /* Want a connection */\n                        ((fds[i].revents & LIBSSH2_POLLFD_POLLIN) == 0)) {\n                        /* No connections known of yet */\n                        fds[i].revents |=\n                            poll_listener_queued(fds[i].fd. listener) ?\n                            LIBSSH2_POLLFD_POLLIN : 0;\n                    }\n                    if (fds[i].fd.listener->session->socket_state ==\n                        LIBSSH2_SOCKET_DISCONNECTED) {\n                        fds[i].revents |=\n                            LIBSSH2_POLLFD_LISTENER_CLOSED |\n                            LIBSSH2_POLLFD_SESSION_CLOSED;\n                    }\n                    break;\n                }\n            }\n            if (fds[i].revents) {\n                active_fds++;\n            }\n        }\n\n        if (active_fds) {\n            /* Don't block on the sockets if we have channels/listeners which\n               are ready */\n            timeout_remaining = 0;\n        }\n#ifdef HAVE_POLL\n\n#ifdef HAVE_LIBSSH2_GETTIMEOFDAY\n        {\n            struct timeval tv_begin, tv_end;\n\n            _libssh2_gettimeofday((struct timeval *) &tv_begin, NULL);\n            sysret = poll(sockets, nfds, timeout_remaining);\n            _libssh2_gettimeofday((struct timeval *) &tv_end, NULL);\n            timeout_remaining -= (tv_end.tv_sec - tv_begin.tv_sec) * 1000;\n            timeout_remaining -= (tv_end.tv_usec - tv_begin.tv_usec) / 1000;\n        }\n#else\n        /* If the platform doesn't support gettimeofday,\n         * then just make the call non-blocking and walk away\n         */\n        sysret = poll(sockets, nfds, timeout_remaining);\n        timeout_remaining = 0;\n#endif /* HAVE_GETTIMEOFDAY */\n\n        if (sysret > 0) {\n            for(i = 0; i < nfds; i++) {\n                switch (fds[i].type) {\n                case LIBSSH2_POLLFD_SOCKET:\n                    fds[i].revents = sockets[i].revents;\n                    sockets[i].revents = 0; /* In case we loop again, be nice */\n                    if (fds[i].revents) {\n                        active_fds++;\n                    }\n                    break;\n                case LIBSSH2_POLLFD_CHANNEL:\n                    if (sockets[i].events & POLLIN) {\n                        /* Spin session until no data available */\n                        while (_libssh2_transport_read(fds[i].fd.channel->session)\n                               > 0);\n                    }\n                    if (sockets[i].revents & POLLHUP) {\n                        fds[i].revents |=\n                            LIBSSH2_POLLFD_CHANNEL_CLOSED |\n                            LIBSSH2_POLLFD_SESSION_CLOSED;\n                    }\n                    sockets[i].revents = 0;\n                    break;\n                case LIBSSH2_POLLFD_LISTENER:\n                    if (sockets[i].events & POLLIN) {\n                        /* Spin session until no data available */\n                        while (_libssh2_transport_read(fds[i].fd.listener->session)\n                               > 0);\n                    }\n                    if (sockets[i].revents & POLLHUP) {\n                        fds[i].revents |=\n                            LIBSSH2_POLLFD_LISTENER_CLOSED |\n                            LIBSSH2_POLLFD_SESSION_CLOSED;\n                    }\n                    sockets[i].revents = 0;\n                    break;\n                }\n            }\n        }\n#elif defined(HAVE_SELECT)\n        tv.tv_sec = timeout_remaining / 1000;\n        tv.tv_usec = (timeout_remaining % 1000) * 1000;\n#ifdef HAVE_LIBSSH2_GETTIMEOFDAY\n        {\n            struct timeval tv_begin, tv_end;\n\n            _libssh2_gettimeofday((struct timeval *) &tv_begin, NULL);\n            sysret = select(maxfd+1, &rfds, &wfds, NULL, &tv);\n            _libssh2_gettimeofday((struct timeval *) &tv_end, NULL);\n\n            timeout_remaining -= (tv_end.tv_sec - tv_begin.tv_sec) * 1000;\n            timeout_remaining -= (tv_end.tv_usec - tv_begin.tv_usec) / 1000;\n        }\n#else\n        /* If the platform doesn't support gettimeofday,\n         * then just make the call non-blocking and walk away\n         */\n        sysret = select(maxfd+1, &rfds, &wfds, NULL, &tv);\n        timeout_remaining = 0;\n#endif\n\n        if (sysret > 0) {\n            for(i = 0; i < nfds; i++) {\n                switch (fds[i].type) {\n                case LIBSSH2_POLLFD_SOCKET:\n                    if (FD_ISSET(fds[i].fd.socket, &rfds)) {\n                        fds[i].revents |= LIBSSH2_POLLFD_POLLIN;\n                    }\n                    if (FD_ISSET(fds[i].fd.socket, &wfds)) {\n                        fds[i].revents |= LIBSSH2_POLLFD_POLLOUT;\n                    }\n                    if (fds[i].revents) {\n                        active_fds++;\n                    }\n                    break;\n\n                case LIBSSH2_POLLFD_CHANNEL:\n                    if (FD_ISSET(fds[i].fd.channel->session->socket_fd, &rfds)) {\n                        /* Spin session until no data available */\n                        while (_libssh2_transport_read(fds[i].fd.channel->session)\n                               > 0);\n                    }\n                    break;\n\n                case LIBSSH2_POLLFD_LISTENER:\n                    if (FD_ISSET\n                        (fds[i].fd.listener->session->socket_fd, &rfds)) {\n                        /* Spin session until no data available */\n                        while (_libssh2_transport_read(fds[i].fd.listener->session)\n                               > 0);\n                    }\n                    break;\n                }\n            }\n        }\n#endif /* else no select() or poll() -- timeout (and by extension\n        * timeout_remaining) will be equal to 0 */\n    } while ((timeout_remaining > 0) && !active_fds);\n\n    return active_fds;\n}\n\n/*\n * libssh2_session_block_directions\n *\n * Get blocked direction when a function returns LIBSSH2_ERROR_EAGAIN\n * Returns LIBSSH2_SOCKET_BLOCK_INBOUND if recv() blocked\n * or LIBSSH2_SOCKET_BLOCK_OUTBOUND if send() blocked\n */\nLIBSSH2_API int\nlibssh2_session_block_directions(LIBSSH2_SESSION *session)\n{\n    return session->socket_block_directions;\n}\n\n/* libssh2_session_banner_get\n * Get the remote banner (server ID string)\n */\n\nLIBSSH2_API const char *\nlibssh2_session_banner_get(LIBSSH2_SESSION *session)\n{\n    /* to avoid a coredump when session is NULL */\n    if (NULL == session)\n        return NULL;\n\n    if (NULL==session->remote.banner)\n        return NULL;\n\n    return (const char *) session->remote.banner;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/session.h",
    "content": "#ifndef LIBSSH2_SESSION_H\n#define LIBSSH2_SESSION_H\n/* Copyright (c) 2004-2007 Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2009-2010 by Daniel Stenberg\n * Copyright (c) 2010 Simon Josefsson <simon@josefsson.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* Conveniance-macros to allow code like this;\n\n   int rc = BLOCK_ADJUST(rc, session, session_startup(session, sock) );\n\n   int rc = BLOCK_ADJUST_ERRNO(ptr, session, session_startup(session, sock) );\n\n   The point of course being to make sure that while in non-blocking mode\n   these always return no matter what the return code is, but in blocking mode\n   it blocks if EAGAIN is the reason for the return from the underlying\n   function.\n\n*/\n#define BLOCK_ADJUST(rc,sess,x) \\\n    do { \\\n       time_t entry_time = time (NULL); \\\n       do { \\\n          rc = x; \\\n          /* the order of the check below is important to properly deal with \\\n             the case when the 'sess' is freed */ \\\n          if((rc != LIBSSH2_ERROR_EAGAIN) || !sess->api_block_mode) \\\n              break; \\\n          rc = _libssh2_wait_socket(sess, entry_time);  \\\n       } while(!rc);   \\\n    } while(0)\n\n/*\n * For functions that returns a pointer, we need to check if the API is\n * non-blocking and return immediately. If the pointer is non-NULL we return\n * immediately. If the API is blocking and we get a NULL we check the errno\n * and *only* if that is EAGAIN we loop and wait for socket action.\n */\n#define BLOCK_ADJUST_ERRNO(ptr,sess,x) \\\n    do { \\\n       time_t entry_time = time (NULL); \\\n       int rc; \\\n       do { \\\n           ptr = x; \\\n           if(!sess->api_block_mode || \\\n              (ptr != NULL) || \\\n              (libssh2_session_last_errno(sess) != LIBSSH2_ERROR_EAGAIN) ) \\\n               break; \\\n           rc = _libssh2_wait_socket(sess, entry_time); \\\n        } while(!rc); \\\n    } while(0)\n\n\nint _libssh2_wait_socket(LIBSSH2_SESSION *session, time_t entry_time);\n\n/* this is the lib-internal set blocking function */\nint _libssh2_session_set_blocking(LIBSSH2_SESSION * session, int blocking);\n\n#endif /* LIBSSH2_SESSION_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/sftp.c",
    "content": "/* Copyright (c) 2004-2008, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2007 Eli Fant <elifantu@mail.ru>\n * Copyright (c) 2009-2014 by Daniel Stenberg\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include <assert.h>\n\n#include \"libssh2_priv.h\"\n#include \"libssh2_sftp.h\"\n#include \"channel.h\"\n#include \"session.h\"\n#include \"sftp.h\"\n\n/* Note: Version 6 was documented at the time of writing\n * However it was marked as \"DO NOT IMPLEMENT\" due to pending changes\n *\n * This release of libssh2 implements Version 5 with automatic downgrade\n * based on server's declaration\n */\n\n/* SFTP packet types */\n#define SSH_FXP_INIT                            1\n#define SSH_FXP_VERSION                         2\n#define SSH_FXP_OPEN                            3\n#define SSH_FXP_CLOSE                           4\n#define SSH_FXP_READ                            5\n#define SSH_FXP_WRITE                           6\n#define SSH_FXP_LSTAT                           7\n#define SSH_FXP_FSTAT                           8\n#define SSH_FXP_SETSTAT                         9\n#define SSH_FXP_FSETSTAT                        10\n#define SSH_FXP_OPENDIR                         11\n#define SSH_FXP_READDIR                         12\n#define SSH_FXP_REMOVE                          13\n#define SSH_FXP_MKDIR                           14\n#define SSH_FXP_RMDIR                           15\n#define SSH_FXP_REALPATH                        16\n#define SSH_FXP_STAT                            17\n#define SSH_FXP_RENAME                          18\n#define SSH_FXP_READLINK                        19\n#define SSH_FXP_SYMLINK                         20\n#define SSH_FXP_STATUS                          101\n#define SSH_FXP_HANDLE                          102\n#define SSH_FXP_DATA                            103\n#define SSH_FXP_NAME                            104\n#define SSH_FXP_ATTRS                           105\n#define SSH_FXP_EXTENDED                        200\n#define SSH_FXP_EXTENDED_REPLY                  201\n\n/* S_IFREG */\n#define LIBSSH2_SFTP_ATTR_PFILETYPE_FILE        0100000\n/* S_IFDIR */\n#define LIBSSH2_SFTP_ATTR_PFILETYPE_DIR         0040000\n\n#define SSH_FXE_STATVFS_ST_RDONLY               0x00000001\n#define SSH_FXE_STATVFS_ST_NOSUID               0x00000002\n\n/* This is the maximum packet length to accept, as larger than this indicate\n   some kind of server problem. */\n#define LIBSSH2_SFTP_PACKET_MAXLEN  80000\n\nstatic int sftp_packet_ask(LIBSSH2_SFTP *sftp, unsigned char packet_type,\n                           uint32_t request_id, unsigned char **data,\n                           size_t *data_len);\nstatic void sftp_packet_flush(LIBSSH2_SFTP *sftp);\n\n/* sftp_attrsize\n * Size that attr with this flagset will occupy when turned into a bin struct\n */\nstatic int sftp_attrsize(unsigned long flags)\n{\n    return (4 +                                 /* flags(4) */\n            ((flags & LIBSSH2_SFTP_ATTR_SIZE) ? 8 : 0) +\n            ((flags & LIBSSH2_SFTP_ATTR_UIDGID) ? 8 : 0) +\n            ((flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) ? 4 : 0) +\n            ((flags & LIBSSH2_SFTP_ATTR_ACMODTIME) ? 8 : 0));\n    /* atime + mtime as u32 */\n}\n\n/* _libssh2_store_u64\n */\nstatic void _libssh2_store_u64(unsigned char **ptr, libssh2_uint64_t value)\n{\n    uint32_t msl = (uint32_t)(value >> 32);\n    unsigned char *buf = *ptr;\n\n    buf[0] = (unsigned char)((msl >> 24) & 0xFF);\n    buf[1] = (unsigned char)((msl >> 16) & 0xFF);\n    buf[2] = (unsigned char)((msl >> 8)  & 0xFF);\n    buf[3] = (unsigned char)( msl        & 0xFF);\n\n    buf[4] = (unsigned char)((value >> 24) & 0xFF);\n    buf[5] = (unsigned char)((value >> 16) & 0xFF);\n    buf[6] = (unsigned char)((value >> 8)  & 0xFF);\n    buf[7] = (unsigned char)( value        & 0xFF);\n\n    *ptr += 8;\n}\n\n/*\n * Search list of zombied FXP_READ request IDs.\n *\n * Returns NULL if ID not in list.\n */\nstatic struct sftp_zombie_requests *\nfind_zombie_request(LIBSSH2_SFTP *sftp, uint32_t request_id)\n{\n    struct sftp_zombie_requests *zombie =\n        _libssh2_list_first(&sftp->zombie_requests);\n\n    while(zombie) {\n        if(zombie->request_id == request_id)\n            break;\n        else\n            zombie = _libssh2_list_next(&zombie->node);\n    }\n\n    return zombie;\n}\n\nstatic void\nremove_zombie_request(LIBSSH2_SFTP *sftp, uint32_t request_id)\n{\n    LIBSSH2_SESSION *session = sftp->channel->session;\n\n    struct sftp_zombie_requests *zombie = find_zombie_request(sftp,\n                                                              request_id);\n    if(zombie) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Removing request ID %ld from the list of zombie requests\",\n                       request_id);\n\n        _libssh2_list_remove(&zombie->node);\n        LIBSSH2_FREE(session, zombie);\n    }\n}\n\nstatic int\nadd_zombie_request(LIBSSH2_SFTP *sftp, uint32_t request_id)\n{\n    LIBSSH2_SESSION *session = sftp->channel->session;\n\n    struct sftp_zombie_requests *zombie;\n\n    _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                   \"Marking request ID %ld as a zombie request\", request_id);\n\n    zombie = LIBSSH2_ALLOC(sftp->channel->session,\n                           sizeof(struct sftp_zombie_requests));\n    if (!zombie)\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"malloc fail for zombie request  ID\");\n    else {\n        zombie->request_id = request_id;\n        _libssh2_list_add(&sftp->zombie_requests, &zombie->node);\n        return LIBSSH2_ERROR_NONE;\n    }\n}\n\n/*\n * sftp_packet_add\n *\n * Add a packet to the SFTP packet brigade\n */\nstatic int\nsftp_packet_add(LIBSSH2_SFTP *sftp, unsigned char *data,\n                size_t data_len)\n{\n    LIBSSH2_SESSION *session = sftp->channel->session;\n    LIBSSH2_SFTP_PACKET *packet;\n    uint32_t request_id;\n\n    _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                   \"Received packet type %d (len %d)\",\n                   (int) data[0], data_len);\n\n    /*\n     * Experience shows that if we mess up EAGAIN handling somewhere or\n     * otherwise get out of sync with the channel, this is where we first get\n     * a wrong byte and if so we need to bail out at once to aid tracking the\n     * problem better.\n     */\n\n    switch(data[0]) {\n    case SSH_FXP_INIT:\n    case SSH_FXP_VERSION:\n    case SSH_FXP_OPEN:\n    case SSH_FXP_CLOSE:\n    case SSH_FXP_READ:\n    case SSH_FXP_WRITE:\n    case SSH_FXP_LSTAT:\n    case SSH_FXP_FSTAT:\n    case SSH_FXP_SETSTAT:\n    case SSH_FXP_FSETSTAT:\n    case SSH_FXP_OPENDIR:\n    case SSH_FXP_READDIR:\n    case SSH_FXP_REMOVE:\n    case SSH_FXP_MKDIR:\n    case SSH_FXP_RMDIR:\n    case SSH_FXP_REALPATH:\n    case SSH_FXP_STAT:\n    case SSH_FXP_RENAME:\n    case SSH_FXP_READLINK:\n    case SSH_FXP_SYMLINK:\n    case SSH_FXP_STATUS:\n    case SSH_FXP_HANDLE:\n    case SSH_FXP_DATA:\n    case SSH_FXP_NAME:\n    case SSH_FXP_ATTRS:\n    case SSH_FXP_EXTENDED:\n    case SSH_FXP_EXTENDED_REPLY:\n        break;\n    default:\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"Out of sync with the world\");\n    }\n\n    request_id = _libssh2_ntohu32(&data[1]);\n\n    _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Received packet id %d\",\n                   request_id);\n\n    /* Don't add the packet if it answers a request we've given up on. */\n    if((data[0] == SSH_FXP_STATUS || data[0] == SSH_FXP_DATA)\n       && find_zombie_request(sftp, request_id)) {\n\n        /* If we get here, the file ended before the response arrived. We\n           are no longer interested in the request so we discard it */\n\n        LIBSSH2_FREE(session, data);\n\n        remove_zombie_request(sftp, request_id);\n        return LIBSSH2_ERROR_NONE;\n    }\n\n    packet = LIBSSH2_ALLOC(session, sizeof(LIBSSH2_SFTP_PACKET));\n    if (!packet) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Unable to allocate datablock for SFTP packet\");\n    }\n\n    packet->data = data;\n    packet->data_len = data_len;\n    packet->request_id = request_id;\n\n    _libssh2_list_add(&sftp->packets, &packet->node);\n\n    return LIBSSH2_ERROR_NONE;\n}\n\n/*\n * sftp_packet_read\n *\n * Frame an SFTP packet off the channel\n */\nstatic int\nsftp_packet_read(LIBSSH2_SFTP *sftp)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char *packet = NULL;\n    ssize_t rc;\n    unsigned long recv_window;\n    int packet_type;\n\n    _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"recv packet\");\n\n    switch(sftp->packet_state) {\n    case libssh2_NB_state_sent: /* EAGAIN from window adjusting */\n        sftp->packet_state = libssh2_NB_state_idle;\n\n        packet = sftp->partial_packet;\n        goto window_adjust;\n\n    case libssh2_NB_state_sent1: /* EAGAIN from channel read */\n        sftp->packet_state = libssh2_NB_state_idle;\n\n        packet = sftp->partial_packet;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"partial read cont, len: %lu\", sftp->partial_len);\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"partial read cont, already recvd: %lu\",\n                       sftp->partial_received);\n        /* fall-through */\n    default:\n        if(!packet) {\n            /* only do this if there's not already a packet buffer allocated\n               to use */\n\n            /* each packet starts with a 32 bit length field */\n            rc = _libssh2_channel_read(channel, 0,\n                                       (char *)&sftp->partial_size[\n                                           sftp->partial_size_len],\n                                       4 - sftp->partial_size_len);\n            if (rc == LIBSSH2_ERROR_EAGAIN)\n                return rc;\n            else if (rc < 0)\n                return _libssh2_error(session, rc, \"channel read\");\n\n            sftp->partial_size_len += rc;\n\n            if(4 != sftp->partial_size_len)\n                /* we got a short read for the length part */\n                return LIBSSH2_ERROR_EAGAIN;\n\n            sftp->partial_len = _libssh2_ntohu32(sftp->partial_size);\n            /* make sure we don't proceed if the packet size is unreasonably\n               large */\n            if (sftp->partial_len > LIBSSH2_SFTP_PACKET_MAXLEN)\n                return _libssh2_error(session,\n                                      LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED,\n                                      \"SFTP packet too large\");\n\n            _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                           \"Data begin - Packet Length: %lu\",\n                           sftp->partial_len);\n            packet = LIBSSH2_ALLOC(session, sftp->partial_len);\n            if (!packet)\n                return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                      \"Unable to allocate SFTP packet\");\n            sftp->partial_size_len = 0;\n            sftp->partial_received = 0; /* how much of the packet already\n                                           received */\n            sftp->partial_packet = packet;\n\n          window_adjust:\n            recv_window = libssh2_channel_window_read_ex(channel, NULL, NULL);\n\n            if(sftp->partial_len > recv_window) {\n                /* ask for twice the data amount we need at once */\n                rc = _libssh2_channel_receive_window_adjust(channel,\n                                                            sftp->partial_len*2,\n                                                            1, NULL);\n                /* store the state so that we continue with the correct\n                   operation at next invoke */\n                sftp->packet_state = (rc == LIBSSH2_ERROR_EAGAIN)?\n                    libssh2_NB_state_sent:\n                    libssh2_NB_state_idle;\n\n                if(rc == LIBSSH2_ERROR_EAGAIN)\n                    return rc;\n            }\n        }\n\n        /* Read as much of the packet as we can */\n        while (sftp->partial_len > sftp->partial_received) {\n            rc = _libssh2_channel_read(channel, 0,\n                                       (char *)&packet[sftp->partial_received],\n                                       sftp->partial_len -\n                                       sftp->partial_received);\n\n            if (rc == LIBSSH2_ERROR_EAGAIN) {\n                /*\n                 * We received EAGAIN, save what we have and return EAGAIN to\n                 * the caller. Set 'partial_packet' so that this function\n                 * knows how to continue on the next invoke.\n                 */\n                sftp->packet_state = libssh2_NB_state_sent1;\n                return rc;\n            }\n            else if (rc < 0) {\n                LIBSSH2_FREE(session, packet);\n                sftp->partial_packet = NULL;\n                return _libssh2_error(session, rc,\n                                      \"Error waiting for SFTP packet\");\n            }\n            sftp->partial_received += rc;\n        }\n\n        sftp->partial_packet = NULL;\n\n        /* sftp_packet_add takes ownership of the packet and might free it\n           so we take a copy of the packet type before we call it. */\n        packet_type = packet[0];\n        rc = sftp_packet_add(sftp, packet, sftp->partial_len);\n        if (rc) {\n            LIBSSH2_FREE(session, packet);\n            return rc;\n        }\n        else {\n            return packet_type;\n        }\n    }\n    /* WON'T REACH */\n}\n/*\n * sftp_packetlist_flush\n *\n * Remove all pending packets in the packet_list and the corresponding one(s)\n * in the SFTP packet brigade.\n */\nstatic void sftp_packetlist_flush(LIBSSH2_SFTP_HANDLE *handle)\n{\n    struct sftp_pipeline_chunk *chunk;\n    LIBSSH2_SFTP *sftp = handle->sftp;\n    LIBSSH2_SESSION *session = sftp->channel->session;\n\n    /* remove pending packets, if any */\n    chunk = _libssh2_list_first(&handle->packet_list);\n    while(chunk) {\n        unsigned char *data;\n        size_t data_len;\n        int rc;\n        struct sftp_pipeline_chunk *next = _libssh2_list_next(&chunk->node);\n\n        rc = sftp_packet_ask(sftp, SSH_FXP_STATUS,\n                             chunk->request_id, &data, &data_len);\n        if(rc)\n            rc = sftp_packet_ask(sftp, SSH_FXP_DATA,\n                                 chunk->request_id, &data, &data_len);\n\n        if(!rc)\n            /* we found a packet, free it */\n            LIBSSH2_FREE(session, data);\n        else if(chunk->sent)\n            /* there was no incoming packet for this request, mark this\n               request as a zombie if it ever sent the request */\n            add_zombie_request(sftp, chunk->request_id);\n\n        _libssh2_list_remove(&chunk->node);\n        LIBSSH2_FREE(session, chunk);\n        chunk = next;\n    }\n}\n\n\n/*\n * sftp_packet_ask()\n *\n * Checks if there's a matching SFTP packet available.\n */\nstatic int\nsftp_packet_ask(LIBSSH2_SFTP *sftp, unsigned char packet_type,\n                uint32_t request_id, unsigned char **data,\n                size_t *data_len)\n{\n    LIBSSH2_SESSION *session = sftp->channel->session;\n    LIBSSH2_SFTP_PACKET *packet = _libssh2_list_first(&sftp->packets);\n\n    if(!packet)\n        return -1;\n\n    /* Special consideration when getting VERSION packet */\n\n    while (packet) {\n        if((packet->data[0] == packet_type) &&\n           ((packet_type == SSH_FXP_VERSION) ||\n            (packet->request_id == request_id))) {\n\n            /* Match! Fetch the data */\n            *data = packet->data;\n            *data_len = packet->data_len;\n\n            /* unlink and free this struct */\n            _libssh2_list_remove(&packet->node);\n            LIBSSH2_FREE(session, packet);\n\n            return 0;\n        }\n        /* check next struct in the list */\n        packet = _libssh2_list_next(&packet->node);\n    }\n    return -1;\n}\n\n/* sftp_packet_require\n * A la libssh2_packet_require\n */\nstatic int\nsftp_packet_require(LIBSSH2_SFTP *sftp, unsigned char packet_type,\n                    uint32_t request_id, unsigned char **data,\n                    size_t *data_len)\n{\n    LIBSSH2_SESSION *session = sftp->channel->session;\n    int rc;\n\n    _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Requiring packet %d id %ld\",\n                   (int) packet_type, request_id);\n\n    if (sftp_packet_ask(sftp, packet_type, request_id, data, data_len) == 0) {\n        /* The right packet was available in the packet brigade */\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Got %d\",\n                       (int) packet_type);\n        return LIBSSH2_ERROR_NONE;\n    }\n\n    while (session->socket_state == LIBSSH2_SOCKET_CONNECTED) {\n        rc = sftp_packet_read(sftp);\n        if (rc < 0)\n            return rc;\n\n        /* data was read, check the queue again */\n        if (!sftp_packet_ask(sftp, packet_type, request_id, data, data_len)) {\n            /* The right packet was available in the packet brigade */\n            _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Got %d\",\n                           (int) packet_type);\n            return LIBSSH2_ERROR_NONE;\n        }\n    }\n\n    /* Only reached if the socket died */\n    return LIBSSH2_ERROR_SOCKET_DISCONNECT;\n}\n\n/* sftp_packet_requirev\n * Require one of N possible responses\n */\nstatic int\nsftp_packet_requirev(LIBSSH2_SFTP *sftp, int num_valid_responses,\n                     const unsigned char *valid_responses,\n                     uint32_t request_id, unsigned char **data,\n                     size_t *data_len)\n{\n    int i;\n    int rc;\n\n    /* If no timeout is active, start a new one */\n    if (sftp->requirev_start == 0)\n        sftp->requirev_start = time(NULL);\n\n    while (sftp->channel->session->socket_state == LIBSSH2_SOCKET_CONNECTED) {\n        for(i = 0; i < num_valid_responses; i++) {\n            if (sftp_packet_ask(sftp, valid_responses[i], request_id,\n                                data, data_len) == 0) {\n                /*\n                 * Set to zero before all returns to say\n                 * the timeout is not active\n                 */\n                sftp->requirev_start = 0;\n                return LIBSSH2_ERROR_NONE;\n            }\n        }\n\n        rc = sftp_packet_read(sftp);\n        if ((rc < 0) && (rc != LIBSSH2_ERROR_EAGAIN)) {\n            sftp->requirev_start = 0;\n            return rc;\n        } else if (rc <= 0) {\n            /* prevent busy-looping */\n            long left =\n                LIBSSH2_READ_TIMEOUT - (long)(time(NULL) - sftp->requirev_start);\n\n            if (left <= 0) {\n                sftp->requirev_start = 0;\n                return LIBSSH2_ERROR_TIMEOUT;\n            }\n            else if (rc == LIBSSH2_ERROR_EAGAIN) {\n                return rc;\n            }\n        }\n    }\n\n    sftp->requirev_start = 0;\n\n    /* Only reached if the socket died */\n    return LIBSSH2_ERROR_SOCKET_DISCONNECT;\n}\n\n/* sftp_attr2bin\n * Populate attributes into an SFTP block\n */\nstatic ssize_t\nsftp_attr2bin(unsigned char *p, const LIBSSH2_SFTP_ATTRIBUTES * attrs)\n{\n    unsigned char *s = p;\n    uint32_t flag_mask =\n        LIBSSH2_SFTP_ATTR_SIZE | LIBSSH2_SFTP_ATTR_UIDGID |\n        LIBSSH2_SFTP_ATTR_PERMISSIONS | LIBSSH2_SFTP_ATTR_ACMODTIME;\n\n    /* TODO: When we add SFTP4+ functionality flag_mask can get additional\n       bits */\n\n    if (!attrs) {\n        _libssh2_htonu32(s, 0);\n        return 4;\n    }\n\n    _libssh2_store_u32(&s, attrs->flags & flag_mask);\n\n    if (attrs->flags & LIBSSH2_SFTP_ATTR_SIZE) {\n        _libssh2_store_u64(&s, attrs->filesize);\n    }\n\n    if (attrs->flags & LIBSSH2_SFTP_ATTR_UIDGID) {\n        _libssh2_store_u32(&s, attrs->uid);\n        _libssh2_store_u32(&s, attrs->gid);\n    }\n\n    if (attrs->flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) {\n        _libssh2_store_u32(&s, attrs->permissions);\n    }\n\n    if (attrs->flags & LIBSSH2_SFTP_ATTR_ACMODTIME) {\n        _libssh2_store_u32(&s, attrs->atime);\n        _libssh2_store_u32(&s, attrs->mtime);\n    }\n\n    return (s - p);\n}\n\n/* sftp_bin2attr\n */\nstatic int\nsftp_bin2attr(LIBSSH2_SFTP_ATTRIBUTES * attrs, const unsigned char *p)\n{\n    const unsigned char *s = p;\n\n    memset(attrs, 0, sizeof(LIBSSH2_SFTP_ATTRIBUTES));\n    attrs->flags = _libssh2_ntohu32(s);\n    s += 4;\n\n    if (attrs->flags & LIBSSH2_SFTP_ATTR_SIZE) {\n        attrs->filesize = _libssh2_ntohu64(s);\n        s += 8;\n    }\n\n    if (attrs->flags & LIBSSH2_SFTP_ATTR_UIDGID) {\n        attrs->uid = _libssh2_ntohu32(s);\n        s += 4;\n        attrs->gid = _libssh2_ntohu32(s);\n        s += 4;\n    }\n\n    if (attrs->flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) {\n        attrs->permissions = _libssh2_ntohu32(s);\n        s += 4;\n    }\n\n    if (attrs->flags & LIBSSH2_SFTP_ATTR_ACMODTIME) {\n        attrs->atime = _libssh2_ntohu32(s);\n        s += 4;\n        attrs->mtime = _libssh2_ntohu32(s);\n        s += 4;\n    }\n\n    return (s - p);\n}\n\n/* ************\n * SFTP API *\n ************ */\n\nLIBSSH2_CHANNEL_CLOSE_FUNC(libssh2_sftp_dtor);\n\n/* libssh2_sftp_dtor\n * Shutdown an SFTP stream when the channel closes\n */\nLIBSSH2_CHANNEL_CLOSE_FUNC(libssh2_sftp_dtor)\n{\n    LIBSSH2_SFTP *sftp = (LIBSSH2_SFTP *) (*channel_abstract);\n\n    (void) session_abstract;\n    (void) channel;\n\n    /* Free the partial packet storage for sftp_packet_read */\n    if (sftp->partial_packet) {\n        LIBSSH2_FREE(session, sftp->partial_packet);\n    }\n\n    /* Free the packet storage for _libssh2_sftp_packet_readdir */\n    if (sftp->readdir_packet) {\n        LIBSSH2_FREE(session, sftp->readdir_packet);\n    }\n\n    LIBSSH2_FREE(session, sftp);\n}\n\n/*\n * sftp_init\n *\n * Startup an SFTP session\n */\nstatic LIBSSH2_SFTP *sftp_init(LIBSSH2_SESSION *session)\n{\n    unsigned char *data, *s;\n    size_t data_len;\n    ssize_t rc;\n    LIBSSH2_SFTP *sftp_handle;\n\n    if (session->sftpInit_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Initializing SFTP subsystem\");\n\n        /*\n         * The 'sftpInit_sftp' and 'sftpInit_channel' struct fields within the\n         * session struct are only to be used during the setup phase. As soon\n         * as the SFTP session is created they are cleared and can thus be\n         * re-used again to allow any amount of SFTP handles per sessions.\n         *\n         * Note that you MUST NOT try to call libssh2_sftp_init() again to get\n         * another handle until the previous call has finished and either\n         * successfully made a handle or failed and returned error (not\n         * including *EAGAIN).\n         */\n\n        assert(session->sftpInit_sftp == NULL);\n        session->sftpInit_sftp = NULL;\n        session->sftpInit_state = libssh2_NB_state_created;\n    }\n\n    sftp_handle = session->sftpInit_sftp;\n\n    if (session->sftpInit_state == libssh2_NB_state_created) {\n        session->sftpInit_channel =\n            _libssh2_channel_open(session, \"session\", sizeof(\"session\") - 1,\n                                  LIBSSH2_CHANNEL_WINDOW_DEFAULT,\n                                  LIBSSH2_CHANNEL_PACKET_DEFAULT, NULL, 0);\n        if (!session->sftpInit_channel) {\n            if (libssh2_session_last_errno(session) == LIBSSH2_ERROR_EAGAIN) {\n                _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                               \"Would block starting up channel\");\n            }\n            else {\n                _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                               \"Unable to startup channel\");\n                session->sftpInit_state = libssh2_NB_state_idle;\n            }\n            return NULL;\n        }\n\n        session->sftpInit_state = libssh2_NB_state_sent;\n    }\n\n    if (session->sftpInit_state == libssh2_NB_state_sent) {\n        int ret = _libssh2_channel_process_startup(session->sftpInit_channel,\n                                                   \"subsystem\",\n                                                   sizeof(\"subsystem\") - 1, \"sftp\",\n                                                   strlen(\"sftp\"));\n        if (ret == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block to request SFTP subsystem\");\n            return NULL;\n        } else if (ret) {\n            _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                           \"Unable to request SFTP subsystem\");\n            goto sftp_init_error;\n        }\n\n        session->sftpInit_state = libssh2_NB_state_sent1;\n    }\n\n    if (session->sftpInit_state == libssh2_NB_state_sent1) {\n        rc = _libssh2_channel_extended_data(session->sftpInit_channel,\n                                            LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block requesting handle extended data\");\n            return NULL;\n        }\n\n        sftp_handle =\n            session->sftpInit_sftp =\n            LIBSSH2_CALLOC(session, sizeof(LIBSSH2_SFTP));\n        if (!sftp_handle) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate a new SFTP structure\");\n            goto sftp_init_error;\n        }\n        sftp_handle->channel = session->sftpInit_channel;\n        sftp_handle->request_id = 0;\n\n        _libssh2_htonu32(session->sftpInit_buffer, 5);\n        session->sftpInit_buffer[4] = SSH_FXP_INIT;\n        _libssh2_htonu32(session->sftpInit_buffer + 5, LIBSSH2_SFTP_VERSION);\n        session->sftpInit_sent = 0; /* nothing's sent yet */\n\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Sending FXP_INIT packet advertising version %d support\",\n                       (int) LIBSSH2_SFTP_VERSION);\n\n        session->sftpInit_state = libssh2_NB_state_sent2;\n    }\n\n    if (session->sftpInit_state == libssh2_NB_state_sent2) {\n        /* sent off what's left of the init buffer to send */\n        rc = _libssh2_channel_write(session->sftpInit_channel, 0,\n                                    session->sftpInit_buffer +\n                                    session->sftpInit_sent,\n                                    9 - session->sftpInit_sent);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block sending SSH_FXP_INIT\");\n            return NULL;\n        }\n        else if(rc < 0) {\n            _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                           \"Unable to send SSH_FXP_INIT\");\n            goto sftp_init_error;\n        }\n        else {\n            /* add up the number of bytes sent */\n            session->sftpInit_sent += rc;\n\n            if(session->sftpInit_sent == 9)\n                /* move on */\n                session->sftpInit_state = libssh2_NB_state_sent3;\n\n            /* if less than 9, we remain in this state to send more later on */\n        }\n    }\n\n    rc = sftp_packet_require(sftp_handle, SSH_FXP_VERSION,\n                             0, &data, &data_len);\n    if (rc == LIBSSH2_ERROR_EAGAIN)\n        return NULL;\n    else if (rc) {\n        _libssh2_error(session, rc,\n                       \"Timeout waiting for response from SFTP subsystem\");\n        goto sftp_init_error;\n    }\n    if (data_len < 5) {\n        _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                       \"Invalid SSH_FXP_VERSION response\");\n        LIBSSH2_FREE(session, data);\n        goto sftp_init_error;\n    }\n\n    s = data + 1;\n    sftp_handle->version = _libssh2_ntohu32(s);\n    s += 4;\n    if (sftp_handle->version > LIBSSH2_SFTP_VERSION) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Truncating remote SFTP version from %lu\",\n                       sftp_handle->version);\n        sftp_handle->version = LIBSSH2_SFTP_VERSION;\n    }\n    _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                   \"Enabling SFTP version %lu compatibility\",\n                   sftp_handle->version);\n    while (s < (data + data_len)) {\n        size_t extname_len, extdata_len;\n\n        extname_len = _libssh2_ntohu32(s);\n        s += 4;\n        /* the extension name starts here */\n        s += extname_len;\n\n        extdata_len = _libssh2_ntohu32(s);\n        s += 4;\n\n        /* TODO: Actually process extensions */\n        s += extdata_len;\n\n    }\n    LIBSSH2_FREE(session, data);\n\n    /* Make sure that when the channel gets closed, the SFTP service is shut\n       down too */\n    sftp_handle->channel->abstract = sftp_handle;\n    sftp_handle->channel->close_cb = libssh2_sftp_dtor;\n\n    session->sftpInit_state = libssh2_NB_state_idle;\n\n    /* clear the sftp and channel pointers in this session struct now */\n    session->sftpInit_sftp = NULL;\n    session->sftpInit_channel = NULL;\n\n    _libssh2_list_init(&sftp_handle->sftp_handles);\n\n    return sftp_handle;\n\n  sftp_init_error:\n    while (_libssh2_channel_free(session->sftpInit_channel) ==\n           LIBSSH2_ERROR_EAGAIN);\n    session->sftpInit_channel = NULL;\n    if (session->sftpInit_sftp) {\n        LIBSSH2_FREE(session, session->sftpInit_sftp);\n        session->sftpInit_sftp = NULL;\n    }\n    session->sftpInit_state = libssh2_NB_state_idle;\n    return NULL;\n}\n\n/*\n * libssh2_sftp_init\n *\n * Startup an SFTP session\n */\nLIBSSH2_API LIBSSH2_SFTP *libssh2_sftp_init(LIBSSH2_SESSION *session)\n{\n    LIBSSH2_SFTP *ptr;\n\n    if(!session)\n        return NULL;\n\n    if(!(session->state & LIBSSH2_STATE_AUTHENTICATED)) {\n        _libssh2_error(session, LIBSSH2_ERROR_INVAL,\n                       \"session not authenticated yet\");\n        return NULL;\n    }\n\n    BLOCK_ADJUST_ERRNO(ptr, session, sftp_init(session));\n    return ptr;\n}\n\n/*\n * sftp_shutdown\n *\n * Shuts down the SFTP subsystem\n */\nstatic int\nsftp_shutdown(LIBSSH2_SFTP *sftp)\n{\n    int rc;\n    LIBSSH2_SESSION *session = sftp->channel->session;\n    /*\n     * Make sure all memory used in the state variables are free\n     */\n    if (sftp->partial_packet) {\n        LIBSSH2_FREE(session, sftp->partial_packet);\n        sftp->partial_packet = NULL;\n    }\n    if (sftp->open_packet) {\n        LIBSSH2_FREE(session, sftp->open_packet);\n        sftp->open_packet = NULL;\n    }\n    if (sftp->readdir_packet) {\n        LIBSSH2_FREE(session, sftp->readdir_packet);\n        sftp->readdir_packet = NULL;\n    }\n    if (sftp->fstat_packet) {\n        LIBSSH2_FREE(session, sftp->fstat_packet);\n        sftp->fstat_packet = NULL;\n    }\n    if (sftp->unlink_packet) {\n        LIBSSH2_FREE(session, sftp->unlink_packet);\n        sftp->unlink_packet = NULL;\n    }\n    if (sftp->rename_packet) {\n        LIBSSH2_FREE(session, sftp->rename_packet);\n        sftp->rename_packet = NULL;\n    }\n    if (sftp->fstatvfs_packet) {\n        LIBSSH2_FREE(session, sftp->fstatvfs_packet);\n        sftp->fstatvfs_packet = NULL;\n    }\n    if (sftp->statvfs_packet) {\n        LIBSSH2_FREE(session, sftp->statvfs_packet);\n        sftp->statvfs_packet = NULL;\n    }\n    if (sftp->mkdir_packet) {\n        LIBSSH2_FREE(session, sftp->mkdir_packet);\n        sftp->mkdir_packet = NULL;\n    }\n    if (sftp->rmdir_packet) {\n        LIBSSH2_FREE(session, sftp->rmdir_packet);\n        sftp->rmdir_packet = NULL;\n    }\n    if (sftp->stat_packet) {\n        LIBSSH2_FREE(session, sftp->stat_packet);\n        sftp->stat_packet = NULL;\n    }\n    if (sftp->symlink_packet) {\n        LIBSSH2_FREE(session, sftp->symlink_packet);\n        sftp->symlink_packet = NULL;\n    }\n    if (sftp->fsync_packet) {\n        LIBSSH2_FREE(session, sftp->fsync_packet);\n        sftp->fsync_packet = NULL;\n    }\n\n    sftp_packet_flush(sftp);\n\n    /* TODO: We should consider walking over the sftp_handles list and kill\n     * any remaining sftp handles ... */\n\n    rc = _libssh2_channel_free(sftp->channel);\n\n    return rc;\n}\n\n/* libssh2_sftp_shutdown\n * Shutsdown the SFTP subsystem\n */\nLIBSSH2_API int\nlibssh2_sftp_shutdown(LIBSSH2_SFTP *sftp)\n{\n    int rc;\n    if(!sftp)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, sftp->channel->session, sftp_shutdown(sftp));\n    return rc;\n}\n\n/* *******************************\n * SFTP File and Directory Ops *\n ******************************* */\n\n/* sftp_open\n */\nstatic LIBSSH2_SFTP_HANDLE *\nsftp_open(LIBSSH2_SFTP *sftp, const char *filename,\n          size_t filename_len, uint32_t flags, long mode,\n          int open_type)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    LIBSSH2_SFTP_HANDLE *fp;\n    LIBSSH2_SFTP_ATTRIBUTES attrs = {\n        LIBSSH2_SFTP_ATTR_PERMISSIONS, 0, 0, 0, 0, 0, 0\n    };\n    unsigned char *s;\n    ssize_t rc;\n    int open_file = (open_type == LIBSSH2_SFTP_OPENFILE)?1:0;\n\n    if (sftp->open_state == libssh2_NB_state_idle) {\n        /* packet_len(4) + packet_type(1) + request_id(4) + filename_len(4) +\n           flags(4) */\n        sftp->open_packet_len = filename_len + 13 +\n            (open_file? (4 + sftp_attrsize(LIBSSH2_SFTP_ATTR_PERMISSIONS)) : 0);\n\n        /* surprise! this starts out with nothing sent */\n        sftp->open_packet_sent = 0;\n        s = sftp->open_packet = LIBSSH2_ALLOC(session, sftp->open_packet_len);\n        if (!sftp->open_packet) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate memory for FXP_OPEN or \"\n                           \"FXP_OPENDIR packet\");\n            return NULL;\n        }\n        /* Filetype in SFTP 3 and earlier */\n        attrs.permissions = mode |\n            (open_file ? LIBSSH2_SFTP_ATTR_PFILETYPE_FILE :\n             LIBSSH2_SFTP_ATTR_PFILETYPE_DIR);\n\n        _libssh2_store_u32(&s, sftp->open_packet_len - 4);\n        *(s++) = open_file? SSH_FXP_OPEN : SSH_FXP_OPENDIR;\n        sftp->open_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->open_request_id);\n        _libssh2_store_str(&s, filename, filename_len);\n\n        if (open_file) {\n            _libssh2_store_u32(&s, flags);\n            s += sftp_attr2bin(s, &attrs);\n        }\n\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Sending %s open request\",\n                       open_file? \"file\" : \"directory\");\n\n        sftp->open_state = libssh2_NB_state_created;\n    }\n\n    if (sftp->open_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, sftp->open_packet+\n                                    sftp->open_packet_sent,\n                                    sftp->open_packet_len -\n                                    sftp->open_packet_sent);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block sending FXP_OPEN or FXP_OPENDIR command\");\n            return NULL;\n        }\n        else if(rc < 0) {\n            _libssh2_error(session, rc, \"Unable to send FXP_OPEN*\");\n            LIBSSH2_FREE(session, sftp->open_packet);\n            sftp->open_packet = NULL;\n            sftp->open_state = libssh2_NB_state_idle;\n            return NULL;\n        }\n\n        /* bump the sent counter and remain in this state until the whole\n           data is off */\n        sftp->open_packet_sent += rc;\n\n        if(sftp->open_packet_len == sftp->open_packet_sent) {\n            LIBSSH2_FREE(session, sftp->open_packet);\n            sftp->open_packet = NULL;\n\n            sftp->open_state = libssh2_NB_state_sent;\n        }\n    }\n\n    if (sftp->open_state == libssh2_NB_state_sent) {\n        size_t data_len;\n        unsigned char *data;\n        static const unsigned char fopen_responses[2] =\n            { SSH_FXP_HANDLE, SSH_FXP_STATUS };\n        rc = sftp_packet_requirev(sftp, 2, fopen_responses,\n                                  sftp->open_request_id, &data,\n                                  &data_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block waiting for status message\");\n            return NULL;\n        }\n        sftp->open_state = libssh2_NB_state_idle;\n        if (rc) {\n            _libssh2_error(session, rc, \"Timeout waiting for status message\");\n            return NULL;\n        }\n\n        /* OPEN can basically get STATUS or HANDLE back, where HANDLE implies\n           a fine response while STATUS means error. It seems though that at\n           times we get an SSH_FX_OK back in a STATUS, followed the \"real\"\n           HANDLE so we need to properly deal with that. */\n        if (data[0] == SSH_FXP_STATUS) {\n            int badness = 1;\n\n            if(data_len < 9) {\n                _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                               \"Too small FXP_STATUS\");\n                LIBSSH2_FREE(session, data);\n                return NULL;\n            }\n\n            sftp->last_errno = _libssh2_ntohu32(data + 5);\n\n            if(LIBSSH2_FX_OK == sftp->last_errno) {\n                _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"got HANDLE FXOK!\");\n\n                LIBSSH2_FREE(session, data);\n\n                /* silly situation, but check for a HANDLE */\n                rc = sftp_packet_require(sftp, SSH_FXP_HANDLE,\n                                         sftp->open_request_id, &data,\n                                         &data_len);\n                if(rc == LIBSSH2_ERROR_EAGAIN) {\n                    /* go back to sent state and wait for something else */\n                    sftp->open_state = libssh2_NB_state_sent;\n                    return NULL;\n                }\n                else if(!rc)\n                    /* we got the handle so this is not a bad situation */\n                    badness = 0;\n            }\n\n            if(badness) {\n                _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                               \"Failed opening remote file\");\n                _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"got FXP_STATUS %d\",\n                               sftp->last_errno);\n                LIBSSH2_FREE(session, data);\n                return NULL;\n            }\n        }\n\n        if(data_len < 10) {\n            _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                           \"Too small FXP_HANDLE\");\n            LIBSSH2_FREE(session, data);\n            return NULL;\n        }\n\n        fp = LIBSSH2_CALLOC(session, sizeof(LIBSSH2_SFTP_HANDLE));\n        if (!fp) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate new SFTP handle structure\");\n            LIBSSH2_FREE(session, data);\n            return NULL;\n        }\n        fp->handle_type = open_file ? LIBSSH2_SFTP_HANDLE_FILE :\n            LIBSSH2_SFTP_HANDLE_DIR;\n\n        fp->handle_len = _libssh2_ntohu32(data + 5);\n        if (fp->handle_len > SFTP_HANDLE_MAXLEN)\n            /* SFTP doesn't allow handles longer than 256 characters */\n            fp->handle_len = SFTP_HANDLE_MAXLEN;\n\n        if(fp->handle_len > (data_len - 9))\n            /* do not reach beyond the end of the data we got */\n            fp->handle_len = data_len - 9;\n\n        memcpy(fp->handle, data + 9, fp->handle_len);\n\n        LIBSSH2_FREE(session, data);\n\n        /* add this file handle to the list kept in the sftp session */\n        _libssh2_list_add(&sftp->sftp_handles, &fp->node);\n\n        fp->sftp = sftp; /* point to the parent struct */\n\n        fp->u.file.offset = 0;\n        fp->u.file.offset_sent = 0;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Open command successful\");\n        return fp;\n    }\n    return NULL;\n}\n\n/* libssh2_sftp_open_ex\n */\nLIBSSH2_API LIBSSH2_SFTP_HANDLE *\nlibssh2_sftp_open_ex(LIBSSH2_SFTP *sftp, const char *filename,\n                     unsigned int filename_len, unsigned long flags, long mode,\n                     int open_type)\n{\n    LIBSSH2_SFTP_HANDLE *hnd;\n\n    if(!sftp)\n        return NULL;\n\n    BLOCK_ADJUST_ERRNO(hnd, sftp->channel->session,\n                       sftp_open(sftp, filename, filename_len, flags, mode,\n                                 open_type));\n    return hnd;\n}\n\n/*\n * sftp_read\n *\n * Read from an SFTP file handle\n *\n */\nstatic ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer,\n                         size_t buffer_size)\n{\n    LIBSSH2_SFTP *sftp = handle->sftp;\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t count = 0;\n    struct sftp_pipeline_chunk *chunk;\n    struct sftp_pipeline_chunk *next;\n    ssize_t rc;\n    struct _libssh2_sftp_handle_file_data *filep =\n        &handle->u.file;\n    size_t bytes_in_buffer = 0;\n    char *sliding_bufferp = buffer;\n\n    /* This function can be interrupted in three different places where it\n       might need to wait for data from the network.  It returns EAGAIN to\n       allow non-blocking clients to do other work but these client are\n       expected to call this function again (possibly many times) to finish\n       the operation.\n\n       The tricky part is that if we previously aborted a sftp_read due to\n       EAGAIN, we must continue at the same spot to continue the previously\n       interrupted operation.  This is done using a state machine to record\n       what phase of execution we were at.  The state is stored in\n       sftp->read_state.\n\n       libssh2_NB_state_idle: The first phase is where we prepare multiple\n       FXP_READ packets to do optimistic read-ahead.  We send off as many as\n       possible in the second phase without waiting for a response to each\n       one; this is the key to fast reads. But we may have to adjust the\n       channel window size to do this which may interrupt this function while\n       waiting.  The state machine saves the phase as libssh2_NB_state_idle so\n       it returns here on the next call.\n\n       libssh2_NB_state_sent: The second phase is where we send the FXP_READ\n       packets.  Writing them to the channel can be interrupted with EAGAIN\n       but the state machine ensures we skip the first phase on the next call\n       and resume sending.\n\n       libssh2_NB_state_sent2: In the third phase (indicated by ) we read the\n       data from the responses that have arrived so far.  Reading can be\n       interrupted with EAGAIN but the state machine ensures we skip the first\n       and second phases on the next call and resume sending.\n    */\n\n    switch (sftp->read_state) {\n    case libssh2_NB_state_idle:\n\n        /* Some data may already have been read from the server in the\n           previous call but didn't fit in the buffer at the time.  If so, we\n           return that now as we can't risk being interrupted later with data\n           partially written to the buffer. */\n        if(filep->data_left) {\n            size_t copy = MIN(buffer_size, filep->data_left);\n\n            memcpy(buffer, &filep->data[ filep->data_len - filep->data_left],\n                   copy);\n\n            filep->data_left -= copy;\n            filep->offset += copy;\n\n            if(!filep->data_left) {\n                LIBSSH2_FREE(session, filep->data);\n                filep->data = NULL;\n            }\n\n            return copy;\n        }\n\n        if (filep->eof) {\n            return 0;\n        } else {\n            /* We allow a number of bytes being requested at any given time\n               without having been acked - until we reach EOF. */\n\n            /* Number of bytes asked for that haven't been acked yet */\n            size_t already = (size_t)(filep->offset_sent - filep->offset);\n\n            size_t max_read_ahead = buffer_size*4;\n            unsigned long recv_window;\n\n            if(max_read_ahead > LIBSSH2_CHANNEL_WINDOW_DEFAULT*4)\n                max_read_ahead = LIBSSH2_CHANNEL_WINDOW_DEFAULT*4;\n\n            /* if the buffer_size passed in now is smaller than what has\n               already been sent, we risk getting count become a very large\n               number */\n            if(max_read_ahead > already)\n                count = max_read_ahead - already;\n\n            /* 'count' is how much more data to ask for, and 'already' is how\n               much data that already has been asked for but not yet returned.\n               Specificly, 'count' means how much data that have or will be\n               asked for by the nodes that are already added to the linked\n               list. Some of those read requests may not actually have been\n               sent off successfully yet.\n\n               If 'already' is very large it should be perfectly fine to have\n               count set to 0 as then we don't have to ask for more data\n               (right now).\n\n               buffer_size*4 is just picked more or less out of the air. The\n               idea is that when reading SFTP from a remote server, we send\n               away multiple read requests guessing that the client will read\n               more than only this 'buffer_size' amount of memory. So we ask\n               for maximum buffer_size*4 amount of data so that we can return\n               them very fast in subsequent calls.\n            */\n\n            recv_window = libssh2_channel_window_read_ex(sftp->channel,\n                                                         NULL, NULL);\n            if(max_read_ahead > recv_window) {\n                /* more data will be asked for than what the window currently\n                   allows, expand it! */\n\n                rc = _libssh2_channel_receive_window_adjust(sftp->channel,\n                                                            max_read_ahead*8,\n                                                            1, NULL);\n                /* if this returns EAGAIN, we will get back to this function\n                   at next call */\n                assert(rc != LIBSSH2_ERROR_EAGAIN || !filep->data_left);\n                assert(rc != LIBSSH2_ERROR_EAGAIN || !filep->eof);\n                if (rc)\n                    return rc;\n            }\n        }\n\n        while(count > 0) {\n            unsigned char *s;\n\n            /* 25 = packet_len(4) + packet_type(1) + request_id(4) +\n               handle_len(4) + offset(8) + count(4) */\n            uint32_t packet_len = (uint32_t)handle->handle_len + 25;\n            uint32_t request_id;\n\n            uint32_t size = count;\n            if (size < buffer_size)\n                size = buffer_size;\n            if (size > MAX_SFTP_READ_SIZE)\n                size = MAX_SFTP_READ_SIZE;\n\n            chunk = LIBSSH2_ALLOC(session, packet_len +\n                                  sizeof(struct sftp_pipeline_chunk));\n            if (!chunk)\n                return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                      \"malloc fail for FXP_WRITE\");\n\n            chunk->offset = filep->offset_sent;\n            chunk->len = size;\n            chunk->lefttosend = packet_len;\n            chunk->sent = 0;\n\n            s = chunk->packet;\n\n            _libssh2_store_u32(&s, packet_len - 4);\n            *s++ = SSH_FXP_READ;\n            request_id = sftp->request_id++;\n            chunk->request_id = request_id;\n            _libssh2_store_u32(&s, request_id);\n            _libssh2_store_str(&s, handle->handle, handle->handle_len);\n            _libssh2_store_u64(&s, filep->offset_sent);\n            filep->offset_sent += size; /* advance offset at once */\n            _libssh2_store_u32(&s, size);\n\n            /* add this new entry LAST in the list */\n            _libssh2_list_add(&handle->packet_list, &chunk->node);\n            count -= MIN(size,count); /* deduct the size we used, as we might\n                                       * have to create more packets */\n            _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                           \"read request id %d sent (offset: %d, size: %d)\",\n                           request_id, (int)chunk->offset, (int)chunk->len);\n        }\n\n    case libssh2_NB_state_sent:\n\n        sftp->read_state = libssh2_NB_state_idle;\n\n        /* move through the READ packets that haven't been sent and send as\n           many as possible - remember that we don't block */\n        chunk = _libssh2_list_first(&handle->packet_list);\n\n        while(chunk) {\n            if(chunk->lefttosend) {\n\n                rc = _libssh2_channel_write(channel, 0,\n                                            &chunk->packet[chunk->sent],\n                                            chunk->lefttosend);\n                if(rc < 0) {\n                    sftp->read_state = libssh2_NB_state_sent;\n                    return rc;\n                }\n\n                /* remember where to continue sending the next time */\n                chunk->lefttosend -= rc;\n                chunk->sent += rc;\n\n                if(chunk->lefttosend) {\n                    /* We still have data left to send for this chunk.\n                     * If there is at least one completely sent chunk,\n                     * we can get out of this loop and start reading.  */\n                    if (chunk != _libssh2_list_first(&handle->packet_list)) {\n                        break;\n                    } else {\n                        continue;\n                    }\n                }\n            }\n\n            /* move on to the next chunk with data to send */\n            chunk = _libssh2_list_next(&chunk->node);\n        }\n\n    case libssh2_NB_state_sent2:\n\n        sftp->read_state = libssh2_NB_state_idle;\n\n        /*\n         * Count all ACKed packets and act on the contents of them.\n         */\n        chunk = _libssh2_list_first(&handle->packet_list);\n\n        while(chunk) {\n            unsigned char *data;\n            size_t data_len;\n            uint32_t rc32;\n            static const unsigned char read_responses[2] = {\n                SSH_FXP_DATA, SSH_FXP_STATUS\n            };\n\n            if(chunk->lefttosend) {\n                /* if the chunk still has data left to send, we shouldn't wait\n                   for an ACK for it just yet */\n                if (bytes_in_buffer > 0) {\n                    return bytes_in_buffer;\n                } else {\n                    /* we should never reach this point */\n                    return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                          \"sftp_read() internal error\");\n                }\n            }\n\n            rc = sftp_packet_requirev(sftp, 2, read_responses,\n                                      chunk->request_id, &data, &data_len);\n\n            if (rc==LIBSSH2_ERROR_EAGAIN && bytes_in_buffer != 0) {\n                /* do not return EAGAIN if we have already\n                 * written data into the buffer */\n                return bytes_in_buffer;\n            }\n\n            if (rc < 0) {\n                sftp->read_state = libssh2_NB_state_sent2;\n                return rc;\n            }\n\n            /*\n             * We get DATA or STATUS back. STATUS can be error, or it is\n             * FX_EOF when we reach the end of the file.\n             */\n\n            switch (data[0]) {\n            case SSH_FXP_STATUS:\n                /* remove the chunk we just processed */\n\n                _libssh2_list_remove(&chunk->node);\n                LIBSSH2_FREE(session, chunk);\n\n                /* we must remove all outstanding READ requests, as either we\n                   got an error or we're at end of file */\n                sftp_packetlist_flush(handle);\n\n                rc32 = _libssh2_ntohu32(data + 5);\n                LIBSSH2_FREE(session, data);\n\n                if (rc32 == LIBSSH2_FX_EOF) {\n                    filep->eof = TRUE;\n                    return bytes_in_buffer;\n                }\n                else {\n                    sftp->last_errno = rc32;\n                    return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                          \"SFTP READ error\");\n                }\n                break;\n\n            case SSH_FXP_DATA:\n                if (chunk->offset != filep->offset) {\n                    /* This could happen if the server returns less bytes than\n                       requested, which shouldn't happen for normal files. See:\n                       https://tools.ietf.org/html/draft-ietf-secsh-filexfer-02\n                       #section-6.4\n                    */\n                    return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                          \"Read Packet At Unexpected Offset\");\n                }\n\n                rc32 = _libssh2_ntohu32(data + 5);\n                if (rc32 > (data_len - 9))\n                    return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                          \"SFTP Protocol badness\");\n\n                if(rc32 > chunk->len) {\n                    /* A chunk larger than we requested was returned to us.\n                       This is a protocol violation and we don't know how to\n                       deal with it. Bail out! */\n                    return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                          \"FXP_READ response too big\");\n                }\n\n                if(rc32 != chunk->len) {\n                    /* a short read does not imply end of file, but we must\n                       adjust the offset_sent since it was advanced with a\n                       full chunk->len before */\n                    filep->offset_sent -= (chunk->len - rc32);\n                }\n\n                if((bytes_in_buffer + rc32) > buffer_size) {\n                    /* figure out the overlap amount */\n                    filep->data_left = (bytes_in_buffer + rc32) - buffer_size;\n\n                    /* getting the full packet would overflow the buffer, so\n                       only get the correct amount and keep the remainder */\n                    rc32 = (uint32_t)buffer_size - bytes_in_buffer;\n\n                    /* store data to keep for next call */\n                    filep->data = data;\n                    filep->data_len = data_len;\n                }\n                else\n                    filep->data_len = 0;\n\n                /* copy the received data from the received FXP_DATA packet to\n                   the buffer at the correct index */\n                memcpy(sliding_bufferp, data + 9, rc32);\n                filep->offset += rc32;\n                bytes_in_buffer += rc32;\n                sliding_bufferp += rc32;\n\n                if(filep->data_len == 0)\n                    /* free the allocated data if not stored to keep */\n                    LIBSSH2_FREE(session, data);\n\n                /* remove the chunk we just processed keeping track of the\n                 * next one in case we need it */\n                next = _libssh2_list_next(&chunk->node);\n                _libssh2_list_remove(&chunk->node);\n                LIBSSH2_FREE(session, chunk);\n\n                /* check if we have space left in the buffer\n                 * and either continue to the next chunk or stop\n                 */\n                if (bytes_in_buffer < buffer_size) {\n                    chunk = next;\n                } else {\n                    chunk = NULL;\n                }\n\n                break;\n            default:\n                return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                      \"SFTP Protocol badness: unrecognised \"\n                                      \"read request response\");\n            }\n        }\n\n        if (bytes_in_buffer > 0)\n            return bytes_in_buffer;\n\n        break;\n\n    default:\n        assert(!\"State machine error; unrecognised read state\");\n    }\n\n    /* we should never reach this point */\n    return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                          \"sftp_read() internal error\");\n}\n\n/* libssh2_sftp_read\n * Read from an SFTP file handle\n */\nLIBSSH2_API ssize_t\nlibssh2_sftp_read(LIBSSH2_SFTP_HANDLE *hnd, char *buffer,\n                  size_t buffer_maxlen)\n{\n    ssize_t rc;\n    if(!hnd)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, hnd->sftp->channel->session,\n                 sftp_read(hnd, buffer, buffer_maxlen));\n    return rc;\n}\n\n/* sftp_readdir\n * Read from an SFTP directory handle\n */\nstatic ssize_t sftp_readdir(LIBSSH2_SFTP_HANDLE *handle, char *buffer,\n                            size_t buffer_maxlen, char *longentry,\n                            size_t longentry_maxlen,\n                            LIBSSH2_SFTP_ATTRIBUTES *attrs)\n{\n    LIBSSH2_SFTP *sftp = handle->sftp;\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    uint32_t num_names;\n    /* 13 = packet_len(4) + packet_type(1) + request_id(4) + handle_len(4) */\n    uint32_t packet_len = handle->handle_len + 13;\n    unsigned char *s, *data;\n    static const unsigned char read_responses[2] = {\n        SSH_FXP_NAME, SSH_FXP_STATUS };\n    ssize_t retcode;\n\n    if (sftp->readdir_state == libssh2_NB_state_idle) {\n        if (handle->u.dir.names_left) {\n            /*\n             * A prior request returned more than one directory entry,\n             * feed it back from the buffer\n             */\n            LIBSSH2_SFTP_ATTRIBUTES attrs_dummy;\n            size_t real_longentry_len;\n            size_t real_filename_len;\n            size_t filename_len;\n            size_t longentry_len;\n\n            s = (unsigned char *) handle->u.dir.next_name;\n            real_filename_len = _libssh2_ntohu32(s);\n\n            s += 4;\n\n            filename_len = real_filename_len;\n            if (filename_len >= buffer_maxlen) {\n                filename_len = (size_t)LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n                goto end;\n            }\n\n            memcpy(buffer, s, filename_len);\n            buffer[filename_len] = '\\0';           /* zero terminate */\n            s += real_filename_len;\n\n            real_longentry_len = _libssh2_ntohu32(s);\n            s += 4;\n\n            if (longentry && (longentry_maxlen>1)) {\n                longentry_len = real_longentry_len;\n\n                if (longentry_len >= longentry_maxlen) {\n                    filename_len = (size_t)LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n                    goto end;\n                }\n\n                memcpy(longentry, s, longentry_len);\n                longentry[longentry_len] = '\\0'; /* zero terminate */\n            }\n            s += real_longentry_len;\n\n            if (attrs)\n                memset(attrs, 0, sizeof(LIBSSH2_SFTP_ATTRIBUTES));\n\n            s += sftp_bin2attr(attrs ? attrs : &attrs_dummy, s);\n\n            handle->u.dir.next_name = (char *) s;\n          end:\n\n            if ((--handle->u.dir.names_left) == 0)\n                LIBSSH2_FREE(session, handle->u.dir.names_packet);\n\n            _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                           \"libssh2_sftp_readdir_ex() return %d\",\n                           filename_len);\n            return (ssize_t)filename_len;\n        }\n\n        /* Request another entry(entries?) */\n\n        s = sftp->readdir_packet = LIBSSH2_ALLOC(session, packet_len);\n        if (!sftp->readdir_packet)\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"FXP_READDIR packet\");\n\n        _libssh2_store_u32(&s, packet_len - 4);\n        *(s++) = SSH_FXP_READDIR;\n        sftp->readdir_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->readdir_request_id);\n        _libssh2_store_str(&s, handle->handle, handle->handle_len);\n\n        sftp->readdir_state = libssh2_NB_state_created;\n    }\n\n    if (sftp->readdir_state == libssh2_NB_state_created) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Reading entries from directory handle\");\n        retcode = _libssh2_channel_write(channel, 0, sftp->readdir_packet,\n                                         packet_len);\n        if (retcode == LIBSSH2_ERROR_EAGAIN) {\n            return retcode;\n        }\n        else if ((ssize_t)packet_len != retcode) {\n            LIBSSH2_FREE(session, sftp->readdir_packet);\n            sftp->readdir_packet = NULL;\n            sftp->readdir_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"_libssh2_channel_write() failed\");\n        }\n\n        LIBSSH2_FREE(session, sftp->readdir_packet);\n        sftp->readdir_packet = NULL;\n\n        sftp->readdir_state = libssh2_NB_state_sent;\n    }\n\n    retcode = sftp_packet_requirev(sftp, 2, read_responses,\n                                   sftp->readdir_request_id, &data,\n                                   &data_len);\n    if (retcode == LIBSSH2_ERROR_EAGAIN)\n        return retcode;\n    else if (retcode) {\n        sftp->readdir_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, retcode,\n                              \"Timeout waiting for status message\");\n    }\n\n    if (data[0] == SSH_FXP_STATUS) {\n        retcode = _libssh2_ntohu32(data + 5);\n        LIBSSH2_FREE(session, data);\n        if (retcode == LIBSSH2_FX_EOF) {\n            sftp->readdir_state = libssh2_NB_state_idle;\n            return 0;\n        }\n        else {\n            sftp->last_errno = retcode;\n            sftp->readdir_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                  \"SFTP Protocol Error\");\n        }\n    }\n\n    sftp->readdir_state = libssh2_NB_state_idle;\n\n    num_names = _libssh2_ntohu32(data + 5);\n    _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"%lu entries returned\",\n                   num_names);\n    if (!num_names) {\n        LIBSSH2_FREE(session, data);\n        return 0;\n    }\n\n    handle->u.dir.names_left = num_names;\n    handle->u.dir.names_packet = data;\n    handle->u.dir.next_name = (char *) data + 9;\n\n    /* use the name popping mechanism from the start of the function */\n    return sftp_readdir(handle, buffer, buffer_maxlen, longentry,\n                        longentry_maxlen, attrs);\n}\n\n/* libssh2_sftp_readdir_ex\n * Read from an SFTP directory handle\n */\nLIBSSH2_API int\nlibssh2_sftp_readdir_ex(LIBSSH2_SFTP_HANDLE *hnd, char *buffer,\n                        size_t buffer_maxlen, char *longentry,\n                        size_t longentry_maxlen,\n                        LIBSSH2_SFTP_ATTRIBUTES *attrs)\n{\n    int rc;\n    if(!hnd)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, hnd->sftp->channel->session,\n                 sftp_readdir(hnd, buffer, buffer_maxlen, longentry,\n                              longentry_maxlen, attrs));\n    return rc;\n}\n\n/*\n * sftp_write\n *\n * Write data to an SFTP handle. Returns the number of bytes written, or\n * a negative error code.\n *\n * We recommend sending very large data buffers to this function!\n *\n * Concept:\n *\n * - Detect how much of the given buffer that was already sent in a previous\n *   call by inspecting the linked list of outgoing chunks. Make sure to skip\n *   passed the data that has already been taken care of.\n *\n * - Split all (new) outgoing data in chunks no larger than N.\n *\n * - Each N bytes chunk gets created as a separate SFTP packet.\n *\n * - Add all created outgoing packets to the linked list.\n *\n * - Walk through the list and send the chunks that haven't been sent,\n *   as many as possible until EAGAIN. Some of the chunks may have been put\n *   in the list in a previous invoke.\n *\n * - For all the chunks in the list that have been completely sent off, check\n *   for ACKs. If a chunk has been ACKed, it is removed from the linked\n *   list and the \"acked\" counter gets increased with that data amount.\n *\n * - Return TOTAL bytes acked so far.\n *\n * Caveats:\n * -  be careful: we must not return a higher number than what was given!\n *\n * TODO:\n *   Introduce an option that disables this sort of \"speculative\" ahead writing\n *   as there's a risk that it will do harm to some app.\n */\n\nstatic ssize_t sftp_write(LIBSSH2_SFTP_HANDLE *handle, const char *buffer,\n                          size_t count)\n{\n    LIBSSH2_SFTP *sftp = handle->sftp;\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    uint32_t retcode;\n    uint32_t packet_len;\n    unsigned char *s, *data;\n    ssize_t rc;\n    struct sftp_pipeline_chunk *chunk;\n    struct sftp_pipeline_chunk *next;\n    size_t acked = 0;\n    size_t org_count = count;\n    size_t already;\n\n    switch(sftp->write_state) {\n    default:\n    case libssh2_NB_state_idle:\n\n        /* Number of bytes sent off that haven't been acked and therefor we\n           will get passed in here again.\n\n           Also, add up the number of bytes that actually already have been\n           acked but we haven't been able to return as such yet, so we will\n           get that data as well passed in here again.\n        */\n        already = (size_t) (handle->u.file.offset_sent - handle->u.file.offset)+\n            handle->u.file.acked;\n\n        if(count >= already) {\n            /* skip the part already made into packets */\n            buffer += already;\n            count -= already;\n        }\n        else\n            /* there is more data already fine than what we got in this call */\n            count = 0;\n\n        sftp->write_state = libssh2_NB_state_idle;\n        while(count) {\n            /* TODO: Possibly this should have some logic to prevent a very\n               very small fraction to be left but lets ignore that for now */\n            uint32_t size = MIN(MAX_SFTP_OUTGOING_SIZE, count);\n            uint32_t request_id;\n\n            /* 25 = packet_len(4) + packet_type(1) + request_id(4) +\n               handle_len(4) + offset(8) + count(4) */\n            packet_len = handle->handle_len + size + 25;\n\n            chunk = LIBSSH2_ALLOC(session, packet_len +\n                                  sizeof(struct sftp_pipeline_chunk));\n            if (!chunk)\n                return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                      \"malloc fail for FXP_WRITE\");\n\n            chunk->len = size;\n            chunk->sent = 0;\n            chunk->lefttosend = packet_len;\n\n            s = chunk->packet;\n            _libssh2_store_u32(&s, packet_len - 4);\n\n            *(s++) = SSH_FXP_WRITE;\n            request_id = sftp->request_id++;\n            chunk->request_id = request_id;\n            _libssh2_store_u32(&s, request_id);\n            _libssh2_store_str(&s, handle->handle, handle->handle_len);\n            _libssh2_store_u64(&s, handle->u.file.offset_sent);\n            handle->u.file.offset_sent += size; /* advance offset at once */\n            _libssh2_store_str(&s, buffer, size);\n\n            /* add this new entry LAST in the list */\n            _libssh2_list_add(&handle->packet_list, &chunk->node);\n\n            buffer += size;\n            count -= size; /* deduct the size we used, as we might have\n                              to create more packets */\n        }\n\n        /* move through the WRITE packets that haven't been sent and send as many\n           as possible - remember that we don't block */\n        chunk = _libssh2_list_first(&handle->packet_list);\n\n        while(chunk) {\n            if(chunk->lefttosend) {\n                rc = _libssh2_channel_write(channel, 0,\n                                            &chunk->packet[chunk->sent],\n                                            chunk->lefttosend);\n                if(rc < 0)\n                    /* remain in idle state */\n                    return rc;\n\n                /* remember where to continue sending the next time */\n                chunk->lefttosend -= rc;\n                chunk->sent += rc;\n\n                if(chunk->lefttosend)\n                    /* data left to send, get out of loop */\n                    break;\n            }\n\n            /* move on to the next chunk with data to send */\n            chunk = _libssh2_list_next(&chunk->node);\n        }\n\n        /* fall-through */\n    case libssh2_NB_state_sent:\n\n        sftp->write_state = libssh2_NB_state_idle;\n        /*\n         * Count all ACKed packets\n         */\n        chunk = _libssh2_list_first(&handle->packet_list);\n\n        while(chunk) {\n            if(chunk->lefttosend)\n                /* if the chunk still has data left to send, we shouldn't wait\n                   for an ACK for it just yet */\n                break;\n\n            else if(acked)\n                /* if we have sent data that is acked, we must return that\n                   info before we call a function that might return EAGAIN */\n                break;\n\n            /* we check the packets in order */\n            rc = sftp_packet_require(sftp, SSH_FXP_STATUS,\n                                     chunk->request_id, &data, &data_len);\n            if (rc < 0) {\n                if (rc == LIBSSH2_ERROR_EAGAIN)\n                    sftp->write_state = libssh2_NB_state_sent;\n                return rc;\n            }\n\n            retcode = _libssh2_ntohu32(data + 5);\n            LIBSSH2_FREE(session, data);\n\n            sftp->last_errno = retcode;\n            if (retcode == LIBSSH2_FX_OK) {\n                acked += chunk->len; /* number of payload data that was acked\n                                        here */\n\n                /* we increase the offset value for all acks */\n                handle->u.file.offset += chunk->len;\n\n                next = _libssh2_list_next(&chunk->node);\n\n                _libssh2_list_remove(&chunk->node); /* remove from list */\n                LIBSSH2_FREE(session, chunk); /* free memory */\n\n                chunk = next;\n            }\n            else {\n                /* flush all pending packets from the outgoing list */\n                sftp_packetlist_flush(handle);\n\n                /* since we return error now, the application will not get any\n                   outstanding data acked, so we need to rewind the offset to\n                   where the application knows it has reached with acked data */\n                handle->u.file.offset -= handle->u.file.acked;\n\n                /* then reset the offset_sent to be the same as the offset */\n                handle->u.file.offset_sent = handle->u.file.offset;\n\n                /* clear the acked counter since we can have no pending data to\n                   ack after an error */\n                handle->u.file.acked = 0;\n\n                /* the server returned an error for that written chunk, propagate\n                   this back to our parent function */\n                return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                      \"FXP write failed\");\n            }\n        }\n        break;\n    }\n\n    /* if there were acked data in a previous call that wasn't returned then,\n       add that up and try to return it all now. This can happen if the app\n       first sends a huge buffer of data, and then in a second call it sends a\n       smaller one. */\n    acked += handle->u.file.acked;\n\n    if(acked) {\n        ssize_t ret = MIN(acked, org_count);\n        /* we got data acked so return that amount, but no more than what\n           was asked to get sent! */\n\n        /* store the remainder. 'ret' is always equal to or less than 'acked'\n           here */\n        handle->u.file.acked = acked - ret;\n\n        return ret;\n    }\n\n    else\n        return 0; /* nothing was acked, and no EAGAIN was received! */\n}\n\n/* libssh2_sftp_write\n * Write data to a file handle\n */\nLIBSSH2_API ssize_t\nlibssh2_sftp_write(LIBSSH2_SFTP_HANDLE *hnd, const char *buffer,\n                   size_t count)\n{\n    ssize_t rc;\n    if(!hnd)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, hnd->sftp->channel->session,\n                 sftp_write(hnd, buffer, count));\n    return rc;\n\n}\n\nstatic int sftp_fsync(LIBSSH2_SFTP_HANDLE *handle)\n{\n    LIBSSH2_SFTP *sftp = handle->sftp;\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    /* 34 = packet_len(4) + packet_type(1) + request_id(4) +\n       string_len(4) + strlen(\"fsync@openssh.com\")(17) + handle_len(4) */\n    uint32_t packet_len = handle->handle_len + 34;\n    size_t data_len;\n    unsigned char *packet, *s, *data;\n    ssize_t rc;\n    uint32_t retcode;\n\n    if (sftp->fsync_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Issuing fsync command\");\n        s = packet = LIBSSH2_ALLOC(session, packet_len);\n        if (!packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for FXP_EXTENDED \"\n                                  \"packet\");\n        }\n\n        _libssh2_store_u32(&s, packet_len - 4);\n        *(s++) = SSH_FXP_EXTENDED;\n        sftp->fsync_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->fsync_request_id);\n        _libssh2_store_str(&s, \"fsync@openssh.com\", 17);\n        _libssh2_store_str(&s, handle->handle, handle->handle_len);\n\n        sftp->fsync_state = libssh2_NB_state_created;\n    } else {\n        packet = sftp->fsync_packet;\n    }\n\n    if (sftp->fsync_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, packet, packet_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN ||\n            (0 <= rc && rc < (ssize_t)packet_len)) {\n            sftp->fsync_packet = packet;\n            return LIBSSH2_ERROR_EAGAIN;\n        }\n\n        LIBSSH2_FREE(session, packet);\n        sftp->fsync_packet = NULL;\n\n        if (rc < 0) {\n            sftp->fsync_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"_libssh2_channel_write() failed\");\n        }\n        sftp->fsync_state = libssh2_NB_state_sent;\n    }\n\n    rc = sftp_packet_require(sftp, SSH_FXP_STATUS,\n                             sftp->fsync_request_id, &data, &data_len);\n    if (rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    } else if (rc) {\n        sftp->fsync_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Error waiting for FXP EXTENDED REPLY\");\n    }\n\n    sftp->fsync_state = libssh2_NB_state_idle;\n\n    retcode = _libssh2_ntohu32(data + 5);\n    LIBSSH2_FREE(session, data);\n\n    if (retcode != LIBSSH2_FX_OK) {\n        sftp->last_errno = retcode;\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"fsync failed\");\n    }\n\n    return 0;\n}\n\n/* libssh2_sftp_fsync\n * Commit data on the handle to disk.\n */\nLIBSSH2_API int\nlibssh2_sftp_fsync(LIBSSH2_SFTP_HANDLE *hnd)\n{\n    int rc;\n    if(!hnd)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, hnd->sftp->channel->session,\n                 sftp_fsync(hnd));\n    return rc;\n}\n\n\n/*\n * sftp_fstat\n *\n * Get or Set stat on a file\n */\nstatic int sftp_fstat(LIBSSH2_SFTP_HANDLE *handle,\n                      LIBSSH2_SFTP_ATTRIBUTES *attrs, int setstat)\n{\n    LIBSSH2_SFTP *sftp = handle->sftp;\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    /* 13 = packet_len(4) + packet_type(1) + request_id(4) + handle_len(4) */\n    uint32_t packet_len =\n        handle->handle_len + 13 + (setstat ? sftp_attrsize(attrs->flags) : 0);\n    unsigned char *s, *data;\n    static const unsigned char fstat_responses[2] =\n        { SSH_FXP_ATTRS, SSH_FXP_STATUS };\n    ssize_t rc;\n\n    if (sftp->fstat_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Issuing %s command\",\n                       setstat ? \"set-stat\" : \"stat\");\n        s = sftp->fstat_packet = LIBSSH2_ALLOC(session, packet_len);\n        if (!sftp->fstat_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"FSTAT/FSETSTAT packet\");\n        }\n\n        _libssh2_store_u32(&s, packet_len - 4);\n        *(s++) = setstat ? SSH_FXP_FSETSTAT : SSH_FXP_FSTAT;\n        sftp->fstat_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->fstat_request_id);\n        _libssh2_store_str(&s, handle->handle, handle->handle_len);\n\n        if (setstat) {\n            s += sftp_attr2bin(s, attrs);\n        }\n\n        sftp->fstat_state = libssh2_NB_state_created;\n    }\n\n    if (sftp->fstat_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, sftp->fstat_packet,\n                                    packet_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if ((ssize_t)packet_len != rc) {\n            LIBSSH2_FREE(session, sftp->fstat_packet);\n            sftp->fstat_packet = NULL;\n            sftp->fstat_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  (setstat ? \"Unable to send FXP_FSETSTAT\"\n                                   : \"Unable to send FXP_FSTAT command\"));\n        }\n        LIBSSH2_FREE(session, sftp->fstat_packet);\n        sftp->fstat_packet = NULL;\n\n        sftp->fstat_state = libssh2_NB_state_sent;\n    }\n\n    rc = sftp_packet_requirev(sftp, 2, fstat_responses,\n                              sftp->fstat_request_id, &data,\n                              &data_len);\n    if (rc == LIBSSH2_ERROR_EAGAIN)\n        return rc;\n    else if (rc) {\n        sftp->fstat_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Timeout waiting for status message\");\n    }\n\n    sftp->fstat_state = libssh2_NB_state_idle;\n\n    if (data[0] == SSH_FXP_STATUS) {\n        uint32_t retcode;\n\n        retcode = _libssh2_ntohu32(data + 5);\n        LIBSSH2_FREE(session, data);\n        if (retcode == LIBSSH2_FX_OK) {\n            return 0;\n        } else {\n            sftp->last_errno = retcode;\n            return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                  \"SFTP Protocol Error\");\n        }\n    }\n\n    sftp_bin2attr(attrs, data + 5);\n    LIBSSH2_FREE(session, data);\n\n    return 0;\n}\n\n/* libssh2_sftp_fstat_ex\n * Get or Set stat on a file\n */\nLIBSSH2_API int\nlibssh2_sftp_fstat_ex(LIBSSH2_SFTP_HANDLE *hnd,\n                      LIBSSH2_SFTP_ATTRIBUTES *attrs, int setstat)\n{\n    int rc;\n    if(!hnd || !attrs)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, hnd->sftp->channel->session,\n                 sftp_fstat(hnd, attrs, setstat));\n    return rc;\n}\n\n\n/* libssh2_sftp_seek64\n * Set the read/write pointer to an arbitrary position within the file\n */\nLIBSSH2_API void\nlibssh2_sftp_seek64(LIBSSH2_SFTP_HANDLE *handle, libssh2_uint64_t offset)\n{\n    if(!handle)\n        return;\n    if(handle->u.file.offset == offset && handle->u.file.offset_sent == offset)\n        return;\n\n    handle->u.file.offset = handle->u.file.offset_sent = offset;\n    /* discard all pending requests and currently read data */\n    sftp_packetlist_flush(handle);\n\n    /* free the left received buffered data */\n    if (handle->u.file.data_left) {\n        LIBSSH2_FREE(handle->sftp->channel->session, handle->u.file.data);\n        handle->u.file.data_left = handle->u.file.data_len = 0;\n        handle->u.file.data = NULL;\n    }\n\n    /* reset EOF to False */\n    handle->u.file.eof = FALSE;\n}\n\n/* libssh2_sftp_seek\n * Set the read/write pointer to an arbitrary position within the file\n */\nLIBSSH2_API void\nlibssh2_sftp_seek(LIBSSH2_SFTP_HANDLE *handle, size_t offset)\n{\n    libssh2_sftp_seek64(handle, (libssh2_uint64_t)offset);\n}\n\n/* libssh2_sftp_tell\n * Return the current read/write pointer's offset\n */\nLIBSSH2_API size_t\nlibssh2_sftp_tell(LIBSSH2_SFTP_HANDLE *handle)\n{\n    if(!handle)\n        return 0; /* no handle, no size */\n\n    /* NOTE: this may very well truncate the size if it is larger than what\n       size_t can hold, so libssh2_sftp_tell64() is really the function you\n       should use */\n    return (size_t)(handle->u.file.offset);\n}\n\n/* libssh2_sftp_tell64\n * Return the current read/write pointer's offset\n */\nLIBSSH2_API libssh2_uint64_t\nlibssh2_sftp_tell64(LIBSSH2_SFTP_HANDLE *handle)\n{\n    if(!handle)\n        return 0; /* no handle, no size */\n\n    return handle->u.file.offset;\n}\n\n/*\n * Flush all remaining incoming SFTP packets and zombies.\n */\nstatic void sftp_packet_flush(LIBSSH2_SFTP *sftp)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    LIBSSH2_SFTP_PACKET *packet = _libssh2_list_first(&sftp->packets);\n    struct sftp_zombie_requests *zombie =\n        _libssh2_list_first(&sftp->zombie_requests);\n\n    while(packet) {\n        LIBSSH2_SFTP_PACKET *next;\n\n        /* check next struct in the list */\n        next =  _libssh2_list_next(&packet->node);\n        _libssh2_list_remove(&packet->node);\n        LIBSSH2_FREE(session, packet->data);\n        LIBSSH2_FREE(session, packet);\n\n        packet = next;\n    }\n\n    while(zombie) {\n        /* figure out the next node */\n        struct sftp_zombie_requests *next = _libssh2_list_next(&zombie->node);\n        /* unlink the current one */\n        _libssh2_list_remove(&zombie->node);\n        /* free the memory */\n        LIBSSH2_FREE(session, zombie);\n        zombie = next;\n    }\n\n}\n\n/* sftp_close_handle\n *\n * Close a file or directory handle.\n * Also frees handle resource and unlinks it from the SFTP structure.\n * The handle is no longer usable after return of this function, unless\n * the return value is LIBSSH2_ERROR_EAGAIN in which case this function\n * should be called again.\n */\nstatic int\nsftp_close_handle(LIBSSH2_SFTP_HANDLE *handle)\n{\n    LIBSSH2_SFTP *sftp = handle->sftp;\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    /* 13 = packet_len(4) + packet_type(1) + request_id(4) + handle_len(4) */\n    uint32_t packet_len = handle->handle_len + 13;\n    unsigned char *s, *data = NULL;\n    int rc = 0;\n\n    if (handle->close_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Closing handle\");\n        s = handle->close_packet = LIBSSH2_ALLOC(session, packet_len);\n        if (!handle->close_packet) {\n            handle->close_state = libssh2_NB_state_idle;\n            rc = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                \"Unable to allocate memory for FXP_CLOSE \"\n                                \"packet\");\n        } else {\n\n            _libssh2_store_u32(&s, packet_len - 4);\n            *(s++) = SSH_FXP_CLOSE;\n            handle->close_request_id = sftp->request_id++;\n            _libssh2_store_u32(&s, handle->close_request_id);\n            _libssh2_store_str(&s, handle->handle, handle->handle_len);\n            handle->close_state = libssh2_NB_state_created;\n        }\n    }\n\n    if (handle->close_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, handle->close_packet,\n                                    packet_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if ((ssize_t)packet_len != rc) {\n            handle->close_state = libssh2_NB_state_idle;\n            rc = _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                \"Unable to send FXP_CLOSE command\");\n        } else\n            handle->close_state = libssh2_NB_state_sent;\n\n        LIBSSH2_FREE(session, handle->close_packet);\n        handle->close_packet = NULL;\n    }\n\n    if (handle->close_state == libssh2_NB_state_sent) {\n        rc = sftp_packet_require(sftp, SSH_FXP_STATUS,\n                                 handle->close_request_id, &data,\n                                 &data_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n\n        } else if (rc) {\n            _libssh2_error(session, rc,\n                           \"Error waiting for status message\");\n        }\n\n        handle->close_state = libssh2_NB_state_sent1;\n    }\n\n    if(!data) {\n        /* if it reaches this point with data unset, something unwanted\n           happened for which we should have set an error code */\n        assert(rc);\n\n    } else {\n        int retcode = _libssh2_ntohu32(data + 5);\n        LIBSSH2_FREE(session, data);\n\n        if (retcode != LIBSSH2_FX_OK) {\n            sftp->last_errno = retcode;\n            handle->close_state = libssh2_NB_state_idle;\n            rc = _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                \"SFTP Protocol Error\");\n        }\n    }\n\n    /* remove this handle from the parent's list */\n    _libssh2_list_remove(&handle->node);\n\n    if ((handle->handle_type == LIBSSH2_SFTP_HANDLE_DIR)\n        && handle->u.dir.names_left) {\n        LIBSSH2_FREE(session, handle->u.dir.names_packet);\n    }\n    else {\n        if(handle->u.file.data)\n            LIBSSH2_FREE(session, handle->u.file.data);\n    }\n\n    sftp_packetlist_flush(handle);\n    sftp->read_state = libssh2_NB_state_idle;\n\n    handle->close_state = libssh2_NB_state_idle;\n\n    LIBSSH2_FREE(session, handle);\n\n    return rc;\n}\n\n/* libssh2_sftp_close_handle\n *\n * Close a file or directory handle\n * Also frees handle resource and unlinks it from the SFTP structure\n */\nLIBSSH2_API int\nlibssh2_sftp_close_handle(LIBSSH2_SFTP_HANDLE *hnd)\n{\n    int rc;\n    if(!hnd)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, hnd->sftp->channel->session, sftp_close_handle(hnd));\n    return rc;\n}\n\n/* sftp_unlink\n * Delete a file from the remote server\n */\nstatic int sftp_unlink(LIBSSH2_SFTP *sftp, const char *filename,\n                       size_t filename_len)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    int retcode;\n    /* 13 = packet_len(4) + packet_type(1) + request_id(4) + filename_len(4) */\n    uint32_t packet_len = filename_len + 13;\n    unsigned char *s, *data;\n    int rc;\n\n    if (sftp->unlink_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Unlinking %s\", filename);\n        s = sftp->unlink_packet = LIBSSH2_ALLOC(session, packet_len);\n        if (!sftp->unlink_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for FXP_REMOVE \"\n                                  \"packet\");\n        }\n\n        _libssh2_store_u32(&s, packet_len - 4);\n        *(s++) = SSH_FXP_REMOVE;\n        sftp->unlink_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->unlink_request_id);\n        _libssh2_store_str(&s, filename, filename_len);\n        sftp->unlink_state = libssh2_NB_state_created;\n    }\n\n    if (sftp->unlink_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, sftp->unlink_packet,\n                                    packet_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if ((ssize_t)packet_len != rc) {\n            LIBSSH2_FREE(session, sftp->unlink_packet);\n            sftp->unlink_packet = NULL;\n            sftp->unlink_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send FXP_REMOVE command\");\n        }\n        LIBSSH2_FREE(session, sftp->unlink_packet);\n        sftp->unlink_packet = NULL;\n\n        sftp->unlink_state = libssh2_NB_state_sent;\n    }\n\n    rc = sftp_packet_require(sftp, SSH_FXP_STATUS,\n                             sftp->unlink_request_id, &data,\n                             &data_len);\n    if (rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    }\n    else if (rc) {\n        sftp->unlink_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Error waiting for FXP STATUS\");\n    }\n\n    sftp->unlink_state = libssh2_NB_state_idle;\n\n    retcode = _libssh2_ntohu32(data + 5);\n    LIBSSH2_FREE(session, data);\n\n    if (retcode == LIBSSH2_FX_OK) {\n        return 0;\n    } else {\n        sftp->last_errno = retcode;\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP Protocol Error\");\n    }\n}\n\n/* libssh2_sftp_unlink_ex\n * Delete a file from the remote server\n */\nLIBSSH2_API int\nlibssh2_sftp_unlink_ex(LIBSSH2_SFTP *sftp, const char *filename,\n                       unsigned int filename_len)\n{\n    int rc;\n    if(!sftp)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, sftp->channel->session,\n                 sftp_unlink(sftp, filename, filename_len));\n    return rc;\n}\n\n/*\n * sftp_rename\n *\n * Rename a file on the remote server\n */\nstatic int sftp_rename(LIBSSH2_SFTP *sftp, const char *source_filename,\n                       unsigned int source_filename_len,\n                       const char *dest_filename,\n                       unsigned int dest_filename_len, long flags)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    int retcode;\n    uint32_t packet_len =\n        source_filename_len + dest_filename_len + 17 + (sftp->version >=\n                                                        5 ? 4 : 0);\n    /* packet_len(4) + packet_type(1) + request_id(4) +\n       source_filename_len(4) + dest_filename_len(4) + flags(4){SFTP5+) */\n    unsigned char *data;\n    ssize_t rc;\n\n    if (sftp->version < 2) {\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"Server does not support RENAME\");\n    }\n\n    if (sftp->rename_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Renaming %s to %s\",\n                       source_filename, dest_filename);\n        sftp->rename_s = sftp->rename_packet =\n            LIBSSH2_ALLOC(session, packet_len);\n        if (!sftp->rename_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for FXP_RENAME \"\n                                  \"packet\");\n        }\n\n        _libssh2_store_u32(&sftp->rename_s, packet_len - 4);\n        *(sftp->rename_s++) = SSH_FXP_RENAME;\n        sftp->rename_request_id = sftp->request_id++;\n        _libssh2_store_u32(&sftp->rename_s, sftp->rename_request_id);\n        _libssh2_store_str(&sftp->rename_s, source_filename,\n                           source_filename_len);\n        _libssh2_store_str(&sftp->rename_s, dest_filename, dest_filename_len);\n\n        if (sftp->version >= 5)\n            _libssh2_store_u32(&sftp->rename_s, flags);\n\n        sftp->rename_state = libssh2_NB_state_created;\n    }\n\n    if (sftp->rename_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, sftp->rename_packet,\n                                    sftp->rename_s - sftp->rename_packet);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if ((ssize_t)packet_len != rc) {\n            LIBSSH2_FREE(session, sftp->rename_packet);\n            sftp->rename_packet = NULL;\n            sftp->rename_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send FXP_RENAME command\");\n        }\n        LIBSSH2_FREE(session, sftp->rename_packet);\n        sftp->rename_packet = NULL;\n\n        sftp->rename_state = libssh2_NB_state_sent;\n    }\n\n    rc = sftp_packet_require(sftp, SSH_FXP_STATUS,\n                             sftp->rename_request_id, &data,\n                             &data_len);\n    if (rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    } else if (rc) {\n        sftp->rename_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Error waiting for FXP STATUS\");\n    }\n\n    sftp->rename_state = libssh2_NB_state_idle;\n\n    retcode = _libssh2_ntohu32(data + 5);\n    LIBSSH2_FREE(session, data);\n\n    sftp->last_errno = retcode;\n\n    /* now convert the SFTP error code to libssh2 return code or error\n       message */\n    switch (retcode) {\n    case LIBSSH2_FX_OK:\n        retcode = LIBSSH2_ERROR_NONE;\n        break;\n\n    case LIBSSH2_FX_FILE_ALREADY_EXISTS:\n        retcode = _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                 \"File already exists and \"\n                                 \"SSH_FXP_RENAME_OVERWRITE not specified\");\n        break;\n\n    case LIBSSH2_FX_OP_UNSUPPORTED:\n        retcode = _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                 \"Operation Not Supported\");\n        break;\n\n    default:\n        retcode = _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                 \"SFTP Protocol Error\");\n        break;\n    }\n\n    return retcode;\n}\n\n/* libssh2_sftp_rename_ex\n * Rename a file on the remote server\n */\nLIBSSH2_API int\nlibssh2_sftp_rename_ex(LIBSSH2_SFTP *sftp, const char *source_filename,\n                       unsigned int source_filename_len,\n                       const char *dest_filename,\n                       unsigned int dest_filename_len, long flags)\n{\n    int rc;\n    if(!sftp)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, sftp->channel->session,\n                 sftp_rename(sftp, source_filename, source_filename_len,\n                             dest_filename, dest_filename_len, flags));\n    return rc;\n}\n\n/*\n * sftp_fstatvfs\n *\n * Get file system statistics\n */\nstatic int sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle, LIBSSH2_SFTP_STATVFS *st)\n{\n    LIBSSH2_SFTP *sftp = handle->sftp;\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    /* 17 = packet_len(4) + packet_type(1) + request_id(4) + ext_len(4)\n       + handle_len (4) */\n    /* 20 = strlen (\"fstatvfs@openssh.com\") */\n    uint32_t packet_len = handle->handle_len + 20 + 17;\n    unsigned char *packet, *s, *data;\n    ssize_t rc;\n    unsigned int flag;\n    static const unsigned char responses[2] =\n        { SSH_FXP_EXTENDED_REPLY, SSH_FXP_STATUS };\n\n    if (sftp->fstatvfs_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Getting file system statistics\");\n        s = packet = LIBSSH2_ALLOC(session, packet_len);\n        if (!packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for FXP_EXTENDED \"\n                                  \"packet\");\n        }\n\n        _libssh2_store_u32(&s, packet_len - 4);\n        *(s++) = SSH_FXP_EXTENDED;\n        sftp->fstatvfs_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->fstatvfs_request_id);\n        _libssh2_store_str(&s, \"fstatvfs@openssh.com\", 20);\n        _libssh2_store_str(&s, handle->handle, handle->handle_len);\n\n        sftp->fstatvfs_state = libssh2_NB_state_created;\n    }\n    else {\n        packet = sftp->fstatvfs_packet;\n    }\n\n    if (sftp->fstatvfs_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, packet, packet_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN ||\n            (0 <= rc && rc < (ssize_t)packet_len)) {\n            sftp->fstatvfs_packet = packet;\n            return LIBSSH2_ERROR_EAGAIN;\n        }\n\n        LIBSSH2_FREE(session, packet);\n        sftp->fstatvfs_packet = NULL;\n\n        if (rc < 0) {\n            sftp->fstatvfs_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"_libssh2_channel_write() failed\");\n        }\n        sftp->fstatvfs_state = libssh2_NB_state_sent;\n    }\n\n    rc = sftp_packet_requirev(sftp, 2, responses, sftp->fstatvfs_request_id,\n                              &data, &data_len);\n\n    if (rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    } else if (rc) {\n        sftp->fstatvfs_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Error waiting for FXP EXTENDED REPLY\");\n    }\n\n    if (data[0] == SSH_FXP_STATUS) {\n        int retcode = _libssh2_ntohu32(data + 5);\n        sftp->fstatvfs_state = libssh2_NB_state_idle;\n        LIBSSH2_FREE(session, data);\n        sftp->last_errno = retcode;\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP Protocol Error\");\n    }\n\n    if (data_len < 93) {\n        LIBSSH2_FREE(session, data);\n        sftp->fstatvfs_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP Protocol Error: short response\");\n    }\n\n    sftp->fstatvfs_state = libssh2_NB_state_idle;\n\n    st->f_bsize = _libssh2_ntohu64(data + 5);\n    st->f_frsize = _libssh2_ntohu64(data + 13);\n    st->f_blocks = _libssh2_ntohu64(data + 21);\n    st->f_bfree = _libssh2_ntohu64(data + 29);\n    st->f_bavail = _libssh2_ntohu64(data + 37);\n    st->f_files = _libssh2_ntohu64(data + 45);\n    st->f_ffree = _libssh2_ntohu64(data + 53);\n    st->f_favail = _libssh2_ntohu64(data + 61);\n    st->f_fsid = _libssh2_ntohu64(data + 69);\n    flag = (unsigned int)_libssh2_ntohu64(data + 77);\n    st->f_namemax = _libssh2_ntohu64(data + 85);\n\n    st->f_flag = (flag & SSH_FXE_STATVFS_ST_RDONLY)\n        ? LIBSSH2_SFTP_ST_RDONLY : 0;\n    st->f_flag |= (flag & SSH_FXE_STATVFS_ST_NOSUID)\n        ? LIBSSH2_SFTP_ST_NOSUID : 0;\n\n    LIBSSH2_FREE(session, data);\n    return 0;\n}\n\n/* libssh2_sftp_fstatvfs\n * Get filesystem space and inode utilization (requires fstatvfs@openssh.com\n * support on the server)\n */\nLIBSSH2_API int\nlibssh2_sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle, LIBSSH2_SFTP_STATVFS *st)\n{\n    int rc;\n    if(!handle || !st)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, handle->sftp->channel->session, sftp_fstatvfs(handle, st));\n    return rc;\n}\n\n/*\n * sftp_statvfs\n *\n * Get file system statistics\n */\nstatic int sftp_statvfs(LIBSSH2_SFTP *sftp, const char *path,\n                        unsigned int path_len, LIBSSH2_SFTP_STATVFS *st)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    /* 17 = packet_len(4) + packet_type(1) + request_id(4) + ext_len(4)\n       + path_len (4) */\n    /* 19 = strlen (\"statvfs@openssh.com\") */\n    uint32_t packet_len = path_len + 19 + 17;\n    unsigned char *packet, *s, *data;\n    ssize_t rc;\n    unsigned int flag;\n    static const unsigned char responses[2] =\n        { SSH_FXP_EXTENDED_REPLY, SSH_FXP_STATUS };\n\n    if (sftp->statvfs_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Getting file system statistics of %s\", path);\n        s = packet = LIBSSH2_ALLOC(session, packet_len);\n        if (!packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for FXP_EXTENDED \"\n                                  \"packet\");\n        }\n\n        _libssh2_store_u32(&s, packet_len - 4);\n        *(s++) = SSH_FXP_EXTENDED;\n        sftp->statvfs_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->statvfs_request_id);\n        _libssh2_store_str(&s, \"statvfs@openssh.com\", 19);\n        _libssh2_store_str(&s, path, path_len);\n\n        sftp->statvfs_state = libssh2_NB_state_created;\n    }\n    else {\n        packet = sftp->statvfs_packet;\n    }\n\n    if (sftp->statvfs_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, packet, packet_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN ||\n            (0 <= rc && rc < (ssize_t)packet_len)) {\n            sftp->statvfs_packet = packet;\n            return LIBSSH2_ERROR_EAGAIN;\n        }\n\n        LIBSSH2_FREE(session, packet);\n        sftp->statvfs_packet = NULL;\n\n        if (rc < 0) {\n            sftp->statvfs_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"_libssh2_channel_write() failed\");\n        }\n        sftp->statvfs_state = libssh2_NB_state_sent;\n    }\n\n    rc = sftp_packet_requirev(sftp, 2, responses, sftp->statvfs_request_id,\n                              &data, &data_len);\n    if (rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    } else if (rc) {\n        sftp->statvfs_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Error waiting for FXP EXTENDED REPLY\");\n    }\n\n    if (data[0] == SSH_FXP_STATUS) {\n        int retcode = _libssh2_ntohu32(data + 5);\n        sftp->statvfs_state = libssh2_NB_state_idle;\n        LIBSSH2_FREE(session, data);\n        sftp->last_errno = retcode;\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP Protocol Error\");\n    }\n\n    if (data_len < 93) {\n        LIBSSH2_FREE(session, data);\n        sftp->statvfs_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP Protocol Error: short response\");\n    }\n\n    sftp->statvfs_state = libssh2_NB_state_idle;\n\n    st->f_bsize = _libssh2_ntohu64(data + 5);\n    st->f_frsize = _libssh2_ntohu64(data + 13);\n    st->f_blocks = _libssh2_ntohu64(data + 21);\n    st->f_bfree = _libssh2_ntohu64(data + 29);\n    st->f_bavail = _libssh2_ntohu64(data + 37);\n    st->f_files = _libssh2_ntohu64(data + 45);\n    st->f_ffree = _libssh2_ntohu64(data + 53);\n    st->f_favail = _libssh2_ntohu64(data + 61);\n    st->f_fsid = _libssh2_ntohu64(data + 69);\n    flag = (unsigned int)_libssh2_ntohu64(data + 77);\n    st->f_namemax = _libssh2_ntohu64(data + 85);\n\n    st->f_flag = (flag & SSH_FXE_STATVFS_ST_RDONLY)\n        ? LIBSSH2_SFTP_ST_RDONLY : 0;\n    st->f_flag |= (flag & SSH_FXE_STATVFS_ST_NOSUID)\n        ? LIBSSH2_SFTP_ST_NOSUID : 0;\n\n    LIBSSH2_FREE(session, data);\n    return 0;\n}\n\n/* libssh2_sftp_statvfs_ex\n * Get filesystem space and inode utilization (requires statvfs@openssh.com\n * support on the server)\n */\nLIBSSH2_API int\nlibssh2_sftp_statvfs(LIBSSH2_SFTP *sftp, const char *path,\n                     size_t path_len, LIBSSH2_SFTP_STATVFS *st)\n{\n    int rc;\n    if(!sftp || !st)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, sftp->channel->session, sftp_statvfs(sftp, path, path_len,\n                                                          st));\n    return rc;\n}\n\n\n/*\n * sftp_mkdir\n *\n * Create an SFTP directory\n */\nstatic int sftp_mkdir(LIBSSH2_SFTP *sftp, const char *path,\n                      unsigned int path_len, long mode)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    LIBSSH2_SFTP_ATTRIBUTES attrs = {\n        LIBSSH2_SFTP_ATTR_PERMISSIONS, 0, 0, 0, 0, 0, 0\n    };\n    size_t data_len;\n    int retcode;\n    /* 13 = packet_len(4) + packet_type(1) + request_id(4) + path_len(4) */\n    ssize_t packet_len = path_len + 13 +\n        sftp_attrsize(LIBSSH2_SFTP_ATTR_PERMISSIONS);\n    unsigned char *packet, *s, *data;\n    int rc;\n\n    if (sftp->mkdir_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Creating directory %s with mode 0%lo\", path, mode);\n        s = packet = LIBSSH2_ALLOC(session, packet_len);\n        if (!packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for FXP_MKDIR \"\n                                  \"packet\");\n        }\n        /* Filetype in SFTP 3 and earlier */\n        attrs.permissions = mode | LIBSSH2_SFTP_ATTR_PFILETYPE_DIR;\n\n        _libssh2_store_u32(&s, packet_len - 4);\n        *(s++) = SSH_FXP_MKDIR;\n        sftp->mkdir_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->mkdir_request_id);\n        _libssh2_store_str(&s, path, path_len);\n\n        s += sftp_attr2bin(s, &attrs);\n\n        sftp->mkdir_state = libssh2_NB_state_created;\n    }\n    else {\n        packet = sftp->mkdir_packet;\n    }\n\n    if (sftp->mkdir_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, packet, packet_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            sftp->mkdir_packet = packet;\n            return rc;\n        }\n        if (packet_len != rc) {\n            LIBSSH2_FREE(session, packet);\n            sftp->mkdir_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"_libssh2_channel_write() failed\");\n        }\n        LIBSSH2_FREE(session, packet);\n        sftp->mkdir_state = libssh2_NB_state_sent;\n        sftp->mkdir_packet = NULL;\n    }\n\n    rc = sftp_packet_require(sftp, SSH_FXP_STATUS, sftp->mkdir_request_id,\n                             &data, &data_len);\n    if (rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    } else if (rc) {\n        sftp->mkdir_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Error waiting for FXP STATUS\");\n    }\n\n    sftp->mkdir_state = libssh2_NB_state_idle;\n\n    retcode = _libssh2_ntohu32(data + 5);\n    LIBSSH2_FREE(session, data);\n\n    if (retcode == LIBSSH2_FX_OK) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"OK!\");\n        return 0;\n    } else {\n        sftp->last_errno = retcode;\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP Protocol Error\");\n    }\n}\n\n/*\n * libssh2_sftp_mkdir_ex\n *\n * Create an SFTP directory\n */\nLIBSSH2_API int\nlibssh2_sftp_mkdir_ex(LIBSSH2_SFTP *sftp, const char *path,\n                      unsigned int path_len, long mode)\n{\n    int rc;\n    if(!sftp)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, sftp->channel->session,\n                 sftp_mkdir(sftp, path, path_len, mode));\n    return rc;\n}\n\n/* sftp_rmdir\n * Remove a directory\n */\nstatic int sftp_rmdir(LIBSSH2_SFTP *sftp, const char *path,\n                      unsigned int path_len)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    int retcode;\n    /* 13 = packet_len(4) + packet_type(1) + request_id(4) + path_len(4) */\n    ssize_t packet_len = path_len + 13;\n    unsigned char *s, *data;\n    int rc;\n\n    if (sftp->rmdir_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Removing directory: %s\",\n                       path);\n        s = sftp->rmdir_packet = LIBSSH2_ALLOC(session, packet_len);\n        if (!sftp->rmdir_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for FXP_RMDIR \"\n                                  \"packet\");\n        }\n\n        _libssh2_store_u32(&s, packet_len - 4);\n        *(s++) = SSH_FXP_RMDIR;\n        sftp->rmdir_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->rmdir_request_id);\n        _libssh2_store_str(&s, path, path_len);\n\n        sftp->rmdir_state = libssh2_NB_state_created;\n    }\n\n    if (sftp->rmdir_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, sftp->rmdir_packet,\n                                    packet_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (packet_len != rc) {\n            LIBSSH2_FREE(session, sftp->rmdir_packet);\n            sftp->rmdir_packet = NULL;\n            sftp->rmdir_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send FXP_RMDIR command\");\n        }\n        LIBSSH2_FREE(session, sftp->rmdir_packet);\n        sftp->rmdir_packet = NULL;\n\n        sftp->rmdir_state = libssh2_NB_state_sent;\n    }\n\n    rc = sftp_packet_require(sftp, SSH_FXP_STATUS,\n                             sftp->rmdir_request_id, &data, &data_len);\n    if (rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    } else if (rc) {\n        sftp->rmdir_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Error waiting for FXP STATUS\");\n    }\n\n    sftp->rmdir_state = libssh2_NB_state_idle;\n\n    retcode = _libssh2_ntohu32(data + 5);\n    LIBSSH2_FREE(session, data);\n\n    if (retcode == LIBSSH2_FX_OK) {\n        return 0;\n    } else {\n        sftp->last_errno = retcode;\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP Protocol Error\");\n    }\n}\n\n/* libssh2_sftp_rmdir_ex\n * Remove a directory\n */\nLIBSSH2_API int\nlibssh2_sftp_rmdir_ex(LIBSSH2_SFTP *sftp, const char *path,\n                      unsigned int path_len)\n{\n    int rc;\n    if(!sftp)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, sftp->channel->session,\n                 sftp_rmdir(sftp, path, path_len));\n    return rc;\n}\n\n/* sftp_stat\n * Stat a file or symbolic link\n */\nstatic int sftp_stat(LIBSSH2_SFTP *sftp, const char *path,\n                     unsigned int path_len, int stat_type,\n                     LIBSSH2_SFTP_ATTRIBUTES * attrs)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    /* 13 = packet_len(4) + packet_type(1) + request_id(4) + path_len(4) */\n    ssize_t packet_len =\n        path_len + 13 +\n        ((stat_type ==\n          LIBSSH2_SFTP_SETSTAT) ? sftp_attrsize(attrs->flags) : 0);\n    unsigned char *s, *data;\n    static const unsigned char stat_responses[2] =\n        { SSH_FXP_ATTRS, SSH_FXP_STATUS };\n    int rc;\n\n    if (sftp->stat_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"%s %s\",\n                       (stat_type == LIBSSH2_SFTP_SETSTAT) ? \"Set-statting\" :\n                       (stat_type ==\n                        LIBSSH2_SFTP_LSTAT ? \"LStatting\" : \"Statting\"), path);\n        s = sftp->stat_packet = LIBSSH2_ALLOC(session, packet_len);\n        if (!sftp->stat_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for FXP_*STAT \"\n                                  \"packet\");\n        }\n\n        _libssh2_store_u32(&s, packet_len - 4);\n\n        switch (stat_type) {\n        case LIBSSH2_SFTP_SETSTAT:\n            *(s++) = SSH_FXP_SETSTAT;\n            break;\n\n        case LIBSSH2_SFTP_LSTAT:\n            *(s++) = SSH_FXP_LSTAT;\n            break;\n\n        case LIBSSH2_SFTP_STAT:\n        default:\n            *(s++) = SSH_FXP_STAT;\n        }\n        sftp->stat_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->stat_request_id);\n        _libssh2_store_str(&s, path, path_len);\n\n        if (stat_type == LIBSSH2_SFTP_SETSTAT)\n            s += sftp_attr2bin(s, attrs);\n\n        sftp->stat_state = libssh2_NB_state_created;\n    }\n\n    if (sftp->stat_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, sftp->stat_packet, packet_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        } else if (packet_len != rc) {\n            LIBSSH2_FREE(session, sftp->stat_packet);\n            sftp->stat_packet = NULL;\n            sftp->stat_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send STAT/LSTAT/SETSTAT command\");\n        }\n        LIBSSH2_FREE(session, sftp->stat_packet);\n        sftp->stat_packet = NULL;\n\n        sftp->stat_state = libssh2_NB_state_sent;\n    }\n\n    rc = sftp_packet_requirev(sftp, 2, stat_responses,\n                              sftp->stat_request_id, &data, &data_len);\n    if (rc == LIBSSH2_ERROR_EAGAIN)\n        return rc;\n    else if (rc) {\n        sftp->stat_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Timeout waiting for status message\");\n    }\n\n    sftp->stat_state = libssh2_NB_state_idle;\n\n    if (data[0] == SSH_FXP_STATUS) {\n        int retcode;\n\n        retcode = _libssh2_ntohu32(data + 5);\n        LIBSSH2_FREE(session, data);\n        if (retcode == LIBSSH2_FX_OK) {\n            return 0;\n        } else {\n            sftp->last_errno = retcode;\n            return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                  \"SFTP Protocol Error\");\n        }\n    }\n\n    memset(attrs, 0, sizeof(LIBSSH2_SFTP_ATTRIBUTES));\n    sftp_bin2attr(attrs, data + 5);\n    LIBSSH2_FREE(session, data);\n\n    return 0;\n}\n\n/* libssh2_sftp_stat_ex\n * Stat a file or symbolic link\n */\nLIBSSH2_API int\nlibssh2_sftp_stat_ex(LIBSSH2_SFTP *sftp, const char *path,\n                     unsigned int path_len, int stat_type,\n                     LIBSSH2_SFTP_ATTRIBUTES *attrs)\n{\n    int rc;\n    if(!sftp)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, sftp->channel->session,\n                 sftp_stat(sftp, path, path_len, stat_type, attrs));\n    return rc;\n}\n\n/* sftp_symlink\n * Read or set a symlink\n */\nstatic int sftp_symlink(LIBSSH2_SFTP *sftp, const char *path,\n                        unsigned int path_len, char *target,\n                        unsigned int target_len, int link_type)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len, link_len;\n    /* 13 = packet_len(4) + packet_type(1) + request_id(4) + path_len(4) */\n    ssize_t packet_len =\n        path_len + 13 +\n        ((link_type == LIBSSH2_SFTP_SYMLINK) ? (4 + target_len) : 0);\n    unsigned char *s, *data;\n    static const unsigned char link_responses[2] =\n        { SSH_FXP_NAME, SSH_FXP_STATUS };\n    int retcode;\n\n    if ((sftp->version < 3) && (link_type != LIBSSH2_SFTP_REALPATH)) {\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"Server does not support SYMLINK or READLINK\");\n    }\n\n    if (sftp->symlink_state == libssh2_NB_state_idle) {\n        s = sftp->symlink_packet = LIBSSH2_ALLOC(session, packet_len);\n        if (!sftp->symlink_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"SYMLINK/READLINK/REALPATH packet\");\n        }\n\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"%s %s on %s\",\n                       (link_type ==\n                        LIBSSH2_SFTP_SYMLINK) ? \"Creating\" : \"Reading\",\n                       (link_type ==\n                        LIBSSH2_SFTP_REALPATH) ? \"realpath\" : \"symlink\", path);\n\n        _libssh2_store_u32(&s, packet_len - 4);\n\n        switch (link_type) {\n        case LIBSSH2_SFTP_REALPATH:\n            *(s++) = SSH_FXP_REALPATH;\n            break;\n\n        case LIBSSH2_SFTP_SYMLINK:\n            *(s++) = SSH_FXP_SYMLINK;\n            break;\n\n        case LIBSSH2_SFTP_READLINK:\n        default:\n            *(s++) = SSH_FXP_READLINK;\n        }\n        sftp->symlink_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->symlink_request_id);\n        _libssh2_store_str(&s, path, path_len);\n\n        if (link_type == LIBSSH2_SFTP_SYMLINK)\n            _libssh2_store_str(&s, target, target_len);\n\n        sftp->symlink_state = libssh2_NB_state_created;\n    }\n\n    if (sftp->symlink_state == libssh2_NB_state_created) {\n        ssize_t rc = _libssh2_channel_write(channel, 0, sftp->symlink_packet,\n                                            packet_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN)\n            return rc;\n        else if (packet_len != rc) {\n            LIBSSH2_FREE(session, sftp->symlink_packet);\n            sftp->symlink_packet = NULL;\n            sftp->symlink_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send SYMLINK/READLINK command\");\n        }\n        LIBSSH2_FREE(session, sftp->symlink_packet);\n        sftp->symlink_packet = NULL;\n\n        sftp->symlink_state = libssh2_NB_state_sent;\n    }\n\n    retcode = sftp_packet_requirev(sftp, 2, link_responses,\n                                   sftp->symlink_request_id, &data,\n                                   &data_len);\n    if (retcode == LIBSSH2_ERROR_EAGAIN)\n        return retcode;\n    else if (retcode) {\n        sftp->symlink_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, retcode,\n                              \"Error waiting for status message\");\n    }\n\n    sftp->symlink_state = libssh2_NB_state_idle;\n\n    if (data[0] == SSH_FXP_STATUS) {\n        int retcode;\n\n        retcode = _libssh2_ntohu32(data + 5);\n        LIBSSH2_FREE(session, data);\n        if (retcode == LIBSSH2_FX_OK)\n            return LIBSSH2_ERROR_NONE;\n        else {\n            sftp->last_errno = retcode;\n            return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                  \"SFTP Protocol Error\");\n        }\n    }\n\n    if (_libssh2_ntohu32(data + 5) < 1) {\n        LIBSSH2_FREE(session, data);\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"Invalid READLINK/REALPATH response, \"\n                              \"no name entries\");\n    }\n\n    /* this reads a u32 and stores it into a signed 32bit value */\n    link_len = _libssh2_ntohu32(data + 9);\n    if (link_len < target_len) {\n        memcpy(target, data + 13, link_len);\n        target[link_len] = 0;\n        retcode = (int)link_len;\n    }\n    else\n        retcode = LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n    LIBSSH2_FREE(session, data);\n\n    return retcode;\n}\n\n/* libssh2_sftp_symlink_ex\n * Read or set a symlink\n */\nLIBSSH2_API int\nlibssh2_sftp_symlink_ex(LIBSSH2_SFTP *sftp, const char *path,\n                        unsigned int path_len, char *target,\n                        unsigned int target_len, int link_type)\n{\n    int rc;\n    if(!sftp)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, sftp->channel->session,\n                 sftp_symlink(sftp, path, path_len, target, target_len,\n                              link_type));\n    return rc;\n}\n\n/* libssh2_sftp_last_error\n * Returns the last error code reported by SFTP\n */\nLIBSSH2_API unsigned long\nlibssh2_sftp_last_error(LIBSSH2_SFTP *sftp)\n{\n    if(!sftp)\n        return 0;\n\n    return sftp->last_errno;\n}\n\n/* libssh2_sftp_get_channel\n * Return the channel of sftp, then caller can control the channel's behavior.\n */\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_sftp_get_channel(LIBSSH2_SFTP *sftp)\n{\n    if (!sftp)\n        return NULL;\n\n    return sftp->channel;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/sftp.h",
    "content": "#ifndef _LIBSSH2_SFTP_H\n#define _LIBSSH2_SFTP_H\n/*\n * Copyright (C) 2010 - 2012 by Daniel Stenberg\n * Author: Daniel Stenberg <daniel@haxx.se>\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n */\n\n/*\n * MAX_SFTP_OUTGOING_SIZE MUST not be larger than 32500 or so. This is the\n * amount of data sent in each FXP_WRITE packet\n */\n#define MAX_SFTP_OUTGOING_SIZE 30000\n\n/* MAX_SFTP_READ_SIZE is how much data is asked for at max in each FXP_READ\n * packets.\n */\n#define MAX_SFTP_READ_SIZE 30000\n\nstruct sftp_pipeline_chunk {\n    struct list_node node;\n    libssh2_uint64_t offset; /* READ: offset at which to start reading\n                                WRITE: not used */\n    size_t len; /* WRITE: size of the data to write\n                   READ: how many bytes that was asked for */\n    size_t sent;\n    ssize_t lefttosend; /* if 0, the entire packet has been sent off */\n    uint32_t request_id;\n    unsigned char packet[1]; /* data */\n};\n\nstruct sftp_zombie_requests {\n    struct list_node node;\n    uint32_t request_id;\n};\n\n#ifndef MIN\n#define MIN(x,y) ((x)<(y)?(x):(y))\n#endif\n\nstruct _LIBSSH2_SFTP_PACKET\n{\n    struct list_node node;   /* linked list header */\n    uint32_t request_id;\n    unsigned char *data;\n    size_t data_len;              /* payload size */\n};\n\ntypedef struct _LIBSSH2_SFTP_PACKET LIBSSH2_SFTP_PACKET;\n\n#define SFTP_HANDLE_MAXLEN 256 /* according to spec! */\n\nstruct _LIBSSH2_SFTP_HANDLE\n{\n    struct list_node node;\n\n    LIBSSH2_SFTP *sftp;\n\n    char handle[SFTP_HANDLE_MAXLEN];\n    size_t handle_len;\n\n    enum {\n        LIBSSH2_SFTP_HANDLE_FILE,\n        LIBSSH2_SFTP_HANDLE_DIR\n    } handle_type;\n\n    union _libssh2_sftp_handle_data\n    {\n        struct _libssh2_sftp_handle_file_data\n        {\n            libssh2_uint64_t offset;\n            libssh2_uint64_t offset_sent;\n            size_t acked; /* container for acked data that hasn't been\n                             returned to caller yet, used for sftp_write */\n\n            /* 'data' is used by sftp_read() and is allocated data that has\n               been received already from the server but wasn't returned to\n               the caller yet. It is of size 'data_len' and 'data_left is the\n               number of bytes not yet returned, counted from the end of the\n               buffer. */\n            unsigned char *data;\n            size_t data_len;\n            size_t data_left;\n\n            char eof; /* we have read to the end */\n        } file;\n        struct _libssh2_sftp_handle_dir_data\n        {\n            uint32_t names_left;\n            void *names_packet;\n            char *next_name;\n        } dir;\n    } u;\n\n    /* State variables used in libssh2_sftp_close_handle() */\n    libssh2_nonblocking_states close_state;\n    uint32_t close_request_id;\n    unsigned char *close_packet;\n\n    /* list of outstanding packets sent to server */\n    struct list_head packet_list;\n\n};\n\nstruct _LIBSSH2_SFTP\n{\n    LIBSSH2_CHANNEL *channel;\n\n    uint32_t request_id, version;\n\n    struct list_head packets;\n\n    /* List of FXP_READ responses to ignore because EOF already received. */\n    struct list_head zombie_requests;\n\n    /* a list of _LIBSSH2_SFTP_HANDLE structs */\n    struct list_head sftp_handles;\n\n    uint32_t last_errno;\n\n    /* Holder for partial packet, use in libssh2_sftp_packet_read() */\n    unsigned char partial_size[4];      /* buffer for size field   */\n    size_t partial_size_len;            /* size field length       */\n    unsigned char *partial_packet;      /* The data                */\n    uint32_t partial_len;               /* Desired number of bytes */\n    size_t partial_received;            /* Bytes received so far   */\n\n    /* Time that libssh2_sftp_packet_requirev() started reading */\n    time_t requirev_start;\n\n    /* State variables used in libssh2_sftp_open_ex() */\n    libssh2_nonblocking_states open_state;\n    unsigned char *open_packet;\n    uint32_t open_packet_len; /* 32 bit on the wire */\n    size_t open_packet_sent;\n    uint32_t open_request_id;\n\n    /* State variable used in sftp_read() */\n    libssh2_nonblocking_states read_state;\n\n    /* State variable used in sftp_packet_read() */\n    libssh2_nonblocking_states packet_state;\n\n    /* State variable used in sftp_write() */\n    libssh2_nonblocking_states write_state;\n\n    /* State variables used in sftp_fsync() */\n    libssh2_nonblocking_states fsync_state;\n    unsigned char *fsync_packet;\n    uint32_t fsync_request_id;\n\n    /* State variables used in libssh2_sftp_readdir() */\n    libssh2_nonblocking_states readdir_state;\n    unsigned char *readdir_packet;\n    uint32_t readdir_request_id;\n\n    /* State variables used in libssh2_sftp_fstat_ex() */\n    libssh2_nonblocking_states fstat_state;\n    unsigned char *fstat_packet;\n    uint32_t fstat_request_id;\n\n    /* State variables used in libssh2_sftp_unlink_ex() */\n    libssh2_nonblocking_states unlink_state;\n    unsigned char *unlink_packet;\n    uint32_t unlink_request_id;\n\n    /* State variables used in libssh2_sftp_rename_ex() */\n    libssh2_nonblocking_states rename_state;\n    unsigned char *rename_packet;\n    unsigned char *rename_s;\n    uint32_t rename_request_id;\n\n    /* State variables used in libssh2_sftp_fstatvfs() */\n    libssh2_nonblocking_states fstatvfs_state;\n    unsigned char *fstatvfs_packet;\n    uint32_t fstatvfs_request_id;\n\n    /* State variables used in libssh2_sftp_statvfs() */\n    libssh2_nonblocking_states statvfs_state;\n    unsigned char *statvfs_packet;\n    uint32_t statvfs_request_id;\n\n    /* State variables used in libssh2_sftp_mkdir() */\n    libssh2_nonblocking_states mkdir_state;\n    unsigned char *mkdir_packet;\n    uint32_t mkdir_request_id;\n\n    /* State variables used in libssh2_sftp_rmdir() */\n    libssh2_nonblocking_states rmdir_state;\n    unsigned char *rmdir_packet;\n    uint32_t rmdir_request_id;\n\n    /* State variables used in libssh2_sftp_stat() */\n    libssh2_nonblocking_states stat_state;\n    unsigned char *stat_packet;\n    uint32_t stat_request_id;\n\n    /* State variables used in libssh2_sftp_symlink() */\n    libssh2_nonblocking_states symlink_state;\n    unsigned char *symlink_packet;\n    uint32_t symlink_request_id;\n};\n\n#endif\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/transport.c",
    "content": "/* Copyright (C) 2007 The Written Word, Inc.  All rights reserved.\n * Copyright (C) 2009-2010 by Daniel Stenberg\n * Author: Daniel Stenberg <daniel@haxx.se>\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file handles reading and writing to the SECSH transport layer. RFC4253.\n */\n\n#include \"libssh2_priv.h\"\n#include <errno.h>\n#include <fcntl.h>\n#include <ctype.h>\n#ifdef LIBSSH2DEBUG\n#include <stdio.h>\n#endif\n\n#include <assert.h>\n\n#include \"transport.h\"\n#include \"mac.h\"\n\n#define MAX_BLOCKSIZE 32    /* MUST fit biggest crypto block size we use/get */\n#define MAX_MACSIZE 64      /* MUST fit biggest MAC length we support */\n\n#ifdef LIBSSH2DEBUG\n#define UNPRINTABLE_CHAR '.'\nstatic void\ndebugdump(LIBSSH2_SESSION * session,\n          const char *desc, const unsigned char *ptr, size_t size)\n{\n    size_t i;\n    size_t c;\n    unsigned int width = 0x10;\n    char buffer[256];  /* Must be enough for width*4 + about 30 or so */\n    size_t used;\n    static const char* hex_chars = \"0123456789ABCDEF\";\n\n    if (!(session->showmask & LIBSSH2_TRACE_TRANS)) {\n        /* not asked for, bail out */\n        return;\n    }\n\n    used = snprintf(buffer, sizeof(buffer), \"=> %s (%d bytes)\\n\",\n                    desc, (int) size);\n    if (session->tracehandler)\n        (session->tracehandler)(session, session->tracehandler_context,\n                                buffer, used);\n    else\n        fprintf(stderr, \"%s\", buffer);\n\n    for(i = 0; i < size; i += width) {\n\n        used = snprintf(buffer, sizeof(buffer), \"%04lx: \", (long)i);\n\n        /* hex not disabled, show it */\n        for(c = 0; c < width; c++) {\n            if (i + c < size) {\n                buffer[used++] = hex_chars[(ptr[i+c] >> 4) & 0xF];\n                buffer[used++] = hex_chars[ptr[i+c] & 0xF];\n            }\n            else {\n                buffer[used++] = ' ';\n                buffer[used++] = ' ';\n            }\n\n            buffer[used++] = ' ';\n            if ((width/2) - 1 == c)\n                buffer[used++] = ' ';\n        }\n\n        buffer[used++] = ':';\n        buffer[used++] = ' ';\n\n        for(c = 0; (c < width) && (i + c < size); c++) {\n            buffer[used++] = isprint(ptr[i + c]) ?\n                ptr[i + c] : UNPRINTABLE_CHAR;\n        }\n        buffer[used++] = '\\n';\n        buffer[used] = 0;\n\n        if (session->tracehandler)\n            (session->tracehandler)(session, session->tracehandler_context,\n                                    buffer, used);\n        else\n            fprintf(stderr, \"%s\", buffer);\n    }\n}\n#else\n#define debugdump(a,x,y,z)\n#endif\n\n\n/* decrypt() decrypts 'len' bytes from 'source' to 'dest'.\n *\n * returns 0 on success and negative on failure\n */\n\nstatic int\ndecrypt(LIBSSH2_SESSION * session, unsigned char *source,\n        unsigned char *dest, int len)\n{\n    struct transportpacket *p = &session->packet;\n    int blocksize = session->remote.crypt->blocksize;\n\n    /* if we get called with a len that isn't an even number of blocksizes\n       we risk losing those extra bytes */\n    assert((len % blocksize) == 0);\n\n    while (len >= blocksize) {\n        if (session->remote.crypt->crypt(session, source, blocksize,\n                                         &session->remote.crypt_abstract)) {\n            LIBSSH2_FREE(session, p->payload);\n            return LIBSSH2_ERROR_DECRYPT;\n        }\n\n        /* if the crypt() function would write to a given address it\n           wouldn't have to memcpy() and we could avoid this memcpy()\n           too */\n        memcpy(dest, source, blocksize);\n\n        len -= blocksize;       /* less bytes left */\n        dest += blocksize;      /* advance write pointer */\n        source += blocksize;    /* advance read pointer */\n    }\n    return LIBSSH2_ERROR_NONE;         /* all is fine */\n}\n\n/*\n * fullpacket() gets called when a full packet has been received and properly\n * collected.\n */\nstatic int\nfullpacket(LIBSSH2_SESSION * session, int encrypted /* 1 or 0 */ )\n{\n    unsigned char macbuf[MAX_MACSIZE];\n    struct transportpacket *p = &session->packet;\n    int rc;\n    int compressed;\n\n    if (session->fullpacket_state == libssh2_NB_state_idle) {\n        session->fullpacket_macstate = LIBSSH2_MAC_CONFIRMED;\n        session->fullpacket_payload_len = p->packet_length - 1;\n\n        if (encrypted) {\n\n            /* Calculate MAC hash */\n            session->remote.mac->hash(session, macbuf,  /* store hash here */\n                                      session->remote.seqno,\n                                      p->init, 5,\n                                      p->payload,\n                                      session->fullpacket_payload_len,\n                                      &session->remote.mac_abstract);\n\n            /* Compare the calculated hash with the MAC we just read from\n             * the network. The read one is at the very end of the payload\n             * buffer. Note that 'payload_len' here is the packet_length\n             * field which includes the padding but not the MAC.\n             */\n            if (memcmp(macbuf, p->payload + session->fullpacket_payload_len,\n                       session->remote.mac->mac_len)) {\n                session->fullpacket_macstate = LIBSSH2_MAC_INVALID;\n            }\n        }\n\n        session->remote.seqno++;\n\n        /* ignore the padding */\n        session->fullpacket_payload_len -= p->padding_length;\n\n        /* Check for and deal with decompression */\n        compressed =\n            session->local.comp != NULL &&\n            session->local.comp->compress &&\n            ((session->state & LIBSSH2_STATE_AUTHENTICATED) ||\n             session->local.comp->use_in_auth);\n\n        if (compressed && session->remote.comp_abstract) {\n            /*\n             * The buffer for the decompression (remote.comp_abstract) is\n             * initialised in time when it is needed so as long it is NULL we\n             * cannot decompress.\n             */\n\n            unsigned char *data;\n            size_t data_len;\n            rc = session->remote.comp->decomp(session,\n                                              &data, &data_len,\n                                              LIBSSH2_PACKET_MAXDECOMP,\n                                              p->payload,\n                                              session->fullpacket_payload_len,\n                                              &session->remote.comp_abstract);\n            LIBSSH2_FREE(session, p->payload);\n            if(rc)\n                return rc;\n\n            p->payload = data;\n            session->fullpacket_payload_len = data_len;\n        }\n\n        session->fullpacket_packet_type = p->payload[0];\n\n        debugdump(session, \"libssh2_transport_read() plain\",\n                  p->payload, session->fullpacket_payload_len);\n\n        session->fullpacket_state = libssh2_NB_state_created;\n    }\n\n    if (session->fullpacket_state == libssh2_NB_state_created) {\n        rc = _libssh2_packet_add(session, p->payload,\n                                 session->fullpacket_payload_len,\n                                 session->fullpacket_macstate);\n        if (rc == LIBSSH2_ERROR_EAGAIN)\n            return rc;\n        if (rc) {\n            session->fullpacket_state = libssh2_NB_state_idle;\n            return rc;\n        }\n    }\n\n    session->fullpacket_state = libssh2_NB_state_idle;\n\n    return session->fullpacket_packet_type;\n}\n\n\n/*\n * _libssh2_transport_read\n *\n * Collect a packet into the input queue.\n *\n * Returns packet type added to input queue (0 if nothing added), or a\n * negative error number.\n */\n\n/*\n * This function reads the binary stream as specified in chapter 6 of RFC4253\n * \"The Secure Shell (SSH) Transport Layer Protocol\"\n *\n * DOES NOT call _libssh2_error() for ANY error case.\n */\nint _libssh2_transport_read(LIBSSH2_SESSION * session)\n{\n    int rc;\n    struct transportpacket *p = &session->packet;\n    int remainbuf;\n    int remainpack;\n    int numbytes;\n    int numdecrypt;\n    unsigned char block[MAX_BLOCKSIZE];\n    int blocksize;\n    int encrypted = 1;\n    size_t total_num;\n\n    /* default clear the bit */\n    session->socket_block_directions &= ~LIBSSH2_SESSION_BLOCK_INBOUND;\n\n    /*\n     * All channels, systems, subsystems, etc eventually make it down here\n     * when looking for more incoming data. If a key exchange is going on\n     * (LIBSSH2_STATE_EXCHANGING_KEYS bit is set) then the remote end will\n     * ONLY send key exchange related traffic. In non-blocking mode, there is\n     * a chance to break out of the kex_exchange function with an EAGAIN\n     * status, and never come back to it. If LIBSSH2_STATE_EXCHANGING_KEYS is\n     * active, then we must redirect to the key exchange. However, if\n     * kex_exchange is active (as in it is the one that calls this execution\n     * of packet_read, then don't redirect, as that would be an infinite loop!\n     */\n\n    if (session->state & LIBSSH2_STATE_EXCHANGING_KEYS &&\n        !(session->state & LIBSSH2_STATE_KEX_ACTIVE)) {\n\n        /* Whoever wants a packet won't get anything until the key re-exchange\n         * is done!\n         */\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS, \"Redirecting into the\"\n                       \" key re-exchange from _libssh2_transport_read\");\n        rc = _libssh2_kex_exchange(session, 1, &session->startup_key_state);\n        if (rc)\n            return rc;\n    }\n\n    /*\n     * =============================== NOTE ===============================\n     * I know this is very ugly and not a really good use of \"goto\", but\n     * this case statement would be even uglier to do it any other way\n     */\n    if (session->readPack_state == libssh2_NB_state_jump1) {\n        session->readPack_state = libssh2_NB_state_idle;\n        encrypted = session->readPack_encrypted;\n        goto libssh2_transport_read_point1;\n    }\n\n    do {\n        if (session->socket_state == LIBSSH2_SOCKET_DISCONNECTED) {\n            return LIBSSH2_ERROR_NONE;\n        }\n\n        if (session->state & LIBSSH2_STATE_NEWKEYS) {\n            blocksize = session->remote.crypt->blocksize;\n        } else {\n            encrypted = 0;      /* not encrypted */\n            blocksize = 5;      /* not strictly true, but we can use 5 here to\n                                   make the checks below work fine still */\n        }\n\n        /* read/use a whole big chunk into a temporary area stored in\n           the LIBSSH2_SESSION struct. We will decrypt data from that\n           buffer into the packet buffer so this temp one doesn't have\n           to be able to keep a whole SSH packet, just be large enough\n           so that we can read big chunks from the network layer. */\n\n        /* how much data there is remaining in the buffer to deal with\n           before we should read more from the network */\n        remainbuf = p->writeidx - p->readidx;\n\n        /* if remainbuf turns negative we have a bad internal error */\n        assert(remainbuf >= 0);\n\n        if (remainbuf < blocksize) {\n            /* If we have less than a blocksize left, it is too\n               little data to deal with, read more */\n            ssize_t nread;\n\n            /* move any remainder to the start of the buffer so\n               that we can do a full refill */\n            if (remainbuf) {\n                memmove(p->buf, &p->buf[p->readidx], remainbuf);\n                p->readidx = 0;\n                p->writeidx = remainbuf;\n            } else {\n                /* nothing to move, just zero the indexes */\n                p->readidx = p->writeidx = 0;\n            }\n\n            /* now read a big chunk from the network into the temp buffer */\n            nread =\n                LIBSSH2_RECV(session, &p->buf[remainbuf],\n                              PACKETBUFSIZE - remainbuf,\n                              LIBSSH2_SOCKET_RECV_FLAGS(session));\n            if (nread <= 0) {\n                /* check if this is due to EAGAIN and return the special\n                   return code if so, error out normally otherwise */\n                if ((nread < 0) && (nread == -EAGAIN)) {\n                    session->socket_block_directions |=\n                        LIBSSH2_SESSION_BLOCK_INBOUND;\n                    return LIBSSH2_ERROR_EAGAIN;\n                }\n                _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                               \"Error recving %d bytes (got %d)\",\n                               PACKETBUFSIZE - remainbuf, -nread);\n                return LIBSSH2_ERROR_SOCKET_RECV;\n            }\n            _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                           \"Recved %d/%d bytes to %p+%d\", nread,\n                           PACKETBUFSIZE - remainbuf, p->buf, remainbuf);\n\n            debugdump(session, \"libssh2_transport_read() raw\",\n                      &p->buf[remainbuf], nread);\n            /* advance write pointer */\n            p->writeidx += nread;\n\n            /* update remainbuf counter */\n            remainbuf = p->writeidx - p->readidx;\n        }\n\n        /* how much data to deal with from the buffer */\n        numbytes = remainbuf;\n\n        if (!p->total_num) {\n            /* No payload package area allocated yet. To know the\n               size of this payload, we need to decrypt the first\n               blocksize data. */\n\n            if (numbytes < blocksize) {\n                /* we can't act on anything less than blocksize, but this\n                   check is only done for the initial block since once we have\n                   got the start of a block we can in fact deal with fractions\n                */\n                session->socket_block_directions |=\n                    LIBSSH2_SESSION_BLOCK_INBOUND;\n                return LIBSSH2_ERROR_EAGAIN;\n            }\n\n            if (encrypted) {\n                rc = decrypt(session, &p->buf[p->readidx], block, blocksize);\n                if (rc != LIBSSH2_ERROR_NONE) {\n                    return rc;\n                }\n                /* save the first 5 bytes of the decrypted package, to be\n                   used in the hash calculation later down. */\n                memcpy(p->init, &p->buf[p->readidx], 5);\n            } else {\n                /* the data is plain, just copy it verbatim to\n                   the working block buffer */\n                memcpy(block, &p->buf[p->readidx], blocksize);\n            }\n\n            /* advance the read pointer */\n            p->readidx += blocksize;\n\n            /* we now have the initial blocksize bytes decrypted,\n             * and we can extract packet and padding length from it\n             */\n            p->packet_length = _libssh2_ntohu32(block);\n            if (p->packet_length < 1)\n                return LIBSSH2_ERROR_DECRYPT;\n\n            p->padding_length = block[4];\n\n            /* total_num is the number of bytes following the initial\n               (5 bytes) packet length and padding length fields */\n            total_num =\n                p->packet_length - 1 +\n                (encrypted ? session->remote.mac->mac_len : 0);\n\n            /* RFC4253 section 6.1 Maximum Packet Length says:\n             *\n             * \"All implementations MUST be able to process\n             * packets with uncompressed payload length of 32768\n             * bytes or less and total packet size of 35000 bytes\n             * or less (including length, padding length, payload,\n             * padding, and MAC.).\"\n             */\n            if (total_num > LIBSSH2_PACKET_MAXPAYLOAD) {\n                return LIBSSH2_ERROR_OUT_OF_BOUNDARY;\n            }\n\n            /* Get a packet handle put data into. We get one to\n               hold all data, including padding and MAC. */\n            p->payload = LIBSSH2_ALLOC(session, total_num);\n            if (!p->payload) {\n                return LIBSSH2_ERROR_ALLOC;\n            }\n            p->total_num = total_num;\n            /* init write pointer to start of payload buffer */\n            p->wptr = p->payload;\n\n            if (blocksize > 5) {\n                /* copy the data from index 5 to the end of\n                   the blocksize from the temporary buffer to\n                   the start of the decrypted buffer */\n                memcpy(p->wptr, &block[5], blocksize - 5);\n                p->wptr += blocksize - 5;       /* advance write pointer */\n            }\n\n            /* init the data_num field to the number of bytes of\n               the package read so far */\n            p->data_num = p->wptr - p->payload;\n\n            /* we already dealt with a blocksize worth of data */\n            numbytes -= blocksize;\n        }\n\n        /* how much there is left to add to the current payload\n           package */\n        remainpack = p->total_num - p->data_num;\n\n        if (numbytes > remainpack) {\n            /* if we have more data in the buffer than what is going into this\n               particular packet, we limit this round to this packet only */\n            numbytes = remainpack;\n        }\n\n        if (encrypted) {\n            /* At the end of the incoming stream, there is a MAC,\n               and we don't want to decrypt that since we need it\n               \"raw\". We MUST however decrypt the padding data\n               since it is used for the hash later on. */\n            int skip = session->remote.mac->mac_len;\n\n            /* if what we have plus numbytes is bigger than the\n               total minus the skip margin, we should lower the\n               amount to decrypt even more */\n            if ((p->data_num + numbytes) > (p->total_num - skip)) {\n                numdecrypt = (p->total_num - skip) - p->data_num;\n            } else {\n                int frac;\n                numdecrypt = numbytes;\n                frac = numdecrypt % blocksize;\n                if (frac) {\n                    /* not an aligned amount of blocks,\n                       align it */\n                    numdecrypt -= frac;\n                    /* and make it no unencrypted data\n                       after it */\n                    numbytes = 0;\n                }\n            }\n        } else {\n            /* unencrypted data should not be decrypted at all */\n            numdecrypt = 0;\n        }\n\n        /* if there are bytes to decrypt, do that */\n        if (numdecrypt > 0) {\n            /* now decrypt the lot */\n            rc = decrypt(session, &p->buf[p->readidx], p->wptr, numdecrypt);\n            if (rc != LIBSSH2_ERROR_NONE) {\n                p->total_num = 0;   /* no packet buffer available */\n                return rc;\n            }\n\n            /* advance the read pointer */\n            p->readidx += numdecrypt;\n            /* advance write pointer */\n            p->wptr += numdecrypt;\n            /* increase data_num */\n            p->data_num += numdecrypt;\n\n            /* bytes left to take care of without decryption */\n            numbytes -= numdecrypt;\n        }\n\n        /* if there are bytes to copy that aren't decrypted, simply\n           copy them as-is to the target buffer */\n        if (numbytes > 0) {\n            memcpy(p->wptr, &p->buf[p->readidx], numbytes);\n\n            /* advance the read pointer */\n            p->readidx += numbytes;\n            /* advance write pointer */\n            p->wptr += numbytes;\n            /* increase data_num */\n            p->data_num += numbytes;\n        }\n\n        /* now check how much data there's left to read to finish the\n           current packet */\n        remainpack = p->total_num - p->data_num;\n\n        if (!remainpack) {\n            /* we have a full packet */\n          libssh2_transport_read_point1:\n            rc = fullpacket(session, encrypted);\n            if (rc == LIBSSH2_ERROR_EAGAIN) {\n\n                if (session->packAdd_state != libssh2_NB_state_idle)\n                {\n                    /* fullpacket only returns LIBSSH2_ERROR_EAGAIN if\n                     * libssh2_packet_add returns LIBSSH2_ERROR_EAGAIN. If that\n                     * returns LIBSSH2_ERROR_EAGAIN but the packAdd_state is idle,\n                     * then the packet has been added to the brigade, but some\n                     * immediate action that was taken based on the packet\n                     * type (such as key re-exchange) is not yet complete.\n                     * Clear the way for a new packet to be read in.\n                     */\n                    session->readPack_encrypted = encrypted;\n                    session->readPack_state = libssh2_NB_state_jump1;\n                }\n\n                return rc;\n            }\n\n            p->total_num = 0;   /* no packet buffer available */\n\n            return rc;\n        }\n    } while (1);                /* loop */\n\n    return LIBSSH2_ERROR_SOCKET_RECV; /* we never reach this point */\n}\n\nstatic int\nsend_existing(LIBSSH2_SESSION *session, const unsigned char *data,\n              size_t data_len, ssize_t *ret)\n{\n    ssize_t rc;\n    ssize_t length;\n    struct transportpacket *p = &session->packet;\n\n    if (!p->olen) {\n        *ret = 0;\n        return LIBSSH2_ERROR_NONE;\n    }\n\n    /* send as much as possible of the existing packet */\n    if ((data != p->odata) || (data_len != p->olen)) {\n        /* When we are about to complete the sending of a packet, it is vital\n           that the caller doesn't try to send a new/different packet since\n           we don't add this one up until the previous one has been sent. To\n           make the caller really notice his/hers flaw, we return error for\n           this case */\n        return LIBSSH2_ERROR_BAD_USE;\n    }\n\n    *ret = 1;                   /* set to make our parent return */\n\n    /* number of bytes left to send */\n    length = p->ototal_num - p->osent;\n\n    rc = LIBSSH2_SEND(session, &p->outbuf[p->osent], length,\n                       LIBSSH2_SOCKET_SEND_FLAGS(session));\n    if (rc < 0)\n        _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                       \"Error sending %d bytes: %d\", length, -rc);\n    else {\n        _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                       \"Sent %d/%d bytes at %p+%d\", rc, length, p->outbuf,\n                       p->osent);\n        debugdump(session, \"libssh2_transport_write send()\",\n                  &p->outbuf[p->osent], rc);\n    }\n\n    if (rc == length) {\n        /* the remainder of the package was sent */\n        p->ototal_num = 0;\n        p->olen = 0;\n        /* we leave *ret set so that the parent returns as we MUST return back\n           a send success now, so that we don't risk sending EAGAIN later\n           which then would confuse the parent function */\n        return LIBSSH2_ERROR_NONE;\n\n    }\n    else if (rc < 0) {\n        /* nothing was sent */\n        if (rc != -EAGAIN)\n            /* send failure! */\n            return LIBSSH2_ERROR_SOCKET_SEND;\n\n        session->socket_block_directions |= LIBSSH2_SESSION_BLOCK_OUTBOUND;\n        return LIBSSH2_ERROR_EAGAIN;\n    }\n\n    p->osent += rc;         /* we sent away this much data */\n\n    return rc < length ? LIBSSH2_ERROR_EAGAIN : LIBSSH2_ERROR_NONE;\n}\n\n/*\n * libssh2_transport_send\n *\n * Send a packet, encrypting it and adding a MAC code if necessary\n * Returns 0 on success, non-zero on failure.\n *\n * The data is provided as _two_ data areas that are combined by this\n * function.  The 'data' part is sent immediately before 'data2'. 'data2' may\n * be set to NULL to only use a single part.\n *\n * Returns LIBSSH2_ERROR_EAGAIN if it would block or if the whole packet was\n * not sent yet. If it does so, the caller should call this function again as\n * soon as it is likely that more data can be sent, and this function MUST\n * then be called with the same argument set (same data pointer and same\n * data_len) until ERROR_NONE or failure is returned.\n *\n * This function DOES NOT call _libssh2_error() on any errors.\n */\nint _libssh2_transport_send(LIBSSH2_SESSION *session,\n                            const unsigned char *data, size_t data_len,\n                            const unsigned char *data2, size_t data2_len)\n{\n    int blocksize =\n        (session->state & LIBSSH2_STATE_NEWKEYS) ?\n        session->local.crypt->blocksize : 8;\n    int padding_length;\n    size_t packet_length;\n    int total_length;\n#ifdef RANDOM_PADDING\n    int rand_max;\n    int seed = data[0];         /* FIXME: make this random */\n#endif\n    struct transportpacket *p = &session->packet;\n    int encrypted;\n    int compressed;\n    ssize_t ret;\n    int rc;\n    const unsigned char *orgdata = data;\n    size_t orgdata_len = data_len;\n\n    /*\n     * If the last read operation was interrupted in the middle of a key\n     * exchange, we must complete that key exchange before continuing to write\n     * further data.\n     *\n     * See the similar block in _libssh2_transport_read for more details.\n     */\n    if (session->state & LIBSSH2_STATE_EXCHANGING_KEYS &&\n        !(session->state & LIBSSH2_STATE_KEX_ACTIVE)) {\n        /* Don't write any new packets if we're still in the middle of a key\n         * exchange. */\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS, \"Redirecting into the\"\n                       \" key re-exchange from _libssh2_transport_send\");\n        rc = _libssh2_kex_exchange(session, 1, &session->startup_key_state);\n        if (rc)\n            return rc;\n    }\n\n    debugdump(session, \"libssh2_transport_write plain\", data, data_len);\n    if(data2)\n        debugdump(session, \"libssh2_transport_write plain2\", data2, data2_len);\n\n    /* FIRST, check if we have a pending write to complete. send_existing\n       only sanity-check data and data_len and not data2 and data2_len!! */\n    rc = send_existing(session, data, data_len, &ret);\n    if (rc)\n        return rc;\n\n    session->socket_block_directions &= ~LIBSSH2_SESSION_BLOCK_OUTBOUND;\n\n    if (ret)\n        /* set by send_existing if data was sent */\n        return rc;\n\n    encrypted = (session->state & LIBSSH2_STATE_NEWKEYS) ? 1 : 0;\n\n    compressed =\n        session->local.comp != NULL &&\n        session->local.comp->compress &&\n        ((session->state & LIBSSH2_STATE_AUTHENTICATED) ||\n         session->local.comp->use_in_auth);\n\n    if (encrypted && compressed) {\n        /* the idea here is that these function must fail if the output gets\n           larger than what fits in the assigned buffer so thus they don't\n           check the input size as we don't know how much it compresses */\n        size_t dest_len = MAX_SSH_PACKET_LEN-5-256;\n        size_t dest2_len = dest_len;\n\n        /* compress directly to the target buffer */\n        rc = session->local.comp->comp(session,\n                                       &p->outbuf[5], &dest_len,\n                                       data, data_len,\n                                       &session->local.comp_abstract);\n        if(rc)\n            return rc;     /* compression failure */\n\n        if(data2 && data2_len) {\n            /* compress directly to the target buffer right after where the\n               previous call put data */\n            dest2_len -= dest_len;\n\n            rc = session->local.comp->comp(session,\n                                           &p->outbuf[5+dest_len], &dest2_len,\n                                           data2, data2_len,\n                                           &session->local.comp_abstract);\n        }\n        else\n            dest2_len = 0;\n        if(rc)\n            return rc;     /* compression failure */\n\n        data_len = dest_len + dest2_len; /* use the combined length */\n    }\n    else {\n        if((data_len + data2_len) >= (MAX_SSH_PACKET_LEN-0x100))\n            /* too large packet, return error for this until we make this\n               function split it up and send multiple SSH packets */\n            return LIBSSH2_ERROR_INVAL;\n\n        /* copy the payload data */\n        memcpy(&p->outbuf[5], data, data_len);\n        if(data2 && data2_len)\n            memcpy(&p->outbuf[5+data_len], data2, data2_len);\n        data_len += data2_len; /* use the combined length */\n    }\n\n\n    /* RFC4253 says: Note that the length of the concatenation of\n       'packet_length', 'padding_length', 'payload', and 'random padding'\n       MUST be a multiple of the cipher block size or 8, whichever is\n       larger. */\n\n    /* Plain math: (4 + 1 + packet_length + padding_length) % blocksize == 0 */\n\n    packet_length = data_len + 1 + 4;   /* 1 is for padding_length field\n                                           4 for the packet_length field */\n\n    /* at this point we have it all except the padding */\n\n    /* first figure out our minimum padding amount to make it an even\n       block size */\n    padding_length = blocksize - (packet_length % blocksize);\n\n    /* if the padding becomes too small we add another blocksize worth\n       of it (taken from the original libssh2 where it didn't have any\n       real explanation) */\n    if (padding_length < 4) {\n        padding_length += blocksize;\n    }\n#ifdef RANDOM_PADDING\n    /* FIXME: we can add padding here, but that also makes the packets\n       bigger etc */\n\n    /* now we can add 'blocksize' to the padding_length N number of times\n       (to \"help thwart traffic analysis\") but it must be less than 255 in\n       total */\n    rand_max = (255 - padding_length) / blocksize + 1;\n    padding_length += blocksize * (seed % rand_max);\n#endif\n\n    packet_length += padding_length;\n\n    /* append the MAC length to the total_length size */\n    total_length =\n        packet_length + (encrypted ? session->local.mac->mac_len : 0);\n\n    /* store packet_length, which is the size of the whole packet except\n       the MAC and the packet_length field itself */\n    _libssh2_htonu32(p->outbuf, packet_length - 4);\n    /* store padding_length */\n    p->outbuf[4] = (unsigned char)padding_length;\n\n    /* fill the padding area with random junk */\n    _libssh2_random(p->outbuf + 5 + data_len, padding_length);\n\n    if (encrypted) {\n        size_t i;\n\n        /* Calculate MAC hash. Put the output at index packet_length,\n           since that size includes the whole packet. The MAC is\n           calculated on the entire unencrypted packet, including all\n           fields except the MAC field itself. */\n        session->local.mac->hash(session, p->outbuf + packet_length,\n                                 session->local.seqno, p->outbuf,\n                                 packet_length, NULL, 0,\n                                 &session->local.mac_abstract);\n\n        /* Encrypt the whole packet data, one block size at a time.\n           The MAC field is not encrypted. */\n        for(i = 0; i < packet_length; i += session->local.crypt->blocksize) {\n            unsigned char *ptr = &p->outbuf[i];\n            if (session->local.crypt->crypt(session, ptr,\n                                            session->local.crypt->blocksize,\n                                            &session->local.crypt_abstract))\n                return LIBSSH2_ERROR_ENCRYPT;     /* encryption failure */\n        }\n    }\n\n    session->local.seqno++;\n\n    ret = LIBSSH2_SEND(session, p->outbuf, total_length,\n                        LIBSSH2_SOCKET_SEND_FLAGS(session));\n    if (ret < 0)\n        _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                       \"Error sending %d bytes: %d\", total_length, -ret);\n    else {\n        _libssh2_debug(session, LIBSSH2_TRACE_SOCKET, \"Sent %d/%d bytes at %p\",\n                       ret, total_length, p->outbuf);\n        debugdump(session, \"libssh2_transport_write send()\", p->outbuf, ret);\n    }\n\n    if (ret != total_length) {\n        if (ret >= 0 || ret == -EAGAIN) {\n            /* the whole packet could not be sent, save the rest */\n            session->socket_block_directions |= LIBSSH2_SESSION_BLOCK_OUTBOUND;\n            p->odata = orgdata;\n            p->olen = orgdata_len;\n            p->osent = ret <= 0 ? 0 : ret;\n            p->ototal_num = total_length;\n            return LIBSSH2_ERROR_EAGAIN;\n        }\n        return LIBSSH2_ERROR_SOCKET_SEND;\n    }\n\n    /* the whole thing got sent away */\n    p->odata = NULL;\n    p->olen = 0;\n\n    return LIBSSH2_ERROR_NONE;         /* all is good */\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/transport.h",
    "content": "#ifndef __LIBSSH2_TRANSPORT_H\n#define __LIBSSH2_TRANSPORT_H\n\n/* Copyright (C) 2007 The Written Word, Inc.  All rights reserved.\n * Copyright (C) 2009-2010 by Daniel Stenberg\n * Author: Daniel Stenberg <daniel@haxx.se>\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file handles reading and writing to the SECSH transport layer. RFC4253.\n */\n\n#include \"libssh2_priv.h\"\n#include \"packet.h\"\n\n\n/*\n * libssh2_transport_send\n *\n * Send a packet, encrypting it and adding a MAC code if necessary\n * Returns 0 on success, non-zero on failure.\n *\n * The data is provided as _two_ data areas that are combined by this\n * function.  The 'data' part is sent immediately before 'data2'. 'data2' can\n * be set to NULL (or data2_len to 0) to only use a single part.\n *\n * Returns LIBSSH2_ERROR_EAGAIN if it would block or if the whole packet was\n * not sent yet. If it does so, the caller should call this function again as\n * soon as it is likely that more data can be sent, and this function MUST\n * then be called with the same argument set (same data pointer and same\n * data_len) until ERROR_NONE or failure is returned.\n *\n * This function DOES NOT call _libssh2_error() on any errors.\n */\nint _libssh2_transport_send(LIBSSH2_SESSION *session,\n                            const unsigned char *data, size_t data_len,\n                            const unsigned char *data2, size_t data2_len);\n\n/*\n * _libssh2_transport_read\n *\n * Collect a packet into the input brigade block only controls whether or not\n * to wait for a packet to start.\n *\n * Returns packet type added to input brigade (PACKET_NONE if nothing added),\n * or PACKET_FAIL on failure and PACKET_EAGAIN if it couldn't process a full\n * packet.\n */\n\n/*\n * This function reads the binary stream as specified in chapter 6 of RFC4253\n * \"The Secure Shell (SSH) Transport Layer Protocol\"\n */\nint _libssh2_transport_read(LIBSSH2_SESSION * session);\n\n#endif /* __LIBSSH2_TRANSPORT_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/userauth.c",
    "content": "/* Copyright (c) 2004-2007, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2005 Mikhail Gusarov <dottedmag@dottedmag.net>\n * Copyright (c) 2009-2014 by Daniel Stenberg\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\n#include <ctype.h>\n#include <stdio.h>\n\n#include <assert.h>\n\n/* Needed for struct iovec on some platforms */\n#ifdef HAVE_SYS_UIO_H\n#include <sys/uio.h>\n#endif\n\n#include \"transport.h\"\n#include \"session.h\"\n#include \"userauth.h\"\n\n/* libssh2_userauth_list\n *\n * List authentication methods\n * Will yield successful login if \"none\" happens to be allowable for this user\n * Not a common configuration for any SSH server though\n * username should be NULL, or a null terminated string\n */\nstatic char *userauth_list(LIBSSH2_SESSION *session, const char *username,\n                           unsigned int username_len)\n{\n    static const unsigned char reply_codes[3] =\n        { SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE, 0 };\n    /* packet_type(1) + username_len(4) + service_len(4) +\n       service(14)\"ssh-connection\" + method_len(4) = 27 */\n    unsigned long methods_len;\n    unsigned char *s;\n    int rc;\n\n    if (session->userauth_list_state == libssh2_NB_state_idle) {\n        /* Zero the whole thing out */\n        memset(&session->userauth_list_packet_requirev_state, 0,\n               sizeof(session->userauth_list_packet_requirev_state));\n\n        session->userauth_list_data_len = username_len + 27;\n\n        s = session->userauth_list_data =\n            LIBSSH2_ALLOC(session, session->userauth_list_data_len);\n        if (!session->userauth_list_data) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate memory for userauth_list\");\n            return NULL;\n        }\n\n        *(s++) = SSH_MSG_USERAUTH_REQUEST;\n        _libssh2_store_str(&s, username, username_len);\n        _libssh2_store_str(&s, \"ssh-connection\", 14);\n        _libssh2_store_u32(&s, 4); /* send \"none\" separately */\n\n        session->userauth_list_state = libssh2_NB_state_created;\n    }\n\n    if (session->userauth_list_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, session->userauth_list_data,\n                                     session->userauth_list_data_len,\n                                     (unsigned char *)\"none\", 4);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block requesting userauth list\");\n            return NULL;\n        }\n        /* now free the packet that was sent */\n        LIBSSH2_FREE(session, session->userauth_list_data);\n        session->userauth_list_data = NULL;\n\n        if (rc) {\n            _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                           \"Unable to send userauth-none request\");\n            session->userauth_list_state = libssh2_NB_state_idle;\n            return NULL;\n        }\n\n        session->userauth_list_state = libssh2_NB_state_sent;\n    }\n\n    if (session->userauth_list_state == libssh2_NB_state_sent) {\n        rc = _libssh2_packet_requirev(session, reply_codes,\n                                      &session->userauth_list_data,\n                                      &session->userauth_list_data_len, 0,\n                                      NULL, 0,\n                                      &session->userauth_list_packet_requirev_state);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block requesting userauth list\");\n            return NULL;\n        } else if (rc) {\n            _libssh2_error(session, rc, \"Failed getting response\");\n            session->userauth_list_state = libssh2_NB_state_idle;\n            return NULL;\n        }\n\n        if (session->userauth_list_data[0] == SSH_MSG_USERAUTH_SUCCESS) {\n            /* Wow, who'dve thought... */\n            _libssh2_error(session, LIBSSH2_ERROR_NONE, \"No error\");\n            LIBSSH2_FREE(session, session->userauth_list_data);\n            session->userauth_list_data = NULL;\n            session->state |= LIBSSH2_STATE_AUTHENTICATED;\n            session->userauth_list_state = libssh2_NB_state_idle;\n            return NULL;\n        }\n\n        methods_len = _libssh2_ntohu32(session->userauth_list_data + 1);\n\n        /* Do note that the memory areas overlap! */\n        memmove(session->userauth_list_data, session->userauth_list_data + 5,\n                methods_len);\n        session->userauth_list_data[methods_len] = '\\0';\n        _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                       \"Permitted auth methods: %s\",\n                       session->userauth_list_data);\n    }\n\n    session->userauth_list_state = libssh2_NB_state_idle;\n    return (char *) session->userauth_list_data;\n}\n\n/* libssh2_userauth_list\n *\n * List authentication methods\n * Will yield successful login if \"none\" happens to be allowable for this user\n * Not a common configuration for any SSH server though\n * username should be NULL, or a null terminated string\n */\nLIBSSH2_API char *\nlibssh2_userauth_list(LIBSSH2_SESSION * session, const char *user,\n                      unsigned int user_len)\n{\n    char *ptr;\n    BLOCK_ADJUST_ERRNO(ptr, session,\n                       userauth_list(session, user, user_len));\n    return ptr;\n}\n\n/*\n * libssh2_userauth_authenticated\n *\n * Returns: 0 if not yet authenticated\n *          1 if already authenticated\n */\nLIBSSH2_API int\nlibssh2_userauth_authenticated(LIBSSH2_SESSION * session)\n{\n    return (session->state & LIBSSH2_STATE_AUTHENTICATED)?1:0;\n}\n\n\n\n/* userauth_password\n * Plain ol' login\n */\nstatic int\nuserauth_password(LIBSSH2_SESSION *session,\n                  const char *username, unsigned int username_len,\n                  const unsigned char *password, unsigned int password_len,\n                  LIBSSH2_PASSWD_CHANGEREQ_FUNC((*passwd_change_cb)))\n{\n    unsigned char *s;\n    static const unsigned char reply_codes[4] =\n        { SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE,\n          SSH_MSG_USERAUTH_PASSWD_CHANGEREQ, 0\n        };\n    int rc;\n\n    if (session->userauth_pswd_state == libssh2_NB_state_idle) {\n        /* Zero the whole thing out */\n        memset(&session->userauth_pswd_packet_requirev_state, 0,\n               sizeof(session->userauth_pswd_packet_requirev_state));\n\n        /*\n         * 40 = packet_type(1) + username_len(4) + service_len(4) +\n         * service(14)\"ssh-connection\" + method_len(4) + method(8)\"password\" +\n         * chgpwdbool(1) + password_len(4) */\n        session->userauth_pswd_data_len = username_len + 40;\n\n        session->userauth_pswd_data0 =\n            (unsigned char) ~SSH_MSG_USERAUTH_PASSWD_CHANGEREQ;\n\n        /* TODO: remove this alloc with a fixed buffer in the session\n           struct */\n        s = session->userauth_pswd_data =\n            LIBSSH2_ALLOC(session, session->userauth_pswd_data_len);\n        if (!session->userauth_pswd_data) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"userauth-password request\");\n        }\n\n        *(s++) = SSH_MSG_USERAUTH_REQUEST;\n        _libssh2_store_str(&s, username, username_len);\n        _libssh2_store_str(&s, \"ssh-connection\", sizeof(\"ssh-connection\") - 1);\n        _libssh2_store_str(&s, \"password\", sizeof(\"password\") - 1);\n        *s++ = '\\0';\n        _libssh2_store_u32(&s, password_len);\n        /* 'password' is sent separately */\n\n        _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                       \"Attempting to login using password authentication\");\n\n        session->userauth_pswd_state = libssh2_NB_state_created;\n    }\n\n    if (session->userauth_pswd_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, session->userauth_pswd_data,\n                                     session->userauth_pswd_data_len,\n                                     password, password_len);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                  \"Would block writing password request\");\n        }\n\n        /* now free the sent packet */\n        LIBSSH2_FREE(session, session->userauth_pswd_data);\n        session->userauth_pswd_data = NULL;\n\n        if (rc) {\n            session->userauth_pswd_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send userauth-password request\");\n        }\n\n        session->userauth_pswd_state = libssh2_NB_state_sent;\n    }\n\n  password_response:\n\n    if ((session->userauth_pswd_state == libssh2_NB_state_sent)\n        || (session->userauth_pswd_state == libssh2_NB_state_sent1)\n        || (session->userauth_pswd_state == libssh2_NB_state_sent2)) {\n        if (session->userauth_pswd_state == libssh2_NB_state_sent) {\n            rc = _libssh2_packet_requirev(session, reply_codes,\n                                          &session->userauth_pswd_data,\n                                          &session->userauth_pswd_data_len,\n                                          0, NULL, 0,\n                                          &session->\n                                          userauth_pswd_packet_requirev_state);\n\n            if (rc) {\n                if (rc != LIBSSH2_ERROR_EAGAIN)\n                    session->userauth_pswd_state = libssh2_NB_state_idle;\n\n                return _libssh2_error(session, rc,\n                                      \"Waiting for password response\");\n            }\n\n            if (session->userauth_pswd_data[0] == SSH_MSG_USERAUTH_SUCCESS) {\n                _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                               \"Password authentication successful\");\n                LIBSSH2_FREE(session, session->userauth_pswd_data);\n                session->userauth_pswd_data = NULL;\n                session->state |= LIBSSH2_STATE_AUTHENTICATED;\n                session->userauth_pswd_state = libssh2_NB_state_idle;\n                return 0;\n            } else if (session->userauth_pswd_data[0] == SSH_MSG_USERAUTH_FAILURE) {\n                _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                               \"Password authentication failed\");\n                LIBSSH2_FREE(session, session->userauth_pswd_data);\n                session->userauth_pswd_data = NULL;\n                session->userauth_pswd_state = libssh2_NB_state_idle;\n                return _libssh2_error(session,\n                                      LIBSSH2_ERROR_AUTHENTICATION_FAILED,\n                                      \"Authentication failed \"\n                                      \"(username/password)\");\n            }\n\n            session->userauth_pswd_newpw = NULL;\n            session->userauth_pswd_newpw_len = 0;\n\n            session->userauth_pswd_state = libssh2_NB_state_sent1;\n        }\n\n        if ((session->userauth_pswd_data[0] ==\n             SSH_MSG_USERAUTH_PASSWD_CHANGEREQ)\n            || (session->userauth_pswd_data0 ==\n                SSH_MSG_USERAUTH_PASSWD_CHANGEREQ)) {\n            session->userauth_pswd_data0 = SSH_MSG_USERAUTH_PASSWD_CHANGEREQ;\n\n            if ((session->userauth_pswd_state == libssh2_NB_state_sent1) ||\n                (session->userauth_pswd_state == libssh2_NB_state_sent2)) {\n                if (session->userauth_pswd_state == libssh2_NB_state_sent1) {\n                    _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                                   \"Password change required\");\n                    LIBSSH2_FREE(session, session->userauth_pswd_data);\n                    session->userauth_pswd_data = NULL;\n                }\n                if (passwd_change_cb) {\n                    if (session->userauth_pswd_state == libssh2_NB_state_sent1) {\n                        passwd_change_cb(session,\n                                         &session->userauth_pswd_newpw,\n                                         &session->userauth_pswd_newpw_len,\n                                         &session->abstract);\n                        if (!session->userauth_pswd_newpw) {\n                            return _libssh2_error(session,\n                                                  LIBSSH2_ERROR_PASSWORD_EXPIRED,\n                                                  \"Password expired, and \"\n                                                  \"callback failed\");\n                        }\n\n                        /* basic data_len + newpw_len(4) */\n                        session->userauth_pswd_data_len =\n                            username_len + password_len + 44;\n\n                        s = session->userauth_pswd_data =\n                            LIBSSH2_ALLOC(session,\n                                          session->userauth_pswd_data_len);\n                        if (!session->userauth_pswd_data) {\n                            LIBSSH2_FREE(session,\n                                         session->userauth_pswd_newpw);\n                            session->userauth_pswd_newpw = NULL;\n                            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                                  \"Unable to allocate memory \"\n                                                  \"for userauth password \"\n                                                  \"change request\");\n                        }\n\n                        *(s++) = SSH_MSG_USERAUTH_REQUEST;\n                        _libssh2_store_str(&s, username, username_len);\n                        _libssh2_store_str(&s, \"ssh-connection\",\n                                           sizeof(\"ssh-connection\") - 1);\n                        _libssh2_store_str(&s, \"password\",\n                                           sizeof(\"password\") - 1);\n                        *s++ = 0x01;\n                        _libssh2_store_str(&s, (char *)password, password_len);\n                        _libssh2_store_u32(&s,\n                                           session->userauth_pswd_newpw_len);\n                        /* send session->userauth_pswd_newpw separately */\n\n                        session->userauth_pswd_state = libssh2_NB_state_sent2;\n                    }\n\n                    if (session->userauth_pswd_state == libssh2_NB_state_sent2) {\n                        rc = _libssh2_transport_send(session,\n                                                     session->userauth_pswd_data,\n                                                     session->userauth_pswd_data_len,\n                                                     (unsigned char *)\n                                                     session->userauth_pswd_newpw,\n                                                     session->userauth_pswd_newpw_len);\n                        if (rc == LIBSSH2_ERROR_EAGAIN) {\n                            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                                  \"Would block waiting\");\n                        }\n\n                        /* free the allocated packets again */\n                        LIBSSH2_FREE(session, session->userauth_pswd_data);\n                        session->userauth_pswd_data = NULL;\n                        LIBSSH2_FREE(session, session->userauth_pswd_newpw);\n                        session->userauth_pswd_newpw = NULL;\n\n                        if (rc) {\n                            return _libssh2_error(session,\n                                                  LIBSSH2_ERROR_SOCKET_SEND,\n                                                  \"Unable to send userauth \"\n                                                  \"password-change request\");\n                        }\n\n                        /*\n                         * Ugliest use of goto ever.  Blame it on the\n                         * askN => requirev migration.\n                         */\n                        session->userauth_pswd_state = libssh2_NB_state_sent;\n                        goto password_response;\n                    }\n                }\n            } else {\n                session->userauth_pswd_state = libssh2_NB_state_idle;\n                return _libssh2_error(session, LIBSSH2_ERROR_PASSWORD_EXPIRED,\n                                      \"Password Expired, and no callback \"\n                                      \"specified\");\n            }\n        }\n    }\n\n    /* FAILURE */\n    LIBSSH2_FREE(session, session->userauth_pswd_data);\n    session->userauth_pswd_data = NULL;\n    session->userauth_pswd_state = libssh2_NB_state_idle;\n\n    return _libssh2_error(session, LIBSSH2_ERROR_AUTHENTICATION_FAILED,\n                          \"Authentication failed\");\n}\n\n/*\n * libssh2_userauth_password_ex\n *\n * Plain ol' login\n */\n\nLIBSSH2_API int\nlibssh2_userauth_password_ex(LIBSSH2_SESSION *session, const char *username,\n                             unsigned int username_len, const char *password,\n                             unsigned int password_len,\n                             LIBSSH2_PASSWD_CHANGEREQ_FUNC((*passwd_change_cb)))\n{\n    int rc;\n    BLOCK_ADJUST(rc, session,\n                 userauth_password(session, username, username_len,\n                                   (unsigned char *)password, password_len,\n                                   passwd_change_cb));\n    return rc;\n}\n\nstatic int\nmemory_read_publickey(LIBSSH2_SESSION * session, unsigned char **method,\n                      size_t *method_len,\n                      unsigned char **pubkeydata,\n                      size_t *pubkeydata_len,\n                      const char *pubkeyfiledata,\n                      size_t pubkeyfiledata_len)\n{\n    unsigned char *pubkey = NULL, *sp1, *sp2, *tmp;\n    size_t pubkey_len = pubkeyfiledata_len;\n    unsigned int tmp_len;\n\n    if (pubkeyfiledata_len <= 1) {\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Invalid data in public key file\");\n    }\n\n    pubkey = LIBSSH2_ALLOC(session, pubkeyfiledata_len);\n    if (!pubkey) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Unable to allocate memory for public key data\");\n    }\n\n    memcpy(pubkey, pubkeyfiledata, pubkeyfiledata_len);\n\n    /*\n     *   Remove trailing whitespace\n     */\n    while (pubkey_len && isspace(pubkey[pubkey_len - 1]))\n        pubkey_len--;\n\n    if (!pubkey_len) {\n        LIBSSH2_FREE(session, pubkey);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Missing public key data\");\n    }\n\n    if ((sp1 = memchr(pubkey, ' ', pubkey_len)) == NULL) {\n        LIBSSH2_FREE(session, pubkey);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Invalid public key data\");\n    }\n\n    sp1++;\n\n    if ((sp2 = memchr(sp1, ' ', pubkey_len - (sp1 - pubkey - 1))) == NULL) {\n        /* Assume that the id string is missing, but that it's okay */\n        sp2 = pubkey + pubkey_len;\n    }\n\n    if (libssh2_base64_decode(session, (char **) &tmp, &tmp_len,\n                              (char *) sp1, sp2 - sp1)) {\n        LIBSSH2_FREE(session, pubkey);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                                  \"Invalid key data, not base64 encoded\");\n    }\n\n    /* Wasting some bytes here (okay, more than some), but since it's likely\n     * to be freed soon anyway, we'll just avoid the extra free/alloc and call\n     * it a wash\n     */\n    *method = pubkey;\n    *method_len = sp1 - pubkey - 1;\n\n    *pubkeydata = tmp;\n    *pubkeydata_len = tmp_len;\n\n    return 0;\n}\n\n/*\n * file_read_publickey\n *\n * Read a public key from an id_???.pub style file\n *\n * Returns an allocated string containing the decoded key in *pubkeydata\n * on success.\n * Returns an allocated string containing the key method (e.g. \"ssh-dss\")\n * in method on success.\n */\nstatic int\nfile_read_publickey(LIBSSH2_SESSION * session, unsigned char **method,\n                    size_t *method_len,\n                    unsigned char **pubkeydata,\n                    size_t *pubkeydata_len,\n                    const char *pubkeyfile)\n{\n    FILE *fd;\n    char c;\n    unsigned char *pubkey = NULL, *sp1, *sp2, *tmp;\n    size_t pubkey_len = 0, sp_len;\n    unsigned int tmp_len;\n\n    _libssh2_debug(session, LIBSSH2_TRACE_AUTH, \"Loading public key file: %s\",\n                   pubkeyfile);\n    /* Read Public Key */\n    fd = fopen(pubkeyfile, \"r\");\n    if (!fd) {\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Unable to open public key file\");\n    }\n    while (!feof(fd) && 1 == fread(&c, 1, 1, fd) && c != '\\r' && c != '\\n') {\n        pubkey_len++;\n    }\n    rewind(fd);\n\n    if (pubkey_len <= 1) {\n        fclose(fd);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Invalid data in public key file\");\n    }\n\n    pubkey = LIBSSH2_ALLOC(session, pubkey_len);\n    if (!pubkey) {\n        fclose(fd);\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Unable to allocate memory for public key data\");\n    }\n    if (fread(pubkey, 1, pubkey_len, fd) != pubkey_len) {\n        LIBSSH2_FREE(session, pubkey);\n        fclose(fd);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Unable to read public key from file\");\n    }\n    fclose(fd);\n    /*\n     * Remove trailing whitespace\n     */\n    while (pubkey_len && isspace(pubkey[pubkey_len - 1])) {\n        pubkey_len--;\n    }\n\n    if (!pubkey_len) {\n        LIBSSH2_FREE(session, pubkey);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Missing public key data\");\n    }\n\n    if ((sp1 = memchr(pubkey, ' ', pubkey_len)) == NULL) {\n        LIBSSH2_FREE(session, pubkey);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Invalid public key data\");\n    }\n\n    sp1++;\n\n    sp_len = sp1 > pubkey ? (sp1 - pubkey) - 1 : 0;\n    if ((sp2 = memchr(sp1, ' ', pubkey_len - sp_len)) == NULL) {\n        /* Assume that the id string is missing, but that it's okay */\n        sp2 = pubkey + pubkey_len;\n    }\n\n    if (libssh2_base64_decode(session, (char **) &tmp, &tmp_len,\n                              (char *) sp1, sp2 - sp1)) {\n        LIBSSH2_FREE(session, pubkey);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Invalid key data, not base64 encoded\");\n    }\n\n    /* Wasting some bytes here (okay, more than some), but since it's likely\n     * to be freed soon anyway, we'll just avoid the extra free/alloc and call\n     * it a wash */\n    *method = pubkey;\n    *method_len = sp1 - pubkey - 1;\n\n    *pubkeydata = tmp;\n    *pubkeydata_len = tmp_len;\n\n    return 0;\n}\n\nstatic int\nmemory_read_privatekey(LIBSSH2_SESSION * session,\n                       const LIBSSH2_HOSTKEY_METHOD ** hostkey_method,\n                       void **hostkey_abstract,\n                       const unsigned char *method, int method_len,\n                       const char *privkeyfiledata, size_t privkeyfiledata_len,\n                       const char *passphrase)\n{\n    const LIBSSH2_HOSTKEY_METHOD **hostkey_methods_avail =\n        libssh2_hostkey_methods();\n\n    *hostkey_method = NULL;\n    *hostkey_abstract = NULL;\n    while (*hostkey_methods_avail && (*hostkey_methods_avail)->name) {\n        if ((*hostkey_methods_avail)->initPEMFromMemory\n             && strncmp((*hostkey_methods_avail)->name, (const char *) method,\n                        method_len) == 0) {\n            *hostkey_method = *hostkey_methods_avail;\n            break;\n        }\n        hostkey_methods_avail++;\n    }\n    if (!*hostkey_method) {\n        return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NONE,\n                              \"No handler for specified private key\");\n    }\n\n    if ((*hostkey_method)->\n        initPEMFromMemory(session, privkeyfiledata, privkeyfiledata_len,\n                          (unsigned char *) passphrase,\n                          hostkey_abstract)) {\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Unable to initialize private key from file\");\n    }\n\n    return 0;\n}\n\n/* libssh2_file_read_privatekey\n * Read a PEM encoded private key from an id_??? style file\n */\nstatic int\nfile_read_privatekey(LIBSSH2_SESSION * session,\n                     const LIBSSH2_HOSTKEY_METHOD ** hostkey_method,\n                     void **hostkey_abstract,\n                     const unsigned char *method, int method_len,\n                     const char *privkeyfile, const char *passphrase)\n{\n    const LIBSSH2_HOSTKEY_METHOD **hostkey_methods_avail =\n        libssh2_hostkey_methods();\n\n    _libssh2_debug(session, LIBSSH2_TRACE_AUTH, \"Loading private key file: %s\",\n                   privkeyfile);\n    *hostkey_method = NULL;\n    *hostkey_abstract = NULL;\n    while (*hostkey_methods_avail && (*hostkey_methods_avail)->name) {\n        if ((*hostkey_methods_avail)->initPEM\n            && strncmp((*hostkey_methods_avail)->name, (const char *) method,\n                       method_len) == 0) {\n            *hostkey_method = *hostkey_methods_avail;\n            break;\n        }\n        hostkey_methods_avail++;\n    }\n    if (!*hostkey_method) {\n        return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NONE,\n                              \"No handler for specified private key\");\n    }\n\n    if ((*hostkey_method)->\n        initPEM(session, privkeyfile, (unsigned char *) passphrase,\n                hostkey_abstract)) {\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Unable to initialize private key from file\");\n    }\n\n    return 0;\n}\n\nstruct privkey_file {\n    const char *filename;\n    const char *passphrase;\n};\n\nstatic int\nsign_frommemory(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len,\n                const unsigned char *data, size_t data_len, void **abstract)\n{\n    struct privkey_file *pk_file = (struct privkey_file *) (*abstract);\n    const LIBSSH2_HOSTKEY_METHOD *privkeyobj;\n    void *hostkey_abstract;\n    struct iovec datavec;\n    int rc;\n\n    rc = memory_read_privatekey(session, &privkeyobj, &hostkey_abstract,\n                                session->userauth_pblc_method,\n                                session->userauth_pblc_method_len,\n                                pk_file->filename,\n                                strlen(pk_file->filename),\n                                pk_file->passphrase);\n    if(rc)\n        return rc;\n\n    libssh2_prepare_iovec(&datavec, 1);\n    datavec.iov_base = (void *)data;\n    datavec.iov_len  = data_len;\n\n    if (privkeyobj->signv(session, sig, sig_len, 1, &datavec,\n                          &hostkey_abstract)) {\n        if (privkeyobj->dtor) {\n            privkeyobj->dtor(session, abstract);\n        }\n        return -1;\n    }\n\n    if (privkeyobj->dtor) {\n        privkeyobj->dtor(session, &hostkey_abstract);\n    }\n    return 0;\n}\n\nstatic int\nsign_fromfile(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len,\n              const unsigned char *data, size_t data_len, void **abstract)\n{\n    struct privkey_file *privkey_file = (struct privkey_file *) (*abstract);\n    const LIBSSH2_HOSTKEY_METHOD *privkeyobj;\n    void *hostkey_abstract;\n    struct iovec datavec;\n    int rc;\n\n    rc = file_read_privatekey(session, &privkeyobj, &hostkey_abstract,\n                              session->userauth_pblc_method,\n                              session->userauth_pblc_method_len,\n                              privkey_file->filename,\n                              privkey_file->passphrase);\n    if(rc)\n        return rc;\n\n    libssh2_prepare_iovec(&datavec, 1);\n    datavec.iov_base = (void *)data;\n    datavec.iov_len  = data_len;\n\n    if (privkeyobj->signv(session, sig, sig_len, 1, &datavec,\n                          &hostkey_abstract)) {\n        if (privkeyobj->dtor) {\n            privkeyobj->dtor(session, &hostkey_abstract);\n        }\n        return -1;\n    }\n\n    if (privkeyobj->dtor) {\n        privkeyobj->dtor(session, &hostkey_abstract);\n    }\n    return 0;\n}\n\n\n\n/* userauth_hostbased_fromfile\n * Authenticate using a keypair found in the named files\n */\nstatic int\nuserauth_hostbased_fromfile(LIBSSH2_SESSION *session,\n                            const char *username, size_t username_len,\n                            const char *publickey, const char *privatekey,\n                            const char *passphrase, const char *hostname,\n                            size_t hostname_len,\n                            const char *local_username,\n                            size_t local_username_len)\n{\n    int rc;\n\n    if (session->userauth_host_state == libssh2_NB_state_idle) {\n        const LIBSSH2_HOSTKEY_METHOD *privkeyobj;\n        unsigned char *pubkeydata, *sig = NULL;\n        size_t pubkeydata_len = 0;\n        size_t sig_len = 0;\n        void *abstract;\n        unsigned char buf[5];\n        struct iovec datavec[4];\n\n        /* Zero the whole thing out */\n        memset(&session->userauth_host_packet_requirev_state, 0,\n               sizeof(session->userauth_host_packet_requirev_state));\n\n        if (publickey) {\n            rc = file_read_publickey(session, &session->userauth_host_method,\n                                     &session->userauth_host_method_len,\n                                     &pubkeydata, &pubkeydata_len, publickey);\n            if(rc)\n                /* Note: file_read_publickey() calls _libssh2_error() */\n                return rc;\n        }\n        else {\n            /* Compute public key from private key. */\n            rc = _libssh2_pub_priv_keyfile(session,\n                                           &session->userauth_host_method,\n                                           &session->userauth_host_method_len,\n                                           &pubkeydata, &pubkeydata_len,\n                                           privatekey, passphrase);\n            if (rc)\n                /* libssh2_pub_priv_keyfile calls _libssh2_error() */\n                return rc;\n        }\n\n        /*\n         * 52 = packet_type(1) + username_len(4) + servicename_len(4) +\n         * service_name(14)\"ssh-connection\" + authmethod_len(4) +\n         * authmethod(9)\"hostbased\" + method_len(4) + pubkeydata_len(4) +\n         * hostname_len(4) + local_username_len(4)\n         */\n        session->userauth_host_packet_len =\n            username_len + session->userauth_host_method_len + hostname_len +\n            local_username_len + pubkeydata_len + 52;\n\n        /*\n         * Preallocate space for an overall length,  method name again,\n         * and the signature, which won't be any larger than the size of\n         * the publickeydata itself\n         */\n        session->userauth_host_s = session->userauth_host_packet =\n            LIBSSH2_ALLOC(session,\n                          session->userauth_host_packet_len + 4 +\n                          (4 + session->userauth_host_method_len) +\n                          (4 + pubkeydata_len));\n        if (!session->userauth_host_packet) {\n            LIBSSH2_FREE(session, session->userauth_host_method);\n            session->userauth_host_method = NULL;\n            LIBSSH2_FREE(session, pubkeydata);\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Out of memory\");\n        }\n\n        *(session->userauth_host_s++) = SSH_MSG_USERAUTH_REQUEST;\n        _libssh2_store_str(&session->userauth_host_s, username, username_len);\n        _libssh2_store_str(&session->userauth_host_s, \"ssh-connection\", 14);\n        _libssh2_store_str(&session->userauth_host_s, \"hostbased\", 9);\n        _libssh2_store_str(&session->userauth_host_s,\n                           (const char *)session->userauth_host_method,\n                           session->userauth_host_method_len);\n        _libssh2_store_str(&session->userauth_host_s, (const char *)pubkeydata,\n                           pubkeydata_len);\n        LIBSSH2_FREE(session, pubkeydata);\n        _libssh2_store_str(&session->userauth_host_s, hostname, hostname_len);\n        _libssh2_store_str(&session->userauth_host_s, local_username,\n                           local_username_len);\n\n        rc = file_read_privatekey(session, &privkeyobj, &abstract,\n                                  session->userauth_host_method,\n                                  session->userauth_host_method_len,\n                                  privatekey, passphrase);\n        if(rc) {\n            /* Note: file_read_privatekey() calls _libssh2_error() */\n            LIBSSH2_FREE(session, session->userauth_host_method);\n            session->userauth_host_method = NULL;\n            LIBSSH2_FREE(session, session->userauth_host_packet);\n            session->userauth_host_packet = NULL;\n            return rc;\n        }\n\n        _libssh2_htonu32(buf, session->session_id_len);\n        libssh2_prepare_iovec(datavec, 4);\n        datavec[0].iov_base = (void *)buf;\n        datavec[0].iov_len = 4;\n        datavec[1].iov_base = (void *)session->session_id;\n        datavec[1].iov_len = session->session_id_len;\n        datavec[2].iov_base = (void *)session->userauth_host_packet;\n        datavec[2].iov_len = session->userauth_host_packet_len;\n\n        if (privkeyobj && privkeyobj->signv &&\n                          privkeyobj->signv(session, &sig, &sig_len, 3,\n                                            datavec, &abstract)) {\n            LIBSSH2_FREE(session, session->userauth_host_method);\n            session->userauth_host_method = NULL;\n            LIBSSH2_FREE(session, session->userauth_host_packet);\n            session->userauth_host_packet = NULL;\n            if (privkeyobj->dtor) {\n                privkeyobj->dtor(session, &abstract);\n            }\n            return -1;\n        }\n\n        if (privkeyobj && privkeyobj->dtor) {\n            privkeyobj->dtor(session, &abstract);\n        }\n\n        if (sig_len > pubkeydata_len) {\n            unsigned char *newpacket;\n            /* Should *NEVER* happen, but...well.. better safe than sorry */\n            newpacket = LIBSSH2_REALLOC(session, session->userauth_host_packet,\n                                        session->userauth_host_packet_len + 4 +\n                                        (4 + session->userauth_host_method_len)\n                                        + (4 + sig_len)); /* PK sigblob */\n            if (!newpacket) {\n                LIBSSH2_FREE(session, sig);\n                LIBSSH2_FREE(session, session->userauth_host_packet);\n                session->userauth_host_packet = NULL;\n                LIBSSH2_FREE(session, session->userauth_host_method);\n                session->userauth_host_method = NULL;\n                return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                      \"Failed allocating additional space for \"\n                                      \"userauth-hostbased packet\");\n            }\n            session->userauth_host_packet = newpacket;\n        }\n\n        session->userauth_host_s =\n            session->userauth_host_packet + session->userauth_host_packet_len;\n\n        _libssh2_store_u32(&session->userauth_host_s,\n                           4 + session->userauth_host_method_len + 4 + sig_len);\n        _libssh2_store_str(&session->userauth_host_s,\n                           (const char *)session->userauth_host_method,\n                           session->userauth_host_method_len);\n        LIBSSH2_FREE(session, session->userauth_host_method);\n        session->userauth_host_method = NULL;\n\n        _libssh2_store_str(&session->userauth_host_s, (const char *)sig,\n                           sig_len);\n        LIBSSH2_FREE(session, sig);\n\n        _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                       \"Attempting hostbased authentication\");\n\n        session->userauth_host_state = libssh2_NB_state_created;\n    }\n\n    if (session->userauth_host_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, session->userauth_host_packet,\n                                     session->userauth_host_s -\n                                     session->userauth_host_packet,\n                                     NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, \"Would block\");\n        }\n        else if (rc) {\n            LIBSSH2_FREE(session, session->userauth_host_packet);\n            session->userauth_host_packet = NULL;\n            session->userauth_host_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send userauth-hostbased request\");\n        }\n        LIBSSH2_FREE(session, session->userauth_host_packet);\n        session->userauth_host_packet = NULL;\n\n        session->userauth_host_state = libssh2_NB_state_sent;\n    }\n\n    if (session->userauth_host_state == libssh2_NB_state_sent) {\n        static const unsigned char reply_codes[3] =\n            { SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE, 0 };\n        size_t data_len;\n        rc = _libssh2_packet_requirev(session, reply_codes,\n                                      &session->userauth_host_data,\n                                      &data_len, 0, NULL, 0,\n                                      &session->\n                                      userauth_host_packet_requirev_state);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, \"Would block\");\n        }\n\n        session->userauth_host_state = libssh2_NB_state_idle;\n        if (rc) {\n            return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                                  \"Auth failed\");\n        }\n\n        if (session->userauth_host_data[0] == SSH_MSG_USERAUTH_SUCCESS) {\n            _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                           \"Hostbased authentication successful\");\n            /* We are us and we've proved it. */\n            LIBSSH2_FREE(session, session->userauth_host_data);\n            session->userauth_host_data = NULL;\n            session->state |= LIBSSH2_STATE_AUTHENTICATED;\n            return 0;\n        }\n    }\n\n    /* This public key is not allowed for this user on this server */\n    LIBSSH2_FREE(session, session->userauth_host_data);\n    session->userauth_host_data = NULL;\n    return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                          \"Invalid signature for supplied public key, or bad \"\n                          \"username/public key combination\");\n}\n\n/* libssh2_userauth_hostbased_fromfile_ex\n * Authenticate using a keypair found in the named files\n */\nLIBSSH2_API int\nlibssh2_userauth_hostbased_fromfile_ex(LIBSSH2_SESSION *session,\n                                       const char *user,\n                                       unsigned int user_len,\n                                       const char *publickey,\n                                       const char *privatekey,\n                                       const char *passphrase,\n                                       const char *host,\n                                       unsigned int host_len,\n                                       const char *localuser,\n                                       unsigned int localuser_len)\n{\n    int rc;\n    BLOCK_ADJUST(rc, session,\n                 userauth_hostbased_fromfile(session, user, user_len,\n                                             publickey, privatekey,\n                                             passphrase, host, host_len,\n                                             localuser, localuser_len));\n    return rc;\n}\n\n\n\nint\n_libssh2_userauth_publickey(LIBSSH2_SESSION *session,\n                            const char *username,\n                            unsigned int username_len,\n                            const unsigned char *pubkeydata,\n                            unsigned long pubkeydata_len,\n                            LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC((*sign_callback)),\n                            void *abstract)\n{\n    unsigned char reply_codes[4] =\n        { SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE,\n          SSH_MSG_USERAUTH_PK_OK, 0\n        };\n    int rc;\n    unsigned char *s;\n\n    if (session->userauth_pblc_state == libssh2_NB_state_idle) {\n\n        /*\n         * The call to _libssh2_ntohu32 later relies on pubkeydata having at\n         * least 4 valid bytes containing the length of the method name.\n         */\n        if (pubkeydata_len < 4)\n            return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                                  \"Invalid public key, too short\");\n\n        /* Zero the whole thing out */\n        memset(&session->userauth_pblc_packet_requirev_state, 0,\n               sizeof(session->userauth_pblc_packet_requirev_state));\n\n        /*\n         * As an optimisation, userauth_publickey_fromfile reuses a\n         * previously allocated copy of the method name to avoid an extra\n         * allocation/free.\n         * For other uses, we allocate and populate it here.\n         */\n        if (!session->userauth_pblc_method) {\n            session->userauth_pblc_method_len = _libssh2_ntohu32(pubkeydata);\n\n            if(session->userauth_pblc_method_len > pubkeydata_len)\n                /* the method length simply cannot be longer than the entire\n                   passed in data, so we use this to detect crazy input\n                   data */\n                return _libssh2_error(session,\n                                      LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                                      \"Invalid public key\");\n\n            session->userauth_pblc_method =\n                LIBSSH2_ALLOC(session, session->userauth_pblc_method_len);\n            if (!session->userauth_pblc_method) {\n                return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                      \"Unable to allocate memory for public key \"\n                                      \"data\");\n            }\n            memcpy(session->userauth_pblc_method, pubkeydata + 4,\n                   session->userauth_pblc_method_len);\n        }\n        /*\n         * The length of the method name read from plaintext prefix in the\n         * file must match length embedded in the key.\n         * TODO: The data should match too but we don't check that. Should we?\n         */\n        else if (session->userauth_pblc_method_len !=\n                 _libssh2_ntohu32(pubkeydata))\n            return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                                  \"Invalid public key\");\n\n        /*\n         * 45 = packet_type(1) + username_len(4) + servicename_len(4) +\n         * service_name(14)\"ssh-connection\" + authmethod_len(4) +\n         * authmethod(9)\"publickey\" + sig_included(1)'\\0' + algmethod_len(4) +\n         * publickey_len(4)\n         */\n        session->userauth_pblc_packet_len =\n            username_len + session->userauth_pblc_method_len + pubkeydata_len +\n            45;\n\n        /*\n         * Preallocate space for an overall length, method name again, and the\n         * signature, which won't be any larger than the size of the\n         * publickeydata itself.\n         *\n         * Note that the 'pubkeydata_len' extra bytes allocated here will not\n         * be used in this first send, but will be used in the later one where\n         * this same allocation is re-used.\n         */\n        s = session->userauth_pblc_packet =\n            LIBSSH2_ALLOC(session,\n                          session->userauth_pblc_packet_len + 4 +\n                          (4 + session->userauth_pblc_method_len)\n                          + (4 + pubkeydata_len));\n        if (!session->userauth_pblc_packet) {\n            LIBSSH2_FREE(session, session->userauth_pblc_method);\n            session->userauth_pblc_method = NULL;\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Out of memory\");\n        }\n\n        *s++ = SSH_MSG_USERAUTH_REQUEST;\n        _libssh2_store_str(&s, username, username_len);\n        _libssh2_store_str(&s, \"ssh-connection\", 14);\n        _libssh2_store_str(&s, \"publickey\", 9);\n\n        session->userauth_pblc_b = s;\n        /* Not sending signature with *this* packet */\n        *s++ = 0;\n\n        _libssh2_store_str(&s, (const char *)session->userauth_pblc_method,\n                           session->userauth_pblc_method_len);\n        _libssh2_store_str(&s, (const char *)pubkeydata, pubkeydata_len);\n\n        _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                       \"Attempting publickey authentication\");\n\n        session->userauth_pblc_state = libssh2_NB_state_created;\n    }\n\n    if (session->userauth_pblc_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, session->userauth_pblc_packet,\n                                     session->userauth_pblc_packet_len,\n                                     NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN)\n            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, \"Would block\");\n        else if (rc) {\n            LIBSSH2_FREE(session, session->userauth_pblc_packet);\n            session->userauth_pblc_packet = NULL;\n            LIBSSH2_FREE(session, session->userauth_pblc_method);\n            session->userauth_pblc_method = NULL;\n            session->userauth_pblc_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send userauth-publickey request\");\n        }\n\n        session->userauth_pblc_state = libssh2_NB_state_sent;\n    }\n\n    if (session->userauth_pblc_state == libssh2_NB_state_sent) {\n        rc = _libssh2_packet_requirev(session, reply_codes,\n                                      &session->userauth_pblc_data,\n                                      &session->userauth_pblc_data_len, 0,\n                                      NULL, 0,\n                                      &session->\n                                      userauth_pblc_packet_requirev_state);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, \"Would block\");\n        }\n        else if (rc) {\n            LIBSSH2_FREE(session, session->userauth_pblc_packet);\n            session->userauth_pblc_packet = NULL;\n            LIBSSH2_FREE(session, session->userauth_pblc_method);\n            session->userauth_pblc_method = NULL;\n            session->userauth_pblc_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                                  \"Waiting for USERAUTH response\");\n        }\n\n        if (session->userauth_pblc_data[0] == SSH_MSG_USERAUTH_SUCCESS) {\n            _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                           \"Pubkey authentication prematurely successful\");\n            /*\n             * God help any SSH server that allows an UNVERIFIED\n             * public key to validate the user\n             */\n            LIBSSH2_FREE(session, session->userauth_pblc_data);\n            session->userauth_pblc_data = NULL;\n            LIBSSH2_FREE(session, session->userauth_pblc_packet);\n            session->userauth_pblc_packet = NULL;\n            LIBSSH2_FREE(session, session->userauth_pblc_method);\n            session->userauth_pblc_method = NULL;\n            session->state |= LIBSSH2_STATE_AUTHENTICATED;\n            session->userauth_pblc_state = libssh2_NB_state_idle;\n            return 0;\n        }\n\n        if (session->userauth_pblc_data[0] == SSH_MSG_USERAUTH_FAILURE) {\n            /* This public key is not allowed for this user on this server */\n            LIBSSH2_FREE(session, session->userauth_pblc_data);\n            session->userauth_pblc_data = NULL;\n            LIBSSH2_FREE(session, session->userauth_pblc_packet);\n            session->userauth_pblc_packet = NULL;\n            LIBSSH2_FREE(session, session->userauth_pblc_method);\n            session->userauth_pblc_method = NULL;\n            session->userauth_pblc_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_AUTHENTICATION_FAILED,\n                                  \"Username/PublicKey combination invalid\");\n        }\n\n        /* Semi-Success! */\n        LIBSSH2_FREE(session, session->userauth_pblc_data);\n        session->userauth_pblc_data = NULL;\n\n        *session->userauth_pblc_b = 0x01;\n        session->userauth_pblc_state = libssh2_NB_state_sent1;\n    }\n\n    if (session->userauth_pblc_state == libssh2_NB_state_sent1) {\n        unsigned char *buf;\n        unsigned char *sig;\n        size_t sig_len;\n\n        s = buf = LIBSSH2_ALLOC(session, 4 + session->session_id_len\n                                + session->userauth_pblc_packet_len);\n        if (!buf) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"userauth-publickey signed data\");\n        }\n\n        _libssh2_store_str(&s, (const char *)session->session_id,\n                           session->session_id_len);\n\n        memcpy (s, session->userauth_pblc_packet,\n                session->userauth_pblc_packet_len);\n        s += session->userauth_pblc_packet_len;\n\n        rc = sign_callback(session, &sig, &sig_len, buf, s - buf, abstract);\n        LIBSSH2_FREE(session, buf);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, \"Would block\");\n        } else if (rc) {\n            LIBSSH2_FREE(session, session->userauth_pblc_method);\n            session->userauth_pblc_method = NULL;\n            LIBSSH2_FREE(session, session->userauth_pblc_packet);\n            session->userauth_pblc_packet = NULL;\n            session->userauth_pblc_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                                  \"Callback returned error\");\n        }\n\n        /*\n         * If this function was restarted, pubkeydata_len might still be 0\n         * which will cause an unnecessary but harmless realloc here.\n         */\n        if (sig_len > pubkeydata_len) {\n            unsigned char *newpacket;\n            /* Should *NEVER* happen, but...well.. better safe than sorry */\n            newpacket = LIBSSH2_REALLOC(session,\n                                        session->userauth_pblc_packet,\n                                        session->userauth_pblc_packet_len + 4 +\n                                        (4 + session->userauth_pblc_method_len)\n                                        + (4 + sig_len)); /* PK sigblob */\n            if (!newpacket) {\n                LIBSSH2_FREE(session, sig);\n                LIBSSH2_FREE(session, session->userauth_pblc_packet);\n                session->userauth_pblc_packet = NULL;\n                LIBSSH2_FREE(session, session->userauth_pblc_method);\n                session->userauth_pblc_method = NULL;\n                session->userauth_pblc_state = libssh2_NB_state_idle;\n                return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                      \"Failed allocating additional space for \"\n                                      \"userauth-publickey packet\");\n            }\n            session->userauth_pblc_packet = newpacket;\n        }\n\n        s = session->userauth_pblc_packet + session->userauth_pblc_packet_len;\n        session->userauth_pblc_b = NULL;\n\n        _libssh2_store_u32(&s,\n                           4 + session->userauth_pblc_method_len + 4 + sig_len);\n        _libssh2_store_str(&s, (const char *)session->userauth_pblc_method,\n                           session->userauth_pblc_method_len);\n\n        LIBSSH2_FREE(session, session->userauth_pblc_method);\n        session->userauth_pblc_method = NULL;\n\n        _libssh2_store_str(&s, (const char *)sig, sig_len);\n        LIBSSH2_FREE(session, sig);\n\n        _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                       \"Attempting publickey authentication -- phase 2\");\n\n        session->userauth_pblc_s = s;\n        session->userauth_pblc_state = libssh2_NB_state_sent2;\n    }\n\n    if (session->userauth_pblc_state == libssh2_NB_state_sent2) {\n        rc = _libssh2_transport_send(session, session->userauth_pblc_packet,\n                                     session->userauth_pblc_s -\n                                     session->userauth_pblc_packet,\n                                     NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, \"Would block\");\n        } else if (rc) {\n            LIBSSH2_FREE(session, session->userauth_pblc_packet);\n            session->userauth_pblc_packet = NULL;\n            session->userauth_pblc_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send userauth-publickey request\");\n        }\n        LIBSSH2_FREE(session, session->userauth_pblc_packet);\n        session->userauth_pblc_packet = NULL;\n\n        session->userauth_pblc_state = libssh2_NB_state_sent3;\n    }\n\n    /* PK_OK is no longer valid */\n    reply_codes[2] = 0;\n\n    rc = _libssh2_packet_requirev(session, reply_codes,\n                                  &session->userauth_pblc_data,\n                                  &session->userauth_pblc_data_len, 0, NULL, 0,\n                                  &session->userauth_pblc_packet_requirev_state);\n    if (rc == LIBSSH2_ERROR_EAGAIN) {\n        return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                              \"Would block requesting userauth list\");\n    } else if (rc) {\n        session->userauth_pblc_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                              \"Waiting for publickey USERAUTH response\");\n    }\n\n    if (session->userauth_pblc_data[0] == SSH_MSG_USERAUTH_SUCCESS) {\n        _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                       \"Publickey authentication successful\");\n        /* We are us and we've proved it. */\n        LIBSSH2_FREE(session, session->userauth_pblc_data);\n        session->userauth_pblc_data = NULL;\n        session->state |= LIBSSH2_STATE_AUTHENTICATED;\n        session->userauth_pblc_state = libssh2_NB_state_idle;\n        return 0;\n    }\n\n    /* This public key is not allowed for this user on this server */\n    LIBSSH2_FREE(session, session->userauth_pblc_data);\n    session->userauth_pblc_data = NULL;\n    session->userauth_pblc_state = libssh2_NB_state_idle;\n    return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                          \"Invalid signature for supplied public key, or bad \"\n                          \"username/public key combination\");\n}\n\n /*\n  * userauth_publickey_frommemory\n  * Authenticate using a keypair from memory\n  */\nstatic int\nuserauth_publickey_frommemory(LIBSSH2_SESSION *session,\n                              const char *username,\n                              size_t username_len,\n                              const char *publickeydata,\n                              size_t publickeydata_len,\n                              const char *privatekeydata,\n                              size_t privatekeydata_len,\n                              const char *passphrase)\n{\n    unsigned char *pubkeydata = NULL;\n    size_t pubkeydata_len = 0;\n    struct privkey_file privkey_file;\n    void *abstract = &privkey_file;\n    int rc;\n\n    privkey_file.filename = privatekeydata;\n    privkey_file.passphrase = passphrase;\n\n    if (session->userauth_pblc_state == libssh2_NB_state_idle) {\n        if (publickeydata_len && publickeydata) {\n            rc = memory_read_publickey(session, &session->userauth_pblc_method,\n                                       &session->userauth_pblc_method_len,\n                                       &pubkeydata, &pubkeydata_len,\n                                       publickeydata, publickeydata_len);\n            if(rc)\n                return rc;\n        }\n        else if (privatekeydata_len && privatekeydata) {\n            /* Compute public key from private key. */\n            if (_libssh2_pub_priv_keyfilememory(session,\n                                                &session->userauth_pblc_method,\n                                                &session->userauth_pblc_method_len,\n                                                &pubkeydata, &pubkeydata_len,\n                                                privatekeydata, privatekeydata_len,\n                                                passphrase))\n                return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                                      \"Unable to extract public key \"\n                                      \"from private key.\");\n        }\n        else {\n            return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                                  \"Invalid data in public and private key.\");\n        }\n    }\n\n    rc = _libssh2_userauth_publickey(session, username, username_len,\n                                     pubkeydata, pubkeydata_len,\n                                     sign_frommemory, &abstract);\n    if(pubkeydata)\n        LIBSSH2_FREE(session, pubkeydata);\n\n    return rc;\n}\n\n/*\n * userauth_publickey_fromfile\n * Authenticate using a keypair found in the named files\n */\nstatic int\nuserauth_publickey_fromfile(LIBSSH2_SESSION *session,\n                            const char *username,\n                            size_t username_len,\n                            const char *publickey,\n                            const char *privatekey,\n                            const char *passphrase)\n{\n    unsigned char *pubkeydata = NULL;\n    size_t pubkeydata_len = 0;\n    struct privkey_file privkey_file;\n    void *abstract = &privkey_file;\n    int rc;\n\n    privkey_file.filename = privatekey;\n    privkey_file.passphrase = passphrase;\n\n    if (session->userauth_pblc_state == libssh2_NB_state_idle) {\n        if (publickey) {\n            rc = file_read_publickey(session, &session->userauth_pblc_method,\n                                     &session->userauth_pblc_method_len,\n                                     &pubkeydata, &pubkeydata_len,publickey);\n            if (rc)\n                return rc;\n        }\n        else {\n            /* Compute public key from private key. */\n            rc = _libssh2_pub_priv_keyfile(session,\n                                           &session->userauth_pblc_method,\n                                           &session->userauth_pblc_method_len,\n                                           &pubkeydata, &pubkeydata_len,\n                                           privatekey, passphrase);\n\n            /* _libssh2_pub_priv_keyfile calls _libssh2_error() */\n            if (rc)\n                return rc;\n        }\n    }\n\n    rc = _libssh2_userauth_publickey(session, username, username_len,\n                                     pubkeydata, pubkeydata_len,\n                                     sign_fromfile, &abstract);\n    if(pubkeydata)\n        LIBSSH2_FREE(session, pubkeydata);\n\n    return rc;\n}\n\n/* libssh2_userauth_publickey_frommemory\n * Authenticate using a keypair from memory\n */\nLIBSSH2_API int\nlibssh2_userauth_publickey_frommemory(LIBSSH2_SESSION *session,\n                                      const char *user,\n                                      size_t user_len,\n                                      const char *publickeyfiledata,\n                                      size_t publickeyfiledata_len,\n                                      const char *privatekeyfiledata,\n                                      size_t privatekeyfiledata_len,\n                                      const char *passphrase)\n{\n    int rc;\n\n    if(NULL == passphrase)\n        /* if given a NULL pointer, make it point to a zero-length\n           string to save us from having to check this all over */\n        passphrase=\"\";\n\n    BLOCK_ADJUST(rc, session,\n                 userauth_publickey_frommemory(session, user, user_len,\n                                               publickeyfiledata,\n                                               publickeyfiledata_len,\n                                               privatekeyfiledata,\n                                               privatekeyfiledata_len,\n                                               passphrase));\n    return rc;\n}\n\n/* libssh2_userauth_publickey_fromfile_ex\n * Authenticate using a keypair found in the named files\n */\nLIBSSH2_API int\nlibssh2_userauth_publickey_fromfile_ex(LIBSSH2_SESSION *session,\n                                       const char *user,\n                                       unsigned int user_len,\n                                       const char *publickey,\n                                       const char *privatekey,\n                                       const char *passphrase)\n{\n    int rc;\n\n    if(NULL == passphrase)\n        /* if given a NULL pointer, make it point to a zero-length\n           string to save us from having to check this all over */\n        passphrase=\"\";\n\n    BLOCK_ADJUST(rc, session,\n                 userauth_publickey_fromfile(session, user, user_len,\n                                             publickey, privatekey,\n                                             passphrase));\n    return rc;\n}\n\n/* libssh2_userauth_publickey_ex\n * Authenticate using an external callback function\n */\nLIBSSH2_API int\nlibssh2_userauth_publickey(LIBSSH2_SESSION *session,\n                           const char *user,\n                           const unsigned char *pubkeydata,\n                           size_t pubkeydata_len,\n                           LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC((*sign_callback)),\n                           void **abstract)\n{\n    int rc;\n\n    if(!session)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, session,\n                 _libssh2_userauth_publickey(session, user, strlen(user),\n                                             pubkeydata, pubkeydata_len,\n                                             sign_callback, abstract));\n    return rc;\n}\n\n\n\n/*\n * userauth_keyboard_interactive\n *\n * Authenticate using a challenge-response authentication\n */\nstatic int\nuserauth_keyboard_interactive(LIBSSH2_SESSION * session,\n                              const char *username,\n                              unsigned int username_len,\n                              LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC((*response_callback)))\n{\n    unsigned char *s;\n    int rc;\n\n    static const unsigned char reply_codes[4] = {\n        SSH_MSG_USERAUTH_SUCCESS,\n        SSH_MSG_USERAUTH_FAILURE, SSH_MSG_USERAUTH_INFO_REQUEST, 0\n    };\n    unsigned int language_tag_len;\n    unsigned int i;\n\n    if (session->userauth_kybd_state == libssh2_NB_state_idle) {\n        session->userauth_kybd_auth_name = NULL;\n        session->userauth_kybd_auth_instruction = NULL;\n        session->userauth_kybd_num_prompts = 0;\n        session->userauth_kybd_auth_failure = 1;\n        session->userauth_kybd_prompts = NULL;\n        session->userauth_kybd_responses = NULL;\n\n        /* Zero the whole thing out */\n        memset(&session->userauth_kybd_packet_requirev_state, 0,\n               sizeof(session->userauth_kybd_packet_requirev_state));\n\n        session->userauth_kybd_packet_len =\n            1                   /* byte    SSH_MSG_USERAUTH_REQUEST */\n            + 4 + username_len  /* string  user name (ISO-10646 UTF-8, as\n                                   defined in [RFC-3629]) */\n            + 4 + 14            /* string  service name (US-ASCII) */\n            + 4 + 20            /* string  \"keyboard-interactive\" (US-ASCII) */\n            + 4 + 0             /* string  language tag (as defined in\n                                   [RFC-3066]) */\n            + 4 + 0             /* string  submethods (ISO-10646 UTF-8) */\n            ;\n\n        session->userauth_kybd_data = s =\n            LIBSSH2_ALLOC(session, session->userauth_kybd_packet_len);\n        if (!s) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"keyboard-interactive authentication\");\n        }\n\n        *s++ = SSH_MSG_USERAUTH_REQUEST;\n\n        /* user name */\n        _libssh2_store_str(&s, username, username_len);\n\n        /* service name */\n        _libssh2_store_str(&s, \"ssh-connection\", sizeof(\"ssh-connection\") - 1);\n\n        /* \"keyboard-interactive\" */\n        _libssh2_store_str(&s, \"keyboard-interactive\",\n                           sizeof(\"keyboard-interactive\") - 1);\n        /* language tag */\n        _libssh2_store_u32(&s, 0);\n\n        /* submethods */\n        _libssh2_store_u32(&s, 0);\n\n        _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                       \"Attempting keyboard-interactive authentication\");\n\n        session->userauth_kybd_state = libssh2_NB_state_created;\n    }\n\n    if (session->userauth_kybd_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, session->userauth_kybd_data,\n                                     session->userauth_kybd_packet_len,\n                                     NULL, 0);\n        if (rc == LIBSSH2_ERROR_EAGAIN) {\n            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, \"Would block\");\n        } else if (rc) {\n            LIBSSH2_FREE(session, session->userauth_kybd_data);\n            session->userauth_kybd_data = NULL;\n            session->userauth_kybd_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send keyboard-interactive request\");\n        }\n        LIBSSH2_FREE(session, session->userauth_kybd_data);\n        session->userauth_kybd_data = NULL;\n\n        session->userauth_kybd_state = libssh2_NB_state_sent;\n    }\n\n    for(;;) {\n        if (session->userauth_kybd_state == libssh2_NB_state_sent) {\n            rc = _libssh2_packet_requirev(session, reply_codes,\n                                          &session->userauth_kybd_data,\n                                          &session->userauth_kybd_data_len,\n                                          0, NULL, 0,\n                                          &session->\n                                          userauth_kybd_packet_requirev_state);\n            if (rc == LIBSSH2_ERROR_EAGAIN) {\n                return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                      \"Would block\");\n            } else if (rc) {\n                session->userauth_kybd_state = libssh2_NB_state_idle;\n                return _libssh2_error(session,\n                                      LIBSSH2_ERROR_AUTHENTICATION_FAILED,\n                                      \"Waiting for keyboard USERAUTH response\");\n            }\n\n            if (session->userauth_kybd_data[0] == SSH_MSG_USERAUTH_SUCCESS) {\n                _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                               \"Keyboard-interactive authentication successful\");\n                LIBSSH2_FREE(session, session->userauth_kybd_data);\n                session->userauth_kybd_data = NULL;\n                session->state |= LIBSSH2_STATE_AUTHENTICATED;\n                session->userauth_kybd_state = libssh2_NB_state_idle;\n                return 0;\n            }\n\n            if (session->userauth_kybd_data[0] == SSH_MSG_USERAUTH_FAILURE) {\n                _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                               \"Keyboard-interactive authentication failed\");\n                LIBSSH2_FREE(session, session->userauth_kybd_data);\n                session->userauth_kybd_data = NULL;\n                session->userauth_kybd_state = libssh2_NB_state_idle;\n                return _libssh2_error(session,\n                                      LIBSSH2_ERROR_AUTHENTICATION_FAILED,\n                                      \"Authentication failed \"\n                                      \"(keyboard-interactive)\");\n            }\n\n            /* server requested PAM-like conversation */\n            s = session->userauth_kybd_data + 1;\n\n            /* string    name (ISO-10646 UTF-8) */\n            session->userauth_kybd_auth_name_len = _libssh2_ntohu32(s);\n            s += 4;\n            if(session->userauth_kybd_auth_name_len) {\n                session->userauth_kybd_auth_name =\n                    LIBSSH2_ALLOC(session,\n                                  session->userauth_kybd_auth_name_len);\n                if (!session->userauth_kybd_auth_name) {\n                    _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                   \"Unable to allocate memory for \"\n                                   \"keyboard-interactive 'name' \"\n                                   \"request field\");\n                    goto cleanup;\n                }\n                memcpy(session->userauth_kybd_auth_name, s,\n                       session->userauth_kybd_auth_name_len);\n                s += session->userauth_kybd_auth_name_len;\n            }\n\n            /* string    instruction (ISO-10646 UTF-8) */\n            session->userauth_kybd_auth_instruction_len = _libssh2_ntohu32(s);\n            s += 4;\n            if(session->userauth_kybd_auth_instruction_len) {\n                session->userauth_kybd_auth_instruction =\n                    LIBSSH2_ALLOC(session,\n                                  session->userauth_kybd_auth_instruction_len);\n                if (!session->userauth_kybd_auth_instruction) {\n                    _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                   \"Unable to allocate memory for \"\n                                   \"keyboard-interactive 'instruction' \"\n                                   \"request field\");\n                    goto cleanup;\n                }\n                memcpy(session->userauth_kybd_auth_instruction, s,\n                       session->userauth_kybd_auth_instruction_len);\n                s += session->userauth_kybd_auth_instruction_len;\n            }\n\n            /* string    language tag (as defined in [RFC-3066]) */\n            language_tag_len = _libssh2_ntohu32(s);\n            s += 4;\n\n            /* ignoring this field as deprecated */\n            s += language_tag_len;\n\n            /* int       num-prompts */\n            session->userauth_kybd_num_prompts = _libssh2_ntohu32(s);\n            s += 4;\n\n            if(session->userauth_kybd_num_prompts) {\n                session->userauth_kybd_prompts =\n                    LIBSSH2_CALLOC(session,\n                                   sizeof(LIBSSH2_USERAUTH_KBDINT_PROMPT) *\n                                   session->userauth_kybd_num_prompts);\n                if (!session->userauth_kybd_prompts) {\n                    _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                   \"Unable to allocate memory for \"\n                                   \"keyboard-interactive prompts array\");\n                    goto cleanup;\n                }\n\n                session->userauth_kybd_responses =\n                    LIBSSH2_CALLOC(session,\n                                   sizeof(LIBSSH2_USERAUTH_KBDINT_RESPONSE) *\n                                   session->userauth_kybd_num_prompts);\n                if (!session->userauth_kybd_responses) {\n                    _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                   \"Unable to allocate memory for \"\n                                   \"keyboard-interactive responses array\");\n                    goto cleanup;\n                }\n\n                for(i = 0; i < session->userauth_kybd_num_prompts; i++) {\n                    /* string    prompt[1] (ISO-10646 UTF-8) */\n                    session->userauth_kybd_prompts[i].length =\n                        _libssh2_ntohu32(s);\n                    s += 4;\n                    session->userauth_kybd_prompts[i].text =\n                        LIBSSH2_CALLOC(session,\n                                       session->userauth_kybd_prompts[i].length);\n                    if (!session->userauth_kybd_prompts[i].text) {\n                        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                       \"Unable to allocate memory for \"\n                                       \"keyboard-interactive prompt message\");\n                        goto cleanup;\n                    }\n                    memcpy(session->userauth_kybd_prompts[i].text, s,\n                           session->userauth_kybd_prompts[i].length);\n                    s += session->userauth_kybd_prompts[i].length;\n\n                    /* boolean   echo[1] */\n                    session->userauth_kybd_prompts[i].echo = *s++;\n                }\n            }\n\n            response_callback(session->userauth_kybd_auth_name,\n                              session->userauth_kybd_auth_name_len,\n                              session->userauth_kybd_auth_instruction,\n                              session->userauth_kybd_auth_instruction_len,\n                              session->userauth_kybd_num_prompts,\n                              session->userauth_kybd_prompts,\n                              session->userauth_kybd_responses,\n                              &session->abstract);\n\n            _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                           \"Keyboard-interactive response callback function\"\n                           \" invoked\");\n\n            session->userauth_kybd_packet_len =\n                1 /* byte      SSH_MSG_USERAUTH_INFO_RESPONSE */\n                + 4             /* int       num-responses */\n                ;\n\n            for(i = 0; i < session->userauth_kybd_num_prompts; i++) {\n                /* string    response[1] (ISO-10646 UTF-8) */\n                session->userauth_kybd_packet_len +=\n                    4 + session->userauth_kybd_responses[i].length;\n            }\n\n            /* A new userauth_kybd_data area is to be allocated, free the\n               former one. */\n            LIBSSH2_FREE(session, session->userauth_kybd_data);\n\n            session->userauth_kybd_data = s =\n                LIBSSH2_ALLOC(session, session->userauth_kybd_packet_len);\n            if (!s) {\n                _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                               \"Unable to allocate memory for keyboard-\"\n                               \"interactive response packet\");\n                goto cleanup;\n            }\n\n            *s = SSH_MSG_USERAUTH_INFO_RESPONSE;\n            s++;\n            _libssh2_store_u32(&s, session->userauth_kybd_num_prompts);\n\n            for(i = 0; i < session->userauth_kybd_num_prompts; i++) {\n                _libssh2_store_str(&s,\n                                   session->userauth_kybd_responses[i].text,\n                                   session->userauth_kybd_responses[i].length);\n            }\n\n            session->userauth_kybd_state = libssh2_NB_state_sent1;\n        }\n\n        if (session->userauth_kybd_state == libssh2_NB_state_sent1) {\n            rc = _libssh2_transport_send(session, session->userauth_kybd_data,\n                                         session->userauth_kybd_packet_len,\n                                         NULL, 0);\n            if (rc == LIBSSH2_ERROR_EAGAIN)\n                return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                      \"Would block\");\n            if (rc) {\n                _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                               \"Unable to send userauth-keyboard-interactive\"\n                               \" request\");\n                goto cleanup;\n            }\n\n            session->userauth_kybd_auth_failure = 0;\n        }\n\n      cleanup:\n        /*\n         * It's safe to clean all the data here, because unallocated pointers\n         * are filled by zeroes\n         */\n\n        LIBSSH2_FREE(session, session->userauth_kybd_data);\n        session->userauth_kybd_data = NULL;\n\n        if (session->userauth_kybd_prompts) {\n            for(i = 0; i < session->userauth_kybd_num_prompts; i++) {\n                LIBSSH2_FREE(session, session->userauth_kybd_prompts[i].text);\n                session->userauth_kybd_prompts[i].text = NULL;\n            }\n        }\n\n        if (session->userauth_kybd_responses) {\n            for(i = 0; i < session->userauth_kybd_num_prompts; i++) {\n                LIBSSH2_FREE(session,\n                             session->userauth_kybd_responses[i].text);\n                session->userauth_kybd_responses[i].text = NULL;\n            }\n        }\n\n        if(session->userauth_kybd_prompts) {\n            LIBSSH2_FREE(session, session->userauth_kybd_prompts);\n            session->userauth_kybd_prompts = NULL;\n        }\n        if(session->userauth_kybd_responses) {\n            LIBSSH2_FREE(session, session->userauth_kybd_responses);\n            session->userauth_kybd_responses = NULL;\n        }\n        if(session->userauth_kybd_auth_name) {\n            LIBSSH2_FREE(session, session->userauth_kybd_auth_name);\n            session->userauth_kybd_auth_name = NULL;\n        }\n        if(session->userauth_kybd_auth_instruction) {\n            LIBSSH2_FREE(session, session->userauth_kybd_auth_instruction);\n            session->userauth_kybd_auth_instruction = NULL;\n        }\n\n        if (session->userauth_kybd_auth_failure) {\n            session->userauth_kybd_state = libssh2_NB_state_idle;\n            return -1;\n        }\n\n        session->userauth_kybd_state = libssh2_NB_state_sent;\n    }\n}\n\n/*\n * libssh2_userauth_keyboard_interactive_ex\n *\n * Authenticate using a challenge-response authentication\n */\nLIBSSH2_API int\nlibssh2_userauth_keyboard_interactive_ex(LIBSSH2_SESSION *session,\n                                         const char *user,\n                                         unsigned int user_len,\n                                         LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC((*response_callback)))\n{\n    int rc;\n    BLOCK_ADJUST(rc, session,\n                 userauth_keyboard_interactive(session, user, user_len,\n                                               response_callback));\n    return rc;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/userauth.h",
    "content": "#ifndef LIBSSH2_USERAUTH_H\n#define LIBSSH2_USERAUTH_H\n/* Copyright (c) 2004-2007, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2009-2010 by Daniel Stenberg\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\nint\n_libssh2_userauth_publickey(LIBSSH2_SESSION *session,\n                            const char *username,\n                            unsigned int username_len,\n                            const unsigned char *pubkeydata,\n                            unsigned long pubkeydata_len,\n                            LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC((*sign_callback)),\n                            void *abstract);\n\n#endif /* LIBSSH2_USERAUTH_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/version.c",
    "content": "/* Copyright (C) 2009 Daniel Stenberg.  All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n */\n\n#include \"libssh2_priv.h\"\n\n/*\n  libssh2_version() can be used like this:\n\n  if (!libssh2_version(LIBSSH2_VERSION_NUM)) {\n    fprintf (stderr, \"Runtime libssh2 version too old!\\n\");\n    exit(1);\n  }\n*/\nLIBSSH2_API\nconst char *libssh2_version(int req_version_num)\n{\n    if(req_version_num <= LIBSSH2_VERSION_NUM)\n        return LIBSSH2_VERSION;\n    return NULL; /* this is not a suitable library! */\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/wincng.c",
    "content": "/*\n * Copyright (C) 2013-2015 Marc Hoersken <info@marc-hoersken.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\n#ifdef LIBSSH2_WINCNG /* compile only if we build with wincng */\n\n/* required for cross-compilation against the w64 mingw-runtime package */\n#if defined(_WIN32_WINNT) && (_WIN32_WINNT < 0x0600)\n#undef _WIN32_WINNT\n#endif\n#ifndef _WIN32_WINNT\n#define _WIN32_WINNT 0x0600\n#endif\n\n/* specify the required libraries for dependencies using MSVC */\n#ifdef _MSC_VER\n#pragma comment(lib, \"bcrypt.lib\")\n#ifdef HAVE_LIBCRYPT32\n#pragma comment(lib, \"crypt32.lib\")\n#endif\n#endif\n\n#include <windows.h>\n#include <bcrypt.h>\n#include <math.h>\n\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n#ifdef HAVE_LIBCRYPT32\n#include <wincrypt.h>\n#endif\n\n#define PEM_RSA_HEADER \"-----BEGIN RSA PRIVATE KEY-----\"\n#define PEM_RSA_FOOTER \"-----END RSA PRIVATE KEY-----\"\n#define PEM_DSA_HEADER \"-----BEGIN DSA PRIVATE KEY-----\"\n#define PEM_DSA_FOOTER \"-----END DSA PRIVATE KEY-----\"\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Missing definitions (for MinGW[-w64])\n */\n#ifndef BCRYPT_SUCCESS\n#define BCRYPT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)\n#endif\n\n#ifndef BCRYPT_RNG_ALGORITHM\n#define BCRYPT_RNG_ALGORITHM L\"RNG\"\n#endif\n\n#ifndef BCRYPT_MD5_ALGORITHM\n#define BCRYPT_MD5_ALGORITHM L\"MD5\"\n#endif\n\n#ifndef BCRYPT_SHA1_ALGORITHM\n#define BCRYPT_SHA1_ALGORITHM L\"SHA1\"\n#endif\n\n#ifndef BCRYPT_SHA256_ALGORITHM\n#define BCRYPT_SHA256_ALGORITHM L\"SHA256\"\n#endif\n\n#ifndef BCRYPT_SHA512_ALGORITHM\n#define BCRYPT_SHA512_ALGORITHM L\"SHA512\"\n#endif\n\n#ifndef BCRYPT_RSA_ALGORITHM\n#define BCRYPT_RSA_ALGORITHM L\"RSA\"\n#endif\n\n#ifndef BCRYPT_DSA_ALGORITHM\n#define BCRYPT_DSA_ALGORITHM L\"DSA\"\n#endif\n\n#ifndef BCRYPT_AES_ALGORITHM\n#define BCRYPT_AES_ALGORITHM L\"AES\"\n#endif\n\n#ifndef BCRYPT_RC4_ALGORITHM\n#define BCRYPT_RC4_ALGORITHM L\"RC4\"\n#endif\n\n#ifndef BCRYPT_3DES_ALGORITHM\n#define BCRYPT_3DES_ALGORITHM L\"3DES\"\n#endif\n\n#ifndef BCRYPT_ALG_HANDLE_HMAC_FLAG\n#define BCRYPT_ALG_HANDLE_HMAC_FLAG 0x00000008\n#endif\n\n#ifndef BCRYPT_DSA_PUBLIC_BLOB\n#define BCRYPT_DSA_PUBLIC_BLOB L\"DSAPUBLICBLOB\"\n#endif\n\n#ifndef BCRYPT_DSA_PUBLIC_MAGIC\n#define BCRYPT_DSA_PUBLIC_MAGIC 0x42505344 /* DSPB */\n#endif\n\n#ifndef BCRYPT_DSA_PRIVATE_BLOB\n#define BCRYPT_DSA_PRIVATE_BLOB L\"DSAPRIVATEBLOB\"\n#endif\n\n#ifndef BCRYPT_DSA_PRIVATE_MAGIC\n#define BCRYPT_DSA_PRIVATE_MAGIC 0x56505344 /* DSPV */\n#endif\n\n#ifndef BCRYPT_RSAPUBLIC_BLOB\n#define BCRYPT_RSAPUBLIC_BLOB L\"RSAPUBLICBLOB\"\n#endif\n\n#ifndef BCRYPT_RSAPUBLIC_MAGIC\n#define BCRYPT_RSAPUBLIC_MAGIC 0x31415352 /* RSA1 */\n#endif\n\n#ifndef BCRYPT_RSAFULLPRIVATE_BLOB\n#define BCRYPT_RSAFULLPRIVATE_BLOB L\"RSAFULLPRIVATEBLOB\"\n#endif\n\n#ifndef BCRYPT_RSAFULLPRIVATE_MAGIC\n#define BCRYPT_RSAFULLPRIVATE_MAGIC 0x33415352 /* RSA3 */\n#endif\n\n#ifndef BCRYPT_KEY_DATA_BLOB\n#define BCRYPT_KEY_DATA_BLOB L\"KeyDataBlob\"\n#endif\n\n#ifndef BCRYPT_MESSAGE_BLOCK_LENGTH\n#define BCRYPT_MESSAGE_BLOCK_LENGTH L\"MessageBlockLength\"\n#endif\n\n#ifndef BCRYPT_NO_KEY_VALIDATION\n#define BCRYPT_NO_KEY_VALIDATION 0x00000008\n#endif\n\n#ifndef BCRYPT_BLOCK_PADDING\n#define BCRYPT_BLOCK_PADDING 0x00000001\n#endif\n\n#ifndef BCRYPT_PAD_NONE\n#define BCRYPT_PAD_NONE 0x00000001\n#endif\n\n#ifndef BCRYPT_PAD_PKCS1\n#define BCRYPT_PAD_PKCS1 0x00000002\n#endif\n\n#ifndef BCRYPT_PAD_OAEP\n#define BCRYPT_PAD_OAEP 0x00000004\n#endif\n\n#ifndef BCRYPT_PAD_PSS\n#define BCRYPT_PAD_PSS 0x00000008\n#endif\n\n#ifndef CRYPT_STRING_ANY\n#define CRYPT_STRING_ANY 0x00000007\n#endif\n\n#ifndef LEGACY_RSAPRIVATE_BLOB\n#define LEGACY_RSAPRIVATE_BLOB L\"CAPIPRIVATEBLOB\"\n#endif\n\n#ifndef PKCS_RSA_PRIVATE_KEY\n#define PKCS_RSA_PRIVATE_KEY (LPCSTR)43\n#endif\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Generic functions\n */\n\nvoid\n_libssh2_wincng_init(void)\n{\n    int ret;\n\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRNG,\n                                      BCRYPT_RNG_ALGORITHM, NULL, 0);\n\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashMD5,\n                                      BCRYPT_MD5_ALGORITHM, NULL, 0);\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA1,\n                                      BCRYPT_SHA1_ALGORITHM, NULL, 0);\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA256,\n                                      BCRYPT_SHA256_ALGORITHM, NULL, 0);\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA512,\n                                      BCRYPT_SHA512_ALGORITHM, NULL, 0);\n\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacMD5,\n                                      BCRYPT_MD5_ALGORITHM, NULL,\n                                      BCRYPT_ALG_HANDLE_HMAC_FLAG);\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA1,\n                                      BCRYPT_SHA1_ALGORITHM, NULL,\n                                      BCRYPT_ALG_HANDLE_HMAC_FLAG);\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA256,\n                                      BCRYPT_SHA256_ALGORITHM, NULL,\n                                      BCRYPT_ALG_HANDLE_HMAC_FLAG);\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA512,\n                                      BCRYPT_SHA512_ALGORITHM, NULL,\n                                      BCRYPT_ALG_HANDLE_HMAC_FLAG);\n\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRSA,\n                                      BCRYPT_RSA_ALGORITHM, NULL, 0);\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgDSA,\n                                      BCRYPT_DSA_ALGORITHM, NULL, 0);\n\n    ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgAES_CBC,\n                                      BCRYPT_AES_ALGORITHM, NULL, 0);\n    if (BCRYPT_SUCCESS(ret)) {\n        ret = BCryptSetProperty(_libssh2_wincng.hAlgAES_CBC, BCRYPT_CHAINING_MODE,\n                                (PBYTE)BCRYPT_CHAIN_MODE_CBC,\n                                sizeof(BCRYPT_CHAIN_MODE_CBC), 0);\n        if (!BCRYPT_SUCCESS(ret)) {\n            (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_CBC, 0);\n        }\n    }\n\n    ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRC4_NA,\n                                      BCRYPT_RC4_ALGORITHM, NULL, 0);\n    if (BCRYPT_SUCCESS(ret)) {\n        ret = BCryptSetProperty(_libssh2_wincng.hAlgRC4_NA, BCRYPT_CHAINING_MODE,\n                                (PBYTE)BCRYPT_CHAIN_MODE_NA,\n                                sizeof(BCRYPT_CHAIN_MODE_NA), 0);\n        if (!BCRYPT_SUCCESS(ret)) {\n            (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRC4_NA, 0);\n        }\n    }\n\n    ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlg3DES_CBC,\n                                      BCRYPT_3DES_ALGORITHM, NULL, 0);\n    if (BCRYPT_SUCCESS(ret)) {\n        ret = BCryptSetProperty(_libssh2_wincng.hAlg3DES_CBC, BCRYPT_CHAINING_MODE,\n                                (PBYTE)BCRYPT_CHAIN_MODE_CBC,\n                                sizeof(BCRYPT_CHAIN_MODE_CBC), 0);\n        if (!BCRYPT_SUCCESS(ret)) {\n            (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlg3DES_CBC, 0);\n        }\n    }\n}\n\nvoid\n_libssh2_wincng_free(void)\n{\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRNG, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashMD5, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA1, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA256, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA512, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacMD5, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA1, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA256, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA512, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRSA, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgDSA, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_CBC, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRC4_NA, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlg3DES_CBC, 0);\n\n    memset(&_libssh2_wincng, 0, sizeof(_libssh2_wincng));\n}\n\nint\n_libssh2_wincng_random(void *buf, int len)\n{\n    int ret;\n\n    ret = BCryptGenRandom(_libssh2_wincng.hAlgRNG, buf, len, 0);\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\nstatic void\n_libssh2_wincng_safe_free(void *buf, int len)\n{\n#ifndef LIBSSH2_CLEAR_MEMORY\n    (void)len;\n#endif\n\n    if (!buf)\n        return;\n\n#ifdef LIBSSH2_CLEAR_MEMORY\n    if (len > 0)\n        SecureZeroMemory(buf, len);\n#endif\n\n    free(buf);\n}\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Hash functions\n */\n\nint\n_libssh2_wincng_hash_init(_libssh2_wincng_hash_ctx *ctx,\n                          BCRYPT_ALG_HANDLE hAlg, unsigned long hashlen,\n                          unsigned char *key, unsigned long keylen)\n{\n    BCRYPT_HASH_HANDLE hHash;\n    unsigned char *pbHashObject;\n    unsigned long dwHashObject, dwHash, cbData;\n    int ret;\n\n    ret = BCryptGetProperty(hAlg, BCRYPT_HASH_LENGTH,\n                            (unsigned char *)&dwHash,\n                            sizeof(dwHash),\n                            &cbData, 0);\n    if ((!BCRYPT_SUCCESS(ret)) || dwHash != hashlen) {\n        return -1;\n    }\n\n    ret = BCryptGetProperty(hAlg, BCRYPT_OBJECT_LENGTH,\n                            (unsigned char *)&dwHashObject,\n                            sizeof(dwHashObject),\n                            &cbData, 0);\n    if (!BCRYPT_SUCCESS(ret)) {\n        return -1;\n    }\n\n    pbHashObject = malloc(dwHashObject);\n    if (!pbHashObject) {\n        return -1;\n    }\n\n\n    ret = BCryptCreateHash(hAlg, &hHash,\n                           pbHashObject, dwHashObject,\n                           key, keylen, 0);\n    if (!BCRYPT_SUCCESS(ret)) {\n        _libssh2_wincng_safe_free(pbHashObject, dwHashObject);\n        return -1;\n    }\n\n\n    ctx->hHash = hHash;\n    ctx->pbHashObject = pbHashObject;\n    ctx->dwHashObject = dwHashObject;\n    ctx->cbHash = dwHash;\n\n    return 0;\n}\n\nint\n_libssh2_wincng_hash_update(_libssh2_wincng_hash_ctx *ctx,\n                            const unsigned char *data, unsigned long datalen)\n{\n    int ret;\n\n    ret = BCryptHashData(ctx->hHash, (unsigned char *)data, datalen, 0);\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\nint\n_libssh2_wincng_hash_final(_libssh2_wincng_hash_ctx *ctx,\n                           unsigned char *hash)\n{\n    int ret;\n\n    ret = BCryptFinishHash(ctx->hHash, hash, ctx->cbHash, 0);\n\n    BCryptDestroyHash(ctx->hHash);\n    ctx->hHash = NULL;\n\n    _libssh2_wincng_safe_free(ctx->pbHashObject, ctx->dwHashObject);\n    ctx->pbHashObject = NULL;\n    ctx->dwHashObject = 0;\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\nint\n_libssh2_wincng_hash(unsigned char *data, unsigned long datalen,\n                     BCRYPT_ALG_HANDLE hAlg,\n                     unsigned char *hash, unsigned long hashlen)\n{\n    _libssh2_wincng_hash_ctx ctx;\n    int ret;\n\n    ret = _libssh2_wincng_hash_init(&ctx, hAlg, hashlen, NULL, 0);\n    if (!ret) {\n        ret = _libssh2_wincng_hash_update(&ctx, data, datalen);\n        ret |= _libssh2_wincng_hash_final(&ctx, hash);\n    }\n\n    return ret;\n}\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: HMAC functions\n */\n\nint\n_libssh2_wincng_hmac_final(_libssh2_wincng_hash_ctx *ctx,\n                           unsigned char *hash)\n{\n    int ret;\n\n    ret = BCryptFinishHash(ctx->hHash, hash, ctx->cbHash, 0);\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\nvoid\n_libssh2_wincng_hmac_cleanup(_libssh2_wincng_hash_ctx *ctx)\n{\n    BCryptDestroyHash(ctx->hHash);\n    ctx->hHash = NULL;\n\n    _libssh2_wincng_safe_free(ctx->pbHashObject, ctx->dwHashObject);\n    ctx->pbHashObject = NULL;\n    ctx->dwHashObject = 0;\n}\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Key functions\n */\n\nint\n_libssh2_wincng_key_sha1_verify(_libssh2_wincng_key_ctx *ctx,\n                                const unsigned char *sig,\n                                unsigned long sig_len,\n                                const unsigned char *m,\n                                unsigned long m_len,\n                                unsigned long flags)\n{\n    BCRYPT_PKCS1_PADDING_INFO paddingInfoPKCS1;\n    void *pPaddingInfo;\n    unsigned char *data, *hash;\n    unsigned long datalen, hashlen;\n    int ret;\n\n    datalen = m_len;\n    data = malloc(datalen);\n    if (!data) {\n        return -1;\n    }\n\n    hashlen = SHA_DIGEST_LENGTH;\n    hash = malloc(hashlen);\n    if (!hash) {\n        free(data);\n        return -1;\n    }\n\n    memcpy(data, m, datalen);\n\n    ret = _libssh2_wincng_hash(data, datalen,\n                               _libssh2_wincng.hAlgHashSHA1,\n                               hash, hashlen);\n\n    _libssh2_wincng_safe_free(data, datalen);\n\n    if (ret) {\n        _libssh2_wincng_safe_free(hash, hashlen);\n        return -1;\n    }\n\n    datalen = sig_len;\n    data = malloc(datalen);\n    if (!data) {\n        _libssh2_wincng_safe_free(hash, hashlen);\n        return -1;\n    }\n\n    if (flags & BCRYPT_PAD_PKCS1) {\n        paddingInfoPKCS1.pszAlgId = BCRYPT_SHA1_ALGORITHM;\n        pPaddingInfo = &paddingInfoPKCS1;\n    } else\n        pPaddingInfo = NULL;\n\n    memcpy(data, sig, datalen);\n\n    ret = BCryptVerifySignature(ctx->hKey, pPaddingInfo,\n                                hash, hashlen, data, datalen, flags);\n\n    _libssh2_wincng_safe_free(hash, hashlen);\n    _libssh2_wincng_safe_free(data, datalen);\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\n#ifdef HAVE_LIBCRYPT32\nstatic int\n_libssh2_wincng_load_pem(LIBSSH2_SESSION *session,\n                         const char *filename,\n                         const char *passphrase,\n                         const char *headerbegin,\n                         const char *headerend,\n                         unsigned char **data,\n                         unsigned int *datalen)\n{\n    FILE *fp;\n    int ret;\n\n    (void)passphrase;\n\n    fp = fopen(filename, \"r\");\n    if (!fp) {\n        return -1;\n    }\n\n    ret = _libssh2_pem_parse(session, headerbegin, headerend,\n                             fp, data, datalen);\n\n    fclose(fp);\n\n    return ret;\n}\n\nstatic int\n_libssh2_wincng_load_private(LIBSSH2_SESSION *session,\n                             const char *filename,\n                             const char *passphrase,\n                             unsigned char **ppbEncoded,\n                             unsigned long *pcbEncoded,\n                             int tryLoadRSA, int tryLoadDSA)\n{\n    unsigned char *data = NULL;\n    unsigned int datalen = 0;\n    int ret = -1;\n\n    if (ret && tryLoadRSA) {\n        ret = _libssh2_wincng_load_pem(session, filename, passphrase,\n                                       PEM_RSA_HEADER, PEM_RSA_FOOTER,\n                                       &data, &datalen);\n    }\n\n    if (ret && tryLoadDSA) {\n        ret = _libssh2_wincng_load_pem(session, filename, passphrase,\n                                       PEM_DSA_HEADER, PEM_DSA_FOOTER,\n                                       &data, &datalen);\n    }\n\n    if (!ret) {\n        *ppbEncoded = data;\n        *pcbEncoded = datalen;\n    }\n\n    return ret;\n}\n\nstatic int\n_libssh2_wincng_load_private_memory(LIBSSH2_SESSION *session,\n                                    const char *privatekeydata,\n                                    size_t privatekeydata_len,\n                                    const char *passphrase,\n                                    unsigned char **ppbEncoded,\n                                    unsigned long *pcbEncoded,\n                                    int tryLoadRSA, int tryLoadDSA)\n{\n    unsigned char *data = NULL;\n    unsigned int datalen = 0;\n    int ret = -1;\n\n    (void)passphrase;\n\n    if (ret && tryLoadRSA) {\n        ret = _libssh2_pem_parse_memory(session,\n                                        PEM_RSA_HEADER, PEM_RSA_FOOTER,\n                                        privatekeydata, privatekeydata_len,\n                                        &data, &datalen);\n    }\n\n    if (ret && tryLoadDSA) {\n        ret = _libssh2_pem_parse_memory(session,\n                                        PEM_DSA_HEADER, PEM_DSA_FOOTER,\n                                        privatekeydata, privatekeydata_len,\n                                        &data, &datalen);\n    }\n\n    if (!ret) {\n        *ppbEncoded = data;\n        *pcbEncoded = datalen;\n    }\n\n    return ret;\n}\n\nstatic int\n_libssh2_wincng_asn_decode(unsigned char *pbEncoded,\n                           unsigned long cbEncoded,\n                           LPCSTR lpszStructType,\n                           unsigned char **ppbDecoded,\n                           unsigned long *pcbDecoded)\n{\n    unsigned char *pbDecoded = NULL;\n    unsigned long cbDecoded = 0;\n    int ret;\n\n    ret = CryptDecodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,\n                              lpszStructType,\n                              pbEncoded, cbEncoded, 0, NULL,\n                              NULL, &cbDecoded);\n    if (!ret) {\n        return -1;\n    }\n\n    pbDecoded = malloc(cbDecoded);\n    if (!pbDecoded) {\n        return -1;\n    }\n\n    ret = CryptDecodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,\n                              lpszStructType,\n                              pbEncoded, cbEncoded, 0, NULL,\n                              pbDecoded, &cbDecoded);\n    if (!ret) {\n        _libssh2_wincng_safe_free(pbDecoded, cbDecoded);\n        return -1;\n    }\n\n\n    *ppbDecoded = pbDecoded;\n    *pcbDecoded = cbDecoded;\n\n    return 0;\n}\n\nstatic int\n_libssh2_wincng_bn_ltob(unsigned char *pbInput,\n                        unsigned long cbInput,\n                        unsigned char **ppbOutput,\n                        unsigned long *pcbOutput)\n{\n    unsigned char *pbOutput;\n    unsigned long cbOutput, index, offset, length;\n\n    if (cbInput < 1) {\n        return 0;\n    }\n\n    offset = 0;\n    length = cbInput - 1;\n    cbOutput = cbInput;\n    if (pbInput[length] & (1 << 7)) {\n        offset++;\n        cbOutput += offset;\n    }\n\n    pbOutput = (unsigned char *)malloc(cbOutput);\n    if (!pbOutput) {\n        return -1;\n    }\n\n    pbOutput[0] = 0;\n    for (index = 0; ((index + offset) < cbOutput)\n                    && (index < cbInput); index++) {\n        pbOutput[index + offset] = pbInput[length - index];\n    }\n\n\n    *ppbOutput = pbOutput;\n    *pcbOutput = cbOutput;\n\n    return 0;\n}\n\nstatic int\n_libssh2_wincng_asn_decode_bn(unsigned char *pbEncoded,\n                              unsigned long cbEncoded,\n                              unsigned char **ppbDecoded,\n                              unsigned long *pcbDecoded)\n{\n    unsigned char *pbDecoded = NULL, *pbInteger;\n    unsigned long cbDecoded = 0, cbInteger;\n    int ret;\n\n    ret = _libssh2_wincng_asn_decode(pbEncoded, cbEncoded,\n                                     X509_MULTI_BYTE_UINT,\n                                     &pbInteger, &cbInteger);\n    if (!ret) {\n        ret = _libssh2_wincng_bn_ltob(((PCRYPT_DATA_BLOB)pbInteger)->pbData,\n                                      ((PCRYPT_DATA_BLOB)pbInteger)->cbData,\n                                      &pbDecoded, &cbDecoded);\n        if (!ret) {\n            *ppbDecoded = pbDecoded;\n            *pcbDecoded = cbDecoded;\n        }\n        _libssh2_wincng_safe_free(pbInteger, cbInteger);\n    }\n\n    return ret;\n}\n\nstatic int\n_libssh2_wincng_asn_decode_bns(unsigned char *pbEncoded,\n                               unsigned long cbEncoded,\n                               unsigned char ***prpbDecoded,\n                               unsigned long **prcbDecoded,\n                               unsigned long *pcbCount)\n{\n    PCRYPT_DER_BLOB pBlob;\n    unsigned char *pbDecoded, **rpbDecoded;\n    unsigned long cbDecoded, *rcbDecoded, index, length;\n    int ret;\n\n    ret = _libssh2_wincng_asn_decode(pbEncoded, cbEncoded,\n                                     X509_SEQUENCE_OF_ANY,\n                                     &pbDecoded, &cbDecoded);\n    if (!ret) {\n        length = ((PCRYPT_DATA_BLOB)pbDecoded)->cbData;\n\n        rpbDecoded = malloc(sizeof(PBYTE) * length);\n        if (rpbDecoded) {\n            rcbDecoded = malloc(sizeof(DWORD) * length);\n            if (rcbDecoded) {\n                for (index = 0; index < length; index++) {\n                    pBlob = &((PCRYPT_DER_BLOB)\n                              ((PCRYPT_DATA_BLOB)pbDecoded)->pbData)[index];\n                    ret = _libssh2_wincng_asn_decode_bn(pBlob->pbData,\n                                                        pBlob->cbData,\n                                                        &rpbDecoded[index],\n                                                        &rcbDecoded[index]);\n                    if (ret)\n                        break;\n                }\n\n                if (!ret) {\n                    *prpbDecoded = rpbDecoded;\n                    *prcbDecoded = rcbDecoded;\n                    *pcbCount = length;\n                } else {\n                    for (length = 0; length < index; length++) {\n                        _libssh2_wincng_safe_free(rpbDecoded[length],\n                                                  rcbDecoded[length]);\n                        rpbDecoded[length] = NULL;\n                        rcbDecoded[length] = 0;\n                    }\n                    free(rpbDecoded);\n                    free(rcbDecoded);\n                }\n            } else {\n                free(rpbDecoded);\n                ret = -1;\n            }\n        } else {\n            ret = -1;\n        }\n\n        _libssh2_wincng_safe_free(pbDecoded, cbDecoded);\n    }\n\n    return ret;\n}\n#endif /* HAVE_LIBCRYPT32 */\n\nstatic unsigned long\n_libssh2_wincng_bn_size(const unsigned char *bignum,\n                        unsigned long length)\n{\n    unsigned long offset;\n\n    if (!bignum)\n        return 0;\n\n    length--;\n\n    offset = 0;\n    while (!(*(bignum + offset)) && (offset < length))\n        offset++;\n\n    length++;\n\n    return length - offset;\n}\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: RSA functions\n */\n\nint\n_libssh2_wincng_rsa_new(libssh2_rsa_ctx **rsa,\n                        const unsigned char *edata,\n                        unsigned long elen,\n                        const unsigned char *ndata,\n                        unsigned long nlen,\n                        const unsigned char *ddata,\n                        unsigned long dlen,\n                        const unsigned char *pdata,\n                        unsigned long plen,\n                        const unsigned char *qdata,\n                        unsigned long qlen,\n                        const unsigned char *e1data,\n                        unsigned long e1len,\n                        const unsigned char *e2data,\n                        unsigned long e2len,\n                        const unsigned char *coeffdata,\n                        unsigned long coefflen)\n{\n    BCRYPT_KEY_HANDLE hKey;\n    BCRYPT_RSAKEY_BLOB *rsakey;\n    LPCWSTR lpszBlobType;\n    unsigned char *key;\n    unsigned long keylen, offset, mlen, p1len = 0, p2len = 0;\n    int ret;\n\n    mlen = max(_libssh2_wincng_bn_size(ndata, nlen),\n               _libssh2_wincng_bn_size(ddata, dlen));\n    offset = sizeof(BCRYPT_RSAKEY_BLOB);\n    keylen = offset + elen + mlen;\n    if (ddata && dlen > 0) {\n        p1len = max(_libssh2_wincng_bn_size(pdata, plen),\n                    _libssh2_wincng_bn_size(e1data, e1len));\n        p2len = max(_libssh2_wincng_bn_size(qdata, qlen),\n                    _libssh2_wincng_bn_size(e2data, e2len));\n        keylen += p1len * 3 + p2len * 2 + mlen;\n    }\n\n    key = malloc(keylen);\n    if (!key) {\n        return -1;\n    }\n\n    memset(key, 0, keylen);\n\n\n    /* https://msdn.microsoft.com/library/windows/desktop/aa375531.aspx */\n    rsakey = (BCRYPT_RSAKEY_BLOB *)key;\n    rsakey->BitLength = mlen * 8;\n    rsakey->cbPublicExp = elen;\n    rsakey->cbModulus = mlen;\n\n    memcpy(key + offset, edata, elen);\n    offset += elen;\n\n    if (nlen < mlen)\n        memcpy(key + offset + mlen - nlen, ndata, nlen);\n    else\n        memcpy(key + offset, ndata + nlen - mlen, mlen);\n\n    if (ddata && dlen > 0) {\n        offset += mlen;\n\n        if (plen < p1len)\n            memcpy(key + offset + p1len - plen, pdata, plen);\n        else\n            memcpy(key + offset, pdata + plen - p1len, p1len);\n        offset += p1len;\n\n        if (qlen < p2len)\n            memcpy(key + offset + p2len - qlen, qdata, qlen);\n        else\n            memcpy(key + offset, qdata + qlen - p2len, p2len);\n        offset += p2len;\n\n        if (e1len < p1len)\n            memcpy(key + offset + p1len - e1len, e1data, e1len);\n        else\n            memcpy(key + offset, e1data + e1len - p1len, p1len);\n        offset += p1len;\n\n        if (e2len < p2len)\n            memcpy(key + offset + p2len - e2len, e2data, e2len);\n        else\n            memcpy(key + offset, e2data + e2len - p2len, p2len);\n        offset += p2len;\n\n        if (coefflen < p1len)\n            memcpy(key + offset + p1len - coefflen, coeffdata, coefflen);\n        else\n            memcpy(key + offset, coeffdata + coefflen - p1len, p1len);\n        offset += p1len;\n\n        if (dlen < mlen)\n            memcpy(key + offset + mlen - dlen, ddata, dlen);\n        else\n            memcpy(key + offset, ddata + dlen - mlen, mlen);\n\n        lpszBlobType = BCRYPT_RSAFULLPRIVATE_BLOB;\n        rsakey->Magic = BCRYPT_RSAFULLPRIVATE_MAGIC;\n        rsakey->cbPrime1 = p1len;\n        rsakey->cbPrime2 = p2len;\n    } else {\n        lpszBlobType = BCRYPT_RSAPUBLIC_BLOB;\n        rsakey->Magic = BCRYPT_RSAPUBLIC_MAGIC;\n        rsakey->cbPrime1 = 0;\n        rsakey->cbPrime2 = 0;\n    }\n\n\n    ret = BCryptImportKeyPair(_libssh2_wincng.hAlgRSA, NULL, lpszBlobType,\n                              &hKey, key, keylen, 0);\n    if (!BCRYPT_SUCCESS(ret)) {\n        _libssh2_wincng_safe_free(key, keylen);\n        return -1;\n    }\n\n\n    *rsa = malloc(sizeof(libssh2_rsa_ctx));\n    if (!(*rsa)) {\n        BCryptDestroyKey(hKey);\n        _libssh2_wincng_safe_free(key, keylen);\n        return -1;\n    }\n\n    (*rsa)->hKey = hKey;\n    (*rsa)->pbKeyObject = key;\n    (*rsa)->cbKeyObject = keylen;\n\n    return 0;\n}\n\n#ifdef HAVE_LIBCRYPT32\nstatic int\n_libssh2_wincng_rsa_new_private_parse(libssh2_rsa_ctx **rsa,\n                                      LIBSSH2_SESSION *session,\n                                      unsigned char *pbEncoded,\n                                      unsigned long cbEncoded)\n{\n    BCRYPT_KEY_HANDLE hKey;\n    unsigned char *pbStructInfo;\n    unsigned long cbStructInfo;\n    int ret;\n\n    (void)session;\n\n    ret = _libssh2_wincng_asn_decode(pbEncoded, cbEncoded,\n                                     PKCS_RSA_PRIVATE_KEY,\n                                     &pbStructInfo, &cbStructInfo);\n\n    _libssh2_wincng_safe_free(pbEncoded, cbEncoded);\n\n    if (ret) {\n        return -1;\n    }\n\n\n    ret = BCryptImportKeyPair(_libssh2_wincng.hAlgRSA, NULL,\n                              LEGACY_RSAPRIVATE_BLOB, &hKey,\n                              pbStructInfo, cbStructInfo, 0);\n    if (!BCRYPT_SUCCESS(ret)) {\n        _libssh2_wincng_safe_free(pbStructInfo, cbStructInfo);\n        return -1;\n    }\n\n\n    *rsa = malloc(sizeof(libssh2_rsa_ctx));\n    if (!(*rsa)) {\n        BCryptDestroyKey(hKey);\n        _libssh2_wincng_safe_free(pbStructInfo, cbStructInfo);\n        return -1;\n    }\n\n    (*rsa)->hKey = hKey;\n    (*rsa)->pbKeyObject = pbStructInfo;\n    (*rsa)->cbKeyObject = cbStructInfo;\n\n    return 0;\n}\n#endif /* HAVE_LIBCRYPT32 */\n\nint\n_libssh2_wincng_rsa_new_private(libssh2_rsa_ctx **rsa,\n                                LIBSSH2_SESSION *session,\n                                const char *filename,\n                                const unsigned char *passphrase)\n{\n#ifdef HAVE_LIBCRYPT32\n    unsigned char *pbEncoded;\n    unsigned long cbEncoded;\n    int ret;\n\n    (void)session;\n\n    ret = _libssh2_wincng_load_private(session, filename,\n                                       (const char *)passphrase,\n                                       &pbEncoded, &cbEncoded, 1, 0);\n    if (ret) {\n        return -1;\n    }\n\n    return _libssh2_wincng_rsa_new_private_parse(rsa, session,\n                                                 pbEncoded, cbEncoded);\n#else\n    (void)rsa;\n    (void)filename;\n    (void)passphrase;\n\n    return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                          \"Unable to load RSA key from private key file: \"\n                          \"Method unsupported in Windows CNG backend\");\n#endif /* HAVE_LIBCRYPT32 */\n}\n\nint\n_libssh2_wincng_rsa_new_private_frommemory(libssh2_rsa_ctx **rsa,\n                                           LIBSSH2_SESSION *session,\n                                           const char *filedata,\n                                           size_t filedata_len,\n                                           unsigned const char *passphrase)\n{\n#ifdef HAVE_LIBCRYPT32\n    unsigned char *pbEncoded;\n    unsigned long cbEncoded;\n    int ret;\n\n    (void)session;\n\n    ret = _libssh2_wincng_load_private_memory(session, filedata, filedata_len,\n                                              (const char *)passphrase,\n                                              &pbEncoded, &cbEncoded, 1, 0);\n    if (ret) {\n        return -1;\n    }\n\n    return _libssh2_wincng_rsa_new_private_parse(rsa, session,\n                                                 pbEncoded, cbEncoded);\n#else\n    (void)rsa;\n    (void)filedata;\n    (void)filedata_len;\n    (void)passphrase;\n\n    return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                          \"Unable to extract private key from memory: \"\n                          \"Method unsupported in Windows CNG backend\");\n#endif /* HAVE_LIBCRYPT32 */\n}\n\nint\n_libssh2_wincng_rsa_sha1_verify(libssh2_rsa_ctx *rsa,\n                                const unsigned char *sig,\n                                unsigned long sig_len,\n                                const unsigned char *m,\n                                unsigned long m_len)\n{\n    return _libssh2_wincng_key_sha1_verify(rsa, sig, sig_len, m, m_len,\n                                           BCRYPT_PAD_PKCS1);\n}\n\nint\n_libssh2_wincng_rsa_sha1_sign(LIBSSH2_SESSION *session,\n                              libssh2_rsa_ctx *rsa,\n                              const unsigned char *hash,\n                              size_t hash_len,\n                              unsigned char **signature,\n                              size_t *signature_len)\n{\n    BCRYPT_PKCS1_PADDING_INFO paddingInfo;\n    unsigned char *data, *sig;\n    unsigned long cbData, datalen, siglen;\n    int ret;\n\n    datalen = (unsigned long)hash_len;\n    data = malloc(datalen);\n    if (!data) {\n        return -1;\n    }\n\n    paddingInfo.pszAlgId = BCRYPT_SHA1_ALGORITHM;\n\n    memcpy(data, hash, datalen);\n\n    ret = BCryptSignHash(rsa->hKey, &paddingInfo,\n                         data, datalen, NULL, 0,\n                         &cbData, BCRYPT_PAD_PKCS1);\n    if (BCRYPT_SUCCESS(ret)) {\n        siglen = cbData;\n        sig = LIBSSH2_ALLOC(session, siglen);\n        if (sig) {\n            ret = BCryptSignHash(rsa->hKey, &paddingInfo,\n                                 data, datalen, sig, siglen,\n                                 &cbData, BCRYPT_PAD_PKCS1);\n            if (BCRYPT_SUCCESS(ret)) {\n                *signature_len = siglen;\n                *signature = sig;\n            } else {\n                LIBSSH2_FREE(session, sig);\n            }\n        } else\n            ret = STATUS_NO_MEMORY;\n    }\n\n    _libssh2_wincng_safe_free(data, datalen);\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\nvoid\n_libssh2_wincng_rsa_free(libssh2_rsa_ctx *rsa)\n{\n    if (!rsa)\n        return;\n\n    BCryptDestroyKey(rsa->hKey);\n    rsa->hKey = NULL;\n\n    _libssh2_wincng_safe_free(rsa->pbKeyObject, rsa->cbKeyObject);\n    _libssh2_wincng_safe_free(rsa, sizeof(libssh2_rsa_ctx));\n}\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: DSA functions\n */\n\n#if LIBSSH2_DSA\nint\n_libssh2_wincng_dsa_new(libssh2_dsa_ctx **dsa,\n                        const unsigned char *pdata,\n                        unsigned long plen,\n                        const unsigned char *qdata,\n                        unsigned long qlen,\n                        const unsigned char *gdata,\n                        unsigned long glen,\n                        const unsigned char *ydata,\n                        unsigned long ylen,\n                        const unsigned char *xdata,\n                        unsigned long xlen)\n{\n    BCRYPT_KEY_HANDLE hKey;\n    BCRYPT_DSA_KEY_BLOB *dsakey;\n    LPCWSTR lpszBlobType;\n    unsigned char *key;\n    unsigned long keylen, offset, length;\n    int ret;\n\n    length = max(max(_libssh2_wincng_bn_size(pdata, plen),\n                     _libssh2_wincng_bn_size(gdata, glen)),\n                 _libssh2_wincng_bn_size(ydata, ylen));\n    offset = sizeof(BCRYPT_DSA_KEY_BLOB);\n    keylen = offset + length * 3;\n    if (xdata && xlen > 0)\n        keylen += 20;\n\n    key = malloc(keylen);\n    if (!key) {\n        return -1;\n    }\n\n    memset(key, 0, keylen);\n\n\n    /* https://msdn.microsoft.com/library/windows/desktop/aa833126.aspx */\n    dsakey = (BCRYPT_DSA_KEY_BLOB *)key;\n    dsakey->cbKey = length;\n\n    memset(dsakey->Count, -1, sizeof(dsakey->Count));\n    memset(dsakey->Seed, -1, sizeof(dsakey->Seed));\n\n    if (qlen < 20)\n        memcpy(dsakey->q + 20 - qlen, qdata, qlen);\n    else\n        memcpy(dsakey->q, qdata + qlen - 20, 20);\n\n    if (plen < length)\n        memcpy(key + offset + length - plen, pdata, plen);\n    else\n        memcpy(key + offset, pdata + plen - length, length);\n    offset += length;\n\n    if (glen < length)\n        memcpy(key + offset + length - glen, gdata, glen);\n    else\n        memcpy(key + offset, gdata + glen - length, length);\n    offset += length;\n\n    if (ylen < length)\n        memcpy(key + offset + length - ylen, ydata, ylen);\n    else\n        memcpy(key + offset, ydata + ylen - length, length);\n\n    if (xdata && xlen > 0) {\n        offset += length;\n\n        if (xlen < 20)\n            memcpy(key + offset + 20 - xlen, xdata, xlen);\n        else\n            memcpy(key + offset, xdata + xlen - 20, 20);\n\n        lpszBlobType = BCRYPT_DSA_PRIVATE_BLOB;\n        dsakey->dwMagic = BCRYPT_DSA_PRIVATE_MAGIC;\n    } else {\n        lpszBlobType = BCRYPT_DSA_PUBLIC_BLOB;\n        dsakey->dwMagic = BCRYPT_DSA_PUBLIC_MAGIC;\n    }\n\n\n    ret = BCryptImportKeyPair(_libssh2_wincng.hAlgDSA, NULL, lpszBlobType,\n                              &hKey, key, keylen, 0);\n    if (!BCRYPT_SUCCESS(ret)) {\n        _libssh2_wincng_safe_free(key, keylen);\n        return -1;\n    }\n\n\n    *dsa = malloc(sizeof(libssh2_dsa_ctx));\n    if (!(*dsa)) {\n        BCryptDestroyKey(hKey);\n        _libssh2_wincng_safe_free(key, keylen);\n        return -1;\n    }\n\n    (*dsa)->hKey = hKey;\n    (*dsa)->pbKeyObject = key;\n    (*dsa)->cbKeyObject = keylen;\n\n    return 0;\n}\n\n#ifdef HAVE_LIBCRYPT32\nstatic int\n_libssh2_wincng_dsa_new_private_parse(libssh2_dsa_ctx **dsa,\n                                      LIBSSH2_SESSION *session,\n                                      unsigned char *pbEncoded,\n                                      unsigned long cbEncoded)\n{\n    unsigned char **rpbDecoded;\n    unsigned long *rcbDecoded, index, length;\n    int ret;\n\n    (void)session;\n\n    ret = _libssh2_wincng_asn_decode_bns(pbEncoded, cbEncoded,\n                                         &rpbDecoded, &rcbDecoded, &length);\n\n    _libssh2_wincng_safe_free(pbEncoded, cbEncoded);\n\n    if (ret) {\n        return -1;\n    }\n\n\n    if (length == 6) {\n        ret = _libssh2_wincng_dsa_new(dsa,\n                                      rpbDecoded[1], rcbDecoded[1],\n                                      rpbDecoded[2], rcbDecoded[2],\n                                      rpbDecoded[3], rcbDecoded[3],\n                                      rpbDecoded[4], rcbDecoded[4],\n                                      rpbDecoded[5], rcbDecoded[5]);\n    } else {\n        ret = -1;\n    }\n\n    for (index = 0; index < length; index++) {\n        _libssh2_wincng_safe_free(rpbDecoded[index], rcbDecoded[index]);\n        rpbDecoded[index] = NULL;\n        rcbDecoded[index] = 0;\n    }\n\n    free(rpbDecoded);\n    free(rcbDecoded);\n\n    return ret;\n}\n#endif /* HAVE_LIBCRYPT32 */\n\nint\n_libssh2_wincng_dsa_new_private(libssh2_dsa_ctx **dsa,\n                                LIBSSH2_SESSION *session,\n                                const char *filename,\n                                const unsigned char *passphrase)\n{\n#ifdef HAVE_LIBCRYPT32\n    unsigned char *pbEncoded;\n    unsigned long cbEncoded;\n    int ret;\n\n    ret = _libssh2_wincng_load_private(session, filename,\n                                       (const char *)passphrase,\n                                       &pbEncoded, &cbEncoded, 0, 1);\n    if (ret) {\n        return -1;\n    }\n\n    return _libssh2_wincng_dsa_new_private_parse(dsa, session,\n                                                 pbEncoded, cbEncoded);\n#else\n    (void)dsa;\n    (void)filename;\n    (void)passphrase;\n\n    return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                          \"Unable to load DSA key from private key file: \"\n                          \"Method unsupported in Windows CNG backend\");\n#endif /* HAVE_LIBCRYPT32 */\n}\n\nint\n_libssh2_wincng_dsa_new_private_frommemory(libssh2_dsa_ctx **dsa,\n                                           LIBSSH2_SESSION *session,\n                                           const char *filedata,\n                                           size_t filedata_len,\n                                           unsigned const char *passphrase)\n{\n#ifdef HAVE_LIBCRYPT32\n    unsigned char *pbEncoded;\n    unsigned long cbEncoded;\n    int ret;\n\n    ret = _libssh2_wincng_load_private_memory(session, filedata, filedata_len,\n                                              (const char *)passphrase,\n                                              &pbEncoded, &cbEncoded, 0, 1);\n    if (ret) {\n        return -1;\n    }\n\n    return _libssh2_wincng_dsa_new_private_parse(dsa, session,\n                                                 pbEncoded, cbEncoded);\n#else\n    (void)dsa;\n    (void)filedata;\n    (void)filedata_len;\n    (void)passphrase;\n\n    return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                          \"Unable to extract private key from memory: \"\n                          \"Method unsupported in Windows CNG backend\");\n#endif /* HAVE_LIBCRYPT32 */\n}\n\nint\n_libssh2_wincng_dsa_sha1_verify(libssh2_dsa_ctx *dsa,\n                                const unsigned char *sig_fixed,\n                                const unsigned char *m,\n                                unsigned long m_len)\n{\n    return _libssh2_wincng_key_sha1_verify(dsa, sig_fixed, 40, m, m_len, 0);\n}\n\nint\n_libssh2_wincng_dsa_sha1_sign(libssh2_dsa_ctx *dsa,\n                              const unsigned char *hash,\n                              unsigned long hash_len,\n                              unsigned char *sig_fixed)\n{\n    unsigned char *data, *sig;\n    unsigned long cbData, datalen, siglen;\n    int ret;\n\n    datalen = hash_len;\n    data = malloc(datalen);\n    if (!data) {\n        return -1;\n    }\n\n    memcpy(data, hash, datalen);\n\n    ret = BCryptSignHash(dsa->hKey, NULL, data, datalen,\n                         NULL, 0, &cbData, 0);\n    if (BCRYPT_SUCCESS(ret)) {\n        siglen = cbData;\n        if (siglen == 40) {\n            sig = malloc(siglen);\n            if (sig) {\n                ret = BCryptSignHash(dsa->hKey, NULL, data, datalen,\n                                     sig, siglen, &cbData, 0);\n                if (BCRYPT_SUCCESS(ret)) {\n                    memcpy(sig_fixed, sig, siglen);\n                }\n\n                _libssh2_wincng_safe_free(sig, siglen);\n            } else\n                ret = STATUS_NO_MEMORY;\n        } else\n            ret = STATUS_NO_MEMORY;\n    }\n\n    _libssh2_wincng_safe_free(data, datalen);\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\nvoid\n_libssh2_wincng_dsa_free(libssh2_dsa_ctx *dsa)\n{\n    if (!dsa)\n        return;\n\n    BCryptDestroyKey(dsa->hKey);\n    dsa->hKey = NULL;\n\n    _libssh2_wincng_safe_free(dsa->pbKeyObject, dsa->cbKeyObject);\n    _libssh2_wincng_safe_free(dsa, sizeof(libssh2_dsa_ctx));\n}\n#endif\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Key functions\n */\n\n#ifdef HAVE_LIBCRYPT32\nstatic unsigned long\n_libssh2_wincng_pub_priv_write(unsigned char *key,\n                               unsigned long offset,\n                               const unsigned char *bignum,\n                               const unsigned long length)\n{\n    _libssh2_htonu32(key + offset, length);\n    offset += 4;\n\n    memcpy(key + offset, bignum, length);\n    offset += length;\n\n    return offset;\n}\n\nstatic int\n_libssh2_wincng_pub_priv_keyfile_parse(LIBSSH2_SESSION *session,\n                                       unsigned char **method,\n                                       size_t *method_len,\n                                       unsigned char **pubkeydata,\n                                       size_t *pubkeydata_len,\n                                       unsigned char *pbEncoded,\n                                       unsigned long cbEncoded)\n{\n    unsigned char **rpbDecoded;\n    unsigned long *rcbDecoded;\n    unsigned char *key = NULL, *mth = NULL;\n    unsigned long keylen = 0, mthlen = 0;\n    unsigned long index, offset, length;\n    int ret;\n\n    ret = _libssh2_wincng_asn_decode_bns(pbEncoded, cbEncoded,\n                                         &rpbDecoded, &rcbDecoded, &length);\n\n    _libssh2_wincng_safe_free(pbEncoded, cbEncoded);\n\n    if (ret) {\n        return -1;\n    }\n\n\n    if (length == 9) { /* private RSA key */\n        mthlen = 7;\n        mth = LIBSSH2_ALLOC(session, mthlen);\n        if (mth) {\n            memcpy(mth, \"ssh-rsa\", mthlen);\n        } else {\n            ret = -1;\n        }\n\n\n        keylen = 4 + mthlen + 4 + rcbDecoded[2] + 4 + rcbDecoded[1];\n        key = LIBSSH2_ALLOC(session, keylen);\n        if (key) {\n            offset = _libssh2_wincng_pub_priv_write(key, 0, mth, mthlen);\n\n            offset = _libssh2_wincng_pub_priv_write(key, offset,\n                                                    rpbDecoded[2],\n                                                    rcbDecoded[2]);\n\n            _libssh2_wincng_pub_priv_write(key, offset,\n                                           rpbDecoded[1],\n                                           rcbDecoded[1]);\n        } else {\n            ret = -1;\n        }\n\n    } else if (length == 6) { /* private DSA key */\n        mthlen = 7;\n        mth = LIBSSH2_ALLOC(session, mthlen);\n        if (mth) {\n            memcpy(mth, \"ssh-dss\", mthlen);\n        } else {\n            ret = -1;\n        }\n\n        keylen = 4 + mthlen + 4 + rcbDecoded[1] + 4 + rcbDecoded[2]\n                            + 4 + rcbDecoded[3] + 4 + rcbDecoded[4];\n        key = LIBSSH2_ALLOC(session, keylen);\n        if (key) {\n            offset = _libssh2_wincng_pub_priv_write(key, 0, mth, mthlen);\n\n            offset = _libssh2_wincng_pub_priv_write(key, offset,\n                                                    rpbDecoded[1],\n                                                    rcbDecoded[1]);\n\n            offset = _libssh2_wincng_pub_priv_write(key, offset,\n                                                    rpbDecoded[2],\n                                                    rcbDecoded[2]);\n\n            offset = _libssh2_wincng_pub_priv_write(key, offset,\n                                                    rpbDecoded[3],\n                                                    rcbDecoded[3]);\n\n            _libssh2_wincng_pub_priv_write(key, offset,\n                                           rpbDecoded[4],\n                                           rcbDecoded[4]);\n        } else {\n            ret = -1;\n        }\n\n    } else {\n        ret = -1;\n    }\n\n\n    for (index = 0; index < length; index++) {\n        _libssh2_wincng_safe_free(rpbDecoded[index], rcbDecoded[index]);\n        rpbDecoded[index] = NULL;\n        rcbDecoded[index] = 0;\n    }\n\n    free(rpbDecoded);\n    free(rcbDecoded);\n\n\n    if (ret) {\n        if (mth)\n            LIBSSH2_FREE(session, mth);\n        if (key)\n            LIBSSH2_FREE(session, key);\n    } else {\n        *method = mth;\n        *method_len = mthlen;\n        *pubkeydata = key;\n        *pubkeydata_len = keylen;\n    }\n\n    return ret;\n}\n#endif /* HAVE_LIBCRYPT32 */\n\nint\n_libssh2_wincng_pub_priv_keyfile(LIBSSH2_SESSION *session,\n                                 unsigned char **method,\n                                 size_t *method_len,\n                                 unsigned char **pubkeydata,\n                                 size_t *pubkeydata_len,\n                                 const char *privatekey,\n                                 const char *passphrase)\n{\n#ifdef HAVE_LIBCRYPT32\n    unsigned char *pbEncoded;\n    unsigned long cbEncoded;\n    int ret;\n\n    ret = _libssh2_wincng_load_private(session, privatekey, passphrase,\n                                       &pbEncoded, &cbEncoded, 1, 1);\n    if (ret) {\n        return -1;\n    }\n\n    return _libssh2_wincng_pub_priv_keyfile_parse(session, method, method_len,\n                                                  pubkeydata, pubkeydata_len,\n                                                  pbEncoded, cbEncoded);\n#else\n    (void)method;\n    (void)method_len;\n    (void)pubkeydata;\n    (void)pubkeydata_len;\n    (void)privatekey;\n    (void)passphrase;\n\n    return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                          \"Unable to load public key from private key file: \"\n                          \"Method unsupported in Windows CNG backend\");\n#endif /* HAVE_LIBCRYPT32 */\n}\n\nint\n_libssh2_wincng_pub_priv_keyfilememory(LIBSSH2_SESSION *session,\n                                       unsigned char **method,\n                                       size_t *method_len,\n                                       unsigned char **pubkeydata,\n                                       size_t *pubkeydata_len,\n                                       const char *privatekeydata,\n                                       size_t privatekeydata_len,\n                                       const char *passphrase)\n{\n#ifdef HAVE_LIBCRYPT32\n    unsigned char *pbEncoded;\n    unsigned long cbEncoded;\n    int ret;\n\n    ret = _libssh2_wincng_load_private_memory(session, privatekeydata,\n                                              privatekeydata_len, passphrase,\n                                              &pbEncoded, &cbEncoded, 1, 1);\n    if (ret) {\n        return -1;\n    }\n\n    return _libssh2_wincng_pub_priv_keyfile_parse(session, method, method_len,\n                                                  pubkeydata, pubkeydata_len,\n                                                  pbEncoded, cbEncoded);\n#else\n    (void)method;\n    (void)method_len;\n    (void)pubkeydata_len;\n    (void)pubkeydata;\n    (void)privatekeydata;\n    (void)privatekeydata_len;\n    (void)passphrase;\n\n    return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                          \"Unable to extract public key from private key in memory: \"\n                          \"Method unsupported in Windows CNG backend\");\n#endif /* HAVE_LIBCRYPT32 */\n}\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Cipher functions\n */\n\nint\n_libssh2_wincng_cipher_init(_libssh2_cipher_ctx *ctx,\n                            _libssh2_cipher_type(type),\n                            unsigned char *iv,\n                            unsigned char *secret,\n                            int encrypt)\n{\n    BCRYPT_KEY_HANDLE hKey;\n    BCRYPT_KEY_DATA_BLOB_HEADER *header;\n    unsigned char *pbKeyObject, *pbIV, *key;\n    unsigned long dwKeyObject, dwIV, dwBlockLength, cbData, keylen;\n    int ret;\n\n    (void)encrypt;\n\n    ret = BCryptGetProperty(*type.phAlg, BCRYPT_OBJECT_LENGTH,\n                            (unsigned char *)&dwKeyObject,\n                            sizeof(dwKeyObject),\n                            &cbData, 0);\n    if (!BCRYPT_SUCCESS(ret)) {\n        return -1;\n    }\n\n    ret = BCryptGetProperty(*type.phAlg, BCRYPT_BLOCK_LENGTH,\n                            (unsigned char *)&dwBlockLength,\n                            sizeof(dwBlockLength),\n                            &cbData, 0);\n    if (!BCRYPT_SUCCESS(ret)) {\n        return -1;\n    }\n\n    pbKeyObject = malloc(dwKeyObject);\n    if (!pbKeyObject) {\n        return -1;\n    }\n\n\n    keylen = sizeof(BCRYPT_KEY_DATA_BLOB_HEADER) + type.dwKeyLength;\n    key = malloc(keylen);\n    if (!key) {\n        free(pbKeyObject);\n        return -1;\n    }\n\n\n    header = (BCRYPT_KEY_DATA_BLOB_HEADER *)key;\n    header->dwMagic = BCRYPT_KEY_DATA_BLOB_MAGIC;\n    header->dwVersion = BCRYPT_KEY_DATA_BLOB_VERSION1;\n    header->cbKeyData = type.dwKeyLength;\n\n    memcpy(key + sizeof(BCRYPT_KEY_DATA_BLOB_HEADER),\n           secret, type.dwKeyLength);\n\n    ret = BCryptImportKey(*type.phAlg, NULL, BCRYPT_KEY_DATA_BLOB, &hKey,\n                          pbKeyObject, dwKeyObject, key, keylen, 0);\n\n    _libssh2_wincng_safe_free(key, keylen);\n\n    if (!BCRYPT_SUCCESS(ret)) {\n        _libssh2_wincng_safe_free(pbKeyObject, dwKeyObject);\n        return -1;\n    }\n\n    if (type.dwUseIV) {\n        pbIV = malloc(dwBlockLength);\n        if (!pbIV) {\n            BCryptDestroyKey(hKey);\n            _libssh2_wincng_safe_free(pbKeyObject, dwKeyObject);\n            return -1;\n        }\n        dwIV = dwBlockLength;\n        memcpy(pbIV, iv, dwIV);\n    } else {\n        pbIV = NULL;\n        dwIV = 0;\n    }\n\n\n    ctx->hKey = hKey;\n    ctx->pbKeyObject = pbKeyObject;\n    ctx->pbIV = pbIV;\n    ctx->dwKeyObject = dwKeyObject;\n    ctx->dwIV = dwIV;\n    ctx->dwBlockLength = dwBlockLength;\n\n    return 0;\n}\n\nint\n_libssh2_wincng_cipher_crypt(_libssh2_cipher_ctx *ctx,\n                             _libssh2_cipher_type(type),\n                             int encrypt,\n                             unsigned char *block,\n                             size_t blocklen)\n{\n    unsigned char *pbOutput;\n    unsigned long cbOutput, cbInput;\n    int ret;\n\n    (void)type;\n\n    cbInput = (unsigned long)blocklen;\n\n    if (encrypt) {\n        ret = BCryptEncrypt(ctx->hKey, block, cbInput, NULL,\n                            ctx->pbIV, ctx->dwIV, NULL, 0, &cbOutput, 0);\n    } else {\n        ret = BCryptDecrypt(ctx->hKey, block, cbInput, NULL,\n                            ctx->pbIV, ctx->dwIV, NULL, 0, &cbOutput, 0);\n    }\n    if (BCRYPT_SUCCESS(ret)) {\n        pbOutput = malloc(cbOutput);\n        if (pbOutput) {\n            if (encrypt) {\n                ret = BCryptEncrypt(ctx->hKey, block, cbInput, NULL,\n                                    ctx->pbIV, ctx->dwIV,\n                                    pbOutput, cbOutput, &cbOutput, 0);\n            } else {\n                ret = BCryptDecrypt(ctx->hKey, block, cbInput, NULL,\n                                    ctx->pbIV, ctx->dwIV,\n                                    pbOutput, cbOutput, &cbOutput, 0);\n            }\n            if (BCRYPT_SUCCESS(ret)) {\n                memcpy(block, pbOutput, cbOutput);\n            }\n\n            _libssh2_wincng_safe_free(pbOutput, cbOutput);\n        } else\n            ret = STATUS_NO_MEMORY;\n    }\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\nvoid\n_libssh2_wincng_cipher_dtor(_libssh2_cipher_ctx *ctx)\n{\n    BCryptDestroyKey(ctx->hKey);\n    ctx->hKey = NULL;\n\n    _libssh2_wincng_safe_free(ctx->pbKeyObject, ctx->dwKeyObject);\n    ctx->pbKeyObject = NULL;\n    ctx->dwKeyObject = 0;\n\n    _libssh2_wincng_safe_free(ctx->pbIV, ctx->dwBlockLength);\n    ctx->pbIV = NULL;\n    ctx->dwBlockLength = 0;\n}\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: BigNumber functions\n */\n\n_libssh2_bn *\n_libssh2_wincng_bignum_init(void)\n{\n    _libssh2_bn *bignum;\n\n    bignum = (_libssh2_bn *)malloc(sizeof(_libssh2_bn));\n    if (bignum) {\n        bignum->bignum = NULL;\n        bignum->length = 0;\n    }\n\n    return bignum;\n}\n\nstatic int\n_libssh2_wincng_bignum_resize(_libssh2_bn *bn, unsigned long length)\n{\n    unsigned char *bignum;\n\n    if (!bn)\n        return -1;\n\n    if (length == bn->length)\n        return 0;\n\n#ifdef LIBSSH2_CLEAR_MEMORY\n    if (bn->bignum && bn->length > 0 && length < bn->length) {\n        SecureZeroMemory(bn->bignum + length, bn->length - length);\n    }\n#endif\n\n    bignum = realloc(bn->bignum, length);\n    if (!bignum)\n        return -1;\n\n    bn->bignum = bignum;\n    bn->length = length;\n\n    return 0;\n}\n\nint\n_libssh2_wincng_bignum_rand(_libssh2_bn *rnd, int bits, int top, int bottom)\n{\n    unsigned char *bignum;\n    unsigned long length;\n\n    if (!rnd)\n        return -1;\n\n    length = (unsigned long)(ceil((float)bits / 8) * sizeof(unsigned char));\n    if (_libssh2_wincng_bignum_resize(rnd, length))\n        return -1;\n\n    bignum = rnd->bignum;\n\n    if (_libssh2_wincng_random(bignum, length))\n        return -1;\n\n    /* calculate significant bits in most significant byte */\n    bits %= 8;\n\n    /* fill most significant byte with zero padding */\n    bignum[0] &= (1 << (8 - bits)) - 1;\n\n    /* set some special last bits in most significant byte */\n    if (top == 0)\n        bignum[0] |= (1 << (7 - bits));\n    else if (top == 1)\n        bignum[0] |= (3 << (6 - bits));\n\n    /* make odd by setting first bit in least significant byte */\n    if (bottom)\n        bignum[length - 1] |= 1;\n\n    return 0;\n}\n\nint\n_libssh2_wincng_bignum_mod_exp(_libssh2_bn *r,\n                               _libssh2_bn *a,\n                               _libssh2_bn *p,\n                               _libssh2_bn *m,\n                               _libssh2_bn_ctx *bnctx)\n{\n    BCRYPT_KEY_HANDLE hKey;\n    BCRYPT_RSAKEY_BLOB *rsakey;\n    unsigned char *key, *bignum;\n    unsigned long keylen, offset, length;\n    int ret;\n\n    (void)bnctx;\n\n    if (!r || !a || !p || !m)\n        return -1;\n\n    offset = sizeof(BCRYPT_RSAKEY_BLOB);\n    keylen = offset + p->length + m->length;\n\n    key = malloc(keylen);\n    if (!key)\n        return -1;\n\n\n    /* https://msdn.microsoft.com/library/windows/desktop/aa375531.aspx */\n    rsakey = (BCRYPT_RSAKEY_BLOB *)key;\n    rsakey->Magic = BCRYPT_RSAPUBLIC_MAGIC;\n    rsakey->BitLength = m->length * 8;\n    rsakey->cbPublicExp = p->length;\n    rsakey->cbModulus = m->length;\n    rsakey->cbPrime1 = 0;\n    rsakey->cbPrime2 = 0;\n\n    memcpy(key + offset, p->bignum, p->length);\n    offset += p->length;\n\n    memcpy(key + offset, m->bignum, m->length);\n\n    ret = BCryptImportKeyPair(_libssh2_wincng.hAlgRSA, NULL,\n                              BCRYPT_RSAPUBLIC_BLOB, &hKey, key, keylen,\n                              BCRYPT_NO_KEY_VALIDATION);\n\n    if (BCRYPT_SUCCESS(ret)) {\n        ret = BCryptEncrypt(hKey, a->bignum, a->length, NULL, NULL, 0,\n                            NULL, 0, &length, BCRYPT_PAD_NONE);\n        if (BCRYPT_SUCCESS(ret)) {\n            if (!_libssh2_wincng_bignum_resize(r, length)) {\n                length = max(a->length, length);\n                bignum = malloc(length);\n                if (bignum) {\n                    offset = length - a->length;\n                    memset(bignum, 0, offset);\n                    memcpy(bignum + offset, a->bignum, a->length);\n\n                    ret = BCryptEncrypt(hKey, bignum, length, NULL, NULL, 0,\n                                        r->bignum, r->length, &offset,\n                                        BCRYPT_PAD_NONE);\n\n                    _libssh2_wincng_safe_free(bignum, length);\n\n                    if (BCRYPT_SUCCESS(ret)) {\n                        _libssh2_wincng_bignum_resize(r, offset);\n                    }\n                } else\n                    ret = STATUS_NO_MEMORY;\n            } else\n                ret = STATUS_NO_MEMORY;\n        }\n\n        BCryptDestroyKey(hKey);\n    }\n\n    _libssh2_wincng_safe_free(key, keylen);\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\nint\n_libssh2_wincng_bignum_set_word(_libssh2_bn *bn, unsigned long word)\n{\n    unsigned long offset, number, bits, length;\n\n    if (!bn)\n        return -1;\n\n    bits = 0;\n    number = word;\n    while (number >>= 1)\n        bits++;\n\n    length = (unsigned long) (ceil(((double)(bits + 1)) / 8.0) *\n                              sizeof(unsigned char));\n    if (_libssh2_wincng_bignum_resize(bn, length))\n        return -1;\n\n    for (offset = 0; offset < length; offset++)\n        bn->bignum[offset] = (word >> (offset * 8)) & 0xff;\n\n    return 0;\n}\n\nunsigned long\n_libssh2_wincng_bignum_bits(const _libssh2_bn *bn)\n{\n    unsigned char number;\n    unsigned long offset, length, bits;\n\n    if (!bn)\n        return 0;\n\n    length = bn->length - 1;\n\n    offset = 0;\n    while (!(*(bn->bignum + offset)) && (offset < length))\n        offset++;\n\n    bits = (length - offset) * 8;\n    number = bn->bignum[offset];\n\n    while (number >>= 1)\n        bits++;\n\n    bits++;\n\n    return bits;\n}\n\nvoid\n_libssh2_wincng_bignum_from_bin(_libssh2_bn *bn, unsigned long len,\n                                const unsigned char *bin)\n{\n    unsigned char *bignum;\n    unsigned long offset, length, bits;\n\n    if (!bn || !bin || !len)\n        return;\n\n    if (_libssh2_wincng_bignum_resize(bn, len))\n        return;\n\n    memcpy(bn->bignum, bin, len);\n\n    bits = _libssh2_wincng_bignum_bits(bn);\n    length = (unsigned long) (ceil(((double)bits) / 8.0) *\n                              sizeof(unsigned char));\n\n    offset = bn->length - length;\n    if (offset > 0) {\n        memmove(bn->bignum, bn->bignum + offset, length);\n\n#ifdef LIBSSH2_CLEAR_MEMORY\n        SecureZeroMemory(bn->bignum + length, offset);\n#endif\n\n        bignum = realloc(bn->bignum, length);\n        if (bignum) {\n            bn->bignum = bignum;\n            bn->length = length;\n        }\n    }\n}\n\nvoid\n_libssh2_wincng_bignum_to_bin(const _libssh2_bn *bn, unsigned char *bin)\n{\n    if (bin && bn && bn->bignum && bn->length > 0) {\n        memcpy(bin, bn->bignum, bn->length);\n    }\n}\n\nvoid\n_libssh2_wincng_bignum_free(_libssh2_bn *bn)\n{\n    if (bn) {\n        if (bn->bignum) {\n            _libssh2_wincng_safe_free(bn->bignum, bn->length);\n            bn->bignum = NULL;\n        }\n        bn->length = 0;\n        _libssh2_wincng_safe_free(bn, sizeof(_libssh2_bn));\n    }\n}\n\n\n/*\n * Windows CNG backend: other functions\n */\n\nvoid _libssh2_init_aes_ctr(void)\n{\n    /* no implementation */\n    (void)0;\n}\n\n#endif /* LIBSSH2_WINCNG */\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/src/wincng.h",
    "content": "/*\n * Copyright (C) 2013-2015 Marc Hoersken <info@marc-hoersken.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* required for cross-compilation against the w64 mingw-runtime package */\n#if defined(_WIN32_WINNT) && (_WIN32_WINNT < 0x0600)\n#undef _WIN32_WINNT\n#endif\n#ifndef _WIN32_WINNT\n#define _WIN32_WINNT 0x0600\n#endif\n\n#include <windows.h>\n#include <bcrypt.h>\n\n\n#define LIBSSH2_MD5 1\n\n#define LIBSSH2_HMAC_RIPEMD 0\n#define LIBSSH2_HMAC_SHA256 1\n#define LIBSSH2_HMAC_SHA512 1\n\n#define LIBSSH2_AES 1\n#define LIBSSH2_AES_CTR 0\n#define LIBSSH2_BLOWFISH 0\n#define LIBSSH2_RC4 1\n#define LIBSSH2_CAST 0\n#define LIBSSH2_3DES 1\n\n#define LIBSSH2_RSA 1\n#define LIBSSH2_DSA 1\n\n#define MD5_DIGEST_LENGTH 16\n#define SHA_DIGEST_LENGTH 20\n#define SHA256_DIGEST_LENGTH 32\n#define SHA512_DIGEST_LENGTH 64\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Global context handles\n */\n\nstruct _libssh2_wincng_ctx {\n    BCRYPT_ALG_HANDLE hAlgRNG;\n    BCRYPT_ALG_HANDLE hAlgHashMD5;\n    BCRYPT_ALG_HANDLE hAlgHashSHA1;\n    BCRYPT_ALG_HANDLE hAlgHashSHA256;\n    BCRYPT_ALG_HANDLE hAlgHashSHA512;\n    BCRYPT_ALG_HANDLE hAlgHmacMD5;\n    BCRYPT_ALG_HANDLE hAlgHmacSHA1;\n    BCRYPT_ALG_HANDLE hAlgHmacSHA256;\n    BCRYPT_ALG_HANDLE hAlgHmacSHA512;\n    BCRYPT_ALG_HANDLE hAlgRSA;\n    BCRYPT_ALG_HANDLE hAlgDSA;\n    BCRYPT_ALG_HANDLE hAlgAES_CBC;\n    BCRYPT_ALG_HANDLE hAlgRC4_NA;\n    BCRYPT_ALG_HANDLE hAlg3DES_CBC;\n};\n\nstruct _libssh2_wincng_ctx _libssh2_wincng;\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Generic functions\n */\n\nvoid _libssh2_wincng_init(void);\nvoid _libssh2_wincng_free(void);\n\n#define libssh2_crypto_init() \\\n  _libssh2_wincng_init()\n#define libssh2_crypto_exit() \\\n  _libssh2_wincng_free()\n\n#define _libssh2_random(buf, len) \\\n  _libssh2_wincng_random(buf, len)\n\n#define libssh2_prepare_iovec(vec, len)  /* Empty. */\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Hash structure\n */\n\ntypedef struct __libssh2_wincng_hash_ctx {\n    BCRYPT_HASH_HANDLE hHash;\n    unsigned char *pbHashObject;\n    unsigned long dwHashObject;\n    unsigned long cbHash;\n} _libssh2_wincng_hash_ctx;\n\n/*\n * Windows CNG backend: Hash functions\n */\n\n#define libssh2_sha1_ctx _libssh2_wincng_hash_ctx\n#define libssh2_sha1_init(ctx) \\\n  (_libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHashSHA1, \\\n                            SHA_DIGEST_LENGTH, NULL, 0) == 0)\n#define libssh2_sha1_update(ctx, data, datalen) \\\n  _libssh2_wincng_hash_update(&ctx, (unsigned char *) data, datalen)\n#define libssh2_sha1_final(ctx, hash) \\\n  _libssh2_wincng_hash_final(&ctx, hash)\n#define libssh2_sha1(data, datalen, hash) \\\n  _libssh2_wincng_hash(data, datalen, _libssh2_wincng.hAlgHashSHA1, \\\n                       hash, SHA_DIGEST_LENGTH)\n\n#define libssh2_sha256_ctx _libssh2_wincng_hash_ctx\n#define libssh2_sha256_init(ctx) \\\n  (_libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHashSHA256, \\\n                            SHA256_DIGEST_LENGTH, NULL, 0) == 0)\n#define libssh2_sha256_update(ctx, data, datalen) \\\n  _libssh2_wincng_hash_update(&ctx, (unsigned char *) data, datalen)\n#define libssh2_sha256_final(ctx, hash) \\\n  _libssh2_wincng_hash_final(&ctx, hash)\n#define libssh2_sha256(data, datalen, hash) \\\n  _libssh2_wincng_hash(data, datalen, _libssh2_wincng.hAlgHashSHA256, \\\n                       hash, SHA256_DIGEST_LENGTH)\n\n#define libssh2_sha512_ctx _libssh2_wincng_hash_ctx\n#define libssh2_sha512_init(ctx) \\\n  (_libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHashSHA512, \\\n                            SHA512_DIGEST_LENGTH, NULL, 0) == 0)\n#define libssh2_sha512_update(ctx, data, datalen) \\\n  _libssh2_wincng_hash_update(&ctx, (unsigned char *) data, datalen)\n#define libssh2_sha512_final(ctx, hash) \\\n  _libssh2_wincng_hash_final(&ctx, hash)\n#define libssh2_sha512(data, datalen, hash) \\\n  _libssh2_wincng_hash(data, datalen, _libssh2_wincng.hAlgHashSHA512, \\\n                       hash, SHA512_DIGEST_LENGTH)\n\n#define libssh2_md5_ctx _libssh2_wincng_hash_ctx\n#define libssh2_md5_init(ctx) \\\n  (_libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHashMD5, \\\n                            MD5_DIGEST_LENGTH, NULL, 0) == 0)\n#define libssh2_md5_update(ctx, data, datalen) \\\n  _libssh2_wincng_hash_update(&ctx, (unsigned char *) data, datalen)\n#define libssh2_md5_final(ctx, hash) \\\n  _libssh2_wincng_hash_final(&ctx, hash)\n#define libssh2_md5(data, datalen, hash) \\\n  _libssh2_wincng_hash(data, datalen, _libssh2_wincng.hAlgHashMD5, \\\n                       hash, MD5_DIGEST_LENGTH)\n\n/*\n * Windows CNG backend: HMAC functions\n */\n\n#define libssh2_hmac_ctx _libssh2_wincng_hash_ctx\n#define libssh2_hmac_ctx_init(ctx)\n#define libssh2_hmac_sha1_init(ctx, key, keylen) \\\n  _libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHmacSHA1, \\\n                            SHA_DIGEST_LENGTH, key, keylen)\n#define libssh2_hmac_md5_init(ctx, key, keylen) \\\n  _libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHmacMD5, \\\n                            MD5_DIGEST_LENGTH, key, keylen)\n#define libssh2_hmac_ripemd160_init(ctx, key, keylen)\n  /* not implemented */\n#define libssh2_hmac_sha256_init(ctx, key, keylen) \\\n  _libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHmacSHA256, \\\n                            SHA256_DIGEST_LENGTH, key, keylen)\n#define libssh2_hmac_sha512_init(ctx, key, keylen) \\\n  _libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHmacSHA512, \\\n                            SHA512_DIGEST_LENGTH, key, keylen)\n#define libssh2_hmac_update(ctx, data, datalen) \\\n  _libssh2_wincng_hash_update(&ctx, (unsigned char *) data, datalen)\n#define libssh2_hmac_final(ctx, hash) \\\n  _libssh2_wincng_hmac_final(&ctx, hash)\n#define libssh2_hmac_cleanup(ctx) \\\n  _libssh2_wincng_hmac_cleanup(ctx)\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Key Context structure\n */\n\ntypedef struct __libssh2_wincng_key_ctx {\n    BCRYPT_KEY_HANDLE hKey;\n    unsigned char *pbKeyObject;\n    unsigned long cbKeyObject;\n} _libssh2_wincng_key_ctx;\n\n\n/*\n * Windows CNG backend: RSA functions\n */\n\n#define libssh2_rsa_ctx _libssh2_wincng_key_ctx\n#define _libssh2_rsa_new(rsactx, e, e_len, n, n_len, \\\n                         d, d_len, p, p_len, q, q_len, \\\n                         e1, e1_len, e2, e2_len, c, c_len) \\\n  _libssh2_wincng_rsa_new(rsactx, e, e_len, n, n_len, \\\n                          d, d_len, p, p_len, q, q_len, \\\n                          e1, e1_len, e2, e2_len, c, c_len)\n#define _libssh2_rsa_new_private(rsactx, s, filename, passphrase) \\\n  _libssh2_wincng_rsa_new_private(rsactx, s, filename, passphrase)\n#define _libssh2_rsa_new_private_frommemory(rsactx, s, filedata, \\\n                                            filedata_len, passphrase) \\\n  _libssh2_wincng_rsa_new_private_frommemory(rsactx, s, filedata, \\\n                                             filedata_len, passphrase)\n#define _libssh2_rsa_sha1_sign(s, rsactx, hash, hash_len, sig, sig_len) \\\n  _libssh2_wincng_rsa_sha1_sign(s, rsactx, hash, hash_len, sig, sig_len)\n#define _libssh2_rsa_sha1_verify(rsactx, sig, sig_len, m, m_len) \\\n  _libssh2_wincng_rsa_sha1_verify(rsactx, sig, sig_len, m, m_len)\n#define _libssh2_rsa_free(rsactx) \\\n  _libssh2_wincng_rsa_free(rsactx)\n\n/*\n * Windows CNG backend: DSA functions\n */\n\n#define libssh2_dsa_ctx _libssh2_wincng_key_ctx\n#define _libssh2_dsa_new(dsactx, p, p_len, q, q_len, \\\n                         g, g_len, y, y_len, x, x_len) \\\n  _libssh2_wincng_dsa_new(dsactx, p, p_len, q, q_len, \\\n                          g, g_len, y, y_len, x, x_len)\n#define _libssh2_dsa_new_private(dsactx, s, filename, passphrase) \\\n  _libssh2_wincng_dsa_new_private(dsactx, s, filename, passphrase)\n#define _libssh2_dsa_new_private_frommemory(dsactx, s, filedata, \\\n                                            filedata_len, passphrase) \\\n  _libssh2_wincng_dsa_new_private_frommemory(dsactx, s, filedata, \\\n                                             filedata_len, passphrase)\n#define _libssh2_dsa_sha1_sign(dsactx, hash, hash_len, sig) \\\n  _libssh2_wincng_dsa_sha1_sign(dsactx, hash, hash_len, sig)\n#define _libssh2_dsa_sha1_verify(dsactx, sig, m, m_len) \\\n  _libssh2_wincng_dsa_sha1_verify(dsactx, sig, m, m_len)\n#define _libssh2_dsa_free(dsactx) \\\n  _libssh2_wincng_dsa_free(dsactx)\n\n/*\n * Windows CNG backend: Key functions\n */\n\n#define _libssh2_pub_priv_keyfile(s, m, m_len, p, p_len, pk, pw) \\\n  _libssh2_wincng_pub_priv_keyfile(s, m, m_len, p, p_len, pk, pw)\n#define _libssh2_pub_priv_keyfilememory(s, m, m_len, p, p_len, \\\n                                                     pk, pk_len, pw) \\\n  _libssh2_wincng_pub_priv_keyfilememory(s, m, m_len, p, p_len, \\\n                                                      pk, pk_len, pw)\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Cipher Context structure\n */\n\nstruct _libssh2_wincng_cipher_ctx {\n    BCRYPT_KEY_HANDLE hKey;\n    unsigned char *pbKeyObject;\n    unsigned char *pbIV;\n    unsigned long dwKeyObject;\n    unsigned long dwIV;\n    unsigned long dwBlockLength;\n};\n\n#define _libssh2_cipher_ctx struct _libssh2_wincng_cipher_ctx\n\n/*\n * Windows CNG backend: Cipher Type structure\n */\n\nstruct _libssh2_wincng_cipher_type {\n    BCRYPT_ALG_HANDLE *phAlg;\n    unsigned long dwKeyLength;\n    unsigned long dwUseIV;\n};\n\n#define _libssh2_cipher_type(type) struct _libssh2_wincng_cipher_type type\n\n#define _libssh2_cipher_aes256ctr { NULL, 32, 1 } /* not supported */\n#define _libssh2_cipher_aes192ctr { NULL, 24, 1 } /* not supported */\n#define _libssh2_cipher_aes128ctr { NULL, 16, 1 } /* not supported */\n#define _libssh2_cipher_aes256 { &_libssh2_wincng.hAlgAES_CBC, 32, 1 }\n#define _libssh2_cipher_aes192 { &_libssh2_wincng.hAlgAES_CBC, 24, 1 }\n#define _libssh2_cipher_aes128 { &_libssh2_wincng.hAlgAES_CBC, 16, 1 }\n#define _libssh2_cipher_blowfish { NULL, 16, 0 } /* not supported */\n#define _libssh2_cipher_arcfour { &_libssh2_wincng.hAlgRC4_NA, 16, 0 }\n#define _libssh2_cipher_cast5 { NULL, 16, 0 } /* not supported */\n#define _libssh2_cipher_3des { &_libssh2_wincng.hAlg3DES_CBC, 24, 1 }\n\n/*\n * Windows CNG backend: Cipher functions\n */\n\n#define _libssh2_cipher_init(ctx, type, iv, secret, encrypt) \\\n  _libssh2_wincng_cipher_init(ctx, type, iv, secret, encrypt)\n#define _libssh2_cipher_crypt(ctx, type, encrypt, block, blocklen) \\\n  _libssh2_wincng_cipher_crypt(ctx, type, encrypt, block, blocklen)\n#define _libssh2_cipher_dtor(ctx) \\\n  _libssh2_wincng_cipher_dtor(ctx)\n\n/*******************************************************************/\n/*\n * Windows CNG backend: BigNumber Context\n */\n\n#define _libssh2_bn_ctx int /* not used */\n#define _libssh2_bn_ctx_new() 0 /* not used */\n#define _libssh2_bn_ctx_free(bnctx) ((void)0) /* not used */\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: BigNumber structure\n */\n\nstruct _libssh2_wincng_bignum {\n    unsigned char *bignum;\n    unsigned long length;\n};\n\n#define _libssh2_bn struct _libssh2_wincng_bignum\n\n/*\n * Windows CNG backend: BigNumber functions\n */\n\n_libssh2_bn *_libssh2_wincng_bignum_init(void);\n\n#define _libssh2_bn_init() \\\n  _libssh2_wincng_bignum_init()\n#define _libssh2_bn_init_from_bin() \\\n  _libssh2_bn_init()\n#define _libssh2_bn_rand(bn, bits, top, bottom) \\\n  _libssh2_wincng_bignum_rand(bn, bits, top, bottom)\n#define _libssh2_bn_mod_exp(r, a, p, m, ctx) \\\n  _libssh2_wincng_bignum_mod_exp(r, a, p, m, ctx)\n#define _libssh2_bn_set_word(bn, word) \\\n  _libssh2_wincng_bignum_set_word(bn, word)\n#define _libssh2_bn_from_bin(bn, len, bin) \\\n  _libssh2_wincng_bignum_from_bin(bn, len, bin)\n#define _libssh2_bn_to_bin(bn, bin) \\\n  _libssh2_wincng_bignum_to_bin(bn, bin)\n#define _libssh2_bn_bytes(bn) bn->length\n#define _libssh2_bn_bits(bn) \\\n  _libssh2_wincng_bignum_bits(bn)\n#define _libssh2_bn_free(bn) \\\n  _libssh2_wincng_bignum_free(bn)\n\n/*******************************************************************/\n/*\n * Windows CNG backend: forward declarations\n */\nvoid _libssh2_wincng_init(void);\nvoid _libssh2_wincng_free(void);\nint _libssh2_wincng_random(void *buf, int len);\nvoid _libssh2_init_aes_ctr(void);\n\nint\n_libssh2_wincng_hash_init(_libssh2_wincng_hash_ctx *ctx,\n                          BCRYPT_ALG_HANDLE hAlg, unsigned long hashlen,\n                          unsigned char *key, unsigned long keylen);\nint\n_libssh2_wincng_hash_update(_libssh2_wincng_hash_ctx *ctx,\n                            const unsigned char *data, unsigned long datalen);\nint\n_libssh2_wincng_hash_final(_libssh2_wincng_hash_ctx *ctx,\n                           unsigned char *hash);\nint\n_libssh2_wincng_hash(unsigned char *data, unsigned long datalen,\n                     BCRYPT_ALG_HANDLE hAlg,\n                     unsigned char *hash, unsigned long hashlen);\n\nint\n_libssh2_wincng_hmac_final(_libssh2_wincng_hash_ctx *ctx,\n                           unsigned char *hash);\nvoid\n_libssh2_wincng_hmac_cleanup(_libssh2_wincng_hash_ctx *ctx);\n\nint\n_libssh2_wincng_key_sha1_verify(_libssh2_wincng_key_ctx *ctx,\n                                const unsigned char *sig,\n                                unsigned long sig_len,\n                                const unsigned char *m,\n                                unsigned long m_len,\n                                unsigned long flags);\n\nint\n_libssh2_wincng_rsa_new(libssh2_rsa_ctx **rsa,\n                        const unsigned char *edata,\n                        unsigned long elen,\n                        const unsigned char *ndata,\n                        unsigned long nlen,\n                        const unsigned char *ddata,\n                        unsigned long dlen,\n                        const unsigned char *pdata,\n                        unsigned long plen,\n                        const unsigned char *qdata,\n                        unsigned long qlen,\n                        const unsigned char *e1data,\n                        unsigned long e1len,\n                        const unsigned char *e2data,\n                        unsigned long e2len,\n                        const unsigned char *coeffdata,\n                        unsigned long coefflen);\nint\n_libssh2_wincng_rsa_new_private(libssh2_rsa_ctx **rsa,\n                                LIBSSH2_SESSION *session,\n                                const char *filename,\n                                const unsigned char *passphrase);\nint\n_libssh2_wincng_rsa_new_private_frommemory(libssh2_rsa_ctx **rsa,\n                                           LIBSSH2_SESSION *session,\n                                           const char *filedata,\n                                           size_t filedata_len,\n                                           unsigned const char *passphrase);\nint\n_libssh2_wincng_rsa_sha1_verify(libssh2_rsa_ctx *rsa,\n                                const unsigned char *sig,\n                                unsigned long sig_len,\n                                const unsigned char *m,\n                                unsigned long m_len);\nint\n_libssh2_wincng_rsa_sha1_sign(LIBSSH2_SESSION *session,\n                              libssh2_rsa_ctx *rsa,\n                              const unsigned char *hash,\n                              size_t hash_len,\n                              unsigned char **signature,\n                              size_t *signature_len);\nvoid\n_libssh2_wincng_rsa_free(libssh2_rsa_ctx *rsa);\n\n#if LIBSSH2_DSA\nint\n_libssh2_wincng_dsa_new(libssh2_dsa_ctx **dsa,\n                        const unsigned char *pdata,\n                        unsigned long plen,\n                        const unsigned char *qdata,\n                        unsigned long qlen,\n                        const unsigned char *gdata,\n                        unsigned long glen,\n                        const unsigned char *ydata,\n                        unsigned long ylen,\n                        const unsigned char *xdata,\n                        unsigned long xlen);\nint\n_libssh2_wincng_dsa_new_private(libssh2_dsa_ctx **dsa,\n                                LIBSSH2_SESSION *session,\n                                const char *filename,\n                                const unsigned char *passphrase);\nint\n_libssh2_wincng_dsa_new_private_frommemory(libssh2_dsa_ctx **dsa,\n                                           LIBSSH2_SESSION *session,\n                                           const char *filedata,\n                                           size_t filedata_len,\n                                           unsigned const char *passphrase);\nint\n_libssh2_wincng_dsa_sha1_verify(libssh2_dsa_ctx *dsa,\n                                const unsigned char *sig_fixed,\n                                const unsigned char *m,\n                                unsigned long m_len);\nint\n_libssh2_wincng_dsa_sha1_sign(libssh2_dsa_ctx *dsa,\n                              const unsigned char *hash,\n                              unsigned long hash_len,\n                              unsigned char *sig_fixed);\nvoid\n_libssh2_wincng_dsa_free(libssh2_dsa_ctx *dsa);\n#endif\n\nint\n_libssh2_wincng_pub_priv_keyfile(LIBSSH2_SESSION *session,\n                                 unsigned char **method,\n                                 size_t *method_len,\n                                 unsigned char **pubkeydata,\n                                 size_t *pubkeydata_len,\n                                 const char *privatekey,\n                                 const char *passphrase);\nint\n_libssh2_wincng_pub_priv_keyfilememory(LIBSSH2_SESSION *session,\n                                       unsigned char **method,\n                                       size_t *method_len,\n                                       unsigned char **pubkeydata,\n                                       size_t *pubkeydata_len,\n                                       const char *privatekeydata,\n                                       size_t privatekeydata_len,\n                                       const char *passphrase);\n\nint\n_libssh2_wincng_cipher_init(_libssh2_cipher_ctx *ctx,\n                            _libssh2_cipher_type(type),\n                            unsigned char *iv,\n                            unsigned char *secret,\n                            int encrypt);\nint\n_libssh2_wincng_cipher_crypt(_libssh2_cipher_ctx *ctx,\n                             _libssh2_cipher_type(type),\n                             int encrypt,\n                             unsigned char *block,\n                             size_t blocklen);\nvoid\n_libssh2_wincng_cipher_dtor(_libssh2_cipher_ctx *ctx);\n\n_libssh2_bn *\n_libssh2_wincng_bignum_init(void);\nint\n_libssh2_wincng_bignum_rand(_libssh2_bn *rnd, int bits, int top, int bottom);\nint\n_libssh2_wincng_bignum_mod_exp(_libssh2_bn *r,\n                               _libssh2_bn *a,\n                               _libssh2_bn *p,\n                               _libssh2_bn *m,\n                               _libssh2_bn_ctx *bnctx);\nint\n_libssh2_wincng_bignum_set_word(_libssh2_bn *bn, unsigned long word);\nunsigned long\n_libssh2_wincng_bignum_bits(const _libssh2_bn *bn);\nvoid\n_libssh2_wincng_bignum_from_bin(_libssh2_bn *bn, unsigned long len,\n                                const unsigned char *bin);\nvoid\n_libssh2_wincng_bignum_to_bin(const _libssh2_bn *bn, unsigned char *bin);\nvoid\n_libssh2_wincng_bignum_free(_libssh2_bn *bn);\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/tests/.gitignore",
    "content": ".deps\n.libs\n*.gcno\n*.gcda\nMakefile\nMakefile.in\nsimple\nssh2\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/tests/CMakeLists.txt",
    "content": "# Copyright (c) 2014, 2015 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\ninclude(CheckIncludeFiles)\ninclude(CheckFunctionExists)\ninclude(CheckSymbolExists)\ninclude(BundleUtilities)\ninclude(CopyRuntimeDependencies)\ninclude(SocketLibraries)\n\n## Platform checks\ncheck_include_files(inttypes.h HAVE_INTTYPES_H)\ncheck_include_files(unistd.h HAVE_UNISTD_H)\ncheck_include_files(sys/socket.h HAVE_SYS_SOCKET_H)\ncheck_include_files(arpa/inet.h HAVE_ARPA_INET_H)\ncheck_include_files(windows.h HAVE_WINDOWS_H)\ncheck_include_files(winsock2.h HAVE_WINSOCK2_H)\n\nconfigure_file(\n  ${CMAKE_CURRENT_SOURCE_DIR}/libssh2_config_cmake.h.in\n  ${CMAKE_CURRENT_BINARY_DIR}/libssh2_config.h)\n\nset(TESTS\n  simple\n  ssh2)\n\nappend_needed_socket_libraries(LIBRARIES)\n\nforeach(test ${TESTS})\n  add_executable(test-${test} ${test}.c)\n  target_link_libraries(test-${test} libssh2 ${LIBRARIES})\n  target_include_directories(test-${test} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})\n  list(APPEND TEST_TARGETS test-${test})\nendforeach()\n\nadd_target_to_copy_dependencies(\n  TARGET copy_test_dependencies\n  DEPENDENCIES ${RUNTIME_DEPENDENCIES}\n  BEFORE_TARGETS ${TEST_TARGETS})\n\n# TODO convert mansyntax.sh into CMake script.\n# XXX Just because we can find all three programs, doesn't mean sh can\n# find man and grep\nfind_program(SH_EXECUTABLE sh)\nfind_program(MAN_EXECUTABLE man)\nfind_program(GREP_EXECUTABLE grep)\nmark_as_advanced(SH_EXECUTABLE MAN_EXECUTABLE GREP_EXECUTABLE)\nif(SH_EXECUTABLE AND MAN_EXECUTABLE AND GREP_EXECUTABLE)\n  set(cmd \"srcdir=${CMAKE_CURRENT_SOURCE_DIR}\")\n  set(cmd \"${cmd} ${CMAKE_CURRENT_SOURCE_DIR}/mansyntax.sh\")\n  add_test(mansyntax ${SH_EXECUTABLE} -c \"${cmd}\")\nendif()\n\nadd_test(simple test-simple)\n\nfind_program(SSHD_EXECUTABLE sshd)\nfind_program(CHMOD_EXECUTABLE chmod)\nfind_program(KILL_EXECUTABLE kill)\nmark_as_advanced(SSHD_EXECUTABLE CHMOD_EXECUTABLE KILL_EXECUTABLE)\nif(SSHD_EXECUTABLE AND CHMOD_EXECUTABLE AND KILL_EXECUTABLE)\n  set(SSHD_TEST_CONFIG_DIR ${CMAKE_CURRENT_BINARY_DIR})\n  set(TEST_NAME ssh2)\n\n  add_custom_command(\n    TARGET test-${TEST_NAME}\n    COMMAND ${CMAKE_COMMAND} -E copy_directory\n    ${CMAKE_CURRENT_SOURCE_DIR}/etc\n    ${SSHD_TEST_CONFIG_DIR}/etc)\n\n  configure_file(\n    ${CMAKE_CURRENT_SOURCE_DIR}/sshd_fixture.sh.in\n    ${CMAKE_CURRENT_BINARY_DIR}/test-${TEST_NAME}_fixture.sh\n    @ONLY)\n\n  add_test(NAME ssh2 COMMAND ${SH_EXECUTABLE}\n    ${CMAKE_CURRENT_BINARY_DIR}/test-${TEST_NAME}_fixture.sh\n    $<TARGET_FILE:test-${TEST_NAME}>)\n\nendif()\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/tests/Makefile.am",
    "content": "AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/include -I$(top_builddir)/src\nLDADD = ../src/libssh2.la\n\nif SSHD\nnoinst_PROGRAMS = ssh2\nssh2_SOURCES = ssh2.c\nendif\n\nctests = simple$(EXEEXT)\nTESTS = $(ctests) mansyntax.sh\nif SSHD\nTESTS += ssh2.sh\nendif\ncheck_PROGRAMS = $(ctests)\n\nTESTS_ENVIRONMENT = SSHD=$(SSHD) EXEEXT=$(EXEEXT)\nTESTS_ENVIRONMENT += srcdir=$(top_srcdir)/tests builddir=$(top_builddir)/tests\n\nEXTRA_DIST = ssh2.sh mansyntax.sh\nEXTRA_DIST += etc/host etc/host.pub etc/user etc/user.pub\nEXTRA_DIST += CMakeLists.txt libssh2_config_cmake.h.in sshd_fixture.sh.in\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/tests/etc/host",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAwJaOo3i1X3N401hMd92lRec0tPMBgaF6ZDanovBiQP+PNo6g\nVNtuF15AspbyxrViqtAyjLWQQlKGWgEFb2ga3ukzJll4dKPtNff3mO++W19ia0WQ\nZFWTAGcYqet4fvSALIpG+t/3u5MZXMNZPyCU8u1l+QXX14f6dEjzgRw7s3fSy/uv\nQawkgn8TQFvtSBOfvUTJPTAhhZqxZAt3nGH8d6vqD1hBNvdOpsohy6EgFh8V+kxn\nUdQntrYe9WSz0djt0RRrdAvRkM0hq1UY8C9FTQQWni1n168c7FVrf65+GdJOn7NQ\nDu0Whmh/R3flXR0kIBG+F7e8+e9W9OhlionkPwIBIwKCAQEAqpP6rgvT2DMTPtkt\nyUCoU9tpMo4XRu4b8lxLVc2Y2nvz391pb7sJvO0Uu2/BFmYkMORKB5l/xbbOxL8T\ncU2UJIVn0YJyAOj2rCTFW5KEB8mDDo4SLPtWUNBXrHF5WoDJTAVyEWdJInr5NOeJ\nj68k1yoJ3JAlkwNozWUvclrVytZNohPhiYdKkj2DPlWKL//0INGIo9TU31AGJx2R\nymy105EFCXWDv1GAIWwqBjNNxzlyxDauuGTwWr2iYDyectBYApCkjyJzMpFn4Yiu\nMq5XomwkQhefK3y32bRasm+HSrQsGswSvSyS8I5YosjSKMmiWdYj4WxrSciT6gG/\nKHanEwKBgQDucA7E/s9aKs6rECypXPaCORxvbLqdqAiwzJ0edufE+g0aQU/Zm3xj\nm6LGovdEcaBog4rfKCSB9NRKi35m4HV9PO4YBw6/lQ0NeO6jrb8OnZp/P97FbomT\nAXBibzUjQ8fhbPCaJF/2TUEoyhNbzJkpl+M0zu2aQ3MUYVd4dZ4y4wKBgQDOxfeA\nRH3ZPvdYI50jxW+/kKcio+APZZJ9xhtqOKzmEuJOPzlngWk5WQgS8B1aicHyFRhw\nUT2vKeJvqqoeLbIE9Fm6qlpN22594S88+LOiMda4wRswxG9wBZ2J4+rrYKpcb1gt\nJXvVKY7h5qLWGCR0x+ovOcNXABWsF8CAnOnb9QKBgA2gANgOj4F+yfslfuUbQUlF\nF5FWq5P6+S6sm0ORxBniZyYSXFWT2zjkUnHAK2L/LbzUURQQ7CSu5487K8tdSIrQ\nSB6hUUzGsEnppzyNleOT+jMoOJ2RSbCg/xuRU35bpQWRMlHzczKlVC43btILsPsP\n/lrJ/vLfSGeQiKfMNOz3AoGAC9DMUHjxP50ytJRSH00cVBbk+qpHUVZC4p2bKqQn\nIxcFnhI9y2Z7CpdfjA24iNSr/zRny+dinEuJSDWjUi5/M3utWx+tY4jhvgzeIL3B\nHzYMRRJZUz5sxJKbSbVAn7xhgZ/2aPrT4EuEge/sDDvk03kjUyffRszOCdV4tuRl\nIoMCgYEAnrexTd5GuxEEBg3qJgN4IMwoBzZlJ1voaI6I/AMuvQ5kVklYvHTPTZOI\nkSIrvaG8xaOdf0f76XNdT7U/dkx0C0vcesy5++hqakmeRCHjfsE1wN7m+hGo5WcR\nJq8Ph9ZnH5RKjqDsHh7Y4BCewQNrMBqNQEzDebZCDBUTnK9OgOg=\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/tests/etc/host.pub",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwJaOo3i1X3N401hMd92lRec0tPMBgaF6ZDanovBiQP+PNo6gVNtuF15AspbyxrViqtAyjLWQQlKGWgEFb2ga3ukzJll4dKPtNff3mO++W19ia0WQZFWTAGcYqet4fvSALIpG+t/3u5MZXMNZPyCU8u1l+QXX14f6dEjzgRw7s3fSy/uvQawkgn8TQFvtSBOfvUTJPTAhhZqxZAt3nGH8d6vqD1hBNvdOpsohy6EgFh8V+kxnUdQntrYe9WSz0djt0RRrdAvRkM0hq1UY8C9FTQQWni1n168c7FVrf65+GdJOn7NQDu0Whmh/R3flXR0kIBG+F7e8+e9W9OhlionkPw== jas@mocca\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/tests/etc/sshd_config",
    "content": "Port 4711\nProtocol 2\nAuthorizedKeysFile /home/jas/src/libssh2/tests/etc/user.pub\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/tests/etc/user",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIEoQIBAAKCAQEAxIgBuZS39D4bFnWminE7svGQLdVKx1aWKnEYEa+XtNU4DKZ/\npxUHg0zbEBya+IkX1yqQYWALoiOwI8XhdemLp8g03BX7o+DLSWisfiHpCDVGAuNq\nRDF7qnFyL/ZBH6e0XKMtsoB51TDuBc4Rxh6p1V2QL/fg8BoHcCrnKkoqN8PSoKUX\n2lPKJ3JIF/P8cDLbKYCvbSTFOdf56eqg0GJe7jFtSwweE9yz3IWZ3kSS1E/9E6sX\naNCu/hUt1bvQthICQyBNoTtQP/igEUJ7n0GMetsnq9wiUSomLzWqIWNqmvOv62aC\nXRi5sYgpSAR4Zvnm3Cx/Wl0BEPz2rrFkG+G0SQIBIwKCAQEAgSYtBOyzZfztOqUV\nq277WFWZQrC8HJf8R8aparU3zpq+braOZnuImByP9KUVYX6pRECKw6WD/NWfonq4\nuzMSoXTviVBGRx6xeWIK880kG1Y1UlruD447Ur+ULiV7QLAIzylnLCiKk2lL9S+l\nR63AD95mEOS4Y0ROB+Gt2fY5ABHRMqhGLvRKK8qwn35C1Z9qnTGhgiRbeoc373A5\nZAYyegyLnbvyV47UfPYS/TVzxZ9RCx3D3I/9fI7ZAFafkkIufQX3QPaVxf0zFUwW\nde/f+gTbySTL4RDF185Evunx+tYvzCyIimB0cTE5dfsCWcHDtO6DwehKiOgJsbeW\nIrpeTwKBgQDnEMfv7ORR35Ouj91iNCSfLU/v0TSzAJBfqYovByhXRsopgWAKXUmH\nmWpBBP5vcGu3NvKfiZcMMbBPfllvlxkafQwvCqrdn5mg01MdAHMWP/O9yfvuxMDE\nKycU2G2CT8j85mIPn19WeIgXC/kws+P0RAVNCBNeq89Gvp4IdLN67wKBgQDZvTYh\nTPCYG32jBK+CcWmOna2SLvBloDcNevhzfu3RGjLIXzUHGxLdx7slsP/tpndmXIAL\nCgV6GfrLxix5bO08203S2qnnwP8VrjjNIv1CyZIbbQFAFIeC3QxZMZHnXieLrO0z\nqF5CuUXcL3cMeGmF/0HN/rB+4sF0qfv8wD8kRwKBgFXTCG8O2HYueK6NNPiXBknA\nX4T17wCocCOIHWHstzZcHzP82oeBvDmuAuTzOe7gnQmJcA9e/ZbQoJKOA/Y/b7lh\npXCO7wHcMb9kb1PqOWAJIASqG78V4TLrdOp8Re6Sqb0FHRu+2kSwbQ/f4DapN2lb\nF+lpZke8KGq71ExImm99AoGAN/10UbSy5UjlytVRs9QFM00eAQTBeTfTpGFzFmJ3\nqsw48bIU8zLY9zNcAmC21rXG7m+Oo8C/lG0UmsyPF+jPSinDjf22qU7iger4qccr\nLm5YxTlJduC1IaaOJZBnWMBwkaF+0sTlCdfew5ctPbiQKcVLb3wBf7amxjpWvVYB\nm50CgYAT6t2/Suav21J5zpzyrrt+oMZQ3MMzBnPHFRUQ1FdqZnE4eW5a10g0P+E+\nYeTol+fYxL34+cI5PREK3dcnW1E8g8KOsOQqMgWdTfZEDHYRLqEyGIhu20aqfJCY\nqu9tBburQoSlym9aQp41CMxIyHrL4GnwRlJkTTEVhDuab1HmKw==\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/tests/etc/user.pub",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAxIgBuZS39D4bFnWminE7svGQLdVKx1aWKnEYEa+XtNU4DKZ/pxUHg0zbEBya+IkX1yqQYWALoiOwI8XhdemLp8g03BX7o+DLSWisfiHpCDVGAuNqRDF7qnFyL/ZBH6e0XKMtsoB51TDuBc4Rxh6p1V2QL/fg8BoHcCrnKkoqN8PSoKUX2lPKJ3JIF/P8cDLbKYCvbSTFOdf56eqg0GJe7jFtSwweE9yz3IWZ3kSS1E/9E6sXaNCu/hUt1bvQthICQyBNoTtQP/igEUJ7n0GMetsnq9wiUSomLzWqIWNqmvOv62aCXRi5sYgpSAR4Zvnm3Cx/Wl0BEPz2rrFkG+G0SQ== jas@mocca\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/tests/libssh2_config_cmake.h.in",
    "content": "/* Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* Headers */\n#cmakedefine HAVE_UNISTD_H\n#cmakedefine HAVE_INTTYPES_H\n#cmakedefine HAVE_SYS_SOCKET_H\n#cmakedefine HAVE_ARPA_INET_H\n#cmakedefine HAVE_WINDOWS_H\n#cmakedefine HAVE_WINSOCK2_H\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/tests/mansyntax.sh",
    "content": "#!/bin/sh\nset -e\n\n# Written by Mikhail Gusarov\n#\n# Run syntax checks for all manpages in the documentation tree.\n#\n\nsrcdir=${srcdir:-$PWD}\ndstdir=${builddir:-$PWD}\nmandir=${srcdir}/../docs\n\n#\n# Only test if suitable man is available\n#\nif ! man --help | grep -q warnings; then\n  echo \"man version not suitable, skipping tests\"\n  exit 0\nfi\n\nec=0\n\ntrap \"rm -f $dstdir/man3\" EXIT\n\nln -sf \"$mandir\" \"$dstdir/man3\"\n\nfor manpage in $mandir/libssh2_*.*; do\n  echo \"$manpage\"\n  warnings=$(LANG=en_US.UTF-8 MANWIDTH=80 man -M \"$dstdir\" --warnings \\\n    -E UTF-8 -l \"$manpage\" 2>&1 >/dev/null)\n  if [ -n \"$warnings\" ]; then\n    echo \"$warnings\"\n    ec=1\n  fi\ndone\n\nexit $ec\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/tests/simple.c",
    "content": "/* Copyright (C) 2007 The Written Word, Inc.\n * Copyright (C) 2008, 2010 Simon Josefsson\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"libssh2.h\"\n\nstatic int test_libssh2_base64_decode (LIBSSH2_SESSION *session)\n{\n    char *data;\n    unsigned int datalen;\n    const char *src = \"Zm5vcmQ=\";\n    unsigned int src_len = strlen (src);\n    int ret;\n\n    ret = libssh2_base64_decode(session, &data, &datalen,\n                                src, src_len);\n    if (ret)\n        return ret;\n\n    if (datalen != 5 || strcmp (data, \"fnord\") != 0)\n    {\n        fprintf (stderr,\n                 \"libssh2_base64_decode() failed (%d, %.*s)\\n\",\n                 datalen, datalen, data);\n        return 1;\n    }\n\n    free (data);\n\n    return 0;\n}\n\nint main(int argc, char *argv[])\n{\n    LIBSSH2_SESSION *session;\n    int rc;\n    (void)argv;\n    (void)argc;\n\n    rc = libssh2_init (LIBSSH2_INIT_NO_CRYPTO);\n    if (rc != 0)\n    {\n        fprintf (stderr, \"libssh2_init() failed: %d\\n\", rc);\n        return 1;\n    }\n\n    session = libssh2_session_init();\n    if (!session)\n    {\n        fprintf (stderr, \"libssh2_session_init() failed\\n\");\n        return 1;\n    }\n\n    test_libssh2_base64_decode (session);\n\n    libssh2_session_free(session);\n\n    libssh2_exit ();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/tests/ssh2.c",
    "content": "/* Self test, based on examples/ssh2.c. */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINDOWS_H\n# include <windows.h>\n#endif\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n# ifdef HAVE_ARPA_INET_H\n#include <arpa/inet.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <ctype.h>\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 0;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel;\n    const char *pubkeyfile=\"etc/user.pub\";\n    const char *privkeyfile=\"etc/user\";\n    const char *username=\"username\";\n    const char *password=\"password\";\n    int ec = 1;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2,0), &wsadata);\n    if (err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return -1;\n    }\n#endif\n\n    (void)argc;\n    (void)argv;\n\n    if (getenv (\"USER\"))\n      username = getenv (\"USER\");\n\n    if (getenv (\"PRIVKEY\"))\n      privkeyfile = getenv (\"PRIVKEY\");\n\n    if (getenv (\"PUBKEY\"))\n      pubkeyfile = getenv (\"PUBKEY\");\n\n    hostaddr = htonl(0x7F000001);\n\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n#ifndef WIN32\n    fcntl(sock, F_SETFL, 0);\n#endif\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(4711);\n    sin.sin_addr.s_addr = hostaddr;\n    if (connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return 1;\n    }\n\n    /* Create a session instance and start it up\n     * This will trade welcome banners, exchange keys, and setup crypto, compression, and MAC layers\n     */\n    session = libssh2_session_init();\n    if (libssh2_session_startup(session, sock)) {\n        fprintf(stderr, \"Failure establishing SSH session\\n\");\n        return 1;\n    }\n\n    /* At this point we havn't authenticated,\n     * The first thing to do is check the hostkey's fingerprint against our known hosts\n     * Your app may have it hard coded, may go to a file, may present it to the user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    printf(\"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        printf(\"%02X \", (unsigned char)fingerprint[i]);\n    }\n    printf(\"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    printf(\"Authentication methods: %s\\n\", userauthlist);\n    if (strstr(userauthlist, \"password\") != NULL) {\n        auth_pw |= 1;\n    }\n    if (strstr(userauthlist, \"keyboard-interactive\") != NULL) {\n        auth_pw |= 2;\n    }\n    if (strstr(userauthlist, \"publickey\") != NULL) {\n        auth_pw |= 4;\n    }\n\n    if (auth_pw & 4) {\n        /* Authenticate by public key */\n        if (libssh2_userauth_publickey_fromfile(session, username, pubkeyfile, privkeyfile, password)) {\n            printf(\"\\tAuthentication by public key failed!\\n\");\n            goto shutdown;\n        } else {\n            printf(\"\\tAuthentication by public key succeeded.\\n\");\n        }\n    } else {\n        printf(\"No supported authentication methods found!\\n\");\n        goto shutdown;\n    }\n\n    /* Request a shell */\n    if (!(channel = libssh2_channel_open_session(session))) {\n        fprintf(stderr, \"Unable to open a session\\n\");\n        goto shutdown;\n    }\n\n    /* Some environment variables may be set,\n     * It's up to the server which ones it'll allow though\n     */\n    libssh2_channel_setenv(channel, \"FOO\", \"bar\");\n\n    /* Request a terminal with 'vanilla' terminal emulation\n     * See /etc/termcap for more options\n     */\n    if (libssh2_channel_request_pty(channel, \"vanilla\")) {\n        fprintf(stderr, \"Failed requesting pty\\n\");\n        goto skip_shell;\n    }\n\n    /* Open a SHELL on that pty */\n    if (libssh2_channel_shell(channel)) {\n        fprintf(stderr, \"Unable to request shell on allocated pty\\n\");\n        goto shutdown;\n    }\n\n    ec = 0;\n\n  skip_shell:\n    if (channel) {\n        libssh2_channel_free(channel);\n        channel = NULL;\n    }\n\n  shutdown:\n\n    libssh2_session_disconnect(session, \"Normal Shutdown\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    Sleep(1000);\n    closesocket(sock);\n#else\n    sleep(1);\n    close(sock);\n#endif\n\n    return ec;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/tests/ssh2.sh",
    "content": "#!/bin/sh\n\n# Written by Simon Josefsson.\n\n# Start sshd, invoke parameters, saving exit code, kill sshd, and\n# return exit code.\n\nsrcdir=${srcdir:-$PWD}\nSSHD=${SSHD:-/usr/sbin/sshd}\n\ncmd=\"./ssh2${EXEEXT}\"\nsrcdir=`cd \"$srcdir\"; pwd`\n\nPRIVKEY=$srcdir/etc/user\nexport PRIVKEY\nPUBKEY=$srcdir/etc/user.pub\nexport PUBKEY\n\nif test -n \"$DEBUG\"; then\n    libssh2_sshd_params=\"-d -d\"\nfi\n\nchmod go-rwx \"$srcdir\"/etc/host*\n$SSHD -f /dev/null -h \"$srcdir\"/etc/host \\\n    -o 'Port 4711' \\\n    -o 'Protocol 2' \\\n    -o \"AuthorizedKeysFile $srcdir/etc/user.pub\" \\\n    -o 'UsePrivilegeSeparation no' \\\n    -o 'StrictModes no' \\\n    -D \\\n    $libssh2_sshd_params &\nsshdpid=$!\n\ntrap \"kill ${sshdpid}; echo signal killing sshd; exit 1;\" EXIT\n\n: \"started sshd (${sshdpid})\"\n\nsleep 3\n\n: Invoking $cmd...\neval $cmd\nec=$?\n: Self-test exit code $ec\n\n: \"killing sshd (${sshdpid})\"\nkill \"${sshdpid}\" > /dev/null 2>&1\ntrap \"\" EXIT\nexit $ec\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/tests/sshd_fixture.sh.in",
    "content": "#!/bin/sh\n\n# Written by Simon Josefsson.\n\n# Start sshd, invoke parameters, saving exit code, kill sshd, and\n# return exit code.\n\nsrcdir=\"@SSHD_TEST_CONFIG_DIR@\"\nSSHD=\"@SSHD_EXECUTABLE@\"\n\ncmd=\"\\\"$1\\\"\"\n\nPRIVKEY=$srcdir/etc/user\nexport PRIVKEY\nPUBKEY=$srcdir/etc/user.pub\nexport PUBKEY\n\nif test -n \"$DEBUG\"; then\n    libssh2_sshd_params=\"-d -d\"\nfi\n\nchmod go-rwx \"$srcdir\"/etc/host*\n\"$SSHD\" -f /dev/null -h \"$srcdir/etc/host\" \\\n    -o 'Port 4711' \\\n    -o 'Protocol 2' \\\n    -o \"AuthorizedKeysFile \\\"$srcdir/etc/user.pub\\\"\" \\\n    -o 'UsePrivilegeSeparation no' \\\n    -o 'StrictModes no' \\\n    -D \\\n    $libssh2_sshd_params &\nsshdpid=$!\n\ntrap \"kill ${sshdpid}; echo signal killing sshd; exit 1;\" EXIT\n\n: \"started sshd (${sshdpid})\"\n\nsleep 3\n\nif ! kill -0 ${sshdpid}\nthen\n    echo \"SSHD exited before test started\"\n    exit 1\nfi\n\n: Invoking $cmd...\neval \"$cmd\"\nec=$?\n: Self-test exit code $ec\n\n: \"killing sshd (${sshdpid})\"\nkill \"${sshdpid}\" > /dev/null 2>&1\ntrap \"\" EXIT\nexit $ec\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/tests/sshdwrap",
    "content": "#!/bin/sh -x\n\n# Written by Simon Josefsson\n\n# Start sshd, invoke parameters, saving exit code, kill sshd, and\n# return exit code.\n\ncmd=\"$@\"\nSSHD=${SSHD:-/usr/sbin/sshd}\n\n$SSHD -f etc/sshd_config -h $PWD/etc/host -D &\nsshdpid=$!\n\ntrap \"kill ${sshdpid}; echo signal killing sshd; exit 1;\" EXIT\n\n: \"started sshd (${sshdpid})\"\n\nsleep 1\n\n: Invoking $cmd...\neval $cmd\nec=$?\n: Self-test exit code $ec\n\n: \"killing sshd (${sshdpid})\"\nkill \"${sshdpid}\" > /dev/null 2>&1\ntrap \"\" EXIT\nexit $ec\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/vms/libssh2_config.h",
    "content": "#ifndef LIBSSH2_CONFIG_H\n#ifdef __VMS\n\n#define LIBSSH2_CONFIG_H\n\n/* VMS specific libssh2_config.h\n */\n\n#define ssize_t SSIZE_T\n\ntypedef unsigned int uint32_t ;\ntypedef unsigned int socklen_t; /* missing in headers on VMS */\n\n/* Have's */\n\n#define HAVE_UNISTD_H\n#define HAVE_STDLIB_H\n#define HAVE_INTTYPES_H\n#define HAVE_SYS_TIME_H\n#define HAVE_SELECT\n#define HAVE_UIO\n\n#define HAVE_SYS_SOCKET.H\n#define HAVE_NETINET_IN_H\n#define HAVE_ARPA_INET_H\n\n#define HAVE_GETTIMEOFDAY 1\n\n#define POSIX_C_SOURCE\n\n/* Enable the possibility of using tracing */\n \n#define LIBSSH2DEBUG 1\n\n/* For selection of proper block/unblock function in session.c */\n\n#define HAVE_FIONBIO\n\n#include <stropts.h>\n\n/* In VMS TCP/IP Services and some BSD variants SO_STATE retrieves \n * a bitmask revealing amongst others the blocking state of the \n * socket. On VMS the bits are undocumented, but  SS_NBIO\n * works, I did not test the other bits. Below bitdefs are \n * from Berkely source socketvar.h at   \n * http://ftp.fibranet.cat/UnixArchive/PDP-11/Trees/2.11BSD/sys/h/socketvar.h\n *  Socket state bits.\n *  #define SS_NOFDREF          0x001    no file table ref any more \n *  #define SS_ISCONNECTED      0x002    socket connected to a peer \n *  #define SS_ISCONNECTING     0x004    in process of connecting to peer \n *  #define SS_ISDISCONNECTING  0x008    in process of disconnecting \n *  #define SS_CANTSENDMORE     0x010    can't send more data to peer \n *  #define SS_CANTRCVMORE      0x020    can't receive more data from peer \n *  #define SS_RCVATMARK        0x040    at mark on input \n *  #define SS_PRIV             0x080    privileged for broadcast, raw... \n *  #define SS_NBIO             0x100    non-blocking ops \n *  #define SS_ASYNC            0x200    async i/o notify \n *\n */\n\n#ifdef SO_STATE\n\n/* SO_STATE is defined in stropts.h  by DECC\n * When running on Multinet, SO_STATE renders a protocol\n * not started error. Functionally this has no impact,\n * apart from libssh2 not being able to restore the socket\n * to the proper blocking/non-blocking state.  \n */\n\n#define SS_NBIO         0x100 \n\n#endif\n\n/* Use OpenSSL */\n#define LIBSSH2_OPENSSL 1\n\n/* Compile in zlib support. We link against gnv$libzshr, as available\n * from https://sourceforge.net/projects/vms-ports/files/.\n */\n\n#define LIBSSH2_HAVE_ZLIB\n\n/* Enable newer diffie-hellman-group-exchange-sha1 syntax */\n\n#define LIBSSH2_DH_GEX_NEW 1\n\n#endif /* __VMS */\n#endif /* LIBSSH2_CONFIG_H */                             \n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/vms/libssh2_make_example.dcl",
    "content": "$!\n$!\n$ olddir = f$environment(\"default\")\n$ on control_y then goto YExit\n$!\n$ gosub Init\n$ if .not. init_status then goto YExit\n$!\n$ if what .eqs. \"ALL\"\n$ then\n$\tcall MakeAll\n$ else\n$\tcall Make \n$endif\n$!\n$YExit:\n$ set noon\n$! deassign exadir\n$! deassign objdir\n$ delete 'link_opts';*\n$ set default 'olddir'\n$exit \n\n$MakeAll: subroutine\n$!\n$ set noon\n$Loop:\n$ this = f$search(\"exadir:*.c;0\")\n$ if this .eqs. \"\" then goto EndLoop\n$!\n$ what = f$parse( this,,,\"name\")\n$ if what .eqs. \"x11\" then goto loop ! not portable yet\n$ call Make\n$!\n$ goto Loop\n$EndLoop:\n$!\n$exit\n$endsubroutine\n\n\n$Make: subroutine\n$!\n$ set noon\n$!\n$ cc 'cc_include' 'cc_flags'/object=objdir:'what' exadir:'what'\n$ sev = $severity\n$ if sev .and. 2 \n$ then\n$\tsay \"Error compiling ''what', not linked.\"\n$ else\n$ \tif .not. (sev .and. 1)  \n$ \tthen\n$\t\tsay \"Compile warnings in  ''what'\"\n$ \tendif\n$  link/exe='what'.exe objdir:'what'.obj, 'link_opts'/opt\n$ endif\n$!\n$!\n$End:\n$ delete objdir:'what'.obj;*\n$exit\n$endsubroutine \n\n\n$Init: \n$!\n$!\n$ init_status = 1\n$ thisid = f$integer( %x'f$getjpi(0,\"pid\")') + \"''f$cvtime(,,\"second\")'\"\n$ mdir   = f$environment(\"procedure\") \n$ mdir   = mdir - f$parse(mdir,,,\"name\") - f$parse(mdir,,,\"type\") - f$parse(mdir,,,\"version\")\n$ set default 'mdir'\n$!\n$ objdir = \"[.example_objects]\"\n$ exadir = \"[-.example]\"\n$!\n$ objdirfile = objdir - \"[.\" - \"]\" + \".dir\"\n$ if f$search( objdirfile ) .eqs. \"\"\n$ then\n$\tcreate/directory 'objdir'\n$ endif\n$!\n$ define objdir 'objdir'\n$ define exadir 'exadir'\n$!\n$ cc_include = \"/include=([],[-.include])\"\n$ cc_flags   = \"/name=shortened/show=all/define=(_USE_STD_STAT=1)\"\n$ link_opts  = \"objdir:libssh2_''thisid'.opt\"\n$!\n$!\n$ what = \"''p1'\" \n$ if what .eqs. \"\" .or. f$edit(p1,\"trim,collapse,upcase\") .eqs. \"ALL\" \n$ then \n$\twhat = \"ALL\"\n$ else\n$\twhat = f$parse(what,,,\"name\")\n$\tif f$search(\"exadir:''what'.c\") .eqs. \"\"\n$\tthen \n$\t\twrite sys$output \"Can't make ''what'\"\n$\t\tinit_status = 0\n$\tendif\n$ endif\n$!\n$ currentlib = f$search(\"libssh2*.exe\")\n$!\n$ define libssh2 'currentlib'\n$!\n$ how  = \"''p2'\"\n$ if how .eqs. \"\" .or. f$edit(p2,\"trim,collapse,upcase\") .eqs. \"STATIC\" \n$ then\n$ \topen/write lout 'link_opts'\n$ \twrite lout \"libssh2.olb/lib\"\n$ \twrite lout \"sys$share:ssl$libcrypto_shr32.exe/share\"\n$ \twrite lout \"sys$share:ssl$libssl_shr32.exe/share\"\n$ \twrite lout \"gnv$libzshr/share\"\n$ \tclose lout\n$ else\n$\thow = \"SHARED\"\n$ \topen/write lout 'link_opts'\n$ \twrite lout \"libssh2/share\"\n$ \tclose lout\n$ endif \n$!\n$return\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/vms/libssh2_make_help.dcl",
    "content": "$!\n$!\n$!\n$ olddir = f$environment( \"default\" )\n$ on control_y then goto End\n$ on error then goto End\n$!\n$ gosub Init\n$!\n$ man2help sys$input: libssh2.hlp -b 1\n\nLIBSSH2\n\nOpenVMS port of the libssh2 library, which provides an\nAPI to implement client SSH communication.\n\nLicense information is available at the Copying subtopic.\n\n$!\n$ open/append mh libssh2.hlp\n$ write mh helpversion\n$ close mh\n$!\n$ man2help -a [-]README.; libssh2.hlp        -b 2\n$ man2help -a [-]COPYING.; libssh2.hlp       -b 2\n$ man2help -a [-]NEWS.; libssh2.hlp          -b 2\n$ man2help -a [-]RELEASE-NOTES.; libssh2.hlp -b 2\n$ man2help -a [-.docs]AUTHORS.; libssh2.hlp  -b 2\n$ man2help -a [-.docs]BINDINGS.; libssh2.hlp -b 2\n$ man2help -a [-.docs]HACKING.; libssh2.hlp  -b 2\n$ if f$search(\"[]HACKING_CRYPTO.\") .nes. \"\" then delete []HACKING_CRYPTO.;*\n$ copy [-.docs]HACKING.CRYPTO; []HACKING_CRYPTO.\n$ man2help -a []HACKING_CRYPTO.; libssh2.hlp -b 2\n$ man2help -a [-.docs]TODO.; libssh2.hlp     -b 2\n$!\n$ man2help -a sys$input: libssh2.hlp         -b 2\n\nAPI_Reference\n\nReference of all implemented API calls in\nlibssh2.\n\n$!\n$ man2help -a [-.docs]*.3 libssh2.hlp -b 3 -p\n$!\n$ library/help/create libssh2.hlb libssh2.hlp\n$!\n$End:\n$ set default 'olddir'\n$exit\n$!\n$!-------------------------------------------------------\n$!\n$Init:\n$!\n$ thisdir = f$environment( \"procedure\" )\n$ thisdir = f$parse(thisdir,,,\"device\") + f$parse(thisdir,,,\"directory\")\n$ set default 'thisdir'\n$! \n$ say = \"write sys$output\"\n$!\n$ pipe search [-.include]*.h libssh2_version_major/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job majorv &l )\n$ pipe search [-.include]*.h libssh2_version_minor/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job minorv &l )\n$ pipe search [-.include]*.h libssh2_version_patch/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job patchv &l )\n$!\n$ majorv   = f$trnlnm(\"majorv\")\n$ minorv   = f$integer(f$trnlnm(\"minorv\")) \n$ patchv   = f$integer( f$trnlnm(\"patchv\"))\n$!\n$ helpversion = \"This help library is based on build version ''majorv'.''minorv'.''patchv' of libssh2.\"\n$!\n$ deassign/job majorv\n$ deassign/job minorv\n$ deassign/job patchv\n$!\n$ if f$search( \"man2help.exe\" ) .eqs. \"\"\n$ then\n$   cc man2help\n$   link man2help\n$ endif\n$! \n$ man2help := $'thisdir'man2help.exe \n$!\n$ if f$search(\"libssh2.hlp\") .nes. \"\" \n$ then \n$   delete libssh2.hlp;*\n$ endif\n$ if f$search(\"libssh2.hlb\") .nes. \"\" \n$ then \n$   delete libssh2.hlb;*\n$ endif\n$return\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/vms/libssh2_make_kit.dcl",
    "content": "$!\n$ olddir = f$environment(\"default\")\n$ on error then goto End\n$!\n$ gosub Init\n$!\n$ call WriteProductDescriptionFile\n$ call WriteProductTextFile\n$!\n$! backup tree\n$!\n$ backup [-...]*.*;0/excl=([]*.exe,*.obj,*.opt,*.hlp,*.hlb,*.bck,*.com,*.pcsi*) -\n    libssh2-'versionname''datename'_src.bck/save\n$ purge libssh2-'versionname''datename'_src.bck\n$!\n$! backup examples\n$!\n$ backup [-.example]*.c;0 libssh2_examples-'versionname''datename'.bck/save\n$ dire  libssh2_examples-'versionname''datename'.bck\n$ purge libssh2_examples-'versionname''datename'.bck\n$!\n$ set default [-]\n$!\n$ defdir  = f$environment( \"default\" )\n$ thisdev = f$parse(defdir,,,\"device\",\"no_conceal\") \n$ thisdir = f$parse(defdir,,,\"directory\",\"no_conceal\") - \"][\" - \"][\" - \"][\" - \"][\"\n$!\n$ libssh2_kf = thisdev + thisdir \n$ libssh2_kf = libssh2_kf - \"]\" + \".]\"\n$!\n$ set default 'mdir'\n$!\n$ define/translation_attributes=concealed libssh2_kf 'libssh2_kf'\n$!\n$ product package libssh2 - \n    /base='arch' - \n    /producer=jcb -\n    /source=[] - ! where to find PDF and PTF \n    /destination=[] - ! where to put .PCSI file \n    /material=libssh2_kf:[000000...] -      ! where to find product material \n    /version=\"''vms_majorv'.''minorv'-''patchv'''datename'\" -\n    /format=sequential \n$!\n$End:\n$!\n$ set noon\n$ if f$search(\"*.pcsi$desc;*\") .nes. \"\" then delete *.pcsi$desc;*\n$ if f$search(\"*.pcsi$text;*\") .nes. \"\" then delete *.pcsi$text;*\n$ if f$search(\"libssh2-''versionname'''datename'_src.bck;*\") .nes. \"\" then delete libssh2-'versionname''datename'_src.bck;*\n$ if f$search(\"libssh2_examples-''versionname'''datename'.bck;*\") .nes. \"\" then delete libssh2_examples-'versionname''datename'.bck;*\n$!\n$ if f$trnlnm(\"libssh2_kf\") .nes. \"\" then deassign libssh2_kf\n$ set default 'olddir'\n$!\n$exit \n$!\n$!--------------------------------------------------------------------------------\n$!\n$Init:\n$ set process/parse=extended\n$!\n$ say    = \"write sys$output\"\n$!\n$ mdir   = f$environment(\"procedure\") \n$ mdir   = mdir - f$parse(mdir,,,\"name\") - f$parse(mdir,,,\"type\") - f$parse(mdir,,,\"version\")\n$!\n$ set default 'mdir'\n$!\n$ pipe search [-.include]*.h libssh2_version_major/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job majorv &l )\n$ pipe search [-.include]*.h libssh2_version_minor/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job minorv &l )\n$ pipe search [-.include]*.h libssh2_version_patch/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job patchv &l )\n$!\n$ majorv   = f$trnlnm(\"majorv\")\n$ minorv   = f$integer(f$trnlnm(\"minorv\")) \n$ patchv   = f$integer( f$trnlnm(\"patchv\"))\n$!\n$ deassign/job majorv\n$ deassign/job minorv\n$ deassign/job patchv\n$!\n$ vms_majorv =  f$trnlnm(\"vms_majorv\")\n$ if vms_majorv .eqs. \"\" then vms_majorv = majorv\n$!\n$ arch = \"UNKNOWN\"\n$ if f$getsyi(\"arch_type\") .eq. 2 then arch = \"AXPVMS\"\n$ if f$getsyi(\"arch_type\") .eq. 3 then arch = \"I64VMS\"\n$!\n$ if arch .eqs. \"UNKNOWN\"\n$ then\n$   say \"Unsupported or unknown architecture, only works on Alpha and Itanium\"\n$   exit 2\n$ endif\n$!\n$! is this a proper release or a daily snapshot?\n$! crummy, but should work.\n$!\n$ daily = \"TRUE\"\n$ firstdash     = f$locate(\"-\",mdir)\n$ restdir       = f$extract( firstdash + 1, 80, mdir)\n$ seconddash    = f$locate(\"-\", restdir)\n$ if seconddash .ge. f$length( restdir )\n$ then\n$   daily    = \"FALSE\"\n$   datename = \"Final\"\n$ else\n$   datename = \"D\" + f$extract(seconddash+1,8,restdir)   \n$ endif\n$!\n$ if daily \n$ then\n$   productname = \"JCB ''arch' LIBSSH2 V''vms_majorv'.''minorv'-''patchv'''datename'\"\n$ else\n$   productname = \"JCB ''arch' LIBSSH2 V''vms_majorv'.''minorv'-''patchv'''datename'\"\n$ endif\n$!\n$ productfilename  = \"JCB-''arch'-LIBSSH2-\" + f$fao(\"V!2ZL!2ZL-!2ZL!AS-1\", f$integer(vms_majorv),minorv,patchv,datename)\n$!\n$ versionname   = \"''vms_majorv'_''minorv'_''patchv'\"\n$!\n$return\n$!\n$!--------------------------------------------------------------------------------\n$!\n$WriteProductDescriptionFile: subroutine\n$!\n$ open/write pd 'productfilename'.PCSI$DESC\n$!\n$ write pd \"product ''productname' full ;\"\n$ write pd \"    software DEC ''arch' VMS ;\"\n$ write pd \"    if (not <software DEC ''arch' VMS version minimum V8.3>) ;\n$ write pd \"        error NEED_VMS83 ;\"\n$ write pd \"    end if ;\"\n$ write pd \"    software HP ''arch' SSL version minimum V1.3;\"\n$ write pd \"    if (not <software HP ''arch' SSL version minimum V1.3>) ;\n$ write pd \"        error NEED_SSL ;\"\n$ write pd \"    end if ;\"\n$ write pd \"    execute preconfigure (\"\"set process/parse_type=extended\"\");\"\n$ write pd \"    execute postinstall (\"\"set process/parse_type=extended\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv]usr.dir usr.DIR\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr]include.dir include.DIR\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr.include]libssh2.dir libssh2.DIR\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr.include.libssh2]libssh2.h libssh2.h\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr.include.libssh2]libssh2_publickey.h libssh2_publickey.h\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr.include.libssh2]libssh2_sftp.h libssh2_sftp.h\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr.include.libssh2]libssh2_config.h libssh2_config.h\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr]lib.dir lib.DIR\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr.lib]gnv$libssh2_''versionname'.exe gnv$libssh2_''versionname'.exe\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr.share.doc.libssh2]libssh2.hlb libssh2.hlb\"\");\"\n$ write pd \"    information RELEASE_NOTES phase after ;\"\n$ write pd \"    option EXAMPLE default 0 ;\"\n$ write pd \"     directory \"\"[gnv.usr.share.doc.libssh2.examples]\"\" ;\"\n$ write pd \"     file \"\"[gnv.usr.share.doc.libssh2.examples]libssh2_examples-''versionname'''datename'.bck\"\";\"\n$ write pd \"    end option ;\"\n$ write pd \"    option SOURCE default 0 ;\"\n$ write pd \"     directory \"\"[gnv.common_src]\"\" ;\"\n$ write pd \"     file \"\"[gnv.common_src]libssh2-''versionname'''datename'_src.bck\"\";\"\n$ write pd \"    end option ;\"\n$ write pd \"    directory \"\"[gnv]\"\" ;\"\n$ write pd \"    directory \"\"[gnv.usr]\"\" ;\"\n$ write pd \"    directory \"\"[gnv.usr.lib]\"\" ;\"\n$ write pd \"    directory \"\"[gnv.usr.include]\"\" ;\"\n$ write pd \"    directory \"\"[gnv.usr.include.libssh2]\"\" ;\"\n$ write pd \"    directory \"\"[gnv.usr.share]\"\" ;\"\n$ write pd \"    directory \"\"[gnv.usr.share.doc]\"\" ;\"\n$ write pd \"    directory \"\"[gnv.usr.share.doc.libssh2]\"\" ;\"\n$ write pd \"    file \"\"[gnv.usr.include.libssh2]libssh2.h\"\" source \"\"[include]libssh2.h\"\";\"\n$ write pd \"    file \"\"[gnv.usr.include.libssh2]libssh2_publickey.h\"\" source \"\"[include]libssh2_publickey.h\"\";\"\n$ write pd \"    file \"\"[gnv.usr.include.libssh2]libssh2_sftp.h\"\" source \"\"[include]libssh2_sftp.h\"\";\"\n$ write pd \"    file \"\"[gnv.usr.include.libssh2]libssh2_config.h\"\" source \"\"[vms]libssh2_config.h\"\";\"\n$ write pd \"    file \"\"[gnv.usr.share.doc.libssh2]libssh2.hlb\"\" source \"\"[vms]libssh2.hlb\"\";\"\n$ write pd \"    file \"\"[gnv.usr.share.doc.libssh2]libssh2-''versionname'.news\"\" source \"\"[000000]NEWS.\"\";\"\n$ write pd \"    file \"\"[gnv.usr.share.doc.libssh2]libssh2-''versionname'.release_notes\"\" source \"\"[vms]readme.vms\"\";\"\n$ write pd \"    file \"\"[gnv.usr.lib]gnv$libssh2_''versionname'.exe\"\" source \"\"[vms]libssh2_''versionname'.exe\"\";\"\n$ write pd \"end product ;\"\n$ close pd\n$exit \n$endsubroutine\n$!\n$!--------------------------------------------------------------------------------\n$!\n$WriteProductTextFile: subroutine\n$!\n$ open/write pt 'productfilename'.PCSI$TEXT\n$ write pt \"=PRODUCT ''productname' Full\"\n$ write pt \"1 'PRODUCER\"\n$ write pt \"=prompt libssh2 is an open source product ported to VMS by Jose Baars\"\n$ write pt \"This software product is provided with no warranty.\"\n$ write pt \"For license information see the LIBSSH2 help library.\"\n$ write pt \"1 'PRODUCT\"\n$ write pt \"=prompt JCB LIBSSH2 for OpenVMS\"\n$ write pt \"\"\n$ write pt \"libssh2 is an open source client side library that aims to implement\"\n$ write pt \"the SSH protocol. This is the OpenVMS port of that library.\"\n$ write pt \"Further information at https://www.libssh2.org.\"\n$ write pt \"\"\n$ write pt \"1 NEED_VMS83\"\n$ write pt \"=prompt OpenVMS 8.3 or later is not installed on your system.\"\n$ write pt \"This product requires OpenVMS 8.3 or later to function.\"\n$ write pt \"\"\n$ write pt \"1 NEED_SSL\"\n$ write pt \"=prompt HP SSL 1.3 or later is not installed on your system.\"\n$ write pt \"This product requires HP SSL 1.3 or later to function.\"\n$ write pt \"\"\n$ write pt \"1 RELEASE_NOTES\"\n$ write pt \"=prompt Release notes and the libssh2 help library are available in [gnv.usr.share.doc.libssh2] directory.\"\n$ write pt \"\"\n$ write pt \"1 EXAMPLE\"\n$ write pt \"=prompt Do you want the libssh2 C programming examples ? \"\n$ write pt \"The libssh2 coding examples will be available in backup saveset \"\n$ write pt \"[gnv.usr.share.doc.libssh2.examples]libssh2_examples_''versionname'.bck\"\n$ write pt \"\"\n$ write pt \"1 SOURCE\"\n$ write pt \"=prompt Do you want the complete libssh2 source tree ? \"\n$ write pt \"The libssh2 source tree will be available in backup saveset \"\n$ write pt \"[gnv.common_src]libssh2_''versionname'''datename'_src.bck\"\n$close pt\n$exit\n$ endsubroutine\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/vms/libssh2_make_lib.dcl",
    "content": "$!\n$!\n$ olddir = f$environment(\"default\")\n$ on control_y then goto YExit\n$!\n$ gosub Init\n$ if .not. init_status then goto YExit\n$!\n$ call CompileAll\n$ call BuildTransferVectors\n$ call LinkShared\n$!\n$ call Cleanup\n$!\n$YExit:\n$ set noon\n$!\n$ deassign srcdir\n$ if f$search(\"objdir:*.*;*\") .nes. \"\" then delete objdir:*.*;*\n$ deassign objdir\n$ delete library_objects.dir;*\n$!\n$ set default 'olddir'\n$exit \n$!\n$!---------------------------------------------------------------------\n$!\n$Init: \n$!\n$!\n$ init_status = 1\n$ thisid = f$integer( %x'f$getjpi(0,\"pid\")') \n$ mdir   = f$environment(\"procedure\") \n$ mdir   = mdir - f$parse(mdir,,,\"name\") - f$parse(mdir,,,\"type\") - f$parse(mdir,,,\"version\")\n$ set default 'mdir'\n$!\n$ objdir = \"[.library_objects]\"\n$ srcdir = \"[-.src]\"\n$!\n$ objdirfile = objdir - \"[.\" - \"]\" + \".dir\"\n$ if f$search( objdirfile ) .eqs. \"\"\n$ then\n$   create/directory 'objdir'\n$ endif\n$!\n$ define objdir 'objdir'\n$ define srcdir 'srcdir'\n$!\n$ cc_include = \"/include=([],[-.include],\"\"/gnv$zlib_include\"\")\"\n$ cc_define = \"/DEFINE=(_USE_STD_STAT=1)\"\n$ link_opts  = \"objdir:libssh2_''thisid'.opt\"\n$!\n$ pipe search [-.include]libssh2.h libssh2_version_major/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job majorv &l )\n$ pipe search [-.include]libssh2.h libssh2_version_minor/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job minorv &l )\n$ pipe search [-.include]libssh2.h libssh2_version_patch/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job patchv &l )\n$!\n$ majorv   = f$trnlnm(\"majorv\")\n$ minorv   = f$integer(f$trnlnm(\"minorv\")) \n$ patchv   = f$integer( f$trnlnm(\"patchv\"))\n$!\n$ OLBONLY = \"FALSE\"\n$ if p1 .eqs. \"OLBONLY\"\n$ then\n$   OLBONLY = \"TRUE\"\n$ endif\n$!\n$ deassign/job majorv\n$ deassign/job minorv\n$ deassign/job patchv\n$!\n$return\n$!\n$!---------------------------------------------------------------------\n$!\n$Cleanup: subroutine\n$!\n$ set noon\n$ purge *.opt\n$ purge *.olb\n$ purge *.exe\n$! \n$exit 1\n$endsubroutine\n$!\n$!---------------------------------------------------------------------\n$!\n$LinkShared: subroutine\n$!\n$!\n$!\n$ cversion = f$fao(\"!3ZL\",minorv)  + f$fao(\"!3ZL\",patchv)\n$!\n$! General linking options in link_libssh2_version...opt\n$! Vectors in link_libssh2_vectors...opt\n$!\n$ open/write uitv link_libssh2_version_'majorv'_'minorv'_'patchv'.opt\n$ write uitv \"GSMATCH=LEQUAL,''majorv',''cversion'\"\n$ write uitv \"IDENTIFICATION=\"\"LIBSSH2 ''majorv'.''minorv'.''patchv'\"\"\"\n$ write uitv \"sys$share:ssl$libcrypto_shr32.exe/share\"\n$ write uitv \"sys$share:ssl$libssl_shr32.exe/share\"\n$ write uitv \"gnv$libzshr/share\"\n$ close uitv\n$! \n$ link/shared/exe=libssh2_'majorv'_'minorv'_'patchv'.exe -\n    libssh2.olb/lib, -\n    link_libssh2_version_'majorv'_'minorv'_'patchv'.opt/opt, -\n    link_libssh2_vectors_'majorv'_'minorv'_'patchv'.opt/opt\n$!\n$exit\n$endsubroutine\n$!\n$!---------------------------------------------------------------------\n$!\n$CompileAll: subroutine\n$!\n$ set noon\n$!\n$ if f$search(\"objdir:*.obj;*\") .nes \"\" \n$ then \n$   delete objdir:*.obj;*\n$ endif\n$ if f$search(\"[.cxx_repository]cxx$demangler_db.;\") .nes \"\" \n$ then \n$   delete [.cxx_repository]cxx$demangler_db.;*\n$ endif\n$!\n$! Compile all .c files in [-.src], first as_is\n$! and then as default all uppercase names\n$! and add the resulting object to object libraries\n$! libssh2_up.olb and libssh2_as_is.olb.\n$!\n$ case = 0\n$ if OLBONLY then case = 1\n$CaseLoop:\n$!\n$ if case .eq. 0 \n$ then!camel case names \n$   cc_flags = \"/names=(shortened,as_is)''cc_define'\"\n$   objlib = \"libssh2_asis.olb\"\n$ endif\n$!\n$ if case .eq. 1 \n$ then!uppercase names \n$   if f$search(\"[.cxx_repository]cxx$demangler_db.;\") .nes \"\" \n$   then \n$      rename [.cxx_repository]cxx$demangler_db.; *.lowercase\n$      purge  [.cxx_repository]cxx$demangler_db.lowercase\n$   endif\n$!\n$   cc_flags = \"/names=(shortened)''cc_define'\"\n$   objlib = \"libssh2_up.olb\"\n$ endif\n$!\n$ if f$search(\"''objlib';*\") .nes. \"\" then delete 'objlib';*\n$ library/create 'objlib'\n$!\n$Loop:\n$ this = f$search(\"srcdir:*.c;0\")\n$ if this .eqs. \"\" then goto EndLoop\n$!\n$ what = f$parse( this,,,\"name\")\n$!\n$ call CompileAndAdd\n$!\n$ goto Loop\n$EndLoop:\n$ case = case + 1\n$ delete objdir:*.obj;*\n$ if case .lt 2 then goto CaseLoop\n$!\n$ rename libssh2_up.olb libssh2.olb\n$ if f$search(\"[.cxx_repository]cxx$demangler_db.;\") .nes \"\" \n$ then \n$    rename [.cxx_repository]cxx$demangler_db.; *.uppercase\n$    purge  [.cxx_repository]cxx$demangler_db.uppercase\n$ endif\n$!\n$ if OLBONLY then exit 4\n$!\n$! For each function that is too long, create a global symbol\n$! low$'shortened-uppercase-name' with as value lowercase shortened\n$! name in it, so we can add the proper lower or mixed case \n$! shortened name later when building the transfer vectors \n$! for the shared image.\n$! This is to prevent two very long similar function names \n$! that are shortened getting mixed up when sorted alphabetically.\n$!\n$ inputfile = \"[.cxx_repository]cxx$demangler_db.lowercase\"\n$ gosub GetShortened\n$!\n$ inputfile =  \"[.cxx_repository]cxx$demangler_db.uppercase\"\n$ gosub GetShortened\n$!\n$exit\n$!\n$GetShortened:\n$!\n$ open/read s 'inputfile'\n$ namecount = 0\n$ReadLoop:\n$!\n$ read/end=endreadloop s regel\n$!\n$ shortname = f$element(0,\"$\",regel) + \"$\"\n$ longname  = f$element(1,\"$\",regel)\n$!\n$ symvalue = \"\"\n$!\n$ if shortname .eqs. f$edit(shortname,\"upcase\")\n$ then\n$!  this is an uppercase shortname, add it \n$   symname  = \"u$''longname'\"\n$   symvalue = \"''shortname'\"\n$   low$'shortname' == l$'longname'\n$!\n$   delete/symbol l$'longname'\n$!\n$ else\n$!  this is an lowercase shortname\n$   symname  = \"l$''longname'\"\n$   symvalue = \"''shortname'\"\n$   'symname' = \"''symvalue'\"\n$ endif\n$!\n$ namecount = namecount + 1\n$!\n$ goto ReadLoop\n$EndReadLoop:\n$!\n$close s\n$return\n$!\n$endsubroutine\n$!\n$!---------------------------------------------------------------------\n$!\n$CompileAndAdd: subroutine\n$!\n$ on error then goto End\n$!\n$ cc /warn=disable=longextern/lis=objdir:/show=all 'cc_include' 'cc_flags'/object=objdir:'what'.obj srcdir:'what'.c\n$ library/insert 'objlib' objdir:'what'.obj\n$!\n$End:\n$exit\n$endsubroutine \n$!\n$!---------------------------------------------------------------------\n$!\n$BuildTransferVectors: subroutine\n$!\n$! Do a balanced read of the uppercase library names\n$! and the mixed case library names, and build the\n$! transfer vectors with uppercase entry points \n$! with an alternative in mixed case.\n$! For shortened names, use the low$* symbols\n$! to avoid being fooled by the sort.\n$!\n$ thislib = \"libssh2.olb\"\n$ library/lis=libu.'thisid'/names libssh2.olb\n$ library/lis=lib_asisu.'thisid'/names libssh2_asis.olb\n$!\n$! case blind sort of all modules in both the uppercase\n$! as the case sensitive object library.\n$!\n$ sort libu.'thisid' lib.'thisid'/spec=sys$input\n/COLLATING_SEQUENCE=(SEQUENCE= (\"A\" - \"Z\",\"0\"-\"9\",\"_\"), FOLD) \n$ sort lib_asisu.'thisid' lib_asis.'thisid'/spec=sys$input\n/COLLATING_SEQUENCE=(SEQUENCE= (\"A\" - \"Z\",\"0\"-\"9\",\"_\"), FOLD) \n$!\n$ open/read  in  lib.'thisid'\n$ open/read  inasis  lib_asis.'thisid'\n$ open/write uit link_libssh2_vectors_'majorv'_'minorv'_'patchv'.opt\n$!\n$ write uit \"CASE_SENSITIVE=YES\"\n$ write uit \"SYMBOL_VECTOR= ( -\"\n$!\n$ mode = 0\n$ uitregel = \"\"\n$!\n$ReadLoop:\n$!\n$ read/end=ReadAsis in regel\n$ReadAsis:\n$ read/end=EndReadLoop inasis asisregel\n$!\n$ regel     = f$edit( regel, \"trim,compress\" )\n$ asisregel = f$edit( asisregel, \"trim,compress\" )\n$!\n$ if f$element(0,\" \",regel) .eqs. \"Module\" .or. -\n     f$extract(0,1,regel)   .eqs. \"_\" .or. -\n     f$element(1,\" \",regel) .nes. \" \" .or. -\n     regel .eqs. \"\"\n$ then\n$   goto ReadLoop\n$ endif\n$!\n$ if uitregel .nes. \"\" .and. mode .eq. 1\n$ then\n$   write uit \"''uitregel'=PROCEDURE, -\" \n$   write uit \"''uitasis'/''uitregel'=PROCEDURE, -\" \n$!\n$   uitregel = \"\"\n$   uitasis  = \"\"\n$ endif \n$!\n$ uitregel = regel\n$ if f$type( low$'uitregel' ) .nes. \"\"\n$ then\n$   uitasis = low$'uitregel'\n$   delete/symbol/global low$'uitregel'\n$ else\n$   uitasis  = asisregel\n$ endif\n$!\n$ mode = 1\n$!\n$ goto ReadLoop\n$EndreadLoop:\n$! \n$! To get the closing brace after the last procedure\n$! keyword.\n$!\n$ if uitregel .nes. \"\"\n$ then \n$   write uit \"''uitregel'=PROCEDURE, -\" \n$   write uit \"''uitasis'/''uitregel'=PROCEDURE)\" \n$ endif\n$!\n$ write uit \"CASE_SENSITIVE=NO\"\n$!\n$ close in\n$ close inasis\n$ close uit\n$!\n$ delete lib*.'thisid';*\n$!\n$exit\n$endsubroutine\n$!\n$!---------------------------------------------------------------------\n$!\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/vms/man2help.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <errno.h>\n\n#include <starlet.h>\n#include <lib$routines.h>\n#include <ssdef.h>\n#include <descrip.h>\n#include <rms.h>\n\ntypedef struct manl{\n    struct manl *next;\n    char *filename;\n}man, *manPtr;\n \ntypedef struct pf_fabnam{\n    struct FAB dfab;\n    struct RAB drab;\n    struct namldef dnam;\n    char   expanded_filename[NAM$C_MAXRSS + 1]; \n} pfn, *pfnPtr;\n\n/*----------------------------------------------------------*/\n\nfpcopy( char *output, char *input, int len )\n{\nchar    *is, *os;\nint i;\n\nif ( len ){\n    for ( is = input, os = output, i = 0; i < len ; ++i, ++is, ++os){\n            *os = *is;\n    }\n    *os = 0;\n}else{\n    output[0] = 0;\n}\n}           \n\n\n/*----------------------------------------------------------*/\n/* give part of ilename in partname. See code for proper\n   value of i ( 0 = node, 1 = dev, 2 = dir,3 = name etc.\n*/ \n\nint fnamepart( char *inputfile, char *part, int whatpart )\n{\npfnPtr pf;\nint     status;\nchar    ipart[6][256], *i, *p;\n\npf = calloc( 1, sizeof( pfn ) );\n\npf->dfab = cc$rms_fab;\npf->drab = cc$rms_rab;\npf->dnam = cc$rms_naml;\n\npf->dfab.fab$l_naml = &pf->dnam;\n\npf->dfab.fab$l_fna = (char *) -1; \npf->dfab.fab$l_dna = (char *) -1; \npf->dfab.fab$b_fns = 0;\npf->dfab.fab$w_ifi = 0;\n\npf->dnam.naml$l_long_defname = NULL; //inputfile;\npf->dnam.naml$l_long_defname_size = 0;//strlen( inputfile );\n\npf->dnam.naml$l_long_filename = inputfile;\npf->dnam.naml$l_long_filename_size = strlen( inputfile);\n\npf->dnam.naml$l_long_expand = pf->expanded_filename;\npf->dnam.naml$l_long_expand_alloc = NAM$C_MAXRSS ;\n\npf->dnam.naml$b_nop |= NAML$M_SYNCHK | NAML$M_PWD;\n\nstatus = sys$parse( &pf->dfab, 0,0);\nif ( !(status&1) ){\n    free( pf );\n    return( status );\n}\n\nfpcopy ( ipart[0], pf->dnam.naml$l_long_node , pf->dnam.naml$l_long_node_size);\nfpcopy ( ipart[1], pf->dnam.naml$l_long_dev , pf->dnam.naml$l_long_dev_size);\nfpcopy ( ipart[2], pf->dnam.naml$l_long_dir , pf->dnam.naml$l_long_dir_size);\nfpcopy ( ipart[3], pf->dnam.naml$l_long_name , pf->dnam.naml$l_long_name_size);\nfpcopy ( ipart[4], pf->dnam.naml$l_long_type , pf->dnam.naml$l_long_type_size);                                               \nfpcopy ( ipart[5], pf->dnam.naml$l_long_ver , pf->dnam.naml$l_long_ver_size);\n\nfor( i = ipart[ whatpart ], p = part; *i; ++i, ++p){\n   if ( p == part ){\n      *p = toupper( *i );\n   }else{\n      *p = tolower( *i );\n   }        \n}\n*p = 0;\n\nfree( pf );\nreturn(1);\n}\n/*----------------------------------------------------------*/\n\nint find_file(char *filename,char *gevonden,int *findex)\n{\nint     status;\nstruct  dsc$descriptor gevondend;\nstruct  dsc$descriptor filespec;\nchar    gevonden_file[NAM$C_MAXRSS + 1];\n\nfilespec.dsc$w_length = strlen(filename);\nfilespec.dsc$b_dtype  = DSC$K_DTYPE_T;\nfilespec.dsc$b_class  = DSC$K_CLASS_S; \nfilespec.dsc$a_pointer = filename;\n\ngevondend.dsc$w_length = NAM$C_MAXRSS;\ngevondend.dsc$b_dtype  = DSC$K_DTYPE_T;\ngevondend.dsc$b_class  = DSC$K_CLASS_S; \ngevondend.dsc$a_pointer = gevonden_file;\n\nstatus=lib$find_file(&filespec,&gevondend,findex,0,0,0,0);\n    \nif ( (status & 1) == 1 ){\n       strcpy(gevonden,strtok(gevonden_file,\" \"));\n}else{\n       gevonden[0] = 0;\n}\n\nreturn(status);\n}\n\n\n/*--------------------------------------------*/\n\nmanPtr addman( manPtr *manroot,char *filename )\n{\nmanPtr m,f;\n\nm = calloc( 1, sizeof( man) );\nif ( !m ) return( NULL );\n\nm->filename = strdup( filename );\n\nif ( *manroot == NULL ){\n   *manroot = m;    \n}else{\n   for( f = *manroot; f->next ; f = f->next );\n   f->next = m;\n}\nreturn(m);\n}\n\n/*--------------------------------------------*/\nvoid freeman( manPtr *manroot )\n{\nmanPtr m,n;\n\nfor( m = *manroot; m ; m = n ){\n     free( m->filename );\n     n = m->next;\n     free ( m );\n}\n*manroot = NULL;\n}\n\n/*--------------------------------------------*/\n\nint listofmans( char *filespec, manPtr *manroot )\n{\nmanPtr  r;\nint     status;\nint     ffindex=0;\nchar    gevonden[NAM$C_MAXRSS + 1];\n\nwhile(1){\n    status = find_file( filespec, gevonden, &ffindex );\n\n    if ( (status&1) ){\n        r = addman( manroot, gevonden );\n        if ( r == NULL ) return(2);\n    }else{\n        if ( !( status&1)) break;\n    }\n}\n\nlib$find_file_end( &ffindex);\nif ( status == RMS$_NMF) status = 1;\n\n\nreturn( status );\n}\n\n/*--------------------------------------------*/\n\nint convertman ( char *filespec, FILE *hlp , int base_level, int add_parentheses )\n{\nFILE    *man;\nchar    *in, *uit;\nchar    *m,*h;\nsize_t  len, thislen, maxlen= 50000;\nint     bol,mode, return_status=1;\nchar subjectname[ NAM$C_MAXRSS + 1 ];\n\nin  = calloc( 1, maxlen + 1 );\nuit = calloc( 1, maxlen + 1 );\n\nif ( in == NULL || uit == NULL ) return(2);\n\nman = fopen( filespec, \"r\");\nif ( man == NULL ) return(vaxc$errno);\n\nfor( len = 0; !feof( man ) && len < maxlen ; len += thislen ){\n    thislen = fread( in + len, 1, maxlen - len, man );\n}\n\nfclose (man);\n\nm = in;\nh = uit;\n\n*(m + len ) = 0;\n\nfor ( mode = 0, bol = 1 ; *m; ++m ){\n\n    switch ( mode ){\n        case 0:\n          switch(*m){\n            case '.':\n                if ( bol ){\n                    mode = 1;\n                }else{\n                    *h = *m;\n                    ++h;\n                }\n                break;\n            case '\\\\':\n                if ( bol ){\n                   *h = ' ';++h;\n                   *h = ' ';++h;\n                }\n                mode = 2;\n                break;\n            default:\n                if ( bol ){\n                   *h = ' ';++h;\n                   *h = ' ';++h;\n                }\n                *h = *m;\n                ++h;\n                break;\n          }\n          break;\n        case 1: /* after . at bol */\n\n          switch(*m){\n            case '\\\\':\n                while( *m != '\\n' && *m != '\\r' && *m )++m;\n                mode = 0;\n                break;\n            case 'B':\n                   ++m; \n                   *h = ' ';++h;\n                   mode = 0;\n                   break;   \n            case 'I':\n                    /* remove preceding eol */\n                    if ( *(m+1) != 'P' ){\n                        --h;\n                        while ( (*h == '\\n' || *h == '\\r') && h > uit )--h;\n                        ++h;\n                    }\n\n                    /* skip .Ix */\n                    for(;*m != ' ' && *m != '\\n' && *m != '\\r'; ++m); \n\n                    /* copy line up to EOL */\n\n                    for(;*m != '\\n' && *m != '\\r' && *m; ++m, ++h)*h = *m;\n\n                    /* if line ends in ., this is an EOL */\n\n                    if ( *(h-1) == '.'){\n                         --h; \n                         --m;\n                    }else{\n                        /* if line does not end in ., skip EOL in source */\n\n                        if ( *(m+1) == '\\n' || *(m+1) == '\\r')++m;\n                    }\n                    mode = 0;\n                    break;\n            case 'S':\n                 if ( *(m+1) == 'H' ){\n                    *h = '\\n';++h;\n                    if ( strncmp( m+3 ,\"NAME\",4) == 0 || \n                         strncmp( m+3 ,\"SYNOPSIS\",8) == 0 ||\n                         strncmp( m+3 ,\"DESCRIPTION\",11) == 0 ){\n                        while( *m != '\\n' && *m != '\\r')++m;\n                        mode = 0;\n                    }else{\n                        ++m;\n\n                        /* write help level, and flag it */\n\n                        *h = '0' + base_level + 1;++h;\n                        return_status |= 2;\n\n                        *h = ' ';++h; \n\n                        /* skip H (or whatever after S) and blank */\n                        ++m;++m;\n\n                        for(;*m != '\\n' && *m != '\\r' && *m; ++m, ++h){\n\n                           /* write help label in lowercase, skip quotes */\n                           /* fill blanks with underscores */\n\n                           if ( *m != '\\\"' ){\n                                *h = tolower( *m );\n                                if (*h == ' ') *h = '_';    \n                           }else{\n                                --h;\n                           }    \n                        } \n\n                        /* Add a linefeed or two */\n\n                        *h = *m;++h;\n                        *h = *m;++h;\n\n                        mode = 0;\n                    }   \n                 }\n                 break;\n            case 'T':\n                 if ( *(m+1) == 'H' ){\n                    *h = '0' + base_level; ++h;\n                    return_status |= 2;\n                    *h = ' ';++h;\n                    for ( m = m + 3; *m != ' ' && *m ; ++m, ++h ){\n                          *h = *m;\n                    }\n\t\t\t\t\tif ( add_parentheses ){\n\t\t\t\t\t\t *h = '(';++h;\n\t\t\t\t\t\t *h = ')';++h;\n\t\t\t\t\t}\n                    while( *m != '\\n' && *m != '\\r' && *m )++m;\n                    mode = 0;\n                 }\n                 break;\n            default:\n                ++m;\n                mode = 0;\n                break;\n           }\n           break;\n        case 2: /* after \\ skip two characters or print the backslash */            \n          switch(*m){\n            case '\\\\':\n                *h = *m;\n                ++h;\n                mode = 0;\n                break;\n            default:\n                ++m;\n                mode = 0;\n                break;\n           }\n           break;   \n    } /*end switch mode */\n\n    bol = 0;\n    if ( *m == '\\n' || *m == '\\r') bol = 1;\n\n}/* end for mode */\n\n*h = 0;\n\n\nif ( (return_status&2) ){\n    fprintf( hlp, \"%s\\n\\n\", uit);\n}else{\n    fnamepart( filespec, subjectname,3);\n    if ( *subjectname ){\n        fprintf( hlp, \"%d %s\\n\\n%s\\n\\n\", base_level, subjectname, uit);\n    }else{\n        /* No filename (as is the case with a logical), use first word as subject name */\n        char *n,*s;\n\n        for(n = in; isspace( *n );++n);\n        for(s = subjectname; !(isspace( *n )); ++n,++s)*s = *n;\n        *s = 0;\n\n        fprintf( hlp, \"%d %s\\n\\n%s\\n\\n\", base_level, subjectname, uit);\n    }\n}\n\n/*\n printf( \"read %d from %s, written %d to helpfile, return_status = %d\\n\",\n    len, filespec, strlen(uit), return_status );\n*/\n\nfree( m ); \nfree( h ); \n\nreturn ( 1);\n}\n\n/*--------------------------------------------*/\n\nint convertmans( char *filespec, char *hlpfilename, int base_level, int append, int add_parentheses )\n{\nint status=1;\nmanPtr  manroot=NULL, m;\nFILE    *hlp;\n\nif ( append ){\n    hlp = fopen( hlpfilename,\"a+\");\n}else{\n    hlp = fopen( hlpfilename,\"w\");\n}\n\nif ( hlp == NULL ) return( vaxc$errno );\n\nstatus = listofmans( filespec, &manroot );\nif ( !(status&1) ) return( status );\n\nfor ( m = manroot ; m ; m = m->next ){\n    status = convertman( m->filename, hlp , base_level, add_parentheses );\n    if ( !(status&1) ){\n        fprintf(stderr,\"Convertman of %s went wrong\\n\", m->filename);\n        break;\n    }\n}\nfreeman( &manroot );\nreturn( status );\n}\n\n/*--------------------------------------------*/\nvoid print_help()\n{\n   fprintf( stderr, \"Usage: [-a] [-b x] convertman <manfilespec> <helptextfile>\\n\" );\n   fprintf( stderr, \"       -a append <manfilespec> to <helptextfile>\\n\" );\n   fprintf( stderr, \"       -b <baselevel> if no headers found create one with level <baselevel>\\n\" );\n   fprintf( stderr, \"          and the filename as title.\\n\" );\n   fprintf( stderr, \"       -p add parentheses() to baselevel help items.\\n\" );\n\n}\n/*--------------------------------------------*/\n\nmain ( int argc, char **argv )\n{\nint     status;\nint     i,j;\nint     append, base_level, basechange, add_parentheses;\nchar    *manfile=NULL;\nchar    *helpfile=NULL;\n\nif ( argc < 3 ){\n   print_help();\n   return( 1 ) ;\n}\n\nappend     = 0;\nbase_level = 1;\nbasechange = 0;\nadd_parentheses = 0;\n\nfor ( i = 1; i < argc; ++i){\n    if ( argv[i][0] == '-' ){\n        for( j = 1; argv[i][j] ; ++j ){\n            switch( argv[i][j] ){\n                case 'a':\n                    append = 1;\n                    break;\n                case 'b':   \n                    if ( (i+1) < argc ){\n                        base_level = atoi( argv[ i + 1 ] );\n                        basechange = 1;\n                    }\n                    break;\n                case 'p':\n                    add_parentheses = 1;\n                    break;\n            }\n        }\n        if ( basechange){\n            basechange = 0;\n            i = i + 1;\n        }\n    }else{\n        if ( manfile == NULL ){\n            manfile = strdup( argv[i]);\n        } else if ( helpfile == NULL ){\n            helpfile = strdup( argv[i]);\n        } else {\n            fprintf( stderr, \"Unrecognized parameter : %s\\n\", argv[i]);\n        }\n    }\n}\n\n\n/* fprintf( stderr,\"manfile: %s, helpfile: %s, append: %d, base_level : %d\\n\",\n        manfile, helpfile, append, base_level);\n*/\n\nstatus = convertmans( manfile, helpfile, base_level, append, add_parentheses );\n\nfree( manfile );\nfree( helpfile );\n\nreturn( status );\n}\n\n \n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/vms/readme.vms",
    "content": "*These are the porting notes to OpenVMS, as of 7 April 2010\nby Jose Baars. This file will be installed as \nlibssh2*.release_notes by the product install kit.\n\n\nLIBSSH2 \n-------\n\nLIBSSH2 is a client-side library written in C that aims to \nimplement the SSH2 protocol. It is an open source project, \nto be found at https://libssh2.org.\n\nGNV\n---\n\nThe library uses the GNV prefix, on advise of the kind supporter\nof the GNV project, John Malmberg.\n\nInstalling the PCSI kit\n=======================\n\nPrerequisites \n-------------\n- VMS version 8.3 minimal. \n  See the remarks at prerequisites for building the kit\n- TCP/IP stack, both TCP/IP services and Multinet should work. \n  See the remarks at prerequisites for building the kit\n- HP OPENSSL V1.3 minimal. \n  See the remarks at prerequisites for building the kit\n- JEM  ZLIB V1.2-3E1 minimal. \n  See the remarks at prerequisites for building the kit\n  \nThe first three dependencies are tested at installation time, and \ninstallation will fail if any these products are not installed.\nThe ZLIB dependency is not tested by the product installation\nprocedure, as libssh2 will probably be installed as part of \nmultiple libraries including zlib.\n\nInstall\n-------\n\n\nThe kit will install gnv$libssh2.exe in a directory tree that might \nalready be available on your system if you have installed other gnv* \nlibraries or utilities. \n\nThe directory tree for gnv$libssh2.exe will be like this:\n\n[gnv] -- [usr] -- [include] -- [libssh2] include files for libssh2\n                  [lib] gnv$libssh2_x_y_z.exe\n                  [share]   -- [doc] -- [libssh2] libssh2.hlb, \n                                        release notes (this file), \n                                        libssh2 release notes   \n\noptional:\n                                        [example] libssh2_examples-x_y_z.bck \n                  [common_src] libssh2-x_y_z_src.bck\n\nBy default, it will install the shared image and include files to \nSYS$COMMON:[GNV...].\n\nYou can override this destination by specifying the destination\ndirectory after /DESTINATION= on the product install command line.\nThis is particularly of use when installing the library on a cluster\nwithout a common system disk.\n\nPlease ignore the following warnings, as the kit is not signed :\n\n%PCSI-I-CANNOTVAL, cannot validate dev:[dir]JCB-AXPVMS-LIBSSH2-V0102-05D20100402-1.PCSI\n-PCSI-I-NOTSIGNED, product kit is not signed and therefore has no manifest file\n\nOptionally, you can install a backup saveset with some programming examples,\nor a backupo saveset with the complete libssh2 source tree.\n \nyou will need to answer 'NO' to the question \n'Do you want the default for all options'. \n\nand 'YES' to either or both the following questions:\n\n    Do you want the libssh2 C programming examples ?  [NO]\n\n    Do you want the complete libssh2 source tree ?  [NO]\n\n\nPost installation tasks\n-----------------------\n\nAlthough we will try to maintain upward compatibility of libssh2,\nthis can not be guaranteed by the libssh2 project itself for OpenVMS,\nnor eternally by us.\n\nTo use libssh2 effectively, you will have to define a system logical\nto point to the shared image. If you are willing to take the gamble,\ndefine this logical in your systartup like so:\n\n$ define/system/executive gnv$libssh2 dev:[dir..]gnv$libssh2_x_y_z.exe\n\nOptionally, you can install the executbale like so:\n\n$ mc sysgen install dev:[dir..]gnv$libssh2_x_y_z.exe/open/share/header\n\nLink your programs against gnv$libssh2, and when upgrading libssh2 \ntest thoroughly.\n\nIf you want to be extra cautious define a system logical like this:\n\n$ define/system/executive gnv$libssh2_x_y_z dev:[dir..]gnv$libssh2_x_y_z.exe\n\nLink  programs against gnv$libssh2_x_y_z, and when upgrading libssh2 \nlink against new versions. \n\nIt is probably more convenient in the last case to link against the object \nlibrary provided in the source backup saveset. Both an uppercase and a\nmixed case object library, called libssh2.olb and libssh2_asis.olb \nare provided.\n\n\nCompiling and linking against libssh2\n-------------------------------------\n\nThe  shared image library has a vector table with both uppercase and \nmixed case entry points, allowing to link directly against the shared \nimage wether you need the /NAMES=AS_IS or not.\n\nTo link successfully, you MUST use /NAMES=shortened, as some function\nnames in libssh2 are longer than the VMS maximum of 32 characters.\n\nIf you chose to install the examples, you can unpack the backup\nsaveset by \n\nbackup/sel=*.c device:[gnv.usr.share.doc.libssh2.examples]libssh2_examples-x_y_z.bck -\n []\n\nThey can by compiled and linked by these commands ( provided you have defined\nthe gnv$libssh2 logical) :\n\n$ cc/include=dev:[gnv.usr.include.libssh2] xxx.c/names=shortened\n$ link/opt=sys$input: xxx.obj\ngnv$libssh2/share\n\n\n\n\nBuilding gnv$libssh2\n====================\n\nYou can build gnv$libssh2 yourself, which may have advantages, as the library is\nin full development, very regularly new features are added.\n\nFor production use, it is probably advisable to use a stable version, and \nlink against that. To check out new features, statically linking against\nthe object library is probably more practical, to avoid compatibility\nissues.\n\n\nPrerequisites\n-------------\n\nYou will need to have the following available:\n\n- An Alpha or Itanium VMS system. Due to dependencies on zlib, ssl and ODS-5,\n  support on VAXen would be cumbersome at least.\n\n- VMS version 8.3 minimal. This is a requirement of gnv$zlibshr.exe against \n  which shared image library libssh2 is linked. If you use another zlib\n  to link against, you can make it work under lower versions of VMS.\n  I have made it work on VMS 7.3-2 with not a lot of difficulty.\n  Also, if you are not interested in compression, you can choose not\n  to link against zlib at all; in that case comment out the \n  #define  LIBSSH2_HAVE_ZLIB in libssh2_config.h.\n\n- TCP/IP services or Multinet for OpenVMS.\n  TCPWare has not been tested.\n\n- The HP OpenSSL product. Of course, with tweaking, you can probably link \n  it against the OpenSSL library, but that is not what I have used.\n \n- A C compiler. I don't know any other working C compilers than \n  the DEC/Compac/HP-C compiler on VMS.\n\n- An ODS-5 disk. With tweaking you'll get it to work on an ODS-2\n  disk, but it is unpractical to do so.\n\n- A version of VMSTAR that understands ODS-5 disks and extended\n  filenames. Look here:\n  http://ftp.process.com/ftp/vms-freeware/fileserv/vmstar.zip\n\n- gunzip, available for instance at Steven M Schweda's website:\n  http://antinode.info/ftp/gzip/gzip-1_3_12b_vms/gzip-1_3_12b_vms.zip\n\nOptional:\n\n- curl, to be found at  https://curl.haxx.se\n  You might want to use curl to download the libssh2 kit directly\n  to you VMS machine. Interestingly, sftp in curl is implemented using\n  libssh2, soon to be expected on VMS as well, hopefully.\n\nDownloading libssh2\n-------------------\n\nAt the website of libssh2, you can find stable and daily gzipped\ntarballs. if you have a computer connected to internet you can \ndownload a daily build yourself by a procedure that looks a lot like\nthis ( fill out your own proxy user/password, set up right symbols to\ngunzip, vmstar and curl and set up the libssh2 build version):\n\n$ libssh2_version = \"1.2.6\"\n$!\n$ proxy_line = \" \"\"-U\"\" \"\"''proxy_userpass'\"\"  \"\"-x\"\" \"\"''proxy_hostport'\"\" \"\n$!\n$ currentday = f$cvtime(,,\"date\") - \"-\" - \"-\"\n$!\n$ set def mydev:[mydir.libssh2]\n$!\n$ if f$search(\"libssh2-''libssh2_version'-''currentday'.tar.gz\") .nes. \"\" \n$ then \n$   delete libssh2-'libssh2_version'-'currentday'.tar.gz;*\n$ endif\n$!\n$ curl 'proxy_line' \"https://libssh2.org/snapshots/libssh2-''libssh2_version'-''currentday'.tar.gz\" -\n                    -o libssh2-'libssh2_version'-'currentday'.tar.gz\n$!\n$!\n$ if f$search(\"libssh2-''libssh2_version'-''currentday'.tar.;\") .nes. \"\" \n$ then \n$   delete libssh2-'libssh2_version'-'currentday'.tar.;*\n$ endif\n$!\n$ gunzip libssh2-'libssh2_version'-'currentday'.tar.gz\n$!\n$ tarfile = f$search(\"libssh2-''libssh2_version'-''currentday'.tar.;\")\n$ vmstar xf 'tarfile' \n\nDownloading a stable build will need you to get rid of the currentday.\n\nAfter the download, you should have a directory tree with a toplevel\ndirectory called [libssh2-x.y.z-yyyymmdd].\nOne of the subdirectories is called vms.\n\nGetting the libssh2 sources from the source backup in the binary kit\n--------------------------------------------------------------------\n\nDuring installation of the binary kit, you are given the option\nof installing the sources. If chosen, a backup saveset with \nthe complete libssh2 directory is made available in \n[gnv.common_src].\n\nBy restoring this backup saveset, you end up with the same\nset of files as by the direct download from libssh2.org.\n\n\nBuilding the library\n--------------------\n\nTo avoid all kinds of misunderstandings caused by firewalls thinking that\na .com file must be an MS-DOS executable, all command procedures are called\n.dcl.\n\nGo to the vms subdirectory in the download tree, and issue the following\ncommand:\n\n@libssh2_make_lib.dcl\n\nThis should produce libssh2_x_y_z.exe in this same vms directory.\n \n\n\nBuilding the examples\n---------------------\n\nA number of examples are also part of the full libssh2 delivery.\nYou can compile and link them either against the object library\nproduced when building the shared image, or against the shared image\nproduced in the step before.\n\nYou can compile only one of the examples by giving only the\nname part of the filename of the example as p1 to the \nbuild procedure:\n\n@libssh2_make_example.dcl \n\nor for instance\n\n@libssh2_make_example.dcl sftp \n\nBy default, libssh2_make_example.dcl links to the object libraries \nproduced by the libssh2_make_lib.dcl procedure. If you want to link\nagainst the shared image library made in the same procedure, invoke\nthe procedure like so:\n\n@libssh2_make_example.dcl sftp \"SHARED\"\n\nThe procdure defines a process logical gnv$libssh2 pointing to the shared\nimage library in the directory, which obviously will not survive a logout. \n\n\nBuilding the help library\n-------------------------\n\nThe man pages can be converted to a VMS help library by issuing\nthis command :\n\n@libssh2_make_help.dcl\n\nIt uses a simple but fairly effective c program man2help.c\nto achieve this.\n\nBuilding a PCSI kit\n-------------------\n\nWhen you have built the shared library and the help library,\nyou can build a PCSI kit by issueing this command:\n\n@libssh2_make_kit.dcl\n\n\n\n\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/win32/.gitignore",
    "content": "*.lib\n*.pdb\n*.dll\n*.exe\n*.obj\n.*.swp\nDebug\nRelease\n*.exp\n*.ncb\n*.opt\n*.plg\nlibssh2.dsp\nobjects.mk\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/win32/GNUmakefile",
    "content": "#########################################################################\n#\n## Makefile for building libssh2 (Win32 version - gnu make)\n## Use: make -f GNUmakefile [help|all|clean|dev|devclean|dist|distclean|dll|objclean]\n##\n## Hacked by: Guenter Knauf\n#\n#########################################################################\n\n# Edit the path below to point to the base of your Zlib sources.\nifndef ZLIB_PATH\nZLIB_PATH = ../../zlib-1.2.8\nendif\n\n# Edit the path below to point to the base of your OpenSSL package.\nifndef OPENSSL_PATH\nOPENSSL_PATH = ../../openssl-1.0.2d\nendif\n\n# Edit the path below to point to your Distribution folder.\nifndef DISTDIR\nDISTDIR\t= libssh2-$(LIBSSH2_VERSION_STR)-bin-$(ARCH)\nendif\nDISTARC\t= $(DISTDIR).zip\n\n# Edit the path below to point to your Development folder.\nifndef DEVLDIR\nDEVLDIR\t= libssh2-$(LIBSSH2_VERSION_STR)-dev-$(ARCH)\nendif\nDEVLARC\t= $(DEVLDIR).zip\n\n# Project root\nPROOT\t= ..\n\n# Edit the vars below to change target settings.\nTARGET\t= libssh2\nWWWURL\t= https://www.libssh2.org/\nDESCR\t= libssh2 $(LIBSSH2_VERSION_STR)\n#STACK\t= 64000\n\n# must be equal to DEBUG or NDEBUG\nifndef DB\n\tDB\t= NDEBUG\n\t# DB\t= DEBUG\nendif\n# Optimization: -O<n> or debugging: -g\nifeq ($(DB),NDEBUG)\n\tOPT\t= -O2\n\tOBJDIR\t= release\nelse\n\tOPT\t= -g\n\tOPT\t+= -DLIBSSH2DEBUG\n\tOBJDIR\t= debug\nendif\n\n# Here you can find a native Win32 binary of the original awk:\n# http://www.gknw.net/development/prgtools/awk-20100523.zip\nAWK\t= awk\nZIP\t= zip -qzr9\n\n# Platform-dependent helper tool macros\nifeq ($(findstring /sh,$(SHELL)),/sh)\nDEL\t= rm -f $1\nRMDIR\t= rm -fr $1\nMKDIR\t= mkdir -p $1\nCOPY\t= -cp -afv $1 $2\n#COPYR\t= -cp -afr $1/* $2\nCOPYR\t= -rsync -aC $1/* $2\nTOUCH\t= touch $1\nCAT\t= cat\nECHONL\t= echo \"\"\nDL\t= '\nelse\nifeq \"$(OS)\" \"Windows_NT\"\nDEL\t= -del 2>NUL /q /f $(subst /,\\,$1)\nRMDIR\t= -rd 2>NUL /q /s $(subst /,\\,$1)\nelse\nDEL\t= -del 2>NUL $(subst /,\\,$1)\nRMDIR\t= -deltree 2>NUL /y $(subst /,\\,$1)\nendif\nMKDIR\t= -md 2>NUL $(subst /,\\,$1)\nCOPY\t= -copy 2>NUL /y $(subst /,\\,$1) $(subst /,\\,$2)\nCOPYR\t= -xcopy 2>NUL /q /y /e $(subst /,\\,$1) $(subst /,\\,$2)\nTOUCH\t= copy 2>&1>NUL /b $(subst /,\\,$1) +,,\nCAT\t= type\nECHONL\t= $(ComSpec) /c echo.\nendif\n\n# The following line defines your compiler.\nifdef METROWERKS\n\tCC = mwcc\nelse\n\tCC = $(CROSSPREFIX)gcc\nendif\n\n# Set environment var ARCH to your architecture to override autodetection.\nifndef ARCH\nifeq ($(findstring gcc,$(CC)),gcc)\nifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64)\nARCH\t= w64\nelse\nARCH\t= w32\nendif\nelse\nARCH\t= w32\nendif\nendif\n\n# Include the version info retrieved from libssh2.h\n-include $(OBJDIR)/version.inc\n\n# Global flags for all compilers\nCFLAGS\t= $(LIBSSH2_CFLAG_EXTRAS) $(OPT) -D$(DB) -DLIBSSH2_WIN32 # -DHAVE_CONFIG_H\nLDFLAGS = $(LIBSSH2_LDFLAG_EXTRAS)\n\nifeq ($(CC),mwcc)\nLD\t= mwld\nRC\t= mwwinrc\nLDFLAGS\t+= -nostdlib\nAR\t= $(LD)\nARFLAGS\t= -nostdlib -library -o\nLIBEXT\t= lib\n#RANLIB\t=\nLIBPATH\t+= -lr \"$(METROWERKS)/MSL\" -lr \"$(METROWERKS)/Win32-x86 Support\"\nLDLIBS\t+= -lMSL_Runtime_x86.lib -lMSL_C_x86.lib -lMSL_Extras_x86.lib\nRCFLAGS\t=\nCFLAGS\t+= -nostdinc -gccinc -msgstyle gcc -inline off -opt nointrinsics -proc 586\nCFLAGS\t+= -ir \"$(METROWERKS)/MSL\" -ir \"$(METROWERKS)/Win32-x86 Support\"\nCFLAGS\t+= -w on,nounused,nounusedexpr # -ansi strict\nelse\nLD\t= $(CROSSPREFIX)gcc\nRC\t= $(CROSSPREFIX)windres\nLDFLAGS\t+= -s -shared -Wl,--output-def,$(TARGET).def,--out-implib,$(TARGET)dll.a\nAR\t= $(CROSSPREFIX)ar\nARFLAGS\t= -cq\nLIBEXT\t= a\nRANLIB\t= $(CROSSPREFIX)ranlib\nRCFLAGS\t= -I $(PROOT)/include -O coff\nCFLAGS\t+= -fno-builtin\nCFLAGS\t+= -fno-strict-aliasing\nCFLAGS\t+= -Wall # -pedantic\nifeq ($(ARCH),w64)\nCFLAGS\t+= -m64 -D_AMD64_\nLDFLAGS += -m64\nRCFLAGS\t+= -F pe-x86-64\nelse\nCFLAGS\t+= -m32\nLDFLAGS += -m32\nRCFLAGS\t+= -F pe-i386\nendif\nendif\n\nINCLUDES = -I$(PROOT)/win32 -I$(PROOT)/include\n\nifdef WITH_WINCNG\nCFLAGS\t+= -DLIBSSH2_WINCNG\nLDLIBS\t+= -lbcrypt -lcrypt32\nelse\nCFLAGS\t+= -DLIBSSH2_OPENSSL\nifndef OPENSSL_INCLUDE\n\tifeq \"$(wildcard $(OPENSSL_PATH)/outinc)\" \"$(OPENSSL_PATH)/outinc\"\n\t\tOPENSSL_INCLUDE = $(OPENSSL_PATH)/outinc\n\tendif\n\tifeq \"$(wildcard $(OPENSSL_PATH)/include)\" \"$(OPENSSL_PATH)/include\"\n\t\tOPENSSL_INCLUDE = $(OPENSSL_PATH)/include\n\tendif\nendif\nifneq \"$(wildcard $(OPENSSL_INCLUDE)/openssl/opensslv.h)\" \"$(OPENSSL_INCLUDE)/openssl/opensslv.h\"\n$(error Invalid OPENSSL_PATH: $(OPENSSL_PATH))\nendif\nINCLUDES += -I\"$(OPENSSL_INCLUDE)\"\nifndef OPENSSL_LIBPATH\n\tOPENSSL_LIBS_STAT = crypto ssl\n\tifeq \"$(wildcard $(OPENSSL_PATH)/out)\" \"$(OPENSSL_PATH)/out\"\n\t\tOPENSSL_LIBPATH = $(OPENSSL_PATH)/out\n\t\tOPENSSL_LIBS_DYN = eay32 ssl32\n\tendif\n\tifeq \"$(wildcard $(OPENSSL_PATH)/lib)\" \"$(OPENSSL_PATH)/lib\"\n\t\tOPENSSL_LIBPATH = $(OPENSSL_PATH)/lib\n\t\tOPENSSL_LIBS_DYN = crypto.dll ssl.dll\n\tendif\nendif\nifdef LINK_OPENSSL_STATIC\n\tLDLIBS += $(patsubst %,$(OPENSSL_LIBPATH)/lib%.$(LIBEXT), $(OPENSSL_LIBS_STAT)) -lgdi32\nelse\n\tLDLIBS += $(patsubst %,$(OPENSSL_LIBPATH)/lib%.$(LIBEXT), $(OPENSSL_LIBS_DYN))\nendif\nendif\nifeq ($(CC),mwcc)\nLDLIBS\t+= -lkernel32.lib -luser32.lib -lwsock32.lib\nelse\n#LDLIBS\t+= -lwsock32\nLDLIBS\t+= -lws2_32\nendif\n\nifdef WITH_ZLIB\n\tCFLAGS += -DLIBSSH2_HAVE_ZLIB\n\tINCLUDES += -I$(ZLIB_PATH)\n\tifdef LINK_ZLIB_STATIC\n\t\tLDLIBS += $(ZLIB_PATH)/libz.$(LIBEXT)\n\telse\n\t\tLDLIBS += $(ZLIB_PATH)/libz.dll.$(LIBEXT)\n\tendif\nendif\n\nCFLAGS\t+= $(INCLUDES)\n\nvpath %.c $(PROOT)/src\n\nifdef WITH_WINCNG\ninclude $(PROOT)/Makefile.WinCNG.inc\nelse\ninclude $(PROOT)/Makefile.OpenSSL.inc\nendif\n\n# include Makefile.inc to get CSOURCES define\ninclude $(PROOT)/Makefile.inc\n\nOBJECTS\t:= $(patsubst %.c,%.o,$(CSOURCES))\nOBJS\t:= $(addprefix $(OBJDIR)/,$(OBJECTS))\nOBJL\t= $(OBJS) $(OBJDIR)/$(TARGET).res\n\n\nall: lib dll\n\ndll: prebuild $(TARGET).dll\n\nlib: prebuild $(TARGET).$(LIBEXT)\n\nprebuild: $(OBJDIR) $(OBJDIR)/version.inc\n# libssh2_config.h\n\ntest: all\n\t$(MAKE) -C test -f GNUmakefile\n\n$(OBJDIR)/%.o: %.c\n#\t@echo Compiling $<\n\t$(CC) $(CFLAGS) -c $< -o $@\n\n$(OBJDIR)/version.inc: $(PROOT)/get_ver.awk $(PROOT)/include/libssh2.h $(OBJDIR)\n\t@echo Creating $@\n\t@$(AWK) -f $^ > $@\n\ndist: all $(DISTDIR) $(DISTDIR)/readme.txt\n\t@$(call MKDIR, $(DISTDIR)/bin)\n\t@$(call COPY, $(PROOT)/AUTHORS, $(DISTDIR))\n\t@$(call COPY, $(PROOT)/COPYING, $(DISTDIR))\n\t@$(call COPY, $(PROOT)/INSTALL, $(DISTDIR))\n\t@$(call COPY, $(PROOT)/README, $(DISTDIR))\n\t@$(call COPY, $(PROOT)/RELEASE-NOTES, $(DISTDIR))\n\t@$(call COPY, $(TARGET).dll, $(DISTDIR)/bin)\n\t@echo Creating $(DISTARC)\n\t@$(ZIP) $(DISTARC) $(DISTDIR)/* < $(DISTDIR)/readme.txt\n\ndev: all $(DEVLDIR) $(DEVLDIR)/readme.txt\n\t@$(call MKDIR, $(DEVLDIR)/bin)\n\t@$(call MKDIR, $(DEVLDIR)/include)\n\t@$(call MKDIR, $(DEVLDIR)/win32)\n\t@$(call COPY, $(PROOT)/AUTHORS, $(DEVLDIR))\n\t@$(call COPY, $(PROOT)/COPYING, $(DEVLDIR))\n\t@$(call COPY, $(PROOT)/INSTALL, $(DEVLDIR))\n\t@$(call COPY, $(PROOT)/README, $(DEVLDIR))\n\t@$(call COPY, $(PROOT)/RELEASE-NOTES, $(DEVLDIR))\n\t@$(call COPY, $(TARGET).dll, $(DEVLDIR)/bin)\n\t@$(call COPY, $(PROOT)/include/*.h, $(DEVLDIR)/include)\n\t@$(call COPY, libssh2_config.h, $(DEVLDIR)/include)\n\t@$(call COPY, *.$(LIBEXT), $(DEVLDIR)/win32)\n\t@echo Creating $(DEVLARC)\n\t@$(ZIP) $(DEVLARC) $(DEVLDIR)/* < $(DEVLDIR)/readme.txt\n\ndistclean vclean: clean\n\t$(call RMDIR, $(DISTDIR))\n\t$(call DEL, $(DISTARC))\n\ndevclean: clean\n\t$(call RMDIR, $(DEVLDIR))\n\t$(call DEL, $(DEVLARC))\n\nobjclean: all\n\t$(call RMDIR, $(OBJDIR))\n\ntestclean: clean\n\t$(MAKE) -C test -f GNUmakefile clean\n\nclean:\n#\t$(call DEL, libssh2_config.h)\n\t$(call DEL, $(TARGET).dll $(TARGET).def $(TARGET).$(LIBEXT) $(TARGET)dll.$(LIBEXT))\n\t$(call RMDIR, $(OBJDIR))\n\n$(OBJDIR):\n\t@$(call MKDIR, $@)\n\n$(DISTDIR):\n\t@$(call MKDIR, $@)\n\n$(DEVLDIR):\n\t@$(call MKDIR, $@)\n\n$(TARGET).$(LIBEXT): $(OBJS)\n\t@echo Creating $@\n\t@$(call DEL, $@)\n\t@$(AR) $(ARFLAGS) $@ $^\nifdef RANLIB\n\t@$(RANLIB) $@\nendif\n\n$(TARGET).dll $(TARGET)dll.a: $(OBJL)\n\t@echo Linking $@\n\t@$(call DEL, $@)\n\t@$(LD) $(LDFLAGS) $^ -o $@ $(LIBPATH) $(LDLIBS)\n\n\n$(OBJDIR)/%.res: %.rc\n\t@echo Creating $@\n\t@$(RC) $(RCFLAGS) -i $< -o $@\n\n\n$(DISTDIR)/readme.txt: GNUmakefile\n\t@echo Creating $@\n\t@echo $(DL)This is a binary distribution for Win32 platform.$(DL) > $@\n\t@echo $(DL)libssh version $(LIBSSH2_VERSION_STR)$(DL) >> $@\n\t@echo $(DL)Please download the complete libssh package for$(DL) >> $@\n\t@echo $(DL)any further documentation:$(DL) >> $@\n\t@echo $(DL)$(WWWURL)$(DL) >> $@\n\n$(DEVLDIR)/readme.txt: GNUmakefile\n\t@echo Creating $@\n\t@echo $(DL)This is a development distribution for Win32 platform.$(DL) > $@\n\t@echo $(DL)libssh version $(LIBSSH2_VERSION_STR)$(DL) >> $@\n\t@echo $(DL)Please download the complete libssh package for$(DL) >> $@\n\t@echo $(DL)any further documentation:$(DL) >> $@\n\t@echo $(DL)$(WWWURL)$(DL) >> $@\n\nhelp: $(OBJDIR)/version.inc\n\t@echo $(DL)===========================================================$(DL)\n\t@echo $(DL)OpenSSL path    = $(OPENSSL_PATH)$(DL)\n\t@echo $(DL)Zlib path       = $(ZLIB_PATH)$(DL)\n\t@echo $(DL)===========================================================$(DL)\n\t@echo $(DL)libssh $(LIBSSH2_VERSION_STR) - available targets are:$(DL)\n\t@echo $(DL)$(MAKE) all$(DL)\n\t@echo $(DL)$(MAKE) dll$(DL)\n\t@echo $(DL)$(MAKE) lib$(DL)\n\t@echo $(DL)$(MAKE) clean$(DL)\n\t@echo $(DL)$(MAKE) dev$(DL)\n\t@echo $(DL)$(MAKE) devclean$(DL)\n\t@echo $(DL)$(MAKE) dist$(DL)\n\t@echo $(DL)$(MAKE) distclean$(DL)\n\t@echo $(DL)$(MAKE) objclean$(DL)\n\t@echo $(DL)$(MAKE) test$(DL)\n\t@echo $(DL)===========================================================$(DL)\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/win32/Makefile.Watcom",
    "content": "#\n#  Watcom / OpenWatcom Win32 makefile for libssh2.\n#\n#  Comments to: Guenter Knauf http://www.gknw.net/phpbb\n#\n\n!ifndef %watcom\n!error WATCOM environment variable not set!\n!else\nSYS_INCL = -I$(%watcom)\\h\\nt -I$(%watcom)\\h\nSYS_LIBS = $(%watcom)\\lib386\\nt;$(%watcom)\\lib386\n!endif\n\n!ifdef %libname\nLIBNAME = $(%libname)\n!else\nLIBNAME = libssh2\n!endif\nTARGETS = $(LIBNAME).dll $(LIBNAME)_imp.lib $(LIBNAME).lib\n\nCC = wcc386\nLD = wlink\nAR = wlib\nRC = wrc\n\n!ifdef __LOADDLL__\n!  loaddll wcc386  wccd386\n!  loaddll wpp386  wppd386\n!  loaddll wlib    wlibd\n!  if $(__VERSION__) > 1270\n!    loaddll wlink   wlinkd\n!  else\n!    loaddll wlink   wlink\n!  endif\n!endif\n\n!if $(__VERSION__) < 1250                                                                                                           \nRM = del /q /f 2>NUL\n!else                                                                                                                               \nRM = rm -f                                                                                                                          \n!endif\nMD = mkdir\nRD = rmdir /q /s 2>NUL\nCP = copy\n\nCFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=nul -w2 -fpi -oilrtfm &\n         -wcd=201 -bt=nt -d+ -dWIN32 -DLIBSSH2_WIN32 &\n         -I. -I..\\include $(SYS_INCL)\n\n!ifdef %debug\nDEBUG  = -dDEBUG=1 -dDEBUGBUILD\nCFLAGS += -d3 $(DEBUG)\n!else\nCFLAGS += -d0\n!endif\n\n!ifdef %use_ipv6\nCFLAGS += -d_WIN32_WINNT=0x0501 -dENABLE_IPV6\n!endif\n\n#\n# Change to suite.\n#\n!ifdef %zlib_root\nZLIB_ROOT = $(%zlib_root)\n!else\nZLIB_ROOT = ..\\..\\zlib-1.2.8\n!endif\n\n!ifdef %openssl_root\nOPENSSL_ROOT = $(%openssl_root)\n!else\nOPENSSL_ROOT = ..\\..\\openssl-0.9.8zc\n!endif\n\n!ifdef %use_zlib\nCFLAGS += -DLIBSSH2_HAVE_ZLIB -I$(ZLIB_ROOT)\n!endif\n\n!ifdef %use_wincng\nCFLAGS += -DLIBSSH2_WINCNG\n!else\nCFLAGS += -wcd=138 -dLIBSSH2_OPENSSL -I$(OPENSSL_ROOT)\\inc32\n!endif\n\n!ifdef %use_watt32\nCFLAGS += -dUSE_WATT32 -I$(%watt_root)\\inc\n!endif\n\nOBJ_BASE = WC_Win32.obj\nLINK_ARG = $(OBJ_BASE)\\dyn\\wlink.arg\nLIB_ARG  = $(OBJ_BASE)\\stat\\wlib.arg\n\n# In order to process Makefile.inc wmake must be called with -u switch!\n!ifndef %MAKEFLAGS\n!error You MUST call wmake with the -u switch!\n!else\n!ifdef %use_wincng\n!include ..\\Makefile.WinCNG.inc\n!else\n!include ..\\Makefile.OpenSSL.inc\n!endif\n!include ..\\Makefile.inc\n!endif\n\nOBJS = $(CSOURCES:.c=.obj)\nOBJS = $OBJ_DIR\\$(OBJS: = $OBJ_DIR\\)\n\n#\n# Use $(OBJS) as a template to generate $(OBJS_STAT) and $(OBJS_DYN).\n#\nOBJ_DIR    = $(OBJ_BASE)\\stat\nOBJS_STAT  = $+ $(OBJS) $-\n\nOBJ_DIR    = $(OBJ_BASE)\\dyn\nOBJS_DYN   = $+ $(OBJS) $-\n\nRESOURCE   = $(OBJ_BASE)\\dyn\\libssh2.res\n\n.c: ..\\src\n\n\nall: $(OBJ_BASE) $(TARGETS) .SYMBOLIC\n\t@echo Welcome to libssh2\n\nclean: .SYMBOLIC\n\t-$(RM) $(OBJS_STAT)\n\t-$(RM) $(OBJS_DYN)\n\t-$(RM) $(RESOURCE) $(LINK_ARG) $(LIB_ARG)\n\nvclean realclean: clean .SYMBOLIC\n\t-$(RM) $(TARGETS) $(LIBNAME).map $(LIBNAME).sym\n\t-$(RD) $(OBJ_BASE)\\stat\n\t-$(RD) $(OBJ_BASE)\\dyn\n\t-$(RD) $(OBJ_BASE)\n\n$(OBJ_BASE):\n\t-$(MD) $^@\n\t-$(MD) $^@\\stat\n\t-$(MD) $^@\\dyn\n\n$(LIBNAME).dll: $(OBJS_DYN) $(RESOURCE) $(LINK_ARG)\n\t$(LD) name $^@ @$]@\n\n$(LIBNAME).lib: $(OBJS_STAT) $(LIB_ARG)\n\t$(AR) -q -b -c $^@ @$]@\n\n.ERASE\n$(RESOURCE): libssh2.rc\n\t$(RC) $(DEBUG) -q -r -zm -I..\\include $(SYS_INCL) $[@ -fo=$^@\n\n.ERASE\n.c{$(OBJ_BASE)\\dyn}.obj:\n\t$(CC) $(CFLAGS) -bd -br $[@ -fo=$^@\n\n.ERASE\n.c{$(OBJ_BASE)\\stat}.obj:\n\t$(CC) $(CFLAGS) $[@ -fo=$^@\n\n$(LINK_ARG): $(__MAKEFILES__)\n\t%create $^@\n\t@%append $^@ system nt dll\n\t@%append $^@ file { $(OBJS_DYN) }\n!ifdef %debug\n\t@%append $^@ debug all\n\t@%append $^@ option symfile\n!endif\n\t@%append $^@ option quiet, map, caseexact, eliminate, implib=$(LIBNAME)_imp.lib,\n\t@%append $^@ res=$(RESOURCE) libpath $(SYS_LIBS)\n!ifdef %use_watt32\n\t@%append $^@ library $(%watt_root)\\lib\\wattcpw_imp.lib\n!else\n\t@%append $^@ library ws2_32.lib\n!endif\n!ifdef %use_zlib\n\t@%append $^@ library '$(ZLIB_ROOT)\\zlib.lib'\n!endif\n!ifdef %use_wincng\n\t@%append $^@ library bcrypt.lib\n\t@%append $^@ library crypt32.lib\n!else\n\t@%append $^@ library '$(OPENSSL_ROOT)\\out32\\libeay32.lib'\n\t@%append $^@ library '$(OPENSSL_ROOT)\\out32\\ssleay32.lib'\n!endif\n\n$(LIB_ARG): $(__MAKEFILES__)\n\t%create $^@\n\t@for %f in ($(OBJS_STAT)) do @%append $^@ +- %f\n\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/win32/config.mk",
    "content": "\n# Tweak these for your system\n!if \"$(OPENSSLINC)\" == \"\"\nOPENSSLINC=..\\openssl-0.9.8zc\\inc32\n!endif\n\n!if \"$(OPENSSLLIB)\" == \"\"\nOPENSSLLIB=..\\openssl-0.9.8zc\\out32dll\n!endif\n\n!if \"$(ZLIBINC)\" == \"\"\nZLIBINC=..\\zlib-1.2.8\n!endif\n\n!if \"$(ZLIBLIB)\" == \"\"\nZLIBLIB=..\\zlib-1.2.8\n!endif\n\n!if \"$(TARGET)\" == \"\"\nTARGET=Release\n!endif\n\n!if \"$(TARGET)\" == \"Debug\"\nSUFFIX=_debug\nCPPFLAGS=/Od /MDd\nDLLFLAGS=/DEBUG /LDd\n!else\nCPPFLAGS=/Oi /O2 /Oy /GF /Y- /MD /DNDEBUG\nDLLFLAGS=/DEBUG /LD\n!endif\n\nCPPFLAGS=/nologo /GL /Zi /EHsc $(CPPFLAGS) /Iwin32 /Iinclude\n\n!if \"$(WITH_WINCNG)\" == \"1\"\nCPPFLAGS=$(CPPFLAGS) /DLIBSSH2_WINCNG\n# LIBS=bcrypt.lib crypt32.lib\n!else\nCPPFLAGS=$(CPPFLAGS) /DLIBSSH2_OPENSSL /I$(OPENSSLINC)\nLIBS=$(LIBS) $(OPENSSLLIB)\\libeay32.lib $(OPENSSLLIB)\\ssleay32.lib\n!endif\n\n!if \"$(WITH_ZLIB)\" == \"1\"\nCPPFLAGS=$(CPPFLAGS) /DLIBSSH2_HAVE_ZLIB /I$(ZLIBINC)\nLIBS=$(LIBS) $(ZLIBLIB)\\zlib.lib\n!endif\n\nCFLAGS=$(CPPFLAGS)\nRCFLAGS=/Iinclude\nDLLFLAGS=$(CFLAGS) $(DLLFLAGS)\nLIBS=$(LIBS) ws2_32.lib user32.lib advapi32.lib gdi32.lib\n\nINTDIR=$(TARGET)\\$(SUBDIR)\n\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/win32/libssh2.dsw",
    "content": "Microsoft Developer Studio Workspace File, Format Version 6.00\n# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\n\n###############################################################################\n\nProject: \"libssh2\"=\".\\libssh2.dsp\" - Package Owner=<4>\n\nPackage=<5>\n{{{\n}}}\n\nPackage=<4>\n{{{\n}}}\n\n###############################################################################\n\nProject: \"tests\"=\".\\tests.dsp\" - Package Owner=<4>\n\nPackage=<5>\n{{{\n}}}\n\nPackage=<4>\n{{{\n}}}\n\n###############################################################################\n\nGlobal:\n\nPackage=<5>\n{{{\n}}}\n\nPackage=<3>\n{{{\n}}}\n\n###############################################################################\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/win32/libssh2.rc",
    "content": "/***************************************************************************\n* libssh2 Win32 resource file                                              *\n***************************************************************************/\n#include <winver.h>\n#include \"../include/libssh2.h\"\n\nLANGUAGE  0x09,0x01\n\n#define RC_VERSION  LIBSSH2_VERSION_MAJOR, LIBSSH2_VERSION_MINOR, LIBSSH2_VERSION_PATCH, 0\n\nVS_VERSION_INFO VERSIONINFO\n  FILEVERSION     RC_VERSION\n  PRODUCTVERSION  RC_VERSION\n  FILEFLAGSMASK   0x3fL\n#if defined(DEBUGBUILD) || defined(_DEBUG)\n  FILEFLAGS 1\n#else\n  FILEFLAGS 0\n#endif\n  FILEOS      VOS__WINDOWS32\n  FILETYPE    VFT_DLL\n  FILESUBTYPE 0x0L\n\nBEGIN\n  BLOCK \"StringFileInfo\"\n  BEGIN\n    BLOCK \"040904b0\"\n    BEGIN\n      VALUE \"CompanyName\",      \"The libssh2 library, https://www.libssh2.org/\\0\"\n      VALUE \"FileDescription\",  \"libssh2 Shared Library\\0\"\n      VALUE \"FileVersion\",      LIBSSH2_VERSION \"\\0\"\n      VALUE \"InternalName\",     \"libssh2\\0\"\n      VALUE \"OriginalFilename\", \"libssh2.dll\\0\"\n      VALUE \"ProductName\",      \"The libssh2 library\\0\"\n      VALUE \"ProductVersion\",   LIBSSH2_VERSION \"\\0\"\n      VALUE \"LegalCopyright\",   \" \" LIBSSH2_COPYRIGHT \"\\0\"\n      VALUE \"License\",          \"https://www.libssh2.org/license.html\\0\"\n    END\n  END\n\n  BLOCK \"VarFileInfo\"\n  BEGIN\n    VALUE \"Translation\", 0x409, 1200\n  END\nEND\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/win32/libssh2_config.h",
    "content": "#ifndef LIBSSH2_CONFIG_H\n#define LIBSSH2_CONFIG_H\n\n#ifndef WIN32\n#define WIN32\n#endif\n#ifndef _CRT_SECURE_NO_DEPRECATE\n#define _CRT_SECURE_NO_DEPRECATE 1\n#endif /* _CRT_SECURE_NO_DEPRECATE */\n#include <winsock2.h>\n#include <mswsock.h>\n#include <ws2tcpip.h>\n\n#ifdef __MINGW32__\n#define HAVE_UNISTD_H\n#define HAVE_INTTYPES_H\n#define HAVE_SYS_TIME_H\n#define HAVE_GETTIMEOFDAY\n#endif /* __MINGW32__ */\n\n#define HAVE_LIBCRYPT32\n#define HAVE_WINSOCK2_H\n#define HAVE_IOCTLSOCKET\n#define HAVE_SELECT\n\n#ifdef _MSC_VER\n#if _MSC_VER < 1900\n#define snprintf _snprintf\n#if _MSC_VER < 1500\n#define vsnprintf _vsnprintf\n#endif\n#define strdup _strdup\n#define strncasecmp _strnicmp\n#define strcasecmp _stricmp\n#endif\n#else\n#ifndef __MINGW32__\n#define strncasecmp strnicmp\n#define strcasecmp stricmp\n#endif /* __MINGW32__ */\n#endif /* _MSC_VER */\n\n/* Enable newer diffie-hellman-group-exchange-sha1 syntax */\n#define LIBSSH2_DH_GEX_NEW 1\n\n#endif /* LIBSSH2_CONFIG_H */\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/win32/msvcproj.foot",
    "content": "# End Target\n# End Project\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/win32/msvcproj.head",
    "content": "# Microsoft Developer Studio Project File - Name=\"libssh2\" - Package Owner=<4>\n# Microsoft Developer Studio Generated Build File, Format Version 6.00\n# ** DO NOT EDIT **\n# only OpenSSL and WinCNG are supported with this build system\n\n# TARGTYPE \"Win32 (x86) Dynamic-Link Library\" 0x0102\n# TARGTYPE \"Win32 (x86) Static Library\" 0x0104\n\nCFG=libssh2 - Win32 OpenSSL Debug\n!MESSAGE This is not a valid makefile. To build this project using NMAKE,\n!MESSAGE use the Export Makefile command and run\n!MESSAGE\n!MESSAGE NMAKE /f \"libssh2.mak\".\n!MESSAGE\n!MESSAGE You can specify a configuration when running NMAKE\n!MESSAGE by defining the macro CFG on the command line. For example:\n!MESSAGE\n!MESSAGE NMAKE /f \"libssh2.mak\" CFG=\"libssh2 - Win32 DLL Debug\"\n!MESSAGE\n!MESSAGE Possible choices for configuration are:\n!MESSAGE\n!MESSAGE \"libssh2 - Win32 OpenSSL DLL Release\" (based on \"Win32 (x86) Dynamic-Link Library\")\n!MESSAGE \"libssh2 - Win32 OpenSSL DLL Debug\" (based on \"Win32 (x86) Dynamic-Link Library\")\n!MESSAGE \"libssh2 - Win32 OpenSSL LIB Release\" (based on \"Win32 (x86) Static Library\")\n!MESSAGE \"libssh2 - Win32 OpenSSL LIB Debug\" (based on \"Win32 (x86) Static Library\")\n!MESSAGE \"libssh2 - Win32 WinCNG DLL Release\" (based on \"Win32 (x86) Dynamic-Link Library\")\n!MESSAGE \"libssh2 - Win32 WinCNG DLL Debug\" (based on \"Win32 (x86) Dynamic-Link Library\")\n!MESSAGE \"libssh2 - Win32 WinCNG LIB Release\" (based on \"Win32 (x86) Static Library\")\n!MESSAGE \"libssh2 - Win32 WinCNG LIB Debug\" (based on \"Win32 (x86) Static Library\")\n!MESSAGE\n\n# Begin Project\n# PROP AllowPerConfigDependencies 0\n# PROP Scc_ProjName \"\"\n# PROP Scc_LocalPath \"\"\nCPP=cl.exe\nMTL=midl.exe\nRSC=rc.exe\n\n!IF  \"$(CFG)\" == \"libssh2 - Win32 OpenSSL DLL Release\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 0\n# PROP BASE Output_Dir \"Release_dll\"\n# PROP BASE Intermediate_Dir \"Release_dll\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 0\n# PROP Output_Dir \"Release_dll\"\n# PROP Intermediate_Dir \"Release_dll\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_OPENSSL\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# ADD CPP /nologo /MD /W3 /GX /O2 /I \"..\\win32\" /I \"..\\include\" /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_OPENSSL\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# SUBTRACT CPP /YX\n# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\n# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\n# ADD RSC /l 0x409 /d \"NDEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386\n# ADD LINK32 gdi32.lib advapi32.lib user32.lib kernel32.lib ws2_32.lib libeay32.lib zlib.lib /nologo /dll /map /debug /machine:I386\n\n!ELSEIF  \"$(CFG)\" == \"libssh2 - Win32 OpenSSL DLL Debug\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 1\n# PROP BASE Output_Dir \"Debug_dll\"\n# PROP BASE Intermediate_Dir \"Debug_dll\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 1\n# PROP Output_Dir \"Debug_dll\"\n# PROP Intermediate_Dir \"Debug_dll\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_OPENSSL\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /GZ /c\n# ADD CPP /nologo /MD /W3 /Gm /GX /ZI /Od /I \"..\\win32\" /I \"..\\include\" /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_OPENSSL\" /D \"_MBCS\" /D \"_LIB\" /D \"LIBSSH2DEBUG\" /YX /FD /GZ /c\n# SUBTRACT CPP /WX /YX\n# ADD BASE MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\n# ADD MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\n# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\n# ADD RSC /l 0x409 /d \"_DEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept\n# ADD LINK32 gdi32.lib advapi32.lib user32.lib kernel32.lib ws2_32.lib libeay32.lib zlib.lib /nologo /dll /incremental:no /map /debug /machine:I386 /pdbtype:sept\n# SUBTRACT LINK32 /nodefaultlib\n\n!ELSEIF  \"$(CFG)\" == \"libssh2 - Win32 OpenSSL LIB Release\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 0\n# PROP BASE Output_Dir \"Release_lib\"\n# PROP BASE Intermediate_Dir \"Release_lib\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 0\n# PROP Output_Dir \"Release_lib\"\n# PROP Intermediate_Dir \"Release_lib\"\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_OPENSSL\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# ADD CPP /nologo /MD /W3 /GX /O2 /I \"..\\win32\" /I \"..\\include\" /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_OPENSSL\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\n# ADD RSC /l 0x409 /d \"NDEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLIB32=link.exe -lib\n# ADD BASE LIB32 /nologo\n# ADD LIB32 /nologo\n# ADD LIB32 /nologo /out:\"Release_lib\\libssh2.lib\"\n\n!ELSEIF  \"$(CFG)\" == \"libssh2 - Win32 OpenSSL LIB Debug\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 1\n# PROP BASE Output_Dir \"Debug_lib\"\n# PROP BASE Intermediate_Dir \"Debug_lib\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 1\n# PROP Output_Dir \"Debug_lib\"\n# PROP Intermediate_Dir \"Debug_lib\"\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_OPENSSL\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /GZ /c\n# ADD CPP /nologo /MD /W3 /Gm /GX /ZI /Od /I \"..\\win32\" /I \"..\\include\" /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_OPENSSL\" /D \"_MBCS\" /D \"_LIB\" /D \"LIBSSH2DEBUG\" /YX /FD /GZ /c\n# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\n# ADD RSC /l 0x409 /d \"_DEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLIB32=link.exe -lib\n# ADD BASE LIB32 /nologo\n# ADD LIB32 /nologo /out:\"Debug_lib\\libssh2d.lib\"\n\n!ELSEIF  \"$(CFG)\" == \"libssh2 - Win32 WinCNG LIB Debug\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 0\n# PROP BASE Output_Dir \"Release_dll\"\n# PROP BASE Intermediate_Dir \"Release_dll\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 0\n# PROP Output_Dir \"Release_dll\"\n# PROP Intermediate_Dir \"Release_dll\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_WINCNG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# ADD CPP /nologo /MD /W3 /GX /O2 /I \"..\\win32\" /I \"..\\include\" /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_WINCNG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# SUBTRACT CPP /YX\n# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\n# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\n# ADD RSC /l 0x409 /d \"NDEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386\n# ADD LINK32 gdi32.lib advapi32.lib user32.lib kernel32.lib ws2_32.lib crypt32.lib bcrypt.lib /nologo /dll /map /debug /machine:I386\n\n!ELSEIF  \"$(CFG)\" == \"libssh2 - Win32 WinCNG DLL Debug\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 1\n# PROP BASE Output_Dir \"Debug_dll\"\n# PROP BASE Intermediate_Dir \"Debug_dll\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 1\n# PROP Output_Dir \"Debug_dll\"\n# PROP Intermediate_Dir \"Debug_dll\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_WINCNG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /GZ /c\n# ADD CPP /nologo /MD /W3 /Gm /GX /ZI /Od /I \"..\\win32\" /I \"..\\include\" /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_WINCNG\" /D \"_MBCS\" /D \"_LIB\" /D \"LIBSSH2DEBUG\" /YX /FD /GZ /c\n# SUBTRACT CPP /WX /YX\n# ADD BASE MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\n# ADD MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\n# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\n# ADD RSC /l 0x409 /d \"_DEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept\n# ADD LINK32 gdi32.lib advapi32.lib user32.lib kernel32.lib ws2_32.lib crypt32.lib bcrypt.lib /nologo /dll /incremental:no /map /debug /machine:I386 /pdbtype:sept\n# SUBTRACT LINK32 /nodefaultlib\n\n!ELSEIF  \"$(CFG)\" == \"libssh2 - Win32 WinCNG LIB Release\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 0\n# PROP BASE Output_Dir \"Release_lib\"\n# PROP BASE Intermediate_Dir \"Release_lib\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 0\n# PROP Output_Dir \"Release_lib\"\n# PROP Intermediate_Dir \"Release_lib\"\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_WINCNG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# ADD CPP /nologo /MD /W3 /GX /O2 /I \"..\\win32\" /I \"..\\include\" /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_WINCNG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\n# ADD RSC /l 0x409 /d \"NDEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLIB32=link.exe -lib\n# ADD BASE LIB32 /nologo\n# ADD LIB32 /nologo\n# ADD LIB32 /nologo /out:\"Release_lib\\libssh2.lib\"\n\n!ELSEIF  \"$(CFG)\" == \"libssh2 - Win32 WinCNG LIB Debug\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 1\n# PROP BASE Output_Dir \"Debug_lib\"\n# PROP BASE Intermediate_Dir \"Debug_lib\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 1\n# PROP Output_Dir \"Debug_lib\"\n# PROP Intermediate_Dir \"Debug_lib\"\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_WINCNG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /GZ /c\n# ADD CPP /nologo /MD /W3 /Gm /GX /ZI /Od /I \"..\\win32\" /I \"..\\include\" /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_WINCNG\" /D \"_MBCS\" /D \"_LIB\" /D \"LIBSSH2DEBUG\" /YX /FD /GZ /c\n# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\n# ADD RSC /l 0x409 /d \"_DEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLIB32=link.exe -lib\n# ADD BASE LIB32 /nologo\n# ADD LIB32 /nologo /out:\"Debug_lib\\libssh2d.lib\"\n\n!ENDIF\n\n# Begin Target\n\n# Name \"libssh2 - Win32 OpenSSL DLL Release\"\n# Name \"libssh2 - Win32 OpenSSL DLL Debug\"\n# Name \"libssh2 - Win32 OpenSSL LIB Release\"\n# Name \"libssh2 - Win32 OpenSSL LIB Debug\"\n# Name \"libssh2 - Win32 WinCNG DLL Release\"\n# Name \"libssh2 - Win32 WinCNG DLL Debug\"\n# Name \"libssh2 - Win32 WinCNG LIB Release\"\n# Name \"libssh2 - Win32 WinCNG LIB Debug\"\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/win32/rules.mk",
    "content": "\nall-sub: $(INTDIR) all\n\nclean-sub: clean\n\n$(INTDIR):\n!if \"$(SRCDIR)\" == \"\"\n\t@if not exist $(TARGET) mkdir $(TARGET)\n!endif\n\t@if not exist $(INTDIR) mkdir $(INTDIR)\n\n{$(SUBDIR)}.c{$(INTDIR)}.obj::\n\t$(CC) -c $(CFLAGS) /Fo\"$(INTDIR)\\\\\" $<\n\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/win32/test/GNUmakefile",
    "content": "#########################################################################\n#\n## Makefile for building libssh2 samples (Win32 version - gnu make)\n## Use: make -f GNUmakefile [help]\n##\n## Hacked by: Guenter Knauf\n#\n#########################################################################\n\n# Edit the path below to point to the base of your Zlib sources.\nifndef ZLIB_PATH\nZLIB_PATH = ../../../zlib-1.2.8\nendif\n\n# Edit the path below to point to the base of your OpenSSL package.\nifndef OPENSSL_PATH\nOPENSSL_PATH = ../../../openssl-0.9.8zc\nendif\n\n# Project root\nPROOT\t= ../..\n\n# Edit the var below to enable static linking of libssh2 and libz\nLINK_STATIC = 1\n\n# Edit the vars below to change target settings.\nSAMPLES\t= $(PROOT)/example\nTARGETS := $(filter-out x11.exe,$(patsubst $(SAMPLES)/%.c,%.exe,$(strip $(wildcard $(SAMPLES)/*.c))))\nWWWURL\t= https://www.libssh2.org/\nDESCR\t= libssh2 $(subst .rc,,$(notdir $@)) $(LIBSSH2_VERSION_STR)\n#STACK\t= 64000\n\n# must be equal to DEBUG or NDEBUG\nifndef DB\n\tDB\t= NDEBUG\n\t# DB\t= DEBUG\nendif\n# Optimization: -O<n> or debugging: -g\nifeq ($(DB),NDEBUG)\n\tOPT\t= -O2\n\tOBJDIR\t= release\nelse\n\tOPT\t= -g\n\tOBJDIR\t= debug\nendif\n\n# Here you can find a native Win32 binary of the original awk:\n# http://www.gknw.net/development/prgtools/awk-20100523.zip\nAWK     = awk\nZIP     = zip -qzr9\n\n# Platform-dependent helper tool macros\nifeq ($(findstring /sh,$(SHELL)),/sh)\nDEL\t= rm -f $1\nRMDIR\t= rm -fr $1\nMKDIR\t= mkdir -p $1\nCOPY\t= -cp -afv $1 $2\n#COPYR\t= -cp -afr $1/* $2\nCOPYR\t= -rsync -aC $1/* $2\nTOUCH\t= touch $1\nCAT\t= cat\nECHONL\t= echo \"\"\nDL\t= '\nelse\nifeq \"$(OS)\" \"Windows_NT\"\nDEL\t= -del 2>NUL /q /f $(subst /,\\,$1)\nRMDIR\t= -rd 2>NUL /q /s $(subst /,\\,$1)\nelse\nDEL\t= -del 2>NUL $(subst /,\\,$1)\nRMDIR\t= -deltree 2>NUL /y $(subst /,\\,$1)\nendif\nMKDIR\t= -md 2>NUL $(subst /,\\,$1)\nCOPY\t= -copy 2>NUL /y $(subst /,\\,$1) $(subst /,\\,$2)\nCOPYR\t= -xcopy 2>NUL /q /y /e $(subst /,\\,$1) $(subst /,\\,$2)\nTOUCH\t= copy 2>&1>NUL /b $(subst /,\\,$1) +,,\nCAT\t= type\nECHONL\t= $(ComSpec) /c echo.\nendif\n\n# The following line defines your compiler.\nifdef METROWERKS\n\tCC = mwcc\nelse\n\tCC = $(CROSSPREFIX)gcc\nendif\n\n# Set environment var ARCH to your architecture to override autodetection.\nifndef ARCH\nifeq ($(findstring gcc,$(CC)),gcc)\nifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64)\nARCH\t= w64\nelse\nARCH\t= w32\nendif\nelse\nARCH\t= w32\nendif\nendif\n\n# Include the version info retrieved from libssh2.h\n-include $(OBJDIR)/version.inc\n\n# Global flags for all compilers\nCFLAGS\t= $(OPT) -D$(DB) -DLIBSSH2_WIN32 # -DHAVE_CONFIG_H\n\nifeq ($(CC),mwcc)\nLD\t= mwld\nRC\t= mwwinrc\nLDFLAGS\t= -nostdlib\nAR\t= $(LD)\nARFLAGS\t= -nostdlib -library -o\nLIBEXT\t= lib\nLIBPATH\t+= -lr \"$(METROWERKS)/MSL\" -lr \"$(METROWERKS)/Win32-x86 Support\"\nLDLIBS\t+= -lMSL_Runtime_x86.lib -lMSL_C_x86.lib -lMSL_Extras_x86.lib\nLDLIBS\t+= -lkernel32.lib -luser32.lib -lwsock32.lib\nRCFLAGS\t=\nCFLAGS\t+= -nostdinc -gccinc -msgstyle gcc -inline off -opt nointrinsics -proc 586\nCFLAGS\t+= -ir \"$(METROWERKS)/MSL\" -ir \"$(METROWERKS)/Win32-x86 Support\"\nCFLAGS\t+= -w on,nounused,nounusedexpr # -ansi strict\nelse\nLD\t= $(CROSSPREFIX)gcc\nRC\t= $(CROSSPREFIX)windres\nLDFLAGS\t= -s\nAR\t= $(CROSSPREFIX)ar\nARFLAGS\t= -cq\nLIBEXT\t= a\n#LDLIBS\t+= -lwsock32\nLDLIBS\t+= -lws2_32\nRCFLAGS\t= -I $(PROOT)/include -O coff\nCFLAGS\t+= -fno-builtin\nCFLAGS\t+= -fno-strict-aliasing\nCFLAGS\t+= -Wall #-Wno-unused #-pedantic\nifeq ($(ARCH),w64)\nCFLAGS\t+= -D_AMD64_\nRCFLAGS\t+= -F pe-x86-64\nelse\nCFLAGS\t+= -m32\nRCFLAGS\t+= -F pe-i386\nendif\nendif\n\nINCLUDES = -I$(PROOT)/win32 -I$(PROOT)/include\nLIBPATH += -L$(PROOT)/win32\n\nifdef LINK_STATIC\n\tLDLIBS += -llibssh2\nelse\n\tLDLIBS += -llibssh2dll\nendif\n\nifdef WITH_WINCNG\n# CFLAGS\t+= -DLIBSSH2_WINCNG\nLDLIBS\t+= -lbcrypt -lcrypt32\nelse\n# CFLAGS\t+= -DLIBSSH2_OPENSSL\nifndef OPENSSL_INCLUDE\n\tifeq \"$(wildcard $(OPENSSL_PATH)/outinc)\" \"$(OPENSSL_PATH)/outinc\"\n\t\tOPENSSL_INCLUDE = $(OPENSSL_PATH)/outinc\n\tendif\n\tifeq \"$(wildcard $(OPENSSL_PATH)/include)\" \"$(OPENSSL_PATH)/include\"\n\t\tOPENSSL_INCLUDE = $(OPENSSL_PATH)/include\n\tendif\nendif\nifneq \"$(wildcard $(OPENSSL_INCLUDE)/openssl/opensslv.h)\" \"$(OPENSSL_INCLUDE)/openssl/opensslv.h\"\n$(error Invalid OPENSSL_PATH: $(OPENSSL_PATH))\nendif\nINCLUDES += -I\"$(OPENSSL_INCLUDE)\"\nifndef OPENSSL_LIBPATH\n\tOPENSSL_LIBS_STAT = crypto ssl\n\tifeq \"$(wildcard $(OPENSSL_PATH)/out)\" \"$(OPENSSL_PATH)/out\"\n\t\tOPENSSL_LIBPATH = $(OPENSSL_PATH)/out\n\t\tOPENSSL_LIBS_DYN = eay32 ssl32\n\tendif\n\tifeq \"$(wildcard $(OPENSSL_PATH)/lib)\" \"$(OPENSSL_PATH)/lib\"\n\t\tOPENSSL_LIBPATH = $(OPENSSL_PATH)/lib\n\t\tOPENSSL_LIBS_DYN = crypto.dll ssl.dll\n\tendif\nendif\nifdef LINK_STATIC\nifdef LINK_OPENSSL_STATIC\n\tLDLIBS += $(patsubst %,$(OPENSSL_LIBPATH)/lib%.$(LIBEXT), $(OPENSSL_LIBS_STAT)) -lgdi32\nelse\n\tLDLIBS += $(patsubst %,$(OPENSSL_LIBPATH)/lib%.$(LIBEXT), $(OPENSSL_LIBS_DYN))\nendif\nendif\nendif\n\nifdef WITH_ZLIB\n\tCFLAGS += -DLIBSSH2_HAVE_ZLIB\n\tINCLUDES += -I$(ZLIB_PATH)\n\tifdef LINK_ZLIB_STATIC\n\t\tLDLIBS += $(ZLIB_PATH)/libz.$(LIBEXT)\n\telse\n\t\tLDLIBS += $(ZLIB_PATH)/libzdll.$(LIBEXT)\n\tendif\nendif\n\nCFLAGS\t+= $(INCLUDES)\n\nvpath %.c $(PROOT)/example\n\n.PRECIOUS: $(OBJDIR)/%.o $(OBJDIR)/%.rc $(OBJDIR)/%.res\n\n\nall: prebuild $(TARGETS)\n\nprebuild: $(OBJDIR) $(OBJDIR)/version.inc\n\n$(OBJDIR)/%.o: %.c\n#\t@echo Compiling $<\n\t$(CC) $(CFLAGS) -c $< -o $@\n\n$(OBJDIR)/version.inc: $(PROOT)/include/libssh2.h $(OBJDIR)\n\t@echo Creating $@\n\t@$(AWK) -f $(PROOT)/get_ver.awk $< > $@\n\nobjclean:\n\t$(call RMDIR, $(OBJDIR))\n\nclean: objclean\n\t$(call DEL, $(TARGETS))\n\n$(OBJDIR):\n\t$(call MKDIR, $@)\n\n%.exe: $(OBJDIR)/%.o $(OBJDIR)/%.res\n\t@echo Linking $@\n\t@$(call DEL, $@)\n\t$(LD) $(LDFLAGS) $^ -o $@ $(LIBPATH) $(LDLIBS)\n\n$(OBJDIR)/%.res: $(OBJDIR)/%.rc\n\t@echo Creating $@\n\t@$(RC) $(RCFLAGS) -i $< -o $@\n\n$(OBJDIR)/%.rc: GNUmakefile $(OBJDIR)/version.inc\n\t@echo $(DL)1 VERSIONINFO$(DL) > $@\n\t@echo $(DL) FILEVERSION $(LIBSSH2_VERSION),0$(DL) >> $@\n\t@echo $(DL) PRODUCTVERSION $(LIBSSH2_VERSION),0$(DL) >> $@\n\t@echo $(DL) FILEFLAGSMASK 0x3fL$(DL) >> $@\n\t@echo $(DL) FILEOS 0x40004L$(DL) >> $@\n\t@echo $(DL) FILEFLAGS 0x0L$(DL) >> $@\n\t@echo $(DL) FILETYPE 0x1L$(DL) >> $@\n\t@echo $(DL) FILESUBTYPE 0x0L$(DL) >> $@\n\t@echo $(DL)BEGIN$(DL) >> $@\n\t@echo $(DL)  BLOCK \"StringFileInfo\"$(DL) >> $@\n\t@echo $(DL)  BEGIN$(DL) >> $@\n\t@echo $(DL)    BLOCK \"040904E4\"$(DL) >> $@\n\t@echo $(DL)    BEGIN$(DL) >> $@\n\t@echo $(DL)      VALUE \"LegalCopyright\",\"\\xA9 $(LIBSSH2_COPYRIGHT_STR)\\0\"$(DL) >> $@\nifdef COMPANY\n\t@echo $(DL)      VALUE \"CompanyName\",\"$(COMPANY)\\0\"$(DL) >> $@\nendif\n\t@echo $(DL)      VALUE \"ProductName\",\"$(notdir $(@:.rc=.exe))\\0\"$(DL) >> $@\n\t@echo $(DL)      VALUE \"ProductVersion\",\"$(LIBSSH2_VERSION_STR)\\0\"$(DL) >> $@\n\t@echo $(DL)      VALUE \"License\",\"Released under GPL.\\0\"$(DL) >> $@\n\t@echo $(DL)      VALUE \"FileDescription\",\"$(DESCR)\\0\"$(DL) >> $@\n\t@echo $(DL)      VALUE \"FileVersion\",\"$(LIBSSH2_VERSION_STR)\\0\"$(DL) >> $@\n\t@echo $(DL)      VALUE \"InternalName\",\"$(notdir $(@:.rc=))\\0\"$(DL) >> $@\n\t@echo $(DL)      VALUE \"OriginalFilename\",\"$(notdir $(@:.rc=.exe))\\0\"$(DL) >> $@\n\t@echo $(DL)      VALUE \"WWW\",\"$(WWWURL)\\0\"$(DL) >> $@\n\t@echo $(DL)    END$(DL) >> $@\n\t@echo $(DL)  END$(DL) >> $@\n\t@echo $(DL)  BLOCK \"VarFileInfo\"$(DL) >> $@\n\t@echo $(DL)  BEGIN$(DL) >> $@\n\t@echo $(DL)    VALUE \"Translation\", 0x409, 1252$(DL) >> $@\n\t@echo $(DL)  END$(DL) >> $@\n\t@echo $(DL)END$(DL) >> $@\nifdef ICON\n\t@echo $(DL)10 ICON DISCARDABLE \"$(ICON)\"$(DL) >> $@\nendif\n\nhelp: $(OBJDIR)/version.inc\n\t@echo $(DL)===========================================================$(DL)\n\t@echo $(DL)OpenSSL path    = $(OPENSSL_PATH)$(DL)\n\t@echo $(DL)Zlib path       = $(ZLIB_PATH)$(DL)\n\t@echo $(DL)===========================================================$(DL)\n\t@echo $(DL)libssh $(LIBSSH2_VERSION_STR) - available targets are:$(DL)\n\t@echo $(DL)$(MAKE) all$(DL)\n\t@echo $(DL)$(MAKE) clean$(DL)\n\t@echo $(DL)$(MAKE) objclean$(DL)\n\t@echo $(DL)===========================================================$(DL)\n\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.7.0/sources/win32/tests.dsp",
    "content": "# Microsoft Developer Studio Project File - Name=\"tests\" - Package Owner=<4>\n# Microsoft Developer Studio Generated Build File, Format Version 6.00\n# ** DO NOT EDIT **\n\n# TARGTYPE \"Win32 (x86) Console Application\" 0x0103\n\nCFG=tests - Win32 Debug\n!MESSAGE This is not a valid makefile. To build this project using NMAKE,\n!MESSAGE use the Export Makefile command and run\n!MESSAGE \n!MESSAGE NMAKE /f \"tests.mak\".\n!MESSAGE \n!MESSAGE You can specify a configuration when running NMAKE\n!MESSAGE by defining the macro CFG on the command line. For example:\n!MESSAGE \n!MESSAGE NMAKE /f \"tests.mak\" CFG=\"tests - Win32 Debug\"\n!MESSAGE \n!MESSAGE Possible choices for configuration are:\n!MESSAGE \n!MESSAGE \"tests - Win32 Release\" (based on \"Win32 (x86) Console Application\")\n!MESSAGE \"tests - Win32 Debug\" (based on \"Win32 (x86) Console Application\")\n!MESSAGE \n\n# Begin Project\n# PROP AllowPerConfigDependencies 0\n# PROP Scc_ProjName \"\"\n# PROP Scc_LocalPath \"\"\nCPP=cl.exe\nRSC=rc.exe\n\n!IF  \"$(CFG)\" == \"tests - Win32 Release\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 0\n# PROP BASE Output_Dir \"tests___Win32_Release\"\n# PROP BASE Intermediate_Dir \"tests___Win32_Release\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 0\n# PROP Output_Dir \"Release\"\n# PROP Intermediate_Dir \"Release\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /c\n# ADD CPP /nologo /MD /W3 /GX /O2 /I \"..\\include\" /I \"..\\win32\" /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /c\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\n# ADD RSC /l 0x409 /d \"NDEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\n# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libeay32.lib ssleay32.lib ws2_32.lib zlib.lib libssh2.lib /nologo /subsystem:console /machine:I386 /libpath:\"Release\" /out:\"simple.exe\"\n\n!ELSEIF  \"$(CFG)\" == \"tests - Win32 Debug\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 1\n# PROP BASE Output_Dir \"tests___Win32_Debug\"\n# PROP BASE Intermediate_Dir \"tests___Win32_Debug\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 1\n# PROP Output_Dir \"Debug\"\n# PROP Intermediate_Dir \"Debug\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /GZ /c\n# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I \"..\\include\" /I \"..\\win32\" /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /GZ /c\n# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\n# ADD RSC /l 0x409 /d \"_DEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\n# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libeay32.lib ssleay32.lib ws2_32.lib zlib.lib libssh2d.lib /nologo /subsystem:console /debug /machine:I386 /nodefaultlib:\"msvcrt.lib\" /pdbtype:sept /libpath:\"Debug\" /out:\"simple.exe\"\n\n!ENDIF \n\n# Begin Target\n\n# Name \"tests - Win32 Release\"\n# Name \"tests - Win32 Debug\"\n# Begin Group \"Source Files\"\n\n# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;idl;hpj;bat\"\n# Begin Source File\n\nSOURCE=..\\tests\\simple.c\n# End Source File\n# End Group\n# Begin Group \"Header Files\"\n\n# PROP Default_Filter \"h;hpp;hxx;hm;inl\"\n# End Group\n# Begin Group \"Resource Files\"\n\n# PROP Default_Filter \"ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe\"\n# End Group\n# End Target\n# End Project\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/CMakeLists.txt",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\nset(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/sources/cmake)\n\nproject(libssh2 C)\n\ninclude(FeatureSummary)\ninclude(CheckFunctionExists)\ninclude(CheckSymbolExists)\ninclude(CheckFunctionExistsMayNeedLibrary)\ninclude(CheckIncludeFiles)\ninclude(CheckTypeSize)\ninclude(CheckSymbolExists)\ninclude(CheckNonblockingSocketSupport)\ninclude(SocketLibraries)\n\nset(HAVE_EVP_AES_128_CTR YES)\n\n## Library definition\nset(SOURCES\n  openssl.c\n  openssl.h\n  agent.c\n  blf.h\n  bcrypt_pbkdf.c\n  blowfish.c\n  channel.c\n  channel.h\n  comp.c\n  comp.h\n  crypt.c\n  crypto.h\n  global.c\n  hostkey.c\n  keepalive.c\n  kex.c\n  knownhost.c\n  libssh2_priv.h\n  mac.c\n  mac.h\n  misc.c\n  misc.h\n  packet.c\n  packet.h\n  pem.c\n  publickey.c\n  scp.c\n  session.c\n  session.h\n  sftp.c\n  sftp.h\n  transport.c\n  transport.h\n  userauth.c\n  userauth.h\n  version.c)\n\nif(WIN32)\n  list(APPEND SOURCES ../win32/libssh2.rc)\nendif()\n\nforeach (source ${SOURCES})\n  list (APPEND sources sources/src/${source})\nendforeach ()\n\nadd_library(libssh2 ${sources})\n# we want it to be called libssh2 on all platforms\nset_target_properties(libssh2 PROPERTIES PREFIX \"\")\n\ntarget_compile_definitions(libssh2\n    PRIVATE\n        LIBSSH2_OPENSSL)\n\ntarget_link_libraries(libssh2\n    PUBLIC\n       ssl crypto)\n\ntarget_include_directories(libssh2\n    PUBLIC\n        $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/sources/include>\n        $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>)\n\n## Options\n\noption(ENABLE_ZLIB_COMPRESSION \"Use zlib for compression\")\nadd_feature_info(Compression ENABLE_ZLIB_COMPRESSION\n  \"using zlib for compression\")\nif(ENABLE_ZLIB_COMPRESSION)\n  find_package(ZLIB REQUIRED)\n\n  target_include_directories(libssh2 PRIVATE ${ZLIB_INCLUDE_DIRS})\n  list(APPEND LIBRARIES ${ZLIB_LIBRARIES})\n  list(APPEND PC_REQUIRES_PRIVATE zlib)\n  if(ZLIB_FOUND)\n    target_compile_definitions(libssh2 PRIVATE LIBSSH2_HAVE_ZLIB=1)\n  endif()\nendif()\n\n# Enable debugging logging by default if the user configured a debug build\nif(CMAKE_BUILD_TYPE STREQUAL \"Debug\")\n  set(DEBUG_LOGGING_DEFAULT ON)\nelse()\n  set(DEBUG_LOGGING_DEFAULT OFF)\nendif()\n\noption(ENABLE_DEBUG_LOGGING \"log execution with debug trace\"\n  ${DEBUG_LOGGING_DEFAULT})\nadd_feature_info(Logging ENABLE_DEBUG_LOGGING\n   \"Logging of execution with debug trace\")\nif(ENABLE_DEBUG_LOGGING)\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2DEBUG)\nendif()\n\n## Platform checks\ncheck_include_files(unistd.h HAVE_UNISTD_H)\ncheck_include_files(inttypes.h HAVE_INTTYPES_H)\ncheck_include_files(stdlib.h HAVE_STDLIB_H)\ncheck_include_files(sys/select.h HAVE_SYS_SELECT_H)\n\ncheck_include_files(sys/uio.h HAVE_SYS_UIO_H)\ncheck_include_files(sys/socket.h HAVE_SYS_SOCKET_H)\ncheck_include_files(sys/ioctl.h HAVE_SYS_IOCTL_H)\ncheck_include_files(sys/time.h HAVE_SYS_TIME_H)\ncheck_include_files(sys/un.h HAVE_SYS_UN_H)\ncheck_include_files(windows.h HAVE_WINDOWS_H)\ncheck_include_files(ws2tcpip.h HAVE_WS2TCPIP_H)\ncheck_include_files(winsock2.h HAVE_WINSOCK2_H)\n\ncheck_type_size(\"long long\" LONGLONG)\n\nif(HAVE_SYS_TIME_H)\n  check_symbol_exists(gettimeofday sys/time.h HAVE_GETTIMEOFDAY)\nelse()\n  check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)\nendif()\nif(HAVE_STDLIB_H)\n  check_symbol_exists(strtoll stdlib.h HAVE_STRTOLL)\nelse()\n  check_function_exists(strtoll HAVE_STRTOLL)\nendif()\nif (NOT HAVE_STRTOLL)\n  # Try _strtoi64 if strtoll isn't available\n  check_symbol_exists(_strtoi64 stdlib.h HAVE_STRTOI64)\nendif()\ncheck_symbol_exists(snprintf stdio.h HAVE_SNPRINTF)\n\nif(${CMAKE_SYSTEM_NAME} STREQUAL \"Darwin\" OR\n   ${CMAKE_SYSTEM_NAME} STREQUAL \"Interix\")\n  # poll() does not work on these platforms\n  #\n  # Interix: \"does provide poll(), but the implementing developer must\n  # have been in a bad mood, because poll() only works on the /proc\n  # filesystem here\"\n  #\n  # Mac OS X's poll has funny behaviors, like:\n  # not being able to do poll on no fildescriptors (10.3?)\n  # not being able to poll on some files (like anything in /dev)\n  # not having reliable timeout support\n  # inconsistent return of POLLHUP where other implementations give POLLIN\n  message(\"poll use is disabled on this platform\")\nelse()\n  check_function_exists(poll HAVE_POLL)\nendif()\n\nappend_needed_socket_libraries(LIBRARIES)\n\n# Non-blocking socket support tests.  Must be after after library tests to\n# link correctly\nset(SAVE_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})\nset(CMAKE_REQUIRED_LIBRARIES ${LIBRARIES})\ncheck_nonblocking_socket_support()\nset(CMAKE_REQUIRED_LIBRARIES ${SAVE_CMAKE_REQUIRED_LIBRARIES})\n\nconfigure_file(\n  ${CMAKE_CURRENT_SOURCE_DIR}/sources/src/libssh2_config_cmake.h.in\n  ${CMAKE_CURRENT_BINARY_DIR}/libssh2_config.h)\n# to find generated header\ntarget_include_directories(libssh2 PRIVATE ${CMAKE_CURRENT_BINARY_DIR})\n\n# Check for the OS.\n# Daniel's note: this should not be necessary and we need to work to\n# get this removed.\nif(${CMAKE_SYSTEM_NAME} STREQUAL \"Windows\")\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2_WIN32)\nelseif(${CMAKE_SYSTEM_NAME} STREQUAL \"Darwin\")\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2_DARWIN)\nendif()\n\nif(CMAKE_VERSION VERSION_LESS \"2.8.12\")\n  # Fall back to over-linking dependencies\n  target_link_libraries(libssh2 ${LIBRARIES})\nelse()\n  target_link_libraries(libssh2 PRIVATE ${LIBRARIES})\nendif()\n\n# Ignore single compiler warning for this third-party project\nif(COMPILER_MSVC)\n  set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} /wd4133\")\nendif()\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/README.md",
    "content": "How to configure libssh2 for Robo\n=====================================\n\n1. Download and extract all files of new libssh zip file into \"sources\" dir.\n2. todo..\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/.editorconfig",
    "content": "root = true\n\n[*.{c, h}]\nend_of_line = lf\ninsert_final_newline = true\nindent_style = space\nindent_size = 4\ntrim_trailing_whitespace = true\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/.gitattribute",
    "content": "win32/msvcproj.head -crlf\nwin32/msvcproj.foot -crlf\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/.github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior.\n\nA recipe or example code that reproduces the problem? A stack trace from a crash\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Version (please complete the following information):**\n - OS: [e.g. iOS]\n - libssh2 version [e.g. 1.8.0]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/.github/stale.yml",
    "content": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 90\n# Number of days of inactivity before a stale issue is closed\ndaysUntilClose: 21\n# Issues with these labels will never be considered stale\nexemptLabels:\n  - pinned\n  - security\n# Label to use when marking an issue as stale\nstaleLabel: stale\n# Comment to post when marking an issue as stale. Set to `false` to disable\nmarkComment: >\n  This issue has been automatically marked as stale because it has not had\n  recent activity. It will be closed if no further activity occurs. Thank you\n  for your contributions.\n# Comment to post when closing a stale issue. Set to `false` to disable\ncloseComment: false\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/.gitignore",
    "content": ".deps\n.libs\n*.lib\n*.pdb\n*.dll\n*.exe\n*.obj\n.*.swp\nDebug\nRelease\n*.exp\nMakefile\nMakefile.in\naclocal.m4\nautom4te.cache\nconfig.guess\nconfig.log\nconfig.status\nconfig.sub\nconfigure\ndepcomp\nlibtool\nltmain.sh\nmissing\nssh2_sample\nlibssh2-*.tar.gz\ninstall-sh\n*.o\n*.lo\n*.la\nmkinstalldirs\ntags\nlibssh2.pc\nTAGS\n*~\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/.travis.yml",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\nsudo: required\n\nservices:\n  - docker\n\nlanguage: c\n\ncompiler:\n  - gcc\n  - clang\n\nenv:\n  matrix:\n   - B=style\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=OFF B=configure\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=OFF B=cmake\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=OFF B=cmake\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=ON B=cmake\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=ON B=cmake\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=Libgcrypt BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=OFF B=cmake\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=Libgcrypt BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=OFF B=cmake\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=Libgcrypt BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=ON B=cmake\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=Libgcrypt BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=ON B=cmake\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=mbedTLS BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=OFF B=cmake\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=mbedTLS BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=OFF B=cmake\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=mbedTLS BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=ON B=cmake\n   - ADDRESS_SIZE=64 CRYPTO_BACKEND=mbedTLS BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=ON B=cmake\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=OFF B=cmake\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=OFF B=cmake\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=ON B=cmake\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=OpenSSL BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=ON B=cmake\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=Libgcrypt BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=OFF B=cmake\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=Libgcrypt BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=OFF B=cmake\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=Libgcrypt BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=ON B=cmake\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=Libgcrypt BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=ON B=cmake\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=mbedTLS BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=OFF B=cmake\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=mbedTLS BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=OFF B=cmake\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=mbedTLS BUILD_SHARED_LIBS=OFF ENABLE_ZLIB_COMPRESSION=ON B=cmake\n   - ADDRESS_SIZE=32 CRYPTO_BACKEND=mbedTLS BUILD_SHARED_LIBS=ON ENABLE_ZLIB_COMPRESSION=ON B=cmake\n\nbefore_install:\n  # Fix issue with chrome and 32-bit multilib\n  # See http://www.omgubuntu.co.uk/2016/03/fix-failed-to-fetch-google-chrome-apt-error-ubuntu\n  - sudo sed -i -e 's/deb http/deb [arch=amd64] http/' \"/etc/apt/sources.list.d/google-chrome.list\"\n  - sudo sed -i -e 's/deb http/deb [arch=amd64] http/' \"/opt/google/chrome/cron/google-chrome\"\n  - if [ $ADDRESS_SIZE = '32' ]; then sudo dpkg --add-architecture i386; fi\n  - if [ $ADDRESS_SIZE = '32' ]; then sudo apt-get update -qq; fi\n  - if [ $ADDRESS_SIZE = '32' ]; then sudo apt-get install -y gcc-multilib; fi\n  - if [ $ADDRESS_SIZE = '32' ]; then sudo apt-get install -y libssl-dev:i386 libgcrypt11-dev:i386 build-essential gcc-multilib; fi\n  - if [ $ADDRESS_SIZE = '32' ]; then sudo dpkg --purge --force-depends gcc-multilib && sudo dpkg --purge --force-depends libssl-dev; fi\n  - if [ $ADDRESS_SIZE = '64' ]; then sudo apt-get install -y libssl-dev; fi\n  - if [ $ADDRESS_SIZE = '64' ]; then sudo apt-get install -y libgcrypt11-dev; fi\n  - if [ $ADDRESS_SIZE = '32' ]; then export TOOLCHAIN_OPTION=\"-DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-Linux-32.cmake\"; fi\n  - if [ $CRYPTO_BACKEND = 'mbedTLS' ]; then\n      MBEDTLSVER=mbedtls-2.4.0;\n      curl -L https://github.com/ARMmbed/mbedtls/archive/$MBEDTLSVER.tar.gz | tar -xzf -;\n      cd mbedtls-$MBEDTLSVER;\n      cmake $TOOLCHAIN_OPTION -DUSE_SHARED_MBEDTLS_LIBRARY=ON -DCMAKE_INSTALL_PREFIX:PATH=../usr .;\n      make -j3 install;\n      cd ..;\n      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/usr/lib;\n      export TOOLCHAIN_OPTION=\"$TOOLCHAIN_OPTION -DCMAKE_PREFIX_PATH=$PWD/usr\";\n    fi\n\ninstall:\n\nscript:\n  - |\n      if [ \"$B\" = \"style\" ]; then\n        perl src/checksrc.pl -i4 -m79 -ASIZEOFNOPAREN -ASNPRINTF -ACOPYRIGHT -AFOPENMODE -Wsrc/libssh2_config.h src/*.[ch] include/*.h example/*.c\n      fi\n  - |\n      if [ \"$B\" = \"configure\" ]; then\n        ./buildconf\n        ./configure --enable-debug --enable-werror\n        make\n        make check\n      fi\n  - |\n      if [ \"$B\" = \"cmake\" ]; then\n        mkdir bin\n        cd bin\n        cmake $TOOLCHAIN_OPTION -DCRYPTO_BACKEND=$CRYPTO_BACKEND -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS -DENABLE_ZLIB_COMPRESSION=$ENABLE_ZLIB_COMPRESSION .. && cmake --build . && CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target test && cmake --build . --target package\n      fi\n\n# whitelist branches to avoid testing feature branches twice (as branch and as pull request)\nbranches:\n    only:\n        - master\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/CMakeLists.txt",
    "content": "# Copyright (c) 2014, 2015  Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\ncmake_minimum_required(VERSION 2.8.11)\n\nset(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)\n\nproject(libssh2 C)\nset(PROJECT_URL \"https://www.libssh2.org/\")\nset(PROJECT_DESCRIPTION \"The SSH library\")\n\nif (CMAKE_VERSION VERSION_LESS \"3.1\")\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    set (CMAKE_C_FLAGS \"--std=gnu90 ${CMAKE_C_FLAGS}\")\n  endif()\nelse()\n  set (CMAKE_C_STANDARD 90)\nendif()\n\noption(BUILD_SHARED_LIBS \"Build Shared Libraries\" OFF)\n\n# Parse version\n\nfile(READ ${CMAKE_CURRENT_SOURCE_DIR}/include/libssh2.h _HEADER_CONTENTS)\nstring(\n  REGEX REPLACE \".*#define LIBSSH2_VERSION[ \\t]+\\\"([^\\\"]+)\\\".*\" \"\\\\1\"\n  LIBSSH2_VERSION \"${_HEADER_CONTENTS}\")\nstring(\n  REGEX REPLACE \".*#define LIBSSH2_VERSION_MAJOR[ \\t]+([0-9]+).*\" \"\\\\1\"\n  LIBSSH2_VERSION_MAJOR \"${_HEADER_CONTENTS}\")\nstring(\n  REGEX REPLACE \".*#define LIBSSH2_VERSION_MINOR[ \\t]+([0-9]+).*\" \"\\\\1\"\n  LIBSSH2_VERSION_MINOR \"${_HEADER_CONTENTS}\")\nstring(\n  REGEX REPLACE \".*#define LIBSSH2_VERSION_PATCH[ \\t]+([0-9]+).*\" \"\\\\1\"\n  LIBSSH2_VERSION_PATCH \"${_HEADER_CONTENTS}\")\n\nif(NOT LIBSSH2_VERSION OR\n   NOT LIBSSH2_VERSION_MAJOR MATCHES \"^[0-9]+$\" OR\n   NOT LIBSSH2_VERSION_MINOR MATCHES \"^[0-9]+$\" OR\n   NOT LIBSSH2_VERSION_PATCH MATCHES \"^[0-9]+$\")\n  message(\n    FATAL_ERROR\n    \"Unable to parse version from\"\n    \"${CMAKE_CURRENT_SOURCE_DIR}/include/libssh2.h\")\nendif()\n\ninclude(GNUInstallDirs)\ninstall(\n  FILES docs/AUTHORS COPYING docs/HACKING README RELEASE-NOTES NEWS\n  DESTINATION ${CMAKE_INSTALL_DOCDIR})\n\ninclude(max_warnings)\ninclude(FeatureSummary)\n\nadd_subdirectory(src)\n\noption(BUILD_EXAMPLES \"Build libssh2 examples\" ON)\nif(BUILD_EXAMPLES)\n  add_subdirectory(example)\nendif()\n\noption(BUILD_TESTING \"Build libssh2 test suite\" ON)\nif(BUILD_TESTING)\n  enable_testing()\n  add_subdirectory(tests)\nendif()\n\nadd_subdirectory(docs)\n\nfeature_summary(WHAT ALL)\n\nset(CPACK_PACKAGE_VERSION_MAJOR ${LIBSSH2_VERSION_MAJOR})\nset(CPACK_PACKAGE_VERSION_MINOR ${LIBSSH2_VERSION_MINOR})\nset(CPACK_PACKAGE_VERSION_PATCH ${LIBSSH2_VERSION_PATCH})\nset(CPACK_PACKAGE_VERSION ${LIBSSH2_VERSION})\ninclude(CPack)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/COPYING",
    "content": "/* Copyright (c) 2004-2007 Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2005,2006 Mikhail Gusarov <dottedmag@dottedmag.net>\n * Copyright (c) 2006-2007 The Written Word, Inc.\n * Copyright (c) 2007 Eli Fant <elifantu@mail.ru>\n * Copyright (c) 2009-2014 Daniel Stenberg\n * Copyright (C) 2008, 2009 Simon Josefsson\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/Makefile.OpenSSL.inc",
    "content": "CRYPTO_CSOURCES = openssl.c\nCRYPTO_HHEADERS = openssl.h\nCRYPTO_LTLIBS = $(LTLIBSSL)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/Makefile.WinCNG.inc",
    "content": "CRYPTO_CSOURCES = wincng.c\nCRYPTO_HHEADERS = wincng.h\nCRYPTO_LTLIBS = $(LTLIBBCRYPT) $(LTLIBCRYPT32)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/Makefile.am",
    "content": "AUTOMAKE_OPTIONS = foreign nostdinc\n\nSUBDIRS = src tests docs\nif BUILD_EXAMPLES\nSUBDIRS += example\nendif\n\npkgconfigdir = $(libdir)/pkgconfig\npkgconfig_DATA = libssh2.pc\n\ninclude_HEADERS =\t\t\t\\\n\tinclude/libssh2.h\t\t\\\n\tinclude/libssh2_publickey.h\t\\\n\tinclude/libssh2_sftp.h\n\nNETWAREFILES =  nw/keepscreen.c \\\n\tnw/nwlib.c \\\n\tnw/GNUmakefile \\\n\tnw/test/GNUmakefile\n\nDSP = win32/libssh2.dsp\nVCPROJ = win32/libssh2.vcproj\n\nDISTCLEANFILES = $(DSP)\n\nVMSFILES = vms/libssh2_make_example.dcl vms/libssh2_make_help.dcl\t\\\nvms/libssh2_make_kit.dcl vms/libssh2_make_lib.dcl vms/man2help.c\t\\\nvms/readme.vms vms/libssh2_config.h\n\nWIN32FILES = win32/GNUmakefile win32/test/GNUmakefile\t\t\\\nwin32/libssh2_config.h win32/config.mk win32/rules.mk\t\t\\\nwin32/Makefile.Watcom win32/libssh2.dsw win32/tests.dsp $(DSP)\t\\\nwin32/msvcproj.head win32/msvcproj.foot win32/libssh2.rc\n\nOS400FILES = os400/README400 os400/initscript.sh os400/make.sh\t\t\\\nos400/make-src.sh os400/make-rpg.sh os400/make-include.sh\t\t\\\nos400/os400sys.c os400/ccsid.c\t\t\t\t\t\t\\\nos400/libssh2_config.h os400/macros.h os400/libssh2_ccsid.h\t\t\\\nos400/include/alloca.h os400/include/sys/socket.h os400/include/stdio.h\t\\\nos400/libssh2rpg/libssh2.rpgle.in\t\t\t\t\t\\\nos400/libssh2rpg/libssh2_ccsid.rpgle.in\t\t\t\t\t\\\nos400/libssh2rpg/libssh2_publickey.rpgle\t\t\t\t\\\nos400/libssh2rpg/libssh2_sftp.rpgle\t\t\t\t\t\\\nMakefile.os400qc3.inc\n\nEXTRA_DIST = $(WIN32FILES) buildconf $(NETWAREFILES) get_ver.awk \\\n maketgz NMakefile RELEASE-NOTES libssh2.pc.in $(VMSFILES) config.rpath \\\n CMakeLists.txt cmake $(OS400FILES)\n\nACLOCAL_AMFLAGS = -I m4\n\n.PHONY: ChangeLog\nChangeLog:\n\techo \"see NEWS\" > ./ChangeLog\nDISTCLEANFILES += ChangeLog\n\ndist-hook:\n\trm -rf $(top_builddir)/tests/log\n\tfind $(distdir) -name \"*.dist\" -exec rm {} \\;\n\t(distit=`find $(srcdir) -name \"*.dist\"`; \\\n\tfor file in $$distit; do \\\n\t  strip=`echo $$file | sed -e s/^$(srcdir)// -e s/\\.dist//`; \\\n\t  cp $$file $(distdir)$$strip; \\\n\tdone)\n\n# Code Coverage\n\ninit-coverage:\n\tmake clean\n\tlcov --directory . --zerocounters\n\nCOVERAGE_CCOPTS ?= \"-g --coverage\"\nCOVERAGE_OUT ?= docs/coverage\n\nbuild-coverage:\n\tmake CFLAGS=$(COVERAGE_CCOPTS) check\n\tmkdir -p $(COVERAGE_OUT)\n\tlcov --directory . --output-file $(COVERAGE_OUT)/$(PACKAGE).info \\\n\t\t--capture\n\ngen-coverage:\n\tgenhtml --output-directory $(COVERAGE_OUT) \\\n\t\t$(COVERAGE_OUT)/$(PACKAGE).info \\\n\t\t--highlight --frames --legend \\\n\t\t--title \"$(PACKAGE_NAME)\"\n\ncoverage: init-coverage build-coverage gen-coverage\n\n# DSP/VCPROJ generation adapted from libcurl\n# only OpenSSL and WinCNG are supported with this build system\nCRYPTO_CSOURCES = openssl.c wincng.c mbedtls.c\nCRYPTO_HHEADERS = openssl.h wincng.h mbedtls.h\n# Makefile.inc provides the CSOURCES and HHEADERS defines\ninclude Makefile.inc\n\nWIN32SOURCES = $(CSOURCES)\nWIN32HEADERS = $(HHEADERS) libssh2_config.h\n\n$(DSP): win32/msvcproj.head win32/msvcproj.foot Makefile.am\n\techo \"creating $(DSP)\"\n\t@( (cat $(srcdir)/win32/msvcproj.head; \\\n\techo \"# Begin Group \\\"Source Files\\\"\"; \\\n\techo \"\"; \\\n\techo \"# PROP Default_Filter \\\"cpp;c;cxx\\\"\"; \\\n\twin32_srcs='$(WIN32SOURCES)'; \\\n\tsorted_srcs=`for file in $$win32_srcs; do echo $$file; done | sort`; \\\n\tfor file in $$sorted_srcs; do \\\n\t\techo \"# Begin Source File\"; \\\n\t\techo \"\"; \\\n\t\techo \"SOURCE=..\\\\src\\\\\"$$file; \\\n\t\techo \"# End Source File\"; \\\n\tdone; \\\n\techo \"# End Group\"; \\\n\techo \"# Begin Group \\\"Header Files\\\"\"; \\\n\techo \"\"; \\\n\techo \"# PROP Default_Filter \\\"h;hpp;hxx\\\"\"; \\\n\twin32_hdrs='$(WIN32HEADERS)'; \\\n\tsorted_hdrs=`for file in $$win32_hdrs; do echo $$file; done | sort`; \\\n\tfor file in $$sorted_hdrs; do \\\n\t\techo \"# Begin Source File\"; \\\n\t\techo \"\"; \\\n\t\tif [ \"$$file\" == \"libssh2_config.h\" ]; \\\n\t\tthen \\\n\t\t\techo \"SOURCE=.\\\\\"$$file; \\\n\t\telse \\\n\t\t\techo \"SOURCE=..\\\\src\\\\\"$$file; \\\n\t\tfi; \\\n\t\techo \"# End Source File\"; \\\n\tdone; \\\n\techo \"# End Group\"; \\\n\tcat $(srcdir)/win32/msvcproj.foot) | \\\n\tawk '{printf(\"%s\\r\\n\", gensub(\"\\r\", \"\", \"g\"))}' > $@ )\n\n$(VCPROJ): win32/vc8proj.head win32/vc8proj.foot Makefile.am\n\techo \"creating $(VCPROJ)\"\n\t@( (cat $(srcdir)/vc8proj.head; \\\n\twin32_srcs='$(WIN32SOURCES)'; \\\n\tsorted_srcs=`for file in $$win32_srcs; do echo $$file; done | sort`; \\\n\tfor file in $$sorted_srcs; do \\\n\t\techo \"<File RelativePath=\\\"\"..\\src\\$$file\"\\\"></File>\"; \\\n\tdone; \\\n\techo \"</Filter><Filter\tName=\\\"Header Files\\\">\"; \\\n\twin32_hdrs='$(WIN32HEADERS)'; \\\n\tsorted_hdrs=`for file in $$win32_hdrs; do echo $$file; done | sort`; \\\n\tfor file in $$sorted_hdrs; do \\\n\t\techo \"<File RelativePath=\\\"\"..\\src\\$$file\"\\\"></File>\"; \\\n\tdone; \\\n\tcat $(srcdir)/vc8proj.foot) | \\\n\tawk '{printf(\"%s\\r\\n\", gensub(\"\\r\", \"\", \"g\"))}' > $@ )\n\nchecksrc:\n\tperl src/checksrc.pl -i4 -m79 -ASIZEOFNOPAREN -ASNPRINTF -ACOPYRIGHT -AFOPENMODE -Wsrc/libssh2_config.h src/*.[ch] include/*.h example/*.c\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/Makefile.inc",
    "content": "CSOURCES = channel.c comp.c crypt.c hostkey.c kex.c mac.c misc.c \\\n packet.c publickey.c scp.c session.c sftp.c userauth.c transport.c \\\n version.c knownhost.c agent.c $(CRYPTO_CSOURCES) pem.c keepalive.c global.c \\\n blowfish.c bcrypt_pbkdf.c\n\nHHEADERS = libssh2_priv.h $(CRYPTO_HHEADERS) transport.h channel.h comp.h \\\n mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h blf.h\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/Makefile.libgcrypt.inc",
    "content": "CRYPTO_CSOURCES = libgcrypt.c\nCRYPTO_HHEADERS = libgcrypt.h\nCRYPTO_LTLIBS = $(LTLIBGCRYPT)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/Makefile.mbedTLS.inc",
    "content": "CRYPTO_CSOURCES = mbedtls.c\nCRYPTO_HHEADERS = mbedtls.h\nCRYPTO_LTLIBS = $(LTLIBMBEDCRYPTO)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/Makefile.os400qc3.inc",
    "content": "CRYPTO_CSOURCES = os400qc3.c\nCRYPTO_HHEADERS = os400qc3.h\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/NEWS",
    "content": "The old NEWS file.\n\nNEWS is now generated from git and put into the release tarballs.\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/NMakefile",
    "content": "!include \"win32/config.mk\"\n\n!if \"$(WITH_WINCNG)\" == \"1\"\n!include \"Makefile.WinCNG.inc\"\n!else\n!include \"Makefile.OpenSSL.inc\"\n!endif\n!include \"Makefile.inc\"\n\nOBJECTS=$(CSOURCES:.c=.obj)\n\n# SUBDIRS=src example\nSUBDIRS=src\n\nall-sub: win32\\objects.mk\n\t-for %D in ($(SUBDIRS)) do $(MAKE) /nologo /f %D/NMakefile BUILD=$(BUILD) SUBDIR=%D all-sub\n\nclean: \n\t-rmdir 2>NUL /s/q $(TARGET)\n\t-del 2>NUL win32\\objects.mk\n\nreal-clean vclean: clean\n\t-del 2>NUL libssh2.dll\n\t-del 2>NUL libssh2.exp\n\t-del 2>NUL libssh2.ilk\n\t-del 2>NUL libssh2.lib\n\t-del 2>NUL *.pdb\n\nwin32\\objects.mk: Makefile.inc\n\t@echo OBJECTS = \\>$@\n\t@for %O in ($(OBJECTS)) do @echo $$(INTDIR)\\%O \\>>$@\n\t@echo $$(EOL)>>$@\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/README",
    "content": "libssh2 - SSH2 library\n======================\n\nlibssh2 is a library implementing the SSH2 protocol, available under\nthe revised BSD license.\n\nWeb site: https://www.libssh2.org/\n\nMailing list: https://cool.haxx.se/mailman/listinfo/libssh2-devel\n\nLicense: see COPYING\n\nSource code: https://github.com/libssh2/libssh2\n\nWeb site source code: https://github.com/libssh2/www\n\nInstallation instructions are in:\n - docs/INSTALL_CMAKE for CMake\n - docs/INSTALL_AUTOTOOLS for Autotools\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/README.md",
    "content": "# libssh2 - SSH2 library\n\nlibssh2 is a library implementing the SSH2 protocol, available under\nthe revised BSD license.\n\n[Web site](https://www.libssh2.org/)\n\n[Mailing list](https://cool.haxx.se/mailman/listinfo/libssh2-devel)\n\n[BSD Licensed](https://libssh2.org/license.html)\n\n[Web site source code](https://github.com/libssh2/www)\n\nInstallation instructions:\n - [for CMake](docs/INSTALL_CMAKE)\n - [for autotools](docs/INSTALL_AUTOTOOLS)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/RELEASE-NOTES",
    "content": "libssh2 1.9.0\n\nThis release includes the following enhancements and bugfixes:\n \n o adds ECDSA keys and host key support when using OpenSSL\n o adds ED25519 key and host key support when using OpenSSL 1.1.1\n o adds OpenSSH style key file reading\n o adds AES CTR mode support when using WinCNG\n o adds PEM passphrase protected file support for Libgcrypt and WinCNG\n o adds SHA256 hostkey fingerprint\n o adds libssh2_agent_get_identity_path() and libssh2_agent_set_identity_path()\n o adds explicit zeroing of sensitive data in memory\n o adds additional bounds checks to network buffer reads\n o adds the ability to use the server default permissions when creating sftp directories\n o adds support for building with OpenSSL no engine flag\n o adds support for building with LibreSSL\n o increased sftp packet size to 256k\n o fixed oversized packet handling in sftp\n o fixed building with OpenSSL 1.1\n o fixed a possible crash if sftp stat gets an unexpected response\n o fixed incorrect parsing of the KEX preference string value\n o fixed conditional RSA and AES-CTR support\n o fixed a small memory leak during the key exchange process\n o fixed a possible memory leak of the ssh banner string\n o fixed various small memory leaks in the backends\n o fixed possible out of bounds read when parsing public keys from the server\n o fixed possible out of bounds read when parsing invalid PEM files\n o no longer null terminates the scp remote exec command\n o now handle errors when diffie hellman key pair generation fails\n o fixed compiling on Windows with the flag STDCALL=ON\n o improved building instructions\n o improved unit tests\n \nThis release would not have looked like this without help, code, reports and\nadvice from friends like these:\n\n  Peter Surge, Will Cosgrove, Daniel Stenberg, Alex Arslan, Alex Crichton, \n  Thomas Bleeker, Keno Fischer, Marc Hörsken, Marcel Raad, Viktor Szakats,\n  Kamil Dudka, Panos, Etienne Samson, Tseng Jun, Brendan Shanks, doublex,\n  Erik B, Jakob Egger, Thomas Lochmatter, alex-weaver, Adrian Moran, Zenju,\n  gartens, Matthew D. Fuller, Ryan Kelley, Zhen-Huan HWANG, Orivej Desh, \n  Alexander Curtiss\n  \n  (29 contributors)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/acinclude.m4",
    "content": "\ndnl **********************************************************************\ndnl CURL_DETECT_ICC ([ACTION-IF-YES])\ndnl\ndnl check if this is the Intel ICC compiler, and if so run the ACTION-IF-YES\ndnl sets the $ICC variable to \"yes\" or \"no\"\ndnl **********************************************************************\nAC_DEFUN([CURL_DETECT_ICC],\n[\n    ICC=\"no\"\n    AC_MSG_CHECKING([for icc in use])\n    if test \"$GCC\" = \"yes\"; then\n       dnl check if this is icc acting as gcc in disguise\n       AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],\n         dnl action if the text is found, this it has not been replaced by the\n         dnl cpp\n         ICC=\"no\",\n         dnl the text was not found, it was replaced by the cpp\n         ICC=\"yes\"\n         AC_MSG_RESULT([yes])\n         [$1]\n       )\n    fi\n    if test \"$ICC\" = \"no\"; then\n        # this is not ICC\n        AC_MSG_RESULT([no])\n    fi\n])\n\ndnl We create a function for detecting which compiler we use and then set as\ndnl pendantic compiler options as possible for that particular compiler. The\ndnl options are only used for debug-builds.\n\nAC_DEFUN([CURL_CC_DEBUG_OPTS],\n[\n    if test \"z$ICC\" = \"z\"; then\n      CURL_DETECT_ICC\n    fi\n\n    if test \"$GCC\" = \"yes\"; then\n\n       dnl figure out gcc version!\n       AC_MSG_CHECKING([gcc version])\n       gccver=`$CC -dumpversion`\n       num1=`echo $gccver | cut -d . -f1`\n       num2=`echo $gccver | cut -d . -f2`\n       gccnum=`(expr $num1 \"*\" 100 + $num2) 2>/dev/null`\n       AC_MSG_RESULT($gccver)\n\n       if test \"$ICC\" = \"yes\"; then\n         dnl this is icc, not gcc.\n\n         dnl ICC warnings we ignore:\n         dnl * 269 warns on our \"%Od\" printf formatters for curl_off_t output:\n         dnl   \"invalid format string conversion\"\n         dnl * 279 warns on static conditions in while expressions\n         dnl * 981 warns on \"operands are evaluated in unspecified order\"\n         dnl * 1418 \"external definition with no prior declaration\"\n         dnl * 1419 warns on \"external declaration in primary source file\"\n         dnl   which we know and do on purpose.\n\n         WARN=\"-wd279,269,981,1418,1419\"\n\n         if test \"$gccnum\" -gt \"600\"; then\n            dnl icc 6.0 and older doesn't have the -Wall flag\n            WARN=\"-Wall $WARN\"\n         fi\n       else dnl $ICC = yes\n         dnl this is a set of options we believe *ALL* gcc versions support:\n         WARN=\"-W -Wall -Wwrite-strings -pedantic -Wpointer-arith -Wnested-externs -Winline -Wmissing-prototypes\"\n\n         dnl -Wcast-align is a bit too annoying on all gcc versions ;-)\n\n         if test \"$gccnum\" -ge \"207\"; then\n           dnl gcc 2.7 or later\n           WARN=\"$WARN -Wmissing-declarations\"\n         fi\n\n         if test \"$gccnum\" -gt \"295\"; then\n           dnl only if the compiler is newer than 2.95 since we got lots of\n           dnl \"`_POSIX_C_SOURCE' is not defined\" in system headers with\n           dnl gcc 2.95.4 on FreeBSD 4.9!\n           WARN=\"$WARN -Wundef -Wno-long-long -Wsign-compare\"\n         fi\n\n         if test \"$gccnum\" -ge \"296\"; then\n           dnl gcc 2.96 or later\n           WARN=\"$WARN -Wfloat-equal\"\n         fi\n\n         if test \"$gccnum\" -gt \"296\"; then\n           dnl this option does not exist in 2.96\n           WARN=\"$WARN -Wno-format-nonliteral\"\n         fi\n\n         dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on\n         dnl on i686-Linux as it gives us heaps with false positives.\n         dnl Also, on gcc 4.0.X it is totally unbearable and complains all\n         dnl over making it unusable for generic purposes. Let's not use it.\n\n         if test \"$gccnum\" -ge \"303\"; then\n           dnl gcc 3.3 and later\n           WARN=\"$WARN -Wendif-labels -Wstrict-prototypes\"\n         fi\n\n         if test \"$gccnum\" -ge \"304\"; then\n           # try these on gcc 3.4\n           WARN=\"$WARN -Wdeclaration-after-statement\"\n         fi\n\n         for flag in $CPPFLAGS; do\n           case \"$flag\" in\n            -I*)\n              dnl Include path, provide a -isystem option for the same dir\n              dnl to prevent warnings in those dirs. The -isystem was not very\n              dnl reliable on earlier gcc versions.\n              add=`echo $flag | sed 's/^-I/-isystem /g'`\n              WARN=\"$WARN $add\"\n              ;;\n           esac\n         done\n\n       fi dnl $ICC = no\n\n       CFLAGS=\"$CFLAGS $WARN\"\n\n      AC_MSG_NOTICE([Added this set of compiler options: $WARN])\n\n    else dnl $GCC = yes\n\n      AC_MSG_NOTICE([Added no extra compiler options])\n\n    fi dnl $GCC = yes\n\n    dnl strip off optimizer flags\n    NEWFLAGS=\"\"\n    for flag in $CFLAGS; do\n      case \"$flag\" in\n      -O*)\n        dnl echo \"cut off $flag\"\n        ;;\n      *)\n        NEWFLAGS=\"$NEWFLAGS $flag\"\n        ;;\n      esac\n    done\n    CFLAGS=$NEWFLAGS\n\n]) dnl end of AC_DEFUN()\n\ndnl CURL_CHECK_NONBLOCKING_SOCKET\ndnl -------------------------------------------------\ndnl Check for how to set a socket to non-blocking state. There seems to exist\ndnl four known different ways, with the one used almost everywhere being POSIX\ndnl and XPG3, while the other different ways for different systems (old BSD,\ndnl Windows and Amiga).\ndnl\ndnl There are two known platforms (AIX 3.x and SunOS 4.1.x) where the\ndnl O_NONBLOCK define is found but does not work. This condition is attempted\ndnl to get caught in this script by using an excessive number of #ifdefs...\ndnl\nAC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET],\n[\n  AC_MSG_CHECKING([non-blocking sockets style])\n\n  AC_TRY_COMPILE([\n/* headers for O_NONBLOCK test */\n#include <sys/types.h>\n#include <unistd.h>\n#include <fcntl.h>\n],[\n/* try to compile O_NONBLOCK */\n\n#if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)\n# if defined(__SVR4) || defined(__srv4__)\n#  define PLATFORM_SOLARIS\n# else\n#  define PLATFORM_SUNOS4\n# endif\n#endif\n#if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX41)\n# define PLATFORM_AIX_V3\n#endif\n\n#if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__)\n#error \"O_NONBLOCK does not work on this platform\"\n#endif\n  int socket;\n  int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK);\n],[\ndnl the O_NONBLOCK test was fine\nnonblock=\"O_NONBLOCK\"\nAC_DEFINE(HAVE_O_NONBLOCK, 1, [use O_NONBLOCK for non-blocking sockets])\n],[\ndnl the code was bad, try a different program now, test 2\n\n  AC_TRY_COMPILE([\n/* headers for FIONBIO test */\n#include <unistd.h>\n#include <stropts.h>\n],[\n/* FIONBIO source test (old-style unix) */\n int socket;\n int flags = ioctl(socket, FIONBIO, &flags);\n],[\ndnl FIONBIO test was good\nnonblock=\"FIONBIO\"\nAC_DEFINE(HAVE_FIONBIO, 1, [use FIONBIO for non-blocking sockets])\n],[\ndnl FIONBIO test was also bad\ndnl the code was bad, try a different program now, test 3\n\n  AC_TRY_COMPILE([\n/* headers for ioctlsocket test (Windows) */\n#undef inline\n#ifdef HAVE_WINDOWS_H\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n#include <windows.h>\n#ifdef HAVE_WINSOCK2_H\n#include <winsock2.h>\n#else\n#ifdef HAVE_WINSOCK_H\n#include <winsock.h>\n#endif\n#endif\n#endif\n],[\n/* ioctlsocket source code */\n SOCKET sd;\n unsigned long flags = 0;\n sd = socket(0, 0, 0);\n ioctlsocket(sd, FIONBIO, &flags);\n],[\ndnl ioctlsocket test was good\nnonblock=\"ioctlsocket\"\nAC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets])\n],[\ndnl ioctlsocket didnt compile!, go to test 4\n\n  AC_TRY_LINK([\n/* headers for IoctlSocket test (Amiga?) */\n#include <sys/ioctl.h>\n],[\n/* IoctlSocket source code */\n int socket;\n int flags = IoctlSocket(socket, FIONBIO, (long)1);\n],[\ndnl ioctlsocket test was good\nnonblock=\"IoctlSocket\"\nAC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets])\n],[\ndnl Ioctlsocket didnt compile, do test 5!\n  AC_TRY_COMPILE([\n/* headers for SO_NONBLOCK test (BeOS) */\n#include <socket.h>\n],[\n/* SO_NONBLOCK source code */\n long b = 1;\n int socket;\n int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));\n],[\ndnl the SO_NONBLOCK test was good\nnonblock=\"SO_NONBLOCK\"\nAC_DEFINE(HAVE_SO_NONBLOCK, 1, [use SO_NONBLOCK for non-blocking sockets])\n],[\ndnl test 5 didnt compile!\nnonblock=\"nada\"\nAC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets])\n])\ndnl end of fifth test\n\n])\ndnl end of forth test\n\n])\ndnl end of third test\n\n])\ndnl end of second test\n\n])\ndnl end of non-blocking try-compile test\n  AC_MSG_RESULT($nonblock)\n\n  if test \"$nonblock\" = \"nada\"; then\n    AC_MSG_WARN([non-block sockets disabled])\n  fi\n])\n\ndnl CURL_CHECK_NEED_REENTRANT_SYSTEM\ndnl -------------------------------------------------\ndnl Checks if the preprocessor _REENTRANT definition\ndnl must be unconditionally done for this platform.\ndnl Internal macro for CURL_CONFIGURE_REENTRANT.\n\nAC_DEFUN([CURL_CHECK_NEED_REENTRANT_SYSTEM], [\n  case $host in\n    *-*-solaris* | *-*-hpux*)\n      tmp_need_reentrant=\"yes\"\n      ;;\n    *)\n      tmp_need_reentrant=\"no\"\n      ;;\n  esac\n])\n\n\ndnl CURL_CONFIGURE_FROM_NOW_ON_WITH_REENTRANT\ndnl -------------------------------------------------\ndnl This macro ensures that configuration tests done\ndnl after this will execute with preprocessor symbol\ndnl _REENTRANT defined. This macro also ensures that\ndnl the generated config file defines NEED_REENTRANT\ndnl and that in turn setup.h will define _REENTRANT.\ndnl Internal macro for CURL_CONFIGURE_REENTRANT.\n\nAC_DEFUN([CURL_CONFIGURE_FROM_NOW_ON_WITH_REENTRANT], [\nAC_DEFINE(NEED_REENTRANT, 1,\n  [Define to 1 if _REENTRANT preprocessor symbol must be defined.])\ncat >>confdefs.h <<_EOF\n#ifndef _REENTRANT\n#  define _REENTRANT\n#endif\n_EOF\n])\n\n\ndnl CURL_CONFIGURE_REENTRANT\ndnl -------------------------------------------------\ndnl This first checks if the preprocessor _REENTRANT\ndnl symbol is already defined. If it isn't currently\ndnl defined a set of checks are performed to verify\ndnl if its definition is required to make visible to\ndnl the compiler a set of *_r functions. Finally, if\ndnl _REENTRANT is already defined or needed it takes\ndnl care of making adjustments necessary to ensure\ndnl that it is defined equally for further configure\ndnl tests and generated config file.\n\nAC_DEFUN([CURL_CONFIGURE_REENTRANT], [\n  AC_PREREQ([2.50])dnl\n  #\n  AC_MSG_CHECKING([if _REENTRANT is already defined])\n  AC_COMPILE_IFELSE([\n    AC_LANG_PROGRAM([[\n    ]],[[\n#ifdef _REENTRANT\n      int dummy=1;\n#else\n      force compilation error\n#endif\n    ]])\n  ],[\n    AC_MSG_RESULT([yes])\n    tmp_reentrant_initially_defined=\"yes\"\n  ],[\n    AC_MSG_RESULT([no])\n    tmp_reentrant_initially_defined=\"no\"\n  ])\n  #\n  if test \"$tmp_reentrant_initially_defined\" = \"no\"; then\n    AC_MSG_CHECKING([if _REENTRANT is actually needed])\n    CURL_CHECK_NEED_REENTRANT_SYSTEM\n\n    if test \"$tmp_need_reentrant\" = \"yes\"; then\n      AC_MSG_RESULT([yes])\n    else\n      AC_MSG_RESULT([no])\n    fi\n  fi\n  #\n  AC_MSG_CHECKING([if _REENTRANT is onwards defined])\n  if test \"$tmp_reentrant_initially_defined\" = \"yes\" ||\n    test \"$tmp_need_reentrant\" = \"yes\"; then\n    CURL_CONFIGURE_FROM_NOW_ON_WITH_REENTRANT\n    AC_MSG_RESULT([yes])\n  else\n    AC_MSG_RESULT([no])\n  fi\n  #\n])\n\ndnl LIBSSH2_LIB_HAVE_LINKFLAGS\ndnl --------------------------\ndnl Wrapper around AC_LIB_HAVE_LINKFLAGS to also check $prefix/lib, if set.\ndnl\ndnl autoconf only checks $prefix/lib64 if gcc -print-search-dirs output\ndnl includes a directory named lib64. So, to find libraries in $prefix/lib\ndnl we append -L$prefix/lib to LDFLAGS before checking.\ndnl\ndnl For conveniece, $4 is expanded if [lib]$1 is found.\n\nAC_DEFUN([LIBSSH2_LIB_HAVE_LINKFLAGS], [\n  libssh2_save_CPPFLAGS=\"$CPPFLAGS\"\n  libssh2_save_LDFLAGS=\"$LDFLAGS\"\n\n  if test \"${with_lib$1_prefix+set}\" = set; then\n    CPPFLAGS=\"$CPPFLAGS${CPPFLAGS:+ }-I${with_lib$1_prefix}/include\"\n    LDFLAGS=\"$LDFLAGS${LDFLAGS:+ }-L${with_lib$1_prefix}/lib\"\n  fi\n\n  AC_LIB_HAVE_LINKFLAGS([$1], [$2], [$3])\n\n  LDFLAGS=\"$libssh2_save_LDFLAGS\"\n\n  if test \"$ac_cv_lib$1\" = \"yes\"; then :\n    $4\n  else\n    CPPFLAGS=\"$libssh2_save_CPPFLAGS\"\n  fi\n])\n\nAC_DEFUN([LIBSSH2_CHECK_CRYPTO], [\nif test \"$use_crypto\" = \"auto\" && test \"$found_crypto\" = \"none\" || test \"$use_crypto\" = \"$1\"; then\nm4_case([$1],\n[openssl], [\n  LIBSSH2_LIB_HAVE_LINKFLAGS([ssl], [crypto], [#include <openssl/ssl.h>], [\n    AC_DEFINE(LIBSSH2_OPENSSL, 1, [Use $1])\n    LIBSREQUIRED=\"$LIBSREQUIRED${LIBSREQUIRED:+ }libssl libcrypto\"\n\n    # Not all OpenSSL have AES-CTR functions.\n    libssh2_save_LIBS=\"$LIBS\"\n    LIBS=\"$LIBS $LIBSSL\"\n    AC_CHECK_FUNCS(EVP_aes_128_ctr)\n    LIBS=\"$libssh2_save_LIBS\"\n\n    found_crypto=\"$1\"\n    found_crypto_str=\"OpenSSL (AES-CTR: ${ac_cv_func_EVP_aes_128_ctr:-N/A})\"\n  ])\n],\n\n[libgcrypt], [\n  LIBSSH2_LIB_HAVE_LINKFLAGS([gcrypt], [], [#include <gcrypt.h>], [\n    AC_DEFINE(LIBSSH2_LIBGCRYPT, 1, [Use $1])\n    found_crypto=\"$1\"\n  ])\n],\n\n[mbedtls], [\n  LIBSSH2_LIB_HAVE_LINKFLAGS([mbedcrypto], [], [#include <mbedtls/version.h>], [\n    AC_DEFINE(LIBSSH2_MBEDTLS, 1, [Use $1])\n    found_crypto=\"$1\"\n    support_clear_memory=yes\n  ])\n],\n\n[wincng], [\n  # Look for Windows Cryptography API: Next Generation\n\n  AC_CHECK_HEADERS([ntdef.h ntstatus.h], [], [], [#include <windows.h>])\n  AC_CHECK_DECLS([SecureZeroMemory], [], [], [#include <windows.h>])\n\n  LIBSSH2_LIB_HAVE_LINKFLAGS([crypt32], [], [\n    #include <windows.h>\n    #include <wincrypt.h>\n  ])\n  LIBSSH2_LIB_HAVE_LINKFLAGS([bcrypt], [], [\n    #include <windows.h>\n    #include <bcrypt.h>\n  ], [\n    AC_DEFINE(LIBSSH2_WINCNG, 1, [Use $1])\n    found_crypto=\"$1\"\n    found_crypto_str=\"Windows Cryptography API: Next Generation\"\n    support_clear_memory=\"$ac_cv_have_decl_SecureZeroMemory\"\n  ])\n],\n)\n  test \"$found_crypto\" = \"none\" &&\n    crypto_errors=\"${crypto_errors}No $1 crypto library found!\n\"\nfi\n])\n\n\ndnl LIBSSH2_CHECK_OPTION_WERROR\ndnl -------------------------------------------------\ndnl Verify if configure has been invoked with option\ndnl --enable-werror or --disable-werror, and set\ndnl shell variable want_werror as appropriate.\n\nAC_DEFUN([LIBSSH2_CHECK_OPTION_WERROR], [\n  AC_BEFORE([$0],[LIBSSH2_CHECK_COMPILER])dnl\n  AC_MSG_CHECKING([whether to enable compiler warnings as errors])\n  OPT_COMPILER_WERROR=\"default\"\n  AC_ARG_ENABLE(werror,\nAC_HELP_STRING([--enable-werror],[Enable compiler warnings as errors])\nAC_HELP_STRING([--disable-werror],[Disable compiler warnings as errors]),\n  OPT_COMPILER_WERROR=$enableval)\n  case \"$OPT_COMPILER_WERROR\" in\n    no)\n      dnl --disable-werror option used\n      want_werror=\"no\"\n      ;;\n    default)\n      dnl configure option not specified\n      want_werror=\"no\"\n      ;;\n    *)\n      dnl --enable-werror option used\n      want_werror=\"yes\"\n      ;;\n  esac\n  AC_MSG_RESULT([$want_werror])\n\n  if test X\"$want_werror\" = Xyes; then\n    CFLAGS=\"$CFLAGS -Werror\"\n  fi\n])\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/appveyor.yml",
    "content": "# Copyright (c) 2014, Ruslan Baratov\n# Copyright (c) 2014, 2016 Alexander Lamaison\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are met:\n#\n# * Redistributions of source code must retain the above copyright notice, this\n#   list of conditions and the following disclaimer.\n#\n# * Redistributions in binary form must reproduce the above copyright notice,\n#   this list of conditions and the following disclaimer in the documentation\n#   and/or other materials provided with the distribution.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nos: Visual Studio 2015\n\nenvironment:\n  matrix:\n    - GENERATOR: \"Visual Studio 14 2015\"\n      BUILD_SHARED_LIBS: ON\n\n    - GENERATOR: \"Visual Studio 14 2015\"\n      BUILD_SHARED_LIBS: OFF\n\n    - GENERATOR: \"Visual Studio 12 2013\"\n      BUILD_SHARED_LIBS: ON\n\n    - GENERATOR: \"Visual Studio 12 2013\"\n      BUILD_SHARED_LIBS: OFF\n\n  digitalocean_access_token:\n    secure: 8qRitvrj69Xhf0Tmu27xnz5drmL2YhmOJLGpXIkYyTCC0JNtBoXW6fMcF3u4Uj1+pIQ+TjegQOwYimlz0oivKTro3v3EXro+osAMNJG6NKc=\n\nplatform:\n  - x86\n  - x64\n\nconfiguration:\n# - Debug\n  - Release\n\nmatrix:\n  fast_finish: true\n  allow_failures:\n    - GENERATOR: \"Visual Studio 9 2008\"\n      platform: x64\n\ninstall:\n  - choco install -y docker\n  - choco install -y docker-machine\n\nbuild_script:\n  - ps: if($env:PLATFORM -eq \"x64\") { $env:CMAKE_GEN_SUFFIX=\" Win64\" }\n  - cmake \"-G%GENERATOR%%CMAKE_GEN_SUFFIX%\" -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS% -H. -B_builds\n  - cmake --build _builds --config \"%CONFIGURATION%\"\n\nbefore_test:\n  - set DOCKER_MACHINE_NAME=appveyor-%APPVEYOR_PROJECT_SLUG%-%APPVEYOR_JOB_ID%\n  - ps: if($env:digitalocean_access_token) { echo \"Using DigitalOcean for testing.\" } else { echo \"DigitalOcean not available. Skipping testing.\" }\n  - ps: if($env:digitalocean_access_token) { docker-machine create --driver digitalocean --digitalocean-access-token $($env:digitalocean_access_token) $($env:DOCKER_MACHINE_NAME) }\n  - ps: if($env:digitalocean_access_token) { docker-machine env $($env:DOCKER_MACHINE_NAME) --shell powershell | Invoke-Expression }\n\ntest_script:\n  - ps: cd _builds\n  - ps: if($env:digitalocean_access_token) { ctest -VV -C $($env:CONFIGURATION) --output-on-failure }\n\nafter_test:\n  - ps: if($env:digitalocean_access_token) { docker-machine rm -y $($env:DOCKER_MACHINE_NAME) }\n\non_failure:\n  - ps: if($env:digitalocean_access_token) { docker-machine rm -y $($env:DOCKER_MACHINE_NAME) }\n  - ps: if(Test-Path _builds/CMakeFiles/CMakeOutput.log) { cat _builds/CMakeFiles/CMakeOutput.log }\n  - ps: if(Test-Path _builds/CMakeFiles/CMakeError.log) { cat _builds/CMakeFiles/CMakeError.log }\n\n# whitelist branches to avoid testing feature branches twice (as branch and as pull request)\nbranches:\n    only:\n        - master\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/buildconf",
    "content": "#!/bin/sh\n\nLIBTOOLIZE=\"libtoolize\"\n\nif [ \"x`which $LIBTOOLIZE`\" = \"x\" ]; then\n    LIBTOOLIZE=\"glibtoolize\"\nfi\n\nif [ \"x`which $LIBTOOLIZE`\" = \"x\" ]; then\n    echo \"Neither libtoolize nor glibtoolize could be found!\"\n    exit 1\nfi\n\n${LIBTOOLIZE} --copy --automake --force\n${ACLOCAL:-aclocal} -I m4 $ACLOCAL_FLAGS\n${AUTOHEADER:-autoheader}\n# copy the private libssh2_config.h.in to the examples dir so that\n# it can be included without pointing the include path to the private\n# source dir\ncp src/libssh2_config.h.in example/libssh2_config.h.in\n${AUTOCONF:-autoconf}\n${AUTOMAKE:-automake} --add-missing --copy\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/cmake/CheckFunctionExistsMayNeedLibrary.cmake",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\n\n# - check_function_exists_maybe_need_library(<function> <var> [lib1 ... libn])\n#\n# Check if function is available for linking, first without extra libraries, and\n# then, if not found that way, linking in each optional library as well.  This\n# function is similar to autotools AC_SEARCH_LIBS.\n#\n# If the function if found, this will define <var>.\n#\n# If the function was only found by linking in an additional library, this\n# will define NEED_LIB_LIBX, where LIBX is the one of lib1 to libn that\n# makes the function available, in uppercase.\n#\n# The following variables may be set before calling this macro to\n# modify the way the check is run:\n#\n#  CMAKE_REQUIRED_FLAGS = string of compile command line flags\n#  CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)\n#  CMAKE_REQUIRED_INCLUDES = list of include directories\n#  CMAKE_REQUIRED_LIBRARIES = list of libraries to link\n#\n\ninclude(CheckFunctionExists)\ninclude(CheckLibraryExists)\n\nfunction(check_function_exists_may_need_library function variable)\n\n  check_function_exists(${function} ${variable})\n\n  if(NOT ${variable})\n    foreach(lib ${ARGN})\n      string(TOUPPER ${lib} UP_LIB)\n      # Use new variable to prevent cache from previous step shortcircuiting\n      # new test\n      check_library_exists(${lib} ${function} \"\" HAVE_${function}_IN_${lib})\n      if(HAVE_${function}_IN_${lib})\n\tset(${variable} 1 CACHE INTERNAL\n\t  \"Function ${function} found in library ${lib}\")\n\tset(NEED_LIB_${UP_LIB} 1 CACHE INTERNAL\n\t  \"Need to link ${lib}\")\n\tbreak()\n      endif()\n    endforeach()\n  endif()\n\nendfunction()"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/cmake/CheckNonblockingSocketSupport.cmake",
    "content": "include(CheckCSourceCompiles)\n\n# - check_nonblocking_socket_support()\n#\n# Check for how to set a socket to non-blocking state. There seems to exist\n# four known different ways, with the one used almost everywhere being POSIX\n# and XPG3, while the other different ways for different systems (old BSD,\n# Windows and Amiga).\n#\n# One of the following variables will be set indicating the supported\n# method (if any):\n#   HAVE_O_NONBLOCK\n#   HAVE_FIONBIO\n#   HAVE_IOCTLSOCKET\n#   HAVE_IOCTLSOCKET_CASE\n#   HAVE_SO_NONBLOCK\n#   HAVE_DISABLED_NONBLOCKING\n#\n# The following variables may be set before calling this macro to\n# modify the way the check is run:\n#\n#  CMAKE_REQUIRED_FLAGS = string of compile command line flags\n#  CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)\n#  CMAKE_REQUIRED_INCLUDES = list of include directories\n#  CMAKE_REQUIRED_LIBRARIES = list of libraries to link\n#\nmacro(check_nonblocking_socket_support)\n  # There are two known platforms (AIX 3.x and SunOS 4.1.x) where the\n  # O_NONBLOCK define is found but does not work.\n  check_c_source_compiles(\"\n#include <sys/types.h>\n#include <unistd.h>\n#include <fcntl.h>\n\n#if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)\n# if defined(__SVR4) || defined(__srv4__)\n#  define PLATFORM_SOLARIS\n# else\n#  define PLATFORM_SUNOS4\n# endif\n#endif\n#if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX41)\n# define PLATFORM_AIX_V3\n#endif\n\n#if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__)\n#error \\\"O_NONBLOCK does not work on this platform\\\"\n#endif\n\nint main()\n{\n    int socket;\n    int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK);\n}\"\n  HAVE_O_NONBLOCK)\n\n  if(NOT HAVE_O_NONBLOCK)\n    check_c_source_compiles(\"/* FIONBIO test (old-style unix) */\n#include <unistd.h>\n#include <stropts.h>\n\nint main()\n{\n    int socket;\n    int flags = ioctl(socket, FIONBIO, &flags);\n}\"\n    HAVE_FIONBIO)\n\n    if(NOT HAVE_FIONBIO)\n      check_c_source_compiles(\"/* ioctlsocket test (Windows) */\n#undef inline\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n\n#include <windows.h>\n#include <winsock2.h>\n\nint main()\n{\n    SOCKET sd;\n    unsigned long flags = 0;\n    sd = socket(0, 0, 0);\n    ioctlsocket(sd, FIONBIO, &flags);\n}\"\n      HAVE_IOCTLSOCKET)\n\n      if(NOT HAVE_IOCTLSOCKET)\n\tcheck_c_source_compiles(\"/* IoctlSocket test (Amiga?) */\n#include <sys/ioctl.h>\n\nint main()\n{\n    int socket;\n    int flags = IoctlSocket(socket, FIONBIO, (long)1);\n}\"\n        HAVE_IOCTLSOCKET_CASE)\n\n        if(NOT HAVE_IOCTLSOCKET_CASE)\n\t  check_c_source_compiles(\"/* SO_NONBLOCK test (BeOS) */\n#include <socket.h>\n\nint main()\n{\n    long b = 1;\n    int socket;\n    int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));\n}\"\n          HAVE_SO_NONBLOCK)\n\n\t  if(NOT HAVE_SO_NONBLOCK)\n\t    # No non-blocking socket method found\n\t    set(HAVE_DISABLED_NONBLOCKING 1)\n\t  endif()\n\tendif()\n      endif()\n    endif()\n  endif()\nendmacro()"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/cmake/CopyRuntimeDependencies.cmake",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\ninclude(CMakeParseArguments)\n\nfunction(ADD_TARGET_TO_COPY_DEPENDENCIES)\n  set(options)\n  set(oneValueArgs TARGET)\n  set(multiValueArgs DEPENDENCIES BEFORE_TARGETS)\n  cmake_parse_arguments(COPY\n    \"${options}\" \"${oneValueArgs}\" \"${multiValueArgs}\" ${ARGN})\n\n  if(NOT COPY_DEPENDENCIES)\n    return()\n  endif()\n\n  # Using a custom target to drive custom commands stops multiple\n  # parallel builds trying to kick off the commands at the same time\n  add_custom_target(${COPY_TARGET})\n\n  foreach(target ${COPY_BEFORE_TARGETS})\n    add_dependencies(${target} ${COPY_TARGET})\n  endforeach()\n\n  foreach(dependency ${COPY_DEPENDENCIES})\n\n    add_custom_command(\n      TARGET ${COPY_TARGET}\n      DEPENDS ${dependency}\n      # Make directory first otherwise file is copied in place of\n      # directory instead of into it\n      COMMAND ${CMAKE_COMMAND}\n      ARGS -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}\n      COMMAND ${CMAKE_COMMAND}\n      ARGS -E copy ${dependency} ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}\n      VERBATIM)\n\n  endforeach()\n\nendfunction()\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/cmake/FindLibgcrypt.cmake",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\n# - Try to find Libgcrypt\n# This will define all or none of:\n#  LIBGCRYPT_FOUND - if Libgcrypt headers and library was found\n#  LIBGCRYPT_INCLUDE_DIRS - The Libgcrypt include directories\n#  LIBGCRYPT_LIBRARIES - The libraries needed to use Libgcrypt\n\nfind_path(LIBGCRYPT_INCLUDE_DIR gcrypt.h)\n\nfind_library(LIBGCRYPT_LIBRARY NAMES gcrypt libgcrypt)\n\nset(LIBGCRYPT_LIBRARIES ${LIBGCRYPT_LIBRARY})\nset(LIBGCRYPT_INCLUDE_DIRS ${LIBGCRYPT_INCLUDE_DIR})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Libgcrypt DEFAULT_MSG\n                                  LIBGCRYPT_LIBRARY LIBGCRYPT_INCLUDE_DIR)\n\nmark_as_advanced(LIBGCRYPT_INCLUDE_DIR LIBGCRYPT_LIBRARY)"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/cmake/FindmbedTLS.cmake",
    "content": "# - Try to find mbedTLS\n# Once done this will define\n#\n# Read-Only variables\n#  MBEDTLS_FOUND - system has mbedTLS\n#  MBEDTLS_INCLUDE_DIR - the mbedTLS include directory\n#  MBEDTLS_LIBRARY_DIR - the mbedTLS library directory\n#  MBEDTLS_LIBRARIES - Link these to use mbedTLS\n#  MBEDTLS_LIBRARY - path to mbedTLS library\n#  MBEDX509_LIBRARY - path to mbedTLS X.509 library\n#  MBEDCRYPTO_LIBRARY - path to mbedTLS Crypto library\n\nFIND_PATH(MBEDTLS_INCLUDE_DIR mbedtls/version.h)\n\nIF(MBEDTLS_INCLUDE_DIR AND MBEDTLS_LIBRARIES)\n    # Already in cache, be silent\n    SET(MBEDTLS_FIND_QUIETLY TRUE)\nENDIF()\n\nFIND_LIBRARY(MBEDTLS_LIBRARY NAMES mbedtls libmbedtls libmbedx509)\nFIND_LIBRARY(MBEDX509_LIBRARY NAMES mbedx509 libmbedx509)\nFIND_LIBRARY(MBEDCRYPTO_LIBRARY NAMES mbedcrypto libmbedcrypto)\n\nIF(MBEDTLS_INCLUDE_DIR AND MBEDTLS_LIBRARY AND MBEDX509_LIBRARY AND MBEDCRYPTO_LIBRARY)\n     SET(MBEDTLS_FOUND TRUE)\nENDIF()\n\nIF(MBEDTLS_FOUND)\n    # split mbedTLS into -L and -l linker options, so we can set them for pkg-config\n    GET_FILENAME_COMPONENT(MBEDTLS_LIBRARY_DIR ${MBEDTLS_LIBRARY} PATH)\n    GET_FILENAME_COMPONENT(MBEDTLS_LIBRARY_FILE ${MBEDTLS_LIBRARY} NAME_WE)\n    GET_FILENAME_COMPONENT(MBEDX509_LIBRARY_FILE ${MBEDX509_LIBRARY} NAME_WE)\n    GET_FILENAME_COMPONENT(MBEDCRYPTO_LIBRARY_FILE ${MBEDCRYPTO_LIBRARY} NAME_WE)\n    STRING(REGEX REPLACE \"^lib\" \"\" MBEDTLS_LIBRARY_FILE ${MBEDTLS_LIBRARY_FILE})\n    STRING(REGEX REPLACE \"^lib\" \"\" MBEDX509_LIBRARY_FILE ${MBEDX509_LIBRARY_FILE})\n    STRING(REGEX REPLACE \"^lib\" \"\" MBEDCRYPTO_LIBRARY_FILE ${MBEDCRYPTO_LIBRARY_FILE})\n    SET(MBEDTLS_LIBRARIES \"-L${MBEDTLS_LIBRARY_DIR} -l${MBEDTLS_LIBRARY_FILE} -l${MBEDX509_LIBRARY_FILE} -l${MBEDCRYPTO_LIBRARY_FILE}\")\n\n    IF(NOT MBEDTLS_FIND_QUIETLY)\n        MESSAGE(STATUS \"Found mbedTLS:\")\n        FILE(READ ${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h MBEDTLSCONTENT)\n        STRING(REGEX MATCH \"MBEDTLS_VERSION_STRING +\\\"[0-9|.]+\\\"\" MBEDTLSMATCH ${MBEDTLSCONTENT})\n        IF (MBEDTLSMATCH)\n            STRING(REGEX REPLACE \"MBEDTLS_VERSION_STRING +\\\"([0-9|.]+)\\\"\" \"\\\\1\" MBEDTLS_VERSION ${MBEDTLSMATCH})\n            MESSAGE(STATUS \"  version ${MBEDTLS_VERSION}\")\n        ENDIF(MBEDTLSMATCH)\n        MESSAGE(STATUS \"  TLS: ${MBEDTLS_LIBRARY}\")\n        MESSAGE(STATUS \"  X509: ${MBEDX509_LIBRARY}\")\n        MESSAGE(STATUS \"  Crypto: ${MBEDCRYPTO_LIBRARY}\")\n    ENDIF(NOT MBEDTLS_FIND_QUIETLY)\nELSE(MBEDTLS_FOUND)\n    IF(MBEDTLS_FIND_REQUIRED)\n        MESSAGE(FATAL_ERROR \"Could not find mbedTLS\")\n    ENDIF(MBEDTLS_FIND_REQUIRED)\nENDIF(MBEDTLS_FOUND)\n\nMARK_AS_ADVANCED(\n    MBEDTLS_INCLUDE_DIR\n    MBEDTLS_LIBRARY_DIR\n    MBEDTLS_LIBRARIES\n    MBEDTLS_LIBRARY\n    MBEDX509_LIBRARY\n    MBEDCRYPTO_LIBRARY\n)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/cmake/SocketLibraries.cmake",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\n# Some systems have their socket functions in a library.\n# (Solaris -lsocket/-lnsl, Windows -lws2_32).  This macro appends those\n# libraries to the given list\nmacro(append_needed_socket_libraries LIBRARIES_LIST)\n  if(CMAKE_SYSTEM_NAME STREQUAL \"Windows\" AND CMAKE_SIZEOF_VOID_P EQUAL 4)\n    # x86 Windows uses STDCALL for these functions, so their names are mangled,\n    # meaning the platform checks don't work. Hardcoding these until we get\n    # a better solution.\n    set(HAVE_SOCKET 1)\n    set(HAVE_SELECT 1)\n    set(HAVE_INET_ADDR 1)\n    set(NEED_LIB_WS2_32 1)\n  else()\n    check_function_exists_may_need_library(socket HAVE_SOCKET socket ws2_32)\n    check_function_exists_may_need_library(select HAVE_SELECT ws2_32)\n    check_function_exists_may_need_library(inet_addr HAVE_INET_ADDR nsl ws2_32)\n  endif()\n\n  if(NEED_LIB_SOCKET)\n    list(APPEND ${LIBRARIES_LIST} socket)\n  endif()\n  if(NEED_LIB_NSL)\n    list(APPEND ${LIBRARIES_LIST} nsl)\n  endif()\n  if(NEED_LIB_WS2_32)\n    list(APPEND ${LIBRARIES_LIST} ws2_32)\n  endif()\n\nendmacro()"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/cmake/Toolchain-Linux-32.cmake",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\n# Cross-compile 32-bit binary on 64-bit linux host\nset(CMAKE_SYSTEM_NAME Linux)\nset(CMAKE_SYSTEM_VERSION 1)\nset(CMAKE_SYSTEM_PROCESSOR \"i386\")\n\nset(CMAKE_CXX_COMPILER_ARG1 \"-m32\")\nset(CMAKE_C_COMPILER_ARG1 \"-m32\")"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/cmake/max_warnings.cmake",
    "content": "if(MSVC)\n  # Use the highest warning level for visual studio.\n  if(CMAKE_CXX_FLAGS MATCHES \"/W[0-4]\")\n    string(REGEX REPLACE \"/W[0-4]\" \"/W4\" CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS}\")\n  else()\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} /W4\")\n  endif()\n  if(CMAKE_C_FLAGS MATCHES \"/W[0-4]\")\n    string(REGEX REPLACE \"/W[0-4]\" \"/W4\" CMAKE_C_FLAGS \"${CMAKE_C_FLAGS}\")\n  else()\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} /W4\")\n  endif()\n\n  # Disable broken warnings\n  add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)\nelseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)\n  if(NOT CMAKE_CXX_FLAGS MATCHES \"-Wall\")\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wall\")\n  endif()\n  if(NOT CMAKE_C_FLAGS MATCHES \"-Wall\")\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Wall\")\n  endif()\nendif()\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/config.rpath",
    "content": "#! /bin/sh\n# Output a system dependent set of variables, describing how to set the\n# run time search path of shared libraries in an executable.\n#\n#   Copyright 1996-2006 Free Software Foundation, Inc.\n#   Taken from GNU libtool, 2001\n#   Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996\n#\n#   This file is free software; the Free Software Foundation gives\n#   unlimited permission to copy and/or distribute it, with or without\n#   modifications, as long as this notice is preserved.\n#\n# The first argument passed to this file is the canonical host specification,\n#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM\n# or\n#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM\n# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld\n# should be set by the caller.\n#\n# The set of defined variables is at the end of this script.\n\n# Known limitations:\n# - On IRIX 6.5 with CC=\"cc\", the run time search patch must not be longer\n#   than 256 bytes, otherwise the compiler driver will dump core. The only\n#   known workaround is to choose shorter directory names for the build\n#   directory and/or the installation directory.\n\n# All known linkers require a `.a' archive for static linking (except MSVC,\n# which needs '.lib').\nlibext=a\nshrext=.so\n\nhost=\"$1\"\nhost_cpu=`echo \"$host\" | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\1/'`\nhost_vendor=`echo \"$host\" | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\2/'`\nhost_os=`echo \"$host\" | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\3/'`\n\n# Code taken from libtool.m4's _LT_CC_BASENAME.\n\nfor cc_temp in $CC\"\"; do\n  case $cc_temp in\n    compile | *[\\\\/]compile | ccache | *[\\\\/]ccache ) ;;\n    distcc | *[\\\\/]distcc | purify | *[\\\\/]purify ) ;;\n    \\-*) ;;\n    *) break;;\n  esac\ndone\ncc_basename=`echo \"$cc_temp\" | sed -e 's%^.*/%%'`\n\n# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC.\n\nwl=\nif test \"$GCC\" = yes; then\n  wl='-Wl,'\nelse\n  case \"$host_os\" in\n    aix*)\n      wl='-Wl,'\n      ;;\n    darwin*)\n      case $cc_basename in\n        xlc*)\n          wl='-Wl,'\n          ;;\n      esac\n      ;;\n    mingw* | pw32* | os2*)\n      ;;\n    hpux9* | hpux10* | hpux11*)\n      wl='-Wl,'\n      ;;\n    irix5* | irix6* | nonstopux*)\n      wl='-Wl,'\n      ;;\n    newsos6)\n      ;;\n    linux*)\n      case $cc_basename in\n        icc* | ecc*)\n          wl='-Wl,'\n          ;;\n        pgcc | pgf77 | pgf90)\n          wl='-Wl,'\n          ;;\n        ccc*)\n          wl='-Wl,'\n          ;;\n        como)\n          wl='-lopt='\n          ;;\n        *)\n          case `$CC -V 2>&1 | sed 5q` in\n            *Sun\\ C*)\n              wl='-Wl,'\n              ;;\n          esac\n          ;;\n      esac\n      ;;\n    osf3* | osf4* | osf5*)\n      wl='-Wl,'\n      ;;\n    sco3.2v5*)\n      ;;\n    solaris*)\n      wl='-Wl,'\n      ;;\n    sunos4*)\n      wl='-Qoption ld '\n      ;;\n    sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n      wl='-Wl,'\n      ;;\n    sysv4*MP*)\n      ;;\n    unicos*)\n      wl='-Wl,'\n      ;;\n    uts4*)\n      ;;\n  esac\nfi\n\n# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS.\n\nhardcode_libdir_flag_spec=\nhardcode_libdir_separator=\nhardcode_direct=no\nhardcode_minus_L=no\n\ncase \"$host_os\" in\n  cygwin* | mingw* | pw32*)\n    # FIXME: the MSVC++ port hasn't been tested in a loooong time\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++.\n    if test \"$GCC\" != yes; then\n      with_gnu_ld=no\n    fi\n    ;;\n  interix*)\n    # we just hope/assume this is gcc and not c89 (= MSVC++)\n    with_gnu_ld=yes\n    ;;\n  openbsd*)\n    with_gnu_ld=no\n    ;;\nesac\n\nld_shlibs=yes\nif test \"$with_gnu_ld\" = yes; then\n  # Set some defaults for GNU ld with shared library support. These\n  # are reset later if shared libraries are not supported. Putting them\n  # here allows them to be overridden if necessary.\n  # Unlike libtool, we use -rpath here, not --rpath, since the documented\n  # option of GNU ld is called -rpath, not --rpath.\n  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n  case \"$host_os\" in\n    aix3* | aix4* | aix5*)\n      # On AIX/PPC, the GNU linker is very broken\n      if test \"$host_cpu\" != ia64; then\n        ld_shlibs=no\n      fi\n      ;;\n    amigaos*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_minus_L=yes\n      # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports\n      # that the semantics of dynamic libraries on AmigaOS, at least up\n      # to version 4, is to share data among multiple programs linked\n      # with the same dynamic library.  Since this doesn't match the\n      # behavior of shared libraries on other platforms, we cannot use\n      # them.\n      ld_shlibs=no\n      ;;\n    beos*)\n      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then\n        :\n      else\n        ld_shlibs=no\n      fi\n      ;;\n    cygwin* | mingw* | pw32*)\n      # hardcode_libdir_flag_spec is actually meaningless, as there is\n      # no search path for DLLs.\n      hardcode_libdir_flag_spec='-L$libdir'\n      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then\n        :\n      else\n        ld_shlibs=no\n      fi\n      ;;\n    interix3*)\n      hardcode_direct=no\n      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n      ;;\n    linux*)\n      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then\n        :\n      else\n        ld_shlibs=no\n      fi\n      ;;\n    netbsd*)\n      ;;\n    solaris*)\n      if $LD -v 2>&1 | grep 'BFD 2\\.8' > /dev/null; then\n        ld_shlibs=no\n      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then\n        :\n      else\n        ld_shlibs=no\n      fi\n      ;;\n    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)\n      case `$LD -v 2>&1` in\n        *\\ [01].* | *\\ 2.[0-9].* | *\\ 2.1[0-5].*)\n          ld_shlibs=no\n          ;;\n        *)\n          if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then\n            hardcode_libdir_flag_spec='`test -z \"$SCOABSPATH\" && echo ${wl}-rpath,$libdir`'\n          else\n            ld_shlibs=no\n          fi\n          ;;\n      esac\n      ;;\n    sunos4*)\n      hardcode_direct=yes\n      ;;\n    *)\n      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then\n        :\n      else\n        ld_shlibs=no\n      fi\n      ;;\n  esac\n  if test \"$ld_shlibs\" = no; then\n    hardcode_libdir_flag_spec=\n  fi\nelse\n  case \"$host_os\" in\n    aix3*)\n      # Note: this linker hardcodes the directories in LIBPATH if there\n      # are no directories specified by -L.\n      hardcode_minus_L=yes\n      if test \"$GCC\" = yes; then\n        # Neither direct hardcoding nor static linking is supported with a\n        # broken collect2.\n        hardcode_direct=unsupported\n      fi\n      ;;\n    aix4* | aix5*)\n      if test \"$host_cpu\" = ia64; then\n        # On IA64, the linker does run time linking by default, so we don't\n        # have to do anything special.\n        aix_use_runtimelinking=no\n      else\n        aix_use_runtimelinking=no\n        # Test if we are trying to use run time linking or normal\n        # AIX style linking. If -brtl is somewhere in LDFLAGS, we\n        # need to do runtime linking.\n        case $host_os in aix4.[23]|aix4.[23].*|aix5*)\n          for ld_flag in $LDFLAGS; do\n            if (test $ld_flag = \"-brtl\" || test $ld_flag = \"-Wl,-brtl\"); then\n              aix_use_runtimelinking=yes\n              break\n            fi\n          done\n          ;;\n        esac\n      fi\n      hardcode_direct=yes\n      hardcode_libdir_separator=':'\n      if test \"$GCC\" = yes; then\n        case $host_os in aix4.[012]|aix4.[012].*)\n          collect2name=`${CC} -print-prog-name=collect2`\n          if test -f \"$collect2name\" && \\\n            strings \"$collect2name\" | grep resolve_lib_name >/dev/null\n          then\n            # We have reworked collect2\n            hardcode_direct=yes\n          else\n            # We have old collect2\n            hardcode_direct=unsupported\n            hardcode_minus_L=yes\n            hardcode_libdir_flag_spec='-L$libdir'\n            hardcode_libdir_separator=\n          fi\n          ;;\n        esac\n      fi\n      # Begin _LT_AC_SYS_LIBPATH_AIX.\n      echo 'int main () { return 0; }' > conftest.c\n      ${CC} ${LDFLAGS} conftest.c -o conftest\n      aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\\(.*\\)$/\\1/; p; }\n}'`\n      if test -z \"$aix_libpath\"; then\n        aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\\(.*\\)$/\\1/; p; }\n}'`\n      fi\n      if test -z \"$aix_libpath\"; then\n        aix_libpath=\"/usr/lib:/lib\"\n      fi\n      rm -f conftest.c conftest\n      # End _LT_AC_SYS_LIBPATH_AIX.\n      if test \"$aix_use_runtimelinking\" = yes; then\n        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n      else\n        if test \"$host_cpu\" = ia64; then\n          hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'\n        else\n          hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n        fi\n      fi\n      ;;\n    amigaos*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_minus_L=yes\n      # see comment about different semantics on the GNU ld section\n      ld_shlibs=no\n      ;;\n    bsdi[45]*)\n      ;;\n    cygwin* | mingw* | pw32*)\n      # When not using gcc, we currently assume that we are using\n      # Microsoft Visual C++.\n      # hardcode_libdir_flag_spec is actually meaningless, as there is\n      # no search path for DLLs.\n      hardcode_libdir_flag_spec=' '\n      libext=lib\n      ;;\n    darwin* | rhapsody*)\n      hardcode_direct=no\n      if test \"$GCC\" = yes ; then\n        :\n      else\n        case $cc_basename in\n          xlc*)\n            ;;\n          *)\n            ld_shlibs=no\n            ;;\n        esac\n      fi\n      ;;\n    dgux*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      ;;\n    freebsd1*)\n      ld_shlibs=no\n      ;;\n    freebsd2.2*)\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      ;;\n    freebsd2*)\n      hardcode_direct=yes\n      hardcode_minus_L=yes\n      ;;\n    freebsd* | kfreebsd*-gnu | dragonfly*)\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      ;;\n    hpux9*)\n      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n      hardcode_libdir_separator=:\n      hardcode_direct=yes\n      # hardcode_minus_L: Not really in the search PATH,\n      # but as the default location of the library.\n      hardcode_minus_L=yes\n      ;;\n    hpux10*)\n      if test \"$with_gnu_ld\" = no; then\n        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n        hardcode_libdir_separator=:\n        hardcode_direct=yes\n        # hardcode_minus_L: Not really in the search PATH,\n        # but as the default location of the library.\n        hardcode_minus_L=yes\n      fi\n      ;;\n    hpux11*)\n      if test \"$with_gnu_ld\" = no; then\n        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n        hardcode_libdir_separator=:\n        case $host_cpu in\n          hppa*64*|ia64*)\n            hardcode_direct=no\n            ;;\n          *)\n            hardcode_direct=yes\n            # hardcode_minus_L: Not really in the search PATH,\n            # but as the default location of the library.\n            hardcode_minus_L=yes\n            ;;\n        esac\n      fi\n      ;;\n    irix5* | irix6* | nonstopux*)\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      ;;\n    netbsd*)\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      ;;\n    newsos6)\n      hardcode_direct=yes\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      ;;\n    openbsd*)\n      hardcode_direct=yes\n      if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n        hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n      else\n        case \"$host_os\" in\n          openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)\n            hardcode_libdir_flag_spec='-R$libdir'\n            ;;\n          *)\n            hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n            ;;\n        esac\n      fi\n      ;;\n    os2*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_minus_L=yes\n      ;;\n    osf3*)\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      ;;\n    osf4* | osf5*)\n      if test \"$GCC\" = yes; then\n        hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      else\n        # Both cc and cxx compiler support -rpath directly\n        hardcode_libdir_flag_spec='-rpath $libdir'\n      fi\n      hardcode_libdir_separator=:\n      ;;\n    solaris*)\n      hardcode_libdir_flag_spec='-R$libdir'\n      ;;\n    sunos4*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_direct=yes\n      hardcode_minus_L=yes\n      ;;\n    sysv4)\n      case $host_vendor in\n        sni)\n          hardcode_direct=yes # is this really true???\n          ;;\n        siemens)\n          hardcode_direct=no\n          ;;\n        motorola)\n          hardcode_direct=no #Motorola manual says yes, but my tests say they lie\n          ;;\n      esac\n      ;;\n    sysv4.3*)\n      ;;\n    sysv4*MP*)\n      if test -d /usr/nec; then\n        ld_shlibs=yes\n      fi\n      ;;\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)\n      ;;\n    sysv5* | sco3.2v5* | sco5v6*)\n      hardcode_libdir_flag_spec='`test -z \"$SCOABSPATH\" && echo ${wl}-R,$libdir`'\n      hardcode_libdir_separator=':'\n      ;;\n    uts4*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      ;;\n    *)\n      ld_shlibs=no\n      ;;\n  esac\nfi\n\n# Check dynamic linker characteristics\n# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.\n# Unlike libtool.m4, here we don't care about _all_ names of the library, but\n# only about the one the linker finds when passed -lNAME. This is the last\n# element of library_names_spec in libtool.m4, or possibly two of them if the\n# linker has special search rules.\nlibrary_names_spec=      # the last element of library_names_spec in libtool.m4\nlibname_spec='lib$name'\ncase \"$host_os\" in\n  aix3*)\n    library_names_spec='$libname.a'\n    ;;\n  aix4* | aix5*)\n    library_names_spec='$libname$shrext'\n    ;;\n  amigaos*)\n    library_names_spec='$libname.a'\n    ;;\n  beos*)\n    library_names_spec='$libname$shrext'\n    ;;\n  bsdi[45]*)\n    library_names_spec='$libname$shrext'\n    ;;\n  cygwin* | mingw* | pw32*)\n    shrext=.dll\n    library_names_spec='$libname.dll.a $libname.lib'\n    ;;\n  darwin* | rhapsody*)\n    shrext=.dylib\n    library_names_spec='$libname$shrext'\n    ;;\n  dgux*)\n    library_names_spec='$libname$shrext'\n    ;;\n  freebsd1*)\n    ;;\n  kfreebsd*-gnu)\n    library_names_spec='$libname$shrext'\n    ;;\n  freebsd* | dragonfly*)\n    case \"$host_os\" in\n      freebsd[123]*)\n        library_names_spec='$libname$shrext$versuffix' ;;\n      *)\n        library_names_spec='$libname$shrext' ;;\n    esac\n    ;;\n  gnu*)\n    library_names_spec='$libname$shrext'\n    ;;\n  hpux9* | hpux10* | hpux11*)\n    case $host_cpu in\n      ia64*)\n        shrext=.so\n        ;;\n      hppa*64*)\n        shrext=.sl\n        ;;\n      *)\n        shrext=.sl\n        ;;\n    esac\n    library_names_spec='$libname$shrext'\n    ;;\n  interix3*)\n    library_names_spec='$libname$shrext'\n    ;;\n  irix5* | irix6* | nonstopux*)\n    library_names_spec='$libname$shrext'\n    case \"$host_os\" in\n      irix5* | nonstopux*)\n        libsuff= shlibsuff=\n        ;;\n      *)\n        case $LD in\n          *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \") libsuff= shlibsuff= ;;\n          *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \") libsuff=32 shlibsuff=N32 ;;\n          *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \") libsuff=64 shlibsuff=64 ;;\n          *) libsuff= shlibsuff= ;;\n        esac\n        ;;\n    esac\n    ;;\n  linux*oldld* | linux*aout* | linux*coff*)\n    ;;\n  linux*)\n    library_names_spec='$libname$shrext'\n    ;;\n  knetbsd*-gnu)\n    library_names_spec='$libname$shrext'\n    ;;\n  netbsd*)\n    library_names_spec='$libname$shrext'\n    ;;\n  newsos6)\n    library_names_spec='$libname$shrext'\n    ;;\n  nto-qnx*)\n    library_names_spec='$libname$shrext'\n    ;;\n  openbsd*)\n    library_names_spec='$libname$shrext$versuffix'\n    ;;\n  os2*)\n    libname_spec='$name'\n    shrext=.dll\n    library_names_spec='$libname.a'\n    ;;\n  osf3* | osf4* | osf5*)\n    library_names_spec='$libname$shrext'\n    ;;\n  solaris*)\n    library_names_spec='$libname$shrext'\n    ;;\n  sunos4*)\n    library_names_spec='$libname$shrext$versuffix'\n    ;;\n  sysv4 | sysv4.3*)\n    library_names_spec='$libname$shrext'\n    ;;\n  sysv4*MP*)\n    library_names_spec='$libname$shrext'\n    ;;\n  sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n    library_names_spec='$libname$shrext'\n    ;;\n  uts4*)\n    library_names_spec='$libname$shrext'\n    ;;\nesac\n\nsed_quote_subst='s/\\([\"`$\\\\]\\)/\\\\\\1/g'\nescaped_wl=`echo \"X$wl\" | sed -e 's/^X//' -e \"$sed_quote_subst\"`\nshlibext=`echo \"$shrext\" | sed -e 's,^\\.,,'`\nescaped_libname_spec=`echo \"X$libname_spec\" | sed -e 's/^X//' -e \"$sed_quote_subst\"`\nescaped_library_names_spec=`echo \"X$library_names_spec\" | sed -e 's/^X//' -e \"$sed_quote_subst\"`\nescaped_hardcode_libdir_flag_spec=`echo \"X$hardcode_libdir_flag_spec\" | sed -e 's/^X//' -e \"$sed_quote_subst\"`\n\nLC_ALL=C sed -e 's/^\\([a-zA-Z0-9_]*\\)=/acl_cv_\\1=/' <<EOF\n\n# How to pass a linker flag through the compiler.\nwl=\"$escaped_wl\"\n\n# Static library suffix (normally \"a\").\nlibext=\"$libext\"\n\n# Shared library suffix (normally \"so\").\nshlibext=\"$shlibext\"\n\n# Format of library name prefix.\nlibname_spec=\"$escaped_libname_spec\"\n\n# Library names that the linker finds when passed -lNAME.\nlibrary_names_spec=\"$escaped_library_names_spec\"\n\n# Flag to hardcode \\$libdir into a binary during linking.\n# This must work even if \\$libdir does not exist.\nhardcode_libdir_flag_spec=\"$escaped_hardcode_libdir_flag_spec\"\n\n# Whether we need a single -rpath flag with a separated argument.\nhardcode_libdir_separator=\"$hardcode_libdir_separator\"\n\n# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the\n# resulting binary.\nhardcode_direct=\"$hardcode_direct\"\n\n# Set to yes if using the -LDIR flag during linking hardcodes DIR into the\n# resulting binary.\nhardcode_minus_L=\"$hardcode_minus_L\"\n\nEOF\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/configure.ac",
    "content": "# AC_PREREQ(2.57)\nAC_INIT(libssh2, [-], libssh2-devel@cool.haxx.se)\nAC_CONFIG_MACRO_DIR([m4])\nAC_CONFIG_SRCDIR([src])\nAC_CONFIG_HEADERS([src/libssh2_config.h example/libssh2_config.h])\nAM_MAINTAINER_MODE\nm4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])\n\ndnl SED is needed by some of the tools\nAC_PATH_PROG( SED, sed, sed-was-not-found-by-configure,\n              $PATH:/usr/bin:/usr/local/bin)\nAC_SUBST(SED)\n\nif test \"x$SED\" = \"xsed-was-not-found-by-configure\"; then\n  AC_MSG_WARN([sed was not found, this may ruin your chances to build fine])\nfi\n\ndnl figure out the libssh2 version\nLIBSSH2VER=`$SED -ne 's/^#define LIBSSH2_VERSION *\"\\(.*\\)\"/\\1/p' ${srcdir}/include/libssh2.h`\nAM_INIT_AUTOMAKE\nAC_MSG_CHECKING([libssh2 version])\nAC_MSG_RESULT($LIBSSH2VER)\n\nAC_SUBST(LIBSSH2VER)\n\nAB_VERSION=$LIBSSH2VER\n\nAB_INIT\n\n# Check for the OS.\n# Daniel's note: this should not be necessary and we need to work to\n# get this removed.\nAC_CANONICAL_HOST\ncase \"$host\" in\n    *-mingw*)\n    CFLAGS=\"$CFLAGS -DLIBSSH2_WIN32\"\n    LIBS=\"$LIBS -lws2_32\"\n    ;;\n\t*-cygwin)\n\tCFLAGS=\"$CFLAGS -DLIBSSH2_WIN32\"\n    ;;\n\t*darwin*)\n\tCFLAGS=\"$CFLAGS -DLIBSSH2_DARWIN\"\n\t;;\n    *hpux*)\n    ;;\n    *osf*)\n    CFLAGS=\"$CFLAGS -D_POSIX_PII_SOCKET\"\n    ;;\n    *)\n    ;;\nesac\n\nAC_CHECK_TYPE(long long,\n   [AC_DEFINE(HAVE_LONGLONG, 1,\n      [Define to 1 if the compiler supports the 'long long' data type.])]\n   longlong=\"yes\"\n)\n\ndnl Our configure and build reentrant settings\nCURL_CONFIGURE_REENTRANT\n\n# Some systems (Solaris?) have socket() in -lsocket.\nAC_SEARCH_LIBS(socket, socket)\n\n# Solaris has inet_addr() in -lnsl.\nAC_SEARCH_LIBS(inet_addr, nsl)\n\nAC_SUBST(LIBS)\n\nAC_PROG_CC\nAC_PROG_INSTALL\nAC_PROG_LN_S\nAC_PROG_MAKE_SET\nAC_PATH_PROGS(SSHD, [sshd], [],\n     [$PATH$PATH_SEPARATOR/usr/libexec$PATH_SEPARATOR]dnl\n     [/usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc])\nAM_CONDITIONAL(SSHD, test -n \"$SSHD\")\nAC_LIBTOOL_WIN32_DLL\nAC_PROG_LIBTOOL\nAC_C_BIGENDIAN\n\ndnl check for how to do large files\nAC_SYS_LARGEFILE\n\n# Crypto backends\n\nfound_crypto=none\nfound_crypto_str=\"\"\nsupport_clear_memory=no\ncrypto_errors=\"\"\n\nm4_set_add([crypto_backends], [openssl])\nm4_set_add([crypto_backends], [libgcrypt])\nm4_set_add([crypto_backends], [mbedtls])\nm4_set_add([crypto_backends], [wincng])\n\nAC_ARG_WITH([crypto],\n  AC_HELP_STRING([--with-crypto=auto|]m4_set_contents([crypto_backends], [|]),\n    [Select crypto backend (default: auto)]),\n  use_crypto=$withval,\n  use_crypto=auto\n)\n\ncase \"${use_crypto}\" in\n  auto|m4_set_contents([crypto_backends], [|]))\n    m4_set_map([crypto_backends], [LIBSSH2_CHECK_CRYPTO])\n    ;;\n  yes|\"\")\n    crypto_errors=\"No crypto backend specified!\"\n    ;;\n  *)\n    crypto_errors=\"Unknown crypto backend '${use_crypto}' specified!\"\n    ;;\nesac\n\nif test \"$found_crypto\" = \"none\"; then\n  crypto_errors=\"${crypto_errors}\nSpecify --with-crypto=\\$backend and/or the neccessary library search prefix.\n\nKnown crypto backends: auto, m4_set_contents([crypto_backends], [, ])\"\n  AS_MESSAGE([ERROR: ${crypto_errors}])\nelse\n  test \"$found_crypto_str\" = \"\" && found_crypto_str=\"$found_crypto\"\nfi\n\nm4_set_foreach([crypto_backends], [backend],\n  [AM_CONDITIONAL(m4_toupper(backend), test \"$found_crypto\" = \"backend\")]\n)\nm4_undefine([backend])\n\n\n# libz\n\nAC_ARG_WITH([libz],\n  AC_HELP_STRING([--with-libz],[Use libz for compression]),\n  use_libz=$withval,\n  use_libz=auto)\n\nfound_libz=no\nlibz_errors=\"\"\n\nif test \"$use_libz\" != no; then\n  AC_LIB_HAVE_LINKFLAGS([z], [], [#include <zlib.h>])\n  if test \"$ac_cv_libz\" != yes; then\n    if test \"$use_libz\" = auto; then\n      AC_MSG_NOTICE([Cannot find libz, disabling compression])\n      found_libz=\"disabled; no libz found\"\n    else\n      libz_errors=\"No libz found!\nTry --with-libz-prefix=PATH if you know that you have it.\"\n      AS_MESSAGE([ERROR: $libz_errors])\n    fi\n  else\n    AC_DEFINE(LIBSSH2_HAVE_ZLIB, 1, [Compile in zlib support])\n    LIBSREQUIRED=\"$LIBSREQUIRED${LIBSREQUIRED:+ }zlib\"\n    found_libz=\"yes\"\n  fi\nfi\n\nAC_SUBST(LIBSREQUIRED)\n\n#\n# Optional Settings\n#\nAC_ARG_ENABLE(crypt-none,\n  AC_HELP_STRING([--enable-crypt-none],[Permit \"none\" cipher -- NOT RECOMMENDED]),\n  [AC_DEFINE(LIBSSH2_CRYPT_NONE, 1, [Enable \"none\" cipher -- NOT RECOMMENDED])])\n\nAC_ARG_ENABLE(mac-none,\n  AC_HELP_STRING([--enable-mac-none],[Permit \"none\" MAC -- NOT RECOMMENDED]),\n  [AC_DEFINE(LIBSSH2_MAC_NONE, 1, [Enable \"none\" MAC -- NOT RECOMMENDED])])\n\nAC_ARG_ENABLE(gex-new,\n  AC_HELP_STRING([--disable-gex-new],[Disable \"new\" diffie-hellman-group-exchange-sha1 method]),\n  [GEX_NEW=$enableval])\nif test \"$GEX_NEW\" != \"no\"; then\n  AC_DEFINE(LIBSSH2_DH_GEX_NEW, 1, [Enable newer diffie-hellman-group-exchange-sha1 syntax])\nfi\n\nAC_ARG_ENABLE(clear-memory,\n  AC_HELP_STRING([--disable-clear-memory],[Disable clearing of memory before being freed]),\n  [CLEAR_MEMORY=$enableval])\nif test \"$CLEAR_MEMORY\" != \"no\"; then\n  if test \"$support_clear_memory\" = \"yes\"; then\n    AC_DEFINE(LIBSSH2_CLEAR_MEMORY, 1, [Enable clearing of memory before being freed])\n    enable_clear_memory=yes\n  else\n    if test \"$CLEAR_MEMORY\" = \"yes\"; then\n      AC_MSG_ERROR([secure clearing/zeroing of memory is not supported by the selected crypto backend])\n    else\n      AC_MSG_WARN([secure clearing/zeroing of memory is not supported by the selected crypto backend])\n    fi\n    enable_clear_memory=unsupported\n  fi\nelse\n  if test \"$support_clear_memory\" = \"yes\"; then\n    enable_clear_memory=no\n  else\n    AC_MSG_WARN([secure clearing/zeroing of memory is not supported by the selected crypto backend])\n    enable_clear_memory=unsupported\n  fi\nfi\n\ndnl ************************************************************\ndnl option to switch on compiler debug options\ndnl\nAC_MSG_CHECKING([whether to enable pedantic and debug compiler options])\nAC_ARG_ENABLE(debug,\nAC_HELP_STRING([--enable-debug],[Enable pedantic and debug options])\nAC_HELP_STRING([--disable-debug],[Disable debug options]),\n[ case \"$enable_debug\" in\n  no)\n       AC_MSG_RESULT(no)\n       CPPFLAGS=\"$CPPFLAGS -DNDEBUG\"\n       ;;\n  *)   AC_MSG_RESULT(yes)\n    enable_debug=yes\n    CPPFLAGS=\"$CPPFLAGS -DLIBSSH2DEBUG\"\n    CFLAGS=\"$CFLAGS -g\"\n\n    dnl set compiler \"debug\" options to become more picky, and remove\n    dnl optimize options from CFLAGS\n    CURL_CC_DEBUG_OPTS\n       ;;\n  esac\n ],\n       enable_debug=no\n       AC_MSG_RESULT(no)\n)\n\ndnl ************************************************************\ndnl Enable hiding of internal symbols in library to reduce its size and\ndnl speed dynamic linking of applications.  This currently is only supported\ndnl on gcc >= 4.0 and SunPro C.\ndnl\nAC_MSG_CHECKING([whether to enable hidden symbols in the library])\nAC_ARG_ENABLE(hidden-symbols,\nAC_HELP_STRING([--enable-hidden-symbols],[Hide internal symbols in library])\nAC_HELP_STRING([--disable-hidden-symbols],[Leave all symbols with default visibility in library]),\n[ case \"$enableval\" in\n  no)\n       AC_MSG_RESULT(no)\n       ;;\n  *)\n       AC_MSG_CHECKING([whether $CC supports it])\n       if test \"$GCC\" = yes ; then\n         if $CC --help --verbose 2>&1 | grep fvisibility= > /dev/null ; then\n           AC_MSG_RESULT(yes)\n           AC_DEFINE(LIBSSH2_API, [__attribute__ ((visibility (\"default\")))], [to make a symbol visible])\n           CFLAGS=\"$CFLAGS -fvisibility=hidden\"\n         else\n            AC_MSG_RESULT(no)\n          fi\n\n       else\n         dnl Test for SunPro cc\n         if $CC 2>&1 | grep flags >/dev/null && $CC -flags | grep xldscope= >/dev/null ; then\n           AC_MSG_RESULT(yes)\n           AC_DEFINE(LIBSSH2_API, [__global], [to make a symbol visible])\n           CFLAGS=\"$CFLAGS -xldscope=hidden\"\n         else\n           AC_MSG_RESULT(no)\n         fi\n       fi\n       ;;\n  esac ],\n       AC_MSG_RESULT(no)\n)\n\n# Build example applications?\nAC_MSG_CHECKING([whether to build example applications])\nAC_ARG_ENABLE([examples-build],\nAC_HELP_STRING([--enable-examples-build], [Build example applications (this is the default)])\nAC_HELP_STRING([--disable-examples-build], [Do not build example applications]),\n[case \"$enableval\" in\n  no | false)\n    build_examples='no'\n    ;;\n  *)\n    build_examples='yes'\n    ;;\nesac], [build_examples='yes'])\nAC_MSG_RESULT($build_examples)\nAM_CONDITIONAL([BUILD_EXAMPLES], [test \"x$build_examples\" != \"xno\"])\n\n# Checks for header files.\n# AC_HEADER_STDC\nAC_CHECK_HEADERS([errno.h fcntl.h stdio.h stdlib.h unistd.h sys/uio.h])\nAC_CHECK_HEADERS([sys/select.h sys/socket.h sys/ioctl.h sys/time.h])\nAC_CHECK_HEADERS([arpa/inet.h netinet/in.h])\nAC_CHECK_HEADERS([sys/un.h], [have_sys_un_h=yes], [have_sys_un_h=no])\nAM_CONDITIONAL([HAVE_SYS_UN_H], test \"x$have_sys_un_h\" = xyes)\n\ncase $host in\n  *-*-cygwin* | *-*-cegcc*)\n    # These are POSIX-like systems using BSD-like sockets API.\n    ;;\n  *)\n    AC_CHECK_HEADERS([windows.h winsock2.h ws2tcpip.h])\n    ;;\nesac\n\ncase $host in\n  *darwin*|*interix*)\n    dnl poll() does not work on these platforms\n    dnl Interix: \"does provide poll(), but the implementing developer must\n    dnl have been in a bad mood, because poll() only works on the /proc\n    dnl filesystem here\"\n    dnl Mac OS X's poll has funny behaviors, like:\n    dnl not being able to do poll on no fildescriptors (10.3?)\n    dnl not being able to poll on some files (like anything in /dev)\n    dnl not having reliable timeout support\n    dnl inconsistent return of POLLHUP where other implementations give POLLIN\n    AC_MSG_NOTICE([poll use is disabled on this platform])\n    ;;\n  *)\n    AC_CHECK_FUNCS(poll)\n    ;;\nesac\n\nAC_CHECK_FUNCS(gettimeofday select strtoll memset_s)\n\ndnl Check for select() into ws2_32 for Msys/Mingw\nif test \"$ac_cv_func_select\" != \"yes\"; then\n  AC_MSG_CHECKING([for select in ws2_32])\n  AC_TRY_LINK([\n#ifdef HAVE_WINSOCK2_H\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n#include <winsock2.h>\n#endif\n    ],[\n      select(0,(fd_set *)NULL,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL);\n    ],[\n      AC_MSG_RESULT([yes])\n      HAVE_SELECT=\"1\"\n      AC_DEFINE_UNQUOTED(HAVE_SELECT, 1,\n        [Define to 1 if you have the select function.])\n    ],[\n      AC_MSG_RESULT([no])\n  ])\nfi\n\nAC_FUNC_ALLOCA\n\n# Checks for typedefs, structures, and compiler characteristics.\nAC_C_CONST\nAC_C_INLINE\n\nCURL_CHECK_NONBLOCKING_SOCKET\n\nmissing_required_deps=0\n\nif test \"${libz_errors}\" != \"\"; then\n  AS_MESSAGE([ERROR: ${libz_errors}])\n  missing_required_deps=1\nfi\n\nif test \"$found_crypto\" = \"none\"; then\n  AS_MESSAGE([ERROR: ${crypto_errors}])\n  missing_required_deps=1\nfi\n\nif test $missing_required_deps = 1; then\n  AC_MSG_ERROR([Required dependencies are missing!])\nfi\n\n# Configure parameters\nLIBSSH2_CHECK_OPTION_WERROR\n\nAC_CONFIG_FILES([Makefile\n                 src/Makefile\n                 tests/Makefile\n                 example/Makefile\n                 docs/Makefile\n                 libssh2.pc])\nAC_OUTPUT\n\nAC_MSG_NOTICE([summary of build options:\n\n  version:          ${LIBSSH2VER}\n  Host type:        ${host}\n  Install prefix:   ${prefix}\n  Compiler:         ${CC}\n  Compiler flags:   ${CFLAGS}\n  Library types:    Shared=${enable_shared}, Static=${enable_static}\n  Crypto library:   ${found_crypto_str}\n  Clear memory:     $enable_clear_memory\n  Debug build:      $enable_debug\n  Build examples:   $build_examples\n  Path to sshd:     $ac_cv_path_SSHD (only for self-tests)\n  zlib compression: ${found_libz}\n])\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/.gitignore",
    "content": "Makefile\nMakefile.in\ncoverage\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/AUTHORS",
    "content": " libssh2 is the result of many friendly people. This list is an attempt to\n mention all contributors. If we've missed anyone, tell us!\n\n This list of names is a-z sorted.\n\nAdam Gobiowski\nAlexander Holyapin\nAlexander Lamaison\nAlfred Gebert\nBen Kibbey\nBjorn Stenborg\nCarlo Bramini\nCristian Rodríguez\nDaiki Ueno\nDan Casey\nDan Fandrich\nDaniel Stenberg\nDave Hayden\nDave McCaldon\nDavid J Sullivan\nDavid Robins\nDmitry Smirnov\nDouglas Masterson\nEdink Kadribasic\nErik Brossler\nFrancois Dupoux\nGellule Xg\nGrubsky Grigory\nGuenter Knauf\nHeiner Steven\nHenrik Nordstrom\nJames Housleys\nJasmeet Bagga\nJean-Louis Charton\nJernej Kovacic\nJoey Degges\nJohn Little\nJose Baars\nJussi Mononen\nKamil Dudka\nLars Nordin\nMark McPherson\nMark Smith\nMarkus Moeller\nMatt Lilley\nMatthew Booth\nMaxime Larocque\nMike Protts\nMikhail Gusarov\nNeil Gierman\nOlivier Hervieu\nPaul Howarth\nPaul Querna\nPaul Veldkamp\nPeter Krempa\nPeter O'Gorman\nPeter Stuge\nPierre Joye\nRafael Kitover\nRomain Bondue\nSara Golemon\nSatish Mittal\nSean Peterson\nSelcuk Gueney\nSimon Hart\nSimon Josefsson\nSofian Brabez\nSteven Ayre\nSteven Dake\nSteven Van Ingelgem\nTJ Saunders\nTommy Lindgren\nTor Arntsen\nVincent Jaulin\nVincent Torri\nVlad Grachov\nWez Furlong\nYang Tse\nZl Liu\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/BINDINGS",
    "content": "\nCreative people have written bindings or interfaces for various environments\nand programming languages. Using one of these bindings allows you to take\nadvantage of libssh2 directly from within your favourite language.\n\nThe bindings listed below are not part of the libssh2 distribution archives,\nbut must be downloaded and installed separately.\n\nCocoa/Objective-C\n  https://github.com/karelia/libssh2_sftp-Cocoa-wrapper\n\nHaskell\n  FFI bindings - https://hackage.haskell.org/package/libssh2\n\nPerl\n  Net::SSH2 - https://metacpan.org/pod/Net::SSH2\n\nPHP\n  ssh2 - https://pecl.php.net/package/ssh2\n\nPython\n  pylibssh2 - https://pypi.python.org/pypi/pylibssh2\n\nPython-ctypes\n\n  PySsh2 - https://github.com/gellule/PySsh2\n\nRuby\n  libssh2-ruby - https://github.com/mitchellh/libssh2-ruby\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/CMakeLists.txt",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\nset(MAN_PAGES\n  libssh2_agent_connect.3\n  libssh2_agent_disconnect.3\n  libssh2_agent_free.3\n  libssh2_agent_get_identity.3\n  libssh2_agent_get_identity_path.3\n  libssh2_agent_init.3\n  libssh2_agent_list_identities.3\n  libssh2_agent_set_identity_path.3\n  libssh2_agent_userauth.3\n  libssh2_banner_set.3\n  libssh2_base64_decode.3\n  libssh2_channel_close.3\n  libssh2_channel_direct_tcpip.3\n  libssh2_channel_direct_tcpip_ex.3\n  libssh2_channel_eof.3\n  libssh2_channel_exec.3\n  libssh2_channel_flush.3\n  libssh2_channel_flush_ex.3\n  libssh2_channel_flush_stderr.3\n  libssh2_channel_forward_accept.3\n  libssh2_channel_forward_cancel.3\n  libssh2_channel_forward_listen.3\n  libssh2_channel_forward_listen_ex.3\n  libssh2_channel_free.3\n  libssh2_channel_get_exit_signal.3\n  libssh2_channel_get_exit_status.3\n  libssh2_channel_handle_extended_data.3\n  libssh2_channel_handle_extended_data2.3\n  libssh2_channel_ignore_extended_data.3\n  libssh2_channel_open_ex.3\n  libssh2_channel_open_session.3\n  libssh2_channel_process_startup.3\n  libssh2_channel_read.3\n  libssh2_channel_read_ex.3\n  libssh2_channel_read_stderr.3\n  libssh2_channel_receive_window_adjust.3\n  libssh2_channel_receive_window_adjust2.3\n  libssh2_channel_request_pty.3\n  libssh2_channel_request_pty_ex.3\n  libssh2_channel_request_pty_size.3\n  libssh2_channel_request_pty_size_ex.3\n  libssh2_channel_send_eof.3\n  libssh2_channel_set_blocking.3\n  libssh2_channel_setenv.3\n  libssh2_channel_setenv_ex.3\n  libssh2_channel_shell.3\n  libssh2_channel_subsystem.3\n  libssh2_channel_wait_closed.3\n  libssh2_channel_wait_eof.3\n  libssh2_channel_window_read.3\n  libssh2_channel_window_read_ex.3\n  libssh2_channel_window_write.3\n  libssh2_channel_window_write_ex.3\n  libssh2_channel_write.3\n  libssh2_channel_write_ex.3\n  libssh2_channel_write_stderr.3\n  libssh2_channel_x11_req.3\n  libssh2_channel_x11_req_ex.3\n  libssh2_exit.3\n  libssh2_free.3\n  libssh2_hostkey_hash.3\n  libssh2_init.3\n  libssh2_keepalive_config.3\n  libssh2_keepalive_send.3\n  libssh2_knownhost_add.3\n  libssh2_knownhost_addc.3\n  libssh2_knownhost_check.3\n  libssh2_knownhost_checkp.3\n  libssh2_knownhost_del.3\n  libssh2_knownhost_free.3\n  libssh2_knownhost_get.3\n  libssh2_knownhost_init.3\n  libssh2_knownhost_readfile.3\n  libssh2_knownhost_readline.3\n  libssh2_knownhost_writefile.3\n  libssh2_knownhost_writeline.3\n  libssh2_poll.3\n  libssh2_poll_channel_read.3\n  libssh2_publickey_add.3\n  libssh2_publickey_add_ex.3\n  libssh2_publickey_init.3\n  libssh2_publickey_list_fetch.3\n  libssh2_publickey_list_free.3\n  libssh2_publickey_remove.3\n  libssh2_publickey_remove_ex.3\n  libssh2_publickey_shutdown.3\n  libssh2_scp_recv.3\n  libssh2_scp_recv2.3\n  libssh2_scp_send.3\n  libssh2_scp_send64.3\n  libssh2_scp_send_ex.3\n  libssh2_session_abstract.3\n  libssh2_session_banner_get.3\n  libssh2_session_banner_set.3\n  libssh2_session_block_directions.3\n  libssh2_session_callback_set.3\n  libssh2_session_disconnect.3\n  libssh2_session_disconnect_ex.3\n  libssh2_session_flag.3\n  libssh2_session_free.3\n  libssh2_session_get_blocking.3\n  libssh2_session_get_timeout.3\n  libssh2_session_handshake.3\n  libssh2_session_hostkey.3\n  libssh2_session_init.3\n  libssh2_session_init_ex.3\n  libssh2_session_last_errno.3\n  libssh2_session_last_error.3\n  libssh2_session_set_last_error.3\n  libssh2_session_method_pref.3\n  libssh2_session_methods.3\n  libssh2_session_set_blocking.3\n  libssh2_session_set_timeout.3\n  libssh2_session_startup.3\n  libssh2_session_supported_algs.3\n  libssh2_sftp_close.3\n  libssh2_sftp_close_handle.3\n  libssh2_sftp_closedir.3\n  libssh2_sftp_fsetstat.3\n  libssh2_sftp_fstat.3\n  libssh2_sftp_fstat_ex.3\n  libssh2_sftp_fstatvfs.3\n  libssh2_sftp_fsync.3\n  libssh2_sftp_get_channel.3\n  libssh2_sftp_init.3\n  libssh2_sftp_last_error.3\n  libssh2_sftp_lstat.3\n  libssh2_sftp_mkdir.3\n  libssh2_sftp_mkdir_ex.3\n  libssh2_sftp_open.3\n  libssh2_sftp_open_ex.3\n  libssh2_sftp_opendir.3\n  libssh2_sftp_read.3\n  libssh2_sftp_readdir.3\n  libssh2_sftp_readdir_ex.3\n  libssh2_sftp_readlink.3\n  libssh2_sftp_realpath.3\n  libssh2_sftp_rename.3\n  libssh2_sftp_rename_ex.3\n  libssh2_sftp_rewind.3\n  libssh2_sftp_rmdir.3\n  libssh2_sftp_rmdir_ex.3\n  libssh2_sftp_seek.3\n  libssh2_sftp_seek64.3\n  libssh2_sftp_setstat.3\n  libssh2_sftp_shutdown.3\n  libssh2_sftp_stat.3\n  libssh2_sftp_stat_ex.3\n  libssh2_sftp_statvfs.3\n  libssh2_sftp_symlink.3\n  libssh2_sftp_symlink_ex.3\n  libssh2_sftp_tell.3\n  libssh2_sftp_tell64.3\n  libssh2_sftp_unlink.3\n  libssh2_sftp_unlink_ex.3\n  libssh2_sftp_write.3\n  libssh2_trace.3\n  libssh2_trace_sethandler.3\n  libssh2_userauth_authenticated.3\n  libssh2_userauth_hostbased_fromfile.3\n  libssh2_userauth_hostbased_fromfile_ex.3\n  libssh2_userauth_keyboard_interactive.3\n  libssh2_userauth_keyboard_interactive_ex.3\n  libssh2_userauth_list.3\n  libssh2_userauth_password.3\n  libssh2_userauth_password_ex.3\n  libssh2_userauth_publickey.3\n  libssh2_userauth_publickey_fromfile.3\n  libssh2_userauth_publickey_fromfile_ex.3\n  libssh2_userauth_publickey_frommemory.3\n  libssh2_version.3)\n\ninclude(GNUInstallDirs)\ninstall(FILES ${MAN_PAGES} DESTINATION ${CMAKE_INSTALL_MANDIR}/man3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/HACKING",
    "content": "\nlibssh2 source code style guide:\n\n - 4 level indent\n - spaces-only (no tabs)\n - open braces on the if/for line:\n\n     if (banana) {\n         go_nuts();\n     }\n\n - keep source lines shorter than 80 columns\n - See libssh2-style.el for how to achieve this within Emacs\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/HACKING.CRYPTO",
    "content": "\tDefinitions needed to implement a specific crypto library\n\nThis document offers some hints about implementing a new crypto library\ninterface.\n\nA crypto library interface consists of at least a header file, defining\nentities referenced from the libssh2 core modules.\nReal code implementation (if needed), is left at the implementor's choice.\n\nThis document lists the entities that must/may be defined in the header file.\n\nProcedures listed as \"void\" may indeed have a result type: the void indication\nindicates the libssh2 core modules never use the function result.\n\n\n0) Build system.\n\nAdding a crypto backend to the autotools build system (./configure) is easy:\n\n0.1) Add one new line in configure.ac\n\nm4_set_add([crypto_backends], [newname])\n\nThis automatically creates a --with-crypto=newname option.\n\n0.2) Add an m4_case stanza to LIBSSH2_CRYPTO_CHECK in acinclude.m4\n\nThis must check for all required libraries, and if found set and AC_SUBST a\nvariable with the library linking flags. The recommended method is to use\nLIBSSH2_LIB_HAVE_LINKFLAGS from LIBSSH2_CRYPTO_CHECK, which automatically\ncreates and handles a --with-$newname-prefix option and sets an\nLTLIBNEWNAME variable on success.\n\n0.3) Create Makefile.newname.inc in the top-level directory\n\nThis must set CRYPTO_CSOURCES, CRYPTO_HHEADERS and CRYPTO_LTLIBS.\nSet CRYPTO_CSOURCES and CRYPTO_HHEADERS to the new backend source files\nand set CRYPTO_LTLIBS to the required library linking parameters, e.g.\n$(LTLIBNEWNAME) as generated by by LIBSSH2_LIB_HAVE_LINKFLAGS.\n\n0.4) Add a new block in src/Makefile.am\n\nif NEWNAME\ninclude ../Makefile.newname.inc\nendif\n\n\n1) Crypto library initialization/termination.\n\nvoid libssh2_crypto_init(void);\nInitializes the crypto library. May be an empty macro if not needed.\n\nvoid libssh2_crypto_exit(void);\nTerminates the crypto library use. May be an empty macro if not needed.\n\n\n2) HMAC\n\nlibssh2_hmac_ctx\nType of an HMAC computation context. Generally a struct.\nUsed for all hash algorithms.\n\nvoid libssh2_hmac_ctx_init(libssh2_hmac_ctx ctx);\nInitializes the HMAC computation context ctx.\nCalled before setting-up the hash algorithm.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nvoid libssh2_hmac_update(libssh2_hmac_ctx ctx,\n\t                 const unsigned char *data,\n\t                 int datalen);\nContinue computation of an HMAC on datalen bytes at data using context ctx.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nvoid libssh2_hmac_final(libssh2_hmac_ctx ctx,\n\t                unsigned char output[]);\nGet the computed HMAC from context ctx into the output buffer. The\nminimum data buffer size depends on the HMAC hash algorithm.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nvoid libssh2_hmac_cleanup(libssh2_hmac_ctx *ctx);\nReleases the HMAC computation context at ctx.\n\n\n3) Hash algorithms.\n\n3.1) SHA-1\nMust always be implemented.\n\nSHA_DIGEST_LENGTH\n#define to 20, the SHA-1 digest length.\n\nlibssh2_sha1_ctx\nType of an SHA-1 computation context. Generally a struct.\n\nint libssh2_sha1_init(libssh2_sha1_ctx *x);\nInitializes the SHA-1 computation context at x.\nReturns 1 for success and 0 for failure\n\nvoid libssh2_sha1_update(libssh2_sha1_ctx ctx,\n\t                 const unsigned char *data,\n\t                 size_t len);\nContinue computation of SHA-1 on len bytes at data using context ctx.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nvoid libssh2_sha1_final(libssh2_sha1_ctx ctx,\n                        unsigned char output[SHA_DIGEST_LEN]);\nGet the computed SHA-1 signature from context ctx and store it into the\noutput buffer.\nRelease the context.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nvoid libssh2_hmac_sha1_init(libssh2_hmac_ctx *ctx,\n\t                    const void *key,\n\t                    int keylen);\nSetup the HMAC computation context ctx for an HMAC-SHA-1 computation using the\nkeylen-byte key. Is invoked just after libssh2_hmac_ctx_init().\n\n3.2) SHA-256\nMust always be implemented.\n\nSHA256_DIGEST_LENGTH\n#define to 32, the SHA-256 digest length.\n\nlibssh2_sha256_ctx\nType of an SHA-256 computation context. Generally a struct.\n\nint libssh2_sha256_init(libssh2_sha256_ctx *x);\nInitializes the SHA-256 computation context at x.\nReturns 1 for success and 0 for failure\n\nvoid libssh2_sha256_update(libssh2_sha256_ctx ctx,\n\t                   const unsigned char *data,\n\t                   size_t len);\nContinue computation of SHA-256 on len bytes at data using context ctx.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nvoid libssh2_sha256_final(libssh2_sha256_ctx ctx,\n\t                  unsigned char output[SHA256_DIGEST_LENGTH]);\nGets the computed SHA-256 signature from context ctx into the output buffer.\nRelease the context.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nint libssh2_sha256(const unsigned char *message,\n                   unsigned long len,\n                   unsigned char output[SHA256_DIGEST_LENGTH]);\nComputes the SHA-256 signature over the given message of length len and\nstore the result into the output buffer.\nReturn 1 if error, else 0.\nNote: Seems unused in current code, but defined in each crypto library backend.\n\nLIBSSH2_HMAC_SHA256\n#define as 1 if the crypto library supports HMAC-SHA-256, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\nvoid libssh2_hmac_sha256_init(libssh2_hmac_ctx *ctx,\n\t                      const void *key,\n\t                      int keylen);\nSetup the HMAC computation context ctx for an HMAC-256 computation using the\nkeylen-byte key. Is invoked just after libssh2_hmac_ctx_init().\n\n3.3) SHA-512\nLIBSSH2_HMAC_SHA512\n#define as 1 if the crypto library supports HMAC-SHA-512, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\nSHA512_DIGEST_LENGTH\n#define to 64, the SHA-512 digest length.\n\nvoid libssh2_hmac_sha512_init(libssh2_hmac_ctx *ctx,\n\t                      const void *key,\n\t                      int keylen);\nSetup the HMAC computation context ctx for an HMAC-512 computation using the\nkeylen-byte key. Is invoked just after libssh2_hmac_ctx_init().\n\n3.4) MD5\nLIBSSH2_MD5\n#define to 1 if the crypto library supports MD5, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\nMD5_DIGEST_LENGTH\n#define to 16, the MD5 digest length.\n\nlibssh2_md5_ctx\nType of an MD5 computation context. Generally a struct.\n\nint libssh2_md5_init(libssh2_md5_ctx *x);\nInitializes the MD5 computation context at x.\nReturns 1 for success and 0 for failure\n\nvoid libssh2_md5_update(libssh2_md5_ctx ctx,\n\t                const unsigned char *data,\n\t                size_t len);\nContinues computation of MD5 on len bytes at data using context ctx.\nReturns 1 for success and 0 for failure.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nvoid libssh2_md5_final(libssh2_md5_ctx ctx,\n\t               unsigned char output[MD5_DIGEST_LENGTH]);\nGets the computed MD5 signature from context ctx into the output buffer.\nRelease the context.\nNote: if the ctx parameter is modified by the underlying code,\nthis procedure must be implemented as a macro to map ctx --> &ctx.\n\nvoid libssh2_hmac_md5_init(libssh2_hmac_ctx *ctx,\n\t                   const void *key,\n\t                   int keylen);\nSetup the HMAC computation context ctx for an HMAC-MD5 computation using the\nkeylen-byte key. Is invoked just after libssh2_hmac_ctx_init().\n\n3.5) RIPEMD-160\nLIBSSH2_HMAC_RIPEMD\n#define as 1 if the crypto library supports HMAC-RIPEMD-160, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\nvoid libssh2_hmac_ripemd160_init(libssh2_hmac_ctx *ctx,\n\t                         const void *key,\n\t                         int keylen);\nSetup the HMAC computation context ctx for an HMAC-RIPEMD-160 computation using\nthe keylen-byte key. Is invoked just after libssh2_hmac_ctx_init().\nReturns 1 for success and 0 for failure.\n\n\n4) Bidirectional key ciphers.\n\n_libssh2_cipher_ctx\nType of a cipher computation context.\n\n_libssh2_cipher_type(name);\nMacro defining name as storage identifying a cipher algorithm for\nthe crypto library interface. No trailing semicolon.\n\nint _libssh2_cipher_init(_libssh2_cipher_ctx *h,\n                         _libssh2_cipher_type(algo),\n                         unsigned char *iv,\n                         unsigned char *secret,\n                         int encrypt);\nCreates a cipher context for the given algorithm with the initialization vector\niv and the secret key secret. Prepare for encryption or decryption depending on\nencrypt.\nReturn 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_cipher_crypt(_libssh2_cipher_ctx *ctx,\n                          _libssh2_cipher_type(algo),\n                          int encrypt,\n                          unsigned char *block,\n                          size_t blocksize);\nEncrypt or decrypt in-place data at (block, blocksize) using the given\ncontext and/or algorithm.\nReturn 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nvoid _libssh2_cipher_dtor(_libssh2_cipher_ctx *ctx);\nRelease cipher context at ctx.\n\n4.1) AES\n4.1.1) AES in CBC block mode.\nLIBSSH2_AES\n#define as 1 if the crypto library supports AES in CBC mode, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\n_libssh2_cipher_aes128\nAES-128-CBC algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n_libssh2_cipher_aes192\nAES-192-CBC algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n_libssh2_cipher_aes256\nAES-256-CBC algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n4.1.2) AES in CTR block mode.\nLIBSSH2_AES_CTR\n#define as 1 if the crypto library supports AES in CTR mode, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\n_libssh2_cipher_aes128ctr\nAES-128-CTR algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n_libssh2_cipher_aes192ctr\nAES-192-CTR algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n_libssh2_cipher_aes256ctr\nAES-256-CTR algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n4.2) Blowfish in CBC block mode.\nLIBSSH2_BLOWFISH\n#define as 1 if the crypto library supports blowfish in CBC mode, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\n_libssh2_cipher_blowfish\nBlowfish-CBC algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n4.3) RC4.\nLIBSSH2_RC4\n#define as 1 if the crypto library supports RC4 (arcfour), else 0.\nIf defined as 0, the rest of this section can be omitted.\n\n_libssh2_cipher_arcfour\nRC4 algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n4.4) CAST5 in CBC block mode.\nLIBSSH2_CAST\n#define 1 if the crypto library supports cast, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\n_libssh2_cipher_cast5\nCAST5-CBC algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n4.5) Tripple DES in CBC block mode.\nLIBSSH2_3DES\n#define as 1 if the crypto library supports TripleDES in CBC mode, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\n_libssh2_cipher_3des\nTripleDES-CBC algorithm identifier initializer.\n#define with constant value of type _libssh2_cipher_type().\n\n\n5) Diffie-Hellman support.\n\n5.1) Diffie-Hellman context.\n_libssh2_dh_ctx\nType of a Diffie-Hellman computation context.\nMust always be defined.\n\n5.2) Diffie-Hellman computation procedures.\nvoid libssh2_dh_init(_libssh2_dh_ctx *dhctx);\nInitializes the Diffie-Hellman context at `dhctx'. No effective context\ncreation needed here.\n\nint libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public,\n                        _libssh2_bn *g, _libssh2_bn *p, int group_order,\n                        _libssh2_bn_ctx *bnctx);\nGenerates a Diffie-Hellman key pair using base `g', prime `p' and the given\n`group_order'. Can use the given big number context `bnctx' if needed.\nThe private key is stored as opaque in the Diffie-Hellman context `*dhctx' and\nthe public key is returned in `public'.\n0 is returned upon success, else -1.\n\nint libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret,\n                      _libssh2_bn *f, _libssh2_bn *p, _libssh2_bn_ctx * bnctx)\nComputes the Diffie-Hellman secret from the previously created context `*dhctx',\nthe public key `f' from the other party and the same prime `p' used at\ncontext creation. The result is stored in `secret'.\n0 is returned upon success, else -1.\n\nvoid libssh2_dh_dtor(_libssh2_dh_ctx *dhctx)\nDestroys Diffie-Hellman context at `dhctx' and resets its storage.\n\n\n6) Big numbers.\nPositive multi-byte integers support is sufficient.\n\n6.1) Computation contexts.\nThis has a real meaning if the big numbers computations need some context\nstorage. If not, use a dummy type and functions (macros).\n\n_libssh2_bn_ctx\nType of multiple precision computation context. May not be empty. if not used,\n#define as char, for example.\n\n_libssh2_bn_ctx _libssh2_bn_ctx_new(void);\nReturns a new multiple precision computation context.\n\nvoid _libssh2_bn_ctx_free(_libssh2_bn_ctx ctx);\nReleases a multiple precision computation context.\n\n6.2) Computation support.\n_libssh2_bn\nType of multiple precision numbers (aka bignumbers or huge integers) for the\ncrypto library.\n\n_libssh2_bn * _libssh2_bn_init(void);\nCreates a multiple precision number (preset to zero).\n\n_libssh2_bn * _libssh2_bn_init_from_bin(void);\nCreate a multiple precision number intended to be set by the\n_libssh2_bn_from_bin() function (see below). Unlike _libssh2_bn_init(), this\ncode may be a dummy initializer if the _libssh2_bn_from_bin() actually\nallocates the number. Returns a value of type _libssh2_bn *.\n\nvoid _libssh2_bn_free(_libssh2_bn *bn);\nDestroys the multiple precision number at bn.\n\nunsigned long _libssh2_bn_bytes(_libssh2_bn *bn);\nGet the number of bytes needed to store the bits of the multiple precision\nnumber at bn.\n\nunsigned long _libssh2_bn_bits(_libssh2_bn *bn);\nReturns the number of bits of multiple precision number at bn.\n\nint _libssh2_bn_set_word(_libssh2_bn *bn, unsigned long val);\nSets the value of bn to val.\nReturns 1 on success, 0 otherwise.\n\n_libssh2_bn * _libssh2_bn_from_bin(_libssh2_bn *bn, int len,\n\t                           const unsigned char *val);\nConverts the positive integer in big-endian form of length len at val\ninto a _libssh2_bn and place it in bn. If bn is NULL, a new _libssh2_bn is\ncreated.\nReturns a pointer to target _libssh2_bn or NULL if error.\n\nint _libssh2_bn_to_bin(_libssh2_bn *bn, unsigned char *val);\nConverts the absolute value of bn into big-endian form and store it at\nval. val must point to _libssh2_bn_bytes(bn) bytes of memory.\nReturns the length of the big-endian number.\n\n\n7) Private key algorithms.\nFormat of an RSA public key:\na) \"ssh-rsa\".\nb) RSA exponent, MSB first, with high order bit = 0.\nc) RSA modulus, MSB first, with high order bit = 0.\nEach item is preceded by its 32-bit byte length, MSB first.\n\nFormat of a DSA public key:\na) \"ssh-dss\".\nb) p, MSB first, with high order bit = 0.\nc) q, MSB first, with high order bit = 0.\nd) g, MSB first, with high order bit = 0.\ne) pub_key, MSB first, with high order bit = 0.\nEach item is preceded by its 32-bit byte length, MSB first.\n\nint _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session,\n                              unsigned char **method,\n                              size_t *method_len,\n                              unsigned char **pubkeydata,\n                              size_t *pubkeydata_len,\n                              const char *privatekey,\n                              const char *passphrase);\nReads a private key from file privatekey and extract the public key -->\n(pubkeydata, pubkeydata_len). Store the associated method (ssh-rsa or ssh-dss)\ninto (method, method_len).\nBoth buffers have to be allocated using LIBSSH2_ALLOC().\nReturns 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session,\n                                    unsigned char **method,\n                                    size_t *method_len,\n                                    unsigned char **pubkeydata,\n                                    size_t *pubkeydata_len,\n                                    const char *privatekeydata,\n                                    size_t privatekeydata_len,\n                                    const char *passphrase);\nGets a private key from bytes at (privatekeydata, privatekeydata_len) and\nextract the public key --> (pubkeydata, pubkeydata_len). Store the associated\nmethod (ssh-rsa or ssh-dss) into (method, method_len).\nBoth buffers have to be allocated using LIBSSH2_ALLOC().\nReturns 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\n7.1) RSA\nLIBSSH2_RSA\n#define as 1 if the crypto library supports RSA, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\nlibssh2_rsa_ctx\nType of an RSA computation context. Generally a struct.\n\nint _libssh2_rsa_new(libssh2_rsa_ctx **rsa,\n                     const unsigned char *edata,\n                     unsigned long elen,\n                     const unsigned char *ndata,\n                     unsigned long nlen,\n                     const unsigned char *ddata,\n                     unsigned long dlen,\n                     const unsigned char *pdata,\n                     unsigned long plen,\n                     const unsigned char *qdata,\n                     unsigned long qlen,\n                     const unsigned char *e1data,\n                     unsigned long e1len,\n                     const unsigned char *e2data,\n                     unsigned long e2len,\n                     const unsigned char *coeffdata, unsigned long coefflen);\nCreates a new context for RSA computations from key source values:\n\tpdata, plen\tPrime number p. Only used if private key known (ddata).\n\tqdata, qlen\tPrime number q. Only used if private key known (ddata).\n\tndata, nlen\tModulus n.\n\tedata, elen\tExponent e.\n\tddata, dlen\te^-1 % phi(n) = private key. May be NULL if unknown.\n\te1data, e1len\tdp = d % (p-1). Only used if private key known (dtata).\n\te2data, e2len\tdq = d % (q-1). Only used if private key known (dtata).\n\tcoeffdata, coefflen\tq^-1 % p. Only used if private key known.\nReturns 0 if OK.\nThis procedure is already prototyped in crypto.h.\nNote: the current generic code only calls this function with e and n (public\nkey parameters): unless used internally by the backend, it is not needed to\nsupport the private key and the other parameters here.\n\nint _libssh2_rsa_new_private(libssh2_rsa_ctx **rsa,\n                             LIBSSH2_SESSION *session,\n                             const char *filename,\n                             unsigned const char *passphrase);\nReads an RSA private key from file filename into a new RSA context.\nMust call _libssh2_init_if_needed().\nReturn 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx **rsa,\n                                        LIBSSH2_SESSION *session,\n                                        const char *data,\n\t\t\t\t\tsize_t data_len,\n                                        unsigned const char *passphrase);\nGets an RSA private key from data into a new RSA context.\nMust call _libssh2_init_if_needed().\nReturn 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_rsa_sha1_verify(libssh2_rsa_ctx *rsa,\n                             const unsigned char *sig,\n                             unsigned long sig_len,\n                             const unsigned char *m, unsigned long m_len);\nVerify (sig, siglen) signature of (m, m_len) using an SHA-1 hash and the\nRSA context.\nReturn 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_rsa_sha1_signv(LIBSSH2_SESSION *session,\n\t                    unsigned char **sig, size_t *siglen,\n\t                    int count, const struct iovec vector[],\n\t                    libssh2_rsa_ctx *ctx);\nRSA signs the SHA-1 hash computed over the count data chunks in vector.\nSignature is stored at (sig, siglen).\nSignature buffer must be allocated from the given session.\nReturns 0 if OK, else -1.\nNote: this procedure is optional: if provided, it MUST be defined as a macro.\n\nint _libssh2_rsa_sha1_sign(LIBSSH2_SESSION *session,\n                           libssh2_rsa_ctx *rsactx,\n                           const unsigned char *hash,\n                           size_t hash_len,\n                           unsigned char **signature,\n                           size_t *signature_len);\nRSA signs the (hash, hashlen) SHA-1 hash bytes and stores the allocated\nsignature at (signature, signature_len).\nSignature buffer must be allocated from the given session.\nReturns 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\nNote: this procedure is not used if macro _libssh2_rsa_sha1_signv() is defined.\n\nvoid _libssh2_rsa_free(libssh2_rsa_ctx *rsactx);\nReleases the RSA computation context at rsactx.\n\n\n7.2) DSA\nLIBSSH2_DSA\n#define as 1 if the crypto library supports DSA, else 0.\nIf defined as 0, the rest of this section can be omitted.\n\n\nlibssh2_dsa_ctx\nType of a DSA computation context. Generally a struct.\n\nint _libssh2_dsa_new(libssh2_dsa_ctx **dsa,\n                     const unsigned char *pdata,\n                     unsigned long plen,\n                     const unsigned char *qdata,\n                     unsigned long qlen,\n                     const unsigned char *gdata,\n                     unsigned long glen,\n                     const unsigned char *ydata,\n                     unsigned long ylen,\n                     const unsigned char *x, unsigned long x_len);\nCreates a new context for DSA computations from source key values:\n\tpdata, plen\tPrime number p. Only used if private key known (ddata).\n\tqdata, qlen\tPrime number q. Only used if private key known (ddata).\n\tgdata, glen\tG number.\n\tydata, ylen\tPublic key.\n\txdata, xlen\tPrivate key. Only taken if xlen non-zero.\nReturns 0 if OK.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_dsa_new_private(libssh2_dsa_ctx **dsa,\n                             LIBSSH2_SESSION *session,\n                             const char *filename,\n                             unsigned const char *passphrase);\nGets a DSA private key from file filename into a new DSA context.\nMust call _libssh2_init_if_needed().\nReturn 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_dsa_new_private_frommemory(libssh2_dsa_ctx **dsa,\n                                        LIBSSH2_SESSION *session,\n                                        const char *data,\n\t\t\t\t\tsize_t data_len,\n                                        unsigned const char *passphrase);\nGets a DSA private key from the data_len-bytes data into a new DSA context.\nMust call _libssh2_init_if_needed().\nReturns 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_dsa_sha1_verify(libssh2_dsa_ctx *dsactx,\n                             const unsigned char *sig,\n                             const unsigned char *m, unsigned long m_len);\nVerify (sig, siglen) signature of (m, m_len) using an SHA-1 hash and the\nDSA context.\nReturns 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nint _libssh2_dsa_sha1_sign(libssh2_dsa_ctx *dsactx,\n                           const unsigned char *hash,\n                           unsigned long hash_len, unsigned char *sig);\nDSA signs the (hash, hash_len) data using SHA-1 and store the signature at sig.\nReturns 0 if OK, else -1.\nThis procedure is already prototyped in crypto.h.\n\nvoid _libssh2_dsa_free(libssh2_dsa_ctx *dsactx);\nReleases the DSA computation context at dsactx.\n\n\n8) Miscellaneous\n\nvoid libssh2_prepare_iovec(struct iovec *vector, unsigned int len);\nPrepare len consecutive iovec slots before using them.\nIn example, this is needed to preset unused structure slacks on platforms\nrequiring it.\nIf this is not needed, it should be defined as an empty macro.\n\nvoid _libssh2_random(unsigned char *buf, int len);\nStore len random bytes at buf.\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/INSTALL_AUTOTOOLS",
    "content": "Installation Instructions\n*************************\n\nCopyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free\nSoftware Foundation, Inc.\n\nThis file is free documentation; the Free Software Foundation gives\nunlimited permission to copy, distribute and modify it.\n\nWhen Building directly from Master\n==================================\n\nIf you want to build directly from the git repository, you must first\ngenerate the configure script and Makefile using autotools. There is\na convenience script that calls all tools in the correct order. Make\nsure that autoconf, automake and libtool are installed on your system,\nthen execute the following script:\n\n  ./buildconf\n\nAfter executing this script, you can build the project as usual:\n\n  ./configure\n  make\n\nBasic Installation\n==================\n\nThese are generic installation instructions.\n\n   The `configure' shell script attempts to guess correct values for\nvarious system-dependent variables used during compilation.  It uses\nthose values to create a `Makefile' in each directory of the package.\nIt may also create one or more `.h' files containing system-dependent\ndefinitions.  Finally, it creates a shell script `config.status' that\nyou can run in the future to recreate the current configuration, and a\nfile `config.log' containing compiler output (useful mainly for\ndebugging `configure').\n\n   It can also use an optional file (typically called `config.cache'\nand enabled with `--cache-file=config.cache' or simply `-C') that saves\nthe results of its tests to speed up reconfiguring.  (Caching is\ndisabled by default to prevent problems with accidental use of stale\ncache files.)\n\n   If you need to do unusual things to compile the package, please try\nto figure out how `configure' could check whether to do them, and mail\ndiffs or instructions to the address given in the `README' so they can\nbe considered for the next release.  If you are using the cache, and at\nsome point `config.cache' contains results you don't want to keep, you\nmay remove or edit it.\n\n   The file `configure.ac' (or `configure.in') is used to create\n`configure' by a program called `autoconf'.  You only need\n`configure.ac' if you want to change it or regenerate `configure' using\na newer version of `autoconf'.\n\nThe simplest way to compile this package is:\n\n  1. `cd' to the directory containing the package's source code and type\n     `./configure' to configure the package for your system.  If you're\n     using `csh' on an old version of System V, you might need to type\n     `sh ./configure' instead to prevent `csh' from trying to execute\n     `configure' itself.\n\n     Running `configure' takes awhile.  While running, it prints some\n     messages telling which features it is checking for.\n\n  2. Type `make' to compile the package.\n\n  3. Optionally, type `make check' to run any self-tests that come with\n     the package.\n\n  4. Type `make install' to install the programs and any data files and\n     documentation.\n\n  5. You can remove the program binaries and object files from the\n     source code directory by typing `make clean'.  To also remove the\n     files that `configure' created (so you can compile the package for\n     a different kind of computer), type `make distclean'.  There is\n     also a `make maintainer-clean' target, but that is intended mainly\n     for the package's developers.  If you use it, you may have to get\n     all sorts of other programs in order to regenerate files that came\n     with the distribution.\n\nCompilers and Options\n=====================\n\nSome systems require unusual options for compilation or linking that the\n`configure' script does not know about.  Run `./configure --help' for\ndetails on some of the pertinent environment variables.\n\n   You can give `configure' initial values for configuration parameters\nby setting variables in the command line or in the environment.  Here\nis an example:\n\n     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix\n\n   *Note Defining Variables::, for more details.\n\nCompiling For Multiple Architectures\n====================================\n\nYou can compile the package for more than one kind of computer at the\nsame time, by placing the object files for each architecture in their\nown directory.  To do this, you must use a version of `make' that\nsupports the `VPATH' variable, such as GNU `make'.  `cd' to the\ndirectory where you want the object files and executables to go and run\nthe `configure' script.  `configure' automatically checks for the\nsource code in the directory that `configure' is in and in `..'.\n\n   If you have to use a `make' that does not support the `VPATH'\nvariable, you have to compile the package for one architecture at a\ntime in the source code directory.  After you have installed the\npackage for one architecture, use `make distclean' before reconfiguring\nfor another architecture.\n\nInstallation Names\n==================\n\nBy default, `make install' installs the package's commands under\n`/usr/local/bin', include files under `/usr/local/include', etc.  You\ncan specify an installation prefix other than `/usr/local' by giving\n`configure' the option `--prefix=PREFIX'.\n\n   You can specify separate installation prefixes for\narchitecture-specific files and architecture-independent files.  If you\npass the option `--exec-prefix=PREFIX' to `configure', the package uses\nPREFIX as the prefix for installing programs and libraries.\nDocumentation and other data files still use the regular prefix.\n\n   In addition, if you use an unusual directory layout you can give\noptions like `--bindir=DIR' to specify different values for particular\nkinds of files.  Run `configure --help' for a list of the directories\nyou can set and what kinds of files go in them.\n\n   If the package supports it, you can cause programs to be installed\nwith an extra prefix or suffix on their names by giving `configure' the\noption `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.\n\nOptional Features\n=================\n\nSome packages pay attention to `--enable-FEATURE' options to\n`configure', where FEATURE indicates an optional part of the package.\nThey may also pay attention to `--with-PACKAGE' options, where PACKAGE\nis something like `gnu-as' or `x' (for the X Window System).  The\n`README' should mention any `--enable-' and `--with-' options that the\npackage recognizes.\n\n   For packages that use the X Window System, `configure' can usually\nfind the X include and library files automatically, but if it doesn't,\nyou can use the `configure' options `--x-includes=DIR' and\n`--x-libraries=DIR' to specify their locations.\n\nSpecifying the System Type\n==========================\n\nThere may be some features `configure' cannot figure out automatically,\nbut needs to determine by the type of machine the package will run on.\nUsually, assuming the package is built to be run on the _same_\narchitectures, `configure' can figure that out, but if it prints a\nmessage saying it cannot guess the machine type, give it the\n`--build=TYPE' option.  TYPE can either be a short name for the system\ntype, such as `sun4', or a canonical name which has the form:\n\n     CPU-COMPANY-SYSTEM\n\nwhere SYSTEM can have one of these forms:\n\n     OS KERNEL-OS\n\n   See the file `config.sub' for the possible values of each field.  If\n`config.sub' isn't included in this package, then this package doesn't\nneed to know the machine type.\n\n   If you are _building_ compiler tools for cross-compiling, you should\nuse the option `--target=TYPE' to select the type of system they will\nproduce code for.\n\n   If you want to _use_ a cross compiler, that generates code for a\nplatform different from the build platform, you should specify the\n\"host\" platform (i.e., that on which the generated programs will\neventually be run) with `--host=TYPE'.\n\nSharing Defaults\n================\n\nIf you want to set default values for `configure' scripts to share, you\ncan create a site shell script called `config.site' that gives default\nvalues for variables like `CC', `cache_file', and `prefix'.\n`configure' looks for `PREFIX/share/config.site' if it exists, then\n`PREFIX/etc/config.site' if it exists.  Or, you can set the\n`CONFIG_SITE' environment variable to the location of the site script.\nA warning: not all `configure' scripts look for a site script.\n\nDefining Variables\n==================\n\nVariables not defined in a site shell script can be set in the\nenvironment passed to `configure'.  However, some packages may run\nconfigure again during the build, and the customized values of these\nvariables may be lost.  In order to avoid this problem, you should set\nthem in the `configure' command line, using `VAR=value'.  For example:\n\n     ./configure CC=/usr/local2/bin/gcc\n\ncauses the specified `gcc' to be used as the C compiler (unless it is\noverridden in the site shell script).  Here is a another example:\n\n     /bin/bash ./configure CONFIG_SHELL=/bin/bash\n\nHere the `CONFIG_SHELL=/bin/bash' operand causes subsequent\nconfiguration-related scripts to be executed by `/bin/bash'.\n\n`configure' Invocation\n======================\n\n`configure' recognizes the following options to control how it operates.\n\n`--help'\n`-h'\n     Print a summary of the options to `configure', and exit.\n\n`--version'\n`-V'\n     Print the version of Autoconf used to generate the `configure'\n     script, and exit.\n\n`--cache-file=FILE'\n     Enable the cache: use and save the results of the tests in FILE,\n     traditionally `config.cache'.  FILE defaults to `/dev/null' to\n     disable caching.\n\n`--config-cache'\n`-C'\n     Alias for `--cache-file=config.cache'.\n\n`--quiet'\n`--silent'\n`-q'\n     Do not print messages saying which checks are being made.  To\n     suppress all normal output, redirect it to `/dev/null' (any error\n     messages will still be shown).\n\n`--srcdir=DIR'\n     Look for the package's source code in directory DIR.  Usually\n     `configure' can determine that directory automatically.\n\n`configure' also accepts some other, not widely useful, options.  Run\n`configure --help' for more details.\n\nMore configure options\n======================\n\nSome ./configure options deserve additional comments:\n\n * --enable-crypt-none\n\n\tThe SSH2 Transport allows for unencrypted data\n\ttransmission using the \"none\" cipher.  Because this is\n\tsuch a huge security hole, it is typically disabled on\n\tSSH2 implementations and is disabled in libssh2 by\n\tdefault as well.\n\n\tEnabling this option will allow for \"none\" as a\n\tnegotiable method, however it still requires that the\n\tmethod be advertized by the remote end and that no\n\tmore-preferable methods are available.\n\n * --enable-mac-none\n\n\tThe SSH2 Transport also allows implementations to\n\tforego a message authentication code.  While this is\n\tless of a security risk than using a \"none\" cipher, it\n\tis still not recommended as disabling MAC hashes\n\tremoves a layer of security.\n\n\tEnabling this option will allow for \"none\" as a\n\tnegotiable method, however it still requires that the\n\tmethod be advertized by the remote end and that no\n\tmore-preferable methods are available.\n\n * --disable-gex-new\n\n\tThe diffie-hellman-group-exchange-sha1 (dh-gex) key\n\texchange method originally defined an exchange\n\tnegotiation using packet type 30 to request a\n\tgeneration pair based on a single target value.  Later\n\trefinement of dh-gex provided for range and target\n\tvalues.  By default libssh2 will use the newer range\n\tmethod.\n\n\tIf you experience trouble connecting to an old SSH\n\tserver using dh-gex, try this option to fallback on\n\tthe older more reliable method.\n\n * --with-libgcrypt\n * --without-libgcrypt\n * --with-libgcrypt-prefix=DIR\n\n\tlibssh2 can use the Libgcrypt library\n\t(https://www.gnupg.org/) for cryptographic operations.\n        One of the cryptographic libraries is required.\n\n\tConfigure will attempt to locate Libgcrypt\n\tautomatically.\n\n\tIf your installation of Libgcrypt is in another\n\tlocation, specify it using --with-libgcrypt-prefix.\n\n * --with-openssl\n * --without-openssl\n * --with-libssl-prefix=[DIR]\n\n\tlibssh2 can use the OpenSSL library\n\t(https://www.openssl.org) for cryptographic operations.\n        One of the cryptographic libraries is required.\n\n\tConfigure will attempt to locate OpenSSL in the\n\tdefault location.\n\n\tIf your installation of OpenSSL is in another\n\tlocation, specify it using --with-libssl-prefix.\n\n * --with-mbedtls\n * --without-mbedtls\n * --with-libmbedtls-prefix=[DIR]\n\n        libssh2 can use the mbedTLS library\n        (https://tls.mbed.org) for cryptographic operations.\n        One of the cryptographic libraries is required.\n\n        Configure will attempt to locate mbedTLS in the\n        default location.\n\n        If your installation of mbedTLS is in another\n        location, specify it using --with-libmbedtls-prefix.\n\n * --with-libz\n * --without-libz\n * --with-libz-prefix=[DIR]\n\n\tIf present, libssh2 will attempt to use the zlib\n\t(http://www.zlib.org) for payload compression, however\n\tzlib is not required.\n\n\tIf your installation of Libz is in another location,\n\tspecify it using --with-libz-prefix.\n\n * --enable-debug\n\n\tWill make the build use more pedantic and strict compiler\n\toptions as well as enable the libssh2_trace() function (for\n\tshowing debug traces).\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/INSTALL_CMAKE",
    "content": "License: see COPYING\n\nSource code: https://github.com/libssh2/libssh2\n\nWeb site source code: https://github.com/libssh2/www\n\nInstallation instructions are in docs/INSTALL\n=======\nTo build libssh2 you will need CMake v2.8 or later [1] and one of the\nfollowing cryptography libraries:\n\n* OpenSSL\n* Libgcrypt\n* WinCNG\n* mbedTLS\n\nGetting started\n---------------\n\nIf you are happy with the default options, make a new build directory,\nchange to it, configure the build environment and build the project:\n\n  mkdir bin\n  cd bin\n  cmake ..\n  cmake --build .\n\nlibssh2 will be built as a static library and will use any\ncryptography library available.  The library binary will be put in\n`bin/src`, with the examples in `bin/example` and the tests in\n`bin/tests`.\n\nCustomising the build\n---------------------\n\nOf course, you might want to customise the build options.  You can\npass the options to CMake on the command line:\n\n  cmake -D<option>=<value> ..\n\nThe following options are available:\n\n * `BUILD_SHARED_LIBS=OFF`\n\n    Determines whether libssh2 is built as a static library or as a\n    shared library (.dll/.so).  Can be `ON` or `OFF`.\n\n * `CRYPTO_BACKEND=`\n\n    Chooses a specific cryptography library to use for cryptographic\n    operations.  Can be `OpenSSL` (https://www.openssl.org),\n    `Libgcrypt` (https://www.gnupg.org/), `WinCNG` (Windows Vista+),\n    `mbedTLS` (https://tls.mbed.org/) or blank to use any library available.\n\n    CMake will attempt to locate the libraries automatically.  See [2]\n    for more information.\n\n * `ENABLE_ZLIB_COMPRESSION=OFF`\n\n    Will use zlib (http://www.zlib.org) for payload compression.  Can\n    be `ON` or `OFF`.\n\n * `ENABLE_CRYPT_NONE=OFF`\n\n    The SSH2 Transport allows for unencrypted data transmission using\n    the \"none\" cipher.  Because this is such a huge security hole, it\n    is typically disabled on SSH2 implementations and is disabled in\n    libssh2 by default as well.\n\n    Enabling this option will allow for \"none\" as a negotiable method,\n    however it still requires that the method be advertized by the\n    remote end and that no more-preferable methods are available.\n\n * `ENABLE_MAC_NONE=OFF`\n\n    The SSH2 Transport also allows implementations to forego a message\n    authentication code.  While this is less of a security risk than\n    using a \"none\" cipher, it is still not recommended as disabling\n    MAC hashes removes a layer of security.\n\n    Enabling this option will allow for \"none\" as a negotiable method,\n    however it still requires that the method be advertized by the\n    remote end and that no more-preferable methods are available.\n\n * `ENABLE_GEX_NEW=ON`\n\n    The diffie-hellman-group-exchange-sha1 (dh-gex) key exchange\n    method originally defined an exchange negotiation using packet\n    type 30 to request a generation pair based on a single target\n    value.  Later refinement of dh-gex provided for range and target\n    values.  By default libssh2 will use the newer range method.\n\n    If you experience trouble connecting to an old SSH server using\n    dh-gex, try this option to fallback on the older more reliable\n    method.\n\n * `ENABLE_DEBUG_LOGGING=ON` in Debug, `=OFF` in Release\n\n    Will enable the libssh2_trace() function for showing debug traces.\n\n * `CLEAR_MEMORY=ON`\n\n    Securely zero memory before freeing it (if the backend supports this).\n\nBuild tools\n-----------\n\nThe previous examples used CMake to start the build using:\n\n  cmake --build .\n\nAlternatively, once CMake has configured your project, you can just\nuse your own build tool, e.g GNU make, Visual Studio, etc., from that\npoint onwards.\n\nTests\n-----\n\nTo test the build, run the appropriate test target for your build\nsystem.  For example:\n\n  cmake --build . --target test\nor\n  cmake --build . --target RUN_TESTS\n\nHow do I use libssh2 in my project if my project doesn't use CMake?\n-------------------------------------------------------------------\n\nIf you are not using CMake for your own project, install libssh2\n\n  cmake <libssh2 source location>\n  cmake --build .\n  cmake --build . --target install\nor\n  cmake --build . --target INSTALL\n\nand then specify the install location to your project in the normal\nway for your build environment.  If you don't like the default install\nlocation, add `-DCMAKE_INSTALL_PREFIX=<chosen prefix>` when initially\nconfiguring the project.\n\nHow can I use libssh2 in my project if it also uses CMake?\n----------------------------------------------------------\n\nIf your own project also uses CMake, you don't need to worry about\nsetting it up with libssh2's location.  Just add just the following\nlines and CMake will find libssh2 on your system, set up the necessary\npaths and link the library with your binary.\n\n    find_package(Libssh2 REQUIRED CONFIG)\n    target_link_libraries(my_project_target Libssh2::libssh2)\n\nOf course, you still have to make libssh2 available on your system\nfirst.  You can install it in the traditional way shown above, but you\ndon't have to.  Instead you can just build it, which will export its\nlocation to the user package registry [3] where `find_package` will\nfind it.\n\nYou can even combine the two steps using a so-called 'superbuild'\nproject [4] that downloads, builds and exports libssh2, and then\nbuilds your project:\n\n    include(ExternalProject)\n\n    ExternalProject_Add(\n        Libssh2\n        URL <libssh2 download location>\n        URL_HASH SHA1=<libssh2 archive SHA1>\n        INSTALL_COMMAND \"\")\n\n    ExternalProject_Add(\n        MyProject DEPENDS Libssh2\n        SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src\n        INSTALL_COMMAND \"\")\n\n[1] https://www.cmake.org/cmake/resources/software.html\n[2] https://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html\n[3] https://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html#package-registry\n[4] https://blog.kitware.com/wp-content/uploads/2016/01/kitware_quarterly1009.pdf\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/Makefile.am",
    "content": "# $Id: Makefile.am,v 1.37 2009/03/26 15:41:15 bagder Exp $\n\nEXTRA_DIST = template.3 BINDINGS INSTALL_AUTOTOOLS INSTALL_CMAKE HACKING TODO\t\\\n AUTHORS CMakeLists.txt HACKING.CRYPTO SECURITY.md\n\ndist_man_MANS = \\\n\tlibssh2_agent_connect.3 \\\n\tlibssh2_agent_disconnect.3 \\\n\tlibssh2_agent_free.3 \\\n\tlibssh2_agent_get_identity.3 \\\n\tlibssh2_agent_get_identity_path.3 \\\n\tlibssh2_agent_init.3 \\\n\tlibssh2_agent_list_identities.3 \\\n\tlibssh2_agent_set_identity_path.3 \\\n\tlibssh2_agent_userauth.3 \\\n\tlibssh2_banner_set.3 \\\n\tlibssh2_base64_decode.3 \\\n\tlibssh2_channel_close.3 \\\n\tlibssh2_channel_direct_tcpip.3 \\\n\tlibssh2_channel_direct_tcpip_ex.3 \\\n\tlibssh2_channel_eof.3 \\\n\tlibssh2_channel_exec.3 \\\n\tlibssh2_channel_flush.3 \\\n\tlibssh2_channel_flush_ex.3 \\\n\tlibssh2_channel_flush_stderr.3 \\\n\tlibssh2_channel_forward_accept.3 \\\n\tlibssh2_channel_forward_cancel.3 \\\n\tlibssh2_channel_forward_listen.3 \\\n\tlibssh2_channel_forward_listen_ex.3 \\\n\tlibssh2_channel_free.3 \\\n\tlibssh2_channel_get_exit_signal.3 \\\n\tlibssh2_channel_get_exit_status.3 \\\n\tlibssh2_channel_handle_extended_data.3 \\\n\tlibssh2_channel_handle_extended_data2.3 \\\n\tlibssh2_channel_ignore_extended_data.3 \\\n\tlibssh2_channel_open_ex.3 \\\n\tlibssh2_channel_open_session.3 \\\n\tlibssh2_channel_process_startup.3 \\\n\tlibssh2_channel_read.3 \\\n\tlibssh2_channel_read_ex.3 \\\n\tlibssh2_channel_read_stderr.3 \\\n\tlibssh2_channel_receive_window_adjust.3 \\\n\tlibssh2_channel_receive_window_adjust2.3 \\\n\tlibssh2_channel_request_pty.3 \\\n\tlibssh2_channel_request_pty_ex.3 \\\n\tlibssh2_channel_request_pty_size.3 \\\n\tlibssh2_channel_request_pty_size_ex.3 \\\n\tlibssh2_channel_send_eof.3 \\\n\tlibssh2_channel_set_blocking.3 \\\n\tlibssh2_channel_setenv.3 \\\n\tlibssh2_channel_setenv_ex.3 \\\n\tlibssh2_channel_shell.3 \\\n\tlibssh2_channel_subsystem.3 \\\n\tlibssh2_channel_wait_closed.3 \\\n\tlibssh2_channel_wait_eof.3 \\\n\tlibssh2_channel_window_read.3 \\\n\tlibssh2_channel_window_read_ex.3 \\\n\tlibssh2_channel_window_write.3 \\\n\tlibssh2_channel_window_write_ex.3 \\\n\tlibssh2_channel_write.3 \\\n\tlibssh2_channel_write_ex.3 \\\n\tlibssh2_channel_write_stderr.3 \\\n\tlibssh2_channel_x11_req.3 \\\n\tlibssh2_channel_x11_req_ex.3 \\\n\tlibssh2_exit.3 \\\n\tlibssh2_free.3 \\\n\tlibssh2_hostkey_hash.3 \\\n\tlibssh2_init.3 \\\n\tlibssh2_keepalive_config.3 \\\n\tlibssh2_keepalive_send.3 \\\n\tlibssh2_knownhost_add.3 \\\n\tlibssh2_knownhost_addc.3 \\\n\tlibssh2_knownhost_check.3 \\\n\tlibssh2_knownhost_checkp.3 \\\n\tlibssh2_knownhost_del.3 \\\n\tlibssh2_knownhost_free.3 \\\n\tlibssh2_knownhost_get.3 \\\n\tlibssh2_knownhost_init.3 \\\n\tlibssh2_knownhost_readfile.3 \\\n\tlibssh2_knownhost_readline.3 \\\n\tlibssh2_knownhost_writefile.3 \\\n\tlibssh2_knownhost_writeline.3 \\\n\tlibssh2_poll.3 \\\n\tlibssh2_poll_channel_read.3 \\\n\tlibssh2_publickey_add.3 \\\n\tlibssh2_publickey_add_ex.3 \\\n\tlibssh2_publickey_init.3 \\\n\tlibssh2_publickey_list_fetch.3 \\\n\tlibssh2_publickey_list_free.3 \\\n\tlibssh2_publickey_remove.3 \\\n\tlibssh2_publickey_remove_ex.3 \\\n\tlibssh2_publickey_shutdown.3 \\\n\tlibssh2_scp_recv.3 \\\n\tlibssh2_scp_recv2.3 \\\n\tlibssh2_scp_send.3 \\\n\tlibssh2_scp_send64.3 \\\n\tlibssh2_scp_send_ex.3 \\\n\tlibssh2_session_abstract.3 \\\n\tlibssh2_session_banner_get.3 \\\n\tlibssh2_session_banner_set.3 \\\n\tlibssh2_session_block_directions.3 \\\n\tlibssh2_session_callback_set.3 \\\n\tlibssh2_session_disconnect.3 \\\n\tlibssh2_session_disconnect_ex.3 \\\n\tlibssh2_session_flag.3 \\\n\tlibssh2_session_free.3 \\\n\tlibssh2_session_get_blocking.3 \\\n\tlibssh2_session_get_timeout.3 \\\n\tlibssh2_session_handshake.3 \\\n\tlibssh2_session_hostkey.3 \\\n\tlibssh2_session_init.3 \\\n\tlibssh2_session_init_ex.3 \\\n\tlibssh2_session_last_errno.3 \\\n\tlibssh2_session_last_error.3 \\\n\tlibssh2_session_set_last_error.3 \\\n\tlibssh2_session_method_pref.3 \\\n\tlibssh2_session_methods.3 \\\n\tlibssh2_session_set_blocking.3 \\\n\tlibssh2_session_set_timeout.3 \\\n\tlibssh2_session_startup.3 \\\n\tlibssh2_session_supported_algs.3 \\\n\tlibssh2_sftp_close.3 \\\n\tlibssh2_sftp_close_handle.3 \\\n\tlibssh2_sftp_closedir.3 \\\n\tlibssh2_sftp_fsetstat.3 \\\n\tlibssh2_sftp_fstat.3 \\\n\tlibssh2_sftp_fstat_ex.3 \\\n\tlibssh2_sftp_fstatvfs.3 \\\n\tlibssh2_sftp_fsync.3 \\\n\tlibssh2_sftp_get_channel.3 \\\n\tlibssh2_sftp_init.3 \\\n\tlibssh2_sftp_last_error.3 \\\n\tlibssh2_sftp_lstat.3 \\\n\tlibssh2_sftp_mkdir.3 \\\n\tlibssh2_sftp_mkdir_ex.3 \\\n\tlibssh2_sftp_open.3 \\\n\tlibssh2_sftp_open_ex.3 \\\n\tlibssh2_sftp_opendir.3 \\\n\tlibssh2_sftp_read.3 \\\n\tlibssh2_sftp_readdir.3 \\\n\tlibssh2_sftp_readdir_ex.3 \\\n\tlibssh2_sftp_readlink.3 \\\n\tlibssh2_sftp_realpath.3 \\\n\tlibssh2_sftp_rename.3 \\\n\tlibssh2_sftp_rename_ex.3 \\\n\tlibssh2_sftp_rewind.3 \\\n\tlibssh2_sftp_rmdir.3 \\\n\tlibssh2_sftp_rmdir_ex.3 \\\n\tlibssh2_sftp_seek.3 \\\n\tlibssh2_sftp_seek64.3 \\\n\tlibssh2_sftp_setstat.3 \\\n\tlibssh2_sftp_shutdown.3 \\\n\tlibssh2_sftp_stat.3 \\\n\tlibssh2_sftp_stat_ex.3 \\\n\tlibssh2_sftp_statvfs.3 \\\n\tlibssh2_sftp_symlink.3 \\\n\tlibssh2_sftp_symlink_ex.3 \\\n\tlibssh2_sftp_tell.3 \\\n\tlibssh2_sftp_tell64.3 \\\n\tlibssh2_sftp_unlink.3 \\\n\tlibssh2_sftp_unlink_ex.3 \\\n\tlibssh2_sftp_write.3 \\\n\tlibssh2_trace.3 \\\n\tlibssh2_trace_sethandler.3 \\\n\tlibssh2_userauth_authenticated.3 \\\n\tlibssh2_userauth_hostbased_fromfile.3 \\\n\tlibssh2_userauth_hostbased_fromfile_ex.3 \\\n\tlibssh2_userauth_keyboard_interactive.3 \\\n\tlibssh2_userauth_keyboard_interactive_ex.3 \\\n\tlibssh2_userauth_list.3 \\\n\tlibssh2_userauth_password.3 \\\n\tlibssh2_userauth_password_ex.3 \\\n\tlibssh2_userauth_publickey.3 \\\n\tlibssh2_userauth_publickey_fromfile.3 \\\n\tlibssh2_userauth_publickey_fromfile_ex.3 \\\n\tlibssh2_userauth_publickey_frommemory.3 \\\n\tlibssh2_version.3\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/SECURITY.md",
    "content": "libssh2 security\n================\n\nThis document is intended to provide guidance on how security vulnerabilities\nshould be handled in the libssh2 project.\n\nPublishing Information\n----------------------\n\nAll known and public libssh2 vulnerabilities will be listed on [the libssh2\nweb site](https://www.libssh2.org/).\n\nSecurity vulnerabilities should not be entered in the project's public bug\ntracker unless the necessary configuration is in place to limit access to the\nissue to only the reporter and the project's security team.\n\nVulnerability Handling\n----------------------\n\nThe typical process for handling a new security vulnerability is as follows.\n\nNo information should be made public about a vulnerability until it is\nformally announced at the end of this process. That means, for example that a\nbug tracker entry must NOT be created to track the issue since that will make\nthe issue public and it should not be discussed on the project's public\nmailing list. Also messages associated with any commits should not make any\nreference to the security nature of the commit if done prior to the public\nannouncement.\n\n- The person discovering the issue, the reporter, reports the vulnerability\n  privately to `libssh2-security@haxx.se`. That's an email alias that reaches a\n  handful of selected and trusted people.\n\n- Messages that do not relate to the reporting or managing of an undisclosed\n  security vulnerability in libssh2 are ignored and no further action is\n  required.\n\n- A person in the security team sends an e-mail to the original reporter to\n  acknowledge the report.\n\n- The security team investigates the report and either rejects it or accepts\n  it.\n\n- If the report is rejected, the team writes to the reporter to explain why.\n\n- If the report is accepted, the team writes to the reporter to let him/her\n  know it is accepted and that they are working on a fix.\n\n- The security team discusses the problem, works out a fix, considers the\n  impact of the problem and suggests a release schedule. This discussion\n  should involve the reporter as much as possible.\n\n- The release of the information should be \"as soon as possible\" and is most\n  often synced with an upcoming release that contains the fix. If the\n  reporter, or anyone else, thinks the next planned release is too far away\n  then a separate earlier release for security reasons should be considered.\n\n- Write a security advisory draft about the problem that explains what the\n  problem is, its impact, which versions it affects, solutions or\n  workarounds, when the release is out and make sure to credit all\n  contributors properly.\n\n- Request a CVE number from\n  [distros@openwall](http://oss-security.openwall.org/wiki/mailing-lists/distros)\n  when also informing and preparing them for the upcoming public security\n  vulnerability announcement - attach the advisory draft for information. Note\n  that 'distros' won't accept an embargo longer than 14 days.\n\n- Update the \"security advisory\" with the CVE number.\n\n- The security team commits the fix in a private branch. The commit message\n  should ideally contain the CVE number. This fix is usually also distributed\n  to the 'distros' mailing list to allow them to use the fix prior to the\n  public announcement.\n\n- At the day of the next release, the private branch is merged into the master\n  branch and pushed. Once pushed, the information is accessible to the public\n  and the actual release should follow suit immediately afterwards.\n\n- The project team creates a release that includes the fix.\n\n- The project team announces the release and the vulnerability to the world in\n  the same manner we always announce releases. It gets sent to the libssh2\n  mailing list and the oss-security mailing list.\n\n- The security web page on the web site should get the new vulnerability\n  mentioned.\n\nLIBSSH2-SECURITY (at haxx dot se)\n--------------------------------\n\nWho is on this list? There are a couple of criteria you must meet, and then we\nmight ask you to join the list or you can ask to join it. It really isn't very\nformal. We basically only require that you have a long-term presence in the\nlibssh2 project and you have shown an understanding for the project and its way\nof working. You must've been around for a good while and you should have no\nplans in vanishing in the near future.\n\nWe do not make the list of participants public mostly because it tends to vary\nsomewhat over time and a list somewhere will only risk getting outdated.\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/TODO",
    "content": "Things TODO\n===========\n\n* Fix the numerous malloc+copy operations for sending data, see \"Buffering\n  Improvements\" below for details\n\n* make sure the windowing code adapts better to slow situations so that it\n  doesn't then use as much memory as today. Possibly by an app-controllable\n  \"Window mode\"?\n\n* Decrease the number of mallocs. Everywhere. Will get easier once the\n  buffering improvements have been done.\n\n* Use SO_NOSIGPIPE for Mac OS/BSD systems where MSG_NOSIGNAL doesn't\n  exist/work\n\n* Extend the test suite to actually test lots of aspects of libssh2\n\n* Fix all compiler warnings (some can't be done without API changes)\n\n* Expose error messages sent by the server\n\n* select() is troublesome with libssh2 when using multiple channels over\n  the same session. See \"New Transport API\" below for more details.\n\nAt next SONAME bump\n===================\n\n* stop using #defined macros as part of the official API. The macros should\n  either be turned into real functions or discarded from the API.\n\n* fix the parts of the API where object pointers and function pointers are\n  mixed like libssh2_session_callback_set()\n\n* remove the following functions from the API/ABI\n\n  libssh2_base64_decode()\n  libssh2_session_flag()\n  libssh2_channel_handle_extended_data()\n  libssh2_channel_receive_window_adjust()\n  libssh2_poll()\n  libssh2_poll_channel_read()\n  libssh2_session_startup() (libssh2_session_handshake() is the replacement)\n  libssh2_banner_set() (libssh2_session_banner_set() is the repacement)\n\n* Rename a few function:\n\n  libssh2_hostkey_hash => libssh2_session_hostkey_hash\n  libssh2_banner_set => libssh2_session_banner_set\n\n* change 'int' to 'libssh2_socket_t' in the public API for sockets.\n\n* Use 'size_t' for string lengths in all functions.\n\n* Add a comment field to struct libssh2_knownhost.\n\n* remove the existing libssh2_knownhost_add() function and rename\n  libssh2_knownhost_addc to become the new libssh2_knownhost_add instead\n\n* remove the existing libssh2_scp_send_ex() function and rename\n  libssh2_scp_send64 to become the new libssh2_scp_send instead.\n\n* remove the existing libssh2_knownhost_check() functin and rename\n  libssh2_knownhost_checkp() to become the new libssh2_knownhost_check instead\n\nBuffering Improvements\n======================\n\ntransport_write\n\n  - If this function gets called with a total packet size that is larger than\n  32K, it should create more than one SSH packet so that it keeps the largest\n  one below 32K\n\nsftp_write\n\n  - should not copy/allocate anything for the data, only create a header chunk\n  and pass on the payload data to channel_write \"pointed to\"\n\nNew Transport API\n=================\n\nTHE PROBLEM\n\nThe problem in a nutshell is that when an application opens up multiple\nchannels over a single session, those are all using the same socket. If the\napplication is then using select() to wait for traffic (like any sensible app\ndoes) and wants to act on the data when select() tells there is something to\nfor example read, what does an application do?\n\nWith our current API, you have to loop over all the channels and read from\nthem to see if they have data. This effectively makes blocking reads\nimpossible. If the app has many channels in a setup like this, it even becomes\nslow. (The original API had the libssh2_poll_channel_read() and libssh2_poll()\nto somewhat overcome this hurdle, but they too have pretty much the same\nproblems plus a few others.)\n\nTraffic in the other direction is similarly limited: the app has to try\nsending to all channels, even though some of them may very well not accept any\ndata at that point.\n\nA SOLUTION\n\nI suggest we introduce two new helper functions:\n\n libssh2_transport_read()\n\n - Read \"a bunch\" of data from the given socket and returns information to the\n   app about what channels that are now readable (ie they will not block when\n   read from). The function can be called over and over and it will repeatedly\n   return info about what channels that are readable at that moment.\n\n libssh2_transport_write()\n\n - Returns information about what channels that are writable, in the sense\n   that they have windows set from the remote side that allows data to get\n   sent. Writing to one of those channels will not block. Of course, the\n   underlying socket may only accept a certain amount of data, so at the first\n   short return, nothing more should be attempted to get sent until select()\n   (or equivalent) has been used on the master socket again.\n\nI haven't yet figured out a sensible API for how these functions should return\nthat info, but if we agree on the general principles I guess we can work that\nout.\n\nVOLUNTARY\n\n  I wanted to mention that these two helper functions would not be mandatory\n  in any way. They would just be there for those who want them, and existing\n  programs can remain using the old functions only if they prefer to.\n\nNew SFTP API\n============\n\nPURPOSE\n\n Provide API functions that explicitly tells at once that a (full) SFTP file\n transfer is wanted, to allow libssh2 to leverage on that knowledge to speed\n up things internally. It can for example do read ahead, buffer writes (merge\n small writes into larger chunks), better tune the SSH window and more. This\n sort of API is already provided for SCP transfers.\n\nAPI\n\n New functions:\n\n    LIBSSH2_SFTP_HANDLE *libssh2_sftp_send(SFTP_SESSION *sftp,\n                                           uint64_t filesize,\n                                           char *remote_path,\n                                           size_t remote_path_len,\n                                           long mode);\n\n Tell libssh2 that a local file with a given size is about to get sent to\n the SFTP server.\n\n    LIBSSH2_SFTP_HANDLE *libssh2_sftp_recv();\n\n Tell libssh2 that a remote file is requested to get downloaded from the SFTP\n server.\n\n Only the setup of the file transfer is different from an application's point\n of view. Depending on direction of the transfer(s), the following already\n existing functions should then be used until the transfer is complete:\n\n libssh2_sftp_read()\n libssh2_sftp_write()\n\nHOW TO USE\n\n 1. Setup the transfer using one of the two new functions.\n\n 2. Loop through the reading or writing of data.\n\n 3. Cleanup the transfer\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_agent_connect.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daiki Ueno\n.\\\"\n.TH libssh2_agent_connect 3 \"23 Dec 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_agent_connect - connect to an ssh-agent\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_agent_connect(LIBSSH2_AGENT *agent);\n.SH DESCRIPTION\nConnect to an ssh-agent running on the system.\n\nCall \\fBlibssh2_agent_disconnect(3)\\fP to close the connection after\nyou're doing using it.\n.SH RETURN VALUE\nReturns 0 if succeeded, or a negative value for error.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_agent_init(3)\n.BR libssh2_agent_disconnect(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_agent_disconnect.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daiki Ueno\n.\\\"\n.TH libssh2_agent_disconnect 3 \"23 Dec 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_agent_disconnect - close a connection to an ssh-agent\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_agent_disconnect(LIBSSH2_AGENT *agent);\n.SH DESCRIPTION\nClose a connection to an ssh-agent.\n\n.SH RETURN VALUE\nReturns 0 if succeeded, or a negative value for error.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_agent_connect(3)\n.BR libssh2_agent_free(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_agent_free.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daiki Ueno\n.\\\"\n.TH libssh2_agent_free 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_agent_free - free an ssh-agent handle\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid libssh2_agent_free(LIBSSH2_AGENT *agent);\n.SH DESCRIPTION\nFree an ssh-agent handle.  This function also frees the internal\ncollection of public keys.\n.SH RETURN VALUE\nNone.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_agent_init(3)\n.BR libssh2_agent_disconnect(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_agent_get_identity.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daiki Ueno\n.\\\"\n.TH libssh2_agent_get_identity 3 \"23 Dec 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_agent_get_identity - get a public key off the collection of public keys managed by ssh-agent\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_agent_get_identity(LIBSSH2_AGENT *agent,\n                               struct libssh2_agent_publickey **store,\n                               struct libssh2_agent_publickey *prev);\n.SH DESCRIPTION\n\\fIlibssh2_agent_get_identity(3)\\fP allows an application to iterate\nover all public keys in the collection managed by ssh-agent.\n\n\\fIstore\\fP should point to a pointer that gets filled in to point to the\npublic key data.\n\n\\fIprev\\fP is a pointer to a previous 'struct libssh2_agent_publickey'\nas returned by a previous invoke of this function, or NULL to get the\nfirst entry in the internal collection.\n.SH RETURN VALUE\nReturns 0 if everything is fine and information about a host was stored in\nthe \\fIstore\\fP struct.\n\nReturns 1 if it reached the end of public keys.\n\nReturns negative values for error\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_agent_list_identities(3)\n.BR libssh2_agent_userauth(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_agent_get_identity_path.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2019 by Will Cosgrove\n.\\\"\n.TH libssh2_agent_get_identity_path 3 \"6 Mar 2019\" \"libssh2 1.9\" \"libssh2 manual\"\n.SH NAME\nlibssh2_agent_get_identity_path - gets the custom ssh-agent socket path\n.SH SYNOPSIS\n#include <libssh2.h>\n\nconst char *\nlibssh2_agent_get_identity_path(LIBSSH2_AGENT *agent);\n.SH DESCRIPTION\nReturns the custom agent identity socket path if set using libssh2_agent_set_identity_path()\n\n.SH RETURN VALUE\nReturns the socket path on disk.\n.SH AVAILABILITY\nAdded in libssh2 1.9\n.SH SEE ALSO\n.BR libssh2_agent_init(3)\n.BR libssh2_agent_set_identity_path(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_agent_init.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daiki Ueno\n.\\\"\n.TH libssh2_agent_init 3 \"23 Dec 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_agent_init - init an ssh-agent handle\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_AGENT *libssh2_agent_init(LIBSSH2_SESSION *session);\n.SH DESCRIPTION\nInit an ssh-agent handle. Returns the handle to an internal\nrepresentation of an ssh-agent connection.  After the successful\ninitialization, an application can call \\fBlibssh2_agent_connect(3)\\fP\nto connect to a running ssh-agent.\n\nCall \\fBlibssh2_agent_free(3)\\fP to free the handle again after you're\ndoing using it.\n.SH RETURN VALUE\nReturns a handle pointer or NULL if something went wrong. The returned handle\nis used as input to all other ssh-agent related functions libssh2 provides.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_agent_connect(3)\n.BR libssh2_agent_free(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_agent_list_identities.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daiki Ueno\n.\\\"\n.TH libssh2_agent_list_identities 3 \"23 Dec 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_agent_list_identities - request an ssh-agent to list of public keys.\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_agent_list_identities(LIBSSH2_AGENT *agent);\n.SH DESCRIPTION\nRequest an ssh-agent to list of public keys, and stores them in the\ninternal collection of the handle.  Call\n\\fIlibssh2_agent_get_identity(3)\\fP to get a public key off the\ncollection.\n\n.SH RETURN VALUE\nReturns 0 if succeeded, or a negative value for error.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_agent_connect(3)\n.BR libssh2_agent_get_identity(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_agent_set_identity_path.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2019 by Will Cosgrove\n.\\\"\n.TH libssh2_agent_set_identity_path 3 \"6 Mar 2019\" \"libssh2 1.9\" \"libssh2 manual\"\n.SH NAME\nlibssh2_agent_set_identity_path - set an ssh-agent socket path on disk\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid\nlibssh2_agent_set_identity_path(LIBSSH2_AGENT *agent, const char *path);\n.SH DESCRIPTION\nAllows a custom agent identity socket path instead of the default SSH_AUTH_SOCK env value\n\n.SH RETURN VALUE\nReturns void\n.SH AVAILABILITY\nAdded in libssh2 1.9\n.SH SEE ALSO\n.BR libssh2_agent_init(3)\n.BR libssh2_agent_get_identity_path(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_agent_userauth.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daiki Ueno\n.\\\"\n.TH libssh2_agent_userauth 3 \"23 Dec 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_agent_userauth - authenticate a session with a public key, with the help of ssh-agent\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_agent_userauth(LIBSSH2_AGENT *agent,\n                           const char *username,\n                           struct libssh2_agent_publickey *identity);\n.SH DESCRIPTION\n\\fIagent\\fP - ssh-agent handle as returned by \n.BR libssh2_agent_init(3)\n\n\\fIusername\\fP - Remote user name to authenticate as.\n\n\\fIidentity\\fP - Public key to authenticate with, as returned by \n.BR libssh2_agent_get_identity(3)\n\nAttempt public key authentication with the help of ssh-agent.\n.SH RETURN VALUE\nReturns 0 if succeeded, or a negative value for error.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_agent_init(3)\n.BR libssh2_agent_get_identity(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_banner_set.3",
    "content": ".TH libssh2_banner_set 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_banner_set - set the SSH protocol banner for the local client\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_banner_set(LIBSSH2_SESSION *session, const char *banner);\n\n.SH DESCRIPTION\nThis function is \\fBDEPRECATED\\fP. Use \\fIlibssh2_session_banner_set(3)\\fP\ninstead!\n\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIbanner\\fP - A pointer to a user defined banner\n\nSet the banner that will be sent to the remote host when the SSH session is \nstarted with \n.BR libssh2_session_handshake(3)\n  This is optional; a banner corresponding to the protocol and libssh2 version will be sent by default.\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH AVAILABILITY\nMarked as deprecated since 1.4.0\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n.SH SEE ALSO\n.BR libssh2_session_handshake(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_base64_decode.3",
    "content": ".TH libssh2_base64_decode 3 \"23 Dec 2008\" \"libssh2 1.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_base64_decode - decode a base64 encoded string\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_base64_decode(LIBSSH2_SESSION *session, char **dest,\n                          unsigned int *dest_len, const char *src,\n                          unsigned int src_len);\n.SH DESCRIPTION\nThis function is deemed DEPRECATED and will be removed from libssh2 in a\nfuture version. Don't use it!\n\nDecode a base64 chunk and store it into a newly allocated buffer. 'dest_len'\nwill be set to hold the length of the returned buffer that '*dest' will point\nto.\n\nThe returned buffer is allocated by this function, but it is not clear how to\nfree that memory!\n.SH BUGS\nThe memory that *dest points to is allocated by the malloc function libssh2\nuses, but there's no way for an application to free this data in a safe and\nreliable way!\n.SH RETURN VALUE\n0 if successful, \\-1 if any error occurred.\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_close.3",
    "content": ".TH libssh2_channel_close 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_close - close a channel\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_close(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\n\\fIchannel\\fP - active channel stream to set closed status on.\n\nClose an active data channel. In practice this means sending an SSH_MSG_CLOSE \npacket to the remote host which serves as instruction that no further data \nwill be sent to it. The remote host may still send data back until it sends \nits own close message in response. To wait for the remote end to close its \nconnection as well, follow this command with \n.BR libssh2_channel_wait_closed(3)\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_direct_tcpip.3",
    "content": ".TH libssh2_channel_direct_tcpip 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_direct_tcpip - convenience macro for \\fIlibssh2_channel_direct_tcpip_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_channel_direct_tcpip(LIBSSH2_SESSION *session, const char *host, int port);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_direct_tcpip_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_direct_tcpip_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_direct_tcpip_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_direct_tcpip_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_direct_tcpip_ex.3",
    "content": ".TH libssh2_channel_direct_tcpip_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_direct_tcpip_ex - Tunnel a TCP connection through an SSH session\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL * \nlibssh2_channel_direct_tcpip_ex(LIBSSH2_SESSION *session, const char *host, int port, const char *shost, int sport);\n\nLIBSSH2_CHANNEL * \nlibssh2_channel_direct_tcpip(LIBSSH2_SESSION *session, const char *host, int port);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIhost\\fP - Third party host to connect to using the SSH host as a proxy.\n\n\\fIport\\fP - Port on third party host to connect to.\n\n\\fIshost\\fP - Host to tell the SSH server the connection originated on.\n\n\\fIsport\\fP - Port to tell the SSH server the connection originated from.\n\nTunnel a TCP/IP connection through the SSH transport via the remote host to \na third party. Communication from the client to the SSH server remains \nencrypted, communication from the server to the 3rd party host travels \nin cleartext.\n\n.SH RETURN VALUE\nPointer to a newly allocated LIBSSH2_CHANNEL instance, or NULL on errors.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_eof.3",
    "content": ".TH libssh2_channel_eof 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_eof - check a channel's EOF status\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_eof(LIBSSH2_CHANNEL *channel);\n.SH DESCRIPTION\n\\fIchannel\\fP - active channel stream to set closed status on.\n\nCheck if the remote host has sent an EOF status for the selected stream.\n.SH RETURN VALUE\nReturns 1 if the remote host has sent EOF, otherwise 0. Negative on\nfailure.\n.SH SEE ALSO\n.BR libssh2_channel_close(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_exec.3",
    "content": ".TH libssh2_channel_exec 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_exec - convenience macro for \\fIlibssh2_channel_process_startup(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_exec(LIBSSH2_CHANNEL *channel, const char *command);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_process_startup(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_process_startup(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_process_startup(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_process_startup(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_flush.3",
    "content": ".TH libssh2_channel_flush 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_flush - convenience macro for \\fIlibssh2_channel_flush_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_flush(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_flush_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_flush_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_flush_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_flush_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_flush_ex.3",
    "content": ".TH libssh2_channel_flush_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_flush_ex - flush a channel\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_flush_ex(LIBSSH2_CHANNEL *channel, int streamid);\n\nint \nlibssh2_channel_flush(LIBSSH2_CHANNEL *channel);\n\nint \nlibssh2_channel_flush_stderr(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\n\\fIchannel\\fP - Active channel stream to flush.\n\n\\fIstreamid\\fP - Specific substream number to flush. Groups of substreams may \nbe flushed by passing on of the following Constants.\n.br\n\\fBLIBSSH2_CHANNEL_FLUSH_EXTENDED_DATA\\fP: Flush all extended data substreams\n.br\n\\fBLIBSSH2_CHANNEL_FLUSH_ALL\\fP: Flush all substreams\n\nFlush the read buffer for a given channel instance. Individual substreams may \nbe flushed by number or using one of the provided macros.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_flush_stderr.3",
    "content": ".TH libssh2_channel_flush_stderr 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_flush_stderr - convenience macro for \\fIlibssh2_channel_flush_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_flush_stderr(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_flush_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_flush_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_flush_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_flush_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_forward_accept.3",
    "content": ".TH libssh2_channel_forward_accept 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_forward_accept - accept a queued connection\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_channel_forward_accept(LIBSSH2_LISTENER *listener);\n\n.SH DESCRIPTION\n\\fIlistener\\fP is a forwarding listener instance as returned by\n\\fBlibssh2_channel_forward_listen_ex(3)\\fP.\n.SH RETURN VALUE\nA newly allocated channel instance or NULL on failure.\n.SH ERRORS\nWhen this function returns NULL use \\fIlibssh2_session_last_errno(3)\\fP to\nextract the error code. If that code is \\fILIBSSH2_ERROR_EAGAIN\\fP, the\nsession is set to do non-blocking I/O but the call would block.\n.SH SEE ALSO\n.BR libssh2_channel_forward_listen_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_forward_cancel.3",
    "content": ".TH libssh2_channel_forward_cancel 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_forward_cancel - cancel a forwarded TCP port\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_forward_cancel(LIBSSH2_LISTENER *listener);\n\n.SH DESCRIPTION\n\\fIlistener\\fP - Forwarding listener instance as returned by \n.BR libssh2_channel_forward_listen_ex(3)\n\nInstruct the remote host to stop listening for new connections on a previously requested host/port.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n.SH SEE ALSO\n.BR libssh2_channel_forward_listen_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_forward_listen.3",
    "content": ".TH libssh2_channel_forward_listen 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_forward_listen - convenience macro for \\fIlibssh2_channel_forward_listen_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_forward_listen(LIBSSH2_SESSION *session, int port);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_forward_listen_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_forward_listen_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_forward_listen_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_forward_listen_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_forward_listen_ex.3",
    "content": ".TH libssh2_channel_forward_listen_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_forward_listen_ex - listen to inbound connections\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_LISTENER * \nlibssh2_channel_forward_listen_ex(LIBSSH2_SESSION *session, char *host, int port, int *bound_port, int queue_maxsize);\n\nLIBSSH2_LISTENER * \nlibssh2_channel_forward_listen(LIBSSH2_SESSION *session, int port);\n\n.SH DESCRIPTION\nInstruct the remote SSH server to begin listening for inbound TCP/IP\nconnections. New connections will be queued by the library until accepted by\n\\fIlibssh2_channel_forward_accept(3)\\fP.\n\n\\fIsession\\fP - instance as returned by libssh2_session_init(). \n\n\\fIhost\\fP - specific address to bind to on the remote host. Binding to\n0.0.0.0 (default when NULL is passed) will bind to all available addresses.\n\n\\fIport\\fP - port to bind to on the remote host. When 0 is passed, the remote\nhost will select the first available dynamic port.\n\n\\fIbound_port\\fP - Populated with the actual port bound on the remote\nhost. Useful when requesting dynamic port numbers.\n\n\\fIqueue_maxsize\\fP - Maximum number of pending connections to queue before\nrejecting further attempts.\n\n\\fIlibssh2_channel_forward_listen(3)\\fP is a macro.\n.SH RETURN VALUE\nA newly allocated LIBSSH2_LISTENER instance or NULL on failure.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP - An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_PROTO\\fP - An invalid SSH protocol response was received on the socket.\n\n\\fILIBSSH2_ERROR_REQUEST_DENIED\\fP - The remote server refused the request.\n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would block.\n.SH SEE ALSO\n.BR libssh2_channel_forward_accept(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_free.3",
    "content": ".TH libssh2_channel_free 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_free - free all resources associated with a channel\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_free(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\n\\fIchannel\\fP - Channel stream to free.\n\nRelease all resources associated with a channel stream. If the channel has \nnot yet been closed with \n.BR libssh2_channel_close(3)\n, it will be called automatically so that the remote end may know that it \ncan safely free its own resources.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH SEE ALSO\n.BR libssh2_channel_close(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_get_exit_signal.3",
    "content": ".TH libssh2_channel_get_exit_signal 3 \"4 Oct 2010\" \"libssh2 1.2.8\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_get_exit_signal - get the remote exit signal\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_get_exit_signal(LIBSSH2_CHANNEL *channel, char **exitsignal, size_t *exitsignal_len, char **errmsg, size_t *errmsg_len, char **langtag, size_t *langtag_len);\n\n.SH DESCRIPTION\n\\fIchannel\\fP - Closed channel stream to retrieve exit signal from.\n\n\\fIexitsignal\\fP - If not NULL, is populated by reference with the exit signal\n(without leading \"SIG\"). Note that the string is stored in a newly allocated\nbuffer. If the remote program exited cleanly, the referenced string pointer\nwill be set to NULL. \n\n\\fIexitsignal_len\\fP - If not NULL, is populated by reference with the length\nof exitsignal. \n\n\\fIerrmsg\\fP - If not NULL, is populated by reference with the error message\n(if provided by remote server, if not it will be set to NULL). Note that the\nstring is stored in a newly allocated buffer.\n\n\\fIerrmsg_len\\fP - If not NULL, is populated by reference with the length of errmsg.\n\n\\fIlangtag\\fP - If not NULL, is populated by reference with the language tag \n(if provided by remote server, if not it will be set to NULL). Note that the\nstring is stored in a newly allocated buffer.\n\n\\fIlangtag_len\\fP - If not NULL, is populated by reference with the length of langtag.\n\n.SH RETURN VALUE\nNumeric error code corresponding to the the Error Code constants.\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_get_exit_status.3",
    "content": ".TH libssh2_channel_get_exit_status 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_get_exit_status - get the remote exit code\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_get_exit_status(LIBSSH2_CHANNEL* channel)\n\n.SH DESCRIPTION\n\\fIchannel\\fP - Closed channel stream to retrieve exit status from.\n\nReturns the exit code raised by the process running on the remote host at \nthe other end of the named channel. Note that the exit status may not be \navailable if the remote end has not yet set its status to closed.\n\n.SH RETURN VALUE\nReturns 0 on failure, otherwise the \\fIExit Status\\fP reported by remote host\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_handle_extended_data.3",
    "content": ".TH libssh2_channel_handle_extended_data 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_handle_extended_data - set extended data handling mode\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid \nlibssh2_channel_handle_extended_data(LIBSSH2_CHANNEL *channel, int ignore_mode);\n\n.SH DESCRIPTION\nThis function is deprecated. Use the\n\\fIlibssh2_channel_handle_extended_data2(3)\\fP function instead!\n\n\\fIchannel\\fP - Active channel stream to change extended data handling on.\n\n\\fIignore_mode\\fP - One of the three LIBSSH2_CHANNEL_EXTENDED_DATA_* Constants.\n.br\n\\fBLIBSSH2_CHANNEL_EXTENDED_DATA_NORMAL\\fP: Queue extended data for eventual \nreading\n.br\n\\fBLIBSSH2_CHANNEL_EXTENDED_DATA_MERGE\\fP: Treat extended data and ordinary\ndata the same. Merge all substreams such that calls to\n\\fIlibssh2_channel_read(3)\\fP will pull from all substreams on a\nfirst-in/first-out basis.\n.br\n\\fBLIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE\\fP: Discard all extended data as it \narrives.\n\nChange how a channel deals with extended data packets. By default all extended\ndata is queued until read by \\fIlibssh2_channel_read_ex(3)\\fP\n.SH RETURN VALUE\nNone.\n.SH SEE ALSO\n.BR libssh2_channel_handle_extended_data2(3)\n.BR libssh2_channel_read_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_handle_extended_data2.3",
    "content": ".TH libssh2_channel_handle_extended_data2 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_handle_extended_data2 - set extended data handling mode\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_handle_extended_data2(LIBSSH2_CHANNEL *channel, int ignore_mode);\n\n.SH DESCRIPTION\n\\fIchannel\\fP - Active channel stream to change extended data handling on.\n\n\\fIignore_mode\\fP - One of the three LIBSSH2_CHANNEL_EXTENDED_DATA_* Constants.\n.br\n\\fBLIBSSH2_CHANNEL_EXTENDED_DATA_NORMAL\\fP: Queue extended data for eventual \nreading\n.br\n\\fBLIBSSH2_CHANNEL_EXTENDED_DATA_MERGE\\fP: Treat extended data and ordinary \ndata the same. Merge all substreams such that calls to \n.BR libssh2_channel_read(3)\nwill pull from all substreams on a first-in/first-out basis.\n.br\n\\fBLIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE\\fP: Discard all extended data as it \narrives.\n\nChange how a channel deals with extended data packets. By default all \nextended data is queued until read by \n.BR libssh2_channel_read_ex(3)\n\n.SH RETURN VALUE\nReturn 0 on success or LIBSSH2_ERROR_EAGAIN when it would otherwise block.\n\n.SH SEE ALSO\n.BR libssh2_channel_handle_extended_data(3)\n.BR libssh2_channel_read_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_ignore_extended_data.3",
    "content": ".TH libssh2_channel_ignore_extended_data 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_ignore_extended_data - convenience macro for \\fIlibssh2_channel_handle_extended_data(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nlibssh2_channel_ignore_extended_data(arguments)\n\n.SH DESCRIPTION\nThis function is deprecated. Use the\n\\fIlibssh2_channel_handle_extended_data2(3)\\fP function instead!\n\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_handle_extended_data(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_handle_extended_data(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_handle_extended_data(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_handle_extended_data(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_open_ex.3",
    "content": ".TH libssh2_channel_open_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_open_ex - establish a generic session channel\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_channel_open_ex(LIBSSH2_SESSION *session, const char *channel_type, unsigned int channel_type_len, unsigned int window_size, unsigned int packet_size, const char *message, unsigned int message_len);\n\nLIBSSH2_CHANNEL *\nlibssh2_channel_open_session(session);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIchannel_type\\fP - Channel type to open. Typically one of session, \ndirect-tcpip, or tcpip-forward. The SSH2 protocol allowed for additional \ntypes including local, custom channel types.\n\n\\fIchannel_type_len\\fP - Length of channel_type\n\n\\fIwindow_size\\fP - Maximum amount of unacknowledged data remote host is \nallowed to send before receiving an SSH_MSG_CHANNEL_WINDOW_ADJUST packet.\n\n\\fIpacket_size\\fP - Maximum number of bytes remote host is allowed to send \nin a single SSH_MSG_CHANNEL_DATA or SSG_MSG_CHANNEL_EXTENDED_DATA packet.\n\n\\fImessage\\fP - Additional data as required by the selected channel_type.\n\n\\fImessage_len\\fP - Length of message parameter.\n\nAllocate a new channel for exchanging data with the server. This method is \ntypically called through its macroized form: \n.BR libssh2_channel_open_session(3)\nor via \n.BR libssh2_channel_direct_tcpip(3)\nor\n.BR libssh2_channel_forward_listen(3)\n\n.SH RETURN VALUE\nPointer to a newly allocated LIBSSH2_CHANNEL instance, or NULL on errors.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_CHANNEL_FAILURE\\fP - \n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would block.\n\n.SH SEE ALSO\nAdd related functions\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_open_session.3",
    "content": ".TH libssh2_channel_open_session 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_open_session - convenience macro for \\fIlibssh2_channel_open_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_channel_open_session(LIBSSH2_SESSION *session);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_open_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_open_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_open_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_process_startup.3",
    "content": ".TH libssh2_channel_process_startup 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_process_startup - request a shell on a channel\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nint libssh2_channel_process_startup(LIBSSH2_CHANNEL *channel,\n                                    const char *request,\n                                    unsigned int request_len,\n                                    const char *message,\n                                    unsigned int message_len);\n.SH DESCRIPTION\n\\fIchannel\\fP - Active session channel instance.\n\n\\fIrequest\\fP - Type of process to startup. The SSH2 protocol currently \ndefines shell, exec, and subsystem as standard process services.\n\n\\fIrequest_len\\fP - Length of request parameter.\n\n\\fImessage\\fP - Request specific message data to include.\n\n\\fImessage_len\\fP - Length of message parameter.\n\nInitiate a request on a session type channel such as returned by \n.BR libssh2_channel_open_ex(3)\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_CHANNEL_REQUEST_DENIED\\fP - \n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_read.3",
    "content": ".TH libssh2_channel_read 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_read - convenience macro for \\fIlibssh2_channel_read_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nssize_t libssh2_channel_read(LIBSSH2_CHANNEL *channel, char *buf, size_t buflen);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_read_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_read_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_read_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_read_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_read_ex.3",
    "content": ".TH libssh2_channel_read_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_read_ex - read data from a channel stream\n.SH SYNOPSIS\n#include <libssh2.h>\n\nssize_t\nlibssh2_channel_read_ex(LIBSSH2_CHANNEL *channel, int stream_id, char *buf, size_t buflen);\n\nssize_t\nlibssh2_channel_read(LIBSSH2_CHANNEL *channel, char *buf, size_t buflen);\n\nssize_t\nlibssh2_channel_read_stderr(LIBSSH2_CHANNEL *channel, char *buf, size_t buflen);\n\n.SH DESCRIPTION\nAttempt to read data from an active channel stream. All channel streams have\none standard I/O substream (stream_id == 0), and may have up to 2^32 extended\ndata streams as identified by the selected \\fIstream_id\\fP. The SSH2 protocol\ncurrently defines a stream ID of 1 to be the stderr substream.\n\n\\fIchannel\\fP - active channel stream to read from. \n\n\\fIstream_id\\fP - substream ID number (e.g. 0 or SSH_EXTENDED_DATA_STDERR) \n\n\\fIbuf\\fP - pointer to storage buffer to read data into\n\n\\fIbuflen\\fP - size of the buf storage\n\n\\fIlibssh2_channel_read(3)\\fP and \\fIlibssh2_channel_read_stderr(3)\\fP are\nmacros.\n.SH RETURN VALUE\nActual number of bytes read or negative on failure. It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\nNote that a return value of zero (0) can in fact be a legitimate value and\nonly signals that no payload data was read. It is not an error.\n.SH ERRORS\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_CHANNEL_CLOSED\\fP - The channel has been closed.\n\n.SH SEE ALSO\n.BR libssh2_poll_channel_read(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_read_stderr.3",
    "content": ".TH libssh2_channel_read_stderr 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_read_stderr - convenience macro for \\fIlibssh2_channel_read_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nssize_t libssh2_channel_read_stderr(LIBSSH2_CHANNEL *channel, char *buf, size_t buflen);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_read_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_read_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_read_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_read_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_receive_window_adjust.3",
    "content": ".TH libssh2_channel_receive_window_adjust 3 \"15 Mar 2009\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_receive_window_adjust - adjust the channel window\n.SH SYNOPSIS\n#include <libssh2.h>\n\nunsigned long\nlibssh2_channel_receive_window_adjust(LIBSSH2_CHANNEL * channel,\n                                      unsigned long adjustment,\n                                      unsigned char force);\n\n.SH DESCRIPTION\nThis function is deprecated in 1.1. Use\n\\fIlibssh2_channel_receive_window_adjust2(3)\\fP!\n\nAdjust the receive window for a channel by adjustment bytes. If the amount to\nbe adjusted is less than LIBSSH2_CHANNEL_MINADJUST and force is 0 the\nadjustment amount will be queued for a later packet.\n.SH RETURN VALUE\nReturns the new size of the receive window (as understood by remote end). Note\nthat the window value sent over the wire is strictly 32bit, but this API is\nmade to return a 'long' which may not be 32 bit on all platforms.\n.SH ERRORS\nIn 1.0 and earlier, this function returns LIBSSH2_ERROR_EAGAIN for\nnon-blocking channels where it would otherwise block. However, that is a\nnegative number and this function only returns an unsigned value and this then\nleads to a very strange value being returned.\n.SH SEE ALSO\n.BR libssh2_channel_window_read_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_receive_window_adjust2.3",
    "content": ".TH libssh2_channel_receive_window_adjust2 3 \"26 Mar 2009\" \"libssh2 1.1\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_receive_window_adjust2 - adjust the channel window\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_channel_receive_window_adjust2(LIBSSH2_CHANNEL * channel,\n                                       unsigned long adjustment,\n                                       unsigned char force,\n                                       unsigned int *window);\n\n.SH DESCRIPTION\nAdjust the receive window for a channel by adjustment bytes. If the amount to\nbe adjusted is less than LIBSSH2_CHANNEL_MINADJUST and force is 0 the\nadjustment amount will be queued for a later packet.\n\nThis function stores the new size of the receive window (as understood by\nremote end) in the variable 'window' points to.\n.SH RETURN VALUE\nReturn 0 on success and a negative value on error. If used in non-blocking\nmode it will return LIBSSH2_ERROR_EAGAIN when it would otherwise block.\n.SH ERRORS\n.SH AVAILABILITY\nAdded in libssh2 1.1 since the previous API has deficiencies.\n.SH SEE ALSO\n.BR libssh2_channel_window_read_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_request_pty.3",
    "content": ".TH libssh2_channel_request_pty 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_request_pty - convenience macro for \\fIlibssh2_channel_request_pty_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_request_pty(LIBSSH2_SESSION *session, const char *term);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_request_pty_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_request_pty_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_request_pty_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_request_pty_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_request_pty_ex.3",
    "content": ".TH libssh2_channel_request_pty_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_request_pty_ex - short function description\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_request_pty_ex(LIBSSH2_CHANNEL *channel, const char *term, unsigned int term_len, const char *modes, unsigned int modes_len, int width, int height, int width_px, int height_px);\n\nint \nlibssh2_channel_request_pty(LIBSSH2_CHANNEL *channel, char *term);\n\n.SH DESCRIPTION\n\\fIchannel\\fP - Previously opened channel instance such as returned by \n.BR libssh2_channel_open_ex(3)\n\n\\fIterm\\fP - Terminal emulation (e.g. vt102, ansi, etc...)\n\n\\fIterm_len\\fP - Length of term parameter\n\n\\fImodes\\fP - Terminal mode modifier values\n\n\\fImodes_len\\fP - Length of modes parameter.\n\n\\fIwidth\\fP - Width of pty in characters\n\n\\fIheight\\fP - Height of pty in characters\n\n\\fIwidth_px\\fP - Width of pty in pixels\n\n\\fIheight_px\\fP - Height of pty in pixels\n\nRequest a PTY on an established channel. Note that this does not make sense \nfor all channel types and may be ignored by the server despite returning \nsuccess.\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_CHANNEL_REQUEST_DENIED\\fP - \n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_request_pty_size.3",
    "content": ".TH libssh2_channel_request_pty_size 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_request_pty_size - convenience macro for \\fIlibssh2_channel_request_pty_size_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_request_pty_size(LIBSSH2_CHANNEL *channel, int width, int height);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_request_pty_size_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_request_pty_size_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_request_pty_size_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_request_pty_size_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_request_pty_size_ex.3",
    "content": ".TH libssh2_channel_request_pty_size_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_request_pty_size_ex - TODO\n.SH SYNOPSIS\n\n.SH DESCRIPTION\n\n.SH RETURN VALUE\n\n.SH ERRORS\n\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_send_eof.3",
    "content": ".TH libssh2_channel_send_eof 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_send_eof - send EOF to remote server\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_send_eof(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\nTell the remote host that no further data will be sent on the specified \nchannel. Processes typically interpret this as a closed stdin descriptor.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n.SH SEE ALSO\n.BR libssh2_channel_wait_eof(3)\n.BR libssh2_channel_eof(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_set_blocking.3",
    "content": ".TH libssh2_channel_set_blocking 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_set_blocking - set or clear blocking mode on channel\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid \nlibssh2_channel_set_blocking(LIBSSH2_CHANNEL *channel, int blocking);\n.SH DESCRIPTION\n\\fIchannel\\fP - channel stream to set or clean blocking status on.\n\n\\fIblocking\\fP - Set to a non-zero value to make the channel block, or zero to\nmake it non-blocking.\n\nCurrently this is just a short cut call to \n.BR libssh2_session_set_blocking(3)\nand therefore will affect the session and all channels.\n.SH RETURN VALUE\nNone\n.SH SEE ALSO\n.BR libssh2_session_set_blocking(3)\n.BR libssh2_channel_read_ex(3)\n.BR libssh2_channel_write_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_setenv.3",
    "content": ".TH libssh2_channel_setenv 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_setenv - convenience macro for \\fIlibssh2_channel_setenv_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_setenv(LIBSSH2_CHANNEL *channel, const char *varname, const char *value);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_setenv_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_setenv_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_setenv_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_setenv_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_setenv_ex.3",
    "content": ".TH libssh2_channel_setenv_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_setenv_ex - set an environment variable on the channel\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_channel_setenv_ex(LIBSSH2_CHANNEL *channel, char *varname, unsigned int varname_len, const char *value, unsigned int value_len);\n\nint\nlibssh2_channel_setenv(LIBSSH2_CHANNEL *channel, char *varname, const char *value);\n\n.SH DESCRIPTION\n\\fIchannel\\fP - Previously opened channel instance such as returned by \n.BR libssh2_channel_open_ex(3)\n\n\\fIvarname\\fP - Name of environment variable to set on the remote \nchannel instance.\n\n\\fIvarname_len\\fP - Length of passed varname parameter.\n\n\\fIvalue\\fP - Value to set varname to.\n\n\\fIvalue_len\\fP - Length of value parameter.\n\nSet an environment variable in the remote channel's process space. Note that\nthis does not make sense for all channel types and may be ignored by the\nserver despite returning success.\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_CHANNEL_REQUEST_DENIED\\fP - \n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_shell.3",
    "content": ".TH libssh2_channel_shell 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_shell - convenience macro for \\fIlibssh2_channel_process_startup(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_shell(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_process_startup(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_process_startup(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_process_startup(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_process_startup(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_subsystem.3",
    "content": ".TH libssh2_channel_subsystem 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_subsystem - convenience macro for \\fIlibssh2_channel_process_startup(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_subsystem(LIBSSH2_CHANNEL *channel, const char *subsystem);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_process_startup(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_process_startup(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_process_startup(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_process_startup(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_wait_closed.3",
    "content": ".TH libssh2_channel_wait_closed 3 \"29 Nov 2007\" \"libssh2 0.19\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_wait_closed - wait for the remote to close the channel\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_wait_closed(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\nEnter a temporary blocking state until the remote host closes the named\nchannel. Typically sent after \\fIlibssh2_channel_close(3)\\fP in order to\nexamine the exit status.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure. It returns LIBSSH2_ERROR_EAGAIN\nwhen it would otherwise block. While LIBSSH2_ERROR_EAGAIN is a negative\nnumber, it isn't really a failure per se.\n.SH SEE ALSO\n.BR libssh2_channel_send_eof(3)\n.BR libssh2_channel_eof(3)\n.BR libssh2_channel_wait_eof(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_wait_eof.3",
    "content": ".TH libssh2_channel_wait_eof 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_wait_eof - wait for the remote to reply to an EOF request\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_channel_wait_eof(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\nWait for the remote end to send EOF.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure. It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH SEE ALSO\n.BR libssh2_channel_send_eof(3)\n.BR libssh2_channel_eof(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_window_read.3",
    "content": ".TH libssh2_channel_window_read 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_window_read - convenience macro for \\fIlibssh2_channel_window_read_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nunsigned long libssh2_channel_window_read(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_window_read_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_window_read_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_window_read_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_window_read_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_window_read_ex.3",
    "content": ".TH libssh2_channel_window_read_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_window_read_ex - Check the status of the read window\n.SH SYNOPSIS\n#include <libssh2.h>\n\nunsigned long\nlibssh2_channel_window_read_ex(LIBSSH2_CHANNEL *channel,\n                               unsigned long *read_avail,\n                               unsigned long *window_size_initial)\n.SH DESCRIPTION\nCheck the status of the read window. Returns the number of bytes which the\nremote end may send without overflowing the window limit read_avail (if\npassed) will be populated with the number of bytes actually available to be\nread window_size_initial (if passed) will be populated with the\nwindow_size_initial as defined by the channel_open request\n.SH RETURN VALUE\nThe number of bytes which the remote end may send without overflowing the\nwindow limit\n.SH ERRORS\n\n.SH SEE ALSO\n.BR libssh2_channel_receive_window_adjust(3),\n.BR libssh2_channel_window_write_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_window_write.3",
    "content": ".TH libssh2_channel_window_write 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_window_write - convenience macro for \\fIlibssh2_channel_window_write_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nunsigned long libssh2_channel_window_write(LIBSSH2_CHANNEL *channel);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_window_write_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_window_write_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_window_write_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_window_write_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_window_write_ex.3",
    "content": ".TH libssh2_channel_window_write_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_window_write_ex - Check the status of the write window\n.SH SYNOPSIS\n#include <libssh2.h>\n\nunsigned long\nlibssh2_channel_window_write_ex(LIBSSH2_CHANNEL *channel,\n                                unsigned long *window_size_initial)\n.SH DESCRIPTION\nCheck the status of the write window Returns the number of bytes which may be\nsafely written on the channel without blocking. 'window_size_initial' (if\npassed) will be populated with the size of the initial window as defined by\nthe channel_open request\n.SH RETURN VALUE\nNumber of bytes which may be safely written on the channel without blocking.\n.SH ERRORS\n\n.SH SEE ALSO\n.BR libssh2_channel_window_read_ex(3),\n.BR libssh2_channel_receive_window_adjust(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_write.3",
    "content": ".TH libssh2_channel_write 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_write - convenience macro for \\fIlibssh2_channel_write_ex(3)\\fP\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nssize_t libssh2_channel_write(LIBSSH2_CHANNEL *channel, const char *buf, size_t buflen);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_write_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_write_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_write_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_write_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_write_ex.3",
    "content": ".TH libssh2_channel_write_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_write_ex - write data to a channel stream blocking\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nssize_t libssh2_channel_write_ex(LIBSSH2_CHANNEL *channel,\n                                 int stream_id, char *buf,\n                                 size_t buflen);\n.SH DESCRIPTION\nWrite data to a channel stream. All channel streams have one standard I/O\nsubstream (stream_id == 0), and may have up to 2^32 extended data streams as\nidentified by the selected \\fIstream_id\\fP. The SSH2 protocol currently\ndefines a stream ID of 1 to be the stderr substream.\n\n\\fIchannel\\fP - active channel stream to write to. \n\n\\fIstream_id\\fP - substream ID number (e.g. 0 or SSH_EXTENDED_DATA_STDERR) \n\n\\fIbuf\\fP - pointer to buffer to write\n\n\\fIbuflen\\fP - size of the data to write\n\n\\fIlibssh2_channel_write(3)\\fP and \\fIlibssh2_channel_write_stderr(3)\\fP are\nconvenience macros for this function.\n\n\\fIlibssh2_channel_write_ex(3)\\fP will use as much as possible of the buffer\nand put it into a single SSH protocol packet. This means that to get maximum\nperformance when sending larger files, you should try to always pass in at\nleast 32K of data to this function.\n.SH RETURN VALUE\nActual number of bytes written or negative on failure.\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP - An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_CHANNEL_CLOSED\\fP - The channel has been closed.\n\n\\fILIBSSH2_ERROR_CHANNEL_EOF_SENT\\fP - The channel has been requested to be\nclosed.\n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n.BR libssh2_channel_read_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_write_stderr.3",
    "content": ".TH libssh2_channel_write_stderr 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_write_stderr - convenience macro for \\fIlibssh2_channel_write_ex(3)\\fP\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nssize_t libssh2_channel_write_stderr(LIBSSH2_CHANNEL *channel, const char *buf, size_t buflen);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_write_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_write_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_write_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_write_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_x11_req.3",
    "content": ".TH libssh2_channel_x11_req 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_x11_req - convenience macro for \\fIlibssh2_channel_x11_req_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_channel_x11_req(LIBSSH2_CHANNEL *channel, int screen_number);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_channel_x11_req_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_channel_x11_req_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_channel_x11_req_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_channel_x11_req_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_channel_x11_req_ex.3",
    "content": ".TH libssh2_channel_x11_req_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_channel_x11_req_ex - request an X11 forwarding channel\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_channel_x11_req_ex(LIBSSH2_CHANNEL *channel, int single_connection, const char *auth_proto, const char *auth_cookie, int screen_number);\n\nint\nlibssh2_channel_x11_req(LIBSSH2_CHANNEL *channel, int screen_number);\n\n.SH DESCRIPTION\n\\fIchannel\\fP - Previously opened channel instance such as returned by \n.BR libssh2_channel_open_ex(3)\n\n\\fIsingle_connection\\fP - non-zero to only forward a single connection.\n\n\\fIauth_proto\\fP - X11 authentication protocol to use\n\n\\fIauth_cookie\\fP - the cookie (hexadecimal encoded).\n\n\\fIscreen_number\\fP - the XLL screen to forward\n\nRequest an X11 forwarding on \\fIchannel\\fP. To use X11 forwarding, \n.BR libssh2_session_callback_set(3)\nmust first be called to set \\fBLIBSSH2_CALLBACK_X11\\fP. This callback will be\ninvoked when the remote host accepts the X11 forwarding.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_CHANNEL_REQUEST_DENIED\\fP - \n\n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n.BR libssh2_session_callback_set(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_exit.3",
    "content": ".TH libssh2_exit 3 \"19 Mar 2010\" \"libssh2 1.2.5\" \"libssh2 manual\"\n.SH NAME\nlibssh2_exit - global library deinitialization\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid\nlibssh2_exit(void);\n.SH DESCRIPTION\nExit the libssh2 functions and free's all memory used internal.\n.SH AVAILABILITY\nAdded in libssh2 1.2.5\n.SH SEE ALSO\n.BR libssh2_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_free.3",
    "content": ".TH libssh2_exit 3 \"13 Oct 2010\" \"libssh2 1.2.8\" \"libssh2 manual\"\n.SH NAME\nlibssh2_free - deallocate libssh2 memory\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid\nlibssh2_free(LIBSSH2_SESSION *session, void *ptr);\n.SH DESCRIPTION\nDeallocate memory allocated by earlier call to libssh2 functions.  It\nuses the memory allocation callbacks provided by the application, if\nany.  Otherwise, this will just call free().\n\nThis function is mostly useful under Windows when libssh2 is linked to\none run-time library and the application to another.\n.SH AVAILABILITY\nAdded in libssh2 1.2.8\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_hostkey_hash.3",
    "content": ".TH libssh2_hostkey_hash 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_hostkey_hash - return a hash of the remote host's key\n.SH SYNOPSIS\n#include <libssh2.h>\n\nconst char *\nlibssh2_hostkey_hash(LIBSSH2_SESSION *session, int hash_type);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIhash_type\\fP - One of: \\fBLIBSSH2_HOSTKEY_HASH_MD5\\fP, \n\\fBLIBSSH2_HOSTKEY_HASH_SHA1\\fP or \\fBLIBSSH2_HOSTKEY_HASH_SHA256\\fP.\n\nReturns the computed digest of the remote system's hostkey. The length of \nthe returned string is hash_type specific (e.g. 16 bytes for MD5, \n20 bytes for SHA1, 32 bytes for SHA256).\n.SH RETURN VALUE\nComputed hostkey hash value, or NULL if the information is not available\n(either the session has not yet been started up, or the requested hash\nalgorithm was not available). The hash consists of raw binary bytes, not hex\ndigits, so it is not directly printable.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_init.3",
    "content": ".TH libssh2_init 3 \"19 Mar 2010\" \"libssh2 1.2.5\" \"libssh2 manual\"\n.SH NAME\nlibssh2_init - global library initialization\n.SH SYNOPSIS\n#include <libssh2.h>\n\n#define LIBSSH2_INIT_NO_CRYPTO 0x0001\n\nint\nlibssh2_init(int flags);\n.SH DESCRIPTION\nInitialize the libssh2 functions.  This typically initialize the\ncrypto library.  It uses a global state, and is not thread safe -- you\nmust make sure this function is not called concurrently.\n.SH RETURN VALUE\nReturns 0 if succeeded, or a negative value for error.\n.SH AVAILABILITY\nAdded in libssh2 1.2.5\n.SH SEE ALSO\n.BR libssh2_exit(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_keepalive_config.3",
    "content": ".TH libssh2_keepalive_config 3 \"12 Apr 2011\" \"libssh2 1.2.5\" \"libssh2 manual\"\n.SH NAME\nlibssh2_keepalive_config - short function description\n.SH SYNOPSIS\n#include <libssh2.h>\n.nf\n\nvoid libssh2_keepalive_config(LIBSSH2_SESSION *session,\n                              int want_reply,\n                              unsigned interval);\n.fi\n.SH DESCRIPTION\nSet how often keepalive messages should be sent. \\fBwant_reply\\fP indicates\nwhether the keepalive messages should request a response from the server.\n\\fBinterval\\fP is number of seconds that can pass without any I/O, use 0 (the\ndefault) to disable keepalives.  To avoid some busy-loop corner-cases, if you\nspecify an interval of 1 it will be treated as 2.\n\nNote that non-blocking applications are responsible for sending the keepalive\nmessages using \\fBlibssh2_keepalive_send(3)\\fP.\n.SH RETURN VALUE\nNothing\n.SH AVAILABILITY\nAdded in libssh2 1.2.5\n.SH SEE ALSO\n.BR libssh2_keepalive_send(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_keepalive_send.3",
    "content": ".TH libssh2_keepalive_send 3 \"13 Apr 2011\" \"libssh2 1.2.5\" \"libssh2 manual\"\n.SH NAME\nlibssh2_keepalive_send - short function description\n.SH SYNOPSIS\n#include <libssh2.h>\n.nf\n\nint libssh2_keepalive_send(LIBSSH2_SESSION *session,\n                           int *seconds_to_next);\n.SH DESCRIPTION\nSend a keepalive message if needed.  \\fBseconds_to_next\\fP indicates how many\nseconds you can sleep after this call before you need to call it again.\n.SH RETURN VALUE\nReturns 0 on success, or LIBSSH2_ERROR_SOCKET_SEND on I/O errors.\n.SH AVAILABILITY\nAdded in libssh2 1.2.5\n.SH SEE ALSO\n.BR libssh2_keepalive_config(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_knownhost_add.3",
    "content": "\n.\\\" Copyright (c) 2009, 2010 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_add 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_add - add a known host\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nint libssh2_knownhost_add(LIBSSH2_KNOWNHOSTS *hosts,\n                          char *host, char *salt,\n                          char *key, size_t keylen,\n                          int typemask,\n                          struct libssh2_knownhost **store);\n.SH DESCRIPTION\nWe discourage use of this function as of libssh2 1.2.5. Instead we strongly\nurge users to use \\fIlibssh2_knownhost_addc(3)\\fP instead, which as a more\ncomplete API. \\fIlibssh2_knownhost_add(3)\\fP is subject for removal in a\nfuture release.\n\nAdds a known host to the collection of known hosts identified by the 'hosts'\nhandle.\n\n\\fIhost\\fP is a pointer the host name in plain text or hashed. If hashed, it\nmust be provided base64 encoded. The host name can be the IP numerical address\nof the host or the full name.\n\n\\fIsalt\\P is a pointer to the salt used for the host hashing, if the host is\nprovided hashed. If the host is provided in plain text, salt has no meaning.\nThe salt has to be provided base64 encoded with a trailing zero byte.\n\n\\fIkey\\fP is a pointer to the key for the given host.\n\n\\fIkeylen\\fP is the total size in bytes of the key pointed to by the \\fIkey\\fP\nargument\n\n\\fItypemask\\fP is a bitmask that specifies format and info about the data\npassed to this function. Specifically, it details what format the host name is,\nwhat format the key is and what key type it is.\n\nThe host name is given as one of the following types:\nLIBSSH2_KNOWNHOST_TYPE_PLAIN, LIBSSH2_KNOWNHOST_TYPE_SHA1 or\nLIBSSH2_KNOWNHOST_TYPE_CUSTOM.\n\nThe key is encoded using one of the following encodings:\nLIBSSH2_KNOWNHOST_KEYENC_RAW or LIBSSH2_KNOWNHOST_KEYENC_BASE64.\n\nThe key is using one of these algorithms:\nLIBSSH2_KNOWNHOST_KEY_RSA1, LIBSSH2_KNOWNHOST_KEY_SSHRSA or\nLIBSSH2_KNOWNHOST_KEY_SSHDSS.\n\n\\fIstore\\fP should point to a pointer that gets filled in to point to the\nknown host data after the addition. NULL can be passed if you don't care about\nthis pointer.\n.SH RETURN VALUE\nReturns a regular libssh2 error code, where negative values are error codes\nand 0 indicates success.\n.SH AVAILABILITY\nAdded in libssh2 1.2, deprecated since libssh2 1.2.5. Use\n\\fIlibssh2_knownhost_addc(3)\\fP instead!\n.SH SEE ALSO\n.BR libssh2_knownhost_init(3)\n.BR libssh2_knownhost_free(3)\n.BR libssh2_knownhost_check(3)\n.BR libssh2_knownhost_addc(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_knownhost_addc.3",
    "content": "\n.\\\" Copyright (c) 2009, 2010 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_add 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_add - add a known host\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_knownhost_addc(LIBSSH2_KNOWNHOSTS *hosts,\n                           char *host, char *salt,\n                           char *key, size_t keylen,\n                           const char *comment, size_t commentlen,\n                           int typemask,\n                           struct libssh2_knownhost **store);\n.SH DESCRIPTION\nAdds a known host to the collection of known hosts identified by the 'hosts'\nhandle.\n\n\\fIhost\\fP is a pointer the host name in plain text or hashed. If hashed, it\nmust be provided base64 encoded. The host name can be the IP numerical address\nof the host or the full name.\n\nIf you want to add a key for a specific port number for the given host, you\nmust provide the host name like '[host]:port' with the actual characters '['\nand ']' enclosing the host name and a colon separating the host part from the\nport number. For example: \\&\"[host.example.com]:222\".\n\n\\fIsalt\\fP is a pointer to the salt used for the host hashing, if the host is\nprovided hashed. If the host is provided in plain text, salt has no meaning.\nThe salt has to be provided base64 encoded with a trailing zero byte.\n\n\\fIkey\\fP is a pointer to the key for the given host.\n\n\\fIkeylen\\fP is the total size in bytes of the key pointed to by the \\fIkey\\fP\nargument\n\n\\fIcomment\\fP is a pointer to a comment for the key.\n\n\\fIcommentlen\\fP is the total size in bytes of the comment pointed to by the \\fIcomment\\fP argument\n\n\\fItypemask\\fP is a bitmask that specifies format and info about the data\npassed to this function. Specifically, it details what format the host name is,\nwhat format the key is and what key type it is.\n\nThe host name is given as one of the following types:\nLIBSSH2_KNOWNHOST_TYPE_PLAIN, LIBSSH2_KNOWNHOST_TYPE_SHA1 or\nLIBSSH2_KNOWNHOST_TYPE_CUSTOM.\n\nThe key is encoded using one of the following encodings:\nLIBSSH2_KNOWNHOST_KEYENC_RAW or LIBSSH2_KNOWNHOST_KEYENC_BASE64.\n\nThe key is using one of these algorithms:\nLIBSSH2_KNOWNHOST_KEY_RSA1, LIBSSH2_KNOWNHOST_KEY_SSHRSA or\nLIBSSH2_KNOWNHOST_KEY_SSHDSS.\n\n\\fIstore\\fP should point to a pointer that gets filled in to point to the\nknown host data after the addition. NULL can be passed if you don't care about\nthis pointer.\n.SH RETURN VALUE\nReturns a regular libssh2 error code, where negative values are error codes\nand 0 indicates success.\n.SH AVAILABILITY\nAdded in libssh2 1.2.5\n.SH SEE ALSO\n.BR libssh2_knownhost_init(3)\n.BR libssh2_knownhost_free(3)\n.BR libssh2_knownhost_check(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_knownhost_check.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_check 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_check - check a host+key against the list of known hosts\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_knownhost_check(LIBSSH2_KNOWNHOSTS *hosts,\n                            const char *host,\n                            const char *key, size_t keylen,\n                            int typemask,\n                            struct libssh2_knownhost **knownhost);\n.SH DESCRIPTION\nChecks a host and its associated key against the collection of known hosts,\nand returns info back about the (partially) matched entry.\n\n\\fIhost\\fP is a pointer the host name in plain text. The host name can be the\nIP numerical address of the host or the full name.\n\n\\fIkey\\fP is a pointer to the key for the given host.\n\n\\fIkeylen\\fP is the total size in bytes of the key pointed to by the \\fIkey\\fP\nargument\n\n\\fItypemask\\fP is a bitmask that specifies format and info about the data\npassed to this function. Specifically, it details what format the host name is,\nwhat format the key is and what key type it is.\n\nThe host name is given as one of the following types:\nLIBSSH2_KNOWNHOST_TYPE_PLAIN or LIBSSH2_KNOWNHOST_TYPE_CUSTOM.\n\nThe key is encoded using one of the following encodings:\nLIBSSH2_KNOWNHOST_KEYENC_RAW or LIBSSH2_KNOWNHOST_KEYENC_BASE64.\n\n\\fIknownhost\\fP if set to non-NULL, it must be a pointer to a 'struct\nlibssh2_knownhost' pointer that gets filled in to point to info about a known\nhost that matches or partially matches.\n.SH RETURN VALUE\n\\fIlibssh2_knownhost_check(3)\\fP returns info about how well the provided\nhost + key pair matched one of the entries in the list of known hosts.\n\nLIBSSH2_KNOWNHOST_CHECK_FAILURE - something prevented the check to be made\n\nLIBSSH2_KNOWNHOST_CHECK_NOTFOUND - no host match was found\n\nLIBSSH2_KNOWNHOST_CHECK_MATCH - hosts and keys match.\n\nLIBSSH2_KNOWNHOST_CHECK_MISMATCH - host was found, but the keys didn't match!\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH EXAMPLE\nSee the ssh2_exec.c example as provided in the tarball.\n.SH SEE ALSO\n.BR libssh2_knownhost_init(3)\n.BR libssh2_knownhost_free(3)\n.BR libssh2_knownhost_add(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_knownhost_checkp.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009-2010 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_check 3 \"1 May 2010\" \"libssh2 1.2.6\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_checkp - check a host+key against the list of known hosts\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_knownhost_checkp(LIBSSH2_KNOWNHOSTS *hosts,\n                             const char *host, int port,\n                             const char *key, size_t keylen,\n                             int typemask,\n                             struct libssh2_knownhost **knownhost);\n.SH DESCRIPTION\nChecks a host and its associated key against the collection of known hosts,\nand returns info back about the (partially) matched entry.\n\n\\fIhost\\fP is a pointer the host name in plain text. The host name can be the\nIP numerical address of the host or the full name.\n\n\\fIport\\fP is the port number used by the host (or a negative number\nto check the generic host). If the port number is given, libssh2 will\ncheck the key for the specific host + port number combination in\naddition to the plain host name only check.\n\n\\fIkey\\fP is a pointer to the key for the given host.\n\n\\fIkeylen\\fP is the total size in bytes of the key pointed to by the \\fIkey\\fP\nargument\n\n\\fItypemask\\fP is a bitmask that specifies format and info about the data\npassed to this function. Specifically, it details what format the host name is,\nwhat format the key is and what key type it is.\n\nThe host name is given as one of the following types:\nLIBSSH2_KNOWNHOST_TYPE_PLAIN or LIBSSH2_KNOWNHOST_TYPE_CUSTOM.\n\nThe key is encoded using one of the following encodings:\nLIBSSH2_KNOWNHOST_KEYENC_RAW or LIBSSH2_KNOWNHOST_KEYENC_BASE64.\n\n\\fIknownhost\\fP if set to non-NULL, it must be a pointer to a 'struct\nlibssh2_knownhost' pointer that gets filled in to point to info about a known\nhost that matches or partially matches.\n.SH RETURN VALUE\n\\fIlibssh2_knownhost_check(3)\\fP returns info about how well the provided\nhost + key pair matched one of the entries in the list of known hosts.\n\nLIBSSH2_KNOWNHOST_CHECK_FAILURE - something prevented the check to be made\n\nLIBSSH2_KNOWNHOST_CHECK_NOTFOUND - no host match was found\n\nLIBSSH2_KNOWNHOST_CHECK_MATCH - hosts and keys match.\n\nLIBSSH2_KNOWNHOST_CHECK_MISMATCH - host was found, but the keys didn't match!\n.SH AVAILABILITY\nAdded in libssh2 1.2.6\n.SH EXAMPLE\nSee the ssh2_exec.c example as provided in the tarball.\n.SH SEE ALSO\n.BR libssh2_knownhost_init(3)\n.BR libssh2_knownhost_free(3)\n.BR libssh2_knownhost_add(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_knownhost_del.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_del 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_del - delete a known host entry\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_knownhost_del(LIBSSH2_KNOWNHOSTS *hosts,\n                          struct libssh2_knownhost *entry);\n.SH DESCRIPTION\nDelete a known host entry from the collection of known hosts.\n\n\\fIentry\\fP is a pointer to a struct that you can extract with\n\\fIlibssh2_knownhost_check(3)\\fP or \\fIlibssh2_knownhost_get(3)\\fP.\n.SH RETURN VALUE\nReturns a regular libssh2 error code, where negative values are error codes\nand 0 indicates success.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_knownhost_init(3)\n.BR libssh2_knownhost_free(3)\n.BR libssh2_knownhost_add(3)\n.BR libssh2_knownhost_check(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_knownhost_free.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_free 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_free - free a collection of known hosts\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid libssh2_knownhost_free(LIBSSH2_KNOWNHOSTS *hosts);\n.SH DESCRIPTION\nFree a collection of known hosts.\n.SH RETURN VALUE\nNone.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_knownhost_init(3)\n.BR libssh2_knownhost_add(3)\n.BR libssh2_knownhost_check(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_knownhost_get.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_get 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_get - get a known host off the collection of known hosts\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_knownhost_get(LIBSSH2_KNOWNHOSTS *hosts,\n                          struct libssh2_knownhost **store,\n                          struct libssh2_knownhost *prev):\n.SH DESCRIPTION\n\\fIlibssh2_knownhost_get(3)\\fP allows an application to iterate over all known\nhosts in the collection.\n\n\\fIstore\\fP should point to a pointer that gets filled in to point to the\nknown host data.\n\n\\fIprev\\fP is a pointer to a previous 'struct libssh2_knownhost' as returned\nby a previous invoke of this function, or NULL to get the first entry in the\ninternal collection.\n.SH RETURN VALUE\nReturns 0 if everything is fine and information about a host was stored in\nthe \\fIstore\\fP struct.\n\nReturns 1 if it reached the end of hosts.\n\nReturns negative values for error\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_knownhost_readfile(3)\n.BR libssh2_knownhost_writefile(3)\n.BR libssh2_knownhost_add(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_knownhost_init.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_init 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_init - init a collection of known hosts\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_KNOWNHOSTS *libssh2_knownhost_init(LIBSSH2_SESSION *session);\n.SH DESCRIPTION\nInit a collection of known hosts for this session. Returns the handle to an\ninternal representation of a known host collection.\n\nCall \\fBlibssh2_knownhost_free(3)\\fP to free the collection again after you're\ndoing using it.\n.SH RETURN VALUE\nReturns a handle pointer or NULL if something went wrong. The returned handle\nis used as input to all other known host related functions libssh2 provides.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_knownhost_free(3)\n.BR libssh2_knownhost_add(3)\n.BR libssh2_knownhost_check(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_knownhost_readfile.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009-2011 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_readfile 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_readfile - parse a file of known hosts\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_knownhost_readfile(LIBSSH2_KNOWNHOSTS *hosts,\n                               const char *filename, int type);\n.SH DESCRIPTION\nReads a collection of known hosts from a specified file and adds them to the\ncollection of known hosts.\n\n\\fIfilename\\fP specifies which file to read\n\n\\fItype\\fP specifies what file type it is, and\n\\fILIBSSH2_KNOWNHOST_FILE_OPENSSH\\fP is the only currently supported\nformat. This file is normally found named ~/.ssh/known_hosts\n.SH RETURN VALUE\nReturns a negative value, a regular libssh2 error code for errors, or a\npositive number as number of parsed known hosts in the file.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_knownhost_init(3)\n.BR libssh2_knownhost_free(3)\n.BR libssh2_knownhost_check(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_knownhost_readline.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_readline 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_readline - read a known host line\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_knownhost_readline(LIBSSH2_KNOWNHOSTS *hosts,\n                               const char *line, size_t len, int type):\n.SH DESCRIPTION\nTell libssh2 to read a buffer as it if is a line from a known hosts file.\n\n\\fIline\\fP points to the start of the line\n\n\\fIlen\\fP is the length of the line in bytes\n\n\\fItype\\fP specifies what file type it is, and\n\\fILIBSSH2_KNOWNHOST_FILE_OPENSSH\\fP is the only currently supported\nformat. This file is normally found named ~/.ssh/known_hosts\n.SH RETURN VALUE\nReturns a regular libssh2 error code, where negative values are error codes\nand 0 indicates success.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_knownhost_get(3)\n.BR libssh2_knownhost_writeline(3)\n.BR libssh2_knownhost_readfile(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_knownhost_writefile.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_writefile 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_writefile - write a collection of known hosts to a file\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_knownhost_writefile(LIBSSH2_KNOWNHOSTS *hosts,\n                                const char *filename, int type);\n.SH DESCRIPTION\nWrites all the known hosts to the specified file using the specified file\nformat.\n\n\\fIfilename\\fP specifies what filename to create\n\n\\fItype\\fP specifies what file type it is, and\n\\fILIBSSH2_KNOWNHOST_FILE_OPENSSH\\fP is the only currently supported\nformat.\n.SH RETURN VALUE\nReturns a regular libssh2 error code, where negative values are error codes\nand 0 indicates success.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_knownhost_readfile(3)\n.BR libssh2_knownhost_add(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_knownhost_writeline.3",
    "content": ".\\\"\n.\\\" Copyright (c) 2009 by Daniel Stenberg\n.\\\"\n.TH libssh2_knownhost_writeline 3 \"28 May 2009\" \"libssh2 1.2\" \"libssh2 manual\"\n.SH NAME\nlibssh2_knownhost_writeline - convert a known host to a line for storage\n.SH SYNOPSIS\n#include <libssh2.h>\n\nlibssh2_knownhost_writeline(LIBSSH2_KNOWNHOSTS *hosts,\n                            struct libssh2_knownhost *known,\n                            char *buffer, size_t buflen,\n                            size_t *outlen,\n                            int type);\n.SH DESCRIPTION\nConverts a single known host to a single line of output for storage, using\nthe 'type' output format.\n\n\\fIknown\\fP identifies which particular known host\n\n\\fIbuffer\\fP points to an allocated buffer\n\n\\fIbuflen\\fP is the size of the \\fIbuffer\\fP. See RETURN VALUE about the size.\n\n\\fIoutlen\\fP must be a pointer to a size_t variable that will get the output\nlength of the stored data chunk. The number does not included the trailing\nzero!\n\n\\fItype\\fP specifies what file type it is, and\n\\fILIBSSH2_KNOWNHOST_FILE_OPENSSH\\fP is the only currently supported\nformat.\n.SH RETURN VALUE\nReturns a regular libssh2 error code, where negative values are error codes\nand 0 indicates success.\n\nIf the provided buffer is deemed too small to fit the data libssh2 wants to\nstore in it, LIBSSH2_ERROR_BUFFER_TOO_SMALL will be returned. The application\nis then advised to call the function again with a larger buffer. The\n\\fIoutlen\\fP size will then hold the requested size.\n.SH AVAILABILITY\nAdded in libssh2 1.2\n.SH SEE ALSO\n.BR libssh2_knownhost_get(3)\n.BR libssh2_knownhost_readline(3)\n.BR libssh2_knownhost_writefile(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_poll.3",
    "content": ".TH libssh2_poll 3 \"14 Dec 2006\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_poll - poll for activity on a socket, channel or listener\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_poll(LIBSSH2_POLLFD *fds, unsigned int nfds, long timeout);\n.SH DESCRIPTION\nThis function is deprecated. Do note use. We encourage users to instead use\nthe \\fIpoll(3)\\fP or \\fIselect(3)\\fP functions to check for socket activity or\nwhen specific sockets are ready to get received from or send to.\n\nPoll for activity on a socket, channel, listener, or any combination of these\nthree types. The calling semantics for this function generally match\n\\fIpoll(2)\\fP however the structure of fds is somewhat more complex in order\nto accommodate the disparate datatypes, POLLFD constants have been namespaced\nto avoid platform discrepancies, and revents has additional values defined.\n.SH \"RETURN VALUE\"\nNumber of fds with interesting events.\n.SH SEE ALSO\n.BR libssh2_poll_channel_read(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_poll_channel_read.3",
    "content": ".TH libssh2_poll_channel_read 3 \"14 Dec 2006\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_poll_channel_read - check if data is available\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_poll_channel_read(LIBSSH2_CHANNEL *channel, int extended);\n.SH DESCRIPTION\nThis function is deprecated. Do note use.\n\n\\fIlibssh2_poll_channel_read(3)\\fP checks to see if data is available in the\n\\fIchannel\\fP's read buffer. No attempt is made with this method to see if\npackets are available to be processed. For full polling support, use\n\\fIlibssh2_poll(3)\\fP.\n.SH RETURN VALUE\nReturns 1 when data is available and 0 otherwise.\n.SH SEE ALSO\n.BR libssh2_poll(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_publickey_add.3",
    "content": ".TH libssh2_publickey_add 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_publickey_add - convenience macro for \\fIlibssh2_publickey_add_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_publickey_add(LIBSSH2_PUBLICKEY *pkey,\n\t\t\t  const unsigned char *name,\n                          const unsigned char *blob, unsigned long blob_len, char overwrite,\n                          unsigned long num_attrs, const libssh2_publickey_attribute attrs[]);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_publickey_add_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_publickey_add_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_publickey_add_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_publickey_add_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_publickey_add_ex.3",
    "content": ".TH libssh2_publickey_add_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_publickey_add_ex - Add a public key entry\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_publickey_add_ex(LIBSSH2_PUBLICKEY *pkey, const unsigned char *name,\n                         unsigned long name_len, const unsigned char *blob,\n                         unsigned long blob_len, char overwrite,\n                         unsigned long num_attrs,\n                         const libssh2_publickey_attribute attrs[])\n\n.SH DESCRIPTION\nTBD\n.SH RETURN VALUE\nReturns 0 on success, negative on failure.\n.SH ERRORS\nLIBSSH2_ERROR_BAD_USE\nLIBSSH2_ERROR_ALLOC,\nLIBSSH2_ERROR_EAGAIN\nLIBSSH2_ERROR_SOCKET_SEND,\nLIBSSH2_ERROR_SOCKET_TIMEOUT,\nLIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_publickey_init.3",
    "content": ".TH libssh2_publickey_init 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_publickey_init - TODO\n.SH SYNOPSIS\n\n.SH DESCRIPTION\n\n.SH RETURN VALUE\n\n.SH ERRORS\n\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_publickey_list_fetch.3",
    "content": ".TH libssh2_publickey_list_fetch 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_publickey_list_fetch - TODO\n.SH SYNOPSIS\n\n.SH DESCRIPTION\n\n.SH RETURN VALUE\n\n.SH ERRORS\n\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_publickey_list_free.3",
    "content": ".TH libssh2_publickey_list_free 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_publickey_list_free - TODO\n.SH SYNOPSIS\n\n.SH DESCRIPTION\n\n.SH RETURN VALUE\n\n.SH ERRORS\n\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_publickey_remove.3",
    "content": ".TH libssh2_publickey_remove 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_publickey_remove - convenience macro for \\fIlibssh2_publickey_remove_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_publickey_remove(LIBSSH2_PUBLICKEY *pkey,\n\t\t\t     const unsigned char *name, unsigned long name_len,\n\t\t\t     const unsigned char *blob, unsigned long blob_len);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_publickey_remove_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_publickey_remove_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_publickey_remove_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_publickey_remove_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_publickey_remove_ex.3",
    "content": ".TH libssh2_publickey_list_remove_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_publickey_list_remove_ex - TODO\n.SH SYNOPSIS\n\n.SH DESCRIPTION\n\n.SH RETURN VALUE\n\n.SH ERRORS\n\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_publickey_shutdown.3",
    "content": ".TH libssh2_publickey_shutdown 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_publickey_shutdown - TODO\n.SH SYNOPSIS\n\n.SH DESCRIPTION\n\n.SH RETURN VALUE\n\n.SH ERRORS\n\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_scp_recv.3",
    "content": ".TH libssh2_scp_recv 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_scp_recv - request a remote file via SCP\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_scp_recv(LIBSSH2_SESSION *session, const char *path, struct stat *sb);\n\n.SH DESCRIPTION\nThis function is \\fBDEPRECATED\\fP. Use \\fIlibssh2_scp_recv2(3)\\fP\ninstead!\n\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIpath\\fP - Full path and filename of file to transfer. That is the remote\nfile name.\n\n\\fIsb\\fP - Populated with remote file's size, mode, mtime, and atime\n\nRequest a file from the remote host via SCP.\n.SH RETURN VALUE\nPointer to a newly allocated LIBSSH2_CHANNEL instance, or NULL on errors.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SCP_PROTOCOL\\fP - \n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would\nblock.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n.BR libssh2_channel_open_ex(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_scp_recv2.3",
    "content": ".TH libssh2_scp_recv2 3 \"29 Jun 2015\" \"libssh2 1.6.1\" \"libssh2 manual\"\n.SH NAME\nlibssh2_scp_recv2 - request a remote file via SCP\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_scp_recv2(LIBSSH2_SESSION *session, const char *path, struct_stat *sb);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIpath\\fP - Full path and filename of file to transfer. That is the remote\nfile name.\n\n\\fIsb\\fP - Populated with remote file's size, mode, mtime, and atime\n\nRequest a file from the remote host via SCP.\n.SH RETURN VALUE\nPointer to a newly allocated LIBSSH2_CHANNEL instance, or NULL on errors.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SCP_PROTOCOL\\fP - \n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would\nblock.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n.BR libssh2_channel_open_ex(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_scp_send.3",
    "content": ".TH libssh2_scp_send 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_scp_send - convenience macro for \\fIlibssh2_scp_send_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_scp_send(LIBSSH2_SESSION *session, const char *path, int mode, size_t size);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_scp_send_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_scp_send_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_scp_send_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_scp_send_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_scp_send64.3",
    "content": ".TH libssh2_scp_send64 3 \"17 Apr 2010\" \"libssh2 1.2.6\" \"libssh2 manual\"\n.SH NAME\nlibssh2_scp_send64 - Send a file via SCP\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_scp_send64(LIBSSH2_SESSION *session, const char *path, int mode,\n                   libssh2_uint64_t size, time_t mtime, time_t atime);\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIpath\\fP - Full path and filename of file to transfer to. That is the remote\nfile name.\n\n\\fImode\\fP - File access mode to create file with\n\n\\fIsize\\fP - Size of file being transmitted (Must be known ahead of\ntime). Note that this needs to be passed on as variable type\nlibssh2_uint64_t. This type is 64 bit on modern operating systems and\ncompilers.\n\n\\fImtime\\fP - mtime to assign to file being created\n\n\\fIatime\\fP - atime to assign to file being created (Set this and \nmtime to zero to instruct remote host to use current time).\n\nSend a file to the remote host via SCP.\n.SH RETURN VALUE\nPointer to a newly allocated LIBSSH2_CHANNEL instance, or NULL on errors.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SCP_PROTOCOL\\fP - \n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would\nblock.\n.SH AVAILABILITY\nThis function was added in libssh2 1.2.6 and is meant to replace the former\n\\fIlibssh2_scp_send_ex(3)\\fP function.\n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_scp_send_ex.3",
    "content": ".TH libssh2_scp_send_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_scp_send_ex - Send a file via SCP\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nLIBSSH2_CHANNEL *\nlibssh2_scp_send_ex(LIBSSH2_SESSION *session, const char *path, int mode,\n                    size_t size, long mtime, long atime);\n.SH DESCRIPTION\nThis function has been deemed deprecated since libssh2 1.2.6. See\n\\fIlibssh2_scp_send64(3)\\fP.\n\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIpath\\fP - Full path and filename of file to transfer to. That is the remote\nfile name.\n\n\\fImode\\fP - File access mode to create file with\n\n\\fIsize\\fP - Size of file being transmitted (Must be known \nahead of time precisely)\n\n\\fImtime\\fP - mtime to assign to file being created\n\n\\fIatime\\fP - atime to assign to file being created (Set this and \nmtime to zero to instruct remote host to use current time).\n\nSend a file to the remote host via SCP.\n.SH RETURN VALUE\nPointer to a newly allocated LIBSSH2_CHANNEL instance, or NULL on errors.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SCP_PROTOCOL\\fP - \n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would\nblock.\n.SH AVAILABILITY\nThis function was marked deprecated in libssh2 1.2.6 as\n \\fIlibssh2_scp_send64(3)\\fP has been introduced to replace this function.\n.SH SEE ALSO\n.BR libssh2_channel_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_abstract.3",
    "content": ".TH libssh2_session_abstract 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_abstract - return a pointer to a session's abstract pointer\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid **\nlibssh2_session_abstract(LIBSSH2_SESSION *session);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\nReturn a pointer to where the abstract pointer provided to\n\\fBlibssh2_session_init_ex(3)\\fP is stored. By providing a doubly\nde-referenced pointer, the internal storage of the session instance may be\nmodified in place.\n\n.SH RETURN VALUE\nA pointer to session internal storage who's contents point to previously\nprovided abstract data.\n\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_banner_get.3",
    "content": ".TH libssh2_session_banner_get 3 \"9 Sep 2011\" \"libssh2 1.4.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_banner_get - get the remote banner\n.SH SYNOPSIS\n#include <libssh2.h>\n\nconst char *libssh2_session_banner_get(oLIBSSH2_SESSION *session);\n.SH DESCRIPTION\nOnce the session has been setup and \\fIlibssh2_session_handshake(3)\\fP has\ncompleted successfully, this function can be used to get the server id from\nthe banner each server presents.\n.SH RETURN VALUE\nA pointer to a string or NULL if something failed. The data pointed to will be\nallocated and associated to the session handle and will be freed by libssh2\nwhen \\fIlibssh2_session_free(3)\\fP is used.\n.SH AVAILABILITY\nAdded in 1.4.0\n.SH SEE ALSO\n.BR libssh2_session_banner_set(3),\n.BR libssh2_session_handshake(3),\n.BR libssh2_session_free(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_banner_set.3",
    "content": ".TH libssh2_session_banner_set 3 \"9 Sep 2011\" \"libssh2 1.4.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_banner_set - set the SSH protocol banner for the local client\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_session_banner_set(LIBSSH2_SESSION *session, const char *banner);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIbanner\\fP - A pointer to a zero-terminated string holding the user defined\nbanner\n\nSet the banner that will be sent to the remote host when the SSH session is\nstarted with \\fIlibssh2_session_handshake(3)\\fP This is optional; a banner\ncorresponding to the protocol and libssh2 version will be sent by default.\n.SH RETURN VALUE\nReturns 0 on success or negative on failure.  It returns LIBSSH2_ERROR_EAGAIN\nwhen it would otherwise block. While LIBSSH2_ERROR_EAGAIN is a negative\nnumber, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n.SH AVAILABILITY\nAdded in 1.4.0.\n\nBefore 1.4.0 this function was known as libssh2_banner_set(3)\n.SH SEE ALSO\n.BR libssh2_session_handshake(3),\n.BR libssh2_session_banner_get(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_block_directions.3",
    "content": ".TH libssh2_session_block_directions 3 \"1 Oct 2008\" \"libssh2 1.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_block_directions - get directions to wait for\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_session_block_directions(LIBSSH2_SESSION *session);\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \\fBlibssh2_session_init_ex(3)\\fP\n\nWhen any of libssh2 functions return \\fBLIBSSH2_ERROR_EAGAIN\\fP an application\nshould wait for the socket to have data available for reading or\nwriting. Depending on the return value of\n\\fIlibssh2_session_block_directions(3)\\fP an application should wait for read,\nwrite or both.\n.SH RETURN VALUE\nReturns the set of directions as a binary mask. Can be a combination of:\n\nLIBSSH2_SESSION_BLOCK_INBOUND: Inbound direction blocked.\n\nLIBSSH2_SESSION_BLOCK_OUTBOUND: Outbound direction blocked.\n\nApplication should wait for data to be available for socket prior to calling a\nlibssh2 function again. If \\fBLIBSSH2_SESSION_BLOCK_INBOUND\\fP is set select\nshould contain the session socket in readfds set.  Correspondingly in case of\n\\fBLIBSSH2_SESSION_BLOCK_OUTBOUND\\fP writefds set should contain the socket.\n.SH AVAILABILITY\nAdded in 1.0\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_callback_set.3",
    "content": ".TH libssh2_session_callback_set 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_callback_set - set a callback function\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nvoid *libssh2_session_callback_set(LIBSSH2_SESSION *session,\n                                   int cbtype, void *callback);\n.SH DESCRIPTION\nSets a custom callback handler for a previously initialized session\nobject. Callbacks are triggered by the receipt of special packets at the\nTransport layer. To disable a callback, set it to NULL.\n\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIcbtype\\fP - Callback type. One of the types listed in Callback Types.\n\n\\fIcallback\\fP - Pointer to custom callback function. The prototype for \nthis function must match the associated callback declaration macro.\n.SH CALLBACK TYPES\n.IP LIBSSH2_CALLBACK_IGNORE\nCalled when a SSH_MSG_IGNORE message is received\n.IP LIBSSH2_CALLBACK_DEBUG\nCalled when a SSH_MSG_DEBUG message is received\n.IP LIBSSH2_CALLBACK_DISCONNECT\nCalled when a SSH_MSG_DISCONNECT message is received\n.IP LIBSSH2_CALLBACK_MACERROR\nCalled when a mismatched MAC has been detected in the transport layer. If the\nfunction returns 0, the packet will be accepted nonetheless.\n.IP LIBSSH2_CALLBACK_X11\nCalled when an X11 connection has been accepted\n.IP LIBSSH2_CALLBACK_SEND\nCalled when libssh2 wants to send some data on the connection.\nCan be set to a custom function to handle I/O your own way.\n.IP LIBSSH2_CALLBACK_RECV\nCalled when libssh2 wants to receive some data from the connection.\nCan be set to a custom function to handle I/O your own way.\n.SH RETURN VALUE\nPointer to previous callback handler. Returns NULL if no prior callback\nhandler was set or the callback type was unknown.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_disconnect.3",
    "content": ".TH libssh2_session_disconnect 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_disconnect - convenience macro for \\fIlibssh2_session_disconnect_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_session_disconnect(LIBSSH2_SESSION *session, const char *description);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_session_disconnect_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_session_disconnect_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_session_disconnect_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_session_disconnect_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_disconnect_ex.3",
    "content": ".TH libssh2_session_disconnect_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_disconnect_ex - terminate transport layer\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_session_disconnect_ex(LIBSSH2_SESSION *session, int reason, const char *description, const char *lang);\n\nint \nlibssh2_session_disconnect(LIBSSH2_SESSION *session, const char *description);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIreason\\fP - One of the Disconnect Reason constants.\n\n\\fIdescription\\fP - Human readable reason for disconnection.\n\n\\fIlang\\fP - Localization string describing the language/encoding of the description provided.\n\nSend a disconnect message to the remote host associated with \\fIsession\\fP, \nalong with a \\fIreason\\fP symbol and a verbose \\fIdescription\\fP.\n\nAs a convenience, the macro \n.BR libssh2_session_disconnect(3)\nis provided. It calls\n.BR libssh2_session_disconnect_ex(3)\nwith \\fIreason\\fP set to SSH_DISCONNECT_BY_APPLICATION \nand \\fIlang\\fP set to an empty string.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_flag.3",
    "content": ".TH libssh2_session_flag 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_flag - TODO\n.SH SYNOPSIS\nint\nlibssh2_session_flag(LIBSSH2_SESSION *session, int flag, int value);\n.SH DESCRIPTION\nSet options for the created session. \\fIflag\\fP is the option to set, while\n\\fIvalue\\fP is typically set to 1 or 0 to enable or disable the option.\n.SH FLAGS\n.IP LIBSSH2_FLAG_SIGPIPE\nIf set, libssh2 will not attempt to block SIGPIPEs but will let them trigger\nfrom the underlying socket layer.\n.IP LIBSSH2_FLAG_COMPRESS\nIf set - before the connection negotiation is performed - libssh2 will try to\nnegotiate compression enabling for this connection. By default libssh2 will\nnot attempt to use compression.\n.SH RETURN VALUE\nReturns regular libssh2 error code.\n.SH AVAILABILITY\nThis function has existed since the age of dawn. LIBSSH2_FLAG_COMPRESS was\nadded in version 1.2.8.\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_free.3",
    "content": ".TH libssh2_session_free 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_free - frees resources associated with a session instance\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_session_free(LIBSSH2_SESSION *session);\n.SH DESCRIPTION\nFrees all resources associated with a session instance. Typically called after\n.BR libssh2_session_disconnect_ex(3)\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n.BR libssh2_session_disconnect_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_get_blocking.3",
    "content": ".TH libssh2_session_get_blocking 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_get_blocking - TODO\n.SH SYNOPSIS\nint libssh2_session_get_blocking(LIBSSH2_SESSION *session);\n.SH DESCRIPTION\nReturns 0 if the state of the session has previously be set to non-blocking\nand it returns 1 if the state was set to blocking.\n.SH RETURN VALUE\nSee description.\n.SH SEE ALSO\n.BR libssh2_session_set_blocking(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_get_timeout.3",
    "content": ".TH libssh2_session_get_timeout 3 \"4 May 2011\" \"libssh2 1.2.9\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_get_timeout - get the timeout for blocking functions\n.SH SYNOPSIS\n#include <libssh2.h>\n.nf\nlong libssh2_session_get_timeout(LIBSSH2_SESSION *session);\n.SH DESCRIPTION\nReturns the \\fBtimeout\\fP (in milliseconds) for how long a blocking the\nlibssh2 function calls may wait until they consider the situation an error and\nreturn LIBSSH2_ERROR_TIMEOUT.\n\nBy default libssh2 has no timeout (zero) for blocking functions.\n.SH RETURN VALUE\nThe value of the timeout setting.\n.SH AVAILABILITY\nAdded in 1.2.9\n.SH SEE ALSO\n.BR libssh2_session_set_timeout(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_handshake.3",
    "content": ".TH libssh2_session_handshake 3 \"7 Oct 2010\" \"libssh2 1.2.8\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_handshake - perform the SSH handshake\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_session_handshake(LIBSSH2_SESSION *session, libssh2_socket_t socket);\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by\n.BR libssh2_session_init_ex(3)\n\n\\fIsocket\\fP - Connected socket descriptor. Typically a TCP connection\nthough the protocol allows for any reliable transport and the library will\nattempt to use any berkeley socket.\n\nBegin transport layer protocol negotiation with the connected host.\n.SH RETURN VALUE\nReturns 0 on success, negative on failure.\n.SH ERRORS\n\\fILIBSSH2_ERROR_SOCKET_NONE\\fP - The socket is invalid.\n\n\\fILIBSSH2_ERROR_BANNER_SEND\\fP - Unable to send banner to remote host.\n\n\\fILIBSSH2_ERROR_KEX_FAILURE\\fP - >Encryption key exchange with the remote\nhost failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_DISCONNECT\\fP - The socket was disconnected.\n\n\\fILIBSSH2_ERROR_PROTO\\fP - An invalid SSH protocol response was received on\nthe socket.\n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would block.\n.SH AVAILABILITY\nAdded in 1.2.8\n.SH SEE ALSO\n.BR libssh2_session_free(3)\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_hostkey.3",
    "content": ".TH libssh2_session_hostkey 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_hostkey - get the remote key\n.SH SYNOPSIS\n#include <libssh2.h>\n\nconst char *libssh2_session_hostkey(LIBSSH2_SESSION *session,\n                                    size_t *len, int *type);\n.SH DESCRIPTION\nReturns a pointer to the current host key, the value \\fIlen\\fP points to will\nget the length of the key.\n\nThe value \\fItype\\fP points to the type of hostkey which is one of:\nLIBSSH2_HOSTKEY_TYPE_RSA, LIBSSH2_HOSTKEY_TYPE_DSS, or\nLIBSSH2_HOSTKEY_TYPE_UNKNOWN.\n\n.SH RETURN VALUE\nA pointer, or NULL if something went wrong.\n.SH SEE ALSO\n.BR libssh2_knownhost_check(3)\n.BR libssh2_knownhost_add(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_init.3",
    "content": ".TH libssh2_session_init 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_init - convenience macro for \\fIlibssh2_session_init_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_SESSION *\nlibssh2_session_init(void);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_session_init_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_session_init_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_session_init_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_init_ex.3",
    "content": ".TH libssh2_session_init_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_init_ex - initializes an SSH session object\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_SESSION * \nlibssh2_session_init_ex(LIBSSH2_ALLOC_FUNC((*myalloc)), LIBSSH2_FREE_FUNC((*myfree)), LIBSSH2_REALLOC_FUNC((*myrealloc)), void *abstract);\n\nLIBSSH2_SESSION *\nlibssh2_session_init(void);\n\n.SH DESCRIPTION\n\\fImyalloc\\fP - Custom allocator function. Refer to the section on Callbacks \nfor implementing an allocator callback. Pass a value of NULL to use the \ndefault system allocator.\n\n\\fImyfree\\fP - Custom de-allocator function. Refer to the section on Callbacks \nfor implementing a deallocator callback. Pass a value of NULL to use the \ndefault system deallocator.\n\n\\fImyrealloc\\fP - Custom re-allocator function. Refer to the section on \nCallbacks for implementing a reallocator callback. Pass a value of NULL to \nuse the default system reallocator.\n\n\\fIabstract\\fP - Arbitrary pointer to application specific callback data. \nThis value will be passed to any callback function associated with the named \nsession instance.\n\nInitializes an SSH session object. By default system memory allocators\n(malloc(), free(), realloc()) will be used for any dynamically allocated memory\nblocks. Alternate memory allocation functions may be specified using the\nextended version of this API call, and/or optional application specific data\nmay be attached to the session object.\n\nThis method must be called first, prior to configuring session options or\nstarting up an SSH session with a remote server.\n.SH RETURN VALUE\nPointer to a newly allocated LIBSSH2_SESSION instance, or NULL on errors.\n.SH SEE ALSO\n.BR libssh2_session_free(3)\n.BR libssh2_session_handshake(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_last_errno.3",
    "content": ".TH libssh2_session_last_errno 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_last_errno - get the most recent error number\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_session_last_errno(LIBSSH2_SESSION *session);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\nDetermine the most recent error condition.\n\n.SH RETURN VALUE\nNumeric error code corresponding to the the Error Code constants.\n\n.SH SEE ALSO\n.BR libssh2_session_last_error(3)\n.BR libssh2_session_set_last_error(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_last_error.3",
    "content": ".TH libssh2_session_last_error 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_last_error - get the most recent error\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_session_last_error(LIBSSH2_SESSION *session, char **errmsg, int *errmsg_len, int want_buf);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIerrmsg\\fP - If not NULL, is populated by reference with the human \nreadable form of the most recent error message.\n\n\\fIerrmsg_len\\fP - If not NULL, is populated by reference with the length \nof errmsg. (The string is NUL-terminated, so the length is only useful as \nan optimization, to avoid calling strlen.)\n\n\\fIwant_buf\\fP - If set to a non-zero value, \"ownership\" of the errmsg \nbuffer will be given to the calling scope. If necessary, the errmsg buffer \nwill be duplicated.\n\nDetermine the most recent error condition and its cause.\n\n.SH RETURN VALUE\nNumeric error code corresponding to the the Error Code constants.\n\n.SH SEE ALSO\n.BR libssh2_session_last_errno(3)\n.BR libssh2_session_set_last_error(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_method_pref.3",
    "content": ".TH libssh2_session_method_pref 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_method_pref - set preferred key exchange method\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_session_method_pref(LIBSSH2_SESSION *session, int method_type, const char *prefs);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fImethod_type\\fP - One of the Method Type constants.\n\n\\fIprefs\\fP - Coma delimited list of preferred methods to use with \nthe most preferred listed first and the least preferred listed last. \nIf a method is listed which is not supported by libssh2 it will be \nignored and not sent to the remote host during protocol negotiation.\n\nSet preferred methods to be negotiated. These \npreferences must be set prior to calling\n.BR libssh2_session_handshake(3)\nas they are used during the protocol initiation phase.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_INVAL\\fP - The requested method type was invalid.\n\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_METHOD_NOT_SUPPORTED\\fP - The requested method is not supported.\n\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n.BR libssh2_session_handshake(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_methods.3",
    "content": ".TH libssh2_session_methods 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_methods - return the currently active algorithms\n.SH SYNOPSIS\n#include <libssh2.h>\n\nconst char *\nlibssh2_session_methods(LIBSSH2_SESSION *session, int method_type);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fImethod_type\\fP - one of the method type constants: LIBSSH2_METHOD_KEX,\nLIBSSH2_METHOD_HOSTKEY, LIBSSH2_METHOD_CRYPT_CS, LIBSSH2_METHOD_CRYPT_SC,\nLIBSSH2_METHOD_MAC_CS, LIBSSH2_METHOD_MAC_SC, LIBSSH2_METHOD_COMP_CS,\nLIBSSH2_METHOD_COMP_SC, LIBSSH2_METHOD_LANG_CS, LIBSSH2_METHOD_LANG_SC.\n\nReturns the actual method negotiated for a particular transport parameter.\n.SH RETURN VALUE\nNegotiated method or NULL if the session has not yet been started.\n.SH ERRORS\n\\fILIBSSH2_ERROR_INVAL\\fP - The requested method type was invalid.\n\n\\fILIBSSH2_ERROR_METHOD_NONE\\fP - no method has been set\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_set_blocking.3",
    "content": ".TH libssh2_session_set_blocking 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_set_blocking - set or clear blocking mode on session\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid \nlibssh2_session_set_blocking(LIBSSH2_SESSION *session, int blocking);\n\n.SH DESCRIPTION\n\\fIsession\\fP - session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIblocking\\fP - Set to a non-zero value to make the channel block, or zero to\nmake it non-blocking.\n\nSet or clear blocking mode on the selected on the session.  This will\ninstantly affect any channels associated with this session. If a read is\nperformed on a session with no data currently available, a blocking session\nwill wait for data to arrive and return what it receives.  A non-blocking\nsession will return immediately with an empty buffer.  If a write is performed\non a session with no room for more data, a blocking session will wait for\nroom.  A non-blocking session will return immediately without writing\nanything.\n\n.SH RETURN VALUE\nNone\n\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_set_last_error.3",
    "content": ".TH libssh2_session_set_last_error 3 \"26 Oct 2015\" \"libssh2 1.6.1\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_set_last_error - sets the internal error state\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_session_set_last_error(LIBSSH2_SESSION *session, int errcode, const char *errmsg)\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by\n.BR libssh2_session_init_ex(3)\n\n\\fIerrcode\\fP - One of the error codes as defined in the public\nlibssh2 header file.\n\n\\fIerrmsg\\fP - If not NULL, a copy of the given string is stored\ninside the session object as the error message.\n\nThis function is provided for high level language wrappers\n(i.e. Python or Perl) and other libraries that may extend libssh2 with\nadditional features while still relying on its error reporting\nmechanism.\n\n.SH RETURN VALUE\nNumeric error code corresponding to the the Error Code constants.\n\n.SH AVAILABILITY\nAdded in 1.6.1\n\n.SH SEE ALSO\n.BR libssh2_session_last_error(3)\n.BR libssh2_session_last_errno(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_set_timeout.3",
    "content": ".TH libssh2_session_set_timeout 3 \"4 May 2011\" \"libssh2 1.2.9\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_set_timeout - set timeout for blocking functions\n.SH SYNOPSIS\n#include <libssh2.h>\n.nf\nvoid libssh2_session_set_timeout(LIBSSH2_SESSION *session, long timeout);\n.SH DESCRIPTION\nSet the \\fBtimeout\\fP in milliseconds for how long a blocking the libssh2\nfunction calls may wait until they consider the situation an error and return\nLIBSSH2_ERROR_TIMEOUT.\n\nBy default or if you set the timeout to zero, libssh2 has no timeout for\nblocking functions.\n.SH RETURN VALUE\nNothing\n.SH AVAILABILITY\nAdded in 1.2.9\n.SH SEE ALSO\n.BR libssh2_session_get_timeout(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_startup.3",
    "content": ".TH libssh2_session_startup 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_startup - begin transport layer\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_session_startup(LIBSSH2_SESSION *session, int socket);\n.SH DESCRIPTION\nStarting in libssh2 version 1.2.8 this function is considered deprecated. Use\n\\fIlibssh2_session_handshake(3)\\fP instead.\n\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIsocket\\fP - Connected socket descriptor. Typically a TCP connection \nthough the protocol allows for any reliable transport and the library will \nattempt to use any berkeley socket.\n\nBegin transport layer protocol negotiation with the connected host.\n.SH RETURN VALUE\nReturns 0 on success, negative on failure.\n.SH ERRORS\n\\fILIBSSH2_ERROR_SOCKET_NONE\\fP - The socket is invalid.\n\n\\fILIBSSH2_ERROR_BANNER_SEND\\fP - Unable to send banner to remote host.\n\n\\fILIBSSH2_ERROR_KEX_FAILURE\\fP - >Encryption key exchange with the remote \nhost failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_DISCONNECT\\fP - The socket was disconnected.\n\n\\fILIBSSH2_ERROR_PROTO\\fP - An invalid SSH protocol response was received on \nthe socket.\n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would block.\n\n.SH SEE ALSO\n.BR libssh2_session_free(3)\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_session_supported_algs.3",
    "content": ".TH libssh2_session_supported_algs 3 \"23 Oct 2011\" \"libssh2 1.4.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_session_supported_algs - get list of supported algorithms\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nint libssh2_session_supported_algs(LIBSSH2_SESSION* session,\n                                   int method_type,\n                                   const char*** algs);\n.SH DESCRIPTION\n\\fIsession\\fP - An instance of initialized LIBSSH2_SESSION (the function will\nuse its pointer to the memory allocation function).  \\fImethod_type\\fP -\nMethod type. See \\fIlibssh2_session_method_pref(3)\\fP.  \\fIalgs\\fP - Address\nof a pointer that will point to an array of returned algorithms\n\nGet a list of supported algorithms for the given \\fImethod_type\\fP. The\nmethod_type parameter is equivalent to method_type in\n\\fIlibssh2_session_method_pref(3)\\fP. If successful, the function will\nallocate the appropriate amount of memory. When not needed anymore, it must be\ndeallocated by calling \\fIlibssh2_free(3)\\fP. When this function is\nunsuccessful, this must not be done.\n\nIn order to get a list of all supported compression algorithms,\nlibssh2_session_flag(session, LIBSSH2_FLAG_COMPRESS, 1) must be called before\ncalling this function, otherwise only \"none\" will be returned.\n\nIf successful, the function will allocate and fill the array with supported\nalgorithms (the same names as defined in RFC 4253).  The array is not NULL\nterminated.\n.SH EXAMPLE\n.nf\n#include \"libssh2.h\"\n\nconst char **algorithms;\nint rc, i;\nLIBSSH2_SESSION *session;\n\n/* initialize session */\nsession = libssh2_session_init();\nrc = libssh2_session_supported_algs(session,\n                                    LIBSSH2_METHOD_CRYPT_CS,\n                                    &algorithms);\nif (rc>0) {\n    /* the call succeeded, do sth. with the list of algorithms\n       (e.g. list them)... */\n    printf(\"Supported symmetric algorithms:\\\\n\");\n    for ( i=0; i<rc; i++ )\n        printf(\"\\\\t%s\\\\n\", algorithms[i]);\n\n    /* ... and free the allocated memory when not needed anymore */\n    libssh2_free(session, algorithms);\n}\nelse {\n    /* call failed, error handling */\n}\n.SH RETURN VALUE\nOn success, a number of returned algorithms (i.e a positive number will be\nreturned).  In case of a failure, an error code (a negative number, see below)\nis returned.  0 should never be returned.\n.SH ERRORS\n\\fILIBSSH2_ERROR_BAD_USE\\fP - Invalid address of algs.\n\n\\fILIBSSH2_ERROR_METHOD_NOT_SUPPORTED\\fP -  Unknown method type.\n\n\\fILIBSSH2_ERROR_INVAL\\fP - Internal error (normally should not occur).\n\n\\fILIBSSH2_ERROR_ALLOC\\fP - Allocation of memory failed.\n.SH AVAILABILITY\nAdded in 1.4.0\n.SH SEE ALSO\n.BR libssh2_session_methods(3),\n.BR libssh2_session_method_pref(3)\n.BR libssh2_free(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_close.3",
    "content": ".TH libssh2_sftp_close 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_close - convenience macro for \\fIlibssh2_sftp_close_handle(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_close(LIBSSH2_SFTP_HANDLE *handle);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_close_handle(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_close_handle(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_close_handle(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_close_handle(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_close_handle.3",
    "content": ".TH libssh2_sftp_close_handle 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_close_handle - close filehandle\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint \nlibssh2_sftp_close_handle(LIBSSH2_SFTP_HANDLE *handle);\n\nint \nlibssh2_sftp_close(LIBSSH2_SFTP_HANDLE *handle);\n\nint \nlibssh2_sftp_closedir(LIBSSH2_SFTP_HANDLE *handle);\n\n.SH DESCRIPTION\n\\fIhandle\\fP - SFTP File Handle as returned by \\fBlibssh2_sftp_open_ex(3)\\fP\nor \\fBlibssh2_sftp_opendir(3)\\fP (which is a macro).\n\nClose an active LIBSSH2_SFTP_HANDLE. Because files and directories share the\nsame underlying storage mechanism these methods may be used\ninterchangeably. \\fBlibssh2_sftp_close(3)\\fP and \\fBlibssh2_sftp_closedir(3)\\fP\nare macros for \\fBlibssh2_sftp_close_handle(3)\\fP.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to \nbe returned by the server.\n\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_closedir.3",
    "content": ".TH libssh2_sftp_closedir 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_closedir - convenience macro for \\fIlibssh2_sftp_close_handle(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_closedir(LIBSSH2_SFTP_HANDLE *handle)\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_close_handle(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_close_handle(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_close_handle(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_close_handle(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_fsetstat.3",
    "content": ".TH libssh2_sftp_fsetstat 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_fsetstat - convenience macro for \\fIlibssh2_sftp_fstat_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_fsetstat(LIBSSH2_SFTP_HANDLE *handle, LIBSSH2_SFTP_ATTRIBUTES *attrs);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_fstat_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_fstat_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_fstat_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_fstat_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_fstat.3",
    "content": ".TH libssh2_sftp_fstat 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_fstat - convenience macro for \\fIlibssh2_sftp_fstat_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_fstat(LIBSSH2_SFTP_HANDLE *handle, LIBSSH2_SFTP_ATTRIBUTES *attrs);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_fstat_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_fstat_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_fstat_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_fstat_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_fstat_ex.3",
    "content": ".TH libssh2_sftp_fstat_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_fstat_ex - get or set attributes on an SFTP file handle\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint \nlibssh2_sftp_fstat_ex(LIBSSH2_SFTP_HANDLE *handle,\n                      LIBSSH2_SFTP_ATTRIBUTES *attrs, int setstat)\n\n#define libssh2_sftp_fstat(handle, attrs) \\\\\n    libssh2_sftp_fstat_ex((handle), (attrs), 0)\n#define libssh2_sftp_fsetstat(handle, attrs) \\\\\n    libssh2_sftp_fstat_ex((handle), (attrs), 1)\n.fi\n.SH DESCRIPTION\n\\fIhandle\\fP - SFTP File Handle as returned by \n.BR libssh2_sftp_open_ex(3)\n\n\\fIattrs\\fP - Pointer to an LIBSSH2_SFTP_ATTRIBUTES structure to set file\nmetadata from or into depending on the value of setstat.\n\n\\fIsetstat\\fP - When non-zero, the file's metadata will be updated \nwith the data found in attrs according to the values of attrs->flags \nand other relevant member attributes.\n\nGet or Set statbuf type data for a given LIBSSH2_SFTP_HANDLE instance.\n.SH DATA TYPES\nLIBSSH2_SFTP_ATTRIBUTES is a typedefed struct that is defined as below\n\n.nf\nstruct _LIBSSH2_SFTP_ATTRIBUTES {\n\n    /* If flags & ATTR_* bit is set, then the value in this\n     * struct will be meaningful Otherwise it should be ignored\n     */\n    unsigned long flags;\n\n    /* size of file, in bytes */\n    libssh2_uint64_t filesize;\n\n    /* numerical representation of the user and group owner of\n     * the file\n     */\n    unsigned long uid, gid;\n\n    /* bitmask of permissions */\n    unsigned long permissions;\n\n    /* access time and modified time of file */\n    unsigned long atime, mtime;\n};\n.fi\n\nYou will find a full set of defines and macros to identify flags and\npermissions on the \\fBlibssh2_sftp.h\\fP header file, but some of the\nmost common ones are:\n\nTo check for specific user permissions, the set of defines are in the\npattern LIBSSH2_SFTP_S_I<action><who> where <action> is R, W or X for\nread, write and executable and <who> is USR, GRP and OTH for user,\ngroup and other. So, you check for a user readable file, use the bit\n\\fILIBSSH2_SFTP_S_IRUSR\\fP while you want to see if it is executable\nfor other, you use \\fILIBSSH2_SFTP_S_IXOTH\\fP and so on.\n\nTo check for specific file types, you would previously (before libssh2\n1.2.5) use the standard posix S_IS***() macros, but since 1.2.5\nlibssh2 offers its own set of macros for this functionality:\n.IP LIBSSH2_SFTP_S_ISLNK\nTest for a symbolic link\n.IP LIBSSH2_SFTP_S_ISREG\nTest for a regular file\n.IP LIBSSH2_SFTP_S_ISDIR\nTest for a directory\n.IP LIBSSH2_SFTP_S_ISCHR\nTest for a character special file\n.IP LIBSSH2_SFTP_S_ISBLK\nTest for a block special file\n.IP LIBSSH2_SFTP_S_ISFIFO\nTest for a pipe or FIFO special file\n.IP LIBSSH2_SFTP_S_ISSOCK\nTest for a socket\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to \nbe returned by the server.\n.SH AVAILABILITY\nThis function has been around since forever, but most of the\nLIBSSH2_SFTP_S_* defines were introduced in libssh2 0.14 and the\nLIBSSH2_SFTP_S_IS***() macros were introduced in libssh2 1.2.5.\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_fstatvfs.3",
    "content": ".so man3/libssh2_sftp_statvfs.3\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_fsync.3",
    "content": ".TH libssh2_sftp_fsync 3 \"8 Apr 2013\" \"libssh2 1.4.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_fsync - synchronize file to disk\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint\nlibssh2_sftp_fsync(LIBSSH2_SFTP_HANDLE *handle)\n.fi\n.SH DESCRIPTION\nThis function causes the remote server to synchronize the file\ndata and metadata to disk (like fsync(2)).\n\nFor this to work requires fsync@openssh.com support on the server.\n\n\\fIhandle\\fP - SFTP File Handle as returned by\n.BR libssh2_sftp_open_ex(3)\n\n.SH RETURN VALUE\nReturns 0 on success or negative on failure. If used in non-blocking mode, it\nreturns LIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response\nwas received on the socket, or an SFTP operation caused an errorcode\nto be returned by the server.  In particular, this can be returned if\nthe SSH server does not support the fsync operation: the SFTP subcode\n\\fILIBSSH2_FX_OP_UNSUPPORTED\\fP will be returned in this case.\n\n.SH AVAILABILITY\nAdded in libssh2 1.4.4 and OpenSSH 6.3.\n.SH SEE ALSO\n.BR fsync(2)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_get_channel.3",
    "content": ".TH libssh2_sftp_get_channel 3 \"9 Sep 2011\" \"libssh2 1.4.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_get_channel - return the channel of sftp\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n.fi\nLIBSSH2_CHANNEL *libssh2_sftp_get_channel(LIBSSH2_SFTP *sftp);\n.SH DESCRIPTION\n\\fIsftp\\fP - SFTP instance as returned by\n.BR libssh2_sftp_init(3)\n\nReturn the channel of the given sftp handle.\n.SH RETURN VALUE\nThe channel of the SFTP instance or NULL if something was wrong.\n.SH AVAILABILITY\nAdded in 1.4.0\n.SH SEE ALSO\n.BR libssh2_sftp_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_init.3",
    "content": ".TH libssh2_sftp_init 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_init - open SFTP channel for the given SSH session.\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nLIBSSH2_SFTP *\nlibssh2_sftp_init(LIBSSH2_SESSION *session);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\nOpen a channel and initialize the SFTP subsystem. Although the SFTP subsystem\noperates over the same type of channel as those exported by the Channel API,\nthe protocol itself implements its own unique binary packet protocol which\nmust be managed with the libssh2_sftp_*() family of functions. When an SFTP\nsession is complete, it must be destroyed using the\n.BR libssh2_sftp_shutdown(3)\nfunction.\n.SH RETURN VALUE\nA pointer to the newly allocated SFTP instance or NULL on failure.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to be \nreturned by the server.\n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would\nblock.\n.SH SEE ALSO\n.BR libssh2_sftp_shutdown(3)\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_last_error.3",
    "content": ".TH libssh2_sftp_last_error 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_last_error - return the last SFTP-specific error code\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nunsigned long \nlibssh2_sftp_last_error(LIBSSH2_SFTP *sftp);\n\n.SH DESCRIPTION\n\\fIsftp\\fP - SFTP instance as returned by \n.BR libssh2_sftp_init(3)\n\nReturns the last error code produced by the SFTP layer. Note that this only\nreturns a sensible error code if libssh2 returned LIBSSH2_ERROR_SFTP_PROTOCOL\nin a previous call. Using \\fBlibssh2_sftp_last_error(3)\\fP without a\npreceding SFTP protocol error, it will return an unspecified value.\n\n.SH RETURN VALUE\nCurrent error code state of the SFTP instance.\n\n.SH SEE ALSO\n.BR libssh2_sftp_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_lstat.3",
    "content": ".TH libssh2_sftp_lstat 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_lstat - convenience macro for \\fIlibssh2_sftp_stat_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_lstat(LIBSSH2_SFTP *sftp, const char *path, LIBSSH2_SFTP_ATTRIBUTES *attrs);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_stat_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_stat_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_stat_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_stat_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_mkdir.3",
    "content": ".TH libssh2_sftp_mkdir 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_mkdir - convenience macro for \\fIlibssh2_sftp_mkdir_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_mkdir(LIBSSH2_SFTP *sftp, const char *path, long mode);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_mkdir_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_mkdir_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_mkdir_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_mkdir_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_mkdir_ex.3",
    "content": ".TH libssh2_sftp_mkdir_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_mkdir_ex - create a directory on the remote file system\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint \nlibssh2_sftp_mkdir_ex(LIBSSH2_SFTP *sftp, const char *path, unsigned int path_len, long mode);\n\nint \nlibssh2_sftp_mkdir(LIBSSH2_SFTP *sftp, const char *path, long mode);\n.SH DESCRIPTION\n\\fIsftp\\fP - SFTP instance as returned by \n.BR libssh2_sftp_init(3)\n\n\\fIpath\\fP - full path of the new directory to create. Note that the new \ndirectory's parents must all exist prior to making this call.\n\n\\fIpath_len\\fP - length of the full path of the new directory to create.\n\n\\fImode\\fP - directory creation mode (e.g. 0755).\n\nCreate a directory on the remote file system.\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to be \nreturned by the server.\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_open.3",
    "content": ".TH libssh2_sftp_open 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_open - convenience macro for \\fIlibssh2_sftp_open_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_SFTP_HANDLE *\nlibssh2_sftp_open(LIBSSH2_SFTP *sftp, const char *path, unsigned long flags, long mode);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_open_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_open_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_open_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_open_ex.3",
    "content": ".TH libssh2_sftp_open_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_open - open filehandle for file on SFTP.\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nLIBSSH2_SFTP_HANDLE *\nlibssh2_sftp_open_ex(LIBSSH2_SFTP *sftp, const char *filename,\n                     unsigned int filename_len, unsigned long flags,\n                     long mode, int open_type);\n.SH DESCRIPTION\n\\fIsftp\\fP - SFTP instance as returned by \\fIlibssh2_sftp_init(3)\\fP\n\n\\fIfilename\\fP - Remote file/directory resource to open \n\n\\fIfilename_len\\fP - Length of filename \n\n\\fIflags\\fP - Any reasonable combination of the LIBSSH2_FXF_* constants:\n.RS\n.IP LIBSSH2_FXF_READ\nOpen the file for reading.\n.IP LIBSSH2_FXF_WRITE\nOpen the file for writing.  If both this and LIBSSH2_FXF_READ are specified,\nthe file is opened for both reading and writing.\n.IP LIBSSH2_FXF_APPEND\nForce all writes to append data at the end of the file.\n.IP LIBSSH2_FXF_CREAT,\nIf this flag is specified, then a new file will be created if one does not\nalready exist (if LIBSSH2_FXF_TRUNC is specified, the new file will be\ntruncated to zero length if it previously exists)\n.IP LIBSSH2_FXF_TRUNC\nForces an existing file with the same name to be truncated to zero length when\ncreating a file by specifying LIBSSH2_FXF_CREAT. LIBSSH2_FXF_CREAT MUST also\nbe specified if this flag is used.\n.IP LIBSSH2_FXF_EXCL\nCauses the request to fail if the named file already exists.\nLIBSSH2_FXF_CREAT MUST also be specified if this flag is used.\n\n.RE\n\\fImode\\fP - POSIX file permissions to assign if the file is being newly\ncreated. See the LIBSSH2_SFTP_S_* convenience defines in <libssh2_sftp.h>\n\n\\fIopen_type\\fP - Either of LIBSSH2_SFTP_OPENFILE (to open a file) or\nLIBSSH2_SFTP_OPENDIR (to open a directory).\n.SH RETURN VALUE\nA pointer to the newly created LIBSSH2_SFTP_HANDLE instance or NULL on\nfailure.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to be \nreturned by the server.\n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call would\nblock.\n.SH SEE ALSO\n.BR libssh2_sftp_close_handle(3)\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_opendir.3",
    "content": ".TH libssh2_sftp_opendir 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_opendir - convenience macro for \\fIlibssh2_sftp_open_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nLIBSSH2_SFTP_HANDLE *\nlibssh2_sftp_opendir(LIBSSH2_SFTP *sftp, const char *path);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_open_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_open_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_open_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_read.3",
    "content": ".TH libssh2_sftp_read 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_read - read data from an SFTP handle\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nssize_t \nlibssh2_sftp_read(LIBSSH2_SFTP_HANDLE *handle, char *buffer, size_t buffer_maxlen);\n\n.SH DESCRIPTION\n\\fIhandle\\fP is the SFTP File Handle as returned by \n.BR libssh2_sftp_open_ex(3)\n\n\\fIbuffer\\fP is a pointer to a pre-allocated buffer of at least\n\n\\fIbuffer_maxlen\\fP bytes to read data into.\n\nReads a block of data from an LIBSSH2_SFTP_HANDLE. This method is modelled\nafter the POSIX \n.BR read(2)\nfunction and uses the same calling semantics. \n.BR libssh2_sftp_read(3)\nwill attempt to read as much as possible however it may not fill all of buffer\nif the file pointer reaches the end or if further reads would cause the socket\nto block.\n.SH RETURN VALUE\nNumber of bytes actually populated into buffer, or negative on failure.  \nIt returns LIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was\nreceived on the socket, or an SFTP operation caused an errorcode to be\nreturned by the server.\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n.BR libssh2_sftp_read(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_readdir.3",
    "content": ".TH libssh2_sftp_readdir 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_readdir - convenience macro for \\fIlibssh2_sftp_readdir_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_readdir(LIBSSH2_SFTP_HANDLE *handle, char *buffer, size_t buffer_maxlen, LIBSSH2_SFTP_ATTRIBUTES *attrs);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_readdir_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_readdir_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_readdir_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_readdir_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_readdir_ex.3",
    "content": ".TH libssh2_sftp_readdir_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_readdir_ex - read directory data from an SFTP handle\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint \nlibssh2_sftp_readdir_ex(LIBSSH2_SFTP_HANDLE *handle,\n                        char *buffer, size_t buffer_maxlen,\n                        char *longentry, size_t longentry_maxlen,\n                        LIBSSH2_SFTP_ATTRIBUTES *attrs);\n.SH DESCRIPTION\nReads a block of data from a LIBSSH2_SFTP_HANDLE and returns file entry\ninformation for the next entry, if any.\n\n\\fIhandle\\fP - is the SFTP File Handle as returned by \n.BR libssh2_sftp_open_ex(3)\n\n\\fIbuffer\\fP - is a pointer to a pre-allocated buffer of at least\n\\fIbuffer_maxlen\\fP bytes to read data into.\n\n\\fIbuffer_maxlen\\fP - is the length of buffer in bytes. If the length of the \nfilename is longer than the space provided by buffer_maxlen it will be \ntruncated to fit.\n\n\\fIlongentry\\fP - is a pointer to a pre-allocated buffer of at least\n\\fIlongentry_maxlen\\fP bytes to read data into. The format of the `longname'\nfield is unspecified by SFTP protocol. It MUST be suitable for use in the\noutput of a directory listing command (in fact, the recommended operation for\na directory listing command is to simply display this data).\n\n\\fIlongentry_maxlen\\fP - is the length of longentry in bytes. If the length of\nthe full directory entry is longer than the space provided by\n\\fIlongentry_maxlen\\fP it will be truncated to fit.\n\n\\fIattrs\\fP - is a pointer to LIBSSH2_SFTP_ATTRIBUTES storage to populate \nstatbuf style data into.\n.SH RETURN VALUE\nNumber of bytes actually populated into buffer (not counting the terminating\nzero), or negative on failure.  It returns LIBSSH2_ERROR_EAGAIN when it would\notherwise block. While LIBSSH2_ERROR_EAGAIN is a negative number, it isn't\nreally a failure per se.\n.SH BUG\nPassing in a too small buffer for 'buffer' or 'longentry' when receiving data\nonly results in libssh2 1.2.7 or earlier to not copy the entire data amount,\nand it is not possible for the application to tell when it happens!\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to be \nreturned by the server.\n\nFrom 1.2.8, LIBSSH2_ERROR_BUFFER_TOO_SMALL is returned if any of the\ngiven 'buffer' or 'longentry' buffers are too small to fit the requested\nobject name.\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3),\n.BR libssh2_sftp_close_handle(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_readlink.3",
    "content": ".TH libssh2_sftp_readlink 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_readlink - convenience macro for \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\n#define libssh2_sftp_readlink(sftp, path, target, maxlen) \\\\\n    libssh2_sftp_symlink_ex((sftp), (path), strlen(path), (target), (maxlen), \\\\\n    LIBSSH2_SFTP_READLINK)\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_symlink_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_symlink_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_realpath.3",
    "content": ".TH libssh2_sftp_realpath 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_realpath - convenience macro for \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\n#define libssh2_sftp_realpath(sftp, path, target, maxlen) \\\\\n  libssh2_sftp_symlink_ex((sftp), (path), strlen(path), (target), (maxlen), \\\\\n                          LIBSSH2_SFTP_REALPATH)\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_symlink_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_symlink_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_rename.3",
    "content": ".TH libssh2_sftp_rename 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_rename - convenience macro for \\fIlibssh2_sftp_rename_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_rename(LIBSSH2_SFTP *sftp, const char *source_filename, const char *destination_filename);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_rename_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_rename_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_rename_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_rename_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_rename_ex.3",
    "content": ".TH libssh2_sftp_rename_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_rename_ex - rename an SFTP file\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint \nlibssh2_sftp_rename_ex(LIBSSH2_SFTP *sftp, const char *source_filename, unsigned int source_filename_len, const char *dest_filename, unsigned int dest_filename_len, long flags);\n\nint \nlibssh2_sftp_rename_ex(LIBSSH2_SFTP *sftp, const char *source_filename, const char *dest_filename);\n\n.SH DESCRIPTION\n\\fIsftp\\fP - SFTP instance as returned by \n.BR libssh2_sftp_init(3)\n\n\\fIsourcefile\\fP - Path and name of the existing filesystem entry\n\n\\fIsourcefile_len\\fP - Length of the path and name of the existing \nfilesystem entry\n\n\\fIdestfile\\fP - Path and name of the target filesystem entry\n\n\\fIdestfile_len\\fP - Length of the path and name of the target \nfilesystem entry\n\n\\fIflags\\fP - \nBitmask flags made up of LIBSSH2_SFTP_RENAME_* constants.\n\nRename a filesystem object on the remote filesystem. The semantics of \nthis command typically include the ability to move a filesystem object \nbetween folders and/or filesystem mounts. If the LIBSSH2_SFTP_RENAME_OVERWRITE \nflag is not set and the destfile entry already exists, the operation \nwill fail. Use of the other two flags indicate a preference (but not a \nrequirement) for the remote end to perform an atomic rename operation \nand/or using native system calls when possible.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to \nbe returned by the server.\n\n.SH SEE ALSO\n.BR libssh2_sftp_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_rewind.3",
    "content": ".TH libssh2_sftp_rewind 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_rewind - convenience macro for \\fIlibssh2_sftp_seek64(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_rewind(LIBSSH2_SFTP_HANDLE *handle);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_seek64(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_seek64(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_seek64(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_seek64(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_rmdir.3",
    "content": ".TH libssh2_sftp_rmdir 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_rmdir - convenience macro for \\fIlibssh2_sftp_rmdir_ex(3)\\fP\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\n#define libssh2_sftp_rmdir(sftp, path) \\\\\n    libssh2_sftp_rmdir_ex((sftp), (path), strlen(path))\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_rmdir_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_rmdir_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_rmdir_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_rmdir_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_rmdir_ex.3",
    "content": ".TH libssh2_sftp_rmdir_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_rmdir_ex - remove an SFTP directory\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint libssh2_sftp_rmdir_ex(LIBSSH2_SFTP *sftp, const char *path,\n                          unsigned int path_len);\n.SH DESCRIPTION\nRemove a directory from the remote file system.\n\n\\fIsftp\\fP - SFTP instance as returned by \n.BR libssh2_sftp_init(3)\n\n\\fIsourcefile\\fP - Full path of the existing directory to remove.\n\n\\fIsourcefile_len\\fP - Length of the full path of the existing directory to\nremove.\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to \nbe returned by the server.\n.SH SEE ALSO\n.BR libssh2_sftp_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_seek.3",
    "content": ".TH libssh2_sftp_seek 3 \"22 Dec 2008\" \"libssh2 1.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_seek - set the read/write position indicator within a file\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nvoid libssh2_sftp_seek(LIBSSH2_SFTP_HANDLE *handle, size_t offset);\n.SH DESCRIPTION\nDeprecated function. Use \\fIlibssh2_sftp_seek64(3)\\fP instead!\n\n\\fIhandle\\fP - SFTP File Handle as returned by \n.BR libssh2_sftp_open_ex(3)\n\n\\fIoffset\\fP - Number of bytes from the beginning of file to seek to.\n\nMove the file handle's internal pointer to an arbitrary location. \nNote that libssh2 implements file pointers as a localized concept to make \nfile access appear more POSIX like. No packets are exchanged with the server \nduring a seek operation. The localized file pointer is simply used as a \nconvenience offset during read/write operations.\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3),\n.BR libssh2_sftp_seek64(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_seek64.3",
    "content": ".TH libssh2_sftp_seek64 3 \"22 Dec 2008\" \"libssh2 1.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_seek64 - set the read/write position within a file\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nvoid libssh2_sftp_seek64(LIBSSH2_SFTP_HANDLE *handle,\n                         libssh2_uint64_t offset);\n.SH DESCRIPTION\n\\fIhandle\\fP - SFTP File Handle as returned by \n.BR libssh2_sftp_open_ex(3)\n\n\\fIoffset\\fP - Number of bytes from the beginning of file to seek to.\n\nMove the file handle's internal pointer to an arbitrary location. libssh2\nimplements file pointers as a localized concept to make file access appear\nmore POSIX like. No packets are exchanged with the server during a seek\noperation. The localized file pointer is simply used as a convenience offset\nduring read/write operations.\n\nYou MUST NOT seek during writing or reading a file with SFTP, as the internals\nuse outstanding packets and changing the \"file position\" during transit will\nresults in badness.\n.SH AVAILABILITY\nAdded in 1.0\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_setstat.3",
    "content": ".TH libssh2_sftp_setstat 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_setstat - convenience macro for \\fIlibssh2_sftp_stat_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_setstat(LIBSSH2_SFTP *sftp, const char *path, LIBSSH2_SFTP_ATTRIBUTES *attr);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_stat_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_stat_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_stat_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_stat_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_shutdown.3",
    "content": ".TH libssh2_sftp_shutdown 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_shutdown - shut down an SFTP session\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint \nlibssh2_sftp_shutdown(LIBSSH2_SFTP *sftp);\n\n.SH DESCRIPTION\n\\fIsftp\\fP - SFTP instance as returned by \n.BR libssh2_sftp_init(3)\n\nDestroys a previously initialized SFTP session and frees all resources \nassociated with it.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH SEE ALSO\n.BR libssh2_sftp_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_stat.3",
    "content": ".TH libssh2_sftp_stat 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_stat - convenience macro for \\fIlibssh2_sftp_fstat_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_stat(LIBSSH2_SFTP *sftp, const char *path, LIBSSH2_SFTP_ATTRIBUTES *attrs);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_fstat_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_fstat_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_fstat_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_fstat_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_stat_ex.3",
    "content": ".TH libssh2_sftp_stat_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_stat_ex - get status about an SFTP file\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint libssh2_sftp_stat_ex(LIBSSH2_SFTP *sftp, const char *path,\n                         unsigned int path_len, int stat_type,\n                         LIBSSH2_SFTP_ATTRIBUTES *attrs);\n.SH DESCRIPTION\n\\fIsftp\\fP - SFTP instance as returned by \n.BR libssh2_sftp_init(3)\n\n\\fIpath\\fP - Remote filesystem object to stat/lstat/setstat.\n\n\\fIpath_len\\fP - Length of the name of the remote filesystem object \nto stat/lstat/setstat.\n\n\\fIstat_type\\fP - One of the three constants specifying the type of \nstat operation to perform:\n\n.br\n\\fBLIBSSH2_SFTP_STAT\\fP: performs stat(2) operation\n.br\n\\fBLIBSSH2_SFTP_LSTAT\\fP: performs lstat(2) operation\n.br\n\\fBLIBSSH2_SFTP_SETSTAT\\fP: performs operation to set stat info on file\n\n\\fIattrs\\fP - Pointer to a \\fBLIBSSH2_SFTP_ATTRIBUTES\\fP structure to set file\nmetadata from or into depending on the value of stat_type.\n\nGet or Set statbuf type data on a remote filesystem object. When getting\nstatbuf data,\n.BR libssh2_sftp_stat(3)\nwill follow all symlinks, while \n.BR libssh2_sftp_lstat(3)\nwill return data about the object encountered, even if that object \nhappens to be a symlink.\n\nThe LIBSSH2_SFTP_ATTRIBUTES struct looks like this:\n\n.nf\nstruct LIBSSH2_SFTP_ATTRIBUTES {\n    /* If flags & ATTR_* bit is set, then the value in this struct will be\n     * meaningful Otherwise it should be ignored\n     */\n    unsigned long flags;\n\n    libssh2_uint64_t filesize;\n    unsigned long uid;\n    unsigned long gid;\n    unsigned long permissions;\n    unsigned long atime;\n    unsigned long mtime;\n};\n.fi\n.SH RETURN VALUE\nReturns 0 on success or negative on failure.  It returns LIBSSH2_ERROR_EAGAIN\nwhen it would otherwise block. While LIBSSH2_ERROR_EAGAIN is a negative\nnumber, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to \nbe returned by the server.\n.SH SEE ALSO\n.BR libssh2_sftp_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_statvfs.3",
    "content": ".TH libssh2_sftp_statvfs 3 \"22 May 2010\" \"libssh2 1.2.6\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_statvfs, libssh2_sftp_fstatvfs - get file system statistics\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint\nlibssh2_sftp_statvfs(LIBSSH2_SFTP *sftp, const char *path,\n                     size_t path_len, LIBSSH2_SFTP_STATVFS *st);\n\nint\nlibssh2_sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle,\n                      LIBSSH2_SFTP_STATVFS *st)\n.fi\n.SH DESCRIPTION\nThese functions provide statvfs(2)-like operations and require\nstatvfs@openssh.com and fstatvfs@openssh.com extension support on the server.\n\n\\fIsftp\\fP - SFTP instance as returned by\n.BR libssh2_sftp_init(3)\n\n\\fIhandle\\fP - SFTP File Handle as returned by\n.BR libssh2_sftp_open_ex(3)\n\n\\fIpath\\fP - full path of any file within the mounted file system.\n\n\\fIpath_len\\fP - length of the full path.\n\n\\fIst\\fP - Pointer to a LIBSSH2_SFTP_STATVFS structure to place file system\nstatistics into.\n\n.SH DATA TYPES\nLIBSSH2_SFTP_STATVFS is a typedefed struct that is defined as below\n\n.nf\nstruct _LIBSSH2_SFTP_STATVFS {\n    libssh2_uint64_t  f_bsize;    /* file system block size */\n    libssh2_uint64_t  f_frsize;   /* fragment size */\n    libssh2_uint64_t  f_blocks;   /* size of fs in f_frsize units */\n    libssh2_uint64_t  f_bfree;    /* # free blocks */\n    libssh2_uint64_t  f_bavail;   /* # free blocks for non-root */\n    libssh2_uint64_t  f_files;    /* # inodes */\n    libssh2_uint64_t  f_ffree;    /* # free inodes */\n    libssh2_uint64_t  f_favail;   /* # free inodes for non-root */\n    libssh2_uint64_t  f_fsid;     /* file system ID */\n    libssh2_uint64_t  f_flag;     /* mount flags */\n    libssh2_uint64_t  f_namemax;  /* maximum filename length */\n};\n.fi\n\nIt is unspecified whether all members of the returned struct have meaningful\nvalues on all file systems.\n\nThe field \\fIf_flag\\fP is a bit mask. Bits are defined as follows:\n.IP LIBSSH2_SFTP_ST_RDONLY\nRead-only file system.\n.IP LIBSSH2_SFTP_ST_NOSUID\nSet-user-ID/set-group-ID bits are ignored by \\fBexec\\fP(3).\n\n.SH RETURN VALUE\nReturns 0 on success or negative on failure. If used in non-blocking mode, it\nreturns LIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was\nreceived on the socket, or an SFTP operation caused an errorcode to be returned\nby the server.\n.SH AVAILABILITY\nAdded in libssh2 1.2.6\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_symlink.3",
    "content": ".TH libssh2_sftp_symlink 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_symlink - convenience macro for \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\n#define libssh2_sftp_symlink(sftp, orig, linkpath) \\\\\n    libssh2_sftp_symlink_ex((sftp), (orig), strlen(orig), (linkpath), \\\\\n                            strlen(linkpath), LIBSSH2_SFTP_SYMLINK)\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_symlink_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_symlink_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_symlink_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_symlink_ex.3",
    "content": ".TH libssh2_sftp_symlink_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_symlink_ex - read or set a symbolic link\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint \nlibssh2_sftp_symlink_ex(LIBSSH2_SFTP *sftp, const char *path,\n                        unsigned int path_len, char *target,\n                        unsigned int target_len, int link_type);\n.SH DESCRIPTION\nCreate a symlink or read out symlink information from the remote side.\n\n\\fIsftp\\fP - SFTP instance as returned by \n.BR libssh2_sftp_init(3)\n\n\\fIpath\\fP - Remote filesystem object to create a symlink from or resolve.\n\n\\fIpath_len\\fP - Length of the name of the remote filesystem object to \ncreate a symlink from or resolve.\n\n\\fItarget\\fP - a pointer to a buffer. The buffer has different uses depending\nwhat the \\fIlink_type\\fP argument is set to.\n.br\n\\fBLIBSSH2_SFTP_SYMLINK\\fP: Remote filesystem object to link to.\n.br\n\\fBLIBSSH2_SFTP_READLINK\\fP: Pre-allocated buffer to resolve symlink target\ninto.\n.br\n\\fBLIBSSH2_SFTP_REALPATH\\fP: Pre-allocated buffer to resolve realpath target\ninto.\n\n\\fItarget_len\\fP - Length of the name of the remote filesystem target object.\n\n\\fIlink_type\\fP - One of the three previously mentioned constants which \ndetermines the resulting behavior of this function.\n\nThese are convenience macros:\n\n.BR libssh2_sftp_symlink(3)\n: Create a symbolic link between two filesystem objects.\n.br\n.BR libssh2_sftp_readlink(3)\n: Resolve a symbolic link filesystem object to its next target.\n.br\n.BR libssh2_sftp_realpath(3)\n: Resolve a complex, relative, or symlinked filepath to its effective target.\n.SH RETURN VALUE\nWhen using LIBSSH2_SFTP_SYMLINK, this function returns 0 on success or negative\non failure.\n\nWhen using LIBSSH2_SFTP_READLINK or LIBSSH2_SFTP_REALPATH, it returns the\nnumber of bytes it copied to the target buffer (not including the terminating\nzero) or negative on failure.\n\nIt returns LIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\nFrom 1.2.8, LIBSSH2_ERROR_BUFFER_TOO_SMALL is returned if the given 'target'\nbuffer is too small to fit the requested object name.\n.SH BUG\nPassing in a too small buffer when receiving data only results in libssh2\n1.2.7 or earlier to not copy the entire data amount, and it is not possible\nfor the application to tell when it happens!\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to \nbe returned by the server.\n\n.SH SEE ALSO\n.BR libssh2_sftp_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_tell.3",
    "content": ".TH libssh2_sftp_tell 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_tell - get the current read/write position indicator for a file\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nsize_t \nlibssh2_sftp_tell(LIBSSH2_SFTP_HANDLE *handle);\n\n.SH DESCRIPTION\n\\fIhandle\\fP - SFTP File Handle as returned by \\fBlibssh2_sftp_open_ex(3)\\fP.\n\nReturns the current offset of the file handle's internal pointer. Note that\nthis is now deprecated. Use the newer \\fBlibssh2_sftp_tell64(3)\\fP instead!\n.SH RETURN VALUE\nCurrent offset from beginning of file in bytes.\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3),\n.BR libssh2_sftp_tell64(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_tell64.3",
    "content": ".TH libssh2_sftp_tell64 3 \"22 Dec 2008\" \"libssh2 1.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_tell64 - get the current read/write position indicator for a file\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nlibssh2_uint64_t\nlibssh2_sftp_tell64(LIBSSH2_SFTP_HANDLE *handle);\n\n.SH DESCRIPTION\n\\fIhandle\\fP - SFTP File Handle as returned by \\fBlibssh2_sftp_open_ex(3)\\fP\n\nIdentify the current offset of the file handle's internal pointer.\n.SH RETURN VALUE\nCurrent offset from beginning of file in bytes.\n.SH AVAILABILITY\nAdded in libssh2 1.0\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3),\n.BR libssh2_sftp_tell(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_unlink.3",
    "content": ".TH libssh2_sftp_unlink 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_unlink - convenience macro for \\fIlibssh2_sftp_unlink_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_sftp_unlink(LIBSSH2_SFTP *sftp, const char *filename);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_sftp_unlink_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_sftp_unlink_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_sftp_unlink_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_sftp_unlink_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_unlink_ex.3",
    "content": ".TH libssh2_sftp_unlink_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_unlink_ex - unlink an SFTP file\n.SH SYNOPSIS\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nint \nlibssh2_sftp_unlink_ex(LIBSSH2_SFTP *sftp, const char *filename, unsigned int filename_len);\n\nint \nlibssh2_sftp_unlink(LIBSSH2_SFTP *sftp, const char *filename);\n\n.SH DESCRIPTION\n\\fIsftp\\fP - SFTP instance as returned by \n.BR libssh2_sftp_init(3)\n\n\\fIfilename\\fP - Path and name of the existing filesystem entry\n\n\\fIfilename_len\\fP - Length of the path and name of the existing \nfilesystem entry\n\nUnlink (delete) a file from the remote filesystem.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to \nbe returned by the server.\n\n.SH SEE ALSO\n.BR libssh2_sftp_init(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_sftp_write.3",
    "content": ".TH libssh2_sftp_write 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_sftp_write - write SFTP data\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\nssize_t libssh2_sftp_write(LIBSSH2_SFTP_HANDLE *handle,\n                           const char *buffer,\n                           size_t count);\n.SH DESCRIPTION\n\\fBlibssh2_sftp_write(3)\\fP writes a block of data to the SFTP server. This\nmethod is modeled after the POSIX write() function and uses the same calling\nsemantics.\n\n\\fIhandle\\fP - SFTP file handle as returned by \\fIlibssh2_sftp_open_ex(3)\\fP.\n\n\\fIbuffer\\fP - points to the data to send off.\n\n\\fIcount\\fP - Number of bytes from 'buffer' to write. Note that it may not be\npossible to write all bytes as requested.\n\n\\fIlibssh2_sftp_handle(3)\\fP will use as much as possible of the buffer and\nput it into a single SFTP protocol packet. This means that to get maximum\nperformance when sending larger files, you should try to always pass in at\nleast 32K of data to this function.\n\n.SH WRITE AHEAD\nStarting in libssh2 version 1.2.8, the default behavior of libssh2 is to\ncreate several smaller outgoing packets for all data you pass to this function\nand it will return a positive number as soon as the first packet is\nacknowledged from the server.\n\nThis has the effect that sometimes more data has been sent off but isn't acked\nyet when this function returns, and when this function is subsequently called\nagain to write more data, libssh2 will immediately figure out that the data is\nalready received remotely.\n\nIn most normal situation this should not cause any problems, but it should be\nnoted that if you've once called libssh2_sftp_write() with data and it returns\nshort, you MUST still assume that the rest of the data might've been cached so\nyou need to make sure you don't alter that data and think that the version you\nhave in your next function invoke will be detected or used.\n\nThe reason for this funny behavior is that SFTP can only send 32K data in each\npacket and it gets all packets acked individually. This means we cannot use a\nsimple serial approach if we want to reach high performance even on high\nlatency connections. And we want that.\n.SH RETURN VALUE\nActual number of bytes written or negative on failure.\n\nIf used in non-blocking mode, it returns LIBSSH2_ERROR_EAGAIN when it would\notherwise block. While LIBSSH2_ERROR_EAGAIN is a negative number, it isn't\nreally a failure per se.\n\nIf this function returns 0 (zero) it should not be considered an error, but\nsimply that there was no error but yet no payload data got sent to the other\nend.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_SFTP_PROTOCOL\\fP - An invalid SFTP protocol response was \nreceived on the socket, or an SFTP operation caused an errorcode to \nbe returned by the server.\n.SH SEE ALSO\n.BR libssh2_sftp_open_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_trace.3",
    "content": ".TH libssh2_trace 3 \"26 Dec 2008\" \"libssh2 1.0\" \"libssh2 manual\"\n.SH NAME\nlibssh2_trace - enable debug info from inside libssh2\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid libssh2_trace(LIBSSH2_SESSION *session, int bitmask);\n\n.SH DESCRIPTION\nThis is a function present in the library that can be used to get debug info\nfrom within libssh2 when it is running. Helpful when trying to trace or debug\nbehaviors. Note that this function has no effect unless libssh2 was built to\nsupport tracing! It is usually disabled in release builds.\n\n\\fBbitmask\\fP can be set to the logical OR of none, one or more of these:\n.RS\n.IP LIBSSH2_TRACE_SOCKET\nSocket low-level debugging\n.IP LIBSSH2_TRACE_TRANS\nTransport layer debugging\n.IP LIBSSH2_TRACE_KEX\nKey exchange debugging\n.IP LIBSSH2_TRACE_AUTH\nAuthentication debugging\n.IP LIBSSH2_TRACE_CONN\nConnection layer debugging\n.IP LIBSSH2_TRACE_SCP\nSCP debugging\n.IP LIBSSH2_TRACE_SFTP\nSFTP debugging\n.IP LIBSSH2_TRACE_ERROR\nError debugging\n.IP LIBSSH2_TRACE_PUBLICKEY\nPublic Key debugging\n.RE\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_trace_sethandler.3",
    "content": ".TH libssh2_trace_sethandler 3 \"15 Jan 2010\" \"libssh2 1.2.3\" \"libssh2 manual\"\n.SH NAME\nlibssh2_trace_sethandler - set a trace output handler\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\ntypedef void (*libssh2_trace_handler_func)(LIBSSH2_SESSION *session,\n                                           void* context,\n                                           const char *data,\n                                           size_t length);\n\nint libssh2_trace_sethandler(LIBSSH2_SESSION *session,\n                             void* context,\n                             libssh2_trace_handler_func callback);\n.SH DESCRIPTION\nlibssh2_trace_sethandler installs a trace output handler for your application.\nBy default, when tracing has been switched on via a call to libssh2_trace(),\nall output is written to stderr.  By calling this method and passing a\nfunction pointer that matches the libssh2_trace_handler_func prototype,\nlibssh2 will call back as it generates trace output.  This can be used to\ncapture the trace output and put it into a log file or diagnostic window.\nThis function has no effect unless libssh2 was built to support this option,\nand a typical \"release build\" might not.\n\n\\fBcontext\\fP can be used to pass arbitrary user defined data back into the callback when invoked.\n.SH AVAILABILITY\nAdded in libssh2 version 1.2.3\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_userauth_authenticated.3",
    "content": ".TH libssh2_userauth_authenticated 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_authenticated - return authentication status\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint \nlibssh2_userauth_authenticated(LIBSSH2_SESSION *session);\n\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\nIndicates whether or not the named session has been successfully authenticated.\n\n.SH RETURN VALUE\nReturns 1 if authenticated and 0 if not.\n\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_userauth_hostbased_fromfile.3",
    "content": ".TH libssh2_userauth_hostbased_fromfile 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_hostbased_fromfile - convenience macro for \\fIlibssh2_userauth_hostbased_fromfile_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_userauth_hostbased_fromfile(LIBSSH2_SESSION *session, const char *username, const char *publickey, const char *privatekey, const char *passphrase, const char *hostname);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_userauth_hostbased_fromfile_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_userauth_hostbased_fromfile_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_userauth_hostbased_fromfile_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_userauth_hostbased_fromfile_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_userauth_hostbased_fromfile_ex.3",
    "content": ".TH libssh2_userauth_hostbased_fromfile_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_hostbased_fromfile_ex - TODO\n.SH SYNOPSIS\n\n.SH DESCRIPTION\n\n.SH RETURN VALUE\n\n.SH ERRORS\n\n.SH SEE ALSO\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_userauth_keyboard_interactive.3",
    "content": ".TH libssh2_userauth_keyboard_interactive 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_keyboard_interactive - convenience macro for \\fIlibssh2_userauth_keyboard_interactive_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n.nf\n\nint\nlibssh2_userauth_keyboard_interactive(LIBSSH2_SESSION* session,\n                                      const char *username,\n           LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC((*response_callback)));\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_userauth_keyboard_interactive_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_userauth_keyboard_interactive_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_userauth_keyboard_interactive_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_userauth_keyboard_interactive_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_userauth_keyboard_interactive_ex.3",
    "content": ".TH libssh2_userauth_keyboard_interactive_ex 3 \"8 Mar 2008\" \"libssh2 0.19\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_keyboard_interactive_ex - authenticate a session using\nkeyboard-interactive authentication\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nint\nlibssh2_userauth_keyboard_interactive_ex(LIBSSH2_SESSION *session,\n                                         const char *username,\n                                         unsigned int username_len,\n            LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC(*response_callback));\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by\n\\fIlibssh2_session_init_ex(3)\\fP.\n\n\\fIusername\\fP - Name of user to attempt keyboard-interactive authentication\nfor.\n\n\\fIusername_len\\fP - Length of username parameter.\n\n\\fIresponse_callback\\fP - As authentication proceeds, the host issues several\n(1 or more) challenges and requires responses. This callback will be called at\nthis moment. The callback is responsible to obtain responses for the\nchallenges, fill the provided data structure and then return\ncontrol. Responses will be sent to the host. String values will be free(3)ed\nby the library. The callback prototype must match this:\n\n.nf\n void response(const char *name,\n               int name_len, const char *instruction,\n               int instruction_len,\n               int num_prompts,\n               const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,\n               LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses,\n               void **abstract);\n.fi\n\nAttempts keyboard-interactive (challenge/response) authentication.\n\nNote that many SSH servers will always issue a single \"password\" challenge,\nrequesting actual password as response, but it is not required by the\nprotocol, and various authentication schemes, such as smartcard authentication\nmay use keyboard-interactive authentication type too.\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns LIBSSH2_ERROR_EAGAIN\nwhen it would otherwise block. While LIBSSH2_ERROR_EAGAIN is a negative\nnumber, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fLIBSSH2_ERROR_AUTHENTICATION_FAILED\\fP - failed, invalid username/password\nor public/private key.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_userauth_list.3",
    "content": ".TH libssh2_userauth_list 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_list - list supported authentication methods\n.SH SYNOPSIS\n.nf\n#include <libssh2.h>\n\nchar *\nlibssh2_userauth_list(LIBSSH2_SESSION *session, const char *username,\n                      unsigned int username_len);\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIusername\\fP - Username which will be used while authenticating. Note that\nmost server implementations do not permit attempting authentication with\ndifferent usernames between requests. Therefore this must be the same username\nyou will use on later userauth calls.\n\n\\fIusername_len\\fP - Length of username parameter.\n\nSend a \\fBSSH_USERAUTH_NONE\\fP request to the remote host. Unless the remote\nhost is configured to accept none as a viable authentication scheme\n(unlikely), it will return \\fBSSH_USERAUTH_FAILURE\\fP along with a listing of\nwhat authentication schemes it does support. In the unlikely event that none\nauthentication succeeds, this method with return NULL. This case may be\ndistinguished from a failing case by examining\n\\fIlibssh2_userauth_authenticated(3)\\fP.\n.SH RETURN VALUE\nOn success a comma delimited list of supported authentication schemes.  This\nlist is internally managed by libssh2.  On failure returns NULL.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_EAGAIN\\fP - Marked for non-blocking I/O but the call\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_userauth_password.3",
    "content": ".TH libssh2_userauth_password 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_password - convenience macro for \\fIlibssh2_userauth_password_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint libssh2_userauth_password(LIBSSH2_SESSION *session,\n                              const char *username,\n                              const char *password);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_userauth_password_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_userauth_password_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_userauth_password_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_userauth_password_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_userauth_password_ex.3",
    "content": ".TH libssh2_userauth_password_ex 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_password_ex - authenticate a session with username and password\n.SH SYNOPSIS\n#include <libssh2.h>\n.nf\nint libssh2_userauth_password_ex(LIBSSH2_SESSION *session,\n                    const char *username,\n                    unsigned int username_len,\n                    const char *password,\n                    unsigned int password_len,\n                    LIBSSH2_PASSWD_CHANGEREQ_FUNC((*passwd_change_cb)));\n\n#define libssh2_userauth_password(session, username, password) \\\\\n libssh2_userauth_password_ex((session), (username), \\\\\n                              strlen(username), \\\\\n                              (password), strlen(password), NULL)\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by \n.BR libssh2_session_init_ex(3)\n\n\\fIusername\\fP - Name of user to attempt plain password authentication for.\n\n\\fIusername_len\\fP - Length of username parameter.\n\n\\fIpassword\\fP - Password to use for authenticating username.\n\n\\fIpassword_len\\fP - Length of password parameter.\n\n\\fIpasswd_change_cb\\fP - If the host accepts authentication but \nrequests that the password be changed, this callback will be issued. \nIf no callback is defined, but server required password change, \nauthentication will fail.\n\nAttempt basic password authentication. Note that many SSH servers \nwhich appear to support ordinary password authentication actually have \nit disabled and use Keyboard Interactive authentication (routed via \nPAM or another authentication backed) instead.\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\nSome of the errors this function may return include:\n\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_PASSWORD_EXPIRED\\fP - \n\n\\fLIBSSH2_ERROR_AUTHENTICATION_FAILED\\fP - failed, invalid username/password\nor public/private key.\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_userauth_publickey.3",
    "content": ".TH libssh2_userauth_publickey 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_publickey - authenticate using a callback function\n.SH SYNOPSIS\n#include <libssh2.h>\n\n.nf\nint libssh2_userauth_publickey(LIBSSH2_SESSION *session,\n                               const char *user,\n                               const unsigned char *pubkeydata,\n                               size_t pubkeydata_len,\n                               sign_callback,\n                               void **abstract);\n.SH DESCRIPTION\nAuthenticate with the \\fIsign_callback\\fP callback that matches the prototype\nbelow\n.SH CALLBACK\n.nf\nint name(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len,\n         const unsigned char *data, size_t data_len, void **abstract);\n.fi\n\nThis function gets called...\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.\n.SH SEE ALSO\n.BR libssh2_userauth_publickey_fromfile_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_userauth_publickey_fromfile.3",
    "content": ".TH libssh2_userauth_publickey_fromfile 3 \"20 Feb 2010\" \"libssh2 1.2.4\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_publickey_fromfile - convenience macro for \\fIlibssh2_userauth_publickey_fromfile_ex(3)\\fP calls\n.SH SYNOPSIS\n#include <libssh2.h>\n\nint\nlibssh2_userauth_publickey_fromfile(LIBSSH2_SESSION *session,\n                                    const char *username,\n                                    const char *publickey,\n                                    const char *privatekey,\n                                    const char *passphrase);\n\n.SH DESCRIPTION\nThis is a macro defined in a public libssh2 header file that is using the\nunderlying function \\fIlibssh2_userauth_publickey_fromfile_ex(3)\\fP.\n.SH RETURN VALUE\nSee \\fIlibssh2_userauth_publickey_fromfile_ex(3)\\fP\n.SH ERRORS\nSee \\fIlibssh2_userauth_publickey_fromfile_ex(3)\\fP\n.SH SEE ALSO\n.BR libssh2_userauth_publickey_fromfile_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_userauth_publickey_fromfile_ex.3",
    "content": ".TH libssh2_userauth_publickey_fromfile 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_publickey_fromfile - authenticate a session with a public key, read from a file\n.SH SYNOPSIS\n#include <libssh2.h>\n\n.nf\nint libssh2_userauth_publickey_fromfile_ex(LIBSSH2_SESSION *session,\n                                           const char *username,\n                                           unsigned int ousername_len,\n                                           const char *publickey,\n                                           const char *privatekey,\n                                           const char *passphrase);\n.SH DESCRIPTION\n\\fIsession\\fP - Session instance as returned by\n\\fBlibssh2_session_init_ex(3)\\fP\n\n\\fIusername\\fP - Pointer to user name to authenticate as.\n\n\\fIusername_len\\fP - Length of \\fIusername\\fP.\n\n\\fIpublickey\\fP - Path name of the public key file.\n(e.g. /etc/ssh/hostkey.pub). If libssh2 is built against OpenSSL, this option\ncan be set to NULL.\n\n\\fIprivatekey\\fP - Path name of the private key file. (e.g. /etc/ssh/hostkey)\n\n\\fIpassphrase\\fP - Passphrase to use when decoding \\fIprivatekey\\fP.\n\nAttempt public key authentication using a PEM encoded private key file stored\non disk\n\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_PUBLICKEY_UNVERIFIED\\fP - The username/public key\ncombination was invalid.\n\n\\fILIBSSH2_ERROR_AUTHENTICATION_FAILED\\fP - Authentication using the supplied\npublic key was not accepted.\n\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_userauth_publickey_frommemory.3",
    "content": ".TH libssh2_userauth_publickey_frommemory 3 \"1 Sep 2014\" \"libssh2 1.5\" \"libssh2 manual\"\n.SH NAME\nlibssh2_userauth_publickey_frommemory - authenticate a session with a public key, read from memory\n.SH SYNOPSIS\n#include <libssh2.h>\n\n.nf\nint libssh2_userauth_publickey_frommemory(LIBSSH2_SESSION *session,\n                                           const char *username,\n                                           size_t username_len,\n                                           const char *publickeydata,\n                                           size_t publickeydata_len,\n                                           const char *privatekeydata,\n                                           size_t privatekeydata_len,\n                                           const char *passphrase);\n.SH DESCRIPTION\nThis function allows to authenticate a session with a public key read from memory.\nIt's only supported when libssh2 is backed by OpenSSL.\n\\fIsession\\fP - Session instance as returned by\n.BR libssh2_session_init_ex(3)\n\n\\fIusername\\fP - Remote user name to authenticate as.\n\n\\fIusername_len\\fP - Length of username.\n\n\\fIpublickeydata\\fP - Buffer containing the contents of a public key file.\n\n\\fIpublickeydata_len\\fP - Length of public key data.\n\n\\fIprivatekeydata\\fP - Buffer containing the contents of a private key file.\n\n\\fIprivatekeydata_len\\fP - Length of private key data.\n\n\\fIpassphrase\\fP - Passphrase to use when decoding private key file.\n\nAttempt public key authentication using a PEM encoded private key file stored in memory.\n.SH RETURN VALUE\nReturn 0 on success or negative on failure.  It returns\nLIBSSH2_ERROR_EAGAIN when it would otherwise block. While\nLIBSSH2_ERROR_EAGAIN is a negative number, it isn't really a failure per se.\n.SH ERRORS\n\\fILIBSSH2_ERROR_ALLOC\\fP -  An internal memory allocation call failed.\n\n\\fILIBSSH2_ERROR_SOCKET_SEND\\fP - Unable to send data on socket.\n\n\\fILIBSSH2_ERROR_SOCKET_TIMEOUT\\fP - \n\n\\fILIBSSH2_ERROR_PUBLICKEY_UNVERIFIED\\fP - The username/public key\ncombination was invalid.\n\n\\fILIBSSH2_ERROR_AUTHENTICATION_FAILED\\fP - Authentication using the supplied\npublic key was not accepted.\n.SH AVAILABILITY\nlibssh2_userauth_publickey_frommemory was added in libssh2 1.6.0\n.SH SEE ALSO\n.BR libssh2_session_init_ex(3)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/libssh2_version.3",
    "content": ".TH libssh2_version 3 \"23 Feb 2009\" \"libssh2 1.1\" \"libssh2 manual\"\n.SH NAME\nlibssh2_version - return the libssh2 version number\n.SH SYNOPSIS\n#include <libssh2.h>\n\nconst char *\nlibssh2_version(int required_version);\n.SH DESCRIPTION\nIf \\fIrequired_version\\fP is lower than or equal to the version number of the\nlibssh2 in use, the version number of libssh2 is returned as a pointer to a\nzero terminated string.\n\nThe \\fIrequired_version\\fP should be the version number as constructed by the\nLIBSSH2_VERSION_NUM define in the libssh2.h public header file, which is a 24\nbit number in the 0xMMmmpp format. MM for major, mm for minor and pp for patch\nnumber.\n.SH RETURN VALUE\nThe version number of libssh2 is returned as a pointer to a zero terminated\nstring or NULL if the \\fIrequired_version\\fP isn't fulfilled.\n.SH EXAMPLE\nTo make sure you run with the correct libssh2 version:\n\n.nf\nif (!libssh2_version(LIBSSH2_VERSION_NUM)) {\n  fprintf (stderr, \\&\"Runtime libssh2 version too old!\\&\");\n  exit(1);\n}\n.fi\n\nUnconditionally get the version number:\n\nprintf(\\&\"libssh2 version: %s\\&\", libssh2_version(0) );\n.SH AVAILABILITY\nThis function was added in libssh2 1.1, in previous versions there way no way\nto extract this info in run-time.\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/docs/template.3",
    "content": ".TH libssh2_template 3 \"1 Jun 2007\" \"libssh2 0.15\" \"libssh2 manual\"\n.SH NAME\nlibssh2_template - short function description\n.SH SYNOPSIS\n#include <libssh2.h>\n\nvoid \nlibssh2_template(void);\n\n.SH DESCRIPTION\nLong text describing the function and its input arguments.\n\n.SH RETURN VALUE\nDescribe what the function returns.\n\n.SH ERRORS\nAdd error codes\n\n.SH SEE ALSO\nAdd related functions\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/.gitignore",
    "content": "Makefile\nMakefile.in\n*.gcno\n*.gcda\ndirect_tcpip\nscp\nscp_nonblock\nscp_write\nscp_write_nonblock\nsftp\nsftp_nonblock\nsftpdir\nsftpdir_nonblock\nssh2\nsftp_RW_nonblock\nsftp_mkdir\nsftp_mkdir_nonblock\nsftp_write\nsftp_write_nonblock\nconfig.h.in\nssh2_exec\nssh2_agent\nlibssh2_config.h\nlibssh2_config.h.in\nstamp-h2\nsftp_append\nsftp_write_sliding\nssh2_echo\nsubsystem_netconf\ntest-scp\ntest-sftp_append\ntest-sftp_nonblock\ntest-sftp_write\ntest-sftp_write_nonblock\ntest-ssh2_echo\ntcpip-forward\nx11\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/CMakeLists.txt",
    "content": "# Copyright (c) 2014, 2015 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\ninclude(CheckIncludeFiles)\ninclude(CheckSymbolExists)\ninclude(CopyRuntimeDependencies)\ninclude(SocketLibraries)\n\nset(EXAMPLES\n  direct_tcpip\n  ssh2\n  scp\n  scp_nonblock\n  scp_write\n  scp_write_nonblock\n  sftp\n  sftp_nonblock\n  sftp_write\n  sftp_write_nonblock\n  sftp_mkdir\n  sftp_mkdir_nonblock\n  sftp_RW_nonblock\n  sftp_write_sliding\n  sftpdir\n  sftpdir_nonblock\n  ssh2_exec\n  ssh2_agent\n  ssh2_echo\n  sftp_append\n  subsystem_netconf\n  tcpip-forward)\n\nappend_needed_socket_libraries(LIBRARIES)\n\nforeach(example ${EXAMPLES})\n  add_executable(example-${example} ${example}.c)\n  list(APPEND EXAMPLE_TARGETS example-${example})\n  # to find generated header\n  target_include_directories(example-${example} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})\n  target_link_libraries(example-${example} libssh2 ${LIBRARIES})\nendforeach()\nadd_target_to_copy_dependencies(\n  TARGET copy_example_dependencies\n  DEPENDENCIES ${RUNTIME_DEPENDENCIES}\n  BEFORE_TARGETS ${EXAMPLE_TARGETS})\n\n## Platform checks\ncheck_include_files(inttypes.h HAVE_INTTYPES_H)\ncheck_include_files(unistd.h HAVE_UNISTD_H)\ncheck_include_files(stdlib.h HAVE_STDLIB_H)\ncheck_include_files(sys/select.h HAVE_SYS_SELECT_H)\ncheck_include_files(sys/socket.h HAVE_SYS_SOCKET_H)\ncheck_include_files(sys/time.h HAVE_SYS_TIME_H)\ncheck_include_files(arpa/inet.h HAVE_ARPA_INET_H)\ncheck_include_files(netinet/in.h HAVE_NETINET_IN_H)\ncheck_include_files(winsock2.h HAVE_WINSOCK2_H)\n\ncheck_symbol_exists(strcasecmp strings.h HAVE_STRCASECMP)\ncheck_symbol_exists(_stricmp string.h HAVE__STRICMP)\ncheck_symbol_exists(snprintf stdio.h HAVE_SNPRINTF)\ncheck_symbol_exists(_snprintf stdio.h HAVE__SNPRINTF)\n\ncheck_symbol_exists(__func__ \"\" HAVE___FUNC__)\ncheck_symbol_exists(__FUNCTION__ \"\" HAVE___FUNCTION__)\n\nconfigure_file(\n  ${CMAKE_CURRENT_SOURCE_DIR}/libssh2_config_cmake.h.in\n  ${CMAKE_CURRENT_BINARY_DIR}/libssh2_config.h)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/Makefile.am",
    "content": "AUTOMAKE_OPTIONS = foreign nostdinc\n\nEXTRA_DIST = libssh2_config.h.in libssh2_config_cmake.h.in CMakeLists.txt\n\n# samples\nnoinst_PROGRAMS = direct_tcpip ssh2 scp scp_nonblock scp_write\t\t\\\n scp_write_nonblock sftp sftp_nonblock sftp_write sftp_write_nonblock\t\\\n sftp_mkdir sftp_mkdir_nonblock sftp_RW_nonblock sftp_write_sliding\t\\\n sftpdir sftpdir_nonblock ssh2_exec ssh2_agent ssh2_echo sftp_append\t\\\n subsystem_netconf tcpip-forward\n\nif HAVE_SYS_UN_H\nnoinst_PROGRAMS += x11\nendif\n\nAM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/example\nLDADD = $(top_builddir)/src/libssh2.la\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/direct_tcpip.c",
    "content": "#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef WIN32\n#include <windows.h>\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#else\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <sys/time.h>\n#endif\n\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#include <sys/types.h>\n#ifdef HAVE_SYS_SELECT_H\n#include <sys/select.h>\n#endif\n\n#ifndef INADDR_NONE\n#define INADDR_NONE (in_addr_t)-1\n#endif\n\nconst char *keyfile1 = \"/home/username/.ssh/id_rsa.pub\";\nconst char *keyfile2 = \"/home/username/.ssh/id_rsa\";\nconst char *username = \"username\";\nconst char *password = \"\";\n\nconst char *server_ip = \"127.0.0.1\";\n\nconst char *local_listenip = \"127.0.0.1\";\nunsigned int local_listenport = 2222;\n\nconst char *remote_desthost = \"localhost\"; /* resolved by the server */\nunsigned int remote_destport = 22;\n\nenum {\n    AUTH_NONE = 0,\n    AUTH_PASSWORD,\n    AUTH_PUBLICKEY\n};\n\nint main(int argc, char *argv[])\n{\n    int rc, i, auth = AUTH_NONE;\n    struct sockaddr_in sin;\n    socklen_t sinlen;\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel = NULL;\n    const char *shost;\n    unsigned int sport;\n    fd_set fds;\n    struct timeval tv;\n    ssize_t len, wr;\n    char buf[16384];\n\n#ifdef WIN32\n    char sockopt;\n    SOCKET sock = INVALID_SOCKET;\n    SOCKET listensock = INVALID_SOCKET, forwardsock = INVALID_SOCKET;\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#else\n    int sockopt, sock = -1;\n    int listensock = -1, forwardsock = -1;\n#endif\n\n    if(argc > 1)\n        server_ip = argv[1];\n    if(argc > 2)\n        username = argv[2];\n    if(argc > 3)\n        password = argv[3];\n    if(argc > 4)\n        local_listenip = argv[4];\n    if(argc > 5)\n        local_listenport = atoi(argv[5]);\n    if(argc > 6)\n        remote_desthost = argv[6];\n    if(argc > 7)\n        remote_destport = atoi(argv[7]);\n\n    rc = libssh2_init(0);\n    if(rc) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Connect to SSH server */\n    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);\n#ifdef WIN32\n    if(sock == INVALID_SOCKET) {\n        fprintf(stderr, \"failed to open socket!\\n\");\n        return -1;\n    }\n#else\n    if(sock == -1) {\n        perror(\"socket\");\n        return -1;\n    }\n#endif\n\n    sin.sin_family = AF_INET;\n    sin.sin_addr.s_addr = inet_addr(server_ip);\n    if(INADDR_NONE == sin.sin_addr.s_addr) {\n        perror(\"inet_addr\");\n        return -1;\n    }\n    sin.sin_port = htons(22);\n    if(connect(sock, (struct sockaddr*)(&sin),\n               sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if(!session) {\n        fprintf(stderr, \"Could not initialize SSH session!\\n\");\n        return -1;\n    }\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Error when starting up SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++)\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    fprintf(stderr, \"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    fprintf(stderr, \"Authentication methods: %s\\n\", userauthlist);\n    if(strstr(userauthlist, \"password\"))\n        auth |= AUTH_PASSWORD;\n    if(strstr(userauthlist, \"publickey\"))\n        auth |= AUTH_PUBLICKEY;\n\n    /* check for options */\n    if(argc > 8) {\n        if((auth & AUTH_PASSWORD) && !strcasecmp(argv[8], \"-p\"))\n            auth = AUTH_PASSWORD;\n        if((auth & AUTH_PUBLICKEY) && !strcasecmp(argv[8], \"-k\"))\n            auth = AUTH_PUBLICKEY;\n    }\n\n    if(auth & AUTH_PASSWORD) {\n        if(libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else if(auth & AUTH_PUBLICKEY) {\n        if(libssh2_userauth_publickey_fromfile(session, username, keyfile1,\n                                               keyfile2, password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed!\\n\");\n            goto shutdown;\n        }\n        fprintf(stderr, \"\\tAuthentication by public key succeeded.\\n\");\n    }\n    else {\n        fprintf(stderr, \"No supported authentication methods found!\\n\");\n        goto shutdown;\n    }\n\n    listensock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);\n#ifdef WIN32\n    if(listensock == INVALID_SOCKET) {\n        fprintf(stderr, \"failed to open listen socket!\\n\");\n        return -1;\n    }\n#else\n    if(listensock == -1) {\n        perror(\"socket\");\n        return -1;\n    }\n#endif\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(local_listenport);\n    sin.sin_addr.s_addr = inet_addr(local_listenip);\n    if(INADDR_NONE == sin.sin_addr.s_addr) {\n        perror(\"inet_addr\");\n        goto shutdown;\n    }\n    sockopt = 1;\n    setsockopt(listensock, SOL_SOCKET, SO_REUSEADDR, &sockopt,\n               sizeof(sockopt));\n    sinlen = sizeof(sin);\n    if(-1 == bind(listensock, (struct sockaddr *)&sin, sinlen)) {\n        perror(\"bind\");\n        goto shutdown;\n    }\n    if(-1 == listen(listensock, 2)) {\n        perror(\"listen\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"Waiting for TCP connection on %s:%d...\\n\",\n        inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));\n\n    forwardsock = accept(listensock, (struct sockaddr *)&sin, &sinlen);\n#ifdef WIN32\n    if(forwardsock == INVALID_SOCKET) {\n        fprintf(stderr, \"failed to accept forward socket!\\n\");\n        goto shutdown;\n    }\n#else\n    if(forwardsock == -1) {\n        perror(\"accept\");\n        goto shutdown;\n    }\n#endif\n\n    shost = inet_ntoa(sin.sin_addr);\n    sport = ntohs(sin.sin_port);\n\n    fprintf(stderr, \"Forwarding connection from %s:%d here to remote %s:%d\\n\",\n        shost, sport, remote_desthost, remote_destport);\n\n    channel = libssh2_channel_direct_tcpip_ex(session, remote_desthost,\n        remote_destport, shost, sport);\n    if(!channel) {\n        fprintf(stderr, \"Could not open the direct-tcpip channel!\\n\"\n                \"(Note that this can be a problem at the server!\"\n                \" Please review the server logs.)\\n\");\n        goto shutdown;\n    }\n\n    /* Must use non-blocking IO hereafter due to the current libssh2 API */\n    libssh2_session_set_blocking(session, 0);\n\n    while(1) {\n        FD_ZERO(&fds);\n        FD_SET(forwardsock, &fds);\n        tv.tv_sec = 0;\n        tv.tv_usec = 100000;\n        rc = select(forwardsock + 1, &fds, NULL, NULL, &tv);\n        if(-1 == rc) {\n            perror(\"select\");\n            goto shutdown;\n        }\n        if(rc && FD_ISSET(forwardsock, &fds)) {\n            len = recv(forwardsock, buf, sizeof(buf), 0);\n            if(len < 0) {\n                perror(\"read\");\n                goto shutdown;\n            }\n            else if(0 == len) {\n                fprintf(stderr, \"The client at %s:%d disconnected!\\n\", shost,\n                    sport);\n                goto shutdown;\n            }\n            wr = 0;\n            while(wr < len) {\n                i = libssh2_channel_write(channel, buf + wr, len - wr);\n                if(LIBSSH2_ERROR_EAGAIN == i) {\n                    continue;\n                }\n                if(i < 0) {\n                    fprintf(stderr, \"libssh2_channel_write: %d\\n\", i);\n                    goto shutdown;\n                }\n                wr += i;\n            }\n        }\n        while(1) {\n            len = libssh2_channel_read(channel, buf, sizeof(buf));\n            if(LIBSSH2_ERROR_EAGAIN == len)\n                break;\n            else if(len < 0) {\n                fprintf(stderr, \"libssh2_channel_read: %d\", (int)len);\n                goto shutdown;\n            }\n            wr = 0;\n            while(wr < len) {\n                i = send(forwardsock, buf + wr, len - wr, 0);\n                if(i <= 0) {\n                    perror(\"write\");\n                    goto shutdown;\n                }\n                wr += i;\n            }\n            if(libssh2_channel_eof(channel)) {\n                fprintf(stderr, \"The server at %s:%d disconnected!\\n\",\n                    remote_desthost, remote_destport);\n                goto shutdown;\n            }\n        }\n    }\n\nshutdown:\n#ifdef WIN32\n    closesocket(forwardsock);\n    closesocket(listensock);\n#else\n    close(forwardsock);\n    close(listensock);\n#endif\n    if(channel)\n        libssh2_channel_free(channel);\n    libssh2_session_disconnect(session, \"Client disconnecting normally\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/libssh2_config_cmake.h.in",
    "content": "/* Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* Headers */\n#cmakedefine HAVE_UNISTD_H\n#cmakedefine HAVE_INTTYPES_H\n#cmakedefine HAVE_STDLIB_H\n#cmakedefine HAVE_SYS_SELECT_H\n#cmakedefine HAVE_SYS_SOCKET_H\n#cmakedefine HAVE_SYS_TIME_H\n#cmakedefine HAVE_ARPA_INET_H\n#cmakedefine HAVE_NETINET_IN_H\n#cmakedefine HAVE_WINSOCK2_H\n\n/* Functions */\n#cmakedefine HAVE_STRCASECMP\n#cmakedefine HAVE__STRICMP\n#cmakedefine HAVE_SNPRINTF\n#cmakedefine HAVE__SNPRINTF\n\n/* Workaround for platforms without POSIX strcasecmp (e.g. Windows) */\n#ifndef HAVE_STRCASECMP\n# ifdef HAVE__STRICMP\n# define strcasecmp _stricmp\n# define HAVE_STRCASECMP\n# endif\n#endif\n\n/* Symbols */\n#cmakedefine HAVE___FUNC__\n#cmakedefine HAVE___FUNCTION__\n\n/* Workaround for platforms without C90 __func__ */\n#ifndef HAVE___FUNC__\n# ifdef HAVE___FUNCTION__\n# define __func__ __FUNCTION__\n# define HAVE___FUNC__\n# endif\n#endif\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/scp.c",
    "content": "/*\n * Sample showing how to do a simple SCP transfer.\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel;\n    const char *username = \"username\";\n    const char *password = \"password\";\n    const char *scppath = \"/tmp/TEST\";\n    libssh2_struct_stat fileinfo;\n    int rc;\n    libssh2_struct_stat_size got = 0;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    }\n    else {\n        hostaddr = htonl(0x7F000001);\n    }\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        scppath = argv[4];\n    }\n\n    rc = libssh2_init(0);\n    if(rc) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Ultra basic \"connect to port 22 on localhost\"\n     * Your code is responsible for creating the socket establishing the\n     * connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n               sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if(auth_pw) {\n        /* We could authenticate via password */\n        if(libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else {\n        /* Or by public key */\n#define HOME_DIR \"/home/username/\"\n        if(libssh2_userauth_publickey_fromfile(session, username,\n                                               HOME_DIR \".ssh/id_rsa.pub\",\n                                               HOME_DIR \".ssh/id_rsa\",\n                                               password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    /* Request a file via SCP */\n    channel = libssh2_scp_recv2(session, scppath, &fileinfo);\n\n    if(!channel) {\n        fprintf(stderr, \"Unable to open a session: %d\\n\",\n                libssh2_session_last_errno(session));\n        goto shutdown;\n    }\n\n\n    while(got < fileinfo.st_size) {\n        char mem[1024];\n        int amount = sizeof(mem);\n\n        if((fileinfo.st_size -got) < amount) {\n            amount = (int)(fileinfo.st_size -got);\n        }\n\n        rc = libssh2_channel_read(channel, mem, amount);\n        if(rc > 0) {\n            write(1, mem, rc);\n        }\n        else if(rc < 0) {\n            fprintf(stderr, \"libssh2_channel_read() failed: %d\\n\", rc);\n            break;\n        }\n        got += rc;\n    }\n\n    libssh2_channel_free(channel);\n    channel = NULL;\n\n shutdown:\n\n    libssh2_session_disconnect(session,\n                               \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/scp_nonblock.c",
    "content": "/*\n * Sample showing how to do SCP transfers in a non-blocking manner.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"scp_nonblock 192.168.0.1 user password /tmp/secrets\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\n#ifdef HAVE_GETTIMEOFDAY\n/* diff in ms */\nstatic long tvdiff(struct timeval newer, struct timeval older)\n{\n  return (newer.tv_sec-older.tv_sec)*1000+\n      (newer.tv_usec-older.tv_usec)/1000;\n}\n#endif\n\nstatic int waitsocket(int socket_fd, LIBSSH2_SESSION *session)\n{\n    struct timeval timeout;\n    int rc;\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n    int dir;\n\n    timeout.tv_sec = 10;\n    timeout.tv_usec = 0;\n\n    FD_ZERO(&fd);\n\n    FD_SET(socket_fd, &fd);\n\n    /* now make sure we wait in the correct direction */\n    dir = libssh2_session_block_directions(session);\n\n    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n        readfd = &fd;\n\n    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n        writefd = &fd;\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n\n    return rc;\n}\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel;\n    const char *username = \"username\";\n    const char *password = \"password\";\n    const char *scppath = \"/tmp/TEST\";\n    libssh2_struct_stat fileinfo;\n#ifdef HAVE_GETTIMEOFDAY\n    struct timeval start;\n    struct timeval end;\n    long time_ms;\n#endif\n    int rc;\n    int spin = 0;\n    libssh2_struct_stat_size got = 0;\n    libssh2_struct_stat_size total = 0;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    }\n    else {\n        hostaddr = htonl(0x7F000001);\n    }\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        scppath = argv[4];\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Ultra basic \"connect to port 22 on localhost\"\n     * Your code is responsible for creating the socket establishing the\n     * connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in))) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n#ifdef HAVE_GETTIMEOFDAY\n    gettimeofday(&start, NULL);\n#endif\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    while((rc = libssh2_session_handshake(session, sock)) ==\n          LIBSSH2_ERROR_EAGAIN);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n        * is check the hostkey's fingerprint against our known hosts Your app\n        * may have it hard coded, may go to a file, may present it to the\n        * user, that's your call\n        */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if(auth_pw) {\n        /* We could authenticate via password */\n        while((rc = libssh2_userauth_password(session, username, password)) ==\n              LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else {\n        /* Or by public key */\n        while((rc = libssh2_userauth_publickey_fromfile(session, username,\n                                                        \"/home/username/\"\n                                                        \".ssh/id_rsa.pub\",\n                                                        \"/home/username/\"\n                                                        \".ssh/id_rsa\",\n                                                        password)) ==\n              LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n#if 0\n    libssh2_trace(session, LIBSSH2_TRACE_CONN);\n#endif\n\n    /* Request a file via SCP */\n    fprintf(stderr, \"libssh2_scp_recv2()!\\n\");\n    do {\n        channel = libssh2_scp_recv2(session, scppath, &fileinfo);\n\n        if(!channel) {\n            if(libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN) {\n                char *err_msg;\n\n                libssh2_session_last_error(session, &err_msg, NULL, 0);\n                fprintf(stderr, \"%s\\n\", err_msg);\n                goto shutdown;\n            }\n            else {\n                fprintf(stderr, \"libssh2_scp_recv() spin\\n\");\n                waitsocket(sock, session);\n            }\n        }\n    } while(!channel);\n    fprintf(stderr, \"libssh2_scp_recv() is done, now receive data!\\n\");\n\n    while(got < fileinfo.st_size) {\n        char mem[1024*24];\n        int rc;\n\n        do {\n            int amount = sizeof(mem);\n\n            if((fileinfo.st_size -got) < amount) {\n                amount = (int)(fileinfo.st_size - got);\n            }\n\n            /* loop until we block */\n            rc = libssh2_channel_read(channel, mem, amount);\n            if(rc > 0) {\n                write(1, mem, rc);\n                got += rc;\n                total += rc;\n            }\n        } while(rc > 0);\n\n        if((rc == LIBSSH2_ERROR_EAGAIN) && (got < fileinfo.st_size)) {\n            /* this is due to blocking that would occur otherwise\n            so we loop on this condition */\n\n            spin++;\n            waitsocket(sock, session); /* now we wait */\n            continue;\n        }\n        break;\n    }\n\n#ifdef HAVE_GETTIMEOFDAY\n    gettimeofday(&end, NULL);\n\n    time_ms = tvdiff(end, start);\n    fprintf(stderr, \"Got %ld bytes in %ld ms = %.1f bytes/sec spin: %d\\n\",\n            (long)total,\n            time_ms, total/(time_ms/1000.0), spin);\n#else\n    fprintf(stderr, \"Got %ld bytes spin: %d\\n\", (long)total, spin);\n#endif\n\n    libssh2_channel_free(channel);\n    channel = NULL;\n\nshutdown:\n\n    libssh2_session_disconnect(session,\n                               \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/scp_write.c",
    "content": "/*\n * Sample showing how to do an SCP upload.\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session = NULL;\n    LIBSSH2_CHANNEL *channel;\n    const char *username = \"username\";\n    const char *password = \"password\";\n    const char *loclfile = \"scp_write.c\";\n    const char *scppath = \"/tmp/TEST\";\n    FILE *local;\n    int rc;\n    char mem[1024];\n    size_t nread;\n    char *ptr;\n    struct stat fileinfo;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    }\n    else {\n        hostaddr = htonl(0x7F000001);\n    }\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        loclfile = argv[4];\n    }\n    if(argc > 5) {\n        scppath = argv[5];\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    local = fopen(loclfile, \"rb\");\n    if(!local) {\n        fprintf(stderr, \"Can't open local file %s\\n\", loclfile);\n        return -1;\n    }\n\n    stat(loclfile, &fileinfo);\n\n    /* Ultra basic \"connect to port 22 on localhost\"\n     * Your code is responsible for creating the socket establishing the\n     * connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n    if(-1 == sock) {\n        fprintf(stderr, \"failed to create socket!\\n\");\n        return -1;\n    }\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n               sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if(auth_pw) {\n        /* We could authenticate via password */\n        if(libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else {\n        /* Or by public key */\n#define HOME \"/home/username/\"\n        if(libssh2_userauth_publickey_fromfile(session, username,\n                                               HOME \".ssh/id_rsa.pub\",\n                                               HOME \".ssh/id_rsa\",\n                                               password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    /* Send a file via scp. The mode parameter must only have permissions! */\n    channel = libssh2_scp_send(session, scppath, fileinfo.st_mode & 0777,\n                               (unsigned long)fileinfo.st_size);\n\n    if(!channel) {\n        char *errmsg;\n        int errlen;\n        int err = libssh2_session_last_error(session, &errmsg, &errlen, 0);\n        fprintf(stderr, \"Unable to open a session: (%d) %s\\n\", err, errmsg);\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"SCP session waiting to send file\\n\");\n    do {\n        nread = fread(mem, 1, sizeof(mem), local);\n        if(nread <= 0) {\n            /* end of file */\n            break;\n        }\n        ptr = mem;\n\n        do {\n            /* write the same data over and over, until error or completion */\n            rc = libssh2_channel_write(channel, ptr, nread);\n            if(rc < 0) {\n                fprintf(stderr, \"ERROR %d\\n\", rc);\n                break;\n            }\n            else {\n                /* rc indicates how many bytes were written this time */\n                ptr += rc;\n                nread -= rc;\n            }\n        } while(nread);\n\n    } while(1);\n\n    fprintf(stderr, \"Sending EOF\\n\");\n    libssh2_channel_send_eof(channel);\n\n    fprintf(stderr, \"Waiting for EOF\\n\");\n    libssh2_channel_wait_eof(channel);\n\n    fprintf(stderr, \"Waiting for channel to close\\n\");\n    libssh2_channel_wait_closed(channel);\n\n    libssh2_channel_free(channel);\n    channel = NULL;\n\n shutdown:\n\n    if(session) {\n        libssh2_session_disconnect(session, \"Normal Shutdown\");\n        libssh2_session_free(session);\n    }\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    if(local)\n        fclose(local);\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/scp_write_nonblock.c",
    "content": "/*\n * Sample showing how to do an SCP non-blocking upload transfer.\n */\n\n#include \"libssh2_config.h\"\n\n#include <libssh2.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <time.h>\n\nstatic int waitsocket(int socket_fd, LIBSSH2_SESSION *session)\n{\n    struct timeval timeout;\n    int rc;\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n    int dir;\n\n    timeout.tv_sec = 10;\n    timeout.tv_usec = 0;\n\n    FD_ZERO(&fd);\n\n    FD_SET(socket_fd, &fd);\n\n    /* now make sure we wait in the correct direction */\n    dir = libssh2_session_block_directions(session);\n\n    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n        readfd = &fd;\n\n    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n        writefd = &fd;\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n\n    return rc;\n}\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session = NULL;\n    LIBSSH2_CHANNEL *channel;\n    const char *username = \"username\";\n    const char *password = \"password\";\n    const char *loclfile = \"scp_write.c\";\n    const char *scppath = \"/tmp/TEST\";\n    FILE *local;\n    int rc;\n    char mem[1024*100];\n    size_t nread;\n    char *ptr;\n    struct stat fileinfo;\n    time_t start;\n    long total = 0;\n    int duration;\n    size_t prev;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    }\n    else {\n        hostaddr = htonl(0x7F000001);\n    }\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        loclfile = argv[4];\n    }\n    if(argc > 5) {\n        scppath = argv[5];\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    local = fopen(loclfile, \"rb\");\n    if(!local) {\n        fprintf(stderr, \"Can't local file %s\\n\", loclfile);\n        return -1;\n    }\n\n    stat(loclfile, &fileinfo);\n\n    /* Ultra basic \"connect to port 22 on localhost\"\n     * Your code is responsible for creating the socket establishing the\n     * connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n               sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    while((rc = libssh2_session_handshake(session, sock))\n          == LIBSSH2_ERROR_EAGAIN);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if(auth_pw) {\n        /* We could authenticate via password */\n        while((rc = libssh2_userauth_password(session, username, password)) ==\n              LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else {\n        /* Or by public key */\n#define HOME \"/home/username/\"\n        while((rc = libssh2_userauth_publickey_fromfile(session, username,\n                                                        HOME \".ssh/id_rsa.pub\",\n                                                        HOME \".ssh/id_rsa\",\n                                                        password)) ==\n              LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    /* Send a file via scp. The mode parameter must only have permissions! */\n    do {\n        channel = libssh2_scp_send(session, scppath, fileinfo.st_mode & 0777,\n                                   (unsigned long)fileinfo.st_size);\n\n        if((!channel) && (libssh2_session_last_errno(session) !=\n                          LIBSSH2_ERROR_EAGAIN)) {\n            char *err_msg;\n\n            libssh2_session_last_error(session, &err_msg, NULL, 0);\n            fprintf(stderr, \"%s\\n\", err_msg);\n            goto shutdown;\n        }\n    } while(!channel);\n\n    fprintf(stderr, \"SCP session waiting to send file\\n\");\n    start = time(NULL);\n    do {\n        nread = fread(mem, 1, sizeof(mem), local);\n        if(nread <= 0) {\n            /* end of file */\n            break;\n        }\n        ptr = mem;\n\n        total += nread;\n\n        prev = 0;\n        do {\n            while((rc = libssh2_channel_write(channel, ptr, nread)) ==\n                  LIBSSH2_ERROR_EAGAIN) {\n                waitsocket(sock, session);\n                prev = 0;\n            }\n            if(rc < 0) {\n                fprintf(stderr, \"ERROR %d total %ld / %d prev %d\\n\", rc,\n                        total, (int)nread, (int)prev);\n                break;\n            }\n            else {\n                prev = nread;\n\n                /* rc indicates how many bytes were written this time */\n                nread -= rc;\n                ptr += rc;\n            }\n        } while(nread);\n    } while(!nread); /* only continue if nread was drained */\n\n    duration = (int)(time(NULL)-start);\n\n    fprintf(stderr, \"%ld bytes in %d seconds makes %.1f bytes/sec\\n\",\n           total, duration, total/(double)duration);\n\n    fprintf(stderr, \"Sending EOF\\n\");\n    while(libssh2_channel_send_eof(channel) == LIBSSH2_ERROR_EAGAIN);\n\n    fprintf(stderr, \"Waiting for EOF\\n\");\n    while(libssh2_channel_wait_eof(channel) == LIBSSH2_ERROR_EAGAIN);\n\n    fprintf(stderr, \"Waiting for channel to close\\n\");\n    while(libssh2_channel_wait_closed(channel) == LIBSSH2_ERROR_EAGAIN);\n\n    libssh2_channel_free(channel);\n    channel = NULL;\n\n shutdown:\n\n    while(libssh2_session_disconnect(session,\n                                     \"Normal Shutdown,\") ==\n          LIBSSH2_ERROR_EAGAIN);\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/sftp.c",
    "content": "/*\n * Sample showing how to do SFTP transfers.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"sftp 192.168.0.1 user password /tmp/secrets -p|-i|-k\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\n\nconst char *keyfile1 = \"~/.ssh/id_rsa.pub\";\nconst char *keyfile2 = \"~/.ssh/id_rsa\";\nconst char *username = \"username\";\nconst char *password = \"password\";\nconst char *sftppath = \"/tmp/TEST\";\n\n\nstatic void kbd_callback(const char *name, int name_len,\n                         const char *instruction, int instruction_len,\n                         int num_prompts,\n                         const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,\n                         LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses,\n                         void **abstract)\n{\n    int i;\n    size_t n;\n    char buf[1024];\n    (void)abstract;\n\n    fprintf(stderr, \"Performing keyboard-interactive authentication.\\n\");\n\n    fprintf(stderr, \"Authentication name: '\");\n    fwrite(name, 1, name_len, stderr);\n    fprintf(stderr, \"'\\n\");\n\n    fprintf(stderr, \"Authentication instruction: '\");\n    fwrite(instruction, 1, instruction_len, stderr);\n    fprintf(stderr, \"'\\n\");\n\n    fprintf(stderr, \"Number of prompts: %d\\n\\n\", num_prompts);\n\n    for(i = 0; i < num_prompts; i++) {\n        fprintf(stderr, \"Prompt %d from server: '\", i);\n        fwrite(prompts[i].text, 1, prompts[i].length, stderr);\n        fprintf(stderr, \"'\\n\");\n\n        fprintf(stderr, \"Please type response: \");\n        fgets(buf, sizeof(buf), stdin);\n        n = strlen(buf);\n        while(n > 0 && strchr(\"\\r\\n\", buf[n - 1]))\n          n--;\n        buf[n] = 0;\n\n        responses[i].text = strdup(buf);\n        responses[i].length = n;\n\n        fprintf(stderr, \"Response %d from user is '\", i);\n        fwrite(responses[i].text, 1, responses[i].length, stderr);\n        fprintf(stderr, \"'\\n\\n\");\n    }\n\n    fprintf(stderr,\n        \"Done. Sending keyboard-interactive responses to server now.\\n\");\n}\n\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 0;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session;\n    int rc;\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    }\n    else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        sftppath = argv[4];\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n               sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are blocking */\n    libssh2_session_set_blocking(session, 1);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    fprintf(stderr, \"Authentication methods: %s\\n\", userauthlist);\n    if(strstr(userauthlist, \"password\") != NULL) {\n        auth_pw |= 1;\n    }\n    if(strstr(userauthlist, \"keyboard-interactive\") != NULL) {\n        auth_pw |= 2;\n    }\n    if(strstr(userauthlist, \"publickey\") != NULL) {\n        auth_pw |= 4;\n    }\n\n    /* if we got an 4. argument we set this option if supported */\n    if(argc > 5) {\n        if((auth_pw & 1) && !strcasecmp(argv[5], \"-p\")) {\n            auth_pw = 1;\n        }\n        if((auth_pw & 2) && !strcasecmp(argv[5], \"-i\")) {\n            auth_pw = 2;\n        }\n        if((auth_pw & 4) && !strcasecmp(argv[5], \"-k\")) {\n            auth_pw = 4;\n        }\n    }\n\n    if(auth_pw & 1) {\n        /* We could authenticate via password */\n        if(libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else if(auth_pw & 2) {\n        /* Or via keyboard-interactive */\n        if(libssh2_userauth_keyboard_interactive(session, username,\n                                                 &kbd_callback) ) {\n            fprintf(stderr,\n                \"\\tAuthentication by keyboard-interactive failed!\\n\");\n            goto shutdown;\n        }\n        else {\n            fprintf(stderr,\n                \"\\tAuthentication by keyboard-interactive succeeded.\\n\");\n        }\n    }\n    else if(auth_pw & 4) {\n        /* Or by public key */\n        if(libssh2_userauth_publickey_fromfile(session, username, keyfile1,\n                                               keyfile2, password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed!\\n\");\n            goto shutdown;\n        }\n        else {\n            fprintf(stderr, \"\\tAuthentication by public key succeeded.\\n\");\n        }\n    }\n    else {\n        fprintf(stderr, \"No supported authentication methods found!\\n\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    sftp_session = libssh2_sftp_init(session);\n\n    if(!sftp_session) {\n        fprintf(stderr, \"Unable to init SFTP session\\n\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"libssh2_sftp_open()!\\n\");\n    /* Request a file via SFTP */\n    sftp_handle =\n        libssh2_sftp_open(sftp_session, sftppath, LIBSSH2_FXF_READ, 0);\n\n    if(!sftp_handle) {\n        fprintf(stderr, \"Unable to open file with SFTP: %ld\\n\",\n                libssh2_sftp_last_error(sftp_session));\n        goto shutdown;\n    }\n    fprintf(stderr, \"libssh2_sftp_open() is done, now receive data!\\n\");\n    do {\n        char mem[1024];\n\n        /* loop until we fail */\n        fprintf(stderr, \"libssh2_sftp_read()!\\n\");\n        rc = libssh2_sftp_read(sftp_handle, mem, sizeof(mem));\n        if(rc > 0) {\n            write(1, mem, rc);\n        }\n        else {\n            break;\n        }\n    } while(1);\n\n    libssh2_sftp_close(sftp_handle);\n    libssh2_sftp_shutdown(sftp_session);\n\n  shutdown:\n\n    libssh2_session_disconnect(session, \"Normal Shutdown\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/sftp_RW_nonblock.c",
    "content": "/*\n * Sample showing how to do SFTP transfers in a non-blocking manner.\n *\n * It will first download a given source file, store it locally and then\n * upload the file again to a given destination file.\n *\n * Using the SFTP server running on 127.0.0.1\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\n#define STORAGE \"/tmp/sftp-storage\" /* this is the local file name this\n                                       example uses to store the downloaded\n                                       file in */\n\nstatic int waitsocket(int socket_fd, LIBSSH2_SESSION *session)\n{\n    struct timeval timeout;\n    int rc;\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n    int dir;\n\n    timeout.tv_sec = 10;\n    timeout.tv_usec = 0;\n\n    FD_ZERO(&fd);\n\n    FD_SET(socket_fd, &fd);\n\n    /* now make sure we wait in the correct direction */\n    dir = libssh2_session_block_directions(session);\n\n    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n        readfd = &fd;\n\n    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n        writefd = &fd;\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n\n    return rc;\n}\n\nint main(int argc, char *argv[])\n{\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username = \"username\";\n    const char *password = \"password\";\n    const char *sftppath = \"/tmp/TEST\"; /* source path */\n    const char *dest = \"/tmp/TEST2\";    /* destination path */\n    int rc;\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n    FILE *tempstorage;\n    char mem[1000];\n    struct timeval timeout;\n    fd_set fd;\n    fd_set fd2;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Ultra basic \"connect to port 22 on localhost\"\n     * The application is responsible for creating the socket establishing\n     * the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = htonl(0x7F000001);\n    if(connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    libssh2_session_set_blocking(session, 0);\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if(argc > 1) {\n        username = argv[1];\n    }\n    if(argc > 2) {\n        password = argv[2];\n    }\n    if(argc > 3) {\n        sftppath = argv[3];\n    }\n    if(argc > 4) {\n        dest = argv[4];\n    }\n\n    tempstorage = fopen(STORAGE, \"wb\");\n    if(!tempstorage) {\n        fprintf(stderr, \"Can't open temp storage file %s\\n\", STORAGE);\n        goto shutdown;\n    }\n\n    if(auth_pw) {\n        /* We could authenticate via password */\n        while((rc = libssh2_userauth_password(session, username, password))\n               == LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else {\n        /* Or by public key */\n        while((rc =\n               libssh2_userauth_publickey_fromfile(session, username,\n                                                   \"/home/username/\"\n                                                   \".ssh/id_rsa.pub\",\n                                                   \"/home/username/\"\n                                                   \".ssh/id_rsa\",\n                                                   password)) ==\n              LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    do {\n        sftp_session = libssh2_sftp_init(session);\n\n        if(!sftp_session) {\n            if(libssh2_session_last_errno(session) ==\n               LIBSSH2_ERROR_EAGAIN) {\n                fprintf(stderr, \"non-blocking init\\n\");\n                waitsocket(sock, session); /* now we wait */\n            }\n            else {\n                fprintf(stderr, \"Unable to init SFTP session\\n\");\n                goto shutdown;\n            }\n        }\n    } while(!sftp_session);\n\n    /* Request a file via SFTP */\n    do {\n        sftp_handle = libssh2_sftp_open(sftp_session, sftppath,\n                                        LIBSSH2_FXF_READ, 0);\n\n        if(!sftp_handle) {\n            if(libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN) {\n                fprintf(stderr, \"Unable to open file with SFTP\\n\");\n                goto shutdown;\n            }\n            else {\n                fprintf(stderr, \"non-blocking open\\n\");\n                waitsocket(sock, session); /* now we wait */\n            }\n        }\n    } while(!sftp_handle);\n\n    fprintf(stderr, \"libssh2_sftp_open() is done, now receive data!\\n\");\n    do {\n        do {\n            /* read in a loop until we block */\n            rc = libssh2_sftp_read(sftp_handle, mem, sizeof(mem));\n            fprintf(stderr, \"libssh2_sftp_read returned %d\\n\",\n                    rc);\n\n            if(rc > 0) {\n                /* write to stderr */\n                write(2, mem, rc);\n                /* write to temporary storage area */\n                fwrite(mem, rc, 1, tempstorage);\n            }\n        } while(rc > 0);\n\n        if(rc != LIBSSH2_ERROR_EAGAIN) {\n            /* error or end of file */\n            break;\n        }\n\n        timeout.tv_sec = 10;\n        timeout.tv_usec = 0;\n\n        FD_ZERO(&fd);\n        FD_ZERO(&fd2);\n        FD_SET(sock, &fd);\n        FD_SET(sock, &fd2);\n\n        /* wait for readable or writeable */\n        rc = select(sock + 1, &fd, &fd2, NULL, &timeout);\n        if(rc <= 0) {\n            /* negative is error\n               0 is timeout */\n            fprintf(stderr, \"SFTP download timed out: %d\\n\", rc);\n            break;\n        }\n\n    } while(1);\n\n    libssh2_sftp_close(sftp_handle);\n    fclose(tempstorage);\n\n    tempstorage = fopen(STORAGE, \"rb\");\n    if(!tempstorage) {\n        /* weird, we can't read the file we just wrote to... */\n        fprintf(stderr, \"can't open %s for reading\\n\", STORAGE);\n        goto shutdown;\n    }\n\n    /* we're done downloading, now reverse the process and upload the\n       temporarily stored data to the destination path */\n    sftp_handle =\n        libssh2_sftp_open(sftp_session, dest,\n                          LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT,\n                          LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR|\n                          LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH);\n    if(sftp_handle) {\n        size_t nread;\n        char *ptr;\n        do {\n            nread = fread(mem, 1, sizeof(mem), tempstorage);\n            if(nread <= 0) {\n                /* end of file */\n                break;\n            }\n            ptr = mem;\n\n            do {\n                /* write data in a loop until we block */\n                rc = libssh2_sftp_write(sftp_handle, ptr,\n                                        nread);\n                ptr += rc;\n                nread -= nread;\n            } while(rc >= 0);\n\n            if(rc != LIBSSH2_ERROR_EAGAIN) {\n                /* error or end of file */\n                break;\n            }\n\n            timeout.tv_sec = 10;\n            timeout.tv_usec = 0;\n\n            FD_ZERO(&fd);\n            FD_ZERO(&fd2);\n            FD_SET(sock, &fd);\n            FD_SET(sock, &fd2);\n\n            /* wait for readable or writeable */\n            rc = select(sock + 1, &fd, &fd2, NULL, &timeout);\n            if(rc <= 0) {\n                /* negative is error\n                   0 is timeout */\n                fprintf(stderr, \"SFTP upload timed out: %d\\n\",\n                        rc);\n                break;\n            }\n        } while(1);\n        fprintf(stderr, \"SFTP upload done!\\n\");\n    }\n    else {\n        fprintf(stderr, \"SFTP failed to open destination path: %s\\n\",\n                dest);\n    }\n\n    libssh2_sftp_shutdown(sftp_session);\n\n  shutdown:\n\n    libssh2_session_disconnect(session, \"Normal Shutdown\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    if(tempstorage)\n        fclose(tempstorage);\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/sftp_append.c",
    "content": "/*\n * Sample showing how to do SFTP append of a local file onto a remote one.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * sftp_append 192.168.0.1 user password localfile /tmp/remotefile\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username = \"username\";\n    const char *password = \"password\";\n    const char *loclfile = \"sftp_write.c\";\n    const char *sftppath = \"/tmp/TEST\";\n    int rc;\n    FILE *local;\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n    LIBSSH2_SFTP_ATTRIBUTES attrs;\n    char mem[1024*100];\n    size_t nread;\n    char *ptr;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    }\n    else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        loclfile = argv[4];\n    }\n    if(argc > 5) {\n        sftppath = argv[5];\n    }\n\n    rc = libssh2_init(0);\n    if(rc) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    local = fopen(loclfile, \"rb\");\n    if(!local) {\n        fprintf(stderr, \"Can't open local file %s\\n\", loclfile);\n        return -1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n               sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are blocking */\n    libssh2_session_set_blocking(session, 1);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if(auth_pw) {\n        /* We could authenticate via password */\n        if(libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else {\n        /* Or by public key */\n#define HOME \"/home/username/\"\n        if(libssh2_userauth_publickey_fromfile(session, username,\n                                               HOME \".ssh/id_rsa.pub\",\n                                               HOME \".ssh/id_rsa\",\n                                               password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    sftp_session = libssh2_sftp_init(session);\n\n    if(!sftp_session) {\n        fprintf(stderr, \"Unable to init SFTP session\\n\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"libssh2_sftp_open() for READ and WRITE!\\n\");\n    /* Request a file via SFTP */\n\n    sftp_handle =\n        libssh2_sftp_open(sftp_session, sftppath,\n                          LIBSSH2_FXF_WRITE|LIBSSH2_FXF_READ,\n                          LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR|\n                          LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH);\n    if(!sftp_handle) {\n        fprintf(stderr, \"Unable to open file with SFTP\\n\");\n        goto shutdown;\n    }\n\n    if(libssh2_sftp_fstat_ex(sftp_handle, &attrs, 0) < 0) {\n        fprintf(stderr, \"libssh2_sftp_fstat_ex failed\\n\");\n        goto shutdown;\n    }\n    else\n        libssh2_sftp_seek64(sftp_handle, attrs.filesize);\n    fprintf(stderr, \"Did a seek to position %ld\\n\", (long) attrs.filesize);\n\n    fprintf(stderr, \"libssh2_sftp_open() a handle for APPEND\\n\");\n\n    if(!sftp_handle) {\n        fprintf(stderr, \"Unable to open file with SFTP\\n\");\n        goto shutdown;\n    }\n    fprintf(stderr, \"libssh2_sftp_open() is done, now send data!\\n\");\n    do {\n        nread = fread(mem, 1, sizeof(mem), local);\n        if(nread <= 0) {\n            /* end of file */\n            break;\n        }\n        ptr = mem;\n\n        do {\n            /* write data in a loop until we block */\n            rc = libssh2_sftp_write(sftp_handle, ptr, nread);\n            if(rc < 0)\n                break;\n            ptr += rc;\n            nread -= rc;\n        } while(nread);\n\n    } while(rc > 0);\n\n    libssh2_sftp_close(sftp_handle);\n    libssh2_sftp_shutdown(sftp_session);\n\nshutdown:\n    libssh2_session_disconnect(session,\n                               \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    if(local)\n        fclose(local);\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/sftp_mkdir.c",
    "content": "/*\n * Sample showing how to do SFTP mkdir\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"sftp 192.168.0.1 user password /tmp/sftp_mkdir\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username = \"username\";\n    const char *password = \"password\";\n    const char *sftppath = \"/tmp/sftp_mkdir\";\n    int rc;\n    LIBSSH2_SFTP *sftp_session;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    }\n    else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        sftppath = argv[4];\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n            sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if(auth_pw) {\n        /* We could authenticate via password */\n        if(libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else {\n        /* Or by public key */\n        if(libssh2_userauth_publickey_fromfile(session, username,\n                            \"/home/username/.ssh/id_rsa.pub\",\n                            \"/home/username/.ssh/id_rsa\",\n                            password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    sftp_session = libssh2_sftp_init(session);\n\n    if(!sftp_session) {\n        fprintf(stderr, \"Unable to init SFTP session\\n\");\n        goto shutdown;\n    }\n\n    /* Since we have not set non-blocking, tell libssh2 we are blocking */\n    libssh2_session_set_blocking(session, 1);\n\n    /* Make a directory via SFTP */\n    rc = libssh2_sftp_mkdir(sftp_session, sftppath,\n                            LIBSSH2_SFTP_S_IRWXU|\n                            LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IXGRP|\n                            LIBSSH2_SFTP_S_IROTH|LIBSSH2_SFTP_S_IXOTH);\n\n    if(rc)\n        fprintf(stderr, \"libssh2_sftp_mkdir failed: %d\\n\", rc);\n\n    libssh2_sftp_shutdown(sftp_session);\n\n shutdown:\n\n    libssh2_session_disconnect(session, \"Normal Shutdown\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/sftp_mkdir_nonblock.c",
    "content": "/*\n * Sample showing how to do SFTP non-blocking mkdir.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"sftp 192.168.0.1 user password /tmp/sftp_write_nonblock.c\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username = \"username\";\n    const char *password = \"password\";\n    const char *sftppath = \"/tmp/sftp_mkdir_nonblock\";\n    int rc;\n    LIBSSH2_SFTP *sftp_session;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    }\n    else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        sftppath = argv[4];\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n            sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if(auth_pw) {\n        /* We could authenticate via password */\n        if(libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else {\n        /* Or by public key */\n        if(libssh2_userauth_publickey_fromfile(session, username,\n                            \"/home/username/.ssh/id_rsa.pub\",\n                            \"/home/username/.ssh/id_rsa\",\n                            password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    sftp_session = libssh2_sftp_init(session);\n\n    if(!sftp_session) {\n        fprintf(stderr, \"Unable to init SFTP session\\n\");\n        goto shutdown;\n    }\n\n    /* Since we have set non-blocking, tell libssh2 we are non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n    fprintf(stderr, \"libssh2_sftp_mkdirnb()!\\n\");\n    /* Make a directory via SFTP */\n    while(libssh2_sftp_mkdir(sftp_session, sftppath,\n                              LIBSSH2_SFTP_S_IRWXU|\n                              LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IXGRP|\n                              LIBSSH2_SFTP_S_IROTH|LIBSSH2_SFTP_S_IXOTH)\n           == LIBSSH2_ERROR_EAGAIN);\n\n    libssh2_sftp_shutdown(sftp_session);\n\n shutdown:\n\n    libssh2_session_disconnect(session, \"Normal Shutdown\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/sftp_nonblock.c",
    "content": "/*\n * Sample showing how to do SFTP non-blocking transfers.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"sftp_nonblock 192.168.0.1 user password /tmp/secrets\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\n#ifdef HAVE_GETTIMEOFDAY\n/* diff in ms */\nstatic long tvdiff(struct timeval newer, struct timeval older)\n{\n  return (newer.tv_sec-older.tv_sec)*1000+\n      (newer.tv_usec-older.tv_usec)/1000;\n}\n#endif\n\nstatic int waitsocket(int socket_fd, LIBSSH2_SESSION *session)\n{\n    struct timeval timeout;\n    int rc;\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n    int dir;\n\n    timeout.tv_sec = 10;\n    timeout.tv_usec = 0;\n\n    FD_ZERO(&fd);\n\n    FD_SET(socket_fd, &fd);\n\n    /* now make sure we wait in the correct direction */\n    dir = libssh2_session_block_directions(session);\n\n    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n        readfd = &fd;\n\n    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n        writefd = &fd;\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n\n    return rc;\n}\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username = \"username\";\n    const char *password = \"password\";\n    const char *sftppath = \"/tmp/TEST\";\n#ifdef HAVE_GETTIMEOFDAY\n    struct timeval start;\n    struct timeval end;\n    long time_ms;\n#endif\n    int rc;\n    int total = 0;\n    int spin = 0;\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    }\n    else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        sftppath = argv[4];\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n#ifdef HAVE_GETTIMEOFDAY\n    gettimeofday(&start, NULL);\n#endif\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n        * and setup crypto, compression, and MAC layers\n        */\n    while((rc = libssh2_session_handshake(session, sock)) ==\n           LIBSSH2_ERROR_EAGAIN);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n        * is check the hostkey's fingerprint against our known hosts Your app\n        * may have it hard coded, may go to a file, may present it to the\n        * user, that's your call\n        */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if(auth_pw) {\n        /* We could authenticate via password */\n        while((rc = libssh2_userauth_password(session, username, password))\n               == LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else {\n        /* Or by public key */\n        while((rc =\n               libssh2_userauth_publickey_fromfile(session, username,\n                                                   \"/home/username/\"\n                                                   \".ssh/id_rsa.pub\",\n                                                   \"/home/username/\"\n                                                   \".ssh/id_rsa\",\n                                                   password)) ==\n              LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n#if 0\n    libssh2_trace(session, LIBSSH2_TRACE_CONN);\n#endif\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    do {\n        sftp_session = libssh2_sftp_init(session);\n\n        if(!sftp_session) {\n            if(libssh2_session_last_errno(session) ==\n               LIBSSH2_ERROR_EAGAIN) {\n                fprintf(stderr, \"non-blocking init\\n\");\n                waitsocket(sock, session); /* now we wait */\n            }\n            else {\n                fprintf(stderr, \"Unable to init SFTP session\\n\");\n                goto shutdown;\n            }\n        }\n    } while(!sftp_session);\n\n    fprintf(stderr, \"libssh2_sftp_open()!\\n\");\n    /* Request a file via SFTP */\n    do {\n        sftp_handle = libssh2_sftp_open(sftp_session, sftppath,\n                                        LIBSSH2_FXF_READ, 0);\n\n        if(!sftp_handle) {\n            if(libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN) {\n                fprintf(stderr, \"Unable to open file with SFTP\\n\");\n                goto shutdown;\n            }\n            else {\n                fprintf(stderr, \"non-blocking open\\n\");\n                waitsocket(sock, session); /* now we wait */\n            }\n        }\n    } while(!sftp_handle);\n\n    fprintf(stderr, \"libssh2_sftp_open() is done, now receive data!\\n\");\n    do {\n        char mem[1024*24];\n\n        /* loop until we fail */\n        while((rc = libssh2_sftp_read(sftp_handle, mem,\n                                       sizeof(mem))) == LIBSSH2_ERROR_EAGAIN) {\n            spin++;\n            waitsocket(sock, session); /* now we wait */\n        }\n        if(rc > 0) {\n            total += rc;\n            write(1, mem, rc);\n        }\n        else {\n            break;\n        }\n    } while(1);\n\n#ifdef HAVE_GETTIMEOFDAY\n    gettimeofday(&end, NULL);\n    time_ms = tvdiff(end, start);\n    fprintf(stderr, \"Got %d bytes in %ld ms = %.1f bytes/sec spin: %d\\n\",\n            total,\n            time_ms, total/(time_ms/1000.0), spin);\n#else\n    fprintf(stderr, \"Got %d bytes spin: %d\\n\", total, spin);\n#endif\n\n    libssh2_sftp_close(sftp_handle);\n    libssh2_sftp_shutdown(sftp_session);\n\nshutdown:\n\n    fprintf(stderr, \"libssh2_session_disconnect\\n\");\n    while(libssh2_session_disconnect(session,\n                                      \"Normal Shutdown, Thank you\") ==\n           LIBSSH2_ERROR_EAGAIN);\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/sftp_write.c",
    "content": "/*\n * Sample showing how to do SFTP write transfers.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"sftp 192.168.0.1 user password sftp_write.c /tmp/secrets\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username = \"username\";\n    const char *password = \"password\";\n    const char *loclfile = \"sftp_write.c\";\n    const char *sftppath = \"/tmp/TEST\";\n    int rc;\n    FILE *local;\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n    char mem[1024*100];\n    size_t nread;\n    char *ptr;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    }\n    else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        loclfile = argv[4];\n    }\n    if(argc > 5) {\n        sftppath = argv[5];\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    local = fopen(loclfile, \"rb\");\n    if(!local) {\n        fprintf(stderr, \"Can't open local file %s\\n\", loclfile);\n        return -1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n            sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are blocking */\n    libssh2_session_set_blocking(session, 1);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if(auth_pw) {\n        /* We could authenticate via password */\n        if(libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else {\n        /* Or by public key */\n        const char *pubkey = \"/home/username/.ssh/id_rsa.pub\";\n        const char *privkey = \"/home/username/.ssh/id_rsa.pub\";\n        if(libssh2_userauth_publickey_fromfile(session, username,\n                                               pubkey, privkey,\n                                               password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    sftp_session = libssh2_sftp_init(session);\n\n    if(!sftp_session) {\n        fprintf(stderr, \"Unable to init SFTP session\\n\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"libssh2_sftp_open()!\\n\");\n    /* Request a file via SFTP */\n    sftp_handle =\n        libssh2_sftp_open(sftp_session, sftppath,\n                      LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC,\n                      LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR|\n                      LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH);\n\n    if(!sftp_handle) {\n        fprintf(stderr, \"Unable to open file with SFTP\\n\");\n        goto shutdown;\n    }\n    fprintf(stderr, \"libssh2_sftp_open() is done, now send data!\\n\");\n    do {\n        nread = fread(mem, 1, sizeof(mem), local);\n        if(nread <= 0) {\n            /* end of file */\n            break;\n        }\n        ptr = mem;\n\n        do {\n            /* write data in a loop until we block */\n            rc = libssh2_sftp_write(sftp_handle, ptr, nread);\n            if(rc < 0)\n                break;\n            ptr += rc;\n            nread -= rc;\n        } while(nread);\n\n    } while(rc > 0);\n\n    libssh2_sftp_close(sftp_handle);\n    libssh2_sftp_shutdown(sftp_session);\n\nshutdown:\n    libssh2_session_disconnect(session,\n                               \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    if(local)\n        fclose(local);\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/sftp_write_nonblock.c",
    "content": "/*\n * Sample showing how to do SFTP non-blocking write transfers.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"sftp 192.168.0.1 user password thisfile /tmp/storehere\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <time.h>\n\nstatic int waitsocket(int socket_fd, LIBSSH2_SESSION *session)\n{\n    struct timeval timeout;\n    int rc;\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n    int dir;\n\n    timeout.tv_sec = 10;\n    timeout.tv_usec = 0;\n\n    FD_ZERO(&fd);\n\n    FD_SET(socket_fd, &fd);\n\n    /* now make sure we wait in the correct direction */\n    dir = libssh2_session_block_directions(session);\n\n    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n        readfd = &fd;\n\n    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n        writefd = &fd;\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n\n    return rc;\n}\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username = \"username\";\n    const char *password = \"password\";\n    const char *loclfile = \"sftp_write_nonblock.c\";\n    const char *sftppath = \"/tmp/sftp_write_nonblock.c\";\n    int rc;\n    FILE *local;\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n    char mem[1024 * 100];\n    size_t nread;\n    char *ptr;\n    time_t start;\n    long total = 0;\n    int duration;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    }\n    else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        loclfile = argv[4];\n    }\n    if(argc > 5) {\n        sftppath = argv[5];\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    local = fopen(loclfile, \"rb\");\n    if(!local) {\n        fprintf(stderr, \"Can't open local file %s\\n\", loclfile);\n        return -1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n        */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n        * and setup crypto, compression, and MAC layers\n        */\n    while((rc = libssh2_session_handshake(session, sock))\n           == LIBSSH2_ERROR_EAGAIN);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do is\n     * check the hostkey's fingerprint against our known hosts Your app may\n     * have it hard coded, may go to a file, may present it to the user,\n     * that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if(auth_pw) {\n        /* We could authenticate via password */\n        while((rc = libssh2_userauth_password(session, username, password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else {\n        /* Or by public key */\n        const char *pubkey = \"/home/username/.ssh/id_rsa.pub\";\n        const char *privkey = \"/home/username/.ssh/id_rsa\";\n        while((rc = libssh2_userauth_publickey_fromfile(session, username,\n                                                        pubkey, privkey,\n                                                        password)) ==\n              LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    do {\n        sftp_session = libssh2_sftp_init(session);\n\n        if(!sftp_session &&\n            (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN)) {\n            fprintf(stderr, \"Unable to init SFTP session\\n\");\n            goto shutdown;\n        }\n    } while(!sftp_session);\n\n    fprintf(stderr, \"libssh2_sftp_open()!\\n\");\n    /* Request a file via SFTP */\n    do {\n        sftp_handle =\n            libssh2_sftp_open(sftp_session, sftppath,\n                              LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|\n                              LIBSSH2_FXF_TRUNC,\n                              LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR|\n                              LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH);\n        if(!sftp_handle &&\n           (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN)) {\n            fprintf(stderr, \"Unable to open file with SFTP\\n\");\n            goto shutdown;\n        }\n    } while(!sftp_handle);\n\n    fprintf(stderr, \"libssh2_sftp_open() is done, now send data!\\n\");\n\n    start = time(NULL);\n\n    do {\n        nread = fread(mem, 1, sizeof(mem), local);\n        if(nread <= 0) {\n            /* end of file */\n            break;\n        }\n        ptr = mem;\n\n        total += nread;\n\n        do {\n            /* write data in a loop until we block */\n            while((rc = libssh2_sftp_write(sftp_handle, ptr, nread)) ==\n                   LIBSSH2_ERROR_EAGAIN) {\n                waitsocket(sock, session);\n            }\n            if(rc < 0)\n                break;\n            ptr += rc;\n            nread -= rc;\n\n        } while(nread);\n    } while(rc > 0);\n\n    duration = (int)(time(NULL)-start);\n\n    fprintf(stderr, \"%ld bytes in %d seconds makes %.1f bytes/sec\\n\",\n           total, duration, total/(double)duration);\n\n\n    fclose(local);\n    libssh2_sftp_close(sftp_handle);\n    libssh2_sftp_shutdown(sftp_session);\n\nshutdown:\n\n    while(libssh2_session_disconnect(session, \"Normal Shutdown\")\n           == LIBSSH2_ERROR_EAGAIN);\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/sftp_write_sliding.c",
    "content": "/*\n * Sample showing how to do SFTP non-blocking write transfers.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"sftp 192.168.0.1 user password file /tmp/storehere\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <time.h>\n\nstatic int waitsocket(int socket_fd, LIBSSH2_SESSION *session)\n{\n    struct timeval timeout;\n    int rc;\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n    int dir;\n\n    timeout.tv_sec = 10;\n    timeout.tv_usec = 0;\n\n    FD_ZERO(&fd);\n\n    FD_SET(socket_fd, &fd);\n\n    /* now make sure we wait in the correct direction */\n    dir = libssh2_session_block_directions(session);\n\n    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n        readfd = &fd;\n\n    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n        writefd = &fd;\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n\n    return rc;\n}\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username = \"username\";\n    const char *password = \"password\";\n    const char *loclfile = \"sftp_write_nonblock.c\";\n    const char *sftppath = \"/tmp/sftp_write_nonblock.c\";\n    int rc;\n    FILE *local;\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n    char mem[1024 * 1000];\n    size_t nread;\n    size_t memuse;\n    time_t start;\n    long total = 0;\n    int duration;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    }\n    else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        loclfile = argv[4];\n    }\n    if(argc > 5) {\n        sftppath = argv[5];\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    local = fopen(loclfile, \"rb\");\n    if(!local) {\n        fprintf(stderr, \"Can't open local file %s\\n\", loclfile);\n        return -1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n        */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n        * and setup crypto, compression, and MAC layers\n        */\n    while((rc = libssh2_session_handshake(session, sock))\n           == LIBSSH2_ERROR_EAGAIN);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do is\n     * check the hostkey's fingerprint against our known hosts Your app may\n     * have it hard coded, may go to a file, may present it to the user,\n     * that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if(auth_pw) {\n        /* We could authenticate via password */\n        while((rc = libssh2_userauth_password(session, username, password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else {\n        /* Or by public key */\n#define PUBKEY \"/home/username/.ssh/id_rsa.pub\"\n#define PRIVKEY \"/home/username/.ssh/id_rsa\"\n        while((rc = libssh2_userauth_publickey_fromfile(session, username,\n                                                        PUBKEY, PRIVKEY,\n                                                        password)) ==\n              LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    do {\n        sftp_session = libssh2_sftp_init(session);\n\n        if(!sftp_session &&\n            (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN)) {\n            fprintf(stderr, \"Unable to init SFTP session\\n\");\n            goto shutdown;\n        }\n    } while(!sftp_session);\n\n    fprintf(stderr, \"libssh2_sftp_open()!\\n\");\n    /* Request a file via SFTP */\n    do {\n        sftp_handle =\n            libssh2_sftp_open(sftp_session, sftppath,\n                              LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|\n                              LIBSSH2_FXF_TRUNC,\n                              LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR|\n                              LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH);\n\n        if(!sftp_handle &&\n           (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN)) {\n            fprintf(stderr, \"Unable to open file with SFTP\\n\");\n            goto shutdown;\n        }\n    } while(!sftp_handle);\n\n    fprintf(stderr, \"libssh2_sftp_open() is done, now send data!\\n\");\n\n    start = time(NULL);\n\n    memuse = 0; /* it starts blank */\n    do {\n        nread = fread(&mem[memuse], 1, sizeof(mem)-memuse, local);\n        if(nread <= 0) {\n            /* end of file */\n            if(memuse > 0)\n                /* the previous sending is not finished */\n                nread = 0;\n            else\n                break;\n        }\n        memuse += nread;\n        total += nread;\n\n        /* write data in a loop until we block */\n        while((rc = libssh2_sftp_write(sftp_handle, mem, memuse)) ==\n               LIBSSH2_ERROR_EAGAIN) {\n            waitsocket(sock, session);\n        }\n        if(rc < 0)\n            break;\n\n        if(memuse - rc) {\n            /* make room for more data at the end of the buffer */\n            memmove(&mem[0], &mem[rc], memuse - rc);\n            memuse -= rc;\n        }\n        else\n            /* 'mem' was consumed fully */\n            memuse = 0;\n\n    } while(rc > 0);\n\n    duration = (int)(time(NULL)-start);\n\n    fprintf(stderr, \"%ld bytes in %d seconds makes %.1f bytes/sec\\n\",\n           total, duration, total/(double)duration);\n\n\n    fclose(local);\n    libssh2_sftp_close(sftp_handle);\n    libssh2_sftp_shutdown(sftp_session);\n\nshutdown:\n\n    while(libssh2_session_disconnect(session, \"Normal Shutdown\")\n          == LIBSSH2_ERROR_EAGAIN);\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/sftpdir.c",
    "content": "/*\n * Sample doing an SFTP directory listing.\n *\n * The sample code has default values for host name, user name, password and\n * path, but you can specify them on the command line like:\n *\n * \"sftpdir 192.168.0.1 user password /tmp/secretdir\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\n#ifdef WIN32\n#define __FILESIZE \"I64\"\n#else\n#define __FILESIZE \"llu\"\n#endif\n\nconst char *keyfile1 = \"~/.ssh/id_rsa.pub\";\nconst char *keyfile2 = \"~/.ssh/id_rsa\";\nconst char *username = \"username\";\nconst char *password = \"password\";\n\nstatic void kbd_callback(const char *name, int name_len,\n                         const char *instruction, int instruction_len,\n                         int num_prompts,\n                         const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,\n                         LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses,\n                         void **abstract)\n{\n    (void)name;\n    (void)name_len;\n    (void)instruction;\n    (void)instruction_len;\n    if(num_prompts == 1) {\n        responses[0].text = strdup(password);\n        responses[0].length = strlen(password);\n    }\n    (void)prompts;\n    (void)abstract;\n} /* kbd_callback */\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int rc, sock, i, auth_pw = 0;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session;\n    const char *sftppath = \"/tmp/secretdir\";\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    }\n    else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        sftppath = argv[4];\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n               sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    fprintf(stderr, \"Authentication methods: %s\\n\", userauthlist);\n    if(strstr(userauthlist, \"password\") != NULL) {\n        auth_pw |= 1;\n    }\n    if(strstr(userauthlist, \"keyboard-interactive\") != NULL) {\n        auth_pw |= 2;\n    }\n    if(strstr(userauthlist, \"publickey\") != NULL) {\n        auth_pw |= 4;\n    }\n\n    /* if we got an 5. argument we set this option if supported */\n    if(argc > 5) {\n        if((auth_pw & 1) && !strcasecmp(argv[5], \"-p\")) {\n            auth_pw = 1;\n        }\n        if((auth_pw & 2) && !strcasecmp(argv[5], \"-i\")) {\n            auth_pw = 2;\n        }\n        if((auth_pw & 4) && !strcasecmp(argv[5], \"-k\")) {\n            auth_pw = 4;\n        }\n    }\n\n    if(auth_pw & 1) {\n        /* We could authenticate via password */\n        if(libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"\\tAuthentication by password failed!\\n\");\n            goto shutdown;\n        }\n        else {\n            fprintf(stderr, \"\\tAuthentication by password succeeded.\\n\");\n        }\n    }\n    else if(auth_pw & 2) {\n        /* Or via keyboard-interactive */\n        if(libssh2_userauth_keyboard_interactive(session, username,\n                                                 &kbd_callback) ) {\n            fprintf(stderr,\n                    \"\\tAuthentication by keyboard-interactive failed!\\n\");\n            goto shutdown;\n        }\n        else {\n            fprintf(stderr,\n                    \"\\tAuthentication by keyboard-interactive succeeded.\\n\");\n        }\n    }\n    else if(auth_pw & 4) {\n        /* Or by public key */\n        if(libssh2_userauth_publickey_fromfile(session, username, keyfile1,\n                                               keyfile2, password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed!\\n\");\n            goto shutdown;\n        }\n        else {\n            fprintf(stderr, \"\\tAuthentication by public key succeeded.\\n\");\n        }\n    }\n    else {\n        fprintf(stderr, \"No supported authentication methods found!\\n\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    sftp_session = libssh2_sftp_init(session);\n\n    if(!sftp_session) {\n        fprintf(stderr, \"Unable to init SFTP session\\n\");\n        goto shutdown;\n    }\n\n    /* Since we have not set non-blocking, tell libssh2 we are blocking */\n    libssh2_session_set_blocking(session, 1);\n\n    fprintf(stderr, \"libssh2_sftp_opendir()!\\n\");\n    /* Request a dir listing via SFTP */\n    sftp_handle = libssh2_sftp_opendir(sftp_session, sftppath);\n\n    if(!sftp_handle) {\n        fprintf(stderr, \"Unable to open dir with SFTP\\n\");\n        goto shutdown;\n    }\n    fprintf(stderr, \"libssh2_sftp_opendir() is done, now receive listing!\\n\");\n    do {\n        char mem[512];\n        char longentry[512];\n        LIBSSH2_SFTP_ATTRIBUTES attrs;\n\n        /* loop until we fail */\n        rc = libssh2_sftp_readdir_ex(sftp_handle, mem, sizeof(mem),\n                                     longentry, sizeof(longentry), &attrs);\n        if(rc > 0) {\n            /* rc is the length of the file name in the mem\n               buffer */\n\n            if(longentry[0] != '\\0') {\n                printf(\"%s\\n\", longentry);\n            }\n            else {\n                if(attrs.flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) {\n                    /* this should check what permissions it\n                       is and print the output accordingly */\n                    printf(\"--fix----- \");\n                }\n                else {\n                    printf(\"---------- \");\n                }\n\n                if(attrs.flags & LIBSSH2_SFTP_ATTR_UIDGID) {\n                    printf(\"%4d %4d \", (int) attrs.uid, (int) attrs.gid);\n                }\n                else {\n                    printf(\"   -    - \");\n                }\n\n                if(attrs.flags & LIBSSH2_SFTP_ATTR_SIZE) {\n                    printf(\"%8\" __FILESIZE \" \", attrs.filesize);\n                }\n\n                printf(\"%s\\n\", mem);\n            }\n        }\n        else\n            break;\n\n    } while(1);\n\n    libssh2_sftp_closedir(sftp_handle);\n    libssh2_sftp_shutdown(sftp_session);\n\n shutdown:\n\n    libssh2_session_disconnect(session, \"Normal Shutdown\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/sftpdir_nonblock.c",
    "content": "/*\n * Sample doing an SFTP directory listing.\n *\n * The sample code has default values for host name, user name, password and\n * path, but you can specify them on the command line like:\n *\n * \"sftpdir 192.168.0.1 user password /tmp/secretdir\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\n#ifdef WIN32\n#define __FILESIZE \"I64\"\n#else\n#define __FILESIZE \"llu\"\n#endif\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 1;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    const char *username = \"username\";\n    const char *password = \"password\";\n    const char *sftppath = \"/tmp/secretdir\";\n    const char *pubkey = \"/home/username/.ssh/id_rsa.pub\";\n    const char *privkey = \"/home/username/.ssh/id_rsa\";\n    int rc;\n    LIBSSH2_SFTP *sftp_session;\n    LIBSSH2_SFTP_HANDLE *sftp_handle;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    }\n    else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        sftppath = argv[4];\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /*\n     * The application code is responsible for creating the socket\n     * and establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n               sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance\n     */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* Since we have set non-blocking, tell libssh2 we are non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    while((rc = libssh2_session_handshake(session, sock)) ==\n          LIBSSH2_ERROR_EAGAIN);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if(auth_pw) {\n        /* We could authenticate via password */\n        while((rc = libssh2_userauth_password(session, username, password)) ==\n              LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else {\n        /* Or by public key */\n        while((rc = libssh2_userauth_publickey_fromfile(session, username,\n                                                        pubkey, privkey,\n                                                        password)) ==\n              LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n    fprintf(stderr, \"libssh2_sftp_init()!\\n\");\n    do {\n        sftp_session = libssh2_sftp_init(session);\n\n        if((!sftp_session) && (libssh2_session_last_errno(session) !=\n                               LIBSSH2_ERROR_EAGAIN)) {\n            fprintf(stderr, \"Unable to init SFTP session\\n\");\n            goto shutdown;\n        }\n    } while(!sftp_session);\n\n    fprintf(stderr, \"libssh2_sftp_opendir()!\\n\");\n    /* Request a dir listing via SFTP */\n    do {\n        sftp_handle = libssh2_sftp_opendir(sftp_session, sftppath);\n\n        if((!sftp_handle) && (libssh2_session_last_errno(session) !=\n                              LIBSSH2_ERROR_EAGAIN)) {\n            fprintf(stderr, \"Unable to open dir with SFTP\\n\");\n            goto shutdown;\n        }\n    } while(!sftp_handle);\n\n    fprintf(stderr, \"libssh2_sftp_opendir() is done, now receive listing!\\n\");\n    do {\n        char mem[512];\n        LIBSSH2_SFTP_ATTRIBUTES attrs;\n\n        /* loop until we fail */\n        while((rc = libssh2_sftp_readdir(sftp_handle, mem, sizeof(mem),\n                                         &attrs)) == LIBSSH2_ERROR_EAGAIN) {\n            ;\n        }\n        if(rc > 0) {\n            /* rc is the length of the file name in the mem\n               buffer */\n\n            if(attrs.flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) {\n                /* this should check what permissions it\n                   is and print the output accordingly */\n                printf(\"--fix----- \");\n            }\n            else {\n                printf(\"---------- \");\n            }\n\n            if(attrs.flags & LIBSSH2_SFTP_ATTR_UIDGID) {\n                printf(\"%4d %4d \", (int) attrs.uid, (int) attrs.gid);\n            }\n            else {\n                printf(\"   -    - \");\n            }\n\n            if(attrs.flags & LIBSSH2_SFTP_ATTR_SIZE) {\n                printf(\"%8\" __FILESIZE \" \", attrs.filesize);\n            }\n\n            printf(\"%s\\n\", mem);\n        }\n        else if(rc == LIBSSH2_ERROR_EAGAIN) {\n            /* blocking */\n            fprintf(stderr, \"Blocking\\n\");\n        }\n        else {\n            break;\n        }\n\n    } while(1);\n\n    libssh2_sftp_closedir(sftp_handle);\n    libssh2_sftp_shutdown(sftp_session);\n\n  shutdown:\n\n    libssh2_session_disconnect(session, \"Normal Shutdown\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/ssh2.c",
    "content": "/*\n * Sample showing how to do SSH2 connect.\n *\n * The sample code has default values for host name, user name, password\n * and path to copy, but you can specify them on the command line like:\n *\n * \"ssh2 host user password [-p|-i|-k]\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINDOWS_H\n# include <windows.h>\n#endif\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n# ifdef HAVE_ARPA_INET_H\n#include <arpa/inet.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\n\nconst char *keyfile1 = \"~/.ssh/id_rsa.pub\";\nconst char *keyfile2 = \"~/.ssh/id_rsa\";\nconst char *username = \"username\";\nconst char *password = \"password\";\n\n\nstatic void kbd_callback(const char *name, int name_len,\n                         const char *instruction, int instruction_len,\n                         int num_prompts,\n                         const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,\n                         LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses,\n                         void **abstract)\n{\n    (void)name;\n    (void)name_len;\n    (void)instruction;\n    (void)instruction_len;\n    if(num_prompts == 1) {\n        responses[0].text = strdup(password);\n        responses[0].length = strlen(password);\n    }\n    (void)prompts;\n    (void)abstract;\n} /* kbd_callback */\n\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int rc, sock, i, auth_pw = 0;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    }\n    else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Ultra basic \"connect to port 22 on localhost\".  Your code is\n     * responsible for creating the socket establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance and start it up. This will trade welcome\n     * banners, exchange keys, and setup crypto, compression, and MAC layers\n     */\n    session = libssh2_session_init();\n    if(libssh2_session_handshake(session, sock)) {\n        fprintf(stderr, \"Failure establishing SSH session\\n\");\n        return -1;\n    }\n\n    /* At this point we havn't authenticated. The first thing to do is check\n     * the hostkey's fingerprint against our known hosts Your app may have it\n     * hard coded, may go to a file, may present it to the user, that's your\n     * call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    fprintf(stderr, \"Authentication methods: %s\\n\", userauthlist);\n    if(strstr(userauthlist, \"password\") != NULL) {\n        auth_pw |= 1;\n    }\n    if(strstr(userauthlist, \"keyboard-interactive\") != NULL) {\n        auth_pw |= 2;\n    }\n    if(strstr(userauthlist, \"publickey\") != NULL) {\n        auth_pw |= 4;\n    }\n\n    /* if we got an 4. argument we set this option if supported */\n    if(argc > 4) {\n        if((auth_pw & 1) && !strcasecmp(argv[4], \"-p\")) {\n            auth_pw = 1;\n        }\n        if((auth_pw & 2) && !strcasecmp(argv[4], \"-i\")) {\n            auth_pw = 2;\n        }\n        if((auth_pw & 4) && !strcasecmp(argv[4], \"-k\")) {\n            auth_pw = 4;\n        }\n    }\n\n    if(auth_pw & 1) {\n        /* We could authenticate via password */\n        if(libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"\\tAuthentication by password failed!\\n\");\n            goto shutdown;\n        }\n        else {\n            fprintf(stderr, \"\\tAuthentication by password succeeded.\\n\");\n        }\n    }\n    else if(auth_pw & 2) {\n        /* Or via keyboard-interactive */\n        if(libssh2_userauth_keyboard_interactive(session, username,\n                                                 &kbd_callback) ) {\n            fprintf(stderr,\n                    \"\\tAuthentication by keyboard-interactive failed!\\n\");\n            goto shutdown;\n        }\n        else {\n            fprintf(stderr,\n                    \"\\tAuthentication by keyboard-interactive succeeded.\\n\");\n        }\n    }\n    else if(auth_pw & 4) {\n        /* Or by public key */\n        if(libssh2_userauth_publickey_fromfile(session, username, keyfile1,\n                                               keyfile2, password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed!\\n\");\n            goto shutdown;\n        }\n        else {\n            fprintf(stderr, \"\\tAuthentication by public key succeeded.\\n\");\n        }\n    }\n    else {\n        fprintf(stderr, \"No supported authentication methods found!\\n\");\n        goto shutdown;\n    }\n\n    /* Request a shell */\n    channel = libssh2_channel_open_session(session);\n    if(!channel) {\n        fprintf(stderr, \"Unable to open a session\\n\");\n        goto shutdown;\n    }\n\n    /* Some environment variables may be set,\n     * It's up to the server which ones it'll allow though\n     */\n    libssh2_channel_setenv(channel, \"FOO\", \"bar\");\n\n    /* Request a terminal with 'vanilla' terminal emulation\n     * See /etc/termcap for more options\n     */\n    if(libssh2_channel_request_pty(channel, \"vanilla\")) {\n        fprintf(stderr, \"Failed requesting pty\\n\");\n        goto skip_shell;\n    }\n\n    /* Open a SHELL on that pty */\n    if(libssh2_channel_shell(channel)) {\n        fprintf(stderr, \"Unable to request shell on allocated pty\\n\");\n        goto shutdown;\n    }\n\n    /* At this point the shell can be interacted with using\n     * libssh2_channel_read()\n     * libssh2_channel_read_stderr()\n     * libssh2_channel_write()\n     * libssh2_channel_write_stderr()\n     *\n     * Blocking mode may be (en|dis)abled with: libssh2_channel_set_blocking()\n     * If the server send EOF, libssh2_channel_eof() will return non-0\n     * To send EOF to the server use: libssh2_channel_send_eof()\n     * A channel can be closed with: libssh2_channel_close()\n     * A channel can be freed with: libssh2_channel_free()\n     */\n\n  skip_shell:\n    if(channel) {\n        libssh2_channel_free(channel);\n        channel = NULL;\n    }\n\n    /* Other channel types are supported via:\n     * libssh2_scp_send()\n     * libssh2_scp_recv2()\n     * libssh2_channel_direct_tcpip()\n     */\n\n  shutdown:\n\n    libssh2_session_disconnect(session,\n                               \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done!\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/ssh2_agent.c",
    "content": "/*\n * Sample showing how to do SSH2 connect using ssh-agent.\n *\n * The sample code has default values for host name, user name:\n *\n * \"ssh2_agent host user\"\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINDOWS_H\n# include <windows.h>\n#endif\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n# ifdef HAVE_ARPA_INET_H\n#include <arpa/inet.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <stdlib.h>\n\nconst char *username = \"username\";\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock = -1, i, rc;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session = NULL;\n    LIBSSH2_CHANNEL *channel;\n    LIBSSH2_AGENT *agent = NULL;\n    struct libssh2_agent_publickey *identity, *prev_identity = NULL;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1) {\n        hostaddr = inet_addr(argv[1]);\n    }\n    else {\n        hostaddr = htonl(0x7F000001);\n    }\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Ultra basic \"connect to port 22 on localhost\".  Your code is\n     * responsible for creating the socket establishing the connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n    if(sock == -1) {\n        fprintf(stderr, \"failed to create socket!\\n\");\n        rc = 1;\n        goto shutdown;\n    }\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        goto shutdown;\n    }\n\n    /* Create a session instance and start it up. This will trade welcome\n     * banners, exchange keys, and setup crypto, compression, and MAC layers\n     */\n    session = libssh2_session_init();\n    if(libssh2_session_handshake(session, sock)) {\n        fprintf(stderr, \"Failure establishing SSH session\\n\");\n        return 1;\n    }\n\n    /* At this point we havn't authenticated. The first thing to do is check\n     * the hostkey's fingerprint against our known hosts Your app may have it\n     * hard coded, may go to a file, may present it to the user, that's your\n     * call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    fprintf(stderr, \"Authentication methods: %s\\n\", userauthlist);\n    if(strstr(userauthlist, \"publickey\") == NULL) {\n        fprintf(stderr, \"\\\"publickey\\\" authentication is not supported\\n\");\n        goto shutdown;\n    }\n\n    /* Connect to the ssh-agent */\n    agent = libssh2_agent_init(session);\n    if(!agent) {\n        fprintf(stderr, \"Failure initializing ssh-agent support\\n\");\n        rc = 1;\n        goto shutdown;\n    }\n    if(libssh2_agent_connect(agent)) {\n        fprintf(stderr, \"Failure connecting to ssh-agent\\n\");\n        rc = 1;\n        goto shutdown;\n    }\n    if(libssh2_agent_list_identities(agent)) {\n        fprintf(stderr, \"Failure requesting identities to ssh-agent\\n\");\n        rc = 1;\n        goto shutdown;\n    }\n    while(1) {\n        rc = libssh2_agent_get_identity(agent, &identity, prev_identity);\n        if(rc == 1)\n            break;\n        if(rc < 0) {\n            fprintf(stderr,\n                    \"Failure obtaining identity from ssh-agent support\\n\");\n            rc = 1;\n            goto shutdown;\n        }\n        if(libssh2_agent_userauth(agent, username, identity)) {\n            fprintf(stderr, \"\\tAuthentication with username %s and \"\n                   \"public key %s failed!\\n\",\n                   username, identity->comment);\n        }\n        else {\n            fprintf(stderr, \"\\tAuthentication with username %s and \"\n                   \"public key %s succeeded!\\n\",\n                   username, identity->comment);\n            break;\n        }\n        prev_identity = identity;\n    }\n    if(rc) {\n        fprintf(stderr, \"Couldn't continue authentication\\n\");\n        goto shutdown;\n    }\n\n    /* We're authenticated now. */\n\n    /* Request a shell */\n    channel = libssh2_channel_open_session(session);\n    if(!channel) {\n        fprintf(stderr, \"Unable to open a session\\n\");\n        goto shutdown;\n    }\n\n    /* Some environment variables may be set,\n     * It's up to the server which ones it'll allow though\n     */\n    libssh2_channel_setenv(channel, \"FOO\", \"bar\");\n\n    /* Request a terminal with 'vanilla' terminal emulation\n     * See /etc/termcap for more options\n     */\n    if(libssh2_channel_request_pty(channel, \"vanilla\")) {\n        fprintf(stderr, \"Failed requesting pty\\n\");\n        goto skip_shell;\n    }\n\n    /* Open a SHELL on that pty */\n    if(libssh2_channel_shell(channel)) {\n        fprintf(stderr, \"Unable to request shell on allocated pty\\n\");\n        goto shutdown;\n    }\n\n    /* At this point the shell can be interacted with using\n     * libssh2_channel_read()\n     * libssh2_channel_read_stderr()\n     * libssh2_channel_write()\n     * libssh2_channel_write_stderr()\n     *\n     * Blocking mode may be (en|dis)abled with: libssh2_channel_set_blocking()\n     * If the server send EOF, libssh2_channel_eof() will return non-0\n     * To send EOF to the server use: libssh2_channel_send_eof()\n     * A channel can be closed with: libssh2_channel_close()\n     * A channel can be freed with: libssh2_channel_free()\n     */\n\n  skip_shell:\n    if(channel) {\n        libssh2_channel_free(channel);\n        channel = NULL;\n    }\n\n    /* Other channel types are supported via:\n     * libssh2_scp_send()\n     * libssh2_scp_recv2()\n     * libssh2_channel_direct_tcpip()\n     */\n\n  shutdown:\n\n    if(agent) {\n        libssh2_agent_disconnect(agent);\n        libssh2_agent_free(agent);\n    }\n\n    if(session) {\n        libssh2_session_disconnect(session,\n                                   \"Normal Shutdown, Thank you for playing\");\n        libssh2_session_free(session);\n    }\n\n    if(sock != -1) {\n#ifdef WIN32\n        closesocket(sock);\n#else\n        close(sock);\n#endif\n    }\n\n    fprintf(stderr, \"all done!\\n\");\n\n    libssh2_exit();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/ssh2_echo.c",
    "content": "/*\n * Run it like this:\n *\n * $ ./ssh2_echo 127.0.0.1 user password\n *\n * The code sends a 'cat' command, and then writes a lot of data to it only to\n * check that reading the returned data sums up to the same amount.\n *\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif\n#include <sys/types.h>\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\nstatic int waitsocket(int socket_fd, LIBSSH2_SESSION *session)\n{\n    struct timeval timeout;\n    int rc;\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n    int dir;\n\n    timeout.tv_sec = 10;\n    timeout.tv_usec = 0;\n\n    FD_ZERO(&fd);\n\n    FD_SET(socket_fd, &fd);\n\n    /* now make sure we wait in the correct direction */\n    dir = libssh2_session_block_directions(session);\n\n    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n        readfd = &fd;\n\n    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n        writefd = &fd;\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n\n    return rc;\n}\n\n#define BUFSIZE 32000\n\nint main(int argc, char *argv[])\n{\n    const char *hostname = \"127.0.0.1\";\n    const char *commandline = \"cat\";\n    const char *username    = \"user\";\n    const char *password    = \"password\";\n    unsigned long hostaddr;\n    int sock;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel;\n    int rc;\n    int exitcode = 0;\n    char *exitsignal = (char *)\"none\";\n    size_t len;\n    LIBSSH2_KNOWNHOSTS *nh;\n    int type;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1)\n        /* must be ip address only */\n        hostname = argv[1];\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    hostaddr = inet_addr(hostname);\n\n    /* Ultra basic \"connect to port 22 on localhost\"\n     * Your code is responsible for creating the socket establishing the\n     * connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* tell libssh2 we want it all done non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    while((rc = libssh2_session_handshake(session, sock)) ==\n           LIBSSH2_ERROR_EAGAIN);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    nh = libssh2_knownhost_init(session);\n    if(!nh) {\n        /* eeek, do cleanup here */\n        return 2;\n    }\n\n    /* read all hosts from here */\n    libssh2_knownhost_readfile(nh, \"known_hosts\",\n                               LIBSSH2_KNOWNHOST_FILE_OPENSSH);\n\n    /* store all known hosts to here */\n    libssh2_knownhost_writefile(nh, \"dumpfile\",\n                                LIBSSH2_KNOWNHOST_FILE_OPENSSH);\n\n    fingerprint = libssh2_session_hostkey(session, &len, &type);\n    if(fingerprint) {\n        struct libssh2_knownhost *host;\n        int check = libssh2_knownhost_checkp(nh, hostname, 22,\n                                             fingerprint, len,\n                                             LIBSSH2_KNOWNHOST_TYPE_PLAIN|\n                                             LIBSSH2_KNOWNHOST_KEYENC_RAW,\n                                             &host);\n\n        fprintf(stderr, \"Host check: %d, key: %s\\n\", check,\n                (check <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH)?\n                host->key:\"<none>\");\n\n        /*****\n         * At this point, we could verify that 'check' tells us the key is\n         * fine or bail out.\n         *****/\n    }\n    else {\n        /* eeek, do cleanup here */\n        return 3;\n    }\n    libssh2_knownhost_free(nh);\n\n    if(strlen(password) != 0) {\n        /* We could authenticate via password */\n        while((rc = libssh2_userauth_password(session, username, password)) ==\n              LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            exit(1);\n        }\n    }\n\n    libssh2_trace(session, LIBSSH2_TRACE_SOCKET);\n\n    /* Exec non-blocking on the remove host */\n    while((channel = libssh2_channel_open_session(session)) == NULL &&\n          libssh2_session_last_error(session, NULL, NULL, 0) ==\n          LIBSSH2_ERROR_EAGAIN) {\n        waitsocket(sock, session);\n    }\n    if(channel == NULL) {\n        fprintf(stderr, \"Error\\n\");\n        exit(1);\n    }\n    while((rc = libssh2_channel_exec(channel, commandline)) ==\n          LIBSSH2_ERROR_EAGAIN)\n        waitsocket(sock, session);\n\n    if(rc != 0) {\n        fprintf(stderr, \"exec error\\n\");\n        exit(1);\n    }\n    else {\n        LIBSSH2_POLLFD *fds = NULL;\n        int running = 1;\n        int bufsize = BUFSIZE;\n        char buffer[BUFSIZE];\n        int totsize = 1500000;\n        int totwritten = 0;\n        int totread = 0;\n        int partials = 0;\n        int rereads = 0;\n        int rewrites = 0;\n        int i;\n\n        for(i = 0; i < BUFSIZE; i++)\n            buffer[i] = 'A';\n\n        fds = malloc(sizeof (LIBSSH2_POLLFD));\n        if(!fds) {\n            fprintf(stderr, \"malloc failed\\n\");\n            exit(1);\n        }\n\n        fds[0].type = LIBSSH2_POLLFD_CHANNEL;\n        fds[0].fd.channel = channel;\n        fds[0].events = LIBSSH2_POLLFD_POLLIN | LIBSSH2_POLLFD_POLLOUT;\n\n        do {\n            int rc = (libssh2_poll(fds, 1, 10));\n            int act = 0;\n\n            if(rc < 1)\n                continue;\n\n            if(fds[0].revents & LIBSSH2_POLLFD_POLLIN) {\n                int n = libssh2_channel_read(channel, buffer, sizeof(buffer));\n                act++;\n\n                if(n == LIBSSH2_ERROR_EAGAIN) {\n                    rereads++;\n                    fprintf(stderr, \"will read again\\n\");\n                }\n                else if(n < 0) {\n                    fprintf(stderr, \"read failed\\n\");\n                    exit(1);\n                }\n                else {\n                    totread += n;\n                    fprintf(stderr, \"read %d bytes (%d in total)\\n\",\n                            n, totread);\n                }\n            }\n\n            if(fds[0].revents & LIBSSH2_POLLFD_POLLOUT) {\n                act++;\n\n                if(totwritten < totsize) {\n                    /* we have not written all data yet */\n                    int left = totsize - totwritten;\n                    int size = (left < bufsize) ? left : bufsize;\n                    int n = libssh2_channel_write_ex(channel, 0, buffer, size);\n\n                    if(n == LIBSSH2_ERROR_EAGAIN) {\n                        rewrites++;\n                        fprintf(stderr, \"will write again\\n\");\n                    }\n                    else if(n < 0) {\n                        fprintf(stderr, \"write failed\\n\");\n                        exit(1);\n                    }\n                    else {\n                        totwritten += n;\n                        fprintf(stderr, \"wrote %d bytes (%d in total)\",\n                                n, totwritten);\n                        if(left >= bufsize && n != bufsize) {\n                            partials++;\n                            fprintf(stderr, \" PARTIAL\");\n                        }\n                        fprintf(stderr, \"\\n\");\n                    }\n                }\n                else {\n                    /* all data written, send EOF */\n                    rc = libssh2_channel_send_eof(channel);\n\n                    if(rc == LIBSSH2_ERROR_EAGAIN) {\n                        fprintf(stderr, \"will send eof again\\n\");\n                    }\n                    else if(rc < 0) {\n                        fprintf(stderr, \"send eof failed\\n\");\n                        exit(1);\n                    }\n                    else {\n                        fprintf(stderr, \"sent eof\\n\");\n                        /* we're done writing, stop listening for OUT events */\n                        fds[0].events &= ~LIBSSH2_POLLFD_POLLOUT;\n                    }\n                }\n            }\n\n            if(fds[0].revents & LIBSSH2_POLLFD_CHANNEL_CLOSED) {\n                if(!act) /* don't leave loop until we have read all data */\n                    running = 0;\n            }\n        } while(running);\n\n        exitcode = 127;\n        while((rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN)\n            waitsocket(sock, session);\n\n        if(rc == 0) {\n            exitcode = libssh2_channel_get_exit_status(channel);\n            libssh2_channel_get_exit_signal(channel, &exitsignal,\n                                            NULL, NULL, NULL, NULL, NULL);\n        }\n\n        if(exitsignal)\n            fprintf(stderr, \"\\nGot signal: %s\\n\", exitsignal);\n\n        libssh2_channel_free(channel);\n        channel = NULL;\n\n        fprintf(stderr, \"\\nrereads: %d rewrites: %d totwritten %d\\n\",\n                rereads, rewrites, totwritten);\n\n        if(totwritten != totread) {\n            fprintf(stderr, \"\\n*** FAIL bytes written: %d bytes \"\n                    \"read: %d ***\\n\", totwritten, totread);\n            exit(1);\n        }\n    }\n\n    libssh2_session_disconnect(session,\n                               \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return exitcode;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/ssh2_exec.c",
    "content": "/*\n * Sample showing how to use libssh2 to execute a command remotely.\n *\n * The sample code has fixed values for host name, user name, password\n * and command to run.\n *\n * Run it like this:\n *\n * $ ./ssh2_exec 127.0.0.1 user password \"uptime\"\n *\n */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n# include <arpa/inet.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif\n#include <sys/types.h>\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n\nstatic int waitsocket(int socket_fd, LIBSSH2_SESSION *session)\n{\n    struct timeval timeout;\n    int rc;\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n    int dir;\n\n    timeout.tv_sec = 10;\n    timeout.tv_usec = 0;\n\n    FD_ZERO(&fd);\n\n    FD_SET(socket_fd, &fd);\n\n    /* now make sure we wait in the correct direction */\n    dir = libssh2_session_block_directions(session);\n\n    if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n        readfd = &fd;\n\n    if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n        writefd = &fd;\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n\n    return rc;\n}\n\nint main(int argc, char *argv[])\n{\n    const char *hostname = \"127.0.0.1\";\n    const char *commandline = \"uptime\";\n    const char *username    = \"user\";\n    const char *password    = \"password\";\n    unsigned long hostaddr;\n    int sock;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel;\n    int rc;\n    int exitcode;\n    char *exitsignal = (char *)\"none\";\n    int bytecount = 0;\n    size_t len;\n    LIBSSH2_KNOWNHOSTS *nh;\n    int type;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#endif\n\n    if(argc > 1)\n        /* must be ip address only */\n        hostname = argv[1];\n\n    if(argc > 2) {\n        username = argv[2];\n    }\n    if(argc > 3) {\n        password = argv[3];\n    }\n    if(argc > 4) {\n        commandline = argv[4];\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    hostaddr = inet_addr(hostname);\n\n    /* Ultra basic \"connect to port 22 on localhost\"\n     * Your code is responsible for creating the socket establishing the\n     * connection\n     */\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if(!session)\n        return -1;\n\n    /* tell libssh2 we want it all done non-blocking */\n    libssh2_session_set_blocking(session, 0);\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    while((rc = libssh2_session_handshake(session, sock)) ==\n           LIBSSH2_ERROR_EAGAIN);\n    if(rc) {\n        fprintf(stderr, \"Failure establishing SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    nh = libssh2_knownhost_init(session);\n    if(!nh) {\n        /* eeek, do cleanup here */\n        return 2;\n    }\n\n    /* read all hosts from here */\n    libssh2_knownhost_readfile(nh, \"known_hosts\",\n                               LIBSSH2_KNOWNHOST_FILE_OPENSSH);\n\n    /* store all known hosts to here */\n    libssh2_knownhost_writefile(nh, \"dumpfile\",\n                                LIBSSH2_KNOWNHOST_FILE_OPENSSH);\n\n    fingerprint = libssh2_session_hostkey(session, &len, &type);\n    if(fingerprint) {\n        struct libssh2_knownhost *host;\n#if LIBSSH2_VERSION_NUM >= 0x010206\n        /* introduced in 1.2.6 */\n        int check = libssh2_knownhost_checkp(nh, hostname, 22,\n                                             fingerprint, len,\n                                             LIBSSH2_KNOWNHOST_TYPE_PLAIN|\n                                             LIBSSH2_KNOWNHOST_KEYENC_RAW,\n                                             &host);\n#else\n        /* 1.2.5 or older */\n        int check = libssh2_knownhost_check(nh, hostname,\n                                            fingerprint, len,\n                                            LIBSSH2_KNOWNHOST_TYPE_PLAIN|\n                                            LIBSSH2_KNOWNHOST_KEYENC_RAW,\n                                            &host);\n#endif\n        fprintf(stderr, \"Host check: %d, key: %s\\n\", check,\n                (check <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH)?\n                host->key:\"<none>\");\n\n        /*****\n         * At this point, we could verify that 'check' tells us the key is\n         * fine or bail out.\n         *****/\n    }\n    else {\n        /* eeek, do cleanup here */\n        return 3;\n    }\n    libssh2_knownhost_free(nh);\n\n    if(strlen(password) != 0) {\n        /* We could authenticate via password */\n        while((rc = libssh2_userauth_password(session, username, password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else {\n        /* Or by public key */\n        while((rc = libssh2_userauth_publickey_fromfile(session, username,\n                                                         \"/home/user/\"\n                                                         \".ssh/id_rsa.pub\",\n                                                         \"/home/user/\"\n                                                         \".ssh/id_rsa\",\n                                                         password)) ==\n               LIBSSH2_ERROR_EAGAIN);\n        if(rc) {\n            fprintf(stderr, \"\\tAuthentication by public key failed\\n\");\n            goto shutdown;\n        }\n    }\n\n#if 0\n    libssh2_trace(session, ~0);\n#endif\n\n    /* Exec non-blocking on the remove host */\n    while((channel = libssh2_channel_open_session(session)) == NULL &&\n          libssh2_session_last_error(session, NULL, NULL, 0) ==\n          LIBSSH2_ERROR_EAGAIN) {\n        waitsocket(sock, session);\n    }\n    if(channel == NULL) {\n        fprintf(stderr, \"Error\\n\");\n        exit(1);\n    }\n    while((rc = libssh2_channel_exec(channel, commandline)) ==\n           LIBSSH2_ERROR_EAGAIN) {\n        waitsocket(sock, session);\n    }\n    if(rc != 0) {\n        fprintf(stderr, \"Error\\n\");\n        exit(1);\n    }\n    for(;;) {\n        /* loop until we block */\n        int rc;\n        do {\n            char buffer[0x4000];\n            rc = libssh2_channel_read(channel, buffer, sizeof(buffer) );\n            if(rc > 0) {\n                int i;\n                bytecount += rc;\n                fprintf(stderr, \"We read:\\n\");\n                for(i = 0; i < rc; ++i)\n                    fputc(buffer[i], stderr);\n                fprintf(stderr, \"\\n\");\n            }\n            else {\n                if(rc != LIBSSH2_ERROR_EAGAIN)\n                    /* no need to output this for the EAGAIN case */\n                    fprintf(stderr, \"libssh2_channel_read returned %d\\n\", rc);\n            }\n        }\n        while(rc > 0);\n\n        /* this is due to blocking that would occur otherwise so we loop on\n           this condition */\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            waitsocket(sock, session);\n        }\n        else\n            break;\n    }\n    exitcode = 127;\n    while((rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN)\n        waitsocket(sock, session);\n\n    if(rc == 0) {\n        exitcode = libssh2_channel_get_exit_status(channel);\n        libssh2_channel_get_exit_signal(channel, &exitsignal,\n                                        NULL, NULL, NULL, NULL, NULL);\n    }\n\n    if(exitsignal)\n        fprintf(stderr, \"\\nGot signal: %s\\n\", exitsignal);\n    else\n        fprintf(stderr, \"\\nEXIT: %d bytecount: %d\\n\", exitcode, bytecount);\n\n    libssh2_channel_free(channel);\n    channel = NULL;\n\nshutdown:\n\n    libssh2_session_disconnect(session,\n                               \"Normal Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n    fprintf(stderr, \"all done\\n\");\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/subsystem_netconf.c",
    "content": "#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef WIN32\n#include <windows.h>\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#else\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <sys/time.h>\n#endif\n\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <string.h>\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#include <sys/types.h>\n#ifdef HAVE_SYS_SELECT_H\n#include <sys/select.h>\n#endif\n\n#ifndef INADDR_NONE\n#define INADDR_NONE (in_addr_t)~0\n#endif\n\n#ifndef HAVE_SNPRINTF\n# ifdef HAVE__SNPRINTF\n# define snprintf _snprintf\n# endif\n#endif\n\nconst char *keyfile1 = \"/home/username/.ssh/id_rsa.pub\";\nconst char *keyfile2 = \"/home/username/.ssh/id_rsa\";\nconst char *username = \"username\";\nconst char *password = \"\";\n\nconst char *server_ip = \"127.0.0.1\";\n\nenum {\n    AUTH_NONE = 0,\n    AUTH_PASSWORD,\n    AUTH_PUBLICKEY\n};\n\nstatic int netconf_write(LIBSSH2_CHANNEL *channel, const char *buf, size_t len)\n{\n    int i;\n    ssize_t wr = 0;\n\n    do {\n        i = libssh2_channel_write(channel, buf, len);\n        if(i < 0) {\n            fprintf(stderr, \"libssh2_channel_write: %d\\n\", i);\n            return -1;\n        }\n        wr += i;\n    } while(i > 0 && wr < (ssize_t)len);\n\n    return 0;\n}\n\nstatic int netconf_read_until(LIBSSH2_CHANNEL *channel, const char *endtag,\n                              char *buf, size_t buflen)\n{\n    ssize_t len;\n    size_t rd = 0;\n    char *endreply = NULL, *specialsequence = NULL;\n\n    memset(buf, 0, buflen);\n\n    do {\n        len = libssh2_channel_read(channel, buf + rd, buflen - rd);\n        if(LIBSSH2_ERROR_EAGAIN == len)\n            continue;\n        else if(len < 0) {\n            fprintf(stderr, \"libssh2_channel_read: %d\\n\", (int)len);\n            return -1;\n        }\n        rd += len;\n\n        /* read more data until we see a rpc-reply closing tag followed by\n         * the special sequence ]]>]]> */\n\n        /* really, this MUST be replaced with proper XML parsing! */\n\n        endreply = strstr(buf, endtag);\n        if(endreply)\n            specialsequence = strstr(endreply, \"]]>]]>\");\n\n    } while(!specialsequence && rd < buflen);\n\n    if(!specialsequence) {\n        fprintf(stderr, \"%s: ]]>]]> not found! read buffer too small?\\n\",\n                __func__);\n        return -1;\n    }\n\n    /* discard the special sequence so that only XML is returned */\n    rd = specialsequence - buf;\n    buf[rd] = 0;\n\n    return rd;\n}\n\nint main(int argc, char *argv[])\n{\n    int rc, i, auth = AUTH_NONE;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel = NULL;\n    char buf[1048576]; /* avoid any buffer reallocation for simplicity */\n    ssize_t len;\n\n#ifdef WIN32\n    SOCKET sock = INVALID_SOCKET;\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#else\n    int sock = -1;\n#endif\n\n    if(argc > 1)\n        server_ip = argv[1];\n    if(argc > 2)\n        username = argv[2];\n    if(argc > 3)\n        password = argv[3];\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Connect to SSH server */\n    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);\n#ifdef WIN32\n    if(sock == INVALID_SOCKET) {\n        fprintf(stderr, \"failed to open socket!\\n\");\n        return -1;\n    }\n#else\n    if(sock == -1) {\n        perror(\"socket\");\n        return -1;\n    }\n#endif\n\n    sin.sin_family = AF_INET;\n    sin.sin_addr.s_addr = inet_addr(server_ip);\n    if(INADDR_NONE == sin.sin_addr.s_addr) {\n        fprintf(stderr, \"inet_addr: Invalid IP address \\\"%s\\\"\\n\", server_ip);\n        return -1;\n    }\n    sin.sin_port = htons(830);\n    if(connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"Failed to connect to %s!\\n\", inet_ntoa(sin.sin_addr));\n        return -1;\n    }\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if(!session) {\n        fprintf(stderr, \"Could not initialize SSH session!\\n\");\n        return -1;\n    }\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Error when starting up SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++)\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    fprintf(stderr, \"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    fprintf(stderr, \"Authentication methods: %s\\n\", userauthlist);\n    if(strstr(userauthlist, \"password\"))\n        auth |= AUTH_PASSWORD;\n    if(strstr(userauthlist, \"publickey\"))\n        auth |= AUTH_PUBLICKEY;\n\n    /* check for options */\n    if(argc > 4) {\n        if((auth & AUTH_PASSWORD) && !strcasecmp(argv[4], \"-p\"))\n            auth = AUTH_PASSWORD;\n        if((auth & AUTH_PUBLICKEY) && !strcasecmp(argv[4], \"-k\"))\n            auth = AUTH_PUBLICKEY;\n    }\n\n    if(auth & AUTH_PASSWORD) {\n        if(libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else if(auth & AUTH_PUBLICKEY) {\n        if(libssh2_userauth_publickey_fromfile(session, username, keyfile1,\n                                                keyfile2, password)) {\n            fprintf(stderr, \"Authentication by public key failed!\\n\");\n            goto shutdown;\n        }\n        fprintf(stderr, \"Authentication by public key succeeded.\\n\");\n    }\n    else {\n        fprintf(stderr, \"No supported authentication methods found!\\n\");\n        goto shutdown;\n    }\n\n    /* open a channel */\n    channel = libssh2_channel_open_session(session);\n    if(!channel) {\n        fprintf(stderr, \"Could not open the channel!\\n\"\n                \"(Note that this can be a problem at the server!\"\n                \" Please review the server logs.)\\n\");\n        goto shutdown;\n    }\n\n    /* execute the subsystem on our channel */\n    if(libssh2_channel_subsystem(channel, \"netconf\")) {\n        fprintf(stderr, \"Could not execute the \\\"netconf\\\" subsystem!\\n\"\n                \"(Note that this can be a problem at the server!\"\n                \" Please review the server logs.)\\n\");\n        goto shutdown;\n    }\n\n    /* NETCONF: https://tools.ietf.org/html/draft-ietf-netconf-ssh-06 */\n\n    fprintf(stderr, \"Sending NETCONF client <hello>\\n\");\n    snprintf(buf, sizeof(buf),\n      \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\"\n      \"<hello>\"\n      \"<capabilities>\"\n      \"<capability>urn:ietf:params:xml:ns:netconf:base:1.0</capability>\"\n      \"</capabilities>\"\n      \"</hello>\\n\"\n      \"]]>]]>\\n%n\", (int *)&len);\n    if(-1 == netconf_write(channel, buf, len))\n        goto shutdown;\n\n    fprintf(stderr, \"Reading NETCONF server <hello>\\n\");\n    len = netconf_read_until(channel, \"</hello>\", buf, sizeof(buf));\n    if(-1 == len)\n        goto shutdown;\n\n    fprintf(stderr, \"Got %d bytes:\\n----------------------\\n%s\",\n            (int)len, buf);\n\n    fprintf(stderr, \"Sending NETCONF <rpc>\\n\");\n    snprintf(buf, sizeof(buf),\n      \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\"\n      \"<rpc xmlns=\\\"urn:ietf:params:xml:ns:netconf:base:1.0\\\">\"\n      \"<get-interface-information><terse/></get-interface-information>\"\n      \"</rpc>\\n\"\n      \"]]>]]>\\n%n\", (int *)&len);\n    if(-1 == netconf_write(channel, buf, len))\n        goto shutdown;\n\n    fprintf(stderr, \"Reading NETCONF <rpc-reply>\\n\");\n    len = netconf_read_until(channel, \"</rpc-reply>\", buf, sizeof(buf));\n    if(-1 == len)\n        goto shutdown;\n\n    fprintf(stderr, \"Got %d bytes:\\n----------------------\\n%s\",\n            (int)len, buf);\n\nshutdown:\n    if(channel)\n        libssh2_channel_free(channel);\n    libssh2_session_disconnect(session, \"Client disconnecting normally\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/tcpip-forward.c",
    "content": "#include \"libssh2_config.h\"\n#include <libssh2.h>\n\n#ifdef WIN32\n#include <windows.h>\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#else\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <sys/time.h>\n#endif\n\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#include <sys/types.h>\n#ifdef HAVE_SYS_SELECT_H\n#include <sys/select.h>\n#endif\n\n#ifndef INADDR_NONE\n#define INADDR_NONE (in_addr_t)-1\n#endif\n\nconst char *keyfile1 = \"/home/username/.ssh/id_rsa.pub\";\nconst char *keyfile2 = \"/home/username/.ssh/id_rsa\";\nconst char *username = \"username\";\nconst char *password = \"\";\n\nconst char *server_ip = \"127.0.0.1\";\n\nconst char *remote_listenhost = \"localhost\"; /* resolved by the server */\nint remote_wantport = 2222;\nint remote_listenport;\n\nconst char *local_destip = \"127.0.0.1\";\nint local_destport = 22;\n\nenum {\n    AUTH_NONE = 0,\n    AUTH_PASSWORD,\n    AUTH_PUBLICKEY\n};\n\nint main(int argc, char *argv[])\n{\n    int rc, i, auth = AUTH_NONE;\n    struct sockaddr_in sin;\n    socklen_t sinlen = sizeof(sin);\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_LISTENER *listener = NULL;\n    LIBSSH2_CHANNEL *channel = NULL;\n    fd_set fds;\n    struct timeval tv;\n    ssize_t len, wr;\n    char buf[16384];\n\n#ifdef WIN32\n    SOCKET sock = INVALID_SOCKET, forwardsock = INVALID_SOCKET;\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return 1;\n    }\n#else\n    int sock = -1, forwardsock = -1;\n#endif\n\n    if(argc > 1)\n        server_ip = argv[1];\n    if(argc > 2)\n        username = argv[2];\n    if(argc > 3)\n        password = argv[3];\n    if(argc > 4)\n        remote_listenhost = argv[4];\n    if(argc > 5)\n        remote_wantport = atoi(argv[5]);\n    if(argc > 6)\n        local_destip = argv[6];\n    if(argc > 7)\n        local_destport = atoi(argv[7]);\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    /* Connect to SSH server */\n    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);\n#ifdef WIN32\n    if(sock == INVALID_SOCKET) {\n        fprintf(stderr, \"failed to open socket!\\n\");\n        return -1;\n    }\n#else\n    if(sock == -1) {\n        perror(\"socket\");\n        return -1;\n    }\n#endif\n\n    sin.sin_family = AF_INET;\n    sin.sin_addr.s_addr = inet_addr(server_ip);\n    if(INADDR_NONE == sin.sin_addr.s_addr) {\n        perror(\"inet_addr\");\n        return -1;\n    }\n    sin.sin_port = htons(22);\n    if(connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return -1;\n    }\n\n    /* Create a session instance */\n    session = libssh2_session_init();\n    if(!session) {\n        fprintf(stderr, \"Could not initialize SSH session!\\n\");\n        return -1;\n    }\n\n    /* ... start it up. This will trade welcome banners, exchange keys,\n     * and setup crypto, compression, and MAC layers\n     */\n    rc = libssh2_session_handshake(session, sock);\n    if(rc) {\n        fprintf(stderr, \"Error when starting up SSH session: %d\\n\", rc);\n        return -1;\n    }\n\n    /* At this point we havn't yet authenticated.  The first thing to do\n     * is check the hostkey's fingerprint against our known hosts Your app\n     * may have it hard coded, may go to a file, may present it to the\n     * user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    fprintf(stderr, \"Fingerprint: \");\n    for(i = 0; i < 20; i++)\n        fprintf(stderr, \"%02X \", (unsigned char)fingerprint[i]);\n    fprintf(stderr, \"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    fprintf(stderr, \"Authentication methods: %s\\n\", userauthlist);\n    if(strstr(userauthlist, \"password\"))\n        auth |= AUTH_PASSWORD;\n    if(strstr(userauthlist, \"publickey\"))\n        auth |= AUTH_PUBLICKEY;\n\n    /* check for options */\n    if(argc > 8) {\n        if((auth & AUTH_PASSWORD) && !strcasecmp(argv[8], \"-p\"))\n            auth = AUTH_PASSWORD;\n        if((auth & AUTH_PUBLICKEY) && !strcasecmp(argv[8], \"-k\"))\n            auth = AUTH_PUBLICKEY;\n    }\n\n    if(auth & AUTH_PASSWORD) {\n        if(libssh2_userauth_password(session, username, password)) {\n            fprintf(stderr, \"Authentication by password failed.\\n\");\n            goto shutdown;\n        }\n    }\n    else if(auth & AUTH_PUBLICKEY) {\n        if(libssh2_userauth_publickey_fromfile(session, username, keyfile1,\n                                               keyfile2, password)) {\n            fprintf(stderr, \"\\tAuthentication by public key failed!\\n\");\n            goto shutdown;\n        }\n        fprintf(stderr, \"\\tAuthentication by public key succeeded.\\n\");\n    }\n    else {\n        fprintf(stderr, \"No supported authentication methods found!\\n\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"Asking server to listen on remote %s:%d\\n\",\n        remote_listenhost, remote_wantport);\n\n    listener = libssh2_channel_forward_listen_ex(session, remote_listenhost,\n        remote_wantport, &remote_listenport, 1);\n    if(!listener) {\n        fprintf(stderr, \"Could not start the tcpip-forward listener!\\n\"\n                \"(Note that this can be a problem at the server!\"\n                \" Please review the server logs.)\\n\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"Server is listening on %s:%d\\n\", remote_listenhost,\n        remote_listenport);\n\n    fprintf(stderr, \"Waiting for remote connection\\n\");\n    channel = libssh2_channel_forward_accept(listener);\n    if(!channel) {\n        fprintf(stderr, \"Could not accept connection!\\n\"\n                \"(Note that this can be a problem at the server!\"\n                \" Please review the server logs.)\\n\");\n        goto shutdown;\n    }\n\n    fprintf(stderr,\n        \"Accepted remote connection. Connecting to local server %s:%d\\n\",\n        local_destip, local_destport);\n    forwardsock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);\n#ifdef WIN32\n    if(forwardsock == INVALID_SOCKET) {\n        fprintf(stderr, \"failed to open forward socket!\\n\");\n        goto shutdown;\n    }\n#else\n    if(forwardsock == -1) {\n        perror(\"socket\");\n        goto shutdown;\n    }\n#endif\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(local_destport);\n    sin.sin_addr.s_addr = inet_addr(local_destip);\n    if(INADDR_NONE == sin.sin_addr.s_addr) {\n        perror(\"inet_addr\");\n        goto shutdown;\n    }\n    if(-1 == connect(forwardsock, (struct sockaddr *)&sin, sinlen)) {\n        perror(\"connect\");\n        goto shutdown;\n    }\n\n    fprintf(stderr, \"Forwarding connection from remote %s:%d to local %s:%d\\n\",\n        remote_listenhost, remote_listenport, local_destip, local_destport);\n\n    /* Must use non-blocking IO hereafter due to the current libssh2 API */\n    libssh2_session_set_blocking(session, 0);\n\n    while(1) {\n        FD_ZERO(&fds);\n        FD_SET(forwardsock, &fds);\n        tv.tv_sec = 0;\n        tv.tv_usec = 100000;\n        rc = select(forwardsock + 1, &fds, NULL, NULL, &tv);\n        if(-1 == rc) {\n            perror(\"select\");\n            goto shutdown;\n        }\n        if(rc && FD_ISSET(forwardsock, &fds)) {\n            len = recv(forwardsock, buf, sizeof(buf), 0);\n            if(len < 0) {\n                perror(\"read\");\n                goto shutdown;\n            }\n            else if(0 == len) {\n                fprintf(stderr, \"The local server at %s:%d disconnected!\\n\",\n                    local_destip, local_destport);\n                goto shutdown;\n            }\n            wr = 0;\n            do {\n                i = libssh2_channel_write(channel, buf, len);\n                if(i < 0) {\n                    fprintf(stderr, \"libssh2_channel_write: %d\\n\", i);\n                    goto shutdown;\n                }\n                wr += i;\n            } while(i > 0 && wr < len);\n        }\n        while(1) {\n            len = libssh2_channel_read(channel, buf, sizeof(buf));\n            if(LIBSSH2_ERROR_EAGAIN == len)\n                break;\n            else if(len < 0) {\n                fprintf(stderr, \"libssh2_channel_read: %d\", (int)len);\n                goto shutdown;\n            }\n            wr = 0;\n            while(wr < len) {\n                i = send(forwardsock, buf + wr, len - wr, 0);\n                if(i <= 0) {\n                    perror(\"write\");\n                    goto shutdown;\n                }\n                wr += i;\n            }\n            if(libssh2_channel_eof(channel)) {\n                fprintf(stderr, \"The remote client at %s:%d disconnected!\\n\",\n                    remote_listenhost, remote_listenport);\n                goto shutdown;\n            }\n        }\n    }\n\nshutdown:\n#ifdef WIN32\n    closesocket(forwardsock);\n#else\n    close(forwardsock);\n#endif\n    if(channel)\n        libssh2_channel_free(channel);\n    if(listener)\n        libssh2_channel_forward_cancel(listener);\n    libssh2_session_disconnect(session, \"Client disconnecting normally\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    closesocket(sock);\n#else\n    close(sock);\n#endif\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/example/x11.c",
    "content": "/*\n *\n * Sample showing how to makes SSH2 with X11 Forwarding works.\n *\n * Usage :\n * \"ssh2 host user password [DEBUG]\"\n */\n\n#include <string.h>\n#include <sys/ioctl.h>\n#include <netinet/in.h>\n#include <sys/socket.h>\n#include <sys/select.h>\n#include <arpa/inet.h>\n#include <unistd.h>\n#include <sys/types.h>\n#include <sys/un.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <stdlib.h>\n#include <termios.h>\n\n#include <libssh2.h>\n\n#define _PATH_UNIX_X \"/tmp/.X11-unix/X%d\"\n\n/*\n * Chained list that contains channels and associated X11 socket for each X11\n * connections\n */\nstruct chan_X11_list {\n    LIBSSH2_CHANNEL  *chan;\n    int               sock;\n    struct chan_X11_list *next;\n};\n\nstruct chan_X11_list * gp_x11_chan = NULL;\nstruct termios         _saved_tio;\n\n/*\n * Utility function to remove a Node of the chained list\n */\nstatic void remove_node(struct chan_X11_list *elem)\n{\n    struct chan_X11_list *current_node = NULL;\n\n    current_node = gp_x11_chan;\n\n    if(gp_x11_chan == elem) {\n        gp_x11_chan = gp_x11_chan->next;\n        free(current_node);\n        return;\n    }\n\n    while(current_node->next != NULL) {\n        if(current_node->next == elem) {\n            current_node->next = current_node->next->next;\n            current_node = current_node->next;\n            free(current_node);\n            break;\n        }\n    }\n}\n\n\nstatic void session_shutdown(LIBSSH2_SESSION *session)\n{\n    libssh2_session_disconnect(session,\n                                \"Session Shutdown, Thank you for playing\");\n    libssh2_session_free(session);\n}\n\nstatic int _raw_mode(void)\n{\n    int rc;\n    struct termios tio;\n\n    rc = tcgetattr(fileno(stdin), &tio);\n    if(rc != -1) {\n        _saved_tio = tio;\n        /* do the equivalent of cfmakeraw() manually, to build on Solaris */\n        tio.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);\n        tio.c_oflag &= ~OPOST;\n        tio.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);\n        tio.c_cflag &= ~(CSIZE|PARENB);\n        tio.c_cflag |= CS8;\n        rc = tcsetattr(fileno(stdin), TCSADRAIN, &tio);\n    }\n    return rc;\n}\n\nstatic int _normal_mode(void)\n{\n    int rc;\n    rc = tcsetattr(fileno(stdin), TCSADRAIN, &_saved_tio);\n    return rc;\n}\n\n/*\n * CallBack to initialize the forwarding.\n * Save the channel to loop on it, save the X11 forwarded socket to send\n * and receive info from our X server.\n */\nstatic void x11_callback(LIBSSH2_SESSION *session, LIBSSH2_CHANNEL *channel,\n                         char *shost, int sport, void **abstract)\n{\n    const char *display = NULL;\n    char *ptr          = NULL;\n    char *temp_buff    = NULL;\n    int   display_port = 0;\n    int   sock         = 0;\n    int   rc           = 0;\n    struct sockaddr_un addr;\n    struct chan_X11_list *new;\n    struct chan_X11_list *chan_iter;\n    (void)session;\n    (void)shost;\n    (void)sport;\n    (void)abstract;\n    /*\n     * Connect to the display\n     * Inspired by x11_connect_display in openssh\n     */\n    display = getenv(\"DISPLAY\");\n    if(display != NULL) {\n        if(strncmp(display, \"unix:\", 5) == 0 ||\n            display[0] == ':') {\n            /* Connect to the local unix domain */\n            ptr = strrchr(display, ':');\n            temp_buff = (char *) calloc(strlen(ptr + 1), sizeof(char));\n            if(!temp_buff) {\n                perror(\"calloc\");\n                return;\n            }\n            memcpy(temp_buff, ptr + 1, strlen(ptr + 1));\n            display_port = atoi(temp_buff);\n            free(temp_buff);\n\n            sock = socket(AF_UNIX, SOCK_STREAM, 0);\n            if(sock < 0)\n                return;\n            memset(&addr, 0, sizeof(addr));\n            addr.sun_family = AF_UNIX;\n            snprintf(addr.sun_path, sizeof(addr.sun_path),\n                     _PATH_UNIX_X, display_port);\n            rc = connect(sock, (struct sockaddr *) &addr, sizeof(addr));\n\n            if(rc != -1) {\n                /* Connection Successfull */\n                if(gp_x11_chan == NULL) {\n                    /* Calloc ensure that gp_X11_chan is full of 0 */\n                    gp_x11_chan = (struct chan_X11_list *)\n                        calloc(1, sizeof(struct chan_X11_list));\n                    gp_x11_chan->sock = sock;\n                    gp_x11_chan->chan = channel;\n                    gp_x11_chan->next = NULL;\n                }\n                else {\n                    chan_iter = gp_x11_chan;\n                    while(chan_iter->next != NULL)\n                        chan_iter = chan_iter->next;\n                    /* Create the new Node */\n                    new = (struct chan_X11_list *)\n                        malloc(sizeof(struct chan_X11_list));\n                    new->sock = sock;\n                    new->chan = channel;\n                    new->next = NULL;\n                    chan_iter->next = new;\n                }\n            }\n            else\n                close(sock);\n        }\n    }\n    return;\n}\n\n/*\n * Send and receive Data for the X11 channel.\n * If the connection is closed, returns -1, 0 either.\n */\nstatic int x11_send_receive(LIBSSH2_CHANNEL *channel, int sock)\n{\n    char *buf          = NULL;\n    int   bufsize      = 8192;\n    int   rc           = 0;\n    int   nfds         = 1;\n    LIBSSH2_POLLFD  *fds      = NULL;\n    fd_set set;\n    struct timeval timeval_out;\n    timeval_out.tv_sec = 0;\n    timeval_out.tv_usec = 0;\n\n\n    FD_ZERO(&set);\n    FD_SET(sock, &set);\n\n    buf = calloc(bufsize, sizeof(char));\n    if(!buf)\n        return 0;\n\n    fds = malloc(sizeof (LIBSSH2_POLLFD));\n    if(!fds) {\n        free(buf);\n        return 0;\n    }\n\n    fds[0].type = LIBSSH2_POLLFD_CHANNEL;\n    fds[0].fd.channel = channel;\n    fds[0].events = LIBSSH2_POLLFD_POLLIN;\n    fds[0].revents = LIBSSH2_POLLFD_POLLIN;\n\n    rc = libssh2_poll(fds, nfds, 0);\n    if(rc >0) {\n        rc = libssh2_channel_read(channel, buf, bufsize);\n        write(sock, buf, rc);\n    }\n\n    rc = select(sock + 1, &set, NULL, NULL, &timeval_out);\n    if(rc > 0) {\n        memset((void *)buf, 0, bufsize);\n\n        /* Data in sock*/\n        rc = read(sock, buf, bufsize);\n        if(rc > 0) {\n            libssh2_channel_write(channel, buf, rc);\n        }\n        else {\n            free(buf);\n            return -1;\n        }\n    }\n\n    free(fds);\n    free(buf);\n    if(libssh2_channel_eof(channel) == 1) {\n        return -1;\n    }\n    return 0;\n}\n\n/*\n * Main, more than inspired by ssh2.c by Bagder\n */\nint\nmain (int argc, char *argv[])\n{\n    unsigned long hostaddr = 0;\n    int sock = 0;\n    int rc = 0;\n    struct sockaddr_in sin;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel;\n    char *username = NULL;\n    char *password = NULL;\n    size_t bufsiz = 8193;\n    char *buf = NULL;\n    int set_debug_on = 0;\n    int nfds = 1;\n    LIBSSH2_POLLFD *fds = NULL;\n\n    /* Chan List struct */\n    struct chan_X11_list *current_node = NULL;\n\n    /* Struct winsize for term size */\n    struct winsize w_size;\n    struct winsize w_size_bck;\n\n    /* For select on stdin */\n    fd_set set;\n    struct timeval timeval_out;\n    timeval_out.tv_sec = 0;\n    timeval_out.tv_usec = 10;\n\n\n    if(argc > 3) {\n        hostaddr = inet_addr(argv[1]);\n        username = argv[2];\n        password = argv[3];\n    }\n    else {\n        fprintf(stderr, \"Usage: %s destination username password\",\n                argv[0]);\n        return -1;\n    }\n\n    if(argc > 4) {\n        set_debug_on = 1;\n        fprintf(stderr, \"DEBUG is ON: %d\\n\", set_debug_on);\n    }\n\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2 initialization failed (%d)\\n\", rc);\n        return 1;\n    }\n\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n    if(sock == -1) {\n        perror(\"socket\");\n        return -1;\n    }\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(22);\n    sin.sin_addr.s_addr = hostaddr;\n\n    rc = connect(sock, (struct sockaddr *) &sin,\n                 sizeof(struct sockaddr_in));\n    if(rc != 0) {\n        fprintf(stderr, \"Failed to established connection!\\n\");\n        return -1;\n    }\n    /* Open a session */\n    session = libssh2_session_init();\n    rc      = libssh2_session_handshake(session, sock);\n    if(rc != 0) {\n        fprintf(stderr, \"Failed Start the SSH session\\n\");\n        return -1;\n    }\n\n    if(set_debug_on == 1)\n        libssh2_trace(session, LIBSSH2_TRACE_CONN);\n\n    /* ignore pedantic warnings by gcc on the callback argument */\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wpedantic\"\n    /* Set X11 Callback */\n    libssh2_session_callback_set(session, LIBSSH2_CALLBACK_X11,\n                                 (void *)x11_callback);\n#pragma GCC diagnostic pop\n\n    /* Authenticate via password */\n    rc = libssh2_userauth_password(session, username, password);\n    if(rc != 0) {\n        fprintf(stderr, \"Failed to authenticate\\n\");\n        session_shutdown(session);\n        close(sock);\n        return -1;\n    }\n\n    /* Open a channel */\n    channel  = libssh2_channel_open_session(session);\n    if(channel == NULL) {\n        fprintf(stderr, \"Failed to open a new channel\\n\");\n        session_shutdown(session);\n        close(sock);\n        return -1;\n    }\n\n\n    /* Request a PTY */\n    rc = libssh2_channel_request_pty(channel, \"xterm\");\n    if(rc != 0) {\n        fprintf(stderr, \"Failed to request a pty\\n\");\n        session_shutdown(session);\n        close(sock);\n        return -1;\n    }\n\n    /* Request X11 */\n    rc = libssh2_channel_x11_req(channel, 0);\n    if(rc != 0) {\n        fprintf(stderr, \"Failed to request X11 forwarding\\n\");\n        session_shutdown(session);\n        close(sock);\n        return -1;\n    }\n\n    /* Request a shell */\n    rc = libssh2_channel_shell(channel);\n    if(rc != 0) {\n        fprintf(stderr, \"Failed to open a shell\\n\");\n        session_shutdown(session);\n        close(sock);\n        return -1;\n    }\n\n    rc = _raw_mode();\n    if(rc != 0) {\n        fprintf(stderr, \"Failed to entered in raw mode\\n\");\n        session_shutdown(session);\n        close(sock);\n        return -1;\n    }\n\n    memset(&w_size, 0, sizeof(struct winsize));\n    memset(&w_size_bck, 0, sizeof(struct winsize));\n\n    while(1) {\n\n        FD_ZERO(&set);\n        FD_SET(fileno(stdin), &set);\n\n        /* Search if a resize pty has to be send */\n        ioctl(fileno(stdin), TIOCGWINSZ, &w_size);\n        if((w_size.ws_row != w_size_bck.ws_row) ||\n           (w_size.ws_col != w_size_bck.ws_col)) {\n            w_size_bck = w_size;\n\n            libssh2_channel_request_pty_size(channel,\n                                             w_size.ws_col,\n                                             w_size.ws_row);\n        }\n\n        buf = calloc(bufsiz, sizeof(char));\n        if(buf == NULL)\n            break;\n\n        fds = malloc(sizeof (LIBSSH2_POLLFD));\n        if(fds == NULL) {\n            free(buf);\n            break;\n        }\n\n        fds[0].type = LIBSSH2_POLLFD_CHANNEL;\n        fds[0].fd.channel = channel;\n        fds[0].events = LIBSSH2_POLLFD_POLLIN;\n        fds[0].revents = LIBSSH2_POLLFD_POLLIN;\n\n        rc = libssh2_poll(fds, nfds, 0);\n        if(rc >0) {\n            libssh2_channel_read(channel, buf, sizeof(buf));\n            fprintf(stdout, \"%s\", buf);\n            fflush(stdout);\n        }\n\n        /* Looping on X clients */\n        if(gp_x11_chan != NULL) {\n            current_node = gp_x11_chan;\n        }\n        else\n            current_node = NULL;\n\n        while(current_node != NULL) {\n            struct chan_X11_list *next_node;\n            rc = x11_send_receive(current_node->chan, current_node->sock);\n            next_node = current_node->next;\n            if(rc == -1) {\n                shutdown(current_node->sock, SHUT_RDWR);\n                close(current_node->sock);\n                remove_node(current_node);\n            }\n\n            current_node = next_node;\n        }\n\n\n        rc = select(fileno(stdin) + 1, &set, NULL, NULL, &timeval_out);\n        if(rc > 0) {\n            /* Data in stdin*/\n            rc = read(fileno(stdin), buf, 1);\n            if(rc > 0)\n                libssh2_channel_write(channel, buf, sizeof(buf));\n        }\n\n        free(fds);\n        free(buf);\n\n        if(libssh2_channel_eof (channel) == 1) {\n            break;\n        }\n    }\n\n    if(channel) {\n        libssh2_channel_free(channel);\n        channel = NULL;\n    }\n    _normal_mode();\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/get_ver.awk",
    "content": "# fetch libssh2 version number from input file and write them to STDOUT\nBEGIN {\n  while ((getline < ARGV[1]) > 0) {\n    if (match ($0, /^#define LIBSSH2_COPYRIGHT \"[^\"]+\"$/)) {\n      my_copyright_str = substr($0, 28, length($0)-28);\n    }\n    else if (match ($0, /^#define LIBSSH2_VERSION[ |\\t]+\"[^\"]+\"/)) {\n      my_ver_str = substr($3, 2, length($3) - 2);\n      split(my_ver_str, v, \".\");\n      if (v[3])\n        gsub(\"[^0-9].*$\", \"\", v[3]);\n      else\n        v[3] = 0;\n      if (v[2])\n        gsub(\"[^0-9].*$\", \"\", v[2]);\n      else\n        v[2] = 0;\n      my_ver = v[1] \",\" v[2] \",\" v[3];\n    }\n  }\n  print \"LIBSSH2_VERSION = \" my_ver \"\";\n  print \"LIBSSH2_VERSION_STR = \" my_ver_str \"\";\n  print \"LIBSSH2_COPYRIGHT_STR = \" my_copyright_str \"\";\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/git2news.pl",
    "content": "#!/usr/bin/perl\n\n# git log --pretty=fuller --no-color --date=short --decorate=full\n\nmy @mname = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n             'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' );\n\nsub nicedate {\n    my ($date)=$_;\n\n    if($date =~ /(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)/) {\n        return sprintf(\"%d %s %4d\", $3, $mname[$2-1], $1);\n    }\n    return $date;\n}\n\nprint \n'   Changelog for the libssh2 project. Generated with git2news.pl\n';\n\nmy $line;\nmy $tag;\nwhile(<STDIN>) {\n    my $l = $_;\n\n    if($l =~/^commit ([[:xdigit:]]*) ?(.*)/) {\n        $co = $1;\n        my $ref = $2;\n        if ($ref =~ /refs\\/tags\\/(libssh2-|VERSION\\.)([0-9._]*)/) {\n            $tag = $2;\n        } else {\n            $tag = '';\n        }\n    }\n    elsif($l =~ /^Author: *(.*) +</) {\n        $a = $1;\n    }\n    elsif($l =~ /^Commit: *(.*) +</) {\n        $c = $1;\n    }\n    elsif($l =~ /^CommitDate: (.*)/) {\n        $date = nicedate($1);\n    }\n    elsif($l =~ /^(    )(.*)/) {\n        my $extra;\n        if ($tag) {\n            # Version entries have a special format\n            print \"\\nVersion \" . $tag.\" ($date)\\n\";\n            $oldc = \"\";\n            $tag = \"\";\n        }\n        if($a ne $c) {\n            $extra=sprintf(\"\\n- [%s brought this change]\\n\\n  \", $a);\n        }\n        else {\n            $extra=\"\\n- \";\n        }\n        if($co ne $oldco) {\n            if($c ne $oldc) {\n                print \"\\n$c ($date)$extra\";\n            }\n            else {\n                print \"$extra\";\n            }\n            $line =0;\n        }\n\n        $oldco = $co;\n        $oldc = $c;\n        $olddate = $date;\n        if($line++) {\n            print \"  \";\n        }\n        print $2.\"\\n\";\n    }\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/include/libssh2.h",
    "content": "/* Copyright (c) 2004-2009, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2009-2015 Daniel Stenberg\n * Copyright (c) 2010 Simon Josefsson <simon@josefsson.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_H\n#define LIBSSH2_H 1\n\n#define LIBSSH2_COPYRIGHT \"2004-2019 The libssh2 project and its contributors.\"\n\n/* We use underscore instead of dash when appending DEV in dev versions just\n   to make the BANNER define (used by src/session.c) be a valid SSH\n   banner. Release versions have no appended strings and may of course not\n   have dashes either. */\n#define LIBSSH2_VERSION                             \"1.9.0_DEV\"\n\n/* The numeric version number is also available \"in parts\" by using these\n   defines: */\n#define LIBSSH2_VERSION_MAJOR                       1\n#define LIBSSH2_VERSION_MINOR                       9\n#define LIBSSH2_VERSION_PATCH                       0\n\n/* This is the numeric version of the libssh2 version number, meant for easier\n   parsing and comparions by programs. The LIBSSH2_VERSION_NUM define will\n   always follow this syntax:\n\n         0xXXYYZZ\n\n   Where XX, YY and ZZ are the main version, release and patch numbers in\n   hexadecimal (using 8 bits each). All three numbers are always represented\n   using two digits.  1.2 would appear as \"0x010200\" while version 9.11.7\n   appears as \"0x090b07\".\n\n   This 6-digit (24 bits) hexadecimal number does not show pre-release number,\n   and it is always a greater number in a more recent release. It makes\n   comparisons with greater than and less than work.\n*/\n#define LIBSSH2_VERSION_NUM                         0x010900\n\n/*\n * This is the date and time when the full source package was created. The\n * timestamp is not stored in the source code repo, as the timestamp is\n * properly set in the tarballs by the maketgz script.\n *\n * The format of the date should follow this template:\n *\n * \"Mon Feb 12 11:35:33 UTC 2007\"\n */\n#define LIBSSH2_TIMESTAMP \"DEV\"\n\n#ifndef RC_INVOKED\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#ifdef _WIN32\n# include <basetsd.h>\n# include <winsock2.h>\n#endif\n\n#include <stddef.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n\n/* Allow alternate API prefix from CFLAGS or calling app */\n#ifndef LIBSSH2_API\n# ifdef LIBSSH2_WIN32\n#  ifdef _WINDLL\n#   ifdef LIBSSH2_LIBRARY\n#    define LIBSSH2_API __declspec(dllexport)\n#   else\n#    define LIBSSH2_API __declspec(dllimport)\n#   endif /* LIBSSH2_LIBRARY */\n#  else\n#   define LIBSSH2_API\n#  endif\n# else /* !LIBSSH2_WIN32 */\n#  define LIBSSH2_API\n# endif /* LIBSSH2_WIN32 */\n#endif /* LIBSSH2_API */\n\n#ifdef HAVE_SYS_UIO_H\n# include <sys/uio.h>\n#endif\n\n#if (defined(NETWARE) && !defined(__NOVELL_LIBC__))\n# include <sys/bsdskt.h>\ntypedef unsigned char uint8_t;\ntypedef unsigned short int uint16_t;\ntypedef unsigned int uint32_t;\ntypedef int int32_t;\ntypedef unsigned long long uint64_t;\ntypedef long long int64_t;\n#endif\n\n#ifdef _MSC_VER\ntypedef unsigned char uint8_t;\ntypedef unsigned short int uint16_t;\ntypedef unsigned int uint32_t;\ntypedef __int32 int32_t;\ntypedef __int64 int64_t;\ntypedef unsigned __int64 uint64_t;\ntypedef unsigned __int64 libssh2_uint64_t;\ntypedef __int64 libssh2_int64_t;\n#if (!defined(HAVE_SSIZE_T) && !defined(ssize_t))\ntypedef SSIZE_T ssize_t;\n#define HAVE_SSIZE_T\n#endif\n#else\n#include <stdint.h>\ntypedef unsigned long long libssh2_uint64_t;\ntypedef long long libssh2_int64_t;\n#endif\n\n#ifdef WIN32\ntypedef SOCKET libssh2_socket_t;\n#define LIBSSH2_INVALID_SOCKET INVALID_SOCKET\n#else /* !WIN32 */\ntypedef int libssh2_socket_t;\n#define LIBSSH2_INVALID_SOCKET -1\n#endif /* WIN32 */\n\n/*\n * Determine whether there is small or large file support on windows.\n */\n\n#if defined(_MSC_VER) && !defined(_WIN32_WCE)\n#  if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64)\n#    define LIBSSH2_USE_WIN32_LARGE_FILES\n#  else\n#    define LIBSSH2_USE_WIN32_SMALL_FILES\n#  endif\n#endif\n\n#if defined(__MINGW32__) && !defined(LIBSSH2_USE_WIN32_LARGE_FILES)\n#  define LIBSSH2_USE_WIN32_LARGE_FILES\n#endif\n\n#if defined(__WATCOMC__) && !defined(LIBSSH2_USE_WIN32_LARGE_FILES)\n#  define LIBSSH2_USE_WIN32_LARGE_FILES\n#endif\n\n#if defined(__POCC__)\n#  undef LIBSSH2_USE_WIN32_LARGE_FILES\n#endif\n\n#if defined(_WIN32) && !defined(LIBSSH2_USE_WIN32_LARGE_FILES) && \\\n    !defined(LIBSSH2_USE_WIN32_SMALL_FILES)\n#  define LIBSSH2_USE_WIN32_SMALL_FILES\n#endif\n\n/*\n * Large file (>2Gb) support using WIN32 functions.\n */\n\n#ifdef LIBSSH2_USE_WIN32_LARGE_FILES\n#  include <io.h>\n#  include <sys/types.h>\n#  include <sys/stat.h>\n#  define LIBSSH2_STRUCT_STAT_SIZE_FORMAT    \"%I64d\"\ntypedef struct _stati64 libssh2_struct_stat;\ntypedef __int64 libssh2_struct_stat_size;\n#endif\n\n/*\n * Small file (<2Gb) support using WIN32 functions.\n */\n\n#ifdef LIBSSH2_USE_WIN32_SMALL_FILES\n#  include <sys/types.h>\n#  include <sys/stat.h>\n#  ifndef _WIN32_WCE\n#    define LIBSSH2_STRUCT_STAT_SIZE_FORMAT    \"%d\"\ntypedef struct _stat libssh2_struct_stat;\ntypedef off_t libssh2_struct_stat_size;\n#  endif\n#endif\n\n#ifndef LIBSSH2_STRUCT_STAT_SIZE_FORMAT\n#  ifdef __VMS\n/* We have to roll our own format here because %z is a C99-ism we don't\n   have. */\n#    if __USE_OFF64_T || __USING_STD_STAT\n#      define LIBSSH2_STRUCT_STAT_SIZE_FORMAT      \"%Ld\"\n#    else\n#      define LIBSSH2_STRUCT_STAT_SIZE_FORMAT      \"%d\"\n#    endif\n#  else\n#    define LIBSSH2_STRUCT_STAT_SIZE_FORMAT      \"%zd\"\n#  endif\ntypedef struct stat libssh2_struct_stat;\ntypedef off_t libssh2_struct_stat_size;\n#endif\n\n/* Part of every banner, user specified or not */\n#define LIBSSH2_SSH_BANNER                  \"SSH-2.0-libssh2_\" LIBSSH2_VERSION\n\n#define LIBSSH2_SSH_DEFAULT_BANNER            LIBSSH2_SSH_BANNER\n#define LIBSSH2_SSH_DEFAULT_BANNER_WITH_CRLF  LIBSSH2_SSH_DEFAULT_BANNER \"\\r\\n\"\n\n/* Default generate and safe prime sizes for\n   diffie-hellman-group-exchange-sha1 */\n#define LIBSSH2_DH_GEX_MINGROUP     1024\n#define LIBSSH2_DH_GEX_OPTGROUP     1536\n#define LIBSSH2_DH_GEX_MAXGROUP     2048\n\n/* Defaults for pty requests */\n#define LIBSSH2_TERM_WIDTH      80\n#define LIBSSH2_TERM_HEIGHT     24\n#define LIBSSH2_TERM_WIDTH_PX   0\n#define LIBSSH2_TERM_HEIGHT_PX  0\n\n/* 1/4 second */\n#define LIBSSH2_SOCKET_POLL_UDELAY      250000\n/* 0.25 * 120 == 30 seconds */\n#define LIBSSH2_SOCKET_POLL_MAXLOOPS    120\n\n/* Maximum size to allow a payload to compress to, plays it safe by falling\n   short of spec limits */\n#define LIBSSH2_PACKET_MAXCOMP      32000\n\n/* Maximum size to allow a payload to deccompress to, plays it safe by\n   allowing more than spec requires */\n#define LIBSSH2_PACKET_MAXDECOMP    40000\n\n/* Maximum size for an inbound compressed payload, plays it safe by\n   overshooting spec limits */\n#define LIBSSH2_PACKET_MAXPAYLOAD   40000\n\n/* Malloc callbacks */\n#define LIBSSH2_ALLOC_FUNC(name)   void *name(size_t count, void **abstract)\n#define LIBSSH2_REALLOC_FUNC(name) void *name(void *ptr, size_t count, \\\n                                              void **abstract)\n#define LIBSSH2_FREE_FUNC(name)    void name(void *ptr, void **abstract)\n\ntypedef struct _LIBSSH2_USERAUTH_KBDINT_PROMPT\n{\n    char *text;\n    unsigned int length;\n    unsigned char echo;\n} LIBSSH2_USERAUTH_KBDINT_PROMPT;\n\ntypedef struct _LIBSSH2_USERAUTH_KBDINT_RESPONSE\n{\n    char *text;\n    unsigned int length;\n} LIBSSH2_USERAUTH_KBDINT_RESPONSE;\n\n/* 'publickey' authentication callback */\n#define LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC(name) \\\n  int name(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, \\\n           const unsigned char *data, size_t data_len, void **abstract)\n\n/* 'keyboard-interactive' authentication callback */\n#define LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC(name_) \\\n void name_(const char *name, int name_len, const char *instruction, \\\n            int instruction_len, int num_prompts, \\\n            const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,              \\\n            LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, void **abstract)\n\n/* Callbacks for special SSH packets */\n#define LIBSSH2_IGNORE_FUNC(name) \\\n void name(LIBSSH2_SESSION *session, const char *message, int message_len, \\\n           void **abstract)\n\n#define LIBSSH2_DEBUG_FUNC(name) \\\n void name(LIBSSH2_SESSION *session, int always_display, const char *message, \\\n           int message_len, const char *language, int language_len, \\\n           void **abstract)\n\n#define LIBSSH2_DISCONNECT_FUNC(name) \\\n void name(LIBSSH2_SESSION *session, int reason, const char *message, \\\n           int message_len, const char *language, int language_len, \\\n           void **abstract)\n\n#define LIBSSH2_PASSWD_CHANGEREQ_FUNC(name) \\\n void name(LIBSSH2_SESSION *session, char **newpw, int *newpw_len, \\\n           void **abstract)\n\n#define LIBSSH2_MACERROR_FUNC(name) \\\n int name(LIBSSH2_SESSION *session, const char *packet, int packet_len, \\\n          void **abstract)\n\n#define LIBSSH2_X11_OPEN_FUNC(name) \\\n void name(LIBSSH2_SESSION *session, LIBSSH2_CHANNEL *channel, \\\n           const char *shost, int sport, void **abstract)\n\n#define LIBSSH2_CHANNEL_CLOSE_FUNC(name) \\\n  void name(LIBSSH2_SESSION *session, void **session_abstract, \\\n            LIBSSH2_CHANNEL *channel, void **channel_abstract)\n\n/* I/O callbacks */\n#define LIBSSH2_RECV_FUNC(name)                                         \\\n    ssize_t name(libssh2_socket_t socket,                               \\\n                 void *buffer, size_t length,                           \\\n                 int flags, void **abstract)\n#define LIBSSH2_SEND_FUNC(name)                                         \\\n    ssize_t name(libssh2_socket_t socket,                               \\\n                 const void *buffer, size_t length,                     \\\n                 int flags, void **abstract)\n\n/* libssh2_session_callback_set() constants */\n#define LIBSSH2_CALLBACK_IGNORE             0\n#define LIBSSH2_CALLBACK_DEBUG              1\n#define LIBSSH2_CALLBACK_DISCONNECT         2\n#define LIBSSH2_CALLBACK_MACERROR           3\n#define LIBSSH2_CALLBACK_X11                4\n#define LIBSSH2_CALLBACK_SEND               5\n#define LIBSSH2_CALLBACK_RECV               6\n\n/* libssh2_session_method_pref() constants */\n#define LIBSSH2_METHOD_KEX          0\n#define LIBSSH2_METHOD_HOSTKEY      1\n#define LIBSSH2_METHOD_CRYPT_CS     2\n#define LIBSSH2_METHOD_CRYPT_SC     3\n#define LIBSSH2_METHOD_MAC_CS       4\n#define LIBSSH2_METHOD_MAC_SC       5\n#define LIBSSH2_METHOD_COMP_CS      6\n#define LIBSSH2_METHOD_COMP_SC      7\n#define LIBSSH2_METHOD_LANG_CS      8\n#define LIBSSH2_METHOD_LANG_SC      9\n\n/* flags */\n#define LIBSSH2_FLAG_SIGPIPE        1\n#define LIBSSH2_FLAG_COMPRESS       2\n\ntypedef struct _LIBSSH2_SESSION                     LIBSSH2_SESSION;\ntypedef struct _LIBSSH2_CHANNEL                     LIBSSH2_CHANNEL;\ntypedef struct _LIBSSH2_LISTENER                    LIBSSH2_LISTENER;\ntypedef struct _LIBSSH2_KNOWNHOSTS                  LIBSSH2_KNOWNHOSTS;\ntypedef struct _LIBSSH2_AGENT                       LIBSSH2_AGENT;\n\ntypedef struct _LIBSSH2_POLLFD {\n    unsigned char type; /* LIBSSH2_POLLFD_* below */\n\n    union {\n        libssh2_socket_t socket; /* File descriptors -- examined with\n                                    system select() call */\n        LIBSSH2_CHANNEL *channel; /* Examined by checking internal state */\n        LIBSSH2_LISTENER *listener; /* Read polls only -- are inbound\n                                       connections waiting to be accepted? */\n    } fd;\n\n    unsigned long events; /* Requested Events */\n    unsigned long revents; /* Returned Events */\n} LIBSSH2_POLLFD;\n\n/* Poll FD Descriptor Types */\n#define LIBSSH2_POLLFD_SOCKET       1\n#define LIBSSH2_POLLFD_CHANNEL      2\n#define LIBSSH2_POLLFD_LISTENER     3\n\n/* Note: Win32 Doesn't actually have a poll() implementation, so some of these\n   values are faked with select() data */\n/* Poll FD events/revents -- Match sys/poll.h where possible */\n#define LIBSSH2_POLLFD_POLLIN           0x0001 /* Data available to be read or\n                                                  connection available --\n                                                  All */\n#define LIBSSH2_POLLFD_POLLPRI          0x0002 /* Priority data available to\n                                                  be read -- Socket only */\n#define LIBSSH2_POLLFD_POLLEXT          0x0002 /* Extended data available to\n                                                  be read -- Channel only */\n#define LIBSSH2_POLLFD_POLLOUT          0x0004 /* Can may be written --\n                                                  Socket/Channel */\n/* revents only */\n#define LIBSSH2_POLLFD_POLLERR          0x0008 /* Error Condition -- Socket */\n#define LIBSSH2_POLLFD_POLLHUP          0x0010 /* HangUp/EOF -- Socket */\n#define LIBSSH2_POLLFD_SESSION_CLOSED   0x0010 /* Session Disconnect */\n#define LIBSSH2_POLLFD_POLLNVAL         0x0020 /* Invalid request -- Socket\n                                                  Only */\n#define LIBSSH2_POLLFD_POLLEX           0x0040 /* Exception Condition --\n                                                  Socket/Win32 */\n#define LIBSSH2_POLLFD_CHANNEL_CLOSED   0x0080 /* Channel Disconnect */\n#define LIBSSH2_POLLFD_LISTENER_CLOSED  0x0080 /* Listener Disconnect */\n\n#define HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION\n/* Block Direction Types */\n#define LIBSSH2_SESSION_BLOCK_INBOUND                  0x0001\n#define LIBSSH2_SESSION_BLOCK_OUTBOUND                 0x0002\n\n/* Hash Types */\n#define LIBSSH2_HOSTKEY_HASH_MD5                            1\n#define LIBSSH2_HOSTKEY_HASH_SHA1                           2\n#define LIBSSH2_HOSTKEY_HASH_SHA256                         3\n\n/* Hostkey Types */\n#define LIBSSH2_HOSTKEY_TYPE_UNKNOWN            0\n#define LIBSSH2_HOSTKEY_TYPE_RSA                1\n#define LIBSSH2_HOSTKEY_TYPE_DSS                2\n#define LIBSSH2_HOSTKEY_TYPE_ECDSA_256          3\n#define LIBSSH2_HOSTKEY_TYPE_ECDSA_384          4\n#define LIBSSH2_HOSTKEY_TYPE_ECDSA_521          5\n#define LIBSSH2_HOSTKEY_TYPE_ED25519            6\n\n/* Disconnect Codes (defined by SSH protocol) */\n#define SSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT          1\n#define SSH_DISCONNECT_PROTOCOL_ERROR                       2\n#define SSH_DISCONNECT_KEY_EXCHANGE_FAILED                  3\n#define SSH_DISCONNECT_RESERVED                             4\n#define SSH_DISCONNECT_MAC_ERROR                            5\n#define SSH_DISCONNECT_COMPRESSION_ERROR                    6\n#define SSH_DISCONNECT_SERVICE_NOT_AVAILABLE                7\n#define SSH_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED       8\n#define SSH_DISCONNECT_HOST_KEY_NOT_VERIFIABLE              9\n#define SSH_DISCONNECT_CONNECTION_LOST                      10\n#define SSH_DISCONNECT_BY_APPLICATION                       11\n#define SSH_DISCONNECT_TOO_MANY_CONNECTIONS                 12\n#define SSH_DISCONNECT_AUTH_CANCELLED_BY_USER               13\n#define SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE       14\n#define SSH_DISCONNECT_ILLEGAL_USER_NAME                    15\n\n/* Error Codes (defined by libssh2) */\n#define LIBSSH2_ERROR_NONE                      0\n\n/* The library once used -1 as a generic error return value on numerous places\n   through the code, which subsequently was converted to\n   LIBSSH2_ERROR_SOCKET_NONE uses over time. As this is a generic error code,\n   the goal is to never ever return this code but instead make sure that a\n   more accurate and descriptive error code is used. */\n#define LIBSSH2_ERROR_SOCKET_NONE               -1\n\n#define LIBSSH2_ERROR_BANNER_RECV               -2\n#define LIBSSH2_ERROR_BANNER_SEND               -3\n#define LIBSSH2_ERROR_INVALID_MAC               -4\n#define LIBSSH2_ERROR_KEX_FAILURE               -5\n#define LIBSSH2_ERROR_ALLOC                     -6\n#define LIBSSH2_ERROR_SOCKET_SEND               -7\n#define LIBSSH2_ERROR_KEY_EXCHANGE_FAILURE      -8\n#define LIBSSH2_ERROR_TIMEOUT                   -9\n#define LIBSSH2_ERROR_HOSTKEY_INIT              -10\n#define LIBSSH2_ERROR_HOSTKEY_SIGN              -11\n#define LIBSSH2_ERROR_DECRYPT                   -12\n#define LIBSSH2_ERROR_SOCKET_DISCONNECT         -13\n#define LIBSSH2_ERROR_PROTO                     -14\n#define LIBSSH2_ERROR_PASSWORD_EXPIRED          -15\n#define LIBSSH2_ERROR_FILE                      -16\n#define LIBSSH2_ERROR_METHOD_NONE               -17\n#define LIBSSH2_ERROR_AUTHENTICATION_FAILED     -18\n#define LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED    \\\n    LIBSSH2_ERROR_AUTHENTICATION_FAILED\n#define LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED      -19\n#define LIBSSH2_ERROR_CHANNEL_OUTOFORDER        -20\n#define LIBSSH2_ERROR_CHANNEL_FAILURE           -21\n#define LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED    -22\n#define LIBSSH2_ERROR_CHANNEL_UNKNOWN           -23\n#define LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED   -24\n#define LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED   -25\n#define LIBSSH2_ERROR_CHANNEL_CLOSED            -26\n#define LIBSSH2_ERROR_CHANNEL_EOF_SENT          -27\n#define LIBSSH2_ERROR_SCP_PROTOCOL              -28\n#define LIBSSH2_ERROR_ZLIB                      -29\n#define LIBSSH2_ERROR_SOCKET_TIMEOUT            -30\n#define LIBSSH2_ERROR_SFTP_PROTOCOL             -31\n#define LIBSSH2_ERROR_REQUEST_DENIED            -32\n#define LIBSSH2_ERROR_METHOD_NOT_SUPPORTED      -33\n#define LIBSSH2_ERROR_INVAL                     -34\n#define LIBSSH2_ERROR_INVALID_POLL_TYPE         -35\n#define LIBSSH2_ERROR_PUBLICKEY_PROTOCOL        -36\n#define LIBSSH2_ERROR_EAGAIN                    -37\n#define LIBSSH2_ERROR_BUFFER_TOO_SMALL          -38\n#define LIBSSH2_ERROR_BAD_USE                   -39\n#define LIBSSH2_ERROR_COMPRESS                  -40\n#define LIBSSH2_ERROR_OUT_OF_BOUNDARY           -41\n#define LIBSSH2_ERROR_AGENT_PROTOCOL            -42\n#define LIBSSH2_ERROR_SOCKET_RECV               -43\n#define LIBSSH2_ERROR_ENCRYPT                   -44\n#define LIBSSH2_ERROR_BAD_SOCKET                -45\n#define LIBSSH2_ERROR_KNOWN_HOSTS               -46\n#define LIBSSH2_ERROR_CHANNEL_WINDOW_FULL       -47\n#define LIBSSH2_ERROR_KEYFILE_AUTH_FAILED       -48\n\n/* this is a define to provide the old (<= 1.2.7) name */\n#define LIBSSH2_ERROR_BANNER_NONE LIBSSH2_ERROR_BANNER_RECV\n\n/* Global API */\n#define LIBSSH2_INIT_NO_CRYPTO        0x0001\n\n/*\n * libssh2_init()\n *\n * Initialize the libssh2 functions.  This typically initialize the\n * crypto library.  It uses a global state, and is not thread safe --\n * you must make sure this function is not called concurrently.\n *\n * Flags can be:\n * 0:                              Normal initialize\n * LIBSSH2_INIT_NO_CRYPTO:         Do not initialize the crypto library (ie.\n *                                 OPENSSL_add_cipher_algoritms() for OpenSSL\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int libssh2_init(int flags);\n\n/*\n * libssh2_exit()\n *\n * Exit the libssh2 functions and free's all memory used internal.\n */\nLIBSSH2_API void libssh2_exit(void);\n\n/*\n * libssh2_free()\n *\n * Deallocate memory allocated by earlier call to libssh2 functions.\n */\nLIBSSH2_API void libssh2_free(LIBSSH2_SESSION *session, void *ptr);\n\n/*\n * libssh2_session_supported_algs()\n *\n * Fills algs with a list of supported acryptographic algorithms. Returns a\n * non-negative number (number of supported algorithms) on success or a\n * negative number (an eror code) on failure.\n *\n * NOTE: on success, algs must be deallocated (by calling libssh2_free) when\n * not needed anymore\n */\nLIBSSH2_API int libssh2_session_supported_algs(LIBSSH2_SESSION* session,\n                                               int method_type,\n                                               const char ***algs);\n\n/* Session API */\nLIBSSH2_API LIBSSH2_SESSION *\nlibssh2_session_init_ex(LIBSSH2_ALLOC_FUNC((*my_alloc)),\n                        LIBSSH2_FREE_FUNC((*my_free)),\n                        LIBSSH2_REALLOC_FUNC((*my_realloc)), void *abstract);\n#define libssh2_session_init() libssh2_session_init_ex(NULL, NULL, NULL, NULL)\n\nLIBSSH2_API void **libssh2_session_abstract(LIBSSH2_SESSION *session);\n\nLIBSSH2_API void *libssh2_session_callback_set(LIBSSH2_SESSION *session,\n                                               int cbtype, void *callback);\nLIBSSH2_API int libssh2_session_banner_set(LIBSSH2_SESSION *session,\n                                           const char *banner);\nLIBSSH2_API int libssh2_banner_set(LIBSSH2_SESSION *session,\n                                   const char *banner);\n\nLIBSSH2_API int libssh2_session_startup(LIBSSH2_SESSION *session, int sock);\nLIBSSH2_API int libssh2_session_handshake(LIBSSH2_SESSION *session,\n                                          libssh2_socket_t sock);\nLIBSSH2_API int libssh2_session_disconnect_ex(LIBSSH2_SESSION *session,\n                                              int reason,\n                                              const char *description,\n                                              const char *lang);\n#define libssh2_session_disconnect(session, description) \\\n  libssh2_session_disconnect_ex((session), SSH_DISCONNECT_BY_APPLICATION, \\\n                                (description), \"\")\n\nLIBSSH2_API int libssh2_session_free(LIBSSH2_SESSION *session);\n\nLIBSSH2_API const char *libssh2_hostkey_hash(LIBSSH2_SESSION *session,\n                                             int hash_type);\n\nLIBSSH2_API const char *libssh2_session_hostkey(LIBSSH2_SESSION *session,\n                                                size_t *len, int *type);\n\nLIBSSH2_API int libssh2_session_method_pref(LIBSSH2_SESSION *session,\n                                            int method_type,\n                                            const char *prefs);\nLIBSSH2_API const char *libssh2_session_methods(LIBSSH2_SESSION *session,\n                                                int method_type);\nLIBSSH2_API int libssh2_session_last_error(LIBSSH2_SESSION *session,\n                                           char **errmsg,\n                                           int *errmsg_len, int want_buf);\nLIBSSH2_API int libssh2_session_last_errno(LIBSSH2_SESSION *session);\nLIBSSH2_API int libssh2_session_set_last_error(LIBSSH2_SESSION* session,\n                                               int errcode,\n                                               const char *errmsg);\nLIBSSH2_API int libssh2_session_block_directions(LIBSSH2_SESSION *session);\n\nLIBSSH2_API int libssh2_session_flag(LIBSSH2_SESSION *session, int flag,\n                                     int value);\nLIBSSH2_API const char *libssh2_session_banner_get(LIBSSH2_SESSION *session);\n\n/* Userauth API */\nLIBSSH2_API char *libssh2_userauth_list(LIBSSH2_SESSION *session,\n                                        const char *username,\n                                        unsigned int username_len);\nLIBSSH2_API int libssh2_userauth_authenticated(LIBSSH2_SESSION *session);\n\nLIBSSH2_API int\nlibssh2_userauth_password_ex(LIBSSH2_SESSION *session,\n                             const char *username,\n                             unsigned int username_len,\n                             const char *password,\n                             unsigned int password_len,\n                             LIBSSH2_PASSWD_CHANGEREQ_FUNC\n                             ((*passwd_change_cb)));\n\n#define libssh2_userauth_password(session, username, password) \\\n libssh2_userauth_password_ex((session), (username),           \\\n                              (unsigned int)strlen(username),  \\\n                              (password), (unsigned int)strlen(password), NULL)\n\nLIBSSH2_API int\nlibssh2_userauth_publickey_fromfile_ex(LIBSSH2_SESSION *session,\n                                       const char *username,\n                                       unsigned int username_len,\n                                       const char *publickey,\n                                       const char *privatekey,\n                                       const char *passphrase);\n\n#define libssh2_userauth_publickey_fromfile(session, username, publickey, \\\n                                            privatekey, passphrase)     \\\n    libssh2_userauth_publickey_fromfile_ex((session), (username),       \\\n                                           (unsigned int)strlen(username), \\\n                                           (publickey),                 \\\n                                           (privatekey), (passphrase))\n\nLIBSSH2_API int\nlibssh2_userauth_publickey(LIBSSH2_SESSION *session,\n                           const char *username,\n                           const unsigned char *pubkeydata,\n                           size_t pubkeydata_len,\n                           LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC\n                           ((*sign_callback)),\n                           void **abstract);\n\nLIBSSH2_API int\nlibssh2_userauth_hostbased_fromfile_ex(LIBSSH2_SESSION *session,\n                                       const char *username,\n                                       unsigned int username_len,\n                                       const char *publickey,\n                                       const char *privatekey,\n                                       const char *passphrase,\n                                       const char *hostname,\n                                       unsigned int hostname_len,\n                                       const char *local_username,\n                                       unsigned int local_username_len);\n\n#define libssh2_userauth_hostbased_fromfile(session, username, publickey, \\\n                                            privatekey, passphrase, hostname) \\\n libssh2_userauth_hostbased_fromfile_ex((session), (username), \\\n                                        (unsigned int)strlen(username), \\\n                                        (publickey),                    \\\n                                        (privatekey), (passphrase),     \\\n                                        (hostname),                     \\\n                                        (unsigned int)strlen(hostname), \\\n                                        (username),                     \\\n                                        (unsigned int)strlen(username))\n\nLIBSSH2_API int\nlibssh2_userauth_publickey_frommemory(LIBSSH2_SESSION *session,\n                                      const char *username,\n                                      size_t username_len,\n                                      const char *publickeyfiledata,\n                                      size_t publickeyfiledata_len,\n                                      const char *privatekeyfiledata,\n                                      size_t privatekeyfiledata_len,\n                                      const char *passphrase);\n\n/*\n * response_callback is provided with filled by library prompts array,\n * but client must allocate and fill individual responses. Responses\n * array is already allocated. Responses data will be freed by libssh2\n * after callback return, but before subsequent callback invokation.\n */\nLIBSSH2_API int\nlibssh2_userauth_keyboard_interactive_ex(LIBSSH2_SESSION* session,\n                                         const char *username,\n                                         unsigned int username_len,\n                                         LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC(\n                                                       (*response_callback)));\n\n#define libssh2_userauth_keyboard_interactive(session, username,        \\\n                                              response_callback)        \\\n    libssh2_userauth_keyboard_interactive_ex((session), (username),     \\\n                                             (unsigned int)strlen(username), \\\n                                             (response_callback))\n\nLIBSSH2_API int libssh2_poll(LIBSSH2_POLLFD *fds, unsigned int nfds,\n                             long timeout);\n\n/* Channel API */\n#define LIBSSH2_CHANNEL_WINDOW_DEFAULT  (2*1024*1024)\n#define LIBSSH2_CHANNEL_PACKET_DEFAULT  32768\n#define LIBSSH2_CHANNEL_MINADJUST       1024\n\n/* Extended Data Handling */\n#define LIBSSH2_CHANNEL_EXTENDED_DATA_NORMAL        0\n#define LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE        1\n#define LIBSSH2_CHANNEL_EXTENDED_DATA_MERGE         2\n\n#define SSH_EXTENDED_DATA_STDERR 1\n\n/* Returned by any function that would block during a read/write opperation */\n#define LIBSSH2CHANNEL_EAGAIN LIBSSH2_ERROR_EAGAIN\n\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_open_ex(LIBSSH2_SESSION *session, const char *channel_type,\n                        unsigned int channel_type_len,\n                        unsigned int window_size, unsigned int packet_size,\n                        const char *message, unsigned int message_len);\n\n#define libssh2_channel_open_session(session) \\\n  libssh2_channel_open_ex((session), \"session\", sizeof(\"session\") - 1, \\\n                          LIBSSH2_CHANNEL_WINDOW_DEFAULT, \\\n                          LIBSSH2_CHANNEL_PACKET_DEFAULT, NULL, 0)\n\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_direct_tcpip_ex(LIBSSH2_SESSION *session, const char *host,\n                                int port, const char *shost, int sport);\n#define libssh2_channel_direct_tcpip(session, host, port) \\\n  libssh2_channel_direct_tcpip_ex((session), (host), (port), \"127.0.0.1\", 22)\n\nLIBSSH2_API LIBSSH2_LISTENER *\nlibssh2_channel_forward_listen_ex(LIBSSH2_SESSION *session, const char *host,\n                                  int port, int *bound_port,\n                                  int queue_maxsize);\n#define libssh2_channel_forward_listen(session, port) \\\n libssh2_channel_forward_listen_ex((session), NULL, (port), NULL, 16)\n\nLIBSSH2_API int libssh2_channel_forward_cancel(LIBSSH2_LISTENER *listener);\n\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_forward_accept(LIBSSH2_LISTENER *listener);\n\nLIBSSH2_API int libssh2_channel_setenv_ex(LIBSSH2_CHANNEL *channel,\n                                          const char *varname,\n                                          unsigned int varname_len,\n                                          const char *value,\n                                          unsigned int value_len);\n\n#define libssh2_channel_setenv(channel, varname, value)                 \\\n    libssh2_channel_setenv_ex((channel), (varname),                     \\\n                              (unsigned int)strlen(varname), (value),   \\\n                              (unsigned int)strlen(value))\n\nLIBSSH2_API int libssh2_channel_request_pty_ex(LIBSSH2_CHANNEL *channel,\n                                               const char *term,\n                                               unsigned int term_len,\n                                               const char *modes,\n                                               unsigned int modes_len,\n                                               int width, int height,\n                                               int width_px, int height_px);\n#define libssh2_channel_request_pty(channel, term)                      \\\n    libssh2_channel_request_pty_ex((channel), (term),                   \\\n                                   (unsigned int)strlen(term),          \\\n                                   NULL, 0,                             \\\n                                   LIBSSH2_TERM_WIDTH,                  \\\n                                   LIBSSH2_TERM_HEIGHT,                 \\\n                                   LIBSSH2_TERM_WIDTH_PX,               \\\n                                   LIBSSH2_TERM_HEIGHT_PX)\n\nLIBSSH2_API int libssh2_channel_request_pty_size_ex(LIBSSH2_CHANNEL *channel,\n                                                    int width, int height,\n                                                    int width_px,\n                                                    int height_px);\n#define libssh2_channel_request_pty_size(channel, width, height) \\\n  libssh2_channel_request_pty_size_ex((channel), (width), (height), 0, 0)\n\nLIBSSH2_API int libssh2_channel_x11_req_ex(LIBSSH2_CHANNEL *channel,\n                                           int single_connection,\n                                           const char *auth_proto,\n                                           const char *auth_cookie,\n                                           int screen_number);\n#define libssh2_channel_x11_req(channel, screen_number) \\\n libssh2_channel_x11_req_ex((channel), 0, NULL, NULL, (screen_number))\n\nLIBSSH2_API int libssh2_channel_process_startup(LIBSSH2_CHANNEL *channel,\n                                                const char *request,\n                                                unsigned int request_len,\n                                                const char *message,\n                                                unsigned int message_len);\n#define libssh2_channel_shell(channel) \\\n  libssh2_channel_process_startup((channel), \"shell\", sizeof(\"shell\") - 1, \\\n                                  NULL, 0)\n#define libssh2_channel_exec(channel, command) \\\n  libssh2_channel_process_startup((channel), \"exec\", sizeof(\"exec\") - 1, \\\n                                  (command), (unsigned int)strlen(command))\n#define libssh2_channel_subsystem(channel, subsystem) \\\n  libssh2_channel_process_startup((channel), \"subsystem\",              \\\n                                  sizeof(\"subsystem\") - 1, (subsystem), \\\n                                  (unsigned int)strlen(subsystem))\n\nLIBSSH2_API ssize_t libssh2_channel_read_ex(LIBSSH2_CHANNEL *channel,\n                                            int stream_id, char *buf,\n                                            size_t buflen);\n#define libssh2_channel_read(channel, buf, buflen) \\\n  libssh2_channel_read_ex((channel), 0, (buf), (buflen))\n#define libssh2_channel_read_stderr(channel, buf, buflen) \\\n  libssh2_channel_read_ex((channel), SSH_EXTENDED_DATA_STDERR, (buf), (buflen))\n\nLIBSSH2_API int libssh2_poll_channel_read(LIBSSH2_CHANNEL *channel,\n                                          int extended);\n\nLIBSSH2_API unsigned long\nlibssh2_channel_window_read_ex(LIBSSH2_CHANNEL *channel,\n                               unsigned long *read_avail,\n                               unsigned long *window_size_initial);\n#define libssh2_channel_window_read(channel) \\\n  libssh2_channel_window_read_ex((channel), NULL, NULL)\n\n/* libssh2_channel_receive_window_adjust is DEPRECATED, do not use! */\nLIBSSH2_API unsigned long\nlibssh2_channel_receive_window_adjust(LIBSSH2_CHANNEL *channel,\n                                      unsigned long adjustment,\n                                      unsigned char force);\n\nLIBSSH2_API int\nlibssh2_channel_receive_window_adjust2(LIBSSH2_CHANNEL *channel,\n                                       unsigned long adjustment,\n                                       unsigned char force,\n                                       unsigned int *storewindow);\n\nLIBSSH2_API ssize_t libssh2_channel_write_ex(LIBSSH2_CHANNEL *channel,\n                                             int stream_id, const char *buf,\n                                             size_t buflen);\n\n#define libssh2_channel_write(channel, buf, buflen) \\\n  libssh2_channel_write_ex((channel), 0, (buf), (buflen))\n#define libssh2_channel_write_stderr(channel, buf, buflen)              \\\n    libssh2_channel_write_ex((channel), SSH_EXTENDED_DATA_STDERR,       \\\n                             (buf), (buflen))\n\nLIBSSH2_API unsigned long\nlibssh2_channel_window_write_ex(LIBSSH2_CHANNEL *channel,\n                                unsigned long *window_size_initial);\n#define libssh2_channel_window_write(channel) \\\n  libssh2_channel_window_write_ex((channel), NULL)\n\nLIBSSH2_API void libssh2_session_set_blocking(LIBSSH2_SESSION* session,\n                                              int blocking);\nLIBSSH2_API int libssh2_session_get_blocking(LIBSSH2_SESSION* session);\n\nLIBSSH2_API void libssh2_channel_set_blocking(LIBSSH2_CHANNEL *channel,\n                                              int blocking);\n\nLIBSSH2_API void libssh2_session_set_timeout(LIBSSH2_SESSION* session,\n                                             long timeout);\nLIBSSH2_API long libssh2_session_get_timeout(LIBSSH2_SESSION* session);\n\n/* libssh2_channel_handle_extended_data is DEPRECATED, do not use! */\nLIBSSH2_API void libssh2_channel_handle_extended_data(LIBSSH2_CHANNEL *channel,\n                                                      int ignore_mode);\nLIBSSH2_API int libssh2_channel_handle_extended_data2(LIBSSH2_CHANNEL *channel,\n                                                      int ignore_mode);\n\n/* libssh2_channel_ignore_extended_data() is defined below for BC with version\n * 0.1\n *\n * Future uses should use libssh2_channel_handle_extended_data() directly if\n * LIBSSH2_CHANNEL_EXTENDED_DATA_MERGE is passed, extended data will be read\n * (FIFO) from the standard data channel\n */\n/* DEPRECATED */\n#define libssh2_channel_ignore_extended_data(channel, ignore) \\\n  libssh2_channel_handle_extended_data((channel),                       \\\n                                       (ignore) ?                       \\\n                                       LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE : \\\n                                       LIBSSH2_CHANNEL_EXTENDED_DATA_NORMAL)\n\n#define LIBSSH2_CHANNEL_FLUSH_EXTENDED_DATA     -1\n#define LIBSSH2_CHANNEL_FLUSH_ALL               -2\nLIBSSH2_API int libssh2_channel_flush_ex(LIBSSH2_CHANNEL *channel,\n                                         int streamid);\n#define libssh2_channel_flush(channel) libssh2_channel_flush_ex((channel), 0)\n#define libssh2_channel_flush_stderr(channel) \\\n libssh2_channel_flush_ex((channel), SSH_EXTENDED_DATA_STDERR)\n\nLIBSSH2_API int libssh2_channel_get_exit_status(LIBSSH2_CHANNEL* channel);\nLIBSSH2_API int libssh2_channel_get_exit_signal(LIBSSH2_CHANNEL* channel,\n                                                char **exitsignal,\n                                                size_t *exitsignal_len,\n                                                char **errmsg,\n                                                size_t *errmsg_len,\n                                                char **langtag,\n                                                size_t *langtag_len);\nLIBSSH2_API int libssh2_channel_send_eof(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_eof(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_wait_eof(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_close(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_wait_closed(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_free(LIBSSH2_CHANNEL *channel);\n\n/* libssh2_scp_recv is DEPRECATED, do not use! */\nLIBSSH2_API LIBSSH2_CHANNEL *libssh2_scp_recv(LIBSSH2_SESSION *session,\n                                              const char *path,\n                                              struct stat *sb);\n/* Use libssh2_scp_recv2 for large (> 2GB) file support on windows */\nLIBSSH2_API LIBSSH2_CHANNEL *libssh2_scp_recv2(LIBSSH2_SESSION *session,\n                                               const char *path,\n                                               libssh2_struct_stat *sb);\nLIBSSH2_API LIBSSH2_CHANNEL *libssh2_scp_send_ex(LIBSSH2_SESSION *session,\n                                                 const char *path, int mode,\n                                                 size_t size, long mtime,\n                                                 long atime);\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_scp_send64(LIBSSH2_SESSION *session, const char *path, int mode,\n                   libssh2_int64_t size, time_t mtime, time_t atime);\n\n#define libssh2_scp_send(session, path, mode, size) \\\n  libssh2_scp_send_ex((session), (path), (mode), (size), 0, 0)\n\nLIBSSH2_API int libssh2_base64_decode(LIBSSH2_SESSION *session, char **dest,\n                                      unsigned int *dest_len,\n                                      const char *src, unsigned int src_len);\n\nLIBSSH2_API\nconst char *libssh2_version(int req_version_num);\n\n#define HAVE_LIBSSH2_KNOWNHOST_API 0x010101 /* since 1.1.1 */\n#define HAVE_LIBSSH2_VERSION_API   0x010100 /* libssh2_version since 1.1 */\n\nstruct libssh2_knownhost {\n    unsigned int magic;  /* magic stored by the library */\n    void *node; /* handle to the internal representation of this host */\n    char *name; /* this is NULL if no plain text host name exists */\n    char *key;  /* key in base64/printable format */\n    int typemask;\n};\n\n/*\n * libssh2_knownhost_init\n *\n * Init a collection of known hosts. Returns the pointer to a collection.\n *\n */\nLIBSSH2_API LIBSSH2_KNOWNHOSTS *\nlibssh2_knownhost_init(LIBSSH2_SESSION *session);\n\n/*\n * libssh2_knownhost_add\n *\n * Add a host and its associated key to the collection of known hosts.\n *\n * The 'type' argument specifies on what format the given host and keys are:\n *\n * plain  - ascii \"hostname.domain.tld\"\n * sha1   - SHA1(<salt> <host>) base64-encoded!\n * custom - another hash\n *\n * If 'sha1' is selected as type, the salt must be provided to the salt\n * argument. This too base64 encoded.\n *\n * The SHA-1 hash is what OpenSSH can be told to use in known_hosts files.  If\n * a custom type is used, salt is ignored and you must provide the host\n * pre-hashed when checking for it in the libssh2_knownhost_check() function.\n *\n * The keylen parameter may be omitted (zero) if the key is provided as a\n * NULL-terminated base64-encoded string.\n */\n\n/* host format (2 bits) */\n#define LIBSSH2_KNOWNHOST_TYPE_MASK    0xffff\n#define LIBSSH2_KNOWNHOST_TYPE_PLAIN   1\n#define LIBSSH2_KNOWNHOST_TYPE_SHA1    2 /* always base64 encoded */\n#define LIBSSH2_KNOWNHOST_TYPE_CUSTOM  3\n\n/* key format (2 bits) */\n#define LIBSSH2_KNOWNHOST_KEYENC_MASK     (3<<16)\n#define LIBSSH2_KNOWNHOST_KEYENC_RAW      (1<<16)\n#define LIBSSH2_KNOWNHOST_KEYENC_BASE64   (2<<16)\n\n/* type of key (3 bits) */\n#define LIBSSH2_KNOWNHOST_KEY_MASK         (15<<18)\n#define LIBSSH2_KNOWNHOST_KEY_SHIFT        18\n#define LIBSSH2_KNOWNHOST_KEY_RSA1         (1<<18)\n#define LIBSSH2_KNOWNHOST_KEY_SSHRSA       (2<<18)\n#define LIBSSH2_KNOWNHOST_KEY_SSHDSS       (3<<18)\n#define LIBSSH2_KNOWNHOST_KEY_ECDSA_256    (4<<18)\n#define LIBSSH2_KNOWNHOST_KEY_ECDSA_384    (5<<18)\n#define LIBSSH2_KNOWNHOST_KEY_ECDSA_521    (6<<18)\n#define LIBSSH2_KNOWNHOST_KEY_ED25519      (7<<18)\n#define LIBSSH2_KNOWNHOST_KEY_UNKNOWN      (15<<18)\n\nLIBSSH2_API int\nlibssh2_knownhost_add(LIBSSH2_KNOWNHOSTS *hosts,\n                      const char *host,\n                      const char *salt,\n                      const char *key, size_t keylen, int typemask,\n                      struct libssh2_knownhost **store);\n\n/*\n * libssh2_knownhost_addc\n *\n * Add a host and its associated key to the collection of known hosts.\n *\n * Takes a comment argument that may be NULL.  A NULL comment indicates\n * there is no comment and the entry will end directly after the key\n * when written out to a file.  An empty string \"\" comment will indicate an\n * empty comment which will cause a single space to be written after the key.\n *\n * The 'type' argument specifies on what format the given host and keys are:\n *\n * plain  - ascii \"hostname.domain.tld\"\n * sha1   - SHA1(<salt> <host>) base64-encoded!\n * custom - another hash\n *\n * If 'sha1' is selected as type, the salt must be provided to the salt\n * argument. This too base64 encoded.\n *\n * The SHA-1 hash is what OpenSSH can be told to use in known_hosts files.  If\n * a custom type is used, salt is ignored and you must provide the host\n * pre-hashed when checking for it in the libssh2_knownhost_check() function.\n *\n * The keylen parameter may be omitted (zero) if the key is provided as a\n * NULL-terminated base64-encoded string.\n */\n\nLIBSSH2_API int\nlibssh2_knownhost_addc(LIBSSH2_KNOWNHOSTS *hosts,\n                       const char *host,\n                       const char *salt,\n                       const char *key, size_t keylen,\n                       const char *comment, size_t commentlen, int typemask,\n                       struct libssh2_knownhost **store);\n\n/*\n * libssh2_knownhost_check\n *\n * Check a host and its associated key against the collection of known hosts.\n *\n * The type is the type/format of the given host name.\n *\n * plain  - ascii \"hostname.domain.tld\"\n * custom - prehashed base64 encoded. Note that this cannot use any salts.\n *\n *\n * 'knownhost' may be set to NULL if you don't care about that info.\n *\n * Returns:\n *\n * LIBSSH2_KNOWNHOST_CHECK_* values, see below\n *\n */\n\n#define LIBSSH2_KNOWNHOST_CHECK_MATCH    0\n#define LIBSSH2_KNOWNHOST_CHECK_MISMATCH 1\n#define LIBSSH2_KNOWNHOST_CHECK_NOTFOUND 2\n#define LIBSSH2_KNOWNHOST_CHECK_FAILURE  3\n\nLIBSSH2_API int\nlibssh2_knownhost_check(LIBSSH2_KNOWNHOSTS *hosts,\n                        const char *host, const char *key, size_t keylen,\n                        int typemask,\n                        struct libssh2_knownhost **knownhost);\n\n/* this function is identital to the above one, but also takes a port\n   argument that allows libssh2 to do a better check */\nLIBSSH2_API int\nlibssh2_knownhost_checkp(LIBSSH2_KNOWNHOSTS *hosts,\n                         const char *host, int port,\n                         const char *key, size_t keylen,\n                         int typemask,\n                         struct libssh2_knownhost **knownhost);\n\n/*\n * libssh2_knownhost_del\n *\n * Remove a host from the collection of known hosts. The 'entry' struct is\n * retrieved by a call to libssh2_knownhost_check().\n *\n */\nLIBSSH2_API int\nlibssh2_knownhost_del(LIBSSH2_KNOWNHOSTS *hosts,\n                      struct libssh2_knownhost *entry);\n\n/*\n * libssh2_knownhost_free\n *\n * Free an entire collection of known hosts.\n *\n */\nLIBSSH2_API void\nlibssh2_knownhost_free(LIBSSH2_KNOWNHOSTS *hosts);\n\n/*\n * libssh2_knownhost_readline()\n *\n * Pass in a line of a file of 'type'. It makes libssh2 read this line.\n *\n * LIBSSH2_KNOWNHOST_FILE_OPENSSH is the only supported type.\n *\n */\nLIBSSH2_API int\nlibssh2_knownhost_readline(LIBSSH2_KNOWNHOSTS *hosts,\n                           const char *line, size_t len, int type);\n\n/*\n * libssh2_knownhost_readfile\n *\n * Add hosts+key pairs from a given file.\n *\n * Returns a negative value for error or number of successfully added hosts.\n *\n * This implementation currently only knows one 'type' (openssh), all others\n * are reserved for future use.\n */\n\n#define LIBSSH2_KNOWNHOST_FILE_OPENSSH 1\n\nLIBSSH2_API int\nlibssh2_knownhost_readfile(LIBSSH2_KNOWNHOSTS *hosts,\n                           const char *filename, int type);\n\n/*\n * libssh2_knownhost_writeline()\n *\n * Ask libssh2 to convert a known host to an output line for storage.\n *\n * Note that this function returns LIBSSH2_ERROR_BUFFER_TOO_SMALL if the given\n * output buffer is too small to hold the desired output.\n *\n * This implementation currently only knows one 'type' (openssh), all others\n * are reserved for future use.\n *\n */\nLIBSSH2_API int\nlibssh2_knownhost_writeline(LIBSSH2_KNOWNHOSTS *hosts,\n                            struct libssh2_knownhost *known,\n                            char *buffer, size_t buflen,\n                            size_t *outlen, /* the amount of written data */\n                            int type);\n\n/*\n * libssh2_knownhost_writefile\n *\n * Write hosts+key pairs to a given file.\n *\n * This implementation currently only knows one 'type' (openssh), all others\n * are reserved for future use.\n */\n\nLIBSSH2_API int\nlibssh2_knownhost_writefile(LIBSSH2_KNOWNHOSTS *hosts,\n                            const char *filename, int type);\n\n/*\n * libssh2_knownhost_get()\n *\n * Traverse the internal list of known hosts. Pass NULL to 'prev' to get\n * the first one. Or pass a poiner to the previously returned one to get the\n * next.\n *\n * Returns:\n * 0 if a fine host was stored in 'store'\n * 1 if end of hosts\n * [negative] on errors\n */\nLIBSSH2_API int\nlibssh2_knownhost_get(LIBSSH2_KNOWNHOSTS *hosts,\n                      struct libssh2_knownhost **store,\n                      struct libssh2_knownhost *prev);\n\n#define HAVE_LIBSSH2_AGENT_API 0x010202 /* since 1.2.2 */\n\nstruct libssh2_agent_publickey {\n    unsigned int magic;              /* magic stored by the library */\n    void *node;     /* handle to the internal representation of key */\n    unsigned char *blob;           /* public key blob */\n    size_t blob_len;               /* length of the public key blob */\n    char *comment;                 /* comment in printable format */\n};\n\n/*\n * libssh2_agent_init\n *\n * Init an ssh-agent handle. Returns the pointer to the handle.\n *\n */\nLIBSSH2_API LIBSSH2_AGENT *\nlibssh2_agent_init(LIBSSH2_SESSION *session);\n\n/*\n * libssh2_agent_connect()\n *\n * Connect to an ssh-agent.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_connect(LIBSSH2_AGENT *agent);\n\n/*\n * libssh2_agent_list_identities()\n *\n * Request an ssh-agent to list identities.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_list_identities(LIBSSH2_AGENT *agent);\n\n/*\n * libssh2_agent_get_identity()\n *\n * Traverse the internal list of public keys. Pass NULL to 'prev' to get\n * the first one. Or pass a poiner to the previously returned one to get the\n * next.\n *\n * Returns:\n * 0 if a fine public key was stored in 'store'\n * 1 if end of public keys\n * [negative] on errors\n */\nLIBSSH2_API int\nlibssh2_agent_get_identity(LIBSSH2_AGENT *agent,\n               struct libssh2_agent_publickey **store,\n               struct libssh2_agent_publickey *prev);\n\n/*\n * libssh2_agent_userauth()\n *\n * Do publickey user authentication with the help of ssh-agent.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_userauth(LIBSSH2_AGENT *agent,\n               const char *username,\n               struct libssh2_agent_publickey *identity);\n\n/*\n * libssh2_agent_disconnect()\n *\n * Close a connection to an ssh-agent.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_disconnect(LIBSSH2_AGENT *agent);\n\n/*\n * libssh2_agent_free()\n *\n * Free an ssh-agent handle.  This function also frees the internal\n * collection of public keys.\n */\nLIBSSH2_API void\nlibssh2_agent_free(LIBSSH2_AGENT *agent);\n\n/*\n * libssh2_agent_set_identity_path()\n *\n * Allows a custom agent identity socket path beyond SSH_AUTH_SOCK env\n *\n */\nLIBSSH2_API void\nlibssh2_agent_set_identity_path(LIBSSH2_AGENT *agent,\n                                const char *path);\n\n/*\n * libssh2_agent_get_identity_path()\n *\n * Returns the custom agent identity socket path if set\n *\n */\nLIBSSH2_API const char *\nlibssh2_agent_get_identity_path(LIBSSH2_AGENT *agent);\n\n/*\n * libssh2_keepalive_config()\n *\n * Set how often keepalive messages should be sent.  WANT_REPLY\n * indicates whether the keepalive messages should request a response\n * from the server.  INTERVAL is number of seconds that can pass\n * without any I/O, use 0 (the default) to disable keepalives.  To\n * avoid some busy-loop corner-cases, if you specify an interval of 1\n * it will be treated as 2.\n *\n * Note that non-blocking applications are responsible for sending the\n * keepalive messages using libssh2_keepalive_send().\n */\nLIBSSH2_API void libssh2_keepalive_config(LIBSSH2_SESSION *session,\n                                          int want_reply,\n                                          unsigned interval);\n\n/*\n * libssh2_keepalive_send()\n *\n * Send a keepalive message if needed.  SECONDS_TO_NEXT indicates how\n * many seconds you can sleep after this call before you need to call\n * it again.  Returns 0 on success, or LIBSSH2_ERROR_SOCKET_SEND on\n * I/O errors.\n */\nLIBSSH2_API int libssh2_keepalive_send(LIBSSH2_SESSION *session,\n                                       int *seconds_to_next);\n\n/* NOTE NOTE NOTE\n   libssh2_trace() has no function in builds that aren't built with debug\n   enabled\n */\nLIBSSH2_API int libssh2_trace(LIBSSH2_SESSION *session, int bitmask);\n#define LIBSSH2_TRACE_TRANS (1<<1)\n#define LIBSSH2_TRACE_KEX   (1<<2)\n#define LIBSSH2_TRACE_AUTH  (1<<3)\n#define LIBSSH2_TRACE_CONN  (1<<4)\n#define LIBSSH2_TRACE_SCP   (1<<5)\n#define LIBSSH2_TRACE_SFTP  (1<<6)\n#define LIBSSH2_TRACE_ERROR (1<<7)\n#define LIBSSH2_TRACE_PUBLICKEY (1<<8)\n#define LIBSSH2_TRACE_SOCKET (1<<9)\n\ntypedef void (*libssh2_trace_handler_func)(LIBSSH2_SESSION*,\n                                           void *,\n                                           const char *,\n                                           size_t);\nLIBSSH2_API int libssh2_trace_sethandler(LIBSSH2_SESSION *session,\n                                         void *context,\n                                         libssh2_trace_handler_func callback);\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n\n#endif /* !RC_INVOKED */\n\n#endif /* LIBSSH2_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/include/libssh2_publickey.h",
    "content": "/* Copyright (c) 2004-2006, Sara Golemon <sarag@libssh2.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* Note: This include file is only needed for using the\n * publickey SUBSYSTEM which is not the same as publickey\n * authentication.  For authentication you only need libssh2.h\n *\n * For more information on the publickey subsystem,\n * refer to IETF draft: secsh-publickey\n */\n\n#ifndef LIBSSH2_PUBLICKEY_H\n#define LIBSSH2_PUBLICKEY_H 1\n\n#include \"libssh2.h\"\n\ntypedef struct _LIBSSH2_PUBLICKEY               LIBSSH2_PUBLICKEY;\n\ntypedef struct _libssh2_publickey_attribute {\n    const char *name;\n    unsigned long name_len;\n    const char *value;\n    unsigned long value_len;\n    char mandatory;\n} libssh2_publickey_attribute;\n\ntypedef struct _libssh2_publickey_list {\n    unsigned char *packet; /* For freeing */\n\n    const unsigned char *name;\n    unsigned long name_len;\n    const unsigned char *blob;\n    unsigned long blob_len;\n    unsigned long num_attrs;\n    libssh2_publickey_attribute *attrs; /* free me */\n} libssh2_publickey_list;\n\n/* Generally use the first macro here, but if both name and value are string\n   literals, you can use _fast() to take advantage of preprocessing */\n#define libssh2_publickey_attribute(name, value, mandatory) \\\n  { (name), strlen(name), (value), strlen(value), (mandatory) },\n#define libssh2_publickey_attribute_fast(name, value, mandatory) \\\n  { (name), sizeof(name) - 1, (value), sizeof(value) - 1, (mandatory) },\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Publickey Subsystem */\nLIBSSH2_API LIBSSH2_PUBLICKEY *\nlibssh2_publickey_init(LIBSSH2_SESSION *session);\n\nLIBSSH2_API int\nlibssh2_publickey_add_ex(LIBSSH2_PUBLICKEY *pkey,\n                         const unsigned char *name,\n                         unsigned long name_len,\n                         const unsigned char *blob,\n                         unsigned long blob_len, char overwrite,\n                         unsigned long num_attrs,\n                         const libssh2_publickey_attribute attrs[]);\n#define libssh2_publickey_add(pkey, name, blob, blob_len, overwrite,    \\\n                              num_attrs, attrs)                         \\\n  libssh2_publickey_add_ex((pkey), (name), strlen(name), (blob), (blob_len), \\\n                           (overwrite), (num_attrs), (attrs))\n\nLIBSSH2_API int libssh2_publickey_remove_ex(LIBSSH2_PUBLICKEY *pkey,\n                                            const unsigned char *name,\n                                            unsigned long name_len,\n                                            const unsigned char *blob,\n                                            unsigned long blob_len);\n#define libssh2_publickey_remove(pkey, name, blob, blob_len) \\\n  libssh2_publickey_remove_ex((pkey), (name), strlen(name), (blob), (blob_len))\n\nLIBSSH2_API int\nlibssh2_publickey_list_fetch(LIBSSH2_PUBLICKEY *pkey,\n                             unsigned long *num_keys,\n                             libssh2_publickey_list **pkey_list);\nLIBSSH2_API void\nlibssh2_publickey_list_free(LIBSSH2_PUBLICKEY *pkey,\n                            libssh2_publickey_list *pkey_list);\n\nLIBSSH2_API int libssh2_publickey_shutdown(LIBSSH2_PUBLICKEY *pkey);\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n\n#endif /* ifndef: LIBSSH2_PUBLICKEY_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/include/libssh2_sftp.h",
    "content": "/* Copyright (c) 2004-2008, Sara Golemon <sarag@libssh2.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_SFTP_H\n#define LIBSSH2_SFTP_H 1\n\n#include \"libssh2.h\"\n\n#ifndef WIN32\n#include <unistd.h>\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Note: Version 6 was documented at the time of writing\n * However it was marked as \"DO NOT IMPLEMENT\" due to pending changes\n *\n * Let's start with Version 3 (The version found in OpenSSH) and go from there\n */\n#define LIBSSH2_SFTP_VERSION        3\n\ntypedef struct _LIBSSH2_SFTP                LIBSSH2_SFTP;\ntypedef struct _LIBSSH2_SFTP_HANDLE         LIBSSH2_SFTP_HANDLE;\ntypedef struct _LIBSSH2_SFTP_ATTRIBUTES     LIBSSH2_SFTP_ATTRIBUTES;\ntypedef struct _LIBSSH2_SFTP_STATVFS        LIBSSH2_SFTP_STATVFS;\n\n/* Flags for open_ex() */\n#define LIBSSH2_SFTP_OPENFILE           0\n#define LIBSSH2_SFTP_OPENDIR            1\n\n/* Flags for rename_ex() */\n#define LIBSSH2_SFTP_RENAME_OVERWRITE   0x00000001\n#define LIBSSH2_SFTP_RENAME_ATOMIC      0x00000002\n#define LIBSSH2_SFTP_RENAME_NATIVE      0x00000004\n\n/* Flags for stat_ex() */\n#define LIBSSH2_SFTP_STAT               0\n#define LIBSSH2_SFTP_LSTAT              1\n#define LIBSSH2_SFTP_SETSTAT            2\n\n/* Flags for symlink_ex() */\n#define LIBSSH2_SFTP_SYMLINK            0\n#define LIBSSH2_SFTP_READLINK           1\n#define LIBSSH2_SFTP_REALPATH           2\n\n/* Flags for sftp_mkdir() */\n#define LIBSSH2_SFTP_DEFAULT_MODE      -1\n\n/* SFTP attribute flag bits */\n#define LIBSSH2_SFTP_ATTR_SIZE              0x00000001\n#define LIBSSH2_SFTP_ATTR_UIDGID            0x00000002\n#define LIBSSH2_SFTP_ATTR_PERMISSIONS       0x00000004\n#define LIBSSH2_SFTP_ATTR_ACMODTIME         0x00000008\n#define LIBSSH2_SFTP_ATTR_EXTENDED          0x80000000\n\n/* SFTP statvfs flag bits */\n#define LIBSSH2_SFTP_ST_RDONLY              0x00000001\n#define LIBSSH2_SFTP_ST_NOSUID              0x00000002\n\nstruct _LIBSSH2_SFTP_ATTRIBUTES {\n    /* If flags & ATTR_* bit is set, then the value in this struct will be\n     * meaningful Otherwise it should be ignored\n     */\n    unsigned long flags;\n\n    libssh2_uint64_t filesize;\n    unsigned long uid, gid;\n    unsigned long permissions;\n    unsigned long atime, mtime;\n};\n\nstruct _LIBSSH2_SFTP_STATVFS {\n    libssh2_uint64_t  f_bsize;    /* file system block size */\n    libssh2_uint64_t  f_frsize;   /* fragment size */\n    libssh2_uint64_t  f_blocks;   /* size of fs in f_frsize units */\n    libssh2_uint64_t  f_bfree;    /* # free blocks */\n    libssh2_uint64_t  f_bavail;   /* # free blocks for non-root */\n    libssh2_uint64_t  f_files;    /* # inodes */\n    libssh2_uint64_t  f_ffree;    /* # free inodes */\n    libssh2_uint64_t  f_favail;   /* # free inodes for non-root */\n    libssh2_uint64_t  f_fsid;     /* file system ID */\n    libssh2_uint64_t  f_flag;     /* mount flags */\n    libssh2_uint64_t  f_namemax;  /* maximum filename length */\n};\n\n/* SFTP filetypes */\n#define LIBSSH2_SFTP_TYPE_REGULAR           1\n#define LIBSSH2_SFTP_TYPE_DIRECTORY         2\n#define LIBSSH2_SFTP_TYPE_SYMLINK           3\n#define LIBSSH2_SFTP_TYPE_SPECIAL           4\n#define LIBSSH2_SFTP_TYPE_UNKNOWN           5\n#define LIBSSH2_SFTP_TYPE_SOCKET            6\n#define LIBSSH2_SFTP_TYPE_CHAR_DEVICE       7\n#define LIBSSH2_SFTP_TYPE_BLOCK_DEVICE      8\n#define LIBSSH2_SFTP_TYPE_FIFO              9\n\n/*\n * Reproduce the POSIX file modes here for systems that are not POSIX\n * compliant.\n *\n * These is used in \"permissions\" of \"struct _LIBSSH2_SFTP_ATTRIBUTES\"\n */\n/* File type */\n#define LIBSSH2_SFTP_S_IFMT         0170000     /* type of file mask */\n#define LIBSSH2_SFTP_S_IFIFO        0010000     /* named pipe (fifo) */\n#define LIBSSH2_SFTP_S_IFCHR        0020000     /* character special */\n#define LIBSSH2_SFTP_S_IFDIR        0040000     /* directory */\n#define LIBSSH2_SFTP_S_IFBLK        0060000     /* block special */\n#define LIBSSH2_SFTP_S_IFREG        0100000     /* regular */\n#define LIBSSH2_SFTP_S_IFLNK        0120000     /* symbolic link */\n#define LIBSSH2_SFTP_S_IFSOCK       0140000     /* socket */\n\n/* File mode */\n/* Read, write, execute/search by owner */\n#define LIBSSH2_SFTP_S_IRWXU        0000700     /* RWX mask for owner */\n#define LIBSSH2_SFTP_S_IRUSR        0000400     /* R for owner */\n#define LIBSSH2_SFTP_S_IWUSR        0000200     /* W for owner */\n#define LIBSSH2_SFTP_S_IXUSR        0000100     /* X for owner */\n/* Read, write, execute/search by group */\n#define LIBSSH2_SFTP_S_IRWXG        0000070     /* RWX mask for group */\n#define LIBSSH2_SFTP_S_IRGRP        0000040     /* R for group */\n#define LIBSSH2_SFTP_S_IWGRP        0000020     /* W for group */\n#define LIBSSH2_SFTP_S_IXGRP        0000010     /* X for group */\n/* Read, write, execute/search by others */\n#define LIBSSH2_SFTP_S_IRWXO        0000007     /* RWX mask for other */\n#define LIBSSH2_SFTP_S_IROTH        0000004     /* R for other */\n#define LIBSSH2_SFTP_S_IWOTH        0000002     /* W for other */\n#define LIBSSH2_SFTP_S_IXOTH        0000001     /* X for other */\n\n/* macros to check for specific file types, added in 1.2.5 */\n#define LIBSSH2_SFTP_S_ISLNK(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFLNK)\n#define LIBSSH2_SFTP_S_ISREG(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFREG)\n#define LIBSSH2_SFTP_S_ISDIR(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFDIR)\n#define LIBSSH2_SFTP_S_ISCHR(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFCHR)\n#define LIBSSH2_SFTP_S_ISBLK(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFBLK)\n#define LIBSSH2_SFTP_S_ISFIFO(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFIFO)\n#define LIBSSH2_SFTP_S_ISSOCK(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFSOCK)\n\n/* SFTP File Transfer Flags -- (e.g. flags parameter to sftp_open())\n * Danger will robinson... APPEND doesn't have any effect on OpenSSH servers */\n#define LIBSSH2_FXF_READ                        0x00000001\n#define LIBSSH2_FXF_WRITE                       0x00000002\n#define LIBSSH2_FXF_APPEND                      0x00000004\n#define LIBSSH2_FXF_CREAT                       0x00000008\n#define LIBSSH2_FXF_TRUNC                       0x00000010\n#define LIBSSH2_FXF_EXCL                        0x00000020\n\n/* SFTP Status Codes (returned by libssh2_sftp_last_error() ) */\n#define LIBSSH2_FX_OK                       0\n#define LIBSSH2_FX_EOF                      1\n#define LIBSSH2_FX_NO_SUCH_FILE             2\n#define LIBSSH2_FX_PERMISSION_DENIED        3\n#define LIBSSH2_FX_FAILURE                  4\n#define LIBSSH2_FX_BAD_MESSAGE              5\n#define LIBSSH2_FX_NO_CONNECTION            6\n#define LIBSSH2_FX_CONNECTION_LOST          7\n#define LIBSSH2_FX_OP_UNSUPPORTED           8\n#define LIBSSH2_FX_INVALID_HANDLE           9\n#define LIBSSH2_FX_NO_SUCH_PATH             10\n#define LIBSSH2_FX_FILE_ALREADY_EXISTS      11\n#define LIBSSH2_FX_WRITE_PROTECT            12\n#define LIBSSH2_FX_NO_MEDIA                 13\n#define LIBSSH2_FX_NO_SPACE_ON_FILESYSTEM   14\n#define LIBSSH2_FX_QUOTA_EXCEEDED           15\n#define LIBSSH2_FX_UNKNOWN_PRINCIPLE        16 /* Initial mis-spelling */\n#define LIBSSH2_FX_UNKNOWN_PRINCIPAL        16\n#define LIBSSH2_FX_LOCK_CONFlICT            17 /* Initial mis-spelling */\n#define LIBSSH2_FX_LOCK_CONFLICT            17\n#define LIBSSH2_FX_DIR_NOT_EMPTY            18\n#define LIBSSH2_FX_NOT_A_DIRECTORY          19\n#define LIBSSH2_FX_INVALID_FILENAME         20\n#define LIBSSH2_FX_LINK_LOOP                21\n\n/* Returned by any function that would block during a read/write opperation */\n#define LIBSSH2SFTP_EAGAIN LIBSSH2_ERROR_EAGAIN\n\n/* SFTP API */\nLIBSSH2_API LIBSSH2_SFTP *libssh2_sftp_init(LIBSSH2_SESSION *session);\nLIBSSH2_API int libssh2_sftp_shutdown(LIBSSH2_SFTP *sftp);\nLIBSSH2_API unsigned long libssh2_sftp_last_error(LIBSSH2_SFTP *sftp);\nLIBSSH2_API LIBSSH2_CHANNEL *libssh2_sftp_get_channel(LIBSSH2_SFTP *sftp);\n\n/* File / Directory Ops */\nLIBSSH2_API LIBSSH2_SFTP_HANDLE *\nlibssh2_sftp_open_ex(LIBSSH2_SFTP *sftp,\n                     const char *filename,\n                     unsigned int filename_len,\n                     unsigned long flags,\n                     long mode, int open_type);\n#define libssh2_sftp_open(sftp, filename, flags, mode)                  \\\n    libssh2_sftp_open_ex((sftp), (filename), strlen(filename), (flags), \\\n                         (mode), LIBSSH2_SFTP_OPENFILE)\n#define libssh2_sftp_opendir(sftp, path) \\\n    libssh2_sftp_open_ex((sftp), (path), strlen(path), 0, 0, \\\n                         LIBSSH2_SFTP_OPENDIR)\n\nLIBSSH2_API ssize_t libssh2_sftp_read(LIBSSH2_SFTP_HANDLE *handle,\n                                      char *buffer, size_t buffer_maxlen);\n\nLIBSSH2_API int libssh2_sftp_readdir_ex(LIBSSH2_SFTP_HANDLE *handle, \\\n                                        char *buffer, size_t buffer_maxlen,\n                                        char *longentry,\n                                        size_t longentry_maxlen,\n                                        LIBSSH2_SFTP_ATTRIBUTES *attrs);\n#define libssh2_sftp_readdir(handle, buffer, buffer_maxlen, attrs)      \\\n    libssh2_sftp_readdir_ex((handle), (buffer), (buffer_maxlen), NULL, 0, \\\n                            (attrs))\n\nLIBSSH2_API ssize_t libssh2_sftp_write(LIBSSH2_SFTP_HANDLE *handle,\n                                       const char *buffer, size_t count);\nLIBSSH2_API int libssh2_sftp_fsync(LIBSSH2_SFTP_HANDLE *handle);\n\nLIBSSH2_API int libssh2_sftp_close_handle(LIBSSH2_SFTP_HANDLE *handle);\n#define libssh2_sftp_close(handle) libssh2_sftp_close_handle(handle)\n#define libssh2_sftp_closedir(handle) libssh2_sftp_close_handle(handle)\n\nLIBSSH2_API void libssh2_sftp_seek(LIBSSH2_SFTP_HANDLE *handle, size_t offset);\nLIBSSH2_API void libssh2_sftp_seek64(LIBSSH2_SFTP_HANDLE *handle,\n                                     libssh2_uint64_t offset);\n#define libssh2_sftp_rewind(handle) libssh2_sftp_seek64((handle), 0)\n\nLIBSSH2_API size_t libssh2_sftp_tell(LIBSSH2_SFTP_HANDLE *handle);\nLIBSSH2_API libssh2_uint64_t libssh2_sftp_tell64(LIBSSH2_SFTP_HANDLE *handle);\n\nLIBSSH2_API int libssh2_sftp_fstat_ex(LIBSSH2_SFTP_HANDLE *handle,\n                                      LIBSSH2_SFTP_ATTRIBUTES *attrs,\n                                      int setstat);\n#define libssh2_sftp_fstat(handle, attrs) \\\n    libssh2_sftp_fstat_ex((handle), (attrs), 0)\n#define libssh2_sftp_fsetstat(handle, attrs) \\\n    libssh2_sftp_fstat_ex((handle), (attrs), 1)\n\n/* Miscellaneous Ops */\nLIBSSH2_API int libssh2_sftp_rename_ex(LIBSSH2_SFTP *sftp,\n                                       const char *source_filename,\n                                       unsigned int srouce_filename_len,\n                                       const char *dest_filename,\n                                       unsigned int dest_filename_len,\n                                       long flags);\n#define libssh2_sftp_rename(sftp, sourcefile, destfile) \\\n    libssh2_sftp_rename_ex((sftp), (sourcefile), strlen(sourcefile), \\\n                           (destfile), strlen(destfile),                \\\n                           LIBSSH2_SFTP_RENAME_OVERWRITE | \\\n                           LIBSSH2_SFTP_RENAME_ATOMIC | \\\n                           LIBSSH2_SFTP_RENAME_NATIVE)\n\nLIBSSH2_API int libssh2_sftp_unlink_ex(LIBSSH2_SFTP *sftp,\n                                       const char *filename,\n                                       unsigned int filename_len);\n#define libssh2_sftp_unlink(sftp, filename) \\\n    libssh2_sftp_unlink_ex((sftp), (filename), strlen(filename))\n\nLIBSSH2_API int libssh2_sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle,\n                                      LIBSSH2_SFTP_STATVFS *st);\n\nLIBSSH2_API int libssh2_sftp_statvfs(LIBSSH2_SFTP *sftp,\n                                     const char *path,\n                                     size_t path_len,\n                                     LIBSSH2_SFTP_STATVFS *st);\n\nLIBSSH2_API int libssh2_sftp_mkdir_ex(LIBSSH2_SFTP *sftp,\n                                      const char *path,\n                                      unsigned int path_len, long mode);\n#define libssh2_sftp_mkdir(sftp, path, mode) \\\n    libssh2_sftp_mkdir_ex((sftp), (path), strlen(path), (mode))\n\nLIBSSH2_API int libssh2_sftp_rmdir_ex(LIBSSH2_SFTP *sftp,\n                                      const char *path,\n                                      unsigned int path_len);\n#define libssh2_sftp_rmdir(sftp, path) \\\n    libssh2_sftp_rmdir_ex((sftp), (path), strlen(path))\n\nLIBSSH2_API int libssh2_sftp_stat_ex(LIBSSH2_SFTP *sftp,\n                                     const char *path,\n                                     unsigned int path_len,\n                                     int stat_type,\n                                     LIBSSH2_SFTP_ATTRIBUTES *attrs);\n#define libssh2_sftp_stat(sftp, path, attrs) \\\n    libssh2_sftp_stat_ex((sftp), (path), strlen(path), LIBSSH2_SFTP_STAT, \\\n                         (attrs))\n#define libssh2_sftp_lstat(sftp, path, attrs) \\\n    libssh2_sftp_stat_ex((sftp), (path), strlen(path), LIBSSH2_SFTP_LSTAT, \\\n                         (attrs))\n#define libssh2_sftp_setstat(sftp, path, attrs) \\\n    libssh2_sftp_stat_ex((sftp), (path), strlen(path), LIBSSH2_SFTP_SETSTAT, \\\n                         (attrs))\n\nLIBSSH2_API int libssh2_sftp_symlink_ex(LIBSSH2_SFTP *sftp,\n                                        const char *path,\n                                        unsigned int path_len,\n                                        char *target,\n                                        unsigned int target_len,\n                                        int link_type);\n#define libssh2_sftp_symlink(sftp, orig, linkpath) \\\n    libssh2_sftp_symlink_ex((sftp), (orig), strlen(orig), (linkpath), \\\n                            strlen(linkpath), LIBSSH2_SFTP_SYMLINK)\n#define libssh2_sftp_readlink(sftp, path, target, maxlen) \\\n    libssh2_sftp_symlink_ex((sftp), (path), strlen(path), (target), (maxlen), \\\n    LIBSSH2_SFTP_READLINK)\n#define libssh2_sftp_realpath(sftp, path, target, maxlen) \\\n    libssh2_sftp_symlink_ex((sftp), (path), strlen(path), (target), (maxlen), \\\n                            LIBSSH2_SFTP_REALPATH)\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n\n#endif /* LIBSSH2_SFTP_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/libssh2-style.el",
    "content": ";;;; Emacs Lisp help for writing libssh2 code. ;;;;\n;;;; $Id: libssh2-style.el,v 1.1 2008/12/20 12:36:50 bagder Exp $\n\n;;; The libssh2 hacker's C conventions.\n;;; See the sample.emacs file on how this file can be made to take\n;;; effect automatically when editing libssh2 source files.\n\n(defconst libssh2-c-style\n  '((c-basic-offset . 4)\n    (c-comment-only-line-offset . 0)\n    (c-hanging-braces-alist     . ((substatement-open before after)))\n    (c-offsets-alist . ((topmost-intro        . 0)\n\t\t\t(topmost-intro-cont   . 0)\n\t\t\t(substatement         . +)\n\t\t\t(substatement-open    . 0)\n\t\t\t(statement-case-intro . +)\n\t\t\t(statement-case-open  . 0)\n\t\t\t(case-label           . 0)\n\t\t\t))\n    )\n  \"Libssh2 C Programming Style\")\n\n(defun libssh2-code-cleanup ()\n  \"tabify and delete trailing whitespace\"\n  (interactive)\n  (untabify (point-min) (point-max))\n  (delete-trailing-whitespace)\n)\n\n;; Customizations for all of c-mode, c++-mode, and objc-mode\n(defun libssh2-c-mode-common-hook ()\n  \"Libssh2 C mode hook\"\n  ;; add libssh2 style and set it for the current buffer\n  (c-add-style \"libssh2\" libssh2-c-style t)\n  (setq tab-width 8\n\tindent-tabs-mode nil\t\t; Use spaces, not tabs.\n\tcomment-column 40\n\tc-font-lock-extra-types (append '(\"libssh2_int64_t\" \"LIBSSH2_USERAUTH_KBDINT_PROMPT\" \"LIBSSH2_SESSION\" \"LIBSSH2_CHANNEL\" \"ssize_t\" \"size_t\" \"uint32_t\" \"LIBSSH2_LISTENER\" \"LIBSSH2_POLLFD\"))\n\t)\n  ;; keybindings for C, C++, and Objective-C.  We can put these in\n  ;; c-mode-base-map because of inheritance ...\n  (define-key c-mode-base-map \"\\M-q\" 'c-fill-paragraph)\n  (define-key c-mode-base-map \"\\M-m\" 'libssh2-code-cleanup)\n  (setq c-recognize-knr-p nil)\n  ;;; (add-hook 'write-file-hooks 'delete-trailing-whitespace t)\n  (setq show-trailing-whitespace t)\n  )\n\n;; Set this is in your .emacs if you want to use the c-mode-hook as\n;; defined here right out of the box.\n; (add-hook 'c-mode-common-hook 'libssh2-c-mode-common-hook)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/libssh2.pc.in",
    "content": "###########################################################################\n# libssh2 installation details\n###########################################################################\n\nprefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: libssh2\nURL: https://www.libssh2.org/\nDescription: Library for SSH-based communication\nVersion: @LIBSSH2VER@\nRequires.private: @LIBSREQUIRED@\nLibs: -L${libdir} -lssh2 @LIBS@\nLibs.private: @LIBS@\nCflags: -I${includedir}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/m4/.gitignore",
    "content": "libtool.m4\nltoptions.m4\nltsugar.m4\nltversion.m4\nlt~obsolete.m4\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/m4/autobuild.m4",
    "content": "# autobuild.m4 serial 3\n# Copyright (C) 2004, 2006 Simon Josefsson\n#\n# This file is free software, distributed under the terms of the GNU\n# General Public License.  As a special exception to the GNU General\n# Public License, this file may be distributed as part of a program\n# that contains a configuration script generated by Autoconf, under\n# the same distribution terms as the rest of that program.\n#\n# This file can can be used in projects which are not available under\n# the GNU General Public License or the GNU Library General Public\n# License but which still want to provide support for Autobuild.\n\n# Usage: AB_INIT([MODE]).\nAC_DEFUN([AB_INIT],\n[\n\tAC_REQUIRE([AC_CANONICAL_BUILD])\n\tAC_REQUIRE([AC_CANONICAL_HOST])\n\n\tif test -z \"$AB_PACKAGE\"; then\n\t   AB_PACKAGE=${PACKAGE_NAME:-$PACKAGE}\n\tfi\n\tAC_MSG_NOTICE([autobuild project... $AB_PACKAGE])\n\n\tif test -z \"$AB_VERSION\"; then\n\t   AB_VERSION=${PACKAGE_VERSION:-$VERSION}\n\tfi\n\tAC_MSG_NOTICE([autobuild revision... $AB_VERSION])\n\n\thostname=`hostname`\n\tif test \"$hostname\"; then\n\t   AC_MSG_NOTICE([autobuild hostname... $hostname])\n\tfi\n\n\tifelse([$1],[],,[AC_MSG_NOTICE([autobuild mode... $1])])\n\n\tdate=`date +%Y%m%d-%H%M%S`\n\tif test \"$?\" != 0; then\n\t   date=`date`\n\tfi\n\tif test \"$date\"; then\n\t   AC_MSG_NOTICE([autobuild timestamp... $date])\n\tfi\n])\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/m4/lib-ld.m4",
    "content": "# lib-ld.m4 serial 3 (gettext-0.13)\ndnl Copyright (C) 1996-2003 Free Software Foundation, Inc.\ndnl This file is free software; the Free Software Foundation\ndnl gives unlimited permission to copy and/or distribute it,\ndnl with or without modifications, as long as this notice is preserved.\n\ndnl Subroutines of libtool.m4,\ndnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision\ndnl with libtool.m4.\n\ndnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.\nAC_DEFUN([AC_LIB_PROG_LD_GNU],\n[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,\n[# I'd rather use --version here, but apparently some GNU ld's only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  acl_cv_prog_gnu_ld=yes ;;\n*)\n  acl_cv_prog_gnu_ld=no ;;\nesac])\nwith_gnu_ld=$acl_cv_prog_gnu_ld\n])\n\ndnl From libtool-1.4. Sets the variable LD.\nAC_DEFUN([AC_LIB_PROG_LD],\n[AC_ARG_WITH(gnu-ld,\n[  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]],\ntest \"$withval\" = no || with_gnu_ld=yes, with_gnu_ld=no)\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([AC_CANONICAL_HOST])dnl\n# Prepare PATH_SEPARATOR.\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  echo \"#! /bin/sh\" >conf$$.sh\n  echo  \"exit 0\"   >>conf$$.sh\n  chmod +x conf$$.sh\n  if (PATH=\"/nonexistent;.\"; conf$$.sh) >/dev/null 2>&1; then\n    PATH_SEPARATOR=';'\n  else\n    PATH_SEPARATOR=:\n  fi\n  rm -f conf$$.sh\nfi\nac_prog=ld\nif test \"$GCC\" = yes; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  AC_MSG_CHECKING([for ld used by GCC])\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [[\\\\/]* | [A-Za-z]:[\\\\/]*)]\n      [re_direlt='/[^/][^/]*/\\.\\./']\n      # Canonicalize the path of ld\n      ac_prog=`echo $ac_prog| sed 's%\\\\\\\\%/%g'`\n      while echo $ac_prog | grep \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`echo $ac_prog| sed \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test \"$with_gnu_ld\" = yes; then\n  AC_MSG_CHECKING([for GNU ld])\nelse\n  AC_MSG_CHECKING([for non-GNU ld])\nfi\nAC_CACHE_VAL(acl_cv_path_LD,\n[if test -z \"$LD\"; then\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\"${IFS}${PATH_SEPARATOR-:}\"\n  for ac_dir in $PATH; do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      acl_cv_path_LD=\"$ac_dir/$ac_prog\"\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some GNU ld's only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$acl_cv_path_LD\" -v 2>&1 < /dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest \"$with_gnu_ld\" != no && break ;;\n      *)\n\ttest \"$with_gnu_ld\" != yes && break ;;\n      esac\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\nelse\n  acl_cv_path_LD=\"$LD\" # Let the user override the test with a path.\nfi])\nLD=\"$acl_cv_path_LD\"\nif test -n \"$LD\"; then\n  AC_MSG_RESULT($LD)\nelse\n  AC_MSG_RESULT(no)\nfi\ntest -z \"$LD\" && AC_MSG_ERROR([no acceptable ld found in \\$PATH])\nAC_LIB_PROG_LD_GNU\n])\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/m4/lib-link.m4",
    "content": "# lib-link.m4 serial 13 (gettext-0.16.2)\ndnl Copyright (C) 2001-2007 Free Software Foundation, Inc.\ndnl This file is free software; the Free Software Foundation\ndnl gives unlimited permission to copy and/or distribute it,\ndnl with or without modifications, as long as this notice is preserved.\n\ndnl From Bruno Haible.\n\nAC_PREREQ(2.54)\n\ndnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and\ndnl the libraries corresponding to explicit and implicit dependencies.\ndnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and\ndnl augments the CPPFLAGS variable.\ndnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname\ndnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.\nAC_DEFUN([AC_LIB_LINKFLAGS],\n[\n  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])\n  AC_REQUIRE([AC_LIB_RPATH])\n  define([Name],[translit([$1],[./-], [___])])\n  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],\n                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])\n  AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [\n    AC_LIB_LINKFLAGS_BODY([$1], [$2])\n    ac_cv_lib[]Name[]_libs=\"$LIB[]NAME\"\n    ac_cv_lib[]Name[]_ltlibs=\"$LTLIB[]NAME\"\n    ac_cv_lib[]Name[]_cppflags=\"$INC[]NAME\"\n    ac_cv_lib[]Name[]_prefix=\"$LIB[]NAME[]_PREFIX\"\n  ])\n  LIB[]NAME=\"$ac_cv_lib[]Name[]_libs\"\n  LTLIB[]NAME=\"$ac_cv_lib[]Name[]_ltlibs\"\n  INC[]NAME=\"$ac_cv_lib[]Name[]_cppflags\"\n  LIB[]NAME[]_PREFIX=\"$ac_cv_lib[]Name[]_prefix\"\n  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)\n  AC_SUBST([LIB]NAME)\n  AC_SUBST([LTLIB]NAME)\n  AC_SUBST([LIB]NAME[_PREFIX])\n  dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the\n  dnl results of this search when this library appears as a dependency.\n  HAVE_LIB[]NAME=yes\n  undefine([Name])\n  undefine([NAME])\n])\n\ndnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)\ndnl searches for libname and the libraries corresponding to explicit and\ndnl implicit dependencies, together with the specified include files and\ndnl the ability to compile and link the specified testcode. If found, it\ndnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and\ndnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and\ndnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs\ndnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.\ndnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname\ndnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.\nAC_DEFUN([AC_LIB_HAVE_LINKFLAGS],\n[\n  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])\n  AC_REQUIRE([AC_LIB_RPATH])\n  define([Name],[translit([$1],[./-], [___])])\n  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],\n                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])\n\n  dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME\n  dnl accordingly.\n  AC_LIB_LINKFLAGS_BODY([$1], [$2])\n\n  dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,\n  dnl because if the user has installed lib[]Name and not disabled its use\n  dnl via --without-lib[]Name-prefix, he wants to use it.\n  ac_save_CPPFLAGS=\"$CPPFLAGS\"\n  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)\n\n  AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [\n    ac_save_LIBS=\"$LIBS\"\n    LIBS=\"$LIBS $LIB[]NAME\"\n    AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])\n    LIBS=\"$ac_save_LIBS\"\n  ])\n  if test \"$ac_cv_lib[]Name\" = yes; then\n    HAVE_LIB[]NAME=yes\n    AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])\n    AC_MSG_CHECKING([how to link with lib[]$1])\n    AC_MSG_RESULT([$LIB[]NAME])\n  else\n    HAVE_LIB[]NAME=no\n    dnl If $LIB[]NAME didn't lead to a usable library, we don't need\n    dnl $INC[]NAME either.\n    CPPFLAGS=\"$ac_save_CPPFLAGS\"\n    LIB[]NAME=\n    LTLIB[]NAME=\n    LIB[]NAME[]_PREFIX=\n  fi\n  AC_SUBST([HAVE_LIB]NAME)\n  AC_SUBST([LIB]NAME)\n  AC_SUBST([LTLIB]NAME)\n  AC_SUBST([LIB]NAME[_PREFIX])\n  undefine([Name])\n  undefine([NAME])\n])\n\ndnl Determine the platform dependent parameters needed to use rpath:\ndnl   acl_libext,\ndnl   acl_shlibext,\ndnl   acl_hardcode_libdir_flag_spec,\ndnl   acl_hardcode_libdir_separator,\ndnl   acl_hardcode_direct,\ndnl   acl_hardcode_minus_L.\nAC_DEFUN([AC_LIB_RPATH],\n[\n  dnl Tell automake >= 1.10 to complain if config.rpath is missing.\n  m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])\n  AC_REQUIRE([AC_PROG_CC])                dnl we use $CC, $GCC, $LDFLAGS\n  AC_REQUIRE([AC_LIB_PROG_LD])            dnl we use $LD, $with_gnu_ld\n  AC_REQUIRE([AC_CANONICAL_HOST])         dnl we use $host\n  AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir\n  AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [\n    CC=\"$CC\" GCC=\"$GCC\" LDFLAGS=\"$LDFLAGS\" LD=\"$LD\" with_gnu_ld=\"$with_gnu_ld\" \\\n    ${CONFIG_SHELL-/bin/sh} \"$ac_aux_dir/config.rpath\" \"$host\" > conftest.sh\n    . ./conftest.sh\n    rm -f ./conftest.sh\n    acl_cv_rpath=done\n  ])\n  wl=\"$acl_cv_wl\"\n  acl_libext=\"$acl_cv_libext\"\n  acl_shlibext=\"$acl_cv_shlibext\"\n  acl_libname_spec=\"$acl_cv_libname_spec\"\n  acl_library_names_spec=\"$acl_cv_library_names_spec\"\n  acl_hardcode_libdir_flag_spec=\"$acl_cv_hardcode_libdir_flag_spec\"\n  acl_hardcode_libdir_separator=\"$acl_cv_hardcode_libdir_separator\"\n  acl_hardcode_direct=\"$acl_cv_hardcode_direct\"\n  acl_hardcode_minus_L=\"$acl_cv_hardcode_minus_L\"\n  dnl Determine whether the user wants rpath handling at all.\n  AC_ARG_ENABLE(rpath,\n    [  --disable-rpath         do not hardcode runtime library paths],\n    :, enable_rpath=yes)\n])\n\ndnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and\ndnl the libraries corresponding to explicit and implicit dependencies.\ndnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.\ndnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found\ndnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.\nAC_DEFUN([AC_LIB_LINKFLAGS_BODY],\n[\n  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])\n  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],\n                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])\n  dnl Autoconf >= 2.61 supports dots in --with options.\n  define([N_A_M_E],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit([$1],[.],[_])],[$1])])\n  dnl By default, look in $includedir and $libdir.\n  use_additional=yes\n  AC_LIB_WITH_FINAL_PREFIX([\n    eval additional_includedir=\\\"$includedir\\\"\n    eval additional_libdir=\\\"$libdir\\\"\n  ])\n  AC_LIB_ARG_WITH([lib]N_A_M_E[-prefix],\n[  --with-lib]N_A_M_E[-prefix[=DIR]  search for lib$1 in DIR/include and DIR/lib\n  --without-lib]N_A_M_E[-prefix     don't search for lib$1 in includedir and libdir],\n[\n    if test \"X$withval\" = \"Xno\"; then\n      use_additional=no\n    else\n      if test \"X$withval\" = \"X\"; then\n        AC_LIB_WITH_FINAL_PREFIX([\n          eval additional_includedir=\\\"$includedir\\\"\n          eval additional_libdir=\\\"$libdir\\\"\n        ])\n      else\n        additional_includedir=\"$withval/include\"\n        additional_libdir=\"$withval/$acl_libdirstem\"\n      fi\n    fi\n])\n  dnl Search the library and its dependencies in $additional_libdir and\n  dnl $LDFLAGS. Using breadth-first-seach.\n  LIB[]NAME=\n  LTLIB[]NAME=\n  INC[]NAME=\n  LIB[]NAME[]_PREFIX=\n  rpathdirs=\n  ltrpathdirs=\n  names_already_handled=\n  names_next_round='$1 $2'\n  while test -n \"$names_next_round\"; do\n    names_this_round=\"$names_next_round\"\n    names_next_round=\n    for name in $names_this_round; do\n      already_handled=\n      for n in $names_already_handled; do\n        if test \"$n\" = \"$name\"; then\n          already_handled=yes\n          break\n        fi\n      done\n      if test -z \"$already_handled\"; then\n        names_already_handled=\"$names_already_handled $name\"\n        dnl See if it was already located by an earlier AC_LIB_LINKFLAGS\n        dnl or AC_LIB_HAVE_LINKFLAGS call.\n        uppername=`echo \"$name\" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`\n        eval value=\\\"\\$HAVE_LIB$uppername\\\"\n        if test -n \"$value\"; then\n          if test \"$value\" = yes; then\n            eval value=\\\"\\$LIB$uppername\\\"\n            test -z \"$value\" || LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$value\"\n            eval value=\\\"\\$LTLIB$uppername\\\"\n            test -z \"$value\" || LTLIB[]NAME=\"${LTLIB[]NAME}${LTLIB[]NAME:+ }$value\"\n          else\n            dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined\n            dnl that this library doesn't exist. So just drop it.\n            :\n          fi\n        else\n          dnl Search the library lib$name in $additional_libdir and $LDFLAGS\n          dnl and the already constructed $LIBNAME/$LTLIBNAME.\n          found_dir=\n          found_la=\n          found_so=\n          found_a=\n          eval libname=\\\"$acl_libname_spec\\\"    # typically: libname=lib$name\n          if test -n \"$acl_shlibext\"; then\n            shrext=\".$acl_shlibext\"             # typically: shrext=.so\n          else\n            shrext=\n          fi\n          if test $use_additional = yes; then\n            dir=\"$additional_libdir\"\n            dnl The same code as in the loop below:\n            dnl First look for a shared library.\n            if test -n \"$acl_shlibext\"; then\n              if test -f \"$dir/$libname$shrext\"; then\n                found_dir=\"$dir\"\n                found_so=\"$dir/$libname$shrext\"\n              else\n                if test \"$acl_library_names_spec\" = '$libname$shrext$versuffix'; then\n                  ver=`(cd \"$dir\" && \\\n                        for f in \"$libname$shrext\".*; do echo \"$f\"; done \\\n                        | sed -e \"s,^$libname$shrext\\\\\\\\.,,\" \\\n                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \\\n                        | sed 1q ) 2>/dev/null`\n                  if test -n \"$ver\" && test -f \"$dir/$libname$shrext.$ver\"; then\n                    found_dir=\"$dir\"\n                    found_so=\"$dir/$libname$shrext.$ver\"\n                  fi\n                else\n                  eval library_names=\\\"$acl_library_names_spec\\\"\n                  for f in $library_names; do\n                    if test -f \"$dir/$f\"; then\n                      found_dir=\"$dir\"\n                      found_so=\"$dir/$f\"\n                      break\n                    fi\n                  done\n                fi\n              fi\n            fi\n            dnl Then look for a static library.\n            if test \"X$found_dir\" = \"X\"; then\n              if test -f \"$dir/$libname.$acl_libext\"; then\n                found_dir=\"$dir\"\n                found_a=\"$dir/$libname.$acl_libext\"\n              fi\n            fi\n            if test \"X$found_dir\" != \"X\"; then\n              if test -f \"$dir/$libname.la\"; then\n                found_la=\"$dir/$libname.la\"\n              fi\n            fi\n          fi\n          if test \"X$found_dir\" = \"X\"; then\n            for x in $LDFLAGS $LTLIB[]NAME; do\n              AC_LIB_WITH_FINAL_PREFIX([eval x=\\\"$x\\\"])\n              case \"$x\" in\n                -L*)\n                  dir=`echo \"X$x\" | sed -e 's/^X-L//'`\n                  dnl First look for a shared library.\n                  if test -n \"$acl_shlibext\"; then\n                    if test -f \"$dir/$libname$shrext\"; then\n                      found_dir=\"$dir\"\n                      found_so=\"$dir/$libname$shrext\"\n                    else\n                      if test \"$acl_library_names_spec\" = '$libname$shrext$versuffix'; then\n                        ver=`(cd \"$dir\" && \\\n                              for f in \"$libname$shrext\".*; do echo \"$f\"; done \\\n                              | sed -e \"s,^$libname$shrext\\\\\\\\.,,\" \\\n                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \\\n                              | sed 1q ) 2>/dev/null`\n                        if test -n \"$ver\" && test -f \"$dir/$libname$shrext.$ver\"; then\n                          found_dir=\"$dir\"\n                          found_so=\"$dir/$libname$shrext.$ver\"\n                        fi\n                      else\n                        eval library_names=\\\"$acl_library_names_spec\\\"\n                        for f in $library_names; do\n                          if test -f \"$dir/$f\"; then\n                            found_dir=\"$dir\"\n                            found_so=\"$dir/$f\"\n                            break\n                          fi\n                        done\n                      fi\n                    fi\n                  fi\n                  dnl Then look for a static library.\n                  if test \"X$found_dir\" = \"X\"; then\n                    if test -f \"$dir/$libname.$acl_libext\"; then\n                      found_dir=\"$dir\"\n                      found_a=\"$dir/$libname.$acl_libext\"\n                    fi\n                  fi\n                  if test \"X$found_dir\" != \"X\"; then\n                    if test -f \"$dir/$libname.la\"; then\n                      found_la=\"$dir/$libname.la\"\n                    fi\n                  fi\n                  ;;\n              esac\n              if test \"X$found_dir\" != \"X\"; then\n                break\n              fi\n            done\n          fi\n          if test \"X$found_dir\" != \"X\"; then\n            dnl Found the library.\n            LTLIB[]NAME=\"${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name\"\n            if test \"X$found_so\" != \"X\"; then\n              dnl Linking with a shared library. We attempt to hardcode its\n              dnl directory into the executable's runpath, unless it's the\n              dnl standard /usr/lib.\n              if test \"$enable_rpath\" = no || test \"X$found_dir\" = \"X/usr/$acl_libdirstem\"; then\n                dnl No hardcoding is needed.\n                LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$found_so\"\n              else\n                dnl Use an explicit option to hardcode DIR into the resulting\n                dnl binary.\n                dnl Potentially add DIR to ltrpathdirs.\n                dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.\n                haveit=\n                for x in $ltrpathdirs; do\n                  if test \"X$x\" = \"X$found_dir\"; then\n                    haveit=yes\n                    break\n                  fi\n                done\n                if test -z \"$haveit\"; then\n                  ltrpathdirs=\"$ltrpathdirs $found_dir\"\n                fi\n                dnl The hardcoding into $LIBNAME is system dependent.\n                if test \"$acl_hardcode_direct\" = yes; then\n                  dnl Using DIR/libNAME.so during linking hardcodes DIR into the\n                  dnl resulting binary.\n                  LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$found_so\"\n                else\n                  if test -n \"$acl_hardcode_libdir_flag_spec\" && test \"$acl_hardcode_minus_L\" = no; then\n                    dnl Use an explicit option to hardcode DIR into the resulting\n                    dnl binary.\n                    LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$found_so\"\n                    dnl Potentially add DIR to rpathdirs.\n                    dnl The rpathdirs will be appended to $LIBNAME at the end.\n                    haveit=\n                    for x in $rpathdirs; do\n                      if test \"X$x\" = \"X$found_dir\"; then\n                        haveit=yes\n                        break\n                      fi\n                    done\n                    if test -z \"$haveit\"; then\n                      rpathdirs=\"$rpathdirs $found_dir\"\n                    fi\n                  else\n                    dnl Rely on \"-L$found_dir\".\n                    dnl But don't add it if it's already contained in the LDFLAGS\n                    dnl or the already constructed $LIBNAME\n                    haveit=\n                    for x in $LDFLAGS $LIB[]NAME; do\n                      AC_LIB_WITH_FINAL_PREFIX([eval x=\\\"$x\\\"])\n                      if test \"X$x\" = \"X-L$found_dir\"; then\n                        haveit=yes\n                        break\n                      fi\n                    done\n                    if test -z \"$haveit\"; then\n                      LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir\"\n                    fi\n                    if test \"$acl_hardcode_minus_L\" != no; then\n                      dnl FIXME: Not sure whether we should use\n                      dnl \"-L$found_dir -l$name\" or \"-L$found_dir $found_so\"\n                      dnl here.\n                      LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$found_so\"\n                    else\n                      dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH\n                      dnl here, because this doesn't fit in flags passed to the\n                      dnl compiler. So give up. No hardcoding. This affects only\n                      dnl very old systems.\n                      dnl FIXME: Not sure whether we should use\n                      dnl \"-L$found_dir -l$name\" or \"-L$found_dir $found_so\"\n                      dnl here.\n                      LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }-l$name\"\n                    fi\n                  fi\n                fi\n              fi\n            else\n              if test \"X$found_a\" != \"X\"; then\n                dnl Linking with a static library.\n                LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$found_a\"\n              else\n                dnl We shouldn't come here, but anyway it's good to have a\n                dnl fallback.\n                LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name\"\n              fi\n            fi\n            dnl Assume the include files are nearby.\n            additional_includedir=\n            case \"$found_dir\" in\n              */$acl_libdirstem | */$acl_libdirstem/)\n                basedir=`echo \"X$found_dir\" | sed -e 's,^X,,' -e \"s,/$acl_libdirstem/\"'*$,,'`\n                LIB[]NAME[]_PREFIX=\"$basedir\"\n                additional_includedir=\"$basedir/include\"\n                ;;\n            esac\n            if test \"X$additional_includedir\" != \"X\"; then\n              dnl Potentially add $additional_includedir to $INCNAME.\n              dnl But don't add it\n              dnl   1. if it's the standard /usr/include,\n              dnl   2. if it's /usr/local/include and we are using GCC on Linux,\n              dnl   3. if it's already present in $CPPFLAGS or the already\n              dnl      constructed $INCNAME,\n              dnl   4. if it doesn't exist as a directory.\n              if test \"X$additional_includedir\" != \"X/usr/include\"; then\n                haveit=\n                if test \"X$additional_includedir\" = \"X/usr/local/include\"; then\n                  if test -n \"$GCC\"; then\n                    case $host_os in\n                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;\n                    esac\n                  fi\n                fi\n                if test -z \"$haveit\"; then\n                  for x in $CPPFLAGS $INC[]NAME; do\n                    AC_LIB_WITH_FINAL_PREFIX([eval x=\\\"$x\\\"])\n                    if test \"X$x\" = \"X-I$additional_includedir\"; then\n                      haveit=yes\n                      break\n                    fi\n                  done\n                  if test -z \"$haveit\"; then\n                    if test -d \"$additional_includedir\"; then\n                      dnl Really add $additional_includedir to $INCNAME.\n                      INC[]NAME=\"${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir\"\n                    fi\n                  fi\n                fi\n              fi\n            fi\n            dnl Look for dependencies.\n            if test -n \"$found_la\"; then\n              dnl Read the .la file. It defines the variables\n              dnl dlname, library_names, old_library, dependency_libs, current,\n              dnl age, revision, installed, dlopen, dlpreopen, libdir.\n              save_libdir=\"$libdir\"\n              case \"$found_la\" in\n                */* | *\\\\*) . \"$found_la\" ;;\n                *) . \"./$found_la\" ;;\n              esac\n              libdir=\"$save_libdir\"\n              dnl We use only dependency_libs.\n              for dep in $dependency_libs; do\n                case \"$dep\" in\n                  -L*)\n                    additional_libdir=`echo \"X$dep\" | sed -e 's/^X-L//'`\n                    dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.\n                    dnl But don't add it\n                    dnl   1. if it's the standard /usr/lib,\n                    dnl   2. if it's /usr/local/lib and we are using GCC on Linux,\n                    dnl   3. if it's already present in $LDFLAGS or the already\n                    dnl      constructed $LIBNAME,\n                    dnl   4. if it doesn't exist as a directory.\n                    if test \"X$additional_libdir\" != \"X/usr/$acl_libdirstem\"; then\n                      haveit=\n                      if test \"X$additional_libdir\" = \"X/usr/local/$acl_libdirstem\"; then\n                        if test -n \"$GCC\"; then\n                          case $host_os in\n                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;\n                          esac\n                        fi\n                      fi\n                      if test -z \"$haveit\"; then\n                        haveit=\n                        for x in $LDFLAGS $LIB[]NAME; do\n                          AC_LIB_WITH_FINAL_PREFIX([eval x=\\\"$x\\\"])\n                          if test \"X$x\" = \"X-L$additional_libdir\"; then\n                            haveit=yes\n                            break\n                          fi\n                        done\n                        if test -z \"$haveit\"; then\n                          if test -d \"$additional_libdir\"; then\n                            dnl Really add $additional_libdir to $LIBNAME.\n                            LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir\"\n                          fi\n                        fi\n                        haveit=\n                        for x in $LDFLAGS $LTLIB[]NAME; do\n                          AC_LIB_WITH_FINAL_PREFIX([eval x=\\\"$x\\\"])\n                          if test \"X$x\" = \"X-L$additional_libdir\"; then\n                            haveit=yes\n                            break\n                          fi\n                        done\n                        if test -z \"$haveit\"; then\n                          if test -d \"$additional_libdir\"; then\n                            dnl Really add $additional_libdir to $LTLIBNAME.\n                            LTLIB[]NAME=\"${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir\"\n                          fi\n                        fi\n                      fi\n                    fi\n                    ;;\n                  -R*)\n                    dir=`echo \"X$dep\" | sed -e 's/^X-R//'`\n                    if test \"$enable_rpath\" != no; then\n                      dnl Potentially add DIR to rpathdirs.\n                      dnl The rpathdirs will be appended to $LIBNAME at the end.\n                      haveit=\n                      for x in $rpathdirs; do\n                        if test \"X$x\" = \"X$dir\"; then\n                          haveit=yes\n                          break\n                        fi\n                      done\n                      if test -z \"$haveit\"; then\n                        rpathdirs=\"$rpathdirs $dir\"\n                      fi\n                      dnl Potentially add DIR to ltrpathdirs.\n                      dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.\n                      haveit=\n                      for x in $ltrpathdirs; do\n                        if test \"X$x\" = \"X$dir\"; then\n                          haveit=yes\n                          break\n                        fi\n                      done\n                      if test -z \"$haveit\"; then\n                        ltrpathdirs=\"$ltrpathdirs $dir\"\n                      fi\n                    fi\n                    ;;\n                  -l*)\n                    dnl Handle this in the next round.\n                    names_next_round=\"$names_next_round \"`echo \"X$dep\" | sed -e 's/^X-l//'`\n                    ;;\n                  *.la)\n                    dnl Handle this in the next round. Throw away the .la's\n                    dnl directory; it is already contained in a preceding -L\n                    dnl option.\n                    names_next_round=\"$names_next_round \"`echo \"X$dep\" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\\.la$,,'`\n                    ;;\n                  *)\n                    dnl Most likely an immediate library name.\n                    LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$dep\"\n                    LTLIB[]NAME=\"${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep\"\n                    ;;\n                esac\n              done\n            fi\n          else\n            dnl Didn't find the library; assume it is in the system directories\n            dnl known to the linker and runtime loader. (All the system\n            dnl directories known to the linker should also be known to the\n            dnl runtime loader, otherwise the system is severely misconfigured.)\n            LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }-l$name\"\n            LTLIB[]NAME=\"${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name\"\n          fi\n        fi\n      fi\n    done\n  done\n  if test \"X$rpathdirs\" != \"X\"; then\n    if test -n \"$acl_hardcode_libdir_separator\"; then\n      dnl Weird platform: only the last -rpath option counts, the user must\n      dnl pass all path elements in one option. We can arrange that for a\n      dnl single library, but not when more than one $LIBNAMEs are used.\n      alldirs=\n      for found_dir in $rpathdirs; do\n        alldirs=\"${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir\"\n      done\n      dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.\n      acl_save_libdir=\"$libdir\"\n      libdir=\"$alldirs\"\n      eval flag=\\\"$acl_hardcode_libdir_flag_spec\\\"\n      libdir=\"$acl_save_libdir\"\n      LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$flag\"\n    else\n      dnl The -rpath options are cumulative.\n      for found_dir in $rpathdirs; do\n        acl_save_libdir=\"$libdir\"\n        libdir=\"$found_dir\"\n        eval flag=\\\"$acl_hardcode_libdir_flag_spec\\\"\n        libdir=\"$acl_save_libdir\"\n        LIB[]NAME=\"${LIB[]NAME}${LIB[]NAME:+ }$flag\"\n      done\n    fi\n  fi\n  if test \"X$ltrpathdirs\" != \"X\"; then\n    dnl When using libtool, the option that works for both libraries and\n    dnl executables is -R. The -R options are cumulative.\n    for found_dir in $ltrpathdirs; do\n      LTLIB[]NAME=\"${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir\"\n    done\n  fi\n])\n\ndnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,\ndnl unless already present in VAR.\ndnl Works only for CPPFLAGS, not for LIB* variables because that sometimes\ndnl contains two or three consecutive elements that belong together.\nAC_DEFUN([AC_LIB_APPENDTOVAR],\n[\n  for element in [$2]; do\n    haveit=\n    for x in $[$1]; do\n      AC_LIB_WITH_FINAL_PREFIX([eval x=\\\"$x\\\"])\n      if test \"X$x\" = \"X$element\"; then\n        haveit=yes\n        break\n      fi\n    done\n    if test -z \"$haveit\"; then\n      [$1]=\"${[$1]}${[$1]:+ }$element\"\n    fi\n  done\n])\n\ndnl For those cases where a variable contains several -L and -l options\ndnl referring to unknown libraries and directories, this macro determines the\ndnl necessary additional linker options for the runtime path.\ndnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])\ndnl sets LDADDVAR to linker options needed together with LIBSVALUE.\ndnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,\ndnl otherwise linking without libtool is assumed.\nAC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],\n[\n  AC_REQUIRE([AC_LIB_RPATH])\n  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])\n  $1=\n  if test \"$enable_rpath\" != no; then\n    if test -n \"$acl_hardcode_libdir_flag_spec\" && test \"$acl_hardcode_minus_L\" = no; then\n      dnl Use an explicit option to hardcode directories into the resulting\n      dnl binary.\n      rpathdirs=\n      next=\n      for opt in $2; do\n        if test -n \"$next\"; then\n          dir=\"$next\"\n          dnl No need to hardcode the standard /usr/lib.\n          if test \"X$dir\" != \"X/usr/$acl_libdirstem\"; then\n            rpathdirs=\"$rpathdirs $dir\"\n          fi\n          next=\n        else\n          case $opt in\n            -L) next=yes ;;\n            -L*) dir=`echo \"X$opt\" | sed -e 's,^X-L,,'`\n                 dnl No need to hardcode the standard /usr/lib.\n                 if test \"X$dir\" != \"X/usr/$acl_libdirstem\"; then\n                   rpathdirs=\"$rpathdirs $dir\"\n                 fi\n                 next= ;;\n            *) next= ;;\n          esac\n        fi\n      done\n      if test \"X$rpathdirs\" != \"X\"; then\n        if test -n \"\"$3\"\"; then\n          dnl libtool is used for linking. Use -R options.\n          for dir in $rpathdirs; do\n            $1=\"${$1}${$1:+ }-R$dir\"\n          done\n        else\n          dnl The linker is used for linking directly.\n          if test -n \"$acl_hardcode_libdir_separator\"; then\n            dnl Weird platform: only the last -rpath option counts, the user\n            dnl must pass all path elements in one option.\n            alldirs=\n            for dir in $rpathdirs; do\n              alldirs=\"${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir\"\n            done\n            acl_save_libdir=\"$libdir\"\n            libdir=\"$alldirs\"\n            eval flag=\\\"$acl_hardcode_libdir_flag_spec\\\"\n            libdir=\"$acl_save_libdir\"\n            $1=\"$flag\"\n          else\n            dnl The -rpath options are cumulative.\n            for dir in $rpathdirs; do\n              acl_save_libdir=\"$libdir\"\n              libdir=\"$dir\"\n              eval flag=\\\"$acl_hardcode_libdir_flag_spec\\\"\n              libdir=\"$acl_save_libdir\"\n              $1=\"${$1}${$1:+ }$flag\"\n            done\n          fi\n        fi\n      fi\n    fi\n  fi\n  AC_SUBST([$1])\n])\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/m4/lib-prefix.m4",
    "content": "# lib-prefix.m4 serial 5 (gettext-0.15)\ndnl Copyright (C) 2001-2005 Free Software Foundation, Inc.\ndnl This file is free software; the Free Software Foundation\ndnl gives unlimited permission to copy and/or distribute it,\ndnl with or without modifications, as long as this notice is preserved.\n\ndnl From Bruno Haible.\n\ndnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and\ndnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't\ndnl require excessive bracketing.\nifdef([AC_HELP_STRING],\n[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],\n[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])\n\ndnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed\ndnl to access previously installed libraries. The basic assumption is that\ndnl a user will want packages to use other packages he previously installed\ndnl with the same --prefix option.\ndnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate\ndnl libraries, but is otherwise very convenient.\nAC_DEFUN([AC_LIB_PREFIX],\n[\n  AC_BEFORE([$0], [AC_LIB_LINKFLAGS])\n  AC_REQUIRE([AC_PROG_CC])\n  AC_REQUIRE([AC_CANONICAL_HOST])\n  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])\n  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])\n  dnl By default, look in $includedir and $libdir.\n  use_additional=yes\n  AC_LIB_WITH_FINAL_PREFIX([\n    eval additional_includedir=\\\"$includedir\\\"\n    eval additional_libdir=\\\"$libdir\\\"\n  ])\n  AC_LIB_ARG_WITH([lib-prefix],\n[  --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib\n  --without-lib-prefix    don't search for libraries in includedir and libdir],\n[\n    if test \"X$withval\" = \"Xno\"; then\n      use_additional=no\n    else\n      if test \"X$withval\" = \"X\"; then\n        AC_LIB_WITH_FINAL_PREFIX([\n          eval additional_includedir=\\\"$includedir\\\"\n          eval additional_libdir=\\\"$libdir\\\"\n        ])\n      else\n        additional_includedir=\"$withval/include\"\n        additional_libdir=\"$withval/$acl_libdirstem\"\n      fi\n    fi\n])\n  if test $use_additional = yes; then\n    dnl Potentially add $additional_includedir to $CPPFLAGS.\n    dnl But don't add it\n    dnl   1. if it's the standard /usr/include,\n    dnl   2. if it's already present in $CPPFLAGS,\n    dnl   3. if it's /usr/local/include and we are using GCC on Linux,\n    dnl   4. if it doesn't exist as a directory.\n    if test \"X$additional_includedir\" != \"X/usr/include\"; then\n      haveit=\n      for x in $CPPFLAGS; do\n        AC_LIB_WITH_FINAL_PREFIX([eval x=\\\"$x\\\"])\n        if test \"X$x\" = \"X-I$additional_includedir\"; then\n          haveit=yes\n          break\n        fi\n      done\n      if test -z \"$haveit\"; then\n        if test \"X$additional_includedir\" = \"X/usr/local/include\"; then\n          if test -n \"$GCC\"; then\n            case $host_os in\n              linux* | gnu* | k*bsd*-gnu) haveit=yes;;\n            esac\n          fi\n        fi\n        if test -z \"$haveit\"; then\n          if test -d \"$additional_includedir\"; then\n            dnl Really add $additional_includedir to $CPPFLAGS.\n            CPPFLAGS=\"${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir\"\n          fi\n        fi\n      fi\n    fi\n    dnl Potentially add $additional_libdir to $LDFLAGS.\n    dnl But don't add it\n    dnl   1. if it's the standard /usr/lib,\n    dnl   2. if it's already present in $LDFLAGS,\n    dnl   3. if it's /usr/local/lib and we are using GCC on Linux,\n    dnl   4. if it doesn't exist as a directory.\n    if test \"X$additional_libdir\" != \"X/usr/$acl_libdirstem\"; then\n      haveit=\n      for x in $LDFLAGS; do\n        AC_LIB_WITH_FINAL_PREFIX([eval x=\\\"$x\\\"])\n        if test \"X$x\" = \"X-L$additional_libdir\"; then\n          haveit=yes\n          break\n        fi\n      done\n      if test -z \"$haveit\"; then\n        if test \"X$additional_libdir\" = \"X/usr/local/$acl_libdirstem\"; then\n          if test -n \"$GCC\"; then\n            case $host_os in\n              linux*) haveit=yes;;\n            esac\n          fi\n        fi\n        if test -z \"$haveit\"; then\n          if test -d \"$additional_libdir\"; then\n            dnl Really add $additional_libdir to $LDFLAGS.\n            LDFLAGS=\"${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir\"\n          fi\n        fi\n      fi\n    fi\n  fi\n])\n\ndnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,\ndnl acl_final_exec_prefix, containing the values to which $prefix and\ndnl $exec_prefix will expand at the end of the configure script.\nAC_DEFUN([AC_LIB_PREPARE_PREFIX],\n[\n  dnl Unfortunately, prefix and exec_prefix get only finally determined\n  dnl at the end of configure.\n  if test \"X$prefix\" = \"XNONE\"; then\n    acl_final_prefix=\"$ac_default_prefix\"\n  else\n    acl_final_prefix=\"$prefix\"\n  fi\n  if test \"X$exec_prefix\" = \"XNONE\"; then\n    acl_final_exec_prefix='${prefix}'\n  else\n    acl_final_exec_prefix=\"$exec_prefix\"\n  fi\n  acl_save_prefix=\"$prefix\"\n  prefix=\"$acl_final_prefix\"\n  eval acl_final_exec_prefix=\\\"$acl_final_exec_prefix\\\"\n  prefix=\"$acl_save_prefix\"\n])\n\ndnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the\ndnl variables prefix and exec_prefix bound to the values they will have\ndnl at the end of the configure script.\nAC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],\n[\n  acl_save_prefix=\"$prefix\"\n  prefix=\"$acl_final_prefix\"\n  acl_save_exec_prefix=\"$exec_prefix\"\n  exec_prefix=\"$acl_final_exec_prefix\"\n  $1\n  exec_prefix=\"$acl_save_exec_prefix\"\n  prefix=\"$acl_save_prefix\"\n])\n\ndnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing\ndnl the basename of the libdir, either \"lib\" or \"lib64\".\nAC_DEFUN([AC_LIB_PREPARE_MULTILIB],\n[\n  dnl There is no formal standard regarding lib and lib64. The current\n  dnl practice is that on a system supporting 32-bit and 64-bit instruction\n  dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit\n  dnl libraries go under $prefix/lib. We determine the compiler's default\n  dnl mode by looking at the compiler's library search path. If at least\n  dnl of its elements ends in /lib64 or points to a directory whose absolute\n  dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the\n  dnl default, namely \"lib\".\n  acl_libdirstem=lib\n  searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`\n  if test -n \"$searchpath\"; then\n    acl_save_IFS=\"${IFS= \t}\"; IFS=\":\"\n    for searchdir in $searchpath; do\n      if test -d \"$searchdir\"; then\n        case \"$searchdir\" in\n          */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;\n          *) searchdir=`cd \"$searchdir\" && pwd`\n             case \"$searchdir\" in\n               */lib64 ) acl_libdirstem=lib64 ;;\n             esac ;;\n        esac\n      fi\n    done\n    IFS=\"$acl_save_IFS\"\n  fi\n])\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/maketgz",
    "content": "#! /bin/sh\n# Script to build release-archives with\n#\n\nversion=$1\n\nif [ -z \"$version\" ]; then\n  echo \"Specify a version number!\"\n  exit\nfi\n\nif [ \"xonly\" = \"x$2\" ]; then\n    echo \"Setup version number only!\"\n    only=1\nfi\n\nlibversion=\"$version\"\n\nmajor=`echo $libversion |cut -d. -f1 | sed -e \"s/[^0-9]//g\"`\nminor=`echo $libversion |cut -d. -f2 | sed -e \"s/[^0-9]//g\"`\npatch=`echo $libversion |cut -d. -f3 | cut -d- -f1 | sed -e \"s/[^0-9]//g\"`\n\nnumeric=`perl -e 'printf(\"%02x%02x%02x\\n\", '\"$major, $minor, $patch);\"`\n\nHEADER=include/libssh2.h\n\nif test -z \"$only\"; then\n    ext=\".dist\"\n    # when not setting up version numbers locally\n    for a in $HEADER; do\n        cp $a \"$a$ext\"\n    done\n    HEADER=\"$HEADER$ext\"\nfi\n\n# requires a date command that knows -u for UTC time zone\ndatestamp=`LC_TIME=C date -u`\n\n# Replace in-place version number in header file:\nsed -i -e 's/^#define LIBSSH2_VERSION .*/#define LIBSSH2_VERSION \"'$libversion'\"/g' \\\n    -e 's/^#define LIBSSH2_VERSION_NUM .*/#define LIBSSH2_VERSION_NUM 0x'$numeric'/g' \\\n    -e 's/^#define LIBSSH2_VERSION_MAJOR .*/#define LIBSSH2_VERSION_MAJOR '$major'/g' \\\n    -e 's/^#define LIBSSH2_VERSION_MINOR .*/#define LIBSSH2_VERSION_MINOR '$minor'/g' \\\n    -e 's/^#define LIBSSH2_VERSION_PATCH .*/#define LIBSSH2_VERSION_PATCH '$patch'/g' \\\n    -e \"s/^#define LIBSSH2_TIMESTAMP .*/#define LIBSSH2_TIMESTAMP \\\"$datestamp\\\"/g\" \\\n $HEADER\n\necho \"libssh2 version $libversion\"\necho \"libssh2 numerical $numeric\"\necho \"datestamp $datestamp\"\n\nif test -n \"$only\"; then\n    # done!\n    exit;\nfi\n\nfindprog()\n{\n  file=\"$1\"\n  for part in `echo $PATH| tr ':' ' '`; do\n    path=\"$part/$file\"\n    if [ -x \"$path\" ]; then\n      # there it is!\n      return 1\n    fi\n  done\n\n  # no such executable\n  return 0\n}\n\n############################################################################\n#\n# automake is needed to run to make a non-GNU Makefile.in if Makefile.am has\n# been modified.\n#\n\nif { findprog automake >/dev/null 2>/dev/null; } then\n  echo \"- Could not find or run automake, I hope you know what you're doing!\"\nelse\n  echo \"Runs automake --include-deps\"\n  automake --include-deps Makefile >/dev/null\nfi\n\n#######################################################################\n#\n# Generate the changelog\n#\necho \"generate NEWS\"\ngit log --pretty=fuller --no-color --date=short --decorate=full -1000 | ./git2news.pl > NEWS.dist\n\n############################################################################\n#\n# Now run make dist to generate a tar.gz archive\n#\n\necho \"make dist\"\ntargz=\"libssh2-$version.tar.gz\"\nmake -s dist VERSION=$version\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/nw/GNUmakefile",
    "content": "#########################################################################\n#\n## Makefile for building libssh2 (NetWare version - gnu make)\n## Use: make [help|all|clean|dev|devclean|dist|distclean|lib|nlm|objclean]\n##\n## Hacked by: Guenter Knauf\n#\n#########################################################################\n\n# Edit the path below to point to the base of your Novell NDK.\nifndef NDKBASE\nNDKBASE\t= c:/novell\nendif\n\n# Edit the path below to point to the base of your Zlib sources.\nifndef ZLIB_PATH\nZLIB_PATH = ../../zlib-1.2.8\nendif\n\n# Edit the path below to point to the base of your OpenSSL package.\nifndef OPENSSL_PATH\nOPENSSL_PATH = ../../openssl-0.9.8zc\nendif\n\n# Edit the path below to point to your Distribution folder.\nifndef DISTDIR\nDISTDIR\t= libssh2-$(LIBSSH2_VERSION_STR)-bin-nw\nendif\nDISTARC\t= $(DISTDIR).zip\n\n# Edit the path below to point to your Development folder.\nifndef DEVLDIR\nDEVLDIR\t= libssh2-$(LIBSSH2_VERSION_STR)-dev-nw\nendif\nDEVLARC\t= $(DEVLDIR).zip\n\n# Edit the vars below to change NLM target settings.\nTARGET\t= libssh2\nVERSION\t= $(LIBSSH2_VERSION)\nCPRIGHT\t= Copyright (c) $(LIBSSH2_COPYRIGHT_STR)\nWWWURL\t= https://www.libssh2.org/\nDESCR\t= libssh2 $(LIBSSH2_VERSION_STR) ($(LIBARCH)) - $(WWWURL)\nMTSAFE\t= YES\nSTACK\t= 64000\nSCREEN\t= none\nEXPORTS\t= @$(TARGET).imp\n\n# Edit the var below to point to your lib architecture.\nifndef LIBARCH\nLIBARCH = LIBC\nendif\n\n# must be equal to DEBUG or NDEBUG\nifndef DB\n\tDB\t= NDEBUG\n\t# DB\t= DEBUG\nendif\n# Optimization: -O<n> or debugging: -g\nifeq ($(DB),NDEBUG)\n\tOPT\t= -O2\n\tOBJDIR\t= release\nelse\n\tOPT\t= -g\n\tOPT\t+= -DLIBSSH2DEBUG\n\tOBJDIR\t= debug\nendif\n\n# The following lines defines your compiler.\nifdef CWFolder\n\tMETROWERKS = $(CWFolder)\nendif\nifdef METROWERKS\n\t# MWCW_PATH = $(subst \\,/,$(METROWERKS))/Novell Support\n\tMWCW_PATH = $(subst \\,/,$(METROWERKS))/Novell Support/Metrowerks Support\n\tCC = mwccnlm\nelse\n\tCC = $(CROSSPREFIX)gcc\nendif\n\n# Here you can find a native Win32 binary of the original awk:\n# http://www.gknw.net/development/prgtools/awk-20100523.zip\nAWK\t= awk\n# If you want to mark the target as MTSAFE you will need a tool for\n# generating the xdc data for the linker; here's a minimal tool:\n# http://www.gknw.net/development/prgtools/mkxdc.zip\nMPKXDC\t= mkxdc\nZIP\t= zip -qzr9\n\n# Platform-dependent helper tool macros\nifeq ($(findstring /sh,$(SHELL)),/sh)\nDEL\t= rm -f $1\nRMDIR\t= rm -fr $1\nMKDIR\t= mkdir -p $1\nCOPY\t= -cp -afv $1 $2\n#COPYR\t= -cp -afr $1/* $2\nCOPYR\t= -rsync -aC $1/* $2\nTOUCH\t= touch $1\nCAT\t= cat\nECHONL\t= echo \"\"\nDL\t= '\nelse\nifeq \"$(OS)\" \"Windows_NT\"\nDEL\t= -del 2>NUL /q /f $(subst /,\\,$1)\nRMDIR\t= -rd 2>NUL /q /s $(subst /,\\,$1)\nelse\nDEL\t= -del 2>NUL $(subst /,\\,$1)\nRMDIR\t= -deltree 2>NUL /y $(subst /,\\,$1)\nendif     \nMKDIR\t= -md 2>NUL $(subst /,\\,$1)\nCOPY\t= -copy 2>NUL /y $(subst /,\\,$1) $(subst /,\\,$2)\nCOPYR\t= -xcopy 2>NUL /q /y /e $(subst /,\\,$1) $(subst /,\\,$2)\nTOUCH\t= copy 2>&1>NUL /b $(subst /,\\,$1) +,,\nCAT\t= type\nECHONL\t= $(ComSpec) /c echo.\nendif\n\n# LIBARCH_U = $(shell $(AWK) 'BEGIN {print toupper(ARGV[1])}' $(LIBARCH))\nLIBARCH_L = $(shell $(AWK) 'BEGIN {print tolower(ARGV[1])}' $(LIBARCH))\n\n# Include the version info retrieved from libssh2.h\n-include $(OBJDIR)/version.inc\n\n# Global flags for all compilers\nCFLAGS\t+= $(OPT) -D$(DB) -DNETWARE -nostdinc\n#CFLAGS\t+= -DHAVE_CONFIG_H\n\nifeq ($(CC),mwccnlm)\nLD\t= mwldnlm\nLDFLAGS\t= -nostdlib $(PRELUDE) $(OBJL) -o $@ -commandfile\nAR\t= mwldnlm\nARFLAGS\t= -nostdlib -type library -o\nLIBEXT\t= lib\nCFLAGS\t+= -msgstyle gcc -gccinc -inline on -opt nointrinsics -proc 586\nCFLAGS\t+= -relax_pointers\n#CFLAGS\t+= -w on\nifeq ($(LIBARCH),LIBC)\n\tPRELUDE = $(SDK_LIBC)/imports/libcpre.o\n\tCFLAGS += -align 4\nelse\n\t# PRELUDE = $(SDK_CLIB)/imports/clibpre.o\n\t# to avoid the __init_* / __deinit_* whoes dont use prelude from NDK\n\tPRELUDE = \"$(MWCW_PATH)/libraries/runtime/prelude.obj\"\n\t# CFLAGS += -include \"$(MWCW_PATH)/headers/nlm_clib_prefix.h\"\n\tCFLAGS += -align 1\nendif\nelse\nLD\t= $(CROSSPREFIX)nlmconv\nLDFLAGS\t= -UT\nAR\t= $(CROSSPREFIX)ar\nARFLAGS\t= -cq\nLIBEXT\t= a\nRANLIB\t= $(CROSSPREFIX)ranlib\nCFLAGS\t+= -m32\nCFLAGS\t+= -fno-builtin -fpcc-struct-return\nCFLAGS\t+= -fno-strict-aliasing\nCFLAGS\t+= -Wall # -pedantic\n#CFLAGS\t+= -Wno-pointer-sign\nifeq ($(LIBARCH),LIBC)\n\tPRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o\nelse\n\t# PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o\n\t# to avoid the __init_* / __deinit_* whoes dont use prelude from NDK\n\t# http://www.gknw.net/development/mk_nlm/gcc_pre.zip\n\tPRELUDE = $(NDK_ROOT)/pre/prelude.o\n\tCFLAGS += -include $(NDKBASE)/nlmconv/genlm.h\nendif\nendif\n\nLDLIBS\t=\n\nNDK_ROOT = $(NDKBASE)/ndk\nSDK_CLIB = $(NDK_ROOT)/nwsdk\nSDK_LIBC = $(NDK_ROOT)/libc\nSNPRINTF = $(NDKBASE)/snprintf\n\nINCLUDES = -I. -I../include\n\nifdef WITH_ZLIB\n\tINCLUDES += -I$(ZLIB_PATH)\nifdef LINK_STATIC\n\tLDLIBS += $(ZLIB_PATH)/nw/$(LIBARCH)/libz.$(LIBEXT)\nelse\n\tMODULES += libz.nlm\n\tIMPORTS += @$(ZLIB_PATH)/nw/$(LIBARCH)/libz.imp\nendif\nendif\nINCLUDES += -I$(OPENSSL_PATH)/outinc_nw_$(LIBARCH_L)\nLDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/ssl.$(LIBEXT)\nLDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/crypto.$(LIBEXT)\nIMPORTS += GetProcessSwitchCount RunningProcess\n\nifeq ($(LIBARCH),LIBC)\n\tINCLUDES += -I$(SDK_LIBC)/include\n\t# INCLUDES += -I$(SDK_LIBC)/include/nks\n\t# INCLUDES += -I$(SDK_LIBC)/include/winsock\n\tCFLAGS += -D_POSIX_SOURCE\nelse\n\tINCLUDES += -I$(SDK_CLIB)/include/nlm\n\t# INCLUDES += -I$(SDK_CLIB)/include/nlm/obsolete\n\t# INCLUDES += -I$(SDK_CLIB)/include\nendif\nCFLAGS\t+= $(INCLUDES)\n\nifeq ($(MTSAFE),YES)\n\tXDCOPT = -n\nendif\nifeq ($(MTSAFE),NO)\n\tXDCOPT = -u\nendif\nifdef XDCOPT\n\tXDCDATA = $(OBJDIR)/$(TARGET).xdc\nendif\n\nvpath %.c . ../src\n\n# only OpenSSL is supported with this build system\nCFLAGS += -DLIBSSH2_OPENSSL\ninclude ../Makefile.OpenSSL.inc\n\n# include Makefile.inc to get CSOURCES define\ninclude ../Makefile.inc\n\nOBJECTS := $(patsubst %.c,%.o,$(CSOURCES))\nifeq ($(LIBARCH),CLIB)\n# CLIB lacks of snprint() function - here's a replacement:\n# https://www.ijs.si/software/snprintf/\nOBJECTS += snprintf.o\nvpath %.c $(SNPRINTF)\nendif\n\nOBJS\t:= $(addprefix $(OBJDIR)/,$(OBJECTS))\nOBJL\t= $(OBJS) $(OBJDIR)/nwlib.o $(LDLIBS)\n\nall: lib nlm\n\nnlm: prebuild $(TARGET).nlm\n\nlib: prebuild $(TARGET).$(LIBEXT)\n\nprebuild: $(OBJDIR) $(OBJDIR)/version.inc libssh2_config.h\n\ntest: all\n\t$(MAKE) -C test\n\n$(OBJDIR)/%.o: %.c\n#\t@echo Compiling $<\n\t$(CC) $(CFLAGS) -c $< -o $@\n\n$(OBJDIR)/version.inc: ../get_ver.awk ../include/libssh2.h $(OBJDIR)\n\t@echo Creating $@\n\t@$(AWK) -f $^ > $@\n\ndist: all $(DISTDIR) $(DISTDIR)/readme.txt\n\t@$(call MKDIR, $(DISTDIR)/bin)\n\t@$(call COPY, ../AUTHORS, $(DISTDIR))\n\t@$(call COPY, ../COPYING, $(DISTDIR))\n\t@$(call COPY, ../INSTALL, $(DISTDIR))\n\t@$(call COPY, ../README, $(DISTDIR))\n\t@$(call COPY, ../RELEASE-NOTES, $(DISTDIR))\n\t@$(call COPY, $(TARGET).nlm, $(DISTDIR)/bin)\n\t@echo Creating $(DISTARC)\n\t@$(ZIP) $(DISTARC) $(DISTDIR)/* < $(DISTDIR)/readme.txt\n\ndev: all $(DEVLDIR) $(DEVLDIR)/readme.txt\n\t@$(call MKDIR, $(DEVLDIR)/bin)\n\t@$(call MKDIR, $(DEVLDIR)/include)\n\t@$(call MKDIR, $(DEVLDIR)/nw)\n\t@$(call COPY, ../AUTHORS, $(DEVLDIR))\n\t@$(call COPY, ../COPYING, $(DEVLDIR))\n\t@$(call COPY, ../INSTALL, $(DEVLDIR))\n\t@$(call COPY, ../README, $(DEVLDIR))\n\t@$(call COPY, ../RELEASE-NOTES, $(DEVLDIR))\n\t@$(call COPY, ../include/*.h, $(DEVLDIR)/include)\n\t@$(call COPY, libssh2_config.h, $(DEVLDIR)/include)\n\t@$(call COPY, $(TARGET).nlm, $(DEVLDIR)/bin)\n\t@$(call COPY, $(TARGET).imp, $(DEVLDIR)/nw)\n\t@$(call COPY, $(TARGET).$(LIBEXT), $(DEVLDIR)/nw)\n\t@echo Creating $(DEVLARC)\n\t@$(ZIP) $(DEVLARC) $(DEVLDIR)/* < $(DEVLDIR)/readme.txt\n\ndistclean: clean\n\t$(call RMDIR, $(DISTDIR))\n\t$(call DEL, $(DISTARC))\n\ndevclean: clean\n\t$(call RMDIR, $(DEVLDIR))\n\t$(call DEL, $(DEVLARC))\n\nobjclean:\n\t$(call RMDIR, $(OBJDIR))\n\ntestclean: clean\n\t$(MAKE) -C test clean\n\nclean: objclean\n\t$(call DEL, libssh2_config.h)\n\t$(call DEL, $(TARGET).*)\n\n$(OBJDIR):\n\t@$(call MKDIR, $@)\n\n$(DISTDIR):\n\t@$(call MKDIR, $@)\n\n$(DEVLDIR):\n\t@$(call MKDIR, $@)\n\n$(TARGET).$(LIBEXT): $(OBJS)\n\t@echo Creating $@\n\t@$(call DEL, $@)\n\t@$(AR) $(ARFLAGS) $@ $^\nifdef RANLIB\n\t@$(RANLIB) $@\nendif\n\n$(TARGET).nlm: $(OBJDIR)/$(TARGET).def $(TARGET).imp $(OBJL) $(XDCDATA)\n\t@echo Linking $@\n\t@$(call DEL, $@)\n\t@$(LD) $(LDFLAGS) $<\n\n$(OBJDIR)/%.xdc: GNUmakefile\n\t@echo Creating $@\n\t@$(MPKXDC) $(XDCOPT) $@\n\n$(OBJDIR)/%.def: GNUmakefile\n\t@echo $(DL)# DEF file for linking with $(LD)$(DL) > $@\n\t@echo $(DL)# Do not edit this file - it is created by make!$(DL) >> $@\n\t@echo $(DL)# All your changes will be lost!!$(DL) >> $@\n\t@echo $(DL)#$(DL) >> $@\n\t@echo $(DL)copyright \"$(CPRIGHT)\"$(DL) >> $@\n\t@echo $(DL)description \"$(DESCR)\"$(DL) >> $@\n\t@echo $(DL)version $(VERSION)$(DL) >> $@\nifdef NLMTYPE\n\t@echo $(DL)type $(NLMTYPE)$(DL) >> $@\nendif\nifdef STACK\n\t@echo $(DL)stack $(STACK)$(DL) >> $@\nendif\nifdef SCREEN\n\t@echo $(DL)screenname \"$(SCREEN)\"$(DL) >> $@\nelse\n\t@echo $(DL)screenname \"DEFAULT\"$(DL) >> $@\nendif\nifeq ($(DB),DEBUG)\n\t@echo $(DL)debug$(DL) >> $@\nendif\n\t@echo $(DL)threadname \"$(TARGET)\"$(DL) >> $@\nifdef XDCDATA\n\t@echo $(DL)xdcdata $(XDCDATA)$(DL) >> $@\nendif\n\t@echo $(DL)flag_on 64$(DL) >> $@\nifeq ($(LIBARCH),CLIB)\n\t@echo $(DL)start _Prelude$(DL) >> $@\n\t@echo $(DL)exit _Stop$(DL) >> $@\n\t@echo $(DL)import @$(SDK_CLIB)/imports/clib.imp$(DL) >> $@\n\t@echo $(DL)import @$(SDK_CLIB)/imports/threads.imp$(DL) >> $@\n\t@echo $(DL)import @$(SDK_CLIB)/imports/nlmlib.imp$(DL) >> $@\n\t@echo $(DL)import @$(SDK_CLIB)/imports/socklib.imp$(DL) >> $@\n\t@echo $(DL)module clib$(DL) >> $@\nelse\n\t@echo $(DL)pseudopreemption$(DL) >> $@\n\t@echo $(DL)start _LibCPrelude$(DL) >> $@\n\t@echo $(DL)exit _LibCPostlude$(DL) >> $@\n\t@echo $(DL)check _LibCCheckUnload$(DL) >> $@\n\t@echo $(DL)import @$(SDK_LIBC)/imports/libc.imp$(DL) >> $@\n\t@echo $(DL)import @$(SDK_LIBC)/imports/netware.imp$(DL) >> $@\n\t@echo $(DL)module libc$(DL) >> $@\nendif\nifdef MODULES\n\t@echo $(DL)module $(MODULES)$(DL) >> $@\nendif\nifdef EXPORTS\n\t@echo $(DL)export $(EXPORTS)$(DL) >> $@\nendif\nifdef IMPORTS\n\t@echo $(DL)import $(IMPORTS)$(DL) >> $@\nendif\nifeq ($(LD),nlmconv)\n\t@echo $(DL)input $(OBJL)$(DL) >> $@\n\t@echo $(DL)input $(PRELUDE)$(DL) >> $@\n\t@echo $(DL)output $(TARGET).nlm$(DL) >> $@\nendif\n\nlibssh2_config.h: GNUmakefile\n\t@echo Creating $@\n\t@echo $(DL)/* $@ for NetWare target.$(DL) > $@\n\t@echo $(DL)** Do not edit this file - it is created by make!$(DL) >> $@\n\t@echo $(DL)** All your changes will be lost!!$(DL) >> $@\n\t@echo $(DL)*/$(DL) >> $@\n\t@echo $(DL)#define VERSION \"$(LIBSSH2_VERSION_STR)\"$(DL) >> $@\n\t@echo $(DL)#define PACKAGE_BUGREPORT \"https://github.com/libssh2/libssh2/issues\"$(DL) >> $@\nifeq ($(LIBARCH),CLIB)\n\t@echo $(DL)#define OS \"i586-pc-clib-NetWare\"$(DL) >> $@\n\t@echo $(DL)#define NETDB_USE_INTERNET 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRICMP 1$(DL) >> $@\n\t@echo $(DL)#define socklen_t int$(DL) >> $@\n\t@echo $(DL)#define sleep(s) delay(1000 * s)$(DL) >> $@\n\t@echo $(DL)#define strcasecmp stricmp$(DL) >> $@\n\t@echo $(DL)#define strncasecmp strnicmp$(DL) >> $@\nelse\n\t@echo $(DL)#define OS \"i586-pc-libc-NetWare\"$(DL) >> $@\n\t@echo $(DL)#define HAVE_DLFCN_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_DLOPEN 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_FTRUNCATE 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_GETTIMEOFDAY 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_INET_PTON 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_INTTYPES_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_LIMITS_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_LONGLONG 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STDINT_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRCASECMP 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRLCAT 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRLCPY 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRTOLL 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SYS_PARAM_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SYS_SELECT_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_TERMIOS_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@\n\t@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@\nifdef ENABLE_IPV6\n\t@echo $(DL)#define ENABLE_IPV6 1$(DL) >> $@\nendif\nendif\n\t@echo $(DL)#define HAVE_ARPA_INET_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_ASSERT_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_CTYPE_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_ERR_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_ERRNO_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_FCNTL_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_FIONBIO 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_GETHOSTBYADDR 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_GETHOSTBYNAME 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_GETPROTOBYNAME 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_GMTIME_R 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_INET_ADDR 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_INET_NTOA 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_LL 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_LOCALTIME_R 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_MALLOC_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_NETINET_IN_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SELECT 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SETJMP_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SIGNAL 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SIGNAL_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SIG_ATOMIC_T 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SOCKET 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STDLIB_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRDUP 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRFTIME 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRING_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRSTR 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_STRUCT_TIMEVAL 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SYS_IOCTL_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SYS_STAT_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SYS_TIME_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_TIME_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_UNAME 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_UNISTD_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_UTIME 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_UTIME_H 1$(DL) >> $@\n\t@echo $(DL)#define RETSIGTYPE void$(DL) >> $@\n\t@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@\n\t@echo $(DL)#define STDC_HEADERS 1$(DL) >> $@\n\t@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@\n\t@echo $(DL)#define USE_SSLEAY 1$(DL) >> $@\n\t@echo $(DL)#define USE_OPENSSL 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_OPENSSL_SSL_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_OPENSSL_RSA_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_OPENSSL_PEM_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_OPENSSL_ERR_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_OPENSSL_CRYPTO_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_OPENSSL_ENGINE_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_O_NONBLOCK 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_LIBSSL 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_LIBCRYPTO 1$(DL) >> $@\n\t@echo $(DL)#define OPENSSL_NO_KRB5 1$(DL) >> $@\nifdef WITH_ZLIB\n\t@echo $(DL)#define HAVE_ZLIB_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_LIBZ 1$(DL) >> $@\n\t@echo $(DL)#define LIBSSH2_HAVE_ZLIB 1$(DL) >> $@\nendif\nifdef NW_WINSOCK\n\t@echo $(DL)#define HAVE_CLOSESOCKET 1$(DL) >> $@\nelse\n\t@echo $(DL)#define HAVE_SYS_TYPES_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SYS_SOCKET_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_SYS_SOCKIO_H 1$(DL) >> $@\n\t@echo $(DL)#define HAVE_NETDB_H 1$(DL) >> $@\nendif\nifdef OLD_NOVELLSDK\n\t@echo $(DL)#define socklen_t int$(DL) >> $@\nendif\n\t@echo $(DL)#define LIBSSH2_DH_GEX_NEW 1$(DL) >> $@\nifeq ($(DB),DEBUG)\n\t@echo $(DL)#define LIBSSH2_DEBUG_CONNECTION 1$(DL) >> $@\n\t@echo $(DL)#define LIBSSH2_DEBUG_ERRORS 1$(DL) >> $@\n\t@echo $(DL)#define LIBSSH2_DEBUG_KEX 1$(DL) >> $@\n\t@echo $(DL)#define LIBSSH2_DEBUG_PUBLICKEY 1$(DL) >> $@\n\t@echo $(DL)#define LIBSSH2_DEBUG_SCP 1$(DL) >> $@\n\t@echo $(DL)#define LIBSSH2_DEBUG_SFTP 1$(DL) >> $@\n\t@echo $(DL)#define LIBSSH2_DEBUG_TRANSPORT 1$(DL) >> $@\n\t@echo $(DL)#define LIBSSH2_DEBUG_USERAUTH 1$(DL) >> $@\nendif\n\nlibssh2.imp: GNUmakefile\n\t@echo Creating $@\n\t@echo $(DL)# $@ for NetWare target.$(DL) > $@\n\t@echo $(DL)# Do not edit this file - it is created by make!$(DL) >> $@\n\t@echo $(DL)# All your changes will be lost!!$(DL) >> $@\nifeq ($(LIBARCH),CLIB)\n\t@echo $(DL)  (CLIB_LIBSSH2)$(DL) >> $@\nelse\n\t@echo $(DL)  (LIBC_LIBSSH2)$(DL) >> $@\nendif\n\t@echo $(DL)  libssh2_banner_set,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_close,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_direct_tcpip_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_eof,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_flush_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_free,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_get_exit_status,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_open_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_process_startup,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_read_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_request_pty_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_send_eof,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_set_blocking,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_setenv_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_wait_closed,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_wait_eof,$(DL) >> $@\n\t@echo $(DL)  libssh2_channel_write_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_exit,$(DL) >> $@\n\t@echo $(DL)  libssh2_hostkey_hash,$(DL) >> $@\n\t@echo $(DL)  libssh2_init,$(DL) >> $@\n\t@echo $(DL)  libssh2_knownhost_add,$(DL) >> $@\n\t@echo $(DL)  libssh2_knownhost_check,$(DL) >> $@\n\t@echo $(DL)  libssh2_knownhost_checkp,$(DL) >> $@\n\t@echo $(DL)  libssh2_knownhost_free,$(DL) >> $@\n\t@echo $(DL)  libssh2_knownhost_init,$(DL) >> $@\n\t@echo $(DL)  libssh2_knownhost_readfile,$(DL) >> $@\n\t@echo $(DL)  libssh2_knownhost_writefile,$(DL) >> $@\n\t@echo $(DL)  libssh2_scp_recv,$(DL) >> $@\n\t@echo $(DL)  libssh2_scp_recv2,$(DL) >> $@\n\t@echo $(DL)  libssh2_scp_send64,$(DL) >> $@\n\t@echo $(DL)  libssh2_scp_send_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_abstract,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_block_directions,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_callback_set,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_disconnect_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_free,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_handshake,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_hostkey,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_init_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_last_errno,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_last_error,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_method_pref,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_methods,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_set_blocking,$(DL) >> $@\n\t@echo $(DL)  libssh2_session_startup,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_close_handle,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_fstat_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_init,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_last_error,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_mkdir_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_open_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_read,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_readdir_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_rename_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_rmdir_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_seek,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_seek64,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_shutdown,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_stat_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_symlink_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_tell,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_unlink_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_sftp_write,$(DL) >> $@\n\t@echo $(DL)  libssh2_trace,$(DL) >> $@\n\t@echo $(DL)  libssh2_userauth_authenticated,$(DL) >> $@\n\t@echo $(DL)  libssh2_userauth_keyboard_interactive_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_userauth_list,$(DL) >> $@\n\t@echo $(DL)  libssh2_userauth_password_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_userauth_publickey_fromfile_ex,$(DL) >> $@\n\t@echo $(DL)  libssh2_version$(DL) >> $@\n\n$(DISTDIR)/readme.txt: GNUmakefile\n\t@echo Creating $@\n\t@echo $(DL)This is a binary distribution for NetWare platform.$(DL) > $@\n\t@echo $(DL)libssh2 version $(LIBSSH2_VERSION_STR)$(DL) >> $@\n\t@echo $(DL)Please download the complete libssh package for$(DL) >> $@\n\t@echo $(DL)any further documentation:$(DL) >> $@\n\t@echo $(DL)$(WWWURL)$(DL) >> $@\n\n$(DEVLDIR)/readme.txt: GNUmakefile\n\t@echo Creating $@\n\t@echo $(DL)This is a development distribution for NetWare platform.$(DL) > $@\n\t@echo $(DL)libssh2 version $(LIBSSH2_VERSION_STR)$(DL) >> $@\n\t@echo $(DL)Please download the complete libssh2 package for$(DL) >> $@\n\t@echo $(DL)any further documentation:$(DL) >> $@\n\t@echo $(DL)$(WWWURL)$(DL) >> $@\n\nhelp: $(OBJDIR)/version.inc\n\t@echo $(DL)===========================================================$(DL)\nifeq ($(LIBARCH),LIBC)\n\t@echo $(DL)Novell LibC NDK = $(SDK_LIBC)$(DL)\nelse\n\t@echo $(DL)Novell CLib NDK = $(SDK_CLIB)$(DL)\nendif\n\t@echo $(DL)OpenSSL path    = $(OPENSSL_PATH)$(DL)\n\t@echo $(DL)Zlib path       = $(ZLIB_PATH)$(DL)\n\t@echo $(DL)===========================================================$(DL)\n\t@echo $(DL)libssh $(LIBSSH2_VERSION_STR) - available targets are:$(DL)\n\t@echo $(DL)$(MAKE) all$(DL)\n\t@echo $(DL)$(MAKE) nlm$(DL)\n\t@echo $(DL)$(MAKE) lib$(DL)\n\t@echo $(DL)$(MAKE) clean$(DL)\n\t@echo $(DL)$(MAKE) dev$(DL)\n\t@echo $(DL)$(MAKE) devclean$(DL)\n\t@echo $(DL)$(MAKE) dist$(DL)\n\t@echo $(DL)$(MAKE) distclean$(DL)\n\t@echo $(DL)$(MAKE) objclean$(DL)\n\t@echo $(DL)$(MAKE) test$(DL)\n\t@echo $(DL)===========================================================$(DL)\n\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/nw/keepscreen.c",
    "content": "/* Simple _NonAppStop() implementation which can be linked to your \n * NLM in order to keep the screen open when the NLM terminates\n * (the good old clib behaviour).\n * You dont have to call it, its done automatically from LibC.\n *\n * 2004-Aug-11  by Guenter Knauf \n *\n * URL: http://www.gknw.net/development/mk_nlm/\n */\n \n#include <stdio.h>\n#include <screen.h>\n\nvoid _NonAppStop()\n{\n    uint16_t row, col;\n    \n    GetScreenSize(&row, &col);\n    gotorowcol(row-1, 0);\n    /* pressanykey(); */\n    printf(\"<Press any key to close screen> \");\n    getcharacter();\n}\n\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/nw/nwlib.c",
    "content": "/*********************************************************************\n * Universal NetWare library stub.                                   *\n * written by Ulrich Neuman and given to OpenSource copyright-free.  *\n * Extended for CLIB support by Guenter Knauf.                       *\n *********************************************************************/\n\n#ifdef NETWARE /* Novell NetWare */\n\n#include <stdlib.h>\n\n#ifdef __NOVELL_LIBC__\n/* For native LibC-based NLM we need to register as a real lib. */\n#include <errno.h>\n#include <string.h>\n#include <library.h>\n#include <netware.h>\n#include <screen.h>\n#include <nks/thread.h>\n#include <nks/synch.h>\n\ntypedef struct\n{\n  int     _errno;\n  void    *twentybytes;\n} libthreaddata_t;\n\ntypedef struct\n{\n  int         x;\n  int         y;\n  int         z;\n  void        *tenbytes;\n  NXKey_t     perthreadkey;   /* if -1, no key obtained... */\n  NXMutex_t   *lock;\n} libdata_t;\n\nint         gLibId      = -1;\nvoid        *gLibHandle = (void *) NULL;\nrtag_t      gAllocTag   = (rtag_t) NULL;\nNXMutex_t   *gLibLock   = (NXMutex_t *) NULL;\n\n/* internal library function prototypes... */\nint     DisposeLibraryData ( void * );\nvoid    DisposeThreadData ( void * );\nint     GetOrSetUpData ( int id, libdata_t **data, libthreaddata_t **threaddata );\n\n\nint _NonAppStart( void        *NLMHandle,\n                  void        *errorScreen,\n                  const char  *cmdLine,\n                  const char  *loadDirPath,\n                  size_t      uninitializedDataLength,\n                  void        *NLMFileHandle,\n                  int         (*readRoutineP)( int conn,\n                                               void *fileHandle, size_t offset,\n                                               size_t nbytes,\n                                               size_t *bytesRead,\n                                               void *buffer ),\n                  size_t      customDataOffset,\n                  size_t      customDataSize,\n                  int         messageCount,\n                  const char  **messages )\n{\n  NX_LOCK_INFO_ALLOC(liblock, \"Per-Application Data Lock\", 0);\n\n#ifndef __GNUC__\n#pragma unused(cmdLine)\n#pragma unused(loadDirPath)\n#pragma unused(uninitializedDataLength)\n#pragma unused(NLMFileHandle)\n#pragma unused(readRoutineP)\n#pragma unused(customDataOffset)\n#pragma unused(customDataSize)\n#pragma unused(messageCount)\n#pragma unused(messages)\n#endif\n\n/*\n** Here we process our command line, post errors (to the error screen),\n** perform initializations and anything else we need to do before being able\n** to accept calls into us. If we succeed, we return non-zero and the NetWare\n** Loader will leave us up, otherwise we fail to load and get dumped.\n*/\n  gAllocTag = AllocateResourceTag(NLMHandle,\n                   \"<library-name> memory allocations\", AllocSignature);\n\n  if (!gAllocTag) {\n    OutputToScreen(errorScreen, \"Unable to allocate resource tag for \"\n                     \"library memory allocations.\\n\");\n    return -1;\n  }\n\n  gLibId = register_library(DisposeLibraryData);\n\n  if (gLibId < -1) {\n    OutputToScreen(errorScreen, \"Unable to register library with kernel.\\n\");\n    return -1;\n  }\n\n  gLibHandle = NLMHandle;\n\n  gLibLock = NXMutexAlloc(0, 0, &liblock);\n\n  if (!gLibLock) {\n    OutputToScreen(errorScreen, \"Unable to allocate library data lock.\\n\");\n    return -1;\n  }\n\n  return 0;\n}\n\n/*\n** Here we clean up any resources we allocated. Resource tags is a big part\n** of what we created, but NetWare doesn't ask us to free those.\n*/\nvoid _NonAppStop( void )\n{\n  (void) unregister_library(gLibId);\n  NXMutexFree(gLibLock);\n}\n\n/*\n** This function cannot be the first in the file for if the file is linked\n** first, then the check-unload function's offset will be nlmname.nlm+0\n** which is how to tell that there isn't one. When the check function is\n** first in the linked objects, it is ambiguous. For this reason, we will\n** put it inside this file after the stop function.\n**\n** Here we check to see if it's alright to ourselves to be unloaded. If not,\n** we return a non-zero value. Right now, there isn't any reason not to allow\n** it.\n*/\nint _NonAppCheckUnload( void )\n{\n  return 0;\n}\n\nint GetOrSetUpData(int id, libdata_t **appData, libthreaddata_t **threadData)\n{\n  int              err;\n  libdata_t        *app_data;\n  libthreaddata_t  *thread_data;\n  NXKey_t          key;\n  NX_LOCK_INFO_ALLOC(liblock, \"Application Data Lock\", 0);\n\n  err         = 0;\n  thread_data = (libthreaddata_t *) NULL;\n\n/*\n** Attempt to get our data for the application calling us. This is where we\n** store whatever application-specific information we need to carry in support\n** of calling applications.\n*/\n  app_data = (libdata_t *) get_app_data(id);\n\n  if (!app_data) {\n/*\n** This application hasn't called us before; set up application AND per-thread\n** data. Of course, just in case a thread from this same application is calling\n** us simultaneously, we better lock our application data-creation mutex. We\n** also need to recheck for data after we acquire the lock because WE might be\n** that other thread that was too late to create the data and the first thread\n** in will have created it.\n*/\n    NXLock(gLibLock);\n\n    if (!(app_data = (libdata_t *) get_app_data(id))) {\n      app_data = (libdata_t *) malloc(sizeof(libdata_t));\n\n      if (app_data) {\n        memset(app_data, 0, sizeof(libdata_t));\n\n        app_data->tenbytes = malloc(10);\n        app_data->lock     = NXMutexAlloc(0, 0, &liblock);\n\n        if (!app_data->tenbytes || !app_data->lock) {\n          if (app_data->lock)\n            NXMutexFree(app_data->lock);\n\n          free(app_data);\n          app_data = (libdata_t *) NULL;\n          err      = ENOMEM;\n        }\n\n        if (app_data) {\n/*\n** Here we burn in the application data that we were trying to get by calling\n** get_app_data(). Next time we call the first function, we'll get this data\n** we're just now setting. We also go on here to establish the per-thread data\n** for the calling thread, something we'll have to do on each application\n** thread the first time it calls us.\n*/\n          err = set_app_data(gLibId, app_data);\n\n          if (err) {\n            free(app_data);\n            app_data = (libdata_t *) NULL;\n            err      = ENOMEM;\n          }\n          else {\n            /* create key for thread-specific data... */\n            err = NXKeyCreate(DisposeThreadData, (void *) NULL, &key);\n\n            if (err)                /* (no more keys left?) */\n              key = -1;\n\n            app_data->perthreadkey = key;\n          }\n        }\n      }\n    }\n\n    NXUnlock(gLibLock);\n  }\n\n  if (app_data) {\n    key = app_data->perthreadkey;\n\n    if (key != -1 /* couldn't create a key? no thread data */\n        && !(err = NXKeyGetValue(key, (void **) &thread_data))\n        && !thread_data) {\n/*\n** Allocate the per-thread data for the calling thread. Regardless of whether\n** there was already application data or not, this may be the first call by a\n** a new thread. The fact that we allocation 20 bytes on a pointer is not very\n** important, this just helps to demonstrate that we can have arbitrarily\n** complex per-thread data.\n*/\n      thread_data = (libthreaddata_t *) malloc(sizeof(libthreaddata_t));\n\n      if (thread_data) {\n        thread_data->_errno      = 0;\n        thread_data->twentybytes = malloc(20);\n\n        if (!thread_data->twentybytes) {\n          free(thread_data);\n          thread_data = (libthreaddata_t *) NULL;\n          err         = ENOMEM;\n        }\n\n        if ((err = NXKeySetValue(key, thread_data))) {\n          free(thread_data->twentybytes);\n          free(thread_data);\n          thread_data = (libthreaddata_t *) NULL;\n        }\n      }\n    }\n  }\n\n  if (appData)\n    *appData = app_data;\n\n  if (threadData)\n    *threadData = thread_data;\n\n  return err;\n}\n\nint DisposeLibraryData( void *data )\n{\n  if (data) {\n    void *tenbytes = ((libdata_t *) data)->tenbytes;\n\n    if (tenbytes)\n      free(tenbytes);\n\n    free(data);\n  }\n\n  return 0;\n}\n\nvoid DisposeThreadData( void *data )\n{\n  if (data) {\n    void *twentybytes = ((libthreaddata_t *) data)->twentybytes;\n\n    if (twentybytes)\n      free(twentybytes);\n\n    free(data);\n  }\n}\n\n#else /* __NOVELL_LIBC__ */\n/* For native CLib-based NLM seems we can do a bit more simple. */\n#include <nwthread.h>\n\nint main ( void )\n{\n  /* initialize any globals here... */\n\n  /* do this if any global initializing was done\n  SynchronizeStart();\n  */\n  ExitThread (TSR_THREAD, 0);\n  return 0;\n}\n\n#endif /* __NOVELL_LIBC__ */\n\n#endif /* NETWARE */\n\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/nw/test/GNUmakefile",
    "content": "#########################################################################\n#\n## Makefile for building libssh2 (NetWare version - gnu make)\n##\n## Hacked by: Guenter Knauf\n#\n#########################################################################\n\n# Edit the path below to point to the base of your Novell NDK.\nifndef NDKBASE\nNDKBASE\t= c:/novell\nendif\n\n# Edit the path below to point to the base of your Zlib sources.\nifndef ZLIB_PATH\nZLIB_PATH = ../../../zlib-1.2.8\nendif\n\n# Edit the path below to point to the base of your OpenSSL package.\nifndef OPENSSL_PATH\nOPENSSL_PATH = ../../../openssl-0.9.8zc\nendif\n\n# Edit the var below to enable static linking of libssh2 and libz\nLINK_STATIC = 1\n\n# Edit the vars below to change NLM target settings.\nSAMPLES\t= ../../example\nTARGETS := $(filter-out x11.nlm,$(patsubst $(SAMPLES)/%.c,%.nlm,$(strip $(wildcard $(SAMPLES)/*.c))))\nVERSION\t= $(LIBSSH2_VERSION)\nCOPYR   = Copyright (c) $(LIBSSH2_COPYRIGHT_STR)\nWWWURL\t= http://www.libssh2.org/\nDESCR\t= libssh2 $(notdir $(@:.def=)) $(LIBSSH2_VERSION_STR) ($(LIBARCH)) - $(WWWURL)\nMTSAFE\t= YES\nSTACK\t= 64000\nSCREEN\t= NONE\n#SCREEN\t= libssh2 $(notdir $(@:.def=))\n# Comment the line below if you dont want to load protected automatically.\n#LDRING\t= 3\n\n# Edit the var below to point to your lib architecture.\nifndef LIBARCH\nLIBARCH = LIBC\nendif\n\n# must be equal to DEBUG or NDEBUG\nifndef DB\n\tDB\t= NDEBUG\n\t# DB\t= DEBUG\nendif\n# Optimization: -O<n> or debugging: -g\nifeq ($(DB),NDEBUG)\n\tOPT\t= -O2\n\tOBJDIR\t= release\nelse\n\tOPT\t= -g\n\tOPT\t+= -DLIBSSH2DEBUG\n\tOBJDIR\t= debug\nendif\n\n# The following lines defines your compiler.\nifdef CWFolder\n\tMETROWERKS = $(CWFolder)\nendif\nifdef METROWERKS\n\t# MWCW_PATH = $(subst \\,/,$(METROWERKS))/Novell Support\n\tMWCW_PATH = $(subst \\,/,$(METROWERKS))/Novell Support/Metrowerks Support\n\tCC = mwccnlm\nelse\n\tCC = $(CROSSPREFIX)gcc\nendif\n\n# Here you can find a native Win32 binary of the original awk:\n# http://www.gknw.net/development/prgtools/awk-20100523.zip\nAWK\t= awk\n# If you want to mark the target as MTSAFE you will need a tool for\n# generating the xdc data for the linker; here's a minimal tool:\n# http://www.gknw.net/development/prgtools/mkxdc.zip\nMPKXDC\t= mkxdc\n\n# Platform-dependent helper tool macros\nifeq ($(findstring /sh,$(SHELL)),/sh)\nDEL\t= rm -f $1\nRMDIR\t= rm -fr $1\nMKDIR\t= mkdir -p $1\nCOPY\t= -cp -afv $1 $2\n#COPYR\t= -cp -afr $1/* $2\nCOPYR\t= -rsync -aC $1/* $2\nTOUCH\t= touch $1\nCAT\t= cat\nECHONL\t= echo \"\"\nDL\t= '\nelse\nifeq \"$(OS)\" \"Windows_NT\"\nDEL\t= -del 2>NUL /q /f $(subst /,\\,$1)\nRMDIR\t= -rd 2>NUL /q /s $(subst /,\\,$1)\nelse\nDEL\t= -del 2>NUL $(subst /,\\,$1)\nRMDIR\t= -deltree 2>NUL /y $(subst /,\\,$1)\nendif     \nMKDIR\t= -md 2>NUL $(subst /,\\,$1)\nCOPY\t= -copy 2>NUL /y $(subst /,\\,$1) $(subst /,\\,$2)\nCOPYR\t= -xcopy 2>NUL /q /y /e $(subst /,\\,$1) $(subst /,\\,$2)\nTOUCH\t= copy 2>&1>NUL /b $(subst /,\\,$1) +,,\nCAT\t= type\nECHONL\t= $(ComSpec) /c echo.\nendif\n\n# LIBARCH_U = $(shell $(AWK) 'BEGIN {print toupper(ARGV[1])}' $(LIBARCH))\nLIBARCH_L = $(shell $(AWK) 'BEGIN {print tolower(ARGV[1])}' $(LIBARCH))\n\n# Include the version info retrieved from libssh2.h\n-include $(OBJDIR)/version.inc\n\n# Global flags for all compilers\nCFLAGS\t+= $(OPT) -D$(DB) -DNETWARE -nostdinc\n\nifeq ($(CC),mwccnlm)\nLD\t= mwldnlm\nLDFLAGS\t= -nostdlib $(<:.def=.o) $(PRELUDE) $(LDLIBS) -o $@ -commandfile\nAR\t= mwldnlm\nARFLAGS\t= -type library -w nocmdline $(OBJS) -o\nLIBEXT\t= lib\nCFLAGS\t+= -msgstyle gcc -gccinc -inline off -opt nointrinsics -proc 586\nCFLAGS\t+= -relax_pointers\n#CFLAGS\t+= -w on\nifeq ($(LIBARCH),LIBC)\n\tPRELUDE = $(SDK_LIBC)/imports/libcpre.o\n\tCFLAGS += -align 4\nelse\n\t# PRELUDE = $(SDK_CLIB)/imports/clibpre.o\n\t# to avoid the __init_* / __deinit_* whoes dont use prelude from NDK\n\tPRELUDE = \"$(MWCW_PATH)/libraries/runtime/prelude.obj\"\n\t# CFLAGS += -include \"$(MWCW_PATH)/headers/nlm_clib_prefix.h\"\n\tCFLAGS += -align 1\nendif\nelse\nLD\t= nlmconv\nLDFLAGS\t= -UT\nAR\t= ar\nARFLAGS\t= -cq\nLIBEXT\t= a\nCFLAGS\t+= -m32\nCFLAGS\t+= -fno-builtin -fpcc-struct-return\nCFLAGS\t+= -fno-strict-aliasing\nCFLAGS\t+= -Wall # -pedantic\nifeq ($(LIBARCH),LIBC)\n\tPRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o\nelse\n\t# PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o\n        # to avoid the __init_* / __deinit_* whoes dont use prelude from NDK\n        # http://www.gknw.net/development/mk_nlm/gcc_pre.zip\n        PRELUDE = $(NDK_ROOT)/pre/prelude.o\n\tCFLAGS += -include $(NDKBASE)/nlmconv/genlm.h\nendif\nendif\n\nNDK_ROOT = $(NDKBASE)/ndk\nSDK_CLIB = $(NDK_ROOT)/nwsdk\nSDK_LIBC = $(NDK_ROOT)/libc\nSNPRINTF = $(NDKBASE)/snprintf\n\nINCLUDES = -I.. -I../../include\n\nLDLIBS =\n \nifdef LINK_STATIC\n\tLDLIBS += ../libssh2.$(LIBEXT)\nelse\n\tIMPORTS += @../libssh2.imp\n\tMODULES += libssh2.nlm\nendif\n\nINCLUDES += -I$(OPENSSL_PATH)/outinc_nw_$(LIBARCH_L)\nLDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/ssl.$(LIBEXT)\nLDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/crypto.$(LIBEXT)\nIMPORTS += GetProcessSwitchCount RunningProcess\n\nifdef WITH_ZLIB\n\tINCLUDES += -I$(ZLIB_PATH)\nifdef LINK_STATIC\n\tLDLIBS += $(ZLIB_PATH)/nw/$(LIBARCH)/libz.$(LIBEXT)\nelse\n\tMODULES += libz.nlm\n\tIMPORTS += @$(ZLIB_PATH)/nw/$(LIBARCH)/libz.imp\nendif\nendif\n\nifeq ($(LIBARCH),LIBC)\n\tINCLUDES += -I$(SDK_LIBC)/include\n\t# INCLUDES += -I$(SDK_LIBC)/include/nks\n\t# INCLUDES += -I$(SDK_LIBC)/include/winsock\n\tCFLAGS += -D_POSIX_SOURCE\nelse\n\tINCLUDES += -I$(SDK_CLIB)/include/nlm\n\t# INCLUDES += -I$(SDK_CLIB)/include/nlm/obsolete\n\t# INCLUDES += -I$(SDK_CLIB)/include\n\t# CFLAGS += -DNETDB_USE_INTERNET\nendif\nCFLAGS\t+= $(INCLUDES)\n\nifeq ($(MTSAFE),YES)\n\tXDCOPT = -n\nendif\nifeq ($(MTSAFE),NO)\n\tXDCOPT = -u\nendif\n\nvpath %.c $(SAMPLES)\n\n.PRECIOUS: $(OBJDIR)/%.o $(OBJDIR)/%.def $(OBJDIR)/%.xdc\n\n\nall: prebuild $(TARGETS) \n\nprebuild: $(OBJDIR) $(OBJDIR)/version.inc\n\n$(OBJDIR)/%.o: %.c\n#\t@echo Compiling $<\n\t$(CC) $(CFLAGS) -c $< -o $@\n\n$(OBJDIR)/version.inc: ../../get_ver.awk ../../include/libssh2.h $(OBJDIR)\n\t@echo Creating $@\n\t@$(AWK) -f $^ > $@\n\nobjclean:\n\t$(call RMDIR, $(OBJDIR))\n\nclean: objclean\n\t$(foreach f, $(TARGETS), $(call DEL, $(f)))\n\n$(OBJDIR):\n\t@$(call MKDIR, $@)\n\n%.nlm: $(OBJDIR)/%.def $(OBJDIR)/%.o $(OBJDIR)/%.xdc\n\t@echo Linking $@\n\t@$(call DEL, $@)\n\t@$(LD) $(LDFLAGS) $<\n\n$(OBJDIR)/%.xdc: GNUmakefile\n\t@echo Creating $@\n\t@$(MPKXDC) $(XDCOPT) $@\n\n$(OBJDIR)/%.def: GNUmakefile\n\t@echo $(DL)# DEF file for linking with $(LD)$(DL) > $@\n\t@echo $(DL)# Do not edit this file - it is created by make!$(DL) >> $@\n\t@echo $(DL)# All your changes will be lost!!$(DL) >> $@\n\t@echo $(DL)#$(DL) >> $@\n\t@echo $(DL)copyright \"$(COPYR)\"$(DL) >> $@\n\t@echo $(DL)description \"$(DESCR)\"$(DL) >> $@\n\t@echo $(DL)version $(VERSION)$(DL) >> $@\nifdef NLMTYPE\n\t@echo $(DL)type $(NLMTYPE)$(DL) >> $@\nendif\nifdef STACK\n\t@echo $(DL)stack $(STACK)$(DL) >> $@\nendif\nifdef SCREEN\n\t@echo $(DL)screenname \"$(SCREEN)\"$(DL) >> $@\nelse\n\t@echo $(DL)screenname \"DEFAULT\"$(DL) >> $@\nendif\nifeq ($(DB),DEBUG)\n\t@echo $(DL)debug$(DL) >> $@\nendif\n\t@echo $(DL)threadname \"$(notdir $(@:.def=))\"$(DL) >> $@\nifdef XDCOPT\n\t@echo $(DL)xdcdata $(@:.def=.xdc)$(DL) >> $@\nendif\nifeq ($(LDRING),0)\n\t@echo $(DL)flag_on 16$(DL) >> $@\nendif\nifeq ($(LDRING),3)\n\t@echo $(DL)flag_on 512$(DL) >> $@\nendif\nifeq ($(LIBARCH),CLIB)\n\t@echo $(DL)start _Prelude$(DL) >> $@\n\t@echo $(DL)exit _Stop$(DL) >> $@\n\t@echo $(DL)import @$(SDK_CLIB)/imports/clib.imp$(DL) >> $@\n\t@echo $(DL)import @$(SDK_CLIB)/imports/threads.imp$(DL) >> $@\n\t@echo $(DL)import @$(SDK_CLIB)/imports/nlmlib.imp$(DL) >> $@\n\t@echo $(DL)import @$(SDK_CLIB)/imports/socklib.imp$(DL) >> $@\n\t@echo $(DL)module clib$(DL) >> $@\nelse\n\t@echo $(DL)flag_on 64$(DL) >> $@\n\t@echo $(DL)pseudopreemption$(DL) >> $@\n\t@echo $(DL)start _LibCPrelude$(DL) >> $@\n\t@echo $(DL)exit _LibCPostlude$(DL) >> $@\n\t@echo $(DL)check _LibCCheckUnload$(DL) >> $@\n\t@echo $(DL)import @$(SDK_LIBC)/imports/libc.imp$(DL) >> $@\n\t@echo $(DL)import @$(SDK_LIBC)/imports/netware.imp$(DL) >> $@\n\t@echo $(DL)module libc$(DL) >> $@\nendif\nifdef MODULES\n\t@echo $(DL)module $(MODULES)$(DL) >> $@\nendif\nifdef EXPORTS\n\t@echo $(DL)export $(EXPORTS)$(DL) >> $@\nendif\nifdef IMPORTS\n\t@echo $(DL)import $(IMPORTS)$(DL) >> $@\nendif\nifeq ($(LD),nlmconv)\n\t@echo $(DL)input $(@:.def=.o)$(DL) >> $@\n\t@echo $(DL)input $(PRELUDE)$(DL) >> $@\nifdef LDLIBS\n\t@echo $(DL)input $(LDLIBS)$(DL) >> $@\nendif\n\t@echo $(DL)output $(notdir $(@:.def=.nlm))$(DL) >> $@\nendif\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/README400",
    "content": "\nImplementation notes:\n\n  This is a true OS/400 implementation, not a PASE implementation (for PASE,\nuse AIX implementation).\n\nIt uses ASCII as internal character set. This has been accomplished using the\nQADRT library and include files, a C and system procedures ASCII wrapper\nlibrary. See IBM QADRT description for more information.\n  This results in libssh2 being an ASCII library: any function string\nargument is taken/returned in ASCII and a C/C++ calling program built around\nQADRT may use libssh2 functions as on any other platform.\n  QADRT does not define ASCII wrappers for all C/system procedures: an\nadditional module (os400sys.c) define some more of them, that are used by\nlibssh2 and that QADRT left out.\n  Since standard library entry points expect and return ASCII character strings,\nadditional procedures are provided for string transcoding (see below). No\nwrappers to standard procedures are provided: however, nested calls to\ntranscoding procedures may be used.\n\nCrypto API is provided by the IBM QC3 API library. It supports RSA, but not DSA.\n\n\n  Standard compilation environment does support neither autotools nor make;\nin fact, very few common utilities are available. As a consequence, the\nlibssh2_config.h has been coded manually and the compilation scripts are\na set of shell scripts stored in subdirectory os400.\n\n  The test environment is currently not supported on OS/400.\n\n\n\nCompiling on OS/400:\n\n  These instructions target people who knows about OS/400, compiling, IFS and\narchive extraction. Do not ask questions about these subjects if you're not\nfamiliar with.\n\n_ As a prerequisite, QADRT development environment must be installed.\n_ Install the libssh2 sources directory in IFS.\n_ Enter shell (QSH)\n_ Change current directory to the libssh2 sources installation directory\n_ Change current directory to os400\n_ Edit file iniscript.sh. You may want to change tunable configuration\n  parameters, like debug info generation, optimisation level, listing option,\n  target library, zlib availability and location, etc.\n_ Copy any file in the current directory to makelog (i.e.:\n  cp initscript.sh makelog): this is intended to create the makelog file with\n  an ASCII CCSID!\n_ Enter the command \"sh make.sh > makelog 2>&1'\n_ Examine the makelog file to check for compilation errors.\n\n  Leaving file initscript.sh unchanged, this will produce the following OS/400\nobjects:\n_ Library LIBSSH2. All other objects will be stored in this library.\n_ Modules for all libssh2 units.\n_ Binding directory LIBSSH2_A, to be used at calling program link time for\n  statically binding the modules (specify BNDSRVPGM(QADRTTS) when creating a\n  program using LIBSSH2_A. Also give access to the zlib BNDDIR/SRVPGM if\n  libssh2 is compiled with zlib).\n_ Service program LIBSSH2.<soname>, where <soname> is extracted from the\n  src/Makefile.am VERSION variable. To be used at calling program run-time\n  when this program has dynamically bound libssh2 at link time.\n_ Binding directory LIBSSH2. To be used to dynamically bind libssh2 when\n  linking a calling program.\n_ Source file H. It contains all the include members needed to compile a C/C++\n  module using libssh2.\n_ LIBSSH2, SSH2_PKEY, SSH2_SFTP members in file H. These are the C/C++ header\n  files. Original fames have been mangled to fit member name allowed syntax.\n_ Source file LIBSSH2RPG. It contains all the ILE/RPG /INCLUDE members\n  needed to compile an ILE/RPG program calling libssh2 procedures.\n_ LIBSSH2, SSH2_PKEY, SSH2_SFTP members in file LIBSSH2RPG. These are\n  ILE/RPG translations of the corresponding C header files.\n\n\n\nSpecial programming consideration:\n\nQADRT being used, the following points must be considered:\n_ If static binding is used, service program QADRTTS must be linked too.\n_ Likewise, if libssh2 has been compiled with zlib support, access to the\n  zlib objects must be provided at link time.\n_ The EBCDIC CCSID used by QADRT is 37 by default, NOT THE JOB'S CCSID. If\n  another EBCDIC CCSID is required, it must be set via a locale through a call\n  to setlocale_a (QADRT's setlocale() ASCII wrapper) with category LC_ALL or\n  LC_CTYPE, or by setting environment variable QADRT_ENV_LOCALE to the locale\n  object path before executing the program.\n_ Do not use original source include files unless you know what you are doing.\n  Use the installed members instead (in /QSYS.LIB/LIBSSH2.LIB/H.FILE).\n\n\n\nString transcoding support:\n\n  To help passing arbitrarily encoded string arguments and/or receiving string\nvalues from/to the libssh2 API, three non-standard additional procedures are\nprovided. They use a session pointer and a \"string cache\" pointer.\n  Each time a string is transcoded, it is cached in the given cache. It is\nthe responsibility of the caller to release the cache when its associted strings\nare no longer needed. These procedures and the string cache type are defined\nin a new libssh2_ccsid.h header file.\n  To create a string cache, use:\n\n#include <libssh2_ccsid.h>\nlibssh2_string_cache *  cache = NULL;\n\n  To release all strings in a cache, call:\n\nlibssh2_release_string_cache(session, &cache);\n\n  The transcoding procedures are:\n\nchar * libssh2_from_ccsid(LIBSSH2_SESSION *session,\n                          libssh2_string_cache **cache,\n                          unsigned short ccsid,\n                          const char *string, ssize_t inlen,\n                          size_t *outlen);\nchar * libssh2_to_ccsid(LIBSSH2_SESSION *session,\n                        libssh2_string_cache **cache,\n                        unsigned short ccsid,\n                        const char *string, ssize_t inlen,\n                        size_t *outlen);\n\nwhere:\n    session      is a libssh2 session used for memory allocation.\n    cache        is the address of a string cache.\n    ccsid        is the external (i.e.: non libssh2) coded character set id.\n                 65535 means no conversion and 0 means the current job's CCSID.\n    string       is the string to convert.\n    inlen        is the source string length in bytes: set to -1 if\n                 null-terminated.\n    outlen       if not NULL, is the address of a variable that will receive\n                 the transcoded string length upon return.\n\n  libssh2_from_ccsid() transcodes the string from the given CCSID to libssh2\ninternal encoding (UTF-8). It is intended to be used to convert API input\nparameters.\n  libssh2_to_ccsid() transcodes the string from libssh2 internal encoding\n(UTF-8) to the given CCSID. This has been implemented to get standard API\nstring results in a program's native encoding.\n\n  Both these functions return a pointer to the null-terminated converted string,\nor NULL if an error occurred. In addition, the variable pointed by outlen\nreceives the effective byte length of the (cached) translated string, or -1\nin case of error.\n\n\n\nILE/RPG support:\n\n  Since 95% of the OS/400 programmers use ILE/RPG exclusively, a definition\n  /INCLUDE member is provided for this language. To include libssh2\n  definitions in an ILE/RPG module, line\n\n     h bnddir('LIBSSH2/LIBSSH2')\n\nmust figure in the program header, and line\n\n     d/include libssh2/libssh2rpg,libssh2\n\nin the global data section of the module's source code.\nIf required, members ssh2_sftp, ssh2_pkey and ssh2_ccsid may also be included.\n\nFor IFS source compilations, include members are located in directory\n/libssh2/include/libssh2rpg and have their original names retained.\n\nILE/RPG lacks a serious macro preprocessor, thus C macros requiring this\nfeature have not been translated. However, function-like C macros have been\nimplemented as procedures and therefore supported in ILE/RPG.\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/ccsid.c",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* Character encoding wrappers. */\n\n#include \"libssh2_priv.h\"\n#include \"libssh2_ccsid.h\"\n\n#include <qtqiconv.h>\n#include <iconv.h>\n#include <errno.h>\n#include <string.h>\n#include <stdio.h>\n\n\n\n#define CCSID_UTF8      1208\n#define CCSID_UTF16BE   13488\n#define STRING_GRANULE  256\n#define MAX_CHAR_SIZE   4\n\n#define OFFSET_OF(t, f) ((size_t) ((char *) &((t *) 0)->f - (char *) 0))\n\n\nstruct _libssh2_string_cache {\n    libssh2_string_cache *  next;\n    char                    string[1];\n};\n\n\nstatic const QtqCode_T  utf8code = { CCSID_UTF8 };\n\n\nstatic ssize_t\nterminator_size(unsigned short ccsid)\n{\n    QtqCode_T outcode;\n    iconv_t cd;\n    char *inp;\n    char *outp;\n    size_t ilen;\n    size_t olen;\n    char buf[MAX_CHAR_SIZE];\n\n    /* Return the null-terminator size for the given CCSID. */\n\n    /* Fast check usual CCSIDs. */\n    switch (ccsid) {\n    case CCSID_UTF8:\n    case 0:                                 /* Job CCSID is SBCS EBCDIC. */\n        return 1;\n    case CCSID_UTF16BE:\n        return 2;\n    }\n\n    /* Convert an UTF-8 NUL to the target CCSID: use the converted size as\n       result. */\n    memset((void *) &outcode, 0, sizeof outcode);\n    outcode.CCSID = ccsid;\n    cd = QtqIconvOpen(&outcode, (QtqCode_T *) &utf8code);\n    if (cd.return_value == -1)\n        return -1;\n    inp = \"\";\n    ilen = 1;\n    outp = buf;\n    olen = sizeof buf;\n    iconv(cd, &inp, &ilen, &outp, &olen);\n    iconv_close(cd);\n    olen = sizeof buf - olen;\n    return olen? olen: -1;\n}\n\nstatic char *\nconvert_ccsid(LIBSSH2_SESSION *session, libssh2_string_cache **cache,\n              unsigned short outccsid, unsigned short inccsid,\n              const char *instring, ssize_t inlen, size_t *outlen)\n{\n    char *inp;\n    char *outp;\n    size_t olen;\n    size_t ilen;\n    size_t buflen;\n    size_t curlen;\n    ssize_t termsize;\n    int i;\n    char *dst;\n    libssh2_string_cache *outstring;\n    QtqCode_T incode;\n    QtqCode_T outcode;\n    iconv_t cd;\n\n    if (!instring) {\n        if (outlen)\n            *outlen = 0;\n        return NULL;\n    }\n    if (outlen)\n        *outlen = -1;\n    if (!session || !cache)\n        return NULL;\n\n    /* Get terminator size. */\n    termsize = terminator_size(outccsid);\n    if (termsize < 0)\n        return NULL;\n \n    /* Prepare conversion parameters. */\n    memset((void *) &incode, 0, sizeof incode);\n    memset((void *) &outcode, 0, sizeof outcode);\n    incode.CCSID = inccsid;\n    outcode.CCSID = outccsid;\n    curlen = OFFSET_OF(libssh2_string_cache, string);\n    inp = (char *) instring;\n    ilen = inlen;\n    buflen = inlen + curlen;\n    if (inlen < 0) {\n        incode.length_option = 1;\n        buflen = STRING_GRANULE;\n        ilen = 0;\n    }\n\n    /* Allocate output string buffer and open conversion descriptor. */\n    dst = LIBSSH2_ALLOC(session, buflen + termsize);\n    if (!dst)\n        return NULL;\n    cd = QtqIconvOpen(&outcode, &incode);\n    if (cd.return_value == -1) {\n        LIBSSH2_FREE(session, (char *) dst);\n        return NULL;\n    }\n\n    /* Convert string. */\n    for (;;) {\n        outp = dst + curlen;\n        olen = buflen - curlen;\n        i = iconv(cd, &inp, &ilen, &outp, &olen);\n        if (inlen < 0 && olen == buflen - curlen) {\n            /* Special case: converted 0-length (sub)strings do not store the\n               terminator. */\n            if (termsize) {\n                memset(outp, 0, termsize);\n                olen -= termsize;\n            }\n        }\n        curlen = buflen - olen;\n        if (i >= 0 || errno != E2BIG)\n            break;\n        /* Must expand buffer. */\n        buflen += STRING_GRANULE;\n        outp = LIBSSH2_REALLOC(session, dst, buflen + termsize);\n        if (!outp)\n            break;\n        dst = outp;\n    }\n\n    iconv_close(cd);\n\n    /* Check for error. */\n    if (i < 0 || !outp) {\n        LIBSSH2_FREE(session, dst);\n        return NULL;\n    }\n\n    /* Process terminator. */\n    if (inlen < 0)\n        curlen -= termsize;\n    else if (termsize)\n        memset(dst + curlen, 0, termsize);\n\n    /* Shorten buffer if possible. */\n    if (curlen < buflen)\n        dst = LIBSSH2_REALLOC(session, dst, curlen + termsize);\n\n    /* Link to cache. */\n    outstring = (libssh2_string_cache *) dst;\n    outstring->next = *cache;\n    *cache = outstring;\n\n    /* Return length if required. */\n    if (outlen)\n        *outlen = curlen - OFFSET_OF(libssh2_string_cache, string);\n\n    return outstring->string;\n}\n\nLIBSSH2_API char *\nlibssh2_from_ccsid(LIBSSH2_SESSION *session, libssh2_string_cache **cache,\n                   unsigned short ccsid, const char *string, ssize_t inlen,\n                   size_t *outlen)\n{\n    return convert_ccsid(session, cache,\n                         CCSID_UTF8, ccsid, string, inlen, outlen);\n}\n\nLIBSSH2_API char *\nlibssh2_to_ccsid(LIBSSH2_SESSION *session, libssh2_string_cache **cache,\n                 unsigned short ccsid, const char *string, ssize_t inlen,\n                 size_t *outlen)\n{\n    return convert_ccsid(session, cache,\n                         ccsid, CCSID_UTF8, string, inlen, outlen);\n}\n\nLIBSSH2_API void\nlibssh2_release_string_cache(LIBSSH2_SESSION *session,\n                             libssh2_string_cache **cache)\n{\n    libssh2_string_cache *p;\n\n    if (session && cache)\n        while ((p = *cache)) {\n            *cache = p->next;\n            LIBSSH2_FREE(session, (char *) p);\n        }\n}\n\n/* vim: set expandtab ts=4 sw=4: */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/include/alloca.h",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_ALLOCA_H\n#define LIBSSH2_ALLOCA_H\n\n/* alloca() emulation. */\n\n#include <modasa.mih>\n\n#define alloca(n)       _MODASA(n)\n\n#endif\n\n/* vim: set expandtab ts=4 sw=4: */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/include/stdio.h",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_STDIO_H\n#define LIBSSH2_STDIO_H\n\n/*\n *  <stdio.h> wrapper.\n *  Its goal is to redefine snprintf/vsnprintf which are not supported by QADRT.\n */\n\n#include <qadrt.h>\n\n#if __ILEC400_TGTVRM__ >= 710\n# include_next <stdio.h>\n#elif __ILEC400_TGTVRM__ >= 510\n# ifndef __SRCSTMF__\n#  include <QADRT/h/stdio>\n# else\n#  include </QIBM/ProdData/qadrt/include/stdio.h>\n# endif\n#endif\n\nextern int  _libssh2_os400_vsnprintf(char *dst, size_t len,\n                                     const char *fmt, va_list args);\nextern int  _libssh2_os400_snprintf(char *dst, size_t len,\n                                    const char *fmt, ...);\n\n#ifndef LIBSSH2_DISABLE_QADRT_EXT\n# define vsnprintf(dst, len, fmt, args)                                     \\\n                        _libssh2_os400_vsnprintf((dst), (len), (fmt), (args))\n# define snprintf       _libssh2_os400_snprintf\n#endif\n\n#endif\n\n/* vim: set expandtab ts=4 sw=4: */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/include/sys/socket.h",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_SYS_SOCKET_H\n#define LIBSSH2_SYS_SOCKET_H\n\n/*\n *  <sys/socket.h> wrapper.\n *  Redefines connect().\n */\n\n#include <qadrt.h>\n\n#ifndef _QADRT_LT\n# define _QADRT_LT <\n#endif\n#ifndef _QADRT_GT\n# define _QADRT_GT >\n#endif\n\n#ifdef QADRT_SYSINC\n# include _QADRT_LT QADRT_SYSINC/sys/socket.h _QADRT_GT\n#elif __ILEC400_TGTVRM__ >= 710\n# include_next <sys/socket.h>\n#elif !defined(__SRCSTMF__)\n# include <QSYSINC/sys/socket>\n#else\n# include </QIBM/include/sys/socket.h>\n#endif\n\nextern int  _libssh2_os400_connect(int sd,\n                                   struct sockaddr * destaddr, int addrlen);\n\n#ifndef LIBSSH2_DISABLE_QADRT_EXT\n#define connect(sd, addr, len)  _libssh2_os400_connect((sd), (addr), (len))\n#endif\n\n#endif\n\n/* vim: set expandtab ts=4 sw=4: */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/initscript.sh",
    "content": "#!/bin/sh\n\n\nsetenv()\n\n{\n        #       Define and export.\n\n        eval ${1}=\"${2}\"\n        export ${1}\n}\n\n\ncase \"${SCRIPTDIR}\" in\n/*)     ;;\n*)      SCRIPTDIR=\"`pwd`/${SCRIPTDIR}\"\nesac\n\nwhile true\ndo      case \"${SCRIPTDIR}\" in\n        */.)    SCRIPTDIR=\"${SCRIPTDIR%/.}\";;\n        *)      break;;\n        esac\ndone\n\n#  The script directory is supposed to be in $TOPDIR/os400.\n\nTOPDIR=`dirname \"${SCRIPTDIR}\"`\nexport SCRIPTDIR TOPDIR\n\n#  Extract the SONAME from the library makefile.\n\nSONAME=`sed -e '/^VERSION=/!d' -e 's/^.* \\([0-9]*\\):.*$/\\1/' -e 'q'     \\\n                                                < \"${TOPDIR}/src/Makefile.am\"`\nexport SONAME\n\n\n################################################################################\n#\n#                       Tunable configuration parameters.\n#\n################################################################################\n\nsetenv TARGETLIB        'LIBSSH2'               # Target OS/400 program library.\nsetenv STATBNDDIR       'LIBSSH2_A'             # Static binding directory.\nsetenv DYNBNDDIR        'LIBSSH2'               # Dynamic binding directory.\nsetenv SRVPGM           \"LIBSSH2.${SONAME}\"     # Service program.\nsetenv TGTCCSID         '500'                   # Target CCSID of objects.\nsetenv DEBUG            '*ALL'                  # Debug level.\nsetenv OPTIMIZE         '10'                    # Optimisation level\nsetenv OUTPUT           '*NONE'                 # Compilation output option.\nsetenv TGTRLS           'V6R1M0'                # Target OS release.\nsetenv IFSDIR           '/libssh2'              # Installation IFS directory.\n\n#       Define ZLIB availability and locations.\n\nsetenv WITH_ZLIB        0                       # Define to 1 to enable.\nsetenv ZLIB_INCLUDE     '/zlib/include'         # ZLIB include IFS directory.\nsetenv ZLIB_LIB         'ZLIB'                  # ZLIB library.\nsetenv ZLIB_BNDDIR      'ZLIB_A'                # ZLIB binding directory.\n\n\n################################################################################\n\n#       Need to get the version definitions.\n\nLIBSSH2_VERSION=`grep '^#define  *LIBSSH2_VERSION '                     \\\n                        \"${TOPDIR}/include/libssh2.h\"                   |\n                sed 's/.*\"\\(.*\\)\".*/\\1/'`\nLIBSSH2_VERSION_MAJOR=`grep '^#define  *LIBSSH2_VERSION_MAJOR '         \\\n                        \"${TOPDIR}/include/libssh2.h\"                   |\n                sed 's/^#define  *LIBSSH2_VERSION_MAJOR  *\\([^ ]*\\).*/\\1/'`\nLIBSSH2_VERSION_MINOR=`grep '^#define  *LIBSSH2_VERSION_MINOR '         \\\n                        \"${TOPDIR}/include/libssh2.h\"                   |\n                sed 's/^#define  *LIBSSH2_VERSION_MINOR  *\\([^ ]*\\).*/\\1/'`\nLIBSSH2_VERSION_PATCH=`grep '^#define  *LIBSSH2_VERSION_PATCH '         \\\n                        \"${TOPDIR}/include/libssh2.h\"                   |\n                sed 's/^#define  *LIBSSH2_VERSION_PATCH  *\\([^ ]*\\).*/\\1/'`\nLIBSSH2_VERSION_NUM=`grep '^#define  *LIBSSH2_VERSION_NUM '             \\\n                        \"${TOPDIR}/include/libssh2.h\"                   |\n                sed 's/^#define  *LIBSSH2_VERSION_NUM  *0x\\([^ ]*\\).*/\\1/'`\nLIBSSH2_TIMESTAMP=`grep '^#define  *LIBSSH2_TIMESTAMP '                 \\\n                        \"${TOPDIR}/include/libssh2.h\"                   |\n                sed 's/.*\"\\(.*\\)\".*/\\1/'`\nexport LIBSSH2_VERSION\nexport LIBSSH2_VERSION_MAJOR LIBSSH2_VERSION_MINOR LIBSSH2_VERSION_PATCH\nexport LIBSSH2_VERSION_NUM LIBSSH2_TIMESTAMP\n\n################################################################################\n#\n#                       OS/400 specific definitions.\n#\n################################################################################\n\nLIBIFSNAME=\"/QSYS.LIB/${TARGETLIB}.LIB\"\n\n\n################################################################################\n#\n#                               Procedures.\n#\n################################################################################\n\n#       action_needed dest [src]\n#\n#       dest is an object to build\n#       if specified, src is an object on which dest depends.\n#\n#       exit 0 (succeeds) if some action has to be taken, else 1.\n\naction_needed()\n\n{\n        [ ! -e \"${1}\" ] && return 0\n        [ \"${2}\" ] || return 1\n        [ \"${1}\" -ot \"${2}\" ] && return 0\n        return 1\n}\n\n\n#       canonicalize_path path\n#\n#       Return canonicalized path as:\n#       - Absolute\n#       - No . or .. component.\n\ncanonicalize_path()\n\n{\n        if expr \"${1}\" : '^/' > /dev/null\n        then    P=\"${1}\"\n        else    P=\"`pwd`/${1}\"\n        fi\n\n        R=\n        IFSSAVE=\"${IFS}\"\n        IFS=\"/\"\n\n        for C in ${P}\n        do      IFS=\"${IFSSAVE}\"\n                case \"${C}\" in\n                .)      ;;\n                ..)     R=`expr \"${R}\" : '^\\(.*/\\)..*'`\n                        ;;\n                ?*)     R=\"${R}${C}/\"\n                        ;;\n                *)      ;;\n                esac\n        done\n\n        IFS=\"${IFSSAVE}\"\n        echo \"/`expr \"${R}\" : '^\\(.*\\)/'`\"\n}\n\n\n#       make_module module_name source_name [additional_definitions]\n#\n#       Compile source name into ASCII module if needed.\n#       As side effect, append the module name to variable MODULES.\n#       Set LINK to \"YES\" if the module has been compiled.\n\nmake_module()\n\n{\n        MODULES=\"${MODULES} ${1}\"\n        MODIFSNAME=\"${LIBIFSNAME}/${1}.MODULE\"\n        action_needed \"${MODIFSNAME}\" \"${2}\" || return 0;\n        SRCDIR=`dirname \\`canonicalize_path \"${2}\"\\``\n\n        #       #pragma convert has to be in the source file itself, i.e.\n        #               putting it in an include file makes it only active\n        #               for that include file.\n        #       Thus we build a temporary file with the pragma prepended to\n        #               the source file and we compile that temporary file.\n\n        echo \"#line 1 \\\"${2}\\\"\" > __tmpsrcf.c\n        echo \"#pragma convert(819)\" >> __tmpsrcf.c\n        echo \"#line 1\" >> __tmpsrcf.c\n        cat \"${2}\" >> __tmpsrcf.c\n        CMD=\"CRTCMOD MODULE(${TARGETLIB}/${1}) SRCSTMF('__tmpsrcf.c')\"\n#       CMD=\"${CMD} SYSIFCOPT(*IFS64IO) OPTION(*INCDIRFIRST *SHOWINC *SHOWSYS)\"\n        CMD=\"${CMD} SYSIFCOPT(*IFS64IO) OPTION(*INCDIRFIRST)\"\n        CMD=\"${CMD} LOCALETYPE(*LOCALE) FLAG(10)\"\n        CMD=\"${CMD} INCDIR('${TOPDIR}/os400/include'\"\n        CMD=\"${CMD} '/QIBM/ProdData/qadrt/include' '${TOPDIR}/include'\"\n        CMD=\"${CMD} '${TOPDIR}/os400' '${SRCDIR}'\"\n\n        if [ \"${WITH_ZLIB}\" != \"0\" ]\n        then    CMD=\"${CMD} '${ZLIB_INCLUDE}'\"\n        fi\n\n        CMD=\"${CMD} ${INCLUDES})\"\n        CMD=\"${CMD} TGTCCSID(${TGTCCSID}) TGTRLS(${TGTRLS})\"\n        CMD=\"${CMD} OUTPUT(${OUTPUT})\"\n        CMD=\"${CMD} OPTIMIZE(${OPTIMIZE})\"\n        CMD=\"${CMD} DBGVIEW(${DEBUG})\"\n\n        DEFINES=\"${3}\"\n\n        if [ \"${WITH_ZLIB}\" != \"0\" ]\n        then    DEFINES=\"${DEFINES} HAVE_LIBZ LIBSSH2_HAVE_ZLIB\"\n        fi\n\n        if [ \"${DEFINES}\" ]\n        then    CMD=\"${CMD} DEFINE(${DEFINES})\"\n        fi\n\n        system \"${CMD}\"\n        rm -f __tmpsrcf.c\n        LINK=YES\n}\n\n\n#       Determine DB2 object name from IFS name.\n\ndb2_name()\n\n{\n        if [ \"${2}\" = 'nomangle' ]\n        then    basename \"${1}\"                                         |\n                tr 'a-z-' 'A-Z_'                                        |\n                sed -e 's/\\..*//;s/^\\(.\\).*\\(.........\\)$/\\1\\2/'\n        else    basename \"${1}\"                                         |\n                tr 'a-z-' 'A-Z_'                                        |\n                sed -e 's/\\..*//;s/^LIBSSH2_/SSH2_/'                    \\\n                    -e 's/^\\(.\\).*\\(.........\\)$/\\1\\2/'                 \\\n                    -e 's/^SPUBLICKEY$/SSH2_PKEY/'\n        fi\n}\n\n\n#       Copy stream replacing version info.\n\nversioned_copy()\n\n{\n        sed -e \"s/@LIBSSH2_VERSION@/${LIBSSH2_VERSION}/g\"               \\\n            -e \"s/@LIBSSH2_VERSION_MAJOR@/${LIBSSH2_VERSION_MAJOR}/g\"   \\\n            -e \"s/@LIBSSH2_VERSION_MINOR@/${LIBSSH2_VERSION_MINOR}/g\"   \\\n            -e \"s/@LIBSSH2_VERSION_PATCH@/${LIBSSH2_VERSION_PATCH}/g\"   \\\n            -e \"s/@LIBSSH2_VERSION_NUM@/${LIBSSH2_VERSION_NUM}/g\"       \\\n            -e \"s/@LIBSSH2_TIMESTAMP@/${LIBSSH2_TIMESTAMP}/g\"\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/libssh2_ccsid.h",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* CCSID conversion support. */\n\n#ifndef LIBSSH2_CCSID_H_\n#define LIBSSH2_CCSID_H_\n\n#include \"libssh2.h\"\n\ntypedef struct _libssh2_string_cache    libssh2_string_cache;\n\n\nLIBSSH2_API char *\nlibssh2_from_ccsid(LIBSSH2_SESSION *session, libssh2_string_cache **cache,\n                   unsigned short ccsid, const char *string, ssize_t inlen,\n                   size_t *outlen);\nLIBSSH2_API char *\nlibssh2_to_ccsid(LIBSSH2_SESSION *session, libssh2_string_cache **cache,\n                 unsigned short ccsid, const char *string, ssize_t inlen,\n                 size_t *outlen);\nLIBSSH2_API void\nlibssh2_release_string_cache(LIBSSH2_SESSION *session,\n                             libssh2_string_cache **cache);\n\n#endif\n\n/* vim: set expandtab ts=4 sw=4: */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/libssh2_config.h",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_CONFIG_H\n#define LIBSSH2_CONFIG_H\n\n/* Define if building universal (internal helper macro) */\n#undef AC_APPLE_UNIVERSAL_BUILD\n\n/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP\n   systems. This function is required for `alloca.c' support on those systems.\n*/\n#undef CRAY_STACKSEG_END\n\n/* Define to 1 if using `alloca.c'. */\n#undef C_ALLOCA\n\n/* Define to 1 if you have `alloca', as a function or macro. */\n#define HAVE_ALLOCA 1\n\n/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix). */\n#define HAVE_ALLOCA_H 1\n\n/* Define to 1 if you have the <arpa/inet.h> header file. */\n#define HAVE_ARPA_INET_H 1\n\n/* Define to 1 if you have the declaration of `SecureZeroMemory', and to 0 if\n   you don't. */\n#undef HAVE_DECL_SECUREZEROMEMORY\n\n/* disabled non-blocking sockets */\n#undef HAVE_DISABLED_NONBLOCKING\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#undef HAVE_DLFCN_H\n\n/* Define to 1 if you have the <errno.h> header file. */\n#define HAVE_ERRNO_H 1\n\n/* Define to 1 if you have the `EVP_aes_128_ctr' function. */\n#undef HAVE_EVP_AES_128_CTR\n\n/* Define to 1 if you have the <fcntl.h> header file. */\n#define HAVE_FCNTL_H 1\n\n/* use FIONBIO for non-blocking sockets */\n#undef HAVE_FIONBIO\n\n/* Define to 1 if you have the `gettimeofday' function. */\n#define HAVE_GETTIMEOFDAY 1\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#define HAVE_INTTYPES_H 1\n\n/* use ioctlsocket() for non-blocking sockets */\n#undef HAVE_IOCTLSOCKET\n\n/* use Ioctlsocket() for non-blocking sockets */\n#undef HAVE_IOCTLSOCKET_CASE\n\n/* Define if you have the bcrypt library. */\n#undef HAVE_LIBBCRYPT\n\n/* Define if you have the crypt32 library. */\n#undef HAVE_LIBCRYPT32\n\n/* Define if you have the gcrypt library. */\n#undef HAVE_LIBGCRYPT\n\n/* Define if you have the ssl library. */\n#undef HAVE_LIBSSL\n\n/* Define if you have the z library. */\n/* #undef HAVE_LIBZ */\n\n/* Define to 1 if the compiler supports the 'long long' data type. */\n#define HAVE_LONGLONG 1\n\n/* Define to 1 if you have the <memory.h> header file. */\n#undef HAVE_MEMORY_H\n\n/* Define to 1 if you have the <netinet/in.h> header file. */\n#define HAVE_NETINET_IN_H 1\n\n/* Define to 1 if you have the <ntdef.h> header file. */\n#undef HAVE_NTDEF_H\n\n/* Define to 1 if you have the <ntstatus.h> header file. */\n#undef HAVE_NTSTATUS_H\n\n/* use O_NONBLOCK for non-blocking sockets */\n#define HAVE_O_NONBLOCK 1\n\n/* Define to 1 if you have the `poll' function. */\n#undef HAVE_POLL\n\n/* Define to 1 if you have the select function. */\n#define HAVE_SELECT 1\n\n/* use SO_NONBLOCK for non-blocking sockets */\n#undef HAVE_SO_NONBLOCK\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#define HAVE_STDINT_H 1\n\n/* Define to 1 if you have the <stdio.h> header file. */\n#define HAVE_STDIO_H 1\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#define HAVE_STDLIB_H 1\n\n/* Define to 1 if you have the <strings.h> header file. */\n#define HAVE_STRINGS_H 1\n\n/* Define to 1 if you have the <string.h> header file. */\n#define HAVE_STRING_H 1\n\n/* Define to 1 if you have the `strtoll' function. */\n#define HAVE_STRTOLL 1\n\n/* Define to 1 if you have the <sys/ioctl.h> header file. */\n#define HAVE_SYS_IOCTL_H 1\n\n/* Define to 1 if you have the <sys/select.h> header file. */\n#undef HAVE_SYS_SELECT_H\n\n/* Define to 1 if you have the <sys/socket.h> header file. */\n#define HAVE_SYS_SOCKET_H 1\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#define HAVE_SYS_STAT_H 1\n\n/* Define to 1 if you have the <sys/time.h> header file. */\n#define HAVE_SYS_TIME_H 1\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#define HAVE_SYS_TYPES_H 1\n\n/* Define to 1 if you have the <sys/uio.h> header file. */\n#define HAVE_SYS_UIO_H 1\n\n/* Define to 1 if you have the <sys/un.h> header file. */\n#define HAVE_SYS_UN_H 1\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#define HAVE_UNISTD_H 1\n\n/* Define to 1 if you have the <windows.h> header file. */\n#undef HAVE_WINDOWS_H\n\n/* Define to 1 if you have the <winsock2.h> header file. */\n#undef HAVE_WINSOCK2_H\n\n/* Define to 1 if you have the <ws2tcpip.h> header file. */\n#undef HAVE_WS2TCPIP_H\n\n/* to make a symbol visible */\n#undef LIBSSH2_API\n\n/* Enable clearing of memory before being freed */\n#define LIBSSH2_CLEAR_MEMORY 1\n\n/* Enable \"none\" cipher -- NOT RECOMMENDED */\n#undef LIBSSH2_CRYPT_NONE\n\n/* Enable newer diffie-hellman-group-exchange-sha1 syntax */\n#define LIBSSH2_DH_GEX_NEW 1\n\n/* Compile in zlib support */\n/* #undef LIBSSH2_HAVE_ZLIB */\n\n/* Use libgcrypt */\n#undef LIBSSH2_LIBGCRYPT\n\n/* Enable \"none\" MAC -- NOT RECOMMENDED */\n#undef LIBSSH2_MAC_NONE\n\n/* Use OpenSSL */\n#undef LIBSSH2_OPENSSL\n\n/* Use Windows CNG */\n#undef LIBSSH2_WINCNG\n\n/* Use OS/400 Qc3 */\n#define LIBSSH2_OS400QC3\n\n/* Define to the sub-directory in which libtool stores uninstalled libraries.\n*/\n#define LT_OBJDIR \".libs/\"\n\n/* Define to 1 if _REENTRANT preprocessor symbol must be defined. */\n#undef NEED_REENTRANT\n\n/* Name of package */\n#define PACKAGE \"libssh2\"\n\n/* Define to the address where bug reports for this package should be sent. */\n#define PACKAGE_BUGREPORT \"libssh2-devel@cool.haxx.se\"\n\n/* Define to the full name of this package. */\n#define PACKAGE_NAME \"libssh2\"\n\n/* Define to the full name and version of this package. */\n#define PACKAGE_STRING \"libssh2 -\"\n\n/* Define to the one symbol short name of this package. */\n#define PACKAGE_TARNAME \"libssh2\"\n\n/* Define to the home page for this package. */\n#define PACKAGE_URL \"\"\n\n/* Define to the version of this package. */\n#define PACKAGE_VERSION \"-\"\n\n/* If using the C implementation of alloca, define if you know the\n   direction of stack growth for your system; otherwise it will be\n   automatically deduced at runtime.\n\tSTACK_DIRECTION > 0 => grows toward higher addresses\n\tSTACK_DIRECTION < 0 => grows toward lower addresses\n\tSTACK_DIRECTION = 0 => direction of growth unknown */\n#undef STACK_DIRECTION\n\n/* Define to 1 if you have the ANSI C header files. */\n#define STDC_HEADERS 1\n\n/* Version number of package */\n#define VERSION \"-\"\n\n/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most\n   significant byte first (like Motorola and SPARC, unlike Intel). */\n#define WORDS_BIGENDIAN 1\n\n/* Enable large inode numbers on Mac OS X 10.5.  */\n#ifndef _DARWIN_USE_64_BIT_INODE\n# define _DARWIN_USE_64_BIT_INODE 1\n#endif\n\n/* Number of bits in a file offset, on hosts where this is settable. */\n#undef _FILE_OFFSET_BITS\n\n/* Define for large files, on AIX-style hosts. */\n#undef _LARGE_FILES\n\n/* Define to empty if `const' does not conform to ANSI C. */\n#undef const\n\n/* Define to `__inline__' or `__inline' if that's what the C compiler\n   calls it, or to nothing if 'inline' is not supported under any name.  */\n#ifndef __cplusplus\n#define inline\n#endif\n\n/* Define to `unsigned int' if <sys/types.h> does not define. */\n#undef size_t\n\n\n#ifndef LIBSSH2_DISABLE_QADRT_EXT\n/* Remap zlib procedures to ASCII versions. */\n#pragma map(inflateInit_, \"_libssh2_os400_inflateInit_\")\n#pragma map(deflateInit_, \"_libssh2_os400_deflateInit_\")\n#endif\n\n#endif\n/* vim: set expandtab ts=4 sw=4: */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/libssh2rpg/libssh2.rpgle.in",
    "content": "      * Copyright (c) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n      * All rights reserved.\n      *\n      * Redistribution and use in source and binary forms,\n      * with or without modification, are permitted provided\n      * that the following conditions are met:\n      *\n      *   Redistributions of source code must retain the above\n      *   copyright notice, this list of conditions and the\n      *   following disclaimer.\n      *\n      *   Redistributions in binary form must reproduce the above\n      *   copyright notice, this list of conditions and the following\n      *   disclaimer in the documentation and/or other materials\n      *   provided with the distribution.\n      *\n      *   Neither the name of the copyright holder nor the names\n      *   of any other contributors may be used to endorse or\n      *   promote products derived from this software without\n      *   specific prior written permission.\n      *\n      * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n      * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n      * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n      * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n      * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n      * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n      * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n      * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n      * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n      * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n      * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n      * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n      * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n      * OF SUCH DAMAGE.\n\n      /if not defined(LIBSSH2_H_)\n      /define LIBSSH2_H_\n\n     d LIBSSH2_COPYRIGHT...\n     d                 c                   '2004-2015 The libssh2 project and +\n     d                                     its contributors.'\n\n      * We use underscore instead of dash when appending DEV in dev versions\n      * just to make the BANNER define (used by src/session.c) be a valid SSH\n      * banner. Release versions have no appended strings and may of course not\n      * have dashes either.\n     d LIBSSH2_VERSION...\n     d                 c                   '@LIBSSH2_VERSION@'\n\n      * The numeric version number is also available \"in parts\" by using these\n      * defines:\n     d LIBSSH2_VERSION_MAJOR...\n     d                 c                   @LIBSSH2_VERSION_MAJOR@\n     d LIBSSH2_VERSION_MINOR...\n     d                 c                   @LIBSSH2_VERSION_MINOR@\n     d LIBSSH2_VERSION_PATCH...\n     d                 c                   @LIBSSH2_VERSION_PATCH@\n\n      * This is the numeric version of the libssh2 version number, meant for\n      * easier parsing and comparions by programs. The LIBSSH2_VERSION_NUM\n      * define will always follow this syntax:\n      *\n      *  X'XXYYZZ'\n      *\n      * Where XX, YY and ZZ are the main version, release and patch numbers in\n      * hexadecimal (using 8 bits each). All three numbers are always\n      * represented using two digits.  1.2 would appear as \"0x010200\" while\n      * version 9.11.7 appears as X'090b07'.\n      *\n      * This 6-digit (24 bits) hexadecimal number does not show pre-release\n      * number, and it is always a greater number in a more recent release. It\n      * makes comparisons with greater than and less than work.\n\n     d LIBSSH2_VERSION_NUM...\n     d                 c                   X'@LIBSSH2_VERSION_NUM@'\n\n      * This is the date and time when the full source package was created. The\n      * timestamp is not stored in the source code repo, as the timestamp is\n      * properly set in the tarballs by the maketgz script.\n      *\n      * The format of the date should follow this template:\n      *\n      * \"Mon Feb 12 11:35:33 UTC 2007\"\n\n     d LIBSSH2_TIMESTAMP...\n     d                 c                   '@LIBSSH2_TIMESTAMP@'\n\n     d libssh2_Cchar   s              3i 0 based(######typedef######)\n     d libssh2_Cuchar  s              3u 0 based(######typedef######)\n     d libssh2_Cshort  s              5i 0 based(######typedef######)\n     d libssh2_Cushort...\n     d                 s              5u 0 based(######typedef######)\n     d libssh2_Cint    s             10i 0 based(######typedef######)\n     d libssh2_CuInt   s             10u 0 based(######typedef######)\n     d libssh2_Clong   s             10i 0 based(######typedef######)\n     d libssh2_Culong  s             10u 0 based(######typedef######)\n     d libssh2_Clonglong...\n     d                 s             20i 0 based(######typedef######)\n     d libssh2_Culonglong...\n     d                 s             20u 0 based(######typedef######)\n     d libssh2_Cenum   s             10i 0 based(######typedef######)\n     d libssh2_Cssize_t...\n     d                 s             10i 0 based(######typedef######)\n     d libssh2_Csize_t...\n     d                 s             10u 0 based(######typedef######)\n     d libssh2_Cfloat  s              4f   based(######typedef######)\n     d libssh2_Cdouble...\n     d                 s              8f   based(######typedef######)\n\n     d libssh2_uint8_t...\n     d                 s              3u 0 based(######typedef######)\n     d libssh2_uint32_t...\n     d                 s             10u 0 based(######typedef######)\n     d libssh2_uint64_t...\n     d                 s             20u 0 based(######typedef######)\n     d libssh2_int64_t...\n     d                 s             20i 0 based(######typedef######)\n\n     d libssh2_socket_t...\n     d                 s             10i 0 based(######typedef######)\n     d LIBSSH2_INVALID_SOCKET...\n     d                 c                   -1\n\n     d libssh2_mode_t  s             10u 0 based(######typedef######)\n     d libssh2_ino_t   s             10u 0 based(######typedef######)\n     d libssh2_uid_t   s             10u 0 based(######typedef######)\n     d libssh2_gid_t   s             10u 0 based(######typedef######)\n     d libssh2_dev_t   s             10u 0 based(######typedef######)\n     d libssh2_off_t   s             20i 0 based(######typedef######)           Use *IFS64IO\n     d libssh2_time_t  s             10i 0 based(######typedef######)\n     d libssh2_nlink_t...\n     d                 s              5u 0 based(######typedef######)\n     d libssh2_qp0l_objtype_t...                                                AS400 object type\n     d                 s             11\n\n     d libssh2_struct_stat_size...\n     d                 s                   based(######typedef######)\n     d                                     like(libssh2_off_t)\n\n     d libssh2_struct_stat...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n     d  st_mode                            like(libssh2_mode_t)                 Mode flags\n     d  st_ino                             like(libssh2_ino_t)                  File serial number\n     d  st_nlink                           like(libssh2_nlink_t)                Number of links\n     d  st_uid                             like(libssh2_uid_t)                  Owner ID\n     d  st_gid                             like(libssh2_gid_t)                  Group ID\n     d  st_size                            like(libssh2_off_t)                  File size\n     d  st_atime                           like(libssh2_time_t)                 Last access time\n     d  st_mtime                           like(libssh2_time_t)                 Last update time\n     d  st_ctime                           like(libssh2_time_t)                 Creation time\n     d  st_dev                             like(libssh2_dev_t)                  File root device\n     d  st_blksize                         like(libssh2_Csize_t)                Block size\n     d  st_allocsize                       like(libssh2_Culong)                 Allocation size\n     d  st_objtype                         like(libssh2_qp0l_objtype_t)         AS400 object type\n     d  st_codepage                        like(libssh2_Cushort)                Object data codepage\n     d                               62                                         Reserved\n     d  st_ino_gen_id                      like(libssh2_Cuint)                  File SN gen. ID\n\n     d LIBSSH2_STRUCT_STAT_SIZE_FORMAT...\n     d                 c                   '%lld'\n\n      * Part of every banner, user specified or not.\n     d LIBSSH2_SSH_BANNER...\n     d                 c                   'SSH-2.0-libssh2_1.6.1_DEV'\n     d LIBSSH2_SSH_DEFAULT_BANNER...\n     d                 c                   'SSH-2.0-libssh2_1.6.1_DEV'\n\n      * Default generate and safe prime sizes for\n      * diffie-hellman-group-exchange-sha1.\n     d LIBSSH2_DH_GEX_MINGROUP...\n     d                 c                   1024\n     d LIBSSH2_DH_GEX_OPTGROUP...\n     d                 c                   1536\n     d LIBSSH2_DH_GEX_MAXGROUP...\n     d                 c                   2048\n\n      * Defaults for pty requests.\n     d LIBSSH2_TERM_WIDTH...\n     d                 c                   80\n     d LIBSSH2_TERM_HEIGHT...\n     d                 c                   24\n     d LIBSSH2_TERM_WIDTH_PX...\n     d                 c                   0\n     d LIBSSH2_TERM_HEIGHT_PX...\n     d                 c                   0\n\n      * 1/4 second.\n     d LIBSSH2_SOCKET_POLL_UDELAY...\n     d                 c                   250000\n      * 0.25 * 120 == 30 seconds.\n     d LIBSSH2_SOCKET_POLL_MAXLOOPS...\n     d                 c                   120\n\n      * Maximum size to allow a payload to compress to, plays it safe by\n      * falling short of spec limits.\n     d LIBSSH2_PACKET_MAXCOMP...\n     d                 c                   32000\n\n      * Maximum size to allow a payload to deccompress to, plays it safe by\n      * allowing more than spec requires.\n     d LIBSSH2_PACKET_MAXDECOMP...\n     d                 c                   40000\n\n      * Maximum size for an inbound compressed payload, plays it safe by\n      * overshooting spec limits.\n     d LIBSSH2_PACKET_MAXPAYLOAD...\n     d                 c                   40000\n\n     d LIBSSH2_USERAUTH_KBDINT_PROMPT...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n     d  text                           *                                        char *\n     d  length                             like(libssh2_Cuint)\n     d  echo                               like(libssh2_Cuchar)\n\n     d LIBSSH2_USERAUTH_KBDINT_RESPONSE...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n     d  text                           *                                        char *\n     d  length                             like(libssh2_Cuint)\n\n      * libssh2_session_callback_set() constants.\n     d LIBSSH2_CALLBACK_IGNORE...\n     d                 c                   0\n     d LIBSSH2_CALLBACK_DEBUG...\n     d                 c                   1\n     d LIBSSH2_CALLBACK_DISCONNECT...\n     d                 c                   2\n     d LIBSSH2_CALLBACK_MACERROR...\n     d                 c                   3\n     d LIBSSH2_CALLBACK_X11...\n     d                 c                   4\n     d LIBSSH2_CALLBACK_SEND...\n     d                 c                   5\n     d LIBSSH2_CALLBACK_RECV...\n     d                 c                   6\n\n      * libssh2_session_method_pref() constants.\n     d LIBSSH2_METHOD_KEX...\n     d                 c                   0\n     d LIBSSH2_METHOD_HOSTKEY...\n     d                 c                   1\n     d LIBSSH2_METHOD_CRYPT_CS...\n     d                 c                   2\n     d LIBSSH2_METHOD_CRYPT_SC...\n     d                 c                   3\n     d LIBSSH2_METHOD_MAC_CS...\n     d                 c                   4\n     d LIBSSH2_METHOD_MAC_SC...\n     d                 c                   5\n     d LIBSSH2_METHOD_COMP_CS...\n     d                 c                   6\n     d LIBSSH2_METHOD_COMP_SC...\n     d                 c                   7\n     d LIBSSH2_METHOD_LANG_CS...\n     d                 c                   8\n     d LIBSSH2_METHOD_LANG_SC...\n     d                 c                   9\n\n      * flags.\n     d LIBSSH2_FLAG_SIGPIPE...\n     d                 c                   X'0001'\n     d LIBSSH2_FLAG_COMPRESS...\n     d                 c                   X'0002'\n\n     d LIBSSH2_POLLFD  ds                  based(######typedef######)\n     d                                     align qualified\n     d  type                               like(libssh2_Cuchar)\n     d  fd                             *                                        Union\n     d   socket                            overlay(fd) like(libssh2_socket_t)\n     d   channel                       *   overlay(fd)                          LIBSSH2_CHANNEL *\n     d   listener                      *   overlay(fd)                          LIBSSH2_LISTENER *\n     d  events                             like(libssh2_Culong)\n     d  revents                            like(libssh2_Culong)\n\n      * Poll FD Descriptor Types.\n     d LIBSSH2_POLLFD_SOCKET...\n     d                 c                   1\n     d LIBSSH2_POLLFD_CHANNEL...\n     d                 c                   2\n     d LIBSSH2_POLLFD_LISTENER...\n     d                 c                   3\n\n      * Poll FD events/revents -- Match sys/poll.h where possible.\n     d LIBSSH2_POLLFD_POLLIN...                                                 Input data ready or\n     d                 c                   X'0001'                              connection available\n     d LIBSSH2_POLLFD_POLLPRI...                                                Prio data ready to\n     d                 c                   X'0002'                              be read. Socket only\n     d LIBSSH2_POLLFD_POLLEXT...                                                Ext data ready to be\n     d                 c                   X'0002'                              read. Channel only\n     d LIBSSH2_POLLFD_POLLOUT...                                                Can may be written:\n     d                 c                   X'0004'                              Socket/Channel\n\n      * revents only.\n     d LIBSSH2_POLLFD_POLLERR...                                                Error Condition:\n     d                 c                   X'0008'                              Socket\n     d LIBSSH2_POLLFD_POLLHUP...                                                HangUp/EOF\n     d                 c                   X'0010'                              Socket\n     d LIBSSH2_POLLFD_SESSION_CLOSED...                                         Session Disconnect\n     d                 c                   X'0010'\n     d LIBSSH2_POLLFD_POLLNVAL...                                               Invalid request\n     d                 c                   X'0020'                              Socket\n     d LIBSSH2_POLLFD_POLLEX...                                                 Exception Condition\n     d                 c                   X'0040'                              Socket/Win32\n     d LIBSSH2_POLLFD_CHANNEL_CLOSED...                                         Channel Disconnect\n     d                 c                   X'0080'\n     d LIBSSH2_POLLFD_LISTENER_CLOSED...                                        Listener Disconnect\n     d                 c                   X'0080'\n\n      /define HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION\n      * Block Direction Types.\n     d LIBSSH2_SESSION_BLOCK_INBOUND...\n     d                 c                   X'0001'\n     d LIBSSH2_SESSION_BLOCK_OUTBOUND...\n     d                 c                   X'0002'\n\n      * Hash Types.\n     d LIBSSH2_HOSTKEY_HASH_MD5...\n     d                 c                   1\n     d LIBSSH2_HOSTKEY_HASH_SHA1...\n     d                 c                   2\n\n      * Hostkey Types.\n     d LIBSSH2_HOSTKEY_TYPE_UNKNOWN...\n     d                 c                   0\n     d LIBSSH2_HOSTKEY_TYPE_RSA...\n     d                 c                   1\n     d LIBSSH2_HOSTKEY_TYPE_DSS...\n     d                 c                   2\n\n      * Disconnect Codes (defined by SSH protocol).\n     d SSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT...\n     d                 c                   1\n     d SSH_DISCONNECT_PROTOCOL_ERROR...\n     d                 c                   2\n     d SSH_DISCONNECT_KEY_EXCHANGE_FAILED...\n     d                 c                   3\n     d SSH_DISCONNECT_RESERVED...\n     d                 c                   4\n     d SSH_DISCONNECT_MAC_ERROR...\n     d                 c                   5\n     d SSH_DISCONNECT_COMPRESSION_ERROR...\n     d                 c                   6\n     d SSH_DISCONNECT_SERVICE_NOT_AVAILABLE...\n     d                 c                   7\n     d SSH_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED...\n     d                 c                   8\n     d SSH_DISCONNECT_HOST_KEY_NOT_VERIFIABLE...\n     d                 c                   9\n     d SSH_DISCONNECT_CONNECTION_LOST...\n     d                 c                   10\n     d SSH_DISCONNECT_BY_APPLICATION...\n     d                 c                   11\n     d SSH_DISCONNECT_TOO_MANY_CONNECTIONS...\n     d                 c                   12\n     d SSH_DISCONNECT_AUTH_CANCELLED_BY_USER...\n     d                 c                   13\n     d SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE...\n     d                 c                   14\n     d SSH_DISCONNECT_ILLEGAL_USER_NAME...\n     d                 c                   15\n\n      * Error Codes (defined by libssh2).\n     d LIBSSH2_ERROR_NONE...\n     d                 c                   0\n\n      * The library once used -1 as a generic error return value on numerous\n      * places through the code, which subsequently was converted to\n      * LIBSSH2_ERROR_SOCKET_NONE uses over time. As this is a generic error\n      * code, the goal is to never ever return this code but instead make sure\n      * that a more accurate and descriptive error code is used.\n     d  LIBSSH2_ERROR_SOCKET_NONE...\n     d                 c                   -1\n\n     d LIBSSH2_ERROR_BANNER_RECV...\n     d                 c                   -2\n     d LIBSSH2_ERROR_BANNER_SEND...\n     d                 c                   -3\n     d LIBSSH2_ERROR_INVALID_MAC...\n     d                 c                   -4\n     d LIBSSH2_ERROR_KEX_FAILURE...\n     d                 c                   -5\n     d LIBSSH2_ERROR_ALLOC...\n     d                 c                   -6\n     d LIBSSH2_ERROR_SOCKET_SEND...\n     d                 c                   -7\n     d LIBSSH2_ERROR_KEY_EXCHANGE_FAILURE...\n     d                 c                   -8\n     d LIBSSH2_ERROR_TIMEOUT...\n     d                 c                   -9\n     d LIBSSH2_ERROR_HOSTKEY_INIT...\n     d                 c                   -10\n     d LIBSSH2_ERROR_HOSTKEY_SIGN...\n     d                 c                   -11\n     d LIBSSH2_ERROR_DECRYPT...\n     d                 c                   -12\n     d LIBSSH2_ERROR_SOCKET_DISCONNECT...\n     d                 c                   -13\n     d LIBSSH2_ERROR_PROTO...\n     d                 c                   -14\n     d LIBSSH2_ERROR_PASSWORD_EXPIRED...\n     d                 c                   -15\n     d LIBSSH2_ERROR_FILE...\n     d                 c                   -16\n     d LIBSSH2_ERROR_METHOD_NONE...\n     d                 c                   -17\n     d LIBSSH2_ERROR_AUTHENTICATION_FAILED...\n     d                 c                   -18\n     d LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED...\n     d                 c                   -18\n     d LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED...\n     d                 c                   -19\n     d LIBSSH2_ERROR_CHANNEL_OUTOFORDER...\n     d                 c                   -20\n     d LIBSSH2_ERROR_CHANNEL_FAILURE...\n     d                 c                   -21\n     d LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED...\n     d                 c                   -22\n     d LIBSSH2_ERROR_CHANNEL_UNKNOWN...\n     d                 c                   -23\n     d LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED...\n     d                 c                   -24\n     d LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED...\n     d                 c                   -25\n     d LIBSSH2_ERROR_CHANNEL_CLOSED...\n     d                 c                   -26\n     d LIBSSH2_ERROR_CHANNEL_EOF_SENT...\n     d                 c                   -27\n     d LIBSSH2_ERROR_SCP_PROTOCOL...\n     d                 c                   -28\n     d LIBSSH2_ERROR_ZLIB...\n     d                 c                   -29\n     d LIBSSH2_ERROR_SOCKET_TIMEOUT...\n     d                 c                   -30\n     d LIBSSH2_ERROR_SFTP_PROTOCOL...\n     d                 c                   -31\n     d LIBSSH2_ERROR_REQUEST_DENIED...\n     d                 c                   -32\n     d LIBSSH2_ERROR_METHOD_NOT_SUPPORTED...\n     d                 c                   -33\n     d LIBSSH2_ERROR_INVAL...\n     d                 c                   -34\n     d LIBSSH2_ERROR_INVALID_POLL_TYPE...\n     d                 c                   -35\n     d LIBSSH2_ERROR_PUBLICKEY_PROTOCOL...\n     d                 c                   -36\n     d LIBSSH2_ERROR_EAGAIN...\n     d                 c                   -37\n     d LIBSSH2_ERROR_BUFFER_TOO_SMALL...\n     d                 c                   -38\n     d LIBSSH2_ERROR_BAD_USE...\n     d                 c                   -39\n     d LIBSSH2_ERROR_COMPRESS...\n     d                 c                   -40\n     d LIBSSH2_ERROR_OUT_OF_BOUNDARY...\n     d                 c                   -41\n     d LIBSSH2_ERROR_AGENT_PROTOCOL...\n     d                 c                   -42\n     d LIBSSH2_ERROR_SOCKET_RECV...\n     d                 c                   -43\n     d LIBSSH2_ERROR_ENCRYPT...\n     d                 c                   -44\n     d LIBSSH2_ERROR_BAD_SOCKET...\n     d                 c                   -45\n     d LIBSSH2_ERROR_KNOWN_HOSTS...\n     d                 c                   -46\n\n      * this is a define to provide the old (<= 1.2.7) name.\n     d LIBSSH2_ERROR_BANNER_NONE...\n     d                 c                   -2\n\n      * Global API.\n     d LIBSSH2_INIT_NO_CRYPTO...\n     d                 c                   X'0001'\n\n      * libssh2_init()\n      *\n      * Initialize the libssh2 functions.  This typically initialize the\n      * crypto library.  It uses a global state, and is not thread safe --\n      * you must make sure this function is not called concurrently.\n      *\n      * Flags can be:\n      * 0:                              Normal initialize\n      * LIBSSH2_INIT_NO_CRYPTO:         Do not initialize the crypto library\n      *                                 (ie. OPENSSL_add_cipher_algorithms() for\n      *                                 OpenSSL)\n      *\n      * Returns 0 if succeeded, or a negative value for error.\n\n     d libssh2_init    pr                  extproc('libssh2_init')\n     d                                     like(libssh2_Cint)\n     d  flags                              value like(libssh2_Cint)\n\n      * libssh2_exit()\n      *\n      * Exit the libssh2 functions and free's all memory used internal.\n\n     d libssh2_exit    pr                  extproc('libssh2_exit')\n\n      * libssh2_free()\n      *\n      * Deallocate memory allocated by earlier call to libssh2 functions.\n\n     d libssh2_free    pr                  extproc('libssh2_free')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  ptr                            *   value                                void *\n\n      * libssh2_session_supported_algs()\n      *\n      * Fills algs with a list of supported cryptographic algorithms. Returns a\n      * non-negative number (number of supported algorithms) on success or a\n      * negative number (an eror code) on failure.\n      *\n      * NOTE: on success, algs must be deallocated (by calling libssh2_free)\n      * when not needed anymore\n\n     d libssh2_session_supported_algs...\n     d                 pr                  extproc(\n     d                                       'libssh2_session_supported_algs')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  method_type                        value like(libssh2_Cint)\n     d  algs                           *                                        const char **(*)\n\n      * Session API.\n     d libssh2_session_init_ex...\n     d                 pr              *   extproc('libssh2_session_init_ex')   LIBSSH2_SESSION *\n     d  my_alloc                       *   value procptr\n     d  my_free                        *   value procptr\n     d  my_realloc                     *   value procptr\n     d  abstract                       *   value                                void *\n\n      * Implementation of C macro.\n     d libssh2_session_init...\n     d                 pr              *   extproc('libssh2_session_init')      LIBSSH2_SESSION *\n\n     d libssh2_session_abstract...\n     d                 pr              *   extproc('libssh2_session_abstract')  void * *\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_session_callback_set...\n     d                 pr              *   extproc(                             void *\n     d                                     'libssh2_session_callback_set')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  cbtype                             value like(libssh2_Cint)\n     d  callback                       *   value                                void *\n\n     d libssh2_session_banner_set...\n     d                 pr                  extproc('libssh2_session_banner_set')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  banner                         *   value options(*string)               const char *\n\n     d libssh2_banner_set...\n     d                 pr                  extproc('libssh2_banner_set')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  banner                         *   value options(*string)               const char *\n\n     d libssh2_session_startup...\n     d                 pr                  extproc('libssh2_session_startup')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  sock                               value like(libssh2_Cint)\n\n     d libssh2_session_handshake...\n     d                 pr                  extproc('libssh2_session_handshake')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  sock                               value like(libssh2_socket_t)\n\n     d libssh2_session_disconnect_ex...\n     d                 pr                  extproc(\n     d                                     'libssh2_session_disconnect_ex')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  reason                             value like(libssh2_Cint)\n     d  description                    *   value options(*string)               const char *\n     d  lang                           *   value options(*string)               const char *\n\n      * Implementation of C macro.\n     d libssh2_session_disconnect...\n     d                 pr                  extproc('libssh2_session_disconnect')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  description                    *   value options(*string)               const char *\n\n     d libssh2_session_free...\n     d                 pr                  extproc('libssh2_session_free')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_hostkey_hash...\n     d                 pr              *   extproc('libssh2_hostkey_hash')      const char *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  hash_type                          value like(libssh2_Cint)\n\n     d libssh2_session_hostkey...\n     d                 pr              *   extproc('libssh2_session_hostkey')   const char *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  len                                like(libssh2_Csize_t)\n     d  type                               like(libssh2_Cint)\n\n     d libssh2_session_method_pref...\n     d                 pr                  extproc(\n     d                                     'libssh2_session_method_pref')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  method_type                        value like(libssh2_Cint)\n     d  prefs                          *   value options(*string)               const char *\n\n     d libssh2_session_methods...\n     d                 pr              *   extproc('libssh2_session_methods')   const char *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  method_type                        value like(libssh2_Cint)\n\n     d libssh2_session_last_error...\n     d                 pr                  extproc('libssh2_session_last_error')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  errmsg                         *                                        char *(*)\n     d  errmsg_len                         like(libssh2_Cint)\n     d  want_buf                           value like(libssh2_Cint)\n\n     d libssh2_session_last_errno...\n     d                 pr                  extproc('libssh2_session_last_errno')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_session_set_last_error...\n     d                 pr                  extproc(\n     d                                     'libssh2_session_set_last_error')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  errcode                            value like(libssh2_Cint)\n     d  errmsg                         *   value options(*string)               const char *\n\n     d libssh2_session_block_directions...\n     d                 pr                  extproc(\n     d                                     'libssh2_session_block_directions')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_session_flag...\n     d                 pr                  extproc('libssh2_session_flag')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  flag                               value like(libssh2_Cint)\n     d  value                              value like(libssh2_Cint)\n\n     d libssh2_session_banner_get...\n     d                 pr              *   extproc('libssh2_session_banner_get') const char *\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n      * Userauth API.\n\n     d libssh2_userauth_list...\n     d                 pr              *   extproc('libssh2_userauth_list')     char *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  username_len                       value like(libssh2_Cuint)\n\n     d libssh2_userauth_authenticated...\n     d                 pr                  extproc(\n     d                                     'libssh2_userauth_authenticated')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_userauth_password_ex...\n     d                 pr                  extproc(\n     d                                     'libssh2_userauth_password_ex')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  username_len                       value like(libssh2_Cuint)\n     d  password                       *   value options(*string)               const char *\n     d  password_len                       value like(libssh2_Cuint)\n     d  passwd_change_cb...\n     d                                 *   value procptr\n\n      * Implementation of C macro.\n     d libssh2_userauth_password...\n     d                 pr                  extproc('libssh2_userauth_password')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  password                       *   value options(*string)               const char *\n\n     d libssh2_userauth_publickey_fromfile_ex...\n     d                 pr                  extproc('libssh2_userauth_publickey_-\n     d                                     fromfile_ex')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  username_len                       value like(libssh2_Cuint)\n     d  publickey                      *   value options(*string)               const char *\n     d  privatekey                     *   value options(*string)               const char *\n     d  passphrase                     *   value options(*string)               const char *\n\n      * Implementation of C macro.\n     d libssh2_userauth_publickey_fromfile...\n     d                 pr                  extproc(\n     d                                     'libssh2_userauth_publickey_fromfile'\n     d                                     )\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  publickey                      *   value options(*string)               const char *\n     d  privatekey                     *   value options(*string)               const char *\n     d  passphrase                     *   value options(*string)               const char *\n\n     d libssh2_userauth_publickey...\n     d                 pr                  extproc('libssh2_userauth_publickey')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  pubkeydata                     *   value options(*string)               const unsigned char*\n     d  pubkeydata_len...\n     d                                     value like(libssh2_Csize_t)\n     d  sign_callback                  *   value procptr\n     d  abstract                       *                                        void *(*)\n\n     d libssh2_userauth_hostbased_fromfile_ex...\n     d                 pr                  extproc('libssh2_userauth_hostbased_-\n     d                                     fromfile_ex')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  username_len                       value like(libssh2_Cuint)\n     d  publickey                      *   value options(*string)               const char *\n     d  privatekey                     *   value options(*string)               const char *\n     d  passphrase                     *   value options(*string)               const char *\n     d  hostname                       *   value options(*string)               const char *\n     d  hostname_len                       value like(libssh2_Cuint)\n     d  local_username...\n     d                                 *   value options(*string)               const char *\n     d  local_username_len...\n     d                                     value like(libssh2_Cuint)\n\n      * C macro implementation.\n     d libssh2_userauth_hostbased_fromfile...\n     d                 pr                  extproc(\n     d                                     'libssh2_userauth_hostbased_fromfile'\n     d                                     )\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  publickey                      *   value options(*string)               const char *\n     d  privatekey                     *   value options(*string)               const char *\n     d  passphrase                     *   value options(*string)               const char *\n     d  hostname                       *   value options(*string)               const char *\n\n     d libssh2_userauth_publickey_frommemory...\n     d                 pr                  extproc('libssh2_userauth_publickey_-\n     d                                     frommemory')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  username_len                       value like(libssh2_Csize_t)\n     d  publickeyfiledata...\n     d                                 *   value options(*string)               const char *\n     d  publickeyfiledata_len...\n     d                                     value like(libssh2_Csize_t)\n     d  privatekeyfiledata...\n     d                                 *   value options(*string)               const char *\n     d  privatekeyfiledata_len...\n     d                                     value like(libssh2_Csize_t)\n     d  passphrase                     *   value options(*string)               const char *\n\n      * response_callback is provided with filled by library prompts array,\n      * but client must allocate and fill individual responses. Responses\n      * array is already allocated. Responses data will be freed by libssh2\n      * after callback return, but before subsequent callback invokation.\n\n     d libssh2_userauth_keyboard_interactive_ex...\n     d                 pr                  extproc('libssh2_userauth_keyboard_i-\n     d                                     nteractive_ex')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  username_len                       value like(libssh2_Cuint)\n     d  response_callback...\n     d                                 *   value procptr\n\n      * C macro implementation.\n     d libssh2_userauth_keyboard_interactive...\n     d                 pr                  extproc('libssh2_userauth_keyboard_i-\n     d                                     nteractive')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  username                       *   value options(*string)               const char *\n     d  response_callback...\n     d                                 *   value procptr\n\n     d libssh2_poll    pr                  extproc('libssh2_poll')\n     d                                     like(libssh2_Cint)\n     d  fds                            *   value                                LIBSSH2_POLLFD *\n     d  nfds                               value like(libssh2_Cuint)\n     d  timeout                            value like(libssh2_Clong)\n\n      * Channel API.\n     d LIBSSH2_CHANNEL_WINDOW_DEFAULT...\n     d                 c                   X'00200000'\n     d LIBSSH2_CHANNEL_PACKET_DEFAULT...\n     d                 c                   32768\n     d LIBSSH2_CHANNEL_MINADJUST...\n     d                 c                   1024\n\n      * Extended Data Handling.\n     d LIBSSH2_CHANNEL_EXTENDED_DATA_NORMAL...\n     d                 c                   0\n     d LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE...\n     d                 c                   1\n     d LIBSSH2_CHANNEL_EXTENDED_DATA_MERGE...\n     d                 c                   2\n\n     d SSH_EXTENDED_DATA_STDERR...\n     d                 c                   1\n\n      * Returned by any function that would block during a read/write\n      * operation.\n     d LIBSSH2CHANNEL_EAGAIN...                                                 LIBSSH2_ERROR_EAGAIN\n     d                 c                   -37\n\n     d libssh2_channel_open_ex...\n     d                 pr              *   extproc('libssh2_channel_open_ex')   LIBSSH2_CHANNEL *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  channel_type                   *   value options(*string)               const char *\n     d  channel_type_len...\n     d                                     value like(libssh2_Cuint)\n     d  window_size                        value like(libssh2_Cuint)\n     d  packet_size                        value like(libssh2_Cuint)\n     d  message                        *   value options(*string)               const char *\n     d  message_len                        value like(libssh2_Cuint)\n\n      * C macro implementation.\n     d libssh2_channel_open_session...\n     d                 pr              *   extproc(                             LIBSSH2_CHANNEL *\n     d                                     'libssh2_channel_open_session')\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_channel_direct_tcpip_ex...\n     d                 pr              *   extproc(                             LIBSSH2_CHANNEL *\n     d                                     'libssh2_channel_direct_tcpip_ex')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  host                           *   value options(*string)               const char *\n     d  port                               value like(libssh2_Cint)\n     d  shost                          *   value options(*string)               const char *\n     d  sport                              value like(libssh2_Cint)\n\n      * C macro implementation.\n     d libssh2_channel_direct_tcpip...\n     d                 pr              *   extproc(                             LIBSSH2_CHANNEL *\n     d                                     'libssh2_channel_direct_tcpip')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  host                           *   value options(*string)               const char *\n     d  port                               value like(libssh2_Cint)\n\n     d libssh2_channel_forward_listen_ex...\n     d                 pr              *   extproc(                             LIBSSH2_LISTENER *\n     d                                     'libssh2_channel_forward_listen_ex')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  host                           *   value options(*string)               const char *\n     d  port                               value like(libssh2_Cint)\n     d  bound_port                         like(libssh2_Cint)\n     d  queue_maxsize                      value like(libssh2_Cint)\n\n      * C macro implementation.\n     d libssh2_channel_forward_listen...\n     d                 pr              *   extproc(                             LIBSSH2_LISTENER *\n     d                                     'libssh2_channel_forward_listen')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  port                               value like(libssh2_Cint)\n\n     d libssh2_channel_forward_cancel...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_forward_cancel')\n     d                                     like(libssh2_Cint)\n     d  listener                       *   value                                LIBSSH2_LISTENER *\n\n     d libssh2_channel_forward_accept...\n     d                 pr              *   extproc(                             LIBSSH2_CHANNEL *\n     d                                     'libssh2_channel_forward_accept')\n     d  listener                       *   value                                LIBSSH2_LISTENER *\n\n     d libssh2_channel_setenv_ex...\n     d                 pr                  extproc('libssh2_channel_setenv_ex')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  varname                        *   value options(*string)               const char *\n     d  varname_len                        value like(libssh2_Cuint)\n     d  value                          *   value options(*string)               const char *\n     d  value_len                          value like(libssh2_Cuint)\n\n      * C macro implementation.\n     d libssh2_channel_setenv...\n     d                 pr                  extproc('libssh2_channel_setenv')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  varname                        *   value options(*string)               const char *\n     d  value                          *   value options(*string)               const char *\n\n     d libssh2_channel_request_pty_ex...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_request_pty_ex')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  term                           *   value options(*string)               const char *\n     d  term_len                           value like(libssh2_Cuint)\n     d  modes                          *   value options(*string)               const char *\n     d  modes_len                          value like(libssh2_Cuint)\n     d  width                              value like(libssh2_Cint)\n     d  height                             value like(libssh2_Cint)\n     d  width_px                           value like(libssh2_Cint)\n     d  height_px                          value like(libssh2_Cint)\n\n      * C macro implementation.\n     d libssh2_channel_request_pty...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_request_pty')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  term                           *   value options(*string)               const char *\n\n     d libssh2_channel_request_pty_size_ex...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_request_pty_size_ex'\n     d                                     )\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  width                              value like(libssh2_Cint)\n     d  height                             value like(libssh2_Cint)\n     d  width_px                           value like(libssh2_Cint)\n     d  height_px                          value like(libssh2_Cint)\n\n      * C macro implementation.\n     d libssh2_channel_request_pty_size...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_request_pty_size')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  width                              value like(libssh2_Cint)\n     d  height                             value like(libssh2_Cint)\n\n     d libssh2_channel_x11_req_ex...\n     d                 pr                  extproc('libssh2_channel_x11_req_ex')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  single_connection...\n     d                                     value like(libssh2_Cint)\n     d  auth_proto                     *   value options(*string)               const char *\n     d  auth_cookie                    *   value options(*string)               const char *\n     d  screen_number                      value like(libssh2_Cint)\n\n      * C macro implementation.\n     d libssh2_channel_x11_req...\n     d                 pr                  extproc('libssh2_channel_x11_req')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  screen_number                      value like(libssh2_Cint)\n\n     d libssh2_channel_process_startup...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_process_startup')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  request                        *   value options(*string)               const char *\n     d  request_len                        value like(libssh2_Cuint)\n     d  message                        *   value options(*string)               const char *\n     d  message_len                        value like(libssh2_Cuint)\n\n      * C macro implementation.\n     d libssh2_channel_shell...\n     d                 pr                  extproc('libssh2_channel_shell')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n      * C macro implementation.\n     d libssh2_channel_exec...\n     d                 pr                  extproc('libssh2_channel_exec')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  command                        *   value options(*string)               const char *\n\n      * C macro implementation.\n     d libssh2_channel_subsystem...\n     d                 pr                  extproc('libssh2_channel_subsystem')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  subsystem                      *   value options(*string)               const char *\n\n     d libssh2_channel_read_ex...\n     d                 pr                  extproc('libssh2_channel_read_ex')\n     d                                     like(libssh2_Cssize_t)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  stream_id                          value like(libssh2_Cint)\n     d  buf                            *   value                                char *\n     d  buflen                             value like(libssh2_Csize_t)\n\n      * C macro implementation.\n     d libssh2_channel_read...\n     d                 pr                  extproc('libssh2_channel_read')\n     d                                     like(libssh2_Cssize_t)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  buf                            *   value                                char *\n     d  buflen                             value like(libssh2_Csize_t)\n\n      * C macro implementation.\n     d libssh2_channel_read_stderr...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_read_stderr')\n     d                                     like(libssh2_Cssize_t)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  buf                            *   value                                char *\n     d  buflen                             value like(libssh2_Csize_t)\n\n     d libssh2_poll_channel_read...\n     d                 pr                  extproc('libssh2_poll_channel_read')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  extended                           value like(libssh2_Cint)\n\n     d libssh2_channel_window_read_ex...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_window_read_ex')\n     d                                     like(libssh2_Culong)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  read_avail                         like(libssh2_Culong)\n     d  window_size_initial...\n     d                                     like(libssh2_Culong)\n\n      * C macro implementation.\n     d libssh2_channel_window_read...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_window_read')\n     d                                     like(libssh2_Culong)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_channel_receive_window_adjust2...\n     d                 pr                  extproc('libssh2_channel_receive_win-\n     d                                     dow_adjust2')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  adjustment                         value like(libssh2_Culong)\n     d  force                              value like(libssh2_Cuchar)\n     d  storewindow                        like(libssh2_Cuint)\n\n     d libssh2_channel_write_ex...\n     d                 pr                  extproc('libssh2_channel_write_ex')\n     d                                     like(libssh2_Cssize_t)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  stream_id                          value like(libssh2_Cint)\n     d  buf                            *   value options(*string)               const char *\n     d  buflen                             value like(libssh2_Csize_t)\n\n      * C macro implementation.\n     d libssh2_channel_write...\n     d                 pr                  extproc('libssh2_channel_write')\n     d                                     like(libssh2_Cssize_t)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  buf                            *   value options(*string)               const char *\n     d  buflen                             value like(libssh2_Csize_t)\n\n      * C macro implementation.\n     d libssh2_channel_write_stderr...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_write_stderr')\n     d                                     like(libssh2_Cssize_t)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  buf                            *   value options(*string)               const char *\n     d  buflen                             value like(libssh2_Csize_t)\n\n     d libssh2_channel_window_write_ex...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_window_write_ex')\n     d                                     like(libssh2_Culong)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  window_size_initial...\n     d                                     like(libssh2_Culong)\n\n      * C macro implementation.\n     d libssh2_channel_window_write...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_window_write')\n     d                                     like(libssh2_Culong)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_session_set_blocking...\n     d                 pr                  extproc(\n     d                                     'libssh2_session_set_blocking')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  blocking                           value like(libssh2_Cint)\n\n     d libssh2_session_get_blocking...\n     d                 pr                  extproc(\n     d                                     'libssh2_session_get_blocking')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_channel_set_blocking...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_set_blocking')\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  blocking                           value like(libssh2_Cint)\n\n     d libssh2_session_set_timeout...\n     d                 pr                  extproc(\n     d                                     'libssh2_session_set_timeout')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  timeout                            value like(libssh2_Clong)\n\n     d libssh2_session_get_timeout...\n     d                 pr                  extproc(\n     d                                     'libssh2_session_get_timeout')\n     d                                     like(libssh2_Clong)\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_channel_handle_extended_data2...\n     d                 pr                  extproc('libssh2_channel_handle_exte-\n     d                                     nded_data2')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  ignore_mode                        value like(libssh2_Cint)\n\n      * libssh2_channel_ignore_extended_data() is defined below for BC with\n      * version 0.1.\n\n     d LIBSSH2_CHANNEL_FLUSH_EXTENDED_DATA...\n     d                 c                   -1\n     d LIBSSH2_CHANNEL_FLUSH_ALL...\n     d                 c                   -2\n\n     d libssh2_channel_flush_ex...\n     d                 pr                  extproc('libssh2_channel_flush_ex')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  streamid                           value like(libssh2_Cint)\n\n      * C macro implementation.\n     d libssh2_channel_flush...\n     d                 pr                  extproc('libssh2_channel_flush')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n      * C macro implementation.\n     d libssh2_channel_flush_stderr...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_flush_stderr')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_channel_get_exit_status...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_get_exit_status')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_channel_get_exit_signal...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_get_exit_signal')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n     d  exitsignal                     *                                        char *(*)\n     d  exitsignal_len...\n     d                                     like(libssh2_Csize_t)\n     d  errmsg                         *                                        char *(*)\n     d  errmsg_len                         like(libssh2_Csize_t)\n     d  langtag                        *                                        char *(*)\n     d  langtag_len                        like(libssh2_Csize_t)\n\n     d libssh2_channel_send_eof...\n     d                 pr                  extproc('libssh2_channel_send_eof')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_channel_eof...\n     d                 pr                  extproc('libssh2_channel_eof')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_channel_wait_eof...\n     d                 pr                  extproc('libssh2_channel_wait_eof')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_channel_close...\n     d                 pr                  extproc('libssh2_channel_close')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_channel_wait_closed...\n     d                 pr                  extproc(\n     d                                     'libssh2_channel_wait_closed')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n     d libssh2_channel_free...\n     d                 pr                  extproc('libssh2_channel_free')\n     d                                     like(libssh2_Cint)\n     d  channel                        *   value                                LIBSSH2_CHANNEL *\n\n      * Use libssh2_scp_recv2 for large (> 2GB) file support.\n     d libssh2_scp_recv2...\n     d                 pr              *   extproc('libssh2_scp_recv2')         LIBSSH2_CHANNEL *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  path                           *   value options(*string)               const char *\n     d  sb                                 likeds(libssh2_struct_stat)\n\n     d libssh2_scp_send_ex...\n     d                 pr              *   extproc('libssh2_scp_send_ex')       LIBSSH2_CHANNEL *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  path                           *   value options(*string)               const char *\n     d  mode                               value like(libssh2_Cint)\n     d  size                               value like(libssh2_Csize_t)\n     d  mtime                              value like(libssh2_Clong)\n     d  atime                              value like(libssh2_Clong)\n\n     d libssh2_scp_send64...\n     d                 pr              *   extproc('libssh2_scp_send64')        LIBSSH2_CHANNEL *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  path                           *   value options(*string)               const char *\n     d  mode                               value like(libssh2_Cint)\n     d  size                               value like(libssh2_int64_t)\n     d  mtime                              value like(libssh2_time_t)\n     d  atime                              value like(libssh2_time_t)\n\n      * C macro implementation.\n     d libssh2_scp_send...\n     d                 pr              *   extproc('libssh2_scp_send')          LIBSSH2_CHANNEL *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  path                           *   value options(*string)               const char *\n     d  mode                               value like(libssh2_Cint)\n     d  size                               value like(libssh2_int64_t)\n\n     d libssh2_base64_decode...\n     d                 pr                  extproc('libssh2_base64_decode')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  dest                           *   value                                char * *\n     d  dest_len                       *   value                                unsigned int *\n     d  src                            *   value options(*string)               const char *\n     d  src_len                            value like(libssh2_Cuint)\n\n      * Procedure libssh2_version renamed to avoid upper/lower case name clash.\n     d libssh2_get_version...\n     d                 pr              *   extproc('libssh2_version')           const char *\n     d  req_version_num...\n     d                                     value like(libssh2_Cint)\n\n     d HAVE_LIBSSH2_KNOWNHOST_API...                                            since 1.1.1\n     d                 c                   X'010101'\n     d HAVE_LIBSSH2_VERSION_API...                                              since 1.1\n     d                 c                   X'010100'\n\n     d libssh2_knownhost...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n     d  magic                              like(libssh2_Cuint)\n     d  node                           *                                        void *\n     d  name                           *                                        char *\n     d  key                            *                                        char *\n     d  typemask                           like(libssh2_Cint)\n\n      * libssh2_knownhost_init\n      *\n      * Init a collection of known hosts. Returns the pointer to a collection.\n\n     d libssh2_knownhost_init...\n     d                 pr              *   extproc('libssh2_knownhost_init')    LIBSSH2_KNOWNHOSTS *\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n      * libssh2_knownhost_add\n      *\n      * Add a host and its associated key to the collection of known hosts.\n      *\n      * The 'type' argument specifies on what format the given host and\n      * keys are:\n      *\n      * plain  - ascii \"hostname.domain.tld\"\n      * sha1   - SHA1(<salt> <host>) base64-encoded!\n      * custom - another hash\n      *\n      * If 'sha1' is selected as type, the salt must be provided to the salt\n      * argument. This too base64 encoded.\n      *\n      * The SHA-1 hash is what OpenSSH can be told to use in known_hosts files.\n      * If a custom type is used, salt is ignored and you must provide the host\n      * pre-hashed when checking for it in the libssh2_knownhost_check()\n      * function.\n      *\n      * The keylen parameter may be omitted (zero) if the key is provided as a\n      * NULL-terminated base64-encoded string.\n\n      * host format (2 bits).\n     d LIBSSH2_KNOWNHOST_TYPE_MASK...\n     d                 c                   X'FFFF'\n     d  LIBSSH2_KNOWNHOST_TYPE_PLAIN...\n     d                 c                   1\n     d LIBSSH2_KNOWNHOST_TYPE_SHA1...                                           always base64 ncoded\n     d                 c                   2\n     d LIBSSH2_KNOWNHOST_TYPE_CUSTOM...\n     d                 c                   3\n\n      * key format (2 bits).\n     d LIBSSH2_KNOWNHOST_KEYENC_MASK...\n     d                 c                   X'00030000'\n     d LIBSSH2_KNOWNHOST_KEYENC_RAW...\n     d                 c                   X'00010000'\n     d LIBSSH2_KNOWNHOST_KEYENC_BASE64...\n     d                 c                   X'00020000'\n\n      * type of key (3 bits).\n     d LIBSSH2_KNOWNHOST_KEY_MASK...\n     d                 c                   X'001C0000'\n     d LIBSSH2_KNOWNHOST_KEY_SHIFT...\n     d                 c                   18\n     d LIBSSH2_KNOWNHOST_KEY_RSA1...\n     d                 c                   X'00040000'\n     d LIBSSH2_KNOWNHOST_KEY_SSHRSA...\n     d                 c                   X'00080000'\n     d LIBSSH2_KNOWNHOST_KEY_SSHDSS...\n     d                 c                   X'000C0000'\n     d LIBSSH2_KNOWNHOST_KEY_UNKNOWN...\n     d                 c                   X'001C0000'\n\n     d libssh2_knownhost_add...\n     d                 pr                  extproc('libssh2_knownhost_add')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  host                           *   value options(*string)               const char *\n     d  salt                           *   value options(*string)               const char *\n     d  key                            *   value options(*string)               const char *\n     d  keylen                             value like(libssh2_Csize_t)\n     d  typemask                           value like(libssh2_Cint)\n     d  store                          *                                        libssh2_knownhost *\n\n      * libssh2_knownhost_addc\n      *\n      * Add a host and its associated key to the collection of known hosts.\n      *\n      * Takes a comment argument that may be NULL.  A NULL comment indicates\n      * there is no comment and the entry will end directly after the key\n      * when written out to a file.  An empty string \"\" comment will indicate an\n      * empty comment which will cause a single space to be written after the\n      * key.\n      *\n      * The 'type' argument specifies on what format the given host and keys\n      * are:\n      *\n      * plain  - ascii \"hostname.domain.tld\"\n      * sha1   - SHA1(<salt> <host>) base64-encoded!\n      * custom - another hash\n      *\n      * If 'sha1' is selected as type, the salt must be provided to the salt\n      * argument. This too base64 encoded.\n      *\n      * The SHA-1 hash is what OpenSSH can be told to use in known_hosts files.\n      * If a custom type is used, salt is ignored and you must provide the host\n      * pre-hashed when checking for it in the libssh2_knownhost_check()\n      * function.\n      *\n      * The keylen parameter may be omitted (zero) if the key is provided as a\n      * NULL-terminated base64-encoded string.\n\n     d libssh2_knownhost_addc...\n     d                 pr                  extproc('libssh2_knownhost_addc')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  host                           *   value options(*string)               const char *\n     d  salt                           *   value options(*string)               const char *\n     d  key                            *   value options(*string)               const char *\n     d  keylen                             value like(libssh2_Csize_t)\n     d  comment                        *   value options(*string)               const char *\n     d  commentlen                         value like(libssh2_Csize_t)\n     d  typemask                           value like(libssh2_Cint)\n     d  store                          *                                        libssh2_knownhost *\n\n\n      * libssh2_knownhost_check\n      *\n      * Check a host and its associated key against the collection of known\n      * hosts.\n      *\n      * The type is the type/format of the given host name.\n      *\n      * plain  - ascii \"hostname.domain.tld\"\n      * custom - prehashed base64 encoded. Note that this cannot use any salts.\n      *\n      *\n      * 'knownhost' may be set to NULL if you don't care about that info.\n      *\n      * Returns:\n      *\n      * LIBSSH2_KNOWNHOST_CHECK_* values, see below.\n\n     d LIBSSH2_KNOWNHOST_CHECK_MATCH...\n     d                 c                   0\n     d LIBSSH2_KNOWNHOST_CHECK_MISMATCH...\n     d                 c                   1\n     d LIBSSH2_KNOWNHOST_CHECK_NOTFOUND...\n     d                 c                   2\n     d LIBSSH2_KNOWNHOST_CHECK_FAILURE...\n     d                 c                   3\n\n     d libssh2_knownhost_check...\n     d                 pr                  extproc('libssh2_knownhost_check')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  host                           *   value options(*string)               const char *\n     d  key                            *   value options(*string)               const char *\n     d  keylen                             value like(libssh2_Csize_t)\n     d  typemask                           value like(libssh2_Cint)\n     d  knownhost                      *                                        libssh2_knownhost *\n\n      * this function is identital to the above one, but also takes a port\n      * argument that allows libssh2 to do a better check.\n     d libssh2_knownhost_checkp...\n     d                 pr                  extproc('libssh2_knownhost_checkp')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  host                           *   value options(*string)               const char *\n     d  port                               value like(libssh2_Cint)\n     d  key                            *   value options(*string)               const char *\n     d  keylen                             value like(libssh2_Csize_t)\n     d  typemask                           value like(libssh2_Cint)\n     d  knownhost                      *                                        libssh2_knownhost *\n\n      * libssh2_knownhost_del\n      *\n      * Remove a host from the collection of known hosts. The 'entry' struct is\n      * retrieved by a call to libssh2_knownhost_check().\n\n     d libssh2_knownhost_del...\n     d                 pr                  extproc('libssh2_knownhost_del')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  entry                              likeds(libssh2_knownhost)\n\n      * libssh2_knownhost_free\n      *\n      * Free an entire collection of known hosts.\n\n     d libssh2_knownhost_free...\n     d                 pr                  extproc('libssh2_knownhost_free')\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n\n      * libssh2_knownhost_readline()\n      *\n      * Pass in a line of a file of 'type'. It makes libssh2 read this line.\n      *\n      * LIBSSH2_KNOWNHOST_FILE_OPENSSH is the only supported type.\n\n     d libssh2_knownhost_readline...\n     d                 pr                  extproc('libssh2_knownhost_readline')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  line                           *   value options(*string)               const char *\n     d  len                                value like(libssh2_Csize_t)\n     d  type                               value like(libssh2_Cint)\n\n      * libssh2_knownhost_readfile\n      *\n      * Add hosts+key pairs from a given file.\n      *\n      * Returns a negative value for error or number of successfully added\n      * hosts.\n      *\n      * This implementation currently only knows one 'type' (openssh), all\n      * others are reserved for future use.\n\n     d LIBSSH2_KNOWNHOST_FILE_OPENSSH...\n     d                 c                   1\n\n     d libssh2_knownhost_readfile...\n     d                 pr                  extproc('libssh2_knownhost_readfile')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  filename                       *   value options(*string)               const char *\n     d  type                               value like(libssh2_Cint)\n\n      * libssh2_knownhost_writeline()\n      *\n      * Ask libssh2 to convert a known host to an output line for storage.\n      *\n      * Note that this function returns LIBSSH2_ERROR_BUFFER_TOO_SMALL if the\n      * given output buffer is too small to hold the desired output.\n      *\n      * This implementation currently only knows one 'type' (openssh), all\n      * others are reserved for future use.\n\n     d libssh2_knownhost_writeline...\n     d                 pr                  extproc(\n     d                                     'libssh2_knownhost_writeline')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  known                              likeds(libssh2_knownhost)\n     d  buffer                         *   value options(*string)               char *\n     d  buflen                             value like(libssh2_Csize_t)\n     d  outlen                             like(libssh2_Csize_t)                Written data amount\n     d  type                               value like(libssh2_Cint)\n\n      * libssh2_knownhost_writefile\n      *\n      * Write hosts+key pairs to a given file.\n      *\n      * This implementation currently only knows one 'type' (openssh), all\n      * others are reserved for future use.\n\n     d libssh2_knownhost_writefile...\n     d                 pr                  extproc(\n     d                                     'libssh2_knownhost_writefile')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  filename                       *   value options(*string)               const char *\n     d  type                               value like(libssh2_Cint)\n\n      * libssh2_knownhost_get()\n      *\n      * Traverse the internal list of known hosts. Pass NULL to 'prev' to get\n      * the first one. Or pass a poiner to the previously returned one to\n      * get the next.\n      *\n      * Returns:\n      * 0 if a fine host was stored in 'store'\n      * 1 if end of hosts\n      * [negative] on errors\n\n     d libssh2_knownhost_get...\n     d                 pr                  extproc('libssh2_knownhost_get')\n     d                                     like(libssh2_Cint)\n     d  hosts                          *   value                                LIBSSH2_KNOWNHOSTS *\n     d  store                          *                                        libssh2_knownhost *\n     d  prev                               likeds(libssh2_knownhost)\n\n     d HAVE_LIBSSH2_AGENT_API...                                                since 1.2.2\n     d                 c                   X'010202'\n\n     d libssh2_agent_publickey...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n     d  magic                              like(libssh2_Cuint)\n     d  node                           *                                        void *\n     d  blob                           *                                        unsigned char *\n     d  blob_len                           like(libssh2_Csize_t)\n     d  comment                        *                                        char *\n\n      * libssh2_agent_init\n      *\n      * Init an ssh-agent handle. Returns the pointer to the handle.\n\n     d libssh2_agent_init...\n     d                 pr              *   extproc('libssh2_agent_init')        LIBSSH2_AGENT *\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n      * libssh2_agent_connect()\n      *\n      * Connect to an ssh-agent.\n      *\n      * Returns 0 if succeeded, or a negative value for error.\n\n     d libssh2_agent_connect...\n     d                 pr                  extproc('libssh2_agent_connect')\n     d                                     like(libssh2_Cint)\n     d  agent                          *   value                                LIBSSH2_AGENT *\n\n      * libssh2_agent_list_identities()\n      *\n      * Request an ssh-agent to list identities.\n      *\n      * Returns 0 if succeeded, or a negative value for error.\n\n     d libssh2_agent_list_identities...\n     d                 pr                  extproc(\n     d                                     'libssh2_agent_list_identities')\n     d                                     like(libssh2_Cint)\n     d  agent                          *   value                                LIBSSH2_AGENT *\n\n      * libssh2_agent_get_identity()\n      *\n      * Traverse the internal list of public keys. Pass NULL to 'prev' to get\n      * the first one. Or pass a poiner to the previously returned one to\n      * get the next.\n      *\n      * Returns:\n      * 0 if a fine public key was stored in 'store'\n      * 1 if end of public keys\n      * [negative] on errors\n\n     d libssh2_agent_get_identity...\n     d                 pr                  extproc('libssh2_agent_get_identity')\n     d                                     like(libssh2_Cint)\n     d  agent                          *   value                                LIBSSH2_AGENT *\n     d  store                          *                                        libssh2_agent_...\n     d                                                                          publickey *(*)\n     d  prev                               likeds(libssh2_agent_publickey)\n\n      * libssh2_agent_userauth()\n      *\n      * Do publickey user authentication with the help of ssh-agent.\n      *\n      * Returns 0 if succeeded, or a negative value for error.\n\n     d libssh2_agent_userauth...\n     d                 pr                  extproc('libssh2_agent_userauth')\n     d                                     like(libssh2_Cint)\n     d  agent                          *   value                                LIBSSH2_AGENT *\n     d  username                       *   value options(*string)               const char *\n     d  identity                           likeds(libssh2_agent_publickey)\n\n      * libssh2_agent_disconnect()\n      *\n      * Close a connection to an ssh-agent.\n      *\n      * Returns 0 if succeeded, or a negative value for error.\n\n     d libssh2_agent_disconnect...\n     d                 pr                  extproc('libssh2_agent_disconnect')\n     d                                     like(libssh2_Cint)\n     d  agent                          *   value                                LIBSSH2_AGENT *\n\n      * libssh2_agent_free()\n      *\n      * Free an ssh-agent handle. This function also frees the internal\n      * collection of public keys.\n\n     d libssh2_agent_free...\n     d                 pr                  extproc('libssh2_agent_free')\n     d  agent                          *   value                                LIBSSH2_AGENT *\n\n\n      * libssh2_keepalive_config()\n      *\n      * Set how often keepalive messages should be sent.  WANT_REPLY\n      * indicates whether the keepalive messages should request a response\n      * from the server.  INTERVAL is number of seconds that can pass\n      * without any I/O, use 0 (the default) to disable keepalives.  To\n      * avoid some busy-loop corner-cases, if you specify an interval of 1\n      * it will be treated as 2.\n      *\n      * Note that non-blocking applications are responsible for sending the\n      * keepalive messages using libssh2_keepalive_send().\n\n     d libssh2_keepalive_config...\n     d                 pr                  extproc('libssh2_keepalive_config')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  want_reply                         value like(libssh2_Cint)\n     d  interval                           value like(libssh2_Cuint)\n\n      * libssh2_keepalive_send()\n      *\n      * Send a keepalive message if needed.  SECONDS_TO_NEXT indicates how\n      * many seconds you can sleep after this call before you need to call\n      * it again.  Returns 0 on success, or LIBSSH2_ERROR_SOCKET_SEND on\n      * I/O errors.\n\n     d libssh2_keepalive_send...\n     d                 pr                  extproc('libssh2_keepalive_send')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  seconds_to_next...\n     d                                     like(libssh2_Cint)\n\n      * NOTE NOTE NOTE\n      * libssh2_trace() has no function in builds that aren't built with debug\n      * enabled.\n\n     d libssh2_trace   pr                  extproc('libssh2_trace')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  bitmask                            value like(libssh2_Cint)\n\n     d LIBSSH2_TRACE_TRANS...\n     d                 c                   X'0002'\n     d LIBSSH2_TRACE_KEX...\n     d                 c                   X'0004'\n     d LIBSSH2_TRACE_AUTH...\n     d                 c                   X'0008'\n     d LIBSSH2_TRACE_CONN...\n     d                 c                   X'0010'\n     d LIBSSH2_TRACE_SCP...\n     d                 c                   X'0020'\n     d LIBSSH2_TRACE_SFTP...\n     d                 c                   X'0040'\n     d LIBSSH2_TRACE_ERROR...\n     d                 c                   X'0080'\n     d LIBSSH2_TRACE_PUBLICKEY...\n     d                 c                   X'0100'\n     d LIBSSH2_TRACE_SOCKET...\n     d                 c                   X'0200'\n\n     d libssh2_trace_handler_func...\n     d                 s               *   based(######typedef######) procptr\n\n     d libssh2_trace_sethandler...\n     d                 pr                  extproc('libssh2_trace_sethandler')\n     d                                     like(libssh2_Cint)\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  context                        *   value                                void *\n     d  callback                           value\n     d                                     like(libssh2_trace_handler_func)\n\n      /endif                                                                    LIBSSH2_H_\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/libssh2rpg/libssh2_ccsid.rpgle.in",
    "content": "      * Copyright (c) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n      * All rights reserved.\n      *\n      * Redistribution and use in source and binary forms,\n      * with or without modification, are permitted provided\n      * that the following conditions are met:\n      *\n      *   Redistributions of source code must retain the above\n      *   copyright notice, this list of conditions and the\n      *   following disclaimer.\n      *\n      *   Redistributions in binary form must reproduce the above\n      *   copyright notice, this list of conditions and the following\n      *   disclaimer in the documentation and/or other materials\n      *   provided with the distribution.\n      *\n      *   Neither the name of the copyright holder nor the names\n      *   of any other contributors may be used to endorse or\n      *   promote products derived from this software without\n      *   specific prior written permission.\n      *\n      * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n      * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n      * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n      * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n      * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n      * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n      * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n      * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n      * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n      * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n      * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n      * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n      * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n      * OF SUCH DAMAGE.\n\n      /if not defined(LIBSSH2_CCSID_H_)\n      /define LIBSSH2_CCSID_H_\n\n      /include \"libssh2rpg/libssh2\"\n\n     d libssh2_from_ccsid...\n     d                 pr              *   extproc('libssh2_from_ccsid')        char *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  cache                          *                                        libssh2_string_cache\n     d                                                                          *(*)\n     d  ccsid                              value like(libssh2_Cushort)\n     d  string                         *   value options(*string)               const char *\n     d  inlen                              value like(libssh2_Cssize_t)\n     d  outlen                             like(libssh2_Csize_t) options(*omit)\n\n     d libssh2_to_ccsid...\n     d                 pr              *   extproc('libssh2_to_ccsid')          char *\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  cache                          *                                        libssh2_string_cache\n     d                                                                          *(*)\n     d  ccsid                              value like(libssh2_Cushort)\n     d  string                         *   value options(*string)               const char *\n     d  inlen                              value like(libssh2_Cssize_t)\n     d  outlen                             like(libssh2_Csize_t) options(*omit)\n\n     d libssh2_release_string_cache...\n     d                 pr                  extproc(\n     d                                     'libssh2_release_string_cache')\n     d  session                        *   value                                LIBSSH2_SESSION *\n     d  cache                          *                                        libssh2_string_cache\n     d                                                                          *(*)\n\n      /endif                                                                    LIBSSH2_CCSID_H_\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/libssh2rpg/libssh2_publickey.rpgle",
    "content": "      * Copyright (c) 2015, Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n      * All rights reserved.\n      *\n      * Redistribution and use in source and binary forms,\n      * with or without modification, are permitted provided\n      * that the following conditions are met:\n      *\n      *   Redistributions of source code must retain the above\n      *   copyright notice, this list of conditions and the\n      *   following disclaimer.\n      *\n      *   Redistributions in binary form must reproduce the above\n      *   copyright notice, this list of conditions and the following\n      *   disclaimer in the documentation and/or other materials\n      *   provided with the distribution.\n      *\n      *   Neither the name of the copyright holder nor the names\n      *   of any other contributors may be used to endorse or\n      *   promote products derived from this software without\n      *   specific prior written permission.\n      *\n      * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n      * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n      * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n      * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n      * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n      * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n      * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n      * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n      * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n      * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n      * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n      * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n      * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n      * OF SUCH DAMAGE.\n\n      * Note: This include file is only needed for using the\n      * publickey SUBSYSTEM which is not the same as publickey\n      * authentication.  For authentication you only need libssh2.h\n      *\n      * For more information on the publickey subsystem,\n      * refer to IETF draft: secsh-publickey\n\n      /if not defined(LIBSSH2_PUBLICKEY_H_)\n      /define LIBSSH2_PUBLICKEY_H_\n\n      /include \"libssh2rpg/libssh2\"\n\n     d libssh2_publickey_attribute...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n     d  name                           *                                        const char *\n     d  name_len                           like(libssh2_Culong)\n     d  value                          *                                        const char *\n     d  value_len                          like(libssh2_Culong)\n     d  mandatory                          like(libssh2_Cchar)\n\n     d libssh2_publickey_list...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n     d  name                           *                                        const char *\n     d  name_len                           like(libssh2_Culong)\n     d  blob                           *                                        const uns char *\n     d  blob_len                           like(libssh2_Culong)\n     d  num_attrs                          like(libssh2_Culong)\n     d  attrs                          *                                        libssh2_publickey...\n     d                                                                          attribute *\n\n      * Publickey Subsystem.\n     d libssh2_publickey_init...\n     d                 pr              *   extproc('libssh2_publickey_init')    LIBSSH2_PUBLICKEY *\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_publickey_add_ex...\n     d                 pr                  extproc('libssh2_publickey_add_ex')\n     d                                     like(libssh2_Cint)\n     d  pkey                           *   value                                LIBSSH2_PUBLICKEY *\n     d  name                           *   value options(*string)               const uns char *\n     d  name_len                           value like(libssh2_Culong)\n     d  blob                           *   value options(*string)               const uns char *\n     d  blob_len                           value like(libssh2_Culong)\n     d  overwrite                          value like(libssh2_Cchar)\n     d  num_attrs                          value like(libssh2_Culong)\n     d  attrs                              likeds(libssh2_publickey_attribute)\n     d                                     dim(1000)\n\n      * C macro implementation.\n     d libssh2_publickey_add...\n     d                 pr                  extproc('libssh2_publickey_add')\n     d                                     like(libssh2_Cint)\n     d  pkey                           *   value                                LIBSSH2_PUBLICKEY *\n     d  name                           *   value options(*string)               const unsigned char\n     d                                                                          *\n     d  blob                           *   value options(*string)               const unsigned char\n     d                                                                          *\n     d  blob_len                           value like(libssh2_Culong)\n     d  overwrite                          value like(libssh2_Cchar)\n     d  num_attrs                          value like(libssh2_Culong)\n     d  attrs                              likeds(libssh2_publickey_attribute)\n     d                                     dim(1000)\n\n     d libssh2_publickey_remove_ex...\n     d                 pr                  extproc(\n     d                                     'libssh2_publickey_remove_ex')\n     d                                     like(libssh2_Cint)\n     d  pkey                           *   value                                LIBSSH2_PUBLICKEY *\n     d  name                           *   value options(*string)               const uns char *\n     d  name_len                           value like(libssh2_Culong)\n     d  blob                           *   value options(*string)               const uns char *\n     d  blob_len                           value like(libssh2_Culong)\n\n      * C macro implementation.\n     d libssh2_publickey_remove...\n     d                 pr                  extproc('libssh2_publickey_remove')\n     d                                     like(libssh2_Cint)\n     d  pkey                           *   value                                LIBSSH2_PUBLICKEY *\n     d  name                           *   value options(*string)               const uns char *\n     d  blob                           *   value options(*string)               const uns char *\n     d  blob_len                           value like(libssh2_Culong)\n\n     d libssh2_publickey_list_fetch...\n     d                 pr                  extproc(\n     d                                     'libssh2_publickey_list_fetch')\n     d                                     like(libssh2_Cint)\n     d  pkey                           *   value                                LIBSSH2_PUBLICKEY *\n     d  num_keys                       *   value                                unsigned long *\n     d  pkey_list                      *                                        libssh2_publickey...\n     d                                                                          _list *(*)\n\n     d libssh2_publickey_list_free...\n     d                 pr                  extproc(\n     d                                     'libssh2_publickey_list_free')\n     d  pkey                           *   value                                LIBSSH2_PUBLICKEY *\n     d  pkey_list                          likeds(libssh2_publickey_list)\n\n     d libssh2_publickey_shutdown...\n     d                 pr                  extproc('libssh2_publickey_shutdown')\n     d                                     like(libssh2_Cint)\n     d  pkey                           *   value                                LIBSSH2_PUBLICKEY *\n\n      /endif                                                                    LIBSSH2_PUBLICKEY_H_\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/libssh2rpg/libssh2_sftp.rpgle",
    "content": "      * Copyright (c) 2015, Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n      * All rights reserved.\n      *\n      * Redistribution and use in source and binary forms,\n      * with or without modification, are permitted provided\n      * that the following conditions are met:\n      *\n      *   Redistributions of source code must retain the above\n      *   copyright notice, this list of conditions and the\n      *   following disclaimer.\n      *\n      *   Redistributions in binary form must reproduce the above\n      *   copyright notice, this list of conditions and the following\n      *   disclaimer in the documentation and/or other materials\n      *   provided with the distribution.\n      *\n      *   Neither the name of the copyright holder nor the names\n      *   of any other contributors may be used to endorse or\n      *   promote products derived from this software without\n      *   specific prior written permission.\n      *\n      * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n      * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n      * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n      * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n      * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n      * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n      * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n      * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n      * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n      * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n      * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n      * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n      * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n      * OF SUCH DAMAGE.\n\n      /if not defined(LIBSSH2_SFTP_H_)\n      /define LIBSSH2_SFTP_H_\n\n      /include \"libssh2rpg/libssh2\"\n\n      * Note: Version 6 was documented at the time of writing\n      * However it was marked as \"DO NOT IMPLEMENT\" due to pending changes\n      *\n      * Let's start with Version 3 (The version found in OpenSSH) and go from\n      * there.\n     d LIBSSH2_SFTP_VERSION...\n     d                 c                   3\n\n      * Flags for open_ex().\n     d LIBSSH2_SFTP_OPENFILE...\n     d                 c                   0\n     d LIBSSH2_SFTP_OPENDIR...\n     d                 c                   1\n\n      * Flags for rename_ex().\n     d LIBSSH2_SFTP_RENAME_OVERWRITE...\n     d                 c                   X'00000001'\n     d LIBSSH2_SFTP_RENAME_ATOMIC...\n     d                 c                   X'00000002'\n     d LIBSSH2_SFTP_RENAME_NATIVE...\n     d                 c                   X'00000004'\n\n      * Flags for stat_ex().\n     d LIBSSH2_SFTP_STAT...\n     d                 c                   0\n     d LIBSSH2_SFTP_LSTAT...\n     d                 c                   1\n     d LIBSSH2_SFTP_SETSTAT...\n     d                 c                   2\n\n      * Flags for symlink_ex().\n     d LIBSSH2_SFTP_SYMLINK...\n     d                 c                   0\n     d LIBSSH2_SFTP_READLINK...\n     d                 c                   1\n     d LIBSSH2_SFTP_REALPATH...\n     d                 c                   2\n\n      * SFTP attribute flag bits.\n     d LIBSSH2_SFTP_ATTR_SIZE...\n     d                 c                   X'00000001'\n     d LIBSSH2_SFTP_ATTR_UIDGID...\n     d                 c                   X'00000002'\n     d LIBSSH2_SFTP_ATTR_PERMISSIONS...\n     d                 c                   X'00000004'\n     d LIBSSH2_SFTP_ATTR_ACMODTIME...\n     d                 c                   X'00000008'\n     d LIBSSH2_SFTP_ATTR_EXTENDED...\n     d                 c                   X'80000000'\n\n      * SFTP statvfs flag bits.\n     d LIBSSH2_SFTP_ST_RDONLY...\n     d                 c                   X'00000001'\n     d LIBSSH2_SFTP_ST_NOSUID...\n     d                 c                   X'00000002'\n\n     d #LIBSSH2_SFTP_ATTRIBUTES...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n      * If flags & ATTR_* bit is set, then the value in this struct will be\n      * meaningful Otherwise it should be ignored.\n     d  flags                              like(libssh2_Culong)\n     d  filesize                           like(libssh2_uint64_t)\n     d  uid                                like(libssh2_Culong)\n     d  gid                                like(libssh2_Culong)\n     d  permissions                        like(libssh2_Culong)\n     d  atime                              like(libssh2_Culong)\n     d  mtime                              like(libssh2_Culong)\n\n     d #LIBSSH2_SFTP_STATVFS...\n     d                 ds                  based(######typedef######)\n     d                                     align qualified\n     d  f_bsize                            like(libssh2_uint64_t)               Filesys block size\n     d  f_frsize                           like(libssh2_uint64_t)               Fragment size\n     d  f_blocks                           like(libssh2_uint64_t)               FS size in f_frsize\n     d  f_bfree                            like(libssh2_uint64_t)               Free blocks\n     d  f_bavail                           like(libssh2_uint64_t)               Free blks f. nonroot\n     d  f_files                            like(libssh2_uint64_t)               Inodes\n     d  f_ffree                            like(libssh2_uint64_t)               Free inodes\n     d  f_favail                           like(libssh2_uint64_t)               Free inds f. nonroot\n     d  f_fsid                             like(libssh2_uint64_t)               File system ID\n     d  f_flag                             like(libssh2_uint64_t)               Mount flags\n     d  f_namemax                          like(libssh2_uint64_t)               Max filename length\n\n      * SFTP filetypes.\n     d LIBSSH2_SFTP_TYPE_REGULAR...\n     d                 c                   1\n     d LIBSSH2_SFTP_TYPE_DIRECTORY...\n     d                 c                   2\n     d LIBSSH2_SFTP_TYPE_SYMLINK...\n     d                 c                   3\n     d LIBSSH2_SFTP_TYPE_SPECIAL...\n     d                 c                   4\n     d LIBSSH2_SFTP_TYPE_UNKNOWN...\n     d                 c                   5\n     d LIBSSH2_SFTP_TYPE_SOCKET...\n     d                 c                   6\n     d LIBSSH2_SFTP_TYPE_CHAR_DEVICE...\n     d                 c                   7\n     d LIBSSH2_SFTP_TYPE_BLOCK_DEVICE...\n     d                 c                   8\n     d LIBSSH2_SFTP_TYPE_FIFO...\n     d                 c                   9\n\n      * Reproduce the POSIX file modes here for systems that are not POSIX\n      * compliant.\n      *\n      * These is used in \"permissions\" of \"struct _LIBSSH2_SFTP_ATTRIBUTES\"\n\n      * File type.\n     d LIBSSH2_SFTP_S_IFMT...                                                   type of file mask\n     d                 c                   X'F000'\n     d LIBSSH2_SFTP_S_IFIFO...                                                  named pipe (fifo)\n     d                 c                   X'1000'\n     d LIBSSH2_SFTP_S_IFCHR...                                                  character special\n     d                 c                   X'2000'\n     d LIBSSH2_SFTP_S_IFDIR...                                                  directory\n     d                 c                   X'4000'\n     d LIBSSH2_SFTP_S_IFBLK...                                                  block special\n     d                 c                   X'6000'\n     d LIBSSH2_SFTP_S_IFREG...                                                  regular\n     d                 c                   X'8000'\n     d LIBSSH2_SFTP_S_IFLNK...                                                  symbolic link\n     d                 c                   X'A000'\n     d LIBSSH2_SFTP_S_IFSOCK...                                                 socket\n     d                 c                   X'C000'\n\n      * File mode.\n      * Read, write, execute/search by owner.\n     d LIBSSH2_SFTP_S_IRWXU...                                                  RWX mask for owner\n     d                 c                   X'01C0'\n     d LIBSSH2_SFTP_S_IRUSR...                                                  R for owner\n     d                 c                   X'0100'\n     d LIBSSH2_SFTP_S_IWUSR...                                                  W for owner\n     d                 c                   X'0080'\n     d LIBSSH2_SFTP_S_IXUSR...                                                  X for owner\n     d                 c                   X'0040'\n      * Read, write, execute/search by group.\n     d LIBSSH2_SFTP_S_IRWXG...                                                  RWX mask for group\n     d                 c                   X'0038'\n     d LIBSSH2_SFTP_S_IRGRP...                                                  R for group\n     d                 c                   X'0020'\n     d LIBSSH2_SFTP_S_IWGRP...                                                  W for group\n     d                 c                   X'0010'\n     d LIBSSH2_SFTP_S_IXGRP...                                                  X for group\n     d                 c                   X'0008'\n      * Read, write, execute/search by others.\n     d LIBSSH2_SFTP_S_IRWXO...                                                  RWX mask for other\n     d                 c                   X'0007'\n     d LIBSSH2_SFTP_S_IROTH...                                                  R for other\n     d                 c                   X'0004'\n     d LIBSSH2_SFTP_S_IWOTH...                                                  W for other\n     d                 c                   X'0002'\n     d LIBSSH2_SFTP_S_IXOTH...                                                  X for other\n     d                 c                   X'0001'\n\n      * C macro implementation.\n     d LIBSSH2_SFTP_S_ISLNK...\n     d                 pr                  extproc('LIBSSH2_SFTP_S_ISLNK')\n     d                                     like(libssh2_Cint)\n     d  permissions                        value like(libssh2_Culong)\n\n      * C macro implementation.\n     d LIBSSH2_SFTP_S_ISREG...\n     d                 pr                  extproc('LIBSSH2_SFTP_S_ISREG')\n     d                                     like(libssh2_Cint)\n     d  permissions                        value like(libssh2_Culong)\n\n      * C macro implementation.\n     d LIBSSH2_SFTP_S_ISDIR...\n     d                 pr                  extproc('LIBSSH2_SFTP_S_ISDIR')\n     d                                     like(libssh2_Cint)\n     d  permissions                        value like(libssh2_Culong)\n\n      * C macro implementation.\n     d LIBSSH2_SFTP_S_ISCHR...\n     d                 pr                  extproc('LIBSSH2_SFTP_S_ISCHR')\n     d                                     like(libssh2_Cint)\n     d  permissions                        value like(libssh2_Culong)\n\n      * C macro implementation.\n     d LIBSSH2_SFTP_S_ISBLK...\n     d                 pr                  extproc('LIBSSH2_SFTP_S_ISBLK')\n     d                                     like(libssh2_Cint)\n     d  permissions                        value like(libssh2_Culong)\n\n      * C macro implementation.\n     d LIBSSH2_SFTP_S_ISFIFO...\n     d                 pr                  extproc('LIBSSH2_SFTP_S_ISFIFO')\n     d                                     like(libssh2_Cint)\n     d  permissions                        value like(libssh2_Culong)\n\n      * C macro implementation.\n     d LIBSSH2_SFTP_S_ISSOCK...\n     d                 pr                  extproc('LIBSSH2_SFTP_S_ISSOCK')\n     d                                     like(libssh2_Cint)\n     d  permissions                        value like(libssh2_Culong)\n\n      * SFTP File Transfer Flags -- (e.g. flags parameter to sftp_open())\n      * Danger will robinson... APPEND doesn't have any effect on OpenSSH\n      * servers.\n     d LIBSSH2_FXF_READ...\n     d                 c                   X'00000001'\n     d LIBSSH2_FXF_WRITE...\n     d                 c                   X'00000002'\n     d LIBSSH2_FXF_APPEND...\n     d                 c                   X'00000004'\n     d LIBSSH2_FXF_CREAT...\n     d                 c                   X'00000008'\n     d LIBSSH2_FXF_TRUNC...\n     d                 c                   X'00000010'\n     d LIBSSH2_FXF_EXCL...\n     d                 c                   X'00000020'\n\n      * SFTP Status Codes (returned by libssh2_sftp_last_error()).\n     d LIBSSH2_FX_OK...\n     d                 c                   0\n     d LIBSSH2_FX_EOF...\n     d                 c                   1\n     d LIBSSH2_FX_NO_SUCH_FILE...\n     d                 c                   2\n     d LIBSSH2_FX_PERMISSION_DENIED...\n     d                 c                   3\n     d LIBSSH2_FX_FAILURE...\n     d                 c                   4\n     d LIBSSH2_FX_BAD_MESSAGE...\n     d                 c                   5\n     d LIBSSH2_FX_NO_CONNECTION...\n     d                 c                   6\n     d LIBSSH2_FX_CONNECTION_LOST...\n     d                 c                   7\n     d LIBSSH2_FX_OP_UNSUPPORTED...\n     d                 c                   8\n     d LIBSSH2_FX_INVALID_HANDLE...\n     d                 c                   9\n     d LIBSSH2_FX_NO_SUCH_PATH...\n     d                 c                   10\n     d LIBSSH2_FX_FILE_ALREADY_EXISTS...\n     d                 c                   11\n     d LIBSSH2_FX_WRITE_PROTECT...\n     d                 c                   12\n     d LIBSSH2_FX_NO_MEDIA...\n     d                 c                   13\n     d LIBSSH2_FX_NO_SPACE_ON_FILESYSTEM...\n     d                 c                   14\n     d LIBSSH2_FX_QUOTA_EXCEEDED...\n     d                 c                   15\n     d LIBSSH2_FX_UNKNOWN_PRINCIPAL...\n     d                 c                   16\n     d LIBSSH2_FX_LOCK_CONFLICT...\n     d                 c                   17\n     d LIBSSH2_FX_DIR_NOT_EMPTY...\n     d                 c                   18\n     d LIBSSH2_FX_NOT_A_DIRECTORY...\n     d                 c                   19\n     d LIBSSH2_FX_INVALID_FILENAME...\n     d                 c                   20\n     d LIBSSH2_FX_LINK_LOOP...\n     d                 c                   21\n\n      * Returned by any function that would block during a read/write operation.\n     d LIBSSH2SFTP_EAGAIN...\n     d                 c                   -37\n\n      * SFTP API.\n     d libssh2_sftp_init...\n     d                 pr              *   extproc('libssh2_sftp_init')         LIBSSH2_SFTP *\n     d  session                        *   value                                LIBSSH2_SESSION *\n\n     d libssh2_sftp_shutdown...\n     d                 pr                  extproc('libssh2_sftp_shutdown')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n\n     d libssh2_sftp_last_error...\n     d                 pr                  extproc('libssh2_sftp_last_error')\n     d                                     like(libssh2_Culong)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n\n     d libssh2_sftp_get_channel...\n     d                 pr              *   extproc('libssh2_sftp_get_channel')  LIBSSH2_CHANNEL *\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n\n      * File / Directory Ops.\n     d libssh2_sftp_open_ex...\n     d                 pr              *   extproc('libssh2_sftp_open_ex')      LIBSSH2_SFTP_HANDLE*\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  filename                       *   value options(*string)               const char *\n     d  filename_len                       value like(libssh2_Cuint)\n     d  flags                              value like(libssh2_Culong)\n     d  mode                               value like(libssh2_Clong)\n     d  open_type                          value like(libssh2_Cint)\n\n      * C macro implementation.\n     d libssh2_sftp_open...\n     d                 pr              *   extproc('libssh2_sftp_open')         LIBSSH2_SFTP_HANDLE\n     d                                                                          *\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  filename                       *   value options(*string)               const char *\n     d  flags                              value like(libssh2_Culong)\n     d  mode                               value like(libssh2_Clong)\n\n      * C macro libssh2_sftp_opendir implementation.\n      * Renamed to avoid upper/lower case name clash.\n     d libssh2_sftp_open_dir...\n     d                 pr              *   extproc('libssh2_sftp_opendir')      LIBSSH2_SFTP_HANDLE\n     d                                                                          *\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n\n     d libssh2_sftp_read...\n     d                 pr                  extproc('libssh2_sftp_read')\n     d                                     like(libssh2_Cssize_t)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  buffer                         *   value options(*string)               char *\n     d  buffer_maxlen                      value like(libssh2_Csize_t)\n\n     d libssh2_sftp_readdir_ex...\n     d                 pr                  extproc('libssh2_sftp_readdir_ex')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  buffer                         *   value                                char *\n     d  buffer_maxlen                      value like(libssh2_Csize_t)\n     d  longentry                      *   value                                char *\n     d  longentry_maxlen...\n     d                                     value like(libssh2_Csize_t)\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n\n      * C macro implementation.\n     d libssh2_sftp_readdir...\n     d                 pr                  extproc('libssh2_sftp_readdir')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  buffer                         *   value                                char *\n     d  buffer_maxlen                      value like(libssh2_Csize_t)\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n\n     d libssh2_sftp_write...\n     d                 pr                  extproc('libssh2_sftp_write')\n     d                                     like(libssh2_Cssize_t)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  buffer                         *   value options(*string)               const char *\n     d  count                              value like(libssh2_Csize_t)\n\n     d libssh2_sftp_fsync...\n     d                 pr                  extproc('libssh2_sftp_fsync')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n\n     d libssh2_sftp_close_handle...\n     d                 pr                  extproc('libssh2_sftp_close_handle')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n\n      * C macro implementation.\n     d libssh2_sftp_close...\n     d                 pr                  extproc('libssh2_sftp_close_handle')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n\n      * C macro implementation.\n     d libssh2_sftp_closedir...\n     d                 pr                  extproc('libssh2_sftp_close_handle')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n\n     d libssh2_sftp_seek...\n     d                 pr                  extproc('libssh2_sftp_seek')\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  offset                             value like(libssh2_Csize_t)\n\n     d libssh2_sftp_seek64...\n     d                 pr                  extproc('libssh2_sftp_seek64')\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  offset                             value like(libssh2_uint64_t)\n\n      * C macro implementation.\n     d libssh2_sftp_rewind...\n     d                 pr                  extproc('libssh2_sftp_rewind')\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n\n     d libssh2_sftp_tell...\n     d                 pr                  extproc('libssh2_sftp_tell')\n     d                                     like(libssh2_Csize_t)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n\n     d libssh2_sftp_tell64...\n     d                 pr                  extproc('libssh2_sftp_tell64')\n     d                                     like(libssh2_uint64_t)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n\n     d libssh2_sftp_fstat_ex...\n     d                 pr                  extproc('libssh2_sftp_fstat_ex')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n     d  setstat                            value like(libssh2_Cint)\n\n      * C macro implementation.\n     d libssh2_sftp_fstat...\n     d                 pr                  extproc('libssh2_sftp_fstat')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n\n      * C macro implementation.\n     d libssh2_sftp_fsetstat...\n     d                 pr                  extproc('libssh2_sftp_fsetstat')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n\n      * Miscellaneous Ops.\n     d libssh2_sftp_rename_ex...\n     d                 pr                  extproc('libssh2_sftp_rename_ex')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  source_filename...\n     d                                 *   value options(*string)               const char *\n     d  source_filename_len...\n     d                                     value like(libssh2_Cuint)\n     d  dest_filename                  *   value options(*string)               const char *\n     d  dest_filename_len...\n     d                                     value like(libssh2_Cuint)\n     d  flags                              value like(libssh2_Clong)\n\n      * C macro implementation.\n     d libssh2_sftp_rename...\n     d                 pr                  extproc('libssh2_sftp_rename')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  source_filename...\n     d                                 *   value options(*string)               const char *\n     d  dest_filename                  *   value options(*string)               const char *\n\n     d libssh2_sftp_unlink_ex...\n     d                 pr                  extproc('libssh2_sftp_unlink_ex')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  filename                       *   value options(*string)               const char *\n     d  filename_len                       value like(libssh2_Cuint)\n\n      * C macro implementation.\n     d libssh2_sftp_unlink...\n     d                 pr                  extproc('libssh2_sftp_unlink')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  filename                       *   value options(*string)               const char *\n\n     d libssh2_sftp_fstatvfs...\n     d                 pr                  extproc('libssh2_sftp_fstatvfs')\n     d                                     like(libssh2_Cint)\n     d  handle                         *   value                                LIBSSH2_SFTP_HANDLE*\n     d  st                             *   value                                LIBSSH2_SFTP_STATVFS\n     d                                                                          *\n\n     d libssh2_sftp_statvfs...\n     d                 pr                  extproc('libssh2_sftp_statvfs')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  path_len                           value like(libssh2_Csize_t)\n     d  st                             *   value                                LIBSSH2_SFTP_STATVFS\n     d                                                                          *\n\n     d libssh2_sftp_mkdir_ex...\n     d                 pr                  extproc('libssh2_sftp_mkdir_ex')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  path_len                           value like(libssh2_Cuint)\n     d  mode                               value like(libssh2_Clong)\n\n      * C macro implementation.\n     d libssh2_sftp_mkdir...\n     d                 pr                  extproc('libssh2_sftp_mkdir')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  mode                               value like(libssh2_Clong)\n\n     d libssh2_sftp_rmdir_ex...\n     d                 pr                  extproc('libssh2_sftp_rmdir_ex')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  path_len                           value like(libssh2_Cuint)\n\n      * C macro implementation.\n     d libssh2_sftp_rmdir...\n     d                 pr                  extproc('libssh2_sftp_rmdir')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n\n     d libssh2_sftp_stat_ex...\n     d                 pr                  extproc('libssh2_sftp_stat_ex')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  path_len                           value like(libssh2_Cuint)\n     d  stat_type                          value like(libssh2_Cint)\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n\n      * C macro libssh2_sftp_stat implementation.\n      * Renamed to avoid upper/lower case name clash.\n     d libssh2_sftp_get_stat...\n     d                 pr                  extproc('libssh2_sftp_stat')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n\n      * C macro libssh2_sftp_lstat implementation.\n      * Renamed to avoid upper/lower case name clash.\n     d libssh2_sftp_get_lstat...\n     d                 pr                  extproc('libssh2_sftp_lstat')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n\n      * C macro libssh2_sftp_setstat implementation.\n      * Renamed to avoid upper/lower case name clash.\n     d libssh2_sftp_set_stat...\n     d                 pr                  extproc('libssh2_sftp_setstat')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  attrs                          *   value                                LIBSSH2_SFTP_...\n     d                                                                          ATTRIBUTES *\n\n     d libssh2_sftp_symlink_ex...\n     d                 pr                  extproc('libssh2_sftp_symlink_ex')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  path_len                           value like(libssh2_Cuint)\n     d  target                         *   value options(*string)               char *\n     d  target_len                         value like(libssh2_Cuint)\n     d  link_type                          value like(libssh2_Cint)\n\n      * C macro libssh2_sftp_symlink implementation.\n      * Renamed to avoid upper/lower case name clash.\n     d libssh2_sftp_sym_link...\n     d                 pr                  extproc('libssh2_sftp_symlink')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  orig                           *   value options(*string)               const char *\n     d  linkpath                       *   value options(*string)               char *\n\n      * C macro libssh2_sftp_readlink implementation.\n      * Renamed to avoid upper/lower case name clash.\n     d libssh2_sftp_read_link...\n     d                 pr                  extproc('libssh2_sftp_readlink')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  target                         *   value                                char *\n     d  maxlen                             value like(libssh2_Cuint)\n\n      * C macro libssh2_sftp_realpath implementation.\n      * Renamed to avoid upper/lower case name clash.\n     d libssh2_sftp_real_path...\n     d                 pr                  extproc('libssh2_sftp_realpath')\n     d                                     like(libssh2_Cint)\n     d  sftp                           *   value                                LIBSSH2_SFTP *\n     d  path                           *   value options(*string)               const char *\n     d  target                         *   value                                char *\n     d  maxlen                             value like(libssh2_Cuint)\n\n      /endif                                                                    LIBSSH2_SFTP_H_\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/macros.h",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_MACROS_H_\n#define LIBSSH2_MACROS_H_\n\n#include \"libssh2.h\"\n#include \"libssh2_publickey.h\"\n#include \"libssh2_sftp.h\"\n\n/*\n * Dummy prototypes to generate wrapper procedures to C macros.\n * This is a helper for languages without a clever preprocessor (ILE/RPG).\n */\n\nLIBSSH2_API LIBSSH2_SESSION * libssh2_session_init(void);\nLIBSSH2_API int libssh2_session_disconnect(LIBSSH2_SESSION *session,\n                                           const char *description);\nLIBSSH2_API int libssh2_userauth_password(LIBSSH2_SESSION *session,\n                                          const char *username,\n                                          const char *password);\nLIBSSH2_API int\nlibssh2_userauth_publickey_fromfile(LIBSSH2_SESSION *session,\n                                    const char *username,\n                                    const char *publickey,\n                                    const char *privatekey,\n                                    const char *passphrase);\nLIBSSH2_API int\nlibssh2_userauth_hostbased_fromfile(LIBSSH2_SESSION *session,\n                                    const char *username,\n                                    const char *publickey,\n                                    const char *privatekey,\n                                    const char *passphrase,\n                                    const char *hostname);\nLIBSSH2_API int\nlibssh2_userauth_keyboard_interactive(LIBSSH2_SESSION* session,\n                                      const char *username,\n                                      LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC(\n                                                       (*response_callback)));\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_open_session(LIBSSH2_SESSION *session);\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_direct_tcpip(LIBSSH2_SESSION *session, const char *host,\n                             int port);\nLIBSSH2_API LIBSSH2_LISTENER *\nlibssh2_channel_forward_listen(LIBSSH2_SESSION *session, int port);\nLIBSSH2_API int\nlibssh2_channel_setenv(LIBSSH2_CHANNEL *channel,\n                       const char *varname, const char *value);\nLIBSSH2_API int\nlibssh2_channel_request_pty(LIBSSH2_CHANNEL *channel, const char *term);\nLIBSSH2_API int\nlibssh2_channel_request_pty_size(LIBSSH2_CHANNEL *channel,\n                                 int width, int height);\nLIBSSH2_API int\nlibssh2_channel_x11_req(LIBSSH2_CHANNEL *channel, int screen_number);\nLIBSSH2_API int\nlibssh2_channel_shell(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int\nlibssh2_channel_exec(LIBSSH2_CHANNEL *channel, const char *command);\nLIBSSH2_API int\nlibssh2_channel_subsystem(LIBSSH2_CHANNEL *channel, const char *subsystem);\nLIBSSH2_API ssize_t\nlibssh2_channel_read(LIBSSH2_CHANNEL *channel, char *buf, size_t buflen);\nLIBSSH2_API ssize_t\nlibssh2_channel_read_stderr(LIBSSH2_CHANNEL *channel, char *buf, size_t buflen);\nLIBSSH2_API unsigned long\nlibssh2_channel_window_read(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API ssize_t\nlibssh2_channel_write(LIBSSH2_CHANNEL *channel, const char *buf, size_t buflen);\nLIBSSH2_API ssize_t\nlibssh2_channel_write_stderr(LIBSSH2_CHANNEL *channel,\n                             const char *buf, size_t buflen);\nLIBSSH2_API unsigned long\nlibssh2_channel_window_write(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_flush(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_flush_stderr(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_scp_send(LIBSSH2_SESSION *session,\n                 const char *path, int mode, libssh2_int64_t size);\n\nLIBSSH2_API int\nlibssh2_publickey_add(LIBSSH2_PUBLICKEY *pkey, const unsigned char *name,\n\t\t      const unsigned char *blob, unsigned long blob_len,\n                      char overwrite, unsigned long num_attrs,\n\t\t      const libssh2_publickey_attribute attrs[]);\nLIBSSH2_API int\nlibssh2_publickey_remove(LIBSSH2_PUBLICKEY *pkey, const unsigned char *name,\n                         const unsigned char *blob, unsigned long blob_len);\n\nLIBSSH2_API int LIBSSH2_SFTP_S_ISLNK(unsigned long permissions);\nLIBSSH2_API int LIBSSH2_SFTP_S_ISREG(unsigned long permissions);\nLIBSSH2_API int LIBSSH2_SFTP_S_ISDIR(unsigned long permissions);\nLIBSSH2_API int LIBSSH2_SFTP_S_ISCHR(unsigned long permissions);\nLIBSSH2_API int LIBSSH2_SFTP_S_ISBLK(unsigned long permissions);\nLIBSSH2_API int LIBSSH2_SFTP_S_ISFIFO(unsigned long permissions);\nLIBSSH2_API int LIBSSH2_SFTP_S_ISSOCK(unsigned long permissions);\nLIBSSH2_API LIBSSH2_SFTP_HANDLE *\nlibssh2_sftp_open(LIBSSH2_SFTP *sftp, const char *filename,\n                  unsigned long flags, long mode);\nLIBSSH2_API LIBSSH2_SFTP_HANDLE *\nlibssh2_sftp_opendir(LIBSSH2_SFTP *sftp, const char *path);\nLIBSSH2_API int libssh2_sftp_readdir(LIBSSH2_SFTP_HANDLE *handle,\n                                     char *buffer, size_t buffer_maxlen,\n                                     LIBSSH2_SFTP_ATTRIBUTES *attrs);\nLIBSSH2_API int libssh2_sftp_close(LIBSSH2_SFTP_HANDLE *handle);\nLIBSSH2_API int libssh2_sftp_closedir(LIBSSH2_SFTP_HANDLE *handle);\nLIBSSH2_API void libssh2_sftp_rewind(LIBSSH2_SFTP_HANDLE *handle);\nLIBSSH2_API int libssh2_sftp_fstat(LIBSSH2_SFTP_HANDLE *handle,\n                                   LIBSSH2_SFTP_ATTRIBUTES *attrs);\nLIBSSH2_API int libssh2_sftp_fsetstat(LIBSSH2_SFTP_HANDLE *handle,\n                                      LIBSSH2_SFTP_ATTRIBUTES *attrs);\nLIBSSH2_API int libssh2_sftp_rename(LIBSSH2_SFTP *sftp,\n                                    const char *source_filename,\n                                    const char *dest_filename);\nLIBSSH2_API int libssh2_sftp_unlink(LIBSSH2_SFTP *sftp, const char *filename);\nLIBSSH2_API int libssh2_sftp_mkdir(LIBSSH2_SFTP *sftp,\n                                   const char *path, long mode);\nLIBSSH2_API int libssh2_sftp_rmdir(LIBSSH2_SFTP *sftp, const char *path);\nLIBSSH2_API int libssh2_sftp_stat(LIBSSH2_SFTP *sftp, const char *path,\n                                  LIBSSH2_SFTP_ATTRIBUTES *attrs);\nLIBSSH2_API int libssh2_sftp_lstat(LIBSSH2_SFTP *sftp, const char *path,\n                                   LIBSSH2_SFTP_ATTRIBUTES *attrs);\nLIBSSH2_API int libssh2_sftp_setstat(LIBSSH2_SFTP *sftp, const char *path,\n                                     LIBSSH2_SFTP_ATTRIBUTES *attrs);\nLIBSSH2_API int libssh2_sftp_symlink(LIBSSH2_SFTP *sftp, const char *orig,\n                                     char *linkpath);\nLIBSSH2_API int libssh2_sftp_readlink(LIBSSH2_SFTP *sftp, const char *path,\n                                      char *target, unsigned int maxlen);\nLIBSSH2_API int libssh2_sftp_realpath(LIBSSH2_SFTP *sftp, const char *path,\n                                      char *target, unsigned int maxlen);\n\n#endif\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/make-include.sh",
    "content": "#!/bin/sh\n#\n#       Installation of the header files in the OS/400 library.\n#\n\nSCRIPTDIR=`dirname \"${0}\"`\n. \"${SCRIPTDIR}/initscript.sh\"\ncd \"${TOPDIR}/include\"\n\n\n#       Create the OS/400 source program file for the header files.\n\nSRCPF=\"${LIBIFSNAME}/H.FILE\"\n\nif action_needed \"${SRCPF}\"\nthen    CMD=\"CRTSRCPF FILE(${TARGETLIB}/H) RCDLEN(112)\"\n        CMD=\"${CMD} CCSID(${TGTCCSID}) TEXT('libssh2: Header files')\"\n        system \"${CMD}\"\nfi\n\n\n#       Create the IFS directory for the header files.\n\nIFSINCLUDE=\"${IFSDIR}/include\"\n\nif action_needed \"${IFSINCLUDE}\"\nthen    mkdir -p \"${IFSINCLUDE}\"\nfi\n\n\ncopy_hfile()\n\n{\n        destfile=\"${1}\"\n        srcfile=\"${2}\"\n        shift\n        shift\n        sed -e '1i\\\n#pragma datamodel(P128)\\\n' \"${@}\" -e '$a\\\n#pragma datamodel(pop)\\\n' < \"${srcfile}\" > \"${destfile}\"\n}\n\n#       Copy the header files.\n\nfor HFILE in *.h \"${TOPDIR}/os400/libssh2_ccsid.h\"\ndo      DEST=\"${SRCPF}/`db2_name \\\"${HFILE}\\\"`.MBR\"\n\n        if action_needed \"${DEST}\" \"${HFILE}\"\n        then    copy_hfile \"${DEST}\" \"${HFILE}\"\n                IFSDEST=\"${IFSINCLUDE}/`basename \\\"${HFILE}\\\"`\"\n                rm -f \"${IFSDEST}\"\n                ln -s \"${DEST}\" \"${IFSDEST}\"\n        fi\ndone\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/make-rpg.sh",
    "content": "#!/bin/sh\n#\n#       Installation of the ILE/RPG header files in the OS/400 library.\n#\n\nSCRIPTDIR=`dirname \"${0}\"`\n. \"${SCRIPTDIR}/initscript.sh\"\ncd \"${TOPDIR}/os400/libssh2rpg\"\n\n\n#       Create the OS/400 source program file for the ILE/RPG header files.\n\nSRCPF=\"${LIBIFSNAME}/LIBSSH2RPG.FILE\"\n\nif action_needed \"${SRCPF}\"\nthen    CMD=\"CRTSRCPF FILE(${TARGETLIB}/LIBSSH2RPG) RCDLEN(112)\"\n        CMD=\"${CMD} CCSID(${TGTCCSID}) TEXT('libssh2: ILE/RPG header files')\"\n        system \"${CMD}\"\nfi\n\n\n#       Map file names to DB2 name syntax.\n\nfor HFILE in *.rpgle *.rpgle.in\ndo      NAME=\"`basename \\\"${HFILE}\\\" .in`\"\n        VAR=\"`basename \\\"${NAME}\\\" .rpgle`\"\n        VAL=\"`db2_name \\\"${NAME}\\\"`\"\n\n        eval \"VAR_${VAR}=\\\"${VAL}\\\"\"\n        echo \"${VAR} s/${VAR}/${VAL}/g\"\ndone > tmpsubstfile1\n\n#       Order substitution commands so that a prefix appears after all\n#               file names beginning with the prefix.\n\nsort -r tmpsubstfile1 | sed 's/^[^ ]*[ ]*//' > tmpsubstfile2\n\n\nchange_include()\n\n{\n        sed -e '\\#^....../include  *\"libssh2rpg/#{'                     \\\n            -e 's///'                                                   \\\n            -e 's/\".*//'                                                \\\n            -f tmpsubstfile2                                            \\\n            -e 's#.*#      /include libssh2rpg,&#'                      \\\n            -e '}'\n}\n\n\n#       Create the IFS directory for the ILE/RPG header files.\n\nRPGIFSDIR=\"${IFSDIR}/include/libssh2rpg\"\n\nif action_needed \"${RPGIFSDIR}\"\nthen    mkdir -p \"${RPGIFSDIR}\"\nfi\n\n#       Copy the header files to IFS ILE/RPG include directory.\n#       Copy them with include path editing to the DB2 library.\n\nfor HFILE in *.rpgle *.rpgle.in\ndo      IFSCMD=\"cat \\\"${HFILE}\\\"\"\n        DB2CMD=\"change_include < \\\"${HFILE}\\\"\"\n        IFSFILE=\"`basename \\\"${HFILE}\\\" .in`\"\n\n        case \"${HFILE}\" in\n\n        *.in)   IFSCMD=\"${IFSCMD} | versioned_copy\"\n                DB2CMD=\"${DB2CMD} | versioned_copy\"\n                ;;\n        esac\n\n        IFSDEST=\"${RPGIFSDIR}/${IFSFILE}\"\n\n        if action_needed \"${IFSDEST}\" \"${HFILE}\"\n        then    eval \"${IFSCMD}\" > \"${IFSDEST}\"\n        fi\n\n        eval DB2MBR=\"\\\"\\${VAR_`basename \\\"${IFSDEST}\\\" .rpgle`}\\\"\"\n        DB2DEST=\"${SRCPF}/${DB2MBR}.MBR\"\n\n        if action_needed \"${DB2DEST}\" \"${HFILE}\"\n        then    eval \"${DB2CMD}\" | change_include > tmphdrfile\n\n                #       Need to translate to target CCSID.\n\n                CMD=\"CPY OBJ('`pwd`/tmphdrfile') TOOBJ('${DB2DEST}')\"\n                CMD=\"${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)\"\n                system \"${CMD}\"\n        fi\ndone\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/make-src.sh",
    "content": "#!/bin/sh\n#\n#       libssh2 compilation script for the OS/400.\n#\n\nSCRIPTDIR=`dirname \"${0}\"`\n. \"${SCRIPTDIR}/initscript.sh\"\ncd \"${TOPDIR}/src\"\n\n\n#       Function to extract external prototypes from header files.\n#       Input: concatenated header files.\n#       Output: external prototypes, one per (long) line.\n\nextproto()\n{\n        sed -e 'x;G;s/^\\n//;s/\\n/ /g'                                   \\\n            -e 's#[[:space:]]*/\\*[^*]*\\(\\*\\([^/*][^*]*\\)\\{0,1\\}\\)*\\*/[[:space:]]*##g' \\\n            -e 'h'                                                      \\\n            -e '/\\/\\*/!{'                                               \\\n            -e '/^#/{s/^.*[^\\\\]$//;h;d'                                 \\\n            -e '}'                                                      \\\n            -e 's/[{}]/;/g;s/\\\\$//'                                     \\\n            -e ':loop1'                                                 \\\n            -e '/;/{'                                                   \\\n            -e 's/^[^;]*;//;x;s/;.*//'                                  \\\n            -e '/^[[:space:]]*LIBSSH2_API[[:space:]].*(/{'              \\\n            -e 's/^[[:space:]]*LIBSSH2_API[[:space:]]*//'               \\\n            -e 's/[[:space:]]*$//'                                      \\\n            -e 's/[[:space:]][[:space:]]*/ /g'                          \\\n            -e 'p'                                                      \\\n            -e '}'                                                      \\\n            -e 'g;bloop1'                                               \\\n            -e '}'                                                      \\\n            -e '}'                                                      \\\n            -n\n}\n\n#       Need to have IFS access to the mih/modasa header file.\n\nif action_needed modasa.mih '/QSYS.LIB/QSYSINC.LIB/MIH.FILE/MODASA.MBR'\nthen    rm -f modasa.mih\n        ln -s '/QSYS.LIB/QSYSINC.LIB/MIH.FILE/MODASA.MBR' modasa.mih\nfi\n\n\n#      Create and compile the identification source file.\n\necho '#pragma comment(user, \"libssh2 version '\"${LIBSSH2_VERSION}\"'\")' > os400.c\necho '#pragma comment(user, __DATE__)' >> os400.c\necho '#pragma comment(user, __TIME__)' >> os400.c\necho '#pragma comment(copyright, \"See COPYING file. OS/400 version by P. Monnerat\")' >> os400.c\nmake_module     OS400           os400.c\nLINK=                           # No need to rebuild service program yet.\nMODULES=\n\n\n#       Generate the procedures implementing macros.\n\nif action_needed macros.c \"${TOPDIR}/os400/macros.h\"\nthen    (\n                echo '#include \"libssh2_publickey.h\"'\n                echo '#include \"libssh2_sftp.h\"'\n                extproto < \"${TOPDIR}/os400/macros.h\"                   |\n                sed -e 'h;s/^[^(]*[ *]\\([^ (]*\\) *(.*/\\1/'              \\\n                    -e 's/.*/#pragma map(_&, \"&\")/;p'                   \\\n                    -e 'g;s/^\\([^(]*[ *]\\)\\([^ (]*\\)\\( *(.*\\)/\\1_\\2\\3 {/;p' \\\n                    -e 'g;s/^[^(]*(\\(.*\\))$/,\\1,/;s/[^A-Za-z0-9_,]/ /g' \\\n                    -e 's/  *,/,/g;s/,[^,]* \\([^ ,]*\\)/,\\1/g'           \\\n                    -e 's/ //g;s/^,void,$/,,/'                          \\\n                    -e 's/^,\\(.*\\),$/(\\1); }/;s/,/, /g'                 \\\n                    -e 'x;s/(.*//;s/ *$//;G;s/\\n//g'                    \\\n                    -e 's/^void\\([ *]\\)/\\1/;s/^ *//'                    \\\n                    -e 's/^[^(]*[ *]\\([A-Za-z][A-Za-z0-9_]* *(\\)/return \\1/' \\\n                    -e 's/.*/    &/'\n        ) > macros.c\nfi\n\n#       Get source list.\n\ncat ../Makefile.inc ../Makefile.os400qc3.inc                            |\n  sed -e ':begin'                                                       \\\n    -e '/\\\\$/{'                                                         \\\n    -e 's/\\\\$/ /'                                                       \\\n    -e 'N'                                                              \\\n    -e 'bbegin'                                                         \\\n    -e '}'                                                              \\\n    -e 's/\\n//g'                                                        \\\n    -e 's/[[:space:]]*$//'                                              \\\n    -e 's/^\\([A-Za-z][A-Za-z0-9_]*\\)[[:space:]]*=[[:space:]]*\\(.*\\)/\\1=\"\\2\"/' \\\n    -e 's/\\$(\\([A-Za-z][A-Za-z0-9_]*\\))/${\\1}/g'                        \\\n        > tmpscript.sh\n. ./tmpscript.sh\n\n\n#       Compile the sources into modules.\n\nINCLUDES=\"'`pwd`'\"\n\nfor SRC in \"${TOPDIR}/os400/os400sys.c\" \"${TOPDIR}/os400/ccsid.c\"       \\\n           ${CSOURCES} ${CRYPTO_CSOURCES} macros.c\ndo      MODULE=`db2_name \"${SRC}\"`\n        make_module \"${MODULE}\" \"${SRC}\"\ndone\n\n\n#       If needed, (re)create the static binding directory.\n\nif action_needed \"${LIBIFSNAME}/${STATBNDDIR}.BNDDIR\"\nthen    LINK=YES\nfi\n\nif [ \"${LINK}\" ]\nthen    rm -rf \"${LIBIFSNAME}/${STATBNDDIR}.BNDDIR\"\n        CMD=\"CRTBNDDIR BNDDIR(${TARGETLIB}/${STATBNDDIR})\"\n        CMD=\"${CMD} TEXT('libssh2 API static binding directory')\"\n        system \"${CMD}\"\n\n        for MODULE in ${MODULES}\n        do      CMD=\"ADDBNDDIRE BNDDIR(${TARGETLIB}/${STATBNDDIR})\"\n                CMD=\"${CMD} OBJ((${TARGETLIB}/${MODULE} *MODULE))\"\n                system \"${CMD}\"\n        done\n\n#       V6R1M0 does not list system service program QC3PBEXT in the\n#       implicit binding directory: thus we add it here in ours.\n\n        CMD=\"ADDBNDDIRE BNDDIR(${TARGETLIB}/${STATBNDDIR})\"\n        CMD=\"${CMD} OBJ((QSYS/QC3PBEXT *SRVPGM))\"\n        system \"${CMD}\"\nfi\n\n\n#       The exportation file for service program creation must be in a DB2\n#               source file, so make sure it exists.\n\nif action_needed \"${LIBIFSNAME}/TOOLS.FILE\"\nthen    CMD=\"CRTSRCPF FILE(${TARGETLIB}/TOOLS) RCDLEN(112)\"\n        CMD=\"${CMD} TEXT('libssh2: build tools')\"\n        system \"${CMD}\"\nfi\n\n\n#       Gather the list of symbols to export.\n\nEXPORTS=`cat \"${TOPDIR}\"/include/*.h \"${TOPDIR}/os400/macros.h\"         \\\n             \"${TOPDIR}/os400/libssh2_ccsid.h\"                          |\n         extproto                                                       |\n         sed -e 's/(.*//;s/[^A-Za-z0-9_]/ /g;s/ *$//;s/^.* //'`\n\n#       Create the service program exportation file in DB2 member if needed.\n\nBSF=\"${LIBIFSNAME}/TOOLS.FILE/BNDSRC.MBR\"\n\nif action_needed \"${BSF}\" Makefile.am\nthen    LINK=YES\nfi\n\nif [ \"${LINK}\" ]\nthen    echo \" STRPGMEXP PGMLVL(*CURRENT) SIGNATURE('LIBSSH2_${SONAME}')\" \\\n            > \"${BSF}\"\n        for EXPORT in ${EXPORTS}\n        do      echo ' EXPORT    SYMBOL(\"'\"${EXPORT}\"'\")' >> \"${BSF}\"\n        done\n\n        echo ' ENDPGMEXP' >> \"${BSF}\"\nfi\n\n\n#       Build the service program if needed.\n\nif action_needed \"${LIBIFSNAME}/${SRVPGM}.SRVPGM\"\nthen    LINK=YES\nfi\n\nif [ \"${LINK}\" ]\nthen    CMD=\"CRTSRVPGM SRVPGM(${TARGETLIB}/${SRVPGM})\"\n        CMD=\"${CMD} SRCFILE(${TARGETLIB}/TOOLS) SRCMBR(BNDSRC)\"\n        CMD=\"${CMD} MODULE(${TARGETLIB}/OS400)\"\n        CMD=\"${CMD} BNDDIR(${TARGETLIB}/${STATBNDDIR}\"\n        if [ \"${WITH_ZLIB}\" != 0 ]\n        then    CMD=\"${CMD} ${ZLIB_LIB}/${ZLIB_BNDDIR}\"\n                liblist -a \"${ZLIB_LIB}\"\n        fi\n        CMD=\"${CMD})\"\n        CMD=\"${CMD} BNDSRVPGM(QADRTTS)\"\n        CMD=\"${CMD} TEXT('libssh2 API library')\"\n        CMD=\"${CMD} TGTRLS(${TGTRLS})\"\n        system \"${CMD}\"\n        LINK=YES\nfi\n\n\n#       If needed, (re)create the dynamic binding directory.\n\nif action_needed \"${LIBIFSNAME}/${DYNBNDDIR}.BNDDIR\"\nthen    LINK=YES\nfi\n\nif [ \"${LINK}\" ]\nthen    rm -rf \"${LIBIFSNAME}/${DYNBNDDIR}.BNDDIR\"\n        CMD=\"CRTBNDDIR BNDDIR(${TARGETLIB}/${DYNBNDDIR})\"\n        CMD=\"${CMD} TEXT('libssh2 API dynamic binding directory')\"\n        system \"${CMD}\"\n        CMD=\"ADDBNDDIRE BNDDIR(${TARGETLIB}/${DYNBNDDIR})\"\n        CMD=\"${CMD} OBJ((*LIBL/${SRVPGM} *SRVPGM))\"\n        system \"${CMD}\"\nfi\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/make.sh",
    "content": "#!/bin/sh\n#\n#       libssh2 compilation script for the OS/400.\n#\n#\n#       This is a shell script since make is not a standard component of OS/400.\n\nSCRIPTDIR=`dirname \"${0}\"`\n. \"${SCRIPTDIR}/initscript.sh\"\ncd \"${TOPDIR}\"\n\n\n#       Create the OS/400 library if it does not exist.\n\nif action_needed \"${LIBIFSNAME}\"\nthen    CMD=\"CRTLIB LIB(${TARGETLIB}) TEXT('libssh2: SSH2 protocol API')\"\n        system \"${CMD}\"\nfi\n\n\n#       Create the DOCS source file if it does not exist.\n\nif action_needed \"${LIBIFSNAME}/DOCS.FILE\"\nthen    CMD=\"CRTSRCPF FILE(${TARGETLIB}/DOCS) RCDLEN(240)\"\n        CMD=\"${CMD} CCSID(${TGTCCSID}) TEXT('Documentation texts')\"\n        system \"${CMD}\"\nfi\n\n\n#       Copy some documentation files if needed.\n\nfor TEXT in \"${TOPDIR}/COPYING\" \"${SCRIPTDIR}/README400\"                \\\n    \"${TOPDIR}/NEWS\" \"${TOPDIR}/README\" \"${TOPDIR}/docs/AUTHORS\"        \\\n    \"${TOPDIR}/docs/BINDINGS\"\ndo      MEMBER=\"${LIBIFSNAME}/DOCS.FILE/`db2_name \\\"${TEXT}\\\"`.MBR\"\n\n        if action_needed \"${MEMBER}\" \"${TEXT}\"\n        then    CMD=\"CPY OBJ('${TEXT}') TOOBJ('${MEMBER}') TOCCSID(${TGTCCSID})\"\n                CMD=\"${CMD} DTAFMT(*TEXT) REPLACE(*YES)\"\n                system \"${CMD}\"\n        fi\ndone\n\n\n#       Build in each directory.\n\nfor SUBDIR in include rpg src\ndo      \"${SCRIPTDIR}/make-${SUBDIR}.sh\"\ndone\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/os400/os400sys.c",
    "content": "/*\n * Copyright (C) 2015 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* OS/400 additional support. */\n\n#define LIBSSH2_DISABLE_QADRT_EXT\n\n#include \"libssh2_priv.h\"\n\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <sys/un.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <stddef.h>\n#include <stdarg.h>\n#include <string.h>\n#include <alloca.h>\n#include <netdb.h>\n#include <qadrt.h>\n#include <errno.h>\n\n#include <netinet/in.h>\n#include <arpa/inet.h>\n\n#ifdef LIBSSH2_HAVE_ZLIB\n# include <zlib.h>\n#endif\n\n\n/**\n***     QADRT OS/400 ASCII runtime defines only the most used procedures, but\n***             a lot of them are not supported. This module implements\n***             ASCII wrappers for those that are used by libssh2, but not\n***             defined by QADRT.\n**/\n\n#pragma convert(37)                             /* Restore EBCDIC. */\n\n\nstatic int\nconvert_sockaddr(struct sockaddr_storage * dstaddr,\n                                const struct sockaddr * srcaddr, int srclen)\n\n{\n  const struct sockaddr_un * srcu;\n  struct sockaddr_un * dstu;\n  unsigned int i;\n  unsigned int dstsize;\n\n  /* Convert a socket address into job CCSID, if needed. */\n\n  if(!srcaddr || srclen < offsetof(struct sockaddr, sa_family) +\n     sizeof srcaddr->sa_family || srclen > sizeof *dstaddr) {\n    errno = EINVAL;\n    return -1;\n    }\n\n  memcpy((char *) dstaddr, (char *) srcaddr, srclen);\n\n  switch (srcaddr->sa_family) {\n\n  case AF_UNIX:\n    srcu = (const struct sockaddr_un *) srcaddr;\n    dstu = (struct sockaddr_un *) dstaddr;\n    dstsize = sizeof *dstaddr - offsetof(struct sockaddr_un, sun_path);\n    srclen -= offsetof(struct sockaddr_un, sun_path);\n    i = QadrtConvertA2E(dstu->sun_path, srcu->sun_path, dstsize - 1, srclen);\n    dstu->sun_path[i] = '\\0';\n    i += offsetof(struct sockaddr_un, sun_path);\n    srclen = i;\n    }\n\n  return srclen;\n}\n\n\nint\n_libssh2_os400_connect(int sd, struct sockaddr * destaddr, int addrlen)\n\n{\n  int i;\n  struct sockaddr_storage laddr;\n\n  i = convert_sockaddr(&laddr, destaddr, addrlen);\n\n  if(i < 0)\n    return -1;\n\n  return connect(sd, (struct sockaddr *) &laddr, i);\n}\n\n\nint\n_libssh2_os400_vsnprintf(char *dst, size_t len, const char *fmt, va_list args)\n{\n    size_t l = 4096;\n    int i;\n    char *buf;\n\n    if (!dst || !len) {\n        errno = EINVAL;\n        return -1;\n    }\n\n    if (l < len)\n        l = len;\n\n    buf = alloca(l);\n\n    if (!buf) {\n        errno = ENOMEM;\n        return -1;\n    }\n\n    i = vsprintf(buf, fmt, args);\n\n    if (i < 0)\n        return i;\n\n    if (--len > i)\n        len = i;\n\n    if (len)\n        memcpy(dst, buf, len);\n\n    dst[len] = '\\0';\n    return len;\n}\n\n/* VARARGS3 */\nint\n_libssh2_os400_snprintf(char *dst, size_t len, const char *fmt, ...)\n{\n    va_list args;\n    int ret;\n\n    va_start(args, fmt);\n    ret = _libssh2_os400_vsnprintf(dst, len, fmt, args);\n    va_end(args);\n    return ret;\n}\n\n\n#ifdef LIBSSH2_HAVE_ZLIB\nint\n_libssh2_os400_inflateInit_(z_streamp strm,\n                            const char *version, int stream_size)\n{\n    char *ebcversion;\n    int i;\n\n    if (!version)\n        return Z_VERSION_ERROR;\n    i = strlen(version);\n    ebcversion = alloca(i + 1);\n    if (!ebcversion)\n        return Z_VERSION_ERROR;\n    i = QadrtConvertA2E(ebcversion, version, i, i - 1);\n    ebcversion[i] = '\\0';\n    return inflateInit_(strm, ebcversion, stream_size);\n}\n\nint\n_libssh2_os400_deflateInit_(z_streamp strm, int level,\n                            const char *version, int stream_size)\n{\n    char *ebcversion;\n    int i;\n\n    if (!version)\n        return Z_VERSION_ERROR;\n    i = strlen(version);\n    ebcversion = alloca(i + 1);\n    if (!ebcversion)\n        return Z_VERSION_ERROR;\n    i = QadrtConvertA2E(ebcversion, version, i, i - 1);\n    ebcversion[i] = '\\0';\n    return deflateInit_(strm, level, ebcversion, stream_size);\n}\n\n#endif\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/.gitignore",
    "content": "libssh2_config.h\nlibssh2_config.h.in\nstamp-h1\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/CMakeLists.txt",
    "content": "# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\ninclude(CheckFunctionExists)\ninclude(CheckSymbolExists)\ninclude(CheckFunctionExistsMayNeedLibrary)\ninclude(CheckIncludeFiles)\ninclude(CheckTypeSize)\ninclude(CheckSymbolExists)\ninclude(CheckNonblockingSocketSupport)\ninclude(SocketLibraries)\n\n## Cryptography backend choice\n\nset(CRYPTO_BACKEND\n  \"\"\n  CACHE\n  STRING\n  \"The backend to use for cryptography: OpenSSL, Libgcrypt or WinCNG, mbedTLS\nor empty to try any available\")\n\n# If the crypto backend was given, rather than searching for the first\n# we are able to find, the find_package commands must abort configuration\n# and report to the user.\nif(CRYPTO_BACKEND)\n  set(SPECIFIC_CRYPTO_REQUIREMENT REQUIRED)\nendif()\n\nif(CRYPTO_BACKEND STREQUAL \"OpenSSL\" OR NOT CRYPTO_BACKEND)\n\n  find_package(OpenSSL ${SPECIFIC_CRYPTO_REQUIREMENT})\n\n  if(OPENSSL_FOUND)\n    set(CRYPTO_BACKEND \"OpenSSL\")\n    set(CRYPTO_SOURCES openssl.c openssl.h)\n    list(APPEND PRIVATE_COMPILE_DEFINITIONS LIBSSH2_OPENSSL)\n    list(APPEND PRIVATE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR})\n    list(APPEND LIBRARIES ${OPENSSL_LIBRARIES})\n    list(APPEND PC_REQUIRES_PRIVATE libssl libcrypto)\n\n    if (WIN32)\n      # Statically linking to OpenSSL requires crypt32 for some Windows APIs.\n      # This should really be handled by FindOpenSSL.cmake.\n      list(APPEND LIBRARIES crypt32)\n      list(APPEND PC_LIBS -lcrypt32)\n\n      find_file(DLL_LIBEAY32\n        NAMES libeay32.dll crypto.dll libcrypto-1_1.dll libcrypto-1_1-x64.dll\n        HINTS ${_OPENSSL_ROOT_HINTS} PATHS ${_OPENSSL_ROOT_PATHS}\n        PATH_SUFFIXES bin)\n      if (NOT DLL_LIBEAY32)\n        message(WARNING\n          \"Unable to find OpenSSL crypto (aka libeay32) DLL, executables may not run\")\n      endif()\n\n      find_file(DLL_SSLEAY32\n        NAMES ssleay32.dll ssl.dll libssl-1_1.dll libssl-1_1-x64.dll\n        HINTS ${_OPENSSL_ROOT_HINTS} PATHS ${_OPENSSL_ROOT_PATHS}\n        PATH_SUFFIXES bin)\n      if (NOT DLL_SSLEAY32)\n        message(WARNING\n          \"Unable to find OpenSSL ssl (aka ssleay32) DLL, executables may not run\")\n      endif()\n\n      if(DLL_LIBEAY32 AND DLL_SSLEAY32)\n        list(APPEND _RUNTIME_DEPENDENCIES ${DLL_LIBEAY32} ${DLL_SSLEAY32})\n      endif()\n    endif()\n\n    # Not all OpenSSL have AES-CTR functions.\n    set(SAVE_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})\n    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES})\n    check_function_exists(EVP_aes_128_ctr HAVE_EVP_AES_128_CTR)\n    set(CMAKE_REQUIRED_LIBRARIES ${SAVE_CMAKE_REQUIRED_LIBRARIES})\n  endif()\nendif()\n\nif(CRYPTO_BACKEND STREQUAL \"Libgcrypt\" OR NOT CRYPTO_BACKEND)\n\n  find_package(Libgcrypt ${SPECIFIC_CRYPTO_REQUIREMENT})\n\n  if(LIBGCRYPT_FOUND)\n    set(CRYPTO_BACKEND \"Libgcrypt\")\n    set(CRYPTO_SOURCES libgcrypt.c libgcrypt.h)\n    list(APPEND PRIVATE_COMPILE_DEFINITIONS LIBSSH2_LIBGCRYPT)\n    list(APPEND PRIVATE_INCLUDE_DIRECTORIES ${LIBGCRYPT_INCLUDE_DIRS})\n    list(APPEND LIBRARIES ${LIBGCRYPT_LIBRARIES})\n    list(APPEND PC_LIBS -lgcrypt)\n  endif()\nendif()\n\nif(CRYPTO_BACKEND STREQUAL \"WinCNG\" OR NOT CRYPTO_BACKEND)\n\n  # The check actually compiles the header.  This requires windows.h.\n  check_include_files(\"windows.h;bcrypt.h\" HAVE_BCRYPT_H)\n\n  if(HAVE_BCRYPT_H)\n    set(CRYPTO_BACKEND \"WinCNG\")\n    set(CRYPTO_SOURCES wincng.c wincng.h)\n    list(APPEND PRIVATE_COMPILE_DEFINITIONS LIBSSH2_WINCNG)\n\n    set(HAVE_LIBCRYPT32 TRUE)\n    list(APPEND LIBRARIES bcrypt)\n    list(APPEND PC_LIBS -lbcrypt)\n\n    check_include_files(ntdef.h HAVE_NTDEF_H)\n    check_include_files(ntstatus.h HAVE_NTSTATUS_H)\n\n    # Reading keys from files is optional and depends on Wincrypt\n    check_include_files(\"windows.h;wincrypt.h\" HAVE_WINCRYPT_H)\n\n    if(HAVE_WINCRYPT_H)\n      list(APPEND LIBRARIES crypt32)\n      list(APPEND PC_LIBS -lcrypt32)\n    endif()\n\n  elseif(${SPECIFIC_CRYPTO_REQUIREMENT} STREQUAL ${REQUIRED})\n    message(FATAL_ERROR \"WinCNG not available\")\n  endif()\nendif()\n\nif(CRYPTO_BACKEND STREQUAL \"mbedTLS\" OR NOT CRYPTO_BACKEND)\n\n  find_package(mbedTLS ${SPECIFIC_CRYPTO_REQUIREMENT})\n\n  if(MBEDTLS_FOUND)\n    set(CRYPTO_BACKEND \"mbedTLS\")\n    set(CRYPTO_SOURCES mbedtls.c mbedtls.h)\n    list(APPEND PRIVATE_COMPILE_DEFINITIONS LIBSSH2_MBEDTLS)\n    list(APPEND PRIVATE_INCLUDE_DIRECTORIES ${MBEDTLS_INCLUDE_DIR})\n    list(APPEND LIBRARIES ${MBEDTLS_LIBRARIES})\n    list(APPEND PC_LIBS -lmbedcrypto)\n    link_directories(${MBEDTLS_LIBRARY_DIR})\n  endif()\nendif()\n\nif(NOT CRYPTO_BACKEND)\n  message(FATAL_ERROR \"No suitable cryptography backend found.\")\nendif()\n\n## Library definition\n\ninclude(GNUInstallDirs)\nset(SOURCES\n  ${CRYPTO_SOURCES}\n  agent.c\n  blf.h\n  bcrypt_pbkdf.c\n  blowfish.c\n  channel.c\n  channel.h\n  comp.c\n  comp.h\n  crypt.c\n  crypto.h\n  global.c\n  hostkey.c\n  keepalive.c\n  kex.c\n  knownhost.c\n  libssh2_priv.h\n  mac.c\n  mac.h\n  misc.c\n  misc.h\n  packet.c\n  packet.h\n  pem.c\n  publickey.c\n  scp.c\n  session.c\n  session.h\n  sftp.c\n  sftp.h\n  transport.c\n  transport.h\n  userauth.c\n  userauth.h\n  version.c)\n\nif(WIN32)\n  list(APPEND SOURCES ${PROJECT_SOURCE_DIR}/win32/libssh2.rc)\nendif()\n\nadd_library(libssh2 ${SOURCES})\n# we want it to be called libssh2 on all platforms\nset_target_properties(libssh2 PROPERTIES PREFIX \"\")\n\ntarget_compile_definitions(libssh2 PRIVATE ${PRIVATE_COMPILE_DEFINITIONS})\ntarget_include_directories(libssh2\n  PRIVATE \"${PROJECT_SOURCE_DIR}/include/\" ${PRIVATE_INCLUDE_DIRECTORIES}\n  PUBLIC\n    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>\n    $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>)\n\n## Options\n\noption(CLEAR_MEMORY \"Enable clearing of memory before being freed\" ON)\nif(CLEAR_MEMORY)\n    add_definitions(-DLIBSSH2_CLEAR_MEMORY)\nendif(CLEAR_MEMORY)\n\nadd_feature_info(\"Shared library\" BUILD_SHARED_LIBS\n  \"creating libssh2 as a shared library (.so/.dll)\")\n\noption(ENABLE_ZLIB_COMPRESSION \"Use zlib for compression\")\nadd_feature_info(Compression ENABLE_ZLIB_COMPRESSION\n  \"using zlib for compression\")\nif(ENABLE_ZLIB_COMPRESSION)\n  find_package(ZLIB REQUIRED)\n\n  target_include_directories(libssh2 PRIVATE ${ZLIB_INCLUDE_DIRS})\n  list(APPEND LIBRARIES ${ZLIB_LIBRARIES})\n  list(APPEND PC_REQUIRES_PRIVATE zlib)\n  if(ZLIB_FOUND)\n    target_compile_definitions(libssh2 PRIVATE LIBSSH2_HAVE_ZLIB=1)\n  endif()\nendif()\n\noption(ENABLE_CRYPT_NONE \"Permit \\\"none\\\" cipher -- NOT RECOMMENDED\")\nadd_feature_info(\"\\\"none\\\" cipher\" ENABLE_CRYPT_NONE \"\")\nif(ENABLE_CRYPT_NONE)\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2_CRYPT_NONE=1)\nendif()\n\noption(ENABLE_MAC_NONE \"Permit \\\"none\\\" MAC -- NOT RECOMMMENDED\")\nadd_feature_info(\"\\\"none\\\" MAC\" ENABLE_MAC_NONE \"\")\nif(ENABLE_MAC_NONE)\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2_MAC_NONE=1)\nendif()\n\noption(ENABLE_GEX_NEW\n  \"Enable diffie-hellman-group-exchange-sha1 method\" ON)\nadd_feature_info(\"diffie-hellman-group-exchange-sha1\" ENABLE_GEX_NEW\n  \"\\\"new\\\" diffie-hellman-group-exchange-sha1 method\")\nif(ENABLE_GEX_NEW)\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2_DH_GEX_NEW=1)\nendif()\n\n# Enable debugging logging by default if the user configured a debug build\nif(CMAKE_BUILD_TYPE STREQUAL \"Debug\")\n  set(DEBUG_LOGGING_DEFAULT ON)\nelse()\n  set(DEBUG_LOGGING_DEFAULT OFF)\nendif()\noption(ENABLE_DEBUG_LOGGING \"log execution with debug trace\"\n  ${DEBUG_LOGGING_DEFAULT})\nadd_feature_info(Logging ENABLE_DEBUG_LOGGING\n   \"Logging of execution with debug trace\")\nif(ENABLE_DEBUG_LOGGING)\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2DEBUG)\nendif()\n\n## Platform checks\ncheck_include_files(unistd.h HAVE_UNISTD_H)\ncheck_include_files(inttypes.h HAVE_INTTYPES_H)\ncheck_include_files(stdlib.h HAVE_STDLIB_H)\ncheck_include_files(sys/select.h HAVE_SYS_SELECT_H)\n\ncheck_include_files(sys/uio.h HAVE_SYS_UIO_H)\ncheck_include_files(sys/socket.h HAVE_SYS_SOCKET_H)\ncheck_include_files(sys/ioctl.h HAVE_SYS_IOCTL_H)\ncheck_include_files(sys/time.h HAVE_SYS_TIME_H)\ncheck_include_files(sys/un.h HAVE_SYS_UN_H)\ncheck_include_files(windows.h HAVE_WINDOWS_H)\ncheck_include_files(ws2tcpip.h HAVE_WS2TCPIP_H)\ncheck_include_files(winsock2.h HAVE_WINSOCK2_H)\n\ncheck_type_size(\"long long\" LONGLONG)\n\nif(HAVE_SYS_TIME_H)\n  check_symbol_exists(gettimeofday sys/time.h HAVE_GETTIMEOFDAY)\nelse()\n  check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)\nendif()\nif(HAVE_STDLIB_H)\n  check_symbol_exists(strtoll stdlib.h HAVE_STRTOLL)\nelse()\n  check_function_exists(strtoll HAVE_STRTOLL)\nendif()\nif (NOT HAVE_STRTOLL)\n  # Try _strtoi64 if strtoll isn't available\n  check_symbol_exists(_strtoi64 stdlib.h HAVE_STRTOI64)\nendif()\ncheck_symbol_exists(snprintf stdio.h HAVE_SNPRINTF)\ncheck_symbol_exists(memset_s string.h HAVE_MEMSET_S)\n\nif(${CMAKE_SYSTEM_NAME} STREQUAL \"Darwin\" OR\n   ${CMAKE_SYSTEM_NAME} STREQUAL \"Interix\")\n  # poll() does not work on these platforms\n  #\n  # Interix: \"does provide poll(), but the implementing developer must\n  # have been in a bad mood, because poll() only works on the /proc\n  # filesystem here\"\n  #\n  # Mac OS X's poll has funny behaviors, like:\n  # not being able to do poll on no filedescriptors (10.3?)\n  # not being able to poll on some files (like anything in /dev)\n  # not having reliable timeout support\n  # inconsistent return of POLLHUP where other implementations give POLLIN\n  message(\"poll use is disabled on this platform\")\nelse()\n  check_function_exists(poll HAVE_POLL)\nendif()\n\nappend_needed_socket_libraries(LIBRARIES)\n\n# Non-blocking socket support tests.  Must be after library tests to\n# link correctly\nset(SAVE_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})\nset(CMAKE_REQUIRED_LIBRARIES ${LIBRARIES})\ncheck_nonblocking_socket_support()\nset(CMAKE_REQUIRED_LIBRARIES ${SAVE_CMAKE_REQUIRED_LIBRARIES})\n\nconfigure_file(\n  ${CMAKE_CURRENT_SOURCE_DIR}/libssh2_config_cmake.h.in\n  ${CMAKE_CURRENT_BINARY_DIR}/libssh2_config.h)\n# to find generated header\ntarget_include_directories(libssh2 PRIVATE ${CMAKE_CURRENT_BINARY_DIR})\n\n# Check for the OS.\n# Daniel's note: this should not be necessary and we need to work to\n# get this removed.\nif(${CMAKE_SYSTEM_NAME} STREQUAL \"Windows\")\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2_WIN32)\nelseif(${CMAKE_SYSTEM_NAME} STREQUAL \"Darwin\")\n  target_compile_definitions(libssh2 PRIVATE LIBSSH2_DARWIN)\nendif()\n\nif(CMAKE_VERSION VERSION_LESS \"2.8.12\")\n  # Fall back to over-linking dependencies\n  target_link_libraries(libssh2 ${LIBRARIES})\nelse()\n  target_link_libraries(libssh2 PRIVATE ${LIBRARIES})\nendif()\n\n## Installation\n\ninstall(FILES\n  ${PROJECT_SOURCE_DIR}/include/libssh2.h\n  ${PROJECT_SOURCE_DIR}/include/libssh2_publickey.h\n  ${PROJECT_SOURCE_DIR}/include/libssh2_sftp.h\n  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})\n\ninstall(TARGETS libssh2\n  EXPORT Libssh2Config\n  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}\n  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}\n  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})\n\nif(BUILD_SHARED_LIBS)\n  list(APPEND _RUNTIME_DEPENDENCIES $<TARGET_FILE:libssh2>)\nendif()\n\nset(RUNTIME_DEPENDENCIES ${_RUNTIME_DEPENDENCIES} CACHE INTERNAL\n    \"Files that must be in the same directory as the executables at runtime.\")\n\n# Package config\n\n## During package installation, install Libssh2Config.cmake\ninstall(EXPORT Libssh2Config\n  NAMESPACE Libssh2::\n  DESTINATION lib/cmake/libssh2)\n\n## During build, register directly from build tree\n# create Libssh2Config.cmake\nexport(TARGETS libssh2 NAMESPACE Libssh2:: FILE Libssh2Config.cmake)\nexport(PACKAGE Libssh2) # register it\n\n## Export a .pc file for client projects not using CMaek\nif(PC_REQUIRES_PRIVATE)\n  string(REPLACE \";\" \",\" PC_REQUIRES_PRIVATE \"${PC_REQUIRES_PRIVATE}\")\nendif()\nif(PC_LIBS)\n  string(REPLACE \";\" \" \" PC_LIBS \"${PC_LIBS}\")\nendif()\nconfigure_file(libssh2.pc.in libssh2.pc @ONLY)\ninstall(\n  FILES ${CMAKE_CURRENT_BINARY_DIR}/libssh2.pc\n  DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)\n\n## Versioning\n\nset_target_properties(libssh2 PROPERTIES\n  SOVERSION 1\n  VERSION 1.0.1)\n\ninclude(CMakePackageConfigHelpers)\nwrite_basic_package_version_file(\n  ${CMAKE_CURRENT_BINARY_DIR}/Libssh2ConfigVersion.cmake\n  VERSION \"${LIBSSH2_VERSION_MAJOR}.${LIBSSH2_VERSION_MINOR}.${LIBSSH2_VERSION_PATCH}\"\n  COMPATIBILITY SameMajorVersion)\ninstall(\n  FILES ${CMAKE_CURRENT_BINARY_DIR}/Libssh2ConfigVersion.cmake\n  DESTINATION lib/cmake/libssh2)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/Makefile.am",
    "content": "# $Id: Makefile.am,v 1.21 2009/05/07 17:21:56 bagder Exp $\nAUTOMAKE_OPTIONS = foreign nostdinc\n\n# Get the CRYPTO_CSOURCES, CRYPTO_HHEADERS and CRYPTO_LTLIBS defines\nif OPENSSL\ninclude ../Makefile.OpenSSL.inc\nendif\nif LIBGCRYPT\ninclude ../Makefile.libgcrypt.inc\nendif\nif WINCNG\ninclude ../Makefile.WinCNG.inc\nendif\nif MBEDTLS\ninclude ../Makefile.mbedTLS.inc\nendif\n\n# Makefile.inc provides the CSOURCES and HHEADERS defines\ninclude ../Makefile.inc\n\nlibssh2_la_SOURCES = $(CSOURCES) $(HHEADERS)\n\nEXTRA_DIST = libssh2_config.h.in libssh2_config_cmake.h.in libssh2.pc.in\nEXTRA_DIST += CMakeLists.txt NMakefile\n\nlib_LTLIBRARIES = libssh2.la\n\n# srcdir/include for the shipped headers\n# builddir/src for the generated config header when building out of the source\n# tree\nAM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/src\n\nVERSION=-version-info 1:1:0\n\n# This flag accepts an argument of the form current[:revision[:age]]. So,\n# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to\n# 1.\n#\n# If either revision or age are omitted, they default to 0. Also note that age\n# must be less than or equal to the current interface number.\n#\n# Here are a set of rules to help you update your library version information:\n#\n# 1.Start with version information of 0:0:0 for each libtool library.\n#\n# 2.Update the version information only immediately before a public release of\n# your software. More frequent updates are unnecessary, and only guarantee\n# that the current interface number gets larger faster.\n#\n# 3.If the library source code has changed at all since the last update, then\n# increment revision (c:r+1:a)\n#\n# 4.If any interfaces have been added, removed, or changed since the last\n# update, increment current, and set revision to 0. (c+1:r=0:a)\n#\n# 5.If any interfaces have been added since the last public release, then\n# increment age. (c:r:a+1)\n#\n# 6.If any interfaces have been removed since the last public release, then\n# set age to 0. (c:r:a=0)\n#\n\nlibssh2_la_LDFLAGS = $(VERSION) -no-undefined \\\n\t-export-symbols-regex '^libssh2_.*' \\\n\t$(CRYPTO_LTLIBS) $(LTLIBZ)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/NMakefile",
    "content": "!include \"win32/config.mk\"\n\n!include \"win32/objects.mk\"\n\nCFLAGS=$(CFLAGS)\n\nAR = lib\nARFLAGS = -nologo /LTCG\n\nRESOURCE=$(INTDIR)\\libssh2.res\nDLL=libssh2$(SUFFIX).dll\nSTATICLIB=$(INTDIR)\\libssh2.lib\n\n!if \"$(BUILD_STATIC_LIB)\" == \"\"\nall: $(DLL)\n!else\nall: $(STATICLIB)\n!endif\n\n$(DLL): $(OBJECTS) $(RESOURCE)\n\t$(CC) -o $(DLL) $(DLLFLAGS) $(OBJECTS) $(RESOURCE) $(LIBS)\n\n$(STATICLIB): $(OBJECTS)\n\t$(AR) $(ARFLAGS) -out:$@ $(OBJECTS)\n\n$(RESOURCE): win32\\libssh2.rc\n\t$(RC) $(RCFLAGS) /Fo\"$@\" $?\n\n!include \"win32/rules.mk\"\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/agent.c",
    "content": "/*\n * Copyright (c) 2009 by Daiki Ueno\n * Copyright (C) 2010-2014 by Daniel Stenberg\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include \"misc.h\"\n#include <errno.h>\n#ifdef HAVE_SYS_UN_H\n#include <sys/un.h>\n#else\n/* Use the existence of sys/un.h as a test if Unix domain socket is\n   supported.  winsock*.h define PF_UNIX/AF_UNIX but do not actually\n   support them. */\n#undef PF_UNIX\n#endif\n#include \"userauth.h\"\n#include \"session.h\"\n\n/* Requests from client to agent for protocol 1 key operations */\n#define SSH_AGENTC_REQUEST_RSA_IDENTITIES 1\n#define SSH_AGENTC_RSA_CHALLENGE 3\n#define SSH_AGENTC_ADD_RSA_IDENTITY 7\n#define SSH_AGENTC_REMOVE_RSA_IDENTITY 8\n#define SSH_AGENTC_REMOVE_ALL_RSA_IDENTITIES 9\n#define SSH_AGENTC_ADD_RSA_ID_CONSTRAINED 24\n\n/* Requests from client to agent for protocol 2 key operations */\n#define SSH2_AGENTC_REQUEST_IDENTITIES 11\n#define SSH2_AGENTC_SIGN_REQUEST 13\n#define SSH2_AGENTC_ADD_IDENTITY 17\n#define SSH2_AGENTC_REMOVE_IDENTITY 18\n#define SSH2_AGENTC_REMOVE_ALL_IDENTITIES 19\n#define SSH2_AGENTC_ADD_ID_CONSTRAINED 25\n\n/* Key-type independent requests from client to agent */\n#define SSH_AGENTC_ADD_SMARTCARD_KEY 20\n#define SSH_AGENTC_REMOVE_SMARTCARD_KEY 21\n#define SSH_AGENTC_LOCK 22\n#define SSH_AGENTC_UNLOCK 23\n#define SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED 26\n\n/* Generic replies from agent to client */\n#define SSH_AGENT_FAILURE 5\n#define SSH_AGENT_SUCCESS 6\n\n/* Replies from agent to client for protocol 1 key operations */\n#define SSH_AGENT_RSA_IDENTITIES_ANSWER 2\n#define SSH_AGENT_RSA_RESPONSE 4\n\n/* Replies from agent to client for protocol 2 key operations */\n#define SSH2_AGENT_IDENTITIES_ANSWER 12\n#define SSH2_AGENT_SIGN_RESPONSE 14\n\n/* Key constraint identifiers */\n#define SSH_AGENT_CONSTRAIN_LIFETIME 1\n#define SSH_AGENT_CONSTRAIN_CONFIRM 2\n\n/* non-blocking mode on agent connection is not yet implemented, but\n   for future use. */\ntypedef enum {\n    agent_NB_state_init = 0,\n    agent_NB_state_request_created,\n    agent_NB_state_request_length_sent,\n    agent_NB_state_request_sent,\n    agent_NB_state_response_length_received,\n    agent_NB_state_response_received\n} agent_nonblocking_states;\n\ntypedef struct agent_transaction_ctx {\n    unsigned char *request;\n    size_t request_len;\n    unsigned char *response;\n    size_t response_len;\n    agent_nonblocking_states state;\n} *agent_transaction_ctx_t;\n\ntypedef int (*agent_connect_func)(LIBSSH2_AGENT *agent);\ntypedef int (*agent_transact_func)(LIBSSH2_AGENT *agent,\n                                   agent_transaction_ctx_t transctx);\ntypedef int (*agent_disconnect_func)(LIBSSH2_AGENT *agent);\n\nstruct agent_publickey {\n    struct list_node node;\n\n    /* this is the struct we expose externally */\n    struct libssh2_agent_publickey external;\n};\n\nstruct agent_ops {\n    agent_connect_func connect;\n    agent_transact_func transact;\n    agent_disconnect_func disconnect;\n};\n\nstruct _LIBSSH2_AGENT\n{\n    LIBSSH2_SESSION *session;  /* the session this \"belongs to\" */\n\n    libssh2_socket_t fd;\n\n    struct agent_ops *ops;\n\n    struct agent_transaction_ctx transctx;\n    struct agent_publickey *identity;\n    struct list_head head;              /* list of public keys */\n\n    char *identity_agent_path; /* Path to a custom identity agent socket */\n};\n\n#ifdef PF_UNIX\nstatic int\nagent_connect_unix(LIBSSH2_AGENT *agent)\n{\n    const char *path;\n    struct sockaddr_un s_un;\n\n    path = agent->identity_agent_path;\n    if(!path) {\n        path = getenv(\"SSH_AUTH_SOCK\");\n        if(!path)\n            return _libssh2_error(agent->session, LIBSSH2_ERROR_BAD_USE,\n                                  \"no auth sock variable\");\n    }\n\n    agent->fd = socket(PF_UNIX, SOCK_STREAM, 0);\n    if(agent->fd < 0)\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_BAD_SOCKET,\n                              \"failed creating socket\");\n\n    s_un.sun_family = AF_UNIX;\n    strncpy(s_un.sun_path, path, sizeof s_un.sun_path);\n    s_un.sun_path[sizeof(s_un.sun_path)-1] = 0; /* make sure there's a trailing\n                                                   zero */\n    if(connect(agent->fd, (struct sockaddr*)(&s_un), sizeof s_un) != 0) {\n        close(agent->fd);\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL,\n                              \"failed connecting with agent\");\n    }\n\n    return LIBSSH2_ERROR_NONE;\n}\n\nstatic int\nagent_transact_unix(LIBSSH2_AGENT *agent, agent_transaction_ctx_t transctx)\n{\n    unsigned char buf[4];\n    int rc;\n\n    /* Send the length of the request */\n    if(transctx->state == agent_NB_state_request_created) {\n        _libssh2_htonu32(buf, transctx->request_len);\n        rc = LIBSSH2_SEND_FD(agent->session, agent->fd, buf, sizeof buf, 0);\n        if(rc == -EAGAIN)\n            return LIBSSH2_ERROR_EAGAIN;\n        else if(rc < 0)\n            return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"agent send failed\");\n        transctx->state = agent_NB_state_request_length_sent;\n    }\n\n    /* Send the request body */\n    if(transctx->state == agent_NB_state_request_length_sent) {\n        rc = LIBSSH2_SEND_FD(agent->session, agent->fd, transctx->request,\n                           transctx->request_len, 0);\n        if(rc == -EAGAIN)\n            return LIBSSH2_ERROR_EAGAIN;\n        else if(rc < 0)\n            return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"agent send failed\");\n        transctx->state = agent_NB_state_request_sent;\n    }\n\n    /* Receive the length of a response */\n    if(transctx->state == agent_NB_state_request_sent) {\n        rc = LIBSSH2_RECV_FD(agent->session, agent->fd, buf, sizeof buf, 0);\n        if(rc < 0) {\n            if(rc == -EAGAIN)\n                return LIBSSH2_ERROR_EAGAIN;\n            return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_RECV,\n                                  \"agent recv failed\");\n        }\n        transctx->response_len = _libssh2_ntohu32(buf);\n        transctx->response = LIBSSH2_ALLOC(agent->session,\n                                           transctx->response_len);\n        if(!transctx->response)\n            return LIBSSH2_ERROR_ALLOC;\n\n        transctx->state = agent_NB_state_response_length_received;\n    }\n\n    /* Receive the response body */\n    if(transctx->state == agent_NB_state_response_length_received) {\n        rc = LIBSSH2_RECV_FD(agent->session, agent->fd, transctx->response,\n                           transctx->response_len, 0);\n        if(rc < 0) {\n            if(rc == -EAGAIN)\n                return LIBSSH2_ERROR_EAGAIN;\n            return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"agent recv failed\");\n        }\n        transctx->state = agent_NB_state_response_received;\n    }\n\n    return 0;\n}\n\nstatic int\nagent_disconnect_unix(LIBSSH2_AGENT *agent)\n{\n    int ret;\n    ret = close(agent->fd);\n    if(ret != -1)\n        agent->fd = LIBSSH2_INVALID_SOCKET;\n    else\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_DISCONNECT,\n                              \"failed closing the agent socket\");\n    return LIBSSH2_ERROR_NONE;\n}\n\nstruct agent_ops agent_ops_unix = {\n    agent_connect_unix,\n    agent_transact_unix,\n    agent_disconnect_unix\n};\n#endif  /* PF_UNIX */\n\n#ifdef WIN32\n/* Code to talk to Pageant was taken from PuTTY.\n *\n * Portions copyright Robert de Bath, Joris van Rantwijk, Delian\n * Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas\n * Barry, Justin Bradford, Ben Harris, Malcolm Smith, Ahmad Khalifa,\n * Markus Kuhn, Colin Watson, and CORE SDI S.A.\n */\n#define PAGEANT_COPYDATA_ID 0x804e50ba   /* random goop */\n#define PAGEANT_MAX_MSGLEN  8192\n\nstatic int\nagent_connect_pageant(LIBSSH2_AGENT *agent)\n{\n    HWND hwnd;\n    hwnd = FindWindow(\"Pageant\", \"Pageant\");\n    if(!hwnd)\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL,\n                              \"failed connecting agent\");\n    agent->fd = 0;         /* Mark as the connection has been established */\n    return LIBSSH2_ERROR_NONE;\n}\n\nstatic int\nagent_transact_pageant(LIBSSH2_AGENT *agent, agent_transaction_ctx_t transctx)\n{\n    HWND hwnd;\n    char mapname[23];\n    HANDLE filemap;\n    unsigned char *p;\n    unsigned char *p2;\n    int id;\n    COPYDATASTRUCT cds;\n\n    if(!transctx || 4 + transctx->request_len > PAGEANT_MAX_MSGLEN)\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_INVAL,\n                              \"illegal input\");\n\n    hwnd = FindWindow(\"Pageant\", \"Pageant\");\n    if(!hwnd)\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL,\n                              \"found no pageant\");\n\n    snprintf(mapname, sizeof(mapname),\n             \"PageantRequest%08x%c\", (unsigned)GetCurrentThreadId(), '\\0');\n    filemap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,\n                                0, PAGEANT_MAX_MSGLEN, mapname);\n\n    if(filemap == NULL || filemap == INVALID_HANDLE_VALUE)\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL,\n                              \"failed setting up pageant filemap\");\n\n    p2 = p = MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, 0);\n    if(p == NULL || p2 == NULL) {\n        CloseHandle(filemap);\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL,\n                              \"failed to open pageant filemap for writing\");\n    }\n\n    _libssh2_store_str(&p2, (const char *)transctx->request,\n                       transctx->request_len);\n\n    cds.dwData = PAGEANT_COPYDATA_ID;\n    cds.cbData = 1 + strlen(mapname);\n    cds.lpData = mapname;\n\n    id = SendMessage(hwnd, WM_COPYDATA, (WPARAM) NULL, (LPARAM) &cds);\n    if(id > 0) {\n        transctx->response_len = _libssh2_ntohu32(p);\n        if(transctx->response_len > PAGEANT_MAX_MSGLEN) {\n            UnmapViewOfFile(p);\n            CloseHandle(filemap);\n            return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL,\n                                  \"agent setup fail\");\n        }\n        transctx->response = LIBSSH2_ALLOC(agent->session,\n                                           transctx->response_len);\n        if(!transctx->response) {\n            UnmapViewOfFile(p);\n            CloseHandle(filemap);\n            return _libssh2_error(agent->session, LIBSSH2_ERROR_ALLOC,\n                                  \"agent malloc\");\n        }\n        memcpy(transctx->response, p + 4, transctx->response_len);\n    }\n\n    UnmapViewOfFile(p);\n    CloseHandle(filemap);\n    return 0;\n}\n\nstatic int\nagent_disconnect_pageant(LIBSSH2_AGENT *agent)\n{\n    agent->fd = LIBSSH2_INVALID_SOCKET;\n    return 0;\n}\n\nstruct agent_ops agent_ops_pageant = {\n    agent_connect_pageant,\n    agent_transact_pageant,\n    agent_disconnect_pageant\n};\n#endif  /* WIN32 */\n\nstatic struct {\n    const char *name;\n    struct agent_ops *ops;\n} supported_backends[] = {\n#ifdef WIN32\n    {\"Pageant\", &agent_ops_pageant},\n#endif  /* WIN32 */\n#ifdef PF_UNIX\n    {\"Unix\", &agent_ops_unix},\n#endif  /* PF_UNIX */\n    {NULL, NULL}\n};\n\nstatic int\nagent_sign(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len,\n           const unsigned char *data, size_t data_len, void **abstract)\n{\n    LIBSSH2_AGENT *agent = (LIBSSH2_AGENT *) (*abstract);\n    agent_transaction_ctx_t transctx = &agent->transctx;\n    struct agent_publickey *identity = agent->identity;\n    ssize_t len = 1 + 4 + identity->external.blob_len + 4 + data_len + 4;\n    ssize_t method_len;\n    unsigned char *s;\n    int rc;\n\n    /* Create a request to sign the data */\n    if(transctx->state == agent_NB_state_init) {\n        s = transctx->request = LIBSSH2_ALLOC(session, len);\n        if(!transctx->request)\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"out of memory\");\n\n        *s++ = SSH2_AGENTC_SIGN_REQUEST;\n        /* key blob */\n        _libssh2_store_str(&s, (const char *)identity->external.blob,\n                           identity->external.blob_len);\n        /* data */\n        _libssh2_store_str(&s, (const char *)data, data_len);\n\n        /* flags */\n        _libssh2_store_u32(&s, 0);\n\n        transctx->request_len = s - transctx->request;\n        transctx->state = agent_NB_state_request_created;\n    }\n\n    /* Make sure to be re-called as a result of EAGAIN. */\n    if(*transctx->request != SSH2_AGENTC_SIGN_REQUEST)\n        return _libssh2_error(session, LIBSSH2_ERROR_BAD_USE,\n                              \"illegal request\");\n\n    if(!agent->ops)\n        /* if no agent has been connected, bail out */\n        return _libssh2_error(session, LIBSSH2_ERROR_BAD_USE,\n                              \"agent not connected\");\n\n    rc = agent->ops->transact(agent, transctx);\n    if(rc) {\n        goto error;\n    }\n    LIBSSH2_FREE(session, transctx->request);\n    transctx->request = NULL;\n\n    len = transctx->response_len;\n    s = transctx->response;\n    len--;\n    if(len < 0) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    if(*s != SSH2_AGENT_SIGN_RESPONSE) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    s++;\n\n    /* Skip the entire length of the signature */\n    len -= 4;\n    if(len < 0) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    s += 4;\n\n    /* Skip signing method */\n    len -= 4;\n    if(len < 0) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    method_len = _libssh2_ntohu32(s);\n    s += 4;\n    len -= method_len;\n    if(len < 0) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    s += method_len;\n\n    /* Read the signature */\n    len -= 4;\n    if(len < 0) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    *sig_len = _libssh2_ntohu32(s);\n    s += 4;\n    len -= *sig_len;\n    if(len < 0) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n\n    *sig = LIBSSH2_ALLOC(session, *sig_len);\n    if(!*sig) {\n        rc = LIBSSH2_ERROR_ALLOC;\n        goto error;\n    }\n    memcpy(*sig, s, *sig_len);\n\n  error:\n    LIBSSH2_FREE(session, transctx->request);\n    transctx->request = NULL;\n\n    LIBSSH2_FREE(session, transctx->response);\n    transctx->response = NULL;\n\n    return _libssh2_error(session, rc, \"agent sign failure\");\n}\n\nstatic int\nagent_list_identities(LIBSSH2_AGENT *agent)\n{\n    agent_transaction_ctx_t transctx = &agent->transctx;\n    ssize_t len, num_identities;\n    unsigned char *s;\n    int rc;\n    unsigned char c = SSH2_AGENTC_REQUEST_IDENTITIES;\n\n    /* Create a request to list identities */\n    if(transctx->state == agent_NB_state_init) {\n        transctx->request = &c;\n        transctx->request_len = 1;\n        transctx->state = agent_NB_state_request_created;\n    }\n\n    /* Make sure to be re-called as a result of EAGAIN. */\n    if(*transctx->request != SSH2_AGENTC_REQUEST_IDENTITIES)\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_BAD_USE,\n                              \"illegal agent request\");\n\n    if(!agent->ops)\n        /* if no agent has been connected, bail out */\n        return _libssh2_error(agent->session, LIBSSH2_ERROR_BAD_USE,\n                              \"agent not connected\");\n\n    rc = agent->ops->transact(agent, transctx);\n    if(rc) {\n        goto error;\n    }\n    transctx->request = NULL;\n\n    len = transctx->response_len;\n    s = transctx->response;\n    len--;\n    if(len < 0) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    if(*s != SSH2_AGENT_IDENTITIES_ANSWER) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    s++;\n\n    /* Read the length of identities */\n    len -= 4;\n    if(len < 0) {\n        rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n        goto error;\n    }\n    num_identities = _libssh2_ntohu32(s);\n    s += 4;\n\n    while(num_identities--) {\n        struct agent_publickey *identity;\n        ssize_t comment_len;\n\n        /* Read the length of the blob */\n        len -= 4;\n        if(len < 0) {\n            rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n            goto error;\n        }\n        identity = LIBSSH2_ALLOC(agent->session, sizeof *identity);\n        if(!identity) {\n            rc = LIBSSH2_ERROR_ALLOC;\n            goto error;\n        }\n        identity->external.blob_len = _libssh2_ntohu32(s);\n        s += 4;\n\n        /* Read the blob */\n        len -= identity->external.blob_len;\n        if(len < 0) {\n            rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n            LIBSSH2_FREE(agent->session, identity);\n            goto error;\n        }\n\n        identity->external.blob = LIBSSH2_ALLOC(agent->session,\n                                                identity->external.blob_len);\n        if(!identity->external.blob) {\n            rc = LIBSSH2_ERROR_ALLOC;\n            LIBSSH2_FREE(agent->session, identity);\n            goto error;\n        }\n        memcpy(identity->external.blob, s, identity->external.blob_len);\n        s += identity->external.blob_len;\n\n        /* Read the length of the comment */\n        len -= 4;\n        if(len < 0) {\n            rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n            LIBSSH2_FREE(agent->session, identity->external.blob);\n            LIBSSH2_FREE(agent->session, identity);\n            goto error;\n        }\n        comment_len = _libssh2_ntohu32(s);\n        s += 4;\n\n        /* Read the comment */\n        len -= comment_len;\n        if(len < 0) {\n            rc = LIBSSH2_ERROR_AGENT_PROTOCOL;\n            LIBSSH2_FREE(agent->session, identity->external.blob);\n            LIBSSH2_FREE(agent->session, identity);\n            goto error;\n        }\n\n        identity->external.comment = LIBSSH2_ALLOC(agent->session,\n                                                   comment_len + 1);\n        if(!identity->external.comment) {\n            rc = LIBSSH2_ERROR_ALLOC;\n            LIBSSH2_FREE(agent->session, identity->external.blob);\n            LIBSSH2_FREE(agent->session, identity);\n            goto error;\n        }\n        identity->external.comment[comment_len] = '\\0';\n        memcpy(identity->external.comment, s, comment_len);\n        s += comment_len;\n\n        _libssh2_list_add(&agent->head, &identity->node);\n    }\n error:\n    LIBSSH2_FREE(agent->session, transctx->response);\n    transctx->response = NULL;\n\n    return _libssh2_error(agent->session, rc,\n                          \"agent list id failed\");\n}\n\nstatic void\nagent_free_identities(LIBSSH2_AGENT *agent)\n{\n    struct agent_publickey *node;\n    struct agent_publickey *next;\n\n    for(node = _libssh2_list_first(&agent->head); node; node = next) {\n        next = _libssh2_list_next(&node->node);\n        LIBSSH2_FREE(agent->session, node->external.blob);\n        LIBSSH2_FREE(agent->session, node->external.comment);\n        LIBSSH2_FREE(agent->session, node);\n    }\n    _libssh2_list_init(&agent->head);\n}\n\n#define AGENT_PUBLICKEY_MAGIC 0x3bdefed2\n/*\n * agent_publickey_to_external()\n *\n * Copies data from the internal to the external representation struct.\n *\n */\nstatic struct libssh2_agent_publickey *\nagent_publickey_to_external(struct agent_publickey *node)\n{\n    struct libssh2_agent_publickey *ext = &node->external;\n\n    ext->magic = AGENT_PUBLICKEY_MAGIC;\n    ext->node = node;\n\n    return ext;\n}\n\n/*\n * libssh2_agent_init\n *\n * Init an ssh-agent handle. Returns the pointer to the handle.\n *\n */\nLIBSSH2_API LIBSSH2_AGENT *\nlibssh2_agent_init(LIBSSH2_SESSION *session)\n{\n    LIBSSH2_AGENT *agent;\n\n    agent = LIBSSH2_CALLOC(session, sizeof *agent);\n    if(!agent) {\n        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                       \"Unable to allocate space for agent connection\");\n        return NULL;\n    }\n    agent->fd = LIBSSH2_INVALID_SOCKET;\n    agent->session = session;\n    agent->identity_agent_path = NULL;\n    _libssh2_list_init(&agent->head);\n\n    return agent;\n}\n\n/*\n * libssh2_agent_connect()\n *\n * Connect to an ssh-agent.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_connect(LIBSSH2_AGENT *agent)\n{\n    int i, rc = -1;\n    for(i = 0; supported_backends[i].name; i++) {\n        agent->ops = supported_backends[i].ops;\n        rc = (agent->ops->connect)(agent);\n        if(!rc)\n            return 0;\n    }\n    return rc;\n}\n\n/*\n * libssh2_agent_list_identities()\n *\n * Request ssh-agent to list identities.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_list_identities(LIBSSH2_AGENT *agent)\n{\n    memset(&agent->transctx, 0, sizeof agent->transctx);\n    /* Abandon the last fetched identities */\n    agent_free_identities(agent);\n    return agent_list_identities(agent);\n}\n\n/*\n * libssh2_agent_get_identity()\n *\n * Traverse the internal list of public keys. Pass NULL to 'prev' to get\n * the first one. Or pass a pointer to the previously returned one to get the\n * next.\n *\n * Returns:\n * 0 if a fine public key was stored in 'store'\n * 1 if end of public keys\n * [negative] on errors\n */\nLIBSSH2_API int\nlibssh2_agent_get_identity(LIBSSH2_AGENT *agent,\n                           struct libssh2_agent_publickey **ext,\n                           struct libssh2_agent_publickey *oprev)\n{\n    struct agent_publickey *node;\n    if(oprev && oprev->node) {\n        /* we have a starting point */\n        struct agent_publickey *prev = oprev->node;\n\n        /* get the next node in the list */\n        node = _libssh2_list_next(&prev->node);\n    }\n    else\n        node = _libssh2_list_first(&agent->head);\n\n    if(!node)\n        /* no (more) node */\n        return 1;\n\n    *ext = agent_publickey_to_external(node);\n\n    return 0;\n}\n\n/*\n * libssh2_agent_userauth()\n *\n * Do publickey user authentication with the help of ssh-agent.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_userauth(LIBSSH2_AGENT *agent,\n                       const char *username,\n                       struct libssh2_agent_publickey *identity)\n{\n    void *abstract = agent;\n    int rc;\n\n    if(agent->session->userauth_pblc_state == libssh2_NB_state_idle) {\n        memset(&agent->transctx, 0, sizeof agent->transctx);\n        agent->identity = identity->node;\n    }\n\n    BLOCK_ADJUST(rc, agent->session,\n                 _libssh2_userauth_publickey(agent->session, username,\n                                             strlen(username),\n                                             identity->blob,\n                                             identity->blob_len,\n                                             agent_sign,\n                                             &abstract));\n    return rc;\n}\n\n/*\n * libssh2_agent_disconnect()\n *\n * Close a connection to an ssh-agent.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_disconnect(LIBSSH2_AGENT *agent)\n{\n    if(agent->ops && agent->fd != LIBSSH2_INVALID_SOCKET)\n        return agent->ops->disconnect(agent);\n    return 0;\n}\n\n/*\n * libssh2_agent_free()\n *\n * Free an ssh-agent handle.  This function also frees the internal\n * collection of public keys.\n */\nLIBSSH2_API void\nlibssh2_agent_free(LIBSSH2_AGENT *agent)\n{\n    /* Allow connection freeing when the socket has lost its connection */\n    if(agent->fd != LIBSSH2_INVALID_SOCKET) {\n        libssh2_agent_disconnect(agent);\n    }\n\n    if(agent->identity_agent_path != NULL)\n        LIBSSH2_FREE(agent->session, agent->identity_agent_path);\n\n    agent_free_identities(agent);\n    LIBSSH2_FREE(agent->session, agent);\n}\n\n/*\n * libssh2_agent_set_identity_path()\n *\n * Allows a custom agent socket path beyond SSH_AUTH_SOCK env\n *\n */\nLIBSSH2_API void\nlibssh2_agent_set_identity_path(LIBSSH2_AGENT *agent, const char *path)\n{\n    if(agent->identity_agent_path) {\n        LIBSSH2_FREE(agent->session, agent->identity_agent_path);\n        agent->identity_agent_path = NULL;\n    }\n\n    if(path) {\n        size_t path_len = strlen(path);\n        if(path_len < SIZE_MAX - 1) {\n            char *path_buf = LIBSSH2_ALLOC(agent->session, path_len + 1);\n            memcpy(path_buf, path, path_len);\n            path_buf[path_len] = '\\0';\n            agent->identity_agent_path = path_buf;\n        }\n    }\n}\n\n/*\n * libssh2_agent_get_identity_path()\n *\n * Returns the custom agent socket path if set\n *\n */\nLIBSSH2_API const char *libssh2_agent_get_identity_path(LIBSSH2_AGENT *agent)\n{\n    return agent->identity_agent_path;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/bcrypt_pbkdf.c",
    "content": "/* $OpenBSD: bcrypt_pbkdf.c,v 1.4 2013/07/29 00:55:53 tedu Exp $ */\n/*\n * Copyright (c) 2013 Ted Unangst <tedu@openbsd.org>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n\n#ifndef HAVE_BCRYPT_PBKDF\n\n#include \"libssh2_priv.h\"\n#include <stdlib.h>\n#include <sys/types.h>\n#ifdef HAVE_SYS_PARAM_H\n#include <sys/param.h>\n#endif\n\n#include \"blf.h\"\n\n#define MINIMUM(a,b) (((a) < (b)) ? (a) : (b))\n\n/*\n * pkcs #5 pbkdf2 implementation using the \"bcrypt\" hash\n *\n * The bcrypt hash function is derived from the bcrypt password hashing\n * function with the following modifications:\n * 1. The input password and salt are preprocessed with SHA512.\n * 2. The output length is expanded to 256 bits.\n * 3. Subsequently the magic string to be encrypted is lengthened and modifed\n *    to \"OxychromaticBlowfishSwatDynamite\"\n * 4. The hash function is defined to perform 64 rounds of initial state\n *    expansion. (More rounds are performed by iterating the hash.)\n *\n * Note that this implementation pulls the SHA512 operations into the caller\n * as a performance optimization.\n *\n * One modification from official pbkdf2. Instead of outputting key material\n * linearly, we mix it. pbkdf2 has a known weakness where if one uses it to\n * generate (i.e.) 512 bits of key material for use as two 256 bit keys, an\n * attacker can merely run once through the outer loop below, but the user\n * always runs it twice. Shuffling output bytes requires computing the\n * entirety of the key material to assemble any subkey. This is something a\n * wise caller could do; we just do it for you.\n */\n\n#define BCRYPT_BLOCKS 8\n#define BCRYPT_HASHSIZE (BCRYPT_BLOCKS * 4)\n\nstatic void\nbcrypt_hash(uint8_t *sha2pass, uint8_t *sha2salt, uint8_t *out)\n{\n    blf_ctx state;\n    uint8_t ciphertext[BCRYPT_HASHSIZE] =\n        \"OxychromaticBlowfishSwatDynamite\";\n    uint32_t cdata[BCRYPT_BLOCKS];\n    int i;\n    uint16_t j;\n    size_t shalen = SHA512_DIGEST_LENGTH;\n\n    /* key expansion */\n    Blowfish_initstate(&state);\n    Blowfish_expandstate(&state, sha2salt, shalen, sha2pass, shalen);\n    for(i = 0; i < 64; i++) {\n        Blowfish_expand0state(&state, sha2salt, shalen);\n        Blowfish_expand0state(&state, sha2pass, shalen);\n    }\n\n    /* encryption */\n    j = 0;\n    for(i = 0; i < BCRYPT_BLOCKS; i++)\n        cdata[i] = Blowfish_stream2word(ciphertext, sizeof(ciphertext),\n                                        &j);\n    for(i = 0; i < 64; i++)\n        blf_enc(&state, cdata, sizeof(cdata) / sizeof(uint64_t));\n\n    /* copy out */\n    for(i = 0; i < BCRYPT_BLOCKS; i++) {\n        out[4 * i + 3] = (cdata[i] >> 24) & 0xff;\n        out[4 * i + 2] = (cdata[i] >> 16) & 0xff;\n        out[4 * i + 1] = (cdata[i] >> 8) & 0xff;\n        out[4 * i + 0] = cdata[i] & 0xff;\n    }\n\n    /* zap */\n    _libssh2_explicit_zero(ciphertext, sizeof(ciphertext));\n    _libssh2_explicit_zero(cdata, sizeof(cdata));\n    _libssh2_explicit_zero(&state, sizeof(state));\n}\n\nint\nbcrypt_pbkdf(const char *pass, size_t passlen, const uint8_t *salt,\n             size_t saltlen,\n             uint8_t *key, size_t keylen, unsigned int rounds)\n{\n    uint8_t sha2pass[SHA512_DIGEST_LENGTH];\n    uint8_t sha2salt[SHA512_DIGEST_LENGTH];\n    uint8_t out[BCRYPT_HASHSIZE];\n    uint8_t tmpout[BCRYPT_HASHSIZE];\n    uint8_t *countsalt;\n    size_t i, j, amt, stride;\n    uint32_t count;\n    size_t origkeylen = keylen;\n    libssh2_sha512_ctx ctx;\n\n    /* nothing crazy */\n    if(rounds < 1)\n        return -1;\n    if(passlen == 0 || saltlen == 0 || keylen == 0 ||\n       keylen > sizeof(out) * sizeof(out) || saltlen > 1<<20)\n        return -1;\n    countsalt = calloc(1, saltlen + 4);\n    if(countsalt == NULL)\n        return -1;\n    stride = (keylen + sizeof(out) - 1) / sizeof(out);\n    amt = (keylen + stride - 1) / stride;\n\n    memcpy(countsalt, salt, saltlen);\n\n    /* collapse password */\n    libssh2_sha512_init(&ctx);\n    libssh2_sha512_update(ctx, pass, passlen);\n    libssh2_sha512_final(ctx, sha2pass);\n\n    /* generate key, sizeof(out) at a time */\n    for(count = 1; keylen > 0; count++) {\n        countsalt[saltlen + 0] = (count >> 24) & 0xff;\n        countsalt[saltlen + 1] = (count >> 16) & 0xff;\n        countsalt[saltlen + 2] = (count >> 8) & 0xff;\n        countsalt[saltlen + 3] = count & 0xff;\n\n        /* first round, salt is salt */\n        libssh2_sha512_init(&ctx);\n        libssh2_sha512_update(ctx, countsalt, saltlen + 4);\n        libssh2_sha512_final(ctx, sha2salt);\n\n        bcrypt_hash(sha2pass, sha2salt, tmpout);\n        memcpy(out, tmpout, sizeof(out));\n\n        for(i = 1; i < rounds; i++) {\n            /* subsequent rounds, salt is previous output */\n            libssh2_sha512_init(&ctx);\n            libssh2_sha512_update(ctx, tmpout, sizeof(tmpout));\n            libssh2_sha512_final(ctx, sha2salt);\n\n            bcrypt_hash(sha2pass, sha2salt, tmpout);\n            for(j = 0; j < sizeof(out); j++)\n                out[j] ^= tmpout[j];\n        }\n\n        /*\n         * pbkdf2 deviation: ouput the key material non-linearly.\n         */\n        amt = MINIMUM(amt, keylen);\n        for(i = 0; i < amt; i++) {\n            size_t dest = i * stride + (count - 1);\n            if(dest >= origkeylen) {\n                break;\n            }\n            key[dest] = out[i];\n        }\n        keylen -= i;\n    }\n\n    /* zap */\n    _libssh2_explicit_zero(out, sizeof(out));\n    free(countsalt);\n\n    return 0;\n}\n#endif /* HAVE_BCRYPT_PBKDF */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/blf.h",
    "content": "/* $OpenBSD: blf.h,v 1.7 2007/03/14 17:59:41 grunk Exp $ */\n/*\n * Blowfish - a fast block cipher designed by Bruce Schneier\n *\n * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. All advertising materials mentioning features or use of this software\n *    must display the following acknowledgement:\n *      This product includes software developed by Niels Provos.\n * 4. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef _BLF_H_\n#define _BLF_H_\n\n#if !defined(HAVE_BCRYPT_PBKDF) && !defined(HAVE_BLH_H)\n\n/* Schneier specifies a maximum key length of 56 bytes.\n * This ensures that every key bit affects every cipher\n * bit.  However, the subkeys can hold up to 72 bytes.\n * Warning: For normal blowfish encryption only 56 bytes\n * of the key affect all cipherbits.\n */\n\n#define BLF_N   16                      /* Number of Subkeys */\n#define BLF_MAXKEYLEN ((BLF_N-2)*4)     /* 448 bits */\n#define BLF_MAXUTILIZED ((BLF_N + 2)*4)   /* 576 bits */\n\n/* Blowfish context */\ntypedef struct BlowfishContext {\n        uint32_t S[4][256];     /* S-Boxes */\n        uint32_t P[BLF_N + 2];  /* Subkeys */\n} blf_ctx;\n\n/* Raw access to customized Blowfish\n *      blf_key is just:\n *      Blowfish_initstate( state )\n *      Blowfish_expand0state( state, key, keylen )\n */\n\nvoid Blowfish_encipher(blf_ctx *, uint32_t *, uint32_t *);\nvoid Blowfish_decipher(blf_ctx *, uint32_t *, uint32_t *);\nvoid Blowfish_initstate(blf_ctx *);\nvoid Blowfish_expand0state(blf_ctx *, const uint8_t *, uint16_t);\nvoid Blowfish_expandstate\n(blf_ctx *, const uint8_t *, uint16_t, const uint8_t *, uint16_t);\n\n/* Standard Blowfish */\n\nvoid blf_key(blf_ctx *, const uint8_t *, uint16_t);\nvoid blf_enc(blf_ctx *, uint32_t *, uint16_t);\nvoid blf_dec(blf_ctx *, uint32_t *, uint16_t);\n\nvoid blf_ecb_encrypt(blf_ctx *, uint8_t *, uint32_t);\nvoid blf_ecb_decrypt(blf_ctx *, uint8_t *, uint32_t);\n\nvoid blf_cbc_encrypt(blf_ctx *, uint8_t *, uint8_t *, uint32_t);\nvoid blf_cbc_decrypt(blf_ctx *, uint8_t *, uint8_t *, uint32_t);\n\n/* Converts uint8_t to uint32_t */\nuint32_t Blowfish_stream2word(const uint8_t *, uint16_t, uint16_t *);\n\n/* bcrypt with pbkd */\nint bcrypt_pbkdf(const char *pass, size_t passlen, const uint8_t *salt,\n                 size_t saltlen,\n                 uint8_t *key, size_t keylen, unsigned int rounds);\n\n#endif /* !defined(HAVE_BCRYPT_PBKDF) && !defined(HAVE_BLH_H) */\n#endif /* _BLF_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/blowfish.c",
    "content": "/* $OpenBSD: blowfish.c,v 1.18 2004/11/02 17:23:26 hshoexer Exp $ */\n/*\n * Blowfish block cipher for OpenBSD\n * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>\n * All rights reserved.\n *\n * Implementation advice by David Mazieres <dm@lcs.mit.edu>.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. All advertising materials mentioning features or use of this software\n *    must display the following acknowledgement:\n *      This product includes software developed by Niels Provos.\n * 4. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * This code is derived from section 14.3 and the given source\n * in section V of Applied Cryptography, second edition.\n * Blowfish is an unpatented fast block cipher designed by\n * Bruce Schneier.\n */\n\n\n#if !defined(HAVE_BCRYPT_PBKDF) && (!defined(HAVE_BLOWFISH_INITSTATE) || \\\n                                    !defined(HAVE_BLOWFISH_EXPAND0STATE) || \\\n                                    !defined(HAVE_BLF_ENC))\n\n#if 0\n#include <stdio.h>              /* used for debugging */\n#include <string.h>\n#endif\n\n#include <sys/types.h>\n\n#include \"libssh2.h\"\n#include \"blf.h\"\n\n#undef inline\n#ifdef __GNUC__\n#define inline __inline\n#else                           /* !__GNUC__ */\n#define inline\n#endif                          /* !__GNUC__ */\n\n/* Function for Feistel Networks */\n\n#define F(s, x) ((((s)[        (((x)>>24)&0xFF)]        \\\n                   + (s)[0x100 + (((x)>>16)&0xFF)])     \\\n                  ^ (s)[0x200 + (((x)>> 8)&0xFF)])      \\\n                 + (s)[0x300 + ( (x)     &0xFF)])\n\n#define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n])\n\nvoid\nBlowfish_encipher(blf_ctx *c, uint32_t *xl, uint32_t *xr)\n{\n    uint32_t Xl;\n    uint32_t Xr;\n    uint32_t *s = c->S[0];\n    uint32_t *p = c->P;\n\n    Xl = *xl;\n    Xr = *xr;\n\n    Xl ^= p[0];\n    BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2);\n    BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4);\n    BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6);\n    BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8);\n    BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10);\n    BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12);\n    BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14);\n    BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16);\n\n    *xl = Xr ^ p[17];\n    *xr = Xl;\n}\n\nvoid\nBlowfish_decipher(blf_ctx *c, uint32_t *xl, uint32_t *xr)\n{\n    uint32_t Xl;\n    uint32_t Xr;\n    uint32_t *s = c->S[0];\n    uint32_t *p = c->P;\n\n    Xl = *xl;\n    Xr = *xr;\n\n    Xl ^= p[17];\n    BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15);\n    BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13);\n    BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11);\n    BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9);\n    BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7);\n    BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5);\n    BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3);\n    BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1);\n\n    *xl = Xr ^ p[0];\n    *xr = Xl;\n}\n\nvoid\nBlowfish_initstate(blf_ctx *c)\n{\n    /* P-box and S-box tables initialized with digits of Pi */\n\n    static const blf_ctx initstate =\n        { {\n                {\n                    0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,\n                    0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,\n                    0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,\n                    0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,\n                    0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,\n                    0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,\n                    0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,\n                    0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,\n                    0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,\n                    0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,\n                    0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,\n                    0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,\n                    0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,\n                    0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,\n                    0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,\n                    0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,\n                    0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,\n                    0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,\n                    0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,\n                    0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,\n                    0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,\n                    0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,\n                    0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,\n                    0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,\n                    0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,\n                    0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,\n                    0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,\n                    0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,\n                    0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,\n                    0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,\n                    0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,\n                    0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,\n                    0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,\n                    0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,\n                    0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,\n                    0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,\n                    0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,\n                    0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,\n                    0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,\n                    0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,\n                    0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,\n                    0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,\n                    0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,\n                    0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,\n                    0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,\n                    0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,\n                    0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,\n                    0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,\n                    0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,\n                    0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,\n                    0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,\n                    0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,\n                    0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,\n                    0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,\n                    0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,\n                    0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,\n                    0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,\n                    0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,\n                    0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,\n                    0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,\n                    0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,\n                    0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,\n                    0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,\n                    0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a},\n                {\n                    0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,\n                    0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,\n                    0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,\n                    0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,\n                    0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,\n                    0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,\n                    0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,\n                    0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,\n                    0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,\n                    0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,\n                    0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,\n                    0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,\n                    0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,\n                    0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,\n                    0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,\n                    0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,\n                    0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,\n                    0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,\n                    0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,\n                    0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,\n                    0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,\n                    0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,\n                    0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,\n                    0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,\n                    0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,\n                    0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,\n                    0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,\n                    0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,\n                    0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,\n                    0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,\n                    0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,\n                    0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,\n                    0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,\n                    0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,\n                    0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,\n                    0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,\n                    0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,\n                    0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,\n                    0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,\n                    0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,\n                    0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,\n                    0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,\n                    0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,\n                    0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,\n                    0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,\n                    0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,\n                    0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,\n                    0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,\n                    0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,\n                    0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,\n                    0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,\n                    0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,\n                    0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,\n                    0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,\n                    0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,\n                    0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,\n                    0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,\n                    0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,\n                    0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,\n                    0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,\n                    0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,\n                    0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,\n                    0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,\n                    0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7},\n                {\n                    0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,\n                    0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,\n                    0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,\n                    0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,\n                    0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,\n                    0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,\n                    0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,\n                    0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,\n                    0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,\n                    0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,\n                    0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,\n                    0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,\n                    0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,\n                    0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,\n                    0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,\n                    0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,\n                    0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,\n                    0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,\n                    0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,\n                    0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,\n                    0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,\n                    0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,\n                    0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,\n                    0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,\n                    0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,\n                    0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,\n                    0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,\n                    0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,\n                    0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,\n                    0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,\n                    0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,\n                    0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,\n                    0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,\n                    0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,\n                    0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,\n                    0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,\n                    0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,\n                    0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,\n                    0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,\n                    0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,\n                    0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,\n                    0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,\n                    0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,\n                    0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,\n                    0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,\n                    0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,\n                    0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,\n                    0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,\n                    0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,\n                    0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,\n                    0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,\n                    0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,\n                    0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,\n                    0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,\n                    0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,\n                    0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,\n                    0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,\n                    0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,\n                    0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,\n                    0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,\n                    0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,\n                    0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,\n                    0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,\n                    0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0},\n                {\n                    0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,\n                    0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,\n                    0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,\n                    0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,\n                    0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,\n                    0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,\n                    0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,\n                    0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,\n                    0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,\n                    0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,\n                    0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,\n                    0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,\n                    0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,\n                    0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,\n                    0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,\n                    0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,\n                    0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,\n                    0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,\n                    0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,\n                    0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,\n                    0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,\n                    0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,\n                    0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,\n                    0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,\n                    0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,\n                    0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,\n                    0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,\n                    0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,\n                    0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,\n                    0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,\n                    0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,\n                    0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,\n                    0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,\n                    0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,\n                    0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,\n                    0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,\n                    0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,\n                    0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,\n                    0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,\n                    0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,\n                    0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,\n                    0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,\n                    0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,\n                    0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,\n                    0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,\n                    0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,\n                    0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,\n                    0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,\n                    0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,\n                    0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,\n                    0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,\n                    0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,\n                    0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,\n                    0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,\n                    0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,\n                    0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,\n                    0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,\n                    0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,\n                    0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,\n                    0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,\n                    0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,\n                    0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,\n                    0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,\n                    0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6}\n            },\n          {\n              0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,\n              0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,\n              0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,\n              0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,\n              0x9216d5d9, 0x8979fb1b\n          } };\n\n    *c = initstate;\n}\n\nuint32_t\nBlowfish_stream2word(const uint8_t *data, uint16_t databytes,\n                     uint16_t *current)\n{\n    uint8_t i;\n    uint16_t j;\n    uint32_t temp;\n\n    temp = 0x00000000;\n    j = *current;\n\n    for(i = 0; i < 4; i++, j++) {\n        if(j >= databytes)\n            j = 0;\n        temp = (temp << 8) | data[j];\n    }\n\n    *current = j;\n    return temp;\n}\n\nvoid\nBlowfish_expand0state(blf_ctx *c, const uint8_t *key, uint16_t keybytes)\n{\n    uint16_t i;\n    uint16_t j;\n    uint16_t k;\n    uint32_t temp;\n    uint32_t datal;\n    uint32_t datar;\n\n    j = 0;\n    for(i = 0; i < BLF_N + 2; i++) {\n        /* Extract 4 int8 to 1 int32 from keystream */\n        temp = Blowfish_stream2word(key, keybytes, &j);\n        c->P[i] = c->P[i] ^ temp;\n    }\n\n    j = 0;\n    datal = 0x00000000;\n    datar = 0x00000000;\n    for(i = 0; i < BLF_N + 2; i += 2) {\n        Blowfish_encipher(c, &datal, &datar);\n\n        c->P[i] = datal;\n        c->P[i + 1] = datar;\n    }\n\n    for(i = 0; i < 4; i++) {\n        for(k = 0; k < 256; k += 2) {\n            Blowfish_encipher(c, &datal, &datar);\n\n            c->S[i][k] = datal;\n            c->S[i][k + 1] = datar;\n        }\n    }\n}\n\n\nvoid\nBlowfish_expandstate(blf_ctx *c, const uint8_t *data, uint16_t databytes,\n                     const uint8_t *key, uint16_t keybytes)\n{\n    uint16_t i;\n    uint16_t j;\n    uint16_t k;\n    uint32_t temp;\n    uint32_t datal;\n    uint32_t datar;\n\n    j = 0;\n    for(i = 0; i < BLF_N + 2; i++) {\n        /* Extract 4 int8 to 1 int32 from keystream */\n        temp = Blowfish_stream2word(key, keybytes, &j);\n        c->P[i] = c->P[i] ^ temp;\n    }\n\n    j = 0;\n    datal = 0x00000000;\n    datar = 0x00000000;\n    for(i = 0; i < BLF_N + 2; i += 2) {\n        datal ^= Blowfish_stream2word(data, databytes, &j);\n        datar ^= Blowfish_stream2word(data, databytes, &j);\n        Blowfish_encipher(c, &datal, &datar);\n\n        c->P[i] = datal;\n        c->P[i + 1] = datar;\n    }\n\n    for(i = 0; i < 4; i++) {\n        for(k = 0; k < 256; k += 2) {\n            datal ^= Blowfish_stream2word(data, databytes, &j);\n            datar ^= Blowfish_stream2word(data, databytes, &j);\n            Blowfish_encipher(c, &datal, &datar);\n\n            c->S[i][k] = datal;\n            c->S[i][k + 1] = datar;\n        }\n    }\n\n}\n\nvoid\nblf_key(blf_ctx *c, const uint8_t *k, uint16_t len)\n{\n    /* Initialize S-boxes and subkeys with Pi */\n    Blowfish_initstate(c);\n\n    /* Transform S-boxes and subkeys with key */\n    Blowfish_expand0state(c, k, len);\n}\n\nvoid\nblf_enc(blf_ctx *c, uint32_t *data, uint16_t blocks)\n{\n    uint32_t *d;\n    uint16_t i;\n\n    d = data;\n    for(i = 0; i < blocks; i++) {\n        Blowfish_encipher(c, d, d + 1);\n        d += 2;\n    }\n}\n\nvoid\nblf_dec(blf_ctx *c, uint32_t *data, uint16_t blocks)\n{\n    uint32_t *d;\n    uint16_t i;\n\n    d = data;\n    for(i = 0; i < blocks; i++) {\n        Blowfish_decipher(c, d, d + 1);\n        d += 2;\n    }\n}\n\nvoid\nblf_ecb_encrypt(blf_ctx *c, uint8_t *data, uint32_t len)\n{\n    uint32_t l, r;\n    uint32_t i;\n\n    for(i = 0; i < len; i += 8) {\n        l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];\n        r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];\n        Blowfish_encipher(c, &l, &r);\n        data[0] = l >> 24 & 0xff;\n        data[1] = l >> 16 & 0xff;\n        data[2] = l >> 8 & 0xff;\n        data[3] = l & 0xff;\n        data[4] = r >> 24 & 0xff;\n        data[5] = r >> 16 & 0xff;\n        data[6] = r >> 8 & 0xff;\n        data[7] = r & 0xff;\n        data += 8;\n    }\n}\n\nvoid\nblf_ecb_decrypt(blf_ctx *c, uint8_t *data, uint32_t len)\n{\n    uint32_t l, r;\n    uint32_t i;\n\n    for(i = 0; i < len; i += 8) {\n        l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];\n        r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];\n        Blowfish_decipher(c, &l, &r);\n        data[0] = l >> 24 & 0xff;\n        data[1] = l >> 16 & 0xff;\n        data[2] = l >> 8 & 0xff;\n        data[3] = l & 0xff;\n        data[4] = r >> 24 & 0xff;\n        data[5] = r >> 16 & 0xff;\n        data[6] = r >> 8 & 0xff;\n        data[7] = r & 0xff;\n        data += 8;\n    }\n}\n\nvoid\nblf_cbc_encrypt(blf_ctx *c, uint8_t *iv, uint8_t *data, uint32_t len)\n{\n    uint32_t l, r;\n    uint32_t i, j;\n\n    for(i = 0; i < len; i += 8) {\n        for(j = 0; j < 8; j++)\n            data[j] ^= iv[j];\n        l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];\n        r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];\n        Blowfish_encipher(c, &l, &r);\n        data[0] = l >> 24 & 0xff;\n        data[1] = l >> 16 & 0xff;\n        data[2] = l >> 8 & 0xff;\n        data[3] = l & 0xff;\n        data[4] = r >> 24 & 0xff;\n        data[5] = r >> 16 & 0xff;\n        data[6] = r >> 8 & 0xff;\n        data[7] = r & 0xff;\n        iv = data;\n        data += 8;\n    }\n}\n\nvoid\nblf_cbc_decrypt(blf_ctx *c, uint8_t *iva, uint8_t *data, uint32_t len)\n{\n    uint32_t l, r;\n    uint8_t *iv;\n    uint32_t i, j;\n\n    iv = data + len - 16;\n    data = data + len - 8;\n    for(i = len - 8; i >= 8; i -= 8) {\n        l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];\n        r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];\n        Blowfish_decipher(c, &l, &r);\n        data[0] = l >> 24 & 0xff;\n        data[1] = l >> 16 & 0xff;\n        data[2] = l >> 8 & 0xff;\n        data[3] = l & 0xff;\n        data[4] = r >> 24 & 0xff;\n        data[5] = r >> 16 & 0xff;\n        data[6] = r >> 8 & 0xff;\n        data[7] = r & 0xff;\n        for(j = 0; j < 8; j++)\n            data[j] ^= iv[j];\n        iv -= 8;\n        data -= 8;\n    }\n    l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];\n    r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];\n    Blowfish_decipher(c, &l, &r);\n    data[0] = l >> 24 & 0xff;\n    data[1] = l >> 16 & 0xff;\n    data[2] = l >> 8 & 0xff;\n    data[3] = l & 0xff;\n    data[4] = r >> 24 & 0xff;\n    data[5] = r >> 16 & 0xff;\n    data[6] = r >> 8 & 0xff;\n    data[7] = r & 0xff;\n    for(j = 0; j < 8; j++)\n        data[j] ^= iva[j];\n}\n\n#if 0\nvoid\nreport(uint32_t data[], uint16_t len)\n{\n    uint16_t i;\n    for(i = 0; i < len; i += 2)\n        printf(\"Block %0hd: %08lx %08lx.\\n\",\n               i / 2, data[i], data[i + 1]);\n}\nvoid\nmain(void)\n{\n\n    blf_ctx c;\n    char    key[] = \"AAAAA\";\n    char    key2[] = \"abcdefghijklmnopqrstuvwxyz\";\n\n    uint32_t data[10];\n    uint32_t data2[] =\n        {0x424c4f57l, 0x46495348l};\n\n    uint16_t i;\n\n    /* First test */\n    for(i = 0; i < 10; i++)\n        data[i] = i;\n\n    blf_key(&c, (uint8_t *) key, 5);\n    blf_enc(&c, data, 5);\n    blf_dec(&c, data, 1);\n    blf_dec(&c, data + 2, 4);\n    printf(\"Should read as 0 - 9.\\n\");\n    report(data, 10);\n\n    /* Second test */\n    blf_key(&c, (uint8_t *) key2, strlen(key2));\n    blf_enc(&c, data2, 1);\n    printf(\"\\nShould read as: 0x324ed0fe 0xf413a203.\\n\");\n    report(data2, 2);\n    blf_dec(&c, data2, 1);\n    report(data2, 2);\n}\n#endif\n\n#endif /* !defined(HAVE_BCRYPT_PBKDF) && \\\n          (!defined(HAVE_BLOWFISH_INITSTATE) ||   \\\n          !defined(HAVE_BLOWFISH_EXPAND0STATE) || \\\n          '!defined(HAVE_BLF_ENC)) */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/channel.c",
    "content": "/* Copyright (c) 2004-2007 Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2005 Mikhail Gusarov <dottedmag@dottedmag.net>\n * Copyright (c) 2008-2019 by Daniel Stenberg\n *\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#include <fcntl.h>\n#ifdef HAVE_INTTYPES_H\n#include <inttypes.h>\n#endif\n#include <assert.h>\n\n#include \"channel.h\"\n#include \"transport.h\"\n#include \"packet.h\"\n#include \"session.h\"\n\n/*\n *  _libssh2_channel_nextid\n *\n * Determine the next channel ID we can use at our end\n */\nuint32_t\n_libssh2_channel_nextid(LIBSSH2_SESSION * session)\n{\n    uint32_t id = session->next_channel;\n    LIBSSH2_CHANNEL *channel;\n\n    channel = _libssh2_list_first(&session->channels);\n\n    while(channel) {\n        if(channel->local.id > id) {\n            id = channel->local.id;\n        }\n        channel = _libssh2_list_next(&channel->node);\n    }\n\n    /* This is a shortcut to avoid waiting for close packets on channels we've\n     * forgotten about, This *could* be a problem if we request and close 4\n     * billion or so channels in too rapid succession for the remote end to\n     * respond, but the worst case scenario is that some data meant for\n     * another channel Gets picked up by the new one.... Pretty unlikely all\n     * told...\n     */\n    session->next_channel = id + 1;\n    _libssh2_debug(session, LIBSSH2_TRACE_CONN, \"Allocated new channel ID#%lu\",\n                   id);\n    return id;\n}\n\n/*\n * _libssh2_channel_locate\n *\n * Locate a channel pointer by number\n */\nLIBSSH2_CHANNEL *\n_libssh2_channel_locate(LIBSSH2_SESSION *session, uint32_t channel_id)\n{\n    LIBSSH2_CHANNEL *channel;\n    LIBSSH2_LISTENER *l;\n\n    for(channel = _libssh2_list_first(&session->channels);\n        channel;\n        channel = _libssh2_list_next(&channel->node)) {\n        if(channel->local.id == channel_id)\n            return channel;\n    }\n\n    /* We didn't find the channel in the session, let's then check its\n       listeners since each listener may have its own set of pending channels\n    */\n    for(l = _libssh2_list_first(&session->listeners); l;\n        l = _libssh2_list_next(&l->node)) {\n        for(channel = _libssh2_list_first(&l->queue);\n            channel;\n            channel = _libssh2_list_next(&channel->node)) {\n            if(channel->local.id == channel_id)\n                return channel;\n        }\n    }\n\n    return NULL;\n}\n\n/*\n * _libssh2_channel_open\n *\n * Establish a generic session channel\n */\nLIBSSH2_CHANNEL *\n_libssh2_channel_open(LIBSSH2_SESSION * session, const char *channel_type,\n                      uint32_t channel_type_len,\n                      uint32_t window_size,\n                      uint32_t packet_size,\n                      const unsigned char *message,\n                      size_t message_len)\n{\n    static const unsigned char reply_codes[3] = {\n        SSH_MSG_CHANNEL_OPEN_CONFIRMATION,\n        SSH_MSG_CHANNEL_OPEN_FAILURE,\n        0\n    };\n    unsigned char *s;\n    int rc;\n\n    if(session->open_state == libssh2_NB_state_idle) {\n        session->open_channel = NULL;\n        session->open_packet = NULL;\n        session->open_data = NULL;\n        /* 17 = packet_type(1) + channel_type_len(4) + sender_channel(4) +\n         * window_size(4) + packet_size(4) */\n        session->open_packet_len = channel_type_len + 17;\n        session->open_local_channel = _libssh2_channel_nextid(session);\n\n        /* Zero the whole thing out */\n        memset(&session->open_packet_requirev_state, 0,\n               sizeof(session->open_packet_requirev_state));\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Opening Channel - win %d pack %d\", window_size,\n                       packet_size);\n        session->open_channel =\n            LIBSSH2_CALLOC(session, sizeof(LIBSSH2_CHANNEL));\n        if(!session->open_channel) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate space for channel data\");\n            return NULL;\n        }\n        session->open_channel->channel_type_len = channel_type_len;\n        session->open_channel->channel_type =\n            LIBSSH2_ALLOC(session, channel_type_len);\n        if(!session->open_channel->channel_type) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Failed allocating memory for channel type name\");\n            LIBSSH2_FREE(session, session->open_channel);\n            session->open_channel = NULL;\n            return NULL;\n        }\n        memcpy(session->open_channel->channel_type, channel_type,\n               channel_type_len);\n\n        /* REMEMBER: local as in locally sourced */\n        session->open_channel->local.id = session->open_local_channel;\n        session->open_channel->remote.window_size = window_size;\n        session->open_channel->remote.window_size_initial = window_size;\n        session->open_channel->remote.packet_size = packet_size;\n        session->open_channel->session = session;\n\n        _libssh2_list_add(&session->channels,\n                          &session->open_channel->node);\n\n        s = session->open_packet =\n            LIBSSH2_ALLOC(session, session->open_packet_len);\n        if(!session->open_packet) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate temporary space for packet\");\n            goto channel_error;\n        }\n        *(s++) = SSH_MSG_CHANNEL_OPEN;\n        _libssh2_store_str(&s, channel_type, channel_type_len);\n        _libssh2_store_u32(&s, session->open_local_channel);\n        _libssh2_store_u32(&s, window_size);\n        _libssh2_store_u32(&s, packet_size);\n\n        /* Do not copy the message */\n\n        session->open_state = libssh2_NB_state_created;\n    }\n\n    if(session->open_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session,\n                                     session->open_packet,\n                                     session->open_packet_len,\n                                     message, message_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, rc,\n                           \"Would block sending channel-open request\");\n            return NULL;\n        }\n        else if(rc) {\n            _libssh2_error(session, rc,\n                           \"Unable to send channel-open request\");\n            goto channel_error;\n        }\n\n        session->open_state = libssh2_NB_state_sent;\n    }\n\n    if(session->open_state == libssh2_NB_state_sent) {\n        rc = _libssh2_packet_requirev(session, reply_codes,\n                                      &session->open_data,\n                                      &session->open_data_len, 1,\n                                      session->open_packet + 5 +\n                                      channel_type_len, 4,\n                                      &session->open_packet_requirev_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, \"Would block\");\n            return NULL;\n        }\n        else if(rc) {\n            goto channel_error;\n        }\n\n        if(session->open_data_len < 1) {\n            _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                           \"Unexpected packet size\");\n            goto channel_error;\n        }\n\n        if(session->open_data[0] == SSH_MSG_CHANNEL_OPEN_CONFIRMATION) {\n\n            if(session->open_data_len < 17) {\n                _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                               \"Unexpected packet size\");\n                goto channel_error;\n            }\n\n            session->open_channel->remote.id =\n                _libssh2_ntohu32(session->open_data + 5);\n            session->open_channel->local.window_size =\n                _libssh2_ntohu32(session->open_data + 9);\n            session->open_channel->local.window_size_initial =\n                _libssh2_ntohu32(session->open_data + 9);\n            session->open_channel->local.packet_size =\n                _libssh2_ntohu32(session->open_data + 13);\n            _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                           \"Connection Established - ID: %lu/%lu win: %lu/%lu\"\n                           \" pack: %lu/%lu\",\n                           session->open_channel->local.id,\n                           session->open_channel->remote.id,\n                           session->open_channel->local.window_size,\n                           session->open_channel->remote.window_size,\n                           session->open_channel->local.packet_size,\n                           session->open_channel->remote.packet_size);\n            LIBSSH2_FREE(session, session->open_packet);\n            session->open_packet = NULL;\n            LIBSSH2_FREE(session, session->open_data);\n            session->open_data = NULL;\n\n            session->open_state = libssh2_NB_state_idle;\n            return session->open_channel;\n        }\n\n        if(session->open_data[0] == SSH_MSG_CHANNEL_OPEN_FAILURE) {\n            unsigned int reason_code =\n                _libssh2_ntohu32(session->open_data + 5);\n            switch(reason_code) {\n            case SSH_OPEN_ADMINISTRATIVELY_PROHIBITED:\n                _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                               \"Channel open failure \"\n                               \"(administratively prohibited)\");\n                break;\n            case SSH_OPEN_CONNECT_FAILED:\n                _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                               \"Channel open failure (connect failed)\");\n                break;\n            case SSH_OPEN_UNKNOWN_CHANNELTYPE:\n                _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                               \"Channel open failure (unknown channel type)\");\n                break;\n            case SSH_OPEN_RESOURCE_SHORTAGE:\n                _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                               \"Channel open failure (resource shortage)\");\n                break;\n            default:\n                _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                               \"Channel open failure\");\n            }\n        }\n    }\n\n  channel_error:\n\n    if(session->open_data) {\n        LIBSSH2_FREE(session, session->open_data);\n        session->open_data = NULL;\n    }\n    if(session->open_packet) {\n        LIBSSH2_FREE(session, session->open_packet);\n        session->open_packet = NULL;\n    }\n    if(session->open_channel) {\n        unsigned char channel_id[4];\n        LIBSSH2_FREE(session, session->open_channel->channel_type);\n\n        _libssh2_list_remove(&session->open_channel->node);\n\n        /* Clear out packets meant for this channel */\n        _libssh2_htonu32(channel_id, session->open_channel->local.id);\n        while((_libssh2_packet_ask(session, SSH_MSG_CHANNEL_DATA,\n                                    &session->open_data,\n                                    &session->open_data_len, 1,\n                                    channel_id, 4) >= 0)\n               ||\n               (_libssh2_packet_ask(session, SSH_MSG_CHANNEL_EXTENDED_DATA,\n                                    &session->open_data,\n                                    &session->open_data_len, 1,\n                                    channel_id, 4) >= 0)) {\n            LIBSSH2_FREE(session, session->open_data);\n            session->open_data = NULL;\n        }\n\n        LIBSSH2_FREE(session, session->open_channel);\n        session->open_channel = NULL;\n    }\n\n    session->open_state = libssh2_NB_state_idle;\n    return NULL;\n}\n\n/*\n * libssh2_channel_open_ex\n *\n * Establish a generic session channel\n */\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_open_ex(LIBSSH2_SESSION *session, const char *type,\n                        unsigned int type_len,\n                        unsigned int window_size, unsigned int packet_size,\n                        const char *msg, unsigned int msg_len)\n{\n    LIBSSH2_CHANNEL *ptr;\n\n    if(!session)\n        return NULL;\n\n    BLOCK_ADJUST_ERRNO(ptr, session,\n                       _libssh2_channel_open(session, type, type_len,\n                                             window_size, packet_size,\n                                             (unsigned char *)msg,\n                                             msg_len));\n    return ptr;\n}\n\n/*\n * libssh2_channel_direct_tcpip_ex\n *\n * Tunnel TCP/IP connect through the SSH session to direct host/port\n */\nstatic LIBSSH2_CHANNEL *\nchannel_direct_tcpip(LIBSSH2_SESSION * session, const char *host,\n                     int port, const char *shost, int sport)\n{\n    LIBSSH2_CHANNEL *channel;\n    unsigned char *s;\n\n    if(session->direct_state == libssh2_NB_state_idle) {\n        session->direct_host_len = strlen(host);\n        session->direct_shost_len = strlen(shost);\n        /* host_len(4) + port(4) + shost_len(4) + sport(4) */\n        session->direct_message_len =\n            session->direct_host_len + session->direct_shost_len + 16;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Requesting direct-tcpip session from %s:%d to %s:%d\",\n                       shost, sport, host, port);\n\n        s = session->direct_message =\n            LIBSSH2_ALLOC(session, session->direct_message_len);\n        if(!session->direct_message) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate memory for \"\n                           \"direct-tcpip connection\");\n            return NULL;\n        }\n        _libssh2_store_str(&s, host, session->direct_host_len);\n        _libssh2_store_u32(&s, port);\n        _libssh2_store_str(&s, shost, session->direct_shost_len);\n        _libssh2_store_u32(&s, sport);\n    }\n\n    channel =\n        _libssh2_channel_open(session, \"direct-tcpip\",\n                              sizeof(\"direct-tcpip\") - 1,\n                              LIBSSH2_CHANNEL_WINDOW_DEFAULT,\n                              LIBSSH2_CHANNEL_PACKET_DEFAULT,\n                              session->direct_message,\n                              session->direct_message_len);\n\n    if(!channel &&\n        libssh2_session_last_errno(session) == LIBSSH2_ERROR_EAGAIN) {\n        /* The error code is still set to LIBSSH2_ERROR_EAGAIN, set our state\n           to created to avoid re-creating the package on next invoke */\n        session->direct_state = libssh2_NB_state_created;\n        return NULL;\n    }\n    /* by default we set (keep?) idle state... */\n    session->direct_state = libssh2_NB_state_idle;\n\n    LIBSSH2_FREE(session, session->direct_message);\n    session->direct_message = NULL;\n\n    return channel;\n}\n\n/*\n * libssh2_channel_direct_tcpip_ex\n *\n * Tunnel TCP/IP connect through the SSH session to direct host/port\n */\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_direct_tcpip_ex(LIBSSH2_SESSION *session, const char *host,\n                                int port, const char *shost, int sport)\n{\n    LIBSSH2_CHANNEL *ptr;\n\n    if(!session)\n        return NULL;\n\n    BLOCK_ADJUST_ERRNO(ptr, session,\n                       channel_direct_tcpip(session, host, port,\n                                            shost, sport));\n    return ptr;\n}\n\n/*\n * channel_forward_listen\n *\n * Bind a port on the remote host and listen for connections\n */\nstatic LIBSSH2_LISTENER *\nchannel_forward_listen(LIBSSH2_SESSION * session, const char *host,\n                       int port, int *bound_port, int queue_maxsize)\n{\n    unsigned char *s;\n    static const unsigned char reply_codes[3] =\n        { SSH_MSG_REQUEST_SUCCESS, SSH_MSG_REQUEST_FAILURE, 0 };\n    int rc;\n\n    if(!host)\n        host = \"0.0.0.0\";\n\n    if(session->fwdLstn_state == libssh2_NB_state_idle) {\n        session->fwdLstn_host_len = strlen(host);\n        /* 14 = packet_type(1) + request_len(4) + want_replay(1) + host_len(4)\n           + port(4) */\n        session->fwdLstn_packet_len =\n            session->fwdLstn_host_len + (sizeof(\"tcpip-forward\") - 1) + 14;\n\n        /* Zero the whole thing out */\n        memset(&session->fwdLstn_packet_requirev_state, 0,\n               sizeof(session->fwdLstn_packet_requirev_state));\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Requesting tcpip-forward session for %s:%d\", host,\n                       port);\n\n        s = session->fwdLstn_packet =\n            LIBSSH2_ALLOC(session, session->fwdLstn_packet_len);\n        if(!session->fwdLstn_packet) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate memory for setenv packet\");\n            return NULL;\n        }\n\n        *(s++) = SSH_MSG_GLOBAL_REQUEST;\n        _libssh2_store_str(&s, \"tcpip-forward\", sizeof(\"tcpip-forward\") - 1);\n        *(s++) = 0x01;          /* want_reply */\n\n        _libssh2_store_str(&s, host, session->fwdLstn_host_len);\n        _libssh2_store_u32(&s, port);\n\n        session->fwdLstn_state = libssh2_NB_state_created;\n    }\n\n    if(session->fwdLstn_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session,\n                                     session->fwdLstn_packet,\n                                     session->fwdLstn_packet_len,\n                                     NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block sending global-request packet for \"\n                           \"forward listen request\");\n            return NULL;\n        }\n        else if(rc) {\n            _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                           \"Unable to send global-request packet for forward \"\n                           \"listen request\");\n            LIBSSH2_FREE(session, session->fwdLstn_packet);\n            session->fwdLstn_packet = NULL;\n            session->fwdLstn_state = libssh2_NB_state_idle;\n            return NULL;\n        }\n        LIBSSH2_FREE(session, session->fwdLstn_packet);\n        session->fwdLstn_packet = NULL;\n\n        session->fwdLstn_state = libssh2_NB_state_sent;\n    }\n\n    if(session->fwdLstn_state == libssh2_NB_state_sent) {\n        unsigned char *data;\n        size_t data_len;\n        rc = _libssh2_packet_requirev(session, reply_codes, &data, &data_len,\n                                      0, NULL, 0,\n                                      &session->fwdLstn_packet_requirev_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, \"Would block\");\n            return NULL;\n        }\n        else if(rc || (data_len < 1)) {\n            _libssh2_error(session, LIBSSH2_ERROR_PROTO, \"Unknown\");\n            session->fwdLstn_state = libssh2_NB_state_idle;\n            return NULL;\n        }\n\n        if(data[0] == SSH_MSG_REQUEST_SUCCESS) {\n            LIBSSH2_LISTENER *listener;\n\n            listener = LIBSSH2_CALLOC(session, sizeof(LIBSSH2_LISTENER));\n            if(!listener)\n                _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                               \"Unable to allocate memory for listener queue\");\n            else {\n                listener->host =\n                    LIBSSH2_ALLOC(session, session->fwdLstn_host_len + 1);\n                if(!listener->host) {\n                    _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                   \"Unable to allocate memory \"\n                                   \"for listener queue\");\n                    LIBSSH2_FREE(session, listener);\n                    listener = NULL;\n                }\n                else {\n                    listener->session = session;\n                    memcpy(listener->host, host, session->fwdLstn_host_len);\n                    listener->host[session->fwdLstn_host_len] = 0;\n                    if(data_len >= 5 && !port) {\n                        listener->port = _libssh2_ntohu32(data + 1);\n                        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                                       \"Dynamic tcpip-forward port \"\n                                       \"allocated: %d\",\n                                       listener->port);\n                    }\n                    else\n                        listener->port = port;\n\n                    listener->queue_size = 0;\n                    listener->queue_maxsize = queue_maxsize;\n\n                    /* append this to the parent's list of listeners */\n                    _libssh2_list_add(&session->listeners, &listener->node);\n\n                    if(bound_port) {\n                        *bound_port = listener->port;\n                    }\n                }\n            }\n\n            LIBSSH2_FREE(session, data);\n            session->fwdLstn_state = libssh2_NB_state_idle;\n            return listener;\n        }\n        else if(data[0] == SSH_MSG_REQUEST_FAILURE) {\n            LIBSSH2_FREE(session, data);\n            _libssh2_error(session, LIBSSH2_ERROR_REQUEST_DENIED,\n                           \"Unable to complete request for forward-listen\");\n            session->fwdLstn_state = libssh2_NB_state_idle;\n            return NULL;\n        }\n    }\n\n    session->fwdLstn_state = libssh2_NB_state_idle;\n\n    return NULL;\n}\n\n/*\n * libssh2_channel_forward_listen_ex\n *\n * Bind a port on the remote host and listen for connections\n */\nLIBSSH2_API LIBSSH2_LISTENER *\nlibssh2_channel_forward_listen_ex(LIBSSH2_SESSION *session, const char *host,\n                                  int port, int *bound_port, int queue_maxsize)\n{\n    LIBSSH2_LISTENER *ptr;\n\n    if(!session)\n        return NULL;\n\n    BLOCK_ADJUST_ERRNO(ptr, session,\n                       channel_forward_listen(session, host, port, bound_port,\n                                              queue_maxsize));\n    return ptr;\n}\n\n/*\n * _libssh2_channel_forward_cancel\n *\n * Stop listening on a remote port and free the listener\n * Toss out any pending (un-accept()ed) connections\n *\n * Return 0 on success, LIBSSH2_ERROR_EAGAIN if would block, -1 on error\n */\nint _libssh2_channel_forward_cancel(LIBSSH2_LISTENER *listener)\n{\n    LIBSSH2_SESSION *session = listener->session;\n    LIBSSH2_CHANNEL *queued;\n    unsigned char *packet, *s;\n    size_t host_len = strlen(listener->host);\n    /* 14 = packet_type(1) + request_len(4) + want_replay(1) + host_len(4) +\n       port(4) */\n    size_t packet_len =\n        host_len + 14 + sizeof(\"cancel-tcpip-forward\") - 1;\n    int rc;\n    int retcode = 0;\n\n    if(listener->chanFwdCncl_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Cancelling tcpip-forward session for %s:%d\",\n                       listener->host, listener->port);\n\n        s = packet = LIBSSH2_ALLOC(session, packet_len);\n        if(!packet) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate memory for setenv packet\");\n            return LIBSSH2_ERROR_ALLOC;\n        }\n\n        *(s++) = SSH_MSG_GLOBAL_REQUEST;\n        _libssh2_store_str(&s, \"cancel-tcpip-forward\",\n                           sizeof(\"cancel-tcpip-forward\") - 1);\n        *(s++) = 0x00;          /* want_reply */\n\n        _libssh2_store_str(&s, listener->host, host_len);\n        _libssh2_store_u32(&s, listener->port);\n\n        listener->chanFwdCncl_state = libssh2_NB_state_created;\n    }\n    else {\n        packet = listener->chanFwdCncl_data;\n    }\n\n    if(listener->chanFwdCncl_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, packet, packet_len, NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, rc,\n                           \"Would block sending forward request\");\n            listener->chanFwdCncl_data = packet;\n            return rc;\n        }\n        else if(rc) {\n            _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                           \"Unable to send global-request packet for forward \"\n                           \"listen request\");\n            /* set the state to something we don't check for, for the\n               unfortunate situation where we get an EAGAIN further down\n               when trying to bail out due to errors! */\n            listener->chanFwdCncl_state = libssh2_NB_state_sent;\n            retcode = LIBSSH2_ERROR_SOCKET_SEND;\n        }\n        LIBSSH2_FREE(session, packet);\n\n        listener->chanFwdCncl_state = libssh2_NB_state_sent;\n    }\n\n    queued = _libssh2_list_first(&listener->queue);\n    while(queued) {\n        LIBSSH2_CHANNEL *next = _libssh2_list_next(&queued->node);\n\n        rc = _libssh2_channel_free(queued);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        queued = next;\n    }\n    LIBSSH2_FREE(session, listener->host);\n\n    /* remove this entry from the parent's list of listeners */\n    _libssh2_list_remove(&listener->node);\n\n    LIBSSH2_FREE(session, listener);\n\n    return retcode;\n}\n\n/*\n * libssh2_channel_forward_cancel\n *\n * Stop listening on a remote port and free the listener\n * Toss out any pending (un-accept()ed) connections\n *\n * Return 0 on success, LIBSSH2_ERROR_EAGAIN if would block, -1 on error\n */\nLIBSSH2_API int\nlibssh2_channel_forward_cancel(LIBSSH2_LISTENER *listener)\n{\n    int rc;\n\n    if(!listener)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, listener->session,\n                 _libssh2_channel_forward_cancel(listener));\n    return rc;\n}\n\n/*\n * channel_forward_accept\n *\n * Accept a connection\n */\nstatic LIBSSH2_CHANNEL *\nchannel_forward_accept(LIBSSH2_LISTENER *listener)\n{\n    int rc;\n\n    do {\n        rc = _libssh2_transport_read(listener->session);\n    } while(rc > 0);\n\n    if(_libssh2_list_first(&listener->queue)) {\n        LIBSSH2_CHANNEL *channel = _libssh2_list_first(&listener->queue);\n\n        /* detach channel from listener's queue */\n        _libssh2_list_remove(&channel->node);\n\n        listener->queue_size--;\n\n        /* add channel to session's channel list */\n        _libssh2_list_add(&channel->session->channels, &channel->node);\n\n        return channel;\n    }\n\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        _libssh2_error(listener->session, LIBSSH2_ERROR_EAGAIN,\n                       \"Would block waiting for packet\");\n    }\n    else\n        _libssh2_error(listener->session, LIBSSH2_ERROR_CHANNEL_UNKNOWN,\n                       \"Channel not found\");\n    return NULL;\n}\n\n/*\n * libssh2_channel_forward_accept\n *\n * Accept a connection\n */\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_forward_accept(LIBSSH2_LISTENER *listener)\n{\n    LIBSSH2_CHANNEL *ptr;\n\n    if(!listener)\n        return NULL;\n\n    BLOCK_ADJUST_ERRNO(ptr, listener->session,\n                       channel_forward_accept(listener));\n    return ptr;\n\n}\n\n/*\n * channel_setenv\n *\n * Set an environment variable prior to requesting a shell/program/subsystem\n */\nstatic int channel_setenv(LIBSSH2_CHANNEL *channel,\n                          const char *varname, unsigned int varname_len,\n                          const char *value, unsigned int value_len)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char *s, *data;\n    static const unsigned char reply_codes[3] =\n        { SSH_MSG_CHANNEL_SUCCESS, SSH_MSG_CHANNEL_FAILURE, 0 };\n    size_t data_len;\n    int rc;\n\n    if(channel->setenv_state == libssh2_NB_state_idle) {\n        /* 21 = packet_type(1) + channel_id(4) + request_len(4) +\n         * request(3)\"env\" + want_reply(1) + varname_len(4) + value_len(4) */\n        channel->setenv_packet_len = varname_len + value_len + 21;\n\n        /* Zero the whole thing out */\n        memset(&channel->setenv_packet_requirev_state, 0,\n               sizeof(channel->setenv_packet_requirev_state));\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Setting remote environment variable: %s=%s on \"\n                       \"channel %lu/%lu\",\n                       varname, value, channel->local.id, channel->remote.id);\n\n        s = channel->setenv_packet =\n            LIBSSH2_ALLOC(session, channel->setenv_packet_len);\n        if(!channel->setenv_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory \"\n                                  \"for setenv packet\");\n        }\n\n        *(s++) = SSH_MSG_CHANNEL_REQUEST;\n        _libssh2_store_u32(&s, channel->remote.id);\n        _libssh2_store_str(&s, \"env\", sizeof(\"env\") - 1);\n        *(s++) = 0x01;\n        _libssh2_store_str(&s, varname, varname_len);\n        _libssh2_store_str(&s, value, value_len);\n\n        channel->setenv_state = libssh2_NB_state_created;\n    }\n\n    if(channel->setenv_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session,\n                                     channel->setenv_packet,\n                                     channel->setenv_packet_len,\n                                     NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, rc,\n                           \"Would block sending setenv request\");\n            return rc;\n        }\n        else if(rc) {\n            LIBSSH2_FREE(session, channel->setenv_packet);\n            channel->setenv_packet = NULL;\n            channel->setenv_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send channel-request packet for \"\n                                  \"setenv request\");\n        }\n        LIBSSH2_FREE(session, channel->setenv_packet);\n        channel->setenv_packet = NULL;\n\n        _libssh2_htonu32(channel->setenv_local_channel, channel->local.id);\n\n        channel->setenv_state = libssh2_NB_state_sent;\n    }\n\n    if(channel->setenv_state == libssh2_NB_state_sent) {\n        rc = _libssh2_packet_requirev(session, reply_codes, &data, &data_len,\n                                      1, channel->setenv_local_channel, 4,\n                                      &channel->\n                                      setenv_packet_requirev_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        if(rc) {\n            channel->setenv_state = libssh2_NB_state_idle;\n            return rc;\n        }\n        else if(data_len < 1) {\n            channel->setenv_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                  \"Unexpected packet size\");\n        }\n\n        if(data[0] == SSH_MSG_CHANNEL_SUCCESS) {\n            LIBSSH2_FREE(session, data);\n            channel->setenv_state = libssh2_NB_state_idle;\n            return 0;\n        }\n\n        LIBSSH2_FREE(session, data);\n    }\n\n    channel->setenv_state = libssh2_NB_state_idle;\n    return _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED,\n                          \"Unable to complete request for channel-setenv\");\n}\n\n/*\n * libssh2_channel_setenv_ex\n *\n * Set an environment variable prior to requesting a shell/program/subsystem\n */\nLIBSSH2_API int\nlibssh2_channel_setenv_ex(LIBSSH2_CHANNEL *channel,\n                          const char *varname, unsigned int varname_len,\n                          const char *value, unsigned int value_len)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 channel_setenv(channel, varname, varname_len,\n                                value, value_len));\n    return rc;\n}\n\n/*\n * channel_request_pty\n * Duh... Request a PTY\n */\nstatic int channel_request_pty(LIBSSH2_CHANNEL *channel,\n                               const char *term, unsigned int term_len,\n                               const char *modes, unsigned int modes_len,\n                               int width, int height,\n                               int width_px, int height_px)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char *s;\n    static const unsigned char reply_codes[3] =\n        { SSH_MSG_CHANNEL_SUCCESS, SSH_MSG_CHANNEL_FAILURE, 0 };\n    int rc;\n\n    if(channel->reqPTY_state == libssh2_NB_state_idle) {\n        /* 41 = packet_type(1) + channel(4) + pty_req_len(4) + \"pty_req\"(7) +\n         * want_reply(1) + term_len(4) + width(4) + height(4) + width_px(4) +\n         * height_px(4) + modes_len(4) */\n        if(term_len + modes_len > 256) {\n            return _libssh2_error(session, LIBSSH2_ERROR_INVAL,\n                                  \"term + mode lengths too large\");\n        }\n\n        channel->reqPTY_packet_len = term_len + modes_len + 41;\n\n        /* Zero the whole thing out */\n        memset(&channel->reqPTY_packet_requirev_state, 0,\n               sizeof(channel->reqPTY_packet_requirev_state));\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Allocating tty on channel %lu/%lu\", channel->local.id,\n                       channel->remote.id);\n\n        s = channel->reqPTY_packet;\n\n        *(s++) = SSH_MSG_CHANNEL_REQUEST;\n        _libssh2_store_u32(&s, channel->remote.id);\n        _libssh2_store_str(&s, (char *)\"pty-req\", sizeof(\"pty-req\") - 1);\n\n        *(s++) = 0x01;\n\n        _libssh2_store_str(&s, term, term_len);\n        _libssh2_store_u32(&s, width);\n        _libssh2_store_u32(&s, height);\n        _libssh2_store_u32(&s, width_px);\n        _libssh2_store_u32(&s, height_px);\n        _libssh2_store_str(&s, modes, modes_len);\n\n        channel->reqPTY_state = libssh2_NB_state_created;\n    }\n\n    if(channel->reqPTY_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, channel->reqPTY_packet,\n                                     channel->reqPTY_packet_len,\n                                     NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, rc,\n                           \"Would block sending pty request\");\n            return rc;\n        }\n        else if(rc) {\n            channel->reqPTY_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, rc,\n                                  \"Unable to send pty-request packet\");\n        }\n        _libssh2_htonu32(channel->reqPTY_local_channel, channel->local.id);\n\n        channel->reqPTY_state = libssh2_NB_state_sent;\n    }\n\n    if(channel->reqPTY_state == libssh2_NB_state_sent) {\n        unsigned char *data;\n        size_t data_len;\n        unsigned char code;\n        rc = _libssh2_packet_requirev(session, reply_codes, &data, &data_len,\n                                      1, channel->reqPTY_local_channel, 4,\n                                      &channel->reqPTY_packet_requirev_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc || data_len < 1) {\n            channel->reqPTY_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                  \"Failed to require the PTY package\");\n        }\n\n        code = data[0];\n\n        LIBSSH2_FREE(session, data);\n        channel->reqPTY_state = libssh2_NB_state_idle;\n\n        if(code == SSH_MSG_CHANNEL_SUCCESS)\n            return 0;\n    }\n\n    return _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED,\n                          \"Unable to complete request for \"\n                          \"channel request-pty\");\n}\n\n/*\n * libssh2_channel_request_pty_ex\n * Duh... Request a PTY\n */\nLIBSSH2_API int\nlibssh2_channel_request_pty_ex(LIBSSH2_CHANNEL *channel, const char *term,\n                               unsigned int term_len, const char *modes,\n                               unsigned int modes_len, int width, int height,\n                               int width_px, int height_px)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 channel_request_pty(channel, term, term_len, modes,\n                                     modes_len, width, height,\n                                     width_px, height_px));\n    return rc;\n}\n\nstatic int\nchannel_request_pty_size(LIBSSH2_CHANNEL * channel, int width,\n                         int height, int width_px, int height_px)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char *s;\n    int rc;\n    int retcode = LIBSSH2_ERROR_PROTO;\n\n    if(channel->reqPTY_state == libssh2_NB_state_idle) {\n        channel->reqPTY_packet_len = 39;\n\n        /* Zero the whole thing out */\n        memset(&channel->reqPTY_packet_requirev_state, 0,\n               sizeof(channel->reqPTY_packet_requirev_state));\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n            \"changing tty size on channel %lu/%lu\",\n            channel->local.id,\n            channel->remote.id);\n\n        s = channel->reqPTY_packet;\n\n        *(s++) = SSH_MSG_CHANNEL_REQUEST;\n        _libssh2_store_u32(&s, channel->remote.id);\n        _libssh2_store_str(&s, (char *)\"window-change\",\n                           sizeof(\"window-change\") - 1);\n        *(s++) = 0x00; /* Don't reply */\n        _libssh2_store_u32(&s, width);\n        _libssh2_store_u32(&s, height);\n        _libssh2_store_u32(&s, width_px);\n        _libssh2_store_u32(&s, height_px);\n\n        channel->reqPTY_state = libssh2_NB_state_created;\n    }\n\n    if(channel->reqPTY_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, channel->reqPTY_packet,\n                                     channel->reqPTY_packet_len,\n                                     NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, rc,\n                           \"Would block sending window-change request\");\n            return rc;\n        }\n        else if(rc) {\n            channel->reqPTY_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, rc,\n                                  \"Unable to send window-change packet\");\n        }\n        _libssh2_htonu32(channel->reqPTY_local_channel, channel->local.id);\n        retcode = LIBSSH2_ERROR_NONE;\n    }\n\n    channel->reqPTY_state = libssh2_NB_state_idle;\n    return retcode;\n}\n\nLIBSSH2_API int\nlibssh2_channel_request_pty_size_ex(LIBSSH2_CHANNEL *channel, int width,\n                                    int height, int width_px, int height_px)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 channel_request_pty_size(channel, width, height, width_px,\n                                          height_px));\n    return rc;\n}\n\n/* Keep this an even number */\n#define LIBSSH2_X11_RANDOM_COOKIE_LEN       32\n\n/*\n * channel_x11_req\n * Request X11 forwarding\n */\nstatic int\nchannel_x11_req(LIBSSH2_CHANNEL *channel, int single_connection,\n                const char *auth_proto, const char *auth_cookie,\n                int screen_number)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char *s;\n    static const unsigned char reply_codes[3] =\n        { SSH_MSG_CHANNEL_SUCCESS, SSH_MSG_CHANNEL_FAILURE, 0 };\n    size_t proto_len =\n        auth_proto ? strlen(auth_proto) : (sizeof(\"MIT-MAGIC-COOKIE-1\") - 1);\n    size_t cookie_len =\n        auth_cookie ? strlen(auth_cookie) : LIBSSH2_X11_RANDOM_COOKIE_LEN;\n    int rc;\n\n    if(channel->reqX11_state == libssh2_NB_state_idle) {\n        /* 30 = packet_type(1) + channel(4) + x11_req_len(4) + \"x11-req\"(7) +\n         * want_reply(1) + single_cnx(1) + proto_len(4) + cookie_len(4) +\n         * screen_num(4) */\n        channel->reqX11_packet_len = proto_len + cookie_len + 30;\n\n        /* Zero the whole thing out */\n        memset(&channel->reqX11_packet_requirev_state, 0,\n               sizeof(channel->reqX11_packet_requirev_state));\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Requesting x11-req for channel %lu/%lu: single=%d \"\n                       \"proto=%s cookie=%s screen=%d\",\n                       channel->local.id, channel->remote.id,\n                       single_connection,\n                       auth_proto ? auth_proto : \"MIT-MAGIC-COOKIE-1\",\n                       auth_cookie ? auth_cookie : \"<random>\", screen_number);\n\n        s = channel->reqX11_packet =\n            LIBSSH2_ALLOC(session, channel->reqX11_packet_len);\n        if(!channel->reqX11_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for pty-request\");\n        }\n\n        *(s++) = SSH_MSG_CHANNEL_REQUEST;\n        _libssh2_store_u32(&s, channel->remote.id);\n        _libssh2_store_str(&s, \"x11-req\", sizeof(\"x11-req\") - 1);\n\n        *(s++) = 0x01;          /* want_reply */\n        *(s++) = single_connection ? 0x01 : 0x00;\n\n        _libssh2_store_str(&s, auth_proto ? auth_proto : \"MIT-MAGIC-COOKIE-1\",\n                           proto_len);\n\n        _libssh2_store_u32(&s, cookie_len);\n        if(auth_cookie) {\n            memcpy(s, auth_cookie, cookie_len);\n        }\n        else {\n            int i;\n            /* note: the extra +1 below is necessary since the sprintf()\n               loop will always write 3 bytes so the last one will write\n               the trailing zero at the LIBSSH2_X11_RANDOM_COOKIE_LEN/2\n               border */\n            unsigned char buffer[(LIBSSH2_X11_RANDOM_COOKIE_LEN / 2) + 1];\n\n            _libssh2_random(buffer, LIBSSH2_X11_RANDOM_COOKIE_LEN / 2);\n            for(i = 0; i < (LIBSSH2_X11_RANDOM_COOKIE_LEN / 2); i++) {\n                snprintf((char *)&s[i*2], 3, \"%02X\", buffer[i]);\n            }\n        }\n        s += cookie_len;\n\n        _libssh2_store_u32(&s, screen_number);\n        channel->reqX11_state = libssh2_NB_state_created;\n    }\n\n    if(channel->reqX11_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, channel->reqX11_packet,\n                                     channel->reqX11_packet_len,\n                                     NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, rc,\n                           \"Would block sending X11-req packet\");\n            return rc;\n        }\n        if(rc) {\n            LIBSSH2_FREE(session, channel->reqX11_packet);\n            channel->reqX11_packet = NULL;\n            channel->reqX11_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, rc,\n                                  \"Unable to send x11-req packet\");\n        }\n        LIBSSH2_FREE(session, channel->reqX11_packet);\n        channel->reqX11_packet = NULL;\n\n        _libssh2_htonu32(channel->reqX11_local_channel, channel->local.id);\n\n        channel->reqX11_state = libssh2_NB_state_sent;\n    }\n\n    if(channel->reqX11_state == libssh2_NB_state_sent) {\n        size_t data_len;\n        unsigned char *data;\n        unsigned char code;\n\n        rc = _libssh2_packet_requirev(session, reply_codes, &data, &data_len,\n                                      1, channel->reqX11_local_channel, 4,\n                                      &channel->reqX11_packet_requirev_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc || data_len < 1) {\n            channel->reqX11_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, rc,\n                                  \"waiting for x11-req response packet\");\n        }\n\n        code = data[0];\n        LIBSSH2_FREE(session, data);\n        channel->reqX11_state = libssh2_NB_state_idle;\n\n        if(code == SSH_MSG_CHANNEL_SUCCESS)\n            return 0;\n    }\n\n    return _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED,\n                          \"Unable to complete request for channel x11-req\");\n}\n\n/*\n * libssh2_channel_x11_req_ex\n * Request X11 forwarding\n */\nLIBSSH2_API int\nlibssh2_channel_x11_req_ex(LIBSSH2_CHANNEL *channel, int single_connection,\n                           const char *auth_proto, const char *auth_cookie,\n                           int screen_number)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 channel_x11_req(channel, single_connection, auth_proto,\n                                 auth_cookie, screen_number));\n    return rc;\n}\n\n\n/*\n * _libssh2_channel_process_startup\n *\n * Primitive for libssh2_channel_(shell|exec|subsystem)\n */\nint\n_libssh2_channel_process_startup(LIBSSH2_CHANNEL *channel,\n                                 const char *request, size_t request_len,\n                                 const char *message, size_t message_len)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char *s;\n    static const unsigned char reply_codes[3] =\n        { SSH_MSG_CHANNEL_SUCCESS, SSH_MSG_CHANNEL_FAILURE, 0 };\n    int rc;\n\n    if(channel->process_state == libssh2_NB_state_end) {\n        return _libssh2_error(session, LIBSSH2_ERROR_BAD_USE,\n                              \"Channel can not be reused\");\n    }\n\n    if(channel->process_state == libssh2_NB_state_idle) {\n        /* 10 = packet_type(1) + channel(4) + request_len(4) + want_reply(1) */\n        channel->process_packet_len = request_len + 10;\n\n        /* Zero the whole thing out */\n        memset(&channel->process_packet_requirev_state, 0,\n               sizeof(channel->process_packet_requirev_state));\n\n        if(message)\n            channel->process_packet_len += + 4;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"starting request(%s) on channel %lu/%lu, message=%s\",\n                       request, channel->local.id, channel->remote.id,\n                       message ? message : \"<null>\");\n        s = channel->process_packet =\n            LIBSSH2_ALLOC(session, channel->process_packet_len);\n        if(!channel->process_packet)\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory \"\n                                  \"for channel-process request\");\n\n        *(s++) = SSH_MSG_CHANNEL_REQUEST;\n        _libssh2_store_u32(&s, channel->remote.id);\n        _libssh2_store_str(&s, request, request_len);\n        *(s++) = 0x01;\n\n        if(message)\n            _libssh2_store_u32(&s, message_len);\n\n        channel->process_state = libssh2_NB_state_created;\n    }\n\n    if(channel->process_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session,\n                                     channel->process_packet,\n                                     channel->process_packet_len,\n                                     (unsigned char *)message, message_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, rc,\n                           \"Would block sending channel request\");\n            return rc;\n        }\n        else if(rc) {\n            LIBSSH2_FREE(session, channel->process_packet);\n            channel->process_packet = NULL;\n            channel->process_state = libssh2_NB_state_end;\n            return _libssh2_error(session, rc,\n                                  \"Unable to send channel request\");\n        }\n        LIBSSH2_FREE(session, channel->process_packet);\n        channel->process_packet = NULL;\n\n        _libssh2_htonu32(channel->process_local_channel, channel->local.id);\n\n        channel->process_state = libssh2_NB_state_sent;\n    }\n\n    if(channel->process_state == libssh2_NB_state_sent) {\n        unsigned char *data;\n        size_t data_len;\n        unsigned char code;\n        rc = _libssh2_packet_requirev(session, reply_codes, &data, &data_len,\n                                      1, channel->process_local_channel, 4,\n                                      &channel->process_packet_requirev_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc || data_len < 1) {\n            channel->process_state = libssh2_NB_state_end;\n            return _libssh2_error(session, rc,\n                                  \"Failed waiting for channel success\");\n        }\n\n        code = data[0];\n        LIBSSH2_FREE(session, data);\n        channel->process_state = libssh2_NB_state_end;\n\n        if(code == SSH_MSG_CHANNEL_SUCCESS)\n            return 0;\n    }\n\n    return _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED,\n                          \"Unable to complete request for \"\n                          \"channel-process-startup\");\n}\n\n/*\n * libssh2_channel_process_startup\n *\n * Primitive for libssh2_channel_(shell|exec|subsystem)\n */\nLIBSSH2_API int\nlibssh2_channel_process_startup(LIBSSH2_CHANNEL *channel,\n                                const char *req, unsigned int req_len,\n                                const char *msg, unsigned int msg_len)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 _libssh2_channel_process_startup(channel, req, req_len,\n                                                  msg, msg_len));\n    return rc;\n}\n\n\n/*\n * libssh2_channel_set_blocking\n *\n * Set a channel's BEHAVIOR blocking on or off. The socket will remain non-\n * blocking.\n */\nLIBSSH2_API void\nlibssh2_channel_set_blocking(LIBSSH2_CHANNEL * channel, int blocking)\n{\n    if(channel)\n        (void) _libssh2_session_set_blocking(channel->session, blocking);\n}\n\n/*\n * _libssh2_channel_flush\n *\n * Flush data from one (or all) stream\n * Returns number of bytes flushed, or negative on failure\n */\nint\n_libssh2_channel_flush(LIBSSH2_CHANNEL *channel, int streamid)\n{\n    if(channel->flush_state == libssh2_NB_state_idle) {\n        LIBSSH2_PACKET *packet =\n            _libssh2_list_first(&channel->session->packets);\n        channel->flush_refund_bytes = 0;\n        channel->flush_flush_bytes = 0;\n\n        while(packet) {\n            unsigned char packet_type;\n            LIBSSH2_PACKET *next = _libssh2_list_next(&packet->node);\n\n            if(packet->data_len < 1) {\n                packet = next;\n                _libssh2_debug(channel->session, LIBSSH2_TRACE_ERROR,\n                               \"Unexpected packet length\");\n                continue;\n            }\n\n            packet_type = packet->data[0];\n\n            if(((packet_type == SSH_MSG_CHANNEL_DATA)\n                || (packet_type == SSH_MSG_CHANNEL_EXTENDED_DATA))\n               && ((packet->data_len >= 5)\n                   && (_libssh2_ntohu32(packet->data + 1)\n                       == channel->local.id))) {\n                /* It's our channel at least */\n                int packet_stream_id;\n\n                if(packet_type == SSH_MSG_CHANNEL_DATA) {\n                    packet_stream_id = 0;\n                }\n                else if(packet->data_len >= 9) {\n                    packet_stream_id = _libssh2_ntohu32(packet->data + 5);\n                }\n                else {\n                    channel->flush_state = libssh2_NB_state_idle;\n                    return _libssh2_error(channel->session,\n                                          LIBSSH2_ERROR_PROTO,\n                                          \"Unexpected packet length\");\n                }\n\n                if((streamid == LIBSSH2_CHANNEL_FLUSH_ALL)\n                    || ((packet_type == SSH_MSG_CHANNEL_EXTENDED_DATA)\n                        && ((streamid == LIBSSH2_CHANNEL_FLUSH_EXTENDED_DATA)\n                            || (streamid == packet_stream_id)))\n                    || ((packet_type == SSH_MSG_CHANNEL_DATA)\n                        && (streamid == 0))) {\n                    size_t bytes_to_flush = packet->data_len -\n                        packet->data_head;\n\n                    _libssh2_debug(channel->session, LIBSSH2_TRACE_CONN,\n                                   \"Flushing %d bytes of data from stream \"\n                                   \"%lu on channel %lu/%lu\",\n                                   bytes_to_flush, packet_stream_id,\n                                   channel->local.id, channel->remote.id);\n\n                    /* It's one of the streams we wanted to flush */\n                    channel->flush_refund_bytes += packet->data_len - 13;\n                    channel->flush_flush_bytes += bytes_to_flush;\n\n                    LIBSSH2_FREE(channel->session, packet->data);\n\n                    /* remove this packet from the parent's list */\n                    _libssh2_list_remove(&packet->node);\n                    LIBSSH2_FREE(channel->session, packet);\n                }\n            }\n            packet = next;\n        }\n\n        channel->flush_state = libssh2_NB_state_created;\n    }\n\n    channel->read_avail -= channel->flush_flush_bytes;\n    channel->remote.window_size -= channel->flush_flush_bytes;\n\n    if(channel->flush_refund_bytes) {\n        int rc =\n            _libssh2_channel_receive_window_adjust(channel,\n                                                   channel->flush_refund_bytes,\n                                                   1, NULL);\n        if(rc == LIBSSH2_ERROR_EAGAIN)\n            return rc;\n    }\n\n    channel->flush_state = libssh2_NB_state_idle;\n\n    return channel->flush_flush_bytes;\n}\n\n/*\n * libssh2_channel_flush_ex\n *\n * Flush data from one (or all) stream\n * Returns number of bytes flushed, or negative on failure\n */\nLIBSSH2_API int\nlibssh2_channel_flush_ex(LIBSSH2_CHANNEL *channel, int stream)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 _libssh2_channel_flush(channel, stream));\n    return rc;\n}\n\n/*\n * libssh2_channel_get_exit_status\n *\n * Return the channel's program exit status. Note that the actual protocol\n * provides the full 32bit this function returns.  We cannot abuse it to\n * return error values in case of errors so we return a zero if channel is\n * NULL.\n */\nLIBSSH2_API int\nlibssh2_channel_get_exit_status(LIBSSH2_CHANNEL *channel)\n{\n    if(!channel)\n        return 0;\n\n    return channel->exit_status;\n}\n\n/*\n * libssh2_channel_get_exit_signal\n *\n * Get exit signal (without leading \"SIG\"), error message, and language\n * tag into newly allocated buffers of indicated length.  Caller can\n * use NULL pointers to indicate that the value should not be set.  The\n * *_len variables are set if they are non-NULL even if the\n * corresponding string parameter is NULL.  Returns LIBSSH2_ERROR_NONE\n * on success, or an API error code.\n */\nLIBSSH2_API int\nlibssh2_channel_get_exit_signal(LIBSSH2_CHANNEL *channel,\n                                char **exitsignal,\n                                size_t *exitsignal_len,\n                                char **errmsg,\n                                size_t *errmsg_len,\n                                char **langtag,\n                                size_t *langtag_len)\n{\n    size_t namelen = 0;\n\n    if(channel) {\n        LIBSSH2_SESSION *session = channel->session;\n\n        if(channel->exit_signal) {\n            namelen = strlen(channel->exit_signal);\n            if(exitsignal) {\n                *exitsignal = LIBSSH2_ALLOC(session, namelen + 1);\n                if(!*exitsignal) {\n                    return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                        \"Unable to allocate memory for signal name\");\n                }\n                memcpy(*exitsignal, channel->exit_signal, namelen);\n                (*exitsignal)[namelen] = '\\0';\n            }\n            if(exitsignal_len)\n                *exitsignal_len = namelen;\n        }\n        else {\n            if(exitsignal)\n                *exitsignal = NULL;\n            if(exitsignal_len)\n                *exitsignal_len = 0;\n        }\n\n        /* TODO: set error message and language tag */\n\n        if(errmsg)\n            *errmsg = NULL;\n\n        if(errmsg_len)\n            *errmsg_len = 0;\n\n        if(langtag)\n            *langtag = NULL;\n\n        if(langtag_len)\n            *langtag_len = 0;\n    }\n\n    return LIBSSH2_ERROR_NONE;\n}\n\n/*\n * _libssh2_channel_receive_window_adjust\n *\n * Adjust the receive window for a channel by adjustment bytes. If the amount\n * to be adjusted is less than LIBSSH2_CHANNEL_MINADJUST and force is 0 the\n * adjustment amount will be queued for a later packet.\n *\n * Calls _libssh2_error() !\n */\nint\n_libssh2_channel_receive_window_adjust(LIBSSH2_CHANNEL * channel,\n                                       uint32_t adjustment,\n                                       unsigned char force,\n                                       unsigned int *store)\n{\n    int rc;\n\n    if(store)\n        *store = channel->remote.window_size;\n\n    if(channel->adjust_state == libssh2_NB_state_idle) {\n        if(!force\n            && (adjustment + channel->adjust_queue <\n                LIBSSH2_CHANNEL_MINADJUST)) {\n            _libssh2_debug(channel->session, LIBSSH2_TRACE_CONN,\n                           \"Queueing %lu bytes for receive window adjustment \"\n                           \"for channel %lu/%lu\",\n                           adjustment, channel->local.id, channel->remote.id);\n            channel->adjust_queue += adjustment;\n            return 0;\n        }\n\n        if(!adjustment && !channel->adjust_queue) {\n            return 0;\n        }\n\n        adjustment += channel->adjust_queue;\n        channel->adjust_queue = 0;\n\n        /* Adjust the window based on the block we just freed */\n        channel->adjust_adjust[0] = SSH_MSG_CHANNEL_WINDOW_ADJUST;\n        _libssh2_htonu32(&channel->adjust_adjust[1], channel->remote.id);\n        _libssh2_htonu32(&channel->adjust_adjust[5], adjustment);\n        _libssh2_debug(channel->session, LIBSSH2_TRACE_CONN,\n                       \"Adjusting window %lu bytes for data on \"\n                       \"channel %lu/%lu\",\n                       adjustment, channel->local.id, channel->remote.id);\n\n        channel->adjust_state = libssh2_NB_state_created;\n    }\n\n    rc = _libssh2_transport_send(channel->session, channel->adjust_adjust, 9,\n                                 NULL, 0);\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        _libssh2_error(channel->session, rc,\n                       \"Would block sending window adjust\");\n        return rc;\n    }\n    else if(rc) {\n        channel->adjust_queue = adjustment;\n        return _libssh2_error(channel->session, LIBSSH2_ERROR_SOCKET_SEND,\n                              \"Unable to send transfer-window adjustment \"\n                              \"packet, deferring\");\n    }\n    else {\n        channel->remote.window_size += adjustment;\n    }\n\n    channel->adjust_state = libssh2_NB_state_idle;\n\n    return 0;\n}\n\n/*\n * libssh2_channel_receive_window_adjust\n *\n * DEPRECATED\n *\n * Adjust the receive window for a channel by adjustment bytes. If the amount\n * to be adjusted is less than LIBSSH2_CHANNEL_MINADJUST and force is 0 the\n * adjustment amount will be queued for a later packet.\n *\n * Returns the new size of the receive window (as understood by remote end).\n * Note that it might return EAGAIN too which is highly stupid.\n *\n */\nLIBSSH2_API unsigned long\nlibssh2_channel_receive_window_adjust(LIBSSH2_CHANNEL *channel,\n                                      unsigned long adj,\n                                      unsigned char force)\n{\n    unsigned int window;\n    int rc;\n\n    if(!channel)\n        return (unsigned long)LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 _libssh2_channel_receive_window_adjust(channel, adj,\n                                                        force, &window));\n\n    /* stupid - but this is how it was made to work before and this is just\n       kept for backwards compatibility */\n    return rc ? (unsigned long)rc : window;\n}\n\n/*\n * libssh2_channel_receive_window_adjust2\n *\n * Adjust the receive window for a channel by adjustment bytes. If the amount\n * to be adjusted is less than LIBSSH2_CHANNEL_MINADJUST and force is 0 the\n * adjustment amount will be queued for a later packet.\n *\n * Stores the new size of the receive window in the data 'window' points to.\n *\n * Returns the \"normal\" error code: 0 for success, negative for failure.\n */\nLIBSSH2_API int\nlibssh2_channel_receive_window_adjust2(LIBSSH2_CHANNEL *channel,\n                                       unsigned long adj,\n                                       unsigned char force,\n                                       unsigned int *window)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 _libssh2_channel_receive_window_adjust(channel, adj, force,\n                                                        window));\n    return rc;\n}\n\nint\n_libssh2_channel_extended_data(LIBSSH2_CHANNEL *channel, int ignore_mode)\n{\n    if(channel->extData2_state == libssh2_NB_state_idle) {\n        _libssh2_debug(channel->session, LIBSSH2_TRACE_CONN,\n                       \"Setting channel %lu/%lu handle_extended_data\"\n                       \" mode to %d\",\n                       channel->local.id, channel->remote.id, ignore_mode);\n        channel->remote.extended_data_ignore_mode = (char)ignore_mode;\n\n        channel->extData2_state = libssh2_NB_state_created;\n    }\n\n    if(channel->extData2_state == libssh2_NB_state_idle) {\n        if(ignore_mode == LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE) {\n            int rc =\n                _libssh2_channel_flush(channel,\n                                       LIBSSH2_CHANNEL_FLUSH_EXTENDED_DATA);\n            if(LIBSSH2_ERROR_EAGAIN == rc)\n                return rc;\n        }\n    }\n\n    channel->extData2_state = libssh2_NB_state_idle;\n    return 0;\n}\n\n/*\n * libssh2_channel_handle_extended_data2()\n *\n */\nLIBSSH2_API int\nlibssh2_channel_handle_extended_data2(LIBSSH2_CHANNEL *channel,\n                                      int mode)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session, _libssh2_channel_extended_data(channel,\n                                                                      mode));\n    return rc;\n}\n\n/*\n * libssh2_channel_handle_extended_data\n *\n * DEPRECATED DO NOTE USE!\n *\n * How should extended data look to the calling app?  Keep it in separate\n * channels[_read() _read_stdder()]? (NORMAL) Merge the extended data to the\n * standard data? [everything via _read()]? (MERGE) Ignore it entirely [toss\n * out packets as they come in]? (IGNORE)\n */\nLIBSSH2_API void\nlibssh2_channel_handle_extended_data(LIBSSH2_CHANNEL *channel,\n                                     int ignore_mode)\n{\n    (void)libssh2_channel_handle_extended_data2(channel, ignore_mode);\n}\n\n\n\n/*\n * _libssh2_channel_read\n *\n * Read data from a channel\n *\n * It is important to not return 0 until the currently read channel is\n * complete. If we read stuff from the wire but it was no payload data to fill\n * in the buffer with, we MUST make sure to return LIBSSH2_ERROR_EAGAIN.\n *\n * The receive window must be maintained (enlarged) by the user of this\n * function.\n */\nssize_t _libssh2_channel_read(LIBSSH2_CHANNEL *channel, int stream_id,\n                              char *buf, size_t buflen)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    int rc;\n    size_t bytes_read = 0;\n    size_t bytes_want;\n    int unlink_packet;\n    LIBSSH2_PACKET *read_packet;\n    LIBSSH2_PACKET *read_next;\n\n    _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                   \"channel_read() wants %d bytes from channel %lu/%lu \"\n                   \"stream #%d\",\n                   (int) buflen, channel->local.id, channel->remote.id,\n                   stream_id);\n\n    /* expand the receiving window first if it has become too narrow */\n    if((channel->read_state == libssh2_NB_state_jump1) ||\n       (channel->remote.window_size <\n        channel->remote.window_size_initial / 4 * 3 + buflen) ) {\n\n        uint32_t adjustment = channel->remote.window_size_initial + buflen -\n            channel->remote.window_size;\n        if(adjustment < LIBSSH2_CHANNEL_MINADJUST)\n            adjustment = LIBSSH2_CHANNEL_MINADJUST;\n\n        /* the actual window adjusting may not finish so we need to deal with\n           this special state here */\n        channel->read_state = libssh2_NB_state_jump1;\n        rc = _libssh2_channel_receive_window_adjust(channel, adjustment,\n                                                    0, NULL);\n        if(rc)\n            return rc;\n\n        channel->read_state = libssh2_NB_state_idle;\n    }\n\n    /* Process all pending incoming packets. Tests prove that this way\n       produces faster transfers. */\n    do {\n        rc = _libssh2_transport_read(session);\n    } while(rc > 0);\n\n    if((rc < 0) && (rc != LIBSSH2_ERROR_EAGAIN))\n        return _libssh2_error(session, rc, \"transport read\");\n\n    read_packet = _libssh2_list_first(&session->packets);\n    while(read_packet && (bytes_read < buflen)) {\n        /* previously this loop condition also checked for\n           !channel->remote.close but we cannot let it do this:\n\n           We may have a series of packets to read that are still pending even\n           if a close has been received. Acknowledging the close too early\n           makes us flush buffers prematurely and loose data.\n        */\n\n        LIBSSH2_PACKET *readpkt = read_packet;\n\n        /* In case packet gets destroyed during this iteration */\n        read_next = _libssh2_list_next(&readpkt->node);\n\n        if(readpkt->data_len < 5) {\n            read_packet = read_next;\n            _libssh2_debug(channel->session, LIBSSH2_TRACE_ERROR,\n                           \"Unexpected packet length\");\n            continue;\n        }\n\n        channel->read_local_id =\n            _libssh2_ntohu32(readpkt->data + 1);\n\n        /*\n         * Either we asked for a specific extended data stream\n         * (and data was available),\n         * or the standard stream (and data was available),\n         * or the standard stream with extended_data_merge\n         * enabled and data was available\n         */\n        if((stream_id\n             && (readpkt->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA)\n             && (channel->local.id == channel->read_local_id)\n             && (readpkt->data_len >= 9)\n             && (stream_id == (int) _libssh2_ntohu32(readpkt->data + 5)))\n            || (!stream_id && (readpkt->data[0] == SSH_MSG_CHANNEL_DATA)\n                && (channel->local.id == channel->read_local_id))\n            || (!stream_id\n                && (readpkt->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA)\n                && (channel->local.id == channel->read_local_id)\n                && (channel->remote.extended_data_ignore_mode ==\n                    LIBSSH2_CHANNEL_EXTENDED_DATA_MERGE))) {\n\n            /* figure out much more data we want to read */\n            bytes_want = buflen - bytes_read;\n            unlink_packet = FALSE;\n\n            if(bytes_want >= (readpkt->data_len - readpkt->data_head)) {\n                /* we want more than this node keeps, so adjust the number and\n                   delete this node after the copy */\n                bytes_want = readpkt->data_len - readpkt->data_head;\n                unlink_packet = TRUE;\n            }\n\n            _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                           \"channel_read() got %d of data from %lu/%lu/%d%s\",\n                           bytes_want, channel->local.id,\n                           channel->remote.id, stream_id,\n                           unlink_packet?\" [ul]\":\"\");\n\n            /* copy data from this struct to the target buffer */\n            memcpy(&buf[bytes_read],\n                   &readpkt->data[readpkt->data_head], bytes_want);\n\n            /* advance pointer and counter */\n            readpkt->data_head += bytes_want;\n            bytes_read += bytes_want;\n\n            /* if drained, remove from list */\n            if(unlink_packet) {\n                /* detach readpkt from session->packets list */\n                _libssh2_list_remove(&readpkt->node);\n\n                LIBSSH2_FREE(session, readpkt->data);\n                LIBSSH2_FREE(session, readpkt);\n            }\n        }\n\n        /* check the next struct in the chain */\n        read_packet = read_next;\n    }\n\n    if(!bytes_read) {\n        /* If the channel is already at EOF or even closed, we need to signal\n           that back. We may have gotten that info while draining the incoming\n           transport layer until EAGAIN so we must not be fooled by that\n           return code. */\n        if(channel->remote.eof || channel->remote.close)\n            return 0;\n        else if(rc != LIBSSH2_ERROR_EAGAIN)\n            return 0;\n\n        /* if the transport layer said EAGAIN then we say so as well */\n        return _libssh2_error(session, rc, \"would block\");\n    }\n\n    channel->read_avail -= bytes_read;\n    channel->remote.window_size -= bytes_read;\n\n    return bytes_read;\n}\n\n/*\n * libssh2_channel_read_ex\n *\n * Read data from a channel (blocking or non-blocking depending on set state)\n *\n * When this is done non-blocking, it is important to not return 0 until the\n * currently read channel is complete. If we read stuff from the wire but it\n * was no payload data to fill in the buffer with, we MUST make sure to return\n * LIBSSH2_ERROR_EAGAIN.\n *\n * This function will first make sure there's a receive window enough to\n * receive a full buffer's wort of contents. An application may choose to\n * adjust the receive window more to increase transfer performance.\n */\nLIBSSH2_API ssize_t\nlibssh2_channel_read_ex(LIBSSH2_CHANNEL *channel, int stream_id, char *buf,\n                        size_t buflen)\n{\n    int rc;\n    unsigned long recv_window;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    recv_window = libssh2_channel_window_read_ex(channel, NULL, NULL);\n\n    if(buflen > recv_window) {\n        BLOCK_ADJUST(rc, channel->session,\n                     _libssh2_channel_receive_window_adjust(channel, buflen,\n                                                            1, NULL));\n    }\n\n    BLOCK_ADJUST(rc, channel->session,\n                 _libssh2_channel_read(channel, stream_id, buf, buflen));\n    return rc;\n}\n\n/*\n * _libssh2_channel_packet_data_len\n *\n * Return the size of the data block of the current packet, or 0 if there\n * isn't a packet.\n */\nsize_t\n_libssh2_channel_packet_data_len(LIBSSH2_CHANNEL * channel, int stream_id)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    LIBSSH2_PACKET *read_packet;\n    LIBSSH2_PACKET *next_packet;\n    uint32_t read_local_id;\n\n    read_packet = _libssh2_list_first(&session->packets);\n    if(read_packet == NULL)\n        return 0;\n\n    while(read_packet) {\n\n        next_packet = _libssh2_list_next(&read_packet->node);\n\n        if(read_packet->data_len < 5) {\n            read_packet = next_packet;\n            _libssh2_debug(channel->session, LIBSSH2_TRACE_ERROR,\n                           \"Unexpected packet length\");\n            continue;\n        }\n\n        read_local_id = _libssh2_ntohu32(read_packet->data + 1);\n\n        /*\n         * Either we asked for a specific extended data stream\n         * (and data was available),\n         * or the standard stream (and data was available),\n         * or the standard stream with extended_data_merge\n         * enabled and data was available\n         */\n        if((stream_id\n             && (read_packet->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA)\n             && (channel->local.id == read_local_id)\n             && (read_packet->data_len >= 9)\n             && (stream_id == (int) _libssh2_ntohu32(read_packet->data + 5)))\n            ||\n            (!stream_id\n             && (read_packet->data[0] == SSH_MSG_CHANNEL_DATA)\n             && (channel->local.id == read_local_id))\n            ||\n            (!stream_id\n             && (read_packet->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA)\n             && (channel->local.id == read_local_id)\n             && (channel->remote.extended_data_ignore_mode\n                 == LIBSSH2_CHANNEL_EXTENDED_DATA_MERGE))) {\n            return (read_packet->data_len - read_packet->data_head);\n        }\n\n        read_packet = next_packet;\n    }\n\n    return 0;\n}\n\n/*\n * _libssh2_channel_write\n *\n * Send data to a channel. Note that if this returns EAGAIN, the caller must\n * call this function again with the SAME input arguments.\n *\n * Returns: number of bytes sent, or if it returns a negative number, that is\n * the error code!\n */\nssize_t\n_libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id,\n                       const unsigned char *buf, size_t buflen)\n{\n    int rc = 0;\n    LIBSSH2_SESSION *session = channel->session;\n    ssize_t wrote = 0; /* counter for this specific this call */\n\n    /* In theory we could split larger buffers into several smaller packets\n     * but it turns out to be really hard and nasty to do while still offering\n     * the API/prototype.\n     *\n     * Instead we only deal with the first 32K in this call and for the parent\n     * function to call it again with the remainder! 32K is a conservative\n     * limit based on the text in RFC4253 section 6.1.\n     */\n    if(buflen > 32700)\n        buflen = 32700;\n\n    if(channel->write_state == libssh2_NB_state_idle) {\n        unsigned char *s = channel->write_packet;\n\n        _libssh2_debug(channel->session, LIBSSH2_TRACE_CONN,\n                       \"Writing %d bytes on channel %lu/%lu, stream #%d\",\n                       (int) buflen, channel->local.id, channel->remote.id,\n                       stream_id);\n\n        if(channel->local.close)\n            return _libssh2_error(channel->session,\n                                  LIBSSH2_ERROR_CHANNEL_CLOSED,\n                                  \"We've already closed this channel\");\n        else if(channel->local.eof)\n            return _libssh2_error(channel->session,\n                                  LIBSSH2_ERROR_CHANNEL_EOF_SENT,\n                                  \"EOF has already been received, \"\n                                  \"data might be ignored\");\n\n        /* drain the incoming flow first, mostly to make sure we get all\n         * pending window adjust packets */\n        do\n            rc = _libssh2_transport_read(session);\n        while(rc > 0);\n\n        if((rc < 0) && (rc != LIBSSH2_ERROR_EAGAIN)) {\n            return _libssh2_error(channel->session, rc,\n                                  \"Failure while draining incoming flow\");\n        }\n\n        if(channel->local.window_size <= 0) {\n            /* there's no room for data so we stop */\n\n            /* Waiting on the socket to be writable would be wrong because we\n             * would be back here immediately, but a readable socket might\n             * herald an incoming window adjustment.\n             */\n            session->socket_block_directions = LIBSSH2_SESSION_BLOCK_INBOUND;\n\n            return (rc == LIBSSH2_ERROR_EAGAIN?rc:0);\n        }\n\n        channel->write_bufwrite = buflen;\n\n        *(s++) = stream_id ? SSH_MSG_CHANNEL_EXTENDED_DATA :\n            SSH_MSG_CHANNEL_DATA;\n        _libssh2_store_u32(&s, channel->remote.id);\n        if(stream_id)\n            _libssh2_store_u32(&s, stream_id);\n\n        /* Don't exceed the remote end's limits */\n        /* REMEMBER local means local as the SOURCE of the data */\n        if(channel->write_bufwrite > channel->local.window_size) {\n            _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                           \"Splitting write block due to %lu byte \"\n                           \"window_size on %lu/%lu/%d\",\n                           channel->local.window_size, channel->local.id,\n                           channel->remote.id, stream_id);\n            channel->write_bufwrite = channel->local.window_size;\n        }\n        if(channel->write_bufwrite > channel->local.packet_size) {\n            _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                           \"Splitting write block due to %lu byte \"\n                           \"packet_size on %lu/%lu/%d\",\n                           channel->local.packet_size, channel->local.id,\n                           channel->remote.id, stream_id);\n            channel->write_bufwrite = channel->local.packet_size;\n        }\n        /* store the size here only, the buffer is passed in as-is to\n           _libssh2_transport_send() */\n        _libssh2_store_u32(&s, channel->write_bufwrite);\n        channel->write_packet_len = s - channel->write_packet;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Sending %d bytes on channel %lu/%lu, stream_id=%d\",\n                       (int) channel->write_bufwrite, channel->local.id,\n                       channel->remote.id, stream_id);\n\n        channel->write_state = libssh2_NB_state_created;\n    }\n\n    if(channel->write_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, channel->write_packet,\n                                     channel->write_packet_len,\n                                     buf, channel->write_bufwrite);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return _libssh2_error(session, rc,\n                                  \"Unable to send channel data\");\n        }\n        else if(rc) {\n            channel->write_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, rc,\n                                  \"Unable to send channel data\");\n        }\n        /* Shrink local window size */\n        channel->local.window_size -= channel->write_bufwrite;\n\n        wrote += channel->write_bufwrite;\n\n        /* Since _libssh2_transport_write() succeeded, we must return\n           now to allow the caller to provide the next chunk of data.\n\n           We cannot move on to send the next piece of data that may\n           already have been provided in this same function call, as we\n           risk getting EAGAIN for that and we can't return information\n           both about sent data as well as EAGAIN. So, by returning short\n           now, the caller will call this function again with new data to\n           send */\n\n        channel->write_state = libssh2_NB_state_idle;\n\n        return wrote;\n    }\n\n    return LIBSSH2_ERROR_INVAL; /* reaching this point is really bad */\n}\n\n/*\n * libssh2_channel_write_ex\n *\n * Send data to a channel\n */\nLIBSSH2_API ssize_t\nlibssh2_channel_write_ex(LIBSSH2_CHANNEL *channel, int stream_id,\n                         const char *buf, size_t buflen)\n{\n    ssize_t rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session,\n                 _libssh2_channel_write(channel, stream_id,\n                                        (unsigned char *)buf, buflen));\n    return rc;\n}\n\n/*\n * channel_send_eof\n *\n * Send EOF on channel\n */\nstatic int channel_send_eof(LIBSSH2_CHANNEL *channel)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char packet[5];    /* packet_type(1) + channelno(4) */\n    int rc;\n\n    _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                   \"Sending EOF on channel %lu/%lu\",\n                   channel->local.id, channel->remote.id);\n    packet[0] = SSH_MSG_CHANNEL_EOF;\n    _libssh2_htonu32(packet + 1, channel->remote.id);\n    rc = _libssh2_transport_send(session, packet, 5, NULL, 0);\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        _libssh2_error(session, rc,\n                       \"Would block sending EOF\");\n        return rc;\n    }\n    else if(rc) {\n        return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                              \"Unable to send EOF on channel\");\n    }\n    channel->local.eof = 1;\n\n    return 0;\n}\n\n/*\n * libssh2_channel_send_eof\n *\n * Send EOF on channel\n */\nLIBSSH2_API int\nlibssh2_channel_send_eof(LIBSSH2_CHANNEL *channel)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session, channel_send_eof(channel));\n    return rc;\n}\n\n/*\n * libssh2_channel_eof\n *\n * Read channel's eof status\n */\nLIBSSH2_API int\nlibssh2_channel_eof(LIBSSH2_CHANNEL * channel)\n{\n    LIBSSH2_SESSION *session;\n    LIBSSH2_PACKET *packet;\n    LIBSSH2_PACKET *next_packet;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    session = channel->session;\n    packet = _libssh2_list_first(&session->packets);\n\n    while(packet) {\n\n        next_packet = _libssh2_list_next(&packet->node);\n\n        if(packet->data_len < 1) {\n            packet = next_packet;\n            _libssh2_debug(channel->session, LIBSSH2_TRACE_ERROR,\n                           \"Unexpected packet length\");\n            continue;\n        }\n\n        if(((packet->data[0] == SSH_MSG_CHANNEL_DATA)\n            || (packet->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA))\n            && ((packet->data_len >= 5)\n            && (channel->local.id == _libssh2_ntohu32(packet->data + 1)))) {\n            /* There's data waiting to be read yet, mask the EOF status */\n            return 0;\n        }\n        packet = next_packet;\n    }\n\n    return channel->remote.eof;\n}\n\n/*\n * channel_wait_eof\n *\n * Awaiting channel EOF\n */\nstatic int channel_wait_eof(LIBSSH2_CHANNEL *channel)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    int rc;\n\n    if(channel->wait_eof_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Awaiting EOF for channel %lu/%lu\", channel->local.id,\n                       channel->remote.id);\n\n        channel->wait_eof_state = libssh2_NB_state_created;\n    }\n\n    /*\n     * While channel is not eof, read more packets from the network.\n     * Either the EOF will be set or network timeout will occur.\n     */\n    do {\n        if(channel->remote.eof) {\n            break;\n        }\n\n        if((channel->remote.window_size == channel->read_avail) &&\n            session->api_block_mode)\n            return _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_WINDOW_FULL,\n                                  \"Receiving channel window \"\n                                  \"has been exhausted\");\n\n        rc = _libssh2_transport_read(session);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc < 0) {\n            channel->wait_eof_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, rc,\n                                  \"_libssh2_transport_read() bailed out!\");\n        }\n    } while(1);\n\n    channel->wait_eof_state = libssh2_NB_state_idle;\n\n    return 0;\n}\n\n/*\n * libssh2_channel_wait_eof\n *\n * Awaiting channel EOF\n */\nLIBSSH2_API int\nlibssh2_channel_wait_eof(LIBSSH2_CHANNEL *channel)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session, channel_wait_eof(channel));\n    return rc;\n}\n\nint _libssh2_channel_close(LIBSSH2_CHANNEL * channel)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    int rc = 0;\n\n    if(channel->local.close) {\n        /* Already closed, act like we sent another close,\n         * even though we didn't... shhhhhh */\n        channel->close_state = libssh2_NB_state_idle;\n        return 0;\n    }\n\n    if(!channel->local.eof) {\n        rc = channel_send_eof(channel);\n        if(rc) {\n            if(rc == LIBSSH2_ERROR_EAGAIN) {\n                return rc;\n            }\n            _libssh2_error(session, rc,\n                \"Unable to send EOF, but closing channel anyway\");\n        }\n    }\n\n    /* ignore if we have received a remote eof or not, as it is now too\n       late for us to wait for it. Continue closing! */\n\n    if(channel->close_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN, \"Closing channel %lu/%lu\",\n                       channel->local.id, channel->remote.id);\n\n        channel->close_packet[0] = SSH_MSG_CHANNEL_CLOSE;\n        _libssh2_htonu32(channel->close_packet + 1, channel->remote.id);\n\n        channel->close_state = libssh2_NB_state_created;\n    }\n\n    if(channel->close_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, channel->close_packet, 5,\n                                     NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, rc,\n                           \"Would block sending close-channel\");\n            return rc;\n\n        }\n        else if(rc) {\n            _libssh2_error(session, rc,\n                           \"Unable to send close-channel request, \"\n                           \"but closing anyway\");\n            /* skip waiting for the response and fall through to\n               LIBSSH2_CHANNEL_CLOSE below */\n\n        }\n        else\n            channel->close_state = libssh2_NB_state_sent;\n    }\n\n    if(channel->close_state == libssh2_NB_state_sent) {\n        /* We must wait for the remote SSH_MSG_CHANNEL_CLOSE message */\n\n        while(!channel->remote.close && !rc &&\n               (session->socket_state != LIBSSH2_SOCKET_DISCONNECTED))\n            rc = _libssh2_transport_read(session);\n    }\n\n    if(rc != LIBSSH2_ERROR_EAGAIN) {\n        /* set the local close state first when we're perfectly confirmed to\n           not do any more EAGAINs */\n        channel->local.close = 1;\n\n        /* We call the callback last in this function to make it keep the local\n           data as long as EAGAIN is returned. */\n        if(channel->close_cb) {\n            LIBSSH2_CHANNEL_CLOSE(session, channel);\n        }\n\n        channel->close_state = libssh2_NB_state_idle;\n    }\n\n    /* return 0 or an error */\n    return rc >= 0 ? 0 : rc;\n}\n\n/*\n * libssh2_channel_close\n *\n * Close a channel\n */\nLIBSSH2_API int\nlibssh2_channel_close(LIBSSH2_CHANNEL *channel)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session, _libssh2_channel_close(channel) );\n    return rc;\n}\n\n/*\n * channel_wait_closed\n *\n * Awaiting channel close after EOF\n */\nstatic int channel_wait_closed(LIBSSH2_CHANNEL *channel)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    int rc;\n\n    if(!channel->remote.eof) {\n        return _libssh2_error(session, LIBSSH2_ERROR_INVAL,\n                              \"libssh2_channel_wait_closed() invoked when \"\n                              \"channel is not in EOF state\");\n    }\n\n    if(channel->wait_closed_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Awaiting close of channel %lu/%lu\", channel->local.id,\n                       channel->remote.id);\n\n        channel->wait_closed_state = libssh2_NB_state_created;\n    }\n\n    /*\n     * While channel is not closed, read more packets from the network.\n     * Either the channel will be closed or network timeout will occur.\n     */\n    if(!channel->remote.close) {\n        do {\n            rc = _libssh2_transport_read(session);\n            if(channel->remote.close)\n                /* it is now closed, move on! */\n                break;\n        } while(rc > 0);\n        if(rc < 0)\n            return rc;\n    }\n\n    channel->wait_closed_state = libssh2_NB_state_idle;\n\n    return 0;\n}\n\n/*\n * libssh2_channel_wait_closed\n *\n * Awaiting channel close after EOF\n */\nLIBSSH2_API int\nlibssh2_channel_wait_closed(LIBSSH2_CHANNEL *channel)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session, channel_wait_closed(channel));\n    return rc;\n}\n\n/*\n * _libssh2_channel_free\n *\n * Make sure a channel is closed, then remove the channel from the session\n * and free its resource(s)\n *\n * Returns 0 on success, negative on failure\n */\nint _libssh2_channel_free(LIBSSH2_CHANNEL *channel)\n{\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char channel_id[4];\n    unsigned char *data;\n    size_t data_len;\n    int rc;\n\n    assert(session);\n\n    if(channel->free_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Freeing channel %lu/%lu resources\", channel->local.id,\n                       channel->remote.id);\n\n        channel->free_state = libssh2_NB_state_created;\n    }\n\n    /* Allow channel freeing even when the socket has lost its connection */\n    if(!channel->local.close\n        && (session->socket_state == LIBSSH2_SOCKET_CONNECTED)) {\n        rc = _libssh2_channel_close(channel);\n\n        if(rc == LIBSSH2_ERROR_EAGAIN)\n            return rc;\n\n        /* ignore all other errors as they otherwise risk blocking the channel\n           free from happening */\n    }\n\n    channel->free_state = libssh2_NB_state_idle;\n\n    if(channel->exit_signal) {\n        LIBSSH2_FREE(session, channel->exit_signal);\n    }\n\n    /*\n     * channel->remote.close *might* not be set yet, Well...\n     * We've sent the close packet, what more do you want?\n     * Just let packet_add ignore it when it finally arrives\n     */\n\n    /* Clear out packets meant for this channel */\n    _libssh2_htonu32(channel_id, channel->local.id);\n    while((_libssh2_packet_ask(session, SSH_MSG_CHANNEL_DATA, &data,\n                                &data_len, 1, channel_id, 4) >= 0)\n           ||\n           (_libssh2_packet_ask(session, SSH_MSG_CHANNEL_EXTENDED_DATA, &data,\n                                &data_len, 1, channel_id, 4) >= 0)) {\n        LIBSSH2_FREE(session, data);\n    }\n\n    /* free \"channel_type\" */\n    if(channel->channel_type) {\n        LIBSSH2_FREE(session, channel->channel_type);\n    }\n\n    /* Unlink from channel list */\n    _libssh2_list_remove(&channel->node);\n\n    /*\n     * Make sure all memory used in the state variables are free\n     */\n    if(channel->setenv_packet) {\n        LIBSSH2_FREE(session, channel->setenv_packet);\n    }\n    if(channel->reqX11_packet) {\n        LIBSSH2_FREE(session, channel->reqX11_packet);\n    }\n    if(channel->process_packet) {\n        LIBSSH2_FREE(session, channel->process_packet);\n    }\n\n    LIBSSH2_FREE(session, channel);\n\n    return 0;\n}\n\n/*\n * libssh2_channel_free\n *\n * Make sure a channel is closed, then remove the channel from the session\n * and free its resource(s)\n *\n * Returns 0 on success, negative on failure\n */\nLIBSSH2_API int\nlibssh2_channel_free(LIBSSH2_CHANNEL *channel)\n{\n    int rc;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, channel->session, _libssh2_channel_free(channel));\n    return rc;\n}\n/*\n * libssh2_channel_window_read_ex\n *\n * Check the status of the read window. Returns the number of bytes which the\n * remote end may send without overflowing the window limit read_avail (if\n * passed) will be populated with the number of bytes actually available to be\n * read window_size_initial (if passed) will be populated with the\n * window_size_initial as defined by the channel_open request\n */\nLIBSSH2_API unsigned long\nlibssh2_channel_window_read_ex(LIBSSH2_CHANNEL *channel,\n                               unsigned long *read_avail,\n                               unsigned long *window_size_initial)\n{\n    if(!channel)\n        return 0; /* no channel, no window! */\n\n    if(window_size_initial) {\n        *window_size_initial = channel->remote.window_size_initial;\n    }\n\n    if(read_avail) {\n        size_t bytes_queued = 0;\n        LIBSSH2_PACKET *next_packet;\n        LIBSSH2_PACKET *packet =\n            _libssh2_list_first(&channel->session->packets);\n\n        while(packet) {\n            unsigned char packet_type;\n               next_packet = _libssh2_list_next(&packet->node);\n\n            if(packet->data_len < 1) {\n                packet = next_packet;\n                _libssh2_debug(channel->session, LIBSSH2_TRACE_ERROR,\n                               \"Unexpected packet length\");\n                continue;\n            }\n\n            packet_type = packet->data[0];\n\n            if(((packet_type == SSH_MSG_CHANNEL_DATA)\n                || (packet_type == SSH_MSG_CHANNEL_EXTENDED_DATA))\n               && ((packet->data_len >= 5)\n                   && (_libssh2_ntohu32(packet->data + 1) ==\n                       channel->local.id))) {\n                bytes_queued += packet->data_len - packet->data_head;\n            }\n\n            packet = next_packet;\n        }\n\n        *read_avail = bytes_queued;\n    }\n\n    return channel->remote.window_size;\n}\n\n/*\n * libssh2_channel_window_write_ex\n *\n * Check the status of the write window Returns the number of bytes which may\n * be safely written on the channel without blocking window_size_initial (if\n * passed) will be populated with the size of the initial window as defined by\n * the channel_open request\n */\nLIBSSH2_API unsigned long\nlibssh2_channel_window_write_ex(LIBSSH2_CHANNEL *channel,\n                                unsigned long *window_size_initial)\n{\n    if(!channel)\n        return 0; /* no channel, no window! */\n\n    if(window_size_initial) {\n        /* For locally initiated channels this is very often 0, so it's not\n         * *that* useful as information goes */\n        *window_size_initial = channel->local.window_size_initial;\n    }\n\n    return channel->local.window_size;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/channel.h",
    "content": "#ifndef __LIBSSH2_CHANNEL_H\n#define __LIBSSH2_CHANNEL_H\n/* Copyright (c) 2008-2010 by Daniel Stenberg\n *\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/*\n * _libssh2_channel_receive_window_adjust\n *\n * Adjust the receive window for a channel by adjustment bytes. If the amount\n * to be adjusted is less than LIBSSH2_CHANNEL_MINADJUST and force is 0 the\n * adjustment amount will be queued for a later packet.\n *\n * Always non-blocking.\n */\nint _libssh2_channel_receive_window_adjust(LIBSSH2_CHANNEL * channel,\n                                           uint32_t adjustment,\n                                           unsigned char force,\n                                           unsigned int *store);\n\n/*\n * _libssh2_channel_flush\n *\n * Flush data from one (or all) stream\n * Returns number of bytes flushed, or negative on failure\n */\nint _libssh2_channel_flush(LIBSSH2_CHANNEL *channel, int streamid);\n\n/*\n * _libssh2_channel_free\n *\n * Make sure a channel is closed, then remove the channel from the session\n * and free its resource(s)\n *\n * Returns 0 on success, negative on failure\n */\nint _libssh2_channel_free(LIBSSH2_CHANNEL *channel);\n\nint\n_libssh2_channel_extended_data(LIBSSH2_CHANNEL *channel, int ignore_mode);\n\n/*\n * _libssh2_channel_write\n *\n * Send data to a channel\n */\nssize_t\n_libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id,\n                       const unsigned char *buf, size_t buflen);\n\n/*\n * _libssh2_channel_open\n *\n * Establish a generic session channel\n */\nLIBSSH2_CHANNEL *\n_libssh2_channel_open(LIBSSH2_SESSION * session, const char *channel_type,\n                      uint32_t channel_type_len,\n                      uint32_t window_size,\n                      uint32_t packet_size,\n                      const unsigned char *message, size_t message_len);\n\n\n/*\n * _libssh2_channel_process_startup\n *\n * Primitive for libssh2_channel_(shell|exec|subsystem)\n */\nint\n_libssh2_channel_process_startup(LIBSSH2_CHANNEL *channel,\n                                 const char *request, size_t request_len,\n                                 const char *message, size_t message_len);\n\n/*\n * _libssh2_channel_read\n *\n * Read data from a channel\n *\n * It is important to not return 0 until the currently read channel is\n * complete. If we read stuff from the wire but it was no payload data to fill\n * in the buffer with, we MUST make sure to return PACKET_EAGAIN.\n */\nssize_t _libssh2_channel_read(LIBSSH2_CHANNEL *channel, int stream_id,\n                              char *buf, size_t buflen);\n\nuint32_t _libssh2_channel_nextid(LIBSSH2_SESSION * session);\n\nLIBSSH2_CHANNEL *_libssh2_channel_locate(LIBSSH2_SESSION * session,\n                                         uint32_t channel_id);\n\nsize_t _libssh2_channel_packet_data_len(LIBSSH2_CHANNEL * channel,\n                                        int stream_id);\n\nint _libssh2_channel_close(LIBSSH2_CHANNEL * channel);\n\n/*\n * _libssh2_channel_forward_cancel\n *\n * Stop listening on a remote port and free the listener\n * Toss out any pending (un-accept()ed) connections\n *\n * Return 0 on success, LIBSSH2_ERROR_EAGAIN if would block, -1 on error\n */\nint _libssh2_channel_forward_cancel(LIBSSH2_LISTENER *listener);\n\n#endif /* __LIBSSH2_CHANNEL_H */\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/checksrc.pl",
    "content": "#!/usr/bin/env perl\n#***************************************************************************\n#                                  _   _ ____  _\n#  Project                     ___| | | |  _ \\| |\n#                             / __| | | | |_) | |\n#                            | (__| |_| |  _ <| |___\n#                             \\___|\\___/|_| \\_\\_____|\n#\n# Copyright (C) 2011 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.\n#\n# This software is licensed as described in the file COPYING, which\n# you should have received as part of this distribution. The terms\n# are also available at https://curl.haxx.se/docs/copyright.html.\n#\n# You may opt to use, copy, modify, merge, publish, distribute and/or sell\n# copies of the Software, and permit persons to whom the Software is\n# furnished to do so, under the terms of the COPYING file.\n#\n# This software is distributed on an \"AS IS\" basis, WITHOUT WARRANTY OF ANY\n# KIND, either express or implied.\n#\n###########################################################################\n\nuse strict;\nuse warnings;\n\nmy $max_column = 79;\nmy $indent = 2;\n\nmy $warnings = 0;\nmy $swarnings = 0;\nmy $errors = 0;\nmy $serrors = 0;\nmy $suppressed; # whitelisted problems\nmy $file;\nmy $dir=\".\";\nmy $wlist=\"\";\nmy @alist;\nmy $windows_os = $^O eq 'MSWin32' || $^O eq 'msys' || $^O eq 'cygwin';\nmy $verbose;\nmy %whitelist;\n\nmy %ignore;\nmy %ignore_set;\nmy %ignore_used;\nmy @ignore_line;\n\nmy %warnings_extended = (\n    'COPYRIGHTYEAR'    => 'copyright year incorrect',\n    );\n\nmy %warnings = (\n    'LONGLINE'         => \"Line longer than $max_column\",\n    'TABS'             => 'TAB characters not allowed',\n    'TRAILINGSPACE'    => 'Trailing white space on the line',\n    'CPPCOMMENTS'      => '// comment detected',\n    'SPACEBEFOREPAREN' => 'space before an open parenthesis',\n    'SPACEAFTERPAREN'  => 'space after open parenthesis',\n    'SPACEBEFORECLOSE' => 'space before a close parenthesis',\n    'SPACEBEFORECOMMA' => 'space before a comma',\n    'RETURNNOSPACE'    => 'return without space',\n    'COMMANOSPACE'     => 'comma without following space',\n    'BRACEELSE'        => '} else on the same line',\n    'PARENBRACE'       => '){ without sufficient space',\n    'SPACESEMICOLON'   => 'space before semicolon',\n    'BANNEDFUNC'       => 'a banned function was used',\n    'FOPENMODE'        => 'fopen needs a macro for the mode string',\n    'BRACEPOS'         => 'wrong position for an open brace',\n    'INDENTATION'      => 'wrong start column for code',\n    'COPYRIGHT'        => 'file missing a copyright statement',\n    'BADCOMMAND'       => 'bad !checksrc! instruction',\n    'UNUSEDIGNORE'     => 'a warning ignore was not used',\n    'OPENCOMMENT'      => 'file ended with a /* comment still \"open\"',\n    'ASTERISKSPACE'    => 'pointer declared with space after asterisk',\n    'ASTERISKNOSPACE'  => 'pointer declared without space before asterisk',\n    'ASSIGNWITHINCONDITION' => 'assignment within conditional expression',\n    'EQUALSNOSPACE'    => 'equals sign without following space',\n    'NOSPACEEQUALS'    => 'equals sign without preceding space',\n    'SEMINOSPACE'      => 'semicolon without following space',\n    'MULTISPACE'       => 'multiple spaces used when not suitable',\n    'SIZEOFNOPAREN'    => 'use of sizeof without parentheses',\n    'SNPRINTF'         => 'use of snprintf',\n    );\n\nsub readwhitelist {\n    open(W, \"<$dir/checksrc.whitelist\") or return;\n    my @all=<W>;\n    for(@all) {\n        $windows_os ? $_ =~ s/\\r?\\n$// : chomp;\n        $whitelist{$_}=1;\n    }\n    close(W);\n}\n\n# Reads the .checksrc in $dir for any extended warnings to enable locally.\n# Currently there is no support for disabling warnings from the standard set,\n# and since that's already handled via !checksrc! commands there is probably\n# little use to add it.\nsub readlocalfile {\n    my $i = 0;\n\n    open(my $rcfile, \"<\", \"$dir/.checksrc\") or return;\n\n    while(<$rcfile>) {\n        $i++;\n\n        # Lines starting with '#' are considered comments\n        if (/^\\s*(#.*)/) {\n            next;\n        }\n        elsif (/^\\s*enable ([A-Z]+)$/) {\n            if(!defined($warnings_extended{$1})) {\n                print STDERR \"invalid warning specified in .checksrc: \\\"$1\\\"\\n\";\n                next;\n            }\n            $warnings{$1} = $warnings_extended{$1};\n        }\n        else {\n            die \"Invalid format in $dir/.checksrc on line $i\\n\";\n        }\n    }\n}\n\nsub checkwarn {\n    my ($name, $num, $col, $file, $line, $msg, $error) = @_;\n\n    my $w=$error?\"error\":\"warning\";\n    my $nowarn=0;\n\n    #if(!$warnings{$name}) {\n    #    print STDERR \"Dev! there's no description for $name!\\n\";\n    #}\n\n    # checksrc.whitelist\n    if($whitelist{$line}) {\n        $nowarn = 1;\n    }\n    # !checksrc! controlled\n    elsif($ignore{$name}) {\n        $ignore{$name}--;\n        $ignore_used{$name}++;\n        $nowarn = 1;\n        if(!$ignore{$name}) {\n            # reached zero, enable again\n            enable_warn($name, $num, $file, $line);\n        }\n    }\n\n    if($nowarn) {\n        $suppressed++;\n        if($w) {\n            $swarnings++;\n        }\n        else {\n            $serrors++;\n        }\n        return;\n    }\n\n    if($w) {\n        $warnings++;\n    }\n    else {\n        $errors++;\n    }\n\n    $col++;\n    print \"$file:$num:$col: $w: $msg ($name)\\n\";\n    print \" $line\\n\";\n\n    if($col < 80) {\n        my $pref = (' ' x $col);\n        print \"${pref}^\\n\";\n    }\n}\n\n$file = shift @ARGV;\n\nwhile(1) {\n\n    if($file =~ /-D(.*)/) {\n        $dir = $1;\n        $file = shift @ARGV;\n        next;\n    }\n    elsif($file =~ /-W(.*)/) {\n        $wlist .= \" $1 \";\n        $file = shift @ARGV;\n        next;\n    }\n    elsif($file =~ /-A(.+)/) {\n        push @alist, $1;\n        $file = shift @ARGV;\n        next;\n    }\n    elsif($file =~ /-i([1-9])/) {\n        $indent = $1 + 0;\n        $file = shift @ARGV;\n        next;\n    }\n    elsif($file =~ /-m([0-9]+)/) {\n        $max_column = $1 + 0;\n        $file = shift @ARGV;\n        next;\n    }\n    elsif($file =~ /^(-h|--help)/) {\n        undef $file;\n        last;\n    }\n\n    last;\n}\n\nif(!$file) {\n    print \"checksrc.pl [option] <file1> [file2] ...\\n\";\n    print \" Options:\\n\";\n    print \"  -A[rule]  Accept this violation, can be used multiple times\\n\";\n    print \"  -D[DIR]   Directory to prepend file names\\n\";\n    print \"  -h        Show help output\\n\";\n    print \"  -W[file]  Whitelist the given file - ignore all its flaws\\n\";\n    print \"  -i<n>     Indent spaces. Default: 2\\n\";\n    print \"  -m<n>     Maximum line length. Default: 79\\n\";\n    print \"\\nDetects and warns for these problems:\\n\";\n    for(sort keys %warnings) {\n        printf (\" %-18s: %s\\n\", $_, $warnings{$_});\n    }\n    exit;\n}\n\nreadwhitelist();\nreadlocalfile();\n\ndo {\n    if(\"$wlist\" !~ / $file /) {\n        my $fullname = $file;\n        $fullname = \"$dir/$file\" if ($fullname !~ '^\\.?\\.?/');\n        scanfile($fullname);\n    }\n    $file = shift @ARGV;\n\n} while($file);\n\nsub accept_violations {\n    for my $r (@alist) {\n        if(!$warnings{$r}) {\n            print \"'$r' is not a warning to accept!\\n\";\n            exit;\n        }\n        $ignore{$r}=999999;\n        $ignore_used{$r}=0;\n    }\n}\n\nsub checksrc_clear {\n    undef %ignore;\n    undef %ignore_set;\n    undef @ignore_line;\n}\n\nsub checksrc_endoffile {\n    my ($file) = @_;\n    for(keys %ignore_set) {\n        if($ignore_set{$_} && !$ignore_used{$_}) {\n            checkwarn(\"UNUSEDIGNORE\", $ignore_set{$_},\n                      length($_)+11, $file,\n                      $ignore_line[$ignore_set{$_}],\n                      \"Unused ignore: $_\");\n        }\n    }\n}\n\nsub enable_warn {\n    my ($what, $line, $file, $l) = @_;\n\n    # switch it back on, but warn if not triggered!\n    if(!$ignore_used{$what}) {\n        checkwarn(\"UNUSEDIGNORE\",\n                  $line, length($what) + 11, $file, $l,\n                  \"No warning was inhibited!\");\n    }\n    $ignore_set{$what}=0;\n    $ignore_used{$what}=0;\n    $ignore{$what}=0;\n}\nsub checksrc {\n    my ($cmd, $line, $file, $l) = @_;\n    if($cmd =~ / *([^ ]*) *(.*)/) {\n        my ($enable, $what) = ($1, $2);\n        $what =~ s: *\\*/$::; # cut off end of C comment\n        # print \"ENABLE $enable WHAT $what\\n\";\n        if($enable eq \"disable\") {\n            my ($warn, $scope)=($1, $2);\n            if($what =~ /([^ ]*) +(.*)/) {\n                ($warn, $scope)=($1, $2);\n            }\n            else {\n                $warn = $what;\n                $scope = 1;\n            }\n            # print \"IGNORE $warn for SCOPE $scope\\n\";\n            if($scope eq \"all\") {\n                $scope=999999;\n            }\n\n            # Comparing for a literal zero rather than the scalar value zero\n            # covers the case where $scope contains the ending '*' from the\n            # comment. If we use a scalar comparison (==) we induce warnings\n            # on non-scalar contents.\n            if($scope eq \"0\") {\n                checkwarn(\"BADCOMMAND\",\n                          $line, 0, $file, $l,\n                          \"Disable zero not supported, did you mean to enable?\");\n            }\n            elsif($ignore_set{$warn}) {\n                checkwarn(\"BADCOMMAND\",\n                          $line, 0, $file, $l,\n                          \"$warn already disabled from line $ignore_set{$warn}\");\n            }\n            else {\n                $ignore{$warn}=$scope;\n                $ignore_set{$warn}=$line;\n                $ignore_line[$line]=$l;\n            }\n        }\n        elsif($enable eq \"enable\") {\n            enable_warn($what, $line, $file, $l);\n        }\n        else {\n            checkwarn(\"BADCOMMAND\",\n                      $line, 0, $file, $l,\n                      \"Illegal !checksrc! command\");\n        }\n    }\n}\n\nsub nostrings {\n    my ($str) = @_;\n    $str =~ s/\\\".*\\\"//g;\n    return $str;\n}\n\nsub scanfile {\n    my ($file) = @_;\n\n    my $line = 1;\n    my $prevl=\"\";\n    my $l;\n    open(R, \"<$file\") || die \"failed to open $file\";\n\n    my $incomment=0;\n    my @copyright=();\n    checksrc_clear(); # for file based ignores\n    accept_violations();\n\n    while(<R>) {\n        $windows_os ? $_ =~ s/\\r?\\n$// : chomp;\n        my $l = $_;\n        my $ol = $l; # keep the unmodified line for error reporting\n        my $column = 0;\n\n        # check for !checksrc! commands\n        if($l =~ /\\!checksrc\\! (.*)/) {\n            my $cmd = $1;\n            checksrc($cmd, $line, $file, $l)\n        }\n\n        # check for a copyright statement and save the years\n        if($l =~ /\\* +copyright .* \\d\\d\\d\\d/i) {\n            while($l =~ /([\\d]{4})/g) {\n                push @copyright, {\n                  year => $1,\n                  line => $line,\n                  col => index($l, $1),\n                  code => $l\n                };\n            }\n        }\n\n        # detect long lines\n        if(length($l) > $max_column) {\n            checkwarn(\"LONGLINE\", $line, length($l), $file, $l,\n                      \"Longer than $max_column columns\");\n        }\n        # detect TAB characters\n        if($l =~ /^(.*)\\t/) {\n            checkwarn(\"TABS\",\n                      $line, length($1), $file, $l, \"Contains TAB character\", 1);\n        }\n        # detect trailing white space\n        if($l =~ /^(.*)[ \\t]+\\z/) {\n            checkwarn(\"TRAILINGSPACE\",\n                      $line, length($1), $file, $l, \"Trailing whitespace\");\n        }\n\n        # ------------------------------------------------------------\n        # Above this marker, the checks were done on lines *including*\n        # comments\n        # ------------------------------------------------------------\n\n        # strip off C89 comments\n\n      comment:\n        if(!$incomment) {\n            if($l =~ s/\\/\\*.*\\*\\// /g) {\n                # full /* comments */ were removed!\n            }\n            if($l =~ s/\\/\\*.*//) {\n                # start of /* comment was removed\n                $incomment = 1;\n            }\n        }\n        else {\n            if($l =~ s/.*\\*\\///) {\n                # end of comment */ was removed\n                $incomment = 0;\n                goto comment;\n            }\n            else {\n                # still within a comment\n                $l=\"\";\n            }\n        }\n\n        # ------------------------------------------------------------\n        # Below this marker, the checks were done on lines *without*\n        # comments\n        # ------------------------------------------------------------\n\n        # crude attempt to detect // comments without too many false\n        # positives\n        if($l =~ /^([^\"\\*]*)[^:\"]\\/\\//) {\n            checkwarn(\"CPPCOMMENTS\",\n                      $line, length($1), $file, $l, \"\\/\\/ comment\");\n        }\n\n        my $nostr = nostrings($l);\n        # check spaces after for/if/while/function call\n        if($nostr =~ /^(.*)(for|if|while| ([a-zA-Z0-9_]+)) \\((.)/) {\n            if($1 =~ / *\\#/) {\n                # this is a #if, treat it differently\n            }\n            elsif(defined $3 && $3 eq \"return\") {\n                # return must have a space\n            }\n            elsif(defined $3 && $3 eq \"case\") {\n                # case must have a space\n            }\n            elsif($4 eq \"*\") {\n                # (* beginning makes the space OK!\n            }\n            elsif($1 =~ / *typedef/) {\n                # typedefs can use space-paren\n            }\n            else {\n                checkwarn(\"SPACEBEFOREPAREN\", $line, length($1)+length($2), $file, $l,\n                          \"$2 with space\");\n            }\n        }\n\n        if($nostr =~ /^((.*)(if) *\\()(.*)\\)/) {\n            my $pos = length($1);\n            if($4 =~ / = /) {\n                checkwarn(\"ASSIGNWITHINCONDITION\",\n                          $line, $pos+1, $file, $l,\n                          \"assignment within conditional expression\");\n            }\n        }\n        # check spaces after open parentheses\n        if($l =~ /^(.*[a-z])\\( /i) {\n            checkwarn(\"SPACEAFTERPAREN\",\n                      $line, length($1)+1, $file, $l,\n                      \"space after open parenthesis\");\n        }\n\n        # check spaces before close parentheses, unless it was a space or a\n        # close parenthesis!\n        if($l =~ /(.*[^\\) ]) \\)/) {\n            checkwarn(\"SPACEBEFORECLOSE\",\n                      $line, length($1)+1, $file, $l,\n                      \"space before close parenthesis\");\n        }\n\n        # check spaces before comma!\n        if($l =~ /(.*[^ ]) ,/) {\n            checkwarn(\"SPACEBEFORECOMMA\",\n                      $line, length($1)+1, $file, $l,\n                      \"space before comma\");\n        }\n\n        # check for \"return(\" without space\n        if($l =~ /^(.*)return\\(/) {\n            if($1 =~ / *\\#/) {\n                # this is a #if, treat it differently\n            }\n            else {\n                checkwarn(\"RETURNNOSPACE\", $line, length($1)+6, $file, $l,\n                          \"return without space before paren\");\n            }\n        }\n\n        # check for \"sizeof\" without parenthesis\n        if(($l =~ /^(.*)sizeof *([ (])/) && ($2 ne \"(\")) {\n            if($1 =~ / *\\#/) {\n                # this is a #if, treat it differently\n            }\n            else {\n                checkwarn(\"SIZEOFNOPAREN\", $line, length($1)+6, $file, $l,\n                          \"sizeof without parenthesis\");\n            }\n        }\n\n        # check for comma without space\n        if($l =~ /^(.*),[^ \\n]/) {\n            my $pref=$1;\n            my $ign=0;\n            if($pref =~ / *\\#/) {\n                # this is a #if, treat it differently\n                $ign=1;\n            }\n            elsif($pref =~ /\\/\\*/) {\n                # this is a comment\n                $ign=1;\n            }\n            elsif($pref =~ /[\\\"\\']/) {\n                $ign = 1;\n                # There is a quote here, figure out whether the comma is\n                # within a string or '' or not.\n                if($pref =~ /\\\"/) {\n                    # within a string\n                }\n                elsif($pref =~ /\\'$/) {\n                    # a single letter\n                }\n                else {\n                    $ign = 0;\n                }\n            }\n            if(!$ign) {\n                checkwarn(\"COMMANOSPACE\", $line, length($pref)+1, $file, $l,\n                          \"comma without following space\");\n            }\n        }\n\n        # check for \"} else\"\n        if($l =~ /^(.*)\\} *else/) {\n            checkwarn(\"BRACEELSE\",\n                      $line, length($1), $file, $l, \"else after closing brace on same line\");\n        }\n        # check for \"){\"\n        if($l =~ /^(.*)\\)\\{/) {\n            checkwarn(\"PARENBRACE\",\n                      $line, length($1)+1, $file, $l, \"missing space after close paren\");\n        }\n\n        # check for space before the semicolon last in a line\n        if($l =~ /^(.*[^ ].*) ;$/) {\n            checkwarn(\"SPACESEMICOLON\",\n                      $line, length($1), $file, $ol, \"space before last semicolon\");\n        }\n\n        # scan for use of banned functions\n        if($l =~ /^(.*\\W)\n                   (gets|\n                    strtok|\n                    v?sprintf|\n                    (str|_mbs|_tcs|_wcs)n?cat|\n                    LoadLibrary(Ex)?(A|W)?)\n                   \\s*\\(\n                 /x) {\n            checkwarn(\"BANNEDFUNC\",\n                      $line, length($1), $file, $ol,\n                      \"use of $2 is banned\");\n        }\n\n        # scan for use of snprintf for curl-internals reasons\n        if($l =~ /^(.*\\W)(v?snprintf)\\s*\\(/x) {\n            checkwarn(\"SNPRINTF\",\n                      $line, length($1), $file, $ol,\n                      \"use of $2 is banned\");\n        }\n\n        # scan for use of non-binary fopen without the macro\n        if($l =~ /^(.*\\W)fopen\\s*\\([^,]*, *\\\"([^\"]*)/) {\n            my $mode = $2;\n            if($mode !~ /b/) {\n                checkwarn(\"FOPENMODE\",\n                          $line, length($1), $file, $ol,\n                          \"use of non-binary fopen without FOPEN_* macro: $mode\");\n            }\n        }\n\n        # check for open brace first on line but not first column\n        # only alert if previous line ended with a close paren and wasn't a cpp\n        # line\n        if((($prevl =~ /\\)\\z/) && ($prevl !~ /^ *#/)) && ($l =~ /^( +)\\{/)) {\n            checkwarn(\"BRACEPOS\",\n                      $line, length($1), $file, $ol, \"badly placed open brace\");\n        }\n\n        # if the previous line starts with if/while/for AND ends with an open\n        # brace, or an else statement, check that this line is indented $indent\n        # more steps, if not a cpp line\n        if($prevl =~ /^( *)((if|while|for)\\(.*\\{|else)\\z/) {\n            my $first = length($1);\n\n            # this line has some character besides spaces\n            if(($l !~ /^ *#/) && ($l =~ /^( *)[^ ]/)) {\n                my $second = length($1);\n                my $expect = $first+$indent;\n                if($expect != $second) {\n                    my $diff = $second - $first;\n                    checkwarn(\"INDENTATION\", $line, length($1), $file, $ol,\n                              \"not indented $indent steps (uses $diff)\");\n\n                }\n            }\n        }\n\n        # check for 'char * name'\n        if(($l =~ /(^.*(char|int|long|void|curl_slist|CURL|CURLM|CURLMsg|curl_httppost) *(\\*+)) (\\w+)/) && ($4 ne \"const\")) {\n            checkwarn(\"ASTERISKNOSPACE\",\n                      $line, length($1), $file, $ol,\n                      \"no space after declarative asterisk\");\n        }\n        # check for 'char*'\n        if(($l =~ /(^.*(char|int|long|void|curl_slist|CURL|CURLM|CURLMsg|curl_httppost|sockaddr_in|FILE)\\*)/)) {\n            checkwarn(\"ASTERISKNOSPACE\",\n                      $line, length($1)-1, $file, $ol,\n                      \"no space before asterisk\");\n        }\n\n        # check for 'void func() {', but avoid false positives by requiring\n        # both an open and closed parentheses before the open brace\n        if($l =~ /^((\\w).*)\\{\\z/) {\n            my $k = $1;\n            $k =~ s/const *//;\n            $k =~ s/static *//;\n            if($k =~ /\\(.*\\)/) {\n                checkwarn(\"BRACEPOS\",\n                          $line, length($l)-1, $file, $ol,\n                          \"wrongly placed open brace\");\n            }\n        }\n\n        # check for equals sign without spaces next to it\n        if($nostr =~ /(.*)\\=[a-z0-9]/i) {\n            checkwarn(\"EQUALSNOSPACE\",\n                      $line, length($1)+1, $file, $ol,\n                      \"no space after equals sign\");\n        }\n        # check for equals sign without spaces before it\n        elsif($nostr =~ /(.*)[a-z0-9]\\=/i) {\n            checkwarn(\"NOSPACEEQUALS\",\n                      $line, length($1)+1, $file, $ol,\n                      \"no space before equals sign\");\n        }\n\n        # check for plus signs without spaces next to it\n        if($nostr =~ /(.*)[^+]\\+[a-z0-9]/i) {\n            checkwarn(\"PLUSNOSPACE\",\n                      $line, length($1)+1, $file, $ol,\n                      \"no space after plus sign\");\n        }\n        # check for plus sign without spaces before it\n        elsif($nostr =~ /(.*)[a-z0-9]\\+[^+]/i) {\n            checkwarn(\"NOSPACEPLUS\",\n                      $line, length($1)+1, $file, $ol,\n                      \"no space before plus sign\");\n        }\n\n        # check for semicolons without space next to it\n        if($nostr =~ /(.*)\\;[a-z0-9]/i) {\n            checkwarn(\"SEMINOSPACE\",\n                      $line, length($1)+1, $file, $ol,\n                      \"no space after semicolon\");\n        }\n\n        # check for more than one consecutive space before open brace or\n        # question mark. Skip lines containing strings since they make it hard\n        # due to artificially getting multiple spaces\n        if(($l eq $nostr) &&\n           $nostr =~ /^(.*(\\S)) + [{?]/i) {\n            checkwarn(\"MULTISPACE\",\n                      $line, length($1)+1, $file, $ol,\n                      \"multiple space\");\n            print STDERR \"L: $l\\n\";\n            print STDERR \"nostr: $nostr\\n\";\n        }\n\n        $line++;\n        $prevl = $ol;\n    }\n\n    if(!scalar(@copyright)) {\n        checkwarn(\"COPYRIGHT\", 1, 0, $file, \"\", \"Missing copyright statement\", 1);\n    }\n\n    # COPYRIGHTYEAR is a extended warning so we must first see if it has been\n    # enabled in .checksrc\n    if(defined($warnings{\"COPYRIGHTYEAR\"})) {\n        # The check for updated copyrightyear is overly complicated in order to\n        # not punish current hacking for past sins. The copyright years are\n        # right now a bit behind, so enforcing copyright year checking on all\n        # files would cause hundreds of errors. Instead we only look at files\n        # which are tracked in the Git repo and edited in the workdir, or\n        # committed locally on the branch without being in upstream master.\n        #\n        # The simple and naive test is to simply check for the current year,\n        # but updating the year even without an edit is against project policy\n        # (and it would fail every file on January 1st).\n        #\n        # A rather more interesting, and correct, check would be to not test\n        # only locally committed files but inspect all files wrt the year of\n        # their last commit. Removing the `git rev-list origin/master..HEAD`\n        # condition below will enfore copyright year checks against the year\n        # the file was last committed (and thus edited to some degree).\n        my $commityear = undef;\n        @copyright = sort {$$b{year} cmp $$a{year}} @copyright;\n\n        if(`git status -s -- $file` =~ /^ [MARCU]/) {\n            $commityear = (localtime(time))[5] + 1900;\n        }\n        elsif (`git rev-list --count origin/master..HEAD -- $file` !~ /^0/) {\n            my $grl = `git rev-list --max-count=1 --timestamp HEAD -- $file`;\n            $commityear = (localtime((split(/ /, $grl))[0]))[5] + 1900;\n        }\n\n        if(defined($commityear) && scalar(@copyright) &&\n           $copyright[0]{year} != $commityear) {\n            checkwarn(\"COPYRIGHTYEAR\", $copyright[0]{line}, $copyright[0]{col},\n                      $file, $copyright[0]{code},\n                      \"Copyright year out of date, should be $commityear, \" .\n                      \"is $copyright[0]{year}\", 1);\n        }\n    }\n\n    if($incomment) {\n        checkwarn(\"OPENCOMMENT\", 1, 0, $file, \"\", \"Missing closing comment\", 1);\n    }\n\n    checksrc_endoffile($file);\n\n    close(R);\n\n}\n\n\nif($errors || $warnings || $verbose) {\n    printf \"checksrc: %d errors and %d warnings\\n\", $errors, $warnings;\n    if($suppressed) {\n        printf \"checksrc: %d errors and %d warnings suppressed\\n\",\n        $serrors,\n        $swarnings;\n    }\n    exit 5; # return failure\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/comp.c",
    "content": "/* Copyright (c) 2004-2007, 2019, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2010-2014, Daniel Stenberg <daniel@haxx.se>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#ifdef LIBSSH2_HAVE_ZLIB\n# include <zlib.h>\n#endif\n\n#include \"comp.h\"\n\n/* ********\n * none *\n ******** */\n\n/*\n * comp_method_none_comp\n *\n * Minimalist compression: Absolutely none\n */\nstatic int\ncomp_method_none_comp(LIBSSH2_SESSION *session,\n                      unsigned char *dest,\n                      size_t *dest_len,\n                      const unsigned char *src,\n                      size_t src_len,\n                      void **abstract)\n{\n    (void) session;\n    (void) abstract;\n    (void) dest;\n    (void) dest_len;\n    (void) src;\n    (void) src_len;\n\n    return 0;\n}\n\n/*\n * comp_method_none_decomp\n *\n * Minimalist decompression: Absolutely none\n */\nstatic int\ncomp_method_none_decomp(LIBSSH2_SESSION * session,\n                        unsigned char **dest,\n                        size_t *dest_len,\n                        size_t payload_limit,\n                        const unsigned char *src,\n                        size_t src_len, void **abstract)\n{\n    (void) session;\n    (void) payload_limit;\n    (void) abstract;\n    *dest = (unsigned char *) src;\n    *dest_len = src_len;\n    return 0;\n}\n\n\n\nstatic const LIBSSH2_COMP_METHOD comp_method_none = {\n    \"none\",\n    0, /* not really compressing */\n    0, /* isn't used in userauth, go figure */\n    NULL,\n    comp_method_none_comp,\n    comp_method_none_decomp,\n    NULL\n};\n\n#ifdef LIBSSH2_HAVE_ZLIB\n/* ********\n * zlib *\n ******** */\n\n/* Memory management wrappers\n * Yes, I realize we're doing a callback to a callback,\n * Deal...\n */\n\nstatic voidpf\ncomp_method_zlib_alloc(voidpf opaque, uInt items, uInt size)\n{\n    LIBSSH2_SESSION *session = (LIBSSH2_SESSION *) opaque;\n\n    return (voidpf) LIBSSH2_ALLOC(session, items * size);\n}\n\nstatic void\ncomp_method_zlib_free(voidpf opaque, voidpf address)\n{\n    LIBSSH2_SESSION *session = (LIBSSH2_SESSION *) opaque;\n\n    LIBSSH2_FREE(session, address);\n}\n\n\n\n/* libssh2_comp_method_zlib_init\n * All your bandwidth are belong to us (so save some)\n */\nstatic int\ncomp_method_zlib_init(LIBSSH2_SESSION * session, int compr,\n                      void **abstract)\n{\n    z_stream *strm;\n    int status;\n\n    strm = LIBSSH2_CALLOC(session, sizeof(z_stream));\n    if(!strm) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Unable to allocate memory for \"\n                              \"zlib compression/decompression\");\n    }\n\n    strm->opaque = (voidpf) session;\n    strm->zalloc = (alloc_func) comp_method_zlib_alloc;\n    strm->zfree = (free_func) comp_method_zlib_free;\n    if(compr) {\n        /* deflate */\n        status = deflateInit(strm, Z_DEFAULT_COMPRESSION);\n    }\n    else {\n        /* inflate */\n        status = inflateInit(strm);\n    }\n\n    if(status != Z_OK) {\n        LIBSSH2_FREE(session, strm);\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                       \"unhandled zlib error %d\", status);\n        return LIBSSH2_ERROR_COMPRESS;\n    }\n    *abstract = strm;\n\n    return LIBSSH2_ERROR_NONE;\n}\n\n/*\n * libssh2_comp_method_zlib_comp\n *\n * Compresses source to destination. Without allocation.\n */\nstatic int\ncomp_method_zlib_comp(LIBSSH2_SESSION *session,\n                      unsigned char *dest,\n\n                      /* dest_len is a pointer to allow this function to\n                         update it with the final actual size used */\n                      size_t *dest_len,\n                      const unsigned char *src,\n                      size_t src_len,\n                      void **abstract)\n{\n    z_stream *strm = *abstract;\n    int out_maxlen = *dest_len;\n    int status;\n\n    strm->next_in = (unsigned char *) src;\n    strm->avail_in = src_len;\n    strm->next_out = dest;\n    strm->avail_out = out_maxlen;\n\n    status = deflate(strm, Z_PARTIAL_FLUSH);\n\n    if((status == Z_OK) && (strm->avail_out > 0)) {\n        *dest_len = out_maxlen - strm->avail_out;\n        return 0;\n    }\n\n    _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                   \"unhandled zlib compression error %d, avail_out\",\n                   status, strm->avail_out);\n    return _libssh2_error(session, LIBSSH2_ERROR_ZLIB, \"compression failure\");\n}\n\n/*\n * libssh2_comp_method_zlib_decomp\n *\n * Decompresses source to destination. Allocates the output memory.\n */\nstatic int\ncomp_method_zlib_decomp(LIBSSH2_SESSION * session,\n                        unsigned char **dest,\n                        size_t *dest_len,\n                        size_t payload_limit,\n                        const unsigned char *src,\n                        size_t src_len, void **abstract)\n{\n    z_stream *strm = *abstract;\n    /* A short-term alloc of a full data chunk is better than a series of\n       reallocs */\n    char *out;\n    size_t out_maxlen = src_len;\n\n    if(src_len <= SIZE_MAX / 4)\n        out_maxlen = src_len * 4;\n    else\n        out_maxlen = payload_limit;\n\n    /* If strm is null, then we have not yet been initialized. */\n    if(strm == NULL)\n        return _libssh2_error(session, LIBSSH2_ERROR_COMPRESS,\n                              \"decompression uninitialized\");;\n\n    /* In practice they never come smaller than this */\n    if(out_maxlen < 25)\n        out_maxlen = 25;\n\n    if(out_maxlen > payload_limit)\n        out_maxlen = payload_limit;\n\n    strm->next_in = (unsigned char *) src;\n    strm->avail_in = src_len;\n    strm->next_out = (unsigned char *) LIBSSH2_ALLOC(session, out_maxlen);\n    out = (char *) strm->next_out;\n    strm->avail_out = out_maxlen;\n    if(!strm->next_out)\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Unable to allocate decompression buffer\");\n\n    /* Loop until it's all inflated or hit error */\n    for(;;) {\n        int status;\n        size_t out_ofs;\n        char *newout;\n\n        status = inflate(strm, Z_PARTIAL_FLUSH);\n\n        if(status == Z_OK) {\n            if(strm->avail_out > 0)\n                /* status is OK and the output buffer has not been exhausted\n                   so we're done */\n                break;\n        }\n        else if(status == Z_BUF_ERROR) {\n            /* the input data has been exhausted so we are done */\n            break;\n        }\n        else {\n            /* error state */\n            LIBSSH2_FREE(session, out);\n            _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                           \"unhandled zlib error %d\", status);\n            return _libssh2_error(session, LIBSSH2_ERROR_ZLIB,\n                                  \"decompression failure\");\n        }\n\n        if(out_maxlen > payload_limit || out_maxlen > SIZE_MAX / 2) {\n            LIBSSH2_FREE(session, out);\n            return _libssh2_error(session, LIBSSH2_ERROR_ZLIB,\n                                  \"Excessive growth in decompression phase\");\n        }\n\n        /* If we get here we need to grow the output buffer and try again */\n        out_ofs = out_maxlen - strm->avail_out;\n        out_maxlen *= 2;\n        newout = LIBSSH2_REALLOC(session, out, out_maxlen);\n        if(!newout) {\n            LIBSSH2_FREE(session, out);\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to expand decompression buffer\");\n        }\n        out = newout;\n        strm->next_out = (unsigned char *) out + out_ofs;\n        strm->avail_out = out_maxlen - out_ofs;\n    }\n\n    *dest = (unsigned char *) out;\n    *dest_len = out_maxlen - strm->avail_out;\n\n    return 0;\n}\n\n\n/* libssh2_comp_method_zlib_dtor\n * All done, no more compression for you\n */\nstatic int\ncomp_method_zlib_dtor(LIBSSH2_SESSION *session, int compr, void **abstract)\n{\n    z_stream *strm = *abstract;\n\n    if(strm) {\n        if(compr)\n            deflateEnd(strm);\n        else\n            inflateEnd(strm);\n        LIBSSH2_FREE(session, strm);\n    }\n\n    *abstract = NULL;\n    return 0;\n}\n\nstatic const LIBSSH2_COMP_METHOD comp_method_zlib = {\n    \"zlib\",\n    1, /* yes, this compresses */\n    1, /* do compression during userauth */\n    comp_method_zlib_init,\n    comp_method_zlib_comp,\n    comp_method_zlib_decomp,\n    comp_method_zlib_dtor,\n};\n\nstatic const LIBSSH2_COMP_METHOD comp_method_zlib_openssh = {\n    \"zlib@openssh.com\",\n    1, /* yes, this compresses */\n    0, /* don't use compression during userauth */\n    comp_method_zlib_init,\n    comp_method_zlib_comp,\n    comp_method_zlib_decomp,\n    comp_method_zlib_dtor,\n};\n#endif /* LIBSSH2_HAVE_ZLIB */\n\n/* If compression is enabled by the API, then this array is used which then\n   may allow compression if zlib is available at build time */\nstatic const LIBSSH2_COMP_METHOD *comp_methods[] = {\n#ifdef LIBSSH2_HAVE_ZLIB\n    &comp_method_zlib,\n    &comp_method_zlib_openssh,\n#endif /* LIBSSH2_HAVE_ZLIB */\n    &comp_method_none,\n    NULL\n};\n\n/* If compression is disabled by the API, then this array is used */\nstatic const LIBSSH2_COMP_METHOD *no_comp_methods[] = {\n    &comp_method_none,\n    NULL\n};\n\nconst LIBSSH2_COMP_METHOD **\n_libssh2_comp_methods(LIBSSH2_SESSION *session)\n{\n    if(session->flag.compress)\n        return comp_methods;\n    else\n        return no_comp_methods;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/comp.h",
    "content": "#ifndef __LIBSSH2_COMP_H\n#define __LIBSSH2_COMP_H\n\n/* Copyright (C) 2009-2010 by Daniel Stenberg\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n */\n\n#include \"libssh2_priv.h\"\n\nconst LIBSSH2_COMP_METHOD **_libssh2_comp_methods(LIBSSH2_SESSION *session);\n\n#endif /* __LIBSSH2_COMP_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/crypt.c",
    "content": "/* Copyright (c) 2009, 2010 Simon Josefsson <simon@josefsson.org>\n * Copyright (c) 2004-2007, Sara Golemon <sarag@libssh2.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\n#ifdef LIBSSH2_CRYPT_NONE\n\n/* crypt_none_crypt\n * Minimalist cipher: VERY secure *wink*\n */\nstatic int\ncrypt_none_crypt(LIBSSH2_SESSION * session, unsigned char *buf,\n                         void **abstract)\n{\n    /* Do nothing to the data! */\n    return 0;\n}\n\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_none = {\n    \"none\",\n    \"DEK-Info: NONE\",\n    8,                /* blocksize (SSH2 defines minimum blocksize as 8) */\n    0,                /* iv_len */\n    0,                /* secret_len */\n    0,                /* flags */\n    NULL,\n    crypt_none_crypt,\n    NULL\n};\n#endif /* LIBSSH2_CRYPT_NONE */\n\nstruct crypt_ctx\n{\n    int encrypt;\n    _libssh2_cipher_type(algo);\n    _libssh2_cipher_ctx h;\n};\n\nstatic int\ncrypt_init(LIBSSH2_SESSION * session,\n           const LIBSSH2_CRYPT_METHOD * method,\n           unsigned char *iv, int *free_iv,\n           unsigned char *secret, int *free_secret,\n           int encrypt, void **abstract)\n{\n    struct crypt_ctx *ctx = LIBSSH2_ALLOC(session,\n                                          sizeof(struct crypt_ctx));\n    if(!ctx)\n        return LIBSSH2_ERROR_ALLOC;\n\n    ctx->encrypt = encrypt;\n    ctx->algo = method->algo;\n    if(_libssh2_cipher_init(&ctx->h, ctx->algo, iv, secret, encrypt)) {\n        LIBSSH2_FREE(session, ctx);\n        return -1;\n    }\n    *abstract = ctx;\n    *free_iv = 1;\n    *free_secret = 1;\n    return 0;\n}\n\nstatic int\ncrypt_encrypt(LIBSSH2_SESSION * session, unsigned char *block,\n              size_t blocksize, void **abstract)\n{\n    struct crypt_ctx *cctx = *(struct crypt_ctx **) abstract;\n    (void) session;\n    return _libssh2_cipher_crypt(&cctx->h, cctx->algo, cctx->encrypt, block,\n                                 blocksize);\n}\n\nstatic int\ncrypt_dtor(LIBSSH2_SESSION * session, void **abstract)\n{\n    struct crypt_ctx **cctx = (struct crypt_ctx **) abstract;\n    if(cctx && *cctx) {\n        _libssh2_cipher_dtor(&(*cctx)->h);\n        LIBSSH2_FREE(session, *cctx);\n        *abstract = NULL;\n    }\n    return 0;\n}\n\n#if LIBSSH2_AES_CTR\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes128_ctr = {\n    \"aes128-ctr\",\n    \"\",\n    16,                         /* blocksize */\n    16,                         /* initial value length */\n    16,                         /* secret length -- 16*8 == 128bit */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_aes128ctr\n};\n\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes192_ctr = {\n    \"aes192-ctr\",\n    \"\",\n    16,                         /* blocksize */\n    16,                         /* initial value length */\n    24,                         /* secret length -- 24*8 == 192bit */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_aes192ctr\n};\n\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes256_ctr = {\n    \"aes256-ctr\",\n    \"\",\n    16,                         /* blocksize */\n    16,                         /* initial value length */\n    32,                         /* secret length -- 32*8 == 256bit */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_aes256ctr\n};\n#endif\n\n#if LIBSSH2_AES\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes128_cbc = {\n    \"aes128-cbc\",\n    \"DEK-Info: AES-128-CBC\",\n    16,                         /* blocksize */\n    16,                         /* initial value length */\n    16,                         /* secret length -- 16*8 == 128bit */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_aes128\n};\n\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes192_cbc = {\n    \"aes192-cbc\",\n    \"DEK-Info: AES-192-CBC\",\n    16,                         /* blocksize */\n    16,                         /* initial value length */\n    24,                         /* secret length -- 24*8 == 192bit */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_aes192\n};\n\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes256_cbc = {\n    \"aes256-cbc\",\n    \"DEK-Info: AES-256-CBC\",\n    16,                         /* blocksize */\n    16,                         /* initial value length */\n    32,                         /* secret length -- 32*8 == 256bit */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_aes256\n};\n\n/* rijndael-cbc@lysator.liu.se == aes256-cbc */\nstatic const LIBSSH2_CRYPT_METHOD\n    libssh2_crypt_method_rijndael_cbc_lysator_liu_se = {\n    \"rijndael-cbc@lysator.liu.se\",\n    \"DEK-Info: AES-256-CBC\",\n    16,                         /* blocksize */\n    16,                         /* initial value length */\n    32,                         /* secret length -- 32*8 == 256bit */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_aes256\n};\n#endif /* LIBSSH2_AES */\n\n#if LIBSSH2_BLOWFISH\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_blowfish_cbc = {\n    \"blowfish-cbc\",\n    \"\",\n    8,                          /* blocksize */\n    8,                          /* initial value length */\n    16,                         /* secret length */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_blowfish\n};\n#endif /* LIBSSH2_BLOWFISH */\n\n#if LIBSSH2_RC4\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_arcfour = {\n    \"arcfour\",\n    \"DEK-Info: RC4\",\n    8,                          /* blocksize */\n    8,                          /* initial value length */\n    16,                         /* secret length */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_arcfour\n};\n\nstatic int\ncrypt_init_arcfour128(LIBSSH2_SESSION * session,\n                      const LIBSSH2_CRYPT_METHOD * method,\n                      unsigned char *iv, int *free_iv,\n                      unsigned char *secret, int *free_secret,\n                      int encrypt, void **abstract)\n{\n    int rc;\n\n    rc = crypt_init(session, method, iv, free_iv, secret, free_secret,\n                    encrypt, abstract);\n    if(rc == 0) {\n        struct crypt_ctx *cctx = *(struct crypt_ctx **) abstract;\n        unsigned char block[8];\n        size_t discard = 1536;\n        for(; discard; discard -= 8)\n            _libssh2_cipher_crypt(&cctx->h, cctx->algo, cctx->encrypt, block,\n                                  method->blocksize);\n    }\n\n    return rc;\n}\n\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_arcfour128 = {\n    \"arcfour128\",\n    \"\",\n    8,                          /* blocksize */\n    8,                          /* initial value length */\n    16,                         /* secret length */\n    0,                          /* flags */\n    &crypt_init_arcfour128,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_arcfour\n};\n#endif /* LIBSSH2_RC4 */\n\n#if LIBSSH2_CAST\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_cast128_cbc = {\n    \"cast128-cbc\",\n    \"\",\n    8,                          /* blocksize */\n    8,                          /* initial value length */\n    16,                         /* secret length */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_cast5\n};\n#endif /* LIBSSH2_CAST */\n\n#if LIBSSH2_3DES\nstatic const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_3des_cbc = {\n    \"3des-cbc\",\n    \"DEK-Info: DES-EDE3-CBC\",\n    8,                          /* blocksize */\n    8,                          /* initial value length */\n    24,                         /* secret length */\n    0,                          /* flags */\n    &crypt_init,\n    &crypt_encrypt,\n    &crypt_dtor,\n    _libssh2_cipher_3des\n};\n#endif\n\nstatic const LIBSSH2_CRYPT_METHOD *_libssh2_crypt_methods[] = {\n#if LIBSSH2_AES_CTR\n  &libssh2_crypt_method_aes128_ctr,\n  &libssh2_crypt_method_aes192_ctr,\n  &libssh2_crypt_method_aes256_ctr,\n#endif /* LIBSSH2_AES */\n#if LIBSSH2_AES\n    &libssh2_crypt_method_aes256_cbc,\n    &libssh2_crypt_method_rijndael_cbc_lysator_liu_se,  /* == aes256-cbc */\n    &libssh2_crypt_method_aes192_cbc,\n    &libssh2_crypt_method_aes128_cbc,\n#endif /* LIBSSH2_AES */\n#if LIBSSH2_BLOWFISH\n    &libssh2_crypt_method_blowfish_cbc,\n#endif /* LIBSSH2_BLOWFISH */\n#if LIBSSH2_RC4\n    &libssh2_crypt_method_arcfour128,\n    &libssh2_crypt_method_arcfour,\n#endif /* LIBSSH2_RC4 */\n#if LIBSSH2_CAST\n    &libssh2_crypt_method_cast128_cbc,\n#endif /* LIBSSH2_CAST */\n#if LIBSSH2_3DES\n    &libssh2_crypt_method_3des_cbc,\n#endif /*  LIBSSH2_DES */\n#ifdef LIBSSH2_CRYPT_NONE\n    &libssh2_crypt_method_none,\n#endif\n    NULL\n};\n\n/* Expose to kex.c */\nconst LIBSSH2_CRYPT_METHOD **\nlibssh2_crypt_methods(void)\n{\n    return _libssh2_crypt_methods;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/crypto.h",
    "content": "/* Copyright (C) 2009, 2010 Simon Josefsson\n * Copyright (C) 2006, 2007 The Written Word, Inc.  All rights reserved.\n * Copyright (C) 2010-2019 Daniel Stenberg\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n#ifndef LIBSSH2_CRYPTO_H\n#define LIBSSH2_CRYPTO_H\n\n#ifdef LIBSSH2_OPENSSL\n#include \"openssl.h\"\n#endif\n\n#ifdef LIBSSH2_LIBGCRYPT\n#include \"libgcrypt.h\"\n#endif\n\n#ifdef LIBSSH2_WINCNG\n#include \"wincng.h\"\n#endif\n\n#ifdef LIBSSH2_OS400QC3\n#include \"os400qc3.h\"\n#endif\n\n#ifdef LIBSSH2_MBEDTLS\n#include \"mbedtls.h\"\n#endif\n\n#define LIBSSH2_ED25519_KEY_LEN 32\n#define LIBSSH2_ED25519_PRIVATE_KEY_LEN 64\n#define LIBSSH2_ED25519_SIG_LEN 64\n\n#if LIBSSH2_RSA\nint _libssh2_rsa_new(libssh2_rsa_ctx ** rsa,\n                     const unsigned char *edata,\n                     unsigned long elen,\n                     const unsigned char *ndata,\n                     unsigned long nlen,\n                     const unsigned char *ddata,\n                     unsigned long dlen,\n                     const unsigned char *pdata,\n                     unsigned long plen,\n                     const unsigned char *qdata,\n                     unsigned long qlen,\n                     const unsigned char *e1data,\n                     unsigned long e1len,\n                     const unsigned char *e2data,\n                     unsigned long e2len,\n                     const unsigned char *coeffdata, unsigned long coefflen);\nint _libssh2_rsa_new_private(libssh2_rsa_ctx ** rsa,\n                             LIBSSH2_SESSION * session,\n                             const char *filename,\n                             unsigned const char *passphrase);\nint _libssh2_rsa_sha1_verify(libssh2_rsa_ctx * rsa,\n                             const unsigned char *sig,\n                             unsigned long sig_len,\n                             const unsigned char *m, unsigned long m_len);\nint _libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session,\n                           libssh2_rsa_ctx * rsactx,\n                           const unsigned char *hash,\n                           size_t hash_len,\n                           unsigned char **signature,\n                           size_t *signature_len);\nint _libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx ** rsa,\n                                        LIBSSH2_SESSION * session,\n                                        const char *filedata,\n                                        size_t filedata_len,\n                                        unsigned const char *passphrase);\n#endif\n\n#if LIBSSH2_DSA\nint _libssh2_dsa_new(libssh2_dsa_ctx ** dsa,\n                     const unsigned char *pdata,\n                     unsigned long plen,\n                     const unsigned char *qdata,\n                     unsigned long qlen,\n                     const unsigned char *gdata,\n                     unsigned long glen,\n                     const unsigned char *ydata,\n                     unsigned long ylen,\n                     const unsigned char *x, unsigned long x_len);\nint _libssh2_dsa_new_private(libssh2_dsa_ctx ** dsa,\n                             LIBSSH2_SESSION * session,\n                             const char *filename,\n                             unsigned const char *passphrase);\nint _libssh2_dsa_sha1_verify(libssh2_dsa_ctx * dsactx,\n                             const unsigned char *sig,\n                             const unsigned char *m, unsigned long m_len);\nint _libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx,\n                           const unsigned char *hash,\n                           unsigned long hash_len, unsigned char *sig);\nint _libssh2_dsa_new_private_frommemory(libssh2_dsa_ctx ** dsa,\n                                        LIBSSH2_SESSION * session,\n                                        const char *filedata,\n                                        size_t filedata_len,\n                                        unsigned const char *passphrase);\n#endif\n\n#if LIBSSH2_ECDSA\nint\n_libssh2_ecdsa_curve_name_with_octal_new(libssh2_ecdsa_ctx ** ecdsactx,\n                                         const unsigned char *k,\n                                         size_t k_len,\n                                         libssh2_curve_type type);\nint\n_libssh2_ecdsa_new_private(libssh2_ecdsa_ctx ** ec_ctx,\n                           LIBSSH2_SESSION * session,\n                           const char *filename,\n                           unsigned const char *passphrase);\n\nint\n_libssh2_ecdsa_verify(libssh2_ecdsa_ctx * ctx,\n                      const unsigned char *r, size_t r_len,\n                      const unsigned char *s, size_t s_len,\n                      const unsigned char *m, size_t m_len);\n\nint\n_libssh2_ecdsa_create_key(LIBSSH2_SESSION *session,\n                          _libssh2_ec_key **out_private_key,\n                          unsigned char **out_public_key_octal,\n                          size_t *out_public_key_octal_len,\n                          libssh2_curve_type curve_type);\n\nint\n_libssh2_ecdh_gen_k(_libssh2_bn **k, _libssh2_ec_key *private_key,\n                    const unsigned char *server_public_key,\n                    size_t server_public_key_len);\n\nint\n_libssh2_ecdsa_sign(LIBSSH2_SESSION *session, libssh2_ecdsa_ctx *ec_ctx,\n                    const unsigned char *hash, unsigned long hash_len,\n                    unsigned char **signature, size_t *signature_len);\n\nint _libssh2_ecdsa_new_private_frommemory(libssh2_ecdsa_ctx ** ec_ctx,\n                                          LIBSSH2_SESSION * session,\n                                          const char *filedata,\n                                          size_t filedata_len,\n                                          unsigned const char *passphrase);\n\nlibssh2_curve_type\n_libssh2_ecdsa_key_get_curve_type(_libssh2_ec_key *key);\n\nint\n_libssh2_ecdsa_curve_type_from_name(const char *name,\n                                    libssh2_curve_type *out_type);\n\n#endif /* LIBSSH2_ECDSA */\n\n#if LIBSSH2_ED25519\n\nint\n_libssh2_curve25519_new(LIBSSH2_SESSION *session, libssh2_ed25519_ctx **ctx,\n                        uint8_t **out_public_key, uint8_t **out_private_key);\n\nint\n_libssh2_curve25519_gen_k(_libssh2_bn **k,\n                          uint8_t private_key[LIBSSH2_ED25519_KEY_LEN],\n                          uint8_t server_public_key[LIBSSH2_ED25519_KEY_LEN]);\n\nint\n_libssh2_ed25519_verify(libssh2_ed25519_ctx *ctx, const uint8_t *s,\n                        size_t s_len, const uint8_t *m, size_t m_len);\n\nint\n_libssh2_ed25519_new_private(libssh2_ed25519_ctx **ed_ctx,\n                            LIBSSH2_SESSION *session,\n                            const char *filename, const uint8_t *passphrase);\n\nint\n_libssh2_ed25519_new_public(libssh2_ed25519_ctx **ed_ctx,\n                            LIBSSH2_SESSION *session,\n                            const unsigned char *raw_pub_key,\n                            const uint8_t key_len);\n\nint\n_libssh2_ed25519_sign(libssh2_ed25519_ctx *ctx, LIBSSH2_SESSION *session,\n                      uint8_t **out_sig, size_t *out_sig_len,\n                      const uint8_t *message, size_t message_len);\n\nint\n_libssh2_ed25519_new_private_frommemory(libssh2_ed25519_ctx **ed_ctx,\n                                        LIBSSH2_SESSION *session,\n                                        const char *filedata,\n                                        size_t filedata_len,\n                                        unsigned const char *passphrase);\n\n#endif /* LIBSSH2_ED25519 */\n\n\nint _libssh2_cipher_init(_libssh2_cipher_ctx * h,\n                         _libssh2_cipher_type(algo),\n                         unsigned char *iv,\n                         unsigned char *secret, int encrypt);\n\nint _libssh2_cipher_crypt(_libssh2_cipher_ctx * ctx,\n                          _libssh2_cipher_type(algo),\n                          int encrypt, unsigned char *block, size_t blocksize);\n\nint _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session,\n                              unsigned char **method,\n                              size_t *method_len,\n                              unsigned char **pubkeydata,\n                              size_t *pubkeydata_len,\n                              const char *privatekey,\n                              const char *passphrase);\n\nint _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session,\n                                    unsigned char **method,\n                                    size_t *method_len,\n                                    unsigned char **pubkeydata,\n                                    size_t *pubkeydata_len,\n                                    const char *privatekeydata,\n                                    size_t privatekeydata_len,\n                                    const char *passphrase);\n\n#endif\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/global.c",
    "content": "/* Copyright (c) 2010 Lars Nordin <Lars.Nordin@SDlabs.se>\n * Copyright (C) 2010 Simon Josefsson <simon@josefsson.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\nstatic int _libssh2_initialized = 0;\nstatic int _libssh2_init_flags = 0;\n\nLIBSSH2_API int\nlibssh2_init(int flags)\n{\n    if(_libssh2_initialized == 0 && !(flags & LIBSSH2_INIT_NO_CRYPTO)) {\n        libssh2_crypto_init();\n    }\n\n    _libssh2_initialized++;\n    _libssh2_init_flags |= flags;\n\n    return 0;\n}\n\nLIBSSH2_API void\nlibssh2_exit(void)\n{\n    if(_libssh2_initialized == 0)\n        return;\n\n    _libssh2_initialized--;\n\n    if(!(_libssh2_init_flags & LIBSSH2_INIT_NO_CRYPTO)) {\n        libssh2_crypto_exit();\n    }\n\n    return;\n}\n\nvoid\n_libssh2_init_if_needed(void)\n{\n    if(_libssh2_initialized == 0)\n        (void)libssh2_init (0);\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/hostkey.c",
    "content": "/* Copyright (c) 2004-2006, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2009-2019 by Daniel Stenberg\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include \"misc.h\"\n\n/* Needed for struct iovec on some platforms */\n#ifdef HAVE_SYS_UIO_H\n#include <sys/uio.h>\n#endif\n\n#if LIBSSH2_RSA\n/* ***********\n * ssh-rsa *\n *********** */\n\nstatic int hostkey_method_ssh_rsa_dtor(LIBSSH2_SESSION * session,\n                                       void **abstract);\n\n/*\n * hostkey_method_ssh_rsa_init\n *\n * Initialize the server hostkey working area with e/n pair\n */\nstatic int\nhostkey_method_ssh_rsa_init(LIBSSH2_SESSION * session,\n                            const unsigned char *hostkey_data,\n                            size_t hostkey_data_len,\n                            void **abstract)\n{\n    libssh2_rsa_ctx *rsactx;\n    unsigned char *e, *n;\n    size_t e_len, n_len;\n    struct string_buf buf;\n\n    if(*abstract) {\n        hostkey_method_ssh_rsa_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    if(hostkey_data_len < 19) {\n        _libssh2_debug(session, LIBSSH2_TRACE_ERROR,\n                       \"host key length too short\");\n        return -1;\n    }\n\n    buf.data = (unsigned char *)hostkey_data;\n    buf.dataptr = buf.data;\n    buf.len = hostkey_data_len;\n\n    if(_libssh2_match_string(&buf, \"ssh-rsa\"))\n        return -1;\n\n    if(_libssh2_get_string(&buf, &e, &e_len))\n        return -1;\n\n    if(_libssh2_get_string(&buf, &n, &n_len))\n        return -1;\n\n    if(_libssh2_rsa_new(&rsactx, e, e_len, n, n_len, NULL, 0,\n                        NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0)) {\n        return -1;\n    }\n\n    *abstract = rsactx;\n\n    return 0;\n}\n\n/*\n * hostkey_method_ssh_rsa_initPEM\n *\n * Load a Private Key from a PEM file\n */\nstatic int\nhostkey_method_ssh_rsa_initPEM(LIBSSH2_SESSION * session,\n                               const char *privkeyfile,\n                               unsigned const char *passphrase,\n                               void **abstract)\n{\n    libssh2_rsa_ctx *rsactx;\n    int ret;\n\n    if(*abstract) {\n        hostkey_method_ssh_rsa_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    ret = _libssh2_rsa_new_private(&rsactx, session, privkeyfile, passphrase);\n    if(ret) {\n        return -1;\n    }\n\n    *abstract = rsactx;\n\n    return 0;\n}\n\n/*\n * hostkey_method_ssh_rsa_initPEMFromMemory\n *\n * Load a Private Key from a memory\n */\nstatic int\nhostkey_method_ssh_rsa_initPEMFromMemory(LIBSSH2_SESSION * session,\n                                         const char *privkeyfiledata,\n                                         size_t privkeyfiledata_len,\n                                         unsigned const char *passphrase,\n                                         void **abstract)\n{\n    libssh2_rsa_ctx *rsactx;\n    int ret;\n\n    if(*abstract) {\n        hostkey_method_ssh_rsa_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    ret = _libssh2_rsa_new_private_frommemory(&rsactx, session,\n                                              privkeyfiledata,\n                                              privkeyfiledata_len, passphrase);\n    if(ret) {\n        return -1;\n    }\n\n    *abstract = rsactx;\n\n    return 0;\n}\n\n/*\n * hostkey_method_ssh_rsa_sign\n *\n * Verify signature created by remote\n */\nstatic int\nhostkey_method_ssh_rsa_sig_verify(LIBSSH2_SESSION * session,\n                                  const unsigned char *sig,\n                                  size_t sig_len,\n                                  const unsigned char *m,\n                                  size_t m_len, void **abstract)\n{\n    libssh2_rsa_ctx *rsactx = (libssh2_rsa_ctx *) (*abstract);\n    (void) session;\n\n    /* Skip past keyname_len(4) + keyname(7){\"ssh-rsa\"} + signature_len(4) */\n    if(sig_len < 15)\n        return -1;\n\n    sig += 15;\n    sig_len -= 15;\n    return _libssh2_rsa_sha1_verify(rsactx, sig, sig_len, m, m_len);\n}\n\n/*\n * hostkey_method_ssh_rsa_signv\n *\n * Construct a signature from an array of vectors\n */\nstatic int\nhostkey_method_ssh_rsa_signv(LIBSSH2_SESSION * session,\n                             unsigned char **signature,\n                             size_t *signature_len,\n                             int veccount,\n                             const struct iovec datavec[],\n                             void **abstract)\n{\n    libssh2_rsa_ctx *rsactx = (libssh2_rsa_ctx *) (*abstract);\n\n#ifdef _libssh2_rsa_sha1_signv\n    return _libssh2_rsa_sha1_signv(session, signature, signature_len,\n                                   veccount, datavec, rsactx);\n#else\n    int ret;\n    int i;\n    unsigned char hash[SHA_DIGEST_LENGTH];\n    libssh2_sha1_ctx ctx;\n\n    libssh2_sha1_init(&ctx);\n    for(i = 0; i < veccount; i++) {\n        libssh2_sha1_update(ctx, datavec[i].iov_base, datavec[i].iov_len);\n    }\n    libssh2_sha1_final(ctx, hash);\n\n    ret = _libssh2_rsa_sha1_sign(session, rsactx, hash, SHA_DIGEST_LENGTH,\n                                 signature, signature_len);\n    if(ret) {\n        return -1;\n    }\n\n    return 0;\n#endif\n}\n\n/*\n * hostkey_method_ssh_rsa_dtor\n *\n * Shutdown the hostkey\n */\nstatic int\nhostkey_method_ssh_rsa_dtor(LIBSSH2_SESSION * session, void **abstract)\n{\n    libssh2_rsa_ctx *rsactx = (libssh2_rsa_ctx *) (*abstract);\n    (void) session;\n\n    _libssh2_rsa_free(rsactx);\n\n    *abstract = NULL;\n\n    return 0;\n}\n\n#ifdef OPENSSL_NO_MD5\n#define MD5_DIGEST_LENGTH 16\n#endif\n\nstatic const LIBSSH2_HOSTKEY_METHOD hostkey_method_ssh_rsa = {\n    \"ssh-rsa\",\n    MD5_DIGEST_LENGTH,\n    hostkey_method_ssh_rsa_init,\n    hostkey_method_ssh_rsa_initPEM,\n    hostkey_method_ssh_rsa_initPEMFromMemory,\n    hostkey_method_ssh_rsa_sig_verify,\n    hostkey_method_ssh_rsa_signv,\n    NULL,                       /* encrypt */\n    hostkey_method_ssh_rsa_dtor,\n};\n#endif /* LIBSSH2_RSA */\n\n#if LIBSSH2_DSA\n/* ***********\n * ssh-dss *\n *********** */\n\nstatic int hostkey_method_ssh_dss_dtor(LIBSSH2_SESSION * session,\n                                       void **abstract);\n\n/*\n * hostkey_method_ssh_dss_init\n *\n * Initialize the server hostkey working area with p/q/g/y set\n */\nstatic int\nhostkey_method_ssh_dss_init(LIBSSH2_SESSION * session,\n                            const unsigned char *hostkey_data,\n                            size_t hostkey_data_len,\n                            void **abstract)\n{\n    libssh2_dsa_ctx *dsactx;\n    unsigned char *p, *q, *g, *y;\n    size_t p_len, q_len, g_len, y_len;\n    struct string_buf buf;\n\n    if(*abstract) {\n        hostkey_method_ssh_dss_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    if(hostkey_data_len < 27) {\n        _libssh2_debug(session, LIBSSH2_TRACE_ERROR,\n                       \"host key length too short\");\n        return -1;\n    }\n\n    buf.data = (unsigned char *)hostkey_data;\n    buf.dataptr = buf.data;\n    buf.len = hostkey_data_len;\n\n    if(_libssh2_match_string(&buf, \"ssh-dss\"))\n        return -1;\n\n    if(_libssh2_get_string(&buf, &p, &p_len))\n       return -1;\n\n    if(_libssh2_get_string(&buf, &q, &q_len))\n        return -1;\n\n    if(_libssh2_get_string(&buf, &g, &g_len))\n        return -1;\n\n    if(_libssh2_get_string(&buf, &y, &y_len))\n        return -1;\n\n    if(_libssh2_dsa_new(&dsactx, p, p_len, q, q_len,\n                        g, g_len, y, y_len, NULL, 0)) {\n        return -1;\n    }\n\n    *abstract = dsactx;\n\n    return 0;\n}\n\n/*\n * hostkey_method_ssh_dss_initPEM\n *\n * Load a Private Key from a PEM file\n */\nstatic int\nhostkey_method_ssh_dss_initPEM(LIBSSH2_SESSION * session,\n                               const char *privkeyfile,\n                               unsigned const char *passphrase,\n                               void **abstract)\n{\n    libssh2_dsa_ctx *dsactx;\n    int ret;\n\n    if(*abstract) {\n        hostkey_method_ssh_dss_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    ret = _libssh2_dsa_new_private(&dsactx, session, privkeyfile, passphrase);\n    if(ret) {\n        return -1;\n    }\n\n    *abstract = dsactx;\n\n    return 0;\n}\n\n/*\n * hostkey_method_ssh_dss_initPEMFromMemory\n *\n * Load a Private Key from memory\n */\nstatic int\nhostkey_method_ssh_dss_initPEMFromMemory(LIBSSH2_SESSION * session,\n                                         const char *privkeyfiledata,\n                                         size_t privkeyfiledata_len,\n                                         unsigned const char *passphrase,\n                                         void **abstract)\n{\n    libssh2_dsa_ctx *dsactx;\n    int ret;\n\n    if(*abstract) {\n        hostkey_method_ssh_dss_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    ret = _libssh2_dsa_new_private_frommemory(&dsactx, session,\n                                              privkeyfiledata,\n                                              privkeyfiledata_len, passphrase);\n    if(ret) {\n        return -1;\n    }\n\n    *abstract = dsactx;\n\n    return 0;\n}\n\n/*\n * libssh2_hostkey_method_ssh_dss_sign\n *\n * Verify signature created by remote\n */\nstatic int\nhostkey_method_ssh_dss_sig_verify(LIBSSH2_SESSION * session,\n                                  const unsigned char *sig,\n                                  size_t sig_len,\n                                  const unsigned char *m,\n                                  size_t m_len, void **abstract)\n{\n    libssh2_dsa_ctx *dsactx = (libssh2_dsa_ctx *) (*abstract);\n\n    /* Skip past keyname_len(4) + keyname(7){\"ssh-dss\"} + signature_len(4) */\n    if(sig_len != 55) {\n        return _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                              \"Invalid DSS signature length\");\n    }\n\n    sig += 15;\n    sig_len -= 15;\n\n    return _libssh2_dsa_sha1_verify(dsactx, sig, m, m_len);\n}\n\n/*\n * hostkey_method_ssh_dss_signv\n *\n * Construct a signature from an array of vectors\n */\nstatic int\nhostkey_method_ssh_dss_signv(LIBSSH2_SESSION * session,\n                             unsigned char **signature,\n                             size_t *signature_len,\n                             int veccount,\n                             const struct iovec datavec[],\n                             void **abstract)\n{\n    libssh2_dsa_ctx *dsactx = (libssh2_dsa_ctx *) (*abstract);\n    unsigned char hash[SHA_DIGEST_LENGTH];\n    libssh2_sha1_ctx ctx;\n    int i;\n\n    *signature = LIBSSH2_CALLOC(session, 2 * SHA_DIGEST_LENGTH);\n    if(!*signature) {\n        return -1;\n    }\n\n    *signature_len = 2 * SHA_DIGEST_LENGTH;\n\n    libssh2_sha1_init(&ctx);\n    for(i = 0; i < veccount; i++) {\n        libssh2_sha1_update(ctx, datavec[i].iov_base, datavec[i].iov_len);\n    }\n    libssh2_sha1_final(ctx, hash);\n\n    if(_libssh2_dsa_sha1_sign(dsactx, hash, SHA_DIGEST_LENGTH, *signature)) {\n        LIBSSH2_FREE(session, *signature);\n        return -1;\n    }\n\n    return 0;\n}\n\n/*\n * libssh2_hostkey_method_ssh_dss_dtor\n *\n * Shutdown the hostkey method\n */\nstatic int\nhostkey_method_ssh_dss_dtor(LIBSSH2_SESSION * session, void **abstract)\n{\n    libssh2_dsa_ctx *dsactx = (libssh2_dsa_ctx *) (*abstract);\n    (void) session;\n\n    _libssh2_dsa_free(dsactx);\n\n    *abstract = NULL;\n\n    return 0;\n}\n\nstatic const LIBSSH2_HOSTKEY_METHOD hostkey_method_ssh_dss = {\n    \"ssh-dss\",\n    MD5_DIGEST_LENGTH,\n    hostkey_method_ssh_dss_init,\n    hostkey_method_ssh_dss_initPEM,\n    hostkey_method_ssh_dss_initPEMFromMemory,\n    hostkey_method_ssh_dss_sig_verify,\n    hostkey_method_ssh_dss_signv,\n    NULL,                       /* encrypt */\n    hostkey_method_ssh_dss_dtor,\n};\n#endif /* LIBSSH2_DSA */\n\n#if LIBSSH2_ECDSA\n\n/* ***********\n * ecdsa-sha2-nistp256/384/521 *\n *********** */\n\nstatic int\nhostkey_method_ssh_ecdsa_dtor(LIBSSH2_SESSION * session,\n                              void **abstract);\n\n/*\n * hostkey_method_ssh_ecdsa_init\n *\n * Initialize the server hostkey working area with e/n pair\n */\nstatic int\nhostkey_method_ssh_ecdsa_init(LIBSSH2_SESSION * session,\n                          const unsigned char *hostkey_data,\n                          size_t hostkey_data_len,\n                          void **abstract)\n{\n    libssh2_ecdsa_ctx *ecdsactx = NULL;\n    unsigned char *type_str, *domain, *public_key;\n    size_t key_len, len;\n    libssh2_curve_type type;\n    struct string_buf buf;\n\n    if(abstract != NULL && *abstract) {\n        hostkey_method_ssh_ecdsa_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    if(hostkey_data_len < 39) {\n        _libssh2_debug(session, LIBSSH2_TRACE_ERROR,\n                       \"host key length too short\");\n        return -1;\n    }\n\n    buf.data = (unsigned char *)hostkey_data;\n    buf.dataptr = buf.data;\n    buf.len = hostkey_data_len;\n\n    if(_libssh2_get_string(&buf, &type_str, &len) || len != 19)\n        return -1;\n\n    if(strncmp((char *) type_str, \"ecdsa-sha2-nistp256\", 19) == 0) {\n        type = LIBSSH2_EC_CURVE_NISTP256;\n    }\n    else if(strncmp((char *) type_str, \"ecdsa-sha2-nistp384\", 19) == 0) {\n        type = LIBSSH2_EC_CURVE_NISTP384;\n    }\n    else if(strncmp((char *) type_str, \"ecdsa-sha2-nistp521\", 19) == 0) {\n        type = LIBSSH2_EC_CURVE_NISTP521;\n    }\n    else {\n        return -1;\n    }\n\n    if(_libssh2_get_string(&buf, &domain, &len) || len != 8)\n        return -1;\n\n    if(type == LIBSSH2_EC_CURVE_NISTP256 &&\n       strncmp((char *)domain, \"nistp256\", 8) != 0) {\n        return -1;\n    }\n    else if(type == LIBSSH2_EC_CURVE_NISTP384 &&\n            strncmp((char *)domain, \"nistp384\", 8) != 0) {\n        return -1;\n    }\n    else if(type == LIBSSH2_EC_CURVE_NISTP521 &&\n            strncmp((char *)domain, \"nistp521\", 8) != 0) {\n        return -1;\n    }\n\n    /* public key */\n    if(_libssh2_get_string(&buf, &public_key, &key_len))\n        return -1;\n\n    if(_libssh2_ecdsa_curve_name_with_octal_new(&ecdsactx, public_key,\n                                                key_len, type))\n        return -1;\n\n    if(abstract != NULL)\n        *abstract = ecdsactx;\n\n    return 0;\n}\n\n/*\n * hostkey_method_ssh_ecdsa_initPEM\n *\n * Load a Private Key from a PEM file\n */\nstatic int\nhostkey_method_ssh_ecdsa_initPEM(LIBSSH2_SESSION * session,\n                             const char *privkeyfile,\n                             unsigned const char *passphrase,\n                             void **abstract)\n{\n    libssh2_ecdsa_ctx *ec_ctx = NULL;\n    int ret;\n\n    if(abstract != NULL && *abstract) {\n        hostkey_method_ssh_ecdsa_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    ret = _libssh2_ecdsa_new_private(&ec_ctx, session,\n                                     privkeyfile, passphrase);\n\n    if(abstract != NULL)\n        *abstract = ec_ctx;\n\n    return ret;\n}\n\n/*\n * hostkey_method_ssh_ecdsa_initPEMFromMemory\n *\n * Load a Private Key from memory\n */\nstatic int\nhostkey_method_ssh_ecdsa_initPEMFromMemory(LIBSSH2_SESSION * session,\n                                         const char *privkeyfiledata,\n                                         size_t privkeyfiledata_len,\n                                         unsigned const char *passphrase,\n                                         void **abstract)\n{\n    libssh2_ecdsa_ctx *ec_ctx = NULL;\n    int ret;\n\n    if(abstract != NULL && *abstract) {\n        hostkey_method_ssh_ecdsa_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    ret = _libssh2_ecdsa_new_private_frommemory(&ec_ctx, session,\n                                                privkeyfiledata,\n                                                privkeyfiledata_len,\n                                                passphrase);\n    if(ret) {\n        return -1;\n    }\n\n    if(abstract != NULL)\n        *abstract = ec_ctx;\n\n    return 0;\n}\n\n/*\n * hostkey_method_ecdsa_sig_verify\n *\n * Verify signature created by remote\n */\nstatic int\nhostkey_method_ssh_ecdsa_sig_verify(LIBSSH2_SESSION * session,\n                                    const unsigned char *sig,\n                                    size_t sig_len,\n                                    const unsigned char *m,\n                                    size_t m_len, void **abstract)\n{\n    unsigned char *r, *s, *name;\n    size_t r_len, s_len, name_len;\n    unsigned int len;\n    struct string_buf buf;\n    libssh2_ecdsa_ctx *ctx = (libssh2_ecdsa_ctx *) (*abstract);\n\n    (void) session;\n\n    if(sig_len < 35)\n        return -1;\n\n    /* keyname_len(4) + keyname(19){\"ecdsa-sha2-nistp256\"} +\n       signature_len(4) */\n    buf.data = (unsigned char *)sig;\n    buf.dataptr = buf.data;\n    buf.len = sig_len;\n\n   if(_libssh2_get_string(&buf, &name, &name_len) || name_len != 19)\n        return -1;\n\n    if(_libssh2_get_u32(&buf, &len) != 0 || len < 8)\n        return -1;\n\n    if(_libssh2_get_string(&buf, &r, &r_len))\n       return -1;\n\n    if(_libssh2_get_string(&buf, &s, &s_len))\n        return -1;\n\n    return _libssh2_ecdsa_verify(ctx, r, r_len, s, s_len, m, m_len);\n}\n\n\n#define LIBSSH2_HOSTKEY_METHOD_EC_SIGNV_HASH(digest_type)               \\\n    {                                                                   \\\n        unsigned char hash[SHA##digest_type##_DIGEST_LENGTH];           \\\n        libssh2_sha##digest_type##_ctx ctx;                             \\\n        int i;                                                          \\\n        libssh2_sha##digest_type##_init(&ctx);                          \\\n        for(i = 0; i < veccount; i++) {                                 \\\n            libssh2_sha##digest_type##_update(ctx, datavec[i].iov_base, \\\n                                              datavec[i].iov_len);      \\\n        }                                                               \\\n        libssh2_sha##digest_type##_final(ctx, hash);                    \\\n        ret = _libssh2_ecdsa_sign(session, ec_ctx, hash,                \\\n                                  SHA##digest_type##_DIGEST_LENGTH,     \\\n                                  signature, signature_len);            \\\n    }\n\n\n/*\n * hostkey_method_ecdsa_signv\n *\n * Construct a signature from an array of vectors\n */\nstatic int\nhostkey_method_ssh_ecdsa_signv(LIBSSH2_SESSION * session,\n                               unsigned char **signature,\n                               size_t *signature_len,\n                               int veccount,\n                               const struct iovec datavec[],\n                               void **abstract)\n{\n    libssh2_ecdsa_ctx *ec_ctx = (libssh2_ecdsa_ctx *) (*abstract);\n    libssh2_curve_type type = _libssh2_ecdsa_key_get_curve_type(ec_ctx);\n    int ret = 0;\n\n    if(type == LIBSSH2_EC_CURVE_NISTP256) {\n        LIBSSH2_HOSTKEY_METHOD_EC_SIGNV_HASH(256);\n    }\n    else if(type == LIBSSH2_EC_CURVE_NISTP384) {\n        LIBSSH2_HOSTKEY_METHOD_EC_SIGNV_HASH(384);\n    }\n    else if(type == LIBSSH2_EC_CURVE_NISTP521) {\n        LIBSSH2_HOSTKEY_METHOD_EC_SIGNV_HASH(512);\n    }\n    else {\n        return -1;\n    }\n\n    return ret;\n}\n\n/*\n * hostkey_method_ssh_ecdsa_dtor\n *\n * Shutdown the hostkey by freeing EC_KEY context\n */\nstatic int\nhostkey_method_ssh_ecdsa_dtor(LIBSSH2_SESSION * session, void **abstract)\n{\n    libssh2_ecdsa_ctx *keyctx = (libssh2_ecdsa_ctx *) (*abstract);\n    (void) session;\n\n    if(keyctx != NULL)\n        _libssh2_ecdsa_free(keyctx);\n\n    *abstract = NULL;\n\n    return 0;\n}\n\nstatic const LIBSSH2_HOSTKEY_METHOD hostkey_method_ecdsa_ssh_nistp256 = {\n    \"ecdsa-sha2-nistp256\",\n    SHA256_DIGEST_LENGTH,\n    hostkey_method_ssh_ecdsa_init,\n    hostkey_method_ssh_ecdsa_initPEM,\n    hostkey_method_ssh_ecdsa_initPEMFromMemory,\n    hostkey_method_ssh_ecdsa_sig_verify,\n    hostkey_method_ssh_ecdsa_signv,\n    NULL,                       /* encrypt */\n    hostkey_method_ssh_ecdsa_dtor,\n};\n\nstatic const LIBSSH2_HOSTKEY_METHOD hostkey_method_ecdsa_ssh_nistp384 = {\n    \"ecdsa-sha2-nistp384\",\n    SHA384_DIGEST_LENGTH,\n    hostkey_method_ssh_ecdsa_init,\n    hostkey_method_ssh_ecdsa_initPEM,\n    hostkey_method_ssh_ecdsa_initPEMFromMemory,\n    hostkey_method_ssh_ecdsa_sig_verify,\n    hostkey_method_ssh_ecdsa_signv,\n    NULL,                       /* encrypt */\n    hostkey_method_ssh_ecdsa_dtor,\n};\n\nstatic const LIBSSH2_HOSTKEY_METHOD hostkey_method_ecdsa_ssh_nistp521 = {\n    \"ecdsa-sha2-nistp521\",\n    SHA512_DIGEST_LENGTH,\n    hostkey_method_ssh_ecdsa_init,\n    hostkey_method_ssh_ecdsa_initPEM,\n    hostkey_method_ssh_ecdsa_initPEMFromMemory,\n    hostkey_method_ssh_ecdsa_sig_verify,\n    hostkey_method_ssh_ecdsa_signv,\n    NULL,                       /* encrypt */\n    hostkey_method_ssh_ecdsa_dtor,\n};\n\n#endif /* LIBSSH2_ECDSA */\n\n#if LIBSSH2_ED25519\n\n/* ***********\n * ed25519 *\n *********** */\n\nstatic int hostkey_method_ssh_ed25519_dtor(LIBSSH2_SESSION * session,\n                                           void **abstract);\n\n/*\n * hostkey_method_ssh_ed25519_init\n *\n * Initialize the server hostkey working area with e/n pair\n */\nstatic int\nhostkey_method_ssh_ed25519_init(LIBSSH2_SESSION * session,\n                                const unsigned char *hostkey_data,\n                                size_t hostkey_data_len,\n                                void **abstract)\n{\n    const unsigned char *s;\n    unsigned long len, key_len;\n    libssh2_ed25519_ctx *ctx = NULL;\n\n    if(*abstract) {\n        hostkey_method_ssh_ed25519_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    if(hostkey_data_len < 19) {\n        _libssh2_debug(session, LIBSSH2_TRACE_ERROR,\n                       \"host key length too short\");\n        return -1;\n    }\n\n    s = hostkey_data;\n    len = _libssh2_ntohu32(s);\n    s += 4;\n\n    if(len != 11 || strncmp((char *) s, \"ssh-ed25519\", 11) != 0) {\n        return -1;\n    }\n\n    s += 11;\n\n    /* public key */\n    key_len = _libssh2_ntohu32(s);\n    s += 4;\n\n    if(_libssh2_ed25519_new_public(&ctx, session, s, key_len) != 0) {\n        return -1;\n    }\n\n    *abstract = ctx;\n\n    return 0;\n}\n\n/*\n * hostkey_method_ssh_ed25519_initPEM\n *\n * Load a Private Key from a PEM file\n */\nstatic int\nhostkey_method_ssh_ed25519_initPEM(LIBSSH2_SESSION * session,\n                             const char *privkeyfile,\n                             unsigned const char *passphrase,\n                             void **abstract)\n{\n    libssh2_ed25519_ctx *ec_ctx = NULL;\n    int ret;\n\n    if(*abstract) {\n        hostkey_method_ssh_ed25519_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    ret = _libssh2_ed25519_new_private(&ec_ctx, session,\n                                       privkeyfile, passphrase);\n    if(ret) {\n        return -1;\n    }\n\n    *abstract = ec_ctx;\n\n    return ret;\n}\n\n/*\n * hostkey_method_ssh_ed25519_initPEMFromMemory\n *\n * Load a Private Key from memory\n */\nstatic int\nhostkey_method_ssh_ed25519_initPEMFromMemory(LIBSSH2_SESSION * session,\n                                             const char *privkeyfiledata,\n                                             size_t privkeyfiledata_len,\n                                             unsigned const char *passphrase,\n                                             void **abstract)\n{\n    libssh2_ed25519_ctx *ed_ctx = NULL;\n    int ret;\n\n    if(abstract != NULL && *abstract) {\n        hostkey_method_ssh_ed25519_dtor(session, abstract);\n        *abstract = NULL;\n    }\n\n    ret = _libssh2_ed25519_new_private_frommemory(&ed_ctx, session,\n                                                  privkeyfiledata,\n                                                  privkeyfiledata_len,\n                                                  passphrase);\n    if(ret) {\n        return -1;\n    }\n\n    if(abstract != NULL)\n        *abstract = ed_ctx;\n\n    return 0;\n}\n\n/*\n * hostkey_method_ssh_ed25519_sig_verify\n *\n * Verify signature created by remote\n */\nstatic int\nhostkey_method_ssh_ed25519_sig_verify(LIBSSH2_SESSION * session,\n                                      const unsigned char *sig,\n                                      size_t sig_len,\n                                      const unsigned char *m,\n                                      size_t m_len, void **abstract)\n{\n    libssh2_ed25519_ctx *ctx = (libssh2_ed25519_ctx *) (*abstract);\n    (void) session;\n\n    if(sig_len < 19)\n        return -1;\n\n    /* Skip past keyname_len(4) + keyname(11){\"ssh-ed25519\"} +\n       signature_len(4) */\n    sig += 19;\n    sig_len -= 19;\n\n    if(sig_len != LIBSSH2_ED25519_SIG_LEN)\n        return -1;\n\n    return _libssh2_ed25519_verify(ctx, sig, sig_len, m, m_len);\n}\n\n/*\n * hostkey_method_ssh_ed25519_signv\n *\n * Construct a signature from an array of vectors\n */\nstatic int\nhostkey_method_ssh_ed25519_signv(LIBSSH2_SESSION * session,\n                           unsigned char **signature,\n                           size_t *signature_len,\n                           int veccount,\n                           const struct iovec datavec[],\n                           void **abstract)\n{\n    libssh2_ed25519_ctx *ctx = (libssh2_ed25519_ctx *) (*abstract);\n\n    if(veccount != 1) {\n        return -1;\n    }\n\n    return _libssh2_ed25519_sign(ctx, session, signature, signature_len,\n                                 datavec[0].iov_base, datavec[0].iov_len);\n}\n\n\n/*\n * hostkey_method_ssh_ed25519_dtor\n *\n * Shutdown the hostkey by freeing key context\n */\nstatic int\nhostkey_method_ssh_ed25519_dtor(LIBSSH2_SESSION * session, void **abstract)\n{\n    libssh2_ed25519_ctx *keyctx = (libssh2_ed25519_ctx*) (*abstract);\n    (void) session;\n\n    if(keyctx)\n        _libssh2_ed25519_free(keyctx);\n\n    *abstract = NULL;\n\n    return 0;\n}\n\nstatic const LIBSSH2_HOSTKEY_METHOD hostkey_method_ssh_ed25519 = {\n    \"ssh-ed25519\",\n    SHA256_DIGEST_LENGTH,\n    hostkey_method_ssh_ed25519_init,\n    hostkey_method_ssh_ed25519_initPEM,\n    hostkey_method_ssh_ed25519_initPEMFromMemory,\n    hostkey_method_ssh_ed25519_sig_verify,\n    hostkey_method_ssh_ed25519_signv,\n    NULL,                       /* encrypt */\n    hostkey_method_ssh_ed25519_dtor,\n};\n\n#endif /*LIBSSH2_ED25519*/\n\n\nstatic const LIBSSH2_HOSTKEY_METHOD *hostkey_methods[] = {\n#if LIBSSH2_ECDSA\n    &hostkey_method_ecdsa_ssh_nistp256,\n    &hostkey_method_ecdsa_ssh_nistp384,\n    &hostkey_method_ecdsa_ssh_nistp521,\n#endif\n#if LIBSSH2_ED25519\n    &hostkey_method_ssh_ed25519,\n#endif\n#if LIBSSH2_RSA\n    &hostkey_method_ssh_rsa,\n#endif /* LIBSSH2_RSA */\n#if LIBSSH2_DSA\n    &hostkey_method_ssh_dss,\n#endif /* LIBSSH2_DSA */\n    NULL\n};\n\nconst LIBSSH2_HOSTKEY_METHOD **\nlibssh2_hostkey_methods(void)\n{\n    return hostkey_methods;\n}\n\n/*\n * libssh2_hostkey_hash\n *\n * Returns hash signature\n * Returned buffer should NOT be freed\n * Length of buffer is determined by hash type\n * i.e. MD5 == 16, SHA1 == 20, SHA256 == 32\n */\nLIBSSH2_API const char *\nlibssh2_hostkey_hash(LIBSSH2_SESSION * session, int hash_type)\n{\n    switch(hash_type) {\n#if LIBSSH2_MD5\n    case LIBSSH2_HOSTKEY_HASH_MD5:\n        return (session->server_hostkey_md5_valid)\n          ? (char *) session->server_hostkey_md5\n          : NULL;\n        break;\n#endif /* LIBSSH2_MD5 */\n    case LIBSSH2_HOSTKEY_HASH_SHA1:\n        return (session->server_hostkey_sha1_valid)\n          ? (char *) session->server_hostkey_sha1\n          : NULL;\n        break;\n    case LIBSSH2_HOSTKEY_HASH_SHA256:\n        return (session->server_hostkey_sha256_valid)\n          ? (char *) session->server_hostkey_sha256\n          : NULL;\n        break;\n    default:\n        return NULL;\n    }\n}\n\nstatic int hostkey_type(const unsigned char *hostkey, size_t len)\n{\n    static const unsigned char rsa[] = {\n        0, 0, 0, 0x07, 's', 's', 'h', '-', 'r', 's', 'a'\n    };\n    static const unsigned char dss[] = {\n        0, 0, 0, 0x07, 's', 's', 'h', '-', 'd', 's', 's'\n    };\n    static const unsigned char ecdsa_256[] = {\n        0, 0, 0, 0x13, 'e', 'c', 'd', 's', 'a', '-', 's', 'h', 'a', '2', '-',\n        'n', 'i', 's', 't', 'p', '2', '5', '6'\n    };\n    static const unsigned char ecdsa_384[] = {\n        0, 0, 0, 0x13, 'e', 'c', 'd', 's', 'a', '-', 's', 'h', 'a', '2', '-',\n        'n', 'i', 's', 't', 'p', '3', '8', '4'\n    };\n    static const unsigned char ecdsa_521[] = {\n        0, 0, 0, 0x13, 'e', 'c', 'd', 's', 'a', '-', 's', 'h', 'a', '2', '-',\n        'n', 'i', 's', 't', 'p', '5', '2', '1'\n    };\n    static const unsigned char ed25519[] = {\n        0, 0, 0, 0x0b, 's', 's', 'h', '-', 'e', 'd', '2', '5', '5', '1', '9'\n    };\n\n    if(len < 11)\n        return LIBSSH2_HOSTKEY_TYPE_UNKNOWN;\n\n    if(!memcmp(rsa, hostkey, 11))\n        return LIBSSH2_HOSTKEY_TYPE_RSA;\n\n    if(!memcmp(dss, hostkey, 11))\n        return LIBSSH2_HOSTKEY_TYPE_DSS;\n\n    if(len < 15)\n        return LIBSSH2_HOSTKEY_TYPE_UNKNOWN;\n\n    if(!memcmp(ed25519, hostkey, 15))\n        return LIBSSH2_HOSTKEY_TYPE_ED25519;\n\n    if(len < 23)\n        return LIBSSH2_HOSTKEY_TYPE_UNKNOWN;\n\n    if(!memcmp(ecdsa_256, hostkey, 23))\n        return LIBSSH2_HOSTKEY_TYPE_ECDSA_256;\n\n    if(!memcmp(ecdsa_384, hostkey, 23))\n        return LIBSSH2_HOSTKEY_TYPE_ECDSA_384;\n\n    if(!memcmp(ecdsa_521, hostkey, 23))\n        return LIBSSH2_HOSTKEY_TYPE_ECDSA_521;\n\n    return LIBSSH2_HOSTKEY_TYPE_UNKNOWN;\n}\n\n/*\n * libssh2_session_hostkey()\n *\n * Returns the server key and length.\n *\n */\nLIBSSH2_API const char *\nlibssh2_session_hostkey(LIBSSH2_SESSION *session, size_t *len, int *type)\n{\n    if(session->server_hostkey_len) {\n        if(len)\n            *len = session->server_hostkey_len;\n        if(type)\n            *type = hostkey_type(session->server_hostkey,\n                                 session->server_hostkey_len);\n        return (char *) session->server_hostkey;\n    }\n    if(len)\n        *len = 0;\n    return NULL;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/keepalive.c",
    "content": "/* Copyright (C) 2010  Simon Josefsson\n * Author: Simon Josefsson\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n */\n\n#include \"libssh2_priv.h\"\n#include \"transport.h\" /* _libssh2_transport_write */\n\n/* Keep-alive stuff. */\n\nLIBSSH2_API void\nlibssh2_keepalive_config (LIBSSH2_SESSION *session,\n                          int want_reply,\n                          unsigned interval)\n{\n    if(interval == 1)\n        session->keepalive_interval = 2;\n    else\n        session->keepalive_interval = interval;\n    session->keepalive_want_reply = want_reply ? 1 : 0;\n}\n\nLIBSSH2_API int\nlibssh2_keepalive_send (LIBSSH2_SESSION *session,\n                        int *seconds_to_next)\n{\n    time_t now;\n\n    if(!session->keepalive_interval) {\n        if(seconds_to_next)\n            *seconds_to_next = 0;\n        return 0;\n    }\n\n    now = time(NULL);\n\n    if(session->keepalive_last_sent + session->keepalive_interval <= now) {\n        /* Format is\n           \"SSH_MSG_GLOBAL_REQUEST || 4-byte len || str || want-reply\". */\n        unsigned char keepalive_data[]\n            = \"\\x50\\x00\\x00\\x00\\x15keepalive@libssh2.orgW\";\n        size_t len = sizeof(keepalive_data) - 1;\n        int rc;\n\n        keepalive_data[len - 1] =\n            (unsigned char)session->keepalive_want_reply;\n\n        rc = _libssh2_transport_send(session, keepalive_data, len, NULL, 0);\n        /* Silently ignore PACKET_EAGAIN here: if the write buffer is\n           already full, sending another keepalive is not useful. */\n        if(rc && rc != LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                           \"Unable to send keepalive message\");\n            return rc;\n        }\n\n        session->keepalive_last_sent = now;\n        if(seconds_to_next)\n            *seconds_to_next = session->keepalive_interval;\n    }\n    else if(seconds_to_next) {\n        *seconds_to_next = (int) (session->keepalive_last_sent - now)\n            + session->keepalive_interval;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/kex.c",
    "content": "/* Copyright (c) 2004-2007, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2010-2019, Daniel Stenberg <daniel@haxx.se>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\n#include \"transport.h\"\n#include \"comp.h\"\n#include \"mac.h\"\n\n/* TODO: Switch this to an inline and handle alloc() failures */\n/* Helper macro called from\n   kex_method_diffie_hellman_group1_sha1_key_exchange */\n#define LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(value, reqlen, version) \\\n    {                                                                   \\\n        libssh2_sha1_ctx hash;                                          \\\n        unsigned long len = 0;                                          \\\n        if(!(value)) {                                                  \\\n            value = LIBSSH2_ALLOC(session, reqlen + SHA_DIGEST_LENGTH); \\\n        }                                                               \\\n        if(value)                                                       \\\n            while(len < (unsigned long)reqlen) {                        \\\n                libssh2_sha1_init(&hash);                               \\\n                libssh2_sha1_update(hash, exchange_state->k_value,      \\\n                                    exchange_state->k_value_len);       \\\n                libssh2_sha1_update(hash, exchange_state->h_sig_comp,   \\\n                                    SHA_DIGEST_LENGTH);                 \\\n                if(len > 0) {                                           \\\n                    libssh2_sha1_update(hash, value, len);              \\\n                }                                                       \\\n                else {                                                  \\\n                    libssh2_sha1_update(hash, (version), 1);            \\\n                    libssh2_sha1_update(hash, session->session_id,      \\\n                                        session->session_id_len);       \\\n                }                                                       \\\n                libssh2_sha1_final(hash, (value) + len);                \\\n                len += SHA_DIGEST_LENGTH;                               \\\n            }                                                           \\\n    }                                                                   \\\n\n\n#define LIBSSH2_KEX_METHOD_EC_SHA_VALUE_HASH(value, reqlen, version)    \\\n    {                                                                   \\\n        if(type == LIBSSH2_EC_CURVE_NISTP256) {                         \\\n            LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, value, reqlen, version); \\\n        }                                                               \\\n        else if(type == LIBSSH2_EC_CURVE_NISTP384) {                    \\\n            LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(384, value, reqlen, version); \\\n        }                                                               \\\n        else if(type == LIBSSH2_EC_CURVE_NISTP521) {                    \\\n            LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(512, value, reqlen, version); \\\n        }                                                               \\\n    }                                                                   \\\n\n\n#define LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(digest_type, value,           \\\n                                          reqlen, version)              \\\n{                                                                       \\\n    libssh2_sha##digest_type##_ctx hash;                                \\\n    unsigned long len = 0;                                              \\\n    if(!(value)) {                                                      \\\n        value = LIBSSH2_ALLOC(session,                                  \\\n                              reqlen + SHA##digest_type##_DIGEST_LENGTH); \\\n    }                                                                   \\\n    if(value)                                                           \\\n        while(len < (unsigned long)reqlen) {                            \\\n            libssh2_sha##digest_type##_init(&hash);                     \\\n            libssh2_sha##digest_type##_update(hash,                     \\\n                                              exchange_state->k_value,  \\\n                                              exchange_state->k_value_len); \\\n            libssh2_sha##digest_type##_update(hash,                     \\\n                                              exchange_state->h_sig_comp, \\\n                                         SHA##digest_type##_DIGEST_LENGTH); \\\n            if(len > 0) {                                               \\\n                libssh2_sha##digest_type##_update(hash, value, len);    \\\n            }                                                           \\\n            else {                                                      \\\n                libssh2_sha##digest_type##_update(hash, (version), 1);  \\\n                libssh2_sha##digest_type##_update(hash, session->session_id, \\\n                                                  session->session_id_len); \\\n            }                                                           \\\n            libssh2_sha##digest_type##_final(hash, (value) + len);      \\\n            len += SHA##digest_type##_DIGEST_LENGTH;                    \\\n        }                                                               \\\n}\n\n\n/*\n * diffie_hellman_sha1\n *\n * Diffie Hellman Key Exchange, Group Agnostic\n */\nstatic int diffie_hellman_sha1(LIBSSH2_SESSION *session,\n                               _libssh2_bn *g,\n                               _libssh2_bn *p,\n                               int group_order,\n                               unsigned char packet_type_init,\n                               unsigned char packet_type_reply,\n                               unsigned char *midhash,\n                               unsigned long midhash_len,\n                               kmdhgGPshakex_state_t *exchange_state)\n{\n    int ret = 0;\n    int rc;\n    libssh2_sha1_ctx exchange_hash_ctx;\n\n    if(exchange_state->state == libssh2_NB_state_idle) {\n        /* Setup initial values */\n        exchange_state->e_packet = NULL;\n        exchange_state->s_packet = NULL;\n        exchange_state->k_value = NULL;\n        exchange_state->ctx = _libssh2_bn_ctx_new();\n        libssh2_dh_init(&exchange_state->x);\n        exchange_state->e = _libssh2_bn_init(); /* g^x mod p */\n        exchange_state->f = _libssh2_bn_init_from_bin(); /* g^(Random from\n                                                            server) mod p */\n        exchange_state->k = _libssh2_bn_init(); /* The shared secret: f^x mod\n                                                   p */\n\n        /* Zero the whole thing out */\n        memset(&exchange_state->req_state, 0, sizeof(packet_require_state_t));\n\n        /* Generate x and e */\n        rc = libssh2_dh_key_pair(&exchange_state->x, exchange_state->e, g, p,\n                                 group_order, exchange_state->ctx);\n        if(rc)\n            goto clean_exit;\n\n        /* Send KEX init */\n        /* packet_type(1) + String Length(4) + leading 0(1) */\n        exchange_state->e_packet_len =\n            _libssh2_bn_bytes(exchange_state->e) + 6;\n        if(_libssh2_bn_bits(exchange_state->e) % 8) {\n            /* Leading 00 not needed */\n            exchange_state->e_packet_len--;\n        }\n\n        exchange_state->e_packet =\n            LIBSSH2_ALLOC(session, exchange_state->e_packet_len);\n        if(!exchange_state->e_packet) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Out of memory error\");\n            goto clean_exit;\n        }\n        exchange_state->e_packet[0] = packet_type_init;\n        _libssh2_htonu32(exchange_state->e_packet + 1,\n                         exchange_state->e_packet_len - 5);\n        if(_libssh2_bn_bits(exchange_state->e) % 8) {\n            _libssh2_bn_to_bin(exchange_state->e,\n                               exchange_state->e_packet + 5);\n        }\n        else {\n            exchange_state->e_packet[5] = 0;\n            _libssh2_bn_to_bin(exchange_state->e,\n                               exchange_state->e_packet + 6);\n        }\n\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sending KEX packet %d\",\n                       (int) packet_type_init);\n        exchange_state->state = libssh2_NB_state_created;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, exchange_state->e_packet,\n                                     exchange_state->e_packet_len,\n                                     NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Unable to send KEX init message\");\n            goto clean_exit;\n        }\n        exchange_state->state = libssh2_NB_state_sent;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_sent) {\n        if(session->burn_optimistic_kexinit) {\n            /* The first KEX packet to come along will be the guess initially\n             * sent by the server.  That guess turned out to be wrong so we\n             * need to silently ignore it */\n            int burn_type;\n\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Waiting for badly guessed KEX packet \"\n                           \"(to be ignored)\");\n            burn_type =\n                _libssh2_packet_burn(session, &exchange_state->burn_state);\n            if(burn_type == LIBSSH2_ERROR_EAGAIN) {\n                return burn_type;\n            }\n            else if(burn_type <= 0) {\n                /* Failed to receive a packet */\n                ret = burn_type;\n                goto clean_exit;\n            }\n            session->burn_optimistic_kexinit = 0;\n\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Burnt packet of type: %02x\",\n                           (unsigned int) burn_type);\n        }\n\n        exchange_state->state = libssh2_NB_state_sent1;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_sent1) {\n        /* Wait for KEX reply */\n        struct string_buf buf;\n        size_t host_key_len;\n\n        rc = _libssh2_packet_require(session, packet_type_reply,\n                                     &exchange_state->s_packet,\n                                     &exchange_state->s_packet_len, 0, NULL,\n                                     0, &exchange_state->req_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        if(rc) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_TIMEOUT,\n                                 \"Timed out waiting for KEX reply\");\n            goto clean_exit;\n        }\n\n        /* Parse KEXDH_REPLY */\n        if(exchange_state->s_packet_len < 5) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                 \"Unexpected packet length\");\n            goto clean_exit;\n        }\n\n        buf.data = exchange_state->s_packet;\n        buf.len = exchange_state->s_packet_len;\n        buf.dataptr = buf.data;\n        buf.dataptr++; /* advance past type */\n\n        if(session->server_hostkey)\n            LIBSSH2_FREE(session, session->server_hostkey);\n\n        if(_libssh2_copy_string(session, &buf, &(session->server_hostkey),\n                                &host_key_len)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Could not copy host key\");\n            goto clean_exit;\n        }\n\n        session->server_hostkey_len = (uint32_t)host_key_len;\n\n#if LIBSSH2_MD5\n        {\n            libssh2_md5_ctx fingerprint_ctx;\n\n            if(libssh2_md5_init(&fingerprint_ctx)) {\n                libssh2_md5_update(fingerprint_ctx, session->server_hostkey,\n                                   session->server_hostkey_len);\n                libssh2_md5_final(fingerprint_ctx,\n                                  session->server_hostkey_md5);\n                session->server_hostkey_md5_valid = TRUE;\n            }\n            else {\n                session->server_hostkey_md5_valid = FALSE;\n            }\n        }\n#ifdef LIBSSH2DEBUG\n        {\n            char fingerprint[50], *fprint = fingerprint;\n            int i;\n            for(i = 0; i < 16; i++, fprint += 3) {\n                snprintf(fprint, 4, \"%02x:\", session->server_hostkey_md5[i]);\n            }\n            *(--fprint) = '\\0';\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Server's MD5 Fingerprint: %s\", fingerprint);\n        }\n#endif /* LIBSSH2DEBUG */\n#endif /* ! LIBSSH2_MD5 */\n\n        {\n            libssh2_sha1_ctx fingerprint_ctx;\n\n            if(libssh2_sha1_init(&fingerprint_ctx)) {\n                libssh2_sha1_update(fingerprint_ctx, session->server_hostkey,\n                                    session->server_hostkey_len);\n                libssh2_sha1_final(fingerprint_ctx,\n                                   session->server_hostkey_sha1);\n                session->server_hostkey_sha1_valid = TRUE;\n            }\n            else {\n                session->server_hostkey_sha1_valid = FALSE;\n            }\n        }\n#ifdef LIBSSH2DEBUG\n        {\n            char fingerprint[64], *fprint = fingerprint;\n            int i;\n\n            for(i = 0; i < 20; i++, fprint += 3) {\n                snprintf(fprint, 4, \"%02x:\", session->server_hostkey_sha1[i]);\n            }\n            *(--fprint) = '\\0';\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Server's SHA1 Fingerprint: %s\", fingerprint);\n        }\n#endif /* LIBSSH2DEBUG */\n\n        {\n            libssh2_sha256_ctx fingerprint_ctx;\n\n            if(libssh2_sha256_init(&fingerprint_ctx)) {\n                libssh2_sha256_update(fingerprint_ctx, session->server_hostkey,\n                                    session->server_hostkey_len);\n                libssh2_sha256_final(fingerprint_ctx,\n                                   session->server_hostkey_sha256);\n                session->server_hostkey_sha256_valid = TRUE;\n            }\n            else {\n                session->server_hostkey_sha256_valid = FALSE;\n            }\n        }\n#ifdef LIBSSH2DEBUG\n        {\n            char *base64Fingerprint = NULL;\n            _libssh2_base64_encode(session,\n                                   (const char *)\n                                   session->server_hostkey_sha256,\n                                   SHA256_DIGEST_LENGTH, &base64Fingerprint);\n            if(base64Fingerprint != NULL) {\n                _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                               \"Server's SHA256 Fingerprint: %s\",\n                               base64Fingerprint);\n                LIBSSH2_FREE(session, base64Fingerprint);\n            }\n        }\n#endif /* LIBSSH2DEBUG */\n\n\n        if(session->hostkey->init(session, session->server_hostkey,\n                                   session->server_hostkey_len,\n                                   &session->server_hostkey_abstract)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT,\n                                 \"Unable to initialize hostkey importer\");\n            goto clean_exit;\n        }\n\n        if(_libssh2_get_string(&buf, &(exchange_state->f_value),\n                               &(exchange_state->f_value_len))) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT,\n                                 \"Unable to get f value\");\n            goto clean_exit;\n        }\n\n        _libssh2_bn_from_bin(exchange_state->f, exchange_state->f_value_len,\n                             exchange_state->f_value);\n\n        if(_libssh2_get_string(&buf, &(exchange_state->h_sig),\n                               &(exchange_state->h_sig_len))) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT,\n                                 \"Unable to get h sig\");\n            goto clean_exit;\n        }\n\n        /* Compute the shared secret */\n        libssh2_dh_secret(&exchange_state->x, exchange_state->k,\n                          exchange_state->f, p, exchange_state->ctx);\n        exchange_state->k_value_len = _libssh2_bn_bytes(exchange_state->k) + 5;\n        if(_libssh2_bn_bits(exchange_state->k) % 8) {\n            /* don't need leading 00 */\n            exchange_state->k_value_len--;\n        }\n        exchange_state->k_value =\n            LIBSSH2_ALLOC(session, exchange_state->k_value_len);\n        if(!exchange_state->k_value) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Unable to allocate buffer for K\");\n            goto clean_exit;\n        }\n        _libssh2_htonu32(exchange_state->k_value,\n                         exchange_state->k_value_len - 4);\n        if(_libssh2_bn_bits(exchange_state->k) % 8) {\n            _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 4);\n        }\n        else {\n            exchange_state->k_value[4] = 0;\n            _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 5);\n        }\n\n        exchange_state->exchange_hash = (void *)&exchange_hash_ctx;\n        libssh2_sha1_init(&exchange_hash_ctx);\n\n        if(session->local.banner) {\n            _libssh2_htonu32(exchange_state->h_sig_comp,\n                             strlen((char *) session->local.banner) - 2);\n            libssh2_sha1_update(exchange_hash_ctx,\n                                exchange_state->h_sig_comp, 4);\n            libssh2_sha1_update(exchange_hash_ctx,\n                                session->local.banner,\n                                strlen((char *) session->local.banner) - 2);\n        }\n        else {\n            _libssh2_htonu32(exchange_state->h_sig_comp,\n                             sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1);\n            libssh2_sha1_update(exchange_hash_ctx,\n                                exchange_state->h_sig_comp, 4);\n            libssh2_sha1_update(exchange_hash_ctx,\n                                (const unsigned char *)\n                                LIBSSH2_SSH_DEFAULT_BANNER,\n                                sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1);\n        }\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         strlen((char *) session->remote.banner));\n        libssh2_sha1_update(exchange_hash_ctx,\n                            exchange_state->h_sig_comp, 4);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            session->remote.banner,\n                            strlen((char *) session->remote.banner));\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         session->local.kexinit_len);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            exchange_state->h_sig_comp, 4);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            session->local.kexinit,\n                            session->local.kexinit_len);\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         session->remote.kexinit_len);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            exchange_state->h_sig_comp, 4);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            session->remote.kexinit,\n                            session->remote.kexinit_len);\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         session->server_hostkey_len);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            exchange_state->h_sig_comp, 4);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            session->server_hostkey,\n                            session->server_hostkey_len);\n\n        if(packet_type_init == SSH_MSG_KEX_DH_GEX_INIT) {\n            /* diffie-hellman-group-exchange hashes additional fields */\n#ifdef LIBSSH2_DH_GEX_NEW\n            _libssh2_htonu32(exchange_state->h_sig_comp,\n                             LIBSSH2_DH_GEX_MINGROUP);\n            _libssh2_htonu32(exchange_state->h_sig_comp + 4,\n                             LIBSSH2_DH_GEX_OPTGROUP);\n            _libssh2_htonu32(exchange_state->h_sig_comp + 8,\n                             LIBSSH2_DH_GEX_MAXGROUP);\n            libssh2_sha1_update(exchange_hash_ctx,\n                                exchange_state->h_sig_comp, 12);\n#else\n            _libssh2_htonu32(exchange_state->h_sig_comp,\n                             LIBSSH2_DH_GEX_OPTGROUP);\n            libssh2_sha1_update(exchange_hash_ctx,\n                                exchange_state->h_sig_comp, 4);\n#endif\n        }\n\n        if(midhash) {\n            libssh2_sha1_update(exchange_hash_ctx, midhash,\n                                midhash_len);\n        }\n\n        libssh2_sha1_update(exchange_hash_ctx,\n                            exchange_state->e_packet + 1,\n                            exchange_state->e_packet_len - 1);\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         exchange_state->f_value_len);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            exchange_state->h_sig_comp, 4);\n        libssh2_sha1_update(exchange_hash_ctx,\n                            exchange_state->f_value,\n                            exchange_state->f_value_len);\n\n        libssh2_sha1_update(exchange_hash_ctx,\n                            exchange_state->k_value,\n                            exchange_state->k_value_len);\n\n        libssh2_sha1_final(exchange_hash_ctx,\n                           exchange_state->h_sig_comp);\n\n        if(session->hostkey->\n            sig_verify(session, exchange_state->h_sig,\n                       exchange_state->h_sig_len, exchange_state->h_sig_comp,\n                       20, &session->server_hostkey_abstract)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_SIGN,\n                                 \"Unable to verify hostkey signature\");\n            goto clean_exit;\n        }\n\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sending NEWKEYS message\");\n        exchange_state->c = SSH_MSG_NEWKEYS;\n\n        exchange_state->state = libssh2_NB_state_sent2;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_sent2) {\n        rc = _libssh2_transport_send(session, &exchange_state->c, 1, NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Unable to send NEWKEYS message\");\n            goto clean_exit;\n        }\n\n        exchange_state->state = libssh2_NB_state_sent3;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_sent3) {\n        rc = _libssh2_packet_require(session, SSH_MSG_NEWKEYS,\n                                     &exchange_state->tmp,\n                                     &exchange_state->tmp_len, 0, NULL, 0,\n                                     &exchange_state->req_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc, \"Timed out waiting for NEWKEYS\");\n            goto clean_exit;\n        }\n        /* The first key exchange has been performed,\n           switch to active crypt/comp/mac mode */\n        session->state |= LIBSSH2_STATE_NEWKEYS;\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Received NEWKEYS message\");\n\n        /* This will actually end up being just packet_type(1)\n           for this packet type anyway */\n        LIBSSH2_FREE(session, exchange_state->tmp);\n\n        if(!session->session_id) {\n            session->session_id = LIBSSH2_ALLOC(session, SHA_DIGEST_LENGTH);\n            if(!session->session_id) {\n                ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                     \"Unable to allocate buffer for \"\n                                     \"SHA digest\");\n                goto clean_exit;\n            }\n            memcpy(session->session_id, exchange_state->h_sig_comp,\n                   SHA_DIGEST_LENGTH);\n            session->session_id_len = SHA_DIGEST_LENGTH;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"session_id calculated\");\n        }\n\n        /* Cleanup any existing cipher */\n        if(session->local.crypt->dtor) {\n            session->local.crypt->dtor(session,\n                                       &session->local.crypt_abstract);\n        }\n\n        /* Calculate IV/Secret/Key for each direction */\n        if(session->local.crypt->init) {\n            unsigned char *iv = NULL, *secret = NULL;\n            int free_iv = 0, free_secret = 0;\n\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(iv,\n                                                        session->local.crypt->\n                                                        iv_len,\n                                                        (const unsigned char *)\n                                                        \"A\");\n            if(!iv) {\n                ret = -1;\n                goto clean_exit;\n            }\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(secret,\n                                                        session->local.crypt->\n                                                        secret_len,\n                                                        (const unsigned char *)\n                                                        \"C\");\n            if(!secret) {\n                LIBSSH2_FREE(session, iv);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            if(session->local.crypt->\n                init(session, session->local.crypt, iv, &free_iv, secret,\n                     &free_secret, 1, &session->local.crypt_abstract)) {\n                LIBSSH2_FREE(session, iv);\n                LIBSSH2_FREE(session, secret);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n\n            if(free_iv) {\n                _libssh2_explicit_zero(iv, session->local.crypt->iv_len);\n                LIBSSH2_FREE(session, iv);\n            }\n\n            if(free_secret) {\n                _libssh2_explicit_zero(secret,\n                                       session->local.crypt->secret_len);\n                LIBSSH2_FREE(session, secret);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Client to Server IV and Key calculated\");\n\n        if(session->remote.crypt->dtor) {\n            /* Cleanup any existing cipher */\n            session->remote.crypt->dtor(session,\n                                        &session->remote.crypt_abstract);\n        }\n\n        if(session->remote.crypt->init) {\n            unsigned char *iv = NULL, *secret = NULL;\n            int free_iv = 0, free_secret = 0;\n\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(iv,\n                                                        session->remote.crypt->\n                                                        iv_len,\n                                                        (const unsigned char *)\n                                                        \"B\");\n            if(!iv) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(secret,\n                                                        session->remote.crypt->\n                                                        secret_len,\n                                                        (const unsigned char *)\n                                                        \"D\");\n            if(!secret) {\n                LIBSSH2_FREE(session, iv);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            if(session->remote.crypt->\n                init(session, session->remote.crypt, iv, &free_iv, secret,\n                     &free_secret, 0, &session->remote.crypt_abstract)) {\n                LIBSSH2_FREE(session, iv);\n                LIBSSH2_FREE(session, secret);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n\n            if(free_iv) {\n                _libssh2_explicit_zero(iv, session->remote.crypt->iv_len);\n                LIBSSH2_FREE(session, iv);\n            }\n\n            if(free_secret) {\n                _libssh2_explicit_zero(secret,\n                                       session->remote.crypt->secret_len);\n                LIBSSH2_FREE(session, secret);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Server to Client IV and Key calculated\");\n\n        if(session->local.mac->dtor) {\n            session->local.mac->dtor(session, &session->local.mac_abstract);\n        }\n\n        if(session->local.mac->init) {\n            unsigned char *key = NULL;\n            int free_key = 0;\n\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(key,\n                                                        session->local.mac->\n                                                        key_len,\n                                                        (const unsigned char *)\n                                                        \"E\");\n            if(!key) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            session->local.mac->init(session, key, &free_key,\n                                     &session->local.mac_abstract);\n\n            if(free_key) {\n                _libssh2_explicit_zero(key, session->local.mac->key_len);\n                LIBSSH2_FREE(session, key);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Client to Server HMAC Key calculated\");\n\n        if(session->remote.mac->dtor) {\n            session->remote.mac->dtor(session, &session->remote.mac_abstract);\n        }\n\n        if(session->remote.mac->init) {\n            unsigned char *key = NULL;\n            int free_key = 0;\n\n            LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(key,\n                                                        session->remote.mac->\n                                                        key_len,\n                                                        (const unsigned char *)\n                                                        \"F\");\n            if(!key) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            session->remote.mac->init(session, key, &free_key,\n                                      &session->remote.mac_abstract);\n\n            if(free_key) {\n                _libssh2_explicit_zero(key, session->remote.mac->key_len);\n                LIBSSH2_FREE(session, key);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Server to Client HMAC Key calculated\");\n\n        /* Initialize compression for each direction */\n\n        /* Cleanup any existing compression */\n        if(session->local.comp && session->local.comp->dtor) {\n            session->local.comp->dtor(session, 1,\n                                      &session->local.comp_abstract);\n        }\n\n        if(session->local.comp && session->local.comp->init) {\n            if(session->local.comp->init(session, 1,\n                                          &session->local.comp_abstract)) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Client to Server compression initialized\");\n\n        if(session->remote.comp && session->remote.comp->dtor) {\n            session->remote.comp->dtor(session, 0,\n                                       &session->remote.comp_abstract);\n        }\n\n        if(session->remote.comp && session->remote.comp->init) {\n            if(session->remote.comp->init(session, 0,\n                                           &session->remote.comp_abstract)) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Server to Client compression initialized\");\n\n    }\n\n  clean_exit:\n    libssh2_dh_dtor(&exchange_state->x);\n    _libssh2_bn_free(exchange_state->e);\n    exchange_state->e = NULL;\n    _libssh2_bn_free(exchange_state->f);\n    exchange_state->f = NULL;\n    _libssh2_bn_free(exchange_state->k);\n    exchange_state->k = NULL;\n    _libssh2_bn_ctx_free(exchange_state->ctx);\n    exchange_state->ctx = NULL;\n\n    if(exchange_state->e_packet) {\n        LIBSSH2_FREE(session, exchange_state->e_packet);\n        exchange_state->e_packet = NULL;\n    }\n\n    if(exchange_state->s_packet) {\n        LIBSSH2_FREE(session, exchange_state->s_packet);\n        exchange_state->s_packet = NULL;\n    }\n\n    if(exchange_state->k_value) {\n        LIBSSH2_FREE(session, exchange_state->k_value);\n        exchange_state->k_value = NULL;\n    }\n\n    exchange_state->state = libssh2_NB_state_idle;\n\n    return ret;\n}\n\n\n/*\n * diffie_hellman_sha256\n *\n * Diffie Hellman Key Exchange, Group Agnostic\n */\nstatic int diffie_hellman_sha256(LIBSSH2_SESSION *session,\n                                 _libssh2_bn *g,\n                                 _libssh2_bn *p,\n                                 int group_order,\n                                 unsigned char packet_type_init,\n                                 unsigned char packet_type_reply,\n                                 unsigned char *midhash,\n                                 unsigned long midhash_len,\n                                 kmdhgGPshakex_state_t *exchange_state)\n{\n    int ret = 0;\n    int rc;\n    libssh2_sha256_ctx exchange_hash_ctx;\n\n    if(exchange_state->state == libssh2_NB_state_idle) {\n        /* Setup initial values */\n        exchange_state->e_packet = NULL;\n        exchange_state->s_packet = NULL;\n        exchange_state->k_value = NULL;\n        exchange_state->ctx = _libssh2_bn_ctx_new();\n        libssh2_dh_init(&exchange_state->x);\n        exchange_state->e = _libssh2_bn_init(); /* g^x mod p */\n        exchange_state->f = _libssh2_bn_init_from_bin(); /* g^(Random from\n                                                            server) mod p */\n        exchange_state->k = _libssh2_bn_init(); /* The shared secret: f^x mod\n                                                   p */\n\n        /* Zero the whole thing out */\n        memset(&exchange_state->req_state, 0, sizeof(packet_require_state_t));\n\n        /* Generate x and e */\n        rc = libssh2_dh_key_pair(&exchange_state->x, exchange_state->e, g, p,\n                                 group_order, exchange_state->ctx);\n        if(rc)\n            goto clean_exit;\n\n        /* Send KEX init */\n        /* packet_type(1) + String Length(4) + leading 0(1) */\n        exchange_state->e_packet_len =\n            _libssh2_bn_bytes(exchange_state->e) + 6;\n        if(_libssh2_bn_bits(exchange_state->e) % 8) {\n            /* Leading 00 not needed */\n            exchange_state->e_packet_len--;\n        }\n\n        exchange_state->e_packet =\n            LIBSSH2_ALLOC(session, exchange_state->e_packet_len);\n        if(!exchange_state->e_packet) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Out of memory error\");\n            goto clean_exit;\n        }\n        exchange_state->e_packet[0] = packet_type_init;\n        _libssh2_htonu32(exchange_state->e_packet + 1,\n                         exchange_state->e_packet_len - 5);\n        if(_libssh2_bn_bits(exchange_state->e) % 8) {\n            _libssh2_bn_to_bin(exchange_state->e,\n                               exchange_state->e_packet + 5);\n        }\n        else {\n            exchange_state->e_packet[5] = 0;\n            _libssh2_bn_to_bin(exchange_state->e,\n                               exchange_state->e_packet + 6);\n        }\n\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sending KEX packet %d\",\n                       (int) packet_type_init);\n        exchange_state->state = libssh2_NB_state_created;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, exchange_state->e_packet,\n                                     exchange_state->e_packet_len,\n                                     NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Unable to send KEX init message\");\n            goto clean_exit;\n        }\n        exchange_state->state = libssh2_NB_state_sent;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_sent) {\n        if(session->burn_optimistic_kexinit) {\n            /* The first KEX packet to come along will be the guess initially\n             * sent by the server.  That guess turned out to be wrong so we\n             * need to silently ignore it */\n            int burn_type;\n\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Waiting for badly guessed KEX packet \"\n                           \"(to be ignored)\");\n            burn_type =\n                _libssh2_packet_burn(session, &exchange_state->burn_state);\n            if(burn_type == LIBSSH2_ERROR_EAGAIN) {\n                return burn_type;\n            }\n            else if(burn_type <= 0) {\n                /* Failed to receive a packet */\n                ret = burn_type;\n                goto clean_exit;\n            }\n            session->burn_optimistic_kexinit = 0;\n\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Burnt packet of type: %02x\",\n                           (unsigned int) burn_type);\n        }\n\n        exchange_state->state = libssh2_NB_state_sent1;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_sent1) {\n        /* Wait for KEX reply */\n        struct string_buf buf;\n        size_t host_key_len;\n\n        rc = _libssh2_packet_require(session, packet_type_reply,\n                                     &exchange_state->s_packet,\n                                     &exchange_state->s_packet_len, 0, NULL,\n                                     0, &exchange_state->req_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        if(rc) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_TIMEOUT,\n                                 \"Timed out waiting for KEX reply\");\n            goto clean_exit;\n        }\n\n        /* Parse KEXDH_REPLY */\n        if(exchange_state->s_packet_len < 5) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                 \"Unexpected packet length\");\n            goto clean_exit;\n        }\n\n        buf.data = exchange_state->s_packet;\n        buf.len = exchange_state->s_packet_len;\n        buf.dataptr = buf.data;\n        buf.dataptr++; /* advance past type */\n\n        if(session->server_hostkey)\n            LIBSSH2_FREE(session, session->server_hostkey);\n\n        if(_libssh2_copy_string(session, &buf, &(session->server_hostkey),\n                                &host_key_len)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Could not copy host key\");\n            goto clean_exit;\n        }\n\n        session->server_hostkey_len = (uint32_t)host_key_len;\n\n#if LIBSSH2_MD5\n        {\n            libssh2_md5_ctx fingerprint_ctx;\n\n            if(libssh2_md5_init(&fingerprint_ctx)) {\n                libssh2_md5_update(fingerprint_ctx, session->server_hostkey,\n                                   session->server_hostkey_len);\n                libssh2_md5_final(fingerprint_ctx,\n                                  session->server_hostkey_md5);\n                session->server_hostkey_md5_valid = TRUE;\n            }\n            else {\n                session->server_hostkey_md5_valid = FALSE;\n            }\n        }\n#ifdef LIBSSH2DEBUG\n        {\n            char fingerprint[50], *fprint = fingerprint;\n            int i;\n            for(i = 0; i < 16; i++, fprint += 3) {\n                snprintf(fprint, 4, \"%02x:\", session->server_hostkey_md5[i]);\n            }\n            *(--fprint) = '\\0';\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Server's MD5 Fingerprint: %s\", fingerprint);\n        }\n#endif /* LIBSSH2DEBUG */\n#endif /* ! LIBSSH2_MD5 */\n\n        {\n            libssh2_sha1_ctx fingerprint_ctx;\n\n            if(libssh2_sha1_init(&fingerprint_ctx)) {\n                libssh2_sha1_update(fingerprint_ctx, session->server_hostkey,\n                                    session->server_hostkey_len);\n                libssh2_sha1_final(fingerprint_ctx,\n                                   session->server_hostkey_sha1);\n                session->server_hostkey_sha1_valid = TRUE;\n            }\n            else {\n                session->server_hostkey_sha1_valid = FALSE;\n            }\n        }\n#ifdef LIBSSH2DEBUG\n        {\n            char fingerprint[64], *fprint = fingerprint;\n            int i;\n\n            for(i = 0; i < 20; i++, fprint += 3) {\n                snprintf(fprint, 4, \"%02x:\", session->server_hostkey_sha1[i]);\n            }\n            *(--fprint) = '\\0';\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Server's SHA1 Fingerprint: %s\", fingerprint);\n        }\n#endif /* LIBSSH2DEBUG */\n\n        {\n            libssh2_sha256_ctx fingerprint_ctx;\n\n            if(libssh2_sha256_init(&fingerprint_ctx)) {\n                libssh2_sha256_update(fingerprint_ctx, session->server_hostkey,\n                                      session->server_hostkey_len);\n                libssh2_sha256_final(fingerprint_ctx,\n                                     session->server_hostkey_sha256);\n                session->server_hostkey_sha256_valid = TRUE;\n            }\n            else {\n                session->server_hostkey_sha256_valid = FALSE;\n            }\n        }\n#ifdef LIBSSH2DEBUG\n        {\n            char *base64Fingerprint = NULL;\n            _libssh2_base64_encode(session,\n                                   (const char *)\n                                   session->server_hostkey_sha256,\n                                   SHA256_DIGEST_LENGTH, &base64Fingerprint);\n            if(base64Fingerprint != NULL) {\n                _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                               \"Server's SHA256 Fingerprint: %s\",\n                               base64Fingerprint);\n                LIBSSH2_FREE(session, base64Fingerprint);\n            }\n        }\n#endif /* LIBSSH2DEBUG */\n\n        if(session->hostkey->init(session, session->server_hostkey,\n                                   session->server_hostkey_len,\n                                   &session->server_hostkey_abstract)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT,\n                                 \"Unable to initialize hostkey importer\");\n            goto clean_exit;\n        }\n\n        if(_libssh2_get_string(&buf, &(exchange_state->f_value),\n                               &(exchange_state->f_value_len))) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT,\n                                 \"Unable to get f value\");\n            goto clean_exit;\n        }\n\n        _libssh2_bn_from_bin(exchange_state->f, exchange_state->f_value_len,\n                             exchange_state->f_value);\n\n        if(_libssh2_get_string(&buf, &(exchange_state->h_sig),\n                               &(exchange_state->h_sig_len))) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT,\n                                 \"Unable to get h sig\");\n            goto clean_exit;\n        }\n\n        /* Compute the shared secret */\n        libssh2_dh_secret(&exchange_state->x, exchange_state->k,\n                          exchange_state->f, p, exchange_state->ctx);\n        exchange_state->k_value_len = _libssh2_bn_bytes(exchange_state->k) + 5;\n        if(_libssh2_bn_bits(exchange_state->k) % 8) {\n            /* don't need leading 00 */\n            exchange_state->k_value_len--;\n        }\n        exchange_state->k_value =\n            LIBSSH2_ALLOC(session, exchange_state->k_value_len);\n        if(!exchange_state->k_value) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Unable to allocate buffer for K\");\n            goto clean_exit;\n        }\n        _libssh2_htonu32(exchange_state->k_value,\n                         exchange_state->k_value_len - 4);\n        if(_libssh2_bn_bits(exchange_state->k) % 8) {\n            _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 4);\n        }\n        else {\n            exchange_state->k_value[4] = 0;\n            _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 5);\n        }\n\n        exchange_state->exchange_hash = (void *)&exchange_hash_ctx;\n        libssh2_sha256_init(&exchange_hash_ctx);\n\n        if(session->local.banner) {\n            _libssh2_htonu32(exchange_state->h_sig_comp,\n                             strlen((char *) session->local.banner) - 2);\n            libssh2_sha256_update(exchange_hash_ctx,\n                                  exchange_state->h_sig_comp, 4);\n            libssh2_sha256_update(exchange_hash_ctx,\n                                  session->local.banner,\n                                  strlen((char *) session->local.banner) - 2);\n        }\n        else {\n            _libssh2_htonu32(exchange_state->h_sig_comp,\n                             sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1);\n            libssh2_sha256_update(exchange_hash_ctx,\n                                  exchange_state->h_sig_comp, 4);\n            libssh2_sha256_update(exchange_hash_ctx,\n                                  (const unsigned char *)\n                                  LIBSSH2_SSH_DEFAULT_BANNER,\n                                  sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1);\n        }\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         strlen((char *) session->remote.banner));\n        libssh2_sha256_update(exchange_hash_ctx,\n                              exchange_state->h_sig_comp, 4);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              session->remote.banner,\n                              strlen((char *) session->remote.banner));\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         session->local.kexinit_len);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              exchange_state->h_sig_comp, 4);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              session->local.kexinit,\n                              session->local.kexinit_len);\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         session->remote.kexinit_len);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              exchange_state->h_sig_comp, 4);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              session->remote.kexinit,\n                              session->remote.kexinit_len);\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         session->server_hostkey_len);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              exchange_state->h_sig_comp, 4);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              session->server_hostkey,\n                              session->server_hostkey_len);\n\n        if(packet_type_init == SSH_MSG_KEX_DH_GEX_INIT) {\n            /* diffie-hellman-group-exchange hashes additional fields */\n#ifdef LIBSSH2_DH_GEX_NEW\n            _libssh2_htonu32(exchange_state->h_sig_comp,\n                             LIBSSH2_DH_GEX_MINGROUP);\n            _libssh2_htonu32(exchange_state->h_sig_comp + 4,\n                             LIBSSH2_DH_GEX_OPTGROUP);\n            _libssh2_htonu32(exchange_state->h_sig_comp + 8,\n                             LIBSSH2_DH_GEX_MAXGROUP);\n            libssh2_sha256_update(exchange_hash_ctx,\n                                  exchange_state->h_sig_comp, 12);\n#else\n            _libssh2_htonu32(exchange_state->h_sig_comp,\n                             LIBSSH2_DH_GEX_OPTGROUP);\n            libssh2_sha256_update(exchange_hash_ctx,\n                                  exchange_state->h_sig_comp, 4);\n#endif\n        }\n\n        if(midhash) {\n            libssh2_sha256_update(exchange_hash_ctx, midhash,\n                                  midhash_len);\n        }\n\n        libssh2_sha256_update(exchange_hash_ctx,\n                              exchange_state->e_packet + 1,\n                              exchange_state->e_packet_len - 1);\n\n        _libssh2_htonu32(exchange_state->h_sig_comp,\n                         exchange_state->f_value_len);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              exchange_state->h_sig_comp, 4);\n        libssh2_sha256_update(exchange_hash_ctx,\n                              exchange_state->f_value,\n                              exchange_state->f_value_len);\n\n        libssh2_sha256_update(exchange_hash_ctx,\n                              exchange_state->k_value,\n                              exchange_state->k_value_len);\n\n        libssh2_sha256_final(exchange_hash_ctx,\n                             exchange_state->h_sig_comp);\n\n        if(session->hostkey->\n           sig_verify(session, exchange_state->h_sig,\n                      exchange_state->h_sig_len, exchange_state->h_sig_comp,\n                      SHA256_DIGEST_LENGTH,\n                      &session->server_hostkey_abstract)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_SIGN,\n                                 \"Unable to verify hostkey signature\");\n            goto clean_exit;\n        }\n\n\n\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sending NEWKEYS message\");\n        exchange_state->c = SSH_MSG_NEWKEYS;\n\n        exchange_state->state = libssh2_NB_state_sent2;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_sent2) {\n        rc = _libssh2_transport_send(session, &exchange_state->c, 1, NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Unable to send NEWKEYS message\");\n            goto clean_exit;\n        }\n\n        exchange_state->state = libssh2_NB_state_sent3;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_sent3) {\n        rc = _libssh2_packet_require(session, SSH_MSG_NEWKEYS,\n                                     &exchange_state->tmp,\n                                     &exchange_state->tmp_len, 0, NULL, 0,\n                                     &exchange_state->req_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc, \"Timed out waiting for NEWKEYS\");\n            goto clean_exit;\n        }\n        /* The first key exchange has been performed,\n           switch to active crypt/comp/mac mode */\n        session->state |= LIBSSH2_STATE_NEWKEYS;\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Received NEWKEYS message\");\n\n        /* This will actually end up being just packet_type(1)\n           for this packet type anyway */\n        LIBSSH2_FREE(session, exchange_state->tmp);\n\n        if(!session->session_id) {\n            session->session_id = LIBSSH2_ALLOC(session, SHA256_DIGEST_LENGTH);\n            if(!session->session_id) {\n                ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                     \"Unable to allocate buffer for \"\n                                     \"SHA digest\");\n                goto clean_exit;\n            }\n            memcpy(session->session_id, exchange_state->h_sig_comp,\n                   SHA256_DIGEST_LENGTH);\n            session->session_id_len = SHA256_DIGEST_LENGTH;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"session_id calculated\");\n        }\n\n        /* Cleanup any existing cipher */\n        if(session->local.crypt->dtor) {\n            session->local.crypt->dtor(session,\n                                       &session->local.crypt_abstract);\n        }\n\n        /* Calculate IV/Secret/Key for each direction */\n        if(session->local.crypt->init) {\n            unsigned char *iv = NULL, *secret = NULL;\n            int free_iv = 0, free_secret = 0;\n\n            LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, iv,\n                                              session->local.crypt->\n                                              iv_len,\n                                              (const unsigned char *)\"A\");\n            if(!iv) {\n                ret = -1;\n                goto clean_exit;\n            }\n            LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, secret,\n                                              session->local.crypt->\n                                              secret_len,\n                                              (const unsigned char *)\"C\");\n            if(!secret) {\n                LIBSSH2_FREE(session, iv);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            if(session->local.crypt->\n                init(session, session->local.crypt, iv, &free_iv, secret,\n                     &free_secret, 1, &session->local.crypt_abstract)) {\n                LIBSSH2_FREE(session, iv);\n                LIBSSH2_FREE(session, secret);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n\n            if(free_iv) {\n                _libssh2_explicit_zero(iv, session->local.crypt->iv_len);\n                LIBSSH2_FREE(session, iv);\n            }\n\n            if(free_secret) {\n                _libssh2_explicit_zero(secret,\n                                       session->local.crypt->secret_len);\n                LIBSSH2_FREE(session, secret);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Client to Server IV and Key calculated\");\n\n        if(session->remote.crypt->dtor) {\n            /* Cleanup any existing cipher */\n            session->remote.crypt->dtor(session,\n                                        &session->remote.crypt_abstract);\n        }\n\n        if(session->remote.crypt->init) {\n            unsigned char *iv = NULL, *secret = NULL;\n            int free_iv = 0, free_secret = 0;\n\n            LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, iv,\n                                              session->remote.crypt->\n                                              iv_len,\n                                              (const unsigned char *)\"B\");\n            if(!iv) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, secret,\n                                              session->remote.crypt->\n                                              secret_len,\n                                              (const unsigned char *)\"D\");\n            if(!secret) {\n                LIBSSH2_FREE(session, iv);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            if(session->remote.crypt->\n                init(session, session->remote.crypt, iv, &free_iv, secret,\n                     &free_secret, 0, &session->remote.crypt_abstract)) {\n                LIBSSH2_FREE(session, iv);\n                LIBSSH2_FREE(session, secret);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n\n            if(free_iv) {\n                _libssh2_explicit_zero(iv, session->remote.crypt->iv_len);\n                LIBSSH2_FREE(session, iv);\n            }\n\n            if(free_secret) {\n                _libssh2_explicit_zero(secret,\n                                       session->remote.crypt->secret_len);\n                LIBSSH2_FREE(session, secret);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Server to Client IV and Key calculated\");\n\n        if(session->local.mac->dtor) {\n            session->local.mac->dtor(session, &session->local.mac_abstract);\n        }\n\n        if(session->local.mac->init) {\n            unsigned char *key = NULL;\n            int free_key = 0;\n\n            LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, key,\n                                              session->local.mac->\n                                              key_len,\n                                              (const unsigned char *)\"E\");\n            if(!key) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            session->local.mac->init(session, key, &free_key,\n                                     &session->local.mac_abstract);\n\n            if(free_key) {\n                _libssh2_explicit_zero(key, session->local.mac->key_len);\n                LIBSSH2_FREE(session, key);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Client to Server HMAC Key calculated\");\n\n        if(session->remote.mac->dtor) {\n            session->remote.mac->dtor(session, &session->remote.mac_abstract);\n        }\n\n        if(session->remote.mac->init) {\n            unsigned char *key = NULL;\n            int free_key = 0;\n\n            LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, key,\n                                              session->remote.mac->\n                                              key_len,\n                                              (const unsigned char *)\"F\");\n            if(!key) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            session->remote.mac->init(session, key, &free_key,\n                                      &session->remote.mac_abstract);\n\n            if(free_key) {\n                _libssh2_explicit_zero(key, session->remote.mac->key_len);\n                LIBSSH2_FREE(session, key);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Server to Client HMAC Key calculated\");\n\n        /* Initialize compression for each direction */\n\n        /* Cleanup any existing compression */\n        if(session->local.comp && session->local.comp->dtor) {\n            session->local.comp->dtor(session, 1,\n                                      &session->local.comp_abstract);\n        }\n\n        if(session->local.comp && session->local.comp->init) {\n            if(session->local.comp->init(session, 1,\n                                          &session->local.comp_abstract)) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Client to Server compression initialized\");\n\n        if(session->remote.comp && session->remote.comp->dtor) {\n            session->remote.comp->dtor(session, 0,\n                                       &session->remote.comp_abstract);\n        }\n\n        if(session->remote.comp && session->remote.comp->init) {\n            if(session->remote.comp->init(session, 0,\n                                           &session->remote.comp_abstract)) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Server to Client compression initialized\");\n\n    }\n\n  clean_exit:\n    libssh2_dh_dtor(&exchange_state->x);\n    _libssh2_bn_free(exchange_state->e);\n    exchange_state->e = NULL;\n    _libssh2_bn_free(exchange_state->f);\n    exchange_state->f = NULL;\n    _libssh2_bn_free(exchange_state->k);\n    exchange_state->k = NULL;\n    _libssh2_bn_ctx_free(exchange_state->ctx);\n    exchange_state->ctx = NULL;\n\n    if(exchange_state->e_packet) {\n        LIBSSH2_FREE(session, exchange_state->e_packet);\n        exchange_state->e_packet = NULL;\n    }\n\n    if(exchange_state->s_packet) {\n        LIBSSH2_FREE(session, exchange_state->s_packet);\n        exchange_state->s_packet = NULL;\n    }\n\n    if(exchange_state->k_value) {\n        LIBSSH2_FREE(session, exchange_state->k_value);\n        exchange_state->k_value = NULL;\n    }\n\n    exchange_state->state = libssh2_NB_state_idle;\n\n    return ret;\n}\n\n\n\n/* kex_method_diffie_hellman_group1_sha1_key_exchange\n * Diffie-Hellman Group1 (Actually Group2) Key Exchange using SHA1\n */\nstatic int\nkex_method_diffie_hellman_group1_sha1_key_exchange(LIBSSH2_SESSION *session,\n                                                   key_exchange_state_low_t\n                                                   * key_state)\n{\n    static const unsigned char p_value[128] = {\n        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n        0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,\n        0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,\n        0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,\n        0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,\n        0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,\n        0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,\n        0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,\n        0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,\n        0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,\n        0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,\n        0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,\n        0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,\n        0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,\n        0x49, 0x28, 0x66, 0x51, 0xEC, 0xE6, 0x53, 0x81,\n        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\n    };\n\n    int ret;\n\n    if(key_state->state == libssh2_NB_state_idle) {\n        /* g == 2 */\n        key_state->p = _libssh2_bn_init_from_bin(); /* SSH2 defined value\n                                                       (p_value) */\n        key_state->g = _libssh2_bn_init();      /* SSH2 defined value (2) */\n\n        /* Initialize P and G */\n        _libssh2_bn_set_word(key_state->g, 2);\n        _libssh2_bn_from_bin(key_state->p, 128, p_value);\n\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Initiating Diffie-Hellman Group1 Key Exchange\");\n\n        key_state->state = libssh2_NB_state_created;\n    }\n    ret = diffie_hellman_sha1(session, key_state->g, key_state->p, 128,\n                              SSH_MSG_KEXDH_INIT, SSH_MSG_KEXDH_REPLY,\n                              NULL, 0, &key_state->exchange_state);\n    if(ret == LIBSSH2_ERROR_EAGAIN) {\n        return ret;\n    }\n\n    _libssh2_bn_free(key_state->p);\n    key_state->p = NULL;\n    _libssh2_bn_free(key_state->g);\n    key_state->g = NULL;\n    key_state->state = libssh2_NB_state_idle;\n\n    return ret;\n}\n\n\n\n/* kex_method_diffie_hellman_group14_sha1_key_exchange\n * Diffie-Hellman Group14 Key Exchange using SHA1\n */\nstatic int\nkex_method_diffie_hellman_group14_sha1_key_exchange(LIBSSH2_SESSION *session,\n                                                    key_exchange_state_low_t\n                                                    * key_state)\n{\n    static const unsigned char p_value[256] = {\n        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n        0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,\n        0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,\n        0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,\n        0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,\n        0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,\n        0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,\n        0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,\n        0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,\n        0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,\n        0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,\n        0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,\n        0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,\n        0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,\n        0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,\n        0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,\n        0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,\n        0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,\n        0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,\n        0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,\n        0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,\n        0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,\n        0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,\n        0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,\n        0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,\n        0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,\n        0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,\n        0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,\n        0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,\n        0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,\n        0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68,\n        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\n    };\n    int ret;\n\n    if(key_state->state == libssh2_NB_state_idle) {\n        key_state->p = _libssh2_bn_init_from_bin(); /* SSH2 defined value\n                                                       (p_value) */\n        key_state->g = _libssh2_bn_init();      /* SSH2 defined value (2) */\n\n        /* g == 2 */\n        /* Initialize P and G */\n        _libssh2_bn_set_word(key_state->g, 2);\n        _libssh2_bn_from_bin(key_state->p, 256, p_value);\n\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Initiating Diffie-Hellman Group14 Key Exchange\");\n\n        key_state->state = libssh2_NB_state_created;\n    }\n    ret = diffie_hellman_sha1(session, key_state->g, key_state->p,\n                              256, SSH_MSG_KEXDH_INIT, SSH_MSG_KEXDH_REPLY,\n                              NULL, 0, &key_state->exchange_state);\n    if(ret == LIBSSH2_ERROR_EAGAIN) {\n        return ret;\n    }\n\n    key_state->state = libssh2_NB_state_idle;\n    _libssh2_bn_free(key_state->p);\n    key_state->p = NULL;\n    _libssh2_bn_free(key_state->g);\n    key_state->g = NULL;\n\n    return ret;\n}\n\n\n\n/* kex_method_diffie_hellman_group_exchange_sha1_key_exchange\n * Diffie-Hellman Group Exchange Key Exchange using SHA1\n * Negotiates random(ish) group for secret derivation\n */\nstatic int\nkex_method_diffie_hellman_group_exchange_sha1_key_exchange\n(LIBSSH2_SESSION * session, key_exchange_state_low_t * key_state)\n{\n    int ret = 0;\n    int rc;\n\n    if(key_state->state == libssh2_NB_state_idle) {\n        key_state->p = _libssh2_bn_init_from_bin();\n        key_state->g = _libssh2_bn_init_from_bin();\n        /* Ask for a P and G pair */\n#ifdef LIBSSH2_DH_GEX_NEW\n        key_state->request[0] = SSH_MSG_KEX_DH_GEX_REQUEST;\n        _libssh2_htonu32(key_state->request + 1, LIBSSH2_DH_GEX_MINGROUP);\n        _libssh2_htonu32(key_state->request + 5, LIBSSH2_DH_GEX_OPTGROUP);\n        _libssh2_htonu32(key_state->request + 9, LIBSSH2_DH_GEX_MAXGROUP);\n        key_state->request_len = 13;\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Initiating Diffie-Hellman Group-Exchange \"\n                       \"(New Method)\");\n#else\n        key_state->request[0] = SSH_MSG_KEX_DH_GEX_REQUEST_OLD;\n        _libssh2_htonu32(key_state->request + 1, LIBSSH2_DH_GEX_OPTGROUP);\n        key_state->request_len = 5;\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Initiating Diffie-Hellman Group-Exchange \"\n                       \"(Old Method)\");\n#endif\n\n        key_state->state = libssh2_NB_state_created;\n    }\n\n    if(key_state->state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, key_state->request,\n                                     key_state->request_len, NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Unable to send Group Exchange Request\");\n            goto dh_gex_clean_exit;\n        }\n\n        key_state->state = libssh2_NB_state_sent;\n    }\n\n    if(key_state->state == libssh2_NB_state_sent) {\n        rc = _libssh2_packet_require(session, SSH_MSG_KEX_DH_GEX_GROUP,\n                                     &key_state->data, &key_state->data_len,\n                                     0, NULL, 0, &key_state->req_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Timeout waiting for GEX_GROUP reply\");\n            goto dh_gex_clean_exit;\n        }\n\n        key_state->state = libssh2_NB_state_sent1;\n    }\n\n    if(key_state->state == libssh2_NB_state_sent1) {\n        size_t p_len, g_len;\n        unsigned char *p, *g;\n        struct string_buf buf;\n\n        if(key_state->data_len < 9) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                 \"Unexpected key length\");\n            goto dh_gex_clean_exit;\n        }\n\n        buf.data = key_state->data;\n        buf.dataptr = buf.data;\n        buf.len = key_state->data_len;\n\n        buf.dataptr++; /* increment to big num */\n\n        if(_libssh2_get_bignum_bytes(&buf, &p, &p_len)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                 \"Unexpected value\");\n            goto dh_gex_clean_exit;\n        }\n\n        if(_libssh2_get_bignum_bytes(&buf, &g, &g_len)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                 \"Unexpected value\");\n            goto dh_gex_clean_exit;\n        }\n\n        _libssh2_bn_from_bin(key_state->p, p_len, p);\n        _libssh2_bn_from_bin(key_state->g, g_len, g);\n\n        ret = diffie_hellman_sha1(session, key_state->g, key_state->p, p_len,\n                                  SSH_MSG_KEX_DH_GEX_INIT,\n                                  SSH_MSG_KEX_DH_GEX_REPLY,\n                                  key_state->data + 1,\n                                  key_state->data_len - 1,\n                                  &key_state->exchange_state);\n        if(ret == LIBSSH2_ERROR_EAGAIN) {\n            return ret;\n        }\n\n        LIBSSH2_FREE(session, key_state->data);\n    }\n\n  dh_gex_clean_exit:\n    key_state->state = libssh2_NB_state_idle;\n    _libssh2_bn_free(key_state->g);\n    key_state->g = NULL;\n    _libssh2_bn_free(key_state->p);\n    key_state->p = NULL;\n\n    return ret;\n}\n\n\n\n/* kex_method_diffie_hellman_group_exchange_sha256_key_exchange\n * Diffie-Hellman Group Exchange Key Exchange using SHA256\n * Negotiates random(ish) group for secret derivation\n */\nstatic int\nkex_method_diffie_hellman_group_exchange_sha256_key_exchange\n(LIBSSH2_SESSION * session, key_exchange_state_low_t * key_state)\n{\n    int ret = 0;\n    int rc;\n\n    if(key_state->state == libssh2_NB_state_idle) {\n        key_state->p = _libssh2_bn_init();\n        key_state->g = _libssh2_bn_init();\n        /* Ask for a P and G pair */\n#ifdef LIBSSH2_DH_GEX_NEW\n        key_state->request[0] = SSH_MSG_KEX_DH_GEX_REQUEST;\n        _libssh2_htonu32(key_state->request + 1, LIBSSH2_DH_GEX_MINGROUP);\n        _libssh2_htonu32(key_state->request + 5, LIBSSH2_DH_GEX_OPTGROUP);\n        _libssh2_htonu32(key_state->request + 9, LIBSSH2_DH_GEX_MAXGROUP);\n        key_state->request_len = 13;\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Initiating Diffie-Hellman Group-Exchange \"\n                       \"(New Method SHA256)\");\n#else\n        key_state->request[0] = SSH_MSG_KEX_DH_GEX_REQUEST_OLD;\n        _libssh2_htonu32(key_state->request + 1, LIBSSH2_DH_GEX_OPTGROUP);\n        key_state->request_len = 5;\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Initiating Diffie-Hellman Group-Exchange \"\n                       \"(Old Method SHA256)\");\n#endif\n\n        key_state->state = libssh2_NB_state_created;\n    }\n\n    if(key_state->state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, key_state->request,\n                                     key_state->request_len, NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Unable to send \"\n                                 \"Group Exchange Request SHA256\");\n            goto dh_gex_clean_exit;\n        }\n\n        key_state->state = libssh2_NB_state_sent;\n    }\n\n    if(key_state->state == libssh2_NB_state_sent) {\n        rc = _libssh2_packet_require(session, SSH_MSG_KEX_DH_GEX_GROUP,\n                                     &key_state->data, &key_state->data_len,\n                                     0, NULL, 0, &key_state->req_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Timeout waiting for GEX_GROUP reply SHA256\");\n            goto dh_gex_clean_exit;\n        }\n\n        key_state->state = libssh2_NB_state_sent1;\n    }\n\n    if(key_state->state == libssh2_NB_state_sent1) {\n        unsigned char *p, *g;\n        size_t p_len, g_len;\n        struct string_buf buf;\n\n        if(key_state->data_len < 9) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                 \"Unexpected key length\");\n            goto dh_gex_clean_exit;\n        }\n\n        buf.data = key_state->data;\n        buf.dataptr = buf.data;\n        buf.len = key_state->data_len;\n\n        buf.dataptr++; /* increment to big num */\n\n        if(_libssh2_get_bignum_bytes(&buf, &p, &p_len)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                 \"Unexpected value\");\n            goto dh_gex_clean_exit;\n        }\n\n        if(_libssh2_get_bignum_bytes(&buf, &g, &g_len)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                 \"Unexpected value\");\n            goto dh_gex_clean_exit;\n        }\n\n        _libssh2_bn_from_bin(key_state->p, p_len, p);\n        _libssh2_bn_from_bin(key_state->g, g_len, g);\n\n        ret = diffie_hellman_sha256(session, key_state->g, key_state->p, p_len,\n                                    SSH_MSG_KEX_DH_GEX_INIT,\n                                    SSH_MSG_KEX_DH_GEX_REPLY,\n                                    key_state->data + 1,\n                                    key_state->data_len - 1,\n                                    &key_state->exchange_state);\n        if(ret == LIBSSH2_ERROR_EAGAIN) {\n            return ret;\n        }\n\n        LIBSSH2_FREE(session, key_state->data);\n    }\n\n  dh_gex_clean_exit:\n    key_state->state = libssh2_NB_state_idle;\n    _libssh2_bn_free(key_state->g);\n    key_state->g = NULL;\n    _libssh2_bn_free(key_state->p);\n    key_state->p = NULL;\n\n    return ret;\n}\n\n\n#if LIBSSH2_ECDSA\n\n/* kex_session_ecdh_curve_type\n * returns the EC curve type by name used in key exchange\n */\n\nstatic int\nkex_session_ecdh_curve_type(const char *name, libssh2_curve_type *out_type)\n{\n    int ret = 0;\n    libssh2_curve_type type;\n\n    if(name == NULL)\n        return -1;\n\n    if(strcmp(name, \"ecdh-sha2-nistp256\") == 0)\n        type = LIBSSH2_EC_CURVE_NISTP256;\n    else if(strcmp(name, \"ecdh-sha2-nistp384\") == 0)\n        type = LIBSSH2_EC_CURVE_NISTP384;\n    else if(strcmp(name, \"ecdh-sha2-nistp521\") == 0)\n        type = LIBSSH2_EC_CURVE_NISTP521;\n    else {\n        ret = -1;\n    }\n\n    if(ret == 0 && out_type) {\n        *out_type = type;\n    }\n\n    return ret;\n}\n\n\n/* LIBSSH2_KEX_METHOD_EC_SHA_HASH_CREATE_VERIFY\n *\n * Macro that create and verifies EC SHA hash with a given digest bytes\n *\n * Payload format:\n *\n * string   V_C, client's identification string (CR and LF excluded)\n * string   V_S, server's identification string (CR and LF excluded)\n * string   I_C, payload of the client's SSH_MSG_KEXINIT\n * string   I_S, payload of the server's SSH_MSG_KEXINIT\n * string   K_S, server's public host key\n * string   Q_C, client's ephemeral public key octet string\n * string   Q_S, server's ephemeral public key octet string\n * mpint    K,   shared secret\n *\n */\n\n#define LIBSSH2_KEX_METHOD_EC_SHA_HASH_CREATE_VERIFY(digest_type)       \\\n{                                                                       \\\n    libssh2_sha##digest_type##_ctx ctx;                                 \\\n    exchange_state->exchange_hash = (void *)&ctx;                       \\\n    libssh2_sha##digest_type##_init(&ctx);                              \\\n    if(session->local.banner) {                                         \\\n        _libssh2_htonu32(exchange_state->h_sig_comp,                    \\\n                         strlen((char *) session->local.banner) - 2);   \\\n        libssh2_sha##digest_type##_update(ctx,                          \\\n                                          exchange_state->h_sig_comp, 4); \\\n        libssh2_sha##digest_type##_update(ctx,                          \\\n                                          (char *) session->local.banner, \\\n                                          strlen((char *)               \\\n                                                 session->local.banner) \\\n                                          - 2);                         \\\n    }                                                                   \\\n    else {                                                              \\\n        _libssh2_htonu32(exchange_state->h_sig_comp,                    \\\n                         sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1);       \\\n        libssh2_sha##digest_type##_update(ctx,                          \\\n                                          exchange_state->h_sig_comp, 4); \\\n        libssh2_sha##digest_type##_update(ctx,                          \\\n                                          LIBSSH2_SSH_DEFAULT_BANNER,   \\\n                                          sizeof(LIBSSH2_SSH_DEFAULT_BANNER) \\\n                                          - 1);                         \\\n    }                                                                   \\\n                                                                        \\\n    _libssh2_htonu32(exchange_state->h_sig_comp,                        \\\n                     strlen((char *) session->remote.banner));          \\\n    libssh2_sha##digest_type##_update(ctx,                              \\\n                                      exchange_state->h_sig_comp, 4);   \\\n    libssh2_sha##digest_type##_update(ctx,                              \\\n                                      session->remote.banner,           \\\n                                      strlen((char *)                   \\\n                                             session->remote.banner));  \\\n                                                                        \\\n    _libssh2_htonu32(exchange_state->h_sig_comp,                        \\\n                     session->local.kexinit_len);                       \\\n    libssh2_sha##digest_type##_update(ctx,                              \\\n                                      exchange_state->h_sig_comp, 4);   \\\n    libssh2_sha##digest_type##_update(ctx,                              \\\n                                      session->local.kexinit,           \\\n                                      session->local.kexinit_len);      \\\n                                                                        \\\n    _libssh2_htonu32(exchange_state->h_sig_comp,                        \\\n                     session->remote.kexinit_len);                      \\\n    libssh2_sha##digest_type##_update(ctx,                              \\\n                                      exchange_state->h_sig_comp, 4);   \\\n    libssh2_sha##digest_type##_update(ctx,                              \\\n                                      session->remote.kexinit,          \\\n                                      session->remote.kexinit_len);     \\\n                                                                        \\\n    _libssh2_htonu32(exchange_state->h_sig_comp,                        \\\n                     session->server_hostkey_len);                      \\\n    libssh2_sha##digest_type##_update(ctx,                              \\\n                                      exchange_state->h_sig_comp, 4);   \\\n    libssh2_sha##digest_type##_update(ctx,                              \\\n                                      session->server_hostkey,          \\\n                                      session->server_hostkey_len);     \\\n                                                                        \\\n    _libssh2_htonu32(exchange_state->h_sig_comp,                        \\\n                     public_key_len);                                   \\\n    libssh2_sha##digest_type##_update(ctx,                              \\\n                                      exchange_state->h_sig_comp, 4);   \\\n    libssh2_sha##digest_type##_update(ctx,                              \\\n                                      public_key,                       \\\n                                      public_key_len);                  \\\n                                                                        \\\n    _libssh2_htonu32(exchange_state->h_sig_comp,                        \\\n                     server_public_key_len);                            \\\n    libssh2_sha##digest_type##_update(ctx,                              \\\n                                      exchange_state->h_sig_comp, 4);   \\\n    libssh2_sha##digest_type##_update(ctx,                              \\\n                                      server_public_key,                \\\n                                      server_public_key_len);           \\\n                                                                        \\\n    libssh2_sha##digest_type##_update(ctx,                              \\\n                                      exchange_state->k_value,          \\\n                                      exchange_state->k_value_len);     \\\n                                                                        \\\n    libssh2_sha##digest_type##_final(ctx, exchange_state->h_sig_comp);  \\\n                                                                        \\\n    if(session->hostkey->                                               \\\n       sig_verify(session, exchange_state->h_sig,                       \\\n                  exchange_state->h_sig_len, exchange_state->h_sig_comp, \\\n                  SHA##digest_type##_DIGEST_LENGTH,                     \\\n                  &session->server_hostkey_abstract)) {                 \\\n        rc = -1;                                                        \\\n    }                                                                   \\\n}                                                                       \\\n\n\n/* ecdh_sha2_nistp\n * Elliptic Curve Diffie Hellman Key Exchange\n */\n\nstatic int ecdh_sha2_nistp(LIBSSH2_SESSION *session, libssh2_curve_type type,\n                           unsigned char *data, size_t data_len,\n                           unsigned char *public_key,\n                           size_t public_key_len, _libssh2_ec_key *private_key,\n                           kmdhgGPshakex_state_t *exchange_state)\n{\n    int ret = 0;\n    int rc;\n\n    if(data_len < 5) {\n        ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT,\n                            \"Host key data is too short\");\n        return ret;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_idle) {\n\n        /* Setup initial values */\n        exchange_state->k = _libssh2_bn_init();\n\n        exchange_state->state = libssh2_NB_state_created;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_created) {\n        /* parse INIT reply data */\n\n        /* host key K_S */\n        unsigned char *s = data + 1; /* Advance past packet type */\n        unsigned char *server_public_key;\n        size_t server_public_key_len;\n        size_t host_sig_len;\n\n        session->server_hostkey_len =\n            _libssh2_ntohu32((const unsigned char *)s);\n        s += 4;\n\n        session->server_hostkey = LIBSSH2_ALLOC(session,\n                                                session->server_hostkey_len);\n        if(!session->server_hostkey) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Unable to allocate memory for a copy \"\n                                 \"of the host key\");\n            goto clean_exit;\n        }\n\n        memcpy(session->server_hostkey, s, session->server_hostkey_len);\n        s += session->server_hostkey_len;\n\n#if LIBSSH2_MD5\n        {\n            libssh2_md5_ctx fingerprint_ctx;\n\n            if(libssh2_md5_init(&fingerprint_ctx)) {\n                libssh2_md5_update(fingerprint_ctx, session->server_hostkey,\n                                   session->server_hostkey_len);\n                libssh2_md5_final(fingerprint_ctx,\n                                  session->server_hostkey_md5);\n                session->server_hostkey_md5_valid = TRUE;\n            }\n            else {\n                session->server_hostkey_md5_valid = FALSE;\n            }\n        }\n#ifdef LIBSSH2DEBUG\n        {\n            char fingerprint[50], *fprint = fingerprint;\n            int i;\n            for(i = 0; i < 16; i++, fprint += 3) {\n                snprintf(fprint, 4, \"%02x:\", session->server_hostkey_md5[i]);\n            }\n            *(--fprint) = '\\0';\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Server's MD5 Fingerprint: %s\", fingerprint);\n        }\n#endif /* LIBSSH2DEBUG */\n#endif /* ! LIBSSH2_MD5 */\n\n        {\n            libssh2_sha1_ctx fingerprint_ctx;\n\n            if(libssh2_sha1_init(&fingerprint_ctx)) {\n                libssh2_sha1_update(fingerprint_ctx, session->server_hostkey,\n                                    session->server_hostkey_len);\n                libssh2_sha1_final(fingerprint_ctx,\n                                   session->server_hostkey_sha1);\n                session->server_hostkey_sha1_valid = TRUE;\n            }\n            else {\n                session->server_hostkey_sha1_valid = FALSE;\n            }\n        }\n#ifdef LIBSSH2DEBUG\n        {\n            char fingerprint[64], *fprint = fingerprint;\n            int i;\n\n            for(i = 0; i < 20; i++, fprint += 3) {\n                snprintf(fprint, 4, \"%02x:\", session->server_hostkey_sha1[i]);\n            }\n            *(--fprint) = '\\0';\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"Server's SHA1 Fingerprint: %s\", fingerprint);\n        }\n#endif /* LIBSSH2DEBUG */\n\n        /* SHA256 */\n        {\n            libssh2_sha256_ctx fingerprint_ctx;\n\n            if(libssh2_sha256_init(&fingerprint_ctx)) {\n                libssh2_sha256_update(fingerprint_ctx, session->server_hostkey,\n                                      session->server_hostkey_len);\n                libssh2_sha256_final(fingerprint_ctx,\n                                     session->server_hostkey_sha256);\n                session->server_hostkey_sha256_valid = TRUE;\n            }\n            else {\n                session->server_hostkey_sha256_valid = FALSE;\n            }\n        }\n#ifdef LIBSSH2DEBUG\n        {\n            char *base64Fingerprint = NULL;\n            _libssh2_base64_encode(session,\n                                   (const char *)\n                                   session->server_hostkey_sha256,\n                                   SHA256_DIGEST_LENGTH, &base64Fingerprint);\n            if(base64Fingerprint != NULL) {\n                _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                               \"Server's SHA256 Fingerprint: %s\",\n                               base64Fingerprint);\n                LIBSSH2_FREE(session, base64Fingerprint);\n            }\n        }\n#endif /* LIBSSH2DEBUG */\n\n        if(session->hostkey->init(session, session->server_hostkey,\n                                   session->server_hostkey_len,\n                                   &session->server_hostkey_abstract)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT,\n                                 \"Unable to initialize hostkey importer\");\n            goto clean_exit;\n        }\n\n        /* server public key Q_S */\n        server_public_key_len = _libssh2_ntohu32((const unsigned char *)s);\n        s += 4;\n\n        server_public_key = s;\n        s += server_public_key_len;\n\n        /* server signature */\n        host_sig_len = _libssh2_ntohu32((const unsigned char *)s);\n        s += 4;\n\n        exchange_state->h_sig = s;\n        exchange_state->h_sig_len = host_sig_len;\n        s += host_sig_len;\n\n        /* Compute the shared secret K */\n        rc = _libssh2_ecdh_gen_k(&exchange_state->k, private_key,\n                                 server_public_key, server_public_key_len);\n        if(rc != 0) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_KEX_FAILURE,\n                                 \"Unable to create ECDH shared secret\");\n            goto clean_exit;\n        }\n\n        exchange_state->k_value_len = _libssh2_bn_bytes(exchange_state->k) + 5;\n        if(_libssh2_bn_bits(exchange_state->k) % 8) {\n            /* don't need leading 00 */\n            exchange_state->k_value_len--;\n        }\n        exchange_state->k_value =\n        LIBSSH2_ALLOC(session, exchange_state->k_value_len);\n        if(!exchange_state->k_value) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Unable to allocate buffer for K\");\n            goto clean_exit;\n        }\n        _libssh2_htonu32(exchange_state->k_value,\n                         exchange_state->k_value_len - 4);\n        if(_libssh2_bn_bits(exchange_state->k) % 8) {\n            _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 4);\n        }\n        else {\n            exchange_state->k_value[4] = 0;\n            _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 5);\n        }\n\n        /* verify hash */\n\n        switch(type) {\n            case LIBSSH2_EC_CURVE_NISTP256:\n                LIBSSH2_KEX_METHOD_EC_SHA_HASH_CREATE_VERIFY(256);\n                break;\n\n            case LIBSSH2_EC_CURVE_NISTP384:\n                LIBSSH2_KEX_METHOD_EC_SHA_HASH_CREATE_VERIFY(384);\n                break;\n            case LIBSSH2_EC_CURVE_NISTP521:\n                LIBSSH2_KEX_METHOD_EC_SHA_HASH_CREATE_VERIFY(512);\n                break;\n        }\n\n        if(rc != 0) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_SIGN,\n                                 \"Unable to verify hostkey signature\");\n            goto clean_exit;\n        }\n\n        exchange_state->c = SSH_MSG_NEWKEYS;\n        exchange_state->state = libssh2_NB_state_sent;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_sent) {\n        rc = _libssh2_transport_send(session, &exchange_state->c, 1, NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Unable to send NEWKEYS message\");\n            goto clean_exit;\n        }\n\n        exchange_state->state = libssh2_NB_state_sent2;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_sent2) {\n        rc = _libssh2_packet_require(session, SSH_MSG_NEWKEYS,\n                                     &exchange_state->tmp,\n                                     &exchange_state->tmp_len, 0, NULL, 0,\n                                     &exchange_state->req_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc, \"Timed out waiting for NEWKEYS\");\n            goto clean_exit;\n        }\n\n        /* The first key exchange has been performed,\n         switch to active crypt/comp/mac mode */\n        session->state |= LIBSSH2_STATE_NEWKEYS;\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Received NEWKEYS message\");\n\n        /* This will actually end up being just packet_type(1)\n         for this packet type anyway */\n        LIBSSH2_FREE(session, exchange_state->tmp);\n\n        if(!session->session_id) {\n\n            size_t digest_length = 0;\n\n            if(type == LIBSSH2_EC_CURVE_NISTP256)\n                digest_length = SHA256_DIGEST_LENGTH;\n            else if(type == LIBSSH2_EC_CURVE_NISTP384)\n                digest_length = SHA384_DIGEST_LENGTH;\n            else if(type == LIBSSH2_EC_CURVE_NISTP521)\n                digest_length = SHA512_DIGEST_LENGTH;\n            else{\n                ret = _libssh2_error(session, LIBSSH2_ERROR_KEX_FAILURE,\n                                     \"Unknown SHA digest for EC curve\");\n                goto clean_exit;\n\n            }\n            session->session_id = LIBSSH2_ALLOC(session, digest_length);\n            if(!session->session_id) {\n                ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                     \"Unable to allocate buffer for \"\n                                     \"SHA digest\");\n                goto clean_exit;\n            }\n            memcpy(session->session_id, exchange_state->h_sig_comp,\n                   digest_length);\n             session->session_id_len = digest_length;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"session_id calculated\");\n        }\n\n        /* Cleanup any existing cipher */\n        if(session->local.crypt->dtor) {\n            session->local.crypt->dtor(session,\n                                       &session->local.crypt_abstract);\n        }\n\n        /* Calculate IV/Secret/Key for each direction */\n        if(session->local.crypt->init) {\n            unsigned char *iv = NULL, *secret = NULL;\n            int free_iv = 0, free_secret = 0;\n\n            LIBSSH2_KEX_METHOD_EC_SHA_VALUE_HASH(iv,\n                                                 session->local.crypt->\n                                                 iv_len, \"A\");\n            if(!iv) {\n                ret = -1;\n                goto clean_exit;\n            }\n\n            LIBSSH2_KEX_METHOD_EC_SHA_VALUE_HASH(secret,\n                                                session->local.crypt->\n                                                secret_len, \"C\");\n\n            if(!secret) {\n                LIBSSH2_FREE(session, iv);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            if(session->local.crypt->\n                init(session, session->local.crypt, iv, &free_iv, secret,\n                     &free_secret, 1, &session->local.crypt_abstract)) {\n                    LIBSSH2_FREE(session, iv);\n                    LIBSSH2_FREE(session, secret);\n                    ret = LIBSSH2_ERROR_KEX_FAILURE;\n                    goto clean_exit;\n                }\n\n            if(free_iv) {\n                _libssh2_explicit_zero(iv, session->local.crypt->iv_len);\n                LIBSSH2_FREE(session, iv);\n            }\n\n            if(free_secret) {\n                _libssh2_explicit_zero(secret,\n                                       session->local.crypt->secret_len);\n                LIBSSH2_FREE(session, secret);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Client to Server IV and Key calculated\");\n\n        if(session->remote.crypt->dtor) {\n            /* Cleanup any existing cipher */\n            session->remote.crypt->dtor(session,\n                                        &session->remote.crypt_abstract);\n        }\n\n        if(session->remote.crypt->init) {\n            unsigned char *iv = NULL, *secret = NULL;\n            int free_iv = 0, free_secret = 0;\n\n            LIBSSH2_KEX_METHOD_EC_SHA_VALUE_HASH(iv,\n                                                 session->remote.crypt->\n                                                 iv_len, \"B\");\n\n            if(!iv) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            LIBSSH2_KEX_METHOD_EC_SHA_VALUE_HASH(secret,\n                                                 session->remote.crypt->\n                                                 secret_len, \"D\");\n\n            if(!secret) {\n                LIBSSH2_FREE(session, iv);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            if(session->remote.crypt->\n                init(session, session->remote.crypt, iv, &free_iv, secret,\n                     &free_secret, 0, &session->remote.crypt_abstract)) {\n                    LIBSSH2_FREE(session, iv);\n                    LIBSSH2_FREE(session, secret);\n                    ret = LIBSSH2_ERROR_KEX_FAILURE;\n                    goto clean_exit;\n                }\n\n            if(free_iv) {\n                _libssh2_explicit_zero(iv, session->remote.crypt->iv_len);\n                LIBSSH2_FREE(session, iv);\n            }\n\n            if(free_secret) {\n                _libssh2_explicit_zero(secret,\n                                       session->remote.crypt->secret_len);\n                LIBSSH2_FREE(session, secret);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Server to Client IV and Key calculated\");\n\n        if(session->local.mac->dtor) {\n            session->local.mac->dtor(session, &session->local.mac_abstract);\n        }\n\n        if(session->local.mac->init) {\n            unsigned char *key = NULL;\n            int free_key = 0;\n\n            LIBSSH2_KEX_METHOD_EC_SHA_VALUE_HASH(key,\n                                                 session->local.mac->\n                                                 key_len, \"E\");\n\n            if(!key) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            session->local.mac->init(session, key, &free_key,\n                                     &session->local.mac_abstract);\n\n            if(free_key) {\n                _libssh2_explicit_zero(key, session->local.mac->key_len);\n                LIBSSH2_FREE(session, key);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Client to Server HMAC Key calculated\");\n\n        if(session->remote.mac->dtor) {\n            session->remote.mac->dtor(session, &session->remote.mac_abstract);\n        }\n\n        if(session->remote.mac->init) {\n            unsigned char *key = NULL;\n            int free_key = 0;\n\n            LIBSSH2_KEX_METHOD_EC_SHA_VALUE_HASH(key,\n                                                 session->remote.mac->\n                                                 key_len, \"F\");\n\n            if(!key) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            session->remote.mac->init(session, key, &free_key,\n                                      &session->remote.mac_abstract);\n\n            if(free_key) {\n                _libssh2_explicit_zero(key, session->remote.mac->key_len);\n                LIBSSH2_FREE(session, key);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Server to Client HMAC Key calculated\");\n\n        /* Initialize compression for each direction */\n\n        /* Cleanup any existing compression */\n        if(session->local.comp && session->local.comp->dtor) {\n            session->local.comp->dtor(session, 1,\n                                      &session->local.comp_abstract);\n        }\n\n        if(session->local.comp && session->local.comp->init) {\n            if(session->local.comp->init(session, 1,\n                                          &session->local.comp_abstract)) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Client to Server compression initialized\");\n\n        if(session->remote.comp && session->remote.comp->dtor) {\n            session->remote.comp->dtor(session, 0,\n                                       &session->remote.comp_abstract);\n        }\n\n        if(session->remote.comp && session->remote.comp->init) {\n            if(session->remote.comp->init(session, 0,\n                                           &session->remote.comp_abstract)) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Server to Client compression initialized\");\n\n    }\n\nclean_exit:\n    _libssh2_bn_free(exchange_state->k);\n    exchange_state->k = NULL;\n\n    if(exchange_state->k_value) {\n        LIBSSH2_FREE(session, exchange_state->k_value);\n        exchange_state->k_value = NULL;\n    }\n\n    exchange_state->state = libssh2_NB_state_idle;\n\n    return ret;\n}\n\n/* kex_method_ecdh_key_exchange\n *\n * Elliptic Curve Diffie Hellman Key Exchange\n * supports SHA256/384/512 hashes based on negotated ecdh method\n *\n */\n\nstatic int\nkex_method_ecdh_key_exchange\n(LIBSSH2_SESSION * session, key_exchange_state_low_t * key_state)\n{\n    int ret = 0;\n    int rc = 0;\n    unsigned char *s;\n    libssh2_curve_type type;\n\n    if(key_state->state == libssh2_NB_state_idle) {\n\n        key_state->public_key_oct = NULL;\n        key_state->state = libssh2_NB_state_created;\n    }\n\n    if(key_state->state == libssh2_NB_state_created) {\n        rc = kex_session_ecdh_curve_type(session->kex->name, &type);\n\n        if(rc != 0) {\n            ret = _libssh2_error(session, -1,\n                                 \"Unknown KEX nistp curve type\");\n            goto ecdh_clean_exit;\n        }\n\n        rc = _libssh2_ecdsa_create_key(session, &key_state->private_key,\n                                       &key_state->public_key_oct,\n                                       &key_state->public_key_oct_len, type);\n\n        if(rc != 0) {\n            ret = _libssh2_error(session, rc,\n                                 \"Unable to create private key\");\n            goto ecdh_clean_exit;\n        }\n\n        key_state->request[0] = SSH2_MSG_KEX_ECDH_INIT;\n        s = key_state->request + 1;\n        _libssh2_store_str(&s, (const char *)key_state->public_key_oct,\n                           key_state->public_key_oct_len);\n        key_state->request_len = key_state->public_key_oct_len + 5;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                       \"Initiating ECDH SHA2 NISTP256\");\n\n        key_state->state = libssh2_NB_state_sent;\n    }\n\n    if(key_state->state == libssh2_NB_state_sent) {\n        rc = _libssh2_transport_send(session, key_state->request,\n                                     key_state->request_len, NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Unable to send ECDH_INIT\");\n            goto ecdh_clean_exit;\n        }\n\n        key_state->state = libssh2_NB_state_sent1;\n    }\n\n    if(key_state->state == libssh2_NB_state_sent1) {\n        rc = _libssh2_packet_require(session, SSH2_MSG_KEX_ECDH_REPLY,\n                                     &key_state->data, &key_state->data_len,\n                                     0, NULL, 0, &key_state->req_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Timeout waiting for ECDH_REPLY reply\");\n            goto ecdh_clean_exit;\n        }\n\n        key_state->state = libssh2_NB_state_sent2;\n    }\n\n    if(key_state->state == libssh2_NB_state_sent2) {\n\n        (void)kex_session_ecdh_curve_type(session->kex->name, &type);\n\n        ret = ecdh_sha2_nistp(session, type, key_state->data,\n                              key_state->data_len,\n                              (unsigned char *)key_state->public_key_oct,\n                              key_state->public_key_oct_len,\n                              key_state->private_key,\n                              &key_state->exchange_state);\n\n        if(ret == LIBSSH2_ERROR_EAGAIN) {\n            return ret;\n        }\n\n        LIBSSH2_FREE(session, key_state->data);\n    }\n\necdh_clean_exit:\n\n    if(key_state->public_key_oct) {\n        LIBSSH2_FREE(session, key_state->public_key_oct);\n        key_state->public_key_oct = NULL;\n    }\n\n    if(key_state->private_key) {\n        _libssh2_ecdsa_free(key_state->private_key);\n        key_state->private_key = NULL;\n    }\n\n    key_state->state = libssh2_NB_state_idle;\n\n    return ret;\n}\n\n#endif /*LIBSSH2_ECDSA*/\n\n\n#if LIBSSH2_ED25519\n\n/* curve25519_sha256\n * Elliptic Curve Key Exchange\n */\n\nstatic int\ncurve25519_sha256(LIBSSH2_SESSION *session, unsigned char *data,\n                  size_t data_len,\n                  unsigned char public_key[LIBSSH2_ED25519_KEY_LEN],\n                  unsigned char private_key[LIBSSH2_ED25519_KEY_LEN],\n                  kmdhgGPshakex_state_t *exchange_state)\n{\n    int ret = 0;\n    int rc;\n    int public_key_len = LIBSSH2_ED25519_KEY_LEN;\n\n    if(data_len < 5) {\n        return _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT,\n                              \"Data is too short\");\n    }\n\n    if(exchange_state->state == libssh2_NB_state_idle) {\n\n        /* Setup initial values */\n        exchange_state->k = _libssh2_bn_init();\n\n        exchange_state->state = libssh2_NB_state_created;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_created) {\n        /* parse INIT reply data */\n        unsigned char *server_public_key, *server_host_key;\n        size_t server_public_key_len, hostkey_len;\n        struct string_buf buf;\n\n        if(data_len < 5) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                 \"Unexpected key length\");\n            goto clean_exit;\n        }\n\n        buf.data = data;\n        buf.len = data_len;\n        buf.dataptr = buf.data;\n        buf.dataptr++; /* advance past packet type */\n\n        if(_libssh2_get_string(&buf, &server_host_key, &hostkey_len)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                 \"Unexpected key length\");\n            goto clean_exit;\n        }\n\n        session->server_hostkey_len = (uint32_t)hostkey_len;\n        session->server_hostkey = LIBSSH2_ALLOC(session,\n                                                session->server_hostkey_len);\n        if(!session->server_hostkey) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Unable to allocate memory for a copy \"\n                                 \"of the host key\");\n            goto clean_exit;\n        }\n\n        memcpy(session->server_hostkey, server_host_key,\n               session->server_hostkey_len);\n\n#if LIBSSH2_MD5\n        {\n            libssh2_md5_ctx fingerprint_ctx;\n\n            if(libssh2_md5_init(&fingerprint_ctx)) {\n                libssh2_md5_update(fingerprint_ctx, session->server_hostkey,\n                                   session->server_hostkey_len);\n                libssh2_md5_final(fingerprint_ctx,\n                                  session->server_hostkey_md5);\n                session->server_hostkey_md5_valid = TRUE;\n            }\n            else {\n                session->server_hostkey_md5_valid = FALSE;\n            }\n        }\n#ifdef LIBSSH2DEBUG\n        {\n            char fingerprint[50], *fprint = fingerprint;\n            int i;\n            for(i = 0; i < 16; i++, fprint += 3) {\n                snprintf(fprint, 4, \"%02x:\", session->server_hostkey_md5[i]);\n            }\n            *(--fprint) = '\\0';\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                             \"Server's MD5 Fingerprint: %s\", fingerprint);\n        }\n#endif /* LIBSSH2DEBUG */\n#endif /* ! LIBSSH2_MD5 */\n\n        {\n            libssh2_sha1_ctx fingerprint_ctx;\n\n            if(libssh2_sha1_init(&fingerprint_ctx)) {\n                libssh2_sha1_update(fingerprint_ctx, session->server_hostkey,\n                                    session->server_hostkey_len);\n                libssh2_sha1_final(fingerprint_ctx,\n                                   session->server_hostkey_sha1);\n                session->server_hostkey_sha1_valid = TRUE;\n            }\n            else {\n                session->server_hostkey_sha1_valid = FALSE;\n            }\n        }\n#ifdef LIBSSH2DEBUG\n        {\n            char fingerprint[64], *fprint = fingerprint;\n            int i;\n\n            for(i = 0; i < 20; i++, fprint += 3) {\n                snprintf(fprint, 4, \"%02x:\", session->server_hostkey_sha1[i]);\n            }\n            *(--fprint) = '\\0';\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                             \"Server's SHA1 Fingerprint: %s\", fingerprint);\n        }\n#endif /* LIBSSH2DEBUG */\n\n        /* SHA256 */\n        {\n            libssh2_sha256_ctx fingerprint_ctx;\n\n            if(libssh2_sha256_init(&fingerprint_ctx)) {\n                libssh2_sha256_update(fingerprint_ctx, session->server_hostkey,\n                                      session->server_hostkey_len);\n                libssh2_sha256_final(fingerprint_ctx,\n                                     session->server_hostkey_sha256);\n                session->server_hostkey_sha256_valid = TRUE;\n            }\n            else {\n                session->server_hostkey_sha256_valid = FALSE;\n            }\n        }\n#ifdef LIBSSH2DEBUG\n        {\n            char *base64Fingerprint = NULL;\n            _libssh2_base64_encode(session,\n                                   (const char *)\n                                   session->server_hostkey_sha256,\n                                   SHA256_DIGEST_LENGTH, &base64Fingerprint);\n            if(base64Fingerprint != NULL) {\n                _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                               \"Server's SHA256 Fingerprint: %s\",\n                               base64Fingerprint);\n                LIBSSH2_FREE(session, base64Fingerprint);\n            }\n        }\n#endif /* LIBSSH2DEBUG */\n\n        if(session->hostkey->init(session, session->server_hostkey,\n                                   session->server_hostkey_len,\n                                   &session->server_hostkey_abstract)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT,\n                                 \"Unable to initialize hostkey importer\");\n            goto clean_exit;\n        }\n\n        /* server public key Q_S */\n        if(_libssh2_get_string(&buf, &server_public_key,\n                               &server_public_key_len)) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                     \"Unexpected key length\");\n            goto clean_exit;\n        }\n\n        if(server_public_key_len != LIBSSH2_ED25519_KEY_LEN) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT,\n                                 \"Unexpected curve25519 server \"\n                                 \"public key length\");\n            goto clean_exit;\n        }\n\n        /* server signature */\n        if(_libssh2_get_string(&buf, &exchange_state->h_sig,\n           &(exchange_state->h_sig_len))) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT,\n                                 \"Unexpected curve25519 server sig length\");\n            goto clean_exit;\n        }\n\n        /* Compute the shared secret K */\n        rc = _libssh2_curve25519_gen_k(&exchange_state->k, private_key,\n                                       server_public_key);\n        if(rc != 0) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_KEX_FAILURE,\n                                 \"Unable to create ECDH shared secret\");\n            goto clean_exit;\n        }\n\n        exchange_state->k_value_len = _libssh2_bn_bytes(exchange_state->k) + 5;\n        if(_libssh2_bn_bits(exchange_state->k) % 8) {\n            /* don't need leading 00 */\n            exchange_state->k_value_len--;\n        }\n        exchange_state->k_value =\n        LIBSSH2_ALLOC(session, exchange_state->k_value_len);\n        if(!exchange_state->k_value) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Unable to allocate buffer for K\");\n            goto clean_exit;\n        }\n        _libssh2_htonu32(exchange_state->k_value,\n                         exchange_state->k_value_len - 4);\n        if(_libssh2_bn_bits(exchange_state->k) % 8) {\n            _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 4);\n        }\n        else {\n            exchange_state->k_value[4] = 0;\n            _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 5);\n        }\n\n        /*/ verify hash */\n        LIBSSH2_KEX_METHOD_EC_SHA_HASH_CREATE_VERIFY(256);\n\n        if(rc != 0) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_SIGN,\n                                 \"Unable to verify hostkey signature\");\n            goto clean_exit;\n        }\n\n        exchange_state->c = SSH_MSG_NEWKEYS;\n        exchange_state->state = libssh2_NB_state_sent;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_sent) {\n        rc = _libssh2_transport_send(session, &exchange_state->c, 1, NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Unable to send NEWKEYS message\");\n            goto clean_exit;\n        }\n\n        exchange_state->state = libssh2_NB_state_sent2;\n    }\n\n    if(exchange_state->state == libssh2_NB_state_sent2) {\n        rc = _libssh2_packet_require(session, SSH_MSG_NEWKEYS,\n                                     &exchange_state->tmp,\n                                     &exchange_state->tmp_len, 0, NULL, 0,\n                                     &exchange_state->req_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc, \"Timed out waiting for NEWKEYS\");\n            goto clean_exit;\n        }\n\n        /* The first key exchange has been performed, switch to active\n           crypt/comp/mac mode */\n\n        session->state |= LIBSSH2_STATE_NEWKEYS;\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Received NEWKEYS message\");\n\n        /* This will actually end up being just packet_type(1) for this packet\n           type anyway */\n        LIBSSH2_FREE(session, exchange_state->tmp);\n\n        if(!session->session_id) {\n\n            size_t digest_length = SHA256_DIGEST_LENGTH;\n            session->session_id = LIBSSH2_ALLOC(session, digest_length);\n            if(!session->session_id) {\n                ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                     \"Unable to allxcocate buffer for \"\n                                     \"SHA digest\");\n                goto clean_exit;\n            }\n            memcpy(session->session_id, exchange_state->h_sig_comp,\n                   digest_length);\n            session->session_id_len = digest_length;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                           \"session_id calculated\");\n        }\n\n        /* Cleanup any existing cipher */\n        if(session->local.crypt->dtor) {\n            session->local.crypt->dtor(session,\n                                        &session->local.crypt_abstract);\n        }\n\n        /* Calculate IV/Secret/Key for each direction */\n        if(session->local.crypt->init) {\n            unsigned char *iv = NULL, *secret = NULL;\n            int free_iv = 0, free_secret = 0;\n\n            LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, iv,\n                                              session->local.crypt->\n                                              iv_len, \"A\");\n            if(!iv) {\n                ret = -1;\n                goto clean_exit;\n            }\n\n            LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, secret,\n                                              session->local.crypt->\n                                              secret_len, \"C\");\n\n            if(!secret) {\n                LIBSSH2_FREE(session, iv);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            if(session->local.crypt->\n                init(session, session->local.crypt, iv, &free_iv, secret,\n                     &free_secret, 1, &session->local.crypt_abstract)) {\n                    LIBSSH2_FREE(session, iv);\n                    LIBSSH2_FREE(session, secret);\n                    ret = LIBSSH2_ERROR_KEX_FAILURE;\n                    goto clean_exit;\n                }\n\n            if(free_iv) {\n                _libssh2_explicit_zero(iv, session->local.crypt->iv_len);\n                LIBSSH2_FREE(session, iv);\n            }\n\n            if(free_secret) {\n                _libssh2_explicit_zero(secret,\n                                       session->local.crypt->secret_len);\n                LIBSSH2_FREE(session, secret);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                        \"Client to Server IV and Key calculated\");\n\n        if(session->remote.crypt->dtor) {\n            /* Cleanup any existing cipher */\n            session->remote.crypt->dtor(session,\n                                        &session->remote.crypt_abstract);\n        }\n\n        if(session->remote.crypt->init) {\n            unsigned char *iv = NULL, *secret = NULL;\n            int free_iv = 0, free_secret = 0;\n\n            LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, iv,\n                                              session->remote.crypt->\n                                              iv_len, \"B\");\n\n            if(!iv) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, secret,\n                                              session->remote.crypt->\n                                              secret_len, \"D\");\n\n            if(!secret) {\n                LIBSSH2_FREE(session, iv);\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            if(session->remote.crypt->\n                init(session, session->remote.crypt, iv, &free_iv, secret,\n                     &free_secret, 0, &session->remote.crypt_abstract)) {\n                    LIBSSH2_FREE(session, iv);\n                    LIBSSH2_FREE(session, secret);\n                    ret = LIBSSH2_ERROR_KEX_FAILURE;\n                    goto clean_exit;\n                }\n\n            if(free_iv) {\n                _libssh2_explicit_zero(iv, session->remote.crypt->iv_len);\n                LIBSSH2_FREE(session, iv);\n            }\n\n            if(free_secret) {\n                _libssh2_explicit_zero(secret,\n                                       session->remote.crypt->secret_len);\n                LIBSSH2_FREE(session, secret);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                        \"Server to Client IV and Key calculated\");\n\n        if(session->local.mac->dtor) {\n            session->local.mac->dtor(session, &session->local.mac_abstract);\n        }\n\n        if(session->local.mac->init) {\n            unsigned char *key = NULL;\n            int free_key = 0;\n\n            LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, key,\n                                              session->local.mac->\n                                              key_len, \"E\");\n\n            if(!key) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            session->local.mac->init(session, key, &free_key,\n                                     &session->local.mac_abstract);\n\n            if(free_key) {\n                _libssh2_explicit_zero(key, session->local.mac->key_len);\n                LIBSSH2_FREE(session, key);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                        \"Client to Server HMAC Key calculated\");\n\n        if(session->remote.mac->dtor) {\n            session->remote.mac->dtor(session, &session->remote.mac_abstract);\n        }\n\n        if(session->remote.mac->init) {\n            unsigned char *key = NULL;\n            int free_key = 0;\n\n            LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, key,\n                                              session->remote.mac->\n                                              key_len, \"F\");\n\n            if(!key) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n            session->remote.mac->init(session, key, &free_key,\n                                      &session->remote.mac_abstract);\n\n            if(free_key) {\n                _libssh2_explicit_zero(key, session->remote.mac->key_len);\n                LIBSSH2_FREE(session, key);\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                        \"Server to Client HMAC Key calculated\");\n\n        /* Initialize compression for each direction */\n\n        /* Cleanup any existing compression */\n        if(session->local.comp && session->local.comp->dtor) {\n            session->local.comp->dtor(session, 1,\n                                      &session->local.comp_abstract);\n        }\n\n        if(session->local.comp && session->local.comp->init) {\n            if(session->local.comp->init(session, 1,\n                                            &session->local.comp_abstract)) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                        \"Client to Server compression initialized\");\n\n        if(session->remote.comp && session->remote.comp->dtor) {\n            session->remote.comp->dtor(session, 0,\n                                        &session->remote.comp_abstract);\n        }\n\n        if(session->remote.comp && session->remote.comp->init) {\n            if(session->remote.comp->init(session, 0,\n                                             &session->remote.comp_abstract)) {\n                ret = LIBSSH2_ERROR_KEX_FAILURE;\n                goto clean_exit;\n            }\n        }\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                        \"Server to Client compression initialized\");\n    }\n\nclean_exit:\n    _libssh2_bn_free(exchange_state->k);\n    exchange_state->k = NULL;\n\n    if(exchange_state->k_value) {\n        LIBSSH2_FREE(session, exchange_state->k_value);\n        exchange_state->k_value = NULL;\n    }\n\n    exchange_state->state = libssh2_NB_state_idle;\n\n    return ret;\n}\n\n/* kex_method_curve25519_key_exchange\n *\n * Elliptic Curve X25519 Key Exchange with SHA256 hash\n *\n */\n\nstatic int\nkex_method_curve25519_key_exchange\n(LIBSSH2_SESSION * session, key_exchange_state_low_t * key_state)\n{\n    int ret = 0;\n    int rc = 0;\n\n    if(key_state->state == libssh2_NB_state_idle) {\n\n        key_state->public_key_oct = NULL;\n        key_state->state = libssh2_NB_state_created;\n    }\n\n    if(key_state->state == libssh2_NB_state_created) {\n        unsigned char *s = NULL;\n\n        rc = strcmp(session->kex->name, \"curve25519-sha256@libssh.org\");\n        if(rc != 0)\n            rc = strcmp(session->kex->name, \"curve25519-sha256\");\n\n        if(rc != 0) {\n            ret = _libssh2_error(session, -1,\n                                 \"Unknown KEX curve25519 curve type\");\n            goto clean_exit;\n        }\n\n        rc = _libssh2_curve25519_new(session, NULL,\n                                     &key_state->curve25519_public_key,\n                                     &key_state->curve25519_private_key);\n\n        if(rc != 0) {\n            ret = _libssh2_error(session, rc,\n                                 \"Unable to create private key\");\n            goto clean_exit;\n        }\n\n        key_state->request[0] = SSH2_MSG_KEX_ECDH_INIT;\n        s = key_state->request + 1;\n        _libssh2_store_str(&s, (const char *)key_state->curve25519_public_key,\n                           LIBSSH2_ED25519_KEY_LEN);\n        key_state->request_len = LIBSSH2_ED25519_KEY_LEN + 5;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_KEX,\n                        \"Initiating curve25519 SHA2\");\n\n        key_state->state = libssh2_NB_state_sent;\n    }\n\n    if(key_state->state == libssh2_NB_state_sent) {\n        rc = _libssh2_transport_send(session, key_state->request,\n                                     key_state->request_len, NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Unable to send ECDH_INIT\");\n            goto clean_exit;\n        }\n\n        key_state->state = libssh2_NB_state_sent1;\n    }\n\n    if(key_state->state == libssh2_NB_state_sent1) {\n        rc = _libssh2_packet_require(session, SSH2_MSG_KEX_ECDH_REPLY,\n                                     &key_state->data, &key_state->data_len,\n                                     0, NULL, 0, &key_state->req_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            ret = _libssh2_error(session, rc,\n                                 \"Timeout waiting for ECDH_REPLY reply\");\n            goto clean_exit;\n        }\n\n        key_state->state = libssh2_NB_state_sent2;\n    }\n\n    if(key_state->state == libssh2_NB_state_sent2) {\n\n        ret = curve25519_sha256(session, key_state->data, key_state->data_len,\n                                key_state->curve25519_public_key,\n                                key_state->curve25519_private_key,\n                                &key_state->exchange_state);\n\n        if(ret == LIBSSH2_ERROR_EAGAIN) {\n            return ret;\n        }\n\n        LIBSSH2_FREE(session, key_state->data);\n    }\n\nclean_exit:\n\n    if(key_state->curve25519_public_key) {\n        _libssh2_explicit_zero(key_state->curve25519_public_key,\n                               LIBSSH2_ED25519_KEY_LEN);\n        LIBSSH2_FREE(session, key_state->curve25519_public_key);\n        key_state->curve25519_public_key = NULL;\n    }\n\n    if(key_state->curve25519_private_key) {\n        _libssh2_explicit_zero(key_state->curve25519_private_key,\n                               LIBSSH2_ED25519_KEY_LEN);\n        LIBSSH2_FREE(session, key_state->curve25519_private_key);\n        key_state->curve25519_private_key = NULL;\n    }\n\n    key_state->state = libssh2_NB_state_idle;\n\n    return ret;\n}\n\n\n#endif /*LIBSSH2_ED25519*/\n\n\n#define LIBSSH2_KEX_METHOD_FLAG_REQ_ENC_HOSTKEY     0x0001\n#define LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY    0x0002\n\nstatic const LIBSSH2_KEX_METHOD kex_method_diffie_helman_group1_sha1 = {\n    \"diffie-hellman-group1-sha1\",\n    kex_method_diffie_hellman_group1_sha1_key_exchange,\n    LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY,\n};\n\nstatic const LIBSSH2_KEX_METHOD kex_method_diffie_helman_group14_sha1 = {\n    \"diffie-hellman-group14-sha1\",\n    kex_method_diffie_hellman_group14_sha1_key_exchange,\n    LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY,\n};\n\nstatic const LIBSSH2_KEX_METHOD\nkex_method_diffie_helman_group_exchange_sha1 = {\n    \"diffie-hellman-group-exchange-sha1\",\n    kex_method_diffie_hellman_group_exchange_sha1_key_exchange,\n    LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY,\n};\n\nstatic const LIBSSH2_KEX_METHOD\nkex_method_diffie_helman_group_exchange_sha256 = {\n    \"diffie-hellman-group-exchange-sha256\",\n    kex_method_diffie_hellman_group_exchange_sha256_key_exchange,\n    LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY,\n};\n\n#if LIBSSH2_ECDSA\nstatic const LIBSSH2_KEX_METHOD\nkex_method_ecdh_sha2_nistp256 = {\n    \"ecdh-sha2-nistp256\",\n    kex_method_ecdh_key_exchange,\n    LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY,\n};\n\nstatic const LIBSSH2_KEX_METHOD\nkex_method_ecdh_sha2_nistp384 = {\n    \"ecdh-sha2-nistp384\",\n    kex_method_ecdh_key_exchange,\n    LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY,\n};\n\nstatic const LIBSSH2_KEX_METHOD\nkex_method_ecdh_sha2_nistp521 = {\n    \"ecdh-sha2-nistp521\",\n    kex_method_ecdh_key_exchange,\n    LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY,\n};\n#endif\n\n#if LIBSSH2_ED25519\nstatic const LIBSSH2_KEX_METHOD\nkex_method_ssh_curve25519_sha256_libssh = {\n    \"curve25519-sha256@libssh.org\",\n    kex_method_curve25519_key_exchange,\n    LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY,\n};\nstatic const LIBSSH2_KEX_METHOD\nkex_method_ssh_curve25519_sha256 = {\n    \"curve25519-sha256\",\n    kex_method_curve25519_key_exchange,\n    LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY,\n};\n#endif\n\nstatic const LIBSSH2_KEX_METHOD *libssh2_kex_methods[] = {\n#if LIBSSH2_ECDSA\n    &kex_method_ecdh_sha2_nistp256,\n    &kex_method_ecdh_sha2_nistp384,\n    &kex_method_ecdh_sha2_nistp521,\n#endif\n#if LIBSSH2_ED25519\n    &kex_method_ssh_curve25519_sha256,\n    &kex_method_ssh_curve25519_sha256_libssh,\n#endif\n    &kex_method_diffie_helman_group_exchange_sha256,\n    &kex_method_diffie_helman_group_exchange_sha1,\n    &kex_method_diffie_helman_group14_sha1,\n    &kex_method_diffie_helman_group1_sha1,\n    NULL\n};\n\ntypedef struct _LIBSSH2_COMMON_METHOD\n{\n    const char *name;\n} LIBSSH2_COMMON_METHOD;\n\n/* kex_method_strlen\n * Calculate the length of a particular method list's resulting string\n * Includes SUM(strlen() of each individual method plus 1 (for coma)) - 1\n * (because the last coma isn't used)\n * Another sign of bad coding practices gone mad.  Pretend you don't see this.\n */\nstatic size_t\nkex_method_strlen(LIBSSH2_COMMON_METHOD ** method)\n{\n    size_t len = 0;\n\n    if(!method || !*method) {\n        return 0;\n    }\n\n    while(*method && (*method)->name) {\n        len += strlen((*method)->name) + 1;\n        method++;\n    }\n\n    return len - 1;\n}\n\n\n\n/* kex_method_list\n * Generate formatted preference list in buf\n */\nstatic size_t\nkex_method_list(unsigned char *buf, size_t list_strlen,\n                LIBSSH2_COMMON_METHOD ** method)\n{\n    _libssh2_htonu32(buf, list_strlen);\n    buf += 4;\n\n    if(!method || !*method) {\n        return 4;\n    }\n\n    while(*method && (*method)->name) {\n        int mlen = strlen((*method)->name);\n        memcpy(buf, (*method)->name, mlen);\n        buf += mlen;\n        *(buf++) = ',';\n        method++;\n    }\n\n    return list_strlen + 4;\n}\n\n\n\n#define LIBSSH2_METHOD_PREFS_LEN(prefvar, defaultvar)           \\\n    ((prefvar) ? strlen(prefvar) :                              \\\n     kex_method_strlen((LIBSSH2_COMMON_METHOD**)(defaultvar)))\n\n#define LIBSSH2_METHOD_PREFS_STR(buf, prefvarlen, prefvar, defaultvar)  \\\n    if(prefvar) {                                                       \\\n        _libssh2_htonu32((buf), (prefvarlen));                          \\\n        buf += 4;                                                       \\\n        memcpy((buf), (prefvar), (prefvarlen));                         \\\n        buf += (prefvarlen);                                            \\\n    }                                                                   \\\n    else {                                                              \\\n        buf += kex_method_list((buf), (prefvarlen),                     \\\n                               (LIBSSH2_COMMON_METHOD**)(defaultvar));  \\\n    }\n\n/* kexinit\n * Send SSH_MSG_KEXINIT packet\n */\nstatic int kexinit(LIBSSH2_SESSION * session)\n{\n    /* 62 = packet_type(1) + cookie(16) + first_packet_follows(1) +\n       reserved(4) + length longs(40) */\n    size_t data_len = 62;\n    size_t kex_len, hostkey_len = 0;\n    size_t crypt_cs_len, crypt_sc_len;\n    size_t comp_cs_len, comp_sc_len;\n    size_t mac_cs_len, mac_sc_len;\n    size_t lang_cs_len, lang_sc_len;\n    unsigned char *data, *s;\n    int rc;\n\n    if(session->kexinit_state == libssh2_NB_state_idle) {\n        kex_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->kex_prefs, libssh2_kex_methods);\n        hostkey_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->hostkey_prefs,\n                                     libssh2_hostkey_methods());\n        crypt_cs_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->local.crypt_prefs,\n                                     libssh2_crypt_methods());\n        crypt_sc_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->remote.crypt_prefs,\n                                     libssh2_crypt_methods());\n        mac_cs_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->local.mac_prefs,\n                                     _libssh2_mac_methods());\n        mac_sc_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->remote.mac_prefs,\n                                     _libssh2_mac_methods());\n        comp_cs_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->local.comp_prefs,\n                                     _libssh2_comp_methods(session));\n        comp_sc_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->remote.comp_prefs,\n                                     _libssh2_comp_methods(session));\n        lang_cs_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->local.lang_prefs, NULL);\n        lang_sc_len =\n            LIBSSH2_METHOD_PREFS_LEN(session->remote.lang_prefs, NULL);\n\n        data_len += kex_len + hostkey_len + crypt_cs_len + crypt_sc_len +\n            comp_cs_len + comp_sc_len + mac_cs_len + mac_sc_len +\n            lang_cs_len + lang_sc_len;\n\n        s = data = LIBSSH2_ALLOC(session, data_len);\n        if(!data) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory\");\n        }\n\n        *(s++) = SSH_MSG_KEXINIT;\n\n        _libssh2_random(s, 16);\n        s += 16;\n\n        /* Ennumerating through these lists twice is probably (certainly?)\n           inefficient from a CPU standpoint, but it saves multiple\n           malloc/realloc calls */\n        LIBSSH2_METHOD_PREFS_STR(s, kex_len, session->kex_prefs,\n                                 libssh2_kex_methods);\n        LIBSSH2_METHOD_PREFS_STR(s, hostkey_len, session->hostkey_prefs,\n                                 libssh2_hostkey_methods());\n        LIBSSH2_METHOD_PREFS_STR(s, crypt_cs_len, session->local.crypt_prefs,\n                                 libssh2_crypt_methods());\n        LIBSSH2_METHOD_PREFS_STR(s, crypt_sc_len, session->remote.crypt_prefs,\n                                 libssh2_crypt_methods());\n        LIBSSH2_METHOD_PREFS_STR(s, mac_cs_len, session->local.mac_prefs,\n                                 _libssh2_mac_methods());\n        LIBSSH2_METHOD_PREFS_STR(s, mac_sc_len, session->remote.mac_prefs,\n                                 _libssh2_mac_methods());\n        LIBSSH2_METHOD_PREFS_STR(s, comp_cs_len, session->local.comp_prefs,\n                                 _libssh2_comp_methods(session));\n        LIBSSH2_METHOD_PREFS_STR(s, comp_sc_len, session->remote.comp_prefs,\n                                 _libssh2_comp_methods(session));\n        LIBSSH2_METHOD_PREFS_STR(s, lang_cs_len, session->local.lang_prefs,\n                                 NULL);\n        LIBSSH2_METHOD_PREFS_STR(s, lang_sc_len, session->remote.lang_prefs,\n                                 NULL);\n\n        /* No optimistic KEX packet follows */\n        /* Deal with optimistic packets\n         * session->flags |= KEXINIT_OPTIMISTIC\n         * session->flags |= KEXINIT_METHODSMATCH\n         */\n        *(s++) = 0;\n\n        /* Reserved == 0 */\n        _libssh2_htonu32(s, 0);\n\n#ifdef LIBSSH2DEBUG\n        {\n            /* Funnily enough, they'll all \"appear\" to be '\\0' terminated */\n            unsigned char *p = data + 21;   /* type(1) + cookie(16) + len(4) */\n\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent KEX: %s\", p);\n            p += kex_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent HOSTKEY: %s\", p);\n            p += hostkey_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent CRYPT_CS: %s\", p);\n            p += crypt_cs_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent CRYPT_SC: %s\", p);\n            p += crypt_sc_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent MAC_CS: %s\", p);\n            p += mac_cs_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent MAC_SC: %s\", p);\n            p += mac_sc_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent COMP_CS: %s\", p);\n            p += comp_cs_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent COMP_SC: %s\", p);\n            p += comp_sc_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent LANG_CS: %s\", p);\n            p += lang_cs_len + 4;\n            _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Sent LANG_SC: %s\", p);\n            p += lang_sc_len + 4;\n        }\n#endif /* LIBSSH2DEBUG */\n\n        session->kexinit_state = libssh2_NB_state_created;\n    }\n    else {\n        data = session->kexinit_data;\n        data_len = session->kexinit_data_len;\n        /* zap the variables to ensure there is NOT a double free later */\n        session->kexinit_data = NULL;\n        session->kexinit_data_len = 0;\n    }\n\n    rc = _libssh2_transport_send(session, data, data_len, NULL, 0);\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        session->kexinit_data = data;\n        session->kexinit_data_len = data_len;\n        return rc;\n    }\n    else if(rc) {\n        LIBSSH2_FREE(session, data);\n        session->kexinit_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Unable to send KEXINIT packet to remote host\");\n\n    }\n\n    if(session->local.kexinit) {\n        LIBSSH2_FREE(session, session->local.kexinit);\n    }\n\n    session->local.kexinit = data;\n    session->local.kexinit_len = data_len;\n\n    session->kexinit_state = libssh2_NB_state_idle;\n\n    return 0;\n}\n\n/* kex_agree_instr\n * Kex specific variant of strstr()\n * Needle must be precede by BOL or ',', and followed by ',' or EOL\n */\nstatic unsigned char *\nkex_agree_instr(unsigned char *haystack, unsigned long haystack_len,\n                const unsigned char *needle, unsigned long needle_len)\n{\n    unsigned char *s;\n\n    /* Haystack too short to bother trying */\n    if(haystack_len < needle_len) {\n        return NULL;\n    }\n\n    /* Needle at start of haystack */\n    if((strncmp((char *) haystack, (char *) needle, needle_len) == 0) &&\n        (needle_len == haystack_len || haystack[needle_len] == ',')) {\n        return haystack;\n    }\n\n    s = haystack;\n    /* Search until we run out of comas or we run out of haystack,\n       whichever comes first */\n    while((s = (unsigned char *) strchr((char *) s, ','))\n           && ((haystack_len - (s - haystack)) > needle_len)) {\n        s++;\n        /* Needle at X position */\n        if((strncmp((char *) s, (char *) needle, needle_len) == 0) &&\n            (((s - haystack) + needle_len) == haystack_len\n             || s[needle_len] == ',')) {\n            return s;\n        }\n    }\n\n    return NULL;\n}\n\n\n\n/* kex_get_method_by_name\n */\nstatic const LIBSSH2_COMMON_METHOD *\nkex_get_method_by_name(const char *name, size_t name_len,\n                       const LIBSSH2_COMMON_METHOD ** methodlist)\n{\n    while(*methodlist) {\n        if((strlen((*methodlist)->name) == name_len) &&\n            (strncmp((*methodlist)->name, name, name_len) == 0)) {\n            return *methodlist;\n        }\n        methodlist++;\n    }\n    return NULL;\n}\n\n\n\n/* kex_agree_hostkey\n * Agree on a Hostkey which works with this kex\n */\nstatic int kex_agree_hostkey(LIBSSH2_SESSION * session,\n                             unsigned long kex_flags,\n                             unsigned char *hostkey, unsigned long hostkey_len)\n{\n    const LIBSSH2_HOSTKEY_METHOD **hostkeyp = libssh2_hostkey_methods();\n    unsigned char *s;\n\n    if(session->hostkey_prefs) {\n        s = (unsigned char *) session->hostkey_prefs;\n\n        while(s && *s) {\n            unsigned char *p = (unsigned char *) strchr((char *) s, ',');\n            size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s));\n            if(kex_agree_instr(hostkey, hostkey_len, s, method_len)) {\n                const LIBSSH2_HOSTKEY_METHOD *method =\n                    (const LIBSSH2_HOSTKEY_METHOD *)\n                    kex_get_method_by_name((char *) s, method_len,\n                                           (const LIBSSH2_COMMON_METHOD **)\n                                           hostkeyp);\n\n                if(!method) {\n                    /* Invalid method -- Should never be reached */\n                    return -1;\n                }\n\n                /* So far so good, but does it suit our purposes? (Encrypting\n                   vs Signing) */\n                if(((kex_flags & LIBSSH2_KEX_METHOD_FLAG_REQ_ENC_HOSTKEY) ==\n                     0) || (method->encrypt)) {\n                    /* Either this hostkey can do encryption or this kex just\n                       doesn't require it */\n                    if(((kex_flags & LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY)\n                         == 0) || (method->sig_verify)) {\n                        /* Either this hostkey can do signing or this kex just\n                           doesn't require it */\n                        session->hostkey = method;\n                        return 0;\n                    }\n                }\n            }\n\n            s = p ? p + 1 : NULL;\n        }\n        return -1;\n    }\n\n    while(hostkeyp && (*hostkeyp) && (*hostkeyp)->name) {\n        s = kex_agree_instr(hostkey, hostkey_len,\n                            (unsigned char *) (*hostkeyp)->name,\n                            strlen((*hostkeyp)->name));\n        if(s) {\n            /* So far so good, but does it suit our purposes? (Encrypting vs\n               Signing) */\n            if(((kex_flags & LIBSSH2_KEX_METHOD_FLAG_REQ_ENC_HOSTKEY) == 0) ||\n                ((*hostkeyp)->encrypt)) {\n                /* Either this hostkey can do encryption or this kex just\n                   doesn't require it */\n                if(((kex_flags & LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY) ==\n                     0) || ((*hostkeyp)->sig_verify)) {\n                    /* Either this hostkey can do signing or this kex just\n                       doesn't require it */\n                    session->hostkey = *hostkeyp;\n                    return 0;\n                }\n            }\n        }\n        hostkeyp++;\n    }\n\n    return -1;\n}\n\n\n\n/* kex_agree_kex_hostkey\n * Agree on a Key Exchange method and a hostkey encoding type\n */\nstatic int kex_agree_kex_hostkey(LIBSSH2_SESSION * session, unsigned char *kex,\n                                 unsigned long kex_len, unsigned char *hostkey,\n                                 unsigned long hostkey_len)\n{\n    const LIBSSH2_KEX_METHOD **kexp = libssh2_kex_methods;\n    unsigned char *s;\n\n    if(session->kex_prefs) {\n        s = (unsigned char *) session->kex_prefs;\n\n        while(s && *s) {\n            unsigned char *q, *p = (unsigned char *) strchr((char *) s, ',');\n            size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s));\n            q = kex_agree_instr(kex, kex_len, s, method_len);\n            if(q) {\n                const LIBSSH2_KEX_METHOD *method = (const LIBSSH2_KEX_METHOD *)\n                    kex_get_method_by_name((char *) s, method_len,\n                                           (const LIBSSH2_COMMON_METHOD **)\n                                           kexp);\n\n                if(!method) {\n                    /* Invalid method -- Should never be reached */\n                    return -1;\n                }\n\n                /* We've agreed on a key exchange method,\n                 * Can we agree on a hostkey that works with this kex?\n                 */\n                if(kex_agree_hostkey(session, method->flags, hostkey,\n                                      hostkey_len) == 0) {\n                    session->kex = method;\n                    if(session->burn_optimistic_kexinit && (kex == q)) {\n                        /* Server sent an optimistic packet, and client agrees\n                         * with preference cancel burning the first KEX_INIT\n                         * packet that comes in */\n                        session->burn_optimistic_kexinit = 0;\n                    }\n                    return 0;\n                }\n            }\n\n            s = p ? p + 1 : NULL;\n        }\n        return -1;\n    }\n\n    while(*kexp && (*kexp)->name) {\n        s = kex_agree_instr(kex, kex_len,\n                            (unsigned char *) (*kexp)->name,\n                            strlen((*kexp)->name));\n        if(s) {\n            /* We've agreed on a key exchange method,\n             * Can we agree on a hostkey that works with this kex?\n             */\n            if(kex_agree_hostkey(session, (*kexp)->flags, hostkey,\n                                  hostkey_len) == 0) {\n                session->kex = *kexp;\n                if(session->burn_optimistic_kexinit && (kex == s)) {\n                    /* Server sent an optimistic packet, and client agrees\n                     * with preference cancel burning the first KEX_INIT\n                     * packet that comes in */\n                    session->burn_optimistic_kexinit = 0;\n                }\n                return 0;\n            }\n        }\n        kexp++;\n    }\n    return -1;\n}\n\n\n\n/* kex_agree_crypt\n * Agree on a cipher algo\n */\nstatic int kex_agree_crypt(LIBSSH2_SESSION * session,\n                           libssh2_endpoint_data *endpoint,\n                           unsigned char *crypt,\n                           unsigned long crypt_len)\n{\n    const LIBSSH2_CRYPT_METHOD **cryptp = libssh2_crypt_methods();\n    unsigned char *s;\n\n    (void) session;\n\n    if(endpoint->crypt_prefs) {\n        s = (unsigned char *) endpoint->crypt_prefs;\n\n        while(s && *s) {\n            unsigned char *p = (unsigned char *) strchr((char *) s, ',');\n            size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s));\n\n            if(kex_agree_instr(crypt, crypt_len, s, method_len)) {\n                const LIBSSH2_CRYPT_METHOD *method =\n                    (const LIBSSH2_CRYPT_METHOD *)\n                    kex_get_method_by_name((char *) s, method_len,\n                                           (const LIBSSH2_COMMON_METHOD **)\n                                           cryptp);\n\n                if(!method) {\n                    /* Invalid method -- Should never be reached */\n                    return -1;\n                }\n\n                endpoint->crypt = method;\n                return 0;\n            }\n\n            s = p ? p + 1 : NULL;\n        }\n        return -1;\n    }\n\n    while(*cryptp && (*cryptp)->name) {\n        s = kex_agree_instr(crypt, crypt_len,\n                            (unsigned char *) (*cryptp)->name,\n                            strlen((*cryptp)->name));\n        if(s) {\n            endpoint->crypt = *cryptp;\n            return 0;\n        }\n        cryptp++;\n    }\n\n    return -1;\n}\n\n\n\n/* kex_agree_mac\n * Agree on a message authentication hash\n */\nstatic int kex_agree_mac(LIBSSH2_SESSION * session,\n                         libssh2_endpoint_data * endpoint, unsigned char *mac,\n                         unsigned long mac_len)\n{\n    const LIBSSH2_MAC_METHOD **macp = _libssh2_mac_methods();\n    unsigned char *s;\n    (void) session;\n\n    if(endpoint->mac_prefs) {\n        s = (unsigned char *) endpoint->mac_prefs;\n\n        while(s && *s) {\n            unsigned char *p = (unsigned char *) strchr((char *) s, ',');\n            size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s));\n\n            if(kex_agree_instr(mac, mac_len, s, method_len)) {\n                const LIBSSH2_MAC_METHOD *method = (const LIBSSH2_MAC_METHOD *)\n                    kex_get_method_by_name((char *) s, method_len,\n                                           (const LIBSSH2_COMMON_METHOD **)\n                                           macp);\n\n                if(!method) {\n                    /* Invalid method -- Should never be reached */\n                    return -1;\n                }\n\n                endpoint->mac = method;\n                return 0;\n            }\n\n            s = p ? p + 1 : NULL;\n        }\n        return -1;\n    }\n\n    while(*macp && (*macp)->name) {\n        s = kex_agree_instr(mac, mac_len, (unsigned char *) (*macp)->name,\n                            strlen((*macp)->name));\n        if(s) {\n            endpoint->mac = *macp;\n            return 0;\n        }\n        macp++;\n    }\n\n    return -1;\n}\n\n\n\n/* kex_agree_comp\n * Agree on a compression scheme\n */\nstatic int kex_agree_comp(LIBSSH2_SESSION *session,\n                          libssh2_endpoint_data *endpoint, unsigned char *comp,\n                          unsigned long comp_len)\n{\n    const LIBSSH2_COMP_METHOD **compp = _libssh2_comp_methods(session);\n    unsigned char *s;\n    (void) session;\n\n    if(endpoint->comp_prefs) {\n        s = (unsigned char *) endpoint->comp_prefs;\n\n        while(s && *s) {\n            unsigned char *p = (unsigned char *) strchr((char *) s, ',');\n            size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s));\n\n            if(kex_agree_instr(comp, comp_len, s, method_len)) {\n                const LIBSSH2_COMP_METHOD *method =\n                    (const LIBSSH2_COMP_METHOD *)\n                    kex_get_method_by_name((char *) s, method_len,\n                                           (const LIBSSH2_COMMON_METHOD **)\n                                           compp);\n\n                if(!method) {\n                    /* Invalid method -- Should never be reached */\n                    return -1;\n                }\n\n                endpoint->comp = method;\n                return 0;\n            }\n\n            s = p ? p + 1 : NULL;\n        }\n        return -1;\n    }\n\n    while(*compp && (*compp)->name) {\n        s = kex_agree_instr(comp, comp_len, (unsigned char *) (*compp)->name,\n                            strlen((*compp)->name));\n        if(s) {\n            endpoint->comp = *compp;\n            return 0;\n        }\n        compp++;\n    }\n\n    return -1;\n}\n\n\n\n/* TODO: When in server mode we need to turn this logic on its head\n * The Client gets to make the final call on \"agreed methods\"\n */\n\n/*\n * kex_string_pair() extracts a string from the packet and makes sure it fits\n * within the given packet.\n */\nstatic int kex_string_pair(unsigned char **sp,   /* parsing position */\n                           unsigned char *data,  /* start pointer to packet */\n                           size_t data_len,      /* size of total packet */\n                           size_t *lenp,         /* length of the string */\n                           unsigned char **strp) /* pointer to string start */\n{\n    unsigned char *s = *sp;\n    *lenp = _libssh2_ntohu32(s);\n\n    /* the length of the string must fit within the current pointer and the\n       end of the packet */\n    if(*lenp > (data_len - (s - data) -4))\n        return 1;\n    *strp = s + 4;\n    s += 4 + *lenp;\n\n    *sp = s;\n    return 0;\n}\n\n/* kex_agree_methods\n * Decide which specific method to use of the methods offered by each party\n */\nstatic int kex_agree_methods(LIBSSH2_SESSION * session, unsigned char *data,\n                             unsigned data_len)\n{\n    unsigned char *kex, *hostkey, *crypt_cs, *crypt_sc, *comp_cs, *comp_sc,\n        *mac_cs, *mac_sc;\n    size_t kex_len, hostkey_len, crypt_cs_len, crypt_sc_len, comp_cs_len;\n    size_t comp_sc_len, mac_cs_len, mac_sc_len;\n    unsigned char *s = data;\n\n    /* Skip packet_type, we know it already */\n    s++;\n\n    /* Skip cookie, don't worry, it's preserved in the kexinit field */\n    s += 16;\n\n    /* Locate each string */\n    if(kex_string_pair(&s, data, data_len, &kex_len, &kex))\n        return -1;\n    if(kex_string_pair(&s, data, data_len, &hostkey_len, &hostkey))\n        return -1;\n    if(kex_string_pair(&s, data, data_len, &crypt_cs_len, &crypt_cs))\n        return -1;\n    if(kex_string_pair(&s, data, data_len, &crypt_sc_len, &crypt_sc))\n        return -1;\n    if(kex_string_pair(&s, data, data_len, &mac_cs_len, &mac_cs))\n        return -1;\n    if(kex_string_pair(&s, data, data_len, &mac_sc_len, &mac_sc))\n        return -1;\n    if(kex_string_pair(&s, data, data_len, &comp_cs_len, &comp_cs))\n        return -1;\n    if(kex_string_pair(&s, data, data_len, &comp_sc_len, &comp_sc))\n        return -1;\n\n    /* If the server sent an optimistic packet, assume that it guessed wrong.\n     * If the guess is determined to be right (by kex_agree_kex_hostkey)\n     * This flag will be reset to zero so that it's not ignored */\n    session->burn_optimistic_kexinit = *(s++);\n    /* Next uint32 in packet is all zeros (reserved) */\n\n    if(data_len < (unsigned) (s - data))\n        return -1;              /* short packet */\n\n    if(kex_agree_kex_hostkey(session, kex, kex_len, hostkey, hostkey_len)) {\n        return -1;\n    }\n\n    if(kex_agree_crypt(session, &session->local, crypt_cs, crypt_cs_len)\n       || kex_agree_crypt(session, &session->remote, crypt_sc,\n                          crypt_sc_len)) {\n        return -1;\n    }\n\n    if(kex_agree_mac(session, &session->local, mac_cs, mac_cs_len) ||\n        kex_agree_mac(session, &session->remote, mac_sc, mac_sc_len)) {\n        return -1;\n    }\n\n    if(kex_agree_comp(session, &session->local, comp_cs, comp_cs_len) ||\n        kex_agree_comp(session, &session->remote, comp_sc, comp_sc_len)) {\n        return -1;\n    }\n\n#if 0\n    if(libssh2_kex_agree_lang(session, &session->local, lang_cs, lang_cs_len)\n        || libssh2_kex_agree_lang(session, &session->remote, lang_sc,\n                                  lang_sc_len)) {\n        return -1;\n    }\n#endif\n\n    _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Agreed on KEX method: %s\",\n                   session->kex->name);\n    _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Agreed on HOSTKEY method: %s\",\n                   session->hostkey->name);\n    _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Agreed on CRYPT_CS method: %s\",\n                   session->local.crypt->name);\n    _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Agreed on CRYPT_SC method: %s\",\n                   session->remote.crypt->name);\n    _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Agreed on MAC_CS method: %s\",\n                   session->local.mac->name);\n    _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Agreed on MAC_SC method: %s\",\n                   session->remote.mac->name);\n    _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Agreed on COMP_CS method: %s\",\n                   session->local.comp->name);\n    _libssh2_debug(session, LIBSSH2_TRACE_KEX, \"Agreed on COMP_SC method: %s\",\n                   session->remote.comp->name);\n\n    return 0;\n}\n\n\n\n/* _libssh2_kex_exchange\n * Exchange keys\n * Returns 0 on success, non-zero on failure\n *\n * Returns some errors without _libssh2_error()\n */\nint\n_libssh2_kex_exchange(LIBSSH2_SESSION * session, int reexchange,\n                      key_exchange_state_t * key_state)\n{\n    int rc = 0;\n    int retcode;\n\n    session->state |= LIBSSH2_STATE_KEX_ACTIVE;\n\n    if(key_state->state == libssh2_NB_state_idle) {\n        /* Prevent loop in packet_add() */\n        session->state |= LIBSSH2_STATE_EXCHANGING_KEYS;\n\n        if(reexchange) {\n            session->kex = NULL;\n\n            if(session->hostkey && session->hostkey->dtor) {\n                session->hostkey->dtor(session,\n                                       &session->server_hostkey_abstract);\n            }\n            session->hostkey = NULL;\n        }\n\n        key_state->state = libssh2_NB_state_created;\n    }\n\n    if(!session->kex || !session->hostkey) {\n        if(key_state->state == libssh2_NB_state_created) {\n            /* Preserve in case of failure */\n            key_state->oldlocal = session->local.kexinit;\n            key_state->oldlocal_len = session->local.kexinit_len;\n\n            session->local.kexinit = NULL;\n\n            key_state->state = libssh2_NB_state_sent;\n        }\n\n        if(key_state->state == libssh2_NB_state_sent) {\n            retcode = kexinit(session);\n            if(retcode == LIBSSH2_ERROR_EAGAIN) {\n                session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;\n                return retcode;\n            }\n            else if(retcode) {\n                session->local.kexinit = key_state->oldlocal;\n                session->local.kexinit_len = key_state->oldlocal_len;\n                key_state->state = libssh2_NB_state_idle;\n                session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;\n                session->state &= ~LIBSSH2_STATE_EXCHANGING_KEYS;\n                return -1;\n            }\n\n            key_state->state = libssh2_NB_state_sent1;\n        }\n\n        if(key_state->state == libssh2_NB_state_sent1) {\n            retcode =\n                _libssh2_packet_require(session, SSH_MSG_KEXINIT,\n                                        &key_state->data,\n                                        &key_state->data_len, 0, NULL, 0,\n                                        &key_state->req_state);\n            if(retcode == LIBSSH2_ERROR_EAGAIN) {\n                session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;\n                return retcode;\n            }\n            else if(retcode) {\n                if(session->local.kexinit) {\n                    LIBSSH2_FREE(session, session->local.kexinit);\n                }\n                session->local.kexinit = key_state->oldlocal;\n                session->local.kexinit_len = key_state->oldlocal_len;\n                key_state->state = libssh2_NB_state_idle;\n                session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;\n                session->state &= ~LIBSSH2_STATE_EXCHANGING_KEYS;\n                return -1;\n            }\n\n            if(session->remote.kexinit) {\n                LIBSSH2_FREE(session, session->remote.kexinit);\n            }\n            session->remote.kexinit = key_state->data;\n            session->remote.kexinit_len = key_state->data_len;\n\n            if(kex_agree_methods(session, key_state->data,\n                                  key_state->data_len))\n                rc = LIBSSH2_ERROR_KEX_FAILURE;\n\n            key_state->state = libssh2_NB_state_sent2;\n        }\n    }\n    else {\n        key_state->state = libssh2_NB_state_sent2;\n    }\n\n    if(rc == 0 && session->kex) {\n        if(key_state->state == libssh2_NB_state_sent2) {\n            retcode = session->kex->exchange_keys(session,\n                                                  &key_state->key_state_low);\n            if(retcode == LIBSSH2_ERROR_EAGAIN) {\n                session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;\n                return retcode;\n            }\n            else if(retcode) {\n                rc = _libssh2_error(session,\n                                    LIBSSH2_ERROR_KEY_EXCHANGE_FAILURE,\n                                    \"Unrecoverable error exchanging keys\");\n            }\n        }\n    }\n\n    /* Done with kexinit buffers */\n    if(session->local.kexinit) {\n        LIBSSH2_FREE(session, session->local.kexinit);\n        session->local.kexinit = NULL;\n    }\n    if(session->remote.kexinit) {\n        LIBSSH2_FREE(session, session->remote.kexinit);\n        session->remote.kexinit = NULL;\n    }\n\n    session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;\n    session->state &= ~LIBSSH2_STATE_EXCHANGING_KEYS;\n\n    key_state->state = libssh2_NB_state_idle;\n\n    return rc;\n}\n\n\n\n/* libssh2_session_method_pref\n * Set preferred method\n */\nLIBSSH2_API int\nlibssh2_session_method_pref(LIBSSH2_SESSION * session, int method_type,\n                            const char *prefs)\n{\n    char **prefvar, *s, *newprefs;\n    int prefs_len = strlen(prefs);\n    const LIBSSH2_COMMON_METHOD **mlist;\n\n    switch(method_type) {\n    case LIBSSH2_METHOD_KEX:\n        prefvar = &session->kex_prefs;\n        mlist = (const LIBSSH2_COMMON_METHOD **) libssh2_kex_methods;\n        break;\n\n    case LIBSSH2_METHOD_HOSTKEY:\n        prefvar = &session->hostkey_prefs;\n        mlist = (const LIBSSH2_COMMON_METHOD **) libssh2_hostkey_methods();\n        break;\n\n    case LIBSSH2_METHOD_CRYPT_CS:\n        prefvar = &session->local.crypt_prefs;\n        mlist = (const LIBSSH2_COMMON_METHOD **) libssh2_crypt_methods();\n        break;\n\n    case LIBSSH2_METHOD_CRYPT_SC:\n        prefvar = &session->remote.crypt_prefs;\n        mlist = (const LIBSSH2_COMMON_METHOD **) libssh2_crypt_methods();\n        break;\n\n    case LIBSSH2_METHOD_MAC_CS:\n        prefvar = &session->local.mac_prefs;\n        mlist = (const LIBSSH2_COMMON_METHOD **) _libssh2_mac_methods();\n        break;\n\n    case LIBSSH2_METHOD_MAC_SC:\n        prefvar = &session->remote.mac_prefs;\n        mlist = (const LIBSSH2_COMMON_METHOD **) _libssh2_mac_methods();\n        break;\n\n    case LIBSSH2_METHOD_COMP_CS:\n        prefvar = &session->local.comp_prefs;\n        mlist = (const LIBSSH2_COMMON_METHOD **)\n            _libssh2_comp_methods(session);\n        break;\n\n    case LIBSSH2_METHOD_COMP_SC:\n        prefvar = &session->remote.comp_prefs;\n        mlist = (const LIBSSH2_COMMON_METHOD **)\n            _libssh2_comp_methods(session);\n        break;\n\n    case LIBSSH2_METHOD_LANG_CS:\n        prefvar = &session->local.lang_prefs;\n        mlist = NULL;\n        break;\n\n    case LIBSSH2_METHOD_LANG_SC:\n        prefvar = &session->remote.lang_prefs;\n        mlist = NULL;\n        break;\n\n    default:\n        return _libssh2_error(session, LIBSSH2_ERROR_INVAL,\n                              \"Invalid parameter specified for method_type\");\n    }\n\n    s = newprefs = LIBSSH2_ALLOC(session, prefs_len + 1);\n    if(!newprefs) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Error allocated space for method preferences\");\n    }\n    memcpy(s, prefs, prefs_len + 1);\n\n    while(s && *s && mlist) {\n        char *p = strchr(s, ',');\n        int method_len = p ? (p - s) : (int) strlen(s);\n\n        if(!kex_get_method_by_name(s, method_len, mlist)) {\n            /* Strip out unsupported method */\n            if(p) {\n                memcpy(s, p + 1, strlen(s) - method_len);\n            }\n            else {\n                if(s > newprefs) {\n                    *(--s) = '\\0';\n                }\n                else {\n                    *s = '\\0';\n                }\n            }\n        }\n        else {\n            s = p ? (p + 1) : NULL;\n        }\n    }\n\n    if(strlen(newprefs) == 0) {\n        LIBSSH2_FREE(session, newprefs);\n        return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"The requested method(s) are not currently \"\n                              \"supported\");\n    }\n\n    if(*prefvar) {\n        LIBSSH2_FREE(session, *prefvar);\n    }\n    *prefvar = newprefs;\n\n    return 0;\n}\n\n/*\n * libssh2_session_supported_algs()\n * returns a number of returned algorithms (a positive number) on success,\n * a negative number on failure\n */\n\nLIBSSH2_API int libssh2_session_supported_algs(LIBSSH2_SESSION* session,\n                                               int method_type,\n                                               const char ***algs)\n{\n    unsigned int i;\n    unsigned int j;\n    unsigned int ialg;\n    const LIBSSH2_COMMON_METHOD **mlist;\n\n    /* to prevent coredumps due to dereferencing of NULL */\n    if(NULL == algs)\n        return _libssh2_error(session, LIBSSH2_ERROR_BAD_USE,\n                              \"algs must not be NULL\");\n\n    switch(method_type) {\n    case LIBSSH2_METHOD_KEX:\n        mlist = (const LIBSSH2_COMMON_METHOD **) libssh2_kex_methods;\n        break;\n\n    case LIBSSH2_METHOD_HOSTKEY:\n        mlist = (const LIBSSH2_COMMON_METHOD **) libssh2_hostkey_methods();\n        break;\n\n    case LIBSSH2_METHOD_CRYPT_CS:\n    case LIBSSH2_METHOD_CRYPT_SC:\n        mlist = (const LIBSSH2_COMMON_METHOD **) libssh2_crypt_methods();\n        break;\n\n    case LIBSSH2_METHOD_MAC_CS:\n    case LIBSSH2_METHOD_MAC_SC:\n        mlist = (const LIBSSH2_COMMON_METHOD **) _libssh2_mac_methods();\n        break;\n\n    case LIBSSH2_METHOD_COMP_CS:\n    case LIBSSH2_METHOD_COMP_SC:\n        mlist = (const LIBSSH2_COMMON_METHOD **)\n            _libssh2_comp_methods(session);\n        break;\n\n    default:\n        return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Unknown method type\");\n    }  /* switch */\n\n    /* weird situation */\n    if(NULL == mlist)\n        return _libssh2_error(session, LIBSSH2_ERROR_INVAL,\n                              \"No algorithm found\");\n\n    /*\n      mlist is looped through twice. The first time to find the number od\n      supported algorithms (needed to allocate the proper size of array) and\n      the second time to actually copy the pointers.  Typically this function\n      will not be called often (typically at the beginning of a session) and\n      the number of algorithms (i.e. niumber of iterations in one loop) will\n      not be high (typically it will not exceed 20) for quite a long time.\n\n      So double looping really shouldn't be an issue and it is definitely a\n      better solution than reallocation several times.\n    */\n\n    /* count the number of supported algorithms */\n    for(i = 0, ialg = 0; NULL != mlist[i]; i++) {\n        /* do not count fields with NULL name */\n        if(mlist[i]->name)\n            ialg++;\n    }\n\n    /* weird situation, no algorithm found */\n    if(0 == ialg)\n        return _libssh2_error(session, LIBSSH2_ERROR_INVAL,\n                              \"No algorithm found\");\n\n    /* allocate buffer */\n    *algs = (const char **) LIBSSH2_ALLOC(session, ialg*sizeof(const char *));\n    if(NULL == *algs) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Memory allocation failed\");\n    }\n    /* Past this point *algs must be deallocated in case of an error!! */\n\n    /* copy non-NULL pointers only */\n    for(i = 0, j = 0; NULL != mlist[i] && j < ialg; i++) {\n        if(NULL == mlist[i]->name) {\n            /* maybe a weird situation but if it occurs, do not include NULL\n               pointers */\n            continue;\n        }\n\n        /* note that [] has higher priority than * (dereferencing) */\n        (*algs)[j++] = mlist[i]->name;\n    }\n\n    /* correct number of pointers copied? (test the code above) */\n    if(j != ialg) {\n        /* deallocate buffer */\n        LIBSSH2_FREE(session, (void *)*algs);\n        *algs = NULL;\n\n        return _libssh2_error(session, LIBSSH2_ERROR_BAD_USE,\n                              \"Internal error\");\n    }\n\n    return ialg;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/knownhost.c",
    "content": "/*\n * Copyright (c) 2009-2019 by Daniel Stenberg\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include \"misc.h\"\n\nstruct known_host {\n    struct list_node node;\n    char *name;      /* points to the name or the hash (allocated) */\n    size_t name_len; /* needed for hashed data */\n    int port;        /* if non-zero, a specific port this key is for on this\n                        host */\n    int typemask;    /* plain, sha1, custom, ... */\n    char *salt;      /* points to binary salt (allocated) */\n    size_t salt_len; /* size of salt */\n    char *key;       /* the (allocated) associated key. This is kept base64\n                        encoded in memory. */\n    char *key_type_name; /* the (allocated) key type name */\n    size_t key_type_len; /* size of key_type_name */\n    char *comment;       /* the (allocated) optional comment text, may be\n                            NULL */\n    size_t comment_len;  /* the size of comment */\n\n    /* this is the struct we expose externally */\n    struct libssh2_knownhost external;\n};\n\nstruct _LIBSSH2_KNOWNHOSTS\n{\n    LIBSSH2_SESSION *session;  /* the session this \"belongs to\" */\n    struct list_head head;\n};\n\nstatic void free_host(LIBSSH2_SESSION *session, struct known_host *entry)\n{\n    if(entry) {\n        if(entry->comment)\n            LIBSSH2_FREE(session, entry->comment);\n        if(entry->key_type_name)\n            LIBSSH2_FREE(session, entry->key_type_name);\n        if(entry->key)\n            LIBSSH2_FREE(session, entry->key);\n        if(entry->salt)\n            LIBSSH2_FREE(session, entry->salt);\n        if(entry->name)\n            LIBSSH2_FREE(session, entry->name);\n        LIBSSH2_FREE(session, entry);\n    }\n}\n\n/*\n * libssh2_knownhost_init\n *\n * Init a collection of known hosts. Returns the pointer to a collection.\n *\n */\nLIBSSH2_API LIBSSH2_KNOWNHOSTS *\nlibssh2_knownhost_init(LIBSSH2_SESSION *session)\n{\n    LIBSSH2_KNOWNHOSTS *knh =\n        LIBSSH2_ALLOC(session, sizeof(struct _LIBSSH2_KNOWNHOSTS));\n\n    if(!knh) {\n        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                       \"Unable to allocate memory for known-hosts \"\n                       \"collection\");\n        return NULL;\n    }\n\n    knh->session = session;\n\n    _libssh2_list_init(&knh->head);\n\n    return knh;\n}\n\n#define KNOWNHOST_MAGIC 0xdeadcafe\n/*\n * knownhost_to_external()\n *\n * Copies data from the internal to the external representation struct.\n *\n */\nstatic struct libssh2_knownhost *knownhost_to_external(struct known_host *node)\n{\n    struct libssh2_knownhost *ext = &node->external;\n\n    ext->magic = KNOWNHOST_MAGIC;\n    ext->node = node;\n    ext->name = ((node->typemask & LIBSSH2_KNOWNHOST_TYPE_MASK) ==\n                 LIBSSH2_KNOWNHOST_TYPE_PLAIN)? node->name:NULL;\n    ext->key = node->key;\n    ext->typemask = node->typemask;\n\n    return ext;\n}\n\nstatic int\nknownhost_add(LIBSSH2_KNOWNHOSTS *hosts,\n              const char *host, const char *salt,\n              const char *key_type_name, size_t key_type_len,\n              const char *key, size_t keylen,\n              const char *comment, size_t commentlen,\n              int typemask, struct libssh2_knownhost **store)\n{\n    struct known_host *entry;\n    size_t hostlen = strlen(host);\n    int rc;\n    char *ptr;\n    unsigned int ptrlen;\n\n    /* make sure we have a key type set */\n    if(!(typemask & LIBSSH2_KNOWNHOST_KEY_MASK))\n        return _libssh2_error(hosts->session, LIBSSH2_ERROR_INVAL,\n                              \"No key type set\");\n\n    entry = LIBSSH2_CALLOC(hosts->session, sizeof(struct known_host));\n    if(!entry)\n        return _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                              \"Unable to allocate memory for known host \"\n                              \"entry\");\n\n    entry->typemask = typemask;\n\n    switch(entry->typemask  & LIBSSH2_KNOWNHOST_TYPE_MASK) {\n    case LIBSSH2_KNOWNHOST_TYPE_PLAIN:\n    case LIBSSH2_KNOWNHOST_TYPE_CUSTOM:\n        entry->name = LIBSSH2_ALLOC(hosts->session, hostlen + 1);\n        if(!entry->name) {\n            rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                                \"Unable to allocate memory for host name\");\n            goto error;\n        }\n        memcpy(entry->name, host, hostlen + 1);\n        entry->name_len = hostlen;\n        break;\n    case LIBSSH2_KNOWNHOST_TYPE_SHA1:\n        rc = libssh2_base64_decode(hosts->session, &ptr, &ptrlen,\n                                   host, hostlen);\n        if(rc)\n            goto error;\n        entry->name = ptr;\n        entry->name_len = ptrlen;\n\n        rc = libssh2_base64_decode(hosts->session, &ptr, &ptrlen,\n                                   salt, strlen(salt));\n        if(rc)\n            goto error;\n        entry->salt = ptr;\n        entry->salt_len = ptrlen;\n        break;\n    default:\n        rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                            \"Unknown host name type\");\n        goto error;\n    }\n\n    if(typemask & LIBSSH2_KNOWNHOST_KEYENC_BASE64) {\n        /* the provided key is base64 encoded already */\n        if(!keylen)\n            keylen = strlen(key);\n        entry->key = LIBSSH2_ALLOC(hosts->session, keylen + 1);\n        if(!entry->key) {\n            rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                                \"Unable to allocate memory for key\");\n            goto error;\n        }\n        memcpy(entry->key, key, keylen + 1);\n        entry->key[keylen] = 0; /* force a terminating zero trailer */\n    }\n    else {\n        /* key is raw, we base64 encode it and store it as such */\n        size_t nlen = _libssh2_base64_encode(hosts->session, key, keylen,\n                                             &ptr);\n        if(!nlen) {\n            rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                                \"Unable to allocate memory for \"\n                                \"base64-encoded key\");\n            goto error;\n        }\n\n        entry->key = ptr;\n    }\n\n    if(key_type_name && ((typemask & LIBSSH2_KNOWNHOST_KEY_MASK) ==\n                          LIBSSH2_KNOWNHOST_KEY_UNKNOWN)) {\n        entry->key_type_name = LIBSSH2_ALLOC(hosts->session, key_type_len + 1);\n        if(!entry->key_type_name) {\n            rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                                \"Unable to allocate memory for key type\");\n            goto error;\n        }\n        memcpy(entry->key_type_name, key_type_name, key_type_len);\n        entry->key_type_name[key_type_len] = 0;\n        entry->key_type_len = key_type_len;\n    }\n\n    if(comment) {\n        entry->comment = LIBSSH2_ALLOC(hosts->session, commentlen + 1);\n        if(!entry->comment) {\n            rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                                \"Unable to allocate memory for comment\");\n            goto error;\n        }\n        memcpy(entry->comment, comment, commentlen + 1);\n        entry->comment[commentlen] = 0; /* force a terminating zero trailer */\n        entry->comment_len = commentlen;\n    }\n    else {\n        entry->comment = NULL;\n    }\n\n    /* add this new host to the big list of known hosts */\n    _libssh2_list_add(&hosts->head, &entry->node);\n\n    if(store)\n        *store = knownhost_to_external(entry);\n\n    return LIBSSH2_ERROR_NONE;\n  error:\n    free_host(hosts->session, entry);\n    return rc;\n}\n\n/*\n * libssh2_knownhost_add\n *\n * Add a host and its associated key to the collection of known hosts.\n *\n * The 'type' argument specifies on what format the given host and keys are:\n *\n * plain  - ascii \"hostname.domain.tld\"\n * sha1   - SHA1(<salt> <host>) base64-encoded!\n * custom - another hash\n *\n * If 'sha1' is selected as type, the salt must be provided to the salt\n * argument. This too base64 encoded.\n *\n * The SHA-1 hash is what OpenSSH can be told to use in known_hosts files.  If\n * a custom type is used, salt is ignored and you must provide the host\n * pre-hashed when checking for it in the libssh2_knownhost_check() function.\n *\n * The keylen parameter may be omitted (zero) if the key is provided as a\n * NULL-terminated base64-encoded string.\n */\n\nLIBSSH2_API int\nlibssh2_knownhost_add(LIBSSH2_KNOWNHOSTS *hosts,\n                      const char *host, const char *salt,\n                      const char *key, size_t keylen,\n                      int typemask, struct libssh2_knownhost **store)\n{\n    return knownhost_add(hosts, host, salt, NULL, 0, key, keylen, NULL,\n                         0, typemask, store);\n}\n\n\n/*\n * libssh2_knownhost_addc\n *\n * Add a host and its associated key to the collection of known hosts.\n *\n * Takes a comment argument that may be NULL.  A NULL comment indicates\n * there is no comment and the entry will end directly after the key\n * when written out to a file.  An empty string \"\" comment will indicate an\n * empty comment which will cause a single space to be written after the key.\n *\n * The 'type' argument specifies on what format the given host and keys are:\n *\n * plain  - ascii \"hostname.domain.tld\"\n * sha1   - SHA1(<salt> <host>) base64-encoded!\n * custom - another hash\n *\n * If 'sha1' is selected as type, the salt must be provided to the salt\n * argument. This too base64 encoded.\n *\n * The SHA-1 hash is what OpenSSH can be told to use in known_hosts files.  If\n * a custom type is used, salt is ignored and you must provide the host\n * pre-hashed when checking for it in the libssh2_knownhost_check() function.\n *\n * The keylen parameter may be omitted (zero) if the key is provided as a\n * NULL-terminated base64-encoded string.\n */\n\nLIBSSH2_API int\nlibssh2_knownhost_addc(LIBSSH2_KNOWNHOSTS *hosts,\n                       const char *host, const char *salt,\n                       const char *key, size_t keylen,\n                       const char *comment, size_t commentlen,\n                       int typemask, struct libssh2_knownhost **store)\n{\n    return knownhost_add(hosts, host, salt, NULL, 0, key, keylen,\n                         comment, commentlen, typemask, store);\n}\n\n/*\n * knownhost_check\n *\n * Check a host and its associated key against the collection of known hosts.\n *\n * The typemask is the type/format of the given host name and key\n *\n * plain  - ascii \"hostname.domain.tld\"\n * sha1   - NOT SUPPORTED AS INPUT\n * custom - prehashed base64 encoded. Note that this cannot use any salts.\n *\n * Returns:\n *\n * LIBSSH2_KNOWNHOST_CHECK_FAILURE\n * LIBSSH2_KNOWNHOST_CHECK_NOTFOUND\n * LIBSSH2_KNOWNHOST_CHECK_MATCH\n * LIBSSH2_KNOWNHOST_CHECK_MISMATCH\n */\nstatic int\nknownhost_check(LIBSSH2_KNOWNHOSTS *hosts,\n                const char *hostp, int port,\n                const char *key, size_t keylen,\n                int typemask,\n                struct libssh2_knownhost **ext)\n{\n    struct known_host *node;\n    struct known_host *badkey = NULL;\n    int type = typemask & LIBSSH2_KNOWNHOST_TYPE_MASK;\n    char *keyalloc = NULL;\n    int rc = LIBSSH2_KNOWNHOST_CHECK_NOTFOUND;\n    char hostbuff[270]; /* most host names can't be longer than like 256 */\n    const char *host;\n    int numcheck; /* number of host combos to check */\n    int match = 0;\n\n    if(type == LIBSSH2_KNOWNHOST_TYPE_SHA1)\n        /* we can't work with a sha1 as given input */\n        return LIBSSH2_KNOWNHOST_CHECK_MISMATCH;\n\n    /* if a port number is given, check for a '[host]:port' first before the\n       plain 'host' */\n    if(port >= 0) {\n        int len = snprintf(hostbuff, sizeof(hostbuff), \"[%s]:%d\", hostp, port);\n        if(len < 0 || len >= (int)sizeof(hostbuff)) {\n            _libssh2_error(hosts->session,\n                           LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                           \"Known-host write buffer too small\");\n            return LIBSSH2_KNOWNHOST_CHECK_FAILURE;\n        }\n        host = hostbuff;\n        numcheck = 2; /* check both combos, start with this */\n    }\n    else {\n        host = hostp;\n        numcheck = 1; /* only check this host version */\n    }\n\n    if(!(typemask & LIBSSH2_KNOWNHOST_KEYENC_BASE64)) {\n        /* we got a raw key input, convert it to base64 for the checks below */\n        size_t nlen = _libssh2_base64_encode(hosts->session, key, keylen,\n                                             &keyalloc);\n        if(!nlen) {\n            _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate memory for base64-encoded \"\n                           \"key\");\n            return LIBSSH2_KNOWNHOST_CHECK_FAILURE;\n        }\n\n        /* make the key point to this */\n        key = keyalloc;\n    }\n\n    do {\n        node = _libssh2_list_first(&hosts->head);\n        while(node) {\n            switch(node->typemask & LIBSSH2_KNOWNHOST_TYPE_MASK) {\n            case LIBSSH2_KNOWNHOST_TYPE_PLAIN:\n                if(type == LIBSSH2_KNOWNHOST_TYPE_PLAIN)\n                    match = !strcmp(host, node->name);\n                break;\n            case LIBSSH2_KNOWNHOST_TYPE_CUSTOM:\n                if(type == LIBSSH2_KNOWNHOST_TYPE_CUSTOM)\n                    match = !strcmp(host, node->name);\n                break;\n            case LIBSSH2_KNOWNHOST_TYPE_SHA1:\n                if(type == LIBSSH2_KNOWNHOST_TYPE_PLAIN) {\n                    /* when we have the sha1 version stored, we can use a\n                       plain input to produce a hash to compare with the\n                       stored hash.\n                    */\n                    unsigned char hash[SHA_DIGEST_LENGTH];\n                    libssh2_hmac_ctx ctx;\n                    libssh2_hmac_ctx_init(ctx);\n\n                    if(SHA_DIGEST_LENGTH != node->name_len) {\n                        /* the name hash length must be the sha1 size or\n                           we can't match it */\n                        break;\n                    }\n                    libssh2_hmac_sha1_init(&ctx, (unsigned char *)node->salt,\n                                           node->salt_len);\n                    libssh2_hmac_update(ctx, (unsigned char *)host,\n                                        strlen(host));\n                    libssh2_hmac_final(ctx, hash);\n                    libssh2_hmac_cleanup(&ctx);\n\n                    if(!memcmp(hash, node->name, SHA_DIGEST_LENGTH))\n                        /* this is a node we're interested in */\n                        match = 1;\n                }\n                break;\n            default: /* unsupported type */\n                break;\n            }\n            if(match) {\n                int host_key_type = typemask & LIBSSH2_KNOWNHOST_KEY_MASK;\n                int known_key_type =\n                    node->typemask & LIBSSH2_KNOWNHOST_KEY_MASK;\n                /* match on key type as follows:\n                   - never match on an unknown key type\n                   - if key_type is set to zero, ignore it an match always\n                   - otherwise match when both key types are equal\n                */\n                if(host_key_type != LIBSSH2_KNOWNHOST_KEY_UNKNOWN &&\n                     (host_key_type == 0 ||\n                      host_key_type == known_key_type)) {\n                    /* host name and key type match, now compare the keys */\n                    if(!strcmp(key, node->key)) {\n                        /* they match! */\n                        if(ext)\n                            *ext = knownhost_to_external(node);\n                        badkey = NULL;\n                        rc = LIBSSH2_KNOWNHOST_CHECK_MATCH;\n                        break;\n                    }\n                    else {\n                        /* remember the first node that had a host match but a\n                           failed key match since we continue our search from\n                           here */\n                        if(!badkey)\n                            badkey = node;\n                    }\n                }\n                match = 0; /* don't count this as a match anymore */\n            }\n            node = _libssh2_list_next(&node->node);\n        }\n        host = hostp;\n    } while(!match && --numcheck);\n\n    if(badkey) {\n        /* key mismatch */\n        if(ext)\n            *ext = knownhost_to_external(badkey);\n        rc = LIBSSH2_KNOWNHOST_CHECK_MISMATCH;\n    }\n\n    if(keyalloc)\n        LIBSSH2_FREE(hosts->session, keyalloc);\n\n    return rc;\n}\n\n/*\n * libssh2_knownhost_check\n *\n * Check a host and its associated key against the collection of known hosts.\n *\n * The typemask is the type/format of the given host name and key\n *\n * plain  - ascii \"hostname.domain.tld\"\n * sha1   - NOT SUPPORTED AS INPUT\n * custom - prehashed base64 encoded. Note that this cannot use any salts.\n *\n * Returns:\n *\n * LIBSSH2_KNOWNHOST_CHECK_FAILURE\n * LIBSSH2_KNOWNHOST_CHECK_NOTFOUND\n * LIBSSH2_KNOWNHOST_CHECK_MATCH\n * LIBSSH2_KNOWNHOST_CHECK_MISMATCH\n */\nLIBSSH2_API int\nlibssh2_knownhost_check(LIBSSH2_KNOWNHOSTS *hosts,\n                        const char *hostp, const char *key, size_t keylen,\n                        int typemask,\n                        struct libssh2_knownhost **ext)\n{\n    return knownhost_check(hosts, hostp, -1, key, keylen,\n                           typemask, ext);\n}\n\n/*\n * libssh2_knownhost_checkp\n *\n * Check a host+port and its associated key against the collection of known\n * hosts.\n *\n * Note that if 'port' is specified as greater than zero, the check function\n * will be able to check for a dedicated key for this particular host+port\n * combo, and if 'port' is negative it only checks for the generic host key.\n *\n * The typemask is the type/format of the given host name and key\n *\n * plain  - ascii \"hostname.domain.tld\"\n * sha1   - NOT SUPPORTED AS INPUT\n * custom - prehashed base64 encoded. Note that this cannot use any salts.\n *\n * Returns:\n *\n * LIBSSH2_KNOWNHOST_CHECK_FAILURE\n * LIBSSH2_KNOWNHOST_CHECK_NOTFOUND\n * LIBSSH2_KNOWNHOST_CHECK_MATCH\n * LIBSSH2_KNOWNHOST_CHECK_MISMATCH\n */\nLIBSSH2_API int\nlibssh2_knownhost_checkp(LIBSSH2_KNOWNHOSTS *hosts,\n                         const char *hostp, int port,\n                         const char *key, size_t keylen,\n                         int typemask,\n                         struct libssh2_knownhost **ext)\n{\n    return knownhost_check(hosts, hostp, port, key, keylen,\n                           typemask, ext);\n}\n\n\n/*\n * libssh2_knownhost_del\n *\n * Remove a host from the collection of known hosts.\n *\n */\nLIBSSH2_API int\nlibssh2_knownhost_del(LIBSSH2_KNOWNHOSTS *hosts,\n                      struct libssh2_knownhost *entry)\n{\n    struct known_host *node;\n\n    /* check that this was retrieved the right way or get out */\n    if(!entry || (entry->magic != KNOWNHOST_MAGIC))\n        return _libssh2_error(hosts->session, LIBSSH2_ERROR_INVAL,\n                              \"Invalid host information\");\n\n    /* get the internal node pointer */\n    node = entry->node;\n\n    /* unlink from the list of all hosts */\n    _libssh2_list_remove(&node->node);\n\n    /* clear the struct now since the memory in which it is allocated is\n       about to be freed! */\n    memset(entry, 0, sizeof(struct libssh2_knownhost));\n\n    /* free all resources */\n    free_host(hosts->session, node);\n\n    return 0;\n}\n\n/*\n * libssh2_knownhost_free\n *\n * Free an entire collection of known hosts.\n *\n */\nLIBSSH2_API void\nlibssh2_knownhost_free(LIBSSH2_KNOWNHOSTS *hosts)\n{\n    struct known_host *node;\n    struct known_host *next;\n\n    for(node = _libssh2_list_first(&hosts->head); node; node = next) {\n        next = _libssh2_list_next(&node->node);\n        free_host(hosts->session, node);\n    }\n    LIBSSH2_FREE(hosts->session, hosts);\n}\n\n\n/* old style plain text: [name]([,][name])*\n\n   for the sake of simplicity, we add them as separate hosts with the same\n   key\n*/\nstatic int oldstyle_hostline(LIBSSH2_KNOWNHOSTS *hosts,\n                             const char *host, size_t hostlen,\n                             const char *key_type_name, size_t key_type_len,\n                             const char *key, size_t keylen, int key_type,\n                             const char *comment, size_t commentlen)\n{\n    int rc = 0;\n    size_t namelen = 0;\n    const char *name = host + hostlen;\n\n    if(hostlen < 1)\n        return _libssh2_error(hosts->session,\n                              LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Failed to parse known_hosts line \"\n                              \"(no host names)\");\n\n    while(name > host) {\n        --name;\n        ++namelen;\n\n        /* when we get the the start or see a comma coming up, add the host\n           name to the collection */\n        if((name == host) || (*(name-1) == ',')) {\n\n            char hostbuf[256];\n\n            /* make sure we don't overflow the buffer */\n            if(namelen >= sizeof(hostbuf)-1)\n                return _libssh2_error(hosts->session,\n                                      LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                                      \"Failed to parse known_hosts line \"\n                                      \"(unexpected length)\");\n\n            /* copy host name to the temp buffer and zero terminate */\n            memcpy(hostbuf, name, namelen);\n            hostbuf[namelen] = 0;\n\n            rc = knownhost_add(hosts, hostbuf, NULL,\n                               key_type_name, key_type_len,\n                               key, keylen,\n                               comment, commentlen,\n                               key_type | LIBSSH2_KNOWNHOST_TYPE_PLAIN |\n                               LIBSSH2_KNOWNHOST_KEYENC_BASE64, NULL);\n            if(rc)\n                return rc;\n\n            if(name > host) {\n                namelen = 0;\n                --name; /* skip comma */\n            }\n        }\n    }\n\n    return rc;\n}\n\n/* |1|[salt]|[hash] */\nstatic int hashed_hostline(LIBSSH2_KNOWNHOSTS *hosts,\n                           const char *host, size_t hostlen,\n                           const char *key_type_name, size_t key_type_len,\n                           const char *key, size_t keylen, int key_type,\n                           const char *comment, size_t commentlen)\n{\n    const char *p;\n    char saltbuf[32];\n    char hostbuf[256];\n\n    const char *salt = &host[3]; /* skip the magic marker */\n    hostlen -= 3;    /* deduct the marker */\n\n    /* this is where the salt starts, find the end of it */\n    for(p = salt; *p && (*p != '|'); p++)\n        ;\n\n    if(*p == '|') {\n        const char *hash = NULL;\n        size_t saltlen = p - salt;\n        if(saltlen >= (sizeof(saltbuf)-1)) /* weird length */\n            return _libssh2_error(hosts->session,\n                                  LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                                  \"Failed to parse known_hosts line \"\n                                  \"(unexpectedly long salt)\");\n\n        memcpy(saltbuf, salt, saltlen);\n        saltbuf[saltlen] = 0; /* zero terminate */\n        salt = saltbuf; /* point to the stack based buffer */\n\n        hash = p + 1; /* the host hash is after the separator */\n\n        /* now make the host point to the hash */\n        host = hash;\n        hostlen -= saltlen + 1; /* deduct the salt and separator */\n\n        /* check that the lengths seem sensible */\n        if(hostlen >= sizeof(hostbuf)-1)\n            return _libssh2_error(hosts->session,\n                                  LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                                  \"Failed to parse known_hosts line \"\n                                  \"(unexpected length)\");\n\n        memcpy(hostbuf, host, hostlen);\n        hostbuf[hostlen] = 0;\n\n        return knownhost_add(hosts, hostbuf, salt,\n                             key_type_name, key_type_len,\n                             key, keylen,\n                             comment, commentlen,\n                             key_type | LIBSSH2_KNOWNHOST_TYPE_SHA1 |\n                             LIBSSH2_KNOWNHOST_KEYENC_BASE64, NULL);\n    }\n    else\n        return 0; /* XXX: This should be an error, shouldn't it? */\n}\n\n/*\n * hostline()\n *\n * Parse a single known_host line pre-split into host and key.\n *\n * The key part may include an optional comment which will be parsed here\n * for ssh-rsa and ssh-dsa keys.  Comments in other key types aren't handled.\n *\n * The function assumes new-lines have already been removed from the arguments.\n */\nstatic int hostline(LIBSSH2_KNOWNHOSTS *hosts,\n                    const char *host, size_t hostlen,\n                    const char *key, size_t keylen)\n{\n    const char *comment = NULL;\n    const char *key_type_name = NULL;\n    size_t commentlen = 0;\n    size_t key_type_len = 0;\n    int key_type;\n\n    /* make some checks that the lengths seem sensible */\n    if(keylen < 20)\n        return _libssh2_error(hosts->session,\n                              LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Failed to parse known_hosts line \"\n                              \"(key too short)\");\n\n    switch(key[0]) {\n    case '0': case '1': case '2': case '3': case '4':\n    case '5': case '6': case '7': case '8': case '9':\n        key_type = LIBSSH2_KNOWNHOST_KEY_RSA1;\n\n        /* Note that the old-style keys (RSA1) aren't truly base64, but we\n         * claim it is for now since we can get away with strcmp()ing the\n         * entire anything anyway! We need to check and fix these to make them\n         * work properly.\n         */\n        break;\n\n    default:\n        key_type_name = key;\n        while(keylen && *key &&\n               (*key != ' ') && (*key != '\\t')) {\n            key++;\n            keylen--;\n        }\n        key_type_len = key - key_type_name;\n\n        if(!strncmp(key_type_name, \"ssh-dss\", key_type_len))\n            key_type = LIBSSH2_KNOWNHOST_KEY_SSHDSS;\n        else if(!strncmp(key_type_name, \"ssh-rsa\", key_type_len))\n            key_type = LIBSSH2_KNOWNHOST_KEY_SSHRSA;\n        else if(!strncmp(key_type_name, \"ecdsa-sha2-nistp256\", key_type_len))\n            key_type = LIBSSH2_KNOWNHOST_KEY_ECDSA_256;\n        else if(!strncmp(key_type_name, \"ecdsa-sha2-nistp384\", key_type_len))\n            key_type = LIBSSH2_KNOWNHOST_KEY_ECDSA_384;\n        else if(!strncmp(key_type_name, \"ecdsa-sha2-nistp521\", key_type_len))\n            key_type = LIBSSH2_KNOWNHOST_KEY_ECDSA_521;\n        else if(!strncmp(key_type_name, \"ssh-ed25519\", key_type_len))\n            key_type = LIBSSH2_KNOWNHOST_KEY_ED25519;\n        else\n            key_type = LIBSSH2_KNOWNHOST_KEY_UNKNOWN;\n\n        /* skip whitespaces */\n        while((*key ==' ') || (*key == '\\t')) {\n            key++;\n            keylen--;\n        }\n\n        comment = key;\n        commentlen = keylen;\n\n        /* move over key */\n        while(commentlen && *comment &&\n              (*comment != ' ') && (*comment != '\\t')) {\n            comment++;\n            commentlen--;\n        }\n\n        /* reduce key by comment length */\n        keylen -= commentlen;\n\n        /* Distinguish empty comment (a space) from no comment (no space) */\n        if(commentlen == 0)\n            comment = NULL;\n\n        /* skip whitespaces */\n        while(commentlen && *comment &&\n              ((*comment ==' ') || (*comment == '\\t'))) {\n            comment++;\n            commentlen--;\n        }\n        break;\n    }\n\n    /* Figure out host format */\n    if((hostlen >2) && memcmp(host, \"|1|\", 3)) {\n        /* old style plain text: [name]([,][name])*\n\n           for the sake of simplicity, we add them as separate hosts with the\n           same key\n        */\n        return oldstyle_hostline(hosts, host, hostlen, key_type_name,\n                                 key_type_len, key, keylen, key_type,\n                                 comment, commentlen);\n    }\n    else {\n        /* |1|[salt]|[hash] */\n        return hashed_hostline(hosts, host, hostlen, key_type_name,\n                               key_type_len, key, keylen, key_type,\n                               comment, commentlen);\n    }\n}\n\n/*\n * libssh2_knownhost_readline()\n *\n * Pass in a line of a file of 'type'.\n *\n * LIBSSH2_KNOWNHOST_FILE_OPENSSH is the only supported type.\n *\n * OpenSSH line format:\n *\n * <host> <key>\n *\n * Where the two parts can be created like:\n *\n * <host> can be either\n * <name> or <hash>\n *\n * <name> consists of\n * [name] optionally followed by [,name] one or more times\n *\n * <hash> consists of\n * |1|<salt>|hash\n *\n * <key> can be one of:\n * [RSA bits] [e] [n as a decimal number]\n * 'ssh-dss' [base64-encoded-key]\n * 'ssh-rsa' [base64-encoded-key]\n *\n */\nLIBSSH2_API int\nlibssh2_knownhost_readline(LIBSSH2_KNOWNHOSTS *hosts,\n                           const char *line, size_t len, int type)\n{\n    const char *cp;\n    const char *hostp;\n    const char *keyp;\n    size_t hostlen;\n    size_t keylen;\n    int rc;\n\n    if(type != LIBSSH2_KNOWNHOST_FILE_OPENSSH)\n        return _libssh2_error(hosts->session,\n                              LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Unsupported type of known-host information \"\n                              \"store\");\n\n    cp = line;\n\n    /* skip leading whitespaces */\n    while(len && ((*cp == ' ') || (*cp == '\\t'))) {\n        cp++;\n        len--;\n    }\n\n    if(!len || !*cp || (*cp == '#') || (*cp == '\\n'))\n        /* comment or empty line */\n        return LIBSSH2_ERROR_NONE;\n\n    /* the host part starts here */\n    hostp = cp;\n\n    /* move over the host to the separator */\n    while(len && *cp && (*cp != ' ') && (*cp != '\\t')) {\n        cp++;\n        len--;\n    }\n\n    hostlen = cp - hostp;\n\n    /* the key starts after the whitespaces */\n    while(len && *cp && ((*cp == ' ') || (*cp == '\\t'))) {\n        cp++;\n        len--;\n    }\n\n    if(!*cp || !len) /* illegal line */\n        return _libssh2_error(hosts->session,\n                              LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Failed to parse known_hosts line\");\n\n    keyp = cp; /* the key starts here */\n    keylen = len;\n\n    /* check if the line (key) ends with a newline and if so kill it */\n    while(len && *cp && (*cp != '\\n')) {\n        cp++;\n        len--;\n    }\n\n    /* zero terminate where the newline is */\n    if(*cp == '\\n')\n        keylen--; /* don't include this in the count */\n\n    /* deal with this one host+key line */\n    rc = hostline(hosts, hostp, hostlen, keyp, keylen);\n    if(rc)\n        return rc; /* failed */\n\n    return LIBSSH2_ERROR_NONE; /* success */\n}\n\n/*\n * libssh2_knownhost_readfile\n *\n * Read hosts+key pairs from a given file.\n *\n * Returns a negative value for error or number of successfully added hosts.\n *\n */\n\nLIBSSH2_API int\nlibssh2_knownhost_readfile(LIBSSH2_KNOWNHOSTS *hosts,\n                           const char *filename, int type)\n{\n    FILE *file;\n    int num = 0;\n    char buf[2048];\n\n    if(type != LIBSSH2_KNOWNHOST_FILE_OPENSSH)\n        return _libssh2_error(hosts->session,\n                              LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Unsupported type of known-host information \"\n                              \"store\");\n\n    file = fopen(filename, FOPEN_READTEXT);\n    if(file) {\n        while(fgets(buf, sizeof(buf), file)) {\n            if(libssh2_knownhost_readline(hosts, buf, strlen(buf), type)) {\n                num = _libssh2_error(hosts->session, LIBSSH2_ERROR_KNOWN_HOSTS,\n                                     \"Failed to parse known hosts file\");\n                break;\n            }\n            num++;\n        }\n        fclose(file);\n    }\n    else\n        return _libssh2_error(hosts->session, LIBSSH2_ERROR_FILE,\n                              \"Failed to open file\");\n\n    return num;\n}\n\n/*\n * knownhost_writeline()\n *\n * Ask libssh2 to convert a known host to an output line for storage.\n *\n * Note that this function returns LIBSSH2_ERROR_BUFFER_TOO_SMALL if the given\n * output buffer is too small to hold the desired output. The 'outlen' field\n * will then contain the size libssh2 wanted to store, which then is the\n * smallest sufficient buffer it would require.\n *\n */\nstatic int\nknownhost_writeline(LIBSSH2_KNOWNHOSTS *hosts,\n                    struct known_host *node,\n                    char *buf, size_t buflen,\n                    size_t *outlen, int type)\n{\n    size_t required_size;\n\n    const char *key_type_name;\n    size_t key_type_len;\n\n    /* we only support this single file type for now, bail out on all other\n       attempts */\n    if(type != LIBSSH2_KNOWNHOST_FILE_OPENSSH)\n        return _libssh2_error(hosts->session,\n                              LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Unsupported type of known-host information \"\n                              \"store\");\n\n    switch(node->typemask & LIBSSH2_KNOWNHOST_KEY_MASK) {\n    case LIBSSH2_KNOWNHOST_KEY_RSA1:\n        key_type_name = NULL;\n        key_type_len = 0;\n        break;\n    case LIBSSH2_KNOWNHOST_KEY_SSHRSA:\n        key_type_name = \"ssh-rsa\";\n        key_type_len = 7;\n        break;\n    case LIBSSH2_KNOWNHOST_KEY_SSHDSS:\n        key_type_name = \"ssh-dss\";\n        key_type_len = 7;\n        break;\n    case LIBSSH2_KNOWNHOST_KEY_ECDSA_256:\n        key_type_name = \"ecdsa-sha2-nistp256\";\n        key_type_len = 19;\n        break;\n    case LIBSSH2_KNOWNHOST_KEY_ECDSA_384:\n        key_type_name = \"ecdsa-sha2-nistp384\";\n        key_type_len = 19;\n        break;\n    case LIBSSH2_KNOWNHOST_KEY_ECDSA_521:\n        key_type_name = \"ecdsa-sha2-nistp521\";\n        key_type_len = 19;\n        break;\n    case LIBSSH2_KNOWNHOST_KEY_ED25519:\n        key_type_name = \"ssh-ed25519\";\n        key_type_len = 11;\n        break;\n    case LIBSSH2_KNOWNHOST_KEY_UNKNOWN:\n        key_type_name = node->key_type_name;\n        if(key_type_name) {\n            key_type_len = node->key_type_len;\n            break;\n        }\n        /* otherwise fallback to default and error */\n        /* FALL-THROUGH */\n    default:\n        return _libssh2_error(hosts->session,\n                              LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Unsupported type of known-host entry\");\n    }\n\n    /* When putting together the host line there are three aspects to consider:\n       - Hashed (SHA1) or unhashed hostname\n       - key name or no key name (RSA1)\n       - comment or no comment\n\n       This means there are 2^3 different formats:\n       (\"|1|%s|%s %s %s %s\\n\", salt, hashed_host, key_name, key, comment)\n       (\"|1|%s|%s %s %s\\n\", salt, hashed_host, key_name, key)\n       (\"|1|%s|%s %s %s\\n\", salt, hashed_host, key, comment)\n       (\"|1|%s|%s %s\\n\", salt, hashed_host, key)\n       (\"%s %s %s %s\\n\", host, key_name, key, comment)\n       (\"%s %s %s\\n\", host, key_name, key)\n       (\"%s %s %s\\n\", host, key, comment)\n       (\"%s %s\\n\", host, key)\n\n       Even if the buffer is too small, we have to set outlen to the number of\n       characters the complete line would have taken.  We also don't write\n       anything to the buffer unless we are sure we can write everything to the\n       buffer. */\n\n    required_size = strlen(node->key);\n\n    if(key_type_len)\n        required_size += key_type_len + 1; /* ' ' = 1 */\n    if(node->comment)\n        required_size += node->comment_len + 1; /* ' ' = 1 */\n\n    if((node->typemask & LIBSSH2_KNOWNHOST_TYPE_MASK) ==\n       LIBSSH2_KNOWNHOST_TYPE_SHA1) {\n        char *namealloc;\n        size_t name_base64_len;\n        char *saltalloc;\n        size_t salt_base64_len;\n\n        name_base64_len = _libssh2_base64_encode(hosts->session, node->name,\n                                                 node->name_len, &namealloc);\n        if(!name_base64_len)\n            return _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"base64-encoded host name\");\n\n        salt_base64_len = _libssh2_base64_encode(hosts->session,\n                                                 node->salt, node->salt_len,\n                                                 &saltalloc);\n        if(!salt_base64_len) {\n            LIBSSH2_FREE(hosts->session, namealloc);\n            return _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"base64-encoded salt\");\n        }\n\n        required_size += salt_base64_len + name_base64_len + 7;\n        /* |1| + | + ' ' + \\n + \\0 = 7 */\n\n        if(required_size <= buflen) {\n            if(node->comment && key_type_len)\n                snprintf(buf, buflen, \"|1|%s|%s %s %s %s\\n\", saltalloc,\n                         namealloc, key_type_name, node->key, node->comment);\n            else if(node->comment)\n                snprintf(buf, buflen, \"|1|%s|%s %s %s\\n\", saltalloc, namealloc,\n                         node->key, node->comment);\n            else if(key_type_len)\n                snprintf(buf, buflen, \"|1|%s|%s %s %s\\n\", saltalloc, namealloc,\n                         key_type_name, node->key);\n            else\n                snprintf(buf, buflen, \"|1|%s|%s %s\\n\", saltalloc, namealloc,\n                         node->key);\n        }\n\n        LIBSSH2_FREE(hosts->session, namealloc);\n        LIBSSH2_FREE(hosts->session, saltalloc);\n    }\n    else {\n        required_size += node->name_len + 3;\n        /* ' ' + '\\n' + \\0 = 3 */\n\n        if(required_size <= buflen) {\n            if(node->comment && key_type_len)\n                snprintf(buf, buflen, \"%s %s %s %s\\n\", node->name,\n                         key_type_name, node->key, node->comment);\n            else if(node->comment)\n                snprintf(buf, buflen, \"%s %s %s\\n\", node->name, node->key,\n                         node->comment);\n            else if(key_type_len)\n                snprintf(buf, buflen, \"%s %s %s\\n\", node->name, key_type_name,\n                         node->key);\n            else\n                snprintf(buf, buflen, \"%s %s\\n\", node->name, node->key);\n        }\n    }\n\n    /* we report the full length of the data with the trailing zero excluded */\n    *outlen = required_size-1;\n\n    if(required_size <= buflen)\n        return LIBSSH2_ERROR_NONE;\n    else\n        return _libssh2_error(hosts->session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                              \"Known-host write buffer too small\");\n}\n\n/*\n * libssh2_knownhost_writeline()\n *\n * Ask libssh2 to convert a known host to an output line for storage.\n *\n * Note that this function returns LIBSSH2_ERROR_BUFFER_TOO_SMALL if the given\n * output buffer is too small to hold the desired output.\n */\nLIBSSH2_API int\nlibssh2_knownhost_writeline(LIBSSH2_KNOWNHOSTS *hosts,\n                            struct libssh2_knownhost *known,\n                            char *buffer, size_t buflen,\n                            size_t *outlen, /* the amount of written data */\n                            int type)\n{\n    struct known_host *node;\n\n    if(known->magic != KNOWNHOST_MAGIC)\n        return _libssh2_error(hosts->session, LIBSSH2_ERROR_INVAL,\n                              \"Invalid host information\");\n\n    node = known->node;\n\n    return knownhost_writeline(hosts, node, buffer, buflen, outlen, type);\n}\n\n/*\n * libssh2_knownhost_writefile()\n *\n * Write hosts+key pairs to the given file.\n */\nLIBSSH2_API int\nlibssh2_knownhost_writefile(LIBSSH2_KNOWNHOSTS *hosts,\n                            const char *filename, int type)\n{\n    struct known_host *node;\n    FILE *file;\n    int rc = LIBSSH2_ERROR_NONE;\n    char buffer[2048];\n\n    /* we only support this single file type for now, bail out on all other\n       attempts */\n    if(type != LIBSSH2_KNOWNHOST_FILE_OPENSSH)\n        return _libssh2_error(hosts->session,\n                              LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                              \"Unsupported type of known-host information \"\n                              \"store\");\n\n    file = fopen(filename, FOPEN_WRITETEXT);\n    if(!file)\n        return _libssh2_error(hosts->session, LIBSSH2_ERROR_FILE,\n                              \"Failed to open file\");\n\n    for(node = _libssh2_list_first(&hosts->head);\n        node;\n        node = _libssh2_list_next(&node->node)) {\n        size_t wrote = 0;\n        size_t nwrote;\n        rc = knownhost_writeline(hosts, node, buffer, sizeof(buffer), &wrote,\n                                 type);\n        if(rc)\n            break;\n\n        nwrote = fwrite(buffer, 1, wrote, file);\n        if(nwrote != wrote) {\n            /* failed to write the whole thing, bail out */\n            rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_FILE,\n                                \"Write failed\");\n            break;\n        }\n    }\n    fclose(file);\n\n    return rc;\n}\n\n\n/*\n * libssh2_knownhost_get()\n *\n * Traverse the internal list of known hosts. Pass NULL to 'prev' to get\n * the first one.\n *\n * Returns:\n * 0 if a fine host was stored in 'store'\n * 1 if end of hosts\n * [negative] on errors\n */\nLIBSSH2_API int\nlibssh2_knownhost_get(LIBSSH2_KNOWNHOSTS *hosts,\n                      struct libssh2_knownhost **ext,\n                      struct libssh2_knownhost *oprev)\n{\n    struct known_host *node;\n    if(oprev && oprev->node) {\n        /* we have a starting point */\n        struct known_host *prev = oprev->node;\n\n        /* get the next node in the list */\n        node = _libssh2_list_next(&prev->node);\n\n    }\n    else\n        node = _libssh2_list_first(&hosts->head);\n\n    if(!node)\n        /* no (more) node */\n        return 1;\n\n    *ext = knownhost_to_external(node);\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/libgcrypt.c",
    "content": "/* Copyright (C) 2008, 2009, Simon Josefsson\n * Copyright (C) 2006, 2007, The Written Word, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\n#ifdef LIBSSH2_LIBGCRYPT /* compile only if we build with libgcrypt */\n\n#include <string.h>\n\nint\n_libssh2_rsa_new(libssh2_rsa_ctx ** rsa,\n                 const unsigned char *edata,\n                 unsigned long elen,\n                 const unsigned char *ndata,\n                 unsigned long nlen,\n                 const unsigned char *ddata,\n                 unsigned long dlen,\n                 const unsigned char *pdata,\n                 unsigned long plen,\n                 const unsigned char *qdata,\n                 unsigned long qlen,\n                 const unsigned char *e1data,\n                 unsigned long e1len,\n                 const unsigned char *e2data,\n                 unsigned long e2len,\n                 const unsigned char *coeffdata, unsigned long coefflen)\n{\n    int rc;\n    (void) e1data;\n    (void) e1len;\n    (void) e2data;\n    (void) e2len;\n\n    if(ddata) {\n        rc = gcry_sexp_build\n            (rsa, NULL,\n             \"(private-key(rsa(n%b)(e%b)(d%b)(q%b)(p%b)(u%b)))\",\n             nlen, ndata, elen, edata, dlen, ddata, plen, pdata,\n             qlen, qdata, coefflen, coeffdata);\n    }\n    else {\n        rc = gcry_sexp_build(rsa, NULL, \"(public-key(rsa(n%b)(e%b)))\",\n                             nlen, ndata, elen, edata);\n    }\n    if(rc) {\n        *rsa = NULL;\n        return -1;\n    }\n\n    return 0;\n}\n\nint\n_libssh2_rsa_sha1_verify(libssh2_rsa_ctx * rsa,\n                         const unsigned char *sig,\n                         unsigned long sig_len,\n                         const unsigned char *m, unsigned long m_len)\n{\n    unsigned char hash[SHA_DIGEST_LENGTH];\n    gcry_sexp_t s_sig, s_hash;\n    int rc = -1;\n\n    libssh2_sha1(m, m_len, hash);\n\n    rc = gcry_sexp_build(&s_hash, NULL,\n                         \"(data (flags pkcs1) (hash sha1 %b))\",\n                         SHA_DIGEST_LENGTH, hash);\n    if(rc != 0) {\n        return -1;\n    }\n\n    rc = gcry_sexp_build(&s_sig, NULL, \"(sig-val(rsa(s %b)))\", sig_len, sig);\n    if(rc != 0) {\n        gcry_sexp_release(s_hash);\n        return -1;\n    }\n\n    rc = gcry_pk_verify(s_sig, s_hash, rsa);\n    gcry_sexp_release(s_sig);\n    gcry_sexp_release(s_hash);\n\n    return (rc == 0) ? 0 : -1;\n}\n\nint\n_libssh2_dsa_new(libssh2_dsa_ctx ** dsactx,\n                 const unsigned char *p,\n                 unsigned long p_len,\n                 const unsigned char *q,\n                 unsigned long q_len,\n                 const unsigned char *g,\n                 unsigned long g_len,\n                 const unsigned char *y,\n                 unsigned long y_len,\n                 const unsigned char *x, unsigned long x_len)\n{\n    int rc;\n\n    if(x_len) {\n        rc = gcry_sexp_build\n            (dsactx, NULL,\n             \"(private-key(dsa(p%b)(q%b)(g%b)(y%b)(x%b)))\",\n             p_len, p, q_len, q, g_len, g, y_len, y, x_len, x);\n    }\n    else {\n        rc = gcry_sexp_build(dsactx, NULL,\n                             \"(public-key(dsa(p%b)(q%b)(g%b)(y%b)))\",\n                             p_len, p, q_len, q, g_len, g, y_len, y);\n    }\n\n    if(rc) {\n        *dsactx = NULL;\n        return -1;\n    }\n\n    return 0;\n}\n\nint\n_libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx ** rsa,\n                                    LIBSSH2_SESSION * session,\n                                    const char *filedata, size_t filedata_len,\n                                    unsigned const char *passphrase)\n{\n    return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                         \"Unable to extract private key from memory: \"\n                         \"Method unimplemented in libgcrypt backend\");\n}\n\nint\n_libssh2_rsa_new_private(libssh2_rsa_ctx ** rsa,\n                         LIBSSH2_SESSION * session,\n                         const char *filename, unsigned const char *passphrase)\n{\n    FILE *fp;\n    unsigned char *data, *save_data;\n    unsigned int datalen;\n    int ret;\n    unsigned char *n, *e, *d, *p, *q, *e1, *e2, *coeff;\n    unsigned int nlen, elen, dlen, plen, qlen, e1len, e2len, coefflen;\n\n    fp = fopen(filename, FOPEN_READTEXT);\n    if(!fp) {\n        return -1;\n    }\n\n    ret = _libssh2_pem_parse(session,\n                             \"-----BEGIN RSA PRIVATE KEY-----\",\n                             \"-----END RSA PRIVATE KEY-----\",\n                             passphrase,\n                             fp, &data, &datalen);\n    fclose(fp);\n    if(ret) {\n        return -1;\n    }\n\n    save_data = data;\n\n    if(_libssh2_pem_decode_sequence(&data, &datalen)) {\n        ret = -1;\n        goto fail;\n    }\n/* First read Version field (should be 0). */\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &n, &nlen);\n    if(ret != 0 || (nlen != 1 && *n != '\\0')) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &n, &nlen);\n    if(ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &e, &elen);\n    if(ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &d, &dlen);\n    if(ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &p, &plen);\n    if(ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &q, &qlen);\n    if(ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &e1, &e1len);\n    if(ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &e2, &e2len);\n    if(ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &coeff, &coefflen);\n    if(ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    if(_libssh2_rsa_new(rsa, e, elen, n, nlen, d, dlen, p, plen,\n                         q, qlen, e1, e1len, e2, e2len, coeff, coefflen)) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = 0;\n\n  fail:\n    LIBSSH2_FREE(session, save_data);\n    return ret;\n}\n\nint\n_libssh2_dsa_new_private_frommemory(libssh2_dsa_ctx ** dsa,\n                                    LIBSSH2_SESSION * session,\n                                    const char *filedata, size_t filedata_len,\n                                    unsigned const char *passphrase)\n{\n    return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                         \"Unable to extract private key from memory: \"\n                         \"Method unimplemented in libgcrypt backend\");\n}\n\nint\n_libssh2_dsa_new_private(libssh2_dsa_ctx ** dsa,\n                         LIBSSH2_SESSION * session,\n                         const char *filename, unsigned const char *passphrase)\n{\n    FILE *fp;\n    unsigned char *data, *save_data;\n    unsigned int datalen;\n    int ret;\n    unsigned char *p, *q, *g, *y, *x;\n    unsigned int plen, qlen, glen, ylen, xlen;\n\n    fp = fopen(filename, FOPEN_READTEXT);\n    if(!fp) {\n        return -1;\n    }\n\n    ret = _libssh2_pem_parse(session,\n                             \"-----BEGIN DSA PRIVATE KEY-----\",\n                             \"-----END DSA PRIVATE KEY-----\",\n                             passphrase,\n                             fp, &data, &datalen);\n    fclose(fp);\n    if(ret) {\n        return -1;\n    }\n\n    save_data = data;\n\n    if(_libssh2_pem_decode_sequence(&data, &datalen)) {\n        ret = -1;\n        goto fail;\n    }\n\n/* First read Version field (should be 0). */\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &p, &plen);\n    if(ret != 0 || (plen != 1 && *p != '\\0')) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &p, &plen);\n    if(ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &q, &qlen);\n    if(ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &g, &glen);\n    if(ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &y, &ylen);\n    if(ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = _libssh2_pem_decode_integer(&data, &datalen, &x, &xlen);\n    if(ret != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    if(datalen != 0) {\n        ret = -1;\n        goto fail;\n    }\n\n    if(_libssh2_dsa_new(dsa, p, plen, q, qlen, g, glen, y, ylen, x, xlen)) {\n        ret = -1;\n        goto fail;\n    }\n\n    ret = 0;\n\n  fail:\n    LIBSSH2_FREE(session, save_data);\n    return ret;\n}\n\nint\n_libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session,\n                       libssh2_rsa_ctx * rsactx,\n                       const unsigned char *hash,\n                       size_t hash_len,\n                       unsigned char **signature, size_t *signature_len)\n{\n    gcry_sexp_t sig_sexp;\n    gcry_sexp_t data;\n    int rc;\n    const char *tmp;\n    size_t size;\n\n    if(hash_len != SHA_DIGEST_LENGTH) {\n        return -1;\n    }\n\n    if(gcry_sexp_build(&data, NULL,\n                        \"(data (flags pkcs1) (hash sha1 %b))\",\n                        hash_len, hash)) {\n        return -1;\n    }\n\n    rc = gcry_pk_sign(&sig_sexp, data, rsactx);\n\n    gcry_sexp_release(data);\n\n    if(rc != 0) {\n        return -1;\n    }\n\n    data = gcry_sexp_find_token(sig_sexp, \"s\", 0);\n    if(!data) {\n        return -1;\n    }\n\n    tmp = gcry_sexp_nth_data(data, 1, &size);\n    if(!tmp) {\n        gcry_sexp_release(data);\n        return -1;\n    }\n\n    if(tmp[0] == '\\0') {\n        tmp++;\n        size--;\n    }\n\n    *signature = LIBSSH2_ALLOC(session, size);\n    if(!*signature) {\n        gcry_sexp_release(data);\n        return -1;\n    }\n    memcpy(*signature, tmp, size);\n    *signature_len = size;\n\n    gcry_sexp_release(data);\n\n    return rc;\n}\n\nint\n_libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx,\n                       const unsigned char *hash,\n                       unsigned long hash_len, unsigned char *sig)\n{\n    unsigned char zhash[SHA_DIGEST_LENGTH + 1];\n    gcry_sexp_t sig_sexp;\n    gcry_sexp_t data;\n    int ret;\n    const char *tmp;\n    size_t size;\n\n    if(hash_len != SHA_DIGEST_LENGTH) {\n        return -1;\n    }\n\n    memcpy(zhash + 1, hash, hash_len);\n    zhash[0] = 0;\n\n    if(gcry_sexp_build(&data, NULL, \"(data (value %b))\",\n                       hash_len + 1, zhash)) {\n        return -1;\n    }\n\n    ret = gcry_pk_sign(&sig_sexp, data, dsactx);\n\n    gcry_sexp_release(data);\n\n    if(ret != 0) {\n        return -1;\n    }\n\n    memset(sig, 0, 40);\n\n/* Extract R. */\n\n    data = gcry_sexp_find_token(sig_sexp, \"r\", 0);\n    if(!data)\n        goto err;\n\n    tmp = gcry_sexp_nth_data(data, 1, &size);\n    if(!tmp)\n        goto err;\n\n    if(tmp[0] == '\\0') {\n        tmp++;\n        size--;\n    }\n\n    if(size < 1 || size > 20)\n        goto err;\n\n    memcpy(sig + (20 - size), tmp, size);\n\n    gcry_sexp_release(data);\n\n/* Extract S. */\n\n    data = gcry_sexp_find_token(sig_sexp, \"s\", 0);\n    if(!data)\n        goto err;\n\n    tmp = gcry_sexp_nth_data(data, 1, &size);\n    if(!tmp)\n        goto err;\n\n    if(tmp[0] == '\\0') {\n        tmp++;\n        size--;\n    }\n\n    if(size < 1 || size > 20)\n        goto err;\n\n    memcpy(sig + 20 + (20 - size), tmp, size);\n    goto out;\n\n  err:\n    ret = -1;\n\n  out:\n    if(sig_sexp) {\n        gcry_sexp_release(sig_sexp);\n    }\n    if(data) {\n        gcry_sexp_release(data);\n    }\n    return ret;\n}\n\nint\n_libssh2_dsa_sha1_verify(libssh2_dsa_ctx * dsactx,\n                         const unsigned char *sig,\n                         const unsigned char *m, unsigned long m_len)\n{\n    unsigned char hash[SHA_DIGEST_LENGTH + 1];\n    gcry_sexp_t s_sig, s_hash;\n    int rc = -1;\n\n    libssh2_sha1(m, m_len, hash + 1);\n    hash[0] = 0;\n\n    if(gcry_sexp_build(&s_hash, NULL, \"(data(flags raw)(value %b))\",\n                        SHA_DIGEST_LENGTH + 1, hash)) {\n        return -1;\n    }\n\n    if(gcry_sexp_build(&s_sig, NULL, \"(sig-val(dsa(r %b)(s %b)))\",\n                        20, sig, 20, sig + 20)) {\n        gcry_sexp_release(s_hash);\n        return -1;\n    }\n\n    rc = gcry_pk_verify(s_sig, s_hash, dsactx);\n    gcry_sexp_release(s_sig);\n    gcry_sexp_release(s_hash);\n\n    return (rc == 0) ? 0 : -1;\n}\n\nint\n_libssh2_cipher_init(_libssh2_cipher_ctx * h,\n                     _libssh2_cipher_type(algo),\n                     unsigned char *iv, unsigned char *secret, int encrypt)\n{\n    int ret;\n    int cipher = _libssh2_gcry_cipher(algo);\n    int mode = _libssh2_gcry_mode(algo);\n    int keylen = gcry_cipher_get_algo_keylen(cipher);\n\n    (void) encrypt;\n\n    ret = gcry_cipher_open(h, cipher, mode, 0);\n    if(ret) {\n        return -1;\n    }\n\n    ret = gcry_cipher_setkey(*h, secret, keylen);\n    if(ret) {\n        gcry_cipher_close(*h);\n        return -1;\n    }\n\n    if(mode != GCRY_CIPHER_MODE_STREAM) {\n        int blklen = gcry_cipher_get_algo_blklen(cipher);\n        if(mode == GCRY_CIPHER_MODE_CTR)\n            ret = gcry_cipher_setctr(*h, iv, blklen);\n        else\n            ret = gcry_cipher_setiv(*h, iv, blklen);\n        if(ret) {\n            gcry_cipher_close(*h);\n            return -1;\n        }\n    }\n\n    return 0;\n}\n\nint\n_libssh2_cipher_crypt(_libssh2_cipher_ctx * ctx,\n                      _libssh2_cipher_type(algo),\n                      int encrypt, unsigned char *block, size_t blklen)\n{\n    int cipher = _libssh2_gcry_cipher(algo);\n    int ret;\n\n    if(encrypt) {\n        ret = gcry_cipher_encrypt(*ctx, block, blklen, block, blklen);\n    }\n    else {\n        ret = gcry_cipher_decrypt(*ctx, block, blklen, block, blklen);\n    }\n    return ret;\n}\n\nint\n_libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session,\n                                unsigned char **method,\n                                size_t *method_len,\n                                unsigned char **pubkeydata,\n                                size_t *pubkeydata_len,\n                                const char *privatekeydata,\n                                size_t privatekeydata_len,\n                                const char *passphrase)\n{\n    return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                          \"Unable to extract public key from private \"\n                          \"key in memory: \"\n                          \"Method unimplemented in libgcrypt backend\");\n}\n\nint\n_libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session,\n                          unsigned char **method,\n                          size_t *method_len,\n                          unsigned char **pubkeydata,\n                          size_t *pubkeydata_len,\n                          const char *privatekey,\n                          const char *passphrase)\n{\n    return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                         \"Unable to extract public key from private key file: \"\n                         \"Method unimplemented in libgcrypt backend\");\n}\n\nvoid _libssh2_init_aes_ctr(void)\n{\n    /* no implementation */\n}\n\nvoid\n_libssh2_dh_init(_libssh2_dh_ctx *dhctx)\n{\n    *dhctx = gcry_mpi_new(0);                   /* Random from client */\n}\n\nint\n_libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public,\n                     _libssh2_bn *g, _libssh2_bn *p, int group_order)\n{\n    /* Generate x and e */\n    gcry_mpi_randomize(*dhctx, group_order * 8 - 1, GCRY_WEAK_RANDOM);\n    gcry_mpi_powm(public, g, *dhctx, p);\n    return 0;\n}\n\nint\n_libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret,\n                   _libssh2_bn *f, _libssh2_bn *p)\n{\n    /* Compute the shared secret */\n    gcry_mpi_powm(secret, f, *dhctx, p);\n    return 0;\n}\n\nvoid\n_libssh2_dh_dtor(_libssh2_dh_ctx *dhctx)\n{\n    gcry_mpi_release(*dhctx);\n    *dhctx = NULL;\n}\n\n#endif /* LIBSSH2_LIBGCRYPT */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/libgcrypt.h",
    "content": "/*\n * Copyright (C) 2008, 2009, 2010 Simon Josefsson\n * Copyright (C) 2006, 2007, The Written Word, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include <gcrypt.h>\n\n#define LIBSSH2_MD5 1\n\n#define LIBSSH2_HMAC_RIPEMD 1\n#define LIBSSH2_HMAC_SHA256 1\n#define LIBSSH2_HMAC_SHA512 1\n\n#define LIBSSH2_AES 1\n#define LIBSSH2_AES_CTR 1\n#define LIBSSH2_BLOWFISH 1\n#define LIBSSH2_RC4 1\n#define LIBSSH2_CAST 1\n#define LIBSSH2_3DES 1\n\n#define LIBSSH2_RSA 1\n#define LIBSSH2_DSA 1\n#define LIBSSH2_ECDSA 0\n#define LIBSSH2_ED25519 0\n\n#define MD5_DIGEST_LENGTH 16\n#define SHA_DIGEST_LENGTH 20\n#define SHA256_DIGEST_LENGTH 32\n#define SHA384_DIGEST_LENGTH 48\n#define SHA512_DIGEST_LENGTH 64\n\n#define EC_MAX_POINT_LEN ((528 * 2 / 8) + 1)\n\n#define _libssh2_random(buf, len)                \\\n  (gcry_randomize ((buf), (len), GCRY_STRONG_RANDOM), 1)\n\n#define libssh2_prepare_iovec(vec, len)  /* Empty. */\n\n#define libssh2_sha1_ctx gcry_md_hd_t\n\n/* returns 0 in case of failure */\n#define libssh2_sha1_init(ctx) \\\n  (GPG_ERR_NO_ERROR == gcry_md_open(ctx,  GCRY_MD_SHA1, 0))\n#define libssh2_sha1_update(ctx, data, len) \\\n  gcry_md_write(ctx, (unsigned char *) data, len)\n#define libssh2_sha1_final(ctx, out) \\\n  memcpy(out, gcry_md_read(ctx, 0), SHA_DIGEST_LENGTH), gcry_md_close(ctx)\n#define libssh2_sha1(message, len, out) \\\n  gcry_md_hash_buffer(GCRY_MD_SHA1, out, message, len)\n\n#define libssh2_sha256_ctx gcry_md_hd_t\n\n#define libssh2_sha256_init(ctx) \\\n  (GPG_ERR_NO_ERROR == gcry_md_open(ctx,  GCRY_MD_SHA256, 0))\n#define libssh2_sha256_update(ctx, data, len) \\\n  gcry_md_write(ctx, (unsigned char *) data, len)\n#define libssh2_sha256_final(ctx, out) \\\n  memcpy(out, gcry_md_read(ctx, 0), SHA256_DIGEST_LENGTH), gcry_md_close(ctx)\n#define libssh2_sha256(message, len, out) \\\n  gcry_md_hash_buffer(GCRY_MD_SHA256, out, message, len)\n\n#define libssh2_sha384_ctx gcry_md_hd_t\n\n#define libssh2_sha384_init(ctx) \\\n  (GPG_ERR_NO_ERROR == gcry_md_open(ctx,  GCRY_MD_SHA384, 0))\n#define libssh2_sha384_update(ctx, data, len) \\\n  gcry_md_write(ctx, (unsigned char *) data, len)\n#define libssh2_sha384_final(ctx, out) \\\n  memcpy(out, gcry_md_read(ctx, 0), SHA384_DIGEST_LENGTH), gcry_md_close(ctx)\n#define libssh2_sha384(message, len, out) \\\n  gcry_md_hash_buffer(GCRY_MD_SHA384, out, message, len)\n\n#define libssh2_sha512_ctx gcry_md_hd_t\n\n#define libssh2_sha512_init(ctx) \\\n  (GPG_ERR_NO_ERROR == gcry_md_open(ctx,  GCRY_MD_SHA512, 0))\n#define libssh2_sha512_update(ctx, data, len) \\\n  gcry_md_write(ctx, (unsigned char *) data, len)\n#define libssh2_sha512_final(ctx, out) \\\n  memcpy(out, gcry_md_read(ctx, 0), SHA512_DIGEST_LENGTH), gcry_md_close(ctx)\n#define libssh2_sha512(message, len, out) \\\n  gcry_md_hash_buffer(GCRY_MD_SHA512, out, message, len)\n\n#define libssh2_md5_ctx gcry_md_hd_t\n\n/* returns 0 in case of failure */\n#define libssh2_md5_init(ctx) \\\n  (GPG_ERR_NO_ERROR == gcry_md_open(ctx,  GCRY_MD_MD5, 0))\n\n#define libssh2_md5_update(ctx, data, len) \\\n  gcry_md_write(ctx, (unsigned char *) data, len)\n#define libssh2_md5_final(ctx, out) \\\n  memcpy(out, gcry_md_read(ctx, 0), MD5_DIGEST_LENGTH), gcry_md_close(ctx)\n#define libssh2_md5(message, len, out) \\\n  gcry_md_hash_buffer(GCRY_MD_MD5, out, message, len)\n\n#define libssh2_hmac_ctx gcry_md_hd_t\n#define libssh2_hmac_ctx_init(ctx)\n#define libssh2_hmac_sha1_init(ctx, key, keylen) \\\n  gcry_md_open(ctx, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC), \\\n    gcry_md_setkey(*ctx, key, keylen)\n#define libssh2_hmac_md5_init(ctx, key, keylen) \\\n  gcry_md_open(ctx, GCRY_MD_MD5, GCRY_MD_FLAG_HMAC), \\\n    gcry_md_setkey(*ctx, key, keylen)\n#define libssh2_hmac_ripemd160_init(ctx, key, keylen) \\\n  gcry_md_open(ctx, GCRY_MD_RMD160, GCRY_MD_FLAG_HMAC), \\\n    gcry_md_setkey(*ctx, key, keylen)\n#define libssh2_hmac_sha256_init(ctx, key, keylen) \\\n  gcry_md_open(ctx, GCRY_MD_SHA256, GCRY_MD_FLAG_HMAC), \\\n    gcry_md_setkey(*ctx, key, keylen)\n#define libssh2_hmac_sha512_init(ctx, key, keylen) \\\n  gcry_md_open(ctx, GCRY_MD_SHA512, GCRY_MD_FLAG_HMAC), \\\n    gcry_md_setkey(*ctx, key, keylen)\n#define libssh2_hmac_update(ctx, data, datalen) \\\n  gcry_md_write(ctx, (unsigned char *) data, datalen)\n#define libssh2_hmac_final(ctx, data) \\\n  memcpy(data, gcry_md_read(ctx, 0), \\\n      gcry_md_get_algo_dlen(gcry_md_get_algo(ctx)))\n#define libssh2_hmac_cleanup(ctx) gcry_md_close (*ctx);\n\n#define libssh2_crypto_init() gcry_control (GCRYCTL_DISABLE_SECMEM)\n#define libssh2_crypto_exit()\n\n#define libssh2_rsa_ctx struct gcry_sexp\n\n#define _libssh2_rsa_free(rsactx)  gcry_sexp_release (rsactx)\n\n#define libssh2_dsa_ctx struct gcry_sexp\n\n#define _libssh2_dsa_free(dsactx)  gcry_sexp_release (dsactx)\n\n#if LIBSSH2_ECDSA\n#else\n#define _libssh2_ec_key void\n#endif\n\n#define _libssh2_cipher_type(name) int name\n#define _libssh2_cipher_ctx gcry_cipher_hd_t\n\n#define _libssh2_gcry_ciphermode(c,m) ((c << 8) | m)\n#define _libssh2_gcry_cipher(c) (c >> 8)\n#define _libssh2_gcry_mode(m) (m & 0xFF)\n\n#define _libssh2_cipher_aes256ctr \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CTR)\n#define _libssh2_cipher_aes192ctr \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CTR)\n#define _libssh2_cipher_aes128ctr \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CTR)\n#define _libssh2_cipher_aes256 \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CBC)\n#define _libssh2_cipher_aes192 \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CBC)\n#define _libssh2_cipher_aes128 \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CBC)\n#define _libssh2_cipher_blowfish \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_CBC)\n#define _libssh2_cipher_arcfour \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_ARCFOUR, GCRY_CIPHER_MODE_STREAM)\n#define _libssh2_cipher_cast5 \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_CAST5, GCRY_CIPHER_MODE_CBC)\n#define _libssh2_cipher_3des \\\n  _libssh2_gcry_ciphermode(GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_CBC)\n\n\n#define _libssh2_cipher_dtor(ctx) gcry_cipher_close(*(ctx))\n\n#define _libssh2_bn struct gcry_mpi\n#define _libssh2_bn_ctx int\n#define _libssh2_bn_ctx_new() 0\n#define _libssh2_bn_ctx_free(bnctx) ((void)0)\n#define _libssh2_bn_init() gcry_mpi_new(0)\n#define _libssh2_bn_init_from_bin() NULL /* because gcry_mpi_scan() creates a\n                                            new bignum */\n#define _libssh2_bn_set_word(bn, val) gcry_mpi_set_ui(bn, val)\n#define _libssh2_bn_from_bin(bn, len, val)                      \\\n    gcry_mpi_scan(&((bn)), GCRYMPI_FMT_USG, val, len, NULL)\n#define _libssh2_bn_to_bin(bn, val)                                     \\\n    gcry_mpi_print(GCRYMPI_FMT_USG, val, _libssh2_bn_bytes(bn), NULL, bn)\n#define _libssh2_bn_bytes(bn)                                           \\\n    (gcry_mpi_get_nbits (bn) / 8 +                                      \\\n     ((gcry_mpi_get_nbits (bn) % 8 == 0) ? 0 : 1))\n#define _libssh2_bn_bits(bn) gcry_mpi_get_nbits (bn)\n#define _libssh2_bn_free(bn) gcry_mpi_release(bn)\n\n#define _libssh2_dh_ctx struct gcry_mpi *\n#define libssh2_dh_init(dhctx) _libssh2_dh_init(dhctx)\n#define libssh2_dh_key_pair(dhctx, public, g, p, group_order, bnctx) \\\n        _libssh2_dh_key_pair(dhctx, public, g, p, group_order)\n#define libssh2_dh_secret(dhctx, secret, f, p, bnctx) \\\n        _libssh2_dh_secret(dhctx, secret, f, p)\n#define libssh2_dh_dtor(dhctx) _libssh2_dh_dtor(dhctx)\nextern void _libssh2_dh_init(_libssh2_dh_ctx *dhctx);\nextern int _libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public,\n                                _libssh2_bn *g, _libssh2_bn *p,\n                                int group_order);\nextern int _libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret,\n                              _libssh2_bn *f, _libssh2_bn *p);\nextern void _libssh2_dh_dtor(_libssh2_dh_ctx *dhctx);\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/libssh2.pc.in",
    "content": "###########################################################################\n# libssh2 installation details\n###########################################################################\n\nprefix=@CMAKE_INSTALL_PREFIX@\nexec_prefix=${prefix}\nlibdir=${prefix}/@CMAKE_INSTALL_LIBDIR@\nincludedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@\n\nName: @PROJECT_NAME@\nURL: @PROJECT_URL@\nDescription: @PROJECT_DESCRIPTION@\nVersion: @LIBSSH2_VERSION@\nRequires.private: @PC_REQUIRES_PRIVATE@\nLibs: -L${libdir} -lssh2 @PC_LIBS@\nLibs.private: @PC_LIBS@\nCflags: -I${includedir}"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/libssh2_config_cmake.h.in",
    "content": "/* Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n * Copyright (c) 1999-2011 Douglas Gilbert. All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* Headers */\n#cmakedefine HAVE_UNISTD_H\n#cmakedefine HAVE_INTTYPES_H\n#cmakedefine HAVE_STDLIB_H\n#cmakedefine HAVE_SYS_SELECT_H\n#cmakedefine HAVE_SYS_UIO_H\n#cmakedefine HAVE_SYS_SOCKET_H\n#cmakedefine HAVE_SYS_IOCTL_H\n#cmakedefine HAVE_SYS_TIME_H\n#cmakedefine HAVE_SYS_UN_H\n#cmakedefine HAVE_WINDOWS_H\n#cmakedefine HAVE_WS2TCPIP_H\n#cmakedefine HAVE_WINSOCK2_H\n#cmakedefine HAVE_NTDEF_H\n#cmakedefine HAVE_NTSTATUS_H\n\n/* Libraries */\n#cmakedefine HAVE_LIBCRYPT32\n\n/* Types */\n#cmakedefine HAVE_LONGLONG\n\n/* Functions */\n#cmakedefine HAVE_GETTIMEOFDAY\n#cmakedefine HAVE_INET_ADDR\n#cmakedefine HAVE_POLL\n#cmakedefine HAVE_SELECT\n#cmakedefine HAVE_SOCKET\n#cmakedefine HAVE_STRTOLL\n#cmakedefine HAVE_STRTOI64\n#cmakedefine HAVE_SNPRINTF\n\n/* OpenSSL functions */\n#cmakedefine HAVE_EVP_AES_128_CTR\n\n/* Socket non-blocking support */\n#cmakedefine HAVE_O_NONBLOCK\n#cmakedefine HAVE_FIONBIO\n#cmakedefine HAVE_IOCTLSOCKET\n#cmakedefine HAVE_IOCTLSOCKET_CASE\n#cmakedefine HAVE_SO_NONBLOCK\n#cmakedefine HAVE_DISABLED_NONBLOCKING\n\n/* snprintf not in Visual Studio CRT and _snprintf dangerously incompatible.\n   We provide a safe wrapper if snprintf not found */\n#ifndef HAVE_SNPRINTF\n#include <stdio.h>\n#include <stdarg.h>\n/* Want safe, 'n += snprintf(b + n ...)' like function. If cp_max_len is 1\n* then assume cp is pointing to a null char and do nothing. Returns number\n* number of chars placed in cp excluding the trailing null char. So for\n* cp_max_len > 0 the return value is always < cp_max_len; for cp_max_len\n* <= 0 the return value is 0 (and no chars are written to cp). */\nstatic int snprintf(char * cp, int cp_max_len, const char * fmt, ...)\n{\n    va_list args;\n    int n;\n\n    if (cp_max_len < 2)\n        return 0;\n    va_start(args, fmt);\n    n = vsnprintf(cp, cp_max_len, fmt, args);\n    va_end(args);\n    return (n < cp_max_len) ? n : (cp_max_len - 1);\n}\n\n#define HAVE_SNPRINTF\n#endif\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/libssh2_priv.h",
    "content": "/* Copyright (c) 2004-2008, 2010, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2009-2014 by Daniel Stenberg\n * Copyright (c) 2010 Simon Josefsson\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_PRIV_H\n#define LIBSSH2_PRIV_H 1\n\n#define LIBSSH2_LIBRARY\n#include \"libssh2_config.h\"\n\n#ifdef HAVE_WINDOWS_H\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n#include <windows.h>\n#undef WIN32_LEAN_AND_MEAN\n#endif\n\n#ifdef HAVE_WS2TCPIP_H\n#include <ws2tcpip.h>\n#endif\n\n#include <stdio.h>\n#include <time.h>\n\n/* The following CPP block should really only be in session.c and packet.c.\n   However, AIX have #define's for 'events' and 'revents' and we are using\n   those names in libssh2.h, so we need to include the AIX headers first, to\n   make sure all code is compiled with consistent names of these fields.\n   While arguable the best would to change libssh2.h to use other names, that\n   would break backwards compatibility.\n*/\n#ifdef HAVE_POLL\n# include <poll.h>\n#else\n# if defined(HAVE_SELECT) && !defined(WIN32)\n# ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n# else\n# include <sys/time.h>\n# include <sys/types.h>\n# endif\n# endif\n#endif\n\n/* Needed for struct iovec on some platforms */\n#ifdef HAVE_SYS_UIO_H\n#include <sys/uio.h>\n#endif\n\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_SYS_IOCTL_H\n# include <sys/ioctl.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n#include <inttypes.h>\n#endif\n\n#include \"libssh2.h\"\n#include \"libssh2_publickey.h\"\n#include \"libssh2_sftp.h\"\n#include \"misc.h\" /* for the linked list stuff */\n\n#ifndef FALSE\n#define FALSE 0\n#endif\n#ifndef TRUE\n#define TRUE 1\n#endif\n\n#ifdef _MSC_VER\n/* \"inline\" keyword is valid only with C++ engine! */\n#define inline __inline\n#endif\n\n/* Provide iovec / writev on WIN32 platform. */\n#ifdef WIN32\n\nstruct iovec {\n    size_t iov_len;\n    void *iov_base;\n};\n\nstatic inline int writev(int sock, struct iovec *iov, int nvecs)\n{\n    DWORD ret;\n    if(WSASend(sock, (LPWSABUF)iov, nvecs, &ret, 0, NULL, NULL) == 0) {\n        return ret;\n    }\n    return -1;\n}\n\n#endif /* WIN32 */\n\n#ifdef __OS400__\n/* Force parameter type. */\n#define send(s, b, l, f)    send((s), (unsigned char *) (b), (l), (f))\n#endif\n\n#include \"crypto.h\"\n\n#ifdef HAVE_WINSOCK2_H\n\n#include <winsock2.h>\n#include <ws2tcpip.h>\n\n#endif\n\n#ifndef SIZE_MAX\n#if _WIN64\n#define SIZE_MAX 0xFFFFFFFFFFFFFFFF\n#else\n#define SIZE_MAX 0xFFFFFFFF\n#endif\n#endif\n\n#ifndef UINT_MAX\n#define UINT_MAX 0xFFFFFFFF\n#endif\n\n/* RFC4253 section 6.1 Maximum Packet Length says:\n *\n * \"All implementations MUST be able to process packets with\n * uncompressed payload length of 32768 bytes or less and\n * total packet size of 35000 bytes or less (including length,\n * padding length, payload, padding, and MAC.).\"\n */\n#define MAX_SSH_PACKET_LEN 35000\n#define MAX_SHA_DIGEST_LEN SHA512_DIGEST_LENGTH\n\n#define LIBSSH2_ALLOC(session, count) \\\n  session->alloc((count), &(session)->abstract)\n#define LIBSSH2_CALLOC(session, count) _libssh2_calloc(session, count)\n#define LIBSSH2_REALLOC(session, ptr, count) \\\n ((ptr) ? session->realloc((ptr), (count), &(session)->abstract) : \\\n session->alloc((count), &(session)->abstract))\n#define LIBSSH2_FREE(session, ptr) \\\n session->free((ptr), &(session)->abstract)\n#define LIBSSH2_IGNORE(session, data, datalen) \\\n session->ssh_msg_ignore((session), (data), (datalen), &(session)->abstract)\n#define LIBSSH2_DEBUG(session, always_display, message, message_len, \\\n                      language, language_len)    \\\n    session->ssh_msg_debug((session), (always_display), (message), \\\n                           (message_len), (language), (language_len), \\\n                           &(session)->abstract)\n#define LIBSSH2_DISCONNECT(session, reason, message, message_len, \\\n                           language, language_len)                \\\n    session->ssh_msg_disconnect((session), (reason), (message),   \\\n                                (message_len), (language), (language_len), \\\n                                &(session)->abstract)\n\n#define LIBSSH2_MACERROR(session, data, datalen)         \\\n    session->macerror((session), (data), (datalen), &(session)->abstract)\n#define LIBSSH2_X11_OPEN(channel, shost, sport)          \\\n    channel->session->x11(((channel)->session), (channel), \\\n                          (shost), (sport), (&(channel)->session->abstract))\n\n#define LIBSSH2_CHANNEL_CLOSE(session, channel)          \\\n    channel->close_cb((session), &(session)->abstract, \\\n                      (channel), &(channel)->abstract)\n\n#define LIBSSH2_SEND_FD(session, fd, buffer, length, flags) \\\n    (session->send)(fd, buffer, length, flags, &session->abstract)\n#define LIBSSH2_RECV_FD(session, fd, buffer, length, flags) \\\n    (session->recv)(fd, buffer, length, flags, &session->abstract)\n\n#define LIBSSH2_SEND(session, buffer, length, flags)  \\\n    LIBSSH2_SEND_FD(session, session->socket_fd, buffer, length, flags)\n#define LIBSSH2_RECV(session, buffer, length, flags)                    \\\n    LIBSSH2_RECV_FD(session, session->socket_fd, buffer, length, flags)\n\ntypedef struct _LIBSSH2_KEX_METHOD LIBSSH2_KEX_METHOD;\ntypedef struct _LIBSSH2_HOSTKEY_METHOD LIBSSH2_HOSTKEY_METHOD;\ntypedef struct _LIBSSH2_CRYPT_METHOD LIBSSH2_CRYPT_METHOD;\ntypedef struct _LIBSSH2_COMP_METHOD LIBSSH2_COMP_METHOD;\n\ntypedef struct _LIBSSH2_PACKET LIBSSH2_PACKET;\n\ntypedef enum\n{\n    libssh2_NB_state_idle = 0,\n    libssh2_NB_state_allocated,\n    libssh2_NB_state_created,\n    libssh2_NB_state_sent,\n    libssh2_NB_state_sent1,\n    libssh2_NB_state_sent2,\n    libssh2_NB_state_sent3,\n    libssh2_NB_state_sent4,\n    libssh2_NB_state_sent5,\n    libssh2_NB_state_sent6,\n    libssh2_NB_state_sent7,\n    libssh2_NB_state_jump1,\n    libssh2_NB_state_jump2,\n    libssh2_NB_state_jump3,\n    libssh2_NB_state_jump4,\n    libssh2_NB_state_jump5,\n    libssh2_NB_state_end\n} libssh2_nonblocking_states;\n\ntypedef struct packet_require_state_t\n{\n    libssh2_nonblocking_states state;\n    time_t start;\n} packet_require_state_t;\n\ntypedef struct packet_requirev_state_t\n{\n    time_t start;\n} packet_requirev_state_t;\n\ntypedef struct kmdhgGPshakex_state_t\n{\n    libssh2_nonblocking_states state;\n    unsigned char *e_packet;\n    unsigned char *s_packet;\n    unsigned char *tmp;\n    unsigned char h_sig_comp[MAX_SHA_DIGEST_LEN];\n    unsigned char c;\n    size_t e_packet_len;\n    size_t s_packet_len;\n    size_t tmp_len;\n    _libssh2_bn_ctx *ctx;\n    _libssh2_dh_ctx x;\n    _libssh2_bn *e;\n    _libssh2_bn *f;\n    _libssh2_bn *k;\n    unsigned char *f_value;\n    unsigned char *k_value;\n    unsigned char *h_sig;\n    size_t f_value_len;\n    size_t k_value_len;\n    size_t h_sig_len;\n    void *exchange_hash;\n    packet_require_state_t req_state;\n    libssh2_nonblocking_states burn_state;\n} kmdhgGPshakex_state_t;\n\ntypedef struct key_exchange_state_low_t\n{\n    libssh2_nonblocking_states state;\n    packet_require_state_t req_state;\n    kmdhgGPshakex_state_t exchange_state;\n    _libssh2_bn *p;             /* SSH2 defined value (p_value) */\n    _libssh2_bn *g;             /* SSH2 defined value (2) */\n    unsigned char request[256]; /* Must fit EC_MAX_POINT_LEN + data */\n    unsigned char *data;\n    size_t request_len;\n    size_t data_len;\n    _libssh2_ec_key *private_key;   /* SSH2 ecdh private key */\n    unsigned char *public_key_oct;  /* SSH2 ecdh public key octal value */\n    size_t public_key_oct_len;      /* SSH2 ecdh public key octal value\n                                       length */\n    unsigned char *curve25519_public_key; /* curve25519 public key, 32\n                                             bytes */\n    unsigned char *curve25519_private_key; /* curve25519 private key, 32\n                                              bytes */\n} key_exchange_state_low_t;\n\ntypedef struct key_exchange_state_t\n{\n    libssh2_nonblocking_states state;\n    packet_require_state_t req_state;\n    key_exchange_state_low_t key_state_low;\n    unsigned char *data;\n    size_t data_len;\n    unsigned char *oldlocal;\n    size_t oldlocal_len;\n} key_exchange_state_t;\n\n#define FwdNotReq \"Forward not requested\"\n\ntypedef struct packet_queue_listener_state_t\n{\n    libssh2_nonblocking_states state;\n    unsigned char packet[17 + (sizeof(FwdNotReq) - 1)];\n    unsigned char *host;\n    unsigned char *shost;\n    uint32_t sender_channel;\n    uint32_t initial_window_size;\n    uint32_t packet_size;\n    uint32_t port;\n    uint32_t sport;\n    uint32_t host_len;\n    uint32_t shost_len;\n    LIBSSH2_CHANNEL *channel;\n} packet_queue_listener_state_t;\n\n#define X11FwdUnAvil \"X11 Forward Unavailable\"\n\ntypedef struct packet_x11_open_state_t\n{\n    libssh2_nonblocking_states state;\n    unsigned char packet[17 + (sizeof(X11FwdUnAvil) - 1)];\n    unsigned char *shost;\n    uint32_t sender_channel;\n    uint32_t initial_window_size;\n    uint32_t packet_size;\n    uint32_t sport;\n    uint32_t shost_len;\n    LIBSSH2_CHANNEL *channel;\n} packet_x11_open_state_t;\n\nstruct _LIBSSH2_PACKET\n{\n    struct list_node node; /* linked list header */\n\n    /* the raw unencrypted payload */\n    unsigned char *data;\n    size_t data_len;\n\n    /* Where to start reading data from,\n     * used for channel data that's been partially consumed */\n    size_t data_head;\n};\n\ntypedef struct _libssh2_channel_data\n{\n    /* Identifier */\n    uint32_t id;\n\n    /* Limits and restrictions */\n    uint32_t window_size_initial, window_size, packet_size;\n\n    /* Set to 1 when CHANNEL_CLOSE / CHANNEL_EOF sent/received */\n    char close, eof, extended_data_ignore_mode;\n} libssh2_channel_data;\n\nstruct _LIBSSH2_CHANNEL\n{\n    struct list_node node;\n\n    unsigned char *channel_type;\n    unsigned channel_type_len;\n\n    /* channel's program exit status */\n    int exit_status;\n\n    /* channel's program exit signal (without the SIG prefix) */\n    char *exit_signal;\n\n    libssh2_channel_data local, remote;\n    /* Amount of bytes to be refunded to receive window (but not yet sent) */\n    uint32_t adjust_queue;\n    /* Data immediately available for reading */\n    uint32_t read_avail;\n\n    LIBSSH2_SESSION *session;\n\n    void *abstract;\n      LIBSSH2_CHANNEL_CLOSE_FUNC((*close_cb));\n\n    /* State variables used in libssh2_channel_setenv_ex() */\n    libssh2_nonblocking_states setenv_state;\n    unsigned char *setenv_packet;\n    size_t setenv_packet_len;\n    unsigned char setenv_local_channel[4];\n    packet_requirev_state_t setenv_packet_requirev_state;\n\n    /* State variables used in libssh2_channel_request_pty_ex()\n       libssh2_channel_request_pty_size_ex() */\n    libssh2_nonblocking_states reqPTY_state;\n    unsigned char reqPTY_packet[41 + 256];\n    size_t reqPTY_packet_len;\n    unsigned char reqPTY_local_channel[4];\n    packet_requirev_state_t reqPTY_packet_requirev_state;\n\n    /* State variables used in libssh2_channel_x11_req_ex() */\n    libssh2_nonblocking_states reqX11_state;\n    unsigned char *reqX11_packet;\n    size_t reqX11_packet_len;\n    unsigned char reqX11_local_channel[4];\n    packet_requirev_state_t reqX11_packet_requirev_state;\n\n    /* State variables used in libssh2_channel_process_startup() */\n    libssh2_nonblocking_states process_state;\n    unsigned char *process_packet;\n    size_t process_packet_len;\n    unsigned char process_local_channel[4];\n    packet_requirev_state_t process_packet_requirev_state;\n\n    /* State variables used in libssh2_channel_flush_ex() */\n    libssh2_nonblocking_states flush_state;\n    size_t flush_refund_bytes;\n    size_t flush_flush_bytes;\n\n    /* State variables used in libssh2_channel_receive_window_adjust() */\n    libssh2_nonblocking_states adjust_state;\n    unsigned char adjust_adjust[9];     /* packet_type(1) + channel(4) +\n                                           adjustment(4) */\n\n    /* State variables used in libssh2_channel_read_ex() */\n    libssh2_nonblocking_states read_state;\n\n    uint32_t read_local_id;\n\n    /* State variables used in libssh2_channel_write_ex() */\n    libssh2_nonblocking_states write_state;\n    unsigned char write_packet[13];\n    size_t write_packet_len;\n    size_t write_bufwrite;\n\n    /* State variables used in libssh2_channel_close() */\n    libssh2_nonblocking_states close_state;\n    unsigned char close_packet[5];\n\n    /* State variables used in libssh2_channel_wait_closedeof() */\n    libssh2_nonblocking_states wait_eof_state;\n\n    /* State variables used in libssh2_channel_wait_closed() */\n    libssh2_nonblocking_states wait_closed_state;\n\n    /* State variables used in libssh2_channel_free() */\n    libssh2_nonblocking_states free_state;\n\n    /* State variables used in libssh2_channel_handle_extended_data2() */\n    libssh2_nonblocking_states extData2_state;\n\n};\n\nstruct _LIBSSH2_LISTENER\n{\n    struct list_node node; /* linked list header */\n\n    LIBSSH2_SESSION *session;\n\n    char *host;\n    int port;\n\n    /* a list of CHANNELs for this listener */\n    struct list_head queue;\n\n    int queue_size;\n    int queue_maxsize;\n\n    /* State variables used in libssh2_channel_forward_cancel() */\n    libssh2_nonblocking_states chanFwdCncl_state;\n    unsigned char *chanFwdCncl_data;\n    size_t chanFwdCncl_data_len;\n};\n\ntypedef struct _libssh2_endpoint_data\n{\n    unsigned char *banner;\n\n    unsigned char *kexinit;\n    size_t kexinit_len;\n\n    const LIBSSH2_CRYPT_METHOD *crypt;\n    void *crypt_abstract;\n\n    const struct _LIBSSH2_MAC_METHOD *mac;\n    uint32_t seqno;\n    void *mac_abstract;\n\n    const LIBSSH2_COMP_METHOD *comp;\n    void *comp_abstract;\n\n    /* Method Preferences -- NULL yields \"load order\" */\n    char *crypt_prefs;\n    char *mac_prefs;\n    char *comp_prefs;\n    char *lang_prefs;\n} libssh2_endpoint_data;\n\n#define PACKETBUFSIZE (1024*16)\n\nstruct transportpacket\n{\n    /* ------------- for incoming data --------------- */\n    unsigned char buf[PACKETBUFSIZE];\n    unsigned char init[5];  /* first 5 bytes of the incoming data stream,\n                               still encrypted */\n    size_t writeidx;        /* at what array index we do the next write into\n                               the buffer */\n    size_t readidx;         /* at what array index we do the next read from\n                               the buffer */\n    uint32_t packet_length; /* the most recent packet_length as read from the\n                               network data */\n    uint8_t padding_length; /* the most recent padding_length as read from the\n                               network data */\n    size_t data_num;        /* How much of the total package that has been read\n                               so far. */\n    size_t total_num;       /* How much a total package is supposed to be, in\n                               number of bytes. A full package is\n                               packet_length + padding_length + 4 +\n                               mac_length. */\n    unsigned char *payload; /* this is a pointer to a LIBSSH2_ALLOC()\n                               area to which we write decrypted data */\n    unsigned char *wptr;    /* write pointer into the payload to where we\n                               are currently writing decrypted data */\n\n    /* ------------- for outgoing data --------------- */\n    unsigned char outbuf[MAX_SSH_PACKET_LEN]; /* area for the outgoing data */\n\n    int ototal_num;         /* size of outbuf in number of bytes */\n    const unsigned char *odata; /* original pointer to the data */\n    size_t olen;            /* original size of the data we stored in\n                               outbuf */\n    size_t osent;           /* number of bytes already sent */\n};\n\nstruct _LIBSSH2_PUBLICKEY\n{\n    LIBSSH2_CHANNEL *channel;\n    uint32_t version;\n\n    /* State variables used in libssh2_publickey_packet_receive() */\n    libssh2_nonblocking_states receive_state;\n    unsigned char *receive_packet;\n    size_t receive_packet_len;\n\n    /* State variables used in libssh2_publickey_add_ex() */\n    libssh2_nonblocking_states add_state;\n    unsigned char *add_packet;\n    unsigned char *add_s;\n\n    /* State variables used in libssh2_publickey_remove_ex() */\n    libssh2_nonblocking_states remove_state;\n    unsigned char *remove_packet;\n    unsigned char *remove_s;\n\n    /* State variables used in libssh2_publickey_list_fetch() */\n    libssh2_nonblocking_states listFetch_state;\n    unsigned char *listFetch_s;\n    unsigned char listFetch_buffer[12];\n    unsigned char *listFetch_data;\n    size_t listFetch_data_len;\n};\n\n#define LIBSSH2_SCP_RESPONSE_BUFLEN     256\n\nstruct flags {\n    int sigpipe;  /* LIBSSH2_FLAG_SIGPIPE */\n    int compress; /* LIBSSH2_FLAG_COMPRESS */\n};\n\nstruct _LIBSSH2_SESSION\n{\n    /* Memory management callbacks */\n    void *abstract;\n      LIBSSH2_ALLOC_FUNC((*alloc));\n      LIBSSH2_REALLOC_FUNC((*realloc));\n      LIBSSH2_FREE_FUNC((*free));\n\n    /* Other callbacks */\n      LIBSSH2_IGNORE_FUNC((*ssh_msg_ignore));\n      LIBSSH2_DEBUG_FUNC((*ssh_msg_debug));\n      LIBSSH2_DISCONNECT_FUNC((*ssh_msg_disconnect));\n      LIBSSH2_MACERROR_FUNC((*macerror));\n      LIBSSH2_X11_OPEN_FUNC((*x11));\n      LIBSSH2_SEND_FUNC((*send));\n      LIBSSH2_RECV_FUNC((*recv));\n\n    /* Method preferences -- NULL yields \"load order\" */\n    char *kex_prefs;\n    char *hostkey_prefs;\n\n    int state;\n\n    /* Flag options */\n    struct flags flag;\n\n    /* Agreed Key Exchange Method */\n    const LIBSSH2_KEX_METHOD *kex;\n    unsigned int burn_optimistic_kexinit:1;\n\n    unsigned char *session_id;\n    uint32_t session_id_len;\n\n    /* this is set to TRUE if a blocking API behavior is requested */\n    int api_block_mode;\n\n    /* Timeout used when blocking API behavior is active */\n    long api_timeout;\n\n    /* Server's public key */\n    const LIBSSH2_HOSTKEY_METHOD *hostkey;\n    void *server_hostkey_abstract;\n\n    /* Either set with libssh2_session_hostkey() (for server mode)\n     * Or read from server in (eg) KEXDH_INIT (for client mode)\n     */\n    unsigned char *server_hostkey;\n    uint32_t server_hostkey_len;\n#if LIBSSH2_MD5\n    unsigned char server_hostkey_md5[MD5_DIGEST_LENGTH];\n    int server_hostkey_md5_valid;\n#endif                          /* ! LIBSSH2_MD5 */\n    unsigned char server_hostkey_sha1[SHA_DIGEST_LENGTH];\n    int server_hostkey_sha1_valid;\n\n    unsigned char server_hostkey_sha256[SHA256_DIGEST_LENGTH];\n    int server_hostkey_sha256_valid;\n\n    /* (remote as source of data -- packet_read ) */\n    libssh2_endpoint_data remote;\n\n    /* (local as source of data -- packet_write ) */\n    libssh2_endpoint_data local;\n\n    /* Inbound Data linked list -- Sometimes the packet that comes in isn't the\n       packet we're ready for */\n    struct list_head packets;\n\n    /* Active connection channels */\n    struct list_head channels;\n\n    uint32_t next_channel;\n\n    struct list_head listeners; /* list of LIBSSH2_LISTENER structs */\n\n    /* Actual I/O socket */\n    libssh2_socket_t socket_fd;\n    int socket_state;\n    int socket_block_directions;\n    int socket_prev_blockstate; /* stores the state of the socket blockiness\n                                   when libssh2_session_startup() is called */\n\n    /* Error tracking */\n    const char *err_msg;\n    int err_code;\n    int err_flags;\n\n    /* struct members for packet-level reading */\n    struct transportpacket packet;\n#ifdef LIBSSH2DEBUG\n    int showmask;               /* what debug/trace messages to display */\n    libssh2_trace_handler_func tracehandler; /* callback to display trace\n                                                messages */\n    void *tracehandler_context; /* context for the trace handler */\n#endif\n\n    /* State variables used in libssh2_banner_send() */\n    libssh2_nonblocking_states banner_TxRx_state;\n    char banner_TxRx_banner[256];\n    ssize_t banner_TxRx_total_send;\n\n    /* State variables used in libssh2_kexinit() */\n    libssh2_nonblocking_states kexinit_state;\n    unsigned char *kexinit_data;\n    size_t kexinit_data_len;\n\n    /* State variables used in libssh2_session_startup() */\n    libssh2_nonblocking_states startup_state;\n    unsigned char *startup_data;\n    size_t startup_data_len;\n    unsigned char startup_service[sizeof(\"ssh-userauth\") + 5 - 1];\n    size_t startup_service_length;\n    packet_require_state_t startup_req_state;\n    key_exchange_state_t startup_key_state;\n\n    /* State variables used in libssh2_session_free() */\n    libssh2_nonblocking_states free_state;\n\n    /* State variables used in libssh2_session_disconnect_ex() */\n    libssh2_nonblocking_states disconnect_state;\n    unsigned char disconnect_data[256 + 13];\n    size_t disconnect_data_len;\n\n    /* State variables used in libssh2_packet_read() */\n    libssh2_nonblocking_states readPack_state;\n    int readPack_encrypted;\n\n    /* State variables used in libssh2_userauth_list() */\n    libssh2_nonblocking_states userauth_list_state;\n    unsigned char *userauth_list_data;\n    size_t userauth_list_data_len;\n    packet_requirev_state_t userauth_list_packet_requirev_state;\n\n    /* State variables used in libssh2_userauth_password_ex() */\n    libssh2_nonblocking_states userauth_pswd_state;\n    unsigned char *userauth_pswd_data;\n    unsigned char userauth_pswd_data0;\n    size_t userauth_pswd_data_len;\n    char *userauth_pswd_newpw;\n    int userauth_pswd_newpw_len;\n    packet_requirev_state_t userauth_pswd_packet_requirev_state;\n\n    /* State variables used in libssh2_userauth_hostbased_fromfile_ex() */\n    libssh2_nonblocking_states userauth_host_state;\n    unsigned char *userauth_host_data;\n    size_t userauth_host_data_len;\n    unsigned char *userauth_host_packet;\n    size_t userauth_host_packet_len;\n    unsigned char *userauth_host_method;\n    size_t userauth_host_method_len;\n    unsigned char *userauth_host_s;\n    packet_requirev_state_t userauth_host_packet_requirev_state;\n\n    /* State variables used in libssh2_userauth_publickey_fromfile_ex() */\n    libssh2_nonblocking_states userauth_pblc_state;\n    unsigned char *userauth_pblc_data;\n    size_t userauth_pblc_data_len;\n    unsigned char *userauth_pblc_packet;\n    size_t userauth_pblc_packet_len;\n    unsigned char *userauth_pblc_method;\n    size_t userauth_pblc_method_len;\n    unsigned char *userauth_pblc_s;\n    unsigned char *userauth_pblc_b;\n    packet_requirev_state_t userauth_pblc_packet_requirev_state;\n\n    /* State variables used in libssh2_userauth_keyboard_interactive_ex() */\n    libssh2_nonblocking_states userauth_kybd_state;\n    unsigned char *userauth_kybd_data;\n    size_t userauth_kybd_data_len;\n    unsigned char *userauth_kybd_packet;\n    size_t userauth_kybd_packet_len;\n    unsigned int userauth_kybd_auth_name_len;\n    char *userauth_kybd_auth_name;\n    unsigned userauth_kybd_auth_instruction_len;\n    char *userauth_kybd_auth_instruction;\n    unsigned int userauth_kybd_num_prompts;\n    int userauth_kybd_auth_failure;\n    LIBSSH2_USERAUTH_KBDINT_PROMPT *userauth_kybd_prompts;\n    LIBSSH2_USERAUTH_KBDINT_RESPONSE *userauth_kybd_responses;\n    packet_requirev_state_t userauth_kybd_packet_requirev_state;\n\n    /* State variables used in libssh2_channel_open_ex() */\n    libssh2_nonblocking_states open_state;\n    packet_requirev_state_t open_packet_requirev_state;\n    LIBSSH2_CHANNEL *open_channel;\n    unsigned char *open_packet;\n    size_t open_packet_len;\n    unsigned char *open_data;\n    size_t open_data_len;\n    uint32_t open_local_channel;\n\n    /* State variables used in libssh2_channel_direct_tcpip_ex() */\n    libssh2_nonblocking_states direct_state;\n    unsigned char *direct_message;\n    size_t direct_host_len;\n    size_t direct_shost_len;\n    size_t direct_message_len;\n\n    /* State variables used in libssh2_channel_forward_listen_ex() */\n    libssh2_nonblocking_states fwdLstn_state;\n    unsigned char *fwdLstn_packet;\n    uint32_t fwdLstn_host_len;\n    uint32_t fwdLstn_packet_len;\n    packet_requirev_state_t fwdLstn_packet_requirev_state;\n\n    /* State variables used in libssh2_publickey_init() */\n    libssh2_nonblocking_states pkeyInit_state;\n    LIBSSH2_PUBLICKEY *pkeyInit_pkey;\n    LIBSSH2_CHANNEL *pkeyInit_channel;\n    unsigned char *pkeyInit_data;\n    size_t pkeyInit_data_len;\n    /* 19 = packet_len(4) + version_len(4) + \"version\"(7) + version_num(4) */\n    unsigned char pkeyInit_buffer[19];\n    size_t pkeyInit_buffer_sent; /* how much of buffer that has been sent */\n\n    /* State variables used in libssh2_packet_add() */\n    libssh2_nonblocking_states packAdd_state;\n    LIBSSH2_CHANNEL *packAdd_channelp; /* keeper of the channel during EAGAIN\n                                          states */\n    packet_queue_listener_state_t packAdd_Qlstn_state;\n    packet_x11_open_state_t packAdd_x11open_state;\n\n    /* State variables used in fullpacket() */\n    libssh2_nonblocking_states fullpacket_state;\n    int fullpacket_macstate;\n    size_t fullpacket_payload_len;\n    int fullpacket_packet_type;\n\n    /* State variables used in libssh2_sftp_init() */\n    libssh2_nonblocking_states sftpInit_state;\n    LIBSSH2_SFTP *sftpInit_sftp;\n    LIBSSH2_CHANNEL *sftpInit_channel;\n    unsigned char sftpInit_buffer[9];   /* sftp_header(5){excludes request_id}\n                                           + version_id(4) */\n    int sftpInit_sent; /* number of bytes from the buffer that have been\n                          sent */\n\n    /* State variables used in libssh2_scp_recv() / libssh_scp_recv2() */\n    libssh2_nonblocking_states scpRecv_state;\n    unsigned char *scpRecv_command;\n    size_t scpRecv_command_len;\n    unsigned char scpRecv_response[LIBSSH2_SCP_RESPONSE_BUFLEN];\n    size_t scpRecv_response_len;\n    long scpRecv_mode;\n#if defined(HAVE_LONGLONG) && defined(HAVE_STRTOLL)\n    /* we have the type and we can parse such numbers */\n    long long scpRecv_size;\n#define scpsize_strtol strtoll\n#elif defined(HAVE_STRTOI64)\n    __int64 scpRecv_size;\n#define scpsize_strtol _strtoi64\n#else\n    long scpRecv_size;\n#define scpsize_strtol strtol\n#endif\n    long scpRecv_mtime;\n    long scpRecv_atime;\n    LIBSSH2_CHANNEL *scpRecv_channel;\n\n    /* State variables used in libssh2_scp_send_ex() */\n    libssh2_nonblocking_states scpSend_state;\n    unsigned char *scpSend_command;\n    size_t scpSend_command_len;\n    unsigned char scpSend_response[LIBSSH2_SCP_RESPONSE_BUFLEN];\n    size_t scpSend_response_len;\n    LIBSSH2_CHANNEL *scpSend_channel;\n\n    /* Keepalive variables used by keepalive.c. */\n    int keepalive_interval;\n    int keepalive_want_reply;\n    time_t keepalive_last_sent;\n};\n\n/* session.state bits */\n#define LIBSSH2_STATE_EXCHANGING_KEYS   0x00000001\n#define LIBSSH2_STATE_NEWKEYS           0x00000002\n#define LIBSSH2_STATE_AUTHENTICATED     0x00000004\n#define LIBSSH2_STATE_KEX_ACTIVE        0x00000008\n\n/* session.flag helpers */\n#ifdef MSG_NOSIGNAL\n#define LIBSSH2_SOCKET_SEND_FLAGS(session)              \\\n    (((session)->flag.sigpipe) ? 0 : MSG_NOSIGNAL)\n#define LIBSSH2_SOCKET_RECV_FLAGS(session)              \\\n    (((session)->flag.sigpipe) ? 0 : MSG_NOSIGNAL)\n#else\n/* If MSG_NOSIGNAL isn't defined we're SOL on blocking SIGPIPE */\n#define LIBSSH2_SOCKET_SEND_FLAGS(session)      0\n#define LIBSSH2_SOCKET_RECV_FLAGS(session)      0\n#endif\n\n/* --------- */\n\n/* libssh2 extensible ssh api, ultimately I'd like to allow loading additional\n   methods via .so/.dll */\n\nstruct _LIBSSH2_KEX_METHOD\n{\n    const char *name;\n\n    /* Key exchange, populates session->* and returns 0 on success, non-0 on\n       error */\n    int (*exchange_keys) (LIBSSH2_SESSION * session,\n                          key_exchange_state_low_t * key_state);\n\n    long flags;\n};\n\nstruct _LIBSSH2_HOSTKEY_METHOD\n{\n    const char *name;\n    unsigned long hash_len;\n\n    int (*init) (LIBSSH2_SESSION * session, const unsigned char *hostkey_data,\n                 size_t hostkey_data_len, void **abstract);\n    int (*initPEM) (LIBSSH2_SESSION * session, const char *privkeyfile,\n                    unsigned const char *passphrase, void **abstract);\n    int (*initPEMFromMemory) (LIBSSH2_SESSION * session,\n                              const char *privkeyfiledata,\n                              size_t privkeyfiledata_len,\n                              unsigned const char *passphrase,\n                              void **abstract);\n    int (*sig_verify) (LIBSSH2_SESSION * session, const unsigned char *sig,\n                       size_t sig_len, const unsigned char *m,\n                       size_t m_len, void **abstract);\n    int (*signv) (LIBSSH2_SESSION * session, unsigned char **signature,\n                  size_t *signature_len, int veccount,\n                  const struct iovec datavec[], void **abstract);\n    int (*encrypt) (LIBSSH2_SESSION * session, unsigned char **dst,\n                    size_t *dst_len, const unsigned char *src,\n                    size_t src_len, void **abstract);\n    int (*dtor) (LIBSSH2_SESSION * session, void **abstract);\n};\n\nstruct _LIBSSH2_CRYPT_METHOD\n{\n    const char *name;\n    const char *pem_annotation;\n\n    int blocksize;\n\n    /* iv and key sizes (-1 for variable length) */\n    int iv_len;\n    int secret_len;\n\n    long flags;\n\n    int (*init) (LIBSSH2_SESSION * session,\n                 const LIBSSH2_CRYPT_METHOD * method, unsigned char *iv,\n                 int *free_iv, unsigned char *secret, int *free_secret,\n                 int encrypt, void **abstract);\n    int (*crypt) (LIBSSH2_SESSION * session, unsigned char *block,\n                  size_t blocksize, void **abstract);\n    int (*dtor) (LIBSSH2_SESSION * session, void **abstract);\n\n      _libssh2_cipher_type(algo);\n};\n\nstruct _LIBSSH2_COMP_METHOD\n{\n    const char *name;\n    int compress; /* 1 if it does compress, 0 if it doesn't */\n    int use_in_auth; /* 1 if compression should be used in userauth */\n    int (*init) (LIBSSH2_SESSION *session, int compress, void **abstract);\n    int (*comp) (LIBSSH2_SESSION *session,\n                 unsigned char *dest,\n                 size_t *dest_len,\n                 const unsigned char *src,\n                 size_t src_len,\n                 void **abstract);\n    int (*decomp) (LIBSSH2_SESSION *session,\n                   unsigned char **dest,\n                   size_t *dest_len,\n                   size_t payload_limit,\n                   const unsigned char *src,\n                   size_t src_len,\n                   void **abstract);\n    int (*dtor) (LIBSSH2_SESSION * session, int compress, void **abstract);\n};\n\n#ifdef LIBSSH2DEBUG\nvoid _libssh2_debug(LIBSSH2_SESSION * session, int context, const char *format,\n                    ...);\n#else\n#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) ||     \\\n    defined(__GNUC__)\n/* C99 supported and also by older GCC */\n#define _libssh2_debug(x,y,z,...) do {} while (0)\n#else\n/* no gcc and not C99, do static and hopefully inline */\nstatic inline void\n_libssh2_debug(LIBSSH2_SESSION * session, int context, const char *format, ...)\n{\n    (void)session;\n    (void)context;\n    (void)format;\n}\n#endif\n#endif\n\n#define LIBSSH2_SOCKET_UNKNOWN                   1\n#define LIBSSH2_SOCKET_CONNECTED                 0\n#define LIBSSH2_SOCKET_DISCONNECTED             -1\n\n/* Initial packet state, prior to MAC check */\n#define LIBSSH2_MAC_UNCONFIRMED                  1\n/* When MAC type is \"none\" (proto initiation phase) all packets are deemed\n   \"confirmed\" */\n#define LIBSSH2_MAC_CONFIRMED                    0\n/* Something very bad is going on */\n#define LIBSSH2_MAC_INVALID                     -1\n\n/* Flags for _libssh2_error_flags */\n/* Error message is allocated on the heap */\n#define LIBSSH2_ERR_FLAG_DUP                     1\n\n/* SSH Packet Types -- Defined by internet draft */\n/* Transport Layer */\n#define SSH_MSG_DISCONNECT                          1\n#define SSH_MSG_IGNORE                              2\n#define SSH_MSG_UNIMPLEMENTED                       3\n#define SSH_MSG_DEBUG                               4\n#define SSH_MSG_SERVICE_REQUEST                     5\n#define SSH_MSG_SERVICE_ACCEPT                      6\n\n#define SSH_MSG_KEXINIT                             20\n#define SSH_MSG_NEWKEYS                             21\n\n/* diffie-hellman-group1-sha1 */\n#define SSH_MSG_KEXDH_INIT                          30\n#define SSH_MSG_KEXDH_REPLY                         31\n\n/* diffie-hellman-group-exchange-sha1 and\n   diffie-hellman-group-exchange-sha256 */\n#define SSH_MSG_KEX_DH_GEX_REQUEST_OLD              30\n#define SSH_MSG_KEX_DH_GEX_REQUEST                  34\n#define SSH_MSG_KEX_DH_GEX_GROUP                    31\n#define SSH_MSG_KEX_DH_GEX_INIT                     32\n#define SSH_MSG_KEX_DH_GEX_REPLY                    33\n\n/* ecdh */\n#define SSH2_MSG_KEX_ECDH_INIT                      30\n#define SSH2_MSG_KEX_ECDH_REPLY                     31\n\n/* User Authentication */\n#define SSH_MSG_USERAUTH_REQUEST                    50\n#define SSH_MSG_USERAUTH_FAILURE                    51\n#define SSH_MSG_USERAUTH_SUCCESS                    52\n#define SSH_MSG_USERAUTH_BANNER                     53\n\n/* \"public key\" method */\n#define SSH_MSG_USERAUTH_PK_OK                      60\n/* \"password\" method */\n#define SSH_MSG_USERAUTH_PASSWD_CHANGEREQ           60\n/* \"keyboard-interactive\" method */\n#define SSH_MSG_USERAUTH_INFO_REQUEST               60\n#define SSH_MSG_USERAUTH_INFO_RESPONSE              61\n\n/* Channels */\n#define SSH_MSG_GLOBAL_REQUEST                      80\n#define SSH_MSG_REQUEST_SUCCESS                     81\n#define SSH_MSG_REQUEST_FAILURE                     82\n\n#define SSH_MSG_CHANNEL_OPEN                        90\n#define SSH_MSG_CHANNEL_OPEN_CONFIRMATION           91\n#define SSH_MSG_CHANNEL_OPEN_FAILURE                92\n#define SSH_MSG_CHANNEL_WINDOW_ADJUST               93\n#define SSH_MSG_CHANNEL_DATA                        94\n#define SSH_MSG_CHANNEL_EXTENDED_DATA               95\n#define SSH_MSG_CHANNEL_EOF                         96\n#define SSH_MSG_CHANNEL_CLOSE                       97\n#define SSH_MSG_CHANNEL_REQUEST                     98\n#define SSH_MSG_CHANNEL_SUCCESS                     99\n#define SSH_MSG_CHANNEL_FAILURE                     100\n\n/* Error codes returned in SSH_MSG_CHANNEL_OPEN_FAILURE message\n   (see RFC4254) */\n#define SSH_OPEN_ADMINISTRATIVELY_PROHIBITED 1\n#define SSH_OPEN_CONNECT_FAILED              2\n#define SSH_OPEN_UNKNOWN_CHANNELTYPE         3\n#define SSH_OPEN_RESOURCE_SHORTAGE           4\n\nssize_t _libssh2_recv(libssh2_socket_t socket, void *buffer,\n                      size_t length, int flags, void **abstract);\nssize_t _libssh2_send(libssh2_socket_t socket, const void *buffer,\n                      size_t length, int flags, void **abstract);\n\n#define LIBSSH2_READ_TIMEOUT 60 /* generic timeout in seconds used when\n                                   waiting for more data to arrive */\n\n\nint _libssh2_kex_exchange(LIBSSH2_SESSION * session, int reexchange,\n                          key_exchange_state_t * state);\n\n/* Let crypt.c/hostkey.c expose their method structs */\nconst LIBSSH2_CRYPT_METHOD **libssh2_crypt_methods(void);\nconst LIBSSH2_HOSTKEY_METHOD **libssh2_hostkey_methods(void);\n\n/* misc.c */\nint _libssh2_bcrypt_pbkdf(const char *pass,\n                          size_t passlen,\n                          const uint8_t *salt,\n                          size_t saltlen,\n                          uint8_t *key,\n                          size_t keylen,\n                          unsigned int rounds);\n\n/* pem.c */\nint _libssh2_pem_parse(LIBSSH2_SESSION * session,\n                       const char *headerbegin,\n                       const char *headerend,\n                       const unsigned char *passphrase,\n                       FILE * fp, unsigned char **data, unsigned int *datalen);\nint _libssh2_pem_parse_memory(LIBSSH2_SESSION * session,\n                              const char *headerbegin,\n                              const char *headerend,\n                              const char *filedata, size_t filedata_len,\n                              unsigned char **data, unsigned int *datalen);\n /* OpenSSL keys */\nint\n_libssh2_openssh_pem_parse(LIBSSH2_SESSION * session,\n                           const unsigned char *passphrase,\n                           FILE * fp, struct string_buf **decrypted_buf);\nint\n_libssh2_openssh_pem_parse_memory(LIBSSH2_SESSION * session,\n                                  const unsigned char *passphrase,\n                                  const char *filedata, size_t filedata_len,\n                                  struct string_buf **decrypted_buf);\n\nint _libssh2_pem_decode_sequence(unsigned char **data, unsigned int *datalen);\nint _libssh2_pem_decode_integer(unsigned char **data, unsigned int *datalen,\n                                unsigned char **i, unsigned int *ilen);\n\n/* global.c */\nvoid _libssh2_init_if_needed(void);\n\n\n#define ARRAY_SIZE(a) (sizeof ((a)) / sizeof ((a)[0]))\n\n/* define to output the libssh2_int64_t type in a *printf() */\n#if defined(__BORLANDC__) || defined(_MSC_VER) || defined(__MINGW32__)\n#define LIBSSH2_INT64_T_FORMAT \"I64d\"\n#else\n#define LIBSSH2_INT64_T_FORMAT \"lld\"\n#endif\n\n/* In Windows the default file mode is text but an application can override it.\nTherefore we specify it explicitly. https://github.com/curl/curl/pull/258\n*/\n#if defined(WIN32) || defined(MSDOS)\n#define FOPEN_READTEXT \"rt\"\n#define FOPEN_WRITETEXT \"wt\"\n#define FOPEN_APPENDTEXT \"at\"\n#elif defined(__CYGWIN__)\n/* Cygwin has specific behavior we need to address when WIN32 is not defined.\nhttps://cygwin.com/cygwin-ug-net/using-textbinary.html\nFor write we want our output to have line endings of LF and be compatible with\nother Cygwin utilities. For read we want to handle input that may have line\nendings either CRLF or LF so 't' is appropriate.\n*/\n#define FOPEN_READTEXT \"rt\"\n#define FOPEN_WRITETEXT \"w\"\n#define FOPEN_APPENDTEXT \"a\"\n#else\n#define FOPEN_READTEXT \"r\"\n#define FOPEN_WRITETEXT \"w\"\n#define FOPEN_APPENDTEXT \"a\"\n#endif\n\n#endif /* LIBSSH2_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/mac.c",
    "content": "/* Copyright (c) 2004-2007, Sara Golemon <sarag@libssh2.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include \"mac.h\"\n\n#ifdef LIBSSH2_MAC_NONE\n/* mac_none_MAC\n * Minimalist MAC: No MAC\n */\nstatic int\nmac_none_MAC(LIBSSH2_SESSION * session, unsigned char *buf,\n             uint32_t seqno, const unsigned char *packet,\n             uint32_t packet_len, const unsigned char *addtl,\n             uint32_t addtl_len, void **abstract)\n{\n    return 0;\n}\n\n\n\n\nstatic LIBSSH2_MAC_METHOD mac_method_none = {\n    \"none\",\n    0,\n    0,\n    NULL,\n    mac_none_MAC,\n    NULL\n};\n#endif /* LIBSSH2_MAC_NONE */\n\n/* mac_method_common_init\n * Initialize simple mac methods\n */\nstatic int\nmac_method_common_init(LIBSSH2_SESSION * session, unsigned char *key,\n                       int *free_key, void **abstract)\n{\n    *abstract = key;\n    *free_key = 0;\n    (void) session;\n\n    return 0;\n}\n\n\n\n/* mac_method_common_dtor\n * Cleanup simple mac methods\n */\nstatic int\nmac_method_common_dtor(LIBSSH2_SESSION * session, void **abstract)\n{\n    if(*abstract) {\n        LIBSSH2_FREE(session, *abstract);\n    }\n    *abstract = NULL;\n\n    return 0;\n}\n\n\n\n#if LIBSSH2_HMAC_SHA512\n/* mac_method_hmac_sha512_hash\n * Calculate hash using full sha512 value\n */\nstatic int\nmac_method_hmac_sha2_512_hash(LIBSSH2_SESSION * session,\n                          unsigned char *buf, uint32_t seqno,\n                          const unsigned char *packet,\n                          uint32_t packet_len,\n                          const unsigned char *addtl,\n                          uint32_t addtl_len, void **abstract)\n{\n    libssh2_hmac_ctx ctx;\n    unsigned char seqno_buf[4];\n    (void) session;\n\n    _libssh2_htonu32(seqno_buf, seqno);\n\n    libssh2_hmac_ctx_init(ctx);\n    libssh2_hmac_sha512_init(&ctx, *abstract, 64);\n    libssh2_hmac_update(ctx, seqno_buf, 4);\n    libssh2_hmac_update(ctx, packet, packet_len);\n    if(addtl && addtl_len) {\n        libssh2_hmac_update(ctx, addtl, addtl_len);\n    }\n    libssh2_hmac_final(ctx, buf);\n    libssh2_hmac_cleanup(&ctx);\n\n    return 0;\n}\n\n\n\nstatic const LIBSSH2_MAC_METHOD mac_method_hmac_sha2_512 = {\n    \"hmac-sha2-512\",\n    64,\n    64,\n    mac_method_common_init,\n    mac_method_hmac_sha2_512_hash,\n    mac_method_common_dtor,\n};\n#endif\n\n\n\n#if LIBSSH2_HMAC_SHA256\n/* mac_method_hmac_sha256_hash\n * Calculate hash using full sha256 value\n */\nstatic int\nmac_method_hmac_sha2_256_hash(LIBSSH2_SESSION * session,\n                          unsigned char *buf, uint32_t seqno,\n                          const unsigned char *packet,\n                          uint32_t packet_len,\n                          const unsigned char *addtl,\n                          uint32_t addtl_len, void **abstract)\n{\n    libssh2_hmac_ctx ctx;\n    unsigned char seqno_buf[4];\n    (void) session;\n\n    _libssh2_htonu32(seqno_buf, seqno);\n\n    libssh2_hmac_ctx_init(ctx);\n    libssh2_hmac_sha256_init(&ctx, *abstract, 32);\n    libssh2_hmac_update(ctx, seqno_buf, 4);\n    libssh2_hmac_update(ctx, packet, packet_len);\n    if(addtl && addtl_len) {\n        libssh2_hmac_update(ctx, addtl, addtl_len);\n    }\n    libssh2_hmac_final(ctx, buf);\n    libssh2_hmac_cleanup(&ctx);\n\n    return 0;\n}\n\n\n\nstatic const LIBSSH2_MAC_METHOD mac_method_hmac_sha2_256 = {\n    \"hmac-sha2-256\",\n    32,\n    32,\n    mac_method_common_init,\n    mac_method_hmac_sha2_256_hash,\n    mac_method_common_dtor,\n};\n#endif\n\n\n\n\n/* mac_method_hmac_sha1_hash\n * Calculate hash using full sha1 value\n */\nstatic int\nmac_method_hmac_sha1_hash(LIBSSH2_SESSION * session,\n                          unsigned char *buf, uint32_t seqno,\n                          const unsigned char *packet,\n                          uint32_t packet_len,\n                          const unsigned char *addtl,\n                          uint32_t addtl_len, void **abstract)\n{\n    libssh2_hmac_ctx ctx;\n    unsigned char seqno_buf[4];\n    (void) session;\n\n    _libssh2_htonu32(seqno_buf, seqno);\n\n    libssh2_hmac_ctx_init(ctx);\n    libssh2_hmac_sha1_init(&ctx, *abstract, 20);\n    libssh2_hmac_update(ctx, seqno_buf, 4);\n    libssh2_hmac_update(ctx, packet, packet_len);\n    if(addtl && addtl_len) {\n        libssh2_hmac_update(ctx, addtl, addtl_len);\n    }\n    libssh2_hmac_final(ctx, buf);\n    libssh2_hmac_cleanup(&ctx);\n\n    return 0;\n}\n\n\n\nstatic const LIBSSH2_MAC_METHOD mac_method_hmac_sha1 = {\n    \"hmac-sha1\",\n    20,\n    20,\n    mac_method_common_init,\n    mac_method_hmac_sha1_hash,\n    mac_method_common_dtor,\n};\n\n/* mac_method_hmac_sha1_96_hash\n * Calculate hash using first 96 bits of sha1 value\n */\nstatic int\nmac_method_hmac_sha1_96_hash(LIBSSH2_SESSION * session,\n                             unsigned char *buf, uint32_t seqno,\n                             const unsigned char *packet,\n                             uint32_t packet_len,\n                             const unsigned char *addtl,\n                             uint32_t addtl_len, void **abstract)\n{\n    unsigned char temp[SHA_DIGEST_LENGTH];\n\n    mac_method_hmac_sha1_hash(session, temp, seqno, packet, packet_len,\n                              addtl, addtl_len, abstract);\n    memcpy(buf, (char *) temp, 96 / 8);\n\n    return 0;\n}\n\n\n\nstatic const LIBSSH2_MAC_METHOD mac_method_hmac_sha1_96 = {\n    \"hmac-sha1-96\",\n    12,\n    20,\n    mac_method_common_init,\n    mac_method_hmac_sha1_96_hash,\n    mac_method_common_dtor,\n};\n\n#if LIBSSH2_MD5\n/* mac_method_hmac_md5_hash\n * Calculate hash using full md5 value\n */\nstatic int\nmac_method_hmac_md5_hash(LIBSSH2_SESSION * session, unsigned char *buf,\n                         uint32_t seqno,\n                         const unsigned char *packet,\n                         uint32_t packet_len,\n                         const unsigned char *addtl,\n                         uint32_t addtl_len, void **abstract)\n{\n    libssh2_hmac_ctx ctx;\n    unsigned char seqno_buf[4];\n    (void) session;\n\n    _libssh2_htonu32(seqno_buf, seqno);\n\n    libssh2_hmac_ctx_init(ctx);\n    libssh2_hmac_md5_init(&ctx, *abstract, 16);\n    libssh2_hmac_update(ctx, seqno_buf, 4);\n    libssh2_hmac_update(ctx, packet, packet_len);\n    if(addtl && addtl_len) {\n        libssh2_hmac_update(ctx, addtl, addtl_len);\n    }\n    libssh2_hmac_final(ctx, buf);\n    libssh2_hmac_cleanup(&ctx);\n\n    return 0;\n}\n\n\n\nstatic const LIBSSH2_MAC_METHOD mac_method_hmac_md5 = {\n    \"hmac-md5\",\n    16,\n    16,\n    mac_method_common_init,\n    mac_method_hmac_md5_hash,\n    mac_method_common_dtor,\n};\n\n/* mac_method_hmac_md5_96_hash\n * Calculate hash using first 96 bits of md5 value\n */\nstatic int\nmac_method_hmac_md5_96_hash(LIBSSH2_SESSION * session,\n                            unsigned char *buf, uint32_t seqno,\n                            const unsigned char *packet,\n                            uint32_t packet_len,\n                            const unsigned char *addtl,\n                            uint32_t addtl_len, void **abstract)\n{\n    unsigned char temp[MD5_DIGEST_LENGTH];\n    mac_method_hmac_md5_hash(session, temp, seqno, packet, packet_len,\n                             addtl, addtl_len, abstract);\n    memcpy(buf, (char *) temp, 96 / 8);\n    return 0;\n}\n\n\n\nstatic const LIBSSH2_MAC_METHOD mac_method_hmac_md5_96 = {\n    \"hmac-md5-96\",\n    12,\n    16,\n    mac_method_common_init,\n    mac_method_hmac_md5_96_hash,\n    mac_method_common_dtor,\n};\n#endif /* LIBSSH2_MD5 */\n\n#if LIBSSH2_HMAC_RIPEMD\n/* mac_method_hmac_ripemd160_hash\n * Calculate hash using ripemd160 value\n */\nstatic int\nmac_method_hmac_ripemd160_hash(LIBSSH2_SESSION * session,\n                               unsigned char *buf, uint32_t seqno,\n                               const unsigned char *packet,\n                               uint32_t packet_len,\n                               const unsigned char *addtl,\n                               uint32_t addtl_len,\n                               void **abstract)\n{\n    libssh2_hmac_ctx ctx;\n    unsigned char seqno_buf[4];\n    (void) session;\n\n    _libssh2_htonu32(seqno_buf, seqno);\n\n    libssh2_hmac_ctx_init(ctx);\n    libssh2_hmac_ripemd160_init(&ctx, *abstract, 20);\n    libssh2_hmac_update(ctx, seqno_buf, 4);\n    libssh2_hmac_update(ctx, packet, packet_len);\n    if(addtl && addtl_len) {\n        libssh2_hmac_update(ctx, addtl, addtl_len);\n    }\n    libssh2_hmac_final(ctx, buf);\n    libssh2_hmac_cleanup(&ctx);\n\n    return 0;\n}\n\n\n\nstatic const LIBSSH2_MAC_METHOD mac_method_hmac_ripemd160 = {\n    \"hmac-ripemd160\",\n    20,\n    20,\n    mac_method_common_init,\n    mac_method_hmac_ripemd160_hash,\n    mac_method_common_dtor,\n};\n\nstatic const LIBSSH2_MAC_METHOD mac_method_hmac_ripemd160_openssh_com = {\n    \"hmac-ripemd160@openssh.com\",\n    20,\n    20,\n    mac_method_common_init,\n    mac_method_hmac_ripemd160_hash,\n    mac_method_common_dtor,\n};\n#endif /* LIBSSH2_HMAC_RIPEMD */\n\nstatic const LIBSSH2_MAC_METHOD *mac_methods[] = {\n#if LIBSSH2_HMAC_SHA256\n    &mac_method_hmac_sha2_256,\n#endif\n#if LIBSSH2_HMAC_SHA512\n    &mac_method_hmac_sha2_512,\n#endif\n    &mac_method_hmac_sha1,\n    &mac_method_hmac_sha1_96,\n#if LIBSSH2_MD5\n    &mac_method_hmac_md5,\n    &mac_method_hmac_md5_96,\n#endif\n#if LIBSSH2_HMAC_RIPEMD\n    &mac_method_hmac_ripemd160,\n    &mac_method_hmac_ripemd160_openssh_com,\n#endif /* LIBSSH2_HMAC_RIPEMD */\n#ifdef LIBSSH2_MAC_NONE\n    &mac_method_none,\n#endif /* LIBSSH2_MAC_NONE */\n    NULL\n};\n\nconst LIBSSH2_MAC_METHOD **\n_libssh2_mac_methods(void)\n{\n    return mac_methods;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/mac.h",
    "content": "#ifndef __LIBSSH2_MAC_H\n#define __LIBSSH2_MAC_H\n\n/* Copyright (C) 2009-2010 by Daniel Stenberg\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n */\n\n#include \"libssh2_priv.h\"\n\nstruct _LIBSSH2_MAC_METHOD\n{\n    const char *name;\n\n    /* The length of a given MAC packet */\n    int mac_len;\n\n    /* integrity key length */\n    int key_len;\n\n    /* Message Authentication Code Hashing algo */\n    int (*init) (LIBSSH2_SESSION * session, unsigned char *key, int *free_key,\n                 void **abstract);\n    int (*hash) (LIBSSH2_SESSION * session, unsigned char *buf,\n                 uint32_t seqno, const unsigned char *packet,\n                 uint32_t packet_len, const unsigned char *addtl,\n                 uint32_t addtl_len, void **abstract);\n    int (*dtor) (LIBSSH2_SESSION * session, void **abstract);\n};\n\ntypedef struct _LIBSSH2_MAC_METHOD LIBSSH2_MAC_METHOD;\n\nconst LIBSSH2_MAC_METHOD **_libssh2_mac_methods(void);\n\n#endif /* __LIBSSH2_MAC_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/mbedtls.c",
    "content": "/* Copyright (c) 2016, Art <https://github.com/wildart>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\n#ifdef LIBSSH2_MBEDTLS /* compile only if we build with mbedtls */\n\n/*******************************************************************/\n/*\n * mbedTLS backend: Global context handles\n */\n\nstatic mbedtls_entropy_context  _libssh2_mbedtls_entropy;\nstatic mbedtls_ctr_drbg_context _libssh2_mbedtls_ctr_drbg;\n\n/*******************************************************************/\n/*\n * mbedTLS backend: Generic functions\n */\n\nvoid\n_libssh2_mbedtls_init(void)\n{\n    int ret;\n\n    mbedtls_entropy_init(&_libssh2_mbedtls_entropy);\n    mbedtls_ctr_drbg_init(&_libssh2_mbedtls_ctr_drbg);\n\n    ret = mbedtls_ctr_drbg_seed(&_libssh2_mbedtls_ctr_drbg,\n                                mbedtls_entropy_func,\n                                &_libssh2_mbedtls_entropy, NULL, 0);\n    if(ret != 0)\n        mbedtls_ctr_drbg_free(&_libssh2_mbedtls_ctr_drbg);\n}\n\nvoid\n_libssh2_mbedtls_free(void)\n{\n    mbedtls_ctr_drbg_free(&_libssh2_mbedtls_ctr_drbg);\n    mbedtls_entropy_free(&_libssh2_mbedtls_entropy);\n}\n\nint\n_libssh2_mbedtls_random(unsigned char *buf, int len)\n{\n    int ret;\n    ret = mbedtls_ctr_drbg_random(&_libssh2_mbedtls_ctr_drbg, buf, len);\n    return ret == 0 ? 0 : -1;\n}\n\nstatic void\n_libssh2_mbedtls_safe_free(void *buf, int len)\n{\n#ifndef LIBSSH2_CLEAR_MEMORY\n    (void)len;\n#endif\n\n    if(!buf)\n        return;\n\n#ifdef LIBSSH2_CLEAR_MEMORY\n    if(len > 0)\n        memset(buf, 0, len);\n#endif\n\n    mbedtls_free(buf);\n}\n\nint\n_libssh2_mbedtls_cipher_init(_libssh2_cipher_ctx *ctx,\n                             _libssh2_cipher_type(algo),\n                             unsigned char *iv,\n                             unsigned char *secret,\n                             int encrypt)\n{\n    const mbedtls_cipher_info_t *cipher_info;\n    int ret, op;\n\n    if(!ctx)\n        return -1;\n\n    op = encrypt == 0 ? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT;\n\n    cipher_info = mbedtls_cipher_info_from_type(algo);\n    if(!cipher_info)\n        return -1;\n\n    mbedtls_cipher_init(ctx);\n    ret = mbedtls_cipher_setup(ctx, cipher_info);\n    if(!ret)\n        ret = mbedtls_cipher_setkey(ctx, secret, cipher_info->key_bitlen, op);\n\n    if(!ret)\n        ret = mbedtls_cipher_set_iv(ctx, iv, cipher_info->iv_size);\n\n    return ret == 0 ? 0 : -1;\n}\n\nint\n_libssh2_mbedtls_cipher_crypt(_libssh2_cipher_ctx *ctx,\n                              _libssh2_cipher_type(algo),\n                              int encrypt,\n                              unsigned char *block,\n                              size_t blocklen)\n{\n    int ret;\n    unsigned char *output;\n    size_t osize, olen, finish_olen;\n\n    (void) encrypt;\n    (void) algo;\n\n    osize = blocklen + mbedtls_cipher_get_block_size(ctx);\n\n    output = (unsigned char *)mbedtls_calloc(osize, sizeof(char));\n    if(output) {\n        ret = mbedtls_cipher_reset(ctx);\n\n        if(!ret)\n            ret = mbedtls_cipher_update(ctx, block, blocklen, output, &olen);\n\n        if(!ret)\n            ret = mbedtls_cipher_finish(ctx, output + olen, &finish_olen);\n\n        if(!ret) {\n            olen += finish_olen;\n            memcpy(block, output, olen);\n        }\n\n        _libssh2_mbedtls_safe_free(output, osize);\n    }\n    else\n        ret = -1;\n\n    return ret == 0 ? 0 : -1;\n}\n\nvoid\n_libssh2_mbedtls_cipher_dtor(_libssh2_cipher_ctx *ctx)\n{\n    mbedtls_cipher_free(ctx);\n}\n\n\nint\n_libssh2_mbedtls_hash_init(mbedtls_md_context_t *ctx,\n                          mbedtls_md_type_t mdtype,\n                          const unsigned char *key, unsigned long keylen)\n{\n    const mbedtls_md_info_t *md_info;\n    int ret, hmac;\n\n    md_info = mbedtls_md_info_from_type(mdtype);\n    if(!md_info)\n        return 0;\n\n    hmac = key == NULL ? 0 : 1;\n\n    mbedtls_md_init(ctx);\n    ret = mbedtls_md_setup(ctx, md_info, hmac);\n    if(!ret) {\n        if(hmac)\n            ret = mbedtls_md_hmac_starts(ctx, key, keylen);\n        else\n            ret = mbedtls_md_starts(ctx);\n    }\n\n    return ret == 0 ? 1 : 0;\n}\n\nint\n_libssh2_mbedtls_hash_final(mbedtls_md_context_t *ctx, unsigned char *hash)\n{\n    int ret;\n\n    ret = mbedtls_md_finish(ctx, hash);\n    mbedtls_md_free(ctx);\n\n    return ret == 0 ? 0 : -1;\n}\n\nint\n_libssh2_mbedtls_hash(const unsigned char *data, unsigned long datalen,\n                      mbedtls_md_type_t mdtype, unsigned char *hash)\n{\n    const mbedtls_md_info_t *md_info;\n    int ret;\n\n    md_info = mbedtls_md_info_from_type(mdtype);\n    if(!md_info)\n        return 0;\n\n    ret = mbedtls_md(md_info, data, datalen, hash);\n\n    return ret == 0 ? 0 : -1;\n}\n\n/*******************************************************************/\n/*\n * mbedTLS backend: BigNumber functions\n */\n\n_libssh2_bn *\n_libssh2_mbedtls_bignum_init(void)\n{\n    _libssh2_bn *bignum;\n\n    bignum = (_libssh2_bn *)mbedtls_calloc(1, sizeof(_libssh2_bn));\n    if(bignum) {\n        mbedtls_mpi_init(bignum);\n    }\n\n    return bignum;\n}\n\nvoid\n_libssh2_mbedtls_bignum_free(_libssh2_bn *bn)\n{\n    if(bn) {\n        mbedtls_mpi_free(bn);\n        mbedtls_free(bn);\n    }\n}\n\nstatic int\n_libssh2_mbedtls_bignum_random(_libssh2_bn *bn, int bits, int top, int bottom)\n{\n    size_t len;\n    int err;\n    int i;\n\n    if(!bn || bits <= 0)\n        return -1;\n\n    len = (bits + 7) >> 3;\n    err = mbedtls_mpi_fill_random(bn, len, mbedtls_ctr_drbg_random,\n                                  &_libssh2_mbedtls_ctr_drbg);\n    if(err)\n        return -1;\n\n    /* Zero unsued bits above the most significant bit*/\n    for(i = len*8 - 1; bits <= i; --i) {\n        err = mbedtls_mpi_set_bit(bn, i, 0);\n        if(err)\n            return -1;\n    }\n\n    /* If `top` is -1, the most significant bit of the random number can be\n       zero.  If top is 0, the most significant bit of the random number is\n       set to 1, and if top is 1, the two most significant bits of the number\n       will be set to 1, so that the product of two such random numbers will\n       always have 2*bits length.\n    */\n    for(i = 0; i <= top; ++i) {\n        err = mbedtls_mpi_set_bit(bn, bits-i-1, 1);\n        if(err)\n            return -1;\n    }\n\n    /* make odd by setting first bit in least significant byte */\n    if(bottom) {\n        err = mbedtls_mpi_set_bit(bn, 0, 1);\n        if(err)\n            return -1;\n    }\n\n    return 0;\n}\n\n\n/*******************************************************************/\n/*\n * mbedTLS backend: RSA functions\n */\n\nint\n_libssh2_mbedtls_rsa_new(libssh2_rsa_ctx **rsa,\n                        const unsigned char *edata,\n                        unsigned long elen,\n                        const unsigned char *ndata,\n                        unsigned long nlen,\n                        const unsigned char *ddata,\n                        unsigned long dlen,\n                        const unsigned char *pdata,\n                        unsigned long plen,\n                        const unsigned char *qdata,\n                        unsigned long qlen,\n                        const unsigned char *e1data,\n                        unsigned long e1len,\n                        const unsigned char *e2data,\n                        unsigned long e2len,\n                        const unsigned char *coeffdata,\n                        unsigned long coefflen)\n{\n    int ret;\n    libssh2_rsa_ctx *ctx;\n\n    ctx = (libssh2_rsa_ctx *) mbedtls_calloc(1, sizeof(libssh2_rsa_ctx));\n    if(ctx != NULL) {\n        mbedtls_rsa_init(ctx, MBEDTLS_RSA_PKCS_V15, 0);\n    }\n    else\n        return -1;\n\n    /* !checksrc! disable ASSIGNWITHINCONDITION 1 */\n    if((ret = mbedtls_mpi_read_binary(&(ctx->E), edata, elen) ) != 0 ||\n       (ret = mbedtls_mpi_read_binary(&(ctx->N), ndata, nlen) ) != 0) {\n        ret = -1;\n    }\n\n    if(!ret) {\n        ctx->len = mbedtls_mpi_size(&(ctx->N));\n    }\n\n    if(!ret && ddata) {\n        /* !checksrc! disable ASSIGNWITHINCONDITION 1 */\n        if((ret = mbedtls_mpi_read_binary(&(ctx->D), ddata, dlen) ) != 0 ||\n           (ret = mbedtls_mpi_read_binary(&(ctx->P), pdata, plen) ) != 0 ||\n           (ret = mbedtls_mpi_read_binary(&(ctx->Q), qdata, qlen) ) != 0 ||\n           (ret = mbedtls_mpi_read_binary(&(ctx->DP), e1data, e1len) ) != 0 ||\n           (ret = mbedtls_mpi_read_binary(&(ctx->DQ), e2data, e2len) ) != 0 ||\n           (ret = mbedtls_mpi_read_binary(&(ctx->QP), coeffdata, coefflen) )\n           != 0) {\n            ret = -1;\n        }\n        ret = mbedtls_rsa_check_privkey(ctx);\n    }\n    else if(!ret) {\n        ret = mbedtls_rsa_check_pubkey(ctx);\n    }\n\n    if(ret && ctx) {\n        _libssh2_mbedtls_rsa_free(ctx);\n        ctx = NULL;\n    }\n    *rsa = ctx;\n    return ret;\n}\n\nint\n_libssh2_mbedtls_rsa_new_private(libssh2_rsa_ctx **rsa,\n                                LIBSSH2_SESSION *session,\n                                const char *filename,\n                                const unsigned char *passphrase)\n{\n    int ret;\n    mbedtls_pk_context pkey;\n    mbedtls_rsa_context *pk_rsa;\n\n    *rsa = (libssh2_rsa_ctx *) LIBSSH2_ALLOC(session, sizeof(libssh2_rsa_ctx));\n    if(*rsa == NULL)\n        return -1;\n\n    mbedtls_rsa_init(*rsa, MBEDTLS_RSA_PKCS_V15, 0);\n    mbedtls_pk_init(&pkey);\n\n    ret = mbedtls_pk_parse_keyfile(&pkey, filename, (char *)passphrase);\n    if(ret != 0 || mbedtls_pk_get_type(&pkey) != MBEDTLS_PK_RSA) {\n        mbedtls_pk_free(&pkey);\n        mbedtls_rsa_free(*rsa);\n        LIBSSH2_FREE(session, *rsa);\n        *rsa = NULL;\n        return -1;\n    }\n\n    pk_rsa = mbedtls_pk_rsa(pkey);\n    mbedtls_rsa_copy(*rsa, pk_rsa);\n    mbedtls_pk_free(&pkey);\n\n    return 0;\n}\n\nint\n_libssh2_mbedtls_rsa_new_private_frommemory(libssh2_rsa_ctx **rsa,\n                                           LIBSSH2_SESSION *session,\n                                           const char *filedata,\n                                           size_t filedata_len,\n                                           unsigned const char *passphrase)\n{\n    int ret;\n    mbedtls_pk_context pkey;\n    mbedtls_rsa_context *pk_rsa;\n    void *filedata_nullterm;\n    size_t pwd_len;\n\n    *rsa = (libssh2_rsa_ctx *) mbedtls_calloc(1, sizeof(libssh2_rsa_ctx));\n    if(*rsa == NULL)\n        return -1;\n\n    /*\n    mbedtls checks in \"mbedtls/pkparse.c:1184\" if \"key[keylen - 1] != '\\0'\"\n    private-key from memory will fail if the last byte is not a null byte\n    */\n    filedata_nullterm = mbedtls_calloc(filedata_len + 1, 1);\n    if(filedata_nullterm == NULL) {\n        return -1;\n    }\n    memcpy(filedata_nullterm, filedata, filedata_len);\n\n    mbedtls_pk_init(&pkey);\n\n    pwd_len = passphrase != NULL ? strlen((const char *)passphrase) : 0;\n    ret = mbedtls_pk_parse_key(&pkey, (unsigned char *)filedata_nullterm,\n                               filedata_len + 1,\n                               passphrase, pwd_len);\n    _libssh2_mbedtls_safe_free(filedata_nullterm, filedata_len);\n\n    if(ret != 0 || mbedtls_pk_get_type(&pkey) != MBEDTLS_PK_RSA) {\n        mbedtls_pk_free(&pkey);\n        mbedtls_rsa_free(*rsa);\n        LIBSSH2_FREE(session, *rsa);\n        *rsa = NULL;\n        return -1;\n    }\n\n    pk_rsa = mbedtls_pk_rsa(pkey);\n    mbedtls_rsa_copy(*rsa, pk_rsa);\n    mbedtls_pk_free(&pkey);\n\n    return 0;\n}\n\nint\n_libssh2_mbedtls_rsa_sha1_verify(libssh2_rsa_ctx *rsa,\n                                const unsigned char *sig,\n                                unsigned long sig_len,\n                                const unsigned char *m,\n                                unsigned long m_len)\n{\n    unsigned char hash[SHA_DIGEST_LENGTH];\n    int ret;\n\n    ret = _libssh2_mbedtls_hash(m, m_len, MBEDTLS_MD_SHA1, hash);\n    if(ret)\n        return -1; /* failure */\n\n    ret = mbedtls_rsa_pkcs1_verify(rsa, NULL, NULL, MBEDTLS_RSA_PUBLIC,\n                                   MBEDTLS_MD_SHA1, SHA_DIGEST_LENGTH,\n                                   hash, sig);\n\n    return (ret == 0) ? 0 : -1;\n}\n\nint\n_libssh2_mbedtls_rsa_sha1_sign(LIBSSH2_SESSION *session,\n                              libssh2_rsa_ctx *rsa,\n                              const unsigned char *hash,\n                              size_t hash_len,\n                              unsigned char **signature,\n                              size_t *signature_len)\n{\n    int ret;\n    unsigned char *sig;\n    unsigned int sig_len;\n\n    (void)hash_len;\n\n    sig_len = rsa->len;\n    sig = LIBSSH2_ALLOC(session, sig_len);\n    if(!sig) {\n        return -1;\n    }\n\n    ret = mbedtls_rsa_pkcs1_sign(rsa, NULL, NULL, MBEDTLS_RSA_PRIVATE,\n                                 MBEDTLS_MD_SHA1, SHA_DIGEST_LENGTH,\n                                 hash, sig);\n    if(ret) {\n        LIBSSH2_FREE(session, sig);\n        return -1;\n    }\n\n    *signature = sig;\n    *signature_len = sig_len;\n\n    return (ret == 0) ? 0 : -1;\n}\n\nvoid\n_libssh2_mbedtls_rsa_free(libssh2_rsa_ctx *ctx)\n{\n    mbedtls_rsa_free(ctx);\n    mbedtls_free(ctx);\n}\n\nstatic unsigned char *\ngen_publickey_from_rsa(LIBSSH2_SESSION *session,\n                      mbedtls_rsa_context *rsa,\n                      size_t *keylen)\n{\n    int            e_bytes, n_bytes;\n    unsigned long  len;\n    unsigned char *key;\n    unsigned char *p;\n\n    e_bytes = mbedtls_mpi_size(&rsa->E);\n    n_bytes = mbedtls_mpi_size(&rsa->N);\n\n    /* Key form is \"ssh-rsa\" + e + n. */\n    len = 4 + 7 + 4 + e_bytes + 4 + n_bytes;\n\n    key = LIBSSH2_ALLOC(session, len);\n    if(!key) {\n        return NULL;\n    }\n\n    /* Process key encoding. */\n    p = key;\n\n    _libssh2_htonu32(p, 7);  /* Key type. */\n    p += 4;\n    memcpy(p, \"ssh-rsa\", 7);\n    p += 7;\n\n    _libssh2_htonu32(p, e_bytes);\n    p += 4;\n    mbedtls_mpi_write_binary(&rsa->E, p, e_bytes);\n\n    _libssh2_htonu32(p, n_bytes);\n    p += 4;\n    mbedtls_mpi_write_binary(&rsa->N, p, n_bytes);\n\n    *keylen = (size_t)(p - key);\n    return key;\n}\n\nstatic int\n_libssh2_mbedtls_pub_priv_key(LIBSSH2_SESSION *session,\n                               unsigned char **method,\n                               size_t *method_len,\n                               unsigned char **pubkeydata,\n                               size_t *pubkeydata_len,\n                               mbedtls_pk_context *pkey)\n{\n    unsigned char *key = NULL, *mth = NULL;\n    size_t keylen = 0, mthlen = 0;\n    int ret;\n    mbedtls_rsa_context *rsa;\n\n    if(mbedtls_pk_get_type(pkey) != MBEDTLS_PK_RSA) {\n        mbedtls_pk_free(pkey);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Key type not supported\");\n    }\n\n    /* write method */\n    mthlen = 7;\n    mth = LIBSSH2_ALLOC(session, mthlen);\n    if(mth) {\n        memcpy(mth, \"ssh-rsa\", mthlen);\n    }\n    else {\n        ret = -1;\n    }\n\n    rsa = mbedtls_pk_rsa(*pkey);\n    key = gen_publickey_from_rsa(session, rsa, &keylen);\n    if(key == NULL) {\n        ret = -1;\n    }\n\n    /* write output */\n    if(ret) {\n        if(mth)\n            LIBSSH2_FREE(session, mth);\n        if(key)\n            LIBSSH2_FREE(session, key);\n    }\n    else {\n        *method = mth;\n        *method_len = mthlen;\n        *pubkeydata = key;\n        *pubkeydata_len = keylen;\n    }\n\n    return ret;\n}\n\nint\n_libssh2_mbedtls_pub_priv_keyfile(LIBSSH2_SESSION *session,\n                                 unsigned char **method,\n                                 size_t *method_len,\n                                 unsigned char **pubkeydata,\n                                 size_t *pubkeydata_len,\n                                 const char *privatekey,\n                                 const char *passphrase)\n{\n    mbedtls_pk_context pkey;\n    char buf[1024];\n    int ret;\n\n    mbedtls_pk_init(&pkey);\n    ret = mbedtls_pk_parse_keyfile(&pkey, privatekey, passphrase);\n    if(ret != 0) {\n        mbedtls_strerror(ret, (char *)buf, sizeof(buf));\n        mbedtls_pk_free(&pkey);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE, buf);\n    }\n\n    ret = _libssh2_mbedtls_pub_priv_key(session, method, method_len,\n                                       pubkeydata, pubkeydata_len, &pkey);\n\n    mbedtls_pk_free(&pkey);\n\n    return ret;\n}\n\nint\n_libssh2_mbedtls_pub_priv_keyfilememory(LIBSSH2_SESSION *session,\n                                       unsigned char **method,\n                                       size_t *method_len,\n                                       unsigned char **pubkeydata,\n                                       size_t *pubkeydata_len,\n                                       const char *privatekeydata,\n                                       size_t privatekeydata_len,\n                                       const char *passphrase)\n{\n    mbedtls_pk_context pkey;\n    char buf[1024];\n    int ret;\n    void *privatekeydata_nullterm;\n    size_t pwd_len;\n\n    /*\n    mbedtls checks in \"mbedtls/pkparse.c:1184\" if \"key[keylen - 1] != '\\0'\"\n    private-key from memory will fail if the last byte is not a null byte\n    */\n    privatekeydata_nullterm = mbedtls_calloc(privatekeydata_len + 1, 1);\n    if(privatekeydata_nullterm == NULL) {\n        return -1;\n    }\n    memcpy(privatekeydata_nullterm, privatekeydata, privatekeydata_len);\n\n    mbedtls_pk_init(&pkey);\n\n    pwd_len = passphrase != NULL ? strlen((const char *)passphrase) : 0;\n    ret = mbedtls_pk_parse_key(&pkey,\n                               (unsigned char *)privatekeydata_nullterm,\n                               privatekeydata_len + 1,\n                               (const unsigned char *)passphrase, pwd_len);\n    _libssh2_mbedtls_safe_free(privatekeydata_nullterm, privatekeydata_len);\n\n    if(ret != 0) {\n        mbedtls_strerror(ret, (char *)buf, sizeof(buf));\n        mbedtls_pk_free(&pkey);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE, buf);\n    }\n\n    ret = _libssh2_mbedtls_pub_priv_key(session, method, method_len,\n                                       pubkeydata, pubkeydata_len, &pkey);\n\n    mbedtls_pk_free(&pkey);\n\n    return ret;\n}\n\nvoid _libssh2_init_aes_ctr(void)\n{\n    /* no implementation */\n}\n\n\n/*******************************************************************/\n/*\n * mbedTLS backend: Diffie-Hellman functions\n */\n\nvoid\n_libssh2_dh_init(_libssh2_dh_ctx *dhctx)\n{\n    *dhctx = _libssh2_mbedtls_bignum_init();    /* Random from client */\n}\n\nint\n_libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public,\n                     _libssh2_bn *g, _libssh2_bn *p, int group_order)\n{\n    /* Generate x and e */\n    _libssh2_mbedtls_bignum_random(*dhctx, group_order * 8 - 1, 0, -1);\n    mbedtls_mpi_exp_mod(public, g, *dhctx, p, NULL);\n    return 0;\n}\n\nint\n_libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret,\n                   _libssh2_bn *f, _libssh2_bn *p)\n{\n    /* Compute the shared secret */\n    mbedtls_mpi_exp_mod(secret, f, *dhctx, p, NULL);\n    return 0;\n}\n\nvoid\n_libssh2_dh_dtor(_libssh2_dh_ctx *dhctx)\n{\n    _libssh2_mbedtls_bignum_free(*dhctx);\n    *dhctx = NULL;\n}\n\n#endif /* LIBSSH2_MBEDTLS */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/mbedtls.h",
    "content": "/* Copyright (c) 2016, Art <https://github.com/wildart>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include <stdlib.h>\n#include <string.h>\n\n#include <mbedtls/platform.h>\n#include <mbedtls/md.h>\n#include <mbedtls/rsa.h>\n#include <mbedtls/bignum.h>\n#include <mbedtls/cipher.h>\n#include <mbedtls/entropy.h>\n#include <mbedtls/ctr_drbg.h>\n#include <mbedtls/pk.h>\n#include <mbedtls/error.h>\n\n/* Define which features are supported. */\n#define LIBSSH2_MD5             1\n\n#define LIBSSH2_HMAC_RIPEMD     1\n#define LIBSSH2_HMAC_SHA256     1\n#define LIBSSH2_HMAC_SHA512     1\n\n#define LIBSSH2_AES             1\n#define LIBSSH2_AES_CTR         1\n#define LIBSSH2_BLOWFISH        1\n#define LIBSSH2_RC4             1\n#define LIBSSH2_CAST            0\n#define LIBSSH2_3DES            1\n\n#define LIBSSH2_RSA             1\n#define LIBSSH2_DSA             0\n#define LIBSSH2_ECDSA           0\n#define LIBSSH2_ED25519         0\n\n#define MD5_DIGEST_LENGTH      16\n#define SHA_DIGEST_LENGTH      20\n#define SHA256_DIGEST_LENGTH   32\n#define SHA384_DIGEST_LENGTH   48\n#define SHA512_DIGEST_LENGTH   64\n\n#define EC_MAX_POINT_LEN ((528 * 2 / 8) + 1)\n\n#if LIBSSH2_ECDSA\n#else\n#define _libssh2_ec_key void\n#endif\n\n/*******************************************************************/\n/*\n * mbedTLS backend: Generic functions\n */\n\n#define libssh2_crypto_init() \\\n  _libssh2_mbedtls_init()\n#define libssh2_crypto_exit() \\\n  _libssh2_mbedtls_free()\n\n#define _libssh2_random(buf, len) \\\n  _libssh2_mbedtls_random(buf, len)\n\n#define libssh2_prepare_iovec(vec, len)  /* Empty. */\n\n\n/*******************************************************************/\n/*\n * mbedTLS backend: HMAC functions\n */\n\n#define libssh2_hmac_ctx    mbedtls_md_context_t\n\n#define libssh2_hmac_ctx_init(ctx)\n#define libssh2_hmac_cleanup(pctx) \\\n  mbedtls_md_free(pctx)\n#define libssh2_hmac_update(ctx, data, datalen) \\\n  mbedtls_md_hmac_update(&ctx, (unsigned char *) data, datalen)\n#define libssh2_hmac_final(ctx, hash) \\\n  mbedtls_md_hmac_finish(&ctx, hash)\n\n#define libssh2_hmac_sha1_init(pctx, key, keylen) \\\n  _libssh2_mbedtls_hash_init(pctx, MBEDTLS_MD_SHA1, key, keylen)\n#define libssh2_hmac_md5_init(pctx, key, keylen) \\\n  _libssh2_mbedtls_hash_init(pctx, MBEDTLS_MD_MD5, key, keylen)\n#define libssh2_hmac_ripemd160_init(pctx, key, keylen) \\\n  _libssh2_mbedtls_hash_init(pctx, MBEDTLS_MD_RIPEMD160, key, keylen)\n#define libssh2_hmac_sha256_init(pctx, key, keylen) \\\n  _libssh2_mbedtls_hash_init(pctx, MBEDTLS_MD_SHA256, key, keylen)\n#define libssh2_hmac_sha384_init(pctx, key, keylen) \\\n  _libssh2_mbedtls_hash_init(pctx, MBEDTLS_MD_SHA384, key, keylen)\n#define libssh2_hmac_sha512_init(pctx, key, keylen) \\\n  _libssh2_mbedtls_hash_init(pctx, MBEDTLS_MD_SHA512, key, keylen)\n\n\n/*******************************************************************/\n/*\n * mbedTLS backend: SHA1 functions\n */\n\n#define libssh2_sha1_ctx      mbedtls_md_context_t\n\n#define libssh2_sha1_init(pctx) \\\n  _libssh2_mbedtls_hash_init(pctx, MBEDTLS_MD_SHA1, NULL, 0)\n#define libssh2_sha1_update(ctx, data, datalen) \\\n  mbedtls_md_update(&ctx, (unsigned char *) data, datalen)\n#define libssh2_sha1_final(ctx, hash) \\\n  _libssh2_mbedtls_hash_final(&ctx, hash)\n#define libssh2_sha1(data, datalen, hash) \\\n  _libssh2_mbedtls_hash(data, datalen, MBEDTLS_MD_SHA1, hash)\n\n/*******************************************************************/\n/*\n * mbedTLS backend: SHA256 functions\n */\n\n#define libssh2_sha256_ctx      mbedtls_md_context_t\n\n#define libssh2_sha256_init(pctx) \\\n  _libssh2_mbedtls_hash_init(pctx, MBEDTLS_MD_SHA256, NULL, 0)\n#define libssh2_sha256_update(ctx, data, datalen) \\\n  mbedtls_md_update(&ctx, (unsigned char *) data, datalen)\n#define libssh2_sha256_final(ctx, hash) \\\n  _libssh2_mbedtls_hash_final(&ctx, hash)\n#define libssh2_sha256(data, datalen, hash) \\\n  _libssh2_mbedtls_hash(data, datalen, MBEDTLS_MD_SHA256, hash)\n\n\n/*******************************************************************/\n/*\n * mbedTLS backend: SHA384 functions\n */\n\n#define libssh2_sha384_ctx      mbedtls_md_context_t\n\n#define libssh2_sha384_init(pctx) \\\n  _libssh2_mbedtls_hash_init(pctx, MBEDTLS_MD_SHA384, NULL, 0)\n#define libssh2_sha384_update(ctx, data, datalen) \\\n  mbedtls_md_update(&ctx, (unsigned char *) data, datalen)\n#define libssh2_sha384_final(ctx, hash) \\\n  _libssh2_mbedtls_hash_final(&ctx, hash)\n#define libssh2_sha384(data, datalen, hash) \\\n  _libssh2_mbedtls_hash(data, datalen, MBEDTLS_MD_SHA384, hash)\n\n\n/*******************************************************************/\n/*\n * mbedTLS backend: SHA512 functions\n */\n\n#define libssh2_sha512_ctx      mbedtls_md_context_t\n\n#define libssh2_sha512_init(pctx) \\\n  _libssh2_mbedtls_hash_init(pctx, MBEDTLS_MD_SHA512, NULL, 0)\n#define libssh2_sha512_update(ctx, data, datalen) \\\n  mbedtls_md_update(&ctx, (unsigned char *) data, datalen)\n#define libssh2_sha512_final(ctx, hash) \\\n  _libssh2_mbedtls_hash_final(&ctx, hash)\n#define libssh2_sha512(data, datalen, hash) \\\n  _libssh2_mbedtls_hash(data, datalen, MBEDTLS_MD_SHA512, hash)\n\n\n/*******************************************************************/\n/*\n * mbedTLS backend: MD5 functions\n */\n\n#define libssh2_md5_ctx      mbedtls_md_context_t\n\n#define libssh2_md5_init(pctx) \\\n  _libssh2_mbedtls_hash_init(pctx, MBEDTLS_MD_MD5, NULL, 0)\n#define libssh2_md5_update(ctx, data, datalen) \\\n  mbedtls_md_update(&ctx, (unsigned char *) data, datalen)\n#define libssh2_md5_final(ctx, hash) \\\n  _libssh2_mbedtls_hash_final(&ctx, hash)\n#define libssh2_md5(data, datalen, hash) \\\n  _libssh2_mbedtls_hash(data, datalen, MBEDTLS_MD_MD5, hash)\n\n/*******************************************************************/\n/*\n * mbedTLS backend: RSA structure\n */\n\n#define libssh2_rsa_ctx  mbedtls_rsa_context\n\n#define _libssh2_rsa_new(rsactx, e, e_len, n, n_len, \\\n                         d, d_len, p, p_len, q, q_len, \\\n                         e1, e1_len, e2, e2_len, c, c_len) \\\n  _libssh2_mbedtls_rsa_new(rsactx, e, e_len, n, n_len, \\\n                          d, d_len, p, p_len, q, q_len, \\\n                          e1, e1_len, e2, e2_len, c, c_len)\n\n#define _libssh2_rsa_new_private(rsactx, s, filename, passphrase) \\\n  _libssh2_mbedtls_rsa_new_private(rsactx, s, filename, passphrase)\n\n#define _libssh2_rsa_new_private_frommemory(rsactx, s, filedata, \\\n                                            filedata_len, passphrase) \\\n  _libssh2_mbedtls_rsa_new_private_frommemory(rsactx, s, filedata, \\\n                                             filedata_len, passphrase)\n\n#define _libssh2_rsa_sha1_sign(s, rsactx, hash, hash_len, sig, sig_len) \\\n  _libssh2_mbedtls_rsa_sha1_sign(s, rsactx, hash, hash_len, sig, sig_len)\n\n#define _libssh2_rsa_sha1_verify(rsactx, sig, sig_len, m, m_len) \\\n  _libssh2_mbedtls_rsa_sha1_verify(rsactx, sig, sig_len, m, m_len)\n\n#define _libssh2_rsa_free(rsactx) \\\n  _libssh2_mbedtls_rsa_free(rsactx)\n\n/*\n * mbedTLS backend: Key functions\n */\n\n#define _libssh2_pub_priv_keyfile(s, m, m_len, p, p_len, pk, pw) \\\n  _libssh2_mbedtls_pub_priv_keyfile(s, m, m_len, p, p_len, pk, pw)\n#define _libssh2_pub_priv_keyfilememory(s, m, m_len, p, p_len, \\\n                                                     pk, pk_len, pw) \\\n  _libssh2_mbedtls_pub_priv_keyfilememory(s, m, m_len, p, p_len, \\\n                                                      pk, pk_len, pw)\n\n\n /*******************************************************************/\n/*\n * mbedTLS backend: Cipher Context structure\n */\n#define _libssh2_cipher_ctx         mbedtls_cipher_context_t\n\n#define _libssh2_cipher_type(algo)  mbedtls_cipher_type_t algo\n\n#define _libssh2_cipher_aes256ctr MBEDTLS_CIPHER_AES_256_CTR\n#define _libssh2_cipher_aes192ctr MBEDTLS_CIPHER_AES_192_CTR\n#define _libssh2_cipher_aes128ctr MBEDTLS_CIPHER_AES_128_CTR\n#define _libssh2_cipher_aes256    MBEDTLS_CIPHER_AES_256_CBC\n#define _libssh2_cipher_aes192    MBEDTLS_CIPHER_AES_192_CBC\n#define _libssh2_cipher_aes128    MBEDTLS_CIPHER_AES_128_CBC\n#define _libssh2_cipher_blowfish  MBEDTLS_CIPHER_BLOWFISH_CBC\n#define _libssh2_cipher_arcfour   MBEDTLS_CIPHER_ARC4_128\n#define _libssh2_cipher_cast5     MBEDTLS_CIPHER_NULL\n#define _libssh2_cipher_3des      MBEDTLS_CIPHER_DES_EDE3_CBC\n\n/*\n * mbedTLS backend: Cipher functions\n */\n\n#define _libssh2_cipher_init(ctx, type, iv, secret, encrypt) \\\n  _libssh2_mbedtls_cipher_init(ctx, type, iv, secret, encrypt)\n#define _libssh2_cipher_crypt(ctx, type, encrypt, block, blocklen) \\\n  _libssh2_mbedtls_cipher_crypt(ctx, type, encrypt, block, blocklen)\n#define _libssh2_cipher_dtor(ctx) \\\n  _libssh2_mbedtls_cipher_dtor(ctx)\n\n\n/*******************************************************************/\n/*\n * mbedTLS backend: BigNumber Support\n */\n\n#define _libssh2_bn_ctx int /* not used */\n#define _libssh2_bn_ctx_new() 0 /* not used */\n#define _libssh2_bn_ctx_free(bnctx) ((void)0) /* not used */\n\n#define _libssh2_bn mbedtls_mpi\n\n#define _libssh2_bn_init() \\\n  _libssh2_mbedtls_bignum_init()\n#define _libssh2_bn_init_from_bin() \\\n  _libssh2_mbedtls_bignum_init()\n#define _libssh2_bn_set_word(bn, word) \\\n  mbedtls_mpi_lset(bn, word)\n#define _libssh2_bn_from_bin(bn, len, bin) \\\n  mbedtls_mpi_read_binary(bn, bin, len)\n#define _libssh2_bn_to_bin(bn, bin) \\\n  mbedtls_mpi_write_binary(bn, bin, mbedtls_mpi_size(bn))\n#define _libssh2_bn_bytes(bn) \\\n  mbedtls_mpi_size(bn)\n#define _libssh2_bn_bits(bn) \\\n  mbedtls_mpi_bitlen(bn)\n#define _libssh2_bn_free(bn) \\\n  _libssh2_mbedtls_bignum_free(bn)\n\n\n/*******************************************************************/\n/*\n * mbedTLS backend: Diffie-Hellman support.\n */\n\n#define _libssh2_dh_ctx mbedtls_mpi *\n#define libssh2_dh_init(dhctx) _libssh2_dh_init(dhctx)\n#define libssh2_dh_key_pair(dhctx, public, g, p, group_order, bnctx) \\\n        _libssh2_dh_key_pair(dhctx, public, g, p, group_order)\n#define libssh2_dh_secret(dhctx, secret, f, p, bnctx) \\\n        _libssh2_dh_secret(dhctx, secret, f, p)\n#define libssh2_dh_dtor(dhctx) _libssh2_dh_dtor(dhctx)\n\n\n/*******************************************************************/\n/*\n * mbedTLS backend: forward declarations\n */\nvoid\n_libssh2_mbedtls_init(void);\n\nvoid\n_libssh2_mbedtls_free(void);\n\nint\n_libssh2_mbedtls_random(unsigned char *buf, int len);\n\nint\n_libssh2_mbedtls_cipher_init(_libssh2_cipher_ctx *ctx,\n                            _libssh2_cipher_type(type),\n                            unsigned char *iv,\n                            unsigned char *secret,\n                            int encrypt);\nint\n_libssh2_mbedtls_cipher_crypt(_libssh2_cipher_ctx *ctx,\n                             _libssh2_cipher_type(type),\n                             int encrypt,\n                             unsigned char *block,\n                             size_t blocklen);\nvoid\n_libssh2_mbedtls_cipher_dtor(_libssh2_cipher_ctx *ctx);\n\nint\n_libssh2_mbedtls_hash_init(mbedtls_md_context_t *ctx,\n                          mbedtls_md_type_t mdtype,\n                          const unsigned char *key, unsigned long keylen);\n\nint\n_libssh2_mbedtls_hash_final(mbedtls_md_context_t *ctx, unsigned char *hash);\nint\n_libssh2_mbedtls_hash(const unsigned char *data, unsigned long datalen,\n                      mbedtls_md_type_t mdtype, unsigned char *hash);\n\n_libssh2_bn *\n_libssh2_mbedtls_bignum_init(void);\n\nvoid\n_libssh2_mbedtls_bignum_free(_libssh2_bn *bn);\n\nint\n_libssh2_mbedtls_rsa_new(libssh2_rsa_ctx **rsa,\n                        const unsigned char *edata,\n                        unsigned long elen,\n                        const unsigned char *ndata,\n                        unsigned long nlen,\n                        const unsigned char *ddata,\n                        unsigned long dlen,\n                        const unsigned char *pdata,\n                        unsigned long plen,\n                        const unsigned char *qdata,\n                        unsigned long qlen,\n                        const unsigned char *e1data,\n                        unsigned long e1len,\n                        const unsigned char *e2data,\n                        unsigned long e2len,\n                        const unsigned char *coeffdata,\n                        unsigned long coefflen);\n\nint\n_libssh2_mbedtls_rsa_new_private(libssh2_rsa_ctx **rsa,\n                                LIBSSH2_SESSION *session,\n                                const char *filename,\n                                const unsigned char *passphrase);\n\nint\n_libssh2_mbedtls_rsa_new_private_frommemory(libssh2_rsa_ctx **rsa,\n                                           LIBSSH2_SESSION *session,\n                                           const char *filedata,\n                                           size_t filedata_len,\n                                           unsigned const char *passphrase);\nint\n_libssh2_mbedtls_rsa_sha1_verify(libssh2_rsa_ctx *rsa,\n                                const unsigned char *sig,\n                                unsigned long sig_len,\n                                const unsigned char *m,\n                                unsigned long m_len);\nint\n_libssh2_mbedtls_rsa_sha1_sign(LIBSSH2_SESSION *session,\n                              libssh2_rsa_ctx *rsa,\n                              const unsigned char *hash,\n                              size_t hash_len,\n                              unsigned char **signature,\n                              size_t *signature_len);\nvoid\n_libssh2_mbedtls_rsa_free(libssh2_rsa_ctx *rsa);\n\nint\n_libssh2_mbedtls_pub_priv_keyfile(LIBSSH2_SESSION *session,\n                                 unsigned char **method,\n                                 size_t *method_len,\n                                 unsigned char **pubkeydata,\n                                 size_t *pubkeydata_len,\n                                 const char *privatekey,\n                                 const char *passphrase);\nint\n_libssh2_mbedtls_pub_priv_keyfilememory(LIBSSH2_SESSION *session,\n                                       unsigned char **method,\n                                       size_t *method_len,\n                                       unsigned char **pubkeydata,\n                                       size_t *pubkeydata_len,\n                                       const char *privatekeydata,\n                                       size_t privatekeydata_len,\n                                       const char *passphrase);\n\nextern void\n_libssh2_dh_init(_libssh2_dh_ctx *dhctx);\nextern int\n_libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public,\n                    _libssh2_bn *g, _libssh2_bn *p, int group_order);\nextern int\n_libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret,\n                  _libssh2_bn *f, _libssh2_bn *p);\nextern void\n_libssh2_dh_dtor(_libssh2_dh_ctx *dhctx);\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/misc.c",
    "content": "/* Copyright (c) 2004-2007 Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2009-2019 by Daniel Stenberg\n * Copyright (c) 2010  Simon Josefsson\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include \"misc.h\"\n#include \"blf.h\"\n\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif\n\n#if defined(HAVE_DECL_SECUREZEROMEMORY) && HAVE_DECL_SECUREZEROMEMORY\n#ifdef HAVE_WINDOWS_H\n#include <windows.h>\n#endif\n#endif\n\n#include <stdio.h>\n#include <errno.h>\n\nint _libssh2_error_flags(LIBSSH2_SESSION* session, int errcode,\n                         const char *errmsg, int errflags)\n{\n    if(session->err_flags & LIBSSH2_ERR_FLAG_DUP)\n        LIBSSH2_FREE(session, (char *)session->err_msg);\n\n    session->err_code = errcode;\n    session->err_flags = 0;\n\n    if((errmsg != NULL) && ((errflags & LIBSSH2_ERR_FLAG_DUP) != 0)) {\n        size_t len = strlen(errmsg);\n        char *copy = LIBSSH2_ALLOC(session, len + 1);\n        if(copy) {\n            memcpy(copy, errmsg, len + 1);\n            session->err_flags = LIBSSH2_ERR_FLAG_DUP;\n            session->err_msg = copy;\n        }\n        else\n            /* Out of memory: this code path is very unlikely */\n            session->err_msg = \"former error forgotten (OOM)\";\n    }\n    else\n        session->err_msg = errmsg;\n\n#ifdef LIBSSH2DEBUG\n    if((errcode == LIBSSH2_ERROR_EAGAIN) && !session->api_block_mode)\n        /* if this is EAGAIN and we're in non-blocking mode, don't generate\n           a debug output for this */\n        return errcode;\n    _libssh2_debug(session, LIBSSH2_TRACE_ERROR, \"%d - %s\", session->err_code,\n                   session->err_msg);\n#endif\n\n    return errcode;\n}\n\nint _libssh2_error(LIBSSH2_SESSION* session, int errcode, const char *errmsg)\n{\n    return _libssh2_error_flags(session, errcode, errmsg, 0);\n}\n\n#ifdef WIN32\nstatic int wsa2errno(void)\n{\n    switch(WSAGetLastError()) {\n    case WSAEWOULDBLOCK:\n        return EAGAIN;\n\n    case WSAENOTSOCK:\n        return EBADF;\n\n    case WSAEINTR:\n        return EINTR;\n\n    default:\n        /* It is most important to ensure errno does not stay at EAGAIN\n         * when a different error occurs so just set errno to a generic\n         * error */\n        return EIO;\n    }\n}\n#endif\n\n/* _libssh2_recv\n *\n * Replacement for the standard recv, return -errno on failure.\n */\nssize_t\n_libssh2_recv(libssh2_socket_t sock, void *buffer, size_t length,\n              int flags, void **abstract)\n{\n    ssize_t rc;\n\n    (void) abstract;\n\n    rc = recv(sock, buffer, length, flags);\n#ifdef WIN32\n    if(rc < 0)\n        return -wsa2errno();\n#elif defined(__VMS)\n    if(rc < 0) {\n        if(errno == EWOULDBLOCK)\n            return -EAGAIN;\n        else\n            return -errno;\n    }\n#else\n    if(rc < 0) {\n        /* Sometimes the first recv() function call sets errno to ENOENT on\n           Solaris and HP-UX */\n        if(errno == ENOENT)\n            return -EAGAIN;\n        else\n            return -errno;\n    }\n#endif\n    return rc;\n}\n\n/* _libssh2_send\n *\n * Replacement for the standard send, return -errno on failure.\n */\nssize_t\n_libssh2_send(libssh2_socket_t sock, const void *buffer, size_t length,\n              int flags, void **abstract)\n{\n    ssize_t rc;\n\n    (void) abstract;\n\n    rc = send(sock, buffer, length, flags);\n#ifdef WIN32\n    if(rc < 0)\n        return -wsa2errno();\n#elif defined(__VMS)\n    if(rc < 0) {\n        if(errno == EWOULDBLOCK)\n            return -EAGAIN;\n        else\n            return -errno;\n    }\n#else\n    if(rc < 0)\n        return -errno;\n#endif\n    return rc;\n}\n\n/* libssh2_ntohu32\n */\nunsigned int\n_libssh2_ntohu32(const unsigned char *buf)\n{\n    return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];\n}\n\n\n/* _libssh2_ntohu64\n */\nlibssh2_uint64_t\n_libssh2_ntohu64(const unsigned char *buf)\n{\n    unsigned long msl, lsl;\n\n    msl = ((libssh2_uint64_t)buf[0] << 24) | ((libssh2_uint64_t)buf[1] << 16)\n        | ((libssh2_uint64_t)buf[2] << 8) | (libssh2_uint64_t)buf[3];\n    lsl = ((libssh2_uint64_t)buf[4] << 24) | ((libssh2_uint64_t)buf[5] << 16)\n        | ((libssh2_uint64_t)buf[6] << 8) | (libssh2_uint64_t)buf[7];\n\n    return ((libssh2_uint64_t)msl <<32) | lsl;\n}\n\n/* _libssh2_htonu32\n */\nvoid\n_libssh2_htonu32(unsigned char *buf, uint32_t value)\n{\n    buf[0] = (value >> 24) & 0xFF;\n    buf[1] = (value >> 16) & 0xFF;\n    buf[2] = (value >> 8) & 0xFF;\n    buf[3] = value & 0xFF;\n}\n\n/* _libssh2_store_u32\n */\nvoid _libssh2_store_u32(unsigned char **buf, uint32_t value)\n{\n    _libssh2_htonu32(*buf, value);\n    *buf += sizeof(uint32_t);\n}\n\n/* _libssh2_store_str\n */\nvoid _libssh2_store_str(unsigned char **buf, const char *str, size_t len)\n{\n    _libssh2_store_u32(buf, (uint32_t)len);\n    if(len) {\n        memcpy(*buf, str, len);\n        *buf += len;\n    }\n}\n\n/* Base64 Conversion */\n\nstatic const short base64_reverse_table[256] = {\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,\n    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,\n    -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\n    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,\n    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,\n    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1\n};\n\n/* libssh2_base64_decode\n *\n * Decode a base64 chunk and store it into a newly alloc'd buffer\n */\nLIBSSH2_API int\nlibssh2_base64_decode(LIBSSH2_SESSION *session, char **data,\n                      unsigned int *datalen, const char *src,\n                      unsigned int src_len)\n{\n    unsigned char *s, *d;\n    short v;\n    int i = 0, len = 0;\n\n    *data = LIBSSH2_ALLOC(session, (3 * src_len / 4) + 1);\n    d = (unsigned char *) *data;\n    if(!d) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Unable to allocate memory for base64 decoding\");\n    }\n\n    for(s = (unsigned char *) src; ((char *) s) < (src + src_len); s++) {\n        v = base64_reverse_table[*s];\n        if(v < 0)\n            continue;\n        switch(i % 4) {\n        case 0:\n            d[len] = (unsigned char)(v << 2);\n            break;\n        case 1:\n            d[len++] |= v >> 4;\n            d[len] = (unsigned char)(v << 4);\n            break;\n        case 2:\n            d[len++] |= v >> 2;\n            d[len] = (unsigned char)(v << 6);\n            break;\n        case 3:\n            d[len++] |= v;\n            break;\n        }\n        i++;\n    }\n    if((i % 4) == 1) {\n        /* Invalid -- We have a byte which belongs exclusively to a partial\n           octet */\n        LIBSSH2_FREE(session, *data);\n        *data = NULL;\n        return _libssh2_error(session, LIBSSH2_ERROR_INVAL, \"Invalid base64\");\n    }\n\n    *datalen = len;\n    return 0;\n}\n\n/* ---- Base64 Encoding/Decoding Table --- */\nstatic const char table64[]=\n  \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n/*\n * _libssh2_base64_encode()\n *\n * Returns the length of the newly created base64 string. The third argument\n * is a pointer to an allocated area holding the base64 data. If something\n * went wrong, 0 is returned.\n *\n */\nsize_t _libssh2_base64_encode(LIBSSH2_SESSION *session,\n                              const char *inp, size_t insize, char **outptr)\n{\n    unsigned char ibuf[3];\n    unsigned char obuf[4];\n    int i;\n    int inputparts;\n    char *output;\n    char *base64data;\n    const char *indata = inp;\n\n    *outptr = NULL; /* set to NULL in case of failure before we reach the\n                       end */\n\n    if(0 == insize)\n        insize = strlen(indata);\n\n    base64data = output = LIBSSH2_ALLOC(session, insize * 4 / 3 + 4);\n    if(NULL == output)\n        return 0;\n\n    while(insize > 0) {\n        for(i = inputparts = 0; i < 3; i++) {\n            if(insize > 0) {\n                inputparts++;\n                ibuf[i] = *indata;\n                indata++;\n                insize--;\n            }\n            else\n                ibuf[i] = 0;\n        }\n\n        obuf[0] = (unsigned char)  ((ibuf[0] & 0xFC) >> 2);\n        obuf[1] = (unsigned char) (((ibuf[0] & 0x03) << 4) | \\\n                                   ((ibuf[1] & 0xF0) >> 4));\n        obuf[2] = (unsigned char) (((ibuf[1] & 0x0F) << 2) | \\\n                                   ((ibuf[2] & 0xC0) >> 6));\n        obuf[3] = (unsigned char)   (ibuf[2] & 0x3F);\n\n        switch(inputparts) {\n        case 1: /* only one byte read */\n            snprintf(output, 5, \"%c%c==\",\n                     table64[obuf[0]],\n                     table64[obuf[1]]);\n            break;\n        case 2: /* two bytes read */\n            snprintf(output, 5, \"%c%c%c=\",\n                     table64[obuf[0]],\n                     table64[obuf[1]],\n                     table64[obuf[2]]);\n            break;\n        default:\n            snprintf(output, 5, \"%c%c%c%c\",\n                     table64[obuf[0]],\n                     table64[obuf[1]],\n                     table64[obuf[2]],\n                     table64[obuf[3]]);\n            break;\n        }\n        output += 4;\n    }\n    *output = 0;\n    *outptr = base64data; /* make it return the actual data memory */\n\n    return strlen(base64data); /* return the length of the new data */\n}\n/* ---- End of Base64 Encoding ---- */\n\nLIBSSH2_API void\nlibssh2_free(LIBSSH2_SESSION *session, void *ptr)\n{\n    LIBSSH2_FREE(session, ptr);\n}\n\n#ifdef LIBSSH2DEBUG\n#include <stdarg.h>\n\nLIBSSH2_API int\nlibssh2_trace(LIBSSH2_SESSION * session, int bitmask)\n{\n    session->showmask = bitmask;\n    return 0;\n}\n\nLIBSSH2_API int\nlibssh2_trace_sethandler(LIBSSH2_SESSION *session, void *handler_context,\n                         libssh2_trace_handler_func callback)\n{\n    session->tracehandler = callback;\n    session->tracehandler_context = handler_context;\n    return 0;\n}\n\nvoid\n_libssh2_debug(LIBSSH2_SESSION * session, int context, const char *format, ...)\n{\n    char buffer[1536];\n    int len, msglen, buflen = sizeof(buffer);\n    va_list vargs;\n    struct timeval now;\n    static int firstsec;\n    static const char *const contexts[] = {\n        \"Unknown\",\n        \"Transport\",\n        \"Key Ex\",\n        \"Userauth\",\n        \"Conn\",\n        \"SCP\",\n        \"SFTP\",\n        \"Failure Event\",\n        \"Publickey\",\n        \"Socket\",\n    };\n    const char *contexttext = contexts[0];\n    unsigned int contextindex;\n\n    if(!(session->showmask & context)) {\n        /* no such output asked for */\n        return;\n    }\n\n    /* Find the first matching context string for this message */\n    for(contextindex = 0; contextindex < ARRAY_SIZE(contexts);\n         contextindex++) {\n        if((context & (1 << contextindex)) != 0) {\n            contexttext = contexts[contextindex];\n            break;\n        }\n    }\n\n    _libssh2_gettimeofday(&now, NULL);\n    if(!firstsec) {\n        firstsec = now.tv_sec;\n    }\n    now.tv_sec -= firstsec;\n\n    len = snprintf(buffer, buflen, \"[libssh2] %d.%06d %s: \",\n                   (int)now.tv_sec, (int)now.tv_usec, contexttext);\n\n    if(len >= buflen)\n        msglen = buflen - 1;\n    else {\n        buflen -= len;\n        msglen = len;\n        va_start(vargs, format);\n        len = vsnprintf(buffer + msglen, buflen, format, vargs);\n        va_end(vargs);\n        msglen += len < buflen ? len : buflen - 1;\n    }\n\n    if(session->tracehandler)\n        (session->tracehandler)(session, session->tracehandler_context, buffer,\n                                msglen);\n    else\n        fprintf(stderr, \"%s\\n\", buffer);\n}\n\n#else\nLIBSSH2_API int\nlibssh2_trace(LIBSSH2_SESSION * session, int bitmask)\n{\n    (void) session;\n    (void) bitmask;\n    return 0;\n}\n\nLIBSSH2_API int\nlibssh2_trace_sethandler(LIBSSH2_SESSION *session, void *handler_context,\n                         libssh2_trace_handler_func callback)\n{\n    (void) session;\n    (void) handler_context;\n    (void) callback;\n    return 0;\n}\n#endif\n\n/* init the list head */\nvoid _libssh2_list_init(struct list_head *head)\n{\n    head->first = head->last = NULL;\n}\n\n/* add a node to the list */\nvoid _libssh2_list_add(struct list_head *head,\n                       struct list_node *entry)\n{\n    /* store a pointer to the head */\n    entry->head = head;\n\n    /* we add this entry at the \"top\" so it has no next */\n    entry->next = NULL;\n\n    /* make our prev point to what the head thinks is last */\n    entry->prev = head->last;\n\n    /* and make head's last be us now */\n    head->last = entry;\n\n    /* make sure our 'prev' node points to us next */\n    if(entry->prev)\n        entry->prev->next = entry;\n    else\n        head->first = entry;\n}\n\n/* return the \"first\" node in the list this head points to */\nvoid *_libssh2_list_first(struct list_head *head)\n{\n    return head->first;\n}\n\n/* return the next node in the list */\nvoid *_libssh2_list_next(struct list_node *node)\n{\n    return node->next;\n}\n\n/* return the prev node in the list */\nvoid *_libssh2_list_prev(struct list_node *node)\n{\n    return node->prev;\n}\n\n/* remove this node from the list */\nvoid _libssh2_list_remove(struct list_node *entry)\n{\n    if(entry->prev)\n        entry->prev->next = entry->next;\n    else\n        entry->head->first = entry->next;\n\n    if(entry->next)\n        entry->next->prev = entry->prev;\n    else\n        entry->head->last = entry->prev;\n}\n\n#if 0\n/* insert a node before the given 'after' entry */\nvoid _libssh2_list_insert(struct list_node *after, /* insert before this */\n                          struct list_node *entry)\n{\n    /* 'after' is next to 'entry' */\n    bentry->next = after;\n\n    /* entry's prev is then made to be the prev after current has */\n    entry->prev = after->prev;\n\n    /* the node that is now before 'entry' was previously before 'after'\n       and must be made to point to 'entry' correctly */\n    if(entry->prev)\n        entry->prev->next = entry;\n    else\n      /* there was no node before this, so we make sure we point the head\n         pointer to this node */\n      after->head->first = entry;\n\n    /* after's prev entry points back to entry */\n    after->prev = entry;\n\n    /* after's next entry is still the same as before */\n\n    /* entry's head is the same as after's */\n    entry->head = after->head;\n}\n\n#endif\n\n/* this define is defined in misc.h for the correct platforms */\n#ifdef LIBSSH2_GETTIMEOFDAY_WIN32\n/*\n * gettimeofday\n * Implementation according to:\n * The Open Group Base Specifications Issue 6\n * IEEE Std 1003.1, 2004 Edition\n */\n\n/*\n *  THIS SOFTWARE IS NOT COPYRIGHTED\n *\n *  This source code is offered for use in the public domain. You may\n *  use, modify or distribute it freely.\n *\n *  This code is distributed in the hope that it will be useful but\n *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY\n *  DISCLAIMED. This includes but is not limited to warranties of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n *\n *  Contributed by:\n *  Danny Smith <dannysmith@users.sourceforge.net>\n */\n\n/* Offset between 1/1/1601 and 1/1/1970 in 100 nanosec units */\n#define _W32_FT_OFFSET (116444736000000000)\n\nint __cdecl _libssh2_gettimeofday(struct timeval *tp, void *tzp)\n{\n    union {\n        unsigned __int64 ns100; /*time since 1 Jan 1601 in 100ns units */\n        FILETIME ft;\n    } _now;\n    (void)tzp;\n    if(tp) {\n        GetSystemTimeAsFileTime(&_now.ft);\n        tp->tv_usec = (long)((_now.ns100 / 10) % 1000000);\n        tp->tv_sec = (long)((_now.ns100 - _W32_FT_OFFSET) / 10000000);\n    }\n    /* Always return 0 as per Open Group Base Specifications Issue 6.\n       Do not set errno on error.  */\n    return 0;\n}\n\n\n#endif\n\nvoid *_libssh2_calloc(LIBSSH2_SESSION* session, size_t size)\n{\n    void *p = LIBSSH2_ALLOC(session, size);\n    if(p) {\n        memset(p, 0, size);\n    }\n    return p;\n}\n\n/* XOR operation on buffers input1 and input2, result in output.\n   It is safe to use an input buffer as the output buffer. */\nvoid _libssh2_xor_data(unsigned char *output,\n                       const unsigned char *input1,\n                       const unsigned char *input2,\n                       size_t length)\n{\n    size_t i;\n\n    for(i = 0; i < length; i++)\n        *output++ = *input1++ ^ *input2++;\n}\n\n/* Increments an AES CTR buffer to prepare it for use with the\n   next AES block. */\nvoid _libssh2_aes_ctr_increment(unsigned char *ctr,\n                                size_t length)\n{\n    unsigned char *pc;\n    unsigned int val, carry;\n\n    pc = ctr + length - 1;\n    carry = 1;\n\n    while(pc >= ctr) {\n        val = (unsigned int)*pc + carry;\n        *pc-- = val & 0xFF;\n        carry = val >> 8;\n    }\n}\n\n#ifdef WIN32\nstatic void * (__cdecl * const volatile memset_libssh)(void *, int, size_t) =\n    memset;\n#else\nstatic void * (* const volatile memset_libssh)(void *, int, size_t) = memset;\n#endif\n\nvoid _libssh2_explicit_zero(void *buf, size_t size)\n{\n#if defined(HAVE_DECL_SECUREZEROMEMORY) && HAVE_DECL_SECUREZEROMEMORY\n    SecureZeroMemory(buf, size);\n    (void)memset_libssh; /* Silence unused variable warning */\n#elif defined(HAVE_MEMSET_S)\n    (void)memset_s(buf, size, 0, size);\n    (void)memset_libssh; /* Silence unused variable warning */\n#else\n    memset_libssh(buf, 0, size);\n#endif\n}\n\n/* String buffer */\n\nstruct string_buf* _libssh2_string_buf_new(LIBSSH2_SESSION *session)\n{\n    struct string_buf *ret;\n\n    ret = _libssh2_calloc(session, sizeof(*ret));\n    if(ret == NULL)\n        return NULL;\n\n    return ret;\n}\n\nvoid _libssh2_string_buf_free(LIBSSH2_SESSION *session, struct string_buf *buf)\n{\n    if(buf == NULL)\n        return;\n\n    if(buf->data != NULL)\n        LIBSSH2_FREE(session, buf->data);\n\n    LIBSSH2_FREE(session, buf);\n    buf = NULL;\n}\n\nint _libssh2_get_u32(struct string_buf *buf, uint32_t *out)\n{\n    if(!_libssh2_check_length(buf, 4)) {\n        return -1;\n    }\n\n    *out = _libssh2_ntohu32(buf->dataptr);\n    buf->dataptr += 4;\n    return 0;\n}\n\nint _libssh2_get_u64(struct string_buf *buf, libssh2_uint64_t *out)\n{\n    if(!_libssh2_check_length(buf, 8)) {\n        return -1;\n    }\n\n    *out = _libssh2_ntohu64(buf->dataptr);\n    buf->dataptr += 8;\n    return 0;\n}\n\nint _libssh2_match_string(struct string_buf *buf, const char *match)\n{\n    unsigned char *out;\n    size_t len = 0;\n    if(_libssh2_get_string(buf, &out, &len) || len != strlen(match) ||\n        strncmp((char *)out, match, strlen(match)) != 0) {\n        return -1;\n    }\n    return 0;\n}\n\nint _libssh2_get_string(struct string_buf *buf, unsigned char **outbuf,\n                        size_t *outlen)\n{\n    uint32_t data_len;\n    if(_libssh2_get_u32(buf, &data_len) != 0) {\n        return -1;\n    }\n    if(!_libssh2_check_length(buf, data_len)) {\n        return -1;\n    }\n    *outbuf = buf->dataptr;\n    buf->dataptr += data_len;\n\n    if(outlen)\n        *outlen = (size_t)data_len;\n\n    return 0;\n}\n\nint _libssh2_copy_string(LIBSSH2_SESSION *session, struct string_buf *buf,\n                         unsigned char **outbuf, size_t *outlen)\n{\n    size_t str_len;\n    unsigned char *str;\n\n    if(_libssh2_get_string(buf, &str, &str_len)) {\n        return -1;\n    }\n\n    *outbuf = LIBSSH2_ALLOC(session, str_len);\n    if(*outbuf) {\n        memcpy(*outbuf, str, str_len);\n    }\n    else {\n        return -1;\n    }\n\n    if(outlen)\n        *outlen = str_len;\n\n    return 0;\n}\n\nint _libssh2_get_bignum_bytes(struct string_buf *buf, unsigned char **outbuf,\n                              size_t *outlen)\n{\n    uint32_t data_len;\n    uint32_t bn_len;\n    unsigned char *bnptr;\n\n    if(_libssh2_get_u32(buf, &data_len)) {\n        return -1;\n    }\n    if(!_libssh2_check_length(buf, data_len)) {\n        return -1;\n    }\n\n    bn_len = data_len;\n    bnptr = buf->dataptr;\n\n    /* trim leading zeros */\n    while(bn_len > 0 && *bnptr == 0x00) {\n        bn_len--;\n        bnptr++;\n    }\n\n    *outbuf = bnptr;\n    buf->dataptr += data_len;\n\n    if(outlen)\n        *outlen = (size_t)bn_len;\n\n    return 0;\n}\n\n/* Given the current location in buf, _libssh2_check_length ensures\n   callers can read the next len number of bytes out of the buffer\n   before reading the buffer content */\n\nint _libssh2_check_length(struct string_buf *buf, size_t len)\n{\n    unsigned char *endp = &buf->data[buf->len];\n    size_t left = endp - buf->dataptr;\n    return ((len <= left) && (left <= buf->len));\n}\n\n/* Wrappers */\n\nint _libssh2_bcrypt_pbkdf(const char *pass,\n                          size_t passlen,\n                          const uint8_t *salt,\n                          size_t saltlen,\n                          uint8_t *key,\n                          size_t keylen,\n                          unsigned int rounds)\n{\n    /* defined in bcrypt_pbkdf.c */\n    return bcrypt_pbkdf(pass,\n                        passlen,\n                        salt,\n                        saltlen,\n                        key,\n                        keylen,\n                        rounds);\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/misc.h",
    "content": "#ifndef __LIBSSH2_MISC_H\n#define __LIBSSH2_MISC_H\n/* Copyright (c) 2009-2019 by Daniel Stenberg\n *\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\nstruct list_head {\n    struct list_node *last;\n    struct list_node *first;\n};\n\nstruct list_node {\n    struct list_node *next;\n    struct list_node *prev;\n    struct list_head *head;\n};\n\nstruct string_buf {\n    unsigned char *data;\n    unsigned char *dataptr;\n    size_t len;\n};\n\nint _libssh2_error_flags(LIBSSH2_SESSION* session, int errcode,\n                         const char *errmsg, int errflags);\nint _libssh2_error(LIBSSH2_SESSION* session, int errcode, const char *errmsg);\n\nvoid _libssh2_list_init(struct list_head *head);\n\n/* add a node last in the list */\nvoid _libssh2_list_add(struct list_head *head,\n                       struct list_node *entry);\n\n/* return the \"first\" node in the list this head points to */\nvoid *_libssh2_list_first(struct list_head *head);\n\n/* return the next node in the list */\nvoid *_libssh2_list_next(struct list_node *node);\n\n/* return the prev node in the list */\nvoid *_libssh2_list_prev(struct list_node *node);\n\n/* remove this node from the list */\nvoid _libssh2_list_remove(struct list_node *entry);\n\nsize_t _libssh2_base64_encode(LIBSSH2_SESSION *session,\n                              const char *inp, size_t insize, char **outptr);\n\nunsigned int _libssh2_ntohu32(const unsigned char *buf);\nlibssh2_uint64_t _libssh2_ntohu64(const unsigned char *buf);\nvoid _libssh2_htonu32(unsigned char *buf, uint32_t val);\nvoid _libssh2_store_u32(unsigned char **buf, uint32_t value);\nvoid _libssh2_store_str(unsigned char **buf, const char *str, size_t len);\nvoid *_libssh2_calloc(LIBSSH2_SESSION *session, size_t size);\nvoid _libssh2_explicit_zero(void *buf, size_t size);\n\nstruct string_buf* _libssh2_string_buf_new(LIBSSH2_SESSION *session);\nvoid _libssh2_string_buf_free(LIBSSH2_SESSION *session,\n                              struct string_buf *buf);\nint _libssh2_get_u32(struct string_buf *buf, uint32_t *out);\nint _libssh2_get_u64(struct string_buf *buf, libssh2_uint64_t *out);\nint _libssh2_match_string(struct string_buf *buf, const char *match);\nint _libssh2_get_string(struct string_buf *buf, unsigned char **outbuf,\n                        size_t *outlen);\nint _libssh2_copy_string(LIBSSH2_SESSION* session, struct string_buf *buf,\n                         unsigned char **outbuf, size_t *outlen);\nint _libssh2_get_bignum_bytes(struct string_buf *buf, unsigned char **outbuf,\n                              size_t *outlen);\nint _libssh2_check_length(struct string_buf *buf, size_t requested_len);\n\n#if defined(LIBSSH2_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)\n/* provide a private one */\n#undef HAVE_GETTIMEOFDAY\nint __cdecl _libssh2_gettimeofday(struct timeval *tp, void *tzp);\n#define HAVE_LIBSSH2_GETTIMEOFDAY\n#define LIBSSH2_GETTIMEOFDAY_WIN32 /* enable the win32 implementation */\n#else\n#ifdef HAVE_GETTIMEOFDAY\n#define _libssh2_gettimeofday(x,y) gettimeofday(x,y)\n#define HAVE_LIBSSH2_GETTIMEOFDAY\n#endif\n#endif\n\nvoid _libssh2_xor_data(unsigned char *output,\n                       const unsigned char *input1,\n                       const unsigned char *input2,\n                       size_t length);\n\nvoid _libssh2_aes_ctr_increment(unsigned char *ctr, size_t length);\n\n#endif /* _LIBSSH2_MISC_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/openssl.c",
    "content": "/* Copyright (C) 2009, 2010 Simon Josefsson\n * Copyright (C) 2006, 2007 The Written Word, Inc.  All rights reserved.\n * Copyright (c) 2004-2006, Sara Golemon <sarag@libssh2.org>\n *\n * Author: Simon Josefsson\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\n#ifdef LIBSSH2_OPENSSL /* compile only if we build with openssl */\n\n#include <string.h>\n#include \"misc.h\"\n\n#ifndef EVP_MAX_BLOCK_LENGTH\n#define EVP_MAX_BLOCK_LENGTH 32\n#endif\n\nint\nread_openssh_private_key_from_memory(void **key_ctx, LIBSSH2_SESSION *session,\n                                     const char *key_type,\n                                     const char *filedata,\n                                     size_t filedata_len,\n                                     unsigned const char *passphrase);\n\nstatic unsigned char *\nwrite_bn(unsigned char *buf, const BIGNUM *bn, int bn_bytes)\n{\n    unsigned char *p = buf;\n\n    /* Left space for bn size which will be written below. */\n    p += 4;\n\n    *p = 0;\n    BN_bn2bin(bn, p + 1);\n    if(!(*(p + 1) & 0x80)) {\n        memmove(p, p + 1, --bn_bytes);\n    }\n    _libssh2_htonu32(p - 4, bn_bytes);  /* Post write bn size. */\n\n    return p + bn_bytes;\n}\n\nint\n_libssh2_rsa_new(libssh2_rsa_ctx ** rsa,\n                 const unsigned char *edata,\n                 unsigned long elen,\n                 const unsigned char *ndata,\n                 unsigned long nlen,\n                 const unsigned char *ddata,\n                 unsigned long dlen,\n                 const unsigned char *pdata,\n                 unsigned long plen,\n                 const unsigned char *qdata,\n                 unsigned long qlen,\n                 const unsigned char *e1data,\n                 unsigned long e1len,\n                 const unsigned char *e2data,\n                 unsigned long e2len,\n                 const unsigned char *coeffdata, unsigned long coefflen)\n{\n    BIGNUM * e;\n    BIGNUM * n;\n    BIGNUM * d = 0;\n    BIGNUM * p = 0;\n    BIGNUM * q = 0;\n    BIGNUM * dmp1 = 0;\n    BIGNUM * dmq1 = 0;\n    BIGNUM * iqmp = 0;\n\n    e = BN_new();\n    BN_bin2bn(edata, elen, e);\n\n    n = BN_new();\n    BN_bin2bn(ndata, nlen, n);\n\n    if(ddata) {\n        d = BN_new();\n        BN_bin2bn(ddata, dlen, d);\n\n        p = BN_new();\n        BN_bin2bn(pdata, plen, p);\n\n        q = BN_new();\n        BN_bin2bn(qdata, qlen, q);\n\n        dmp1 = BN_new();\n        BN_bin2bn(e1data, e1len, dmp1);\n\n        dmq1 = BN_new();\n        BN_bin2bn(e2data, e2len, dmq1);\n\n        iqmp = BN_new();\n        BN_bin2bn(coeffdata, coefflen, iqmp);\n    }\n\n    *rsa = RSA_new();\n#ifdef HAVE_OPAQUE_STRUCTS\n    RSA_set0_key(*rsa, n, e, d);\n#else\n    (*rsa)->e = e;\n    (*rsa)->n = n;\n    (*rsa)->d = d;\n#endif\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    RSA_set0_factors(*rsa, p, q);\n#else\n    (*rsa)->p = p;\n    (*rsa)->q = q;\n#endif\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    RSA_set0_crt_params(*rsa, dmp1, dmq1, iqmp);\n#else\n    (*rsa)->dmp1 = dmp1;\n    (*rsa)->dmq1 = dmq1;\n    (*rsa)->iqmp = iqmp;\n#endif\n    return 0;\n}\n\nint\n_libssh2_rsa_sha1_verify(libssh2_rsa_ctx * rsactx,\n                         const unsigned char *sig,\n                         unsigned long sig_len,\n                         const unsigned char *m, unsigned long m_len)\n{\n    unsigned char hash[SHA_DIGEST_LENGTH];\n    int ret;\n\n    if(_libssh2_sha1(m, m_len, hash))\n        return -1; /* failure */\n    ret = RSA_verify(NID_sha1, hash, SHA_DIGEST_LENGTH,\n                     (unsigned char *) sig, sig_len, rsactx);\n    return (ret == 1) ? 0 : -1;\n}\n\n#if LIBSSH2_DSA\nint\n_libssh2_dsa_new(libssh2_dsa_ctx ** dsactx,\n                 const unsigned char *p,\n                 unsigned long p_len,\n                 const unsigned char *q,\n                 unsigned long q_len,\n                 const unsigned char *g,\n                 unsigned long g_len,\n                 const unsigned char *y,\n                 unsigned long y_len,\n                 const unsigned char *x, unsigned long x_len)\n{\n    BIGNUM * p_bn;\n    BIGNUM * q_bn;\n    BIGNUM * g_bn;\n    BIGNUM * pub_key;\n    BIGNUM * priv_key = NULL;\n\n    p_bn = BN_new();\n    BN_bin2bn(p, p_len, p_bn);\n\n    q_bn = BN_new();\n    BN_bin2bn(q, q_len, q_bn);\n\n    g_bn = BN_new();\n    BN_bin2bn(g, g_len, g_bn);\n\n    pub_key = BN_new();\n    BN_bin2bn(y, y_len, pub_key);\n\n    if(x_len) {\n        priv_key = BN_new();\n        BN_bin2bn(x, x_len, priv_key);\n    }\n\n    *dsactx = DSA_new();\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    DSA_set0_pqg(*dsactx, p_bn, q_bn, g_bn);\n#else\n    (*dsactx)->p = p_bn;\n    (*dsactx)->g = g_bn;\n    (*dsactx)->q = q_bn;\n#endif\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    DSA_set0_key(*dsactx, pub_key, priv_key);\n#else\n    (*dsactx)->pub_key = pub_key;\n    (*dsactx)->priv_key = priv_key;\n#endif\n    return 0;\n}\n\nint\n_libssh2_dsa_sha1_verify(libssh2_dsa_ctx * dsactx,\n                         const unsigned char *sig,\n                         const unsigned char *m, unsigned long m_len)\n{\n    unsigned char hash[SHA_DIGEST_LENGTH];\n    DSA_SIG * dsasig;\n    BIGNUM * r;\n    BIGNUM * s;\n    int ret = -1;\n\n    r = BN_new();\n    BN_bin2bn(sig, 20, r);\n    s = BN_new();\n    BN_bin2bn(sig + 20, 20, s);\n\n    dsasig = DSA_SIG_new();\n#ifdef HAVE_OPAQUE_STRUCTS\n    DSA_SIG_set0(dsasig, r, s);\n#else\n    dsasig->r = r;\n    dsasig->s = s;\n#endif\n    if(!_libssh2_sha1(m, m_len, hash))\n        /* _libssh2_sha1() succeeded */\n        ret = DSA_do_verify(hash, SHA_DIGEST_LENGTH, dsasig, dsactx);\n\n    DSA_SIG_free(dsasig);\n\n    return (ret == 1) ? 0 : -1;\n}\n#endif /* LIBSSH_DSA */\n\n#if LIBSSH2_ECDSA\n\n/* _libssh2_ecdsa_key_get_curve_type\n *\n * returns key curve type that maps to libssh2_curve_type\n *\n */\n\nlibssh2_curve_type\n_libssh2_ecdsa_key_get_curve_type(_libssh2_ec_key *key)\n{\n    const EC_GROUP *group = EC_KEY_get0_group(key);\n    return EC_GROUP_get_curve_name(group);\n}\n\n/* _libssh2_ecdsa_curve_type_from_name\n *\n * returns 0 for success, key curve type that maps to libssh2_curve_type\n *\n */\n\nint\n_libssh2_ecdsa_curve_type_from_name(const char *name,\n                                    libssh2_curve_type *out_type)\n{\n    int ret = 0;\n    libssh2_curve_type type;\n\n    if(name == NULL || strlen(name) != 19)\n        return -1;\n\n    if(strcmp(name, \"ecdsa-sha2-nistp256\") == 0)\n        type = LIBSSH2_EC_CURVE_NISTP256;\n    else if(strcmp(name, \"ecdsa-sha2-nistp384\") == 0)\n        type = LIBSSH2_EC_CURVE_NISTP384;\n    else if(strcmp(name, \"ecdsa-sha2-nistp521\") == 0)\n        type = LIBSSH2_EC_CURVE_NISTP521;\n    else {\n        ret = -1;\n    }\n\n    if(ret == 0 && out_type) {\n        *out_type = type;\n    }\n\n    return ret;\n}\n\n/* _libssh2_ecdsa_curve_name_with_octal_new\n *\n * Creates a new public key given an octal string, length and type\n *\n */\n\nint\n_libssh2_ecdsa_curve_name_with_octal_new(libssh2_ecdsa_ctx ** ec_ctx,\n     const unsigned char *k,\n     size_t k_len, libssh2_curve_type curve)\n{\n\n    int ret = 0;\n    const EC_GROUP *ec_group = NULL;\n    EC_KEY *ec_key = EC_KEY_new_by_curve_name(curve);\n    EC_POINT *point = NULL;\n\n    if(ec_key) {\n        ec_group = EC_KEY_get0_group(ec_key);\n        point = EC_POINT_new(ec_group);\n        ret = EC_POINT_oct2point(ec_group, point, k, k_len, NULL);\n        ret = EC_KEY_set_public_key(ec_key, point);\n\n        if(point != NULL)\n            EC_POINT_free(point);\n\n        if(ec_ctx != NULL)\n            *ec_ctx = ec_key;\n    }\n\n    return (ret == 1) ? 0 : -1;\n}\n\n#define LIBSSH2_ECDSA_VERIFY(digest_type)                           \\\n{                                                                   \\\n    unsigned char hash[SHA##digest_type##_DIGEST_LENGTH];           \\\n    libssh2_sha##digest_type(m, m_len, hash);                       \\\n    ret = ECDSA_do_verify(hash, SHA##digest_type##_DIGEST_LENGTH,   \\\n      ecdsa_sig, ec_key);                                           \\\n                                                                    \\\n}\n\nint\n_libssh2_ecdsa_verify(libssh2_ecdsa_ctx * ctx,\n      const unsigned char *r, size_t r_len,\n      const unsigned char *s, size_t s_len,\n      const unsigned char *m, size_t m_len)\n{\n    int ret = 0;\n    EC_KEY *ec_key = (EC_KEY*)ctx;\n    libssh2_curve_type type = _libssh2_ecdsa_key_get_curve_type(ec_key);\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    ECDSA_SIG *ecdsa_sig = ECDSA_SIG_new();\n    BIGNUM *pr = BN_new();\n    BIGNUM *ps = BN_new();\n\n    BN_bin2bn(r, r_len, pr);\n    BN_bin2bn(s, s_len, ps);\n    ECDSA_SIG_set0(ecdsa_sig, pr, ps);\n\n#else\n    ECDSA_SIG ecdsa_sig_;\n    ECDSA_SIG *ecdsa_sig = &ecdsa_sig_;\n    ecdsa_sig_.r = BN_new();\n    BN_bin2bn(r, r_len, ecdsa_sig_.r);\n    ecdsa_sig_.s = BN_new();\n    BN_bin2bn(s, s_len, ecdsa_sig_.s);\n#endif\n\n    if(type == LIBSSH2_EC_CURVE_NISTP256) {\n        LIBSSH2_ECDSA_VERIFY(256);\n    }\n    else if(type == LIBSSH2_EC_CURVE_NISTP384) {\n        LIBSSH2_ECDSA_VERIFY(384);\n    }\n    else if(type == LIBSSH2_EC_CURVE_NISTP521) {\n        LIBSSH2_ECDSA_VERIFY(512);\n    }\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    if(ecdsa_sig)\n        ECDSA_SIG_free(ecdsa_sig);\n#else\n    BN_clear_free(ecdsa_sig_.s);\n    BN_clear_free(ecdsa_sig_.r);\n#endif\n\n    return (ret == 1) ? 0 : -1;\n}\n\n#endif /* LIBSSH2_ECDSA */\n\nint\n_libssh2_cipher_init(_libssh2_cipher_ctx * h,\n                     _libssh2_cipher_type(algo),\n                     unsigned char *iv, unsigned char *secret, int encrypt)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    *h = EVP_CIPHER_CTX_new();\n    return !EVP_CipherInit(*h, algo(), secret, iv, encrypt);\n#else\n    EVP_CIPHER_CTX_init(h);\n    return !EVP_CipherInit(h, algo(), secret, iv, encrypt);\n#endif\n}\n\nint\n_libssh2_cipher_crypt(_libssh2_cipher_ctx * ctx,\n                      _libssh2_cipher_type(algo),\n                      int encrypt, unsigned char *block, size_t blocksize)\n{\n    unsigned char buf[EVP_MAX_BLOCK_LENGTH];\n    int ret;\n    (void) algo;\n    (void) encrypt;\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    ret = EVP_Cipher(*ctx, buf, block, blocksize);\n#else\n    ret = EVP_Cipher(ctx, buf, block, blocksize);\n#endif\n    if(ret == 1) {\n        memcpy(block, buf, blocksize);\n    }\n    return ret == 1 ? 0 : 1;\n}\n\n#if LIBSSH2_AES_CTR && !defined(HAVE_EVP_AES_128_CTR)\n\n#include <openssl/aes.h>\n#include <openssl/evp.h>\n\ntypedef struct\n{\n    AES_KEY       key;\n    EVP_CIPHER_CTX *aes_ctx;\n    unsigned char ctr[AES_BLOCK_SIZE];\n} aes_ctr_ctx;\n\nstatic int\naes_ctr_init(EVP_CIPHER_CTX *ctx, const unsigned char *key,\n             const unsigned char *iv, int enc) /* init key */\n{\n    /*\n     * variable \"c\" is leaked from this scope, but is later freed\n     * in aes_ctr_cleanup\n     */\n    aes_ctr_ctx *c;\n    const EVP_CIPHER *aes_cipher;\n    (void) enc;\n\n    switch(EVP_CIPHER_CTX_key_length(ctx)) {\n    case 16:\n        aes_cipher = EVP_aes_128_ecb();\n        break;\n    case 24:\n        aes_cipher = EVP_aes_192_ecb();\n        break;\n    case 32:\n        aes_cipher = EVP_aes_256_ecb();\n        break;\n    default:\n        return 0;\n    }\n\n    c = malloc(sizeof(*c));\n    if(c == NULL)\n        return 0;\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    c->aes_ctx = EVP_CIPHER_CTX_new();\n#else\n    c->aes_ctx = malloc(sizeof(EVP_CIPHER_CTX));\n#endif\n    if(c->aes_ctx == NULL) {\n        free(c);\n        return 0;\n    }\n\n    if(EVP_EncryptInit(c->aes_ctx, aes_cipher, key, NULL) != 1) {\n#ifdef HAVE_OPAQUE_STRUCTS\n        EVP_CIPHER_CTX_free(c->aes_ctx);\n#else\n        free(c->aes_ctx);\n#endif\n        free(c);\n        return 0;\n    }\n\n    EVP_CIPHER_CTX_set_padding(c->aes_ctx, 0);\n\n    memcpy(c->ctr, iv, AES_BLOCK_SIZE);\n\n    EVP_CIPHER_CTX_set_app_data(ctx, c);\n\n    return 1;\n}\n\nstatic int\naes_ctr_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,\n                  const unsigned char *in,\n                  size_t inl) /* encrypt/decrypt data */\n{\n    aes_ctr_ctx *c = EVP_CIPHER_CTX_get_app_data(ctx);\n    unsigned char b1[AES_BLOCK_SIZE];\n    int outlen = 0;\n\n    if(inl != 16) /* libssh2 only ever encrypt one block */\n        return 0;\n\n    if(c == NULL) {\n        return 0;\n    }\n\n/*\n  To encrypt a packet P=P1||P2||...||Pn (where P1, P2, ..., Pn are each\n  blocks of length L), the encryptor first encrypts <X> with <cipher>\n  to obtain a block B1.  The block B1 is then XORed with P1 to generate\n  the ciphertext block C1.  The counter X is then incremented\n*/\n\n    if(EVP_EncryptUpdate(c->aes_ctx, b1, &outlen,\n                         c->ctr, AES_BLOCK_SIZE) != 1) {\n        return 0;\n    }\n\n    _libssh2_xor_data(out, in, b1, AES_BLOCK_SIZE);\n    _libssh2_aes_ctr_increment(c->ctr, AES_BLOCK_SIZE);\n\n    return 1;\n}\n\nstatic int\naes_ctr_cleanup(EVP_CIPHER_CTX *ctx) /* cleanup ctx */\n{\n    aes_ctr_ctx *c = EVP_CIPHER_CTX_get_app_data(ctx);\n\n    if(c == NULL) {\n        return 1;\n    }\n\n    if(c->aes_ctx != NULL) {\n#ifdef HAVE_OPAQUE_STRUCTS\n        EVP_CIPHER_CTX_free(c->aes_ctx);\n#else\n        _libssh2_cipher_dtor(c->aes_ctx);\n        free(c->aes_ctx);\n#endif\n    }\n\n    free(c);\n\n    return 1;\n}\n\nstatic const EVP_CIPHER *\nmake_ctr_evp (size_t keylen, EVP_CIPHER **aes_ctr_cipher, int type)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    *aes_ctr_cipher = EVP_CIPHER_meth_new(type, 16, keylen);\n    if(*aes_ctr_cipher) {\n        EVP_CIPHER_meth_set_iv_length(*aes_ctr_cipher, 16);\n        EVP_CIPHER_meth_set_init(*aes_ctr_cipher, aes_ctr_init);\n        EVP_CIPHER_meth_set_do_cipher(*aes_ctr_cipher, aes_ctr_do_cipher);\n        EVP_CIPHER_meth_set_cleanup(*aes_ctr_cipher, aes_ctr_cleanup);\n    }\n#else\n    (*aes_ctr_cipher)->nid = type;\n    (*aes_ctr_cipher)->block_size = 16;\n    (*aes_ctr_cipher)->key_len = keylen;\n    (*aes_ctr_cipher)->iv_len = 16;\n    (*aes_ctr_cipher)->init = aes_ctr_init;\n    (*aes_ctr_cipher)->do_cipher = aes_ctr_do_cipher;\n    (*aes_ctr_cipher)->cleanup = aes_ctr_cleanup;\n#endif\n\n    return *aes_ctr_cipher;\n}\n\nconst EVP_CIPHER *\n_libssh2_EVP_aes_128_ctr(void)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    static EVP_CIPHER * aes_ctr_cipher;\n    return !aes_ctr_cipher ?\n        make_ctr_evp(16, &aes_ctr_cipher, NID_aes_128_ctr) : aes_ctr_cipher;\n#else\n    static EVP_CIPHER aes_ctr_cipher;\n    static EVP_CIPHER * aes_ctr_cipher_ptr = &aes_ctr_cipher;\n    return !aes_ctr_cipher.key_len ?\n        make_ctr_evp(16, &aes_ctr_cipher_ptr, 0) : &aes_ctr_cipher;\n#endif\n}\n\nconst EVP_CIPHER *\n_libssh2_EVP_aes_192_ctr(void)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    static EVP_CIPHER * aes_ctr_cipher;\n    return !aes_ctr_cipher ?\n        make_ctr_evp(24, &aes_ctr_cipher, NID_aes_192_ctr) : aes_ctr_cipher;\n#else\n    static EVP_CIPHER aes_ctr_cipher;\n    static EVP_CIPHER * aes_ctr_cipher_ptr = &aes_ctr_cipher;\n    return !aes_ctr_cipher.key_len ?\n        make_ctr_evp(24, &aes_ctr_cipher_ptr, 0) : &aes_ctr_cipher;\n#endif\n}\n\nconst EVP_CIPHER *\n_libssh2_EVP_aes_256_ctr(void)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    static EVP_CIPHER * aes_ctr_cipher;\n    return !aes_ctr_cipher ?\n        make_ctr_evp(32, &aes_ctr_cipher, NID_aes_256_ctr) : aes_ctr_cipher;\n#else\n    static EVP_CIPHER aes_ctr_cipher;\n    static EVP_CIPHER * aes_ctr_cipher_ptr = &aes_ctr_cipher;\n    return !aes_ctr_cipher.key_len ?\n        make_ctr_evp(32, &aes_ctr_cipher_ptr, 0) : &aes_ctr_cipher;\n#endif\n}\n\n#endif /* LIBSSH2_AES_CTR */\n\n#ifndef HAVE_EVP_AES_128_CTR\nstatic EVP_CIPHER * aes_128_ctr_cipher = NULL;\nstatic EVP_CIPHER * aes_192_ctr_cipher = NULL;\nstatic EVP_CIPHER * aes_256_ctr_cipher = NULL;\n#endif\n\nvoid _libssh2_openssl_crypto_init(void)\n{\n#if OPENSSL_VERSION_NUMBER >= 0x10100000L && \\\n    !defined(LIBRESSL_VERSION_NUMBER)\n#ifndef OPENSSL_NO_ENGINE\n    ENGINE_load_builtin_engines();\n    ENGINE_register_all_complete();\n#endif\n#else\n    OpenSSL_add_all_algorithms();\n    OpenSSL_add_all_ciphers();\n    OpenSSL_add_all_digests();\n#ifndef OPENSSL_NO_ENGINE\n    ENGINE_load_builtin_engines();\n    ENGINE_register_all_complete();\n#endif\n#endif\n#ifndef HAVE_EVP_AES_128_CTR\n    aes_128_ctr_cipher = (EVP_CIPHER *)_libssh2_EVP_aes_128_ctr();\n    aes_192_ctr_cipher = (EVP_CIPHER *)_libssh2_EVP_aes_192_ctr();\n    aes_256_ctr_cipher = (EVP_CIPHER *)_libssh2_EVP_aes_256_ctr();\n#endif\n}\n\nvoid _libssh2_openssl_crypto_exit(void)\n{\n#ifndef HAVE_EVP_AES_128_CTR\n#ifdef HAVE_OPAQUE_STRUCTS\n    if(aes_128_ctr_cipher) {\n        EVP_CIPHER_meth_free(aes_128_ctr_cipher);\n    }\n\n    if(aes_192_ctr_cipher) {\n        EVP_CIPHER_meth_free(aes_192_ctr_cipher);\n    }\n\n    if(aes_256_ctr_cipher) {\n        EVP_CIPHER_meth_free(aes_256_ctr_cipher);\n    }\n#endif\n\n    aes_128_ctr_cipher = NULL;\n    aes_192_ctr_cipher = NULL;\n    aes_256_ctr_cipher = NULL;\n#endif\n}\n\n/* TODO: Optionally call a passphrase callback specified by the\n * calling program\n */\nstatic int\npassphrase_cb(char *buf, int size, int rwflag, char *passphrase)\n{\n    int passphrase_len = strlen(passphrase);\n    (void) rwflag;\n\n    if(passphrase_len > (size - 1)) {\n        passphrase_len = size - 1;\n    }\n    memcpy(buf, passphrase, passphrase_len);\n    buf[passphrase_len] = '\\0';\n\n    return passphrase_len;\n}\n\ntypedef void * (*pem_read_bio_func)(BIO *, void **, pem_password_cb *,\n                                    void *u);\n\nstatic int\nread_private_key_from_memory(void **key_ctx,\n                             pem_read_bio_func read_private_key,\n                             const char *filedata,\n                             size_t filedata_len,\n                             unsigned const char *passphrase)\n{\n    BIO * bp;\n\n    *key_ctx = NULL;\n\n    bp = BIO_new_mem_buf((char *)filedata, filedata_len);\n    if(!bp) {\n        return -1;\n    }\n    *key_ctx = read_private_key(bp, NULL, (pem_password_cb *) passphrase_cb,\n                                (void *) passphrase);\n\n    BIO_free(bp);\n    return (*key_ctx) ? 0 : -1;\n}\n\n\n\nstatic int\nread_private_key_from_file(void **key_ctx,\n                           pem_read_bio_func read_private_key,\n                           const char *filename,\n                           unsigned const char *passphrase)\n{\n    BIO * bp;\n\n    *key_ctx = NULL;\n\n    bp = BIO_new_file(filename, \"r\");\n    if(!bp) {\n        return -1;\n    }\n\n    *key_ctx = read_private_key(bp, NULL, (pem_password_cb *) passphrase_cb,\n                                (void *) passphrase);\n\n    BIO_free(bp);\n    return (*key_ctx) ? 0 : -1;\n}\n\nint\n_libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx ** rsa,\n                                    LIBSSH2_SESSION * session,\n                                    const char *filedata, size_t filedata_len,\n                                    unsigned const char *passphrase)\n{\n    int rc;\n\n    pem_read_bio_func read_rsa =\n        (pem_read_bio_func) &PEM_read_bio_RSAPrivateKey;\n    (void) session;\n\n    _libssh2_init_if_needed();\n\n    rc = read_private_key_from_memory((void **) rsa, read_rsa,\n                                      filedata, filedata_len, passphrase);\n\n    if(rc) {\n        rc = read_openssh_private_key_from_memory((void **)rsa, session,\n                        \"ssh-rsa\", filedata, filedata_len, passphrase);\n    }\n\nreturn rc;\n}\n\nstatic unsigned char *\ngen_publickey_from_rsa(LIBSSH2_SESSION *session, RSA *rsa,\n                       size_t *key_len)\n{\n    int            e_bytes, n_bytes;\n    unsigned long  len;\n    unsigned char *key;\n    unsigned char *p;\n    const BIGNUM * e;\n    const BIGNUM * n;\n#ifdef HAVE_OPAQUE_STRUCTS\n    RSA_get0_key(rsa, &n, &e, NULL);\n#else\n    e = rsa->e;\n    n = rsa->n;\n#endif\n    e_bytes = BN_num_bytes(e) + 1;\n    n_bytes = BN_num_bytes(n) + 1;\n\n    /* Key form is \"ssh-rsa\" + e + n. */\n    len = 4 + 7 + 4 + e_bytes + 4 + n_bytes;\n\n    key = LIBSSH2_ALLOC(session, len);\n    if(key == NULL) {\n        return NULL;\n    }\n\n    /* Process key encoding. */\n    p = key;\n\n    _libssh2_htonu32(p, 7);  /* Key type. */\n    p += 4;\n    memcpy(p, \"ssh-rsa\", 7);\n    p += 7;\n\n    p = write_bn(p, e, e_bytes);\n    p = write_bn(p, n, n_bytes);\n\n    *key_len = (size_t)(p - key);\n    return key;\n}\n\nstatic int\ngen_publickey_from_rsa_evp(LIBSSH2_SESSION *session,\n                           unsigned char **method,\n                           size_t *method_len,\n                           unsigned char **pubkeydata,\n                           size_t *pubkeydata_len,\n                           EVP_PKEY *pk)\n{\n    RSA*           rsa = NULL;\n    unsigned char *key;\n    unsigned char *method_buf = NULL;\n    size_t  key_len;\n\n    _libssh2_debug(session,\n                   LIBSSH2_TRACE_AUTH,\n                   \"Computing public key from RSA private key envelop\");\n\n    rsa = EVP_PKEY_get1_RSA(pk);\n    if(rsa == NULL) {\n        /* Assume memory allocation error... what else could it be ? */\n        goto __alloc_error;\n    }\n\n    method_buf = LIBSSH2_ALLOC(session, 7);  /* ssh-rsa. */\n    if(method_buf == NULL) {\n        goto __alloc_error;\n    }\n\n    key = gen_publickey_from_rsa(session, rsa, &key_len);\n    if(key == NULL) {\n        goto __alloc_error;\n    }\n    RSA_free(rsa);\n\n    memcpy(method_buf, \"ssh-rsa\", 7);\n    *method         = method_buf;\n    *method_len     = 7;\n    *pubkeydata     = key;\n    *pubkeydata_len = key_len;\n    return 0;\n\n  __alloc_error:\n    if(rsa != NULL) {\n        RSA_free(rsa);\n    }\n    if(method_buf != NULL) {\n        LIBSSH2_FREE(session, method_buf);\n    }\n\n    return _libssh2_error(session,\n                          LIBSSH2_ERROR_ALLOC,\n                          \"Unable to allocate memory for private key data\");\n}\n\nstatic int _libssh2_rsa_new_additional_parameters(RSA *rsa)\n{\n    BN_CTX *ctx = NULL;\n    BIGNUM *aux = NULL;\n    BIGNUM *dmp1 = NULL;\n    BIGNUM *dmq1 = NULL;\n    const BIGNUM *p = NULL;\n    const BIGNUM *q = NULL;\n    const BIGNUM *d = NULL;\n    int rc = 0;\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    RSA_get0_key(rsa, NULL, NULL, &d);\n    RSA_get0_factors(rsa, &p, &q);\n#else\n    d = (*rsa).d;\n    p = (*rsa).p;\n    q = (*rsa).q;\n#endif\n\n    ctx = BN_CTX_new();\n    if(ctx == NULL)\n        return -1;\n\n    aux = BN_new();\n    if(aux == NULL) {\n        rc = -1;\n        goto out;\n    }\n\n    dmp1 = BN_new();\n    if(dmp1 == NULL) {\n        rc = -1;\n        goto out;\n    }\n\n    dmq1 = BN_new();\n    if(dmq1 == NULL) {\n        rc = -1;\n        goto out;\n    }\n\n    if((BN_sub(aux, q, BN_value_one()) == 0) ||\n        (BN_mod(dmq1, d, aux, ctx) == 0) ||\n        (BN_sub(aux, p, BN_value_one()) == 0) ||\n        (BN_mod(dmp1, d, aux, ctx) == 0)) {\n        rc = -1;\n        goto out;\n    }\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    RSA_set0_crt_params(rsa, dmp1, dmq1, NULL);\n#else\n    (*rsa).dmp1 = dmp1;\n    (*rsa).dmq1 = dmq1;\n#endif\n\nout:\n    if(aux)\n        BN_clear_free(aux);\n    BN_CTX_free(ctx);\n\n    if(rc != 0) {\n        if(dmp1)\n            BN_clear_free(dmp1);\n        if(dmq1)\n            BN_clear_free(dmq1);\n    }\n\n    return rc;\n}\n\nstatic int\ngen_publickey_from_rsa_openssh_priv_data(LIBSSH2_SESSION *session,\n                                         struct string_buf *decrypted,\n                                         unsigned char **method,\n                                         size_t *method_len,\n                                         unsigned char **pubkeydata,\n                                         size_t *pubkeydata_len,\n                                         libssh2_rsa_ctx **rsa_ctx)\n{\n    int rc = 0;\n    size_t nlen, elen, dlen, plen, qlen, coefflen, commentlen;\n    unsigned char *n, *e, *d, *p, *q, *coeff, *comment;\n    RSA *rsa = NULL;\n\n    _libssh2_debug(session,\n                   LIBSSH2_TRACE_AUTH,\n                   \"Computing RSA keys from private key data\");\n\n    /* public key data */\n    if(_libssh2_get_bignum_bytes(decrypted, &n, &nlen)) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"RSA no n\");\n        return -1;\n    }\n\n    if(_libssh2_get_bignum_bytes(decrypted, &e, &elen)) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"RSA no e\");\n        return -1;\n    }\n\n    /* private key data */\n    if(_libssh2_get_bignum_bytes(decrypted, &d, &dlen)) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"RSA no d\");\n        return -1;\n    }\n\n    if(_libssh2_get_bignum_bytes(decrypted, &coeff, &coefflen)) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"RSA no coeff\");\n        return -1;\n    }\n\n    if(_libssh2_get_bignum_bytes(decrypted, &p, &plen)) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"RSA no p\");\n        return -1;\n    }\n\n    if(_libssh2_get_bignum_bytes(decrypted, &q, &qlen)) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"RSA no q\");\n        return -1;\n    }\n\n    if(_libssh2_get_string(decrypted, &comment, &commentlen)) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"RSA no comment\");\n        return -1;\n    }\n\n    if((rc = _libssh2_rsa_new(&rsa, e, elen, n, nlen, d, dlen, p, plen,\n                              q, qlen, NULL, 0, NULL, 0,\n                              coeff, coefflen)) != 0) {\n        _libssh2_debug(session,\n                       LIBSSH2_TRACE_AUTH,\n                       \"Could not create RSA private key\");\n        goto fail;\n    }\n\n    if(rsa != NULL)\n        rc = _libssh2_rsa_new_additional_parameters(rsa);\n\n    if(rsa != NULL && pubkeydata != NULL && method != NULL) {\n        EVP_PKEY *pk = EVP_PKEY_new();\n        EVP_PKEY_set1_RSA(pk, rsa);\n\n        rc = gen_publickey_from_rsa_evp(session, method, method_len,\n                                        pubkeydata, pubkeydata_len,\n                                        pk);\n\n        if(pk)\n            EVP_PKEY_free(pk);\n    }\n\n    if(rsa_ctx != NULL)\n        *rsa_ctx = rsa;\n    else\n        RSA_free(rsa);\n\n    return rc;\n\nfail:\n\n    if(rsa != NULL)\n        RSA_free(rsa);\n\n    return _libssh2_error(session,\n                          LIBSSH2_ERROR_ALLOC,\n                          \"Unable to allocate memory for private key data\");\n}\n\nstatic int\n_libssh2_rsa_new_openssh_private(libssh2_rsa_ctx ** rsa,\n                                 LIBSSH2_SESSION * session,\n                                 const char *filename,\n                                 unsigned const char *passphrase)\n{\n    FILE *fp;\n    int rc;\n    unsigned char *buf = NULL;\n    struct string_buf *decrypted = NULL;\n\n    if(session == NULL) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"Session is required\");\n        return -1;\n    }\n\n    _libssh2_init_if_needed();\n\n    fp = fopen(filename, \"r\");\n    if(!fp) {\n        _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                       \"Unable to open OpenSSH RSA private key file\");\n        return -1;\n    }\n\n    rc = _libssh2_openssh_pem_parse(session, passphrase, fp, &decrypted);\n    fclose(fp);\n    if(rc) {\n        return rc;\n    }\n\n    /* We have a new key file, now try and parse it using supported types  */\n    rc = _libssh2_get_string(decrypted, &buf, NULL);\n\n    if(rc != 0 || buf == NULL) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"Public key type in decrypted key data not found\");\n        return -1;\n    }\n\n    if(strcmp(\"ssh-rsa\", (const char *)buf) == 0) {\n        rc = gen_publickey_from_rsa_openssh_priv_data(session, decrypted,\n                                                      NULL, 0,\n                                                      NULL, 0, rsa);\n    }\n    else {\n        rc = -1;\n    }\n\n    if(decrypted)\n        _libssh2_string_buf_free(session, decrypted);\n\n    return rc;\n}\n\nint\n_libssh2_rsa_new_private(libssh2_rsa_ctx ** rsa,\n                         LIBSSH2_SESSION * session,\n                         const char *filename, unsigned const char *passphrase)\n{\n    int rc;\n\n    pem_read_bio_func read_rsa =\n        (pem_read_bio_func) &PEM_read_bio_RSAPrivateKey;\n    (void) session;\n\n    _libssh2_init_if_needed();\n\n    rc = read_private_key_from_file((void **) rsa, read_rsa,\n                                    filename, passphrase);\n\n    if(rc) {\n        rc = _libssh2_rsa_new_openssh_private(rsa, session,\n                                              filename, passphrase);\n    }\n\n    return rc;\n}\n\n#if LIBSSH2_DSA\nint\n_libssh2_dsa_new_private_frommemory(libssh2_dsa_ctx ** dsa,\n                                    LIBSSH2_SESSION * session,\n                                    const char *filedata, size_t filedata_len,\n                                    unsigned const char *passphrase)\n{\n    int rc;\n\n    pem_read_bio_func read_dsa =\n        (pem_read_bio_func) &PEM_read_bio_DSAPrivateKey;\n    (void) session;\n\n    _libssh2_init_if_needed();\n\n    rc = read_private_key_from_memory((void **)dsa, read_dsa,\n                                      filedata, filedata_len, passphrase);\n\n    if(rc) {\n        rc = read_openssh_private_key_from_memory((void **)dsa, session,\n                            \"ssh-dsa\", filedata, filedata_len, passphrase);\n    }\n\n    return rc;\n}\n\nstatic unsigned char *\ngen_publickey_from_dsa(LIBSSH2_SESSION* session, DSA *dsa,\n                       size_t *key_len)\n{\n    int            p_bytes, q_bytes, g_bytes, k_bytes;\n    unsigned long  len;\n    unsigned char *key;\n    unsigned char *p;\n\n    const BIGNUM * p_bn;\n    const BIGNUM * q;\n    const BIGNUM * g;\n    const BIGNUM * pub_key;\n#ifdef HAVE_OPAQUE_STRUCTS\n    DSA_get0_pqg(dsa, &p_bn, &q, &g);\n#else\n    p_bn = dsa->p;\n    q = dsa->q;\n    g = dsa->g;\n#endif\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    DSA_get0_key(dsa, &pub_key, NULL);\n#else\n    pub_key = dsa->pub_key;\n#endif\n    p_bytes = BN_num_bytes(p_bn) + 1;\n    q_bytes = BN_num_bytes(q) + 1;\n    g_bytes = BN_num_bytes(g) + 1;\n    k_bytes = BN_num_bytes(pub_key) + 1;\n\n    /* Key form is \"ssh-dss\" + p + q + g + pub_key. */\n    len = 4 + 7 + 4 + p_bytes + 4 + q_bytes + 4 + g_bytes + 4 + k_bytes;\n\n    key = LIBSSH2_ALLOC(session, len);\n    if(key == NULL) {\n        return NULL;\n    }\n\n    /* Process key encoding. */\n    p = key;\n\n    _libssh2_htonu32(p, 7);  /* Key type. */\n    p += 4;\n    memcpy(p, \"ssh-dss\", 7);\n    p += 7;\n\n    p = write_bn(p, p_bn, p_bytes);\n    p = write_bn(p, q, q_bytes);\n    p = write_bn(p, g, g_bytes);\n    p = write_bn(p, pub_key, k_bytes);\n\n    *key_len = (size_t)(p - key);\n    return key;\n}\n\nstatic int\ngen_publickey_from_dsa_evp(LIBSSH2_SESSION *session,\n                           unsigned char **method,\n                           size_t *method_len,\n                           unsigned char **pubkeydata,\n                           size_t *pubkeydata_len,\n                           EVP_PKEY *pk)\n{\n    DSA*           dsa = NULL;\n    unsigned char *key;\n    unsigned char *method_buf = NULL;\n    size_t  key_len;\n\n    _libssh2_debug(session,\n                   LIBSSH2_TRACE_AUTH,\n                   \"Computing public key from DSA private key envelop\");\n\n    dsa = EVP_PKEY_get1_DSA(pk);\n    if(dsa == NULL) {\n        /* Assume memory allocation error... what else could it be ? */\n        goto __alloc_error;\n    }\n\n    method_buf = LIBSSH2_ALLOC(session, 7);  /* ssh-dss. */\n    if(method_buf == NULL) {\n        goto __alloc_error;\n    }\n\n    key = gen_publickey_from_dsa(session, dsa, &key_len);\n    if(key == NULL) {\n        goto __alloc_error;\n    }\n    DSA_free(dsa);\n\n    memcpy(method_buf, \"ssh-dss\", 7);\n    *method         = method_buf;\n    *method_len     = 7;\n    *pubkeydata     = key;\n    *pubkeydata_len = key_len;\n    return 0;\n\n  __alloc_error:\n    if(dsa != NULL) {\n        DSA_free(dsa);\n    }\n    if(method_buf != NULL) {\n        LIBSSH2_FREE(session, method_buf);\n    }\n\n    return _libssh2_error(session,\n                          LIBSSH2_ERROR_ALLOC,\n                          \"Unable to allocate memory for private key data\");\n}\n\nstatic int\ngen_publickey_from_dsa_openssh_priv_data(LIBSSH2_SESSION *session,\n                                         struct string_buf *decrypted,\n                                         unsigned char **method,\n                                         size_t *method_len,\n                                         unsigned char **pubkeydata,\n                                         size_t *pubkeydata_len,\n                                         libssh2_dsa_ctx **dsa_ctx)\n{\n    int rc = 0;\n    size_t plen, qlen, glen, pub_len, priv_len;\n    unsigned char *p, *q, *g, *pub_key, *priv_key;\n    DSA *dsa = NULL;\n\n    _libssh2_debug(session,\n                   LIBSSH2_TRACE_AUTH,\n                   \"Computing DSA keys from private key data\");\n\n    if(_libssh2_get_bignum_bytes(decrypted, &p, &plen)) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"DSA no p\");\n        return -1;\n    }\n\n    if(_libssh2_get_bignum_bytes(decrypted, &q, &qlen)) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"DSA no q\");\n        return -1;\n    }\n\n    if(_libssh2_get_bignum_bytes(decrypted, &g, &glen)) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"DSA no g\");\n        return -1;\n    }\n\n    if(_libssh2_get_bignum_bytes(decrypted, &pub_key, &pub_len)) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"DSA no public key\");\n        return -1;\n    }\n\n    if(_libssh2_get_bignum_bytes(decrypted, &priv_key, &priv_len)) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"DSA no private key\");\n        return -1;\n    }\n\n    rc = _libssh2_dsa_new(&dsa, p, plen, q, qlen, g, glen, pub_key, pub_len,\n                          priv_key, priv_len);\n    if(rc != 0) {\n        _libssh2_debug(session,\n                       LIBSSH2_ERROR_PROTO,\n                       \"Could not create DSA private key\");\n        goto fail;\n    }\n\n    if(dsa != NULL && pubkeydata != NULL && method != NULL) {\n        EVP_PKEY *pk = EVP_PKEY_new();\n        EVP_PKEY_set1_DSA(pk, dsa);\n\n        rc = gen_publickey_from_dsa_evp(session, method, method_len,\n                                        pubkeydata, pubkeydata_len,\n                                        pk);\n\n        if(pk)\n            EVP_PKEY_free(pk);\n    }\n\n    if(dsa_ctx != NULL)\n        *dsa_ctx = dsa;\n    else\n        DSA_free(dsa);\n\n    return rc;\n\nfail:\n\n    if(dsa != NULL)\n        DSA_free(dsa);\n\n    return _libssh2_error(session,\n                          LIBSSH2_ERROR_ALLOC,\n                          \"Unable to allocate memory for private key data\");\n}\n\nstatic int\n_libssh2_dsa_new_openssh_private(libssh2_dsa_ctx ** dsa,\n                                 LIBSSH2_SESSION * session,\n                                 const char *filename,\n                                 unsigned const char *passphrase)\n{\n    FILE *fp;\n    int rc;\n    unsigned char *buf = NULL;\n    struct string_buf *decrypted = NULL;\n\n    if(session == NULL) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"Session is required\");\n        return -1;\n    }\n\n    _libssh2_init_if_needed();\n\n    fp = fopen(filename, \"r\");\n    if(!fp) {\n        _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                       \"Unable to open OpenSSH DSA private key file\");\n        return -1;\n    }\n\n    rc = _libssh2_openssh_pem_parse(session, passphrase, fp, &decrypted);\n    fclose(fp);\n    if(rc) {\n        return rc;\n    }\n\n    /* We have a new key file, now try and parse it using supported types  */\n    rc = _libssh2_get_string(decrypted, &buf, NULL);\n\n    if(rc != 0 || buf == NULL) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"Public key type in decrypted key data not found\");\n        return -1;\n    }\n\n    if(strcmp(\"ssh-dss\", (const char *)buf) == 0) {\n        rc = gen_publickey_from_dsa_openssh_priv_data(session, decrypted,\n                                                      NULL, 0,\n                                                      NULL, 0, dsa);\n    }\n    else {\n        rc = -1;\n    }\n\n    if(decrypted)\n        _libssh2_string_buf_free(session, decrypted);\n\n    return rc;\n}\n\nint\n_libssh2_dsa_new_private(libssh2_dsa_ctx ** dsa,\n                         LIBSSH2_SESSION * session,\n                         const char *filename, unsigned const char *passphrase)\n{\n    int rc;\n\n    pem_read_bio_func read_dsa =\n        (pem_read_bio_func) &PEM_read_bio_DSAPrivateKey;\n    (void) session;\n\n    _libssh2_init_if_needed();\n\n    rc = read_private_key_from_file((void **) dsa, read_dsa,\n                                    filename, passphrase);\n\n    if(rc) {\n        rc = _libssh2_dsa_new_openssh_private(dsa, session,\n                                              filename, passphrase);\n    }\n\n    return rc;\n}\n\n#endif /* LIBSSH_DSA */\n\n#if LIBSSH2_ECDSA\n\nint\n_libssh2_ecdsa_new_private_frommemory(libssh2_ecdsa_ctx ** ec_ctx,\n                                    LIBSSH2_SESSION * session,\n                                    const char *filedata, size_t filedata_len,\n                                    unsigned const char *passphrase)\n{\n    int rc;\n\n    pem_read_bio_func read_ec =\n        (pem_read_bio_func) &PEM_read_bio_ECPrivateKey;\n    (void) session;\n\n    _libssh2_init_if_needed();\n\n    rc = read_private_key_from_memory((void **) ec_ctx, read_ec,\n                                      filedata, filedata_len, passphrase);\n\n    if(rc) {\n        rc = read_openssh_private_key_from_memory((void **)ec_ctx, session,\n                                                  \"ssh-ecdsa\", filedata,\n                                                  filedata_len, passphrase);\n    }\n\n    return rc;\n}\n\n#endif /* LIBSSH2_ECDSA */\n\n\n#if LIBSSH2_ED25519\n\nint\n_libssh2_curve25519_new(LIBSSH2_SESSION *session, libssh2_x25519_ctx **out_ctx,\n                        unsigned char **out_public_key,\n                        unsigned char **out_private_key)\n{\n    EVP_PKEY *key = NULL;\n    EVP_PKEY_CTX *pctx = NULL;\n    PKCS8_PRIV_KEY_INFO *info = NULL;\n    ASN1_OCTET_STRING *oct = NULL;\n    X509_PUBKEY *pubkey = NULL;\n    libssh2_ed25519_ctx *ctx = NULL;\n    const unsigned char *pkcs, *priv, *pub;\n    int privLen, pubLen, pkcsLen;\n    int rc = -1;\n\n    pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_X25519, NULL);\n    if(pctx == NULL)\n        return -1;\n\n    EVP_PKEY_keygen_init(pctx);\n    EVP_PKEY_keygen(pctx, &key);\n    info = EVP_PKEY2PKCS8(key);\n\n    if(info == NULL || !PKCS8_pkey_get0(NULL, &pkcs, &pkcsLen, NULL, info))\n        goto cleanExit;\n\n    oct = d2i_ASN1_OCTET_STRING(NULL, &pkcs, pkcsLen);\n    if(oct == NULL) {\n        goto cleanExit;\n    }\n\n    priv = ASN1_STRING_get0_data(oct);\n    privLen = ASN1_STRING_length(oct);\n\n    if(privLen != LIBSSH2_ED25519_KEY_LEN)\n        goto cleanExit;\n\n    pubkey = X509_PUBKEY_new();\n    if(pubkey == NULL || !X509_PUBKEY_set(&pubkey, key))\n        goto cleanExit;\n\n    if(!X509_PUBKEY_get0_param(NULL, &pub, &pubLen, NULL, pubkey))\n        goto cleanExit;\n\n    if(pubLen != LIBSSH2_ED25519_KEY_LEN)\n        goto cleanExit;\n\n    if(out_private_key != NULL) {\n        *out_private_key = LIBSSH2_ALLOC(session, LIBSSH2_ED25519_KEY_LEN);\n        if(*out_private_key == NULL)\n            goto cleanExit;\n\n        memcpy(*out_private_key, priv, LIBSSH2_ED25519_KEY_LEN);\n    }\n\n    if(out_public_key != NULL) {\n        *out_public_key = LIBSSH2_ALLOC(session, LIBSSH2_ED25519_KEY_LEN);\n        if(*out_public_key == NULL)\n            goto cleanExit;\n\n        memcpy(*out_public_key, pub, LIBSSH2_ED25519_KEY_LEN);\n    }\n\n    if(out_ctx != NULL) {\n        ctx = malloc(sizeof(libssh2_x25519_ctx));\n        if(ctx == NULL)\n            goto cleanExit;\n\n        ctx->private_key =\n            EVP_PKEY_new_raw_private_key(EVP_PKEY_X25519, NULL,\n                                         (const unsigned char *)priv,\n                                         LIBSSH2_ED25519_KEY_LEN);\n\n        ctx->public_key =\n            EVP_PKEY_new_raw_public_key(EVP_PKEY_X25519, NULL,\n                                        (const unsigned char *)pub,\n                                        LIBSSH2_ED25519_KEY_LEN);\n\n        if(ctx->public_key == NULL || ctx->private_key == NULL) {\n            _libssh2_x25519_free(ctx);\n            goto cleanExit;\n        }\n\n        *out_ctx = ctx;\n    }\n\n    /* success */\n    rc = 0;\n\ncleanExit:\n\n    if(info)\n        PKCS8_PRIV_KEY_INFO_free(info);\n    if(pctx)\n        EVP_PKEY_CTX_free(pctx);\n    if(oct)\n        ASN1_OCTET_STRING_free(oct);\n    if(pubkey)\n        X509_PUBKEY_free(pubkey);\n    if(key)\n        EVP_PKEY_free(key);\n\n    return rc;\n}\n\nstatic int\ngen_publickey_from_ed25519_openssh_priv_data(LIBSSH2_SESSION *session,\n                                             struct string_buf *decrypted,\n                                             unsigned char **method,\n                                             size_t *method_len,\n                                             unsigned char **pubkeydata,\n                                             size_t *pubkeydata_len,\n                                             libssh2_ed25519_ctx **out_ctx)\n{\n    libssh2_ed25519_ctx *ctx = NULL;\n    unsigned char *method_buf = NULL;\n    unsigned char *key = NULL;\n    int i, ret = 0;\n    unsigned char *pub_key, *priv_key, *buf;\n    size_t key_len = 0, tmp_len = 0;\n    unsigned char *p;\n\n    _libssh2_debug(session,\n                   LIBSSH2_TRACE_AUTH,\n                   \"Computing ED25519 keys from private key data\");\n\n    if(_libssh2_get_string(decrypted, &pub_key, &tmp_len) ||\n       tmp_len != LIBSSH2_ED25519_KEY_LEN) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"Wrong public key length\");\n        return -1;\n    }\n\n    if(_libssh2_get_string(decrypted, &priv_key, &tmp_len) ||\n       tmp_len != LIBSSH2_ED25519_PRIVATE_KEY_LEN) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"Wrong private key length\");\n        ret = -1;\n        goto clean_exit;\n    }\n\n    ctx = _libssh2_ed25519_new_ctx();\n    if(ctx == NULL) {\n        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                       \"Unable to allocate memory for ed25519 key\");\n        ret = -1;\n        goto clean_exit;\n    }\n\n    /* first 32 bytes of priv_key is the private key, the last 32 bytes are\n       the public key */\n    ctx->private_key =\n        EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, NULL,\n                                     (const unsigned char *)priv_key,\n                                     LIBSSH2_ED25519_KEY_LEN);\n\n    ctx->public_key =\n        EVP_PKEY_new_raw_public_key(EVP_PKEY_ED25519, NULL,\n                                    (const unsigned char *)pub_key,\n                                    LIBSSH2_ED25519_KEY_LEN);\n\n    /* comment */\n    if(_libssh2_get_string(decrypted, &buf, &tmp_len)) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"Unable to read comment\");\n        ret = -1;\n        goto clean_exit;\n    }\n\n    if(tmp_len > 0) {\n        unsigned char *comment = LIBSSH2_CALLOC(session, tmp_len + 1);\n        if(comment != NULL) {\n            memcpy(comment, buf, tmp_len);\n            memcpy(comment + tmp_len, \"\\0\", 1);\n\n            _libssh2_debug(session, LIBSSH2_TRACE_AUTH, \"Key comment: %s\",\n                           comment);\n\n            LIBSSH2_FREE(session, comment);\n        }\n    }\n\n    /* Padding */\n    i = 1;\n    while(decrypted->dataptr < decrypted->data + decrypted->len) {\n        if(*decrypted->dataptr != i) {\n            _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                           \"Wrong padding\");\n            ret = -1;\n            goto clean_exit;\n        }\n        i++;\n        decrypted->dataptr++;\n    }\n\n    if(ret == 0) {\n        _libssh2_debug(session,\n                       LIBSSH2_TRACE_AUTH,\n                       \"Computing public key from ED25519 \"\n                       \"private key envelop\");\n\n        method_buf = LIBSSH2_ALLOC(session, 11);  /* ssh-ed25519. */\n        if(method_buf == NULL) {\n            goto clean_exit;\n        }\n\n        /* Key form is: type_len(4) + type(11) + pub_key_len(4) +\n           pub_key(32). */\n        key_len = LIBSSH2_ED25519_KEY_LEN + 19;\n        key = LIBSSH2_CALLOC(session, key_len);\n        if(key == NULL) {\n            goto clean_exit;\n        }\n\n        p = key;\n\n        _libssh2_store_str(&p, \"ssh-ed25519\", 11);\n        _libssh2_store_str(&p, (const char *)pub_key, LIBSSH2_ED25519_KEY_LEN);\n\n        memcpy(method_buf, \"ssh-ed25519\", 11);\n\n        if(method != NULL)\n            *method = method_buf;\n        else\n            LIBSSH2_FREE(session, method_buf);\n\n        if(method_len != NULL)\n            *method_len = 11;\n\n        if(pubkeydata != NULL)\n            *pubkeydata = key;\n        else\n            LIBSSH2_FREE(session, key);\n\n        if(pubkeydata_len != NULL)\n            *pubkeydata_len = key_len;\n\n        if(out_ctx != NULL)\n            *out_ctx = ctx;\n        else if(ctx != NULL)\n            _libssh2_ed25519_free(ctx);\n\n        return 0;\n    }\n\nclean_exit:\n\n    if(ctx)\n        _libssh2_ed25519_free(ctx);\n\n    if(method_buf)\n        LIBSSH2_FREE(session, method_buf);\n\n    if(key)\n        LIBSSH2_FREE(session, key);\n\n    return -1;\n}\n\nint\n_libssh2_ed25519_new_private(libssh2_ed25519_ctx ** ed_ctx,\n                             LIBSSH2_SESSION * session,\n                             const char *filename, const uint8_t *passphrase)\n{\n    int rc;\n    FILE *fp;\n    unsigned char *buf;\n    struct string_buf *decrypted = NULL;\n    libssh2_ed25519_ctx *ctx = NULL;\n\n    if(session == NULL) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"Session is required\");\n        return -1;\n    }\n\n    _libssh2_init_if_needed();\n\n    fp = fopen(filename, \"r\");\n    if(!fp) {\n        _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                       \"Unable to open ED25519 private key file\");\n        return -1;\n    }\n\n    rc = _libssh2_openssh_pem_parse(session, passphrase, fp, &decrypted);\n    fclose(fp);\n    if(rc) {\n        return rc;\n    }\n\n    /* We have a new key file, now try and parse it using supported types  */\n    rc = _libssh2_get_string(decrypted, &buf, NULL);\n\n    if(rc != 0 || buf == NULL) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"Public key type in decrypted key data not found\");\n        return -1;\n    }\n\n    if(strcmp(\"ssh-ed25519\", (const char *)buf) == 0) {\n        rc = gen_publickey_from_ed25519_openssh_priv_data(session,\n                                                          decrypted,\n                                                          NULL,\n                                                          NULL,\n                                                          NULL,\n                                                          NULL,\n                                                          &ctx);\n    }\n    else {\n        rc = -1;\n    }\n\n    if(decrypted)\n        _libssh2_string_buf_free(session, decrypted);\n\n    if(rc == 0) {\n        if(ed_ctx != NULL)\n            *ed_ctx = ctx;\n        else if(ctx != NULL)\n            _libssh2_ed25519_free(ctx);\n    }\n\n    return rc;\n}\n\nint\n_libssh2_ed25519_new_private_frommemory(libssh2_ed25519_ctx ** ed_ctx,\n                                        LIBSSH2_SESSION * session,\n                                        const char *filedata,\n                                        size_t filedata_len,\n                                        unsigned const char *passphrase)\n{\n    return read_openssh_private_key_from_memory((void **)ed_ctx, session,\n                                                \"ssh-ed25519\",\n                                                filedata, filedata_len,\n                                                passphrase);\n}\n\nint\n_libssh2_ed25519_new_public(libssh2_ed25519_ctx ** ed_ctx,\n                            LIBSSH2_SESSION * session,\n                            const unsigned char *raw_pub_key,\n                            const uint8_t key_len)\n{\n    libssh2_ed25519_ctx *ctx = NULL;\n    EVP_PKEY *public_key = NULL;\n\n    if(ed_ctx == NULL)\n        return -1;\n\n    public_key =\n        EVP_PKEY_new_raw_public_key(EVP_PKEY_ED25519, NULL,\n                                    (const unsigned char *)raw_pub_key,\n                                    key_len);\n    if(public_key == NULL) {\n        return _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                              \"could not create ED25519 public key\");\n    }\n\n    ctx = _libssh2_ed25519_new_ctx();\n    if(ctx == NULL) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"could not alloc public/private key\");\n    }\n\n    ctx->public_key = public_key;\n\n    if(ed_ctx != NULL)\n        *ed_ctx = ctx;\n    else if(ctx != NULL)\n        _libssh2_ed25519_free(ctx);\n\n    return 0;\n}\n\n#endif /* LIBSSH2_ED25519 */\n\nint\n_libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session,\n                       libssh2_rsa_ctx * rsactx,\n                       const unsigned char *hash,\n                       size_t hash_len,\n                       unsigned char **signature, size_t *signature_len)\n{\n    int ret;\n    unsigned char *sig;\n    unsigned int sig_len;\n\n    sig_len = RSA_size(rsactx);\n    sig = LIBSSH2_ALLOC(session, sig_len);\n\n    if(!sig) {\n        return -1;\n    }\n\n    ret = RSA_sign(NID_sha1, hash, hash_len, sig, &sig_len, rsactx);\n\n    if(!ret) {\n        LIBSSH2_FREE(session, sig);\n        return -1;\n    }\n\n    *signature = sig;\n    *signature_len = sig_len;\n\n    return 0;\n}\n\n#if LIBSSH2_DSA\nint\n_libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx,\n                       const unsigned char *hash,\n                       unsigned long hash_len, unsigned char *signature)\n{\n    DSA_SIG *sig;\n    const BIGNUM * r;\n    const BIGNUM * s;\n    int r_len, s_len;\n    (void) hash_len;\n\n    sig = DSA_do_sign(hash, SHA_DIGEST_LENGTH, dsactx);\n    if(!sig) {\n        return -1;\n    }\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    DSA_SIG_get0(sig, &r, &s);\n#else\n    r = sig->r;\n    s = sig->s;\n#endif\n    r_len = BN_num_bytes(r);\n    if(r_len < 1 || r_len > 20) {\n        DSA_SIG_free(sig);\n        return -1;\n    }\n    s_len = BN_num_bytes(s);\n    if(s_len < 1 || s_len > 20) {\n        DSA_SIG_free(sig);\n        return -1;\n    }\n\n    memset(signature, 0, 40);\n\n    BN_bn2bin(r, signature + (20 - r_len));\n    BN_bn2bin(s, signature + 20 + (20 - s_len));\n\n    DSA_SIG_free(sig);\n\n    return 0;\n}\n#endif /* LIBSSH_DSA */\n\n#if LIBSSH2_ECDSA\n\nint\n_libssh2_ecdsa_sign(LIBSSH2_SESSION * session, libssh2_ecdsa_ctx * ec_ctx,\n    const unsigned char *hash, unsigned long hash_len,\n    unsigned char **signature, size_t *signature_len)\n{\n    int r_len, s_len;\n    int rc = 0;\n    size_t out_buffer_len = 0;\n    unsigned char *sp;\n    const BIGNUM *pr = NULL, *ps = NULL;\n    unsigned char *temp_buffer = NULL;\n    unsigned char *out_buffer = NULL;\n\n    ECDSA_SIG *sig = ECDSA_do_sign(hash, hash_len, ec_ctx);\n    if(sig == NULL)\n        return -1;\n#ifdef HAVE_OPAQUE_STRUCTS\n    ECDSA_SIG_get0(sig, &pr, &ps);\n#else\n    pr = sig->r;\n    ps = sig->s;\n#endif\n\n    r_len = BN_num_bytes(pr) + 1;\n    s_len = BN_num_bytes(ps) + 1;\n\n    temp_buffer = malloc(r_len + s_len + 8);\n    if(temp_buffer == NULL) {\n        rc = -1;\n        goto clean_exit;\n    }\n\n    sp = temp_buffer;\n    sp = write_bn(sp, pr, r_len);\n    sp = write_bn(sp, ps, s_len);\n\n    out_buffer_len = (size_t)(sp - temp_buffer);\n\n    out_buffer = LIBSSH2_CALLOC(session, out_buffer_len);\n    if(out_buffer == NULL) {\n        rc = -1;\n        goto clean_exit;\n    }\n\n    memcpy(out_buffer, temp_buffer, out_buffer_len);\n\n    *signature = out_buffer;\n    *signature_len = out_buffer_len;\n\nclean_exit:\n\n    if(temp_buffer != NULL)\n        free(temp_buffer);\n\n    if(sig)\n        ECDSA_SIG_free(sig);\n\n    return rc;\n}\n#endif /* LIBSSH2_ECDSA */\n\nint\n_libssh2_sha1_init(libssh2_sha1_ctx *ctx)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    *ctx = EVP_MD_CTX_new();\n\n    if(*ctx == NULL)\n        return 0;\n\n    if(EVP_DigestInit(*ctx, EVP_get_digestbyname(\"sha1\")))\n        return 1;\n\n    EVP_MD_CTX_free(*ctx);\n    *ctx = NULL;\n\n    return 0;\n#else\n    EVP_MD_CTX_init(ctx);\n    return EVP_DigestInit(ctx, EVP_get_digestbyname(\"sha1\"));\n#endif\n}\n\nint\n_libssh2_sha1(const unsigned char *message, unsigned long len,\n              unsigned char *out)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    EVP_MD_CTX * ctx = EVP_MD_CTX_new();\n\n    if(ctx == NULL)\n        return 1; /* error */\n\n    if(EVP_DigestInit(ctx, EVP_get_digestbyname(\"sha1\"))) {\n        EVP_DigestUpdate(ctx, message, len);\n        EVP_DigestFinal(ctx, out, NULL);\n        EVP_MD_CTX_free(ctx);\n        return 0; /* success */\n    }\n    EVP_MD_CTX_free(ctx);\n#else\n    EVP_MD_CTX ctx;\n\n    EVP_MD_CTX_init(&ctx);\n    if(EVP_DigestInit(&ctx, EVP_get_digestbyname(\"sha1\"))) {\n        EVP_DigestUpdate(&ctx, message, len);\n        EVP_DigestFinal(&ctx, out, NULL);\n        return 0; /* success */\n    }\n#endif\n    return 1; /* error */\n}\n\nint\n_libssh2_sha256_init(libssh2_sha256_ctx *ctx)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    *ctx = EVP_MD_CTX_new();\n\n    if(*ctx == NULL)\n        return 0;\n\n    if(EVP_DigestInit(*ctx, EVP_get_digestbyname(\"sha256\")))\n        return 1;\n\n    EVP_MD_CTX_free(*ctx);\n    *ctx = NULL;\n\n    return 0;\n#else\n    EVP_MD_CTX_init(ctx);\n    return EVP_DigestInit(ctx, EVP_get_digestbyname(\"sha256\"));\n#endif\n}\n\nint\n_libssh2_sha256(const unsigned char *message, unsigned long len,\n                unsigned char *out)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    EVP_MD_CTX * ctx = EVP_MD_CTX_new();\n\n    if(ctx == NULL)\n        return 1; /* error */\n\n    if(EVP_DigestInit(ctx, EVP_get_digestbyname(\"sha256\"))) {\n        EVP_DigestUpdate(ctx, message, len);\n        EVP_DigestFinal(ctx, out, NULL);\n        EVP_MD_CTX_free(ctx);\n        return 0; /* success */\n    }\n    EVP_MD_CTX_free(ctx);\n#else\n    EVP_MD_CTX ctx;\n\n    EVP_MD_CTX_init(&ctx);\n    if(EVP_DigestInit(&ctx, EVP_get_digestbyname(\"sha256\"))) {\n        EVP_DigestUpdate(&ctx, message, len);\n        EVP_DigestFinal(&ctx, out, NULL);\n        return 0; /* success */\n    }\n#endif\n    return 1; /* error */\n}\n\nint\n_libssh2_sha384_init(libssh2_sha384_ctx *ctx)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    *ctx = EVP_MD_CTX_new();\n\n    if(*ctx == NULL)\n        return 0;\n\n    if(EVP_DigestInit(*ctx, EVP_get_digestbyname(\"sha384\")))\n        return 1;\n\n    EVP_MD_CTX_free(*ctx);\n    *ctx = NULL;\n\n    return 0;\n#else\n    EVP_MD_CTX_init(ctx);\n    return EVP_DigestInit(ctx, EVP_get_digestbyname(\"sha384\"));\n#endif\n}\n\nint\n_libssh2_sha384(const unsigned char *message, unsigned long len,\n    unsigned char *out)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    EVP_MD_CTX * ctx = EVP_MD_CTX_new();\n\n    if(ctx == NULL)\n        return 1; /* error */\n\n    if(EVP_DigestInit(ctx, EVP_get_digestbyname(\"sha384\"))) {\n        EVP_DigestUpdate(ctx, message, len);\n        EVP_DigestFinal(ctx, out, NULL);\n        EVP_MD_CTX_free(ctx);\n        return 0; /* success */\n    }\n    EVP_MD_CTX_free(ctx);\n#else\n    EVP_MD_CTX ctx;\n\n    EVP_MD_CTX_init(&ctx);\n    if(EVP_DigestInit(&ctx, EVP_get_digestbyname(\"sha384\"))) {\n        EVP_DigestUpdate(&ctx, message, len);\n        EVP_DigestFinal(&ctx, out, NULL);\n        return 0; /* success */\n    }\n#endif\n    return 1; /* error */\n}\n\nint\n_libssh2_sha512_init(libssh2_sha512_ctx *ctx)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    *ctx = EVP_MD_CTX_new();\n\n    if(*ctx == NULL)\n        return 0;\n\n    if(EVP_DigestInit(*ctx, EVP_get_digestbyname(\"sha512\")))\n        return 1;\n\n    EVP_MD_CTX_free(*ctx);\n    *ctx = NULL;\n\n    return 0;\n#else\n    EVP_MD_CTX_init(ctx);\n    return EVP_DigestInit(ctx, EVP_get_digestbyname(\"sha512\"));\n#endif\n}\n\nint\n_libssh2_sha512(const unsigned char *message, unsigned long len,\n    unsigned char *out)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    EVP_MD_CTX * ctx = EVP_MD_CTX_new();\n\n    if(ctx == NULL)\n        return 1; /* error */\n\n    if(EVP_DigestInit(ctx, EVP_get_digestbyname(\"sha512\"))) {\n        EVP_DigestUpdate(ctx, message, len);\n        EVP_DigestFinal(ctx, out, NULL);\n        EVP_MD_CTX_free(ctx);\n        return 0; /* success */\n    }\n    EVP_MD_CTX_free(ctx);\n#else\n    EVP_MD_CTX ctx;\n\n    EVP_MD_CTX_init(&ctx);\n    if(EVP_DigestInit(&ctx, EVP_get_digestbyname(\"sha512\"))) {\n        EVP_DigestUpdate(&ctx, message, len);\n        EVP_DigestFinal(&ctx, out, NULL);\n        return 0; /* success */\n    }\n#endif\n    return 1; /* error */\n}\n\nint\n_libssh2_md5_init(libssh2_md5_ctx *ctx)\n{\n#ifdef HAVE_OPAQUE_STRUCTS\n    *ctx = EVP_MD_CTX_new();\n\n    if(*ctx == NULL)\n        return 0;\n\n    if(EVP_DigestInit(*ctx, EVP_get_digestbyname(\"md5\")))\n        return 1;\n\n    EVP_MD_CTX_free(*ctx);\n    *ctx = NULL;\n\n    return 0;\n#else\n    EVP_MD_CTX_init(ctx);\n    return EVP_DigestInit(ctx, EVP_get_digestbyname(\"md5\"));\n#endif\n}\n\n#if LIBSSH2_ECDSA\n\nstatic int\ngen_publickey_from_ec_evp(LIBSSH2_SESSION *session,\n                          unsigned char **method,\n                          size_t *method_len,\n                          unsigned char **pubkeydata,\n                          size_t *pubkeydata_len,\n                          EVP_PKEY *pk)\n{\n    int rc = 0;\n    EC_KEY *ec = NULL;\n    unsigned char *p;\n    unsigned char *method_buf = NULL;\n    unsigned char *key;\n    size_t  key_len = 0;\n    unsigned char *octal_value = NULL;\n    size_t octal_len;\n    const EC_POINT *public_key;\n    const EC_GROUP *group;\n    BN_CTX *bn_ctx;\n    libssh2_curve_type type;\n\n    _libssh2_debug(session,\n       LIBSSH2_TRACE_AUTH,\n       \"Computing public key from EC private key envelop\");\n\n    bn_ctx = BN_CTX_new();\n    if(bn_ctx == NULL)\n        return -1;\n\n    ec = EVP_PKEY_get1_EC_KEY(pk);\n    if(ec == NULL) {\n        rc = -1;\n        goto clean_exit;\n    }\n\n    public_key = EC_KEY_get0_public_key(ec);\n    group = EC_KEY_get0_group(ec);\n    type = _libssh2_ecdsa_key_get_curve_type(ec);\n\n    method_buf = LIBSSH2_ALLOC(session, 19);\n    if(method_buf == NULL) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n            \"out of memory\");\n    }\n\n    if(type == LIBSSH2_EC_CURVE_NISTP256)\n        memcpy(method_buf, \"ecdsa-sha2-nistp256\", 19);\n    else if(type == LIBSSH2_EC_CURVE_NISTP384)\n        memcpy(method_buf, \"ecdsa-sha2-nistp384\", 19);\n    else if(type == LIBSSH2_EC_CURVE_NISTP521)\n        memcpy(method_buf, \"ecdsa-sha2-nistp521\", 19);\n    else {\n        _libssh2_debug(session,\n            LIBSSH2_TRACE_ERROR,\n            \"Unsupported EC private key type\");\n        rc = -1;\n        goto clean_exit;\n    }\n\n    /* get length */\n    octal_len = EC_POINT_point2oct(group, public_key,\n                                   POINT_CONVERSION_UNCOMPRESSED,\n                                   NULL, 0, bn_ctx);\n    if(octal_len > EC_MAX_POINT_LEN) {\n        rc = -1;\n        goto clean_exit;\n    }\n\n    octal_value = malloc(octal_len);\n    if(octal_value == NULL) {\n        rc = -1;\n        goto clean_exit;\n    }\n\n    /* convert to octal */\n    if(EC_POINT_point2oct(group, public_key, POINT_CONVERSION_UNCOMPRESSED,\n       octal_value, octal_len, bn_ctx) != octal_len) {\n           rc = -1;\n           goto clean_exit;\n    }\n\n    /* Key form is: type_len(4) + type(19) + domain_len(4) + domain(8) +\n       pub_key_len(4) + pub_key(~65). */\n    key_len = 4 + 19 + 4 + 8 + 4 + octal_len;\n    key = LIBSSH2_ALLOC(session, key_len);\n    if(key == NULL) {\n        rc = -1;\n        goto  clean_exit;\n    }\n\n    /* Process key encoding. */\n    p = key;\n\n    /* Key type */\n    _libssh2_store_str(&p, (const char *)method_buf, 19);\n\n    /* Name domain */\n    _libssh2_store_str(&p, (const char *)method_buf + 11, 8);\n\n    /* Public key */\n    _libssh2_store_str(&p, (const char *)octal_value, octal_len);\n\n    *method         = method_buf;\n    *method_len     = 19;\n    *pubkeydata     = key;\n    *pubkeydata_len = key_len;\n\nclean_exit:\n\n    if(ec != NULL)\n        EC_KEY_free(ec);\n\n    if(bn_ctx != NULL) {\n        BN_CTX_free(bn_ctx);\n    }\n\n    if(octal_value != NULL)\n        free(octal_value);\n\n    if(rc == 0)\n        return 0;\n\n    if(method_buf != NULL)\n        LIBSSH2_FREE(session, method_buf);\n\n    return -1;\n}\n\nstatic int\ngen_publickey_from_ecdsa_openssh_priv_data(LIBSSH2_SESSION *session,\n                                           libssh2_curve_type curve_type,\n                                           struct string_buf *decrypted,\n                                           unsigned char **method,\n                                           size_t *method_len,\n                                           unsigned char **pubkeydata,\n                                           size_t *pubkeydata_len,\n                                           libssh2_ecdsa_ctx **ec_ctx)\n{\n    int rc = 0;\n    size_t curvelen, exponentlen, pointlen;\n    unsigned char *curve, *exponent, *point_buf;\n    EC_KEY *ec_key = NULL;\n    BIGNUM *bn_exponent;\n\n    _libssh2_debug(session,\n                   LIBSSH2_TRACE_AUTH,\n                   \"Computing ECDSA keys from private key data\");\n\n    if(_libssh2_get_string(decrypted, &curve, &curvelen) ||\n        curvelen == 0) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"ECDSA no curve\");\n        return -1;\n    }\n\n    if(_libssh2_get_string(decrypted, &point_buf, &pointlen)) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"ECDSA no point\");\n        return -1;\n    }\n\n    if(_libssh2_get_bignum_bytes(decrypted, &exponent, &exponentlen)) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"ECDSA no exponent\");\n        return -1;\n    }\n\n    if((rc = _libssh2_ecdsa_curve_name_with_octal_new(&ec_key, point_buf,\n        pointlen, curve_type)) != 0) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"ECDSA could not create key\");\n        goto fail;\n    }\n\n    bn_exponent = BN_new();\n    if(bn_exponent == NULL) {\n        rc = -1;\n        goto fail;\n    }\n\n    BN_bin2bn(exponent, exponentlen, bn_exponent);\n    rc = (EC_KEY_set_private_key(ec_key, bn_exponent) != 1);\n\n    if(rc == 0 && ec_key != NULL && pubkeydata != NULL && method != NULL) {\n        EVP_PKEY *pk = EVP_PKEY_new();\n        EVP_PKEY_set1_EC_KEY(pk, ec_key);\n\n        rc = gen_publickey_from_ec_evp(session, method, method_len,\n                                       pubkeydata, pubkeydata_len,\n                                       pk);\n\n        if(pk)\n            EVP_PKEY_free(pk);\n    }\n\n    if(ec_ctx != NULL)\n        *ec_ctx = ec_key;\n    else\n        EC_KEY_free(ec_key);\n\n    return rc;\n\nfail:\n\n    if(ec_key != NULL)\n        EC_KEY_free(ec_key);\n\n    return _libssh2_error(session,\n                          LIBSSH2_ERROR_ALLOC,\n                          \"Unable to allocate memory for private key data\");\n\n\n}\n\nstatic int\n_libssh2_ecdsa_new_openssh_private(libssh2_ecdsa_ctx ** ec_ctx,\n                                   LIBSSH2_SESSION * session,\n                                   const char *filename,\n                                   unsigned const char *passphrase)\n{\n    FILE *fp;\n    int rc;\n    unsigned char *buf = NULL;\n    libssh2_curve_type type;\n    struct string_buf *decrypted = NULL;\n\n    if(session == NULL) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                           \"Session is required\");\n        return -1;\n    }\n\n    _libssh2_init_if_needed();\n\n    fp = fopen(filename, \"r\");\n    if(!fp) {\n        _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                       \"Unable to open OpenSSH ECDSA private key file\");\n        return -1;\n    }\n\n    rc = _libssh2_openssh_pem_parse(session, passphrase, fp, &decrypted);\n    fclose(fp);\n    if(rc) {\n        return rc;\n    }\n\n    /* We have a new key file, now try and parse it using supported types  */\n    rc = _libssh2_get_string(decrypted, &buf, NULL);\n\n    if(rc != 0 || buf == NULL) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"Public key type in decrypted key data not found\");\n        return -1;\n    }\n\n    rc = _libssh2_ecdsa_curve_type_from_name((const char *)buf, &type);\n\n    if(rc == 0) {\n        rc = gen_publickey_from_ecdsa_openssh_priv_data(session, type,\n                                                        decrypted, NULL, 0,\n                                                        NULL, 0, ec_ctx);\n    }\n    else {\n        rc = -1;\n    }\n\n    if(decrypted)\n        _libssh2_string_buf_free(session, decrypted);\n\n    return rc;\n}\n\nint\n_libssh2_ecdsa_new_private(libssh2_ecdsa_ctx ** ec_ctx,\n       LIBSSH2_SESSION * session,\n       const char *filename, unsigned const char *passphrase)\n{\n    int rc;\n\n    pem_read_bio_func read_ec = (pem_read_bio_func) &PEM_read_bio_ECPrivateKey;\n    (void) session;\n\n    _libssh2_init_if_needed();\n\n    rc = read_private_key_from_file((void **) ec_ctx, read_ec,\n      filename, passphrase);\n\n    if(rc) {\n        return _libssh2_ecdsa_new_openssh_private(ec_ctx, session,\n                                                  filename, passphrase);\n    }\n\n    return rc;\n}\n\n/*\n * _libssh2_ecdsa_create_key\n *\n * Creates a local private key based on input curve\n * and returns octal value and octal length\n *\n */\n\nint\n_libssh2_ecdsa_create_key(LIBSSH2_SESSION *session,\n                          _libssh2_ec_key **out_private_key,\n                          unsigned char **out_public_key_octal,\n                          size_t *out_public_key_octal_len,\n                          libssh2_curve_type curve_type)\n{\n    int ret = 1;\n    size_t octal_len = 0;\n    unsigned char octal_value[EC_MAX_POINT_LEN];\n    const EC_POINT *public_key = NULL;\n    EC_KEY *private_key = NULL;\n    const EC_GROUP *group = NULL;\n\n    /* create key */\n    BN_CTX *bn_ctx = BN_CTX_new();\n    if(!bn_ctx)\n        return -1;\n\n    private_key = EC_KEY_new_by_curve_name(curve_type);\n    group = EC_KEY_get0_group(private_key);\n\n    EC_KEY_generate_key(private_key);\n    public_key = EC_KEY_get0_public_key(private_key);\n\n    /* get length */\n    octal_len = EC_POINT_point2oct(group, public_key,\n                                   POINT_CONVERSION_UNCOMPRESSED,\n                                   NULL, 0, bn_ctx);\n    if(octal_len > EC_MAX_POINT_LEN) {\n        ret = -1;\n        goto clean_exit;\n    }\n\n    /* convert to octal */\n    if(EC_POINT_point2oct(group, public_key, POINT_CONVERSION_UNCOMPRESSED,\n       octal_value, octal_len, bn_ctx) != octal_len) {\n           ret = -1;\n           goto clean_exit;\n    }\n\n    if(out_private_key != NULL)\n        *out_private_key = private_key;\n\n    if(out_public_key_octal) {\n        *out_public_key_octal = LIBSSH2_ALLOC(session, octal_len);\n        if(*out_public_key_octal == NULL) {\n            ret = -1;\n            goto clean_exit;\n        }\n\n        memcpy(*out_public_key_octal, octal_value, octal_len);\n    }\n\n    if(out_public_key_octal_len != NULL)\n        *out_public_key_octal_len = octal_len;\n\nclean_exit:\n\n    if(bn_ctx)\n        BN_CTX_free(bn_ctx);\n\n    return (ret == 1) ? 0 : -1;\n}\n\n/* _libssh2_ecdh_gen_k\n *\n * Computes the shared secret K given a local private key,\n * remote public key and length\n */\n\nint\n_libssh2_ecdh_gen_k(_libssh2_bn **k, _libssh2_ec_key *private_key,\n    const unsigned char *server_public_key, size_t server_public_key_len)\n{\n    int ret = 0;\n    int rc;\n    size_t secret_len;\n    unsigned char *secret = NULL;\n    const EC_GROUP *private_key_group;\n    EC_POINT *server_public_key_point;\n\n    BN_CTX *bn_ctx = BN_CTX_new();\n\n    if(!bn_ctx)\n        return -1;\n\n    if(k == NULL)\n        return -1;\n\n    private_key_group = EC_KEY_get0_group(private_key);\n\n    server_public_key_point = EC_POINT_new(private_key_group);\n    if(server_public_key_point == NULL)\n        return -1;\n\n    rc = EC_POINT_oct2point(private_key_group, server_public_key_point,\n                            server_public_key, server_public_key_len, bn_ctx);\n    if(rc != 1) {\n        ret = -1;\n        goto clean_exit;\n    }\n\n    secret_len = (EC_GROUP_get_degree(private_key_group) + 7) / 8;\n    secret = malloc(secret_len);\n    if(!secret) {\n        ret = -1;\n        goto clean_exit;\n    }\n\n    secret_len = ECDH_compute_key(secret, secret_len, server_public_key_point,\n                                  private_key, NULL);\n\n    if(secret_len <= 0 || secret_len > EC_MAX_POINT_LEN) {\n        ret = -1;\n        goto clean_exit;\n    }\n\n    BN_bin2bn(secret, secret_len, *k);\n\nclean_exit:\n\n    if(server_public_key_point != NULL)\n        EC_POINT_free(server_public_key_point);\n\n    if(bn_ctx != NULL)\n        BN_CTX_free(bn_ctx);\n\n    if(secret != NULL)\n        free(secret);\n\n    return ret;\n}\n\n\n#endif /* LIBSSH2_ECDSA */\n\n#if LIBSSH2_ED25519\n\nint\n_libssh2_ed25519_sign(libssh2_ed25519_ctx *ctx, LIBSSH2_SESSION *session,\n                      uint8_t **out_sig, size_t *out_sig_len,\n                      const uint8_t *message, size_t message_len)\n{\n    int rc = -1;\n    EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();\n    size_t sig_len = 0;\n    unsigned char *sig = NULL;\n\n    if(md_ctx != NULL) {\n        if(EVP_DigestSignInit(md_ctx, NULL, NULL, NULL, ctx->private_key) != 1)\n            goto clean_exit;\n        if(EVP_DigestSign(md_ctx, NULL, &sig_len, message, message_len) != 1)\n            goto clean_exit;\n\n        if(sig_len != LIBSSH2_ED25519_SIG_LEN)\n            goto clean_exit;\n\n        sig = LIBSSH2_CALLOC(session, sig_len);\n        if(sig == NULL)\n            goto clean_exit;\n\n        rc = EVP_DigestSign(md_ctx, sig, &sig_len, message, message_len);\n    }\n\n    if(rc == 1) {\n        *out_sig = sig;\n        *out_sig_len = sig_len;\n    }\n    else {\n        *out_sig_len = 0;\n        *out_sig = NULL;\n        LIBSSH2_FREE(session, sig);\n    }\n\nclean_exit:\n\n    if(md_ctx)\n        EVP_MD_CTX_free(md_ctx);\n\n    return (rc == 1 ? 0 : -1);\n}\n\nint\n_libssh2_curve25519_gen_k(_libssh2_bn **k,\n                          uint8_t private_key[LIBSSH2_ED25519_KEY_LEN],\n                          uint8_t server_public_key[LIBSSH2_ED25519_KEY_LEN])\n{\n    int rc = -1;\n    unsigned char out_shared_key[LIBSSH2_ED25519_KEY_LEN];\n    EVP_PKEY *peer_key = NULL, *server_key = NULL;\n    EVP_PKEY_CTX *server_key_ctx = NULL;\n    BN_CTX *bn_ctx = NULL;\n    size_t out_len = 0;\n\n    if(k == NULL || *k == NULL)\n        return -1;\n\n    bn_ctx = BN_CTX_new();\n    if(bn_ctx == NULL)\n        return -1;\n\n    peer_key = EVP_PKEY_new_raw_public_key(EVP_PKEY_X25519, NULL,\n                                           server_public_key,\n                                           LIBSSH2_ED25519_KEY_LEN);\n\n    server_key = EVP_PKEY_new_raw_private_key(EVP_PKEY_X25519, NULL,\n                                              private_key,\n                                              LIBSSH2_ED25519_KEY_LEN);\n\n    if(peer_key == NULL || server_key == NULL) {\n        goto cleanExit;\n    }\n\n    server_key_ctx = EVP_PKEY_CTX_new(server_key, NULL);\n    if(server_key_ctx == NULL) {\n        goto cleanExit;\n    }\n\n    rc = EVP_PKEY_derive_init(server_key_ctx);\n    if(rc <= 0) goto cleanExit;\n\n    rc = EVP_PKEY_derive_set_peer(server_key_ctx, peer_key);\n    if(rc <= 0) goto cleanExit;\n\n    rc = EVP_PKEY_derive(server_key_ctx, NULL, &out_len);\n    if(rc <= 0) goto cleanExit;\n\n    if(out_len != LIBSSH2_ED25519_KEY_LEN) {\n        rc = -1;\n        goto cleanExit;\n    }\n\n    rc = EVP_PKEY_derive(server_key_ctx, out_shared_key, &out_len);\n\n    if(rc == 1 && out_len == LIBSSH2_ED25519_KEY_LEN) {\n        BN_bin2bn(out_shared_key, LIBSSH2_ED25519_KEY_LEN, *k);\n    }\n    else {\n        rc = -1;\n    }\n\ncleanExit:\n\n    if(server_key_ctx)\n        EVP_PKEY_CTX_free(server_key_ctx);\n    if(peer_key)\n        EVP_PKEY_free(peer_key);\n    if(server_key)\n        EVP_PKEY_free(server_key);\n    if(bn_ctx != NULL)\n        BN_CTX_free(bn_ctx);\n\n    return (rc == 1) ? 0 : -1;\n}\n\n\nint\n_libssh2_ed25519_verify(libssh2_ed25519_ctx *ctx, const uint8_t *s,\n                        size_t s_len, const uint8_t *m, size_t m_len)\n{\n    int ret = -1;\n\n    EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();\n    if(NULL == md_ctx)\n        return -1;\n\n    ret = EVP_DigestVerifyInit(md_ctx, NULL, NULL, NULL, ctx->public_key);\n    if(ret != 1)\n        goto clean_exit;\n\n    ret = EVP_DigestVerify(md_ctx, s, s_len, m, m_len);\n\n    clean_exit:\n\n    EVP_MD_CTX_free(md_ctx);\n\n    return (ret == 1) ? 0 : -1;\n}\n\n#endif /* LIBSSH2_ED25519 */\n\nstatic int\n_libssh2_pub_priv_openssh_keyfile(LIBSSH2_SESSION *session,\n                                  unsigned char **method,\n                                  size_t *method_len,\n                                  unsigned char **pubkeydata,\n                                  size_t *pubkeydata_len,\n                                  const char *privatekey,\n                                  const char *passphrase)\n{\n    FILE *fp;\n    unsigned char *buf = NULL;\n    struct string_buf *decrypted = NULL;\n    int rc = 0;\n\n    if(session == NULL) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"Session is required\");\n        return -1;\n    }\n\n    _libssh2_init_if_needed();\n\n    fp = fopen(privatekey, \"r\");\n    if(!fp) {\n        _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                       \"Unable to open private key file\");\n        return -1;\n    }\n\n    rc = _libssh2_openssh_pem_parse(session, (const unsigned char *)passphrase,\n                                    fp, &decrypted);\n    fclose(fp);\n    if(rc) {\n        _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                       \"Not an OpenSSH key file\");\n        return rc;\n    }\n\n    /* We have a new key file, now try and parse it using supported types  */\n    rc = _libssh2_get_string(decrypted, &buf, NULL);\n\n    if(rc != 0 || buf == NULL) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"Public key type in decrypted key data not found\");\n        return -1;\n    }\n\n    rc = -1;\n\n#if LIBSSH2_ED25519\n    if(strcmp(\"ssh-ed25519\", (const char *)buf) == 0) {\n        rc = gen_publickey_from_ed25519_openssh_priv_data(session, decrypted,\n                                                          method, method_len,\n                                                          pubkeydata,\n                                                          pubkeydata_len,\n                                                          NULL);\n    }\n#endif\n#if LIBSSH2_RSA\n    if(strcmp(\"ssh-rsa\", (const char *)buf) == 0) {\n        rc = gen_publickey_from_rsa_openssh_priv_data(session, decrypted,\n                                                      method, method_len,\n                                                      pubkeydata,\n                                                      pubkeydata_len,\n                                                      NULL);\n    }\n#endif\n#if LIBSSH2_DSA\n    if(strcmp(\"ssh-dss\", (const char *)buf) == 0) {\n        rc = gen_publickey_from_dsa_openssh_priv_data(session, decrypted,\n                                                      method, method_len,\n                                                      pubkeydata,\n                                                      pubkeydata_len,\n                                                      NULL);\n    }\n#endif\n#if LIBSSH2_ECDSA\n    {\n        libssh2_curve_type type;\n\n        if(_libssh2_ecdsa_curve_type_from_name((const char *)buf,\n                                               &type) == 0) {\n            rc = gen_publickey_from_ecdsa_openssh_priv_data(session, type,\n                                                            decrypted,\n                                                            method, method_len,\n                                                            pubkeydata,\n                                                            pubkeydata_len,\n                                                            NULL);\n        }\n    }\n#endif\n\n    if(decrypted)\n        _libssh2_string_buf_free(session, decrypted);\n\n    if(rc != 0) {\n        _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                       \"Unsupported OpenSSH key type\");\n    }\n\n    return rc;\n}\n\nint\n_libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session,\n                          unsigned char **method,\n                          size_t *method_len,\n                          unsigned char **pubkeydata,\n                          size_t *pubkeydata_len,\n                          const char *privatekey,\n                          const char *passphrase)\n{\n    int       st;\n    BIO*      bp;\n    EVP_PKEY* pk;\n    int       pktype;\n    int       rc;\n\n    _libssh2_debug(session,\n                   LIBSSH2_TRACE_AUTH,\n                   \"Computing public key from private key file: %s\",\n                   privatekey);\n\n    bp = BIO_new_file(privatekey, \"r\");\n    if(bp == NULL) {\n        return _libssh2_error(session,\n                              LIBSSH2_ERROR_FILE,\n                              \"Unable to extract public key from private key \"\n                              \"file: Unable to open private key file\");\n    }\n\n    BIO_reset(bp);\n    pk = PEM_read_bio_PrivateKey(bp, NULL, NULL, (void *)passphrase);\n    BIO_free(bp);\n\n    if(pk == NULL) {\n\n        /* Try OpenSSH format */\n        rc = _libssh2_pub_priv_openssh_keyfile(session,\n                                               method,\n                                               method_len,\n                                               pubkeydata, pubkeydata_len,\n                                               privatekey, passphrase);\n        if(rc != 0) {\n            return _libssh2_error(session,\n                                  LIBSSH2_ERROR_FILE,\n                                  \"Unable to extract public key \"\n                                  \"from private key file: \"\n                                  \"Wrong passphrase or invalid/unrecognized \"\n                                  \"private key file format\");\n        }\n\n        return 0;\n    }\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    pktype = EVP_PKEY_id(pk);\n#else\n    pktype = pk->type;\n#endif\n\n    switch(pktype) {\n    case EVP_PKEY_RSA :\n        st = gen_publickey_from_rsa_evp(\n            session, method, method_len, pubkeydata, pubkeydata_len, pk);\n        break;\n\n#if LIBSSH2_DSA\n    case EVP_PKEY_DSA :\n        st = gen_publickey_from_dsa_evp(\n            session, method, method_len, pubkeydata, pubkeydata_len, pk);\n        break;\n#endif /* LIBSSH_DSA */\n\n#if LIBSSH2_ECDSA\n    case EVP_PKEY_EC :\n        st = gen_publickey_from_ec_evp(\n            session, method, method_len, pubkeydata, pubkeydata_len, pk);\n    break;\n#endif\n\n    default :\n        st = _libssh2_error(session,\n                            LIBSSH2_ERROR_FILE,\n                            \"Unable to extract public key \"\n                            \"from private key file: \"\n                            \"Unsupported private key file format\");\n        break;\n    }\n\n    EVP_PKEY_free(pk);\n    return st;\n}\n\nstatic int\n_libssh2_pub_priv_openssh_keyfilememory(LIBSSH2_SESSION *session,\n                                        void **key_ctx,\n                                        const char *key_type,\n                                        unsigned char **method,\n                                        size_t *method_len,\n                                        unsigned char **pubkeydata,\n                                        size_t *pubkeydata_len,\n                                        const char *privatekeydata,\n                                        size_t privatekeydata_len,\n                                        unsigned const char *passphrase)\n{\n    int rc;\n    unsigned char *buf = NULL;\n    struct string_buf *decrypted = NULL;\n\n    if(key_ctx != NULL)\n        *key_ctx = NULL;\n\n    if(session == NULL) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"Session is required\");\n        return -1;\n    }\n\n    if(key_type != NULL && (strlen(key_type) > 11 || strlen(key_type) < 7)) {\n        _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"type is invalid\");\n        return -1;\n    }\n\n    _libssh2_init_if_needed();\n\n    rc = _libssh2_openssh_pem_parse_memory(session, passphrase,\n                                           privatekeydata,\n                                           privatekeydata_len, &decrypted);\n\n    if(rc) {\n        return rc;\n    }\n\n   /* We have a new key file, now try and parse it using supported types  */\n   rc = _libssh2_get_string(decrypted, &buf, NULL);\n\n   if(rc != 0 || buf == NULL) {\n       _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                      \"Public key type in decrypted key data not found\");\n       return -1;\n   }\n\n   rc = -1;\n\n#if LIBSSH2_ED25519\n    if(strcmp(\"ssh-ed25519\", (const char *)buf) == 0) {\n        if(key_type == NULL || strcmp(\"ssh-ed25519\", key_type) == 0) {\n            rc = gen_publickey_from_ed25519_openssh_priv_data(session,\n                                                              decrypted,\n                                                              method,\n                                                              method_len,\n                                                              pubkeydata,\n                                                              pubkeydata_len,\n                                              (libssh2_ed25519_ctx**)key_ctx);\n        }\n   }\n#endif\n#if LIBSSH2_RSA\n    if(strcmp(\"ssh-rsa\", (const char *)buf) == 0) {\n        if(key_type == NULL || strcmp(\"ssh-rsa\", key_type) == 0) {\n            rc = gen_publickey_from_rsa_openssh_priv_data(session, decrypted,\n                                                          method, method_len,\n                                                          pubkeydata,\n                                                          pubkeydata_len,\n                                                (libssh2_rsa_ctx**)key_ctx);\n        }\n   }\n#endif\n#if LIBSSH2_DSA\n    if(strcmp(\"ssh-dss\", (const char *)buf) == 0) {\n        if(key_type == NULL || strcmp(\"ssh-dss\", key_type) == 0) {\n            rc = gen_publickey_from_dsa_openssh_priv_data(session, decrypted,\n                                                         method, method_len,\n                                                          pubkeydata,\n                                                          pubkeydata_len,\n                                                 (libssh2_dsa_ctx**)key_ctx);\n        }\n   }\n#endif\n#if LIBSSH2_ECDSA\n{\n   libssh2_curve_type type;\n\n   if(_libssh2_ecdsa_curve_type_from_name((const char *)buf, &type) == 0) {\n       if(key_type == NULL || strcmp(\"ssh-ecdsa\", key_type) == 0) {\n           rc = gen_publickey_from_ecdsa_openssh_priv_data(session, type,\n                                                           decrypted,\n                                                           method, method_len,\n                                                           pubkeydata,\n                                                           pubkeydata_len,\n                                               (libssh2_ecdsa_ctx**)key_ctx);\n        }\n    }\n}\n#endif\n\n    if(decrypted)\n        _libssh2_string_buf_free(session, decrypted);\n\n    return rc;\n}\n\nint\nread_openssh_private_key_from_memory(void **key_ctx, LIBSSH2_SESSION *session,\n                                     const char *key_type,\n                                     const char *filedata,\n                                     size_t filedata_len,\n                                     unsigned const char *passphrase)\n{\n    return _libssh2_pub_priv_openssh_keyfilememory(session, key_ctx, key_type,\n                                                   NULL, NULL, NULL, NULL,\n                                                   filedata, filedata_len,\n                                                   passphrase);\n}\n\nint\n_libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session,\n                                unsigned char **method,\n                                size_t *method_len,\n                                unsigned char **pubkeydata,\n                                size_t *pubkeydata_len,\n                                const char *privatekeydata,\n                                size_t privatekeydata_len,\n                                const char *passphrase)\n{\n    int       st;\n    BIO*      bp;\n    EVP_PKEY* pk;\n    int       pktype;\n\n    _libssh2_debug(session,\n                   LIBSSH2_TRACE_AUTH,\n                   \"Computing public key from private key.\");\n\n    bp = BIO_new_mem_buf((char *)privatekeydata, privatekeydata_len);\n    if(!bp) {\n        return -1;\n    }\n\n    BIO_reset(bp);\n    pk = PEM_read_bio_PrivateKey(bp, NULL, NULL, (void *)passphrase);\n    BIO_free(bp);\n\n    if(pk == NULL) {\n        /* Try OpenSSH format */\n        st = _libssh2_pub_priv_openssh_keyfilememory(session, NULL, NULL,\n                                                     method,\n                                                     method_len,\n                                                     pubkeydata,\n                                                     pubkeydata_len,\n                                                     privatekeydata,\n                                                     privatekeydata_len,\n                                           (unsigned const char *)passphrase);\n        if(st != 0) {\n            return _libssh2_error(session,\n                                  LIBSSH2_ERROR_FILE,\n                                  \"Unable to extract public key \"\n                                  \"from private key file: \"\n                                  \"Wrong passphrase or invalid/unrecognized \"\n                                  \"private key file format\");\n        }\n\n        return 0;\n    }\n\n#ifdef HAVE_OPAQUE_STRUCTS\n    pktype = EVP_PKEY_id(pk);\n#else\n    pktype = pk->type;\n#endif\n\n    switch(pktype) {\n    case EVP_PKEY_RSA :\n        st = gen_publickey_from_rsa_evp(session, method, method_len,\n                                        pubkeydata, pubkeydata_len, pk);\n        break;\n#if LIBSSH2_DSA\n    case EVP_PKEY_DSA :\n        st = gen_publickey_from_dsa_evp(session, method, method_len,\n                                        pubkeydata, pubkeydata_len, pk);\n        break;\n#endif /* LIBSSH_DSA */\n#if LIBSSH2_ECDSA\n    case EVP_PKEY_EC :\n        st = gen_publickey_from_ec_evp(session, method, method_len,\n                                       pubkeydata, pubkeydata_len, pk);\n        break;\n#endif /* LIBSSH2_ECDSA */\n    default :\n        st = _libssh2_error(session,\n                            LIBSSH2_ERROR_FILE,\n                            \"Unable to extract public key \"\n                            \"from private key file: \"\n                            \"Unsupported private key file format\");\n        break;\n    }\n\n    EVP_PKEY_free(pk);\n    return st;\n}\n\nvoid\n_libssh2_dh_init(_libssh2_dh_ctx *dhctx)\n{\n    *dhctx = BN_new();                          /* Random from client */\n}\n\nint\n_libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public,\n                     _libssh2_bn *g, _libssh2_bn *p, int group_order,\n                     _libssh2_bn_ctx *bnctx)\n{\n    /* Generate x and e */\n    BN_rand(*dhctx, group_order * 8 - 1, 0, -1);\n    BN_mod_exp(public, g, *dhctx, p, bnctx);\n    return 0;\n}\n\nint\n_libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret,\n                   _libssh2_bn *f, _libssh2_bn *p,\n                   _libssh2_bn_ctx *bnctx)\n{\n    /* Compute the shared secret */\n    BN_mod_exp(secret, f, *dhctx, p, bnctx);\n    return 0;\n}\n\nvoid\n_libssh2_dh_dtor(_libssh2_dh_ctx *dhctx)\n{\n    BN_clear_free(*dhctx);\n    *dhctx = NULL;\n}\n\n#endif /* LIBSSH2_OPENSSL */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/openssl.h",
    "content": "/* Copyright (C) 2009, 2010 Simon Josefsson\n * Copyright (C) 2006, 2007 The Written Word, Inc.  All rights reserved.\n *\n * Author: Simon Josefsson\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include <openssl/opensslconf.h>\n#include <openssl/sha.h>\n#include <openssl/rsa.h>\n#ifndef OPENSSL_NO_ENGINE\n#include <openssl/engine.h>\n#endif\n#ifndef OPENSSL_NO_DSA\n#include <openssl/dsa.h>\n#endif\n#ifndef OPENSSL_NO_MD5\n#include <openssl/md5.h>\n#endif\n#include <openssl/evp.h>\n#include <openssl/hmac.h>\n#include <openssl/bn.h>\n#include <openssl/pem.h>\n#include <openssl/rand.h>\n\n#if OPENSSL_VERSION_NUMBER >= 0x10100000L && \\\n    !defined(LIBRESSL_VERSION_NUMBER)\n# define HAVE_OPAQUE_STRUCTS 1\n#endif\n\n#ifdef OPENSSL_NO_RSA\n# define LIBSSH2_RSA 0\n#else\n# define LIBSSH2_RSA 1\n#endif\n\n#ifdef OPENSSL_NO_DSA\n# define LIBSSH2_DSA 0\n#else\n# define LIBSSH2_DSA 1\n#endif\n\n#ifdef OPENSSL_NO_ECDSA\n# define LIBSSH2_ECDSA 0\n#else\n# define LIBSSH2_ECDSA 1\n#endif\n\n#if OPENSSL_VERSION_NUMBER >= 0x10101000L && \\\n!defined(LIBRESSL_VERSION_NUMBER)\n# define LIBSSH2_ED25519 1\n#else\n# define LIBSSH2_ED25519 0\n#endif\n\n\n#ifdef OPENSSL_NO_MD5\n# define LIBSSH2_MD5 0\n#else\n# define LIBSSH2_MD5 1\n#endif\n\n#ifdef OPENSSL_NO_RIPEMD\n# define LIBSSH2_HMAC_RIPEMD 0\n#else\n# define LIBSSH2_HMAC_RIPEMD 1\n#endif\n\n#define LIBSSH2_HMAC_SHA256 1\n#define LIBSSH2_HMAC_SHA512 1\n\n#if OPENSSL_VERSION_NUMBER >= 0x00907000L && !defined(OPENSSL_NO_AES)\n# define LIBSSH2_AES_CTR 1\n# define LIBSSH2_AES 1\n#else\n# define LIBSSH2_AES_CTR 0\n# define LIBSSH2_AES 0\n#endif\n\n#ifdef OPENSSL_NO_BF\n# define LIBSSH2_BLOWFISH 0\n#else\n# define LIBSSH2_BLOWFISH 1\n#endif\n\n#ifdef OPENSSL_NO_RC4\n# define LIBSSH2_RC4 0\n#else\n# define LIBSSH2_RC4 1\n#endif\n\n#ifdef OPENSSL_NO_CAST\n# define LIBSSH2_CAST 0\n#else\n# define LIBSSH2_CAST 1\n#endif\n\n#ifdef OPENSSL_NO_DES\n# define LIBSSH2_3DES 0\n#else\n# define LIBSSH2_3DES 1\n#endif\n\n#define EC_MAX_POINT_LEN ((528 * 2 / 8) + 1)\n\n#define _libssh2_random(buf, len) RAND_bytes ((buf), (len))\n\n#define libssh2_prepare_iovec(vec, len)  /* Empty. */\n\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_sha1_ctx EVP_MD_CTX *\n#else\n#define libssh2_sha1_ctx EVP_MD_CTX\n#endif\n\n/* returns 0 in case of failure */\nint _libssh2_sha1_init(libssh2_sha1_ctx *ctx);\n#define libssh2_sha1_init(x) _libssh2_sha1_init(x)\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_sha1_update(ctx, data, len) EVP_DigestUpdate(ctx, data, len)\n#define libssh2_sha1_final(ctx, out) do { \\\n                                         EVP_DigestFinal(ctx, out, NULL); \\\n                                         EVP_MD_CTX_free(ctx); \\\n                                     } while(0)\n#else\n#define libssh2_sha1_update(ctx, data, len) EVP_DigestUpdate(&(ctx), data, len)\n#define libssh2_sha1_final(ctx, out) EVP_DigestFinal(&(ctx), out, NULL)\n#endif\nint _libssh2_sha1(const unsigned char *message, unsigned long len,\n                  unsigned char *out);\n#define libssh2_sha1(x,y,z) _libssh2_sha1(x,y,z)\n\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_sha256_ctx EVP_MD_CTX *\n#else\n#define libssh2_sha256_ctx EVP_MD_CTX\n#endif\n\n/* returns 0 in case of failure */\nint _libssh2_sha256_init(libssh2_sha256_ctx *ctx);\n#define libssh2_sha256_init(x) _libssh2_sha256_init(x)\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_sha256_update(ctx, data, len) EVP_DigestUpdate(ctx, data, len)\n#define libssh2_sha256_final(ctx, out) do { \\\n                                           EVP_DigestFinal(ctx, out, NULL); \\\n                                           EVP_MD_CTX_free(ctx); \\\n                                       } while(0)\n#else\n#define libssh2_sha256_update(ctx, data, len) \\\n    EVP_DigestUpdate(&(ctx), data, len)\n#define libssh2_sha256_final(ctx, out) EVP_DigestFinal(&(ctx), out, NULL)\n#endif\nint _libssh2_sha256(const unsigned char *message, unsigned long len,\n                  unsigned char *out);\n#define libssh2_sha256(x,y,z) _libssh2_sha256(x,y,z)\n\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_sha384_ctx EVP_MD_CTX *\n#else\n#define libssh2_sha384_ctx EVP_MD_CTX\n#endif\n\n/* returns 0 in case of failure */\nint _libssh2_sha384_init(libssh2_sha384_ctx *ctx);\n#define libssh2_sha384_init(x) _libssh2_sha384_init(x)\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_sha384_update(ctx, data, len) EVP_DigestUpdate(ctx, data, len)\n#define libssh2_sha384_final(ctx, out) do { \\\n                                            EVP_DigestFinal(ctx, out, NULL); \\\n                                            EVP_MD_CTX_free(ctx); \\\n                                       } while(0)\n#else\n#define libssh2_sha384_update(ctx, data, len)   \\\n    EVP_DigestUpdate(&(ctx), data, len)\n#define libssh2_sha384_final(ctx, out) EVP_DigestFinal(&(ctx), out, NULL)\n#endif\nint _libssh2_sha384(const unsigned char *message, unsigned long len,\n                    unsigned char *out);\n#define libssh2_sha384(x,y,z) _libssh2_sha384(x,y,z)\n\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_sha512_ctx EVP_MD_CTX *\n#else\n#define libssh2_sha512_ctx EVP_MD_CTX\n#endif\n\n/* returns 0 in case of failure */\nint _libssh2_sha512_init(libssh2_sha512_ctx *ctx);\n#define libssh2_sha512_init(x) _libssh2_sha512_init(x)\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_sha512_update(ctx, data, len) EVP_DigestUpdate(ctx, data, len)\n#define libssh2_sha512_final(ctx, out) do { \\\n                                            EVP_DigestFinal(ctx, out, NULL); \\\n                                            EVP_MD_CTX_free(ctx); \\\n                                       } while(0)\n#else\n#define libssh2_sha512_update(ctx, data, len)   \\\n    EVP_DigestUpdate(&(ctx), data, len)\n#define libssh2_sha512_final(ctx, out) EVP_DigestFinal(&(ctx), out, NULL)\n#endif\nint _libssh2_sha512(const unsigned char *message, unsigned long len,\n                    unsigned char *out);\n#define libssh2_sha512(x,y,z) _libssh2_sha512(x,y,z)\n\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_md5_ctx EVP_MD_CTX *\n#else\n#define libssh2_md5_ctx EVP_MD_CTX\n#endif\n\n/* returns 0 in case of failure */\nint _libssh2_md5_init(libssh2_md5_ctx *ctx);\n#define libssh2_md5_init(x) _libssh2_md5_init(x)\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_md5_update(ctx, data, len) EVP_DigestUpdate(ctx, data, len)\n#define libssh2_md5_final(ctx, out) do { \\\n                                        EVP_DigestFinal(ctx, out, NULL); \\\n                                        EVP_MD_CTX_free(ctx); \\\n                                    } while(0)\n#else\n#define libssh2_md5_update(ctx, data, len) EVP_DigestUpdate(&(ctx), data, len)\n#define libssh2_md5_final(ctx, out) EVP_DigestFinal(&(ctx), out, NULL)\n#endif\n\n#ifdef HAVE_OPAQUE_STRUCTS\n#define libssh2_hmac_ctx HMAC_CTX *\n#define libssh2_hmac_ctx_init(ctx) ctx = HMAC_CTX_new()\n#define libssh2_hmac_sha1_init(ctx, key, keylen) \\\n  HMAC_Init_ex(*(ctx), key, keylen, EVP_sha1(), NULL)\n#define libssh2_hmac_md5_init(ctx, key, keylen) \\\n  HMAC_Init_ex(*(ctx), key, keylen, EVP_md5(), NULL)\n#define libssh2_hmac_ripemd160_init(ctx, key, keylen) \\\n  HMAC_Init_ex(*(ctx), key, keylen, EVP_ripemd160(), NULL)\n#define libssh2_hmac_sha256_init(ctx, key, keylen) \\\n  HMAC_Init_ex(*(ctx), key, keylen, EVP_sha256(), NULL)\n#define libssh2_hmac_sha512_init(ctx, key, keylen) \\\n  HMAC_Init_ex(*(ctx), key, keylen, EVP_sha512(), NULL)\n\n#define libssh2_hmac_update(ctx, data, datalen) \\\n  HMAC_Update(ctx, data, datalen)\n#define libssh2_hmac_final(ctx, data) HMAC_Final(ctx, data, NULL)\n#define libssh2_hmac_cleanup(ctx) HMAC_CTX_free(*(ctx))\n#else\n#define libssh2_hmac_ctx HMAC_CTX\n#define libssh2_hmac_ctx_init(ctx) \\\n  HMAC_CTX_init(&ctx)\n#define libssh2_hmac_sha1_init(ctx, key, keylen) \\\n  HMAC_Init_ex(ctx, key, keylen, EVP_sha1(), NULL)\n#define libssh2_hmac_md5_init(ctx, key, keylen) \\\n  HMAC_Init_ex(ctx, key, keylen, EVP_md5(), NULL)\n#define libssh2_hmac_ripemd160_init(ctx, key, keylen) \\\n  HMAC_Init_ex(ctx, key, keylen, EVP_ripemd160(), NULL)\n#define libssh2_hmac_sha256_init(ctx, key, keylen) \\\n  HMAC_Init_ex(ctx, key, keylen, EVP_sha256(), NULL)\n#define libssh2_hmac_sha512_init(ctx, key, keylen) \\\n  HMAC_Init_ex(ctx, key, keylen, EVP_sha512(), NULL)\n\n#define libssh2_hmac_update(ctx, data, datalen) \\\n  HMAC_Update(&(ctx), data, datalen)\n#define libssh2_hmac_final(ctx, data) HMAC_Final(&(ctx), data, NULL)\n#define libssh2_hmac_cleanup(ctx) HMAC_cleanup(ctx)\n#endif\n\nextern void _libssh2_openssl_crypto_init(void);\nextern void _libssh2_openssl_crypto_exit(void);\n#define libssh2_crypto_init() _libssh2_openssl_crypto_init()\n#define libssh2_crypto_exit() _libssh2_openssl_crypto_exit()\n\n#define libssh2_rsa_ctx RSA\n\n#define _libssh2_rsa_free(rsactx) RSA_free(rsactx)\n\n#define libssh2_dsa_ctx DSA\n\n#define _libssh2_dsa_free(dsactx) DSA_free(dsactx)\n\n#ifdef LIBSSH2_ECDSA\n#define libssh2_ecdsa_ctx EC_KEY\n#define _libssh2_ecdsa_free(ecdsactx) EC_KEY_free(ecdsactx)\n#define _libssh2_ec_key EC_KEY\n\ntypedef enum {\n    LIBSSH2_EC_CURVE_NISTP256 = NID_X9_62_prime256v1,\n    LIBSSH2_EC_CURVE_NISTP384 = NID_secp384r1,\n    LIBSSH2_EC_CURVE_NISTP521 = NID_secp521r1\n}\nlibssh2_curve_type;\n#else\n#define _libssh2_ec_key void\n#endif /* LIBSSH2_ECDSA */\n\n#ifdef LIBSSH2_ED25519\n\ntypedef struct {\n    EVP_PKEY *public_key;\n    EVP_PKEY *private_key;\n} libssh2_curve25519_keys;\n\n#define libssh2_ed25519_ctx libssh2_curve25519_keys\n#define libssh2_x25519_ctx libssh2_curve25519_keys\n\n#define _libssh2_ed25519_new_ctx() calloc(1, sizeof(libssh2_ed25519_ctx))\n#define _libssh2_ed25519_free(ctx) do { \\\n if(ctx) { \\\n  if(ctx->public_key) EVP_PKEY_free(ctx->public_key); \\\n  if(ctx->private_key) EVP_PKEY_free(ctx->private_key); \\\n  free(ctx); \\\n } \\\n} while(0)\n\n#define _libssh2_x25519_free(ctx) _libssh2_ed25519_free(ctx)\n\n#endif /* ED25519 */\n\n#define _libssh2_cipher_type(name) const EVP_CIPHER *(*name)(void)\n#ifdef HAVE_OPAQUE_STRUCTS\n#define _libssh2_cipher_ctx EVP_CIPHER_CTX *\n#else\n#define _libssh2_cipher_ctx EVP_CIPHER_CTX\n#endif\n\n#define _libssh2_cipher_aes256 EVP_aes_256_cbc\n#define _libssh2_cipher_aes192 EVP_aes_192_cbc\n#define _libssh2_cipher_aes128 EVP_aes_128_cbc\n#ifdef HAVE_EVP_AES_128_CTR\n#define _libssh2_cipher_aes128ctr EVP_aes_128_ctr\n#define _libssh2_cipher_aes192ctr EVP_aes_192_ctr\n#define _libssh2_cipher_aes256ctr EVP_aes_256_ctr\n#else\n#define _libssh2_cipher_aes128ctr _libssh2_EVP_aes_128_ctr\n#define _libssh2_cipher_aes192ctr _libssh2_EVP_aes_192_ctr\n#define _libssh2_cipher_aes256ctr _libssh2_EVP_aes_256_ctr\n#endif\n#define _libssh2_cipher_blowfish EVP_bf_cbc\n#define _libssh2_cipher_arcfour EVP_rc4\n#define _libssh2_cipher_cast5 EVP_cast5_cbc\n#define _libssh2_cipher_3des EVP_des_ede3_cbc\n\n#ifdef HAVE_OPAQUE_STRUCTS\n#define _libssh2_cipher_dtor(ctx) EVP_CIPHER_CTX_free(*(ctx))\n#else\n#define _libssh2_cipher_dtor(ctx) EVP_CIPHER_CTX_cleanup(ctx)\n#endif\n\n#define _libssh2_bn BIGNUM\n#define _libssh2_bn_ctx BN_CTX\n#define _libssh2_bn_ctx_new() BN_CTX_new()\n#define _libssh2_bn_ctx_free(bnctx) BN_CTX_free(bnctx)\n#define _libssh2_bn_init() BN_new()\n#define _libssh2_bn_init_from_bin() _libssh2_bn_init()\n#define _libssh2_bn_set_word(bn, val) BN_set_word(bn, val)\n#define _libssh2_bn_from_bin(bn, len, val) BN_bin2bn(val, len, bn)\n#define _libssh2_bn_to_bin(bn, val) BN_bn2bin(bn, val)\n#define _libssh2_bn_bytes(bn) BN_num_bytes(bn)\n#define _libssh2_bn_bits(bn) BN_num_bits(bn)\n#define _libssh2_bn_free(bn) BN_clear_free(bn)\n\n#define _libssh2_dh_ctx BIGNUM *\n#define libssh2_dh_init(dhctx) _libssh2_dh_init(dhctx)\n#define libssh2_dh_key_pair(dhctx, public, g, p, group_order, bnctx) \\\n        _libssh2_dh_key_pair(dhctx, public, g, p, group_order, bnctx)\n#define libssh2_dh_secret(dhctx, secret, f, p, bnctx) \\\n        _libssh2_dh_secret(dhctx, secret, f, p, bnctx)\n#define libssh2_dh_dtor(dhctx) _libssh2_dh_dtor(dhctx)\nextern void _libssh2_dh_init(_libssh2_dh_ctx *dhctx);\nextern int _libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public,\n                                _libssh2_bn *g, _libssh2_bn *p,\n                                int group_order,\n                                _libssh2_bn_ctx *bnctx);\nextern int _libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret,\n                              _libssh2_bn *f, _libssh2_bn *p,\n                              _libssh2_bn_ctx *bnctx);\nextern void _libssh2_dh_dtor(_libssh2_dh_ctx *dhctx);\n\nconst EVP_CIPHER *_libssh2_EVP_aes_128_ctr(void);\nconst EVP_CIPHER *_libssh2_EVP_aes_192_ctr(void);\nconst EVP_CIPHER *_libssh2_EVP_aes_256_ctr(void);\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/os400qc3.c",
    "content": "/*\n * Copyright (C) 2015-2016 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\n#ifdef LIBSSH2_OS400QC3 /* compile only if we build with OS/400 QC3 library */\n\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n\n#include <stdio.h>\n#include <stdarg.h>\n#include <alloca.h>\n#include <sys/uio.h>\n\n#include <arpa/inet.h>\n\n\n#ifdef OS400_DEBUG\n/* In debug mode, all system library errors cause an exception. */\n#define set_EC_length(ec, length)   ((ec).Bytes_Provided =                  \\\n                                     (ec).Bytes_Available = 0)\n#else\n#define set_EC_length(ec, length)   ((ec).Bytes_Provided = (length))\n#endif\n\n\n/* Ensure va_list operations are not on an array. */\ntypedef struct {\n    va_list     list;\n}       valiststr;\n\n\ntypedef int (*loadkeyproc)(LIBSSH2_SESSION *session,\n                           const unsigned char *data, unsigned int datalen,\n                           const unsigned char *passphrase, void *loadkeydata);\n\n/* Public key extraction data. */\ntypedef struct {\n    const char *            method;\n    const unsigned char *   data;\n    unsigned int            length;\n}       loadpubkeydata;\n\n\n/* Support for ASN.1 elements. */\n\ntypedef struct {\n    char *          header;         /* Pointer to header byte. */\n    char *          beg;            /* Pointer to element data. */\n    char *          end;            /* Pointer to 1st byte after element. */\n    unsigned char   class;          /* ASN.1 element class. */\n    unsigned char   tag;            /* ASN.1 element tag. */\n    unsigned char   constructed;    /* Element is constructed. */\n}       asn1Element;\n\n#define ASN1_INTEGER        2\n#define ASN1_BIT_STRING     3\n#define ASN1_OCTET_STRING   4\n#define ASN1_NULL           5\n#define ASN1_OBJ_ID         6\n#define ASN1_SEQ            16\n\n#define ASN1_CONSTRUCTED    0x20\n\n/* rsaEncryption OID: 1.2.840.113549.1.1.1 */\nstatic unsigned char    OID_rsaEncryption[] =\n                            {9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 1, 1, 1};\nstatic int  sshrsapubkey(LIBSSH2_SESSION *session, char **sshpubkey,\n                         asn1Element *params, asn1Element *key,\n                         const char *method);\n\n#if LIBSSH2_DSA != 0\n/* dsaEncryption OID: 1.2.840.10040.4.1 */\nstatic unsigned char    OID_dsaEncryption[] =\n                            {7, 40 + 2, 0x86, 0x48, 0xCE, 0x38, 4, 1};\nstatic int  sshdsapubkey(LIBSSH2_SESSION *session, char **sshpubkey,\n                         asn1Element *params, asn1Element *key,\n                         const char *method);\n#endif\n\nstatic unsigned char    OID_dhKeyAgreement[] =\n                            {9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 1, 3, 1};\n\n\n/* PKCS#5 support. */\n\ntypedef struct pkcs5params  pkcs5params;\nstruct pkcs5params {\n    int         cipher;         /* Encryption cipher. */\n    int         blocksize;      /* Cipher block size. */\n    char        mode;           /* Block encryption mode. */\n    char        padopt;         /* Pad option. */\n    char        padchar;        /* Pad character. */\n    int         (*kdf)(LIBSSH2_SESSION *session, char **dk,\n                       const unsigned char *passphrase, pkcs5params *pkcs5);\n    int         hash;           /* KDF hash algorithm. */\n    size_t      hashlen;        /* KDF hash digest length. */\n    char *      salt;           /* Salt. */\n    size_t      saltlen;        /* Salt length. */\n    char *      iv;             /* Initialization vector. */\n    size_t      ivlen;          /* Initialization vector length. */\n    int         itercount;      /* KDF iteration count. */\n    int         dklen;          /* Derived key length (#bytes). */\n    int         effkeysize;     /* RC2 effective key size (#bits) or 0. */\n};\n\ntypedef struct pkcs5algo    pkcs5algo;\nstruct pkcs5algo {\n    const unsigned char *   oid;\n    int         (*parse)(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                         pkcs5algo *algo, asn1Element *param);\n    int         cipher;         /* Encryption cipher. */\n    size_t      blocksize;      /* Cipher block size. */\n    char        mode;           /* Block encryption mode. */\n    char        padopt;         /* Pad option. */\n    char        padchar;        /* Pad character. */\n    size_t      keylen;         /* Key length (#bytes). */\n    int         hash;           /* Hash algorithm. */\n    size_t      hashlen;        /* Hash digest length. */\n    size_t      saltlen;        /* Salt length. */\n    size_t      ivlen;          /* Initialisation vector length. */\n    int         effkeysize;     /* RC2 effective key size (#bits) or 0. */\n};\n\n/* id-PBES2 OID: 1.2.840.113549.1.5.13 */\nstatic const unsigned char  OID_id_PBES2[] = {\n    9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x0D\n};\nstatic int  parse_pbes2(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                        pkcs5algo *algo, asn1Element *param);\nstatic const pkcs5algo  PBES2 = {\n    OID_id_PBES2,   parse_pbes2,    0,  0,  '\\0',   '\\0',   '\\0',   0,\n    0,  0,  0,  0,  0\n};\n\n/* id-PBKDF2 OID: 1.2.840.113549.1.5.12 */\nstatic const unsigned char  OID_id_PBKDF2[] = {\n    9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x0C\n};\nstatic int  parse_pbkdf2(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                         pkcs5algo *algo, asn1Element *param);\nstatic const pkcs5algo  PBKDF2 = {\n    OID_id_PBKDF2,  parse_pbkdf2,   0,  0,  '\\0',   '\\0',   '\\0',\n    SHA_DIGEST_LENGTH,  Qc3_SHA1,   SHA_DIGEST_LENGTH,  8,  8,  0\n};\n\n/* id-hmacWithSHA1 OID: 1.2.840.113549.2.7 */\nstatic const unsigned char  OID_id_hmacWithSHA1[] = {\n    8, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x07\n};\nstatic int  parse_hmacWithSHA1(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                               pkcs5algo *algo, asn1Element *param);\nstatic const pkcs5algo  hmacWithSHA1 = {\n    OID_id_hmacWithSHA1,    parse_hmacWithSHA1, 0,  0,  '\\0',   '\\0',   '\\0',\n    SHA_DIGEST_LENGTH,  Qc3_SHA1,   SHA_DIGEST_LENGTH,  8,  8,  0\n};\n\n/* desCBC OID: 1.3.14.3.2.7 */\nstatic const unsigned char  OID_desCBC[] = {5, 40 + 3, 0x0E, 0x03, 0x02, 0x07};\nstatic int  parse_iv(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                     pkcs5algo *algo, asn1Element *param);\nstatic const pkcs5algo  desCBC = {\n    OID_desCBC, parse_iv,   Qc3_DES,    8,  Qc3_CBC,    Qc3_Pad_Counter,\n   '\\0',   8,   0,  0,  8,  8,  0\n};\n\n/* des-EDE3-CBC OID: 1.2.840.113549.3.7 */\nstatic const unsigned char  OID_des_EDE3_CBC[] = {\n    8, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x03, 0x07\n};\nstatic const pkcs5algo  des_EDE3_CBC = {\n    OID_des_EDE3_CBC,   parse_iv,   Qc3_TDES,   8,  Qc3_CBC, Qc3_Pad_Counter,\n    '\\0',   24, 0,  0,  8,  8,  0\n};\n\n/* rc2CBC OID: 1.2.840.113549.3.2 */\nstatic const unsigned char  OID_rc2CBC[] = {\n    8, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x03, 0x02\n};\nstatic int  parse_rc2(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                      pkcs5algo *algo, asn1Element *param);\nstatic const pkcs5algo  rc2CBC = {\n    OID_rc2CBC, parse_rc2,  Qc3_RC2,    8,  Qc3_CBC,    Qc3_Pad_Counter,\n    '\\0',   0,  0,  0,  8,  0,  32\n};\n\n/* pbeWithMD5AndDES-CBC OID: 1.2.840.113549.1.5.3 */\nstatic const unsigned char  OID_pbeWithMD5AndDES_CBC[] = {\n    9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x03\n};\nstatic int  parse_pbes1(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                        pkcs5algo *algo, asn1Element *param);\nstatic const pkcs5algo  pbeWithMD5AndDES_CBC = {\n    OID_pbeWithMD5AndDES_CBC,   parse_pbes1,    Qc3_DES,    8,  Qc3_CBC,\n    Qc3_Pad_Counter,    '\\0',   8,  Qc3_MD5,    MD5_DIGEST_LENGTH,  8,  0,  0\n};\n\n/* pbeWithMD5AndRC2-CBC OID: 1.2.840.113549.1.5.6 */\nstatic const unsigned char  OID_pbeWithMD5AndRC2_CBC[] = {\n    9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x06\n};\nstatic const pkcs5algo  pbeWithMD5AndRC2_CBC = {\n    OID_pbeWithMD5AndRC2_CBC,   parse_pbes1,    Qc3_RC2,    8,  Qc3_CBC,\n    Qc3_Pad_Counter,    '\\0',   0,  Qc3_MD5,    MD5_DIGEST_LENGTH,  8,  0,  64\n};\n\n/* pbeWithSHA1AndDES-CBC OID: 1.2.840.113549.1.5.10 */\nstatic const unsigned char  OID_pbeWithSHA1AndDES_CBC[] = {\n    9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x0A\n};\nstatic const pkcs5algo  pbeWithSHA1AndDES_CBC = {\n    OID_pbeWithSHA1AndDES_CBC,   parse_pbes1,    Qc3_DES,    8,  Qc3_CBC,\n    Qc3_Pad_Counter,    '\\0',   8,  Qc3_SHA1,   SHA_DIGEST_LENGTH,  8,  0, 0\n};\n\n/* pbeWithSHA1AndRC2-CBC OID: 1.2.840.113549.1.5.11 */\nstatic const unsigned char  OID_pbeWithSHA1AndRC2_CBC[] = {\n    9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x0B\n};\nstatic const pkcs5algo  pbeWithSHA1AndRC2_CBC = {\n    OID_pbeWithSHA1AndRC2_CBC,   parse_pbes1,    Qc3_RC2,    8,  Qc3_CBC,\n    Qc3_Pad_Counter,    '\\0',   0,  Qc3_SHA1,   SHA_DIGEST_LENGTH,  8,  0,  64\n};\n\n/* rc5-CBC-PAD OID: 1.2.840.113549.3.9: RC5 not implemented in Qc3. */\n/* pbeWithMD2AndDES-CBC OID: 1.2.840.113549.1.5.1: MD2 not implemented. */\n/* pbeWithMD2AndRC2-CBC OID: 1.2.840.113549.1.5.4: MD2 not implemented. */\n\nstatic const pkcs5algo *    pbestable[] = {\n    &pbeWithMD5AndDES_CBC,\n    &pbeWithMD5AndRC2_CBC,\n    &pbeWithSHA1AndDES_CBC,\n    &pbeWithSHA1AndRC2_CBC,\n    &PBES2,\n    NULL\n};\n\nstatic const pkcs5algo *    pbkdf2table[] = {\n    &PBKDF2,\n    NULL\n};\n\nstatic const pkcs5algo *    pbes2enctable[] = {\n    &desCBC,\n    &des_EDE3_CBC,\n    &rc2CBC,\n    NULL\n};\n\nstatic const pkcs5algo *    kdf2prftable[] = {\n    &hmacWithSHA1,\n    NULL\n};\n\n\n/* Public key extraction support. */\nstatic struct {\n    unsigned char *oid;\n    int             (*sshpubkey)(LIBSSH2_SESSION *session, char **pubkey,\n                                 asn1Element *params, asn1Element *key,\n                                 const char *method);\n    const char *    method;\n}       pka[] = {\n#if LIBSSH2_RSA != 0\n    {   OID_rsaEncryption,  sshrsapubkey,   \"ssh-rsa\"   },\n#endif\n#if LIBSSH2_DSA != 0\n    {   OID_dsaEncryption,  sshdsapubkey,   \"ssh-dss\"   },\n#endif\n    {   NULL,               NULL,           NULL        }\n};\n\n/* Define ASCII strings. */\nstatic const char   beginencprivkeyhdr[] =\n                                    \"-----BEGIN ENCRYPTED PRIVATE KEY-----\";\nstatic const char   endencprivkeyhdr[] = \"-----END ENCRYPTED PRIVATE KEY-----\";\nstatic const char   beginprivkeyhdr[] = \"-----BEGIN PRIVATE KEY-----\";\nstatic const char   endprivkeyhdr[] = \"-----END PRIVATE KEY-----\";\nstatic const char   beginrsaprivkeyhdr[] = \"-----BEGIN RSA PRIVATE KEY-----\";\nstatic const char   endrsaprivkeyhdr[] = \"-----END RSA PRIVATE KEY-----\";\nstatic const char   fopenrmode[] = \"r\";\nstatic const char   fopenrbmode[] = \"rb\";\n\n\n/* The rest of character literals in this module are in EBCDIC. */\n#pragma convert(37)\n\n#include <qusec.h>\n#include <qc3prng.h>\n#include <qc3dtaen.h>\n#include <qc3dtade.h>\n#include <qc3ctx.h>\n#include <qc3hash.h>\n#include <qc3hmac.h>\n#include <qc3pbext.h>\n#include <qc3sigvr.h>\n#include <qc3sigcl.h>\n#include <qc3pbext.h>\n#include <qc3dh.h>\n\nstatic Qc3_Format_KEYD0100_T    nulltoken = {\"\"};\n\nstatic int      zero = 0;\nstatic int      rsaprivate[] = { Qc3_RSA_Private };\nstatic char     anycsp[] = { Qc3_Any_CSP };\nstatic char     binstring[] = { Qc3_Bin_String };\nstatic char     berstring[] = { Qc3_BER_String };\nstatic char     qc3clear[] = { Qc3_Clear };\n\nstatic const Qus_EC_t ecnull = {0};     /* Error causes an exception. */\n\nstatic asn1Element  lastbytebitcount = {\n    (char *) &zero, NULL, (char *) &zero + 1\n};\n\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: ASN.1 support.\n *\n *******************************************************************/\n\nstatic char *\ngetASN1Element(asn1Element *elem, char *beg, char *end)\n{\n    unsigned char b;\n    unsigned long len;\n    asn1Element lelem;\n\n    /* Get a single ASN.1 element into `elem', parse ASN.1 string at `beg'\n     * ending at `end'.\n     * Returns a pointer in source string after the parsed element, or NULL\n     * if an error occurs.\n     */\n\n    if(beg >= end || !*beg)\n        return NULL;\n\n    /* Process header byte. */\n    elem->header = beg;\n    b = (unsigned char) *beg++;\n    elem->constructed = (b & 0x20) != 0;\n    elem->class = (b >> 6) & 3;\n    b &= 0x1F;\n    if(b == 0x1F)\n        return NULL;            /* Long tag values not supported here. */\n    elem->tag = b;\n\n    /* Process length. */\n    if(beg >= end)\n        return NULL;\n    b = (unsigned char) *beg++;\n    if(!(b & 0x80))\n        len = b;\n    else if(!(b &= 0x7F)) {\n        /* Unspecified length. Since we have all the data, we can determine the\n         * effective length by skipping element until an end element is\n         * found.\n         */\n        if(!elem->constructed)\n            return NULL;\n        elem->beg = beg;\n        while(beg < end && *beg) {\n            beg = getASN1Element(&lelem, beg, end);\n        if(!beg)\n            return NULL;\n        }\n        if(beg >= end)\n            return NULL;\n        elem->end = beg;\n        return beg + 1;\n    }\n    else if(beg + b > end)\n        return NULL;                        /* Does not fit in source. */\n    else {\n        /* Get long length. */\n        len = 0;\n        do {\n            if(len & 0xFF000000L)\n                return NULL;    /* Lengths > 32 bits are not supported. */\n            len = (len << 8) | (unsigned char) *beg++;\n        } while(--b);\n    }\n    if((unsigned long) (end - beg) < len)\n        return NULL;            /* Element data does not fit in source. */\n    elem->beg = beg;\n    elem->end = beg + len;\n    return elem->end;\n}\n\nstatic asn1Element *\nasn1_new(unsigned int type, unsigned int length)\n{\n    asn1Element *e;\n    unsigned int hdrl = 2;\n    unsigned int i;\n    unsigned char *buf;\n\n    e = (asn1Element *) malloc(sizeof *e);\n\n    if(e) {\n        if(length >= 0x80)\n            for(i = length; i; i >>= 8)\n                hdrl++;\n\n        buf = (unsigned char *) malloc(hdrl + length);\n\n        if(buf) {\n            e->header = buf;\n            e->beg = buf + hdrl;\n            e->end = e->beg + length;\n            e->class = (type >> 6) & 0x03;\n            e->tag = type & 0x1F;\n            e->constructed = (type >> 5) & 0x01;\n            e->header[0] = type;\n\n            if(length < 0x80)\n                e->header[1] = length;\n            else {\n                e->header[1] = (hdrl - 2) | 0x80;\n                do {\n                    e->header[--hdrl] = length;\n                    length >>= 8;\n                } while(length);\n            }\n        }\n        else {\n            free((char *) e);\n            e = NULL;\n        }\n    }\n\n    return e;\n}\n\nstatic asn1Element *\nasn1_new_from_bytes(const unsigned char *data, unsigned int length)\n{\n    asn1Element *e;\n    asn1Element te;\n\n    getASN1Element(&te,\n                   (unsigned char *) data, (unsigned char *) data + length);\n    e = asn1_new(te.tag, te.end - te.beg);\n\n    if(e)\n        memcpy(e->header, data, e->end - e->header);\n\n    return e;\n}\n\nstatic void\nasn1delete(asn1Element *e)\n{\n    if(e) {\n        if(e->header)\n            free((char *) e->header);\n        free((char *) e);\n    }\n}\n\nstatic asn1Element *\nasn1uint(_libssh2_bn *bn)\n{\n    asn1Element *e;\n    int bits;\n    int length;\n    unsigned char *p;\n\n    if(!bn)\n        return NULL;\n\n    bits = _libssh2_bn_bits(bn);\n    length = (bits + 8) >> 3;\n    e = asn1_new(ASN1_INTEGER, length);\n\n    if(e) {\n        p = e->beg;\n        if(!(bits & 0x07))\n            *p++ = 0;\n        _libssh2_bn_to_bin(bn, p);\n    }\n\n    return e;\n}\n\nstatic asn1Element *\nasn1containerv(unsigned int type, valiststr args)\n{\n    valiststr va;\n    asn1Element *e;\n    asn1Element *p;\n    unsigned char *bp;\n    unsigned int length = 0;\n\n    memcpy((char *) &va, (char *) &args, sizeof args);\n    while((p = va_arg(va.list, asn1Element *)))\n        length += p->end - p->header;\n    va_end(va.list);\n    e = asn1_new(type, length);\n    if(e) {\n        bp = e->beg;\n        while((p = va_arg(args.list, asn1Element *))) {\n            memcpy(bp, p->header, p->end - p->header);\n            bp += p->end - p->header;\n        }\n    }\n    return e;\n}\n\n/* VARARGS1 */\nstatic asn1Element *\nasn1container(unsigned int type, ...)\n{\n    valiststr va;\n    asn1Element *e;\n\n    va_start(va.list, type);\n    e = asn1containerv(type, va);\n    va_end(va.list);\n    return e;\n}\n\nstatic asn1Element *\nasn1bytes(unsigned int type, const unsigned char *bytes, unsigned int length)\n{\n    asn1Element *e;\n\n    e = asn1_new(type, length);\n    if(e && length)\n        memcpy(e->beg, bytes, length);\n    return e;\n}\n\nstatic asn1Element *\nrsapublickey(_libssh2_bn *e, _libssh2_bn *m)\n{\n    asn1Element *publicexponent;\n    asn1Element *modulus;\n    asn1Element *rsapubkey;\n\n    /* Build a PKCS#1 RSAPublicKey. */\n\n    modulus = asn1uint(m);\n    publicexponent = asn1uint(e);\n    rsapubkey = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED,\n                              modulus, publicexponent, NULL);\n    asn1delete(modulus);\n    asn1delete(publicexponent);\n\n    if(!modulus || !publicexponent) {\n        asn1delete(rsapubkey);\n        rsapubkey = NULL;\n    }\n\n    return rsapubkey;\n}\n\nstatic asn1Element *\nrsaprivatekey(_libssh2_bn *e, _libssh2_bn *m, _libssh2_bn *d,\n              _libssh2_bn *p, _libssh2_bn *q,\n              _libssh2_bn *exp1, _libssh2_bn *exp2, _libssh2_bn *coeff)\n{\n    asn1Element *version;\n    asn1Element *modulus;\n    asn1Element *publicexponent;\n    asn1Element *privateexponent;\n    asn1Element *prime1;\n    asn1Element *prime2;\n    asn1Element *exponent1;\n    asn1Element *exponent2;\n    asn1Element *coefficient;\n    asn1Element *rsaprivkey;\n\n    /* Build a PKCS#1 RSAPrivateKey. */\n    version = asn1bytes(ASN1_INTEGER, \"\\0\", 1);\n    modulus = asn1uint(m);\n    publicexponent = asn1uint(e);\n    privateexponent = asn1uint(d);\n    prime1 = asn1uint(p);\n    prime2 = asn1uint(q);\n    exponent1 = asn1uint(exp1);\n    exponent2 = asn1uint(exp2);\n    coefficient = asn1uint(coeff);\n    rsaprivkey = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED, version, modulus,\n                               publicexponent, privateexponent, prime1, prime2,\n                               exponent1, exponent2, coefficient, NULL);\n    asn1delete(version);\n    asn1delete(modulus);\n    asn1delete(publicexponent);\n    asn1delete(privateexponent);\n    asn1delete(prime1);\n    asn1delete(prime2);\n    asn1delete(exponent1);\n    asn1delete(exponent2);\n    asn1delete(coefficient);\n\n    if(!version || !modulus || !publicexponent || !privateexponent ||\n        !prime1 || !prime2 || !exponent1 || !exponent2 || !coefficient) {\n        asn1delete(rsaprivkey);\n        rsaprivkey = NULL;\n    }\n\n    return rsaprivkey;\n}\n\nstatic asn1Element *\nsubjectpublickeyinfo(asn1Element *pubkey, const unsigned char *algo,\n                     asn1Element *parameters)\n{\n    asn1Element *subjpubkey;\n    asn1Element *algorithm;\n    asn1Element *algorithmid;\n    asn1Element *subjpubkeyinfo;\n    unsigned int algosize = *algo++;\n\n    algorithm = asn1bytes(ASN1_OBJ_ID, algo, algosize);\n    algorithmid = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED,\n                                algorithm, parameters, NULL);\n    subjpubkey = asn1container(ASN1_BIT_STRING, &lastbytebitcount,\n                               pubkey, NULL);\n    subjpubkeyinfo = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED,\n                                   algorithmid, subjpubkey, NULL);\n    asn1delete(algorithm);\n    asn1delete(algorithmid);\n    asn1delete(subjpubkey);\n    if(!algorithm || !algorithmid || !subjpubkey) {\n        asn1delete(subjpubkeyinfo);\n        subjpubkeyinfo = NULL;\n    }\n    return subjpubkeyinfo;\n}\n\nstatic asn1Element *\nrsasubjectpublickeyinfo(asn1Element *pubkey)\n{\n    asn1Element *parameters;\n    asn1Element *subjpubkeyinfo;\n\n    parameters = asn1bytes(ASN1_NULL, NULL, 0);\n    subjpubkeyinfo = subjectpublickeyinfo(pubkey,\n                                          OID_rsaEncryption, parameters);\n    asn1delete(parameters);\n    if(!parameters) {\n        asn1delete(subjpubkeyinfo);\n        subjpubkeyinfo = NULL;\n    }\n    return subjpubkeyinfo;\n}\n\nstatic asn1Element *\nprivatekeyinfo(asn1Element *privkey, const unsigned char *algo,\n               asn1Element *parameters)\n{\n    asn1Element *version;\n    asn1Element *privatekey;\n    asn1Element *algorithm;\n    asn1Element *privatekeyalgorithm;\n    asn1Element *privkeyinfo;\n    unsigned int algosize = *algo++;\n\n    /* Build a PKCS#8 PrivateKeyInfo. */\n    version = asn1bytes(ASN1_INTEGER, \"\\0\", 1);\n    algorithm = asn1bytes(ASN1_OBJ_ID, algo, algosize);\n    privatekeyalgorithm = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED,\n                                        algorithm, parameters, NULL);\n    privatekey = asn1container(ASN1_OCTET_STRING, privkey, NULL);\n    privkeyinfo = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED, version,\n                                privatekeyalgorithm, privatekey, NULL);\n    asn1delete(version);\n    asn1delete(algorithm);\n    asn1delete(privatekeyalgorithm);\n    if(!version || !algorithm || !privatekeyalgorithm) {\n        asn1delete(privkeyinfo);\n        privkeyinfo = NULL;\n    }\n    return privkeyinfo;\n}\n\nstatic asn1Element *\nrsaprivatekeyinfo(asn1Element *privkey)\n{\n    asn1Element *parameters;\n    asn1Element *privkeyinfo;\n\n    parameters = asn1bytes(ASN1_NULL, NULL, 0);\n    privkeyinfo = privatekeyinfo(privkey, OID_rsaEncryption, parameters);\n    asn1delete(parameters);\n    if(!parameters) {\n        asn1delete(privkeyinfo);\n        privkeyinfo = NULL;\n    }\n    return privkeyinfo;\n}\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: big numbers support.\n *\n *******************************************************************/\n\n\n_libssh2_bn *\n_libssh2_bn_init(void)\n{\n    _libssh2_bn *bignum;\n\n    bignum = (_libssh2_bn *) malloc(sizeof *bignum);\n    if(bignum) {\n        bignum->bignum = NULL;\n        bignum->length = 0;\n    }\n\n    return bignum;\n}\n\nvoid\n_libssh2_bn_free(_libssh2_bn *bn)\n{\n    if(bn) {\n        if(bn->bignum) {\n#ifdef LIBSSH2_CLEAR_MEMORY\n            if(bn->length)\n                memset((char *) bn->bignum, 0, bn->length);\n#endif\n            free(bn->bignum);\n        }\n\n        free((char *) bn);\n    }\n}\n\nstatic int\n_libssh2_bn_resize(_libssh2_bn *bn, size_t newlen)\n{\n    unsigned char *bignum;\n\n    if(!bn)\n        return -1;\n    if(newlen == bn->length)\n        return 0;\n\n    if(!bn->bignum)\n        bignum = (unsigned char *) malloc(newlen);\n    else {\n#ifdef LIBSSH2_CLEAR_MEMORY\n        if(newlen < bn->length)\n            memset((char *) bn->bignum + newlen, 0, bn->length - newlen);\n#endif\n        if(!newlen) {\n            free((char *) bn->bignum);\n            bn->bignum = NULL;\n            bn->length = 0;\n            return 0;\n        }\n        bignum = (unsigned char *) realloc((char *) bn->bignum, newlen);\n    }\n\n    if(!bignum)\n        return -1;\n\n    if(newlen > bn->length)\n        memset((char *) bignum + bn->length, 0, newlen - bn->length);\n\n    bn->bignum = bignum;\n    bn->length = newlen;\n    return 0;\n}\n\nunsigned long\n_libssh2_bn_bits(_libssh2_bn *bn)\n{\n    unsigned int i;\n    unsigned char b;\n\n    if(bn && bn->bignum) {\n        for(i = bn->length; i--;)\n            b = bn->bignum[i];\n            if(b) {\n                i *= 8;\n                do {\n                    i++;\n                } while(b >>= 1);\n                return i;\n            }\n    }\n\n    return 0;\n}\n\nint\n_libssh2_bn_from_bin(_libssh2_bn *bn, int len, const unsigned char *val)\n{\n    int i;\n\n    if(!bn || (len && !val))\n        return -1;\n\n    for(; len && !*val; len--)\n        val++;\n\n    if(_libssh2_bn_resize(bn, len))\n        return -1;\n\n    for(i = len; i--;)\n        bn->bignum[i] = *val++;\n\n    return 0;\n}\n\nint\n_libssh2_bn_set_word(_libssh2_bn *bn, unsigned long val)\n{\n    val = htonl(val);\n    return _libssh2_bn_from_bin(bn, sizeof val, (unsigned char *) &val);\n}\n\nint\n_libssh2_bn_to_bin(_libssh2_bn *bn, unsigned char *val)\n{\n    int i;\n\n    if(!bn || !val)\n        return -1;\n\n    for(i = bn->length; i--;)\n        *val++ = bn->bignum[i];\n\n    return 0;\n}\n\nstatic int\n_libssh2_bn_from_bn(_libssh2_bn *to, _libssh2_bn *from)\n{\n    int i;\n\n    if(!to || !from)\n        return -1;\n\n    if(_libssh2_bn_resize(to, from->length))\n        return -1;\n\n    for(i = to->length; i--;)\n        to->bignum[i] = from->bignum[i];\n\n    return 0;\n}\n\nvoid\n_libssh2_random(unsigned char *buf, int len)\n{\n    Qc3GenPRNs(buf, len,\n        Qc3PRN_TYPE_NORMAL, Qc3PRN_NO_PARITY, (char *) &ecnull);\n}\n\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: crypto context support.\n *\n *******************************************************************/\n\nstatic _libssh2_os400qc3_crypto_ctx *\nlibssh2_init_crypto_ctx(_libssh2_os400qc3_crypto_ctx *ctx)\n{\n    if(!ctx)\n        ctx = (_libssh2_os400qc3_crypto_ctx *) malloc(sizeof *ctx);\n\n    if(ctx) {\n        memset((char *) ctx, 0, sizeof *ctx);\n        ctx->hash.Final_Op_Flag = Qc3_Continue;\n    }\n\n    return ctx;\n}\n\nstatic int\nnull_token(const char *token)\n{\n    return !memcmp(token, nulltoken.Key_Context_Token,\n                   sizeof nulltoken.Key_Context_Token);\n}\n\nvoid\n_libssh2_os400qc3_crypto_dtor(_libssh2_os400qc3_crypto_ctx *x)\n{\n    if(!x)\n        return;\n    if(!null_token(x->hash.Alg_Context_Token)) {\n        Qc3DestroyAlgorithmContext(x->hash.Alg_Context_Token,\n                                   (char *) &ecnull);\n        memset(x->hash.Alg_Context_Token, 0, sizeof x->hash.Alg_Context_Token);\n    }\n    if(!null_token(x->key.Key_Context_Token)) {\n        Qc3DestroyKeyContext(x->key.Key_Context_Token, (char *) &ecnull);\n        memset(x->key.Key_Context_Token, 0, sizeof x->key.Key_Context_Token);\n    }\n    if(x->kek) {\n        _libssh2_os400qc3_crypto_dtor(x->kek);\n        free((char *) x->kek);\n        x->kek = NULL;\n    }\n}\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: hash algorithms support.\n *\n *******************************************************************/\n\nint\nlibssh2_os400qc3_hash_init(Qc3_Format_ALGD0100_T *x, unsigned int algorithm)\n{\n    Qc3_Format_ALGD0500_T algd;\n    Qus_EC_t errcode;\n\n    if(!x)\n        return 0;\n\n    memset((char *) x, 0, sizeof *x);\n    x->Final_Op_Flag = Qc3_Continue;\n    algd.Hash_Alg = algorithm;\n    set_EC_length(errcode, sizeof errcode);\n    Qc3CreateAlgorithmContext((char *) &algd, Qc3_Alg_Hash,\n                              x->Alg_Context_Token, &errcode);\n    return errcode.Bytes_Available? 0: 1;\n}\n\nvoid\nlibssh2_os400qc3_hash_update(Qc3_Format_ALGD0100_T *ctx,\n                             unsigned char *data, int len)\n{\n    char dummy[64];\n\n    ctx->Final_Op_Flag = Qc3_Continue;\n    Qc3CalculateHash((char *) data, &len, Qc3_Data, (char *) ctx,\n                     Qc3_Alg_Token, anycsp, NULL, dummy, (char *) &ecnull);\n}\n\nvoid\nlibssh2_os400qc3_hash_final(Qc3_Format_ALGD0100_T *ctx, unsigned char *out)\n{\n    char data;\n\n    ctx->Final_Op_Flag = Qc3_Final;\n    Qc3CalculateHash(&data, &zero, Qc3_Data, (char *) ctx, Qc3_Alg_Token,\n                     anycsp, NULL, (char *) out, (char *) &ecnull);\n    Qc3DestroyAlgorithmContext(ctx->Alg_Context_Token, (char *) &ecnull);\n    memset(ctx->Alg_Context_Token, 0, sizeof ctx->Alg_Context_Token);\n}\n\nint\nlibssh2_os400qc3_hash(const unsigned char *message, unsigned long len,\n                      unsigned char *out, unsigned int algo)\n{\n    Qc3_Format_ALGD0100_T ctx;\n\n    if(!libssh2_os400qc3_hash_init(&ctx, algo))\n        return 1;\n\n    libssh2_os400qc3_hash_update(&ctx, (unsigned char *) message, len);\n    libssh2_os400qc3_hash_final(&ctx, out);\n    return 0;\n}\n\nvoid\nlibssh2_os400qc3_hmac_init(_libssh2_os400qc3_crypto_ctx *ctx,\n                           int algo, size_t minkeylen, void *key, int keylen)\n{\n    if(keylen < minkeylen) {\n        char *lkey = alloca(minkeylen);\n\n        /* Pad key with zeroes if too short. */\n        if(!lkey)\n            return;\n        memcpy(lkey, (char *) key, keylen);\n        memset(lkey + keylen, 0, minkeylen - keylen);\n        key = (void *) lkey;\n        keylen = minkeylen;\n    }\n    libssh2_os400qc3_hash_init(&ctx->hash, algo);\n    Qc3CreateKeyContext((char *) key, &keylen, binstring, &algo, qc3clear,\n                        NULL, NULL, ctx->key.Key_Context_Token,\n                        (char *) &ecnull);\n}\n\nvoid\nlibssh2_os400qc3_hmac_update(_libssh2_os400qc3_crypto_ctx *ctx,\n                             unsigned char *data, int len)\n{\n    char dummy[64];\n\n    ctx->hash.Final_Op_Flag = Qc3_Continue;\n    Qc3CalculateHMAC((char *) data, &len, Qc3_Data, (char *) &ctx->hash,\n                     Qc3_Alg_Token, ctx->key.Key_Context_Token, Qc3_Key_Token,\n                     anycsp, NULL, dummy, (char *) &ecnull);\n}\n\nvoid\nlibssh2_os400qc3_hmac_final(_libssh2_os400qc3_crypto_ctx *ctx,\n                            unsigned char *out)\n{\n    char data;\n\n    ctx->hash.Final_Op_Flag = Qc3_Final;\n    Qc3CalculateHMAC((char *) data, &zero, Qc3_Data, (char *) &ctx->hash,\n                     Qc3_Alg_Token, ctx->key.Key_Context_Token, Qc3_Key_Token,\n                     anycsp, NULL, (char *) out, (char *) &ecnull);\n}\n\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: cipher algorithms support.\n *\n *******************************************************************/\n\nint\n_libssh2_cipher_init(_libssh2_cipher_ctx *h, _libssh2_cipher_type(algo),\n                     unsigned char *iv, unsigned char *secret, int encrypt)\n{\n    Qc3_Format_ALGD0200_T algd;\n    Qus_EC_t errcode;\n\n    (void) encrypt;\n\n    if(!h)\n        return -1;\n\n    libssh2_init_crypto_ctx(h);\n    algd.Block_Cipher_Alg = algo.algo;\n    algd.Block_Length = algo.size;\n    algd.Mode = algo.mode;\n    algd.Pad_Option = Qc3_No_Pad;\n    algd.Pad_Character = 0;\n    algd.Reserved = 0;\n    algd.MAC_Length = 0;\n    algd.Effective_Key_Size = 0;\n    memset(algd.Init_Vector, 0, sizeof algd.Init_Vector);\n    if(algo.mode != Qc3_ECB && algo.size)\n        memcpy(algd.Init_Vector, iv, algo.size);\n    set_EC_length(errcode, sizeof errcode);\n    Qc3CreateAlgorithmContext((char *) &algd, algo.fmt,\n                              h->hash.Alg_Context_Token, &errcode);\n    if(errcode.Bytes_Available)\n        return -1;\n    Qc3CreateKeyContext((char *) secret, &algo.keylen, binstring,\n                        &algo.algo, qc3clear, NULL, NULL,\n                        h->key.Key_Context_Token, (char *) &errcode);\n    if(errcode.Bytes_Available) {\n        _libssh2_os400qc3_crypto_dtor(h);\n        return -1;\n    }\n\n    return 0;\n}\n\nint\n_libssh2_cipher_crypt(_libssh2_cipher_ctx *ctx,\n                      _libssh2_cipher_type(algo),\n                      int encrypt, unsigned char *block, size_t blocksize)\n{\n    Qus_EC_t errcode;\n    int outlen;\n    int blksize = blocksize;\n\n    (void) algo;\n\n    set_EC_length(errcode, sizeof errcode);\n    if(encrypt)\n        Qc3EncryptData((char *) block, &blksize, Qc3_Data,\n                       ctx->hash.Alg_Context_Token, Qc3_Alg_Token,\n                       ctx->key.Key_Context_Token, Qc3_Key_Token, anycsp, NULL,\n                       (char *) block, &blksize, &outlen, (char *) &errcode);\n    else\n        Qc3DecryptData((char *) block, &blksize,\n                       ctx->hash.Alg_Context_Token, Qc3_Alg_Token,\n                       ctx->key.Key_Context_Token, Qc3_Key_Token, anycsp, NULL,\n                       (char *) block, &blksize, &outlen, (char *) &errcode);\n\n    return errcode.Bytes_Available? -1: 0;\n}\n\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: RSA support.\n *\n *******************************************************************/\n\nint\n_libssh2_rsa_new(libssh2_rsa_ctx **rsa,\n                 const unsigned char *edata, unsigned long elen,\n                 const unsigned char *ndata, unsigned long nlen,\n                 const unsigned char *ddata, unsigned long dlen,\n                 const unsigned char *pdata, unsigned long plen,\n                 const unsigned char *qdata, unsigned long qlen,\n                 const unsigned char *e1data, unsigned long e1len,\n                 const unsigned char *e2data, unsigned long e2len,\n                 const unsigned char *coeffdata, unsigned long coefflen)\n{\n    libssh2_rsa_ctx *ctx;\n    _libssh2_bn *e = _libssh2_bn_init_from_bin();\n    _libssh2_bn *n = _libssh2_bn_init_from_bin();\n    _libssh2_bn *d = NULL;\n    _libssh2_bn *p = NULL;\n    _libssh2_bn *q = NULL;\n    _libssh2_bn *e1 = NULL;\n    _libssh2_bn *e2 = NULL;\n    _libssh2_bn *coeff = NULL;\n    asn1Element *key = NULL;\n    asn1Element *structkey = NULL;\n    Qc3_Format_ALGD0400_T algd;\n    Qus_EC_t errcode;\n    int keytype;\n    int ret = 0;\n    int i;\n\n    ctx = libssh2_init_crypto_ctx(NULL);\n    if(!ctx)\n        ret = -1;\n    if(!ret) {\n        _libssh2_bn_from_bin(e, elen, edata);\n        _libssh2_bn_from_bin(n, nlen, ndata);\n        if(!e || !n)\n            ret = -1;\n    }\n    if(!ret && ddata) {\n        /* Private key. */\n        d = _libssh2_bn_init_from_bin();\n        _libssh2_bn_from_bin(d, dlen, ddata);\n        p = _libssh2_bn_init_from_bin();\n        _libssh2_bn_from_bin(p, plen, pdata);\n        q = _libssh2_bn_init_from_bin();\n        _libssh2_bn_from_bin(q, qlen, qdata);\n        e1 = _libssh2_bn_init_from_bin();\n        _libssh2_bn_from_bin(e1, e1len, e1data);\n        e2 = _libssh2_bn_init_from_bin();\n        _libssh2_bn_from_bin(e2, e2len, e2data);\n        coeff = _libssh2_bn_init_from_bin();\n        _libssh2_bn_from_bin(coeff, coefflen, coeffdata);\n        if(!d || !p || !q ||!e1 || !e2 || !coeff)\n            ret = -1;\n\n        if(!ret) {\n            /* Build a PKCS#8 private key. */\n            key = rsaprivatekey(e, n, d, p, q, e1, e2, coeff);\n            structkey = rsaprivatekeyinfo(key);\n        }\n        keytype = Qc3_RSA_Private;\n    }\n    else if(!ret) {\n        key = rsapublickey(e, n);\n        structkey = rsasubjectpublickeyinfo(key);\n        keytype = Qc3_RSA_Public;\n    }\n    if(!key || !structkey)\n        ret = -1;\n\n    set_EC_length(errcode, sizeof errcode);\n\n    if(!ret) {\n        /* Create the algorithm context. */\n        algd.Public_Key_Alg = Qc3_RSA;\n        algd.PKA_Block_Format = Qc3_PKCS1_01;\n        memset(algd.Reserved, 0, sizeof algd.Reserved);\n        algd.Signing_Hash_Alg = Qc3_SHA1;\n        Qc3CreateAlgorithmContext((char *) &algd, Qc3_Alg_Public_Key,\n                                  ctx->hash.Alg_Context_Token, &errcode);\n        if(errcode.Bytes_Available)\n            ret = -1;\n        ctx->hash.Final_Op_Flag = Qc3_Continue;\n    }\n\n    /* Create the key context. */\n    if(!ret) {\n        i = structkey->end - structkey->header;\n        Qc3CreateKeyContext(structkey->header, &i, berstring, &keytype,\n                            qc3clear, NULL, NULL, ctx->key.Key_Context_Token,\n                            (char *) &errcode);\n        if(errcode.Bytes_Available)\n            ret = -1;\n    }\n\n    _libssh2_bn_free(e);\n    _libssh2_bn_free(n);\n    _libssh2_bn_free(d);\n    _libssh2_bn_free(p);\n    _libssh2_bn_free(q);\n    _libssh2_bn_free(e1);\n    _libssh2_bn_free(e2);\n    _libssh2_bn_free(coeff);\n    asn1delete(key);\n    asn1delete(structkey);\n    if(ret && ctx) {\n        _libssh2_rsa_free(ctx);\n        ctx = NULL;\n    }\n    *rsa = ctx;\n    return ret;\n}\n\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: Diffie-Hellman support.\n *\n *******************************************************************/\n\nvoid\n_libssh2_os400qc3_dh_init(_libssh2_dh_ctx *dhctx)\n{\n    memset((char *) dhctx, 0, sizeof *dhctx);\n}\n\nint\n_libssh2_os400qc3_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public,\n                              _libssh2_bn *g, _libssh2_bn *p, int group_order)\n{\n    asn1Element *prime;\n    asn1Element *base;\n    asn1Element *dhparameter;\n    asn1Element *dhkeyagreement;\n    asn1Element *pkcs3;\n    int pkcs3len;\n    char *pubkey;\n    int pubkeysize;\n    int pubkeylen;\n    Qus_EC_t errcode;\n\n    (void) group_order;\n\n    /* Build the PKCS#3 structure. */\n\n    base = asn1uint(g);\n    prime = asn1uint(p);\n    dhparameter = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED,\n                                prime, base, NULL);\n    asn1delete(base);\n    asn1delete(prime);\n    dhkeyagreement = asn1bytes(ASN1_OBJ_ID,\n                               OID_dhKeyAgreement + 1, OID_dhKeyAgreement[0]);\n    pkcs3 = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED,\n                          dhkeyagreement, dhparameter, NULL);\n    asn1delete(dhkeyagreement);\n    asn1delete(dhparameter);\n    if(!base || !prime || !dhparameter ||\n        !dhkeyagreement || !dhparameter || !pkcs3) {\n        asn1delete(pkcs3);\n        return -1;\n    }\n    pkcs3len = pkcs3->end - pkcs3->header;\n    pubkeysize = (_libssh2_bn_bits(p) + 7) >> 3;\n    pubkey = alloca(pubkeysize);\n    set_EC_length(errcode, sizeof errcode);\n    Qc3GenDHKeyPair((char *) pkcs3->header, &pkcs3len, anycsp, NULL,\n                    dhctx->token, pubkey, &pubkeysize, &pubkeylen, &errcode);\n    asn1delete(pkcs3);\n    if(errcode.Bytes_Available)\n        return -1;\n    return _libssh2_bn_from_bin(public, pubkeylen, (unsigned char *) pubkey);\n}\n\nint\n_libssh2_os400qc3_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret,\n                            _libssh2_bn *f, _libssh2_bn *p)\n{\n    char *pubkey;\n    int pubkeysize;\n    char *secretbuf;\n    int secretbufsize;\n    int secretbuflen;\n    Qus_EC_t errcode;\n\n    pubkeysize = (_libssh2_bn_bits(f) + 7) >> 3;\n    pubkey = alloca(pubkeysize);\n    _libssh2_bn_to_bin(f, pubkey);\n    secretbufsize = (_libssh2_bn_bits(p) + 7) >> 3;\n    secretbuf = alloca(pubkeysize);\n    set_EC_length(errcode, sizeof errcode);\n    Qc3CalculateDHSecretKey(dhctx->token, pubkey, &pubkeysize,\n                            secretbuf, &secretbufsize, &secretbuflen,\n                            &errcode);\n    if(errcode.Bytes_Available)\n        return -1;\n    return _libssh2_bn_from_bin(secret,\n                                secretbuflen, (unsigned char *) secretbuf);\n}\n\nvoid\n_libssh2_os400qc3_dh_dtor(_libssh2_dh_ctx *dhctx)\n{\n    if(!null_token(dhctx->token)) {\n        Qc3DestroyAlgorithmContext(dhctx->token, (char *) &ecnull);\n        memset((char *) dhctx, 0, sizeof *dhctx);\n    }\n}\n\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: PKCS#5 supplement.\n *\n *******************************************************************/\n\nstatic int\noidcmp(const asn1Element *e, const unsigned char *oid)\n{\n    int i = e->end - e->beg - *oid++;\n\n    if(*e->header != ASN1_OBJ_ID)\n        return -2;\n    if(!i)\n        i = memcmp(e->beg, oid, oid[-1]);\n    return i;\n}\n\nstatic int\nasn1getword(asn1Element *e, unsigned long *v)\n{\n    unsigned long a;\n    const unsigned char *cp;\n\n    if(*e->header != ASN1_INTEGER)\n        return -1;\n    for(cp = e->beg; cp < e->end && !*cp; cp++)\n        ;\n    if(e->end - cp > sizeof a)\n        return -1;\n    for(a = 0; cp < e->end; cp++)\n        a = (a << 8) | *cp;\n    *v = a;\n    return 0;\n}\n\nstatic int\npbkdf1(LIBSSH2_SESSION *session, char **dk, const unsigned char *passphrase,\n       pkcs5params *pkcs5)\n{\n    int i;\n    Qc3_Format_ALGD0100_T hctx;\n    int len = pkcs5->saltlen;\n    char *data = (char *) pkcs5->salt;\n\n    *dk = NULL;\n    if(pkcs5->dklen > pkcs5->hashlen)\n        return -1;\n\n    /* Allocate the derived key buffer. */\n    *dk = LIBSSH2_ALLOC(session, pkcs5->hashlen);\n    if(!*dk)\n        return -1;\n\n    /* Initial hash. */\n    libssh2_os400qc3_hash_init(&hctx, pkcs5->hash);\n    libssh2_os400qc3_hash_update(&hctx, (unsigned char *) passphrase,\n                                 strlen(passphrase));\n    hctx.Final_Op_Flag = Qc3_Final;\n    Qc3CalculateHash((char *) pkcs5->salt, &len, Qc3_Data, (char *) &hctx,\n                     Qc3_Alg_Token, anycsp, NULL, *dk, (char *) &ecnull);\n\n    /* Iterate. */\n    len = pkcs5->hashlen;\n    for(i = 1; i < pkcs5->itercount; i++)\n        Qc3CalculateHash((char *) *dk, &len, Qc3_Data, (char *) &hctx,\n                         Qc3_Alg_Token, anycsp, NULL, *dk, (char *) &ecnull);\n\n    /* Special stuff for PBES1: split derived key into 8-byte key and 8-byte\n       initialization vector. */\n    pkcs5->dklen = 8;\n    pkcs5->ivlen = 8;\n    pkcs5->iv = *dk + 8;\n\n    /* Clean-up and exit. */\n    Qc3DestroyAlgorithmContext(hctx.Alg_Context_Token, (char *) &ecnull);\n    return 0;\n}\n\nstatic int\npbkdf2(LIBSSH2_SESSION *session, char **dk, const unsigned char *passphrase,\n       pkcs5params *pkcs5)\n{\n    size_t i;\n    size_t k;\n    int j;\n    int l;\n    uint32_t ni;\n    unsigned long long t;\n    char *mac;\n    char *buf;\n    _libssh2_os400qc3_crypto_ctx hctx;\n\n    *dk = NULL;\n    t = ((unsigned long long) pkcs5->dklen + pkcs5->hashlen - 1) /\n        pkcs5->hashlen;\n    if(t > 0xFFFFFFFF)\n        return -1;\n    mac = alloca(pkcs5->hashlen);\n    if(!mac)\n        return -1;\n\n    /* Allocate the derived key buffer. */\n    l = t;\n    buf = LIBSSH2_ALLOC(session, l * pkcs5->hashlen);\n    if(!buf)\n        return -1;\n    *dk = buf;\n\n    /* Create an HMAC context for our computations. */\n    libssh2_os400qc3_hmac_init(&hctx, pkcs5->hash, pkcs5->hashlen,\n                               (void *) passphrase, strlen(passphrase));\n\n    /* Process each hLen-size blocks. */\n    for(i = 1; i <= l; i++) {\n        ni = htonl(i);\n        libssh2_os400qc3_hmac_update(&hctx, pkcs5->salt, pkcs5->saltlen);\n        libssh2_os400qc3_hmac_update(&hctx, (char *) &ni, sizeof ni);\n        libssh2_os400qc3_hmac_final(&hctx, mac);\n        memcpy(buf, mac, pkcs5->hashlen);\n        for(j = 1; j < pkcs5->itercount; j++) {\n            libssh2_os400qc3_hmac_update(&hctx, mac, pkcs5->hashlen);\n            libssh2_os400qc3_hmac_final(&hctx, mac);\n            for(k = 0; k < pkcs5->hashlen; k++)\n                buf[k] ^= mac[k];\n        }\n        buf += pkcs5->hashlen;\n    }\n\n    /* Computation done. Release HMAC context. */\n    _libssh2_os400qc3_crypto_dtor(&hctx);\n    return 0;\n}\n\nstatic int\nparse_pkcs5_algorithm(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                      asn1Element *algid, pkcs5algo **algotable)\n{\n    asn1Element oid;\n    asn1Element param;\n    char *cp;\n\n    cp = getASN1Element(&oid, algid->beg, algid->end);\n    if(!cp || *oid.header != ASN1_OBJ_ID)\n        return -1;\n    param.header = NULL;\n    if(cp < algid->end)\n        cp = getASN1Element(&param, cp, algid->end);\n    if(cp != algid->end)\n        return -1;\n    for(; *algotable; algotable++)\n        if(!oidcmp(&oid, (*algotable)->oid))\n            return (*(*algotable)->parse)(session, pkcs5, *algotable,\n                                          param.header? &param: NULL);\n    return -1;\n}\n\nstatic int\nparse_pbes2(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n            pkcs5algo *algo, asn1Element *param)\n{\n    asn1Element keyDerivationFunc;\n    asn1Element encryptionScheme;\n    char *cp;\n\n    if(!param || *param->header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    cp = getASN1Element(&keyDerivationFunc, param->beg, param->end);\n    if(!cp || *keyDerivationFunc.header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    if(getASN1Element(&encryptionScheme, cp, param->end) != param->end ||\n        *encryptionScheme.header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    if(parse_pkcs5_algorithm(session, pkcs5, &encryptionScheme, pbes2enctable))\n        return -1;\n    if(parse_pkcs5_algorithm(session, pkcs5, &keyDerivationFunc, pbkdf2table))\n        return -1;\n    return 0;\n}\n\nstatic int\nparse_pbkdf2(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n             pkcs5algo *algo, asn1Element *param)\n{\n    asn1Element salt;\n    asn1Element iterationCount;\n    asn1Element keyLength;\n    asn1Element prf;\n    unsigned long itercount;\n    char *cp;\n\n    if(!param || *param->header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    cp = getASN1Element(&salt, param->beg, param->end);\n    /* otherSource not supported. */\n    if(!cp || *salt.header != ASN1_OCTET_STRING)\n        return -1;\n    cp = getASN1Element(&iterationCount, cp, param->end);\n    if(!cp || *iterationCount.header != ASN1_INTEGER)\n        return -1;\n    keyLength.header = prf.header = NULL;\n    if(cp < param->end) {\n        cp = getASN1Element(&prf, cp, param->end);\n        if(!cp)\n            return -1;\n        if(*prf.header == ASN1_INTEGER) {\n            keyLength = prf;\n            prf.header = NULL;\n            if(cp < param->end)\n                cp = getASN1Element(&prf, cp, param->end);\n        }\n        if(cp != param->end)\n            return -1;\n    }\n    pkcs5->hash = algo->hash;\n    pkcs5->hashlen = algo->hashlen;\n    if(prf.header) {\n        if(*prf.header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n            return -1;\n        if(parse_pkcs5_algorithm(session, pkcs5, &prf, kdf2prftable))\n            return -1;\n    }\n    pkcs5->saltlen = salt.end - salt.beg;\n    pkcs5->salt = salt.beg;\n    if(asn1getword(&iterationCount, &itercount) ||\n        !itercount || itercount > 100000)\n        return -1;\n    pkcs5->itercount = itercount;\n    pkcs5->kdf = pbkdf2;\n    return 0;\n}\n\nstatic int\nparse_hmacWithSHA1(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n                   pkcs5algo *algo, asn1Element *param)\n{\n    if(!param || *param->header != ASN1_NULL)\n        return -1;\n    pkcs5->hash = algo->hash;\n    pkcs5->hashlen = algo->hashlen;\n    return 0;\n}\n\nstatic int\nparse_iv(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n         pkcs5algo *algo, asn1Element *param)\n{\n    if(!param || *param->header != ASN1_OCTET_STRING ||\n        param->end - param->beg != algo->ivlen)\n        return -1;\n    pkcs5->cipher = algo->cipher;\n    pkcs5->blocksize = algo->blocksize;\n    pkcs5->mode = algo->mode;\n    pkcs5->padopt = algo->padopt;\n    pkcs5->padchar = algo->padchar;\n    pkcs5->dklen = algo->keylen;\n    pkcs5->ivlen = algo->ivlen;\n    pkcs5->iv = param->beg;\n    return 0;\n}\n\nstatic int\nparse_rc2(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n          pkcs5algo *algo, asn1Element *param)\n{\n    asn1Element iv;\n    unsigned long effkeysize;\n    char *cp;\n\n    if(!param || *param->header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    cp = getASN1Element(&iv, param->beg, param->end);\n    if(!cp)\n        return -1;\n    effkeysize = algo->effkeysize;\n    if(*iv.header == ASN1_INTEGER) {\n        if(asn1getword(&iv, &effkeysize) || effkeysize > 1024)\n            return -1;\n\n        cp = getASN1Element(&iv, cp, param->end);\n        if(effkeysize < 256)\n            switch(effkeysize) {\n            case 160:\n                effkeysize = 40;\n            case 120:\n                effkeysize = 64;\n            case 58:\n                effkeysize = 128;\n                break;\n            default:\n                return -1;\n            }\n    }\n    if(effkeysize > 1024 || cp != param->end ||\n        *iv.header != ASN1_OCTET_STRING || iv.end - iv.beg != algo->ivlen)\n        return -1;\n    pkcs5->cipher = algo->cipher;\n    pkcs5->blocksize = algo->blocksize;\n    pkcs5->mode = algo->mode;\n    pkcs5->padopt = algo->padopt;\n    pkcs5->padchar = algo->padchar;\n    pkcs5->ivlen = algo->ivlen;\n    pkcs5->iv = iv.beg;\n    pkcs5->effkeysize = effkeysize;\n    pkcs5->dklen = (effkeysize + 8 - 1) / 8;\n    return 0;\n}\n\nstatic int\nparse_pbes1(LIBSSH2_SESSION *session, pkcs5params *pkcs5,\n            pkcs5algo *algo, asn1Element *param)\n{\n    asn1Element salt;\n    asn1Element iterationCount;\n    unsigned long itercount;\n    char *cp;\n\n    if(!param || *param->header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n\n    cp = getASN1Element(&salt, param->beg, param->end);\n    if(!cp || *salt.header != ASN1_OCTET_STRING ||\n        salt.end - salt.beg != algo->saltlen)\n        return -1;\n    if(getASN1Element(&iterationCount, cp, param->end) != param->end ||\n        *iterationCount.header != ASN1_INTEGER)\n        return -1;\n    if(asn1getword(&iterationCount, &itercount) ||\n        !itercount || itercount > 100000)\n        return -1;\n    pkcs5->cipher = algo->cipher;\n    pkcs5->blocksize = algo->blocksize;\n    pkcs5->mode = algo->mode;\n    pkcs5->padopt = algo->padopt;\n    pkcs5->padchar = algo->padchar;\n    pkcs5->hash = algo->hash;\n    pkcs5->hashlen = algo->hashlen;\n    pkcs5->dklen = 16;\n    pkcs5->saltlen = algo->saltlen;\n    pkcs5->effkeysize = algo->effkeysize;\n    pkcs5->salt = salt.beg;\n    pkcs5->kdf = pbkdf1;\n    pkcs5->itercount = itercount;\n    return 0;\n}\n\nstatic int\npkcs8kek(LIBSSH2_SESSION *session, _libssh2_os400qc3_crypto_ctx **ctx,\n         const unsigned char *data, unsigned int datalen,\n         const unsigned char *passphrase, asn1Element *privkeyinfo)\n{\n    asn1Element encprivkeyinfo;\n    asn1Element pkcs5alg;\n    pkcs5params pkcs5;\n    size_t pplen;\n    char *cp;\n    unsigned long t;\n    int i;\n    char *dk = NULL;\n    Qc3_Format_ALGD0200_T algd;\n    Qus_EC_t errcode;\n\n    /* Determine if the PKCS#8 data is encrypted and, if so, set-up a\n       key encryption key and algorithm in context.\n       Return 1 if encrypted, 0, if not, -1 if error. */\n\n    *ctx = NULL;\n    privkeyinfo->beg = (char *) data;\n    privkeyinfo->end = privkeyinfo->beg + datalen;\n\n    /* If no passphrase is given, it cannot be an encrypted key. */\n    if(!passphrase || !*passphrase)\n        return 0;\n\n    /* Parse PKCS#8 data, checking if ASN.1 format is PrivateKeyInfo or\n       EncryptedPrivateKeyInfo. */\n    if(getASN1Element(&encprivkeyinfo, privkeyinfo->beg, privkeyinfo->end) !=\n        (char *) data + datalen ||\n        *encprivkeyinfo.header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    cp = getASN1Element(&pkcs5alg, encprivkeyinfo.beg, encprivkeyinfo.end);\n    if(!cp)\n        return -1;\n\n    switch(*pkcs5alg.header) {\n    case ASN1_INTEGER:                          /* Version. */\n        return 0;       /* This is a PrivateKeyInfo --> not encrypted. */\n    case ASN1_SEQ | ASN1_CONSTRUCTED:           /* AlgorithIdentifier. */\n        break;          /* This is an EncryptedPrivateKeyInfo --> encrypted. */\n    default:\n        return -1;      /* Unrecognized: error. */\n    }\n\n    /* Get the encrypted key data. */\n    if(getASN1Element(privkeyinfo, cp, encprivkeyinfo.end) !=\n        encprivkeyinfo.end || *privkeyinfo->header != ASN1_OCTET_STRING)\n        return -1;\n\n    /* PKCS#5: parse the PBES AlgorithmIdentifier and recursively get all\n       encryption parameters. */\n    memset((char *) &pkcs5, 0, sizeof pkcs5);\n    if(parse_pkcs5_algorithm(session, &pkcs5, &pkcs5alg, pbestable))\n        return -1;\n\n    /* Compute the derived key. */\n    if((*pkcs5.kdf)(session, &dk, passphrase, &pkcs5))\n        return -1;\n\n    /* Prepare the algorithm descriptor. */\n    memset((char *) &algd, 0, sizeof algd);\n    algd.Block_Cipher_Alg = pkcs5.cipher;\n    algd.Block_Length = pkcs5.blocksize;\n    algd.Mode = pkcs5.mode;\n    algd.Pad_Option = pkcs5.padopt;\n    algd.Pad_Character = pkcs5.padchar;\n    algd.Effective_Key_Size = pkcs5.effkeysize;\n    memcpy(algd.Init_Vector, pkcs5.iv, pkcs5.ivlen);\n\n    /* Create the key and algorithm context tokens. */\n    *ctx = libssh2_init_crypto_ctx(NULL);\n    if(!*ctx) {\n        LIBSSH2_FREE(session, dk);\n        return -1;\n    }\n    libssh2_init_crypto_ctx(*ctx);\n    set_EC_length(errcode, sizeof errcode);\n    Qc3CreateKeyContext(dk, &pkcs5.dklen, binstring, &algd.Block_Cipher_Alg,\n                        qc3clear, NULL, NULL, (*ctx)->key.Key_Context_Token,\n                        (char *) &errcode);\n    LIBSSH2_FREE(session, dk);\n    if(errcode.Bytes_Available) {\n        free((char *) *ctx);\n        *ctx = NULL;\n        return -1;\n    }\n\n    Qc3CreateAlgorithmContext((char *) &algd, Qc3_Alg_Block_Cipher,\n                              (*ctx)->hash.Alg_Context_Token, &errcode);\n    if(errcode.Bytes_Available) {\n        Qc3DestroyKeyContext((*ctx)->key.Key_Context_Token, (char *) &ecnull);\n        free((char *) *ctx);\n        *ctx = NULL;\n        return -1;\n    }\n    return 1;       /* Tell it's encrypted. */\n}\n\nstatic int\nrsapkcs8privkey(LIBSSH2_SESSION *session,\n                const unsigned char *data, unsigned int datalen,\n                const unsigned char *passphrase, void *loadkeydata)\n{\n    libssh2_rsa_ctx *ctx = (libssh2_rsa_ctx *) loadkeydata;\n    char keyform = Qc3_Clear;\n    char *kek = NULL;\n    char *kea = NULL;\n    _libssh2_os400qc3_crypto_ctx *kekctx;\n    asn1Element pki;\n    int pkilen;\n    Qus_EC_t errcode;\n\n    switch(pkcs8kek(session, &kekctx, data, datalen, passphrase, &pki)) {\n    case 1:\n        keyform = Qc3_Encrypted;\n        kek = kekctx->key.Key_Context_Token;\n        kea = kekctx->hash.Alg_Context_Token;\n    case 0:\n        break;\n    default:\n        return -1;\n    }\n\n    set_EC_length(errcode, sizeof errcode);\n    pkilen = pki.end - pki.beg;\n    Qc3CreateKeyContext((unsigned char *) pki.beg, &pkilen, berstring,\n                        rsaprivate, &keyform, kek, kea,\n                        ctx->key.Key_Context_Token, (char *) &errcode);\n    if(errcode.Bytes_Available) {\n        if(kekctx)\n            _libssh2_os400qc3_crypto_dtor(kekctx);\n        return -1;\n    }\n    ctx->kek = kekctx;\n    return 0;\n}\n\nstatic char *\nstorewithlength(char *p, const char *data, int length)\n{\n    _libssh2_htonu32(p, length);\n    if(length)\n        memcpy(p + 4, data, length);\n    return p + 4 + length;\n}\n\nstatic int\nsshrsapubkey(LIBSSH2_SESSION *session, char **sshpubkey,\n             asn1Element *params, asn1Element *key, const char *method)\n{\n    int methlen = strlen(method);\n    asn1Element keyseq;\n    asn1Element m;\n    asn1Element e;\n    int len;\n    char *cp;\n\n    if(getASN1Element(&keyseq, key->beg + 1, key->end) != key->end ||\n        *keyseq.header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    if(!getASN1Element(&m, keyseq.beg, keyseq.end) ||\n        *m.header != ASN1_INTEGER)\n        return -1;\n    if(getASN1Element(&e, m.end, keyseq.end) != keyseq.end ||\n        *e.header != ASN1_INTEGER)\n        return -1;\n    len = 4 + methlen + 4 + (e.end - e.beg) + 4 + (m.end - m.beg);\n    cp = LIBSSH2_ALLOC(session, len);\n    if(!cp)\n        return -1;\n    *sshpubkey = cp;\n    cp = storewithlength(cp, method, methlen);\n    cp = storewithlength(cp, e.beg, e.end - e.beg);\n    cp = storewithlength(cp, m.beg, m.end - m.beg);\n    return len;\n}\n\nstatic int\nrsapkcs8pubkey(LIBSSH2_SESSION *session,\n               const unsigned char *data, unsigned int datalen,\n               const unsigned char *passphrase, void *loadkeydata)\n{\n    loadpubkeydata *p = (loadpubkeydata *) loadkeydata;\n    char *buf;\n    int len;\n    char *cp;\n    int i;\n    char keyform = Qc3_Clear;\n    char *kek = NULL;\n    char *kea = NULL;\n    _libssh2_os400qc3_crypto_ctx *kekctx;\n    asn1Element subjpubkeyinfo;\n    asn1Element algorithmid;\n    asn1Element algorithm;\n    asn1Element subjpubkey;\n    asn1Element parameters;\n    asn1Element pki;\n    int pkilen;\n    Qus_EC_t errcode;\n\n    buf = alloca(datalen);\n    if(!buf)\n        return -1;\n\n    switch(pkcs8kek(session, &kekctx, data, datalen, passphrase, &pki)) {\n    case 1:\n        keyform = Qc3_Encrypted;\n        kek = kekctx->key.Key_Context_Token;\n        kea = kekctx->hash.Alg_Context_Token;\n    case 0:\n        break;\n    default:\n        return -1;\n    }\n\n    set_EC_length(errcode, sizeof errcode);\n    pkilen = pki.end - pki.beg;\n    Qc3ExtractPublicKey(pki.beg, &pkilen, berstring, &keyform,\n                        kek, kea, buf, (int *) &datalen, &len, &errcode);\n    _libssh2_os400qc3_crypto_dtor(kekctx);\n    if(errcode.Bytes_Available)\n        return -1;\n    /* Get the algorithm OID and key data from SubjectPublicKeyInfo. */\n    if(getASN1Element(&subjpubkeyinfo, buf, buf + len) != buf + len ||\n        *subjpubkeyinfo.header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    cp = getASN1Element(&algorithmid, subjpubkeyinfo.beg, subjpubkeyinfo.end);\n    if(!cp || *algorithmid.header != (ASN1_SEQ | ASN1_CONSTRUCTED))\n        return -1;\n    if(!getASN1Element(&algorithm, algorithmid.beg, algorithmid.end) ||\n        *algorithm.header != ASN1_OBJ_ID)\n        return -1;\n    if(getASN1Element(&subjpubkey, cp, subjpubkeyinfo.end) !=\n        subjpubkeyinfo.end || *subjpubkey.header != ASN1_BIT_STRING)\n        return -1;\n    /* Check for supported algorithm. */\n    for(i = 0; pka[i].oid; i++)\n        if(!oidcmp(&algorithm, pka[i].oid)) {\n            len = (*pka[i].sshpubkey)(session, &p->data, &algorithmid,\n                                      &subjpubkey, pka[i].method);\n            if(len < 0)\n                return -1;\n            p->length = len;\n            p->method = pka[i].method;\n            return 0;\n        }\n    return -1;                              /* Algorithm not supported. */\n}\n\nstatic int\npkcs1topkcs8(LIBSSH2_SESSION *session,\n             const unsigned char **data8, unsigned int *datalen8,\n             const unsigned char *data1, unsigned int datalen1)\n{\n    asn1Element *prvk;\n    asn1Element *pkcs8;\n    unsigned char *data;\n\n    *data8 = NULL;\n    *datalen8 = 0;\n    if(datalen1 < 2)\n        return -1;\n    prvk = asn1_new_from_bytes(data1, datalen1);\n    if(!prvk)\n        return -1;\n    pkcs8 = rsaprivatekeyinfo(prvk);\n    asn1delete(prvk);\n    if(!prvk) {\n        asn1delete(pkcs8);\n        pkcs8 = NULL;\n    }\n    if(!pkcs8)\n        return -1;\n    data = (unsigned char *) LIBSSH2_ALLOC(session,\n                                           pkcs8->end - pkcs8->header);\n    if(!data) {\n        asn1delete(pkcs8);\n        return -1;\n    }\n    *data8 = data;\n    *datalen8 = pkcs8->end - pkcs8->header;\n    memcpy((char *) data, (char *) pkcs8->header, *datalen8);\n    asn1delete(pkcs8);\n    return 0;\n}\n\nstatic int\nrsapkcs1privkey(LIBSSH2_SESSION *session,\n                const unsigned char *data, unsigned int datalen,\n                const unsigned char *passphrase, void *loadkeydata)\n{\n    const unsigned char *data8;\n    unsigned int datalen8;\n    int ret;\n\n    if(pkcs1topkcs8(session, &data8, &datalen8, data, datalen))\n        return -1;\n    ret = rsapkcs8privkey(session, data8, datalen8, passphrase, loadkeydata);\n    LIBSSH2_FREE(session, (char *) data8);\n    return ret;\n}\n\nstatic int\nrsapkcs1pubkey(LIBSSH2_SESSION *session,\n               const unsigned char *data, unsigned int datalen,\n               const unsigned char *passphrase, void *loadkeydata)\n{\n    const unsigned char *data8;\n    unsigned int datalen8;\n    int ret;\n\n    if(pkcs1topkcs8(session, &data8, &datalen8, data, datalen))\n        return -1;\n    ret = rsapkcs8pubkey(session, data8, datalen8, passphrase, loadkeydata);\n    LIBSSH2_FREE(session, (char *) data8);\n    return ret;\n}\n\nstatic int\ntry_pem_load(LIBSSH2_SESSION *session, FILE *fp,\n             const unsigned char *passphrase,\n             const char *header, const char *trailer,\n             loadkeyproc proc, void *loadkeydata)\n{\n    unsigned char *data = NULL;\n    unsigned int datalen = 0;\n    int c;\n    int ret;\n\n    fseek(fp, 0L, SEEK_SET);\n    for(;;) {\n        ret = _libssh2_pem_parse(session, header, trailer,\n                                 passphrase,\n                                 fp, &data, &datalen);\n\n        if(!ret) {\n            ret = (*proc)(session, data, datalen, passphrase, loadkeydata);\n            if(!ret)\n                return 0;\n        }\n\n        if(data) {\n            LIBSSH2_FREE(session, data);\n            data = NULL;\n        }\n        c = getc(fp);\n\n        if(c == EOF)\n            break;\n\n        ungetc(c, fp);\n    }\n\n    return -1;\n}\n\nstatic int\nload_rsa_private_file(LIBSSH2_SESSION *session, const char *filename,\n                      unsigned const char *passphrase,\n                      loadkeyproc proc1, loadkeyproc proc8, void *loadkeydata)\n{\n    FILE *fp = fopen(filename, fopenrmode);\n    unsigned char *data = NULL;\n    size_t datalen = 0;\n    int ret;\n    long filesize;\n\n    if(!fp)\n        return -1;\n\n    /* Try with \"ENCRYPTED PRIVATE KEY\" PEM armor.\n       --> PKCS#8 EncryptedPrivateKeyInfo */\n    ret = try_pem_load(session, fp, passphrase, beginencprivkeyhdr,\n                       endencprivkeyhdr, proc8, loadkeydata);\n\n    /* Try with \"PRIVATE KEY\" PEM armor.\n       --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */\n    if(ret)\n        ret = try_pem_load(session, fp, passphrase, beginprivkeyhdr,\n                           endprivkeyhdr, proc8, loadkeydata);\n\n    /* Try with \"RSA PRIVATE KEY\" PEM armor.\n       --> PKCS#1 RSAPrivateKey */\n    if(ret)\n        ret = try_pem_load(session, fp, passphrase, beginrsaprivkeyhdr,\n                           endrsaprivkeyhdr, proc1, loadkeydata);\n    fclose(fp);\n\n    if(ret) {\n        /* Try DER encoding. */\n        fp = fopen(filename, fopenrbmode);\n        fseek(fp, 0L, SEEK_END);\n        filesize = ftell(fp);\n\n        if(filesize <= 32768) {        /* Limit to a reasonable size. */\n            datalen = filesize;\n            data = (unsigned char *) alloca(datalen);\n            if(data) {\n                fseek(fp, 0L, SEEK_SET);\n                fread(data, datalen, 1, fp);\n\n                /* Try as PKCS#8 DER data.\n                   --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */\n                ret = (*proc8)(session, data, datalen, passphrase,\n                               loadkeydata);\n\n                /* Try as PKCS#1 DER data.\n                   --> PKCS#1 RSAPrivateKey */\n                if(ret)\n                    ret = (*proc1)(session, data, datalen, passphrase,\n                                   loadkeydata);\n            }\n        }\n        fclose(fp);\n    }\n\n    return ret;\n}\n\nint\n_libssh2_rsa_new_private(libssh2_rsa_ctx **rsa, LIBSSH2_SESSION *session,\n                         const char *filename, unsigned const char *passphrase)\n{\n    libssh2_rsa_ctx *ctx = libssh2_init_crypto_ctx(NULL);\n    int ret;\n    Qc3_Format_ALGD0400_T algd;\n    Qus_EC_t errcode;\n\n    if(!ctx)\n        return -1;\n    ret = load_rsa_private_file(session, filename, passphrase,\n                                rsapkcs1privkey, rsapkcs8privkey,\n                                (void *) ctx);\n    if(!ret) {\n        /* Create the algorithm context. */\n        algd.Public_Key_Alg = Qc3_RSA;\n        algd.PKA_Block_Format = Qc3_PKCS1_01;\n        memset(algd.Reserved, 0, sizeof algd.Reserved);\n        algd.Signing_Hash_Alg = Qc3_SHA1;\n        set_EC_length(errcode, sizeof errcode);\n        Qc3CreateAlgorithmContext((char *) &algd, Qc3_Alg_Public_Key,\n                                  ctx->hash.Alg_Context_Token, &errcode);\n        if(errcode.Bytes_Available)\n            ret = -1;\n    }\n    if(ret) {\n        _libssh2_os400qc3_crypto_dtor(ctx);\n        ctx = NULL;\n    }\n    *rsa = ctx;\n    return ret;\n}\n\nint\n_libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session,\n                          unsigned char **method, size_t *method_len,\n                          unsigned char **pubkeydata, size_t *pubkeydata_len,\n                          const char *privatekey, const char *passphrase)\n\n{\n    loadpubkeydata p;\n    int ret;\n\n    *method = NULL;\n    *method_len = 0;\n    *pubkeydata = NULL;\n    *pubkeydata_len = 0;\n\n    ret = load_rsa_private_file(session, privatekey, passphrase,\n                                rsapkcs1pubkey, rsapkcs8pubkey, (void *) &p);\n    if(!ret) {\n        *method_len = strlen(p.method);\n        *method = LIBSSH2_ALLOC(session, *method_len);\n        if(*method)\n            memcpy((char *) *method, p.method, *method_len);\n        else\n            ret = -1;\n    }\n\n    if(ret) {\n        if(*method)\n            LIBSSH2_FREE(session, *method);\n        if(p.data)\n            LIBSSH2_FREE(session, (void *) p.data);\n        *method = NULL;\n        *method_len = 0;\n    }\n    else {\n        *pubkeydata = (unsigned char *) p.data;\n        *pubkeydata_len = p.length;\n    }\n\n    return ret;\n}\n\nint\n_libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx **rsa,\n                                    LIBSSH2_SESSION *session,\n                                    const char *filedata,\n                                    size_t filedata_len,\n                                    unsigned const char *passphrase)\n{\n    libssh2_rsa_ctx *ctx = libssh2_init_crypto_ctx(NULL);\n    unsigned char *data = NULL;\n    unsigned int datalen = 0;\n    int ret;\n    Qc3_Format_ALGD0400_T algd;\n    Qus_EC_t errcode;\n\n    if(!ctx)\n        return -1;\n\n    /* Try with \"ENCRYPTED PRIVATE KEY\" PEM armor.\n       --> PKCS#8 EncryptedPrivateKeyInfo */\n    ret = _libssh2_pem_parse_memory(session,\n                                    beginencprivkeyhdr, endencprivkeyhdr,\n                                    filedata, filedata_len, &data, &datalen);\n\n    /* Try with \"PRIVATE KEY\" PEM armor.\n       --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */\n    if(ret)\n        ret = _libssh2_pem_parse_memory(session,\n                                        beginprivkeyhdr, endprivkeyhdr,\n                                        filedata, filedata_len,\n                                        &data, &datalen);\n\n    if(!ret) {\n        /* Process PKCS#8. */\n        ret = rsapkcs8privkey(session,\n                              data, datalen, passphrase, (void *) &ctx);\n    }\n    else {\n        /* Try with \"RSA PRIVATE KEY\" PEM armor.\n           --> PKCS#1 RSAPrivateKey */\n        ret = _libssh2_pem_parse_memory(session,\n                                        beginrsaprivkeyhdr, endrsaprivkeyhdr,\n                                        filedata, filedata_len,\n                                        &data, &datalen);\n        if(!ret)\n            ret = rsapkcs1privkey(session,\n                                  data, datalen, passphrase, (void *) &ctx);\n    }\n\n    if(ret) {\n        /* Try as PKCS#8 DER data.\n           --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */\n        ret = rsapkcs8privkey(session, filedata, filedata_len,\n                              passphrase, (void *) &ctx);\n\n        /* Try as PKCS#1 DER data.\n           --> PKCS#1 RSAPrivateKey */\n        if(ret)\n            ret = rsapkcs1privkey(session, filedata, filedata_len,\n                                  passphrase, (void *) &ctx);\n    }\n\n    if(data)\n        LIBSSH2_FREE(session, data);\n\n    if(!ret) {\n        /* Create the algorithm context. */\n        algd.Public_Key_Alg = Qc3_RSA;\n        algd.PKA_Block_Format = Qc3_PKCS1_01;\n        memset(algd.Reserved, 0, sizeof algd.Reserved);\n        algd.Signing_Hash_Alg = Qc3_SHA1;\n        set_EC_length(errcode, sizeof errcode);\n        Qc3CreateAlgorithmContext((char *) &algd, Qc3_Alg_Public_Key,\n                                  ctx->hash.Alg_Context_Token, &errcode);\n        if(errcode.Bytes_Available)\n            ret = -1;\n    }\n\n    if(ret) {\n        _libssh2_os400qc3_crypto_dtor(ctx);\n        ctx = NULL;\n    }\n\n    *rsa = ctx;\n    return ret;\n}\n\nint\n_libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session,\n                                unsigned char **method, size_t *method_len,\n                                unsigned char **pubkeydata,\n                                size_t *pubkeydata_len,\n                                const char *privatekeydata,\n                                size_t privatekeydata_len,\n                                const char *passphrase)\n{\n    loadpubkeydata p;\n    unsigned char *data = NULL;\n    unsigned int datalen = 0;\n    const char *meth;\n    int ret;\n\n    *method = NULL;\n    *method_len = 0;\n    *pubkeydata = NULL;\n    *pubkeydata_len = 0;\n\n    /* Try with \"ENCRYPTED PRIVATE KEY\" PEM armor.\n       --> PKCS#8 EncryptedPrivateKeyInfo */\n    ret = _libssh2_pem_parse_memory(session,\n                                    beginencprivkeyhdr, endencprivkeyhdr,\n                                    privatekeydata, privatekeydata_len,\n                                    &data, &datalen);\n\n    /* Try with \"PRIVATE KEY\" PEM armor.\n       --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */\n    if(ret)\n        ret = _libssh2_pem_parse_memory(session,\n                                        beginprivkeyhdr, endprivkeyhdr,\n                                        privatekeydata, privatekeydata_len,\n                                        &data, &datalen);\n\n    if(!ret) {\n        /* Process PKCS#8. */\n        ret = rsapkcs8pubkey(session,\n                             data, datalen, passphrase, (void *) &p);\n    }\n    else {\n        /* Try with \"RSA PRIVATE KEY\" PEM armor.\n           --> PKCS#1 RSAPrivateKey */\n        ret = _libssh2_pem_parse_memory(session,\n                                        beginrsaprivkeyhdr, endrsaprivkeyhdr,\n                                        privatekeydata, privatekeydata_len,\n                                        &data, &datalen);\n        if(!ret)\n            ret = rsapkcs1pubkey(session,\n                                 data, datalen, passphrase, (void *) &p);\n    }\n\n    if(ret) {\n        /* Try as PKCS#8 DER data.\n           --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */\n        ret = rsapkcs8pubkey(session, privatekeydata, privatekeydata_len,\n                             passphrase, (void *) &p);\n\n        /* Try as PKCS#1 DER data.\n           --> PKCS#1 RSAPrivateKey */\n        if(ret)\n            ret = rsapkcs1pubkey(session, privatekeydata, privatekeydata_len,\n                                 passphrase, (void *) &p);\n    }\n\n    if(data)\n        LIBSSH2_FREE(session, data);\n\n    if(!ret) {\n        *method_len = strlen(p.method);\n        *method = LIBSSH2_ALLOC(session, *method_len);\n        if(*method)\n            memcpy((char *) *method, p.method, *method_len);\n        else\n            ret = -1;\n    }\n    if(ret) {\n        if(*method)\n            LIBSSH2_FREE(session, *method);\n        if(p.data)\n            LIBSSH2_FREE(session, (void *) p.data);\n        *method = NULL;\n        *method_len = 0;\n    }\n    else {\n        *pubkeydata = (unsigned char *) p.data;\n        *pubkeydata_len = p.length;\n    }\n\n    return ret;\n}\n\nint\n_libssh2_rsa_sha1_verify(libssh2_rsa_ctx *rsa,\n                         const unsigned char *sig, unsigned long sig_len,\n                         const unsigned char *m, unsigned long m_len)\n{\n    Qus_EC_t errcode;\n    int slen = sig_len;\n    int mlen = m_len;\n\n    set_EC_length(errcode, sizeof errcode);\n    Qc3VerifySignature((char *) sig, &slen, (char *) m, &mlen, Qc3_Data,\n                       rsa->hash.Alg_Context_Token, Qc3_Alg_Token,\n                       rsa->key.Key_Context_Token, Qc3_Key_Token, anycsp,\n                       NULL, (char *) &errcode);\n    return errcode.Bytes_Available? -1: 0;\n}\n\nint\n_libssh2_os400qc3_rsa_sha1_signv(LIBSSH2_SESSION *session,\n                                 unsigned char **signature,\n                                 size_t *signature_len,\n                                 int veccount,\n                                 const struct iovec vector[],\n                                 libssh2_rsa_ctx *ctx)\n{\n    Qus_EC_t errcode;\n    int siglen;\n    unsigned char *sig;\n    char sigbuf[8192];\n    int sigbufsize = sizeof sigbuf;\n\n    ctx->hash.Final_Op_Flag = Qc3_Final;\n    set_EC_length(errcode, sizeof errcode);\n    Qc3CalculateSignature((char *) vector, &veccount, Qc3_Array,\n                          (char *) &ctx->hash, Qc3_Alg_Token,\n                          (char *) &ctx->key, Qc3_Key_Token,\n                          anycsp, NULL, sigbuf, &sigbufsize, &siglen,\n                          (char *) &errcode);\n    ctx->hash.Final_Op_Flag = Qc3_Continue;\n    if(errcode.Bytes_Available)\n        return -1;\n    sig = LIBSSH2_ALLOC(session, siglen);\n    if(!sig)\n        return -1;\n    memcpy((char *) sig, sigbuf, siglen);\n    *signature = sig;\n    *signature_len = siglen;\n    return 0;\n}\n\n#endif /* LIBSSH2_OS400QC3 */\n\n/* vim: set expandtab ts=4 sw=4: */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/os400qc3.h",
    "content": "/*\n * Copyright (C) 2015-2016 Patrick Monnerat, D+H <patrick.monnerat@dh.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_OS400QC3_H\n#define LIBSSH2_OS400QC3_H\n\n#include <stdlib.h>\n#include <string.h>\n\n#include <qc3cci.h>\n\n\n/* Redefine character/string literals as always EBCDIC. */\n#undef Qc3_Alg_Token\n#define Qc3_Alg_Token       \"\\xC1\\xD3\\xC7\\xC4\\xF0\\xF1\\xF0\\xF0\"  /* ALGD0100 */\n#undef Qc3_Alg_Block_Cipher\n#define Qc3_Alg_Block_Cipher \"\\xC1\\xD3\\xC7\\xC4\\xF0\\xF2\\xF0\\xF0\" /* ALGD0200 */\n#undef Qc3_Alg_Block_CipherAuth\n#define Qc3_Alg_Block_CipherAuth                                            \\\n                            \"\\xC1\\xD3\\xC7\\xC4\\xF0\\xF2\\xF1\\xF0\"  /* ALGD0210 */\n#undef Qc3_Alg_Stream_Cipher\n#define Qc3_Alg_Stream_Cipher                                               \\\n                            \"\\xC1\\xD3\\xC7\\xC4\\xF0\\xF3\\xF0\\xF0\"  /* ALGD0300 */\n#undef Qc3_Alg_Public_Key\n#define Qc3_Alg_Public_Key  \"\\xC1\\xD3\\xC7\\xC4\\xF0\\xF4\\xF0\\xF0\"  /* ALGD0400 */\n#undef Qc3_Alg_Hash\n#define Qc3_Alg_Hash        \"\\xC1\\xD3\\xC7\\xC4\\xF0\\xF5\\xF0\\xF0\"  /* ALGD0500 */\n#undef Qc3_Data\n#define Qc3_Data            \"\\xC4\\xC1\\xE3\\xC1\\xF0\\xF1\\xF0\\xF0\"  /* DATA0100 */\n#undef Qc3_Array\n#define Qc3_Array           \"\\xC4\\xC1\\xE3\\xC1\\xF0\\xF2\\xF0\\xF0\"  /* DATA0200 */\n#undef Qc3_Key_Token\n#define Qc3_Key_Token       \"\\xD2\\xC5\\xE8\\xC4\\xF0\\xF1\\xF0\\xF0\"  /* KEYD0100 */\n#undef Qc3_Key_Parms\n#define Qc3_Key_Parms       \"\\xD2\\xC5\\xE8\\xC4\\xF0\\xF2\\xF0\\xF0\"  /* KEYD0200 */\n#undef Qc3_Key_KSLabel\n#define Qc3_Key_KSLabel     \"\\xD2\\xC5\\xE8\\xC4\\xF0\\xF4\\xF0\\xF0\"  /* KEYD0400 */\n#undef Qc3_Key_PKCS5\n#define Qc3_Key_PKCS5       \"\\xD2\\xC5\\xE8\\xC4\\xF0\\xF5\\xF0\\xF0\"  /* KEYD0500 */\n#undef Qc3_Key_PEMCert\n#define Qc3_Key_PEMCert     \"\\xD2\\xC5\\xE8\\xC4\\xF0\\xF6\\xF0\\xF0\"  /* KEYD0600 */\n#undef Qc3_Key_CSLabel\n#define Qc3_Key_CSLabel     \"\\xD2\\xC5\\xE8\\xC4\\xF0\\xF7\\xF0\\xF0\"  /* KEYD0700 */\n#undef Qc3_Key_CSDN\n#define Qc3_Key_CSDN        \"\\xD2\\xC5\\xE8\\xC4\\xF0\\xF8\\xF0\\xF0\"  /* KEYD0800 */\n#undef Qc3_Key_AppID\n#define Qc3_Key_AppID       \"\\xD2\\xC5\\xE8\\xC4\\xF0\\xF9\\xF0\\xF0\"  /* KEYD0900 */\n\n#undef Qc3_ECB\n#define Qc3_ECB             '\\xF0'      /* '0' */\n#undef Qc3_CBC\n#define Qc3_CBC             '\\xF1'      /* '1' */\n#undef Qc3_OFB\n#define Qc3_OFB             '\\xF2'      /* '2' */\n#undef Qc3_CFB1Bit\n#define Qc3_CFB1Bit         '\\xF3'      /* '3' */\n#undef Qc3_CFB8Bit\n#define Qc3_CFB8Bit         '\\xF4'      /* '4' */\n#undef Qc3_CFB64Bit\n#define Qc3_CFB64Bit        '\\xF5'      /* '5' */\n#undef Qc3_CUSP\n#define Qc3_CUSP            '\\xF6'      /* '6' */\n#undef Qc3_CTR\n#define Qc3_CTR             '\\xF7'      /* '7' */\n#undef Qc3_CCM\n#define Qc3_CCM             '\\xF8'      /* '8' */\n#undef Qc3_No_Pad\n#define Qc3_No_Pad          '\\xF0'      /* '0' */\n#undef Qc3_Pad_Char\n#define Qc3_Pad_Char        '\\xF1'      /* '1' */\n#undef Qc3_Pad_Counter\n#define Qc3_Pad_Counter     '\\xF2'      /* '2' */\n#undef Qc3_PKCS1_00\n#define Qc3_PKCS1_00        '\\xF0'      /* '0' */\n#undef Qc3_PKCS1_01\n#define Qc3_PKCS1_01        '\\xF1'      /* '1' */\n#undef Qc3_PKCS1_02\n#define Qc3_PKCS1_02        '\\xF2'      /* '2' */\n#undef Qc3_ISO9796\n#define Qc3_ISO9796         '\\xF3'      /* '3' */\n#undef Qc3_Zero_Pad\n#define Qc3_Zero_Pad        '\\xF4'      /* '4' */\n#undef Qc3_ANSI_X931\n#define Qc3_ANSI_X931       '\\xF5'      /* '5' */\n#undef Qc3_OAEP\n#define Qc3_OAEP            '\\xF6'      /* '6' */\n#undef Qc3_Bin_String\n#define Qc3_Bin_String      '\\xF0'      /* '0' */\n#undef Qc3_BER_String\n#define Qc3_BER_String      '\\xF1'      /* '1' */\n#undef Qc3_MK_Struct\n#define Qc3_MK_Struct       '\\xF3'      /* '3' */\n#undef Qc3_KSLabel_Struct\n#define Qc3_KSLabel_Struct  '\\xF4'      /* '4' */\n#undef Qc3_PKCS5_Struct\n#define Qc3_PKCS5_Struct    '\\xF5'      /* '5' */\n#undef Qc3_PEMCert_String\n#define Qc3_PEMCert_String  '\\xF6'      /* '6' */\n#undef Qc3_CSLabel_String\n#define Qc3_CSLabel_String  '\\xF7'      /* '7' */\n#undef Qc3_CSDN_String\n#define Qc3_CSDN_String     '\\xF8'      /* '8' */\n#undef Qc3_Clear\n#define Qc3_Clear           '\\xF0'      /* '0' */\n#undef Qc3_Encrypted\n#define Qc3_Encrypted       '\\xF1'      /* '1' */\n#undef Qc3_MK_Encrypted\n#define Qc3_MK_Encrypted    '\\xF2'      /* '2' */\n#undef Qc3_Any_CSP\n#define Qc3_Any_CSP         '\\xF0'      /* '0' */\n#undef Qc3_Sfw_CSP\n#define Qc3_Sfw_CSP         '\\xF1'      /* '1' */\n#undef Qc3_Hdw_CSP\n#define Qc3_Hdw_CSP         '\\xF2'      /* '2' */\n#undef Qc3_Continue\n#define Qc3_Continue        '\\xF0'      /* '0' */\n#undef Qc3_Final\n#define Qc3_Final           '\\xF1'      /* '1' */\n#undef Qc3_MK_New\n#define Qc3_MK_New          '\\xF0'      /* '0' */\n#undef Qc3_MK_Current\n#define Qc3_MK_Current      '\\xF1'      /* '1' */\n#undef Qc3_MK_Old\n#define Qc3_MK_Old          '\\xF2'      /* '2' */\n#undef Qc3_MK_Pending\n#define Qc3_MK_Pending      '\\xF3'      /* '3' */\n\n\n/* Define which features are supported. */\n#define LIBSSH2_MD5             1\n#define LIBSSH2_HMAC_RIPEMD     0\n#define LIBSSH2_HMAC_SHA256     1\n#define LIBSSH2_HMAC_SHA512     1\n\n#define LIBSSH2_AES             1\n#define LIBSSH2_AES_CTR         1\n#define LIBSSH2_BLOWFISH        0\n#define LIBSSH2_RC4             1\n#define LIBSSH2_CAST            0\n#define LIBSSH2_3DES            1\n\n#define LIBSSH2_RSA             1\n#define LIBSSH2_DSA             0\n\n#define MD5_DIGEST_LENGTH       16\n#define SHA_DIGEST_LENGTH       20\n#define SHA256_DIGEST_LENGTH    32\n#define SHA512_DIGEST_LENGTH    64\n\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: global handles structures.\n *\n *******************************************************************/\n\n/* HMAC & private key algorithms support structure. */\ntypedef struct _libssh2_os400qc3_crypto_ctx _libssh2_os400qc3_crypto_ctx;\nstruct _libssh2_os400qc3_crypto_ctx {\n    Qc3_Format_ALGD0100_T           hash;           /* Hash algorithm. */\n    Qc3_Format_KEYD0100_T           key;            /* Key. */\n    _libssh2_os400qc3_crypto_ctx *  kek;            /* Key encryption. */\n};\n\ntypedef struct {        /* Big number. */\n    unsigned char *         bignum;         /* Number bits, little-endian. */\n    unsigned int            length;         /* Length of bignum (# bytes). */\n}       _libssh2_bn;\n\ntypedef struct {        /* Algorithm description. */\n    char *                  fmt;            /* Format of Qc3 structure. */\n    int                     algo;           /* Algorithm identifier. */\n    unsigned char           size;           /* Block length. */\n    unsigned char           mode;           /* Block mode. */\n    int                     keylen;         /* Key length. */\n}       _libssh2_os400qc3_cipher_t;\n\ntypedef struct {        /* Diffie-Hellman context. */\n    char                    token[8];       /* Context token. */\n}       _libssh2_os400qc3_dh_ctx;\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: Define global types/codes.\n *\n *******************************************************************/\n\n#define libssh2_crypto_init()\n#define libssh2_crypto_exit()\n\n#define libssh2_sha1_ctx        Qc3_Format_ALGD0100_T\n#define libssh2_sha256_ctx      Qc3_Format_ALGD0100_T\n#define libssh2_md5_ctx         Qc3_Format_ALGD0100_T\n#define libssh2_hmac_ctx        _libssh2_os400qc3_crypto_ctx\n#define _libssh2_cipher_ctx     _libssh2_os400qc3_crypto_ctx\n\n#define libssh2_sha1_init(x)    libssh2_os400qc3_hash_init(x, Qc3_SHA1)\n#define libssh2_sha1_update(ctx, data, len)                                 \\\n                                libssh2_os400qc3_hash_update(&(ctx), data, len)\n#define libssh2_sha1_final(ctx, out)                                        \\\n                                libssh2_os400qc3_hash_final(&(ctx), out)\n#define libssh2_sha256_init(x)  libssh2_os400qc3_hash_init(x, Qc3_SHA256)\n#define libssh2_sha256_update(ctx, data, len)                               \\\n                                libssh2_os400qc3_hash_update(&(ctx), data, len)\n#define libssh2_sha256_final(ctx, out)                                      \\\n                                libssh2_os400qc3_hash_final(&(ctx), out)\n#define libssh2_sha256(message,  len, out)                                   \\\n                                libssh2_os400qc3_hash(message, len, out,    \\\n                                                      Qc3_SHA256)\n#define libssh2_md5_init(x)     libssh2_os400qc3_hash_init(x, Qc3_MD5)\n#define libssh2_md5_update(ctx, data, len)                                  \\\n                                libssh2_os400qc3_hash_update(&(ctx), data, len)\n#define libssh2_md5_final(ctx, out)                                         \\\n                                libssh2_os400qc3_hash_final(&(ctx), out)\n#define libssh2_hmac_ctx_init(ctx)                                          \\\n                                memset((char *) &(ctx), 0,                  \\\n                                       sizeof(libssh2_hmac_ctx))\n#define libssh2_hmac_md5_init(ctx, key, keylen)                         \\\n    libssh2_os400qc3_hmac_init(ctx, Qc3_MD5,                            \\\n                               MD5_DIGEST_LENGTH,                       \\\n                               key, keylen)\n#define libssh2_hmac_sha1_init(ctx, key, keylen)                        \\\n    libssh2_os400qc3_hmac_init(ctx, Qc3_SHA1,                           \\\n                               SHA_DIGEST_LENGTH,                       \\\n                               key, keylen)\n#define libssh2_hmac_sha256_init(ctx, key, keylen)                      \\\n    libssh2_os400qc3_hmac_init(ctx, Qc3_SHA256,                         \\\n                               SHA256_DIGEST_LENGTH,                    \\\n                               key, keylen)\n#define libssh2_hmac_sha512_init(ctx, key, keylen)                      \\\n    libssh2_os400qc3_hmac_init(ctx, Qc3_SHA512,                         \\\n                               SHA512_DIGEST_LENGTH,                    \\\n                               key, keylen)\n#define libssh2_hmac_update(ctx, data, datalen)                         \\\n    libssh2_os400qc3_hmac_update(&(ctx),                                \\\n                                 data, datalen)\n#define libssh2_hmac_final(ctx, data)           \\\n    libssh2_os400qc3_hmac_final(&(ctx), data)\n#define libssh2_hmac_cleanup(ctx)               \\\n    _libssh2_os400qc3_crypto_dtor(ctx)\n\n\n#define _libssh2_bn_ctx         int                 /* Not used. */\n\n#define _libssh2_bn_ctx_new()           0\n#define _libssh2_bn_ctx_free(bnctx)     ((void) 0)\n\n#define _libssh2_bn_init_from_bin() _libssh2_bn_init()\n#define _libssh2_bn_bytes(bn)   ((bn)->length)\n\n#define _libssh2_cipher_type(name)  _libssh2_os400qc3_cipher_t name\n#define _libssh2_cipher_aes128 {Qc3_Alg_Block_Cipher, Qc3_AES, 16,          \\\n                                Qc3_CBC, 16}\n#define _libssh2_cipher_aes192 {Qc3_Alg_Block_Cipher, Qc3_AES, 24,          \\\n                                Qc3_CBC, 24}\n#define _libssh2_cipher_aes256 {Qc3_Alg_Block_Cipher, Qc3_AES, 32,          \\\n                                Qc3_CBC, 32}\n#define _libssh2_cipher_aes128ctr {Qc3_Alg_Block_Cipher, Qc3_AES, 16,       \\\n                                   Qc3_CTR, 16}\n#define _libssh2_cipher_aes192ctr {Qc3_Alg_Block_Cipher, Qc3_AES, 24,       \\\n                                   Qc3_CTR, 24}\n#define _libssh2_cipher_aes256ctr {Qc3_Alg_Block_Cipher, Qc3_AES, 32,       \\\n                                   Qc3_CTR, 32}\n#define _libssh2_cipher_3des {Qc3_Alg_Block_Cipher, Qc3_TDES, 0,            \\\n                              Qc3_CBC, 24}\n#define _libssh2_cipher_arcfour {Qc3_Alg_Stream_Cipher, Qc3_RC4, 0, 0, 16}\n\n#define _libssh2_cipher_dtor(ctx) _libssh2_os400qc3_crypto_dtor(ctx)\n\n#define libssh2_rsa_ctx         _libssh2_os400qc3_crypto_ctx\n#define _libssh2_rsa_free(ctx)  (_libssh2_os400qc3_crypto_dtor(ctx),        \\\n                                 free((char *) ctx))\n#define libssh2_prepare_iovec(vec, len) memset((char *) (vec), 0,           \\\n                                               (len) * sizeof(struct iovec))\n#define _libssh2_rsa_sha1_signv(session, sig, siglen, count, vector, ctx)   \\\n            _libssh2_os400qc3_rsa_sha1_signv(session, sig, siglen,          \\\n                                             count, vector, ctx)\n\n#define _libssh2_dh_ctx         _libssh2_os400qc3_dh_ctx\n#define libssh2_dh_init(dhctx)  _libssh2_os400qc3_dh_init(dhctx)\n#define libssh2_dh_key_pair(dhctx, public, g, p, group_order, bnctx)        \\\n            _libssh2_os400qc3_dh_key_pair(dhctx, public, g, p, group_order)\n#define libssh2_dh_secret(dhctx, secret, f, p, bnctx)                       \\\n            _libssh2_os400qc3_dh_secret(dhctx, secret, f, p)\n#define libssh2_dh_dtor(dhctx)  _libssh2_os400qc3_dh_dtor(dhctx)\n\n\n/*******************************************************************\n *\n * OS/400 QC3 crypto-library backend: Support procedure prototypes.\n *\n *******************************************************************/\n\nextern _libssh2_bn *    _libssh2_bn_init(void);\nextern void     _libssh2_bn_free(_libssh2_bn *bn);\nextern unsigned long    _libssh2_bn_bits(_libssh2_bn *bn);\nextern int      _libssh2_bn_from_bin(_libssh2_bn *bn, int len,\n                                     const unsigned char *v);\nextern int      _libssh2_bn_set_word(_libssh2_bn *bn, unsigned long val);\nextern int      _libssh2_bn_to_bin(_libssh2_bn *bn, unsigned char *val);\nextern void     _libssh2_random(unsigned char *buf, int len);\nextern void     _libssh2_os400qc3_crypto_dtor(_libssh2_os400qc3_crypto_ctx *x);\nextern int      libssh2_os400qc3_hash_init(Qc3_Format_ALGD0100_T *x,\n                                           unsigned int algo);\nextern void     libssh2_os400qc3_hash_update(Qc3_Format_ALGD0100_T *ctx,\n                                             unsigned char *data, int len);\nextern void     libssh2_os400qc3_hash_final(Qc3_Format_ALGD0100_T *ctx,\n                                            unsigned char *out);\nextern int      libssh2_os400qc3_hash(const unsigned char *message,\n                                      unsigned long len, unsigned char *out,\n                                      unsigned int algo);\nextern void     libssh2_os400qc3_hmac_init(_libssh2_os400qc3_crypto_ctx *x,\n                                           int algo, size_t minkeylen,\n                                           void *key, int keylen);\nextern void     libssh2_os400qc3_hmac_update(_libssh2_os400qc3_crypto_ctx *ctx,\n                                             const unsigned char *data,\n                                             int len);\nextern void     libssh2_os400qc3_hmac_final(_libssh2_os400qc3_crypto_ctx *ctx,\n                                            unsigned char *out);\nextern int      _libssh2_os400qc3_rsa_sha1_signv(LIBSSH2_SESSION *session,\n                                                 unsigned char **signature,\n                                                 size_t *signature_len,\n                                                 int veccount,\n                                                 const struct iovec vector[],\n                                                 libssh2_rsa_ctx *ctx);\nextern void     _libssh2_os400qc3_dh_init(_libssh2_dh_ctx *dhctx);\nextern int      _libssh2_os400qc3_dh_key_pair(_libssh2_dh_ctx *dhctx,\n                                              _libssh2_bn *public,\n                                              _libssh2_bn *g,\n                                              _libssh2_bn *p, int group_order);\nextern int      _libssh2_os400qc3_dh_secret(_libssh2_dh_ctx *dhctx,\n                                            _libssh2_bn *secret,\n                                            _libssh2_bn *f, _libssh2_bn *p);\nextern void     _libssh2_os400qc3_dh_dtor(_libssh2_dh_ctx *dhctx);\n\n#endif\n\n/* vim: set expandtab ts=4 sw=4: */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/packet.c",
    "content": "/* Copyright (c) 2004-2007, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2005,2006 Mikhail Gusarov\n * Copyright (c) 2009-2014 by Daniel Stenberg\n * Copyright (c) 2010 Simon Josefsson\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include <errno.h>\n#include <fcntl.h>\n\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif\n\n#ifdef HAVE_INTTYPES_H\n#include <inttypes.h>\n#endif\n\n/* Needed for struct iovec on some platforms */\n#ifdef HAVE_SYS_UIO_H\n#include <sys/uio.h>\n#endif\n\n#include <sys/types.h>\n\n#include \"transport.h\"\n#include \"channel.h\"\n#include \"packet.h\"\n\n/*\n * libssh2_packet_queue_listener\n *\n * Queue a connection request for a listener\n */\nstatic inline int\npacket_queue_listener(LIBSSH2_SESSION * session, unsigned char *data,\n                      unsigned long datalen,\n                      packet_queue_listener_state_t *listen_state)\n{\n    /*\n     * Look for a matching listener\n     */\n    /* 17 = packet_type(1) + channel(4) + reason(4) + descr(4) + lang(4) */\n    unsigned long packet_len = 17 + (sizeof(FwdNotReq) - 1);\n    unsigned char *p;\n    LIBSSH2_LISTENER *listn = _libssh2_list_first(&session->listeners);\n    char failure_code = SSH_OPEN_ADMINISTRATIVELY_PROHIBITED;\n    int rc;\n\n    (void) datalen;\n\n    if(listen_state->state == libssh2_NB_state_idle) {\n        unsigned char *s = data + (sizeof(\"forwarded-tcpip\") - 1) + 5;\n        listen_state->sender_channel = _libssh2_ntohu32(s);\n        s += 4;\n\n        listen_state->initial_window_size = _libssh2_ntohu32(s);\n        s += 4;\n        listen_state->packet_size = _libssh2_ntohu32(s);\n        s += 4;\n\n        listen_state->host_len = _libssh2_ntohu32(s);\n        s += 4;\n        listen_state->host = s;\n        s += listen_state->host_len;\n        listen_state->port = _libssh2_ntohu32(s);\n        s += 4;\n\n        listen_state->shost_len = _libssh2_ntohu32(s);\n        s += 4;\n        listen_state->shost = s;\n        s += listen_state->shost_len;\n        listen_state->sport = _libssh2_ntohu32(s);\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"Remote received connection from %s:%ld to %s:%ld\",\n                       listen_state->shost, listen_state->sport,\n                       listen_state->host, listen_state->port);\n\n        listen_state->state = libssh2_NB_state_allocated;\n    }\n\n    if(listen_state->state != libssh2_NB_state_sent) {\n        while(listn) {\n            if((listn->port == (int) listen_state->port) &&\n                (strlen(listn->host) == listen_state->host_len) &&\n                (memcmp (listn->host, listen_state->host,\n                         listen_state->host_len) == 0)) {\n                /* This is our listener */\n                LIBSSH2_CHANNEL *channel = NULL;\n                listen_state->channel = NULL;\n\n                if(listen_state->state == libssh2_NB_state_allocated) {\n                    if(listn->queue_maxsize &&\n                        (listn->queue_maxsize <= listn->queue_size)) {\n                        /* Queue is full */\n                        failure_code = SSH_OPEN_RESOURCE_SHORTAGE;\n                        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                                       \"Listener queue full, ignoring\");\n                        listen_state->state = libssh2_NB_state_sent;\n                        break;\n                    }\n\n                    channel = LIBSSH2_CALLOC(session, sizeof(LIBSSH2_CHANNEL));\n                    if(!channel) {\n                        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                       \"Unable to allocate a channel for \"\n                                       \"new connection\");\n                        failure_code = SSH_OPEN_RESOURCE_SHORTAGE;\n                        listen_state->state = libssh2_NB_state_sent;\n                        break;\n                    }\n                    listen_state->channel = channel;\n\n                    channel->session = session;\n                    channel->channel_type_len = sizeof(\"forwarded-tcpip\") - 1;\n                    channel->channel_type = LIBSSH2_ALLOC(session,\n                                                          channel->\n                                                          channel_type_len +\n                                                          1);\n                    if(!channel->channel_type) {\n                        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                       \"Unable to allocate a channel for new\"\n                                       \" connection\");\n                        LIBSSH2_FREE(session, channel);\n                        failure_code = SSH_OPEN_RESOURCE_SHORTAGE;\n                        listen_state->state = libssh2_NB_state_sent;\n                        break;\n                    }\n                    memcpy(channel->channel_type, \"forwarded-tcpip\",\n                           channel->channel_type_len + 1);\n\n                    channel->remote.id = listen_state->sender_channel;\n                    channel->remote.window_size_initial =\n                        LIBSSH2_CHANNEL_WINDOW_DEFAULT;\n                    channel->remote.window_size =\n                        LIBSSH2_CHANNEL_WINDOW_DEFAULT;\n                    channel->remote.packet_size =\n                        LIBSSH2_CHANNEL_PACKET_DEFAULT;\n\n                    channel->local.id = _libssh2_channel_nextid(session);\n                    channel->local.window_size_initial =\n                        listen_state->initial_window_size;\n                    channel->local.window_size =\n                        listen_state->initial_window_size;\n                    channel->local.packet_size = listen_state->packet_size;\n\n                    _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                                   \"Connection queued: channel %lu/%lu \"\n                                   \"win %lu/%lu packet %lu/%lu\",\n                                   channel->local.id, channel->remote.id,\n                                   channel->local.window_size,\n                                   channel->remote.window_size,\n                                   channel->local.packet_size,\n                                   channel->remote.packet_size);\n\n                    p = listen_state->packet;\n                    *(p++) = SSH_MSG_CHANNEL_OPEN_CONFIRMATION;\n                    _libssh2_store_u32(&p, channel->remote.id);\n                    _libssh2_store_u32(&p, channel->local.id);\n                    _libssh2_store_u32(&p,\n                                       channel->remote.window_size_initial);\n                    _libssh2_store_u32(&p, channel->remote.packet_size);\n\n                    listen_state->state = libssh2_NB_state_created;\n                }\n\n                if(listen_state->state == libssh2_NB_state_created) {\n                    rc = _libssh2_transport_send(session, listen_state->packet,\n                                                 17, NULL, 0);\n                    if(rc == LIBSSH2_ERROR_EAGAIN)\n                        return rc;\n                    else if(rc) {\n                        listen_state->state = libssh2_NB_state_idle;\n                        return _libssh2_error(session, rc,\n                                              \"Unable to send channel \"\n                                              \"open confirmation\");\n                    }\n\n                    /* Link the channel into the end of the queue list */\n                    if(listen_state->channel) {\n                        _libssh2_list_add(&listn->queue,\n                                          &listen_state->channel->node);\n                        listn->queue_size++;\n                    }\n\n                    listen_state->state = libssh2_NB_state_idle;\n                    return 0;\n                }\n            }\n\n            listn = _libssh2_list_next(&listn->node);\n        }\n\n        listen_state->state = libssh2_NB_state_sent;\n    }\n\n    /* We're not listening to you */\n    p = listen_state->packet;\n    *(p++) = SSH_MSG_CHANNEL_OPEN_FAILURE;\n    _libssh2_store_u32(&p, listen_state->sender_channel);\n    _libssh2_store_u32(&p, failure_code);\n    _libssh2_store_str(&p, FwdNotReq, sizeof(FwdNotReq) - 1);\n    _libssh2_htonu32(p, 0);\n\n    rc = _libssh2_transport_send(session, listen_state->packet,\n                                 packet_len, NULL, 0);\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    }\n    else if(rc) {\n        listen_state->state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc, \"Unable to send open failure\");\n\n    }\n    listen_state->state = libssh2_NB_state_idle;\n    return 0;\n}\n\n/*\n * packet_x11_open\n *\n * Accept a forwarded X11 connection\n */\nstatic inline int\npacket_x11_open(LIBSSH2_SESSION * session, unsigned char *data,\n                unsigned long datalen,\n                packet_x11_open_state_t *x11open_state)\n{\n    int failure_code = SSH_OPEN_CONNECT_FAILED;\n    /* 17 = packet_type(1) + channel(4) + reason(4) + descr(4) + lang(4) */\n    unsigned long packet_len = 17 + (sizeof(X11FwdUnAvil) - 1);\n    unsigned char *p;\n    LIBSSH2_CHANNEL *channel = x11open_state->channel;\n    int rc;\n\n    (void) datalen;\n\n    if(x11open_state->state == libssh2_NB_state_idle) {\n        unsigned char *s = data + (sizeof(\"x11\") - 1) + 5;\n        x11open_state->sender_channel = _libssh2_ntohu32(s);\n        s += 4;\n        x11open_state->initial_window_size = _libssh2_ntohu32(s);\n        s += 4;\n        x11open_state->packet_size = _libssh2_ntohu32(s);\n        s += 4;\n        x11open_state->shost_len = _libssh2_ntohu32(s);\n        s += 4;\n        x11open_state->shost = s;\n        s += x11open_state->shost_len;\n        x11open_state->sport = _libssh2_ntohu32(s);\n\n        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                       \"X11 Connection Received from %s:%ld on channel %lu\",\n                       x11open_state->shost, x11open_state->sport,\n                       x11open_state->sender_channel);\n\n        x11open_state->state = libssh2_NB_state_allocated;\n    }\n\n    if(session->x11) {\n        if(x11open_state->state == libssh2_NB_state_allocated) {\n            channel = LIBSSH2_CALLOC(session, sizeof(LIBSSH2_CHANNEL));\n            if(!channel) {\n                _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                               \"allocate a channel for new connection\");\n                failure_code = SSH_OPEN_RESOURCE_SHORTAGE;\n                goto x11_exit;\n            }\n\n            channel->session = session;\n            channel->channel_type_len = sizeof(\"x11\") - 1;\n            channel->channel_type = LIBSSH2_ALLOC(session,\n                                                  channel->channel_type_len +\n                                                  1);\n            if(!channel->channel_type) {\n                _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                               \"allocate a channel for new connection\");\n                LIBSSH2_FREE(session, channel);\n                failure_code = SSH_OPEN_RESOURCE_SHORTAGE;\n                goto x11_exit;\n            }\n            memcpy(channel->channel_type, \"x11\",\n                   channel->channel_type_len + 1);\n\n            channel->remote.id = x11open_state->sender_channel;\n            channel->remote.window_size_initial =\n                LIBSSH2_CHANNEL_WINDOW_DEFAULT;\n            channel->remote.window_size = LIBSSH2_CHANNEL_WINDOW_DEFAULT;\n            channel->remote.packet_size = LIBSSH2_CHANNEL_PACKET_DEFAULT;\n\n            channel->local.id = _libssh2_channel_nextid(session);\n            channel->local.window_size_initial =\n                x11open_state->initial_window_size;\n            channel->local.window_size = x11open_state->initial_window_size;\n            channel->local.packet_size = x11open_state->packet_size;\n\n            _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                           \"X11 Connection established: channel %lu/%lu \"\n                           \"win %lu/%lu packet %lu/%lu\",\n                           channel->local.id, channel->remote.id,\n                           channel->local.window_size,\n                           channel->remote.window_size,\n                           channel->local.packet_size,\n                           channel->remote.packet_size);\n            p = x11open_state->packet;\n            *(p++) = SSH_MSG_CHANNEL_OPEN_CONFIRMATION;\n            _libssh2_store_u32(&p, channel->remote.id);\n            _libssh2_store_u32(&p, channel->local.id);\n            _libssh2_store_u32(&p, channel->remote.window_size_initial);\n            _libssh2_store_u32(&p, channel->remote.packet_size);\n\n            x11open_state->state = libssh2_NB_state_created;\n        }\n\n        if(x11open_state->state == libssh2_NB_state_created) {\n            rc = _libssh2_transport_send(session, x11open_state->packet, 17,\n                                         NULL, 0);\n            if(rc == LIBSSH2_ERROR_EAGAIN) {\n                return rc;\n            }\n            else if(rc) {\n                x11open_state->state = libssh2_NB_state_idle;\n                return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                      \"Unable to send channel open \"\n                                      \"confirmation\");\n            }\n\n            /* Link the channel into the session */\n            _libssh2_list_add(&session->channels, &channel->node);\n\n            /*\n             * Pass control to the callback, they may turn right around and\n             * free the channel, or actually use it\n             */\n            LIBSSH2_X11_OPEN(channel, (char *)x11open_state->shost,\n                             x11open_state->sport);\n\n            x11open_state->state = libssh2_NB_state_idle;\n            return 0;\n        }\n    }\n    else\n        failure_code = SSH_OPEN_RESOURCE_SHORTAGE;\n    /* fall-trough */\n  x11_exit:\n    p = x11open_state->packet;\n    *(p++) = SSH_MSG_CHANNEL_OPEN_FAILURE;\n    _libssh2_store_u32(&p, x11open_state->sender_channel);\n    _libssh2_store_u32(&p, failure_code);\n    _libssh2_store_str(&p, X11FwdUnAvil, sizeof(X11FwdUnAvil) - 1);\n    _libssh2_htonu32(p, 0);\n\n    rc = _libssh2_transport_send(session, x11open_state->packet, packet_len,\n                                 NULL, 0);\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    }\n    else if(rc) {\n        x11open_state->state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc, \"Unable to send open failure\");\n    }\n    x11open_state->state = libssh2_NB_state_idle;\n    return 0;\n}\n\n/*\n * _libssh2_packet_add\n *\n * Create a new packet and attach it to the brigade. Called from the transport\n * layer when it has received a packet.\n *\n * The input pointer 'data' is pointing to allocated data that this function\n * is asked to deal with so on failure OR success, it must be freed fine.\n * The only exception is when the return code is LIBSSH2_ERROR_EAGAIN.\n *\n * This function will always be called with 'datalen' greater than zero.\n */\nint\n_libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data,\n                    size_t datalen, int macstate)\n{\n    int rc = 0;\n    char *message = NULL;\n    char *language = NULL;\n    size_t message_len = 0;\n    size_t language_len = 0;\n    LIBSSH2_CHANNEL *channelp = NULL;\n    size_t data_head = 0;\n    unsigned char msg = data[0];\n\n    switch(session->packAdd_state) {\n    case libssh2_NB_state_idle:\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                       \"Packet type %d received, length=%d\",\n                       (int) msg, (int) datalen);\n\n        if((macstate == LIBSSH2_MAC_INVALID) &&\n            (!session->macerror ||\n             LIBSSH2_MACERROR(session, (char *) data, datalen))) {\n            /* Bad MAC input, but no callback set or non-zero return from the\n               callback */\n\n            LIBSSH2_FREE(session, data);\n            return _libssh2_error(session, LIBSSH2_ERROR_INVALID_MAC,\n                                  \"Invalid MAC received\");\n        }\n        session->packAdd_state = libssh2_NB_state_allocated;\n        break;\n    case libssh2_NB_state_jump1:\n        goto libssh2_packet_add_jump_point1;\n    case libssh2_NB_state_jump2:\n        goto libssh2_packet_add_jump_point2;\n    case libssh2_NB_state_jump3:\n        goto libssh2_packet_add_jump_point3;\n    case libssh2_NB_state_jump4:\n        goto libssh2_packet_add_jump_point4;\n    case libssh2_NB_state_jump5:\n        goto libssh2_packet_add_jump_point5;\n    default: /* nothing to do */\n        break;\n    }\n\n    if(session->packAdd_state == libssh2_NB_state_allocated) {\n        /* A couple exceptions to the packet adding rule: */\n        switch(msg) {\n\n            /*\n              byte      SSH_MSG_DISCONNECT\n              uint32    reason code\n              string    description in ISO-10646 UTF-8 encoding [RFC3629]\n              string    language tag [RFC3066]\n            */\n\n        case SSH_MSG_DISCONNECT:\n            if(datalen >= 5) {\n                size_t reason = _libssh2_ntohu32(data + 1);\n\n                if(datalen >= 9) {\n                    message_len = _libssh2_ntohu32(data + 5);\n\n                    if(message_len < datalen-13) {\n                        /* 9 = packet_type(1) + reason(4) + message_len(4) */\n                        message = (char *) data + 9;\n\n                        language_len =\n                            _libssh2_ntohu32(data + 9 + message_len);\n                        language = (char *) data + 9 + message_len + 4;\n\n                        if(language_len > (datalen-13-message_len)) {\n                            /* bad input, clear info */\n                            language = message = NULL;\n                            language_len = message_len = 0;\n                        }\n                    }\n                    else\n                        /* bad size, clear it */\n                        message_len = 0;\n                }\n                if(session->ssh_msg_disconnect) {\n                    LIBSSH2_DISCONNECT(session, reason, message,\n                                       message_len, language, language_len);\n                }\n                _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                               \"Disconnect(%d): %s(%s)\", reason,\n                               message, language);\n            }\n\n            LIBSSH2_FREE(session, data);\n            session->socket_state = LIBSSH2_SOCKET_DISCONNECTED;\n            session->packAdd_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_DISCONNECT,\n                                  \"socket disconnect\");\n            /*\n              byte      SSH_MSG_IGNORE\n              string    data\n            */\n\n        case SSH_MSG_IGNORE:\n            if(datalen >= 2) {\n                if(session->ssh_msg_ignore) {\n                    LIBSSH2_IGNORE(session, (char *) data + 1, datalen - 1);\n                }\n            }\n            else if(session->ssh_msg_ignore) {\n                LIBSSH2_IGNORE(session, \"\", 0);\n            }\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return 0;\n\n            /*\n              byte      SSH_MSG_DEBUG\n              boolean   always_display\n              string    message in ISO-10646 UTF-8 encoding [RFC3629]\n              string    language tag [RFC3066]\n            */\n\n        case SSH_MSG_DEBUG:\n            if(datalen >= 2) {\n                int always_display = data[1];\n\n                if(datalen >= 6) {\n                    message_len = _libssh2_ntohu32(data + 2);\n\n                    if(message_len <= (datalen - 10)) {\n                        /* 6 = packet_type(1) + display(1) + message_len(4) */\n                        message = (char *) data + 6;\n                        language_len = _libssh2_ntohu32(data + 6 +\n                                                        message_len);\n\n                        if(language_len <= (datalen - 10 - message_len))\n                            language = (char *) data + 10 + message_len;\n                    }\n                }\n\n                if(session->ssh_msg_debug) {\n                    LIBSSH2_DEBUG(session, always_display, message,\n                                  message_len, language, language_len);\n                }\n            }\n            /*\n             * _libssh2_debug will actually truncate this for us so\n             * that it's not an inordinate about of data\n             */\n            _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                           \"Debug Packet: %s\", message);\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return 0;\n\n            /*\n              byte      SSH_MSG_GLOBAL_REQUEST\n              string    request name in US-ASCII only\n              boolean   want reply\n              ....      request-specific data follows\n            */\n\n        case SSH_MSG_GLOBAL_REQUEST:\n            if(datalen >= 5) {\n                uint32_t len = 0;\n                unsigned char want_reply = 0;\n                len = _libssh2_ntohu32(data + 1);\n                if(datalen >= (6 + len)) {\n                    want_reply = data[5 + len];\n                    _libssh2_debug(session,\n                                   LIBSSH2_TRACE_CONN,\n                                   \"Received global request type %.*s (wr %X)\",\n                                   len, data + 5, want_reply);\n                }\n\n\n                if(want_reply) {\n                    static const unsigned char packet =\n                        SSH_MSG_REQUEST_FAILURE;\n                  libssh2_packet_add_jump_point5:\n                    session->packAdd_state = libssh2_NB_state_jump5;\n                    rc = _libssh2_transport_send(session, &packet, 1, NULL, 0);\n                    if(rc == LIBSSH2_ERROR_EAGAIN)\n                        return rc;\n                }\n            }\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return 0;\n\n            /*\n              byte      SSH_MSG_CHANNEL_EXTENDED_DATA\n              uint32    recipient channel\n              uint32    data_type_code\n              string    data\n            */\n\n        case SSH_MSG_CHANNEL_EXTENDED_DATA:\n            /* streamid(4) */\n            data_head += 4;\n\n            /* fall-through */\n\n            /*\n              byte      SSH_MSG_CHANNEL_DATA\n              uint32    recipient channel\n              string    data\n            */\n\n        case SSH_MSG_CHANNEL_DATA:\n            /* packet_type(1) + channelno(4) + datalen(4) */\n            data_head += 9;\n\n            if(datalen >= data_head)\n                channelp =\n                    _libssh2_channel_locate(session,\n                                            _libssh2_ntohu32(data + 1));\n\n            if(!channelp) {\n                _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_UNKNOWN,\n                               \"Packet received for unknown channel\");\n                LIBSSH2_FREE(session, data);\n                session->packAdd_state = libssh2_NB_state_idle;\n                return 0;\n            }\n#ifdef LIBSSH2DEBUG\n            {\n                uint32_t stream_id = 0;\n                if(msg == SSH_MSG_CHANNEL_EXTENDED_DATA)\n                    stream_id = _libssh2_ntohu32(data + 5);\n\n                _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                               \"%d bytes packet_add() for %lu/%lu/%lu\",\n                               (int) (datalen - data_head),\n                               channelp->local.id,\n                               channelp->remote.id,\n                               stream_id);\n            }\n#endif\n            if((channelp->remote.extended_data_ignore_mode ==\n                 LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE) &&\n                (msg == SSH_MSG_CHANNEL_EXTENDED_DATA)) {\n                /* Pretend we didn't receive this */\n                LIBSSH2_FREE(session, data);\n\n                _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                               \"Ignoring extended data and refunding %d bytes\",\n                               (int) (datalen - 13));\n                if(channelp->read_avail + datalen - data_head >=\n                    channelp->remote.window_size)\n                    datalen = channelp->remote.window_size -\n                        channelp->read_avail + data_head;\n\n                channelp->remote.window_size -= datalen - data_head;\n                _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                               \"shrinking window size by %lu bytes to %lu, \"\n                               \"read_avail %lu\",\n                               datalen - data_head,\n                               channelp->remote.window_size,\n                               channelp->read_avail);\n\n                session->packAdd_channelp = channelp;\n\n                /* Adjust the window based on the block we just freed */\n              libssh2_packet_add_jump_point1:\n                session->packAdd_state = libssh2_NB_state_jump1;\n                rc = _libssh2_channel_receive_window_adjust(session->\n                                                            packAdd_channelp,\n                                                            datalen - 13,\n                                                            1, NULL);\n                if(rc == LIBSSH2_ERROR_EAGAIN)\n                    return rc;\n\n                session->packAdd_state = libssh2_NB_state_idle;\n                return 0;\n            }\n\n            /*\n             * REMEMBER! remote means remote as source of data,\n             * NOT remote window!\n             */\n            if(channelp->remote.packet_size < (datalen - data_head)) {\n                /*\n                 * Spec says we MAY ignore bytes sent beyond\n                 * packet_size\n                 */\n                _libssh2_error(session,\n                               LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED,\n                               \"Packet contains more data than we offered\"\n                               \" to receive, truncating\");\n                datalen = channelp->remote.packet_size + data_head;\n            }\n            if(channelp->remote.window_size <= channelp->read_avail) {\n                /*\n                 * Spec says we MAY ignore bytes sent beyond\n                 * window_size\n                 */\n                _libssh2_error(session,\n                               LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED,\n                               \"The current receive window is full,\"\n                               \" data ignored\");\n                LIBSSH2_FREE(session, data);\n                session->packAdd_state = libssh2_NB_state_idle;\n                return 0;\n            }\n            /* Reset EOF status */\n            channelp->remote.eof = 0;\n\n            if(channelp->read_avail + datalen - data_head >\n                channelp->remote.window_size) {\n                _libssh2_error(session,\n                               LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED,\n                               \"Remote sent more data than current \"\n                               \"window allows, truncating\");\n                datalen = channelp->remote.window_size -\n                    channelp->read_avail + data_head;\n            }\n\n            /* Update the read_avail counter. The window size will be\n             * updated once the data is actually read from the queue\n             * from an upper layer */\n            channelp->read_avail += datalen - data_head;\n\n            _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                           \"increasing read_avail by %lu bytes to %lu/%lu\",\n                           (long)(datalen - data_head),\n                           (long)channelp->read_avail,\n                           (long)channelp->remote.window_size);\n\n            break;\n\n            /*\n              byte      SSH_MSG_CHANNEL_EOF\n              uint32    recipient channel\n            */\n\n        case SSH_MSG_CHANNEL_EOF:\n            if(datalen >= 5)\n                channelp =\n                    _libssh2_channel_locate(session,\n                                            _libssh2_ntohu32(data + 1));\n            if(!channelp)\n                /* We may have freed already, just quietly ignore this... */\n                ;\n            else {\n                _libssh2_debug(session,\n                               LIBSSH2_TRACE_CONN,\n                               \"EOF received for channel %lu/%lu\",\n                               channelp->local.id,\n                               channelp->remote.id);\n                channelp->remote.eof = 1;\n            }\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return 0;\n\n            /*\n              byte      SSH_MSG_CHANNEL_REQUEST\n              uint32    recipient channel\n              string    request type in US-ASCII characters only\n              boolean   want reply\n              ....      type-specific data follows\n            */\n\n        case SSH_MSG_CHANNEL_REQUEST:\n            if(datalen >= 9) {\n                uint32_t channel = _libssh2_ntohu32(data + 1);\n                uint32_t len = _libssh2_ntohu32(data + 5);\n                unsigned char want_reply = 1;\n\n                if((len + 9) < datalen)\n                    want_reply = data[len + 9];\n\n                _libssh2_debug(session,\n                               LIBSSH2_TRACE_CONN,\n                               \"Channel %d received request type %.*s (wr %X)\",\n                               channel, len, data + 9, want_reply);\n\n                if(len == sizeof(\"exit-status\") - 1\n                    && (sizeof(\"exit-status\") - 1 + 9) <= datalen\n                    && !memcmp(\"exit-status\", data + 9,\n                               sizeof(\"exit-status\") - 1)) {\n\n                    /* we've got \"exit-status\" packet. Set the session value */\n                    if(datalen >= 20)\n                        channelp =\n                            _libssh2_channel_locate(session, channel);\n\n                    if(channelp && (sizeof(\"exit-status\") + 13) <= datalen) {\n                        channelp->exit_status =\n                            _libssh2_ntohu32(data + 9 + sizeof(\"exit-status\"));\n                        _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                                       \"Exit status %lu received for \"\n                                       \"channel %lu/%lu\",\n                                       channelp->exit_status,\n                                       channelp->local.id,\n                                       channelp->remote.id);\n                    }\n\n                }\n                else if(len == sizeof(\"exit-signal\") - 1\n                         && (sizeof(\"exit-signal\") - 1 + 9) <= datalen\n                         && !memcmp(\"exit-signal\", data + 9,\n                                    sizeof(\"exit-signal\") - 1)) {\n                    /* command terminated due to signal */\n                    if(datalen >= 20)\n                        channelp = _libssh2_channel_locate(session, channel);\n\n                    if(channelp && (sizeof(\"exit-signal\") + 13) <= datalen) {\n                        /* set signal name (without SIG prefix) */\n                        uint32_t namelen =\n                            _libssh2_ntohu32(data + 9 + sizeof(\"exit-signal\"));\n\n                        if(namelen <= UINT_MAX - 1) {\n                            channelp->exit_signal =\n                                LIBSSH2_ALLOC(session, namelen + 1);\n                        }\n                        else {\n                            channelp->exit_signal = NULL;\n                        }\n\n                        if(!channelp->exit_signal)\n                            rc = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                                \"memory for signal name\");\n                        else if((sizeof(\"exit-signal\") + 13 + namelen <=\n                                 datalen)) {\n                            memcpy(channelp->exit_signal,\n                                   data + 13 + sizeof(\"exit-signal\"), namelen);\n                            channelp->exit_signal[namelen] = '\\0';\n                            /* TODO: save error message and language tag */\n                            _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                                           \"Exit signal %s received for \"\n                                           \"channel %lu/%lu\",\n                                           channelp->exit_signal,\n                                           channelp->local.id,\n                                           channelp->remote.id);\n                        }\n                    }\n                }\n\n\n                if(want_reply) {\n                    unsigned char packet[5];\n                  libssh2_packet_add_jump_point4:\n                    session->packAdd_state = libssh2_NB_state_jump4;\n                    packet[0] = SSH_MSG_CHANNEL_FAILURE;\n                    memcpy(&packet[1], data + 1, 4);\n                    rc = _libssh2_transport_send(session, packet, 5, NULL, 0);\n                    if(rc == LIBSSH2_ERROR_EAGAIN)\n                        return rc;\n                }\n            }\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return rc;\n\n            /*\n              byte      SSH_MSG_CHANNEL_CLOSE\n              uint32    recipient channel\n            */\n\n        case SSH_MSG_CHANNEL_CLOSE:\n            if(datalen >= 5)\n                channelp =\n                    _libssh2_channel_locate(session,\n                                            _libssh2_ntohu32(data + 1));\n            if(!channelp) {\n                /* We may have freed already, just quietly ignore this... */\n                LIBSSH2_FREE(session, data);\n                session->packAdd_state = libssh2_NB_state_idle;\n                return 0;\n            }\n            _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                           \"Close received for channel %lu/%lu\",\n                           channelp->local.id,\n                           channelp->remote.id);\n\n            channelp->remote.close = 1;\n            channelp->remote.eof = 1;\n\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return 0;\n\n            /*\n              byte      SSH_MSG_CHANNEL_OPEN\n              string    \"session\"\n              uint32    sender channel\n              uint32    initial window size\n              uint32    maximum packet size\n            */\n\n        case SSH_MSG_CHANNEL_OPEN:\n            if(datalen < 17)\n                ;\n            else if((datalen >= (sizeof(\"forwarded-tcpip\") + 4)) &&\n                     ((sizeof(\"forwarded-tcpip\") - 1) ==\n                      _libssh2_ntohu32(data + 1))\n                     &&\n                     (memcmp(data + 5, \"forwarded-tcpip\",\n                             sizeof(\"forwarded-tcpip\") - 1) == 0)) {\n\n                /* init the state struct */\n                memset(&session->packAdd_Qlstn_state, 0,\n                       sizeof(session->packAdd_Qlstn_state));\n\n              libssh2_packet_add_jump_point2:\n                session->packAdd_state = libssh2_NB_state_jump2;\n                rc = packet_queue_listener(session, data, datalen,\n                                           &session->packAdd_Qlstn_state);\n            }\n            else if((datalen >= (sizeof(\"x11\") + 4)) &&\n                     ((sizeof(\"x11\") - 1) == _libssh2_ntohu32(data + 1)) &&\n                     (memcmp(data + 5, \"x11\", sizeof(\"x11\") - 1) == 0)) {\n\n                /* init the state struct */\n                memset(&session->packAdd_x11open_state, 0,\n                       sizeof(session->packAdd_x11open_state));\n\n              libssh2_packet_add_jump_point3:\n                session->packAdd_state = libssh2_NB_state_jump3;\n                rc = packet_x11_open(session, data, datalen,\n                                     &session->packAdd_x11open_state);\n            }\n            if(rc == LIBSSH2_ERROR_EAGAIN)\n                return rc;\n\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return rc;\n\n            /*\n              byte      SSH_MSG_CHANNEL_WINDOW_ADJUST\n              uint32    recipient channel\n              uint32    bytes to add\n            */\n        case SSH_MSG_CHANNEL_WINDOW_ADJUST:\n            if(datalen < 9)\n                ;\n            else {\n                uint32_t bytestoadd = _libssh2_ntohu32(data + 5);\n                channelp =\n                    _libssh2_channel_locate(session,\n                                            _libssh2_ntohu32(data + 1));\n                if(channelp) {\n                    channelp->local.window_size += bytestoadd;\n\n                    _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                                   \"Window adjust for channel %lu/%lu, \"\n                                   \"adding %lu bytes, new window_size=%lu\",\n                                   channelp->local.id,\n                                   channelp->remote.id,\n                                   bytestoadd,\n                                   channelp->local.window_size);\n                }\n            }\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return 0;\n        default:\n            break;\n        }\n\n        session->packAdd_state = libssh2_NB_state_sent;\n    }\n\n    if(session->packAdd_state == libssh2_NB_state_sent) {\n        LIBSSH2_PACKET *packetp =\n            LIBSSH2_ALLOC(session, sizeof(LIBSSH2_PACKET));\n        if(!packetp) {\n            _libssh2_debug(session, LIBSSH2_ERROR_ALLOC,\n                           \"memory for packet\");\n            LIBSSH2_FREE(session, data);\n            session->packAdd_state = libssh2_NB_state_idle;\n            return LIBSSH2_ERROR_ALLOC;\n        }\n        packetp->data = data;\n        packetp->data_len = datalen;\n        packetp->data_head = data_head;\n\n        _libssh2_list_add(&session->packets, &packetp->node);\n\n        session->packAdd_state = libssh2_NB_state_sent1;\n    }\n\n    if((msg == SSH_MSG_KEXINIT &&\n         !(session->state & LIBSSH2_STATE_EXCHANGING_KEYS)) ||\n        (session->packAdd_state == libssh2_NB_state_sent2)) {\n        if(session->packAdd_state == libssh2_NB_state_sent1) {\n            /*\n             * Remote wants new keys\n             * Well, it's already in the brigade,\n             * let's just call back into ourselves\n             */\n            _libssh2_debug(session, LIBSSH2_TRACE_TRANS, \"Renegotiating Keys\");\n\n            session->packAdd_state = libssh2_NB_state_sent2;\n        }\n\n        /*\n         * The KEXINIT message has been added to the queue.  The packAdd and\n         * readPack states need to be reset because _libssh2_kex_exchange\n         * (eventually) calls upon _libssh2_transport_read to read the rest of\n         * the key exchange conversation.\n         */\n        session->readPack_state = libssh2_NB_state_idle;\n        session->packet.total_num = 0;\n        session->packAdd_state = libssh2_NB_state_idle;\n        session->fullpacket_state = libssh2_NB_state_idle;\n\n        memset(&session->startup_key_state, 0, sizeof(key_exchange_state_t));\n\n        /*\n         * If there was a key reexchange failure, let's just hope we didn't\n         * send NEWKEYS yet, otherwise remote will drop us like a rock\n         */\n        rc = _libssh2_kex_exchange(session, 1, &session->startup_key_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN)\n            return rc;\n    }\n\n    session->packAdd_state = libssh2_NB_state_idle;\n    return 0;\n}\n\n/*\n * _libssh2_packet_ask\n *\n * Scan the brigade for a matching packet type, optionally poll the socket for\n * a packet first\n */\nint\n_libssh2_packet_ask(LIBSSH2_SESSION * session, unsigned char packet_type,\n                    unsigned char **data, size_t *data_len,\n                    int match_ofs, const unsigned char *match_buf,\n                    size_t match_len)\n{\n    LIBSSH2_PACKET *packet = _libssh2_list_first(&session->packets);\n\n    _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                   \"Looking for packet of type: %d\", (int) packet_type);\n\n    while(packet) {\n        if(packet->data[0] == packet_type\n            && (packet->data_len >= (match_ofs + match_len))\n            && (!match_buf ||\n                (memcmp(packet->data + match_ofs, match_buf,\n                        match_len) == 0))) {\n            *data = packet->data;\n            *data_len = packet->data_len;\n\n            /* unlink struct from session->packets */\n            _libssh2_list_remove(&packet->node);\n\n            LIBSSH2_FREE(session, packet);\n\n            return 0;\n        }\n        packet = _libssh2_list_next(&packet->node);\n    }\n    return -1;\n}\n\n/*\n * libssh2_packet_askv\n *\n * Scan for any of a list of packet types in the brigade, optionally poll the\n * socket for a packet first\n */\nint\n_libssh2_packet_askv(LIBSSH2_SESSION * session,\n                     const unsigned char *packet_types,\n                     unsigned char **data, size_t *data_len,\n                     int match_ofs,\n                     const unsigned char *match_buf,\n                     size_t match_len)\n{\n    int i, packet_types_len = strlen((char *) packet_types);\n\n    for(i = 0; i < packet_types_len; i++) {\n        if(0 == _libssh2_packet_ask(session, packet_types[i], data,\n                                     data_len, match_ofs,\n                                     match_buf, match_len)) {\n            return 0;\n        }\n    }\n\n    return -1;\n}\n\n/*\n * _libssh2_packet_require\n *\n * Loops _libssh2_transport_read() until the packet requested is available\n * SSH_DISCONNECT or a SOCKET_DISCONNECTED will cause a bailout\n *\n * Returns negative on error\n * Returns 0 when it has taken care of the requested packet.\n */\nint\n_libssh2_packet_require(LIBSSH2_SESSION * session, unsigned char packet_type,\n                        unsigned char **data, size_t *data_len,\n                        int match_ofs,\n                        const unsigned char *match_buf,\n                        size_t match_len,\n                        packet_require_state_t *state)\n{\n    if(state->start == 0) {\n        if(_libssh2_packet_ask(session, packet_type, data, data_len,\n                                match_ofs, match_buf,\n                                match_len) == 0) {\n            /* A packet was available in the packet brigade */\n            return 0;\n        }\n\n        state->start = time(NULL);\n    }\n\n    while(session->socket_state == LIBSSH2_SOCKET_CONNECTED) {\n        int ret = _libssh2_transport_read(session);\n        if(ret == LIBSSH2_ERROR_EAGAIN)\n            return ret;\n        else if(ret < 0) {\n            state->start = 0;\n            /* an error which is not just because of blocking */\n            return ret;\n        }\n        else if(ret == packet_type) {\n            /* Be lazy, let packet_ask pull it out of the brigade */\n            ret = _libssh2_packet_ask(session, packet_type, data, data_len,\n                                      match_ofs, match_buf, match_len);\n            state->start = 0;\n            return ret;\n        }\n        else if(ret == 0) {\n            /* nothing available, wait until data arrives or we time out */\n            long left = LIBSSH2_READ_TIMEOUT - (long)(time(NULL) -\n                                                      state->start);\n\n            if(left <= 0) {\n                state->start = 0;\n                return LIBSSH2_ERROR_TIMEOUT;\n            }\n            return -1; /* no packet available yet */\n        }\n    }\n\n    /* Only reached if the socket died */\n    return LIBSSH2_ERROR_SOCKET_DISCONNECT;\n}\n\n/*\n * _libssh2_packet_burn\n *\n * Loops _libssh2_transport_read() until any packet is available and promptly\n * discards it.\n * Used during KEX exchange to discard badly guessed KEX_INIT packets\n */\nint\n_libssh2_packet_burn(LIBSSH2_SESSION * session,\n                     libssh2_nonblocking_states * state)\n{\n    unsigned char *data;\n    size_t data_len;\n    unsigned char i, all_packets[255];\n    int ret;\n\n    if(*state == libssh2_NB_state_idle) {\n        for(i = 1; i < 255; i++) {\n            all_packets[i - 1] = i;\n        }\n        all_packets[254] = 0;\n\n        if(_libssh2_packet_askv(session, all_packets, &data, &data_len, 0,\n                                 NULL, 0) == 0) {\n            i = data[0];\n            /* A packet was available in the packet brigade, burn it */\n            LIBSSH2_FREE(session, data);\n            return i;\n        }\n\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                       \"Blocking until packet becomes available to burn\");\n        *state = libssh2_NB_state_created;\n    }\n\n    while(session->socket_state == LIBSSH2_SOCKET_CONNECTED) {\n        ret = _libssh2_transport_read(session);\n        if(ret == LIBSSH2_ERROR_EAGAIN) {\n            return ret;\n        }\n        else if(ret < 0) {\n            *state = libssh2_NB_state_idle;\n            return ret;\n        }\n        else if(ret == 0) {\n            /* FIXME: this might busyloop */\n            continue;\n        }\n\n        /* Be lazy, let packet_ask pull it out of the brigade */\n        if(0 ==\n            _libssh2_packet_ask(session, (unsigned char)ret,\n                                         &data, &data_len, 0, NULL, 0)) {\n            /* Smoke 'em if you got 'em */\n            LIBSSH2_FREE(session, data);\n            *state = libssh2_NB_state_idle;\n            return ret;\n        }\n    }\n\n    /* Only reached if the socket died */\n    return LIBSSH2_ERROR_SOCKET_DISCONNECT;\n}\n\n/*\n * _libssh2_packet_requirev\n *\n * Loops _libssh2_transport_read() until one of a list of packet types\n * requested is available. SSH_DISCONNECT or a SOCKET_DISCONNECTED will cause\n * a bailout. packet_types is a null terminated list of packet_type numbers\n */\n\nint\n_libssh2_packet_requirev(LIBSSH2_SESSION *session,\n                         const unsigned char *packet_types,\n                         unsigned char **data, size_t *data_len,\n                         int match_ofs,\n                         const unsigned char *match_buf, size_t match_len,\n                         packet_requirev_state_t * state)\n{\n    if(_libssh2_packet_askv(session, packet_types, data, data_len, match_ofs,\n                             match_buf, match_len) == 0) {\n        /* One of the packets listed was available in the packet brigade */\n        state->start = 0;\n        return 0;\n    }\n\n    if(state->start == 0) {\n        state->start = time(NULL);\n    }\n\n    while(session->socket_state != LIBSSH2_SOCKET_DISCONNECTED) {\n        int ret = _libssh2_transport_read(session);\n        if((ret < 0) && (ret != LIBSSH2_ERROR_EAGAIN)) {\n            state->start = 0;\n            return ret;\n        }\n        if(ret <= 0) {\n            long left = LIBSSH2_READ_TIMEOUT -\n                (long)(time(NULL) - state->start);\n\n            if(left <= 0) {\n                state->start = 0;\n                return LIBSSH2_ERROR_TIMEOUT;\n            }\n            else if(ret == LIBSSH2_ERROR_EAGAIN) {\n                return ret;\n            }\n        }\n\n        if(strchr((char *) packet_types, ret)) {\n            /* Be lazy, let packet_ask pull it out of the brigade */\n            return _libssh2_packet_askv(session, packet_types, data,\n                                        data_len, match_ofs, match_buf,\n                                        match_len);\n        }\n    }\n\n    /* Only reached if the socket died */\n    state->start = 0;\n    return LIBSSH2_ERROR_SOCKET_DISCONNECT;\n}\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/packet.h",
    "content": "#ifndef LIBSSH2_PACKET_H\n#define LIBSSH2_PACKET_H\n/*\n * Copyright (C) 2010 by Daniel Stenberg\n * Author: Daniel Stenberg <daniel@haxx.se>\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n */\n\nint _libssh2_packet_read(LIBSSH2_SESSION * session);\n\nint _libssh2_packet_ask(LIBSSH2_SESSION * session, unsigned char packet_type,\n                        unsigned char **data, size_t *data_len,\n                        int match_ofs,\n                        const unsigned char *match_buf,\n                        size_t match_len);\n\nint _libssh2_packet_askv(LIBSSH2_SESSION * session,\n                         const unsigned char *packet_types,\n                         unsigned char **data, size_t *data_len,\n                         int match_ofs,\n                         const unsigned char *match_buf,\n                         size_t match_len);\nint _libssh2_packet_require(LIBSSH2_SESSION * session,\n                            unsigned char packet_type, unsigned char **data,\n                            size_t *data_len, int match_ofs,\n                            const unsigned char *match_buf,\n                            size_t match_len,\n                            packet_require_state_t * state);\nint _libssh2_packet_requirev(LIBSSH2_SESSION *session,\n                             const unsigned char *packet_types,\n                             unsigned char **data, size_t *data_len,\n                             int match_ofs,\n                             const unsigned char *match_buf,\n                             size_t match_len,\n                             packet_requirev_state_t * state);\nint _libssh2_packet_burn(LIBSSH2_SESSION * session,\n                         libssh2_nonblocking_states * state);\nint _libssh2_packet_write(LIBSSH2_SESSION * session, unsigned char *data,\n                          unsigned long data_len);\nint _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data,\n                        size_t datalen, int macstate);\n\n#endif /* LIBSSH2_PACKET_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/pem.c",
    "content": "/* Copyright (C) 2007 The Written Word, Inc.\n * Copyright (C) 2008, Simon Josefsson\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\nstatic int\nreadline(char *line, int line_size, FILE * fp)\n{\n    size_t len;\n\n    if(!line) {\n        return -1;\n    }\n    if(!fgets(line, line_size, fp)) {\n        return -1;\n    }\n\n    if(*line) {\n        len = strlen(line);\n        if(len > 0 && line[len - 1] == '\\n') {\n            line[len - 1] = '\\0';\n        }\n    }\n\n    if(*line) {\n        len = strlen(line);\n        if(len > 0 && line[len - 1] == '\\r') {\n            line[len - 1] = '\\0';\n        }\n    }\n\n    return 0;\n}\n\nstatic int\nreadline_memory(char *line, size_t line_size,\n                const char *filedata, size_t filedata_len,\n                size_t *filedata_offset)\n{\n    size_t off, len;\n\n    off = *filedata_offset;\n\n    for(len = 0; off + len < filedata_len && len < line_size - 1; len++) {\n        if(filedata[off + len] == '\\n' ||\n            filedata[off + len] == '\\r') {\n                break;\n        }\n    }\n\n    if(len) {\n        memcpy(line, filedata + off, len);\n        *filedata_offset += len;\n    }\n\n    line[len] = '\\0';\n    *filedata_offset += 1;\n\n    return 0;\n}\n\n#define LINE_SIZE 128\n\nstatic const char *crypt_annotation = \"Proc-Type: 4,ENCRYPTED\";\n\nstatic unsigned char hex_decode(char digit)\n{\n    return (digit >= 'A') ? 0xA + (digit - 'A') : (digit - '0');\n}\n\nint\n_libssh2_pem_parse(LIBSSH2_SESSION * session,\n                   const char *headerbegin,\n                   const char *headerend,\n                   const unsigned char *passphrase,\n                   FILE * fp, unsigned char **data, unsigned int *datalen)\n{\n    char line[LINE_SIZE];\n    unsigned char iv[LINE_SIZE];\n    char *b64data = NULL;\n    unsigned int b64datalen = 0;\n    int ret;\n    const LIBSSH2_CRYPT_METHOD *method = NULL;\n\n    do {\n        *line = '\\0';\n\n        if(readline(line, LINE_SIZE, fp)) {\n            return -1;\n        }\n    }\n    while(strcmp(line, headerbegin) != 0);\n\n    if(readline(line, LINE_SIZE, fp)) {\n        return -1;\n    }\n\n    if(passphrase &&\n            memcmp(line, crypt_annotation, strlen(crypt_annotation)) == 0) {\n        const LIBSSH2_CRYPT_METHOD **all_methods, *cur_method;\n        int i;\n\n        if(readline(line, LINE_SIZE, fp)) {\n            ret = -1;\n            goto out;\n        }\n\n        all_methods = libssh2_crypt_methods();\n        while((cur_method = *all_methods++)) {\n            if(*cur_method->pem_annotation &&\n                    memcmp(line, cur_method->pem_annotation,\n                           strlen(cur_method->pem_annotation)) == 0) {\n                method = cur_method;\n                memcpy(iv, line + strlen(method->pem_annotation) + 1,\n                       2*method->iv_len);\n            }\n        }\n\n        /* None of the available crypt methods were able to decrypt the key */\n        if(method == NULL)\n            return -1;\n\n        /* Decode IV from hex */\n        for(i = 0; i < method->iv_len; ++i) {\n            iv[i]  = hex_decode(iv[2*i]) << 4;\n            iv[i] |= hex_decode(iv[2*i + 1]);\n        }\n\n        /* skip to the next line */\n        if(readline(line, LINE_SIZE, fp)) {\n            ret = -1;\n            goto out;\n        }\n    }\n\n    do {\n        if(*line) {\n            char *tmp;\n            size_t linelen;\n\n            linelen = strlen(line);\n            tmp = LIBSSH2_REALLOC(session, b64data, b64datalen + linelen);\n            if(!tmp) {\n                ret = -1;\n                goto out;\n            }\n            memcpy(tmp + b64datalen, line, linelen);\n            b64data = tmp;\n            b64datalen += linelen;\n        }\n\n        *line = '\\0';\n\n        if(readline(line, LINE_SIZE, fp)) {\n            ret = -1;\n            goto out;\n        }\n    } while(strcmp(line, headerend) != 0);\n\n    if(!b64data) {\n        return -1;\n    }\n\n    if(libssh2_base64_decode(session, (char **) data, datalen,\n                              b64data, b64datalen)) {\n        ret = -1;\n        goto out;\n    }\n\n    if(method) {\n        /* Set up decryption */\n        int free_iv = 0, free_secret = 0, len_decrypted = 0, padding = 0;\n        int blocksize = method->blocksize;\n        void *abstract;\n        unsigned char secret[2*MD5_DIGEST_LENGTH];\n        libssh2_md5_ctx fingerprint_ctx;\n\n        /* Perform key derivation (PBKDF1/MD5) */\n        if(!libssh2_md5_init(&fingerprint_ctx)) {\n            ret = -1;\n            goto out;\n        }\n        libssh2_md5_update(fingerprint_ctx, passphrase,\n                           strlen((char *)passphrase));\n        libssh2_md5_update(fingerprint_ctx, iv, 8);\n        libssh2_md5_final(fingerprint_ctx, secret);\n        if(method->secret_len > MD5_DIGEST_LENGTH) {\n            if(!libssh2_md5_init(&fingerprint_ctx)) {\n                ret = -1;\n                goto out;\n            }\n            libssh2_md5_update(fingerprint_ctx, secret, MD5_DIGEST_LENGTH);\n            libssh2_md5_update(fingerprint_ctx, passphrase,\n                               strlen((char *)passphrase));\n            libssh2_md5_update(fingerprint_ctx, iv, 8);\n            libssh2_md5_final(fingerprint_ctx, secret + MD5_DIGEST_LENGTH);\n        }\n\n        /* Initialize the decryption */\n        if(method->init(session, method, iv, &free_iv, secret,\n                         &free_secret, 0, &abstract)) {\n            _libssh2_explicit_zero((char *)secret, sizeof(secret));\n            LIBSSH2_FREE(session, data);\n            ret = -1;\n            goto out;\n        }\n\n        if(free_secret) {\n            _libssh2_explicit_zero((char *)secret, sizeof(secret));\n        }\n\n        /* Do the actual decryption */\n        if((*datalen % blocksize) != 0) {\n            _libssh2_explicit_zero((char *)secret, sizeof(secret));\n            method->dtor(session, &abstract);\n            _libssh2_explicit_zero(*data, *datalen);\n            LIBSSH2_FREE(session, *data);\n            ret = -1;\n            goto out;\n        }\n\n        while(len_decrypted <= (int)*datalen - blocksize) {\n            if(method->crypt(session, *data + len_decrypted, blocksize,\n                              &abstract)) {\n                ret = LIBSSH2_ERROR_DECRYPT;\n                _libssh2_explicit_zero((char *)secret, sizeof(secret));\n                method->dtor(session, &abstract);\n                _libssh2_explicit_zero(*data, *datalen);\n                LIBSSH2_FREE(session, *data);\n                goto out;\n            }\n\n            len_decrypted += blocksize;\n        }\n\n        /* Account for padding */\n        padding = (*data)[*datalen - 1];\n        memset(&(*data)[*datalen-padding], 0, padding);\n        *datalen -= padding;\n\n        /* Clean up */\n        _libssh2_explicit_zero((char *)secret, sizeof(secret));\n        method->dtor(session, &abstract);\n    }\n\n    ret = 0;\n  out:\n    if(b64data) {\n        _libssh2_explicit_zero(b64data, b64datalen);\n        LIBSSH2_FREE(session, b64data);\n    }\n    return ret;\n}\n\nint\n_libssh2_pem_parse_memory(LIBSSH2_SESSION * session,\n                          const char *headerbegin,\n                          const char *headerend,\n                          const char *filedata, size_t filedata_len,\n                          unsigned char **data, unsigned int *datalen)\n{\n    char line[LINE_SIZE];\n    char *b64data = NULL;\n    unsigned int b64datalen = 0;\n    size_t off = 0;\n    int ret;\n\n    do {\n        *line = '\\0';\n\n        if(readline_memory(line, LINE_SIZE, filedata, filedata_len, &off)) {\n            return -1;\n        }\n    }\n    while(strcmp(line, headerbegin) != 0);\n\n    *line = '\\0';\n\n    do {\n        if(*line) {\n            char *tmp;\n            size_t linelen;\n\n            linelen = strlen(line);\n            tmp = LIBSSH2_REALLOC(session, b64data, b64datalen + linelen);\n            if(!tmp) {\n                ret = -1;\n                goto out;\n            }\n            memcpy(tmp + b64datalen, line, linelen);\n            b64data = tmp;\n            b64datalen += linelen;\n        }\n\n        *line = '\\0';\n\n        if(readline_memory(line, LINE_SIZE, filedata, filedata_len, &off)) {\n            ret = -1;\n            goto out;\n        }\n    } while(strcmp(line, headerend) != 0);\n\n    if(!b64data) {\n        return -1;\n    }\n\n    if(libssh2_base64_decode(session, (char **) data, datalen,\n                              b64data, b64datalen)) {\n        ret = -1;\n        goto out;\n    }\n\n    ret = 0;\n  out:\n    if(b64data) {\n        _libssh2_explicit_zero(b64data, b64datalen);\n        LIBSSH2_FREE(session, b64data);\n    }\n    return ret;\n}\n\n/* OpenSSH formatted keys */\n#define AUTH_MAGIC \"openssh-key-v1\"\n#define OPENSSH_HEADER_BEGIN \"-----BEGIN OPENSSH PRIVATE KEY-----\"\n#define OPENSSH_HEADER_END \"-----END OPENSSH PRIVATE KEY-----\"\n\nstatic int\n_libssh2_openssh_pem_parse_data(LIBSSH2_SESSION * session,\n                                const unsigned char *passphrase,\n                                const char *b64data, size_t b64datalen,\n                                struct string_buf **decrypted_buf)\n{\n    const LIBSSH2_CRYPT_METHOD *method = NULL;\n    struct string_buf decoded, decrypted, kdf_buf;\n    unsigned char *ciphername = NULL;\n    unsigned char *kdfname = NULL;\n    unsigned char *kdf = NULL;\n    unsigned char *buf = NULL;\n    unsigned char *salt = NULL;\n    uint32_t nkeys, check1, check2;\n    uint32_t rounds = 0;\n    unsigned char *key = NULL;\n    unsigned char *key_part = NULL;\n    unsigned char *iv_part = NULL;\n    unsigned char *f = NULL;\n    unsigned int f_len = 0;\n    int ret = 0, keylen = 0, ivlen = 0, total_len = 0;\n    size_t kdf_len = 0, tmp_len = 0, salt_len = 0;\n\n    if(decrypted_buf)\n        *decrypted_buf = NULL;\n\n    /* decode file */\n    if(libssh2_base64_decode(session, (char **)&f, &f_len,\n                             b64data, b64datalen)) {\n       ret = -1;\n       goto out;\n    }\n\n    /* Parse the file */\n    decoded.data = (unsigned char *)f;\n    decoded.dataptr = (unsigned char *)f;\n    decoded.len = f_len;\n\n    if(decoded.len < strlen(AUTH_MAGIC)) {\n        ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, \"key too short\");\n        goto out;\n    }\n\n    if(strncmp((char *) decoded.dataptr, AUTH_MAGIC,\n               strlen(AUTH_MAGIC)) != 0) {\n        ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                             \"key auth magic mismatch\");\n        goto out;\n    }\n\n    decoded.dataptr += strlen(AUTH_MAGIC) + 1;\n\n    if(_libssh2_get_string(&decoded, &ciphername, &tmp_len) ||\n       tmp_len == 0) {\n        ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                             \"ciphername is missing\");\n        goto out;\n    }\n\n    if(_libssh2_get_string(&decoded, &kdfname, &tmp_len) ||\n       tmp_len == 0) {\n        ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"kdfname is missing\");\n        goto out;\n    }\n\n    if(_libssh2_get_string(&decoded, &kdf, &kdf_len)) {\n        ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                             \"kdf is missing\");\n        goto out;\n    }\n    else {\n        kdf_buf.data = kdf;\n        kdf_buf.dataptr = kdf;\n        kdf_buf.len = kdf_len;\n    }\n\n    if((passphrase == NULL || strlen((const char *)passphrase) == 0) &&\n        strcmp((const char *)ciphername, \"none\") != 0) {\n        /* passphrase required */\n        ret = LIBSSH2_ERROR_KEYFILE_AUTH_FAILED;\n        goto out;\n    }\n\n    if(strcmp((const char *)kdfname, \"none\") != 0 &&\n       strcmp((const char *)kdfname, \"bcrypt\") != 0) {\n        ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                             \"unknown cipher\");\n        goto out;\n    }\n\n    if(!strcmp((const char *)kdfname, \"none\") &&\n       strcmp((const char *)ciphername, \"none\") != 0) {\n        ret =_libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                            \"invalid format\");\n        goto out;\n    }\n\n    if(_libssh2_get_u32(&decoded, &nkeys) != 0 || nkeys != 1) {\n        ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                             \"Multiple keys are unsupported\");\n        goto out;\n    }\n\n    /* unencrypted public key */\n\n    if(_libssh2_get_string(&decoded, &buf, &tmp_len) || tmp_len == 0) {\n        ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                             \"Invalid private key; \"\n                             \"expect embedded public key\");\n        goto out;\n    }\n\n    if(_libssh2_get_string(&decoded, &buf, &tmp_len) || tmp_len == 0) {\n        ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                       \"Private key data not found\");\n        goto out;\n    }\n\n    /* decode encrypted private key */\n    decrypted.data = decrypted.dataptr = buf;\n    decrypted.len = tmp_len;\n\n    if(ciphername && strcmp((const char *)ciphername, \"none\") != 0) {\n        const LIBSSH2_CRYPT_METHOD **all_methods, *cur_method;\n\n        all_methods = libssh2_crypt_methods();\n        while((cur_method = *all_methods++)) {\n            if(*cur_method->name &&\n                memcmp(ciphername, cur_method->name,\n                       strlen(cur_method->name)) == 0) {\n                    method = cur_method;\n                }\n        }\n\n        /* None of the available crypt methods were able to decrypt the key */\n\n        if(method == NULL) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                \"No supported cipher found\");\n            goto out;\n        }\n    }\n\n    if(method) {\n        int free_iv = 0, free_secret = 0, len_decrypted = 0;\n        int blocksize;\n        void *abstract = NULL;\n\n        keylen = method->secret_len;\n        ivlen = method->iv_len;\n        total_len = keylen + ivlen;\n\n        key = LIBSSH2_CALLOC(session, total_len);\n        if(key == NULL) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                           \"Could not alloc key\");\n            goto out;\n        }\n\n        if(strcmp((const char *)kdfname, \"bcrypt\") == 0 &&\n           passphrase != NULL) {\n            if((_libssh2_get_string(&kdf_buf, &salt, &salt_len)) ||\n                (_libssh2_get_u32(&kdf_buf, &rounds) != 0) ) {\n                ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                     \"kdf contains unexpected values\");\n                LIBSSH2_FREE(session, key);\n                goto out;\n            }\n\n            if(_libssh2_bcrypt_pbkdf((const char *)passphrase,\n                                     strlen((const char *)passphrase),\n                                     salt, salt_len, key,\n                                     keylen + ivlen, rounds) < 0) {\n                ret = _libssh2_error(session, LIBSSH2_ERROR_DECRYPT,\n                                     \"invalid format\");\n                LIBSSH2_FREE(session, key);\n                goto out;\n            }\n        }\n        else {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_KEYFILE_AUTH_FAILED,\n                                            \"bcrypted without passphrase\");\n            LIBSSH2_FREE(session, key);\n            goto out;\n        }\n\n        /* Set up decryption */\n        blocksize = method->blocksize;\n\n        key_part = LIBSSH2_CALLOC(session, keylen);\n        if(key_part == NULL) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                 \"Could not alloc key part\");\n            goto out;\n        }\n\n        iv_part = LIBSSH2_CALLOC(session, ivlen);\n        if(iv_part == NULL) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                 \"Could not alloc iv part\");\n            goto out;\n        }\n\n        memcpy(key_part, key, keylen);\n        memcpy(iv_part, key + keylen, ivlen);\n\n        /* Initialize the decryption */\n        if(method->init(session, method, iv_part, &free_iv, key_part,\n                         &free_secret, 0, &abstract)) {\n            ret = LIBSSH2_ERROR_DECRYPT;\n            goto out;\n        }\n\n        /* Do the actual decryption */\n        if((decrypted.len % blocksize) != 0) {\n            method->dtor(session, &abstract);\n            ret = LIBSSH2_ERROR_DECRYPT;\n            goto out;\n        }\n\n        while((size_t)len_decrypted <= decrypted.len - blocksize) {\n            if(method->crypt(session, decrypted.data + len_decrypted,\n                             blocksize,\n                             &abstract)) {\n                ret = LIBSSH2_ERROR_DECRYPT;\n                method->dtor(session, &abstract);\n                goto out;\n            }\n\n            len_decrypted += blocksize;\n        }\n\n        /* No padding */\n\n        method->dtor(session, &abstract);\n    }\n\n    /* Check random bytes match */\n\n    if(_libssh2_get_u32(&decrypted, &check1) != 0 ||\n       _libssh2_get_u32(&decrypted, &check2) != 0 ||\n       check1 != check2) {\n       _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                      \"Private key unpack failed (correct password?)\");\n       ret = LIBSSH2_ERROR_KEYFILE_AUTH_FAILED;\n       goto out;\n    }\n\n    if(decrypted_buf != NULL) {\n        /* copy data to out-going buffer */\n        struct string_buf *out_buf = _libssh2_string_buf_new(session);\n        if(!out_buf) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Unable to allocate memory for \"\n                                 \"decrypted struct\");\n            goto out;\n        }\n\n        out_buf->data = LIBSSH2_CALLOC(session, decrypted.len);\n        if(out_buf->data == NULL) {\n            ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                 \"Unable to allocate memory for \"\n                                 \"decrypted struct\");\n            _libssh2_string_buf_free(session, out_buf);\n            goto out;\n        }\n        memcpy(out_buf->data, decrypted.data, decrypted.len);\n        out_buf->dataptr = out_buf->data +\n            (decrypted.dataptr - decrypted.data);\n        out_buf->len = decrypted.len;\n\n        *decrypted_buf = out_buf;\n    }\n\nout:\n\n    /* Clean up */\n    if(key) {\n        _libssh2_explicit_zero(key, total_len);\n        LIBSSH2_FREE(session, key);\n    }\n    if(key_part) {\n        _libssh2_explicit_zero(key_part, keylen);\n        LIBSSH2_FREE(session, key_part);\n    }\n    if(iv_part) {\n        _libssh2_explicit_zero(iv_part, ivlen);\n        LIBSSH2_FREE(session, iv_part);\n    }\n    if(f) {\n        _libssh2_explicit_zero(f, f_len);\n        LIBSSH2_FREE(session, f);\n    }\n\n    return ret;\n}\n\nint\n_libssh2_openssh_pem_parse(LIBSSH2_SESSION * session,\n                           const unsigned char *passphrase,\n                           FILE * fp, struct string_buf **decrypted_buf)\n{\n    char line[LINE_SIZE];\n    char *b64data = NULL;\n    unsigned int b64datalen = 0;\n    int ret = 0;\n\n    /* read file */\n\n    do {\n        *line = '\\0';\n\n        if(readline(line, LINE_SIZE, fp)) {\n            return -1;\n        }\n    }\n    while(strcmp(line, OPENSSH_HEADER_BEGIN) != 0);\n\n    if(readline(line, LINE_SIZE, fp)) {\n        return -1;\n    }\n\n    do {\n        if(*line) {\n            char *tmp;\n            size_t linelen;\n\n            linelen = strlen(line);\n            tmp = LIBSSH2_REALLOC(session, b64data, b64datalen + linelen);\n            if(!tmp) {\n                ret = -1;\n                goto out;\n            }\n            memcpy(tmp + b64datalen, line, linelen);\n            b64data = tmp;\n            b64datalen += linelen;\n        }\n\n        *line = '\\0';\n\n        if(readline(line, LINE_SIZE, fp)) {\n            ret = -1;\n            goto out;\n        }\n    } while(strcmp(line, OPENSSH_HEADER_END) != 0);\n\n    if(!b64data) {\n        return -1;\n    }\n\n    ret = _libssh2_openssh_pem_parse_data(session,\n                                          passphrase,\n                                          (const char *)b64data,\n                                          (size_t)b64datalen,\n                                          decrypted_buf);\n\n    if(b64data) {\n        _libssh2_explicit_zero(b64data, b64datalen);\n        LIBSSH2_FREE(session, b64data);\n    }\n\nout:\n\n    return ret;\n}\n\nint\n_libssh2_openssh_pem_parse_memory(LIBSSH2_SESSION * session,\n                                  const unsigned char *passphrase,\n                                  const char *filedata, size_t filedata_len,\n                                  struct string_buf **decrypted_buf)\n{\n    char line[LINE_SIZE];\n    char *b64data = NULL;\n    unsigned int b64datalen = 0;\n    size_t off = 0;\n    int ret;\n\n    if(filedata == NULL || filedata_len <= 0) {\n        return -1;\n    }\n\n    do {\n\n        *line = '\\0';\n\n        if(off >= filedata_len) {\n            return -1;\n        }\n\n        if(readline_memory(line, LINE_SIZE, filedata, filedata_len, &off)) {\n            return -1;\n        }\n    }\n    while(strcmp(line, OPENSSH_HEADER_BEGIN) != 0);\n\n    *line = '\\0';\n\n    do {\n        if (*line) {\n            char *tmp;\n            size_t linelen;\n\n            linelen = strlen(line);\n            tmp = LIBSSH2_REALLOC(session, b64data, b64datalen + linelen);\n            if(!tmp) {\n                ret = -1;\n                goto out;\n            }\n            memcpy(tmp + b64datalen, line, linelen);\n            b64data = tmp;\n            b64datalen += linelen;\n        }\n\n        *line = '\\0';\n\n        if(off >= filedata_len) {\n            ret = -1;\n            goto out;\n        }\n\n        if(readline_memory(line, LINE_SIZE, filedata, filedata_len, &off)) {\n            ret = -1;\n            goto out;\n        }\n    } while(strcmp(line, OPENSSH_HEADER_END) != 0);\n\n    if(!b64data) {\n        return -1;\n    }\n\n    ret = _libssh2_openssh_pem_parse_data(session, passphrase, b64data,\n                                          b64datalen, decrypted_buf);\n\nout:\n    if(b64data) {\n        _libssh2_explicit_zero(b64data, b64datalen);\n        LIBSSH2_FREE(session, b64data);\n    }\n    return ret;\n\n}\n\nstatic int\nread_asn1_length(const unsigned char *data,\n                 unsigned int datalen, unsigned int *len)\n{\n    unsigned int lenlen;\n    int nextpos;\n\n    if(datalen < 1) {\n        return -1;\n    }\n    *len = data[0];\n\n    if(*len >= 0x80) {\n        lenlen = *len & 0x7F;\n        *len = data[1];\n        if(1 + lenlen > datalen) {\n            return -1;\n        }\n        if(lenlen > 1) {\n            *len <<= 8;\n            *len |= data[2];\n        }\n    }\n    else {\n        lenlen = 0;\n    }\n\n    nextpos = 1 + lenlen;\n    if(lenlen > 2 || 1 + lenlen + *len > datalen) {\n        return -1;\n    }\n\n    return nextpos;\n}\n\nint\n_libssh2_pem_decode_sequence(unsigned char **data, unsigned int *datalen)\n{\n    unsigned int len;\n    int lenlen;\n\n    if(*datalen < 1) {\n        return -1;\n    }\n\n    if((*data)[0] != '\\x30') {\n        return -1;\n    }\n\n    (*data)++;\n    (*datalen)--;\n\n    lenlen = read_asn1_length(*data, *datalen, &len);\n    if(lenlen < 0 || lenlen + len != *datalen) {\n        return -1;\n    }\n\n    *data += lenlen;\n    *datalen -= lenlen;\n\n    return 0;\n}\n\nint\n_libssh2_pem_decode_integer(unsigned char **data, unsigned int *datalen,\n                            unsigned char **i, unsigned int *ilen)\n{\n    unsigned int len;\n    int lenlen;\n\n    if(*datalen < 1) {\n        return -1;\n    }\n\n    if((*data)[0] != '\\x02') {\n        return -1;\n    }\n\n    (*data)++;\n    (*datalen)--;\n\n    lenlen = read_asn1_length(*data, *datalen, &len);\n    if(lenlen < 0 || lenlen + len > *datalen) {\n        return -1;\n    }\n\n    *data += lenlen;\n    *datalen -= lenlen;\n\n    *i = *data;\n    *ilen = len;\n\n    *data += len;\n    *datalen -= len;\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/publickey.c",
    "content": "/* Copyright (c) 2004-2007, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2010-2014 by Daniel Stenberg\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include \"libssh2_publickey.h\"\n#include \"channel.h\"\n#include \"session.h\"\n\n#define LIBSSH2_PUBLICKEY_VERSION               2\n\n/* Numericised response codes -- Not IETF, just local representation */\n#define LIBSSH2_PUBLICKEY_RESPONSE_STATUS       0\n#define LIBSSH2_PUBLICKEY_RESPONSE_VERSION      1\n#define LIBSSH2_PUBLICKEY_RESPONSE_PUBLICKEY    2\n\ntypedef struct _LIBSSH2_PUBLICKEY_CODE_LIST\n{\n    int code;\n    const char *name;\n    int name_len;\n} LIBSSH2_PUBLICKEY_CODE_LIST;\n\nstatic const LIBSSH2_PUBLICKEY_CODE_LIST publickey_response_codes[] =\n{\n    {LIBSSH2_PUBLICKEY_RESPONSE_STATUS, \"status\", sizeof(\"status\") - 1},\n    {LIBSSH2_PUBLICKEY_RESPONSE_VERSION, \"version\", sizeof(\"version\") - 1},\n    {LIBSSH2_PUBLICKEY_RESPONSE_PUBLICKEY, \"publickey\",\n     sizeof(\"publickey\") - 1},\n    {0, NULL, 0}\n};\n\n/* PUBLICKEY status codes -- IETF defined */\n#define LIBSSH2_PUBLICKEY_SUCCESS               0\n#define LIBSSH2_PUBLICKEY_ACCESS_DENIED         1\n#define LIBSSH2_PUBLICKEY_STORAGE_EXCEEDED      2\n#define LIBSSH2_PUBLICKEY_VERSION_NOT_SUPPORTED 3\n#define LIBSSH2_PUBLICKEY_KEY_NOT_FOUND         4\n#define LIBSSH2_PUBLICKEY_KEY_NOT_SUPPORTED     5\n#define LIBSSH2_PUBLICKEY_KEY_ALREADY_PRESENT   6\n#define LIBSSH2_PUBLICKEY_GENERAL_FAILURE       7\n#define LIBSSH2_PUBLICKEY_REQUEST_NOT_SUPPORTED 8\n\n#define LIBSSH2_PUBLICKEY_STATUS_CODE_MAX       8\n\nstatic const LIBSSH2_PUBLICKEY_CODE_LIST publickey_status_codes[] = {\n    {LIBSSH2_PUBLICKEY_SUCCESS, \"success\", sizeof(\"success\") - 1},\n    {LIBSSH2_PUBLICKEY_ACCESS_DENIED, \"access denied\",\n     sizeof(\"access denied\") - 1},\n    {LIBSSH2_PUBLICKEY_STORAGE_EXCEEDED, \"storage exceeded\",\n     sizeof(\"storage exceeded\") - 1},\n    {LIBSSH2_PUBLICKEY_VERSION_NOT_SUPPORTED, \"version not supported\",\n     sizeof(\"version not supported\") - 1},\n    {LIBSSH2_PUBLICKEY_KEY_NOT_FOUND, \"key not found\",\n     sizeof(\"key not found\") - 1},\n    {LIBSSH2_PUBLICKEY_KEY_NOT_SUPPORTED, \"key not supported\",\n     sizeof(\"key not supported\") - 1},\n    {LIBSSH2_PUBLICKEY_KEY_ALREADY_PRESENT, \"key already present\",\n     sizeof(\"key already present\") - 1},\n    {LIBSSH2_PUBLICKEY_GENERAL_FAILURE, \"general failure\",\n     sizeof(\"general failure\") - 1},\n    {LIBSSH2_PUBLICKEY_REQUEST_NOT_SUPPORTED, \"request not supported\",\n     sizeof(\"request not supported\") - 1},\n    {0, NULL, 0}\n};\n\n/*\n * publickey_status_error\n *\n * Format an error message from a status code\n */\nstatic void\npublickey_status_error(const LIBSSH2_PUBLICKEY *pkey,\n                       LIBSSH2_SESSION *session, int status)\n{\n    const char *msg;\n\n    /* GENERAL_FAILURE got remapped between version 1 and 2 */\n    if(status == 6 && pkey && pkey->version == 1) {\n        status = 7;\n    }\n\n    if(status < 0 || status > LIBSSH2_PUBLICKEY_STATUS_CODE_MAX) {\n        msg = \"unknown\";\n    }\n    else {\n        msg = publickey_status_codes[status].name;\n    }\n\n    _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL, msg);\n}\n\n/*\n * publickey_packet_receive\n *\n * Read a packet from the subsystem\n */\nstatic int\npublickey_packet_receive(LIBSSH2_PUBLICKEY * pkey,\n                         unsigned char **data, size_t *data_len)\n{\n    LIBSSH2_CHANNEL *channel = pkey->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char buffer[4];\n    int rc;\n    *data = NULL; /* default to nothing returned */\n    *data_len = 0;\n\n    if(pkey->receive_state == libssh2_NB_state_idle) {\n        rc = _libssh2_channel_read(channel, 0, (char *) buffer, 4);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc != 4) {\n            return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                                  \"Invalid response from publickey subsystem\");\n        }\n\n        pkey->receive_packet_len = _libssh2_ntohu32(buffer);\n        pkey->receive_packet =\n            LIBSSH2_ALLOC(session, pkey->receive_packet_len);\n        if(!pkey->receive_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate publickey response \"\n                                  \"buffer\");\n        }\n\n        pkey->receive_state = libssh2_NB_state_sent;\n    }\n\n    if(pkey->receive_state == libssh2_NB_state_sent) {\n        rc = _libssh2_channel_read(channel, 0, (char *) pkey->receive_packet,\n                                   pkey->receive_packet_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc != (int)pkey->receive_packet_len) {\n            LIBSSH2_FREE(session, pkey->receive_packet);\n            pkey->receive_packet = NULL;\n            pkey->receive_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_TIMEOUT,\n                                  \"Timeout waiting for publickey subsystem \"\n                                  \"response packet\");\n        }\n\n        *data = pkey->receive_packet;\n        *data_len = pkey->receive_packet_len;\n    }\n\n    pkey->receive_state = libssh2_NB_state_idle;\n\n    return 0;\n}\n\n/* publickey_response_id\n *\n * Translate a string response name to a numeric code\n * Data will be incremented by 4 + response_len on success only\n */\nstatic int\npublickey_response_id(unsigned char **pdata, size_t data_len)\n{\n    size_t response_len;\n    unsigned char *data = *pdata;\n    const LIBSSH2_PUBLICKEY_CODE_LIST *codes = publickey_response_codes;\n\n    if(data_len < 4) {\n        /* Malformed response */\n        return -1;\n    }\n    response_len = _libssh2_ntohu32(data);\n    data += 4;\n    data_len -= 4;\n    if(data_len < response_len) {\n        /* Malformed response */\n        return -1;\n    }\n\n    while(codes->name) {\n        if((unsigned long)codes->name_len == response_len &&\n            strncmp(codes->name, (char *) data, response_len) == 0) {\n            *pdata = data + response_len;\n            return codes->code;\n        }\n        codes++;\n    }\n\n    return -1;\n}\n\n/* publickey_response_success\n *\n * Generic helper routine to wait for success response and nothing else\n */\nstatic int\npublickey_response_success(LIBSSH2_PUBLICKEY * pkey)\n{\n    LIBSSH2_SESSION *session = pkey->channel->session;\n    unsigned char *data, *s;\n    size_t data_len;\n    int response;\n\n    while(1) {\n        int rc = publickey_packet_receive(pkey, &data, &data_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_TIMEOUT,\n                                  \"Timeout waiting for response from \"\n                                  \"publickey subsystem\");\n        }\n\n        if(data_len < 4) {\n            return _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                  \"Publickey response too small\");\n        }\n\n        s = data;\n        response = publickey_response_id(&s, data_len);\n\n        switch(response) {\n        case LIBSSH2_PUBLICKEY_RESPONSE_STATUS:\n            /* Error, or processing complete */\n        {\n            unsigned long status = 0;\n\n            if(data_len < 8) {\n                return _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                      \"Publickey response too small\");\n            }\n\n            status = _libssh2_ntohu32(s);\n\n            LIBSSH2_FREE(session, data);\n\n            if(status == LIBSSH2_PUBLICKEY_SUCCESS)\n                return 0;\n\n            publickey_status_error(pkey, session, status);\n            return -1;\n        }\n        default:\n            LIBSSH2_FREE(session, data);\n            if(response < 0) {\n                return _libssh2_error(session,\n                                      LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                                      \"Invalid publickey subsystem response\");\n            }\n            /* Unknown/Unexpected */\n            _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                           \"Unexpected publickey subsystem response\");\n            data = NULL;\n        }\n    }\n    /* never reached, but include `return` to silence compiler warnings */\n    return -1;\n}\n\n/* *****************\n * Publickey API *\n ***************** */\n\n/*\n * publickey_init\n *\n * Startup the publickey subsystem\n */\nstatic LIBSSH2_PUBLICKEY *publickey_init(LIBSSH2_SESSION *session)\n{\n    int response;\n    int rc;\n\n    if(session->pkeyInit_state == libssh2_NB_state_idle) {\n        session->pkeyInit_data = NULL;\n        session->pkeyInit_pkey = NULL;\n        session->pkeyInit_channel = NULL;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY,\n                       \"Initializing publickey subsystem\");\n\n        session->pkeyInit_state = libssh2_NB_state_allocated;\n    }\n\n    if(session->pkeyInit_state == libssh2_NB_state_allocated) {\n\n        session->pkeyInit_channel =\n            _libssh2_channel_open(session, \"session\",\n                                  sizeof(\"session\") - 1,\n                                  LIBSSH2_CHANNEL_WINDOW_DEFAULT,\n                                  LIBSSH2_CHANNEL_PACKET_DEFAULT, NULL,\n                                  0);\n        if(!session->pkeyInit_channel) {\n            if(libssh2_session_last_errno(session) == LIBSSH2_ERROR_EAGAIN)\n                /* The error state is already set, so leave it */\n                return NULL;\n            _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                           \"Unable to startup channel\");\n            goto err_exit;\n        }\n\n        session->pkeyInit_state = libssh2_NB_state_sent;\n    }\n\n    if(session->pkeyInit_state == libssh2_NB_state_sent) {\n        rc = _libssh2_channel_process_startup(session->pkeyInit_channel,\n                                              \"subsystem\",\n                                              sizeof(\"subsystem\") - 1,\n                                              \"publickey\",\n                                              sizeof(\"publickey\") - 1);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block starting publickey subsystem\");\n            return NULL;\n        }\n        else if(rc) {\n            _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                           \"Unable to request publickey subsystem\");\n            goto err_exit;\n        }\n\n        session->pkeyInit_state = libssh2_NB_state_sent1;\n    }\n\n    if(session->pkeyInit_state == libssh2_NB_state_sent1) {\n        unsigned char *s;\n        rc = _libssh2_channel_extended_data(session->pkeyInit_channel,\n                                         LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block starting publickey subsystem\");\n            return NULL;\n        }\n\n        session->pkeyInit_pkey =\n            LIBSSH2_CALLOC(session, sizeof(LIBSSH2_PUBLICKEY));\n        if(!session->pkeyInit_pkey) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate a new publickey structure\");\n            goto err_exit;\n        }\n        session->pkeyInit_pkey->channel = session->pkeyInit_channel;\n        session->pkeyInit_pkey->version = 0;\n\n        s = session->pkeyInit_buffer;\n        _libssh2_htonu32(s, 4 + (sizeof(\"version\") - 1) + 4);\n        s += 4;\n        _libssh2_htonu32(s, sizeof(\"version\") - 1);\n        s += 4;\n        memcpy(s, \"version\", sizeof(\"version\") - 1);\n        s += sizeof(\"version\") - 1;\n        _libssh2_htonu32(s, LIBSSH2_PUBLICKEY_VERSION);\n\n        session->pkeyInit_buffer_sent = 0;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY,\n                       \"Sending publickey advertising version %d support\",\n                       (int) LIBSSH2_PUBLICKEY_VERSION);\n\n        session->pkeyInit_state = libssh2_NB_state_sent2;\n    }\n\n    if(session->pkeyInit_state == libssh2_NB_state_sent2) {\n        rc = _libssh2_channel_write(session->pkeyInit_channel, 0,\n                                    session->pkeyInit_buffer,\n                                    19 - session->pkeyInit_buffer_sent);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block sending publickey version packet\");\n            return NULL;\n        }\n        else if(rc < 0) {\n            _libssh2_error(session, rc,\n                           \"Unable to send publickey version packet\");\n            goto err_exit;\n        }\n        session->pkeyInit_buffer_sent += rc;\n        if(session->pkeyInit_buffer_sent < 19) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Need to be called again to complete this\");\n            return NULL;\n        }\n\n        session->pkeyInit_state = libssh2_NB_state_sent3;\n    }\n\n    if(session->pkeyInit_state == libssh2_NB_state_sent3) {\n        while(1) {\n            unsigned char *s;\n            rc = publickey_packet_receive(session->pkeyInit_pkey,\n                                          &session->pkeyInit_data,\n                                          &session->pkeyInit_data_len);\n            if(rc == LIBSSH2_ERROR_EAGAIN) {\n                _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                               \"Would block waiting for response from \"\n                               \"publickey subsystem\");\n                return NULL;\n            }\n            else if(rc) {\n                _libssh2_error(session, LIBSSH2_ERROR_SOCKET_TIMEOUT,\n                               \"Timeout waiting for response from \"\n                               \"publickey subsystem\");\n                goto err_exit;\n            }\n\n            s = session->pkeyInit_data;\n            if((response =\n                 publickey_response_id(&s, session->pkeyInit_data_len)) < 0) {\n                _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                               \"Invalid publickey subsystem response code\");\n                goto err_exit;\n            }\n\n            if(session->pkeyInit_data_len < 4) {\n                _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                               \"Public key init data too small\");\n                goto err_exit;\n            }\n\n            switch(response) {\n            case LIBSSH2_PUBLICKEY_RESPONSE_STATUS:\n                /* Error */\n            {\n                unsigned long status, descr_len, lang_len;\n\n                if(session->pkeyInit_data_len >= 8) {\n                    status = _libssh2_ntohu32(s);\n                    s += 4;\n                    descr_len = _libssh2_ntohu32(s);\n                    s += 4;\n                }\n                else {\n                    _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                   \"Public key init data too small\");\n                    goto err_exit;\n                }\n\n                if(s + descr_len + 4 <=\n                   session->pkeyInit_data + session->pkeyInit_data_len) {\n                    /* description starts here */\n                    s += descr_len;\n                    lang_len = _libssh2_ntohu32(s);\n                    s += 4;\n                }\n                else {\n                    _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                   \"Public key init data too small\");\n                    goto err_exit;\n                }\n\n                if(s + lang_len <=\n                   session->pkeyInit_data + session->pkeyInit_data_len) {\n                    /* lang starts here */\n                    s += lang_len;\n                }\n                else {\n                    _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                   \"Public key init data too small\");\n                    goto err_exit;\n                }\n\n                if(s >\n                    session->pkeyInit_data + session->pkeyInit_data_len) {\n                    _libssh2_error(session,\n                                   LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                                   \"Malformed publickey subsystem packet\");\n                    goto err_exit;\n                }\n\n                publickey_status_error(NULL, session, status);\n\n                goto err_exit;\n            }\n\n            case LIBSSH2_PUBLICKEY_RESPONSE_VERSION:\n                /* What we want */\n                session->pkeyInit_pkey->version = _libssh2_ntohu32(s);\n                if(session->pkeyInit_pkey->version >\n                    LIBSSH2_PUBLICKEY_VERSION) {\n                    _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY,\n                                   \"Truncate remote publickey version \"\n                                   \"from %lu\",\n                                   session->pkeyInit_pkey->version);\n                    session->pkeyInit_pkey->version =\n                        LIBSSH2_PUBLICKEY_VERSION;\n                }\n                _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY,\n                               \"Enabling publickey subsystem version %lu\",\n                               session->pkeyInit_pkey->version);\n                LIBSSH2_FREE(session, session->pkeyInit_data);\n                session->pkeyInit_data = NULL;\n                session->pkeyInit_state = libssh2_NB_state_idle;\n                return session->pkeyInit_pkey;\n\n            default:\n                /* Unknown/Unexpected */\n                _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                               \"Unexpected publickey subsystem response, \"\n                               \"ignoring\");\n                LIBSSH2_FREE(session, session->pkeyInit_data);\n                session->pkeyInit_data = NULL;\n            }\n        }\n    }\n\n    /* Never reached except by direct goto */\n  err_exit:\n    session->pkeyInit_state = libssh2_NB_state_sent4;\n    if(session->pkeyInit_channel) {\n        rc = _libssh2_channel_close(session->pkeyInit_channel);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block closing channel\");\n            return NULL;\n        }\n    }\n    if(session->pkeyInit_pkey) {\n        LIBSSH2_FREE(session, session->pkeyInit_pkey);\n        session->pkeyInit_pkey = NULL;\n    }\n    if(session->pkeyInit_data) {\n        LIBSSH2_FREE(session, session->pkeyInit_data);\n        session->pkeyInit_data = NULL;\n    }\n    session->pkeyInit_state = libssh2_NB_state_idle;\n    return NULL;\n}\n\n/*\n * libssh2_publickey_init\n *\n * Startup the publickey subsystem\n */\nLIBSSH2_API LIBSSH2_PUBLICKEY *\nlibssh2_publickey_init(LIBSSH2_SESSION *session)\n{\n    LIBSSH2_PUBLICKEY *ptr;\n\n    BLOCK_ADJUST_ERRNO(ptr, session,\n                       publickey_init(session));\n    return ptr;\n}\n\n\n\n/*\n * libssh2_publickey_add_ex\n *\n * Add a new public key entry\n */\nLIBSSH2_API int\nlibssh2_publickey_add_ex(LIBSSH2_PUBLICKEY *pkey, const unsigned char *name,\n                         unsigned long name_len, const unsigned char *blob,\n                         unsigned long blob_len, char overwrite,\n                         unsigned long num_attrs,\n                         const libssh2_publickey_attribute attrs[])\n{\n    LIBSSH2_CHANNEL *channel;\n    LIBSSH2_SESSION *session;\n    /*  19 = packet_len(4) + add_len(4) + \"add\"(3) + name_len(4) + {name}\n        blob_len(4) + {blob} */\n    unsigned long i, packet_len = 19 + name_len + blob_len;\n    unsigned char *comment = NULL;\n    unsigned long comment_len = 0;\n    int rc;\n\n    if(!pkey)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    channel = pkey->channel;\n    session = channel->session;\n\n    if(pkey->add_state == libssh2_NB_state_idle) {\n        pkey->add_packet = NULL;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY, \"Adding %s publickey\",\n                       name);\n\n        if(pkey->version == 1) {\n            for(i = 0; i < num_attrs; i++) {\n                /* Search for a comment attribute */\n                if(attrs[i].name_len == (sizeof(\"comment\") - 1) &&\n                    strncmp(attrs[i].name, \"comment\",\n                            sizeof(\"comment\") - 1) == 0) {\n                    comment = (unsigned char *) attrs[i].value;\n                    comment_len = attrs[i].value_len;\n                    break;\n                }\n            }\n            packet_len += 4 + comment_len;\n        }\n        else {\n            packet_len += 5;    /* overwrite(1) + attribute_count(4) */\n            for(i = 0; i < num_attrs; i++) {\n                packet_len += 9 + attrs[i].name_len + attrs[i].value_len;\n                /* name_len(4) + value_len(4) + mandatory(1) */\n            }\n        }\n\n        pkey->add_packet = LIBSSH2_ALLOC(session, packet_len);\n        if(!pkey->add_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"publickey \\\"add\\\" packet\");\n        }\n\n        pkey->add_s = pkey->add_packet;\n        _libssh2_htonu32(pkey->add_s, packet_len - 4);\n        pkey->add_s += 4;\n        _libssh2_htonu32(pkey->add_s, sizeof(\"add\") - 1);\n        pkey->add_s += 4;\n        memcpy(pkey->add_s, \"add\", sizeof(\"add\") - 1);\n        pkey->add_s += sizeof(\"add\") - 1;\n        if(pkey->version == 1) {\n            _libssh2_htonu32(pkey->add_s, comment_len);\n            pkey->add_s += 4;\n            if(comment) {\n                memcpy(pkey->add_s, comment, comment_len);\n                pkey->add_s += comment_len;\n            }\n\n            _libssh2_htonu32(pkey->add_s, name_len);\n            pkey->add_s += 4;\n            memcpy(pkey->add_s, name, name_len);\n            pkey->add_s += name_len;\n            _libssh2_htonu32(pkey->add_s, blob_len);\n            pkey->add_s += 4;\n            memcpy(pkey->add_s, blob, blob_len);\n            pkey->add_s += blob_len;\n        }\n        else {\n            /* Version == 2 */\n\n            _libssh2_htonu32(pkey->add_s, name_len);\n            pkey->add_s += 4;\n            memcpy(pkey->add_s, name, name_len);\n            pkey->add_s += name_len;\n            _libssh2_htonu32(pkey->add_s, blob_len);\n            pkey->add_s += 4;\n            memcpy(pkey->add_s, blob, blob_len);\n            pkey->add_s += blob_len;\n            *(pkey->add_s++) = overwrite ? 0x01 : 0;\n            _libssh2_htonu32(pkey->add_s, num_attrs);\n            pkey->add_s += 4;\n            for(i = 0; i < num_attrs; i++) {\n                _libssh2_htonu32(pkey->add_s, attrs[i].name_len);\n                pkey->add_s += 4;\n                memcpy(pkey->add_s, attrs[i].name, attrs[i].name_len);\n                pkey->add_s += attrs[i].name_len;\n                _libssh2_htonu32(pkey->add_s, attrs[i].value_len);\n                pkey->add_s += 4;\n                memcpy(pkey->add_s, attrs[i].value, attrs[i].value_len);\n                pkey->add_s += attrs[i].value_len;\n                *(pkey->add_s++) = attrs[i].mandatory ? 0x01 : 0;\n            }\n        }\n\n        _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY,\n                       \"Sending publickey \\\"add\\\" packet: \"\n                       \"type=%s blob_len=%ld num_attrs=%ld\",\n                       name, blob_len, num_attrs);\n\n        pkey->add_state = libssh2_NB_state_created;\n    }\n\n    if(pkey->add_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, pkey->add_packet,\n                                    (pkey->add_s - pkey->add_packet));\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if((pkey->add_s - pkey->add_packet) != rc) {\n            LIBSSH2_FREE(session, pkey->add_packet);\n            pkey->add_packet = NULL;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send publickey add packet\");\n        }\n        LIBSSH2_FREE(session, pkey->add_packet);\n        pkey->add_packet = NULL;\n\n        pkey->add_state = libssh2_NB_state_sent;\n    }\n\n    rc = publickey_response_success(pkey);\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    }\n\n    pkey->add_state = libssh2_NB_state_idle;\n\n    return rc;\n}\n\n/* libssh2_publickey_remove_ex\n * Remove an existing publickey so that authentication can no longer be\n * performed using it\n */\nLIBSSH2_API int\nlibssh2_publickey_remove_ex(LIBSSH2_PUBLICKEY * pkey,\n                            const unsigned char *name, unsigned long name_len,\n                            const unsigned char *blob, unsigned long blob_len)\n{\n    LIBSSH2_CHANNEL *channel;\n    LIBSSH2_SESSION *session;\n    /* 22 = packet_len(4) + remove_len(4) + \"remove\"(6) + name_len(4) + {name}\n       + blob_len(4) + {blob} */\n    unsigned long packet_len = 22 + name_len + blob_len;\n    int rc;\n\n    if(!pkey)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    channel = pkey->channel;\n    session = channel->session;\n\n    if(pkey->remove_state == libssh2_NB_state_idle) {\n        pkey->remove_packet = NULL;\n\n        pkey->remove_packet = LIBSSH2_ALLOC(session, packet_len);\n        if(!pkey->remove_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"publickey \\\"remove\\\" packet\");\n        }\n\n        pkey->remove_s = pkey->remove_packet;\n        _libssh2_htonu32(pkey->remove_s, packet_len - 4);\n        pkey->remove_s += 4;\n        _libssh2_htonu32(pkey->remove_s, sizeof(\"remove\") - 1);\n        pkey->remove_s += 4;\n        memcpy(pkey->remove_s, \"remove\", sizeof(\"remove\") - 1);\n        pkey->remove_s += sizeof(\"remove\") - 1;\n        _libssh2_htonu32(pkey->remove_s, name_len);\n        pkey->remove_s += 4;\n        memcpy(pkey->remove_s, name, name_len);\n        pkey->remove_s += name_len;\n        _libssh2_htonu32(pkey->remove_s, blob_len);\n        pkey->remove_s += 4;\n        memcpy(pkey->remove_s, blob, blob_len);\n        pkey->remove_s += blob_len;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY,\n                       \"Sending publickey \\\"remove\\\" packet: \"\n                       \"type=%s blob_len=%ld\",\n                       name, blob_len);\n\n        pkey->remove_state = libssh2_NB_state_created;\n    }\n\n    if(pkey->remove_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, pkey->remove_packet,\n                                    (pkey->remove_s - pkey->remove_packet));\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if((pkey->remove_s - pkey->remove_packet) != rc) {\n            LIBSSH2_FREE(session, pkey->remove_packet);\n            pkey->remove_packet = NULL;\n            pkey->remove_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send publickey remove packet\");\n        }\n        LIBSSH2_FREE(session, pkey->remove_packet);\n        pkey->remove_packet = NULL;\n\n        pkey->remove_state = libssh2_NB_state_sent;\n    }\n\n    rc = publickey_response_success(pkey);\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    }\n\n    pkey->remove_state = libssh2_NB_state_idle;\n\n    return rc;\n}\n\n/* libssh2_publickey_list_fetch\n * Fetch a list of supported public key from a server\n */\nLIBSSH2_API int\nlibssh2_publickey_list_fetch(LIBSSH2_PUBLICKEY * pkey, unsigned long *num_keys,\n                             libssh2_publickey_list ** pkey_list)\n{\n    LIBSSH2_CHANNEL *channel;\n    LIBSSH2_SESSION *session;\n    libssh2_publickey_list *list = NULL;\n    unsigned long buffer_len = 12, keys = 0, max_keys = 0, i;\n    /* 12 = packet_len(4) + list_len(4) + \"list\"(4) */\n    int response;\n    int rc;\n\n    if(!pkey)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    channel = pkey->channel;\n    session = channel->session;\n\n    if(pkey->listFetch_state == libssh2_NB_state_idle) {\n        pkey->listFetch_data = NULL;\n\n        pkey->listFetch_s = pkey->listFetch_buffer;\n        _libssh2_htonu32(pkey->listFetch_s, buffer_len - 4);\n        pkey->listFetch_s += 4;\n        _libssh2_htonu32(pkey->listFetch_s, sizeof(\"list\") - 1);\n        pkey->listFetch_s += 4;\n        memcpy(pkey->listFetch_s, \"list\", sizeof(\"list\") - 1);\n        pkey->listFetch_s += sizeof(\"list\") - 1;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY,\n                       \"Sending publickey \\\"list\\\" packet\");\n\n        pkey->listFetch_state = libssh2_NB_state_created;\n    }\n\n    if(pkey->listFetch_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0,\n                                    pkey->listFetch_buffer,\n                                    (pkey->listFetch_s -\n                                     pkey->listFetch_buffer));\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if((pkey->listFetch_s - pkey->listFetch_buffer) != rc) {\n            pkey->listFetch_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send publickey list packet\");\n        }\n\n        pkey->listFetch_state = libssh2_NB_state_sent;\n    }\n\n    while(1) {\n        rc = publickey_packet_receive(pkey, &pkey->listFetch_data,\n                                      &pkey->listFetch_data_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc) {\n            _libssh2_error(session, LIBSSH2_ERROR_SOCKET_TIMEOUT,\n                           \"Timeout waiting for response from \"\n                           \"publickey subsystem\");\n            goto err_exit;\n        }\n\n        pkey->listFetch_s = pkey->listFetch_data;\n        if((response =\n             publickey_response_id(&pkey->listFetch_s,\n                                   pkey->listFetch_data_len)) < 0) {\n            _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                           \"Invalid publickey subsystem response code\");\n            goto err_exit;\n        }\n\n        switch(response) {\n        case LIBSSH2_PUBLICKEY_RESPONSE_STATUS:\n            /* Error, or processing complete */\n        {\n            unsigned long status, descr_len, lang_len;\n\n            if(pkey->listFetch_s + 8 <=\n               pkey->listFetch_data + pkey->listFetch_data_len) {\n                status = _libssh2_ntohu32(pkey->listFetch_s);\n                pkey->listFetch_s += 4;\n                descr_len = _libssh2_ntohu32(pkey->listFetch_s);\n                pkey->listFetch_s += 4;\n            }\n            else {\n                _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                               \"ListFetch data too short\");\n                goto err_exit;\n            }\n\n            if(pkey->listFetch_s + descr_len + 4 <=\n               pkey->listFetch_data + pkey->listFetch_data_len) {\n                /* description starts at pkey->listFetch_s */\n                pkey->listFetch_s += descr_len;\n                lang_len = _libssh2_ntohu32(pkey->listFetch_s);\n                pkey->listFetch_s += 4;\n            }\n            else {\n                _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                               \"ListFetch data too short\");\n                goto err_exit;\n            }\n\n            if(pkey->listFetch_s + lang_len <=\n               pkey->listFetch_data + pkey->listFetch_data_len) {\n                /* lang starts at pkey->listFetch_s */\n                pkey->listFetch_s += lang_len;\n            }\n            else {\n                _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                               \"ListFetch data too short\");\n                goto err_exit;\n            }\n\n            if(pkey->listFetch_s >\n                pkey->listFetch_data + pkey->listFetch_data_len) {\n                _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                               \"Malformed publickey subsystem packet\");\n                goto err_exit;\n            }\n\n            if(status == LIBSSH2_PUBLICKEY_SUCCESS) {\n                LIBSSH2_FREE(session, pkey->listFetch_data);\n                pkey->listFetch_data = NULL;\n                *pkey_list = list;\n                *num_keys = keys;\n                pkey->listFetch_state = libssh2_NB_state_idle;\n                return 0;\n            }\n\n            publickey_status_error(pkey, session, status);\n            goto err_exit;\n        }\n        case LIBSSH2_PUBLICKEY_RESPONSE_PUBLICKEY:\n            /* What we want */\n            if(keys >= max_keys) {\n                libssh2_publickey_list *newlist;\n                /* Grow the key list if necessary */\n                max_keys += 8;\n                newlist =\n                    LIBSSH2_REALLOC(session, list,\n                                    (max_keys +\n                                     1) * sizeof(libssh2_publickey_list));\n                if(!newlist) {\n                    _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                   \"Unable to allocate memory for \"\n                                   \"publickey list\");\n                    goto err_exit;\n                }\n                list = newlist;\n            }\n            if(pkey->version == 1) {\n                unsigned long comment_len;\n\n                if(pkey->listFetch_s + 4 <=\n                   pkey->listFetch_data + pkey->listFetch_data_len) {\n                    comment_len = _libssh2_ntohu32(pkey->listFetch_s);\n                    pkey->listFetch_s += 4;\n                }\n                else {\n                    _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                   \"ListFetch data too short\");\n                    goto err_exit;\n                }\n\n                if(comment_len) {\n                    list[keys].num_attrs = 1;\n                    list[keys].attrs =\n                        LIBSSH2_ALLOC(session,\n                                      sizeof(libssh2_publickey_attribute));\n                    if(!list[keys].attrs) {\n                        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                       \"Unable to allocate memory for \"\n                                       \"publickey attributes\");\n                        goto err_exit;\n                    }\n                    list[keys].attrs[0].name = \"comment\";\n                    list[keys].attrs[0].name_len = sizeof(\"comment\") - 1;\n                    list[keys].attrs[0].value = (char *) pkey->listFetch_s;\n                    list[keys].attrs[0].value_len = comment_len;\n                    list[keys].attrs[0].mandatory = 0;\n\n                    pkey->listFetch_s += comment_len;\n                }\n                else {\n                    list[keys].num_attrs = 0;\n                    list[keys].attrs = NULL;\n                }\n\n                if(pkey->listFetch_s + 4 <=\n                    pkey->listFetch_data + pkey->listFetch_data_len) {\n                    list[keys].name_len = _libssh2_ntohu32(pkey->listFetch_s);\n                    pkey->listFetch_s += 4;\n                }\n                else {\n                    _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                   \"ListFetch data too short\");\n                    goto err_exit;\n                }\n\n                if(pkey->listFetch_s + list[keys].name_len <=\n                   pkey->listFetch_data + pkey->listFetch_data_len) {\n                    list[keys].name = pkey->listFetch_s;\n                    pkey->listFetch_s += list[keys].name_len;\n                }\n                else {\n                    _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                   \"ListFetch data too short\");\n                    goto err_exit;\n                }\n\n                if(pkey->listFetch_s + 4 <=\n                   pkey->listFetch_data + pkey->listFetch_data_len) {\n                    list[keys].blob_len = _libssh2_ntohu32(pkey->listFetch_s);\n                    pkey->listFetch_s += 4;\n                }\n                else {\n                    _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                   \"ListFetch data too short\");\n                    goto err_exit;\n                }\n\n                if(pkey->listFetch_s + list[keys].blob_len <=\n                   pkey->listFetch_data + pkey->listFetch_data_len) {\n                    list[keys].blob = pkey->listFetch_s;\n                    pkey->listFetch_s += list[keys].blob_len;\n                }\n                else {\n                    _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                   \"ListFetch data too short\");\n                    goto err_exit;\n                }\n            }\n            else {\n                /* Version == 2 */\n\n                if(pkey->listFetch_s + 4 <=\n                   pkey->listFetch_data + pkey->listFetch_data_len) {\n                    list[keys].name_len = _libssh2_ntohu32(pkey->listFetch_s);\n                    pkey->listFetch_s += 4;\n                }\n                else {\n                    _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                   \"ListFetch data too short\");\n                    goto err_exit;\n                }\n\n                if(pkey->listFetch_s + list[keys].name_len <=\n                   pkey->listFetch_data + pkey->listFetch_data_len) {\n                    list[keys].name = pkey->listFetch_s;\n                    pkey->listFetch_s += list[keys].name_len;\n                }\n                else {\n                    _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                   \"ListFetch data too short\");\n                    goto err_exit;\n                }\n\n                if(pkey->listFetch_s + 4 <=\n                   pkey->listFetch_data + pkey->listFetch_data_len) {\n                    list[keys].blob_len = _libssh2_ntohu32(pkey->listFetch_s);\n                    pkey->listFetch_s += 4;\n                }\n                else {\n                    _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                   \"ListFetch data too short\");\n                    goto err_exit;\n                }\n\n                if(pkey->listFetch_s + list[keys].blob_len <=\n                   pkey->listFetch_data + pkey->listFetch_data_len) {\n                    list[keys].blob = pkey->listFetch_s;\n                    pkey->listFetch_s += list[keys].blob_len;\n                }\n                else {\n                    _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                   \"ListFetch data too short\");\n                    goto err_exit;\n                }\n\n                if(pkey->listFetch_s + 4 <=\n                   pkey->listFetch_data + pkey->listFetch_data_len) {\n                    list[keys].num_attrs = _libssh2_ntohu32(pkey->listFetch_s);\n                    pkey->listFetch_s += 4;\n                }\n                else {\n                    _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                   \"ListFetch data too short\");\n                    goto err_exit;\n                }\n\n                if(list[keys].num_attrs) {\n                    list[keys].attrs =\n                        LIBSSH2_ALLOC(session,\n                                      list[keys].num_attrs *\n                                      sizeof(libssh2_publickey_attribute));\n                    if(!list[keys].attrs) {\n                        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                       \"Unable to allocate memory for \"\n                                       \"publickey attributes\");\n                        goto err_exit;\n                    }\n                    for(i = 0; i < list[keys].num_attrs; i++) {\n                        if(pkey->listFetch_s + 4 <=\n                           pkey->listFetch_data + pkey->listFetch_data_len) {\n                            list[keys].attrs[i].name_len =\n                                _libssh2_ntohu32(pkey->listFetch_s);\n                            pkey->listFetch_s += 4;\n                        }\n                        else {\n                            _libssh2_error(session,\n                                           LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                           \"ListFetch data too short\");\n                            goto err_exit;\n                        }\n\n                        if(pkey->listFetch_s + list[keys].attrs[i].name_len <=\n                           pkey->listFetch_data + pkey->listFetch_data_len) {\n                            list[keys].attrs[i].name =\n                                (char *) pkey->listFetch_s;\n                            pkey->listFetch_s += list[keys].attrs[i].name_len;\n                        }\n                        else {\n                            _libssh2_error(session,\n                                           LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                           \"ListFetch data too short\");\n                            goto err_exit;\n                        }\n\n                        if(pkey->listFetch_s + 4 <=\n                           pkey->listFetch_data + pkey->listFetch_data_len) {\n                            list[keys].attrs[i].value_len =\n                                _libssh2_ntohu32(pkey->listFetch_s);\n                            pkey->listFetch_s += 4;\n                        }\n                        else {\n                            _libssh2_error(session,\n                                           LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                           \"ListFetch data too short\");\n                            goto err_exit;\n                        }\n\n                        if(pkey->listFetch_s +\n                           list[keys].attrs[i].value_len <=\n                           pkey->listFetch_data + pkey->listFetch_data_len) {\n                            list[keys].attrs[i].value =\n                                (char *) pkey->listFetch_s;\n                            pkey->listFetch_s += list[keys].attrs[i].value_len;\n                        }\n                        else {\n                            _libssh2_error(session,\n                                           LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                           \"ListFetch data too short\");\n                            goto err_exit;\n                        }\n\n                        /* actually an ignored value */\n                        list[keys].attrs[i].mandatory = 0;\n                    }\n                }\n                else {\n                    list[keys].attrs = NULL;\n                }\n            }\n            /* To be FREEd in libssh2_publickey_list_free() */\n            list[keys].packet = pkey->listFetch_data;\n            keys++;\n\n            list[keys].packet = NULL;   /* Terminate the list */\n            pkey->listFetch_data = NULL;\n            break;\n        default:\n            /* Unknown/Unexpected */\n            _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL,\n                           \"Unexpected publickey subsystem response\");\n            LIBSSH2_FREE(session, pkey->listFetch_data);\n            pkey->listFetch_data = NULL;\n        }\n    }\n\n    /* Only reached via explicit goto */\n  err_exit:\n    if(pkey->listFetch_data) {\n        LIBSSH2_FREE(session, pkey->listFetch_data);\n        pkey->listFetch_data = NULL;\n    }\n    if(list) {\n        libssh2_publickey_list_free(pkey, list);\n    }\n    pkey->listFetch_state = libssh2_NB_state_idle;\n    return -1;\n}\n\n/* libssh2_publickey_list_free\n * Free a previously fetched list of public keys\n */\nLIBSSH2_API void\nlibssh2_publickey_list_free(LIBSSH2_PUBLICKEY * pkey,\n                            libssh2_publickey_list * pkey_list)\n{\n    LIBSSH2_SESSION *session;\n    libssh2_publickey_list *p = pkey_list;\n\n    if(!pkey || !p)\n        return;\n\n    session = pkey->channel->session;\n\n    while(p->packet) {\n        if(p->attrs) {\n            LIBSSH2_FREE(session, p->attrs);\n        }\n        LIBSSH2_FREE(session, p->packet);\n        p++;\n    }\n\n    LIBSSH2_FREE(session, pkey_list);\n}\n\n/* libssh2_publickey_shutdown\n * Shutdown the publickey subsystem\n */\nLIBSSH2_API int\nlibssh2_publickey_shutdown(LIBSSH2_PUBLICKEY *pkey)\n{\n    LIBSSH2_SESSION *session;\n    int rc;\n\n    if(!pkey)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    session = pkey->channel->session;\n\n    /*\n     * Make sure all memory used in the state variables are free\n     */\n    if(pkey->receive_packet) {\n        LIBSSH2_FREE(session, pkey->receive_packet);\n        pkey->receive_packet = NULL;\n    }\n    if(pkey->add_packet) {\n        LIBSSH2_FREE(session, pkey->add_packet);\n        pkey->add_packet = NULL;\n    }\n    if(pkey->remove_packet) {\n        LIBSSH2_FREE(session, pkey->remove_packet);\n        pkey->remove_packet = NULL;\n    }\n    if(pkey->listFetch_data) {\n        LIBSSH2_FREE(session, pkey->listFetch_data);\n        pkey->listFetch_data = NULL;\n    }\n\n    rc = _libssh2_channel_free(pkey->channel);\n    if(rc == LIBSSH2_ERROR_EAGAIN)\n        return rc;\n\n    LIBSSH2_FREE(session, pkey);\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/scp.c",
    "content": "/* Copyright (c) 2009-2019 by Daniel Stenberg\n * Copyright (c) 2004-2008, Sara Golemon <sarag@libssh2.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include <errno.h>\n#include <stdlib.h>\n\n#include \"channel.h\"\n#include \"session.h\"\n\n\n/* Max. length of a quoted string after libssh2_shell_quotearg() processing */\n#define _libssh2_shell_quotedsize(s)     (3 * strlen(s) + 2)\n\n/*\n  This function quotes a string in a way suitable to be used with a\n  shell, e.g. the file name\n  one two\n  becomes\n  'one two'\n\n  The resulting output string is crafted in a way that makes it usable\n  with the two most common shell types: Bourne Shell derived shells\n  (sh, ksh, ksh93, bash, zsh) and C-Shell derivates (csh, tcsh).\n\n  The following special cases are handled:\n  o  If the string contains an apostrophy itself, the apostrophy\n  character is written in quotation marks, e.g. \"'\".\n  The shell cannot handle the syntax 'doesn\\'t', so we close the\n  current argument word, add the apostrophe in quotation marks \"\",\n  and open a new argument word instead (_ indicate the input\n  string characters):\n  _____   _   _\n  'doesn' \"'\" 't'\n\n  Sequences of apostrophes are combined in one pair of quotation marks:\n  a'''b\n  becomes\n  _  ___  _\n  'a'\"'''\"'b'\n\n  o  If the string contains an exclamation mark (!), the C-Shell\n  interprets it as an event number. Using \\! (not within quotation\n  marks or single quotation marks) is a mechanism understood by\n  both Bourne Shell and C-Shell.\n\n  If a quotation was already started, the argument word is closed\n  first:\n  a!b\n\n  become\n  _  _ _\n  'a'\\!'b'\n\n  The result buffer must be large enough for the expanded result. A\n  bad case regarding expansion is alternating characters and\n  apostrophes:\n\n  a'b'c'd'                   (length 8) gets converted to\n  'a'\"'\"'b'\"'\"'c'\"'\"'d'\"'\"   (length 24)\n\n  This is the worst case.\n\n  Maximum length of the result:\n  1 + 6 * (length(input) + 1) / 2) + 1\n\n  => 3 * length(input) + 2\n\n  Explanation:\n  o  leading apostrophe\n  o  one character / apostrophe pair (two characters) can get\n  represented as 6 characters: a' -> a'\"'\"'\n  o  String terminator (+1)\n\n  A result buffer three times the size of the input buffer + 2\n  characters should be safe.\n\n  References:\n  o  csh-compatible quotation (special handling for '!' etc.), see\n  http://www.grymoire.com/Unix/Csh.html#toc-uh-10\n\n  Return value:\n  Length of the resulting string (not counting the terminating '\\0'),\n  or 0 in case of errors, e.g. result buffer too small\n\n  Note: this function could possible be used elsewhere within libssh2, but\n  until then it is kept static and in this source file.\n*/\n\nstatic unsigned\nshell_quotearg(const char *path, unsigned char *buf,\n               unsigned bufsize)\n{\n    const char *src;\n    unsigned char *dst, *endp;\n\n    /*\n     * Processing States:\n     *  UQSTRING:       unquoted string: ... -- used for quoting exclamation\n     *                  marks. This is the initial state\n     *  SQSTRING:       single-quoted-string: '... -- any character may follow\n     *  QSTRING:        quoted string: \"... -- only apostrophes may follow\n     */\n    enum { UQSTRING, SQSTRING, QSTRING } state = UQSTRING;\n\n    endp = &buf[bufsize];\n    src = path;\n    dst = buf;\n    while(*src && dst < endp - 1) {\n\n        switch(*src) {\n            /*\n             * Special handling for apostrophe.\n             * An apostrophe is always written in quotation marks, e.g.\n             * ' -> \"'\".\n             */\n\n        case '\\'':\n            switch(state) {\n            case UQSTRING:      /* Unquoted string */\n                if(dst + 1 >= endp)\n                    return 0;\n                *dst++ = '\"';\n                break;\n            case QSTRING:       /* Continue quoted string */\n                break;\n            case SQSTRING:      /* Close single quoted string */\n                if(dst + 2 >= endp)\n                    return 0;\n                *dst++ = '\\'';\n                *dst++ = '\"';\n                break;\n            default:\n                break;\n            }\n            state = QSTRING;\n            break;\n\n            /*\n             * Special handling for exclamation marks. CSH interprets\n             * exclamation marks even when quoted with apostrophes. We convert\n             * it to the plain string \\!, because both Bourne Shell and CSH\n             * interpret that as a verbatim exclamation mark.\n             */\n\n        case '!':\n            switch(state) {\n            case UQSTRING:\n                if(dst + 1 >= endp)\n                    return 0;\n                *dst++ = '\\\\';\n                break;\n            case QSTRING:\n                if(dst + 2 >= endp)\n                    return 0;\n                *dst++ = '\"';           /* Closing quotation mark */\n                *dst++ = '\\\\';\n                break;\n            case SQSTRING:              /* Close single quoted string */\n                if(dst + 2 >= endp)\n                    return 0;\n                *dst++ = '\\'';\n                *dst++ = '\\\\';\n                break;\n            default:\n                break;\n            }\n            state = UQSTRING;\n            break;\n\n            /*\n             * Ordinary character: prefer single-quoted string\n             */\n\n        default:\n            switch(state) {\n            case UQSTRING:\n                if(dst + 1 >= endp)\n                    return 0;\n                *dst++ = '\\'';\n                break;\n            case QSTRING:\n                if(dst + 2 >= endp)\n                    return 0;\n                *dst++ = '\"';           /* Closing quotation mark */\n                *dst++ = '\\'';\n                break;\n            case SQSTRING:      /* Continue single quoted string */\n                break;\n            default:\n                break;\n            }\n            state = SQSTRING;   /* Start single-quoted string */\n            break;\n        }\n\n        if(dst + 1 >= endp)\n            return 0;\n        *dst++ = *src++;\n    }\n\n    switch(state) {\n    case UQSTRING:\n        break;\n    case QSTRING:           /* Close quoted string */\n        if(dst + 1 >= endp)\n            return 0;\n        *dst++ = '\"';\n        break;\n    case SQSTRING:          /* Close single quoted string */\n        if(dst + 1 >= endp)\n            return 0;\n        *dst++ = '\\'';\n        break;\n    default:\n        break;\n    }\n\n    if(dst + 1 >= endp)\n        return 0;\n    *dst = '\\0';\n\n    /* The result cannot be larger than 3 * strlen(path) + 2 */\n    /* assert((dst - buf) <= (3 * (src - path) + 2)); */\n\n    return dst - buf;\n}\n\n/*\n * scp_recv\n *\n * Open a channel and request a remote file via SCP\n *\n */\nstatic LIBSSH2_CHANNEL *\nscp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb)\n{\n    int cmd_len;\n    int rc;\n    int tmp_err_code;\n    const char *tmp_err_msg;\n\n    if(session->scpRecv_state == libssh2_NB_state_idle) {\n        session->scpRecv_mode = 0;\n        session->scpRecv_size = 0;\n        session->scpRecv_mtime = 0;\n        session->scpRecv_atime = 0;\n\n        session->scpRecv_command_len =\n            _libssh2_shell_quotedsize(path) + sizeof(\"scp -f \") + (sb?1:0);\n\n        session->scpRecv_command =\n            LIBSSH2_ALLOC(session, session->scpRecv_command_len);\n\n        if(!session->scpRecv_command) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate a command buffer for \"\n                           \"SCP session\");\n            return NULL;\n        }\n\n        snprintf((char *)session->scpRecv_command,\n                 session->scpRecv_command_len,\n                 \"scp -%sf \", sb?\"p\":\"\");\n\n        cmd_len = strlen((char *)session->scpRecv_command);\n        cmd_len += shell_quotearg(path,\n                                  &session->scpRecv_command[cmd_len],\n                                  session->scpRecv_command_len - cmd_len);\n\n        /* the command to exec should _not_ be NUL-terminated */\n        session->scpRecv_command_len = cmd_len;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_SCP,\n                       \"Opening channel for SCP receive\");\n\n        session->scpRecv_state = libssh2_NB_state_created;\n    }\n\n    if(session->scpRecv_state == libssh2_NB_state_created) {\n        /* Allocate a channel */\n        session->scpRecv_channel =\n            _libssh2_channel_open(session, \"session\",\n                                  sizeof(\"session\") - 1,\n                                  LIBSSH2_CHANNEL_WINDOW_DEFAULT,\n                                  LIBSSH2_CHANNEL_PACKET_DEFAULT, NULL,\n                                  0);\n        if(!session->scpRecv_channel) {\n            if(libssh2_session_last_errno(session) !=\n                LIBSSH2_ERROR_EAGAIN) {\n                LIBSSH2_FREE(session, session->scpRecv_command);\n                session->scpRecv_command = NULL;\n                session->scpRecv_state = libssh2_NB_state_idle;\n            }\n            else {\n                _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                               \"Would block starting up channel\");\n            }\n            return NULL;\n        }\n\n        session->scpRecv_state = libssh2_NB_state_sent;\n    }\n\n    if(session->scpRecv_state == libssh2_NB_state_sent) {\n        /* Request SCP for the desired file */\n        rc = _libssh2_channel_process_startup(session->scpRecv_channel, \"exec\",\n                                              sizeof(\"exec\") - 1,\n                                              (char *)session->scpRecv_command,\n                                              session->scpRecv_command_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block requesting SCP startup\");\n            return NULL;\n        }\n        else if(rc) {\n            LIBSSH2_FREE(session, session->scpRecv_command);\n            session->scpRecv_command = NULL;\n            goto scp_recv_error;\n        }\n        LIBSSH2_FREE(session, session->scpRecv_command);\n        session->scpRecv_command = NULL;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_SCP, \"Sending initial wakeup\");\n        /* SCP ACK */\n        session->scpRecv_response[0] = '\\0';\n\n        session->scpRecv_state = libssh2_NB_state_sent1;\n    }\n\n    if(session->scpRecv_state == libssh2_NB_state_sent1) {\n        rc = _libssh2_channel_write(session->scpRecv_channel, 0,\n                                    session->scpRecv_response, 1);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block sending initial wakeup\");\n            return NULL;\n        }\n        else if(rc != 1) {\n            goto scp_recv_error;\n        }\n\n        /* Parse SCP response */\n        session->scpRecv_response_len = 0;\n\n        session->scpRecv_state = libssh2_NB_state_sent2;\n    }\n\n    if((session->scpRecv_state == libssh2_NB_state_sent2)\n        || (session->scpRecv_state == libssh2_NB_state_sent3)) {\n        while(sb && (session->scpRecv_response_len <\n                      LIBSSH2_SCP_RESPONSE_BUFLEN)) {\n            unsigned char *s, *p;\n\n            if(session->scpRecv_state == libssh2_NB_state_sent2) {\n                rc = _libssh2_channel_read(session->scpRecv_channel, 0,\n                                           (char *) session->\n                                           scpRecv_response +\n                                           session->scpRecv_response_len, 1);\n                if(rc == LIBSSH2_ERROR_EAGAIN) {\n                    _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                   \"Would block waiting for SCP response\");\n                    return NULL;\n                }\n                else if(rc < 0) {\n                    /* error, give up */\n                    _libssh2_error(session, rc, \"Failed reading SCP response\");\n                    goto scp_recv_error;\n                }\n                else if(rc == 0)\n                    goto scp_recv_empty_channel;\n\n                session->scpRecv_response_len++;\n\n                if(session->scpRecv_response[0] != 'T') {\n                    size_t err_len;\n                    char *err_msg;\n\n                    /* there can be\n                       01 for warnings\n                       02 for errors\n\n                       The following string MUST be newline terminated\n                    */\n                    err_len =\n                        _libssh2_channel_packet_data_len(session->\n                                                         scpRecv_channel, 0);\n                    err_msg = LIBSSH2_ALLOC(session, err_len + 1);\n                    if(!err_msg) {\n                        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                       \"Failed to get memory \");\n                        goto scp_recv_error;\n                    }\n\n                    /* Read the remote error message */\n                    (void)_libssh2_channel_read(session->scpRecv_channel, 0,\n                                                err_msg, err_len);\n                    /* If it failed for any reason, we ignore it anyway. */\n\n                    /* zero terminate the error */\n                    err_msg[err_len] = 0;\n\n                    _libssh2_debug(session, LIBSSH2_TRACE_SCP,\n                                   \"got %02x %s\", session->scpRecv_response[0],\n                                   err_msg);\n\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Failed to recv file\");\n\n                    LIBSSH2_FREE(session, err_msg);\n                    goto scp_recv_error;\n                }\n\n                if((session->scpRecv_response_len > 1) &&\n                    ((session->\n                      scpRecv_response[session->scpRecv_response_len - 1] <\n                      '0')\n                     || (session->\n                         scpRecv_response[session->scpRecv_response_len - 1] >\n                         '9'))\n                    && (session->\n                        scpRecv_response[session->scpRecv_response_len - 1] !=\n                        ' ')\n                    && (session->\n                        scpRecv_response[session->scpRecv_response_len - 1] !=\n                        '\\r')\n                    && (session->\n                        scpRecv_response[session->scpRecv_response_len - 1] !=\n                        '\\n')) {\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid data in SCP response\");\n                    goto scp_recv_error;\n                }\n\n                if((session->scpRecv_response_len < 9)\n                    || (session->\n                        scpRecv_response[session->scpRecv_response_len - 1] !=\n                        '\\n')) {\n                    if(session->scpRecv_response_len ==\n                        LIBSSH2_SCP_RESPONSE_BUFLEN) {\n                        /* You had your chance */\n                        _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                       \"Unterminated response from \"\n                                       \"SCP server\");\n                        goto scp_recv_error;\n                    }\n                    /* Way too short to be an SCP response, or not done yet,\n                       short circuit */\n                    continue;\n                }\n\n                /* We're guaranteed not to go under response_len == 0 by the\n                   logic above */\n                while((session->\n                        scpRecv_response[session->scpRecv_response_len - 1] ==\n                        '\\r')\n                       || (session->\n                           scpRecv_response[session->scpRecv_response_len -\n                                            1] == '\\n'))\n                    session->scpRecv_response_len--;\n                session->scpRecv_response[session->scpRecv_response_len] =\n                    '\\0';\n\n                if(session->scpRecv_response_len < 8) {\n                    /* EOL came too soon */\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, \"\n                                   \"too short\");\n                    goto scp_recv_error;\n                }\n\n                s = session->scpRecv_response + 1;\n\n                p = (unsigned char *) strchr((char *) s, ' ');\n                if(!p || ((p - s) <= 0)) {\n                    /* No spaces or space in the wrong spot */\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, \"\n                                   \"malformed mtime\");\n                    goto scp_recv_error;\n                }\n\n                *(p++) = '\\0';\n                /* Make sure we don't get fooled by leftover values */\n                session->scpRecv_mtime = strtol((char *) s, NULL, 10);\n\n                s = (unsigned char *) strchr((char *) p, ' ');\n                if(!s || ((s - p) <= 0)) {\n                    /* No spaces or space in the wrong spot */\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, \"\n                                   \"malformed mtime.usec\");\n                    goto scp_recv_error;\n                }\n\n                /* Ignore mtime.usec */\n                s++;\n                p = (unsigned char *) strchr((char *) s, ' ');\n                if(!p || ((p - s) <= 0)) {\n                    /* No spaces or space in the wrong spot */\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, \"\n                                   \"too short or malformed\");\n                    goto scp_recv_error;\n                }\n\n                *p = '\\0';\n                /* Make sure we don't get fooled by leftover values */\n                session->scpRecv_atime = strtol((char *) s, NULL, 10);\n\n                /* SCP ACK */\n                session->scpRecv_response[0] = '\\0';\n\n                session->scpRecv_state = libssh2_NB_state_sent3;\n            }\n\n            if(session->scpRecv_state == libssh2_NB_state_sent3) {\n                rc = _libssh2_channel_write(session->scpRecv_channel, 0,\n                                            session->scpRecv_response, 1);\n                if(rc == LIBSSH2_ERROR_EAGAIN) {\n                    _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                   \"Would block waiting to send SCP ACK\");\n                    return NULL;\n                }\n                else if(rc != 1) {\n                    goto scp_recv_error;\n                }\n\n                _libssh2_debug(session, LIBSSH2_TRACE_SCP,\n                               \"mtime = %ld, atime = %ld\",\n                               session->scpRecv_mtime, session->scpRecv_atime);\n\n                /* We *should* check that atime.usec is valid, but why let\n                   that stop use? */\n                break;\n            }\n        }\n\n        session->scpRecv_state = libssh2_NB_state_sent4;\n    }\n\n    if(session->scpRecv_state == libssh2_NB_state_sent4) {\n        session->scpRecv_response_len = 0;\n\n        session->scpRecv_state = libssh2_NB_state_sent5;\n    }\n\n    if((session->scpRecv_state == libssh2_NB_state_sent5)\n        || (session->scpRecv_state == libssh2_NB_state_sent6)) {\n        while(session->scpRecv_response_len < LIBSSH2_SCP_RESPONSE_BUFLEN) {\n            char *s, *p, *e = NULL;\n\n            if(session->scpRecv_state == libssh2_NB_state_sent5) {\n                rc = _libssh2_channel_read(session->scpRecv_channel, 0,\n                                           (char *) session->\n                                           scpRecv_response +\n                                           session->scpRecv_response_len, 1);\n                if(rc == LIBSSH2_ERROR_EAGAIN) {\n                    _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                   \"Would block waiting for SCP response\");\n                    return NULL;\n                }\n                else if(rc < 0) {\n                    /* error, bail out*/\n                    _libssh2_error(session, rc, \"Failed reading SCP response\");\n                    goto scp_recv_error;\n                }\n                else if(rc == 0)\n                    goto scp_recv_empty_channel;\n\n                session->scpRecv_response_len++;\n\n                if(session->scpRecv_response[0] != 'C') {\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server\");\n                    goto scp_recv_error;\n                }\n\n                if((session->scpRecv_response_len > 1) &&\n                    (session->\n                     scpRecv_response[session->scpRecv_response_len - 1] !=\n                     '\\r')\n                    && (session->\n                        scpRecv_response[session->scpRecv_response_len - 1] !=\n                        '\\n')\n                    &&\n                    (session->\n                     scpRecv_response[session->scpRecv_response_len - 1]\n                     < 32)) {\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid data in SCP response\");\n                    goto scp_recv_error;\n                }\n\n                if((session->scpRecv_response_len < 7)\n                    || (session->\n                        scpRecv_response[session->scpRecv_response_len - 1] !=\n                        '\\n')) {\n                    if(session->scpRecv_response_len ==\n                        LIBSSH2_SCP_RESPONSE_BUFLEN) {\n                        /* You had your chance */\n                        _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                       \"Unterminated response \"\n                                       \"from SCP server\");\n                        goto scp_recv_error;\n                    }\n                    /* Way too short to be an SCP response, or not done yet,\n                       short circuit */\n                    continue;\n                }\n\n                /* We're guaranteed not to go under response_len == 0 by the\n                   logic above */\n                while((session->\n                        scpRecv_response[session->scpRecv_response_len - 1] ==\n                        '\\r')\n                       || (session->\n                           scpRecv_response[session->scpRecv_response_len -\n                                            1] == '\\n')) {\n                    session->scpRecv_response_len--;\n                }\n                session->scpRecv_response[session->scpRecv_response_len] =\n                    '\\0';\n\n                if(session->scpRecv_response_len < 6) {\n                    /* EOL came too soon */\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, \"\n                                   \"too short\");\n                    goto scp_recv_error;\n                }\n\n                s = (char *) session->scpRecv_response + 1;\n\n                p = strchr(s, ' ');\n                if(!p || ((p - s) <= 0)) {\n                    /* No spaces or space in the wrong spot */\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, \"\n                                   \"malformed mode\");\n                    goto scp_recv_error;\n                }\n\n                *(p++) = '\\0';\n                /* Make sure we don't get fooled by leftover values */\n\n                session->scpRecv_mode = strtol(s, &e, 8);\n                if(e && *e) {\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, \"\n                                   \"invalid mode\");\n                    goto scp_recv_error;\n                }\n\n                s = strchr(p, ' ');\n                if(!s || ((s - p) <= 0)) {\n                    /* No spaces or space in the wrong spot */\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, \"\n                                   \"too short or malformed\");\n                    goto scp_recv_error;\n                }\n\n                *s = '\\0';\n                /* Make sure we don't get fooled by leftover values */\n                session->scpRecv_size = scpsize_strtol(p, &e, 10);\n                if(e && *e) {\n                    _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                                   \"Invalid response from SCP server, \"\n                                   \"invalid size\");\n                    goto scp_recv_error;\n                }\n\n                /* SCP ACK */\n                session->scpRecv_response[0] = '\\0';\n\n                session->scpRecv_state = libssh2_NB_state_sent6;\n            }\n\n            if(session->scpRecv_state == libssh2_NB_state_sent6) {\n                rc = _libssh2_channel_write(session->scpRecv_channel, 0,\n                                            session->scpRecv_response, 1);\n                if(rc == LIBSSH2_ERROR_EAGAIN) {\n                    _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                   \"Would block sending SCP ACK\");\n                    return NULL;\n                }\n                else if(rc != 1) {\n                    goto scp_recv_error;\n                }\n                _libssh2_debug(session, LIBSSH2_TRACE_SCP,\n                               \"mode = 0%lo size = %ld\", session->scpRecv_mode,\n                               session->scpRecv_size);\n\n                /* We *should* check that basename is valid, but why let that\n                   stop us? */\n                break;\n            }\n        }\n\n        session->scpRecv_state = libssh2_NB_state_sent7;\n    }\n\n    if(sb) {\n        memset(sb, 0, sizeof(libssh2_struct_stat));\n\n        sb->st_mtime = session->scpRecv_mtime;\n        sb->st_atime = session->scpRecv_atime;\n        sb->st_size = session->scpRecv_size;\n        sb->st_mode = (unsigned short)session->scpRecv_mode;\n    }\n\n    session->scpRecv_state = libssh2_NB_state_idle;\n    return session->scpRecv_channel;\n\n  scp_recv_empty_channel:\n    /* the code only jumps here as a result of a zero read from channel_read()\n       so we check EOF status to avoid getting stuck in a loop */\n    if(libssh2_channel_eof(session->scpRecv_channel))\n        _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                       \"Unexpected channel close\");\n    else\n        return session->scpRecv_channel;\n    /* fall-through */\n  scp_recv_error:\n    tmp_err_code = session->err_code;\n    tmp_err_msg = session->err_msg;\n    while(libssh2_channel_free(session->scpRecv_channel) ==\n           LIBSSH2_ERROR_EAGAIN);\n    session->err_code = tmp_err_code;\n    session->err_msg = tmp_err_msg;\n    session->scpRecv_channel = NULL;\n    session->scpRecv_state = libssh2_NB_state_idle;\n    return NULL;\n}\n\n/*\n * libssh2_scp_recv\n *\n * DEPRECATED\n *\n * Open a channel and request a remote file via SCP.  This receives files\n * larger than 2 GB, but is unable to report the proper size on platforms\n * where the st_size member of struct stat is limited to 2 GB (e.g. windows).\n *\n */\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_scp_recv(LIBSSH2_SESSION *session, const char *path, struct stat * sb)\n{\n    LIBSSH2_CHANNEL *ptr;\n\n    /* scp_recv uses libssh2_struct_stat, so pass one if the caller gave us a\n       struct to populate... */\n    libssh2_struct_stat sb_intl;\n    libssh2_struct_stat *sb_ptr;\n    memset(&sb_intl, 0, sizeof(sb_intl));\n    sb_ptr = sb ? &sb_intl : NULL;\n\n    BLOCK_ADJUST_ERRNO(ptr, session, scp_recv(session, path, sb_ptr));\n\n    /* ...and populate the caller's with as much info as fits. */\n    if(sb) {\n        memset(sb, 0, sizeof(struct stat));\n\n        sb->st_mtime = sb_intl.st_mtime;\n        sb->st_atime = sb_intl.st_atime;\n        sb->st_size = (off_t)sb_intl.st_size;\n        sb->st_mode = sb_intl.st_mode;\n    }\n\n    return ptr;\n}\n\n/*\n * libssh2_scp_recv2\n *\n * Open a channel and request a remote file via SCP.  This supports files > 2GB\n * on platforms that support it.\n *\n */\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_scp_recv2(LIBSSH2_SESSION *session, const char *path,\n                  libssh2_struct_stat *sb)\n{\n    LIBSSH2_CHANNEL *ptr;\n    BLOCK_ADJUST_ERRNO(ptr, session, scp_recv(session, path, sb));\n    return ptr;\n}\n\n/*\n * scp_send()\n *\n * Send a file using SCP\n *\n */\nstatic LIBSSH2_CHANNEL *\nscp_send(LIBSSH2_SESSION * session, const char *path, int mode,\n         libssh2_int64_t size, time_t mtime, time_t atime)\n{\n    int cmd_len;\n    int rc;\n    int tmp_err_code;\n    const char *tmp_err_msg;\n\n    if(session->scpSend_state == libssh2_NB_state_idle) {\n        session->scpSend_command_len =\n            _libssh2_shell_quotedsize(path) + sizeof(\"scp -t \") +\n            ((mtime || atime)?1:0);\n\n        session->scpSend_command =\n            LIBSSH2_ALLOC(session, session->scpSend_command_len);\n\n        if(!session->scpSend_command) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate a command buffer for \"\n                           \"SCP session\");\n            return NULL;\n        }\n\n        snprintf((char *)session->scpSend_command,\n                 session->scpSend_command_len,\n                 \"scp -%st \", (mtime || atime)?\"p\":\"\");\n\n        cmd_len = strlen((char *)session->scpSend_command);\n        cmd_len += shell_quotearg(path,\n                                  &session->scpSend_command[cmd_len],\n                                  session->scpSend_command_len - cmd_len);\n\n        /* the command to exec should _not_ be NUL-terminated */\n        session->scpSend_command_len = cmd_len;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_SCP,\n                       \"Opening channel for SCP send\");\n        /* Allocate a channel */\n\n        session->scpSend_state = libssh2_NB_state_created;\n    }\n\n    if(session->scpSend_state == libssh2_NB_state_created) {\n        session->scpSend_channel =\n            _libssh2_channel_open(session, \"session\", sizeof(\"session\") - 1,\n                                  LIBSSH2_CHANNEL_WINDOW_DEFAULT,\n                                  LIBSSH2_CHANNEL_PACKET_DEFAULT, NULL, 0);\n        if(!session->scpSend_channel) {\n            if(libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN) {\n                /* previous call set libssh2_session_last_error(), pass it\n                   through */\n                LIBSSH2_FREE(session, session->scpSend_command);\n                session->scpSend_command = NULL;\n                session->scpSend_state = libssh2_NB_state_idle;\n            }\n            else {\n                _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                               \"Would block starting up channel\");\n            }\n            return NULL;\n        }\n\n        session->scpSend_state = libssh2_NB_state_sent;\n    }\n\n    if(session->scpSend_state == libssh2_NB_state_sent) {\n        /* Request SCP for the desired file */\n        rc = _libssh2_channel_process_startup(session->scpSend_channel, \"exec\",\n                                              sizeof(\"exec\") - 1,\n                                              (char *)session->scpSend_command,\n                                              session->scpSend_command_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block requesting SCP startup\");\n            return NULL;\n        }\n        else if(rc) {\n            /* previous call set libssh2_session_last_error(), pass it\n               through */\n            LIBSSH2_FREE(session, session->scpSend_command);\n            session->scpSend_command = NULL;\n            _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                           \"Unknown error while getting error string\");\n            goto scp_send_error;\n        }\n        LIBSSH2_FREE(session, session->scpSend_command);\n        session->scpSend_command = NULL;\n\n        session->scpSend_state = libssh2_NB_state_sent1;\n    }\n\n    if(session->scpSend_state == libssh2_NB_state_sent1) {\n        /* Wait for ACK */\n        rc = _libssh2_channel_read(session->scpSend_channel, 0,\n                                   (char *) session->scpSend_response, 1);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block waiting for response from remote\");\n            return NULL;\n        }\n        else if(rc < 0) {\n            _libssh2_error(session, rc, \"SCP failure\");\n            goto scp_send_error;\n        }\n        else if(!rc)\n            /* remain in the same state */\n            goto scp_send_empty_channel;\n        else if(session->scpSend_response[0] != 0) {\n            _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                           \"Invalid ACK response from remote\");\n            goto scp_send_error;\n        }\n        if(mtime || atime) {\n            /* Send mtime and atime to be used for file */\n            session->scpSend_response_len =\n                snprintf((char *) session->scpSend_response,\n                         LIBSSH2_SCP_RESPONSE_BUFLEN, \"T%ld 0 %ld 0\\n\",\n                         (long)mtime, (long)atime);\n            _libssh2_debug(session, LIBSSH2_TRACE_SCP, \"Sent %s\",\n                           session->scpSend_response);\n        }\n\n        session->scpSend_state = libssh2_NB_state_sent2;\n    }\n\n    /* Send mtime and atime to be used for file */\n    if(mtime || atime) {\n        if(session->scpSend_state == libssh2_NB_state_sent2) {\n            rc = _libssh2_channel_write(session->scpSend_channel, 0,\n                                        session->scpSend_response,\n                                        session->scpSend_response_len);\n            if(rc == LIBSSH2_ERROR_EAGAIN) {\n                _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                               \"Would block sending time data for SCP file\");\n                return NULL;\n            }\n            else if(rc != (int)session->scpSend_response_len) {\n                _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                               \"Unable to send time data for SCP file\");\n                goto scp_send_error;\n            }\n\n            session->scpSend_state = libssh2_NB_state_sent3;\n        }\n\n        if(session->scpSend_state == libssh2_NB_state_sent3) {\n            /* Wait for ACK */\n            rc = _libssh2_channel_read(session->scpSend_channel, 0,\n                                       (char *) session->scpSend_response, 1);\n            if(rc == LIBSSH2_ERROR_EAGAIN) {\n                _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                               \"Would block waiting for response\");\n                return NULL;\n            }\n            else if(rc < 0) {\n                _libssh2_error(session, rc, \"SCP failure\");\n                goto scp_send_error;\n            }\n            else if(!rc)\n                /* remain in the same state */\n                goto scp_send_empty_channel;\n            else if(session->scpSend_response[0] != 0) {\n                _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                               \"Invalid SCP ACK response\");\n                goto scp_send_error;\n            }\n\n            session->scpSend_state = libssh2_NB_state_sent4;\n        }\n    }\n    else {\n        if(session->scpSend_state == libssh2_NB_state_sent2) {\n            session->scpSend_state = libssh2_NB_state_sent4;\n        }\n    }\n\n    if(session->scpSend_state == libssh2_NB_state_sent4) {\n        /* Send mode, size, and basename */\n        const char *base = strrchr(path, '/');\n        if(base)\n            base++;\n        else\n            base = path;\n\n        session->scpSend_response_len =\n            snprintf((char *) session->scpSend_response,\n                     LIBSSH2_SCP_RESPONSE_BUFLEN, \"C0%o %\"\n                     LIBSSH2_INT64_T_FORMAT \" %s\\n\", mode,\n                     size, base);\n        _libssh2_debug(session, LIBSSH2_TRACE_SCP, \"Sent %s\",\n                       session->scpSend_response);\n\n        session->scpSend_state = libssh2_NB_state_sent5;\n    }\n\n    if(session->scpSend_state == libssh2_NB_state_sent5) {\n        rc = _libssh2_channel_write(session->scpSend_channel, 0,\n                                    session->scpSend_response,\n                                    session->scpSend_response_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block send core file data for SCP file\");\n            return NULL;\n        }\n        else if(rc != (int)session->scpSend_response_len) {\n            _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                           \"Unable to send core file data for SCP file\");\n            goto scp_send_error;\n        }\n\n        session->scpSend_state = libssh2_NB_state_sent6;\n    }\n\n    if(session->scpSend_state == libssh2_NB_state_sent6) {\n        /* Wait for ACK */\n        rc = _libssh2_channel_read(session->scpSend_channel, 0,\n                                   (char *) session->scpSend_response, 1);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block waiting for response\");\n            return NULL;\n        }\n        else if(rc < 0) {\n            _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                           \"Invalid ACK response from remote\");\n            goto scp_send_error;\n        }\n        else if(rc == 0)\n            goto scp_send_empty_channel;\n\n        else if(session->scpSend_response[0] != 0) {\n            size_t err_len;\n            char *err_msg;\n\n            err_len =\n                _libssh2_channel_packet_data_len(session->scpSend_channel, 0);\n            err_msg = LIBSSH2_ALLOC(session, err_len + 1);\n            if(!err_msg) {\n                _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                               \"failed to get memory\");\n                goto scp_send_error;\n            }\n\n            /* Read the remote error message */\n            rc = _libssh2_channel_read(session->scpSend_channel, 0,\n                                       err_msg, err_len);\n            if(rc > 0) {\n                err_msg[err_len] = 0;\n                _libssh2_debug(session, LIBSSH2_TRACE_SCP,\n                               \"got %02x %s\", session->scpSend_response[0],\n                               err_msg);\n            }\n            LIBSSH2_FREE(session, err_msg);\n            _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                           \"failed to send file\");\n            goto scp_send_error;\n        }\n    }\n\n    session->scpSend_state = libssh2_NB_state_idle;\n    return session->scpSend_channel;\n\n  scp_send_empty_channel:\n    /* the code only jumps here as a result of a zero read from channel_read()\n       so we check EOF status to avoid getting stuck in a loop */\n    if(libssh2_channel_eof(session->scpSend_channel)) {\n        _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL,\n                       \"Unexpected channel close\");\n    }\n    else\n        return session->scpSend_channel;\n    /* fall-through */\n  scp_send_error:\n    tmp_err_code = session->err_code;\n    tmp_err_msg = session->err_msg;\n    while(libssh2_channel_free(session->scpSend_channel) ==\n          LIBSSH2_ERROR_EAGAIN);\n    session->err_code = tmp_err_code;\n    session->err_msg = tmp_err_msg;\n    session->scpSend_channel = NULL;\n    session->scpSend_state = libssh2_NB_state_idle;\n    return NULL;\n}\n\n/*\n * libssh2_scp_send_ex\n *\n * Send a file using SCP. Old API.\n */\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_scp_send_ex(LIBSSH2_SESSION *session, const char *path, int mode,\n                    size_t size, long mtime, long atime)\n{\n    LIBSSH2_CHANNEL *ptr;\n    BLOCK_ADJUST_ERRNO(ptr, session,\n                       scp_send(session, path, mode, size,\n                                (time_t)mtime, (time_t)atime));\n    return ptr;\n}\n\n/*\n * libssh2_scp_send64\n *\n * Send a file using SCP\n */\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_scp_send64(LIBSSH2_SESSION *session, const char *path, int mode,\n                   libssh2_int64_t size, time_t mtime, time_t atime)\n{\n    LIBSSH2_CHANNEL *ptr;\n    BLOCK_ADJUST_ERRNO(ptr, session,\n                       scp_send(session, path, mode, size, mtime, atime));\n    return ptr;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/session.c",
    "content": "/* Copyright (c) 2004-2007 Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2009-2015 by Daniel Stenberg\n * Copyright (c) 2010 Simon Josefsson <simon@josefsson.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n#include <errno.h>\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#include <stdlib.h>\n#include <fcntl.h>\n\n#ifdef HAVE_GETTIMEOFDAY\n#include <sys/time.h>\n#endif\n#ifdef HAVE_ALLOCA_H\n#include <alloca.h>\n#endif\n\n#include \"transport.h\"\n#include \"session.h\"\n#include \"channel.h\"\n#include \"mac.h\"\n#include \"misc.h\"\n\n/* libssh2_default_alloc\n */\nstatic\nLIBSSH2_ALLOC_FUNC(libssh2_default_alloc)\n{\n    (void) abstract;\n    return malloc(count);\n}\n\n/* libssh2_default_free\n */\nstatic\nLIBSSH2_FREE_FUNC(libssh2_default_free)\n{\n    (void) abstract;\n    free(ptr);\n}\n\n/* libssh2_default_realloc\n */\nstatic\nLIBSSH2_REALLOC_FUNC(libssh2_default_realloc)\n{\n    (void) abstract;\n    return realloc(ptr, count);\n}\n\n/*\n * banner_receive\n *\n * Wait for a hello from the remote host\n * Allocate a buffer and store the banner in session->remote.banner\n * Returns: 0 on success, LIBSSH2_ERROR_EAGAIN if read would block, negative\n * on failure\n */\nstatic int\nbanner_receive(LIBSSH2_SESSION * session)\n{\n    int ret;\n    int banner_len;\n\n    if(session->banner_TxRx_state == libssh2_NB_state_idle) {\n        banner_len = 0;\n\n        session->banner_TxRx_state = libssh2_NB_state_created;\n    }\n    else {\n        banner_len = session->banner_TxRx_total_send;\n    }\n\n    while((banner_len < (int) sizeof(session->banner_TxRx_banner)) &&\n           ((banner_len == 0)\n            || (session->banner_TxRx_banner[banner_len - 1] != '\\n'))) {\n        char c = '\\0';\n\n        /* no incoming block yet! */\n        session->socket_block_directions &= ~LIBSSH2_SESSION_BLOCK_INBOUND;\n\n        ret = LIBSSH2_RECV(session, &c, 1,\n                            LIBSSH2_SOCKET_RECV_FLAGS(session));\n        if(ret < 0) {\n            if(session->api_block_mode || (ret != -EAGAIN))\n                /* ignore EAGAIN when non-blocking */\n                _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                               \"Error recving %d bytes: %d\", 1, -ret);\n        }\n        else\n            _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                           \"Recved %d bytes banner\", ret);\n\n        if(ret < 0) {\n            if(ret == -EAGAIN) {\n                session->socket_block_directions =\n                    LIBSSH2_SESSION_BLOCK_INBOUND;\n                session->banner_TxRx_total_send = banner_len;\n                return LIBSSH2_ERROR_EAGAIN;\n            }\n\n            /* Some kinda error */\n            session->banner_TxRx_state = libssh2_NB_state_idle;\n            session->banner_TxRx_total_send = 0;\n            return LIBSSH2_ERROR_SOCKET_RECV;\n        }\n\n        if(ret == 0) {\n            session->socket_state = LIBSSH2_SOCKET_DISCONNECTED;\n            return LIBSSH2_ERROR_SOCKET_DISCONNECT;\n        }\n\n        if(c == '\\0') {\n            /* NULLs are not allowed in SSH banners */\n            session->banner_TxRx_state = libssh2_NB_state_idle;\n            session->banner_TxRx_total_send = 0;\n            return LIBSSH2_ERROR_BANNER_RECV;\n        }\n\n        session->banner_TxRx_banner[banner_len++] = c;\n    }\n\n    while(banner_len &&\n           ((session->banner_TxRx_banner[banner_len - 1] == '\\n') ||\n            (session->banner_TxRx_banner[banner_len - 1] == '\\r'))) {\n        banner_len--;\n    }\n\n    /* From this point on, we are done here */\n    session->banner_TxRx_state = libssh2_NB_state_idle;\n    session->banner_TxRx_total_send = 0;\n\n    if(!banner_len)\n        return LIBSSH2_ERROR_BANNER_RECV;\n\n    if(session->remote.banner)\n        LIBSSH2_FREE(session, session->remote.banner);\n\n    session->remote.banner = LIBSSH2_ALLOC(session, banner_len + 1);\n    if(!session->remote.banner) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Error allocating space for remote banner\");\n    }\n    memcpy(session->remote.banner, session->banner_TxRx_banner, banner_len);\n    session->remote.banner[banner_len] = '\\0';\n    _libssh2_debug(session, LIBSSH2_TRACE_TRANS, \"Received Banner: %s\",\n                   session->remote.banner);\n    return LIBSSH2_ERROR_NONE;\n}\n\n/*\n * banner_send\n *\n * Send the default banner, or the one set via libssh2_setopt_string\n *\n * Returns LIBSSH2_ERROR_EAGAIN if it would block - and if it does so, you\n * should call this function again as soon as it is likely that more data can\n * be sent, and this function should then be called with the same argument set\n * (same data pointer and same data_len) until zero or failure is returned.\n */\nstatic int\nbanner_send(LIBSSH2_SESSION * session)\n{\n    char *banner = (char *) LIBSSH2_SSH_DEFAULT_BANNER_WITH_CRLF;\n    int banner_len = sizeof(LIBSSH2_SSH_DEFAULT_BANNER_WITH_CRLF) - 1;\n    ssize_t ret;\n#ifdef LIBSSH2DEBUG\n    char banner_dup[256];\n#endif\n\n    if(session->banner_TxRx_state == libssh2_NB_state_idle) {\n        if(session->local.banner) {\n            /* setopt_string will have given us our \\r\\n characters */\n            banner_len = strlen((char *) session->local.banner);\n            banner = (char *) session->local.banner;\n        }\n#ifdef LIBSSH2DEBUG\n        /* Hack and slash to avoid sending CRLF in debug output */\n        if(banner_len < 256) {\n            memcpy(banner_dup, banner, banner_len - 2);\n            banner_dup[banner_len - 2] = '\\0';\n        }\n        else {\n            memcpy(banner_dup, banner, 255);\n            banner[255] = '\\0';\n        }\n\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS, \"Sending Banner: %s\",\n                       banner_dup);\n#endif\n\n        session->banner_TxRx_state = libssh2_NB_state_created;\n    }\n\n    /* no outgoing block yet! */\n    session->socket_block_directions &= ~LIBSSH2_SESSION_BLOCK_OUTBOUND;\n\n    ret = LIBSSH2_SEND(session,\n                        banner + session->banner_TxRx_total_send,\n                        banner_len - session->banner_TxRx_total_send,\n                        LIBSSH2_SOCKET_SEND_FLAGS(session));\n    if(ret < 0)\n        _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                       \"Error sending %d bytes: %d\",\n                       banner_len - session->banner_TxRx_total_send, -ret);\n    else\n        _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                       \"Sent %d/%d bytes at %p+%d\", ret,\n                       banner_len - session->banner_TxRx_total_send,\n                       banner, session->banner_TxRx_total_send);\n\n    if(ret != (banner_len - session->banner_TxRx_total_send)) {\n        if(ret >= 0 || ret == -EAGAIN) {\n            /* the whole packet could not be sent, save the what was */\n            session->socket_block_directions =\n                LIBSSH2_SESSION_BLOCK_OUTBOUND;\n            if(ret > 0)\n                session->banner_TxRx_total_send += ret;\n            return LIBSSH2_ERROR_EAGAIN;\n        }\n        session->banner_TxRx_state = libssh2_NB_state_idle;\n        session->banner_TxRx_total_send = 0;\n        return LIBSSH2_ERROR_SOCKET_RECV;\n    }\n\n    /* Set the state back to idle */\n    session->banner_TxRx_state = libssh2_NB_state_idle;\n    session->banner_TxRx_total_send = 0;\n\n    return 0;\n}\n\n/*\n * session_nonblock() sets the given socket to either blocking or\n * non-blocking mode based on the 'nonblock' boolean argument. This function\n * is copied from the libcurl sources with permission.\n */\nstatic int\nsession_nonblock(libssh2_socket_t sockfd,   /* operate on this */\n                 int nonblock /* TRUE or FALSE */ )\n{\n#undef SETBLOCK\n#define SETBLOCK 0\n#ifdef HAVE_O_NONBLOCK\n    /* most recent unix versions */\n    int flags;\n\n    flags = fcntl(sockfd, F_GETFL, 0);\n    if(nonblock)\n        return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);\n    else\n        return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));\n#undef SETBLOCK\n#define SETBLOCK 1\n#endif\n\n#if defined(HAVE_FIONBIO) && (SETBLOCK == 0)\n    /* older unix versions and VMS*/\n    int flags;\n\n    flags = nonblock;\n    return ioctl(sockfd, FIONBIO, &flags);\n#undef SETBLOCK\n#define SETBLOCK 2\n#endif\n\n#if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0)\n    /* Windows? */\n    unsigned long flags;\n    flags = nonblock;\n\n    return ioctlsocket(sockfd, FIONBIO, &flags);\n#undef SETBLOCK\n#define SETBLOCK 3\n#endif\n\n#if defined(HAVE_IOCTLSOCKET_CASE) && (SETBLOCK == 0)\n    /* presumably for Amiga */\n    return IoctlSocket(sockfd, FIONBIO, (long) nonblock);\n#undef SETBLOCK\n#define SETBLOCK 4\n#endif\n\n#if defined(HAVE_SO_NONBLOCK) && (SETBLOCK == 0)\n    /* BeOS */\n    long b = nonblock ? 1 : 0;\n    return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));\n#undef SETBLOCK\n#define SETBLOCK 5\n#endif\n\n#ifdef HAVE_DISABLED_NONBLOCKING\n    return 0;                   /* returns success */\n#undef SETBLOCK\n#define SETBLOCK 6\n#endif\n\n#if(SETBLOCK == 0)\n#error \"no non-blocking method was found/used/set\"\n#endif\n}\n\n/*\n * get_socket_nonblocking()\n *\n * gets the given blocking or non-blocking state of the socket.\n */\nstatic int\nget_socket_nonblocking(int sockfd)\n{                               /* operate on this */\n#undef GETBLOCK\n#define GETBLOCK 0\n#ifdef HAVE_O_NONBLOCK\n    /* most recent unix versions */\n    int flags = fcntl(sockfd, F_GETFL, 0);\n\n    if(flags == -1) {\n        /* Assume blocking on error */\n        return 1;\n    }\n    return (flags & O_NONBLOCK);\n#undef GETBLOCK\n#define GETBLOCK 1\n#endif\n\n#if defined(WSAEWOULDBLOCK) && (GETBLOCK == 0)\n    /* Windows? */\n    unsigned int option_value;\n    socklen_t option_len = sizeof(option_value);\n\n    if(getsockopt\n        (sockfd, SOL_SOCKET, SO_ERROR, (void *) &option_value, &option_len)) {\n        /* Assume blocking on error */\n        return 1;\n    }\n    return (int) option_value;\n#undef GETBLOCK\n#define GETBLOCK 2\n#endif\n\n#if defined(HAVE_SO_NONBLOCK) && (GETBLOCK == 0)\n    /* BeOS */\n    long b;\n    if(getsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b))) {\n        /* Assume blocking on error */\n        return 1;\n    }\n    return (int) b;\n#undef GETBLOCK\n#define GETBLOCK 5\n#endif\n\n#if defined(SO_STATE) && defined(__VMS) && (GETBLOCK == 0)\n\n    /* VMS TCP/IP Services */\n\n    size_t sockstat = 0;\n    int    callstat = 0;\n    size_t size = sizeof(int);\n\n    callstat = getsockopt(sockfd, SOL_SOCKET, SO_STATE,\n                                  (char *)&sockstat, &size);\n    if(callstat == -1) return 0;\n    if((sockstat&SS_NBIO) != 0) return 1;\n    return 0;\n\n#undef GETBLOCK\n#define GETBLOCK 6\n#endif\n\n#ifdef HAVE_DISABLED_NONBLOCKING\n    return 1;                   /* returns blocking */\n#undef GETBLOCK\n#define GETBLOCK 7\n#endif\n\n#if(GETBLOCK == 0)\n#error \"no non-blocking method was found/used/get\"\n#endif\n}\n\n/* libssh2_session_banner_set\n * Set the local banner to use in the server handshake.\n */\nLIBSSH2_API int\nlibssh2_session_banner_set(LIBSSH2_SESSION * session, const char *banner)\n{\n    size_t banner_len = banner ? strlen(banner) : 0;\n\n    if(session->local.banner) {\n        LIBSSH2_FREE(session, session->local.banner);\n        session->local.banner = NULL;\n    }\n\n    if(!banner_len)\n        return 0;\n\n    session->local.banner = LIBSSH2_ALLOC(session, banner_len + 3);\n    if(!session->local.banner) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Unable to allocate memory for local banner\");\n    }\n\n    memcpy(session->local.banner, banner, banner_len);\n\n    /* first zero terminate like this so that the debug output is nice */\n    session->local.banner[banner_len] = '\\0';\n    _libssh2_debug(session, LIBSSH2_TRACE_TRANS, \"Setting local Banner: %s\",\n                   session->local.banner);\n    session->local.banner[banner_len++] = '\\r';\n    session->local.banner[banner_len++] = '\\n';\n    session->local.banner[banner_len] = '\\0';\n\n    return 0;\n}\n\n/* libssh2_banner_set\n * Set the local banner. DEPRECATED VERSION\n */\nLIBSSH2_API int\nlibssh2_banner_set(LIBSSH2_SESSION * session, const char *banner)\n{\n    return libssh2_session_banner_set(session, banner);\n}\n\n/*\n * libssh2_session_init_ex\n *\n * Allocate and initialize a libssh2 session structure. Allows for malloc\n * callbacks in case the calling program has its own memory manager It's\n * allowable (but unadvisable) to define some but not all of the malloc\n * callbacks An additional pointer value may be optionally passed to be sent\n * to the callbacks (so they know who's asking)\n */\nLIBSSH2_API LIBSSH2_SESSION *\nlibssh2_session_init_ex(LIBSSH2_ALLOC_FUNC((*my_alloc)),\n                        LIBSSH2_FREE_FUNC((*my_free)),\n                        LIBSSH2_REALLOC_FUNC((*my_realloc)), void *abstract)\n{\n    LIBSSH2_ALLOC_FUNC((*local_alloc)) = libssh2_default_alloc;\n    LIBSSH2_FREE_FUNC((*local_free)) = libssh2_default_free;\n    LIBSSH2_REALLOC_FUNC((*local_realloc)) = libssh2_default_realloc;\n    LIBSSH2_SESSION *session;\n\n    if(my_alloc) {\n        local_alloc = my_alloc;\n    }\n    if(my_free) {\n        local_free = my_free;\n    }\n    if(my_realloc) {\n        local_realloc = my_realloc;\n    }\n\n    session = local_alloc(sizeof(LIBSSH2_SESSION), &abstract);\n    if(session) {\n        memset(session, 0, sizeof(LIBSSH2_SESSION));\n        session->alloc = local_alloc;\n        session->free = local_free;\n        session->realloc = local_realloc;\n        session->send = _libssh2_send;\n        session->recv = _libssh2_recv;\n        session->abstract = abstract;\n        session->api_timeout = 0; /* timeout-free API by default */\n        session->api_block_mode = 1; /* blocking API by default */\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                       \"New session resource allocated\");\n        _libssh2_init_if_needed();\n    }\n    return session;\n}\n\n/*\n * libssh2_session_callback_set\n *\n * Set (or reset) a callback function\n * Returns the prior address\n *\n * ALERT: this function relies on that we can typecast function pointers\n * to void pointers, which isn't allowed in ISO C!\n */\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wpedantic\"\nLIBSSH2_API void *\nlibssh2_session_callback_set(LIBSSH2_SESSION * session,\n                             int cbtype, void *callback)\n{\n    void *oldcb;\n\n    switch(cbtype) {\n    case LIBSSH2_CALLBACK_IGNORE:\n        oldcb = session->ssh_msg_ignore;\n        session->ssh_msg_ignore = callback;\n        return oldcb;\n\n    case LIBSSH2_CALLBACK_DEBUG:\n        oldcb = session->ssh_msg_debug;\n        session->ssh_msg_debug = callback;\n        return oldcb;\n\n    case LIBSSH2_CALLBACK_DISCONNECT:\n        oldcb = session->ssh_msg_disconnect;\n        session->ssh_msg_disconnect = callback;\n        return oldcb;\n\n    case LIBSSH2_CALLBACK_MACERROR:\n        oldcb = session->macerror;\n        session->macerror = callback;\n        return oldcb;\n\n    case LIBSSH2_CALLBACK_X11:\n        oldcb = session->x11;\n        session->x11 = callback;\n        return oldcb;\n\n    case LIBSSH2_CALLBACK_SEND:\n        oldcb = session->send;\n        session->send = callback;\n        return oldcb;\n\n    case LIBSSH2_CALLBACK_RECV:\n        oldcb = session->recv;\n        session->recv = callback;\n        return oldcb;\n    }\n    _libssh2_debug(session, LIBSSH2_TRACE_TRANS, \"Setting Callback %d\",\n                   cbtype);\n\n    return NULL;\n}\n#pragma GCC diagnostic pop\n\n/*\n * _libssh2_wait_socket()\n *\n * Utility function that waits for action on the socket. Returns 0 when ready\n * to run again or error on timeout.\n */\nint _libssh2_wait_socket(LIBSSH2_SESSION *session, time_t start_time)\n{\n    int rc;\n    int seconds_to_next;\n    int dir;\n    int has_timeout;\n    long ms_to_next = 0;\n    long elapsed_ms;\n\n    /* since libssh2 often sets EAGAIN internally before this function is\n       called, we can decrease some amount of confusion in user programs by\n       resetting the error code in this function to reduce the risk of EAGAIN\n       being stored as error when a blocking function has returned */\n    session->err_code = LIBSSH2_ERROR_NONE;\n\n    rc = libssh2_keepalive_send(session, &seconds_to_next);\n    if(rc < 0)\n        return rc;\n\n    ms_to_next = seconds_to_next * 1000;\n\n    /* figure out what to wait for */\n    dir = libssh2_session_block_directions(session);\n\n    if(!dir) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                       \"Nothing to wait for in wait_socket\");\n        /* To avoid that we hang below just because there's nothing set to\n           wait for, we timeout on 1 second to also avoid busy-looping\n           during this condition */\n        ms_to_next = 1000;\n    }\n\n    if(session->api_timeout > 0 &&\n        (seconds_to_next == 0 ||\n         ms_to_next > session->api_timeout)) {\n        time_t now = time(NULL);\n        elapsed_ms = (long)(1000*difftime(now, start_time));\n        if(elapsed_ms > session->api_timeout) {\n            return _libssh2_error(session, LIBSSH2_ERROR_TIMEOUT,\n                                  \"API timeout expired\");\n        }\n        ms_to_next = (session->api_timeout - elapsed_ms);\n        has_timeout = 1;\n    }\n    else if(ms_to_next > 0) {\n        has_timeout = 1;\n    }\n    else\n        has_timeout = 0;\n\n#ifdef HAVE_POLL\n    {\n        struct pollfd sockets[1];\n\n        sockets[0].fd = session->socket_fd;\n        sockets[0].events = 0;\n        sockets[0].revents = 0;\n\n        if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)\n            sockets[0].events |= POLLIN;\n\n        if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)\n            sockets[0].events |= POLLOUT;\n\n        rc = poll(sockets, 1, has_timeout?ms_to_next: -1);\n    }\n#else\n    {\n        fd_set rfd;\n        fd_set wfd;\n        fd_set *writefd = NULL;\n        fd_set *readfd = NULL;\n        struct timeval tv;\n\n        tv.tv_sec = ms_to_next / 1000;\n        tv.tv_usec = (ms_to_next - tv.tv_sec*1000) * 1000;\n\n        if(dir & LIBSSH2_SESSION_BLOCK_INBOUND) {\n            FD_ZERO(&rfd);\n            FD_SET(session->socket_fd, &rfd);\n            readfd = &rfd;\n        }\n\n        if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND) {\n            FD_ZERO(&wfd);\n            FD_SET(session->socket_fd, &wfd);\n            writefd = &wfd;\n        }\n\n        rc = select(session->socket_fd + 1, readfd, writefd, NULL,\n                    has_timeout ? &tv : NULL);\n    }\n#endif\n    if(rc == 0) {\n        return _libssh2_error(session, LIBSSH2_ERROR_TIMEOUT,\n                              \"Timed out waiting on socket\");\n    }\n    if(rc < 0) {\n        return _libssh2_error(session, LIBSSH2_ERROR_TIMEOUT,\n                              \"Error waiting on socket\");\n    }\n\n    return 0; /* ready to try again */\n}\n\nstatic int\nsession_startup(LIBSSH2_SESSION *session, libssh2_socket_t sock)\n{\n    int rc;\n\n    if(session->startup_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                       \"session_startup for socket %d\", sock);\n        if(LIBSSH2_INVALID_SOCKET == sock) {\n            /* Did we forget something? */\n            return _libssh2_error(session, LIBSSH2_ERROR_BAD_SOCKET,\n                                  \"Bad socket provided\");\n        }\n        session->socket_fd = sock;\n\n        session->socket_prev_blockstate =\n            !get_socket_nonblocking(session->socket_fd);\n\n        if(session->socket_prev_blockstate) {\n            /* If in blocking state change to non-blocking */\n            rc = session_nonblock(session->socket_fd, 1);\n            if(rc) {\n                return _libssh2_error(session, rc,\n                                      \"Failed changing socket's \"\n                                      \"blocking state to non-blocking\");\n            }\n        }\n\n        session->startup_state = libssh2_NB_state_created;\n    }\n\n    if(session->startup_state == libssh2_NB_state_created) {\n        rc = banner_send(session);\n        if(rc == LIBSSH2_ERROR_EAGAIN)\n            return rc;\n        else if(rc) {\n            return _libssh2_error(session, rc,\n                                  \"Failed sending banner\");\n        }\n        session->startup_state = libssh2_NB_state_sent;\n        session->banner_TxRx_state = libssh2_NB_state_idle;\n    }\n\n    if(session->startup_state == libssh2_NB_state_sent) {\n        do {\n            rc = banner_receive(session);\n            if(rc == LIBSSH2_ERROR_EAGAIN)\n                return rc;\n            else if(rc)\n                return _libssh2_error(session, rc,\n                                      \"Failed getting banner\");\n        } while(strncmp(\"SSH-\", (char *)session->remote.banner, 4));\n\n        session->startup_state = libssh2_NB_state_sent1;\n    }\n\n    if(session->startup_state == libssh2_NB_state_sent1) {\n        rc = _libssh2_kex_exchange(session, 0, &session->startup_key_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN)\n            return rc;\n        else if(rc)\n            return _libssh2_error(session, rc,\n                                  \"Unable to exchange encryption keys\");\n\n        session->startup_state = libssh2_NB_state_sent2;\n    }\n\n    if(session->startup_state == libssh2_NB_state_sent2) {\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                       \"Requesting userauth service\");\n\n        /* Request the userauth service */\n        session->startup_service[0] = SSH_MSG_SERVICE_REQUEST;\n        _libssh2_htonu32(session->startup_service + 1,\n                         sizeof(\"ssh-userauth\") - 1);\n        memcpy(session->startup_service + 5, \"ssh-userauth\",\n               sizeof(\"ssh-userauth\") - 1);\n\n        session->startup_state = libssh2_NB_state_sent3;\n    }\n\n    if(session->startup_state == libssh2_NB_state_sent3) {\n        rc = _libssh2_transport_send(session, session->startup_service,\n                                     sizeof(\"ssh-userauth\") + 5 - 1,\n                                     NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN)\n            return rc;\n        else if(rc) {\n            return _libssh2_error(session, rc,\n                                  \"Unable to ask for ssh-userauth service\");\n        }\n\n        session->startup_state = libssh2_NB_state_sent4;\n    }\n\n    if(session->startup_state == libssh2_NB_state_sent4) {\n        rc = _libssh2_packet_require(session, SSH_MSG_SERVICE_ACCEPT,\n                                     &session->startup_data,\n                                     &session->startup_data_len, 0, NULL, 0,\n                                     &session->startup_req_state);\n        if(rc)\n            return rc;\n\n        if(session->startup_data_len < 5) {\n            return _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                  \"Unexpected packet length\");\n        }\n\n        session->startup_service_length =\n            _libssh2_ntohu32(session->startup_data + 1);\n\n\n        if((session->startup_service_length != (sizeof(\"ssh-userauth\") - 1))\n            || strncmp(\"ssh-userauth\", (char *) session->startup_data + 5,\n                       session->startup_service_length)) {\n            LIBSSH2_FREE(session, session->startup_data);\n            session->startup_data = NULL;\n            return _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                  \"Invalid response received from server\");\n        }\n        LIBSSH2_FREE(session, session->startup_data);\n        session->startup_data = NULL;\n\n        session->startup_state = libssh2_NB_state_idle;\n\n        return 0;\n    }\n\n    /* just for safety return some error */\n    return LIBSSH2_ERROR_INVAL;\n}\n\n/*\n * libssh2_session_handshake()\n *\n * session: LIBSSH2_SESSION struct allocated and owned by the calling program\n * sock:    *must* be populated with an opened and connected socket.\n *\n * Returns: 0 on success, or non-zero on failure\n */\nLIBSSH2_API int\nlibssh2_session_handshake(LIBSSH2_SESSION *session, libssh2_socket_t sock)\n{\n    int rc;\n\n    BLOCK_ADJUST(rc, session, session_startup(session, sock) );\n\n    return rc;\n}\n\n/*\n * libssh2_session_startup()\n *\n * DEPRECATED. Use libssh2_session_handshake() instead! This function is not\n * portable enough.\n *\n * session: LIBSSH2_SESSION struct allocated and owned by the calling program\n * sock:    *must* be populated with an opened and connected socket.\n *\n * Returns: 0 on success, or non-zero on failure\n */\nLIBSSH2_API int\nlibssh2_session_startup(LIBSSH2_SESSION *session, int sock)\n{\n    return libssh2_session_handshake(session, (libssh2_socket_t) sock);\n}\n\n/*\n * libssh2_session_free\n *\n * Frees the memory allocated to the session\n * Also closes and frees any channels attached to this session\n */\nstatic int\nsession_free(LIBSSH2_SESSION *session)\n{\n    int rc;\n    LIBSSH2_PACKET *pkg;\n    LIBSSH2_CHANNEL *ch;\n    LIBSSH2_LISTENER *l;\n    int packets_left = 0;\n\n    if(session->free_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                       \"Freeing session resource\",\n                       session->remote.banner);\n\n        session->free_state = libssh2_NB_state_created;\n    }\n\n    if(session->free_state == libssh2_NB_state_created) {\n        while((ch = _libssh2_list_first(&session->channels))) {\n\n            rc = _libssh2_channel_free(ch);\n            if(rc == LIBSSH2_ERROR_EAGAIN)\n                return rc;\n        }\n\n        session->free_state = libssh2_NB_state_sent;\n    }\n\n    if(session->free_state == libssh2_NB_state_sent) {\n        while((l = _libssh2_list_first(&session->listeners))) {\n            rc = _libssh2_channel_forward_cancel(l);\n            if(rc == LIBSSH2_ERROR_EAGAIN)\n                return rc;\n        }\n\n        session->free_state = libssh2_NB_state_sent1;\n    }\n\n    if(session->state & LIBSSH2_STATE_NEWKEYS) {\n        /* hostkey */\n        if(session->hostkey && session->hostkey->dtor) {\n            session->hostkey->dtor(session, &session->server_hostkey_abstract);\n        }\n\n        /* Client to Server */\n        /* crypt */\n        if(session->local.crypt && session->local.crypt->dtor) {\n            session->local.crypt->dtor(session,\n                                       &session->local.crypt_abstract);\n        }\n        /* comp */\n        if(session->local.comp && session->local.comp->dtor) {\n            session->local.comp->dtor(session, 1,\n                                      &session->local.comp_abstract);\n        }\n        /* mac */\n        if(session->local.mac && session->local.mac->dtor) {\n            session->local.mac->dtor(session, &session->local.mac_abstract);\n        }\n\n        /* Server to Client */\n        /* crypt */\n        if(session->remote.crypt && session->remote.crypt->dtor) {\n            session->remote.crypt->dtor(session,\n                                        &session->remote.crypt_abstract);\n        }\n        /* comp */\n        if(session->remote.comp && session->remote.comp->dtor) {\n            session->remote.comp->dtor(session, 0,\n                                       &session->remote.comp_abstract);\n        }\n        /* mac */\n        if(session->remote.mac && session->remote.mac->dtor) {\n            session->remote.mac->dtor(session, &session->remote.mac_abstract);\n        }\n\n        /* session_id */\n        if(session->session_id) {\n            LIBSSH2_FREE(session, session->session_id);\n        }\n    }\n\n    /* Free banner(s) */\n    if(session->remote.banner) {\n        LIBSSH2_FREE(session, session->remote.banner);\n    }\n    if(session->local.banner) {\n        LIBSSH2_FREE(session, session->local.banner);\n    }\n\n    /* Free preference(s) */\n    if(session->kex_prefs) {\n        LIBSSH2_FREE(session, session->kex_prefs);\n    }\n    if(session->hostkey_prefs) {\n        LIBSSH2_FREE(session, session->hostkey_prefs);\n    }\n\n    if(session->local.kexinit) {\n        LIBSSH2_FREE(session, session->local.kexinit);\n    }\n    if(session->local.crypt_prefs) {\n        LIBSSH2_FREE(session, session->local.crypt_prefs);\n    }\n    if(session->local.mac_prefs) {\n        LIBSSH2_FREE(session, session->local.mac_prefs);\n    }\n    if(session->local.comp_prefs) {\n        LIBSSH2_FREE(session, session->local.comp_prefs);\n    }\n    if(session->local.lang_prefs) {\n        LIBSSH2_FREE(session, session->local.lang_prefs);\n    }\n\n    if(session->remote.kexinit) {\n        LIBSSH2_FREE(session, session->remote.kexinit);\n    }\n    if(session->remote.crypt_prefs) {\n        LIBSSH2_FREE(session, session->remote.crypt_prefs);\n    }\n    if(session->remote.mac_prefs) {\n        LIBSSH2_FREE(session, session->remote.mac_prefs);\n    }\n    if(session->remote.comp_prefs) {\n        LIBSSH2_FREE(session, session->remote.comp_prefs);\n    }\n    if(session->remote.lang_prefs) {\n        LIBSSH2_FREE(session, session->remote.lang_prefs);\n    }\n\n    /*\n     * Make sure all memory used in the state variables are free\n     */\n    if(session->kexinit_data) {\n        LIBSSH2_FREE(session, session->kexinit_data);\n    }\n    if(session->startup_data) {\n        LIBSSH2_FREE(session, session->startup_data);\n    }\n    if(session->userauth_list_data) {\n        LIBSSH2_FREE(session, session->userauth_list_data);\n    }\n    if(session->userauth_pswd_data) {\n        LIBSSH2_FREE(session, session->userauth_pswd_data);\n    }\n    if(session->userauth_pswd_newpw) {\n        LIBSSH2_FREE(session, session->userauth_pswd_newpw);\n    }\n    if(session->userauth_host_packet) {\n        LIBSSH2_FREE(session, session->userauth_host_packet);\n    }\n    if(session->userauth_host_method) {\n        LIBSSH2_FREE(session, session->userauth_host_method);\n    }\n    if(session->userauth_host_data) {\n        LIBSSH2_FREE(session, session->userauth_host_data);\n    }\n    if(session->userauth_pblc_data) {\n        LIBSSH2_FREE(session, session->userauth_pblc_data);\n    }\n    if(session->userauth_pblc_packet) {\n        LIBSSH2_FREE(session, session->userauth_pblc_packet);\n    }\n    if(session->userauth_pblc_method) {\n        LIBSSH2_FREE(session, session->userauth_pblc_method);\n    }\n    if(session->userauth_kybd_data) {\n        LIBSSH2_FREE(session, session->userauth_kybd_data);\n    }\n    if(session->userauth_kybd_packet) {\n        LIBSSH2_FREE(session, session->userauth_kybd_packet);\n    }\n    if(session->userauth_kybd_auth_instruction) {\n        LIBSSH2_FREE(session, session->userauth_kybd_auth_instruction);\n    }\n    if(session->open_packet) {\n        LIBSSH2_FREE(session, session->open_packet);\n    }\n    if(session->open_data) {\n        LIBSSH2_FREE(session, session->open_data);\n    }\n    if(session->direct_message) {\n        LIBSSH2_FREE(session, session->direct_message);\n    }\n    if(session->fwdLstn_packet) {\n        LIBSSH2_FREE(session, session->fwdLstn_packet);\n    }\n    if(session->pkeyInit_data) {\n        LIBSSH2_FREE(session, session->pkeyInit_data);\n    }\n    if(session->scpRecv_command) {\n        LIBSSH2_FREE(session, session->scpRecv_command);\n    }\n    if(session->scpSend_command) {\n        LIBSSH2_FREE(session, session->scpSend_command);\n    }\n    if(session->sftpInit_sftp) {\n        LIBSSH2_FREE(session, session->sftpInit_sftp);\n    }\n\n    /* Free payload buffer */\n    if(session->packet.total_num) {\n        LIBSSH2_FREE(session, session->packet.payload);\n    }\n\n    /* Cleanup all remaining packets */\n    while((pkg = _libssh2_list_first(&session->packets))) {\n        packets_left++;\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n            \"packet left with id %d\", pkg->data[0]);\n        /* unlink the node */\n        _libssh2_list_remove(&pkg->node);\n\n        /* free */\n        LIBSSH2_FREE(session, pkg->data);\n        LIBSSH2_FREE(session, pkg);\n    }\n    _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n         \"Extra packets left %d\", packets_left);\n\n    if(session->socket_prev_blockstate) {\n        /* if the socket was previously blocking, put it back so */\n        rc = session_nonblock(session->socket_fd, 0);\n        if(rc) {\n            _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n             \"unable to reset socket's blocking state\");\n        }\n    }\n\n    if(session->server_hostkey) {\n        LIBSSH2_FREE(session, session->server_hostkey);\n    }\n\n    /* error string */\n    if(session->err_msg &&\n       ((session->err_flags & LIBSSH2_ERR_FLAG_DUP) != 0)) {\n        LIBSSH2_FREE(session, (char *)session->err_msg);\n    }\n\n    LIBSSH2_FREE(session, session);\n\n    return 0;\n}\n\n/*\n * libssh2_session_free\n *\n * Frees the memory allocated to the session\n * Also closes and frees any channels attached to this session\n */\nLIBSSH2_API int\nlibssh2_session_free(LIBSSH2_SESSION * session)\n{\n    int rc;\n\n    BLOCK_ADJUST(rc, session, session_free(session) );\n\n    return rc;\n}\n\n/*\n * libssh2_session_disconnect_ex\n */\nstatic int\nsession_disconnect(LIBSSH2_SESSION *session, int reason,\n                   const char *description,\n                   const char *lang)\n{\n    unsigned char *s;\n    unsigned long descr_len = 0, lang_len = 0;\n    int rc;\n\n    if(session->disconnect_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,\n                       \"Disconnecting: reason=%d, desc=%s, lang=%s\", reason,\n                       description, lang);\n        if(description)\n            descr_len = strlen(description);\n\n        if(lang)\n            lang_len = strlen(lang);\n\n        if(descr_len > 256)\n            return _libssh2_error(session, LIBSSH2_ERROR_INVAL,\n                                  \"too long description\");\n\n        /* 13 = packet_type(1) + reason code(4) + descr_len(4) + lang_len(4) */\n        session->disconnect_data_len = descr_len + lang_len + 13;\n\n        s = session->disconnect_data;\n\n        *(s++) = SSH_MSG_DISCONNECT;\n        _libssh2_store_u32(&s, reason);\n        _libssh2_store_str(&s, description, descr_len);\n        /* store length only, lang is sent separately */\n        _libssh2_store_u32(&s, lang_len);\n\n        session->disconnect_state = libssh2_NB_state_created;\n    }\n\n    rc = _libssh2_transport_send(session, session->disconnect_data,\n                                 session->disconnect_data_len,\n                                 (unsigned char *)lang, lang_len);\n    if(rc == LIBSSH2_ERROR_EAGAIN)\n        return rc;\n\n    session->disconnect_state = libssh2_NB_state_idle;\n\n    return 0;\n}\n\n/*\n * libssh2_session_disconnect_ex\n */\nLIBSSH2_API int\nlibssh2_session_disconnect_ex(LIBSSH2_SESSION *session, int reason,\n                              const char *desc, const char *lang)\n{\n    int rc;\n    session->state &= ~LIBSSH2_STATE_EXCHANGING_KEYS;\n    BLOCK_ADJUST(rc, session,\n                 session_disconnect(session, reason, desc, lang));\n\n    return rc;\n}\n\n/* libssh2_session_methods\n *\n * Return the currently active methods for method_type\n *\n * NOTE: Currently lang_cs and lang_sc are ALWAYS set to empty string\n * regardless of actual negotiation Strings should NOT be freed\n */\nLIBSSH2_API const char *\nlibssh2_session_methods(LIBSSH2_SESSION * session, int method_type)\n{\n    /* All methods have char *name as their first element */\n    const LIBSSH2_KEX_METHOD *method = NULL;\n\n    switch(method_type) {\n    case LIBSSH2_METHOD_KEX:\n        method = session->kex;\n        break;\n\n    case LIBSSH2_METHOD_HOSTKEY:\n        method = (LIBSSH2_KEX_METHOD *) session->hostkey;\n        break;\n\n    case LIBSSH2_METHOD_CRYPT_CS:\n        method = (LIBSSH2_KEX_METHOD *) session->local.crypt;\n        break;\n\n    case LIBSSH2_METHOD_CRYPT_SC:\n        method = (LIBSSH2_KEX_METHOD *) session->remote.crypt;\n        break;\n\n    case LIBSSH2_METHOD_MAC_CS:\n        method = (LIBSSH2_KEX_METHOD *) session->local.mac;\n        break;\n\n    case LIBSSH2_METHOD_MAC_SC:\n        method = (LIBSSH2_KEX_METHOD *) session->remote.mac;\n        break;\n\n    case LIBSSH2_METHOD_COMP_CS:\n        method = (LIBSSH2_KEX_METHOD *) session->local.comp;\n        break;\n\n    case LIBSSH2_METHOD_COMP_SC:\n        method = (LIBSSH2_KEX_METHOD *) session->remote.comp;\n        break;\n\n    case LIBSSH2_METHOD_LANG_CS:\n        return \"\";\n\n    case LIBSSH2_METHOD_LANG_SC:\n        return \"\";\n\n    default:\n        _libssh2_error(session, LIBSSH2_ERROR_INVAL,\n                       \"Invalid parameter specified for method_type\");\n        return NULL;\n    }\n\n    if(!method) {\n        _libssh2_error(session, LIBSSH2_ERROR_METHOD_NONE,\n                       \"No method negotiated\");\n        return NULL;\n    }\n\n    return method->name;\n}\n\n/* libssh2_session_abstract\n * Retrieve a pointer to the abstract property\n */\nLIBSSH2_API void **\nlibssh2_session_abstract(LIBSSH2_SESSION * session)\n{\n    return &session->abstract;\n}\n\n/* libssh2_session_last_error\n *\n * Returns error code and populates an error string into errmsg If want_buf is\n * non-zero then the string placed into errmsg must be freed by the calling\n * program. Otherwise it is assumed to be owned by libssh2\n */\nLIBSSH2_API int\nlibssh2_session_last_error(LIBSSH2_SESSION * session, char **errmsg,\n                           int *errmsg_len, int want_buf)\n{\n    size_t msglen = 0;\n\n    /* No error to report */\n    if(!session->err_code) {\n        if(errmsg) {\n            if(want_buf) {\n                *errmsg = LIBSSH2_ALLOC(session, 1);\n                if(*errmsg) {\n                    **errmsg = 0;\n                }\n            }\n            else {\n                *errmsg = (char *) \"\";\n            }\n        }\n        if(errmsg_len) {\n            *errmsg_len = 0;\n        }\n        return 0;\n    }\n\n    if(errmsg) {\n        const char *error = session->err_msg ? session->err_msg : \"\";\n\n        msglen = strlen(error);\n\n        if(want_buf) {\n            /* Make a copy so the calling program can own it */\n            *errmsg = LIBSSH2_ALLOC(session, msglen + 1);\n            if(*errmsg) {\n                memcpy(*errmsg, error, msglen);\n                (*errmsg)[msglen] = 0;\n            }\n        }\n        else\n            *errmsg = (char *)error;\n    }\n\n    if(errmsg_len) {\n        *errmsg_len = msglen;\n    }\n\n    return session->err_code;\n}\n\n/* libssh2_session_last_errno\n *\n * Returns error code\n */\nLIBSSH2_API int\nlibssh2_session_last_errno(LIBSSH2_SESSION * session)\n{\n    return session->err_code;\n}\n\n/* libssh2_session_set_last_error\n *\n * Sets the internal error code for the session.\n *\n * This function is available specifically to be used by high level\n * language wrappers (i.e. Python or Perl) that may extend the library\n * features while still relying on its error reporting mechanism.\n */\nLIBSSH2_API int\nlibssh2_session_set_last_error(LIBSSH2_SESSION* session,\n                               int errcode,\n                               const char *errmsg)\n{\n    return _libssh2_error_flags(session, errcode, errmsg,\n                                LIBSSH2_ERR_FLAG_DUP);\n}\n\n/* Libssh2_session_flag\n *\n * Set/Get session flags\n *\n * Return error code.\n */\nLIBSSH2_API int\nlibssh2_session_flag(LIBSSH2_SESSION * session, int flag, int value)\n{\n    switch(flag) {\n    case LIBSSH2_FLAG_SIGPIPE:\n        session->flag.sigpipe = value;\n        break;\n    case LIBSSH2_FLAG_COMPRESS:\n        session->flag.compress = value;\n        break;\n    default:\n        /* unknown flag */\n        return LIBSSH2_ERROR_INVAL;\n    }\n\n    return LIBSSH2_ERROR_NONE;\n}\n\n/* _libssh2_session_set_blocking\n *\n * Set a session's blocking mode on or off, return the previous status when\n * this function is called. Note this function does not alter the state of the\n * actual socket involved.\n */\nint\n_libssh2_session_set_blocking(LIBSSH2_SESSION *session, int blocking)\n{\n    int bl = session->api_block_mode;\n    _libssh2_debug(session, LIBSSH2_TRACE_CONN,\n                   \"Setting blocking mode %s\", blocking?\"ON\":\"OFF\");\n    session->api_block_mode = blocking;\n\n    return bl;\n}\n\n/* libssh2_session_set_blocking\n *\n * Set a channel's blocking mode on or off, similar to a socket's\n * fcntl(fd, F_SETFL, O_NONBLOCK); type command\n */\nLIBSSH2_API void\nlibssh2_session_set_blocking(LIBSSH2_SESSION * session, int blocking)\n{\n    (void) _libssh2_session_set_blocking(session, blocking);\n}\n\n/* libssh2_session_get_blocking\n *\n * Returns a session's blocking mode on or off\n */\nLIBSSH2_API int\nlibssh2_session_get_blocking(LIBSSH2_SESSION * session)\n{\n    return session->api_block_mode;\n}\n\n\n/* libssh2_session_set_timeout\n *\n * Set a session's timeout (in msec) for blocking mode,\n * or 0 to disable timeouts.\n */\nLIBSSH2_API void\nlibssh2_session_set_timeout(LIBSSH2_SESSION * session, long timeout)\n{\n    session->api_timeout = timeout;\n}\n\n/* libssh2_session_get_timeout\n *\n * Returns a session's timeout, or 0 if disabled\n */\nLIBSSH2_API long\nlibssh2_session_get_timeout(LIBSSH2_SESSION * session)\n{\n    return session->api_timeout;\n}\n\n/*\n * libssh2_poll_channel_read\n *\n * Returns 0 if no data is waiting on channel,\n * non-0 if data is available\n */\nLIBSSH2_API int\nlibssh2_poll_channel_read(LIBSSH2_CHANNEL *channel, int extended)\n{\n    LIBSSH2_SESSION *session;\n    LIBSSH2_PACKET *packet;\n\n    if(!channel)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    session = channel->session;\n    packet = _libssh2_list_first(&session->packets);\n\n    while(packet) {\n        if(packet->data_len < 5) {\n            return _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                  \"Packet too small\");\n        }\n\n        if(channel->local.id == _libssh2_ntohu32(packet->data + 1)) {\n            if(extended == 1 &&\n                (packet->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA\n                 || packet->data[0] == SSH_MSG_CHANNEL_DATA)) {\n                return 1;\n            }\n            else if(extended == 0 &&\n                    packet->data[0] == SSH_MSG_CHANNEL_DATA) {\n                return 1;\n            }\n            /* else - no data of any type is ready to be read */\n        }\n        packet = _libssh2_list_next(&packet->node);\n    }\n\n    return 0;\n}\n\n/*\n * poll_channel_write\n *\n * Returns 0 if writing to channel would block,\n * non-0 if data can be written without blocking\n */\nstatic inline int\npoll_channel_write(LIBSSH2_CHANNEL * channel)\n{\n    return channel->local.window_size ? 1 : 0;\n}\n\n/* poll_listener_queued\n *\n * Returns 0 if no connections are waiting to be accepted\n * non-0 if one or more connections are available\n */\nstatic inline int\npoll_listener_queued(LIBSSH2_LISTENER * listener)\n{\n    return _libssh2_list_first(&listener->queue) ? 1 : 0;\n}\n\n/*\n * libssh2_poll\n *\n * Poll sockets, channels, and listeners for activity\n */\nLIBSSH2_API int\nlibssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout)\n{\n    long timeout_remaining;\n    unsigned int i, active_fds;\n#ifdef HAVE_POLL\n    LIBSSH2_SESSION *session = NULL;\n#ifdef HAVE_ALLOCA\n    struct pollfd *sockets = alloca(sizeof(struct pollfd) * nfds);\n#else\n    struct pollfd sockets[256];\n\n    if(nfds > 256)\n        /* systems without alloca use a fixed-size array, this can be fixed if\n           we really want to, at least if the compiler is a C99 capable one */\n        return -1;\n#endif\n    /* Setup sockets for polling */\n    for(i = 0; i < nfds; i++) {\n        fds[i].revents = 0;\n        switch(fds[i].type) {\n        case LIBSSH2_POLLFD_SOCKET:\n            sockets[i].fd = fds[i].fd.socket;\n            sockets[i].events = fds[i].events;\n            sockets[i].revents = 0;\n            break;\n\n        case LIBSSH2_POLLFD_CHANNEL:\n            sockets[i].fd = fds[i].fd.channel->session->socket_fd;\n            sockets[i].events = POLLIN;\n            sockets[i].revents = 0;\n            if(!session)\n                session = fds[i].fd.channel->session;\n            break;\n\n        case LIBSSH2_POLLFD_LISTENER:\n            sockets[i].fd = fds[i].fd.listener->session->socket_fd;\n            sockets[i].events = POLLIN;\n            sockets[i].revents = 0;\n            if(!session)\n                session = fds[i].fd.listener->session;\n            break;\n\n        default:\n            if(session)\n                _libssh2_error(session, LIBSSH2_ERROR_INVALID_POLL_TYPE,\n                               \"Invalid descriptor passed to libssh2_poll()\");\n            return -1;\n        }\n    }\n#elif defined(HAVE_SELECT)\n    LIBSSH2_SESSION *session = NULL;\n    libssh2_socket_t maxfd = 0;\n    fd_set rfds, wfds;\n    struct timeval tv;\n\n    FD_ZERO(&rfds);\n    FD_ZERO(&wfds);\n    for(i = 0; i < nfds; i++) {\n        fds[i].revents = 0;\n        switch(fds[i].type) {\n        case LIBSSH2_POLLFD_SOCKET:\n            if(fds[i].events & LIBSSH2_POLLFD_POLLIN) {\n                FD_SET(fds[i].fd.socket, &rfds);\n                if(fds[i].fd.socket > maxfd)\n                    maxfd = fds[i].fd.socket;\n            }\n            if(fds[i].events & LIBSSH2_POLLFD_POLLOUT) {\n                FD_SET(fds[i].fd.socket, &wfds);\n                if(fds[i].fd.socket > maxfd)\n                    maxfd = fds[i].fd.socket;\n            }\n            break;\n\n        case LIBSSH2_POLLFD_CHANNEL:\n            FD_SET(fds[i].fd.channel->session->socket_fd, &rfds);\n            if(fds[i].fd.channel->session->socket_fd > maxfd)\n                maxfd = fds[i].fd.channel->session->socket_fd;\n            if(!session)\n                session = fds[i].fd.channel->session;\n            break;\n\n        case LIBSSH2_POLLFD_LISTENER:\n            FD_SET(fds[i].fd.listener->session->socket_fd, &rfds);\n            if(fds[i].fd.listener->session->socket_fd > maxfd)\n                maxfd = fds[i].fd.listener->session->socket_fd;\n            if(!session)\n                session = fds[i].fd.listener->session;\n            break;\n\n        default:\n            if(session)\n                _libssh2_error(session, LIBSSH2_ERROR_INVALID_POLL_TYPE,\n                               \"Invalid descriptor passed to libssh2_poll()\");\n            return -1;\n        }\n    }\n#else\n    /* No select() or poll()\n     * no sockets structure to setup\n     */\n\n    timeout = 0;\n#endif /* HAVE_POLL or HAVE_SELECT */\n\n    timeout_remaining = timeout;\n    do {\n#if defined(HAVE_POLL) || defined(HAVE_SELECT)\n        int sysret;\n#endif\n\n        active_fds = 0;\n\n        for(i = 0; i < nfds; i++) {\n            if(fds[i].events != fds[i].revents) {\n                switch(fds[i].type) {\n                case LIBSSH2_POLLFD_CHANNEL:\n                    if((fds[i].events & LIBSSH2_POLLFD_POLLIN) &&\n                        /* Want to be ready for read */\n                        ((fds[i].revents & LIBSSH2_POLLFD_POLLIN) == 0)) {\n                        /* Not yet known to be ready for read */\n                        fds[i].revents |=\n                            libssh2_poll_channel_read(fds[i].fd.channel,\n                                                      0) ?\n                            LIBSSH2_POLLFD_POLLIN : 0;\n                    }\n                    if((fds[i].events & LIBSSH2_POLLFD_POLLEXT) &&\n                        /* Want to be ready for extended read */\n                        ((fds[i].revents & LIBSSH2_POLLFD_POLLEXT) == 0)) {\n                        /* Not yet known to be ready for extended read */\n                        fds[i].revents |=\n                            libssh2_poll_channel_read(fds[i].fd.channel,\n                                                      1) ?\n                            LIBSSH2_POLLFD_POLLEXT : 0;\n                    }\n                    if((fds[i].events & LIBSSH2_POLLFD_POLLOUT) &&\n                        /* Want to be ready for write */\n                        ((fds[i].revents & LIBSSH2_POLLFD_POLLOUT) == 0)) {\n                        /* Not yet known to be ready for write */\n                        fds[i].revents |=\n                            poll_channel_write(fds[i].fd. channel) ?\n                            LIBSSH2_POLLFD_POLLOUT : 0;\n                    }\n                    if(fds[i].fd.channel->remote.close\n                        || fds[i].fd.channel->local.close) {\n                        fds[i].revents |= LIBSSH2_POLLFD_CHANNEL_CLOSED;\n                    }\n                    if(fds[i].fd.channel->session->socket_state ==\n                        LIBSSH2_SOCKET_DISCONNECTED) {\n                        fds[i].revents |=\n                            LIBSSH2_POLLFD_CHANNEL_CLOSED |\n                            LIBSSH2_POLLFD_SESSION_CLOSED;\n                    }\n                    break;\n\n                case LIBSSH2_POLLFD_LISTENER:\n                    if((fds[i].events & LIBSSH2_POLLFD_POLLIN) &&\n                        /* Want a connection */\n                        ((fds[i].revents & LIBSSH2_POLLFD_POLLIN) == 0)) {\n                        /* No connections known of yet */\n                        fds[i].revents |=\n                            poll_listener_queued(fds[i].fd. listener) ?\n                            LIBSSH2_POLLFD_POLLIN : 0;\n                    }\n                    if(fds[i].fd.listener->session->socket_state ==\n                        LIBSSH2_SOCKET_DISCONNECTED) {\n                        fds[i].revents |=\n                            LIBSSH2_POLLFD_LISTENER_CLOSED |\n                            LIBSSH2_POLLFD_SESSION_CLOSED;\n                    }\n                    break;\n                }\n            }\n            if(fds[i].revents) {\n                active_fds++;\n            }\n        }\n\n        if(active_fds) {\n            /* Don't block on the sockets if we have channels/listeners which\n               are ready */\n            timeout_remaining = 0;\n        }\n#ifdef HAVE_POLL\n\n#ifdef HAVE_LIBSSH2_GETTIMEOFDAY\n        {\n            struct timeval tv_begin, tv_end;\n\n            _libssh2_gettimeofday((struct timeval *) &tv_begin, NULL);\n            sysret = poll(sockets, nfds, timeout_remaining);\n            _libssh2_gettimeofday((struct timeval *) &tv_end, NULL);\n            timeout_remaining -= (tv_end.tv_sec - tv_begin.tv_sec) * 1000;\n            timeout_remaining -= (tv_end.tv_usec - tv_begin.tv_usec) / 1000;\n        }\n#else\n        /* If the platform doesn't support gettimeofday,\n         * then just make the call non-blocking and walk away\n         */\n        sysret = poll(sockets, nfds, timeout_remaining);\n        timeout_remaining = 0;\n#endif /* HAVE_GETTIMEOFDAY */\n\n        if(sysret > 0) {\n            for(i = 0; i < nfds; i++) {\n                switch(fds[i].type) {\n                case LIBSSH2_POLLFD_SOCKET:\n                    fds[i].revents = sockets[i].revents;\n                    sockets[i].revents = 0; /* In case we loop again, be\n                                               nice */\n                    if(fds[i].revents) {\n                        active_fds++;\n                    }\n                    break;\n                case LIBSSH2_POLLFD_CHANNEL:\n                    if(sockets[i].events & POLLIN) {\n                        /* Spin session until no data available */\n                        while(_libssh2_transport_read(fds[i].fd.\n                                                      channel->session)\n                              > 0);\n                    }\n                    if(sockets[i].revents & POLLHUP) {\n                        fds[i].revents |=\n                            LIBSSH2_POLLFD_CHANNEL_CLOSED |\n                            LIBSSH2_POLLFD_SESSION_CLOSED;\n                    }\n                    sockets[i].revents = 0;\n                    break;\n                case LIBSSH2_POLLFD_LISTENER:\n                    if(sockets[i].events & POLLIN) {\n                        /* Spin session until no data available */\n                        while(_libssh2_transport_read(fds[i].fd.\n                                                      listener->session)\n                              > 0);\n                    }\n                    if(sockets[i].revents & POLLHUP) {\n                        fds[i].revents |=\n                            LIBSSH2_POLLFD_LISTENER_CLOSED |\n                            LIBSSH2_POLLFD_SESSION_CLOSED;\n                    }\n                    sockets[i].revents = 0;\n                    break;\n                }\n            }\n        }\n#elif defined(HAVE_SELECT)\n        tv.tv_sec = timeout_remaining / 1000;\n        tv.tv_usec = (timeout_remaining % 1000) * 1000;\n#ifdef HAVE_LIBSSH2_GETTIMEOFDAY\n        {\n            struct timeval tv_begin, tv_end;\n\n            _libssh2_gettimeofday((struct timeval *) &tv_begin, NULL);\n            sysret = select(maxfd + 1, &rfds, &wfds, NULL, &tv);\n            _libssh2_gettimeofday((struct timeval *) &tv_end, NULL);\n\n            timeout_remaining -= (tv_end.tv_sec - tv_begin.tv_sec) * 1000;\n            timeout_remaining -= (tv_end.tv_usec - tv_begin.tv_usec) / 1000;\n        }\n#else\n        /* If the platform doesn't support gettimeofday,\n         * then just make the call non-blocking and walk away\n         */\n        sysret = select(maxfd + 1, &rfds, &wfds, NULL, &tv);\n        timeout_remaining = 0;\n#endif\n\n        if(sysret > 0) {\n            for(i = 0; i < nfds; i++) {\n                switch(fds[i].type) {\n                case LIBSSH2_POLLFD_SOCKET:\n                    if(FD_ISSET(fds[i].fd.socket, &rfds)) {\n                        fds[i].revents |= LIBSSH2_POLLFD_POLLIN;\n                    }\n                    if(FD_ISSET(fds[i].fd.socket, &wfds)) {\n                        fds[i].revents |= LIBSSH2_POLLFD_POLLOUT;\n                    }\n                    if(fds[i].revents) {\n                        active_fds++;\n                    }\n                    break;\n\n                case LIBSSH2_POLLFD_CHANNEL:\n                    if(FD_ISSET(fds[i].fd.channel->session->socket_fd,\n                                &rfds)) {\n                        /* Spin session until no data available */\n                        while(_libssh2_transport_read(fds[i].fd.\n                                                      channel->session)\n                              > 0);\n                    }\n                    break;\n\n                case LIBSSH2_POLLFD_LISTENER:\n                    if(FD_ISSET\n                        (fds[i].fd.listener->session->socket_fd, &rfds)) {\n                        /* Spin session until no data available */\n                        while(_libssh2_transport_read(fds[i].fd.\n                                                      listener->session)\n                              > 0);\n                    }\n                    break;\n                }\n            }\n        }\n#endif /* else no select() or poll() -- timeout (and by extension\n        * timeout_remaining) will be equal to 0 */\n    } while((timeout_remaining > 0) && !active_fds);\n\n    return active_fds;\n}\n\n/*\n * libssh2_session_block_directions\n *\n * Get blocked direction when a function returns LIBSSH2_ERROR_EAGAIN\n * Returns LIBSSH2_SOCKET_BLOCK_INBOUND if recv() blocked\n * or LIBSSH2_SOCKET_BLOCK_OUTBOUND if send() blocked\n */\nLIBSSH2_API int\nlibssh2_session_block_directions(LIBSSH2_SESSION *session)\n{\n    return session->socket_block_directions;\n}\n\n/* libssh2_session_banner_get\n * Get the remote banner (server ID string)\n */\n\nLIBSSH2_API const char *\nlibssh2_session_banner_get(LIBSSH2_SESSION *session)\n{\n    /* to avoid a coredump when session is NULL */\n    if(NULL == session)\n        return NULL;\n\n    if(NULL == session->remote.banner)\n        return NULL;\n\n    return (const char *) session->remote.banner;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/session.h",
    "content": "#ifndef LIBSSH2_SESSION_H\n#define LIBSSH2_SESSION_H\n/* Copyright (c) 2004-2007 Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2009-2010 by Daniel Stenberg\n * Copyright (c) 2010 Simon Josefsson <simon@josefsson.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* Conveniance-macros to allow code like this;\n\n   int rc = BLOCK_ADJUST(rc, session, session_startup(session, sock) );\n\n   int rc = BLOCK_ADJUST_ERRNO(ptr, session, session_startup(session, sock) );\n\n   The point of course being to make sure that while in non-blocking mode\n   these always return no matter what the return code is, but in blocking mode\n   it blocks if EAGAIN is the reason for the return from the underlying\n   function.\n\n*/\n#define BLOCK_ADJUST(rc, sess, x) \\\n    do { \\\n       time_t entry_time = time(NULL); \\\n       do { \\\n          rc = x; \\\n          /* the order of the check below is important to properly deal with \\\n             the case when the 'sess' is freed */ \\\n          if((rc != LIBSSH2_ERROR_EAGAIN) || !sess->api_block_mode) \\\n              break; \\\n          rc = _libssh2_wait_socket(sess, entry_time);  \\\n       } while(!rc);   \\\n    } while(0)\n\n/*\n * For functions that returns a pointer, we need to check if the API is\n * non-blocking and return immediately. If the pointer is non-NULL we return\n * immediately. If the API is blocking and we get a NULL we check the errno\n * and *only* if that is EAGAIN we loop and wait for socket action.\n */\n#define BLOCK_ADJUST_ERRNO(ptr, sess, x) \\\n    do { \\\n       time_t entry_time = time(NULL); \\\n       int rc; \\\n       do { \\\n           ptr = x; \\\n           if(!sess->api_block_mode || \\\n              (ptr != NULL) || \\\n              (libssh2_session_last_errno(sess) != LIBSSH2_ERROR_EAGAIN) ) \\\n               break; \\\n           rc = _libssh2_wait_socket(sess, entry_time); \\\n        } while(!rc); \\\n    } while(0)\n\n\nint _libssh2_wait_socket(LIBSSH2_SESSION *session, time_t entry_time);\n\n/* this is the lib-internal set blocking function */\nint _libssh2_session_set_blocking(LIBSSH2_SESSION * session, int blocking);\n\n#endif /* LIBSSH2_SESSION_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/sftp.c",
    "content": "/* Copyright (c) 2004-2008, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2007 Eli Fant <elifantu@mail.ru>\n * Copyright (c) 2009-2019 by Daniel Stenberg\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include <assert.h>\n\n#include \"libssh2_priv.h\"\n#include \"libssh2_sftp.h\"\n#include \"channel.h\"\n#include \"session.h\"\n#include \"sftp.h\"\n\n/* Note: Version 6 was documented at the time of writing\n * However it was marked as \"DO NOT IMPLEMENT\" due to pending changes\n *\n * This release of libssh2 implements Version 5 with automatic downgrade\n * based on server's declaration\n */\n\n/* SFTP packet types */\n#define SSH_FXP_INIT                            1\n#define SSH_FXP_VERSION                         2\n#define SSH_FXP_OPEN                            3\n#define SSH_FXP_CLOSE                           4\n#define SSH_FXP_READ                            5\n#define SSH_FXP_WRITE                           6\n#define SSH_FXP_LSTAT                           7\n#define SSH_FXP_FSTAT                           8\n#define SSH_FXP_SETSTAT                         9\n#define SSH_FXP_FSETSTAT                        10\n#define SSH_FXP_OPENDIR                         11\n#define SSH_FXP_READDIR                         12\n#define SSH_FXP_REMOVE                          13\n#define SSH_FXP_MKDIR                           14\n#define SSH_FXP_RMDIR                           15\n#define SSH_FXP_REALPATH                        16\n#define SSH_FXP_STAT                            17\n#define SSH_FXP_RENAME                          18\n#define SSH_FXP_READLINK                        19\n#define SSH_FXP_SYMLINK                         20\n#define SSH_FXP_STATUS                          101\n#define SSH_FXP_HANDLE                          102\n#define SSH_FXP_DATA                            103\n#define SSH_FXP_NAME                            104\n#define SSH_FXP_ATTRS                           105\n#define SSH_FXP_EXTENDED                        200\n#define SSH_FXP_EXTENDED_REPLY                  201\n\n/* S_IFREG */\n#define LIBSSH2_SFTP_ATTR_PFILETYPE_FILE        0100000\n/* S_IFDIR */\n#define LIBSSH2_SFTP_ATTR_PFILETYPE_DIR         0040000\n\n#define SSH_FXE_STATVFS_ST_RDONLY               0x00000001\n#define SSH_FXE_STATVFS_ST_NOSUID               0x00000002\n\n/* This is the maximum packet length to accept, as larger than this indicate\n   some kind of server problem. */\n#define LIBSSH2_SFTP_PACKET_MAXLEN  (256 * 1024)\n\nstatic int sftp_packet_ask(LIBSSH2_SFTP *sftp, unsigned char packet_type,\n                           uint32_t request_id, unsigned char **data,\n                           size_t *data_len);\nstatic void sftp_packet_flush(LIBSSH2_SFTP *sftp);\n\n/* sftp_attrsize\n * Size that attr with this flagset will occupy when turned into a bin struct\n */\nstatic int sftp_attrsize(unsigned long flags)\n{\n    return (4 +                                 /* flags(4) */\n            ((flags & LIBSSH2_SFTP_ATTR_SIZE) ? 8 : 0) +\n            ((flags & LIBSSH2_SFTP_ATTR_UIDGID) ? 8 : 0) +\n            ((flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) ? 4 : 0) +\n            ((flags & LIBSSH2_SFTP_ATTR_ACMODTIME) ? 8 : 0));\n    /* atime + mtime as u32 */\n}\n\n/* _libssh2_store_u64\n */\nstatic void _libssh2_store_u64(unsigned char **ptr, libssh2_uint64_t value)\n{\n    uint32_t msl = (uint32_t)(value >> 32);\n    unsigned char *buf = *ptr;\n\n    buf[0] = (unsigned char)((msl >> 24) & 0xFF);\n    buf[1] = (unsigned char)((msl >> 16) & 0xFF);\n    buf[2] = (unsigned char)((msl >> 8)  & 0xFF);\n    buf[3] = (unsigned char)( msl        & 0xFF);\n\n    buf[4] = (unsigned char)((value >> 24) & 0xFF);\n    buf[5] = (unsigned char)((value >> 16) & 0xFF);\n    buf[6] = (unsigned char)((value >> 8)  & 0xFF);\n    buf[7] = (unsigned char)( value        & 0xFF);\n\n    *ptr += 8;\n}\n\n/*\n * Search list of zombied FXP_READ request IDs.\n *\n * Returns NULL if ID not in list.\n */\nstatic struct sftp_zombie_requests *\nfind_zombie_request(LIBSSH2_SFTP *sftp, uint32_t request_id)\n{\n    struct sftp_zombie_requests *zombie =\n        _libssh2_list_first(&sftp->zombie_requests);\n\n    while(zombie) {\n        if(zombie->request_id == request_id)\n            break;\n        else\n            zombie = _libssh2_list_next(&zombie->node);\n    }\n\n    return zombie;\n}\n\nstatic void\nremove_zombie_request(LIBSSH2_SFTP *sftp, uint32_t request_id)\n{\n    LIBSSH2_SESSION *session = sftp->channel->session;\n\n    struct sftp_zombie_requests *zombie = find_zombie_request(sftp,\n                                                              request_id);\n    if(zombie) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Removing request ID %ld from the list of \"\n                       \"zombie requests\",\n                       request_id);\n\n        _libssh2_list_remove(&zombie->node);\n        LIBSSH2_FREE(session, zombie);\n    }\n}\n\nstatic int\nadd_zombie_request(LIBSSH2_SFTP *sftp, uint32_t request_id)\n{\n    LIBSSH2_SESSION *session = sftp->channel->session;\n\n    struct sftp_zombie_requests *zombie;\n\n    _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                   \"Marking request ID %ld as a zombie request\", request_id);\n\n    zombie = LIBSSH2_ALLOC(sftp->channel->session,\n                           sizeof(struct sftp_zombie_requests));\n    if(!zombie)\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"malloc fail for zombie request  ID\");\n    else {\n        zombie->request_id = request_id;\n        _libssh2_list_add(&sftp->zombie_requests, &zombie->node);\n        return LIBSSH2_ERROR_NONE;\n    }\n}\n\n/*\n * sftp_packet_add\n *\n * Add a packet to the SFTP packet brigade\n */\nstatic int\nsftp_packet_add(LIBSSH2_SFTP *sftp, unsigned char *data,\n                size_t data_len)\n{\n    LIBSSH2_SESSION *session = sftp->channel->session;\n    LIBSSH2_SFTP_PACKET *packet;\n    uint32_t request_id;\n\n    if(data_len < 5) {\n        return LIBSSH2_ERROR_OUT_OF_BOUNDARY;\n    }\n\n    _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                   \"Received packet type %d (len %d)\",\n                   (int) data[0], data_len);\n\n    /*\n     * Experience shows that if we mess up EAGAIN handling somewhere or\n     * otherwise get out of sync with the channel, this is where we first get\n     * a wrong byte and if so we need to bail out at once to aid tracking the\n     * problem better.\n     */\n\n    switch(data[0]) {\n    case SSH_FXP_INIT:\n    case SSH_FXP_VERSION:\n    case SSH_FXP_OPEN:\n    case SSH_FXP_CLOSE:\n    case SSH_FXP_READ:\n    case SSH_FXP_WRITE:\n    case SSH_FXP_LSTAT:\n    case SSH_FXP_FSTAT:\n    case SSH_FXP_SETSTAT:\n    case SSH_FXP_FSETSTAT:\n    case SSH_FXP_OPENDIR:\n    case SSH_FXP_READDIR:\n    case SSH_FXP_REMOVE:\n    case SSH_FXP_MKDIR:\n    case SSH_FXP_RMDIR:\n    case SSH_FXP_REALPATH:\n    case SSH_FXP_STAT:\n    case SSH_FXP_RENAME:\n    case SSH_FXP_READLINK:\n    case SSH_FXP_SYMLINK:\n    case SSH_FXP_STATUS:\n    case SSH_FXP_HANDLE:\n    case SSH_FXP_DATA:\n    case SSH_FXP_NAME:\n    case SSH_FXP_ATTRS:\n    case SSH_FXP_EXTENDED:\n    case SSH_FXP_EXTENDED_REPLY:\n        break;\n    default:\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"Out of sync with the world\");\n    }\n\n    request_id = _libssh2_ntohu32(&data[1]);\n\n    _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Received packet id %d\",\n                   request_id);\n\n    /* Don't add the packet if it answers a request we've given up on. */\n    if((data[0] == SSH_FXP_STATUS || data[0] == SSH_FXP_DATA)\n       && find_zombie_request(sftp, request_id)) {\n\n        /* If we get here, the file ended before the response arrived. We\n           are no longer interested in the request so we discard it */\n\n        LIBSSH2_FREE(session, data);\n\n        remove_zombie_request(sftp, request_id);\n        return LIBSSH2_ERROR_NONE;\n    }\n\n    packet = LIBSSH2_ALLOC(session, sizeof(LIBSSH2_SFTP_PACKET));\n    if(!packet) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Unable to allocate datablock for SFTP packet\");\n    }\n\n    packet->data = data;\n    packet->data_len = data_len;\n    packet->request_id = request_id;\n\n    _libssh2_list_add(&sftp->packets, &packet->node);\n\n    return LIBSSH2_ERROR_NONE;\n}\n\n/*\n * sftp_packet_read\n *\n * Frame an SFTP packet off the channel\n */\nstatic int\nsftp_packet_read(LIBSSH2_SFTP *sftp)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    unsigned char *packet = NULL;\n    ssize_t rc;\n    unsigned long recv_window;\n    int packet_type;\n\n    _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"recv packet\");\n\n    switch(sftp->packet_state) {\n    case libssh2_NB_state_sent: /* EAGAIN from window adjusting */\n        sftp->packet_state = libssh2_NB_state_idle;\n\n        packet = sftp->partial_packet;\n        goto window_adjust;\n\n    case libssh2_NB_state_sent1: /* EAGAIN from channel read */\n        sftp->packet_state = libssh2_NB_state_idle;\n\n        packet = sftp->partial_packet;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"partial read cont, len: %lu\", sftp->partial_len);\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"partial read cont, already recvd: %lu\",\n                       sftp->partial_received);\n        /* fall-through */\n    default:\n        if(!packet) {\n            /* only do this if there's not already a packet buffer allocated\n               to use */\n\n            /* each packet starts with a 32 bit length field */\n            rc = _libssh2_channel_read(channel, 0,\n                                       (char *)&sftp->partial_size[\n                                           sftp->partial_size_len],\n                                       4 - sftp->partial_size_len);\n            if(rc == LIBSSH2_ERROR_EAGAIN)\n                return rc;\n            else if(rc < 0)\n                return _libssh2_error(session, rc, \"channel read\");\n\n            sftp->partial_size_len += rc;\n\n            if(4 != sftp->partial_size_len)\n                /* we got a short read for the length part */\n                return LIBSSH2_ERROR_EAGAIN;\n\n            sftp->partial_len = _libssh2_ntohu32(sftp->partial_size);\n            /* make sure we don't proceed if the packet size is unreasonably\n               large */\n            if(sftp->partial_len > LIBSSH2_SFTP_PACKET_MAXLEN) {\n                libssh2_channel_flush(channel);\n                sftp->partial_size_len = 0;\n                return _libssh2_error(session,\n                                      LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED,\n                                      \"SFTP packet too large\");\n            }\n\n            if(sftp->partial_len == 0)\n                return _libssh2_error(session,\n                                      LIBSSH2_ERROR_ALLOC,\n                                      \"Unable to allocate empty SFTP packet\");\n\n            _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                           \"Data begin - Packet Length: %lu\",\n                           sftp->partial_len);\n            packet = LIBSSH2_ALLOC(session, sftp->partial_len);\n            if(!packet)\n                return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                      \"Unable to allocate SFTP packet\");\n            sftp->partial_size_len = 0;\n            sftp->partial_received = 0; /* how much of the packet already\n                                           received */\n            sftp->partial_packet = packet;\n\n          window_adjust:\n            recv_window = libssh2_channel_window_read_ex(channel, NULL, NULL);\n\n            if(sftp->partial_len > recv_window) {\n                /* ask for twice the data amount we need at once */\n                rc = _libssh2_channel_receive_window_adjust(channel,\n                                                            sftp->partial_len\n                                                            * 2,\n                                                            1, NULL);\n                /* store the state so that we continue with the correct\n                   operation at next invoke */\n                sftp->packet_state = (rc == LIBSSH2_ERROR_EAGAIN)?\n                    libssh2_NB_state_sent:\n                    libssh2_NB_state_idle;\n\n                if(rc == LIBSSH2_ERROR_EAGAIN)\n                    return rc;\n            }\n        }\n\n        /* Read as much of the packet as we can */\n        while(sftp->partial_len > sftp->partial_received) {\n            rc = _libssh2_channel_read(channel, 0,\n                                       (char *)&packet[sftp->partial_received],\n                                       sftp->partial_len -\n                                       sftp->partial_received);\n\n            if(rc == LIBSSH2_ERROR_EAGAIN) {\n                /*\n                 * We received EAGAIN, save what we have and return EAGAIN to\n                 * the caller. Set 'partial_packet' so that this function\n                 * knows how to continue on the next invoke.\n                 */\n                sftp->packet_state = libssh2_NB_state_sent1;\n                return rc;\n            }\n            else if(rc < 0) {\n                LIBSSH2_FREE(session, packet);\n                sftp->partial_packet = NULL;\n                return _libssh2_error(session, rc,\n                                      \"Error waiting for SFTP packet\");\n            }\n            sftp->partial_received += rc;\n        }\n\n        sftp->partial_packet = NULL;\n\n        /* sftp_packet_add takes ownership of the packet and might free it\n           so we take a copy of the packet type before we call it. */\n        packet_type = packet[0];\n        rc = sftp_packet_add(sftp, packet, sftp->partial_len);\n        if(rc) {\n            LIBSSH2_FREE(session, packet);\n            return rc;\n        }\n        else {\n            return packet_type;\n        }\n    }\n    /* WON'T REACH */\n}\n/*\n * sftp_packetlist_flush\n *\n * Remove all pending packets in the packet_list and the corresponding one(s)\n * in the SFTP packet brigade.\n */\nstatic void sftp_packetlist_flush(LIBSSH2_SFTP_HANDLE *handle)\n{\n    struct sftp_pipeline_chunk *chunk;\n    LIBSSH2_SFTP *sftp = handle->sftp;\n    LIBSSH2_SESSION *session = sftp->channel->session;\n\n    /* remove pending packets, if any */\n    chunk = _libssh2_list_first(&handle->packet_list);\n    while(chunk) {\n        unsigned char *data;\n        size_t data_len;\n        int rc;\n        struct sftp_pipeline_chunk *next = _libssh2_list_next(&chunk->node);\n\n        rc = sftp_packet_ask(sftp, SSH_FXP_STATUS,\n                             chunk->request_id, &data, &data_len);\n        if(rc)\n            rc = sftp_packet_ask(sftp, SSH_FXP_DATA,\n                                 chunk->request_id, &data, &data_len);\n\n        if(!rc)\n            /* we found a packet, free it */\n            LIBSSH2_FREE(session, data);\n        else if(chunk->sent)\n            /* there was no incoming packet for this request, mark this\n               request as a zombie if it ever sent the request */\n            add_zombie_request(sftp, chunk->request_id);\n\n        _libssh2_list_remove(&chunk->node);\n        LIBSSH2_FREE(session, chunk);\n        chunk = next;\n    }\n}\n\n\n/*\n * sftp_packet_ask()\n *\n * Checks if there's a matching SFTP packet available.\n */\nstatic int\nsftp_packet_ask(LIBSSH2_SFTP *sftp, unsigned char packet_type,\n                uint32_t request_id, unsigned char **data,\n                size_t *data_len)\n{\n    LIBSSH2_SESSION *session = sftp->channel->session;\n    LIBSSH2_SFTP_PACKET *packet = _libssh2_list_first(&sftp->packets);\n\n    if(!packet)\n        return -1;\n\n    /* Special consideration when getting VERSION packet */\n\n    while(packet) {\n        if((packet->data[0] == packet_type) &&\n           ((packet_type == SSH_FXP_VERSION) ||\n            (packet->request_id == request_id))) {\n\n            /* Match! Fetch the data */\n            *data = packet->data;\n            *data_len = packet->data_len;\n\n            /* unlink and free this struct */\n            _libssh2_list_remove(&packet->node);\n            LIBSSH2_FREE(session, packet);\n\n            return 0;\n        }\n        /* check next struct in the list */\n        packet = _libssh2_list_next(&packet->node);\n    }\n    return -1;\n}\n\n/* sftp_packet_require\n * A la libssh2_packet_require\n */\nstatic int\nsftp_packet_require(LIBSSH2_SFTP *sftp, unsigned char packet_type,\n                    uint32_t request_id, unsigned char **data,\n                    size_t *data_len, size_t required_size)\n{\n    LIBSSH2_SESSION *session = sftp->channel->session;\n    int rc;\n\n    if(data == NULL || data_len == NULL || required_size == 0) {\n        return LIBSSH2_ERROR_BAD_USE;\n    }\n\n    _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Requiring packet %d id %ld\",\n                   (int) packet_type, request_id);\n\n    if(sftp_packet_ask(sftp, packet_type, request_id, data, data_len) == 0) {\n        /* The right packet was available in the packet brigade */\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Got %d\",\n                       (int) packet_type);\n\n        if (*data_len < required_size) {\n            return LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n        }\n\n        return LIBSSH2_ERROR_NONE;\n    }\n\n    while(session->socket_state == LIBSSH2_SOCKET_CONNECTED) {\n        rc = sftp_packet_read(sftp);\n        if(rc < 0)\n            return rc;\n\n        /* data was read, check the queue again */\n        if(!sftp_packet_ask(sftp, packet_type, request_id, data, data_len)) {\n            /* The right packet was available in the packet brigade */\n            _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Got %d\",\n                           (int) packet_type);\n\n            if (*data_len < required_size) {\n                return LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n            }\n\n            return LIBSSH2_ERROR_NONE;\n        }\n    }\n\n    /* Only reached if the socket died */\n    return LIBSSH2_ERROR_SOCKET_DISCONNECT;\n}\n\n/* sftp_packet_requirev\n * Require one of N possible responses\n */\nstatic int\nsftp_packet_requirev(LIBSSH2_SFTP *sftp, int num_valid_responses,\n                     const unsigned char *valid_responses,\n                     uint32_t request_id, unsigned char **data,\n                     size_t *data_len, size_t required_size)\n{\n    int i;\n    int rc;\n\n    if(data == NULL || data_len == NULL || required_size == 0) {\n        return LIBSSH2_ERROR_BAD_USE;\n    }\n\n    /* If no timeout is active, start a new one */\n    if(sftp->requirev_start == 0)\n        sftp->requirev_start = time(NULL);\n\n    while(sftp->channel->session->socket_state == LIBSSH2_SOCKET_CONNECTED) {\n        for(i = 0; i < num_valid_responses; i++) {\n            if(sftp_packet_ask(sftp, valid_responses[i], request_id,\n                                data, data_len) == 0) {\n                /*\n                 * Set to zero before all returns to say\n                 * the timeout is not active\n                 */\n                sftp->requirev_start = 0;\n\n                if (*data_len < required_size) {\n                    return LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n                }\n\n                return LIBSSH2_ERROR_NONE;\n            }\n        }\n\n        rc = sftp_packet_read(sftp);\n        if((rc < 0) && (rc != LIBSSH2_ERROR_EAGAIN)) {\n            sftp->requirev_start = 0;\n            return rc;\n        }\n        else if(rc <= 0) {\n            /* prevent busy-looping */\n            long left =\n                LIBSSH2_READ_TIMEOUT -\n                (long)(time(NULL) - sftp->requirev_start);\n\n            if(left <= 0) {\n                sftp->requirev_start = 0;\n                return LIBSSH2_ERROR_TIMEOUT;\n            }\n            else if(rc == LIBSSH2_ERROR_EAGAIN) {\n                return rc;\n            }\n        }\n    }\n\n    sftp->requirev_start = 0;\n\n    /* Only reached if the socket died */\n    return LIBSSH2_ERROR_SOCKET_DISCONNECT;\n}\n\n/* sftp_attr2bin\n * Populate attributes into an SFTP block\n */\nstatic ssize_t\nsftp_attr2bin(unsigned char *p, const LIBSSH2_SFTP_ATTRIBUTES * attrs)\n{\n    unsigned char *s = p;\n    uint32_t flag_mask =\n        LIBSSH2_SFTP_ATTR_SIZE | LIBSSH2_SFTP_ATTR_UIDGID |\n        LIBSSH2_SFTP_ATTR_PERMISSIONS | LIBSSH2_SFTP_ATTR_ACMODTIME;\n\n    /* TODO: When we add SFTP4+ functionality flag_mask can get additional\n       bits */\n\n    if(!attrs) {\n        _libssh2_htonu32(s, 0);\n        return 4;\n    }\n\n    _libssh2_store_u32(&s, attrs->flags & flag_mask);\n\n    if(attrs->flags & LIBSSH2_SFTP_ATTR_SIZE) {\n        _libssh2_store_u64(&s, attrs->filesize);\n    }\n\n    if(attrs->flags & LIBSSH2_SFTP_ATTR_UIDGID) {\n        _libssh2_store_u32(&s, attrs->uid);\n        _libssh2_store_u32(&s, attrs->gid);\n    }\n\n    if(attrs->flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) {\n        _libssh2_store_u32(&s, attrs->permissions);\n    }\n\n    if(attrs->flags & LIBSSH2_SFTP_ATTR_ACMODTIME) {\n        _libssh2_store_u32(&s, attrs->atime);\n        _libssh2_store_u32(&s, attrs->mtime);\n    }\n\n    return (s - p);\n}\n\n/* sftp_bin2attr\n */\nstatic int\nsftp_bin2attr(LIBSSH2_SFTP_ATTRIBUTES *attrs, const unsigned char *p,\n              size_t data_len)\n{\n    struct string_buf buf;\n    uint32_t flags = 0;\n    buf.data = (unsigned char *)p;\n    buf.dataptr = buf.data;\n    buf.len = data_len;\n\n    if(_libssh2_get_u32(&buf, &flags) != 0) {\n        return LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n    }\n    attrs->flags = flags;\n\n    if(attrs->flags & LIBSSH2_SFTP_ATTR_SIZE) {\n        if(_libssh2_get_u64(&buf, &(attrs->filesize)) != 0) {\n            return LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n        }\n    }\n\n    if(attrs->flags & LIBSSH2_SFTP_ATTR_UIDGID) {\n        uint32_t uid = 0;\n        uint32_t gid = 0;\n        if(_libssh2_get_u32(&buf, &uid) != 0 ||\n           _libssh2_get_u32(&buf, &gid) != 0) {\n            return LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n        }\n        attrs->uid = uid;\n        attrs->gid = gid;\n    }\n\n    if(attrs->flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) {\n        uint32_t permissions;\n        if(_libssh2_get_u32(&buf, &permissions) != 0) {\n            return LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n        }\n        attrs->permissions = permissions;\n    }\n\n    if(attrs->flags & LIBSSH2_SFTP_ATTR_ACMODTIME) {\n        uint32_t atime;\n        uint32_t mtime;\n        if(_libssh2_get_u32(&buf, &atime) != 0 ||\n           _libssh2_get_u32(&buf, &mtime) != 0) {\n            return LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n        }\n        attrs->atime = atime;\n        attrs->mtime = mtime;\n    }\n\n    return (buf.dataptr - buf.data);\n}\n\n/* ************\n * SFTP API *\n ************ */\n\nLIBSSH2_CHANNEL_CLOSE_FUNC(libssh2_sftp_dtor);\n\n/* libssh2_sftp_dtor\n * Shutdown an SFTP stream when the channel closes\n */\nLIBSSH2_CHANNEL_CLOSE_FUNC(libssh2_sftp_dtor)\n{\n    LIBSSH2_SFTP *sftp = (LIBSSH2_SFTP *) (*channel_abstract);\n\n    (void) session_abstract;\n    (void) channel;\n\n    /* Free the partial packet storage for sftp_packet_read */\n    if(sftp->partial_packet) {\n        LIBSSH2_FREE(session, sftp->partial_packet);\n    }\n\n    /* Free the packet storage for _libssh2_sftp_packet_readdir */\n    if(sftp->readdir_packet) {\n        LIBSSH2_FREE(session, sftp->readdir_packet);\n    }\n\n    LIBSSH2_FREE(session, sftp);\n}\n\n/*\n * sftp_init\n *\n * Startup an SFTP session\n */\nstatic LIBSSH2_SFTP *sftp_init(LIBSSH2_SESSION *session)\n{\n    unsigned char *data;\n    size_t data_len;\n    ssize_t rc;\n    LIBSSH2_SFTP *sftp_handle;\n    struct string_buf buf;\n    unsigned char *endp;\n\n    if(session->sftpInit_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Initializing SFTP subsystem\");\n\n        /*\n         * The 'sftpInit_sftp' and 'sftpInit_channel' struct fields within the\n         * session struct are only to be used during the setup phase. As soon\n         * as the SFTP session is created they are cleared and can thus be\n         * re-used again to allow any amount of SFTP handles per sessions.\n         *\n         * Note that you MUST NOT try to call libssh2_sftp_init() again to get\n         * another handle until the previous call has finished and either\n         * successfully made a handle or failed and returned error (not\n         * including *EAGAIN).\n         */\n\n        assert(session->sftpInit_sftp == NULL);\n        session->sftpInit_sftp = NULL;\n        session->sftpInit_state = libssh2_NB_state_created;\n    }\n\n    sftp_handle = session->sftpInit_sftp;\n\n    if(session->sftpInit_state == libssh2_NB_state_created) {\n        session->sftpInit_channel =\n            _libssh2_channel_open(session, \"session\", sizeof(\"session\") - 1,\n                                  LIBSSH2_CHANNEL_WINDOW_DEFAULT,\n                                  LIBSSH2_CHANNEL_PACKET_DEFAULT, NULL, 0);\n        if(!session->sftpInit_channel) {\n            if(libssh2_session_last_errno(session) == LIBSSH2_ERROR_EAGAIN) {\n                _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                               \"Would block starting up channel\");\n            }\n            else {\n                _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                               \"Unable to startup channel\");\n                session->sftpInit_state = libssh2_NB_state_idle;\n            }\n            return NULL;\n        }\n\n        session->sftpInit_state = libssh2_NB_state_sent;\n    }\n\n    if(session->sftpInit_state == libssh2_NB_state_sent) {\n        int ret = _libssh2_channel_process_startup(session->sftpInit_channel,\n                                                   \"subsystem\",\n                                                   sizeof(\"subsystem\") - 1,\n                                                   \"sftp\",\n                                                   strlen(\"sftp\"));\n        if(ret == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block to request SFTP subsystem\");\n            return NULL;\n        }\n        else if(ret) {\n            _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE,\n                           \"Unable to request SFTP subsystem\");\n            goto sftp_init_error;\n        }\n\n        session->sftpInit_state = libssh2_NB_state_sent1;\n    }\n\n    if(session->sftpInit_state == libssh2_NB_state_sent1) {\n        rc = _libssh2_channel_extended_data(session->sftpInit_channel,\n                                         LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block requesting handle extended data\");\n            return NULL;\n        }\n\n        sftp_handle =\n            session->sftpInit_sftp =\n            LIBSSH2_CALLOC(session, sizeof(LIBSSH2_SFTP));\n        if(!sftp_handle) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate a new SFTP structure\");\n            goto sftp_init_error;\n        }\n        sftp_handle->channel = session->sftpInit_channel;\n        sftp_handle->request_id = 0;\n\n        _libssh2_htonu32(session->sftpInit_buffer, 5);\n        session->sftpInit_buffer[4] = SSH_FXP_INIT;\n        _libssh2_htonu32(session->sftpInit_buffer + 5, LIBSSH2_SFTP_VERSION);\n        session->sftpInit_sent = 0; /* nothing's sent yet */\n\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Sending FXP_INIT packet advertising \"\n                       \"version %d support\",\n                       (int) LIBSSH2_SFTP_VERSION);\n\n        session->sftpInit_state = libssh2_NB_state_sent2;\n    }\n\n    if(session->sftpInit_state == libssh2_NB_state_sent2) {\n        /* sent off what's left of the init buffer to send */\n        rc = _libssh2_channel_write(session->sftpInit_channel, 0,\n                                    session->sftpInit_buffer +\n                                    session->sftpInit_sent,\n                                    9 - session->sftpInit_sent);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block sending SSH_FXP_INIT\");\n            return NULL;\n        }\n        else if(rc < 0) {\n            _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                           \"Unable to send SSH_FXP_INIT\");\n            goto sftp_init_error;\n        }\n        else {\n            /* add up the number of bytes sent */\n            session->sftpInit_sent += rc;\n\n            if(session->sftpInit_sent == 9)\n                /* move on */\n                session->sftpInit_state = libssh2_NB_state_sent3;\n\n            /* if less than 9, we remain in this state to send more later on */\n        }\n    }\n\n    rc = sftp_packet_require(sftp_handle, SSH_FXP_VERSION,\n                             0, &data, &data_len, 5);\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                       \"Would block receiving SSH_FXP_VERSION\");\n        return NULL;\n    }\n    else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n        if(data_len > 0) {\n            LIBSSH2_FREE(session, data);\n        }\n        _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                       \"Invalid SSH_FXP_VERSION response\");\n        goto sftp_init_error;\n    }\n    else if(rc) {\n        _libssh2_error(session, rc,\n                       \"Timeout waiting for response from SFTP subsystem\");\n        goto sftp_init_error;\n    }\n\n    buf.data = data;\n    buf.dataptr = buf.data + 1;\n    buf.len = data_len;\n    endp = &buf.data[data_len];\n\n    if(_libssh2_get_u32(&buf, &(sftp_handle->version)) != 0) {\n        LIBSSH2_FREE(session, data);\n        rc = LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n        goto sftp_init_error;\n    }\n\n    if(sftp_handle->version > LIBSSH2_SFTP_VERSION) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Truncating remote SFTP version from %lu\",\n                       sftp_handle->version);\n        sftp_handle->version = LIBSSH2_SFTP_VERSION;\n    }\n    _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                   \"Enabling SFTP version %lu compatibility\",\n                   sftp_handle->version);\n    while(buf.dataptr < endp) {\n        unsigned char *extname, *extdata;\n\n        if(_libssh2_get_string(&buf, &extname, NULL)) {\n            LIBSSH2_FREE(session, data);\n            _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                           \"Data too short when extracting extname\");\n            goto sftp_init_error;\n        }\n\n        if(_libssh2_get_string(&buf, &extdata, NULL)) {\n            LIBSSH2_FREE(session, data);\n            _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                           \"Data too short when extracting extdata\");\n            goto sftp_init_error;\n        }\n    }\n    LIBSSH2_FREE(session, data);\n\n    /* Make sure that when the channel gets closed, the SFTP service is shut\n       down too */\n    sftp_handle->channel->abstract = sftp_handle;\n    sftp_handle->channel->close_cb = libssh2_sftp_dtor;\n\n    session->sftpInit_state = libssh2_NB_state_idle;\n\n    /* clear the sftp and channel pointers in this session struct now */\n    session->sftpInit_sftp = NULL;\n    session->sftpInit_channel = NULL;\n\n    _libssh2_list_init(&sftp_handle->sftp_handles);\n\n    return sftp_handle;\n\n  sftp_init_error:\n    while(_libssh2_channel_free(session->sftpInit_channel) ==\n           LIBSSH2_ERROR_EAGAIN);\n    session->sftpInit_channel = NULL;\n    if(session->sftpInit_sftp) {\n        LIBSSH2_FREE(session, session->sftpInit_sftp);\n        session->sftpInit_sftp = NULL;\n    }\n    session->sftpInit_state = libssh2_NB_state_idle;\n    return NULL;\n}\n\n/*\n * libssh2_sftp_init\n *\n * Startup an SFTP session\n */\nLIBSSH2_API LIBSSH2_SFTP *libssh2_sftp_init(LIBSSH2_SESSION *session)\n{\n    LIBSSH2_SFTP *ptr;\n\n    if(!session)\n        return NULL;\n\n    if(!(session->state & LIBSSH2_STATE_AUTHENTICATED)) {\n        _libssh2_error(session, LIBSSH2_ERROR_INVAL,\n                       \"session not authenticated yet\");\n        return NULL;\n    }\n\n    BLOCK_ADJUST_ERRNO(ptr, session, sftp_init(session));\n    return ptr;\n}\n\n/*\n * sftp_shutdown\n *\n * Shuts down the SFTP subsystem\n */\nstatic int\nsftp_shutdown(LIBSSH2_SFTP *sftp)\n{\n    int rc;\n    LIBSSH2_SESSION *session = sftp->channel->session;\n    /*\n     * Make sure all memory used in the state variables are free\n     */\n    if(sftp->partial_packet) {\n        LIBSSH2_FREE(session, sftp->partial_packet);\n        sftp->partial_packet = NULL;\n    }\n    if(sftp->open_packet) {\n        LIBSSH2_FREE(session, sftp->open_packet);\n        sftp->open_packet = NULL;\n    }\n    if(sftp->readdir_packet) {\n        LIBSSH2_FREE(session, sftp->readdir_packet);\n        sftp->readdir_packet = NULL;\n    }\n    if(sftp->fstat_packet) {\n        LIBSSH2_FREE(session, sftp->fstat_packet);\n        sftp->fstat_packet = NULL;\n    }\n    if(sftp->unlink_packet) {\n        LIBSSH2_FREE(session, sftp->unlink_packet);\n        sftp->unlink_packet = NULL;\n    }\n    if(sftp->rename_packet) {\n        LIBSSH2_FREE(session, sftp->rename_packet);\n        sftp->rename_packet = NULL;\n    }\n    if(sftp->fstatvfs_packet) {\n        LIBSSH2_FREE(session, sftp->fstatvfs_packet);\n        sftp->fstatvfs_packet = NULL;\n    }\n    if(sftp->statvfs_packet) {\n        LIBSSH2_FREE(session, sftp->statvfs_packet);\n        sftp->statvfs_packet = NULL;\n    }\n    if(sftp->mkdir_packet) {\n        LIBSSH2_FREE(session, sftp->mkdir_packet);\n        sftp->mkdir_packet = NULL;\n    }\n    if(sftp->rmdir_packet) {\n        LIBSSH2_FREE(session, sftp->rmdir_packet);\n        sftp->rmdir_packet = NULL;\n    }\n    if(sftp->stat_packet) {\n        LIBSSH2_FREE(session, sftp->stat_packet);\n        sftp->stat_packet = NULL;\n    }\n    if(sftp->symlink_packet) {\n        LIBSSH2_FREE(session, sftp->symlink_packet);\n        sftp->symlink_packet = NULL;\n    }\n    if(sftp->fsync_packet) {\n        LIBSSH2_FREE(session, sftp->fsync_packet);\n        sftp->fsync_packet = NULL;\n    }\n\n    sftp_packet_flush(sftp);\n\n    /* TODO: We should consider walking over the sftp_handles list and kill\n     * any remaining sftp handles ... */\n\n    rc = _libssh2_channel_free(sftp->channel);\n\n    return rc;\n}\n\n/* libssh2_sftp_shutdown\n * Shutsdown the SFTP subsystem\n */\nLIBSSH2_API int\nlibssh2_sftp_shutdown(LIBSSH2_SFTP *sftp)\n{\n    int rc;\n    if(!sftp)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, sftp->channel->session, sftp_shutdown(sftp));\n    return rc;\n}\n\n/* *******************************\n * SFTP File and Directory Ops *\n ******************************* */\n\n/* sftp_open\n */\nstatic LIBSSH2_SFTP_HANDLE *\nsftp_open(LIBSSH2_SFTP *sftp, const char *filename,\n          size_t filename_len, uint32_t flags, long mode,\n          int open_type)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    LIBSSH2_SFTP_HANDLE *fp;\n    LIBSSH2_SFTP_ATTRIBUTES attrs = {\n        LIBSSH2_SFTP_ATTR_PERMISSIONS, 0, 0, 0, 0, 0, 0\n    };\n    unsigned char *s;\n    ssize_t rc;\n    int open_file = (open_type == LIBSSH2_SFTP_OPENFILE)?1:0;\n\n    if(sftp->open_state == libssh2_NB_state_idle) {\n        /* packet_len(4) + packet_type(1) + request_id(4) + filename_len(4) +\n           flags(4) */\n        sftp->open_packet_len = filename_len + 13 +\n            (open_file? (4 +\n                         sftp_attrsize(LIBSSH2_SFTP_ATTR_PERMISSIONS)) : 0);\n\n        /* surprise! this starts out with nothing sent */\n        sftp->open_packet_sent = 0;\n        s = sftp->open_packet = LIBSSH2_ALLOC(session, sftp->open_packet_len);\n        if(!sftp->open_packet) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate memory for FXP_OPEN or \"\n                           \"FXP_OPENDIR packet\");\n            return NULL;\n        }\n        /* Filetype in SFTP 3 and earlier */\n        attrs.permissions = mode |\n            (open_file ? LIBSSH2_SFTP_ATTR_PFILETYPE_FILE :\n             LIBSSH2_SFTP_ATTR_PFILETYPE_DIR);\n\n        _libssh2_store_u32(&s, sftp->open_packet_len - 4);\n        *(s++) = open_file? SSH_FXP_OPEN : SSH_FXP_OPENDIR;\n        sftp->open_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->open_request_id);\n        _libssh2_store_str(&s, filename, filename_len);\n\n        if(open_file) {\n            _libssh2_store_u32(&s, flags);\n            s += sftp_attr2bin(s, &attrs);\n        }\n\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Sending %s open request\",\n                       open_file? \"file\" : \"directory\");\n\n        sftp->open_state = libssh2_NB_state_created;\n    }\n\n    if(sftp->open_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, sftp->open_packet+\n                                    sftp->open_packet_sent,\n                                    sftp->open_packet_len -\n                                    sftp->open_packet_sent);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block sending FXP_OPEN or \"\n                           \"FXP_OPENDIR command\");\n            return NULL;\n        }\n        else if(rc < 0) {\n            _libssh2_error(session, rc, \"Unable to send FXP_OPEN*\");\n            LIBSSH2_FREE(session, sftp->open_packet);\n            sftp->open_packet = NULL;\n            sftp->open_state = libssh2_NB_state_idle;\n            return NULL;\n        }\n\n        /* bump the sent counter and remain in this state until the whole\n           data is off */\n        sftp->open_packet_sent += rc;\n\n        if(sftp->open_packet_len == sftp->open_packet_sent) {\n            LIBSSH2_FREE(session, sftp->open_packet);\n            sftp->open_packet = NULL;\n\n            sftp->open_state = libssh2_NB_state_sent;\n        }\n    }\n\n    if(sftp->open_state == libssh2_NB_state_sent) {\n        size_t data_len;\n        unsigned char *data;\n        static const unsigned char fopen_responses[2] =\n            { SSH_FXP_HANDLE, SSH_FXP_STATUS };\n        rc = sftp_packet_requirev(sftp, 2, fopen_responses,\n                                  sftp->open_request_id, &data,\n                                  &data_len, 1);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block waiting for status message\");\n            return NULL;\n        }\n        else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n            if(data_len > 0) {\n                LIBSSH2_FREE(session, data);\n            }\n            _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                           \"Response too small\");\n            return NULL;\n        }\n        sftp->open_state = libssh2_NB_state_idle;\n        if(rc) {\n            _libssh2_error(session, rc, \"Timeout waiting for status message\");\n            return NULL;\n        }\n\n        /* OPEN can basically get STATUS or HANDLE back, where HANDLE implies\n           a fine response while STATUS means error. It seems though that at\n           times we get an SSH_FX_OK back in a STATUS, followed the \"real\"\n           HANDLE so we need to properly deal with that. */\n        if(data[0] == SSH_FXP_STATUS) {\n            int badness = 1;\n\n            if(data_len < 9) {\n                _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                               \"Too small FXP_STATUS\");\n                LIBSSH2_FREE(session, data);\n                return NULL;\n            }\n\n            sftp->last_errno = _libssh2_ntohu32(data + 5);\n\n            if(LIBSSH2_FX_OK == sftp->last_errno) {\n                _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                               \"got HANDLE FXOK!\");\n\n                LIBSSH2_FREE(session, data);\n\n                /* silly situation, but check for a HANDLE */\n                rc = sftp_packet_require(sftp, SSH_FXP_HANDLE,\n                                         sftp->open_request_id, &data,\n                                         &data_len, 10);\n                if(rc == LIBSSH2_ERROR_EAGAIN) {\n                    /* go back to sent state and wait for something else */\n                    sftp->open_state = libssh2_NB_state_sent;\n                    return NULL;\n                }\n                else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n                    if(data_len > 0) {\n                        LIBSSH2_FREE(session, data);\n                    }\n                    _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                   \"Too small FXP_HANDLE\");\n                    return NULL;\n                }\n                else if(!rc)\n                    /* we got the handle so this is not a bad situation */\n                    badness = 0;\n            }\n\n            if(badness) {\n                _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                               \"Failed opening remote file\");\n                _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                               \"got FXP_STATUS %d\",\n                               sftp->last_errno);\n                LIBSSH2_FREE(session, data);\n                return NULL;\n            }\n        }\n\n        if(data_len < 10) {\n            _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                           \"Too small FXP_HANDLE\");\n            LIBSSH2_FREE(session, data);\n            return NULL;\n        }\n\n        fp = LIBSSH2_CALLOC(session, sizeof(LIBSSH2_SFTP_HANDLE));\n        if(!fp) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate new SFTP handle structure\");\n            LIBSSH2_FREE(session, data);\n            return NULL;\n        }\n        fp->handle_type = open_file ? LIBSSH2_SFTP_HANDLE_FILE :\n            LIBSSH2_SFTP_HANDLE_DIR;\n\n        fp->handle_len = _libssh2_ntohu32(data + 5);\n        if(fp->handle_len > SFTP_HANDLE_MAXLEN)\n            /* SFTP doesn't allow handles longer than 256 characters */\n            fp->handle_len = SFTP_HANDLE_MAXLEN;\n\n        if(fp->handle_len > (data_len - 9))\n            /* do not reach beyond the end of the data we got */\n            fp->handle_len = data_len - 9;\n\n        memcpy(fp->handle, data + 9, fp->handle_len);\n\n        LIBSSH2_FREE(session, data);\n\n        /* add this file handle to the list kept in the sftp session */\n        _libssh2_list_add(&sftp->sftp_handles, &fp->node);\n\n        fp->sftp = sftp; /* point to the parent struct */\n\n        fp->u.file.offset = 0;\n        fp->u.file.offset_sent = 0;\n\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Open command successful\");\n        return fp;\n    }\n    return NULL;\n}\n\n/* libssh2_sftp_open_ex\n */\nLIBSSH2_API LIBSSH2_SFTP_HANDLE *\nlibssh2_sftp_open_ex(LIBSSH2_SFTP *sftp, const char *filename,\n                     unsigned int filename_len, unsigned long flags, long mode,\n                     int open_type)\n{\n    LIBSSH2_SFTP_HANDLE *hnd;\n\n    if(!sftp)\n        return NULL;\n\n    BLOCK_ADJUST_ERRNO(hnd, sftp->channel->session,\n                       sftp_open(sftp, filename, filename_len, flags, mode,\n                                 open_type));\n    return hnd;\n}\n\n/*\n * sftp_read\n *\n * Read from an SFTP file handle\n *\n */\nstatic ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer,\n                         size_t buffer_size)\n{\n    LIBSSH2_SFTP *sftp = handle->sftp;\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t count = 0;\n    struct sftp_pipeline_chunk *chunk;\n    struct sftp_pipeline_chunk *next;\n    ssize_t rc;\n    struct _libssh2_sftp_handle_file_data *filep =\n        &handle->u.file;\n    size_t bytes_in_buffer = 0;\n    char *sliding_bufferp = buffer;\n\n    /* This function can be interrupted in three different places where it\n       might need to wait for data from the network.  It returns EAGAIN to\n       allow non-blocking clients to do other work but these client are\n       expected to call this function again (possibly many times) to finish\n       the operation.\n\n       The tricky part is that if we previously aborted a sftp_read due to\n       EAGAIN, we must continue at the same spot to continue the previously\n       interrupted operation.  This is done using a state machine to record\n       what phase of execution we were at.  The state is stored in\n       sftp->read_state.\n\n       libssh2_NB_state_idle: The first phase is where we prepare multiple\n       FXP_READ packets to do optimistic read-ahead.  We send off as many as\n       possible in the second phase without waiting for a response to each\n       one; this is the key to fast reads. But we may have to adjust the\n       channel window size to do this which may interrupt this function while\n       waiting.  The state machine saves the phase as libssh2_NB_state_idle so\n       it returns here on the next call.\n\n       libssh2_NB_state_sent: The second phase is where we send the FXP_READ\n       packets.  Writing them to the channel can be interrupted with EAGAIN\n       but the state machine ensures we skip the first phase on the next call\n       and resume sending.\n\n       libssh2_NB_state_sent2: In the third phase (indicated by ) we read the\n       data from the responses that have arrived so far.  Reading can be\n       interrupted with EAGAIN but the state machine ensures we skip the first\n       and second phases on the next call and resume sending.\n    */\n\n    switch(sftp->read_state) {\n    case libssh2_NB_state_idle:\n\n        /* Some data may already have been read from the server in the\n           previous call but didn't fit in the buffer at the time.  If so, we\n           return that now as we can't risk being interrupted later with data\n           partially written to the buffer. */\n        if(filep->data_left) {\n            size_t copy = MIN(buffer_size, filep->data_left);\n\n            memcpy(buffer, &filep->data[ filep->data_len - filep->data_left],\n                   copy);\n\n            filep->data_left -= copy;\n            filep->offset += copy;\n\n            if(!filep->data_left) {\n                LIBSSH2_FREE(session, filep->data);\n                filep->data = NULL;\n            }\n\n            return copy;\n        }\n\n        if(filep->eof) {\n            return 0;\n        }\n        else {\n            /* We allow a number of bytes being requested at any given time\n               without having been acked - until we reach EOF. */\n\n            /* Number of bytes asked for that haven't been acked yet */\n            size_t already = (size_t)(filep->offset_sent - filep->offset);\n\n            size_t max_read_ahead = buffer_size*4;\n            unsigned long recv_window;\n\n            if(max_read_ahead > LIBSSH2_CHANNEL_WINDOW_DEFAULT*4)\n                max_read_ahead = LIBSSH2_CHANNEL_WINDOW_DEFAULT*4;\n\n            /* if the buffer_size passed in now is smaller than what has\n               already been sent, we risk getting count become a very large\n               number */\n            if(max_read_ahead > already)\n                count = max_read_ahead - already;\n\n            /* 'count' is how much more data to ask for, and 'already' is how\n               much data that already has been asked for but not yet returned.\n               Specificly, 'count' means how much data that have or will be\n               asked for by the nodes that are already added to the linked\n               list. Some of those read requests may not actually have been\n               sent off successfully yet.\n\n               If 'already' is very large it should be perfectly fine to have\n               count set to 0 as then we don't have to ask for more data\n               (right now).\n\n               buffer_size*4 is just picked more or less out of the air. The\n               idea is that when reading SFTP from a remote server, we send\n               away multiple read requests guessing that the client will read\n               more than only this 'buffer_size' amount of memory. So we ask\n               for maximum buffer_size*4 amount of data so that we can return\n               them very fast in subsequent calls.\n            */\n\n            recv_window = libssh2_channel_window_read_ex(sftp->channel,\n                                                         NULL, NULL);\n            if(max_read_ahead > recv_window) {\n                /* more data will be asked for than what the window currently\n                   allows, expand it! */\n\n                rc = _libssh2_channel_receive_window_adjust(sftp->channel,\n                                                            max_read_ahead*8,\n                                                            1, NULL);\n                /* if this returns EAGAIN, we will get back to this function\n                   at next call */\n                assert(rc != LIBSSH2_ERROR_EAGAIN || !filep->data_left);\n                assert(rc != LIBSSH2_ERROR_EAGAIN || !filep->eof);\n                if(rc)\n                    return rc;\n            }\n        }\n\n        while(count > 0) {\n            unsigned char *s;\n\n            /* 25 = packet_len(4) + packet_type(1) + request_id(4) +\n               handle_len(4) + offset(8) + count(4) */\n            uint32_t packet_len = (uint32_t)handle->handle_len + 25;\n            uint32_t request_id;\n\n            uint32_t size = count;\n            if(size < buffer_size)\n                size = buffer_size;\n            if(size > MAX_SFTP_READ_SIZE)\n                size = MAX_SFTP_READ_SIZE;\n\n            chunk = LIBSSH2_ALLOC(session, packet_len +\n                                  sizeof(struct sftp_pipeline_chunk));\n            if(!chunk)\n                return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                      \"malloc fail for FXP_WRITE\");\n\n            chunk->offset = filep->offset_sent;\n            chunk->len = size;\n            chunk->lefttosend = packet_len;\n            chunk->sent = 0;\n\n            s = chunk->packet;\n\n            _libssh2_store_u32(&s, packet_len - 4);\n            *s++ = SSH_FXP_READ;\n            request_id = sftp->request_id++;\n            chunk->request_id = request_id;\n            _libssh2_store_u32(&s, request_id);\n            _libssh2_store_str(&s, handle->handle, handle->handle_len);\n            _libssh2_store_u64(&s, filep->offset_sent);\n            filep->offset_sent += size; /* advance offset at once */\n            _libssh2_store_u32(&s, size);\n\n            /* add this new entry LAST in the list */\n            _libssh2_list_add(&handle->packet_list, &chunk->node);\n            count -= MIN(size, count); /* deduct the size we used, as we might\n                                        * have to create more packets */\n            _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                           \"read request id %d sent (offset: %d, size: %d)\",\n                           request_id, (int)chunk->offset, (int)chunk->len);\n        }\n        /* FALL-THROUGH */\n    case libssh2_NB_state_sent:\n\n        sftp->read_state = libssh2_NB_state_idle;\n\n        /* move through the READ packets that haven't been sent and send as\n           many as possible - remember that we don't block */\n        chunk = _libssh2_list_first(&handle->packet_list);\n\n        while(chunk) {\n            if(chunk->lefttosend) {\n\n                rc = _libssh2_channel_write(channel, 0,\n                                            &chunk->packet[chunk->sent],\n                                            chunk->lefttosend);\n                if(rc < 0) {\n                    sftp->read_state = libssh2_NB_state_sent;\n                    return rc;\n                }\n\n                /* remember where to continue sending the next time */\n                chunk->lefttosend -= rc;\n                chunk->sent += rc;\n\n                if(chunk->lefttosend) {\n                    /* We still have data left to send for this chunk.\n                     * If there is at least one completely sent chunk,\n                     * we can get out of this loop and start reading.  */\n                    if(chunk != _libssh2_list_first(&handle->packet_list)) {\n                        break;\n                    }\n                    else {\n                        continue;\n                    }\n                }\n            }\n\n            /* move on to the next chunk with data to send */\n            chunk = _libssh2_list_next(&chunk->node);\n        }\n        /* FALL-THROUGH */\n\n    case libssh2_NB_state_sent2:\n\n        sftp->read_state = libssh2_NB_state_idle;\n\n        /*\n         * Count all ACKed packets and act on the contents of them.\n         */\n        chunk = _libssh2_list_first(&handle->packet_list);\n\n        while(chunk) {\n            unsigned char *data;\n            size_t data_len;\n            uint32_t rc32;\n            static const unsigned char read_responses[2] = {\n                SSH_FXP_DATA, SSH_FXP_STATUS\n            };\n\n            if(chunk->lefttosend) {\n                /* if the chunk still has data left to send, we shouldn't wait\n                   for an ACK for it just yet */\n                if(bytes_in_buffer > 0) {\n                    return bytes_in_buffer;\n                }\n                else {\n                    /* we should never reach this point */\n                    return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                          \"sftp_read() internal error\");\n                }\n            }\n\n            rc = sftp_packet_requirev(sftp, 2, read_responses,\n                                      chunk->request_id, &data, &data_len, 9);\n            if(rc == LIBSSH2_ERROR_EAGAIN && bytes_in_buffer != 0) {\n                /* do not return EAGAIN if we have already\n                 * written data into the buffer */\n                return bytes_in_buffer;\n            }\n\n            if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n                if(data_len > 0) {\n                    LIBSSH2_FREE(session, data);\n                }\n                return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                      \"Response too small\");\n            }\n            else if(rc < 0) {\n                sftp->read_state = libssh2_NB_state_sent2;\n                return rc;\n            }\n\n            /*\n             * We get DATA or STATUS back. STATUS can be error, or it is\n             * FX_EOF when we reach the end of the file.\n             */\n\n            switch(data[0]) {\n            case SSH_FXP_STATUS:\n                /* remove the chunk we just processed */\n\n                _libssh2_list_remove(&chunk->node);\n                LIBSSH2_FREE(session, chunk);\n\n                /* we must remove all outstanding READ requests, as either we\n                   got an error or we're at end of file */\n                sftp_packetlist_flush(handle);\n\n                rc32 = _libssh2_ntohu32(data + 5);\n                LIBSSH2_FREE(session, data);\n\n                if(rc32 == LIBSSH2_FX_EOF) {\n                    filep->eof = TRUE;\n                    return bytes_in_buffer;\n                }\n                else {\n                    sftp->last_errno = rc32;\n                    return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                          \"SFTP READ error\");\n                }\n                break;\n\n            case SSH_FXP_DATA:\n                if(chunk->offset != filep->offset) {\n                    /* This could happen if the server returns less bytes than\n                       requested, which shouldn't happen for normal files. See:\n                       https://tools.ietf.org/html/draft-ietf-secsh-filexfer-02\n                       #section-6.4\n                    */\n                    return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                          \"Read Packet At Unexpected Offset\");\n                }\n\n                rc32 = _libssh2_ntohu32(data + 5);\n                if(rc32 > (data_len - 9))\n                    return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                          \"SFTP Protocol badness\");\n\n                if(rc32 > chunk->len) {\n                    /* A chunk larger than we requested was returned to us.\n                       This is a protocol violation and we don't know how to\n                       deal with it. Bail out! */\n                    return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                          \"FXP_READ response too big\");\n                }\n\n                if(rc32 != chunk->len) {\n                    /* a short read does not imply end of file, but we must\n                       adjust the offset_sent since it was advanced with a\n                       full chunk->len before */\n                    filep->offset_sent -= (chunk->len - rc32);\n                }\n\n                if((bytes_in_buffer + rc32) > buffer_size) {\n                    /* figure out the overlap amount */\n                    filep->data_left = (bytes_in_buffer + rc32) - buffer_size;\n\n                    /* getting the full packet would overflow the buffer, so\n                       only get the correct amount and keep the remainder */\n                    rc32 = (uint32_t)buffer_size - bytes_in_buffer;\n\n                    /* store data to keep for next call */\n                    filep->data = data;\n                    filep->data_len = data_len;\n                }\n                else\n                    filep->data_len = 0;\n\n                /* copy the received data from the received FXP_DATA packet to\n                   the buffer at the correct index */\n                memcpy(sliding_bufferp, data + 9, rc32);\n                filep->offset += rc32;\n                bytes_in_buffer += rc32;\n                sliding_bufferp += rc32;\n\n                if(filep->data_len == 0)\n                    /* free the allocated data if not stored to keep */\n                    LIBSSH2_FREE(session, data);\n\n                /* remove the chunk we just processed keeping track of the\n                 * next one in case we need it */\n                next = _libssh2_list_next(&chunk->node);\n                _libssh2_list_remove(&chunk->node);\n                LIBSSH2_FREE(session, chunk);\n\n                /* check if we have space left in the buffer\n                 * and either continue to the next chunk or stop\n                 */\n                if(bytes_in_buffer < buffer_size) {\n                    chunk = next;\n                }\n                else {\n                    chunk = NULL;\n                }\n\n                break;\n            default:\n                return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                      \"SFTP Protocol badness: unrecognised \"\n                                      \"read request response\");\n            }\n        }\n\n        if(bytes_in_buffer > 0)\n            return bytes_in_buffer;\n\n        break;\n\n    default:\n        assert(!\"State machine error; unrecognised read state\");\n    }\n\n    /* we should never reach this point */\n    return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                          \"sftp_read() internal error\");\n}\n\n/* libssh2_sftp_read\n * Read from an SFTP file handle\n */\nLIBSSH2_API ssize_t\nlibssh2_sftp_read(LIBSSH2_SFTP_HANDLE *hnd, char *buffer,\n                  size_t buffer_maxlen)\n{\n    ssize_t rc;\n    if(!hnd)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, hnd->sftp->channel->session,\n                 sftp_read(hnd, buffer, buffer_maxlen));\n    return rc;\n}\n\n/* sftp_readdir\n * Read from an SFTP directory handle\n */\nstatic ssize_t sftp_readdir(LIBSSH2_SFTP_HANDLE *handle, char *buffer,\n                            size_t buffer_maxlen, char *longentry,\n                            size_t longentry_maxlen,\n                            LIBSSH2_SFTP_ATTRIBUTES *attrs)\n{\n    LIBSSH2_SFTP *sftp = handle->sftp;\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    uint32_t num_names;\n    /* 13 = packet_len(4) + packet_type(1) + request_id(4) + handle_len(4) */\n    uint32_t packet_len = handle->handle_len + 13;\n    unsigned char *s, *data;\n    static const unsigned char read_responses[2] = {\n        SSH_FXP_NAME, SSH_FXP_STATUS };\n    ssize_t retcode;\n\n    if(sftp->readdir_state == libssh2_NB_state_idle) {\n        if(handle->u.dir.names_left) {\n            /*\n             * A prior request returned more than one directory entry,\n             * feed it back from the buffer\n             */\n            LIBSSH2_SFTP_ATTRIBUTES attrs_dummy;\n            size_t real_longentry_len;\n            size_t real_filename_len;\n            size_t filename_len;\n            size_t longentry_len;\n            size_t names_packet_len = handle->u.dir.names_packet_len;\n            int attr_len = 0;\n\n            if(names_packet_len >= 4) {\n                s = (unsigned char *) handle->u.dir.next_name;\n                real_filename_len = _libssh2_ntohu32(s);\n                s += 4;\n                names_packet_len -= 4;\n            }\n            else {\n                filename_len = (size_t)LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n                goto end;\n            }\n\n            filename_len = real_filename_len;\n            if(filename_len >= buffer_maxlen) {\n                filename_len = (size_t)LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n                goto end;\n            }\n\n            if(buffer_maxlen >= filename_len && names_packet_len >=\n               filename_len) {\n                memcpy(buffer, s, filename_len);\n                buffer[filename_len] = '\\0';           /* zero terminate */\n                s += real_filename_len;\n                names_packet_len -= real_filename_len;\n            }\n            else {\n                filename_len = (size_t)LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n                goto end;\n            }\n\n            if(names_packet_len >= 4) {\n                real_longentry_len = _libssh2_ntohu32(s);\n                s += 4;\n                names_packet_len -= 4;\n            }\n            else {\n                filename_len = (size_t)LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n                goto end;\n            }\n\n            if(longentry && (longentry_maxlen>1)) {\n                longentry_len = real_longentry_len;\n\n                if(longentry_len >= longentry_maxlen ||\n                   longentry_len > names_packet_len) {\n                    filename_len = (size_t)LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n                    goto end;\n                }\n\n                memcpy(longentry, s, longentry_len);\n                longentry[longentry_len] = '\\0'; /* zero terminate */\n            }\n\n            if(real_longentry_len <= names_packet_len) {\n                s += real_longentry_len;\n                names_packet_len -= real_longentry_len;\n            }\n            else {\n                filename_len = (size_t)LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n                goto end;\n            }\n\n            if(attrs)\n                memset(attrs, 0, sizeof(LIBSSH2_SFTP_ATTRIBUTES));\n\n            attr_len = sftp_bin2attr(attrs ? attrs : &attrs_dummy, s,\n                                     names_packet_len);\n\n            if(attr_len >= 0) {\n                s += attr_len;\n                names_packet_len -= attr_len;\n            }\n            else {\n                filename_len = (size_t)LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n                goto end;\n            }\n\n            handle->u.dir.next_name = (char *) s;\n            handle->u.dir.names_packet_len = names_packet_len;\n          end:\n\n            if((--handle->u.dir.names_left) == 0)\n                LIBSSH2_FREE(session, handle->u.dir.names_packet);\n\n            _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                           \"libssh2_sftp_readdir_ex() return %d\",\n                           filename_len);\n            return (ssize_t)filename_len;\n        }\n\n        /* Request another entry(entries?) */\n\n        s = sftp->readdir_packet = LIBSSH2_ALLOC(session, packet_len);\n        if(!sftp->readdir_packet)\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"FXP_READDIR packet\");\n\n        _libssh2_store_u32(&s, packet_len - 4);\n        *(s++) = SSH_FXP_READDIR;\n        sftp->readdir_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->readdir_request_id);\n        _libssh2_store_str(&s, handle->handle, handle->handle_len);\n\n        sftp->readdir_state = libssh2_NB_state_created;\n    }\n\n    if(sftp->readdir_state == libssh2_NB_state_created) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Reading entries from directory handle\");\n        retcode = _libssh2_channel_write(channel, 0, sftp->readdir_packet,\n                                         packet_len);\n        if(retcode == LIBSSH2_ERROR_EAGAIN) {\n            return retcode;\n        }\n        else if((ssize_t)packet_len != retcode) {\n            LIBSSH2_FREE(session, sftp->readdir_packet);\n            sftp->readdir_packet = NULL;\n            sftp->readdir_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"_libssh2_channel_write() failed\");\n        }\n\n        LIBSSH2_FREE(session, sftp->readdir_packet);\n        sftp->readdir_packet = NULL;\n\n        sftp->readdir_state = libssh2_NB_state_sent;\n    }\n\n    retcode = sftp_packet_requirev(sftp, 2, read_responses,\n                                   sftp->readdir_request_id, &data,\n                                   &data_len, 9);\n    if(retcode == LIBSSH2_ERROR_EAGAIN)\n        return retcode;\n    else if(retcode == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n        if(data_len > 0) {\n            LIBSSH2_FREE(session, data);\n        }\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"Status message too short\");\n    }\n    else if(retcode) {\n        sftp->readdir_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, retcode,\n                              \"Timeout waiting for status message\");\n    }\n\n    if(data[0] == SSH_FXP_STATUS) {\n        retcode = _libssh2_ntohu32(data + 5);\n        LIBSSH2_FREE(session, data);\n        if(retcode == LIBSSH2_FX_EOF) {\n            sftp->readdir_state = libssh2_NB_state_idle;\n            return 0;\n        }\n        else {\n            sftp->last_errno = retcode;\n            sftp->readdir_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                  \"SFTP Protocol Error\");\n        }\n    }\n\n    sftp->readdir_state = libssh2_NB_state_idle;\n\n    num_names = _libssh2_ntohu32(data + 5);\n    _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"%lu entries returned\",\n                   num_names);\n    if(!num_names) {\n        LIBSSH2_FREE(session, data);\n        return 0;\n    }\n\n    handle->u.dir.names_left = num_names;\n    handle->u.dir.names_packet = data;\n    handle->u.dir.next_name = (char *) data + 9;\n    handle->u.dir.names_packet_len = data_len - 9;\n\n    /* use the name popping mechanism from the start of the function */\n    return sftp_readdir(handle, buffer, buffer_maxlen, longentry,\n                        longentry_maxlen, attrs);\n}\n\n/* libssh2_sftp_readdir_ex\n * Read from an SFTP directory handle\n */\nLIBSSH2_API int\nlibssh2_sftp_readdir_ex(LIBSSH2_SFTP_HANDLE *hnd, char *buffer,\n                        size_t buffer_maxlen, char *longentry,\n                        size_t longentry_maxlen,\n                        LIBSSH2_SFTP_ATTRIBUTES *attrs)\n{\n    int rc;\n    if(!hnd)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, hnd->sftp->channel->session,\n                 sftp_readdir(hnd, buffer, buffer_maxlen, longentry,\n                              longentry_maxlen, attrs));\n    return rc;\n}\n\n/*\n * sftp_write\n *\n * Write data to an SFTP handle. Returns the number of bytes written, or\n * a negative error code.\n *\n * We recommend sending very large data buffers to this function!\n *\n * Concept:\n *\n * - Detect how much of the given buffer that was already sent in a previous\n *   call by inspecting the linked list of outgoing chunks. Make sure to skip\n *   passed the data that has already been taken care of.\n *\n * - Split all (new) outgoing data in chunks no larger than N.\n *\n * - Each N bytes chunk gets created as a separate SFTP packet.\n *\n * - Add all created outgoing packets to the linked list.\n *\n * - Walk through the list and send the chunks that haven't been sent,\n *   as many as possible until EAGAIN. Some of the chunks may have been put\n *   in the list in a previous invoke.\n *\n * - For all the chunks in the list that have been completely sent off, check\n *   for ACKs. If a chunk has been ACKed, it is removed from the linked\n *   list and the \"acked\" counter gets increased with that data amount.\n *\n * - Return TOTAL bytes acked so far.\n *\n * Caveats:\n * -  be careful: we must not return a higher number than what was given!\n *\n * TODO:\n *   Introduce an option that disables this sort of \"speculative\" ahead writing\n *   as there's a risk that it will do harm to some app.\n */\n\nstatic ssize_t sftp_write(LIBSSH2_SFTP_HANDLE *handle, const char *buffer,\n                          size_t count)\n{\n    LIBSSH2_SFTP *sftp = handle->sftp;\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    uint32_t retcode;\n    uint32_t packet_len;\n    unsigned char *s, *data;\n    ssize_t rc;\n    struct sftp_pipeline_chunk *chunk;\n    struct sftp_pipeline_chunk *next;\n    size_t acked = 0;\n    size_t org_count = count;\n    size_t already;\n\n    switch(sftp->write_state) {\n    default:\n    case libssh2_NB_state_idle:\n\n        /* Number of bytes sent off that haven't been acked and therefore we\n           will get passed in here again.\n\n           Also, add up the number of bytes that actually already have been\n           acked but we haven't been able to return as such yet, so we will\n           get that data as well passed in here again.\n        */\n        already = (size_t) (handle->u.file.offset_sent -\n                            handle->u.file.offset)+\n            handle->u.file.acked;\n\n        if(count >= already) {\n            /* skip the part already made into packets */\n            buffer += already;\n            count -= already;\n        }\n        else\n            /* there is more data already fine than what we got in this call */\n            count = 0;\n\n        sftp->write_state = libssh2_NB_state_idle;\n        while(count) {\n            /* TODO: Possibly this should have some logic to prevent a very\n               very small fraction to be left but lets ignore that for now */\n            uint32_t size = MIN(MAX_SFTP_OUTGOING_SIZE, count);\n            uint32_t request_id;\n\n            /* 25 = packet_len(4) + packet_type(1) + request_id(4) +\n               handle_len(4) + offset(8) + count(4) */\n            packet_len = handle->handle_len + size + 25;\n\n            chunk = LIBSSH2_ALLOC(session, packet_len +\n                                  sizeof(struct sftp_pipeline_chunk));\n            if(!chunk)\n                return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                      \"malloc fail for FXP_WRITE\");\n\n            chunk->len = size;\n            chunk->sent = 0;\n            chunk->lefttosend = packet_len;\n\n            s = chunk->packet;\n            _libssh2_store_u32(&s, packet_len - 4);\n\n            *(s++) = SSH_FXP_WRITE;\n            request_id = sftp->request_id++;\n            chunk->request_id = request_id;\n            _libssh2_store_u32(&s, request_id);\n            _libssh2_store_str(&s, handle->handle, handle->handle_len);\n            _libssh2_store_u64(&s, handle->u.file.offset_sent);\n            handle->u.file.offset_sent += size; /* advance offset at once */\n            _libssh2_store_str(&s, buffer, size);\n\n            /* add this new entry LAST in the list */\n            _libssh2_list_add(&handle->packet_list, &chunk->node);\n\n            buffer += size;\n            count -= size; /* deduct the size we used, as we might have\n                              to create more packets */\n        }\n\n        /* move through the WRITE packets that haven't been sent and send as\n           many as possible - remember that we don't block */\n        chunk = _libssh2_list_first(&handle->packet_list);\n\n        while(chunk) {\n            if(chunk->lefttosend) {\n                rc = _libssh2_channel_write(channel, 0,\n                                            &chunk->packet[chunk->sent],\n                                            chunk->lefttosend);\n                if(rc < 0)\n                    /* remain in idle state */\n                    return rc;\n\n                /* remember where to continue sending the next time */\n                chunk->lefttosend -= rc;\n                chunk->sent += rc;\n\n                if(chunk->lefttosend)\n                    /* data left to send, get out of loop */\n                    break;\n            }\n\n            /* move on to the next chunk with data to send */\n            chunk = _libssh2_list_next(&chunk->node);\n        }\n\n        /* fall-through */\n    case libssh2_NB_state_sent:\n\n        sftp->write_state = libssh2_NB_state_idle;\n        /*\n         * Count all ACKed packets\n         */\n        chunk = _libssh2_list_first(&handle->packet_list);\n\n        while(chunk) {\n            if(chunk->lefttosend)\n                /* if the chunk still has data left to send, we shouldn't wait\n                   for an ACK for it just yet */\n                break;\n\n            else if(acked)\n                /* if we have sent data that is acked, we must return that\n                   info before we call a function that might return EAGAIN */\n                break;\n\n            /* we check the packets in order */\n            rc = sftp_packet_require(sftp, SSH_FXP_STATUS,\n                                     chunk->request_id, &data, &data_len, 9);\n            if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n                if(data_len > 0) {\n                    LIBSSH2_FREE(session, data);\n                }\n                return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                      \"FXP write packet too short\");\n            }\n            else if(rc < 0) {\n                if(rc == LIBSSH2_ERROR_EAGAIN)\n                    sftp->write_state = libssh2_NB_state_sent;\n                return rc;\n            }\n\n            retcode = _libssh2_ntohu32(data + 5);\n            LIBSSH2_FREE(session, data);\n\n            sftp->last_errno = retcode;\n            if(retcode == LIBSSH2_FX_OK) {\n                acked += chunk->len; /* number of payload data that was acked\n                                        here */\n\n                /* we increase the offset value for all acks */\n                handle->u.file.offset += chunk->len;\n\n                next = _libssh2_list_next(&chunk->node);\n\n                _libssh2_list_remove(&chunk->node); /* remove from list */\n                LIBSSH2_FREE(session, chunk); /* free memory */\n\n                chunk = next;\n            }\n            else {\n                /* flush all pending packets from the outgoing list */\n                sftp_packetlist_flush(handle);\n\n                /* since we return error now, the application will not get any\n                   outstanding data acked, so we need to rewind the offset to\n                   where the application knows it has reached with acked\n                   data */\n                handle->u.file.offset -= handle->u.file.acked;\n\n                /* then reset the offset_sent to be the same as the offset */\n                handle->u.file.offset_sent = handle->u.file.offset;\n\n                /* clear the acked counter since we can have no pending data to\n                   ack after an error */\n                handle->u.file.acked = 0;\n\n                /* the server returned an error for that written chunk,\n                   propagate this back to our parent function */\n                return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                      \"FXP write failed\");\n            }\n        }\n        break;\n    }\n\n    /* if there were acked data in a previous call that wasn't returned then,\n       add that up and try to return it all now. This can happen if the app\n       first sends a huge buffer of data, and then in a second call it sends a\n       smaller one. */\n    acked += handle->u.file.acked;\n\n    if(acked) {\n        ssize_t ret = MIN(acked, org_count);\n        /* we got data acked so return that amount, but no more than what\n           was asked to get sent! */\n\n        /* store the remainder. 'ret' is always equal to or less than 'acked'\n           here */\n        handle->u.file.acked = acked - ret;\n\n        return ret;\n    }\n\n    else\n        return 0; /* nothing was acked, and no EAGAIN was received! */\n}\n\n/* libssh2_sftp_write\n * Write data to a file handle\n */\nLIBSSH2_API ssize_t\nlibssh2_sftp_write(LIBSSH2_SFTP_HANDLE *hnd, const char *buffer,\n                   size_t count)\n{\n    ssize_t rc;\n    if(!hnd)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, hnd->sftp->channel->session,\n                 sftp_write(hnd, buffer, count));\n    return rc;\n\n}\n\nstatic int sftp_fsync(LIBSSH2_SFTP_HANDLE *handle)\n{\n    LIBSSH2_SFTP *sftp = handle->sftp;\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    /* 34 = packet_len(4) + packet_type(1) + request_id(4) +\n       string_len(4) + strlen(\"fsync@openssh.com\")(17) + handle_len(4) */\n    uint32_t packet_len = handle->handle_len + 34;\n    size_t data_len;\n    unsigned char *packet, *s, *data;\n    ssize_t rc;\n    uint32_t retcode;\n\n    if(sftp->fsync_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Issuing fsync command\");\n        s = packet = LIBSSH2_ALLOC(session, packet_len);\n        if(!packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for FXP_EXTENDED \"\n                                  \"packet\");\n        }\n\n        _libssh2_store_u32(&s, packet_len - 4);\n        *(s++) = SSH_FXP_EXTENDED;\n        sftp->fsync_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->fsync_request_id);\n        _libssh2_store_str(&s, \"fsync@openssh.com\", 17);\n        _libssh2_store_str(&s, handle->handle, handle->handle_len);\n\n        sftp->fsync_state = libssh2_NB_state_created;\n    }\n    else {\n        packet = sftp->fsync_packet;\n    }\n\n    if(sftp->fsync_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, packet, packet_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN ||\n            (0 <= rc && rc < (ssize_t)packet_len)) {\n            sftp->fsync_packet = packet;\n            return LIBSSH2_ERROR_EAGAIN;\n        }\n\n        LIBSSH2_FREE(session, packet);\n        sftp->fsync_packet = NULL;\n\n        if(rc < 0) {\n            sftp->fsync_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"_libssh2_channel_write() failed\");\n        }\n        sftp->fsync_state = libssh2_NB_state_sent;\n    }\n\n    rc = sftp_packet_require(sftp, SSH_FXP_STATUS,\n                             sftp->fsync_request_id, &data, &data_len, 9);\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    }\n    else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n        if(data_len > 0) {\n            LIBSSH2_FREE(session, data);\n        }\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP fsync packet too short\");\n    }\n    else if(rc) {\n        sftp->fsync_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Error waiting for FXP EXTENDED REPLY\");\n    }\n\n    sftp->fsync_state = libssh2_NB_state_idle;\n\n    retcode = _libssh2_ntohu32(data + 5);\n    LIBSSH2_FREE(session, data);\n\n    if(retcode != LIBSSH2_FX_OK) {\n        sftp->last_errno = retcode;\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"fsync failed\");\n    }\n\n    return 0;\n}\n\n/* libssh2_sftp_fsync\n * Commit data on the handle to disk.\n */\nLIBSSH2_API int\nlibssh2_sftp_fsync(LIBSSH2_SFTP_HANDLE *hnd)\n{\n    int rc;\n    if(!hnd)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, hnd->sftp->channel->session,\n                 sftp_fsync(hnd));\n    return rc;\n}\n\n\n/*\n * sftp_fstat\n *\n * Get or Set stat on a file\n */\nstatic int sftp_fstat(LIBSSH2_SFTP_HANDLE *handle,\n                      LIBSSH2_SFTP_ATTRIBUTES *attrs, int setstat)\n{\n    LIBSSH2_SFTP *sftp = handle->sftp;\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    /* 13 = packet_len(4) + packet_type(1) + request_id(4) + handle_len(4) */\n    uint32_t packet_len =\n        handle->handle_len + 13 + (setstat ? sftp_attrsize(attrs->flags) : 0);\n    unsigned char *s, *data;\n    static const unsigned char fstat_responses[2] =\n        { SSH_FXP_ATTRS, SSH_FXP_STATUS };\n    ssize_t rc;\n\n    if(sftp->fstat_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Issuing %s command\",\n                       setstat ? \"set-stat\" : \"stat\");\n        s = sftp->fstat_packet = LIBSSH2_ALLOC(session, packet_len);\n        if(!sftp->fstat_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"FSTAT/FSETSTAT packet\");\n        }\n\n        _libssh2_store_u32(&s, packet_len - 4);\n        *(s++) = setstat ? SSH_FXP_FSETSTAT : SSH_FXP_FSTAT;\n        sftp->fstat_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->fstat_request_id);\n        _libssh2_store_str(&s, handle->handle, handle->handle_len);\n\n        if(setstat) {\n            s += sftp_attr2bin(s, attrs);\n        }\n\n        sftp->fstat_state = libssh2_NB_state_created;\n    }\n\n    if(sftp->fstat_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, sftp->fstat_packet,\n                                    packet_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if((ssize_t)packet_len != rc) {\n            LIBSSH2_FREE(session, sftp->fstat_packet);\n            sftp->fstat_packet = NULL;\n            sftp->fstat_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  (setstat ? \"Unable to send FXP_FSETSTAT\"\n                                   : \"Unable to send FXP_FSTAT command\"));\n        }\n        LIBSSH2_FREE(session, sftp->fstat_packet);\n        sftp->fstat_packet = NULL;\n\n        sftp->fstat_state = libssh2_NB_state_sent;\n    }\n\n    rc = sftp_packet_requirev(sftp, 2, fstat_responses,\n                              sftp->fstat_request_id, &data,\n                              &data_len, 9);\n    if(rc == LIBSSH2_ERROR_EAGAIN)\n        return rc;\n    else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n        if(data_len > 0) {\n            LIBSSH2_FREE(session, data);\n        }\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP fstat packet too short\");\n    }\n    else if(rc) {\n        sftp->fstat_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Timeout waiting for status message\");\n    }\n\n    sftp->fstat_state = libssh2_NB_state_idle;\n\n    if(data[0] == SSH_FXP_STATUS) {\n        uint32_t retcode;\n\n        retcode = _libssh2_ntohu32(data + 5);\n        LIBSSH2_FREE(session, data);\n        if(retcode == LIBSSH2_FX_OK) {\n            return 0;\n        }\n        else {\n            sftp->last_errno = retcode;\n            return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                  \"SFTP Protocol Error\");\n        }\n    }\n\n    if(sftp_bin2attr(attrs, data + 5, data_len - 5) < 0) {\n        LIBSSH2_FREE(session, data);\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"Attributes too short in SFTP fstat\");\n    }\n\n    LIBSSH2_FREE(session, data);\n\n    return 0;\n}\n\n/* libssh2_sftp_fstat_ex\n * Get or Set stat on a file\n */\nLIBSSH2_API int\nlibssh2_sftp_fstat_ex(LIBSSH2_SFTP_HANDLE *hnd,\n                      LIBSSH2_SFTP_ATTRIBUTES *attrs, int setstat)\n{\n    int rc;\n    if(!hnd || !attrs)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, hnd->sftp->channel->session,\n                 sftp_fstat(hnd, attrs, setstat));\n    return rc;\n}\n\n\n/* libssh2_sftp_seek64\n * Set the read/write pointer to an arbitrary position within the file\n */\nLIBSSH2_API void\nlibssh2_sftp_seek64(LIBSSH2_SFTP_HANDLE *handle, libssh2_uint64_t offset)\n{\n    if(!handle)\n        return;\n    if(handle->u.file.offset == offset && handle->u.file.offset_sent == offset)\n        return;\n\n    handle->u.file.offset = handle->u.file.offset_sent = offset;\n    /* discard all pending requests and currently read data */\n    sftp_packetlist_flush(handle);\n\n    /* free the left received buffered data */\n    if(handle->u.file.data_left) {\n        LIBSSH2_FREE(handle->sftp->channel->session, handle->u.file.data);\n        handle->u.file.data_left = handle->u.file.data_len = 0;\n        handle->u.file.data = NULL;\n    }\n\n    /* reset EOF to False */\n    handle->u.file.eof = FALSE;\n}\n\n/* libssh2_sftp_seek\n * Set the read/write pointer to an arbitrary position within the file\n */\nLIBSSH2_API void\nlibssh2_sftp_seek(LIBSSH2_SFTP_HANDLE *handle, size_t offset)\n{\n    libssh2_sftp_seek64(handle, (libssh2_uint64_t)offset);\n}\n\n/* libssh2_sftp_tell\n * Return the current read/write pointer's offset\n */\nLIBSSH2_API size_t\nlibssh2_sftp_tell(LIBSSH2_SFTP_HANDLE *handle)\n{\n    if(!handle)\n        return 0; /* no handle, no size */\n\n    /* NOTE: this may very well truncate the size if it is larger than what\n       size_t can hold, so libssh2_sftp_tell64() is really the function you\n       should use */\n    return (size_t)(handle->u.file.offset);\n}\n\n/* libssh2_sftp_tell64\n * Return the current read/write pointer's offset\n */\nLIBSSH2_API libssh2_uint64_t\nlibssh2_sftp_tell64(LIBSSH2_SFTP_HANDLE *handle)\n{\n    if(!handle)\n        return 0; /* no handle, no size */\n\n    return handle->u.file.offset;\n}\n\n/*\n * Flush all remaining incoming SFTP packets and zombies.\n */\nstatic void sftp_packet_flush(LIBSSH2_SFTP *sftp)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    LIBSSH2_SFTP_PACKET *packet = _libssh2_list_first(&sftp->packets);\n    struct sftp_zombie_requests *zombie =\n        _libssh2_list_first(&sftp->zombie_requests);\n\n    while(packet) {\n        LIBSSH2_SFTP_PACKET *next;\n\n        /* check next struct in the list */\n        next =  _libssh2_list_next(&packet->node);\n        _libssh2_list_remove(&packet->node);\n        LIBSSH2_FREE(session, packet->data);\n        LIBSSH2_FREE(session, packet);\n\n        packet = next;\n    }\n\n    while(zombie) {\n        /* figure out the next node */\n        struct sftp_zombie_requests *next = _libssh2_list_next(&zombie->node);\n        /* unlink the current one */\n        _libssh2_list_remove(&zombie->node);\n        /* free the memory */\n        LIBSSH2_FREE(session, zombie);\n        zombie = next;\n    }\n\n}\n\n/* sftp_close_handle\n *\n * Close a file or directory handle.\n * Also frees handle resource and unlinks it from the SFTP structure.\n * The handle is no longer usable after return of this function, unless\n * the return value is LIBSSH2_ERROR_EAGAIN in which case this function\n * should be called again.\n */\nstatic int\nsftp_close_handle(LIBSSH2_SFTP_HANDLE *handle)\n{\n    LIBSSH2_SFTP *sftp = handle->sftp;\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    /* 13 = packet_len(4) + packet_type(1) + request_id(4) + handle_len(4) */\n    uint32_t packet_len = handle->handle_len + 13;\n    unsigned char *s, *data = NULL;\n    int rc = 0;\n\n    if(handle->close_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Closing handle\");\n        s = handle->close_packet = LIBSSH2_ALLOC(session, packet_len);\n        if(!handle->close_packet) {\n            handle->close_state = libssh2_NB_state_idle;\n            rc = _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                \"Unable to allocate memory for FXP_CLOSE \"\n                                \"packet\");\n        }\n        else {\n\n            _libssh2_store_u32(&s, packet_len - 4);\n            *(s++) = SSH_FXP_CLOSE;\n            handle->close_request_id = sftp->request_id++;\n            _libssh2_store_u32(&s, handle->close_request_id);\n            _libssh2_store_str(&s, handle->handle, handle->handle_len);\n            handle->close_state = libssh2_NB_state_created;\n        }\n    }\n\n    if(handle->close_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, handle->close_packet,\n                                    packet_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if((ssize_t)packet_len != rc) {\n            handle->close_state = libssh2_NB_state_idle;\n            rc = _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                \"Unable to send FXP_CLOSE command\");\n        }\n        else\n            handle->close_state = libssh2_NB_state_sent;\n\n        LIBSSH2_FREE(session, handle->close_packet);\n        handle->close_packet = NULL;\n    }\n\n    if(handle->close_state == libssh2_NB_state_sent) {\n        rc = sftp_packet_require(sftp, SSH_FXP_STATUS,\n                                 handle->close_request_id, &data,\n                                 &data_len, 9);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n            if(data_len > 0) {\n                LIBSSH2_FREE(session, data);\n            }\n            data = NULL;\n            _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                           \"Packet too short in FXP_CLOSE command\");\n        }\n        else if(rc) {\n            _libssh2_error(session, rc,\n                           \"Error waiting for status message\");\n        }\n\n        handle->close_state = libssh2_NB_state_sent1;\n    }\n\n    if(!data) {\n        /* if it reaches this point with data unset, something unwanted\n           happened for which we should have set an error code */\n        assert(rc);\n\n    }\n    else {\n        int retcode = _libssh2_ntohu32(data + 5);\n        LIBSSH2_FREE(session, data);\n\n        if(retcode != LIBSSH2_FX_OK) {\n            sftp->last_errno = retcode;\n            handle->close_state = libssh2_NB_state_idle;\n            rc = _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                \"SFTP Protocol Error\");\n        }\n    }\n\n    /* remove this handle from the parent's list */\n    _libssh2_list_remove(&handle->node);\n\n    if(handle->handle_type == LIBSSH2_SFTP_HANDLE_DIR) {\n        if(handle->u.dir.names_left)\n            LIBSSH2_FREE(session, handle->u.dir.names_packet);\n    }\n    else if(handle->handle_type == LIBSSH2_SFTP_HANDLE_FILE) {\n        if(handle->u.file.data)\n            LIBSSH2_FREE(session, handle->u.file.data);\n    }\n\n    sftp_packetlist_flush(handle);\n    sftp->read_state = libssh2_NB_state_idle;\n\n    handle->close_state = libssh2_NB_state_idle;\n\n    LIBSSH2_FREE(session, handle);\n\n    return rc;\n}\n\n/* libssh2_sftp_close_handle\n *\n * Close a file or directory handle\n * Also frees handle resource and unlinks it from the SFTP structure\n */\nLIBSSH2_API int\nlibssh2_sftp_close_handle(LIBSSH2_SFTP_HANDLE *hnd)\n{\n    int rc;\n    if(!hnd)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, hnd->sftp->channel->session, sftp_close_handle(hnd));\n    return rc;\n}\n\n/* sftp_unlink\n * Delete a file from the remote server\n */\nstatic int sftp_unlink(LIBSSH2_SFTP *sftp, const char *filename,\n                       size_t filename_len)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    int retcode;\n    /* 13 = packet_len(4) + packet_type(1) + request_id(4) + filename_len(4) */\n    uint32_t packet_len = filename_len + 13;\n    unsigned char *s, *data;\n    int rc;\n\n    if(sftp->unlink_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Unlinking %s\", filename);\n        s = sftp->unlink_packet = LIBSSH2_ALLOC(session, packet_len);\n        if(!sftp->unlink_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for FXP_REMOVE \"\n                                  \"packet\");\n        }\n\n        _libssh2_store_u32(&s, packet_len - 4);\n        *(s++) = SSH_FXP_REMOVE;\n        sftp->unlink_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->unlink_request_id);\n        _libssh2_store_str(&s, filename, filename_len);\n        sftp->unlink_state = libssh2_NB_state_created;\n    }\n\n    if(sftp->unlink_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, sftp->unlink_packet,\n                                    packet_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if((ssize_t)packet_len != rc) {\n            LIBSSH2_FREE(session, sftp->unlink_packet);\n            sftp->unlink_packet = NULL;\n            sftp->unlink_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send FXP_REMOVE command\");\n        }\n        LIBSSH2_FREE(session, sftp->unlink_packet);\n        sftp->unlink_packet = NULL;\n\n        sftp->unlink_state = libssh2_NB_state_sent;\n    }\n\n    rc = sftp_packet_require(sftp, SSH_FXP_STATUS,\n                             sftp->unlink_request_id, &data,\n                             &data_len, 9);\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    }\n    else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n        if(data_len > 0) {\n            LIBSSH2_FREE(session, data);\n        }\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP unlink packet too short\");\n    }\n    else if(rc) {\n        sftp->unlink_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Error waiting for FXP STATUS\");\n    }\n\n    sftp->unlink_state = libssh2_NB_state_idle;\n\n    retcode = _libssh2_ntohu32(data + 5);\n    LIBSSH2_FREE(session, data);\n\n    if(retcode == LIBSSH2_FX_OK) {\n        return 0;\n    }\n    else {\n        sftp->last_errno = retcode;\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP Protocol Error\");\n    }\n}\n\n/* libssh2_sftp_unlink_ex\n * Delete a file from the remote server\n */\nLIBSSH2_API int\nlibssh2_sftp_unlink_ex(LIBSSH2_SFTP *sftp, const char *filename,\n                       unsigned int filename_len)\n{\n    int rc;\n    if(!sftp)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, sftp->channel->session,\n                 sftp_unlink(sftp, filename, filename_len));\n    return rc;\n}\n\n/*\n * sftp_rename\n *\n * Rename a file on the remote server\n */\nstatic int sftp_rename(LIBSSH2_SFTP *sftp, const char *source_filename,\n                       unsigned int source_filename_len,\n                       const char *dest_filename,\n                       unsigned int dest_filename_len, long flags)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    int retcode;\n    uint32_t packet_len =\n        source_filename_len + dest_filename_len + 17 + (sftp->version >=\n                                                        5 ? 4 : 0);\n    /* packet_len(4) + packet_type(1) + request_id(4) +\n       source_filename_len(4) + dest_filename_len(4) + flags(4){SFTP5+) */\n    unsigned char *data;\n    ssize_t rc;\n\n    if(sftp->version < 2) {\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"Server does not support RENAME\");\n    }\n\n    if(sftp->rename_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Renaming %s to %s\",\n                       source_filename, dest_filename);\n        sftp->rename_s = sftp->rename_packet =\n            LIBSSH2_ALLOC(session, packet_len);\n        if(!sftp->rename_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for FXP_RENAME \"\n                                  \"packet\");\n        }\n\n        _libssh2_store_u32(&sftp->rename_s, packet_len - 4);\n        *(sftp->rename_s++) = SSH_FXP_RENAME;\n        sftp->rename_request_id = sftp->request_id++;\n        _libssh2_store_u32(&sftp->rename_s, sftp->rename_request_id);\n        _libssh2_store_str(&sftp->rename_s, source_filename,\n                           source_filename_len);\n        _libssh2_store_str(&sftp->rename_s, dest_filename, dest_filename_len);\n\n        if(sftp->version >= 5)\n            _libssh2_store_u32(&sftp->rename_s, flags);\n\n        sftp->rename_state = libssh2_NB_state_created;\n    }\n\n    if(sftp->rename_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, sftp->rename_packet,\n                                    sftp->rename_s - sftp->rename_packet);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if((ssize_t)packet_len != rc) {\n            LIBSSH2_FREE(session, sftp->rename_packet);\n            sftp->rename_packet = NULL;\n            sftp->rename_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send FXP_RENAME command\");\n        }\n        LIBSSH2_FREE(session, sftp->rename_packet);\n        sftp->rename_packet = NULL;\n\n        sftp->rename_state = libssh2_NB_state_sent;\n    }\n\n    rc = sftp_packet_require(sftp, SSH_FXP_STATUS,\n                             sftp->rename_request_id, &data,\n                             &data_len, 9);\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    }\n    else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n        if(data_len > 0) {\n            LIBSSH2_FREE(session, data);\n        }\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP rename packet too short\");\n    }\n    else if(rc) {\n        sftp->rename_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Error waiting for FXP STATUS\");\n    }\n\n    sftp->rename_state = libssh2_NB_state_idle;\n\n    retcode = _libssh2_ntohu32(data + 5);\n    LIBSSH2_FREE(session, data);\n\n    sftp->last_errno = retcode;\n\n    /* now convert the SFTP error code to libssh2 return code or error\n       message */\n    switch(retcode) {\n    case LIBSSH2_FX_OK:\n        retcode = LIBSSH2_ERROR_NONE;\n        break;\n\n    case LIBSSH2_FX_FILE_ALREADY_EXISTS:\n        retcode = _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                 \"File already exists and \"\n                                 \"SSH_FXP_RENAME_OVERWRITE not specified\");\n        break;\n\n    case LIBSSH2_FX_OP_UNSUPPORTED:\n        retcode = _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                 \"Operation Not Supported\");\n        break;\n\n    default:\n        retcode = _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                 \"SFTP Protocol Error\");\n        break;\n    }\n\n    return retcode;\n}\n\n/* libssh2_sftp_rename_ex\n * Rename a file on the remote server\n */\nLIBSSH2_API int\nlibssh2_sftp_rename_ex(LIBSSH2_SFTP *sftp, const char *source_filename,\n                       unsigned int source_filename_len,\n                       const char *dest_filename,\n                       unsigned int dest_filename_len, long flags)\n{\n    int rc;\n    if(!sftp)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, sftp->channel->session,\n                 sftp_rename(sftp, source_filename, source_filename_len,\n                             dest_filename, dest_filename_len, flags));\n    return rc;\n}\n\n/*\n * sftp_fstatvfs\n *\n * Get file system statistics\n */\nstatic int sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle, LIBSSH2_SFTP_STATVFS *st)\n{\n    LIBSSH2_SFTP *sftp = handle->sftp;\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    /* 17 = packet_len(4) + packet_type(1) + request_id(4) + ext_len(4)\n       + handle_len (4) */\n    /* 20 = strlen (\"fstatvfs@openssh.com\") */\n    uint32_t packet_len = handle->handle_len + 20 + 17;\n    unsigned char *packet, *s, *data;\n    ssize_t rc;\n    unsigned int flag;\n    static const unsigned char responses[2] =\n        { SSH_FXP_EXTENDED_REPLY, SSH_FXP_STATUS };\n\n    if(sftp->fstatvfs_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Getting file system statistics\");\n        s = packet = LIBSSH2_ALLOC(session, packet_len);\n        if(!packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for FXP_EXTENDED \"\n                                  \"packet\");\n        }\n\n        _libssh2_store_u32(&s, packet_len - 4);\n        *(s++) = SSH_FXP_EXTENDED;\n        sftp->fstatvfs_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->fstatvfs_request_id);\n        _libssh2_store_str(&s, \"fstatvfs@openssh.com\", 20);\n        _libssh2_store_str(&s, handle->handle, handle->handle_len);\n\n        sftp->fstatvfs_state = libssh2_NB_state_created;\n    }\n    else {\n        packet = sftp->fstatvfs_packet;\n    }\n\n    if(sftp->fstatvfs_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, packet, packet_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN ||\n            (0 <= rc && rc < (ssize_t)packet_len)) {\n            sftp->fstatvfs_packet = packet;\n            return LIBSSH2_ERROR_EAGAIN;\n        }\n\n        LIBSSH2_FREE(session, packet);\n        sftp->fstatvfs_packet = NULL;\n\n        if(rc < 0) {\n            sftp->fstatvfs_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"_libssh2_channel_write() failed\");\n        }\n        sftp->fstatvfs_state = libssh2_NB_state_sent;\n    }\n\n    rc = sftp_packet_requirev(sftp, 2, responses, sftp->fstatvfs_request_id,\n                              &data, &data_len, 9);\n\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    }\n    else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n        if(data_len > 0) {\n            LIBSSH2_FREE(session, data);\n        }\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP rename packet too short\");\n    }\n    else if(rc) {\n        sftp->fstatvfs_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Error waiting for FXP EXTENDED REPLY\");\n    }\n\n    if(data[0] == SSH_FXP_STATUS) {\n        int retcode = _libssh2_ntohu32(data + 5);\n        sftp->fstatvfs_state = libssh2_NB_state_idle;\n        LIBSSH2_FREE(session, data);\n        sftp->last_errno = retcode;\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP Protocol Error\");\n    }\n\n    if(data_len < 93) {\n        LIBSSH2_FREE(session, data);\n        sftp->fstatvfs_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP Protocol Error: short response\");\n    }\n\n    sftp->fstatvfs_state = libssh2_NB_state_idle;\n\n    st->f_bsize = _libssh2_ntohu64(data + 5);\n    st->f_frsize = _libssh2_ntohu64(data + 13);\n    st->f_blocks = _libssh2_ntohu64(data + 21);\n    st->f_bfree = _libssh2_ntohu64(data + 29);\n    st->f_bavail = _libssh2_ntohu64(data + 37);\n    st->f_files = _libssh2_ntohu64(data + 45);\n    st->f_ffree = _libssh2_ntohu64(data + 53);\n    st->f_favail = _libssh2_ntohu64(data + 61);\n    st->f_fsid = _libssh2_ntohu64(data + 69);\n    flag = (unsigned int)_libssh2_ntohu64(data + 77);\n    st->f_namemax = _libssh2_ntohu64(data + 85);\n\n    st->f_flag = (flag & SSH_FXE_STATVFS_ST_RDONLY)\n        ? LIBSSH2_SFTP_ST_RDONLY : 0;\n    st->f_flag |= (flag & SSH_FXE_STATVFS_ST_NOSUID)\n        ? LIBSSH2_SFTP_ST_NOSUID : 0;\n\n    LIBSSH2_FREE(session, data);\n    return 0;\n}\n\n/* libssh2_sftp_fstatvfs\n * Get filesystem space and inode utilization (requires fstatvfs@openssh.com\n * support on the server)\n */\nLIBSSH2_API int\nlibssh2_sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle, LIBSSH2_SFTP_STATVFS *st)\n{\n    int rc;\n    if(!handle || !st)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, handle->sftp->channel->session,\n                 sftp_fstatvfs(handle, st));\n    return rc;\n}\n\n/*\n * sftp_statvfs\n *\n * Get file system statistics\n */\nstatic int sftp_statvfs(LIBSSH2_SFTP *sftp, const char *path,\n                        unsigned int path_len, LIBSSH2_SFTP_STATVFS *st)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    /* 17 = packet_len(4) + packet_type(1) + request_id(4) + ext_len(4)\n       + path_len (4) */\n    /* 19 = strlen (\"statvfs@openssh.com\") */\n    uint32_t packet_len = path_len + 19 + 17;\n    unsigned char *packet, *s, *data;\n    ssize_t rc;\n    unsigned int flag;\n    static const unsigned char responses[2] =\n        { SSH_FXP_EXTENDED_REPLY, SSH_FXP_STATUS };\n\n    if(sftp->statvfs_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Getting file system statistics of %s\", path);\n        s = packet = LIBSSH2_ALLOC(session, packet_len);\n        if(!packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for FXP_EXTENDED \"\n                                  \"packet\");\n        }\n\n        _libssh2_store_u32(&s, packet_len - 4);\n        *(s++) = SSH_FXP_EXTENDED;\n        sftp->statvfs_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->statvfs_request_id);\n        _libssh2_store_str(&s, \"statvfs@openssh.com\", 19);\n        _libssh2_store_str(&s, path, path_len);\n\n        sftp->statvfs_state = libssh2_NB_state_created;\n    }\n    else {\n        packet = sftp->statvfs_packet;\n    }\n\n    if(sftp->statvfs_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, packet, packet_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN ||\n            (0 <= rc && rc < (ssize_t)packet_len)) {\n            sftp->statvfs_packet = packet;\n            return LIBSSH2_ERROR_EAGAIN;\n        }\n\n        LIBSSH2_FREE(session, packet);\n        sftp->statvfs_packet = NULL;\n\n        if(rc < 0) {\n            sftp->statvfs_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"_libssh2_channel_write() failed\");\n        }\n        sftp->statvfs_state = libssh2_NB_state_sent;\n    }\n\n    rc = sftp_packet_requirev(sftp, 2, responses, sftp->statvfs_request_id,\n                              &data, &data_len, 9);\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    }\n    else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n        if(data_len > 0) {\n            LIBSSH2_FREE(session, data);\n        }\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP fstat packet too short\");\n    }\n    else if(rc) {\n        sftp->statvfs_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Error waiting for FXP EXTENDED REPLY\");\n    }\n\n    if(data[0] == SSH_FXP_STATUS) {\n        int retcode = _libssh2_ntohu32(data + 5);\n        sftp->statvfs_state = libssh2_NB_state_idle;\n        LIBSSH2_FREE(session, data);\n        sftp->last_errno = retcode;\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP Protocol Error\");\n    }\n\n    if(data_len < 93) {\n        LIBSSH2_FREE(session, data);\n        sftp->statvfs_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP Protocol Error: short response\");\n    }\n\n    sftp->statvfs_state = libssh2_NB_state_idle;\n\n    st->f_bsize = _libssh2_ntohu64(data + 5);\n    st->f_frsize = _libssh2_ntohu64(data + 13);\n    st->f_blocks = _libssh2_ntohu64(data + 21);\n    st->f_bfree = _libssh2_ntohu64(data + 29);\n    st->f_bavail = _libssh2_ntohu64(data + 37);\n    st->f_files = _libssh2_ntohu64(data + 45);\n    st->f_ffree = _libssh2_ntohu64(data + 53);\n    st->f_favail = _libssh2_ntohu64(data + 61);\n    st->f_fsid = _libssh2_ntohu64(data + 69);\n    flag = (unsigned int)_libssh2_ntohu64(data + 77);\n    st->f_namemax = _libssh2_ntohu64(data + 85);\n\n    st->f_flag = (flag & SSH_FXE_STATVFS_ST_RDONLY)\n        ? LIBSSH2_SFTP_ST_RDONLY : 0;\n    st->f_flag |= (flag & SSH_FXE_STATVFS_ST_NOSUID)\n        ? LIBSSH2_SFTP_ST_NOSUID : 0;\n\n    LIBSSH2_FREE(session, data);\n    return 0;\n}\n\n/* libssh2_sftp_statvfs_ex\n * Get filesystem space and inode utilization (requires statvfs@openssh.com\n * support on the server)\n */\nLIBSSH2_API int\nlibssh2_sftp_statvfs(LIBSSH2_SFTP *sftp, const char *path,\n                     size_t path_len, LIBSSH2_SFTP_STATVFS *st)\n{\n    int rc;\n    if(!sftp || !st)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, sftp->channel->session, sftp_statvfs(sftp, path, path_len,\n                                                          st));\n    return rc;\n}\n\n\n/*\n * sftp_mkdir\n *\n * Create an SFTP directory\n */\nstatic int sftp_mkdir(LIBSSH2_SFTP *sftp, const char *path,\n                      unsigned int path_len, long mode)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    LIBSSH2_SFTP_ATTRIBUTES attrs = {\n        0, 0, 0, 0, 0, 0, 0\n    };\n    size_t data_len;\n    int retcode;\n    ssize_t packet_len;\n    unsigned char *packet, *s, *data;\n    int rc;\n\n    if(mode != LIBSSH2_SFTP_DEFAULT_MODE) {\n        /* Filetype in SFTP 3 and earlier */\n        attrs.flags = LIBSSH2_SFTP_ATTR_PERMISSIONS;\n        attrs.permissions = mode | LIBSSH2_SFTP_ATTR_PFILETYPE_DIR;\n    }\n\n    /* 13 = packet_len(4) + packet_type(1) + request_id(4) + path_len(4) */\n    packet_len = path_len + 13 + sftp_attrsize(attrs.flags);\n\n    if(sftp->mkdir_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP,\n                       \"Creating directory %s with mode 0%lo\", path, mode);\n        s = packet = LIBSSH2_ALLOC(session, packet_len);\n        if(!packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for FXP_MKDIR \"\n                                  \"packet\");\n        }\n\n        _libssh2_store_u32(&s, packet_len - 4);\n        *(s++) = SSH_FXP_MKDIR;\n        sftp->mkdir_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->mkdir_request_id);\n        _libssh2_store_str(&s, path, path_len);\n\n        s += sftp_attr2bin(s, &attrs);\n\n        sftp->mkdir_state = libssh2_NB_state_created;\n    }\n    else {\n        packet = sftp->mkdir_packet;\n    }\n\n    if(sftp->mkdir_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, packet, packet_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            sftp->mkdir_packet = packet;\n            return rc;\n        }\n        if(packet_len != rc) {\n            LIBSSH2_FREE(session, packet);\n            sftp->mkdir_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"_libssh2_channel_write() failed\");\n        }\n        LIBSSH2_FREE(session, packet);\n        sftp->mkdir_state = libssh2_NB_state_sent;\n        sftp->mkdir_packet = NULL;\n    }\n\n    rc = sftp_packet_require(sftp, SSH_FXP_STATUS, sftp->mkdir_request_id,\n                             &data, &data_len, 9);\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    }\n    else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n        if(data_len > 0) {\n            LIBSSH2_FREE(session, data);\n        }\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP mkdir packet too short\");\n    }\n    else if(rc) {\n        sftp->mkdir_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Error waiting for FXP STATUS\");\n    }\n\n    sftp->mkdir_state = libssh2_NB_state_idle;\n\n    retcode = _libssh2_ntohu32(data + 5);\n    LIBSSH2_FREE(session, data);\n\n    if(retcode == LIBSSH2_FX_OK) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"OK!\");\n        return 0;\n    }\n    else {\n        sftp->last_errno = retcode;\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP Protocol Error\");\n    }\n}\n\n/*\n * libssh2_sftp_mkdir_ex\n *\n * Create an SFTP directory\n */\nLIBSSH2_API int\nlibssh2_sftp_mkdir_ex(LIBSSH2_SFTP *sftp, const char *path,\n                      unsigned int path_len, long mode)\n{\n    int rc;\n    if(!sftp)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, sftp->channel->session,\n                 sftp_mkdir(sftp, path, path_len, mode));\n    return rc;\n}\n\n/* sftp_rmdir\n * Remove a directory\n */\nstatic int sftp_rmdir(LIBSSH2_SFTP *sftp, const char *path,\n                      unsigned int path_len)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    int retcode;\n    /* 13 = packet_len(4) + packet_type(1) + request_id(4) + path_len(4) */\n    ssize_t packet_len = path_len + 13;\n    unsigned char *s, *data;\n    int rc;\n\n    if(sftp->rmdir_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"Removing directory: %s\",\n                       path);\n        s = sftp->rmdir_packet = LIBSSH2_ALLOC(session, packet_len);\n        if(!sftp->rmdir_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for FXP_RMDIR \"\n                                  \"packet\");\n        }\n\n        _libssh2_store_u32(&s, packet_len - 4);\n        *(s++) = SSH_FXP_RMDIR;\n        sftp->rmdir_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->rmdir_request_id);\n        _libssh2_store_str(&s, path, path_len);\n\n        sftp->rmdir_state = libssh2_NB_state_created;\n    }\n\n    if(sftp->rmdir_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, sftp->rmdir_packet,\n                                    packet_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(packet_len != rc) {\n            LIBSSH2_FREE(session, sftp->rmdir_packet);\n            sftp->rmdir_packet = NULL;\n            sftp->rmdir_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send FXP_RMDIR command\");\n        }\n        LIBSSH2_FREE(session, sftp->rmdir_packet);\n        sftp->rmdir_packet = NULL;\n\n        sftp->rmdir_state = libssh2_NB_state_sent;\n    }\n\n    rc = sftp_packet_require(sftp, SSH_FXP_STATUS,\n                             sftp->rmdir_request_id, &data, &data_len, 9);\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        return rc;\n    }\n    else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n        if(data_len > 0) {\n            LIBSSH2_FREE(session, data);\n        }\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP rmdir packet too short\");\n    }\n    else if(rc) {\n        sftp->rmdir_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Error waiting for FXP STATUS\");\n    }\n\n    sftp->rmdir_state = libssh2_NB_state_idle;\n\n    retcode = _libssh2_ntohu32(data + 5);\n    LIBSSH2_FREE(session, data);\n\n    if(retcode == LIBSSH2_FX_OK) {\n        return 0;\n    }\n    else {\n        sftp->last_errno = retcode;\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP Protocol Error\");\n    }\n}\n\n/* libssh2_sftp_rmdir_ex\n * Remove a directory\n */\nLIBSSH2_API int\nlibssh2_sftp_rmdir_ex(LIBSSH2_SFTP *sftp, const char *path,\n                      unsigned int path_len)\n{\n    int rc;\n    if(!sftp)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, sftp->channel->session,\n                 sftp_rmdir(sftp, path, path_len));\n    return rc;\n}\n\n/* sftp_stat\n * Stat a file or symbolic link\n */\nstatic int sftp_stat(LIBSSH2_SFTP *sftp, const char *path,\n                     unsigned int path_len, int stat_type,\n                     LIBSSH2_SFTP_ATTRIBUTES * attrs)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len;\n    /* 13 = packet_len(4) + packet_type(1) + request_id(4) + path_len(4) */\n    ssize_t packet_len =\n        path_len + 13 +\n        ((stat_type ==\n          LIBSSH2_SFTP_SETSTAT) ? sftp_attrsize(attrs->flags) : 0);\n    unsigned char *s, *data;\n    static const unsigned char stat_responses[2] =\n        { SSH_FXP_ATTRS, SSH_FXP_STATUS };\n    int rc;\n\n    if(sftp->stat_state == libssh2_NB_state_idle) {\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"%s %s\",\n                       (stat_type == LIBSSH2_SFTP_SETSTAT) ? \"Set-statting\" :\n                       (stat_type ==\n                        LIBSSH2_SFTP_LSTAT ? \"LStatting\" : \"Statting\"), path);\n        s = sftp->stat_packet = LIBSSH2_ALLOC(session, packet_len);\n        if(!sftp->stat_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for FXP_*STAT \"\n                                  \"packet\");\n        }\n\n        _libssh2_store_u32(&s, packet_len - 4);\n\n        switch(stat_type) {\n        case LIBSSH2_SFTP_SETSTAT:\n            *(s++) = SSH_FXP_SETSTAT;\n            break;\n\n        case LIBSSH2_SFTP_LSTAT:\n            *(s++) = SSH_FXP_LSTAT;\n            break;\n\n        case LIBSSH2_SFTP_STAT:\n        default:\n            *(s++) = SSH_FXP_STAT;\n        }\n        sftp->stat_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->stat_request_id);\n        _libssh2_store_str(&s, path, path_len);\n\n        if(stat_type == LIBSSH2_SFTP_SETSTAT)\n            s += sftp_attr2bin(s, attrs);\n\n        sftp->stat_state = libssh2_NB_state_created;\n    }\n\n    if(sftp->stat_state == libssh2_NB_state_created) {\n        rc = _libssh2_channel_write(channel, 0, sftp->stat_packet, packet_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return rc;\n        }\n        else if(packet_len != rc) {\n            LIBSSH2_FREE(session, sftp->stat_packet);\n            sftp->stat_packet = NULL;\n            sftp->stat_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send STAT/LSTAT/SETSTAT command\");\n        }\n        LIBSSH2_FREE(session, sftp->stat_packet);\n        sftp->stat_packet = NULL;\n\n        sftp->stat_state = libssh2_NB_state_sent;\n    }\n\n    rc = sftp_packet_requirev(sftp, 2, stat_responses,\n                              sftp->stat_request_id, &data, &data_len, 9);\n    if(rc == LIBSSH2_ERROR_EAGAIN)\n        return rc;\n    else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n        if(data_len > 0) {\n            LIBSSH2_FREE(session, data);\n        }\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP stat packet too short\");\n    }\n    else if(rc) {\n        sftp->stat_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, rc,\n                              \"Timeout waiting for status message\");\n    }\n\n    sftp->stat_state = libssh2_NB_state_idle;\n\n    if(data[0] == SSH_FXP_STATUS) {\n        int retcode;\n\n        retcode = _libssh2_ntohu32(data + 5);\n        LIBSSH2_FREE(session, data);\n        if(retcode == LIBSSH2_FX_OK) {\n            memset(attrs, 0, sizeof(LIBSSH2_SFTP_ATTRIBUTES));\n            return 0;\n        }\n        else {\n            sftp->last_errno = retcode;\n            return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                  \"SFTP Protocol Error\");\n        }\n    }\n\n    memset(attrs, 0, sizeof(LIBSSH2_SFTP_ATTRIBUTES));\n    if(sftp_bin2attr(attrs, data + 5, data_len - 5) < 0) {\n        LIBSSH2_FREE(session, data);\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"Attributes too short in SFTP fstat\");\n    }\n\n    LIBSSH2_FREE(session, data);\n\n    return 0;\n}\n\n/* libssh2_sftp_stat_ex\n * Stat a file or symbolic link\n */\nLIBSSH2_API int\nlibssh2_sftp_stat_ex(LIBSSH2_SFTP *sftp, const char *path,\n                     unsigned int path_len, int stat_type,\n                     LIBSSH2_SFTP_ATTRIBUTES *attrs)\n{\n    int rc;\n    if(!sftp)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, sftp->channel->session,\n                 sftp_stat(sftp, path, path_len, stat_type, attrs));\n    return rc;\n}\n\n/* sftp_symlink\n * Read or set a symlink\n */\nstatic int sftp_symlink(LIBSSH2_SFTP *sftp, const char *path,\n                        unsigned int path_len, char *target,\n                        unsigned int target_len, int link_type)\n{\n    LIBSSH2_CHANNEL *channel = sftp->channel;\n    LIBSSH2_SESSION *session = channel->session;\n    size_t data_len, link_len;\n    /* 13 = packet_len(4) + packet_type(1) + request_id(4) + path_len(4) */\n    ssize_t packet_len =\n        path_len + 13 +\n        ((link_type == LIBSSH2_SFTP_SYMLINK) ? (4 + target_len) : 0);\n    unsigned char *s, *data;\n    static const unsigned char link_responses[2] =\n        { SSH_FXP_NAME, SSH_FXP_STATUS };\n    int retcode;\n\n    if((sftp->version < 3) && (link_type != LIBSSH2_SFTP_REALPATH)) {\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"Server does not support SYMLINK or READLINK\");\n    }\n\n    if(sftp->symlink_state == libssh2_NB_state_idle) {\n        s = sftp->symlink_packet = LIBSSH2_ALLOC(session, packet_len);\n        if(!sftp->symlink_packet) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"SYMLINK/READLINK/REALPATH packet\");\n        }\n\n        _libssh2_debug(session, LIBSSH2_TRACE_SFTP, \"%s %s on %s\",\n                       (link_type ==\n                        LIBSSH2_SFTP_SYMLINK) ? \"Creating\" : \"Reading\",\n                       (link_type ==\n                        LIBSSH2_SFTP_REALPATH) ? \"realpath\" : \"symlink\", path);\n\n        _libssh2_store_u32(&s, packet_len - 4);\n\n        switch(link_type) {\n        case LIBSSH2_SFTP_REALPATH:\n            *(s++) = SSH_FXP_REALPATH;\n            break;\n\n        case LIBSSH2_SFTP_SYMLINK:\n            *(s++) = SSH_FXP_SYMLINK;\n            break;\n\n        case LIBSSH2_SFTP_READLINK:\n        default:\n            *(s++) = SSH_FXP_READLINK;\n        }\n        sftp->symlink_request_id = sftp->request_id++;\n        _libssh2_store_u32(&s, sftp->symlink_request_id);\n        _libssh2_store_str(&s, path, path_len);\n\n        if(link_type == LIBSSH2_SFTP_SYMLINK)\n            _libssh2_store_str(&s, target, target_len);\n\n        sftp->symlink_state = libssh2_NB_state_created;\n    }\n\n    if(sftp->symlink_state == libssh2_NB_state_created) {\n        ssize_t rc = _libssh2_channel_write(channel, 0, sftp->symlink_packet,\n                                            packet_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN)\n            return rc;\n        else if(packet_len != rc) {\n            LIBSSH2_FREE(session, sftp->symlink_packet);\n            sftp->symlink_packet = NULL;\n            sftp->symlink_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send SYMLINK/READLINK command\");\n        }\n        LIBSSH2_FREE(session, sftp->symlink_packet);\n        sftp->symlink_packet = NULL;\n\n        sftp->symlink_state = libssh2_NB_state_sent;\n    }\n\n    retcode = sftp_packet_requirev(sftp, 2, link_responses,\n                                   sftp->symlink_request_id, &data,\n                                   &data_len, 9);\n    if(retcode == LIBSSH2_ERROR_EAGAIN)\n        return retcode;\n    else if(retcode == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n        if(data_len > 0) {\n            LIBSSH2_FREE(session, data);\n        }\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP symlink packet too short\");\n    }\n    else if(retcode) {\n        sftp->symlink_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, retcode,\n                              \"Error waiting for status message\");\n    }\n\n    sftp->symlink_state = libssh2_NB_state_idle;\n\n    if(data[0] == SSH_FXP_STATUS) {\n        retcode = _libssh2_ntohu32(data + 5);\n        LIBSSH2_FREE(session, data);\n        if(retcode == LIBSSH2_FX_OK)\n            return LIBSSH2_ERROR_NONE;\n        else {\n            sftp->last_errno = retcode;\n            return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                                  \"SFTP Protocol Error\");\n        }\n    }\n\n    if(_libssh2_ntohu32(data + 5) < 1) {\n        LIBSSH2_FREE(session, data);\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"Invalid READLINK/REALPATH response, \"\n                              \"no name entries\");\n    }\n\n    if(data_len < 13) {\n        if(data_len > 0) {\n            LIBSSH2_FREE(session, data);\n        }\n        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,\n                              \"SFTP stat packet too short\");\n    }\n\n    /* this reads a u32 and stores it into a signed 32bit value */\n    link_len = _libssh2_ntohu32(data + 9);\n    if(link_len < target_len) {\n        memcpy(target, data + 13, link_len);\n        target[link_len] = 0;\n        retcode = (int)link_len;\n    }\n    else\n        retcode = LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n    LIBSSH2_FREE(session, data);\n\n    return retcode;\n}\n\n/* libssh2_sftp_symlink_ex\n * Read or set a symlink\n */\nLIBSSH2_API int\nlibssh2_sftp_symlink_ex(LIBSSH2_SFTP *sftp, const char *path,\n                        unsigned int path_len, char *target,\n                        unsigned int target_len, int link_type)\n{\n    int rc;\n    if(!sftp)\n        return LIBSSH2_ERROR_BAD_USE;\n    BLOCK_ADJUST(rc, sftp->channel->session,\n                 sftp_symlink(sftp, path, path_len, target, target_len,\n                              link_type));\n    return rc;\n}\n\n/* libssh2_sftp_last_error\n * Returns the last error code reported by SFTP\n */\nLIBSSH2_API unsigned long\nlibssh2_sftp_last_error(LIBSSH2_SFTP *sftp)\n{\n    if(!sftp)\n        return 0;\n\n    return sftp->last_errno;\n}\n\n/* libssh2_sftp_get_channel\n * Return the channel of sftp, then caller can control the channel's behavior.\n */\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_sftp_get_channel(LIBSSH2_SFTP *sftp)\n{\n    if(!sftp)\n        return NULL;\n\n    return sftp->channel;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/sftp.h",
    "content": "#ifndef _LIBSSH2_SFTP_H\n#define _LIBSSH2_SFTP_H\n/*\n * Copyright (C) 2010 - 2012 by Daniel Stenberg\n * Author: Daniel Stenberg <daniel@haxx.se>\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n */\n\n/*\n * MAX_SFTP_OUTGOING_SIZE MUST not be larger than 32500 or so. This is the\n * amount of data sent in each FXP_WRITE packet\n */\n#define MAX_SFTP_OUTGOING_SIZE 30000\n\n/* MAX_SFTP_READ_SIZE is how much data is asked for at max in each FXP_READ\n * packets.\n */\n#define MAX_SFTP_READ_SIZE 30000\n\nstruct sftp_pipeline_chunk {\n    struct list_node node;\n    libssh2_uint64_t offset; /* READ: offset at which to start reading\n                                WRITE: not used */\n    size_t len; /* WRITE: size of the data to write\n                   READ: how many bytes that was asked for */\n    size_t sent;\n    ssize_t lefttosend; /* if 0, the entire packet has been sent off */\n    uint32_t request_id;\n    unsigned char packet[1]; /* data */\n};\n\nstruct sftp_zombie_requests {\n    struct list_node node;\n    uint32_t request_id;\n};\n\n#ifndef MIN\n#define MIN(x,y) ((x)<(y)?(x):(y))\n#endif\n\nstruct _LIBSSH2_SFTP_PACKET\n{\n    struct list_node node;   /* linked list header */\n    uint32_t request_id;\n    unsigned char *data;\n    size_t data_len;              /* payload size */\n};\n\ntypedef struct _LIBSSH2_SFTP_PACKET LIBSSH2_SFTP_PACKET;\n\n#define SFTP_HANDLE_MAXLEN 256 /* according to spec! */\n\nstruct _LIBSSH2_SFTP_HANDLE\n{\n    struct list_node node;\n\n    LIBSSH2_SFTP *sftp;\n\n    char handle[SFTP_HANDLE_MAXLEN];\n    size_t handle_len;\n\n    enum {\n        LIBSSH2_SFTP_HANDLE_FILE,\n        LIBSSH2_SFTP_HANDLE_DIR\n    } handle_type;\n\n    union _libssh2_sftp_handle_data\n    {\n        struct _libssh2_sftp_handle_file_data\n        {\n            libssh2_uint64_t offset;\n            libssh2_uint64_t offset_sent;\n            size_t acked; /* container for acked data that hasn't been\n                             returned to caller yet, used for sftp_write */\n\n            /* 'data' is used by sftp_read() and is allocated data that has\n               been received already from the server but wasn't returned to\n               the caller yet. It is of size 'data_len' and 'data_left is the\n               number of bytes not yet returned, counted from the end of the\n               buffer. */\n            unsigned char *data;\n            size_t data_len;\n            size_t data_left;\n\n            char eof; /* we have read to the end */\n        } file;\n        struct _libssh2_sftp_handle_dir_data\n        {\n            uint32_t names_left;\n            void *names_packet;\n            char *next_name;\n            size_t names_packet_len;\n        } dir;\n    } u;\n\n    /* State variables used in libssh2_sftp_close_handle() */\n    libssh2_nonblocking_states close_state;\n    uint32_t close_request_id;\n    unsigned char *close_packet;\n\n    /* list of outstanding packets sent to server */\n    struct list_head packet_list;\n\n};\n\nstruct _LIBSSH2_SFTP\n{\n    LIBSSH2_CHANNEL *channel;\n\n    uint32_t request_id, version;\n\n    struct list_head packets;\n\n    /* List of FXP_READ responses to ignore because EOF already received. */\n    struct list_head zombie_requests;\n\n    /* a list of _LIBSSH2_SFTP_HANDLE structs */\n    struct list_head sftp_handles;\n\n    uint32_t last_errno;\n\n    /* Holder for partial packet, use in libssh2_sftp_packet_read() */\n    unsigned char partial_size[4];      /* buffer for size field   */\n    size_t partial_size_len;            /* size field length       */\n    unsigned char *partial_packet;      /* The data                */\n    uint32_t partial_len;               /* Desired number of bytes */\n    size_t partial_received;            /* Bytes received so far   */\n\n    /* Time that libssh2_sftp_packet_requirev() started reading */\n    time_t requirev_start;\n\n    /* State variables used in libssh2_sftp_open_ex() */\n    libssh2_nonblocking_states open_state;\n    unsigned char *open_packet;\n    uint32_t open_packet_len; /* 32 bit on the wire */\n    size_t open_packet_sent;\n    uint32_t open_request_id;\n\n    /* State variable used in sftp_read() */\n    libssh2_nonblocking_states read_state;\n\n    /* State variable used in sftp_packet_read() */\n    libssh2_nonblocking_states packet_state;\n\n    /* State variable used in sftp_write() */\n    libssh2_nonblocking_states write_state;\n\n    /* State variables used in sftp_fsync() */\n    libssh2_nonblocking_states fsync_state;\n    unsigned char *fsync_packet;\n    uint32_t fsync_request_id;\n\n    /* State variables used in libssh2_sftp_readdir() */\n    libssh2_nonblocking_states readdir_state;\n    unsigned char *readdir_packet;\n    uint32_t readdir_request_id;\n\n    /* State variables used in libssh2_sftp_fstat_ex() */\n    libssh2_nonblocking_states fstat_state;\n    unsigned char *fstat_packet;\n    uint32_t fstat_request_id;\n\n    /* State variables used in libssh2_sftp_unlink_ex() */\n    libssh2_nonblocking_states unlink_state;\n    unsigned char *unlink_packet;\n    uint32_t unlink_request_id;\n\n    /* State variables used in libssh2_sftp_rename_ex() */\n    libssh2_nonblocking_states rename_state;\n    unsigned char *rename_packet;\n    unsigned char *rename_s;\n    uint32_t rename_request_id;\n\n    /* State variables used in libssh2_sftp_fstatvfs() */\n    libssh2_nonblocking_states fstatvfs_state;\n    unsigned char *fstatvfs_packet;\n    uint32_t fstatvfs_request_id;\n\n    /* State variables used in libssh2_sftp_statvfs() */\n    libssh2_nonblocking_states statvfs_state;\n    unsigned char *statvfs_packet;\n    uint32_t statvfs_request_id;\n\n    /* State variables used in libssh2_sftp_mkdir() */\n    libssh2_nonblocking_states mkdir_state;\n    unsigned char *mkdir_packet;\n    uint32_t mkdir_request_id;\n\n    /* State variables used in libssh2_sftp_rmdir() */\n    libssh2_nonblocking_states rmdir_state;\n    unsigned char *rmdir_packet;\n    uint32_t rmdir_request_id;\n\n    /* State variables used in libssh2_sftp_stat() */\n    libssh2_nonblocking_states stat_state;\n    unsigned char *stat_packet;\n    uint32_t stat_request_id;\n\n    /* State variables used in libssh2_sftp_symlink() */\n    libssh2_nonblocking_states symlink_state;\n    unsigned char *symlink_packet;\n    uint32_t symlink_request_id;\n};\n\n#endif\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/transport.c",
    "content": "/* Copyright (C) 2007 The Written Word, Inc.  All rights reserved.\n * Copyright (C) 2009-2010 by Daniel Stenberg\n * Author: Daniel Stenberg <daniel@haxx.se>\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file handles reading and writing to the SECSH transport layer. RFC4253.\n */\n\n#include \"libssh2_priv.h\"\n#include <errno.h>\n#include <fcntl.h>\n#include <ctype.h>\n#ifdef LIBSSH2DEBUG\n#include <stdio.h>\n#endif\n\n#include <assert.h>\n\n#include \"transport.h\"\n#include \"mac.h\"\n\n#define MAX_BLOCKSIZE 32    /* MUST fit biggest crypto block size we use/get */\n#define MAX_MACSIZE 64      /* MUST fit biggest MAC length we support */\n\n#ifdef LIBSSH2DEBUG\n#define UNPRINTABLE_CHAR '.'\nstatic void\ndebugdump(LIBSSH2_SESSION * session,\n          const char *desc, const unsigned char *ptr, size_t size)\n{\n    size_t i;\n    size_t c;\n    unsigned int width = 0x10;\n    char buffer[256];  /* Must be enough for width*4 + about 30 or so */\n    size_t used;\n    static const char *hex_chars = \"0123456789ABCDEF\";\n\n    if(!(session->showmask & LIBSSH2_TRACE_TRANS)) {\n        /* not asked for, bail out */\n        return;\n    }\n\n    used = snprintf(buffer, sizeof(buffer), \"=> %s (%d bytes)\\n\",\n                    desc, (int) size);\n    if(session->tracehandler)\n        (session->tracehandler)(session, session->tracehandler_context,\n                                buffer, used);\n    else\n        fprintf(stderr, \"%s\", buffer);\n\n    for(i = 0; i < size; i += width) {\n\n        used = snprintf(buffer, sizeof(buffer), \"%04lx: \", (long)i);\n\n        /* hex not disabled, show it */\n        for(c = 0; c < width; c++) {\n            if(i + c < size) {\n                buffer[used++] = hex_chars[(ptr[i + c] >> 4) & 0xF];\n                buffer[used++] = hex_chars[ptr[i + c] & 0xF];\n            }\n            else {\n                buffer[used++] = ' ';\n                buffer[used++] = ' ';\n            }\n\n            buffer[used++] = ' ';\n            if((width/2) - 1 == c)\n                buffer[used++] = ' ';\n        }\n\n        buffer[used++] = ':';\n        buffer[used++] = ' ';\n\n        for(c = 0; (c < width) && (i + c < size); c++) {\n            buffer[used++] = isprint(ptr[i + c]) ?\n                ptr[i + c] : UNPRINTABLE_CHAR;\n        }\n        buffer[used++] = '\\n';\n        buffer[used] = 0;\n\n        if(session->tracehandler)\n            (session->tracehandler)(session, session->tracehandler_context,\n                                    buffer, used);\n        else\n            fprintf(stderr, \"%s\", buffer);\n    }\n}\n#else\n#define debugdump(a,x,y,z)\n#endif\n\n\n/* decrypt() decrypts 'len' bytes from 'source' to 'dest'.\n *\n * returns 0 on success and negative on failure\n */\n\nstatic int\ndecrypt(LIBSSH2_SESSION * session, unsigned char *source,\n        unsigned char *dest, int len)\n{\n    struct transportpacket *p = &session->packet;\n    int blocksize = session->remote.crypt->blocksize;\n\n    /* if we get called with a len that isn't an even number of blocksizes\n       we risk losing those extra bytes */\n    assert((len % blocksize) == 0);\n\n    while(len >= blocksize) {\n        if(session->remote.crypt->crypt(session, source, blocksize,\n                                         &session->remote.crypt_abstract)) {\n            LIBSSH2_FREE(session, p->payload);\n            return LIBSSH2_ERROR_DECRYPT;\n        }\n\n        /* if the crypt() function would write to a given address it\n           wouldn't have to memcpy() and we could avoid this memcpy()\n           too */\n        memcpy(dest, source, blocksize);\n\n        len -= blocksize;       /* less bytes left */\n        dest += blocksize;      /* advance write pointer */\n        source += blocksize;    /* advance read pointer */\n    }\n    return LIBSSH2_ERROR_NONE;         /* all is fine */\n}\n\n/*\n * fullpacket() gets called when a full packet has been received and properly\n * collected.\n */\nstatic int\nfullpacket(LIBSSH2_SESSION * session, int encrypted /* 1 or 0 */ )\n{\n    unsigned char macbuf[MAX_MACSIZE];\n    struct transportpacket *p = &session->packet;\n    int rc;\n    int compressed;\n\n    if(session->fullpacket_state == libssh2_NB_state_idle) {\n        session->fullpacket_macstate = LIBSSH2_MAC_CONFIRMED;\n        session->fullpacket_payload_len = p->packet_length - 1;\n\n        if(encrypted) {\n\n            /* Calculate MAC hash */\n            session->remote.mac->hash(session, macbuf,  /* store hash here */\n                                      session->remote.seqno,\n                                      p->init, 5,\n                                      p->payload,\n                                      session->fullpacket_payload_len,\n                                      &session->remote.mac_abstract);\n\n            /* Compare the calculated hash with the MAC we just read from\n             * the network. The read one is at the very end of the payload\n             * buffer. Note that 'payload_len' here is the packet_length\n             * field which includes the padding but not the MAC.\n             */\n            if(memcmp(macbuf, p->payload + session->fullpacket_payload_len,\n                       session->remote.mac->mac_len)) {\n                session->fullpacket_macstate = LIBSSH2_MAC_INVALID;\n            }\n        }\n\n        session->remote.seqno++;\n\n        /* ignore the padding */\n        session->fullpacket_payload_len -= p->padding_length;\n\n        /* Check for and deal with decompression */\n        compressed =\n            session->local.comp != NULL &&\n            session->local.comp->compress &&\n            ((session->state & LIBSSH2_STATE_AUTHENTICATED) ||\n             session->local.comp->use_in_auth);\n\n        if(compressed && session->remote.comp_abstract) {\n            /*\n             * The buffer for the decompression (remote.comp_abstract) is\n             * initialised in time when it is needed so as long it is NULL we\n             * cannot decompress.\n             */\n\n            unsigned char *data;\n            size_t data_len;\n            rc = session->remote.comp->decomp(session,\n                                              &data, &data_len,\n                                              LIBSSH2_PACKET_MAXDECOMP,\n                                              p->payload,\n                                              session->fullpacket_payload_len,\n                                              &session->remote.comp_abstract);\n            LIBSSH2_FREE(session, p->payload);\n            if(rc)\n                return rc;\n\n            p->payload = data;\n            session->fullpacket_payload_len = data_len;\n        }\n\n        session->fullpacket_packet_type = p->payload[0];\n\n        debugdump(session, \"libssh2_transport_read() plain\",\n                  p->payload, session->fullpacket_payload_len);\n\n        session->fullpacket_state = libssh2_NB_state_created;\n    }\n\n    if(session->fullpacket_state == libssh2_NB_state_created) {\n        rc = _libssh2_packet_add(session, p->payload,\n                                 session->fullpacket_payload_len,\n                                 session->fullpacket_macstate);\n        if(rc == LIBSSH2_ERROR_EAGAIN)\n            return rc;\n        if(rc) {\n            session->fullpacket_state = libssh2_NB_state_idle;\n            return rc;\n        }\n    }\n\n    session->fullpacket_state = libssh2_NB_state_idle;\n\n    return session->fullpacket_packet_type;\n}\n\n\n/*\n * _libssh2_transport_read\n *\n * Collect a packet into the input queue.\n *\n * Returns packet type added to input queue (0 if nothing added), or a\n * negative error number.\n */\n\n/*\n * This function reads the binary stream as specified in chapter 6 of RFC4253\n * \"The Secure Shell (SSH) Transport Layer Protocol\"\n *\n * DOES NOT call _libssh2_error() for ANY error case.\n */\nint _libssh2_transport_read(LIBSSH2_SESSION * session)\n{\n    int rc;\n    struct transportpacket *p = &session->packet;\n    int remainbuf;\n    int remainpack;\n    int numbytes;\n    int numdecrypt;\n    unsigned char block[MAX_BLOCKSIZE];\n    int blocksize;\n    int encrypted = 1;\n\n    /* default clear the bit */\n    session->socket_block_directions &= ~LIBSSH2_SESSION_BLOCK_INBOUND;\n\n    /*\n     * All channels, systems, subsystems, etc eventually make it down here\n     * when looking for more incoming data. If a key exchange is going on\n     * (LIBSSH2_STATE_EXCHANGING_KEYS bit is set) then the remote end will\n     * ONLY send key exchange related traffic. In non-blocking mode, there is\n     * a chance to break out of the kex_exchange function with an EAGAIN\n     * status, and never come back to it. If LIBSSH2_STATE_EXCHANGING_KEYS is\n     * active, then we must redirect to the key exchange. However, if\n     * kex_exchange is active (as in it is the one that calls this execution\n     * of packet_read, then don't redirect, as that would be an infinite loop!\n     */\n\n    if(session->state & LIBSSH2_STATE_EXCHANGING_KEYS &&\n        !(session->state & LIBSSH2_STATE_KEX_ACTIVE)) {\n\n        /* Whoever wants a packet won't get anything until the key re-exchange\n         * is done!\n         */\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS, \"Redirecting into the\"\n                       \" key re-exchange from _libssh2_transport_read\");\n        rc = _libssh2_kex_exchange(session, 1, &session->startup_key_state);\n        if(rc)\n            return rc;\n    }\n\n    /*\n     * =============================== NOTE ===============================\n     * I know this is very ugly and not a really good use of \"goto\", but\n     * this case statement would be even uglier to do it any other way\n     */\n    if(session->readPack_state == libssh2_NB_state_jump1) {\n        session->readPack_state = libssh2_NB_state_idle;\n        encrypted = session->readPack_encrypted;\n        goto libssh2_transport_read_point1;\n    }\n\n    do {\n        if(session->socket_state == LIBSSH2_SOCKET_DISCONNECTED) {\n            return LIBSSH2_ERROR_NONE;\n        }\n\n        if(session->state & LIBSSH2_STATE_NEWKEYS) {\n            blocksize = session->remote.crypt->blocksize;\n        }\n        else {\n            encrypted = 0;      /* not encrypted */\n            blocksize = 5;      /* not strictly true, but we can use 5 here to\n                                   make the checks below work fine still */\n        }\n\n        /* read/use a whole big chunk into a temporary area stored in\n           the LIBSSH2_SESSION struct. We will decrypt data from that\n           buffer into the packet buffer so this temp one doesn't have\n           to be able to keep a whole SSH packet, just be large enough\n           so that we can read big chunks from the network layer. */\n\n        /* how much data there is remaining in the buffer to deal with\n           before we should read more from the network */\n        remainbuf = p->writeidx - p->readidx;\n\n        /* if remainbuf turns negative we have a bad internal error */\n        assert(remainbuf >= 0);\n\n        if(remainbuf < blocksize) {\n            /* If we have less than a blocksize left, it is too\n               little data to deal with, read more */\n            ssize_t nread;\n\n            /* move any remainder to the start of the buffer so\n               that we can do a full refill */\n            if(remainbuf) {\n                memmove(p->buf, &p->buf[p->readidx], remainbuf);\n                p->readidx = 0;\n                p->writeidx = remainbuf;\n            }\n            else {\n                /* nothing to move, just zero the indexes */\n                p->readidx = p->writeidx = 0;\n            }\n\n            /* now read a big chunk from the network into the temp buffer */\n            nread =\n                LIBSSH2_RECV(session, &p->buf[remainbuf],\n                              PACKETBUFSIZE - remainbuf,\n                              LIBSSH2_SOCKET_RECV_FLAGS(session));\n            if(nread <= 0) {\n                /* check if this is due to EAGAIN and return the special\n                   return code if so, error out normally otherwise */\n                if((nread < 0) && (nread == -EAGAIN)) {\n                    session->socket_block_directions |=\n                        LIBSSH2_SESSION_BLOCK_INBOUND;\n                    return LIBSSH2_ERROR_EAGAIN;\n                }\n                _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                               \"Error recving %d bytes (got %d)\",\n                               PACKETBUFSIZE - remainbuf, -nread);\n                return LIBSSH2_ERROR_SOCKET_RECV;\n            }\n            _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                           \"Recved %d/%d bytes to %p+%d\", nread,\n                           PACKETBUFSIZE - remainbuf, p->buf, remainbuf);\n\n            debugdump(session, \"libssh2_transport_read() raw\",\n                      &p->buf[remainbuf], nread);\n            /* advance write pointer */\n            p->writeidx += nread;\n\n            /* update remainbuf counter */\n            remainbuf = p->writeidx - p->readidx;\n        }\n\n        /* how much data to deal with from the buffer */\n        numbytes = remainbuf;\n\n        if(!p->total_num) {\n            size_t total_num;\n\n            /* No payload package area allocated yet. To know the\n               size of this payload, we need to decrypt the first\n               blocksize data. */\n\n            if(numbytes < blocksize) {\n                /* we can't act on anything less than blocksize, but this\n                   check is only done for the initial block since once we have\n                   got the start of a block we can in fact deal with fractions\n                */\n                session->socket_block_directions |=\n                    LIBSSH2_SESSION_BLOCK_INBOUND;\n                return LIBSSH2_ERROR_EAGAIN;\n            }\n\n            if(encrypted) {\n                rc = decrypt(session, &p->buf[p->readidx], block, blocksize);\n                if(rc != LIBSSH2_ERROR_NONE) {\n                    return rc;\n                }\n                /* save the first 5 bytes of the decrypted package, to be\n                   used in the hash calculation later down. */\n                memcpy(p->init, block, 5);\n            }\n            else {\n                /* the data is plain, just copy it verbatim to\n                   the working block buffer */\n                memcpy(block, &p->buf[p->readidx], blocksize);\n            }\n\n            /* advance the read pointer */\n            p->readidx += blocksize;\n\n            /* we now have the initial blocksize bytes decrypted,\n             * and we can extract packet and padding length from it\n             */\n            p->packet_length = _libssh2_ntohu32(block);\n            if(p->packet_length < 1) {\n                return LIBSSH2_ERROR_DECRYPT;\n            }\n            else if(p->packet_length > LIBSSH2_PACKET_MAXPAYLOAD) {\n                return LIBSSH2_ERROR_OUT_OF_BOUNDARY;\n            }\n\n            p->padding_length = block[4];\n            if(p->padding_length > p->packet_length - 1) {\n                return LIBSSH2_ERROR_DECRYPT;\n            }\n\n\n            /* total_num is the number of bytes following the initial\n               (5 bytes) packet length and padding length fields */\n            total_num =\n                p->packet_length - 1 +\n                (encrypted ? session->remote.mac->mac_len : 0);\n\n            /* RFC4253 section 6.1 Maximum Packet Length says:\n             *\n             * \"All implementations MUST be able to process\n             * packets with uncompressed payload length of 32768\n             * bytes or less and total packet size of 35000 bytes\n             * or less (including length, padding length, payload,\n             * padding, and MAC.).\"\n             */\n            if(total_num > LIBSSH2_PACKET_MAXPAYLOAD) {\n                return LIBSSH2_ERROR_OUT_OF_BOUNDARY;\n            }\n\n            /* Get a packet handle put data into. We get one to\n               hold all data, including padding and MAC. */\n            p->payload = LIBSSH2_ALLOC(session, total_num);\n            if(!p->payload) {\n                return LIBSSH2_ERROR_ALLOC;\n            }\n            p->total_num = total_num;\n            /* init write pointer to start of payload buffer */\n            p->wptr = p->payload;\n\n            if(blocksize > 5) {\n                /* copy the data from index 5 to the end of\n                   the blocksize from the temporary buffer to\n                   the start of the decrypted buffer */\n                if(blocksize - 5 <= (int) total_num) {\n                    memcpy(p->wptr, &block[5], blocksize - 5);\n                    p->wptr += blocksize - 5;       /* advance write pointer */\n                }\n                else {\n                    return LIBSSH2_ERROR_OUT_OF_BOUNDARY;\n                }\n            }\n\n            /* init the data_num field to the number of bytes of\n               the package read so far */\n            p->data_num = p->wptr - p->payload;\n\n            /* we already dealt with a blocksize worth of data */\n            numbytes -= blocksize;\n        }\n\n        /* how much there is left to add to the current payload\n           package */\n        remainpack = p->total_num - p->data_num;\n\n        if(numbytes > remainpack) {\n            /* if we have more data in the buffer than what is going into this\n               particular packet, we limit this round to this packet only */\n            numbytes = remainpack;\n        }\n\n        if(encrypted) {\n            /* At the end of the incoming stream, there is a MAC,\n               and we don't want to decrypt that since we need it\n               \"raw\". We MUST however decrypt the padding data\n               since it is used for the hash later on. */\n            int skip = session->remote.mac->mac_len;\n\n            /* if what we have plus numbytes is bigger than the\n               total minus the skip margin, we should lower the\n               amount to decrypt even more */\n            if((p->data_num + numbytes) > (p->total_num - skip)) {\n                numdecrypt = (p->total_num - skip) - p->data_num;\n            }\n            else {\n                int frac;\n                numdecrypt = numbytes;\n                frac = numdecrypt % blocksize;\n                if(frac) {\n                    /* not an aligned amount of blocks,\n                       align it */\n                    numdecrypt -= frac;\n                    /* and make it no unencrypted data\n                       after it */\n                    numbytes = 0;\n                }\n            }\n        }\n        else {\n            /* unencrypted data should not be decrypted at all */\n            numdecrypt = 0;\n        }\n\n        /* if there are bytes to decrypt, do that */\n        if(numdecrypt > 0) {\n            /* now decrypt the lot */\n            rc = decrypt(session, &p->buf[p->readidx], p->wptr, numdecrypt);\n            if(rc != LIBSSH2_ERROR_NONE) {\n                p->total_num = 0;   /* no packet buffer available */\n                return rc;\n            }\n\n            /* advance the read pointer */\n            p->readidx += numdecrypt;\n            /* advance write pointer */\n            p->wptr += numdecrypt;\n            /* increase data_num */\n            p->data_num += numdecrypt;\n\n            /* bytes left to take care of without decryption */\n            numbytes -= numdecrypt;\n        }\n\n        /* if there are bytes to copy that aren't decrypted, simply\n           copy them as-is to the target buffer */\n        if(numbytes > 0) {\n\n            if(numbytes <= (int)(p->total_num - (p->wptr - p->payload))) {\n                memcpy(p->wptr, &p->buf[p->readidx], numbytes);\n            }\n            else {\n                return LIBSSH2_ERROR_OUT_OF_BOUNDARY;\n            }\n\n            /* advance the read pointer */\n            p->readidx += numbytes;\n            /* advance write pointer */\n            p->wptr += numbytes;\n            /* increase data_num */\n            p->data_num += numbytes;\n        }\n\n        /* now check how much data there's left to read to finish the\n           current packet */\n        remainpack = p->total_num - p->data_num;\n\n        if(!remainpack) {\n            /* we have a full packet */\n          libssh2_transport_read_point1:\n            rc = fullpacket(session, encrypted);\n            if(rc == LIBSSH2_ERROR_EAGAIN) {\n\n                if(session->packAdd_state != libssh2_NB_state_idle) {\n                    /* fullpacket only returns LIBSSH2_ERROR_EAGAIN if\n                     * libssh2_packet_add returns LIBSSH2_ERROR_EAGAIN. If\n                     * that returns LIBSSH2_ERROR_EAGAIN but the packAdd_state\n                     * is idle, then the packet has been added to the brigade,\n                     * but some immediate action that was taken based on the\n                     * packet type (such as key re-exchange) is not yet\n                     * complete.  Clear the way for a new packet to be read\n                     * in.\n                     */\n                    session->readPack_encrypted = encrypted;\n                    session->readPack_state = libssh2_NB_state_jump1;\n                }\n\n                return rc;\n            }\n\n            p->total_num = 0;   /* no packet buffer available */\n\n            return rc;\n        }\n    } while(1);                /* loop */\n\n    return LIBSSH2_ERROR_SOCKET_RECV; /* we never reach this point */\n}\n\nstatic int\nsend_existing(LIBSSH2_SESSION *session, const unsigned char *data,\n              size_t data_len, ssize_t *ret)\n{\n    ssize_t rc;\n    ssize_t length;\n    struct transportpacket *p = &session->packet;\n\n    if(!p->olen) {\n        *ret = 0;\n        return LIBSSH2_ERROR_NONE;\n    }\n\n    /* send as much as possible of the existing packet */\n    if((data != p->odata) || (data_len != p->olen)) {\n        /* When we are about to complete the sending of a packet, it is vital\n           that the caller doesn't try to send a new/different packet since\n           we don't add this one up until the previous one has been sent. To\n           make the caller really notice his/hers flaw, we return error for\n           this case */\n        return LIBSSH2_ERROR_BAD_USE;\n    }\n\n    *ret = 1;                   /* set to make our parent return */\n\n    /* number of bytes left to send */\n    length = p->ototal_num - p->osent;\n\n    rc = LIBSSH2_SEND(session, &p->outbuf[p->osent], length,\n                       LIBSSH2_SOCKET_SEND_FLAGS(session));\n    if(rc < 0)\n        _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                       \"Error sending %d bytes: %d\", length, -rc);\n    else {\n        _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                       \"Sent %d/%d bytes at %p+%d\", rc, length, p->outbuf,\n                       p->osent);\n        debugdump(session, \"libssh2_transport_write send()\",\n                  &p->outbuf[p->osent], rc);\n    }\n\n    if(rc == length) {\n        /* the remainder of the package was sent */\n        p->ototal_num = 0;\n        p->olen = 0;\n        /* we leave *ret set so that the parent returns as we MUST return back\n           a send success now, so that we don't risk sending EAGAIN later\n           which then would confuse the parent function */\n        return LIBSSH2_ERROR_NONE;\n\n    }\n    else if(rc < 0) {\n        /* nothing was sent */\n        if(rc != -EAGAIN)\n            /* send failure! */\n            return LIBSSH2_ERROR_SOCKET_SEND;\n\n        session->socket_block_directions |= LIBSSH2_SESSION_BLOCK_OUTBOUND;\n        return LIBSSH2_ERROR_EAGAIN;\n    }\n\n    p->osent += rc;         /* we sent away this much data */\n\n    return rc < length ? LIBSSH2_ERROR_EAGAIN : LIBSSH2_ERROR_NONE;\n}\n\n/*\n * libssh2_transport_send\n *\n * Send a packet, encrypting it and adding a MAC code if necessary\n * Returns 0 on success, non-zero on failure.\n *\n * The data is provided as _two_ data areas that are combined by this\n * function.  The 'data' part is sent immediately before 'data2'. 'data2' may\n * be set to NULL to only use a single part.\n *\n * Returns LIBSSH2_ERROR_EAGAIN if it would block or if the whole packet was\n * not sent yet. If it does so, the caller should call this function again as\n * soon as it is likely that more data can be sent, and this function MUST\n * then be called with the same argument set (same data pointer and same\n * data_len) until ERROR_NONE or failure is returned.\n *\n * This function DOES NOT call _libssh2_error() on any errors.\n */\nint _libssh2_transport_send(LIBSSH2_SESSION *session,\n                            const unsigned char *data, size_t data_len,\n                            const unsigned char *data2, size_t data2_len)\n{\n    int blocksize =\n        (session->state & LIBSSH2_STATE_NEWKEYS) ?\n        session->local.crypt->blocksize : 8;\n    int padding_length;\n    size_t packet_length;\n    int total_length;\n#ifdef RANDOM_PADDING\n    int rand_max;\n    int seed = data[0];         /* FIXME: make this random */\n#endif\n    struct transportpacket *p = &session->packet;\n    int encrypted;\n    int compressed;\n    ssize_t ret;\n    int rc;\n    const unsigned char *orgdata = data;\n    size_t orgdata_len = data_len;\n\n    /*\n     * If the last read operation was interrupted in the middle of a key\n     * exchange, we must complete that key exchange before continuing to write\n     * further data.\n     *\n     * See the similar block in _libssh2_transport_read for more details.\n     */\n    if(session->state & LIBSSH2_STATE_EXCHANGING_KEYS &&\n        !(session->state & LIBSSH2_STATE_KEX_ACTIVE)) {\n        /* Don't write any new packets if we're still in the middle of a key\n         * exchange. */\n        _libssh2_debug(session, LIBSSH2_TRACE_TRANS, \"Redirecting into the\"\n                       \" key re-exchange from _libssh2_transport_send\");\n        rc = _libssh2_kex_exchange(session, 1, &session->startup_key_state);\n        if(rc)\n            return rc;\n    }\n\n    debugdump(session, \"libssh2_transport_write plain\", data, data_len);\n    if(data2)\n        debugdump(session, \"libssh2_transport_write plain2\", data2, data2_len);\n\n    /* FIRST, check if we have a pending write to complete. send_existing\n       only sanity-check data and data_len and not data2 and data2_len!! */\n    rc = send_existing(session, data, data_len, &ret);\n    if(rc)\n        return rc;\n\n    session->socket_block_directions &= ~LIBSSH2_SESSION_BLOCK_OUTBOUND;\n\n    if(ret)\n        /* set by send_existing if data was sent */\n        return rc;\n\n    encrypted = (session->state & LIBSSH2_STATE_NEWKEYS) ? 1 : 0;\n\n    compressed =\n        session->local.comp != NULL &&\n        session->local.comp->compress &&\n        ((session->state & LIBSSH2_STATE_AUTHENTICATED) ||\n         session->local.comp->use_in_auth);\n\n    if(encrypted && compressed) {\n        /* the idea here is that these function must fail if the output gets\n           larger than what fits in the assigned buffer so thus they don't\n           check the input size as we don't know how much it compresses */\n        size_t dest_len = MAX_SSH_PACKET_LEN-5-256;\n        size_t dest2_len = dest_len;\n\n        /* compress directly to the target buffer */\n        rc = session->local.comp->comp(session,\n                                       &p->outbuf[5], &dest_len,\n                                       data, data_len,\n                                       &session->local.comp_abstract);\n        if(rc)\n            return rc;     /* compression failure */\n\n        if(data2 && data2_len) {\n            /* compress directly to the target buffer right after where the\n               previous call put data */\n            dest2_len -= dest_len;\n\n            rc = session->local.comp->comp(session,\n                                           &p->outbuf[5 + dest_len],\n                                           &dest2_len,\n                                           data2, data2_len,\n                                           &session->local.comp_abstract);\n        }\n        else\n            dest2_len = 0;\n        if(rc)\n            return rc;     /* compression failure */\n\n        data_len = dest_len + dest2_len; /* use the combined length */\n    }\n    else {\n        if((data_len + data2_len) >= (MAX_SSH_PACKET_LEN-0x100))\n            /* too large packet, return error for this until we make this\n               function split it up and send multiple SSH packets */\n            return LIBSSH2_ERROR_INVAL;\n\n        /* copy the payload data */\n        memcpy(&p->outbuf[5], data, data_len);\n        if(data2 && data2_len)\n            memcpy(&p->outbuf[5 + data_len], data2, data2_len);\n        data_len += data2_len; /* use the combined length */\n    }\n\n\n    /* RFC4253 says: Note that the length of the concatenation of\n       'packet_length', 'padding_length', 'payload', and 'random padding'\n       MUST be a multiple of the cipher block size or 8, whichever is\n       larger. */\n\n    /* Plain math: (4 + 1 + packet_length + padding_length) % blocksize == 0 */\n\n    packet_length = data_len + 1 + 4;   /* 1 is for padding_length field\n                                           4 for the packet_length field */\n\n    /* at this point we have it all except the padding */\n\n    /* first figure out our minimum padding amount to make it an even\n       block size */\n    padding_length = blocksize - (packet_length % blocksize);\n\n    /* if the padding becomes too small we add another blocksize worth\n       of it (taken from the original libssh2 where it didn't have any\n       real explanation) */\n    if(padding_length < 4) {\n        padding_length += blocksize;\n    }\n#ifdef RANDOM_PADDING\n    /* FIXME: we can add padding here, but that also makes the packets\n       bigger etc */\n\n    /* now we can add 'blocksize' to the padding_length N number of times\n       (to \"help thwart traffic analysis\") but it must be less than 255 in\n       total */\n    rand_max = (255 - padding_length) / blocksize + 1;\n    padding_length += blocksize * (seed % rand_max);\n#endif\n\n    packet_length += padding_length;\n\n    /* append the MAC length to the total_length size */\n    total_length =\n        packet_length + (encrypted ? session->local.mac->mac_len : 0);\n\n    /* store packet_length, which is the size of the whole packet except\n       the MAC and the packet_length field itself */\n    _libssh2_htonu32(p->outbuf, packet_length - 4);\n    /* store padding_length */\n    p->outbuf[4] = (unsigned char)padding_length;\n\n    /* fill the padding area with random junk */\n    _libssh2_random(p->outbuf + 5 + data_len, padding_length);\n\n    if(encrypted) {\n        size_t i;\n\n        /* Calculate MAC hash. Put the output at index packet_length,\n           since that size includes the whole packet. The MAC is\n           calculated on the entire unencrypted packet, including all\n           fields except the MAC field itself. */\n        session->local.mac->hash(session, p->outbuf + packet_length,\n                                 session->local.seqno, p->outbuf,\n                                 packet_length, NULL, 0,\n                                 &session->local.mac_abstract);\n\n        /* Encrypt the whole packet data, one block size at a time.\n           The MAC field is not encrypted. */\n        for(i = 0; i < packet_length; i += session->local.crypt->blocksize) {\n            unsigned char *ptr = &p->outbuf[i];\n            if(session->local.crypt->crypt(session, ptr,\n                                            session->local.crypt->blocksize,\n                                            &session->local.crypt_abstract))\n                return LIBSSH2_ERROR_ENCRYPT;     /* encryption failure */\n        }\n    }\n\n    session->local.seqno++;\n\n    ret = LIBSSH2_SEND(session, p->outbuf, total_length,\n                        LIBSSH2_SOCKET_SEND_FLAGS(session));\n    if(ret < 0)\n        _libssh2_debug(session, LIBSSH2_TRACE_SOCKET,\n                       \"Error sending %d bytes: %d\", total_length, -ret);\n    else {\n        _libssh2_debug(session, LIBSSH2_TRACE_SOCKET, \"Sent %d/%d bytes at %p\",\n                       ret, total_length, p->outbuf);\n        debugdump(session, \"libssh2_transport_write send()\", p->outbuf, ret);\n    }\n\n    if(ret != total_length) {\n        if(ret >= 0 || ret == -EAGAIN) {\n            /* the whole packet could not be sent, save the rest */\n            session->socket_block_directions |= LIBSSH2_SESSION_BLOCK_OUTBOUND;\n            p->odata = orgdata;\n            p->olen = orgdata_len;\n            p->osent = ret <= 0 ? 0 : ret;\n            p->ototal_num = total_length;\n            return LIBSSH2_ERROR_EAGAIN;\n        }\n        return LIBSSH2_ERROR_SOCKET_SEND;\n    }\n\n    /* the whole thing got sent away */\n    p->odata = NULL;\n    p->olen = 0;\n\n    return LIBSSH2_ERROR_NONE;         /* all is good */\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/transport.h",
    "content": "#ifndef __LIBSSH2_TRANSPORT_H\n#define __LIBSSH2_TRANSPORT_H\n\n/* Copyright (C) 2007 The Written Word, Inc.  All rights reserved.\n * Copyright (C) 2009-2010 by Daniel Stenberg\n * Author: Daniel Stenberg <daniel@haxx.se>\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file handles reading and writing to the SECSH transport layer. RFC4253.\n */\n\n#include \"libssh2_priv.h\"\n#include \"packet.h\"\n\n\n/*\n * libssh2_transport_send\n *\n * Send a packet, encrypting it and adding a MAC code if necessary\n * Returns 0 on success, non-zero on failure.\n *\n * The data is provided as _two_ data areas that are combined by this\n * function.  The 'data' part is sent immediately before 'data2'. 'data2' can\n * be set to NULL (or data2_len to 0) to only use a single part.\n *\n * Returns LIBSSH2_ERROR_EAGAIN if it would block or if the whole packet was\n * not sent yet. If it does so, the caller should call this function again as\n * soon as it is likely that more data can be sent, and this function MUST\n * then be called with the same argument set (same data pointer and same\n * data_len) until ERROR_NONE or failure is returned.\n *\n * This function DOES NOT call _libssh2_error() on any errors.\n */\nint _libssh2_transport_send(LIBSSH2_SESSION *session,\n                            const unsigned char *data, size_t data_len,\n                            const unsigned char *data2, size_t data2_len);\n\n/*\n * _libssh2_transport_read\n *\n * Collect a packet into the input brigade block only controls whether or not\n * to wait for a packet to start.\n *\n * Returns packet type added to input brigade (PACKET_NONE if nothing added),\n * or PACKET_FAIL on failure and PACKET_EAGAIN if it couldn't process a full\n * packet.\n */\n\n/*\n * This function reads the binary stream as specified in chapter 6 of RFC4253\n * \"The Secure Shell (SSH) Transport Layer Protocol\"\n */\nint _libssh2_transport_read(LIBSSH2_SESSION * session);\n\n#endif /* __LIBSSH2_TRANSPORT_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/userauth.c",
    "content": "/* Copyright (c) 2004-2007, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2005 Mikhail Gusarov <dottedmag@dottedmag.net>\n * Copyright (c) 2009-2014 by Daniel Stenberg\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\n#include <ctype.h>\n#include <stdio.h>\n\n#include <assert.h>\n\n/* Needed for struct iovec on some platforms */\n#ifdef HAVE_SYS_UIO_H\n#include <sys/uio.h>\n#endif\n\n#include \"transport.h\"\n#include \"session.h\"\n#include \"userauth.h\"\n\n/* libssh2_userauth_list\n *\n * List authentication methods\n * Will yield successful login if \"none\" happens to be allowable for this user\n * Not a common configuration for any SSH server though\n * username should be NULL, or a null terminated string\n */\nstatic char *userauth_list(LIBSSH2_SESSION *session, const char *username,\n                           unsigned int username_len)\n{\n    static const unsigned char reply_codes[3] =\n        { SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE, 0 };\n    /* packet_type(1) + username_len(4) + service_len(4) +\n       service(14)\"ssh-connection\" + method_len(4) = 27 */\n    unsigned long methods_len;\n    unsigned char *s;\n    int rc;\n\n    if(session->userauth_list_state == libssh2_NB_state_idle) {\n        /* Zero the whole thing out */\n        memset(&session->userauth_list_packet_requirev_state, 0,\n               sizeof(session->userauth_list_packet_requirev_state));\n\n        session->userauth_list_data_len = username_len + 27;\n\n        s = session->userauth_list_data =\n            LIBSSH2_ALLOC(session, session->userauth_list_data_len);\n        if(!session->userauth_list_data) {\n            _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                           \"Unable to allocate memory for userauth_list\");\n            return NULL;\n        }\n\n        *(s++) = SSH_MSG_USERAUTH_REQUEST;\n        _libssh2_store_str(&s, username, username_len);\n        _libssh2_store_str(&s, \"ssh-connection\", 14);\n        _libssh2_store_u32(&s, 4); /* send \"none\" separately */\n\n        session->userauth_list_state = libssh2_NB_state_created;\n    }\n\n    if(session->userauth_list_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, session->userauth_list_data,\n                                     session->userauth_list_data_len,\n                                     (unsigned char *)\"none\", 4);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block requesting userauth list\");\n            return NULL;\n        }\n        /* now free the packet that was sent */\n        LIBSSH2_FREE(session, session->userauth_list_data);\n        session->userauth_list_data = NULL;\n\n        if(rc) {\n            _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                           \"Unable to send userauth-none request\");\n            session->userauth_list_state = libssh2_NB_state_idle;\n            return NULL;\n        }\n\n        session->userauth_list_state = libssh2_NB_state_sent;\n    }\n\n    if(session->userauth_list_state == libssh2_NB_state_sent) {\n        rc = _libssh2_packet_requirev(session, reply_codes,\n                                      &session->userauth_list_data,\n                                      &session->userauth_list_data_len, 0,\n                                      NULL, 0,\n                               &session->userauth_list_packet_requirev_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                           \"Would block requesting userauth list\");\n            return NULL;\n        }\n        else if(rc || (session->userauth_list_data_len < 1)) {\n            _libssh2_error(session, rc, \"Failed getting response\");\n            session->userauth_list_state = libssh2_NB_state_idle;\n            return NULL;\n        }\n\n        if(session->userauth_list_data[0] == SSH_MSG_USERAUTH_SUCCESS) {\n            /* Wow, who'dve thought... */\n            _libssh2_error(session, LIBSSH2_ERROR_NONE, \"No error\");\n            LIBSSH2_FREE(session, session->userauth_list_data);\n            session->userauth_list_data = NULL;\n            session->state |= LIBSSH2_STATE_AUTHENTICATED;\n            session->userauth_list_state = libssh2_NB_state_idle;\n            return NULL;\n        }\n\n        if(session->userauth_list_data_len < 5) {\n            LIBSSH2_FREE(session, session->userauth_list_data);\n            session->userauth_list_data = NULL;\n            _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                           \"Unexpected packet size\");\n            return NULL;\n        }\n\n        methods_len = _libssh2_ntohu32(session->userauth_list_data + 1);\n        if(methods_len >= session->userauth_list_data_len - 5) {\n            _libssh2_error(session, LIBSSH2_ERROR_OUT_OF_BOUNDARY,\n                           \"Unexpected userauth list size\");\n            return NULL;\n        }\n\n        /* Do note that the memory areas overlap! */\n        memmove(session->userauth_list_data, session->userauth_list_data + 5,\n                methods_len);\n        session->userauth_list_data[methods_len] = '\\0';\n        _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                       \"Permitted auth methods: %s\",\n                       session->userauth_list_data);\n    }\n\n    session->userauth_list_state = libssh2_NB_state_idle;\n    return (char *) session->userauth_list_data;\n}\n\n/* libssh2_userauth_list\n *\n * List authentication methods\n * Will yield successful login if \"none\" happens to be allowable for this user\n * Not a common configuration for any SSH server though\n * username should be NULL, or a null terminated string\n */\nLIBSSH2_API char *\nlibssh2_userauth_list(LIBSSH2_SESSION * session, const char *user,\n                      unsigned int user_len)\n{\n    char *ptr;\n    BLOCK_ADJUST_ERRNO(ptr, session,\n                       userauth_list(session, user, user_len));\n    return ptr;\n}\n\n/*\n * libssh2_userauth_authenticated\n *\n * Returns: 0 if not yet authenticated\n *          1 if already authenticated\n */\nLIBSSH2_API int\nlibssh2_userauth_authenticated(LIBSSH2_SESSION * session)\n{\n    return (session->state & LIBSSH2_STATE_AUTHENTICATED)?1:0;\n}\n\n\n\n/* userauth_password\n * Plain ol' login\n */\nstatic int\nuserauth_password(LIBSSH2_SESSION *session,\n                  const char *username, unsigned int username_len,\n                  const unsigned char *password, unsigned int password_len,\n                  LIBSSH2_PASSWD_CHANGEREQ_FUNC((*passwd_change_cb)))\n{\n    unsigned char *s;\n    static const unsigned char reply_codes[4] =\n        { SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE,\n          SSH_MSG_USERAUTH_PASSWD_CHANGEREQ, 0\n        };\n    int rc;\n\n    if(session->userauth_pswd_state == libssh2_NB_state_idle) {\n        /* Zero the whole thing out */\n        memset(&session->userauth_pswd_packet_requirev_state, 0,\n               sizeof(session->userauth_pswd_packet_requirev_state));\n\n        /*\n         * 40 = packet_type(1) + username_len(4) + service_len(4) +\n         * service(14)\"ssh-connection\" + method_len(4) + method(8)\"password\" +\n         * chgpwdbool(1) + password_len(4) */\n        session->userauth_pswd_data_len = username_len + 40;\n\n        session->userauth_pswd_data0 =\n            (unsigned char) ~SSH_MSG_USERAUTH_PASSWD_CHANGEREQ;\n\n        /* TODO: remove this alloc with a fixed buffer in the session\n           struct */\n        s = session->userauth_pswd_data =\n            LIBSSH2_ALLOC(session, session->userauth_pswd_data_len);\n        if(!session->userauth_pswd_data) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"userauth-password request\");\n        }\n\n        *(s++) = SSH_MSG_USERAUTH_REQUEST;\n        _libssh2_store_str(&s, username, username_len);\n        _libssh2_store_str(&s, \"ssh-connection\", sizeof(\"ssh-connection\") - 1);\n        _libssh2_store_str(&s, \"password\", sizeof(\"password\") - 1);\n        *s++ = '\\0';\n        _libssh2_store_u32(&s, password_len);\n        /* 'password' is sent separately */\n\n        _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                       \"Attempting to login using password authentication\");\n\n        session->userauth_pswd_state = libssh2_NB_state_created;\n    }\n\n    if(session->userauth_pswd_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, session->userauth_pswd_data,\n                                     session->userauth_pswd_data_len,\n                                     password, password_len);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                  \"Would block writing password request\");\n        }\n\n        /* now free the sent packet */\n        LIBSSH2_FREE(session, session->userauth_pswd_data);\n        session->userauth_pswd_data = NULL;\n\n        if(rc) {\n            session->userauth_pswd_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send userauth-password request\");\n        }\n\n        session->userauth_pswd_state = libssh2_NB_state_sent;\n    }\n\n  password_response:\n\n    if((session->userauth_pswd_state == libssh2_NB_state_sent)\n        || (session->userauth_pswd_state == libssh2_NB_state_sent1)\n        || (session->userauth_pswd_state == libssh2_NB_state_sent2)) {\n        if(session->userauth_pswd_state == libssh2_NB_state_sent) {\n            rc = _libssh2_packet_requirev(session, reply_codes,\n                                          &session->userauth_pswd_data,\n                                          &session->userauth_pswd_data_len,\n                                          0, NULL, 0,\n                                          &session->\n                                          userauth_pswd_packet_requirev_state);\n\n            if(rc) {\n                if(rc != LIBSSH2_ERROR_EAGAIN)\n                    session->userauth_pswd_state = libssh2_NB_state_idle;\n\n                return _libssh2_error(session, rc,\n                                      \"Waiting for password response\");\n            }\n            else if(session->userauth_pswd_data_len < 1) {\n                session->userauth_pswd_state = libssh2_NB_state_idle;\n                return _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                      \"Unexpected packet size\");\n            }\n\n            if(session->userauth_pswd_data[0] == SSH_MSG_USERAUTH_SUCCESS) {\n                _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                               \"Password authentication successful\");\n                LIBSSH2_FREE(session, session->userauth_pswd_data);\n                session->userauth_pswd_data = NULL;\n                session->state |= LIBSSH2_STATE_AUTHENTICATED;\n                session->userauth_pswd_state = libssh2_NB_state_idle;\n                return 0;\n            }\n            else if(session->userauth_pswd_data[0] ==\n                    SSH_MSG_USERAUTH_FAILURE) {\n                _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                               \"Password authentication failed\");\n                LIBSSH2_FREE(session, session->userauth_pswd_data);\n                session->userauth_pswd_data = NULL;\n                session->userauth_pswd_state = libssh2_NB_state_idle;\n                return _libssh2_error(session,\n                                      LIBSSH2_ERROR_AUTHENTICATION_FAILED,\n                                      \"Authentication failed \"\n                                      \"(username/password)\");\n            }\n\n            session->userauth_pswd_newpw = NULL;\n            session->userauth_pswd_newpw_len = 0;\n\n            session->userauth_pswd_state = libssh2_NB_state_sent1;\n        }\n\n        if(session->userauth_pswd_data_len < 1) {\n            session->userauth_pswd_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_PROTO,\n                                  \"Unexpected packet size\");\n        }\n\n        if((session->userauth_pswd_data[0] ==\n             SSH_MSG_USERAUTH_PASSWD_CHANGEREQ)\n            || (session->userauth_pswd_data0 ==\n                SSH_MSG_USERAUTH_PASSWD_CHANGEREQ)) {\n            session->userauth_pswd_data0 = SSH_MSG_USERAUTH_PASSWD_CHANGEREQ;\n\n            if((session->userauth_pswd_state == libssh2_NB_state_sent1) ||\n                (session->userauth_pswd_state == libssh2_NB_state_sent2)) {\n                if(session->userauth_pswd_state == libssh2_NB_state_sent1) {\n                    _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                                   \"Password change required\");\n                    LIBSSH2_FREE(session, session->userauth_pswd_data);\n                    session->userauth_pswd_data = NULL;\n                }\n                if(passwd_change_cb) {\n                    if(session->userauth_pswd_state ==\n                       libssh2_NB_state_sent1) {\n                        passwd_change_cb(session,\n                                         &session->userauth_pswd_newpw,\n                                         &session->userauth_pswd_newpw_len,\n                                         &session->abstract);\n                        if(!session->userauth_pswd_newpw) {\n                            return _libssh2_error(session,\n                                                LIBSSH2_ERROR_PASSWORD_EXPIRED,\n                                                  \"Password expired, and \"\n                                                  \"callback failed\");\n                        }\n\n                        /* basic data_len + newpw_len(4) */\n                        if(username_len + password_len + 44 <= UINT_MAX) {\n                            session->userauth_pswd_data_len =\n                                username_len + password_len + 44;\n                            s = session->userauth_pswd_data =\n                                LIBSSH2_ALLOC(session,\n                                              session->userauth_pswd_data_len);\n                        }\n                        else {\n                            s = session->userauth_pswd_data = NULL;\n                            session->userauth_pswd_data_len = 0;\n                        }\n\n                        if(!session->userauth_pswd_data) {\n                            LIBSSH2_FREE(session,\n                                         session->userauth_pswd_newpw);\n                            session->userauth_pswd_newpw = NULL;\n                            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                                  \"Unable to allocate memory \"\n                                                  \"for userauth password \"\n                                                  \"change request\");\n                        }\n\n                        *(s++) = SSH_MSG_USERAUTH_REQUEST;\n                        _libssh2_store_str(&s, username, username_len);\n                        _libssh2_store_str(&s, \"ssh-connection\",\n                                           sizeof(\"ssh-connection\") - 1);\n                        _libssh2_store_str(&s, \"password\",\n                                           sizeof(\"password\") - 1);\n                        *s++ = 0x01;\n                        _libssh2_store_str(&s, (char *)password, password_len);\n                        _libssh2_store_u32(&s,\n                                           session->userauth_pswd_newpw_len);\n                        /* send session->userauth_pswd_newpw separately */\n\n                        session->userauth_pswd_state = libssh2_NB_state_sent2;\n                    }\n\n                    if(session->userauth_pswd_state ==\n                       libssh2_NB_state_sent2) {\n                        rc = _libssh2_transport_send(session,\n                                            session->userauth_pswd_data,\n                                            session->userauth_pswd_data_len,\n                                            (unsigned char *)\n                                            session->userauth_pswd_newpw,\n                                            session->userauth_pswd_newpw_len);\n                        if(rc == LIBSSH2_ERROR_EAGAIN) {\n                            return _libssh2_error(session,\n                                                  LIBSSH2_ERROR_EAGAIN,\n                                                  \"Would block waiting\");\n                        }\n\n                        /* free the allocated packets again */\n                        LIBSSH2_FREE(session, session->userauth_pswd_data);\n                        session->userauth_pswd_data = NULL;\n                        LIBSSH2_FREE(session, session->userauth_pswd_newpw);\n                        session->userauth_pswd_newpw = NULL;\n\n                        if(rc) {\n                            return _libssh2_error(session,\n                                                  LIBSSH2_ERROR_SOCKET_SEND,\n                                                  \"Unable to send userauth \"\n                                                  \"password-change request\");\n                        }\n\n                        /*\n                         * Ugliest use of goto ever.  Blame it on the\n                         * askN => requirev migration.\n                         */\n                        session->userauth_pswd_state = libssh2_NB_state_sent;\n                        goto password_response;\n                    }\n                }\n            }\n            else {\n                session->userauth_pswd_state = libssh2_NB_state_idle;\n                return _libssh2_error(session, LIBSSH2_ERROR_PASSWORD_EXPIRED,\n                                      \"Password Expired, and no callback \"\n                                      \"specified\");\n            }\n        }\n    }\n\n    /* FAILURE */\n    LIBSSH2_FREE(session, session->userauth_pswd_data);\n    session->userauth_pswd_data = NULL;\n    session->userauth_pswd_state = libssh2_NB_state_idle;\n\n    return _libssh2_error(session, LIBSSH2_ERROR_AUTHENTICATION_FAILED,\n                          \"Authentication failed\");\n}\n\n/*\n * libssh2_userauth_password_ex\n *\n * Plain ol' login\n */\n\nLIBSSH2_API int\nlibssh2_userauth_password_ex(LIBSSH2_SESSION *session, const char *username,\n                             unsigned int username_len, const char *password,\n                             unsigned int password_len,\n                             LIBSSH2_PASSWD_CHANGEREQ_FUNC\n                             ((*passwd_change_cb)))\n{\n    int rc;\n    BLOCK_ADJUST(rc, session,\n                 userauth_password(session, username, username_len,\n                                   (unsigned char *)password, password_len,\n                                   passwd_change_cb));\n    return rc;\n}\n\nstatic int\nmemory_read_publickey(LIBSSH2_SESSION * session, unsigned char **method,\n                      size_t *method_len,\n                      unsigned char **pubkeydata,\n                      size_t *pubkeydata_len,\n                      const char *pubkeyfiledata,\n                      size_t pubkeyfiledata_len)\n{\n    unsigned char *pubkey = NULL, *sp1, *sp2, *tmp;\n    size_t pubkey_len = pubkeyfiledata_len;\n    unsigned int tmp_len;\n\n    if(pubkeyfiledata_len <= 1) {\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Invalid data in public key file\");\n    }\n\n    pubkey = LIBSSH2_ALLOC(session, pubkeyfiledata_len);\n    if(!pubkey) {\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Unable to allocate memory for public key data\");\n    }\n\n    memcpy(pubkey, pubkeyfiledata, pubkeyfiledata_len);\n\n    /*\n     *   Remove trailing whitespace\n     */\n    while(pubkey_len && isspace(pubkey[pubkey_len - 1]))\n        pubkey_len--;\n\n    if(!pubkey_len) {\n        LIBSSH2_FREE(session, pubkey);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Missing public key data\");\n    }\n\n    sp1 = memchr(pubkey, ' ', pubkey_len);\n    if(sp1 == NULL) {\n        LIBSSH2_FREE(session, pubkey);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Invalid public key data\");\n    }\n\n    sp1++;\n\n    sp2 = memchr(sp1, ' ', pubkey_len - (sp1 - pubkey));\n    if(sp2 == NULL) {\n        /* Assume that the id string is missing, but that it's okay */\n        sp2 = pubkey + pubkey_len;\n    }\n\n    if(libssh2_base64_decode(session, (char **) &tmp, &tmp_len,\n                              (char *) sp1, sp2 - sp1)) {\n        LIBSSH2_FREE(session, pubkey);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                                  \"Invalid key data, not base64 encoded\");\n    }\n\n    /* Wasting some bytes here (okay, more than some), but since it's likely\n     * to be freed soon anyway, we'll just avoid the extra free/alloc and call\n     * it a wash\n     */\n    *method = pubkey;\n    *method_len = sp1 - pubkey - 1;\n\n    *pubkeydata = tmp;\n    *pubkeydata_len = tmp_len;\n\n    return 0;\n}\n\n/*\n * file_read_publickey\n *\n * Read a public key from an id_???.pub style file\n *\n * Returns an allocated string containing the decoded key in *pubkeydata\n * on success.\n * Returns an allocated string containing the key method (e.g. \"ssh-dss\")\n * in method on success.\n */\nstatic int\nfile_read_publickey(LIBSSH2_SESSION * session, unsigned char **method,\n                    size_t *method_len,\n                    unsigned char **pubkeydata,\n                    size_t *pubkeydata_len,\n                    const char *pubkeyfile)\n{\n    FILE *fd;\n    char c;\n    unsigned char *pubkey = NULL, *sp1, *sp2, *tmp;\n    size_t pubkey_len = 0, sp_len;\n    unsigned int tmp_len;\n\n    _libssh2_debug(session, LIBSSH2_TRACE_AUTH, \"Loading public key file: %s\",\n                   pubkeyfile);\n    /* Read Public Key */\n    fd = fopen(pubkeyfile, FOPEN_READTEXT);\n    if(!fd) {\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Unable to open public key file\");\n    }\n    while(!feof(fd) && 1 == fread(&c, 1, 1, fd) && c != '\\r' && c != '\\n') {\n        pubkey_len++;\n    }\n    rewind(fd);\n\n    if(pubkey_len <= 1) {\n        fclose(fd);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Invalid data in public key file\");\n    }\n\n    pubkey = LIBSSH2_ALLOC(session, pubkey_len);\n    if(!pubkey) {\n        fclose(fd);\n        return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                              \"Unable to allocate memory for public key data\");\n    }\n    if(fread(pubkey, 1, pubkey_len, fd) != pubkey_len) {\n        LIBSSH2_FREE(session, pubkey);\n        fclose(fd);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Unable to read public key from file\");\n    }\n    fclose(fd);\n    /*\n     * Remove trailing whitespace\n     */\n    while(pubkey_len && isspace(pubkey[pubkey_len - 1])) {\n        pubkey_len--;\n    }\n\n    if(!pubkey_len) {\n        LIBSSH2_FREE(session, pubkey);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Missing public key data\");\n    }\n\n    sp1 = memchr(pubkey, ' ', pubkey_len);\n    if(sp1 == NULL) {\n        LIBSSH2_FREE(session, pubkey);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Invalid public key data\");\n    }\n\n    sp1++;\n\n    sp_len = sp1 > pubkey ? (sp1 - pubkey) - 1 : 0;\n    sp2 = memchr(sp1, ' ', pubkey_len - sp_len);\n    if(sp2 == NULL) {\n        /* Assume that the id string is missing, but that it's okay */\n        sp2 = pubkey + pubkey_len;\n    }\n\n    if(libssh2_base64_decode(session, (char **) &tmp, &tmp_len,\n                              (char *) sp1, sp2 - sp1)) {\n        LIBSSH2_FREE(session, pubkey);\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Invalid key data, not base64 encoded\");\n    }\n\n    /* Wasting some bytes here (okay, more than some), but since it's likely\n     * to be freed soon anyway, we'll just avoid the extra free/alloc and call\n     * it a wash */\n    *method = pubkey;\n    *method_len = sp1 - pubkey - 1;\n\n    *pubkeydata = tmp;\n    *pubkeydata_len = tmp_len;\n\n    return 0;\n}\n\nstatic int\nmemory_read_privatekey(LIBSSH2_SESSION * session,\n                       const LIBSSH2_HOSTKEY_METHOD ** hostkey_method,\n                       void **hostkey_abstract,\n                       const unsigned char *method, int method_len,\n                       const char *privkeyfiledata, size_t privkeyfiledata_len,\n                       const char *passphrase)\n{\n    const LIBSSH2_HOSTKEY_METHOD **hostkey_methods_avail =\n        libssh2_hostkey_methods();\n\n    *hostkey_method = NULL;\n    *hostkey_abstract = NULL;\n    while(*hostkey_methods_avail && (*hostkey_methods_avail)->name) {\n        if((*hostkey_methods_avail)->initPEMFromMemory\n             && strncmp((*hostkey_methods_avail)->name, (const char *) method,\n                        method_len) == 0) {\n            *hostkey_method = *hostkey_methods_avail;\n            break;\n        }\n        hostkey_methods_avail++;\n    }\n    if(!*hostkey_method) {\n        return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NONE,\n                              \"No handler for specified private key\");\n    }\n\n    if((*hostkey_method)->\n        initPEMFromMemory(session, privkeyfiledata, privkeyfiledata_len,\n                          (unsigned char *) passphrase,\n                          hostkey_abstract)) {\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Unable to initialize private key from file\");\n    }\n\n    return 0;\n}\n\n/* libssh2_file_read_privatekey\n * Read a PEM encoded private key from an id_??? style file\n */\nstatic int\nfile_read_privatekey(LIBSSH2_SESSION * session,\n                     const LIBSSH2_HOSTKEY_METHOD ** hostkey_method,\n                     void **hostkey_abstract,\n                     const unsigned char *method, int method_len,\n                     const char *privkeyfile, const char *passphrase)\n{\n    const LIBSSH2_HOSTKEY_METHOD **hostkey_methods_avail =\n        libssh2_hostkey_methods();\n\n    _libssh2_debug(session, LIBSSH2_TRACE_AUTH, \"Loading private key file: %s\",\n                   privkeyfile);\n    *hostkey_method = NULL;\n    *hostkey_abstract = NULL;\n    while(*hostkey_methods_avail && (*hostkey_methods_avail)->name) {\n        if((*hostkey_methods_avail)->initPEM\n            && strncmp((*hostkey_methods_avail)->name, (const char *) method,\n                       method_len) == 0) {\n            *hostkey_method = *hostkey_methods_avail;\n            break;\n        }\n        hostkey_methods_avail++;\n    }\n    if(!*hostkey_method) {\n        return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NONE,\n                              \"No handler for specified private key\");\n    }\n\n    if((*hostkey_method)->\n        initPEM(session, privkeyfile, (unsigned char *) passphrase,\n                hostkey_abstract)) {\n        return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                              \"Unable to initialize private key from file\");\n    }\n\n    return 0;\n}\n\nstruct privkey_file {\n    const char *filename;\n    const char *passphrase;\n};\n\nstatic int\nsign_frommemory(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len,\n                const unsigned char *data, size_t data_len, void **abstract)\n{\n    struct privkey_file *pk_file = (struct privkey_file *) (*abstract);\n    const LIBSSH2_HOSTKEY_METHOD *privkeyobj;\n    void *hostkey_abstract;\n    struct iovec datavec;\n    int rc;\n\n    rc = memory_read_privatekey(session, &privkeyobj, &hostkey_abstract,\n                                session->userauth_pblc_method,\n                                session->userauth_pblc_method_len,\n                                pk_file->filename,\n                                strlen(pk_file->filename),\n                                pk_file->passphrase);\n    if(rc)\n        return rc;\n\n    libssh2_prepare_iovec(&datavec, 1);\n    datavec.iov_base = (void *)data;\n    datavec.iov_len  = data_len;\n\n    if(privkeyobj->signv(session, sig, sig_len, 1, &datavec,\n                          &hostkey_abstract)) {\n        if(privkeyobj->dtor) {\n            privkeyobj->dtor(session, &hostkey_abstract);\n        }\n        return -1;\n    }\n\n    if(privkeyobj->dtor) {\n        privkeyobj->dtor(session, &hostkey_abstract);\n    }\n    return 0;\n}\n\nstatic int\nsign_fromfile(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len,\n              const unsigned char *data, size_t data_len, void **abstract)\n{\n    struct privkey_file *privkey_file = (struct privkey_file *) (*abstract);\n    const LIBSSH2_HOSTKEY_METHOD *privkeyobj;\n    void *hostkey_abstract;\n    struct iovec datavec;\n    int rc;\n\n    rc = file_read_privatekey(session, &privkeyobj, &hostkey_abstract,\n                              session->userauth_pblc_method,\n                              session->userauth_pblc_method_len,\n                              privkey_file->filename,\n                              privkey_file->passphrase);\n    if(rc)\n        return rc;\n\n    libssh2_prepare_iovec(&datavec, 1);\n    datavec.iov_base = (void *)data;\n    datavec.iov_len  = data_len;\n\n    if(privkeyobj->signv(session, sig, sig_len, 1, &datavec,\n                          &hostkey_abstract)) {\n        if(privkeyobj->dtor) {\n            privkeyobj->dtor(session, &hostkey_abstract);\n        }\n        return -1;\n    }\n\n    if(privkeyobj->dtor) {\n        privkeyobj->dtor(session, &hostkey_abstract);\n    }\n    return 0;\n}\n\n\n\n/* userauth_hostbased_fromfile\n * Authenticate using a keypair found in the named files\n */\nstatic int\nuserauth_hostbased_fromfile(LIBSSH2_SESSION *session,\n                            const char *username, size_t username_len,\n                            const char *publickey, const char *privatekey,\n                            const char *passphrase, const char *hostname,\n                            size_t hostname_len,\n                            const char *local_username,\n                            size_t local_username_len)\n{\n    int rc;\n\n#if !LIBSSH2_RSA\n    return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                          \"RSA is not supported by crypto backend\");\n#endif\n\n    if(session->userauth_host_state == libssh2_NB_state_idle) {\n        const LIBSSH2_HOSTKEY_METHOD *privkeyobj;\n        unsigned char *pubkeydata = NULL;\n        unsigned char *sig = NULL;\n        size_t pubkeydata_len = 0;\n        size_t sig_len = 0;\n        void *abstract;\n        unsigned char buf[5];\n        struct iovec datavec[4];\n\n        /* Zero the whole thing out */\n        memset(&session->userauth_host_packet_requirev_state, 0,\n               sizeof(session->userauth_host_packet_requirev_state));\n\n        if(publickey) {\n            rc = file_read_publickey(session, &session->userauth_host_method,\n                                     &session->userauth_host_method_len,\n                                     &pubkeydata, &pubkeydata_len, publickey);\n            if(rc)\n                /* Note: file_read_publickey() calls _libssh2_error() */\n                return rc;\n        }\n        else {\n            /* Compute public key from private key. */\n            rc = _libssh2_pub_priv_keyfile(session,\n                                           &session->userauth_host_method,\n                                           &session->userauth_host_method_len,\n                                           &pubkeydata, &pubkeydata_len,\n                                           privatekey, passphrase);\n            if(rc)\n                /* libssh2_pub_priv_keyfile calls _libssh2_error() */\n                return rc;\n        }\n\n        /*\n         * 52 = packet_type(1) + username_len(4) + servicename_len(4) +\n         * service_name(14)\"ssh-connection\" + authmethod_len(4) +\n         * authmethod(9)\"hostbased\" + method_len(4) + pubkeydata_len(4) +\n         * hostname_len(4) + local_username_len(4)\n         */\n        session->userauth_host_packet_len =\n            username_len + session->userauth_host_method_len + hostname_len +\n            local_username_len + pubkeydata_len + 52;\n\n        /*\n         * Preallocate space for an overall length,  method name again,\n         * and the signature, which won't be any larger than the size of\n         * the publickeydata itself\n         */\n        session->userauth_host_s = session->userauth_host_packet =\n            LIBSSH2_ALLOC(session,\n                          session->userauth_host_packet_len + 4 +\n                          (4 + session->userauth_host_method_len) +\n                          (4 + pubkeydata_len));\n        if(!session->userauth_host_packet) {\n            LIBSSH2_FREE(session, session->userauth_host_method);\n            session->userauth_host_method = NULL;\n            LIBSSH2_FREE(session, pubkeydata);\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Out of memory\");\n        }\n\n        *(session->userauth_host_s++) = SSH_MSG_USERAUTH_REQUEST;\n        _libssh2_store_str(&session->userauth_host_s, username, username_len);\n        _libssh2_store_str(&session->userauth_host_s, \"ssh-connection\", 14);\n        _libssh2_store_str(&session->userauth_host_s, \"hostbased\", 9);\n        _libssh2_store_str(&session->userauth_host_s,\n                           (const char *)session->userauth_host_method,\n                           session->userauth_host_method_len);\n        _libssh2_store_str(&session->userauth_host_s, (const char *)pubkeydata,\n                           pubkeydata_len);\n        LIBSSH2_FREE(session, pubkeydata);\n        _libssh2_store_str(&session->userauth_host_s, hostname, hostname_len);\n        _libssh2_store_str(&session->userauth_host_s, local_username,\n                           local_username_len);\n\n        rc = file_read_privatekey(session, &privkeyobj, &abstract,\n                                  session->userauth_host_method,\n                                  session->userauth_host_method_len,\n                                  privatekey, passphrase);\n        if(rc) {\n            /* Note: file_read_privatekey() calls _libssh2_error() */\n            LIBSSH2_FREE(session, session->userauth_host_method);\n            session->userauth_host_method = NULL;\n            LIBSSH2_FREE(session, session->userauth_host_packet);\n            session->userauth_host_packet = NULL;\n            return rc;\n        }\n\n        _libssh2_htonu32(buf, session->session_id_len);\n        libssh2_prepare_iovec(datavec, 4);\n        datavec[0].iov_base = (void *)buf;\n        datavec[0].iov_len = 4;\n        datavec[1].iov_base = (void *)session->session_id;\n        datavec[1].iov_len = session->session_id_len;\n        datavec[2].iov_base = (void *)session->userauth_host_packet;\n        datavec[2].iov_len = session->userauth_host_packet_len;\n\n        if(privkeyobj && privkeyobj->signv &&\n                          privkeyobj->signv(session, &sig, &sig_len, 3,\n                                            datavec, &abstract)) {\n            LIBSSH2_FREE(session, session->userauth_host_method);\n            session->userauth_host_method = NULL;\n            LIBSSH2_FREE(session, session->userauth_host_packet);\n            session->userauth_host_packet = NULL;\n            if(privkeyobj->dtor) {\n                privkeyobj->dtor(session, &abstract);\n            }\n            return -1;\n        }\n\n        if(privkeyobj && privkeyobj->dtor) {\n            privkeyobj->dtor(session, &abstract);\n        }\n\n        if(sig_len > pubkeydata_len) {\n            unsigned char *newpacket;\n            /* Should *NEVER* happen, but...well.. better safe than sorry */\n            newpacket = LIBSSH2_REALLOC(session, session->userauth_host_packet,\n                                        session->userauth_host_packet_len + 4 +\n                                        (4 + session->userauth_host_method_len)\n                                        + (4 + sig_len)); /* PK sigblob */\n            if(!newpacket) {\n                LIBSSH2_FREE(session, sig);\n                LIBSSH2_FREE(session, session->userauth_host_packet);\n                session->userauth_host_packet = NULL;\n                LIBSSH2_FREE(session, session->userauth_host_method);\n                session->userauth_host_method = NULL;\n                return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                      \"Failed allocating additional space for \"\n                                      \"userauth-hostbased packet\");\n            }\n            session->userauth_host_packet = newpacket;\n        }\n\n        session->userauth_host_s =\n            session->userauth_host_packet + session->userauth_host_packet_len;\n\n        _libssh2_store_u32(&session->userauth_host_s,\n                           4 + session->userauth_host_method_len +\n                           4 + sig_len);\n        _libssh2_store_str(&session->userauth_host_s,\n                           (const char *)session->userauth_host_method,\n                           session->userauth_host_method_len);\n        LIBSSH2_FREE(session, session->userauth_host_method);\n        session->userauth_host_method = NULL;\n\n        _libssh2_store_str(&session->userauth_host_s, (const char *)sig,\n                           sig_len);\n        LIBSSH2_FREE(session, sig);\n\n        _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                       \"Attempting hostbased authentication\");\n\n        session->userauth_host_state = libssh2_NB_state_created;\n    }\n\n    if(session->userauth_host_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, session->userauth_host_packet,\n                                     session->userauth_host_s -\n                                     session->userauth_host_packet,\n                                     NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                  \"Would block\");\n        }\n        else if(rc) {\n            LIBSSH2_FREE(session, session->userauth_host_packet);\n            session->userauth_host_packet = NULL;\n            session->userauth_host_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send userauth-hostbased request\");\n        }\n        LIBSSH2_FREE(session, session->userauth_host_packet);\n        session->userauth_host_packet = NULL;\n\n        session->userauth_host_state = libssh2_NB_state_sent;\n    }\n\n    if(session->userauth_host_state == libssh2_NB_state_sent) {\n        static const unsigned char reply_codes[3] =\n            { SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE, 0 };\n        size_t data_len;\n        rc = _libssh2_packet_requirev(session, reply_codes,\n                                      &session->userauth_host_data,\n                                      &data_len, 0, NULL, 0,\n                                      &session->\n                                      userauth_host_packet_requirev_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                  \"Would block\");\n        }\n\n        session->userauth_host_state = libssh2_NB_state_idle;\n        if(rc || data_len < 1) {\n            return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                                  \"Auth failed\");\n        }\n\n        if(session->userauth_host_data[0] == SSH_MSG_USERAUTH_SUCCESS) {\n            _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                           \"Hostbased authentication successful\");\n            /* We are us and we've proved it. */\n            LIBSSH2_FREE(session, session->userauth_host_data);\n            session->userauth_host_data = NULL;\n            session->state |= LIBSSH2_STATE_AUTHENTICATED;\n            return 0;\n        }\n    }\n\n    /* This public key is not allowed for this user on this server */\n    LIBSSH2_FREE(session, session->userauth_host_data);\n    session->userauth_host_data = NULL;\n    return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                          \"Invalid signature for supplied public key, or bad \"\n                          \"username/public key combination\");\n}\n\n/* libssh2_userauth_hostbased_fromfile_ex\n * Authenticate using a keypair found in the named files\n */\nLIBSSH2_API int\nlibssh2_userauth_hostbased_fromfile_ex(LIBSSH2_SESSION *session,\n                                       const char *user,\n                                       unsigned int user_len,\n                                       const char *publickey,\n                                       const char *privatekey,\n                                       const char *passphrase,\n                                       const char *host,\n                                       unsigned int host_len,\n                                       const char *localuser,\n                                       unsigned int localuser_len)\n{\n    int rc;\n    BLOCK_ADJUST(rc, session,\n                 userauth_hostbased_fromfile(session, user, user_len,\n                                             publickey, privatekey,\n                                             passphrase, host, host_len,\n                                             localuser, localuser_len));\n    return rc;\n}\n\n\n\nint\n_libssh2_userauth_publickey(LIBSSH2_SESSION *session,\n                            const char *username,\n                            unsigned int username_len,\n                            const unsigned char *pubkeydata,\n                            unsigned long pubkeydata_len,\n                            LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC\n                            ((*sign_callback)),\n                            void *abstract)\n{\n    unsigned char reply_codes[4] =\n        { SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE,\n          SSH_MSG_USERAUTH_PK_OK, 0\n        };\n    int rc;\n    unsigned char *s;\n\n    if(session->userauth_pblc_state == libssh2_NB_state_idle) {\n\n        /*\n         * The call to _libssh2_ntohu32 later relies on pubkeydata having at\n         * least 4 valid bytes containing the length of the method name.\n         */\n        if(pubkeydata_len < 4)\n            return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                                  \"Invalid public key, too short\");\n\n        /* Zero the whole thing out */\n        memset(&session->userauth_pblc_packet_requirev_state, 0,\n               sizeof(session->userauth_pblc_packet_requirev_state));\n\n        /*\n         * As an optimisation, userauth_publickey_fromfile reuses a\n         * previously allocated copy of the method name to avoid an extra\n         * allocation/free.\n         * For other uses, we allocate and populate it here.\n         */\n        if(!session->userauth_pblc_method) {\n            session->userauth_pblc_method_len = _libssh2_ntohu32(pubkeydata);\n\n            if(session->userauth_pblc_method_len > pubkeydata_len - 4)\n                /* the method length simply cannot be longer than the entire\n                   passed in data, so we use this to detect crazy input\n                   data */\n                return _libssh2_error(session,\n                                      LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                                      \"Invalid public key\");\n\n            session->userauth_pblc_method =\n                LIBSSH2_ALLOC(session, session->userauth_pblc_method_len);\n            if(!session->userauth_pblc_method) {\n                return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                      \"Unable to allocate memory \"\n                                      \"for public key data\");\n            }\n            memcpy(session->userauth_pblc_method, pubkeydata + 4,\n                   session->userauth_pblc_method_len);\n        }\n        /*\n         * The length of the method name read from plaintext prefix in the\n         * file must match length embedded in the key.\n         * TODO: The data should match too but we don't check that. Should we?\n         */\n        else if(session->userauth_pblc_method_len !=\n                 _libssh2_ntohu32(pubkeydata))\n            return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                                  \"Invalid public key\");\n\n        /*\n         * 45 = packet_type(1) + username_len(4) + servicename_len(4) +\n         * service_name(14)\"ssh-connection\" + authmethod_len(4) +\n         * authmethod(9)\"publickey\" + sig_included(1)'\\0' + algmethod_len(4) +\n         * publickey_len(4)\n         */\n        session->userauth_pblc_packet_len =\n            username_len + session->userauth_pblc_method_len + pubkeydata_len +\n            45;\n\n        /*\n         * Preallocate space for an overall length, method name again, and the\n         * signature, which won't be any larger than the size of the\n         * publickeydata itself.\n         *\n         * Note that the 'pubkeydata_len' extra bytes allocated here will not\n         * be used in this first send, but will be used in the later one where\n         * this same allocation is re-used.\n         */\n        s = session->userauth_pblc_packet =\n            LIBSSH2_ALLOC(session,\n                          session->userauth_pblc_packet_len + 4 +\n                          (4 + session->userauth_pblc_method_len)\n                          + (4 + pubkeydata_len));\n        if(!session->userauth_pblc_packet) {\n            LIBSSH2_FREE(session, session->userauth_pblc_method);\n            session->userauth_pblc_method = NULL;\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Out of memory\");\n        }\n\n        *s++ = SSH_MSG_USERAUTH_REQUEST;\n        _libssh2_store_str(&s, username, username_len);\n        _libssh2_store_str(&s, \"ssh-connection\", 14);\n        _libssh2_store_str(&s, \"publickey\", 9);\n\n        session->userauth_pblc_b = s;\n        /* Not sending signature with *this* packet */\n        *s++ = 0;\n\n        _libssh2_store_str(&s, (const char *)session->userauth_pblc_method,\n                           session->userauth_pblc_method_len);\n        _libssh2_store_str(&s, (const char *)pubkeydata, pubkeydata_len);\n\n        _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                       \"Attempting publickey authentication\");\n\n        session->userauth_pblc_state = libssh2_NB_state_created;\n    }\n\n    if(session->userauth_pblc_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, session->userauth_pblc_packet,\n                                     session->userauth_pblc_packet_len,\n                                     NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN)\n            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                  \"Would block\");\n        else if(rc) {\n            LIBSSH2_FREE(session, session->userauth_pblc_packet);\n            session->userauth_pblc_packet = NULL;\n            LIBSSH2_FREE(session, session->userauth_pblc_method);\n            session->userauth_pblc_method = NULL;\n            session->userauth_pblc_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send userauth-publickey request\");\n        }\n\n        session->userauth_pblc_state = libssh2_NB_state_sent;\n    }\n\n    if(session->userauth_pblc_state == libssh2_NB_state_sent) {\n        rc = _libssh2_packet_requirev(session, reply_codes,\n                                      &session->userauth_pblc_data,\n                                      &session->userauth_pblc_data_len, 0,\n                                      NULL, 0,\n                                      &session->\n                                      userauth_pblc_packet_requirev_state);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                  \"Would block\");\n        }\n        else if(rc || (session->userauth_pblc_data_len < 1)) {\n            LIBSSH2_FREE(session, session->userauth_pblc_packet);\n            session->userauth_pblc_packet = NULL;\n            LIBSSH2_FREE(session, session->userauth_pblc_method);\n            session->userauth_pblc_method = NULL;\n            session->userauth_pblc_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                                  \"Waiting for USERAUTH response\");\n        }\n\n        if(session->userauth_pblc_data[0] == SSH_MSG_USERAUTH_SUCCESS) {\n            _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                           \"Pubkey authentication prematurely successful\");\n            /*\n             * God help any SSH server that allows an UNVERIFIED\n             * public key to validate the user\n             */\n            LIBSSH2_FREE(session, session->userauth_pblc_data);\n            session->userauth_pblc_data = NULL;\n            LIBSSH2_FREE(session, session->userauth_pblc_packet);\n            session->userauth_pblc_packet = NULL;\n            LIBSSH2_FREE(session, session->userauth_pblc_method);\n            session->userauth_pblc_method = NULL;\n            session->state |= LIBSSH2_STATE_AUTHENTICATED;\n            session->userauth_pblc_state = libssh2_NB_state_idle;\n            return 0;\n        }\n\n        if(session->userauth_pblc_data[0] == SSH_MSG_USERAUTH_FAILURE) {\n            /* This public key is not allowed for this user on this server */\n            LIBSSH2_FREE(session, session->userauth_pblc_data);\n            session->userauth_pblc_data = NULL;\n            LIBSSH2_FREE(session, session->userauth_pblc_packet);\n            session->userauth_pblc_packet = NULL;\n            LIBSSH2_FREE(session, session->userauth_pblc_method);\n            session->userauth_pblc_method = NULL;\n            session->userauth_pblc_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_AUTHENTICATION_FAILED,\n                                  \"Username/PublicKey combination invalid\");\n        }\n\n        /* Semi-Success! */\n        LIBSSH2_FREE(session, session->userauth_pblc_data);\n        session->userauth_pblc_data = NULL;\n\n        *session->userauth_pblc_b = 0x01;\n        session->userauth_pblc_state = libssh2_NB_state_sent1;\n    }\n\n    if(session->userauth_pblc_state == libssh2_NB_state_sent1) {\n        unsigned char *buf;\n        unsigned char *sig;\n        size_t sig_len;\n\n        s = buf = LIBSSH2_ALLOC(session, 4 + session->session_id_len\n                                + session->userauth_pblc_packet_len);\n        if(!buf) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"userauth-publickey signed data\");\n        }\n\n        _libssh2_store_str(&s, (const char *)session->session_id,\n                           session->session_id_len);\n\n        memcpy(s, session->userauth_pblc_packet,\n               session->userauth_pblc_packet_len);\n        s += session->userauth_pblc_packet_len;\n\n        rc = sign_callback(session, &sig, &sig_len, buf, s - buf, abstract);\n        LIBSSH2_FREE(session, buf);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                  \"Would block\");\n        }\n        else if(rc) {\n            LIBSSH2_FREE(session, session->userauth_pblc_method);\n            session->userauth_pblc_method = NULL;\n            LIBSSH2_FREE(session, session->userauth_pblc_packet);\n            session->userauth_pblc_packet = NULL;\n            session->userauth_pblc_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                                  \"Callback returned error\");\n        }\n\n        /*\n         * If this function was restarted, pubkeydata_len might still be 0\n         * which will cause an unnecessary but harmless realloc here.\n         */\n        if(sig_len > pubkeydata_len) {\n            unsigned char *newpacket;\n            /* Should *NEVER* happen, but...well.. better safe than sorry */\n            newpacket = LIBSSH2_REALLOC(session,\n                                        session->userauth_pblc_packet,\n                                        session->userauth_pblc_packet_len + 4 +\n                                        (4 + session->userauth_pblc_method_len)\n                                        + (4 + sig_len)); /* PK sigblob */\n            if(!newpacket) {\n                LIBSSH2_FREE(session, sig);\n                LIBSSH2_FREE(session, session->userauth_pblc_packet);\n                session->userauth_pblc_packet = NULL;\n                LIBSSH2_FREE(session, session->userauth_pblc_method);\n                session->userauth_pblc_method = NULL;\n                session->userauth_pblc_state = libssh2_NB_state_idle;\n                return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                      \"Failed allocating additional space for \"\n                                      \"userauth-publickey packet\");\n            }\n            session->userauth_pblc_packet = newpacket;\n        }\n\n        s = session->userauth_pblc_packet + session->userauth_pblc_packet_len;\n        session->userauth_pblc_b = NULL;\n\n        _libssh2_store_u32(&s,\n                           4 + session->userauth_pblc_method_len + 4 +\n                           sig_len);\n        _libssh2_store_str(&s, (const char *)session->userauth_pblc_method,\n                           session->userauth_pblc_method_len);\n\n        LIBSSH2_FREE(session, session->userauth_pblc_method);\n        session->userauth_pblc_method = NULL;\n\n        _libssh2_store_str(&s, (const char *)sig, sig_len);\n        LIBSSH2_FREE(session, sig);\n\n        _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                       \"Attempting publickey authentication -- phase 2\");\n\n        session->userauth_pblc_s = s;\n        session->userauth_pblc_state = libssh2_NB_state_sent2;\n    }\n\n    if(session->userauth_pblc_state == libssh2_NB_state_sent2) {\n        rc = _libssh2_transport_send(session, session->userauth_pblc_packet,\n                                     session->userauth_pblc_s -\n                                     session->userauth_pblc_packet,\n                                     NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                  \"Would block\");\n        }\n        else if(rc) {\n            LIBSSH2_FREE(session, session->userauth_pblc_packet);\n            session->userauth_pblc_packet = NULL;\n            session->userauth_pblc_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send userauth-publickey request\");\n        }\n        LIBSSH2_FREE(session, session->userauth_pblc_packet);\n        session->userauth_pblc_packet = NULL;\n\n        session->userauth_pblc_state = libssh2_NB_state_sent3;\n    }\n\n    /* PK_OK is no longer valid */\n    reply_codes[2] = 0;\n\n    rc = _libssh2_packet_requirev(session, reply_codes,\n                               &session->userauth_pblc_data,\n                               &session->userauth_pblc_data_len, 0, NULL, 0,\n                               &session->userauth_pblc_packet_requirev_state);\n    if(rc == LIBSSH2_ERROR_EAGAIN) {\n        return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                              \"Would block requesting userauth list\");\n    }\n    else if(rc || session->userauth_pblc_data_len < 1) {\n        session->userauth_pblc_state = libssh2_NB_state_idle;\n        return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                              \"Waiting for publickey USERAUTH response\");\n    }\n\n    if(session->userauth_pblc_data[0] == SSH_MSG_USERAUTH_SUCCESS) {\n        _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                       \"Publickey authentication successful\");\n        /* We are us and we've proved it. */\n        LIBSSH2_FREE(session, session->userauth_pblc_data);\n        session->userauth_pblc_data = NULL;\n        session->state |= LIBSSH2_STATE_AUTHENTICATED;\n        session->userauth_pblc_state = libssh2_NB_state_idle;\n        return 0;\n    }\n\n    /* This public key is not allowed for this user on this server */\n    LIBSSH2_FREE(session, session->userauth_pblc_data);\n    session->userauth_pblc_data = NULL;\n    session->userauth_pblc_state = libssh2_NB_state_idle;\n    return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED,\n                          \"Invalid signature for supplied public key, or bad \"\n                          \"username/public key combination\");\n}\n\n /*\n  * userauth_publickey_frommemory\n  * Authenticate using a keypair from memory\n  */\nstatic int\nuserauth_publickey_frommemory(LIBSSH2_SESSION *session,\n                              const char *username,\n                              size_t username_len,\n                              const char *publickeydata,\n                              size_t publickeydata_len,\n                              const char *privatekeydata,\n                              size_t privatekeydata_len,\n                              const char *passphrase)\n{\n    unsigned char *pubkeydata = NULL;\n    size_t pubkeydata_len = 0;\n    struct privkey_file privkey_file;\n    void *abstract = &privkey_file;\n    int rc;\n\n#if !LIBSSH2_RSA\n    return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                          \"RSA is not supported by crypto backend\");\n#endif\n\n    privkey_file.filename = privatekeydata;\n    privkey_file.passphrase = passphrase;\n\n    if(session->userauth_pblc_state == libssh2_NB_state_idle) {\n        if(publickeydata_len && publickeydata) {\n            rc = memory_read_publickey(session, &session->userauth_pblc_method,\n                                       &session->userauth_pblc_method_len,\n                                       &pubkeydata, &pubkeydata_len,\n                                       publickeydata, publickeydata_len);\n            if(rc)\n                return rc;\n        }\n        else if(privatekeydata_len && privatekeydata) {\n            /* Compute public key from private key. */\n            if(_libssh2_pub_priv_keyfilememory(session,\n                                            &session->userauth_pblc_method,\n                                            &session->userauth_pblc_method_len,\n                                            &pubkeydata, &pubkeydata_len,\n                                            privatekeydata, privatekeydata_len,\n                                            passphrase))\n                return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                                      \"Unable to extract public key \"\n                                      \"from private key.\");\n        }\n        else {\n            return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                                  \"Invalid data in public and private key.\");\n        }\n    }\n\n    rc = _libssh2_userauth_publickey(session, username, username_len,\n                                     pubkeydata, pubkeydata_len,\n                                     sign_frommemory, &abstract);\n    if(pubkeydata)\n        LIBSSH2_FREE(session, pubkeydata);\n\n    return rc;\n}\n\n/*\n * userauth_publickey_fromfile\n * Authenticate using a keypair found in the named files\n */\nstatic int\nuserauth_publickey_fromfile(LIBSSH2_SESSION *session,\n                            const char *username,\n                            size_t username_len,\n                            const char *publickey,\n                            const char *privatekey,\n                            const char *passphrase)\n{\n    unsigned char *pubkeydata = NULL;\n    size_t pubkeydata_len = 0;\n    struct privkey_file privkey_file;\n    void *abstract = &privkey_file;\n    int rc;\n\n#if !LIBSSH2_RSA\n    return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                          \"RSA is not supported by crypto backend\");\n#endif\n\n    privkey_file.filename = privatekey;\n    privkey_file.passphrase = passphrase;\n\n    if(session->userauth_pblc_state == libssh2_NB_state_idle) {\n        if(publickey) {\n            rc = file_read_publickey(session, &session->userauth_pblc_method,\n                                     &session->userauth_pblc_method_len,\n                                     &pubkeydata, &pubkeydata_len, publickey);\n            if(rc)\n                return rc;\n        }\n        else {\n            /* Compute public key from private key. */\n            rc = _libssh2_pub_priv_keyfile(session,\n                                           &session->userauth_pblc_method,\n                                           &session->userauth_pblc_method_len,\n                                           &pubkeydata, &pubkeydata_len,\n                                           privatekey, passphrase);\n\n            /* _libssh2_pub_priv_keyfile calls _libssh2_error() */\n            if(rc)\n                return rc;\n        }\n    }\n\n    rc = _libssh2_userauth_publickey(session, username, username_len,\n                                     pubkeydata, pubkeydata_len,\n                                     sign_fromfile, &abstract);\n    if(pubkeydata)\n        LIBSSH2_FREE(session, pubkeydata);\n\n    return rc;\n}\n\n/* libssh2_userauth_publickey_frommemory\n * Authenticate using a keypair from memory\n */\nLIBSSH2_API int\nlibssh2_userauth_publickey_frommemory(LIBSSH2_SESSION *session,\n                                      const char *user,\n                                      size_t user_len,\n                                      const char *publickeyfiledata,\n                                      size_t publickeyfiledata_len,\n                                      const char *privatekeyfiledata,\n                                      size_t privatekeyfiledata_len,\n                                      const char *passphrase)\n{\n    int rc;\n\n    if(NULL == passphrase)\n        /* if given a NULL pointer, make it point to a zero-length\n           string to save us from having to check this all over */\n        passphrase = \"\";\n\n    BLOCK_ADJUST(rc, session,\n                 userauth_publickey_frommemory(session, user, user_len,\n                                               publickeyfiledata,\n                                               publickeyfiledata_len,\n                                               privatekeyfiledata,\n                                               privatekeyfiledata_len,\n                                               passphrase));\n    return rc;\n}\n\n/* libssh2_userauth_publickey_fromfile_ex\n * Authenticate using a keypair found in the named files\n */\nLIBSSH2_API int\nlibssh2_userauth_publickey_fromfile_ex(LIBSSH2_SESSION *session,\n                                       const char *user,\n                                       unsigned int user_len,\n                                       const char *publickey,\n                                       const char *privatekey,\n                                       const char *passphrase)\n{\n    int rc;\n\n    if(NULL == passphrase)\n        /* if given a NULL pointer, make it point to a zero-length\n           string to save us from having to check this all over */\n        passphrase = \"\";\n\n    BLOCK_ADJUST(rc, session,\n                 userauth_publickey_fromfile(session, user, user_len,\n                                             publickey, privatekey,\n                                             passphrase));\n    return rc;\n}\n\n/* libssh2_userauth_publickey_ex\n * Authenticate using an external callback function\n */\nLIBSSH2_API int\nlibssh2_userauth_publickey(LIBSSH2_SESSION *session,\n                           const char *user,\n                           const unsigned char *pubkeydata,\n                           size_t pubkeydata_len,\n                           LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC\n                           ((*sign_callback)),\n                           void **abstract)\n{\n    int rc;\n\n    if(!session)\n        return LIBSSH2_ERROR_BAD_USE;\n\n    BLOCK_ADJUST(rc, session,\n                 _libssh2_userauth_publickey(session, user, strlen(user),\n                                             pubkeydata, pubkeydata_len,\n                                             sign_callback, abstract));\n    return rc;\n}\n\n\n\n/*\n * userauth_keyboard_interactive\n *\n * Authenticate using a challenge-response authentication\n */\nstatic int\nuserauth_keyboard_interactive(LIBSSH2_SESSION * session,\n                              const char *username,\n                              unsigned int username_len,\n                              LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC\n                              ((*response_callback)))\n{\n    unsigned char *s;\n    int rc;\n\n    static const unsigned char reply_codes[4] = {\n        SSH_MSG_USERAUTH_SUCCESS,\n        SSH_MSG_USERAUTH_FAILURE, SSH_MSG_USERAUTH_INFO_REQUEST, 0\n    };\n    unsigned int language_tag_len;\n    unsigned int i;\n\n    if(session->userauth_kybd_state == libssh2_NB_state_idle) {\n        session->userauth_kybd_auth_name = NULL;\n        session->userauth_kybd_auth_instruction = NULL;\n        session->userauth_kybd_num_prompts = 0;\n        session->userauth_kybd_auth_failure = 1;\n        session->userauth_kybd_prompts = NULL;\n        session->userauth_kybd_responses = NULL;\n\n        /* Zero the whole thing out */\n        memset(&session->userauth_kybd_packet_requirev_state, 0,\n               sizeof(session->userauth_kybd_packet_requirev_state));\n\n        session->userauth_kybd_packet_len =\n            1                   /* byte    SSH_MSG_USERAUTH_REQUEST */\n            + 4 + username_len  /* string  user name (ISO-10646 UTF-8, as\n                                   defined in [RFC-3629]) */\n            + 4 + 14            /* string  service name (US-ASCII) */\n            + 4 + 20            /* string  \"keyboard-interactive\" (US-ASCII) */\n            + 4 + 0             /* string  language tag (as defined in\n                                   [RFC-3066]) */\n            + 4 + 0             /* string  submethods (ISO-10646 UTF-8) */\n            ;\n\n        session->userauth_kybd_data = s =\n            LIBSSH2_ALLOC(session, session->userauth_kybd_packet_len);\n        if(!s) {\n            return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                  \"Unable to allocate memory for \"\n                                  \"keyboard-interactive authentication\");\n        }\n\n        *s++ = SSH_MSG_USERAUTH_REQUEST;\n\n        /* user name */\n        _libssh2_store_str(&s, username, username_len);\n\n        /* service name */\n        _libssh2_store_str(&s, \"ssh-connection\", sizeof(\"ssh-connection\") - 1);\n\n        /* \"keyboard-interactive\" */\n        _libssh2_store_str(&s, \"keyboard-interactive\",\n                           sizeof(\"keyboard-interactive\") - 1);\n        /* language tag */\n        _libssh2_store_u32(&s, 0);\n\n        /* submethods */\n        _libssh2_store_u32(&s, 0);\n\n        _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                       \"Attempting keyboard-interactive authentication\");\n\n        session->userauth_kybd_state = libssh2_NB_state_created;\n    }\n\n    if(session->userauth_kybd_state == libssh2_NB_state_created) {\n        rc = _libssh2_transport_send(session, session->userauth_kybd_data,\n                                     session->userauth_kybd_packet_len,\n                                     NULL, 0);\n        if(rc == LIBSSH2_ERROR_EAGAIN) {\n            return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                  \"Would block\");\n        }\n        else if(rc) {\n            LIBSSH2_FREE(session, session->userauth_kybd_data);\n            session->userauth_kybd_data = NULL;\n            session->userauth_kybd_state = libssh2_NB_state_idle;\n            return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                                  \"Unable to send keyboard-interactive\"\n                                  \" request\");\n        }\n        LIBSSH2_FREE(session, session->userauth_kybd_data);\n        session->userauth_kybd_data = NULL;\n\n        session->userauth_kybd_state = libssh2_NB_state_sent;\n    }\n\n    for(;;) {\n        if(session->userauth_kybd_state == libssh2_NB_state_sent) {\n            rc = _libssh2_packet_requirev(session, reply_codes,\n                                          &session->userauth_kybd_data,\n                                          &session->userauth_kybd_data_len,\n                                          0, NULL, 0,\n                                          &session->\n                                          userauth_kybd_packet_requirev_state);\n            if(rc == LIBSSH2_ERROR_EAGAIN) {\n                return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                      \"Would block\");\n            }\n            else if(rc || session->userauth_kybd_data_len < 1) {\n                session->userauth_kybd_state = libssh2_NB_state_idle;\n                return _libssh2_error(session,\n                                      LIBSSH2_ERROR_AUTHENTICATION_FAILED,\n                                      \"Waiting for keyboard \"\n                                      \"USERAUTH response\");\n            }\n\n            if(session->userauth_kybd_data[0] == SSH_MSG_USERAUTH_SUCCESS) {\n                _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                               \"Keyboard-interactive \"\n                               \"authentication successful\");\n                LIBSSH2_FREE(session, session->userauth_kybd_data);\n                session->userauth_kybd_data = NULL;\n                session->state |= LIBSSH2_STATE_AUTHENTICATED;\n                session->userauth_kybd_state = libssh2_NB_state_idle;\n                return 0;\n            }\n\n            if(session->userauth_kybd_data[0] == SSH_MSG_USERAUTH_FAILURE) {\n                _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                               \"Keyboard-interactive authentication failed\");\n                LIBSSH2_FREE(session, session->userauth_kybd_data);\n                session->userauth_kybd_data = NULL;\n                session->userauth_kybd_state = libssh2_NB_state_idle;\n                return _libssh2_error(session,\n                                      LIBSSH2_ERROR_AUTHENTICATION_FAILED,\n                                      \"Authentication failed \"\n                                      \"(keyboard-interactive)\");\n            }\n\n            /* server requested PAM-like conversation */\n            s = session->userauth_kybd_data + 1;\n\n            if(session->userauth_kybd_data_len >= 5) {\n                /* string    name (ISO-10646 UTF-8) */\n                session->userauth_kybd_auth_name_len = _libssh2_ntohu32(s);\n                s += 4;\n            }\n            else {\n                _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                               \"userauth keyboard data buffer too small\"\n                               \"to get length\");\n                goto cleanup;\n            }\n\n            if(session->userauth_kybd_auth_name_len) {\n                session->userauth_kybd_auth_name =\n                    LIBSSH2_ALLOC(session,\n                                  session->userauth_kybd_auth_name_len);\n                if(!session->userauth_kybd_auth_name) {\n                    _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                   \"Unable to allocate memory for \"\n                                   \"keyboard-interactive 'name' \"\n                                   \"request field\");\n                    goto cleanup;\n                }\n                if(s + session->userauth_list_data_len <=\n                   session->userauth_kybd_data +\n                   session->userauth_kybd_data_len) {\n                    memcpy(session->userauth_kybd_auth_name, s,\n                           session->userauth_kybd_auth_name_len);\n                    s += session->userauth_kybd_auth_name_len;\n                }\n                else {\n                    _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                   \"userauth keyboard data buffer too small\"\n                                   \"for auth name\");\n                    goto cleanup;\n                }\n            }\n\n            if(s + 4 <= session->userauth_kybd_data +\n               session->userauth_kybd_data_len) {\n                /* string    instruction (ISO-10646 UTF-8) */\n                session->userauth_kybd_auth_instruction_len =\n                    _libssh2_ntohu32(s);\n                s += 4;\n            }\n            else {\n                _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                               \"userauth keyboard data buffer too small\"\n                               \"for auth instruction length\");\n                goto cleanup;\n            }\n\n            if(session->userauth_kybd_auth_instruction_len) {\n                session->userauth_kybd_auth_instruction =\n                    LIBSSH2_ALLOC(session,\n                                  session->userauth_kybd_auth_instruction_len);\n                if(!session->userauth_kybd_auth_instruction) {\n                    _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                   \"Unable to allocate memory for \"\n                                   \"keyboard-interactive 'instruction' \"\n                                   \"request field\");\n                    goto cleanup;\n                }\n                if(s + session->userauth_kybd_auth_instruction_len <=\n                   session->userauth_kybd_data +\n                   session->userauth_kybd_data_len) {\n                    memcpy(session->userauth_kybd_auth_instruction, s,\n                           session->userauth_kybd_auth_instruction_len);\n                    s += session->userauth_kybd_auth_instruction_len;\n                }\n                else {\n                    _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                   \"userauth keyboard data buffer too small\"\n                                   \"for auth instruction\");\n                    goto cleanup;\n                }\n            }\n\n            if(s + 4 <= session->userauth_kybd_data +\n               session->userauth_kybd_data_len) {\n                /* string    language tag (as defined in [RFC-3066]) */\n                language_tag_len = _libssh2_ntohu32(s);\n                s += 4;\n            }\n            else {\n                _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                               \"userauth keyboard data buffer too small\"\n                               \"for auth language tag length\");\n                goto cleanup;\n            }\n\n            if(s + language_tag_len <= session->userauth_kybd_data +\n               session->userauth_kybd_data_len) {\n                /* ignoring this field as deprecated */\n                s += language_tag_len;\n            }\n            else {\n                _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                               \"userauth keyboard data buffer too small\"\n                               \"for auth language tag\");\n                goto cleanup;\n            }\n\n            if(s + 4 <= session->userauth_kybd_data +\n               session->userauth_kybd_data_len) {\n                /* int       num-prompts */\n                session->userauth_kybd_num_prompts = _libssh2_ntohu32(s);\n                s += 4;\n            }\n            else {\n                _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                               \"userauth keyboard data buffer too small\"\n                               \"for auth num keyboard prompts\");\n                goto cleanup;\n            }\n\n            if(session->userauth_kybd_num_prompts > 100) {\n                _libssh2_error(session, LIBSSH2_ERROR_OUT_OF_BOUNDARY,\n                               \"Too many replies for \"\n                               \"keyboard-interactive prompts\");\n                goto cleanup;\n            }\n\n            if(session->userauth_kybd_num_prompts) {\n                session->userauth_kybd_prompts =\n                    LIBSSH2_CALLOC(session,\n                                   sizeof(LIBSSH2_USERAUTH_KBDINT_PROMPT) *\n                                   session->userauth_kybd_num_prompts);\n                if(!session->userauth_kybd_prompts) {\n                    _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                   \"Unable to allocate memory for \"\n                                   \"keyboard-interactive prompts array\");\n                    goto cleanup;\n                }\n\n                session->userauth_kybd_responses =\n                    LIBSSH2_CALLOC(session,\n                                   sizeof(LIBSSH2_USERAUTH_KBDINT_RESPONSE) *\n                                   session->userauth_kybd_num_prompts);\n                if(!session->userauth_kybd_responses) {\n                    _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                   \"Unable to allocate memory for \"\n                                   \"keyboard-interactive responses array\");\n                    goto cleanup;\n                }\n\n                for(i = 0; i < session->userauth_kybd_num_prompts; i++) {\n                    if(s + 4 <= session->userauth_kybd_data +\n                       session->userauth_kybd_data_len) {\n                        /* string    prompt[1] (ISO-10646 UTF-8) */\n                        session->userauth_kybd_prompts[i].length =\n                            _libssh2_ntohu32(s);\n                        s += 4;\n                    }\n                    else {\n                        _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                       \"userauth keyboard data buffer too \"\n                                       \"small for auth keyboard \"\n                                       \"prompt length\");\n                        goto cleanup;\n                    }\n\n                    session->userauth_kybd_prompts[i].text =\n                        LIBSSH2_CALLOC(session,\n                                       session->userauth_kybd_prompts[i].\n                                       length);\n                    if(!session->userauth_kybd_prompts[i].text) {\n                        _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                       \"Unable to allocate memory for \"\n                                       \"keyboard-interactive prompt message\");\n                        goto cleanup;\n                    }\n\n                    if(s + session->userauth_kybd_prompts[i].length <=\n                       session->userauth_kybd_data +\n                       session->userauth_kybd_data_len) {\n                        memcpy(session->userauth_kybd_prompts[i].text, s,\n                               session->userauth_kybd_prompts[i].length);\n                        s += session->userauth_kybd_prompts[i].length;\n                    }\n                    else {\n                        _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                       \"userauth keyboard data buffer too \"\n                                       \"small for auth keyboard prompt\");\n                        goto cleanup;\n                    }\n                    if(s < session->userauth_kybd_data +\n                       session->userauth_kybd_data_len) {\n                        /* boolean   echo[1] */\n                        session->userauth_kybd_prompts[i].echo = *s++;\n                    }\n                    else {\n                        _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,\n                                       \"userauth keyboard data buffer too \"\n                                       \"small for auth keyboard prompt echo\");\n                        goto cleanup;\n                    }\n                }\n            }\n\n            response_callback(session->userauth_kybd_auth_name,\n                              session->userauth_kybd_auth_name_len,\n                              session->userauth_kybd_auth_instruction,\n                              session->userauth_kybd_auth_instruction_len,\n                              session->userauth_kybd_num_prompts,\n                              session->userauth_kybd_prompts,\n                              session->userauth_kybd_responses,\n                              &session->abstract);\n\n            _libssh2_debug(session, LIBSSH2_TRACE_AUTH,\n                           \"Keyboard-interactive response callback function\"\n                           \" invoked\");\n\n            session->userauth_kybd_packet_len =\n                1 /* byte      SSH_MSG_USERAUTH_INFO_RESPONSE */\n                + 4             /* int       num-responses */\n                ;\n\n            for(i = 0; i < session->userauth_kybd_num_prompts; i++) {\n                /* string    response[1] (ISO-10646 UTF-8) */\n                if(session->userauth_kybd_responses[i].length <=\n                   (SIZE_MAX - 4 - session->userauth_kybd_packet_len) ) {\n                    session->userauth_kybd_packet_len +=\n                        4 + session->userauth_kybd_responses[i].length;\n                }\n                else {\n                    _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                                   \"Unable to allocate memory for keyboard-\"\n                                   \"interactive response packet\");\n                    goto cleanup;\n                }\n            }\n\n            /* A new userauth_kybd_data area is to be allocated, free the\n               former one. */\n            LIBSSH2_FREE(session, session->userauth_kybd_data);\n\n            session->userauth_kybd_data = s =\n                LIBSSH2_ALLOC(session, session->userauth_kybd_packet_len);\n            if(!s) {\n                _libssh2_error(session, LIBSSH2_ERROR_ALLOC,\n                               \"Unable to allocate memory for keyboard-\"\n                               \"interactive response packet\");\n                goto cleanup;\n            }\n\n            *s = SSH_MSG_USERAUTH_INFO_RESPONSE;\n            s++;\n            _libssh2_store_u32(&s, session->userauth_kybd_num_prompts);\n\n            for(i = 0; i < session->userauth_kybd_num_prompts; i++) {\n                _libssh2_store_str(&s,\n                                   session->userauth_kybd_responses[i].text,\n                                   session->userauth_kybd_responses[i].length);\n            }\n\n            session->userauth_kybd_state = libssh2_NB_state_sent1;\n        }\n\n        if(session->userauth_kybd_state == libssh2_NB_state_sent1) {\n            rc = _libssh2_transport_send(session, session->userauth_kybd_data,\n                                         session->userauth_kybd_packet_len,\n                                         NULL, 0);\n            if(rc == LIBSSH2_ERROR_EAGAIN)\n                return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN,\n                                      \"Would block\");\n            if(rc) {\n                _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,\n                               \"Unable to send userauth-keyboard-interactive\"\n                               \" request\");\n                goto cleanup;\n            }\n\n            session->userauth_kybd_auth_failure = 0;\n        }\n\n      cleanup:\n        /*\n         * It's safe to clean all the data here, because unallocated pointers\n         * are filled by zeroes\n         */\n\n        LIBSSH2_FREE(session, session->userauth_kybd_data);\n        session->userauth_kybd_data = NULL;\n\n        if(session->userauth_kybd_prompts) {\n            for(i = 0; i < session->userauth_kybd_num_prompts; i++) {\n                LIBSSH2_FREE(session, session->userauth_kybd_prompts[i].text);\n                session->userauth_kybd_prompts[i].text = NULL;\n            }\n        }\n\n        if(session->userauth_kybd_responses) {\n            for(i = 0; i < session->userauth_kybd_num_prompts; i++) {\n                LIBSSH2_FREE(session,\n                             session->userauth_kybd_responses[i].text);\n                session->userauth_kybd_responses[i].text = NULL;\n            }\n        }\n\n        if(session->userauth_kybd_prompts) {\n            LIBSSH2_FREE(session, session->userauth_kybd_prompts);\n            session->userauth_kybd_prompts = NULL;\n        }\n        if(session->userauth_kybd_responses) {\n            LIBSSH2_FREE(session, session->userauth_kybd_responses);\n            session->userauth_kybd_responses = NULL;\n        }\n        if(session->userauth_kybd_auth_name) {\n            LIBSSH2_FREE(session, session->userauth_kybd_auth_name);\n            session->userauth_kybd_auth_name = NULL;\n        }\n        if(session->userauth_kybd_auth_instruction) {\n            LIBSSH2_FREE(session, session->userauth_kybd_auth_instruction);\n            session->userauth_kybd_auth_instruction = NULL;\n        }\n\n        if(session->userauth_kybd_auth_failure) {\n            session->userauth_kybd_state = libssh2_NB_state_idle;\n            return -1;\n        }\n\n        session->userauth_kybd_state = libssh2_NB_state_sent;\n    }\n}\n\n/*\n * libssh2_userauth_keyboard_interactive_ex\n *\n * Authenticate using a challenge-response authentication\n */\nLIBSSH2_API int\nlibssh2_userauth_keyboard_interactive_ex(LIBSSH2_SESSION *session,\n                                         const char *user,\n                                         unsigned int user_len,\n                                         LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC\n                                         ((*response_callback)))\n{\n    int rc;\n    BLOCK_ADJUST(rc, session,\n                 userauth_keyboard_interactive(session, user, user_len,\n                                               response_callback));\n    return rc;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/userauth.h",
    "content": "#ifndef LIBSSH2_USERAUTH_H\n#define LIBSSH2_USERAUTH_H\n/* Copyright (c) 2004-2007, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2009-2010 by Daniel Stenberg\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\nint\n_libssh2_userauth_publickey(LIBSSH2_SESSION *session,\n                            const char *username,\n                            unsigned int username_len,\n                            const unsigned char *pubkeydata,\n                            unsigned long pubkeydata_len,\n                            LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC\n                            ((*sign_callback)),\n                            void *abstract);\n\n#endif /* LIBSSH2_USERAUTH_H */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/version.c",
    "content": "/* Copyright (C) 2009 Daniel Stenberg.  All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n */\n\n#include \"libssh2_priv.h\"\n\n/*\n  libssh2_version() can be used like this:\n\n  if (!libssh2_version(LIBSSH2_VERSION_NUM)) {\n    fprintf (stderr, \"Runtime libssh2 version too old!\\n\");\n    exit(1);\n  }\n*/\nLIBSSH2_API\nconst char *libssh2_version(int req_version_num)\n{\n    if(req_version_num <= LIBSSH2_VERSION_NUM)\n        return LIBSSH2_VERSION;\n    return NULL; /* this is not a suitable library! */\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/wincng.c",
    "content": "/*\n * Copyright (C) 2013-2015 Marc Hoersken <info@marc-hoersken.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"libssh2_priv.h\"\n\n#ifdef LIBSSH2_WINCNG /* compile only if we build with wincng */\n\n/* required for cross-compilation against the w64 mingw-runtime package */\n#if defined(_WIN32_WINNT) && (_WIN32_WINNT < 0x0600)\n#undef _WIN32_WINNT\n#endif\n#ifndef _WIN32_WINNT\n#define _WIN32_WINNT 0x0600\n#endif\n\n/* specify the required libraries for dependencies using MSVC */\n#ifdef _MSC_VER\n#pragma comment(lib, \"bcrypt.lib\")\n#ifdef HAVE_LIBCRYPT32\n#pragma comment(lib, \"crypt32.lib\")\n#endif\n#endif\n\n#include <windows.h>\n#include <bcrypt.h>\n#include <math.h>\n#include \"misc.h\"\n\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n#ifdef HAVE_LIBCRYPT32\n#include <wincrypt.h>\n#endif\n\n#define PEM_RSA_HEADER \"-----BEGIN RSA PRIVATE KEY-----\"\n#define PEM_RSA_FOOTER \"-----END RSA PRIVATE KEY-----\"\n#define PEM_DSA_HEADER \"-----BEGIN DSA PRIVATE KEY-----\"\n#define PEM_DSA_FOOTER \"-----END DSA PRIVATE KEY-----\"\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Missing definitions (for MinGW[-w64])\n */\n#ifndef BCRYPT_SUCCESS\n#define BCRYPT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)\n#endif\n\n#ifndef BCRYPT_RNG_ALGORITHM\n#define BCRYPT_RNG_ALGORITHM L\"RNG\"\n#endif\n\n#ifndef BCRYPT_MD5_ALGORITHM\n#define BCRYPT_MD5_ALGORITHM L\"MD5\"\n#endif\n\n#ifndef BCRYPT_SHA1_ALGORITHM\n#define BCRYPT_SHA1_ALGORITHM L\"SHA1\"\n#endif\n\n#ifndef BCRYPT_SHA256_ALGORITHM\n#define BCRYPT_SHA256_ALGORITHM L\"SHA256\"\n#endif\n\n#ifndef BCRYPT_SHA512_ALGORITHM\n#define BCRYPT_SHA512_ALGORITHM L\"SHA512\"\n#endif\n\n#ifndef BCRYPT_RSA_ALGORITHM\n#define BCRYPT_RSA_ALGORITHM L\"RSA\"\n#endif\n\n#ifndef BCRYPT_DSA_ALGORITHM\n#define BCRYPT_DSA_ALGORITHM L\"DSA\"\n#endif\n\n#ifndef BCRYPT_AES_ALGORITHM\n#define BCRYPT_AES_ALGORITHM L\"AES\"\n#endif\n\n#ifndef BCRYPT_RC4_ALGORITHM\n#define BCRYPT_RC4_ALGORITHM L\"RC4\"\n#endif\n\n#ifndef BCRYPT_3DES_ALGORITHM\n#define BCRYPT_3DES_ALGORITHM L\"3DES\"\n#endif\n\n#ifndef BCRYPT_ALG_HANDLE_HMAC_FLAG\n#define BCRYPT_ALG_HANDLE_HMAC_FLAG 0x00000008\n#endif\n\n#ifndef BCRYPT_DSA_PUBLIC_BLOB\n#define BCRYPT_DSA_PUBLIC_BLOB L\"DSAPUBLICBLOB\"\n#endif\n\n#ifndef BCRYPT_DSA_PUBLIC_MAGIC\n#define BCRYPT_DSA_PUBLIC_MAGIC 0x42505344 /* DSPB */\n#endif\n\n#ifndef BCRYPT_DSA_PRIVATE_BLOB\n#define BCRYPT_DSA_PRIVATE_BLOB L\"DSAPRIVATEBLOB\"\n#endif\n\n#ifndef BCRYPT_DSA_PRIVATE_MAGIC\n#define BCRYPT_DSA_PRIVATE_MAGIC 0x56505344 /* DSPV */\n#endif\n\n#ifndef BCRYPT_RSAPUBLIC_BLOB\n#define BCRYPT_RSAPUBLIC_BLOB L\"RSAPUBLICBLOB\"\n#endif\n\n#ifndef BCRYPT_RSAPUBLIC_MAGIC\n#define BCRYPT_RSAPUBLIC_MAGIC 0x31415352 /* RSA1 */\n#endif\n\n#ifndef BCRYPT_RSAFULLPRIVATE_BLOB\n#define BCRYPT_RSAFULLPRIVATE_BLOB L\"RSAFULLPRIVATEBLOB\"\n#endif\n\n#ifndef BCRYPT_RSAFULLPRIVATE_MAGIC\n#define BCRYPT_RSAFULLPRIVATE_MAGIC 0x33415352 /* RSA3 */\n#endif\n\n#ifndef BCRYPT_KEY_DATA_BLOB\n#define BCRYPT_KEY_DATA_BLOB L\"KeyDataBlob\"\n#endif\n\n#ifndef BCRYPT_MESSAGE_BLOCK_LENGTH\n#define BCRYPT_MESSAGE_BLOCK_LENGTH L\"MessageBlockLength\"\n#endif\n\n#ifndef BCRYPT_NO_KEY_VALIDATION\n#define BCRYPT_NO_KEY_VALIDATION 0x00000008\n#endif\n\n#ifndef BCRYPT_BLOCK_PADDING\n#define BCRYPT_BLOCK_PADDING 0x00000001\n#endif\n\n#ifndef BCRYPT_PAD_NONE\n#define BCRYPT_PAD_NONE 0x00000001\n#endif\n\n#ifndef BCRYPT_PAD_PKCS1\n#define BCRYPT_PAD_PKCS1 0x00000002\n#endif\n\n#ifndef BCRYPT_PAD_OAEP\n#define BCRYPT_PAD_OAEP 0x00000004\n#endif\n\n#ifndef BCRYPT_PAD_PSS\n#define BCRYPT_PAD_PSS 0x00000008\n#endif\n\n#ifndef CRYPT_STRING_ANY\n#define CRYPT_STRING_ANY 0x00000007\n#endif\n\n#ifndef LEGACY_RSAPRIVATE_BLOB\n#define LEGACY_RSAPRIVATE_BLOB L\"CAPIPRIVATEBLOB\"\n#endif\n\n#ifndef PKCS_RSA_PRIVATE_KEY\n#define PKCS_RSA_PRIVATE_KEY (LPCSTR)43\n#endif\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Generic functions\n */\n\nvoid\n_libssh2_wincng_init(void)\n{\n    int ret;\n\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRNG,\n                                      BCRYPT_RNG_ALGORITHM, NULL, 0);\n\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashMD5,\n                                      BCRYPT_MD5_ALGORITHM, NULL, 0);\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA1,\n                                      BCRYPT_SHA1_ALGORITHM, NULL, 0);\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA256,\n                                      BCRYPT_SHA256_ALGORITHM, NULL, 0);\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA512,\n                                      BCRYPT_SHA512_ALGORITHM, NULL, 0);\n\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacMD5,\n                                      BCRYPT_MD5_ALGORITHM, NULL,\n                                      BCRYPT_ALG_HANDLE_HMAC_FLAG);\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA1,\n                                      BCRYPT_SHA1_ALGORITHM, NULL,\n                                      BCRYPT_ALG_HANDLE_HMAC_FLAG);\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA256,\n                                      BCRYPT_SHA256_ALGORITHM, NULL,\n                                      BCRYPT_ALG_HANDLE_HMAC_FLAG);\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA512,\n                                      BCRYPT_SHA512_ALGORITHM, NULL,\n                                      BCRYPT_ALG_HANDLE_HMAC_FLAG);\n\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRSA,\n                                      BCRYPT_RSA_ALGORITHM, NULL, 0);\n    (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgDSA,\n                                      BCRYPT_DSA_ALGORITHM, NULL, 0);\n\n    ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgAES_CBC,\n                                      BCRYPT_AES_ALGORITHM, NULL, 0);\n    if(BCRYPT_SUCCESS(ret)) {\n        ret = BCryptSetProperty(_libssh2_wincng.hAlgAES_CBC,\n                                BCRYPT_CHAINING_MODE,\n                                (PBYTE)BCRYPT_CHAIN_MODE_CBC,\n                                sizeof(BCRYPT_CHAIN_MODE_CBC), 0);\n        if(!BCRYPT_SUCCESS(ret)) {\n            (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_CBC, 0);\n        }\n    }\n\n    ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgAES_ECB,\n                                      BCRYPT_AES_ALGORITHM, NULL, 0);\n    if(BCRYPT_SUCCESS(ret)) {\n        ret = BCryptSetProperty(_libssh2_wincng.hAlgAES_ECB,\n                                BCRYPT_CHAINING_MODE,\n                                (PBYTE)BCRYPT_CHAIN_MODE_ECB,\n                                sizeof(BCRYPT_CHAIN_MODE_ECB), 0);\n        if(!BCRYPT_SUCCESS(ret)) {\n            (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_ECB, 0);\n        }\n    }\n\n    ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRC4_NA,\n                                      BCRYPT_RC4_ALGORITHM, NULL, 0);\n    if(BCRYPT_SUCCESS(ret)) {\n        ret = BCryptSetProperty(_libssh2_wincng.hAlgRC4_NA,\n                                BCRYPT_CHAINING_MODE,\n                                (PBYTE)BCRYPT_CHAIN_MODE_NA,\n                                sizeof(BCRYPT_CHAIN_MODE_NA), 0);\n        if(!BCRYPT_SUCCESS(ret)) {\n            (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRC4_NA, 0);\n        }\n    }\n\n    ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlg3DES_CBC,\n                                      BCRYPT_3DES_ALGORITHM, NULL, 0);\n    if(BCRYPT_SUCCESS(ret)) {\n        ret = BCryptSetProperty(_libssh2_wincng.hAlg3DES_CBC,\n                                BCRYPT_CHAINING_MODE,\n                                (PBYTE)BCRYPT_CHAIN_MODE_CBC,\n                                sizeof(BCRYPT_CHAIN_MODE_CBC), 0);\n        if(!BCRYPT_SUCCESS(ret)) {\n            (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlg3DES_CBC,\n                                               0);\n        }\n    }\n}\n\nvoid\n_libssh2_wincng_free(void)\n{\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRNG, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashMD5, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA1, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA256, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA512, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacMD5, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA1, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA256, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA512, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRSA, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgDSA, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_CBC, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRC4_NA, 0);\n    (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlg3DES_CBC, 0);\n\n    memset(&_libssh2_wincng, 0, sizeof(_libssh2_wincng));\n}\n\nint\n_libssh2_wincng_random(void *buf, int len)\n{\n    int ret;\n\n    ret = BCryptGenRandom(_libssh2_wincng.hAlgRNG, buf, len, 0);\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\nstatic void\n_libssh2_wincng_safe_free(void *buf, int len)\n{\n#ifndef LIBSSH2_CLEAR_MEMORY\n    (void)len;\n#endif\n\n    if(!buf)\n        return;\n\n#ifdef LIBSSH2_CLEAR_MEMORY\n    if(len > 0)\n        SecureZeroMemory(buf, len);\n#endif\n\n    free(buf);\n}\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Hash functions\n */\n\nint\n_libssh2_wincng_hash_init(_libssh2_wincng_hash_ctx *ctx,\n                          BCRYPT_ALG_HANDLE hAlg, unsigned long hashlen,\n                          unsigned char *key, unsigned long keylen)\n{\n    BCRYPT_HASH_HANDLE hHash;\n    unsigned char *pbHashObject;\n    unsigned long dwHashObject, dwHash, cbData;\n    int ret;\n\n    ret = BCryptGetProperty(hAlg, BCRYPT_HASH_LENGTH,\n                            (unsigned char *)&dwHash,\n                            sizeof(dwHash),\n                            &cbData, 0);\n    if((!BCRYPT_SUCCESS(ret)) || dwHash != hashlen) {\n        return -1;\n    }\n\n    ret = BCryptGetProperty(hAlg, BCRYPT_OBJECT_LENGTH,\n                            (unsigned char *)&dwHashObject,\n                            sizeof(dwHashObject),\n                            &cbData, 0);\n    if(!BCRYPT_SUCCESS(ret)) {\n        return -1;\n    }\n\n    pbHashObject = malloc(dwHashObject);\n    if(!pbHashObject) {\n        return -1;\n    }\n\n\n    ret = BCryptCreateHash(hAlg, &hHash,\n                           pbHashObject, dwHashObject,\n                           key, keylen, 0);\n    if(!BCRYPT_SUCCESS(ret)) {\n        _libssh2_wincng_safe_free(pbHashObject, dwHashObject);\n        return -1;\n    }\n\n\n    ctx->hHash = hHash;\n    ctx->pbHashObject = pbHashObject;\n    ctx->dwHashObject = dwHashObject;\n    ctx->cbHash = dwHash;\n\n    return 0;\n}\n\nint\n_libssh2_wincng_hash_update(_libssh2_wincng_hash_ctx *ctx,\n                            const unsigned char *data, unsigned long datalen)\n{\n    int ret;\n\n    ret = BCryptHashData(ctx->hHash, (unsigned char *)data, datalen, 0);\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\nint\n_libssh2_wincng_hash_final(_libssh2_wincng_hash_ctx *ctx,\n                           unsigned char *hash)\n{\n    int ret;\n\n    ret = BCryptFinishHash(ctx->hHash, hash, ctx->cbHash, 0);\n\n    BCryptDestroyHash(ctx->hHash);\n    ctx->hHash = NULL;\n\n    _libssh2_wincng_safe_free(ctx->pbHashObject, ctx->dwHashObject);\n    ctx->pbHashObject = NULL;\n    ctx->dwHashObject = 0;\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\nint\n_libssh2_wincng_hash(unsigned char *data, unsigned long datalen,\n                     BCRYPT_ALG_HANDLE hAlg,\n                     unsigned char *hash, unsigned long hashlen)\n{\n    _libssh2_wincng_hash_ctx ctx;\n    int ret;\n\n    ret = _libssh2_wincng_hash_init(&ctx, hAlg, hashlen, NULL, 0);\n    if(!ret) {\n        ret = _libssh2_wincng_hash_update(&ctx, data, datalen);\n        ret |= _libssh2_wincng_hash_final(&ctx, hash);\n    }\n\n    return ret;\n}\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: HMAC functions\n */\n\nint\n_libssh2_wincng_hmac_final(_libssh2_wincng_hash_ctx *ctx,\n                           unsigned char *hash)\n{\n    int ret;\n\n    ret = BCryptFinishHash(ctx->hHash, hash, ctx->cbHash, 0);\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\nvoid\n_libssh2_wincng_hmac_cleanup(_libssh2_wincng_hash_ctx *ctx)\n{\n    BCryptDestroyHash(ctx->hHash);\n    ctx->hHash = NULL;\n\n    _libssh2_wincng_safe_free(ctx->pbHashObject, ctx->dwHashObject);\n    ctx->pbHashObject = NULL;\n    ctx->dwHashObject = 0;\n}\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Key functions\n */\n\nint\n_libssh2_wincng_key_sha1_verify(_libssh2_wincng_key_ctx *ctx,\n                                const unsigned char *sig,\n                                unsigned long sig_len,\n                                const unsigned char *m,\n                                unsigned long m_len,\n                                unsigned long flags)\n{\n    BCRYPT_PKCS1_PADDING_INFO paddingInfoPKCS1;\n    void *pPaddingInfo;\n    unsigned char *data, *hash;\n    unsigned long datalen, hashlen;\n    int ret;\n\n    datalen = m_len;\n    data = malloc(datalen);\n    if(!data) {\n        return -1;\n    }\n\n    hashlen = SHA_DIGEST_LENGTH;\n    hash = malloc(hashlen);\n    if(!hash) {\n        free(data);\n        return -1;\n    }\n\n    memcpy(data, m, datalen);\n\n    ret = _libssh2_wincng_hash(data, datalen,\n                               _libssh2_wincng.hAlgHashSHA1,\n                               hash, hashlen);\n\n    _libssh2_wincng_safe_free(data, datalen);\n\n    if(ret) {\n        _libssh2_wincng_safe_free(hash, hashlen);\n        return -1;\n    }\n\n    datalen = sig_len;\n    data = malloc(datalen);\n    if(!data) {\n        _libssh2_wincng_safe_free(hash, hashlen);\n        return -1;\n    }\n\n    if(flags & BCRYPT_PAD_PKCS1) {\n        paddingInfoPKCS1.pszAlgId = BCRYPT_SHA1_ALGORITHM;\n        pPaddingInfo = &paddingInfoPKCS1;\n    }\n    else\n        pPaddingInfo = NULL;\n\n    memcpy(data, sig, datalen);\n\n    ret = BCryptVerifySignature(ctx->hKey, pPaddingInfo,\n                                hash, hashlen, data, datalen, flags);\n\n    _libssh2_wincng_safe_free(hash, hashlen);\n    _libssh2_wincng_safe_free(data, datalen);\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\n#ifdef HAVE_LIBCRYPT32\nstatic int\n_libssh2_wincng_load_pem(LIBSSH2_SESSION *session,\n                         const char *filename,\n                         const char *passphrase,\n                         const char *headerbegin,\n                         const char *headerend,\n                         unsigned char **data,\n                         unsigned int *datalen)\n{\n    FILE *fp;\n    int ret;\n\n    fp = fopen(filename, FOPEN_READTEXT);\n    if(!fp) {\n        return -1;\n    }\n\n    ret = _libssh2_pem_parse(session, headerbegin, headerend,\n                             passphrase,\n                             fp, data, datalen);\n\n    fclose(fp);\n\n    return ret;\n}\n\nstatic int\n_libssh2_wincng_load_private(LIBSSH2_SESSION *session,\n                             const char *filename,\n                             const char *passphrase,\n                             unsigned char **ppbEncoded,\n                             unsigned long *pcbEncoded,\n                             int tryLoadRSA, int tryLoadDSA)\n{\n    unsigned char *data = NULL;\n    unsigned int datalen = 0;\n    int ret = -1;\n\n    if(ret && tryLoadRSA) {\n        ret = _libssh2_wincng_load_pem(session, filename, passphrase,\n                                       PEM_RSA_HEADER, PEM_RSA_FOOTER,\n                                       &data, &datalen);\n    }\n\n    if(ret && tryLoadDSA) {\n        ret = _libssh2_wincng_load_pem(session, filename, passphrase,\n                                       PEM_DSA_HEADER, PEM_DSA_FOOTER,\n                                       &data, &datalen);\n    }\n\n    if(!ret) {\n        *ppbEncoded = data;\n        *pcbEncoded = datalen;\n    }\n\n    return ret;\n}\n\nstatic int\n_libssh2_wincng_load_private_memory(LIBSSH2_SESSION *session,\n                                    const char *privatekeydata,\n                                    size_t privatekeydata_len,\n                                    const char *passphrase,\n                                    unsigned char **ppbEncoded,\n                                    unsigned long *pcbEncoded,\n                                    int tryLoadRSA, int tryLoadDSA)\n{\n    unsigned char *data = NULL;\n    unsigned int datalen = 0;\n    int ret = -1;\n\n    (void)passphrase;\n\n    if(ret && tryLoadRSA) {\n        ret = _libssh2_pem_parse_memory(session,\n                                        PEM_RSA_HEADER, PEM_RSA_FOOTER,\n                                        privatekeydata, privatekeydata_len,\n                                        &data, &datalen);\n    }\n\n    if(ret && tryLoadDSA) {\n        ret = _libssh2_pem_parse_memory(session,\n                                        PEM_DSA_HEADER, PEM_DSA_FOOTER,\n                                        privatekeydata, privatekeydata_len,\n                                        &data, &datalen);\n    }\n\n    if(!ret) {\n        *ppbEncoded = data;\n        *pcbEncoded = datalen;\n    }\n\n    return ret;\n}\n\nstatic int\n_libssh2_wincng_asn_decode(unsigned char *pbEncoded,\n                           unsigned long cbEncoded,\n                           LPCSTR lpszStructType,\n                           unsigned char **ppbDecoded,\n                           unsigned long *pcbDecoded)\n{\n    unsigned char *pbDecoded = NULL;\n    unsigned long cbDecoded = 0;\n    int ret;\n\n    ret = CryptDecodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,\n                              lpszStructType,\n                              pbEncoded, cbEncoded, 0, NULL,\n                              NULL, &cbDecoded);\n    if(!ret) {\n        return -1;\n    }\n\n    pbDecoded = malloc(cbDecoded);\n    if(!pbDecoded) {\n        return -1;\n    }\n\n    ret = CryptDecodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,\n                              lpszStructType,\n                              pbEncoded, cbEncoded, 0, NULL,\n                              pbDecoded, &cbDecoded);\n    if(!ret) {\n        _libssh2_wincng_safe_free(pbDecoded, cbDecoded);\n        return -1;\n    }\n\n\n    *ppbDecoded = pbDecoded;\n    *pcbDecoded = cbDecoded;\n\n    return 0;\n}\n\nstatic int\n_libssh2_wincng_bn_ltob(unsigned char *pbInput,\n                        unsigned long cbInput,\n                        unsigned char **ppbOutput,\n                        unsigned long *pcbOutput)\n{\n    unsigned char *pbOutput;\n    unsigned long cbOutput, index, offset, length;\n\n    if(cbInput < 1) {\n        return 0;\n    }\n\n    offset = 0;\n    length = cbInput - 1;\n    cbOutput = cbInput;\n    if(pbInput[length] & (1 << 7)) {\n        offset++;\n        cbOutput += offset;\n    }\n\n    pbOutput = (unsigned char *)malloc(cbOutput);\n    if(!pbOutput) {\n        return -1;\n    }\n\n    pbOutput[0] = 0;\n    for(index = 0; ((index + offset) < cbOutput)\n                    && (index < cbInput); index++) {\n        pbOutput[index + offset] = pbInput[length - index];\n    }\n\n\n    *ppbOutput = pbOutput;\n    *pcbOutput = cbOutput;\n\n    return 0;\n}\n\nstatic int\n_libssh2_wincng_asn_decode_bn(unsigned char *pbEncoded,\n                              unsigned long cbEncoded,\n                              unsigned char **ppbDecoded,\n                              unsigned long *pcbDecoded)\n{\n    unsigned char *pbDecoded = NULL, *pbInteger;\n    unsigned long cbDecoded = 0, cbInteger;\n    int ret;\n\n    ret = _libssh2_wincng_asn_decode(pbEncoded, cbEncoded,\n                                     X509_MULTI_BYTE_UINT,\n                                     &pbInteger, &cbInteger);\n    if(!ret) {\n        ret = _libssh2_wincng_bn_ltob(((PCRYPT_DATA_BLOB)pbInteger)->pbData,\n                                      ((PCRYPT_DATA_BLOB)pbInteger)->cbData,\n                                      &pbDecoded, &cbDecoded);\n        if(!ret) {\n            *ppbDecoded = pbDecoded;\n            *pcbDecoded = cbDecoded;\n        }\n        _libssh2_wincng_safe_free(pbInteger, cbInteger);\n    }\n\n    return ret;\n}\n\nstatic int\n_libssh2_wincng_asn_decode_bns(unsigned char *pbEncoded,\n                               unsigned long cbEncoded,\n                               unsigned char ***prpbDecoded,\n                               unsigned long **prcbDecoded,\n                               unsigned long *pcbCount)\n{\n    PCRYPT_DER_BLOB pBlob;\n    unsigned char *pbDecoded, **rpbDecoded;\n    unsigned long cbDecoded, *rcbDecoded, index, length;\n    int ret;\n\n    ret = _libssh2_wincng_asn_decode(pbEncoded, cbEncoded,\n                                     X509_SEQUENCE_OF_ANY,\n                                     &pbDecoded, &cbDecoded);\n    if(!ret) {\n        length = ((PCRYPT_DATA_BLOB)pbDecoded)->cbData;\n\n        rpbDecoded = malloc(sizeof(PBYTE) * length);\n        if(rpbDecoded) {\n            rcbDecoded = malloc(sizeof(DWORD) * length);\n            if(rcbDecoded) {\n                for(index = 0; index < length; index++) {\n                    pBlob = &((PCRYPT_DER_BLOB)\n                              ((PCRYPT_DATA_BLOB)pbDecoded)->pbData)[index];\n                    ret = _libssh2_wincng_asn_decode_bn(pBlob->pbData,\n                                                        pBlob->cbData,\n                                                        &rpbDecoded[index],\n                                                        &rcbDecoded[index]);\n                    if(ret)\n                        break;\n                }\n\n                if(!ret) {\n                    *prpbDecoded = rpbDecoded;\n                    *prcbDecoded = rcbDecoded;\n                    *pcbCount = length;\n                }\n                else {\n                    for(length = 0; length < index; length++) {\n                        _libssh2_wincng_safe_free(rpbDecoded[length],\n                                                  rcbDecoded[length]);\n                        rpbDecoded[length] = NULL;\n                        rcbDecoded[length] = 0;\n                    }\n                    free(rpbDecoded);\n                    free(rcbDecoded);\n                }\n            }\n            else {\n                free(rpbDecoded);\n                ret = -1;\n            }\n        }\n        else {\n            ret = -1;\n        }\n\n        _libssh2_wincng_safe_free(pbDecoded, cbDecoded);\n    }\n\n    return ret;\n}\n#endif /* HAVE_LIBCRYPT32 */\n\nstatic unsigned long\n_libssh2_wincng_bn_size(const unsigned char *bignum,\n                        unsigned long length)\n{\n    unsigned long offset;\n\n    if(!bignum)\n        return 0;\n\n    length--;\n\n    offset = 0;\n    while(!(*(bignum + offset)) && (offset < length))\n        offset++;\n\n    length++;\n\n    return length - offset;\n}\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: RSA functions\n */\n\nint\n_libssh2_wincng_rsa_new(libssh2_rsa_ctx **rsa,\n                        const unsigned char *edata,\n                        unsigned long elen,\n                        const unsigned char *ndata,\n                        unsigned long nlen,\n                        const unsigned char *ddata,\n                        unsigned long dlen,\n                        const unsigned char *pdata,\n                        unsigned long plen,\n                        const unsigned char *qdata,\n                        unsigned long qlen,\n                        const unsigned char *e1data,\n                        unsigned long e1len,\n                        const unsigned char *e2data,\n                        unsigned long e2len,\n                        const unsigned char *coeffdata,\n                        unsigned long coefflen)\n{\n    BCRYPT_KEY_HANDLE hKey;\n    BCRYPT_RSAKEY_BLOB *rsakey;\n    LPCWSTR lpszBlobType;\n    unsigned char *key;\n    unsigned long keylen, offset, mlen, p1len = 0, p2len = 0;\n    int ret;\n\n    mlen = max(_libssh2_wincng_bn_size(ndata, nlen),\n               _libssh2_wincng_bn_size(ddata, dlen));\n    offset = sizeof(BCRYPT_RSAKEY_BLOB);\n    keylen = offset + elen + mlen;\n    if(ddata && dlen > 0) {\n        p1len = max(_libssh2_wincng_bn_size(pdata, plen),\n                    _libssh2_wincng_bn_size(e1data, e1len));\n        p2len = max(_libssh2_wincng_bn_size(qdata, qlen),\n                    _libssh2_wincng_bn_size(e2data, e2len));\n        keylen += p1len * 3 + p2len * 2 + mlen;\n    }\n\n    key = malloc(keylen);\n    if(!key) {\n        return -1;\n    }\n\n    memset(key, 0, keylen);\n\n\n    /* https://msdn.microsoft.com/library/windows/desktop/aa375531.aspx */\n    rsakey = (BCRYPT_RSAKEY_BLOB *)key;\n    rsakey->BitLength = mlen * 8;\n    rsakey->cbPublicExp = elen;\n    rsakey->cbModulus = mlen;\n\n    memcpy(key + offset, edata, elen);\n    offset += elen;\n\n    if(nlen < mlen)\n        memcpy(key + offset + mlen - nlen, ndata, nlen);\n    else\n        memcpy(key + offset, ndata + nlen - mlen, mlen);\n\n    if(ddata && dlen > 0) {\n        offset += mlen;\n\n        if(plen < p1len)\n            memcpy(key + offset + p1len - plen, pdata, plen);\n        else\n            memcpy(key + offset, pdata + plen - p1len, p1len);\n        offset += p1len;\n\n        if(qlen < p2len)\n            memcpy(key + offset + p2len - qlen, qdata, qlen);\n        else\n            memcpy(key + offset, qdata + qlen - p2len, p2len);\n        offset += p2len;\n\n        if(e1len < p1len)\n            memcpy(key + offset + p1len - e1len, e1data, e1len);\n        else\n            memcpy(key + offset, e1data + e1len - p1len, p1len);\n        offset += p1len;\n\n        if(e2len < p2len)\n            memcpy(key + offset + p2len - e2len, e2data, e2len);\n        else\n            memcpy(key + offset, e2data + e2len - p2len, p2len);\n        offset += p2len;\n\n        if(coefflen < p1len)\n            memcpy(key + offset + p1len - coefflen, coeffdata, coefflen);\n        else\n            memcpy(key + offset, coeffdata + coefflen - p1len, p1len);\n        offset += p1len;\n\n        if(dlen < mlen)\n            memcpy(key + offset + mlen - dlen, ddata, dlen);\n        else\n            memcpy(key + offset, ddata + dlen - mlen, mlen);\n\n        lpszBlobType = BCRYPT_RSAFULLPRIVATE_BLOB;\n        rsakey->Magic = BCRYPT_RSAFULLPRIVATE_MAGIC;\n        rsakey->cbPrime1 = p1len;\n        rsakey->cbPrime2 = p2len;\n    }\n    else {\n        lpszBlobType = BCRYPT_RSAPUBLIC_BLOB;\n        rsakey->Magic = BCRYPT_RSAPUBLIC_MAGIC;\n        rsakey->cbPrime1 = 0;\n        rsakey->cbPrime2 = 0;\n    }\n\n\n    ret = BCryptImportKeyPair(_libssh2_wincng.hAlgRSA, NULL, lpszBlobType,\n                              &hKey, key, keylen, 0);\n    if(!BCRYPT_SUCCESS(ret)) {\n        _libssh2_wincng_safe_free(key, keylen);\n        return -1;\n    }\n\n\n    *rsa = malloc(sizeof(libssh2_rsa_ctx));\n    if(!(*rsa)) {\n        BCryptDestroyKey(hKey);\n        _libssh2_wincng_safe_free(key, keylen);\n        return -1;\n    }\n\n    (*rsa)->hKey = hKey;\n    (*rsa)->pbKeyObject = key;\n    (*rsa)->cbKeyObject = keylen;\n\n    return 0;\n}\n\n#ifdef HAVE_LIBCRYPT32\nstatic int\n_libssh2_wincng_rsa_new_private_parse(libssh2_rsa_ctx **rsa,\n                                      LIBSSH2_SESSION *session,\n                                      unsigned char *pbEncoded,\n                                      unsigned long cbEncoded)\n{\n    BCRYPT_KEY_HANDLE hKey;\n    unsigned char *pbStructInfo;\n    unsigned long cbStructInfo;\n    int ret;\n\n    (void)session;\n\n    ret = _libssh2_wincng_asn_decode(pbEncoded, cbEncoded,\n                                     PKCS_RSA_PRIVATE_KEY,\n                                     &pbStructInfo, &cbStructInfo);\n\n    _libssh2_wincng_safe_free(pbEncoded, cbEncoded);\n\n    if(ret) {\n        return -1;\n    }\n\n\n    ret = BCryptImportKeyPair(_libssh2_wincng.hAlgRSA, NULL,\n                              LEGACY_RSAPRIVATE_BLOB, &hKey,\n                              pbStructInfo, cbStructInfo, 0);\n    if(!BCRYPT_SUCCESS(ret)) {\n        _libssh2_wincng_safe_free(pbStructInfo, cbStructInfo);\n        return -1;\n    }\n\n\n    *rsa = malloc(sizeof(libssh2_rsa_ctx));\n    if(!(*rsa)) {\n        BCryptDestroyKey(hKey);\n        _libssh2_wincng_safe_free(pbStructInfo, cbStructInfo);\n        return -1;\n    }\n\n    (*rsa)->hKey = hKey;\n    (*rsa)->pbKeyObject = pbStructInfo;\n    (*rsa)->cbKeyObject = cbStructInfo;\n\n    return 0;\n}\n#endif /* HAVE_LIBCRYPT32 */\n\nint\n_libssh2_wincng_rsa_new_private(libssh2_rsa_ctx **rsa,\n                                LIBSSH2_SESSION *session,\n                                const char *filename,\n                                const unsigned char *passphrase)\n{\n#ifdef HAVE_LIBCRYPT32\n    unsigned char *pbEncoded;\n    unsigned long cbEncoded;\n    int ret;\n\n    (void)session;\n\n    ret = _libssh2_wincng_load_private(session, filename,\n                                       (const char *)passphrase,\n                                       &pbEncoded, &cbEncoded, 1, 0);\n    if(ret) {\n        return -1;\n    }\n\n    return _libssh2_wincng_rsa_new_private_parse(rsa, session,\n                                                 pbEncoded, cbEncoded);\n#else\n    (void)rsa;\n    (void)filename;\n    (void)passphrase;\n\n    return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                          \"Unable to load RSA key from private key file: \"\n                          \"Method unsupported in Windows CNG backend\");\n#endif /* HAVE_LIBCRYPT32 */\n}\n\nint\n_libssh2_wincng_rsa_new_private_frommemory(libssh2_rsa_ctx **rsa,\n                                           LIBSSH2_SESSION *session,\n                                           const char *filedata,\n                                           size_t filedata_len,\n                                           unsigned const char *passphrase)\n{\n#ifdef HAVE_LIBCRYPT32\n    unsigned char *pbEncoded;\n    unsigned long cbEncoded;\n    int ret;\n\n    (void)session;\n\n    ret = _libssh2_wincng_load_private_memory(session, filedata, filedata_len,\n                                              (const char *)passphrase,\n                                              &pbEncoded, &cbEncoded, 1, 0);\n    if(ret) {\n        return -1;\n    }\n\n    return _libssh2_wincng_rsa_new_private_parse(rsa, session,\n                                                 pbEncoded, cbEncoded);\n#else\n    (void)rsa;\n    (void)filedata;\n    (void)filedata_len;\n    (void)passphrase;\n\n    return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                          \"Unable to extract private key from memory: \"\n                          \"Method unsupported in Windows CNG backend\");\n#endif /* HAVE_LIBCRYPT32 */\n}\n\nint\n_libssh2_wincng_rsa_sha1_verify(libssh2_rsa_ctx *rsa,\n                                const unsigned char *sig,\n                                unsigned long sig_len,\n                                const unsigned char *m,\n                                unsigned long m_len)\n{\n    return _libssh2_wincng_key_sha1_verify(rsa, sig, sig_len, m, m_len,\n                                           BCRYPT_PAD_PKCS1);\n}\n\nint\n_libssh2_wincng_rsa_sha1_sign(LIBSSH2_SESSION *session,\n                              libssh2_rsa_ctx *rsa,\n                              const unsigned char *hash,\n                              size_t hash_len,\n                              unsigned char **signature,\n                              size_t *signature_len)\n{\n    BCRYPT_PKCS1_PADDING_INFO paddingInfo;\n    unsigned char *data, *sig;\n    unsigned long cbData, datalen, siglen;\n    int ret;\n\n    datalen = (unsigned long)hash_len;\n    data = malloc(datalen);\n    if(!data) {\n        return -1;\n    }\n\n    paddingInfo.pszAlgId = BCRYPT_SHA1_ALGORITHM;\n\n    memcpy(data, hash, datalen);\n\n    ret = BCryptSignHash(rsa->hKey, &paddingInfo,\n                         data, datalen, NULL, 0,\n                         &cbData, BCRYPT_PAD_PKCS1);\n    if(BCRYPT_SUCCESS(ret)) {\n        siglen = cbData;\n        sig = LIBSSH2_ALLOC(session, siglen);\n        if(sig) {\n            ret = BCryptSignHash(rsa->hKey, &paddingInfo,\n                                 data, datalen, sig, siglen,\n                                 &cbData, BCRYPT_PAD_PKCS1);\n            if(BCRYPT_SUCCESS(ret)) {\n                *signature_len = siglen;\n                *signature = sig;\n            }\n            else {\n                LIBSSH2_FREE(session, sig);\n            }\n        }\n        else\n            ret = STATUS_NO_MEMORY;\n    }\n\n    _libssh2_wincng_safe_free(data, datalen);\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\nvoid\n_libssh2_wincng_rsa_free(libssh2_rsa_ctx *rsa)\n{\n    if(!rsa)\n        return;\n\n    BCryptDestroyKey(rsa->hKey);\n    rsa->hKey = NULL;\n\n    _libssh2_wincng_safe_free(rsa->pbKeyObject, rsa->cbKeyObject);\n    _libssh2_wincng_safe_free(rsa, sizeof(libssh2_rsa_ctx));\n}\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: DSA functions\n */\n\n#if LIBSSH2_DSA\nint\n_libssh2_wincng_dsa_new(libssh2_dsa_ctx **dsa,\n                        const unsigned char *pdata,\n                        unsigned long plen,\n                        const unsigned char *qdata,\n                        unsigned long qlen,\n                        const unsigned char *gdata,\n                        unsigned long glen,\n                        const unsigned char *ydata,\n                        unsigned long ylen,\n                        const unsigned char *xdata,\n                        unsigned long xlen)\n{\n    BCRYPT_KEY_HANDLE hKey;\n    BCRYPT_DSA_KEY_BLOB *dsakey;\n    LPCWSTR lpszBlobType;\n    unsigned char *key;\n    unsigned long keylen, offset, length;\n    int ret;\n\n    length = max(max(_libssh2_wincng_bn_size(pdata, plen),\n                     _libssh2_wincng_bn_size(gdata, glen)),\n                 _libssh2_wincng_bn_size(ydata, ylen));\n    offset = sizeof(BCRYPT_DSA_KEY_BLOB);\n    keylen = offset + length * 3;\n    if(xdata && xlen > 0)\n        keylen += 20;\n\n    key = malloc(keylen);\n    if(!key) {\n        return -1;\n    }\n\n    memset(key, 0, keylen);\n\n\n    /* https://msdn.microsoft.com/library/windows/desktop/aa833126.aspx */\n    dsakey = (BCRYPT_DSA_KEY_BLOB *)key;\n    dsakey->cbKey = length;\n\n    memset(dsakey->Count, -1, sizeof(dsakey->Count));\n    memset(dsakey->Seed, -1, sizeof(dsakey->Seed));\n\n    if(qlen < 20)\n        memcpy(dsakey->q + 20 - qlen, qdata, qlen);\n    else\n        memcpy(dsakey->q, qdata + qlen - 20, 20);\n\n    if(plen < length)\n        memcpy(key + offset + length - plen, pdata, plen);\n    else\n        memcpy(key + offset, pdata + plen - length, length);\n    offset += length;\n\n    if(glen < length)\n        memcpy(key + offset + length - glen, gdata, glen);\n    else\n        memcpy(key + offset, gdata + glen - length, length);\n    offset += length;\n\n    if(ylen < length)\n        memcpy(key + offset + length - ylen, ydata, ylen);\n    else\n        memcpy(key + offset, ydata + ylen - length, length);\n\n    if(xdata && xlen > 0) {\n        offset += length;\n\n        if(xlen < 20)\n            memcpy(key + offset + 20 - xlen, xdata, xlen);\n        else\n            memcpy(key + offset, xdata + xlen - 20, 20);\n\n        lpszBlobType = BCRYPT_DSA_PRIVATE_BLOB;\n        dsakey->dwMagic = BCRYPT_DSA_PRIVATE_MAGIC;\n    }\n    else {\n        lpszBlobType = BCRYPT_DSA_PUBLIC_BLOB;\n        dsakey->dwMagic = BCRYPT_DSA_PUBLIC_MAGIC;\n    }\n\n\n    ret = BCryptImportKeyPair(_libssh2_wincng.hAlgDSA, NULL, lpszBlobType,\n                              &hKey, key, keylen, 0);\n    if(!BCRYPT_SUCCESS(ret)) {\n        _libssh2_wincng_safe_free(key, keylen);\n        return -1;\n    }\n\n\n    *dsa = malloc(sizeof(libssh2_dsa_ctx));\n    if(!(*dsa)) {\n        BCryptDestroyKey(hKey);\n        _libssh2_wincng_safe_free(key, keylen);\n        return -1;\n    }\n\n    (*dsa)->hKey = hKey;\n    (*dsa)->pbKeyObject = key;\n    (*dsa)->cbKeyObject = keylen;\n\n    return 0;\n}\n\n#ifdef HAVE_LIBCRYPT32\nstatic int\n_libssh2_wincng_dsa_new_private_parse(libssh2_dsa_ctx **dsa,\n                                      LIBSSH2_SESSION *session,\n                                      unsigned char *pbEncoded,\n                                      unsigned long cbEncoded)\n{\n    unsigned char **rpbDecoded;\n    unsigned long *rcbDecoded, index, length;\n    int ret;\n\n    (void)session;\n\n    ret = _libssh2_wincng_asn_decode_bns(pbEncoded, cbEncoded,\n                                         &rpbDecoded, &rcbDecoded, &length);\n\n    _libssh2_wincng_safe_free(pbEncoded, cbEncoded);\n\n    if(ret) {\n        return -1;\n    }\n\n\n    if(length == 6) {\n        ret = _libssh2_wincng_dsa_new(dsa,\n                                      rpbDecoded[1], rcbDecoded[1],\n                                      rpbDecoded[2], rcbDecoded[2],\n                                      rpbDecoded[3], rcbDecoded[3],\n                                      rpbDecoded[4], rcbDecoded[4],\n                                      rpbDecoded[5], rcbDecoded[5]);\n    }\n    else {\n        ret = -1;\n    }\n\n    for(index = 0; index < length; index++) {\n        _libssh2_wincng_safe_free(rpbDecoded[index], rcbDecoded[index]);\n        rpbDecoded[index] = NULL;\n        rcbDecoded[index] = 0;\n    }\n\n    free(rpbDecoded);\n    free(rcbDecoded);\n\n    return ret;\n}\n#endif /* HAVE_LIBCRYPT32 */\n\nint\n_libssh2_wincng_dsa_new_private(libssh2_dsa_ctx **dsa,\n                                LIBSSH2_SESSION *session,\n                                const char *filename,\n                                const unsigned char *passphrase)\n{\n#ifdef HAVE_LIBCRYPT32\n    unsigned char *pbEncoded;\n    unsigned long cbEncoded;\n    int ret;\n\n    ret = _libssh2_wincng_load_private(session, filename,\n                                       (const char *)passphrase,\n                                       &pbEncoded, &cbEncoded, 0, 1);\n    if(ret) {\n        return -1;\n    }\n\n    return _libssh2_wincng_dsa_new_private_parse(dsa, session,\n                                                 pbEncoded, cbEncoded);\n#else\n    (void)dsa;\n    (void)filename;\n    (void)passphrase;\n\n    return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                          \"Unable to load DSA key from private key file: \"\n                          \"Method unsupported in Windows CNG backend\");\n#endif /* HAVE_LIBCRYPT32 */\n}\n\nint\n_libssh2_wincng_dsa_new_private_frommemory(libssh2_dsa_ctx **dsa,\n                                           LIBSSH2_SESSION *session,\n                                           const char *filedata,\n                                           size_t filedata_len,\n                                           unsigned const char *passphrase)\n{\n#ifdef HAVE_LIBCRYPT32\n    unsigned char *pbEncoded;\n    unsigned long cbEncoded;\n    int ret;\n\n    ret = _libssh2_wincng_load_private_memory(session, filedata, filedata_len,\n                                              (const char *)passphrase,\n                                              &pbEncoded, &cbEncoded, 0, 1);\n    if(ret) {\n        return -1;\n    }\n\n    return _libssh2_wincng_dsa_new_private_parse(dsa, session,\n                                                 pbEncoded, cbEncoded);\n#else\n    (void)dsa;\n    (void)filedata;\n    (void)filedata_len;\n    (void)passphrase;\n\n    return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n                          \"Unable to extract private key from memory: \"\n                          \"Method unsupported in Windows CNG backend\");\n#endif /* HAVE_LIBCRYPT32 */\n}\n\nint\n_libssh2_wincng_dsa_sha1_verify(libssh2_dsa_ctx *dsa,\n                                const unsigned char *sig_fixed,\n                                const unsigned char *m,\n                                unsigned long m_len)\n{\n    return _libssh2_wincng_key_sha1_verify(dsa, sig_fixed, 40, m, m_len, 0);\n}\n\nint\n_libssh2_wincng_dsa_sha1_sign(libssh2_dsa_ctx *dsa,\n                              const unsigned char *hash,\n                              unsigned long hash_len,\n                              unsigned char *sig_fixed)\n{\n    unsigned char *data, *sig;\n    unsigned long cbData, datalen, siglen;\n    int ret;\n\n    datalen = hash_len;\n    data = malloc(datalen);\n    if(!data) {\n        return -1;\n    }\n\n    memcpy(data, hash, datalen);\n\n    ret = BCryptSignHash(dsa->hKey, NULL, data, datalen,\n                         NULL, 0, &cbData, 0);\n    if(BCRYPT_SUCCESS(ret)) {\n        siglen = cbData;\n        if(siglen == 40) {\n            sig = malloc(siglen);\n            if(sig) {\n                ret = BCryptSignHash(dsa->hKey, NULL, data, datalen,\n                                     sig, siglen, &cbData, 0);\n                if(BCRYPT_SUCCESS(ret)) {\n                    memcpy(sig_fixed, sig, siglen);\n                }\n\n                _libssh2_wincng_safe_free(sig, siglen);\n            }\n            else\n                ret = STATUS_NO_MEMORY;\n        }\n        else\n            ret = STATUS_NO_MEMORY;\n    }\n\n    _libssh2_wincng_safe_free(data, datalen);\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\nvoid\n_libssh2_wincng_dsa_free(libssh2_dsa_ctx *dsa)\n{\n    if(!dsa)\n        return;\n\n    BCryptDestroyKey(dsa->hKey);\n    dsa->hKey = NULL;\n\n    _libssh2_wincng_safe_free(dsa->pbKeyObject, dsa->cbKeyObject);\n    _libssh2_wincng_safe_free(dsa, sizeof(libssh2_dsa_ctx));\n}\n#endif\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Key functions\n */\n\n#ifdef HAVE_LIBCRYPT32\nstatic unsigned long\n_libssh2_wincng_pub_priv_write(unsigned char *key,\n                               unsigned long offset,\n                               const unsigned char *bignum,\n                               const unsigned long length)\n{\n    _libssh2_htonu32(key + offset, length);\n    offset += 4;\n\n    memcpy(key + offset, bignum, length);\n    offset += length;\n\n    return offset;\n}\n\nstatic int\n_libssh2_wincng_pub_priv_keyfile_parse(LIBSSH2_SESSION *session,\n                                       unsigned char **method,\n                                       size_t *method_len,\n                                       unsigned char **pubkeydata,\n                                       size_t *pubkeydata_len,\n                                       unsigned char *pbEncoded,\n                                       unsigned long cbEncoded)\n{\n    unsigned char **rpbDecoded;\n    unsigned long *rcbDecoded;\n    unsigned char *key = NULL, *mth = NULL;\n    unsigned long keylen = 0, mthlen = 0;\n    unsigned long index, offset, length;\n    int ret;\n\n    ret = _libssh2_wincng_asn_decode_bns(pbEncoded, cbEncoded,\n                                         &rpbDecoded, &rcbDecoded, &length);\n\n    _libssh2_wincng_safe_free(pbEncoded, cbEncoded);\n\n    if(ret) {\n        return -1;\n    }\n\n\n    if(length == 9) { /* private RSA key */\n        mthlen = 7;\n        mth = LIBSSH2_ALLOC(session, mthlen);\n        if(mth) {\n            memcpy(mth, \"ssh-rsa\", mthlen);\n        }\n        else {\n            ret = -1;\n        }\n\n\n        keylen = 4 + mthlen + 4 + rcbDecoded[2] + 4 + rcbDecoded[1];\n        key = LIBSSH2_ALLOC(session, keylen);\n        if(key) {\n            offset = _libssh2_wincng_pub_priv_write(key, 0, mth, mthlen);\n\n            offset = _libssh2_wincng_pub_priv_write(key, offset,\n                                                    rpbDecoded[2],\n                                                    rcbDecoded[2]);\n\n            _libssh2_wincng_pub_priv_write(key, offset,\n                                           rpbDecoded[1],\n                                           rcbDecoded[1]);\n        }\n        else {\n            ret = -1;\n        }\n\n    }\n    else if(length == 6) { /* private DSA key */\n        mthlen = 7;\n        mth = LIBSSH2_ALLOC(session, mthlen);\n        if(mth) {\n            memcpy(mth, \"ssh-dss\", mthlen);\n        }\n        else {\n            ret = -1;\n        }\n\n        keylen = 4 + mthlen + 4 + rcbDecoded[1] + 4 + rcbDecoded[2]\n                            + 4 + rcbDecoded[3] + 4 + rcbDecoded[4];\n        key = LIBSSH2_ALLOC(session, keylen);\n        if(key) {\n            offset = _libssh2_wincng_pub_priv_write(key, 0, mth, mthlen);\n\n            offset = _libssh2_wincng_pub_priv_write(key, offset,\n                                                    rpbDecoded[1],\n                                                    rcbDecoded[1]);\n\n            offset = _libssh2_wincng_pub_priv_write(key, offset,\n                                                    rpbDecoded[2],\n                                                    rcbDecoded[2]);\n\n            offset = _libssh2_wincng_pub_priv_write(key, offset,\n                                                    rpbDecoded[3],\n                                                    rcbDecoded[3]);\n\n            _libssh2_wincng_pub_priv_write(key, offset,\n                                           rpbDecoded[4],\n                                           rcbDecoded[4]);\n        }\n        else {\n            ret = -1;\n        }\n\n    }\n    else {\n        ret = -1;\n    }\n\n\n    for(index = 0; index < length; index++) {\n        _libssh2_wincng_safe_free(rpbDecoded[index], rcbDecoded[index]);\n        rpbDecoded[index] = NULL;\n        rcbDecoded[index] = 0;\n    }\n\n    free(rpbDecoded);\n    free(rcbDecoded);\n\n\n    if(ret) {\n        if(mth)\n            LIBSSH2_FREE(session, mth);\n        if(key)\n            LIBSSH2_FREE(session, key);\n    }\n    else {\n        *method = mth;\n        *method_len = mthlen;\n        *pubkeydata = key;\n        *pubkeydata_len = keylen;\n    }\n\n    return ret;\n}\n#endif /* HAVE_LIBCRYPT32 */\n\nint\n_libssh2_wincng_pub_priv_keyfile(LIBSSH2_SESSION *session,\n                                 unsigned char **method,\n                                 size_t *method_len,\n                                 unsigned char **pubkeydata,\n                                 size_t *pubkeydata_len,\n                                 const char *privatekey,\n                                 const char *passphrase)\n{\n#ifdef HAVE_LIBCRYPT32\n    unsigned char *pbEncoded;\n    unsigned long cbEncoded;\n    int ret;\n\n    ret = _libssh2_wincng_load_private(session, privatekey, passphrase,\n                                       &pbEncoded, &cbEncoded, 1, 1);\n    if(ret) {\n        return -1;\n    }\n\n    return _libssh2_wincng_pub_priv_keyfile_parse(session, method, method_len,\n                                                  pubkeydata, pubkeydata_len,\n                                                  pbEncoded, cbEncoded);\n#else\n    (void)method;\n    (void)method_len;\n    (void)pubkeydata;\n    (void)pubkeydata_len;\n    (void)privatekey;\n    (void)passphrase;\n\n    return _libssh2_error(session, LIBSSH2_ERROR_FILE,\n                          \"Unable to load public key from private key file: \"\n                          \"Method unsupported in Windows CNG backend\");\n#endif /* HAVE_LIBCRYPT32 */\n}\n\nint\n_libssh2_wincng_pub_priv_keyfilememory(LIBSSH2_SESSION *session,\n                                       unsigned char **method,\n                                       size_t *method_len,\n                                       unsigned char **pubkeydata,\n                                       size_t *pubkeydata_len,\n                                       const char *privatekeydata,\n                                       size_t privatekeydata_len,\n                                       const char *passphrase)\n{\n#ifdef HAVE_LIBCRYPT32\n    unsigned char *pbEncoded;\n    unsigned long cbEncoded;\n    int ret;\n\n    ret = _libssh2_wincng_load_private_memory(session, privatekeydata,\n                                              privatekeydata_len, passphrase,\n                                              &pbEncoded, &cbEncoded, 1, 1);\n    if(ret) {\n        return -1;\n    }\n\n    return _libssh2_wincng_pub_priv_keyfile_parse(session, method, method_len,\n                                                  pubkeydata, pubkeydata_len,\n                                                  pbEncoded, cbEncoded);\n#else\n    (void)method;\n    (void)method_len;\n    (void)pubkeydata_len;\n    (void)pubkeydata;\n    (void)privatekeydata;\n    (void)privatekeydata_len;\n    (void)passphrase;\n\n    return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED,\n               \"Unable to extract public key from private key in memory: \"\n               \"Method unsupported in Windows CNG backend\");\n#endif /* HAVE_LIBCRYPT32 */\n}\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Cipher functions\n */\n\nint\n_libssh2_wincng_cipher_init(_libssh2_cipher_ctx *ctx,\n                            _libssh2_cipher_type(type),\n                            unsigned char *iv,\n                            unsigned char *secret,\n                            int encrypt)\n{\n    BCRYPT_KEY_HANDLE hKey;\n    BCRYPT_KEY_DATA_BLOB_HEADER *header;\n    unsigned char *pbKeyObject, *pbIV, *key, *pbCtr, *pbIVCopy;\n    unsigned long dwKeyObject, dwIV, dwCtrLength, dwBlockLength,\n                  cbData, keylen;\n    int ret;\n\n    (void)encrypt;\n\n    ret = BCryptGetProperty(*type.phAlg, BCRYPT_OBJECT_LENGTH,\n                            (unsigned char *)&dwKeyObject,\n                            sizeof(dwKeyObject),\n                            &cbData, 0);\n    if(!BCRYPT_SUCCESS(ret)) {\n        return -1;\n    }\n\n    ret = BCryptGetProperty(*type.phAlg, BCRYPT_BLOCK_LENGTH,\n                            (unsigned char *)&dwBlockLength,\n                            sizeof(dwBlockLength),\n                            &cbData, 0);\n    if(!BCRYPT_SUCCESS(ret)) {\n        return -1;\n    }\n\n    pbKeyObject = malloc(dwKeyObject);\n    if(!pbKeyObject) {\n        return -1;\n    }\n\n\n    keylen = sizeof(BCRYPT_KEY_DATA_BLOB_HEADER) + type.dwKeyLength;\n    key = malloc(keylen);\n    if(!key) {\n        free(pbKeyObject);\n        return -1;\n    }\n\n\n    header = (BCRYPT_KEY_DATA_BLOB_HEADER *)key;\n    header->dwMagic = BCRYPT_KEY_DATA_BLOB_MAGIC;\n    header->dwVersion = BCRYPT_KEY_DATA_BLOB_VERSION1;\n    header->cbKeyData = type.dwKeyLength;\n\n    memcpy(key + sizeof(BCRYPT_KEY_DATA_BLOB_HEADER),\n           secret, type.dwKeyLength);\n\n    ret = BCryptImportKey(*type.phAlg, NULL, BCRYPT_KEY_DATA_BLOB, &hKey,\n                          pbKeyObject, dwKeyObject, key, keylen, 0);\n\n    _libssh2_wincng_safe_free(key, keylen);\n\n    if(!BCRYPT_SUCCESS(ret)) {\n        _libssh2_wincng_safe_free(pbKeyObject, dwKeyObject);\n        return -1;\n    }\n\n    pbIV = NULL;\n    pbCtr = NULL;\n    dwIV = 0;\n    dwCtrLength = 0;\n\n    if(type.useIV || type.ctrMode) {\n        pbIVCopy = malloc(dwBlockLength);\n        if(!pbIVCopy) {\n            BCryptDestroyKey(hKey);\n            _libssh2_wincng_safe_free(pbKeyObject, dwKeyObject);\n            return -1;\n        }\n        memcpy(pbIVCopy, iv, dwBlockLength);\n\n        if(type.ctrMode) {\n            pbCtr = pbIVCopy;\n            dwCtrLength = dwBlockLength;\n        }\n        else if(type.useIV) {\n            pbIV = pbIVCopy;\n            dwIV = dwBlockLength;\n        }\n    }\n\n    ctx->hKey = hKey;\n    ctx->pbKeyObject = pbKeyObject;\n    ctx->pbIV = pbIV;\n    ctx->pbCtr = pbCtr;\n    ctx->dwKeyObject = dwKeyObject;\n    ctx->dwIV = dwIV;\n    ctx->dwBlockLength = dwBlockLength;\n    ctx->dwCtrLength = dwCtrLength;\n\n    return 0;\n}\nint\n_libssh2_wincng_cipher_crypt(_libssh2_cipher_ctx *ctx,\n                             _libssh2_cipher_type(type),\n                             int encrypt,\n                             unsigned char *block,\n                             size_t blocklen)\n{\n    unsigned char *pbOutput, *pbInput;\n    unsigned long cbOutput, cbInput;\n    int ret;\n\n    (void)type;\n\n    cbInput = (unsigned long)blocklen;\n\n    if(type.ctrMode) {\n        pbInput = ctx->pbCtr;\n    }\n    else {\n        pbInput = block;\n    }\n\n    if(encrypt || type.ctrMode) {\n        ret = BCryptEncrypt(ctx->hKey, pbInput, cbInput, NULL,\n                            ctx->pbIV, ctx->dwIV, NULL, 0, &cbOutput, 0);\n    }\n    else {\n        ret = BCryptDecrypt(ctx->hKey, pbInput, cbInput, NULL,\n                            ctx->pbIV, ctx->dwIV, NULL, 0, &cbOutput, 0);\n    }\n    if(BCRYPT_SUCCESS(ret)) {\n        pbOutput = malloc(cbOutput);\n        if(pbOutput) {\n            if(encrypt || type.ctrMode) {\n                ret = BCryptEncrypt(ctx->hKey, pbInput, cbInput, NULL,\n                                    ctx->pbIV, ctx->dwIV,\n                                    pbOutput, cbOutput, &cbOutput, 0);\n            }\n            else {\n                ret = BCryptDecrypt(ctx->hKey, pbInput, cbInput, NULL,\n                                    ctx->pbIV, ctx->dwIV,\n                                    pbOutput, cbOutput, &cbOutput, 0);\n            }\n            if(BCRYPT_SUCCESS(ret)) {\n                if(type.ctrMode) {\n                    _libssh2_xor_data(block, block, pbOutput, blocklen);\n                    _libssh2_aes_ctr_increment(ctx->pbCtr, ctx->dwCtrLength);\n                }\n                else {\n                    memcpy(block, pbOutput, cbOutput);\n                }\n            }\n\n            _libssh2_wincng_safe_free(pbOutput, cbOutput);\n        }\n        else\n            ret = STATUS_NO_MEMORY;\n    }\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\nvoid\n_libssh2_wincng_cipher_dtor(_libssh2_cipher_ctx *ctx)\n{\n    BCryptDestroyKey(ctx->hKey);\n    ctx->hKey = NULL;\n\n    _libssh2_wincng_safe_free(ctx->pbKeyObject, ctx->dwKeyObject);\n    ctx->pbKeyObject = NULL;\n    ctx->dwKeyObject = 0;\n\n    _libssh2_wincng_safe_free(ctx->pbIV, ctx->dwBlockLength);\n    ctx->pbIV = NULL;\n    ctx->dwBlockLength = 0;\n\n    _libssh2_wincng_safe_free(ctx->pbCtr, ctx->dwCtrLength);\n    ctx->pbCtr = NULL;\n    ctx->dwCtrLength = 0;\n}\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: BigNumber functions\n */\n\n_libssh2_bn *\n_libssh2_wincng_bignum_init(void)\n{\n    _libssh2_bn *bignum;\n\n    bignum = (_libssh2_bn *)malloc(sizeof(_libssh2_bn));\n    if(bignum) {\n        bignum->bignum = NULL;\n        bignum->length = 0;\n    }\n\n    return bignum;\n}\n\nstatic int\n_libssh2_wincng_bignum_resize(_libssh2_bn *bn, unsigned long length)\n{\n    unsigned char *bignum;\n\n    if(!bn)\n        return -1;\n\n    if(length == bn->length)\n        return 0;\n\n#ifdef LIBSSH2_CLEAR_MEMORY\n    if(bn->bignum && bn->length > 0 && length < bn->length) {\n        SecureZeroMemory(bn->bignum + length, bn->length - length);\n    }\n#endif\n\n    bignum = realloc(bn->bignum, length);\n    if(!bignum)\n        return -1;\n\n    bn->bignum = bignum;\n    bn->length = length;\n\n    return 0;\n}\n\nstatic int\n_libssh2_wincng_bignum_rand(_libssh2_bn *rnd, int bits, int top, int bottom)\n{\n    unsigned char *bignum;\n    unsigned long length;\n\n    if(!rnd)\n        return -1;\n\n    length = (unsigned long)(ceil((float)bits / 8) * sizeof(unsigned char));\n    if(_libssh2_wincng_bignum_resize(rnd, length))\n        return -1;\n\n    bignum = rnd->bignum;\n\n    if(_libssh2_wincng_random(bignum, length))\n        return -1;\n\n    /* calculate significant bits in most significant byte */\n    bits %= 8;\n\n    /* fill most significant byte with zero padding */\n    bignum[0] &= (1 << (8 - bits)) - 1;\n\n    /* set some special last bits in most significant byte */\n    if(top == 0)\n        bignum[0] |= (1 << (7 - bits));\n    else if(top == 1)\n        bignum[0] |= (3 << (6 - bits));\n\n    /* make odd by setting first bit in least significant byte */\n    if(bottom)\n        bignum[length - 1] |= 1;\n\n    return 0;\n}\n\nstatic int\n_libssh2_wincng_bignum_mod_exp(_libssh2_bn *r,\n                               _libssh2_bn *a,\n                               _libssh2_bn *p,\n                               _libssh2_bn *m)\n{\n    BCRYPT_KEY_HANDLE hKey;\n    BCRYPT_RSAKEY_BLOB *rsakey;\n    unsigned char *key, *bignum;\n    unsigned long keylen, offset, length;\n    int ret;\n\n    if(!r || !a || !p || !m)\n        return -1;\n\n    offset = sizeof(BCRYPT_RSAKEY_BLOB);\n    keylen = offset + p->length + m->length;\n\n    key = malloc(keylen);\n    if(!key)\n        return -1;\n\n\n    /* https://msdn.microsoft.com/library/windows/desktop/aa375531.aspx */\n    rsakey = (BCRYPT_RSAKEY_BLOB *)key;\n    rsakey->Magic = BCRYPT_RSAPUBLIC_MAGIC;\n    rsakey->BitLength = m->length * 8;\n    rsakey->cbPublicExp = p->length;\n    rsakey->cbModulus = m->length;\n    rsakey->cbPrime1 = 0;\n    rsakey->cbPrime2 = 0;\n\n    memcpy(key + offset, p->bignum, p->length);\n    offset += p->length;\n\n    memcpy(key + offset, m->bignum, m->length);\n\n    ret = BCryptImportKeyPair(_libssh2_wincng.hAlgRSA, NULL,\n                              BCRYPT_RSAPUBLIC_BLOB, &hKey, key, keylen,\n                              BCRYPT_NO_KEY_VALIDATION);\n\n    if(BCRYPT_SUCCESS(ret)) {\n        ret = BCryptEncrypt(hKey, a->bignum, a->length, NULL, NULL, 0,\n                            NULL, 0, &length, BCRYPT_PAD_NONE);\n        if(BCRYPT_SUCCESS(ret)) {\n            if(!_libssh2_wincng_bignum_resize(r, length)) {\n                length = max(a->length, length);\n                bignum = malloc(length);\n                if(bignum) {\n                    offset = length - a->length;\n                    memset(bignum, 0, offset);\n                    memcpy(bignum + offset, a->bignum, a->length);\n\n                    ret = BCryptEncrypt(hKey, bignum, length, NULL, NULL, 0,\n                                        r->bignum, r->length, &offset,\n                                        BCRYPT_PAD_NONE);\n\n                    _libssh2_wincng_safe_free(bignum, length);\n\n                    if(BCRYPT_SUCCESS(ret)) {\n                        _libssh2_wincng_bignum_resize(r, offset);\n                    }\n                }\n                else\n                    ret = STATUS_NO_MEMORY;\n            }\n            else\n                ret = STATUS_NO_MEMORY;\n        }\n\n        BCryptDestroyKey(hKey);\n    }\n\n    _libssh2_wincng_safe_free(key, keylen);\n\n    return BCRYPT_SUCCESS(ret) ? 0 : -1;\n}\n\nint\n_libssh2_wincng_bignum_set_word(_libssh2_bn *bn, unsigned long word)\n{\n    unsigned long offset, number, bits, length;\n\n    if(!bn)\n        return -1;\n\n    bits = 0;\n    number = word;\n    while(number >>= 1)\n        bits++;\n\n    length = (unsigned long) (ceil(((double)(bits + 1)) / 8.0) *\n                              sizeof(unsigned char));\n    if(_libssh2_wincng_bignum_resize(bn, length))\n        return -1;\n\n    for(offset = 0; offset < length; offset++)\n        bn->bignum[offset] = (word >> (offset * 8)) & 0xff;\n\n    return 0;\n}\n\nunsigned long\n_libssh2_wincng_bignum_bits(const _libssh2_bn *bn)\n{\n    unsigned char number;\n    unsigned long offset, length, bits;\n\n    if(!bn)\n        return 0;\n\n    length = bn->length - 1;\n\n    offset = 0;\n    while(!(*(bn->bignum + offset)) && (offset < length))\n        offset++;\n\n    bits = (length - offset) * 8;\n    number = bn->bignum[offset];\n\n    while(number >>= 1)\n        bits++;\n\n    bits++;\n\n    return bits;\n}\n\nvoid\n_libssh2_wincng_bignum_from_bin(_libssh2_bn *bn, unsigned long len,\n                                const unsigned char *bin)\n{\n    unsigned char *bignum;\n    unsigned long offset, length, bits;\n\n    if(!bn || !bin || !len)\n        return;\n\n    if(_libssh2_wincng_bignum_resize(bn, len))\n        return;\n\n    memcpy(bn->bignum, bin, len);\n\n    bits = _libssh2_wincng_bignum_bits(bn);\n    length = (unsigned long) (ceil(((double)bits) / 8.0) *\n                              sizeof(unsigned char));\n\n    offset = bn->length - length;\n    if(offset > 0) {\n        memmove(bn->bignum, bn->bignum + offset, length);\n\n#ifdef LIBSSH2_CLEAR_MEMORY\n        SecureZeroMemory(bn->bignum + length, offset);\n#endif\n\n        bignum = realloc(bn->bignum, length);\n        if(bignum) {\n            bn->bignum = bignum;\n            bn->length = length;\n        }\n    }\n}\n\nvoid\n_libssh2_wincng_bignum_to_bin(const _libssh2_bn *bn, unsigned char *bin)\n{\n    if(bin && bn && bn->bignum && bn->length > 0) {\n        memcpy(bin, bn->bignum, bn->length);\n    }\n}\n\nvoid\n_libssh2_wincng_bignum_free(_libssh2_bn *bn)\n{\n    if(bn) {\n        if(bn->bignum) {\n            _libssh2_wincng_safe_free(bn->bignum, bn->length);\n            bn->bignum = NULL;\n        }\n        bn->length = 0;\n        _libssh2_wincng_safe_free(bn, sizeof(_libssh2_bn));\n    }\n}\n\n\n/*\n * Windows CNG backend: Diffie-Hellman support.\n */\n\nvoid\n_libssh2_dh_init(_libssh2_dh_ctx *dhctx)\n{\n    *dhctx = _libssh2_wincng_bignum_init();     /* Random from client */\n}\n\nint\n_libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public,\n                     _libssh2_bn *g, _libssh2_bn *p, int group_order)\n{\n    /* Generate x and e */\n    if(_libssh2_wincng_bignum_rand(*dhctx, group_order * 8 - 1, 0, -1))\n        return -1;\n    if(_libssh2_wincng_bignum_mod_exp(public, g, *dhctx, p))\n        return -1;\n    return 0;\n}\n\nint\n_libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret,\n                   _libssh2_bn *f, _libssh2_bn *p)\n{\n    /* Compute the shared secret */\n    _libssh2_wincng_bignum_mod_exp(secret, f, *dhctx, p);\n    return 0;\n}\n\nvoid\n_libssh2_dh_dtor(_libssh2_dh_ctx *dhctx)\n{\n    _libssh2_wincng_bignum_free(*dhctx);\n    *dhctx = NULL;\n}\n\n#endif /* LIBSSH2_WINCNG */\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/src/wincng.h",
    "content": "/*\n * Copyright (C) 2013-2015 Marc Hoersken <info@marc-hoersken.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* required for cross-compilation against the w64 mingw-runtime package */\n#if defined(_WIN32_WINNT) && (_WIN32_WINNT < 0x0600)\n#undef _WIN32_WINNT\n#endif\n#ifndef _WIN32_WINNT\n#define _WIN32_WINNT 0x0600\n#endif\n\n#include <windows.h>\n#include <bcrypt.h>\n\n\n#define LIBSSH2_MD5 1\n\n#define LIBSSH2_HMAC_RIPEMD 0\n#define LIBSSH2_HMAC_SHA256 1\n#define LIBSSH2_HMAC_SHA512 1\n\n#define LIBSSH2_AES 1\n#define LIBSSH2_AES_CTR 1\n#define LIBSSH2_BLOWFISH 0\n#define LIBSSH2_RC4 1\n#define LIBSSH2_CAST 0\n#define LIBSSH2_3DES 1\n\n#define LIBSSH2_RSA 1\n#define LIBSSH2_DSA 1\n#define LIBSSH2_ECDSA 0\n#define LIBSSH2_ED25519 0\n\n#define MD5_DIGEST_LENGTH 16\n#define SHA_DIGEST_LENGTH 20\n#define SHA256_DIGEST_LENGTH 32\n#define SHA512_DIGEST_LENGTH 64\n\n#define EC_MAX_POINT_LEN ((528 * 2 / 8) + 1)\n\n#if LIBSSH2_ECDSA\n#else\n#define _libssh2_ec_key void\n#endif\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Global context handles\n */\n\nstruct _libssh2_wincng_ctx {\n    BCRYPT_ALG_HANDLE hAlgRNG;\n    BCRYPT_ALG_HANDLE hAlgHashMD5;\n    BCRYPT_ALG_HANDLE hAlgHashSHA1;\n    BCRYPT_ALG_HANDLE hAlgHashSHA256;\n    BCRYPT_ALG_HANDLE hAlgHashSHA512;\n    BCRYPT_ALG_HANDLE hAlgHmacMD5;\n    BCRYPT_ALG_HANDLE hAlgHmacSHA1;\n    BCRYPT_ALG_HANDLE hAlgHmacSHA256;\n    BCRYPT_ALG_HANDLE hAlgHmacSHA512;\n    BCRYPT_ALG_HANDLE hAlgRSA;\n    BCRYPT_ALG_HANDLE hAlgDSA;\n    BCRYPT_ALG_HANDLE hAlgAES_CBC;\n    BCRYPT_ALG_HANDLE hAlgAES_ECB;\n    BCRYPT_ALG_HANDLE hAlgRC4_NA;\n    BCRYPT_ALG_HANDLE hAlg3DES_CBC;\n};\n\nstruct _libssh2_wincng_ctx _libssh2_wincng;\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Generic functions\n */\n\nvoid _libssh2_wincng_init(void);\nvoid _libssh2_wincng_free(void);\n\n#define libssh2_crypto_init() \\\n  _libssh2_wincng_init()\n#define libssh2_crypto_exit() \\\n  _libssh2_wincng_free()\n\n#define _libssh2_random(buf, len) \\\n  _libssh2_wincng_random(buf, len)\n\n#define libssh2_prepare_iovec(vec, len)  /* Empty. */\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Hash structure\n */\n\ntypedef struct __libssh2_wincng_hash_ctx {\n    BCRYPT_HASH_HANDLE hHash;\n    unsigned char *pbHashObject;\n    unsigned long dwHashObject;\n    unsigned long cbHash;\n} _libssh2_wincng_hash_ctx;\n\n/*\n * Windows CNG backend: Hash functions\n */\n\n#define libssh2_sha1_ctx _libssh2_wincng_hash_ctx\n#define libssh2_sha1_init(ctx) \\\n  (_libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHashSHA1, \\\n                            SHA_DIGEST_LENGTH, NULL, 0) == 0)\n#define libssh2_sha1_update(ctx, data, datalen) \\\n  _libssh2_wincng_hash_update(&ctx, (unsigned char *) data, datalen)\n#define libssh2_sha1_final(ctx, hash) \\\n  _libssh2_wincng_hash_final(&ctx, hash)\n#define libssh2_sha1(data, datalen, hash) \\\n  _libssh2_wincng_hash(data, datalen, _libssh2_wincng.hAlgHashSHA1, \\\n                       hash, SHA_DIGEST_LENGTH)\n\n#define libssh2_sha256_ctx _libssh2_wincng_hash_ctx\n#define libssh2_sha256_init(ctx) \\\n  (_libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHashSHA256, \\\n                            SHA256_DIGEST_LENGTH, NULL, 0) == 0)\n#define libssh2_sha256_update(ctx, data, datalen) \\\n  _libssh2_wincng_hash_update(&ctx, (unsigned char *) data, datalen)\n#define libssh2_sha256_final(ctx, hash) \\\n  _libssh2_wincng_hash_final(&ctx, hash)\n#define libssh2_sha256(data, datalen, hash) \\\n  _libssh2_wincng_hash(data, datalen, _libssh2_wincng.hAlgHashSHA256, \\\n                       hash, SHA256_DIGEST_LENGTH)\n\n#define libssh2_sha512_ctx _libssh2_wincng_hash_ctx\n#define libssh2_sha512_init(ctx) \\\n  (_libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHashSHA512, \\\n                            SHA512_DIGEST_LENGTH, NULL, 0) == 0)\n#define libssh2_sha512_update(ctx, data, datalen) \\\n  _libssh2_wincng_hash_update(&ctx, (unsigned char *) data, datalen)\n#define libssh2_sha512_final(ctx, hash) \\\n  _libssh2_wincng_hash_final(&ctx, hash)\n#define libssh2_sha512(data, datalen, hash) \\\n  _libssh2_wincng_hash(data, datalen, _libssh2_wincng.hAlgHashSHA512, \\\n                       hash, SHA512_DIGEST_LENGTH)\n\n#define libssh2_md5_ctx _libssh2_wincng_hash_ctx\n#define libssh2_md5_init(ctx) \\\n  (_libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHashMD5, \\\n                            MD5_DIGEST_LENGTH, NULL, 0) == 0)\n#define libssh2_md5_update(ctx, data, datalen) \\\n  _libssh2_wincng_hash_update(&ctx, (unsigned char *) data, datalen)\n#define libssh2_md5_final(ctx, hash) \\\n  _libssh2_wincng_hash_final(&ctx, hash)\n#define libssh2_md5(data, datalen, hash) \\\n  _libssh2_wincng_hash(data, datalen, _libssh2_wincng.hAlgHashMD5, \\\n                       hash, MD5_DIGEST_LENGTH)\n\n/*\n * Windows CNG backend: HMAC functions\n */\n\n#define libssh2_hmac_ctx _libssh2_wincng_hash_ctx\n#define libssh2_hmac_ctx_init(ctx)\n#define libssh2_hmac_sha1_init(ctx, key, keylen) \\\n  _libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHmacSHA1, \\\n                            SHA_DIGEST_LENGTH, key, keylen)\n#define libssh2_hmac_md5_init(ctx, key, keylen) \\\n  _libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHmacMD5, \\\n                            MD5_DIGEST_LENGTH, key, keylen)\n#define libssh2_hmac_ripemd160_init(ctx, key, keylen)\n  /* not implemented */\n#define libssh2_hmac_sha256_init(ctx, key, keylen) \\\n  _libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHmacSHA256, \\\n                            SHA256_DIGEST_LENGTH, key, keylen)\n#define libssh2_hmac_sha512_init(ctx, key, keylen) \\\n  _libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHmacSHA512, \\\n                            SHA512_DIGEST_LENGTH, key, keylen)\n#define libssh2_hmac_update(ctx, data, datalen) \\\n  _libssh2_wincng_hash_update(&ctx, (unsigned char *) data, datalen)\n#define libssh2_hmac_final(ctx, hash) \\\n  _libssh2_wincng_hmac_final(&ctx, hash)\n#define libssh2_hmac_cleanup(ctx) \\\n  _libssh2_wincng_hmac_cleanup(ctx)\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Key Context structure\n */\n\ntypedef struct __libssh2_wincng_key_ctx {\n    BCRYPT_KEY_HANDLE hKey;\n    unsigned char *pbKeyObject;\n    unsigned long cbKeyObject;\n} _libssh2_wincng_key_ctx;\n\n\n/*\n * Windows CNG backend: RSA functions\n */\n\n#define libssh2_rsa_ctx _libssh2_wincng_key_ctx\n#define _libssh2_rsa_new(rsactx, e, e_len, n, n_len, \\\n                         d, d_len, p, p_len, q, q_len, \\\n                         e1, e1_len, e2, e2_len, c, c_len) \\\n  _libssh2_wincng_rsa_new(rsactx, e, e_len, n, n_len, \\\n                          d, d_len, p, p_len, q, q_len, \\\n                          e1, e1_len, e2, e2_len, c, c_len)\n#define _libssh2_rsa_new_private(rsactx, s, filename, passphrase) \\\n  _libssh2_wincng_rsa_new_private(rsactx, s, filename, passphrase)\n#define _libssh2_rsa_new_private_frommemory(rsactx, s, filedata, \\\n                                            filedata_len, passphrase) \\\n  _libssh2_wincng_rsa_new_private_frommemory(rsactx, s, filedata, \\\n                                             filedata_len, passphrase)\n#define _libssh2_rsa_sha1_sign(s, rsactx, hash, hash_len, sig, sig_len) \\\n  _libssh2_wincng_rsa_sha1_sign(s, rsactx, hash, hash_len, sig, sig_len)\n#define _libssh2_rsa_sha1_verify(rsactx, sig, sig_len, m, m_len) \\\n  _libssh2_wincng_rsa_sha1_verify(rsactx, sig, sig_len, m, m_len)\n#define _libssh2_rsa_free(rsactx) \\\n  _libssh2_wincng_rsa_free(rsactx)\n\n/*\n * Windows CNG backend: DSA functions\n */\n\n#define libssh2_dsa_ctx _libssh2_wincng_key_ctx\n#define _libssh2_dsa_new(dsactx, p, p_len, q, q_len, \\\n                         g, g_len, y, y_len, x, x_len) \\\n  _libssh2_wincng_dsa_new(dsactx, p, p_len, q, q_len, \\\n                          g, g_len, y, y_len, x, x_len)\n#define _libssh2_dsa_new_private(dsactx, s, filename, passphrase) \\\n  _libssh2_wincng_dsa_new_private(dsactx, s, filename, passphrase)\n#define _libssh2_dsa_new_private_frommemory(dsactx, s, filedata, \\\n                                            filedata_len, passphrase) \\\n  _libssh2_wincng_dsa_new_private_frommemory(dsactx, s, filedata, \\\n                                             filedata_len, passphrase)\n#define _libssh2_dsa_sha1_sign(dsactx, hash, hash_len, sig) \\\n  _libssh2_wincng_dsa_sha1_sign(dsactx, hash, hash_len, sig)\n#define _libssh2_dsa_sha1_verify(dsactx, sig, m, m_len) \\\n  _libssh2_wincng_dsa_sha1_verify(dsactx, sig, m, m_len)\n#define _libssh2_dsa_free(dsactx) \\\n  _libssh2_wincng_dsa_free(dsactx)\n\n/*\n * Windows CNG backend: Key functions\n */\n\n#define _libssh2_pub_priv_keyfile(s, m, m_len, p, p_len, pk, pw) \\\n  _libssh2_wincng_pub_priv_keyfile(s, m, m_len, p, p_len, pk, pw)\n#define _libssh2_pub_priv_keyfilememory(s, m, m_len, p, p_len, \\\n                                                     pk, pk_len, pw) \\\n  _libssh2_wincng_pub_priv_keyfilememory(s, m, m_len, p, p_len, \\\n                                                      pk, pk_len, pw)\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: Cipher Context structure\n */\n\nstruct _libssh2_wincng_cipher_ctx {\n    BCRYPT_KEY_HANDLE hKey;\n    unsigned char *pbKeyObject;\n    unsigned char *pbIV;\n    unsigned char *pbCtr;\n    unsigned long dwKeyObject;\n    unsigned long dwIV;\n    unsigned long dwBlockLength;\n    unsigned long dwCtrLength;\n};\n\n#define _libssh2_cipher_ctx struct _libssh2_wincng_cipher_ctx\n\n/*\n * Windows CNG backend: Cipher Type structure\n */\n\nstruct _libssh2_wincng_cipher_type {\n    BCRYPT_ALG_HANDLE *phAlg;\n    unsigned long dwKeyLength;\n    int useIV;      /* TODO: Convert to bool when a C89 compatible bool type\n                       is defined */\n    int ctrMode;\n};\n\n#define _libssh2_cipher_type(type) struct _libssh2_wincng_cipher_type type\n\n#define _libssh2_cipher_aes256ctr { &_libssh2_wincng.hAlgAES_ECB, 32, 0, 1 }\n#define _libssh2_cipher_aes192ctr { &_libssh2_wincng.hAlgAES_ECB, 24, 0, 1 }\n#define _libssh2_cipher_aes128ctr { &_libssh2_wincng.hAlgAES_ECB, 16, 0, 1 }\n#define _libssh2_cipher_aes256 { &_libssh2_wincng.hAlgAES_CBC, 32, 1, 0 }\n#define _libssh2_cipher_aes192 { &_libssh2_wincng.hAlgAES_CBC, 24, 1, 0 }\n#define _libssh2_cipher_aes128 { &_libssh2_wincng.hAlgAES_CBC, 16, 1, 0 }\n#define _libssh2_cipher_arcfour { &_libssh2_wincng.hAlgRC4_NA, 16, 0, 0 }\n#define _libssh2_cipher_3des { &_libssh2_wincng.hAlg3DES_CBC, 24, 1, 0 }\n\n/*\n * Windows CNG backend: Cipher functions\n */\n\n#define _libssh2_cipher_init(ctx, type, iv, secret, encrypt) \\\n  _libssh2_wincng_cipher_init(ctx, type, iv, secret, encrypt)\n#define _libssh2_cipher_crypt(ctx, type, encrypt, block, blocklen) \\\n  _libssh2_wincng_cipher_crypt(ctx, type, encrypt, block, blocklen)\n#define _libssh2_cipher_dtor(ctx) \\\n  _libssh2_wincng_cipher_dtor(ctx)\n\n/*******************************************************************/\n/*\n * Windows CNG backend: BigNumber Context\n */\n\n#define _libssh2_bn_ctx int /* not used */\n#define _libssh2_bn_ctx_new() 0 /* not used */\n#define _libssh2_bn_ctx_free(bnctx) ((void)0) /* not used */\n\n\n/*******************************************************************/\n/*\n * Windows CNG backend: BigNumber structure\n */\n\nstruct _libssh2_wincng_bignum {\n    unsigned char *bignum;\n    unsigned long length;\n};\n\n#define _libssh2_bn struct _libssh2_wincng_bignum\n\n/*\n * Windows CNG backend: BigNumber functions\n */\n\n_libssh2_bn *_libssh2_wincng_bignum_init(void);\n\n#define _libssh2_bn_init() \\\n  _libssh2_wincng_bignum_init()\n#define _libssh2_bn_init_from_bin() \\\n  _libssh2_bn_init()\n#define _libssh2_bn_set_word(bn, word) \\\n  _libssh2_wincng_bignum_set_word(bn, word)\n#define _libssh2_bn_from_bin(bn, len, bin) \\\n  _libssh2_wincng_bignum_from_bin(bn, len, bin)\n#define _libssh2_bn_to_bin(bn, bin) \\\n  _libssh2_wincng_bignum_to_bin(bn, bin)\n#define _libssh2_bn_bytes(bn) bn->length\n#define _libssh2_bn_bits(bn) \\\n  _libssh2_wincng_bignum_bits(bn)\n#define _libssh2_bn_free(bn) \\\n  _libssh2_wincng_bignum_free(bn)\n\n/*\n * Windows CNG backend: Diffie-Hellman support\n */\n\n#define _libssh2_dh_ctx struct _libssh2_wincng_bignum *\n#define libssh2_dh_init(dhctx) _libssh2_dh_init(dhctx)\n#define libssh2_dh_key_pair(dhctx, public, g, p, group_order, bnctx) \\\n        _libssh2_dh_key_pair(dhctx, public, g, p, group_order)\n#define libssh2_dh_secret(dhctx, secret, f, p, bnctx) \\\n        _libssh2_dh_secret(dhctx, secret, f, p)\n#define libssh2_dh_dtor(dhctx) _libssh2_dh_dtor(dhctx)\n\n/*******************************************************************/\n/*\n * Windows CNG backend: forward declarations\n */\nvoid _libssh2_wincng_init(void);\nvoid _libssh2_wincng_free(void);\nint _libssh2_wincng_random(void *buf, int len);\n\nint\n_libssh2_wincng_hash_init(_libssh2_wincng_hash_ctx *ctx,\n                          BCRYPT_ALG_HANDLE hAlg, unsigned long hashlen,\n                          unsigned char *key, unsigned long keylen);\nint\n_libssh2_wincng_hash_update(_libssh2_wincng_hash_ctx *ctx,\n                            const unsigned char *data, unsigned long datalen);\nint\n_libssh2_wincng_hash_final(_libssh2_wincng_hash_ctx *ctx,\n                           unsigned char *hash);\nint\n_libssh2_wincng_hash(unsigned char *data, unsigned long datalen,\n                     BCRYPT_ALG_HANDLE hAlg,\n                     unsigned char *hash, unsigned long hashlen);\n\nint\n_libssh2_wincng_hmac_final(_libssh2_wincng_hash_ctx *ctx,\n                           unsigned char *hash);\nvoid\n_libssh2_wincng_hmac_cleanup(_libssh2_wincng_hash_ctx *ctx);\n\nint\n_libssh2_wincng_key_sha1_verify(_libssh2_wincng_key_ctx *ctx,\n                                const unsigned char *sig,\n                                unsigned long sig_len,\n                                const unsigned char *m,\n                                unsigned long m_len,\n                                unsigned long flags);\n\nint\n_libssh2_wincng_rsa_new(libssh2_rsa_ctx **rsa,\n                        const unsigned char *edata,\n                        unsigned long elen,\n                        const unsigned char *ndata,\n                        unsigned long nlen,\n                        const unsigned char *ddata,\n                        unsigned long dlen,\n                        const unsigned char *pdata,\n                        unsigned long plen,\n                        const unsigned char *qdata,\n                        unsigned long qlen,\n                        const unsigned char *e1data,\n                        unsigned long e1len,\n                        const unsigned char *e2data,\n                        unsigned long e2len,\n                        const unsigned char *coeffdata,\n                        unsigned long coefflen);\nint\n_libssh2_wincng_rsa_new_private(libssh2_rsa_ctx **rsa,\n                                LIBSSH2_SESSION *session,\n                                const char *filename,\n                                const unsigned char *passphrase);\nint\n_libssh2_wincng_rsa_new_private_frommemory(libssh2_rsa_ctx **rsa,\n                                           LIBSSH2_SESSION *session,\n                                           const char *filedata,\n                                           size_t filedata_len,\n                                           unsigned const char *passphrase);\nint\n_libssh2_wincng_rsa_sha1_verify(libssh2_rsa_ctx *rsa,\n                                const unsigned char *sig,\n                                unsigned long sig_len,\n                                const unsigned char *m,\n                                unsigned long m_len);\nint\n_libssh2_wincng_rsa_sha1_sign(LIBSSH2_SESSION *session,\n                              libssh2_rsa_ctx *rsa,\n                              const unsigned char *hash,\n                              size_t hash_len,\n                              unsigned char **signature,\n                              size_t *signature_len);\nvoid\n_libssh2_wincng_rsa_free(libssh2_rsa_ctx *rsa);\n\n#if LIBSSH2_DSA\nint\n_libssh2_wincng_dsa_new(libssh2_dsa_ctx **dsa,\n                        const unsigned char *pdata,\n                        unsigned long plen,\n                        const unsigned char *qdata,\n                        unsigned long qlen,\n                        const unsigned char *gdata,\n                        unsigned long glen,\n                        const unsigned char *ydata,\n                        unsigned long ylen,\n                        const unsigned char *xdata,\n                        unsigned long xlen);\nint\n_libssh2_wincng_dsa_new_private(libssh2_dsa_ctx **dsa,\n                                LIBSSH2_SESSION *session,\n                                const char *filename,\n                                const unsigned char *passphrase);\nint\n_libssh2_wincng_dsa_new_private_frommemory(libssh2_dsa_ctx **dsa,\n                                           LIBSSH2_SESSION *session,\n                                           const char *filedata,\n                                           size_t filedata_len,\n                                           unsigned const char *passphrase);\nint\n_libssh2_wincng_dsa_sha1_verify(libssh2_dsa_ctx *dsa,\n                                const unsigned char *sig_fixed,\n                                const unsigned char *m,\n                                unsigned long m_len);\nint\n_libssh2_wincng_dsa_sha1_sign(libssh2_dsa_ctx *dsa,\n                              const unsigned char *hash,\n                              unsigned long hash_len,\n                              unsigned char *sig_fixed);\nvoid\n_libssh2_wincng_dsa_free(libssh2_dsa_ctx *dsa);\n#endif\n\nint\n_libssh2_wincng_pub_priv_keyfile(LIBSSH2_SESSION *session,\n                                 unsigned char **method,\n                                 size_t *method_len,\n                                 unsigned char **pubkeydata,\n                                 size_t *pubkeydata_len,\n                                 const char *privatekey,\n                                 const char *passphrase);\nint\n_libssh2_wincng_pub_priv_keyfilememory(LIBSSH2_SESSION *session,\n                                       unsigned char **method,\n                                       size_t *method_len,\n                                       unsigned char **pubkeydata,\n                                       size_t *pubkeydata_len,\n                                       const char *privatekeydata,\n                                       size_t privatekeydata_len,\n                                       const char *passphrase);\n\nint\n_libssh2_wincng_cipher_init(_libssh2_cipher_ctx *ctx,\n                            _libssh2_cipher_type(type),\n                            unsigned char *iv,\n                            unsigned char *secret,\n                            int encrypt);\nint\n_libssh2_wincng_cipher_crypt(_libssh2_cipher_ctx *ctx,\n                             _libssh2_cipher_type(type),\n                             int encrypt,\n                             unsigned char *block,\n                             size_t blocklen);\nvoid\n_libssh2_wincng_cipher_dtor(_libssh2_cipher_ctx *ctx);\n\n_libssh2_bn *\n_libssh2_wincng_bignum_init(void);\nint\n_libssh2_wincng_bignum_set_word(_libssh2_bn *bn, unsigned long word);\nunsigned long\n_libssh2_wincng_bignum_bits(const _libssh2_bn *bn);\nvoid\n_libssh2_wincng_bignum_from_bin(_libssh2_bn *bn, unsigned long len,\n                                const unsigned char *bin);\nvoid\n_libssh2_wincng_bignum_to_bin(const _libssh2_bn *bn, unsigned char *bin);\nvoid\n_libssh2_wincng_bignum_free(_libssh2_bn *bn);\nextern void\n_libssh2_dh_init(_libssh2_dh_ctx *dhctx);\nextern int\n_libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public,\n                     _libssh2_bn *g, _libssh2_bn *p, int group_order);\nextern int\n_libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret,\n                   _libssh2_bn *f, _libssh2_bn *p);\nextern void\n_libssh2_dh_dtor(_libssh2_dh_ctx *dhctx);\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/.gitignore",
    "content": ".deps\n.libs\n*.gcno\n*.gcda\nMakefile\nMakefile.in\nsimple\nssh2\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/CMakeLists.txt",
    "content": "# Copyright (c) 2014-2016 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\ninclude(CheckIncludeFiles)\ninclude(CheckFunctionExists)\ninclude(CheckSymbolExists)\ninclude(BundleUtilities)\ninclude(CopyRuntimeDependencies)\ninclude(SocketLibraries)\n\n## Platform checks\ncheck_include_files(inttypes.h HAVE_INTTYPES_H)\ncheck_include_files(unistd.h HAVE_UNISTD_H)\ncheck_include_files(sys/param.h HAVE_SYS_PARAM_H)\ncheck_include_files(sys/socket.h HAVE_SYS_SOCKET_H)\ncheck_include_files(arpa/inet.h HAVE_ARPA_INET_H)\ncheck_include_files(windows.h HAVE_WINDOWS_H)\ncheck_include_files(winsock2.h HAVE_WINSOCK2_H)\ncheck_include_files(netinet/in.h HAVE_NETINET_IN_H)\nconfigure_file(\n  \"${CMAKE_CURRENT_SOURCE_DIR}/libssh2_config_cmake.h.in\"\n  \"${CMAKE_CURRENT_BINARY_DIR}/libssh2_config.h\")\nappend_needed_socket_libraries(LIBRARIES)\n\n## Cryptography backend choice\n\nset(CRYPTO_BACKEND\n  \"\"\n  CACHE\n  STRING\n  \"The backend to use for cryptography: OpenSSL, Libgcrypt or WinCNG, mbedTLS\nor empty to try any available\")\n\n# If the crypto backend was given, rather than searching for the first\n# we are able to find, the find_package commands must abort configuration\n# and report to the user.\nif(CRYPTO_BACKEND)\n  set(SPECIFIC_CRYPTO_REQUIREMENT REQUIRED)\nendif()\n\nif(CRYPTO_BACKEND STREQUAL \"OpenSSL\" OR NOT CRYPTO_BACKEND)\n\n  find_package(OpenSSL ${SPECIFIC_CRYPTO_REQUIREMENT})\n\n  if(OPENSSL_FOUND)\n    set(CRYPTO_BACKEND \"OpenSSL\")\n  endif()\nendif()\n\nif(CRYPTO_BACKEND STREQUAL \"Libgcrypt\" OR NOT CRYPTO_BACKEND)\n\n  find_package(Libgcrypt ${SPECIFIC_CRYPTO_REQUIREMENT})\n\n  if(LIBGCRYPT_FOUND)\n    set(CRYPTO_BACKEND \"Libgcrypt\")\n  endif()\nendif()\n\nif(CRYPTO_BACKEND STREQUAL \"WinCNG\" OR NOT CRYPTO_BACKEND)\n\n  # The check actually compiles the header.  This requires windows.h.\n  check_include_files(\"windows.h;bcrypt.h\" HAVE_BCRYPT_H)\n\n  if(HAVE_BCRYPT_H)\n    set(CRYPTO_BACKEND \"WinCNG\")\n  endif()\nendif()\n\nif(CRYPTO_BACKEND STREQUAL \"mbedTLS\" OR NOT CRYPTO_BACKEND)\n\n  find_package(mbedTLS ${SPECIFIC_CRYPTO_REQUIREMENT})\n\n  if(MBEDTLS_FOUND)\n    set(CRYPTO_BACKEND \"mbedTLS\")\n  endif()\nendif()\n\nset(TESTS\n  hostkey\n  hostkey_hash\n  password_auth_succeeds_with_correct_credentials\n  password_auth_fails_with_wrong_password\n  password_auth_fails_with_wrong_username\n  public_key_auth_fails_with_wrong_key\n  public_key_auth_succeeds_with_correct_rsa_key\n  public_key_auth_succeeds_with_correct_encrypted_rsa_key\n  keyboard_interactive_auth_fails_with_wrong_response\n  keyboard_interactive_auth_succeeds_with_correct_response\n  )\n\nif(CRYPTO_BACKEND STREQUAL \"OpenSSL\")\n    list(APPEND TESTS\n      public_key_auth_succeeds_with_correct_rsa_openssh_key\n    )\n    if(OPENSSL_VERSION VERSION_GREATER \"1.1.0\")\n      list(APPEND TESTS\n        public_key_auth_succeeds_with_correct_ed25519_key\n        public_key_auth_succeeds_with_correct_encrypted_ed25519_key\n        public_key_auth_succeeds_with_correct_ed25519_key_from_mem\n      )\n    endif()\nendif()\n\nif(NOT CRYPTO_BACKEND STREQUAL \"mbedTLS\")\n  list(APPEND TESTS\n    public_key_auth_succeeds_with_correct_dsa_key\n    )\nendif()\n\nadd_library(openssh_fixture STATIC openssh_fixture.h openssh_fixture.c)\ntarget_link_libraries(openssh_fixture ${LIBRARIES})\ntarget_include_directories(openssh_fixture PRIVATE \"${CMAKE_CURRENT_BINARY_DIR}\")\n\nadd_library(session_fixture STATIC session_fixture.h session_fixture.c)\ntarget_link_libraries(session_fixture ${LIBRARIES} openssh_fixture libssh2)\ntarget_include_directories(session_fixture PRIVATE \"${CMAKE_CURRENT_BINARY_DIR}\")\n\nadd_library(runner STATIC runner.c)\ntarget_link_libraries(runner session_fixture)\ntarget_include_directories(runner PRIVATE \"${CMAKE_CURRENT_BINARY_DIR}\")\n\nforeach(test ${TESTS})\n  add_executable(test_${test} test_${test}.c)\n  target_link_libraries(test_${test} libssh2 runner ${LIBRARIES})\n  target_include_directories(test_${test} PRIVATE \"${CMAKE_CURRENT_BINARY_DIR}\")\n  list(APPEND TEST_TARGETS test_${test})\n  add_definitions(-DFIXTURE_WORKDIR=\"${CMAKE_CURRENT_SOURCE_DIR}\")\n\n  add_test(\n    NAME test_${test} COMMAND $<TARGET_FILE:test_${test}>\n    WORKING_DIRECTORY \"${CMAKE_CURRENT_SOURCE_DIR}\")\nendforeach()\n\nadd_target_to_copy_dependencies(\n  TARGET copy_test_dependencies\n  DEPENDENCIES ${RUNTIME_DEPENDENCIES}\n  BEFORE_TARGETS ${TEST_TARGETS})\n\n\n# TODO convert mansyntax.sh into CMake script.\n# XXX Just because we can find all three programs, doesn't mean sh can\n# find man and grep\nfind_program(SH_EXECUTABLE sh)\nfind_program(MAN_EXECUTABLE man)\nfind_program(GREP_EXECUTABLE grep)\nmark_as_advanced(SH_EXECUTABLE MAN_EXECUTABLE GREP_EXECUTABLE)\nif(SH_EXECUTABLE AND MAN_EXECUTABLE AND GREP_EXECUTABLE)\n  set(cmd \"srcdir=${CMAKE_CURRENT_SOURCE_DIR}\")\n  set(cmd \"${cmd} ${CMAKE_CURRENT_SOURCE_DIR}/mansyntax.sh\")\n  add_test(mansyntax ${SH_EXECUTABLE} -c \"${cmd}\")\nendif()\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/Makefile.am",
    "content": "AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/include -I$(top_builddir)/src\nLDADD = ../src/libssh2.la\n\nif SSHD\nnoinst_PROGRAMS = ssh2\nssh2_SOURCES = ssh2.c\nendif\n\nctests = simple$(EXEEXT)\nTESTS = $(ctests) mansyntax.sh\nif SSHD\nTESTS += ssh2.sh\nendif\ncheck_PROGRAMS = $(ctests)\n\nTESTS_ENVIRONMENT = SSHD=$(SSHD) EXEEXT=$(EXEEXT)\nTESTS_ENVIRONMENT += srcdir=$(top_srcdir)/tests builddir=$(top_builddir)/tests\n\nEXTRA_DIST = ssh2.sh mansyntax.sh\nEXTRA_DIST += etc/host etc/host.pub etc/user etc/user.pub\nEXTRA_DIST += CMakeLists.txt libssh2_config_cmake.h.in sshd_fixture.sh.in\nEXTRA_DIST += key_dsa key_dsa.pub key_dsa_wrong key_dsa_wrong.pub key_rsa key_rsa.pub\nEXTRA_DIST += openssh_server/authorized_keys openssh_server/Dockerfile openssh_server/ssh_host_rsa_key\nEXTRA_DIST += openssh_fixture.c openssh_fixture.h runner.c session_fixture.c session_fixture.h\nEXTRA_DIST += test_hostkey.c test_hostkey_hash.c\nEXTRA_DIST += test_keyboard_interactive_auth_fails_with_wrong_response.c\nEXTRA_DIST += test_keyboard_interactive_auth_succeeds_with_correct_response.c\nEXTRA_DIST += test_password_auth_fails_with_wrong_password.c\nEXTRA_DIST += test_password_auth_fails_with_wrong_username.c\nEXTRA_DIST += test_password_auth_succeeds_with_correct_credentials.c\nEXTRA_DIST += test_public_key_auth_fails_with_wrong_key.c\nEXTRA_DIST += test_public_key_auth_succeeds_with_correct_dsa_key.c\nEXTRA_DIST += test_public_key_auth_succeeds_with_correct_rsa_key.c\nEXTRA_DIST += test_public_key_auth_succeeds_with_correct_encrypted_rsa_key.c\nif OPENSSL\n# TODO: need to add a test for specific openssl version some how\n# EXTRA_DIST += test_public_key_auth_succeeds_with_correct_ed25519_key.c\n# EXTRA_DIST += test_public_key_auth_succeeds_with_correct_encrypted_ed25519_key.c\n# EXTRA_DIST += test_public_key_auth_succeeds_with_correct_ed25519_key_from_mem.c\nEXTRA_DIST += test_public_key_auth_succeeds_with_correct_rsa_openssh_key.c\nendif"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/etc/host",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAwJaOo3i1X3N401hMd92lRec0tPMBgaF6ZDanovBiQP+PNo6g\nVNtuF15AspbyxrViqtAyjLWQQlKGWgEFb2ga3ukzJll4dKPtNff3mO++W19ia0WQ\nZFWTAGcYqet4fvSALIpG+t/3u5MZXMNZPyCU8u1l+QXX14f6dEjzgRw7s3fSy/uv\nQawkgn8TQFvtSBOfvUTJPTAhhZqxZAt3nGH8d6vqD1hBNvdOpsohy6EgFh8V+kxn\nUdQntrYe9WSz0djt0RRrdAvRkM0hq1UY8C9FTQQWni1n168c7FVrf65+GdJOn7NQ\nDu0Whmh/R3flXR0kIBG+F7e8+e9W9OhlionkPwIBIwKCAQEAqpP6rgvT2DMTPtkt\nyUCoU9tpMo4XRu4b8lxLVc2Y2nvz391pb7sJvO0Uu2/BFmYkMORKB5l/xbbOxL8T\ncU2UJIVn0YJyAOj2rCTFW5KEB8mDDo4SLPtWUNBXrHF5WoDJTAVyEWdJInr5NOeJ\nj68k1yoJ3JAlkwNozWUvclrVytZNohPhiYdKkj2DPlWKL//0INGIo9TU31AGJx2R\nymy105EFCXWDv1GAIWwqBjNNxzlyxDauuGTwWr2iYDyectBYApCkjyJzMpFn4Yiu\nMq5XomwkQhefK3y32bRasm+HSrQsGswSvSyS8I5YosjSKMmiWdYj4WxrSciT6gG/\nKHanEwKBgQDucA7E/s9aKs6rECypXPaCORxvbLqdqAiwzJ0edufE+g0aQU/Zm3xj\nm6LGovdEcaBog4rfKCSB9NRKi35m4HV9PO4YBw6/lQ0NeO6jrb8OnZp/P97FbomT\nAXBibzUjQ8fhbPCaJF/2TUEoyhNbzJkpl+M0zu2aQ3MUYVd4dZ4y4wKBgQDOxfeA\nRH3ZPvdYI50jxW+/kKcio+APZZJ9xhtqOKzmEuJOPzlngWk5WQgS8B1aicHyFRhw\nUT2vKeJvqqoeLbIE9Fm6qlpN22594S88+LOiMda4wRswxG9wBZ2J4+rrYKpcb1gt\nJXvVKY7h5qLWGCR0x+ovOcNXABWsF8CAnOnb9QKBgA2gANgOj4F+yfslfuUbQUlF\nF5FWq5P6+S6sm0ORxBniZyYSXFWT2zjkUnHAK2L/LbzUURQQ7CSu5487K8tdSIrQ\nSB6hUUzGsEnppzyNleOT+jMoOJ2RSbCg/xuRU35bpQWRMlHzczKlVC43btILsPsP\n/lrJ/vLfSGeQiKfMNOz3AoGAC9DMUHjxP50ytJRSH00cVBbk+qpHUVZC4p2bKqQn\nIxcFnhI9y2Z7CpdfjA24iNSr/zRny+dinEuJSDWjUi5/M3utWx+tY4jhvgzeIL3B\nHzYMRRJZUz5sxJKbSbVAn7xhgZ/2aPrT4EuEge/sDDvk03kjUyffRszOCdV4tuRl\nIoMCgYEAnrexTd5GuxEEBg3qJgN4IMwoBzZlJ1voaI6I/AMuvQ5kVklYvHTPTZOI\nkSIrvaG8xaOdf0f76XNdT7U/dkx0C0vcesy5++hqakmeRCHjfsE1wN7m+hGo5WcR\nJq8Ph9ZnH5RKjqDsHh7Y4BCewQNrMBqNQEzDebZCDBUTnK9OgOg=\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/etc/host.pub",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwJaOo3i1X3N401hMd92lRec0tPMBgaF6ZDanovBiQP+PNo6gVNtuF15AspbyxrViqtAyjLWQQlKGWgEFb2ga3ukzJll4dKPtNff3mO++W19ia0WQZFWTAGcYqet4fvSALIpG+t/3u5MZXMNZPyCU8u1l+QXX14f6dEjzgRw7s3fSy/uvQawkgn8TQFvtSBOfvUTJPTAhhZqxZAt3nGH8d6vqD1hBNvdOpsohy6EgFh8V+kxnUdQntrYe9WSz0djt0RRrdAvRkM0hq1UY8C9FTQQWni1n168c7FVrf65+GdJOn7NQDu0Whmh/R3flXR0kIBG+F7e8+e9W9OhlionkPw== jas@mocca\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/etc/sshd_config",
    "content": "Port 4711\nProtocol 2\nAuthorizedKeysFile /home/jas/src/libssh2/tests/etc/user.pub\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/etc/user",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIEoQIBAAKCAQEAxIgBuZS39D4bFnWminE7svGQLdVKx1aWKnEYEa+XtNU4DKZ/\npxUHg0zbEBya+IkX1yqQYWALoiOwI8XhdemLp8g03BX7o+DLSWisfiHpCDVGAuNq\nRDF7qnFyL/ZBH6e0XKMtsoB51TDuBc4Rxh6p1V2QL/fg8BoHcCrnKkoqN8PSoKUX\n2lPKJ3JIF/P8cDLbKYCvbSTFOdf56eqg0GJe7jFtSwweE9yz3IWZ3kSS1E/9E6sX\naNCu/hUt1bvQthICQyBNoTtQP/igEUJ7n0GMetsnq9wiUSomLzWqIWNqmvOv62aC\nXRi5sYgpSAR4Zvnm3Cx/Wl0BEPz2rrFkG+G0SQIBIwKCAQEAgSYtBOyzZfztOqUV\nq277WFWZQrC8HJf8R8aparU3zpq+braOZnuImByP9KUVYX6pRECKw6WD/NWfonq4\nuzMSoXTviVBGRx6xeWIK880kG1Y1UlruD447Ur+ULiV7QLAIzylnLCiKk2lL9S+l\nR63AD95mEOS4Y0ROB+Gt2fY5ABHRMqhGLvRKK8qwn35C1Z9qnTGhgiRbeoc373A5\nZAYyegyLnbvyV47UfPYS/TVzxZ9RCx3D3I/9fI7ZAFafkkIufQX3QPaVxf0zFUwW\nde/f+gTbySTL4RDF185Evunx+tYvzCyIimB0cTE5dfsCWcHDtO6DwehKiOgJsbeW\nIrpeTwKBgQDnEMfv7ORR35Ouj91iNCSfLU/v0TSzAJBfqYovByhXRsopgWAKXUmH\nmWpBBP5vcGu3NvKfiZcMMbBPfllvlxkafQwvCqrdn5mg01MdAHMWP/O9yfvuxMDE\nKycU2G2CT8j85mIPn19WeIgXC/kws+P0RAVNCBNeq89Gvp4IdLN67wKBgQDZvTYh\nTPCYG32jBK+CcWmOna2SLvBloDcNevhzfu3RGjLIXzUHGxLdx7slsP/tpndmXIAL\nCgV6GfrLxix5bO08203S2qnnwP8VrjjNIv1CyZIbbQFAFIeC3QxZMZHnXieLrO0z\nqF5CuUXcL3cMeGmF/0HN/rB+4sF0qfv8wD8kRwKBgFXTCG8O2HYueK6NNPiXBknA\nX4T17wCocCOIHWHstzZcHzP82oeBvDmuAuTzOe7gnQmJcA9e/ZbQoJKOA/Y/b7lh\npXCO7wHcMb9kb1PqOWAJIASqG78V4TLrdOp8Re6Sqb0FHRu+2kSwbQ/f4DapN2lb\nF+lpZke8KGq71ExImm99AoGAN/10UbSy5UjlytVRs9QFM00eAQTBeTfTpGFzFmJ3\nqsw48bIU8zLY9zNcAmC21rXG7m+Oo8C/lG0UmsyPF+jPSinDjf22qU7iger4qccr\nLm5YxTlJduC1IaaOJZBnWMBwkaF+0sTlCdfew5ctPbiQKcVLb3wBf7amxjpWvVYB\nm50CgYAT6t2/Suav21J5zpzyrrt+oMZQ3MMzBnPHFRUQ1FdqZnE4eW5a10g0P+E+\nYeTol+fYxL34+cI5PREK3dcnW1E8g8KOsOQqMgWdTfZEDHYRLqEyGIhu20aqfJCY\nqu9tBburQoSlym9aQp41CMxIyHrL4GnwRlJkTTEVhDuab1HmKw==\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/etc/user.pub",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAxIgBuZS39D4bFnWminE7svGQLdVKx1aWKnEYEa+XtNU4DKZ/pxUHg0zbEBya+IkX1yqQYWALoiOwI8XhdemLp8g03BX7o+DLSWisfiHpCDVGAuNqRDF7qnFyL/ZBH6e0XKMtsoB51TDuBc4Rxh6p1V2QL/fg8BoHcCrnKkoqN8PSoKUX2lPKJ3JIF/P8cDLbKYCvbSTFOdf56eqg0GJe7jFtSwweE9yz3IWZ3kSS1E/9E6sXaNCu/hUt1bvQthICQyBNoTtQP/igEUJ7n0GMetsnq9wiUSomLzWqIWNqmvOv62aCXRi5sYgpSAR4Zvnm3Cx/Wl0BEPz2rrFkG+G0SQ== jas@mocca\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/key_dsa",
    "content": "-----BEGIN DSA PRIVATE KEY-----\nMIIBvAIBAAKBgQCtiYdgpPvFtfi7Ba44DiB+1x8kojjT0nRvn2hU2aa4p4fXI8kd\n6Hc57VQO/lLhR9eFpxjP7m+jGwF468Q6NU8xiC71ucep0OoXS7u8RcoIoWfLDtZi\nDDlahnZTW04mB5fFxo2y7dYl31vE4TPdSxhqpkvnIBIstMFh2M7Dl0w8/QIVAP95\nu6dg1OW6gGsRgiircsy1A9tzAoGBAIzwc5FCnJnzAJm9Hjv0AFV5l/i/DQulZ9pu\nEILkNiHCfDR+lTJ8VxAR7J3pgjmvYzeeRvi519ez1YriktDt66kIknQOcHB8ghyg\nU+dff79SkDcpg8LnX5xb3cVMgABujA0sSpaW1wwm64RXdvmoQvWu6ympUT0l0dEd\noYVkb4ytAoGAJ+CGwV/1S4j1GVwa6pSP0nj4V86GWXosTTBg7GT+rKWu8lrxIcr6\nFzLWgFi/gHoMrgnKWGxO1yF7vkoYM5Yfo84oBYiH+MgpiBuOrZrgzacHsA66JJbU\nfrESRFWZl2blIPr6Gyjj6cVGgMabK3yCiTRi0v7hwffpm0rKyKv7GooCFQCyaA6T\ntkJunHP+F0Xg/WAUV6tcqA==\n-----END DSA PRIVATE KEY-----\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/key_dsa.pub",
    "content": "ssh-dss AAAAB3NzaC1kc3MAAACBAK2Jh2Ck+8W1+LsFrjgOIH7XHySiONPSdG+faFTZprinh9cjyR3odzntVA7+UuFH14WnGM/ub6MbAXjrxDo1TzGILvW5x6nQ6hdLu7xFygihZ8sO1mIMOVqGdlNbTiYHl8XGjbLt1iXfW8ThM91LGGqmS+cgEiy0wWHYzsOXTDz9AAAAFQD/ebunYNTluoBrEYIoq3LMtQPbcwAAAIEAjPBzkUKcmfMAmb0eO/QAVXmX+L8NC6Vn2m4QguQ2IcJ8NH6VMnxXEBHsnemCOa9jN55G+LnX17PViuKS0O3rqQiSdA5wcHyCHKBT519/v1KQNymDwudfnFvdxUyAAG6MDSxKlpbXDCbrhFd2+ahC9a7rKalRPSXR0R2hhWRvjK0AAACAJ+CGwV/1S4j1GVwa6pSP0nj4V86GWXosTTBg7GT+rKWu8lrxIcr6FzLWgFi/gHoMrgnKWGxO1yF7vkoYM5Yfo84oBYiH+MgpiBuOrZrgzacHsA66JJbUfrESRFWZl2blIPr6Gyjj6cVGgMabK3yCiTRi0v7hwffpm0rKyKv7Goo= awl03@bounty\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/key_dsa_wrong",
    "content": "-----BEGIN DSA PRIVATE KEY-----\nMIIBuwIBAAKBgQCE1v/lL1VvjlJMyG7q0wAgl2tqVMzy5h1RVOtDS8bTlXLJg7ks\nT63wTmXlp2HedgKkfHCu7AKsjPyg1CTrvRBa8BFEvMoUDARonMwql34aiKVMy/t0\n/ehnmCQV+ZMFpsVFnphJpZuXLTW1F3pnEbSNud5sACjbWb51uly5AUynuwIVAOhj\nrbNOaAtC1oYki8CVwpkQ8rHhAoGAYSepXRF3GJSjseYgJ2bCgcJS0L9agcvKAf+F\ndc+ZDJOchhnZC/hGHsjAfg62KowwKuOYsbcR3S4LJxiERcmRabww+kUIL1E8bLaQ\nRbOygNsHU8LyBdSx3WqC2WEOpVkTAjYDWTkbN+qkb53IBoI0GwFt5P9GHvQcAGkj\nGJQAWWYCgYAt7vxpDC5Xs6GxbaUupfIP95ZTMx2LqqFjqfT/81nypIHVyIlCnWMi\na0mWGe4qXmHSyk6ZYnsk7Ll6WxdwUrFhd75qERyXlRK2x/v/Q3h9IOwChpHdSFx/\nTq1Zl9vMx3tmS1H0YF9tUdN7g8S5XTUSvYA+0Lzxs/9zOU5fa55+pAIVAKV45RLf\nhg2GNXvO68Q4tt3F6kSP\n-----END DSA PRIVATE KEY-----\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/key_dsa_wrong.pub",
    "content": "ssh-dss AAAAB3NzaC1kc3MAAACBAITW/+UvVW+OUkzIburTACCXa2pUzPLmHVFU60NLxtOVcsmDuSxPrfBOZeWnYd52AqR8cK7sAqyM/KDUJOu9EFrwEUS8yhQMBGiczCqXfhqIpUzL+3T96GeYJBX5kwWmxUWemEmlm5ctNbUXemcRtI253mwAKNtZvnW6XLkBTKe7AAAAFQDoY62zTmgLQtaGJIvAlcKZEPKx4QAAAIBhJ6ldEXcYlKOx5iAnZsKBwlLQv1qBy8oB/4V1z5kMk5yGGdkL+EYeyMB+DrYqjDAq45ixtxHdLgsnGIRFyZFpvDD6RQgvUTxstpBFs7KA2wdTwvIF1LHdaoLZYQ6lWRMCNgNZORs36qRvncgGgjQbAW3k/0Ye9BwAaSMYlABZZgAAAIAt7vxpDC5Xs6GxbaUupfIP95ZTMx2LqqFjqfT/81nypIHVyIlCnWMia0mWGe4qXmHSyk6ZYnsk7Ll6WxdwUrFhd75qERyXlRK2x/v/Q3h9IOwChpHdSFx/Tq1Zl9vMx3tmS1H0YF9tUdN7g8S5XTUSvYA+0Lzxs/9zOU5fa55+pA== awl03@bounty\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/key_ed25519",
    "content": "-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW\nQyNTUxOQAAACCMbXcoNmUVxO9FMMj1VB91MnwwVfBl+XDxet+j+oY6JgAAAJg8nvUxPJ71\nMQAAAAtzc2gtZWQyNTUxOQAAACCMbXcoNmUVxO9FMMj1VB91MnwwVfBl+XDxet+j+oY6Jg\nAAAECnhCuTDYdz3kUn48BXkaCXXdbKdH7wSIQ/CUx1cbnR0Ixtdyg2ZRXE70UwyPVUH3Uy\nfDBV8GX5cPF636P6hjomAAAAEHdpbGxAaUN1YmUubG9jYWwBAgMEBQ==\n-----END OPENSSH PRIVATE KEY-----\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/key_ed25519.pub",
    "content": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIxtdyg2ZRXE70UwyPVUH3UyfDBV8GX5cPF636P6hjom\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/key_ed25519_encrypted",
    "content": "-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABD4qdu8J/\nEAqXFQERrvzMerAAAAEAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAICHxEyUTOVHXvdMF\nARedFQ+H9DW/n8Zy3daKKRqnTDMqAAAAoO05oxXUkLz8cMQcMeeRSc4UvsaWnCvfN4Qm15\nNaVwSjb/09AcGGVeF1xxwPEIjwsIRftAjjgLuauI6XpXzyeDOlr2HnwzgpZtmeaHzbB7lS\nNjpSENP+fXipXinSfgZqGOItPbbismEVWX4sQn/Zla6/f/JAcDV60TK2ZhVEZ5072t0NcA\neZQeSzBnpoRhlB7IDO7/7pmu1kNysUzH94Bw8=\n-----END OPENSSH PRIVATE KEY-----\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/key_ed25519_encrypted.pub",
    "content": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICHxEyUTOVHXvdMFARedFQ+H9DW/n8Zy3daKKRqnTDMq\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/key_rsa",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIEoQIBAAKCAQEAnak1T7zHJ+hVRFBDQ9pf1KVzmd5gaNc7y7NPmL13aOG3sYeJ\nevi1x1WM/R3tb8XnUnzZUX9GJN0MYovvZsw9bknG1mDP72LFbGp/gzPddGIKHBBp\nvceDaJ85sM/ME3XOtD7uuXQuNAuEHwEzSMMiSIEMcQS+lXIcMLr5xPLEkyNvqsO5\nRqSjMTLHKHgY8gLWx7oQ1avokhwuDxF7P3Pqtj+rW2Te6vR0i1H6EyFPsBkzkgNX\nb33cus8M1CnTmYTSgJgmHO2LLcGpjQ5sL8T/PWIWHaSqTnkrFXEMysgoteXnAYIL\njzyBaqq2WV4KA3TluGdAP2p8gC32QtKmIuis3QIBIwKCAQB1Hpyhoi2LXCIVfXPM\nAU6AtWvRY12PtdSl8uqr+nX2JATNBZlUCTaUE6qQJNxEZyDeMNvzZdxV5gkzQ2Fi\nTpQIyRddbH01fJKoTxzlHzbLfAeCj9mFqicahOkHAMN8K6Ddqxe89zhD60w0SgjW\n91tLzZQ2sxE70RxBdPQOpbaZLxmUZSVxRgf5djotyZqB4CcGblKCEZYJ9ZemgCnF\ngEcSsqcn0Jxfu+aEJ4WinN2orWs+okfgsUu9G9Ozwcy9Ptq1LkIzcwwTIpL7TTDd\nLMvhql39a07SysepjFRHxjvXh8Gv+SsLvKQPJHheVv8XoG0dZd+9/Eden9rHKoVm\nvGPLAoGBANGDQtv5K/md/3sRGeJ6Ir3/Ao+WMe8C5onck+hW4y/2yQqm3ZLzyZon\nKdWRj2q4dnxFZyoyDgX0UHLpM4aSsMRjn4C6vcPLcYaZ9CGB5FWPGZrq+q6vuMGK\nV9/fo4ZNFkNK3wo4WCSgxC1Y8XUJc3klOvPVjsmVxZaeZnkukkAFAoGBAMCkqe/S\nhrKITzjZuyGN90a2Nq+3xMNGuc400Qvoi27D1OcSn7SJ/K3tVWbENOH3CAlkmlZT\n46IM2SRRmM0bxF3aThEwnsD5yPqgz+tcweX+gK3nXnP5JZfYF1kArXk80/eYhNE9\nPwnJNXDQMoxaM0/X6BVgQyt03/Q12lH9u0j5AoGAR9U7fp6Su/uoDO/rnhs/HJHy\nP9u5WULSsuyKe4uBF8JTjp+cbOXeuIJ0vkCI8WPQ2iZsg37gPI5Hd9rtGDJLPATm\nOsOuxslowG9MY0J6K/aMb6EFfbiXHckIL3/gS02hO6SkPgSwgZY0odVaGX+VThtk\nq18ppDNZr/vLXL+CmZsCgYEAlJxIlG80tZxaXw5dKIN1nPL2/JUUIZz1vFShQ7Nk\nP4EglP+9B52lqr5mc9kwHAe1vhpobns6kvP393IlawbKrsz6ZQg/8/PkLw5XQIli\nYPeH1pyKsTyKtvcn9DO5BcE1zaGLB9ApULEpOcUuTwPBLvcDfjRREuUhywT44Coi\nw0MCgYAX5yc7/Z3R6M30rGsrgb1Y2siHYsi2LCygUj7TDGQYpaZN4afPJOT5H/Nr\n7x7dgZkbOR6PQFm00VgML0XxKih59t0dcQ+2qk1LX5JDKRF/1kER3np6dpceteDu\ncC+MEHB/KvijnviAtBZGvD0O7oZgvbkKHESu2igXpAnfXPZFvw==\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/key_rsa.pub",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAnak1T7zHJ+hVRFBDQ9pf1KVzmd5gaNc7y7NPmL13aOG3sYeJevi1x1WM/R3tb8XnUnzZUX9GJN0MYovvZsw9bknG1mDP72LFbGp/gzPddGIKHBBpvceDaJ85sM/ME3XOtD7uuXQuNAuEHwEzSMMiSIEMcQS+lXIcMLr5xPLEkyNvqsO5RqSjMTLHKHgY8gLWx7oQ1avokhwuDxF7P3Pqtj+rW2Te6vR0i1H6EyFPsBkzkgNXb33cus8M1CnTmYTSgJgmHO2LLcGpjQ5sL8T/PWIWHaSqTnkrFXEMysgoteXnAYILjzyBaqq2WV4KA3TluGdAP2p8gC32QtKmIuis3Q== awl03@bounty\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/key_rsa_encrypted",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: AES-128-CBC,E030CC29AE4C20669EE41DF3DE4C0886\n\ngLMMWawVUpqtAtpSVnr7HcH+P0gHKFU00hUhNY18TNJRfFIhPqc9R9xsLHgBac7k\nvHtD2nzUuWLVMIKQoS3+1IF/KO6Xj1zSqnyk49hyKWxFiD3U1YdZAiZNgJ/s6olg\nJ/h4mNNsz8Nh6Swp3HwP2jtLHWHV8fOzsaE3dvnVYZ5gPnec7XAYcQycbOV0t2Wd\nNGlP09ooAQRWWuf1TaBewjj7Jm40l8OQat5EKZKzydUZZQYAqfJQ7fIw7jI/lQYF\nKJj9tq0ceFdxvk8LYMr5a+ixnDwirxgg4L0X3fjLocfLVt42qDKkfOGXGg9VI8CO\ngjTu/MbodGCWKe/5eeCSSLrKo486S/5B6RzN0Ax4QBb1iYAN5IECsV91Ekk0socY\nDBZmDMEGHppHJhNhbBzfMYeKssWbOQf9z0y+gDPesImV2gXNoMgTcmZrCLOJWj6L\nifQAtTKc8P5fV+TLhg3dKmxCt1UMlCHpWWl7tPTsO3WaaXi50f9ypRfpbpH0hket\nSO//bZqF0lF+Ci8uC6ndXBniIfinFoMWPsY01bxyHvmEMwCTVApZEkrZtGlHnavy\nd2oYJ0Oc+eeSjnx2BccQ9GdoI3292CVJVgPiibr42updecFwTry+j//IY8H3d62m\nUYUXJQgIL04o2/1UIT0mPWwPigF3sJSZOwT5arn4MgUyBCC18p6OTmGmvIyrz3YB\nimbhndok/30sMwtJocgXKTdyreMUp0s8Hpw/2z4LQ0qlOstKwa8KnDcFAqaSFNGD\n8tGTobAcGRhqq93PRrn3aRibk1T3KDpMF/oqRaajgBmXFVYOk1yuLy6meB+wAJFD\nVVIokZaygYs13SMX+hau0Gd6PmVh8QF0RmvG69ga7k4dfJMbe2uU59wf9uABmyvd\n+Ju+uXGiF0wYfcyv6HJarPIqA3630TPKR/z8dDWC3rJ83xx7hIpoEAA+b7RA3Vtx\nGv0EoDK6zeq4UJK0tqxMZJuy+FHBDZhv+gAeB/PmIGPIbF+jV+flmCrUgHg2Ka8I\nIaap+lQKMj5lzOv/1bbcZ6cpj717MGvo3XOwOD4x5b3wRX6DWphB0+oRWiVU3Vrd\nPiZ0gtlX31Rj+h+QB4DrMKZWMu++qEDF6NPLz2ktNcjOYBT29VVqX8ALKKFO+jOK\nZASnUXXE3XnwbccwU9VIQ+3mom3K+GjJRGxsWNZsrPy364eQHckomcOptgk5ldI1\neF7t5w0xQ4hx6jrJBcKJL29SQAcmUO+vu+6Vg6synBpnlqM9mSe8Xlo3SQ9bROJ9\n1unhrml0Jr1tJZfbM/kX7xhFUVc2kQHqYz6pwYl3fYceHk5dVj9IWaJj82Sfi1QQ\nil3DQb9t3y4oJcYQxR9OzyjiKPiCAkIDakYshZP/bb/ZfDy1szIIL0e3mKLUcdFc\n3sqAvcBsPt+SngnTtodkAK1ddTuxjHUN3+XpIAUoNtqv02g47JCmvSQ0NGsPyXIz\n2krWQoMlmYaG3N74ybMajTXW3Y8+wbe5moJ+Yt4bPUo61d8rMOVI/+3lU7YIyUj1\nTqbwgHCvZRvaiXJQbC9lP7mbQipQhtwQgGMw9TdQB/oHldmDNETF4eNX11LC73+G\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/key_rsa_encrypted.pub",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC92YlGoc4PJy6DzX916JJZhxkvmkWBLGJdWOL7R9B6iaYEKebBxzTE3P1RcnxnuI06kklVq/KcDP9sLlgawTZcDg7ifM7HncPOi18OON8vvVVzodikHzuupjhpI5YTT9wwV2fDVi2URsBjvX4AFiZ5WM3/NwqdKpYABzWieBikXGJ58Tsnw+zQw2qMmKKESBuzSN538loTAj5iEH/GAKYDbbH9t2a17qhNCNEw4vrtURT9JqwO1cOg7N1OKpmqCPEbK0wuSTljNC230VJ06X/8UqahWWSH6MreGy6gwpPi6i9wFiFLur301R0dTPiKVhz6bguhcC1EAlhSgjfelFJt awl03@bounty\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/key_rsa_openssh",
    "content": "-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\nNhAAAAAwEAAQAAAQEA03tZTdi/8nrdDGtSc15EH97dX/qWrgC3nNhbBmcvOykSVtQDsXE0\n4nj45RcD9cn0itZVl0Prn9G+tYJCqqkedhQ5MtuByVrmJX15REDJ9nfzzQzVQw2zuE1ysj\nccVBxSeqmDDXeJFozh/uq5mKFirFlft5g0Wx2oG1TxGC/MHqfDk6ijqq7lS1T82cmGZAbZ\n+FzhYulBPFioklXStQJtTuVMb5Q/ebd9nmHIesEPWs4DKo2urKXvy+VCYD/N0GRZJ1Qt8D\n2VpI6qJlRapdBaWkHJRDcMmPzmTMa9HE/3+2wi+rOAP9V6W7BpgtMWpOP0xx2zp/tC3SHo\n9pxlfCRaEQAAA8gL9Cg6C/QoOgAAAAdzc2gtcnNhAAABAQDTe1lN2L/yet0Ma1JzXkQf3t\n1f+pauALec2FsGZy87KRJW1AOxcTTiePjlFwP1yfSK1lWXQ+uf0b61gkKqqR52FDky24HJ\nWuYlfXlEQMn2d/PNDNVDDbO4TXKyNxxUHFJ6qYMNd4kWjOH+6rmYoWKsWV+3mDRbHagbVP\nEYL8wep8OTqKOqruVLVPzZyYZkBtn4XOFi6UE8WKiSVdK1Am1O5UxvlD95t32eYch6wQ9a\nzgMqja6spe/L5UJgP83QZFknVC3wPZWkjqomVFql0FpaQclENwyY/OZMxr0cT/f7bCL6s4\nA/1XpbsGmC0xak4/THHbOn+0LdIej2nGV8JFoRAAAAAwEAAQAAAQAykM27lVXf7oyoCYk/\nWIzFag5YgpxAop9Ee17YWxep95oQ9MSlSsIwXGh2rlgeDtnP0IvKjUzre8UztR+nmqRT62\nX5yQ5xTLC2yheSwEMKEYhTwPvE+qO8L5h7ED5Pxi3acmmJcMlwgOMQhqM14XCscPo39cae\n+qpVTqwO8m7F7Tu/GCQWKTDE6FekoX13/bYbnsgd7FZGTyc37rQ2kuergYeIRewrdTD3JB\nne6LmRVbMEuGh9WbXfXFLr+5p79xgnTPs+whdoyQTY8+O3052D8yMV7UcU+T9A0zHFyU9E\nVT/SvTgMTF7icThTtVR6Vn095ahe77wh363N0JEe1rwBAAAAgQCSqhkKVowJSPw+Ho6PNk\nlKcXWCutA8sVg+x+MaIdnzTe9TbxItm/XW4zj1Ax1rJeEgAaCKQVwH5oJDeC3awNZZ5ZY9\nGK6h4ueyolzVP5wwalR9HeY/S+wdRgaIvYmIpHewLAj/o5ykE2Ijzgf3+HdaNlRxwWXz1i\n8ArMV1AwB8WwAAAIEA75OHcAo8RUM7EoU165FZp7nqBphKuGMb8Os/p2xbNC8MYz5CyDXy\nfzYZC3i67uGXyTTVLtl54+kzuciuZ/qLHJT49JY/AtOm+rmpXKACNQIZeEnCML8AewLDEg\nugXuFCMIFR4/fupCjGv/tTVHvsh6LJ/td3+DQmisVG3uDnGDEAAACBAOH6xeQ5Z/VPFV1b\n+ZxutTMjFghLce50L6fSHpBbIN00vS+9I4TmXYI1XFvaFjHShYUrFifWiMFGBNjuoqRY+c\n9/8UDvptdiXLqqLkw3SNB/UqUQRtZkD384Eazxud+FMfMguFBrgmkWYwAh9EVAzXrbzxQd\nU9To5SerEitsWsfhAAAAEHdpbGxAaUN1YmUubG9jYWwBAg==\n-----END OPENSSH PRIVATE KEY-----\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/key_rsa_openssh.pub",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTe1lN2L/yet0Ma1JzXkQf3t1f+pauALec2FsGZy87KRJW1AOxcTTiePjlFwP1yfSK1lWXQ+uf0b61gkKqqR52FDky24HJWuYlfXlEQMn2d/PNDNVDDbO4TXKyNxxUHFJ6qYMNd4kWjOH+6rmYoWKsWV+3mDRbHagbVPEYL8wep8OTqKOqruVLVPzZyYZkBtn4XOFi6UE8WKiSVdK1Am1O5UxvlD95t32eYch6wQ9azgMqja6spe/L5UJgP83QZFknVC3wPZWkjqomVFql0FpaQclENwyY/OZMxr0cT/f7bCL6s4A/1XpbsGmC0xak4/THHbOn+0LdIej2nGV8JFoR will@iCube.local\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/libssh2_config_cmake.h.in",
    "content": "/* Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* Headers */\n#cmakedefine HAVE_UNISTD_H\n#cmakedefine HAVE_INTTYPES_H\n#cmakedefine HAVE_SYS_PARAM_H\n#cmakedefine HAVE_SYS_SOCKET_H\n#cmakedefine HAVE_ARPA_INET_H\n#cmakedefine HAVE_NETINET_IN_H\n#cmakedefine HAVE_WINDOWS_H\n#cmakedefine HAVE_WINSOCK2_H\n#cmakedefine HAVE_SNPRINTF\n\n/* snprintf not in Visual Studio CRT and _snprintf dangerously incompatible.\n   We provide a safe wrapper if snprintf not found */\n#ifndef HAVE_SNPRINTF\n#include <stdio.h>\n#include <stdarg.h>\n/* Want safe, 'n += snprintf(b + n ...)' like function. If cp_max_len is 1\n* then assume cp is pointing to a null char and do nothing. Returns number\n* number of chars placed in cp excluding the trailing null char. So for\n* cp_max_len > 0 the return value is always < cp_max_len; for cp_max_len\n* <= 0 the return value is 0 (and no chars are written to cp). */\nstatic int snprintf(char *cp, int cp_max_len, const char *fmt, ...)\n{\n    va_list args;\n    int n;\n\n    if (cp_max_len < 2)\n        return 0;\n    va_start(args, fmt);\n    n = vsnprintf(cp, cp_max_len, fmt, args);\n    va_end(args);\n    return (n < cp_max_len) ? n : (cp_max_len - 1);\n}\n\n#define HAVE_SNPRINTF\n#endif\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/mansyntax.sh",
    "content": "#!/bin/sh\nset -e\n\n# Written by Mikhail Gusarov\n#\n# Run syntax checks for all manpages in the documentation tree.\n#\n\nsrcdir=${srcdir:-$PWD}\ndstdir=${builddir:-$PWD}\nmandir=${srcdir}/../docs\n\n#\n# Only test if suitable man is available\n#\nif ! man --help | grep -q warnings; then\n  echo \"man version not suitable, skipping tests\"\n  exit 0\nfi\n\nec=0\n\ntrap \"rm -f $dstdir/man3\" EXIT\n\nln -sf \"$mandir\" \"$dstdir/man3\"\n\nfor manpage in $mandir/libssh2_*.*; do\n  echo \"$manpage\"\n  warnings=$(LANG=en_US.UTF-8 MANWIDTH=80 man -M \"$dstdir\" --warnings \\\n    -E UTF-8 -l \"$manpage\" 2>&1 >/dev/null)\n  if [ -n \"$warnings\" ]; then\n    echo \"$warnings\"\n    ec=1\n  fi\ndone\n\nexit $ec\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/openssh_fixture.c",
    "content": "/* Copyright (C) 2016 Alexander Lamaison\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"openssh_fixture.h\"\n#include \"libssh2_config.h\"\n\n#ifdef HAVE_WINSOCK2_H\n#include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n#include <sys/socket.h>\n#endif\n#ifdef HAVE_ARPA_INET_H\n#include <arpa/inet.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n#include <netinet/in.h>\n#endif\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#include <ctype.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdarg.h>\n\nstatic int run_command_varg(char **output, const char *command, va_list args)\n{\n    FILE *pipe;\n    char command_buf[BUFSIZ];\n    char buf[BUFSIZ];\n    char *p;\n    int ret;\n    if(output) {\n        *output = NULL;\n    }\n\n    /* Format the command string */\n    ret = vsnprintf(command_buf, sizeof(command_buf), command, args);\n    if(ret < 0 || ret >= BUFSIZ) {\n        fprintf(stderr, \"Unable to format command (%s)\\n\", command);\n        return -1;\n    }\n\n    /* Rewrite the command to redirect stderr to stdout to we can output it */\n    if(strlen(command_buf) + 6 >= sizeof(command_buf)) {\n        fprintf(stderr, \"Unable to rewrite command (%s)\\n\", command);\n        return -1;\n    }\n\n    strncat(command_buf, \" 2>&1\", 6);\n\n    fprintf(stdout, \"Command: %s\\n\", command);\n#ifdef WIN32\n    pipe = _popen(command_buf, \"r\");\n#else\n    pipe = popen(command_buf, \"r\");\n#endif\n    if(!pipe) {\n        fprintf(stderr, \"Unable to execute command '%s'\\n\", command);\n        return -1;\n    }\n    p = buf;\n    while(fgets(p, sizeof(buf) - (p - buf), pipe) != NULL)\n        ;\n\n#ifdef WIN32\n    ret = _pclose(pipe);\n#else\n    ret = pclose(pipe);\n#endif\n    if(ret != 0) {\n        fprintf(stderr, \"Error running command '%s' (exit %d): %s\\n\",\n                command, ret, buf);\n    }\n\n    if(output) {\n        /* command output may contain a trailing newline, so we trim\n         * whitespace here */\n        size_t end = strlen(buf) - 1;\n        while(end > 0 && isspace(buf[end])) {\n            buf[end] = '\\0';\n        }\n\n        *output = strdup(buf);\n    }\n    return ret;\n}\n\nstatic int run_command(char **output, const char *command, ...)\n{\n    va_list args;\n    int ret;\n\n    va_start(args, command);\n    ret = run_command_varg(output, command, args);\n    va_end(args);\n\n    return ret;\n}\n\nstatic int build_openssh_server_docker_image()\n{\n    return run_command(NULL, \"docker build -t libssh2/openssh_server openssh_server\");\n}\n\nstatic int start_openssh_server(char **container_id_out)\n{\n    return run_command(container_id_out,\n                       \"docker run --detach -P libssh2/openssh_server\"\n                       );\n}\n\nstatic int stop_openssh_server(char *container_id)\n{\n    return run_command(NULL, \"docker stop %s\", container_id);\n}\n\nstatic const char *docker_machine_name()\n{\n    return getenv(\"DOCKER_MACHINE_NAME\");\n}\n\nstatic int ip_address_from_container(char *container_id, char **ip_address_out)\n{\n    const char *active_docker_machine = docker_machine_name();\n    if(active_docker_machine != NULL) {\n\n        /* This can be flaky when tests run in parallel (see\n           https://github.com/docker/machine/issues/2612), so we retry a few\n           times with exponential backoff if it fails */\n        int attempt_no = 0;\n        int wait_time = 500;\n        for(;;) {\n            return run_command(ip_address_out, \"docker-machine ip %s\", active_docker_machine);\n\n            if(attempt_no > 5) {\n                fprintf(\n                    stderr,\n                    \"Unable to get IP from docker-machine after %d attempts\\n\",\n                    attempt_no);\n                return -1;\n            }\n            else {\n#ifdef WIN32\n#pragma warning(push)\n#pragma warning(disable : 4996)\n                _sleep(wait_time);\n#pragma warning(pop)\n#else\n                sleep(wait_time);\n#endif\n                ++attempt_no;\n                wait_time *= 2;\n            }\n        }\n    }\n    else {\n        return run_command(ip_address_out,\n                           \"docker inspect --format \"\n                           \"\\\"{{ index (index (index .NetworkSettings.Ports \"\n                           \"\\\\\\\"22/tcp\\\\\\\") 0) \\\\\\\"HostIp\\\\\\\" }}\\\" %s\",\n                           container_id);\n    }\n}\n\nstatic int port_from_container(char *container_id, char **port_out)\n{\n    return run_command(port_out,\n                       \"docker inspect --format \"\n                       \"\\\"{{ index (index (index .NetworkSettings.Ports \"\n                       \"\\\\\\\"22/tcp\\\\\\\") 0) \\\\\\\"HostPort\\\\\\\" }}\\\" %s\",\n                       container_id);\n}\n\nstatic int open_socket_to_container(char *container_id)\n{\n    char *ip_address = NULL;\n    char *port_string = NULL;\n    unsigned long hostaddr;\n    int sock;\n    struct sockaddr_in sin;\n\n    int ret = ip_address_from_container(container_id, &ip_address);\n    if(ret != 0) {\n        fprintf(stderr, \"Failed to get IP address for container %s\\n\", container_id);\n        ret = -1;\n        goto cleanup;\n    }\n\n    ret = port_from_container(container_id, &port_string);\n    if(ret != 0) {\n        fprintf(stderr, \"Failed to get port for container %s\\n\", container_id);\n        ret = -1;\n    }\n\n    hostaddr = inet_addr(ip_address);\n    if(hostaddr == (unsigned long)(-1)) {\n        fprintf(stderr, \"Failed to convert %s host address\\n\", ip_address);\n        ret = -1;\n        goto cleanup;\n    }\n\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n    if(sock <= 0) {\n        fprintf(stderr, \"Failed to open socket (%d)\\n\", sock);\n        ret = -1;\n        goto cleanup;\n    }\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons((short)strtol(port_string, NULL, 0));\n    sin.sin_addr.s_addr = hostaddr;\n\n    if(connect(sock, (struct sockaddr *)(&sin),\n               sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"Failed to connect to %s:%s\\n\", ip_address, port_string);\n        ret = -1;\n        goto cleanup;\n    }\n\n    ret = sock;\n\ncleanup:\n    free(ip_address);\n    free(port_string);\n\n    return ret;\n}\n\nstatic char *running_container_id = NULL;\n\nint start_openssh_fixture()\n{\n    int ret;\n#ifdef HAVE_WINSOCK2_H\n    WSADATA wsadata;\n\n    ret = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(ret != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", ret);\n        return 1;\n    }\n#endif\n\n    ret = build_openssh_server_docker_image();\n    if(ret == 0) {\n        return start_openssh_server(&running_container_id);\n    }\n    else {\n        fprintf(stderr, \"Failed to build docker image\\n\");\n        return ret;\n    }\n}\n\nvoid stop_openssh_fixture()\n{\n    if(running_container_id) {\n        stop_openssh_server(running_container_id);\n        free(running_container_id);\n        running_container_id = NULL;\n    }\n    else {\n        fprintf(stderr, \"Cannot stop container - none started\");\n    }\n}\n\nint open_socket_to_openssh_server()\n{\n    return open_socket_to_container(running_container_id);\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/openssh_fixture.h",
    "content": "/* Copyright (C) 2016 Alexander Lamaison\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_TESTS_OPENSSH_FIXTURE_H\n#define LIBSSH2_TESTS_OPENSSH_FIXTURE_H\n\nint start_openssh_fixture();\nvoid stop_openssh_fixture();\nint open_socket_to_openssh_server();\n\n#endif\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/openssh_server/Dockerfile",
    "content": "# Copyright (c) 2016 Alexander Lamaison <alexander.lamaison@gmail.com>\n#\n# Redistribution and use in source and binary forms,\n# with or without modification, are permitted provided\n# that the following conditions are met:\n#\n#   Redistributions of source code must retain the above\n#   copyright notice, this list of conditions and the\n#   following disclaimer.\n#\n#   Redistributions in binary form must reproduce the above\n#   copyright notice, this list of conditions and the following\n#   disclaimer in the documentation and/or other materials\n#   provided with the distribution.\n#\n#   Neither the name of the copyright holder nor the names\n#   of any other contributors may be used to endorse or\n#   promote products derived from this software without\n#   specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n# CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n# OF SUCH DAMAGE.\n\nFROM debian:jessie\n\nRUN apt-get update \\\n && apt-get install -y openssh-server \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\nRUN mkdir /var/run/sshd\n\n# Chmodding because, when building on Windows, files are copied in with\n# -rwxr-xr-x permissions.\n#\n# Copying to a temp location, then moving because chmodding the copied file has\n# no effect (Docker AUFS-related bug maybe?)\nCOPY ssh_host_rsa_key /tmp/etc/ssh/ssh_host_rsa_key\nRUN mv /tmp/etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_rsa_key\nRUN chmod 600 /etc/ssh/ssh_host_rsa_key\n\nCOPY ssh_host_ecdsa_key /tmp/etc/ssh/ssh_host_ecdsa_key\nRUN mv /tmp/etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ecdsa_key\nRUN chmod 600 /etc/ssh/ssh_host_ecdsa_key\n\nCOPY ssh_host_ed25519_key /tmp/etc/ssh/ssh_host_ed25519_key\nRUN mv /tmp/etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_ed25519_key\nRUN chmod 600 /etc/ssh/ssh_host_ed25519_key\n\nRUN adduser --disabled-password --gecos 'Test user for libssh2 integration tests' libssh2\nRUN echo 'libssh2:my test password' | chpasswd\n\nRUN sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/' /etc/ssh/sshd_config\n\n# SSH login fix. Otherwise user is kicked off after login\nRUN sed 's@session\\s*required\\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd\n\nUSER libssh2\n\nRUN mkdir -p /home/libssh2/.ssh\nRUN mkdir -p /home/libssh2/sandbox\n\nCOPY authorized_keys /tmp/libssh2/.ssh/authorized_keys\nRUN cp /tmp/libssh2/.ssh/authorized_keys /home/libssh2/.ssh/authorized_keys\nRUN chmod 600 /home/libssh2/.ssh/authorized_keys\n\nUSER root\n\nEXPOSE 22\n# -e gives logs via 'docker logs'\nCMD [\"/usr/sbin/sshd\", \"-D\", \"-e\"]\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/openssh_server/authorized_keys",
    "content": "ssh-dss AAAAB3NzaC1kc3MAAACBAK2Jh2Ck+8W1+LsFrjgOIH7XHySiONPSdG+faFTZprinh9cjyR3odzntVA7+UuFH14WnGM/ub6MbAXjrxDo1TzGILvW5x6nQ6hdLu7xFygihZ8sO1mIMOVqGdlNbTiYHl8XGjbLt1iXfW8ThM91LGGqmS+cgEiy0wWHYzsOXTDz9AAAAFQD/ebunYNTluoBrEYIoq3LMtQPbcwAAAIEAjPBzkUKcmfMAmb0eO/QAVXmX+L8NC6Vn2m4QguQ2IcJ8NH6VMnxXEBHsnemCOa9jN55G+LnX17PViuKS0O3rqQiSdA5wcHyCHKBT519/v1KQNymDwudfnFvdxUyAAG6MDSxKlpbXDCbrhFd2+ahC9a7rKalRPSXR0R2hhWRvjK0AAACAJ+CGwV/1S4j1GVwa6pSP0nj4V86GWXosTTBg7GT+rKWu8lrxIcr6FzLWgFi/gHoMrgnKWGxO1yF7vkoYM5Yfo84oBYiH+MgpiBuOrZrgzacHsA66JJbUfrESRFWZl2blIPr6Gyjj6cVGgMabK3yCiTRi0v7hwffpm0rKyKv7Goo= awl03@bounty\nssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAnak1T7zHJ+hVRFBDQ9pf1KVzmd5gaNc7y7NPmL13aOG3sYeJevi1x1WM/R3tb8XnUnzZUX9GJN0MYovvZsw9bknG1mDP72LFbGp/gzPddGIKHBBpvceDaJ85sM/ME3XOtD7uuXQuNAuEHwEzSMMiSIEMcQS+lXIcMLr5xPLEkyNvqsO5RqSjMTLHKHgY8gLWx7oQ1avokhwuDxF7P3Pqtj+rW2Te6vR0i1H6EyFPsBkzkgNXb33cus8M1CnTmYTSgJgmHO2LLcGpjQ5sL8T/PWIWHaSqTnkrFXEMysgoteXnAYILjzyBaqq2WV4KA3TluGdAP2p8gC32QtKmIuis3Q== awl03@bounty\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC92YlGoc4PJy6DzX916JJZhxkvmkWBLGJdWOL7R9B6iaYEKebBxzTE3P1RcnxnuI06kklVq/KcDP9sLlgawTZcDg7ifM7HncPOi18OON8vvVVzodikHzuupjhpI5YTT9wwV2fDVi2URsBjvX4AFiZ5WM3/NwqdKpYABzWieBikXGJ58Tsnw+zQw2qMmKKESBuzSN538loTAj5iEH/GAKYDbbH9t2a17qhNCNEw4vrtURT9JqwO1cOg7N1OKpmqCPEbK0wuSTljNC230VJ06X/8UqahWWSH6MreGy6gwpPi6i9wFiFLur301R0dTPiKVhz6bguhcC1EAlhSgjfelFJt awl03@bounty\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTe1lN2L/yet0Ma1JzXkQf3t1f+pauALec2FsGZy87KRJW1AOxcTTiePjlFwP1yfSK1lWXQ+uf0b61gkKqqR52FDky24HJWuYlfXlEQMn2d/PNDNVDDbO4TXKyNxxUHFJ6qYMNd4kWjOH+6rmYoWKsWV+3mDRbHagbVPEYL8wep8OTqKOqruVLVPzZyYZkBtn4XOFi6UE8WKiSVdK1Am1O5UxvlD95t32eYch6wQ9azgMqja6spe/L5UJgP83QZFknVC3wPZWkjqomVFql0FpaQclENwyY/OZMxr0cT/f7bCL6s4A/1XpbsGmC0xak4/THHbOn+0LdIej2nGV8JFoR\nssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIxtdyg2ZRXE70UwyPVUH3UyfDBV8GX5cPF636P6hjom\nssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICHxEyUTOVHXvdMFARedFQ+H9DW/n8Zy3daKKRqnTDMq\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/openssh_server/ssh_host_ecdsa_key",
    "content": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIKdqGrp+52U1ehslMI4fX0cmvgHFmKSkMzQGmj6B07ecoAoGCCqGSM49\nAwEHoUQDQgAEL7+zLJ4okP10LZkf1DuIkZF5HhgzetQIyxLKeTJeiN19IKUYIxjs\nm9aW3fQRKNi/GhN9JEbHpa9qpgr+8+hhDg==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/openssh_server/ssh_host_ed25519_key",
    "content": "-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW\nQyNTUxOQAAACCMbXcoNmUVxO9FMMj1VB91MnwwVfBl+XDxet+j+oY6JgAAAJg8nvUxPJ71\nMQAAAAtzc2gtZWQyNTUxOQAAACCMbXcoNmUVxO9FMMj1VB91MnwwVfBl+XDxet+j+oY6Jg\nAAAECnhCuTDYdz3kUn48BXkaCXXdbKdH7wSIQ/CUx1cbnR0Ixtdyg2ZRXE70UwyPVUH3Uy\nfDBV8GX5cPF636P6hjomAAAAEHdpbGxAaUN1YmUubG9jYWwBAgMEBQ==\n-----END OPENSSH PRIVATE KEY-----\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/openssh_server/ssh_host_rsa_key",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIEoQIBAAKCAQEArrr/JuJmaZligyfS8vcNur+mWR2ddDQtVdhHzdKUUoR6/Om6\ncvxpe61H1YZO1xCpLUBXmkki4HoNtYOpPB2W4V+8U4BDeVBD5crypEOE1+7BAm99\nfnEDxYIOZq2/jTP0yQmzCpWYS3COyFmkOL7sfX1wQMeW5zQT2WKcxC6FSWbhDqrB\neNEGi687hJJoJ7YXgY/IdiYW5NcOuqRSWljjGS3dAJsHHWk4nJbhjEDXbPaeduMA\nwQU9i6ELfP3r+q6wdu0P4jWaoo3De1aYxnToV/ldXykpipON4NPamsb6Ph2qlJQK\nypq7J4iQgkIIbCU1A31+4ExvcIVoxLQw/aTSbwIBIwKCAQAd9Cu9heWrs+UAinvv\nIwmq/EhnDGQijJoOt1zEMrpXSekyq7mQDgN0SZdJLPeSlSRQ5nVq5/dZroYB3A5i\nE7N3F7nibcJskWq5rcMyGjQHwod8wqfMiGcL6mjeZu2jLXprm0NDpJ3DyicbCA2G\nEhnpoHmktIBE5FsslI/nHer2o6OA/kVWSEjak+pvI1pm22T8QOBBfY0yAX7B0ebk\n8o4lB4cdLf3In7Q0ahpHNOwIPdRvQ2c4Tm/DcfUBkTW2ZYGUd45cFsyHqXZscNNy\nGX2Wcy/FLEvQ6zBFJsNLpxCYsUyBxfSDygn9dx9RQfiWFXjdRaRPpyRAr+BTXkLU\nyvabAoGBANt7sxfjvu/SLkRc7TnBoJ0h/AL7Mcuu9PJmOnis4boyF9ZxqbiRiS3J\nyK+EKxfC0S+xf5WJ5uf7dVGnOXHXKaRl4xH90iRtryNlvtILZwHw1DTqRFxv9jtz\ntTRrYMEHAnMKzadgDfV/lv4iJ6nwFzK76GQ7RQNZYiGTMEh3pUNjAoGBAMvNLGpz\nFxhpIh+fVvRjawKgGVP87T482WOUdsF18EEPFMe6D7DO5xpLuJi+C7QkvMI8WjvD\n/3RGvaSh9Wt7ikLZpeogiSJy121HsEqheTR5hTx2t72ClrjZvIhLbQMRu6PqGPu/\nHOC2urEGGYm7O2vnftwpuG3zIVVLM2KstPCFAoGBAM7w+VEJ7opYdMQdGi8kRvqN\nwbmrAxCAY0ryrCijALbexgS0T5DDu9q28Gr49W4stpquq35dc0/BNBnJje7+EVHc\naGFrqOCErHHU9b66Sy23LnsIxBykFAwrRHNAq66u1mx35nk9Tv1pq58nhHun21u4\nfAa7ijZblwm2qd3tJsqBAoGAEXf8ficfPJtMEVbM8GBLADmbxV7Sga1xuBQKLdbo\ntR6MwKmMUPvKqnuE2eRnZzZZUnoznrkHRHsXkcS9Q7ohyzc6G2Hf3mGdb8RQ8HQ9\nlsiWZESwqdf+SlvOVNND27EQFV01V2gnC/JnxgfWTaJVjOf07ky4CWycdQZyHmaT\nKo8CgYB58jOyXMdo2ggOCG/HX2H92KPPpFUBFCX27fCue8BZLD5quIltpXupx5oj\nEyltgvPcmNDgvdSadkHvP5s6nykS+n5we+d9yIIJF/BfETWsXjR3ooip+trqiirw\n0aHqUDFcYn9unm2wtrMYYViiDLRijNwLZ2sG0JIU4JHyseh+NA==\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/runner.c",
    "content": "/* Copyright (C) 2016 Alexander Lamaison\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"session_fixture.h\"\n\nextern int test(LIBSSH2_SESSION *session);\n\nint main()\n{\n    int exit_code = 1;\n    LIBSSH2_SESSION *session = start_session_fixture();\n    if(session != NULL) {\n        exit_code = (test(session) == 0) ? 0 : 1;\n    }\n    stop_session_fixture();\n    return exit_code;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/session_fixture.c",
    "content": "/* Copyright (C) 2016 Alexander Lamaison\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include \"session_fixture.h\"\n#include \"libssh2_config.h\"\n#include \"openssh_fixture.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n\n#ifdef HAVE_WINDOWS_H\n#include <windows.h>\n#endif\n#ifdef HAVE_WINSOCK2_H\n#include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n#include <sys/socket.h>\n#endif\n#ifdef HAVE_SYS_PARAM_H\n#include <sys/param.h>\n#endif\n\nLIBSSH2_SESSION *connected_session = NULL;\nint connected_socket = -1;\n\nstatic int connect_to_server()\n{\n    int rc;\n    connected_socket = open_socket_to_openssh_server();\n    if(connected_socket <= 0) {\n        return -1;\n    }\n\n    rc = libssh2_session_handshake(connected_session, connected_socket);\n    if(rc != 0) {\n        print_last_session_error(\"libssh2_session_handshake\");\n        return -1;\n    }\n\n    return 0;\n}\n\nvoid setup_fixture_workdir()\n{\n    char *wd = getenv(\"FIXTURE_WORKDIR\");\n#ifdef FIXTURE_WORKDIR\n    if(!wd) {\n        wd = FIXTURE_WORKDIR;\n    }\n#endif\n    if(!wd) {\n#ifdef WIN32\n        char wd_buf[_MAX_PATH];\n#else\n        char wd_buf[MAXPATHLEN];\n#endif\n        getcwd(wd_buf, sizeof(wd_buf));\n        wd = wd_buf;\n    }\n\n    chdir(wd);\n}\n\nLIBSSH2_SESSION *start_session_fixture()\n{\n    int rc;\n\n    setup_fixture_workdir();\n\n    rc = start_openssh_fixture();\n    if(rc != 0) {\n        return NULL;\n    }\n    rc = libssh2_init(0);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2_init failed (%d)\\n\", rc);\n        return NULL;\n    }\n\n    connected_session = libssh2_session_init_ex(NULL, NULL, NULL, NULL);\n    libssh2_session_set_blocking(connected_session, 1);\n    if(connected_session == NULL) {\n        fprintf(stderr, \"libssh2_session_init_ex failed\\n\");\n        return NULL;\n    }\n\n    rc = connect_to_server();\n    if(rc != 0) {\n        return NULL;\n    }\n\n    return connected_session;\n}\n\nvoid print_last_session_error(const char *function)\n{\n    if(connected_session) {\n        char *message;\n        int rc =\n            libssh2_session_last_error(connected_session, &message, NULL, 0);\n        fprintf(stderr, \"%s failed (%d): %s\\n\", function, rc, message);\n    }\n    else {\n        fprintf(stderr, \"No session\");\n    }\n}\n\nvoid stop_session_fixture()\n{\n    if(connected_session) {\n        libssh2_session_disconnect(connected_session, \"test ended\");\n        libssh2_session_free(connected_session);\n        shutdown(connected_socket, 2);\n        connected_session = NULL;\n    }\n    else {\n        fprintf(stderr, \"Cannot stop session - none started\");\n    }\n\n    stop_openssh_fixture();\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/session_fixture.h",
    "content": "/* Copyright (C) 2016 Alexander Lamaison\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_TESTS_SESSION_FIXTURE_H\n#define LIBSSH2_TESTS_SESSION_FIXTURE_H\n\n#include <libssh2.h>\n\nLIBSSH2_SESSION *start_session_fixture();\nvoid stop_session_fixture();\nvoid print_last_session_error(const char *function);\n\n#endif\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/simple.c",
    "content": "/* Copyright (C) 2007 The Written Word, Inc.\n * Copyright (C) 2008, 2010 Simon Josefsson\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"libssh2.h\"\n\nstatic int test_libssh2_base64_decode(LIBSSH2_SESSION *session)\n{\n    char *data;\n    unsigned int datalen;\n    const char *src = \"Zm5vcmQ=\";\n    unsigned int src_len = strlen(src);\n    int ret;\n\n    ret = libssh2_base64_decode(session, &data, &datalen,\n                                src, src_len);\n    if(ret)\n        return ret;\n\n    if(datalen != 5 || strcmp(data, \"fnord\") != 0) {\n        fprintf(stderr,\n                \"libssh2_base64_decode() failed (%d, %.*s)\\n\",\n                datalen, datalen, data);\n        return 1;\n    }\n\n    free(data);\n\n    return 0;\n}\n\nint main(int argc, char *argv[])\n{\n    LIBSSH2_SESSION *session;\n    int rc;\n    (void)argv;\n    (void)argc;\n\n    rc = libssh2_init(LIBSSH2_INIT_NO_CRYPTO);\n    if(rc != 0) {\n        fprintf(stderr, \"libssh2_init() failed: %d\\n\", rc);\n        return 1;\n    }\n\n    session = libssh2_session_init();\n    if(!session) {\n        fprintf(stderr, \"libssh2_session_init() failed\\n\");\n        return 1;\n    }\n\n    test_libssh2_base64_decode(session);\n\n    libssh2_session_free(session);\n\n    libssh2_exit();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/ssh2.c",
    "content": "/* Self test, based on examples/ssh2.c. */\n\n#include \"libssh2_config.h\"\n#include <libssh2.h>\n#include <libssh2_sftp.h>\n\n#ifdef HAVE_WINDOWS_H\n# include <windows.h>\n#endif\n#ifdef HAVE_WINSOCK2_H\n# include <winsock2.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n#ifdef HAVE_NETINET_IN_H\n# include <netinet/in.h>\n#endif\n# ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n# ifdef HAVE_ARPA_INET_H\n#include <arpa/inet.h>\n#endif\n\n#include <sys/types.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <ctype.h>\n\nint main(int argc, char *argv[])\n{\n    unsigned long hostaddr;\n    int sock, i, auth_pw = 0;\n    struct sockaddr_in sin;\n    const char *fingerprint;\n    char *userauthlist;\n    LIBSSH2_SESSION *session;\n    LIBSSH2_CHANNEL *channel;\n    const char *pubkeyfile = \"etc/user.pub\";\n    const char *privkeyfile = \"etc/user\";\n    const char *username = \"username\";\n    const char *password = \"password\";\n    int ec = 1;\n\n#ifdef WIN32\n    WSADATA wsadata;\n    int err;\n\n    err = WSAStartup(MAKEWORD(2, 0), &wsadata);\n    if(err != 0) {\n        fprintf(stderr, \"WSAStartup failed with error: %d\\n\", err);\n        return -1;\n    }\n#endif\n\n    (void)argc;\n    (void)argv;\n\n    if(getenv(\"USER\"))\n      username = getenv(\"USER\");\n\n    if(getenv (\"PRIVKEY\"))\n      privkeyfile = getenv(\"PRIVKEY\");\n\n    if(getenv(\"PUBKEY\"))\n      pubkeyfile = getenv(\"PUBKEY\");\n\n    hostaddr = htonl(0x7F000001);\n\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n#ifndef WIN32\n    fcntl(sock, F_SETFL, 0);\n#endif\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(4711);\n    sin.sin_addr.s_addr = hostaddr;\n    if(connect(sock, (struct sockaddr*)(&sin),\n                sizeof(struct sockaddr_in)) != 0) {\n        fprintf(stderr, \"failed to connect!\\n\");\n        return 1;\n    }\n\n    /* Create a session instance and start it up\n     * This will trade welcome banners, exchange keys, and setup crypto, compression, and MAC layers\n     */\n    session = libssh2_session_init();\n    if(libssh2_session_startup(session, sock)) {\n        fprintf(stderr, \"Failure establishing SSH session\\n\");\n        return 1;\n    }\n\n    /* At this point we havn't authenticated,\n     * The first thing to do is check the hostkey's fingerprint against our known hosts\n     * Your app may have it hard coded, may go to a file, may present it to the user, that's your call\n     */\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    printf(\"Fingerprint: \");\n    for(i = 0; i < 20; i++) {\n        printf(\"%02X \", (unsigned char)fingerprint[i]);\n    }\n    printf(\"\\n\");\n\n    /* check what authentication methods are available */\n    userauthlist = libssh2_userauth_list(session, username, strlen(username));\n    printf(\"Authentication methods: %s\\n\", userauthlist);\n    if(strstr(userauthlist, \"password\") != NULL) {\n        auth_pw |= 1;\n    }\n    if(strstr(userauthlist, \"keyboard-interactive\") != NULL) {\n        auth_pw |= 2;\n    }\n    if(strstr(userauthlist, \"publickey\") != NULL) {\n        auth_pw |= 4;\n    }\n\n    if(auth_pw & 4) {\n        /* Authenticate by public key */\n        if(libssh2_userauth_publickey_fromfile(session, username, pubkeyfile, privkeyfile, password)) {\n            printf(\"\\tAuthentication by public key failed!\\n\");\n            goto shutdown;\n        }\n        else {\n            printf(\"\\tAuthentication by public key succeeded.\\n\");\n        }\n    }\n    else {\n        printf(\"No supported authentication methods found!\\n\");\n        goto shutdown;\n    }\n\n    /* Request a shell */\n    channel = libssh2_channel_open_session(session);\n    if(!channel) {\n        fprintf(stderr, \"Unable to open a session\\n\");\n        goto shutdown;\n    }\n\n    /* Some environment variables may be set,\n     * It's up to the server which ones it'll allow though\n     */\n    libssh2_channel_setenv(channel, \"FOO\", \"bar\");\n\n    /* Request a terminal with 'vanilla' terminal emulation\n     * See /etc/termcap for more options\n     */\n    if(libssh2_channel_request_pty(channel, \"vanilla\")) {\n        fprintf(stderr, \"Failed requesting pty\\n\");\n        goto skip_shell;\n    }\n\n    /* Open a SHELL on that pty */\n    if(libssh2_channel_shell(channel)) {\n        fprintf(stderr, \"Unable to request shell on allocated pty\\n\");\n        goto shutdown;\n    }\n\n    ec = 0;\n\n  skip_shell:\n    if(channel) {\n        libssh2_channel_free(channel);\n        channel = NULL;\n    }\n\n  shutdown:\n\n    libssh2_session_disconnect(session, \"Normal Shutdown\");\n    libssh2_session_free(session);\n\n#ifdef WIN32\n    Sleep(1000);\n    closesocket(sock);\n#else\n    sleep(1);\n    close(sock);\n#endif\n\n    return ec;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/ssh2.sh",
    "content": "#!/bin/sh\n\n# Written by Simon Josefsson.\n\n# Start sshd, invoke parameters, saving exit code, kill sshd, and\n# return exit code.\n\nsrcdir=${srcdir:-$PWD}\nSSHD=${SSHD:-/usr/sbin/sshd}\n\ncmd=\"./ssh2${EXEEXT}\"\nsrcdir=`cd \"$srcdir\"; pwd`\n\nPRIVKEY=$srcdir/etc/user\nexport PRIVKEY\nPUBKEY=$srcdir/etc/user.pub\nexport PUBKEY\n\nif test -n \"$DEBUG\"; then\n    libssh2_sshd_params=\"-d -d\"\nfi\n\nchmod go-rwx \"$srcdir\"/etc/host*\n$SSHD -f /dev/null -h \"$srcdir\"/etc/host \\\n    -o 'Port 4711' \\\n    -o 'Protocol 2' \\\n    -o \"AuthorizedKeysFile $srcdir/etc/user.pub\" \\\n    -o 'UsePrivilegeSeparation no' \\\n    -o 'StrictModes no' \\\n    -D \\\n    $libssh2_sshd_params &\nsshdpid=$!\n\ntrap \"kill ${sshdpid}; echo signal killing sshd; exit 1;\" EXIT\n\n: \"started sshd (${sshdpid})\"\n\nsleep 3\n\n: Invoking $cmd...\neval $cmd\nec=$?\n: Self-test exit code $ec\n\n: \"killing sshd (${sshdpid})\"\nkill \"${sshdpid}\" > /dev/null 2>&1\ntrap \"\" EXIT\nexit $ec\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/sshd_fixture.sh.in",
    "content": "#!/bin/sh\n\n# Written by Simon Josefsson.\n\n# Start sshd, invoke parameters, saving exit code, kill sshd, and\n# return exit code.\n\nsrcdir=\"@SSHD_TEST_CONFIG_DIR@\"\nSSHD=\"@SSHD_EXECUTABLE@\"\n\ncmd=\"\\\"$1\\\"\"\n\nPRIVKEY=$srcdir/etc/user\nexport PRIVKEY\nPUBKEY=$srcdir/etc/user.pub\nexport PUBKEY\n\nif test -n \"$DEBUG\"; then\n    libssh2_sshd_params=\"-d -d\"\nfi\n\nchmod go-rwx \"$srcdir\"/etc/host*\n\"$SSHD\" -f /dev/null -h \"$srcdir/etc/host\" \\\n    -o 'Port 4711' \\\n    -o 'Protocol 2' \\\n    -o \"AuthorizedKeysFile \\\"$srcdir/etc/user.pub\\\"\" \\\n    -o 'UsePrivilegeSeparation no' \\\n    -o 'StrictModes no' \\\n    -D \\\n    $libssh2_sshd_params &\nsshdpid=$!\n\ntrap \"kill ${sshdpid}; echo signal killing sshd; exit 1;\" EXIT\n\n: \"started sshd (${sshdpid})\"\n\nsleep 3\n\nif ! kill -0 ${sshdpid}\nthen\n    echo \"SSHD exited before test started\"\n    exit 1\nfi\n\n: Invoking $cmd...\neval \"$cmd\"\nec=$?\n: Self-test exit code $ec\n\n: \"killing sshd (${sshdpid})\"\nkill \"${sshdpid}\" > /dev/null 2>&1\ntrap \"\" EXIT\nexit $ec\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/sshdwrap",
    "content": "#!/bin/sh -x\n\n# Written by Simon Josefsson\n\n# Start sshd, invoke parameters, saving exit code, kill sshd, and\n# return exit code.\n\ncmd=\"$@\"\nSSHD=${SSHD:-/usr/sbin/sshd}\n\n$SSHD -f etc/sshd_config -h $PWD/etc/host -D &\nsshdpid=$!\n\ntrap \"kill ${sshdpid}; echo signal killing sshd; exit 1;\" EXIT\n\n: \"started sshd (${sshdpid})\"\n\nsleep 1\n\n: Invoking $cmd...\neval $cmd\nec=$?\n: Self-test exit code $ec\n\n: \"killing sshd (${sshdpid})\"\nkill \"${sshdpid}\" > /dev/null 2>&1\ntrap \"\" EXIT\nexit $ec\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/test_hostkey.c",
    "content": "#include \"session_fixture.h\"\n\n#include <libssh2.h>\n\n#include <stdio.h>\n\nstatic const char *EXPECTED_RSA_HOSTKEY =\n    \"AAAAB3NzaC1yc2EAAAABIwAAAQEArrr/JuJmaZligyfS8vcNur+mWR2ddDQtVdhHzdKU\"\n    \"UoR6/Om6cvxpe61H1YZO1xCpLUBXmkki4HoNtYOpPB2W4V+8U4BDeVBD5crypEOE1+7B\"\n    \"Am99fnEDxYIOZq2/jTP0yQmzCpWYS3COyFmkOL7sfX1wQMeW5zQT2WKcxC6FSWbhDqrB\"\n    \"eNEGi687hJJoJ7YXgY/IdiYW5NcOuqRSWljjGS3dAJsHHWk4nJbhjEDXbPaeduMAwQU9\"\n    \"i6ELfP3r+q6wdu0P4jWaoo3De1aYxnToV/ldXykpipON4NPamsb6Ph2qlJQKypq7J4iQ\"\n    \"gkIIbCU1A31+4ExvcIVoxLQw/aTSbw==\";\n\nstatic const char *EXPECTED_ECDSA_HOSTKEY =\n    \"AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBC+/syyeKJD9dC2ZH\"\n    \"9Q7iJGReR4YM3rUCMsSynkyXojdfSClGCMY7JvWlt30ESjYvxoTfSRGx6WvaqYK/vPoYQ4=\";\n\nint test(LIBSSH2_SESSION *session)\n{\n    int rc;\n    size_t len;\n    int type;\n    unsigned int expected_len = 0;\n    char *expected_hostkey = NULL;\n\n    const char *hostkey = libssh2_session_hostkey(session, &len, &type);\n    if(hostkey == NULL) {\n        print_last_session_error(\"libssh2_session_hostkey\");\n        return 1;\n    }\n\n    if(type == LIBSSH2_HOSTKEY_TYPE_ECDSA_256) {\n        rc = libssh2_base64_decode(session, &expected_hostkey, &expected_len,\n                                   EXPECTED_ECDSA_HOSTKEY, strlen(EXPECTED_ECDSA_HOSTKEY));\n    }\n    else if(type == LIBSSH2_HOSTKEY_TYPE_RSA) {\n        rc = libssh2_base64_decode(session, &expected_hostkey, &expected_len,\n                                   EXPECTED_RSA_HOSTKEY, strlen(EXPECTED_RSA_HOSTKEY));\n    }\n    else {\n        fprintf(stderr, \"Unexpected type of hostkey: %i\\n\", type);\n        return 1;\n    }\n\n    if(rc != 0) {\n        print_last_session_error(\"libssh2_base64_decode\");\n        return 1;\n    }\n\n    if(len != expected_len) {\n        fprintf(stderr, \"Hostkey does not have the expected length %ld != %d\\n\",\n                (unsigned long)len, expected_len);\n        return 1;\n    }\n\n    if(memcmp(hostkey, expected_hostkey, len) != 0) {\n        fprintf(stderr, \"Hostkeys do not match\\n\");\n        return 1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/test_hostkey_hash.c",
    "content": "#include \"session_fixture.h\"\n#include \"libssh2_config.h\"\n\n#include <libssh2.h>\n\n#include <stdio.h>\n\nstatic const char *EXPECTED_RSA_HOSTKEY =\n    \"AAAAB3NzaC1yc2EAAAABIwAAAQEArrr/JuJmaZligyfS8vcNur+mWR2ddDQtVdhHzdKU\"\n    \"UoR6/Om6cvxpe61H1YZO1xCpLUBXmkki4HoNtYOpPB2W4V+8U4BDeVBD5crypEOE1+7B\"\n    \"Am99fnEDxYIOZq2/jTP0yQmzCpWYS3COyFmkOL7sfX1wQMeW5zQT2WKcxC6FSWbhDqrB\"\n    \"eNEGi687hJJoJ7YXgY/IdiYW5NcOuqRSWljjGS3dAJsHHWk4nJbhjEDXbPaeduMAwQU9\"\n    \"i6ELfP3r+q6wdu0P4jWaoo3De1aYxnToV/ldXykpipON4NPamsb6Ph2qlJQKypq7J4iQ\"\n    \"gkIIbCU1A31+4ExvcIVoxLQw/aTSbw==\";\n\nstatic const char *EXPECTED_ECDSA_HOSTKEY =\n    \"AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBC+/syyeKJD9dC2ZH\"\n    \"9Q7iJGReR4YM3rUCMsSynkyXojdfSClGCMY7JvWlt30ESjYvxoTfSRGx6WvaqYK/vPoYQ4=\";\n\nstatic const char *EXPECTED_RSA_MD5_HASH_DIGEST = \"0C0ED1A5BB10275F76924CE187CE5C5E\";\n\nstatic const char *EXPECTED_RSA_SHA1_HASH_DIGEST =\n    \"F3CD59E2913F4422B80F7B0A82B2B89EAE449387\";\n\nstatic const char *EXPECTED_RSA_SHA256_HASH_DIGEST = \"92E3DA49DF3C7F99A828F505ED8239397A5D1F62914459760F878F7510F563A3\";\n\nstatic const char *EXPECTED_ECDSA_MD5_HASH_DIGEST = \"0402E4D897580BBC911379CBD88BCD3D\";\n\nstatic const char *EXPECTED_ECDSA_SHA1_HASH_DIGEST =\n    \"12FDAD1E3B31B10BABB00F2A8D1B9A62C326BD2F\";\n\nstatic const char *EXPECTED_ECDSA_SHA256_HASH_DIGEST = \"56FCD975B166C3F0342D0036E44C311A86C0EAE40713B53FC776369BAE7F5264\";\n\nstatic const int MD5_HASH_SIZE = 16;\nstatic const int SHA1_HASH_SIZE = 20;\nstatic const int SHA256_HASH_SIZE = 32;\n\nstatic void calculate_digest(const char *hash, size_t hash_len, char *buffer,\n                             size_t buffer_len)\n{\n    size_t i;\n    char *p = buffer;\n    char *end = buffer + buffer_len;\n\n    for(i = 0; i < hash_len && p < end; ++i) {\n        p += snprintf(p, end - p, \"%02X\", (unsigned char)hash[i]);\n    }\n}\n\nint test(LIBSSH2_SESSION *session)\n{\n    char buf[BUFSIZ];\n\n    const char *md5_hash;\n    const char *sha1_hash;\n    const char *sha256_hash;\n    int type;\n    size_t len;\n\n    /* these are the host keys under test, they are currently unused */\n    (void)EXPECTED_RSA_HOSTKEY;\n    (void)EXPECTED_ECDSA_HOSTKEY;\n\n    const char *hostkey = libssh2_session_hostkey(session, &len, &type);\n    if(hostkey == NULL) {\n        print_last_session_error(\"libssh2_session_hostkey\");\n        return 1;\n    }\n\n    if(type == LIBSSH2_HOSTKEY_TYPE_ECDSA_256) {\n\n        md5_hash = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_MD5);\n        if(md5_hash == NULL) {\n            print_last_session_error(\n                \"libssh2_hostkey_hash(LIBSSH2_HOSTKEY_HASH_MD5)\");\n            return 1;\n        }\n\n        calculate_digest(md5_hash, MD5_HASH_SIZE, buf, BUFSIZ);\n\n        if(strcmp(buf, EXPECTED_ECDSA_MD5_HASH_DIGEST) != 0) {\n            fprintf(stderr, \"ECDSA MD5 hash not as expected - digest %s != %s\\n\", buf,\n                    EXPECTED_ECDSA_MD5_HASH_DIGEST);\n            return 1;\n        }\n\n        sha1_hash = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n        if(sha1_hash == NULL) {\n            print_last_session_error(\n                \"libssh2_hostkey_hash(LIBSSH2_HOSTKEY_HASH_SHA1)\");\n            return 1;\n        }\n\n        calculate_digest(sha1_hash, SHA1_HASH_SIZE, buf, BUFSIZ);\n\n        if(strcmp(buf, EXPECTED_ECDSA_SHA1_HASH_DIGEST) != 0) {\n            fprintf(stderr, \"ECDSA SHA1 hash not as expected - digest %s != %s\\n\", buf,\n                    EXPECTED_ECDSA_SHA1_HASH_DIGEST);\n            return 1;\n        }\n\n        sha256_hash = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA256);\n        if(sha256_hash == NULL) {\n            print_last_session_error(\n                \"libssh2_hostkey_hash(LIBSSH2_HOSTKEY_HASH_SHA256)\");\n            return 1;\n        }\n\n        calculate_digest(sha256_hash, SHA256_HASH_SIZE, buf, BUFSIZ);\n\n        if(strcmp(buf, EXPECTED_ECDSA_SHA256_HASH_DIGEST) != 0) {\n            fprintf(stderr, \"ECDSA SHA256 hash not as expected - digest %s != %s\\n\", buf,\n                    EXPECTED_ECDSA_SHA256_HASH_DIGEST);\n            return 1;\n        }\n\n    }\n    else if(type == LIBSSH2_HOSTKEY_TYPE_RSA) {\n\n        md5_hash = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_MD5);\n        if(md5_hash == NULL) {\n            print_last_session_error(\n                \"libssh2_hostkey_hash(LIBSSH2_HOSTKEY_HASH_MD5)\");\n            return 1;\n        }\n\n        calculate_digest(md5_hash, MD5_HASH_SIZE, buf, BUFSIZ);\n\n        if(strcmp(buf, EXPECTED_RSA_MD5_HASH_DIGEST) != 0) {\n            fprintf(stderr, \"MD5 hash not as expected - digest %s != %s\\n\", buf,\n                    EXPECTED_RSA_MD5_HASH_DIGEST);\n            return 1;\n        }\n\n        sha1_hash = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n        if(sha1_hash == NULL) {\n            print_last_session_error(\n                \"libssh2_hostkey_hash(LIBSSH2_HOSTKEY_HASH_SHA1)\");\n            return 1;\n        }\n\n        calculate_digest(sha1_hash, SHA1_HASH_SIZE, buf, BUFSIZ);\n\n        if(strcmp(buf, EXPECTED_RSA_SHA1_HASH_DIGEST) != 0) {\n            fprintf(stderr, \"SHA1 hash not as expected - digest %s != %s\\n\", buf,\n                    EXPECTED_RSA_SHA1_HASH_DIGEST);\n            return 1;\n        }\n\n        sha256_hash = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA256);\n        if(sha256_hash == NULL) {\n            print_last_session_error(\n                \"libssh2_hostkey_hash(LIBSSH2_HOSTKEY_HASH_SHA256)\");\n            return 1;\n        }\n\n        calculate_digest(sha256_hash, SHA256_HASH_SIZE, buf, BUFSIZ);\n\n        if(strcmp(buf, EXPECTED_RSA_SHA256_HASH_DIGEST) != 0) {\n            fprintf(stderr, \"SHA256 hash not as expected - digest %s != %s\\n\", buf,\n                    EXPECTED_RSA_SHA256_HASH_DIGEST);\n            return 1;\n        }\n    }\n    else {\n        fprintf(stderr, \"Unexpected type of hostkey: %i\\n\", type);\n        return 1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/test_keyboard_interactive_auth_fails_with_wrong_response.c",
    "content": "#include \"session_fixture.h\"\n\n#include <libssh2.h>\n\n#include <stdio.h>\n\nstatic const char *USERNAME = \"libssh2\"; /* configured in Dockerfile */\nstatic const char *WRONG_PASSWORD = \"i'm not the password\";\n\nstatic void kbd_callback(const char *name, int name_len,\n                         const char *instruction, int instruction_len,\n                         int num_prompts,\n                         const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,\n                         LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses,\n                         void **abstract)\n{\n    int i;\n    (void)abstract;\n    fprintf(stdout, \"Kb-int name: %.*s\\n\", name_len, name);\n    fprintf(stdout, \"Kb-int instruction: %.*s\\n\", instruction_len, instruction);\n    for(i = 0; i < num_prompts; ++i) {\n        fprintf(stdout, \"Kb-int prompt %d: %.*s\\n\", i, prompts[i].length,\n                prompts[i].text);\n    }\n\n    if(num_prompts == 1) {\n        responses[0].text = strdup(WRONG_PASSWORD);\n        responses[0].length = strlen(WRONG_PASSWORD);\n    }\n}\n\nint test(LIBSSH2_SESSION *session)\n{\n    int rc;\n\n    const char *userauth_list =\n        libssh2_userauth_list(session, USERNAME, strlen(USERNAME));\n    if(userauth_list == NULL) {\n        print_last_session_error(\"libssh2_userauth_list\");\n        return 1;\n    }\n\n    if(strstr(userauth_list, \"keyboard-interactive\") == NULL) {\n        fprintf(stderr,\n                \"'keyboard-interactive' was expected in userauth list: %s\\n\",\n                userauth_list);\n        return 1;\n    }\n\n    rc = libssh2_userauth_keyboard_interactive_ex(\n        session, USERNAME, strlen(USERNAME), kbd_callback);\n    if(rc == 0) {\n        fprintf(stderr,\n                \"Keyboard-interactive auth succeeded with wrong response\\n\");\n        return 1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/test_keyboard_interactive_auth_succeeds_with_correct_response.c",
    "content": "#include \"session_fixture.h\"\n\n#include <libssh2.h>\n\n#include <stdio.h>\n\nstatic const char *USERNAME = \"libssh2\";          /* configured in Dockerfile */\nstatic const char *PASSWORD = \"my test password\"; /* configured in Dockerfile */\n\nstatic void kbd_callback(const char *name, int name_len,\n                         const char *instruction, int instruction_len,\n                         int num_prompts,\n                         const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,\n                         LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses,\n                         void **abstract)\n{\n    int i;\n    (void)abstract;\n\n    fprintf(stdout, \"Kb-int name: %.*s\\n\", name_len, name);\n    fprintf(stdout, \"Kb-int instruction: %.*s\\n\", instruction_len, instruction);\n    for(i = 0; i < num_prompts; ++i) {\n        fprintf(stdout, \"Kb-int prompt %d: %.*s\\n\", i, prompts[i].length,\n                prompts[i].text);\n    }\n\n    if(num_prompts == 1) {\n        responses[0].text = strdup(PASSWORD);\n        responses[0].length = strlen(PASSWORD);\n    }\n}\n\nint test(LIBSSH2_SESSION *session)\n{\n    int rc;\n\n    const char *userauth_list =\n        libssh2_userauth_list(session, USERNAME, strlen(USERNAME));\n    if(userauth_list == NULL) {\n        print_last_session_error(\"libssh2_userauth_list\");\n        return 1;\n    }\n\n    if(strstr(userauth_list, \"keyboard-interactive\") == NULL) {\n        fprintf(stderr,\n                \"'keyboard-interactive' was expected in userauth list: %s\\n\",\n                userauth_list);\n        return 1;\n    }\n\n    rc = libssh2_userauth_keyboard_interactive_ex(\n        session, USERNAME, strlen(USERNAME), kbd_callback);\n    if(rc != 0) {\n        print_last_session_error(\"libssh2_userauth_keyboard_interactive_ex\");\n        return 1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/test_password_auth_fails_with_wrong_password.c",
    "content": "#include \"session_fixture.h\"\n\n#include <libssh2.h>\n\n#include <stdio.h>\n\nstatic const char *USERNAME = \"libssh2\"; /* configured in Dockerfile */\nstatic const char *WRONG_PASSWORD = \"i'm not the password\";\n\nint test(LIBSSH2_SESSION *session)\n{\n    int rc;\n\n    const char *userauth_list =\n        libssh2_userauth_list(session, USERNAME, strlen(USERNAME));\n    if(userauth_list == NULL) {\n        print_last_session_error(\"libssh2_userauth_list\");\n        return 1;\n    }\n\n    if(strstr(userauth_list, \"password\") == NULL) {\n        fprintf(stderr, \"'password' was expected in userauth list: %s\\n\",\n                userauth_list);\n        return 1;\n    }\n\n    rc = libssh2_userauth_password_ex(session, USERNAME, strlen(USERNAME),\n                                      WRONG_PASSWORD, strlen(WRONG_PASSWORD),\n                                      NULL);\n    if(rc == 0) {\n        fprintf(stderr, \"Password auth succeeded with wrong password\\n\");\n        return 1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/test_password_auth_fails_with_wrong_username.c",
    "content": "#include \"session_fixture.h\"\n\n#include <libssh2.h>\n\n#include <stdio.h>\n\nstatic const char *PASSWORD = \"my test password\"; /* configured in Dockerfile */\nstatic const char *WRONG_USERNAME = \"i dont exist\";\n\nint test(LIBSSH2_SESSION *session)\n{\n    int rc;\n\n    const char *userauth_list =\n        libssh2_userauth_list(session, WRONG_USERNAME, strlen(WRONG_USERNAME));\n    if(userauth_list == NULL) {\n        print_last_session_error(\"libssh2_userauth_list\");\n        return 1;\n    }\n\n    if(strstr(userauth_list, \"password\") == NULL) {\n        fprintf(stderr, \"'password' was expected in userauth list: %s\\n\",\n                userauth_list);\n        return 1;\n    }\n\n    rc = libssh2_userauth_password_ex(session, WRONG_USERNAME,\n                                      strlen(WRONG_USERNAME), PASSWORD,\n                                      strlen(PASSWORD), NULL);\n    if(rc == 0) {\n        fprintf(stderr, \"Password auth succeeded with wrong username\\n\");\n        return 1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/test_password_auth_succeeds_with_correct_credentials.c",
    "content": "#include \"session_fixture.h\"\n\n#include <libssh2.h>\n\n#include <stdio.h>\n\nstatic const char *USERNAME = \"libssh2\";          /* configured in Dockerfile */\nstatic const char *PASSWORD = \"my test password\"; /* configured in Dockerfile */\n\nint test(LIBSSH2_SESSION *session)\n{\n    int rc;\n\n    const char *userauth_list =\n        libssh2_userauth_list(session, USERNAME, strlen(USERNAME));\n    if(userauth_list == NULL) {\n        print_last_session_error(\"libssh2_userauth_list\");\n        return 1;\n    }\n\n    if(strstr(userauth_list, \"password\") == NULL) {\n        fprintf(stderr, \"'password' was expected in userauth list: %s\\n\",\n                userauth_list);\n        return 1;\n    }\n\n    rc = libssh2_userauth_password_ex(session, USERNAME, strlen(USERNAME),\n                                      PASSWORD, strlen(PASSWORD), NULL);\n    if(rc != 0) {\n        print_last_session_error(\"libssh2_userauth_password_ex\");\n        return 1;\n    }\n\n    if(libssh2_userauth_authenticated(session) == 0) {\n        fprintf(stderr, \"Password auth appeared to succeed but \"\n                        \"libssh2_userauth_authenticated returned 0\\n\");\n        return 1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/test_public_key_auth_fails_with_wrong_key.c",
    "content": "#include \"session_fixture.h\"\n\n#include <libssh2.h>\n\n#include <stdio.h>\n\nstatic const char *USERNAME = \"libssh2\"; /* configured in Dockerfile */\nstatic const char *KEY_FILE_PRIVATE = \"key_dsa_wrong\";\nstatic const char *KEY_FILE_PUBLIC = \"key_dsa_wrong.pub\";\n\nint test(LIBSSH2_SESSION *session)\n{\n    int rc;\n\n    const char *userauth_list =\n        libssh2_userauth_list(session, USERNAME, strlen(USERNAME));\n    if(userauth_list == NULL) {\n        print_last_session_error(\"libssh2_userauth_list\");\n        return 1;\n    }\n\n    if(strstr(userauth_list, \"publickey\") == NULL) {\n        fprintf(stderr, \"'publickey' was expected in userauth list: %s\\n\",\n                userauth_list);\n        return 1;\n    }\n\n    rc = libssh2_userauth_publickey_fromfile_ex(\n        session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE,\n        NULL);\n    if(rc == 0) {\n        fprintf(stderr, \"Public-key auth succeeded with wrong key\\n\");\n        return 1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/test_public_key_auth_succeeds_with_correct_dsa_key.c",
    "content": "#include \"session_fixture.h\"\n\n#include <libssh2.h>\n\n#include <stdio.h>\n\nstatic const char *USERNAME = \"libssh2\"; /* configured in Dockerfile */\nstatic const char *KEY_FILE_PRIVATE = \"key_dsa\";\nstatic const char *KEY_FILE_PUBLIC = \"key_dsa.pub\"; /* configured in Dockerfile */\n\nint test(LIBSSH2_SESSION *session)\n{\n    int rc;\n\n    const char *userauth_list =\n        libssh2_userauth_list(session, USERNAME, strlen(USERNAME));\n    if(userauth_list == NULL) {\n        print_last_session_error(\"libssh2_userauth_list\");\n        return 1;\n    }\n\n    if(strstr(userauth_list, \"publickey\") == NULL) {\n        fprintf(stderr, \"'publickey' was expected in userauth list: %s\\n\",\n                userauth_list);\n        return 1;\n    }\n\n    rc = libssh2_userauth_publickey_fromfile_ex(\n        session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE,\n        NULL);\n    if(rc != 0) {\n        print_last_session_error(\"libssh2_userauth_publickey_fromfile_ex\");\n        return 1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/test_public_key_auth_succeeds_with_correct_ed25519_key.c",
    "content": "#include \"session_fixture.h\"\n\n#include <libssh2.h>\n\n#include <stdio.h>\n\nstatic const char *USERNAME = \"libssh2\"; /* configured in Dockerfile */\nstatic const char *KEY_FILE_PRIVATE = \"key_ed25519\";\nstatic const char *KEY_FILE_PUBLIC = \"key_ed25519.pub\"; /* configured in Dockerfile */\n\nint test(LIBSSH2_SESSION *session)\n{\n    int rc;\n    const char *userauth_list = NULL;\n\n    userauth_list = libssh2_userauth_list(session, USERNAME, strlen(USERNAME));\n    if(userauth_list == NULL) {\n        print_last_session_error(\"libssh2_userauth_list\");\n        return 1;\n    }\n\n    if(strstr(userauth_list, \"publickey\") == NULL) {\n        fprintf(stderr, \"'publickey' was expected in userauth list: %s\\n\",\n                userauth_list);\n        return 1;\n    }\n\n    rc = libssh2_userauth_publickey_fromfile_ex(\n        session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE,\n        NULL);\n    if(rc != 0) {\n        print_last_session_error(\"libssh2_userauth_publickey_fromfile_ex\");\n        return 1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/test_public_key_auth_succeeds_with_correct_ed25519_key_from_mem.c",
    "content": "#include \"session_fixture.h\"\n\n#include <libssh2.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n\nstatic const char *USERNAME = \"libssh2\"; /* configured in Dockerfile */\nstatic const char *KEY_FILE_ED25519_PRIVATE = \"key_ed25519\";\n\nint read_file(const char *path, char **buf, size_t *len);\n\nint test(LIBSSH2_SESSION *session)\n{\n    int rc;\n    FILE *fp = NULL;\n    char *buffer = NULL;\n    size_t len = 0;\n    const char *userauth_list = NULL;\n\n    userauth_list = libssh2_userauth_list(session, USERNAME, strlen(USERNAME));\n    if(userauth_list == NULL) {\n        print_last_session_error(\"libssh2_userauth_list\");\n        return 1;\n    }\n\n    if(strstr(userauth_list, \"publickey\") == NULL) {\n        fprintf(stderr, \"'publickey' was expected in userauth list: %s\\n\",\n                userauth_list);\n        return 1;\n    }\n\n    if(read_file(KEY_FILE_ED25519_PRIVATE, &buffer, &len)) {\n        fprintf(stderr, \"Reading key file failed.\");\n        return 1;\n    }\n\n    rc = libssh2_userauth_publickey_frommemory(session, USERNAME, strlen(USERNAME),\n                                               NULL, 0, buffer, len, NULL);\n\n    free(buffer);\n\n    if(rc != 0) {\n        print_last_session_error(\"libssh2_userauth_publickey_fromfile_ex\");\n        return 1;\n    }\n\n    return 0;\n}\n\nint read_file(const char *path, char **out_buffer, size_t *out_len)\n{\n    int rc;\n    FILE *fp = NULL;\n    char *buffer = NULL;\n    size_t len = 0;\n\n    if(out_buffer == NULL || out_len == NULL || path == NULL) {\n        fprintf(stderr, \"invalid params.\");\n        return 1;\n    }\n\n    *out_buffer = NULL;\n    *out_len = 0;\n\n    fp = fopen(path, \"r\");\n\n    if(!fp) {\n       fprintf(stderr, \"File could not be read.\");\n       return 1;\n    }\n\n    fseek(fp, 0L, SEEK_END);\n    len = ftell(fp);\n    rewind(fp);\n\n    buffer = calloc(1, len + 1);\n    if(!buffer) {\n       fclose(fp);\n       fprintf(stderr, \"Could not alloc memory.\");\n       return 1;\n    }\n\n    if(1 != fread(buffer, len, 1, fp)) {\n       fclose(fp);\n       free(buffer);\n       fprintf(stderr, \"Could not read file into memory.\");\n       return 1;\n    }\n\n    fclose(fp);\n\n    *out_buffer = buffer;\n    *out_len = len;\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/test_public_key_auth_succeeds_with_correct_encrypted_ed25519_key.c",
    "content": "#include \"session_fixture.h\"\n\n#include <libssh2.h>\n\n#include <stdio.h>\n\nstatic const char *USERNAME = \"libssh2\"; /* configured in Dockerfile */\nstatic const char *PASSWORD = \"libssh2\";\nstatic const char *KEY_FILE_PRIVATE = \"key_ed25519_encrypted\";\nstatic const char *KEY_FILE_PUBLIC = \"key_ed25519_encrypted.pub\"; /* configured in Dockerfile */\n\nint test(LIBSSH2_SESSION *session)\n{\n    int rc;\n    const char *userauth_list = NULL;\n\n    userauth_list = libssh2_userauth_list(session, USERNAME, strlen(USERNAME));\n    if(userauth_list == NULL) {\n        print_last_session_error(\"libssh2_userauth_list\");\n        return 1;\n    }\n\n    if(strstr(userauth_list, \"publickey\") == NULL) {\n        fprintf(stderr, \"'publickey' was expected in userauth list: %s\\n\",\n                userauth_list);\n        return 1;\n    }\n\n    rc = libssh2_userauth_publickey_fromfile_ex(\n        session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE,\n        PASSWORD);\n    if(rc != 0) {\n        print_last_session_error(\"libssh2_userauth_publickey_fromfile_ex\");\n        return 1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/test_public_key_auth_succeeds_with_correct_encrypted_rsa_key.c",
    "content": "#include \"session_fixture.h\"\n\n#include <libssh2.h>\n\n#include <stdio.h>\n\nstatic const char *USERNAME = \"libssh2\"; /* configured in Dockerfile */\nstatic const char *PASSWORD = \"libssh2\";\nstatic const char *KEY_FILE_PRIVATE = \"key_rsa_encrypted\";\nstatic const char *KEY_FILE_PUBLIC = \"key_rsa_encrypted.pub\"; /* configured in Dockerfile */\n\nint test(LIBSSH2_SESSION *session)\n{\n    int rc;\n\n    const char *userauth_list =\n        libssh2_userauth_list(session, USERNAME, strlen(USERNAME));\n    if(userauth_list == NULL) {\n        print_last_session_error(\"libssh2_userauth_list\");\n        return 1;\n    }\n\n    if(strstr(userauth_list, \"publickey\") == NULL) {\n        fprintf(stderr, \"'publickey' was expected in userauth list: %s\\n\",\n                userauth_list);\n        return 1;\n    }\n\n    rc = libssh2_userauth_publickey_fromfile_ex(\n        session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE,\n        PASSWORD);\n    if(rc != 0) {\n        print_last_session_error(\"libssh2_userauth_publickey_fromfile_ex\");\n        return 1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/test_public_key_auth_succeeds_with_correct_rsa_key.c",
    "content": "#include \"session_fixture.h\"\n\n#include <libssh2.h>\n\n#include <stdio.h>\n\nstatic const char *USERNAME = \"libssh2\"; /* configured in Dockerfile */\nstatic const char *KEY_FILE_PRIVATE = \"key_rsa\";\nstatic const char *KEY_FILE_PUBLIC = \"key_rsa.pub\"; /* configured in Dockerfile */\n\nint test(LIBSSH2_SESSION *session)\n{\n    int rc;\n\n    const char *userauth_list =\n        libssh2_userauth_list(session, USERNAME, strlen(USERNAME));\n    if(userauth_list == NULL) {\n        print_last_session_error(\"libssh2_userauth_list\");\n        return 1;\n    }\n\n    if(strstr(userauth_list, \"publickey\") == NULL) {\n        fprintf(stderr, \"'publickey' was expected in userauth list: %s\\n\",\n                userauth_list);\n        return 1;\n    }\n\n    rc = libssh2_userauth_publickey_fromfile_ex(\n        session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE,\n        NULL);\n    if(rc != 0) {\n        print_last_session_error(\"libssh2_userauth_publickey_fromfile_ex\");\n        return 1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/tests/test_public_key_auth_succeeds_with_correct_rsa_openssh_key.c",
    "content": "#include \"session_fixture.h\"\n\n#include <libssh2.h>\n\n#include <stdio.h>\n\nstatic const char *USERNAME = \"libssh2\"; /* configured in Dockerfile */\nstatic const char *KEY_FILE_PRIVATE = \"key_rsa_openssh\";\nstatic const char *KEY_FILE_PUBLIC = \"key_rsa_openssh.pub\"; /* configured in Dockerfile */\n\nint test(LIBSSH2_SESSION *session)\n{\n    int rc;\n\n    const char *userauth_list =\n        libssh2_userauth_list(session, USERNAME, strlen(USERNAME));\n    if(userauth_list == NULL) {\n        print_last_session_error(\"libssh2_userauth_list\");\n        return 1;\n    }\n\n    if(strstr(userauth_list, \"publickey\") == NULL) {\n        fprintf(stderr, \"'publickey' was expected in userauth list: %s\\n\",\n                userauth_list);\n        return 1;\n    }\n\n    rc = libssh2_userauth_publickey_fromfile_ex(\n        session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE,\n        NULL);\n    if(rc != 0) {\n        print_last_session_error(\"libssh2_userauth_publickey_fromfile_ex\");\n        return 1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/vms/libssh2_config.h",
    "content": "#ifndef LIBSSH2_CONFIG_H\n#ifdef __VMS\n\n#define LIBSSH2_CONFIG_H\n\n/* VMS specific libssh2_config.h\n */\n\n#define ssize_t SSIZE_T\n\ntypedef unsigned int uint32_t ;\ntypedef unsigned int socklen_t; /* missing in headers on VMS */\n\n/* Have's */\n\n#define HAVE_UNISTD_H\n#define HAVE_STDLIB_H\n#define HAVE_INTTYPES_H\n#define HAVE_SYS_TIME_H\n#define HAVE_SELECT\n#define HAVE_UIO\n\n#define HAVE_SYS_SOCKET.H\n#define HAVE_NETINET_IN_H\n#define HAVE_ARPA_INET_H\n\n#define HAVE_GETTIMEOFDAY 1\n\n#define POSIX_C_SOURCE\n\n/* Enable the possibility of using tracing */\n \n#define LIBSSH2DEBUG 1\n\n/* For selection of proper block/unblock function in session.c */\n\n#define HAVE_FIONBIO\n\n#include <stropts.h>\n\n/* In VMS TCP/IP Services and some BSD variants SO_STATE retrieves \n * a bitmask revealing amongst others the blocking state of the \n * socket. On VMS the bits are undocumented, but  SS_NBIO\n * works, I did not test the other bits. Below bitdefs are \n * from Berkely source socketvar.h at   \n * http://ftp.fibranet.cat/UnixArchive/PDP-11/Trees/2.11BSD/sys/h/socketvar.h\n *  Socket state bits.\n *  #define SS_NOFDREF          0x001    no file table ref any more \n *  #define SS_ISCONNECTED      0x002    socket connected to a peer \n *  #define SS_ISCONNECTING     0x004    in process of connecting to peer \n *  #define SS_ISDISCONNECTING  0x008    in process of disconnecting \n *  #define SS_CANTSENDMORE     0x010    can't send more data to peer \n *  #define SS_CANTRCVMORE      0x020    can't receive more data from peer \n *  #define SS_RCVATMARK        0x040    at mark on input \n *  #define SS_PRIV             0x080    privileged for broadcast, raw... \n *  #define SS_NBIO             0x100    non-blocking ops \n *  #define SS_ASYNC            0x200    async i/o notify \n *\n */\n\n#ifdef SO_STATE\n\n/* SO_STATE is defined in stropts.h  by DECC\n * When running on Multinet, SO_STATE renders a protocol\n * not started error. Functionally this has no impact,\n * apart from libssh2 not being able to restore the socket\n * to the proper blocking/non-blocking state.  \n */\n\n#define SS_NBIO         0x100 \n\n#endif\n\n/* Use OpenSSL */\n#define LIBSSH2_OPENSSL 1\n\n/* Compile in zlib support. We link against gnv$libzshr, as available\n * from https://sourceforge.net/projects/vms-ports/files/.\n */\n\n#define LIBSSH2_HAVE_ZLIB\n\n/* Enable newer diffie-hellman-group-exchange-sha1 syntax */\n\n#define LIBSSH2_DH_GEX_NEW 1\n\n#endif /* __VMS */\n#endif /* LIBSSH2_CONFIG_H */                             \n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/vms/libssh2_make_example.dcl",
    "content": "$!\n$!\n$ olddir = f$environment(\"default\")\n$ on control_y then goto YExit\n$!\n$ gosub Init\n$ if .not. init_status then goto YExit\n$!\n$ if what .eqs. \"ALL\"\n$ then\n$\tcall MakeAll\n$ else\n$\tcall Make \n$endif\n$!\n$YExit:\n$ set noon\n$! deassign exadir\n$! deassign objdir\n$ delete 'link_opts';*\n$ set default 'olddir'\n$exit \n\n$MakeAll: subroutine\n$!\n$ set noon\n$Loop:\n$ this = f$search(\"exadir:*.c;0\")\n$ if this .eqs. \"\" then goto EndLoop\n$!\n$ what = f$parse( this,,,\"name\")\n$ if what .eqs. \"x11\" then goto loop ! not portable yet\n$ call Make\n$!\n$ goto Loop\n$EndLoop:\n$!\n$exit\n$endsubroutine\n\n\n$Make: subroutine\n$!\n$ set noon\n$!\n$ cc 'cc_include' 'cc_flags'/object=objdir:'what' exadir:'what'\n$ sev = $severity\n$ if sev .and. 2 \n$ then\n$\tsay \"Error compiling ''what', not linked.\"\n$ else\n$ \tif .not. (sev .and. 1)  \n$ \tthen\n$\t\tsay \"Compile warnings in  ''what'\"\n$ \tendif\n$  link/exe='what'.exe objdir:'what'.obj, 'link_opts'/opt\n$ endif\n$!\n$!\n$End:\n$ delete objdir:'what'.obj;*\n$exit\n$endsubroutine \n\n\n$Init: \n$!\n$!\n$ init_status = 1\n$ thisid = f$integer( %x'f$getjpi(0,\"pid\")') + \"''f$cvtime(,,\"second\")'\"\n$ mdir   = f$environment(\"procedure\") \n$ mdir   = mdir - f$parse(mdir,,,\"name\") - f$parse(mdir,,,\"type\") - f$parse(mdir,,,\"version\")\n$ set default 'mdir'\n$!\n$ objdir = \"[.example_objects]\"\n$ exadir = \"[-.example]\"\n$!\n$ objdirfile = objdir - \"[.\" - \"]\" + \".dir\"\n$ if f$search( objdirfile ) .eqs. \"\"\n$ then\n$\tcreate/directory 'objdir'\n$ endif\n$!\n$ define objdir 'objdir'\n$ define exadir 'exadir'\n$!\n$ cc_include = \"/include=([],[-.include])\"\n$ cc_flags   = \"/name=shortened/show=all/define=(_USE_STD_STAT=1)\"\n$ link_opts  = \"objdir:libssh2_''thisid'.opt\"\n$!\n$!\n$ what = \"''p1'\" \n$ if what .eqs. \"\" .or. f$edit(p1,\"trim,collapse,upcase\") .eqs. \"ALL\" \n$ then \n$\twhat = \"ALL\"\n$ else\n$\twhat = f$parse(what,,,\"name\")\n$\tif f$search(\"exadir:''what'.c\") .eqs. \"\"\n$\tthen \n$\t\twrite sys$output \"Can't make ''what'\"\n$\t\tinit_status = 0\n$\tendif\n$ endif\n$!\n$ currentlib = f$search(\"libssh2*.exe\")\n$!\n$ define libssh2 'currentlib'\n$!\n$ how  = \"''p2'\"\n$ if how .eqs. \"\" .or. f$edit(p2,\"trim,collapse,upcase\") .eqs. \"STATIC\" \n$ then\n$ \topen/write lout 'link_opts'\n$ \twrite lout \"libssh2.olb/lib\"\n$ \twrite lout \"sys$share:ssl$libcrypto_shr32.exe/share\"\n$ \twrite lout \"sys$share:ssl$libssl_shr32.exe/share\"\n$ \twrite lout \"gnv$libzshr/share\"\n$ \tclose lout\n$ else\n$\thow = \"SHARED\"\n$ \topen/write lout 'link_opts'\n$ \twrite lout \"libssh2/share\"\n$ \tclose lout\n$ endif \n$!\n$return\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/vms/libssh2_make_help.dcl",
    "content": "$!\n$!\n$!\n$ olddir = f$environment( \"default\" )\n$ on control_y then goto End\n$ on error then goto End\n$!\n$ gosub Init\n$!\n$ man2help sys$input: libssh2.hlp -b 1\n\nLIBSSH2\n\nOpenVMS port of the libssh2 library, which provides an\nAPI to implement client SSH communication.\n\nLicense information is available at the Copying subtopic.\n\n$!\n$ open/append mh libssh2.hlp\n$ write mh helpversion\n$ close mh\n$!\n$ man2help -a [-]README.; libssh2.hlp        -b 2\n$ man2help -a [-]COPYING.; libssh2.hlp       -b 2\n$ man2help -a [-]NEWS.; libssh2.hlp          -b 2\n$ man2help -a [-]RELEASE-NOTES.; libssh2.hlp -b 2\n$ man2help -a [-.docs]AUTHORS.; libssh2.hlp  -b 2\n$ man2help -a [-.docs]BINDINGS.; libssh2.hlp -b 2\n$ man2help -a [-.docs]HACKING.; libssh2.hlp  -b 2\n$ if f$search(\"[]HACKING_CRYPTO.\") .nes. \"\" then delete []HACKING_CRYPTO.;*\n$ copy [-.docs]HACKING.CRYPTO; []HACKING_CRYPTO.\n$ man2help -a []HACKING_CRYPTO.; libssh2.hlp -b 2\n$ man2help -a [-.docs]TODO.; libssh2.hlp     -b 2\n$!\n$ man2help -a sys$input: libssh2.hlp         -b 2\n\nAPI_Reference\n\nReference of all implemented API calls in\nlibssh2.\n\n$!\n$ man2help -a [-.docs]*.3 libssh2.hlp -b 3 -p\n$!\n$ library/help/create libssh2.hlb libssh2.hlp\n$!\n$End:\n$ set default 'olddir'\n$exit\n$!\n$!-------------------------------------------------------\n$!\n$Init:\n$!\n$ thisdir = f$environment( \"procedure\" )\n$ thisdir = f$parse(thisdir,,,\"device\") + f$parse(thisdir,,,\"directory\")\n$ set default 'thisdir'\n$! \n$ say = \"write sys$output\"\n$!\n$ pipe search [-.include]*.h libssh2_version_major/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job majorv &l )\n$ pipe search [-.include]*.h libssh2_version_minor/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job minorv &l )\n$ pipe search [-.include]*.h libssh2_version_patch/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job patchv &l )\n$!\n$ majorv   = f$trnlnm(\"majorv\")\n$ minorv   = f$integer(f$trnlnm(\"minorv\")) \n$ patchv   = f$integer( f$trnlnm(\"patchv\"))\n$!\n$ helpversion = \"This help library is based on build version ''majorv'.''minorv'.''patchv' of libssh2.\"\n$!\n$ deassign/job majorv\n$ deassign/job minorv\n$ deassign/job patchv\n$!\n$ if f$search( \"man2help.exe\" ) .eqs. \"\"\n$ then\n$   cc man2help\n$   link man2help\n$ endif\n$! \n$ man2help := $'thisdir'man2help.exe \n$!\n$ if f$search(\"libssh2.hlp\") .nes. \"\" \n$ then \n$   delete libssh2.hlp;*\n$ endif\n$ if f$search(\"libssh2.hlb\") .nes. \"\" \n$ then \n$   delete libssh2.hlb;*\n$ endif\n$return\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/vms/libssh2_make_kit.dcl",
    "content": "$!\n$ olddir = f$environment(\"default\")\n$ on error then goto End\n$!\n$ gosub Init\n$!\n$ call WriteProductDescriptionFile\n$ call WriteProductTextFile\n$!\n$! backup tree\n$!\n$ backup [-...]*.*;0/excl=([]*.exe,*.obj,*.opt,*.hlp,*.hlb,*.bck,*.com,*.pcsi*) -\n    libssh2-'versionname''datename'_src.bck/save\n$ purge libssh2-'versionname''datename'_src.bck\n$!\n$! backup examples\n$!\n$ backup [-.example]*.c;0 libssh2_examples-'versionname''datename'.bck/save\n$ dire  libssh2_examples-'versionname''datename'.bck\n$ purge libssh2_examples-'versionname''datename'.bck\n$!\n$ set default [-]\n$!\n$ defdir  = f$environment( \"default\" )\n$ thisdev = f$parse(defdir,,,\"device\",\"no_conceal\") \n$ thisdir = f$parse(defdir,,,\"directory\",\"no_conceal\") - \"][\" - \"][\" - \"][\" - \"][\"\n$!\n$ libssh2_kf = thisdev + thisdir \n$ libssh2_kf = libssh2_kf - \"]\" + \".]\"\n$!\n$ set default 'mdir'\n$!\n$ define/translation_attributes=concealed libssh2_kf 'libssh2_kf'\n$!\n$ product package libssh2 - \n    /base='arch' - \n    /producer=jcb -\n    /source=[] - ! where to find PDF and PTF \n    /destination=[] - ! where to put .PCSI file \n    /material=libssh2_kf:[000000...] -      ! where to find product material \n    /version=\"''vms_majorv'.''minorv'-''patchv'''datename'\" -\n    /format=sequential \n$!\n$End:\n$!\n$ set noon\n$ if f$search(\"*.pcsi$desc;*\") .nes. \"\" then delete *.pcsi$desc;*\n$ if f$search(\"*.pcsi$text;*\") .nes. \"\" then delete *.pcsi$text;*\n$ if f$search(\"libssh2-''versionname'''datename'_src.bck;*\") .nes. \"\" then delete libssh2-'versionname''datename'_src.bck;*\n$ if f$search(\"libssh2_examples-''versionname'''datename'.bck;*\") .nes. \"\" then delete libssh2_examples-'versionname''datename'.bck;*\n$!\n$ if f$trnlnm(\"libssh2_kf\") .nes. \"\" then deassign libssh2_kf\n$ set default 'olddir'\n$!\n$exit \n$!\n$!--------------------------------------------------------------------------------\n$!\n$Init:\n$ set process/parse=extended\n$!\n$ say    = \"write sys$output\"\n$!\n$ mdir   = f$environment(\"procedure\") \n$ mdir   = mdir - f$parse(mdir,,,\"name\") - f$parse(mdir,,,\"type\") - f$parse(mdir,,,\"version\")\n$!\n$ set default 'mdir'\n$!\n$ pipe search [-.include]*.h libssh2_version_major/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job majorv &l )\n$ pipe search [-.include]*.h libssh2_version_minor/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job minorv &l )\n$ pipe search [-.include]*.h libssh2_version_patch/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job patchv &l )\n$!\n$ majorv   = f$trnlnm(\"majorv\")\n$ minorv   = f$integer(f$trnlnm(\"minorv\")) \n$ patchv   = f$integer( f$trnlnm(\"patchv\"))\n$!\n$ deassign/job majorv\n$ deassign/job minorv\n$ deassign/job patchv\n$!\n$ vms_majorv =  f$trnlnm(\"vms_majorv\")\n$ if vms_majorv .eqs. \"\" then vms_majorv = majorv\n$!\n$ arch = \"UNKNOWN\"\n$ if f$getsyi(\"arch_type\") .eq. 2 then arch = \"AXPVMS\"\n$ if f$getsyi(\"arch_type\") .eq. 3 then arch = \"I64VMS\"\n$!\n$ if arch .eqs. \"UNKNOWN\"\n$ then\n$   say \"Unsupported or unknown architecture, only works on Alpha and Itanium\"\n$   exit 2\n$ endif\n$!\n$! is this a proper release or a daily snapshot?\n$! crummy, but should work.\n$!\n$ daily = \"TRUE\"\n$ firstdash     = f$locate(\"-\",mdir)\n$ restdir       = f$extract( firstdash + 1, 80, mdir)\n$ seconddash    = f$locate(\"-\", restdir)\n$ if seconddash .ge. f$length( restdir )\n$ then\n$   daily    = \"FALSE\"\n$   datename = \"Final\"\n$ else\n$   datename = \"D\" + f$extract(seconddash+1,8,restdir)   \n$ endif\n$!\n$ if daily \n$ then\n$   productname = \"JCB ''arch' LIBSSH2 V''vms_majorv'.''minorv'-''patchv'''datename'\"\n$ else\n$   productname = \"JCB ''arch' LIBSSH2 V''vms_majorv'.''minorv'-''patchv'''datename'\"\n$ endif\n$!\n$ productfilename  = \"JCB-''arch'-LIBSSH2-\" + f$fao(\"V!2ZL!2ZL-!2ZL!AS-1\", f$integer(vms_majorv),minorv,patchv,datename)\n$!\n$ versionname   = \"''vms_majorv'_''minorv'_''patchv'\"\n$!\n$return\n$!\n$!--------------------------------------------------------------------------------\n$!\n$WriteProductDescriptionFile: subroutine\n$!\n$ open/write pd 'productfilename'.PCSI$DESC\n$!\n$ write pd \"product ''productname' full ;\"\n$ write pd \"    software DEC ''arch' VMS ;\"\n$ write pd \"    if (not <software DEC ''arch' VMS version minimum V8.3>) ;\n$ write pd \"        error NEED_VMS83 ;\"\n$ write pd \"    end if ;\"\n$ write pd \"    software HP ''arch' SSL version minimum V1.3;\"\n$ write pd \"    if (not <software HP ''arch' SSL version minimum V1.3>) ;\n$ write pd \"        error NEED_SSL ;\"\n$ write pd \"    end if ;\"\n$ write pd \"    execute preconfigure (\"\"set process/parse_type=extended\"\");\"\n$ write pd \"    execute postinstall (\"\"set process/parse_type=extended\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv]usr.dir usr.DIR\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr]include.dir include.DIR\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr.include]libssh2.dir libssh2.DIR\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr.include.libssh2]libssh2.h libssh2.h\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr.include.libssh2]libssh2_publickey.h libssh2_publickey.h\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr.include.libssh2]libssh2_sftp.h libssh2_sftp.h\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr.include.libssh2]libssh2_config.h libssh2_config.h\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr]lib.dir lib.DIR\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr.lib]gnv$libssh2_''versionname'.exe gnv$libssh2_''versionname'.exe\"\",\"\n$ write pd \"    \"\"rename pcsi$destination:[gnv.usr.share.doc.libssh2]libssh2.hlb libssh2.hlb\"\");\"\n$ write pd \"    information RELEASE_NOTES phase after ;\"\n$ write pd \"    option EXAMPLE default 0 ;\"\n$ write pd \"     directory \"\"[gnv.usr.share.doc.libssh2.examples]\"\" ;\"\n$ write pd \"     file \"\"[gnv.usr.share.doc.libssh2.examples]libssh2_examples-''versionname'''datename'.bck\"\";\"\n$ write pd \"    end option ;\"\n$ write pd \"    option SOURCE default 0 ;\"\n$ write pd \"     directory \"\"[gnv.common_src]\"\" ;\"\n$ write pd \"     file \"\"[gnv.common_src]libssh2-''versionname'''datename'_src.bck\"\";\"\n$ write pd \"    end option ;\"\n$ write pd \"    directory \"\"[gnv]\"\" ;\"\n$ write pd \"    directory \"\"[gnv.usr]\"\" ;\"\n$ write pd \"    directory \"\"[gnv.usr.lib]\"\" ;\"\n$ write pd \"    directory \"\"[gnv.usr.include]\"\" ;\"\n$ write pd \"    directory \"\"[gnv.usr.include.libssh2]\"\" ;\"\n$ write pd \"    directory \"\"[gnv.usr.share]\"\" ;\"\n$ write pd \"    directory \"\"[gnv.usr.share.doc]\"\" ;\"\n$ write pd \"    directory \"\"[gnv.usr.share.doc.libssh2]\"\" ;\"\n$ write pd \"    file \"\"[gnv.usr.include.libssh2]libssh2.h\"\" source \"\"[include]libssh2.h\"\";\"\n$ write pd \"    file \"\"[gnv.usr.include.libssh2]libssh2_publickey.h\"\" source \"\"[include]libssh2_publickey.h\"\";\"\n$ write pd \"    file \"\"[gnv.usr.include.libssh2]libssh2_sftp.h\"\" source \"\"[include]libssh2_sftp.h\"\";\"\n$ write pd \"    file \"\"[gnv.usr.include.libssh2]libssh2_config.h\"\" source \"\"[vms]libssh2_config.h\"\";\"\n$ write pd \"    file \"\"[gnv.usr.share.doc.libssh2]libssh2.hlb\"\" source \"\"[vms]libssh2.hlb\"\";\"\n$ write pd \"    file \"\"[gnv.usr.share.doc.libssh2]libssh2-''versionname'.news\"\" source \"\"[000000]NEWS.\"\";\"\n$ write pd \"    file \"\"[gnv.usr.share.doc.libssh2]libssh2-''versionname'.release_notes\"\" source \"\"[vms]readme.vms\"\";\"\n$ write pd \"    file \"\"[gnv.usr.lib]gnv$libssh2_''versionname'.exe\"\" source \"\"[vms]libssh2_''versionname'.exe\"\";\"\n$ write pd \"end product ;\"\n$ close pd\n$exit \n$endsubroutine\n$!\n$!--------------------------------------------------------------------------------\n$!\n$WriteProductTextFile: subroutine\n$!\n$ open/write pt 'productfilename'.PCSI$TEXT\n$ write pt \"=PRODUCT ''productname' Full\"\n$ write pt \"1 'PRODUCER\"\n$ write pt \"=prompt libssh2 is an open source product ported to VMS by Jose Baars\"\n$ write pt \"This software product is provided with no warranty.\"\n$ write pt \"For license information see the LIBSSH2 help library.\"\n$ write pt \"1 'PRODUCT\"\n$ write pt \"=prompt JCB LIBSSH2 for OpenVMS\"\n$ write pt \"\"\n$ write pt \"libssh2 is an open source client side library that aims to implement\"\n$ write pt \"the SSH protocol. This is the OpenVMS port of that library.\"\n$ write pt \"Further information at https://www.libssh2.org.\"\n$ write pt \"\"\n$ write pt \"1 NEED_VMS83\"\n$ write pt \"=prompt OpenVMS 8.3 or later is not installed on your system.\"\n$ write pt \"This product requires OpenVMS 8.3 or later to function.\"\n$ write pt \"\"\n$ write pt \"1 NEED_SSL\"\n$ write pt \"=prompt HP SSL 1.3 or later is not installed on your system.\"\n$ write pt \"This product requires HP SSL 1.3 or later to function.\"\n$ write pt \"\"\n$ write pt \"1 RELEASE_NOTES\"\n$ write pt \"=prompt Release notes and the libssh2 help library are available in [gnv.usr.share.doc.libssh2] directory.\"\n$ write pt \"\"\n$ write pt \"1 EXAMPLE\"\n$ write pt \"=prompt Do you want the libssh2 C programming examples ? \"\n$ write pt \"The libssh2 coding examples will be available in backup saveset \"\n$ write pt \"[gnv.usr.share.doc.libssh2.examples]libssh2_examples_''versionname'.bck\"\n$ write pt \"\"\n$ write pt \"1 SOURCE\"\n$ write pt \"=prompt Do you want the complete libssh2 source tree ? \"\n$ write pt \"The libssh2 source tree will be available in backup saveset \"\n$ write pt \"[gnv.common_src]libssh2_''versionname'''datename'_src.bck\"\n$close pt\n$exit\n$ endsubroutine\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/vms/libssh2_make_lib.dcl",
    "content": "$!\n$!\n$ olddir = f$environment(\"default\")\n$ on control_y then goto YExit\n$!\n$ gosub Init\n$ if .not. init_status then goto YExit\n$!\n$ call CompileAll\n$ call BuildTransferVectors\n$ call LinkShared\n$!\n$ call Cleanup\n$!\n$YExit:\n$ set noon\n$!\n$ deassign srcdir\n$ if f$search(\"objdir:*.*;*\") .nes. \"\" then delete objdir:*.*;*\n$ deassign objdir\n$ delete library_objects.dir;*\n$!\n$ set default 'olddir'\n$exit \n$!\n$!---------------------------------------------------------------------\n$!\n$Init: \n$!\n$!\n$ init_status = 1\n$ thisid = f$integer( %x'f$getjpi(0,\"pid\")') \n$ mdir   = f$environment(\"procedure\") \n$ mdir   = mdir - f$parse(mdir,,,\"name\") - f$parse(mdir,,,\"type\") - f$parse(mdir,,,\"version\")\n$ set default 'mdir'\n$!\n$ objdir = \"[.library_objects]\"\n$ srcdir = \"[-.src]\"\n$!\n$ objdirfile = objdir - \"[.\" - \"]\" + \".dir\"\n$ if f$search( objdirfile ) .eqs. \"\"\n$ then\n$   create/directory 'objdir'\n$ endif\n$!\n$ define objdir 'objdir'\n$ define srcdir 'srcdir'\n$!\n$ cc_include = \"/include=([],[-.include],\"\"/gnv$zlib_include\"\")\"\n$ cc_define = \"/DEFINE=(_USE_STD_STAT=1)\"\n$ link_opts  = \"objdir:libssh2_''thisid'.opt\"\n$!\n$ pipe search [-.include]libssh2.h libssh2_version_major/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job majorv &l )\n$ pipe search [-.include]libssh2.h libssh2_version_minor/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job minorv &l )\n$ pipe search [-.include]libssh2.h libssh2_version_patch/nohead | (read sys$input l ; l = f$element(2,\" \",f$edit(l,\"trim,compress\")) ; - \n       define/job patchv &l )\n$!\n$ majorv   = f$trnlnm(\"majorv\")\n$ minorv   = f$integer(f$trnlnm(\"minorv\")) \n$ patchv   = f$integer( f$trnlnm(\"patchv\"))\n$!\n$ OLBONLY = \"FALSE\"\n$ if p1 .eqs. \"OLBONLY\"\n$ then\n$   OLBONLY = \"TRUE\"\n$ endif\n$!\n$ deassign/job majorv\n$ deassign/job minorv\n$ deassign/job patchv\n$!\n$return\n$!\n$!---------------------------------------------------------------------\n$!\n$Cleanup: subroutine\n$!\n$ set noon\n$ purge *.opt\n$ purge *.olb\n$ purge *.exe\n$! \n$exit 1\n$endsubroutine\n$!\n$!---------------------------------------------------------------------\n$!\n$LinkShared: subroutine\n$!\n$!\n$!\n$ cversion = f$fao(\"!3ZL\",minorv)  + f$fao(\"!3ZL\",patchv)\n$!\n$! General linking options in link_libssh2_version...opt\n$! Vectors in link_libssh2_vectors...opt\n$!\n$ open/write uitv link_libssh2_version_'majorv'_'minorv'_'patchv'.opt\n$ write uitv \"GSMATCH=LEQUAL,''majorv',''cversion'\"\n$ write uitv \"IDENTIFICATION=\"\"LIBSSH2 ''majorv'.''minorv'.''patchv'\"\"\"\n$ write uitv \"sys$share:ssl$libcrypto_shr32.exe/share\"\n$ write uitv \"sys$share:ssl$libssl_shr32.exe/share\"\n$ write uitv \"gnv$libzshr/share\"\n$ close uitv\n$! \n$ link/shared/exe=libssh2_'majorv'_'minorv'_'patchv'.exe -\n    libssh2.olb/lib, -\n    link_libssh2_version_'majorv'_'minorv'_'patchv'.opt/opt, -\n    link_libssh2_vectors_'majorv'_'minorv'_'patchv'.opt/opt\n$!\n$exit\n$endsubroutine\n$!\n$!---------------------------------------------------------------------\n$!\n$CompileAll: subroutine\n$!\n$ set noon\n$!\n$ if f$search(\"objdir:*.obj;*\") .nes \"\" \n$ then \n$   delete objdir:*.obj;*\n$ endif\n$ if f$search(\"[.cxx_repository]cxx$demangler_db.;\") .nes \"\" \n$ then \n$   delete [.cxx_repository]cxx$demangler_db.;*\n$ endif\n$!\n$! Compile all .c files in [-.src], first as_is\n$! and then as default all uppercase names\n$! and add the resulting object to object libraries\n$! libssh2_up.olb and libssh2_as_is.olb.\n$!\n$ case = 0\n$ if OLBONLY then case = 1\n$CaseLoop:\n$!\n$ if case .eq. 0 \n$ then!camel case names \n$   cc_flags = \"/names=(shortened,as_is)''cc_define'\"\n$   objlib = \"libssh2_asis.olb\"\n$ endif\n$!\n$ if case .eq. 1 \n$ then!uppercase names \n$   if f$search(\"[.cxx_repository]cxx$demangler_db.;\") .nes \"\" \n$   then \n$      rename [.cxx_repository]cxx$demangler_db.; *.lowercase\n$      purge  [.cxx_repository]cxx$demangler_db.lowercase\n$   endif\n$!\n$   cc_flags = \"/names=(shortened)''cc_define'\"\n$   objlib = \"libssh2_up.olb\"\n$ endif\n$!\n$ if f$search(\"''objlib';*\") .nes. \"\" then delete 'objlib';*\n$ library/create 'objlib'\n$!\n$Loop:\n$ this = f$search(\"srcdir:*.c;0\")\n$ if this .eqs. \"\" then goto EndLoop\n$!\n$ what = f$parse( this,,,\"name\")\n$!\n$ call CompileAndAdd\n$!\n$ goto Loop\n$EndLoop:\n$ case = case + 1\n$ delete objdir:*.obj;*\n$ if case .lt 2 then goto CaseLoop\n$!\n$ rename libssh2_up.olb libssh2.olb\n$ if f$search(\"[.cxx_repository]cxx$demangler_db.;\") .nes \"\" \n$ then \n$    rename [.cxx_repository]cxx$demangler_db.; *.uppercase\n$    purge  [.cxx_repository]cxx$demangler_db.uppercase\n$ endif\n$!\n$ if OLBONLY then exit 4\n$!\n$! For each function that is too long, create a global symbol\n$! low$'shortened-uppercase-name' with as value lowercase shortened\n$! name in it, so we can add the proper lower or mixed case \n$! shortened name later when building the transfer vectors \n$! for the shared image.\n$! This is to prevent two very long similar function names \n$! that are shortened getting mixed up when sorted alphabetically.\n$!\n$ inputfile = \"[.cxx_repository]cxx$demangler_db.lowercase\"\n$ gosub GetShortened\n$!\n$ inputfile =  \"[.cxx_repository]cxx$demangler_db.uppercase\"\n$ gosub GetShortened\n$!\n$exit\n$!\n$GetShortened:\n$!\n$ open/read s 'inputfile'\n$ namecount = 0\n$ReadLoop:\n$!\n$ read/end=endreadloop s regel\n$!\n$ shortname = f$element(0,\"$\",regel) + \"$\"\n$ longname  = f$element(1,\"$\",regel)\n$!\n$ symvalue = \"\"\n$!\n$ if shortname .eqs. f$edit(shortname,\"upcase\")\n$ then\n$!  this is an uppercase shortname, add it \n$   symname  = \"u$''longname'\"\n$   symvalue = \"''shortname'\"\n$   low$'shortname' == l$'longname'\n$!\n$   delete/symbol l$'longname'\n$!\n$ else\n$!  this is an lowercase shortname\n$   symname  = \"l$''longname'\"\n$   symvalue = \"''shortname'\"\n$   'symname' = \"''symvalue'\"\n$ endif\n$!\n$ namecount = namecount + 1\n$!\n$ goto ReadLoop\n$EndReadLoop:\n$!\n$close s\n$return\n$!\n$endsubroutine\n$!\n$!---------------------------------------------------------------------\n$!\n$CompileAndAdd: subroutine\n$!\n$ on error then goto End\n$!\n$ cc /warn=disable=longextern/lis=objdir:/show=all 'cc_include' 'cc_flags'/object=objdir:'what'.obj srcdir:'what'.c\n$ library/insert 'objlib' objdir:'what'.obj\n$!\n$End:\n$exit\n$endsubroutine \n$!\n$!---------------------------------------------------------------------\n$!\n$BuildTransferVectors: subroutine\n$!\n$! Do a balanced read of the uppercase library names\n$! and the mixed case library names, and build the\n$! transfer vectors with uppercase entry points \n$! with an alternative in mixed case.\n$! For shortened names, use the low$* symbols\n$! to avoid being fooled by the sort.\n$!\n$ thislib = \"libssh2.olb\"\n$ library/lis=libu.'thisid'/names libssh2.olb\n$ library/lis=lib_asisu.'thisid'/names libssh2_asis.olb\n$!\n$! case blind sort of all modules in both the uppercase\n$! as the case sensitive object library.\n$!\n$ sort libu.'thisid' lib.'thisid'/spec=sys$input\n/COLLATING_SEQUENCE=(SEQUENCE= (\"A\" - \"Z\",\"0\"-\"9\",\"_\"), FOLD) \n$ sort lib_asisu.'thisid' lib_asis.'thisid'/spec=sys$input\n/COLLATING_SEQUENCE=(SEQUENCE= (\"A\" - \"Z\",\"0\"-\"9\",\"_\"), FOLD) \n$!\n$ open/read  in  lib.'thisid'\n$ open/read  inasis  lib_asis.'thisid'\n$ open/write uit link_libssh2_vectors_'majorv'_'minorv'_'patchv'.opt\n$!\n$ write uit \"CASE_SENSITIVE=YES\"\n$ write uit \"SYMBOL_VECTOR= ( -\"\n$!\n$ mode = 0\n$ uitregel = \"\"\n$!\n$ReadLoop:\n$!\n$ read/end=ReadAsis in regel\n$ReadAsis:\n$ read/end=EndReadLoop inasis asisregel\n$!\n$ regel     = f$edit( regel, \"trim,compress\" )\n$ asisregel = f$edit( asisregel, \"trim,compress\" )\n$!\n$ if f$element(0,\" \",regel) .eqs. \"Module\" .or. -\n     f$extract(0,1,regel)   .eqs. \"_\" .or. -\n     f$element(1,\" \",regel) .nes. \" \" .or. -\n     regel .eqs. \"\"\n$ then\n$   goto ReadLoop\n$ endif\n$!\n$ if uitregel .nes. \"\" .and. mode .eq. 1\n$ then\n$   write uit \"''uitregel'=PROCEDURE, -\" \n$   write uit \"''uitasis'/''uitregel'=PROCEDURE, -\" \n$!\n$   uitregel = \"\"\n$   uitasis  = \"\"\n$ endif \n$!\n$ uitregel = regel\n$ if f$type( low$'uitregel' ) .nes. \"\"\n$ then\n$   uitasis = low$'uitregel'\n$   delete/symbol/global low$'uitregel'\n$ else\n$   uitasis  = asisregel\n$ endif\n$!\n$ mode = 1\n$!\n$ goto ReadLoop\n$EndreadLoop:\n$! \n$! To get the closing brace after the last procedure\n$! keyword.\n$!\n$ if uitregel .nes. \"\"\n$ then \n$   write uit \"''uitregel'=PROCEDURE, -\" \n$   write uit \"''uitasis'/''uitregel'=PROCEDURE)\" \n$ endif\n$!\n$ write uit \"CASE_SENSITIVE=NO\"\n$!\n$ close in\n$ close inasis\n$ close uit\n$!\n$ delete lib*.'thisid';*\n$!\n$exit\n$endsubroutine\n$!\n$!---------------------------------------------------------------------\n$!\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/vms/man2help.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <errno.h>\n\n#include <starlet.h>\n#include <lib$routines.h>\n#include <ssdef.h>\n#include <descrip.h>\n#include <rms.h>\n\ntypedef struct manl{\n    struct manl *next;\n    char *filename;\n}man, *manPtr;\n \ntypedef struct pf_fabnam{\n    struct FAB dfab;\n    struct RAB drab;\n    struct namldef dnam;\n    char   expanded_filename[NAM$C_MAXRSS + 1]; \n} pfn, *pfnPtr;\n\n/*----------------------------------------------------------*/\n\nfpcopy( char *output, char *input, int len )\n{\nchar    *is, *os;\nint i;\n\nif ( len ){\n    for ( is = input, os = output, i = 0; i < len ; ++i, ++is, ++os){\n            *os = *is;\n    }\n    *os = 0;\n}else{\n    output[0] = 0;\n}\n}           \n\n\n/*----------------------------------------------------------*/\n/* give part of ilename in partname. See code for proper\n   value of i ( 0 = node, 1 = dev, 2 = dir,3 = name etc.\n*/ \n\nint fnamepart( char *inputfile, char *part, int whatpart )\n{\npfnPtr pf;\nint     status;\nchar    ipart[6][256], *i, *p;\n\npf = calloc( 1, sizeof( pfn ) );\n\npf->dfab = cc$rms_fab;\npf->drab = cc$rms_rab;\npf->dnam = cc$rms_naml;\n\npf->dfab.fab$l_naml = &pf->dnam;\n\npf->dfab.fab$l_fna = (char *) -1; \npf->dfab.fab$l_dna = (char *) -1; \npf->dfab.fab$b_fns = 0;\npf->dfab.fab$w_ifi = 0;\n\npf->dnam.naml$l_long_defname = NULL; //inputfile;\npf->dnam.naml$l_long_defname_size = 0;//strlen( inputfile );\n\npf->dnam.naml$l_long_filename = inputfile;\npf->dnam.naml$l_long_filename_size = strlen( inputfile);\n\npf->dnam.naml$l_long_expand = pf->expanded_filename;\npf->dnam.naml$l_long_expand_alloc = NAM$C_MAXRSS ;\n\npf->dnam.naml$b_nop |= NAML$M_SYNCHK | NAML$M_PWD;\n\nstatus = sys$parse( &pf->dfab, 0,0);\nif ( !(status&1) ){\n    free( pf );\n    return( status );\n}\n\nfpcopy ( ipart[0], pf->dnam.naml$l_long_node , pf->dnam.naml$l_long_node_size);\nfpcopy ( ipart[1], pf->dnam.naml$l_long_dev , pf->dnam.naml$l_long_dev_size);\nfpcopy ( ipart[2], pf->dnam.naml$l_long_dir , pf->dnam.naml$l_long_dir_size);\nfpcopy ( ipart[3], pf->dnam.naml$l_long_name , pf->dnam.naml$l_long_name_size);\nfpcopy ( ipart[4], pf->dnam.naml$l_long_type , pf->dnam.naml$l_long_type_size);                                               \nfpcopy ( ipart[5], pf->dnam.naml$l_long_ver , pf->dnam.naml$l_long_ver_size);\n\nfor( i = ipart[ whatpart ], p = part; *i; ++i, ++p){\n   if ( p == part ){\n      *p = toupper( *i );\n   }else{\n      *p = tolower( *i );\n   }        \n}\n*p = 0;\n\nfree( pf );\nreturn(1);\n}\n/*----------------------------------------------------------*/\n\nint find_file(char *filename,char *gevonden,int *findex)\n{\nint     status;\nstruct  dsc$descriptor gevondend;\nstruct  dsc$descriptor filespec;\nchar    gevonden_file[NAM$C_MAXRSS + 1];\n\nfilespec.dsc$w_length = strlen(filename);\nfilespec.dsc$b_dtype  = DSC$K_DTYPE_T;\nfilespec.dsc$b_class  = DSC$K_CLASS_S; \nfilespec.dsc$a_pointer = filename;\n\ngevondend.dsc$w_length = NAM$C_MAXRSS;\ngevondend.dsc$b_dtype  = DSC$K_DTYPE_T;\ngevondend.dsc$b_class  = DSC$K_CLASS_S; \ngevondend.dsc$a_pointer = gevonden_file;\n\nstatus=lib$find_file(&filespec,&gevondend,findex,0,0,0,0);\n    \nif ( (status & 1) == 1 ){\n       strcpy(gevonden,strtok(gevonden_file,\" \"));\n}else{\n       gevonden[0] = 0;\n}\n\nreturn(status);\n}\n\n\n/*--------------------------------------------*/\n\nmanPtr addman( manPtr *manroot,char *filename )\n{\nmanPtr m,f;\n\nm = calloc( 1, sizeof( man) );\nif ( !m ) return( NULL );\n\nm->filename = strdup( filename );\n\nif ( *manroot == NULL ){\n   *manroot = m;    \n}else{\n   for( f = *manroot; f->next ; f = f->next );\n   f->next = m;\n}\nreturn(m);\n}\n\n/*--------------------------------------------*/\nvoid freeman( manPtr *manroot )\n{\nmanPtr m,n;\n\nfor( m = *manroot; m ; m = n ){\n     free( m->filename );\n     n = m->next;\n     free ( m );\n}\n*manroot = NULL;\n}\n\n/*--------------------------------------------*/\n\nint listofmans( char *filespec, manPtr *manroot )\n{\nmanPtr  r;\nint     status;\nint     ffindex=0;\nchar    gevonden[NAM$C_MAXRSS + 1];\n\nwhile(1){\n    status = find_file( filespec, gevonden, &ffindex );\n\n    if ( (status&1) ){\n        r = addman( manroot, gevonden );\n        if ( r == NULL ) return(2);\n    }else{\n        if ( !( status&1)) break;\n    }\n}\n\nlib$find_file_end( &ffindex);\nif ( status == RMS$_NMF) status = 1;\n\n\nreturn( status );\n}\n\n/*--------------------------------------------*/\n\nint convertman ( char *filespec, FILE *hlp , int base_level, int add_parentheses )\n{\nFILE    *man;\nchar    *in, *uit;\nchar    *m,*h;\nsize_t  len, thislen, maxlen= 50000;\nint     bol,mode, return_status=1;\nchar subjectname[ NAM$C_MAXRSS + 1 ];\n\nin  = calloc( 1, maxlen + 1 );\nuit = calloc( 1, maxlen + 1 );\n\nif ( in == NULL || uit == NULL ) return(2);\n\nman = fopen( filespec, \"r\");\nif ( man == NULL ) return(vaxc$errno);\n\nfor( len = 0; !feof( man ) && len < maxlen ; len += thislen ){\n    thislen = fread( in + len, 1, maxlen - len, man );\n}\n\nfclose (man);\n\nm = in;\nh = uit;\n\n*(m + len ) = 0;\n\nfor ( mode = 0, bol = 1 ; *m; ++m ){\n\n    switch ( mode ){\n        case 0:\n          switch(*m){\n            case '.':\n                if ( bol ){\n                    mode = 1;\n                }else{\n                    *h = *m;\n                    ++h;\n                }\n                break;\n            case '\\\\':\n                if ( bol ){\n                   *h = ' ';++h;\n                   *h = ' ';++h;\n                }\n                mode = 2;\n                break;\n            default:\n                if ( bol ){\n                   *h = ' ';++h;\n                   *h = ' ';++h;\n                }\n                *h = *m;\n                ++h;\n                break;\n          }\n          break;\n        case 1: /* after . at bol */\n\n          switch(*m){\n            case '\\\\':\n                while( *m != '\\n' && *m != '\\r' && *m )++m;\n                mode = 0;\n                break;\n            case 'B':\n                   ++m; \n                   *h = ' ';++h;\n                   mode = 0;\n                   break;   \n            case 'I':\n                    /* remove preceding eol */\n                    if ( *(m+1) != 'P' ){\n                        --h;\n                        while ( (*h == '\\n' || *h == '\\r') && h > uit )--h;\n                        ++h;\n                    }\n\n                    /* skip .Ix */\n                    for(;*m != ' ' && *m != '\\n' && *m != '\\r'; ++m); \n\n                    /* copy line up to EOL */\n\n                    for(;*m != '\\n' && *m != '\\r' && *m; ++m, ++h)*h = *m;\n\n                    /* if line ends in ., this is an EOL */\n\n                    if ( *(h-1) == '.'){\n                         --h; \n                         --m;\n                    }else{\n                        /* if line does not end in ., skip EOL in source */\n\n                        if ( *(m+1) == '\\n' || *(m+1) == '\\r')++m;\n                    }\n                    mode = 0;\n                    break;\n            case 'S':\n                 if ( *(m+1) == 'H' ){\n                    *h = '\\n';++h;\n                    if ( strncmp( m+3 ,\"NAME\",4) == 0 || \n                         strncmp( m+3 ,\"SYNOPSIS\",8) == 0 ||\n                         strncmp( m+3 ,\"DESCRIPTION\",11) == 0 ){\n                        while( *m != '\\n' && *m != '\\r')++m;\n                        mode = 0;\n                    }else{\n                        ++m;\n\n                        /* write help level, and flag it */\n\n                        *h = '0' + base_level + 1;++h;\n                        return_status |= 2;\n\n                        *h = ' ';++h; \n\n                        /* skip H (or whatever after S) and blank */\n                        ++m;++m;\n\n                        for(;*m != '\\n' && *m != '\\r' && *m; ++m, ++h){\n\n                           /* write help label in lowercase, skip quotes */\n                           /* fill blanks with underscores */\n\n                           if ( *m != '\\\"' ){\n                                *h = tolower( *m );\n                                if (*h == ' ') *h = '_';    \n                           }else{\n                                --h;\n                           }    \n                        } \n\n                        /* Add a linefeed or two */\n\n                        *h = *m;++h;\n                        *h = *m;++h;\n\n                        mode = 0;\n                    }   \n                 }\n                 break;\n            case 'T':\n                 if ( *(m+1) == 'H' ){\n                    *h = '0' + base_level; ++h;\n                    return_status |= 2;\n                    *h = ' ';++h;\n                    for ( m = m + 3; *m != ' ' && *m ; ++m, ++h ){\n                          *h = *m;\n                    }\n\t\t\t\t\tif ( add_parentheses ){\n\t\t\t\t\t\t *h = '(';++h;\n\t\t\t\t\t\t *h = ')';++h;\n\t\t\t\t\t}\n                    while( *m != '\\n' && *m != '\\r' && *m )++m;\n                    mode = 0;\n                 }\n                 break;\n            default:\n                ++m;\n                mode = 0;\n                break;\n           }\n           break;\n        case 2: /* after \\ skip two characters or print the backslash */            \n          switch(*m){\n            case '\\\\':\n                *h = *m;\n                ++h;\n                mode = 0;\n                break;\n            default:\n                ++m;\n                mode = 0;\n                break;\n           }\n           break;   \n    } /*end switch mode */\n\n    bol = 0;\n    if ( *m == '\\n' || *m == '\\r') bol = 1;\n\n}/* end for mode */\n\n*h = 0;\n\n\nif ( (return_status&2) ){\n    fprintf( hlp, \"%s\\n\\n\", uit);\n}else{\n    fnamepart( filespec, subjectname,3);\n    if ( *subjectname ){\n        fprintf( hlp, \"%d %s\\n\\n%s\\n\\n\", base_level, subjectname, uit);\n    }else{\n        /* No filename (as is the case with a logical), use first word as subject name */\n        char *n,*s;\n\n        for(n = in; isspace( *n );++n);\n        for(s = subjectname; !(isspace( *n )); ++n,++s)*s = *n;\n        *s = 0;\n\n        fprintf( hlp, \"%d %s\\n\\n%s\\n\\n\", base_level, subjectname, uit);\n    }\n}\n\n/*\n printf( \"read %d from %s, written %d to helpfile, return_status = %d\\n\",\n    len, filespec, strlen(uit), return_status );\n*/\n\nfree( m ); \nfree( h ); \n\nreturn ( 1);\n}\n\n/*--------------------------------------------*/\n\nint convertmans( char *filespec, char *hlpfilename, int base_level, int append, int add_parentheses )\n{\nint status=1;\nmanPtr  manroot=NULL, m;\nFILE    *hlp;\n\nif ( append ){\n    hlp = fopen( hlpfilename,\"a+\");\n}else{\n    hlp = fopen( hlpfilename,\"w\");\n}\n\nif ( hlp == NULL ) return( vaxc$errno );\n\nstatus = listofmans( filespec, &manroot );\nif ( !(status&1) ) return( status );\n\nfor ( m = manroot ; m ; m = m->next ){\n    status = convertman( m->filename, hlp , base_level, add_parentheses );\n    if ( !(status&1) ){\n        fprintf(stderr,\"Convertman of %s went wrong\\n\", m->filename);\n        break;\n    }\n}\nfreeman( &manroot );\nreturn( status );\n}\n\n/*--------------------------------------------*/\nvoid print_help()\n{\n   fprintf( stderr, \"Usage: [-a] [-b x] convertman <manfilespec> <helptextfile>\\n\" );\n   fprintf( stderr, \"       -a append <manfilespec> to <helptextfile>\\n\" );\n   fprintf( stderr, \"       -b <baselevel> if no headers found create one with level <baselevel>\\n\" );\n   fprintf( stderr, \"          and the filename as title.\\n\" );\n   fprintf( stderr, \"       -p add parentheses() to baselevel help items.\\n\" );\n\n}\n/*--------------------------------------------*/\n\nmain ( int argc, char **argv )\n{\nint     status;\nint     i,j;\nint     append, base_level, basechange, add_parentheses;\nchar    *manfile=NULL;\nchar    *helpfile=NULL;\n\nif ( argc < 3 ){\n   print_help();\n   return( 1 ) ;\n}\n\nappend     = 0;\nbase_level = 1;\nbasechange = 0;\nadd_parentheses = 0;\n\nfor ( i = 1; i < argc; ++i){\n    if ( argv[i][0] == '-' ){\n        for( j = 1; argv[i][j] ; ++j ){\n            switch( argv[i][j] ){\n                case 'a':\n                    append = 1;\n                    break;\n                case 'b':   \n                    if ( (i+1) < argc ){\n                        base_level = atoi( argv[ i + 1 ] );\n                        basechange = 1;\n                    }\n                    break;\n                case 'p':\n                    add_parentheses = 1;\n                    break;\n            }\n        }\n        if ( basechange){\n            basechange = 0;\n            i = i + 1;\n        }\n    }else{\n        if ( manfile == NULL ){\n            manfile = strdup( argv[i]);\n        } else if ( helpfile == NULL ){\n            helpfile = strdup( argv[i]);\n        } else {\n            fprintf( stderr, \"Unrecognized parameter : %s\\n\", argv[i]);\n        }\n    }\n}\n\n\n/* fprintf( stderr,\"manfile: %s, helpfile: %s, append: %d, base_level : %d\\n\",\n        manfile, helpfile, append, base_level);\n*/\n\nstatus = convertmans( manfile, helpfile, base_level, append, add_parentheses );\n\nfree( manfile );\nfree( helpfile );\n\nreturn( status );\n}\n\n \n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/vms/readme.vms",
    "content": "*These are the porting notes to OpenVMS, as of 7 April 2010\nby Jose Baars. This file will be installed as \nlibssh2*.release_notes by the product install kit.\n\n\nLIBSSH2 \n-------\n\nLIBSSH2 is a client-side library written in C that aims to \nimplement the SSH2 protocol. It is an open source project, \nto be found at https://libssh2.org.\n\nGNV\n---\n\nThe library uses the GNV prefix, on advise of the kind supporter\nof the GNV project, John Malmberg.\n\nInstalling the PCSI kit\n=======================\n\nPrerequisites \n-------------\n- VMS version 8.3 minimal. \n  See the remarks at prerequisites for building the kit\n- TCP/IP stack, both TCP/IP services and Multinet should work. \n  See the remarks at prerequisites for building the kit\n- HP OPENSSL V1.3 minimal. \n  See the remarks at prerequisites for building the kit\n- JEM  ZLIB V1.2-3E1 minimal. \n  See the remarks at prerequisites for building the kit\n  \nThe first three dependencies are tested at installation time, and \ninstallation will fail if any these products are not installed.\nThe ZLIB dependency is not tested by the product installation\nprocedure, as libssh2 will probably be installed as part of \nmultiple libraries including zlib.\n\nInstall\n-------\n\n\nThe kit will install gnv$libssh2.exe in a directory tree that might \nalready be available on your system if you have installed other gnv* \nlibraries or utilities. \n\nThe directory tree for gnv$libssh2.exe will be like this:\n\n[gnv] -- [usr] -- [include] -- [libssh2] include files for libssh2\n                  [lib] gnv$libssh2_x_y_z.exe\n                  [share]   -- [doc] -- [libssh2] libssh2.hlb, \n                                        release notes (this file), \n                                        libssh2 release notes   \n\noptional:\n                                        [example] libssh2_examples-x_y_z.bck \n                  [common_src] libssh2-x_y_z_src.bck\n\nBy default, it will install the shared image and include files to \nSYS$COMMON:[GNV...].\n\nYou can override this destination by specifying the destination\ndirectory after /DESTINATION= on the product install command line.\nThis is particularly of use when installing the library on a cluster\nwithout a common system disk.\n\nPlease ignore the following warnings, as the kit is not signed :\n\n%PCSI-I-CANNOTVAL, cannot validate dev:[dir]JCB-AXPVMS-LIBSSH2-V0102-05D20100402-1.PCSI\n-PCSI-I-NOTSIGNED, product kit is not signed and therefore has no manifest file\n\nOptionally, you can install a backup saveset with some programming examples,\nor a backupo saveset with the complete libssh2 source tree.\n \nyou will need to answer 'NO' to the question \n'Do you want the default for all options'. \n\nand 'YES' to either or both the following questions:\n\n    Do you want the libssh2 C programming examples ?  [NO]\n\n    Do you want the complete libssh2 source tree ?  [NO]\n\n\nPost installation tasks\n-----------------------\n\nAlthough we will try to maintain upward compatibility of libssh2,\nthis can not be guaranteed by the libssh2 project itself for OpenVMS,\nnor eternally by us.\n\nTo use libssh2 effectively, you will have to define a system logical\nto point to the shared image. If you are willing to take the gamble,\ndefine this logical in your systartup like so:\n\n$ define/system/executive gnv$libssh2 dev:[dir..]gnv$libssh2_x_y_z.exe\n\nOptionally, you can install the executbale like so:\n\n$ mc sysgen install dev:[dir..]gnv$libssh2_x_y_z.exe/open/share/header\n\nLink your programs against gnv$libssh2, and when upgrading libssh2 \ntest thoroughly.\n\nIf you want to be extra cautious define a system logical like this:\n\n$ define/system/executive gnv$libssh2_x_y_z dev:[dir..]gnv$libssh2_x_y_z.exe\n\nLink  programs against gnv$libssh2_x_y_z, and when upgrading libssh2 \nlink against new versions. \n\nIt is probably more convenient in the last case to link against the object \nlibrary provided in the source backup saveset. Both an uppercase and a\nmixed case object library, called libssh2.olb and libssh2_asis.olb \nare provided.\n\n\nCompiling and linking against libssh2\n-------------------------------------\n\nThe  shared image library has a vector table with both uppercase and \nmixed case entry points, allowing to link directly against the shared \nimage wether you need the /NAMES=AS_IS or not.\n\nTo link successfully, you MUST use /NAMES=shortened, as some function\nnames in libssh2 are longer than the VMS maximum of 32 characters.\n\nIf you chose to install the examples, you can unpack the backup\nsaveset by \n\nbackup/sel=*.c device:[gnv.usr.share.doc.libssh2.examples]libssh2_examples-x_y_z.bck -\n []\n\nThey can by compiled and linked by these commands ( provided you have defined\nthe gnv$libssh2 logical) :\n\n$ cc/include=dev:[gnv.usr.include.libssh2] xxx.c/names=shortened\n$ link/opt=sys$input: xxx.obj\ngnv$libssh2/share\n\n\n\n\nBuilding gnv$libssh2\n====================\n\nYou can build gnv$libssh2 yourself, which may have advantages, as the library is\nin full development, very regularly new features are added.\n\nFor production use, it is probably advisable to use a stable version, and \nlink against that. To check out new features, statically linking against\nthe object library is probably more practical, to avoid compatibility\nissues.\n\n\nPrerequisites\n-------------\n\nYou will need to have the following available:\n\n- An Alpha or Itanium VMS system. Due to dependencies on zlib, ssl and ODS-5,\n  support on VAXen would be cumbersome at least.\n\n- VMS version 8.3 minimal. This is a requirement of gnv$zlibshr.exe against \n  which shared image library libssh2 is linked. If you use another zlib\n  to link against, you can make it work under lower versions of VMS.\n  I have made it work on VMS 7.3-2 with not a lot of difficulty.\n  Also, if you are not interested in compression, you can choose not\n  to link against zlib at all; in that case comment out the \n  #define  LIBSSH2_HAVE_ZLIB in libssh2_config.h.\n\n- TCP/IP services or Multinet for OpenVMS.\n  TCPWare has not been tested.\n\n- The HP OpenSSL product. Of course, with tweaking, you can probably link \n  it against the OpenSSL library, but that is not what I have used.\n \n- A C compiler. I don't know any other working C compilers than \n  the DEC/Compac/HP-C compiler on VMS.\n\n- An ODS-5 disk. With tweaking you'll get it to work on an ODS-2\n  disk, but it is unpractical to do so.\n\n- A version of VMSTAR that understands ODS-5 disks and extended\n  filenames. Look here:\n  http://ftp.process.com/ftp/vms-freeware/fileserv/vmstar.zip\n\n- gunzip, available for instance at Steven M Schweda's website:\n  http://antinode.info/ftp/gzip/gzip-1_3_12b_vms/gzip-1_3_12b_vms.zip\n\nOptional:\n\n- curl, to be found at  https://curl.haxx.se\n  You might want to use curl to download the libssh2 kit directly\n  to you VMS machine. Interestingly, sftp in curl is implemented using\n  libssh2, soon to be expected on VMS as well, hopefully.\n\nDownloading libssh2\n-------------------\n\nAt the website of libssh2, you can find stable and daily gzipped\ntarballs. if you have a computer connected to internet you can \ndownload a daily build yourself by a procedure that looks a lot like\nthis ( fill out your own proxy user/password, set up right symbols to\ngunzip, vmstar and curl and set up the libssh2 build version):\n\n$ libssh2_version = \"1.2.6\"\n$!\n$ proxy_line = \" \"\"-U\"\" \"\"''proxy_userpass'\"\"  \"\"-x\"\" \"\"''proxy_hostport'\"\" \"\n$!\n$ currentday = f$cvtime(,,\"date\") - \"-\" - \"-\"\n$!\n$ set def mydev:[mydir.libssh2]\n$!\n$ if f$search(\"libssh2-''libssh2_version'-''currentday'.tar.gz\") .nes. \"\" \n$ then \n$   delete libssh2-'libssh2_version'-'currentday'.tar.gz;*\n$ endif\n$!\n$ curl 'proxy_line' \"https://libssh2.org/snapshots/libssh2-''libssh2_version'-''currentday'.tar.gz\" -\n                    -o libssh2-'libssh2_version'-'currentday'.tar.gz\n$!\n$!\n$ if f$search(\"libssh2-''libssh2_version'-''currentday'.tar.;\") .nes. \"\" \n$ then \n$   delete libssh2-'libssh2_version'-'currentday'.tar.;*\n$ endif\n$!\n$ gunzip libssh2-'libssh2_version'-'currentday'.tar.gz\n$!\n$ tarfile = f$search(\"libssh2-''libssh2_version'-''currentday'.tar.;\")\n$ vmstar xf 'tarfile' \n\nDownloading a stable build will need you to get rid of the currentday.\n\nAfter the download, you should have a directory tree with a toplevel\ndirectory called [libssh2-x.y.z-yyyymmdd].\nOne of the subdirectories is called vms.\n\nGetting the libssh2 sources from the source backup in the binary kit\n--------------------------------------------------------------------\n\nDuring installation of the binary kit, you are given the option\nof installing the sources. If chosen, a backup saveset with \nthe complete libssh2 directory is made available in \n[gnv.common_src].\n\nBy restoring this backup saveset, you end up with the same\nset of files as by the direct download from libssh2.org.\n\n\nBuilding the library\n--------------------\n\nTo avoid all kinds of misunderstandings caused by firewalls thinking that\na .com file must be an MS-DOS executable, all command procedures are called\n.dcl.\n\nGo to the vms subdirectory in the download tree, and issue the following\ncommand:\n\n@libssh2_make_lib.dcl\n\nThis should produce libssh2_x_y_z.exe in this same vms directory.\n \n\n\nBuilding the examples\n---------------------\n\nA number of examples are also part of the full libssh2 delivery.\nYou can compile and link them either against the object library\nproduced when building the shared image, or against the shared image\nproduced in the step before.\n\nYou can compile only one of the examples by giving only the\nname part of the filename of the example as p1 to the \nbuild procedure:\n\n@libssh2_make_example.dcl \n\nor for instance\n\n@libssh2_make_example.dcl sftp \n\nBy default, libssh2_make_example.dcl links to the object libraries \nproduced by the libssh2_make_lib.dcl procedure. If you want to link\nagainst the shared image library made in the same procedure, invoke\nthe procedure like so:\n\n@libssh2_make_example.dcl sftp \"SHARED\"\n\nThe procdure defines a process logical gnv$libssh2 pointing to the shared\nimage library in the directory, which obviously will not survive a logout. \n\n\nBuilding the help library\n-------------------------\n\nThe man pages can be converted to a VMS help library by issuing\nthis command :\n\n@libssh2_make_help.dcl\n\nIt uses a simple but fairly effective c program man2help.c\nto achieve this.\n\nBuilding a PCSI kit\n-------------------\n\nWhen you have built the shared library and the help library,\nyou can build a PCSI kit by issueing this command:\n\n@libssh2_make_kit.dcl\n\n\n\n\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/win32/.gitignore",
    "content": "*.lib\n*.pdb\n*.dll\n*.exe\n*.obj\n.*.swp\nDebug\nRelease\n*.exp\n*.ncb\n*.opt\n*.plg\nlibssh2.dsp\nobjects.mk\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/win32/GNUmakefile",
    "content": "#########################################################################\n#\n## Makefile for building libssh2 (Win32 version - gnu make)\n## Use: make -f GNUmakefile [help|all|clean|dev|devclean|dist|distclean|dll|objclean]\n##\n## Hacked by: Guenter Knauf\n#\n#########################################################################\n\n# Edit the path below to point to the base of your Zlib sources.\nifndef ZLIB_PATH\nZLIB_PATH = ../../zlib-1.2.8\nendif\n\n# Edit the path below to point to the base of your OpenSSL package.\nifndef OPENSSL_PATH\nOPENSSL_PATH = ../../openssl-1.0.2d\nendif\n\n# Edit the path below to point to your Distribution folder.\nifndef DISTDIR\nDISTDIR\t= libssh2-$(LIBSSH2_VERSION_STR)-bin-$(ARCH)\nendif\nDISTARC\t= $(DISTDIR).zip\n\n# Edit the path below to point to your Development folder.\nifndef DEVLDIR\nDEVLDIR\t= libssh2-$(LIBSSH2_VERSION_STR)-dev-$(ARCH)\nendif\nDEVLARC\t= $(DEVLDIR).zip\n\n# Project root\nPROOT\t= ..\n\n# Edit the vars below to change target settings.\nTARGET\t= libssh2\nWWWURL\t= https://www.libssh2.org/\nDESCR\t= libssh2 $(LIBSSH2_VERSION_STR)\n#STACK\t= 64000\n\n# must be equal to DEBUG or NDEBUG\nifndef DB\n\tDB\t= NDEBUG\n\t# DB\t= DEBUG\nendif\n# Optimization: -O<n> or debugging: -g\nifeq ($(DB),NDEBUG)\n\tOPT\t= -O2\n\tOBJDIR\t= release\nelse\n\tOPT\t= -g\n\tOPT\t+= -DLIBSSH2DEBUG\n\tOBJDIR\t= debug\nendif\n\n# Here you can find a native Win32 binary of the original awk:\n# http://www.gknw.net/development/prgtools/awk-20100523.zip\nAWK\t= awk\nZIP\t= zip -qzr9\n\n# Platform-dependent helper tool macros\nifeq ($(findstring /sh,$(SHELL)),/sh)\nDEL\t= rm -f $1\nRMDIR\t= rm -fr $1\nMKDIR\t= mkdir -p $1\nCOPY\t= -cp -afv $1 $2\n#COPYR\t= -cp -afr $1/* $2\nCOPYR\t= -rsync -aC $1/* $2\nTOUCH\t= touch $1\nCAT\t= cat\nECHONL\t= echo \"\"\nDL\t= '\nelse\nifeq \"$(OS)\" \"Windows_NT\"\nDEL\t= -del 2>NUL /q /f $(subst /,\\,$1)\nRMDIR\t= -rd 2>NUL /q /s $(subst /,\\,$1)\nelse\nDEL\t= -del 2>NUL $(subst /,\\,$1)\nRMDIR\t= -deltree 2>NUL /y $(subst /,\\,$1)\nendif\nMKDIR\t= -md 2>NUL $(subst /,\\,$1)\nCOPY\t= -copy 2>NUL /y $(subst /,\\,$1) $(subst /,\\,$2)\nCOPYR\t= -xcopy 2>NUL /q /y /e $(subst /,\\,$1) $(subst /,\\,$2)\nTOUCH\t= copy 2>&1>NUL /b $(subst /,\\,$1) +,,\nCAT\t= type\nECHONL\t= $(ComSpec) /c echo.\nendif\n\nifeq ($(LIBSSH2_CC),)\nLIBSSH2_CC := $(CROSSPREFIX)gcc\nendif\nifeq ($(LIBSSH2_AR),)\nLIBSSH2_AR := $(CROSSPREFIX)ar\nendif\nifeq ($(LIBSSH2_RANLIB),)\nLIBSSH2_RANLIB := $(CROSSPREFIX)ranlib\nendif\nifeq ($(LIBSSH2_DLL_A_SUFFIX),)\nLIBSSH2_DLL_A_SUFFIX := dll\nendif\n\nlibssh2_dll_LIBRARY = $(TARGET)$(LIBSSH2_DLL_SUFFIX).dll\n\n# The following line defines your compiler.\nifdef METROWERKS\n\tCC = mwcc\nelse\n\tCC = $(LIBSSH2_CC)\nendif\n\n# Set environment var ARCH to your architecture to override autodetection.\nifndef ARCH\nifeq ($(findstring gcc,$(CC)),gcc)\nifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64)\nARCH\t= w64\nelse\nARCH\t= w32\nendif\nelse\nARCH\t= w32\nendif\nendif\n\n# Include the version info retrieved from libssh2.h\n-include $(OBJDIR)/version.inc\n\n# Global flags for all compilers\nCFLAGS\t= $(LIBSSH2_CFLAG_EXTRAS) $(OPT) -D$(DB) -DLIBSSH2_WIN32 -DHAVE_WINDOWS_H # -DHAVE_CONFIG_H\nLDFLAGS = $(LIBSSH2_LDFLAG_EXTRAS)\n\nifeq ($(CC),mwcc)\nLD\t= mwld\nRC\t= mwwinrc\nLDFLAGS\t+= -nostdlib\nAR\t= $(LD)\nARFLAGS\t= -nostdlib -library -o\nLIBEXT\t= lib\n#RANLIB\t=\nLIBPATH\t+= -lr \"$(METROWERKS)/MSL\" -lr \"$(METROWERKS)/Win32-x86 Support\"\nLDLIBS\t+= -lMSL_Runtime_x86.lib -lMSL_C_x86.lib -lMSL_Extras_x86.lib\nRCFLAGS\t=\nCFLAGS\t+= -nostdinc -gccinc -msgstyle gcc -inline off -opt nointrinsics -proc 586\nCFLAGS\t+= -ir \"$(METROWERKS)/MSL\" -ir \"$(METROWERKS)/Win32-x86 Support\"\nCFLAGS\t+= -w on,nounused,nounusedexpr # -ansi strict\nelse\nLIBEXT\t= a\nLD\t= $(LIBSSH2_CC)\nRC\t= $(CROSSPREFIX)windres\nLDFLAGS\t+= -s -shared -Wl,--output-def,$(libssh2_dll_LIBRARY:.dll=.def),--out-implib,$(TARGET)$(LIBSSH2_DLL_A_SUFFIX).$(LIBEXT)\nAR\t= $(LIBSSH2_AR)\nARFLAGS\t= cru\nRANLIB\t= $(LIBSSH2_RANLIB)\nRCFLAGS\t= -I $(PROOT)/include -O coff\nCFLAGS\t+= -fno-builtin\nCFLAGS\t+= -fno-strict-aliasing\nCFLAGS\t+= -Wall # -pedantic\nifeq ($(ARCH),w64)\nCFLAGS\t+= -m64 -D_AMD64_\nLDFLAGS += -m64\nRCFLAGS\t+= -F pe-x86-64\nelse\nCFLAGS\t+= -m32\nLDFLAGS += -m32\nRCFLAGS\t+= -F pe-i386\nendif\nendif\n\nINCLUDES = -I$(PROOT)/win32 -I$(PROOT)/include\n\nifdef WITH_WINCNG\nCFLAGS\t+= -DLIBSSH2_WINCNG\nLDLIBS\t+= -lbcrypt -lcrypt32\nelse\nCFLAGS\t+= -DLIBSSH2_OPENSSL\nifndef OPENSSL_INCLUDE\n\tifeq \"$(wildcard $(OPENSSL_PATH)/outinc)\" \"$(OPENSSL_PATH)/outinc\"\n\t\tOPENSSL_INCLUDE = $(OPENSSL_PATH)/outinc\n\tendif\n\tifeq \"$(wildcard $(OPENSSL_PATH)/include)\" \"$(OPENSSL_PATH)/include\"\n\t\tOPENSSL_INCLUDE = $(OPENSSL_PATH)/include\n\tendif\nendif\nifneq \"$(wildcard $(OPENSSL_INCLUDE)/openssl/opensslv.h)\" \"$(OPENSSL_INCLUDE)/openssl/opensslv.h\"\n$(error Invalid OPENSSL_PATH: $(OPENSSL_PATH))\nendif\nINCLUDES += -I\"$(OPENSSL_INCLUDE)\"\nifndef OPENSSL_LIBPATH\n\tOPENSSL_LIBS_STAT = crypto ssl\n\tifeq \"$(wildcard $(OPENSSL_PATH)/out)\" \"$(OPENSSL_PATH)/out\"\n\t\tOPENSSL_LIBPATH = $(OPENSSL_PATH)/out\n\t\tOPENSSL_LIBS_DYN = eay32 ssl32\n\tendif\n\tifeq \"$(wildcard $(OPENSSL_PATH)/lib)\" \"$(OPENSSL_PATH)/lib\"\n\t\tOPENSSL_LIBPATH = $(OPENSSL_PATH)/lib\n\t\tOPENSSL_LIBS_DYN = crypto.dll ssl.dll\n\tendif\nendif\nifdef LINK_OPENSSL_STATIC\n\tLDLIBS += $(patsubst %,$(OPENSSL_LIBPATH)/lib%.$(LIBEXT), $(OPENSSL_LIBS_STAT)) -lgdi32\nelse\n\tLDLIBS += $(patsubst %,$(OPENSSL_LIBPATH)/lib%.$(LIBEXT), $(OPENSSL_LIBS_DYN))\nendif\nendif\nifeq ($(CC),mwcc)\nLDLIBS\t+= -lkernel32.lib -luser32.lib -lwsock32.lib\nelse\n#LDLIBS\t+= -lwsock32\nLDLIBS\t+= -lws2_32\nendif\n\nifdef WITH_ZLIB\n\tCFLAGS += -DLIBSSH2_HAVE_ZLIB\n\tINCLUDES += -I$(ZLIB_PATH)\n\tifdef LINK_ZLIB_STATIC\n\t\tLDLIBS += $(ZLIB_PATH)/libz.$(LIBEXT)\n\telse\n\t\tLDLIBS += $(ZLIB_PATH)/libz.dll.$(LIBEXT)\n\tendif\nendif\n\nCFLAGS\t+= $(INCLUDES)\n\nvpath %.c $(PROOT)/src\n\nifdef WITH_WINCNG\ninclude $(PROOT)/Makefile.WinCNG.inc\nelse\ninclude $(PROOT)/Makefile.OpenSSL.inc\nendif\n\n# include Makefile.inc to get CSOURCES define\ninclude $(PROOT)/Makefile.inc\n\nOBJECTS\t:= $(patsubst %.c,%.o,$(CSOURCES))\nOBJS\t:= $(addprefix $(OBJDIR)/,$(OBJECTS))\nOBJL\t= $(OBJS) $(OBJDIR)/$(TARGET).res\n\n\nall: lib dll\n\ndll: prebuild $(libssh2_dll_LIBRARY)\n\nlib: prebuild $(TARGET).$(LIBEXT)\n\nprebuild: $(OBJDIR) $(OBJDIR)/version.inc\n# libssh2_config.h\n\ntest: all\n\t$(MAKE) -C test -f GNUmakefile\n\n$(OBJDIR)/%.o: %.c\n#\t@echo Compiling $<\n\t$(CC) $(CFLAGS) -c $< -o $@\n\n$(OBJDIR)/version.inc: $(PROOT)/get_ver.awk $(PROOT)/include/libssh2.h $(OBJDIR)\n\t@echo Creating $@\n\t@$(AWK) -f $^ > $@\n\ndist: all $(DISTDIR) $(DISTDIR)/readme.txt\n\t@$(call MKDIR, $(DISTDIR)/bin)\n\t@$(call COPY, $(PROOT)/AUTHORS, $(DISTDIR))\n\t@$(call COPY, $(PROOT)/COPYING, $(DISTDIR))\n\t@$(call COPY, $(PROOT)/INSTALL, $(DISTDIR))\n\t@$(call COPY, $(PROOT)/README, $(DISTDIR))\n\t@$(call COPY, $(PROOT)/RELEASE-NOTES, $(DISTDIR))\n\t@$(call COPY, $(libssh2_dll_LIBRARY), $(DISTDIR)/bin)\n\t@echo Creating $(DISTARC)\n\t@$(ZIP) $(DISTARC) $(DISTDIR)/* < $(DISTDIR)/readme.txt\n\ndev: all $(DEVLDIR) $(DEVLDIR)/readme.txt\n\t@$(call MKDIR, $(DEVLDIR)/bin)\n\t@$(call MKDIR, $(DEVLDIR)/include)\n\t@$(call MKDIR, $(DEVLDIR)/win32)\n\t@$(call COPY, $(PROOT)/AUTHORS, $(DEVLDIR))\n\t@$(call COPY, $(PROOT)/COPYING, $(DEVLDIR))\n\t@$(call COPY, $(PROOT)/INSTALL, $(DEVLDIR))\n\t@$(call COPY, $(PROOT)/README, $(DEVLDIR))\n\t@$(call COPY, $(PROOT)/RELEASE-NOTES, $(DEVLDIR))\n\t@$(call COPY, $(libssh2_dll_LIBRARY), $(DEVLDIR)/bin)\n\t@$(call COPY, $(PROOT)/include/*.h, $(DEVLDIR)/include)\n\t@$(call COPY, libssh2_config.h, $(DEVLDIR)/include)\n\t@$(call COPY, *.$(LIBEXT), $(DEVLDIR)/win32)\n\t@echo Creating $(DEVLARC)\n\t@$(ZIP) $(DEVLARC) $(DEVLDIR)/* < $(DEVLDIR)/readme.txt\n\ndistclean vclean: clean\n\t$(call RMDIR, $(DISTDIR))\n\t$(call DEL, $(DISTARC))\n\ndevclean: clean\n\t$(call RMDIR, $(DEVLDIR))\n\t$(call DEL, $(DEVLARC))\n\nobjclean: all\n\t$(call RMDIR, $(OBJDIR))\n\ntestclean: clean\n\t$(MAKE) -C test -f GNUmakefile clean\n\nclean:\n#\t$(call DEL, libssh2_config.h)\n\t$(call DEL, $(libssh2_dll_LIBRARY) $(libssh2_dll_LIBRARY:.dll=.def) $(TARGET).$(LIBEXT) $(TARGET)$(LIBSSH2_DLL_A_SUFFIX).$(LIBEXT))\n\t$(call RMDIR, $(OBJDIR))\n\n$(OBJDIR):\n\t@$(call MKDIR, $@)\n\n$(DISTDIR):\n\t@$(call MKDIR, $@)\n\n$(DEVLDIR):\n\t@$(call MKDIR, $@)\n\n$(TARGET).$(LIBEXT): $(OBJS)\n\t@echo Creating $@\n\t@$(call DEL, $@)\n\t@$(AR) $(ARFLAGS) $@ $^\nifdef RANLIB\n\t@$(RANLIB) $@\nendif\n\n$(libssh2_dll_LIBRARY) $(TARGET)$(LIBSSH2_DLL_A_SUFFIX).$(LIBEXT): $(OBJL)\n\t@echo Linking $@\n\t@$(call DEL, $@)\n\t@$(LD) $(LDFLAGS) $^ -o $@ $(LIBPATH) $(LDLIBS)\n\n\n$(OBJDIR)/%.res: %.rc\n\t@echo Creating $@\n\t@$(RC) $(RCFLAGS) -i $< -o $@\n\n\n$(DISTDIR)/readme.txt: GNUmakefile\n\t@echo Creating $@\n\t@echo $(DL)This is a binary distribution for Win32 platform.$(DL) > $@\n\t@echo $(DL)libssh version $(LIBSSH2_VERSION_STR)$(DL) >> $@\n\t@echo $(DL)Please download the complete libssh package for$(DL) >> $@\n\t@echo $(DL)any further documentation:$(DL) >> $@\n\t@echo $(DL)$(WWWURL)$(DL) >> $@\n\n$(DEVLDIR)/readme.txt: GNUmakefile\n\t@echo Creating $@\n\t@echo $(DL)This is a development distribution for Win32 platform.$(DL) > $@\n\t@echo $(DL)libssh version $(LIBSSH2_VERSION_STR)$(DL) >> $@\n\t@echo $(DL)Please download the complete libssh package for$(DL) >> $@\n\t@echo $(DL)any further documentation:$(DL) >> $@\n\t@echo $(DL)$(WWWURL)$(DL) >> $@\n\nhelp: $(OBJDIR)/version.inc\n\t@echo $(DL)===========================================================$(DL)\n\t@echo $(DL)OpenSSL path    = $(OPENSSL_PATH)$(DL)\n\t@echo $(DL)Zlib path       = $(ZLIB_PATH)$(DL)\n\t@echo $(DL)===========================================================$(DL)\n\t@echo $(DL)libssh $(LIBSSH2_VERSION_STR) - available targets are:$(DL)\n\t@echo $(DL)$(MAKE) all$(DL)\n\t@echo $(DL)$(MAKE) dll$(DL)\n\t@echo $(DL)$(MAKE) lib$(DL)\n\t@echo $(DL)$(MAKE) clean$(DL)\n\t@echo $(DL)$(MAKE) dev$(DL)\n\t@echo $(DL)$(MAKE) devclean$(DL)\n\t@echo $(DL)$(MAKE) dist$(DL)\n\t@echo $(DL)$(MAKE) distclean$(DL)\n\t@echo $(DL)$(MAKE) objclean$(DL)\n\t@echo $(DL)$(MAKE) test$(DL)\n\t@echo $(DL)===========================================================$(DL)\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/win32/Makefile.Watcom",
    "content": "#\n#  Watcom / OpenWatcom Win32 makefile for libssh2.\n#\n#  Comments to: Guenter Knauf http://www.gknw.net/phpbb\n#\n\n!ifndef %watcom\n!error WATCOM environment variable not set!\n!else\nSYS_INCL = -I$(%watcom)\\h\\nt -I$(%watcom)\\h\nSYS_LIBS = $(%watcom)\\lib386\\nt;$(%watcom)\\lib386\n!endif\n\n!ifdef %libname\nLIBNAME = $(%libname)\n!else\nLIBNAME = libssh2\n!endif\nTARGETS = $(LIBNAME).dll $(LIBNAME)_imp.lib $(LIBNAME).lib\n\nCC = wcc386\nLD = wlink\nAR = wlib\nRC = wrc\n\n!ifdef __LOADDLL__\n!  loaddll wcc386  wccd386\n!  loaddll wpp386  wppd386\n!  loaddll wlib    wlibd\n!  if $(__VERSION__) > 1270\n!    loaddll wlink   wlinkd\n!  else\n!    loaddll wlink   wlink\n!  endif\n!endif\n\n!if $(__VERSION__) < 1250                                                                                                           \nRM = del /q /f 2>NUL\n!else                                                                                                                               \nRM = rm -f                                                                                                                          \n!endif\nMD = mkdir\nRD = rmdir /q /s 2>NUL\nCP = copy\n\nCFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=nul -w2 -fpi -oilrtfm &\n         -wcd=201 -bt=nt -d+ -dWIN32 -DLIBSSH2_WIN32 &\n         -I. -I..\\include $(SYS_INCL)\n\n!ifdef %debug\nDEBUG  = -dDEBUG=1 -dDEBUGBUILD\nCFLAGS += -d3 $(DEBUG)\n!else\nCFLAGS += -d0\n!endif\n\n!ifdef %use_ipv6\nCFLAGS += -d_WIN32_WINNT=0x0501 -dENABLE_IPV6\n!endif\n\n#\n# Change to suite.\n#\n!ifdef %zlib_root\nZLIB_ROOT = $(%zlib_root)\n!else\nZLIB_ROOT = ..\\..\\zlib-1.2.8\n!endif\n\n!ifdef %openssl_root\nOPENSSL_ROOT = $(%openssl_root)\n!else\nOPENSSL_ROOT = ..\\..\\openssl-0.9.8zc\n!endif\n\n!ifdef %use_zlib\nCFLAGS += -DLIBSSH2_HAVE_ZLIB -I$(ZLIB_ROOT)\n!endif\n\n!ifdef %use_wincng\nCFLAGS += -DLIBSSH2_WINCNG\n!else\nCFLAGS += -wcd=138 -dLIBSSH2_OPENSSL -I$(OPENSSL_ROOT)\\inc32\n!endif\n\n!ifdef %use_watt32\nCFLAGS += -dUSE_WATT32 -I$(%watt_root)\\inc\n!endif\n\nOBJ_BASE = WC_Win32.obj\nLINK_ARG = $(OBJ_BASE)\\dyn\\wlink.arg\nLIB_ARG  = $(OBJ_BASE)\\stat\\wlib.arg\n\n# In order to process Makefile.inc wmake must be called with -u switch!\n!ifndef %MAKEFLAGS\n!error You MUST call wmake with the -u switch!\n!else\n!ifdef %use_wincng\n!include ..\\Makefile.WinCNG.inc\n!else\n!include ..\\Makefile.OpenSSL.inc\n!endif\n!include ..\\Makefile.inc\n!endif\n\nOBJS = $(CSOURCES:.c=.obj)\nOBJS = $OBJ_DIR\\$(OBJS: = $OBJ_DIR\\)\n\n#\n# Use $(OBJS) as a template to generate $(OBJS_STAT) and $(OBJS_DYN).\n#\nOBJ_DIR    = $(OBJ_BASE)\\stat\nOBJS_STAT  = $+ $(OBJS) $-\n\nOBJ_DIR    = $(OBJ_BASE)\\dyn\nOBJS_DYN   = $+ $(OBJS) $-\n\nRESOURCE   = $(OBJ_BASE)\\dyn\\libssh2.res\n\n.c: ..\\src\n\n\nall: $(OBJ_BASE) $(TARGETS) .SYMBOLIC\n\t@echo Welcome to libssh2\n\nclean: .SYMBOLIC\n\t-$(RM) $(OBJS_STAT)\n\t-$(RM) $(OBJS_DYN)\n\t-$(RM) $(RESOURCE) $(LINK_ARG) $(LIB_ARG)\n\nvclean realclean: clean .SYMBOLIC\n\t-$(RM) $(TARGETS) $(LIBNAME).map $(LIBNAME).sym\n\t-$(RD) $(OBJ_BASE)\\stat\n\t-$(RD) $(OBJ_BASE)\\dyn\n\t-$(RD) $(OBJ_BASE)\n\n$(OBJ_BASE):\n\t-$(MD) $^@\n\t-$(MD) $^@\\stat\n\t-$(MD) $^@\\dyn\n\n$(LIBNAME).dll: $(OBJS_DYN) $(RESOURCE) $(LINK_ARG)\n\t$(LD) name $^@ @$]@\n\n$(LIBNAME).lib: $(OBJS_STAT) $(LIB_ARG)\n\t$(AR) -q -b -c $^@ @$]@\n\n.ERASE\n$(RESOURCE): libssh2.rc\n\t$(RC) $(DEBUG) -q -r -zm -I..\\include $(SYS_INCL) $[@ -fo=$^@\n\n.ERASE\n.c{$(OBJ_BASE)\\dyn}.obj:\n\t$(CC) $(CFLAGS) -bd -br $[@ -fo=$^@\n\n.ERASE\n.c{$(OBJ_BASE)\\stat}.obj:\n\t$(CC) $(CFLAGS) $[@ -fo=$^@\n\n$(LINK_ARG): $(__MAKEFILES__)\n\t%create $^@\n\t@%append $^@ system nt dll\n\t@%append $^@ file { $(OBJS_DYN) }\n!ifdef %debug\n\t@%append $^@ debug all\n\t@%append $^@ option symfile\n!endif\n\t@%append $^@ option quiet, map, caseexact, eliminate, implib=$(LIBNAME)_imp.lib,\n\t@%append $^@ res=$(RESOURCE) libpath $(SYS_LIBS)\n!ifdef %use_watt32\n\t@%append $^@ library $(%watt_root)\\lib\\wattcpw_imp.lib\n!else\n\t@%append $^@ library ws2_32.lib\n!endif\n!ifdef %use_zlib\n\t@%append $^@ library '$(ZLIB_ROOT)\\zlib.lib'\n!endif\n!ifdef %use_wincng\n\t@%append $^@ library bcrypt.lib\n\t@%append $^@ library crypt32.lib\n!else\n\t@%append $^@ library '$(OPENSSL_ROOT)\\out32\\libeay32.lib'\n\t@%append $^@ library '$(OPENSSL_ROOT)\\out32\\ssleay32.lib'\n!endif\n\n$(LIB_ARG): $(__MAKEFILES__)\n\t%create $^@\n\t@for %f in ($(OBJS_STAT)) do @%append $^@ +- %f\n\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/win32/config.mk",
    "content": "\n# Tweak these for your system\n!if \"$(OPENSSLINC)\" == \"\"\nOPENSSLINC=..\\openssl-0.9.8zc\\inc32\n!endif\n\n!if \"$(OPENSSLLIB)\" == \"\"\nOPENSSLLIB=..\\openssl-0.9.8zc\\out32dll\n!endif\n\n!if \"$(ZLIBINC)\" == \"\"\nZLIBINC=..\\zlib-1.2.8\n!endif\n\n!if \"$(ZLIBLIB)\" == \"\"\nZLIBLIB=..\\zlib-1.2.8\n!endif\n\n!if \"$(TARGET)\" == \"\"\nTARGET=Release\n!endif\n\n!if \"$(TARGET)\" == \"Debug\"\nSUFFIX=_debug\nCPPFLAGS=/Od /MDd\nDLLFLAGS=/DEBUG /LDd\n!else\nCPPFLAGS=/Oi /O2 /Oy /GF /Y- /MD /DNDEBUG\nDLLFLAGS=/DEBUG /LD\n!endif\n\nCPPFLAGS=/nologo /GL /Zi /EHsc $(CPPFLAGS) /Iwin32 /Iinclude\n\n!if \"$(WITH_WINCNG)\" == \"1\"\nCPPFLAGS=$(CPPFLAGS) /DLIBSSH2_WINCNG\n# LIBS=bcrypt.lib crypt32.lib\n!else\nCPPFLAGS=$(CPPFLAGS) /DLIBSSH2_OPENSSL /I$(OPENSSLINC)\nLIBS=$(LIBS) $(OPENSSLLIB)\\libeay32.lib $(OPENSSLLIB)\\ssleay32.lib\n!endif\n\n!if \"$(WITH_ZLIB)\" == \"1\"\nCPPFLAGS=$(CPPFLAGS) /DLIBSSH2_HAVE_ZLIB /I$(ZLIBINC)\nLIBS=$(LIBS) $(ZLIBLIB)\\zlib.lib\n!endif\n\nCFLAGS=$(CPPFLAGS)\nRCFLAGS=/Iinclude\nDLLFLAGS=$(CFLAGS) $(DLLFLAGS)\nLIBS=$(LIBS) ws2_32.lib user32.lib advapi32.lib gdi32.lib\n\nINTDIR=$(TARGET)\\$(SUBDIR)\n\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/win32/libssh2.dsw",
    "content": "Microsoft Developer Studio Workspace File, Format Version 6.00\n# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\n\n###############################################################################\n\nProject: \"libssh2\"=\".\\libssh2.dsp\" - Package Owner=<4>\n\nPackage=<5>\n{{{\n}}}\n\nPackage=<4>\n{{{\n}}}\n\n###############################################################################\n\nProject: \"tests\"=\".\\tests.dsp\" - Package Owner=<4>\n\nPackage=<5>\n{{{\n}}}\n\nPackage=<4>\n{{{\n}}}\n\n###############################################################################\n\nGlobal:\n\nPackage=<5>\n{{{\n}}}\n\nPackage=<3>\n{{{\n}}}\n\n###############################################################################\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/win32/libssh2.rc",
    "content": "/***************************************************************************\n* libssh2 Win32 resource file                                              *\n***************************************************************************/\n#include <winver.h>\n#include \"../include/libssh2.h\"\n\nLANGUAGE  0x09,0x01\n\n#define RC_VERSION  LIBSSH2_VERSION_MAJOR, LIBSSH2_VERSION_MINOR, LIBSSH2_VERSION_PATCH, 0\n\nVS_VERSION_INFO VERSIONINFO\n  FILEVERSION     RC_VERSION\n  PRODUCTVERSION  RC_VERSION\n  FILEFLAGSMASK   0x3fL\n#if defined(DEBUGBUILD) || defined(_DEBUG)\n  FILEFLAGS 1\n#else\n  FILEFLAGS 0\n#endif\n  FILEOS      VOS__WINDOWS32\n  FILETYPE    VFT_DLL\n  FILESUBTYPE 0x0L\n\nBEGIN\n  BLOCK \"StringFileInfo\"\n  BEGIN\n    BLOCK \"040904b0\"\n    BEGIN\n      VALUE \"CompanyName\",      \"The libssh2 library, https://www.libssh2.org/\\0\"\n      VALUE \"FileDescription\",  \"libssh2 Shared Library\\0\"\n      VALUE \"FileVersion\",      LIBSSH2_VERSION \"\\0\"\n      VALUE \"InternalName\",     \"libssh2\\0\"\n      VALUE \"OriginalFilename\", \"libssh2.dll\\0\"\n      VALUE \"ProductName\",      \"The libssh2 library\\0\"\n      VALUE \"ProductVersion\",   LIBSSH2_VERSION \"\\0\"\n      VALUE \"LegalCopyright\",   \" \" LIBSSH2_COPYRIGHT \"\\0\"\n      VALUE \"License\",          \"https://www.libssh2.org/license.html\\0\"\n    END\n  END\n\n  BLOCK \"VarFileInfo\"\n  BEGIN\n    VALUE \"Translation\", 0x409, 1200\n  END\nEND\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/win32/libssh2_config.h",
    "content": "#ifndef LIBSSH2_CONFIG_H\n#define LIBSSH2_CONFIG_H\n\n#ifndef WIN32\n#define WIN32\n#endif\n#ifndef _CRT_SECURE_NO_DEPRECATE\n#define _CRT_SECURE_NO_DEPRECATE 1\n#endif /* _CRT_SECURE_NO_DEPRECATE */\n#include <winsock2.h>\n#include <mswsock.h>\n#include <ws2tcpip.h>\n\n#ifdef __MINGW32__\n#define HAVE_UNISTD_H\n#define HAVE_INTTYPES_H\n#define HAVE_SYS_TIME_H\n#define HAVE_GETTIMEOFDAY\n#endif /* __MINGW32__ */\n\n#define HAVE_LIBCRYPT32\n#define HAVE_WINSOCK2_H\n#define HAVE_IOCTLSOCKET\n#define HAVE_SELECT\n\n#ifdef _MSC_VER\n#if _MSC_VER < 1900\n#define snprintf _snprintf\n#if _MSC_VER < 1500\n#define vsnprintf _vsnprintf\n#endif\n#define strdup _strdup\n#define strncasecmp _strnicmp\n#define strcasecmp _stricmp\n#endif\n#else\n#ifndef __MINGW32__\n#define strncasecmp strnicmp\n#define strcasecmp stricmp\n#endif /* __MINGW32__ */\n#endif /* _MSC_VER */\n\n/* Enable newer diffie-hellman-group-exchange-sha1 syntax */\n#define LIBSSH2_DH_GEX_NEW 1\n\n#endif /* LIBSSH2_CONFIG_H */\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/win32/msvcproj.foot",
    "content": "# End Target\n# End Project\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/win32/msvcproj.head",
    "content": "# Microsoft Developer Studio Project File - Name=\"libssh2\" - Package Owner=<4>\n# Microsoft Developer Studio Generated Build File, Format Version 6.00\n# ** DO NOT EDIT **\n# only OpenSSL and WinCNG are supported with this build system\n\n# TARGTYPE \"Win32 (x86) Dynamic-Link Library\" 0x0102\n# TARGTYPE \"Win32 (x86) Static Library\" 0x0104\n\nCFG=libssh2 - Win32 OpenSSL Debug\n!MESSAGE This is not a valid makefile. To build this project using NMAKE,\n!MESSAGE use the Export Makefile command and run\n!MESSAGE\n!MESSAGE NMAKE /f \"libssh2.mak\".\n!MESSAGE\n!MESSAGE You can specify a configuration when running NMAKE\n!MESSAGE by defining the macro CFG on the command line. For example:\n!MESSAGE\n!MESSAGE NMAKE /f \"libssh2.mak\" CFG=\"libssh2 - Win32 DLL Debug\"\n!MESSAGE\n!MESSAGE Possible choices for configuration are:\n!MESSAGE\n!MESSAGE \"libssh2 - Win32 OpenSSL DLL Release\" (based on \"Win32 (x86) Dynamic-Link Library\")\n!MESSAGE \"libssh2 - Win32 OpenSSL DLL Debug\" (based on \"Win32 (x86) Dynamic-Link Library\")\n!MESSAGE \"libssh2 - Win32 OpenSSL LIB Release\" (based on \"Win32 (x86) Static Library\")\n!MESSAGE \"libssh2 - Win32 OpenSSL LIB Debug\" (based on \"Win32 (x86) Static Library\")\n!MESSAGE \"libssh2 - Win32 WinCNG DLL Release\" (based on \"Win32 (x86) Dynamic-Link Library\")\n!MESSAGE \"libssh2 - Win32 WinCNG DLL Debug\" (based on \"Win32 (x86) Dynamic-Link Library\")\n!MESSAGE \"libssh2 - Win32 WinCNG LIB Release\" (based on \"Win32 (x86) Static Library\")\n!MESSAGE \"libssh2 - Win32 WinCNG LIB Debug\" (based on \"Win32 (x86) Static Library\")\n!MESSAGE\n\n# Begin Project\n# PROP AllowPerConfigDependencies 0\n# PROP Scc_ProjName \"\"\n# PROP Scc_LocalPath \"\"\nCPP=cl.exe\nMTL=midl.exe\nRSC=rc.exe\n\n!IF  \"$(CFG)\" == \"libssh2 - Win32 OpenSSL DLL Release\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 0\n# PROP BASE Output_Dir \"Release_dll\"\n# PROP BASE Intermediate_Dir \"Release_dll\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 0\n# PROP Output_Dir \"Release_dll\"\n# PROP Intermediate_Dir \"Release_dll\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_OPENSSL\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# ADD CPP /nologo /MD /W3 /GX /O2 /I \"..\\win32\" /I \"..\\include\" /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_OPENSSL\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# SUBTRACT CPP /YX\n# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\n# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\n# ADD RSC /l 0x409 /d \"NDEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386\n# ADD LINK32 gdi32.lib advapi32.lib user32.lib kernel32.lib ws2_32.lib libeay32.lib zlib.lib /nologo /dll /map /debug /machine:I386\n\n!ELSEIF  \"$(CFG)\" == \"libssh2 - Win32 OpenSSL DLL Debug\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 1\n# PROP BASE Output_Dir \"Debug_dll\"\n# PROP BASE Intermediate_Dir \"Debug_dll\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 1\n# PROP Output_Dir \"Debug_dll\"\n# PROP Intermediate_Dir \"Debug_dll\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_OPENSSL\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /GZ /c\n# ADD CPP /nologo /MD /W3 /Gm /GX /ZI /Od /I \"..\\win32\" /I \"..\\include\" /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_OPENSSL\" /D \"_MBCS\" /D \"_LIB\" /D \"LIBSSH2DEBUG\" /YX /FD /GZ /c\n# SUBTRACT CPP /WX /YX\n# ADD BASE MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\n# ADD MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\n# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\n# ADD RSC /l 0x409 /d \"_DEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept\n# ADD LINK32 gdi32.lib advapi32.lib user32.lib kernel32.lib ws2_32.lib libeay32.lib zlib.lib /nologo /dll /incremental:no /map /debug /machine:I386 /pdbtype:sept\n# SUBTRACT LINK32 /nodefaultlib\n\n!ELSEIF  \"$(CFG)\" == \"libssh2 - Win32 OpenSSL LIB Release\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 0\n# PROP BASE Output_Dir \"Release_lib\"\n# PROP BASE Intermediate_Dir \"Release_lib\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 0\n# PROP Output_Dir \"Release_lib\"\n# PROP Intermediate_Dir \"Release_lib\"\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_OPENSSL\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# ADD CPP /nologo /MD /W3 /GX /O2 /I \"..\\win32\" /I \"..\\include\" /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_OPENSSL\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\n# ADD RSC /l 0x409 /d \"NDEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLIB32=link.exe -lib\n# ADD BASE LIB32 /nologo\n# ADD LIB32 /nologo\n# ADD LIB32 /nologo /out:\"Release_lib\\libssh2.lib\"\n\n!ELSEIF  \"$(CFG)\" == \"libssh2 - Win32 OpenSSL LIB Debug\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 1\n# PROP BASE Output_Dir \"Debug_lib\"\n# PROP BASE Intermediate_Dir \"Debug_lib\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 1\n# PROP Output_Dir \"Debug_lib\"\n# PROP Intermediate_Dir \"Debug_lib\"\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_OPENSSL\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /GZ /c\n# ADD CPP /nologo /MD /W3 /Gm /GX /ZI /Od /I \"..\\win32\" /I \"..\\include\" /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_OPENSSL\" /D \"_MBCS\" /D \"_LIB\" /D \"LIBSSH2DEBUG\" /YX /FD /GZ /c\n# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\n# ADD RSC /l 0x409 /d \"_DEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLIB32=link.exe -lib\n# ADD BASE LIB32 /nologo\n# ADD LIB32 /nologo /out:\"Debug_lib\\libssh2d.lib\"\n\n!ELSEIF  \"$(CFG)\" == \"libssh2 - Win32 WinCNG LIB Debug\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 0\n# PROP BASE Output_Dir \"Release_dll\"\n# PROP BASE Intermediate_Dir \"Release_dll\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 0\n# PROP Output_Dir \"Release_dll\"\n# PROP Intermediate_Dir \"Release_dll\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_WINCNG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# ADD CPP /nologo /MD /W3 /GX /O2 /I \"..\\win32\" /I \"..\\include\" /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_WINCNG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# SUBTRACT CPP /YX\n# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\n# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\n# ADD RSC /l 0x409 /d \"NDEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386\n# ADD LINK32 gdi32.lib advapi32.lib user32.lib kernel32.lib ws2_32.lib crypt32.lib bcrypt.lib /nologo /dll /map /debug /machine:I386\n\n!ELSEIF  \"$(CFG)\" == \"libssh2 - Win32 WinCNG DLL Debug\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 1\n# PROP BASE Output_Dir \"Debug_dll\"\n# PROP BASE Intermediate_Dir \"Debug_dll\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 1\n# PROP Output_Dir \"Debug_dll\"\n# PROP Intermediate_Dir \"Debug_dll\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_WINCNG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /GZ /c\n# ADD CPP /nologo /MD /W3 /Gm /GX /ZI /Od /I \"..\\win32\" /I \"..\\include\" /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_WINCNG\" /D \"_MBCS\" /D \"_LIB\" /D \"LIBSSH2DEBUG\" /YX /FD /GZ /c\n# SUBTRACT CPP /WX /YX\n# ADD BASE MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\n# ADD MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\n# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\n# ADD RSC /l 0x409 /d \"_DEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept\n# ADD LINK32 gdi32.lib advapi32.lib user32.lib kernel32.lib ws2_32.lib crypt32.lib bcrypt.lib /nologo /dll /incremental:no /map /debug /machine:I386 /pdbtype:sept\n# SUBTRACT LINK32 /nodefaultlib\n\n!ELSEIF  \"$(CFG)\" == \"libssh2 - Win32 WinCNG LIB Release\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 0\n# PROP BASE Output_Dir \"Release_lib\"\n# PROP BASE Intermediate_Dir \"Release_lib\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 0\n# PROP Output_Dir \"Release_lib\"\n# PROP Intermediate_Dir \"Release_lib\"\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_WINCNG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# ADD CPP /nologo /MD /W3 /GX /O2 /I \"..\\win32\" /I \"..\\include\" /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_WINCNG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\n# ADD RSC /l 0x409 /d \"NDEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLIB32=link.exe -lib\n# ADD BASE LIB32 /nologo\n# ADD LIB32 /nologo\n# ADD LIB32 /nologo /out:\"Release_lib\\libssh2.lib\"\n\n!ELSEIF  \"$(CFG)\" == \"libssh2 - Win32 WinCNG LIB Debug\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 1\n# PROP BASE Output_Dir \"Debug_lib\"\n# PROP BASE Intermediate_Dir \"Debug_lib\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 1\n# PROP Output_Dir \"Debug_lib\"\n# PROP Intermediate_Dir \"Debug_lib\"\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_WINCNG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /GZ /c\n# ADD CPP /nologo /MD /W3 /Gm /GX /ZI /Od /I \"..\\win32\" /I \"..\\include\" /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"LIBSSH2_WINCNG\" /D \"_MBCS\" /D \"_LIB\" /D \"LIBSSH2DEBUG\" /YX /FD /GZ /c\n# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\n# ADD RSC /l 0x409 /d \"_DEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLIB32=link.exe -lib\n# ADD BASE LIB32 /nologo\n# ADD LIB32 /nologo /out:\"Debug_lib\\libssh2d.lib\"\n\n!ENDIF\n\n# Begin Target\n\n# Name \"libssh2 - Win32 OpenSSL DLL Release\"\n# Name \"libssh2 - Win32 OpenSSL DLL Debug\"\n# Name \"libssh2 - Win32 OpenSSL LIB Release\"\n# Name \"libssh2 - Win32 OpenSSL LIB Debug\"\n# Name \"libssh2 - Win32 WinCNG DLL Release\"\n# Name \"libssh2 - Win32 WinCNG DLL Debug\"\n# Name \"libssh2 - Win32 WinCNG LIB Release\"\n# Name \"libssh2 - Win32 WinCNG LIB Debug\"\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/win32/rules.mk",
    "content": "\nall-sub: $(INTDIR) all\n\nclean-sub: clean\n\n$(INTDIR):\n!if \"$(SRCDIR)\" == \"\"\n\t@if not exist $(TARGET) mkdir $(TARGET)\n!endif\n\t@if not exist $(INTDIR) mkdir $(INTDIR)\n\n{$(SUBDIR)}.c{$(INTDIR)}.obj::\n\t$(CC) -c $(CFLAGS) /Fo\"$(INTDIR)\\\\\" $<\n\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/win32/test/GNUmakefile",
    "content": "#########################################################################\n#\n## Makefile for building libssh2 samples (Win32 version - gnu make)\n## Use: make -f GNUmakefile [help]\n##\n## Hacked by: Guenter Knauf\n#\n#########################################################################\n\n# Edit the path below to point to the base of your Zlib sources.\nifndef ZLIB_PATH\nZLIB_PATH = ../../../zlib-1.2.8\nendif\n\n# Edit the path below to point to the base of your OpenSSL package.\nifndef OPENSSL_PATH\nOPENSSL_PATH = ../../../openssl-0.9.8zc\nendif\n\n# Project root\nPROOT\t= ../..\n\n# Edit the var below to enable static linking of libssh2 and libz\nLINK_STATIC = 1\n\n# Edit the vars below to change target settings.\nSAMPLES\t= $(PROOT)/example\nTARGETS := $(filter-out x11.exe,$(patsubst $(SAMPLES)/%.c,%.exe,$(strip $(wildcard $(SAMPLES)/*.c))))\nWWWURL\t= https://www.libssh2.org/\nDESCR\t= libssh2 $(subst .rc,,$(notdir $@)) $(LIBSSH2_VERSION_STR)\n#STACK\t= 64000\n\n# must be equal to DEBUG or NDEBUG\nifndef DB\n\tDB\t= NDEBUG\n\t# DB\t= DEBUG\nendif\n# Optimization: -O<n> or debugging: -g\nifeq ($(DB),NDEBUG)\n\tOPT\t= -O2\n\tOBJDIR\t= release\nelse\n\tOPT\t= -g\n\tOBJDIR\t= debug\nendif\n\n# Here you can find a native Win32 binary of the original awk:\n# http://www.gknw.net/development/prgtools/awk-20100523.zip\nAWK     = awk\nZIP     = zip -qzr9\n\n# Platform-dependent helper tool macros\nifeq ($(findstring /sh,$(SHELL)),/sh)\nDEL\t= rm -f $1\nRMDIR\t= rm -fr $1\nMKDIR\t= mkdir -p $1\nCOPY\t= -cp -afv $1 $2\n#COPYR\t= -cp -afr $1/* $2\nCOPYR\t= -rsync -aC $1/* $2\nTOUCH\t= touch $1\nCAT\t= cat\nECHONL\t= echo \"\"\nDL\t= '\nelse\nifeq \"$(OS)\" \"Windows_NT\"\nDEL\t= -del 2>NUL /q /f $(subst /,\\,$1)\nRMDIR\t= -rd 2>NUL /q /s $(subst /,\\,$1)\nelse\nDEL\t= -del 2>NUL $(subst /,\\,$1)\nRMDIR\t= -deltree 2>NUL /y $(subst /,\\,$1)\nendif\nMKDIR\t= -md 2>NUL $(subst /,\\,$1)\nCOPY\t= -copy 2>NUL /y $(subst /,\\,$1) $(subst /,\\,$2)\nCOPYR\t= -xcopy 2>NUL /q /y /e $(subst /,\\,$1) $(subst /,\\,$2)\nTOUCH\t= copy 2>&1>NUL /b $(subst /,\\,$1) +,,\nCAT\t= type\nECHONL\t= $(ComSpec) /c echo.\nendif\n\n# The following line defines your compiler.\nifdef METROWERKS\n\tCC = mwcc\nelse\n\tCC = $(CROSSPREFIX)gcc\nendif\n\n# Set environment var ARCH to your architecture to override autodetection.\nifndef ARCH\nifeq ($(findstring gcc,$(CC)),gcc)\nifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64)\nARCH\t= w64\nelse\nARCH\t= w32\nendif\nelse\nARCH\t= w32\nendif\nendif\n\n# Include the version info retrieved from libssh2.h\n-include $(OBJDIR)/version.inc\n\n# Global flags for all compilers\nCFLAGS\t= $(OPT) -D$(DB) -DLIBSSH2_WIN32 # -DHAVE_CONFIG_H\n\nifeq ($(CC),mwcc)\nLD\t= mwld\nRC\t= mwwinrc\nLDFLAGS\t= -nostdlib\nAR\t= $(LD)\nARFLAGS\t= -nostdlib -library -o\nLIBEXT\t= lib\nLIBPATH\t+= -lr \"$(METROWERKS)/MSL\" -lr \"$(METROWERKS)/Win32-x86 Support\"\nLDLIBS\t+= -lMSL_Runtime_x86.lib -lMSL_C_x86.lib -lMSL_Extras_x86.lib\nLDLIBS\t+= -lkernel32.lib -luser32.lib -lwsock32.lib\nRCFLAGS\t=\nCFLAGS\t+= -nostdinc -gccinc -msgstyle gcc -inline off -opt nointrinsics -proc 586\nCFLAGS\t+= -ir \"$(METROWERKS)/MSL\" -ir \"$(METROWERKS)/Win32-x86 Support\"\nCFLAGS\t+= -w on,nounused,nounusedexpr # -ansi strict\nelse\nLD\t= $(CROSSPREFIX)gcc\nRC\t= $(CROSSPREFIX)windres\nLDFLAGS\t= -s\nAR\t= $(CROSSPREFIX)ar\nARFLAGS\t= -cq\nLIBEXT\t= a\n#LDLIBS\t+= -lwsock32\nLDLIBS\t+= -lws2_32\nRCFLAGS\t= -I $(PROOT)/include -O coff\nCFLAGS\t+= -fno-builtin\nCFLAGS\t+= -fno-strict-aliasing\nCFLAGS\t+= -Wall #-Wno-unused #-pedantic\nifeq ($(ARCH),w64)\nCFLAGS\t+= -D_AMD64_\nRCFLAGS\t+= -F pe-x86-64\nelse\nCFLAGS\t+= -m32\nRCFLAGS\t+= -F pe-i386\nendif\nendif\n\nINCLUDES = -I$(PROOT)/win32 -I$(PROOT)/include\nLIBPATH += -L$(PROOT)/win32\n\nifdef LINK_STATIC\n\tLDLIBS += -llibssh2\nelse\n\tLDLIBS += -llibssh2dll\nendif\n\nifdef WITH_WINCNG\n# CFLAGS\t+= -DLIBSSH2_WINCNG\nLDLIBS\t+= -lbcrypt -lcrypt32\nelse\n# CFLAGS\t+= -DLIBSSH2_OPENSSL\nifndef OPENSSL_INCLUDE\n\tifeq \"$(wildcard $(OPENSSL_PATH)/outinc)\" \"$(OPENSSL_PATH)/outinc\"\n\t\tOPENSSL_INCLUDE = $(OPENSSL_PATH)/outinc\n\tendif\n\tifeq \"$(wildcard $(OPENSSL_PATH)/include)\" \"$(OPENSSL_PATH)/include\"\n\t\tOPENSSL_INCLUDE = $(OPENSSL_PATH)/include\n\tendif\nendif\nifneq \"$(wildcard $(OPENSSL_INCLUDE)/openssl/opensslv.h)\" \"$(OPENSSL_INCLUDE)/openssl/opensslv.h\"\n$(error Invalid OPENSSL_PATH: $(OPENSSL_PATH))\nendif\nINCLUDES += -I\"$(OPENSSL_INCLUDE)\"\nifndef OPENSSL_LIBPATH\n\tOPENSSL_LIBS_STAT = crypto ssl\n\tifeq \"$(wildcard $(OPENSSL_PATH)/out)\" \"$(OPENSSL_PATH)/out\"\n\t\tOPENSSL_LIBPATH = $(OPENSSL_PATH)/out\n\t\tOPENSSL_LIBS_DYN = eay32 ssl32\n\tendif\n\tifeq \"$(wildcard $(OPENSSL_PATH)/lib)\" \"$(OPENSSL_PATH)/lib\"\n\t\tOPENSSL_LIBPATH = $(OPENSSL_PATH)/lib\n\t\tOPENSSL_LIBS_DYN = crypto.dll ssl.dll\n\tendif\nendif\nifdef LINK_STATIC\nifdef LINK_OPENSSL_STATIC\n\tLDLIBS += $(patsubst %,$(OPENSSL_LIBPATH)/lib%.$(LIBEXT), $(OPENSSL_LIBS_STAT)) -lgdi32\nelse\n\tLDLIBS += $(patsubst %,$(OPENSSL_LIBPATH)/lib%.$(LIBEXT), $(OPENSSL_LIBS_DYN))\nendif\nendif\nendif\n\nifdef WITH_ZLIB\n\tCFLAGS += -DLIBSSH2_HAVE_ZLIB\n\tINCLUDES += -I$(ZLIB_PATH)\n\tifdef LINK_ZLIB_STATIC\n\t\tLDLIBS += $(ZLIB_PATH)/libz.$(LIBEXT)\n\telse\n\t\tLDLIBS += $(ZLIB_PATH)/libzdll.$(LIBEXT)\n\tendif\nendif\n\nCFLAGS\t+= $(INCLUDES)\n\nvpath %.c $(PROOT)/example\n\n.PRECIOUS: $(OBJDIR)/%.o $(OBJDIR)/%.rc $(OBJDIR)/%.res\n\n\nall: prebuild $(TARGETS)\n\nprebuild: $(OBJDIR) $(OBJDIR)/version.inc\n\n$(OBJDIR)/%.o: %.c\n#\t@echo Compiling $<\n\t$(CC) $(CFLAGS) -c $< -o $@\n\n$(OBJDIR)/version.inc: $(PROOT)/include/libssh2.h $(OBJDIR)\n\t@echo Creating $@\n\t@$(AWK) -f $(PROOT)/get_ver.awk $< > $@\n\nobjclean:\n\t$(call RMDIR, $(OBJDIR))\n\nclean: objclean\n\t$(call DEL, $(TARGETS))\n\n$(OBJDIR):\n\t$(call MKDIR, $@)\n\n%.exe: $(OBJDIR)/%.o $(OBJDIR)/%.res\n\t@echo Linking $@\n\t@$(call DEL, $@)\n\t$(LD) $(LDFLAGS) $^ -o $@ $(LIBPATH) $(LDLIBS)\n\n$(OBJDIR)/%.res: $(OBJDIR)/%.rc\n\t@echo Creating $@\n\t@$(RC) $(RCFLAGS) -i $< -o $@\n\n$(OBJDIR)/%.rc: GNUmakefile $(OBJDIR)/version.inc\n\t@echo $(DL)1 VERSIONINFO$(DL) > $@\n\t@echo $(DL) FILEVERSION $(LIBSSH2_VERSION),0$(DL) >> $@\n\t@echo $(DL) PRODUCTVERSION $(LIBSSH2_VERSION),0$(DL) >> $@\n\t@echo $(DL) FILEFLAGSMASK 0x3fL$(DL) >> $@\n\t@echo $(DL) FILEOS 0x40004L$(DL) >> $@\n\t@echo $(DL) FILEFLAGS 0x0L$(DL) >> $@\n\t@echo $(DL) FILETYPE 0x1L$(DL) >> $@\n\t@echo $(DL) FILESUBTYPE 0x0L$(DL) >> $@\n\t@echo $(DL)BEGIN$(DL) >> $@\n\t@echo $(DL)  BLOCK \"StringFileInfo\"$(DL) >> $@\n\t@echo $(DL)  BEGIN$(DL) >> $@\n\t@echo $(DL)    BLOCK \"040904E4\"$(DL) >> $@\n\t@echo $(DL)    BEGIN$(DL) >> $@\n\t@echo $(DL)      VALUE \"LegalCopyright\",\"\\xA9 $(LIBSSH2_COPYRIGHT_STR)\\0\"$(DL) >> $@\nifdef COMPANY\n\t@echo $(DL)      VALUE \"CompanyName\",\"$(COMPANY)\\0\"$(DL) >> $@\nendif\n\t@echo $(DL)      VALUE \"ProductName\",\"$(notdir $(@:.rc=.exe))\\0\"$(DL) >> $@\n\t@echo $(DL)      VALUE \"ProductVersion\",\"$(LIBSSH2_VERSION_STR)\\0\"$(DL) >> $@\n\t@echo $(DL)      VALUE \"License\",\"Released under GPL.\\0\"$(DL) >> $@\n\t@echo $(DL)      VALUE \"FileDescription\",\"$(DESCR)\\0\"$(DL) >> $@\n\t@echo $(DL)      VALUE \"FileVersion\",\"$(LIBSSH2_VERSION_STR)\\0\"$(DL) >> $@\n\t@echo $(DL)      VALUE \"InternalName\",\"$(notdir $(@:.rc=))\\0\"$(DL) >> $@\n\t@echo $(DL)      VALUE \"OriginalFilename\",\"$(notdir $(@:.rc=.exe))\\0\"$(DL) >> $@\n\t@echo $(DL)      VALUE \"WWW\",\"$(WWWURL)\\0\"$(DL) >> $@\n\t@echo $(DL)    END$(DL) >> $@\n\t@echo $(DL)  END$(DL) >> $@\n\t@echo $(DL)  BLOCK \"VarFileInfo\"$(DL) >> $@\n\t@echo $(DL)  BEGIN$(DL) >> $@\n\t@echo $(DL)    VALUE \"Translation\", 0x409, 1252$(DL) >> $@\n\t@echo $(DL)  END$(DL) >> $@\n\t@echo $(DL)END$(DL) >> $@\nifdef ICON\n\t@echo $(DL)10 ICON DISCARDABLE \"$(ICON)\"$(DL) >> $@\nendif\n\nhelp: $(OBJDIR)/version.inc\n\t@echo $(DL)===========================================================$(DL)\n\t@echo $(DL)OpenSSL path    = $(OPENSSL_PATH)$(DL)\n\t@echo $(DL)Zlib path       = $(ZLIB_PATH)$(DL)\n\t@echo $(DL)===========================================================$(DL)\n\t@echo $(DL)libssh $(LIBSSH2_VERSION_STR) - available targets are:$(DL)\n\t@echo $(DL)$(MAKE) all$(DL)\n\t@echo $(DL)$(MAKE) clean$(DL)\n\t@echo $(DL)$(MAKE) objclean$(DL)\n\t@echo $(DL)===========================================================$(DL)\n\n\n"
  },
  {
    "path": "src/third-party/libssh2-1.9.0/sources/win32/tests.dsp",
    "content": "# Microsoft Developer Studio Project File - Name=\"tests\" - Package Owner=<4>\n# Microsoft Developer Studio Generated Build File, Format Version 6.00\n# ** DO NOT EDIT **\n\n# TARGTYPE \"Win32 (x86) Console Application\" 0x0103\n\nCFG=tests - Win32 Debug\n!MESSAGE This is not a valid makefile. To build this project using NMAKE,\n!MESSAGE use the Export Makefile command and run\n!MESSAGE \n!MESSAGE NMAKE /f \"tests.mak\".\n!MESSAGE \n!MESSAGE You can specify a configuration when running NMAKE\n!MESSAGE by defining the macro CFG on the command line. For example:\n!MESSAGE \n!MESSAGE NMAKE /f \"tests.mak\" CFG=\"tests - Win32 Debug\"\n!MESSAGE \n!MESSAGE Possible choices for configuration are:\n!MESSAGE \n!MESSAGE \"tests - Win32 Release\" (based on \"Win32 (x86) Console Application\")\n!MESSAGE \"tests - Win32 Debug\" (based on \"Win32 (x86) Console Application\")\n!MESSAGE \n\n# Begin Project\n# PROP AllowPerConfigDependencies 0\n# PROP Scc_ProjName \"\"\n# PROP Scc_LocalPath \"\"\nCPP=cl.exe\nRSC=rc.exe\n\n!IF  \"$(CFG)\" == \"tests - Win32 Release\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 0\n# PROP BASE Output_Dir \"tests___Win32_Release\"\n# PROP BASE Intermediate_Dir \"tests___Win32_Release\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 0\n# PROP Output_Dir \"Release\"\n# PROP Intermediate_Dir \"Release\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /c\n# ADD CPP /nologo /MD /W3 /GX /O2 /I \"..\\include\" /I \"..\\win32\" /D \"WIN32\" /D \"NDEBUG\" /D \"LIBSSH2_WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /c\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\n# ADD RSC /l 0x409 /d \"NDEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\n# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libeay32.lib ssleay32.lib ws2_32.lib zlib.lib libssh2.lib /nologo /subsystem:console /machine:I386 /libpath:\"Release\" /out:\"simple.exe\"\n\n!ELSEIF  \"$(CFG)\" == \"tests - Win32 Debug\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 1\n# PROP BASE Output_Dir \"tests___Win32_Debug\"\n# PROP BASE Intermediate_Dir \"tests___Win32_Debug\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 1\n# PROP Output_Dir \"Debug\"\n# PROP Intermediate_Dir \"Debug\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /GZ /c\n# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I \"..\\include\" /I \"..\\win32\" /D \"WIN32\" /D \"_DEBUG\" /D \"LIBSSH2_WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /GZ /c\n# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\n# ADD RSC /l 0x409 /d \"_DEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\n# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libeay32.lib ssleay32.lib ws2_32.lib zlib.lib libssh2d.lib /nologo /subsystem:console /debug /machine:I386 /nodefaultlib:\"msvcrt.lib\" /pdbtype:sept /libpath:\"Debug\" /out:\"simple.exe\"\n\n!ENDIF \n\n# Begin Target\n\n# Name \"tests - Win32 Release\"\n# Name \"tests - Win32 Debug\"\n# Begin Group \"Source Files\"\n\n# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;idl;hpj;bat\"\n# Begin Source File\n\nSOURCE=..\\tests\\simple.c\n# End Source File\n# End Group\n# Begin Group \"Header Files\"\n\n# PROP Default_Filter \"h;hpp;hxx;hm;inl\"\n# End Group\n# Begin Group \"Resource Files\"\n\n# PROP Default_Filter \"ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe\"\n# End Group\n# End Target\n# End Project\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/CMakeLists.txt",
    "content": "project(QJson)\n\n# Automatically generate code for Qt moc, uic and rcc files\nset(CMAKE_AUTOMOC ON)\nset(CMAKE_AUTORCC ON)\nset(CMAKE_AUTOUIC ON)\n\nadd_library(qjson\n    sources/src/parser.cpp\n    sources/src/qobjecthelper.cpp\n    sources/src/json_scanner.cpp\n    sources/src/json_parser.cc\n    sources/src/parserrunnable.cpp\n    sources/src/serializer.cpp\n    sources/src/serializerrunnable.cpp)\n\ntarget_link_libraries(qjson PUBLIC Qt5::Core)\ntarget_include_directories(qjson PUBLIC sources/src)\ntarget_compile_definitions(qjson PUBLIC QJSON_STATIC)\n\nif (COMPILER_CLANG OR COMPILER_GCC)\n    # Project uses autogenerated code that have \"register\" variables\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wno-deprecated-register -Wno-register\")\nelseif(COMPILER_MSVC)\n    # Suppress \"warning C5033: 'register' is no longer a supported storage class\" from third-party\\qjson\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} /wd4065 /wd5033\")\nendif()"
  },
  {
    "path": "src/third-party/qjson-0.8.1/README.md",
    "content": "What is QJson\n=============\n\nQJson is a Qt-based library that maps JSON data to QVariant objects:\nhttps://github.com/flavio/qjson\n\nRobomongo statically links to this library.\n\nQJson sources are provided in `sources` folder as-is, in their original form, \nwithout modifications. We should *not* put or modify any files in this folder.\nAll changes to original QJson, if they are inevitable, should be documented here.\n\nCMake integration\n=================\n\nOriginal CMake listfiles are *not* used by Robomongo. Instead, we wrote our own \nCMakeLists.txt, located in this folder.\n\n\nHow to upgrade\n==============\n\nIn order to upgrade to newer version of QJson you should:\n\n1. Replace `sources` folder with newer version and \n2. Tweak `CMakeLists.txt` file, located in this folder.\n3. Make sure that Robomongo compiles and works \n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/.gitignore",
    "content": "lib\nMakefile\ndoc/html\nbuild\n*.user\n\n# -- kdevelop\n.kdev4\n*.kdev4\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/CMakeLists.txt",
    "content": "PROJECT(qjson)\n\nset( CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII\" )\n\n# Force cmake 2.8.8 in order to have a decent support of Qt5\nCMAKE_MINIMUM_REQUIRED(VERSION 2.8.8)\nCMAKE_POLICY(SET CMP0003 NEW)\n\n# Do not link against qtmain on Windows\nif(POLICY CMP0020)\n\tcmake_policy(SET CMP0020 OLD)\nendif()\n\nset(CMAKE_INSTALL_NAME_DIR ${LIB_INSTALL_DIR})\n\nIF(\"${CMAKE_BUILD_TYPE}\" MATCHES \"^Rel.*\")\n  ADD_DEFINITIONS(\"-DQT_NO_DEBUG_OUTPUT\")\nENDIF(\"${CMAKE_BUILD_TYPE}\" MATCHES \"^Rel.*\")\n\n# Ability to disable verbose debug output\nIF(QJSON_VERBOSE_DEBUG_OUTPUT)\n  ADD_DEFINITIONS(\"-DQJSON_VERBOSE_DEBUG_OUTPUT\")\nendif(QJSON_VERBOSE_DEBUG_OUTPUT)\n\n# On Windows debug library should have 'd' postfix.\nIF (WIN32)\n  SET(CMAKE_DEBUG_POSTFIX \"d\")\nelseif (APPLE)\n  set(CMAKE_DEBUG_POSTFIX \"_debug\")\nendif (WIN32)\n\n# BUILD_SHARED_LIBS is cmake variable. Need to change default value.\noption(BUILD_SHARED_LIBS \"Build shared library\" ON)\n\nOPTION(OSX_FRAMEWORK \"Build a Mac OS X Framework\")\nSET(FRAMEWORK_INSTALL_DIR \"${CMAKE_INSTALL_PREFIX}/Library/Frameworks\"\n    CACHE PATH \"Where to place qjson.framework if OSX_FRAMEWORK is selected\")\n\n# Don't use absolute path in qjson-targets-*.cmake\n# (This will have no effect with CMake < 2.8)\nSET(QT_USE_IMPORTED_TARGETS TRUE)\n\noption(QT4_BUILD \"Force building with Qt4 even if Qt5 is found\")\nIF (NOT QT4_BUILD)\n  FIND_PACKAGE( Qt5Core QUIET )\nENDIF()\n\nIF (Qt5Core_FOUND)\n  MESSAGE (\"Qt5 found\")\n\n  INCLUDE_DIRECTORIES(${Qt5Core_INCLUDE_DIRS})\n  ADD_DEFINITIONS(${Qt5Core_DEFINITIONS})\n  SET(PC_Requires \"Qt5Core\")\n  set(QJSON_SUFFIX \"-qt5\")\n  # Tell CMake to run moc when necessary:\n  set(CMAKE_AUTOMOC ON)\n  # As moc files are generated in the binary dir, tell CMake\n  # to always look for includes there:\n  set(CMAKE_INCLUDE_CURRENT_DIR ON)\nELSE()\n  MESSAGE (\"Qt5 not found, searching for Qt4\")\n  # Find Qt4\n  FIND_PACKAGE( Qt4 4.5 REQUIRED )\n\n  # Include the cmake file needed to use qt4\n  INCLUDE( ${QT_USE_FILE} )\n  SET(PC_Requires \"QtCore\")\nENDIF()\n\nIF (NOT WIN32)\n  SET( QT_DONT_USE_QTGUI TRUE )\nENDIF()\n\n\n#add extra search paths for libraries and includes\nSET (LIB_SUFFIX \"\" CACHE STRING \"Define suffix of directory name (32/64)\" )\nSET (LIB_INSTALL_DIR \"${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}\" CACHE STRING \"Directory where lib will install\")\nSET (INCLUDE_INSTALL_DIR \"${CMAKE_INSTALL_PREFIX}/include\" CACHE PATH \"The directory the headers are installed in\")\nSET (CMAKECONFIG_INSTALL_DIR \"${LIB_INSTALL_DIR}/cmake/${CMAKE_PROJECT_NAME}${QJSON_SUFFIX}\" CACHE PATH \"Directory where to install QJSONConfig.cmake\")\n\nset(QJSON_LIB_MAJOR_VERSION \"0\")\nset(QJSON_LIB_MINOR_VERSION \"8\")\nset(QJSON_LIB_PATCH_VERSION \"1\")\n\nset(QJSON_LIB_VERSION_STRING \"${QJSON_LIB_MAJOR_VERSION}.${QJSON_LIB_MINOR_VERSION}.${QJSON_LIB_PATCH_VERSION}\")\n\nset(CMAKE_LIBRARY_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/lib\" )\n\n# pkg-config\nIF (NOT WIN32)\n  CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/QJson.pc.in\n                  ${CMAKE_CURRENT_BINARY_DIR}/QJson${QJSON_SUFFIX}.pc\n                  @ONLY)\n  INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/QJson${QJSON_SUFFIX}.pc\n           DESTINATION ${LIB_INSTALL_DIR}/pkgconfig)\nENDIF (NOT WIN32)\n\n# Subdirs\nADD_SUBDIRECTORY(src)\nIF (KDE4_BUILD_TESTS OR QJSON_BUILD_TESTS)\n  enable_testing()\n  ADD_SUBDIRECTORY(tests)\nENDIF (KDE4_BUILD_TESTS OR QJSON_BUILD_TESTS)\n\nCONFIGURE_FILE(\n  \"${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in\"\n  \"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake\"\n  IMMEDIATE @ONLY)\n\nINSTALL(EXPORT qjson-export DESTINATION ${CMAKECONFIG_INSTALL_DIR} FILE QJSON${QJSON_SUFFIX}Targets.cmake)\n\n# figure out the relative path from the installed Config.cmake file to the install prefix (which may be at\n# runtime different from the chosen CMAKE_INSTALL_PREFIX if under Windows the package was installed anywhere)\n# This relative path will be configured into the QJSONConfig.cmake\nfile(RELATIVE_PATH relInstallDir ${CMAKE_INSTALL_PREFIX}/${CMAKECONFIG_INSTALL_DIR} ${CMAKE_INSTALL_PREFIX} )\n\n# cmake-modules\nCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/QJSONConfig.cmake.in\n               ${CMAKE_CURRENT_BINARY_DIR}/QJSON${QJSON_SUFFIX}Config.cmake\n               @ONLY)\nCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/QJSONConfigVersion.cmake.in\n               ${CMAKE_CURRENT_BINARY_DIR}/QJSON${QJSON_SUFFIX}ConfigVersion.cmake\n               @ONLY)\nINSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/QJSON${QJSON_SUFFIX}Config.cmake\n              ${CMAKE_CURRENT_BINARY_DIR}/QJSON${QJSON_SUFFIX}ConfigVersion.cmake\n        DESTINATION \"${CMAKECONFIG_INSTALL_DIR}\")\n\nADD_CUSTOM_TARGET(uninstall\n  \"${CMAKE_COMMAND}\" -P \"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake\")\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/ChangeLog",
    "content": "Mon Jan 28 23:01:40 CET 2013  Flavio Castelli <flavio@castelli.name>\n\n\t* Fix compilation on BlackBerry 10.\n\nTue Nov 27 11:04:12 CET 2012  Flavio Castelli <flavio@castelli.name>\n\n\t* Relase 0.8.1:\n\t\t- ensure API and ABI compatibility with 0.7.1\n\nThu Nov 22 21:20:11 CET 2012  Flavio Castelli <flavio@castelli.name>\n\n\t* Fix unsafe pointer usage in Serializer::serialize()\n\n----------------------------------------------------------------------\nWed Nov 21 22:01:51 CET 2012  Flavio Castelli <flavio@castelli.name>\n\n\t* Version 0.8.0 released\n\nTue Nov 20 11:19:49 CET 2012  Flavio Castelli <flavio@castelli.name>\n\n\t* Serializer: handle QVariantHash\n\nTue Oct 30 15:50:10 CET 2012  Flavio Castelli <flavio@castelli.name>\n\n\t* Improve error handling inside of Serializer \n\t* Serializer: handle quint16.\n\nTue Jan 31 10:15:06 CET 2012  Flavio Castelli <flavio@castelli.name>\n\n\t* Make possible to build qjson as an OS X framework.\n\nFri Nov 04 16:50:56 CET 2011  Flavio Castelli <flavio@castelli.name>\n\n\t* Make possible to set double precision during serialization.\n\nWed Aug 24 17:58:56 CEST 2011  Flavio Castelli <flavio@castelli.name>\n\n\t* Buildsystem adjustments, fix issues mentioned here:\n\t\t- http://lists.kde.org/?l=kde-buildsystem&m=130947194605100&w=3\n\t\t- http://lists.kde.org/?l=kde-buildsystem&m=128835747626464&w=3\n\t\tThe biggest difference now is that FindQJSON.cmake is not provided\n\t\tanymore. Instead, QJSONConfig.cmake and QJSONConfigVersion.cmake are\n\t\tinstalled and can be used in find_package(QJSON) calls. Applications\n\t\tusing QJson can write their own FindQJSON.cmake files if they need to.\n\nFri Apr 23:04:29 CEST 2011  Flavio Castelli <flavio@castelli.name>\n\n\t* Fixed QVariant de-serialization. QVariant properties were ignored\n\t  during QVariant -> QObject conversion.\n\nSun Dec 18:59:28 CET 2010  Flavio Castelli <flavio@castelli.name>\n\n\t* It's now possible to indent the output produced by the Serializer.\n\nMon Sep 06 18:53:02 CEST 2010  Flavio Castelli  <flavio@castelli.name>\n\n\t* 50% performance improvement when parsing numbers.\n\nSun Jul 04 15:41:08 CEST 2010  Flavio Castelli  <flavio@castelli.name>\n\n\t* fix make install when not installing as root\n\t* provide \"make uninstall\"\n\nTue Jun 15 13:16:57 CEST 2010  Flavio Castelli  <flavio@castelli.name>\n\n\t* Allow top level values\n\n----------------------------------------------------------------------\nSat Mar 13 23:57:00 CEST 2009 - flavio@castelli.name\n\n  * Merged the symbian branch into master,\n\n----------------------------------------------------------------------\nSun Oct 11 19:18:00 CEST 2009 - flavio@castelli.name\n\n * Updated to 0.6.3: fixed a bug affecting ulonglong numbers serialization.\n\n-------------------------------------------------------------------\nWed Sep 15 19:21:00 CEST 2009 - flavio@castelli.name\n\n * Updated to 0.6.2: fixed a bug affecting ulonglong numbers parsing.\n\n-------------------------------------------------------------------\nWed Sep 09 09:55:00 CEST 2009 - flavio@castelli.name\n\n * Updated to 0.6.1: relevant bugs fixed.\n * Moved the SerializerRunnable class inside QJson namespace.\n * Fixed a bug in cmdline_tester.\n\n-------------------------------------------------------------------\nMon Jul 20 15:24:32 CEST 2009 - prusnak@suse.cz\n\n * Updated to 0.6.0 (KDE SVN rev 999750).\n\n-------------------------------------------------------------------\nMon Apr 07 00:00:00 UTC 2009 - flavio@castelli.name\n\n * Released 0.5.1 - added unicode support.\n\n-------------------------------------------------------------------\nMon Apr 03 00:00:00 UTC 2009 - flavio@castelli.name\n\n * First release.\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/QJSONConfig.cmake.in",
    "content": "GET_FILENAME_COMPONENT(myDir ${CMAKE_CURRENT_LIST_FILE} PATH)\n\nSET(QJSON_LIBRARIES qjson)\nSET(QJSON_INCLUDE_DIR \"@INCLUDE_INSTALL_DIR@\")\n\ninclude(${myDir}/QJSON@QJSON_SUFFIX@Targets.cmake)\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/QJSONConfigVersion.cmake.in",
    "content": "SET(PACKAGE_VERSION \"@QJSON_LIB_VERSION_STRING@\")\nIF (PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION)\n  SET(PACKAGE_VERSION_EXACT TRUE)\nENDIF (PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION)\nIF (NOT PACKAGE_FIND_VERSION VERSION_GREATER PACKAGE_VERSION)\n  SET(PACKAGE_VERSION_COMPATIBLE TRUE)\nELSE (NOT PACKAGE_FIND_VERSION VERSION_GREATER PACKAGE_VERSION)\n  SET(PACKAGE_VERSION_UNSUITABLE TRUE)\nENDIF (NOT PACKAGE_FIND_VERSION VERSION_GREATER PACKAGE_VERSION)\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/QJson.pc.in",
    "content": "prefix=@CMAKE_INSTALL_PREFIX@\nexec_prefix=${prefix}\nlibdir=@LIB_INSTALL_DIR@\nincludedir=@INCLUDE_INSTALL_DIR@\n\nName: QJson\nDescription: QJson is a qt-based library that maps JSON data to QVariant objects\nVersion: @QJSON_LIB_MAJOR_VERSION@.@QJSON_LIB_MINOR_VERSION@.@QJSON_LIB_PATCH_VERSION@\nRequires: @PC_Requires@\nLibs: -L${libdir} -lqjson\nCflags: -I${includedir}"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/README.license",
    "content": "Qjson version xxxx, Date\n \nThe following files are licensed under LGPL V2.1:\n------------------------------------------------\nsrc/json_parser.yy\nsrc/json_scanner.cpp\nsrc/json_scanner.h\nsrc/parser.cpp\nsrc/parser.h\nsrc/parser_p.h\nsrc/parserrunnable.cpp\nsrc/parserrunnable.h\nsrc/qjson_debug.h\nsrc/qjson_export.h\nsrc/qobjecthelper.cpp\nsrc/serializer.cpp\nsrc/qobjecthelper.h\nsrc/serializer.h\nsrc/serializerrunnable.cpp\nsrc/serializerrunnable.h\ntests/cmdline_tester/cmdline_tester.cpp\ntests/cmdline_tester/cmdlineparser.cpp\ntests/cmdline_tester/cmdlineparser.h\ntests/parser/testparser.cpp\ntests/qobjecthelper/person.h\ntests/qobjecthelper/testqobjecthelper.cpp\ntests/serializer/testserializer.cpp\n\n \nThe following files are licensed under GPL V2  with Bison Exception:\n--------------------------------------------------------------------\n/src/json_parser.cc\n/src/stack.hh\n/src/location.hh\n/src/position.hh\n/src/json_parser.hh\n \n \nCopyrights:\n----------\nCopyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.\nCopyright (C) 2009 Flavio Castelli <flavio@castelli.name> 2009 Frank Osterfeld <osterfeld@kde.org>\nCopyright (C) 2008 Flavio Castelli <flavio.castelli@gmail.com>\nCopyright (C) 2009 Till Adam <adam@kde.org>\nCopyright (C) 2009 Michael Leupold <lemma@confuego.org>\nCopyright (C) 2009 Flavio Castelli <flavio@castelli.name>\nCopyright (C) 2009 Frank Osterfeld <osterfeld@kde.org>\nCopyright (C) 2009 Pino Toscano <pino@kde.org>\nCopyright (C) 2010 Flavio Castelli <flavio@castelli.name>\n \n \nGNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999:\n-------------------------------------------------------------\n\nCheckout COPYING.lib\n \n \nGPL V2 with Bison Exception:\n----------------------------\nCopyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.\n\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 2, or (at your option)\nany later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; if not, write to the Free Software\nFoundation, Inc., 51 Franklin Street, Fifth Floor,\nBoston, MA 02110-1301, USA.\n\nAs a special exception, you may create a larger work that contains\npart or all of the Bison parser skeleton and distribute that work\nunder terms of your choice, so long as that work isn't itself a\nparser generator using the skeleton or a modified version thereof\nas a parser skeleton.  Alternatively, if you modify or redistribute\nthe parser skeleton itself, you may (at your option) remove this\nspecial exception, which will cause the skeleton and the resulting\nBison output files to be licensed under the GNU General Public\nLicense without this special exception.\n\nThis special exception was added by the Free Software Foundation in\nversion 2.2 of Bison.\n\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/README.md",
    "content": "# QJson\nJSON (JavaScript Object Notation) is a lightweight data-interchange format.\nIt can represents integer, real number, string, an ordered sequence of value, and a collection of name/value pairs.\n\nQJson is a qt-based library that maps JSON data to QVariant objects.\nJSON arrays will be mapped to QVariantList instances, while JSON's objects will be mapped to QVariantMap.\n\n# Install\n\nQJson requires:\n  - Qt 4.5 or greater\n  - cmake 2.6 or greater\n\nSome possible cmake options:\n  - `-DCMAKE_BUILD_TYPE=DEBUG`: enables some debug output (other than making\n     easier to debug the code)\n  - `-DQJSON_BUILD_TESTS=yes` or `-DKDE4_BUILD_TESTS=yes`: builds the unit tests\n  - `-DCMAKE_INSTALL_PREFIX=${HOME}/testinstall`: install qjson in a custom directory\n  - `-DCMAKE_INCLUDE_PATH=${HOME}/testinstall/include`: include a custom include directory\n  - `-DCMAKE_LIBRARY_PATH=${HOME}/testinstall/lib`: include a custom library directory\n  - `-DLIB_DESTINATION=lib64`: if you have a 64 bit system with separate\n     libraries for 64 bit libraries\n  - `-DQJSON_VERBOSE_DEBUG_OUTPUT:BOOL=ON`: more debugging statements are\n     generated by the parser. It's useful only if you are trying to fix\n     the bison grammar.\n\nFor Unix/Linux/Mac:\n\n    mkdir build\n    cd build\n    cmake -DCMAKE_INSTALL_PREFIX=_preferred_path_ ..\n    make\n    make install\n    /sbin/ldconfig #if necessary\n\n# License\n  This library is licensed under the Lesser GNU General Public License version 2.1.\n  See the COPYING.lib file for more information.\n\n# Resources\n\n* [Website](http://qjson.sourceforge.net/)\n* [Mailing List](https://lists.sourceforge.net/mailman/listinfo/qjson-devel)\n* Project Lead/Maintainer (2008-current): [Flavio Castelli](mailto:flavio@castelli.name).\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/cmake_uninstall.cmake.in",
    "content": "IF(NOT EXISTS \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\")\n  MESSAGE(FATAL_ERROR \"Cannot find install manifest: \\\"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\\\"\")\nENDIF(NOT EXISTS \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\")\n\nFILE(READ \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\" files)\nSTRING(REGEX REPLACE \"\\n\" \";\" files \"${files}\")\nFOREACH(file ${files})\n  MESSAGE(STATUS \"Uninstalling \\\"$ENV{DESTDIR}${file}\\\"\")\n  EXEC_PROGRAM(\n  \"@CMAKE_COMMAND@\" ARGS \"-E remove \\\"$ENV{DESTDIR}${file}\\\"\"\n  OUTPUT_VARIABLE rm_out\n  RETURN_VALUE rm_retval\n  )\n  IF(NOT \"${rm_retval}\" STREQUAL 0)\n  MESSAGE(FATAL_ERROR \"Problem when removing \\\"$ENV{DESTDIR}${file}\\\"\")\n  ENDIF(NOT \"${rm_retval}\" STREQUAL 0)\nENDFOREACH(file)\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/doc/Doxyfile",
    "content": "# Doxyfile 1.8.1\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project.\n#\n# All text after a hash (#) is considered a comment and will be ignored.\n# The format is:\n#       TAG = value [value, ...]\n# For lists items can also be appended using:\n#       TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\" \").\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the config file\n# that follow. The default is UTF-8 which is also the encoding used for all\n# text before the first occurrence of this tag. Doxygen uses libiconv (or the\n# iconv built into libc) for the transcoding. See\n# http://www.gnu.org/software/libiconv for the list of possible encodings.\n\nDOXYFILE_ENCODING      = UTF-8\n\n# The PROJECT_NAME tag is a single word (or sequence of words) that should\n# identify the project. Note that if you do not use Doxywizard you need\n# to put quotes around the project name if it contains spaces.\n\nPROJECT_NAME           = QJson\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number.\n# This could be handy for archiving the generated documentation or\n# if some version control system is used.\n\nPROJECT_NUMBER         = 0.8.1\n\n# Using the PROJECT_BRIEF tag one can provide an optional one line description\n# for a project that appears at the top of each page and should give viewer\n# a quick idea about the purpose of the project. Keep the description short.\n\nPROJECT_BRIEF          = the easiest way to manage JSON objects with Qt\n\n# With the PROJECT_LOGO tag one can specify an logo or icon that is\n# included in the documentation. The maximum height of the logo should not\n# exceed 55 pixels and the maximum width should not exceed 200 pixels.\n# Doxygen will copy the logo to the output directory.\n\nPROJECT_LOGO           =\n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)\n# base path where the generated documentation will be put.\n# If a relative path is entered, it will be relative to the location\n# where doxygen was started. If left blank the current directory will be used.\n\nOUTPUT_DIRECTORY       = ./\n\n# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create\n# 4096 sub-directories (in 2 levels) under the output directory of each output\n# format and will distribute the generated files over these directories.\n# Enabling this option can be useful when feeding doxygen a huge amount of\n# source files, where putting all generated files in the same directory would\n# otherwise cause performance problems for the file system.\n\nCREATE_SUBDIRS         = NO\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all constant output in the proper language.\n# The default language is English, other supported languages are:\n# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,\n# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,\n# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English\n# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,\n# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,\n# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.\n\nOUTPUT_LANGUAGE        = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will\n# include brief member descriptions after the members that are listed in\n# the file and class documentation (similar to JavaDoc).\n# Set to NO to disable this.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend\n# the brief description of a member or function before the detailed description.\n# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n# brief descriptions will be completely suppressed.\n\nREPEAT_BRIEF           = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator\n# that is used to form the text in various listings. Each string\n# in this list, if found as the leading text of the brief description, will be\n# stripped from the text and the result after processing the whole list, is\n# used as the annotated text. Otherwise, the brief description is used as-is.\n# If left blank, the following values are used (\"$name\" is automatically\n# replaced with the name of the entity): \"The $name class\" \"The $name widget\"\n# \"The $name file\" \"is\" \"provides\" \"specifies\" \"contains\"\n# \"represents\" \"a\" \"an\" \"the\"\n\nABBREVIATE_BRIEF       = \"The $name class\" \\\n                         \"The $name widget\" \\\n                         \"The $name file\" \\\n                         is \\\n                         provides \\\n                         specifies \\\n                         contains \\\n                         represents \\\n                         a \\\n                         an \\\n                         the\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n# Doxygen will generate a detailed section even if there is only a brief\n# description.\n\nALWAYS_DETAILED_SEC    = NO\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n# inherited members of a class in the documentation of that class as if those\n# members were ordinary class members. Constructors, destructors and assignment\n# operators of the base classes will not be shown.\n\nINLINE_INHERITED_MEMB  = NO\n\n# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full\n# path before files name in the file list and in the header files. If set\n# to NO the shortest path that makes the file name unique will be used.\n\nFULL_PATH_NAMES        = YES\n\n# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag\n# can be used to strip a user-defined part of the path. Stripping is\n# only done if one of the specified strings matches the left-hand part of\n# the path. The tag can be used to show relative paths in the file list.\n# If left blank the directory from which doxygen is run is used as the\n# path to strip.\n\nSTRIP_FROM_PATH        =\n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of\n# the path mentioned in the documentation of a class, which tells\n# the reader which header file to include in order to use a class.\n# If left blank only the name of the header file containing the class\n# definition is used. Otherwise one should specify the include paths that\n# are normally passed to the compiler using the -I flag.\n\nSTRIP_FROM_INC_PATH    =\n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter\n# (but less readable) file names. This can be useful if your file system\n# doesn't support long names like on DOS, Mac, or CD-ROM.\n\nSHORT_NAMES            = NO\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen\n# will interpret the first line (until the first dot) of a JavaDoc-style\n# comment as the brief description. If set to NO, the JavaDoc\n# comments will behave just like regular Qt-style comments\n# (thus requiring an explicit @brief command for a brief description.)\n\nJAVADOC_AUTOBRIEF      = NO\n\n# If the QT_AUTOBRIEF tag is set to YES then Doxygen will\n# interpret the first line (until the first dot) of a Qt-style\n# comment as the brief description. If set to NO, the comments\n# will behave just like regular Qt-style comments (thus requiring\n# an explicit \\brief command for a brief description.)\n\nQT_AUTOBRIEF           = NO\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen\n# treat a multi-line C++ special comment block (i.e. a block of //! or ///\n# comments) as a brief description. This used to be the default behaviour.\n# The new default is to treat a multi-line C++ comment block as a detailed\n# description. Set this tag to YES if you prefer the old behaviour instead.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented\n# member inherits the documentation from any documented member that it\n# re-implements.\n\nINHERIT_DOCS           = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce\n# a new page for each member. If set to NO, the documentation of a member will\n# be part of the file/class/namespace that contains it.\n\nSEPARATE_MEMBER_PAGES  = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab.\n# Doxygen uses this value to replace tabs by spaces in code fragments.\n\nTAB_SIZE               = 8\n\n# This tag can be used to specify a number of aliases that acts\n# as commands in the documentation. An alias has the form \"name=value\".\n# For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to\n# put the command \\sideeffect (or @sideeffect) in the documentation, which\n# will result in a user-defined paragraph with heading \"Side Effects:\".\n# You can put \\n's in the value part of an alias to insert newlines.\n\nALIASES                =\n\n# This tag can be used to specify a number of word-keyword mappings (TCL only).\n# A mapping has the form \"name=value\". For example adding\n# \"class=itcl::class\" will allow you to use the command class in the\n# itcl::class meaning.\n\nTCL_SUBST              =\n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C\n# sources only. Doxygen will then generate output that is more tailored for C.\n# For instance, some of the names that are used will be different. The list\n# of all members will be omitted, etc.\n\nOPTIMIZE_OUTPUT_FOR_C  = NO\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java\n# sources only. Doxygen will then generate output that is more tailored for\n# Java. For instance, namespaces will be presented as packages, qualified\n# scopes will look different, etc.\n\nOPTIMIZE_OUTPUT_JAVA   = NO\n\n# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n# sources only. Doxygen will then generate output that is more tailored for\n# Fortran.\n\nOPTIMIZE_FOR_FORTRAN   = NO\n\n# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n# sources. Doxygen will then generate output that is tailored for\n# VHDL.\n\nOPTIMIZE_OUTPUT_VHDL   = NO\n\n# Doxygen selects the parser to use depending on the extension of the files it\n# parses. With this tag you can assign which parser to use for a given extension.\n# Doxygen has a built-in mapping, but you can override or extend it using this\n# tag. The format is ext=language, where ext is a file extension, and language\n# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,\n# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make\n# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C\n# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions\n# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.\n\nEXTENSION_MAPPING      =\n\n# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all\n# comments according to the Markdown format, which allows for more readable\n# documentation. See http://daringfireball.net/projects/markdown/ for details.\n# The output of markdown processing is further processed by doxygen, so you\n# can mix doxygen, HTML, and XML commands with Markdown formatting.\n# Disable only in case of backward compatibilities issues.\n\nMARKDOWN_SUPPORT       = YES\n\n# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\n# to include (a tag file for) the STL sources as input, then you should\n# set this tag to YES in order to let doxygen match functions declarations and\n# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.\n# func(std::string) {}). This also makes the inheritance and collaboration\n# diagrams that involve STL classes more complete and accurate.\n\nBUILTIN_STL_SUPPORT    = NO\n\n# If you use Microsoft's C++/CLI language, you should set this option to YES to\n# enable parsing support.\n\nCPP_CLI_SUPPORT        = NO\n\n# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.\n# Doxygen will parse them like normal C++ but will assume all classes use public\n# instead of private inheritance when no explicit protection keyword is present.\n\nSIP_SUPPORT            = NO\n\n# For Microsoft's IDL there are propget and propput attributes to indicate getter\n# and setter methods for a property. Setting this option to YES (the default)\n# will make doxygen replace the get and set methods by a property in the\n# documentation. This will only work if the methods are indeed getting or\n# setting a simple type. If this is not the case, or you want to show the\n# methods anyway, you should set this option to NO.\n\nIDL_PROPERTY_SUPPORT   = YES\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n# tag is set to YES, then doxygen will reuse the documentation of the first\n# member in the group (if any) for the other members of the group. By default\n# all members of a group must be documented explicitly.\n\nDISTRIBUTE_GROUP_DOC   = NO\n\n# Set the SUBGROUPING tag to YES (the default) to allow class member groups of\n# the same type (for instance a group of public functions) to be put as a\n# subgroup of that type (e.g. under the Public Functions section). Set it to\n# NO to prevent subgrouping. Alternatively, this can be done per class using\n# the \\nosubgrouping command.\n\nSUBGROUPING            = YES\n\n# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and\n# unions are shown inside the group in which they are included (e.g. using\n# @ingroup) instead of on a separate page (for HTML and Man pages) or\n# section (for LaTeX and RTF).\n\nINLINE_GROUPED_CLASSES = NO\n\n# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and\n# unions with only public data fields will be shown inline in the documentation\n# of the scope in which they are defined (i.e. file, namespace, or group\n# documentation), provided this scope is documented. If set to NO (the default),\n# structs, classes, and unions are shown on a separate page (for HTML and Man\n# pages) or section (for LaTeX and RTF).\n\nINLINE_SIMPLE_STRUCTS  = NO\n\n# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum\n# is documented as struct, union, or enum with the name of the typedef. So\n# typedef struct TypeS {} TypeT, will appear in the documentation as a struct\n# with name TypeT. When disabled the typedef will appear as a member of a file,\n# namespace, or class. And the struct will be named TypeS. This can typically\n# be useful for C code in case the coding convention dictates that all compound\n# types are typedef'ed and only the typedef is referenced, never the tag name.\n\nTYPEDEF_HIDES_STRUCT   = NO\n\n# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to\n# determine which symbols to keep in memory and which to flush to disk.\n# When the cache is full, less often used symbols will be written to disk.\n# For small to medium size projects (<1000 input files) the default value is\n# probably good enough. For larger projects a too small cache size can cause\n# doxygen to be busy swapping symbols to and from disk most of the time\n# causing a significant performance penalty.\n# If the system has enough physical memory increasing the cache will improve the\n# performance by keeping more symbols in memory. Note that the value works on\n# a logarithmic scale so increasing the size by one will roughly double the\n# memory usage. The cache size is given by this formula:\n# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,\n# corresponding to a cache size of 2^16 = 65536 symbols.\n\nSYMBOL_CACHE_SIZE      = 0\n\n# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be\n# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given\n# their name and scope. Since this can be an expensive process and often the\n# same symbol appear multiple times in the code, doxygen keeps a cache of\n# pre-resolved symbols. If the cache is too small doxygen will become slower.\n# If the cache is too large, memory is wasted. The cache size is given by this\n# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,\n# corresponding to a cache size of 2^16 = 65536 symbols.\n\nLOOKUP_CACHE_SIZE      = 0\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in\n# documentation are documented, even if no documentation was available.\n# Private class members and static file members will be hidden unless\n# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES\n\nEXTRACT_ALL            = NO\n\n# If the EXTRACT_PRIVATE tag is set to YES all private members of a class\n# will be included in the documentation.\n\nEXTRACT_PRIVATE        = NO\n\n# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation.\n\nEXTRACT_PACKAGE        = NO\n\n# If the EXTRACT_STATIC tag is set to YES all static members of a file\n# will be included in the documentation.\n\nEXTRACT_STATIC         = NO\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)\n# defined locally in source files will be included in the documentation.\n# If set to NO only classes defined in header files are included.\n\nEXTRACT_LOCAL_CLASSES  = YES\n\n# This flag is only useful for Objective-C code. When set to YES local\n# methods, which are defined in the implementation section but not in\n# the interface are included in the documentation.\n# If set to NO (the default) only methods in the interface are included.\n\nEXTRACT_LOCAL_METHODS  = NO\n\n# If this flag is set to YES, the members of anonymous namespaces will be\n# extracted and appear in the documentation as a namespace called\n# 'anonymous_namespace{file}', where file will be replaced with the base\n# name of the file that contains the anonymous namespace. By default\n# anonymous namespaces are hidden.\n\nEXTRACT_ANON_NSPACES   = NO\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all\n# undocumented members of documented classes, files or namespaces.\n# If set to NO (the default) these members will be included in the\n# various overviews, but no documentation section is generated.\n# This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_MEMBERS     = YES\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all\n# undocumented classes that are normally visible in the class hierarchy.\n# If set to NO (the default) these classes will be included in the various\n# overviews. This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_CLASSES     = YES\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all\n# friend (class|struct|union) declarations.\n# If set to NO (the default) these declarations will be included in the\n# documentation.\n\nHIDE_FRIEND_COMPOUNDS  = NO\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any\n# documentation blocks found inside the body of a function.\n# If set to NO (the default) these blocks will be appended to the\n# function's detailed documentation block.\n\nHIDE_IN_BODY_DOCS      = NO\n\n# The INTERNAL_DOCS tag determines if documentation\n# that is typed after a \\internal command is included. If the tag is set\n# to NO (the default) then the documentation will be excluded.\n# Set it to YES to include the internal documentation.\n\nINTERNAL_DOCS          = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate\n# file names in lower-case letters. If set to YES upper-case letters are also\n# allowed. This is useful if you have classes or files whose names only differ\n# in case and if your file system supports case sensitive file names. Windows\n# and Mac users are advised to set this option to NO.\n\nCASE_SENSE_NAMES       = YES\n\n# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen\n# will show members with their full class and namespace scopes in the\n# documentation. If set to YES the scope will be hidden.\n\nHIDE_SCOPE_NAMES       = NO\n\n# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen\n# will put a list of the files that are included by a file in the documentation\n# of that file.\n\nSHOW_INCLUDE_FILES     = YES\n\n# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen\n# will list include files with double quotes in the documentation\n# rather than with sharp brackets.\n\nFORCE_LOCAL_INCLUDES   = NO\n\n# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]\n# is inserted in the documentation for inline members.\n\nINLINE_INFO            = YES\n\n# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen\n# will sort the (detailed) documentation of file and class members\n# alphabetically by member name. If set to NO the members will appear in\n# declaration order.\n\nSORT_MEMBER_DOCS       = YES\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the\n# brief documentation of file, namespace and class members alphabetically\n# by member name. If set to NO (the default) the members will appear in\n# declaration order.\n\nSORT_BRIEF_DOCS        = NO\n\n# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen\n# will sort the (brief and detailed) documentation of class members so that\n# constructors and destructors are listed first. If set to NO (the default)\n# the constructors will appear in the respective orders defined by\n# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.\n# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO\n# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.\n\nSORT_MEMBERS_CTORS_1ST = NO\n\n# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the\n# hierarchy of group names into alphabetical order. If set to NO (the default)\n# the group names will appear in their defined order.\n\nSORT_GROUP_NAMES       = NO\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be\n# sorted by fully-qualified names, including namespaces. If set to\n# NO (the default), the class list will be sorted only by class name,\n# not including the namespace part.\n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the\n# alphabetical list.\n\nSORT_BY_SCOPE_NAME     = NO\n\n# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to\n# do proper type resolution of all parameters of a function it will reject a\n# match between the prototype and the implementation of a member function even\n# if there is only one candidate or it is obvious which candidate to choose\n# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen\n# will still accept a match between prototype and implementation in such cases.\n\nSTRICT_PROTO_MATCHING  = NO\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or\n# disable (NO) the todo list. This list is created by putting \\todo\n# commands in the documentation.\n\nGENERATE_TODOLIST      = YES\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or\n# disable (NO) the test list. This list is created by putting \\test\n# commands in the documentation.\n\nGENERATE_TESTLIST      = YES\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or\n# disable (NO) the bug list. This list is created by putting \\bug\n# commands in the documentation.\n\nGENERATE_BUGLIST       = YES\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or\n# disable (NO) the deprecated list. This list is created by putting\n# \\deprecated commands in the documentation.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional\n# documentation sections, marked by \\if sectionname ... \\endif.\n\nENABLED_SECTIONS       =\n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines\n# the initial value of a variable or macro consists of for it to appear in\n# the documentation. If the initializer consists of more lines than specified\n# here it will be hidden. Use a value of 0 to hide initializers completely.\n# The appearance of the initializer of individual variables and macros in the\n# documentation can be controlled using \\showinitializer or \\hideinitializer\n# command in the documentation regardless of this setting.\n\nMAX_INITIALIZER_LINES  = 30\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated\n# at the bottom of the documentation of classes and structs. If set to YES the\n# list will mention the files that were used to generate the documentation.\n\nSHOW_USED_FILES        = YES\n\n# Set the SHOW_FILES tag to NO to disable the generation of the Files page.\n# This will remove the Files entry from the Quick Index and from the\n# Folder Tree View (if specified). The default is YES.\n\nSHOW_FILES             = YES\n\n# Set the SHOW_NAMESPACES tag to NO to disable the generation of the\n# Namespaces page.\n# This will remove the Namespaces entry from the Quick Index\n# and from the Folder Tree View (if specified). The default is YES.\n\nSHOW_NAMESPACES        = YES\n\n# The FILE_VERSION_FILTER tag can be used to specify a program or script that\n# doxygen should invoke to get the current version for each file (typically from\n# the version control system). Doxygen will invoke the program by executing (via\n# popen()) the command <command> <input-file>, where <command> is the value of\n# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file\n# provided by doxygen. Whatever the program writes to standard output\n# is used as the file version. See the manual for examples.\n\nFILE_VERSION_FILTER    =\n\n# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\n# by doxygen. The layout file controls the global structure of the generated\n# output files in an output format independent way. The create the layout file\n# that represents doxygen's defaults, run doxygen with the -l option.\n# You can optionally specify a file name after the option, if omitted\n# DoxygenLayout.xml will be used as the name of the layout file.\n\nLAYOUT_FILE            =\n\n# The CITE_BIB_FILES tag can be used to specify one or more bib files\n# containing the references data. This must be a list of .bib files. The\n# .bib extension is automatically appended if omitted. Using this command\n# requires the bibtex tool to be installed. See also\n# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style\n# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this\n# feature you need bibtex and perl available in the search path.\n\nCITE_BIB_FILES         =\n\n#---------------------------------------------------------------------------\n# configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated\n# by doxygen. Possible values are YES and NO. If left blank NO is used.\n\nQUIET                  = NO\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are\n# generated by doxygen. Possible values are YES and NO. If left blank\n# NO is used.\n\nWARNINGS               = YES\n\n# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings\n# for undocumented members. If EXTRACT_ALL is set to YES then this flag will\n# automatically be disabled.\n\nWARN_IF_UNDOCUMENTED   = YES\n\n# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for\n# potential errors in the documentation, such as not documenting some\n# parameters in a documented function, or documenting parameters that\n# don't exist or using markup commands wrongly.\n\nWARN_IF_DOC_ERROR      = YES\n\n# The WARN_NO_PARAMDOC option can be enabled to get warnings for\n# functions that are documented, but have no documentation for their parameters\n# or return value. If set to NO (the default) doxygen will only warn about\n# wrong or incomplete parameter documentation, but not about the absence of\n# documentation.\n\nWARN_NO_PARAMDOC       = NO\n\n# The WARN_FORMAT tag determines the format of the warning messages that\n# doxygen can produce. The string should contain the $file, $line, and $text\n# tags, which will be replaced by the file and line number from which the\n# warning originated and the warning text. Optionally the format may contain\n# $version, which will be replaced by the version of the file (if it could\n# be obtained via FILE_VERSION_FILTER)\n\nWARN_FORMAT            = \"$file:$line: $text\"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning\n# and error messages should be written. If left blank the output is written\n# to stderr.\n\nWARN_LOGFILE           =\n\n#---------------------------------------------------------------------------\n# configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag can be used to specify the files and/or directories that contain\n# documented source files. You may enter file names like \"myfile.cpp\" or\n# directories like \"/usr/src/myproject\". Separate the files or directories\n# with spaces.\n\nINPUT                  = ./qjson.dox \\\n                         ../src\n\n# This tag can be used to specify the character encoding of the source files\n# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is\n# also the default input encoding. Doxygen uses libiconv (or the iconv built\n# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for\n# the list of possible encodings.\n\nINPUT_ENCODING         = UTF-8\n\n# If the value of the INPUT tag contains directories, you can use the\n# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank the following patterns are tested:\n# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh\n# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py\n# *.f90 *.f *.for *.vhd *.vhdl\n\nFILE_PATTERNS          = *.c \\\n                         *.cc \\\n                         *.cxx \\\n                         *.cpp \\\n                         *.c++ \\\n                         *.d \\\n                         *.java \\\n                         *.ii \\\n                         *.ixx \\\n                         *.ipp \\\n                         *.i++ \\\n                         *.inl \\\n                         *.h \\\n                         *.hh \\\n                         *.hxx \\\n                         *.hpp \\\n                         *.h++ \\\n                         *.idl \\\n                         *.odl \\\n                         *.cs \\\n                         *.php \\\n                         *.php3 \\\n                         *.inc \\\n                         *.m \\\n                         *.mm \\\n                         *.dox \\\n                         *.py \\\n                         *.f90 \\\n                         *.f \\\n                         *.vhd \\\n                         *.vhdl \\\n                         *.C \\\n                         *.CC \\\n                         *.C++ \\\n                         *.II \\\n                         *.I++ \\\n                         *.H \\\n                         *.HH \\\n                         *.H++ \\\n                         *.CS \\\n                         *.PHP \\\n                         *.PHP3 \\\n                         *.M \\\n                         *.MM \\\n                         *.PY \\\n                         *.F90 \\\n                         *.F \\\n                         *.VHD \\\n                         *.VHDL\n\n# The RECURSIVE tag can be used to turn specify whether or not subdirectories\n# should be searched for input files as well. Possible values are YES and NO.\n# If left blank NO is used.\n\nRECURSIVE              = YES\n\n# The EXCLUDE tag can be used to specify files and/or directories that should be\n# excluded from the INPUT source files. This way you can easily exclude a\n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n# Note that relative paths are relative to the directory from which doxygen is\n# run.\n\nEXCLUDE                =\n\n# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or\n# directories that are symbolic links (a Unix file system feature) are excluded\n# from the input.\n\nEXCLUDE_SYMLINKS       = NO\n\n# If the value of the INPUT tag contains directories, you can use the\n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n# certain files from those directories. Note that the wildcards are matched\n# against the file with absolute path, so to exclude all test directories\n# for example use the pattern */test/*\n\nEXCLUDE_PATTERNS       =\n\n# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\n# (namespaces, classes, functions, etc.) that should be excluded from the\n# output. The symbol name can be a fully qualified name, a word, or if the\n# wildcard * is used, a substring. Examples: ANamespace, AClass,\n# AClass::ANamespace, ANamespace::*Test\n\nEXCLUDE_SYMBOLS        =\n\n# The EXAMPLE_PATH tag can be used to specify one or more files or\n# directories that contain example code fragments that are included (see\n# the \\include command).\n\nEXAMPLE_PATH           =\n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank all files are included.\n\nEXAMPLE_PATTERNS       = *\n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\n# searched for input files to be used with the \\include or \\dontinclude\n# commands irrespective of the value of the RECURSIVE tag.\n# Possible values are YES and NO. If left blank NO is used.\n\nEXAMPLE_RECURSIVE      = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or\n# directories that contain image that are included in the documentation (see\n# the \\image command).\n\nIMAGE_PATH             =\n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should\n# invoke to filter for each input file. Doxygen will invoke the filter program\n# by executing (via popen()) the command <filter> <input-file>, where <filter>\n# is the value of the INPUT_FILTER tag, and <input-file> is the name of an\n# input file. Doxygen will then use the output that the filter program writes\n# to standard output.\n# If FILTER_PATTERNS is specified, this tag will be\n# ignored.\n\nINPUT_FILTER           =\n\n# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\n# basis.\n# Doxygen will compare the file name with each pattern and apply the\n# filter if there is a match.\n# The filters are a list of the form:\n# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further\n# info on how filters are used. If FILTER_PATTERNS is empty or if\n# non of the patterns match the file name, INPUT_FILTER is applied.\n\nFILTER_PATTERNS        =\n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n# INPUT_FILTER) will be used to filter the input files when producing source\n# files to browse (i.e. when SOURCE_BROWSER is set to YES).\n\nFILTER_SOURCE_FILES    = NO\n\n# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n# pattern. A pattern will override the setting for FILTER_PATTERN (if any)\n# and it is also possible to disable source filtering for a specific pattern\n# using *.ext= (so without naming a filter). This option only has effect when\n# FILTER_SOURCE_FILES is enabled.\n\nFILTER_SOURCE_PATTERNS =\n\n#---------------------------------------------------------------------------\n# configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will\n# be generated. Documented entities will be cross-referenced with these sources.\n# Note: To get rid of all source code in the generated output, make sure also\n# VERBATIM_HEADERS is set to NO.\n\nSOURCE_BROWSER         = YES\n\n# Setting the INLINE_SOURCES tag to YES will include the body\n# of functions and classes directly in the documentation.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct\n# doxygen to hide any special comment blocks from generated source code\n# fragments. Normal C and C++ comments will always remain visible.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES\n# then for each documented function all documented\n# functions referencing it will be listed.\n\nREFERENCED_BY_RELATION = YES\n\n# If the REFERENCES_RELATION tag is set to YES\n# then for each documented function all documented entities\n# called/used by that function will be listed.\n\nREFERENCES_RELATION    = YES\n\n# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)\n# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from\n# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will\n# link to the source code.\n# Otherwise they will link to the documentation.\n\nREFERENCES_LINK_SOURCE = YES\n\n# If the USE_HTAGS tag is set to YES then the references to source code\n# will point to the HTML generated by the htags(1) tool instead of doxygen\n# built-in source browser. The htags tool is part of GNU's global source\n# tagging system (see http://www.gnu.org/software/global/global.html). You\n# will need version 4.8.6 or higher.\n\nUSE_HTAGS              = NO\n\n# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen\n# will generate a verbatim copy of the header file for each class for\n# which an include is specified. Set to NO to disable this.\n\nVERBATIM_HEADERS       = YES\n\n#---------------------------------------------------------------------------\n# configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index\n# of all compounds will be generated. Enable this if the project\n# contains a lot of classes, structs, unions or interfaces.\n\nALPHABETICAL_INDEX     = NO\n\n# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then\n# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns\n# in which this list will be split (can be a number in the range [1..20])\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all\n# classes will be put under the same header in the alphabetical index.\n# The IGNORE_PREFIX tag can be used to specify one or more prefixes that\n# should be ignored while generating the index headers.\n\nIGNORE_PREFIX          =\n\n#---------------------------------------------------------------------------\n# configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES (the default) Doxygen will\n# generate HTML output.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `html' will be used as the default path.\n\nHTML_OUTPUT            = html\n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for\n# each generated HTML page (for example: .htm,.php,.asp). If it is left blank\n# doxygen will generate files with .html extension.\n\nHTML_FILE_EXTENSION    = .html\n\n# The HTML_HEADER tag can be used to specify a personal HTML header for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard header. Note that when using a custom header you are responsible\n#  for the proper inclusion of any scripts and style sheets that doxygen\n# needs, which is dependent on the configuration options used.\n# It is advised to generate a default header using \"doxygen -w html\n# header.html footer.html stylesheet.css YourConfigFile\" and then modify\n# that header. Note that the header is subject to change so you typically\n# have to redo this when upgrading to a newer version of doxygen or when\n# changing the value of configuration settings such as GENERATE_TREEVIEW!\n\nHTML_HEADER            = ./header.html\n\n# The HTML_FOOTER tag can be used to specify a personal HTML footer for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard footer.\n\nHTML_FOOTER            = ./footer.html\n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading\n# style sheet that is used by each HTML page. It can be used to\n# fine-tune the look of the HTML output. If the tag is left blank doxygen\n# will generate a default style sheet. Note that doxygen will try to copy\n# the style sheet file to the HTML output directory, so don't put your own\n# style sheet in the HTML output directory as well, or it will be erased!\n\nHTML_STYLESHEET        =\n\n# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the HTML output directory. Note\n# that these files will be copied to the base HTML output directory. Use the\n# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n# files. In the HTML_STYLESHEET file, use the file name only. Also note that\n# the files will be copied as-is; there are no commands or markers available.\n\nHTML_EXTRA_FILES       =\n\n# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.\n# Doxygen will adjust the colors in the style sheet and background images\n# according to this color. Hue is specified as an angle on a colorwheel,\n# see http://en.wikipedia.org/wiki/Hue for more information.\n# For instance the value 0 represents red, 60 is yellow, 120 is green,\n# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.\n# The allowed range is 0 to 359.\n\nHTML_COLORSTYLE_HUE    = 220\n\n# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of\n# the colors in the HTML output. For a value of 0 the output will use\n# grayscales only. A value of 255 will produce the most vivid colors.\n\nHTML_COLORSTYLE_SAT    = 100\n\n# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to\n# the luminance component of the colors in the HTML output. Values below\n# 100 gradually make the output lighter, whereas values above 100 make\n# the output darker. The value divided by 100 is the actual gamma applied,\n# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,\n# and 100 does not change the gamma.\n\nHTML_COLORSTYLE_GAMMA  = 80\n\n# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\n# page will contain the date and time when the page was generated. Setting\n# this to NO can help when comparing the output of multiple runs.\n\nHTML_TIMESTAMP         = NO\n\n# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\n# documentation will contain sections that can be hidden and shown after the\n# page has loaded.\n\nHTML_DYNAMIC_SECTIONS  = NO\n\n# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of\n# entries shown in the various tree structured indices initially; the user\n# can expand and collapse entries dynamically later on. Doxygen will expand\n# the tree to such a level that at most the specified number of entries are\n# visible (unless a fully collapsed tree already exceeds this amount).\n# So setting the number of entries 1 will produce a full collapsed tree by\n# default. 0 is a special value representing an infinite number of entries\n# and will result in a full expanded tree by default.\n\nHTML_INDEX_NUM_ENTRIES = 100\n\n# If the GENERATE_DOCSET tag is set to YES, additional index files\n# will be generated that can be used as input for Apple's Xcode 3\n# integrated development environment, introduced with OSX 10.5 (Leopard).\n# To create a documentation set, doxygen will generate a Makefile in the\n# HTML output directory. Running make will produce the docset in that\n# directory and running \"make install\" will install the docset in\n# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find\n# it at startup.\n# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html\n# for more information.\n\nGENERATE_DOCSET        = NO\n\n# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the\n# feed. A documentation feed provides an umbrella under which multiple\n# documentation sets from a single provider (such as a company or product suite)\n# can be grouped.\n\nDOCSET_FEEDNAME        = \"Doxygen generated docs\"\n\n# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that\n# should uniquely identify the documentation set bundle. This should be a\n# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen\n# will append .docset to the name.\n\nDOCSET_BUNDLE_ID       = org.doxygen.Project\n\n# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify\n# the documentation publisher. This should be a reverse domain-name style\n# string, e.g. com.mycompany.MyDocSet.documentation.\n\nDOCSET_PUBLISHER_ID    = org.doxygen.Publisher\n\n# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.\n\nDOCSET_PUBLISHER_NAME  = Publisher\n\n# If the GENERATE_HTMLHELP tag is set to YES, additional index files\n# will be generated that can be used as input for tools like the\n# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)\n# of the generated HTML documentation.\n\nGENERATE_HTMLHELP      = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can\n# be used to specify the file name of the resulting .chm file. You\n# can add a path in front of the file if the result should not be\n# written to the html output directory.\n\nCHM_FILE               =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can\n# be used to specify the location (absolute path including file name) of\n# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run\n# the HTML help compiler on the generated index.hhp.\n\nHHC_LOCATION           =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag\n# controls if a separate .chi index file is generated (YES) or that\n# it should be included in the master .chm file (NO).\n\nGENERATE_CHI           = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING\n# is used to encode HtmlHelp index (hhk), content (hhc) and project file\n# content.\n\nCHM_INDEX_ENCODING     =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag\n# controls whether a binary table of contents is generated (YES) or a\n# normal table of contents (NO) in the .chm file.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members\n# to the contents of the HTML help documentation and to the tree view.\n\nTOC_EXPAND             = NO\n\n# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\n# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated\n# that can be used as input for Qt's qhelpgenerator to generate a\n# Qt Compressed Help (.qch) of the generated HTML documentation.\n\nGENERATE_QHP           = NO\n\n# If the QHG_LOCATION tag is specified, the QCH_FILE tag can\n# be used to specify the file name of the resulting .qch file.\n# The path specified is relative to the HTML output folder.\n\nQCH_FILE               =\n\n# The QHP_NAMESPACE tag specifies the namespace to use when generating\n# Qt Help Project output. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#namespace\n\nQHP_NAMESPACE          = org.doxygen.Project\n\n# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating\n# Qt Help Project output. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#virtual-folders\n\nQHP_VIRTUAL_FOLDER     = doc\n\n# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to\n# add. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#custom-filters\n\nQHP_CUST_FILTER_NAME   =\n\n# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the\n# custom filter to add. For more information please see\n# <a href=\"http://doc.trolltech.com/qthelpproject.html#custom-filters\">\n# Qt Help Project / Custom Filters</a>.\n\nQHP_CUST_FILTER_ATTRS  =\n\n# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\n# project's\n# filter section matches.\n# <a href=\"http://doc.trolltech.com/qthelpproject.html#filter-attributes\">\n# Qt Help Project / Filter Attributes</a>.\n\nQHP_SECT_FILTER_ATTRS  =\n\n# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can\n# be used to specify the location of Qt's qhelpgenerator.\n# If non-empty doxygen will try to run qhelpgenerator on the generated\n# .qhp file.\n\nQHG_LOCATION           =\n\n# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files\n#  will be generated, which together with the HTML files, form an Eclipse help\n# plugin. To install this plugin and make it available under the help contents\n# menu in Eclipse, the contents of the directory containing the HTML and XML\n# files needs to be copied into the plugins directory of eclipse. The name of\n# the directory within the plugins directory should be the same as\n# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before\n# the help appears.\n\nGENERATE_ECLIPSEHELP   = NO\n\n# A unique identifier for the eclipse help plugin. When installing the plugin\n# the directory name containing the HTML and XML files should also have\n# this name.\n\nECLIPSE_DOC_ID         = org.doxygen.Project\n\n# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)\n# at top of each HTML page. The value NO (the default) enables the index and\n# the value YES disables it. Since the tabs have the same information as the\n# navigation tree you can set this option to NO if you already set\n# GENERATE_TREEVIEW to YES.\n\nDISABLE_INDEX          = NO\n\n# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n# structure should be generated to display hierarchical information.\n# If the tag value is set to YES, a side panel will be generated\n# containing a tree-like index structure (just like the one that\n# is generated for HTML Help). For this to work a browser that supports\n# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).\n# Windows users are probably better off using the HTML help feature.\n# Since the tree basically has the same information as the tab index you\n# could consider to set DISABLE_INDEX to NO when enabling this option.\n\nGENERATE_TREEVIEW      = NO\n\n# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values\n# (range [0,1..20]) that doxygen will group on one line in the generated HTML\n# documentation. Note that a value of 0 will completely suppress the enum\n# values from appearing in the overview section.\n\nENUM_VALUES_PER_LINE   = 4\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be\n# used to set the initial width (in pixels) of the frame in which the tree\n# is shown.\n\nTREEVIEW_WIDTH         = 250\n\n# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open\n# links to external symbols imported via tag files in a separate window.\n\nEXT_LINKS_IN_WINDOW    = NO\n\n# Use this tag to change the font size of Latex formulas included\n# as images in the HTML documentation. The default is 10. Note that\n# when you change the font size after a successful doxygen run you need\n# to manually remove any form_*.png images from the HTML output directory\n# to force them to be regenerated.\n\nFORMULA_FONTSIZE       = 10\n\n# Use the FORMULA_TRANPARENT tag to determine whether or not the images\n# generated for formulas are transparent PNGs. Transparent PNGs are\n# not supported properly for IE 6.0, but are supported on all modern browsers.\n# Note that when changing this option you need to delete any form_*.png files\n# in the HTML output before the changes have effect.\n\nFORMULA_TRANSPARENT    = YES\n\n# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax\n# (see http://www.mathjax.org) which uses client side Javascript for the\n# rendering instead of using prerendered bitmaps. Use this if you do not\n# have LaTeX installed or if you want to formulas look prettier in the HTML\n# output. When enabled you may also need to install MathJax separately and\n# configure the path to it using the MATHJAX_RELPATH option.\n\nUSE_MATHJAX            = NO\n\n# When MathJax is enabled you need to specify the location relative to the\n# HTML output directory using the MATHJAX_RELPATH option. The destination\n# directory should contain the MathJax.js script. For instance, if the mathjax\n# directory is located at the same level as the HTML output directory, then\n# MATHJAX_RELPATH should be ../mathjax. The default value points to\n# the MathJax Content Delivery Network so you can quickly see the result without\n# installing MathJax.\n# However, it is strongly recommended to install a local\n# copy of MathJax from http://www.mathjax.org before deployment.\n\nMATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest\n\n# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension\n# names that should be enabled during MathJax rendering.\n\nMATHJAX_EXTENSIONS     =\n\n# When the SEARCHENGINE tag is enabled doxygen will generate a search box\n# for the HTML output. The underlying search engine uses javascript\n# and DHTML and should work on any modern browser. Note that when using\n# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets\n# (GENERATE_DOCSET) there is already a search function so this one should\n# typically be disabled. For large projects the javascript based search engine\n# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.\n\nSEARCHENGINE           = NO\n\n# When the SERVER_BASED_SEARCH tag is enabled the search engine will be\n# implemented using a PHP enabled web server instead of at the web client\n# using Javascript. Doxygen will generate the search PHP script and index\n# file to put on the web server. The advantage of the server\n# based approach is that it scales better to large projects and allows\n# full text search. The disadvantages are that it is more difficult to setup\n# and does not have live searching capabilities.\n\nSERVER_BASED_SEARCH    = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will\n# generate Latex output.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `latex' will be used as the default path.\n\nLATEX_OUTPUT           = latex\n\n# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be\n# invoked. If left blank `latex' will be used as the default command name.\n# Note that when enabling USE_PDFLATEX this option is only used for\n# generating bitmaps for formulas in the HTML output, but not in the\n# Makefile that is written to the output directory.\n\nLATEX_CMD_NAME         = latex\n\n# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to\n# generate index for LaTeX. If left blank `makeindex' will be used as the\n# default command name.\n\nMAKEINDEX_CMD_NAME     = makeindex\n\n# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact\n# LaTeX documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_LATEX          = NO\n\n# The PAPER_TYPE tag can be used to set the paper type that is used\n# by the printer. Possible values are: a4, letter, legal and\n# executive. If left blank a4wide will be used.\n\nPAPER_TYPE             = a4wide\n\n# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX\n# packages that should be included in the LaTeX output.\n\nEXTRA_PACKAGES         =\n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for\n# the generated latex document. The header should contain everything until\n# the first chapter. If it is left blank doxygen will generate a\n# standard header. Notice: only use this tag if you know what you are doing!\n\nLATEX_HEADER           =\n\n# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for\n# the generated latex document. The footer should contain everything after\n# the last chapter. If it is left blank doxygen will generate a\n# standard footer. Notice: only use this tag if you know what you are doing!\n\nLATEX_FOOTER           =\n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated\n# is prepared for conversion to pdf (using ps2pdf). The pdf file will\n# contain links (just like the HTML output) instead of page references\n# This makes the output suitable for online browsing using a pdf viewer.\n\nPDF_HYPERLINKS         = YES\n\n# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of\n# plain latex in the generated Makefile. Set this option to YES to get a\n# higher quality PDF documentation.\n\nUSE_PDFLATEX           = YES\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode.\n# command to the generated LaTeX files. This will instruct LaTeX to keep\n# running if errors occur, instead of asking the user for help.\n# This option is also used when generating formulas in HTML.\n\nLATEX_BATCHMODE        = NO\n\n# If LATEX_HIDE_INDICES is set to YES then doxygen will not\n# include the index chapters (such as File Index, Compound Index, etc.)\n# in the output.\n\nLATEX_HIDE_INDICES     = NO\n\n# If LATEX_SOURCE_CODE is set to YES then doxygen will include\n# source code with syntax highlighting in the LaTeX output.\n# Note that which sources are shown also depends on other settings\n# such as SOURCE_BROWSER.\n\nLATEX_SOURCE_CODE      = NO\n\n# The LATEX_BIB_STYLE tag can be used to specify the style to use for the\n# bibliography, e.g. plainnat, or ieeetr. The default style is \"plain\". See\n# http://en.wikipedia.org/wiki/BibTeX for more info.\n\nLATEX_BIB_STYLE        = plain\n\n#---------------------------------------------------------------------------\n# configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output\n# The RTF output is optimized for Word 97 and may not look very pretty with\n# other RTF readers or editors.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `rtf' will be used as the default path.\n\nRTF_OUTPUT             = rtf\n\n# If the COMPACT_RTF tag is set to YES Doxygen generates more compact\n# RTF documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated\n# will contain hyperlink fields. The RTF file will\n# contain links (just like the HTML output) instead of page references.\n# This makes the output suitable for online browsing using WORD or other\n# programs which support those fields.\n# Note: wordpad (write) and others do not support links.\n\nRTF_HYPERLINKS         = NO\n\n# Load style sheet definitions from file. Syntax is similar to doxygen's\n# config file, i.e. a series of assignments. You only have to provide\n# replacements, missing definitions are set to their default value.\n\nRTF_STYLESHEET_FILE    =\n\n# Set optional variables used in the generation of an rtf document.\n# Syntax is similar to doxygen's config file.\n\nRTF_EXTENSIONS_FILE    =\n\n#---------------------------------------------------------------------------\n# configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES (the default) Doxygen will\n# generate man pages\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `man' will be used as the default path.\n\nMAN_OUTPUT             = man\n\n# The MAN_EXTENSION tag determines the extension that is added to\n# the generated man pages (default is the subroutine's section .3)\n\nMAN_EXTENSION          = .3\n\n# If the MAN_LINKS tag is set to YES and Doxygen generates man output,\n# then it will generate one additional man file for each entity\n# documented in the real man page(s). These additional files\n# only source the real man page, but without them the man command\n# would be unable to find the correct page. The default is NO.\n\nMAN_LINKS              = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the XML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_XML tag is set to YES Doxygen will\n# generate an XML file that captures the structure of\n# the code including all documentation.\n\nGENERATE_XML           = NO\n\n# The XML_OUTPUT tag is used to specify where the XML pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `xml' will be used as the default path.\n\nXML_OUTPUT             = xml\n\n# The XML_SCHEMA tag can be used to specify an XML schema,\n# which can be used by a validating XML parser to check the\n# syntax of the XML files.\n\nXML_SCHEMA             =\n\n# The XML_DTD tag can be used to specify an XML DTD,\n# which can be used by a validating XML parser to check the\n# syntax of the XML files.\n\nXML_DTD                =\n\n# If the XML_PROGRAMLISTING tag is set to YES Doxygen will\n# dump the program listings (including syntax highlighting\n# and cross-referencing information) to the XML output. Note that\n# enabling this will significantly increase the size of the XML output.\n\nXML_PROGRAMLISTING     = YES\n\n#---------------------------------------------------------------------------\n# configuration options for the AutoGen Definitions output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will\n# generate an AutoGen Definitions (see autogen.sf.net) file\n# that captures the structure of the code including all\n# documentation. Note that this feature is still experimental\n# and incomplete at the moment.\n\nGENERATE_AUTOGEN_DEF   = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the Perl module output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_PERLMOD tag is set to YES Doxygen will\n# generate a Perl module file that captures the structure of\n# the code including all documentation. Note that this\n# feature is still experimental and incomplete at the\n# moment.\n\nGENERATE_PERLMOD       = NO\n\n# If the PERLMOD_LATEX tag is set to YES Doxygen will generate\n# the necessary Makefile rules, Perl scripts and LaTeX code to be able\n# to generate PDF and DVI output from the Perl module output.\n\nPERLMOD_LATEX          = NO\n\n# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be\n# nicely formatted so it can be parsed by a human reader.\n# This is useful\n# if you want to understand what is going on.\n# On the other hand, if this\n# tag is set to NO the size of the Perl module output will be much smaller\n# and Perl will parse it just the same.\n\nPERLMOD_PRETTY         = YES\n\n# The names of the make variables in the generated doxyrules.make file\n# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.\n# This is useful so different doxyrules.make files included by the same\n# Makefile don't overwrite each other's variables.\n\nPERLMOD_MAKEVAR_PREFIX =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor\n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will\n# evaluate all C-preprocessor directives found in the sources and include\n# files.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro\n# names in the source code. If set to NO (the default) only conditional\n# compilation will be performed. Macro expansion can be done in a controlled\n# way by setting EXPAND_ONLY_PREDEF to YES.\n\nMACRO_EXPANSION        = NO\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES\n# then the macro expansion is limited to the macros specified with the\n# PREDEFINED and EXPAND_AS_DEFINED tags.\n\nEXPAND_ONLY_PREDEF     = NO\n\n# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files\n# pointed to by INCLUDE_PATH will be searched when a #include is found.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that\n# contain include files that are not input files but should be processed by\n# the preprocessor.\n\nINCLUDE_PATH           =\n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\n# patterns (like *.h and *.hpp) to filter out the header-files in the\n# directories. If left blank, the patterns specified with FILE_PATTERNS will\n# be used.\n\nINCLUDE_FILE_PATTERNS  =\n\n# The PREDEFINED tag can be used to specify one or more macro names that\n# are defined before the preprocessor is started (similar to the -D option of\n# gcc). The argument of the tag is a list of macros of the form: name\n# or name=definition (no spaces). If the definition and the = are\n# omitted =1 is assumed. To prevent a macro definition from being\n# undefined via #undef or recursively expanded use the := operator\n# instead of the = operator.\n\nPREDEFINED             =\n\n# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then\n# this tag can be used to specify a list of macro names that should be expanded.\n# The macro definition that is found in the sources will be used.\n# Use the PREDEFINED tag if you want to use a different macro definition that\n# overrules the definition found in the source code.\n\nEXPAND_AS_DEFINED      =\n\n# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then\n# doxygen's preprocessor will remove all references to function-like macros\n# that are alone on a line, have an all uppercase name, and do not end with a\n# semicolon, because these will confuse the parser if not removed.\n\nSKIP_FUNCTION_MACROS   = YES\n\n#---------------------------------------------------------------------------\n# Configuration::additions related to external references\n#---------------------------------------------------------------------------\n\n# The TAGFILES option can be used to specify one or more tagfiles. For each\n# tag file the location of the external documentation should be added. The\n# format of a tag file without this location is as follows:\n#\n# TAGFILES = file1 file2 ...\n# Adding location for the tag files is done as follows:\n#\n# TAGFILES = file1=loc1 \"file2 = loc2\" ...\n# where \"loc1\" and \"loc2\" can be relative or absolute paths\n# or URLs. Note that each tag file must have a unique name (where the name does\n# NOT include the path). If a tag file is not located in the directory in which\n# doxygen is run, you must also specify the path to the tagfile here.\n\nTAGFILES               =\n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create\n# a tag file that is based on the input files it reads.\n\nGENERATE_TAGFILE       =\n\n# If the ALLEXTERNALS tag is set to YES all external classes will be listed\n# in the class index. If set to NO only the inherited external classes\n# will be listed.\n\nALLEXTERNALS           = NO\n\n# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed\n# in the modules index. If set to NO, only the current project's groups will\n# be listed.\n\nEXTERNAL_GROUPS        = YES\n\n# The PERL_PATH should be the absolute path and name of the perl script\n# interpreter (i.e. the result of `which perl').\n\nPERL_PATH              = /usr/bin/perl\n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool\n#---------------------------------------------------------------------------\n\n# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will\n# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base\n# or super classes. Setting the tag to NO turns the diagrams off. Note that\n# this option also works with HAVE_DOT disabled, but it is recommended to\n# install and use dot, since it yields more powerful graphs.\n\nCLASS_DIAGRAMS         = NO\n\n# You can define message sequence charts within doxygen comments using the \\msc\n# command. Doxygen will then run the mscgen tool (see\n# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the\n# documentation. The MSCGEN_PATH tag allows you to specify the directory where\n# the mscgen tool resides. If left empty the tool is assumed to be found in the\n# default search path.\n\nMSCGEN_PATH            =\n\n# If set to YES, the inheritance and collaboration graphs will hide\n# inheritance and usage relations if the target is undocumented\n# or is not a class.\n\nHIDE_UNDOC_RELATIONS   = YES\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\n# available from the path. This tool is part of Graphviz, a graph visualization\n# toolkit from AT&T and Lucent Bell Labs. The other options in this section\n# have no effect if this option is set to NO (the default)\n\nHAVE_DOT               = NO\n\n# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is\n# allowed to run in parallel. When set to 0 (the default) doxygen will\n# base this on the number of processors available in the system. You can set it\n# explicitly to a value larger than 0 to get control over the balance\n# between CPU load and processing speed.\n\nDOT_NUM_THREADS        = 0\n\n# By default doxygen will use the Helvetica font for all dot files that\n# doxygen generates. When you want a differently looking font you can specify\n# the font name using DOT_FONTNAME. You need to make sure dot is able to find\n# the font, which can be done by putting it in a standard location or by setting\n# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the\n# directory containing the font.\n\nDOT_FONTNAME           = FreeSans\n\n# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.\n# The default size is 10pt.\n\nDOT_FONTSIZE           = 10\n\n# By default doxygen will tell dot to use the Helvetica font.\n# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to\n# set the path where dot can find it.\n\nDOT_FONTPATH           =\n\n# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect inheritance relations. Setting this tag to YES will force the\n# CLASS_DIAGRAMS tag to NO.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect implementation dependencies (inheritance, containment, and\n# class references variables) of the class with other documented classes.\n\nCOLLABORATION_GRAPH    = YES\n\n# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for groups, showing the direct groups dependencies\n\nGROUP_GRAPHS           = YES\n\n# If the UML_LOOK tag is set to YES doxygen will generate inheritance and\n# collaboration diagrams in a style similar to the OMG's Unified Modeling\n# Language.\n\nUML_LOOK               = NO\n\n# If the UML_LOOK tag is enabled, the fields and methods are shown inside\n# the class node. If there are many fields or methods and many nodes the\n# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS\n# threshold limits the number of items for each type to make the size more\n# managable. Set this to 0 for no limit. Note that the threshold may be\n# exceeded by 50% before the limit is enforced.\n\nUML_LIMIT_NUM_FIELDS   = 10\n\n# If set to YES, the inheritance and collaboration graphs will show the\n# relations between templates and their instances.\n\nTEMPLATE_RELATIONS     = NO\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT\n# tags are set to YES then doxygen will generate a graph for each documented\n# file showing the direct and indirect include dependencies of the file with\n# other documented files.\n\nINCLUDE_GRAPH          = YES\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and\n# HAVE_DOT tags are set to YES then doxygen will generate a graph for each\n# documented header file showing the documented files that directly or\n# indirectly include this file.\n\nINCLUDED_BY_GRAPH      = YES\n\n# If the CALL_GRAPH and HAVE_DOT options are set to YES then\n# doxygen will generate a call dependency graph for every global function\n# or class method. Note that enabling this option will significantly increase\n# the time of a run. So in most cases it will be better to enable call graphs\n# for selected functions only using the \\callgraph command.\n\nCALL_GRAPH             = NO\n\n# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then\n# doxygen will generate a caller dependency graph for every global function\n# or class method. Note that enabling this option will significantly increase\n# the time of a run. So in most cases it will be better to enable caller\n# graphs for selected functions only using the \\callergraph command.\n\nCALLER_GRAPH           = NO\n\n# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen\n# will generate a graphical hierarchy of all classes instead of a textual one.\n\nGRAPHICAL_HIERARCHY    = YES\n\n# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES\n# then doxygen will show the dependencies a directory has on other directories\n# in a graphical way. The dependency relations are determined by the #include\n# relations between the files in the directories.\n\nDIRECTORY_GRAPH        = YES\n\n# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n# generated by dot. Possible values are svg, png, jpg, or gif.\n# If left blank png will be used. If you choose svg you need to set\n# HTML_FILE_EXTENSION to xhtml in order to make the SVG files\n# visible in IE 9+ (other browsers do not have this requirement).\n\nDOT_IMAGE_FORMAT       = png\n\n# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to\n# enable generation of interactive SVG images that allow zooming and panning.\n# Note that this requires a modern browser other than Internet Explorer.\n# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you\n# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files\n# visible. Older versions of IE do not have SVG support.\n\nINTERACTIVE_SVG        = NO\n\n# The tag DOT_PATH can be used to specify the path where the dot tool can be\n# found. If left blank, it is assumed the dot tool can be found in the path.\n\nDOT_PATH               =\n\n# The DOTFILE_DIRS tag can be used to specify one or more directories that\n# contain dot files that are included in the documentation (see the\n# \\dotfile command).\n\nDOTFILE_DIRS           =\n\n# The MSCFILE_DIRS tag can be used to specify one or more directories that\n# contain msc files that are included in the documentation (see the\n# \\mscfile command).\n\nMSCFILE_DIRS           =\n\n# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of\n# nodes that will be shown in the graph. If the number of nodes in a graph\n# becomes larger than this value, doxygen will truncate the graph, which is\n# visualized by representing a node as a red box. Note that doxygen if the\n# number of direct children of the root node in a graph is already larger than\n# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note\n# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\n\nDOT_GRAPH_MAX_NODES    = 50\n\n# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the\n# graphs generated by dot. A depth value of 3 means that only nodes reachable\n# from the root by following a path via at most 3 edges will be shown. Nodes\n# that lay further from the root node will be omitted. Note that setting this\n# option to 1 or 2 may greatly reduce the computation time needed for large\n# code bases. Also note that the size of a graph can be further restricted by\n# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n\nMAX_DOT_GRAPH_DEPTH    = 1000\n\n# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent\n# background. This is disabled by default, because dot on Windows does not\n# seem to support this out of the box. Warning: Depending on the platform used,\n# enabling this option may lead to badly anti-aliased labels on the edges of\n# a graph (i.e. they become hard to read).\n\nDOT_TRANSPARENT        = YES\n\n# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output\n# files in one run (i.e. multiple -o and -T options on the command line). This\n# makes dot run faster, but since only newer versions of dot (>1.8.10)\n# support this, this feature is disabled by default.\n\nDOT_MULTI_TARGETS      = NO\n\n# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will\n# generate a legend page explaining the meaning of the various boxes and\n# arrows in the dot generated graphs.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will\n# remove the intermediate dot files that are used to generate\n# the various graphs.\n\nDOT_CLEANUP            = YES\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/doc/footer.html",
    "content": "<hr>\n<table width=\"100%\">\n  <tr>\n    <td width=\"10%\" align=\"left\" valign=\"center\">\n      <a href=\"http://sourceforge.net\"> \n      <img\n      src=\"http://sourceforge.net/sflogo.php?group_id=144446\"\n      width=\"88\" height=\"31\" border=\"0\" alt=\"SourceForge Logo\"></a>\n    </td>\n    <td width=\"20%\" align=\"left\" valign=\"center\">\n      hosts this site.\n    </td>\n    <td>\n    </td>\n    <td align=\"right\" valign=\"center\">\n      Send comments to:<br>\n      <a href=\"mailto:qjson-devel@lists.sourceforge.net\">QJson Developers</a>\n    </td>\n  </tr>\n</table>\n\n<script type=\"text/javascript\">\nvar gaJsHost = ((\"https:\" == document.location.protocol) ? \"https://ssl.\" : \"http://www.\");\ndocument.write(unescape(\"%3Cscript src='\" + gaJsHost + \"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script type=\"text/javascript\">\nvar pageTracker = _gat._getTracker(\"UA-3214988-2\");\npageTracker._trackPageview();\n</script>\n\n</body> \n</html>\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/doc/header.html",
    "content": "<html>\n<head>\n<title>\nQJson - a Qt based library for mapping JSON data to QVariant objects\n</title>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\">\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n\n<body bgcolor=\"#ffffff\"> \n  <a href=\"http://qjson.sourceforge.net\">QJson home page</a>\n\n<hr>\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/doc/qjson.dox",
    "content": "/**\n\\mainpage\n\\section _intro Introduction\n\n<a HREF=\"http://www.json.org/\">JSON (JavaScript Object Notation)</a>\n is a lightweight data-interchange format. \nIt can represents integer, real number, string, an ordered sequence of value, and\na collection of name/value pairs.\n\nQJson is a qt-based library that maps JSON data to QVariant objects.\n\nJSON arrays will be mapped to QVariantList instances, while JSON's objects will\nbe mapped to QVariantMap.\n\n\\section _usage Usage\nConverting JSON's data to QVariant instance is really simple:\n\\code\n// create a JSonDriver instance\nQJson::Parser parser;\n\nbool ok;\n\n// json is a QString containing the data to convert\nQVariant result = parser.parse (json, &ok);\n\\endcode\n\nSuppose you're going to convert this JSON data:\n\\verbatim\n{\n    \"encoding\" : \"UTF-8\",\n    \"plug-ins\" : [\n        \"python\",\n        \"c++\",\n        \"ruby\"\n        ],\n    \"indent\" : { \"length\" : 3, \"use_space\" : true }\n}\n\\endverbatim\n\nThe following code would convert the JSON data and parse it:\n\\code\nQJson::Parser parser;\nbool ok;\n\nQVariantMap result = parser.parse (json, &ok).toMap();\nif (!ok) {\n  qFatal(\"An error occured during parsing\");\n  exit (1);\n}\n\nqDebug() << \"encoding:\" << result[\"encoding\"].toString();\nqDebug() << \"plugins:\";\n\nforeach (QVariant plugin, result[\"plug-ins\"].toList()) {\n  qDebug() << \"\\t-\" << plugin.toString();\n}\n\nQVariantMap nestedMap = result[\"indent\"].toMap();\nqDebug() << \"length:\" << nestedMap[\"length\"].toInt();\nqDebug() << \"use_space:\" << nestedMap[\"use_space\"].toBool();\n\\endcode\nThe output would be:\n\\verbatim\nencoding: \"UTF-8\"\nplugins:\n  - \"python\"\n  - \"c++\"\n  - \"ruby\"\nlength: 3\nuse_space: true\n\\endverbatim\n\nThe QJson::QObjectHelper class permits to serialize QObject instances into JSON. QJson::QObjectHelper also allows to \ninitialize a QObject using the values stored inside of a JSON object. \n\n\\section _build Build instructions\nQJson build system is based on cmake. Download QJson sources, extract them, move inside the sources directory and then:\n\\code\nmkdir build\ncd build\ncmake ..\nmake\nsudo make install\n\\endcode\n\n\\author Flavio Castelli <flavio@castelli.name>\n*/\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/include/QJson/Parser",
    "content": "#include \"../../src/parser.h\"\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/include/QJson/QObjectHelper",
    "content": "#include \"../../src/qobjecthelper.h\"\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/include/QJson/Serializer",
    "content": "#include \"../../src/serializer.h\"\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/.gitignore",
    "content": "moc_*\n*.o\nMakefile\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/CMakeLists.txt",
    "content": "# add_custom_command (OUTPUT ${qjson_SOURCE_DIR}/lib/json_parser.cc\n#                    PRE_BUILD\n#                    COMMAND bison -t -o json_parser.cc -d json_parser.yy\n#                    DEPENDS json_parser.yy\n#                    WORKING_DIRECTORY ${qjson_SOURCE_DIR}/lib/\n#                    )\n\n# To regenerate json_scanner.cc use:\n# flex json_scanner.yy\n\nset(qjson_MOC_HDRS\n  parserrunnable.h\n  serializerrunnable.h\n)\n\nIF (NOT Qt5Core_FOUND)\n  qt4_wrap_cpp(qjson_MOC_SRCS ${qjson_MOC_HDRS})\nENDIF()\n\nset (qjson_SRCS parser.cpp qobjecthelper.cpp json_scanner.cpp json_parser.cc parserrunnable.cpp serializer.cpp serializerrunnable.cpp)\nset (qjson_HEADERS parser.h parserrunnable.h qobjecthelper.h serializer.h serializerrunnable.h qjson_export.h)\n\n# Required to use the intree copy of FlexLexer.h\nINCLUDE_DIRECTORIES(.)\n\n# Special hack to fix scanner test compilation on Windows\n# JsonScanner class is not for export. So need to make static\n# lib what can be compiled against scanner test.\nif(WIN32 AND QJSON_BUILD_TESTS AND BUILD_SHARED_LIBS)\n  add_library(qjson_scanner STATIC json_scanner.cpp)\nendif()\n\nadd_library (qjson${QJSON_SUFFIX} ${qjson_SRCS} ${qjson_MOC_SRCS} ${qjson_HEADERS})\nIF (Qt5Core_FOUND)\n  target_link_libraries( qjson${QJSON_SUFFIX} ${Qt5Core_LIBRARIES})\nELSE()\n  target_link_libraries( qjson${QJSON_SUFFIX} ${QT_LIBRARIES})\nENDIF()\n\nif(NOT ANDROID)\n\tset_target_properties(qjson${QJSON_SUFFIX} PROPERTIES\n\t                      VERSION ${QJSON_LIB_MAJOR_VERSION}.${QJSON_LIB_MINOR_VERSION}.${QJSON_LIB_PATCH_VERSION}\n                              SOVERSION ${QJSON_LIB_MAJOR_VERSION}\n\t                      )\nendif()\n\nif(NOT BUILD_SHARED_LIBS)\n\tset_target_properties( qjson${QJSON_SUFFIX} PROPERTIES COMPILE_DEFINITIONS \"QJSON_STATIC\")\nendif()\n\nset_target_properties(qjson${QJSON_SUFFIX} PROPERTIES\n                      DEFINE_SYMBOL QJSON_MAKEDLL\n                      PUBLIC_HEADER \"${qjson_HEADERS}\"\n                      FRAMEWORK ${OSX_FRAMEWORK}\n                      )\n\nINSTALL(TARGETS qjson${QJSON_SUFFIX} EXPORT qjson-export\n   LIBRARY DESTINATION ${LIB_INSTALL_DIR}\n   RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin\n   ARCHIVE DESTINATION ${LIB_INSTALL_DIR}\n   FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR}\n   PUBLIC_HEADER DESTINATION ${INCLUDE_INSTALL_DIR}/qjson${QJSON_SUFFIX}\n)\n\nif(MSVC)\n  get_target_property(LOCATION qjson LOCATION_DEBUG)\n  string(REGEX REPLACE \"\\\\.[^.]*$\" \".pdb\" LOCATION \"${LOCATION}\")\n  install(FILES ${LOCATION} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin CONFIGURATIONS Debug)\n\n  get_target_property(LOCATION qjson LOCATION_RELWITHDEBINFO)\n  string(REGEX REPLACE \"\\\\.[^.]*$\" \".pdb\" LOCATION \"${LOCATION}\")\n  install(FILES ${LOCATION} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin CONFIGURATIONS RelWithDebInfo)\nendif(MSVC)\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/FlexLexer.h",
    "content": "// -*-C++-*-\n// FlexLexer.h -- define interfaces for lexical analyzer classes generated\n// by flex\n\n// Copyright (c) 1993 The Regents of the University of California.\n// All rights reserved.\n//\n// This code is derived from software contributed to Berkeley by\n// Kent Williams and Tom Epperly.\n//\n//  Redistribution and use in source and binary forms, with or without\n//  modification, are permitted provided that the following conditions\n//  are met:\n\n//  1. Redistributions of source code must retain the above copyright\n//  notice, this list of conditions and the following disclaimer.\n//  2. Redistributions in binary form must reproduce the above copyright\n//  notice, this list of conditions and the following disclaimer in the\n//  documentation and/or other materials provided with the distribution.\n\n//  Neither the name of the University nor the names of its contributors\n//  may be used to endorse or promote products derived from this software\n//  without specific prior written permission.\n\n//  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR\n//  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED\n//  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n//  PURPOSE.\n\n// This file defines FlexLexer, an abstract class which specifies the\n// external interface provided to flex C++ lexer objects, and yyFlexLexer,\n// which defines a particular lexer class.\n//\n// If you want to create multiple lexer classes, you use the -P flag\n// to rename each yyFlexLexer to some other xxFlexLexer.  You then\n// include <FlexLexer.h> in your other sources once per lexer class:\n//\n//\t#undef yyFlexLexer\n//\t#define yyFlexLexer xxFlexLexer\n//\t#include <FlexLexer.h>\n//\n//\t#undef yyFlexLexer\n//\t#define yyFlexLexer zzFlexLexer\n//\t#include <FlexLexer.h>\n//\t...\n\n#ifndef __FLEX_LEXER_H\n// Never included before - need to define base class.\n#define __FLEX_LEXER_H\n\n#include <iostream>\n#  ifndef FLEX_STD\n#    define FLEX_STD std::\n#  endif\n\nextern \"C++\" {\n\nstruct yy_buffer_state;\ntypedef int yy_state_type;\n\nclass FlexLexer {\npublic:\n\tvirtual ~FlexLexer()\t{ }\n\n\tconst char* YYText() const\t{ return yytext; }\n\tint YYLeng()\tconst\t{ return yyleng; }\n\n\tvirtual void\n\t\tyy_switch_to_buffer( struct yy_buffer_state* new_buffer ) = 0;\n\tvirtual struct yy_buffer_state*\n\t\tyy_create_buffer( FLEX_STD istream* s, int size ) = 0;\n\tvirtual void yy_delete_buffer( struct yy_buffer_state* b ) = 0;\n\tvirtual void yyrestart( FLEX_STD istream* s ) = 0;\n\n\tvirtual int yylex() = 0;\n\n\t// Call yylex with new input/output sources.\n\tint yylex( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 )\n\t\t{\n\t\tswitch_streams( new_in, new_out );\n\t\treturn yylex();\n\t\t}\n\n\t// Switch to new input/output streams.  A nil stream pointer\n\t// indicates \"keep the current one\".\n\tvirtual void switch_streams( FLEX_STD istream* new_in = 0,\n\t\t\t\t\tFLEX_STD ostream* new_out = 0 ) = 0;\n\n\tint lineno() const\t\t{ return yylineno; }\n\n\tint debug() const\t\t{ return yy_flex_debug; }\n\tvoid set_debug( int flag )\t{ yy_flex_debug = flag; }\n\nprotected:\n\tchar* yytext;\n\tint yyleng;\n\tint yylineno;\t\t// only maintained if you use %option yylineno\n\tint yy_flex_debug;\t// only has effect with -d or \"%option debug\"\n};\n\n}\n#endif // FLEXLEXER_H\n\n#if defined(yyFlexLexer) || ! defined(yyFlexLexerOnce)\n// Either this is the first time through (yyFlexLexerOnce not defined),\n// or this is a repeated include to define a different flavor of\n// yyFlexLexer, as discussed in the flex manual.\n#define yyFlexLexerOnce\n\nextern \"C++\" {\n\nclass yyFlexLexer : public FlexLexer {\npublic:\n\t// arg_yyin and arg_yyout default to the cin and cout, but we\n\t// only make that assignment when initializing in yylex().\n\tyyFlexLexer( FLEX_STD istream* arg_yyin = 0, FLEX_STD ostream* arg_yyout = 0 );\n\n\tvirtual ~yyFlexLexer();\n\n\tvoid yy_switch_to_buffer( struct yy_buffer_state* new_buffer );\n\tstruct yy_buffer_state* yy_create_buffer( FLEX_STD istream* s, int size );\n\tvoid yy_delete_buffer( struct yy_buffer_state* b );\n\tvoid yyrestart( FLEX_STD istream* s );\n\n\tvoid yypush_buffer_state( struct yy_buffer_state* new_buffer );\n\tvoid yypop_buffer_state();\n\n\tvirtual int yylex();\n\tvirtual void switch_streams( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 );\n\tvirtual int yywrap();\n\nprotected:\n\tvirtual int LexerInput( char* buf, int max_size );\n\tvirtual void LexerOutput( const char* buf, int size );\n\tvirtual void LexerError( const char* msg );\n\n\tvoid yyunput( int c, char* buf_ptr );\n\tint yyinput();\n\n\tvoid yy_load_buffer_state();\n\tvoid yy_init_buffer( struct yy_buffer_state* b, FLEX_STD istream* s );\n\tvoid yy_flush_buffer( struct yy_buffer_state* b );\n\n\tint yy_start_stack_ptr;\n\tint yy_start_stack_depth;\n\tint* yy_start_stack;\n\n\tvoid yy_push_state( int new_state );\n\tvoid yy_pop_state();\n\tint yy_top_state();\n\n\tyy_state_type yy_get_previous_state();\n\tyy_state_type yy_try_NUL_trans( yy_state_type current_state );\n\tint yy_get_next_buffer();\n\n\tFLEX_STD istream* yyin;\t// input source for default LexerInput\n\tFLEX_STD ostream* yyout;\t// output sink for default LexerOutput\n\n\t// yy_hold_char holds the character lost when yytext is formed.\n\tchar yy_hold_char;\n\n\t// Number of characters read into yy_ch_buf.\n\tint yy_n_chars;\n\n\t// Points to current character in buffer.\n\tchar* yy_c_buf_p;\n\n\tint yy_init;\t\t// whether we need to initialize\n\tint yy_start;\t\t// start state number\n\n\t// Flag which is used to allow yywrap()'s to do buffer switches\n\t// instead of setting up a fresh yyin.  A bit of a hack ...\n\tint yy_did_buffer_switch_on_eof;\n\n\n\tsize_t yy_buffer_stack_top; /**< index of top of stack. */\n\tsize_t yy_buffer_stack_max; /**< capacity of stack. */\n\tstruct yy_buffer_state ** yy_buffer_stack; /**< Stack as an array. */\n\tvoid yyensure_buffer_stack(void);\n\n\t// The following are not always needed, but may be depending\n\t// on use of certain flex features (like REJECT or yymore()).\n\n\tyy_state_type yy_last_accepting_state;\n\tchar* yy_last_accepting_cpos;\n\n\tyy_state_type* yy_state_buf;\n\tyy_state_type* yy_state_ptr;\n\n\tchar* yy_full_match;\n\tint* yy_full_state;\n\tint yy_full_lp;\n\n\tint yy_lp;\n\tint yy_looking_for_trail_begin;\n\n\tint yy_more_flag;\n\tint yy_more_len;\n\tint yy_more_offset;\n\tint yy_prev_more_offset;\n};\n\n}\n\n#endif // yyFlexLexer || ! yyFlexLexerOnce\n\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/json_parser.cc",
    "content": "/* A Bison parser, made by GNU Bison 2.7.  */\n\n/* Skeleton implementation for Bison LALR(1) parsers in C++\n   \n      Copyright (C) 2002-2012 Free Software Foundation, Inc.\n   \n   This program is free software: you can redistribute it and/or modify\n   it under the terms of the GNU General Public License as published by\n   the Free Software Foundation, either version 3 of the License, or\n   (at your option) any later version.\n   \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n   \n   You should have received a copy of the GNU General Public License\n   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */\n\n/* As a special exception, you may create a larger work that contains\n   part or all of the Bison parser skeleton and distribute that work\n   under terms of your choice, so long as that work isn't itself a\n   parser generator using the skeleton or a modified version thereof\n   as a parser skeleton.  Alternatively, if you modify or redistribute\n   the parser skeleton itself, you may (at your option) remove this\n   special exception, which will cause the skeleton and the resulting\n   Bison output files to be licensed under the GNU General Public\n   License without this special exception.\n   \n   This special exception was added by the Free Software Foundation in\n   version 2.2 of Bison.  */\n\n\n/* First part of user declarations.  */\n\n/* Line 279 of lalr1.cc  */\n#line 38 \"json_parser.cc\"\n\n\n#include \"json_parser.hh\"\n\n/* User implementation prologue.  */\n\n/* Line 285 of lalr1.cc  */\n#line 46 \"json_parser.cc\"\n\n\n# ifndef YY_NULL\n#  if defined __cplusplus && 201103L <= __cplusplus\n#   define YY_NULL nullptr\n#  else\n#   define YY_NULL 0\n#  endif\n# endif\n\n#ifndef YY_\n# if defined YYENABLE_NLS && YYENABLE_NLS\n#  if ENABLE_NLS\n#   include <libintl.h> /* FIXME: INFRINGES ON USER NAME SPACE */\n#   define YY_(msgid) dgettext (\"bison-runtime\", msgid)\n#  endif\n# endif\n# ifndef YY_\n#  define YY_(msgid) msgid\n# endif\n#endif\n\n#define YYRHSLOC(Rhs, K) ((Rhs)[K])\n/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].\n   If N is 0, then set CURRENT to the empty location which ends\n   the previous symbol: RHS[0] (always defined).  */\n\n# ifndef YYLLOC_DEFAULT\n#  define YYLLOC_DEFAULT(Current, Rhs, N)                               \\\n    do                                                                  \\\n      if (N)                                                            \\\n        {                                                               \\\n          (Current).begin  = YYRHSLOC (Rhs, 1).begin;                   \\\n          (Current).end    = YYRHSLOC (Rhs, N).end;                     \\\n        }                                                               \\\n      else                                                              \\\n        {                                                               \\\n          (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end;      \\\n        }                                                               \\\n    while (/*CONSTCOND*/ false)\n# endif\n\n\n/* Suppress unused-variable warnings by \"using\" E.  */\n#define YYUSE(e) ((void) (e))\n\n/* Enable debugging if requested.  */\n#if YYDEBUG\n\n/* A pseudo ostream that takes yydebug_ into account.  */\n# define YYCDEBUG if (yydebug_) (*yycdebug_)\n\n# define YY_SYMBOL_PRINT(Title, Type, Value, Location)\t\\\ndo {\t\t\t\t\t\t\t\\\n  if (yydebug_)\t\t\t\t\t\t\\\n    {\t\t\t\t\t\t\t\\\n      *yycdebug_ << Title << ' ';\t\t\t\\\n      yy_symbol_print_ ((Type), (Value), (Location));\t\\\n      *yycdebug_ << std::endl;\t\t\t\t\\\n    }\t\t\t\t\t\t\t\\\n} while (false)\n\n# define YY_REDUCE_PRINT(Rule)\t\t\\\ndo {\t\t\t\t\t\\\n  if (yydebug_)\t\t\t\t\\\n    yy_reduce_print_ (Rule);\t\t\\\n} while (false)\n\n# define YY_STACK_PRINT()\t\t\\\ndo {\t\t\t\t\t\\\n  if (yydebug_)\t\t\t\t\\\n    yystack_print_ ();\t\t\t\\\n} while (false)\n\n#else /* !YYDEBUG */\n\n# define YYCDEBUG if (false) std::cerr\n# define YY_SYMBOL_PRINT(Title, Type, Value, Location) YYUSE(Type)\n# define YY_REDUCE_PRINT(Rule)        static_cast<void>(0)\n# define YY_STACK_PRINT()             static_cast<void>(0)\n\n#endif /* !YYDEBUG */\n\n#define yyerrok\t\t(yyerrstatus_ = 0)\n#define yyclearin\t(yychar = yyempty_)\n\n#define YYACCEPT\tgoto yyacceptlab\n#define YYABORT\t\tgoto yyabortlab\n#define YYERROR\t\tgoto yyerrorlab\n#define YYRECOVERING()  (!!yyerrstatus_)\n\n\nnamespace yy {\n/* Line 353 of lalr1.cc  */\n#line 141 \"json_parser.cc\"\n\n  /* Return YYSTR after stripping away unnecessary quotes and\n     backslashes, so that it's suitable for yyerror.  The heuristic is\n     that double-quoting is unnecessary unless the string contains an\n     apostrophe, a comma, or backslash (other than backslash-backslash).\n     YYSTR is taken from yytname.  */\n  std::string\n  json_parser::yytnamerr_ (const char *yystr)\n  {\n    if (*yystr == '\"')\n      {\n        std::string yyr = \"\";\n        char const *yyp = yystr;\n\n        for (;;)\n          switch (*++yyp)\n            {\n            case '\\'':\n            case ',':\n              goto do_not_strip_quotes;\n\n            case '\\\\':\n              if (*++yyp != '\\\\')\n                goto do_not_strip_quotes;\n              /* Fall through.  */\n            default:\n              yyr += *yyp;\n              break;\n\n            case '\"':\n              return yyr;\n            }\n      do_not_strip_quotes: ;\n      }\n\n    return yystr;\n  }\n\n\n  /// Build a parser object.\n  json_parser::json_parser (QJson::ParserPrivate* driver_yyarg)\n    :\n#if YYDEBUG\n      yydebug_ (false),\n      yycdebug_ (&std::cerr),\n#endif\n      driver (driver_yyarg)\n  {\n  }\n\n  json_parser::~json_parser ()\n  {\n  }\n\n#if YYDEBUG\n  /*--------------------------------.\n  | Print this symbol on YYOUTPUT.  |\n  `--------------------------------*/\n\n  inline void\n  json_parser::yy_symbol_value_print_ (int yytype,\n\t\t\t   const semantic_type* yyvaluep, const location_type* yylocationp)\n  {\n    YYUSE (yylocationp);\n    YYUSE (yyvaluep);\n    std::ostream& yyo = debug_stream ();\n    std::ostream& yyoutput = yyo;\n    YYUSE (yyoutput);\n    switch (yytype)\n      {\n         default:\n\t  break;\n      }\n  }\n\n\n  void\n  json_parser::yy_symbol_print_ (int yytype,\n\t\t\t   const semantic_type* yyvaluep, const location_type* yylocationp)\n  {\n    *yycdebug_ << (yytype < yyntokens_ ? \"token\" : \"nterm\")\n\t       << ' ' << yytname_[yytype] << \" (\"\n\t       << *yylocationp << \": \";\n    yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);\n    *yycdebug_ << ')';\n  }\n#endif\n\n  void\n  json_parser::yydestruct_ (const char* yymsg,\n\t\t\t   int yytype, semantic_type* yyvaluep, location_type* yylocationp)\n  {\n    YYUSE (yylocationp);\n    YYUSE (yymsg);\n    YYUSE (yyvaluep);\n\n    if (yymsg)\n      YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);\n\n    switch (yytype)\n      {\n  \n\tdefault:\n\t  break;\n      }\n  }\n\n  void\n  json_parser::yypop_ (unsigned int n)\n  {\n    yystate_stack_.pop (n);\n    yysemantic_stack_.pop (n);\n    yylocation_stack_.pop (n);\n  }\n\n#if YYDEBUG\n  std::ostream&\n  json_parser::debug_stream () const\n  {\n    return *yycdebug_;\n  }\n\n  void\n  json_parser::set_debug_stream (std::ostream& o)\n  {\n    yycdebug_ = &o;\n  }\n\n\n  json_parser::debug_level_type\n  json_parser::debug_level () const\n  {\n    return yydebug_;\n  }\n\n  void\n  json_parser::set_debug_level (debug_level_type l)\n  {\n    yydebug_ = l;\n  }\n#endif\n\n  inline bool\n  json_parser::yy_pact_value_is_default_ (int yyvalue)\n  {\n    return yyvalue == yypact_ninf_;\n  }\n\n  inline bool\n  json_parser::yy_table_value_is_error_ (int yyvalue)\n  {\n    return yyvalue == yytable_ninf_;\n  }\n\n  int\n  json_parser::parse ()\n  {\n    /// Lookahead and lookahead in internal form.\n    int yychar = yyempty_;\n    int yytoken = 0;\n\n    // State.\n    int yyn;\n    int yylen = 0;\n    int yystate = 0;\n\n    // Error handling.\n    int yynerrs_ = 0;\n    int yyerrstatus_ = 0;\n\n    /// Semantic value of the lookahead.\n    static semantic_type yyval_default;\n    semantic_type yylval = yyval_default;\n    /// Location of the lookahead.\n    location_type yylloc;\n    /// The locations where the error started and ended.\n    location_type yyerror_range[3];\n\n    /// $$.\n    semantic_type yyval;\n    /// @$.\n    location_type yyloc;\n\n    int yyresult;\n\n    // FIXME: This shoud be completely indented.  It is not yet to\n    // avoid gratuitous conflicts when merging into the master branch.\n    try\n      {\n    YYCDEBUG << \"Starting parse\" << std::endl;\n\n\n    /* Initialize the stacks.  The initial state will be pushed in\n       yynewstate, since the latter expects the semantical and the\n       location values to have been already stored, initialize these\n       stacks with a primary value.  */\n    yystate_stack_ = state_stack_type (0);\n    yysemantic_stack_ = semantic_stack_type (0);\n    yylocation_stack_ = location_stack_type (0);\n    yysemantic_stack_.push (yylval);\n    yylocation_stack_.push (yylloc);\n\n    /* New state.  */\n  yynewstate:\n    yystate_stack_.push (yystate);\n    YYCDEBUG << \"Entering state \" << yystate << std::endl;\n\n    /* Accept?  */\n    if (yystate == yyfinal_)\n      goto yyacceptlab;\n\n    goto yybackup;\n\n    /* Backup.  */\n  yybackup:\n\n    /* Try to take a decision without lookahead.  */\n    yyn = yypact_[yystate];\n    if (yy_pact_value_is_default_ (yyn))\n      goto yydefault;\n\n    /* Read a lookahead token.  */\n    if (yychar == yyempty_)\n      {\n        YYCDEBUG << \"Reading a token: \";\n        yychar = yylex (&yylval, &yylloc, driver);\n      }\n\n    /* Convert token to internal form.  */\n    if (yychar <= yyeof_)\n      {\n\tyychar = yytoken = yyeof_;\n\tYYCDEBUG << \"Now at end of input.\" << std::endl;\n      }\n    else\n      {\n\tyytoken = yytranslate_ (yychar);\n\tYY_SYMBOL_PRINT (\"Next token is\", yytoken, &yylval, &yylloc);\n      }\n\n    /* If the proper action on seeing token YYTOKEN is to reduce or to\n       detect an error, take that action.  */\n    yyn += yytoken;\n    if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken)\n      goto yydefault;\n\n    /* Reduce or error.  */\n    yyn = yytable_[yyn];\n    if (yyn <= 0)\n      {\n\tif (yy_table_value_is_error_ (yyn))\n\t  goto yyerrlab;\n\tyyn = -yyn;\n\tgoto yyreduce;\n      }\n\n    /* Shift the lookahead token.  */\n    YY_SYMBOL_PRINT (\"Shifting\", yytoken, &yylval, &yylloc);\n\n    /* Discard the token being shifted.  */\n    yychar = yyempty_;\n\n    yysemantic_stack_.push (yylval);\n    yylocation_stack_.push (yylloc);\n\n    /* Count tokens shifted since error; after three, turn off error\n       status.  */\n    if (yyerrstatus_)\n      --yyerrstatus_;\n\n    yystate = yyn;\n    goto yynewstate;\n\n  /*-----------------------------------------------------------.\n  | yydefault -- do the default action for the current state.  |\n  `-----------------------------------------------------------*/\n  yydefault:\n    yyn = yydefact_[yystate];\n    if (yyn == 0)\n      goto yyerrlab;\n    goto yyreduce;\n\n  /*-----------------------------.\n  | yyreduce -- Do a reduction.  |\n  `-----------------------------*/\n  yyreduce:\n    yylen = yyr2_[yyn];\n    /* If YYLEN is nonzero, implement the default value of the action:\n       `$$ = $1'.  Otherwise, use the top of the stack.\n\n       Otherwise, the following line sets YYVAL to garbage.\n       This behavior is undocumented and Bison\n       users should not rely upon it.  */\n    if (yylen)\n      yyval = yysemantic_stack_[yylen - 1];\n    else\n      yyval = yysemantic_stack_[0];\n\n    // Compute the default @$.\n    {\n      slice<location_type, location_stack_type> slice (yylocation_stack_, yylen);\n      YYLLOC_DEFAULT (yyloc, slice, yylen);\n    }\n\n    // Perform the reduction.\n    YY_REDUCE_PRINT (yyn);\n    switch (yyn)\n      {\n          case 2:\n/* Line 670 of lalr1.cc  */\n#line 82 \"json_parser.yy\"\n    {\n              driver->m_result = (yysemantic_stack_[(1) - (1)]);\n              qjsonDebug() << \"json_parser - parsing finished\";\n            }\n    break;\n\n  case 3:\n/* Line 670 of lalr1.cc  */\n#line 87 \"json_parser.yy\"\n    { (yyval) = (yysemantic_stack_[(1) - (1)]); }\n    break;\n\n  case 4:\n/* Line 670 of lalr1.cc  */\n#line 89 \"json_parser.yy\"\n    {\n            qCritical()<< \"json_parser - syntax error found, \"\n                    << \"forcing abort, Line\" << (yyloc).begin.line << \"Column\" << (yyloc).begin.column;\n            YYABORT;\n          }\n    break;\n\n  case 5:\n/* Line 670 of lalr1.cc  */\n#line 95 \"json_parser.yy\"\n    {\n          (yyval) = QVariant(QVariantMap());\n        }\n    break;\n\n  case 6:\n/* Line 670 of lalr1.cc  */\n#line 98 \"json_parser.yy\"\n    {\n          QVariantMap* map = (yysemantic_stack_[(3) - (2)]).value<QVariantMap*>();\n          (yyval) = QVariant(*map);\n          delete map;\n     }\n    break;\n\n  case 7:\n/* Line 670 of lalr1.cc  */\n#line 104 \"json_parser.yy\"\n    {\n          QVariantMap* pair = new QVariantMap();\n          pair->insert((yysemantic_stack_[(3) - (1)]).toString(), (yysemantic_stack_[(3) - (3)]));\n          (yyval).setValue<QVariantMap* >(pair);\n        }\n    break;\n\n  case 8:\n/* Line 670 of lalr1.cc  */\n#line 109 \"json_parser.yy\"\n    {\n            (yyval).value<QVariantMap*>()->insert((yysemantic_stack_[(5) - (3)]).toString(), (yysemantic_stack_[(5) - (5)]));\n         }\n    break;\n\n  case 9:\n/* Line 670 of lalr1.cc  */\n#line 113 \"json_parser.yy\"\n    {\n          (yyval) = QVariant(QVariantList());\n        }\n    break;\n\n  case 10:\n/* Line 670 of lalr1.cc  */\n#line 116 \"json_parser.yy\"\n    { \n          QVector<QVariant>* list = (yysemantic_stack_[(3) - (2)]).value<QVector<QVariant>* >();\n          (yyval) = QVariant(list->toList());\n          delete list;\n        }\n    break;\n\n  case 11:\n/* Line 670 of lalr1.cc  */\n#line 122 \"json_parser.yy\"\n    {\n          QVector<QVariant>* list = new QVector<QVariant>(1);\n          list->replace(0, (yysemantic_stack_[(1) - (1)]));\n          (yyval).setValue(list);\n        }\n    break;\n\n  case 12:\n/* Line 670 of lalr1.cc  */\n#line 127 \"json_parser.yy\"\n    {\n          (yyval).value<QVector<QVariant>* >()->append((yysemantic_stack_[(3) - (3)]));\n        }\n    break;\n\n\n/* Line 670 of lalr1.cc  */\n#line 549 \"json_parser.cc\"\n      default:\n        break;\n      }\n\n    /* User semantic actions sometimes alter yychar, and that requires\n       that yytoken be updated with the new translation.  We take the\n       approach of translating immediately before every use of yytoken.\n       One alternative is translating here after every semantic action,\n       but that translation would be missed if the semantic action\n       invokes YYABORT, YYACCEPT, or YYERROR immediately after altering\n       yychar.  In the case of YYABORT or YYACCEPT, an incorrect\n       destructor might then be invoked immediately.  In the case of\n       YYERROR, subsequent parser actions might lead to an incorrect\n       destructor call or verbose syntax error message before the\n       lookahead is translated.  */\n    YY_SYMBOL_PRINT (\"-> $$ =\", yyr1_[yyn], &yyval, &yyloc);\n\n    yypop_ (yylen);\n    yylen = 0;\n    YY_STACK_PRINT ();\n\n    yysemantic_stack_.push (yyval);\n    yylocation_stack_.push (yyloc);\n\n    /* Shift the result of the reduction.  */\n    yyn = yyr1_[yyn];\n    yystate = yypgoto_[yyn - yyntokens_] + yystate_stack_[0];\n    if (0 <= yystate && yystate <= yylast_\n\t&& yycheck_[yystate] == yystate_stack_[0])\n      yystate = yytable_[yystate];\n    else\n      yystate = yydefgoto_[yyn - yyntokens_];\n    goto yynewstate;\n\n  /*------------------------------------.\n  | yyerrlab -- here on detecting error |\n  `------------------------------------*/\n  yyerrlab:\n    /* Make sure we have latest lookahead translation.  See comments at\n       user semantic actions for why this is necessary.  */\n    yytoken = yytranslate_ (yychar);\n\n    /* If not already recovering from an error, report this error.  */\n    if (!yyerrstatus_)\n      {\n\t++yynerrs_;\n\tif (yychar == yyempty_)\n\t  yytoken = yyempty_;\n\terror (yylloc, yysyntax_error_ (yystate, yytoken));\n      }\n\n    yyerror_range[1] = yylloc;\n    if (yyerrstatus_ == 3)\n      {\n        /* If just tried and failed to reuse lookahead token after an\n           error, discard it.  */\n        if (yychar <= yyeof_)\n          {\n            /* Return failure if at end of input.  */\n            if (yychar == yyeof_)\n              YYABORT;\n          }\n        else\n          {\n            yydestruct_ (\"Error: discarding\", yytoken, &yylval, &yylloc);\n            yychar = yyempty_;\n          }\n      }\n\n    /* Else will try to reuse lookahead token after shifting the error\n       token.  */\n    goto yyerrlab1;\n\n\n  /*---------------------------------------------------.\n  | yyerrorlab -- error raised explicitly by YYERROR.  |\n  `---------------------------------------------------*/\n  yyerrorlab:\n\n    /* Pacify compilers like GCC when the user code never invokes\n       YYERROR and the label yyerrorlab therefore never appears in user\n       code.  */\n    if (false)\n      goto yyerrorlab;\n\n    yyerror_range[1] = yylocation_stack_[yylen - 1];\n    /* Do not reclaim the symbols of the rule which action triggered\n       this YYERROR.  */\n    yypop_ (yylen);\n    yylen = 0;\n    yystate = yystate_stack_[0];\n    goto yyerrlab1;\n\n  /*-------------------------------------------------------------.\n  | yyerrlab1 -- common code for both syntax error and YYERROR.  |\n  `-------------------------------------------------------------*/\n  yyerrlab1:\n    yyerrstatus_ = 3;\t/* Each real token shifted decrements this.  */\n\n    for (;;)\n      {\n\tyyn = yypact_[yystate];\n\tif (!yy_pact_value_is_default_ (yyn))\n\t{\n\t  yyn += yyterror_;\n\t  if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)\n\t    {\n\t      yyn = yytable_[yyn];\n\t      if (0 < yyn)\n\t\tbreak;\n\t    }\n\t}\n\n\t/* Pop the current state because it cannot handle the error token.  */\n\tif (yystate_stack_.height () == 1)\n\t  YYABORT;\n\n\tyyerror_range[1] = yylocation_stack_[0];\n\tyydestruct_ (\"Error: popping\",\n\t\t     yystos_[yystate],\n\t\t     &yysemantic_stack_[0], &yylocation_stack_[0]);\n\tyypop_ ();\n\tyystate = yystate_stack_[0];\n\tYY_STACK_PRINT ();\n      }\n\n    yyerror_range[2] = yylloc;\n    // Using YYLLOC is tempting, but would change the location of\n    // the lookahead.  YYLOC is available though.\n    YYLLOC_DEFAULT (yyloc, yyerror_range, 2);\n    yysemantic_stack_.push (yylval);\n    yylocation_stack_.push (yyloc);\n\n    /* Shift the error token.  */\n    YY_SYMBOL_PRINT (\"Shifting\", yystos_[yyn],\n\t\t     &yysemantic_stack_[0], &yylocation_stack_[0]);\n\n    yystate = yyn;\n    goto yynewstate;\n\n    /* Accept.  */\n  yyacceptlab:\n    yyresult = 0;\n    goto yyreturn;\n\n    /* Abort.  */\n  yyabortlab:\n    yyresult = 1;\n    goto yyreturn;\n\n  yyreturn:\n    if (yychar != yyempty_)\n      {\n        /* Make sure we have latest lookahead translation.  See comments\n           at user semantic actions for why this is necessary.  */\n        yytoken = yytranslate_ (yychar);\n        yydestruct_ (\"Cleanup: discarding lookahead\", yytoken, &yylval,\n                     &yylloc);\n      }\n\n    /* Do not reclaim the symbols of the rule which action triggered\n       this YYABORT or YYACCEPT.  */\n    yypop_ (yylen);\n    while (1 < yystate_stack_.height ())\n      {\n        yydestruct_ (\"Cleanup: popping\",\n                     yystos_[yystate_stack_[0]],\n                     &yysemantic_stack_[0],\n                     &yylocation_stack_[0]);\n        yypop_ ();\n      }\n\n    return yyresult;\n    }\n    catch (...)\n      {\n        YYCDEBUG << \"Exception caught: cleaning lookahead and stack\"\n                 << std::endl;\n        // Do not try to display the values of the reclaimed symbols,\n        // as their printer might throw an exception.\n        if (yychar != yyempty_)\n          {\n            /* Make sure we have latest lookahead translation.  See\n               comments at user semantic actions for why this is\n               necessary.  */\n            yytoken = yytranslate_ (yychar);\n            yydestruct_ (YY_NULL, yytoken, &yylval, &yylloc);\n          }\n\n        while (1 < yystate_stack_.height ())\n          {\n            yydestruct_ (YY_NULL,\n                         yystos_[yystate_stack_[0]],\n                         &yysemantic_stack_[0],\n                         &yylocation_stack_[0]);\n            yypop_ ();\n          }\n        throw;\n      }\n  }\n\n  // Generate an error message.\n  std::string\n  json_parser::yysyntax_error_ (int yystate, int yytoken)\n  {\n    std::string yyres;\n    // Number of reported tokens (one for the \"unexpected\", one per\n    // \"expected\").\n    size_t yycount = 0;\n    // Its maximum.\n    enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };\n    // Arguments of yyformat.\n    char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];\n\n    /* There are many possibilities here to consider:\n       - If this state is a consistent state with a default action, then\n         the only way this function was invoked is if the default action\n         is an error action.  In that case, don't check for expected\n         tokens because there are none.\n       - The only way there can be no lookahead present (in yytoken) is\n         if this state is a consistent state with a default action.\n         Thus, detecting the absence of a lookahead is sufficient to\n         determine that there is no unexpected or expected token to\n         report.  In that case, just report a simple \"syntax error\".\n       - Don't assume there isn't a lookahead just because this state is\n         a consistent state with a default action.  There might have\n         been a previous inconsistent state, consistent state with a\n         non-default action, or user semantic action that manipulated\n         yychar.\n       - Of course, the expected token list depends on states to have\n         correct lookahead information, and it depends on the parser not\n         to perform extra reductions after fetching a lookahead from the\n         scanner and before detecting a syntax error.  Thus, state\n         merging (from LALR or IELR) and default reductions corrupt the\n         expected token list.  However, the list is correct for\n         canonical LR with one exception: it will still contain any\n         token that will not be accepted due to an error action in a\n         later state.\n    */\n    if (yytoken != yyempty_)\n      {\n        yyarg[yycount++] = yytname_[yytoken];\n        int yyn = yypact_[yystate];\n        if (!yy_pact_value_is_default_ (yyn))\n          {\n            /* Start YYX at -YYN if negative to avoid negative indexes in\n               YYCHECK.  In other words, skip the first -YYN actions for\n               this state because they are default actions.  */\n            int yyxbegin = yyn < 0 ? -yyn : 0;\n            /* Stay within bounds of both yycheck and yytname.  */\n            int yychecklim = yylast_ - yyn + 1;\n            int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;\n            for (int yyx = yyxbegin; yyx < yyxend; ++yyx)\n              if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_\n                  && !yy_table_value_is_error_ (yytable_[yyx + yyn]))\n                {\n                  if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)\n                    {\n                      yycount = 1;\n                      break;\n                    }\n                  else\n                    yyarg[yycount++] = yytname_[yyx];\n                }\n          }\n      }\n\n    char const* yyformat = YY_NULL;\n    switch (yycount)\n      {\n#define YYCASE_(N, S)                         \\\n        case N:                               \\\n          yyformat = S;                       \\\n        break\n        YYCASE_(0, YY_(\"syntax error\"));\n        YYCASE_(1, YY_(\"syntax error, unexpected %s\"));\n        YYCASE_(2, YY_(\"syntax error, unexpected %s, expecting %s\"));\n        YYCASE_(3, YY_(\"syntax error, unexpected %s, expecting %s or %s\"));\n        YYCASE_(4, YY_(\"syntax error, unexpected %s, expecting %s or %s or %s\"));\n        YYCASE_(5, YY_(\"syntax error, unexpected %s, expecting %s or %s or %s or %s\"));\n#undef YYCASE_\n      }\n\n    // Argument number.\n    size_t yyi = 0;\n    for (char const* yyp = yyformat; *yyp; ++yyp)\n      if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)\n        {\n          yyres += yytnamerr_ (yyarg[yyi++]);\n          ++yyp;\n        }\n      else\n        yyres += *yyp;\n    return yyres;\n  }\n\n\n  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing\n     STATE-NUM.  */\n  const signed char json_parser::yypact_ninf_ = -5;\n  const signed char\n  json_parser::yypact_[] =\n  {\n         0,    -5,     2,    18,    -5,    -5,    -5,    -5,    -5,     7,\n      -5,    -5,    -5,    -5,    -5,     1,    12,    -5,    -4,    -5,\n      -5,    29,    -5,     4,    -5,    29,    -5,    26,    -5,    29,\n      -5\n  };\n\n  /* YYDEFACT[S] -- default reduction number in state S.  Performed when\n     YYTABLE doesn't specify something else to do.  Zero means the\n     default is an error.  */\n  const unsigned char\n  json_parser::yydefact_[] =\n  {\n         0,     4,     0,     0,    14,    15,    16,    17,    13,     0,\n       2,    18,    19,     3,     5,     0,     0,     9,     0,    11,\n       1,     0,     6,     0,    10,     0,     7,     0,    12,     0,\n       8\n  };\n\n  /* YYPGOTO[NTERM-NUM].  */\n  const signed char\n  json_parser::yypgoto_[] =\n  {\n        -5,    -5,    -5,    -5,    -5,    -5,    -5,    -3\n  };\n\n  /* YYDEFGOTO[NTERM-NUM].  */\n  const signed char\n  json_parser::yydefgoto_[] =\n  {\n        -1,     9,    10,    11,    16,    12,    18,    13\n  };\n\n  /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If\n     positive, shift that token.  If negative, reduce the rule which\n     number is the opposite.  If YYTABLE_NINF_, syntax error.  */\n  const signed char json_parser::yytable_ninf_ = -1;\n  const unsigned char\n  json_parser::yytable_[] =\n  {\n        19,     1,    24,     2,    25,     3,    14,    20,    21,     4,\n       5,     6,     7,     8,     0,    15,    22,    27,    26,     0,\n      23,     2,    28,     3,    17,     0,    30,     4,     5,     6,\n       7,     8,     2,    29,     3,     0,     0,     0,     4,     5,\n       6,     7,     8\n  };\n\n  /* YYCHECK.  */\n  const signed char\n  json_parser::yycheck_[] =\n  {\n         3,     1,     6,     3,     8,     5,     4,     0,     7,     9,\n      10,    11,    12,    13,    -1,    13,     4,    13,    21,    -1,\n       8,     3,    25,     5,     6,    -1,    29,     9,    10,    11,\n      12,    13,     3,     7,     5,    -1,    -1,    -1,     9,    10,\n      11,    12,    13\n  };\n\n  /* STOS_[STATE-NUM] -- The (internal number of the) accessing\n     symbol of state STATE-NUM.  */\n  const unsigned char\n  json_parser::yystos_[] =\n  {\n         0,     1,     3,     5,     9,    10,    11,    12,    13,    16,\n      17,    18,    20,    22,     4,    13,    19,     6,    21,    22,\n       0,     7,     4,     8,     6,     8,    22,    13,    22,     7,\n      22\n  };\n\n#if YYDEBUG\n  /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding\n     to YYLEX-NUM.  */\n  const unsigned short int\n  json_parser::yytoken_number_[] =\n  {\n         0,   256,   257,     1,     2,     3,     4,     5,     6,     7,\n       8,     9,    10,    11,    12\n  };\n#endif\n\n  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */\n  const unsigned char\n  json_parser::yyr1_[] =\n  {\n         0,    15,    16,    17,    17,    18,    18,    19,    19,    20,\n      20,    21,    21,    22,    22,    22,    22,    22,    22,    22\n  };\n\n  /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */\n  const unsigned char\n  json_parser::yyr2_[] =\n  {\n         0,     2,     1,     1,     1,     2,     3,     3,     5,     2,\n       3,     1,     3,     1,     1,     1,     1,     1,     1,     1\n  };\n\n\n  /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.\n     First, the terminals, then, starting at \\a yyntokens_, nonterminals.  */\n  const char*\n  const json_parser::yytname_[] =\n  {\n    \"\\\"end of file\\\"\", \"error\", \"$undefined\", \"\\\"{\\\"\", \"\\\"}\\\"\", \"\\\"[\\\"\",\n  \"\\\"]\\\"\", \"\\\":\\\"\", \"\\\",\\\"\", \"\\\"number\\\"\", \"\\\"true\\\"\", \"\\\"false\\\"\",\n  \"\\\"null\\\"\", \"\\\"string\\\"\", \"\\\"invalid\\\"\", \"$accept\", \"start\", \"data\",\n  \"object\", \"members\", \"array\", \"values\", \"value\", YY_NULL\n  };\n\n#if YYDEBUG\n  /* YYRHS -- A `-1'-separated list of the rules' RHS.  */\n  const json_parser::rhs_number_type\n  json_parser::yyrhs_[] =\n  {\n        16,     0,    -1,    17,    -1,    22,    -1,     1,    -1,     3,\n       4,    -1,     3,    19,     4,    -1,    13,     7,    22,    -1,\n      19,     8,    13,     7,    22,    -1,     5,     6,    -1,     5,\n      21,     6,    -1,    22,    -1,    21,     8,    22,    -1,    13,\n      -1,     9,    -1,    10,    -1,    11,    -1,    12,    -1,    18,\n      -1,    20,    -1\n  };\n\n  /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in\n     YYRHS.  */\n  const unsigned char\n  json_parser::yyprhs_[] =\n  {\n         0,     0,     3,     5,     7,     9,    12,    16,    20,    26,\n      29,    33,    35,    39,    41,    43,    45,    47,    49,    51\n  };\n\n  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */\n  const unsigned char\n  json_parser::yyrline_[] =\n  {\n         0,    82,    82,    87,    88,    95,    98,   104,   109,   113,\n     116,   122,   127,   131,   132,   133,   134,   135,   136,   137\n  };\n\n  // Print the state stack on the debug stream.\n  void\n  json_parser::yystack_print_ ()\n  {\n    *yycdebug_ << \"Stack now\";\n    for (state_stack_type::const_iterator i = yystate_stack_.begin ();\n\t i != yystate_stack_.end (); ++i)\n      *yycdebug_ << ' ' << *i;\n    *yycdebug_ << std::endl;\n  }\n\n  // Report on the debug stream that the rule \\a yyrule is going to be reduced.\n  void\n  json_parser::yy_reduce_print_ (int yyrule)\n  {\n    unsigned int yylno = yyrline_[yyrule];\n    int yynrhs = yyr2_[yyrule];\n    /* Print the symbols being reduced, and their result.  */\n    *yycdebug_ << \"Reducing stack by rule \" << yyrule - 1\n\t       << \" (line \" << yylno << \"):\" << std::endl;\n    /* The symbols being reduced.  */\n    for (int yyi = 0; yyi < yynrhs; yyi++)\n      YY_SYMBOL_PRINT (\"   $\" << yyi + 1 << \" =\",\n\t\t       yyrhs_[yyprhs_[yyrule] + yyi],\n\t\t       &(yysemantic_stack_[(yynrhs) - (yyi + 1)]),\n\t\t       &(yylocation_stack_[(yynrhs) - (yyi + 1)]));\n  }\n#endif // YYDEBUG\n\n  /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */\n  json_parser::token_number_type\n  json_parser::yytranslate_ (int t)\n  {\n    static\n    const token_number_type\n    translate_table[] =\n    {\n           0,     3,     4,     5,     6,     7,     8,     9,    10,    11,\n      12,    13,    14,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     1,     2\n    };\n    if ((unsigned int) t <= yyuser_token_number_max_)\n      return translate_table[t];\n    else\n      return yyundef_token_;\n  }\n\n  const int json_parser::yyeof_ = 0;\n  const int json_parser::yylast_ = 42;\n  const int json_parser::yynnts_ = 8;\n  const int json_parser::yyempty_ = -2;\n  const int json_parser::yyfinal_ = 20;\n  const int json_parser::yyterror_ = 1;\n  const int json_parser::yyerrcode_ = 256;\n  const int json_parser::yyntokens_ = 15;\n\n  const unsigned int json_parser::yyuser_token_number_max_ = 257;\n  const json_parser::token_number_type json_parser::yyundef_token_ = 2;\n\n\n} // yy\n/* Line 1141 of lalr1.cc  */\n#line 1075 \"json_parser.cc\"\n/* Line 1142 of lalr1.cc  */\n#line 139 \"json_parser.yy\"\n\n\nint yy::yylex(YYSTYPE *yylval, yy::location *yylloc, QJson::ParserPrivate* driver)\n{\n  JSonScanner* scanner = driver->m_scanner;\n  yylval->clear();\n  int ret = scanner->yylex(yylval, yylloc);\n\n  qjsonDebug() << \"json_parser::yylex - calling scanner yylval==|\"\n           << yylval->toByteArray() << \"|, ret==|\" << QString::number(ret) << \"|\";\n  \n  return ret;\n}\n\nvoid yy::json_parser::error (const yy::location& yyloc, const std::string& error)\n{\n  /*qjsonDebug() << yyloc.begin.line;\n  qjsonDebug() << yyloc.begin.column;\n  qjsonDebug() << yyloc.end.line;\n  qjsonDebug() << yyloc.end.column;*/\n  qjsonDebug() << \"json_parser::error [line\" << yyloc.end.line << \"] -\" << error.c_str() ;\n  driver->setError(QString::fromLatin1(error.c_str()), yyloc.end.line);\n}\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/json_parser.hh",
    "content": "/* A Bison parser, made by GNU Bison 2.7.  */\n\n/* Skeleton interface for Bison LALR(1) parsers in C++\n   \n      Copyright (C) 2002-2012 Free Software Foundation, Inc.\n   \n   This program is free software: you can redistribute it and/or modify\n   it under the terms of the GNU General Public License as published by\n   the Free Software Foundation, either version 3 of the License, or\n   (at your option) any later version.\n   \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n   \n   You should have received a copy of the GNU General Public License\n   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */\n\n/* As a special exception, you may create a larger work that contains\n   part or all of the Bison parser skeleton and distribute that work\n   under terms of your choice, so long as that work isn't itself a\n   parser generator using the skeleton or a modified version thereof\n   as a parser skeleton.  Alternatively, if you modify or redistribute\n   the parser skeleton itself, you may (at your option) remove this\n   special exception, which will cause the skeleton and the resulting\n   Bison output files to be licensed under the GNU General Public\n   License without this special exception.\n   \n   This special exception was added by the Free Software Foundation in\n   version 2.2 of Bison.  */\n\n/**\n ** \\file json_parser.hh\n ** Define the yy::parser class.\n */\n\n/* C++ LALR(1) parser skeleton written by Akim Demaille.  */\n\n#ifndef YY_YY_JSON_PARSER_HH_INCLUDED\n# define YY_YY_JSON_PARSER_HH_INCLUDED\n\n/* \"%code requires\" blocks.  */\n/* Line 33 of lalr1.cc  */\n#line 26 \"json_parser.yy\"\n\n  #include \"parser_p.h\"\n  #include \"json_scanner.h\"\n  #include \"qjson_debug.h\"\n\n  #include <QtCore/QByteArray>\n  #include <QtCore/QMap>\n  #include <QtCore/QString>\n  #include <QtCore/QVariant>\n\n  #include <limits>\n\n  class JSonScanner;\n\n  namespace QJson {\n    class Parser;\n  }\n\n  #define YYERROR_VERBOSE 1\n  \n  Q_DECLARE_METATYPE(QVector<QVariant>*)\n  Q_DECLARE_METATYPE(QVariantMap*)\n\n\n/* Line 33 of lalr1.cc  */\n#line 72 \"json_parser.hh\"\n\n\n#include <string>\n#include <iostream>\n#include \"stack.hh\"\n#include \"location.hh\"\n\n/* Enabling traces.  */\n#ifndef YYDEBUG\n# define YYDEBUG 1\n#endif\n\n\nnamespace yy {\n/* Line 33 of lalr1.cc  */\n#line 88 \"json_parser.hh\"\n\n  /// A Bison parser.\n  class json_parser\n  {\n  public:\n    /// Symbol semantic values.\n#ifndef YYSTYPE\n    typedef int semantic_type;\n#else\n    typedef YYSTYPE semantic_type;\n#endif\n    /// Symbol locations.\n    typedef location location_type;\n    /// Tokens.\n    struct token\n    {\n      /* Tokens.  */\n   enum yytokentype {\n     END = 0,\n     CURLY_BRACKET_OPEN = 1,\n     CURLY_BRACKET_CLOSE = 2,\n     SQUARE_BRACKET_OPEN = 3,\n     SQUARE_BRACKET_CLOSE = 4,\n     COLON = 5,\n     COMMA = 6,\n     NUMBER = 7,\n     TRUE_VAL = 8,\n     FALSE_VAL = 9,\n     NULL_VAL = 10,\n     STRING = 11,\n     INVALID = 12\n   };\n\n    };\n    /// Token type.\n    typedef token::yytokentype token_type;\n\n    /// Build a parser object.\n    json_parser (QJson::ParserPrivate* driver_yyarg);\n    virtual ~json_parser ();\n\n    /// Parse.\n    /// \\returns  0 iff parsing succeeded.\n    virtual int parse ();\n\n#if YYDEBUG\n    /// The current debugging stream.\n    std::ostream& debug_stream () const;\n    /// Set the current debugging stream.\n    void set_debug_stream (std::ostream &);\n\n    /// Type for debugging levels.\n    typedef int debug_level_type;\n    /// The current debugging level.\n    debug_level_type debug_level () const;\n    /// Set the current debugging level.\n    void set_debug_level (debug_level_type l);\n#endif\n\n  private:\n    /// Report a syntax error.\n    /// \\param loc    where the syntax error is found.\n    /// \\param msg    a description of the syntax error.\n    virtual void error (const location_type& loc, const std::string& msg);\n\n    /// Generate an error message.\n    /// \\param state   the state where the error occurred.\n    /// \\param tok     the lookahead token.\n    virtual std::string yysyntax_error_ (int yystate, int tok);\n\n#if YYDEBUG\n    /// \\brief Report a symbol value on the debug stream.\n    /// \\param yytype       The token type.\n    /// \\param yyvaluep     Its semantic value.\n    /// \\param yylocationp  Its location.\n    virtual void yy_symbol_value_print_ (int yytype,\n\t\t\t\t\t const semantic_type* yyvaluep,\n\t\t\t\t\t const location_type* yylocationp);\n    /// \\brief Report a symbol on the debug stream.\n    /// \\param yytype       The token type.\n    /// \\param yyvaluep     Its semantic value.\n    /// \\param yylocationp  Its location.\n    virtual void yy_symbol_print_ (int yytype,\n\t\t\t\t   const semantic_type* yyvaluep,\n\t\t\t\t   const location_type* yylocationp);\n#endif\n\n\n    /// State numbers.\n    typedef int state_type;\n    /// State stack type.\n    typedef stack<state_type>    state_stack_type;\n    /// Semantic value stack type.\n    typedef stack<semantic_type> semantic_stack_type;\n    /// location stack type.\n    typedef stack<location_type> location_stack_type;\n\n    /// The state stack.\n    state_stack_type yystate_stack_;\n    /// The semantic value stack.\n    semantic_stack_type yysemantic_stack_;\n    /// The location stack.\n    location_stack_type yylocation_stack_;\n\n    /// Whether the given \\c yypact_ value indicates a defaulted state.\n    /// \\param yyvalue   the value to check\n    static bool yy_pact_value_is_default_ (int yyvalue);\n\n    /// Whether the given \\c yytable_ value indicates a syntax error.\n    /// \\param yyvalue   the value to check\n    static bool yy_table_value_is_error_ (int yyvalue);\n\n    /// Internal symbol numbers.\n    typedef unsigned char token_number_type;\n    /* Tables.  */\n    /// For a state, the index in \\a yytable_ of its portion.\n    static const signed char yypact_[];\n    static const signed char yypact_ninf_;\n\n    /// For a state, default reduction number.\n    /// Unless\\a  yytable_ specifies something else to do.\n    /// Zero means the default is an error.\n    static const unsigned char yydefact_[];\n\n    static const signed char yypgoto_[];\n    static const signed char yydefgoto_[];\n\n    /// What to do in a state.\n    /// \\a yytable_[yypact_[s]]: what to do in state \\a s.\n    /// - if positive, shift that token.\n    /// - if negative, reduce the rule which number is the opposite.\n    /// - if zero, do what YYDEFACT says.\n    static const unsigned char yytable_[];\n    static const signed char yytable_ninf_;\n\n    static const signed char yycheck_[];\n\n    /// For a state, its accessing symbol.\n    static const unsigned char yystos_[];\n\n    /// For a rule, its LHS.\n    static const unsigned char yyr1_[];\n    /// For a rule, its RHS length.\n    static const unsigned char yyr2_[]; \n\n    /// Convert the symbol name \\a n to a form suitable for a diagnostic.\n    static std::string yytnamerr_ (const char *n);\n\n\n    /// For a symbol, its name in clear.\n    static const char* const yytname_[];\n#if YYDEBUG\n    /// A type to store symbol numbers and -1.\n    typedef signed char rhs_number_type;\n    /// A `-1'-separated list of the rules' RHS.\n    static const rhs_number_type yyrhs_[];\n    /// For each rule, the index of the first RHS symbol in \\a yyrhs_.\n    static const unsigned char yyprhs_[];\n    /// For each rule, its source line number.\n    static const unsigned char yyrline_[];\n    /// For each scanner token number, its symbol number.\n    static const unsigned short int yytoken_number_[];\n    /// Report on the debug stream that the rule \\a r is going to be reduced.\n    virtual void yy_reduce_print_ (int r);\n    /// Print the state stack on the debug stream.\n    virtual void yystack_print_ ();\n\n    /* Debugging.  */\n    int yydebug_;\n    std::ostream* yycdebug_;\n#endif\n\n    /// Convert a scanner token number \\a t to a symbol number.\n    token_number_type yytranslate_ (int t);\n\n    /// \\brief Reclaim the memory associated to a symbol.\n    /// \\param yymsg        Why this token is reclaimed.\n    ///                     If null, do not display the symbol, just free it.\n    /// \\param yytype       The symbol type.\n    /// \\param yyvaluep     Its semantic value.\n    /// \\param yylocationp  Its location.\n    inline void yydestruct_ (const char* yymsg,\n\t\t\t     int yytype,\n\t\t\t     semantic_type* yyvaluep,\n\t\t\t     location_type* yylocationp);\n\n    /// Pop \\a n symbols the three stacks.\n    inline void yypop_ (unsigned int n = 1);\n\n    /* Constants.  */\n    static const int yyeof_;\n    /* LAST_ -- Last index in TABLE_.  */\n    static const int yylast_;\n    static const int yynnts_;\n    static const int yyempty_;\n    static const int yyfinal_;\n    static const int yyterror_;\n    static const int yyerrcode_;\n    static const int yyntokens_;\n    static const unsigned int yyuser_token_number_max_;\n    static const token_number_type yyundef_token_;\n\n    /* User arguments.  */\n    QJson::ParserPrivate* driver;\n  };\n\n} // yy\n/* Line 33 of lalr1.cc  */\n#line 297 \"json_parser.hh\"\n\n\n\n#endif /* !YY_YY_JSON_PARSER_HH_INCLUDED  */\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/json_parser.yy",
    "content": "/* This file is part of QJSon\n  *\n  * Copyright (C) 2008 Flavio Castelli <flavio.castelli@gmail.com>\n  * Copyright (C) 2013 Silvio Moioli <silvio@moioli.net>\n  *\n  * This library is free software; you can redistribute it and/or\n  * modify it under the terms of the GNU Lesser General Public\n  * License version 2.1, as published by the Free Software Foundation.\n  * \n  *\n  * This library is distributed in the hope that it will be useful,\n  * but WITHOUT ANY WARRANTY; without even the implied warranty of\n  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n  * Lesser General Public License for more details.\n  *\n  * You should have received a copy of the GNU Lesser General Public License\n  * along with this library; see the file COPYING.LIB.  If not, write to\n  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n  * Boston, MA 02110-1301, USA.\n  */\n\n%skeleton \"lalr1.cc\"\n%defines\n%define \"parser_class_name\" \"json_parser\"\n\n%code requires{\n  #include \"parser_p.h\"\n  #include \"json_scanner.h\"\n  #include \"qjson_debug.h\"\n\n  #include <QtCore/QByteArray>\n  #include <QtCore/QMap>\n  #include <QtCore/QString>\n  #include <QtCore/QVariant>\n\n  #include <limits>\n\n  class JSonScanner;\n\n  namespace QJson {\n    class Parser;\n  }\n\n  #define YYERROR_VERBOSE 1\n  \n  Q_DECLARE_METATYPE(QVector<QVariant>*)\n  Q_DECLARE_METATYPE(QVariantMap*)\n}\n\n%parse-param { QJson::ParserPrivate* driver }\n%lex-param { QJson::ParserPrivate* driver }\n\n%locations\n\n%debug\n%error-verbose\n\n%token END 0 \"end of file\"\n\n%token CURLY_BRACKET_OPEN 1 \"{\"\n%token CURLY_BRACKET_CLOSE 2 \"}\"\n%token SQUARE_BRACKET_OPEN 3 \"[\"\n%token SQUARE_BRACKET_CLOSE 4 \"]\"\n%token COLON 5 \":\"\n%token COMMA 6 \",\"\n\n%token NUMBER 7 \"number\"\n%token TRUE_VAL 8 \"true\"\n%token FALSE_VAL 9 \"false\"\n%token NULL_VAL 10 \"null\"\n%token STRING 11 \"string\"\n\n%token INVALID 12 \"invalid\"\n\n// define the initial token\n%start start\n\n%%\n\n// grammar rules\n\nstart: data {\n              driver->m_result = $1;\n              qjsonDebug() << \"json_parser - parsing finished\";\n            };\n\ndata: value { $$ = $1; }\n      | error\n          {\n            qCritical()<< \"json_parser - syntax error found, \"\n                    << \"forcing abort, Line\" << @$.begin.line << \"Column\" << @$.begin.column;\n            YYABORT;\n          };\n\nobject: CURLY_BRACKET_OPEN CURLY_BRACKET_CLOSE {\n          $$ = QVariant(QVariantMap());\n        }\n     |  CURLY_BRACKET_OPEN members CURLY_BRACKET_CLOSE {\n          QVariantMap* map = $2.value<QVariantMap*>();\n          $$ = QVariant(*map);\n          delete map;\n     };\n\nmembers: STRING COLON value {\n          QVariantMap* pair = new QVariantMap();\n          pair->insert($1.toString(), $3);\n          $$.setValue<QVariantMap* >(pair);\n        }\n      |  members COMMA STRING COLON value {\n            $$.value<QVariantMap*>()->insert($3.toString(), $5);\n         };\n\narray:  SQUARE_BRACKET_OPEN SQUARE_BRACKET_CLOSE {\n          $$ = QVariant(QVariantList());\n        }\n    |   SQUARE_BRACKET_OPEN values SQUARE_BRACKET_CLOSE { \n          QVector<QVariant>* list = $2.value<QVector<QVariant>* >();\n          $$ = QVariant(list->toList());\n          delete list;\n        };\n\nvalues: value {\n          QVector<QVariant>* list = new QVector<QVariant>(1);\n          list->replace(0, $1);\n          $$.setValue(list);\n        }\n     |  values COMMA value {\n          $$.value<QVector<QVariant>* >()->append($3);\n        };\n\nvalue: STRING\n    |  NUMBER\n    |  TRUE_VAL\n    |  FALSE_VAL\n    |  NULL_VAL\n    |  object\n    |  array;\n\n%%\n\nint yy::yylex(YYSTYPE *yylval, yy::location *yylloc, QJson::ParserPrivate* driver)\n{\n  JSonScanner* scanner = driver->m_scanner;\n  yylval->clear();\n  int ret = scanner->yylex(yylval, yylloc);\n\n  qjsonDebug() << \"json_parser::yylex - calling scanner yylval==|\"\n           << yylval->toByteArray() << \"|, ret==|\" << QString::number(ret) << \"|\";\n  \n  return ret;\n}\n\nvoid yy::json_parser::error (const yy::location& yyloc, const std::string& error)\n{\n  /*qjsonDebug() << yyloc.begin.line;\n  qjsonDebug() << yyloc.begin.column;\n  qjsonDebug() << yyloc.end.line;\n  qjsonDebug() << yyloc.end.column;*/\n  qjsonDebug() << \"json_parser::error [line\" << yyloc.end.line << \"] -\" << error.c_str() ;\n  driver->setError(QString::fromLatin1(error.c_str()), yyloc.end.line);\n}\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/json_scanner.cc",
    "content": "#line 2 \"json_scanner.cc\"\n\n#line 4 \"json_scanner.cc\"\n\n#define  YY_INT_ALIGNED short int\n\n/* A lexical scanner generated by flex */\n\n#define FLEX_SCANNER\n#define YY_FLEX_MAJOR_VERSION 2\n#define YY_FLEX_MINOR_VERSION 5\n#define YY_FLEX_SUBMINOR_VERSION 37\n#if YY_FLEX_SUBMINOR_VERSION > 0\n#define FLEX_BETA\n#endif\n\n    /* The c++ scanner is a mess. The FlexLexer.h header file relies on the\n     * following macro. This is required in order to pass the c++-multiple-scanners\n     * test in the regression suite. We get reports that it breaks inheritance.\n     * We will address this in a future release of flex, or omit the C++ scanner\n     * altogether.\n     */\n    #define yyFlexLexer yyFlexLexer\n\n/* First, we deal with  platform-specific or compiler-specific issues. */\n\n/* begin standard C headers. */\n\n/* end standard C headers. */\n\n/* flex integer type definitions */\n\n#ifndef FLEXINT_H\n#define FLEXINT_H\n\n/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */\n\n#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n\n/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,\n * if you want the limit (max/min) macros for int types. \n */\n#ifndef __STDC_LIMIT_MACROS\n#define __STDC_LIMIT_MACROS 1\n#endif\n\n#include <inttypes.h>\ntypedef int8_t flex_int8_t;\ntypedef uint8_t flex_uint8_t;\ntypedef int16_t flex_int16_t;\ntypedef uint16_t flex_uint16_t;\ntypedef int32_t flex_int32_t;\ntypedef uint32_t flex_uint32_t;\n#else\ntypedef signed char flex_int8_t;\ntypedef short int flex_int16_t;\ntypedef int flex_int32_t;\ntypedef unsigned char flex_uint8_t; \ntypedef unsigned short int flex_uint16_t;\ntypedef unsigned int flex_uint32_t;\n\n/* Robomongo:\n      To fix macro redefinition compiler warnings\n\n// Limits of integral types\n#ifndef INT8_MIN\n#define INT8_MIN               (-128)\n#endif\n#ifndef INT16_MIN\n#define INT16_MIN              (-32767-1)\n#endif\n#ifndef INT32_MIN\n#define INT32_MIN              (-2147483647-1)\n#endif\n#ifndef INT8_MAX\n#define INT8_MAX               (127)\n#endif\n#ifndef INT16_MAX\n#define INT16_MAX              (32767)\n#endif\n#ifndef INT32_MAX\n#define INT32_MAX              (2147483647)\n#endif\n#ifndef UINT8_MAX\n#define UINT8_MAX              (255U)\n#endif\n#ifndef UINT16_MAX\n#define UINT16_MAX             (65535U)\n#endif\n#ifndef UINT32_MAX\n#define UINT32_MAX             (4294967295U)\n#endif\n*/\n\n#endif /* ! C99 */\n\n#endif /* ! FLEXINT_H */\n\n/* begin standard C++ headers. */\n#include <iostream> \n#include <errno.h>\n#include <cstdlib>\n#include <cstdio>\n#include <cstring>\n/* end standard C++ headers. */\n\n#ifdef __cplusplus\n\n/* The \"const\" storage-class-modifier is valid. */\n#define YY_USE_CONST\n\n#else\t/* ! __cplusplus */\n\n/* C99 requires __STDC__ to be defined as 1. */\n#if defined (__STDC__)\n\n#define YY_USE_CONST\n\n#endif\t/* defined (__STDC__) */\n#endif\t/* ! __cplusplus */\n\n#ifdef YY_USE_CONST\n#define yyconst const\n#else\n#define yyconst\n#endif\n\n/* Returned upon end-of-file. */\n#define YY_NULL 0\n\n/* Promotes a possibly negative, possibly signed char to an unsigned\n * integer for use as an array index.  If the signed char is negative,\n * we want to instead treat it as an 8-bit unsigned char, hence the\n * double cast.\n */\n#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)\n\n/* Enter a start condition.  This macro really ought to take a parameter,\n * but we do it the disgusting crufty way forced on us by the ()-less\n * definition of BEGIN.\n */\n#define BEGIN (yy_start) = 1 + 2 *\n\n/* Translate the current start state into a value that can be later handed\n * to BEGIN to return to the state.  The YYSTATE alias is for lex\n * compatibility.\n */\n#define YY_START (((yy_start) - 1) / 2)\n#define YYSTATE YY_START\n\n/* Action number for EOF rule of a given start state. */\n#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)\n\n/* Special action meaning \"start processing a new file\". */\n#define YY_NEW_FILE yyrestart( yyin  )\n\n#define YY_END_OF_BUFFER_CHAR 0\n\n/* Size of default input buffer. */\n#ifndef YY_BUF_SIZE\n#define YY_BUF_SIZE 16384\n#endif\n\n/* The state buf must be large enough to hold one state per character in the main buffer.\n */\n#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))\n\n#ifndef YY_TYPEDEF_YY_BUFFER_STATE\n#define YY_TYPEDEF_YY_BUFFER_STATE\ntypedef struct yy_buffer_state *YY_BUFFER_STATE;\n#endif\n\n#ifndef YY_TYPEDEF_YY_SIZE_T\n#define YY_TYPEDEF_YY_SIZE_T\ntypedef size_t yy_size_t;\n#endif\n\nextern yy_size_t yyleng;\n\n#define EOB_ACT_CONTINUE_SCAN 0\n#define EOB_ACT_END_OF_FILE 1\n#define EOB_ACT_LAST_MATCH 2\n\n    #define YY_LESS_LINENO(n)\n    \n/* Return all but the first \"n\" matched characters back to the input stream. */\n#define yyless(n) \\\n\tdo \\\n\t\t{ \\\n\t\t/* Undo effects of setting up yytext. */ \\\n        int yyless_macro_arg = (n); \\\n        YY_LESS_LINENO(yyless_macro_arg);\\\n\t\t*yy_cp = (yy_hold_char); \\\n\t\tYY_RESTORE_YY_MORE_OFFSET \\\n\t\t(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \\\n\t\tYY_DO_BEFORE_ACTION; /* set up yytext again */ \\\n\t\t} \\\n\twhile ( 0 )\n\n#define unput(c) yyunput( c, (yytext_ptr)  )\n\n#ifndef YY_STRUCT_YY_BUFFER_STATE\n#define YY_STRUCT_YY_BUFFER_STATE\nstruct yy_buffer_state\n\t{\n\n\tstd::istream* yy_input_file;\n\n\tchar *yy_ch_buf;\t\t/* input buffer */\n\tchar *yy_buf_pos;\t\t/* current position in input buffer */\n\n\t/* Size of input buffer in bytes, not including room for EOB\n\t * characters.\n\t */\n\tyy_size_t yy_buf_size;\n\n\t/* Number of characters read into yy_ch_buf, not including EOB\n\t * characters.\n\t */\n\tyy_size_t yy_n_chars;\n\n\t/* Whether we \"own\" the buffer - i.e., we know we created it,\n\t * and can realloc() it to grow it, and should free() it to\n\t * delete it.\n\t */\n\tint yy_is_our_buffer;\n\n\t/* Whether this is an \"interactive\" input source; if so, and\n\t * if we're using stdio for input, then we want to use getc()\n\t * instead of fread(), to make sure we stop fetching input after\n\t * each newline.\n\t */\n\tint yy_is_interactive;\n\n\t/* Whether we're considered to be at the beginning of a line.\n\t * If so, '^' rules will be active on the next match, otherwise\n\t * not.\n\t */\n\tint yy_at_bol;\n\n    int yy_bs_lineno; /**< The line count. */\n    int yy_bs_column; /**< The column count. */\n    \n\t/* Whether to try to fill the input buffer when we reach the\n\t * end of it.\n\t */\n\tint yy_fill_buffer;\n\n\tint yy_buffer_status;\n\n#define YY_BUFFER_NEW 0\n#define YY_BUFFER_NORMAL 1\n\t/* When an EOF's been seen but there's still some text to process\n\t * then we mark the buffer as YY_EOF_PENDING, to indicate that we\n\t * shouldn't try reading from the input source any more.  We might\n\t * still have a bunch of tokens to match, though, because of\n\t * possible backing-up.\n\t *\n\t * When we actually see the EOF, we change the status to \"new\"\n\t * (via yyrestart()), so that the user can continue scanning by\n\t * just pointing yyin at a new input file.\n\t */\n#define YY_BUFFER_EOF_PENDING 2\n\n\t};\n#endif /* !YY_STRUCT_YY_BUFFER_STATE */\n\n/* We provide macros for accessing buffer states in case in the\n * future we want to put the buffer states in a more general\n * \"scanner state\".\n *\n * Returns the top of the stack, or NULL.\n */\n#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \\\n                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \\\n                          : NULL)\n\n/* Same as previous macro, but useful when we know that the buffer stack is not\n * NULL or when we need an lvalue. For internal use only.\n */\n#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]\n\nvoid *yyalloc (yy_size_t  );\nvoid *yyrealloc (void *,yy_size_t  );\nvoid yyfree (void *  );\n\n#define yy_new_buffer yy_create_buffer\n\n#define yy_set_interactive(is_interactive) \\\n\t{ \\\n\tif ( ! YY_CURRENT_BUFFER ){ \\\n        yyensure_buffer_stack (); \\\n\t\tYY_CURRENT_BUFFER_LVALUE =    \\\n            yy_create_buffer( yyin, YY_BUF_SIZE ); \\\n\t} \\\n\tYY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \\\n\t}\n\n#define yy_set_bol(at_bol) \\\n\t{ \\\n\tif ( ! YY_CURRENT_BUFFER ){\\\n        yyensure_buffer_stack (); \\\n\t\tYY_CURRENT_BUFFER_LVALUE =    \\\n            yy_create_buffer( yyin, YY_BUF_SIZE ); \\\n\t} \\\n\tYY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \\\n\t}\n\n#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)\n\n#define YY_SKIP_YYWRAP\n\ntypedef unsigned char YY_CHAR;\n\n#define yytext_ptr yytext\n\n#include <FlexLexer.h>\n\nint yyFlexLexer::yywrap() { return 1; }\nint yyFlexLexer::yylex()\n\t{\n\tLexerError( \"yyFlexLexer::yylex invoked but %option yyclass used\" );\n\treturn 0;\n\t}\n\n#define YY_DECL int JSonScanner::yylex()\nstatic yyconst flex_int16_t yy_nxt[][256] =\n    {\n    {\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0\n    },\n\n    {\n        9,   10,   10,   10,   10,   10,   10,   10,   10,   11,\n       12,   11,   11,   13,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   11,   10,   14,   10,   10,   10,   10,   10,\n\n       10,   10,   10,   10,   15,   16,   10,   10,   17,   18,\n       18,   18,   18,   18,   18,   18,   18,   18,   19,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   20,   10,   21,   10,   10,   10,   10,   10,   10,\n       10,   10,   22,   10,   10,   10,   10,   10,   10,   10,\n       23,   10,   10,   10,   10,   10,   24,   10,   10,   10,\n       10,   10,   10,   25,   10,   26,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10\n    },\n\n    {\n        9,   10,   10,   10,   10,   10,   10,   10,   10,   11,\n       12,   11,   11,   13,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   11,   10,   14,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   15,   16,   10,   10,   17,   18,\n       18,   18,   18,   18,   18,   18,   18,   18,   19,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   20,   10,   21,   10,   10,   10,   10,   10,   10,\n       10,   10,   22,   10,   10,   10,   10,   10,   10,   10,\n       23,   10,   10,   10,   10,   10,   24,   10,   10,   10,\n       10,   10,   10,   25,   10,   26,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10\n    },\n\n    {\n        9,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   28,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   29,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27\n    },\n\n    {\n        9,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   28,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   29,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,\n       27,   27,   27,   27,   27,   27\n\n    },\n\n    {\n        9,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   31,   31,\n       31,   31,   31,   31,   31,   31,   31,   31,   30,   30,\n       30,   30,   30,   30,   30,   31,   31,   31,   31,   31,\n       31,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   31,   31,   31,\n\n       31,   31,   31,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30\n    },\n\n    {\n        9,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n\n       30,   30,   30,   30,   30,   30,   30,   30,   31,   31,\n       31,   31,   31,   31,   31,   31,   31,   31,   30,   30,\n       30,   30,   30,   30,   30,   31,   31,   31,   31,   31,\n       31,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   31,   31,   31,\n       31,   31,   31,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n\n       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,\n       30,   30,   30,   30,   30,   30\n    },\n\n    {\n        9,   10,   10,   10,   10,   10,   10,   10,   10,   11,\n       12,   11,   11,   13,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   11,   10,   14,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   15,   32,   10,   10,   17,   18,\n       18,   18,   18,   18,   18,   18,   18,   18,   19,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   33,   10,   10,   10,   10,   34,   10,\n\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   20,   10,   21,   10,   10,   10,   10,   10,   10,\n       10,   10,   22,   10,   10,   33,   10,   10,   10,   10,\n       35,   10,   10,   10,   10,   10,   24,   10,   10,   10,\n       10,   10,   10,   25,   10,   26,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10\n    },\n\n    {\n        9,   10,   10,   10,   10,   10,   10,   10,   10,   11,\n       12,   11,   11,   13,   10,   10,   10,   10,   10,   10,\n\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   11,   10,   14,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   15,   32,   10,   10,   17,   18,\n       18,   18,   18,   18,   18,   18,   18,   18,   19,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   33,   10,   10,   10,   10,   34,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   20,   10,   21,   10,   10,   10,   10,   10,   10,\n       10,   10,   22,   10,   10,   33,   10,   10,   10,   10,\n       35,   10,   10,   10,   10,   10,   24,   10,   10,   10,\n\n       10,   10,   10,   25,   10,   26,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,\n       10,   10,   10,   10,   10,   10\n    },\n\n    {\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,   -9,\n       -9,   -9,   -9,   -9,   -9,   -9\n\n    },\n\n    {\n        9,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,  -10,\n      -10,  -10,  -10,  -10,  -10,  -10\n    },\n\n    {\n        9,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,   36,\n      -11,   36,   36,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,   36,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n\n      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,\n      -11,  -11,  -11,  -11,  -11,  -11\n    },\n\n    {\n        9,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n       37,  -12,  -12,   37,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,\n      -12,  -12,  -12,  -12,  -12,  -12\n    },\n\n    {\n        9,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n       37,  -13,  -13,   37,  -13,  -13,  -13,  -13,  -13,  -13,\n\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,\n      -13,  -13,  -13,  -13,  -13,  -13\n    },\n\n    {\n        9,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,\n      -14,  -14,  -14,  -14,  -14,  -14\n\n    },\n\n    {\n        9,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,\n      -15,  -15,  -15,  -15,  -15,  -15\n    },\n\n    {\n        9,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,   38,   39,\n       39,   39,   39,   39,   39,   39,   39,   39,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n\n      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,\n      -16,  -16,  -16,  -16,  -16,  -16\n    },\n\n    {\n        9,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,   40,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,   41,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,   41,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,\n      -17,  -17,  -17,  -17,  -17,  -17\n    },\n\n    {\n        9,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,   40,  -18,   42,   42,\n       42,   42,   42,   42,   42,   42,   42,   42,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,   41,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,   41,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,\n      -18,  -18,  -18,  -18,  -18,  -18\n    },\n\n    {\n        9,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,\n      -19,  -19,  -19,  -19,  -19,  -19\n\n    },\n\n    {\n        9,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,\n      -20,  -20,  -20,  -20,  -20,  -20\n    },\n\n    {\n        9,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n\n      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,\n      -21,  -21,  -21,  -21,  -21,  -21\n    },\n\n    {\n        9,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,   43,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,\n      -22,  -22,  -22,  -22,  -22,  -22\n    },\n\n    {\n        9,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,   44,  -23,  -23,\n\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,\n      -23,  -23,  -23,  -23,  -23,  -23\n    },\n\n    {\n        9,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,   45,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,\n      -24,  -24,  -24,  -24,  -24,  -24\n\n    },\n\n    {\n        9,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,\n      -25,  -25,  -25,  -25,  -25,  -25\n    },\n\n    {\n        9,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n\n      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,\n      -26,  -26,  -26,  -26,  -26,  -26\n    },\n\n    {\n        9,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,  -27,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,  -27,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46\n    },\n\n    {\n        9,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,\n      -28,  -28,  -28,  -28,  -28,  -28\n    },\n\n    {\n        9,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,   47,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,   48,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,   49,  -29,  -29,  -29,  -29,  -29,   50,  -29,\n      -29,  -29,   51,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n       52,  -29,  -29,  -29,   53,  -29,   54,   55,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,\n      -29,  -29,  -29,  -29,  -29,  -29\n\n    },\n\n    {\n        9,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,\n      -30,  -30,  -30,  -30,  -30,  -30\n    },\n\n    {\n        9,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,   56,   56,\n       56,   56,   56,   56,   56,   56,   56,   56,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,   56,   56,   56,   56,   56,\n       56,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,   56,   56,   56,\n       56,   56,   56,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n\n      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,\n      -31,  -31,  -31,  -31,  -31,  -31\n    },\n\n    {\n        9,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,   38,   39,\n       39,   39,   39,   39,   39,   39,   39,   39,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,   57,  -32,  -32,  -32,  -32,  -32,  -32,\n\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,   57,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,\n      -32,  -32,  -32,  -32,  -32,  -32\n    },\n\n    {\n        9,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n       58,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,\n      -33,  -33,  -33,  -33,  -33,  -33\n    },\n\n    {\n        9,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n\n      -34,  -34,  -34,  -34,  -34,   59,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,   59,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,\n      -34,  -34,  -34,  -34,  -34,  -34\n\n    },\n\n    {\n        9,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,   59,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,   59,  -35,  -35,\n\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,   44,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,\n      -35,  -35,  -35,  -35,  -35,  -35\n    },\n\n    {\n        9,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,   36,\n      -36,   36,   36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,   36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n\n      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,\n      -36,  -36,  -36,  -36,  -36,  -36\n    },\n\n    {\n        9,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n       37,  -37,  -37,   37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,\n      -37,  -37,  -37,  -37,  -37,  -37\n    },\n\n    {\n        9,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,   40,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,   41,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,   41,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,\n      -38,  -38,  -38,  -38,  -38,  -38\n    },\n\n    {\n        9,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,   40,  -39,   60,   60,\n       60,   60,   60,   60,   60,   60,   60,   60,  -39,  -39,\n\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,   41,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,   41,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,\n      -39,  -39,  -39,  -39,  -39,  -39\n\n    },\n\n    {\n        9,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,   61,   61,\n       61,   61,   61,   61,   61,   61,   61,   61,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,\n      -40,  -40,  -40,  -40,  -40,  -40\n    },\n\n    {\n        9,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n\n      -41,  -41,  -41,   62,  -41,   62,  -41,  -41,   63,   63,\n       63,   63,   63,   63,   63,   63,   63,   63,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n\n      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,\n      -41,  -41,  -41,  -41,  -41,  -41\n    },\n\n    {\n        9,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,   40,  -42,   42,   42,\n       42,   42,   42,   42,   42,   42,   42,   42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,   41,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,   41,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,\n      -42,  -42,  -42,  -42,  -42,  -42\n    },\n\n    {\n        9,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,   64,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,\n      -43,  -43,  -43,  -43,  -43,  -43\n    },\n\n    {\n        9,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,   65,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,\n      -44,  -44,  -44,  -44,  -44,  -44\n\n    },\n\n    {\n        9,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,   66,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,\n      -45,  -45,  -45,  -45,  -45,  -45\n    },\n\n    {\n        9,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,  -46,   46,   46,   46,   46,   46,\n\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,  -46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n\n       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,\n       46,   46,   46,   46,   46,   46\n    },\n\n    {\n        9,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,\n      -47,  -47,  -47,  -47,  -47,  -47\n    },\n\n    {\n        9,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,\n      -48,  -48,  -48,  -48,  -48,  -48\n    },\n\n    {\n        9,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,\n      -49,  -49,  -49,  -49,  -49,  -49\n\n    },\n\n    {\n        9,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,\n      -50,  -50,  -50,  -50,  -50,  -50\n    },\n\n    {\n        9,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n\n      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,\n      -51,  -51,  -51,  -51,  -51,  -51\n    },\n\n    {\n        9,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,\n      -52,  -52,  -52,  -52,  -52,  -52\n    },\n\n    {\n        9,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,\n      -53,  -53,  -53,  -53,  -53,  -53\n    },\n\n    {\n        9,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,\n      -54,  -54,  -54,  -54,  -54,  -54\n\n    },\n\n    {\n        9,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,\n      -55,  -55,  -55,  -55,  -55,  -55\n    },\n\n    {\n        9,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,   67,   67,\n       67,   67,   67,   67,   67,   67,   67,   67,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,   67,   67,   67,   67,   67,\n       67,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,   67,   67,   67,\n       67,   67,   67,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n\n      -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,\n      -56,  -56,  -56,  -56,  -56,  -56\n    },\n\n    {\n        9,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n       68,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,\n      -57,  -57,  -57,  -57,  -57,  -57\n    },\n\n    {\n        9,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,   69,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,\n      -58,  -58,  -58,  -58,  -58,  -58\n    },\n\n    {\n        9,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,   70,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n       70,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,\n      -59,  -59,  -59,  -59,  -59,  -59\n\n    },\n\n    {\n        9,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,   40,  -60,   60,   60,\n       60,   60,   60,   60,   60,   60,   60,   60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,   41,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n\n      -60,   41,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,\n      -60,  -60,  -60,  -60,  -60,  -60\n    },\n\n    {\n        9,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,   61,   61,\n       61,   61,   61,   61,   61,   61,   61,   61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,   41,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,   41,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n\n      -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,\n      -61,  -61,  -61,  -61,  -61,  -61\n    },\n\n    {\n        9,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,   63,   63,\n       63,   63,   63,   63,   63,   63,   63,   63,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,\n      -62,  -62,  -62,  -62,  -62,  -62\n    },\n\n    {\n        9,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,   63,   63,\n       63,   63,   63,   63,   63,   63,   63,   63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,\n      -63,  -63,  -63,  -63,  -63,  -63\n    },\n\n    {\n        9,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,   71,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,\n      -64,  -64,  -64,  -64,  -64,  -64\n\n    },\n\n    {\n        9,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,   72,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,\n      -65,  -65,  -65,  -65,  -65,  -65\n    },\n\n    {\n        9,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,   73,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n\n      -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,\n      -66,  -66,  -66,  -66,  -66,  -66\n    },\n\n    {\n        9,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,   74,   74,\n       74,   74,   74,   74,   74,   74,   74,   74,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,   74,   74,   74,   74,   74,\n       74,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,   74,   74,   74,\n       74,   74,   74,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,\n      -67,  -67,  -67,  -67,  -67,  -67\n    },\n\n    {\n        9,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,   75,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,\n      -68,  -68,  -68,  -68,  -68,  -68\n    },\n\n    {\n        9,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,   76,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,\n      -69,  -69,  -69,  -69,  -69,  -69\n\n    },\n\n    {\n        9,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,\n      -70,  -70,  -70,  -70,  -70,  -70\n    },\n\n    {\n        9,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,   77,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n\n      -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,\n      -71,  -71,  -71,  -71,  -71,  -71\n    },\n\n    {\n        9,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,\n      -72,  -72,  -72,  -72,  -72,  -72\n    },\n\n    {\n        9,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,\n      -73,  -73,  -73,  -73,  -73,  -73\n    },\n\n    {\n        9,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,\n      -74,  -74,  -74,  -74,  -74,  -74\n\n    },\n\n    {\n        9,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n\n      -75,  -75,  -75,  -75,  -75,   78,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,\n      -75,  -75,  -75,  -75,  -75,  -75\n    },\n\n    {\n        9,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n       79,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n\n      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,\n      -76,  -76,  -76,  -76,  -76,  -76\n    },\n\n    {\n        9,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,  -77,\n      -77,  -77,  -77,  -77,  -77,  -77\n    },\n\n    {\n        9,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n       80,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,\n      -78,  -78,  -78,  -78,  -78,  -78\n    },\n\n    {\n        9,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,   81,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,\n      -79,  -79,  -79,  -79,  -79,  -79\n\n    },\n\n    {\n        9,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n\n      -80,  -80,  -80,  -80,  -80,   82,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,\n      -80,  -80,  -80,  -80,  -80,  -80\n    },\n\n    {\n        9,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,   83,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n\n      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,\n      -81,  -81,  -81,  -81,  -81,  -81\n    },\n\n    {\n        9,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,   84,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,\n      -82,  -82,  -82,  -82,  -82,  -82\n    },\n\n    {\n        9,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n\n      -83,   85,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,\n      -83,  -83,  -83,  -83,  -83,  -83\n    },\n\n    {\n        9,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,   86,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,\n      -84,  -84,  -84,  -84,  -84,  -84\n\n    },\n\n    {\n        9,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,\n      -85,  -85,  -85,  -85,  -85,  -85\n    },\n\n    {\n        9,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n\n      -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,\n      -86,  -86,  -86,  -86,  -86,  -86\n    },\n\n    } ;\n\n/* Done after the current pattern has been matched and before the\n * corresponding action - sets up yytext.\n */\n#define YY_DO_BEFORE_ACTION \\\n\t(yytext_ptr) = yy_bp; \\\n\tyyleng = (size_t) (yy_cp - yy_bp); \\\n\t(yy_hold_char) = *yy_cp; \\\n\t*yy_cp = '\\0'; \\\n\t(yy_c_buf_p) = yy_cp;\n\n#define YY_NUM_RULES 36\n#define YY_END_OF_BUFFER 37\n/* This struct is not used in this scanner,\n   but its presence is necessary. */\nstruct yy_trans_info\n\t{\n\tflex_int32_t yy_verify;\n\tflex_int32_t yy_nxt;\n\t};\nstatic yyconst flex_int16_t yy_accept[87] =\n    {   0,\n        0,    0,    0,    0,    0,    0,    0,    0,   37,   35,\n        1,    2,    2,   11,   27,   35,    6,    6,   26,   28,\n       29,   35,   35,   35,   30,   31,   21,   23,   22,   25,\n       25,   35,   35,   35,   35,    1,    2,    8,    8,    0,\n        0,    7,    0,    0,    0,   21,   12,   14,   13,   15,\n       16,   17,   18,   19,   20,    0,    0,    0,    0,    9,\n       10,    0,   10,    0,    0,    0,    0,    0,    0,   32,\n        0,    5,    3,   24,    0,    0,    4,    0,    0,    0,\n        0,    0,    0,    0,   33,   34\n    } ;\n\nstatic yyconst yy_state_type yy_NUL_trans[87] =\n    {   0,\n       10,   10,   27,   27,   30,   30,   10,   10,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,   46,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,   46,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0\n    } ;\n\n/* The intent behind this definition is that it'll catch\n * any uses of REJECT which flex missed.\n */\n#define REJECT reject_used_but_not_detected\n#define yymore() yymore_used_but_not_detected\n#define YY_MORE_ADJ 0\n#define YY_RESTORE_YY_MORE_OFFSET\n#line 1 \"json_scanner.yy\"\n/* This file is part of QJson\n *\n * Copyright (C) 2013 Silvio Moioli <silvio@moioli.net>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License version 2.1, as published by the Free Software Foundation.\n * \n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this library; see the file COPYING.LIB.  If not, write to\n * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n * Boston, MA 02110yy::json_parser::token::INVALID301, USA.\n */\n/* Flex output settings */\n#define YY_NO_UNISTD_H 1\n#define YY_NO_INPUT 1\n#line 29 \"json_scanner.yy\"\n  #include \"json_scanner.h\"\n  #include \"json_parser.hh\"\n\n  #if defined(_WIN32) && !defined(__MINGW32__)\n  #define strtoll _strtoi64\n  #define strtoull _strtoui64\n  #endif\n\n  #define YY_USER_INIT if(m_allowSpecialNumbers) { \\\n    BEGIN(ALLOW_SPECIAL_NUMBERS); \\\n  }\n/* Exclusive subscanners for strings and escaped hex sequences */\n\n/* Extra-JSON rules active iff m_allowSpecialNumbers is true */\n\n#line 3168 \"json_scanner.cc\"\n\n#define INITIAL 0\n#define QUOTMARK_OPEN 1\n#define HEX_OPEN 2\n#define ALLOW_SPECIAL_NUMBERS 3\n\n#ifndef YY_NO_UNISTD_H\n/* Special case for \"unistd.h\", since it is non-ANSI. We include it way\n * down here because we want the user's section 1 to have been scanned first.\n * The user has a chance to override it with an option.\n */\n#include <unistd.h>\n#endif\n\n#ifndef YY_EXTRA_TYPE\n#define YY_EXTRA_TYPE void *\n#endif\n\n#ifndef yytext_ptr\nstatic void yy_flex_strncpy (char *,yyconst char *,int );\n#endif\n\n#ifdef YY_NEED_STRLEN\nstatic int yy_flex_strlen (yyconst char * );\n#endif\n\n#ifndef YY_NO_INPUT\n\n#endif\n\n/* Amount of stuff to slurp up with each read. */\n#ifndef YY_READ_BUF_SIZE\n#define YY_READ_BUF_SIZE 8192\n#endif\n\n/* Copy whatever the last rule matched to the standard output. */\n#ifndef ECHO\n#define ECHO LexerOutput( yytext, yyleng )\n#endif\n\n/* Gets input and stuffs it into \"buf\".  number of characters read, or YY_NULL,\n * is returned in \"result\".\n */\n#ifndef YY_INPUT\n#define YY_INPUT(buf,result,max_size) \\\n\\\n\tif ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \\\n\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" );\n\n#endif\n\n/* No semi-colon after return; correct usage is to write \"yyterminate();\" -\n * we don't want an extra ';' after the \"return\" because that will cause\n * some compilers to complain about unreachable statements.\n */\n#ifndef yyterminate\n#define yyterminate() return YY_NULL\n#endif\n\n/* Number of entries by which start-condition stack grows. */\n#ifndef YY_START_STACK_INCR\n#define YY_START_STACK_INCR 25\n#endif\n\n/* Report a fatal error. */\n#ifndef YY_FATAL_ERROR\n#define YY_FATAL_ERROR(msg) LexerError( msg )\n#endif\n\n/* end tables serialization structures and prototypes */\n\n/* Default declaration of generated scanner - a define so the user can\n * easily add parameters.\n */\n#ifndef YY_DECL\n#define YY_DECL_IS_OURS 1\n#define YY_DECL int yyFlexLexer::yylex()\n#endif /* !YY_DECL */\n\n/* Code executed at the beginning of each rule, after yytext and yyleng\n * have been set up.\n */\n#ifndef YY_USER_ACTION\n#define YY_USER_ACTION\n#endif\n\n/* Code executed at the end of each rule. */\n#ifndef YY_BREAK\n#define YY_BREAK break;\n#endif\n\n#define YY_RULE_SETUP \\\n\tYY_USER_ACTION\n\n/** The main scanner function which does all the work.\n */\nYY_DECL\n{\n\tregister yy_state_type yy_current_state;\n\tregister char *yy_cp, *yy_bp;\n\tregister int yy_act;\n    \n#line 48 \"json_scanner.yy\"\n\n\n /* Whitespace */\n#line 3275 \"json_scanner.cc\"\n\n\tif ( !(yy_init) )\n\t\t{\n\t\t(yy_init) = 1;\n\n#ifdef YY_USER_INIT\n\t\tYY_USER_INIT;\n#endif\n\n\t\tif ( ! (yy_start) )\n\t\t\t(yy_start) = 1;\t/* first start state */\n\n\t\tif ( ! yyin )\n\t\t\tyyin = & std::cin;\n\n\t\tif ( ! yyout )\n\t\t\tyyout = & std::cout;\n\n\t\tif ( ! YY_CURRENT_BUFFER ) {\n\t\t\tyyensure_buffer_stack ();\n\t\t\tYY_CURRENT_BUFFER_LVALUE =\n\t\t\t\tyy_create_buffer( yyin, YY_BUF_SIZE );\n\t\t}\n\n\t\tyy_load_buffer_state(  );\n\t\t}\n\n\twhile ( 1 )\t\t/* loops until end-of-file is reached */\n\t\t{\n\t\tyy_cp = (yy_c_buf_p);\n\n\t\t/* Support of yytext. */\n\t\t*yy_cp = (yy_hold_char);\n\n\t\t/* yy_bp points to the position in yy_ch_buf of the start of\n\t\t * the current run.\n\t\t */\n\t\tyy_bp = yy_cp;\n\n\t\tyy_current_state = (yy_start);\nyy_match:\n\t\twhile ( (yy_current_state = yy_nxt[yy_current_state][ YY_SC_TO_UI(*yy_cp) ]) > 0 )\n\t\t\t{\n\t\t\tif ( yy_accept[yy_current_state] )\n\t\t\t\t{\n\t\t\t\t(yy_last_accepting_state) = yy_current_state;\n\t\t\t\t(yy_last_accepting_cpos) = yy_cp;\n\t\t\t\t}\n\n\t\t\t++yy_cp;\n\t\t\t}\n\n\t\tyy_current_state = -yy_current_state;\n\nyy_find_action:\n\t\tyy_act = yy_accept[yy_current_state];\n\n\t\tYY_DO_BEFORE_ACTION;\n\ndo_action:\t/* This label is used only to access EOF actions. */\n\n\t\tswitch ( yy_act )\n\t{ /* beginning of action switch */\n\t\t\tcase 0: /* must back up */\n\t\t\t/* undo the effects of YY_DO_BEFORE_ACTION */\n\t\t\t*yy_cp = (yy_hold_char);\n\t\t\tyy_cp = (yy_last_accepting_cpos) + 1;\n\t\t\tyy_current_state = (yy_last_accepting_state);\n\t\t\tgoto yy_find_action;\n\ncase 1:\nYY_RULE_SETUP\n#line 51 \"json_scanner.yy\"\n{\n                m_yylloc->columns(yyleng);\n              }\n\tYY_BREAK\ncase 2:\n/* rule 2 can match eol */\nYY_RULE_SETUP\n#line 55 \"json_scanner.yy\"\n{ \n                m_yylloc->lines(yyleng);\n              }\n\tYY_BREAK\n/* Special values */\ncase 3:\nYY_RULE_SETUP\n#line 61 \"json_scanner.yy\"\n{ \n                m_yylloc->columns(yyleng);\n                *m_yylval = QVariant(true);\n                return yy::json_parser::token::TRUE_VAL;\n              }\n\tYY_BREAK\ncase 4:\nYY_RULE_SETUP\n#line 67 \"json_scanner.yy\"\n{\n                m_yylloc->columns(yyleng);\n                *m_yylval = QVariant(false);\n                return yy::json_parser::token::FALSE_VAL;\n              }\n\tYY_BREAK\ncase 5:\nYY_RULE_SETUP\n#line 73 \"json_scanner.yy\"\n{\n                m_yylloc->columns(yyleng);\n                *m_yylval = QVariant();\n                return yy::json_parser::token::NULL_VAL;\n              }\n\tYY_BREAK\n/* Numbers */\ncase 6:\n#line 82 \"json_scanner.yy\"\ncase 7:\nYY_RULE_SETUP\n#line 82 \"json_scanner.yy\"\n{\n                m_yylloc->columns(yyleng);\n                *m_yylval = QVariant(strtoull(yytext, NULL, 10));\n                if (errno == ERANGE) {\n                    qCritical() << \"Number is out of range: \" << yytext;\n                    return yy::json_parser::token::INVALID;\n                }\n                return yy::json_parser::token::NUMBER;\n              }\n\tYY_BREAK\ncase 8:\n#line 93 \"json_scanner.yy\"\ncase 9:\nYY_RULE_SETUP\n#line 93 \"json_scanner.yy\"\n{\n                m_yylloc->columns(yyleng);\n                *m_yylval = QVariant(strtoll(yytext, NULL, 10));\n                if (errno == ERANGE) {\n                    qCritical() << \"Number is out of range: \" << yytext;\n                    return yy::json_parser::token::INVALID;\n                }\n                return yy::json_parser::token::NUMBER;\n              }\n\tYY_BREAK\ncase 10:\nYY_RULE_SETUP\n#line 103 \"json_scanner.yy\"\n{\n                m_yylloc->columns(yyleng);\n                bool ok;\n                *m_yylval = QVariant(m_C_locale.toDouble(QLatin1String(yytext),&ok));\n                if (!ok) {\n                    qCritical() << \"Number is out of range: \" << yytext;\n                    return yy::json_parser::token::INVALID;\n                }\n                return yy::json_parser::token::NUMBER;\n              }\n\tYY_BREAK\n/* Strings */              \ncase 11:\nYY_RULE_SETUP\n#line 115 \"json_scanner.yy\"\n{\n                m_yylloc->columns(yyleng);\n                BEGIN(QUOTMARK_OPEN);\n              }\n\tYY_BREAK\n\ncase 12:\nYY_RULE_SETUP\n#line 121 \"json_scanner.yy\"\n{\n                  m_currentString.append(QLatin1String(\"\\\"\"));\n                }\n\tYY_BREAK\ncase 13:\nYY_RULE_SETUP\n#line 125 \"json_scanner.yy\"\n{\n                  m_currentString.append(QLatin1String(\"\\\\\"));\n                }\n\tYY_BREAK\ncase 14:\nYY_RULE_SETUP\n#line 129 \"json_scanner.yy\"\n{\n                  m_currentString.append(QLatin1String(\"/\"));\n                }\n\tYY_BREAK\ncase 15:\nYY_RULE_SETUP\n#line 133 \"json_scanner.yy\"\n{\n                   m_currentString.append(QLatin1String(\"\\b\"));\n                }\n\tYY_BREAK\ncase 16:\nYY_RULE_SETUP\n#line 137 \"json_scanner.yy\"\n{\n                  m_currentString.append(QLatin1String(\"\\f\"));\n                }\n\tYY_BREAK\ncase 17:\nYY_RULE_SETUP\n#line 141 \"json_scanner.yy\"\n{\n                  m_currentString.append(QLatin1String(\"\\n\"));\n                }\n\tYY_BREAK\ncase 18:\nYY_RULE_SETUP\n#line 145 \"json_scanner.yy\"\n{\n                  m_currentString.append(QLatin1String(\"\\r\"));\n                }\n\tYY_BREAK\ncase 19:\nYY_RULE_SETUP\n#line 149 \"json_scanner.yy\"\n{\n                  m_currentString.append(QLatin1String(\"\\t\"));\n                }\n\tYY_BREAK\ncase 20:\nYY_RULE_SETUP\n#line 153 \"json_scanner.yy\"\n{\n                  BEGIN(HEX_OPEN);\n                }\n\tYY_BREAK\ncase 21:\n/* rule 21 can match eol */\nYY_RULE_SETUP\n#line 157 \"json_scanner.yy\"\n{\n                  m_currentString.append(QString::fromUtf8(yytext));\n                }\n\tYY_BREAK\ncase 22:\nYY_RULE_SETUP\n#line 161 \"json_scanner.yy\"\n{\n                  // ignore\n                }\n\tYY_BREAK\ncase 23:\nYY_RULE_SETUP\n#line 165 \"json_scanner.yy\"\n{\n                  m_yylloc->columns(yyleng);\n                  *m_yylval = QVariant(m_currentString);\n                  m_currentString.clear();\n                  BEGIN(INITIAL);\n                  return yy::json_parser::token::STRING;\n                }\n\tYY_BREAK\ncase YY_STATE_EOF(QUOTMARK_OPEN):\n#line 173 \"json_scanner.yy\"\n{\n                  qCritical() << \"Unterminated string\";\n                  m_yylloc->columns(yyleng);\n                  return yy::json_parser::token::INVALID;\n                }\n\tYY_BREAK\n\n\ncase 24:\nYY_RULE_SETUP\n#line 182 \"json_scanner.yy\"\n{\n                    QString hexDigits = QString::fromUtf8(yytext, yyleng);\n                    bool ok;\n                    ushort hexDigit1 = hexDigits.left(2).toShort(&ok, 16);\n                    ushort hexDigit2 = hexDigits.right(2).toShort(&ok, 16);    \n                    m_currentString.append(QChar(hexDigit2, hexDigit1));\n                    BEGIN(QUOTMARK_OPEN);\n                 }\n\tYY_BREAK\ncase 25:\n/* rule 25 can match eol */\nYY_RULE_SETUP\n#line 191 \"json_scanner.yy\"\n{\n                    qCritical() << \"Invalid hex string\";\n                    m_yylloc->columns(yyleng);\n                    *m_yylval = QVariant(QLatin1String(\"\"));\n                    BEGIN(QUOTMARK_OPEN);\n                    return yy::json_parser::token::INVALID;\n                 }\n\tYY_BREAK\n\n/* \"Compound type\" related tokens */              \ncase 26:\nYY_RULE_SETUP\n#line 203 \"json_scanner.yy\"\n{\n                m_yylloc->columns(yyleng);\n                return yy::json_parser::token::COLON;\n              }\n\tYY_BREAK\ncase 27:\nYY_RULE_SETUP\n#line 208 \"json_scanner.yy\"\n{\n                m_yylloc->columns(yyleng);\n                return yy::json_parser::token::COMMA;\n              }\n\tYY_BREAK\ncase 28:\nYY_RULE_SETUP\n#line 213 \"json_scanner.yy\"\n{\n                m_yylloc->columns(yyleng);\n                return yy::json_parser::token::SQUARE_BRACKET_OPEN;\n              }\n\tYY_BREAK\ncase 29:\nYY_RULE_SETUP\n#line 218 \"json_scanner.yy\"\n{\n                m_yylloc->columns(yyleng);\n                return yy::json_parser::token::SQUARE_BRACKET_CLOSE;\n              }\n\tYY_BREAK\ncase 30:\nYY_RULE_SETUP\n#line 223 \"json_scanner.yy\"\n{\n                m_yylloc->columns(yyleng);\n                return yy::json_parser::token::CURLY_BRACKET_OPEN;\n              }\n\tYY_BREAK\ncase 31:\nYY_RULE_SETUP\n#line 228 \"json_scanner.yy\"\n{\n                m_yylloc->columns(yyleng);\n                return yy::json_parser::token::CURLY_BRACKET_CLOSE;\n              }\n\tYY_BREAK\n/* Extra-JSON numbers */\n\ncase 32:\nYY_RULE_SETUP\n#line 236 \"json_scanner.yy\"\n{\n                  m_yylloc->columns(yyleng);\n                  *m_yylval = QVariant(std::numeric_limits<double>::quiet_NaN());\n                  return yy::json_parser::token::NUMBER;\n                }\n\tYY_BREAK\ncase 33:\nYY_RULE_SETUP\n#line 242 \"json_scanner.yy\"\n{\n                    m_yylloc->columns(yyleng);\n                    *m_yylval = QVariant(std::numeric_limits<double>::infinity());\n                    return yy::json_parser::token::NUMBER;\n                }\n\tYY_BREAK\ncase 34:\nYY_RULE_SETUP\n#line 248 \"json_scanner.yy\"\n{\n                    m_yylloc->columns(yyleng);\n                    *m_yylval = QVariant(-std::numeric_limits<double>::infinity());\n                    return yy::json_parser::token::NUMBER;\n                }\n\tYY_BREAK\n\n/* If all else fails */\ncase 35:\nYY_RULE_SETUP\n#line 256 \"json_scanner.yy\"\n{\n                m_yylloc->columns(yyleng);\n                return yy::json_parser::token::INVALID;\n              }\n\tYY_BREAK\ncase YY_STATE_EOF(INITIAL):\ncase YY_STATE_EOF(HEX_OPEN):\ncase YY_STATE_EOF(ALLOW_SPECIAL_NUMBERS):\n#line 261 \"json_scanner.yy\"\nreturn yy::json_parser::token::END;\n\tYY_BREAK\ncase 36:\nYY_RULE_SETUP\n#line 262 \"json_scanner.yy\"\nECHO;\n\tYY_BREAK\n#line 3667 \"json_scanner.cc\"\n\n\tcase YY_END_OF_BUFFER:\n\t\t{\n\t\t/* Amount of text matched not including the EOB char. */\n\t\tint yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;\n\n\t\t/* Undo the effects of YY_DO_BEFORE_ACTION. */\n\t\t*yy_cp = (yy_hold_char);\n\t\tYY_RESTORE_YY_MORE_OFFSET\n\n\t\tif ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )\n\t\t\t{\n\t\t\t/* We're scanning a new file or input source.  It's\n\t\t\t * possible that this happened because the user\n\t\t\t * just pointed yyin at a new source and called\n\t\t\t * yylex().  If so, then we have to assure\n\t\t\t * consistency between YY_CURRENT_BUFFER and our\n\t\t\t * globals.  Here is the right place to do so, because\n\t\t\t * this is the first action (other than possibly a\n\t\t\t * back-up) that will match for the new input source.\n\t\t\t */\n\t\t\t(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;\n\t\t\tYY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;\n\t\t\tYY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;\n\t\t\t}\n\n\t\t/* Note that here we test for yy_c_buf_p \"<=\" to the position\n\t\t * of the first EOB in the buffer, since yy_c_buf_p will\n\t\t * already have been incremented past the NUL character\n\t\t * (since all states make transitions on EOB to the\n\t\t * end-of-buffer state).  Contrast this with the test\n\t\t * in input().\n\t\t */\n\t\tif ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )\n\t\t\t{ /* This was really a NUL. */\n\t\t\tyy_state_type yy_next_state;\n\n\t\t\t(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;\n\n\t\t\tyy_current_state = yy_get_previous_state(  );\n\n\t\t\t/* Okay, we're now positioned to make the NUL\n\t\t\t * transition.  We couldn't have\n\t\t\t * yy_get_previous_state() go ahead and do it\n\t\t\t * for us because it doesn't know how to deal\n\t\t\t * with the possibility of jamming (and we don't\n\t\t\t * want to build jamming into it because then it\n\t\t\t * will run more slowly).\n\t\t\t */\n\n\t\t\tyy_next_state = yy_try_NUL_trans( yy_current_state );\n\n\t\t\tyy_bp = (yytext_ptr) + YY_MORE_ADJ;\n\n\t\t\tif ( yy_next_state )\n\t\t\t\t{\n\t\t\t\t/* Consume the NUL. */\n\t\t\t\tyy_cp = ++(yy_c_buf_p);\n\t\t\t\tyy_current_state = yy_next_state;\n\t\t\t\tgoto yy_match;\n\t\t\t\t}\n\n\t\t\telse\n\t\t\t\t{\n\t\t\t\tyy_cp = (yy_c_buf_p);\n\t\t\t\tgoto yy_find_action;\n\t\t\t\t}\n\t\t\t}\n\n\t\telse switch ( yy_get_next_buffer(  ) )\n\t\t\t{\n\t\t\tcase EOB_ACT_END_OF_FILE:\n\t\t\t\t{\n\t\t\t\t(yy_did_buffer_switch_on_eof) = 0;\n\n\t\t\t\tif ( yywrap(  ) )\n\t\t\t\t\t{\n\t\t\t\t\t/* Note: because we've taken care in\n\t\t\t\t\t * yy_get_next_buffer() to have set up\n\t\t\t\t\t * yytext, we can now set up\n\t\t\t\t\t * yy_c_buf_p so that if some total\n\t\t\t\t\t * hoser (like flex itself) wants to\n\t\t\t\t\t * call the scanner after we return the\n\t\t\t\t\t * YY_NULL, it'll still work - another\n\t\t\t\t\t * YY_NULL will get returned.\n\t\t\t\t\t */\n\t\t\t\t\t(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;\n\n\t\t\t\t\tyy_act = YY_STATE_EOF(YY_START);\n\t\t\t\t\tgoto do_action;\n\t\t\t\t\t}\n\n\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\tif ( ! (yy_did_buffer_switch_on_eof) )\n\t\t\t\t\t\tYY_NEW_FILE;\n\t\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\tcase EOB_ACT_CONTINUE_SCAN:\n\t\t\t\t(yy_c_buf_p) =\n\t\t\t\t\t(yytext_ptr) + yy_amount_of_matched_text;\n\n\t\t\t\tyy_current_state = yy_get_previous_state(  );\n\n\t\t\t\tyy_cp = (yy_c_buf_p);\n\t\t\t\tyy_bp = (yytext_ptr) + YY_MORE_ADJ;\n\t\t\t\tgoto yy_match;\n\n\t\t\tcase EOB_ACT_LAST_MATCH:\n\t\t\t\t(yy_c_buf_p) =\n\t\t\t\t&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];\n\n\t\t\t\tyy_current_state = yy_get_previous_state(  );\n\n\t\t\t\tyy_cp = (yy_c_buf_p);\n\t\t\t\tyy_bp = (yytext_ptr) + YY_MORE_ADJ;\n\t\t\t\tgoto yy_find_action;\n\t\t\t}\n\t\tbreak;\n\t\t}\n\n\tdefault:\n\t\tYY_FATAL_ERROR(\n\t\t\t\"fatal flex scanner internal error--no action found\" );\n\t} /* end of action switch */\n\t\t} /* end of scanning one token */\n} /* end of yylex */\n\n/* The contents of this function are C++ specific, so the () macro is not used.\n */\nyyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout )\n{\n\tyyin = arg_yyin;\n\tyyout = arg_yyout;\n\tyy_c_buf_p = 0;\n\tyy_init = 0;\n\tyy_start = 0;\n\tyy_flex_debug = 0;\n\tyylineno = 1;\t// this will only get updated if %option yylineno\n\n\tyy_did_buffer_switch_on_eof = 0;\n\n\tyy_looking_for_trail_begin = 0;\n\tyy_more_flag = 0;\n\tyy_more_len = 0;\n\tyy_more_offset = yy_prev_more_offset = 0;\n\n\tyy_start_stack_ptr = yy_start_stack_depth = 0;\n\tyy_start_stack = NULL;\n\n\tyy_buffer_stack = 0;\n\tyy_buffer_stack_top = 0;\n\tyy_buffer_stack_max = 0;\n\n\tyy_state_buf = 0;\n\n}\n\n/* The contents of this function are C++ specific, so the () macro is not used.\n */\nyyFlexLexer::~yyFlexLexer()\n{\n\tdelete [] yy_state_buf;\n\tyyfree(yy_start_stack  );\n\tyy_delete_buffer( YY_CURRENT_BUFFER );\n\tyyfree(yy_buffer_stack  );\n}\n\n/* The contents of this function are C++ specific, so the () macro is not used.\n */\nvoid yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out )\n{\n\tif ( new_in )\n\t\t{\n\t\tyy_delete_buffer( YY_CURRENT_BUFFER );\n\t\tyy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE  ) );\n\t\t}\n\n\tif ( new_out )\n\t\tyyout = new_out;\n}\n\n#ifdef YY_INTERACTIVE\nint yyFlexLexer::LexerInput( char* buf, int /* max_size */ )\n#else\nint yyFlexLexer::LexerInput( char* buf, int max_size )\n#endif\n{\n\tif ( yyin->eof() || yyin->fail() )\n\t\treturn 0;\n\n#ifdef YY_INTERACTIVE\n\tyyin->get( buf[0] );\n\n\tif ( yyin->eof() )\n\t\treturn 0;\n\n\tif ( yyin->bad() )\n\t\treturn -1;\n\n\treturn 1;\n\n#else\n\t(void) yyin->read( buf, max_size );\n\n\tif ( yyin->bad() )\n\t\treturn -1;\n\telse\n\t\treturn yyin->gcount();\n#endif\n}\n\nvoid yyFlexLexer::LexerOutput( const char* buf, int size )\n{\n\t(void) yyout->write( buf, size );\n}\n\n/* yy_get_next_buffer - try to read in a new buffer\n *\n * Returns a code representing an action:\n *\tEOB_ACT_LAST_MATCH -\n *\tEOB_ACT_CONTINUE_SCAN - continue scanning from current position\n *\tEOB_ACT_END_OF_FILE - end of file\n */\nint yyFlexLexer::yy_get_next_buffer()\n{\n    \tregister char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;\n\tregister char *source = (yytext_ptr);\n\tregister int number_to_move, i;\n\tint ret_val;\n\n\tif ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )\n\t\tYY_FATAL_ERROR(\n\t\t\"fatal flex scanner internal error--end of buffer missed\" );\n\n\tif ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )\n\t\t{ /* Don't try to fill the buffer, so this is an EOF. */\n\t\tif ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )\n\t\t\t{\n\t\t\t/* We matched a single character, the EOB, so\n\t\t\t * treat this as a final EOF.\n\t\t\t */\n\t\t\treturn EOB_ACT_END_OF_FILE;\n\t\t\t}\n\n\t\telse\n\t\t\t{\n\t\t\t/* We matched some text prior to the EOB, first\n\t\t\t * process it.\n\t\t\t */\n\t\t\treturn EOB_ACT_LAST_MATCH;\n\t\t\t}\n\t\t}\n\n\t/* Try to read more data. */\n\n\t/* First move last chars to start of buffer. */\n\tnumber_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;\n\n\tfor ( i = 0; i < number_to_move; ++i )\n\t\t*(dest++) = *(source++);\n\n\tif ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )\n\t\t/* don't do the read, it's not guaranteed to return an EOF,\n\t\t * just force an EOF\n\t\t */\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;\n\n\telse\n\t\t{\n\t\t\tyy_size_t num_to_read =\n\t\t\tYY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;\n\n\t\twhile ( num_to_read <= 0 )\n\t\t\t{ /* Not enough room in the buffer - grow it. */\n\n\t\t\t/* just a shorter name for the current buffer */\n\t\t\tYY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;\n\n\t\t\tint yy_c_buf_p_offset =\n\t\t\t\t(int) ((yy_c_buf_p) - b->yy_ch_buf);\n\n\t\t\tif ( b->yy_is_our_buffer )\n\t\t\t\t{\n\t\t\t\tyy_size_t new_size = b->yy_buf_size * 2;\n\n\t\t\t\tif ( new_size <= 0 )\n\t\t\t\t\tb->yy_buf_size += b->yy_buf_size / 8;\n\t\t\t\telse\n\t\t\t\t\tb->yy_buf_size *= 2;\n\n\t\t\t\tb->yy_ch_buf = (char *)\n\t\t\t\t\t/* Include room in for 2 EOB chars. */\n\t\t\t\t\tyyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2  );\n\t\t\t\t}\n\t\t\telse\n\t\t\t\t/* Can't grow it, we don't own it. */\n\t\t\t\tb->yy_ch_buf = 0;\n\n\t\t\tif ( ! b->yy_ch_buf )\n\t\t\t\tYY_FATAL_ERROR(\n\t\t\t\t\"fatal error - scanner input buffer overflow\" );\n\n\t\t\t(yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];\n\n\t\t\tnum_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -\n\t\t\t\t\t\tnumber_to_move - 1;\n\n\t\t\t}\n\n\t\tif ( num_to_read > YY_READ_BUF_SIZE )\n\t\t\tnum_to_read = YY_READ_BUF_SIZE;\n\n\t\t/* Read in more data. */\n\t\tYY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),\n\t\t\t(yy_n_chars), num_to_read );\n\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);\n\t\t}\n\n\tif ( (yy_n_chars) == 0 )\n\t\t{\n\t\tif ( number_to_move == YY_MORE_ADJ )\n\t\t\t{\n\t\t\tret_val = EOB_ACT_END_OF_FILE;\n\t\t\tyyrestart( yyin  );\n\t\t\t}\n\n\t\telse\n\t\t\t{\n\t\t\tret_val = EOB_ACT_LAST_MATCH;\n\t\t\tYY_CURRENT_BUFFER_LVALUE->yy_buffer_status =\n\t\t\t\tYY_BUFFER_EOF_PENDING;\n\t\t\t}\n\t\t}\n\n\telse\n\t\tret_val = EOB_ACT_CONTINUE_SCAN;\n\n\tif ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {\n\t\t/* Extend the array by 50%, plus the number we really need. */\n\t\tyy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size  );\n\t\tif ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )\n\t\t\tYY_FATAL_ERROR( \"out of dynamic memory in yy_get_next_buffer()\" );\n\t}\n\n\t(yy_n_chars) += number_to_move;\n\tYY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;\n\tYY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;\n\n\t(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];\n\n\treturn ret_val;\n}\n\n/* yy_get_previous_state - get the state just before the EOB char was reached */\n\n    yy_state_type yyFlexLexer::yy_get_previous_state()\n{\n\tregister yy_state_type yy_current_state;\n\tregister char *yy_cp;\n    \n\tyy_current_state = (yy_start);\n\n\tfor ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )\n\t\t{\n\t\tif ( *yy_cp )\n\t\t\t{\n\t\t\tyy_current_state = yy_nxt[yy_current_state][YY_SC_TO_UI(*yy_cp)];\n\t\t\t}\n\t\telse\n\t\t\tyy_current_state = yy_NUL_trans[yy_current_state];\n\t\tif ( yy_accept[yy_current_state] )\n\t\t\t{\n\t\t\t(yy_last_accepting_state) = yy_current_state;\n\t\t\t(yy_last_accepting_cpos) = yy_cp;\n\t\t\t}\n\t\t}\n\n\treturn yy_current_state;\n}\n\n/* yy_try_NUL_trans - try to make a transition on the NUL character\n *\n * synopsis\n *\tnext_state = yy_try_NUL_trans( current_state );\n */\n    yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state )\n{\n\tregister int yy_is_jam;\n    \tregister char *yy_cp = (yy_c_buf_p);\n\n\tyy_current_state = yy_NUL_trans[yy_current_state];\n\tyy_is_jam = (yy_current_state == 0);\n\n\tif ( ! yy_is_jam )\n\t\t{\n\t\tif ( yy_accept[yy_current_state] )\n\t\t\t{\n\t\t\t(yy_last_accepting_state) = yy_current_state;\n\t\t\t(yy_last_accepting_cpos) = yy_cp;\n\t\t\t}\n\t\t}\n\n\t\treturn yy_is_jam ? 0 : yy_current_state;\n}\n\n    void yyFlexLexer::yyunput( int c, register char* yy_bp)\n{\n\tregister char *yy_cp;\n    \n    yy_cp = (yy_c_buf_p);\n\n\t/* undo effects of setting up yytext */\n\t*yy_cp = (yy_hold_char);\n\n\tif ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )\n\t\t{ /* need to shift things up to make room */\n\t\t/* +2 for EOB chars. */\n\t\tregister yy_size_t number_to_move = (yy_n_chars) + 2;\n\t\tregister char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[\n\t\t\t\t\tYY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];\n\t\tregister char *source =\n\t\t\t\t&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];\n\n\t\twhile ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )\n\t\t\t*--dest = *--source;\n\n\t\tyy_cp += (int) (dest - source);\n\t\tyy_bp += (int) (dest - source);\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_n_chars =\n\t\t\t(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;\n\n\t\tif ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )\n\t\t\tYY_FATAL_ERROR( \"flex scanner push-back overflow\" );\n\t\t}\n\n\t*--yy_cp = (char) c;\n\n\t(yytext_ptr) = yy_bp;\n\t(yy_hold_char) = *yy_cp;\n\t(yy_c_buf_p) = yy_cp;\n}\n\n    int yyFlexLexer::yyinput()\n{\n\tint c;\n    \n\t*(yy_c_buf_p) = (yy_hold_char);\n\n\tif ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )\n\t\t{\n\t\t/* yy_c_buf_p now points to the character we want to return.\n\t\t * If this occurs *before* the EOB characters, then it's a\n\t\t * valid NUL; if not, then we've hit the end of the buffer.\n\t\t */\n\t\tif ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )\n\t\t\t/* This was really a NUL. */\n\t\t\t*(yy_c_buf_p) = '\\0';\n\n\t\telse\n\t\t\t{ /* need more input */\n\t\t\tyy_size_t offset = (yy_c_buf_p) - (yytext_ptr);\n\t\t\t++(yy_c_buf_p);\n\n\t\t\tswitch ( yy_get_next_buffer(  ) )\n\t\t\t\t{\n\t\t\t\tcase EOB_ACT_LAST_MATCH:\n\t\t\t\t\t/* This happens because yy_g_n_b()\n\t\t\t\t\t * sees that we've accumulated a\n\t\t\t\t\t * token and flags that we need to\n\t\t\t\t\t * try matching the token before\n\t\t\t\t\t * proceeding.  But for input(),\n\t\t\t\t\t * there's no matching to consider.\n\t\t\t\t\t * So convert the EOB_ACT_LAST_MATCH\n\t\t\t\t\t * to EOB_ACT_END_OF_FILE.\n\t\t\t\t\t */\n\n\t\t\t\t\t/* Reset buffer status. */\n\t\t\t\t\tyyrestart( yyin );\n\n\t\t\t\t\t/*FALLTHROUGH*/\n\n\t\t\t\tcase EOB_ACT_END_OF_FILE:\n\t\t\t\t\t{\n\t\t\t\t\tif ( yywrap(  ) )\n\t\t\t\t\t\treturn EOF;\n\n\t\t\t\t\tif ( ! (yy_did_buffer_switch_on_eof) )\n\t\t\t\t\t\tYY_NEW_FILE;\n#ifdef __cplusplus\n\t\t\t\t\treturn yyinput();\n#else\n\t\t\t\t\treturn input();\n#endif\n\t\t\t\t\t}\n\n\t\t\t\tcase EOB_ACT_CONTINUE_SCAN:\n\t\t\t\t\t(yy_c_buf_p) = (yytext_ptr) + offset;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\tc = *(unsigned char *) (yy_c_buf_p);\t/* cast for 8-bit char's */\n\t*(yy_c_buf_p) = '\\0';\t/* preserve yytext */\n\t(yy_hold_char) = *++(yy_c_buf_p);\n\n\treturn c;\n}\n\n/** Immediately switch to a different input stream.\n * @param input_file A readable stream.\n * \n * @note This function does not reset the start condition to @c INITIAL .\n */\n    void yyFlexLexer::yyrestart( std::istream* input_file )\n{\n    \n\tif ( ! YY_CURRENT_BUFFER ){\n        yyensure_buffer_stack ();\n\t\tYY_CURRENT_BUFFER_LVALUE =\n            yy_create_buffer( yyin, YY_BUF_SIZE );\n\t}\n\n\tyy_init_buffer( YY_CURRENT_BUFFER, input_file );\n\tyy_load_buffer_state(  );\n}\n\n/** Switch to a different input buffer.\n * @param new_buffer The new input buffer.\n * \n */\n    void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )\n{\n    \n\t/* TODO. We should be able to replace this entire function body\n\t * with\n\t *\t\tyypop_buffer_state();\n\t *\t\tyypush_buffer_state(new_buffer);\n     */\n\tyyensure_buffer_stack ();\n\tif ( YY_CURRENT_BUFFER == new_buffer )\n\t\treturn;\n\n\tif ( YY_CURRENT_BUFFER )\n\t\t{\n\t\t/* Flush out information for old buffer. */\n\t\t*(yy_c_buf_p) = (yy_hold_char);\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);\n\t\t}\n\n\tYY_CURRENT_BUFFER_LVALUE = new_buffer;\n\tyy_load_buffer_state(  );\n\n\t/* We don't actually know whether we did this switch during\n\t * EOF (yywrap()) processing, but the only time this flag\n\t * is looked at is after yywrap() is called, so it's safe\n\t * to go ahead and always set it.\n\t */\n\t(yy_did_buffer_switch_on_eof) = 1;\n}\n\n    void yyFlexLexer::yy_load_buffer_state()\n{\n    \t(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;\n\t(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;\n\tyyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;\n\t(yy_hold_char) = *(yy_c_buf_p);\n}\n\n/** Allocate and initialize an input buffer state.\n * @param file A readable stream.\n * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.\n * \n * @return the allocated buffer state.\n */\n    YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size )\n{\n\tYY_BUFFER_STATE b;\n    \n\tb = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state )  );\n\tif ( ! b )\n\t\tYY_FATAL_ERROR( \"out of dynamic memory in yy_create_buffer()\" );\n\n\tb->yy_buf_size = size;\n\n\t/* yy_ch_buf has to be 2 characters longer than the size given because\n\t * we need to put in 2 end-of-buffer characters.\n\t */\n\tb->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2  );\n\tif ( ! b->yy_ch_buf )\n\t\tYY_FATAL_ERROR( \"out of dynamic memory in yy_create_buffer()\" );\n\n\tb->yy_is_our_buffer = 1;\n\n\tyy_init_buffer( b, file );\n\n\treturn b;\n}\n\n/** Destroy the buffer.\n * @param b a buffer created with yy_create_buffer()\n * \n */\n    void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b )\n{\n    \n\tif ( ! b )\n\t\treturn;\n\n\tif ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */\n\t\tYY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;\n\n\tif ( b->yy_is_our_buffer )\n\t\tyyfree((void *) b->yy_ch_buf  );\n\n\tyyfree((void *) b  );\n}\n\n/* Initializes or reinitializes a buffer.\n * This function is sometimes called more than once on the same buffer,\n * such as during a yyrestart() or at EOF.\n */\n    void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file )\n\n{\n\tint oerrno = errno;\n    \n\tyy_flush_buffer( b );\n\n\tb->yy_input_file = file;\n\tb->yy_fill_buffer = 1;\n\n    /* If b is the current buffer, then yy_init_buffer was _probably_\n     * called from yyrestart() or through yy_get_next_buffer.\n     * In that case, we don't want to reset the lineno or column.\n     */\n    if (b != YY_CURRENT_BUFFER){\n        b->yy_bs_lineno = 1;\n        b->yy_bs_column = 0;\n    }\n\n\tb->yy_is_interactive = 0;\n\terrno = oerrno;\n}\n\n/** Discard all buffered characters. On the next scan, YY_INPUT will be called.\n * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.\n * \n */\n    void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b )\n{\n    \tif ( ! b )\n\t\treturn;\n\n\tb->yy_n_chars = 0;\n\n\t/* We always need two end-of-buffer characters.  The first causes\n\t * a transition to the end-of-buffer state.  The second causes\n\t * a jam in that state.\n\t */\n\tb->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;\n\tb->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;\n\n\tb->yy_buf_pos = &b->yy_ch_buf[0];\n\n\tb->yy_at_bol = 1;\n\tb->yy_buffer_status = YY_BUFFER_NEW;\n\n\tif ( b == YY_CURRENT_BUFFER )\n\t\tyy_load_buffer_state(  );\n}\n\n/** Pushes the new state onto the stack. The new state becomes\n *  the current state. This function will allocate the stack\n *  if necessary.\n *  @param new_buffer The new state.\n *  \n */\nvoid yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer)\n{\n    \tif (new_buffer == NULL)\n\t\treturn;\n\n\tyyensure_buffer_stack();\n\n\t/* This block is copied from yy_switch_to_buffer. */\n\tif ( YY_CURRENT_BUFFER )\n\t\t{\n\t\t/* Flush out information for old buffer. */\n\t\t*(yy_c_buf_p) = (yy_hold_char);\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);\n\t\t}\n\n\t/* Only push if top exists. Otherwise, replace top. */\n\tif (YY_CURRENT_BUFFER)\n\t\t(yy_buffer_stack_top)++;\n\tYY_CURRENT_BUFFER_LVALUE = new_buffer;\n\n\t/* copied from yy_switch_to_buffer. */\n\tyy_load_buffer_state(  );\n\t(yy_did_buffer_switch_on_eof) = 1;\n}\n\n/** Removes and deletes the top of the stack, if present.\n *  The next element becomes the new top.\n *  \n */\nvoid yyFlexLexer::yypop_buffer_state (void)\n{\n    \tif (!YY_CURRENT_BUFFER)\n\t\treturn;\n\n\tyy_delete_buffer(YY_CURRENT_BUFFER );\n\tYY_CURRENT_BUFFER_LVALUE = NULL;\n\tif ((yy_buffer_stack_top) > 0)\n\t\t--(yy_buffer_stack_top);\n\n\tif (YY_CURRENT_BUFFER) {\n\t\tyy_load_buffer_state(  );\n\t\t(yy_did_buffer_switch_on_eof) = 1;\n\t}\n}\n\n/* Allocates the stack if it does not exist.\n *  Guarantees space for at least one push.\n */\nvoid yyFlexLexer::yyensure_buffer_stack(void)\n{\n\tyy_size_t num_to_alloc;\n    \n\tif (!(yy_buffer_stack)) {\n\n\t\t/* First allocation is just for 2 elements, since we don't know if this\n\t\t * scanner will even need a stack. We use 2 instead of 1 to avoid an\n\t\t * immediate realloc on the next call.\n         */\n\t\tnum_to_alloc = 1;\n\t\t(yy_buffer_stack) = (struct yy_buffer_state**)yyalloc\n\t\t\t\t\t\t\t\t(num_to_alloc * sizeof(struct yy_buffer_state*)\n\t\t\t\t\t\t\t\t);\n\t\tif ( ! (yy_buffer_stack) )\n\t\t\tYY_FATAL_ERROR( \"out of dynamic memory in yyensure_buffer_stack()\" );\n\t\t\t\t\t\t\t\t  \n\t\tmemset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));\n\t\t\t\t\n\t\t(yy_buffer_stack_max) = num_to_alloc;\n\t\t(yy_buffer_stack_top) = 0;\n\t\treturn;\n\t}\n\n\tif ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){\n\n\t\t/* Increase the buffer to prepare for a possible push. */\n\t\tint grow_size = 8 /* arbitrary grow size */;\n\n\t\tnum_to_alloc = (yy_buffer_stack_max) + grow_size;\n\t\t(yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc\n\t\t\t\t\t\t\t\t((yy_buffer_stack),\n\t\t\t\t\t\t\t\tnum_to_alloc * sizeof(struct yy_buffer_state*)\n\t\t\t\t\t\t\t\t);\n\t\tif ( ! (yy_buffer_stack) )\n\t\t\tYY_FATAL_ERROR( \"out of dynamic memory in yyensure_buffer_stack()\" );\n\n\t\t/* zero only the new slots.*/\n\t\tmemset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));\n\t\t(yy_buffer_stack_max) = num_to_alloc;\n\t}\n}\n\n#ifndef YY_EXIT_FAILURE\n#define YY_EXIT_FAILURE 2\n#endif\n\nvoid yyFlexLexer::LexerError( yyconst char msg[] )\n{\n    \tstd::cerr << msg << std::endl;\n\texit( YY_EXIT_FAILURE );\n}\n\n/* Redefine yyless() so it works in section 3 code. */\n\n#undef yyless\n#define yyless(n) \\\n\tdo \\\n\t\t{ \\\n\t\t/* Undo effects of setting up yytext. */ \\\n        int yyless_macro_arg = (n); \\\n        YY_LESS_LINENO(yyless_macro_arg);\\\n\t\tyytext[yyleng] = (yy_hold_char); \\\n\t\t(yy_c_buf_p) = yytext + yyless_macro_arg; \\\n\t\t(yy_hold_char) = *(yy_c_buf_p); \\\n\t\t*(yy_c_buf_p) = '\\0'; \\\n\t\tyyleng = yyless_macro_arg; \\\n\t\t} \\\n\twhile ( 0 )\n\n/* Accessor  methods (get/set functions) to struct members. */\n\n/*\n * Internal utility routines.\n */\n\n#ifndef yytext_ptr\nstatic void yy_flex_strncpy (char* s1, yyconst char * s2, int n )\n{\n\tregister int i;\n\tfor ( i = 0; i < n; ++i )\n\t\ts1[i] = s2[i];\n}\n#endif\n\n#ifdef YY_NEED_STRLEN\nstatic int yy_flex_strlen (yyconst char * s )\n{\n\tregister int n;\n\tfor ( n = 0; s[n]; ++n )\n\t\t;\n\n\treturn n;\n}\n#endif\n\nvoid *yyalloc (yy_size_t  size )\n{\n\treturn (void *) malloc( size );\n}\n\nvoid *yyrealloc  (void * ptr, yy_size_t  size )\n{\n\t/* The cast to (char *) in the following accommodates both\n\t * implementations that use char* generic pointers, and those\n\t * that use void* generic pointers.  It works with the latter\n\t * because both ANSI C and C++ allow castless assignment from\n\t * any pointer type to void*, and deal with argument conversions\n\t * as though doing an assignment.\n\t */\n\treturn (void *) realloc( (char *) ptr, size );\n}\n\nvoid yyfree (void * ptr )\n{\n\tfree( (char *) ptr );\t/* see yyrealloc() for (char *) cast */\n}\n\n#define YYTABLES_NAME \"yytables\"\n\n#line 262 \"json_scanner.yy\"\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/json_scanner.cpp",
    "content": "/* This file is part of QJson\n *\n * Copyright (C) 2008 Flavio Castelli <flavio.castelli@gmail.com>\n * Copyright (C) 2013 Silvio Moioli <silvio@moioli.net>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License version 2.1, as published by the Free Software Foundation.\n * \n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this library; see the file COPYING.LIB.  If not, write to\n * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n#include \"json_scanner.cc\"\n\n#include \"qjson_debug.h\"\n#include \"json_scanner.h\"\n#include \"json_parser.hh\"\n\n#include <ctype.h>\n\n#include <QtCore/QDebug>\n#include <QtCore/QRegExp>\n\n#include <cassert>\n\n\nJSonScanner::JSonScanner(QIODevice* io)\n  : m_allowSpecialNumbers(false),\n    m_io (io),\n    m_criticalError(false),\n    m_C_locale(QLocale::C)\n{\n\n}\n\nJSonScanner::~JSonScanner()\n{\n}\n\nvoid JSonScanner::allowSpecialNumbers(bool allow) {\n  m_allowSpecialNumbers = allow;\n}\n\nint JSonScanner::yylex(YYSTYPE* yylval, yy::location *yylloc) {\n  m_yylval = yylval;\n  m_yylloc = yylloc;\n  m_yylloc->step();\n  int result = yylex();\n  \n  if (m_criticalError) {\n    return -1;\n  }\n  \n  return result;\n}\n\nint JSonScanner::LexerInput(char* buf, int max_size) {\n  if (!m_io->isOpen()) {\n    qCritical() << \"JSonScanner::yylex - io device is not open\";\n    m_criticalError = true;\n    return 0;\n  }\n  \n  int readBytes = m_io->read(buf, max_size);\n  if(readBytes < 0) {\n    qCritical() << \"JSonScanner::yylex - error while reading from io device\";\n    m_criticalError = true;\n    return 0;\n  }\n  \n  return readBytes;\n}\n\n\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/json_scanner.h",
    "content": "/* This file is part of QJson\n *\n * Copyright (C) 2008 Flavio Castelli <flavio.castelli@gmail.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License version 2.1, as published by the Free Software Foundation.\n * \n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this library; see the file COPYING.LIB.  If not, write to\n * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#ifndef _JSON_SCANNER\n#define _JSON_SCANNER\n\n#include <QtCore/QIODevice>\n#include <QtCore/QVariant>\n#include <QtCore/QLocale>\n\n#define YYSTYPE QVariant\n\n// Only include FlexLexer.h if it hasn't been already included\n#if ! defined(yyFlexLexerOnce)\n#include <FlexLexer.h>\n#endif\n\n#include \"parser_p.h\"\n\n\n\nnamespace yy {\n  class location;\n  int yylex(YYSTYPE *yylval, yy::location *yylloc, QJson::ParserPrivate* driver);\n}\n\nclass JSonScanner : public yyFlexLexer\n{\n    public:\n        explicit JSonScanner(QIODevice* io);\n        ~JSonScanner();\n\n        void allowSpecialNumbers(bool allow);\n\n        int yylex(YYSTYPE* yylval, yy::location *yylloc);\n        int yylex();\n        int LexerInput(char* buf, int max_size);\n    protected:\n        bool m_allowSpecialNumbers;\n        QIODevice* m_io;\n\n        YYSTYPE* m_yylval;\n        yy::location* m_yylloc;\n        bool m_criticalError;\n        QString m_currentString;\n        QLocale m_C_locale;\n};\n\n#endif\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/json_scanner.yy",
    "content": "/* This file is part of QJson\n *\n * Copyright (C) 2013 Silvio Moioli <silvio@moioli.net>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License version 2.1, as published by the Free Software Foundation.\n * \n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this library; see the file COPYING.LIB.  If not, write to\n * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n * Boston, MA 02110yy::json_parser::token::INVALID301, USA.\n */\n\n/* Flex output settings */\n%option 8bit c++ full warn\n%option noyywrap nounistd\n%option noinput nounput noyy_push_state noyy_pop_state noyy_top_state noyy_scan_buffer noyy_scan_bytes noyy_scan_string noyyget_extra noyyset_extra noyyget_leng noyyget_text noyyget_lineno noyyset_lineno noyyget_in noyyset_in noyyget_out noyyset_out noyyget_lval noyyset_lval noyyget_lloc noyyset_lloc noyyget_debug noyyset_debug\n%option yyclass=\"JSonScanner\"\n%option outfile=\"json_scanner.cc\"\n\n%{\n  #include \"json_scanner.h\"\n  #include \"json_parser.hh\"\n\n  #if defined(_WIN32) && !defined(__MINGW32__)\n  #define strtoll _strtoi64\n  #define strtoull _strtoui64\n  #endif\n\n  #define YY_USER_INIT if(m_allowSpecialNumbers) { \\\n    BEGIN(ALLOW_SPECIAL_NUMBERS); \\\n  }\n%}\n\n/* Exclusive subscanners for strings and escaped hex sequences */\n%x QUOTMARK_OPEN HEX_OPEN\n\n/* Extra-JSON rules active iff m_allowSpecialNumbers is true */\n%s ALLOW_SPECIAL_NUMBERS\n\n%%\n\n /* Whitespace */\n[\\v\\f\\t ]+    {\n                m_yylloc->columns(yyleng);\n              }\n\n[\\r\\n]+       { \n                m_yylloc->lines(yyleng);\n              }\n\n\n /* Special values */\ntrue          { \n                m_yylloc->columns(yyleng);\n                *m_yylval = QVariant(true);\n                return yy::json_parser::token::TRUE_VAL;\n              }\n                \nfalse         {\n                m_yylloc->columns(yyleng);\n                *m_yylval = QVariant(false);\n                return yy::json_parser::token::FALSE_VAL;\n              }\n\nnull          {\n                m_yylloc->columns(yyleng);\n                *m_yylval = QVariant();\n                return yy::json_parser::token::NULL_VAL;\n              }\n \n \n /* Numbers */\n[0-9]         |\n[1-9][0-9]+   {\n                m_yylloc->columns(yyleng);\n                *m_yylval = QVariant(strtoull(yytext, NULL, 10));\n                if (errno == ERANGE) {\n                    qCritical() << \"Number is out of range: \" << yytext;\n                    return yy::json_parser::token::INVALID;\n                }\n                return yy::json_parser::token::NUMBER;\n              }\n\n-[0-9]        |\n-[1-9][0-9]+  {\n                m_yylloc->columns(yyleng);\n                *m_yylval = QVariant(strtoll(yytext, NULL, 10));\n                if (errno == ERANGE) {\n                    qCritical() << \"Number is out of range: \" << yytext;\n                    return yy::json_parser::token::INVALID;\n                }\n                return yy::json_parser::token::NUMBER;\n              }\n\n-?(([0-9])|([1-9][0-9]+))(\\.[0-9]+)?([Ee][+\\-]?[0-9]+)? {\n                m_yylloc->columns(yyleng);\n                bool ok;\n                *m_yylval = QVariant(m_C_locale.toDouble(QLatin1String(yytext),&ok));\n                if (!ok) {\n                    qCritical() << \"Number is out of range: \" << yytext;\n                    return yy::json_parser::token::INVALID;\n                }\n                return yy::json_parser::token::NUMBER;\n              }\n\n /* Strings */              \n\\\"            {\n                m_yylloc->columns(yyleng);\n                BEGIN(QUOTMARK_OPEN);\n              }\n              \n<QUOTMARK_OPEN>{\n  \\\\\\\"          {\n                  m_currentString.append(QLatin1String(\"\\\"\"));\n                }\n                \n  \\\\\\\\          {\n                  m_currentString.append(QLatin1String(\"\\\\\"));\n                }\n                \n  \\\\\\/          {\n                  m_currentString.append(QLatin1String(\"/\"));\n                }\n                \n  \\\\b           {\n                   m_currentString.append(QLatin1String(\"\\b\"));\n                }\n                \n  \\\\f           {\n                  m_currentString.append(QLatin1String(\"\\f\"));\n                }\n                \n  \\\\n           {\n                  m_currentString.append(QLatin1String(\"\\n\"));\n                }\n                \n  \\\\r           {\n                  m_currentString.append(QLatin1String(\"\\r\"));\n                }\n                \n  \\\\t           {\n                  m_currentString.append(QLatin1String(\"\\t\"));\n                }\n                \n  \\\\u           {\n                  BEGIN(HEX_OPEN);\n                }\n                \n  [^\\\"\\\\]+      {\n                  m_currentString.append(QString::fromUtf8(yytext));\n                }\n\n  \\\\            {\n                  // ignore\n                }\n                \n  \\\"            {\n                  m_yylloc->columns(yyleng);\n                  *m_yylval = QVariant(m_currentString);\n                  m_currentString.clear();\n                  BEGIN(INITIAL);\n                  return yy::json_parser::token::STRING;\n                }\n\n  <<EOF>>       {\n                  qCritical() << \"Unterminated string\";\n                  m_yylloc->columns(yyleng);\n                  return yy::json_parser::token::INVALID;\n                }\n\n}\n\n<HEX_OPEN>{\n  [0-9A-Fa-f]{4} {\n                    QString hexDigits = QString::fromUtf8(yytext, yyleng);\n                    bool ok;\n                    ushort hexDigit1 = hexDigits.left(2).toShort(&ok, 16);\n                    ushort hexDigit2 = hexDigits.right(2).toShort(&ok, 16);    \n                    m_currentString.append(QChar(hexDigit2, hexDigit1));\n                    BEGIN(QUOTMARK_OPEN);\n                 }\n                 \n  .|\\n           {\n                    qCritical() << \"Invalid hex string\";\n                    m_yylloc->columns(yyleng);\n                    *m_yylval = QVariant(QLatin1String(\"\"));\n                    BEGIN(QUOTMARK_OPEN);\n                    return yy::json_parser::token::INVALID;\n                 }\n}\n\n\n\n /* \"Compound type\" related tokens */              \n:             {\n                m_yylloc->columns(yyleng);\n                return yy::json_parser::token::COLON;\n              }\n\n,             {\n                m_yylloc->columns(yyleng);\n                return yy::json_parser::token::COMMA;\n              }\n\n\\[            {\n                m_yylloc->columns(yyleng);\n                return yy::json_parser::token::SQUARE_BRACKET_OPEN;\n              }\n\n\\]            {\n                m_yylloc->columns(yyleng);\n                return yy::json_parser::token::SQUARE_BRACKET_CLOSE;\n              }\n\n\\{            {\n                m_yylloc->columns(yyleng);\n                return yy::json_parser::token::CURLY_BRACKET_OPEN;\n              }\n\n\\}            {\n                m_yylloc->columns(yyleng);\n                return yy::json_parser::token::CURLY_BRACKET_CLOSE;\n              }\n\n\n /* Extra-JSON numbers */\n<ALLOW_SPECIAL_NUMBERS>{\n  (?i:nan)      {\n                  m_yylloc->columns(yyleng);\n                  *m_yylval = QVariant(std::numeric_limits<double>::quiet_NaN());\n                  return yy::json_parser::token::NUMBER;\n                }\n\n  [Ii]nfinity   {\n                    m_yylloc->columns(yyleng);\n                    *m_yylval = QVariant(std::numeric_limits<double>::infinity());\n                    return yy::json_parser::token::NUMBER;\n                }\n\n  -[Ii]nfinity  {\n                    m_yylloc->columns(yyleng);\n                    *m_yylval = QVariant(-std::numeric_limits<double>::infinity());\n                    return yy::json_parser::token::NUMBER;\n                }\n}\n\n /* If all else fails */\n.             {\n                m_yylloc->columns(yyleng);\n                return yy::json_parser::token::INVALID;\n              }\n\n<<EOF>>       return yy::json_parser::token::END;\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/location.hh",
    "content": "/* A Bison parser, made by GNU Bison 2.7.  */\n\n/* Locations for Bison parsers in C++\n   \n      Copyright (C) 2002-2007, 2009-2012 Free Software Foundation, Inc.\n   \n   This program is free software: you can redistribute it and/or modify\n   it under the terms of the GNU General Public License as published by\n   the Free Software Foundation, either version 3 of the License, or\n   (at your option) any later version.\n   \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n   \n   You should have received a copy of the GNU General Public License\n   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */\n\n/* As a special exception, you may create a larger work that contains\n   part or all of the Bison parser skeleton and distribute that work\n   under terms of your choice, so long as that work isn't itself a\n   parser generator using the skeleton or a modified version thereof\n   as a parser skeleton.  Alternatively, if you modify or redistribute\n   the parser skeleton itself, you may (at your option) remove this\n   special exception, which will cause the skeleton and the resulting\n   Bison output files to be licensed under the GNU General Public\n   License without this special exception.\n   \n   This special exception was added by the Free Software Foundation in\n   version 2.2 of Bison.  */\n\n/**\n ** \\file location.hh\n ** Define the yy::location class.\n */\n\n#ifndef YY_YY_LOCATION_HH_INCLUDED\n# define YY_YY_LOCATION_HH_INCLUDED\n\n# include \"position.hh\"\n\n\nnamespace yy {\n/* Line 166 of location.cc  */\n#line 47 \"location.hh\"\n\n  /// Abstract a location.\n  class location\n  {\n  public:\n\n    /// Construct a location from \\a b to \\a e.\n    location (const position& b, const position& e)\n      : begin (b)\n      , end (e)\n    {\n    }\n\n    /// Construct a 0-width location in \\a p.\n    explicit location (const position& p = position ())\n      : begin (p)\n      , end (p)\n    {\n    }\n\n    /// Construct a 0-width location in \\a f, \\a l, \\a c.\n    explicit location (std::string* f,\n                       unsigned int l = 1u,\n                       unsigned int c = 1u)\n      : begin (f, l, c)\n      , end (f, l, c)\n    {\n    }\n\n\n    /// Initialization.\n    void initialize (std::string* f = YY_NULL,\n                     unsigned int l = 1u,\n                     unsigned int c = 1u)\n    {\n      begin.initialize (f, l, c);\n      end = begin;\n    }\n\n    /** \\name Line and Column related manipulators\n     ** \\{ */\n  public:\n    /// Reset initial location to final location.\n    void step ()\n    {\n      begin = end;\n    }\n\n    /// Extend the current location to the COUNT next columns.\n    void columns (unsigned int count = 1)\n    {\n      end += count;\n    }\n\n    /// Extend the current location to the COUNT next lines.\n    void lines (unsigned int count = 1)\n    {\n      end.lines (count);\n    }\n    /** \\} */\n\n\n  public:\n    /// Beginning of the located region.\n    position begin;\n    /// End of the located region.\n    position end;\n  };\n\n  /// Join two location objects to create a location.\n  inline const location operator+ (const location& begin, const location& end)\n  {\n    location res = begin;\n    res.end = end.end;\n    return res;\n  }\n\n  /// Add two location objects.\n  inline const location operator+ (const location& begin, unsigned int width)\n  {\n    location res = begin;\n    res.columns (width);\n    return res;\n  }\n\n  /// Add and assign a location.\n  inline location& operator+= (location& res, unsigned int width)\n  {\n    res.columns (width);\n    return res;\n  }\n\n  /// Compare two location objects.\n  inline bool\n  operator== (const location& loc1, const location& loc2)\n  {\n    return loc1.begin == loc2.begin && loc1.end == loc2.end;\n  }\n\n  /// Compare two location objects.\n  inline bool\n  operator!= (const location& loc1, const location& loc2)\n  {\n    return !(loc1 == loc2);\n  }\n\n  /** \\brief Intercept output stream redirection.\n   ** \\param ostr the destination output stream\n   ** \\param loc a reference to the location to redirect\n   **\n   ** Avoid duplicate information.\n   */\n  template <typename YYChar>\n  inline std::basic_ostream<YYChar>&\n  operator<< (std::basic_ostream<YYChar>& ostr, const location& loc)\n  {\n    position last = loc.end - 1;\n    ostr << loc.begin;\n    if (last.filename\n\t&& (!loc.begin.filename\n\t    || *loc.begin.filename != *last.filename))\n      ostr << '-' << last;\n    else if (loc.begin.line != last.line)\n      ostr << '-' << last.line  << '.' << last.column;\n    else if (loc.begin.column != last.column)\n      ostr << '-' << last.column;\n    return ostr;\n  }\n\n\n} // yy\n/* Line 296 of location.cc  */\n#line 180 \"location.hh\"\n\n#endif /* !YY_YY_LOCATION_HH_INCLUDED  */\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/parser.cpp",
    "content": "/* This file is part of QJson\n *\n * Copyright (C) 2008 Flavio Castelli <flavio.castelli@gmail.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License version 2.1, as published by the Free Software Foundation.\n * \n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this library; see the file COPYING.LIB.  If not, write to\n * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#include \"parser.h\"\n#include \"parser_p.h\"\n#include \"json_parser.hh\"\n#include \"json_scanner.h\"\n\n#include <QtCore/QBuffer>\n#include <QtCore/QStringList>\n#include <QtCore/QTextStream>\n#include <QtCore/QDebug>\n\nusing namespace QJson;\n\nParserPrivate::ParserPrivate() :\n  m_scanner(0)\n{\n  m_specialNumbersAllowed = false;\n  reset();\n}\n\nParserPrivate::~ParserPrivate()\n{\n  if (m_scanner)\n    delete m_scanner;\n}\n\nvoid ParserPrivate::setError(QString errorMsg, int errorLine) {\n  m_error = true;\n  m_errorMsg = errorMsg;\n  m_errorLine = errorLine;\n}\n\nvoid ParserPrivate::reset()\n{\n  m_error = false;\n  m_errorLine = 0;\n  m_errorMsg.clear();\n  if (m_scanner) {\n    delete m_scanner;\n    m_scanner = 0;\n  }\n}\n\nParser::Parser() :\n    d(new ParserPrivate)\n{\n}\n\nParser::~Parser()\n{\n  delete d;\n}\n\nQVariant Parser::parse (QIODevice* io, bool* ok)\n{\n  d->reset();\n\n  if (!io->isOpen()) {\n    if (!io->open(QIODevice::ReadOnly)) {\n      if (ok != 0)\n        *ok = false;\n      qCritical (\"Error opening device\");\n      return QVariant();\n    }\n  }\n\n  if (!io->isReadable()) {\n    if (ok != 0)\n      *ok = false;\n    qCritical (\"Device is not readable\");\n    io->close();\n    return QVariant();\n  }\n\n  if (io->atEnd()) {\n    if (ok != 0)\n      *ok = false;\n    d->setError(QLatin1String(\"No data\"), 0);\n    io->close();\n    return QVariant();\n  }\n\n  d->m_scanner = new JSonScanner (io);\n  d->m_scanner->allowSpecialNumbers(d->m_specialNumbersAllowed);\n  yy::json_parser parser(d);\n  parser.parse();\n\n  delete d->m_scanner;\n  d->m_scanner = 0;\n\n  if (ok != 0)\n    *ok = !d->m_error;\n\n  io->close();\n  return d->m_result;\n}\n\nQVariant Parser::parse(const QByteArray& jsonString, bool* ok) {\n  QBuffer buffer;\n  buffer.open(QBuffer::ReadWrite | QBuffer::Text);\n  buffer.write(jsonString);\n  buffer.seek(0);\n  return parse (&buffer, ok);\n}\n\nQString Parser::errorString() const\n{\n  return d->m_errorMsg;\n}\n\nint Parser::errorLine() const\n{\n  return d->m_errorLine;\n}\n\nvoid QJson::Parser::allowSpecialNumbers(bool allowSpecialNumbers) {\n  d->m_specialNumbersAllowed = allowSpecialNumbers;\n}\n\nbool Parser::specialNumbersAllowed() const {\n  return d->m_specialNumbersAllowed;\n}\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/parser.h",
    "content": "/* This file is part of QJson\n *\n * Copyright (C) 2008 Flavio Castelli <flavio.castelli@gmail.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License version 2.1, as published by the Free Software Foundation.\n * \n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this library; see the file COPYING.LIB.  If not, write to\n * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#ifndef QJSON_PARSER_H\n#define QJSON_PARSER_H\n\n#include \"qjson_export.h\"\n\nQT_BEGIN_NAMESPACE\nclass QIODevice;\nclass QVariant;\nQT_END_NAMESPACE\n\n/**\n * Namespace used by QJson\n */\nnamespace QJson {\n\n  class ParserPrivate;\n\n  /**\n   * @brief Main class used to convert JSON data to QVariant objects\n   */\n  class QJSON_EXPORT Parser\n  {\n    public:\n      Parser();\n      ~Parser();\n\n      /**\n      * Read JSON string from the I/O Device and converts it to a QVariant object\n      * @param io Input output device\n      * @param ok if a conversion error occurs, *ok is set to false; otherwise *ok is set to true.\n      * @returns a QVariant object generated from the JSON string\n      */\n      QVariant parse(QIODevice* io, bool* ok = 0);\n\n      /**\n      * This is a method provided for convenience.\n      * @param jsonData data containing the JSON object representation\n      * @param ok if a conversion error occurs, *ok is set to false; otherwise *ok is set to true.\n      * @returns a QVariant object generated from the JSON string\n      * @sa errorString\n      * @sa errorLine\n      */\n      QVariant parse(const QByteArray& jsonData, bool* ok = 0);\n\n      /**\n      * This method returns the error message\n      * @returns a QString object containing the error message of the last parse operation\n      * @sa errorLine\n      */\n      QString errorString() const;\n\n      /**\n      * This method returns line number where the error occurred\n      * @returns the line number where the error occurred\n      * @sa errorString\n      */\n      int errorLine() const;\n\n      /**\n       * Sets whether special numbers (Infinity, -Infinity, NaN) are allowed as an extension to\n       * the standard\n       * @param  allowSpecialNumbers new value of whether special numbers are allowed\n       * @sa specialNumbersAllowed\n       */\n      void allowSpecialNumbers(bool allowSpecialNumbers);\n\n      /**\n       * @returns whether special numbers (Infinity, -Infinity, NaN) are allowed\n       * @sa allowSpecialNumbers\n       */\n      bool specialNumbersAllowed() const;\n\n    private:\n      Q_DISABLE_COPY(Parser)\n      ParserPrivate* const d;\n  };\n}\n\n#endif // QJSON_PARSER_H\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/parser_p.h",
    "content": "/* This file is part of QJson\n *\n * Copyright (C) 2008 Flavio Castelli <flavio.castelli@gmail.com>\n * Copyright (C) 2009 Michael Leupold <lemma@confuego.org>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License version 2.1, as published by the Free Software Foundation.\n * \n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this library; see the file COPYING.LIB.  If not, write to\n * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#ifndef QJSON_PARSER_P_H\n#define QJSON_PARSER_P_H\n\n#include \"parser.h\"\n\n#include <QtCore/QString>\n#include <QtCore/QVariant>\n\nclass JSonScanner;\n\nnamespace yy {\n  class json_parser;\n}\n\nnamespace QJson {\n\n  class ParserPrivate\n  {\n    public:\n      ParserPrivate();\n      ~ParserPrivate();\n\n      void reset();\n\n      void setError(QString errorMsg, int line);\n\n      JSonScanner* m_scanner;\n      bool m_error;\n      int m_errorLine;\n      QString m_errorMsg;\n      QVariant m_result;\n      bool m_specialNumbersAllowed;\n  };\n}\n\n#endif // QJSON_PARSER_H\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/parserrunnable.cpp",
    "content": "/* This file is part of qjson\n  *\n  * Copyright (C) 2009 Flavio Castelli <flavio@castelli.name>\n  *\n  * This library is free software; you can redistribute it and/or\n  * modify it under the terms of the GNU Lesser General Public\n  * License version 2.1, as published by the Free Software Foundation.\n  * \n  *\n  * This library is distributed in the hope that it will be useful,\n  * but WITHOUT ANY WARRANTY; without even the implied warranty of\n  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n  * Lesser General Public License for more details.\n  *\n  * You should have received a copy of the GNU Lesser General Public License\n  * along with this library; see the file COPYING.LIB.  If not, write to\n  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n  * Boston, MA 02110-1301, USA.\n  */\n\n#include \"parserrunnable.h\"\n\n#include \"parser.h\"\n\n#include <QtCore/QDebug>\n#include <QtCore/QVariant>\n\nusing namespace QJson;\n\nclass QJson::ParserRunnable::Private\n{\n  public:\n    QByteArray m_data;\n};\n\nParserRunnable::ParserRunnable(QObject* parent)\n    : QObject(parent),\n      QRunnable(),\n      d(new Private)\n{\n  qRegisterMetaType<QVariant>(\"QVariant\");\n}\n\nParserRunnable::~ParserRunnable()\n{\n  delete d;\n}\n\nvoid ParserRunnable::setData( const QByteArray& data ) {\n  d->m_data = data;\n}\n\nvoid ParserRunnable::run()\n{\n  qDebug() << Q_FUNC_INFO;\n\n  bool ok;\n  Parser parser;\n  QVariant result = parser.parse (d->m_data, &ok);\n  if (ok) {\n    qDebug() << \"successfully converted json item to QVariant object\";\n    emit parsingFinished(result, true, QString());\n  } else {\n    const QString errorText = tr(\"An error occurred while parsing json: %1\").arg(parser.errorString());\n    qCritical() << errorText;\n    emit parsingFinished(QVariant(), false, errorText);\n  }\n}\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/parserrunnable.h",
    "content": "/* This file is part of qjson\n  *\n  * Copyright (C) 2009 Flavio Castelli <flavio@castelli.name>\n  *\n  * This library is free software; you can redistribute it and/or\n  * modify it under the terms of the GNU Lesser General Public\n  * License version 2.1, as published by the Free Software Foundation.\n  * \n  *\n  * This library is distributed in the hope that it will be useful,\n  * but WITHOUT ANY WARRANTY; without even the implied warranty of\n  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n  * Lesser General Public License for more details.\n  *\n  * You should have received a copy of the GNU Lesser General Public License\n  * along with this library; see the file COPYING.LIB.  If not, write to\n  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n  * Boston, MA 02110-1301, USA.\n  */\n\n#ifndef PARSERRUNNABLE_H\n#define PARSERRUNNABLE_H\n\n#include \"qjson_export.h\"\n\n#include <QtCore/QObject>\n#include <QtCore/QRunnable>\n\nQT_BEGIN_NAMESPACE\nclass QVariant;\nQT_END_NAMESPACE\n\nnamespace QJson {\n  /**\n  * @brief Convenience class for converting JSON data to QVariant objects using a dedicated thread\n  */\n  class QJSON_EXPORT ParserRunnable  : public QObject, public QRunnable\n  {\n    Q_OBJECT\n    public:\n      explicit ParserRunnable(QObject* parent = 0);\n      ~ParserRunnable();\n\n      void setData( const QByteArray& data );\n\n      void run();\n\n    Q_SIGNALS:\n      /**\n      * This signal is emitted when the parsing process has been completed\n      * @param json contains the result of the parsing\n      * @param ok if a parsing error occurs ok is set to false, otherwise it's set to true.\n      * @param error_msg contains a string explaining the failure reason\n      **/\n      void parsingFinished(const QVariant& json, bool ok, const QString& error_msg);\n\n    private:\n      Q_DISABLE_COPY(ParserRunnable)\n      class Private;\n      Private* const d;\n  };\n}\n\n#endif // PARSERRUNNABLE_H\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/position.hh",
    "content": "/* A Bison parser, made by GNU Bison 2.7.  */\n\n/* Positions for Bison parsers in C++\n   \n      Copyright (C) 2002-2007, 2009-2012 Free Software Foundation, Inc.\n   \n   This program is free software: you can redistribute it and/or modify\n   it under the terms of the GNU General Public License as published by\n   the Free Software Foundation, either version 3 of the License, or\n   (at your option) any later version.\n   \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n   \n   You should have received a copy of the GNU General Public License\n   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */\n\n/* As a special exception, you may create a larger work that contains\n   part or all of the Bison parser skeleton and distribute that work\n   under terms of your choice, so long as that work isn't itself a\n   parser generator using the skeleton or a modified version thereof\n   as a parser skeleton.  Alternatively, if you modify or redistribute\n   the parser skeleton itself, you may (at your option) remove this\n   special exception, which will cause the skeleton and the resulting\n   Bison output files to be licensed under the GNU General Public\n   License without this special exception.\n   \n   This special exception was added by the Free Software Foundation in\n   version 2.2 of Bison.  */\n\n/**\n ** \\file position.hh\n ** Define the yy::position class.\n */\n\n#ifndef YY_YY_POSITION_HH_INCLUDED\n# define YY_YY_POSITION_HH_INCLUDED\n\n# include <algorithm> // std::max\n# include <iostream>\n# include <string>\n\n# ifndef YY_NULL\n#  if defined __cplusplus && 201103L <= __cplusplus\n#   define YY_NULL nullptr\n#  else\n#   define YY_NULL 0\n#  endif\n# endif\n\n\nnamespace yy {\n/* Line 36 of location.cc  */\n#line 57 \"position.hh\"\n  /// Abstract a position.\n  class position\n  {\n  public:\n\n    /// Construct a position.\n    explicit position (std::string* f = YY_NULL,\n                       unsigned int l = 1u,\n                       unsigned int c = 1u)\n      : filename (f)\n      , line (l)\n      , column (c)\n    {\n    }\n\n\n    /// Initialization.\n    void initialize (std::string* fn = YY_NULL,\n                     unsigned int l = 1u,\n                     unsigned int c = 1u)\n    {\n      filename = fn;\n      line = l;\n      column = c;\n    }\n\n    /** \\name Line and Column related manipulators\n     ** \\{ */\n    /// (line related) Advance to the COUNT next lines.\n    void lines (int count = 1)\n    {\n      column = 1u;\n      line += count;\n    }\n\n    /// (column related) Advance to the COUNT next columns.\n    void columns (int count = 1)\n    {\n      column = std::max (1u, column + count);\n    }\n    /** \\} */\n\n    /// File name to which this position refers.\n    std::string* filename;\n    /// Current line number.\n    unsigned int line;\n    /// Current column number.\n    unsigned int column;\n  };\n\n  /// Add and assign a position.\n  inline position&\n  operator+= (position& res, const int width)\n  {\n    res.columns (width);\n    return res;\n  }\n\n  /// Add two position objects.\n  inline const position\n  operator+ (const position& begin, const int width)\n  {\n    position res = begin;\n    return res += width;\n  }\n\n  /// Add and assign a position.\n  inline position&\n  operator-= (position& res, const int width)\n  {\n    return res += -width;\n  }\n\n  /// Add two position objects.\n  inline const position\n  operator- (const position& begin, const int width)\n  {\n    return begin + -width;\n  }\n\n  /// Compare two position objects.\n  inline bool\n  operator== (const position& pos1, const position& pos2)\n  {\n    return (pos1.line == pos2.line\n            && pos1.column == pos2.column\n            && (pos1.filename == pos2.filename\n                || (pos1.filename && pos2.filename\n                    && *pos1.filename == *pos2.filename)));\n  }\n\n  /// Compare two position objects.\n  inline bool\n  operator!= (const position& pos1, const position& pos2)\n  {\n    return !(pos1 == pos2);\n  }\n\n  /** \\brief Intercept output stream redirection.\n   ** \\param ostr the destination output stream\n   ** \\param pos a reference to the position to redirect\n   */\n  template <typename YYChar>\n  inline std::basic_ostream<YYChar>&\n  operator<< (std::basic_ostream<YYChar>& ostr, const position& pos)\n  {\n    if (pos.filename)\n      ostr << *pos.filename << ':';\n    return ostr << pos.line << '.' << pos.column;\n  }\n\n\n} // yy\n/* Line 148 of location.cc  */\n#line 172 \"position.hh\"\n#endif /* !YY_YY_POSITION_HH_INCLUDED  */\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/qjson_debug.h",
    "content": "/* This file is part of qjson\n  *\n  * Copyright (C) 2009 Michael Leupold <lemma@confuego.org>\n  * Copyright (C) 2013 Silvio Moioli <silvio@moioli.net>\n  *\n  * This library is free software; you can redistribute it and/or\n  * modify it under the terms of the GNU Lesser General Public\n  * License version 2.1, as published by the Free Software Foundation.\n  * \n  *\n  * This library is distributed in the hope that it will be useful,\n  * but WITHOUT ANY WARRANTY; without even the implied warranty of\n  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n  * Lesser General Public License for more details.\n  *\n  * You should have received a copy of the GNU Lesser General Public License\n  * along with this library; see the file COPYING.LIB.  If not, write to\n  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n  * Boston, MA 02110-1301, USA.\n  */\n\n#ifndef QJSON_DEBUG_H\n#define QJSON_DEBUG_H\n\n#include <QtCore/QDebug>\n\n// define qjsonDebug()\n#ifdef QJSON_VERBOSE_DEBUG_OUTPUT\n  inline QDebug qjsonDebug() { return QDebug(QtDebugMsg); }\n#else\n  #define qjsonDebug() if(false) QDebug(QtDebugMsg)\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/qjson_export.h",
    "content": "/*  This file is part of the KDE project\n    Copyright (C) 2009 Pino Toscano <pino@kde.org>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License version 2.1, as published by the Free Software Foundation.\n    \n\n    This library is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with this library; see the file COPYING.LIB.  If not, write to\n    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n    Boston, MA 02110-1301, USA.\n*/\n\n#ifndef QJSON_EXPORT_H\n#define QJSON_EXPORT_H\n\n#include <QtCore/qglobal.h>\n\n#ifndef QJSON_STATIC\n# ifndef QJSON_EXPORT\n#  if defined(QJSON_MAKEDLL)\n    /* We are building this library */\n#   define QJSON_EXPORT Q_DECL_EXPORT\n#  else\n    /* We are using this library */\n#   define QJSON_EXPORT Q_DECL_IMPORT\n#  endif\n# endif\n#endif\n#ifndef QJSON_EXPORT\n# define QJSON_EXPORT\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/qobjecthelper.cpp",
    "content": "/* This file is part of qjson\n  *\n  * Copyright (C) 2009 Till Adam <adam@kde.org>\n  * Copyright (C) 2009 Flavio Castelli <flavio@castelli.name>\n  *\n  * This library is free software; you can redistribute it and/or\n  * modify it under the terms of the GNU Lesser General Public\n  * License version 2.1, as published by the Free Software Foundation.\n  *\n  *\n  * This library is distributed in the hope that it will be useful,\n  * but WITHOUT ANY WARRANTY; without even the implied warranty of\n  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n  * Lesser General Public License for more details.\n  *\n  * You should have received a copy of the GNU Lesser General Public License\n  * along with this library; see the file COPYING.LIB.  If not, write to\n  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n  * Boston, MA 02110-1301, USA.\n  */\n\n\n#include \"qobjecthelper.h\"\n\n#include <QtCore/QMetaObject>\n#include <QtCore/QMetaProperty>\n#include <QtCore/QObject>\n\nusing namespace QJson;\n\nclass QObjectHelper::QObjectHelperPrivate {\n};\n\nQObjectHelper::QObjectHelper()\n  : d (new QObjectHelperPrivate)\n{\n}\n\nQObjectHelper::~QObjectHelper()\n{\n  delete d;\n}\n\nQVariantMap QObjectHelper::qobject2qvariant( const QObject* object,\n                              const QStringList& ignoredProperties)\n{\n  QVariantMap result;\n  const QMetaObject *metaobject = object->metaObject();\n  int count = metaobject->propertyCount();\n  for (int i=0; i<count; ++i) {\n    QMetaProperty metaproperty = metaobject->property(i);\n    const char *name = metaproperty.name();\n\n    if (ignoredProperties.contains(QLatin1String(name)) || (!metaproperty.isReadable()))\n      continue;\n\n    QVariant value = object->property(name);\n    result[QLatin1String(name)] = value;\n }\n  return result;\n}\n\nvoid QObjectHelper::qvariant2qobject(const QVariantMap& variant, QObject* object)\n{\n  const QMetaObject *metaobject = object->metaObject();\n\n  QVariantMap::const_iterator iter;\n  for (iter = variant.constBegin(); iter != variant.constEnd(); ++iter) {\n    int pIdx = metaobject->indexOfProperty( iter.key().toLatin1() );\n\n    if ( pIdx < 0 ) {\n      continue;\n    }\n\n    QMetaProperty metaproperty = metaobject->property( pIdx );\n    QVariant::Type type = metaproperty.type();\n    QVariant v( iter.value() );\n    if ( v.canConvert( type ) ) {\n      v.convert( type );\n      metaproperty.write( object, v );\n    } else if (QString(QLatin1String(\"QVariant\")).compare(QLatin1String(metaproperty.typeName())) == 0) {\n     metaproperty.write( object, v );\n    }\n  }\n}\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/qobjecthelper.h",
    "content": "/* This file is part of qjson\n  *\n  * Copyright (C) 2009 Flavio Castelli <flavio@castelli.name>\n  *\n  * This library is free software; you can redistribute it and/or\n  * modify it under the terms of the GNU Lesser General Public\n  * License version 2.1, as published by the Free Software Foundation.\n  * \n  *\n  * This library is distributed in the hope that it will be useful,\n  * but WITHOUT ANY WARRANTY; without even the implied warranty of\n  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n  * Lesser General Public License for more details.\n  *\n  * You should have received a copy of the GNU Lesser General Public License\n  * along with this library; see the file COPYING.LIB.  If not, write to\n  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n  * Boston, MA 02110-1301, USA.\n  */\n\n#ifndef QOBJECTHELPER_H\n#define QOBJECTHELPER_H\n\n#include \"qjson_export.h\"\n\n#include <QtCore/QLatin1String>\n#include <QtCore/QStringList>\n#include <QtCore/QVariantMap>\n\nQT_BEGIN_NAMESPACE\nclass QObject;\nQT_END_NAMESPACE\n\nnamespace QJson {\n  /**\n  * @brief Class used to convert QObject into QVariant and vivce-versa.\n  * During these operations only the class attributes defined as properties will\n  * be considered.\n  * Properties marked as 'non-stored' will be ignored.\n  *\n  * Suppose the declaration of the Person class looks like this:\n  * \\code\n  * class Person : public QObject\n    {\n      Q_OBJECT\n\n      Q_PROPERTY(QString name READ name WRITE setName)\n      Q_PROPERTY(int phoneNumber READ phoneNumber WRITE setPhoneNumber)\n      Q_PROPERTY(Gender gender READ gender WRITE setGender)\n      Q_PROPERTY(QDate dob READ dob WRITE setDob)\n      Q_ENUMS(Gender)\n\n     public:\n        Person(QObject* parent = 0);\n        ~Person();\n\n        QString name() const;\n        void setName(const QString& name);\n\n        int phoneNumber() const;\n        void setPhoneNumber(const int  phoneNumber);\n\n        enum Gender {Male, Female};\n        void setGender(Gender gender);\n        Gender gender() const;\n\n        QDate dob() const;\n        void setDob(const QDate& dob);\n\n      private:\n        QString m_name;\n        int m_phoneNumber;\n        Gender m_gender;\n        QDate m_dob;\n    };\n    \\endcode\n\n    The following code will serialize an instance of Person to JSON :\n\n    \\code\n    Person person;\n    person.setName(\"Flavio\");\n    person.setPhoneNumber(123456);\n    person.setGender(Person::Male);\n    person.setDob(QDate(1982, 7, 12));\n\n    QVariantMap variant = QObjectHelper::qobject2qvariant(&person);\n    Serializer serializer;\n    qDebug() << serializer.serialize( variant);\n    \\endcode\n\n    The generated output will be:\n    \\code\n    { \"dob\" : \"1982-07-12\", \"gender\" : 0, \"name\" : \"Flavio\", \"phoneNumber\" : 123456 }\n    \\endcode\n\n    It's also possible to initialize a QObject using the values stored inside of\n    a QVariantMap.\n\n    Suppose you have the following JSON data stored into a QString:\n    \\code\n    { \"dob\" : \"1982-07-12\", \"gender\" : 0, \"name\" : \"Flavio\", \"phoneNumber\" : 123456 }\n    \\endcode\n\n    The following code will initialize an already allocated instance of Person\n    using the JSON values:\n    \\code\n    Parser parser;\n    QVariant variant = parser.parse(json);\n\n    Person person;\n    QObjectHelper::qvariant2qobject(variant.toMap(), &person);\n    \\endcode\n\n    \\sa Parser\n    \\sa Serializer\n  */\n  class QJSON_EXPORT QObjectHelper {\n    public:\n      QObjectHelper();\n      ~QObjectHelper();\n\n    /**\n    * This method converts a QObject instance into a QVariantMap.\n    *\n    * @param object The QObject instance to be converted.\n    * @param ignoredProperties Properties that won't be converted.\n    */\n    static QVariantMap qobject2qvariant( const QObject* object,\n                                  const QStringList& ignoredProperties = QStringList(QString(QLatin1String(\"objectName\"))));\n\n    /**\n    * This method converts a QVariantMap instance into a QObject\n    *\n    * @param variant Attributes to assign to the object.\n    * @param object The QObject instance to update.\n    */\n    static void qvariant2qobject(const QVariantMap& variant, QObject* object);\n\n    private:\n      Q_DISABLE_COPY(QObjectHelper)\n      class QObjectHelperPrivate;\n      QObjectHelperPrivate* const d;\n  };\n}\n\n#endif // QOBJECTHELPER_H\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/serializer.cpp",
    "content": "/* This file is part of qjson\n  *\n  * Copyright (C) 2009 Till Adam <adam@kde.org>\n  * Copyright (C) 2009 Flavio Castelli <flavio@castelli.name>\n  *\n  * This library is free software; you can redistribute it and/or\n  * modify it under the terms of the GNU Lesser General Public\n  * License version 2.1, as published by the Free Software Foundation.\n  *\n  * This library is distributed in the hope that it will be useful,\n  * but WITHOUT ANY WARRANTY; without even the implied warranty of\n  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n  * Lesser General Public License for more details.\n  *\n  * You should have received a copy of the GNU Lesser General Public License\n  * along with this library; see the file COPYING.LIB.  If not, write to\n  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n  * Boston, MA 02110-1301, USA.\n  */\n\n#include \"serializer.h\"\n\n#include <QtCore/QDataStream>\n#include <QtCore/QStringList>\n#include <QtCore/QVariant>\n\n// cmath does #undef for isnan and isinf macroses what can be defined in math.h\n#if defined(Q_OS_SYMBIAN) || defined(Q_OS_ANDROID) || defined(Q_OS_BLACKBERRY) || defined(Q_OS_SOLARIS)\n# include <math.h>\n#else\n# include <cmath>\n#endif\n\n#ifdef Q_OS_SOLARIS\n# ifndef isinf\n#  include <ieeefp.h>\n#  define isinf(x) (!finite((x)) && (x)==(x))\n# endif\n#endif\n\n#ifdef _MSC_VER  // using MSVC compiler\n#include <float.h>\n#endif\n\nusing namespace QJson;\n\nclass Serializer::SerializerPrivate {\n  public:\n    SerializerPrivate() :\n      specialNumbersAllowed(false),\n      indentMode(QJson::IndentNone),\n      doublePrecision(6) {\n        errorMessage.clear();\n    }\n    QString errorMessage;\n    bool specialNumbersAllowed;\n    IndentMode indentMode;\n    int doublePrecision;\n\n    QByteArray serialize( const QVariant &v, bool *ok, int indentLevel = 0);\n\n    static QByteArray buildIndent(int spaces);\n    static QByteArray escapeString( const QString& str );\n    static QByteArray join( const QList<QByteArray>& list, const QByteArray& sep );\n};\n\nQByteArray Serializer::SerializerPrivate::join( const QList<QByteArray>& list, const QByteArray& sep ) {\n  QByteArray res;\n  Q_FOREACH( const QByteArray& i, list ) {\n    if ( !res.isEmpty() )\n      res += sep;\n    res += i;\n  }\n  return res;\n}\n\nQByteArray Serializer::SerializerPrivate::serialize( const QVariant &v, bool *ok, int indentLevel)\n{\n  QByteArray str;\n\n  if ( ! v.isValid() ) { // invalid or null?\n    str = \"null\";\n  } else if (( v.type() == QVariant::List ) || ( v.type() == QVariant::StringList )){ // an array or a stringlist?\n    const QVariantList list = v.toList();\n    QList<QByteArray> values;\n    Q_FOREACH( const QVariant& var, list )\n    {\n      QByteArray serializedValue;\n\n      serializedValue = serialize( var, ok, indentLevel+1);\n\n      if ( !*ok ) {\n        break;\n      }\n      switch(indentMode) {\n        case QJson::IndentFull :\n        case QJson::IndentMedium :\n        case QJson::IndentMinimum :\n          values << serializedValue;\n          break;\n        case QJson::IndentCompact :\n        case QJson::IndentNone :\n        default:\n          values << serializedValue.trimmed();\n          break;\n      }\n    }\n\n    if (indentMode == QJson::IndentMedium || indentMode == QJson::IndentFull ) {\n      QByteArray indent = buildIndent(indentLevel);\n      str = indent + \"[\\n\" + join( values, \",\\n\" ) + \"\\n\" + indent + \"]\";\n    }\n    else if (indentMode == QJson::IndentMinimum) {\n      QByteArray indent = buildIndent(indentLevel);\n      str = indent + \"[\\n\" + join( values, \",\\n\" ) + \"\\n\" + indent + \"]\";\n    }\n    else if (indentMode == QJson::IndentCompact) {\n      str = \"[\" + join( values, \",\" ) + \"]\";\n    }\n    else {\n      str = \"[ \" + join( values, \", \" ) + \" ]\";\n    }\n\n  } else if ( v.type() == QVariant::Map ) { // variant is a map?\n    const QVariantMap vmap = v.toMap();\n    QMapIterator<QString, QVariant> it( vmap );\n\n    if (indentMode == QJson::IndentMinimum) {\n      QByteArray indent = buildIndent(indentLevel);\n      str = indent + \"{ \";\n    }\n    else if (indentMode == QJson::IndentMedium || indentMode == QJson::IndentFull) {\n      QByteArray indent = buildIndent(indentLevel);\n      QByteArray nextindent = buildIndent(indentLevel + 1);\n      str = indent + \"{\\n\" + nextindent;\n    }\n    else if (indentMode == QJson::IndentCompact) {\n      str = \"{\";\n    }\n    else {\n      str = \"{ \";\n    }\n\n    QList<QByteArray> pairs;\n    while ( it.hasNext() ) {\n      it.next();\n      indentLevel++;\n      QByteArray serializedValue = serialize( it.value(), ok, indentLevel);\n      indentLevel--;\n      if ( !*ok ) {\n        break;\n      }\n      QByteArray key   = escapeString( it.key() );\n      QByteArray value = serializedValue.trimmed();\n      if (indentMode == QJson::IndentCompact) {\n        pairs << key + \":\" + value;\n      } else {\n        pairs << key + \" : \" + value;\n      }\n    }\n\n    if (indentMode == QJson::IndentFull) {\n      QByteArray indent = buildIndent(indentLevel + 1);\n      str += join( pairs, \",\\n\" + indent);\n    }\n    else if (indentMode == QJson::IndentCompact) {\n      str += join( pairs, \",\" );\n    }\n    else {\n      str += join( pairs, \", \" );\n    }\n\n    if (indentMode == QJson::IndentMedium || indentMode == QJson::IndentFull) {\n      QByteArray indent = buildIndent(indentLevel);\n      str += \"\\n\" + indent + \"}\";\n    }\n    else if (indentMode == QJson::IndentCompact) {\n      str += \"}\";\n    }\n    else {\n      str += \" }\";\n    }\n\n  } else if ( v.type() == QVariant::Hash ) { // variant is a hash?\n    const QVariantHash vhash = v.toHash();\n    QHashIterator<QString, QVariant> it( vhash );\n\n    if (indentMode == QJson::IndentMinimum) {\n      QByteArray indent = buildIndent(indentLevel);\n      str = indent + \"{ \";\n    }\n    else if (indentMode == QJson::IndentMedium || indentMode == QJson::IndentFull) {\n      QByteArray indent = buildIndent(indentLevel);\n      QByteArray nextindent = buildIndent(indentLevel + 1);\n      str = indent + \"{\\n\" + nextindent;\n    }\n    else if (indentMode == QJson::IndentCompact) {\n      str = \"{\";\n    }\n    else {\n      str = \"{ \";\n    }\n\n    QList<QByteArray> pairs;\n    while ( it.hasNext() ) {\n      it.next();\n\n      QByteArray serializedValue = serialize( it.value(), ok, indentLevel + 1);\n\n      if ( !*ok ) {\n        break;\n      }\n      QByteArray key   = escapeString( it.key() );\n      QByteArray value = serializedValue.trimmed();\n      if (indentMode == QJson::IndentCompact) {\n        pairs << key + \":\" + value;\n      } else {\n        pairs << key + \" : \" + value;\n      }\n    }\n\n    if (indentMode == QJson::IndentFull) {\n      QByteArray indent = buildIndent(indentLevel + 1);\n      str += join( pairs, \",\\n\" + indent);\n    }\n    else if (indentMode == QJson::IndentCompact) {\n      str += join( pairs, \",\" );\n    }\n    else {\n      str += join( pairs, \", \" );\n    }\n\n    if (indentMode == QJson::IndentMedium || indentMode == QJson::IndentFull) {\n      QByteArray indent = buildIndent(indentLevel);\n      str += \"\\n\" + indent + \"}\";\n    }\n    else if (indentMode == QJson::IndentCompact) {\n      str += \"}\";\n    }\n    else {\n      str += \" }\";\n    }\n\n  } else {\n    // Add indent, we may need to remove it later for some layouts\n    switch(indentMode) {\n      case QJson::IndentFull :\n      case QJson::IndentMedium :\n      case QJson::IndentMinimum :\n        str += buildIndent(indentLevel);\n        break;\n      case QJson::IndentCompact :\n      case QJson::IndentNone :\n      default:\n        break;\n    }\n\n    if (( v.type() == QVariant::String ) ||  ( v.type() == QVariant::ByteArray )) { // a string or a byte array?\n      str += escapeString( v.toString() );\n    } else if (( v.type() == QVariant::Double) || ((QMetaType::Type)v.type() == QMetaType::Float)) { // a double or a float?\n      const double value = v.toDouble();\n  #if defined _WIN32 && !defined(Q_OS_SYMBIAN)\n      const bool special = _isnan(value) || !_finite(value);\n  #elif defined(Q_OS_SYMBIAN) || defined(Q_OS_ANDROID) || defined(Q_OS_BLACKBERRY) || defined(Q_OS_SOLARIS)\n      const bool special = isnan(value) || isinf(value);\n  #else\n      const bool special = std::isnan(value) || std::isinf(value);\n  #endif\n      if (special) {\n        if (specialNumbersAllowed) {\n  #if defined _WIN32 && !defined(Q_OS_SYMBIAN)\n          if (_isnan(value)) {\n  #elif defined(Q_OS_SYMBIAN) || defined(Q_OS_ANDROID) || defined(Q_OS_BLACKBERRY) || defined(Q_OS_SOLARIS)\n          if (isnan(value)) {\n  #else\n          if (std::isnan(value)) {\n  #endif\n            str += \"NaN\";\n          } else {\n            if (value<0) {\n              str += '-';\n            }\n            str += \"Infinity\";\n          }\n        } else {\n          errorMessage += QLatin1String(\"Attempt to write NaN or infinity, which is not supported by json\\n\");\n          *ok = false;\n      }\n      } else {\n        str = QByteArray::number( value , 'g', doublePrecision);\n        if( ! str.contains( \".\" ) && ! str.contains( \"e\" ) ) {\n          str += \".0\";\n        }\n      }\n    } else if ( v.type() == QVariant::Bool ) { // boolean value?\n      str += ( v.toBool() ? \"true\" : \"false\" );\n    } else if ( v.type() == QVariant::ULongLong ) { // large unsigned number?\n      str += QByteArray::number( v.value<qulonglong>() );\n    } else if ( v.type() == QVariant::UInt ) { // unsigned int number?\n      str += QByteArray::number( v.value<quint32>() );\n    } else if ( v.canConvert<qlonglong>() ) { // any signed number?\n      str += QByteArray::number( v.value<qlonglong>() );\n    } else if ( v.canConvert<int>() ) { // unsigned short number?\n      str += QByteArray::number( v.value<int>() );\n    } else if ( v.canConvert<QString>() ){ // can value be converted to string?\n      // this will catch QDate, QDateTime, QUrl, ...\n      str += escapeString( v.toString() );\n      //TODO: catch other values like QImage, QRect, ...\n    } else {\n      *ok = false;\n      errorMessage += QLatin1String(\"Cannot serialize \");\n      errorMessage += v.toString();\n      errorMessage += QLatin1String(\" because type \");\n      errorMessage += QLatin1String(v.typeName());\n      errorMessage += QLatin1String(\" is not supported by QJson\\n\");\n    }\n  }\n  if ( *ok )\n  {\n    return str;\n  }\n  else\n    return QByteArray();\n}\n\nQByteArray Serializer::SerializerPrivate::buildIndent(int spaces)\n{\n   QByteArray indent;\n   if (spaces < 0) {\n     spaces = 0;\n   }\n   for (int i = 0; i < spaces; i++ ) {\n     indent += \" \";\n   }\n   return indent;\n}\n\nQByteArray Serializer::SerializerPrivate::escapeString( const QString& str )\n{\n  QByteArray result;\n  result.reserve(str.size() + 2);\n  result.append('\\\"');\n  for (QString::const_iterator it = str.begin(); it != str.end(); it++) {\n    ushort unicode = it->unicode();\n    switch ( unicode ) {\n      case '\\\"':\n        result.append(\"\\\\\\\"\");\n        break;\n      case '\\\\':\n        result.append(\"\\\\\\\\\");\n        break;\n      case '\\b':\n        result.append(\"\\\\b\");\n        break;\n      case '\\f':\n        result.append(\"\\\\f\");\n        break;\n      case '\\n':\n        result.append(\"\\\\n\");\n        break;\n      case '\\r':\n        result.append(\"\\\\r\");\n        break;\n      case '\\t':\n        result.append(\"\\\\t\");\n        break;\n      default:\n        if ( unicode > 0x1F && unicode < 128 ) {\n          result.append(static_cast<char>(unicode));\n        } else {\n          char escaped[7];\n          qsnprintf(escaped, sizeof(escaped)/sizeof(char), \"\\\\u%04x\", unicode);\n          result.append(escaped);\n        }\n    }\n  }\n  result.append('\\\"');\n  return result;\n}\n\nSerializer::Serializer()\n  : d( new SerializerPrivate )\n{\n}\n\nSerializer::~Serializer() {\n  delete d;\n}\n\nvoid Serializer::serialize( const QVariant& v, QIODevice* io, bool* ok)\n{\n  Q_ASSERT( io );\n  *ok = true;\n\n  if (!io->isOpen()) {\n    if (!io->open(QIODevice::WriteOnly)) {\n      d->errorMessage = QLatin1String(\"Error opening device\");\n      *ok = false;\n      return;\n    }\n  }\n\n  if (!io->isWritable()) {\n    d->errorMessage = QLatin1String(\"Device is not readable\");\n    io->close();\n    *ok = false;\n    return;\n  }\n\n  const QByteArray str = serialize( v, ok);\n  if (*ok && (io->write(str) != str.count())) {\n    *ok = false;\n    d->errorMessage = QLatin1String(\"Something went wrong while writing to IO device\");\n  }\n}\n\nQByteArray Serializer::serialize( const QVariant &v)\n{\n  bool ok;\n\n  return serialize(v, &ok);\n}\n\nQByteArray Serializer::serialize( const QVariant &v, bool *ok)\n{\n  bool _ok = true;\n  d->errorMessage.clear();\n\n  if (ok) {\n    *ok = true;\n  } else {\n    ok = &_ok;\n  }\n\n  return d->serialize(v, ok);\n}\n\nvoid QJson::Serializer::allowSpecialNumbers(bool allow) {\n  d->specialNumbersAllowed = allow;\n}\n\nbool QJson::Serializer::specialNumbersAllowed() const {\n  return d->specialNumbersAllowed;\n}\n\nvoid QJson::Serializer::setIndentMode(IndentMode mode) {\n  d->indentMode = mode;\n}\n\nvoid QJson::Serializer::setDoublePrecision(int precision) {\n  d->doublePrecision = precision;\n}\n\nIndentMode QJson::Serializer::indentMode() const {\n  return d->indentMode;\n}\n\nQString QJson::Serializer::errorMessage() const {\n  return d->errorMessage;\n}\n\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/serializer.h",
    "content": "/* This file is part of qjson\n  *\n  * Copyright (C) 2009 Till Adam <adam@kde.org>\n  *\n  * This library is free software; you can redistribute it and/or\n  * modify it under the terms of the GNU Lesser General Public\n  * License version 2.1, as published by the Free Software Foundation.\n  * \n  *\n  * This library is distributed in the hope that it will be useful,\n  * but WITHOUT ANY WARRANTY; without even the implied warranty of\n  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n  * Lesser General Public License for more details.\n  *\n  * You should have received a copy of the GNU Lesser General Public License\n  * along with this library; see the file COPYING.LIB.  If not, write to\n  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n  * Boston, MA 02110-1301, USA.\n  */\n\n#ifndef QJSON_SERIALIZER_H\n#define QJSON_SERIALIZER_H\n\n#include \"qjson_export.h\"\n\nQT_BEGIN_NAMESPACE\nclass QIODevice;\nclass QString;\nclass QVariant;\nQT_END_NAMESPACE\n\nnamespace QJson {\n  /**\n   @brief How the indentation should work.\n   \\verbatim\n   none (default) :\n            { \"foo\" : 0, \"foo1\" : 1, \"foo2\" : [ { \"bar\" : 1, \"foo\" : 0, \"foobar\" : 0 }, { \"bar\" : 1, \"foo\" : 1, \"foobar\" : 1 } ], \"foo3\" : [ 1, 2, 3, 4, 5, 6 ] }\n  \n   compact :\n            {\"foo\":0,\"foo1\":1,\"foo2\":[{\"bar\":1,\"foo\":0,\"foobar\":0},{\"bar\":1,\"foo\":1,\"foobar\":1}],\"foo3\":[1,2,3,4,5,6]}\n  \n   minimum :\n            { \"foo\" : 0, \"foo1\" : 1, \"foo2\" : [\n              { \"bar\" : 1, \"foo\" : 0, \"foobar\" : 0 },\n              { \"bar\" : 1, \"foo\" : 1, \"foobar\" : 1 }\n             ], \"foo3\" : [\n              1,\n              2,\n              3,\n              4,\n              5,\n              6\n             ] }\n\n   medium :\n            {\n             \"foo\" : 0, \"foo1\" : 1, \"foo2\" : [\n              {\n               \"bar\" : 1, \"foo\" : 0, \"foobar\" : 0\n              },\n              {\n               \"bar\" : 1, \"foo\" : 1, \"foobar\" : 1\n              }\n             ], \"foo3\" : [\n              1,\n              2,\n              3,\n              4,\n              5,\n              6\n             ]\n            }\n\n   full :\n            {\n             \"foo\" : 0,\n             \"foo1\" : 1,\n             \"foo2\" : [\n              {\n               \"bar\" : 1,\n               \"foo\" : 0,\n               \"foobar\" : 0\n              },\n              {\n               \"bar\" : 1,\n               \"foo\" : 1,\n               \"foobar\" : 1\n              }\n             ],\n             \"foo3\" : [\n              1,\n              2,\n              3,\n              4,\n              5,\n              6\n             ]\n            }\n\n  \n   \\endverbatim\n  */\n  enum IndentMode {\n    IndentNone,\n    IndentCompact,\n    IndentMinimum,\n    IndentMedium,\n    IndentFull\n  };\n  /**\n  * @brief Main class used to convert QVariant objects to JSON data.\n  *\n  * QVariant objects are converted to a string containing the JSON data.\n  *\n  *\n  * Usage:\n  *\n  * \\code\n  * QVariantList people;\n  *\n  * QVariantMap bob;\n  * bob.insert(\"Name\", \"Bob\");\n  * bob.insert(\"Phonenumber\", 123);\n  *\n  * QVariantMap alice;\n  * alice.insert(\"Name\", \"Alice\");\n  * alice.insert(\"Phonenumber\", 321);\n  *\n  * people << bob << alice;\n  *\n  * QJson::Serializer serializer;\n  * bool ok;\n  * QByteArray json = serializer.serialize(people, &ok);\n  *\n  * if (ok) {\n  *   qDebug() << json;\n  * } else {\n  *   qCritical() << \"Something went wrong:\" << serializer.errorMessage();\n  * }\n  * \\endcode\n  *\n  * The output will be:\n  *\n  * \\code\n  *  \"[ { \"Name\" : \"Bob\", \"Phonenumber\" : 123 },\n  *     { \"Name\" : \"Alice\", \"Phonenumber\" : 321 } ]\"\n  * \\endcode\n  *\n  * It's possible to tune the indentation level of the resulting string. \\sa setIndentMode\n  */\n  class QJSON_EXPORT Serializer {\n  public:\n    Serializer();\n    ~Serializer();\n\n     /**\n      * This method generates a textual JSON representation and outputs it to the\n      * passed in I/O Device.\n      * @param variant The JSON document in its in-memory representation as generated by the\n      * parser.\n      * @param out Input output device\n      * @param ok if a conversion error occurs, *ok is set to false; otherwise *ok is set to true\n      */\n    void serialize( const QVariant& variant, QIODevice* out, bool* ok);\n\n    /**\n      * This is a method provided for convenience. It turns the passed in in-memory\n      * representation of the JSON document into a textual one, which is returned.\n      * If the returned string is empty, the document was empty. If it was null, there\n      * was a parsing error.\n      *\n      * @param variant The JSON document in its in-memory representation as generated by the\n      * parser.\n      *\n      * \\deprecated This method is going to be removed with the next major release of QJson.\n      */\n    QByteArray serialize( const QVariant& variant);\n\n    /**\n      * This is a method provided for convenience. It turns the passed in in-memory\n      * representation of the JSON document into a textual one, which is returned.\n      * If the returned string is empty, the document was empty. If it was null, there\n      * was a parsing error.\n      *\n      * @param variant The JSON document in its in-memory representation as generated by the\n      * parser.\n      * @param ok if a conversion error occurs, *ok is set to false; otherwise *ok is set to true\n      */\n    QByteArray serialize( const QVariant& variant, bool *ok);\n\n    /**\n     * Allow or disallow writing of NaN and/or Infinity (as an extension to QJson)\n     */\n    void allowSpecialNumbers(bool allow);\n\n    /**\n     * Is Nan and/or Infinity allowed?\n     */\n    bool specialNumbersAllowed() const;\n\n    /**\n     * set output indentation mode as defined in QJson::IndentMode\n     */\n    void setIndentMode(IndentMode mode = QJson::IndentNone);\n\n\n    /**\n    * set double precision used while converting Double\n    * \\sa QByteArray::number\n    */\n    void setDoublePrecision(int precision);\n\n    /**\n     * Returns one of the indentation modes defined in QJson::IndentMode\n     */\n    IndentMode indentMode() const;\n\n    /**\n     * Returns the error message\n     */\n    QString errorMessage() const;\n\n  private:\n    Q_DISABLE_COPY(Serializer)\n    class SerializerPrivate;\n    SerializerPrivate* const d;\n  };\n}\n\n#endif // QJSON_SERIALIZER_H\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/serializerrunnable.cpp",
    "content": "#include \"serializerrunnable.h\"\n\n/* This file is part of qjson\n *\n * Copyright (C) 2009 Flavio Castelli <flavio@castelli.name>\n *               2009 Frank Osterfeld <osterfeld@kde.org>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License version 2.1, as published by the Free Software Foundation.\n * \n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this library; see the file COPYING.LIB.  If not, write to\n * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#include \"parserrunnable.h\"\n#include \"serializer.h\"\n\n#include <QtCore/QDebug>\n#include <QtCore/QVariant>\n\nusing namespace QJson;\n\nclass SerializerRunnable::Private\n{\npublic:\n  QVariant json;\n};\n\nSerializerRunnable::SerializerRunnable(QObject* parent)\n    : QObject(parent),\n      QRunnable(),\n      d(new Private)\n{\n  qRegisterMetaType<QVariant>(\"QVariant\");\n}\n\nSerializerRunnable::~SerializerRunnable()\n{\n  delete d;\n}\n\nvoid SerializerRunnable::setJsonObject( const QVariant& json )\n{\n  d->json = json;\n}\n\nvoid SerializerRunnable::run()\n{\n  Serializer serializer;\n  bool ok;\n  const QByteArray serialized = serializer.serialize( d->json, &ok);\n  emit parsingFinished( serialized, ok, serializer.errorMessage() );\n}\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/serializerrunnable.h",
    "content": "/* This file is part of qjson\n *\n * Copyright (C) 2009 Frank Osterfeld <osterfeld@kde.org>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License version 2.1, as published by the Free Software Foundation.\n * \n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this library; see the file COPYING.LIB.  If not, write to\n * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#ifndef SERIALIZERRUNNABLE_H\n#define SERIALIZERRUNNABLE_H\n\n#include \"qjson_export.h\"\n\n#include <QtCore/QObject>\n#include <QtCore/QRunnable>\n\nQT_BEGIN_NAMESPACE\nclass QByteArray;\nclass QString;\nclass QVariant;\nQT_END_NAMESPACE\n\nnamespace QJson {\n  /**\n  * @brief Convenience class for converting JSON data to QVariant objects using a dedicated thread\n  */\n  class QJSON_EXPORT SerializerRunnable  : public QObject, public QRunnable\n  {\n    Q_OBJECT\n    public:\n      explicit SerializerRunnable(QObject* parent = 0);\n      ~SerializerRunnable();\n\n      /**\n       * Sets the json object to serialize.\n       *\n       * @param json QVariant containing the json representation to be serialized\n       */\n      void setJsonObject( const QVariant& json );\n\n      /* reimp */ void run();\n\n    Q_SIGNALS:\n      /**\n      * This signal is emitted when the serialization process has been completed\n      * @param serialized contains the result of the serialization\n      * @param ok if a serialization error occurs ok is set to false, otherwise it's set to true.\n      * @param error_msg contains a string explaining the failure reason\n      **/\n      void parsingFinished(const QByteArray& serialized, bool ok, const QString& error_msg);\n\n    private:\n      Q_DISABLE_COPY(SerializerRunnable)\n      class Private;\n      Private* const d;\n  };\n}\n\n#endif // SERIALIZERRUNNABLE_H\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/src/stack.hh",
    "content": "/* A Bison parser, made by GNU Bison 2.7.  */\n\n/* Stack handling for Bison parsers in C++\n   \n      Copyright (C) 2002-2012 Free Software Foundation, Inc.\n   \n   This program is free software: you can redistribute it and/or modify\n   it under the terms of the GNU General Public License as published by\n   the Free Software Foundation, either version 3 of the License, or\n   (at your option) any later version.\n   \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n   \n   You should have received a copy of the GNU General Public License\n   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */\n\n/* As a special exception, you may create a larger work that contains\n   part or all of the Bison parser skeleton and distribute that work\n   under terms of your choice, so long as that work isn't itself a\n   parser generator using the skeleton or a modified version thereof\n   as a parser skeleton.  Alternatively, if you modify or redistribute\n   the parser skeleton itself, you may (at your option) remove this\n   special exception, which will cause the skeleton and the resulting\n   Bison output files to be licensed under the GNU General Public\n   License without this special exception.\n   \n   This special exception was added by the Free Software Foundation in\n   version 2.2 of Bison.  */\n\n/**\n ** \\file stack.hh\n ** Define the yy::stack class.\n */\n\n#ifndef YY_YY_STACK_HH_INCLUDED\n# define YY_YY_STACK_HH_INCLUDED\n\n# include <deque>\n\n\nnamespace yy {\n/* Line 34 of stack.hh  */\n#line 47 \"stack.hh\"\n  template <class T, class S = std::deque<T> >\n  class stack\n  {\n  public:\n    // Hide our reversed order.\n    typedef typename S::reverse_iterator iterator;\n    typedef typename S::const_reverse_iterator const_iterator;\n\n    stack () : seq_ ()\n    {\n    }\n\n    stack (unsigned int n) : seq_ (n)\n    {\n    }\n\n    inline\n    T&\n    operator [] (unsigned int i)\n    {\n      return seq_[i];\n    }\n\n    inline\n    const T&\n    operator [] (unsigned int i) const\n    {\n      return seq_[i];\n    }\n\n    inline\n    void\n    push (const T& t)\n    {\n      seq_.push_front (t);\n    }\n\n    inline\n    void\n    pop (unsigned int n = 1)\n    {\n      for (; n; --n)\n        seq_.pop_front ();\n    }\n\n    inline\n    unsigned int\n    height () const\n    {\n      return seq_.size ();\n    }\n\n    inline const_iterator begin () const { return seq_.rbegin (); }\n    inline const_iterator end () const { return seq_.rend (); }\n\n  private:\n    S seq_;\n  };\n\n  /// Present a slice of the top of a stack.\n  template <class T, class S = stack<T> >\n  class slice\n  {\n  public:\n    slice (const S& stack, unsigned int range)\n      : stack_ (stack)\n      , range_ (range)\n    {\n    }\n\n    inline\n    const T&\n    operator [] (unsigned int i) const\n    {\n      return stack_[range_ - i];\n    }\n\n  private:\n    const S& stack_;\n    unsigned int range_;\n  };\n\n} // yy\n/* Line 116 of stack.hh  */\n#line 132 \"stack.hh\"\n\n#endif /* !YY_YY_STACK_HH_INCLUDED  */\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/tests/.gitignore",
    "content": "Makefile\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/tests/CMakeLists.txt",
    "content": "IF (Qt5Core_FOUND)\n  FIND_PACKAGE( Qt5Test REQUIRED )\n\n  INCLUDE_DIRECTORIES(${Qt5Test_INCLUDE_DIRS})\n  ADD_DEFINITIONS(${Qt5Test_DEFINITIONS})\n  SET(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} ${Qt5Test_EXECUTABLE_COMPILE_FLAGS}\")\n\n  SET (TEST_LIBRARIES ${Qt5Test_LIBRARIES})\nENDIF()\n\nADD_SUBDIRECTORY(cmdline_tester)\nADD_SUBDIRECTORY(parser)\nADD_SUBDIRECTORY(scanner)\nADD_SUBDIRECTORY(qobjecthelper)\nADD_SUBDIRECTORY(serializer)\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/tests/benchmarks/CMakeLists.txt",
    "content": "##### Probably don't want to edit below this line #####\n\nSET( QT_USE_QTTEST TRUE )\n\nINCLUDE(AddFileDependencies)\n\n# Include the library include directories, and the current build directory (moc)\nINCLUDE_DIRECTORIES(\n  ../../include\n  ${CMAKE_CURRENT_BINARY_DIR}\n)\n\nSET( UNIT_TESTS\n  parsingbenchmark\n  qlocalevsstrtod_l\n)\n\n# Build the tests\nFOREACH(test ${UNIT_TESTS})\n  MESSAGE(STATUS \"Building ${test}\")\n  ADD_EXECUTABLE(\n    ${test}\n    ${test}.cpp\n  )\n\n  TARGET_LINK_LIBRARIES(\n    ${test}\n    ${QT_LIBRARIES}\n    ${TEST_LIBRARIES}\n    qjson${QJSON_SUFFIX}\n  )\n  if (QJSON_TEST_OUTPUT STREQUAL \"xml\")\n    # produce XML output\n    add_test( ${test} ${test} -xml -o ${test}.tml )\n  else (QJSON_TEST_OUTPUT STREQUAL \"xml\")\n    add_test( ${test} ${test} )\n  endif (QJSON_TEST_OUTPUT STREQUAL \"xml\")\nENDFOREACH()\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/tests/benchmarks/parsingbenchmark.cpp",
    "content": "/* This file is part of QJson\n *\n * Copyright (C) 2014 Sune Vuorela <sune@ange.dk>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License version 2.1, as published by the Free Software Foundation.\n * \n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this library; see the file COPYING.LIB.  If not, write to\n * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#include <QJson/Parser>\n#include <QJson/Serializer>\n#include <QtTest/QTest>\n#include <QFile>\n\nclass ParsingBenchmark: public QObject {\n    Q_OBJECT\n    private Q_SLOTS:\n        void benchmark();\n};\n\nvoid ParsingBenchmark::benchmark() {\n    QString path = QFINDTESTDATA(\"largefile.json\");\n\n    QVERIFY(QFile::exists(path));\n\n    QFile f(path);\n    QVERIFY(f.open(QIODevice::ReadOnly));\n\n    QByteArray data = f.readAll();\n\n    QVariant result;\n\n    QJson::Parser parser;\n    QBENCHMARK {\n        result = parser.parse(data);\n    }\n\n    Q_UNUSED(result);\n}\n\n\nQTEST_MAIN(ParsingBenchmark)\n\n#include \"parsingbenchmark.moc\"\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/tests/benchmarks/qlocalevsstrtod_l.cpp",
    "content": "/* This file is part of QJson\n *\n * Copyright (C) 2014 Sune Vuorela <sune@ange.dk>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License version 2.1, as published by the Free Software Foundation.\n * \n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this library; see the file COPYING.LIB.  If not, write to\n * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#include <QObject>\n#include <QtTest>\n#include <locale.h>\n\nclass QLocaleVsStrtod_l : public QObject {\n    Q_OBJECT\n    private Q_SLOTS:\n        void benchmark();\n        void benchmark_data();\n\n};\n\nvoid QLocaleVsStrtod_l::benchmark() {\n    QFETCH(bool, useQLocale);\n    QList<char*> l;\n    l << strdup(\"0.123\") << strdup(\"0.947834\") << strdup(\"8.8373\") << strdup(\"884.82921\");\n\n    double result;\n\n    if(useQLocale) {\n        QLocale c(QLocale::C);\n        QBENCHMARK {\n            Q_FOREACH(const char* str, l) {\n                result = c.toDouble(QString(str));\n            }\n        }\n    } else {\n        locale_t c = newlocale(LC_NUMERIC_MASK, \"C\", NULL);\n        QBENCHMARK {\n            Q_FOREACH(const char* str, l) {\n                result = strtod_l(str, NULL, c);\n            }\n        }\n    }\n\n\n    Q_FOREACH(char* str, l) {\n        free(str);\n    }\n}\n\nvoid QLocaleVsStrtod_l::benchmark_data() {\n    QTest::addColumn<bool>(\"useQLocale\");\n\n    QTest::newRow(\"using QLocale\") << true;\n    QTest::newRow(\"using strtod_l\") << false;\n}\n\nQTEST_MAIN(QLocaleVsStrtod_l);\n#include \"qlocalevsstrtod_l.moc\"\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/tests/scanner/CMakeLists.txt",
    "content": "##### Probably don't want to edit below this line #####\n\nSET( QT_USE_QTTEST TRUE )\n\nIF (NOT Qt5Core_FOUND)\n  # Use it\n  INCLUDE( ${QT_USE_FILE} )\nENDIF()\n\nINCLUDE(AddFileDependencies)\n\n# Include the library include directories, and the current build directory (moc)\nINCLUDE_DIRECTORIES(\n  ../../src\n  ../../include\n  ${CMAKE_CURRENT_BINARY_DIR}\n)\n\nSET( UNIT_TESTS\n  testscanner\n)\n\n# Build the tests\nFOREACH(test ${UNIT_TESTS})\n  MESSAGE(STATUS \"Building ${test}\")\n  IF (NOT Qt5Core_FOUND)\n    QT4_WRAP_CPP(MOC_SOURCE ${test}.cpp)\n  ENDIF()\n  ADD_EXECUTABLE(\n    ${test}\n    ${test}.cpp\n  )\n\n  if(WIN32 AND BUILD_SHARED_LIBS)\n    set(QJSON_SCANNER qjson_scanner)\n  endif()\n\n  ADD_FILE_DEPENDENCIES(${test}.cpp ${MOC_SOURCE})\n  TARGET_LINK_LIBRARIES(\n    ${test}\n    ${QT_LIBRARIES}\n    ${TEST_LIBRARIES}\n    qjson${QJSON_SUFFIX}\n    ${QJSON_SCANNER}\n  )\n  if (QJSON_TEST_OUTPUT STREQUAL \"xml\")\n    # produce XML output\n    add_test( ${test} ${test} -xml -o ${test}.tml )\n  else (QJSON_TEST_OUTPUT STREQUAL \"xml\")\n    add_test( ${test} ${test} )\n  endif (QJSON_TEST_OUTPUT STREQUAL \"xml\")\nENDFOREACH()\n"
  },
  {
    "path": "src/third-party/qjson-0.8.1/sources/tests/scanner/testscanner.cpp",
    "content": "/* This file is part of QJson\n *\n * Copyright (C) 2013 Silvio Moioli <silvio@moioli.net>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License version 2.1, as published by the Free Software Foundation.\n * \n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this library; see the file COPYING.LIB.  If not, write to\n * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n \n#include <QtCore/QVariant>\n#include <QtTest/QtTest>\n\n// cmath does #undef for isnan and isinf macroses what can be defined in math.h\n#if defined(Q_OS_SYMBIAN) || defined(Q_OS_ANDROID) || defined(Q_OS_BLACKBERRY) || defined(Q_OS_SOLARIS)\n# include <math.h>\n#else\n# include <cmath>\n#endif\n\n#include \"json_scanner.h\"\n#include \"json_parser.hh\"\n#include \"location.hh\"\n\n#define TOKEN(type) (int)yy::json_parser::token::type\n\nclass TestScanner: public QObject\n{\n  Q_OBJECT\n  private slots:\n    void scanClosedDevice();\n    void scanTokens();\n    void scanTokens_data();\n    void scanSpecialNumbers();\n    void scanSpecialNumbers_data();\n};\n\nQ_DECLARE_METATYPE(QVariant)\nQ_DECLARE_METATYPE(QVariant::Type)\n\nusing namespace QJson;\n\nvoid TestScanner::scanClosedDevice() {\n  QBuffer buffer;\n  int expectedResult = -1;\n  \n  JSonScanner scanner(&buffer);\n  QVariant yylval;\n  yy::location location;\n  int result = scanner.yylex(&yylval, &location);\n  QCOMPARE(result, expectedResult);\n}\n\nvoid TestScanner::scanTokens() {\n  QFETCH(QByteArray, input);\n  QFETCH(bool, allowSpecialNumbers);\n  QFETCH(bool, skipFirstToken);\n  QFETCH(int, expectedResult);\n  QFETCH(QVariant, expectedYylval);\n  QFETCH(int, expectedLocationBeginLine);\n  QFETCH(int, expectedLocationBeginColumn);\n  QFETCH(int, expectedLocationEndLine);\n  QFETCH(int, expectedLocationEndColumn);\n  \n  QBuffer buffer;\n  buffer.open(QBuffer::ReadWrite);\n  buffer.write(input);\n  buffer.seek(0);  \n  JSonScanner scanner(&buffer);\n  scanner.allowSpecialNumbers(allowSpecialNumbers);\n\n  QVariant yylval;\n  yy::position position(YY_NULL, 1, 0);\n  yy::location location(position, position);\n  int result = scanner.yylex(&yylval, &location);\n  \n  if (skipFirstToken) {\n    result = scanner.yylex(&yylval, &location);\n  }\n  \n  QCOMPARE(result, expectedResult);\n  QCOMPARE(yylval, expectedYylval);\n  QCOMPARE(location.begin.line, (uint)expectedLocationBeginLine);\n  QCOMPARE(location.begin.column, (uint)expectedLocationBeginColumn);\n  QCOMPARE(location.end.line, (uint)expectedLocationEndLine);\n  QCOMPARE(location.end.column, (uint)expectedLocationEndColumn);\n}\n\nvoid TestScanner::scanTokens_data() {\n  QTest::addColumn<QByteArray>(\"input\");\n  QTest::addColumn<bool>(\"allowSpecialNumbers\");\n  QTest::addColumn<bool>(\"skipFirstToken\");\n  QTest::addColumn<int>(\"expectedResult\");\n  QTest::addColumn<QVariant>(\"expectedYylval\");\n  QTest::addColumn<int>(\"expectedLocationBeginLine\");\n  QTest::addColumn<int>(\"expectedLocationBeginColumn\");\n  QTest::addColumn<int>(\"expectedLocationEndLine\");\n  QTest::addColumn<int>(\"expectedLocationEndColumn\");\n  \n  QTest::newRow(\"empty json\") << QByteArray(\"\") << true << false << TOKEN(END) << QVariant() << 1 << 0 << 1 << 0;\n  \n  QTest::newRow(\"carriage return\") << QByteArray(\"\\r\") << true << false << TOKEN(END) << QVariant() << 1 << 0 << 2 << 1;\n  QTest::newRow(\"new line\") << QByteArray(\"\\n\") << true << false << TOKEN(END) << QVariant() << 1 << 0 << 2 << 1;\n  QTest::newRow(\"formfeed\") << QByteArray(\"\\f\") << true << false << TOKEN(END) << QVariant() << 1 << 0 << 1 << 1;\n  QTest::newRow(\"vertical tab\") << QByteArray(\"\\v\") << true << false << TOKEN(END) << QVariant() << 1 << 0 << 1 << 1;\n  QTest::newRow(\"space\") << QByteArray(\" \") << true << false << TOKEN(END) << QVariant() << 1 << 0 << 1 << 1;\n  QTest::newRow(\"tab\") << QByteArray(\"\\t\") << true << false << TOKEN(END) << QVariant() << 1 << 0 << 1 << 1;\n  QTest::newRow(\"all spaces\") << QByteArray(\"\\r\\n\\f\\v \\t\") << true << false << TOKEN(END) << QVariant() << 1 << 0 << 3 << 5;\n  \n  QTest::newRow(\"true\") << QByteArray(\"true\") << true << false << TOKEN(TRUE_VAL) << QVariant(true) << 1 << 0 << 1 << 4;\n  QTest::newRow(\"false\") << QByteArray(\"false\") << true << false << TOKEN(FALSE_VAL) << QVariant(false) << 1 << 0 << 1 << 5;\n  QTest::newRow(\"null\") << QByteArray(\"null\") << true << false << TOKEN(NULL_VAL) << QVariant() << 1 << 0 << 1 << 4;\n  \n  QTest::newRow(\"alphabetic string\") << QByteArray(\"\\\"abcde\\\"\") << true << false << TOKEN(STRING) << QVariant(QLatin1String(\"abcde\")) << 1 << 0 << 1 << 2;\n  QTest::newRow(\"ecaped string\") << QByteArray(\"\\\"abcde\\\\b\\\\f\\\\n\\\\r\\\\t\\\"\") << true << false << TOKEN(STRING) << QVariant(QLatin1String(\"abcde\\b\\f\\n\\r\\t\")) << 1 << 0 << 1 << 2;\n  QTest::newRow(\"invalid ecaped string\") << QByteArray(\"\\\"\\\\x\\\"\") << true << false << TOKEN(STRING) << QVariant(QLatin1String(\"x\")) << 1 << 0 << 1 << 2;\n  QTest::newRow(\"escaped unicode sequence\") << QByteArray(\"\\\"\\\\u005A\\\"\") << true << false << TOKEN(STRING) << QVariant(QLatin1String(\"Z\"))  << 1 << 0 << 1 << 2;\n  QTest::newRow(\"invalid unicode sequence\") << QByteArray(\"\\\"\\\\u005Z\\\"\") << true << false << TOKEN(INVALID) << QVariant(QLatin1String(\"\"))  << 1 << 0 << 1 << 2;\n  QTest::newRow(\"empty string\") << QByteArray(\"\\\"\\\"\") << true << false << TOKEN(STRING) << QVariant(QLatin1String(\"\"))  << 1 << 0 << 1 << 2;\n  QTest::newRow(\"unterminated empty string\") << QByteArray(\"\\\"\") << true << false << TOKEN(INVALID) << QVariant()  << 1 << 0 << 1 << 2;\n  QTest::newRow(\"unterminated string\") << QByteArray(\"\\\"abcde\") << true << false << TOKEN(INVALID) << QVariant()  << 1 << 0 << 1 << 2;\n  QTest::newRow(\"unterminated unicode sequence\") << QByteArray(\"\\\"\\\\u005A\") << true << false << TOKEN(INVALID) << QVariant()  << 1 << 0 << 1 << 2;\n  \n  QTest::newRow(\"single digit\") << QByteArray(\"0\") << true << false << TOKEN(NUMBER) << QVariant(0u)  << 1 << 0 << 1 << 1;\n  QTest::newRow(\"multiple digits\") << QByteArray(\"123456789\") << true << false << TOKEN(NUMBER) << QVariant(123456789u)  << 1 << 0 << 1 << 9;\n  QTest::newRow(\"negative single digit\") << QByteArray(\"-0\") << true << false << TOKEN(NUMBER) << QVariant(0)  << 1 << 0 << 1 << 2;\n  QTest::newRow(\"negative multiple digits\") << QByteArray(\"-123456789\") << true << false << TOKEN(NUMBER) << QVariant(-123456789)  << 1 << 0 << 1 << 10;\n  QTest::newRow(\"fractional single digit\") << QByteArray(\"0.1\") << true << false << TOKEN(NUMBER) << QVariant(0.1)  << 1 << 0 << 1 << 3;\n  QTest::newRow(\"fractional multiple digits\") << QByteArray(\"123456789.12\") << true << false << TOKEN(NUMBER) << QVariant(123456789.12)  << 1 << 0 << 1 << 12;\n  QTest::newRow(\"fractional negative single digit\") << QByteArray(\"-0.3\") << true << false << TOKEN(NUMBER) << QVariant(-0.3)  << 1 << 0 << 1 << 4;\n  QTest::newRow(\"fractional negative multiple digits\") << QByteArray(\"-123456789.23\") << true << false << TOKEN(NUMBER) << QVariant(-123456789.23)  << 1 << 0 << 1 << 13;\n  QTest::newRow(\"exponential single digit\") << QByteArray(\"10e2\") << true << false << TOKEN(NUMBER) << QVariant(1000)  << 1 << 0 << 1 << 4;\n  QTest::newRow(\"exponential multiple digits\") << QByteArray(\"10e23\") << true << false << TOKEN(NUMBER) << QVariant(10e23)  << 1 << 0 << 1 << 5;\n  QTest::newRow(\"exponential zero\") << QByteArray(\"0e23\") << true << false << TOKEN(NUMBER) << QVariant(0)  << 1 << 0 << 1 << 4;\n  QTest::newRow(\"exponential fractional\") << QByteArray(\"0.12354e23\") << true << false << TOKEN(NUMBER) << QVariant(0.12354e23)  << 1 << 0 << 1 << 10;\n  QTest::newRow(\"exponential fractional multiple digits\") << QByteArray(\"120.12354e23\") << true << false << TOKEN(NUMBER) << QVariant(120.12354e23)  << 1 << 0 << 1 << 12;\n  QTest::newRow(\"uppercase exponential\") << QByteArray(\"120.12354E23\") << true << false << TOKEN(NUMBER) << QVariant(120.12354E23)  << 1 << 0 << 1 << 12;\n  QTest::newRow(\"negative exponential single digit\") << QByteArray(\"-10e2\") << true << false << TOKEN(NUMBER) << QVariant(-1000)  << 1 << 0 << 1 << 5;\n  QTest::newRow(\"negative exponential multiple digits\") << QByteArray(\"-10e23\") << true << false << TOKEN(NUMBER) << QVariant(-10e23)  << 1 << 0 << 1 << 6;\n  QTest::newRow(\"negative exponential zero\") << QByteArray(\"-0e23\") << true << false << TOKEN(NUMBER) << QVariant(0)  << 1 << 0 << 1 << 5;\n  QTest::newRow(\"negative exponential fractional\") << QByteArray(\"-0.12354e23\") << true << false << TOKEN(NUMBER) << QVariant(-0.12354e23)  << 1 << 0 << 1 << 11;\n  QTest::newRow(\"negative exponential fractional multiple digits\") << QByteArray(\"-120.12354e23\") << true << false << TOKEN(NUMBER) << QVariant(-120.12354e23)  << 1 << 0 << 1 << 13;\n  QTest::newRow(\"negative exponent\") << QByteArray(\"10e-2\") << true << false << TOKEN(NUMBER) << QVariant(10e-2)  << 1 << 0 << 1 << 5;\n  QTest::newRow(\"positive exponent with plus\") << QByteArray(\"10e+2\") << true << false << TOKEN(NUMBER) << QVariant(1000)  << 1 << 0 << 1 << 5;\n  \n  QTest::newRow(\"invalid multiple digits\") << QByteArray(\"001\") << true << false << TOKEN(NUMBER) << QVariant(0)  << 1 << 0 << 1 << 1;\n  QTest::newRow(\"invalid negative multiple digits\") << QByteArray(\"-001\") << true << false << TOKEN(NUMBER) << QVariant(0)  << 1 << 0 << 1 << 2;\n  QTest::newRow(\"invalid fractional\") << QByteArray(\"12.\") << true << true << TOKEN(INVALID) << QVariant(12)  << 1 << 2 << 1 << 3;\n  QTest::newRow(\"invalid exponential 1\") << QByteArray(\"-5e+\") << true << true << TOKEN(INVALID) << QVariant(-5)  << 1 << 2 << 1 << 3;\n  QTest::newRow(\"invalid exponential 2\") << QByteArray(\"2e\") << true << true << TOKEN(INVALID) << QVariant(2)  << 1 << 1 << 1 << 2;\n  QTest::newRow(\"invalid exponential 3\") << QByteArray(\"3e+\") << true << true << TOKEN(INVALID) << QVariant(3)  << 1 << 1 << 1 << 2;\n  QTest::newRow(\"invalid exponential 4\") << QByteArray(\"4.3E\") << true << true << TOKEN(INVALID) << QVariant(4.3)  << 1 << 3 << 1 << 4;\n  QTest::newRow(\"invalid exponential 5\") << QByteArray(\"5.4E-\") << true << true << TOKEN(INVALID) << QVariant(5.4)  << 1 << 3 << 1 << 4;\n\n  QTest::newRow(\"colon\") << QByteArray(\":\") << true << false << TOKEN(COLON) << QVariant()  << 1 << 0 << 1 << 1;\n  QTest::newRow(\"comma\") << QByteArray(\",\") << true << false << TOKEN(COMMA) << QVariant()  << 1 << 0 << 1 << 1;\n  QTest::newRow(\"square bracket open\") << QByteArray(\"[\") << true << false << TOKEN(SQUARE_BRACKET_OPEN) << QVariant()  << 1 << 0 << 1 << 1;\n  QTest::newRow(\"square bracket close\") << QByteArray(\"]\") << true << false << TOKEN(SQUARE_BRACKET_CLOSE) << QVariant()  << 1 << 0 << 1 << 1;\n  QTest::newRow(\"curly bracket open\") << QByteArray(\"{\") << true << false << TOKEN(CURLY_BRACKET_OPEN) << QVariant()  << 1 << 0 << 1 << 1;\n  QTest::newRow(\"curly bracket close\") << QByteArray(\"}\") << true << false << TOKEN(CURLY_BRACKET_CLOSE) << QVariant()  << 1 << 0 << 1 << 1;\n\n  QTest::newRow(\"too large unsinged number\") << QByteArray(\"18446744073709551616\") << false << false << TOKEN(INVALID) << QVariant(ULLONG_MAX) << 1 << 0 << 1 << 20;\n  QTest::newRow(\"too large signed number\") << QByteArray(\"-9223372036854775808\") << false << false << TOKEN(INVALID) << QVariant(LLONG_MIN) << 1 << 0 << 1 << 20;\n  QTest::newRow(\"too large exponential\") << QByteArray(\"1.7976931348623157e309\") << false << false << TOKEN(INVALID) << QVariant(0) << 1 << 0 << 1 << 22;\n  QTest::newRow(\"not allowed nan\") << QByteArray(\"nan\") << false << false << TOKEN(INVALID) << QVariant() << 1 << 0 << 1 << 1;\n  QTest::newRow(\"not allowed infinity\") << QByteArray(\"Infinity\") << false << false << TOKEN(INVALID) << QVariant() << 1 << 0 << 1 << 1;\n  QTest::newRow(\"unknown\") << QByteArray(\"*\") << true << false << TOKEN(INVALID) << QVariant()  << 1 << 0 << 1 << 1;\n}\n\n\nvoid TestScanner::scanSpecialNumbers() {\n  QFETCH(QByteArray, input);\n  QFETCH(bool, isInfinity);\n  QFETCH(bool, isNegative);\n  QFETCH(bool, isNan);\n  QFETCH(int, expectedLocationBeginLine);\n  QFETCH(int, expectedLocationBeginColumn);\n  QFETCH(int, expectedLocationEndLine);\n  QFETCH(int, expectedLocationEndColumn);\n  \n  QBuffer buffer;\n  buffer.open(QBuffer::ReadWrite);\n  buffer.write(input);\n  buffer.seek(0);  \n  JSonScanner scanner(&buffer);\n  scanner.allowSpecialNumbers(true);\n\n  QVariant yylval;\n  yy::position position(YY_NULL, 1, 0);\n  yy::location location(position, position);\n  int result = scanner.yylex(&yylval, &location);\n  \n  QCOMPARE(result, TOKEN(NUMBER));\n  QVERIFY(yylval.type() == QVariant::Double);\n\n  double doubleResult = yylval.toDouble();\n\n  #if defined(Q_OS_SYMBIAN) || defined(Q_OS_ANDROID) || defined(Q_OS_BLACKBERRY)\n    QCOMPARE(bool(isinf(doubleResult)), isInfinity);\n  #else\n    // skip this test for MSVC, because there is no \"isinf\" function.\n    #ifndef Q_CC_MSVC\n        QCOMPARE(bool(std::isinf(doubleResult)), isInfinity);\n    #endif\n  #endif\n\n  QCOMPARE(doubleResult<0, isNegative);\n\n  #if defined(Q_OS_SYMBIAN) || defined(Q_OS_ANDROID) || defined(Q_OS_BLACKBERRY)\n      QCOMPARE(bool(isnan(doubleResult)), isNan);\n  #else\n    // skip this test for MSVC, because there is no \"isinf\" function.\n    #ifndef Q_CC_MSVC\n        QCOMPARE(bool(std::isnan(doubleResult)), isNan);\n    #endif\n  #endif\n    \n  QCOMPARE(location.begin.line, (uint)expectedLocationBeginLine);\n  QCOMPARE(location.begin.column, (uint)expectedLocationBeginColumn);\n  QCOMPARE(location.end.line, (uint)expectedLocationEndLine);\n  QCOMPARE(location.end.column, (uint)expectedLocationEndColumn);\n}\n\nvoid TestScanner::scanSpecialNumbers_data() {\n  QTest::addColumn<QByteArray>(\"input\");\n  QTest::addColumn<bool>(\"isInfinity\");\n  QTest::addColumn<bool>(\"isNegative\");\n  QTest::addColumn<bool>(\"isNan\");\n  QTest::addColumn<int>(\"expectedLocationBeginLine\");\n  QTest::addColumn<int>(\"expectedLocationBeginColumn\");\n  QTest::addColumn<int>(\"expectedLocationEndLine\");\n  QTest::addColumn<int>(\"expectedLocationEndColumn\");\n  \n  QTest::newRow(\"nan\") << QByteArray(\"nan\") << false << false << true << 1 << 0 << 1 << 3;\n  QTest::newRow(\"NAN\") << QByteArray(\"NAN\") << false << false << true << 1 << 0 << 1 << 3;\n  QTest::newRow(\"NaN\") << QByteArray(\"NaN\") << false << false << true << 1 << 0 << 1 << 3;\n\n  QTest::newRow(\"infinity\") << QByteArray(\"infinity\") << true << false << false << 1 << 0 << 1 << 8;\n  QTest::newRow(\"Infinity\") << QByteArray(\"infinity\") << true << false << false << 1 << 0 << 1 << 8;\n\n  QTest::newRow(\"-infinity\") << QByteArray(\"-infinity\") << true << true << false << 1 << 0 << 1 << 9;\n  QTest::newRow(\"-Infinity\") << QByteArray(\"-Infinity\") << true << true << false << 1 << 0 << 1 << 9;\n}\n\n#if QT_VERSION < QT_VERSION_CHECK(5,0,0)\n// using Qt4 rather then Qt5\nQTEST_MAIN(TestScanner)\n#include \"moc_testscanner.cxx\"\n#else\nQTEST_GUILESS_MAIN(TestScanner)\n#include \"testscanner.moc\"\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/CMakeLists.txt",
    "content": "# CMake script is written according to provided qmake file:\n# sources/Qt4Qt4/qscintilla.pro\n\nproject(QScintilla)\n\n# Automatically generate code for Qt moc, uic and rcc files\nset(CMAKE_AUTOMOC ON)\nset(CMAKE_AUTORCC ON)\nset(CMAKE_AUTOUIC ON)\n\n# For some reasons AUTOMOC doesn't work here...\n# Doing this manually.\nqt5_wrap_cpp(moc\n    sources/Qt4Qt5/Qsci/qsciabstractapis.h\n    sources/Qt4Qt5/Qsci/qsciapis.h\n    sources/Qt4Qt5/Qsci/qscilexer.h\n    sources/Qt4Qt5/Qsci/qscilexercpp.h\n    sources/Qt4Qt5/Qsci/qscilexerjavascript.h\n    sources/Qt4Qt5/Qsci/qscimacro.h\n    sources/Qt4Qt5/Qsci/qsciscintilla.h\n    sources/Qt4Qt5/Qsci/qsciscintillabase.h\n)\n\n# Robo 1.3: To silence CMake warning: \n#           \"Policy CMP0071 is not set: Let AUTOMOC and AUTOUIC process GENERATED files.\"\nset(QSCI_SRC_DIR \"sources/Qt4Qt5/Qsci/\")\nset_property(SOURCE ${QSCI_SRC_DIR}/moc_qsciabstractapis.cpp PROPERTY SKIP_AUTOGEN ON)\nset_property(SOURCE ${QSCI_SRC_DIR}/moc_qsciapis.cpp PROPERTY SKIP_AUTOGEN ON)\nset_property(SOURCE ${QSCI_SRC_DIR}/moc_qscilexer.cpp PROPERTY SKIP_AUTOGEN ON)\nset_property(SOURCE ${QSCI_SRC_DIR}/moc_qscilexercpp.cpp PROPERTY SKIP_AUTOGEN ON)\nset_property(SOURCE ${QSCI_SRC_DIR}/moc_qscilexerjavascript.cpp PROPERTY SKIP_AUTOGEN ON)\nset_property(SOURCE ${QSCI_SRC_DIR}/moc_qscimacro.cpp PROPERTY SKIP_AUTOGEN ON)\nset_property(SOURCE ${QSCI_SRC_DIR}/moc_qsciscintilla.cpp PROPERTY SKIP_AUTOGEN ON)\nset_property(SOURCE ${QSCI_SRC_DIR}/moc_qsciscintillabase.cpp PROPERTY SKIP_AUTOGEN ON)\n\nadd_library(qscintilla\n    ${moc}\n    sources/lexlib/StyleContext.cpp\n    sources/lexlib/WordList.cpp\n    sources/lexlib/Accessor.cpp\n    sources/lexlib/LexerBase.cpp\n    sources/lexlib/LexerModule.cpp\n    sources/lexlib/CharacterSet.cpp\n    sources/lexlib/CharacterCategory.cpp\n    sources/lexlib/PropSetSimple.cpp\n    sources/lexlib/LexerSimple.cpp\n    sources/lexlib/LexerNoExceptions.cpp\n\n    sources/Qt4Qt5/qscilexer.cpp\n    sources/Qt4Qt5/qscilexerjavascript.cpp\n    sources/Qt4Qt5/qscilexercpp.cpp\n\n    # We do not need these lexers\n#    sources/Qt4Qt5/qscilexerpov.cpp\n#    sources/Qt4Qt5/qscilexercss.cpp\n#    sources/Qt4Qt5/qscilexerd.cpp\n#    sources/Qt4Qt5/qscilexerspice.cpp\n#    sources/Qt4Qt5/qscilexerbash.cpp\n#    sources/Qt4Qt5/qscilexerdiff.cpp\n#    sources/Qt4Qt5/qscilexerruby.cpp\n#    sources/Qt4Qt5/qscilexerpostscript.cpp\n#    sources/Qt4Qt5/qscilexerpascal.cpp\n#    sources/Qt4Qt5/qscilexerbatch.cpp\n#    sources/Qt4Qt5/qscilexerfortran.cpp\n#    sources/Qt4Qt5/qscilexercoffeescript.cpp\n#    sources/Qt4Qt5/qscilexertcl.cpp\n#    sources/Qt4Qt5/qscilexerjava.cpp\n#    sources/Qt4Qt5/qscilexercustom.cpp\n#    sources/Qt4Qt5/qscilexercsharp.cpp\n#    sources/Qt4Qt5/qscilexertex.cpp\n#    sources/Qt4Qt5/qscilexerproperties.cpp\n#    sources/Qt4Qt5/qscilexeravs.cpp\n#    sources/Qt4Qt5/qscilexerpo.cpp\n#    sources/Qt4Qt5/qscilexerfortran77.cpp\n#    sources/Qt4Qt5/qscilexersql.cpp\n#    sources/Qt4Qt5/qscilexerhtml.cpp\n#    sources/Qt4Qt5/qscilexerperl.cpp\n#    sources/Qt4Qt5/qscilexermatlab.cpp\n#    sources/Qt4Qt5/qscilexervhdl.cpp\n#    sources/Qt4Qt5/qscilexerpython.cpp\n#    sources/Qt4Qt5/qscilexerxml.cpp\n#    sources/Qt4Qt5/qscilexeroctave.cpp\n#    sources/Qt4Qt5/qscilexerlua.cpp\n#    sources/Qt4Qt5/qscilexeridl.cpp\n#    sources/Qt4Qt5/qscilexercmake.cpp\n#    sources/Qt4Qt5/qscilexerverilog.cpp\n#    sources/Qt4Qt5/qscilexeryaml.cpp\n#    sources/Qt4Qt5/qscilexermakefile.cpp\n\n    sources/Qt4Qt5/qscistyle.cpp\n    sources/Qt4Qt5/InputMethod.cpp\n    sources/Qt4Qt5/qsciabstractapis.cpp\n    sources/Qt4Qt5/ScintillaQt.cpp\n    sources/Qt4Qt5/qscidocument.cpp\n    sources/Qt4Qt5/qsciscintilla.cpp\n    sources/Qt4Qt5/qsciscintillabase.cpp\n    sources/Qt4Qt5/qscicommand.cpp\n    sources/Qt4Qt5/ListBoxQt.cpp\n    sources/Qt4Qt5/qscistyledtext.cpp\n    sources/Qt4Qt5/SciClasses.cpp\n    sources/Qt4Qt5/qsciprinter.cpp\n    sources/Qt4Qt5/PlatQt.cpp\n    sources/Qt4Qt5/MacPasteboardMime.cpp\n    sources/Qt4Qt5/qscimacro.cpp\n    sources/Qt4Qt5/qsciapis.cpp\n    sources/Qt4Qt5/qscicommandset.cpp\n\n    sources/lexers/LexCPP.cpp\n\n\n    # We do not need these lexers\n#    sources/lexers/LexFlagship.cpp\n#    sources/lexers/LexMetapost.cpp\n#    sources/lexers/LexOthers.cpp\n#    sources/lexers/LexBasic.cpp\n#    sources/lexers/LexTxt2tags.cpp\n#    sources/lexers/LexDMAP.cpp\n#    sources/lexers/LexPB.cpp\n#    sources/lexers/LexNsis.cpp\n#    sources/lexers/LexLaTeX.cpp\n#    sources/lexers/LexProgress.cpp\n#    sources/lexers/LexSQL.cpp\n#    sources/lexers/LexTADS3.cpp\n#    sources/lexers/LexTAL.cpp\n#    sources/lexers/LexECL.cpp\n#    sources/lexers/LexConf.cpp\n#    sources/lexers/LexCSS.cpp\n#    sources/lexers/LexHex.cpp\n#    sources/lexers/LexPython.cpp\n#    sources/lexers/LexRebol.cpp\n#    sources/lexers/LexAda.cpp\n#    sources/lexers/LexAVS.cpp\n#    sources/lexers/LexHaskell.cpp\n#    sources/lexers/LexAsm.cpp\n#    sources/lexers/LexScriptol.cpp\n#    sources/lexers/LexTCMD.cpp\n#    sources/lexers/LexR.cpp\n#    sources/lexers/LexSML.cpp\n#    sources/lexers/LexPLM.cpp\n#    sources/lexers/LexBash.cpp\n#    sources/lexers/LexTeX.cpp\n#    sources/lexers/LexPO.cpp\n#    sources/lexers/LexKVIrc.cpp\n#    sources/lexers/LexA68k.cpp\n#    sources/lexers/LexOScript.cpp\n#    sources/lexers/LexGui4Cli.cpp\n#    sources/lexers/LexPascal.cpp\n#    sources/lexers/LexTACL.cpp\n#    sources/lexers/LexMagik.cpp\n#    sources/lexers/LexPowerShell.cpp\n#    sources/lexers/LexRuby.cpp\n#    sources/lexers/LexInno.cpp\n#    sources/lexers/LexBibTeX.cpp\n#    sources/lexers/LexBaan.cpp\n#    sources/lexers/LexCoffeeScript.cpp\n#    sources/lexers/LexDMIS.cpp\n#    sources/lexers/LexMatlab.cpp\n#    sources/lexers/LexLisp.cpp\n#    sources/lexers/LexSmalltalk.cpp\n#    sources/lexers/LexSpecman.cpp\n#    sources/lexers/LexCOBOL.cpp\n#    sources/lexers/LexMarkdown.cpp\n#    sources/lexers/LexMySQL.cpp\n#    sources/lexers/LexVerilog.cpp\n#    sources/lexers/LexASY.cpp\n#    sources/lexers/LexMPT.cpp\n#    sources/lexers/LexCLW.cpp\n#    sources/lexers/LexKix.cpp\n#    sources/lexers/LexAVE.cpp\n#    sources/lexers/LexVB.cpp\n#    sources/lexers/LexPowerPro.cpp\n#    sources/lexers/LexAU3.cpp\n#    sources/lexers/LexBullant.cpp\n#    sources/lexers/LexTCL.cpp\n#    sources/lexers/LexCsound.cpp\n#    sources/lexers/LexNimrod.cpp\n#    sources/lexers/LexHTML.cpp\n#    sources/lexers/LexPOV.cpp\n#    sources/lexers/LexOpal.cpp\n#    sources/lexers/LexSpice.cpp\n#    sources/lexers/LexModula.cpp\n#    sources/lexers/LexRegistry.cpp\n#    sources/lexers/LexFortran.cpp\n#    sources/lexers/LexErlang.cpp\n#    sources/lexers/LexCrontab.cpp\n#    sources/lexers/LexMSSQL.cpp\n#    sources/lexers/LexPerl.cpp\n#    sources/lexers/LexLua.cpp\n#    sources/lexers/LexYAML.cpp\n#    sources/lexers/LexEiffel.cpp\n#    sources/lexers/LexAbaqus.cpp\n#    sources/lexers/LexAPDL.cpp\n#    sources/lexers/LexSTTXT.cpp\n#    sources/lexers/LexLout.cpp\n#    sources/lexers/LexForth.cpp\n#    sources/lexers/LexCmake.cpp\n#    sources/lexers/LexRust.cpp\n#    sources/lexers/LexCaml.cpp\n#    sources/lexers/LexVisualProlog.cpp\n#    sources/lexers/LexVHDL.cpp\n#    sources/lexers/LexEScript.cpp\n#    sources/lexers/LexAsn1.cpp\n#    sources/lexers/LexSorcus.cpp\n#    sources/lexers/LexGAP.cpp\n#    sources/lexers/LexMMIXAL.cpp\n#    sources/lexers/LexD.cpp\n#    sources/lexers/LexPS.cpp\n\n    sources/src/AutoComplete.cpp\n    sources/src/CallTip.cpp\n    sources/src/CaseConvert.cpp\n    sources/src/CaseFolder.cpp\n    sources/src/Catalogue.cpp\n    sources/src/CellBuffer.cpp\n    sources/src/CharClassify.cpp\n    sources/src/ContractionState.cpp\n    sources/src/Decoration.cpp\n    sources/src/Document.cpp\n    sources/src/Editor.cpp\n    sources/src/ExternalLexer.cpp\n    sources/src/Indicator.cpp\n    sources/src/KeyMap.cpp\n    sources/src/LineMarker.cpp\n    sources/src/PerLine.cpp\n    sources/src/PositionCache.cpp\n    sources/src/RESearch.cpp\n    sources/src/RunStyles.cpp\n    sources/src/ScintillaBase.cpp\n    sources/src/Selection.cpp\n    sources/src/Style.cpp\n    sources/src/UniConversion.cpp\n    sources/src/ViewStyle.cpp\n    sources/src/XPM.cpp\n)\n\ntarget_link_libraries(qscintilla\n    PUBLIC\n        Qt5::Widgets\n        Qt5::PrintSupport)\n\nif (SYSTEM_MACOSX)\n    target_link_libraries(qscintilla PUBLIC Qt5::MacExtras)\nendif()\n\ntarget_include_directories(qscintilla\n    PUBLIC\n        sources/Qt4Qt5\n        sources/include\n        sources/lexlib\n        sources/src)\n\ntarget_compile_definitions(qscintilla\n    PUBLIC\n        SCINTILLA_QT\n        SCI_LEXER)\n\n# Project produces three types of warnings that are all not critical.\n# We are turning them off to remove noise\nif (COMPILER_CLANG OR COMPILER_GCC)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wno-dangling-else -Wno-parentheses -Wno-switch\")\nelseif(COMPILER_MSVC)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} /wd4554 /wd4099\")\n\n    # Suppress the following warning: MacPasteboardMime.obj : warning LNK4221: This object\n    # file does not define any previously undefined public symbols, so it will not be used\n    # by any link operation that consumes this library\n    set(CMAKE_STATIC_LINKER_FLAGS \"${CMAKE_STATIC_LINKER_FLAGS} /IGNORE:4221\")\nendif()\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/QScintilla-2.9.3-xcode8.patch",
    "content": "diff --git a/Qt4Qt5/Qsci/qsciscintilla.h b/Qt4Qt5/Qsci/qsciscintilla.h\nindex c8a7d5a..563884b 100644\n--- a/Qt4Qt5/Qsci/qsciscintilla.h\n+++ b/Qt4Qt5/Qsci/qsciscintilla.h\n@@ -22,9 +22,11 @@\n #ifndef QSCISCINTILLA_H\n #define QSCISCINTILLA_H\n \n+/*---OPENCOR---\n #ifdef __APPLE__\n extern \"C++\" {\n #endif\n+*/\n \n #include <QByteArray>\n #include <QList>\n@@ -2135,7 +2137,13 @@ private slots:\n     int ct_cursor;\n     QList<int> ct_shifts;\n     AutoCompletionUseSingle use_single;\n+/*---OPENCOR---\n     QPointer<QsciLexer> lex;\n+*/\n+//---OPENCOR--- BEGIN\n+    struct Lexer;\n+    Lexer *lexerStruct;\n+//---OPENCOR--- END\n     QsciCommandSet *stdCmds;\n     QsciDocument doc;\n     QColor nl_text_colour;\n@@ -2157,8 +2165,10 @@ private slots:\n     QsciScintilla &operator=(const QsciScintilla &);\n };\n \n+/*---OPENCOR---\n #ifdef __APPLE__\n }\n #endif\n+*/\n \n #endif\ndiff --git a/Qt4Qt5/qsciscintilla.cpp b/Qt4Qt5/qsciscintilla.cpp\nindex 4ddad7c..4f0bf85 100644\n--- a/Qt4Qt5/qsciscintilla.cpp\n+++ b/Qt4Qt5/qsciscintilla.cpp\n@@ -41,6 +41,14 @@\n #include \"Qsci/qscistyle.h\"\n #include \"Qsci/qscistyledtext.h\"\n \n+//---OPENCOR--- BEGIN\n+struct QsciScintilla::Lexer\n+{\n+    QPointer<QsciLexer> object;\n+};\n+\n+#define lex (lexerStruct->object)\n+//---OPENCOR--- END\n \n // Make sure these match the values in Scintilla.h.  We don't #include that\n // file because it just causes more clashes.\n@@ -67,6 +75,9 @@ QsciScintilla::QsciScintilla(QWidget *parent)\n       wchars(defaultWordChars), call_tips_position(CallTipsBelowText),\n       call_tips_style(CallTipsNoContext), maxCallTips(-1),\n       use_single(AcusNever), explicit_fillups(\"\"), fillups_enabled(false)\n+//---OPENCOR--- BEGIN\n+    , lexerStruct(new Lexer())\n+//---OPENCOR--- END\n {\n     connect(this,SIGNAL(SCN_MODIFYATTEMPTRO()),\n              SIGNAL(modificationAttempted()));\n@@ -146,6 +157,9 @@ QsciScintilla::~QsciScintilla()\n \n     doc.undisplay(this);\n     delete stdCmds;\n+//---OPENCOR--- BEGIN\n+    delete lexerStruct;\n+//---OPENCOR--- END\n }\n \n \n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/README.md",
    "content": "What is QScintilla\n==================\n\nQScintilla is a port to Qt of Scintilla C++ editor:\nhttps://riverbankcomputing.com/software/qscintilla/intro\n\nRobomongo statically links to this library.\n\nQScintilla sources are provided in `sources` folder as-is, in their original form, \nwithout modifications. We should *not* put or modify any files in this folder.\nAll changes to original QScintilla, if they are inevitable, should be documented here.\n\nWhat was changed?\n=================\n\nTo make builds faster (and only for this) we commented all lexers, except CPP, in file `src/Catalogue.cpp`:\n\n```cpp\nint Scintilla_LinkLexers() {\n    ...\n//\tLINK_LEXER(lmA68k);\n//\tLINK_LEXER(lmAbaqus);\n//\tLINK_LEXER(lmAda);\n    ...\n\tLINK_LEXER(lmCPP);\n\t...\n}\n\n```\n\nWe fixed problem of active caret when editor pane is not active. For this we\ncommented single line in `sources/Qt4Qt5/qsciscintillabase.cpp`, line 345:\n\n```cpp\n//    if (e->reason() == Qt::ActiveWindowFocusReason)\n```\n\nThis problem was discussed at least here: https://github.com/openscad/openscad/issues/1176\n\nCMake integration\n=================\n\nCMake build script is written according to provided qmake file:\n`sources/Qt4Qt4/qscintilla.pro`\n\n\nHow to upgrade\n==============\n\nIn order to upgrade to newer version of QScintilla you should:\n\n1. Replace `sources` folder with newer version \n2. Tweak `CMakeLists.txt` file, located in this folder.\n3. Make sure that Robomongo compiles and works \n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/GPL_EXCEPTION.TXT",
    "content": "\nRiverbank GPL Exception version 1.1\n===================================\n\nAdditional rights granted beyond the GPL (the \"Exception\").\n\nAs a special exception to the terms and conditions of version 2.0 of the GPL,\nRiverbank hereby grants you the rights described below, provided you agree to\nthe terms and conditions in this Exception, including its obligations and\nrestrictions on use.\n\nNothing in this Exception gives you or anyone else the right to change the\nlicensing terms of the QScintilla Open Source Edition.\n\nBelow, \"Licensed Software\" shall refer to the software licensed under the GPL\nand this exception.\n\n1) The right to use Open Source Licenses not compatible with the GNU\nGeneral Public License: Your software (hereafter referred to as \"Your\nSoftware\") may import the Licensed Software and/or distribute binaries of Your\nSoftware that imports the Licensed Software, provided that:\n\nA) Your Software is licensed under one of the following licenses:\n\n\nLicense name                            Version(s)/Copyright Date\nAcademic Free License                   2.0, 2.1, 3.0\nApache Software License                 1.0 or 1.1\nApache License                          2.0\nApple Public Source License             2.0\nArtistic license                        From Perl 5.8.0\nBSD license                             \"July 22 1999\"\nCommon Development and\n  Distribution License (CDDL)           1.0\nCommon Public License                   1.0\nEclipse Public License                  1.0\nGNU Library or \"Lesser\"\nGeneral Public License (LGPL)           2.0 or 2.1 \nJabber Open Source License              1.0\nMIT License                             (as set forth in the addendum file)\nMozilla Public License (MPL)            1.0 or 1.1\nOpen Software License                   2.0, 3.0\nOpenSSL license (with original\nSSLeay license)                         \"2003\" (\"1998\")\nPHP License                             3.0\nPython license (CNRI Python License)    (as set forth in the addendum file)\nPython Software Foundation License      2.1.1\nQ Public License                        v1.0\nSleepycat License                       \"1999\"\nW3C License                             \"2001\"\nX11 License                             X11R6.6\nZlib/libpng License                     (as set forth in the addendum file)\nZope Public License                     2.0, 2.1\n\n\n(Licenses without a specific version number or date are reproduced\nin the file GPL_Exception_Addendum.txt in your source package).\n\n\nand\n\nB) You must, on request, make a complete package including\n    the complete source code of Your Software (as defined\n    in the GNU General Public License version 2, section 3,\n    but excluding anything excluded by the special\n    exception in the same section) available to Riverbank\n    under the same license as that granted to other\n    recipients of the source code of Your Software.\n\nand\n\nC) Your or any other contributor's rights to:\n\n        i) distribute the source code of Your Software to anyone for\n        any purpose;\n\n        and\n\n        ii) publicly discuss the development project for Your\n        Software and its goals in any form and in any forum\n\nare not prohibited by any legal instrument, including but not limited to\ncontracts, non-disclosure agreements, and employee contracts.\n\n\n2) The right to link non-Open Source applications with pre-installed versions of\nthe Licensed Software: You may link applications with binary pre-installed\nversions of the Licensed Software, provided that such applications have been\ndeveloped and are deployed in accordance with the terms and conditions of the\nQScintilla Commercial License Agreement.\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/GPL_EXCEPTION_ADDENDUM.TXT",
    "content": "Addendum to the Riverbank GPL Exception version 1.1\n===================================================\n\n\n--------------------------------------------------------------------------\n\n\t\tThe \"Artistic License\"\n\n\t\t\t\tPreamble\n\nThe intent of this document is to state the conditions under which a\nPackage may be copied, such that the Copyright Holder maintains some\nsemblance of artistic control over the development of the package,\nwhile giving the users of the package the right to use and distribute\nthe Package in a more-or-less customary fashion, plus the right to make\nreasonable modifications.\n\nDefinitions:\n\n\t\"Package\" refers to the collection of files distributed by the\n\tCopyright Holder, and derivatives of that collection of files\n\tcreated through textual modification.\n\n\t\"Standard Version\" refers to such a Package if it has not been\n\tmodified, or has been modified in accordance with the wishes\n\tof the Copyright Holder as specified below.\n\n\t\"Copyright Holder\" is whoever is named in the copyright or\n\tcopyrights for the package.\n\n\t\"You\" is you, if you're thinking about copying or distributing\n\tthis Package.\n\n\t\"Reasonable copying fee\" is whatever you can justify on the\n\tbasis of media cost, duplication charges, time of people involved,\n\tand so on.  (You will not be required to justify it to the\n\tCopyright Holder, but only to the computing community at large\n\tas a market that must bear the fee.)\n\n\t\"Freely Available\" means that no fee is charged for the item\n\titself, though there may be fees involved in handling the item.\n\tIt also means that recipients of the item may redistribute it\n\tunder the same conditions they received it.\n\n1. You may make and give away verbatim copies of the source form of the\nStandard Version of this Package without restriction, provided that you\nduplicate all of the original copyright notices and associated disclaimers.\n\n2. You may apply bug fixes, portability fixes and other modifications\nderived from the Public Domain or from the Copyright Holder.  A Package\nmodified in such a way shall still be considered the Standard Version.\n\n3. You may otherwise modify your copy of this Package in any way, provided\nthat you insert a prominent notice in each changed file stating how and\nwhen you changed that file, and provided that you do at least ONE of the\nfollowing:\n\na) place your modifications in the Public Domain or otherwise make them\nFreely Available, such as by posting said modifications to Usenet or\nan equivalent medium, or placing the modifications on a major archive\nsite such as uunet.uu.net, or by allowing the Copyright Holder to include\nyour modifications in the Standard Version of the Package.\n\nb) use the modified Package only within your corporation or organization.\n\nc) rename any non-standard executables so the names do not conflict\nwith standard executables, which must also be provided, and provide\na separate manual page for each non-standard executable that clearly\ndocuments how it differs from the Standard Version.\n\nd) make other distribution arrangements with the Copyright Holder.\n\n4. You may distribute the programs of this Package in object code or\nexecutable form, provided that you do at least ONE of the following:\n\na) distribute a Standard Version of the executables and library files,\ntogether with instructions (in the manual page or equivalent) on where\nto get the Standard Version.\n\nb) accompany the distribution with the machine-readable source of\nthe Package with your modifications.\n\nc) give non-standard executables non-standard names, and clearly\ndocument the differences in manual pages (or equivalent), together\nwith instructions on where to get the Standard Version.\n\nd) make other distribution arrangements with the Copyright Holder.\n\n5. You may charge a reasonable copying fee for any distribution of this\nPackage.  You may charge any fee you choose for support of this\nPackage.  You may not charge a fee for this Package itself.  However,\nyou may distribute this Package in aggregate with other (possibly\ncommercial) programs as part of a larger (possibly commercial) software\ndistribution provided that you do not advertise this Package as a\nproduct of your own.  You may embed this Package's interpreter within\nan executable of yours (by linking); this shall be construed as a mere\nform of aggregation, provided that the complete Standard Version of the\ninterpreter is so embedded.\n\n6. The scripts and library files supplied as input to or produced as\noutput from the programs of this Package do not automatically fall\nunder the copyright of this Package, but belong to whoever generated\nthem, and may be sold commercially, and may be aggregated with this\nPackage.  If such scripts or library files are aggregated with this\nPackage via the so-called \"undump\" or \"unexec\" methods of producing a\nbinary executable image, then distribution of such an image shall\nneither be construed as a distribution of this Package nor shall it\nfall under the restrictions of Paragraphs 3 and 4, provided that you do\nnot represent such an executable image as a Standard Version of this\nPackage.\n\n7. C subroutines (or comparably compiled subroutines in other\nlanguages) supplied by you and linked into this Package in order to\nemulate subroutines and variables of the language defined by this\nPackage shall not be considered part of this Package, but are the\nequivalent of input as in Paragraph 6, provided these subroutines do\nnot change the language in any way that would cause it to fail the\nregression tests for the language.\n\n8. Aggregation of this Package with a commercial distribution is always\npermitted provided that the use of this Package is embedded; that is,\nwhen no overt attempt is made to make this Package's interfaces visible\nto the end user of the commercial distribution.  Such use shall not be\nconstrued as a distribution of this Package.\n\n9. The name of the Copyright Holder may not be used to endorse or promote\nproducts derived from this software without specific prior written permission.\n\n10. THIS PACKAGE IS PROVIDED \"AS IS\" AND WITHOUT ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED\nWARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\t\t\t\tThe End\n\n--------------------------------------------------------------------------\n\nMIT License\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \n\n--------------------------------------------------------------------------\n\nPython License (CNRI Python License)\n\nCNRI OPEN SOURCE LICENSE AGREEMENT\n\nIMPORTANT: PLEASE READ THE FOLLOWING AGREEMENT CAREFULLY.\n\nBY CLICKING ON \"ACCEPT\" WHERE INDICATED BELOW, OR BY COPYING, INSTALLING OR\nOTHERWISE USING PYTHON 1.6, beta 1 SOFTWARE, YOU ARE DEEMED TO HAVE AGREED TO\nTHE TERMS AND CONDITIONS OF THIS LICENSE AGREEMENT.\n\n1. This LICENSE AGREEMENT is between the Corporation for National Research\nInitiatives, having an office at 1895 Preston White Drive, Reston, VA 20191\n(\"CNRI\"), and the Individual or Organization (\"Licensee\") accessing and\notherwise using Python 1.6, beta 1 software in source or binary form and its\nassociated documentation, as released at the www.python.org Internet site on\nAugust 4, 2000 (\"Python 1.6b1\").\n\n2. Subject to the terms and conditions of this License Agreement, CNRI hereby\ngrants Licensee a non-exclusive, royalty-free, world-wide license to reproduce,\nanalyze, test, perform and/or display publicly, prepare derivative works,\ndistribute, and otherwise use Python 1.6b1 alone or in any derivative version,\nprovided, however, that CNRIs License Agreement is retained in Python 1.6b1,\nalone or in any derivative version prepared by Licensee.\n\nAlternately, in lieu of CNRIs License Agreement, Licensee may substitute the\nfollowing text (omitting the quotes): \"Python 1.6, beta 1, is made available\nsubject to the terms and conditions in CNRIs License Agreement. This Agreement\nmay be located on the Internet using the following unique, persistent identifier\n(known as a handle): 1895.22/1011. This Agreement may also be obtained from a\nproxy server on the Internet using the URL:http://hdl.handle.net/1895.22/1011\".\n\n3. In the event Licensee prepares a derivative work that is based on or\nincorporates Python 1.6b1or any part thereof, and wants to make the derivative\nwork available to the public as provided herein, then Licensee hereby agrees to\nindicate in any such work the nature of the modifications made to Python 1.6b1.\n\n4. CNRI is making Python 1.6b1 available to Licensee on an \"AS IS\" basis. CNRI\nMAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE,\nBUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY\nOF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF\nPYTHON 1.6b1WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.\n\n5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE FOR\nANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF USING,\nMODIFYING OR DISTRIBUTING PYTHON 1.6b1, OR ANY DERIVATIVE THEREOF, EVEN IF\nADVISED OF THE POSSIBILITY THEREOF.\n\n6. This License Agreement will automatically terminate upon a material breach of\nits terms and conditions.\n\n7. This License Agreement shall be governed by and interpreted in all respects\nby the law of the State of Virginia, excluding conflict of law provisions.\nNothing in this License Agreement shall be deemed to create any relationship of\nagency, partnership, or joint venture between CNRI and Licensee. This License\nAgreement does not grant permission to use CNRI trademarks or trade name in a\ntrademark sense to endorse or promote products or services of Licensee, or any\nthird party.\n\n8. By clicking on the \"ACCEPT\" button where indicated, or by copying, installing\nor otherwise using Python 1.6b1, Licensee agrees to be bound by the terms and\nconditions of this License Agreement.\n\n\n\nACCEPT\n\n--------------------------------------------------------------------------\n\nThe zlib/libpng License\n\nCopyright (c) <year> <copyright holders>\n\nThis software is provided 'as-is', without any express or implied warranty. In\nno event will the authors be held liable for any damages arising from the use of\nthis software.\n\nPermission is granted to anyone to use this software for any purpose, including\ncommercial applications, and to alter it and redistribute it freely, subject to\nthe following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not claim\nthat you wrote the original software. If you use this software in a product, an\nacknowledgment in the product documentation would be appreciated but is not\nrequired.\n\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source distribution.\n\n--------------------------------------------------------------------------\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/LICENSE.GPL2",
    "content": "\n QScintilla is Copyright (C) 2014 Riverbank Computing Limited\n                                            <info@riverbankcomputing.com>\n\n You may use, distribute and copy QScintilla under the terms of GNU\n General Public License version 2, which is displayed below.\n\n-------------------------------------------------------------------------\n\n\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Library General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\f\n\t\t    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\f\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\f\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\f\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\f\n\t    How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Library General\nPublic License instead of this License.\n\n-------------------------------------------------------------------------\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/LICENSE.GPL3",
    "content": "\n QScintilla is Copyright (C) 2014 Riverbank Computing Limited\n                                            <info@riverbankcomputing.com>\n\n You may use, distribute and copy QScintilla under the terms of GNU\n General Public License version 3, which is displayed below.\n\n-------------------------------------------------------------------------\n\n                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n\n-------------------------------------------------------------------------\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/NEWS",
    "content": "v2.8.4 11th September 2014\n  - Added setHotspotForegroundColor(), resetHotspotForegroundColor(),\n    setHotspotBackgroundColor(), resetHotspotBackgroundColor(),\n    setHotspotUnderline() and setHotspotWrap() to QsciScintilla.\n  - Added SCI_SETHOTSPOTSINGLELINE to QsciScintillaBase.\n  - Bug fixes.\n\nv2.8.3 3rd July 2014\n  - Added the QsciLexerCoffeeScript class.\n  - Font sizes are now handled as floating point values rather than integers.\n  - Bug fixes.\n\nv2.8.2 26th May 2014\n  - Added the QsciLexerAVS class.\n  - Added the QsciLexerPO class.\n  - Added the --sysroot, --no-sip-files and --no-qsci-api options to the Python\n    bindings' configure.py.\n  - Cross-compilation (specifically to iOS and Android) is now supported.\n  - configure.py has been refactored and relicensed so that it can be used as a\n    template for wrapping other bindings.\n  - Bug fixes.\n\nv2.8.1 14th March 2014\n  - Added support for iOS and Android.\n  - Added support for retina displays.\n  - A qscintilla2.prf file is installed so that application .pro files only\n    need to add CONFIG += qscintilla2.\n  - Updated the keywords recognised by the Octave lexer.\n  - Bug fixes.\n\nv2.8 9th November 2013\n  - Based on Scintilla v3.3.6.\n  - Added the SCN_FOCUSIN() and SCN_FOCUSOUT() signals to QsciScintillaBase.\n  - Added PreProcessorCommentLineDoc and InactivePreProcessorCommentLineDoc to\n    QsciLexerCPP.\n  - Added SCLEX_LITERATEHASKELL, SCLEX_KVIRC, SCLEX_RUST and SCLEX_STTXT to\n    QsciScintillaBase.\n  - Added ThickCompositionIndicator to QsciScintilla::IndicatorStyle.\n  - Added INDIC_COMPOSITIONTHICK to QsciScintillaBase.\n  - Added SC_FOLDACTION_CONTRACT, SC_FOLDACTION_EXPAND and SC_FOLDACTION_TOGGLE\n    to QsciScintillaBase.\n  - Added SCI_FOLDLINE, SCI_FOLDCHILDREN, SCI_EXPANDCHILDREN and SCI_FOLDALL to\n    QsciScintillaBase.\n  - Added SC_AUTOMATICFOLD_SHOW, SC_AUTOMATICFOLD_CLICK and\n    SC_AUTOMATICFOLD_CHANGE to QsciScintillaBase.\n  - Added SCI_SETAUTOMATICFOLD and SCI_GETAUTOMATICFOLD to QsciScintillaBase.\n  - Added SC_ORDER_PRESORTED, SC_ORDER_PERFORMSORT and SC_ORDER_CUSTOM to\n    QsciScintillaBase.\n  - Added SCI_AUTOCSETORDER and SCI_AUTOCGETORDER to QsciScintillaBase.\n  - Added SCI_POSITIONRELATIVE to QsciScintillaBase.\n  - Added SCI_RELEASEALLEXTENDEDSTYLES and SCI_ALLOCATEEXTENDEDSTYLES to\n    QsciScintillaBase.\n  - Added SCI_SCROLLRANGE to QsciScintillaBase.\n  - Added SCI_SETCARETLINEVISIBLEALWAYS and SCI_GETCARETLINEVISIBLEALWAYS to\n    QsciScintillaBase.\n  - Added SCI_SETMOUSESELECTIONRECTANGULARSWITCH and\n    SCI_GETMOUSESELECTIONRECTANGULARSWITCH to QsciScintillaBase.\n  - Added SCI_SETREPRESENTATION, SCI_GETREPRESENTATION and\n    SCI_CLEARREPRESENTATION to QsciScintillaBase.\n  - Input methods are now properly supported.\n\nv2.7.2 16th June 2013\n  - The build script for the Python bindings now has a --pyqt argument for\n    specifying PyQt4 or PyQt5.\n  - The default EOL mode on OS/X is now EolUnix.\n  - Bug fixes.\n\nv2.7.1 1st March 2013\n  - Added support for the final release of Qt v5.\n  - The build script for the Python bindings should now work with SIP v5.\n  - Bug fixes.\n\nv2.7 8th December 2012\n  - Based on Scintilla v3.2.3.\n  - Added support for Qt v5-rc1.\n  - Added HashQuotedString, InactiveHashQuotedString, PreProcessorComment,\n    InactivePreProcessorComment, setHighlightHashQuotedStrings() and\n    highlightHashQuotedStrings() to QsciLexerCpp.\n  - Added Variable, setHSSLanguage(), HSSLanguage(), setLessLanguage(),\n    LessLanguage(), setSCCSLanguage() and SCCSLanguage() to QsciLexerCSS.\n  - Added setOverwriteMode() and overwriteMode() to QsciScintilla.\n  - Added wordAtLineIndex() to QsciScintilla.\n  - Added findFirstInSelection() to QsciScintilla.\n  - Added CallTipsPosition, callTipsPosition() and setCallTipsPosition() to\n    QsciScintilla.\n  - Added WrapFlagInMargin to QsciScintilla::WrapVisualFlag.\n  - Added SquigglePixmapIndicator to QsciScintilla::IndicatorStyle.\n  - The weight of a font (rather than whether it is just bold or not) is now\n    respected.\n  - Added SCLEX_AVS, SCLEX_COFFEESCRIPT, SCLEX_ECL, SCLEX_OSCRIPT,\n    SCLEX_TCMD and SCLEX_VISUALPROLOG to QsciScintillaBase.\n  - Added SC_CASEINSENSITIVEBEHAVIOUR_IGNORECASE and\n    SC_CASEINSENSITIVEBEHAVIOUR_RESPECTCASE to QsciScintillaBase.\n  - Added SC_FONT_SIZE_MULTIPLIER to QsciScintillaBase.\n  - Added SC_WEIGHT_NORMAL, SC_WEIGHT_SEMIBOLD and SC_WEIGHT_BOLD to\n    QsciScintillaBase.\n  - Added SC_WRAPVISUALFLAG_MARGIN to QsciScintillaBase.\n  - Added INDIC_SQUIGGLEPIXMAP to QsciScintillaBase.\n  - Added SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR,\n    SCI_AUTOCGETCASEINSENSITIVEBEHAVIOUR, SCI_CALLTIPSETPOSITION,\n    SCI_COUNTCHARACTERS, SCI_CREATELOADER, SCI_DELETERANGE,\n    SCI_FINDINDICATORFLASH, SCI_FINDINDICATORHIDE, SCI_FINDINDICATORSHOW,\n    SCI_GETALLLINESVISIBLE, SCI_GETGAPPOSITION, SCI_GETPUNCTUATIONCHARS,\n    SCI_GETRANGEPOINTER, SCI_GETSELECTIONEMPTY, SCI_GETTECHNOLOGY,\n    SCI_GETWHITESPACECHARS, SCI_GETWORDCHARS, SCI_RGBAIMAGESETSCALE,\n    SCI_SETPUNCTUATIONCHARS, SCI_SETTECHNOLOGY, SCI_STYLESETSIZEFRACTIONAL,\n    SCI_STYLEGETSIZEFRACTIONAL, SCI_STYLESETWEIGHT and SCI_STYLEGETWEIGHT to\n    QsciScintillaBase.\n  - Removed SCI_GETUSEPALETTE and SCI_SETUSEPALETTE from QsciScintillaBase.\n  - Bug fixes.\n\nv2.6.2 20th June 2012\n  - Added support for Qt v5-alpha.\n  - QsciLexer::wordCharacters() is now part of the public API.\n  - Bug fixes.\n\nv2.6.1 10th February 2012\n  - Support SCI_NAMESPACE to enable all internal Scintilla classes to be put\n    into the Scintilla namespace.\n  - APIs now allow for spaces between the end of a word and the opening\n    parenthesis.\n  - Building against Qt v3 is fixed.\n\nv2.6 11th November 2011\n  - Based on Scintilla v2.29.\n  - Added Command, command() and execute() to QsciCommand.\n  - Added boundTo() and find() to QsciCommandSet.\n  - Added createStandardContextMenu() to QsciScintilla.\n  - Added StraightBoxIndicator, DashesIndicator, DotsIndicator,\n    SquiggleLowIndicator and DotBoxIndicator to QsciScintilla::IndicatorStyle.\n  - Added markerDefine() to QsciScintilla.\n  - Added MoNone, MoSublineSelect, marginOptions() and setMarginOptions() to\n    QsciScintilla.\n  - Added registerImage() to QsciScintilla.\n  - Added setIndicatorOutlineColor() to QsciScintilla.\n  - Added setMatchedBraceIndicator(), resetMatchedBraceIndicator(),\n    setUnmatchedBraceIndicator() and resetUnmatchedBraceIndicator() to\n    QsciScintilla.\n  - Added highlightTripleQuotedStrings() and setHighlightTripleQuotedStrings()\n    to QsciLexerCpp.\n  - Added Label to QsciLexerLua.\n  - Added DoubleQuotedStringVar, Translation, RegexVar, SubstitutionVar,\n    BackticksVar, DoubleQuotedHereDocumentVar, BacktickHereDocumentVar,\n    QuotedStringQQVar, QuotedStringQXVar, QuotedStringQRVar, setFoldAtElse()\n    and foldAtElse() to QsciLexerPerl.\n  - Added highlightSubidentifiers() and setHighlightSubidentifiers() to\n    QsciLexerPython.\n  - Added INDIC_STRAIGHTBOX, INDIC_DASH, INDIC_DOTS, INDIC_SQUIGGLELOW and\n    INDIC_DOTBOX to QsciScintillaBase.\n  - Added SC_MARGINOPTION_NONE and SC_MARGINOPTION_SUBLINESELECT to\n    QsciScintillaBase.\n  - Added SC_MARK_RGBAIMAGE to QsciScintillaBase.\n  - Added SCI_BRACEBADLIGHTINDICATOR, SCI_BRACEHIGHLIGHTINDICATOR,\n    SCI_GETIDENTIFIER, SCI_GETMARGINOPTIONS, SCI_INDICGETOUTLINEALPHA,\n    SCI_INDICSETOUTLINEALPHA, SCI_MARKERDEFINERGBAIMAGE,\n    SCI_MARKERENABLEHIGHLIGHT, SCI_MARKERSETBACKSELECTED,\n    SCI_MOVESELECTEDLINESDOWN, SCI_MOVESELECTEDLINESUP, SCI_REGISTERRGBAIMAGE,\n    SCI_RGBAIMAGESETHEIGHT, SCI_RGBAIMAGESETWIDTH, SCI_SCROLLTOEND,\n    SCI_SCROLLTOSTART, SCI_SETEMPTYSELECTION, SCI_SETIDENTIFIER and\n    SCI_SETMARGINOPTIONS to QsciScintillaBase.\n\nv2.5.1 17th April 2011\n  - Added QsciLexerMatlab and QsciLexerOctave.\n\nv2.5 29th March 2011\n  - Based on Scintilla v2.25.\n  - Rectangular selections are now fully supported and compatible with SciTE.\n  - The signature of the fromMimeData() and toMimeData() methods of\n    QsciScintillaBase have changed incompatibly in order to support rectangular\n    selections.\n  - Added QsciScintilla::setAutoCompletionUseSingle() to replace the now\n    deprecated setAutoCompletionShowSingle().\n  - Added QsciScintilla::autoCompletionUseSingle() to replace the now\n    deprecated autoCompletionShowSingle().\n  - QsciScintilla::setAutoCompletionCaseSensitivity() is no longer ignored if a\n    lexer has been set.\n  - Added FullRectangle, LeftRectangle and Underline to the\n    QsciScintilla::MarkerSymbol enum.\n  - Added setExtraAscent(), extraAscent(), setExtraDescent() and extraDescent()\n    to QsciScintilla.\n  - Added setWhitespaceSize() and whitespaceSize() to QsciScintilla.\n  - Added replaceSelectedText() to QsciScintilla.\n  - Added setWhitespaceBackgroundColor() and setWhitespaceForegroundColor() to\n    QsciScintilla.\n  - Added setWrapIndentMode() and wrapIndentMode() to QsciScintilla.\n  - Added setFirstVisibleLine() to QsciScintilla.\n  - Added setContractedFolds() and contractedFolds() to QsciScintilla.\n  - Added the SCN_HOTSPOTRELEASECLICK() signal to QsciScintillaBase.\n  - The signature of the QsciScintillaBase::SCN_UPDATEUI() signal has changed.\n  - Added the RawString and inactive styles to QsciLexerCPP.\n  - Added MediaRule to QsciLexerCSS.\n  - Added BackquoteString, RawString, KeywordSet5, KeywordSet6 and KeywordSet7\n    to QsciLexerD.\n  - Added setDjangoTemplates(), djangoTemplates(), setMakoTemplates() and\n    makoTemplates() to QsciLexerHTML.\n  - Added KeywordSet5, KeywordSet6, KeywordSet7 and KeywordSet8 to\n    QsciLexerLua.\n  - Added setInitialSpaces() and initialSpaces() to QsciLexerProperties.\n  - Added setFoldCompact(), foldCompact(), setStringsOverNewlineAllowed() and\n    stringsOverNewlineAllowed() to QsciLexerPython.\n  - Added setFoldComments(), foldComments(), setFoldCompact() and foldCompact()\n    to QsciLexerRuby.\n  - Added setFoldComments() and foldComments(), and removed setFoldCompact()\n    and foldCompact() from QsciLexerTCL.\n  - Added setFoldComments(), foldComments(), setFoldCompact(), foldCompact(),\n    setProcessComments(), processComments(), setProcessIf(), and processIf() to\n    QsciLexerTeX.\n  - Added QuotedIdentifier, setDottedWords(), dottedWords(), setFoldAtElse(),\n    foldAtElse(), setFoldOnlyBegin(), foldOnlyBegin(), setHashComments(),\n    hashComments(), setQuotedIdentifiers() and quotedIdentifiers() to\n    QsciLexerSQL.\n  - The Python bindings now allow optional arguments to be specified as keyword\n    arguments.\n  - The Python bindings will now build using the protected-is-public hack if\n    possible.\n\nv2.4.6 23rd December 2010\n  - Added support for indicators to the high-level API, i.e. added the\n    IndicatorStyle enum, the clearIndicatorRange(), fillIndicatorRange(),\n    indicatorDefine(), indicatorDrawUnder(), setIndicatorDrawUnder() and\n    setIndicatorForegroundColor methods, and the indicatorClicked() and\n    indicatorReleased() signals to QsciScintilla.\n  - Added support for the Key style in QsciLexerProperties.\n  - Added an API file for Python v2.7.\n  - Added the --no-timestamp command line option to the Python bindings'\n    configure.py.\n\nv2.4.5 31st August 2010\n  - A bug fix release.\n\nv2.4.4 12th July 2010\n  - Added the canInsertFromMimeData(), fromMimeData() and toMimeData() methods\n    to QsciScintillaBase.\n  - QsciScintilla::markerDefine() now allows existing markers to be redefined.\n\nv2.4.3 17th March 2010\n  - Added clearFolds() to QsciScintilla.\n\nv2.4.2 20th January 2010\n  - Updated Spanish translations from Jaime Seuma.\n  - Fixed compilation problems with Qt v3 and Qt v4 prior to v4.5.\n\nv2.4.1 14th January 2010\n  - Added the QsciLexerSpice and QsciLexerVerilog classes.\n  - Significant performance improvements when handling long lines.\n  - The Python bindings include automatically generated docstrings by default.\n  - Added an API file for Python v3.\n\nv2.4 5th June 2009\n  - Based on Scintilla v1.78.\n  - Added the QsciLexerCustom, QsciStyle and QsciStyledText classes.\n  - Added annotate(), annotation(), clearAnnotations(), setAnnotationDisplay()\n    and annotationDisplay() to QsciScintilla.\n  - Added setMarginText(), clearMarginText(), setMarginType() and marginType()\n    to QsciScintilla.\n  - Added QsciLexer::lexerId() so that container lexers can be implemented.\n  - Added editor() and styleBitsNeeded() to QsciLexer.\n  - Added setDollarsAllowed() and dollarsAllowed() to QsciLexerCPP.\n  - Added setFoldScriptComments(), foldScriptComments(),\n    setFoldScriptHeredocs() and foldScriptHeredocs() to QsciLexerHTML.\n  - Added setSmartHighlighting() and smartHighlighting() to QsciLexerPascal.\n    (Note that the Scintilla Pascal lexer has changed so that any saved colour\n    and font settings will not be properly restored.)\n  - Added setFoldPackages(), foldPackages(), setFoldPODBlocks() and\n    foldPODBlocks() to QsciLexerPerl.\n  - Added setV2UnicodeAllowed(), v2UnicodeAllowed(), setV3BinaryOctalAllowed(),\n    v3BinaryOctalAllowed(), setV3BytesAllowed and v3BytesAllowed() to\n    QsciLexerPython.\n  - Added setScriptsStyled() and scriptsStyled() to QsciLexerXML.\n  - Added Spanish translations from Jaime Seuma.\n\nv2.3.2 17th November 2008\n  - A bug fix release.\n\nv2.3.1 6th November 2008\n  - Based on Scintilla v1.77.\n  - Added the read() and write() methods to QsciScintilla to allow a file to be\n    read and written while minimising the conversions.\n  - Added the positionFromLineIndex() and lineIndexFromPosition() methods to\n    QsciScintilla to convert between a Scintilla character address and a\n    QScintilla character address.\n  - Added QsciScintilla::wordAtPoint() to return the word at the given screen\n    coordinates.\n  - QSciScintilla::setSelection() now allows the carat to be left at either the\n    start or the end of the selection.\n  - 'with' is now treated as a keyword by the Python lexer.\n\nv2.3 20th September 2008\n  - Based on Scintilla v1.76.\n  - The new QsciAbstractAPIs class allows applications to replace the default\n    implementation of the language APIs used for auto-completion lists and call\n    tips.\n  - Added QsciScintilla::apiContext() to allow applications to determine the\n    context used for auto-completion and call tips.\n  - Added the QsciLexerFortran, QsciLexerFortran77, QsciLexerPascal,\n    QsciLexerPostScript, QsciLexerTCL, QsciLexerXML and QsciLexerYAML classes.\n  - QsciScintilla::setFolding() will now accept an optional margin number.\n\nv2.2 27th February 2008\n  - Based on Scintilla v1.75.\n  - A lexer's default colour, paper and font are now written to and read from\n    the settings.\n  - Windows64 is now supported.\n  - The signature of the QsciScintillaBase::SCN_MACRORECORD() signal has\n    changed slightly.\n  - Changed the licensing to match the current Qt licenses, including GPL v3.\n\nv2.1 1st June 2007\n  - A slightly revised API, incompatible with QScintilla v2.0.\n  - Lexers now remember their style settings.  A lexer no longer has to be the\n    current lexer when changing a style's color, end-of-line fill, font or\n    paper.\n  - The color(), eolFill(), font() and paper() methods of QsciLexer now return\n    the current values for a style rather than the default values.\n  - The setDefaultColor(), setDefaultFont() and setDefaultPaper() methods of\n    QsciLexer are no longer slots and no longer virtual.\n  - The defaultColor(), defaultFont() and defaultPaper() methods of QsciLexer\n    are no longer virtual.\n  - The color(), eolFill(), font() and paper() methods of all QsciLexer derived\n    classes (except for QsciLexer itself) have been renamed defaultColor(),\n    defaultEolFill(), defaultFont() and defaultPaper() respectively.\n\nv2.0 26th May 2007\n  - A revised API, incompatible with QScintilla v1.\n  - Hugely improved autocompletion and call tips support.\n  - Supports both Qt v3 and Qt v4.\n  - Includes Python bindings.\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/OPENSOURCE-NOTICE.TXT",
    "content": "THIS IS THE OPEN SOURCE VERSION OF PyQt, RELEASED UNDER THE GPL\nLICENSE. PLEASE READ THIS FILE TO FIND OUT WHAT THAT MEANS TO YOU.\n\nINTRODUCTION \n============\n\nPyQt is licensed under two licenses: the GNU General Public License\n(GPL) and a commercial license. You are currently using the Open\nSource (GPL) version of PyQt.  This file explains the principle of dual\nlicensing, and which obligations using the GPL version of PyQt implies.\n\n\nABOUT DUAL LICENSING\n====================\n\nDual Licensing is based on the principle of Quid Pro Quo - something\nfor something. If you, your company or your organization derive\ncommercial benefit from Riverbank's products and do not wish to\nrelease your complete source code, you are required to purchase the\nappropriate number of commercial licenses.\n\nAlternatively, if you are willing to follow the terms of the GPL\n(General Public License), Riverbank software is available to you under\nOpen Source licenses which allows you to develop, modify and\ndistribute your software freely. If you wish to use an open source\nversion of Riverbank's products, you must contribute all your source\ncode to the open source community, according to the terms of the\napplicable open source license.\n\nBy offering both open source and commercial licenses, Riverbank\nensures the availability of resources for ongoing development and\nimprovement of PyQt. By purchasing commercial licenses, you are no\nlonger obligated to publish your source code.\n\n \nCOMMERCIAL AND OPEN SOURCE LICENSES \n===================================\n\nRiverbanks's Commercial licenses allow customers to develop, use and\ndistribute their applications under standard commercial terms.\n\nRiverbanks's Open Source versions are available under the terms of the\nGPL - General Public License. The main obligation for software\ndevelopment under the GPL is that anyone using your PyQt-based software\nmust have access to the complete source code, and must be able to\nmodify and redistribute that software to anyone free of charge.\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/configure-old.py",
    "content": "# This script configures QScintilla for PyQt v3 and/or v4.\n#\n# Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n# \n# This file is part of QScintilla.\n# \n# This file may be used under the terms of the GNU General Public\n# License versions 2.0 or 3.0 as published by the Free Software\n# Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n# included in the packaging of this file.  Alternatively you may (at\n# your option) use any later version of the GNU General Public\n# License if such license has been publicly approved by Riverbank\n# Computing Limited (or its successors, if any) and the KDE Free Qt\n# Foundation. In addition, as a special exception, Riverbank gives you\n# certain additional rights. These rights are described in the Riverbank\n# GPL Exception version 1.1, which can be found in the file\n# GPL_EXCEPTION.txt in this package.\n# \n# If you are unsure which license is appropriate for your use, please\n# contact the sales department at sales@riverbankcomputing.com.\n# \n# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nimport sys\nimport os\nimport glob\nimport optparse\n\n\n# Import SIP's configuration module so that we have access to the error\n# reporting.  Then try and import the configuration modules for both PyQt3 and\n# PyQt4.\ntry:\n    import sipconfig\nexcept ImportError:\n    sys.stderr.write(\"Unable to import sipconfig.  Please make sure SIP is installed.\\n\")\n    sys.exit(1)\n\ntry:\n    import PyQt4.pyqtconfig as pyqt4\nexcept:\n    pyqt4 = None\n\ntry:\n    import pyqtconfig as pyqt3\nexcept:\n    pyqt3 = None\n\nif pyqt4 is not None:\n    pyqt = pyqt4.Configuration()\n    qt_data_dir = pyqt.qt_data_dir\nelif pyqt3 is not None:\n    pyqt = pyqt3.Configuration()\n    qt_data_dir = pyqt.qt_dir\nelse:\n    sipconfig.error(\"Unable to find either PyQt v3 or v4.\")\n\n\n# This must be kept in sync with Python/configure.py, qscintilla.pro,\n# example-Qt4Qt5/application.pro and designer-Qt4Qt5/designer.pro.\nQSCI_API_MAJOR = 11\n\n\n# Initialise the globals.\nsip_min_version = 0x040c00\n\nif sys.platform == \"win32\":\n    qsci_define = \"QSCINTILLA_DLL\"\nelse:\n    qsci_define = \"\"\n\n\ndef create_optparser():\n    \"\"\"Create the parser for the command line.\n    \"\"\"\n\n    def store_abspath(option, opt_str, value, parser):\n        setattr(parser.values, option.dest, os.path.abspath(value))\n\n    def store_abspath_dir(option, opt_str, value, parser):\n        if not os.path.isdir(value):\n            raise optparse.OptionValueError(\"'%s' is not a directory\" % value)\n        setattr(parser.values, option.dest, os.path.abspath(value))\n\n    p = optparse.OptionParser(usage=\"python %prog [options]\",\n            version=\"2.8.4\")\n\n    p.add_option(\"-a\", \"--apidir\", action=\"callback\", default=None,\n            type=\"string\", metavar=\"DIR\", dest=\"qscidir\",\n            callback=store_abspath, help=\"where QScintilla's API file will be \"\n            \"installed [default: QTDIR/qsci]\")\n    p.add_option(\"-c\", \"--concatenate\", action=\"store_true\", default=False,\n            dest=\"concat\", help=\"concatenate the C++ source files\")\n    p.add_option(\"-d\", \"--destdir\", action=\"callback\",\n            default=pyqt.pyqt_mod_dir, type=\"string\", metavar=\"DIR\",\n            dest=\"qscimoddir\", callback=store_abspath, help=\"where the \"\n            \"QScintilla module will be installed [default: %s]\" %\n            pyqt.pyqt_mod_dir)\n    p.add_option(\"-j\", \"--concatenate-split\", type=\"int\", default=1,\n            metavar=\"N\", dest=\"split\", help=\"split the concatenated C++ \"\n            \"source files into N pieces [default: 1]\")\n    p.add_option(\"-k\", \"--static\", action=\"store_true\", default=False,\n            dest=\"static\", help=\"build the QScintilla module as a static \"\n            \"library\")\n    p.add_option(\"-n\", action=\"callback\", default=None, type=\"string\",\n            metavar=\"DIR\", dest=\"qsciincdir\", callback=store_abspath_dir,\n            help=\"the directory containing the QScintilla Qsci header file \"\n            \"directory [default: %s]\" % pyqt.qt_inc_dir)\n    p.add_option(\"--no-docstrings\", action=\"store_true\", default=False,\n            dest=\"no_docstrings\", help=\"disable the generation of docstrings\")\n    p.add_option(\"-o\", action=\"callback\", default=None, type=\"string\",\n            metavar=\"DIR\", dest=\"qscilibdir\", callback=store_abspath_dir,\n            help=\"the directory containing the QScintilla library [default: \"\n            \"%s]\" % pyqt.qt_lib_dir)\n    p.add_option(\"-p\", type=\"int\", default=-1, metavar=\"3|4\", dest=\"pyqt_major\",\n            help=\"specifically configure for PyQt v3 or v4 [default v4, if \"\n            \"found]\")\n    p.add_option(\"-r\", \"--trace\", action=\"store_true\", default=False,\n            dest=\"tracing\", help=\"build the QScintilla module with tracing \"\n            \"enabled\")\n    p.add_option(\"-s\", action=\"store_true\", default=False, dest=\"not_dll\",\n            help=\"QScintilla is a static library and not a DLL (Windows only)\")\n    p.add_option(\"-u\", \"--debug\", action=\"store_true\", default=False,\n            help=\"build the QScintilla module with debugging symbols\")\n    p.add_option(\"-v\", \"--sipdir\", action=\"callback\", default=None,\n            metavar=\"DIR\", dest=\"qscisipdir\", callback=store_abspath,\n            type=\"string\", help=\"where the QScintilla .sip files will be \"\n            \"installed [default: %s]\" % pyqt.pyqt_sip_dir)\n    p.add_option(\"-T\", \"--no-timestamp\", action=\"store_true\", default=False,\n            dest=\"no_timestamp\", help=\"suppress timestamps in the header \"\n            \"comments of generated code [default: include timestamps]\")\n\n    if sys.platform != 'win32':\n        if sys.platform.startswith('linux') or sys.platform == 'darwin':\n            pip_default = True\n            pip_default_str = \"enabled\"\n        else:\n            pip_default = False\n            pip_default_str = \"disabled\"\n\n        p.add_option(\"--protected-is-public\", action=\"store_true\",\n                default=pip_default, dest=\"prot_is_public\",\n                help=\"enable building with 'protected' redefined as 'public' \"\n                        \"[default: %s]\" % pip_default_str)\n        p.add_option(\"--protected-not-public\", action=\"store_false\",\n                dest=\"prot_is_public\",\n                help=\"disable building with 'protected' redefined as 'public'\")\n\n    return p\n\n\ndef inform_user():\n    \"\"\"Tell the user the option values that are going to be used.\n    \"\"\"\n    sipconfig.inform(\"PyQt %s is being used.\" % pyqt.pyqt_version_str)\n    sipconfig.inform(\"Qt v%s %s edition is being used.\" % (sipconfig.version_to_string(pyqt.qt_version), pyqt.qt_edition))\n    sipconfig.inform(\"SIP %s is being used.\" % pyqt.sip_version_str)\n\n    sipconfig.inform(\"The QScintilla module will be installed in %s.\" % opts.qscimoddir)\n    sipconfig.inform(\"The QScintilla API file will be installed in %s.\" % os.path.join(opts.qscidir, \"api\", \"python\"))\n    sipconfig.inform(\"The QScintilla .sip files will be installed in %s.\" % opts.qscisipdir)\n\n    if opts.no_docstrings:\n        sipconfig.inform(\"The QScintilla module is being built without generated docstrings.\")\n    else:\n        sipconfig.inform(\"The QScintilla module is being built with generated docstrings.\")\n\n    if opts.prot_is_public:\n        sipconfig.inform(\"The QScintilla module is being built with 'protected' redefined as 'public'.\")\n\n\ndef check_qscintilla():\n    \"\"\"See if QScintilla can be found and what its version is.\n    \"\"\"\n    # Find the QScintilla header files.\n    sciglobal = os.path.join(opts.qsciincdir, \"Qsci\", \"qsciglobal.h\")\n\n    if os.access(sciglobal, os.F_OK):\n        # Get the QScintilla version string.\n        _, sciversstr = sipconfig.read_version(sciglobal, \"QScintilla\", \"QSCINTILLA_VERSION\", \"QSCINTILLA_VERSION_STR\")\n\n        if glob.glob(os.path.join(opts.qscilibdir, \"*qscintilla2*\")):\n            # Because we include the Python bindings with the C++ code we can\n            # reasonably force the same version to be used and not bother about\n            # versioning.\n            if sciversstr != \"2.8.4\":\n                sipconfig.error(\"QScintilla %s is being used but the Python bindings 2.8.4 are being built.  Please use matching versions.\" % sciversstr)\n\n            sipconfig.inform(\"QScintilla %s is being used.\" % sciversstr)\n        else:\n            sipconfig.error(\"The QScintilla library could not be found in %s. If QScintilla is installed then use the -o argument to explicitly specify the correct directory.\" % opts.qscilibdir)\n    else:\n        sipconfig.error(\"Qsci/qsciglobal.h could not be found in %s. If QScintilla is installed then use the -n argument to explicitly specify the correct directory.\" % opts.qsciincdir)\n\n\ndef sip_flags():\n    \"\"\"Return the SIP flags.\n    \"\"\"\n    # Get the flags used for the main PyQt module.\n    if pyqt.pyqt_version >= 0x040000:\n        flags = pyqt.pyqt_sip_flags.split()\n    else:\n        flags = pyqt.pyqt_qt_sip_flags.split()\n        flags.append(\"-x\")\n        flags.append(\"Qsci_Qt4\")\n\n    # Generate the API file.\n    flags.append(\"-a\")\n    flags.append(\"QScintilla2.api\")\n\n    # Add PyQt's .sip files to the search path.\n    flags.append(\"-I\")\n    flags.append(pyqt.pyqt_sip_dir)\n\n    return flags\n\n\ndef generate_code():\n    \"\"\"Generate the code for the QScintilla module.\n    \"\"\"\n    if pyqt.pyqt_version >= 0x040000:\n        mname = \"Qsci\"\n    else:\n        mname = \"qsci\"\n\n    sipconfig.inform(\"Generating the C++ source for the %s module...\" % mname)\n\n    # Build the SIP command line.\n    argv = ['\"' + pyqt.sip_bin + '\"']\n\n    argv.extend(sip_flags())\n\n    if opts.no_timestamp:\n        argv.append(\"-T\")\n\n    if not opts.no_docstrings:\n        argv.append(\"-o\");\n\n    if opts.prot_is_public:\n        argv.append(\"-P\");\n\n    if opts.concat:\n        argv.append(\"-j\")\n        argv.append(str(opts.split))\n\n    if opts.tracing:\n        argv.append(\"-r\")\n\n    argv.append(\"-c\")\n    argv.append(\".\")\n\n    buildfile = os.path.join(\"qsci.sbf\")\n    argv.append(\"-b\")\n    argv.append(buildfile)\n\n    if pyqt.pyqt_version >= 0x040000:\n        argv.append(\"sip/qscimod4.sip\")\n    else:\n        argv.append(\"sip/qscimod3.sip\")\n\n    os.system(\" \".join(argv))\n\n    # Check the result.\n    if not os.access(buildfile, os.F_OK):\n        sipconfig.error(\"Unable to create the C++ code.\")\n\n    # Generate the Makefile.\n    sipconfig.inform(\"Creating the Makefile for the %s module...\" % mname)\n\n    def fix_install(mfile):\n        if sys.platform != \"darwin\" or opts.static:\n            return\n\n        mfile.write(\"\\tinstall_name_tool -change libqscintilla2.%u.dylib %s/libqscintilla2.%u.dylib $(DESTDIR)%s/$(TARGET)\\n\" % (QSCI_API_MAJOR, opts.qscilibdir, QSCI_API_MAJOR, opts.qscimoddir))\n\n    if pyqt.pyqt_version >= 0x040000:\n        class Makefile(pyqt4.QtGuiModuleMakefile):\n            def generate_target_install(self, mfile):\n                pyqt4.QtGuiModuleMakefile.generate_target_install(self, mfile)\n                fix_install(mfile)\n    else:\n        class Makefile(pyqt3.QtModuleMakefile):\n            def generate_target_install(self, mfile):\n                pyqt3.QtModuleMakefile.generate_target_install(self, mfile)\n                fix_install(mfile)\n\n    installs = []\n    sipfiles = []\n\n    for s in glob.glob(\"sip/*.sip\"):\n        sipfiles.append(os.path.join(\"sip\", os.path.basename(s)))\n\n    installs.append([sipfiles, os.path.join(opts.qscisipdir, mname)])\n\n    installs.append((\"QScintilla2.api\", os.path.join(opts.qscidir, \"api\", \"python\")))\n\n    # PyQt v4.2 and later can handle MacOS/X universal binaries.\n    if pyqt.pyqt_version >= 0x040200:\n        makefile = Makefile(\n            configuration=pyqt,\n            build_file=\"qsci.sbf\",\n            install_dir=opts.qscimoddir,\n            installs=installs,\n            static=opts.static,\n            debug=opts.debug,\n            universal=pyqt.universal,\n            arch=pyqt.arch,\n            prot_is_public=opts.prot_is_public,\n            deployment_target=pyqt.deployment_target\n        )\n    else:\n        makefile = Makefile(\n            configuration=pyqt,\n            build_file=\"qsci.sbf\",\n            install_dir=opts.qscimoddir,\n            installs=installs,\n            static=opts.static,\n            debug=opts.debug\n        )\n\n    if qsci_define:\n        makefile.extra_defines.append(qsci_define)\n\n    makefile.extra_include_dirs.append(opts.qsciincdir)\n    makefile.extra_lib_dirs.append(opts.qscilibdir)\n    makefile.extra_libs.append(\"qscintilla2\")\n\n    makefile.generate()\n\n\ndef main(argv):\n    \"\"\"Create the configuration module module.\n\n    argv is the list of command line arguments.\n    \"\"\"\n    global pyqt\n\n    # Check SIP is new enough.\n    if \"snapshot\" not in pyqt.sip_version_str:\n        if pyqt.sip_version < sip_min_version:\n            sipconfig.error(\"This version of QScintilla requires SIP v%s or later\" % sipconfig.version_to_string(sip_min_version))\n\n    # Parse the command line.\n    global opts\n\n    p = create_optparser()\n    opts, args = p.parse_args()\n\n    if args:\n        p.print_help()\n        sys.exit(2)\n\n    # Provide defaults for platform-specific options.\n    if sys.platform == 'win32':\n        opts.prot_is_public = False\n\n    if opts.not_dll:\n        global qsci_define\n        qsci_define = \"\"\n\n    # Set the version of PyQt explicitly.\n    global qt_data_dir\n\n    if opts.pyqt_major == 4:\n        if pyqt4 is None:\n            sipconfig.error(\"PyQt v4 was specified with the -p argument but doesn't seem to be installed.\")\n        else:\n            pyqt = pyqt4.Configuration()\n            qt_data_dir = pyqt.qt_data_dir\n    elif opts.pyqt_major == 3:\n        if pyqt3 is None:\n            sipconfig.error(\"PyQt v3 was specified with the -p argument but doesn't seem to be installed.\")\n        else:\n            pyqt = pyqt3.Configuration()\n            qt_data_dir = pyqt.qt_dir\n    elif opts.pyqt_major >= 0:\n        sipconfig.error(\"Specify either 3 or 4 with the -p argument.\")\n\n    # Now we know which version of PyQt to use we can set defaults for those\n    # arguments that weren't specified.\n    if opts.qscimoddir is None:\n        opts.qscimoddir = pyqt.pyqt_mod_dir\n\n    if opts.qsciincdir is None:\n        opts.qsciincdir = pyqt.qt_inc_dir\n\n    if opts.qscilibdir is None:\n        opts.qscilibdir = pyqt.qt_lib_dir\n\n    if opts.qscisipdir is None:\n        opts.qscisipdir = pyqt.pyqt_sip_dir\n\n    if opts.qscidir is None:\n        opts.qscidir = os.path.join(qt_data_dir, \"qsci\")\n\n    # Check for QScintilla.\n    check_qscintilla()\n\n    # Tell the user what's been found.\n    inform_user()\n\n    # Generate the code.\n    generate_code()\n\n\n###############################################################################\n# The script starts here.\n###############################################################################\n\nif __name__ == \"__main__\":\n    try:\n        main(sys.argv)\n    except SystemExit:\n        raise\n    except:\n        sys.stderr.write(\n\"\"\"An internal error occured.  Please report all the output from the program,\nincluding the following traceback, to support@riverbankcomputing.com.\n\"\"\")\n        raise\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/configure.py",
    "content": "# Copyright (c) 2014, Riverbank Computing Limited\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are met:\n# \n# 1. Redistributions of source code must retain the above copyright notice,\n#    this list of conditions and the following disclaimer.\n# \n# 2. Redistributions in binary form must reproduce the above copyright notice,\n#    this list of conditions and the following disclaimer in the documentation\n#    and/or other materials provided with the distribution.\n# \n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n# POSSIBILITY OF SUCH DAMAGE.\n\n# This is v1.2 of this boilerplate.\n\n\nimport sys\nimport os\nimport glob\nimport optparse\n\ntry:\n    import sysconfig\nexcept ImportError:\n    from distutils import sysconfig\n\n\n###############################################################################\n# You shouldn't need to modify anything above this line.\n###############################################################################\n\n\n# This must be kept in sync with Python/configure-old.py, qscintilla.pro,\n# example-Qt4Qt5/application.pro and designer-Qt4Qt5/designer.pro.\nQSCI_API_MAJOR = 11\n\n\nclass ModuleConfiguration(object):\n    \"\"\" This class encapsulates all the module specific information needed by\n    the rest of this script to implement a configure.py script for modules that\n    build on top of PyQt.  Functions implemented by the rest of this script\n    that begin with an underscore are considered internal and shouldn't be\n    called from here.\n    \"\"\"\n\n    # The name of the module as it would be used in an import statement.\n    name = 'Qsci'\n\n    # The descriptive name of the module.  This is used in help text and error\n    # messages.\n    descriptive_name = \"QScintilla\"\n\n    # The version of the module as a string.  Set it to None if you don't\n    # provide version information.\n    version = '2.8.4'\n\n    # Set if a configuration script is provided that handles versions of PyQt4\n    # prior to v4.10 (i.e. versions where the pyqtconfig.py module is\n    # available).  If provided the script must be called configure-old.py and\n    # be in the same directory as this script.\n    legacy_configuration_script = True\n\n    # The minimum version of SIP that is required.  This should be a\n    # dot-separated string of two or three integers (e.g. '1.0', '4.10.3').  If\n    # it is None or an empty string then the version is not checked.\n    minimum_sip_version = '4.16'\n\n    # Set if support for C++ exceptions can be disabled.\n    no_exceptions = True\n\n    # Set if the module supports redefining 'protected' as 'public'.\n    protected_is_public_is_supported = True\n\n    # Set if the module supports PyQt4.\n    pyqt4_is_supported = True\n\n    # Set if the module supports PyQt5.\n    pyqt5_is_supported = True\n\n    # Set if the PyQt5 support is the default.  It is ignored unless both\n    # 'pyqt4_is_supported' and 'pyqt5_is_supported' are set.\n    pyqt5_is_default = False\n\n    # The name (without the .api extension) of the name of the QScintilla API\n    # file to be generated.  If it is None or an empty string then an API file\n    # is not generated.\n    qscintilla_api_file = 'QScintilla2'\n\n    # The email address that will be included when an error in the script is\n    # detected.  Leave it blank if you don't want to include an address.\n    support_email_address = 'support@riverbankcomputing.com'\n\n    # Set if the user can provide a configuration file.  It is normally only\n    # used if cross-compilation is supported.\n    user_configuration_file_is_supported = True\n\n    # Set if the user is allowed to pass PyQt sip flags on the command line.\n    # It is normally only used if cross-compilation is supported.  It is\n    # ignored unless at least one of 'pyqt4_is_supported' or\n    # 'pyqt5_is_supported' is set.\n    user_pyqt_sip_flags_is_supported = True\n\n    def init_target_configuration(self, target_configuration):\n        \"\"\" Perform any module specific initialisation of the target\n        target configuration.  Typically this is the initialisation of module\n        specific attributes.  To avoid name clashes attributes should be given\n        a module specific prefix.  target_configuration is the target\n        configuration.\n        \"\"\"\n\n        target_configuration.qsci_version = None\n        target_configuration.qsci_inc_dir = None\n        target_configuration.qsci_lib_dir = None\n        target_configuration.qsci_is_dll = (target_configuration.py_platform == 'win32')\n        target_configuration.qsci_sip_dir = None\n\n    def init_optparser(self, optparser, target_configuration):\n        \"\"\" Perform any module specific initialisation of the command line\n        option parser.  To avoid name clashes destination attributes should be\n        given a module specific prefix.  optparser is the option parser.\n        target_configuration is the target configuration.\n        \"\"\"\n\n        optparser.add_option('--qsci-incdir', '-n', dest='qsci_inc_dir',\n                type='string', default=None, action='callback',\n                callback=optparser_store_abspath_dir, metavar=\"DIR\",\n                help=\"the directory containing the QScintilla Qsci header \"\n                        \"file directory is DIR [default: QT_INSTALL_HEADERS]\")\n\n        optparser.add_option('--qsci-libdir', '-o', dest='qsci_lib_dir',\n                type='string', default=None, action='callback',\n                callback=optparser_store_abspath_dir, metavar=\"DIR\",\n                help=\"the directory containing the QScintilla library is DIR \"\n                        \"[default: QT_INSTALL_LIBS]\")\n\n        optparser.add_option('--no-dll', '-s', dest='qsci_is_dll',\n                default=None, action='store_false',\n                help=\"QScintilla is a static library and not a Windows DLL\")\n\n        optparser.add_option('--qsci-sipdir', '-v', dest='qsci_sip_dir',\n                type='string', default=None, action='callback',\n                callback=optparser_store_abspath_dir, metavar=\"DIR\",\n                help=\"the QScintilla .sip files will be installed in DIR \"\n                        \"[default: %s]\" % target_configuration.pyqt_sip_dir)\n\n        optparser.add_option(\"--no-sip-files\", action=\"store_true\",\n                default=False, dest=\"qsci_no_sip_files\",\n                help=\"disable the installation of the .sip files \"\n                        \"[default: enabled]\")\n\n    def apply_options(self, target_configuration, options):\n        \"\"\" Apply the module specific command line options to the target\n        configuration.  target_configuration is the target configuration.\n        options are the parsed options.\n        \"\"\"\n\n        if options.qsci_inc_dir is not None:\n            target_configuration.qsci_inc_dir = options.qsci_inc_dir\n\n        if options.qsci_lib_dir is not None:\n            target_configuration.qsci_lib_dir = options.qsci_lib_dir\n\n        if options.qsci_is_dll is not None:\n            target_configuration.qsci_is_dll = options.qsci_is_dll\n\n        if options.qsci_sip_dir is not None:\n            target_configuration.qsci_sip_dir = options.qsci_sip_dir\n        else:\n            target_configuration.qsci_sip_dir = target_configuration.pyqt_sip_dir\n\n        if options.qsci_no_sip_files:\n            target_configuration.qsci_sip_dir = ''\n\n    def check_module(self, target_configuration):\n        \"\"\" Perform any module specific checks now that the target\n        configuration is complete.  target_configuration is the target\n        configuration.\n        \"\"\"\n\n        # Find the QScintilla header files.\n        inc_dir = target_configuration.qsci_inc_dir\n        if inc_dir is None:\n            inc_dir = target_configuration.qt_inc_dir\n\n        sciglobal = os.path.join(inc_dir, 'Qsci', 'qsciglobal.h')\n\n        if not os.access(sciglobal, os.F_OK):\n            error(\n                    \"Qsci/qsciglobal.h could not be found in %s. If \"\n                    \"QScintilla is installed then use the --qsci-incdir \"\n                    \"argument to explicitly specify the correct \"\n                    \"directory.\" % inc_dir)\n\n        # Get the QScintilla version string.\n        qsci_version = read_define(sciglobal, 'QSCINTILLA_VERSION_STR')\n        if qsci_version is None:\n            error(\n                    \"The QScintilla version number could not be determined by \"\n                    \"reading %s.\" % sciglobal)\n\n        lib_dir = target_configuration.qsci_lib_dir\n        if lib_dir is None:\n            lib_dir = target_configuration.qt_lib_dir\n\n        if not glob.glob(os.path.join(lib_dir, '*qscintilla2*')):\n            error(\n                    \"The QScintilla library could not be found in %s. If \"\n                    \"QScintilla is installed then use the --qsci-libdir \"\n                    \"argument to explicitly specify the correct \"\n                    \"directory.\" % lib_dir)\n\n        # Because we include the Python bindings with the C++ code we can\n        # reasonably force the same version to be used and not bother about\n        # versioning in the .sip files.\n        if qsci_version != self.version:\n            error(\n                    \"QScintilla %s is being used but the Python bindings %s \"\n                    \"are being built. Please use matching \"\n                    \"versions.\" % (qsci_version, self.version))\n\n        target_configuration.qsci_version = qsci_version\n\n    def inform_user(self, target_configuration):\n        \"\"\" Inform the user about module specific configuration information.\n        target_configuration is the target configuration.\n        \"\"\"\n\n        inform(\"QScintilla %s is being used.\" %\n                target_configuration.qsci_version)\n\n        if target_configuration.qsci_sip_dir != '':\n            inform(\"The QScintilla .sip files will be installed in %s.\" %\n                    target_configuration.qsci_sip_dir)\n\n    def pre_code_generation(self, target_config):\n        \"\"\" Perform any module specific initialisation prior to generating the\n        code.  target_config is the target configuration.\n        \"\"\"\n\n        # Nothing to do.\n\n    def get_sip_flags(self, target_configuration):\n        \"\"\" Return the list of module-specific flags to pass to SIP.\n        target_configuration is the target configuration.\n        \"\"\"\n\n        # Nothing to do.\n        return []\n\n    def get_sip_file(self, target_configuration):\n        \"\"\" Return the name of the module's .sip file.  target_configuration is\n        the target configuration.\n        \"\"\"\n\n        return 'sip/qscimod5.sip' if target_configuration.pyqt_package == 'PyQt5' else 'sip/qscimod4.sip'\n\n    def get_sip_installs(self, target_configuration):\n        \"\"\" Return a tuple of the installation directory of the module's .sip\n        files and a sequence of the names of each of the .sip files relative to\n        the directory containing this configuration script.  None is returned\n        if the module's .sip files are not to be installed.\n        target_configuration is the target configuration.\n        \"\"\"\n\n        if target_configuration.qsci_sip_dir == '':\n            return None\n\n        path = os.path.join(target_configuration.qsci_sip_dir, 'Qsci')\n        files = glob.glob('sip/*.sip')\n\n        return path, files\n\n    def get_qmake_configuration(self, target_configuration):\n        \"\"\" Return a dict of qmake configuration values for CONFIG, DEFINES,\n        INCLUDEPATH, LIBS and QT.  If value names (i.e. dict keys) have either\n        'Qt4' or 'Qt5' prefixes then they are specific to the corresponding\n        version of Qt.  target_configuration is the target configuration.\n        \"\"\"\n\n        qmake = {'CONFIG': 'qscintilla2'}\n\n        if target_configuration.qsci_inc_dir is not None:\n            qmake['INCLUDEPATH'] = quote(target_configuration.qsci_inc_dir)\n\n        if target_configuration.qsci_lib_dir is not None:\n            qmake['LIBS'] = '-L%s' % quote(target_configuration.qsci_lib_dir)\n\n        if target_configuration.qsci_is_dll:\n            qmake['DEFINES'] = 'QSCINTILLA_DLL'\n\n        return qmake\n\n    def get_mac_wrapped_library_file(self, target_configuration):\n        \"\"\" Return the full pathname of the file that implements the library\n        being wrapped by the module as it would be called on OS/X so that the\n        module will reference it explicitly without DYLD_LIBRARY_PATH being\n        set.  If it is None or an empty string then the default is used.\n        target_configuration is the target configuration.\n        \"\"\"\n\n        lib_dir = target_configuration.qsci_lib_dir\n        if lib_dir is None:\n            lib_dir = target_configuration.qt_lib_dir\n\n        return os.path.join(lib_dir,\n                'libqscintilla2.%s.dylib' % QSCI_API_MAJOR)\n\n\n###############################################################################\n# You shouldn't need to modify anything below this line.\n###############################################################################\n\n\ndef error(msg):\n    \"\"\" Display an error message and terminate.  msg is the text of the error\n    message.\n    \"\"\"\n\n    sys.stderr.write(_format(\"Error: \" + msg) + \"\\n\")\n    sys.exit(1)\n\n\ndef inform(msg):\n    \"\"\" Display an information message.  msg is the text of the error message.\n    \"\"\"\n\n    sys.stdout.write(_format(msg) + \"\\n\")\n\n\ndef quote(path):\n    \"\"\" Return a path with quotes added if it contains spaces.  path is the\n    path.\n    \"\"\"\n\n    if ' ' in path:\n        path = '\"%s\"' % path\n\n    return path\n\n\ndef optparser_store_abspath(option, opt_str, value, parser):\n    \"\"\" An optparser callback that saves an option as an absolute pathname. \"\"\"\n\n    setattr(parser.values, option.dest, os.path.abspath(value))\n\n\ndef optparser_store_abspath_dir(option, opt_str, value, parser):\n    \"\"\" An optparser callback that saves an option as the absolute pathname\n    of an existing directory.\n    \"\"\"\n\n    if not os.path.isdir(value):\n        raise optparse.OptionValueError(\"'%s' is not a directory\" % value)\n\n    setattr(parser.values, option.dest, os.path.abspath(value))\n\n\ndef optparser_store_abspath_exe(option, opt_str, value, parser):\n    \"\"\" An optparser callback that saves an option as the absolute pathname\n    of an existing executable.\n    \"\"\"\n\n    if not os.access(value, os.X_OK):\n        raise optparse.OptionValueError(\"'%s' is not an executable\" % value)\n\n    setattr(parser.values, option.dest, os.path.abspath(value))\n\n\ndef read_define(filename, define):\n    \"\"\" Read the value of a #define from a file.  filename is the name of the\n    file.  define is the name of the #define.  None is returned if there was no\n    such #define.\n    \"\"\"\n\n    f = open(filename)\n\n    for l in f:\n        wl = l.split()\n        if len(wl) >= 3 and wl[0] == \"#define\" and wl[1] == define:\n            # Take account of embedded spaces.\n            value = ' '.join(wl[2:])[1:-1]\n            break\n    else:\n        value = None\n\n    f.close()\n\n    return value\n\n\ndef version_from_string(version_str):\n    \"\"\" Convert a version string of the form m, m.n or m.n.o to an encoded\n    version number (or None if it was an invalid format).  version_str is the\n    version string.\n    \"\"\"\n\n    parts = version_str.split('.')\n    if not isinstance(parts, list):\n        return None\n\n    if len(parts) == 1:\n        parts.append('0')\n\n    if len(parts) == 2:\n        parts.append('0')\n\n    if len(parts) != 3:\n        return None\n\n    version = 0\n\n    for part in parts:\n        try:\n            v = int(part)\n        except ValueError:\n            return None\n\n        version = (version << 8) + v\n\n    return version\n\n\ndef _format(msg, left_margin=0, right_margin=78):\n    \"\"\" Format a message by inserting line breaks at appropriate places.  msg\n    is the text of the message.  left_margin is the position of the left\n    margin.  right_margin is the position of the right margin.  Returns the\n    formatted message.\n    \"\"\"\n\n    curs = left_margin\n    fmsg = \" \" * left_margin\n\n    for w in msg.split():\n        l = len(w)\n        if curs != left_margin and curs + l > right_margin:\n            fmsg = fmsg + \"\\n\" + (\" \" * left_margin)\n            curs = left_margin\n\n        if curs > left_margin:\n            fmsg = fmsg + \" \"\n            curs = curs + 1\n\n        fmsg = fmsg + w\n        curs = curs + l\n\n    return fmsg\n\n\nclass _ConfigurationFileParser:\n    \"\"\" A parser for configuration files. \"\"\"\n\n    def __init__(self, config_file):\n        \"\"\" Read and parse a configuration file. \"\"\"\n\n        self._config = {}\n        self._extrapolating = []\n\n        cfg = open(config_file)\n        line_nr = 0\n        last_name = None\n\n        section = ''\n        section_config = {}\n        self._config[section] = section_config\n\n        for l in cfg:\n            line_nr += 1\n\n            # Strip comments.\n            l = l.split('#')[0]\n\n            # See if this might be part of a multi-line.\n            multiline = (last_name is not None and len(l) != 0 and l[0] == ' ')\n\n            l = l.strip()\n\n            if l == '':\n                last_name = None\n                continue\n\n            # See if this is a new section.\n            if l[0] == '[' and l[-1] == ']':\n                section = l[1:-1].strip()\n                if section == '':\n                    error(\n                            \"%s:%d: Empty section name.\" % (\n                                    config_file, line_nr))\n\n                if section in self._config:\n                    error(\n                            \"%s:%d: Section '%s' defined more than once.\" % (\n                                    config_file, line_nr, section))\n\n                section_config = {}\n                self._config[section] = section_config\n\n                last_name = None\n                continue\n\n            parts = l.split('=', 1)\n            if len(parts) == 2:\n                name = parts[0].strip()\n                value = parts[1].strip()\n            elif multiline:\n                name = last_name\n                value = section_config[last_name]\n                value += ' ' + l\n            else:\n                name = value = ''\n\n            if name == '' or value == '':\n                error(\"%s:%d: Invalid line.\" % (config_file, line_nr))\n\n            section_config[name] = value\n            last_name = name\n\n        cfg.close()\n\n    def sections(self):\n        \"\"\" Return the list of sections, excluding the default one. \"\"\"\n\n        return [s for s in self._config.keys() if s != '']\n\n    def preset(self, name, value):\n        \"\"\" Add a preset value to the configuration. \"\"\"\n\n        self._config[''][name] = value\n\n    def get(self, section, name, default=None):\n        \"\"\" Get a configuration value while extrapolating. \"\"\"\n\n        # Get the name from the section, or the default section.\n        value = self._config[section].get(name)\n        if value is None:\n            value = self._config[''].get(name)\n            if value is None:\n                if default is None:\n                    error(\n                            \"Configuration file references non-existent name \"\n                            \"'%s'.\" % name)\n\n                return default\n\n        # Handle any extrapolations.\n        parts = value.split('%(', 1)\n        while len(parts) == 2:\n            prefix, tail = parts\n\n            parts = tail.split(')', 1)\n            if len(parts) != 2:\n                error(\n                        \"Configuration file contains unterminated \"\n                        \"extrapolated name '%s'.\" % tail)\n\n            xtra_name, suffix = parts\n\n            if xtra_name in self._extrapolating:\n                error(\n                        \"Configuration file contains a recursive reference to \"\n                        \"'%s'.\" % xtra_name)\n\n            self._extrapolating.append(xtra_name)\n            xtra_value = self.get(section, xtra_name)\n            self._extrapolating.pop()\n\n            value = prefix + xtra_value + suffix\n\n            parts = value.split('%(', 1)\n\n        return value\n\n    def getboolean(self, section, name, default):\n        \"\"\" Get a boolean configuration value while extrapolating. \"\"\"\n\n        value = self.get(section, name, default)\n\n        # In case the default was returned.\n        if isinstance(value, bool):\n            return value\n\n        if value in ('True', 'true', '1'):\n            return True\n\n        if value in ('False', 'false', '0'):\n            return False\n\n        error(\n                \"Configuration file contains invalid boolean value for \"\n                \"'%s'.\" % name)\n\n    def getlist(self, section, name, default):\n        \"\"\" Get a list configuration value while extrapolating. \"\"\"\n\n        value = self.get(section, name, default)\n\n        # In case the default was returned.\n        if isinstance(value, list):\n            return value\n\n        return value.split()\n\n\nclass _HostPythonConfiguration:\n    \"\"\" A container for the host Python configuration. \"\"\"\n\n    def __init__(self):\n        \"\"\" Initialise the configuration. \"\"\"\n\n        self.platform = sys.platform\n        self.version = sys.hexversion >> 8\n\n        if hasattr(sysconfig, 'get_path'):\n            # The modern API.\n            self.inc_dir = sysconfig.get_path('include')\n            self.module_dir = sysconfig.get_path('platlib')\n        else:\n            # The legacy distutils API.\n            self.inc_dir = sysconfig.get_python_inc(plat_specific=1)\n            self.module_dir = sysconfig.get_python_lib(plat_specific=1)\n\n        if sys.platform == 'win32':\n            self.data_dir = sys.prefix\n            self.lib_dir = sys.prefix + '\\\\libs'\n        else:\n            self.data_dir = sys.prefix + '/share'\n            self.lib_dir = sys.prefix + '/lib'\n\n\nclass _TargetQtConfiguration:\n    \"\"\" A container for the target Qt configuration. \"\"\"\n\n    def __init__(self, qmake):\n        \"\"\" Initialise the configuration.  qmake is the full pathname of the\n        qmake executable that will provide the configuration.\n        \"\"\"\n\n        pipe = os.popen(' '.join([qmake, '-query']))\n\n        for l in pipe:\n            l = l.strip()\n\n            tokens = l.split(':', 1)\n            if isinstance(tokens, list):\n                if len(tokens) != 2:\n                    error(\"Unexpected output from qmake: '%s'\\n\" % l)\n\n                name, value = tokens\n            else:\n                name = tokens\n                value = None\n\n            name = name.replace('/', '_')\n\n            setattr(self, name, value)\n\n        pipe.close()\n\n\nclass _TargetConfiguration:\n    \"\"\" A container for the target configuration. \"\"\"\n\n    def __init__(self, module_config):\n        \"\"\" Initialise the configuration with default values.  module_config is\n        the module configuration.\n        \"\"\"\n\n        # Values based on the host Python configuration.\n        py_config = _HostPythonConfiguration()\n        self.py_platform = py_config.platform\n        self.py_version = py_config.version\n        self.py_module_dir = py_config.module_dir\n        self.py_inc_dir = py_config.inc_dir\n        self.py_pylib_dir = py_config.lib_dir\n        self.py_sip_dir = os.path.join(py_config.data_dir, 'sip')\n        self.sip_inc_dir = py_config.inc_dir\n\n        # The default qmake spec.\n        if self.py_platform == 'win32':\n            if self.py_version >= 0x030300:\n                self.qmake_spec = 'win32-msvc2010'\n            elif self.py_version >= 0x020600:\n                self.qmake_spec = 'win32-msvc2008'\n            elif self.py_version >= 0x020400:\n                self.qmake_spec = 'win32-msvc.net'\n            else:\n                self.qmake_spec = 'win32-msvc'\n        else:\n            # Use the Qt default.  (We may update it for MacOS/X later.)\n            self.qmake_spec = ''\n\n        # Remaining values.\n        self.pyqt_sip_flags = None\n        self.pyqt_version_str = ''\n        self.qmake = self._find_exe('qmake')\n        self.qt_version_str = ''\n        self.sip = self._find_exe('sip')\n        self.sip_version = None\n        self.sysroot = ''\n\n        self.prot_is_public = (self.py_platform.startswith('linux') or self.py_platform == 'darwin')\n\n        if module_config.pyqt5_is_supported and module_config.pyqt4_is_supported:\n            pyqt = 'PyQt5' if module_config.pyqt5_is_default else 'PyQt4'\n        elif module_config.pyqt5_is_supported and not module_config.pyqt4_is_supported:\n            pyqt = 'PyQt5'\n        elif not module_config.pyqt5_is_supported and module_config.pyqt4_is_supported:\n            pyqt = 'PyQt4'\n        else:\n            pyqt = None\n\n        if pyqt is not None:\n            self.module_dir = os.path.join(py_config.module_dir, pyqt)\n            self.pyqt_sip_dir = os.path.join(self.py_sip_dir, pyqt)\n        else:\n            self.module_dir = py_config.module_dir\n            self.pyqt_sip_dir = None\n\n        self.pyqt_package = pyqt\n\n        module_config.init_target_configuration(self)\n\n    def update_from_configuration_file(self, config_file):\n        \"\"\" Update the configuration with values from a file.  config_file\n        is the name of the configuration file.\n        \"\"\"\n\n        inform(\"Reading configuration from %s...\" % config_file)\n\n        parser = _ConfigurationFileParser(config_file)\n\n        # Populate some presets from the command line.\n        parser.preset('py_major', str(self.py_version >> 16))\n        parser.preset('py_minor', str((self.py_version >> 8) & 0xff))\n        parser.preset('sysroot', self.sysroot)\n\n        if self.pyqt_package is None:\n            section = ''\n        else:\n            # At the moment we only need to distinguish between PyQt4 and\n            # PyQt5.  If that changes we may need a --target-pyqt-version\n            # command line option.\n            pyqt_version = 0x050000 if self.pyqt_package == 'PyQt5' else 0x040000\n\n            # Find the section corresponding to the version of PyQt.\n            section = None\n            latest_section = -1\n\n            for name in parser.sections():\n                parts = name.split()\n                if len(parts) != 2 or parts[0] != 'PyQt':\n                    continue\n\n                section_pyqt_version = version_from_string(parts[1])\n                if section_pyqt_version is None:\n                    continue\n\n                # Major versions must match.\n                if section_pyqt_version >> 16 != pyqt_version >> 16:\n                    continue\n\n                # It must be no later that the version of PyQt.\n                if section_pyqt_version > pyqt_version:\n                    continue\n\n                # Save it if it is the latest so far.\n                if section_pyqt_version > latest_section:\n                    section = name\n                    latest_section = section_pyqt_version\n\n            if section is None:\n                error(\n                        \"%s does not define a section that covers PyQt \"\n                        \"v%s.\" % (config_file, self.pyqt_version_str))\n\n        self.py_platform = parser.get(section, 'py_platform', self.py_platform)\n        self.py_inc_dir = parser.get(section, 'py_inc_dir', self.py_inc_dir)\n        self.py_pylib_dir = parser.get(section, 'py_pylib_dir',\n                self.py_pylib_dir)\n\n        self.sip_inc_dir = self.py_inc_dir\n\n        self.module_dir = parser.get(section, 'module_dir', self.module_dir)\n\n        if self.pyqt_package is not None:\n            self.py_sip_dir = parser.get(section, 'py_sip_dir',\n                    self.py_sip_dir)\n\n            # Construct the SIP flags.\n            flags = []\n\n            flags.append('-t')\n            flags.append(self._get_platform_tag())\n\n            qt_version = version_from_string(self.qt_version_str)\n            if qt_version is None:\n                error(\"Unable to determine the version of Qt.\")\n\n            if self.pyqt_package == 'PyQt5':\n                if qt_version < 0x050000:\n                    error(\"PyQt5 requires Qt v5.0 or later.\")\n\n                if qt_version > 0x060000:\n                    qt_version = 0x060000\n\n                backstop = 'Qt_6_0_0'\n            else:\n                if qt_version > 0x050000:\n                    qt_version = 0x050000\n\n                backstop = 'Qt_5_0_0'\n\n            major = (qt_version >> 16) & 0xff\n            minor = (qt_version >> 8) & 0xff\n            patch = qt_version & 0xff\n\n            flags.append('-t')\n            flags.append('Qt_%d_%d_%d' % (major, minor, patch))\n\n            flags.append('-B')\n            flags.append(backstop)\n\n            for feat in parser.getlist(section, 'pyqt_disabled_features', []):\n                flags.append('-x')\n                flags.append(feat)\n\n            self.pyqt_sip_flags = ' '.join(flags)\n\n    def _get_platform_tag(self):\n        \"\"\" Return the tag for the target platform. \"\"\"\n\n        # This replicates the logic in PyQt's configure scripts.\n        if self.py_platform == 'win32':\n            plattag = 'WS_WIN'\n        elif self.py_platform == 'darwin':\n            plattag = 'WS_MACX'\n        else:\n            plattag = 'WS_X11'\n\n        return plattag\n\n    def introspect_pyqt(self, module_config):\n        \"\"\" Introspect PyQt to determine the sip flags required.  module_config\n        is the module configuration.\n        \"\"\"\n\n        if self.pyqt_package == 'PyQt5':\n            try:\n                from PyQt5 import QtCore\n            except ImportError:\n                error(\n                        \"Unable to import PyQt5.QtCore. Make sure PyQt5 is \"\n                        \"installed.\")\n        else:\n            try:\n                from PyQt4 import QtCore\n            except ImportError:\n                error(\n                        \"Unable to import PyQt4.QtCore. Make sure PyQt4 is \"\n                        \"installed.\")\n\n        self.pyqt_version_str = QtCore.PYQT_VERSION_STR\n        self.qt_version_str = QtCore.qVersion()\n\n        # See if we have a PyQt that embeds its configuration.\n        try:\n            pyqt_config = QtCore.PYQT_CONFIGURATION\n        except AttributeError:\n            pyqt_config = None\n\n        if pyqt_config is None:\n            if module_config.legacy_configuration_script:\n                # Fallback to the old configuration script.\n                config_script = sys.argv[0].replace('configure', 'configure-old')\n                args = [sys.executable, config_script] + sys.argv[1:]\n\n                try:\n                    os.execv(sys.executable, args)\n                except OSError:\n                    pass\n\n                error(\"Unable to execute '%s'\" % config_script)\n\n            error(\"PyQt v4.10 or later is required.\")\n\n        self.pyqt_sip_flags = pyqt_config['sip_flags']\n\n    def apply_sysroot(self):\n        \"\"\" Apply sysroot where necessary. \"\"\"\n\n        if self.sysroot != '':\n            self.py_inc_dir = self._apply_sysroot(self.py_inc_dir)\n            self.py_pylib_dir = self._apply_sysroot(self.py_pylib_dir)\n            self.py_sip_dir = self._apply_sysroot(self.py_sip_dir)\n            self.module_dir = self._apply_sysroot(self.module_dir)\n            self.sip_inc_dir = self._apply_sysroot(self.sip_inc_dir)\n\n    def _apply_sysroot(self, dir_name):\n        \"\"\" Replace any leading sys.prefix of a directory name with sysroot.\n        \"\"\"\n\n        if dir_name.startswith(sys.prefix):\n            dir_name = self.sysroot + dir_name[len(sys.prefix):]\n\n        return dir_name\n\n    def get_qt_configuration(self, opts):\n        \"\"\" Get the Qt configuration that can be extracted from qmake.  opts\n        are the command line options.\n        \"\"\"\n\n        try:\n            qmake = opts.qmake\n        except AttributeError:\n            # Windows.\n            qmake = None\n\n        if qmake is not None:\n            self.qmake = qmake\n        elif self.qmake is None:\n            # Under Windows qmake and the Qt DLLs must be on the system PATH\n            # otherwise the dynamic linker won't be able to resolve the\n            # symbols.  On other systems we assume we can just run qmake by\n            # using its full pathname.\n            if sys.platform == 'win32':\n                error(\"Make sure you have a working Qt qmake on your PATH.\")\n            else:\n                error(\n                        \"Make sure you have a working Qt qmake on your PATH \"\n                        \"or use the --qmake argument to explicitly specify a \"\n                        \"working Qt qmake.\")\n\n        # Query qmake.\n        qt_config = _TargetQtConfiguration(self.qmake)\n\n        # The binary MacOS/X Qt installer defaults to XCode.  If this is what\n        # we might have then use macx-clang (Qt v5) or macx-g++ (Qt v4).\n        if sys.platform == 'darwin':\n            try:\n                # Qt v5.\n                if qt_config.QMAKE_SPEC == 'macx-xcode':\n                    # This will exist (and we can't check anyway).\n                    self.qmake_spec = 'macx-clang'\n                else:\n                    # No need to explicitly name the default.\n                    self.qmake_spec = ''\n            except AttributeError:\n                # Qt v4.\n                self.qmake_spec = 'macx-g++'\n\n        self.qt_version_str = getattr(qt_config, 'QT_VERSION', '')\n        self.api_dir = os.path.join(qt_config.QT_INSTALL_DATA, 'qsci')\n        self.qt_inc_dir = qt_config.QT_INSTALL_HEADERS\n        self.qt_lib_dir = qt_config.QT_INSTALL_LIBS\n\n        if self.sysroot == '':\n            self.sysroot = getattr(qt_config, 'QT_SYSROOT', '')\n\n    def apply_pre_options(self, opts):\n        \"\"\" Apply options from the command line that influence subsequent\n        configuration.  opts are the command line options.\n        \"\"\"\n\n        # Get the system root.\n        if opts.sysroot is not None:\n            self.sysroot = opts.sysroot\n\n        if self.pyqt_package is not None:\n            try:\n                self.pyqt_package = opts.pyqt_package\n            except AttributeError:\n                # Multiple PyQt versions are not supported.\n                pass\n\n            self.module_dir = os.path.join(self.py_module_dir,\n                    self.pyqt_package)\n\n    def apply_post_options(self, opts, module_config):\n        \"\"\" Apply options from the command line that override the previous\n        configuration.  opts are the command line options.  module_config is\n        the module configuration.\n        \"\"\"\n\n        if self.pyqt_package is not None:\n            if module_config.user_pyqt_sip_flags_is_supported:\n                if opts.pyqt_sip_flags is not None:\n                    self.pyqt_sip_flags = opts.pyqt_sip_flags\n\n            if opts.pyqt_sip_dir is not None:\n                self.pyqt_sip_dir = opts.pyqt_sip_dir\n            else:\n                self.pyqt_sip_dir = os.path.join(self.py_sip_dir,\n                        self.pyqt_package)\n\n        if module_config.qscintilla_api_file:\n            if opts.apidir is not None:\n                self.api_dir = opts.apidir\n\n            if opts.no_qsci_api:\n                self.api_dir = ''\n\n        if opts.destdir is not None:\n            self.module_dir = opts.destdir\n\n        if opts.qmakespec is not None:\n            self.qmake_spec = opts.qmakespec\n\n        if module_config.protected_is_public_is_supported:\n            if opts.prot_is_public is not None:\n                self.prot_is_public = opts.prot_is_public\n        else:\n            self.prot_is_public = False\n\n        if opts.sip_inc_dir is not None:\n            self.sip_inc_dir = opts.sip_inc_dir\n\n        if opts.sip is not None:\n            self.sip = opts.sip\n\n        module_config.apply_options(self, opts)\n\n    @staticmethod\n    def _find_exe(exe):\n        \"\"\" Find an executable, ie. the first on the path. \"\"\"\n\n        try:\n            path = os.environ['PATH']\n        except KeyError:\n            path = ''\n\n        if sys.platform == 'win32':\n            exe = exe + '.exe'\n\n        for d in path.split(os.pathsep):\n            exe_path = os.path.join(d, exe)\n\n            if os.access(exe_path, os.X_OK):\n                return exe_path\n\n        return None\n\n\ndef _create_optparser(target_config, module_config):\n    \"\"\" Create the parser for the command line.  target_config is the target\n    configuration containing default values.  module_config is the module\n    configuration.\n    \"\"\"\n\n    module_name = module_config.descriptive_name\n\n    p = optparse.OptionParser(usage=\"python %prog [options]\",\n            version=module_config.version)\n\n    p.add_option('--spec', dest='qmakespec', default=None, action='store',\n            metavar=\"SPEC\",\n            help=\"pass -spec SPEC to qmake [default: %s]\" % \"don't pass -spec\" if target_config.qmake_spec == '' else target_config.qmake_spec)\n\n    if module_config.qscintilla_api_file:\n        p.add_option('--apidir', '-a', dest='apidir', type='string',\n                default=None, action='callback',\n                callback=optparser_store_abspath, metavar=\"DIR\", \n                help=\"the QScintilla API file will be installed in DIR \"\n                        \"[default: QT_INSTALL_DATA/qsci]\")\n        p.add_option('--no-qsci-api', dest='no_qsci_api', default=False,\n                action='store_true',\n                help=\"disable the installation of the QScintilla API file \"\n                        \"[default: enabled]\")\n\n    if module_config.user_configuration_file_is_supported:\n        p.add_option('--configuration', dest='config_file', type='string',\n                default=None, action='callback',\n                callback=optparser_store_abspath, metavar=\"FILE\",\n                help=\"FILE defines the target configuration\")\n\n    p.add_option('--destdir', '-d', dest='destdir', type='string',\n            default=None, action='callback', callback=optparser_store_abspath,\n            metavar=\"DIR\",\n            help=\"install the %s module in DIR [default: %s]\" %\n                    (module_name, target_config.module_dir))\n\n    if module_config.protected_is_public_is_supported:\n        p.add_option('--protected-is-public', dest='prot_is_public',\n                default=None, action='store_true',\n                help=\"enable building with 'protected' redefined as 'public' \"\n                        \"[default: %s]\" % target_config.prot_is_public)\n        p.add_option('--protected-not-public', dest='prot_is_public',\n                action='store_false',\n                help=\"disable building with 'protected' redefined as 'public'\")\n\n    if target_config.pyqt_package is not None:\n        pyqt = target_config.pyqt_package\n\n        if module_config.pyqt5_is_supported and module_config.pyqt4_is_supported:\n            p.add_option('--pyqt', dest='pyqt_package', type='choice',\n                    choices=['PyQt4', 'PyQt5'], default=pyqt,\n                    action='store', metavar=\"PyQtn\",\n                    help=\"configure for PyQt4 or PyQt5 [default: %s]\" % pyqt)\n\n        if module_config.user_pyqt_sip_flags_is_supported:\n            p.add_option('--pyqt-sip-flags', dest='pyqt_sip_flags',\n                default=None, action='store', metavar=\"FLAGS\",\n                help=\"the sip flags used to build PyQt [default: query PyQt]\")\n\n    if sys.platform != 'win32':\n        p.add_option('--qmake', '-q', dest='qmake', type='string',\n                default=None, action='callback',\n                callback=optparser_store_abspath_exe, metavar=\"FILE\",\n                help=\"the pathname of qmake is FILE [default: \"\n                        \"%s]\" % (target_config.qmake or \"None\"))\n\n    p.add_option('--sip', dest='sip', type='string', default=None,\n            action='callback', callback=optparser_store_abspath_exe,\n            metavar=\"FILE\",\n            help=\"the pathname of sip is FILE [default: \"\n                    \"%s]\" % (target_config.sip or \"None\"))\n    p.add_option('--sip-incdir', dest='sip_inc_dir', type='string',\n            default=None, action='callback',\n            callback=optparser_store_abspath_dir, metavar=\"DIR\",\n            help=\"the directory containing the sip.h header file file is DIR \"\n                    \"[default: %s]\" % target_config.sip_inc_dir)\n\n    if target_config.pyqt_package is not None:\n        p.add_option('--pyqt-sipdir', dest='pyqt_sip_dir', type='string',\n                default=None, action='callback',\n                callback=optparser_store_abspath_dir, metavar=\"DIR\",\n                help=\"the directory containing the PyQt .sip files is DIR \"\n                        \"[default: %s]\" % target_config.pyqt_sip_dir)\n\n    p.add_option('--concatenate', '-c', dest='concat', default=False,\n            action='store_true', \n            help=\"concatenate the C++ source files\")\n    p.add_option('--concatenate-split', '-j', dest='split', type='int',\n            default=1, metavar=\"N\",\n            help=\"split the concatenated C++ source files into N pieces \"\n                    \"[default: 1]\")\n    p.add_option('--static', '-k', dest='static', default=False,\n            action='store_true',\n            help=\"build the %s module as a static library\" % module_name)\n    p.add_option(\"--sysroot\", dest='sysroot', type='string', action='callback',\n            callback=optparser_store_abspath_dir, metavar=\"DIR\",\n            help=\"DIR is the target system root directory\")\n    p.add_option('--no-docstrings', dest='no_docstrings', default=False,\n            action='store_true',\n            help=\"disable the generation of docstrings\")\n    p.add_option('--trace', '-r', dest='tracing', default=False,\n            action='store_true',\n            help=\"build the %s module with tracing enabled\" % module_name)\n    p.add_option('--debug', '-u', default=False, action='store_true',\n            help=\"build the %s module with debugging symbols\" % module_name)\n    p.add_option('--verbose', '-w', dest='verbose', default=False,\n            action='store_true',\n            help=\"enable verbose output during configuration\")\n    p.add_option('--no-timestamp', '-T', dest='no_timestamp', default=False,\n            action='store_true',\n            help=\"suppress timestamps in the header comments of generated \"\n                    \"code [default: include timestamps]\")\n\n    module_config.init_optparser(p, target_config)\n\n    return p\n\n\ndef _inform_user(target_config, module_config):\n    \"\"\" Tell the user the values that are going to be used.  target_config is\n    the target configuration.  module_config is the module configuration.\n    \"\"\"\n\n    module_name = module_config.descriptive_name\n\n    inform(\"Configuring %s %s...\" % (module_name, module_config.version))\n\n    module_config.inform_user(target_config)\n\n    inform(\"The %s module will be installed in %s.\" %\n            (module_name, target_config.module_dir))\n\n    if target_config.pyqt_version_str != '':\n        inform(\"PyQt %s is being used.\" % target_config.pyqt_version_str)\n    else:\n        inform(\"%s is being used.\" % target_config.pyqt_package)\n\n    if target_config.qt_version_str != '':\n        inform(\"Qt %s is being used.\" % target_config.qt_version_str)\n\n    if target_config.sysroot != '':\n        inform(\"The system root directory is %s.\" % target_config.sysroot)\n\n    inform(\"sip %s is being used.\" % target_config.sip_version)\n    inform(\"The sip executable is %s.\" % target_config.sip)\n\n    if target_config.prot_is_public:\n        inform(\n                \"The %s module is being built with 'protected' redefined as \"\n                \"'public'.\" % module_name)\n\n    if module_config.qscintilla_api_file and target_config.api_dir != '':\n        inform(\"The QScintilla API file will be installed in %s.\" %\n                os.path.join(target_config.api_dir, 'api', 'python'))\n\n\ndef _generate_code(target_config, opts, module_config):\n    \"\"\" Generate the code for the QScintilla module.  target_config is the\n    target configuration.  opts are the command line options.  module_config is\n    the module configuration.\n    \"\"\"\n\n    inform(\n            \"Generating the C++ source for the %s module...\" %\n                    module_config.name)\n\n    # Build the SIP command line.\n    argv = [quote(target_config.sip)]\n\n    # Add the module-specific flags.\n    argv.extend(module_config.get_sip_flags(target_config))\n\n    if target_config.pyqt_package is not None:\n        # Get the flags used for the main PyQt module.\n        argv.extend(target_config.pyqt_sip_flags.split())\n\n        # Add PyQt's .sip files to the search path.\n        argv.append('-I')\n        argv.append(target_config.pyqt_sip_dir)\n\n    if module_config.qscintilla_api_file and target_config.api_dir != '':\n        # Generate the API file.\n        argv.append('-a')\n        argv.append(module_config.qscintilla_api_file + '.api')\n\n    if target_config.prot_is_public:\n        argv.append('-P');\n\n    if opts.no_timestamp:\n        argv.append('-T')\n\n    if not opts.no_docstrings:\n        argv.append('-o');\n\n    if opts.concat:\n        argv.append('-j')\n        argv.append(str(opts.split))\n\n    if opts.tracing:\n        argv.append('-r')\n\n    argv.append('-c')\n    argv.append('.')\n\n    argv.append(module_config.get_sip_file(target_config))\n\n    check_file = 'sipAPI%s.h' % module_config.name\n    _remove_file(check_file)\n\n    _run_command(' '.join(argv), opts.verbose)\n\n    if not os.access(check_file, os.F_OK):\n        error(\"Unable to create the C++ code.\")\n\n    # Generate the .pro file.\n    pro = _generate_pro(target_config, opts, module_config)\n\n    # Generate the Makefile.\n    _run_qmake(target_config, opts.verbose, pro, module_config)\n\n\ndef _get_qt_qmake_config(qmake_config, qt_version):\n    \"\"\" Return a dict of qmake configuration values for a specific Qt version.\n    \"\"\"\n\n    qt_qmake_config = {}\n\n    for name, value in qmake_config.items():\n        name_parts = name.split(':')\n        if len(name_parts) == 2 and name_parts[0] == qt_version:\n            qt_qmake_config[name_parts[1]] = value\n\n    return qt_qmake_config\n\n\ndef _write_qt_qmake_config(qt_qmake_config, pro):\n    \"\"\" Write the qmake configuration values to a .pro file. \"\"\"\n\n    for name in ('QT', 'CONFIG', 'DEFINES', 'INCLUDEPATH', 'LIBS'):\n        value = qt_qmake_config.get(name)\n        if value:\n            pro.write('    %s += %s\\n' % (name, value))\n\n\ndef _generate_pro(target_config, opts, module_config):\n    \"\"\" Generate the .pro file for the module and return its name.\n    target_config is the target configuration.  opts are the command line\n    options.  module_config is the module configuration.\n    \"\"\"\n\n    inform(\"Generating the .pro file for the %s module...\" % module_config.name)\n\n    # Without the 'no_check_exist' magic the target.files must exist when qmake\n    # is run otherwise the install and uninstall targets are not generated.\n\n    qmake_config = module_config.get_qmake_configuration(target_config)\n\n    pro_name = module_config.name + '.pro'\n\n    pro = open(pro_name, 'w')\n\n    pro.write('TEMPLATE = lib\\n')\n\n    qt = qmake_config.get('QT')\n    if qt:\n        pro.write('QT += %s\\n' % qt)\n\n    pro.write('CONFIG += %s\\n' % ('debug' if opts.debug else 'release'))\n    pro.write('CONFIG += %s\\n' % ('staticlib' if opts.static else 'plugin'))\n\n    config = qmake_config.get('CONFIG')\n    if config:\n        pro.write('CONFIG += %s\\n' % config)\n\n    # Work around QTBUG-39300.\n    pro.write('CONFIG -= android_install\\n')\n\n    qt5_qmake_config = _get_qt_qmake_config(qmake_config, 'Qt5')\n    qt4_qmake_config = _get_qt_qmake_config(qmake_config, 'Qt4')\n\n    if qt5_qmake_config or qt4_qmake_config:\n        pro.write('''\ngreaterThan(QT_MAJOR_VERSION, 4) {\n''')\n\n        if qt5_qmake_config:\n            _write_qt_qmake_config(qt5_qmake_config, pro)\n\n        if qt4_qmake_config:\n            pro.write('} else {\\n')\n            _write_qt_qmake_config(qt4_qmake_config, pro)\n\n        pro.write('}\\n')\n\n    mname = module_config.name\n\n    if not opts.static:\n        pro.write('''\nwin32 {\n    PY_MODULE = %s.pyd\n    target.files = %s.pyd\n    LIBS += -L%s\n} else {\n    PY_MODULE = %s.so\n    target.files = %s.so\n}\n\ntarget.CONFIG = no_check_exist\n''' % (mname, mname, quote(target_config.py_pylib_dir), mname, mname))\n\n    pro.write('''\ntarget.path = %s\nINSTALLS += target\n''' % quote(target_config.module_dir))\n\n    if module_config.qscintilla_api_file and target_config.api_dir != '':\n        pro.write('''\napi.path = %s/api/python\napi.files = %s.api\nINSTALLS += api\n''' % (target_config.api_dir, module_config.qscintilla_api_file))\n\n    sip_installs = module_config.get_sip_installs(target_config)\n    if sip_installs is not None:\n        path, files = sip_installs\n\n        pro.write('''\nsip.path = %s\nsip.files =''' % quote(path))\n\n        for f in files:\n            pro.write(' \\\\\\n    %s' % f)\n\n        pro.write('''\nINSTALLS += sip\n''')\n\n    pro.write('\\n')\n\n    # These optimisations could apply to other platforms.\n    if module_config.no_exceptions:\n        if target_config.py_platform.startswith('linux') or target_config.py_platform == 'darwin':\n            pro.write('QMAKE_CXXFLAGS += -fno-exceptions\\n')\n\n    if target_config.py_platform.startswith('linux') and not opts.static:\n        if target_config.py_version >= 0x030000:\n            entry_point = 'PyInit_%s' % mname\n        else:\n            entry_point = 'init%s' % mname\n\n        exp = open('%s.exp' % mname, 'wt')\n        exp.write('{ global: %s; local: *; };' % entry_point)\n        exp.close()\n\n        pro.write('QMAKE_LFLAGS += -Wl,--version-script=%s.exp\\n' % mname)\n\n    if target_config.prot_is_public:\n        pro.write('DEFINES += SIP_PROTECTED_IS_PUBLIC protected=public\\n')\n\n    defines = qmake_config.get('DEFINES')\n    if defines:\n        pro.write('DEFINES += %s\\n' % defines)\n\n    includepath = qmake_config.get('INCLUDEPATH')\n    if includepath:\n        pro.write('INCLUDEPATH += %s\\n' % includepath)\n\n    # Make sure the SIP include directory is searched before the Python include\n    # directory if they are different.\n    pro.write('INCLUDEPATH += %s\\n' % quote(target_config.sip_inc_dir))\n    if target_config.py_inc_dir != target_config.sip_inc_dir:\n        pro.write('INCLUDEPATH += %s\\n' % quote(target_config.py_inc_dir))\n\n    libs = qmake_config.get('LIBS')\n    if libs:\n        pro.write('LIBS += %s\\n' % libs)\n\n    if not opts.static:\n        pro.write('''\nwin32 {\n    QMAKE_POST_LINK = $(COPY_FILE) $(DESTDIR_TARGET) $$PY_MODULE\n} else {\n    QMAKE_POST_LINK = $(COPY_FILE) $(TARGET) $$PY_MODULE\n}\n\nmacx {\n    QMAKE_LFLAGS += \"-undefined dynamic_lookup\"\n    greaterThan(QT_MAJOR_VERSION, 4) {\n        QMAKE_LFLAGS += \"-install_name $$absolute_path($$PY_MODULE, $$target.path)\"\n    }\n''')\n\n        dylib = module_config.get_mac_wrapped_library_file(target_config)\n\n        if dylib:\n            pro.write('''\n    QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\\\\\\\n\\\\\\\\t)$$quote(install_name_tool -change %s %s $$PY_MODULE)\n''' % (os.path.basename(dylib), dylib))\n\n        pro.write('}\\n')\n\n    pro.write('\\n')\n    pro.write('TARGET = %s\\n' % mname)\n    pro.write('HEADERS = sipAPI%s.h\\n' % mname)\n\n    pro.write('SOURCES =')\n    for s in glob.glob('*.cpp'):\n        pro.write(' \\\\\\n    %s' % s)\n    pro.write('\\n')\n\n    pro.close()\n\n    return pro_name\n\n\ndef _run_qmake(target_config, verbose, pro_name, module_config):\n    \"\"\" Run qmake against a .pro file.  target_config is the target\n    configuration.  verbose is set if the output is to be displayed.  pro_name\n    is the name of the .pro file.  module_config is the module configuration.\n    \"\"\"\n\n    inform(\"Creating the Makefile for the %s module...\" % module_config.name)\n\n    # qmake doesn't behave consistently if it is not run from the directory\n    # containing the .pro file - so make sure it is.\n    pro_dir, pro_file = os.path.split(pro_name)\n    if pro_dir != '':\n        cwd = os.getcwd()\n        os.chdir(pro_dir)\n    else:\n        cwd = None\n\n    mf = 'Makefile'\n\n    _remove_file(mf)\n\n    args = [quote(target_config.qmake)]\n\n    if target_config.qmake_spec != '':\n        args.append('-spec')\n        args.append(target_config.qmake_spec)\n\n    args.append(pro_file)\n\n    _run_command(' '.join(args), verbose)\n\n    if not os.access(mf, os.F_OK):\n        error(\n                \"%s failed to create a Makefile from %s.\" %\n                        (target_config.qmake, pro_name))\n\n    # Restore the current directory.\n    if cwd is not None:\n        os.chdir(cwd)\n\n\ndef _run_command(cmd, verbose):\n    \"\"\" Run a command and display the output if requested.  cmd is the command\n    to run.  verbose is set if the output is to be displayed.\n    \"\"\"\n\n    if verbose:\n        sys.stdout.write(cmd + \"\\n\")\n\n    fout = _get_command_output(cmd)\n\n    # Read stdout and stderr until there is no more output.\n    lout = fout.readline()\n    while lout:\n        if verbose:\n            if sys.hexversion >= 0x03000000:\n                sys.stdout.write(str(lout, encoding=sys.stdout.encoding))\n            else:\n                sys.stdout.write(lout)\n\n        lout = fout.readline()\n\n    fout.close()\n\n    try:\n        os.wait()\n    except:\n        pass\n\n\ndef _get_command_output(cmd):\n    \"\"\" Return a pipe from which a command's output can be read.  cmd is the\n    command.\n    \"\"\"\n\n    try:\n        import subprocess\n    except ImportError:\n        _, sout = os.popen4(cmd)\n\n        return sout\n\n    p = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE,\n            stdout=subprocess.PIPE, stderr=subprocess.STDOUT)\n\n    return p.stdout\n\n\ndef _remove_file(fname):\n    \"\"\" Remove a file which may or may not exist.  fname is the name of the\n    file.\n    \"\"\"\n\n    try:\n        os.remove(fname)\n    except OSError:\n        pass\n\n\ndef _check_sip(target_config, module_config):\n    \"\"\" Check that the version of sip is good enough.  target_config is the\n    target configuration.  module_config is the module configuration.\n    \"\"\"\n\n    if target_config.sip is None:\n        error(\n                \"Make sure you have a working sip on your PATH or use the \"\n                \"--sip argument to explicitly specify a working sip.\")\n\n    pipe = os.popen(' '.join([target_config.sip, '-V']))\n\n    for l in pipe:\n        version_str = l.strip()\n        break\n    else:\n        error(\"'%s -V' did not generate any output.\" % target_config.sip)\n\n    pipe.close()\n\n    if 'snapshot' not in version_str and 'preview' not in version_str:\n        version = version_from_string(version_str)\n        if version is None:\n            error(\n                    \"'%s -V' generated unexpected output: '%s'.\" % (\n                            target_config.sip, version_str))\n\n        min_sip_version = module_config.minimum_sip_version\n        if min_sip_version:\n            min_version = version_from_string(min_sip_version)\n            if version < min_version:\n                error(\n                        \"This version of %s requires sip %s or later.\" %\n                                (module_config.descriptive_name,\n                                        min_sip_version))\n\n    target_config.sip_version = version_str\n\n\ndef _main(argv, module_config):\n    \"\"\" Create the configuration module module.  argv is the list of command\n    line arguments.  module_config is the module configuration.\n    \"\"\"\n\n    # Create the default target configuration.\n    target_config = _TargetConfiguration(module_config)\n\n    # Parse the command line.\n    p = _create_optparser(target_config, module_config)\n    opts, args = p.parse_args()\n\n    if args:\n        p.print_help()\n        sys.exit(2)\n\n    target_config.apply_pre_options(opts)\n\n    # Query qmake for the basic configuration information.\n    target_config.get_qt_configuration(opts)\n\n    # Update the target configuration.\n    if module_config.user_configuration_file_is_supported:\n        config_file = opts.config_file\n    else:\n        config_file = None\n\n    if config_file is not None:\n        target_config.update_from_configuration_file(config_file)\n    else:\n        target_config.apply_sysroot()\n\n    target_config.apply_post_options(opts, module_config)\n\n    if target_config.pyqt_package is not None:\n        if target_config.pyqt_sip_flags is None:\n            target_config.introspect_pyqt(module_config)\n\n    # Check SIP is new enough.\n    _check_sip(target_config, module_config)\n\n    # Perform any module specific checks now that all other information has\n    # been captured.\n    module_config.check_module(target_config)\n\n    # Tell the user what's been found.\n    _inform_user(target_config, module_config)\n\n    # Allow for module specific hacks.\n    module_config.pre_code_generation(target_config)\n\n    # Generate the code.\n    _generate_code(target_config, opts, module_config)\n\n\n###############################################################################\n# The script starts here.\n###############################################################################\n\nif __name__ == '__main__':\n    module_config = ModuleConfiguration()\n\n    try:\n        _main(sys.argv, module_config)\n    except SystemExit:\n        raise\n    except:\n        if module_config.support_email_address:\n            sys.stderr.write(\n\"\"\"An internal error occured.  Please report all the output from the program,\nincluding the following traceback, to %s.\n\"\"\" % module_config.support_email_address)\n\n        raise\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qsciabstractapis.sip",
    "content": "// This is the SIP interface definition for QsciAbstractAPIs.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciAbstractAPIs : QObject\n{\n%TypeHeaderCode\n#include <Qsci/qsciabstractapis.h>\n%End\n\npublic:\n%If (Qsci_Qt4)\n    QsciAbstractAPIs(QsciLexer *lexer /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciAbstractAPIs(QsciLexer *lexer /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciAbstractAPIs();\n\n    QsciLexer *lexer() const;\n\n    virtual void updateAutoCompletionList(const QStringList &context,\n            QStringList &list) = 0;\n    virtual void autoCompletionSelected(const QString &selection);\n\n%If (Qsci_Qt4)\n    virtual QStringList callTips(const QStringList &context, int commas,\n            QsciScintilla::CallTipsStyle style, QList<int> &shifts) = 0;\n%End\n%If (!Qsci_Qt4)\n    virtual QStringList callTips(const QStringList &context, int commas,\n            QsciScintilla::CallTipsStyle style, QValueList<int> &shifts) = 0;\n%End\n\nprivate:\n    QsciAbstractAPIs(const QsciAbstractAPIs &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qsciapis.sip",
    "content": "// This is the SIP interface definition for QsciAPIs.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciAPIs : QsciAbstractAPIs\n{\n%TypeHeaderCode\n#include <Qsci/qsciapis.h>\n%End\n\npublic:\n%If (Qsci_Qt4)\n    QsciAPIs(QsciLexer *lexer /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciAPIs(QsciLexer *lexer /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciAPIs();\n\n    void add(const QString &entry);\n    void clear();\n    bool load(const QString &fname);\n    void remove(const QString &entry);\n    void prepare();\n    void cancelPreparation();\n    QString defaultPreparedName() const;\n    bool isPrepared(const QString &filename = QString()) const;\n    bool loadPrepared(const QString &filename = QString());\n    bool savePrepared(const QString &filename = QString()) const;\n    virtual bool event(QEvent *e);\n    QStringList installedAPIFiles() const;\n\n    virtual void updateAutoCompletionList(const QStringList &context,\n                QStringList &list);\n    virtual void autoCompletionSelected(const QString &selection);\n\n%If (Qsci_Qt4)\n    virtual QStringList callTips(const QStringList &context, int commas,\n            QsciScintilla::CallTipsStyle style, QList<int> &shifts);\n%End\n%If (!Qsci_Qt4)\n    virtual QStringList callTips(const QStringList &context, int commas,\n            QsciScintilla::CallTipsStyle style, QValueList<int> &shifts);\n%End\n\nsignals:\n    void apiPreparationCancelled();\n    void apiPreparationStarted();\n    void apiPreparationFinished();\n\nprivate:\n    QsciAPIs(const QsciAPIs &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscicommand.sip",
    "content": "// This is the SIP interface definition for QsciCommand.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciCommand\n{\n%TypeHeaderCode\n#include <Qsci/qscicommand.h>\n%End\n\npublic:\n    enum Command {\n        LineDown,\n        LineDownExtend,\n        LineDownRectExtend,\n        LineScrollDown,\n        LineUp,\n        LineUpExtend,\n        LineUpRectExtend,\n        LineScrollUp,\n        ScrollToStart,\n        ScrollToEnd,\n        VerticalCentreCaret,\n        ParaDown,\n        ParaDownExtend,\n        ParaUp,\n        ParaUpExtend,\n        CharLeft,\n        CharLeftExtend,\n        CharLeftRectExtend,\n        CharRight,\n        CharRightExtend,\n        CharRightRectExtend,\n        WordLeft,\n        WordLeftExtend,\n        WordRight,\n        WordRightExtend,\n        WordLeftEnd,\n        WordLeftEndExtend,\n        WordRightEnd,\n        WordRightEndExtend,\n        WordPartLeft,\n        WordPartLeftExtend,\n        WordPartRight,\n        WordPartRightExtend,\n        Home,\n        HomeExtend,\n        HomeRectExtend,\n        HomeDisplay,\n        HomeDisplayExtend,\n        HomeWrap,\n        HomeWrapExtend,\n        VCHome,\n        VCHomeExtend,\n        VCHomeRectExtend,\n        VCHomeWrap,\n        VCHomeWrapExtend,\n        LineEnd,\n        LineEndExtend,\n        LineEndRectExtend,\n        LineEndDisplay,\n        LineEndDisplayExtend,\n        LineEndWrap,\n        LineEndWrapExtend,\n        DocumentStart,\n        DocumentStartExtend,\n        DocumentEnd,\n        DocumentEndExtend,\n        PageUp,\n        PageUpExtend,\n        PageUpRectExtend,\n        PageDown,\n        PageDownExtend,\n        PageDownRectExtend,\n        StutteredPageUp,\n        StutteredPageUpExtend,\n        StutteredPageDown,\n        StutteredPageDownExtend,\n        Delete,\n        DeleteBack,\n        DeleteBackNotLine,\n        DeleteWordLeft,\n        DeleteWordRight,\n        DeleteWordRightEnd,\n        DeleteLineLeft,\n        DeleteLineRight,\n        LineDelete,\n        LineCut,\n        LineCopy,\n        LineTranspose,\n        LineDuplicate,\n        SelectAll,\n        MoveSelectedLinesUp,\n        MoveSelectedLinesDown,\n        SelectionDuplicate,\n        SelectionLowerCase,\n        SelectionUpperCase,\n        SelectionCut,\n        SelectionCopy,\n        Paste,\n        EditToggleOvertype,\n        Newline,\n        Formfeed,\n        Tab,\n        Backtab,\n        Cancel,\n        Undo,\n        Redo,\n        ZoomIn,\n        ZoomOut,\n    };\n\n    Command command() const;\n    void execute();\n    void setKey(int key);\n    void setAlternateKey(int altkey);\n    int key() const;\n    int alternateKey() const;\n    static bool validKey(int key);\n    QString description() const;\n\nprivate:\n    QsciCommand(QsciScintilla *qs, Command cmd, int key, int altkey,\n            const char *desc);\n    QsciCommand(const QsciCommand &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscicommandset.sip",
    "content": "// This is the SIP interface definition for the QsciCommandSet.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciCommandSet\n{\n%TypeHeaderCode\n#include <Qsci/qscicommandset.h>\n%End\n\npublic:\n    bool readSettings(QSettings &qs, const char *prefix = \"/Scintilla\");\n    bool writeSettings(QSettings &qs, const char *prefix = \"/Scintilla\");\n\n%If (Qsci_Qt4)\n    QList<QsciCommand *> &commands();\n%End\n%If (!Qsci_Qt4)\n    QPtrList<QsciCommand> &commands();\n%End\n\n    void clearKeys();\n    void clearAlternateKeys();\n\n    QsciCommand *boundTo(int key) const;\n    QsciCommand *find(QsciCommand::Command command) const;\n\nprivate:\n    QsciCommandSet(QsciScintilla *qs);\n    ~QsciCommandSet();\n\n    QsciCommandSet(const QsciCommandSet &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscidocument.sip",
    "content": "// This is the SIP interface definition for QsciDocument.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciDocument\n{\n%TypeHeaderCode\n#include <Qsci/qscidocument.h>\n%End\n\npublic:\n    QsciDocument();\n    virtual ~QsciDocument();\n\n    QsciDocument(const QsciDocument &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexer.sip",
    "content": "// This is the SIP interface definition for QsciLexer.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexer : QObject\n{\n%TypeHeaderCode\n#include <Qsci/qscilexer.h>\n%End\n\npublic:\n%If (Qsci_Qt4)\n    QsciLexer(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexer(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexer();\n\n    virtual const char *language() const = 0;\n    virtual const char *lexer() const;\n    virtual int lexerId() const;\n    QsciAbstractAPIs *apis() const;\n    int autoIndentStyle();\n    virtual QColor color(int style) const;\n    virtual bool eolFill(int style) const;\n    virtual QFont font(int style) const;\n    virtual const char *keywords(int set) const;\n    virtual QString description(int style) const = 0;\n    virtual QColor paper(int style) const;\n    QColor defaultColor() const;\n    virtual QColor defaultColor(int style) const;\n    virtual bool defaultEolFill(int style) const;\n    QFont defaultFont() const;\n    virtual QFont defaultFont(int style) const;\n    QColor defaultPaper() const;\n    virtual QColor defaultPaper(int style) const;\n    QsciScintilla *editor() const;\n    virtual void refreshProperties();\n    void setAPIs(QsciAbstractAPIs *apis);\n    void setDefaultColor(const QColor &c);\n    void setDefaultFont(const QFont &f);\n    void setDefaultPaper(const QColor &c);\n    virtual int styleBitsNeeded() const;\n    virtual const char *wordCharacters() const;\n    bool readSettings(QSettings &qs, const char *prefix = \"/Scintilla\");\n    bool writeSettings(QSettings &qs, const char *prefix = \"/Scintilla\") const;\n\npublic slots:\n    virtual void setAutoIndentStyle(int autoindentstyle);\n    virtual void setColor(const QColor &c, int style = -1);\n    virtual void setEolFill(bool eolfill, int style = -1);\n    virtual void setFont(const QFont &f, int style = -1);\n    virtual void setPaper(const QColor &c, int style = -1);\n\nsignals:\n    void colorChanged(const QColor &c, int style);\n    void eolFillChanged(bool eolfilled, int style);\n    void fontChanged(const QFont &f, int style);\n    void paperChanged(const QColor &c, int style);\n    void propertyChanged(const char *prop, const char *val);\n\nprotected:\n    virtual bool readProperties(QSettings &qs, const QString &prefix);\n    virtual bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexer(const QsciLexer &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexeravs.sip",
    "content": "// This is the SIP interface definition for QsciLexerAVS.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerAVS : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexeravs.h>\n%End\n\npublic:\n    enum {\n        Default,\n        BlockComment,\n        NestedBlockComment,\n        LineComment,\n        Number,\n        Operator,\n        Identifier,\n        String,\n        TripleString,\n        Keyword,\n        Filter,\n        Plugin,\n        Function,\n        ClipProperty,\n        KeywordSet6\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerAVS(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerAVS(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerAVS();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    QFont defaultFont(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n    const char *wordCharacters() const;\n\n    void refreshProperties();\n    bool foldComments() const;\n    bool foldCompact() const;\n\npublic slots:\n    virtual void setFoldComments(bool fold);\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerAVS(const QsciLexerAVS &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerbash.sip",
    "content": "// This is the SIP interface definition for QsciLexerBash.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerBash : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerbash.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Error,\n        Comment,\n        Number,\n        Keyword,\n        DoubleQuotedString,\n        SingleQuotedString,\n        Operator,\n        Identifier,\n        Scalar,\n        ParameterExpansion,\n        Backticks,\n        HereDocumentDelimiter,\n        SingleQuotedHereDocument\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerBash(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerBash(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerBash();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n    const char *wordCharacters() const;\n\n    void refreshProperties();\n    bool foldComments() const;\n    bool foldCompact() const;\n\npublic slots:\n    virtual void setFoldComments(bool fold);\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerBash(const QsciLexerBash &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerbatch.sip",
    "content": "// This is the SIP interface definition for QsciLexerBatch.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerBatch : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerbatch.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        Keyword,\n        Label,\n        HideCommandChar,\n        ExternalCommand,\n        Variable,\n        Operator\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerBatch(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerBatch(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerBatch();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n    const char *wordCharacters() const;\n\nprivate:\n    QsciLexerBatch(const QsciLexerBatch &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexercmake.sip",
    "content": "// This is the SIP interface definition for QsciLexerCMake.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerCMake : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexercmake.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        String,\n        StringLeftQuote,\n        StringRightQuote,\n        Function,\n        Variable,\n        Label,\n        KeywordSet3,\n        BlockWhile,\n        BlockForeach,\n        BlockIf,\n        BlockMacro,\n        StringVariable,\n        Number\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerCMake(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerCMake(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerCMake();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n\n    void refreshProperties();\n    bool foldAtElse() const;\n\npublic slots:\n    virtual void setFoldAtElse(bool fold);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerCMake(const QsciLexerCMake &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexercoffeescript.sip",
    "content": "// This is the SIP interface definition for QsciLexerCoffeeScript.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerCoffeeScript : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexercoffeescript.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        CommentLine,\n        CommentDoc,\n        Number,\n        Keyword,\n        DoubleQuotedString,\n        SingleQuotedString,\n        UUID,\n        PreProcessor,\n        Operator,\n        Identifier,\n        UnclosedString,\n        VerbatimString,\n        Regex,\n        CommentLineDoc,\n        KeywordSet2,\n        CommentDocKeyword,\n        CommentDocKeywordError,\n        GlobalClass,\n        CommentBlock,\n        BlockRegex,\n        BlockRegexComment,\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerCoffeeScript(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerCoffeeScript(QObject *parent /TransferThis/ = 0,\n            const char *name = 0);\n%End\n\n    virtual ~QsciLexerCoffeeScript();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n    const char *wordCharacters() const;\n\n    void refreshProperties();\n    bool dollarsAllowed() const;\n    void setDollarsAllowed(bool allowed);\n    bool foldComments() const;\n    void setFoldComments(bool fold);\n    bool foldCompact() const;\n    void setFoldCompact(bool fold);\n    bool stylePreprocessor() const;\n    void setStylePreprocessor(bool style);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerCoffeeScript(const QsciLexerCoffeeScript &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexercpp.sip",
    "content": "// This is the SIP interface definition for QsciLexerCPP.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerCPP : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexercpp.h>\n%End\n\npublic:\n    enum {\n        Default,\n        InactiveDefault,\n        Comment,\n        InactiveComment,\n        CommentLine,\n        InactiveCommentLine,\n        CommentDoc,\n        InactiveCommentDoc,\n        Number,\n        InactiveNumber,\n        Keyword,\n        InactiveKeyword,\n        DoubleQuotedString,\n        InactiveDoubleQuotedString,\n        SingleQuotedString,\n        InactiveSingleQuotedString,\n        UUID,\n        InactiveUUID,\n        PreProcessor,\n        InactivePreProcessor,\n        Operator,\n        InactiveOperator,\n        Identifier,\n        InactiveIdentifier,\n        UnclosedString,\n        InactiveUnclosedString,\n        VerbatimString,\n        InactiveVerbatimString,\n        Regex,\n        InactiveRegex,\n        CommentLineDoc,\n        InactiveCommentLineDoc,\n        KeywordSet2,\n        InactiveKeywordSet2,\n        CommentDocKeyword,\n        InactiveCommentDocKeyword,\n        CommentDocKeywordError,\n        InactiveCommentDocKeywordError,\n        GlobalClass,\n        InactiveGlobalClass,\n        RawString,\n        InactiveRawString,\n        TripleQuotedVerbatimString,\n        InactiveTripleQuotedVerbatimString,\n        HashQuotedString,\n        InactiveHashQuotedString,\n        PreProcessorComment,\n        InactivePreProcessorComment,\n        PreProcessorCommentLineDoc,\n        InactivePreProcessorCommentLineDoc,\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerCPP(QObject *parent /TransferThis/ = 0,\n            bool caseInsensitiveKeywords = false);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerCPP(QObject *parent /TransferThis/ = 0, const char *name = 0,\n            bool caseInsensitiveKeywords = false);\n%End\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n    const char *wordCharacters() const;\n\n    void refreshProperties();\n    bool foldAtElse() const;\n    bool foldComments() const;\n    bool foldCompact() const;\n    bool foldPreprocessor() const;\n    bool stylePreprocessor() const;\n    void setDollarsAllowed(bool allowed);\n    bool dollarsAllowed() const;\n    void setHighlightTripleQuotedStrings(bool enable);\n    bool highlightTripleQuotedStrings() const;\n    void setHighlightHashQuotedStrings(bool enable);\n    bool highlightHashQuotedStrings() const;\n\npublic slots:\n    virtual void setFoldAtElse(bool fold);\n    virtual void setFoldComments(bool fold);\n    virtual void setFoldCompact(bool fold);\n    virtual void setFoldPreprocessor(bool fold);\n    virtual void setStylePreprocessor(bool style);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerCPP(const QsciLexerCPP &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexercsharp.sip",
    "content": "// This is the SIP interface definition for QsciLexerCSharp.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerCSharp : QsciLexerCPP\n{\n%TypeHeaderCode\n#include <Qsci/qscilexercsharp.h>\n%End\n\npublic:\n%If (Qsci_Qt4)\n    QsciLexerCSharp(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerCSharp(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerCSharp();\n\n    const char *language() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n\nprivate:\n    QsciLexerCSharp(const QsciLexerCSharp &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexercss.sip",
    "content": "// This is the SIP interface definition for QsciLexerCSS.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerCSS : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexercss.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Tag,\n        ClassSelector,\n        PseudoClass,\n        UnknownPseudoClass,\n        Operator,\n        CSS1Property,\n        UnknownProperty,\n        Value,\n        Comment,\n        IDSelector,\n        Important,\n        AtRule,\n        DoubleQuotedString,\n        SingleQuotedString,\n        CSS2Property,\n        Attribute,\n        CSS3Property,\n        PseudoElement,\n        ExtendedCSSProperty,\n        ExtendedPseudoClass,\n        ExtendedPseudoElement,\n        MediaRule,\n        Variable,\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerCSS(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerCSS(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerCSS();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    QFont defaultFont(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n    const char *wordCharacters() const;\n\n    void refreshProperties();\n    bool foldComments() const;\n    bool foldCompact() const;\n    void setHSSLanguage(bool enable);\n    bool HSSLanguage() const;\n    void setLessLanguage(bool enable);\n    bool LessLanguage() const;\n    void setSCSSLanguage(bool enable);\n    bool SCSSLanguage() const;\n\npublic slots:\n    virtual void setFoldComments(bool fold);\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerCSS(const QsciLexerCSS &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexercustom.sip",
    "content": "// This is the SIP interface definition for QsciLexerCustom.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerCustom : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexercustom.h>\n%End\n\npublic:\n%If (Qsci_Qt4)\n    QsciLexerCustom(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerCustom(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerCustom();\n\n    virtual void setEditor(QsciScintilla *editor);\n    virtual int styleBitsNeeded() const;\n\n    void setStyling(int length, int style);\n    void setStyling(int length, const QsciStyle &style);\n\n    void startStyling(int pos, int styleBits = 0);\n    virtual void styleText(int start, int end) = 0;\n\nprivate:\n    QsciLexerCustom(const QsciLexerCustom &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerd.sip",
    "content": "// This is the SIP interface definition for QsciLexerD.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerD : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerd.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        CommentLine,\n        CommentDoc,\n        CommentNested,\n        Number,\n        Keyword,\n        KeywordSecondary,\n        KeywordDoc,\n        Typedefs,\n        String,\n        UnclosedString,\n        Character,\n        Operator,\n        Identifier,\n        CommentLineDoc,\n        CommentDocKeyword,\n        CommentDocKeywordError,\n        BackquoteString,\n        RawString,\n        KeywordSet5,\n        KeywordSet6,\n        KeywordSet7,\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerD(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerD(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n    const char *wordCharacters() const;\n\n    void refreshProperties();\n    bool foldAtElse() const;\n    bool foldComments() const;\n    bool foldCompact() const;\n\npublic slots:\n    virtual void setFoldAtElse(bool fold);\n    virtual void setFoldComments(bool fold);\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerD(const QsciLexerD &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerdiff.sip",
    "content": "// This is the SIP interface definition for QsciLexerDiff.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerDiff : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerdiff.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        Command,\n        Header,\n        Position,\n        LineRemoved,\n        LineAdded,\n        LineChanged\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerDiff(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerDiff(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerDiff();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    QString description(int style) const;\n    const char *wordCharacters() const;\n\nprivate:\n    QsciLexerDiff(const QsciLexerDiff &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerfortran.sip",
    "content": "// This is the SIP interface definition for QsciLexerFortran.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerFortran : QsciLexerFortran77\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerfortran.h>\n%End\n\npublic:\n%If (Qsci_Qt4)\n    QsciLexerFortran(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerFortran(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    const char *language() const;\n    const char *lexer() const;\n    const char *keywords(int set) const;\n\nprivate:\n    QsciLexerFortran(const QsciLexerFortran &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerfortran77.sip",
    "content": "// This is the SIP interface definition for QsciLexerFortran77.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerFortran77 : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerfortran77.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        Number,\n        SingleQuotedString,\n        DoubleQuotedString,\n        UnclosedString,\n        Operator,\n        Identifier,\n        Keyword,\n        IntrinsicFunction,\n        ExtendedFunction,\n        PreProcessor,\n        DottedOperator,\n        Label,\n        Continuation,\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerFortran77(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerFortran77(QObject *parent /TransferThis/ = 0,\n            const char *name = 0);\n%End\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n\n    void refreshProperties();\n    bool foldCompact() const;\n\npublic slots:\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerFortran77(const QsciLexerFortran77 &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerhtml.sip",
    "content": "// This is the SIP interface definition for QsciLexerHTML.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerHTML : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerhtml.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Tag,\n        UnknownTag,\n        Attribute,\n        UnknownAttribute,\n        HTMLNumber,\n        HTMLDoubleQuotedString,\n        HTMLSingleQuotedString,\n        OtherInTag,\n        HTMLComment,\n        Entity,\n        XMLTagEnd,\n        XMLStart,\n        XMLEnd,\n        Script,\n        ASPAtStart,\n        ASPStart,\n        CDATA,\n        PHPStart,\n        HTMLValue,\n        ASPXCComment,\n        SGMLDefault,\n        SGMLCommand,\n        SGMLParameter,\n        SGMLDoubleQuotedString,\n        SGMLSingleQuotedString,\n        SGMLError,\n        SGMLSpecial,\n        SGMLEntity,\n        SGMLComment,\n        SGMLParameterComment,\n        SGMLBlockDefault,\n        JavaScriptStart,\n        JavaScriptDefault,\n        JavaScriptComment,\n        JavaScriptCommentLine,\n        JavaScriptCommentDoc,\n        JavaScriptNumber,\n        JavaScriptWord,\n        JavaScriptKeyword,\n        JavaScriptDoubleQuotedString,\n        JavaScriptSingleQuotedString,\n        JavaScriptSymbol,\n        JavaScriptUnclosedString,\n        JavaScriptRegex,\n        ASPJavaScriptStart,\n        ASPJavaScriptDefault,\n        ASPJavaScriptComment,\n        ASPJavaScriptCommentLine,\n        ASPJavaScriptCommentDoc,\n        ASPJavaScriptNumber,\n        ASPJavaScriptWord,\n        ASPJavaScriptKeyword,\n        ASPJavaScriptDoubleQuotedString,\n        ASPJavaScriptSingleQuotedString,\n        ASPJavaScriptSymbol,\n        ASPJavaScriptUnclosedString,\n        ASPJavaScriptRegex,\n        VBScriptStart,\n        VBScriptDefault,\n        VBScriptComment,\n        VBScriptNumber,\n        VBScriptKeyword,\n        VBScriptString,\n        VBScriptIdentifier,\n        VBScriptUnclosedString,\n        ASPVBScriptStart,\n        ASPVBScriptDefault,\n        ASPVBScriptComment,\n        ASPVBScriptNumber,\n        ASPVBScriptKeyword,\n        ASPVBScriptString,\n        ASPVBScriptIdentifier,\n        ASPVBScriptUnclosedString,\n        PythonStart,\n        PythonDefault,\n        PythonComment,\n        PythonNumber,\n        PythonDoubleQuotedString,\n        PythonSingleQuotedString,\n        PythonKeyword,\n        PythonTripleSingleQuotedString,\n        PythonTripleDoubleQuotedString,\n        PythonClassName,\n        PythonFunctionMethodName,\n        PythonOperator,\n        PythonIdentifier,\n        ASPPythonStart,\n        ASPPythonDefault,\n        ASPPythonComment,\n        ASPPythonNumber,\n        ASPPythonDoubleQuotedString,\n        ASPPythonSingleQuotedString,\n        ASPPythonKeyword,\n        ASPPythonTripleSingleQuotedString,\n        ASPPythonTripleDoubleQuotedString,\n        ASPPythonClassName,\n        ASPPythonFunctionMethodName,\n        ASPPythonOperator,\n        ASPPythonIdentifier,\n        PHPDefault,\n        PHPDoubleQuotedString,\n        PHPSingleQuotedString,\n        PHPKeyword,\n        PHPNumber,\n        PHPVariable,\n        PHPComment,\n        PHPCommentLine,\n        PHPDoubleQuotedVariable,\n        PHPOperator\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerHTML(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerHTML(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerHTML();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n    const char *wordCharacters() const;\n\n    void refreshProperties();\n    bool caseSensitiveTags() const;\n    void setDjangoTemplates(bool enable);\n    bool djangoTemplates() const;\n    bool foldCompact() const;\n    bool foldPreprocessor() const;\n    void setFoldScriptComments(bool fold);\n    bool foldScriptComments() const;\n    void setFoldScriptHeredocs(bool fold);\n    bool foldScriptHeredocs() const;\n    void setMakoTemplates(bool enable);\n    bool makoTemplates() const;\n\npublic slots:\n    virtual void setFoldCompact(bool fold);\n    virtual void setFoldPreprocessor(bool fold);\n    virtual void setCaseSensitiveTags(bool sens);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerHTML(const QsciLexerHTML &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexeridl.sip",
    "content": "// This is the SIP interface definition for QsciLexerIDL.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerIDL : QsciLexerCPP\n{\n%TypeHeaderCode\n#include <Qsci/qscilexeridl.h>\n%End\n\npublic:\n%If (Qsci_Qt4)\n    QsciLexerIDL(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerIDL(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerIDL();\n\n    const char *language() const;\n    QColor defaultColor(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n\nprivate:\n    QsciLexerIDL(const QsciLexerIDL &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerjava.sip",
    "content": "// This is the SIP interface definition for QsciLexerJava.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerJava : QsciLexerCPP\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerjava.h>\n%End\n\npublic:\n%If (Qsci_Qt4)\n    QsciLexerJava(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerJava(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerJava();\n\n    const char *language() const;\n    const char *keywords(int set) const;\n\nprivate:\n    QsciLexerJava(const QsciLexerJava &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerjavascript.sip",
    "content": "// This is the SIP interface definition for QsciLexerJavaScript.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerJavaScript : QsciLexerCPP\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerjavascript.h>\n%End\n\npublic:\n%If (Qsci_Qt4)\n    QsciLexerJavaScript(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerJavaScript(QObject *parent /TransferThis/ = 0,\n            const char *name = 0);\n%End\n\n    virtual ~QsciLexerJavaScript();\n\n    const char *language() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n\nprivate:\n    QsciLexerJavaScript(const QsciLexerJavaScript &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerlua.sip",
    "content": "// This is the SIP interface definition for QsciLexerLua.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerLua : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerlua.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        LineComment,\n        Number,\n        Keyword,\n        String,\n        Character,\n        LiteralString,\n        Preprocessor,\n        Operator,\n        Identifier,\n        UnclosedString,\n        BasicFunctions,\n        StringTableMathsFunctions,\n        CoroutinesIOSystemFacilities,\n        KeywordSet5,\n        KeywordSet6,\n        KeywordSet7,\n        KeywordSet8,\n        Label,\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerLua(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerLua(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerLua();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n\n    void refreshProperties();\n    bool foldCompact() const;\n\npublic slots:\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerLua(const QsciLexerLua &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexermakefile.sip",
    "content": "// This is the SIP interface definition for QsciLexerMakefile.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerMakefile : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexermakefile.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        Preprocessor,\n        Variable,\n        Operator,\n        Target,\n        Error\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerMakefile(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerMakefile(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerMakefile();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    QString description(int style) const;\n    const char *wordCharacters() const;\n\nprivate:\n    QsciLexerMakefile(const QsciLexerMakefile &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexermatlab.sip",
    "content": "// This is the SIP interface definition for QsciLexerMatlab.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerMatlab : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexermatlab.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        Command,\n        Number,\n        Keyword,\n        SingleQuotedString,\n        Operator,\n        Identifier,\n        DoubleQuotedString\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerMatlab(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerMatlab(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerMatlab();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    QFont defaultFont(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n\nprivate:\n    QsciLexerMatlab(const QsciLexerMatlab &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexeroctave.sip",
    "content": "// This is the SIP interface definition for QsciLexerOctave.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerOctave : QsciLexerMatlab\n{\n%TypeHeaderCode\n#include <Qsci/qscilexeroctave.h>\n%End\n\npublic:\n%If (Qsci_Qt4)\n    QsciLexerOctave(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerOctave(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerOctave();\n\n    const char *language() const;\n    const char *lexer() const;\n    const char *keywords(int set) const;\n\nprivate:\n    QsciLexerOctave(const QsciLexerOctave &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerpascal.sip",
    "content": "// This is the SIP interface definition for QsciLexerPascal.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerPascal : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerpascal.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Identifier,\n        Comment,\n        CommentParenthesis,\n        CommentLine,\n        PreProcessor,\n        PreProcessorParenthesis,\n        Number,\n        HexNumber,\n        Keyword,\n        SingleQuotedString,\n        UnclosedString,\n        Character,\n        Operator,\n        Asm,\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerPascal(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerPascal(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n\n    void refreshProperties();\n    bool foldComments() const;\n    bool foldCompact() const;\n    bool foldPreprocessor() const;\n\n    void setSmartHighlighting(bool enabled);\n    bool smartHighlighting() const;\n\npublic slots:\n    virtual void setFoldComments(bool fold);\n    virtual void setFoldCompact(bool fold);\n    virtual void setFoldPreprocessor(bool fold);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerPascal(const QsciLexerPascal &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerperl.sip",
    "content": "// This is the SIP interface definition for QsciLexerPerl.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerPerl : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerperl.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Error,\n        Comment,\n        POD,\n        Number,\n        Keyword,\n        DoubleQuotedString,\n        SingleQuotedString,\n        Operator,\n        Identifier,\n        Scalar,\n        Array,\n        Hash,\n        SymbolTable,\n        Regex,\n        Substitution,\n        Backticks,\n        DataSection,\n        HereDocumentDelimiter,\n        SingleQuotedHereDocument,\n        DoubleQuotedHereDocument,\n        BacktickHereDocument,\n        QuotedStringQ,\n        QuotedStringQQ,\n        QuotedStringQX,\n        QuotedStringQR,\n        QuotedStringQW,\n        PODVerbatim,\n        SubroutinePrototype,\n        FormatIdentifier,\n        FormatBody,\n        DoubleQuotedStringVar,\n        Translation,\n        RegexVar,\n        SubstitutionVar,\n        BackticksVar,\n        DoubleQuotedHereDocumentVar,\n        BacktickHereDocumentVar,\n        QuotedStringQQVar,\n        QuotedStringQXVar,\n        QuotedStringQRVar,\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerPerl(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerPerl(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerPerl();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n    const char *wordCharacters() const;\n\n    void refreshProperties();\n    bool foldComments() const;\n    bool foldCompact() const;\n\n    void setFoldAtElse(bool fold);\n    bool foldAtElse() const;\n    void setFoldPackages(bool fold);\n    bool foldPackages() const;\n    void setFoldPODBlocks(bool fold);\n    bool foldPODBlocks() const;\n\npublic slots:\n    virtual void setFoldComments(bool fold);\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerPerl(const QsciLexerPerl &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerpo.sip",
    "content": "// This is the SIP interface definition for QsciLexerPO.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerPO : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerpo.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        MessageId,\n        MessageIdText,\n        MessageString,\n        MessageStringText,\n        MessageContext,\n        MessageContextText,\n        Fuzzy,\n        ProgrammerComment,\n        Reference,\n        Flags,\n        MessageIdTextEOL,\n        MessageStringTextEOL,\n        MessageContextTextEOL\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerPO(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerPO(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerPO();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    QFont defaultFont(int style) const;\n    QString description(int style) const;\n\n    void refreshProperties();\n    bool foldComments() const;\n    bool foldCompact() const;\n\npublic slots:\n    virtual void setFoldComments(bool fold);\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerPO(const QsciLexerPO &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerpostscript.sip",
    "content": "// This is the SIP interface definition for QsciLexerPostScript.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerPostScript : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerpostscript.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        DSCComment,\n        DSCCommentValue,\n        Number,\n        Name,\n        Keyword,\n        Literal,\n        ImmediateEvalLiteral,\n        ArrayParenthesis,\n        DictionaryParenthesis,\n        ProcedureParenthesis,\n        Text,\n        HexString,\n        Base85String,\n        BadStringCharacter\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerPostScript(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerPostScript(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerPostScript();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n\n    void refreshProperties();\n    bool tokenize() const;\n    int level() const;\n    bool foldCompact() const;\n    bool foldAtElse() const;\n\npublic slots:\n    virtual void setTokenize(bool tokenize);\n    virtual void setLevel(int level);\n    virtual void setFoldCompact(bool fold);\n    virtual void setFoldAtElse(bool fold);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerPostScript(const QsciLexerPostScript &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerpov.sip",
    "content": "// This is the SIP interface definition for QsciLexerPOV.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerPOV : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerpov.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        CommentLine,\n        Number,\n        Operator,\n        Identifier,\n        String,\n        UnclosedString,\n        Directive,\n        BadDirective,\n        ObjectsCSGAppearance,\n        TypesModifiersItems,\n        PredefinedIdentifiers,\n        PredefinedFunctions,\n        KeywordSet6,\n        KeywordSet7,\n        KeywordSet8\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerPOV(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerPOV(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerPOV();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n    const char *wordCharacters() const;\n\n    void refreshProperties();\n    bool foldComments() const;\n    bool foldCompact() const;\n    bool foldDirectives() const;\n\npublic slots:\n    virtual void setFoldComments(bool fold);\n    virtual void setFoldCompact(bool fold);\n    virtual void setFoldDirectives(bool fold);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerPOV(const QsciLexerPOV &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerproperties.sip",
    "content": "// This is the SIP interface definition for QsciLexerProperties.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerProperties : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerproperties.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        Section,\n        Assignment,\n        DefaultValue,\n        Key\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerProperties(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerProperties(QObject *parent /TransferThis/ = 0,\n            const char *name = 0);\n%End\n\n    virtual ~QsciLexerProperties();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    QString description(int style) const;\n    const char *wordCharacters() const;\n\n    void refreshProperties();\n    bool foldCompact() const;\n    void setInitialSpaces(bool enable);\n    bool initialSpaces() const;\n\npublic slots:\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerProperties(const QsciLexerProperties &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerpython.sip",
    "content": "// This is the SIP interface definition for QsciLexerPython.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerPython : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerpython.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        Number,\n        DoubleQuotedString,\n        SingleQuotedString,\n        Keyword,\n        TripleSingleQuotedString,\n        TripleDoubleQuotedString,\n        ClassName,\n        FunctionMethodName,\n        Operator,\n        Identifier,\n        CommentBlock,\n        UnclosedString,\n        HighlightedIdentifier,\n        Decorator,\n    };\n\n    enum IndentationWarning {\n        NoWarning,\n        Inconsistent,\n        TabsAfterSpaces,\n        Spaces,\n        Tabs\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerPython(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerPython(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerPython();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n\n    void refreshProperties();\n    bool foldComments() const;\n    void setFoldCompact(bool fold);\n    bool foldCompact() const;\n    bool foldQuotes() const;\n    QsciLexerPython::IndentationWarning indentationWarning() const;\n    void setHighlightSubidentifiers(bool enabled);\n    bool highlightSubidentifiers() const;\n    void setStringsOverNewlineAllowed(bool allowed);\n    bool stringsOverNewlineAllowed() const;\n    void setV2UnicodeAllowed(bool allowed);\n    bool v2UnicodeAllowed() const;\n    void setV3BinaryOctalAllowed(bool allowed);\n    bool v3BinaryOctalAllowed() const;\n    void setV3BytesAllowed(bool allowed);\n    bool v3BytesAllowed() const;\n\npublic slots:\n    virtual void setFoldComments(bool fold);\n    virtual void setFoldQuotes(bool fold);\n    virtual void setIndentationWarning(QsciLexerPython::IndentationWarning warn);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerPython(const QsciLexerPython &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerruby.sip",
    "content": "// This is the SIP interface definition for QsciLexerRuby.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerRuby : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerruby.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Error,\n        Comment,\n        POD,\n        Number,\n        Keyword,\n        DoubleQuotedString,\n        SingleQuotedString,\n        ClassName,\n        FunctionMethodName,\n        Operator,\n        Identifier,\n        Regex,\n        Global,\n        Symbol,\n        ModuleName,\n        InstanceVariable,\n        ClassVariable,\n        Backticks,\n        DataSection,\n        HereDocumentDelimiter,\n        HereDocument,\n        PercentStringq,\n        PercentStringQ,\n        PercentStringx,\n        PercentStringr,\n        PercentStringw,\n        DemotedKeyword,\n        Stdin,\n        Stdout,\n        Stderr\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerRuby(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerRuby(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerRuby();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int) const;\n    QString description(int style) const;\n\n    void refreshProperties();\n    void setFoldComments(bool fold);\n    bool foldComments() const;\n    void setFoldCompact(bool fold);\n    bool foldCompact() const;\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerRuby(const QsciLexerRuby &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerspice.sip",
    "content": "// This is the SIP interface definition for QsciLexerSpice.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerSpice : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerspice.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Identifier,\n        Command,\n        Function,\n        Parameter,\n        Number,\n        Delimiter,\n        Value,\n        Comment\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerSpice(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerSpice(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerSpice();\n\n    const char *language() const;\n    const char *lexer() const;\n    const char *keywords(int set) const;\n    QColor defaultColor(int style) const;\n    QFont defaultFont(int style) const;\n    QString description(int style) const;\n\nprivate:\n    QsciLexerSpice(const QsciLexerSpice &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexersql.sip",
    "content": "// This is the SIP interface definition for QsciLexerSQL.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerSQL : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexersql.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        CommentLine,\n        CommentDoc,\n        Number,\n        Keyword,\n        DoubleQuotedString,\n        SingleQuotedString,\n        PlusKeyword,\n        PlusPrompt,\n        Operator,\n        Identifier,\n        PlusComment,\n        CommentLineHash,\n        CommentDocKeyword,\n        CommentDocKeywordError,\n        KeywordSet5,\n        KeywordSet6,\n        KeywordSet7,\n        KeywordSet8,\n        QuotedIdentifier,\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerSQL(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerSQL(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerSQL();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n\n    void refreshProperties();\n    bool backslashEscapes() const;\n    void setDottedWords(bool enable);\n    bool dottedWords() const;\n    void setFoldAtElse(bool fold);\n    bool foldAtElse() const;\n    bool foldComments() const;\n    bool foldCompact() const;\n    void setFoldOnlyBegin(bool fold);\n    bool foldOnlyBegin() const;\n    void setHashComments(bool enable);\n    bool hashComments() const;\n    void setQuotedIdentifiers(bool enable);\n    bool quotedIdentifiers() const;\n\npublic slots:\n    virtual void setBackslashEscapes(bool enable);\n    virtual void setFoldComments(bool fold);\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerSQL(const QsciLexerSQL &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexertcl.sip",
    "content": "// This is the SIP interface definition for QsciLexerTCL.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerTCL : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexertcl.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        CommentLine,\n        Number,\n        QuotedKeyword,\n        QuotedString,\n        Operator,\n        Identifier,\n        Substitution,\n        SubstitutionBrace,\n        Modifier,\n        ExpandKeyword,\n        TCLKeyword,\n        TkKeyword,\n        ITCLKeyword,\n        TkCommand,\n        KeywordSet6,\n        KeywordSet7,\n        KeywordSet8,\n        KeywordSet9,\n        CommentBox,\n        CommentBlock\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerTCL(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerTCL(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerTCL();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n\n    void refreshProperties();\n    void setFoldComments(bool fold);\n    bool foldComments() const;\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerTCL(const QsciLexerTCL &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexertex.sip",
    "content": "// This is the SIP interface definition for QsciLexerTeX.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerTeX : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexertex.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Special,\n        Group,\n        Symbol,\n        Command,\n        Text\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerTeX(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerTeX(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerTeX();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n    const char *wordCharacters() const;\n\n    void refreshProperties();\n    void setFoldComments(bool fold);\n    bool foldComments() const;\n    void setFoldCompact(bool fold);\n    bool foldCompact() const;\n    void setProcessComments(bool enable);\n    bool processComments() const;\n    void setProcessIf(bool enable);\n    bool processIf() const;\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerTeX(const QsciLexerTeX &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerverilog.sip",
    "content": "// This is the SIP interface definition for QsciLexerVerilog.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerVerilog : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerverilog.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        CommentLine,\n        CommentBang,\n        Number,\n        Keyword,\n        String,\n        KeywordSet2,\n        SystemTask,\n        Preprocessor,\n        Operator,\n        Identifier,\n        UnclosedString,\n        UserKeywordSet,\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerVerilog(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerVerilog(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n    const char *wordCharacters() const;\n\n    void refreshProperties();\n\n    void setFoldAtElse(bool fold);\n    bool foldAtElse() const;\n\n    void setFoldComments(bool fold);\n    bool foldComments() const;\n\n    void setFoldCompact(bool fold);\n    bool foldCompact() const;\n\n    void setFoldPreprocessor(bool fold);\n    bool foldPreprocessor() const;\n\n    void setFoldAtModule(bool fold);\n    bool foldAtModule() const;\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerVerilog(const QsciLexerVerilog &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexervhdl.sip",
    "content": "// This is the SIP interface definition for QsciLexerVHDL.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerVHDL : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexervhdl.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        CommentLine,\n        Number,\n        String,\n        Operator,\n        Identifier,\n        UnclosedString,\n        Keyword,\n        StandardOperator,\n        Attribute,\n        StandardFunction,\n        StandardPackage,\n        StandardType,\n        KeywordSet7\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerVHDL(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerVHDL(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerVHDL();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n\n    void refreshProperties();\n    bool foldComments() const;\n    bool foldCompact() const;\n    bool foldAtElse() const;\n    bool foldAtBegin() const;\n    bool foldAtParenthesis() const;\n\npublic slots:\n    virtual void setFoldComments(bool fold);\n    virtual void setFoldCompact(bool fold);\n    virtual void setFoldAtElse(bool fold);\n    virtual void setFoldAtBegin(bool fold);\n    virtual void setFoldAtParenthesis(bool fold);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerVHDL(const QsciLexerVHDL &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexerxml.sip",
    "content": "// This is the SIP interface definition for QsciLexerXML.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerXML : QsciLexerHTML\n{\n%TypeHeaderCode\n#include <Qsci/qscilexerxml.h>\n%End\n\npublic:\n%If (Qsci_Qt4)\n    QsciLexerXML(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerXML(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerXML();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n\n    void refreshProperties();\n    void setScriptsStyled(bool styled);\n    bool scriptsStyled() const;\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerXML(const QsciLexerXML &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscilexeryaml.sip",
    "content": "// This is the SIP interface definition for QsciLexerYAML.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciLexerYAML : QsciLexer\n{\n%TypeHeaderCode\n#include <Qsci/qscilexeryaml.h>\n%End\n\npublic:\n    enum {\n        Default,\n        Comment,\n        Identifier,\n        Keyword,\n        Number,\n        Reference,\n        DocumentDelimiter,\n        TextBlockMarker,\n        SyntaxErrorMarker,\n        Operator\n    };\n\n%If (Qsci_Qt4)\n    QsciLexerYAML(QObject *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciLexerYAML(QObject *parent /TransferThis/ = 0, const char *name = 0);\n%End\n\n    virtual ~QsciLexerYAML();\n\n    const char *language() const;\n    const char *lexer() const;\n    QColor defaultColor(int style) const;\n    bool defaultEolFill(int style) const;\n    QFont defaultFont(int style) const;\n    QColor defaultPaper(int style) const;\n    const char *keywords(int set) const;\n    QString description(int style) const;\n\n    void refreshProperties();\n    bool foldComments() const;\n\npublic slots:\n    virtual void setFoldComments(bool fold);\n\nprotected:\n    bool readProperties(QSettings &qs, const QString &prefix);\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    QsciLexerYAML(const QsciLexerYAML &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscimacro.sip",
    "content": "// This is the SIP interface definition for QsciMacro.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciMacro : QObject\n{\n%TypeHeaderCode\n#include <Qsci/qscimacro.h>\n%End\n\npublic:\n%If (Qsci_Qt4)\n    QsciMacro(QsciScintilla *parent /TransferThis/);\n    QsciMacro(const QString &asc, QsciScintilla *parent /TransferThis/);\n%End\n%If (!Qsci_Qt4)\n    QsciMacro(QsciScintilla *parent /TransferThis/, const char *name = 0);\n    QsciMacro(const QString &asc, QsciScintilla *parent /TransferThis/,\n            const char *name = 0);\n%End\n\n    virtual ~QsciMacro();\n\n    void clear();\n    bool load(const QString &asc);\n    QString save() const;\n\npublic slots:\n    virtual void play();\n    virtual void startRecording();\n    virtual void endRecording();\n\nprivate:\n    QsciMacro(const QsciMacro &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscimod3.sip",
    "content": "// This is the SIP interface definition for the qsci module of PyQt3.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n%Module qsci 0\n\n%Import qt/qtmod.sip\n\n%Include qscimodcommon.sip\n%Include qsciscintillabase3.sip\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscimod4.sip",
    "content": "// This is the SIP interface definition for the Qsci module of PyQt4.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n%Module(name=PyQt4.Qsci, keyword_arguments=\"Optional\")\n\n%Import QtGui/QtGuimod.sip\n\n%Include qscimodcommon.sip\n%Include qsciscintillabase4.sip\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscimod5.sip",
    "content": "// This is the SIP interface definition for the Qsci module of PyQt5.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n%Module(name=PyQt5.Qsci, keyword_arguments=\"Optional\")\n\n%Import QtGui/QtGuimod.sip\n%Import QtWidgets/QtWidgetsmod.sip\n\n%Include qscimodcommon.sip\n%Include qsciscintillabase4.sip\n\n%If (PyQt_Printer)\n%Import QtPrintSupport/QtPrintSupportmod.sip\n%End\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscimodcommon.sip",
    "content": "// This is the SIP interface definition for the parts of the Qsci module common\n// to the Qt v3 and v4 versions.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n%Feature Qsci_Qt4\n\n\n%Copying\nCopyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n\nThis file is part of QScintilla.\n\nThis file may be used under the terms of the GNU General Public\nLicense versions 2.0 or 3.0 as published by the Free Software\nFoundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\nincluded in the packaging of this file.  Alternatively you may (at\nyour option) use any later version of the GNU General Public\nLicense if such license has been publicly approved by Riverbank\nComputing Limited (or its successors, if any) and the KDE Free Qt\nFoundation. In addition, as a special exception, Riverbank gives you\ncertain additional rights. These rights are described in the Riverbank\nGPL Exception version 1.1, which can be found in the file\nGPL_EXCEPTION.txt in this package.\n\nIf you are unsure which license is appropriate for your use, please\ncontact the sales department at sales@riverbankcomputing.com.\n\nThis file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\nWARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n%End\n\n\nconst int QSCINTILLA_VERSION;\nconst char *QSCINTILLA_VERSION_STR;\n\n\n%Include qsciscintilla.sip\n%Include qsciabstractapis.sip\n%Include qsciapis.sip\n%Include qscicommand.sip\n%Include qscicommandset.sip\n%Include qscidocument.sip\n%Include qscilexer.sip\n%Include qscilexeravs.sip\n%Include qscilexerbash.sip\n%Include qscilexerbatch.sip\n%Include qscilexercmake.sip\n%Include qscilexercoffeescript.sip\n%Include qscilexercpp.sip\n%Include qscilexercsharp.sip\n%Include qscilexercss.sip\n%Include qscilexercustom.sip\n%Include qscilexerd.sip\n%Include qscilexerdiff.sip\n%Include qscilexerfortran.sip\n%Include qscilexerfortran77.sip\n%Include qscilexerhtml.sip\n%Include qscilexeridl.sip\n%Include qscilexerjava.sip\n%Include qscilexerjavascript.sip\n%Include qscilexerlua.sip\n%Include qscilexermakefile.sip\n%Include qscilexermatlab.sip\n%Include qscilexeroctave.sip\n%Include qscilexerpascal.sip\n%Include qscilexerperl.sip\n%Include qscilexerpostscript.sip\n%Include qscilexerpo.sip\n%Include qscilexerpov.sip\n%Include qscilexerproperties.sip\n%Include qscilexerpython.sip\n%Include qscilexerruby.sip\n%Include qscilexerspice.sip\n%Include qscilexersql.sip\n%Include qscilexertcl.sip\n%Include qscilexertex.sip\n%Include qscilexerverilog.sip\n%Include qscilexervhdl.sip\n%Include qscilexerxml.sip\n%Include qscilexeryaml.sip\n%Include qscimacro.sip\n%Include qsciprinter.sip\n%Include qscistyle.sip\n%Include qscistyledtext.sip\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qsciprinter.sip",
    "content": "// This is the SIP interface definition for QsciPrinter.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n%If (PyQt_Printer)\n\nclass QsciPrinter : QPrinter\n{\n%TypeHeaderCode\n#include <Qsci/qsciprinter.h>\n%End\n\npublic:\n    QsciPrinter(QPrinter::PrinterMode mode = QPrinter::ScreenResolution);\n    virtual ~QsciPrinter();\n\n    virtual void formatPage(QPainter &painter, bool drawing, QRect &area,\n            int pagenr);\n    int magnification() const;\n    virtual void setMagnification(int magnification);\n    virtual int printRange(QsciScintillaBase *qsb, int from = -1, int to = -1);\n    QsciScintilla::WrapMode wrapMode() const;\n    virtual void setWrapMode(QsciScintilla::WrapMode);\n\nprivate:\n    QsciPrinter(const QsciPrinter &);\n};\n\n%End\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qsciscintilla.sip",
    "content": "// This is the SIP interface definition for QsciScintilla.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciScintilla : QsciScintillaBase\n{\n%TypeHeaderCode\n#include <Qsci/qsciscintilla.h>\n%End\n\npublic:\n    enum {\n        AiMaintain,\n        AiOpening,\n        AiClosing\n    };\n\n    enum AnnotationDisplay {\n        AnnotationHidden,\n        AnnotationStandard,\n        AnnotationBoxed\n    };\n\n    enum AutoCompletionSource {\n        AcsNone,\n        AcsAll,\n        AcsDocument,\n        AcsAPIs\n    };\n\n    enum AutoCompletionUseSingle {\n        AcusNever,\n        AcusExplicit,\n        AcusAlways\n    };\n\n    enum BraceMatch {\n        NoBraceMatch,\n        StrictBraceMatch,\n        SloppyBraceMatch\n    };\n\n    enum CallTipsPosition {\n        CallTipsBelowText,\n        CallTipsAboveText,\n    };\n\n    enum CallTipsStyle {\n        CallTipsNone,\n        CallTipsNoContext,\n        CallTipsNoAutoCompletionContext,\n        CallTipsContext\n    };\n\n    enum EdgeMode {\n        EdgeNone,\n        EdgeLine,\n        EdgeBackground\n    };\n\n    enum EolMode {\n        EolWindows,\n        EolUnix,\n        EolMac\n    };\n\n    enum FoldStyle {\n        NoFoldStyle,\n        PlainFoldStyle,\n        CircledFoldStyle,\n        BoxedFoldStyle,\n        CircledTreeFoldStyle,\n        BoxedTreeFoldStyle\n    };\n\n    enum IndicatorStyle {\n        PlainIndicator,\n        SquiggleIndicator,\n        TTIndicator,\n        DiagonalIndicator,\n        StrikeIndicator,\n        HiddenIndicator,\n        BoxIndicator,\n        RoundBoxIndicator,\n        StraightBoxIndicator,\n        DashesIndicator,\n        DotsIndicator,\n        SquiggleLowIndicator,\n        DotBoxIndicator,\n        SquigglePixmapIndicator,\n    };\n\n    enum {\n        MoNone,\n        MoSublineSelect,\n    };\n\n    enum MarginType {\n        SymbolMargin,\n        SymbolMarginDefaultForegroundColor,\n        SymbolMarginDefaultBackgroundColor,\n        NumberMargin,\n        TextMargin,\n        TextMarginRightJustified\n    };\n\n    enum MarkerSymbol {\n        Circle,\n        Rectangle,\n        RightTriangle,\n        SmallRectangle,\n        RightArrow,\n        Invisible,\n        DownTriangle,\n        Minus,\n        Plus,\n        VerticalLine,\n        BottomLeftCorner,\n        LeftSideSplitter,\n        BoxedPlus,\n        BoxedPlusConnected,\n        BoxedMinus,\n        BoxedMinusConnected,\n        RoundedBottomLeftCorner,\n        LeftSideRoundedSplitter,\n        CircledPlus,\n        CircledPlusConnected,\n        CircledMinus,\n        CircledMinusConnected,\n        Background,\n        ThreeDots,\n        ThreeRightArrows,\n        FullRectangle,\n        LeftRectangle,\n        Underline\n    };\n\n    enum WhitespaceVisibility {\n        WsInvisible,\n        WsVisible,\n        WsVisibleAfterIndent\n    };\n\n    enum WrapMode {\n        WrapNone,\n        WrapWord,\n        WrapCharacter,\n    };\n\n    enum WrapVisualFlag {\n        WrapFlagNone,\n        WrapFlagByText,\n        WrapFlagByBorder,\n        WrapFlagInMargin,\n    };\n\n    enum WrapIndentMode {\n        WrapIndentFixed,\n        WrapIndentSame,\n        WrapIndentIndented,\n    };\n\n%If (Qsci_Qt4)\n    QsciScintilla(QWidget *parent /TransferThis/ = 0);\n%End\n%If (!Qsci_Qt4)\n    QsciScintilla(QWidget *parent /TransferThis/ = 0, const char *name = 0,\n            WFlags f = 0);\n%End\n\n    virtual ~QsciScintilla();\n\n    virtual QStringList apiContext(int pos, int &context_start,\n            int &last_word_start);\n\n    void annotate(int line, const QString &text, int style);\n    void annotate(int line, const QString &text, const QsciStyle &style);\n    void annotate(int line, const QsciStyledText &text);\n%If (Qsci_Qt4)\n    void annotate(int line, const QList<QsciStyledText> &text);\n%End\n%If (!Qsci_Qt4)\n    void annotate(int line, const QValueList<QsciStyledText> &text);\n%End\n    QString annotation(int line) const;\n    AnnotationDisplay annotationDisplay() const;\n    void clearAnnotations(int line = -1);\n\n    bool autoCompletionCaseSensitivity() const;\n    bool autoCompletionFillupsEnabled() const;\n    bool autoCompletionReplaceWord() const;\n    bool autoCompletionShowSingle() const;\n    AutoCompletionSource autoCompletionSource() const;\n    int autoCompletionThreshold() const;\n    AutoCompletionUseSingle autoCompletionUseSingle() const;\n    bool autoIndent() const;\n\n    bool backspaceUnindents() const;\n    void beginUndoAction();\n    BraceMatch braceMatching() const;\n\n    CallTipsPosition callTipsPosition() const;\n    CallTipsStyle callTipsStyle() const;\n    int callTipsVisible() const;\n    void cancelList();\n    bool caseSensitive() const;\n    void clearRegisteredImages();\n    QColor color() const;\n%If (Qsci_Qt4)\n    QList<int> contractedFolds() const;\n%End\n%If (!Qsci_Qt4)\n    QValueList<int> contractedFolds() const;\n%End\n    void convertEols(EolMode mode);\n%If (Qsci_Qt4)\n    QMenu *createStandardContextMenu() /Factory/;\n%End\n\n    QsciDocument document() const;\n\n    void endUndoAction();\n    QColor edgeColor() const;\n    int edgeColumn() const;\n    EdgeMode edgeMode() const;\n    EolMode eolMode() const;\n    bool eolVisibility() const;\n\n    int extraAscent() const;\n    int extraDescent() const;\n\n    virtual bool findFirst(const QString &expr, bool re, bool cs, bool wo,\n            bool wrap, bool forward = true, int line = -1, int index = -1,\n            bool show = true, bool posix = false);\n    virtual bool findFirstInSelection(const QString &expr, bool re, bool cs,\n            bool wo, bool forward = true, bool show = true,\n            bool posix = false);\n    virtual bool findNext();\n    int firstVisibleLine() const;\n    FoldStyle folding() const;\n\n    void getCursorPosition(int *line, int *index) const;\n    void getSelection(int *lineFrom, int *indexFrom, int *lineTo,\n            int *indexTo) const;\n\n    bool hasSelectedText() const;\n\n    int indentation(int line) const;\n    bool indentationGuides() const;\n    bool indentationsUseTabs() const;\n    int indentationWidth() const;\n\n    void clearIndicatorRange(int lineFrom, int indexFrom, int lineTo,\n            int indexTo, int indicatorNumber);\n    void fillIndicatorRange(int lineFrom, int indexFrom, int lineTo,\n            int indexTo, int indicatorNumber);\n    int indicatorDefine(IndicatorStyle style, int indicatorNumber = -1);\n    bool indicatorDrawUnder(int indicatorNumber) const;\n\n    bool isCallTipActive() const;\n    bool isListActive() const;\n    bool isModified() const;\n    bool isReadOnly() const;\n    bool isRedoAvailable() const;\n    bool isUndoAvailable() const;\n    bool isUtf8() const;\n    bool isWordCharacter(char ch) const;\n\n    int lineAt(const QPoint &pos) const;\n    void lineIndexFromPosition(int position, int *line, int *index) const;\n    int lineLength(int line) const;\n    int lines() const;\n    int length() const;\n    QsciLexer *lexer() const;\n\n    bool marginLineNumbers(int margin) const;\n    int marginMarkerMask(int margin) const;\n    int marginOptions() const;\n    bool marginSensitivity(int margin) const;\n    MarginType marginType(int margin) const;\n    int marginWidth(int margin) const;\n\n    int markerDefine(MarkerSymbol sym, int markerNumber = -1);\n    int markerDefine(char ch, int markerNumber = -1);\n    int markerDefine(const QPixmap &pm, int markerNumber = -1);\n    int markerDefine(const QImage &im, int markerNumber = -1);\n    int markerAdd(int linenr, int markerNumber);\n    unsigned markersAtLine(int linenr) const;\n    void markerDelete(int linenr, int markerNumber = -1);\n    void markerDeleteAll(int markerNumber = -1);\n    void markerDeleteHandle(int mhandle);\n    int markerLine(int mhandle) const;\n    int markerFindNext(int linenr, unsigned mask) const;\n    int markerFindPrevious(int linenr, unsigned mask) const;\n\n    bool overwriteMode() const;\n\n    QColor paper() const;\n    int positionFromLineIndex(int line, int index) const;\n\n    bool read(QIODevice *io) /ReleaseGIL/;\n    virtual void recolor(int start = 0, int end = -1);\n    void registerImage(int id, const QPixmap &pm);\n    void registerImage(int id, const QImage &im);\n    virtual void replace(const QString &replaceStr);\n    void resetFoldMarginColors();\n    void resetHotspotBackgroundColor();\n    void resetHotspotForegroundColor();\n\n    void setFoldMarginColors(const QColor &fore, const QColor &back);\n\n    void setAnnotationDisplay(AnnotationDisplay display);\n\n    void setAutoCompletionFillupsEnabled(bool enabled);\n    void setAutoCompletionFillups(const char *fillups);\n    void setAutoCompletionWordSeparators(const QStringList &separators);\n\n    void setCallTipsBackgroundColor(const QColor &col);\n    void setCallTipsForegroundColor(const QColor &col);\n    void setCallTipsHighlightColor(const QColor &col);\n    void setCallTipsPosition(CallTipsPosition position);\n    void setCallTipsStyle(CallTipsStyle style);\n    void setCallTipsVisible(int nr);\n%If (Qsci_Qt4)\n    void setContractedFolds(const QList<int> &folds);\n%End\n%If (!Qsci_Qt4)\n    void setContractedFolds(const QValueList<int> &folds);\n%End\n\n    void setDocument(const QsciDocument &document);\n\n    void setEdgeColor(const QColor &col);\n    void setEdgeColumn(int colnr);\n    void setEdgeMode(EdgeMode mode);\n\n    void setFirstVisibleLine(int linenr);\n    void setFont(const QFont &f);\n\n    void setHotspotBackgroundColor(const QColor &col);\n    void setHotspotForegroundColor(const QColor &col);\n    void setHotspotUnderline(bool enable);\n    void setHotspotWrap(bool enable);\n\n    void setIndicatorDrawUnder(bool under, int indicatorNumber = -1);\n    void setIndicatorForegroundColor(const QColor &col,\n            int indicatorNumber = -1);\n    void setIndicatorOutlineColor(const QColor &col, int indicatorNumber = -1);\n\n    void setMarginOptions(int options);\n    void setMarginText(int line, const QString &text, int style);\n    void setMarginText(int line, const QString &text, const QsciStyle &style);\n    void setMarginText(int line, const QsciStyledText &text);\n%If (Qsci_Qt4)\n    void setMarginText(int line, const QList<QsciStyledText> &text);\n%End\n%If (!Qsci_Qt4)\n    void setMarginText(int line, const QValueList<QsciStyledText> &text);\n%End\n    void setMarginType(int margin, MarginType type);\n    void clearMarginText(int line = -1);\n\n    void setMarkerBackgroundColor(const QColor &col, int markerNumber = -1);\n    void setMarkerForegroundColor(const QColor &col, int markerNumber = -1);\n\n    void setMatchedBraceBackgroundColor(const QColor &col);\n    void setMatchedBraceForegroundColor(const QColor &col);\n    void setMatchedBraceIndicator(int indicatorNumber);\n    void resetMatchedBraceIndicator();\n    void setUnmatchedBraceBackgroundColor(const QColor &col);\n    void setUnmatchedBraceForegroundColor(const QColor &col);\n    void setUnmatchedBraceIndicator(int indicatorNumber);\n    void resetUnmatchedBraceIndicator();\n\n    void setWrapVisualFlags(WrapVisualFlag endFlag,\n            WrapVisualFlag startFlag = QsciScintilla::WrapFlagNone,\n            int indent = 0);\n\n    QString selectedText() const;\n    bool selectionToEol() const;\n    void setSelectionToEol(bool filled);\n\n    void setExtraAscent(int extra);\n    void setExtraDescent(int extra);\n\n    void setOverwriteMode(bool overwrite);\n\n    void setWhitespaceBackgroundColor(const QColor &col);\n    void setWhitespaceForegroundColor(const QColor &col);\n    void setWhitespaceSize(int size);\n\n    void setWrapIndentMode(WrapIndentMode mode);\n    void showUserList(int id, const QStringList &list);\n    QsciCommandSet *standardCommands() const;\n\n    bool tabIndents() const;\n    int tabWidth() const;\n    QString text() const;\n    QString text(int line) const;\n    int textHeight(int linenr) const;\n\n    int whitespaceSize() const;\n    WhitespaceVisibility whitespaceVisibility() const;\n\n    QString wordAtLineIndex(int line, int index) const;\n    QString wordAtPoint(const QPoint &point) const;\n    const char *wordCharacters() const;\n    WrapMode wrapMode() const;\n    WrapIndentMode wrapIndentMode() const;\n    bool write(QIODevice *io) const /ReleaseGIL/;\n\npublic slots:\n    virtual void append(const QString &text);\n    virtual void autoCompleteFromAll();\n    virtual void autoCompleteFromAPIs();\n    virtual void autoCompleteFromDocument();\n    virtual void callTip();\n    virtual void clear();\n    virtual void copy();\n    virtual void cut();\n\n    virtual void ensureCursorVisible();\n    virtual void ensureLineVisible(int line);\n    virtual void foldAll(bool children = false);\n    virtual void foldLine(int line);\n    virtual void indent(int line);\n    virtual void insert(const QString &text);\n    virtual void insertAt(const QString &text, int line, int index);\n    virtual void moveToMatchingBrace();\n    virtual void paste();\n    virtual void redo();\n    virtual void removeSelectedText();\n    virtual void replaceSelectedText(const QString &text);\n    virtual void resetSelectionBackgroundColor();\n    virtual void resetSelectionForegroundColor();\n    virtual void selectAll(bool select = true);\n    virtual void selectToMatchingBrace();\n\n    virtual void setAutoCompletionCaseSensitivity(bool cs);\n    virtual void setAutoCompletionReplaceWord(bool replace);\n    virtual void setAutoCompletionShowSingle(bool single);\n    virtual void setAutoCompletionSource(AutoCompletionSource source);\n    virtual void setAutoCompletionThreshold(int thresh);\n    virtual void setAutoCompletionUseSingle(AutoCompletionUseSingle single);\n    virtual void setAutoIndent(bool autoindent);\n    virtual void setBraceMatching(BraceMatch bm);\n    virtual void setBackspaceUnindents(bool unindent);\n    virtual void setCaretForegroundColor(const QColor &col);\n    virtual void setCaretLineBackgroundColor(const QColor &col);\n    virtual void setCaretLineVisible(bool enable);\n    virtual void setCaretWidth(int width);\n    virtual void setColor(const QColor &col);\n    virtual void setCursorPosition(int line, int index);\n    virtual void setEolMode(EolMode mode);\n    virtual void setEolVisibility(bool visible);\n    virtual void setFolding(FoldStyle fold, int margin=2);\n    void clearFolds();\n\n    virtual void setIndentation(int line, int indentation);\n    virtual void setIndentationGuides(bool enable);\n    virtual void setIndentationGuidesBackgroundColor(const QColor &col);\n    virtual void setIndentationGuidesForegroundColor(const QColor &col);\n    virtual void setIndentationsUseTabs(bool tabs);\n    virtual void setIndentationWidth(int width);\n\n    virtual void setLexer(QsciLexer *lexer = 0);\n\n    virtual void setMarginsBackgroundColor(const QColor &col);\n    virtual void setMarginsFont(const QFont &f);\n    virtual void setMarginsForegroundColor(const QColor &col);\n\n    virtual void setMarginLineNumbers(int margin, bool lnrs);\n    virtual void setMarginMarkerMask(int margin, int mask);\n    virtual void setMarginSensitivity(int margin, bool sens);\n    virtual void setMarginWidth(int margin, int width);\n    virtual void setMarginWidth(int margin, const QString &s);\n\n    virtual void setModified(bool m);\n    virtual void setPaper(const QColor &c);\n    virtual void setReadOnly(bool ro);\n    virtual void setSelection(int lineFrom, int indexFrom, int lineTo,\n            int indexTo);\n    virtual void setSelectionBackgroundColor(const QColor &col);\n    virtual void setSelectionForegroundColor(const QColor &col);\n    virtual void setTabIndents(bool indent);\n    virtual void setTabWidth(int width);\n    virtual void setText(const QString &text);\n    virtual void setUtf8(bool cp);\n    virtual void setWhitespaceVisibility(WhitespaceVisibility mode);\n    virtual void setWrapMode(WrapMode mode);\n\n    virtual void undo();\n    virtual void unindent(int line);\n\n    virtual void zoomIn(int range);\n    virtual void zoomIn();\n    virtual void zoomOut(int range);\n    virtual void zoomOut();\n    virtual void zoomTo(int size);\n\nsignals:\n    void cursorPositionChanged(int line, int index);\n    void copyAvailable(bool yes);\n\n%If (Qsci_Qt4)\n    void indicatorClicked(int line, int index, Qt::KeyboardModifiers state);\n%End\n%If (!Qsci_Qt4)\n    void indicatorClicked(int line, int index, Qt::ButtonState state);\n%End\n\n%If (Qsci_Qt4)\n    void indicatorReleased(int line, int index, Qt::KeyboardModifiers state);\n%End\n%If (!Qsci_Qt4)\n    void indicatorReleased(int line, int index, Qt::ButtonState state);\n%End\n\n    void linesChanged();\n\n%If (Qsci_Qt4)\n    void marginClicked(int margin, int line, Qt::KeyboardModifiers state);\n%End\n%If (!Qsci_Qt4)\n    void marginClicked(int margin, int line, Qt::ButtonState state);\n%End\n\n    void modificationAttempted();\n    void modificationChanged(bool m);\n    void selectionChanged();\n    void textChanged();\n    void userListActivated(int id, const QString &string);\n\nprotected:\n%If (Qsci_Qt4)\n    virtual bool event(QEvent *event);\n    virtual void changeEvent(QEvent *event);\n    virtual void contextMenuEvent(QContextMenuEvent *event);\n%End\n\nprivate:\n    QsciScintilla(const QsciScintilla &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qsciscintillabase3.sip",
    "content": "// This is the SIP interface definition for QsciScintillaBase.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciScintillaBase : QWidget\n{\n%TypeHeaderCode\n#include <Qsci/qsciscintillabase.h>\n%End\n\npublic:\n    enum {\n        SCI_START,\n        SCI_OPTIONAL_START,\n        SCI_LEXER_START,\n        SCI_ADDTEXT,\n        SCI_ADDSTYLEDTEXT,\n        SCI_INSERTTEXT,\n        SCI_CLEARALL,\n        SCI_CLEARDOCUMENTSTYLE,\n        SCI_GETLENGTH,\n        SCI_GETCHARAT,\n        SCI_GETCURRENTPOS,\n        SCI_GETANCHOR,\n        SCI_GETSTYLEAT,\n        SCI_REDO,\n        SCI_SETUNDOCOLLECTION,\n        SCI_SELECTALL,\n        SCI_SETSAVEPOINT,\n        SCI_GETSTYLEDTEXT,\n        SCI_CANREDO,\n        SCI_MARKERLINEFROMHANDLE,\n        SCI_MARKERDELETEHANDLE,\n        SCI_GETUNDOCOLLECTION,\n        SCI_GETVIEWWS,\n        SCI_SETVIEWWS,\n        SCI_POSITIONFROMPOINT,\n        SCI_POSITIONFROMPOINTCLOSE,\n        SCI_GOTOLINE,\n        SCI_GOTOPOS,\n        SCI_SETANCHOR,\n        SCI_GETCURLINE,\n        SCI_GETENDSTYLED,\n        SCI_CONVERTEOLS,\n        SCI_GETEOLMODE,\n        SCI_SETEOLMODE,\n        SCI_STARTSTYLING,\n        SCI_SETSTYLING,\n        SCI_GETBUFFEREDDRAW,\n        SCI_SETBUFFEREDDRAW,\n        SCI_SETTABWIDTH,\n        SCI_GETTABWIDTH,\n        SCI_SETCODEPAGE,\n        SCI_MARKERDEFINE,\n        SCI_MARKERSETFORE,\n        SCI_MARKERSETBACK,\n        SCI_MARKERADD,\n        SCI_MARKERDELETE,\n        SCI_MARKERDELETEALL,\n        SCI_MARKERGET,\n        SCI_MARKERNEXT,\n        SCI_MARKERPREVIOUS,\n        SCI_MARKERDEFINEPIXMAP,\n        SCI_SETMARGINTYPEN,\n        SCI_GETMARGINTYPEN,\n        SCI_SETMARGINWIDTHN,\n        SCI_GETMARGINWIDTHN,\n        SCI_SETMARGINMASKN,\n        SCI_GETMARGINMASKN,\n        SCI_SETMARGINSENSITIVEN,\n        SCI_GETMARGINSENSITIVEN,\n        SCI_SETMARGINCURSORN,\n        SCI_GETMARGINCURSORN,\n        SCI_STYLECLEARALL,\n        SCI_STYLESETFORE,\n        SCI_STYLESETBACK,\n        SCI_STYLESETBOLD,\n        SCI_STYLESETITALIC,\n        SCI_STYLESETSIZE,\n        SCI_STYLESETFONT,\n        SCI_STYLESETEOLFILLED,\n        SCI_STYLERESETDEFAULT,\n        SCI_STYLESETUNDERLINE,\n        SCI_STYLESETCASE,\n        SCI_STYLESETCHARACTERSET,\n        SCI_SETSELFORE,\n        SCI_SETSELBACK,\n        SCI_SETCARETFORE,\n        SCI_ASSIGNCMDKEY,\n        SCI_CLEARCMDKEY,\n        SCI_CLEARALLCMDKEYS,\n        SCI_SETSTYLINGEX,\n        SCI_STYLESETVISIBLE,\n        SCI_GETCARETPERIOD,\n        SCI_SETCARETPERIOD,\n        SCI_SETWORDCHARS,\n        SCI_BEGINUNDOACTION,\n        SCI_ENDUNDOACTION,\n        SCI_INDICSETSTYLE,\n        SCI_INDICGETSTYLE,\n        SCI_INDICSETFORE,\n        SCI_INDICGETFORE,\n        SCI_SETWHITESPACEFORE,\n        SCI_SETWHITESPACEBACK,\n        SCI_SETWHITESPACESIZE,\n        SCI_GETWHITESPACESIZE,\n        SCI_SETSTYLEBITS,\n        SCI_GETSTYLEBITS,\n        SCI_SETLINESTATE,\n        SCI_GETLINESTATE,\n        SCI_GETMAXLINESTATE,\n        SCI_GETCARETLINEVISIBLE,\n        SCI_SETCARETLINEVISIBLE,\n        SCI_GETCARETLINEBACK,\n        SCI_SETCARETLINEBACK,\n        SCI_STYLESETCHANGEABLE,\n        SCI_AUTOCSHOW,\n        SCI_AUTOCCANCEL,\n        SCI_AUTOCACTIVE,\n        SCI_AUTOCPOSSTART,\n        SCI_AUTOCCOMPLETE,\n        SCI_AUTOCSTOPS,\n        SCI_AUTOCSETSEPARATOR,\n        SCI_AUTOCGETSEPARATOR,\n        SCI_AUTOCSELECT,\n        SCI_AUTOCSETCANCELATSTART,\n        SCI_AUTOCGETCANCELATSTART,\n        SCI_AUTOCSETFILLUPS,\n        SCI_AUTOCSETCHOOSESINGLE,\n        SCI_AUTOCGETCHOOSESINGLE,\n        SCI_AUTOCSETIGNORECASE,\n        SCI_AUTOCGETIGNORECASE,\n        SCI_USERLISTSHOW,\n        SCI_AUTOCSETAUTOHIDE,\n        SCI_AUTOCGETAUTOHIDE,\n        SCI_AUTOCSETDROPRESTOFWORD,\n        SCI_AUTOCGETDROPRESTOFWORD,\n        SCI_SETINDENT,\n        SCI_GETINDENT,\n        SCI_SETUSETABS,\n        SCI_GETUSETABS,\n        SCI_SETLINEINDENTATION,\n        SCI_GETLINEINDENTATION,\n        SCI_GETLINEINDENTPOSITION,\n        SCI_GETCOLUMN,\n        SCI_SETHSCROLLBAR,\n        SCI_GETHSCROLLBAR,\n        SCI_SETINDENTATIONGUIDES,\n        SCI_GETINDENTATIONGUIDES,\n        SCI_SETHIGHLIGHTGUIDE,\n        SCI_GETHIGHLIGHTGUIDE,\n        SCI_GETLINEENDPOSITION,\n        SCI_GETCODEPAGE,\n        SCI_GETCARETFORE,\n        SCI_GETREADONLY,\n        SCI_SETCURRENTPOS,\n        SCI_SETSELECTIONSTART,\n        SCI_GETSELECTIONSTART,\n        SCI_SETSELECTIONEND,\n        SCI_GETSELECTIONEND,\n        SCI_SETPRINTMAGNIFICATION,\n        SCI_GETPRINTMAGNIFICATION,\n        SCI_SETPRINTCOLOURMODE,\n        SCI_GETPRINTCOLOURMODE,\n        SCI_FINDTEXT,\n        SCI_FORMATRANGE,\n        SCI_GETFIRSTVISIBLELINE,\n        SCI_GETLINE,\n        SCI_GETLINECOUNT,\n        SCI_SETMARGINLEFT,\n        SCI_GETMARGINLEFT,\n        SCI_SETMARGINRIGHT,\n        SCI_GETMARGINRIGHT,\n        SCI_GETMODIFY,\n        SCI_SETSEL,\n        SCI_GETSELTEXT,\n        SCI_GETTEXTRANGE,\n        SCI_HIDESELECTION,\n        SCI_POINTXFROMPOSITION,\n        SCI_POINTYFROMPOSITION,\n        SCI_LINEFROMPOSITION,\n        SCI_POSITIONFROMLINE,\n        SCI_LINESCROLL,\n        SCI_SCROLLCARET,\n        SCI_REPLACESEL,\n        SCI_SETREADONLY,\n        SCI_NULL,\n        SCI_CANPASTE,\n        SCI_CANUNDO,\n        SCI_EMPTYUNDOBUFFER,\n        SCI_UNDO,\n        SCI_CUT,\n        SCI_COPY,\n        SCI_PASTE,\n        SCI_CLEAR,\n        SCI_SETTEXT,\n        SCI_GETTEXT,\n        SCI_GETTEXTLENGTH,\n        SCI_GETDIRECTFUNCTION,\n        SCI_GETDIRECTPOINTER,\n        SCI_SETOVERTYPE,\n        SCI_GETOVERTYPE,\n        SCI_SETCARETWIDTH,\n        SCI_GETCARETWIDTH,\n        SCI_SETTARGETSTART,\n        SCI_GETTARGETSTART,\n        SCI_SETTARGETEND,\n        SCI_GETTARGETEND,\n        SCI_REPLACETARGET,\n        SCI_REPLACETARGETRE,\n        SCI_SEARCHINTARGET,\n        SCI_SETSEARCHFLAGS,\n        SCI_GETSEARCHFLAGS,\n        SCI_CALLTIPSHOW,\n        SCI_CALLTIPCANCEL,\n        SCI_CALLTIPACTIVE,\n        SCI_CALLTIPPOSSTART,\n        SCI_CALLTIPSETHLT,\n        SCI_CALLTIPSETBACK,\n        SCI_CALLTIPSETFORE,\n        SCI_CALLTIPSETFOREHLT,\n        SCI_AUTOCSETMAXWIDTH,\n        SCI_AUTOCGETMAXWIDTH,\n        SCI_AUTOCSETMAXHEIGHT,\n        SCI_AUTOCGETMAXHEIGHT,\n        SCI_CALLTIPUSESTYLE,\n        SCI_VISIBLEFROMDOCLINE,\n        SCI_DOCLINEFROMVISIBLE,\n        SCI_SETFOLDLEVEL,\n        SCI_GETFOLDLEVEL,\n        SCI_GETLASTCHILD,\n        SCI_GETFOLDPARENT,\n        SCI_SHOWLINES,\n        SCI_HIDELINES,\n        SCI_GETLINEVISIBLE,\n        SCI_SETFOLDEXPANDED,\n        SCI_GETFOLDEXPANDED,\n        SCI_TOGGLEFOLD,\n        SCI_ENSUREVISIBLE,\n        SCI_SETFOLDFLAGS,\n        SCI_ENSUREVISIBLEENFORCEPOLICY,\n        SCI_WRAPCOUNT,\n        SCI_SETTABINDENTS,\n        SCI_GETTABINDENTS,\n        SCI_SETBACKSPACEUNINDENTS,\n        SCI_GETBACKSPACEUNINDENTS,\n        SCI_SETMOUSEDWELLTIME,\n        SCI_GETMOUSEDWELLTIME,\n        SCI_WORDSTARTPOSITION,\n        SCI_WORDENDPOSITION,\n        SCI_SETWRAPMODE,\n        SCI_GETWRAPMODE,\n        SCI_SETLAYOUTCACHE,\n        SCI_GETLAYOUTCACHE,\n        SCI_SETSCROLLWIDTH,\n        SCI_GETSCROLLWIDTH,\n        SCI_TEXTWIDTH,\n        SCI_SETENDATLASTLINE,\n        SCI_GETENDATLASTLINE,\n        SCI_TEXTHEIGHT,\n        SCI_SETVSCROLLBAR,\n        SCI_GETVSCROLLBAR,\n        SCI_APPENDTEXT,\n        SCI_GETTWOPHASEDRAW,\n        SCI_SETTWOPHASEDRAW,\n        SCI_AUTOCGETTYPESEPARATOR,\n        SCI_AUTOCSETTYPESEPARATOR,\n        SCI_TARGETFROMSELECTION,\n        SCI_LINESJOIN,\n        SCI_LINESSPLIT,\n        SCI_SETFOLDMARGINCOLOUR,\n        SCI_SETFOLDMARGINHICOLOUR,\n        SCI_MARKERSETBACKSELECTED,\n        SCI_MARKERENABLEHIGHLIGHT,\n        SCI_LINEDOWN,\n        SCI_LINEDOWNEXTEND,\n        SCI_LINEUP,\n        SCI_LINEUPEXTEND,\n        SCI_CHARLEFT,\n        SCI_CHARLEFTEXTEND,\n        SCI_CHARRIGHT,\n        SCI_CHARRIGHTEXTEND,\n        SCI_WORDLEFT,\n        SCI_WORDLEFTEXTEND,\n        SCI_WORDRIGHT,\n        SCI_WORDRIGHTEXTEND,\n        SCI_HOME,\n        SCI_HOMEEXTEND,\n        SCI_LINEEND,\n        SCI_LINEENDEXTEND,\n        SCI_DOCUMENTSTART,\n        SCI_DOCUMENTSTARTEXTEND,\n        SCI_DOCUMENTEND,\n        SCI_DOCUMENTENDEXTEND,\n        SCI_PAGEUP,\n        SCI_PAGEUPEXTEND,\n        SCI_PAGEDOWN,\n        SCI_PAGEDOWNEXTEND,\n        SCI_EDITTOGGLEOVERTYPE,\n        SCI_CANCEL,\n        SCI_DELETEBACK,\n        SCI_TAB,\n        SCI_BACKTAB,\n        SCI_NEWLINE,\n        SCI_FORMFEED,\n        SCI_VCHOME,\n        SCI_VCHOMEEXTEND,\n        SCI_ZOOMIN,\n        SCI_ZOOMOUT,\n        SCI_DELWORDLEFT,\n        SCI_DELWORDRIGHT,\n        SCI_LINECUT,\n        SCI_LINEDELETE,\n        SCI_LINETRANSPOSE,\n        SCI_LOWERCASE,\n        SCI_UPPERCASE,\n        SCI_LINESCROLLDOWN,\n        SCI_LINESCROLLUP,\n        SCI_DELETEBACKNOTLINE,\n        SCI_HOMEDISPLAY,\n        SCI_HOMEDISPLAYEXTEND,\n        SCI_LINEENDDISPLAY,\n        SCI_LINEENDDISPLAYEXTEND,\n        SCI_MOVECARETINSIDEVIEW,\n        SCI_LINELENGTH,\n        SCI_BRACEHIGHLIGHT,\n        SCI_BRACEBADLIGHT,\n        SCI_BRACEMATCH,\n        SCI_GETVIEWEOL,\n        SCI_SETVIEWEOL,\n        SCI_GETDOCPOINTER,\n        SCI_SETDOCPOINTER,\n        SCI_SETMODEVENTMASK,\n        SCI_GETEDGECOLUMN,\n        SCI_SETEDGECOLUMN,\n        SCI_GETEDGEMODE,\n        SCI_SETEDGEMODE,\n        SCI_GETEDGECOLOUR,\n        SCI_SETEDGECOLOUR,\n        SCI_SEARCHANCHOR,\n        SCI_SEARCHNEXT,\n        SCI_SEARCHPREV,\n        SCI_LINESONSCREEN,\n        SCI_USEPOPUP,\n        SCI_SELECTIONISRECTANGLE,\n        SCI_SETZOOM,\n        SCI_GETZOOM,\n        SCI_CREATEDOCUMENT,\n        SCI_ADDREFDOCUMENT,\n        SCI_RELEASEDOCUMENT,\n        SCI_GETMODEVENTMASK,\n        SCI_SETFOCUS,\n        SCI_GETFOCUS,\n        SCI_SETSTATUS,\n        SCI_GETSTATUS,\n        SCI_SETMOUSEDOWNCAPTURES,\n        SCI_GETMOUSEDOWNCAPTURES,\n        SCI_SETCURSOR,\n        SCI_GETCURSOR,\n        SCI_SETCONTROLCHARSYMBOL,\n        SCI_GETCONTROLCHARSYMBOL,\n        SCI_WORDPARTLEFT,\n        SCI_WORDPARTLEFTEXTEND,\n        SCI_WORDPARTRIGHT,\n        SCI_WORDPARTRIGHTEXTEND,\n        SCI_SETVISIBLEPOLICY,\n        SCI_DELLINELEFT,\n        SCI_DELLINERIGHT,\n        SCI_SETXOFFSET,\n        SCI_GETXOFFSET,\n        SCI_CHOOSECARETX,\n        SCI_GRABFOCUS,\n        SCI_SETXCARETPOLICY,\n        SCI_SETYCARETPOLICY,\n        SCI_LINEDUPLICATE,\n        SCI_REGISTERIMAGE,\n        SCI_SETPRINTWRAPMODE,\n        SCI_GETPRINTWRAPMODE,\n        SCI_CLEARREGISTEREDIMAGES,\n        SCI_STYLESETHOTSPOT,\n        SCI_SETHOTSPOTACTIVEFORE,\n        SCI_SETHOTSPOTACTIVEBACK,\n        SCI_SETHOTSPOTACTIVEUNDERLINE,\n        SCI_SETHOTSPOTSINGLELINE,\n        SCI_PARADOWN,\n        SCI_PARADOWNEXTEND,\n        SCI_PARAUP,\n        SCI_PARAUPEXTEND,\n        SCI_POSITIONBEFORE,\n        SCI_POSITIONAFTER,\n        SCI_COPYRANGE,\n        SCI_COPYTEXT,\n        SCI_SETSELECTIONMODE,\n        SCI_GETSELECTIONMODE,\n        SCI_GETLINESELSTARTPOSITION,\n        SCI_GETLINESELENDPOSITION,\n        SCI_LINEDOWNRECTEXTEND,\n        SCI_LINEUPRECTEXTEND,\n        SCI_CHARLEFTRECTEXTEND,\n        SCI_CHARRIGHTRECTEXTEND,\n        SCI_HOMERECTEXTEND,\n        SCI_VCHOMERECTEXTEND,\n        SCI_LINEENDRECTEXTEND,\n        SCI_PAGEUPRECTEXTEND,\n        SCI_PAGEDOWNRECTEXTEND,\n        SCI_STUTTEREDPAGEUP,\n        SCI_STUTTEREDPAGEUPEXTEND,\n        SCI_STUTTEREDPAGEDOWN,\n        SCI_STUTTEREDPAGEDOWNEXTEND,\n        SCI_WORDLEFTEND,\n        SCI_WORDLEFTENDEXTEND,\n        SCI_WORDRIGHTEND,\n        SCI_WORDRIGHTENDEXTEND,\n        SCI_SETWHITESPACECHARS,\n        SCI_SETCHARSDEFAULT,\n        SCI_AUTOCGETCURRENT,\n        SCI_ALLOCATE,\n        SCI_HOMEWRAP,\n        SCI_HOMEWRAPEXTEND,\n        SCI_LINEENDWRAP,\n        SCI_LINEENDWRAPEXTEND,\n        SCI_VCHOMEWRAP,\n        SCI_VCHOMEWRAPEXTEND,\n        SCI_LINECOPY,\n        SCI_FINDCOLUMN,\n        SCI_GETCARETSTICKY,\n        SCI_SETCARETSTICKY,\n        SCI_TOGGLECARETSTICKY,\n        SCI_SETWRAPVISUALFLAGS,\n        SCI_GETWRAPVISUALFLAGS,\n        SCI_SETWRAPVISUALFLAGSLOCATION,\n        SCI_GETWRAPVISUALFLAGSLOCATION,\n        SCI_SETWRAPSTARTINDENT,\n        SCI_GETWRAPSTARTINDENT,\n        SCI_MARKERADDSET,\n        SCI_SETPASTECONVERTENDINGS,\n        SCI_GETPASTECONVERTENDINGS,\n        SCI_SELECTIONDUPLICATE,\n        SCI_SETCARETLINEBACKALPHA,\n        SCI_GETCARETLINEBACKALPHA,\n        SCI_SETWRAPINDENTMODE,\n        SCI_GETWRAPINDENTMODE,\n        SCI_MARKERSETALPHA,\n        SCI_GETSELALPHA,\n        SCI_SETSELALPHA,\n        SCI_GETSELEOLFILLED,\n        SCI_SETSELEOLFILLED,\n        SCI_STYLEGETFORE,\n        SCI_STYLEGETBACK,\n        SCI_STYLEGETBOLD,\n        SCI_STYLEGETITALIC,\n        SCI_STYLEGETSIZE,\n        SCI_STYLEGETFONT,\n        SCI_STYLEGETEOLFILLED,\n        SCI_STYLEGETUNDERLINE,\n        SCI_STYLEGETCASE,\n        SCI_STYLEGETCHARACTERSET,\n        SCI_STYLEGETVISIBLE,\n        SCI_STYLEGETCHANGEABLE,\n        SCI_STYLEGETHOTSPOT,\n        SCI_GETHOTSPOTACTIVEFORE,\n        SCI_GETHOTSPOTACTIVEBACK,\n        SCI_GETHOTSPOTACTIVEUNDERLINE,\n        SCI_GETHOTSPOTSINGLELINE,\n        SCI_BRACEHIGHLIGHTINDICATOR,\n        SCI_BRACEBADLIGHTINDICATOR,\n        SCI_SETINDICATORCURRENT,\n        SCI_GETINDICATORCURRENT,\n        SCI_SETINDICATORVALUE,\n        SCI_GETINDICATORVALUE,\n        SCI_INDICATORFILLRANGE,\n        SCI_INDICATORCLEARRANGE,\n        SCI_INDICATORALLONFOR,\n        SCI_INDICATORVALUEAT,\n        SCI_INDICATORSTART,\n        SCI_INDICATOREND,\n        SCI_INDICSETUNDER,\n        SCI_INDICGETUNDER,\n        SCI_SETCARETSTYLE,\n        SCI_GETCARETSTYLE,\n        SCI_SETPOSITIONCACHE,\n        SCI_GETPOSITIONCACHE,\n        SCI_SETSCROLLWIDTHTRACKING,\n        SCI_GETSCROLLWIDTHTRACKING,\n        SCI_DELWORDRIGHTEND,\n        SCI_COPYALLOWLINE,\n        SCI_GETCHARACTERPOINTER,\n        SCI_SETKEYSUNICODE,\n        SCI_GETKEYSUNICODE,\n        SCI_INDICSETALPHA,\n        SCI_INDICGETALPHA,\n        SCI_SETEXTRAASCENT,\n        SCI_GETEXTRAASCENT,\n        SCI_SETEXTRADESCENT,\n        SCI_GETEXTRADESCENT,\n        SCI_MARKERSYMBOLDEFINED,\n        SCI_MARGINSETTEXT,\n        SCI_MARGINGETTEXT,\n        SCI_MARGINSETSTYLE,\n        SCI_MARGINGETSTYLE,\n        SCI_MARGINSETSTYLES,\n        SCI_MARGINGETSTYLES,\n        SCI_MARGINTEXTCLEARALL,\n        SCI_MARGINSETSTYLEOFFSET,\n        SCI_MARGINGETSTYLEOFFSET,\n        SCI_SETMARGINOPTIONS,\n        SCI_ANNOTATIONSETTEXT,\n        SCI_ANNOTATIONGETTEXT,\n        SCI_ANNOTATIONSETSTYLE,\n        SCI_ANNOTATIONGETSTYLE,\n        SCI_ANNOTATIONSETSTYLES,\n        SCI_ANNOTATIONGETSTYLES,\n        SCI_ANNOTATIONGETLINES,\n        SCI_ANNOTATIONCLEARALL,\n        SCI_ANNOTATIONSETVISIBLE,\n        SCI_ANNOTATIONGETVISIBLE,\n        SCI_ANNOTATIONSETSTYLEOFFSET,\n        SCI_ANNOTATIONGETSTYLEOFFSET,\n        SCI_SETEMPTYSELECTION,\n        SCI_GETMARGINOPTIONS,\n        SCI_INDICSETOUTLINEALPHA,\n        SCI_INDICGETOUTLINEALPHA,\n        SCI_ADDUNDOACTION,\n        SCI_CHARPOSITIONFROMPOINT,\n        SCI_CHARPOSITIONFROMPOINTCLOSE,\n        SCI_SETMULTIPLESELECTION,\n        SCI_GETMULTIPLESELECTION,\n        SCI_SETADDITIONALSELECTIONTYPING,\n        SCI_GETADDITIONALSELECTIONTYPING,\n        SCI_SETADDITIONALCARETSBLINK,\n        SCI_GETADDITIONALCARETSBLINK,\n        SCI_SCROLLRANGE,\n        SCI_SETADDITIONALCARETSVISIBLE,\n        SCI_GETADDITIONALCARETSVISIBLE,\n        SCI_AUTOCGETCURRENTTEXT,\n        SCI_GETSELECTIONS,\n        SCI_CLEARSELECTIONS,\n        SCI_SETSELECTION,\n        SCI_ADDSELECTION,\n        SCI_SETMAINSELECTION,\n        SCI_GETMAINSELECTION,\n        SCI_SETSELECTIONNCARET,\n        SCI_GETSELECTIONNCARET,\n        SCI_SETSELECTIONNANCHOR,\n        SCI_GETSELECTIONNANCHOR,\n        SCI_SETSELECTIONNCARETVIRTUALSPACE,\n        SCI_GETSELECTIONNCARETVIRTUALSPACE,\n        SCI_SETSELECTIONNANCHORVIRTUALSPACE,\n        SCI_GETSELECTIONNANCHORVIRTUALSPACE,\n        SCI_SETSELECTIONNSTART,\n        SCI_GETSELECTIONNSTART,\n        SCI_SETSELECTIONNEND,\n        SCI_GETSELECTIONNEND,\n        SCI_SETRECTANGULARSELECTIONCARET,\n        SCI_GETRECTANGULARSELECTIONCARET,\n        SCI_SETRECTANGULARSELECTIONANCHOR,\n        SCI_GETRECTANGULARSELECTIONANCHOR,\n        SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE,\n        SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE,\n        SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE,\n        SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE,\n        SCI_SETVIRTUALSPACEOPTIONS,\n        SCI_GETVIRTUALSPACEOPTIONS,\n        SCI_SETRECTANGULARSELECTIONMODIFIER,\n        SCI_GETRECTANGULARSELECTIONMODIFIER,\n        SCI_SETADDITIONALSELFORE,\n        SCI_SETADDITIONALSELBACK,\n        SCI_SETADDITIONALSELALPHA,\n        SCI_GETADDITIONALSELALPHA,\n        SCI_SETADDITIONALCARETFORE,\n        SCI_GETADDITIONALCARETFORE,\n        SCI_ROTATESELECTION,\n        SCI_SWAPMAINANCHORCARET,\n        SCI_SETFONTQUALITY,\n        SCI_GETFONTQUALITY,\n        SCI_SETFIRSTVISIBLELINE,\n        SCI_SETMULTIPASTE,\n        SCI_GETMULTIPASTE,\n        SCI_GETTAG,\n        SCI_CHANGELEXERSTATE,\n        SCI_CONTRACTEDFOLDNEXT,\n        SCI_VERTICALCENTRECARET,\n        SCI_MOVESELECTEDLINESUP,\n        SCI_MOVESELECTEDLINESDOWN,\n        SCI_SETIDENTIFIER,\n        SCI_GETIDENTIFIER,\n        SCI_RGBAIMAGESETWIDTH,\n        SCI_RGBAIMAGESETHEIGHT,\n        SCI_MARKERDEFINERGBAIMAGE,\n        SCI_REGISTERRGBAIMAGE,\n        SCI_SCROLLTOSTART,\n        SCI_SCROLLTOEND,\n        SCI_STARTRECORD,\n        SCI_STOPRECORD,\n        SCI_SETLEXER,\n        SCI_GETLEXER,\n        SCI_COLOURISE,\n        SCI_SETPROPERTY,\n        SCI_SETKEYWORDS,\n        SCI_SETLEXERLANGUAGE,\n        SCI_LOADLEXERLIBRARY,\n        SCI_GETPROPERTY,\n        SCI_GETPROPERTYEXPANDED,\n        SCI_GETPROPERTYINT,\n        SCI_GETSTYLEBITSNEEDED,\n        SCI_GETLEXERLANGUAGE,\n        SCI_PRIVATELEXERCALL,\n        SCI_PROPERTYNAMES,\n        SCI_PROPERTYTYPE,\n        SCI_DESCRIBEPROPERTY,\n        SCI_DESCRIBEKEYWORDSETS,\n\n        SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR,\n        SCI_AUTOCGETCASEINSENSITIVEBEHAVIOUR,\n        SCI_CALLTIPSETPOSITION,\n        SCI_COUNTCHARACTERS,\n        SCI_CREATELOADER,\n        SCI_DELETERANGE,\n        SCI_FINDINDICATORFLASH,\n        SCI_FINDINDICATORHIDE,\n        SCI_FINDINDICATORSHOW,\n        SCI_GETALLLINESVISIBLE,\n        SCI_GETGAPPOSITION,\n        SCI_GETPUNCTUATIONCHARS,\n        SCI_GETRANGEPOINTER,\n        SCI_GETSELECTIONEMPTY,\n        SCI_GETTECHNOLOGY,\n        SCI_GETWHITESPACECHARS,\n        SCI_GETWORDCHARS,\n        SCI_RGBAIMAGESETSCALE,\n        SCI_SETPUNCTUATIONCHARS,\n        SCI_SETTECHNOLOGY,\n        SCI_STYLESETSIZEFRACTIONAL,\n        SCI_STYLEGETSIZEFRACTIONAL,\n        SCI_STYLESETWEIGHT,             \n        SCI_STYLEGETWEIGHT,\n\n        SCI_FOLDLINE,\n        SCI_FOLDCHILDREN,\n        SCI_EXPANDCHILDREN,\n        SCI_FOLDALL,\n        SCI_SETAUTOMATICFOLD,\n        SCI_GETAUTOMATICFOLD,\n        SCI_AUTOCSETORDER,\n        SCI_AUTOCGETORDER,\n        SCI_POSITIONRELATIVE,\n        SCI_RELEASEALLEXTENDEDSTYLES,\n        SCI_ALLOCATEEXTENDEDSTYLES,\n        SCI_SETMOUSESELECTIONRECTANGULARSWITCH,\n        SCI_GETMOUSESELECTIONRECTANGULARSWITCH,\n        SCI_GETCARETLINEVISIBLEALWAYS,\n        SCI_SETCARETLINEVISIBLEALWAYS,\n        SCI_SETREPRESENTATION,\n        SCI_GETREPRESENTATION,\n        SCI_CLEARREPRESENTATION,\n    };\n\n    enum {\n        SC_ALPHA_TRANSPARENT,\n        SC_ALPHA_OPAQUE,\n        SC_ALPHA_NOALPHA,\n    };\n\n    enum {\n        SC_CARETSTICKY_OFF,\n        SC_CARETSTICKY_ON,\n        SC_CARETSTICKY_WHITESPACE,\n    };\n\n    enum {\n        SC_EFF_QUALITY_MASK,\n        SC_EFF_QUALITY_DEFAULT,\n        SC_EFF_QUALITY_NON_ANTIALIASED,\n        SC_EFF_QUALITY_ANTIALIASED,\n        SC_EFF_QUALITY_LCD_OPTIMIZED,\n    };\n\n    enum {\n        SC_MARGINOPTION_NONE,\n        SC_MARGINOPTION_SUBLINESELECT,\n    };\n\n    enum {\n        SC_MULTIPASTE_ONCE,\n        SC_MULTIPASTE_EACH,\n    };\n\n    enum {\n        SC_TYPE_BOOLEAN,\n        SC_TYPE_INTEGER,\n        SC_TYPE_STRING,\n    };\n\n    enum {\n        SC_UPDATE_CONTENT,\n        SC_UPDATE_SELECTION,\n        SC_UPDATE_V_SCROLL,\n        SC_UPDATE_H_SCROLL,\n    };\n\n    enum {\n        SC_WRAPVISUALFLAG_NONE,\n        SC_WRAPVISUALFLAG_END,\n        SC_WRAPVISUALFLAG_START,\n        SC_WRAPVISUALFLAG_MARGIN,\n    };\n\n    enum {\n        SC_WRAPVISUALFLAGLOC_DEFAULT,\n        SC_WRAPVISUALFLAGLOC_END_BY_TEXT,\n        SC_WRAPVISUALFLAGLOC_START_BY_TEXT\n    };\n\n    enum {\n        SC_SEL_STREAM,\n        SC_SEL_RECTANGLE,\n        SC_SEL_LINES,\n        SC_SEL_THIN,\n    };\n\n    enum {\n        SCVS_NONE,\n        SCVS_RECTANGULARSELECTION,\n        SCVS_USERACCESSIBLE,\n    };\n\n    enum {\n        SCWS_INVISIBLE,\n        SCWS_VISIBLEALWAYS,\n        SCWS_VISIBLEAFTERINDENT\n    };\n\n    enum {\n        SC_EOL_CRLF,\n        SC_EOL_CR,\n        SC_EOL_LF\n    };\n\n    enum {\n        SC_CP_DBCS,\n        SC_CP_UTF8\n    };\n\n    enum {\n        SC_MARK_CIRCLE,\n        SC_MARK_ROUNDRECT,\n        SC_MARK_ARROW,\n        SC_MARK_SMALLRECT,\n        SC_MARK_SHORTARROW,\n        SC_MARK_EMPTY,\n        SC_MARK_ARROWDOWN,\n        SC_MARK_MINUS,\n        SC_MARK_PLUS,\n        SC_MARK_VLINE,\n        SC_MARK_LCORNER,\n        SC_MARK_TCORNER,\n        SC_MARK_BOXPLUS,\n        SC_MARK_BOXPLUSCONNECTED,\n        SC_MARK_BOXMINUS,\n        SC_MARK_BOXMINUSCONNECTED,\n        SC_MARK_LCORNERCURVE,\n        SC_MARK_TCORNERCURVE,\n        SC_MARK_CIRCLEPLUS,\n        SC_MARK_CIRCLEPLUSCONNECTED,\n        SC_MARK_CIRCLEMINUS,\n        SC_MARK_CIRCLEMINUSCONNECTED,\n        SC_MARK_BACKGROUND,\n        SC_MARK_DOTDOTDOT,\n        SC_MARK_ARROWS,\n        SC_MARK_PIXMAP,\n        SC_MARK_FULLRECT,\n        SC_MARK_LEFTRECT,\n        SC_MARK_AVAILABLE,\n        SC_MARK_UNDERLINE,\n        SC_MARK_RGBAIMAGE,\n        SC_MARK_CHARACTER\n    };\n\n    enum {\n        SC_MARKNUM_FOLDEREND,\n        SC_MARKNUM_FOLDEROPENMID,\n        SC_MARKNUM_FOLDERMIDTAIL,\n        SC_MARKNUM_FOLDERTAIL,\n        SC_MARKNUM_FOLDERSUB,\n        SC_MARKNUM_FOLDER,\n        SC_MARKNUM_FOLDEROPEN,\n        SC_MASK_FOLDERS\n    };\n\n    enum {\n        SC_MARGIN_SYMBOL,\n        SC_MARGIN_NUMBER,\n        SC_MARGIN_BACK,\n        SC_MARGIN_FORE,\n        SC_MARGIN_TEXT,\n        SC_MARGIN_RTEXT,\n    };\n\n    enum {\n        STYLE_DEFAULT,\n        STYLE_LINENUMBER,\n        STYLE_BRACELIGHT,\n        STYLE_BRACEBAD,\n        STYLE_CONTROLCHAR,\n        STYLE_INDENTGUIDE,\n        STYLE_CALLTIP,\n        STYLE_LASTPREDEFINED,\n        STYLE_MAX\n    };\n\n    enum {\n        SC_CHARSET_ANSI,\n        SC_CHARSET_DEFAULT,\n        SC_CHARSET_BALTIC,\n        SC_CHARSET_CHINESEBIG5,\n        SC_CHARSET_EASTEUROPE,\n        SC_CHARSET_GB2312,\n        SC_CHARSET_GREEK,\n        SC_CHARSET_HANGUL,\n        SC_CHARSET_MAC,\n        SC_CHARSET_OEM,\n        SC_CHARSET_RUSSIAN,\n        SC_CHARSET_SHIFTJIS,\n        SC_CHARSET_SYMBOL,\n        SC_CHARSET_TURKISH,\n        SC_CHARSET_JOHAB,\n        SC_CHARSET_HEBREW,\n        SC_CHARSET_ARABIC,\n        SC_CHARSET_VIETNAMESE,\n        SC_CHARSET_THAI,\n        SC_CHARSET_8859_15,\n    };\n\n    enum {\n        SC_CASE_MIXED,\n        SC_CASE_UPPER,\n        SC_CASE_LOWER\n    };\n\n    enum\n    {\n        SC_IV_NONE,\n        SC_IV_REAL,\n        SC_IV_LOOKFORWARD,\n        SC_IV_LOOKBOTH\n    };\n\n    enum {\n        INDIC_PLAIN,\n        INDIC_SQUIGGLE,\n        INDIC_TT,\n        INDIC_DIAGONAL,\n        INDIC_STRIKE,\n        INDIC_HIDDEN,\n        INDIC_BOX,\n        INDIC_ROUNDBOX,\n        INDIC_STRAIGHTBOX,\n        INDIC_DASH,\n        INDIC_DOTS,\n        INDIC_SQUIGGLELOW,\n        INDIC_DOTBOX,\n        INDIC_SQUIGGLEPIXMAP,\n        INDIC_COMPOSITIONTHICK,\n\n        INDIC_CONTAINER,\n        INDIC_MAX,\n        INDIC0_MASK,\n        INDIC1_MASK,\n        INDIC2_MASK,\n        INDICS_MASK\n    };\n\n    enum {\n        SC_PRINT_NORMAL,\n        SC_PRINT_INVERTLIGHT,\n        SC_PRINT_BLACKONWHITE,\n        SC_PRINT_COLOURONWHITE,\n        SC_PRINT_COLOURONWHITEDEFAULTBG\n    };\n\n    enum {\n        SCFIND_WHOLEWORD,\n        SCFIND_MATCHCASE,\n        SCFIND_WORDSTART,\n        SCFIND_REGEXP,\n        SCFIND_POSIX\n    };\n\n    enum {\n        SC_FOLDLEVELBASE,\n        SC_FOLDLEVELWHITEFLAG,\n        SC_FOLDLEVELHEADERFLAG,\n        SC_FOLDLEVELNUMBERMASK\n    };\n\n    enum\n    {\n        SC_FOLDFLAG_LINEBEFORE_EXPANDED,\n        SC_FOLDFLAG_LINEBEFORE_CONTRACTED,\n        SC_FOLDFLAG_LINEAFTER_EXPANDED,\n        SC_FOLDFLAG_LINEAFTER_CONTRACTED,\n        SC_FOLDFLAG_LEVELNUMBERS\n    };\n\n    enum {\n        SC_TIME_FOREVER\n    };\n\n    enum {\n        SC_WRAP_NONE,\n        SC_WRAP_WORD,\n        SC_WRAP_CHAR,\n    };\n\n    enum {\n        SC_WRAPINDENT_FIXED,\n        SC_WRAPINDENT_SAME,\n        SC_WRAPINDENT_INDENT,\n    };\n\n    enum {\n        SC_CACHE_NONE,\n        SC_CACHE_CARET,\n        SC_CACHE_PAGE,\n        SC_CACHE_DOCUMENT\n    };\n\n    enum {\n        ANNOTATION_HIDDEN,\n        ANNOTATION_STANDARD,\n        ANNOTATION_BOXED,\n    };\n\n    enum {\n        EDGE_NONE,\n        EDGE_LINE,\n        EDGE_BACKGROUND\n    };\n\n    enum {\n        SC_CURSORNORMAL,\n        SC_CURSORARROW,\n        SC_CURSORWAIT,\n        SC_CURSORREVERSEARROW\n    };\n\n    enum {\n        UNDO_MAY_COALESCE,\n    };\n\n    enum {\n        VISIBLE_SLOP,\n        VISIBLE_STRICT\n    };\n\n    enum {\n        CARET_SLOP,\n        CARET_STRICT,\n        CARET_JUMPS,\n        CARET_EVEN\n    };\n\n    enum\n    {\n        CARETSTYLE_INVISIBLE,\n        CARETSTYLE_LINE,\n        CARETSTYLE_BLOCK\n    };\n\n    enum {\n        SC_MOD_INSERTTEXT,\n        SC_MOD_DELETETEXT,\n        SC_MOD_CHANGESTYLE,\n        SC_MOD_CHANGEFOLD,\n        SC_PERFORMED_USER,\n        SC_PERFORMED_UNDO,\n        SC_PERFORMED_REDO,\n        SC_MULTISTEPUNDOREDO,\n        SC_LASTSTEPINUNDOREDO,\n        SC_MOD_CHANGEMARKER,\n        SC_MOD_BEFOREINSERT,\n        SC_MOD_BEFOREDELETE,\n        SC_MULTILINEUNDOREDO,\n        SC_STARTACTION,\n        SC_MOD_CHANGEINDICATOR,\n        SC_MOD_CHANGELINESTATE,\n        SC_MOD_CHANGEMARGIN,\n        SC_MOD_CHANGEANNOTATION,\n        SC_MOD_CONTAINER,\n        SC_MOD_LEXERSTATE,\n        SC_MODEVENTMASKALL\n    };\n\n    enum {\n        SCK_DOWN,\n        SCK_UP,\n        SCK_LEFT,\n        SCK_RIGHT,\n        SCK_HOME,\n        SCK_END,\n        SCK_PRIOR,\n        SCK_NEXT,\n        SCK_DELETE,\n        SCK_INSERT,\n        SCK_ESCAPE,\n        SCK_BACK,\n        SCK_TAB,\n        SCK_RETURN,\n        SCK_ADD,\n        SCK_SUBTRACT,\n        SCK_DIVIDE,\n        SCK_WIN,\n        SCK_RWIN,\n        SCK_MENU\n    };\n\n    enum {\n        SCMOD_NORM,\n        SCMOD_SHIFT,\n        SCMOD_CTRL,\n        SCMOD_ALT,\n        SCMOD_SUPER,\n        SCMOD_META,\n    };\n\n    enum {\n        SCLEX_CONTAINER,\n        SCLEX_NULL,\n        SCLEX_PYTHON,\n        SCLEX_CPP,\n        SCLEX_HTML,\n        SCLEX_XML,\n        SCLEX_PERL,\n        SCLEX_SQL,\n        SCLEX_VB,\n        SCLEX_PROPERTIES,\n        SCLEX_ERRORLIST,\n        SCLEX_MAKEFILE,\n        SCLEX_BATCH,\n        SCLEX_LATEX,\n        SCLEX_LUA,\n        SCLEX_DIFF,\n        SCLEX_CONF,\n        SCLEX_PASCAL,\n        SCLEX_AVE,\n        SCLEX_ADA,\n        SCLEX_LISP,\n        SCLEX_RUBY,\n        SCLEX_EIFFEL,\n        SCLEX_EIFFELKW,\n        SCLEX_TCL,\n        SCLEX_NNCRONTAB,\n        SCLEX_BULLANT,\n        SCLEX_VBSCRIPT,\n        SCLEX_ASP,\n        SCLEX_PHP,\n        SCLEX_BAAN,\n        SCLEX_MATLAB,\n        SCLEX_SCRIPTOL,\n        SCLEX_ASM,\n        SCLEX_CPPNOCASE,\n        SCLEX_FORTRAN,\n        SCLEX_F77,\n        SCLEX_CSS,\n        SCLEX_POV,\n        SCLEX_LOUT,\n        SCLEX_ESCRIPT,\n        SCLEX_PS,\n        SCLEX_NSIS,\n        SCLEX_MMIXAL,\n        SCLEX_CLW,\n        SCLEX_CLWNOCASE,\n        SCLEX_LOT,\n        SCLEX_YAML,\n        SCLEX_TEX,\n        SCLEX_METAPOST,\n        SCLEX_POWERBASIC,\n        SCLEX_FORTH,\n        SCLEX_ERLANG,\n        SCLEX_OCTAVE,\n        SCLEX_MSSQL,\n        SCLEX_VERILOG,\n        SCLEX_KIX,\n        SCLEX_GUI4CLI,\n        SCLEX_SPECMAN,\n        SCLEX_AU3,\n        SCLEX_APDL,\n        SCLEX_BASH,\n        SCLEX_ASN1,\n        SCLEX_VHDL,\n        SCLEX_CAML,\n        SCLEX_BLITZBASIC,\n        SCLEX_PUREBASIC,\n        SCLEX_HASKELL,\n        SCLEX_PHPSCRIPT,\n        SCLEX_TADS3,\n        SCLEX_REBOL,\n        SCLEX_SMALLTALK,\n        SCLEX_FLAGSHIP,\n        SCLEX_CSOUND,\n        SCLEX_FREEBASIC,\n        SCLEX_INNOSETUP,\n        SCLEX_OPAL,\n        SCLEX_SPICE,\n        SCLEX_D,\n        SCLEX_CMAKE,\n        SCLEX_GAP,\n        SCLEX_PLM,\n        SCLEX_PROGRESS,\n        SCLEX_ABAQUS,\n        SCLEX_ASYMPTOTE,\n        SCLEX_R,\n        SCLEX_MAGIK,\n        SCLEX_POWERSHELL,\n        SCLEX_MYSQL,\n        SCLEX_PO,\n        SCLEX_TAL,\n        SCLEX_COBOL,\n        SCLEX_TACL,\n        SCLEX_SORCUS,\n        SCLEX_POWERPRO,\n        SCLEX_NIMROD,\n        SCLEX_SML,\n        SCLEX_MARKDOWN,\n        SCLEX_TXT2TAGS,\n        SCLEX_A68K,\n        SCLEX_MODULA,\n        SCLEX_COFFEESCRIPT,\n        SCLEX_TCMD,\n        SCLEX_AVS,\n        SCLEX_ECL,\n        SCLEX_OSCRIPT,\n        SCLEX_VISUALPROLOG,\n        SCLEX_LITERATEHASKELL,\n        SCLEX_STTXT,\n        SCLEX_KVIRC,\n        SCLEX_RUST,\n    };\n\n    enum {\n        SC_WEIGHT_NORMAL,\n        SC_WEIGHT_SEMIBOLD,\n        SC_WEIGHT_BOLD,\n    };\n\n    enum {\n        SC_TECHNOLOGY_DEFAULT,\n        SC_TECHNOLOGY_DIRECTWRITE,\n    };\n\n    enum {\n        SC_CASEINSENSITIVEBEHAVIOUR_RESPECTCASE,\n        SC_CASEINSENSITIVEBEHAVIOUR_IGNORECASE,\n    };\n\n    enum {\n        SC_FONT_SIZE_MULTIPLIER,\n    };\n\n    enum\n    {\n        SC_FOLDACTION_CONTRACT,\n        SC_FOLDACTION_EXPAND,\n        SC_FOLDACTION_TOGGLE,\n    };\n\n    enum\n    {\n        SC_AUTOMATICFOLD_SHOW,\n        SC_AUTOMATICFOLD_CLICK,\n        SC_AUTOMATICFOLD_CHANGE,\n    };\n\n    enum\n    {\n        SC_ORDER_PRESORTED,\n        SC_ORDER_PERFORMSORT,\n        SC_ORDER_CUSTOM,\n    };\n    \n    QsciScintillaBase(QWidget *parent /TransferThis/ = 0, const char *name = 0,\n            WFlags f = 0);\n    virtual ~QsciScintillaBase();\n\n%ConvertToSubClassCode\nstatic struct class_graph {\n    const char *name;\n    sipTypeDef **type;\n    int yes, no;\n} graph[] = {\n    {sipName_QsciScintillaBase, &sipType_QsciScintillaBase, 4, 1},\n    {sipName_QsciMacro, &sipType_QsciMacro, -1, 2},\n    {sipName_QsciLexer, &sipType_QsciLexer, 5, 3},\n    {sipName_QsciAbstractAPIs, &sipType_QsciAbstractAPIs, 42, -1},\n    {sipName_QsciScintilla, &sipType_QsciScintilla, -1, -1},\n    {sipName_QsciLexerPO, &sipType_QsciLexerPO, -1, 6},\n    {sipName_QsciLexerBash, &sipType_QsciLexerBash, -1, 7},\n    {sipName_QsciLexerPython, &sipType_QsciLexerPython, -1, 8},\n    {sipName_QsciLexerSQL, &sipType_QsciLexerSQL, -1, 9},\n    {sipName_QsciLexerPascal, &sipType_QsciLexerPascal, -1, 10},\n    {sipName_QsciLexerDiff, &sipType_QsciLexerDiff, -1, 11},\n    {sipName_QsciLexerCustom, &sipType_QsciLexerCustom, -1, 12},\n    {sipName_QsciLexerPOV, &sipType_QsciLexerPOV, -1, 13},\n    {sipName_QsciLexerLua, &sipType_QsciLexerLua, -1, 14},\n    {sipName_QsciLexerSpice, &sipType_QsciLexerSpice, -1, 15},\n    {sipName_QsciLexerMatlab, &sipType_QsciLexerMatlab, 35, 16},\n    {sipName_QsciLexerCSS, &sipType_QsciLexerCSS, -1, 17},\n    {sipName_QsciLexerCMake, &sipType_QsciLexerCMake, -1, 18},\n    {sipName_QsciLexerVHDL, &sipType_QsciLexerVHDL, -1, 19},\n    {sipName_QsciLexerVerilog, &sipType_QsciLexerVerilog, -1, 20},\n    {sipName_QsciLexerHTML, &sipType_QsciLexerHTML, 36, 21},\n    {sipName_QsciLexerMakefile, &sipType_QsciLexerMakefile, -1, 22},\n    {sipName_QsciLexerPostScript, &sipType_QsciLexerPostScript, -1, 23},\n    {sipName_QsciLexerTCL, &sipType_QsciLexerTCL, -1, 24},\n    {sipName_QsciLexerAVS, &sipType_QsciLexerAVS, -1, 25},\n    {sipName_QsciLexerPerl, &sipType_QsciLexerPerl, -1, 26},\n    {sipName_QsciLexerCoffeeScript, &sipType_QsciLexerCoffeeScript, -1, 27},\n    {sipName_QsciLexerFortran77, &sipType_QsciLexerFortran77, 37, 28},\n    {sipName_QsciLexerYAML, &sipType_QsciLexerYAML, -1, 29},\n    {sipName_QsciLexerRuby, &sipType_QsciLexerRuby, -1, 30},\n    {sipName_QsciLexerProperties, &sipType_QsciLexerProperties, -1, 31},\n    {sipName_QsciLexerTeX, &sipType_QsciLexerTeX, -1, 32},\n    {sipName_QsciLexerD, &sipType_QsciLexerD, -1, 33},\n    {sipName_QsciLexerCPP, &sipType_QsciLexerCPP, 38, 34},\n    {sipName_QsciLexerBatch, &sipType_QsciLexerBatch, -1, -1},\n    {sipName_QsciLexerOctave, &sipType_QsciLexerOctave, -1, -1},\n    {sipName_QsciLexerXML, &sipType_QsciLexerXML, -1, -1},\n    {sipName_QsciLexerFortran, &sipType_QsciLexerFortran, -1, -1},\n    {sipName_QsciLexerJava, &sipType_QsciLexerJava, -1, 39},\n    {sipName_QsciLexerCSharp, &sipType_QsciLexerCSharp, -1, 40},\n    {sipName_QsciLexerIDL, &sipType_QsciLexerIDL, -1, 41},\n    {sipName_QsciLexerJavaScript, &sipType_QsciLexerJavaScript, -1, -1},\n    {sipName_QsciAPIs, &sipType_QsciAPIs, -1, -1},\n};\n\nint i = 0;\n\nsipType = NULL;\n\ndo\n{\n    struct class_graph *cg = &graph[i];\n\n    if (cg->name != NULL && sipCpp->inherits(cg->name))\n    {\n        sipType = *cg->type;\n        i = cg->yes;\n    }\n    else\n        i = cg->no;\n}\nwhile (i >= 0);\n%End\n\n    static QsciScintillaBase *pool();\n\n    long SendScintilla(unsigned int msg, unsigned long wParam = 0,\n            long lParam = 0) const;\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            void *lParam) const;\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            const char *lParam /DocType=\"Py_v3:bytes;str\", Encoding=\"None\"/) const;\n    long SendScintilla(unsigned int msg,\n            const char *lParam /DocType=\"Py_v3:bytes;str\", Encoding=\"None\"/); const\n    long SendScintilla(unsigned int msg,\n            const char *wParam /DocType=\"Py_v3:bytes;str\", Encoding=\"None\"/,\n            const char *lParam /DocType=\"Py_v3:bytes;str\", Encoding=\"None\"/) const;\n    long SendScintilla(unsigned int msg, long wParam) const;\n    //long SendScintilla(unsigned int msg, int wParam) const;\n    long SendScintilla(unsigned int msg, long cpMin, long cpMax,\n            char *lpstrText /DocType=\"Py_v3:bytes;str\", Encoding=\"None\"/) const;\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            const QColor &col) const;\n    long SendScintilla(unsigned int msg, const QColor &col) const;\n    long SendScintilla(unsigned int msg, unsigned long wParam, QPainter *hdc,\n            const QRect &rc, long cpMin, long cpMax) const;\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            const QPixmap &lParam) const;\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            const QImage &lParam) const;\n\n    void *SendScintillaPtrResult(unsigned int msg) const;\n\n    QScrollBar *horizontalScrollBar() const;\n    QScrollBar *verticalScrollBar() const;\n    QWidget *viewport() const;\n    virtual bool eventFilter(QObject *o, QEvent *e);\n\nsignals:\n    void QSCN_SELCHANGED(bool yes);\n\n    void SCEN_CHANGE();\n\n    void SCN_AUTOCCANCELLED();\n    void SCN_AUTOCCHARDELETED();\n    void SCN_AUTOCSELECTION(const char *selection, int position);\n    void SCN_CALLTIPCLICK(int direction);\n    void SCN_CHARADDED(int charadded);\n    void SCN_DOUBLECLICK(int position, int line, int modifiers);\n    void SCN_DWELLEND(int, int, int);\n    void SCN_DWELLSTART(int, int, int);\n    void SCN_FOCUSIN();\n    void SCN_FOCUSOUT();\n    void SCN_HOTSPOTCLICK(int position, int modifiers);\n    void SCN_HOTSPOTDOUBLECLICK(int position, int modifiers);\n    void SCN_HOTSPOTRELEASECLICK(int position, int modifiers);\n    void SCN_INDICATORCLICK(int position, int modifiers);\n    void SCN_INDICATORRELEASE(int position, int modifiers);\n    void SCN_MACRORECORD(unsigned int, unsigned long, void *);\n    void SCN_MARGINCLICK(int position, int modifiers, int margin);\n    void SCN_MODIFIED(int, int, const char *, int, int, int, int, int, int, int);\n    void SCN_MODIFYATTEMPTRO();\n    void SCN_NEEDSHOWN(int, int);\n    void SCN_PAINTED();\n    void SCN_SAVEPOINTLEFT();\n    void SCN_SAVEPOINTREACHED();\n    void SCN_STYLENEEDED(int position);\n    void SCN_UPDATEUI(int updated);\n    void SCN_USERLISTSELECTION(const char *, int);\n    void SCN_ZOOM();\n\nprotected:\n\n    virtual void contextMenuEvent(QContextMenuEvent *e);\n    virtual void dragEnterEvent(QDragEnterEvent *e);\n    virtual void dragLeaveEvent(QDragLeaveEvent *e);\n    virtual void dragMoveEvent(QDragMoveEvent *e);\n    virtual void dropEvent(QDropEvent *e);\n    virtual void focusInEvent(QFocusEvent *e);\n    virtual void focusOutEvent(QFocusEvent *e);\n    virtual bool focusNextPrevChild(bool next);\n    virtual void keyPressEvent(QKeyEvent *e);\n    virtual void mouseDoubleClickEvent(QMouseEvent *e);\n    virtual void mouseMoveEvent(QMouseEvent *e);\n    virtual void mousePressEvent(QMouseEvent *e);\n    virtual void mouseReleaseEvent(QMouseEvent *e);\n    virtual void paintEvent(QPaintEvent *e);\n    virtual void resizeEvent(QResizeEvent *e);\n\nprivate:\n    QsciScintillaBase(const QsciScintillaBase &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qsciscintillabase4.sip",
    "content": "// This is the SIP interface definition for QsciScintillaBase.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciScintillaBase : QAbstractScrollArea\n{\n%TypeHeaderCode\n#include <Qsci/qsciscintillabase.h>\n%End\n\npublic:\n    enum {\n        SCI_START,\n        SCI_OPTIONAL_START,\n        SCI_LEXER_START,\n        SCI_ADDTEXT,\n        SCI_ADDSTYLEDTEXT,\n        SCI_INSERTTEXT,\n        SCI_CLEARALL,\n        SCI_CLEARDOCUMENTSTYLE,\n        SCI_GETLENGTH,\n        SCI_GETCHARAT,\n        SCI_GETCURRENTPOS,\n        SCI_GETANCHOR,\n        SCI_GETSTYLEAT,\n        SCI_REDO,\n        SCI_SETUNDOCOLLECTION,\n        SCI_SELECTALL,\n        SCI_SETSAVEPOINT,\n        SCI_GETSTYLEDTEXT,\n        SCI_CANREDO,\n        SCI_MARKERLINEFROMHANDLE,\n        SCI_MARKERDELETEHANDLE,\n        SCI_GETUNDOCOLLECTION,\n        SCI_GETVIEWWS,\n        SCI_SETVIEWWS,\n        SCI_POSITIONFROMPOINT,\n        SCI_POSITIONFROMPOINTCLOSE,\n        SCI_GOTOLINE,\n        SCI_GOTOPOS,\n        SCI_SETANCHOR,\n        SCI_GETCURLINE,\n        SCI_GETENDSTYLED,\n        SCI_CONVERTEOLS,\n        SCI_GETEOLMODE,\n        SCI_SETEOLMODE,\n        SCI_STARTSTYLING,\n        SCI_SETSTYLING,\n        SCI_GETBUFFEREDDRAW,\n        SCI_SETBUFFEREDDRAW,\n        SCI_SETTABWIDTH,\n        SCI_GETTABWIDTH,\n        SCI_SETCODEPAGE,\n        SCI_MARKERDEFINE,\n        SCI_MARKERSETFORE,\n        SCI_MARKERSETBACK,\n        SCI_MARKERADD,\n        SCI_MARKERDELETE,\n        SCI_MARKERDELETEALL,\n        SCI_MARKERGET,\n        SCI_MARKERNEXT,\n        SCI_MARKERPREVIOUS,\n        SCI_MARKERDEFINEPIXMAP,\n        SCI_SETMARGINTYPEN,\n        SCI_GETMARGINTYPEN,\n        SCI_SETMARGINWIDTHN,\n        SCI_GETMARGINWIDTHN,\n        SCI_SETMARGINMASKN,\n        SCI_GETMARGINMASKN,\n        SCI_SETMARGINSENSITIVEN,\n        SCI_GETMARGINSENSITIVEN,\n        SCI_SETMARGINCURSORN,\n        SCI_GETMARGINCURSORN,\n        SCI_STYLECLEARALL,\n        SCI_STYLESETFORE,\n        SCI_STYLESETBACK,\n        SCI_STYLESETBOLD,\n        SCI_STYLESETITALIC,\n        SCI_STYLESETSIZE,\n        SCI_STYLESETFONT,\n        SCI_STYLESETEOLFILLED,\n        SCI_STYLERESETDEFAULT,\n        SCI_STYLESETUNDERLINE,\n        SCI_STYLESETCASE,\n        SCI_STYLESETCHARACTERSET,\n        SCI_SETSELFORE,\n        SCI_SETSELBACK,\n        SCI_SETCARETFORE,\n        SCI_ASSIGNCMDKEY,\n        SCI_CLEARCMDKEY,\n        SCI_CLEARALLCMDKEYS,\n        SCI_SETSTYLINGEX,\n        SCI_STYLESETVISIBLE,\n        SCI_GETCARETPERIOD,\n        SCI_SETCARETPERIOD,\n        SCI_SETWORDCHARS,\n        SCI_BEGINUNDOACTION,\n        SCI_ENDUNDOACTION,\n        SCI_INDICSETSTYLE,\n        SCI_INDICGETSTYLE,\n        SCI_INDICSETFORE,\n        SCI_INDICGETFORE,\n        SCI_SETWHITESPACEFORE,\n        SCI_SETWHITESPACEBACK,\n        SCI_SETWHITESPACESIZE,\n        SCI_GETWHITESPACESIZE,\n        SCI_SETSTYLEBITS,\n        SCI_GETSTYLEBITS,\n        SCI_SETLINESTATE,\n        SCI_GETLINESTATE,\n        SCI_GETMAXLINESTATE,\n        SCI_GETCARETLINEVISIBLE,\n        SCI_SETCARETLINEVISIBLE,\n        SCI_GETCARETLINEBACK,\n        SCI_SETCARETLINEBACK,\n        SCI_STYLESETCHANGEABLE,\n        SCI_AUTOCSHOW,\n        SCI_AUTOCCANCEL,\n        SCI_AUTOCACTIVE,\n        SCI_AUTOCPOSSTART,\n        SCI_AUTOCCOMPLETE,\n        SCI_AUTOCSTOPS,\n        SCI_AUTOCSETSEPARATOR,\n        SCI_AUTOCGETSEPARATOR,\n        SCI_AUTOCSELECT,\n        SCI_AUTOCSETCANCELATSTART,\n        SCI_AUTOCGETCANCELATSTART,\n        SCI_AUTOCSETFILLUPS,\n        SCI_AUTOCSETCHOOSESINGLE,\n        SCI_AUTOCGETCHOOSESINGLE,\n        SCI_AUTOCSETIGNORECASE,\n        SCI_AUTOCGETIGNORECASE,\n        SCI_USERLISTSHOW,\n        SCI_AUTOCSETAUTOHIDE,\n        SCI_AUTOCGETAUTOHIDE,\n        SCI_AUTOCSETDROPRESTOFWORD,\n        SCI_AUTOCGETDROPRESTOFWORD,\n        SCI_SETINDENT,\n        SCI_GETINDENT,\n        SCI_SETUSETABS,\n        SCI_GETUSETABS,\n        SCI_SETLINEINDENTATION,\n        SCI_GETLINEINDENTATION,\n        SCI_GETLINEINDENTPOSITION,\n        SCI_GETCOLUMN,\n        SCI_SETHSCROLLBAR,\n        SCI_GETHSCROLLBAR,\n        SCI_SETINDENTATIONGUIDES,\n        SCI_GETINDENTATIONGUIDES,\n        SCI_SETHIGHLIGHTGUIDE,\n        SCI_GETHIGHLIGHTGUIDE,\n        SCI_GETLINEENDPOSITION,\n        SCI_GETCODEPAGE,\n        SCI_GETCARETFORE,\n        SCI_GETREADONLY,\n        SCI_SETCURRENTPOS,\n        SCI_SETSELECTIONSTART,\n        SCI_GETSELECTIONSTART,\n        SCI_SETSELECTIONEND,\n        SCI_GETSELECTIONEND,\n        SCI_SETPRINTMAGNIFICATION,\n        SCI_GETPRINTMAGNIFICATION,\n        SCI_SETPRINTCOLOURMODE,\n        SCI_GETPRINTCOLOURMODE,\n        SCI_FINDTEXT,\n        SCI_FORMATRANGE,\n        SCI_GETFIRSTVISIBLELINE,\n        SCI_GETLINE,\n        SCI_GETLINECOUNT,\n        SCI_SETMARGINLEFT,\n        SCI_GETMARGINLEFT,\n        SCI_SETMARGINRIGHT,\n        SCI_GETMARGINRIGHT,\n        SCI_GETMODIFY,\n        SCI_SETSEL,\n        SCI_GETSELTEXT,\n        SCI_GETTEXTRANGE,\n        SCI_HIDESELECTION,\n        SCI_POINTXFROMPOSITION,\n        SCI_POINTYFROMPOSITION,\n        SCI_LINEFROMPOSITION,\n        SCI_POSITIONFROMLINE,\n        SCI_LINESCROLL,\n        SCI_SCROLLCARET,\n        SCI_REPLACESEL,\n        SCI_SETREADONLY,\n        SCI_NULL,\n        SCI_CANPASTE,\n        SCI_CANUNDO,\n        SCI_EMPTYUNDOBUFFER,\n        SCI_UNDO,\n        SCI_CUT,\n        SCI_COPY,\n        SCI_PASTE,\n        SCI_CLEAR,\n        SCI_SETTEXT,\n        SCI_GETTEXT,\n        SCI_GETTEXTLENGTH,\n        SCI_GETDIRECTFUNCTION,\n        SCI_GETDIRECTPOINTER,\n        SCI_SETOVERTYPE,\n        SCI_GETOVERTYPE,\n        SCI_SETCARETWIDTH,\n        SCI_GETCARETWIDTH,\n        SCI_SETTARGETSTART,\n        SCI_GETTARGETSTART,\n        SCI_SETTARGETEND,\n        SCI_GETTARGETEND,\n        SCI_REPLACETARGET,\n        SCI_REPLACETARGETRE,\n        SCI_SEARCHINTARGET,\n        SCI_SETSEARCHFLAGS,\n        SCI_GETSEARCHFLAGS,\n        SCI_CALLTIPSHOW,\n        SCI_CALLTIPCANCEL,\n        SCI_CALLTIPACTIVE,\n        SCI_CALLTIPPOSSTART,\n        SCI_CALLTIPSETHLT,\n        SCI_CALLTIPSETBACK,\n        SCI_CALLTIPSETFORE,\n        SCI_CALLTIPSETFOREHLT,\n        SCI_AUTOCSETMAXWIDTH,\n        SCI_AUTOCGETMAXWIDTH,\n        SCI_AUTOCSETMAXHEIGHT,\n        SCI_AUTOCGETMAXHEIGHT,\n        SCI_CALLTIPUSESTYLE,\n        SCI_VISIBLEFROMDOCLINE,\n        SCI_DOCLINEFROMVISIBLE,\n        SCI_SETFOLDLEVEL,\n        SCI_GETFOLDLEVEL,\n        SCI_GETLASTCHILD,\n        SCI_GETFOLDPARENT,\n        SCI_SHOWLINES,\n        SCI_HIDELINES,\n        SCI_GETLINEVISIBLE,\n        SCI_SETFOLDEXPANDED,\n        SCI_GETFOLDEXPANDED,\n        SCI_TOGGLEFOLD,\n        SCI_ENSUREVISIBLE,\n        SCI_SETFOLDFLAGS,\n        SCI_ENSUREVISIBLEENFORCEPOLICY,\n        SCI_WRAPCOUNT,\n        SCI_SETTABINDENTS,\n        SCI_GETTABINDENTS,\n        SCI_SETBACKSPACEUNINDENTS,\n        SCI_GETBACKSPACEUNINDENTS,\n        SCI_SETMOUSEDWELLTIME,\n        SCI_GETMOUSEDWELLTIME,\n        SCI_WORDSTARTPOSITION,\n        SCI_WORDENDPOSITION,\n        SCI_SETWRAPMODE,\n        SCI_GETWRAPMODE,\n        SCI_SETLAYOUTCACHE,\n        SCI_GETLAYOUTCACHE,\n        SCI_SETSCROLLWIDTH,\n        SCI_GETSCROLLWIDTH,\n        SCI_TEXTWIDTH,\n        SCI_SETENDATLASTLINE,\n        SCI_GETENDATLASTLINE,\n        SCI_TEXTHEIGHT,\n        SCI_SETVSCROLLBAR,\n        SCI_GETVSCROLLBAR,\n        SCI_APPENDTEXT,\n        SCI_GETTWOPHASEDRAW,\n        SCI_SETTWOPHASEDRAW,\n        SCI_AUTOCGETTYPESEPARATOR,\n        SCI_AUTOCSETTYPESEPARATOR,\n        SCI_TARGETFROMSELECTION,\n        SCI_LINESJOIN,\n        SCI_LINESSPLIT,\n        SCI_SETFOLDMARGINCOLOUR,\n        SCI_SETFOLDMARGINHICOLOUR,\n        SCI_MARKERSETBACKSELECTED,\n        SCI_MARKERENABLEHIGHLIGHT,\n        SCI_LINEDOWN,\n        SCI_LINEDOWNEXTEND,\n        SCI_LINEUP,\n        SCI_LINEUPEXTEND,\n        SCI_CHARLEFT,\n        SCI_CHARLEFTEXTEND,\n        SCI_CHARRIGHT,\n        SCI_CHARRIGHTEXTEND,\n        SCI_WORDLEFT,\n        SCI_WORDLEFTEXTEND,\n        SCI_WORDRIGHT,\n        SCI_WORDRIGHTEXTEND,\n        SCI_HOME,\n        SCI_HOMEEXTEND,\n        SCI_LINEEND,\n        SCI_LINEENDEXTEND,\n        SCI_DOCUMENTSTART,\n        SCI_DOCUMENTSTARTEXTEND,\n        SCI_DOCUMENTEND,\n        SCI_DOCUMENTENDEXTEND,\n        SCI_PAGEUP,\n        SCI_PAGEUPEXTEND,\n        SCI_PAGEDOWN,\n        SCI_PAGEDOWNEXTEND,\n        SCI_EDITTOGGLEOVERTYPE,\n        SCI_CANCEL,\n        SCI_DELETEBACK,\n        SCI_TAB,\n        SCI_BACKTAB,\n        SCI_NEWLINE,\n        SCI_FORMFEED,\n        SCI_VCHOME,\n        SCI_VCHOMEEXTEND,\n        SCI_ZOOMIN,\n        SCI_ZOOMOUT,\n        SCI_DELWORDLEFT,\n        SCI_DELWORDRIGHT,\n        SCI_LINECUT,\n        SCI_LINEDELETE,\n        SCI_LINETRANSPOSE,\n        SCI_LOWERCASE,\n        SCI_UPPERCASE,\n        SCI_LINESCROLLDOWN,\n        SCI_LINESCROLLUP,\n        SCI_DELETEBACKNOTLINE,\n        SCI_HOMEDISPLAY,\n        SCI_HOMEDISPLAYEXTEND,\n        SCI_LINEENDDISPLAY,\n        SCI_LINEENDDISPLAYEXTEND,\n        SCI_MOVECARETINSIDEVIEW,\n        SCI_LINELENGTH,\n        SCI_BRACEHIGHLIGHT,\n        SCI_BRACEBADLIGHT,\n        SCI_BRACEMATCH,\n        SCI_GETVIEWEOL,\n        SCI_SETVIEWEOL,\n        SCI_GETDOCPOINTER,\n        SCI_SETDOCPOINTER,\n        SCI_SETMODEVENTMASK,\n        SCI_GETEDGECOLUMN,\n        SCI_SETEDGECOLUMN,\n        SCI_GETEDGEMODE,\n        SCI_SETEDGEMODE,\n        SCI_GETEDGECOLOUR,\n        SCI_SETEDGECOLOUR,\n        SCI_SEARCHANCHOR,\n        SCI_SEARCHNEXT,\n        SCI_SEARCHPREV,\n        SCI_LINESONSCREEN,\n        SCI_USEPOPUP,\n        SCI_SELECTIONISRECTANGLE,\n        SCI_SETZOOM,\n        SCI_GETZOOM,\n        SCI_CREATEDOCUMENT,\n        SCI_ADDREFDOCUMENT,\n        SCI_RELEASEDOCUMENT,\n        SCI_GETMODEVENTMASK,\n        SCI_SETFOCUS,\n        SCI_GETFOCUS,\n        SCI_SETSTATUS,\n        SCI_GETSTATUS,\n        SCI_SETMOUSEDOWNCAPTURES,\n        SCI_GETMOUSEDOWNCAPTURES,\n        SCI_SETCURSOR,\n        SCI_GETCURSOR,\n        SCI_SETCONTROLCHARSYMBOL,\n        SCI_GETCONTROLCHARSYMBOL,\n        SCI_WORDPARTLEFT,\n        SCI_WORDPARTLEFTEXTEND,\n        SCI_WORDPARTRIGHT,\n        SCI_WORDPARTRIGHTEXTEND,\n        SCI_SETVISIBLEPOLICY,\n        SCI_DELLINELEFT,\n        SCI_DELLINERIGHT,\n        SCI_SETXOFFSET,\n        SCI_GETXOFFSET,\n        SCI_CHOOSECARETX,\n        SCI_GRABFOCUS,\n        SCI_SETXCARETPOLICY,\n        SCI_SETYCARETPOLICY,\n        SCI_LINEDUPLICATE,\n        SCI_REGISTERIMAGE,\n        SCI_SETPRINTWRAPMODE,\n        SCI_GETPRINTWRAPMODE,\n        SCI_CLEARREGISTEREDIMAGES,\n        SCI_STYLESETHOTSPOT,\n        SCI_SETHOTSPOTACTIVEFORE,\n        SCI_SETHOTSPOTACTIVEBACK,\n        SCI_SETHOTSPOTACTIVEUNDERLINE,\n        SCI_SETHOTSPOTSINGLELINE,\n        SCI_PARADOWN,\n        SCI_PARADOWNEXTEND,\n        SCI_PARAUP,\n        SCI_PARAUPEXTEND,\n        SCI_POSITIONBEFORE,\n        SCI_POSITIONAFTER,\n        SCI_COPYRANGE,\n        SCI_COPYTEXT,\n        SCI_SETSELECTIONMODE,\n        SCI_GETSELECTIONMODE,\n        SCI_GETLINESELSTARTPOSITION,\n        SCI_GETLINESELENDPOSITION,\n        SCI_LINEDOWNRECTEXTEND,\n        SCI_LINEUPRECTEXTEND,\n        SCI_CHARLEFTRECTEXTEND,\n        SCI_CHARRIGHTRECTEXTEND,\n        SCI_HOMERECTEXTEND,\n        SCI_VCHOMERECTEXTEND,\n        SCI_LINEENDRECTEXTEND,\n        SCI_PAGEUPRECTEXTEND,\n        SCI_PAGEDOWNRECTEXTEND,\n        SCI_STUTTEREDPAGEUP,\n        SCI_STUTTEREDPAGEUPEXTEND,\n        SCI_STUTTEREDPAGEDOWN,\n        SCI_STUTTEREDPAGEDOWNEXTEND,\n        SCI_WORDLEFTEND,\n        SCI_WORDLEFTENDEXTEND,\n        SCI_WORDRIGHTEND,\n        SCI_WORDRIGHTENDEXTEND,\n        SCI_SETWHITESPACECHARS,\n        SCI_SETCHARSDEFAULT,\n        SCI_AUTOCGETCURRENT,\n        SCI_ALLOCATE,\n        SCI_HOMEWRAP,\n        SCI_HOMEWRAPEXTEND,\n        SCI_LINEENDWRAP,\n        SCI_LINEENDWRAPEXTEND,\n        SCI_VCHOMEWRAP,\n        SCI_VCHOMEWRAPEXTEND,\n        SCI_LINECOPY,\n        SCI_FINDCOLUMN,\n        SCI_GETCARETSTICKY,\n        SCI_SETCARETSTICKY,\n        SCI_TOGGLECARETSTICKY,\n        SCI_SETWRAPVISUALFLAGS,\n        SCI_GETWRAPVISUALFLAGS,\n        SCI_SETWRAPVISUALFLAGSLOCATION,\n        SCI_GETWRAPVISUALFLAGSLOCATION,\n        SCI_SETWRAPSTARTINDENT,\n        SCI_GETWRAPSTARTINDENT,\n        SCI_MARKERADDSET,\n        SCI_SETPASTECONVERTENDINGS,\n        SCI_GETPASTECONVERTENDINGS,\n        SCI_SELECTIONDUPLICATE,\n        SCI_SETCARETLINEBACKALPHA,\n        SCI_GETCARETLINEBACKALPHA,\n        SCI_SETWRAPINDENTMODE,\n        SCI_GETWRAPINDENTMODE,\n        SCI_MARKERSETALPHA,\n        SCI_GETSELALPHA,\n        SCI_SETSELALPHA,\n        SCI_GETSELEOLFILLED,\n        SCI_SETSELEOLFILLED,\n        SCI_STYLEGETFORE,\n        SCI_STYLEGETBACK,\n        SCI_STYLEGETBOLD,\n        SCI_STYLEGETITALIC,\n        SCI_STYLEGETSIZE,\n        SCI_STYLEGETFONT,\n        SCI_STYLEGETEOLFILLED,\n        SCI_STYLEGETUNDERLINE,\n        SCI_STYLEGETCASE,\n        SCI_STYLEGETCHARACTERSET,\n        SCI_STYLEGETVISIBLE,\n        SCI_STYLEGETCHANGEABLE,\n        SCI_STYLEGETHOTSPOT,\n        SCI_GETHOTSPOTACTIVEFORE,\n        SCI_GETHOTSPOTACTIVEBACK,\n        SCI_GETHOTSPOTACTIVEUNDERLINE,\n        SCI_GETHOTSPOTSINGLELINE,\n        SCI_BRACEHIGHLIGHTINDICATOR,\n        SCI_BRACEBADLIGHTINDICATOR,\n        SCI_SETINDICATORCURRENT,\n        SCI_GETINDICATORCURRENT,\n        SCI_SETINDICATORVALUE,\n        SCI_GETINDICATORVALUE,\n        SCI_INDICATORFILLRANGE,\n        SCI_INDICATORCLEARRANGE,\n        SCI_INDICATORALLONFOR,\n        SCI_INDICATORVALUEAT,\n        SCI_INDICATORSTART,\n        SCI_INDICATOREND,\n        SCI_INDICSETUNDER,\n        SCI_INDICGETUNDER,\n        SCI_SETCARETSTYLE,\n        SCI_GETCARETSTYLE,\n        SCI_SETPOSITIONCACHE,\n        SCI_GETPOSITIONCACHE,\n        SCI_SETSCROLLWIDTHTRACKING,\n        SCI_GETSCROLLWIDTHTRACKING,\n        SCI_DELWORDRIGHTEND,\n        SCI_COPYALLOWLINE,\n        SCI_GETCHARACTERPOINTER,\n        SCI_SETKEYSUNICODE,\n        SCI_GETKEYSUNICODE,\n        SCI_INDICSETALPHA,\n        SCI_INDICGETALPHA,\n        SCI_SETEXTRAASCENT,\n        SCI_GETEXTRAASCENT,\n        SCI_SETEXTRADESCENT,\n        SCI_GETEXTRADESCENT,\n        SCI_MARKERSYMBOLDEFINED,\n        SCI_MARGINSETTEXT,\n        SCI_MARGINGETTEXT,\n        SCI_MARGINSETSTYLE,\n        SCI_MARGINGETSTYLE,\n        SCI_MARGINSETSTYLES,\n        SCI_MARGINGETSTYLES,\n        SCI_MARGINTEXTCLEARALL,\n        SCI_MARGINSETSTYLEOFFSET,\n        SCI_MARGINGETSTYLEOFFSET,\n        SCI_SETMARGINOPTIONS,\n        SCI_ANNOTATIONSETTEXT,\n        SCI_ANNOTATIONGETTEXT,\n        SCI_ANNOTATIONSETSTYLE,\n        SCI_ANNOTATIONGETSTYLE,\n        SCI_ANNOTATIONSETSTYLES,\n        SCI_ANNOTATIONGETSTYLES,\n        SCI_ANNOTATIONGETLINES,\n        SCI_ANNOTATIONCLEARALL,\n        SCI_ANNOTATIONSETVISIBLE,\n        SCI_ANNOTATIONGETVISIBLE,\n        SCI_ANNOTATIONSETSTYLEOFFSET,\n        SCI_ANNOTATIONGETSTYLEOFFSET,\n        SCI_SETEMPTYSELECTION,\n        SCI_GETMARGINOPTIONS,\n        SCI_INDICSETOUTLINEALPHA,\n        SCI_INDICGETOUTLINEALPHA,\n        SCI_ADDUNDOACTION,\n        SCI_CHARPOSITIONFROMPOINT,\n        SCI_CHARPOSITIONFROMPOINTCLOSE,\n        SCI_SETMULTIPLESELECTION,\n        SCI_GETMULTIPLESELECTION,\n        SCI_SETADDITIONALSELECTIONTYPING,\n        SCI_GETADDITIONALSELECTIONTYPING,\n        SCI_SETADDITIONALCARETSBLINK,\n        SCI_GETADDITIONALCARETSBLINK,\n        SCI_SCROLLRANGE,\n        SCI_SETADDITIONALCARETSVISIBLE,\n        SCI_GETADDITIONALCARETSVISIBLE,\n        SCI_AUTOCGETCURRENTTEXT,\n        SCI_GETSELECTIONS,\n        SCI_CLEARSELECTIONS,\n        SCI_SETSELECTION,\n        SCI_ADDSELECTION,\n        SCI_SETMAINSELECTION,\n        SCI_GETMAINSELECTION,\n        SCI_SETSELECTIONNCARET,\n        SCI_GETSELECTIONNCARET,\n        SCI_SETSELECTIONNANCHOR,\n        SCI_GETSELECTIONNANCHOR,\n        SCI_SETSELECTIONNCARETVIRTUALSPACE,\n        SCI_GETSELECTIONNCARETVIRTUALSPACE,\n        SCI_SETSELECTIONNANCHORVIRTUALSPACE,\n        SCI_GETSELECTIONNANCHORVIRTUALSPACE,\n        SCI_SETSELECTIONNSTART,\n        SCI_GETSELECTIONNSTART,\n        SCI_SETSELECTIONNEND,\n        SCI_GETSELECTIONNEND,\n        SCI_SETRECTANGULARSELECTIONCARET,\n        SCI_GETRECTANGULARSELECTIONCARET,\n        SCI_SETRECTANGULARSELECTIONANCHOR,\n        SCI_GETRECTANGULARSELECTIONANCHOR,\n        SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE,\n        SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE,\n        SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE,\n        SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE,\n        SCI_SETVIRTUALSPACEOPTIONS,\n        SCI_GETVIRTUALSPACEOPTIONS,\n        SCI_SETRECTANGULARSELECTIONMODIFIER,\n        SCI_GETRECTANGULARSELECTIONMODIFIER,\n        SCI_SETADDITIONALSELFORE,\n        SCI_SETADDITIONALSELBACK,\n        SCI_SETADDITIONALSELALPHA,\n        SCI_GETADDITIONALSELALPHA,\n        SCI_SETADDITIONALCARETFORE,\n        SCI_GETADDITIONALCARETFORE,\n        SCI_ROTATESELECTION,\n        SCI_SWAPMAINANCHORCARET,\n        SCI_SETFONTQUALITY,\n        SCI_GETFONTQUALITY,\n        SCI_SETFIRSTVISIBLELINE,\n        SCI_SETMULTIPASTE,\n        SCI_GETMULTIPASTE,\n        SCI_GETTAG,\n        SCI_CHANGELEXERSTATE,\n        SCI_CONTRACTEDFOLDNEXT,\n        SCI_VERTICALCENTRECARET,\n        SCI_MOVESELECTEDLINESUP,\n        SCI_MOVESELECTEDLINESDOWN,\n        SCI_SETIDENTIFIER,\n        SCI_GETIDENTIFIER,\n        SCI_RGBAIMAGESETWIDTH,\n        SCI_RGBAIMAGESETHEIGHT,\n        SCI_MARKERDEFINERGBAIMAGE,\n        SCI_REGISTERRGBAIMAGE,\n        SCI_SCROLLTOSTART,\n        SCI_SCROLLTOEND,\n        SCI_STARTRECORD,\n        SCI_STOPRECORD,\n        SCI_SETLEXER,\n        SCI_GETLEXER,\n        SCI_COLOURISE,\n        SCI_SETPROPERTY,\n        SCI_SETKEYWORDS,\n        SCI_SETLEXERLANGUAGE,\n        SCI_LOADLEXERLIBRARY,\n        SCI_GETPROPERTY,\n        SCI_GETPROPERTYEXPANDED,\n        SCI_GETPROPERTYINT,\n        SCI_GETSTYLEBITSNEEDED,\n        SCI_GETLEXERLANGUAGE,\n        SCI_PRIVATELEXERCALL,\n        SCI_PROPERTYNAMES,\n        SCI_PROPERTYTYPE,\n        SCI_DESCRIBEPROPERTY,\n        SCI_DESCRIBEKEYWORDSETS,\n\n        SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR,\n        SCI_AUTOCGETCASEINSENSITIVEBEHAVIOUR,\n        SCI_CALLTIPSETPOSITION,\n        SCI_COUNTCHARACTERS,\n        SCI_CREATELOADER,\n        SCI_DELETERANGE,\n        SCI_FINDINDICATORFLASH,\n        SCI_FINDINDICATORHIDE,\n        SCI_FINDINDICATORSHOW,\n        SCI_GETALLLINESVISIBLE,\n        SCI_GETGAPPOSITION,\n        SCI_GETPUNCTUATIONCHARS,\n        SCI_GETRANGEPOINTER,\n        SCI_GETSELECTIONEMPTY,\n        SCI_GETTECHNOLOGY,\n        SCI_GETWHITESPACECHARS,\n        SCI_GETWORDCHARS,\n        SCI_RGBAIMAGESETSCALE,\n        SCI_SETPUNCTUATIONCHARS,\n        SCI_SETTECHNOLOGY,\n        SCI_STYLESETSIZEFRACTIONAL,\n        SCI_STYLEGETSIZEFRACTIONAL,\n        SCI_STYLESETWEIGHT,             \n        SCI_STYLEGETWEIGHT,\n\n        SCI_FOLDLINE,\n        SCI_FOLDCHILDREN,\n        SCI_EXPANDCHILDREN,\n        SCI_FOLDALL,\n        SCI_SETAUTOMATICFOLD,\n        SCI_GETAUTOMATICFOLD,\n        SCI_AUTOCSETORDER,\n        SCI_AUTOCGETORDER,\n        SCI_POSITIONRELATIVE,\n        SCI_RELEASEALLEXTENDEDSTYLES,\n        SCI_ALLOCATEEXTENDEDSTYLES,\n        SCI_SETMOUSESELECTIONRECTANGULARSWITCH,\n        SCI_GETMOUSESELECTIONRECTANGULARSWITCH,\n        SCI_GETCARETLINEVISIBLEALWAYS,\n        SCI_SETCARETLINEVISIBLEALWAYS,\n        SCI_SETREPRESENTATION,\n        SCI_GETREPRESENTATION,\n        SCI_CLEARREPRESENTATION,\n    };\n\n    enum {\n        SC_ALPHA_TRANSPARENT,\n        SC_ALPHA_OPAQUE,\n        SC_ALPHA_NOALPHA,\n    };\n\n    enum {\n        SC_CARETSTICKY_OFF,\n        SC_CARETSTICKY_ON,\n        SC_CARETSTICKY_WHITESPACE,\n    };\n\n    enum {\n        SC_EFF_QUALITY_MASK,\n        SC_EFF_QUALITY_DEFAULT,\n        SC_EFF_QUALITY_NON_ANTIALIASED,\n        SC_EFF_QUALITY_ANTIALIASED,\n        SC_EFF_QUALITY_LCD_OPTIMIZED,\n    };\n\n    enum {\n        SC_MARGINOPTION_NONE,\n        SC_MARGINOPTION_SUBLINESELECT,\n    };\n\n    enum {\n        SC_MULTIPASTE_ONCE,\n        SC_MULTIPASTE_EACH,\n    };\n\n    enum {\n        SC_TYPE_BOOLEAN,\n        SC_TYPE_INTEGER,\n        SC_TYPE_STRING,\n    };\n\n    enum {\n        SC_UPDATE_CONTENT,\n        SC_UPDATE_SELECTION,\n        SC_UPDATE_V_SCROLL,\n        SC_UPDATE_H_SCROLL,\n    };\n\n    enum {\n        SC_WRAPVISUALFLAG_NONE,\n        SC_WRAPVISUALFLAG_END,\n        SC_WRAPVISUALFLAG_START,\n        SC_WRAPVISUALFLAG_MARGIN,\n    };\n\n    enum {\n        SC_WRAPVISUALFLAGLOC_DEFAULT,\n        SC_WRAPVISUALFLAGLOC_END_BY_TEXT,\n        SC_WRAPVISUALFLAGLOC_START_BY_TEXT\n    };\n\n    enum {\n        SC_SEL_STREAM,\n        SC_SEL_RECTANGLE,\n        SC_SEL_LINES,\n        SC_SEL_THIN,\n    };\n\n    enum {\n        SCVS_NONE,\n        SCVS_RECTANGULARSELECTION,\n        SCVS_USERACCESSIBLE,\n    };\n\n    enum {\n        SCWS_INVISIBLE,\n        SCWS_VISIBLEALWAYS,\n        SCWS_VISIBLEAFTERINDENT\n    };\n\n    enum {\n        SC_EOL_CRLF,\n        SC_EOL_CR,\n        SC_EOL_LF\n    };\n\n    enum {\n        SC_CP_DBCS,\n        SC_CP_UTF8\n    };\n\n    enum {\n        SC_MARK_CIRCLE,\n        SC_MARK_ROUNDRECT,\n        SC_MARK_ARROW,\n        SC_MARK_SMALLRECT,\n        SC_MARK_SHORTARROW,\n        SC_MARK_EMPTY,\n        SC_MARK_ARROWDOWN,\n        SC_MARK_MINUS,\n        SC_MARK_PLUS,\n        SC_MARK_VLINE,\n        SC_MARK_LCORNER,\n        SC_MARK_TCORNER,\n        SC_MARK_BOXPLUS,\n        SC_MARK_BOXPLUSCONNECTED,\n        SC_MARK_BOXMINUS,\n        SC_MARK_BOXMINUSCONNECTED,\n        SC_MARK_LCORNERCURVE,\n        SC_MARK_TCORNERCURVE,\n        SC_MARK_CIRCLEPLUS,\n        SC_MARK_CIRCLEPLUSCONNECTED,\n        SC_MARK_CIRCLEMINUS,\n        SC_MARK_CIRCLEMINUSCONNECTED,\n        SC_MARK_BACKGROUND,\n        SC_MARK_DOTDOTDOT,\n        SC_MARK_ARROWS,\n        SC_MARK_PIXMAP,\n        SC_MARK_FULLRECT,\n        SC_MARK_LEFTRECT,\n        SC_MARK_AVAILABLE,\n        SC_MARK_UNDERLINE,\n        SC_MARK_RGBAIMAGE,\n        SC_MARK_CHARACTER\n    };\n\n    enum {\n        SC_MARKNUM_FOLDEREND,\n        SC_MARKNUM_FOLDEROPENMID,\n        SC_MARKNUM_FOLDERMIDTAIL,\n        SC_MARKNUM_FOLDERTAIL,\n        SC_MARKNUM_FOLDERSUB,\n        SC_MARKNUM_FOLDER,\n        SC_MARKNUM_FOLDEROPEN,\n        SC_MASK_FOLDERS\n    };\n\n    enum {\n        SC_MARGIN_SYMBOL,\n        SC_MARGIN_NUMBER,\n        SC_MARGIN_BACK,\n        SC_MARGIN_FORE,\n        SC_MARGIN_TEXT,\n        SC_MARGIN_RTEXT,\n    };\n\n    enum {\n        STYLE_DEFAULT,\n        STYLE_LINENUMBER,\n        STYLE_BRACELIGHT,\n        STYLE_BRACEBAD,\n        STYLE_CONTROLCHAR,\n        STYLE_INDENTGUIDE,\n        STYLE_CALLTIP,\n        STYLE_LASTPREDEFINED,\n        STYLE_MAX\n    };\n\n    enum {\n        SC_CHARSET_ANSI,\n        SC_CHARSET_DEFAULT,\n        SC_CHARSET_BALTIC,\n        SC_CHARSET_CHINESEBIG5,\n        SC_CHARSET_EASTEUROPE,\n        SC_CHARSET_GB2312,\n        SC_CHARSET_GREEK,\n        SC_CHARSET_HANGUL,\n        SC_CHARSET_MAC,\n        SC_CHARSET_OEM,\n        SC_CHARSET_RUSSIAN,\n        SC_CHARSET_SHIFTJIS,\n        SC_CHARSET_SYMBOL,\n        SC_CHARSET_TURKISH,\n        SC_CHARSET_JOHAB,\n        SC_CHARSET_HEBREW,\n        SC_CHARSET_ARABIC,\n        SC_CHARSET_VIETNAMESE,\n        SC_CHARSET_THAI,\n        SC_CHARSET_8859_15,\n    };\n\n    enum {\n        SC_CASE_MIXED,\n        SC_CASE_UPPER,\n        SC_CASE_LOWER\n    };\n\n    enum\n    {\n        SC_IV_NONE,\n        SC_IV_REAL,\n        SC_IV_LOOKFORWARD,\n        SC_IV_LOOKBOTH\n    };\n\n    enum {\n        INDIC_PLAIN,\n        INDIC_SQUIGGLE,\n        INDIC_TT,\n        INDIC_DIAGONAL,\n        INDIC_STRIKE,\n        INDIC_HIDDEN,\n        INDIC_BOX,\n        INDIC_ROUNDBOX,\n        INDIC_STRAIGHTBOX,\n        INDIC_DASH,\n        INDIC_DOTS,\n        INDIC_SQUIGGLELOW,\n        INDIC_DOTBOX,\n        INDIC_SQUIGGLEPIXMAP,\n        INDIC_COMPOSITIONTHICK,\n\n        INDIC_CONTAINER,\n        INDIC_MAX,\n        INDIC0_MASK,\n        INDIC1_MASK,\n        INDIC2_MASK,\n        INDICS_MASK\n    };\n\n    enum {\n        SC_PRINT_NORMAL,\n        SC_PRINT_INVERTLIGHT,\n        SC_PRINT_BLACKONWHITE,\n        SC_PRINT_COLOURONWHITE,\n        SC_PRINT_COLOURONWHITEDEFAULTBG\n    };\n\n    enum {\n        SCFIND_WHOLEWORD,\n        SCFIND_MATCHCASE,\n        SCFIND_WORDSTART,\n        SCFIND_REGEXP,\n        SCFIND_POSIX\n    };\n\n    enum {\n        SC_FOLDLEVELBASE,\n        SC_FOLDLEVELWHITEFLAG,\n        SC_FOLDLEVELHEADERFLAG,\n        SC_FOLDLEVELNUMBERMASK\n    };\n\n    enum\n    {\n        SC_FOLDFLAG_LINEBEFORE_EXPANDED,\n        SC_FOLDFLAG_LINEBEFORE_CONTRACTED,\n        SC_FOLDFLAG_LINEAFTER_EXPANDED,\n        SC_FOLDFLAG_LINEAFTER_CONTRACTED,\n        SC_FOLDFLAG_LEVELNUMBERS\n    };\n\n    enum {\n        SC_TIME_FOREVER\n    };\n\n    enum {\n        SC_WRAP_NONE,\n        SC_WRAP_WORD,\n        SC_WRAP_CHAR,\n    };\n\n    enum {\n        SC_WRAPINDENT_FIXED,\n        SC_WRAPINDENT_SAME,\n        SC_WRAPINDENT_INDENT,\n    };\n\n    enum {\n        SC_CACHE_NONE,\n        SC_CACHE_CARET,\n        SC_CACHE_PAGE,\n        SC_CACHE_DOCUMENT\n    };\n\n    enum {\n        ANNOTATION_HIDDEN,\n        ANNOTATION_STANDARD,\n        ANNOTATION_BOXED,\n    };\n\n    enum {\n        EDGE_NONE,\n        EDGE_LINE,\n        EDGE_BACKGROUND\n    };\n\n    enum {\n        SC_CURSORNORMAL,\n        SC_CURSORARROW,\n        SC_CURSORWAIT,\n        SC_CURSORREVERSEARROW\n    };\n\n    enum {\n        UNDO_MAY_COALESCE,\n    };\n\n    enum {\n        VISIBLE_SLOP,\n        VISIBLE_STRICT\n    };\n\n    enum {\n        CARET_SLOP,\n        CARET_STRICT,\n        CARET_JUMPS,\n        CARET_EVEN\n    };\n\n    enum\n    {\n        CARETSTYLE_INVISIBLE,\n        CARETSTYLE_LINE,\n        CARETSTYLE_BLOCK\n    };\n\n    enum {\n        SC_MOD_INSERTTEXT,\n        SC_MOD_DELETETEXT,\n        SC_MOD_CHANGESTYLE,\n        SC_MOD_CHANGEFOLD,\n        SC_PERFORMED_USER,\n        SC_PERFORMED_UNDO,\n        SC_PERFORMED_REDO,\n        SC_MULTISTEPUNDOREDO,\n        SC_LASTSTEPINUNDOREDO,\n        SC_MOD_CHANGEMARKER,\n        SC_MOD_BEFOREINSERT,\n        SC_MOD_BEFOREDELETE,\n        SC_MULTILINEUNDOREDO,\n        SC_STARTACTION,\n        SC_MOD_CHANGEINDICATOR,\n        SC_MOD_CHANGELINESTATE,\n        SC_MOD_CHANGEMARGIN,\n        SC_MOD_CHANGEANNOTATION,\n        SC_MOD_CONTAINER,\n        SC_MOD_LEXERSTATE,\n        SC_MODEVENTMASKALL\n    };\n\n    enum {\n        SCK_DOWN,\n        SCK_UP,\n        SCK_LEFT,\n        SCK_RIGHT,\n        SCK_HOME,\n        SCK_END,\n        SCK_PRIOR,\n        SCK_NEXT,\n        SCK_DELETE,\n        SCK_INSERT,\n        SCK_ESCAPE,\n        SCK_BACK,\n        SCK_TAB,\n        SCK_RETURN,\n        SCK_ADD,\n        SCK_SUBTRACT,\n        SCK_DIVIDE,\n        SCK_WIN,\n        SCK_RWIN,\n        SCK_MENU\n    };\n\n    enum {\n        SCMOD_NORM,\n        SCMOD_SHIFT,\n        SCMOD_CTRL,\n        SCMOD_ALT,\n        SCMOD_SUPER,\n        SCMOD_META,\n    };\n\n    enum {\n        SCLEX_CONTAINER,\n        SCLEX_NULL,\n        SCLEX_PYTHON,\n        SCLEX_CPP,\n        SCLEX_HTML,\n        SCLEX_XML,\n        SCLEX_PERL,\n        SCLEX_SQL,\n        SCLEX_VB,\n        SCLEX_PROPERTIES,\n        SCLEX_ERRORLIST,\n        SCLEX_MAKEFILE,\n        SCLEX_BATCH,\n        SCLEX_LATEX,\n        SCLEX_LUA,\n        SCLEX_DIFF,\n        SCLEX_CONF,\n        SCLEX_PASCAL,\n        SCLEX_AVE,\n        SCLEX_ADA,\n        SCLEX_LISP,\n        SCLEX_RUBY,\n        SCLEX_EIFFEL,\n        SCLEX_EIFFELKW,\n        SCLEX_TCL,\n        SCLEX_NNCRONTAB,\n        SCLEX_BULLANT,\n        SCLEX_VBSCRIPT,\n        SCLEX_ASP,\n        SCLEX_PHP,\n        SCLEX_BAAN,\n        SCLEX_MATLAB,\n        SCLEX_SCRIPTOL,\n        SCLEX_ASM,\n        SCLEX_CPPNOCASE,\n        SCLEX_FORTRAN,\n        SCLEX_F77,\n        SCLEX_CSS,\n        SCLEX_POV,\n        SCLEX_LOUT,\n        SCLEX_ESCRIPT,\n        SCLEX_PS,\n        SCLEX_NSIS,\n        SCLEX_MMIXAL,\n        SCLEX_CLW,\n        SCLEX_CLWNOCASE,\n        SCLEX_LOT,\n        SCLEX_YAML,\n        SCLEX_TEX,\n        SCLEX_METAPOST,\n        SCLEX_POWERBASIC,\n        SCLEX_FORTH,\n        SCLEX_ERLANG,\n        SCLEX_OCTAVE,\n        SCLEX_MSSQL,\n        SCLEX_VERILOG,\n        SCLEX_KIX,\n        SCLEX_GUI4CLI,\n        SCLEX_SPECMAN,\n        SCLEX_AU3,\n        SCLEX_APDL,\n        SCLEX_BASH,\n        SCLEX_ASN1,\n        SCLEX_VHDL,\n        SCLEX_CAML,\n        SCLEX_BLITZBASIC,\n        SCLEX_PUREBASIC,\n        SCLEX_HASKELL,\n        SCLEX_PHPSCRIPT,\n        SCLEX_TADS3,\n        SCLEX_REBOL,\n        SCLEX_SMALLTALK,\n        SCLEX_FLAGSHIP,\n        SCLEX_CSOUND,\n        SCLEX_FREEBASIC,\n        SCLEX_INNOSETUP,\n        SCLEX_OPAL,\n        SCLEX_SPICE,\n        SCLEX_D,\n        SCLEX_CMAKE,\n        SCLEX_GAP,\n        SCLEX_PLM,\n        SCLEX_PROGRESS,\n        SCLEX_ABAQUS,\n        SCLEX_ASYMPTOTE,\n        SCLEX_R,\n        SCLEX_MAGIK,\n        SCLEX_POWERSHELL,\n        SCLEX_MYSQL,\n        SCLEX_PO,\n        SCLEX_TAL,\n        SCLEX_COBOL,\n        SCLEX_TACL,\n        SCLEX_SORCUS,\n        SCLEX_POWERPRO,\n        SCLEX_NIMROD,\n        SCLEX_SML,\n        SCLEX_MARKDOWN,\n        SCLEX_TXT2TAGS,\n        SCLEX_A68K,\n        SCLEX_MODULA,\n        SCLEX_COFFEESCRIPT,\n        SCLEX_TCMD,\n        SCLEX_AVS,\n        SCLEX_ECL,\n        SCLEX_OSCRIPT,\n        SCLEX_VISUALPROLOG,\n        SCLEX_LITERATEHASKELL,\n        SCLEX_STTXT,\n        SCLEX_KVIRC,\n        SCLEX_RUST,\n    };\n\n    enum {\n        SC_WEIGHT_NORMAL,\n        SC_WEIGHT_SEMIBOLD,\n        SC_WEIGHT_BOLD,\n    };\n\n    enum {\n        SC_TECHNOLOGY_DEFAULT,\n        SC_TECHNOLOGY_DIRECTWRITE,\n    };\n\n    enum {\n        SC_CASEINSENSITIVEBEHAVIOUR_RESPECTCASE,\n        SC_CASEINSENSITIVEBEHAVIOUR_IGNORECASE,\n    };\n\n    enum {\n        SC_FONT_SIZE_MULTIPLIER,\n    };\n\n    enum\n    {\n        SC_FOLDACTION_CONTRACT,\n        SC_FOLDACTION_EXPAND,\n        SC_FOLDACTION_TOGGLE,\n    };\n\n    enum\n    {\n        SC_AUTOMATICFOLD_SHOW,\n        SC_AUTOMATICFOLD_CLICK,\n        SC_AUTOMATICFOLD_CHANGE,\n    };\n\n    enum\n    {\n        SC_ORDER_PRESORTED,\n        SC_ORDER_PERFORMSORT,\n        SC_ORDER_CUSTOM,\n    };\n    \n    explicit QsciScintillaBase(QWidget *parent /TransferThis/ = 0);\n    virtual ~QsciScintillaBase();\n\n%ConvertToSubClassCode\nstatic struct class_graph {\n    const char *name;\n    sipTypeDef **type;\n    int yes, no;\n} graph[] = {\n    {sipName_QsciScintillaBase, &sipType_QsciScintillaBase, 4, 1},\n    {sipName_QsciMacro, &sipType_QsciMacro, -1, 2},\n    {sipName_QsciLexer, &sipType_QsciLexer, 5, 3},\n    {sipName_QsciAbstractAPIs, &sipType_QsciAbstractAPIs, 42, -1},\n    {sipName_QsciScintilla, &sipType_QsciScintilla, -1, -1},\n    {sipName_QsciLexerPO, &sipType_QsciLexerPO, -1, 6},\n    {sipName_QsciLexerBash, &sipType_QsciLexerBash, -1, 7},\n    {sipName_QsciLexerPython, &sipType_QsciLexerPython, -1, 8},\n    {sipName_QsciLexerSQL, &sipType_QsciLexerSQL, -1, 9},\n    {sipName_QsciLexerPascal, &sipType_QsciLexerPascal, -1, 10},\n    {sipName_QsciLexerDiff, &sipType_QsciLexerDiff, -1, 11},\n    {sipName_QsciLexerCustom, &sipType_QsciLexerCustom, -1, 12},\n    {sipName_QsciLexerPOV, &sipType_QsciLexerPOV, -1, 13},\n    {sipName_QsciLexerLua, &sipType_QsciLexerLua, -1, 14},\n    {sipName_QsciLexerSpice, &sipType_QsciLexerSpice, -1, 15},\n    {sipName_QsciLexerMatlab, &sipType_QsciLexerMatlab, 35, 16},\n    {sipName_QsciLexerCSS, &sipType_QsciLexerCSS, -1, 17},\n    {sipName_QsciLexerCMake, &sipType_QsciLexerCMake, -1, 18},\n    {sipName_QsciLexerVHDL, &sipType_QsciLexerVHDL, -1, 19},\n    {sipName_QsciLexerVerilog, &sipType_QsciLexerVerilog, -1, 20},\n    {sipName_QsciLexerHTML, &sipType_QsciLexerHTML, 36, 21},\n    {sipName_QsciLexerMakefile, &sipType_QsciLexerMakefile, -1, 22},\n    {sipName_QsciLexerPostScript, &sipType_QsciLexerPostScript, -1, 23},\n    {sipName_QsciLexerTCL, &sipType_QsciLexerTCL, -1, 24},\n    {sipName_QsciLexerAVS, &sipType_QsciLexerAVS, -1, 25},\n    {sipName_QsciLexerPerl, &sipType_QsciLexerPerl, -1, 26},\n    {sipName_QsciLexerCoffeeScript, &sipType_QsciLexerCoffeeScript, -1, 27},\n    {sipName_QsciLexerFortran77, &sipType_QsciLexerFortran77, 37, 28},\n    {sipName_QsciLexerYAML, &sipType_QsciLexerYAML, -1, 29},\n    {sipName_QsciLexerRuby, &sipType_QsciLexerRuby, -1, 30},\n    {sipName_QsciLexerProperties, &sipType_QsciLexerProperties, -1, 31},\n    {sipName_QsciLexerTeX, &sipType_QsciLexerTeX, -1, 32},\n    {sipName_QsciLexerD, &sipType_QsciLexerD, -1, 33},\n    {sipName_QsciLexerCPP, &sipType_QsciLexerCPP, 38, 34},\n    {sipName_QsciLexerBatch, &sipType_QsciLexerBatch, -1, -1},\n    {sipName_QsciLexerOctave, &sipType_QsciLexerOctave, -1, -1},\n    {sipName_QsciLexerXML, &sipType_QsciLexerXML, -1, -1},\n    {sipName_QsciLexerFortran, &sipType_QsciLexerFortran, -1, -1},\n    {sipName_QsciLexerJava, &sipType_QsciLexerJava, -1, 39},\n    {sipName_QsciLexerCSharp, &sipType_QsciLexerCSharp, -1, 40},\n    {sipName_QsciLexerIDL, &sipType_QsciLexerIDL, -1, 41},\n    {sipName_QsciLexerJavaScript, &sipType_QsciLexerJavaScript, -1, -1},\n    {sipName_QsciAPIs, &sipType_QsciAPIs, -1, -1},\n};\n\nint i = 0;\n\nsipType = NULL;\n\ndo\n{\n    struct class_graph *cg = &graph[i];\n\n    if (cg->name != NULL && sipCpp->inherits(cg->name))\n    {\n        sipType = *cg->type;\n        i = cg->yes;\n    }\n    else\n        i = cg->no;\n}\nwhile (i >= 0);\n%End\n\n    static QsciScintillaBase *pool();\n\n    long SendScintilla(unsigned int msg, unsigned long wParam = 0,\n            long lParam = 0) const;\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            void *lParam) const;\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            const char *lParam /DocType=\"Py_v3:bytes;str\", Encoding=\"None\"/) const;\n    long SendScintilla(unsigned int msg,\n            const char *lParam /DocType=\"Py_v3:bytes;str\", Encoding=\"None\"/); const\n    long SendScintilla(unsigned int msg,\n            const char *wParam /DocType=\"Py_v3:bytes;str\", Encoding=\"None\"/,\n            const char *lParam /DocType=\"Py_v3:bytes;str\", Encoding=\"None\"/) const;\n    long SendScintilla(unsigned int msg, long wParam) const;\n    //long SendScintilla(unsigned int msg, int wParam) const;\n    long SendScintilla(unsigned int msg, long cpMin, long cpMax,\n            char *lpstrText /DocType=\"Py_v3:bytes;str\", Encoding=\"None\"/) const;\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            const QColor &col) const;\n    long SendScintilla(unsigned int msg, const QColor &col) const;\n    long SendScintilla(unsigned int msg, unsigned long wParam, QPainter *hdc,\n            const QRect &rc, long cpMin, long cpMax) const;\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            const QPixmap &lParam) const;\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            const QImage &lParam) const;\n\n    void *SendScintillaPtrResult(unsigned int msg) const;\n\n\nsignals:\n    void QSCN_SELCHANGED(bool yes);\n\n    void SCEN_CHANGE();\n\n    void SCN_AUTOCCANCELLED();\n    void SCN_AUTOCCHARDELETED();\n    void SCN_AUTOCSELECTION(const char *selection, int position);\n    void SCN_CALLTIPCLICK(int direction);\n    void SCN_CHARADDED(int charadded);\n    void SCN_DOUBLECLICK(int position, int line, int modifiers);\n    void SCN_DWELLEND(int, int, int);\n    void SCN_DWELLSTART(int, int, int);\n    void SCN_FOCUSIN();\n    void SCN_FOCUSOUT();\n    void SCN_HOTSPOTCLICK(int position, int modifiers);\n    void SCN_HOTSPOTDOUBLECLICK(int position, int modifiers);\n    void SCN_HOTSPOTRELEASECLICK(int position, int modifiers);\n    void SCN_INDICATORCLICK(int position, int modifiers);\n    void SCN_INDICATORRELEASE(int position, int modifiers);\n    void SCN_MACRORECORD(unsigned int, unsigned long, void *);\n    void SCN_MARGINCLICK(int position, int modifiers, int margin);\n    void SCN_MODIFIED(int, int, const char *, int, int, int, int, int, int, int);\n    void SCN_MODIFYATTEMPTRO();\n    void SCN_NEEDSHOWN(int, int);\n    void SCN_PAINTED();\n    void SCN_SAVEPOINTLEFT();\n    void SCN_SAVEPOINTREACHED();\n    void SCN_STYLENEEDED(int position);\n    void SCN_UPDATEUI(int updated);\n    void SCN_USERLISTSELECTION(const char *, int);\n    void SCN_ZOOM();\n\nprotected:\n    virtual bool canInsertFromMimeData(const QMimeData *source) const;\n    virtual QByteArray fromMimeData(const QMimeData *source, bool &rectangular) const;\n    virtual QMimeData *toMimeData(const QByteArray &text, bool rectangular) const;\n\n    virtual void contextMenuEvent(QContextMenuEvent *e);\n    virtual void dragEnterEvent(QDragEnterEvent *e);\n    virtual void dragLeaveEvent(QDragLeaveEvent *e);\n    virtual void dragMoveEvent(QDragMoveEvent *e);\n    virtual void dropEvent(QDropEvent *e);\n    virtual void focusInEvent(QFocusEvent *e);\n    virtual void focusOutEvent(QFocusEvent *e);\n    virtual bool focusNextPrevChild(bool next);\n    virtual void keyPressEvent(QKeyEvent *e);\n    virtual void inputMethodEvent(QInputMethodEvent *e);\n    virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const;\n    virtual void mouseDoubleClickEvent(QMouseEvent *e);\n    virtual void mouseMoveEvent(QMouseEvent *e);\n    virtual void mousePressEvent(QMouseEvent *e);\n    virtual void mouseReleaseEvent(QMouseEvent *e);\n    virtual void paintEvent(QPaintEvent *e);\n    virtual void resizeEvent(QResizeEvent *e);\n    virtual void scrollContentsBy(int dx, int dy);\n\nprivate:\n    QsciScintillaBase(const QsciScintillaBase &);\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscistyle.sip",
    "content": "// This is the SIP interface definition for QsciStyle.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciStyle\n{\n%TypeHeaderCode\n#include <Qsci/qscistyle.h>\n%End\n\npublic:\n    enum TextCase {\n        OriginalCase,\n        UpperCase,\n        LowerCase\n    };\n\n    QsciStyle(int style = -1);\n    QsciStyle(int style, const QString &description, const QColor &color,\n            const QColor &paper, const QFont &font, bool eolFill = false);\n\n    int style() const;\n\n    void setDescription(const QString &description);\n    QString description() const;\n\n    void setColor(const QColor &color);\n    QColor color() const;\n\n    void setPaper(const QColor &paper);\n    QColor paper() const;\n\n    void setFont(const QFont &font);\n    QFont font() const;\n\n    void setEolFill(bool fill);\n    bool eolFill() const;\n\n    void setTextCase(TextCase text_case);\n    TextCase textCase() const;\n\n    void setVisible(bool visible);\n    bool visible() const;\n\n    void setChangeable(bool changeable);\n    bool changeable() const;\n\n    void setHotspot(bool hotspot);\n    bool hotspot() const;\n\n    void refresh();\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Python/sip/qscistyledtext.sip",
    "content": "// This is the SIP interface definition for QsciStyledText.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\nclass QsciStyledText\n{\n%TypeHeaderCode\n#include <Qsci/qscistyledtext.h>\n%End\n\npublic:\n    QsciStyledText(const QString &text, int style);\n    QsciStyledText(const QString &text, const QsciStyle &style);\n\n    const QString &text();\n    int style() const;\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/InputMethod.cpp",
    "content": "// Copyright (c) 2014 Riverbank Computing Limited\n// Copyright (c) 2011 Archaeopteryx Software, Inc.\n// Copyright (c) 1990-2011, Scientific Toolworks, Inc.\n//\n// The License.txt file describes the conditions under which this software may\n// be distributed.\n\n\n#include <qglobal.h>\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/ListBoxQt.cpp",
    "content": "// This module implements the specialisation of QListBox that handles the\n// Scintilla double-click callback.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"ListBoxQt.h\"\n\n#include <stdlib.h>\n\n#include \"SciClasses.h\"\n#include \"Qsci/qsciscintilla.h\"\n\n\nQsciListBoxQt::QsciListBoxQt()\n    : cb_action(0), cb_data(0), slb(0), visible_rows(5), utf8(false)\n{\n}\n\n\nvoid QsciListBoxQt::SetFont(QSCI_SCI_NAMESPACE(Font) &font)\n{\n    QFont *f = reinterpret_cast<QFont *>(font.GetID());\n\n    if (f)\n        slb->setFont(*f);\n}\n\n\nvoid QsciListBoxQt::Create(QSCI_SCI_NAMESPACE(Window) &parent, int,\n        QSCI_SCI_NAMESPACE(Point), int, bool unicodeMode, int)\n{\n    utf8 = unicodeMode;\n\n    // The parent we want is the QsciScintillaBase, not the text area.\n    wid = slb = new QsciSciListBox(reinterpret_cast<QWidget *>(parent.GetID())->parentWidget(), this);\n}\n\n\nvoid QsciListBoxQt::SetAverageCharWidth(int)\n{\n    // We rely on sizeHint() for the size of the list box rather than make\n    // calculations based on the average character width and the number of\n    // visible rows.\n}\n\n\nvoid QsciListBoxQt::SetVisibleRows(int vrows)\n{\n    // We only pretend to implement this.\n    visible_rows = vrows;\n}\n\n\nint QsciListBoxQt::GetVisibleRows() const\n{\n    return visible_rows;\n}\n\n\nQSCI_SCI_NAMESPACE(PRectangle) QsciListBoxQt::GetDesiredRect()\n{\n    QSCI_SCI_NAMESPACE(PRectangle) rc(0, 0, 100, 100);\n\n    if (slb)\n    {\n        QSize sh = slb->sizeHint();\n\n        rc.right = sh.width();\n        rc.bottom = sh.height();\n    }\n\n    return rc;\n}\n\n\nint QsciListBoxQt::CaretFromEdge()\n{\n    int dist = 0;\n\n    // Find the width of the biggest image.\n    for (xpmMap::const_iterator it = xset.begin(); it != xset.end(); ++it)\n    {\n        int w = it.data().width();\n\n        if (dist < w)\n            dist = w;\n    }\n\n    if (slb)\n        dist += slb->frameWidth();\n\n    // Fudge factor - adjust if required.\n    dist += 3;\n\n    return dist;\n}\n\n\nvoid QsciListBoxQt::Clear()\n{\n    Q_ASSERT(slb);\n\n    slb->clear();\n}\n\n\nvoid QsciListBoxQt::Append(char *s, int type)\n{\n    Q_ASSERT(slb);\n\n    QString qs;\n\n    if (utf8)\n        qs = QString::fromUtf8(s);\n    else\n        qs = QString::fromLatin1(s);\n\n    xpmMap::const_iterator it;\n\n    if (type < 0 || (it = xset.find(type)) == xset.end())\n        slb->addItem(qs);\n    else\n        slb->addItemPixmap(it.data(), qs);\n}\n\n\nint QsciListBoxQt::Length()\n{\n    Q_ASSERT(slb);\n\n    return slb->count();\n}\n\n\nvoid QsciListBoxQt::Select(int n)\n{\n    Q_ASSERT(slb);\n\n    slb->setCurrentRow(n);\n}\n\n\nint QsciListBoxQt::GetSelection()\n{\n    Q_ASSERT(slb);\n\n    return slb->currentRow();\n}\n\n\nint QsciListBoxQt::Find(const char *prefix)\n{\n    Q_ASSERT(slb);\n\n    return slb->find(prefix);\n}\n\n\nvoid QsciListBoxQt::GetValue(int n, char *value, int len)\n{\n    Q_ASSERT(slb);\n\n    QString selection = slb->text(n);\n\n    bool trim_selection = false;\n    QObject *sci_obj = slb->parent();\n\n    if (sci_obj->inherits(\"QsciScintilla\"))\n    {\n        QsciScintilla *sci = static_cast<QsciScintilla *>(sci_obj);\n\n        if (sci->isAutoCompletionList())\n        {\n            // Save the full selection and trim the value we return.\n            sci->acSelection = selection;\n            trim_selection = true;\n        }\n    }\n\n    if (selection.isEmpty() || len <= 0)\n        value[0] = '\\0';\n    else\n    {\n        const char *s;\n        int slen;\n\n        QCString bytes;\n\n        if (utf8)\n        {\n            bytes = selection.utf8();\n            s = bytes.data();\n            slen = bytes.length();\n        }\n        else\n        {\n            s = selection.latin1();\n            slen = (s ? qstrlen(s) : 0);\n        }\n\n        while (slen-- && len--)\n        {\n            if (trim_selection && *s == ' ')\n                break;\n\n            *value++ = *s++;\n        }\n\n        *value = '\\0';\n    }\n}\n\n\nvoid QsciListBoxQt::Sort()\n{\n    Q_ASSERT(slb);\n\n    slb->sortItems();\n}\n\n\nvoid QsciListBoxQt::RegisterImage(int type, const char *xpm_data)\n{\n    xset.insert(type, *reinterpret_cast<const QPixmap *>(xpm_data));\n}\n\n\nvoid QsciListBoxQt::RegisterRGBAImage(int type, int, int,\n        const unsigned char *pixelsImage)\n{\n    QPixmap pm;\n\n    pm.convertFromImage(*reinterpret_cast<const QImage *>(pixelsImage));\n\n    xset.insert(type, pm);\n}\n\n\nvoid QsciListBoxQt::ClearRegisteredImages()\n{\n    xset.clear();\n}\n\n\nvoid QsciListBoxQt::SetDoubleClickAction(\n        QSCI_SCI_NAMESPACE(CallBackAction) action, void *data)\n{\n    cb_action = action;\n    cb_data = data;\n}\n\n\nvoid QsciListBoxQt::SetList(const char *list, char separator, char typesep)\n{\n    char *words;\n\n    Clear();\n\n    if ((words = qstrdup(list)) != NULL)\n    {\n        char *startword = words;\n        char *numword = NULL;\n\n        for (int i = 0; words[i] != '\\0'; i++)\n        {\n            if (words[i] == separator)\n            {\n                words[i] = '\\0';\n\n                if (numword)\n                    *numword = '\\0';\n\n                Append(startword, numword ? atoi(numword + 1) : -1);\n\n                startword = words + i + 1;\n                numword = NULL;\n            }\n            else if (words[i] == typesep)\n            {\n                numword = words + i;\n            }\n        }\n\n        if (startword)\n        {\n            if (numword)\n                *numword = '\\0';\n\n            Append(startword, numword ? atoi(numword + 1) : -1);\n        }\n\n        delete[] words;\n    }\n}\n\n\n// The ListBox methods that need to be implemented explicitly.\n\nQSCI_SCI_NAMESPACE(ListBox)::ListBox()\n{\n}\n\n\nQSCI_SCI_NAMESPACE(ListBox)::~ListBox()\n{\n}\n\n\nQSCI_SCI_NAMESPACE(ListBox) *QSCI_SCI_NAMESPACE(ListBox)::Allocate()\n{\n    return new QsciListBoxQt();\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/ListBoxQt.h",
    "content": "// This defines the specialisation of QListBox that handles the Scintilla\n// double-click callback.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include <qmap.h>\n#include <qpixmap.h>\n#include <qstring.h>\n\n#include \"SciNamespace.h\"\n\n#include \"Platform.h\"\n\n\nclass QsciSciListBox;\n\n\n// This is an internal class but it is referenced by a public class so it has\n// to have a Qsci prefix rather than being put in the Scintilla namespace\n// which would mean exposing the SCI_NAMESPACE mechanism).\nclass QsciListBoxQt : public QSCI_SCI_NAMESPACE(ListBox)\n{\npublic:\n    QsciListBoxQt();\n\n    QSCI_SCI_NAMESPACE(CallBackAction) cb_action;\n    void *cb_data;\n\n    virtual void SetFont(QSCI_SCI_NAMESPACE(Font) &font);\n    virtual void Create(QSCI_SCI_NAMESPACE(Window) &parent, int,\n            QSCI_SCI_NAMESPACE(Point), int, bool unicodeMode, int);\n    virtual void SetAverageCharWidth(int);\n    virtual void SetVisibleRows(int);\n    virtual int GetVisibleRows() const;\n    virtual QSCI_SCI_NAMESPACE(PRectangle) GetDesiredRect();\n    virtual int CaretFromEdge();\n    virtual void Clear();\n    virtual void Append(char *s, int type = -1);\n    virtual int Length();\n    virtual void Select(int n);\n    virtual int GetSelection();\n    virtual int Find(const char *prefix);\n    virtual void GetValue(int n, char *value, int len);\n    virtual void Sort();\n    virtual void RegisterImage(int type, const char *xpm_data);\n    virtual void RegisterRGBAImage(int type, int width, int height,\n            const unsigned char *pixelsImage);\n    virtual void ClearRegisteredImages();\n    virtual void SetDoubleClickAction(\n            QSCI_SCI_NAMESPACE(CallBackAction) action, void *data);\n    virtual void SetList(const char *list, char separator, char typesep);\n\nprivate:\n    QsciSciListBox *slb;\n    int visible_rows;\n    bool utf8;\n\n    typedef QMap<int, QPixmap> xpmMap;\n    xpmMap xset;\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/MacPasteboardMime.cpp",
    "content": "// This module implements part of the support for rectangular selections on\n// OS/X.  It is a separate file to avoid clashes between OS/X and Scintilla\n// data types.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include <qglobal.h>\n\n#if (QT_VERSION >= 0x040200 && QT_VERSION < 0x050000 && defined(Q_OS_MAC)) || (QT_VERSION >= 0x050200 && defined(Q_OS_OSX))\n\n#include <QByteArray>\n#include <QLatin1String>\n#include <QList>\n#include <QString>\n#include <QStringList>\n#include <QVariant>\n\n#include <QMacPasteboardMime>\n\n\nstatic const QLatin1String mimeRectangular(\"text/x-qscintilla-rectangular\");\nstatic const QLatin1String utiRectangularMac(\"com.scintilla.utf16-plain-text.rectangular\");\n\n\nclass RectangularPasteboardMime : public QMacPasteboardMime\n{\npublic:\n    RectangularPasteboardMime() : QMacPasteboardMime(MIME_ALL)\n    {\n    }\n\n    bool canConvert(const QString &mime, QString flav)\n    {\n        return mime == mimeRectangular && flav == utiRectangularMac;\n    }\n\n    QList<QByteArray> convertFromMime(const QString &, QVariant data, QString)\n    {\n        QList<QByteArray> converted;\n\n        converted.append(data.toByteArray());\n\n        return converted;\n    }\n\n    QVariant convertToMime(const QString &, QList<QByteArray> data, QString)\n    {\n        QByteArray converted;\n\n        foreach (QByteArray i, data)\n        {\n            converted += i;\n        }\n\n        return QVariant(converted);\n    }\n\n    QString convertorName()\n    {\n        return QString(\"QScintillaRectangular\");\n    }\n\n    QString flavorFor(const QString &mime)\n    {\n        if (mime == mimeRectangular)\n            return QString(utiRectangularMac);\n\n        return QString();\n    }\n\n    QString mimeFor(QString flav)\n    {\n        if (flav == utiRectangularMac)\n            return QString(mimeRectangular);\n\n        return QString();\n    }\n};\n\n\n// Initialise the singleton instance.\nvoid initialiseRectangularPasteboardMime()\n{\n    static RectangularPasteboardMime *instance = 0;\n\n    if (!instance)\n    {\n        instance = new RectangularPasteboardMime();\n\n        qRegisterDraggedTypes(QStringList(utiRectangularMac));\n    }\n}\n\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/PlatQt.cpp",
    "content": "// This module implements the portability layer for the Qt port of Scintilla.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include <stdio.h>\n#include <stdarg.h>\n#include <string.h>\n\n#include <qapplication.h>\n#include <qwidget.h>\n#include <qfont.h>\n#include <qpixmap.h>\n#include <qimage.h>\n#include <qstring.h>\n#include <qdatetime.h>\n#include <qpainter.h>\n#include <qcursor.h>\n#include <qlibrary.h>\n\n#include <qpaintdevicemetrics.h>\n#include <qpointarray.h>\n\n#include \"SciNamespace.h\"\n\n#include \"Platform.h\"\n#include \"XPM.h\"\n\n#include \"Qsci/qsciscintillabase.h\"\n#include \"SciClasses.h\"\n\n#include \"FontQuality.h\"\n\n\nQSCI_BEGIN_SCI_NAMESPACE\n\n// Type convertors.\nstatic QFont *PFont(FontID fid)\n{\n    return reinterpret_cast<QFont *>(fid);\n}\n\nstatic QWidget *PWindow(WindowID wid)\n{\n    return reinterpret_cast<QWidget *>(wid);\n}\n\nstatic QsciSciPopup *PMenu(MenuID mid)\n{\n    return reinterpret_cast<QsciSciPopup *>(mid);\n}\n\n\n// Create a Point instance from a long value.\nPoint Point::FromLong(long lpoint)\n{\n    return Point(Platform::LowShortFromLong(lpoint),\n            Platform::HighShortFromLong(lpoint));\n}\n\n\n// Font management.\nFont::Font() : fid(0)\n{\n}\n\nFont::~Font()\n{\n}\n\nvoid Font::Create(const FontParameters &fp)\n{\n    Release();\n\n    QFont *f = new QFont();\n\n    QFont::StyleStrategy strategy;\n\n    switch (fp.extraFontFlag & SC_EFF_QUALITY_MASK)\n    {\n    case SC_EFF_QUALITY_NON_ANTIALIASED:\n        strategy = QFont::NoAntialias;\n        break;\n\n    case SC_EFF_QUALITY_ANTIALIASED:\n        strategy = QFont::PreferAntialias;\n        break;\n\n    default:\n        strategy = QFont::PreferDefault;\n    }\n\n#if defined(Q_OS_MAC)\n#if QT_VERSION >= 0x040700\n    strategy = static_cast<QFont::StyleStrategy>(strategy | QFont::ForceIntegerMetrics);\n#else\n#warning \"Correct handling of QFont metrics requires Qt v4.7.0 or later\"\n#endif\n#endif\n\n    f->setStyleStrategy(strategy);\n\n    // If name of the font begins with a '-', assume, that it is an XLFD.\n    if (fp.faceName[0] == '-')\n    {\n        f->setRawName(fp.faceName);\n    }\n    else\n    {\n        f->setFamily(fp.faceName);\n        f->setPointSizeF(fp.size);\n\n        // See if the Qt weight has been passed via the back door.   Otherwise\n        // map Scintilla weights to Qt weights ensuring that the SC_WEIGHT_*\n        // values get mapped to the correct QFont::Weight values.\n        int qt_weight;\n\n        if (fp.weight < 0)\n            qt_weight = -fp.weight;\n        else if (fp.weight <= 200)\n            qt_weight = QFont::Light;\n        else if (fp.weight <= QsciScintillaBase::SC_WEIGHT_NORMAL)\n            qt_weight = QFont::Normal;\n        else if (fp.weight <= 600)\n            qt_weight = QFont::DemiBold;\n        else if (fp.weight <= 850)\n            qt_weight = QFont::Bold;\n        else\n            qt_weight = QFont::Black;\n\n        f->setWeight(qt_weight);\n\n        f->setItalic(fp.italic);\n    }\n\n    fid = f;\n}\n\nvoid Font::Release()\n{\n    if (fid)\n    {\n        delete PFont(fid);\n        fid = 0;\n    }\n}\n\n\n// A surface abstracts a place to draw.\nclass SurfaceImpl : public Surface\n{\npublic:\n    SurfaceImpl();\n    virtual ~SurfaceImpl();\n\n    void Init(WindowID wid);\n    void Init(SurfaceID sid, WindowID);\n    void Init(QPainter *p);\n    void InitPixMap(int width, int height, Surface *, WindowID wid);\n\n    void Release();\n    bool Initialised() {return painter;}\n    void PenColour(ColourDesired fore);\n    int LogPixelsY() {return QPaintDeviceMetrics(pd).logicalDpiY();}\n    int DeviceHeightFont(int points) {return points;}\n    void MoveTo(int x_,int y_);\n    void LineTo(int x_,int y_);\n    void Polygon(Point *pts, int npts, ColourDesired fore,\n            ColourDesired back);\n    void RectangleDraw(PRectangle rc, ColourDesired fore,\n            ColourDesired back);\n    void FillRectangle(PRectangle rc, ColourDesired back);\n    void FillRectangle(PRectangle rc, Surface &surfacePattern);\n    void RoundedRectangle(PRectangle rc, ColourDesired fore,\n            ColourDesired back);\n    void AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill,\n            int alphaFill, ColourDesired outline, int alphaOutline,\n            int flags);\n    void DrawRGBAImage(PRectangle rc, int width, int height, const unsigned char *pixelsImage);\n    void Ellipse(PRectangle rc, ColourDesired fore, ColourDesired back);\n    void Copy(PRectangle rc, Point from, Surface &surfaceSource);\n\n    void DrawTextNoClip(PRectangle rc, Font &font_, XYPOSITION ybase,\n            const char *s, int len, ColourDesired fore, ColourDesired back);\n    void DrawTextClipped(PRectangle rc, Font &font_, XYPOSITION ybase,\n            const char *s, int len, ColourDesired fore, ColourDesired back);\n    void DrawTextTransparent(PRectangle rc, Font &font_, XYPOSITION ybase,\n            const char *s, int len, ColourDesired fore);\n    void MeasureWidths(Font &font_, const char *s, int len,\n            XYPOSITION *positions);\n    XYPOSITION WidthText(Font &font_, const char *s, int len);\n    XYPOSITION WidthChar(Font &font_, char ch);\n    XYPOSITION Ascent(Font &font_);\n    XYPOSITION Descent(Font &font_);\n    XYPOSITION InternalLeading(Font &font_) {return 0;}\n    XYPOSITION ExternalLeading(Font &font_);\n    XYPOSITION Height(Font &font_);\n    XYPOSITION AverageCharWidth(Font &font_);\n\n    void SetClip(PRectangle rc);\n    void FlushCachedState();\n\n    void SetUnicodeMode(bool unicodeMode_) {unicodeMode = unicodeMode_;}\n    void SetDBCSMode(int codePage) {}\n\n    void DrawXPM(PRectangle rc, const XPM *xpm);\n\nprivate:\n    void drawRect(const PRectangle &rc);\n    void drawText(const PRectangle &rc, Font &font_, XYPOSITION ybase,\n            const char *s, int len, ColourDesired fore);\n    static QFont convertQFont(Font &font);\n    QFontMetrics metrics(Font &font_);\n    QString convertText(const char *s, int len);\n    static QColor convertQColor(const ColourDesired &col,\n            unsigned alpha = 255);\n    static QRgb convertQRgb(const ColourDesired &col, unsigned alpha);\n\n    bool unicodeMode;\n    QPaintDevice *pd;\n    QPainter *painter;\n    bool my_resources;\n    int pen_x, pen_y;\n};\n\nSurface *Surface::Allocate(int)\n{\n    return new SurfaceImpl;\n}\n\nSurfaceImpl::SurfaceImpl()\n    : unicodeMode(false), pd(0), painter(0), my_resources(false), pen_x(0),\n      pen_y(0)\n{\n}\n\nSurfaceImpl::~SurfaceImpl()\n{\n    Release();\n}\n\nvoid SurfaceImpl::Init(WindowID wid)\n{\n    Release();\n\n    pd = reinterpret_cast<QWidget *>(wid);\n}\n\nvoid SurfaceImpl::Init(SurfaceID sid, WindowID)\n{\n    Release();\n\n    // This method, and the SurfaceID type, is only used when printing.  As it\n    // is actually a void * we pass (when using SCI_FORMATRANGE) a pointer to a\n    // QPainter rather than a pointer to a SurfaceImpl as might be expected.\n    QPainter *p = reinterpret_cast<QPainter *>(sid);\n\n    pd = p->device();\n    painter = p;\n}\n\nvoid SurfaceImpl::Init(QPainter *p)\n{\n    Release();\n\n    pd = p->device();\n    painter = p;\n}\n\nvoid SurfaceImpl::InitPixMap(int width, int height, Surface *, WindowID wid)\n{\n    Release();\n\n#if QT_VERSION >= 0x050100\n    int dpr = PWindow(wid)->devicePixelRatio();\n    QPixmap *pixmap = new QPixmap(width * dpr, height * dpr);\n    pixmap->setDevicePixelRatio(dpr);\n#else\n    QPixmap *pixmap = new QPixmap(width, height);\n    Q_UNUSED(wid);\n#endif\n\n    pd = pixmap;\n\n    painter = new QPainter(pd);\n    my_resources = true;\n}\n\nvoid SurfaceImpl::Release()\n{\n    if (my_resources)\n    {\n        if (painter)\n            delete painter;\n\n        if (pd)\n            delete pd;\n\n        my_resources = false;\n    }\n\n    painter = 0;\n    pd = 0;\n}\n\nvoid SurfaceImpl::MoveTo(int x_, int y_)\n{\n    Q_ASSERT(painter);\n\n    pen_x = x_;\n    pen_y = y_;\n}\n\nvoid SurfaceImpl::LineTo(int x_, int y_)\n{\n    Q_ASSERT(painter);\n\n    painter->drawLine(pen_x, pen_y, x_, y_);\n\n    pen_x = x_;\n    pen_y = y_;\n}\n\nvoid SurfaceImpl::PenColour(ColourDesired fore)\n{\n    Q_ASSERT(painter);\n\n    painter->setPen(convertQColor(fore));\n}\n\nvoid SurfaceImpl::Polygon(Point *pts, int npts, ColourDesired fore,\n        ColourDesired back)\n{\n    Q_ASSERT(painter);\n\n    QPointArray qpts(npts);\n\n    for (int i = 0; i < npts; ++i)\n        qpts.setPoint(i, pts[i].x, pts[i].y);\n\n    painter->setPen(convertQColor(fore));\n    painter->setBrush(convertQColor(back));\n    painter->drawPolygon(qpts);\n}\n\nvoid SurfaceImpl::RectangleDraw(PRectangle rc, ColourDesired fore,\n        ColourDesired back)\n{\n    Q_ASSERT(painter);\n\n    painter->setPen(convertQColor(fore));\n    painter->setBrush(convertQColor(back));\n    drawRect(rc);\n}\n\nvoid SurfaceImpl::FillRectangle(PRectangle rc, ColourDesired back)\n{\n    Q_ASSERT(painter);\n\n    painter->setPen(Qt::NoPen);\n    painter->setBrush(convertQColor(back));\n    drawRect(rc);\n}\n\nvoid SurfaceImpl::FillRectangle(PRectangle rc, Surface &surfacePattern)\n{\n    Q_ASSERT(painter);\n\n    SurfaceImpl &si = static_cast<SurfaceImpl &>(surfacePattern);\n    QPixmap *pm = static_cast<QPixmap *>(si.pd);\n\n    if (pm)\n    {\n        QBrush brsh(Qt::black, *pm);\n\n        painter->setPen(Qt::NoPen);\n        painter->setBrush(brsh);\n        drawRect(rc);\n    }\n    else\n    {\n        FillRectangle(rc, ColourDesired(0));\n    }\n}\n\nvoid SurfaceImpl::RoundedRectangle(PRectangle rc, ColourDesired fore,\n        ColourDesired back)\n{\n    Q_ASSERT(painter);\n\n    painter->setPen(convertQColor(fore));\n    painter->setBrush(convertQColor(back));\n    painter->drawRoundRect(rc.left, rc.top, rc.right - rc.left,\n            rc.bottom - rc.top);\n}\n\nvoid SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize,\n        ColourDesired fill, int alphaFill, ColourDesired outline,\n        int alphaOutline, int)\n{\n    Q_ASSERT(painter);\n\n    int w = rc.right - rc.left;\n    int h = rc.bottom - rc.top;\n    QImage img(w, h, 32);\n\n    img.fill(convertQRgb(fill, alphaFill));\n    img.setAlphaBuffer(true);\n\n    // Assume that \"cornerSize\" means outline width (which it doesn't but keep\n    // this for historical reasons).\n    if (cornerSize > 0)\n    {\n        QRgb oline = convertQRgb(outline, alphaOutline);\n\n        int linew = cornerSize;\n\n        if (linew > w)\n            linew = w;\n\n        for (int y = 0; y < h; ++y)\n        {\n            int x;\n\n            if (y < cornerSize || y >= (h - cornerSize))\n                for (x = 0; x < w; ++x)\n                    img.setPixel(x, y, oline);\n            else\n            {\n                for (x = 0; x < linew; ++x)\n                    img.setPixel(x, y, oline);\n\n                for (x = w - 1; x >= w - linew; --x)\n                    img.setPixel(x, y, oline);\n            }\n        }\n    }\n\n    painter->drawImage(rc.left, rc.top, img);\n}\n\nvoid SurfaceImpl::drawRect(const PRectangle &rc)\n{\n    painter->drawRect(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);\n}\n\nvoid SurfaceImpl::Ellipse(PRectangle rc, ColourDesired fore,\n        ColourDesired back)\n{\n    Q_ASSERT(painter);\n\n    painter->setPen(convertQColor(fore));\n    painter->setBrush(convertQColor(back));\n    painter->drawEllipse(rc.left, rc.top, rc.right - rc.left,\n            rc.bottom - rc.top);\n}\n\nvoid SurfaceImpl::Copy(PRectangle rc, Point from, Surface &surfaceSource)\n{\n    Q_ASSERT(painter);\n\n    SurfaceImpl &si = static_cast<SurfaceImpl &>(surfaceSource);\n\n    if (si.pd)\n    {\n        si.painter->end();\n        painter->end();\n\n        bitBlt(pd, rc.left, rc.top, si.pd, from.x, from.y, rc.right - rc.left,\n                rc.bottom - rc.top);\n\n        si.painter->begin(si.pd);\n        painter->begin(pd);\n    }\n}\n\nvoid SurfaceImpl::DrawTextNoClip(PRectangle rc, Font &font_, XYPOSITION ybase,\n        const char *s, int len, ColourDesired fore, ColourDesired back)\n{\n    Q_ASSERT(painter);\n\n    FillRectangle(rc, back);\n    drawText(rc, font_, ybase, s, len, fore);\n}\n\nvoid SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font_, XYPOSITION ybase,\n        const char *s, int len, ColourDesired fore, ColourDesired back)\n{\n    Q_ASSERT(painter);\n\n    SetClip(rc);\n    DrawTextNoClip(rc, font_, ybase, s, len, fore, back);\n    painter->setClipping(false);\n}\n\nvoid SurfaceImpl::DrawTextTransparent(PRectangle rc, Font &font_,\n        XYPOSITION ybase, const char *s, int len, ColourDesired fore)\n{\n    // Only draw if there is a non-space.\n    for (int i = 0; i < len; ++i)\n        if (s[i] != ' ')\n        {\n            drawText(rc, font_, ybase, s, len, fore);\n            return;\n        }\n}\n\nvoid SurfaceImpl::drawText(const PRectangle &rc, Font &font_, XYPOSITION ybase,\n        const char *s, int len, ColourDesired fore)\n{\n    QString qs = convertText(s, len);\n\n    QFont *f = PFont(font_.GetID());\n\n    if (f)\n        painter->setFont(*f);\n\n    painter->setPen(convertQColor(fore));\n    painter->drawText(rc.left, ybase, qs);\n}\n\nvoid SurfaceImpl::DrawXPM(PRectangle rc, const XPM *xpm)\n{\n    Q_ASSERT(painter);\n\n    XYPOSITION x, y;\n    const QPixmap &qpm = xpm->Pixmap();\n\n    x = rc.left + (rc.Width() - qpm.width()) / 2.0;\n    y = rc.top + (rc.Height() - qpm.height()) / 2.0;\n\n    painter->drawPixmap(x, y, qpm);\n}\n\nvoid SurfaceImpl::DrawRGBAImage(PRectangle rc, int width, int height,\n        const unsigned char *pixelsImage)\n{\n    Q_ASSERT(painter);\n\n    const QImage *qim = reinterpret_cast<const QImage *>(pixelsImage);\n\n    painter->drawImage(rc.left, rc.top, *qim);\n}\n\nvoid SurfaceImpl::MeasureWidths(Font &font_, const char *s, int len,\n        XYPOSITION *positions)\n{\n    QString qs = convertText(s, len);\n    QFontMetrics fm = metrics(font_);\n\n    // The position for each byte of a character is the offset from the start\n    // where the following character should be drawn.\n    int i_byte = 0;\n\n    for (int i_char = 0; i_char < qs.length(); ++i_char)\n    {\n        // We can't just add the individual character widths together because\n        // of kerning.\n        XYPOSITION width = qRound(fm.width(qs.left(i_char + 1)));\n\n        if (unicodeMode)\n        {\n            // Set the same position for each byte of the character.\n            int nbytes = qs.mid(i_char, 1).utf8().length();\n\n            while (nbytes--)\n                positions[i_byte++] = width;\n        }\n        else\n        {\n            positions[i_byte++] = width;\n        }\n    }\n}\n\nXYPOSITION SurfaceImpl::WidthText(Font &font_, const char *s, int len)\n{\n    return metrics(font_).width(convertText(s, len));\n\n}\n\nXYPOSITION SurfaceImpl::WidthChar(Font &font_, char ch)\n{\n    return metrics(font_).width(ch);\n}\n\nXYPOSITION SurfaceImpl::Ascent(Font &font_)\n{\n    return metrics(font_).ascent();\n}\n\nXYPOSITION SurfaceImpl::Descent(Font &font_)\n{\n    // Qt doesn't include the baseline in the descent, so add it.  Note that\n    // a descent from Qt4 always seems to be 2 pixels larger (irrespective of\n    // font or size) than the same descent from Qt3.  This means that text is a\n    // little more spaced out with Qt4 - and will be more noticeable with\n    // smaller fonts.\n    return metrics(font_).descent() + 1;\n}\n\nXYPOSITION SurfaceImpl::ExternalLeading(Font &font_)\n{\n    // Scintilla doesn't use this at the moment, which is good because Qt4 can\n    // return a negative value.\n    return metrics(font_).leading();\n}\n\nXYPOSITION SurfaceImpl::Height(Font &font_)\n{\n    return metrics(font_).height();\n}\n\nXYPOSITION SurfaceImpl::AverageCharWidth(Font &font_)\n{\n#if QT_VERSION >= 0x040200\n    return metrics(font_).averageCharWidth();\n#else\n    return WidthChar(font_, 'n');\n#endif\n}\n\nvoid SurfaceImpl::SetClip(PRectangle rc)\n{\n    Q_ASSERT(painter);\n\n    painter->setClipRect(rc.left, rc.top, rc.right - rc.left,\n            rc.bottom - rc.top);\n}\n\nvoid SurfaceImpl::FlushCachedState()\n{\n}\n\n// Return the QFont for a Font.\nQFont SurfaceImpl::convertQFont(Font &font)\n{\n    QFont *f = PFont(font.GetID());\n\n    if (f)\n        return *f;\n\n    return QApplication::font();\n}\n\n// Get the metrics for a font.\nQFontMetrics SurfaceImpl::metrics(Font &font_)\n{\n    QFont fnt = convertQFont(font_);\n\n    if (painter && painter->isActive())\n    {\n        painter->setFont(fnt);\n\n        return painter->fontMetrics();\n    }\n\n    return QFontMetrics(fnt);\n}\n\n// Convert a Scintilla string to a Qt Unicode string.\nQString SurfaceImpl::convertText(const char *s, int len)\n{\n    if (unicodeMode)\n        return QString::fromUtf8(s, len);\n\n    return QString::fromLatin1(s, len);\n}\n\n// Convert a Scintilla colour and alpha component to a Qt QRgb.\nQRgb SurfaceImpl::convertQRgb(const ColourDesired &col, unsigned alpha)\n{\n    long c = col.AsLong();\n\n    unsigned r = c & 0xff;\n    unsigned g = (c >> 8) & 0xff;\n    unsigned b = (c >> 16) & 0xff;\n\n    return qRgba(r, g, b, alpha);\n}\n\n// Convert a Scintilla colour, and alpha component, to a Qt QColor.\nQColor SurfaceImpl::convertQColor(const ColourDesired &col, unsigned alpha)\n{\n    QColor c;\n    c.setRgb(convertQRgb(col, alpha));\n\n    return c;\n}\n\n\n// Window (widget) management.\nWindow::~Window()\n{\n}\n\nvoid Window::Destroy()\n{\n    QWidget *w = PWindow(wid);\n\n    if (w)\n    {\n        // Delete the widget next time round the event loop rather than\n        // straight away.  This gets round a problem when auto-completion lists\n        // are cancelled after an entry has been double-clicked, ie. the list's\n        // dtor is called from one of the list's slots.  There are other ways\n        // around the problem but this is the simplest and doesn't seem to\n        // cause problems of its own.\n        w->deleteLater();\n        wid = 0;\n    }\n}\n\nbool Window::HasFocus()\n{\n    return PWindow(wid)->hasFocus();\n}\n\nPRectangle Window::GetPosition()\n{\n    QWidget *w = PWindow(wid);\n\n    // Before any size allocated pretend its big enough not to be scrolled.\n    PRectangle rc(0,0,5000,5000);\n\n    if (w)\n    {\n        const QRect &r = w->geometry();\n\n        rc.right = r.right() - r.left() + 1;\n        rc.bottom = r.bottom() - r.top() + 1;\n    }\n\n    return rc;\n}\n\nvoid Window::SetPosition(PRectangle rc)\n{\n    PWindow(wid)->setGeometry(rc.left, rc.top, rc.right - rc.left,\n            rc.bottom - rc.top);\n}\n\nvoid Window::SetPositionRelative(PRectangle rc, Window relativeTo)\n{\n    QWidget *rel = PWindow(relativeTo.wid);\n    QPoint pos = rel->mapToGlobal(rel->pos());\n\n    int x = pos.x() + rc.left;\n    int y = pos.y() + rc.top;\n\n    PWindow(wid)->setGeometry(x, y, rc.right - rc.left, rc.bottom - rc.top);\n}\n\nPRectangle Window::GetClientPosition()\n{\n    return GetPosition();\n}\n\nvoid Window::Show(bool show)\n{\n    QWidget *w = PWindow(wid);\n\n    if (show)\n        w->show();\n    else\n        w->hide();\n}\n\nvoid Window::InvalidateAll()\n{\n    QWidget *w = PWindow(wid);\n\n    if (w)\n        w->update();\n}\n\nvoid Window::InvalidateRectangle(PRectangle rc)\n{\n    QWidget *w = PWindow(wid);\n\n    if (w)\n        w->update(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);\n}\n\nvoid Window::SetFont(Font &font)\n{\n    PWindow(wid)->setFont(*PFont(font.GetID()));\n}\n\nvoid Window::SetCursor(Cursor curs)\n{\n    Qt::CursorShape qc;\n\n    switch (curs)\n    {\n    case cursorText:\n        qc = Qt::IbeamCursor;\n        break;\n\n    case cursorUp:\n        qc = Qt::UpArrowCursor;\n        break;\n\n    case cursorWait:\n        qc = Qt::WaitCursor;\n        break;\n\n    case cursorHoriz:\n        qc = Qt::SizeHorCursor;\n        break;\n\n    case cursorVert:\n        qc = Qt::SizeVerCursor;\n        break;\n\n    case cursorHand:\n        qc = Qt::PointingHandCursor;\n        break;\n\n    default:\n        // Note that Qt doesn't have a standard cursor that could be used to\n        // implement cursorReverseArrow.\n        qc = Qt::ArrowCursor;\n    }\n\n    PWindow(wid)->setCursor(qc);\n}\n\nvoid Window::SetTitle(const char *s)\n{\n    PWindow(wid)->setCaption(s);\n}\n\n\nPRectangle Window::GetMonitorRect(Point)\n{\n    return PRectangle();\n}\n\n\n// Menu management.\nMenu::Menu() : mid(0)\n{\n}\n\nvoid Menu::CreatePopUp()\n{\n    Destroy();\n    mid = new QsciSciPopup();\n}\n\nvoid Menu::Destroy()\n{\n    QsciSciPopup *m = PMenu(mid);\n\n    if (m)\n    {\n        delete m;\n        mid = 0;\n    }\n}\n\nvoid Menu::Show(Point pt, Window &)\n{\n    PMenu(mid)->popup(QPoint(pt.x, pt.y));\n}\n\n\nclass DynamicLibraryImpl : public DynamicLibrary\n{\npublic:\n    DynamicLibraryImpl(const char *modulePath)\n    {\n        m = new QLibrary(modulePath);\n        m->load();\n    }\n\n    virtual ~DynamicLibraryImpl()\n    {\n        if (m)\n            delete m;\n    }\n\n    virtual Function FindFunction(const char *name)\n    {\n        if (m)\n            return (Function)m->resolve(name);\n\n        return 0;\n    }\n\n    virtual bool IsValid()\n    {\n        return m && m->isLoaded();\n    }\n\nprivate:\n    QLibrary* m;\n};\n\nDynamicLibrary *DynamicLibrary::Load(const char *modulePath)\n{\n    return new DynamicLibraryImpl(modulePath);\n}\n\n\n// Elapsed time.  This implementation assumes that the maximum elapsed time is\n// less than 48 hours.\nElapsedTime::ElapsedTime()\n{\n    QTime now = QTime::currentTime();\n\n    bigBit = now.hour() * 60 * 60 + now.minute() * 60 + now.second();\n    littleBit = now.msec();\n}\n\ndouble ElapsedTime::Duration(bool reset)\n{\n    long endBigBit, endLittleBit;\n    QTime now = QTime::currentTime();\n\n    endBigBit = now.hour() * 60 * 60 + now.minute() * 60 + now.second();\n    endLittleBit = now.msec();\n\n    double duration = endBigBit - bigBit;\n\n    if (duration < 0 || (duration == 0 && endLittleBit < littleBit))\n        duration += 24 * 60 * 60;\n\n    duration += (endLittleBit - littleBit) / 1000.0;\n\n    if (reset)\n    {\n        bigBit = endBigBit;\n        littleBit = endLittleBit;\n    }\n\n    return duration;\n}\n\n\n// Manage system wide parameters.\nColourDesired Platform::Chrome()\n{\n    return ColourDesired(0xe0,0xe0,0xe0);\n}\n\nColourDesired Platform::ChromeHighlight()\n{\n    return ColourDesired(0xff,0xff,0xff);\n}\n\nconst char *Platform::DefaultFont()\n{\n    return QApplication::font().family().ascii();\n}\n\nint Platform::DefaultFontSize()\n{\n    return QApplication::font().pointSize();\n}\n\nunsigned int Platform::DoubleClickTime()\n{\n    return QApplication::doubleClickInterval();\n}\n\nbool Platform::MouseButtonBounce()\n{\n    return true;\n}\n\nvoid Platform::DebugDisplay(const char *s)\n{\n    qDebug(\"%s\", s);\n}\n\nbool Platform::IsKeyDown(int)\n{\n    return false;\n}\n\nlong Platform::SendScintilla(WindowID w, unsigned int msg,\n        unsigned long wParam, long lParam)\n{\n    // This is never called.\n    return 0;\n}\n\nlong Platform::SendScintillaPointer(WindowID w, unsigned int msg,\n        unsigned long wParam, void *lParam)\n{\n    // This is never called.\n    return 0;\n}\n\nbool Platform::IsDBCSLeadByte(int, char)\n{\n    // We don't support DBCS.\n    return false;\n}\n\nint Platform::DBCSCharLength(int, const char *)\n{\n    // We don't support DBCS.\n    return 1;\n}\n\nint Platform::DBCSCharMaxLength()\n{\n    // We don't support DBCS.\n    return 2;\n}\n\nint Platform::Minimum(int a, int b)\n{\n    return (a < b) ? a : b;\n}\n\nint Platform::Maximum(int a, int b)\n{\n    return (a > b) ? a : b;\n}\n\nint Platform::Clamp(int val, int minVal, int maxVal)\n{\n    if (val > maxVal)\n        val = maxVal;\n\n    if (val < minVal)\n        val = minVal;\n\n    return val;\n}\n\n\n//#define TRACE\n\n#ifdef TRACE\nvoid Platform::DebugPrintf(const char *format, ...)\n{\n    char buffer[2000];\n    va_list pArguments;\n\n    va_start(pArguments, format);\n    vsprintf(buffer, format, pArguments);\n    va_end(pArguments);\n\n    DebugDisplay(buffer);\n}\n#else\nvoid Platform::DebugPrintf(const char *, ...)\n{\n}\n#endif\n\nstatic bool assertionPopUps = true;\n\nbool Platform::ShowAssertionPopUps(bool assertionPopUps_)\n{\n    bool ret = assertionPopUps;\n\n    assertionPopUps = assertionPopUps_;\n\n    return ret;\n}\n\nvoid Platform::Assert(const char *c, const char *file, int line)\n{\n    qFatal(\"Assertion [%s] failed at %s %d\\n\", c, file, line);\n}\n\nQSCI_END_SCI_NAMESPACE\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qsciabstractapis.h",
    "content": "// This module defines interface to the QsciAbstractAPIs class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCIABSTRACTAPIS_H\n#define QSCIABSTRACTAPIS_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n#include <qstringlist.h>\n\n#include <qvaluelist.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qsciscintilla.h>\n\n\nclass QsciLexer;\n\n\n//! \\brief The QsciAbstractAPIs class represents the interface to the textual\n//! API information used in call tips and for auto-completion.  A sub-class\n//! will provide the actual implementation of the interface.\n//!\n//! API information is specific to a particular language lexer but can be\n//! shared by multiple instances of the lexer.\nclass QSCINTILLA_EXPORT QsciAbstractAPIs : public QObject\n{\n    Q_OBJECT\n\npublic:\n    //! Constructs a QsciAbstractAPIs instance attached to lexer \\a lexer and\n    //! with name \\a name.  \\a lexer becomes the instance's parent object\n    //! although the instance can also be subsequently attached to other\n    //! lexers.\n    QsciAbstractAPIs(QsciLexer *lexer, const char *name = 0);\n\n    //! Destroy the QsciAbstractAPIs instance.\n    virtual ~QsciAbstractAPIs();\n\n    //! Return the lexer that the instance is attached to.\n    QsciLexer *lexer() const;\n\n    //! Update the list \\a list with API entries derived from \\a context.  \\a\n    //! context is the list of words in the text preceding the cursor position.\n    //! The characters that make up a word and the characters that separate\n    //! words are defined by the lexer.  The last word is a partial word and\n    //! may be empty if the user has just entered a word separator.\n    virtual void updateAutoCompletionList(const QStringList &context,\n            QStringList &list) = 0;\n\n    //! This is called when the user selects the entry \\a selection from the\n    //! auto-completion list.  A sub-class can use this as a hint to provide\n    //! more specific API entries in future calls to\n    //! updateAutoCompletionList().  The default implementation does nothing.\n    virtual void autoCompletionSelected(const QString &selection);\n\n    //! Return the call tips valid for the context \\a context.  (Note that the\n    //! last word of the context will always be empty.)  \\a commas is the number\n    //! of commas the user has typed after the context and before the cursor\n    //! position.  The exact position of the list of call tips can be adjusted\n    //! by specifying a corresponding left character shift in \\a shifts.  This\n    //! is normally done to correct for any displayed context according to \\a\n    //! style.\n    //!\n    //! \\sa updateAutoCompletionList()\n    virtual QStringList callTips(const QStringList &context, int commas,\n            QsciScintilla::CallTipsStyle style,\n            QValueList<int> &shifts) = 0;\n\nprivate:\n    QsciLexer *lex;\n\n    QsciAbstractAPIs(const QsciAbstractAPIs &);\n    QsciAbstractAPIs &operator=(const QsciAbstractAPIs &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qsciapis.h",
    "content": "// This module defines interface to the QsciAPIs class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCIAPIS_H\n#define QSCIAPIS_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n#include <qpair.h>\n#include <qstringlist.h>\n\n#include <qvaluelist.h>\n\n#include <Qsci/qsciabstractapis.h>\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qsciscintilla.h>\n\n\nclass QsciAPIsPrepared;\nclass QsciAPIsWorker;\nclass QsciLexer;\n\n\n//! \\brief The QsciAPIs class provies an implementation of the textual API\n//! information used in call tips and for auto-completion.\n//!\n//! Raw API information is read from one or more files.  Each API function is\n//! described by a single line of text comprising the function's name, followed\n//! by the function's optional comma separated parameters enclosed in\n//! parenthesis, and finally followed by optional explanatory text.\n//!\n//! A function name may be followed by a `?' and a number.  The number is used\n//! by auto-completion to display a registered QPixmap with the function name.\n//!\n//! All function names are used by auto-completion, but only those that include\n//! function parameters are used in call tips.\n//!\n//! QScintilla only deals with prepared API information and not the raw\n//! information described above.  This is done so that large APIs can be\n//! handled while still being responsive to user input.  The conversion of raw\n//! information to prepared information is time consuming (think tens of\n//! seconds) and implemented in a separate thread.  Prepared information can\n//! be quickly saved to and loaded from files.  Such files are portable between\n//! different architectures.\n//!\n//! QScintilla based applications that want to support large APIs would\n//! normally provide the user with the ability to specify a set of, possibly\n//! project specific, raw API files and convert them to prepared files that are\n//! loaded quickly when the application is invoked.\nclass QSCINTILLA_EXPORT QsciAPIs : public QsciAbstractAPIs\n{\n    Q_OBJECT\n\npublic:\n    //! Constructs a QsciAPIs instance attached to lexer \\a lexer and with name\n    //! \\a name.  \\a lexer becomes the instance's parent object although the\n    //! instance can also be subsequently attached to other lexers.\n    QsciAPIs(QsciLexer *lexer, const char *name = 0);\n\n    //! Destroy the QsciAPIs instance.\n    virtual ~QsciAPIs();\n\n    //! Add the single raw API entry \\a entry to the current set.\n    //!\n    //! \\sa clear(), load(), remove()\n    void add(const QString &entry);\n\n    //! Deletes all raw API information.\n    //!\n    //! \\sa add(), load(), remove()\n    void clear();\n\n    //! Load the API information from the file named \\a filename, adding it to\n    //! the current set.  Returns true if successful, otherwise false.\n    bool load(const QString &filename);\n\n    //! Remove the single raw API entry \\a entry from the current set.\n    //!\n    //! \\sa add(), clear(), load()\n    void remove(const QString &entry);\n\n    //! Convert the current raw API information to prepared API information.\n    //! This is implemented by a separate thread.\n    //!\n    //! \\sa cancelPreparation()\n    void prepare();\n\n    //! Cancel the conversion of the current raw API information to prepared\n    //! API information.\n    //!\n    //! \\sa prepare()\n    void cancelPreparation();\n\n    //! Return the default name of the prepared API information file.  It is\n    //! based on the name of the associated lexer and in the directory defined\n    //! by the QSCIDIR environment variable.  If the environment variable isn't\n    //! set then $HOME/.qsci is used.\n    QString defaultPreparedName() const;\n\n    //! Check to see is a prepared API information file named \\a filename\n    //! exists.  If \\a filename is empty then the value returned by\n    //! defaultPreparedName() is used.  Returns true if successful, otherwise\n    //! false.\n    //!\n    //! \\sa defaultPreparedName()\n    bool isPrepared(const QString &filename = QString()) const;\n\n    //! Load the prepared API information from the file named \\a filename.  If\n    //! \\a filename is empty then a name is constructed based on the name of\n    //! the associated lexer and saved in the directory defined by the QSCIDIR\n    //! environment variable.  If the environment variable isn't set then\n    //! $HOME/.qsci is used.  Returns true if successful, otherwise false.\n    bool loadPrepared(const QString &filename = QString());\n\n    //! Save the prepared API information to the file named \\a filename.  If\n    //! \\a filename is empty then a name is constructed based on the name of\n    //! the associated lexer and saved in the directory defined by the QSCIDIR\n    //! environment variable.  If the environment variable isn't set then\n    //! $HOME/.qsci is used.  Returns true if successful, otherwise false.\n    bool savePrepared(const QString &filename = QString()) const;\n\n    //! \\reimp\n    virtual void updateAutoCompletionList(const QStringList &context,\n            QStringList &list);\n\n    //! \\reimp\n    virtual void autoCompletionSelected(const QString &sel);\n\n    //! \\reimp\n    virtual QStringList callTips(const QStringList &context, int commas,\n            QsciScintilla::CallTipsStyle style,\n            QValueList<int> &shifts);\n\n    //! \\internal Reimplemented to receive termination events from the worker\n    //! thread.\n    virtual bool event(QEvent *e);\n\n    //! Return a list of the installed raw API file names for the associated\n    //! lexer.\n    QStringList installedAPIFiles() const;\n\nsignals:\n    //! This signal is emitted when the conversion of raw API information to\n    //! prepared API information has been cancelled.\n    //!\n    //! \\sa apiPreparationFinished(), apiPreparationStarted()\n    void apiPreparationCancelled();\n\n    //! This signal is emitted when the conversion of raw API information to\n    //! prepared API information starts and can be used to give some visual\n    //! feedback to the user.\n    //!\n    //! \\sa apiPreparationCancelled(), apiPreparationFinished()\n    void apiPreparationStarted();\n    \n    //! This signal is emitted when the conversion of raw API information to\n    //! prepared API information has finished.\n    //!\n    //! \\sa apiPreparationCancelled(), apiPreparationStarted()\n    void apiPreparationFinished();\n\nprivate:\n    friend class QsciAPIsPrepared;\n    friend class QsciAPIsWorker;\n\n    // This indexes a word in a set of raw APIs.  The first part indexes the\n    // entry in the set, the second part indexes the word within the entry.\n    typedef QPair<Q_UINT32, Q_UINT32> WordIndex;\n\n    // This is a list of word indexes.\n    typedef QValueList<WordIndex> WordIndexList;\n\n    QsciAPIsWorker *worker;\n    QStringList old_context;\n    QStringList::const_iterator origin;\n    int origin_len;\n    QString unambiguous_context;\n    QStringList apis;\n    QsciAPIsPrepared *prep;\n\n    static bool enoughCommas(const QString &s, int commas);\n\n    QStringList positionOrigin(const QStringList &context, QString &path);\n    bool originStartsWith(const QString &path, const QString &wsep);\n    const WordIndexList *wordIndexOf(const QString &word) const;\n    void lastCompleteWord(const QString &word, QStringList &with_context,\n            bool &unambig);\n    void lastPartialWord(const QString &word, QStringList &with_context,\n            bool &unambig);\n    void addAPIEntries(const WordIndexList &wl, bool complete,\n            QStringList &with_context, bool &unambig);\n    QString prepName(const QString &filename, bool mkpath = false) const;\n    void deleteWorker();\n\n    QsciAPIs(const QsciAPIs &);\n    QsciAPIs &operator=(const QsciAPIs &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscicommand.h",
    "content": "// This defines the interface to the QsciCommand class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCICOMMAND_H\n#define QSCICOMMAND_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qstring.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qsciscintillabase.h>\n\n\nclass QsciScintilla;\n\n\n//! \\brief The QsciCommand class represents an internal editor command that may\n//! have one or two keys bound to it.\n//!\n//! Methods are provided to change the keys bound to the command and to remove\n//! a key binding.  Each command has a user friendly description of the command\n//! for use in key mapping dialogs.\nclass QSCINTILLA_EXPORT QsciCommand\n{\npublic:\n    //! This enum defines the different commands that can be assigned to a key.\n    enum Command {\n        //! Move down one line.\n        LineDown = QsciScintillaBase::SCI_LINEDOWN,\n\n        //! Extend the selection down one line.\n        LineDownExtend = QsciScintillaBase::SCI_LINEDOWNEXTEND,\n\n        //! Extend the rectangular selection down one line.\n        LineDownRectExtend = QsciScintillaBase::SCI_LINEDOWNRECTEXTEND,\n\n        //! Scroll the view down one line.\n        LineScrollDown = QsciScintillaBase::SCI_LINESCROLLDOWN,\n\n        //! Move up one line.\n        LineUp = QsciScintillaBase::SCI_LINEUP,\n\n        //! Extend the selection up one line.\n        LineUpExtend = QsciScintillaBase::SCI_LINEUPEXTEND,\n\n        //! Extend the rectangular selection up one line.\n        LineUpRectExtend = QsciScintillaBase::SCI_LINEUPRECTEXTEND,\n\n        //! Scroll the view up one line.\n        LineScrollUp = QsciScintillaBase::SCI_LINESCROLLUP,\n\n        //! Scroll to the start of the document.\n        ScrollToStart = QsciScintillaBase::SCI_SCROLLTOSTART,\n\n        //! Scroll to the end of the document.\n        ScrollToEnd = QsciScintillaBase::SCI_SCROLLTOEND,\n\n        //! Scroll vertically to centre the current line.\n        VerticalCentreCaret = QsciScintillaBase::SCI_VERTICALCENTRECARET,\n\n        //! Move down one paragraph.\n        ParaDown = QsciScintillaBase::SCI_PARADOWN,\n\n        //! Extend the selection down one paragraph.\n        ParaDownExtend = QsciScintillaBase::SCI_PARADOWNEXTEND,\n\n        //! Move up one paragraph.\n        ParaUp = QsciScintillaBase::SCI_PARAUP,\n\n        //! Extend the selection up one paragraph.\n        ParaUpExtend = QsciScintillaBase::SCI_PARAUPEXTEND,\n\n        //! Move left one character.\n        CharLeft = QsciScintillaBase::SCI_CHARLEFT,\n\n        //! Extend the selection left one character.\n        CharLeftExtend = QsciScintillaBase::SCI_CHARLEFTEXTEND,\n\n        //! Extend the rectangular selection left one character.\n        CharLeftRectExtend = QsciScintillaBase::SCI_CHARLEFTRECTEXTEND,\n\n        //! Move right one character.\n        CharRight = QsciScintillaBase::SCI_CHARRIGHT,\n\n        //! Extend the selection right one character.\n        CharRightExtend = QsciScintillaBase::SCI_CHARRIGHTEXTEND,\n\n        //! Extend the rectangular selection right one character.\n        CharRightRectExtend = QsciScintillaBase::SCI_CHARRIGHTRECTEXTEND,\n\n        //! Move left one word.\n        WordLeft = QsciScintillaBase::SCI_WORDLEFT,\n\n        //! Extend the selection left one word.\n        WordLeftExtend = QsciScintillaBase::SCI_WORDLEFTEXTEND,\n\n        //! Move right one word.\n        WordRight = QsciScintillaBase::SCI_WORDRIGHT,\n\n        //! Extend the selection right one word.\n        WordRightExtend = QsciScintillaBase::SCI_WORDRIGHTEXTEND,\n\n        //! Move to the end of the previous word.\n        WordLeftEnd = QsciScintillaBase::SCI_WORDLEFTEND,\n\n        //! Extend the selection to the end of the previous word.\n        WordLeftEndExtend = QsciScintillaBase::SCI_WORDLEFTENDEXTEND,\n\n        //! Move to the end of the next word.\n        WordRightEnd = QsciScintillaBase::SCI_WORDRIGHTEND,\n\n        //! Extend the selection to the end of the next word.\n        WordRightEndExtend = QsciScintillaBase::SCI_WORDRIGHTENDEXTEND,\n\n        //! Move left one word part.\n        WordPartLeft = QsciScintillaBase::SCI_WORDPARTLEFT,\n\n        //! Extend the selection left one word part.\n        WordPartLeftExtend = QsciScintillaBase::SCI_WORDPARTLEFTEXTEND,\n\n        //! Move right one word part.\n        WordPartRight = QsciScintillaBase::SCI_WORDPARTRIGHT,\n\n        //! Extend the selection right one word part.\n        WordPartRightExtend = QsciScintillaBase::SCI_WORDPARTRIGHTEXTEND,\n\n        //! Move to the start of the document line.\n        Home = QsciScintillaBase::SCI_HOME,\n\n        //! Extend the selection to the start of the document line.\n        HomeExtend = QsciScintillaBase::SCI_HOMEEXTEND,\n\n        //! Extend the rectangular selection to the start of the document line.\n        HomeRectExtend = QsciScintillaBase::SCI_HOMERECTEXTEND,\n\n        //! Move to the start of the displayed line.\n        HomeDisplay = QsciScintillaBase::SCI_HOMEDISPLAY,\n\n        //! Extend the selection to the start of the displayed line.\n        HomeDisplayExtend = QsciScintillaBase::SCI_HOMEDISPLAYEXTEND,\n\n        //! Move to the start of the displayed or document line.\n        HomeWrap = QsciScintillaBase::SCI_HOMEWRAP,\n\n        //! Extend the selection to the start of the displayed or document\n        //! line.\n        HomeWrapExtend = QsciScintillaBase::SCI_HOMEWRAPEXTEND,\n\n        //! Move to the first visible character in the document line.\n        VCHome = QsciScintillaBase::SCI_VCHOME,\n\n        //! Extend the selection to the first visible character in the document\n        //! line.\n        VCHomeExtend = QsciScintillaBase::SCI_VCHOMEEXTEND,\n\n        //! Extend the rectangular selection to the first visible character in\n        //! the document line.\n        VCHomeRectExtend = QsciScintillaBase::SCI_VCHOMERECTEXTEND,\n\n        //! Move to the first visible character of the displayed or document\n        //! line.\n        VCHomeWrap = QsciScintillaBase::SCI_VCHOMEWRAP,\n\n        //! Extend the selection to the first visible character of the\n        //! displayed or document line.\n        VCHomeWrapExtend = QsciScintillaBase::SCI_VCHOMEWRAPEXTEND,\n\n        //! Move to the end of the document line.\n        LineEnd = QsciScintillaBase::SCI_LINEEND,\n\n        //! Extend the selection to the end of the document line.\n        LineEndExtend = QsciScintillaBase::SCI_LINEENDEXTEND,\n\n        //! Extend the rectangular selection to the end of the document line.\n        LineEndRectExtend = QsciScintillaBase::SCI_LINEENDRECTEXTEND,\n\n        //! Move to the end of the displayed line.\n        LineEndDisplay = QsciScintillaBase::SCI_LINEENDDISPLAY,\n\n        //! Extend the selection to the end of the displayed line.\n        LineEndDisplayExtend = QsciScintillaBase::SCI_LINEENDDISPLAYEXTEND,\n\n        //! Move to the end of the displayed or document line.\n        LineEndWrap = QsciScintillaBase::SCI_LINEENDWRAP,\n\n        //! Extend the selection to the end of the displayed or document line.\n        LineEndWrapExtend = QsciScintillaBase::SCI_LINEENDWRAPEXTEND,\n\n        //! Move to the start of the document.\n        DocumentStart = QsciScintillaBase::SCI_DOCUMENTSTART,\n\n        //! Extend the selection to the start of the document.\n        DocumentStartExtend = QsciScintillaBase::SCI_DOCUMENTSTARTEXTEND,\n\n        //! Move to the end of the document.\n        DocumentEnd = QsciScintillaBase::SCI_DOCUMENTEND,\n\n        //! Extend the selection to the end of the document.\n        DocumentEndExtend = QsciScintillaBase::SCI_DOCUMENTENDEXTEND,\n\n        //! Move up one page.\n        PageUp = QsciScintillaBase::SCI_PAGEUP,\n\n        //! Extend the selection up one page.\n        PageUpExtend = QsciScintillaBase::SCI_PAGEUPEXTEND,\n\n        //! Extend the rectangular selection up one page.\n        PageUpRectExtend = QsciScintillaBase::SCI_PAGEUPRECTEXTEND,\n\n        //! Move down one page.\n        PageDown = QsciScintillaBase::SCI_PAGEDOWN,\n\n        //! Extend the selection down one page.\n        PageDownExtend = QsciScintillaBase::SCI_PAGEDOWNEXTEND,\n\n        //! Extend the rectangular selection down one page.\n        PageDownRectExtend = QsciScintillaBase::SCI_PAGEDOWNRECTEXTEND,\n\n        //! Stuttered move up one page.\n        StutteredPageUp = QsciScintillaBase::SCI_STUTTEREDPAGEUP,\n\n        //! Stuttered extend the selection up one page.\n        StutteredPageUpExtend = QsciScintillaBase::SCI_STUTTEREDPAGEUPEXTEND,\n\n        //! Stuttered move down one page.\n        StutteredPageDown = QsciScintillaBase::SCI_STUTTEREDPAGEDOWN,\n\n        //! Stuttered extend the selection down one page.\n        StutteredPageDownExtend = QsciScintillaBase::SCI_STUTTEREDPAGEDOWNEXTEND,\n\n        //! Delete the current character.\n        Delete = QsciScintillaBase::SCI_CLEAR,\n\n        //! Delete the previous character.\n        DeleteBack = QsciScintillaBase::SCI_DELETEBACK,\n\n        //! Delete the previous character if not at start of line.\n        DeleteBackNotLine = QsciScintillaBase::SCI_DELETEBACKNOTLINE,\n\n        //! Delete the word to the left.\n        DeleteWordLeft = QsciScintillaBase::SCI_DELWORDLEFT,\n\n        //! Delete the word to the right.\n        DeleteWordRight = QsciScintillaBase::SCI_DELWORDRIGHT,\n\n        //! Delete right to the end of the next word.\n        DeleteWordRightEnd = QsciScintillaBase::SCI_DELWORDRIGHTEND,\n\n        //! Delete the line to the left.\n        DeleteLineLeft = QsciScintillaBase::SCI_DELLINELEFT,\n\n        //! Delete the line to the right.\n        DeleteLineRight = QsciScintillaBase::SCI_DELLINERIGHT,\n\n        //! Delete the current line.\n        LineDelete = QsciScintillaBase::SCI_LINEDELETE,\n\n        //! Cut the current line to the clipboard.\n        LineCut = QsciScintillaBase::SCI_LINECUT,\n\n        //! Copy the current line to the clipboard.\n        LineCopy = QsciScintillaBase::SCI_LINECOPY,\n\n        //! Transpose the current and previous lines.\n        LineTranspose = QsciScintillaBase::SCI_LINETRANSPOSE,\n\n        //! Duplicate the current line.\n        LineDuplicate = QsciScintillaBase::SCI_LINEDUPLICATE,\n\n        //! Select the whole document.\n        SelectAll = QsciScintillaBase::SCI_SELECTALL,\n\n        //! Move the selected lines up one line.\n        MoveSelectedLinesUp = QsciScintillaBase::SCI_MOVESELECTEDLINESUP,\n\n        //! Move the selected lines down one line.\n        MoveSelectedLinesDown = QsciScintillaBase::SCI_MOVESELECTEDLINESDOWN,\n\n        //! Duplicate the selection.\n        SelectionDuplicate = QsciScintillaBase::SCI_SELECTIONDUPLICATE,\n\n        //! Convert the selection to lower case.\n        SelectionLowerCase = QsciScintillaBase::SCI_LOWERCASE,\n\n        //! Convert the selection to upper case.\n        SelectionUpperCase = QsciScintillaBase::SCI_UPPERCASE,\n\n        //! Cut the selection to the clipboard.\n        SelectionCut = QsciScintillaBase::SCI_CUT,\n\n        //! Copy the selection to the clipboard.\n        SelectionCopy = QsciScintillaBase::SCI_COPY,\n\n        //! Paste from the clipboard.\n        Paste = QsciScintillaBase::SCI_PASTE,\n\n        //! Toggle insert/overtype.\n        EditToggleOvertype = QsciScintillaBase::SCI_EDITTOGGLEOVERTYPE,\n\n        //! Insert a platform dependent newline.\n        Newline = QsciScintillaBase::SCI_NEWLINE,\n\n        //! Insert a formfeed.\n        Formfeed = QsciScintillaBase::SCI_FORMFEED,\n\n        //! Indent one level.\n        Tab = QsciScintillaBase::SCI_TAB,\n\n        //! De-indent one level.\n        Backtab = QsciScintillaBase::SCI_BACKTAB,\n\n        //! Cancel any current operation.\n        Cancel = QsciScintillaBase::SCI_CANCEL,\n\n        //! Undo the last command.\n        Undo = QsciScintillaBase::SCI_UNDO,\n\n        //! Redo the last command.\n        Redo = QsciScintillaBase::SCI_REDO,\n\n        //! Zoom in.\n        ZoomIn = QsciScintillaBase::SCI_ZOOMIN,\n\n        //! Zoom out.\n        ZoomOut = QsciScintillaBase::SCI_ZOOMOUT,\n    };\n\n    //! Return the command that will be executed by this instance.\n    Command command() const {return scicmd;}\n\n    //! Execute the command.\n    void execute();\n\n    //! Binds the key \\a key to the command.  If \\a key is 0 then the key\n    //! binding is removed.  If \\a key is invalid then the key binding is\n    //! unchanged.  Valid keys are any visible or control character or any\n    //! of \\c Qt::Key_Down, \\c Qt::Key_Up, \\c Qt::Key_Left, \\c Qt::Key_Right,\n    //! \\c Qt::Key_Home, \\c Qt::Key_End, \\c Qt::Key_PageUp,\n    //! \\c Qt::Key_PageDown, \\c Qt::Key_Delete, \\c Qt::Key_Insert,\n    //! \\c Qt::Key_Escape, \\c Qt::Key_Backspace, \\c Qt::Key_Tab,\n    //! \\c Qt::Key_Backtab, \\c Qt::Key_Return, \\c Qt::Key_Enter,\n    //! \\c Qt::Key_Super_L, \\c Qt::Key_Super_R or \\c Qt::Key_Menu.  Keys may be\n    //! modified with any combination of \\c Qt::ShiftModifier,\n    //! \\c Qt::ControlModifier, \\c Qt::AltModifier and \\c Qt::MetaModifier.\n    //!\n    //! \\sa key(), setAlternateKey(), validKey()\n    void setKey(int key);\n\n    //! Binds the alternate key \\a altkey to the command.  If \\a key is 0\n    //! then the alternate key binding is removed.\n    //!\n    //! \\sa alternateKey(), setKey(), validKey()\n    void setAlternateKey(int altkey);\n\n    //! The key that is currently bound to the command is returned.\n    //!\n    //! \\sa setKey(), alternateKey()\n    int key() const {return qkey;}\n\n    //! The alternate key that is currently bound to the command is\n    //! returned.\n    //!\n    //! \\sa setAlternateKey(), key()\n    int alternateKey() const {return qaltkey;}\n\n    //! If the key \\a key is valid then true is returned.\n    static bool validKey(int key);\n\n    //! The user friendly description of the command is returned.\n    QString description() const;\n\nprivate:\n    friend class QsciCommandSet;\n\n    QsciCommand(QsciScintilla *qs, Command cmd, int key, int altkey,\n            const char *desc);\n\n    void bindKey(int key,int &qk,int &scik);\n\n    QsciScintilla *qsCmd;\n    Command scicmd;\n    int qkey, scikey, qaltkey, scialtkey;\n    const char *descCmd;\n\n    QsciCommand(const QsciCommand &);\n    QsciCommand &operator=(const QsciCommand &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscicommandset.h",
    "content": "// This defines the interface to the QsciCommandSet class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCICOMMANDSET_H\n#define QSCICOMMANDSET_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qglobal.h>\n\n#include <qptrlist.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscicommand.h>\n\n\nQT_BEGIN_NAMESPACE\nclass QSettings;\nQT_END_NAMESPACE\n\nclass QsciScintilla;\n\n\n//! \\brief The QsciCommandSet class represents the set of all internal editor\n//! commands that may have keys bound.\n//!\n//! Methods are provided to access the individual commands and to read and\n//! write the current bindings from and to settings files.\nclass QSCINTILLA_EXPORT QsciCommandSet\n{\npublic:\n    //! The key bindings for each command in the set are read from the\n    //! settings \\a qs.  \\a prefix is prepended to the key of each entry.\n    //! true is returned if there was no error.\n    //!\n    //! \\sa writeSettings()\n    bool readSettings(QSettings &qs, const char *prefix = \"/Scintilla\");\n\n    //! The key bindings for each command in the set are written to the\n    //! settings \\a qs.  \\a prefix is prepended to the key of each entry.\n    //! true is returned if there was no error.\n    //!\n    //! \\sa readSettings()\n    bool writeSettings(QSettings &qs, const char *prefix = \"/Scintilla\");\n\n    //! The commands in the set are returned as a list.\n    QPtrList<QsciCommand> &commands() {return cmds;}\n\n    //! The primary keys bindings for all commands are removed.\n    void clearKeys();\n\n    //! The alternate keys bindings for all commands are removed.\n    void clearAlternateKeys();\n\n    // Find the command that is bound to \\a key.\n    QsciCommand *boundTo(int key) const;\n\n    // Find a specific command \\a command.\n    QsciCommand *find(QsciCommand::Command command) const;\n\nprivate:\n    friend class QsciScintilla;\n\n    QsciCommandSet(QsciScintilla *qs);\n    ~QsciCommandSet();\n\n    QsciScintilla *qsci;\n    QPtrList<QsciCommand> cmds;\n\n    QsciCommandSet(const QsciCommandSet &);\n    QsciCommandSet &operator=(const QsciCommandSet &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscidocument.h",
    "content": "// This defines the interface to the QsciDocument class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCIDOCUMENT_H\n#define QSCIDOCUMENT_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <Qsci/qsciglobal.h>\n\n\nclass QsciScintillaBase;\nclass QsciDocumentP;\n\n\n//! \\brief The QsciDocument class represents a document to be edited.\n//!\n//! It is an opaque class that can be attached to multiple instances of\n//! QsciScintilla to create different simultaneous views of the same document.\n//! QsciDocument uses implicit sharing so that copying class instances is a\n//! cheap operation.\nclass QSCINTILLA_EXPORT QsciDocument\n{\npublic:\n    //! Create a new unattached document.\n    QsciDocument();\n    virtual ~QsciDocument();\n\n    QsciDocument(const QsciDocument &);\n    QsciDocument &operator=(const QsciDocument &);\n\nprivate:\n    friend class QsciScintilla;\n\n    void attach(const QsciDocument &that);\n    void detach();\n    void display(QsciScintillaBase *qsb, const QsciDocument *from);\n    void undisplay(QsciScintillaBase *qsb);\n\n    bool isModified() const;\n    void setModified(bool m);\n\n    QsciDocumentP *pdoc;\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qsciglobal.h",
    "content": "// This module defines various things common to all of the Scintilla Qt port.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCIGLOBAL_H\n#define QSCIGLOBAL_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qglobal.h>\n\n\n#define QSCINTILLA_VERSION      0x020804\n#define QSCINTILLA_VERSION_STR  \"2.8.4\"\n\n\n// Under Windows, define QSCINTILLA_MAKE_DLL to create a Scintilla DLL, or\n// define QSCINTILLA_DLL to link against a Scintilla DLL, or define neither\n// to either build or link against a static Scintilla library.\n#if defined(Q_OS_WIN)\n\n#if defined(QSCINTILLA_DLL)\n#define QSCINTILLA_EXPORT       __declspec(dllimport)\n#elif defined(QSCINTILLA_MAKE_DLL)\n#define QSCINTILLA_EXPORT       __declspec(dllexport)\n#endif\n\n#endif\n\n#if !defined(QSCINTILLA_EXPORT)\n#define QSCINTILLA_EXPORT\n#endif\n\n\n#if !defined(QT_BEGIN_NAMESPACE)\n#define QT_BEGIN_NAMESPACE\n#define QT_END_NAMESPACE\n#endif\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexer.h",
    "content": "// This defines the interface to the QsciLexer class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXER_H\n#define QSCILEXER_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qmap.h>\n#include <qobject.h>\n#include <qstring.h>\n\n#include <Qsci/qsciglobal.h>\n\n\nQT_BEGIN_NAMESPACE\nclass QSettings;\nQT_END_NAMESPACE\n\nclass QsciAbstractAPIs;\nclass QsciScintilla;\n\n\n//! \\brief The QsciLexer class is an abstract class used as a base for language\n//! lexers.\n//!\n//! A lexer scans the text breaking it up into separate language objects, e.g.\n//! keywords, strings, operators.  The lexer then uses a different style to\n//! draw each object.  A style is identified by a style number and has a number\n//! of attributes, including colour and font.  A specific language lexer will\n//! implement appropriate default styles which can be overriden by an\n//! application by further sub-classing the specific language lexer.\n//!\n//! A lexer may provide one or more sets of words to be recognised as keywords.\n//! Most lexers only provide one set, but some may support languages embedded\n//! in other languages and provide several sets.\n//!\n//! QsciLexer provides convenience methods for saving and restoring user\n//! preferences for fonts and colours.\n//!\n//! If you want to write a lexer for a new language then you can add it to the\n//! underlying Scintilla code and implement a corresponding QsciLexer sub-class\n//! to manage the different styles used.  Alternatively you can implement a\n//! sub-class of QsciLexerCustom.\nclass QSCINTILLA_EXPORT QsciLexer : public QObject\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexer with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexer(QObject *parent = 0, const char *name = 0);\n\n    //! Destroy the QSciLexer.\n    virtual ~QsciLexer();\n\n    //! Returns the name of the language.  It must be re-implemented by a\n    //! sub-class.\n    virtual const char *language() const = 0;\n\n    //! Returns the name of the lexer.  If 0 is returned then the lexer's\n    //! numeric identifier is used.  The default implementation returns 0.\n    //!\n    //! \\sa lexerId()\n    virtual const char *lexer() const;\n\n    //! Returns the identifier (i.e. a QsciScintillaBase::SCLEX_* value) of the\n    //! lexer.  This is only used if lexer() returns 0.  The default\n    //! implementation returns QsciScintillaBase::SCLEX_CONTAINER.\n    //!\n    //! \\sa lexer()\n    virtual int lexerId() const;\n\n    //! Returns the current API set or 0 if there isn't one.\n    //!\n    //! \\sa setAPIs()\n    QsciAbstractAPIs *apis() const;\n\n    //! \\internal Returns the characters that can fill up auto-completion.\n    virtual const char *autoCompletionFillups() const;\n\n    //! \\internal Returns the list of character sequences that can separate\n    //! auto-completion words.  The first in the list is assumed to be the\n    //! sequence used to separate words in the lexer's API files.\n    virtual QStringList autoCompletionWordSeparators() const;\n\n    //! Returns the auto-indentation style.  The default is 0 if the\n    //! language is block structured, or QsciScintilla::AiMaintain if not.\n    //!\n    //! \\sa setAutoIndentStyle(), QsciScintilla::AiMaintain,\n    //! QsciScintilla::AiOpening, QsciScintilla::AiClosing\n    int autoIndentStyle();\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the end of a block for\n    //! auto-indentation.  The style is returned via \\a style.\n    virtual const char *blockEnd(int *style = 0) const;\n\n    //! \\internal Returns the number of lines prior to the current one when\n    //! determining the scope of a block when auto-indenting.\n    virtual int blockLookback() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The style is returned via \\a style.\n    virtual const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of keywords in a\n    //! particular style that define the start of a block for\n    //! auto-indentation.  The style is returned via \\a style.\n    virtual const char *blockStartKeyword(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    virtual int braceStyle() const;\n\n    //! \\internal Returns true if the language is case sensitive.  The default\n    //! is true.\n    virtual bool caseSensitive() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //! The default colour is that returned by defaultColor().\n    //!\n    //! \\sa defaultColor(), paper()\n    virtual QColor color(int style) const;\n\n    //! Returns the end-of-line for style number \\a style.  The default is\n    //! false.\n    virtual bool eolFill(int style) const;\n\n    //! Returns the font for style number \\a style.  The default font is\n    //! that returned by defaultFont().\n    //!\n    //! \\sa defaultFont()\n    virtual QFont font(int style) const;\n\n    //! \\internal Returns the view used for indentation guides.\n    virtual int indentationGuideView() const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.  0 is returned if there\n    //! is no such set.\n    virtual const char *keywords(int set) const;\n\n    //! \\internal Returns the number of the style used for whitespace.  The\n    //! default implementation returns 0 which is the convention adopted by\n    //! most lexers.\n    virtual int defaultStyle() const;\n\n    //! Returns the descriptive name for style number \\a style.  For a valid\n    //! style number for this language a non-empty QString must be returned.\n    //! If the style number is invalid then an empty QString must be returned.\n    //! This is intended to be used in user preference dialogs.\n    virtual QString description(int style) const = 0;\n\n    //! Returns the background colour of the text for style number\n    //! \\a style.\n    //!\n    //! \\sa defaultPaper(), color()\n    virtual QColor paper(int style) const;\n\n    //! Returns the default text colour.\n    //!\n    //! \\sa setDefaultColor()\n    QColor defaultColor() const;\n\n    //! Returns the default text colour for style number \\a style.\n    virtual QColor defaultColor(int style) const;\n\n    //! Returns the default end-of-line for style number \\a style.  The default\n    //! is false.\n    virtual bool defaultEolFill(int style) const;\n\n    //! Returns the default font.\n    //!\n    //! \\sa setDefaultFont()\n    QFont defaultFont() const;\n\n    //! Returns the default font for style number \\a style.\n    virtual QFont defaultFont(int style) const;\n\n    //! Returns the default paper colour.\n    //!\n    //! \\sa setDefaultPaper()\n    QColor defaultPaper() const;\n\n    //! Returns the default paper colour for style number \\a style.\n    virtual QColor defaultPaper(int style) const;\n\n    //! Returns the QsciScintilla instance that the lexer is currently attached\n    //! to or 0 if it is unattached.\n    QsciScintilla *editor() const {return attached_editor;}\n\n    //! The current set of APIs is set to \\a apis.  If \\a apis is 0 then any\n    //! existing APIs for this lexer are removed.\n    //!\n    //! \\sa apis()\n    void setAPIs(QsciAbstractAPIs *apis);\n\n    //! The default text colour is set to \\a c.\n    //!\n    //! \\sa defaultColor(), color()\n    void setDefaultColor(const QColor &c);\n\n    //! The default font is set to \\a f.\n    //!\n    //! \\sa defaultFont(), font()\n    void setDefaultFont(const QFont &f);\n\n    //! The default paper colour is set to \\a c.\n    //!\n    //! \\sa defaultPaper(), paper()\n    void setDefaultPaper(const QColor &c);\n\n    //! \\internal Set the QsciScintilla instance that the lexer is attached to.\n    virtual void setEditor(QsciScintilla *editor);\n\n    //! The colour, paper, font and end-of-line for each style number, and\n    //! all lexer specific properties are read from the settings \\a qs.\n    //! \\a prefix is prepended to the key of each entry.  true is returned\n    //! if there was no error.\n    //!\n    //! \\sa writeSettings(), QsciScintilla::setLexer()\n    bool readSettings(QSettings &qs,const char *prefix = \"/Scintilla\");\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    virtual void refreshProperties();\n\n    //! Returns the number of style bits needed by the lexer.  Normally this\n    //! should only be re-implemented by custom lexers.\n    virtual int styleBitsNeeded() const;\n\n    //! Returns the string of characters that comprise a word.  The default is\n    //! 0 which implies the upper and lower case alphabetic characters and\n    //! underscore.\n    virtual const char *wordCharacters() const;\n\n    //! The colour, paper, font and end-of-line for each style number, and\n    //! all lexer specific properties are written to the settings \\a qs.\n    //! \\a prefix is prepended to the key of each entry.  true is returned\n    //! if there was no error.\n    //!\n    //! \\sa readSettings()\n    bool writeSettings(QSettings &qs,\n               const char *prefix = \"/Scintilla\") const;\n\npublic slots:\n    //! The auto-indentation style is set to \\a autoindentstyle.\n    //!\n    //! \\sa autoIndentStyle(), QsciScintilla::AiMaintain,\n    //! QsciScintilla::AiOpening, QsciScintilla::AiClosing\n    virtual void setAutoIndentStyle(int autoindentstyle);\n\n    //! The foreground colour for style number \\a style is set to \\a c.  If\n    //! \\a style is -1 then the colour is set for all styles.\n    virtual void setColor(const QColor &c,int style = -1);\n\n    //! The end-of-line fill for style number \\a style is set to\n    //! \\a eoffill.  If \\a style is -1 then the fill is set for all styles.\n    virtual void setEolFill(bool eoffill,int style = -1);\n\n    //! The font for style number \\a style is set to \\a f.  If \\a style is\n    //! -1 then the font is set for all styles.\n    virtual void setFont(const QFont &f,int style = -1);\n\n    //! The background colour for style number \\a style is set to \\a c.  If\n    //! \\a style is -1 then the colour is set for all styles.\n    virtual void setPaper(const QColor &c,int style = -1);\n\nsignals:\n    //! This signal is emitted when the foreground colour of style number\n    //! \\a style has changed.  The new colour is \\a c.\n    void colorChanged(const QColor &c,int style);\n\n    //! This signal is emitted when the end-of-file fill of style number\n    //! \\a style has changed.  The new fill is \\a eolfilled.\n    void eolFillChanged(bool eolfilled,int style);\n\n    //! This signal is emitted when the font of style number \\a style has\n    //! changed.  The new font is \\a f.\n    void fontChanged(const QFont &f,int style);\n\n    //! This signal is emitted when the background colour of style number\n    //! \\a style has changed.  The new colour is \\a c.\n    void paperChanged(const QColor &c,int style);\n\n    //! This signal is emitted when the value of the lexer property \\a prop\n    //! needs to be changed.  The new value is \\a val.\n    void propertyChanged(const char *prop, const char *val);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    virtual bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    virtual bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    struct StyleData {\n        QFont font;\n        QColor color;\n        QColor paper;\n        bool eol_fill;\n    };\n\n    struct StyleDataMap {\n        bool style_data_set;\n        QMap<int, StyleData> style_data;\n    };\n\n    StyleDataMap *style_map;\n\n    int autoIndStyle;\n    QFont defFont;\n    QColor defColor;\n    QColor defPaper;\n    QsciAbstractAPIs *apiSet;\n    QsciScintilla *attached_editor;\n\n    void setStyleDefaults() const;\n    StyleData &styleData(int style) const;\n\n    QsciLexer(const QsciLexer &);\n    QsciLexer &operator=(const QsciLexer &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexeravs.h",
    "content": "// This defines the interface to the QsciLexerAVS class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERAVS_H\n#define QSCILEXERAVS_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerAVS class encapsulates the Scintilla AVS lexer.\nclass QSCINTILLA_EXPORT QsciLexerAVS : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! AVS lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A block comment.\n        BlockComment = 1,\n\n        //! A nested block comment.\n        NestedBlockComment = 2,\n\n        //! A line comment.\n        LineComment = 3,\n\n        //! A number.\n        Number = 4,\n\n        //! An operator.\n        Operator = 5,\n\n        //! An identifier\n        Identifier = 6,\n\n        //! A string.\n        String = 7,\n\n        //! A triple quoted string.\n        TripleString = 8,\n\n        //! A keyword (as defined by keyword set number 1)..\n        Keyword = 9,\n\n        //! A filter (as defined by keyword set number 2).\n        Filter = 10,\n\n        //! A plugin (as defined by keyword set number 3).\n        Plugin = 11,\n\n        //! A function (as defined by keyword set number 4).\n        Function = 12,\n\n        //! A clip property (as defined by keyword set number 5).\n        ClipProperty = 13,\n\n        //! A keyword defined in keyword set number 6.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet6 = 14\n    };\n\n    //! Construct a QsciLexerAVS with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerAVS(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerAVS instance.\n    virtual ~QsciLexerAVS();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the propertyChanged()\n    //! signal as required.\n    void refreshProperties();\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\npublic slots:\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n\n    bool fold_comments;\n    bool fold_compact;\n\n    QsciLexerAVS(const QsciLexerAVS &);\n    QsciLexerAVS &operator=(const QsciLexerAVS &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerbash.h",
    "content": "// This defines the interface to the QsciLexerBash class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERBASH_H\n#define QSCILEXERBASH_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerBash class encapsulates the Scintilla Bash lexer.\nclass QSCINTILLA_EXPORT QsciLexerBash : public QsciLexer\n{\n\tQ_OBJECT\n\npublic:\n\t//! This enum defines the meanings of the different styles used by the\n\t//! Bash lexer.\n\tenum {\n\t\t//! The default.\n\t\tDefault = 0,\n\n\t\t//! An error.\n\t\tError = 1,\n\n\t\t//! A comment.\n\t\tComment = 2,\n\n\t\t//! A number.\n\t\tNumber = 3,\n\n\t\t//! A keyword.\n\t\tKeyword = 4,\n\n\t\t//! A double-quoted string.\n\t\tDoubleQuotedString = 5,\n\n\t\t//! A single-quoted string.\n\t\tSingleQuotedString = 6,\n\n\t\t//! An operator.\n\t\tOperator = 7,\n\n\t\t//! An identifier\n\t\tIdentifier = 8,\n\n\t\t//! A scalar.\n\t\tScalar = 9,\n\n\t\t//! Parameter expansion.\n\t\tParameterExpansion = 10,\n\n\t\t//! Backticks.\n\t\tBackticks = 11,\n\n\t\t//! A here document delimiter.\n\t\tHereDocumentDelimiter = 12,\n\n\t\t//! A single quoted here document.\n\t\tSingleQuotedHereDocument = 13\n\t};\n\n\t//! Construct a QsciLexerBash with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n\tQsciLexerBash(QObject *parent = 0, const char *name = 0);\n\n\t//! Destroys the QsciLexerBash instance.\n\tvirtual ~QsciLexerBash();\n\n\t//! Returns the name of the language.\n\tconst char *language() const;\n\n\t//! Returns the name of the lexer.  Some lexers support a number of\n\t//! languages.\n\tconst char *lexer() const;\n\n\t//! \\internal Returns the style used for braces for brace matching.\n\tint braceStyle() const;\n\n\t//! Returns the string of characters that comprise a word.\n\tconst char *wordCharacters() const;\n\n\t//! Returns the foreground colour of the text for style number \\a style.\n\t//!\n\t//! \\sa defaultPaper()\n\tQColor defaultColor(int style) const;\n\n\t//! Returns the end-of-line fill for style number \\a style.\n\tbool defaultEolFill(int style) const;\n\n\t//! Returns the font for style number \\a style.\n\tQFont defaultFont(int style) const;\n\n\t//! Returns the background colour of the text for style number \\a style.\n\t//!\n\t//! \\sa defaultColor()\n\tQColor defaultPaper(int style) const;\n\n\t//! Returns the set of keywords for the keyword set \\a set recognised\n\t//! by the lexer as a space separated string.\n\tconst char *keywords(int set) const;\n\n\t//! Returns the descriptive name for style number \\a style.  If the\n\t//! style is invalid for this language then an empty QString is returned.\n\t//! This is intended to be used in user preference dialogs.\n\tQString description(int style) const;\n\n\t//! Causes all properties to be refreshed by emitting the\n\t//! propertyChanged() signal as required.\n\tvoid refreshProperties();\n\n\t//! Returns true if multi-line comment blocks can be folded.\n\t//!\n\t//! \\sa setFoldComments()\n\tbool foldComments() const;\n\n\t//! Returns true if trailing blank lines are included in a fold block.\n\t//!\n\t//! \\sa setFoldCompact()\n\tbool foldCompact() const;\n\npublic slots:\n\t//! If \\a fold is true then multi-line comment blocks can be folded.\n\t//! The default is false.\n\t//!\n\t//! \\sa foldComments()\n\tvirtual void setFoldComments(bool fold);\n\n\t//! If \\a fold is true then trailing blank lines are included in a fold\n\t//! block. The default is true.\n\t//!\n\t//! \\sa foldCompact()\n\tvirtual void setFoldCompact(bool fold);\n\nprotected:\n\t//! The lexer's properties are read from the settings \\a qs.  \\a prefix\n\t//! (which has a trailing '/') should be used as a prefix to the key of\n\t//! each setting.  true is returned if there is no error.\n\t//!\n\tbool readProperties(QSettings &qs,const QString &prefix);\n\n\t//! The lexer's properties are written to the settings \\a qs.\n\t//! \\a prefix (which has a trailing '/') should be used as a prefix to\n\t//! the key of each setting.  true is returned if there is no error.\n\t//!\n\tbool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n\tvoid setCommentProp();\n\tvoid setCompactProp();\n\n\tbool fold_comments;\n\tbool fold_compact;\n\n\tQsciLexerBash(const QsciLexerBash &);\n\tQsciLexerBash &operator=(const QsciLexerBash &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerbatch.h",
    "content": "// This defines the interface to the QsciLexerBatch class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERBATCH_H\n#define QSCILEXERBATCH_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerBatch class encapsulates the Scintilla batch file\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerBatch : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! batch file lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A keyword.\n        Keyword = 2,\n\n        //! A label.\n        Label = 3,\n\n        //! An hide command character.\n        HideCommandChar = 4,\n\n        //! An external command .\n        ExternalCommand = 5,\n\n        //! A variable.\n        Variable = 6,\n        \n        //! An operator\n        Operator = 7\n    };\n\n    //! Construct a QsciLexerBatch with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerBatch(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerBatch instance.\n    virtual ~QsciLexerBatch();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! \\internal Returns true if the language is case sensitive.\n    bool caseSensitive() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\nprivate:\n    QsciLexerBatch(const QsciLexerBatch &);\n    QsciLexerBatch &operator=(const QsciLexerBatch &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexercmake.h",
    "content": "// This defines the interface to the QsciLexerCMake class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERCMAKE_H\n#define QSCILEXERCMAKE_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerCMake class encapsulates the Scintilla CMake lexer.\nclass QSCINTILLA_EXPORT QsciLexerCMake : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! CMake lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A string.\n        String = 2,\n\n        //! A left quoted string.\n        StringLeftQuote = 3,\n\n        //! A right quoted string.\n        StringRightQuote = 4,\n\n        //! A function.  (Defined by keyword set number 1.)\n        Function = 5,\n\n        //! A variable. (Defined by keyword set number 2.)\n        Variable = 6,\n\n        //! A label.\n        Label = 7,\n\n        //! A keyword defined in keyword set number 3.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet3 = 8,\n\n        //! A WHILE block.\n        BlockWhile = 9,\n\n        //! A FOREACH block.\n        BlockForeach = 10,\n\n        //! An IF block.\n        BlockIf = 11,\n\n        //! A MACRO block.\n        BlockMacro = 12,\n\n        //! A variable within a string.\n        StringVariable = 13,\n\n        //! A number.\n        Number = 14\n    };\n\n    //! Construct a QsciLexerCMake with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerCMake(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerCMake instance.\n    virtual ~QsciLexerCMake();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the propertyChanged()\n    //! signal as required.\n    void refreshProperties();\n\n    //! Returns true if ELSE blocks can be folded.\n    //!\n    //! \\sa setFoldAtElse()\n    bool foldAtElse() const;\n\npublic slots:\n    //! If \\a fold is true then ELSE blocks can be folded.  The default is\n    //! false.\n    //!\n    //! \\sa foldAtElse()\n    virtual void setFoldAtElse(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setAtElseProp();\n\n    bool fold_atelse;\n\n    QsciLexerCMake(const QsciLexerCMake &);\n    QsciLexerCMake &operator=(const QsciLexerCMake &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexercoffeescript.h",
    "content": "// This defines the interface to the QsciLexerCoffeeScript class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERCOFFEESCRIPT_H\n#define QSCILEXERCOFFEESCRIPT_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerCoffeeScript class encapsulates the Scintilla\n//! CoffeeScript lexer.\nclass QSCINTILLA_EXPORT QsciLexerCoffeeScript : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! C++ lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A C-style comment.\n        Comment = 1,\n\n        //! A C++-style comment line.\n        CommentLine = 2,\n\n        //! A JavaDoc/Doxygen C-style comment.\n        CommentDoc = 3,\n\n        //! A number.\n        Number = 4,\n\n        //! A keyword.\n        Keyword = 5,\n\n        //! A double-quoted string.\n        DoubleQuotedString = 6,\n\n        //! A single-quoted string.\n        SingleQuotedString = 7,\n\n        //! An IDL UUID.\n        UUID = 8,\n\n        //! A pre-processor block.\n        PreProcessor = 9,\n\n        //! An operator.\n        Operator = 10,\n\n        //! An identifier\n        Identifier = 11,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 12,\n\n        //! A C# verbatim string.\n        VerbatimString = 13,\n\n        //! A regular expression.\n        Regex = 14,\n\n        //! A JavaDoc/Doxygen C++-style comment line.\n        CommentLineDoc = 15,\n\n        //! A keyword defined in keyword set number 2.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet2 = 16,\n\n        //! A JavaDoc/Doxygen keyword.\n        CommentDocKeyword = 17,\n\n        //! A JavaDoc/Doxygen keyword error defined in keyword set number 3.\n        //! The class must be sub-classed and re-implement keywords() to make\n        //! use of this style.\n        CommentDocKeywordError = 18,\n\n        //! A global class defined in keyword set number 4.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        GlobalClass = 19,\n\n        //! A block comment.\n        CommentBlock = 22,\n\n        //! A block regular expression.\n        BlockRegex = 23,\n\n        //! A block regular expression comment.\n        BlockRegexComment = 24,\n    };\n\n    //! Construct a QsciLexerCoffeeScript with parent \\a parent and name \\a\n    //! name.  \\a parent is typically the QsciScintilla instance.\n    QsciLexerCoffeeScript(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerCoffeeScript instance.\n    virtual ~QsciLexerCoffeeScript();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the character sequences that can separate\n    //! auto-completion words.\n    QStringList autoCompletionWordSeparators() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the end of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockEnd(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of keywords in a\n    //! particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStartKeyword(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.  Set 1 is normally used for\n    //! primary keywords and identifiers.  Set 2 is normally used for secondary\n    //! keywords and identifiers.  Set 3 is normally used for documentation\n    //! comment keywords.  Set 4 is normally used for global classes and\n    //! typedefs.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if '$' characters are allowed in identifier names.\n    //!\n    //! \\sa setDollarsAllowed()\n    bool dollarsAllowed() const {return dollars;}\n\n    //! If \\a allowed is true then '$' characters are allowed in identifier\n    //! names.  The default is true.\n    //!\n    //! \\sa dollarsAllowed()\n    void setDollarsAllowed(bool allowed);\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const {return fold_comments;}\n\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    void setFoldComments(bool fold);\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const {return fold_compact;}\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    void setFoldCompact(bool fold);\n\n    //! Returns true if preprocessor lines (after the preprocessor\n    //! directive) are styled.\n    //!\n    //! \\sa setStylePreprocessor()\n    bool stylePreprocessor() const {return style_preproc;}\n\n    //! If \\a style is true then preprocessor lines (after the preprocessor\n    //! directive) are styled.  The default is false.\n    //!\n    //! \\sa stylePreprocessor()\n    void setStylePreprocessor(bool style);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    //! \\sa writeProperties()\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    //! \\sa readProperties()\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n    void setStylePreprocProp();\n    void setDollarsProp();\n\n    bool fold_comments;\n    bool fold_compact;\n    bool style_preproc;\n    bool dollars;\n\n    QsciLexerCoffeeScript(const QsciLexerCoffeeScript &);\n    QsciLexerCoffeeScript &operator=(const QsciLexerCoffeeScript &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexercpp.h",
    "content": "// This defines the interface to the QsciLexerCPP class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERCPP_H\n#define QSCILEXERCPP_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerCPP class encapsulates the Scintilla C++\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerCPP : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! C++ lexer.\n    enum {\n        //! The default.\n        Default = 0,\n        InactiveDefault = Default + 64,\n\n        //! A C comment.\n        Comment = 1,\n        InactiveComment = Comment + 64,\n\n        //! A C++ comment line.\n        CommentLine = 2,\n        InactiveCommentLine = CommentLine + 64,\n\n        //! A JavaDoc/Doxygen style C comment.\n        CommentDoc = 3,\n        InactiveCommentDoc = CommentDoc + 64,\n\n        //! A number.\n        Number = 4,\n        InactiveNumber = Number + 64,\n\n        //! A keyword.\n        Keyword = 5,\n        InactiveKeyword = Keyword + 64,\n\n        //! A double-quoted string.\n        DoubleQuotedString = 6,\n        InactiveDoubleQuotedString = DoubleQuotedString + 64,\n\n        //! A single-quoted string.\n        SingleQuotedString = 7,\n        InactiveSingleQuotedString = SingleQuotedString + 64,\n\n        //! An IDL UUID.\n        UUID = 8,\n        InactiveUUID = UUID + 64,\n\n        //! A pre-processor block.\n        PreProcessor = 9,\n        InactivePreProcessor = PreProcessor + 64,\n\n        //! An operator.\n        Operator = 10,\n        InactiveOperator = Operator + 64,\n\n        //! An identifier\n        Identifier = 11,\n        InactiveIdentifier = Identifier + 64,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 12,\n        InactiveUnclosedString = UnclosedString + 64,\n\n        //! A C# verbatim string.\n        VerbatimString = 13,\n        InactiveVerbatimString = VerbatimString + 64,\n\n        //! A JavaScript regular expression.\n        Regex = 14,\n        InactiveRegex = Regex + 64,\n\n        //! A JavaDoc/Doxygen style C++ comment line.\n        CommentLineDoc = 15,\n        InactiveCommentLineDoc = CommentLineDoc + 64,\n\n        //! A keyword defined in keyword set number 2.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet2 = 16,\n        InactiveKeywordSet2 = KeywordSet2 + 64,\n\n        //! A JavaDoc/Doxygen keyword.\n        CommentDocKeyword = 17,\n        InactiveCommentDocKeyword = CommentDocKeyword + 64,\n\n        //! A JavaDoc/Doxygen keyword error.\n        CommentDocKeywordError = 18,\n        InactiveCommentDocKeywordError = CommentDocKeywordError + 64,\n\n        //! A global class or typedef defined in keyword set number 5.  The\n        //! class must be sub-classed and re-implement keywords() to make use\n        //! of this style.\n        GlobalClass = 19,\n        InactiveGlobalClass = GlobalClass + 64,\n\n        //! A C++ raw string.\n        RawString = 20,\n        InactiveRawString = RawString + 20,\n\n        //! A Vala triple-quoted verbatim string.\n        TripleQuotedVerbatimString = 21,\n        InactiveTripleQuotedVerbatimString = TripleQuotedVerbatimString + 21,\n\n        //! A Pike hash-quoted string.\n        HashQuotedString = 22,\n        InactiveHashQuotedString = HashQuotedString + 22,\n\n        //! A pre-processor stream comment.\n        PreProcessorComment = 23,\n        InactivePreProcessorComment = PreProcessorComment + 23,\n\n        //! A JavaDoc/Doxygen style pre-processor comment.\n        PreProcessorCommentLineDoc = 24,\n        InactivePreProcessorCommentLineDoc = PreProcessorCommentLineDoc + 64,\n    };\n\n    //! Construct a QsciLexerCPP with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.  \\a\n    //! caseInsensitiveKeywords is true if the lexer ignores the case of\n    //! keywords.\n    QsciLexerCPP(QObject *parent = 0, const char *name = 0,\n                  bool caseInsensitiveKeywords = false);\n\n    //! Destroys the QsciLexerCPP instance.\n    virtual ~QsciLexerCPP();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the character sequences that can separate\n    //! auto-completion words.\n    QStringList autoCompletionWordSeparators() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the end of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockEnd(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of keywords in a\n    //! particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStartKeyword(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.  Set 1 is normally used for\n    //! primary keywords and identifiers.  Set 2 is normally used for secondary\n    //! keywords and identifiers.  Set 3 is normally used for documentation\n    //! comment keywords.  Set 4 is normally used for global classes and\n    //! typedefs.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if \"} else {\" lines can be folded.\n    //!\n    //! \\sa setFoldAtElse()\n    bool foldAtElse() const {return fold_atelse;}\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const {return fold_comments;}\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const {return fold_compact;}\n\n    //! Returns true if preprocessor blocks can be folded.\n    //!\n    //! \\sa setFoldPreprocessor()\n    bool foldPreprocessor() const {return fold_preproc;}\n\n    //! Returns true if preprocessor lines (after the preprocessor\n    //! directive) are styled.\n    //!\n    //! \\sa setStylePreprocessor()\n    bool stylePreprocessor() const {return style_preproc;}\n\n    //! If \\a allowed is true then '$' characters are allowed in identifier\n    //! names.  The default is true.\n    //!\n    //! \\sa dollarsAllowed()\n    void setDollarsAllowed(bool allowed);\n\n    //! Returns true if '$' characters are allowed in identifier names.\n    //!\n    //! \\sa setDollarsAllowed()\n    bool dollarsAllowed() const {return dollars;}\n\n    //! If \\a enabled is true then triple quoted strings are highlighted.  The\n    //! default is false.\n    //!\n    //! \\sa highlightTripleQuotedStrings()\n    void setHighlightTripleQuotedStrings(bool enabled);\n\n    //! Returns true if triple quoted strings should be highlighted.\n    //!\n    //! \\sa setHighlightTripleQuotedStrings()\n    bool highlightTripleQuotedStrings() const {return highlight_triple;}\n\n    //! If \\a enabled is true then hash quoted strings are highlighted.  The\n    //! default is false.\n    //!\n    //! \\sa highlightHashQuotedStrings()\n    void setHighlightHashQuotedStrings(bool enabled);\n\n    //! Returns true if hash quoted strings should be highlighted.\n    //!\n    //! \\sa setHighlightHashQuotedStrings()\n    bool highlightHashQuotedStrings() const {return highlight_hash;}\n\npublic slots:\n    //! If \\a fold is true then \"} else {\" lines can be folded.  The\n    //! default is false.\n    //!\n    //! \\sa foldAtElse()\n    virtual void setFoldAtElse(bool fold);\n\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\n    //! If \\a fold is true then preprocessor blocks can be folded.  The\n    //! default is true.\n    //!\n    //! \\sa foldPreprocessor()\n    virtual void setFoldPreprocessor(bool fold);\n\n    //! If \\a style is true then preprocessor lines (after the preprocessor\n    //! directive) are styled.  The default is false.\n    //!\n    //! \\sa stylePreprocessor()\n    virtual void setStylePreprocessor(bool style);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    //! \\sa writeProperties()\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    //! \\sa readProperties()\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setAtElseProp();\n    void setCommentProp();\n    void setCompactProp();\n    void setPreprocProp();\n    void setStylePreprocProp();\n    void setDollarsProp();\n    void setHighlightTripleProp();\n    void setHighlightHashProp();\n\n    bool fold_atelse;\n    bool fold_comments;\n    bool fold_compact;\n    bool fold_preproc;\n    bool style_preproc;\n    bool dollars;\n    bool highlight_triple;\n    bool highlight_hash;\n\n    bool nocase;\n\n    QsciLexerCPP(const QsciLexerCPP &);\n    QsciLexerCPP &operator=(const QsciLexerCPP &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexercsharp.h",
    "content": "// This defines the interface to the QsciLexerCSharp class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERCSHARP_H\n#define QSCILEXERCSHARP_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexercpp.h>\n\n\n//! \\brief The QsciLexerCSharp class encapsulates the Scintilla C#\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerCSharp : public QsciLexerCPP\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexerCSharp with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerCSharp(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerCSharp instance.\n    virtual ~QsciLexerCSharp();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\nprivate:\n    QsciLexerCSharp(const QsciLexerCSharp &);\n    QsciLexerCSharp &operator=(const QsciLexerCSharp &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexercss.h",
    "content": "// This defines the interface to the QsciLexerCSS class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERCSS_H\n#define QSCILEXERCSS_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerCSS class encapsulates the Scintilla CSS lexer.\nclass QSCINTILLA_EXPORT QsciLexerCSS : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! CSS lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A tag.\n        Tag = 1,\n\n        //! A class selector.\n        ClassSelector = 2,\n\n        //! A pseudo class.  The list of pseudo classes is defined by keyword\n        //! set 2.\n        PseudoClass = 3,\n\n        //! An unknown pseudo class.\n        UnknownPseudoClass = 4,\n\n        //! An operator.\n        Operator = 5,\n\n        //! A CSS1 property.  The list of CSS1 properties is defined by keyword\n        //! set 1.\n        CSS1Property = 6,\n\n        //! An unknown property.\n        UnknownProperty = 7,\n\n        //! A value.\n        Value = 8,\n\n        //! A comment.\n        Comment = 9,\n\n        //! An ID selector.\n        IDSelector = 10,\n\n        //! An important value.\n        Important = 11,\n\n        //! An @-rule.\n        AtRule = 12,\n\n        //! A double-quoted string.\n        DoubleQuotedString = 13,\n\n        //! A single-quoted string.\n        SingleQuotedString = 14,\n\n        //! A CSS2 property.  The list of CSS2 properties is defined by keyword\n        //! set 3.\n        CSS2Property = 15,\n\n        //! An attribute.\n        Attribute = 16,\n\n        //! A CSS3 property.  The list of CSS3 properties is defined by keyword\n        //! set 4.\n        CSS3Property = 17,\n\n        //! A pseudo element.  The list of pseudo elements is defined by\n        //! keyword set 5.\n        PseudoElement = 18,\n\n        //! An extended (browser specific) CSS property.  The list of extended\n        //! CSS properties is defined by keyword set 6.\n        ExtendedCSSProperty = 19,\n\n        //! An extended (browser specific) pseudo class.  The list of extended\n        //! pseudo classes is defined by keyword set 7.\n        ExtendedPseudoClass = 20,\n\n        //! An extended (browser specific) pseudo element.  The list of\n        //! extended pseudo elements is defined by keyword set 8.\n        ExtendedPseudoElement = 21,\n\n        //! A media rule.\n        MediaRule = 22,\n\n        //! A variable.\n        Variable = 23,\n    };\n\n    //! Construct a QsciLexerCSS with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerCSS(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerCSS instance.\n    virtual ~QsciLexerCSS();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the end of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockEnd(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    QColor defaultColor(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\n    //! If \\a enabled is true then support for HSS is enabled.  The default is\n    //! false.\n    //!\n    //! \\sa HSSLanguage()\n    void setHSSLanguage(bool enabled);\n\n    //! Returns true if support for HSS is enabled.\n    //!\n    //! \\sa setHSSLanguage()\n    bool HSSLanguage() const {return hss_language;}\n\n    //! If \\a enabled is true then support for Less CSS is enabled.  The\n    //! default is false.\n    //!\n    //! \\sa LessLanguage()\n    void setLessLanguage(bool enabled);\n\n    //! Returns true if support for Less CSS is enabled.\n    //!\n    //! \\sa setLessLanguage()\n    bool LessLanguage() const {return less_language;}\n\n    //! If \\a enabled is true then support for Sassy CSS is enabled.  The\n    //! default is false.\n    //!\n    //! \\sa SCSSLanguage()\n    void setSCSSLanguage(bool enabled);\n\n    //! Returns true if support for Sassy CSS is enabled.\n    //!\n    //! \\sa setSCSSLanguage()\n    bool SCSSLanguage() const {return scss_language;}\n\npublic slots:\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n    void setHSSProp();\n    void setLessProp();\n    void setSCSSProp();\n\n    bool fold_comments;\n    bool fold_compact;\n    bool hss_language;\n    bool less_language;\n    bool scss_language;\n\n    QsciLexerCSS(const QsciLexerCSS &);\n    QsciLexerCSS &operator=(const QsciLexerCSS &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexercustom.h",
    "content": "// This defines the interface to the QsciLexerCustom class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERCUSTOM_H\n#define QSCILEXERCUSTOM_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\nclass QsciScintilla;\nclass QsciStyle;\n\n\n//! \\brief The QsciLexerCustom class is an abstract class used as a base for\n//! new language lexers.\n//!\n//! The advantage of implementing a new lexer this way (as opposed to adding\n//! the lexer to the underlying Scintilla code) is that it does not require the\n//! QScintilla library to be re-compiled.  It also makes it possible to\n//! integrate external lexers.\n//!\n//! All that is necessary to implement a new lexer is to define appropriate\n//! styles and to re-implement the styleText() method.\nclass QSCINTILLA_EXPORT QsciLexerCustom : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexerCustom with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerCustom(QObject *parent = 0, const char *name = 0);\n\n    //! Destroy the QSciLexerCustom.\n    virtual ~QsciLexerCustom();\n\n    //! The next \\a length characters starting from the current styling\n    //! position have their style set to style number \\a style.  The current\n    //! styling position is moved.  The styling position is initially set by\n    //! calling startStyling().\n    //!\n    //! \\sa startStyling(), styleText()\n    void setStyling(int length, int style);\n\n    //! The next \\a length characters starting from the current styling\n    //! position have their style set to style \\a style.  The current styling\n    //! position is moved.  The styling position is initially set by calling\n    //! startStyling().\n    //!\n    //! \\sa startStyling(), styleText()\n    void setStyling(int length, const QsciStyle &style);\n\n    //! The styling position is set to \\a start and the mask of style bits that\n    //! can be set is set to \\a styleBits.  \\a styleBits allows the styling of\n    //! text to be done over several passes by setting different style bits on\n    //! each pass.  If \\a styleBits is 0 then all style bits (as returned by\n    //! styleBitsNeeded()) are set.\n    //!\n    //! \\sa setStyling(), styleBitsNeeded(), styleText()\n    void startStyling(int pos, int styleBits = 0);\n\n    //! This is called when the section of text beginning at position \\a start\n    //! and up to position \\a end needs to be styled.  \\a start will always be\n    //! at the start of a line.  The text is styled by calling startStyling()\n    //! followed by one or more calls to setStyling().  It must be\n    //! re-implemented by a sub-class.\n    //!\n    //! \\sa setStyling(), startStyling()\n    virtual void styleText(int start, int end) = 0;\n\n    //! \\reimp\n    virtual void setEditor(QsciScintilla *editor);\n\n    //! \\reimp This re-implementation returns 5 as the number of style bits\n    //! needed.\n    virtual int styleBitsNeeded() const;\n\nprivate slots:\n    void handleStyleNeeded(int pos);\n\nprivate:\n    QsciLexerCustom(const QsciLexerCustom &);\n    QsciLexerCustom &operator=(const QsciLexerCustom &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerd.h",
    "content": "// This defines the interface to the QsciLexerD class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERD_H\n#define QSCILEXERD_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerD class encapsulates the Scintilla D lexer.\nclass QSCINTILLA_EXPORT QsciLexerD : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the D\n    //! lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A comment line.\n        CommentLine = 2,\n\n        //! A JavaDoc and Doxygen comment.\n        CommentDoc = 3,\n\n        //! A nested comment.\n        CommentNested = 4,\n\n        //! A number.\n        Number = 5,\n\n        //! A keyword.\n        Keyword = 6,\n\n        //! A secondary keyword.\n        KeywordSecondary = 7,\n\n        //! A doc keyword\n        KeywordDoc = 8,\n        \n        //! Typedefs and aliases\n        Typedefs = 9,\n        \n        //! A string.\n        String = 10,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 11,\n        \n        //! A character\n        Character = 12,\n\n        //! An operator.\n        Operator = 13,\n\n        //! An identifier\n        Identifier = 14,\n\n        //! A JavaDoc and Doxygen line.\n        CommentLineDoc = 15,\n\n        //! A JavaDoc and Doxygen  keyword.\n        CommentDocKeyword = 16,\n\n        //! A JavaDoc and Doxygen keyword error.\n        CommentDocKeywordError = 17,\n\n        //! A backquoted string.\n        BackquoteString = 18,\n\n        //! A raw, hexadecimal or delimited string.\n        RawString = 19,\n\n        //! A keyword defined in keyword set number 5.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet5 = 20,\n\n        //! A keyword defined in keyword set number 6.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet6 = 21,\n\n        //! A keyword defined in keyword set number 7.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet7 = 22,\n    };\n\n    //! Construct a QsciLexerD with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerD(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerD instance.\n    virtual ~QsciLexerD();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the character sequences that can separate\n    //! auto-completion words.\n    QStringList autoCompletionWordSeparators() const;\n\n    //! \\internal Returns a space separated list of words or characters in a\n    //! particular style that define the end of a block for auto-indentation.\n    //! The styles is returned via \\a style.\n    const char *blockEnd(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of words or characters in a\n    //! particular style that define the start of a block for auto-indentation.\n    //! The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of keywords in a particular\n    //! style that define the start of a block for auto-indentation.  The\n    //! styles is returned via \\a style.\n    const char *blockStartKeyword(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised by\n    //! the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the style\n    //! is invalid for this language then an empty QString is returned.  This\n    //! is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the propertyChanged()\n    //! signal as required.\n    void refreshProperties();\n\n    //! Returns true if \"} else {\" lines can be folded.\n    //!\n    //! \\sa setFoldAtElse()\n    bool foldAtElse() const;\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\npublic slots:\n    //! If \\a fold is true then \"} else {\" lines can be folded.  The default is\n    //! false.\n    //!\n    //! \\sa foldAtElse()\n    virtual void setFoldAtElse(bool fold);\n\n    //! If \\a fold is true then multi-line comment blocks can be folded.  The\n    //! default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    //! \\sa writeProperties()\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    //! \\sa readProperties()\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setAtElseProp();\n    void setCommentProp();\n    void setCompactProp();\n\n    bool fold_atelse;\n    bool fold_comments;\n    bool fold_compact;\n\n    QsciLexerD(const QsciLexerD &);\n    QsciLexerD &operator=(const QsciLexerD &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerdiff.h",
    "content": "// This defines the interface to the QsciLexerDiff class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERDIFF_H\n#define QSCILEXERDIFF_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerDiff class encapsulates the Scintilla Diff\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerDiff : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Diff lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A command.\n        Command = 2,\n\n        //! A header.\n        Header = 3,\n\n        //! A position.\n        Position = 4,\n\n        //! A removed line.\n        LineRemoved = 5,\n\n        //! An added line.\n        LineAdded = 6,\n\n        //! A changed line.\n        LineChanged = 7\n    };\n\n    //! Construct a QsciLexerDiff with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerDiff(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerDiff instance.\n    virtual ~QsciLexerDiff();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    QColor defaultColor(int style) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\nprivate:\n    QsciLexerDiff(const QsciLexerDiff &);\n    QsciLexerDiff &operator=(const QsciLexerDiff &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerfortran.h",
    "content": "// This defines the interface to the QsciLexerFortran class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERFORTRAN_H\n#define QSCILEXERFORTRAN_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexerfortran77.h>\n\n\n//! \\brief The QsciLexerFortran class encapsulates the Scintilla Fortran lexer.\nclass QSCINTILLA_EXPORT QsciLexerFortran : public QsciLexerFortran77\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexerFortran with parent \\a parent and name \\a name.\n    //! \\a parent is typically the QsciScintilla instance.\n    QsciLexerFortran(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerFortran instance.\n    virtual ~QsciLexerFortran();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\nprivate:\n    QsciLexerFortran(const QsciLexerFortran &);\n    QsciLexerFortran &operator=(const QsciLexerFortran &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerfortran77.h",
    "content": "// This defines the interface to the QsciLexerFortran77 class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERFORTRAN77_H\n#define QSCILEXERFORTRAN77_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerFortran77 class encapsulates the Scintilla Fortran77\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerFortran77 : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Fortran77 lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A number.\n        Number = 2,\n\n        //! A single-quoted string.\n        SingleQuotedString = 3,\n\n        //! A double-quoted string.\n        DoubleQuotedString = 4,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 5,\n\n        //! An operator.\n        Operator = 6,\n\n        //! An identifier\n        Identifier = 7,\n\n        //! A keyword.\n        Keyword = 8,\n\n        //! An intrinsic function.\n        IntrinsicFunction = 9,\n\n        //! An extended, non-standard or user defined function.\n        ExtendedFunction = 10,\n\n        //! A pre-processor block.\n        PreProcessor = 11,\n\n        //! An operator in .NAME. format.\n        DottedOperator = 12,\n\n        //! A label.\n        Label = 13,\n\n        //! A continuation.\n        Continuation = 14\n    };\n\n    //! Construct a QsciLexerFortran77 with parent \\a parent and name \\a name.\n    //! \\a parent is typically the QsciScintilla instance.\n    QsciLexerFortran77(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerFortran77 instance.\n    virtual ~QsciLexerFortran77();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\npublic slots:\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    //! \\sa writeProperties()\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    //! \\sa readProperties()\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCompactProp();\n\n    bool fold_compact;\n\n    QsciLexerFortran77(const QsciLexerFortran77 &);\n    QsciLexerFortran77 &operator=(const QsciLexerFortran77 &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerhtml.h",
    "content": "// This defines the interface to the QsciLexerHTML class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERHTML_H\n#define QSCILEXERHTML_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerHTML class encapsulates the Scintilla HTML lexer.\nclass QSCINTILLA_EXPORT QsciLexerHTML : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! HTML lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A tag.\n        Tag = 1,\n\n        //! An unknown tag.\n        UnknownTag = 2,\n\n        //! An attribute.\n        Attribute = 3,\n\n        //! An unknown attribute.\n        UnknownAttribute = 4,\n\n        //! An HTML number.\n        HTMLNumber = 5,\n\n        //! An HTML double-quoted string.\n        HTMLDoubleQuotedString = 6,\n\n        //! An HTML single-quoted string.\n        HTMLSingleQuotedString = 7,\n\n        //! Other text within a tag.\n        OtherInTag = 8,\n\n        //! An HTML comment.\n        HTMLComment = 9,\n\n        //! An entity.\n        Entity = 10,\n\n        //! The end of an XML style tag.\n        XMLTagEnd = 11,\n\n        //! The start of an XML fragment.\n        XMLStart = 12,\n\n        //! The end of an XML fragment.\n        XMLEnd = 13,\n\n        //! A script tag.\n        Script = 14,\n\n        //! The start of an ASP fragment with @.\n        ASPAtStart = 15,\n\n        //! The start of an ASP fragment.\n        ASPStart = 16,\n\n        //! CDATA.\n        CDATA = 17,\n\n        //! The start of a PHP fragment.\n        PHPStart = 18,\n\n        //! An unquoted HTML value.\n        HTMLValue = 19,\n\n        //! An ASP X-Code comment.\n        ASPXCComment = 20,\n\n        //! The default for SGML.\n        SGMLDefault = 21,\n\n        //! An SGML command.\n        SGMLCommand = 22,\n\n        //! The first parameter of an SGML command.\n        SGMLParameter = 23,\n\n        //! An SGML double-quoted string.\n        SGMLDoubleQuotedString = 24,\n\n        //! An SGML single-quoted string.\n        SGMLSingleQuotedString = 25,\n\n        //! An SGML error.\n        SGMLError = 26,\n\n        //! An SGML special entity.\n        SGMLSpecial = 27,\n\n        //! An SGML entity.\n        SGMLEntity = 28,\n\n        //! An SGML comment.\n        SGMLComment = 29,\n\n        //! A comment with the first parameter of an SGML command.\n        SGMLParameterComment = 30,\n\n        //! The default for an SGML block.\n        SGMLBlockDefault = 31,\n\n        //! The start of a JavaScript fragment.\n        JavaScriptStart = 40,\n\n        //! The default for JavaScript.\n        JavaScriptDefault = 41,\n\n        //! A JavaScript comment.\n        JavaScriptComment = 42,\n\n        //! A JavaScript line comment.\n        JavaScriptCommentLine = 43,\n\n        //! A JavaDoc style JavaScript comment.\n        JavaScriptCommentDoc = 44,\n\n        //! A JavaScript number.\n        JavaScriptNumber = 45,\n\n        //! A JavaScript word.\n        JavaScriptWord = 46,\n\n        //! A JavaScript keyword.\n        JavaScriptKeyword = 47,\n\n        //! A JavaScript double-quoted string.\n        JavaScriptDoubleQuotedString = 48,\n\n        //! A JavaScript single-quoted string.\n        JavaScriptSingleQuotedString = 49,\n\n        //! A JavaScript symbol.\n        JavaScriptSymbol = 50,\n\n        //! The end of a JavaScript line where a string is not closed.\n        JavaScriptUnclosedString = 51,\n\n        //! A JavaScript regular expression.\n        JavaScriptRegex = 52,\n\n        //! The start of an ASP JavaScript fragment.\n        ASPJavaScriptStart = 55,\n\n        //! The default for ASP JavaScript.\n        ASPJavaScriptDefault = 56,\n\n        //! An ASP JavaScript comment.\n        ASPJavaScriptComment = 57,\n\n        //! An ASP JavaScript line comment.\n        ASPJavaScriptCommentLine = 58,\n\n        //! An ASP JavaDoc style JavaScript comment.\n        ASPJavaScriptCommentDoc = 59,\n\n        //! An ASP JavaScript number.\n        ASPJavaScriptNumber = 60,\n\n        //! An ASP JavaScript word.\n        ASPJavaScriptWord = 61,\n\n        //! An ASP JavaScript keyword.\n        ASPJavaScriptKeyword = 62,\n\n        //! An ASP JavaScript double-quoted string.\n        ASPJavaScriptDoubleQuotedString = 63,\n\n        //! An ASP JavaScript single-quoted string.\n        ASPJavaScriptSingleQuotedString = 64,\n\n        //! An ASP JavaScript symbol.\n        ASPJavaScriptSymbol = 65,\n\n        //! The end of an ASP JavaScript line where a string is not\n        //! closed.\n        ASPJavaScriptUnclosedString = 66,\n\n        //! An ASP JavaScript regular expression.\n        ASPJavaScriptRegex = 67,\n\n        //! The start of a VBScript fragment.\n        VBScriptStart = 70,\n\n        //! The default for VBScript.\n        VBScriptDefault = 71,\n\n        //! A VBScript comment.\n        VBScriptComment = 72,\n\n        //! A VBScript number.\n        VBScriptNumber = 73,\n\n        //! A VBScript keyword.\n        VBScriptKeyword = 74,\n\n        //! A VBScript string.\n        VBScriptString = 75,\n\n        //! A VBScript identifier.\n        VBScriptIdentifier = 76,\n\n        //! The end of a VBScript line where a string is not closed.\n        VBScriptUnclosedString = 77,\n\n        //! The start of an ASP VBScript fragment.\n        ASPVBScriptStart = 80,\n\n        //! The default for ASP VBScript.\n        ASPVBScriptDefault = 81,\n\n        //! An ASP VBScript comment.\n        ASPVBScriptComment = 82,\n\n        //! An ASP VBScript number.\n        ASPVBScriptNumber = 83,\n\n        //! An ASP VBScript keyword.\n        ASPVBScriptKeyword = 84,\n\n        //! An ASP VBScript string.\n        ASPVBScriptString = 85,\n\n        //! An ASP VBScript identifier.\n        ASPVBScriptIdentifier = 86,\n\n        //! The end of an ASP VBScript line where a string is not\n        //! closed.\n        ASPVBScriptUnclosedString = 87,\n\n        //! The start of a Python fragment.\n        PythonStart = 90,\n\n        //! The default for Python.\n        PythonDefault = 91,\n\n        //! A Python comment.\n        PythonComment = 92,\n\n        //! A Python number.\n        PythonNumber = 93,\n\n        //! A Python double-quoted string.\n        PythonDoubleQuotedString = 94,\n\n        //! A Python single-quoted string.\n        PythonSingleQuotedString = 95,\n\n        //! A Python keyword.\n        PythonKeyword = 96,\n\n        //! A Python triple single-quoted string.\n        PythonTripleSingleQuotedString = 97,\n\n        //! A Python triple double-quoted string.\n        PythonTripleDoubleQuotedString = 98,\n\n        //! The name of a Python class.\n        PythonClassName = 99,\n\n        //! The name of a Python function or method.\n        PythonFunctionMethodName = 100,\n\n        //! A Python operator.\n        PythonOperator = 101,\n\n        //! A Python identifier.\n        PythonIdentifier = 102,\n\n        //! The start of an ASP Python fragment.\n        ASPPythonStart = 105,\n\n        //! The default for ASP Python.\n        ASPPythonDefault = 106,\n\n        //! An ASP Python comment.\n        ASPPythonComment = 107,\n\n        //! An ASP Python number.\n        ASPPythonNumber = 108,\n\n        //! An ASP Python double-quoted string.\n        ASPPythonDoubleQuotedString = 109,\n\n        //! An ASP Python single-quoted string.\n        ASPPythonSingleQuotedString = 110,\n\n        //! An ASP Python keyword.\n        ASPPythonKeyword = 111,\n\n        //! An ASP Python triple single-quoted string.\n        ASPPythonTripleSingleQuotedString = 112,\n\n        //! An ASP Python triple double-quoted string.\n        ASPPythonTripleDoubleQuotedString = 113,\n\n        //! The name of an ASP Python class.\n        ASPPythonClassName = 114,\n\n        //! The name of an ASP Python function or method.\n        ASPPythonFunctionMethodName = 115,\n\n        //! An ASP Python operator.\n        ASPPythonOperator = 116,\n\n        //! An ASP Python identifier\n        ASPPythonIdentifier = 117,\n\n        //! The default for PHP.\n        PHPDefault = 118,\n\n        //! A PHP double-quoted string.\n        PHPDoubleQuotedString = 119,\n\n        //! A PHP single-quoted string.\n        PHPSingleQuotedString = 120,\n\n        //! A PHP keyword.\n        PHPKeyword = 121,\n\n        //! A PHP number.\n        PHPNumber = 122,\n\n        //! A PHP variable.\n        PHPVariable = 123,\n\n        //! A PHP comment.\n        PHPComment = 124,\n\n        //! A PHP line comment.\n        PHPCommentLine = 125,\n\n        //! A PHP double-quoted variable.\n        PHPDoubleQuotedVariable = 126,\n\n        //! A PHP operator.\n        PHPOperator = 127\n    };\n\n    //! Construct a QsciLexerHTML with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerHTML(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerHTML instance.\n    virtual ~QsciLexerHTML();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the auto-completion fillup characters.\n    const char *autoCompletionFillups() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if tags are case sensitive.\n    //!\n    //! \\sa setCaseSensitiveTags()\n    bool caseSensitiveTags() const {return case_sens_tags;}\n\n    //! If \\a enabled is true then Django templates are enabled.  The default\n    //! is false.\n    //!\n    //! \\sa djangoTemplates()\n    void setDjangoTemplates(bool enabled);\n\n    //! Returns true if support for Django templates is enabled.\n    //!\n    //! \\sa setDjangoTemplates()\n    bool djangoTemplates() const {return django_templates;}\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const {return fold_compact;}\n\n    //! Returns true if preprocessor blocks can be folded.\n    //!\n    //! \\sa setFoldPreprocessor()\n    bool foldPreprocessor() const {return fold_preproc;}\n\n    //! If \\a fold is true then script comments can be folded.  The default is\n    //! false.\n    //!\n    //! \\sa foldScriptComments()\n    void setFoldScriptComments(bool fold);\n\n    //! Returns true if script comments can be folded.\n    //!\n    //! \\sa setFoldScriptComments()\n    bool foldScriptComments() const {return fold_script_comments;}\n\n    //! If \\a fold is true then script heredocs can be folded.  The default is\n    //! false.\n    //!\n    //! \\sa foldScriptHeredocs()\n    void setFoldScriptHeredocs(bool fold);\n\n    //! Returns true if script heredocs can be folded.\n    //!\n    //! \\sa setFoldScriptHeredocs()\n    bool foldScriptHeredocs() const {return fold_script_heredocs;}\n\n    //! If \\a enabled is true then Mako templates are enabled.  The default is\n    //! false.\n    //!\n    //! \\sa makoTemplates()\n    void setMakoTemplates(bool enabled);\n\n    //! Returns true if support for Mako templates is enabled.\n    //!\n    //! \\sa setMakoTemplates()\n    bool makoTemplates() const {return mako_templates;}\n\npublic slots:\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\n    //! If \\a fold is true then preprocessor blocks can be folded.  The\n    //! default is false.\n    //!\n    //! \\sa foldPreprocessor()\n    virtual void setFoldPreprocessor(bool fold);\n\n    //! If \\a sens is true then tags are case sensitive.  The default is false.\n    //!\n    //! \\sa caseSensitiveTags()\n    virtual void setCaseSensitiveTags(bool sens);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCompactProp();\n    void setPreprocProp();\n    void setCaseSensTagsProp();\n    void setScriptCommentsProp();\n    void setScriptHeredocsProp();\n    void setDjangoProp();\n    void setMakoProp();\n\n    bool fold_compact;\n    bool fold_preproc;\n    bool case_sens_tags;\n    bool fold_script_comments;\n    bool fold_script_heredocs;\n    bool django_templates;\n    bool mako_templates;\n\n    QsciLexerHTML(const QsciLexerHTML &);\n    QsciLexerHTML &operator=(const QsciLexerHTML &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexeridl.h",
    "content": "// This defines the interface to the QsciLexerIDL class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERIDL_H\n#define QSCILEXERIDL_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexercpp.h>\n\n\n//! \\brief The QsciLexerIDL class encapsulates the Scintilla IDL\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerIDL : public QsciLexerCPP\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexerIDL with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerIDL(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerIDL instance.\n    virtual ~QsciLexerIDL();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    QColor defaultColor(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\nprivate:\n    QsciLexerIDL(const QsciLexerIDL &);\n    QsciLexerIDL &operator=(const QsciLexerIDL &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerjava.h",
    "content": "// This defines the interface to the QsciLexerJava class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERJAVA_H\n#define QSCILEXERJAVA_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexercpp.h>\n\n\n//! \\brief The QsciLexerJava class encapsulates the Scintilla Java lexer.\nclass QSCINTILLA_EXPORT QsciLexerJava : public QsciLexerCPP\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexerJava with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerJava(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerJava instance.\n    virtual ~QsciLexerJava();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\nprivate:\n    QsciLexerJava(const QsciLexerJava &);\n    QsciLexerJava &operator=(const QsciLexerJava &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerjavascript.h",
    "content": "// This defines the interface to the QsciLexerJavaScript class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERJSCRIPT_H\n#define QSCILEXERJSCRIPT_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexercpp.h>\n\n\n//! \\brief The QsciLexerJavaScript class encapsulates the Scintilla JavaScript\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerJavaScript : public QsciLexerCPP\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexerJavaScript with parent \\a parent and name \\a name.\n    //! \\a parent is typically the QsciScintilla instance.\n    QsciLexerJavaScript(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerJavaScript instance.\n    virtual ~QsciLexerJavaScript();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\nprivate:\n    friend class QsciLexerHTML;\n\n    static const char *keywordClass;\n\n    QsciLexerJavaScript(const QsciLexerJavaScript &);\n    QsciLexerJavaScript &operator=(const QsciLexerJavaScript &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerlua.h",
    "content": "// This defines the interface to the QsciLexerLua class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERLUA_H\n#define QSCILEXERLUA_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerLua class encapsulates the Scintilla Lua\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerLua : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Lua lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A block comment.\n        Comment = 1,\n\n        //! A line comment.\n        LineComment = 2,\n\n        //! A number.\n        Number = 4,\n\n        //! A keyword.\n        Keyword = 5,\n\n        //! A string.\n        String = 6,\n\n        //! A character.\n        Character = 7,\n\n        //! A literal string.\n        LiteralString = 8,\n\n        //! Preprocessor\n        Preprocessor = 9,\n\n        //! An operator.\n        Operator = 10,\n\n        //! An identifier\n        Identifier = 11,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 12,\n\n        //! Basic functions.\n        BasicFunctions = 13,\n\n        //! String, table and maths functions.\n        StringTableMathsFunctions = 14,\n\n        //! Coroutines, I/O and system facilities.\n        CoroutinesIOSystemFacilities = 15,\n\n        //! A keyword defined in keyword set number 5.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet5 = 16,\n\n        //! A keyword defined in keyword set number 6.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet6 = 17,\n\n        //! A keyword defined in keyword set number 7.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet7 = 18,\n\n        //! A keyword defined in keyword set number 8.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet8 = 19,\n\n        //! A label.\n        Label = 20\n    };\n\n    //! Construct a QsciLexerLua with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerLua(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerLua instance.\n    virtual ~QsciLexerLua();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the character sequences that can separate\n    //! auto-completion words.\n    QStringList autoCompletionWordSeparators() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\npublic slots:\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCompactProp();\n\n    bool fold_compact;\n\n    QsciLexerLua(const QsciLexerLua &);\n    QsciLexerLua &operator=(const QsciLexerLua &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexermakefile.h",
    "content": "// This defines the interface to the QsciLexerMakefile class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERMAKEFILE_H\n#define QSCILEXERMAKEFILE_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerMakefile class encapsulates the Scintilla\n//! Makefile lexer.\nclass QSCINTILLA_EXPORT QsciLexerMakefile : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Makefile lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A pre-processor directive.\n        Preprocessor = 2,\n\n        //! A variable.\n        Variable = 3,\n\n        //! An operator.\n        Operator = 4,\n\n        //! A target.\n        Target = 5,\n\n        //! An error.\n        Error = 9\n    };\n\n    //! Construct a QsciLexerMakefile with parent \\a parent and name \\a name.\n    //! \\a parent is typically the QsciScintilla instance.\n    QsciLexerMakefile(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerMakefile instance.\n    virtual ~QsciLexerMakefile();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\nprivate:\n    QsciLexerMakefile(const QsciLexerMakefile &);\n    QsciLexerMakefile &operator=(const QsciLexerMakefile &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexermatlab.h",
    "content": "// This defines the interface to the QsciLexerMatlab class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERMATLAB_H\n#define QSCILEXERMATLAB_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerMatlab class encapsulates the Scintilla Matlab file\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerMatlab : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Matlab file lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A command.\n        Command = 2,\n\n        //! A number.\n        Number = 3,\n\n        //! A keyword.\n        Keyword = 4,\n\n        //! A single quoted string.\n        SingleQuotedString = 5,\n\n        //! An operator\n        Operator = 6,\n\n        //! An identifier.\n        Identifier = 7,\n\n        //! A double quoted string.\n        DoubleQuotedString = 8\n    };\n\n    //! Construct a QsciLexerMatlab with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerMatlab(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerMatlab instance.\n    virtual ~QsciLexerMatlab();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\nprivate:\n    QsciLexerMatlab(const QsciLexerMatlab &);\n    QsciLexerMatlab &operator=(const QsciLexerMatlab &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexeroctave.h",
    "content": "// This defines the interface to the QsciLexerOctave class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXEROCTAVE_H\n#define QSCILEXEROCTAVE_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexermatlab.h>\n\n\n//! \\brief The QsciLexerOctave class encapsulates the Scintilla Octave file\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerOctave : public QsciLexerMatlab\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexerOctave with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerOctave(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerOctave instance.\n    virtual ~QsciLexerOctave();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\nprivate:\n    QsciLexerOctave(const QsciLexerOctave &);\n    QsciLexerOctave &operator=(const QsciLexerOctave &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerpascal.h",
    "content": "// This defines the interface to the QsciLexerPascal class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERPASCAL_H\n#define QSCILEXERPASCAL_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerPascal class encapsulates the Scintilla Pascal lexer.\nclass QSCINTILLA_EXPORT QsciLexerPascal : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! C++ lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! An identifier\n        Identifier = 1,\n\n        //! A '{ ... }' style comment.\n        Comment = 2,\n\n        //! A '(* ... *)' style comment.\n        CommentParenthesis = 3,\n\n        //! A comment line.\n        CommentLine = 4,\n\n        //! A '{$ ... }' style pre-processor block.\n        PreProcessor = 5,\n\n        //! A '(*$ ... *)' style pre-processor block.\n        PreProcessorParenthesis = 6,\n\n        //! A number.\n        Number = 7,\n\n        //! A hexadecimal number.\n        HexNumber = 8,\n\n        //! A keyword.\n        Keyword = 9,\n\n        //! A single-quoted string.\n        SingleQuotedString = 10,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 11,\n\n        //! A character.\n        Character = 12,\n\n        //! An operator.\n        Operator = 13,\n\n        //! Inline Asm.\n        Asm = 14\n    };\n\n    //! Construct a QsciLexerPascal with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerPascal(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerPascal instance.\n    virtual ~QsciLexerPascal();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the character sequences that can separate\n    //! auto-completion words.\n    QStringList autoCompletionWordSeparators() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the end of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockEnd(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of keywords in a\n    //! particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStartKeyword(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\n    //! Returns true if preprocessor blocks can be folded.\n    //!\n    //! \\sa setFoldPreprocessor()\n    bool foldPreprocessor() const;\n\n    //! If \\a enabled is true then some keywords will only be highlighted in an\n    //! appropriate context (similar to how the Delphi IDE works).  The default\n    //! is true.\n    //!\n    //! \\sa smartHighlighting()\n    void setSmartHighlighting(bool enabled);\n\n    //! Returns true if some keywords will only be highlighted in an\n    //! appropriate context (similar to how the Delphi IDE works).\n    //!\n    //! \\sa setSmartHighlighting()\n    bool smartHighlighting() const;\n\npublic slots:\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\n    //! If \\a fold is true then preprocessor blocks can be folded.  The\n    //! default is true.\n    //!\n    //! \\sa foldPreprocessor()\n    virtual void setFoldPreprocessor(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    //! \\sa writeProperties()\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    //! \\sa readProperties()\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n    void setPreprocProp();\n    void setSmartHighlightProp();\n\n    bool fold_comments;\n    bool fold_compact;\n    bool fold_preproc;\n    bool smart_highlight;\n\n    QsciLexerPascal(const QsciLexerPascal &);\n    QsciLexerPascal &operator=(const QsciLexerPascal &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerperl.h",
    "content": "// This defines the interface to the QsciLexerPerl class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERPERL_H\n#define QSCILEXERPERL_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerPerl class encapsulates the Scintilla Perl\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerPerl : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Perl lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! An error.\n        Error = 1,\n\n        //! A comment.\n        Comment = 2,\n\n        //! A POD.\n        POD = 3,\n\n        //! A number.\n        Number = 4,\n\n        //! A keyword.\n        Keyword = 5,\n\n        //! A double-quoted string.\n        DoubleQuotedString = 6,\n\n        //! A single-quoted string.\n        SingleQuotedString = 7,\n\n        //! An operator.\n        Operator = 10,\n\n        //! An identifier\n        Identifier = 11,\n\n        //! A scalar.\n        Scalar = 12,\n\n        //! An array.\n        Array = 13,\n\n        //! A hash.\n        Hash = 14,\n\n        //! A symbol table.\n        SymbolTable = 15,\n\n        //! A regular expression.\n        Regex = 17,\n\n        //! A substitution.\n        Substitution = 18,\n\n        //! Backticks.\n        Backticks = 20,\n\n        //! A data section.\n        DataSection = 21,\n\n        //! A here document delimiter.\n        HereDocumentDelimiter = 22,\n\n        //! A single quoted here document.\n        SingleQuotedHereDocument = 23,\n\n        //! A double quoted here document.\n        DoubleQuotedHereDocument = 24,\n\n        //! A backtick here document.\n        BacktickHereDocument = 25,\n\n        //! A quoted string (q).\n        QuotedStringQ = 26,\n\n        //! A quoted string (qq).\n        QuotedStringQQ = 27,\n\n        //! A quoted string (qx).\n        QuotedStringQX = 28,\n\n        //! A quoted string (qr).\n        QuotedStringQR = 29,\n\n        //! A quoted string (qw).\n        QuotedStringQW = 30,\n\n        //! A verbatim POD.\n        PODVerbatim = 31,\n\n        //! A Subroutine prototype.\n        SubroutinePrototype = 40,\n\n        //! A format identifier.\n        FormatIdentifier = 41,\n\n        //! A format body.\n        FormatBody = 42,\n\n        //! A double-quoted string (interpolated variable).\n        DoubleQuotedStringVar = 43,\n\n        //! A translation.\n        Translation = 44,\n\n        //! A regular expression (interpolated variable).\n        RegexVar = 54,\n\n        //! A substitution (interpolated variable).\n        SubstitutionVar = 55,\n\n        //! Backticks (interpolated variable).\n        BackticksVar = 57,\n\n        //! A double quoted here document (interpolated variable).\n        DoubleQuotedHereDocumentVar = 61,\n\n        //! A backtick here document (interpolated variable).\n        BacktickHereDocumentVar = 62,\n\n        //! A quoted string (qq, interpolated variable).\n        QuotedStringQQVar = 64,\n\n        //! A quoted string (qx, interpolated variable).\n        QuotedStringQXVar = 65,\n\n        //! A quoted string (qr, interpolated variable).\n        QuotedStringQRVar = 66\n    };\n\n    //! Construct a QsciLexerPerl with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerPerl(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerPerl instance.\n    virtual ~QsciLexerPerl();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the character sequences that can separate\n    //! auto-completion words.\n    QStringList autoCompletionWordSeparators() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the end of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockEnd(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number\n    //! \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! If \\a fold is true then \"} else {\" lines can be folded.  The default is\n    //! false.\n    //!\n    //! \\sa foldAtElse()\n    void setFoldAtElse(bool fold);\n\n    //! Returns true if \"} else {\" lines can be folded.\n    //!\n    //! \\sa setFoldAtElse()\n    bool foldAtElse() const {return fold_atelse;}\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\n    //! If \\a fold is true then packages can be folded.  The default is true.\n    //!\n    //! \\sa foldPackages()\n    void setFoldPackages(bool fold);\n\n    //! Returns true if packages can be folded.\n    //!\n    //! \\sa setFoldPackages()\n    bool foldPackages() const;\n\n    //! If \\a fold is true then POD blocks can be folded.  The default is true.\n    //!\n    //! \\sa foldPODBlocks()\n    void setFoldPODBlocks(bool fold);\n\n    //! Returns true if POD blocks can be folded.\n    //!\n    //! \\sa setFoldPODBlocks()\n    bool foldPODBlocks() const;\n\npublic slots:\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setAtElseProp();\n    void setCommentProp();\n    void setCompactProp();\n    void setPackagesProp();\n    void setPODBlocksProp();\n\n    bool fold_atelse;\n    bool fold_comments;\n    bool fold_compact;\n    bool fold_packages;\n    bool fold_pod_blocks;\n\n    QsciLexerPerl(const QsciLexerPerl &);\n    QsciLexerPerl &operator=(const QsciLexerPerl &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerpo.h",
    "content": "// This defines the interface to the QsciLexerPO class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERPO_H\n#define QSCILEXERPO_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerPO class encapsulates the Scintilla PO lexer.\nclass QSCINTILLA_EXPORT QsciLexerPO : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! PO lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A message identifier.\n        MessageId = 2,\n\n        //! The text of a message identifier.\n        MessageIdText = 3,\n\n        //! A message string.\n        MessageString = 4,\n\n        //! The text of a message string.\n        MessageStringText = 5,\n\n        //! A message context.\n        MessageContext = 6,\n\n        //! The text of a message context.\n        MessageContextText = 7,\n\n        //! The \"fuzzy\" flag.\n        Fuzzy = 8,\n\n        //! A programmer comment.\n        ProgrammerComment = 9,\n\n        //! A reference.\n        Reference = 10,\n\n        //! A flag.\n        Flags = 11,\n\n        //! A message identifier text end-of-line.\n        MessageIdTextEOL = 12,\n\n        //! A message string text end-of-line.\n        MessageStringTextEOL = 13,\n\n        //! A message context text end-of-line.\n        MessageContextTextEOL = 14\n    };\n\n    //! Construct a QsciLexerPO with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerPO(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerPO instance.\n    virtual ~QsciLexerPO();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the propertyChanged()\n    //! signal as required.\n    void refreshProperties();\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\npublic slots:\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n\n    bool fold_comments;\n    bool fold_compact;\n\n    QsciLexerPO(const QsciLexerPO &);\n    QsciLexerPO &operator=(const QsciLexerPO &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerpostscript.h",
    "content": "// This defines the interface to the QsciLexerPostScript class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERPOSTSCRIPT_H\n#define QSCILEXERPOSTSCRIPT_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerPostScript class encapsulates the Scintilla PostScript\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerPostScript : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! PostScript lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A DSC comment.\n        DSCComment = 2,\n\n        //! A DSC comment value.\n        DSCCommentValue = 3,\n\n        //! A number.\n        Number = 4,\n\n        //! A name.\n        Name = 5,\n\n        //! A keyword.\n        Keyword = 6,\n\n        //! A literal.\n        Literal = 7,\n\n        //! An immediately evaluated literal.\n        ImmediateEvalLiteral = 8,\n\n        //! Array parenthesis.\n        ArrayParenthesis = 9,\n\n        //! Dictionary parenthesis.\n        DictionaryParenthesis = 10,\n\n        //! Procedure parenthesis.\n        ProcedureParenthesis = 11,\n\n        //! Text.\n        Text = 12,\n\n        //! A hexadecimal string.\n        HexString = 13,\n\n        //! A base85 string.\n        Base85String = 14,\n\n        //! A bad string character.\n        BadStringCharacter = 15\n    };\n\n    //! Construct a QsciLexerPostScript with parent \\a parent and name \\a name.\n    //! \\a parent is typically the QsciScintilla instance.\n    QsciLexerPostScript(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerPostScript instance.\n    virtual ~QsciLexerPostScript();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.  Set 5 can be used to provide\n    //! additional user defined keywords.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the propertyChanged()\n    //! signal as required.\n    void refreshProperties();\n\n    //! Returns true if tokens should be marked.\n    //!\n    //! \\sa setTokenize()\n    bool tokenize() const;\n\n    //! Returns the PostScript level.\n    //!\n    //! \\sa setLevel()\n    int level() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\n    //! Returns true if else blocks can be folded.\n    //!\n    //! \\sa setFoldAtElse()\n    bool foldAtElse() const;\n\npublic slots:\n    //! If \\a tokenize is true then tokens are marked.  The default is false.\n    //!\n    //! \\sa tokenize()\n    virtual void setTokenize(bool tokenize);\n\n    //! The PostScript level is set to \\a level.  The default is 3.\n    //!\n    //! \\sa level()\n    virtual void setLevel(int level);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\n    //! If \\a fold is true then else blocks can be folded.  The default is\n    //! false.\n    //!\n    //! \\sa foldAtElse()\n    virtual void setFoldAtElse(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setTokenizeProp();\n    void setLevelProp();\n    void setCompactProp();\n    void setAtElseProp();\n\n    bool ps_tokenize;\n    int ps_level;\n    bool fold_compact;\n    bool fold_atelse;\n\n    QsciLexerPostScript(const QsciLexerPostScript &);\n    QsciLexerPostScript &operator=(const QsciLexerPostScript &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerpov.h",
    "content": "// This defines the interface to the QsciLexerPOV class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERPOV_H\n#define QSCILEXERPOV_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerPOV class encapsulates the Scintilla POV lexer.\nclass QSCINTILLA_EXPORT QsciLexerPOV : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! POV lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A comment line.\n        CommentLine = 2,\n\n        //! A number.\n        Number = 3,\n\n        //! An operator.\n        Operator = 4,\n\n        //! An identifier\n        Identifier = 5,\n\n        //! A string.\n        String = 6,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 7,\n\n        //! A directive.\n        Directive = 8,\n\n        //! A bad directive.\n        BadDirective = 9,\n\n        //! Objects, CSG and appearance.\n        ObjectsCSGAppearance = 10,\n\n        //! Types, modifiers and items.\n        TypesModifiersItems = 11,\n\n        //! Predefined identifiers.\n        PredefinedIdentifiers = 12,\n\n        //! Predefined identifiers.\n        PredefinedFunctions = 13,\n\n        //! A keyword defined in keyword set number 6.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet6 = 14,\n\n        //! A keyword defined in keyword set number 7.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet7 = 15,\n\n        //! A keyword defined in keyword set number 8.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet8 = 16\n    };\n\n    //! Construct a QsciLexerPOV with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerPOV(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerPOV instance.\n    virtual ~QsciLexerPOV();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the propertyChanged()\n    //! signal as required.\n    void refreshProperties();\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\n    //! Returns true if directives can be folded.\n    //!\n    //! \\sa setFoldDirectives()\n    bool foldDirectives() const;\n\npublic slots:\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\n    //! If \\a fold is true then directives can be folded.  The default is\n    //! false.\n    //!\n    //! \\sa foldDirectives()\n    virtual void setFoldDirectives(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n    void setDirectiveProp();\n\n    bool fold_comments;\n    bool fold_compact;\n    bool fold_directives;\n\n    QsciLexerPOV(const QsciLexerPOV &);\n    QsciLexerPOV &operator=(const QsciLexerPOV &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerproperties.h",
    "content": "// This defines the interface to the QsciLexerProperties class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERPROPERTIES_H\n#define QSCILEXERPROPERTIES_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerProperties class encapsulates the Scintilla\n//! Properties lexer.\nclass QSCINTILLA_EXPORT QsciLexerProperties : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Properties lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A section.\n        Section = 2,\n\n        //! An assignment operator.\n        Assignment = 3,\n\n        //! A default value.\n        DefaultValue = 4,\n\n        //! A key.\n        Key = 5\n    };\n\n    //! Construct a QsciLexerProperties with parent \\a parent and name \\a name.\n    //! \\a parent is typically the QsciScintilla instance.\n    QsciLexerProperties(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerProperties instance.\n    virtual ~QsciLexerProperties();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the style\n    //! is invalid for this language then an empty QString is returned.  This\n    //! is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const {return fold_compact;}\n\n    //! If \\a enable is true then initial spaces in a line are allowed.  The\n    //! default is true.\n    //!\n    //! \\sa initialSpaces()\n    void setInitialSpaces(bool enable);\n\n    //! Returns true if initial spaces in a line are allowed.\n    //!\n    //! \\sa setInitialSpaces()\n    bool initialSpaces() const {return initial_spaces;}\n\npublic slots:\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    //! \\sa writeProperties()\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    //! \\sa readProperties()\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCompactProp();\n    void setInitialSpacesProp();\n\n    bool fold_compact;\n    bool initial_spaces;\n\n    QsciLexerProperties(const QsciLexerProperties &);\n    QsciLexerProperties &operator=(const QsciLexerProperties &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerpython.h",
    "content": "// This defines the interface to the QsciLexerPython class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERPYTHON_H\n#define QSCILEXERPYTHON_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n#include \"Qsci/qsciscintillabase.h\"\n\n\n//! \\brief The QsciLexerPython class encapsulates the Scintilla Python lexer.\nclass QSCINTILLA_EXPORT QsciLexerPython : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Python lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A number.\n        Number = 2,\n\n        //! A double-quoted string.\n        DoubleQuotedString = 3,\n\n        //! A single-quoted string.\n        SingleQuotedString = 4,\n\n        //! A keyword.\n        Keyword = 5,\n\n        //! A triple single-quoted string.\n        TripleSingleQuotedString = 6,\n\n        //! A triple double-quoted string.\n        TripleDoubleQuotedString = 7,\n\n        //! The name of a class.\n        ClassName = 8,\n\n        //! The name of a function or method.\n        FunctionMethodName = 9,\n\n        //! An operator.\n        Operator = 10,\n\n        //! An identifier\n        Identifier = 11,\n\n        //! A comment block.\n        CommentBlock = 12,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 13,\n\n        //! A highlighted identifier.  These are defined by keyword set\n        //! 2.  Reimplement keywords() to define keyword set 2.\n        HighlightedIdentifier = 14,\n\n        //! A decorator.\n        Decorator = 15\n    };\n\n    //! This enum defines the different conditions that can cause\n    //! indentations to be displayed as being bad.\n    enum IndentationWarning {\n        //! Bad indentation is not displayed differently.\n        NoWarning = 0,\n\n        //! The indentation is inconsistent when compared to the\n        //! previous line, ie. it is made up of a different combination\n        //! of tabs and/or spaces.\n        Inconsistent = 1,\n\n        //! The indentation is made up of spaces followed by tabs.\n        TabsAfterSpaces = 2,\n\n        //! The indentation contains spaces.\n        Spaces = 3,\n\n        //! The indentation contains tabs.\n        Tabs = 4\n    };\n\n    //! Construct a QsciLexerPython with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerPython(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerPython instance.\n    virtual ~QsciLexerPython();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the character sequences that can separate\n    //! auto-completion words.\n    QStringList autoCompletionWordSeparators() const;\n\n    //! \\internal Returns the number of lines prior to the current one when\n    //! determining the scope of a block when auto-indenting.\n    int blockLookback() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! \\internal Returns the view used for indentation guides.\n    virtual int indentationGuideView() const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if indented comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const {return fold_comments;}\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    void setFoldCompact(bool fold);\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const {return fold_compact;}\n\n    //! Returns true if triple quoted strings can be folded.\n    //!\n    //! \\sa setFoldQuotes()\n    bool foldQuotes() const {return fold_quotes;}\n\n    //! Returns the condition that will cause bad indentations to be\n    //! displayed.\n    //!\n    //! \\sa setIndentationWarning()\n    QsciLexerPython::IndentationWarning indentationWarning() const {return indent_warn;}\n\n    //! If \\a enabled is true then sub-identifiers defined in keyword set 2\n    //! will be highlighted.  For example, if it is false and \"open\" is defined\n    //! in keyword set 2 then \"foo.open\" will not be highlighted.  The default\n    //! is true.\n    //!\n    //! \\sa highlightSubidentifiers()\n    void setHighlightSubidentifiers(bool enabled);\n\n    //! Returns true if string literals are allowed to span newline characters.\n    //!\n    //! \\sa setHighlightSubidentifiers()\n    bool highlightSubidentifiers() const {return highlight_subids;}\n\n    //! If \\a allowed is true then string literals are allowed to span newline\n    //! characters.  The default is false.\n    //!\n    //! \\sa stringsOverNewlineAllowed()\n    void setStringsOverNewlineAllowed(bool allowed);\n\n    //! Returns true if string literals are allowed to span newline characters.\n    //!\n    //! \\sa setStringsOverNewlineAllowed()\n    bool stringsOverNewlineAllowed() const {return strings_over_newline;}\n\n    //! If \\a allowed is true then Python v2 unicode string literals (e.g.\n    //! u\"utf8\") are allowed.  The default is true.\n    //!\n    //! \\sa v2UnicodeAllowed()\n    void setV2UnicodeAllowed(bool allowed);\n\n    //! Returns true if Python v2 unicode string literals (e.g. u\"utf8\") are\n    //! allowed.\n    //!\n    //! \\sa setV2UnicodeAllowed()\n    bool v2UnicodeAllowed() const {return v2_unicode;}\n\n    //! If \\a allowed is true then Python v3 binary and octal literals (e.g.\n    //! 0b1011, 0o712) are allowed.  The default is true.\n    //!\n    //! \\sa v3BinaryOctalAllowed()\n    void setV3BinaryOctalAllowed(bool allowed);\n\n    //! Returns true if Python v3 binary and octal literals (e.g. 0b1011,\n    //! 0o712) are allowed.\n    //!\n    //! \\sa setV3BinaryOctalAllowed()\n    bool v3BinaryOctalAllowed() const {return v3_binary_octal;}\n\n    //! If \\a allowed is true then Python v3 bytes string literals (e.g.\n    //! b\"bytes\") are allowed.  The default is true.\n    //!\n    //! \\sa v3BytesAllowed()\n    void setV3BytesAllowed(bool allowed);\n\n    //! Returns true if Python v3 bytes string literals (e.g. b\"bytes\") are\n    //! allowed.\n    //!\n    //! \\sa setV3BytesAllowed()\n    bool v3BytesAllowed() const {return v3_bytes;}\n\npublic slots:\n    //! If \\a fold is true then indented comment blocks can be folded.  The\n    //! default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then triple quoted strings can be folded.  The\n    //! default is false.\n    //!\n    //! \\sa foldQuotes()\n    virtual void setFoldQuotes(bool fold);\n\n    //! Sets the condition that will cause bad indentations to be\n    //! displayed.\n    //!\n    //! \\sa indentationWarning()\n    virtual void setIndentationWarning(QsciLexerPython::IndentationWarning warn);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n    void setQuotesProp();\n    void setTabWhingeProp();\n    void setStringsOverNewlineProp();\n    void setV2UnicodeProp();\n    void setV3BinaryOctalProp();\n    void setV3BytesProp();\n    void setHighlightSubidsProp();\n\n    bool fold_comments;\n    bool fold_compact;\n    bool fold_quotes;\n    IndentationWarning indent_warn;\n    bool strings_over_newline;\n    bool v2_unicode;\n    bool v3_binary_octal;\n    bool v3_bytes;\n    bool highlight_subids;\n\n    friend class QsciLexerHTML;\n\n    static const char *keywordClass;\n\n    QsciLexerPython(const QsciLexerPython &);\n    QsciLexerPython &operator=(const QsciLexerPython &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerruby.h",
    "content": "// This defines the interface to the QsciLexerRuby class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERRUBY_H\n#define QSCILEXERRUBY_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerRuby class encapsulates the Scintilla Ruby lexer.\nclass QSCINTILLA_EXPORT QsciLexerRuby : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Ruby lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! An error.\n        Error = 1,\n\n        //! A comment.\n        Comment = 2,\n\n        //! A POD.\n        POD = 3,\n\n        //! A number.\n        Number = 4,\n\n        //! A keyword.\n        Keyword = 5,\n\n        //! A double-quoted string.\n        DoubleQuotedString = 6,\n\n        //! A single-quoted string.\n        SingleQuotedString = 7,\n\n        //! The name of a class.\n        ClassName = 8,\n\n        //! The name of a function or method.\n        FunctionMethodName = 9,\n\n        //! An operator.\n        Operator = 10,\n\n        //! An identifier\n        Identifier = 11,\n\n        //! A regular expression.\n        Regex = 12,\n\n        //! A global.\n        Global = 13,\n\n        //! A symbol.\n        Symbol = 14,\n\n        //! The name of a module.\n        ModuleName = 15,\n\n        //! An instance variable.\n        InstanceVariable = 16,\n\n        //! A class variable.\n        ClassVariable = 17,\n\n        //! Backticks.\n        Backticks = 18,\n\n        //! A data section.\n        DataSection = 19,\n\n        //! A here document delimiter.\n        HereDocumentDelimiter = 20,\n\n        //! A here document.\n        HereDocument = 21,\n\n        //! A %q string.\n        PercentStringq = 24,\n\n        //! A %Q string.\n        PercentStringQ = 25,\n\n        //! A %x string.\n        PercentStringx = 26,\n\n        //! A %r string.\n        PercentStringr = 27,\n\n        //! A %w string.\n        PercentStringw = 28,\n\n        //! A demoted keyword.\n        DemotedKeyword = 29,\n\n        //! stdin.\n        Stdin = 30,\n\n        //! stdout.\n        Stdout = 31,\n\n        //! stderr.\n        Stderr = 40\n    };\n\n    //! Construct a QsciLexerRuby with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerRuby(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerRuby instance.\n    virtual ~QsciLexerRuby();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the end of a block for\n    //! auto-indentation.  The style is returned via \\a style.\n    const char *blockEnd(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of keywords in a\n    //! particular style that define the start of a block for\n    //! auto-indentation.  The style is returned via \\a style.\n    const char *blockStartKeyword(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultpaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the style\n    //! is invalid for this language then an empty QString is returned.  This\n    //! is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    void setFoldComments(bool fold);\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const {return fold_comments;}\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    void setFoldCompact(bool fold);\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const {return fold_compact;}\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs, const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n\n    bool fold_comments;\n    bool fold_compact;\n\n    QsciLexerRuby(const QsciLexerRuby &);\n    QsciLexerRuby &operator=(const QsciLexerRuby &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerspice.h",
    "content": "// This defines the interface to the QsciLexerSpice class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERSPICE_H\n#define QSCILEXERSPICE_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerSpice class encapsulates the Scintilla Spice lexer.\nclass QSCINTILLA_EXPORT QsciLexerSpice : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Spice lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! An identifier.\n        Identifier = 1,\n\n        //! A command.\n        Command = 2,\n\n        //! A function.\n        Function = 3,\n\n        //! A parameter.\n        Parameter = 4,\n\n        //! A number.\n        Number = 5,\n\n        //! A delimiter.\n        Delimiter = 6,\n\n        //! A value.\n        Value = 7,\n\n        //! A comment.\n        Comment = 8\n    };\n\n    //! Construct a QsciLexerSpice with parent \\a parent and name \\a name.\n    //! \\a parent is typically the QsciScintilla instance.\n    QsciLexerSpice(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerSpice instance.\n    virtual ~QsciLexerSpice();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\nprivate:\n    QsciLexerSpice(const QsciLexerSpice &);\n    QsciLexerSpice &operator=(const QsciLexerSpice &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexersql.h",
    "content": "// This defines the interface to the QsciLexerSQL class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERSQL_H\n#define QSCILEXERSQL_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerSQL class encapsulates the Scintilla SQL lexer.\nclass QSCINTILLA_EXPORT QsciLexerSQL : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! SQL lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A line comment.\n        CommentLine = 2,\n\n        //! A JavaDoc/Doxygen style comment.\n        CommentDoc = 3,\n\n        //! A number.\n        Number = 4,\n\n        //! A keyword.\n        Keyword = 5,\n\n        //! A double-quoted string.\n        DoubleQuotedString = 6,\n\n        //! A single-quoted string.\n        SingleQuotedString = 7,\n\n        //! An SQL*Plus keyword.\n        PlusKeyword = 8,\n\n        //! An SQL*Plus prompt.\n        PlusPrompt = 9,\n\n        //! An operator.\n        Operator = 10,\n\n        //! An identifier\n        Identifier = 11,\n\n        //! An SQL*Plus comment.\n        PlusComment = 13,\n\n        //! A '#' line comment.\n        CommentLineHash = 15,\n\n        //! A JavaDoc/Doxygen keyword.\n        CommentDocKeyword = 17,\n\n        //! A JavaDoc/Doxygen keyword error.\n        CommentDocKeywordError = 18,\n\n        //! A keyword defined in keyword set number 5.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        //! Note that keywords must be defined using lower case.\n        KeywordSet5 = 19,\n\n        //! A keyword defined in keyword set number 6.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        //! Note that keywords must be defined using lower case.\n        KeywordSet6 = 20,\n\n        //! A keyword defined in keyword set number 7.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        //! Note that keywords must be defined using lower case.\n        KeywordSet7 = 21,\n\n        //! A keyword defined in keyword set number 8.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        //! Note that keywords must be defined using lower case.\n        KeywordSet8 = 22,\n\n        //! A quoted identifier.\n        QuotedIdentifier = 23\n    };\n\n    //! Construct a QsciLexerSQL with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerSQL(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerSQL instance.\n    virtual ~QsciLexerSQL();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised by\n    //! the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the style\n    //! is invalid for this language then an empty QString is returned.  This\n    //! is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if backslash escapes are enabled.\n    //!\n    //! \\sa setBackslashEscapes()\n    bool backslashEscapes() const {return backslash_escapes;}\n\n    //! If \\a enable is true then words may contain dots (i.e. periods or full\n    //! stops).  The default is false.\n    //!\n    //! \\sa dottedWords()\n    void setDottedWords(bool enable);\n\n    //! Returns true if words may contain dots (i.e. periods or full stops).\n    //!\n    //! \\sa setDottedWords()\n    bool dottedWords() const {return allow_dotted_word;}\n\n    //! If \\a fold is true then ELSE blocks can be folded.  The default is\n    //! false.\n    //!\n    //! \\sa foldAtElse()\n    void setFoldAtElse(bool fold);\n\n    //! Returns true if ELSE blocks can be folded.\n    //!\n    //! \\sa setFoldAtElse()\n    bool foldAtElse() const {return at_else;}\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const {return fold_comments;}\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const {return fold_compact;}\n\n    //! If \\a fold is true then only BEGIN blocks can be folded.  The default\n    //! is false.\n    //!\n    //! \\sa foldOnlyBegin()\n    void setFoldOnlyBegin(bool fold);\n\n    //! Returns true if BEGIN blocks only can be folded.\n    //!\n    //! \\sa setFoldOnlyBegin()\n    bool foldOnlyBegin() const {return only_begin;}\n\n    //! If \\a enable is true then '#' is used as a comment character.  It is\n    //! typically enabled for MySQL and disabled for Oracle.  The default is\n    //! false.\n    //!\n    //! \\sa hashComments()\n    void setHashComments(bool enable);\n\n    //! Returns true if '#' is used as a comment character.\n    //!\n    //! \\sa setHashComments()\n    bool hashComments() const {return numbersign_comment;}\n\n    //! If \\a enable is true then quoted identifiers are enabled.  The default\n    //! is false.\n    //!\n    //! \\sa quotedIdentifiers()\n    void setQuotedIdentifiers(bool enable);\n\n    //! Returns true if quoted identifiers are enabled.\n    //!\n    //! \\sa setQuotedIdentifiers()\n    bool quotedIdentifiers() const {return backticks_identifier;}\n\npublic slots:\n    //! If \\a enable is true then backslash escapes are enabled.  The\n    //! default is false.\n    //!\n    //! \\sa backslashEscapes()\n    virtual void setBackslashEscapes(bool enable);\n\n    //! If \\a fold is true then multi-line comment blocks can be folded.  The\n    //! default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs, const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    void setAtElseProp();\n    void setCommentProp();\n    void setCompactProp();\n    void setOnlyBeginProp();\n    void setBackticksIdentifierProp();\n    void setNumbersignCommentProp();\n    void setBackslashEscapesProp();\n    void setAllowDottedWordProp();\n\n    bool at_else;\n    bool fold_comments;\n    bool fold_compact;\n    bool only_begin;\n    bool backticks_identifier;\n    bool numbersign_comment;\n    bool backslash_escapes;\n    bool allow_dotted_word;\n\n    QsciLexerSQL(const QsciLexerSQL &);\n    QsciLexerSQL &operator=(const QsciLexerSQL &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexertcl.h",
    "content": "// This defines the interface to the QsciLexerTCL class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERTCL_H\n#define QSCILEXERTCL_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerTCL class encapsulates the Scintilla TCL lexer.\nclass QSCINTILLA_EXPORT QsciLexerTCL : public QsciLexer\n{\n\tQ_OBJECT\n\npublic:\n\t//! This enum defines the meanings of the different styles used by the TCL\n\t//! lexer.\n\tenum {\n\t\t//! The default.\n\t\tDefault = 0,\n\n\t\t//! A comment.\n\t\tComment = 1,\n\n\t\t//! A comment line.\n\t\tCommentLine = 2,\n\n\t\t//! A number.\n\t\tNumber = 3,\n\n\t\t//! A quoted keyword.\n\t\tQuotedKeyword = 4,\n\n\t\t//! A quoted string.\n\t\tQuotedString = 5,\n\n\t\t//! An operator.\n\t\tOperator = 6,\n\n\t\t//! An identifier\n\t\tIdentifier = 7,\n\n\t\t//! A substitution.\n\t\tSubstitution = 8,\n\n\t\t//! A substitution starting with a brace.\n\t\tSubstitutionBrace = 9,\n\n\t\t//! A modifier.\n\t\tModifier = 10,\n\n\t\t//! Expand keyword (defined in keyword set number 5).\n\t\tExpandKeyword = 11,\n\n        //! A TCL keyword (defined in keyword set number 1).\n        TCLKeyword = 12,\n\n        //! A Tk keyword (defined in keyword set number 2).\n        TkKeyword = 13,\n\n        //! An iTCL keyword (defined in keyword set number 3).\n        ITCLKeyword = 14,\n\n        //! A Tk command (defined in keyword set number 4).\n        TkCommand = 15,\n\n        //! A keyword defined in keyword set number 6.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet6 = 16,\n\n        //! A keyword defined in keyword set number 7.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet7 = 17,\n\n        //! A keyword defined in keyword set number 8.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet8 = 18,\n\n        //! A keyword defined in keyword set number 9.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet9 = 19,\n\n        //! A comment box.\n        CommentBox = 20,\n\n        //! A comment block.\n        CommentBlock = 21\n\t};\n\n\t//! Construct a QsciLexerTCL with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n\tQsciLexerTCL(QObject *parent = 0, const char *name = 0);\n\n\t//! Destroys the QsciLexerTCL instance.\n\tvirtual ~QsciLexerTCL();\n\n\t//! Returns the name of the language.\n\tconst char *language() const;\n\n\t//! Returns the name of the lexer.  Some lexers support a number of\n\t//! languages.\n\tconst char *lexer() const;\n\n\t//! \\internal Returns the style used for braces for brace matching.\n\tint braceStyle() const;\n\n\t//! Returns the foreground colour of the text for style number \\a style.\n\t//!\n\t//! \\sa defaultPaper()\n\tQColor defaultColor(int style) const;\n\n\t//! Returns the end-of-line fill for style number \\a style.\n\tbool defaultEolFill(int style) const;\n\n\t//! Returns the font for style number \\a style.\n\tQFont defaultFont(int style) const;\n\n\t//! Returns the background colour of the text for style number \\a style.\n\t//!\n\t//! \\sa defaultColor()\n\tQColor defaultPaper(int style) const;\n\n\t//! Returns the set of keywords for the keyword set \\a set recognised\n\t//! by the lexer as a space separated string.\n\tconst char *keywords(int set) const;\n\n\t//! Returns the descriptive name for style number \\a style.  If the style\n\t//! is invalid for this language then an empty QString is returned.  This\n\t//! is intended to be used in user preference dialogs.\n\tQString description(int style) const;\n\n\t//! Causes all properties to be refreshed by emitting the\n\t//! propertyChanged() signal as required.\n\tvoid refreshProperties();\n\n\t//! If \\a fold is true then multi-line comment blocks can be folded.  The\n    //! default is false.\n\t//!\n\t//! \\sa foldComments()\n\tvoid setFoldComments(bool fold);\n\n    //! Returns true if multi-line comment blocks can be folded.\n\t//!\n\t//! \\sa setFoldComments()\n\tbool foldComments() const {return fold_comments;}\n\nprotected:\n\t//! The lexer's properties are read from the settings \\a qs.  \\a prefix\n\t//! (which has a trailing '/') should be used as a prefix to the key of\n\t//! each setting.  true is returned if there is no error.\n\t//!\n\tbool readProperties(QSettings &qs,const QString &prefix);\n\n\t//! The lexer's properties are written to the settings \\a qs.\n\t//! \\a prefix (which has a trailing '/') should be used as a prefix to\n\t//! the key of each setting.  true is returned if there is no error.\n\t//!\n\tbool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n\tvoid setCommentProp();\n\n\tbool fold_comments;\n\n\tQsciLexerTCL(const QsciLexerTCL &);\n\tQsciLexerTCL &operator=(const QsciLexerTCL &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexertex.h",
    "content": "// This defines the interface to the QsciLexerTeX class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERTEX_H\n#define QSCILEXERTEX_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerTeX class encapsulates the Scintilla TeX lexer.\nclass QSCINTILLA_EXPORT QsciLexerTeX : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! TeX lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A special.\n        Special = 1,\n\n        //! A group.\n        Group = 2,\n\n        //! A symbol.\n        Symbol = 3,\n\n        //! A command.\n        Command = 4,\n\n        //! Text.\n        Text = 5\n    };\n\n    //! Construct a QsciLexerTeX with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerTeX(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerTeX instance.\n    virtual ~QsciLexerTeX();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    QColor defaultColor(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! If \\a fold is true then multi-line comment blocks can be folded.  The\n    //! default is false.\n    //!\n    //! \\sa foldComments()\n    void setFoldComments(bool fold);\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const {return fold_comments;}\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    void setFoldCompact(bool fold);\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const {return fold_compact;}\n\n    //! If \\a enable is true then comments are processed as TeX source\n    //! otherwise they are ignored.  The default is false.\n    //!\n    //! \\sa processComments()\n    void setProcessComments(bool enable);\n\n    //! Returns true if comments are processed as TeX source.\n    //!\n    //! \\sa setProcessComments()\n    bool processComments() const {return process_comments;}\n\n    //! If \\a enable is true then \\\\if<unknown> processed is processed as a\n    //! command.  The default is true.\n    //!\n    //! \\sa processIf()\n    void setProcessIf(bool enable);\n\n    //! Returns true if \\\\if<unknown> is processed as a command.\n    //!\n    //! \\sa setProcessIf()\n    bool processIf() const {return process_if;}\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs, const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n    void setProcessCommentsProp();\n    void setAutoIfProp();\n\n    bool fold_comments;\n    bool fold_compact;\n    bool process_comments;\n    bool process_if;\n\n    QsciLexerTeX(const QsciLexerTeX &);\n    QsciLexerTeX &operator=(const QsciLexerTeX &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerverilog.h",
    "content": "// This defines the interface to the QsciLexerVerilog class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERVERILOG_H\n#define QSCILEXERVERILOG_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerVerilog class encapsulates the Scintilla Verilog\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerVerilog : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Verilog lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A line comment.\n        CommentLine = 2,\n\n        //! A bang comment.\n        CommentBang = 3,\n\n        //! A number\n        Number = 4,\n\n        //! A keyword.\n        Keyword = 5,\n\n        //! A string.\n        String = 6,\n\n        //! A keyword defined in keyword set number 2.  The class must\n        //! be sub-classed and re-implement keywords() to make use of\n        //! this style.\n        KeywordSet2 = 7,\n\n        //! A system task.\n        SystemTask = 8,\n\n        //! A pre-processor block.\n        Preprocessor = 9,\n\n        //! An operator.\n        Operator = 10,\n\n        //! An identifier.\n        Identifier = 11,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 12,\n\n        //! A keyword defined in keyword set number 4.  The class must\n        //! be sub-classed and re-implement keywords() to make use of\n        //! this style.  This set is intended to be used for user defined\n        //! identifiers and tasks.\n        UserKeywordSet = 19\n    };\n\n    //! Construct a QsciLexerVerilog with parent \\a parent and name \\a name.\n    //! \\a parent is typically the QsciScintilla instance.\n    QsciLexerVerilog(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerVerilog instance.\n    virtual ~QsciLexerVerilog();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! If \\a fold is true then \"} else {\" lines can be folded.  The\n    //! default is false.\n    //!\n    //! \\sa foldAtElse()\n    void setFoldAtElse(bool fold);\n\n    //! Returns true if \"} else {\" lines can be folded.\n    //!\n    //! \\sa setFoldAtElse()\n    bool foldAtElse() const;\n\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    void setFoldComments(bool fold);\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    void setFoldCompact(bool fold);\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\n    //! If \\a fold is true then preprocessor blocks can be folded.  The\n    //! default is true.\n    //!\n    //! \\sa foldPreprocessor()\n    void setFoldPreprocessor(bool fold);\n\n    //! Returns true if preprocessor blocks can be folded.\n    //!\n    //! \\sa setFoldPreprocessor()\n    bool foldPreprocessor() const;\n\n    //! If \\a fold is true then modules can be folded.  The default is false.\n    //!\n    //! \\sa foldAtModule()\n    void setFoldAtModule(bool fold);\n\n    //! Returns true if modules can be folded.\n    //!\n    //! \\sa setFoldAtModule()\n    bool foldAtModule() const;\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    //! \\sa writeProperties()\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    //! \\sa readProperties()\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setAtElseProp();\n    void setCommentProp();\n    void setCompactProp();\n    void setPreprocProp();\n    void setAtModuleProp();\n\n    bool fold_atelse;\n    bool fold_comments;\n    bool fold_compact;\n    bool fold_preproc;\n    bool fold_atmodule;\n\n    QsciLexerVerilog(const QsciLexerVerilog &);\n    QsciLexerVerilog &operator=(const QsciLexerVerilog &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexervhdl.h",
    "content": "// This defines the interface to the QsciLexerVHDL class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERVHDL_H\n#define QSCILEXERVHDL_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerVHDL class encapsulates the Scintilla VHDL lexer.\nclass QSCINTILLA_EXPORT QsciLexerVHDL : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! VHDL lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A comment line.\n        CommentLine = 2,\n\n        //! A number.\n        Number = 3,\n\n        //! A string.\n        String = 4,\n\n        //! An operator.\n        Operator = 5,\n\n        //! An identifier\n        Identifier = 6,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 7,\n\n        //! A keyword.\n        Keyword = 8,\n\n        //! A standard operator.\n        StandardOperator = 9,\n\n        //! An attribute.\n        Attribute = 10,\n\n        //! A standard function.\n        StandardFunction = 11,\n\n        //! A standard package.\n        StandardPackage = 12,\n\n        //! A standard type.\n        StandardType = 13,\n\n        //! A keyword defined in keyword set number 7.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet7 = 14\n    };\n\n    //! Construct a QsciLexerVHDL with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerVHDL(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerVHDL instance.\n    virtual ~QsciLexerVHDL();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the propertyChanged()\n    //! signal as required.\n    void refreshProperties();\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\n    //! Returns true if else blocks can be folded.\n    //!\n    //! \\sa setFoldAtElse()\n    bool foldAtElse() const;\n\n    //! Returns true if begin blocks can be folded.\n    //!\n    //! \\sa setFoldAtBegin()\n    bool foldAtBegin() const;\n\n    //! Returns true if blocks can be folded at a parenthesis.\n    //!\n    //! \\sa setFoldAtParenthesis()\n    bool foldAtParenthesis() const;\n\npublic slots:\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is true.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\n    //! If \\a fold is true then else blocks can be folded.  The default is\n    //! true.\n    //!\n    //! \\sa foldAtElse()\n    virtual void setFoldAtElse(bool fold);\n\n    //! If \\a fold is true then begin blocks can be folded.  The default is\n    //! true.\n    //!\n    //! \\sa foldAtBegin()\n    virtual void setFoldAtBegin(bool fold);\n\n    //! If \\a fold is true then blocks can be folded at a parenthesis.  The\n    //! default is true.\n    //!\n    //! \\sa foldAtParenthesis()\n    virtual void setFoldAtParenthesis(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n    void setAtElseProp();\n    void setAtBeginProp();\n    void setAtParenthProp();\n\n    bool fold_comments;\n    bool fold_compact;\n    bool fold_atelse;\n    bool fold_atbegin;\n    bool fold_atparenth;\n\n    QsciLexerVHDL(const QsciLexerVHDL &);\n    QsciLexerVHDL &operator=(const QsciLexerVHDL &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexerxml.h",
    "content": "// This defines the interface to the QsciLexerXML class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERXML_H\n#define QSCILEXERXML_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexerhtml.h>\n\n\n//! \\brief The QsciLexerXML class encapsulates the Scintilla XML lexer.\nclass QSCINTILLA_EXPORT QsciLexerXML : public QsciLexerHTML\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexerXML with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerXML(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerXML instance.\n    virtual ~QsciLexerXML();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! If \\a allowed is true then scripts are styled.  The default is true.\n    //!\n    //! \\sa scriptsStyled()\n    void setScriptsStyled(bool styled);\n\n    //! Returns true if scripts are styled.\n    //!\n    //! \\sa setScriptsStyled()\n    bool scriptsStyled() const;\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs, const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    void setScriptsProp();\n\n    bool scripts;\n\n    QsciLexerXML(const QsciLexerXML &);\n    QsciLexerXML &operator=(const QsciLexerXML &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscilexeryaml.h",
    "content": "// This defines the interface to the QsciLexerYAML class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERYAML_H\n#define QSCILEXERYAML_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerYAML class encapsulates the Scintilla YAML lexer.\nclass QSCINTILLA_EXPORT QsciLexerYAML : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! YAML lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! An identifier.\n        Identifier = 2,\n\n        //! A keyword\n        Keyword = 3,\n\n        //! A number.\n        Number = 4,\n\n        //! A reference.\n        Reference = 5,\n\n        //! A document delimiter.\n        DocumentDelimiter = 6,\n\n        //! A text block marker.\n        TextBlockMarker = 7,\n\n        //! A syntax error marker.\n        SyntaxErrorMarker = 8,\n\n        //! An operator.\n        Operator = 9\n    };\n\n    //! Construct a QsciLexerYAML with parent \\a parent and name \\a name.  \\a\n    //! parent is typically the QsciScintilla instance.\n    QsciLexerYAML(QObject *parent = 0, const char *name = 0);\n\n    //! Destroys the QsciLexerYAML instance.\n    virtual ~QsciLexerYAML();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the propertyChanged()\n    //! signal as required.\n    void refreshProperties();\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\npublic slots:\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n\n    bool fold_comments;\n\n    QsciLexerYAML(const QsciLexerYAML &);\n    QsciLexerYAML &operator=(const QsciLexerYAML &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscimacro.h",
    "content": "// This defines the interface to the QsciMacro class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCIMACRO_H\n#define QSCIMACRO_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n#include <qstring.h>\n\n#include <qvaluelist.h>\n\n#include <Qsci/qsciglobal.h>\n\n\nclass QsciScintilla;\n\n\n//! \\brief The QsciMacro class represents a sequence of recordable editor\n//! commands.\n//!\n//! Methods are provided to convert convert a macro to and from a textual\n//! representation so that they can be easily written to and read from\n//! permanent storage.\nclass QSCINTILLA_EXPORT QsciMacro : public QObject\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciMacro with parent \\a parent and name \\a name.\n    QsciMacro(QsciScintilla *parent, const char *name = 0);\n\n    //! Construct a QsciMacro from the printable ASCII representation \\a asc,\n    //! with parent \\a parent and name \\a name.\n    QsciMacro(const QString &asc, QsciScintilla *parent, const char *name = 0);\n\n    //! Destroy the QsciMacro instance.\n    virtual ~QsciMacro();\n\n    //! Clear the contents of the macro.\n    void clear();\n\n    //! Load the macro from the printable ASCII representation \\a asc.  Returns\n    //! true if there was no error.\n    //!\n    //! \\sa save()\n    bool load(const QString &asc);\n\n    //! Return a printable ASCII representation of the macro.  It is guaranteed\n    //! that only printable ASCII characters are used and that double quote\n    //! characters will not be used.\n    //!\n    //! \\sa load()\n    QString save() const;\n\npublic slots:\n    //! Play the macro.\n    virtual void play();\n\n    //! Start recording user commands and add them to the macro.\n    virtual void startRecording();\n\n    //! Stop recording user commands.\n    virtual void endRecording();\n\nprivate slots:\n    void record(unsigned int msg, unsigned long wParam, void *lParam);\n\nprivate:\n    struct Macro {\n        unsigned int msg;\n        unsigned long wParam;\n        QCString text;\n    };\n\n    QsciScintilla *qsci;\n    QValueList<Macro> macro;\n\n    QsciMacro(const QsciMacro &);\n    QsciMacro &operator=(const QsciMacro &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qsciprinter.h",
    "content": "// This module defines interface to the QsciPrinter class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCIPRINTER_H\n#define QSCIPRINTER_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n// This is needed for Qt v5.0.0-alpha.\n#if defined(B0)\n#undef B0\n#endif\n\n#include <qprinter.h>\n\n#if !defined(QT_NO_PRINTER)\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qsciscintilla.h>\n\n\nQT_BEGIN_NAMESPACE\nclass QRect;\nclass QPainter;\nQT_END_NAMESPACE\n\nclass QsciScintillaBase;\n\n\n//! \\brief The QsciPrinter class is a sub-class of the Qt QPrinter class that\n//! is able to print the text of a Scintilla document.\n//!\n//! The class can be further sub-classed to alter to layout of the text, adding\n//! headers and footers for example.\nclass QSCINTILLA_EXPORT QsciPrinter : public QPrinter\n{\npublic:\n    //! Constructs a printer paint device with mode \\a mode.\n    QsciPrinter(PrinterMode mode = ScreenResolution);\n\n    //! Destroys the QsciPrinter instance.\n    virtual ~QsciPrinter();\n\n    //! Format a page, by adding headers and footers for example, before the\n    //! document text is drawn on it.  \\a painter is the painter to be used to\n    //! add customised text and graphics.  \\a drawing is true if the page is\n    //! actually being drawn rather than being sized.  \\a painter drawing\n    //! methods must only be called when \\a drawing is true.  \\a area is the\n    //! area of the page that will be used to draw the text.  This should be\n    //! modified if it is necessary to reserve space for any customised text or\n    //! graphics.  By default the area is relative to the printable area of the\n    //! page.  Use QPrinter::setFullPage() because calling printRange() if you\n    //! want to try and print over the whole page.  \\a pagenr is the number of\n    //! the page.  The first page is numbered 1.\n    virtual void formatPage(QPainter &painter, bool drawing, QRect &area,\n            int pagenr);\n\n    //! Return the number of points to add to each font when printing.\n    //!\n    //! \\sa setMagnification()\n    int magnification() const {return mag;}\n\n    //! Sets the number of points to add to each font when printing to \\a\n    //! magnification.\n    //!\n    //! \\sa magnification()\n    virtual void setMagnification(int magnification);\n\n    //! Print a range of lines from the Scintilla instance \\a qsb.  \\a from is\n    //! the first line to print and a negative value signifies the first line\n    //! of text.  \\a to is the last line to print and a negative value\n    //! signifies the last line of text.  true is returned if there was no\n    //! error.\n    virtual int printRange(QsciScintillaBase *qsb, int from = -1, int to = -1);\n\n    //! Return the line wrap mode used when printing.  The default is\n    //! QsciScintilla::WrapWord.\n    //!\n    //! \\sa setWrapMode()\n    QsciScintilla::WrapMode wrapMode() const {return wrap;}\n\n    //! Sets the line wrap mode used when printing to \\a wmode.\n    //!\n    //! \\sa wrapMode()\n    virtual void setWrapMode(QsciScintilla::WrapMode wmode);\n\nprivate:\n    int mag;\n    QsciScintilla::WrapMode wrap;\n\n    QsciPrinter(const QsciPrinter &);\n    QsciPrinter &operator=(const QsciPrinter &);\n};\n\n#endif\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qsciscintilla.h",
    "content": "// This module defines the \"official\" high-level API of the Qt port of\n// Scintilla.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCISCINTILLA_H\n#define QSCISCINTILLA_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n#include <qstringlist.h>\n\n#include <qguardedptr.h>\n#include <qvaluelist.h>\n#include <qcstring.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscicommand.h>\n#include <Qsci/qscidocument.h>\n#include <Qsci/qsciscintillabase.h>\n\n\nQT_BEGIN_NAMESPACE\nclass QAction;\nclass QImage;\nclass QIODevice;\nclass QMenu;\nclass QPoint;\nQT_END_NAMESPACE\n\nclass QsciCommandSet;\nclass QsciLexer;\nclass QsciStyle;\nclass QsciStyledText;\nclass QsciListBoxQt;\n\n\n//! \\brief The QsciScintilla class implements a higher level, more Qt-like,\n//! API to the Scintilla editor widget.\n//!\n//! QsciScintilla implements methods, signals and slots similar to those found\n//! in other Qt editor classes. It also provides a higher level interface to\n//! features specific to Scintilla such as syntax styling, call tips,\n//! auto-indenting and auto-completion than that provided by QsciScintillaBase.\nclass QSCINTILLA_EXPORT QsciScintilla : public QsciScintillaBase\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the different auto-indentation styles.\n    enum {\n        //! A line is automatically indented to match the previous line.\n        AiMaintain = 0x01,\n\n        //! If the language supported by the current lexer has a specific start\n        //! of block character (e.g. { in C++), then a line that begins with\n        //! that character is indented as well as the lines that make up the\n        //! block.  It may be logically ored with AiClosing.\n        AiOpening = 0x02,\n\n        //! If the language supported by the current lexer has a specific end\n        //! of block character (e.g. } in C++), then a line that begins with\n        //! that character is indented as well as the lines that make up the\n        //! block.  It may be logically ored with AiOpening.\n        AiClosing = 0x04\n    };\n\n    //! This enum defines the different annotation display styles.\n    enum AnnotationDisplay {\n        //! Annotations are not displayed.\n        AnnotationHidden = ANNOTATION_HIDDEN,\n\n        //! Annotations are drawn left justified with no adornment.\n        AnnotationStandard = ANNOTATION_STANDARD,\n\n        //! Annotations are surrounded by a box.\n        AnnotationBoxed = ANNOTATION_BOXED\n    };\n\n    //! This enum defines the behavior if an auto-completion list contains a\n    //! single entry.\n    enum AutoCompletionUseSingle {\n        //! The single entry is not used automatically and the auto-completion\n        //! list is displayed.\n        AcusNever,\n\n        //! The single entry is used automatically when auto-completion is\n        //! explicitly requested (using autoCompleteFromAPIs() or\n        //! autoCompleteFromDocument()) but not when auto-completion is\n        //! triggered as the user types.\n        AcusExplicit,\n\n        //! The single entry is used automatically and the auto-completion list\n        //! is not displayed.\n        AcusAlways\n    };\n\n    //! This enum defines the different sources for auto-completion lists.\n    enum AutoCompletionSource {\n        //! No sources are used, ie. automatic auto-completion is disabled.\n        AcsNone,\n\n        //! The source is all available sources.\n        AcsAll,\n\n        //! The source is the current document.\n        AcsDocument,\n\n        //! The source is any installed APIs.\n        AcsAPIs\n    };\n\n    //! This enum defines the different brace matching modes.  The character\n    //! pairs {}, [] and () are treated as braces.  The Python lexer will also\n    //! match a : with the end of the corresponding indented block.\n    enum BraceMatch {\n        //! Brace matching is disabled.\n        NoBraceMatch,\n\n        //! Brace matching is enabled for a brace immediately before the\n        //! current position.\n        StrictBraceMatch,\n\n        //! Brace matching is enabled for a brace immediately before or after\n        //! the current position.\n        SloppyBraceMatch\n    };\n\n    //! This enum defines the different call tip positions.\n    enum CallTipsPosition {\n        //! Call tips are placed below the text.\n        CallTipsBelowText,\n\n        //! Call tips are placed above the text.\n        CallTipsAboveText,\n    };\n\n    //! This enum defines the different call tip styles.\n    enum CallTipsStyle {\n        //! Call tips are disabled.\n        CallTipsNone,\n\n        //! Call tips are displayed without a context.  A context is any scope\n        //! (e.g. a C++ namespace or a Python module) prior to the function\n        //! name.\n        CallTipsNoContext,\n\n        //! Call tips are displayed with a context only if the user hasn't\n        //! already implicitly identified the context using autocompletion.\n        //! Note that this style may not always be able to align the call tip\n        //! with the text being entered.\n        CallTipsNoAutoCompletionContext,\n\n        //! Call tips are displayed with a context.  Note that this style\n        //! may not always be able to align the call tip with the text being\n        //! entered.\n        CallTipsContext\n    };\n\n    //! This enum defines the different edge modes for long lines.\n    enum EdgeMode {\n        //! Long lines are not marked.\n        EdgeNone = EDGE_NONE,\n\n        //! A vertical line is drawn at the column set by setEdgeColumn().\n        //! This is recommended for monospace fonts.\n        EdgeLine = EDGE_LINE,\n\n        //! The background color of characters after the column limit is\n        //! changed to the color set by setEdgeColor().  This is recommended\n        //! for proportional fonts.\n        EdgeBackground = EDGE_BACKGROUND\n    };\n\n    //! This enum defines the different end-of-line modes.\n    enum EolMode {\n        //! A carriage return/line feed as used on Windows systems.\n        EolWindows = SC_EOL_CRLF,\n\n        //! A line feed as used on Unix systems, including OS/X.\n        EolUnix = SC_EOL_LF,\n\n        //! A carriage return as used on Mac systems prior to OS/X.\n        EolMac = SC_EOL_CR\n    };\n\n    //! This enum defines the different styles for the folding margin.\n    enum FoldStyle {\n        //! Folding is disabled.\n        NoFoldStyle,\n\n        //! Plain folding style using plus and minus symbols.\n        PlainFoldStyle,\n\n        //! Circled folding style using circled plus and minus symbols.\n        CircledFoldStyle,\n\n        //! Boxed folding style using boxed plus and minus symbols.\n        BoxedFoldStyle,\n\n        //! Circled tree style using a flattened tree with circled plus and\n        //! minus symbols and rounded corners.\n        CircledTreeFoldStyle,\n\n        //! Boxed tree style using a flattened tree with boxed plus and minus\n        //! symbols and right-angled corners.\n        BoxedTreeFoldStyle\n    };\n\n    //! This enum defines the different indicator styles.\n    enum IndicatorStyle {\n        //! A single straight underline.\n        PlainIndicator = INDIC_PLAIN,\n\n        //! A squiggly underline that requires 3 pixels of descender space.\n        SquiggleIndicator = INDIC_SQUIGGLE,\n\n        //! A line of small T shapes.\n        TTIndicator = INDIC_TT,\n\n        //! Diagonal hatching.\n        DiagonalIndicator = INDIC_DIAGONAL,\n\n        //! Strike out.\n        StrikeIndicator = INDIC_STRIKE,\n\n        //! An indicator with no visual appearence.\n        HiddenIndicator = INDIC_HIDDEN,\n\n        //! A rectangle around the text.\n        BoxIndicator = INDIC_BOX,\n\n        //! A rectangle with rounded corners around the text with the interior\n        //! usually more transparent than the border.\n        RoundBoxIndicator = INDIC_ROUNDBOX,\n\n        //! A rectangle around the text with the interior usually more\n        //! transparent than the border.\n        StraightBoxIndicator = INDIC_STRAIGHTBOX,\n\n        //! A dashed underline.\n        DashesIndicator = INDIC_DASH,\n\n        //! A dotted underline.\n        DotsIndicator = INDIC_DOTS,\n\n        //! A squiggly underline that requires 2 pixels of descender space and\n        //! so will fit under smaller fonts.\n        SquiggleLowIndicator = INDIC_SQUIGGLELOW,\n\n        //! A dotted rectangle around the text with the interior usually more\n        //! transparent than the border.\n        DotBoxIndicator = INDIC_DOTBOX,\n\n        //! A version of SquiggleIndicator that uses a pixmap.  This is quicker\n        //! but may be of lower quality.\n        SquigglePixmapIndicator = INDIC_SQUIGGLEPIXMAP,\n\n        //! A thick underline typically used during Asian language input\n        //! composition.\n        ThickCompositionIndicator = INDIC_COMPOSITIONTHICK,\n    };\n\n    //! This enum defines the different margin options.\n    enum {\n        //! Reset all margin options.\n        MoNone = SC_MARGINOPTION_NONE,\n\n        //! If this is set then only the first sub-line of a wrapped line will\n        //! be selected when clicking on a margin.\n        MoSublineSelect = SC_MARGINOPTION_SUBLINESELECT\n    };\n\n    //! This enum defines the different margin types.\n    enum MarginType {\n        //! The margin contains symbols, including those used for folding.\n        SymbolMargin = SC_MARGIN_SYMBOL,\n\n        //! The margin contains symbols and uses the default foreground color\n        //! as its background color.\n        SymbolMarginDefaultForegroundColor = SC_MARGIN_FORE,\n\n        //! The margin contains symbols and uses the default background color\n        //! as its background color.\n        SymbolMarginDefaultBackgroundColor = SC_MARGIN_BACK,\n\n        //! The margin contains line numbers.\n        NumberMargin = SC_MARGIN_NUMBER,\n\n        //! The margin contains styled text.\n        TextMargin = SC_MARGIN_TEXT,\n\n        //! The margin contains right justified styled text.\n        TextMarginRightJustified = SC_MARGIN_RTEXT\n    };\n\n    //! This enum defines the different pre-defined marker symbols.\n    enum MarkerSymbol {\n        //! A circle.\n        Circle = SC_MARK_CIRCLE,\n\n        //! A rectangle.\n        Rectangle = SC_MARK_ROUNDRECT,\n\n        //! A triangle pointing to the right.\n        RightTriangle = SC_MARK_ARROW,\n\n        //! A smaller rectangle.\n        SmallRectangle = SC_MARK_SMALLRECT,\n\n        //! An arrow pointing to the right.\n        RightArrow = SC_MARK_SHORTARROW,\n\n        //! An invisible marker that allows code to track the movement\n        //! of lines.\n        Invisible = SC_MARK_EMPTY,\n\n        //! A triangle pointing down.\n        DownTriangle = SC_MARK_ARROWDOWN,\n\n        //! A drawn minus sign.\n        Minus = SC_MARK_MINUS,\n\n        //! A drawn plus sign.\n        Plus = SC_MARK_PLUS,\n\n        //! A vertical line drawn in the background colour.\n        VerticalLine = SC_MARK_VLINE,\n\n        //! A bottom left corner drawn in the background colour.\n        BottomLeftCorner = SC_MARK_LCORNER,\n\n        //! A vertical line with a centre right horizontal line drawn\n        //! in the background colour.\n        LeftSideSplitter = SC_MARK_TCORNER,\n\n        //! A drawn plus sign in a box.\n        BoxedPlus = SC_MARK_BOXPLUS,\n\n        //! A drawn plus sign in a connected box.\n        BoxedPlusConnected = SC_MARK_BOXPLUSCONNECTED,\n\n        //! A drawn minus sign in a box.\n        BoxedMinus = SC_MARK_BOXMINUS,\n\n        //! A drawn minus sign in a connected box.\n        BoxedMinusConnected = SC_MARK_BOXMINUSCONNECTED,\n\n        //! A rounded bottom left corner drawn in the background\n        //! colour.\n        RoundedBottomLeftCorner = SC_MARK_LCORNERCURVE,\n\n        //! A vertical line with a centre right curved line drawn in the\n        //! background colour.\n        LeftSideRoundedSplitter = SC_MARK_TCORNERCURVE,\n\n        //! A drawn plus sign in a circle.\n        CircledPlus = SC_MARK_CIRCLEPLUS,\n\n        //! A drawn plus sign in a connected box.\n        CircledPlusConnected = SC_MARK_CIRCLEPLUSCONNECTED,\n\n        //! A drawn minus sign in a circle.\n        CircledMinus = SC_MARK_CIRCLEMINUS,\n\n        //! A drawn minus sign in a connected circle.\n        CircledMinusConnected = SC_MARK_CIRCLEMINUSCONNECTED,\n\n        //! No symbol is drawn but the line is drawn with the same background\n        //! color as the marker's.\n        Background = SC_MARK_BACKGROUND,\n\n        //! Three drawn dots.\n        ThreeDots = SC_MARK_DOTDOTDOT,\n\n        //! Three drawn arrows pointing right.\n        ThreeRightArrows = SC_MARK_ARROWS,\n\n        //! A full rectangle (ie. the margin background) using the marker's\n        //! background color.\n        FullRectangle = SC_MARK_FULLRECT,\n\n        //! A left rectangle (ie. the left part of the margin background) using\n        //! the marker's background color.\n        LeftRectangle = SC_MARK_LEFTRECT,\n\n        //! No symbol is drawn but the line is drawn underlined using the\n        //! marker's background color.\n        Underline = SC_MARK_UNDERLINE\n    };\n\n    //! This enum defines the different whitespace visibility modes.  When\n    //! whitespace is visible spaces are displayed as small centred dots and\n    //! tabs are displayed as light arrows pointing to the right.\n    enum WhitespaceVisibility {\n        //! Whitespace is invisible.\n        WsInvisible = SCWS_INVISIBLE,\n\n        //! Whitespace is always visible.\n        WsVisible = SCWS_VISIBLEALWAYS,\n\n        //! Whitespace is visible after the whitespace used for indentation.\n        WsVisibleAfterIndent = SCWS_VISIBLEAFTERINDENT\n    };\n\n    //! This enum defines the different line wrap modes.\n    enum WrapMode {\n        //! Lines are not wrapped.\n        WrapNone = SC_WRAP_NONE,\n\n        //! Lines are wrapped at word boundaries.\n        WrapWord = SC_WRAP_WORD,\n\n        //! Lines are wrapped at character boundaries.\n        WrapCharacter = SC_WRAP_CHAR\n    };\n\n    //! This enum defines the different line wrap visual flags.\n    enum WrapVisualFlag {\n        //! No wrap flag is displayed.\n        WrapFlagNone,\n\n        //! A wrap flag is displayed by the text.\n        WrapFlagByText,\n\n        //! A wrap flag is displayed by the border.\n        WrapFlagByBorder,\n\n        //! A wrap flag is displayed in the line number margin.\n        WrapFlagInMargin\n    };\n\n    //! This enum defines the different line wrap indentation modes.\n    enum WrapIndentMode {\n        //! Wrapped sub-lines are indented by the amount set by\n        //! setWrapVisualFlags().\n        WrapIndentFixed = SC_WRAPINDENT_FIXED,\n\n        //! Wrapped sub-lines are indented by the same amount as the first\n        //! sub-line.\n        WrapIndentSame = SC_WRAPINDENT_SAME,\n\n        //! Wrapped sub-lines are indented by the same amount as the first\n        //! sub-line plus one more level of indentation.\n        WrapIndentIndented = SC_WRAPINDENT_INDENT\n    };\n\n    //! Construct an empty QsciScintilla with parent \\a parent, name \\a name,\n    //! and widget flags \\a f.\n    QsciScintilla(QWidget *parent = 0, const char *name = 0, WFlags f = 0);\n\n    //! Destroys the QsciScintilla instance.\n    virtual ~QsciScintilla();\n\n    //! Returns the API context, which is a list of words, before the position\n    //! \\a pos in the document.  The context can be used by auto-completion and\n    //! call tips to help to identify which API call the user is referring to.\n    //! In the default implementation the current lexer determines what\n    //! characters make up a word, and what characters determine the boundaries\n    //! of words (ie. the start characters).  If there is no current lexer then\n    //! the context will consist of a single word.  On return \\a context_start\n    //! will contain the position in the document of the start of the context\n    //! and \\a last_word_start will contain the position in the document of the\n    //! start of the last word of the context.\n    virtual QStringList apiContext(int pos, int &context_start,\n            int &last_word_start);\n\n    //! Annotate the line \\a line with the text \\a text using the style number\n    //! \\a style.\n    void annotate(int line, const QString &text, int style);\n\n    //! Annotate the line \\a line with the text \\a text using the style \\a\n    //! style.\n    void annotate(int line, const QString &text, const QsciStyle &style);\n\n    //! Annotate the line \\a line with the styled text \\a text.\n    void annotate(int line, const QsciStyledText &text);\n\n    //! Annotate the line \\a line with the list of styled text \\a text.\n    void annotate(int line, const QValueList<QsciStyledText> &text);\n\n    //! Returns the annotation on line \\a line, if any.\n    QString annotation(int line) const;\n\n    //! Returns the display style for annotations.\n    //!\n    //! \\sa setAnnotationDisplay()\n    AnnotationDisplay annotationDisplay() const;\n\n    //! The annotations on line \\a line are removed.  If \\a line is negative\n    //! then all annotations are removed.\n    void clearAnnotations(int line = -1);\n\n    //! Returns true if auto-completion lists are case sensitive.\n    //!\n    //! \\sa setAutoCompletionCaseSensitivity()\n    bool autoCompletionCaseSensitivity() const;\n\n    //! Returns true if auto-completion fill-up characters are enabled.\n    //!\n    //! \\sa setAutoCompletionFillups(), setAutoCompletionFillupsEnabled()\n    bool autoCompletionFillupsEnabled() const;\n\n    //! Returns true if the rest of the word to the right of the current cursor\n    //! is removed when an item from an auto-completion list is selected.\n    //!\n    //! \\sa setAutoCompletionReplaceWord()\n    bool autoCompletionReplaceWord() const;\n\n    //! Returns true if the only item in an auto-completion list with a single\n    //! entry is automatically used and the list not displayed.  Note that this\n    //! is deprecated and autoCompletionUseSingle() should be used instead.\n    //!\n    //! \\sa setAutoCompletionShowSingle()\n    bool autoCompletionShowSingle() const;\n\n    //! Returns the current source for the auto-completion list when it is\n    //! being displayed automatically as the user types.\n    //!\n    //! \\sa setAutoCompletionSource()\n    AutoCompletionSource autoCompletionSource() const {return acSource;}\n\n    //! Returns the current threshold for the automatic display of the\n    //! auto-completion list as the user types.\n    //!\n    //! \\sa setAutoCompletionThreshold()\n    int autoCompletionThreshold() const {return acThresh;}\n\n    //! Returns the current behavior when an auto-completion list contains a\n    //! single entry.\n    //!\n    //! \\sa setAutoCompletionUseSingle()\n    AutoCompletionUseSingle autoCompletionUseSingle() const;\n\n    //! Returns true if auto-indentation is enabled.\n    //!\n    //! \\sa setAutoIndent()\n    bool autoIndent() const {return autoInd;}\n\n    //! Returns true if the backspace key unindents a line instead of deleting\n    //! a character.  The default is false.\n    //!\n    //! \\sa setBackspaceUnindents(), tabIndents(), setTabIndents()\n    bool backspaceUnindents() const;\n\n    //! Mark the beginning of a sequence of actions that can be undone by a\n    //! single call to undo().\n    //!\n    //! \\sa endUndoAction(), undo()\n    void beginUndoAction();\n\n    //! Returns the brace matching mode.\n    //!\n    //! \\sa setBraceMatching()\n    BraceMatch braceMatching() const {return braceMode;}\n\n    //! Returns the current call tip position.\n    //!\n    //! \\sa setCallTipsPosition()\n    CallTipsPosition callTipsPosition() const {return call_tips_position;}\n\n    //! Returns the current call tip style.\n    //!\n    //! \\sa setCallTipsStyle()\n    CallTipsStyle callTipsStyle() const {return call_tips_style;}\n\n    //! Returns the maximum number of call tips that are displayed.\n    //!\n    //! \\sa setCallTipsVisible()\n    int callTipsVisible() const {return maxCallTips;}\n\n    //! Cancel any current auto-completion or user defined list.\n    void cancelList();\n\n    //! Returns true if the current language lexer is case sensitive.  If there\n    //! is no current lexer then true is returned.\n    bool caseSensitive() const;\n\n    //! Clear all current folds, i.e. ensure that all lines are displayed\n    //! unfolded.\n    //!\n    //! \\sa setFolding()\n    void clearFolds();\n\n    //! Clears the range of text with indicator \\a indicatorNumber starting at\n    //! position \\a indexFrom in line \\a lineFrom and finishing at position\n    //! \\a indexTo in line \\a lineTo.\n    //!\n    //! \\sa fillIndicatorRange()\n    void clearIndicatorRange(int lineFrom, int indexFrom, int lineTo,\n            int indexTo, int indicatorNumber);\n\n    //! Clear all registered images.\n    //!\n    //! \\sa registerImage()\n    void clearRegisteredImages();\n\n    //! Returns the widget's text (ie. foreground) colour.\n    //!\n    //! \\sa setColor()\n    QColor color() const;\n\n    //! Returns a list of the line numbers that have contracted folds.  This is\n    //! typically used to save the fold state of a document.\n    //!\n    //! \\sa setContractedFolds()\n    QValueList<int> contractedFolds() const;\n\n    //! All the lines of the text have their end-of-lines converted to mode\n    //! \\a mode.\n    //!\n    //! \\sa eolMode(), setEolMode()\n    void convertEols(EolMode mode);\n\n\n    //! Returns the attached document.\n    //!\n    //! \\sa setDocument()\n    QsciDocument document() const {return doc;}\n\n    //! Mark the end of a sequence of actions that can be undone by a single\n    //! call to undo().\n    //!\n    //! \\sa beginUndoAction(), undo()\n    void endUndoAction();\n\n    //! Returns the color of the marker used to show that a line has exceeded\n    //! the length set by setEdgeColumn().\n    //!\n    //! \\sa setEdgeColor(), \\sa setEdgeColumn\n    QColor edgeColor() const;\n\n    //! Returns the number of the column after which lines are considered to be\n    //! long.\n    //!\n    //! \\sa setEdgeColumn()\n    int edgeColumn() const;\n\n    //! Returns the edge mode which determines how long lines are marked.\n    //!\n    //! \\sa setEdgeMode()\n    EdgeMode edgeMode() const;\n\n    //! Set the default font.  This has no effect if a language lexer has been\n    //! set.\n    void setFont(const QFont &f);\n\n    //! Returns the end-of-line mode.\n    //!\n    //! \\sa setEolMode()\n    EolMode eolMode() const;\n\n    //! Returns the visibility of end-of-lines.\n    //!\n    //! \\sa setEolVisibility()\n    bool eolVisibility() const;\n\n    //! Returns the extra space added to the height of a line above the\n    //! baseline of the text.\n    //!\n    //! \\sa setExtraAscent(), extraDescent()\n    int extraAscent() const;\n\n    //! Returns the extra space added to the height of a line below the\n    //! baseline of the text.\n    //!\n    //! \\sa setExtraDescent(), extraAscent()\n    int extraDescent() const;\n\n    //! Fills the range of text with indicator \\a indicatorNumber starting at\n    //! position \\a indexFrom in line \\a lineFrom and finishing at position\n    //! \\a indexTo in line \\a lineTo.\n    //!\n    //! \\sa clearIndicatorRange()\n    void fillIndicatorRange(int lineFrom, int indexFrom, int lineTo,\n            int indexTo, int indicatorNumber);\n\n    //! Find the first occurrence of the string \\a expr and return true if\n    //! \\a expr was found, otherwise returns false.  If \\a expr is found it\n    //! becomes the current selection.\n    //!\n    //! If \\a re is true then \\a expr is interpreted as a regular expression\n    //! rather than a simple string.\n    //!\n    //! If \\a cs is true then the search is case sensitive.\n    //!\n    //! If \\a wo is true then the search looks for whole word matches only,\n    //! otherwise it searches for any matching text.\n    //!\n    //! If \\a wrap is true then the search wraps around the end of the text.\n    //!\n    //! If \\a forward is true (the default) then the search is forward from the\n    //! starting position to the end of the text, otherwise it is backwards to\n    //! the beginning of the text. \n    //!\n    //! If either \\a line or \\a index are negative (the default) then the\n    //! search begins from the current cursor position.  Otherwise the search\n    //! begins at position \\a index of line \\a line.\n    //!\n    //! If \\a show is true (the default) then any text found is made visible\n    //! (ie. it is unfolded).\n    //!\n    //! If \\a posix is true then a regular expression is treated in a more\n    //! POSIX compatible manner by interpreting bare ( and ) as tagged sections\n    //! rather than \\( and \\).\n    //!\n    //! \\sa findFirstInSelection(), findNext(), replace()\n    virtual bool findFirst(const QString &expr, bool re, bool cs, bool wo,\n            bool wrap, bool forward = true, int line = -1, int index = -1,\n            bool show = true, bool posix = false);\n\n    //! Find the first occurrence of the string \\a expr in the current\n    //! selection and return true if \\a expr was found, otherwise returns\n    //! false.  If \\a expr is found it becomes the current selection.  The\n    //! original selection is restored when a subsequent call to findNext()\n    //! returns false.\n    //!\n    //! If \\a re is true then \\a expr is interpreted as a regular expression\n    //! rather than a simple string.\n    //!\n    //! If \\a cs is true then the search is case sensitive.\n    //!\n    //! If \\a wo is true then the search looks for whole word matches only,\n    //! otherwise it searches for any matching text.\n    //!\n    //! If \\a forward is true (the default) then the search is forward from the\n    //! start to the end of the selection, otherwise it is backwards from the\n    //! end to the start of the selection.\n    //!\n    //! If \\a show is true (the default) then any text found is made visible\n    //! (ie. it is unfolded).\n    //!\n    //! If \\a posix is true then a regular expression is treated in a more\n    //! POSIX compatible manner by interpreting bare ( and ) as tagged sections\n    //! rather than \\( and \\).\n    //!\n    //! \\sa findFirstInSelection(), findNext(), replace()\n    virtual bool findFirstInSelection(const QString &expr, bool re, bool cs,\n            bool wo, bool forward = true, bool show = true,\n            bool posix = false);\n\n    //! Find the next occurence of the string found using findFirst() or\n    //! findFirstInSelection().\n    //!\n    //! \\sa findFirst(), findFirstInSelection(), replace()\n    virtual bool findNext();\n\n    //! Returns the number of the first visible line.\n    //!\n    //! \\sa setFirstVisibleLine()\n    int firstVisibleLine() const;\n\n    //! Returns the current folding style.\n    //!\n    //! \\sa setFolding()\n    FoldStyle folding() const {return fold;}\n\n    //! Sets \\a *line and \\a *index to the line and index of the cursor.\n    //!\n    //! \\sa setCursorPosition()\n    void getCursorPosition(int *line, int *index) const;\n\n    //! If there is a selection, \\a *lineFrom is set to the line number in\n    //! which the selection begins and \\a *lineTo is set to the line number in\n    //! which the selection ends.  (They could be the same.)  \\a *indexFrom is\n    //! set to the index at which the selection begins within \\a *lineFrom, and\n    //! \\a *indexTo is set to the index at which the selection ends within\n    //! \\a *lineTo.  If there is no selection, \\a *lineFrom, \\a *indexFrom,\n    //! \\a *lineTo and \\a *indexTo are all set to -1. \n    //!\n    //! \\sa setSelection()\n    void getSelection(int *lineFrom, int *indexFrom, int *lineTo,\n            int *indexTo) const;\n\n    //! Returns true if some text is selected.\n    //!\n    //! \\sa selectedText()\n    bool hasSelectedText() const {return selText;}\n\n    //! Returns the number of characters that line \\a line is indented by.\n    //!\n    //! \\sa setIndentation()\n    int indentation(int line) const;\n\n    //! Returns true if the display of indentation guides is enabled.\n    //!\n    //! \\sa setIndentationGuides()\n    bool indentationGuides() const;\n\n    //! Returns true if indentations are created using tabs and spaces, rather\n    //! than just spaces.  The default is true.\n    //!\n    //! \\sa setIndentationsUseTabs()\n    bool indentationsUseTabs() const;\n\n    //! Returns the indentation width in characters.  The default is 0 which\n    //! means that the value returned by tabWidth() is actually used.\n    //!\n    //! \\sa setIndentationWidth(), tabWidth()\n    int indentationWidth() const;\n\n    //! Define a type of indicator using the style \\a style with the indicator\n    //! number \\a indicatorNumber.  If \\a indicatorNumber is -1 then the\n    //! indicator number is automatically allocated.  The indicator number is\n    //! returned or -1 if too many types of indicator have been defined.\n    //!\n    //! Indicators are used to display additional information over the top of\n    //! styling.  They can be used to show, for example, syntax errors,\n    //! deprecated names and bad indentation by drawing lines under text or\n    //! boxes around text.\n    //!\n    //! There may be up to 32 types of indicator defined at a time.  The first\n    //! 8 are normally used by lexers.  By default indicator number 0 is a\n    //! dark green SquiggleIndicator, 1 is a blue TTIndicator, and 2 is a red\n    //! PlainIndicator.\n    int indicatorDefine(IndicatorStyle style, int indicatorNumber = -1);\n\n    //! Returns true if the indicator \\a indicatorNumber is drawn under the\n    //! text (i.e. in the background).  The default is false.\n    //!\n    //! \\sa setIndicatorDrawUnder()\n    bool indicatorDrawUnder(int indicatorNumber) const;\n\n    //! Returns true if a call tip is currently active.\n    bool isCallTipActive() const;\n\n    //! Returns true if an auto-completion or user defined list is currently\n    //! active.\n    bool isListActive() const;\n\n    //! Returns true if the text has been modified.\n    //!\n    //! \\sa setModified(), modificationChanged()\n    bool isModified() const;\n\n    //! Returns true if the text edit is read-only.\n    //!\n    //! \\sa setReadOnly()\n    bool isReadOnly() const;\n\n    //! Returns true if there is something that can be redone.\n    //!\n    //! \\sa redo()\n    bool isRedoAvailable() const;\n\n    //! Returns true if there is something that can be undone.\n    //!\n    //! \\sa undo()\n    bool isUndoAvailable() const;\n\n    //! Returns true if text is interpreted as being UTF8 encoded.  The default\n    //! is to interpret the text as Latin1 encoded.\n    //!\n    //! \\sa setUtf8()\n    bool isUtf8() const;\n\n    //! Returns true if character \\a ch is a valid word character.\n    //!\n    //! \\sa wordCharacters()\n    bool isWordCharacter(char ch) const;\n\n    //! Returns the line which is at \\a point pixel coordinates or -1 if there\n    //! is no line at that point.\n    int lineAt(const QPoint &point) const;\n\n    //! QScintilla uses the combination of a line number and a character index\n    //! from the start of that line to specify the position of a character\n    //! within the text.  The underlying Scintilla instead uses a byte index\n    //! from the start of the text.  This will convert the \\a position byte\n    //! index to the \\a *line line number and \\a *index character index.\n    //!\n    //! \\sa positionFromLineIndex()\n    void lineIndexFromPosition(int position, int *line, int *index) const;\n\n    //! Returns the length of line \\a line int bytes or -1 if there is no such\n    //! line.  In order to get the length in characters use text(line).length().\n    int lineLength(int line) const;\n\n    //! Returns the number of lines of text.\n    int lines() const;\n\n    //! Returns the length of the text edit's text in bytes.  In order to get\n    //! the length in characters use text().length().\n    int length() const;\n\n    //! Returns the current language lexer used to style text.  If it is 0 then\n    //! syntax styling is disabled.\n    //!\n    //! \\sa setLexer()\n    QsciLexer *lexer() const;\n\n    //! Returns true if line numbers are enabled for margin \\a margin.\n    //!\n    //! \\sa setMarginLineNumbers(), marginType(), SCI_GETMARGINTYPEN\n    bool marginLineNumbers(int margin) const;\n\n    //! Returns the marker mask of margin \\a margin.\n    //!\n    //! \\sa setMarginMask(), QsciMarker, SCI_GETMARGINMASKN\n    int marginMarkerMask(int margin) const;\n\n    //! Returns the margin options.  The default is MoNone.\n    //!\n    //! \\sa setMarginOptions(), MoNone, MoSublineSelect.\n    int marginOptions() const;\n\n    //! Returns true if margin \\a margin is sensitive to mouse clicks.\n    //!\n    //! \\sa setMarginSensitivity(), marginClicked(), SCI_GETMARGINTYPEN\n    bool marginSensitivity(int margin) const;\n\n    //! Returns the type of margin \\a margin.\n    //!\n    //! \\sa setMarginType(), SCI_GETMARGINTYPEN\n    MarginType marginType(int margin) const;\n\n    //! Returns the width in pixels of margin \\a margin.\n    //!\n    //! \\sa setMarginWidth(), SCI_GETMARGINWIDTHN\n    int marginWidth(int margin) const;\n\n    //! Define a type of marker using the symbol \\a sym with the marker number\n    //! \\a markerNumber.  If \\a markerNumber is -1 then the marker number is\n    //! automatically allocated.  The marker number is returned or -1 if too\n    //! many types of marker have been defined.\n    //!\n    //! Markers are small geometric symbols and characters used, for example,\n    //! to indicate the current line or, in debuggers, to indicate breakpoints.\n    //! If a margin has a width of 0 then its markers are not drawn, but their\n    //! background colours affect the background colour of the corresponding\n    //! line of text.\n    //!\n    //! There may be up to 32 types of marker defined at a time and each line\n    //! of text has a set of marker instances associated with it.  Markers are\n    //! drawn according to their numerical identifier.  Markers try to move\n    //! with their text by tracking where the start of their line moves to.\n    //! For example, when a line is deleted its markers are added to previous\n    //! line's markers.\n    //!\n    //! Each marker type is identified by a marker number.  Each instance of a\n    //! marker is identified by a marker handle.\n    int markerDefine(MarkerSymbol sym, int markerNumber = -1);\n\n    //! Define a marker using the character \\a ch with the marker number\n    //! \\a markerNumber.  If \\a markerNumber is -1 then the marker number is\n    //! automatically allocated.  The marker number is returned or -1 if too\n    //! many markers have been defined.\n    int markerDefine(char ch, int markerNumber = -1);\n\n    //! Define a marker using a copy of the pixmap \\a pm with the marker number\n    //! \\a markerNumber.  If \\a markerNumber is -1 then the marker number is\n    //! automatically allocated.  The marker number is returned or -1 if too\n    //! many markers have been defined.\n    int markerDefine(const QPixmap &pm, int markerNumber = -1);\n\n    //! Define a marker using a copy of the image \\a im with the marker number\n    //! \\a markerNumber.  If \\a markerNumber is -1 then the marker number is\n    //! automatically allocated.  The marker number is returned or -1 if too\n    //! many markers have been defined.\n    int markerDefine(const QImage &im, int markerNumber = -1);\n\n    //! Add an instance of marker number \\a markerNumber to line number\n    //! \\a linenr.  A handle for the marker is returned which can be used to\n    //! track the marker's position, or -1 if the \\a markerNumber was invalid.\n    //!\n    //! \\sa markerDelete(), markerDeleteAll(), markerDeleteHandle()\n    int markerAdd(int linenr, int markerNumber);\n\n    //! Returns the 32 bit mask of marker numbers at line number \\a linenr.\n    //!\n    //! \\sa markerAdd()\n    unsigned markersAtLine(int linenr) const;\n\n    //! Delete all markers with the marker number \\a markerNumber in the line\n    //! \\a linenr.  If \\a markerNumber is -1 then delete all markers from line\n    //! \\a linenr.\n    //!\n    //! \\sa markerAdd(), markerDeleteAll(), markerDeleteHandle()\n    void markerDelete(int linenr, int markerNumber = -1);\n\n    //! Delete the all markers with the marker number \\a markerNumber.  If\n    //! \\a markerNumber is -1 then delete all markers.\n    //!\n    //! \\sa markerAdd(), markerDelete(), markerDeleteHandle()\n    void markerDeleteAll(int markerNumber = -1);\n\n    //! Delete the the marker instance with the marker handle \\a mhandle.\n    //!\n    //! \\sa markerAdd(), markerDelete(), markerDeleteAll()\n    void markerDeleteHandle(int mhandle);\n\n    //! Return the line number that contains the marker instance with the\n    //! marker handle \\a mhandle.\n    int markerLine(int mhandle) const;\n\n    //! Return the number of the next line to contain at least one marker from\n    //! a 32 bit mask of markers.  \\a linenr is the line number to start the\n    //! search from.  \\a mask is the mask of markers to search for.\n    //!\n    //! \\sa markerFindPrevious()\n    int markerFindNext(int linenr, unsigned mask) const;\n\n    //! Return the number of the previous line to contain at least one marker\n    //! from a 32 bit mask of markers.  \\a linenr is the line number to start\n    //! the search from.  \\a mask is the mask of markers to search for.\n    //!\n    //! \\sa markerFindNext()\n    int markerFindPrevious(int linenr, unsigned mask) const;\n\n    //! Returns true if text entered by the user will overwrite existing text.\n    //!\n    //! \\sa setOverwriteMode()\n    bool overwriteMode() const;\n\n    //! Returns the widget's paper (ie. background) colour.\n    //!\n    //! \\sa setPaper()\n    QColor paper() const;\n\n    //! QScintilla uses the combination of a line number and a character index\n    //! from the start of that line to specify the position of a character\n    //! within the text.  The underlying Scintilla instead uses a byte index\n    //! from the start of the text.  This will return the byte index\n    //! corresponding to the \\a line line number and \\a index character index.\n    //!\n    //! \\sa lineIndexFromPosition()\n    int positionFromLineIndex(int line, int index) const;\n\n    //! Reads the current document from the \\a io device and returns true if\n    //! there was no error.\n    //!\n    //! \\sa write()\n    bool read(QIODevice *io);\n\n    //! Recolours the document between the \\a start and \\a end positions.\n    //! \\a start defaults to the start of the document and \\a end defaults to\n    //! the end of the document.\n    virtual void recolor(int start = 0, int end = -1);\n\n    //! Register an image \\a pm with ID \\a id.  Registered images can be\n    //! displayed in auto-completion lists.\n    //!\n    //! \\sa clearRegisteredImages(), QsciLexer::apiLoad()\n    void registerImage(int id, const QPixmap &pm);\n\n    //! Register an image \\a im with ID \\a id.  Registered images can be\n    //! displayed in auto-completion lists.\n    //!\n    //! \\sa clearRegisteredImages(), QsciLexer::apiLoad()\n    void registerImage(int id, const QImage &im);\n\n    //! Replace the current selection, set by a previous call to findFirst(),\n    //! findFirstInSelection() or findNext(), with \\a replaceStr.\n    //!\n    //! \\sa findFirst(), findFirstInSelection(), findNext()\n    virtual void replace(const QString &replaceStr);\n\n    //! Reset the fold margin colours to their defaults.\n    //!\n    //! \\sa setFoldMarginColors()\n    void resetFoldMarginColors();\n\n    //! Resets the background colour of an active hotspot area to the default.\n    //!\n    //! \\sa setHotspotBackgroundColor(), resetHotspotForegroundColor()\n    void resetHotspotBackgroundColor();\n\n    //! Resets the foreground colour of an active hotspot area to the default.\n    //!\n    //! \\sa setHotspotForegroundColor(), resetHotspotBackgroundColor()\n    void resetHotspotForegroundColor();\n\n    //! The fold margin may be drawn as a one pixel sized checkerboard pattern\n    //! of two colours, \\a fore and \\a back.\n    //!\n    //! \\sa resetFoldMarginColors()\n    void setFoldMarginColors(const QColor &fore, const QColor &back);\n\n    //! Set the display style for annotations.  The default is\n    //! AnnotationStandard.\n    //!\n    //! \\sa annotationDisplay()\n    void setAnnotationDisplay(AnnotationDisplay display);\n\n    //! Enable the use of fill-up characters, either those explicitly set or\n    //! those set by a lexer.  By default, fill-up characters are disabled.\n    //!\n    //! \\sa autoCompletionFillupsEnabled(), setAutoCompletionFillups()\n    void setAutoCompletionFillupsEnabled(bool enabled);\n\n    //! A fill-up character is one that, when entered while an auto-completion\n    //! list is being displayed, causes the currently selected item from the\n    //! list to be added to the text followed by the fill-up character.\n    //! \\a fillups is the set of fill-up characters.  If a language lexer has\n    //! been set then this is ignored and the lexer defines the fill-up\n    //! characters.  The default is that no fill-up characters are set.\n    //!\n    //! \\sa autoCompletionFillupsEnabled(), setAutoCompletionFillupsEnabled()\n    void setAutoCompletionFillups(const char *fillups);\n\n    //! A word separator is a sequence of characters that, when entered, causes\n    //! the auto-completion list to be displayed.  If a language lexer has been\n    //! set then this is ignored and the lexer defines the word separators.\n    //! The default is that no word separators are set.\n    //!\n    //! \\sa setAutoCompletionThreshold()\n    void setAutoCompletionWordSeparators(const QStringList &separators);\n\n    //! Set the background colour of call tips to \\a col.  The default is\n    //! white.\n    void setCallTipsBackgroundColor(const QColor &col);\n\n    //! Set the foreground colour of call tips to \\a col.  The default is\n    //! mid-gray.\n    void setCallTipsForegroundColor(const QColor &col);\n\n    //! Set the highlighted colour of call tip text to \\a col.  The default is\n    //! dark blue.\n    void setCallTipsHighlightColor(const QColor &col);\n\n    //! Set the current call tip position.  The default is CallTipsBelowText.\n    //!\n    //! \\sa callTipsPosition()\n    void setCallTipsPosition(CallTipsPosition position);\n\n    //! Set the current call tip style.  The default is CallTipsNoContext.\n    //!\n    //! \\sa callTipsStyle()\n    void setCallTipsStyle(CallTipsStyle style);\n\n    //! Set the maximum number of call tips that are displayed to \\a nr.  If\n    //! the maximum number is 0 then all applicable call tips are displayed.\n    //! If the maximum number is -1 then one call tip will be displayed with up\n    //! and down arrows that allow the use to scroll through the full list.\n    //! The default is -1.\n    //!\n    //! \\sa callTipsVisible()\n    void setCallTipsVisible(int nr);\n\n    //! Sets each line in the \\a folds list of line numbers to be a contracted\n    //! fold.  This is typically used to restore the fold state of a document.\n    //!\n    //! \\sa contractedFolds()\n    void setContractedFolds(const QValueList<int> &folds);\n\n    //! Attach the document \\a document, replacing the currently attached\n    //! document.\n    //!\n    //! \\sa document()\n    void setDocument(const QsciDocument &document);\n\n    //! Set the color of the marker used to show that a line has exceeded the\n    //! length set by setEdgeColumn().\n    //!\n    //! \\sa edgeColor(), \\sa setEdgeColumn\n    void setEdgeColor(const QColor &col);\n\n    //! Set the number of the column after which lines are considered to be\n    //! long.\n    //!\n    //! \\sa edgeColumn()\n    void setEdgeColumn(int colnr);\n\n    //! Set the edge mode which determines how long lines are marked.\n    //!\n    //! \\sa edgeMode()\n    void setEdgeMode(EdgeMode mode);\n\n    //! Set the number of the first visible line to \\a linenr.\n    //!\n    //! \\sa firstVisibleLine()\n    void setFirstVisibleLine(int linenr);\n\n    //! Enables or disables, according to \\a under, if the indicator\n    //! \\a indicatorNumber is drawn under or over the text (i.e. in the\n    //! background or foreground).  If \\a indicatorNumber is -1 then the state\n    //! of all indicators is set.\n    //!\n    //! \\sa indicatorDrawUnder()\n    void setIndicatorDrawUnder(bool under, int indicatorNumber = -1);\n\n    //! Set the foreground colour of indicator \\a indicatorNumber to \\a col.\n    //! If \\a indicatorNumber is -1 then the colour of all indicators is set.\n    void setIndicatorForegroundColor(const QColor &col, int indicatorNumber = -1);\n\n    //! Set the outline colour of indicator \\a indicatorNumber to \\a col.\n    //! If \\a indicatorNumber is -1 then the colour of all indicators is set.\n    //! At the moment only the alpha value of the colour has any affect.\n    void setIndicatorOutlineColor(const QColor &col, int indicatorNumber = -1);\n\n    //! Set the margin options to \\a options.\n    //!\n    //! \\sa marginOptions(), MoNone, MoSublineSelect.\n    void setMarginOptions(int options);\n\n    //! Set the margin text of line \\a line with the text \\a text using the\n    //! style number \\a style.\n    void setMarginText(int line, const QString &text, int style);\n\n    //! Set the margin text of line \\a line with the text \\a text using the\n    //! style \\a style.\n    void setMarginText(int line, const QString &text, const QsciStyle &style);\n\n    //! Set the margin text of line \\a line with the styled text \\a text.\n    void setMarginText(int line, const QsciStyledText &text);\n\n    //! Set the margin text of line \\a line with the list of styled text \\a\n    //! text.\n    void setMarginText(int line, const QValueList<QsciStyledText> &text);\n\n    //! Set the type of margin \\a margin to type \\a type.\n    //!\n    //! \\sa marginType(), SCI_SETMARGINTYPEN\n    void setMarginType(int margin, MarginType type);\n\n    //! The margin text on line \\a line is removed.  If \\a line is negative\n    //! then all margin text is removed.\n    void clearMarginText(int line = -1);\n\n    //! Set the background colour, including the alpha component, of marker\n    //! \\a markerNumber to \\a col.  If \\a markerNumber is -1 then the colour of\n    //! all markers is set.  The default is white.\n    //!\n    //! \\sa setMarkerForegroundColor()\n    void setMarkerBackgroundColor(const QColor &col, int markerNumber = -1);\n\n    //! Set the foreground colour of marker \\a markerNumber to \\a col.  If\n    //! \\a markerNumber is -1 then the colour of all markers is set.  The\n    //! default is black.\n    //!\n    //! \\sa setMarkerBackgroundColor()\n    void setMarkerForegroundColor(const QColor &col, int markerNumber = -1);\n\n    //! Set the background colour used to display matched braces to \\a col.  It\n    //! is ignored if an indicator is being used.  The default is white.\n    //!\n    //! \\sa setMatchedBraceForegroundColor(), setMatchedBraceIndicator()\n    void setMatchedBraceBackgroundColor(const QColor &col);\n\n    //! Set the foreground colour used to display matched braces to \\a col.  It\n    //! is ignored if an indicator is being used.  The default is red.\n    //!\n    //! \\sa setMatchedBraceBackgroundColor(), setMatchedBraceIndicator()\n    void setMatchedBraceForegroundColor(const QColor &col);\n\n    //! Set the indicator used to display matched braces to \\a indicatorNumber.\n    //! The default is not to use an indicator.\n    //!\n    //! \\sa resetMatchedBraceIndicator(), setMatchedBraceBackgroundColor()\n    void setMatchedBraceIndicator(int indicatorNumber);\n\n    //! Stop using an indicator to display matched braces.\n    //!\n    //! \\sa setMatchedBraceIndicator()\n    void resetMatchedBraceIndicator();\n\n    //! Set the background colour used to display unmatched braces to \\a col.\n    //! It is ignored if an indicator is being used.  The default is white.\n    //!\n    //! \\sa setUnmatchedBraceForegroundColor(), setUnmatchedBraceIndicator()\n    void setUnmatchedBraceBackgroundColor(const QColor &col);\n\n    //! Set the foreground colour used to display unmatched braces to \\a col.\n    //! It is ignored if an indicator is being used.  The default is blue.\n    //!\n    //! \\sa setUnmatchedBraceBackgroundColor(), setUnmatchedBraceIndicator()\n    void setUnmatchedBraceForegroundColor(const QColor &col);\n\n    //! Set the indicator used to display unmatched braces to\n    //! \\a indicatorNumber.  The default is not to use an indicator.\n    //!\n    //! \\sa resetUnmatchedBraceIndicator(), setUnmatchedBraceBackgroundColor()\n    void setUnmatchedBraceIndicator(int indicatorNumber);\n\n    //! Stop using an indicator to display unmatched braces.\n    //!\n    //! \\sa setUnmatchedBraceIndicator()\n    void resetUnmatchedBraceIndicator();\n\n    //! Set the visual flags displayed when a line is wrapped.  \\a endFlag\n    //! determines if and where the flag at the end of a line is displayed.\n    //! \\a startFlag determines if and where the flag at the start of a line is\n    //! displayed.  \\a indent is the number of characters a wrapped line is\n    //! indented by.  By default no visual flags are displayed.\n    void setWrapVisualFlags(WrapVisualFlag endFlag,\n            WrapVisualFlag startFlag = WrapFlagNone, int indent = 0);\n\n    //! Returns the selected text or an empty string if there is no currently\n    //! selected text.\n    //!\n    //! \\sa hasSelectedText()\n    QString selectedText() const;\n\n    //! Returns whether or not the selection is drawn up to the right hand\n    //! border.\n    //!\n    //! \\sa setSelectionToEol()\n    bool selectionToEol() const;\n\n    //! Sets the background colour of an active hotspot area to \\a col.\n    //!\n    //! \\sa resetHotspotBackgroundColor(), setHotspotForegroundColor()\n    void setHotspotBackgroundColor(const QColor &col);\n\n    //! Sets the foreground colour of an active hotspot area to \\a col.\n    //!\n    //! \\sa resetHotspotForegroundColor(), setHotspotBackgroundColor()\n    void setHotspotForegroundColor(const QColor &col);\n\n    //! Enables or disables, according to \\a enable, the underlining of an\n    //! active hotspot area.  The default is false.\n    void setHotspotUnderline(bool enable);\n\n    //! Enables or disables, according to \\a enable, the wrapping of a hotspot\n    //! area to following lines.  The default is true.\n    void setHotspotWrap(bool enable);\n\n    //! Sets whether or not the selection is drawn up to the right hand border.\n    //! \\a filled is set if the selection is drawn to the border.\n    //!\n    //! \\sa selectionToEol()\n    void setSelectionToEol(bool filled);\n\n    //! Sets the extra space added to the height of a line above the baseline\n    //! of the text to \\a extra.\n    //!\n    //! \\sa extraAscent(), setExtraDescent()\n    void setExtraAscent(int extra);\n\n    //! Sets the extra space added to the height of a line below the baseline\n    //! of the text to \\a extra.\n    //!\n    //! \\sa extraDescent(), setExtraAscent()\n    void setExtraDescent(int extra);\n\n    //! Text entered by the user will overwrite existing text if \\a overwrite\n    //! is true.\n    //!\n    //! \\sa overwriteMode()\n    void setOverwriteMode(bool overwrite);\n\n    //! Sets the background colour of visible whitespace to \\a col.  If \\a col\n    //! is an invalid color (the default) then the color specified by the\n    //! current lexer is used.\n    void setWhitespaceBackgroundColor(const QColor &col);\n\n    //! Sets the foreground colour of visible whitespace to \\a col.  If \\a col\n    //! is an invalid color (the default) then the color specified by the\n    //! current lexer is used.\n    void setWhitespaceForegroundColor(const QColor &col);\n\n    //! Sets the size of the dots used to represent visible whitespace.\n    //!\n    //! \\sa whitespaceSize()\n    void setWhitespaceSize(int size);\n\n    //! Sets the line wrap indentation mode to \\a mode.  The default is\n    //! WrapIndentFixed.\n    //!\n    //! \\sa wrapIndentMode()\n    void setWrapIndentMode(WrapIndentMode mode);\n\n    //! Displays a user defined list which can be interacted with like an\n    //! auto-completion list.  \\a id is an identifier for the list which is\n    //! passed as an argument to the userListActivated() signal and must be at\n    //! least 1.  \\a list is the text with which the list is populated.\n    //!\n    //! \\sa cancelList(), isListActive(), userListActivated()\n    void showUserList(int id, const QStringList &list);\n\n    //! The standard command set is returned.\n    QsciCommandSet *standardCommands() const {return stdCmds;}\n\n    //! Returns true if the tab key indents a line instead of inserting a tab\n    //! character.  The default is true.\n    //!\n    //! \\sa setTabIndents(), backspaceUnindents(), setBackspaceUnindents()\n    bool tabIndents() const;\n\n    //! Returns the tab width in characters.  The default is 8.\n    //!\n    //! \\sa setTabWidth()\n    int tabWidth() const;\n\n    //! Returns the text of the current document.\n    //!\n    //! \\sa setText()\n    QString text() const;\n\n    //! \\overload\n    //!\n    //! Returns the text of line \\a line.\n    //!\n    //! \\sa setText()\n    QString text(int line) const;\n\n    //! Returns the height in pixels of the text in line number \\a linenr.\n    int textHeight(int linenr) const;\n\n    //! Returns the size of the dots used to represent visible whitespace.\n    //!\n    //! \\sa setWhitespaceSize()\n    int whitespaceSize() const;\n\n    //! Returns the visibility of whitespace.\n    //!\n    //! \\sa setWhitespaceVisibility()\n    WhitespaceVisibility whitespaceVisibility() const;\n\n    //! Returns the word at the \\a line line number and \\a index character\n    //! index.\n    QString wordAtLineIndex(int line, int index) const;\n\n    //! Returns the word at the \\a point pixel coordinates.\n    QString wordAtPoint(const QPoint &point) const;\n\n    //! Returns the set of valid word character as defined by the current\n    //! language lexer.  If there is no current lexer then the set contains an\n    //! an underscore, numbers and all upper and lower case alphabetic\n    //! characters.\n    //!\n    //! \\sa isWordCharacter()\n    const char *wordCharacters() const;\n\n    //! Returns the line wrap mode.\n    //!\n    //! \\sa setWrapMode()\n    WrapMode wrapMode() const;\n\n    //! Returns the line wrap indentation mode.\n    //!\n    //! \\sa setWrapIndentMode()\n    WrapIndentMode wrapIndentMode() const;\n\n    //! Writes the current document to the \\a io device and returns true if\n    //! there was no error.\n    //!\n    //! \\sa read()\n    bool write(QIODevice *io) const;\n\npublic slots:\n    //! Appends the text \\a text to the end of the text edit.  Note that the\n    //! undo/redo history is cleared by this function.\n    virtual void append(const QString &text);\n\n    //! Display an auto-completion list based on any installed APIs, the\n    //! current contents of the document and the characters immediately to the\n    //! left of the cursor.\n    //!\n    //! \\sa autoCompleteFromAPIs(), autoCompleteFromDocument()\n    virtual void autoCompleteFromAll();\n\n    //! Display an auto-completion list based on any installed APIs and the\n    //! characters immediately to the left of the cursor.\n    //!\n    //! \\sa autoCompleteFromAll(), autoCompleteFromDocument(),\n    //! setAutoCompletionAPIs()\n    virtual void autoCompleteFromAPIs();\n\n    //! Display an auto-completion list based on the current contents of the\n    //! document and the characters immediately to the left of the cursor.\n    //!\n    //! \\sa autoCompleteFromAll(), autoCompleteFromAPIs()\n    virtual void autoCompleteFromDocument();\n\n    //! Display a call tip based on the the characters immediately to the left\n    //! of the cursor.\n    virtual void callTip();\n\n    //! Deletes all the text in the text edit.\n    virtual void clear();\n\n    //! Copies any selected text to the clipboard.\n    //!\n    //! \\sa copyAvailable(), cut(), paste()\n    virtual void copy();\n\n    //! Copies any selected text to the clipboard and then deletes the text.\n    //!\n    //! \\sa copy(), paste()\n    virtual void cut();\n\n    //! Ensures that the cursor is visible.\n    virtual void ensureCursorVisible();\n\n    //! Ensures that the line number \\a line is visible.\n    virtual void ensureLineVisible(int line);\n\n    //! If any lines are currently folded then they are all unfolded.\n    //! Otherwise all lines are folded.  This has the same effect as clicking\n    //! in the fold margin with the shift and control keys pressed.  If\n    //! \\a children is not set (the default) then only the top level fold\n    //! points are affected, otherwise the state of all fold points are\n    //! changed.\n    virtual void foldAll(bool children = false);\n\n    //! If the line \\a line is folded then it is unfolded.  Otherwise it is\n    //! folded.  This has the same effect as clicking in the fold margin.\n    virtual void foldLine(int line);\n\n    //! Increases the indentation of line \\a line by an indentation width.\n    //!\n    //! \\sa unindent()\n    virtual void indent(int line);\n\n    //! Insert the text \\a text at the current position.\n    virtual void insert(const QString &text);\n\n    //! Insert the text \\a text in the line \\a line at the position\n    //! \\a index.\n    virtual void insertAt(const QString &text, int line, int index);\n\n    //! If the cursor is either side of a brace character then move it to the\n    //! position of the corresponding brace.\n    virtual void moveToMatchingBrace();\n\n    //! Pastes any text from the clipboard into the text edit at the current\n    //! cursor position.\n    //!\n    //! \\sa copy(), cut()\n    virtual void paste();\n\n    //! Redo the last change or sequence of changes.\n    //!\n    //! \\sa isRedoAvailable()\n    virtual void redo();\n\n    //! Removes any selected text.\n    //!\n    //! \\sa replaceSelectedText()\n    virtual void removeSelectedText();\n\n    //! Replaces any selected text with \\a text.\n    //!\n    //! \\sa removeSelectedText()\n    virtual void replaceSelectedText(const QString &text);\n\n    //! Resets the background colour of selected text to the default.\n    //!\n    //! \\sa setSelectionBackgroundColor(), resetSelectionForegroundColor()\n    virtual void resetSelectionBackgroundColor();\n\n    //! Resets the foreground colour of selected text to the default.\n    //!\n    //! \\sa setSelectionForegroundColor(), resetSelectionBackgroundColor()\n    virtual void resetSelectionForegroundColor();\n\n    //! If \\a select is true (the default) then all the text is selected.  If\n    //! \\a select is false then any currently selected text is deselected.\n    virtual void selectAll(bool select = true);\n\n    //! If the cursor is either side of a brace character then move it to the\n    //! position of the corresponding brace and select the text between the\n    //! braces.\n    virtual void selectToMatchingBrace();\n\n    //! If \\a cs is true then auto-completion lists are case sensitive.  The\n    //! default is true.  Note that setting a lexer may change the case\n    //! sensitivity.\n    //!\n    //! \\sa autoCompletionCaseSensitivity()\n    virtual void setAutoCompletionCaseSensitivity(bool cs);\n\n    //! If \\a replace is true then when an item from an auto-completion list is\n    //! selected, the rest of the word to the right of the current cursor is\n    //! removed.  The default is false.\n    //!\n    //! \\sa autoCompletionReplaceWord()\n    virtual void setAutoCompletionReplaceWord(bool replace);\n\n    //! If \\a single is true then when there is only a single entry in an\n    //! auto-completion list it is automatically used and the list is not\n    //! displayed.  This only has an effect when auto-completion is explicitly\n    //! requested (using autoCompleteFromAPIs() and autoCompleteFromDocument())\n    //! and has no effect when auto-completion is triggered as the user types.\n    //! The default is false.  Note that this is deprecated and\n    //! setAutoCompletionUseSingle() should be used instead.\n    //!\n    //! \\sa autoCompletionShowSingle()\n    virtual void setAutoCompletionShowSingle(bool single);\n\n    //! Sets the source for the auto-completion list when it is being displayed\n    //! automatically as the user types to \\a source.  The default is AcsNone,\n    //! ie. it is disabled.\n    //!\n    //! \\sa autoCompletionSource()\n    virtual void setAutoCompletionSource(AutoCompletionSource source);\n\n    //! Sets the threshold for the automatic display of the auto-completion\n    //! list as the user types to \\a thresh.  The threshold is the number of\n    //! characters that the user must type before the list is displayed.  If\n    //! the threshold is less than or equal to 0 then the list is disabled.\n    //! The default is -1.\n    //!\n    //! \\sa autoCompletionThreshold(), setAutoCompletionWordSeparators()\n    virtual void setAutoCompletionThreshold(int thresh);\n\n    //! Sets the behavior of the auto-completion list when it has a single\n    //! entry.  The default is AcusNever.\n    //!\n    //! \\sa autoCompletionUseSingle()\n    virtual void setAutoCompletionUseSingle(AutoCompletionUseSingle single);\n\n    //! If \\a autoindent is true then auto-indentation is enabled.  The default\n    //! is false.\n    //!\n    //! \\sa autoIndent()\n    virtual void setAutoIndent(bool autoindent);\n\n    //! Sets the brace matching mode to \\a bm.  The default is NoBraceMatching.\n    //!\n    //! \\sa braceMatching()\n    virtual void setBraceMatching(BraceMatch bm);\n\n    //! If \\a deindent is true then the backspace key will unindent a line\n    //! rather then delete a character.\n    //!\n    //! \\sa backspaceUnindents(), tabIndents(), setTabIndents()\n    virtual void setBackspaceUnindents(bool unindent);\n\n    //! Sets the foreground colour of the caret to \\a col.\n    virtual void setCaretForegroundColor(const QColor &col);\n\n    //! Sets the background colour, including the alpha component, of the line\n    //! containing the caret to \\a col.\n    //!\n    //! \\sa setCaretLineVisible()\n    virtual void setCaretLineBackgroundColor(const QColor &col);\n\n    //! Enables or disables, according to \\a enable, the background color of\n    //! the line containing the caret.\n    //!\n    //! \\sa setCaretLineBackgroundColor()\n    virtual void setCaretLineVisible(bool enable);\n\n    //! Sets the width of the caret to \\a width pixels.  A \\a width of 0 makes\n    //! the caret invisible.\n    virtual void setCaretWidth(int width);\n\n    //! The widget's text (ie. foreground) colour is set to \\a c.  This has no\n    //! effect if a language lexer has been set.\n    //!\n    //! \\sa color()\n    virtual void setColor(const QColor &c);\n\n    //! Sets the cursor to the line \\a line at the position \\a index.\n    //!\n    //! \\sa getCursorPosition()\n    virtual void setCursorPosition(int line, int index);\n\n    //! Sets the end-of-line mode to \\a mode.  The default is the platform's\n    //! natural mode.\n    //!\n    //! \\sa eolMode()\n    virtual void setEolMode(EolMode mode);\n\n    //! If \\a visible is true then end-of-lines are made visible.  The default\n    //! is that they are invisible.\n    //!\n    //! \\sa eolVisibility()\n    virtual void setEolVisibility(bool visible);\n\n    //! Sets the folding style for margin \\a margin to \\a fold.  The default\n    //! style is NoFoldStyle (ie. folding is disabled) and the default margin\n    //! is 2.\n    //!\n    //! \\sa folding()\n    virtual void setFolding(FoldStyle fold, int margin = 2);\n\n    //! Sets the indentation of line \\a line to \\a indentation characters.\n    //!\n    //! \\sa indentation()\n    virtual void setIndentation(int line, int indentation);\n\n    //! Enables or disables, according to \\a enable, this display of\n    //! indentation guides.\n    //!\n    //! \\sa indentationGuides()\n    virtual void setIndentationGuides(bool enable);\n\n    //! Set the background colour of indentation guides to \\a col.\n    //!\n    //! \\sa setIndentationGuidesForegroundColor()\n    virtual void setIndentationGuidesBackgroundColor(const QColor &col);\n\n    //! Set the foreground colour of indentation guides to \\a col.\n    //!\n    //! \\sa setIndentationGuidesBackgroundColor()\n    virtual void setIndentationGuidesForegroundColor(const QColor &col);\n\n    //! If \\a tabs is true then indentations are created using tabs and spaces,\n    //! rather than just spaces.\n    //!\n    //! \\sa indentationsUseTabs()\n    virtual void setIndentationsUseTabs(bool tabs);\n\n    //! Sets the indentation width to \\a width characters.  If \\a width is 0\n    //! then the value returned by tabWidth() is used.\n    //!\n    //! \\sa indentationWidth(), tabWidth()\n    virtual void setIndentationWidth(int width);\n\n    //! Sets the specific language lexer used to style text to \\a lex.  If\n    //! \\a lex is 0 then syntax styling is disabled.\n    //!\n    //! \\sa lexer()\n    virtual void setLexer(QsciLexer *lexer = 0);\n\n    //! Set the background colour of all margins to \\a col.  The default is a\n    //! gray.\n    //!\n    //! \\sa setMarginsForegroundColor()\n    virtual void setMarginsBackgroundColor(const QColor &col);\n\n    //! Set the font used in all margins to \\a f.\n    virtual void setMarginsFont(const QFont &f);\n\n    //! Set the foreground colour of all margins to \\a col.  The default is\n    //! black.\n    //!\n    //! \\sa setMarginsBackgroundColor()\n    virtual void setMarginsForegroundColor(const QColor &col);\n\n    //! Enables or disables, according to \\a lnrs, the display of line numbers\n    //! in margin \\a margin.\n    //!\n    //! \\sa marginLineNumbers(), setMarginType(), SCI_SETMARGINTYPEN\n    virtual void setMarginLineNumbers(int margin, bool lnrs);\n\n    //! Sets the marker mask of margin \\a margin to \\a mask.  Only those\n    //! markers whose bit is set in the mask are displayed in the margin.\n    //!\n    //! \\sa marginMarkerMask(), QsciMarker, SCI_SETMARGINMASKN\n    virtual void setMarginMarkerMask(int margin, int mask);\n\n    //! Enables or disables, according to \\a sens, the sensitivity of margin\n    //! \\a margin to mouse clicks.  If the user clicks in a sensitive margin\n    //! the marginClicked() signal is emitted.\n    //!\n    //! \\sa marginSensitivity(), marginClicked(), SCI_SETMARGINSENSITIVEN\n    virtual void setMarginSensitivity(int margin, bool sens);\n\n    //! Sets the width of margin \\a margin to \\a width pixels.  If the width of\n    //! a margin is 0 then it is not displayed.\n    //!\n    //! \\sa marginWidth(), SCI_SETMARGINWIDTHN\n    virtual void setMarginWidth(int margin, int width);\n\n    //! Sets the width of margin \\a margin so that it is wide enough to display\n    //! \\a s in the current margin font.\n    //!\n    //! \\sa marginWidth(), SCI_SETMARGINWIDTHN\n    virtual void setMarginWidth(int margin, const QString &s);\n\n    //! Sets the modified state of the text edit to \\a m.  Note that it is only\n    //! possible to clear the modified state (where \\a m is false).  Attempts\n    //! to set the modified state (where \\a m is true) are ignored.\n    //!\n    //! \\sa isModified(), modificationChanged()\n    virtual void setModified(bool m);\n\n    //! The widget's paper (ie. background) colour is set to \\a c.  This has no\n    //! effect if a language lexer has been set.\n    //!\n    //! \\sa paper()\n    virtual void setPaper(const QColor &c);\n\n    //! Sets the read-only state of the text edit to \\a ro.\n    //!\n    //! \\sa isReadOnly()\n    virtual void setReadOnly(bool ro);\n\n    //! Sets the selection which starts at position \\a indexFrom in line\n    //! \\a lineFrom and ends at position \\a indexTo in line \\a lineTo.  The\n    //! cursor is moved to position \\a indexTo in \\a lineTo.\n    //!\n    //! \\sa getSelection()\n    virtual void setSelection(int lineFrom, int indexFrom, int lineTo,\n            int indexTo);\n\n    //! Sets the background colour, including the alpha component, of selected\n    //! text to \\a col.\n    //!\n    //! \\sa resetSelectionBackgroundColor(), setSelectionForegroundColor()\n    virtual void setSelectionBackgroundColor(const QColor &col);\n\n    //! Sets the foreground colour of selected text to \\a col.\n    //!\n    //! \\sa resetSelectionForegroundColor(), setSelectionBackgroundColor()\n    virtual void setSelectionForegroundColor(const QColor &col);\n\n    //! If \\a indent is true then the tab key will indent a line rather than\n    //! insert a tab character.\n    //!\n    //! \\sa tabIndents(), backspaceUnindents(), setBackspaceUnindents()\n    virtual void setTabIndents(bool indent);\n\n    //! Sets the tab width to \\a width characters.\n    //!\n    //! \\sa tabWidth()\n    virtual void setTabWidth(int width);\n\n    //! Replaces all of the current text with \\a text.  Note that the\n    //! undo/redo history is cleared by this function.\n    //!\n    //! \\sa text()\n    virtual void setText(const QString &text);\n\n    //! Sets the current text encoding.  If \\a cp is true then UTF8 is used,\n    //! otherwise Latin1 is used.\n    //!\n    //! \\sa isUtf8()\n    virtual void setUtf8(bool cp);\n\n    //! Sets the visibility of whitespace to mode \\a mode.  The default is that\n    //! whitespace is invisible.\n    //!\n    //! \\sa whitespaceVisibility()\n    virtual void setWhitespaceVisibility(WhitespaceVisibility mode);\n\n    //! Sets the line wrap mode to \\a mode.  The default is that lines are not\n    //! wrapped.\n    //!\n    //! \\sa wrapMode()\n    virtual void setWrapMode(WrapMode mode);\n\n    //! Undo the last change or sequence of changes.\n    //!\n    //! Scintilla has multiple level undo and redo.  It will continue to record\n    //! undoable actions until memory runs out.  Sequences of typing or\n    //! deleting are compressed into single actions to make it easier to undo\n    //! and redo at a sensible level of detail.  Sequences of actions can be\n    //! combined into actions that are undone as a unit.  These sequences occur\n    //! between calls to beginUndoAction() and endUndoAction().  These\n    //! sequences can be nested and only the top level sequences are undone as\n    //! units. \n    //!\n    //! \\sa beginUndoAction(), endUndoAction(), isUndoAvailable()\n    virtual void undo();\n\n    //! Decreases the indentation of line \\a line by an indentation width.\n    //!\n    //! \\sa indent()\n    virtual void unindent(int line);\n\n    //! Zooms in on the text by by making the base font size \\a range points\n    //! larger and recalculating all font sizes.\n    //!\n    //! \\sa zoomOut(), zoomTo()\n    virtual void zoomIn(int range);\n\n    //! \\overload\n    //!\n    //! Zooms in on the text by by making the base font size one point larger\n    //! and recalculating all font sizes.\n    virtual void zoomIn();\n\n    //! Zooms out on the text by by making the base font size \\a range points\n    //! smaller and recalculating all font sizes.\n    //!\n    //! \\sa zoomIn(), zoomTo()\n    virtual void zoomOut(int range);\n\n    //! \\overload\n    //!\n    //! Zooms out on the text by by making the base font size one point larger\n    //! and recalculating all font sizes.\n    virtual void zoomOut();\n\n    //! Zooms the text by making the base font size \\a size points and\n    //! recalculating all font sizes.\n    //!\n    //! \\sa zoomIn(), zoomOut()\n    virtual void zoomTo(int size);\n\nsignals:\n    //! This signal is emitted whenever the cursor position changes.  \\a line\n    //! contains the line number and \\a index contains the character index\n    //! within the line.\n    void cursorPositionChanged(int line, int index);\n\n    //! This signal is emitted whenever text is selected or de-selected.\n    //! \\a yes is true if text has been selected and false if text has been\n    //! deselected.  If \\a yes is true then copy() can be used to copy the\n    //! selection to the clipboard.  If \\a yes is false then copy() does\n    //! nothing. \n    //!\n    //! \\sa copy(), selectionChanged()\n    void copyAvailable(bool yes);\n\n    //! This signal is emitted whenever the user clicks on an indicator.  \\a\n    //! line is the number of the line where the user clicked.  \\a index is the\n    //! character index within the line.  \\a state is the state of the modifier\n    //! keys (ShiftButton, ControlButton and AltButton) when the user clicked.\n    //!\n    //! \\sa indicatorReleased()\n    void indicatorClicked(int line, int index, Qt::ButtonState state);\n\n    //! This signal is emitted whenever the user releases the mouse on an\n    //! indicator.  \\a line is the number of the line where the user clicked.\n    //! \\a index is the character index within the line.  \\a state is the state\n    //! of the modifier keys (ShiftButton, ControlButton and AltButton) when\n    //! the user released the mouse.\n    //!\n    //! \\sa indicatorClicked()\n    void indicatorReleased(int line, int index, Qt::ButtonState state);\n\n    //! This signal is emitted whenever the number of lines of text changes.\n    void linesChanged();\n\n    //! This signal is emitted whenever the user clicks on a sensitive margin.\n    //! \\a margin is the margin.  \\a line is the number of the line where the\n    //! user clicked.  \\a state is the state of the modifier keys (ShiftButton,\n    //! ControlButton and AltButton) when the user clicked.\n    //!\n    //! \\sa marginSensitivity(), setMarginSensitivity()\n    void marginClicked(int margin, int line, Qt::ButtonState state);\n\n    //! This signal is emitted whenever the user attempts to modify read-only\n    //! text.\n    //!\n    //! \\sa isReadOnly(), setReadOnly()\n    void modificationAttempted();\n\n    //! This signal is emitted whenever the modification state of the text\n    //! changes.  \\a m is true if the text has been modified.\n    //!\n    //! \\sa isModified(), setModified()\n    void modificationChanged(bool m);\n\n    //! This signal is emitted whenever the selection changes.\n    //!\n    //! \\sa copyAvailable()\n    void selectionChanged();\n\n    //! This signal is emitted whenever the text in the text edit changes.\n    void textChanged();\n\n    //! This signal is emitted when an item in a user defined list is activated\n    //! (selected).  \\a id is the list identifier.  \\a string is the text of\n    //! the item.\n    //!\n    //! \\sa showUserList()\n    void userListActivated(int id, const QString &string);\n\nprotected:\n\nprivate slots:\n    void handleCallTipClick(int dir);\n    void handleCharAdded(int charadded);\n    void handleIndicatorClick(int pos, int modifiers);\n    void handleIndicatorRelease(int pos, int modifiers);\n    void handleMarginClick(int pos, int margin, int modifiers);\n    void handleModified(int pos, int mtype, const char *text, int len,\n            int added, int line, int foldNow, int foldPrev, int token,\n            int annotationLinesAdded);\n    void handlePropertyChange(const char *prop, const char *val);\n    void handleSavePointReached();\n    void handleSavePointLeft();\n    void handleSelectionChanged(bool yes);\n    void handleAutoCompletionSelection();\n    void handleUserListSelection(const char *text, int id);\n\n    void handleStyleColorChange(const QColor &c, int style);\n    void handleStyleEolFillChange(bool eolfill, int style);\n    void handleStyleFontChange(const QFont &f, int style);\n    void handleStylePaperChange(const QColor &c, int style);\n\n    void handleUpdateUI(int updated);\n\n\nprivate:\n    void detachLexer();\n\n    enum IndentState {\n        isNone,\n        isKeywordStart,\n        isBlockStart,\n        isBlockEnd\n    };\n\n    void maintainIndentation(char ch, long pos);\n    void autoIndentation(char ch, long pos);\n    void autoIndentLine(long pos, int line, int indent);\n    int blockIndent(int line);\n    IndentState getIndentState(int line);\n    bool rangeIsWhitespace(long spos, long epos);\n    int findStyledWord(const char *text, int style, const char *words);\n\n    void checkMarker(int &markerNumber);\n    void checkIndicator(int &indicatorNumber);\n    static void allocateId(int &id, unsigned &allocated, int min, int max);\n    int currentIndent() const;\n    int indentWidth() const;\n    bool doFind();\n    int simpleFind();\n    void foldClick(int lineClick, int bstate);\n    void foldChanged(int line, int levelNow, int levelPrev);\n    void foldExpand(int &line, bool doExpand, bool force = false,\n            int visLevels = 0, int level = -1);\n    void setFoldMarker(int marknr, int mark = SC_MARK_EMPTY);\n    void setLexerStyle(int style);\n    void setStylesFont(const QFont &f, int style);\n    void setEnabledColors(int style, QColor &fore, QColor &back);\n\n    void braceMatch();\n    bool findMatchingBrace(long &brace, long &other, BraceMatch mode);\n    long checkBrace(long pos, int brace_style, bool &colonMode);\n    void gotoMatchingBrace(bool select);\n\n    void startAutoCompletion(AutoCompletionSource acs, bool checkThresh,\n            bool choose_single);\n\n    int adjustedCallTipPosition(int ctshift) const;\n    bool getSeparator(int &pos) const;\n    QString getWord(int &pos) const;\n    char getCharacter(int &pos) const;\n    bool isStartChar(char ch) const;\n\n    bool ensureRW();\n    void insertAtPos(const QString &text, int pos);\n    static int mapModifiers(int modifiers);\n\n    QString wordAtPosition(int position) const;\n\n    ScintillaBytes styleText(const QValueList<QsciStyledText> &styled_text,\n            char **styles, int style_offset = 0);\n\n    struct FindState\n    {\n        enum Status\n        {\n            Finding,\n            FindingInSelection,\n            Idle\n        };\n\n        FindState() : status(Idle) {}\n\n        Status status;\n        QString expr;\n        bool wrap;\n        bool forward;\n        int flags;\n        long startpos, startpos_orig;\n        long endpos, endpos_orig;\n        bool show;\n    };\n\n    FindState findState;\n\n    unsigned allocatedMarkers;\n    unsigned allocatedIndicators;\n    int oldPos;\n    int ctPos;\n    bool selText;\n    FoldStyle fold;\n    int foldmargin;\n    bool autoInd;\n    BraceMatch braceMode;\n    AutoCompletionSource acSource;\n    int acThresh;\n    QStringList wseps;\n    const char *wchars;\n    CallTipsPosition call_tips_position;\n    CallTipsStyle call_tips_style;\n    int maxCallTips;\n    QStringList ct_entries;\n    int ct_cursor;\n    QValueList<int> ct_shifts;\n    AutoCompletionUseSingle use_single;\n    QGuardedPtr<QsciLexer> lex;\n    QsciCommandSet *stdCmds;\n    QsciDocument doc;\n    QColor nl_text_colour;\n    QColor nl_paper_colour;\n    QCString explicit_fillups;\n    bool fillups_enabled;\n\n    // The following allow QsciListBoxQt to distinguish between an\n    // auto-completion list and a user list, and to return the full selection\n    // of an auto-completion list.\n    friend class QsciListBoxQt;\n\n    QString acSelection;\n    bool isAutoCompletionList() const;\n\n\n    QsciScintilla(const QsciScintilla &);\n    QsciScintilla &operator=(const QsciScintilla &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qsciscintillabase.h",
    "content": "// This class defines the \"official\" low-level API.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCISCINTILLABASE_H\n#define QSCISCINTILLABASE_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qglobal.h>\n\n#include <qcstring.h>\n#include <qwidget.h>\n\n#include <qpoint.h>\n#include <qtimer.h>\n\n#include <Qsci/qsciglobal.h>\n\n\nQT_BEGIN_NAMESPACE\nclass QColor;\nclass QImage;\nclass QPainter;\nclass QPixmap;\nclass QObject;\nclass QScrollBar;\nQT_END_NAMESPACE\n\nclass QsciScintillaQt;\n\n\n//! \\brief The QsciScintillaBase class implements the Scintilla editor widget\n//! and its low-level API.\n//!\n//! Scintilla (http://www.scintilla.org) is a powerful C++ editor class that\n//! supports many features including syntax styling, error indicators, code\n//! completion and call tips. It is particularly useful as a programmer's\n//! editor.\n//!\n//! QsciScintillaBase is a port to Qt of Scintilla. It implements the standard\n//! Scintilla API which consists of a number of messages each taking up to\n//! two arguments.\n//!\n//! See QsciScintilla for the implementation of a higher level API that is more\n//! consistent with the rest of the Qt toolkit.\nclass QSCINTILLA_EXPORT QsciScintillaBase : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    //! The low-level Scintilla API is implemented as a set of messages each of\n    //! which takes up to two parameters (\\a wParam and \\a lParam) and\n    //! optionally return a value. This enum defines all the possible messages.\n    enum\n    {\n        //!\n        SCI_START = 2000,\n\n        //!\n        SCI_OPTIONAL_START = 3000,\n\n        //!\n        SCI_LEXER_START = 4000,\n\n        //! This message appends some text to the end of the document.\n        //! \\a wParam is the length of the text.\n        //! \\a lParam is the text to be appended.\n        SCI_ADDTEXT = 2001,\n\n        //!\n        SCI_ADDSTYLEDTEXT = 2002,\n\n        //!\n        SCI_INSERTTEXT = 2003,\n\n        //!\n        SCI_CLEARALL = 2004,\n\n        //!\n        SCI_CLEARDOCUMENTSTYLE = 2005,\n\n        //!\n        SCI_GETLENGTH = 2006,\n\n        //!\n        SCI_GETCHARAT = 2007,\n\n        //! This message returns the current position.\n        //! \n        //! \\sa SCI_SETCURRENTPOS\n        SCI_GETCURRENTPOS = 2008,\n\n        //! This message returns the anchor.\n        //! \n        //! \\sa SCI_SETANCHOR\n        SCI_GETANCHOR = 2009,\n\n        //!\n        SCI_GETSTYLEAT = 2010,\n\n        //!\n        SCI_REDO = 2011,\n\n        //!\n        SCI_SETUNDOCOLLECTION = 2012,\n\n        //!\n        SCI_SELECTALL = 2013,\n\n        //! This message marks the current state of the text as the the save\n        //! point. This is usually done when the text is saved or loaded.\n        //! \n        //! \\sa SCN_SAVEPOINTREACHED(), SCN_SAVEPOINTLEFT()\n        SCI_SETSAVEPOINT = 2014,\n\n        //!\n        SCI_GETSTYLEDTEXT = 2015,\n\n        //!\n        SCI_CANREDO = 2016,\n\n        //! This message returns the line that contains a particular instance\n        //! of a marker.\n        //! \\a wParam is the handle of the marker.\n        //!\n        //! \\sa SCI_MARKERADD\n        SCI_MARKERLINEFROMHANDLE = 2017,\n\n        //! This message removes a particular instance of a marker.\n        //! \\a wParam is the handle of the marker.\n        //!\n        //! \\sa SCI_MARKERADD\n        SCI_MARKERDELETEHANDLE = 2018,\n\n        //!\n        SCI_GETUNDOCOLLECTION = 2019,\n\n        //!\n        SCI_GETVIEWWS = 2020,\n\n        //!\n        SCI_SETVIEWWS = 2021,\n\n        //!\n        SCI_POSITIONFROMPOINT = 2022,\n\n        //!\n        SCI_POSITIONFROMPOINTCLOSE = 2023,\n\n        //!\n        SCI_GOTOLINE = 2024,\n\n        //! This message clears the current selection and sets the current\n        //! position.\n        //! \\a wParam is the new current position.\n        //! \n        //! \\sa SCI_SETCURRENTPOS\n        SCI_GOTOPOS = 2025,\n\n        //! This message sets the anchor.\n        //! \\a wParam is the new anchor.\n        //! \n        //! \\sa SCI_GETANCHOR\n        SCI_SETANCHOR = 2026,\n\n        //!\n        SCI_GETCURLINE = 2027,\n\n        //! This message returns the character position of the start of the\n        //! text that needs to be syntax styled.\n        //! \n        //! \\sa SCN_STYLENEEDED()\n        SCI_GETENDSTYLED = 2028,\n\n        //!\n        SCI_CONVERTEOLS = 2029,\n\n        //!\n        SCI_GETEOLMODE = 2030,\n\n        //!\n        SCI_SETEOLMODE = 2031,\n\n        //!\n        SCI_STARTSTYLING = 2032,\n\n        //!\n        SCI_SETSTYLING = 2033,\n\n        //!\n        SCI_GETBUFFEREDDRAW = 2034,\n\n        //!\n        SCI_SETBUFFEREDDRAW = 2035,\n\n        //!\n        SCI_SETTABWIDTH = 2036,\n\n        //!\n        SCI_GETTABWIDTH = 2121,\n\n        //!\n        SCI_SETCODEPAGE = 2037,\n\n        //! This message sets the symbol used to draw one of 32 markers.  Some\n        //! markers have pre-defined uses, see the SC_MARKNUM_* values.\n        //! \\a wParam is the number of the marker.\n        //! \\a lParam is the marker symbol and is one of the SC_MARK_* values.\n        //!\n        //! \\sa SCI_MARKERADD, SCI_MARKERDEFINEPIXMAP,\n        //! SCI_MARKERDEFINERGBAIMAGE\n        SCI_MARKERDEFINE = 2040,\n\n        //! This message sets the foreground colour used to draw a marker.  A\n        //! colour is represented as a 24 bit value.  The 8 least significant\n        //! bits correspond to red, the middle 8 bits correspond to green, and\n        //! the 8 most significant bits correspond to blue.  The default value\n        //! is 0x000000.\n        //! \\a wParam is the number of the marker.\n        //! \\a lParam is the colour.\n        //!\n        //! \\sa SCI_MARKERSETBACK\n        SCI_MARKERSETFORE = 2041,\n\n        //! This message sets the background colour used to draw a marker.  A\n        //! colour is represented as a 24 bit value.  The 8 least significant\n        //! bits correspond to red, the middle 8 bits correspond to green, and\n        //! the 8 most significant bits correspond to blue.  The default value\n        //! is 0xffffff.\n        //! \\a wParam is the number of the marker.\n        //! \\a lParam is the colour.\n        //!\n        //! \\sa SCI_MARKERSETFORE\n        SCI_MARKERSETBACK = 2042,\n\n        //! This message adds a marker to a line.  A handle for the marker is\n        //! returned which can be used to track the marker's position.\n        //! \\a wParam is the line number.\n        //! \\a lParam is the number of the marker.\n        //!\n        //! \\sa SCI_MARKERDELETE, SCI_MARKERDELETEALL,\n        //! SCI_MARKERDELETEHANDLE\n        SCI_MARKERADD = 2043,\n\n        //! This message deletes a marker from a line.\n        //! \\a wParam is the line number.\n        //! \\a lParam is the number of the marker.\n        //!\n        //! \\sa SCI_MARKERADD, SCI_MARKERDELETEALL\n        SCI_MARKERDELETE = 2044,\n\n        //! This message deletes all occurences of a marker.\n        //! \\a wParam is the number of the marker.  If \\a wParam is -1 then all\n        //! markers are removed.\n        //!\n        //! \\sa SCI_MARKERADD, SCI_MARKERDELETE\n        SCI_MARKERDELETEALL = 2045,\n\n        //! This message returns the 32 bit mask of markers at a line.\n        //! \\a wParam is the line number.\n        SCI_MARKERGET = 2046,\n\n        //! This message looks for the next line to contain at least one marker\n        //! contained in a 32 bit mask of markers and returns the line number.\n        //! \\a wParam is the line number to start the search from.\n        //! \\a lParam is the mask of markers to search for.\n        //!\n        //! \\sa SCI_MARKERPREVIOUS\n        SCI_MARKERNEXT = 2047,\n\n        //! This message looks for the previous line to contain at least one\n        //! marker contained in a 32 bit mask of markers and returns the line\n        //! number.\n        //! \\a wParam is the line number to start the search from.\n        //! \\a lParam is the mask of markers to search for.\n        //!\n        //! \\sa SCI_MARKERNEXT\n        SCI_MARKERPREVIOUS = 2048,\n\n        //! This message sets the symbol used to draw one of the 32 markers to\n        //! a pixmap.  Pixmaps use the SC_MARK_PIXMAP marker symbol.\n        //! \\a wParam is the number of the marker.\n        //! \\a lParam is a pointer to a QPixmap instance.  Note that in other\n        //! ports of Scintilla this is a pointer to either raw or textual XPM\n        //! image data.\n        //!\n        //! \\sa SCI_MARKERDEFINE, SCI_MARKERDEFINERGBAIMAGE\n        SCI_MARKERDEFINEPIXMAP = 2049,\n\n        //! This message sets what can be displayed in a margin.\n        //! \\a wParam is the number of the margin.\n        //! \\a lParam is the logical or of the SC_MARGIN_* values.\n        //!\n        //! \\sa SCI_GETMARGINTYPEN\n        SCI_SETMARGINTYPEN = 2240,\n\n        //! This message returns what can be displayed in a margin.\n        //! \\a wParam is the number of the margin.\n        //!\n        //! \\sa SCI_SETMARGINTYPEN\n        SCI_GETMARGINTYPEN = 2241,\n\n        //! This message sets the width of a margin in pixels.\n        //! \\a wParam is the number of the margin.\n        //! \\a lParam is the new margin width.\n        //!\n        //! \\sa SCI_GETMARGINWIDTHN\n        SCI_SETMARGINWIDTHN = 2242,\n\n        //! This message returns the width of a margin in pixels.\n        //! \\a wParam is the number of the margin.\n        //!\n        //! \\sa SCI_SETMARGINWIDTHN\n        SCI_GETMARGINWIDTHN = 2243,\n\n        //! This message sets the mask of a margin.  The mask is a 32 value\n        //! with one bit for each possible marker.  If a bit is set then the\n        //! corresponding marker is displayed.  By default, all markers are\n        //! displayed.\n        //! \\a wParam is the number of the margin.\n        //! \\a lParam is the new margin mask.\n        //!\n        //! \\sa SCI_GETMARGINMASKN, SCI_MARKERDEFINE\n        SCI_SETMARGINMASKN = 2244,\n\n        //! This message returns the mask of a margin.\n        //! \\a wParam is the number of the margin.\n        //!\n        //! \\sa SCI_SETMARGINMASKN\n        SCI_GETMARGINMASKN = 2245,\n\n        //! This message sets the sensitivity of a margin to mouse clicks.\n        //! \\a wParam is the number of the margin.\n        //! \\a lParam is non-zero to make the margin sensitive to mouse clicks.\n        //! When the mouse is clicked the SCN_MARGINCLICK() signal is emitted.\n        //!\n        //! \\sa SCI_GETMARGINSENSITIVEN, SCN_MARGINCLICK()\n        SCI_SETMARGINSENSITIVEN = 2246,\n\n        //! This message returns the sensitivity of a margin to mouse clicks.\n        //! \\a wParam is the number of the margin.\n        //!\n        //! \\sa SCI_SETMARGINSENSITIVEN, SCN_MARGINCLICK()\n        SCI_GETMARGINSENSITIVEN = 2247,\n\n        //! This message sets the cursor shape displayed over a margin.\n        //! \\a wParam is the number of the margin.\n        //! \\a lParam is the cursor shape, normally either SC_CURSORARROW or\n        //! SC_CURSORREVERSEARROW.  Note that, currently, QScintilla implements\n        //! both of these as Qt::ArrowCursor.\n        //!\n        //! \\sa SCI_GETMARGINCURSORN\n        SCI_SETMARGINCURSORN = 2248,\n\n        //! This message returns the cursor shape displayed over a margin.\n        //! \\a wParam is the number of the margin.\n        //!\n        //! \\sa SCI_SETMARGINCURSORN\n        SCI_GETMARGINCURSORN = 2249,\n\n        //!\n        SCI_STYLECLEARALL = 2050,\n\n        //!\n        SCI_STYLESETFORE = 2051,\n\n        //!\n        SCI_STYLESETBACK = 2052,\n\n        //!\n        SCI_STYLESETBOLD = 2053,\n\n        //!\n        SCI_STYLESETITALIC = 2054,\n\n        //!\n        SCI_STYLESETSIZE = 2055,\n\n        //!\n        SCI_STYLESETFONT = 2056,\n\n        //!\n        SCI_STYLESETEOLFILLED = 2057,\n\n        //!\n        SCI_STYLERESETDEFAULT = 2058,\n\n        //!\n        SCI_STYLESETUNDERLINE = 2059,\n\n        //!\n        SCI_STYLESETCASE = 2060,\n\n        //!\n        SCI_STYLESETSIZEFRACTIONAL = 2061,\n\n        //!\n        SCI_STYLEGETSIZEFRACTIONAL = 2062,\n\n        //!\n        SCI_STYLESETWEIGHT = 2063,\n\n        //!\n        SCI_STYLEGETWEIGHT = 2064,\n\n        //!\n        SCI_STYLESETCHARACTERSET = 2066,\n\n        //!\n        SCI_SETSELFORE = 2067,\n\n        //!\n        SCI_SETSELBACK = 2068,\n\n        //!\n        SCI_SETCARETFORE = 2069,\n\n        //!\n        SCI_ASSIGNCMDKEY = 2070,\n\n        //!\n        SCI_CLEARCMDKEY = 2071,\n\n        //!\n        SCI_CLEARALLCMDKEYS = 2072,\n\n        //!\n        SCI_SETSTYLINGEX = 2073,\n\n        //!\n        SCI_STYLESETVISIBLE = 2074,\n\n        //!\n        SCI_GETCARETPERIOD = 2075,\n\n        //!\n        SCI_SETCARETPERIOD = 2076,\n\n        //!\n        SCI_SETWORDCHARS = 2077,\n\n        //!\n        SCI_BEGINUNDOACTION = 2078,\n\n        //!\n        SCI_ENDUNDOACTION = 2079,\n\n        //!\n        SCI_INDICSETSTYLE = 2080,\n\n        //!\n        SCI_INDICGETSTYLE = 2081,\n\n        //!\n        SCI_INDICSETFORE = 2082,\n\n        //!\n        SCI_INDICGETFORE = 2083,\n\n        //!\n        SCI_SETWHITESPACEFORE = 2084,\n\n        //!\n        SCI_SETWHITESPACEBACK = 2085,\n\n        //!\n        SCI_SETWHITESPACESIZE = 2086,\n\n        //!\n        SCI_GETWHITESPACESIZE = 2087,\n\n        //!\n        SCI_SETSTYLEBITS = 2090,\n\n        //!\n        SCI_GETSTYLEBITS = 2091,\n\n        //!\n        SCI_SETLINESTATE = 2092,\n\n        //!\n        SCI_GETLINESTATE = 2093,\n\n        //!\n        SCI_GETMAXLINESTATE = 2094,\n\n        //!\n        SCI_GETCARETLINEVISIBLE = 2095,\n\n        //!\n        SCI_SETCARETLINEVISIBLE = 2096,\n\n        //!\n        SCI_GETCARETLINEBACK = 2097,\n\n        //!\n        SCI_SETCARETLINEBACK = 2098,\n\n        //!\n        SCI_STYLESETCHANGEABLE = 2099,\n\n        //!\n        SCI_AUTOCSHOW = 2100,\n\n        //!\n        SCI_AUTOCCANCEL = 2101,\n\n        //!\n        SCI_AUTOCACTIVE = 2102,\n\n        //!\n        SCI_AUTOCPOSSTART = 2103,\n\n        //!\n        SCI_AUTOCCOMPLETE = 2104,\n\n        //!\n        SCI_AUTOCSTOPS = 2105,\n\n        //!\n        SCI_AUTOCSETSEPARATOR = 2106,\n\n        //!\n        SCI_AUTOCGETSEPARATOR = 2107,\n\n        //!\n        SCI_AUTOCSELECT = 2108,\n\n        //!\n        SCI_AUTOCSETCANCELATSTART = 2110,\n\n        //!\n        SCI_AUTOCGETCANCELATSTART = 2111,\n\n        //!\n        SCI_AUTOCSETFILLUPS = 2112,\n\n        //!\n        SCI_AUTOCSETCHOOSESINGLE = 2113,\n\n        //!\n        SCI_AUTOCGETCHOOSESINGLE = 2114,\n\n        //!\n        SCI_AUTOCSETIGNORECASE = 2115,\n\n        //!\n        SCI_AUTOCGETIGNORECASE = 2116,\n\n        //!\n        SCI_USERLISTSHOW = 2117,\n\n        //!\n        SCI_AUTOCSETAUTOHIDE = 2118,\n\n        //!\n        SCI_AUTOCGETAUTOHIDE = 2119,\n\n        //!\n        SCI_AUTOCSETDROPRESTOFWORD = 2270,\n\n        //!\n        SCI_AUTOCGETDROPRESTOFWORD = 2271,\n\n        //!\n        SCI_SETINDENT = 2122,\n\n        //!\n        SCI_GETINDENT = 2123,\n\n        //!\n        SCI_SETUSETABS = 2124,\n\n        //!\n        SCI_GETUSETABS = 2125,\n\n        //!\n        SCI_SETLINEINDENTATION = 2126,\n\n        //!\n        SCI_GETLINEINDENTATION = 2127,\n\n        //!\n        SCI_GETLINEINDENTPOSITION = 2128,\n\n        //!\n        SCI_GETCOLUMN = 2129,\n\n        //!\n        SCI_SETHSCROLLBAR = 2130,\n\n        //!\n        SCI_GETHSCROLLBAR = 2131,\n\n        //!\n        SCI_SETINDENTATIONGUIDES = 2132,\n\n        //!\n        SCI_GETINDENTATIONGUIDES = 2133,\n\n        //!\n        SCI_SETHIGHLIGHTGUIDE = 2134,\n\n        //!\n        SCI_GETHIGHLIGHTGUIDE = 2135,\n\n        //!\n        SCI_GETLINEENDPOSITION = 2136,\n\n        //!\n        SCI_GETCODEPAGE = 2137,\n\n        //!\n        SCI_GETCARETFORE = 2138,\n\n        //! This message returns a non-zero value if the document is read-only.\n        //! \n        //! \\sa SCI_SETREADONLY\n        SCI_GETREADONLY = 2140,\n\n        //! This message sets the current position.\n        //! \\a wParam is the new current position.\n        //! \n        //! \\sa SCI_GETCURRENTPOS\n        SCI_SETCURRENTPOS = 2141,\n\n        //!\n        SCI_SETSELECTIONSTART = 2142,\n\n        //!\n        SCI_GETSELECTIONSTART = 2143,\n\n        //!\n        SCI_SETSELECTIONEND = 2144,\n\n        //!\n        SCI_GETSELECTIONEND = 2145,\n\n        //!\n        SCI_SETPRINTMAGNIFICATION = 2146,\n\n        //!\n        SCI_GETPRINTMAGNIFICATION = 2147,\n\n        //!\n        SCI_SETPRINTCOLOURMODE = 2148,\n\n        //!\n        SCI_GETPRINTCOLOURMODE = 2149,\n\n        //!\n        SCI_FINDTEXT = 2150,\n\n        //!\n        SCI_FORMATRANGE = 2151,\n\n        //!\n        SCI_GETFIRSTVISIBLELINE = 2152,\n\n        //!\n        SCI_GETLINE = 2153,\n\n        //!\n        SCI_GETLINECOUNT = 2154,\n\n        //!\n        SCI_SETMARGINLEFT = 2155,\n\n        //!\n        SCI_GETMARGINLEFT = 2156,\n\n        //!\n        SCI_SETMARGINRIGHT = 2157,\n\n        //!\n        SCI_GETMARGINRIGHT = 2158,\n\n        //! This message returns a non-zero value if the document has been\n        //! modified.\n        SCI_GETMODIFY = 2159,\n\n        //!\n        SCI_SETSEL = 2160,\n\n        //!\n        SCI_GETSELTEXT = 2161,\n\n        //!\n        SCI_GETTEXTRANGE = 2162,\n\n        //!\n        SCI_HIDESELECTION = 2163,\n\n        //!\n        SCI_POINTXFROMPOSITION = 2164,\n\n        //!\n        SCI_POINTYFROMPOSITION = 2165,\n\n        //!\n        SCI_LINEFROMPOSITION = 2166,\n\n        //!\n        SCI_POSITIONFROMLINE = 2167,\n\n        //!\n        SCI_LINESCROLL = 2168,\n\n        //!\n        SCI_SCROLLCARET = 2169,\n\n        //!\n        SCI_REPLACESEL = 2170,\n\n        //! This message sets the read-only state of the document.\n        //! \\a wParam is the new read-only state of the document.\n        //! \n        //! \\sa SCI_GETREADONLY\n        SCI_SETREADONLY = 2171,\n\n        //!\n        SCI_NULL = 2172,\n\n        //!\n        SCI_CANPASTE = 2173,\n\n        //!\n        SCI_CANUNDO = 2174,\n\n        //! This message empties the undo buffer.\n        SCI_EMPTYUNDOBUFFER = 2175,\n\n        //!\n        SCI_UNDO = 2176,\n\n        //!\n        SCI_CUT = 2177,\n\n        //!\n        SCI_COPY = 2178,\n\n        //!\n        SCI_PASTE = 2179,\n\n        //!\n        SCI_CLEAR = 2180,\n\n        //! This message sets the text of the document.\n        //! \\a wParam is unused.\n        //! \\a lParam is the new text of the document.\n        //! \n        //! \\sa SCI_GETTEXT\n        SCI_SETTEXT = 2181,\n\n        //! This message gets the text of the document.\n        //! \\a wParam is size of the buffer that the text is copied to.\n        //! \\a lParam is the address of the buffer that the text is copied to.\n        //! \n        //! \\sa SCI_SETTEXT\n        SCI_GETTEXT = 2182,\n\n        //! This message returns the length of the document.\n        SCI_GETTEXTLENGTH = 2183,\n\n        //!\n        SCI_GETDIRECTFUNCTION = 2184,\n\n        //!\n        SCI_GETDIRECTPOINTER = 2185,\n\n        //!\n        SCI_SETOVERTYPE = 2186,\n\n        //!\n        SCI_GETOVERTYPE = 2187,\n\n        //!\n        SCI_SETCARETWIDTH = 2188,\n\n        //!\n        SCI_GETCARETWIDTH = 2189,\n\n        //!\n        SCI_SETTARGETSTART = 2190,\n\n        //!\n        SCI_GETTARGETSTART = 2191,\n\n        //!\n        SCI_SETTARGETEND = 2192,\n\n        //!\n        SCI_GETTARGETEND = 2193,\n\n        //!\n        SCI_REPLACETARGET = 2194,\n\n        //!\n        SCI_REPLACETARGETRE = 2195,\n\n        //!\n        SCI_SEARCHINTARGET = 2197,\n\n        //!\n        SCI_SETSEARCHFLAGS = 2198,\n\n        //!\n        SCI_GETSEARCHFLAGS = 2199,\n\n        //!\n        SCI_CALLTIPSHOW = 2200,\n\n        //!\n        SCI_CALLTIPCANCEL = 2201,\n\n        //!\n        SCI_CALLTIPACTIVE = 2202,\n\n        //!\n        SCI_CALLTIPPOSSTART = 2203,\n\n        //!\n        SCI_CALLTIPSETHLT = 2204,\n\n        //!\n        SCI_CALLTIPSETBACK = 2205,\n\n        //!\n        SCI_CALLTIPSETFORE = 2206,\n\n        //!\n        SCI_CALLTIPSETFOREHLT = 2207,\n\n        //!\n        SCI_AUTOCSETMAXWIDTH = 2208,\n\n        //!\n        SCI_AUTOCGETMAXWIDTH = 2209,\n\n        //! This message is not implemented.\n        SCI_AUTOCSETMAXHEIGHT = 2210,\n\n        //!\n        SCI_AUTOCGETMAXHEIGHT = 2211,\n\n        //!\n        SCI_CALLTIPUSESTYLE = 2212,\n\n        //!\n        SCI_CALLTIPSETPOSITION = 2213,\n\n        //!\n        SCI_VISIBLEFROMDOCLINE = 2220,\n\n        //!\n        SCI_DOCLINEFROMVISIBLE = 2221,\n\n        //!\n        SCI_SETFOLDLEVEL = 2222,\n\n        //!\n        SCI_GETFOLDLEVEL = 2223,\n\n        //!\n        SCI_GETLASTCHILD = 2224,\n\n        //!\n        SCI_GETFOLDPARENT = 2225,\n\n        //!\n        SCI_SHOWLINES = 2226,\n\n        //!\n        SCI_HIDELINES = 2227,\n\n        //!\n        SCI_GETLINEVISIBLE = 2228,\n\n        //!\n        SCI_SETFOLDEXPANDED = 2229,\n\n        //!\n        SCI_GETFOLDEXPANDED = 2230,\n\n        //!\n        SCI_TOGGLEFOLD = 2231,\n\n        //!\n        SCI_ENSUREVISIBLE = 2232,\n\n        //!\n        SCI_SETFOLDFLAGS = 2233,\n\n        //!\n        SCI_ENSUREVISIBLEENFORCEPOLICY = 2234,\n\n        //!\n        SCI_WRAPCOUNT = 2235,\n\n        //!\n        SCI_GETALLLINESVISIBLE = 2236,\n\n        //!\n        SCI_FOLDLINE = 2237,\n\n        //!\n        SCI_FOLDCHILDREN = 2238,\n\n        //!\n        SCI_EXPANDCHILDREN = 2239,\n\n        //!\n        SCI_SETTABINDENTS = 2260,\n\n        //!\n        SCI_GETTABINDENTS = 2261,\n\n        //!\n        SCI_SETBACKSPACEUNINDENTS = 2262,\n\n        //!\n        SCI_GETBACKSPACEUNINDENTS = 2263,\n\n        //!\n        SCI_SETMOUSEDWELLTIME = 2264,\n\n        //!\n        SCI_GETMOUSEDWELLTIME = 2265,\n\n        //!\n        SCI_WORDSTARTPOSITION = 2266,\n\n        //!\n        SCI_WORDENDPOSITION = 2267,\n\n        //!\n        SCI_SETWRAPMODE = 2268,\n\n        //!\n        SCI_GETWRAPMODE = 2269,\n\n        //!\n        SCI_SETLAYOUTCACHE = 2272,\n\n        //!\n        SCI_GETLAYOUTCACHE = 2273,\n\n        //!\n        SCI_SETSCROLLWIDTH = 2274,\n\n        //!\n        SCI_GETSCROLLWIDTH = 2275,\n\n        //! This message returns the width of some text when rendered in a\n        //! particular style.\n        //! \\a wParam is the style number and is one of the STYLE_* values or\n        //! one of the styles defined by a lexer.\n        //! \\a lParam is a pointer to the text.\n        SCI_TEXTWIDTH = 2276,\n\n        //!\n        SCI_SETENDATLASTLINE = 2277,\n\n        //!\n        SCI_GETENDATLASTLINE = 2278,\n\n        //!\n        SCI_TEXTHEIGHT = 2279,\n\n        //!\n        SCI_SETVSCROLLBAR = 2280,\n\n        //!\n        SCI_GETVSCROLLBAR = 2281,\n\n        //!\n        SCI_APPENDTEXT = 2282,\n\n        //!\n        SCI_GETTWOPHASEDRAW = 2283,\n\n        //!\n        SCI_SETTWOPHASEDRAW = 2284,\n\n        //!\n        SCI_AUTOCGETTYPESEPARATOR = 2285,\n\n        //!\n        SCI_AUTOCSETTYPESEPARATOR = 2286,\n\n        //!\n        SCI_TARGETFROMSELECTION = 2287,\n\n        //!\n        SCI_LINESJOIN = 2288,\n\n        //!\n        SCI_LINESSPLIT = 2289,\n\n        //!\n        SCI_SETFOLDMARGINCOLOUR = 2290,\n\n        //!\n        SCI_SETFOLDMARGINHICOLOUR = 2291,\n\n        //!\n        SCI_MARKERSETBACKSELECTED = 2292,\n\n        //!\n        SCI_MARKERENABLEHIGHLIGHT = 2293,\n\n        //!\n        SCI_LINEDOWN = 2300,\n\n        //!\n        SCI_LINEDOWNEXTEND = 2301,\n\n        //!\n        SCI_LINEUP = 2302,\n\n        //!\n        SCI_LINEUPEXTEND = 2303,\n\n        //!\n        SCI_CHARLEFT = 2304,\n\n        //!\n        SCI_CHARLEFTEXTEND = 2305,\n\n        //!\n        SCI_CHARRIGHT = 2306,\n\n        //!\n        SCI_CHARRIGHTEXTEND = 2307,\n\n        //!\n        SCI_WORDLEFT = 2308,\n\n        //!\n        SCI_WORDLEFTEXTEND = 2309,\n\n        //!\n        SCI_WORDRIGHT = 2310,\n\n        //!\n        SCI_WORDRIGHTEXTEND = 2311,\n\n        //!\n        SCI_HOME = 2312,\n\n        //!\n        SCI_HOMEEXTEND = 2313,\n\n        //!\n        SCI_LINEEND = 2314,\n\n        //!\n        SCI_LINEENDEXTEND = 2315,\n\n        //!\n        SCI_DOCUMENTSTART = 2316,\n\n        //!\n        SCI_DOCUMENTSTARTEXTEND = 2317,\n\n        //!\n        SCI_DOCUMENTEND = 2318,\n\n        //!\n        SCI_DOCUMENTENDEXTEND = 2319,\n\n        //!\n        SCI_PAGEUP = 2320,\n\n        //!\n        SCI_PAGEUPEXTEND = 2321,\n\n        //!\n        SCI_PAGEDOWN = 2322,\n\n        //!\n        SCI_PAGEDOWNEXTEND = 2323,\n\n        //!\n        SCI_EDITTOGGLEOVERTYPE = 2324,\n\n        //!\n        SCI_CANCEL = 2325,\n\n        //!\n        SCI_DELETEBACK = 2326,\n\n        //!\n        SCI_TAB = 2327,\n\n        //!\n        SCI_BACKTAB = 2328,\n\n        //!\n        SCI_NEWLINE = 2329,\n\n        //!\n        SCI_FORMFEED = 2330,\n\n        //!\n        SCI_VCHOME = 2331,\n\n        //!\n        SCI_VCHOMEEXTEND = 2332,\n\n        //!\n        SCI_ZOOMIN = 2333,\n\n        //!\n        SCI_ZOOMOUT = 2334,\n\n        //!\n        SCI_DELWORDLEFT = 2335,\n\n        //!\n        SCI_DELWORDRIGHT = 2336,\n\n        //!\n        SCI_LINECUT = 2337,\n\n        //!\n        SCI_LINEDELETE = 2338,\n\n        //!\n        SCI_LINETRANSPOSE = 2339,\n\n        //!\n        SCI_LOWERCASE = 2340,\n\n        //!\n        SCI_UPPERCASE = 2341,\n\n        //!\n        SCI_LINESCROLLDOWN = 2342,\n\n        //!\n        SCI_LINESCROLLUP = 2343,\n\n        //!\n        SCI_DELETEBACKNOTLINE = 2344,\n\n        //!\n        SCI_HOMEDISPLAY = 2345,\n\n        //!\n        SCI_HOMEDISPLAYEXTEND = 2346,\n\n        //!\n        SCI_LINEENDDISPLAY = 2347,\n\n        //!\n        SCI_LINEENDDISPLAYEXTEND = 2348,\n\n        //!\n        SCI_MOVECARETINSIDEVIEW = 2401,\n\n        //!\n        SCI_LINELENGTH = 2350,\n\n        //!\n        SCI_BRACEHIGHLIGHT = 2351,\n\n        //!\n        SCI_BRACEBADLIGHT = 2352,\n\n        //!\n        SCI_BRACEMATCH = 2353,\n\n        //!\n        SCI_GETVIEWEOL = 2355,\n\n        //!\n        SCI_SETVIEWEOL = 2356,\n\n        //!\n        SCI_GETDOCPOINTER = 2357,\n\n        //!\n        SCI_SETDOCPOINTER = 2358,\n\n        //!\n        SCI_SETMODEVENTMASK = 2359,\n\n        //!\n        SCI_GETEDGECOLUMN = 2360,\n\n        //!\n        SCI_SETEDGECOLUMN = 2361,\n\n        //!\n        SCI_GETEDGEMODE = 2362,\n\n        //!\n        SCI_SETEDGEMODE = 2363,\n\n        //!\n        SCI_GETEDGECOLOUR = 2364,\n\n        //!\n        SCI_SETEDGECOLOUR = 2365,\n\n        //!\n        SCI_SEARCHANCHOR = 2366,\n\n        //!\n        SCI_SEARCHNEXT = 2367,\n\n        //!\n        SCI_SEARCHPREV = 2368,\n\n        //!\n        SCI_LINESONSCREEN = 2370,\n\n        //!\n        SCI_USEPOPUP = 2371,\n\n        //!\n        SCI_SELECTIONISRECTANGLE = 2372,\n\n        //!\n        SCI_SETZOOM = 2373,\n\n        //!\n        SCI_GETZOOM = 2374,\n\n        //!\n        SCI_CREATEDOCUMENT = 2375,\n\n        //!\n        SCI_ADDREFDOCUMENT = 2376,\n\n        //!\n        SCI_RELEASEDOCUMENT = 2377,\n\n        //!\n        SCI_GETMODEVENTMASK = 2378,\n\n        //!\n        SCI_SETFOCUS = 2380,\n\n        //!\n        SCI_GETFOCUS = 2381,\n\n        //!\n        SCI_SETSTATUS = 2382,\n\n        //!\n        SCI_GETSTATUS = 2383,\n\n        //!\n        SCI_SETMOUSEDOWNCAPTURES = 2384,\n\n        //!\n        SCI_GETMOUSEDOWNCAPTURES = 2385,\n\n        //!\n        SCI_SETCURSOR = 2386,\n\n        //!\n        SCI_GETCURSOR = 2387,\n\n        //!\n        SCI_SETCONTROLCHARSYMBOL = 2388,\n\n        //!\n        SCI_GETCONTROLCHARSYMBOL = 2389,\n\n        //!\n        SCI_WORDPARTLEFT = 2390,\n\n        //!\n        SCI_WORDPARTLEFTEXTEND = 2391,\n\n        //!\n        SCI_WORDPARTRIGHT = 2392,\n\n        //!\n        SCI_WORDPARTRIGHTEXTEND = 2393,\n\n        //!\n        SCI_SETVISIBLEPOLICY = 2394,\n\n        //!\n        SCI_DELLINELEFT = 2395,\n\n        //!\n        SCI_DELLINERIGHT = 2396,\n\n        //!\n        SCI_SETXOFFSET = 2397,\n\n        //!\n        SCI_GETXOFFSET = 2398,\n\n        //!\n        SCI_CHOOSECARETX = 2399,\n\n        //!\n        SCI_GRABFOCUS = 2400,\n\n        //!\n        SCI_SETXCARETPOLICY = 2402,\n\n        //!\n        SCI_SETYCARETPOLICY = 2403,\n\n        //!\n        SCI_LINEDUPLICATE = 2404,\n\n        //! This message takes a copy of an image and registers it so that it\n        //! can be refered to by a unique integer identifier.\n        //! \\a wParam is the image's identifier.\n        //! \\a lParam is a pointer to a QPixmap instance.  Note that in other\n        //! ports of Scintilla this is a pointer to either raw or textual XPM\n        //! image data.\n        //!\n        //! \\sa SCI_CLEARREGISTEREDIMAGES, SCI_REGISTERRGBAIMAGE\n        SCI_REGISTERIMAGE = 2405,\n\n        //!\n        SCI_SETPRINTWRAPMODE = 2406,\n\n        //!\n        SCI_GETPRINTWRAPMODE = 2407,\n\n        //! This message de-registers all currently registered images.\n        //!\n        //! \\sa SCI_REGISTERIMAGE, SCI_REGISTERRGBAIMAGE\n        SCI_CLEARREGISTEREDIMAGES = 2408,\n\n        //!\n        SCI_STYLESETHOTSPOT = 2409,\n\n        //!\n        SCI_SETHOTSPOTACTIVEFORE = 2410,\n\n        //!\n        SCI_SETHOTSPOTACTIVEBACK = 2411,\n\n        //!\n        SCI_SETHOTSPOTACTIVEUNDERLINE = 2412,\n\n        //!\n        SCI_PARADOWN = 2413,\n\n        //!\n        SCI_PARADOWNEXTEND = 2414,\n\n        //!\n        SCI_PARAUP = 2415,\n\n        //!\n        SCI_PARAUPEXTEND = 2416,\n\n        //!\n        SCI_POSITIONBEFORE = 2417,\n\n        //!\n        SCI_POSITIONAFTER = 2418,\n\n        //!\n        SCI_COPYRANGE = 2419,\n\n        //!\n        SCI_COPYTEXT = 2420,\n\n        //!\n        SCI_SETHOTSPOTSINGLELINE = 2421,\n\n        //!\n        SCI_SETSELECTIONMODE = 2422,\n\n        //!\n        SCI_GETSELECTIONMODE = 2423,\n\n        //!\n        SCI_GETLINESELSTARTPOSITION = 2424,\n\n        //!\n        SCI_GETLINESELENDPOSITION = 2425,\n\n        //!\n        SCI_LINEDOWNRECTEXTEND = 2426,\n\n        //!\n        SCI_LINEUPRECTEXTEND = 2427,\n\n        //!\n        SCI_CHARLEFTRECTEXTEND = 2428,\n\n        //!\n        SCI_CHARRIGHTRECTEXTEND = 2429,\n\n        //!\n        SCI_HOMERECTEXTEND = 2430,\n\n        //!\n        SCI_VCHOMERECTEXTEND = 2431,\n\n        //!\n        SCI_LINEENDRECTEXTEND = 2432,\n\n        //!\n        SCI_PAGEUPRECTEXTEND = 2433,\n\n        //!\n        SCI_PAGEDOWNRECTEXTEND = 2434,\n\n        //!\n        SCI_STUTTEREDPAGEUP = 2435,\n\n        //!\n        SCI_STUTTEREDPAGEUPEXTEND = 2436,\n\n        //!\n        SCI_STUTTEREDPAGEDOWN = 2437,\n\n        //!\n        SCI_STUTTEREDPAGEDOWNEXTEND = 2438,\n\n        //!\n        SCI_WORDLEFTEND = 2439,\n\n        //!\n        SCI_WORDLEFTENDEXTEND = 2440,\n\n        //!\n        SCI_WORDRIGHTEND = 2441,\n\n        //!\n        SCI_WORDRIGHTENDEXTEND = 2442,\n\n        //!\n        SCI_SETWHITESPACECHARS = 2443,\n\n        //!\n        SCI_SETCHARSDEFAULT = 2444,\n\n        //!\n        SCI_AUTOCGETCURRENT = 2445,\n\n        //!\n        SCI_ALLOCATE = 2446,\n\n        //!\n        SCI_HOMEWRAP = 2349,\n\n        //!\n        SCI_HOMEWRAPEXTEND = 2450,\n\n        //!\n        SCI_LINEENDWRAP = 2451,\n\n        //!\n        SCI_LINEENDWRAPEXTEND = 2452,\n\n        //!\n        SCI_VCHOMEWRAP = 2453,\n\n        //!\n        SCI_VCHOMEWRAPEXTEND = 2454,\n\n        //!\n        SCI_LINECOPY = 2455,\n\n        //!\n        SCI_FINDCOLUMN = 2456,\n\n        //!\n        SCI_GETCARETSTICKY = 2457,\n\n        //!\n        SCI_SETCARETSTICKY = 2458,\n\n        //!\n        SCI_TOGGLECARETSTICKY = 2459,\n\n        //!\n        SCI_SETWRAPVISUALFLAGS = 2460,\n\n        //!\n        SCI_GETWRAPVISUALFLAGS = 2461,\n\n        //!\n        SCI_SETWRAPVISUALFLAGSLOCATION = 2462,\n\n        //!\n        SCI_GETWRAPVISUALFLAGSLOCATION = 2463,\n\n        //!\n        SCI_SETWRAPSTARTINDENT = 2464,\n\n        //!\n        SCI_GETWRAPSTARTINDENT = 2465,\n\n        //!\n        SCI_MARKERADDSET = 2466,\n\n        //!\n        SCI_SETPASTECONVERTENDINGS = 2467,\n\n        //!\n        SCI_GETPASTECONVERTENDINGS = 2468,\n\n        //!\n        SCI_SELECTIONDUPLICATE = 2469,\n\n        //!\n        SCI_SETCARETLINEBACKALPHA = 2470,\n\n        //!\n        SCI_GETCARETLINEBACKALPHA = 2471,\n\n        //!\n        SCI_SETWRAPINDENTMODE = 2472,\n\n        //!\n        SCI_GETWRAPINDENTMODE = 2473,\n\n        //!\n        SCI_MARKERSETALPHA = 2476,\n\n        //!\n        SCI_GETSELALPHA = 2477,\n\n        //!\n        SCI_SETSELALPHA = 2478,\n\n        //!\n        SCI_GETSELEOLFILLED = 2479,\n\n        //!\n        SCI_SETSELEOLFILLED = 2480,\n\n        //!\n        SCI_STYLEGETFORE = 2481,\n\n        //!\n        SCI_STYLEGETBACK = 2482,\n\n        //!\n        SCI_STYLEGETBOLD = 2483,\n\n        //!\n        SCI_STYLEGETITALIC = 2484,\n\n        //!\n        SCI_STYLEGETSIZE = 2485,\n\n        //!\n        SCI_STYLEGETFONT = 2486,\n\n        //!\n        SCI_STYLEGETEOLFILLED = 2487,\n\n        //!\n        SCI_STYLEGETUNDERLINE = 2488,\n\n        //!\n        SCI_STYLEGETCASE = 2489,\n\n        //!\n        SCI_STYLEGETCHARACTERSET = 2490,\n\n        //!\n        SCI_STYLEGETVISIBLE = 2491,\n\n        //!\n        SCI_STYLEGETCHANGEABLE = 2492,\n\n        //!\n        SCI_STYLEGETHOTSPOT = 2493,\n\n        //!\n        SCI_GETHOTSPOTACTIVEFORE = 2494,\n\n        //!\n        SCI_GETHOTSPOTACTIVEBACK = 2495,\n\n        //!\n        SCI_GETHOTSPOTACTIVEUNDERLINE = 2496,\n\n        //!\n        SCI_GETHOTSPOTSINGLELINE = 2497,\n\n        //!\n        SCI_BRACEHIGHLIGHTINDICATOR = 2498,\n\n        //!\n        SCI_BRACEBADLIGHTINDICATOR = 2499,\n\n        //!\n        SCI_SETINDICATORCURRENT = 2500,\n\n        //!\n        SCI_GETINDICATORCURRENT = 2501,\n\n        //!\n        SCI_SETINDICATORVALUE = 2502,\n\n        //!\n        SCI_GETINDICATORVALUE = 2503,\n\n        //!\n        SCI_INDICATORFILLRANGE = 2504,\n\n        //!\n        SCI_INDICATORCLEARRANGE = 2505,\n\n        //!\n        SCI_INDICATORALLONFOR = 2506,\n\n        //!\n        SCI_INDICATORVALUEAT = 2507,\n\n        //!\n        SCI_INDICATORSTART = 2508,\n\n        //!\n        SCI_INDICATOREND = 2509,\n\n        //!\n        SCI_INDICSETUNDER = 2510,\n\n        //!\n        SCI_INDICGETUNDER = 2511,\n\n        //!\n        SCI_SETCARETSTYLE = 2512,\n\n        //!\n        SCI_GETCARETSTYLE = 2513,\n\n        //!\n        SCI_SETPOSITIONCACHE = 2514,\n\n        //!\n        SCI_GETPOSITIONCACHE = 2515,\n\n        //!\n        SCI_SETSCROLLWIDTHTRACKING = 2516,\n\n        //!\n        SCI_GETSCROLLWIDTHTRACKING = 2517,\n\n        //!\n        SCI_DELWORDRIGHTEND = 2518,\n\n        //! This message copies the selection.  If the selection is empty then\n        //! copy the line with the caret.\n        SCI_COPYALLOWLINE = 2519,\n\n        //! This message returns a pointer to the document text.  Any\n        //! subsequent message will invalidate the pointer.\n        SCI_GETCHARACTERPOINTER = 2520,\n\n        //!\n        SCI_SETKEYSUNICODE = 2521,\n\n        //!\n        SCI_GETKEYSUNICODE = 2522,\n\n        //!\n        SCI_INDICSETALPHA = 2523,\n\n        //!\n        SCI_INDICGETALPHA = 2524,\n\n        //!\n        SCI_SETEXTRAASCENT = 2525,\n\n        //!\n        SCI_GETEXTRAASCENT = 2526,\n\n        //!\n        SCI_SETEXTRADESCENT = 2527,\n\n        //!\n        SCI_GETEXTRADESCENT = 2528,\n\n        //!\n        SCI_MARKERSYMBOLDEFINED = 2529,\n\n        //!\n        SCI_MARGINSETTEXT = 2530,\n\n        //!\n        SCI_MARGINGETTEXT = 2531,\n\n        //!\n        SCI_MARGINSETSTYLE = 2532,\n\n        //!\n        SCI_MARGINGETSTYLE = 2533,\n\n        //!\n        SCI_MARGINSETSTYLES = 2534,\n\n        //!\n        SCI_MARGINGETSTYLES = 2535,\n\n        //!\n        SCI_MARGINTEXTCLEARALL = 2536,\n\n        //!\n        SCI_MARGINSETSTYLEOFFSET = 2537,\n\n        //!\n        SCI_MARGINGETSTYLEOFFSET = 2538,\n\n        //!\n        SCI_SETMARGINOPTIONS = 2539,\n\n        //!\n        SCI_ANNOTATIONSETTEXT = 2540,\n\n        //!\n        SCI_ANNOTATIONGETTEXT = 2541,\n\n        //!\n        SCI_ANNOTATIONSETSTYLE = 2542,\n\n        //!\n        SCI_ANNOTATIONGETSTYLE = 2543,\n\n        //!\n        SCI_ANNOTATIONSETSTYLES = 2544,\n\n        //!\n        SCI_ANNOTATIONGETSTYLES = 2545,\n\n        //!\n        SCI_ANNOTATIONGETLINES = 2546,\n\n        //!\n        SCI_ANNOTATIONCLEARALL = 2547,\n\n        //!\n        SCI_ANNOTATIONSETVISIBLE = 2548,\n\n        //!\n        SCI_ANNOTATIONGETVISIBLE = 2549,\n\n        //!\n        SCI_ANNOTATIONSETSTYLEOFFSET = 2550,\n\n        //!\n        SCI_ANNOTATIONGETSTYLEOFFSET = 2551,\n\n        //!\n        SCI_RELEASEALLEXTENDEDSTYLES = 2552,\n\n        //!\n        SCI_ALLOCATEEXTENDEDSTYLES = 2553,\n\n        //!\n        SCI_SETEMPTYSELECTION = 2556,\n\n        //!\n        SCI_GETMARGINOPTIONS = 2557,\n\n        //!\n        SCI_INDICSETOUTLINEALPHA = 2558,\n\n        //!\n        SCI_INDICGETOUTLINEALPHA = 2559,\n\n        //!\n        SCI_ADDUNDOACTION = 2560,\n\n        //!\n        SCI_CHARPOSITIONFROMPOINT = 2561,\n\n        //!\n        SCI_CHARPOSITIONFROMPOINTCLOSE = 2562,\n\n        //!\n        SCI_SETMULTIPLESELECTION = 2563,\n\n        //!\n        SCI_GETMULTIPLESELECTION = 2564,\n\n        //!\n        SCI_SETADDITIONALSELECTIONTYPING = 2565,\n\n        //!\n        SCI_GETADDITIONALSELECTIONTYPING = 2566,\n\n        //!\n        SCI_SETADDITIONALCARETSBLINK = 2567,\n\n        //!\n        SCI_GETADDITIONALCARETSBLINK = 2568,\n\n        //!\n        SCI_SCROLLRANGE = 2569,\n\n        //!\n        SCI_SETADDITIONALCARETSVISIBLE = 2608,\n\n        //!\n        SCI_GETADDITIONALCARETSVISIBLE = 2609,\n\n        //!\n        SCI_AUTOCGETCURRENTTEXT = 2610,\n\n        //!\n        SCI_GETSELECTIONS = 2570,\n\n        //!\n        SCI_CLEARSELECTIONS = 2571,\n\n        //!\n        SCI_SETSELECTION = 2572,\n\n        //!\n        SCI_ADDSELECTION = 2573,\n\n        //!\n        SCI_SETMAINSELECTION = 2574,\n\n        //!\n        SCI_GETMAINSELECTION = 2575,\n\n        //!\n        SCI_SETSELECTIONNCARET = 2576,\n\n        //!\n        SCI_GETSELECTIONNCARET = 2577,\n\n        //!\n        SCI_SETSELECTIONNANCHOR = 2578,\n\n        //!\n        SCI_GETSELECTIONNANCHOR = 2579,\n\n        //!\n        SCI_SETSELECTIONNCARETVIRTUALSPACE = 2580,\n\n        //!\n        SCI_GETSELECTIONNCARETVIRTUALSPACE = 2581,\n\n        //!\n        SCI_SETSELECTIONNANCHORVIRTUALSPACE = 2582,\n\n        //!\n        SCI_GETSELECTIONNANCHORVIRTUALSPACE = 2583,\n\n        //!\n        SCI_SETSELECTIONNSTART = 2584,\n\n        //!\n        SCI_GETSELECTIONNSTART = 2585,\n\n        //!\n        SCI_SETSELECTIONNEND = 2586,\n\n        //!\n        SCI_GETSELECTIONNEND = 2587,\n\n        //!\n        SCI_SETRECTANGULARSELECTIONCARET = 2588,\n\n        //!\n        SCI_GETRECTANGULARSELECTIONCARET = 2589,\n\n        //!\n        SCI_SETRECTANGULARSELECTIONANCHOR = 2590,\n\n        //!\n        SCI_GETRECTANGULARSELECTIONANCHOR = 2591,\n\n        //!\n        SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE = 2592,\n\n        //!\n        SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE = 2593,\n\n        //!\n        SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE = 2594,\n\n        //!\n        SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE = 2595,\n\n        //!\n        SCI_SETVIRTUALSPACEOPTIONS = 2596,\n\n        //!\n        SCI_GETVIRTUALSPACEOPTIONS = 2597,\n\n        //!\n        SCI_SETRECTANGULARSELECTIONMODIFIER = 2598,\n\n        //!\n        SCI_GETRECTANGULARSELECTIONMODIFIER = 2599,\n\n        //!\n        SCI_SETADDITIONALSELFORE = 2600,\n\n        //!\n        SCI_SETADDITIONALSELBACK = 2601,\n\n        //!\n        SCI_SETADDITIONALSELALPHA = 2602,\n\n        //!\n        SCI_GETADDITIONALSELALPHA = 2603,\n\n        //!\n        SCI_SETADDITIONALCARETFORE = 2604,\n\n        //!\n        SCI_GETADDITIONALCARETFORE = 2605,\n\n        //!\n        SCI_ROTATESELECTION = 2606,\n\n        //!\n        SCI_SWAPMAINANCHORCARET = 2607,\n\n        //!\n        SCI_SETFONTQUALITY = 2611,\n\n        //!\n        SCI_GETFONTQUALITY = 2612,\n\n        //!\n        SCI_SETFIRSTVISIBLELINE = 2613,\n\n        //!\n        SCI_SETMULTIPASTE = 2614,\n\n        //!\n        SCI_GETMULTIPASTE = 2615,\n\n        //!\n        SCI_GETTAG = 2616,\n\n        //!\n        SCI_CHANGELEXERSTATE = 2617,\n\n        //!\n        SCI_CONTRACTEDFOLDNEXT = 2618,\n\n        //!\n        SCI_VERTICALCENTRECARET = 2619,\n\n        //!\n        SCI_MOVESELECTEDLINESUP = 2620,\n\n        //!\n        SCI_MOVESELECTEDLINESDOWN = 2621,\n\n        //!\n        SCI_SETIDENTIFIER = 2622,\n\n        //!\n        SCI_GETIDENTIFIER = 2623,\n\n        //! This message sets the width of an RGBA image specified by a future\n        //! call to SCI_MARKERDEFINERGBAIMAGE or SCI_REGISTERRGBAIMAGE.\n        //!\n        //! \\sa SCI_RGBAIMAGESETHEIGHT, SCI_MARKERDEFINERGBAIMAGE,\n        //! SCI_REGISTERRGBAIMAGE.\n        SCI_RGBAIMAGESETWIDTH = 2624,\n\n        //! This message sets the height of an RGBA image specified by a future\n        //! call to SCI_MARKERDEFINERGBAIMAGE or SCI_REGISTERRGBAIMAGE.\n        //!\n        //! \\sa SCI_RGBAIMAGESETWIDTH, SCI_MARKERDEFINERGBAIMAGE,\n        //! SCI_REGISTERRGBAIMAGE.\n        SCI_RGBAIMAGESETHEIGHT = 2625,\n\n        //! This message sets the symbol used to draw one of the 32 markers to\n        //! an RGBA image.  RGBA images use the SC_MARK_RGBAIMAGE marker\n        //! symbol.\n        //! \\a wParam is the number of the marker.\n        //! \\a lParam is a pointer to a QImage instance.  Note that in other\n        //! ports of Scintilla this is a pointer to raw RGBA image data.\n        //!\n        //! \\sa SCI_MARKERDEFINE, SCI_MARKERDEFINEPIXMAP\n        SCI_MARKERDEFINERGBAIMAGE = 2626,\n\n        //! This message takes a copy of an image and registers it so that it\n        //! can be refered to by a unique integer identifier.\n        //! \\a wParam is the image's identifier.\n        //! \\a lParam is a pointer to a QImage instance.  Note that in other\n        //! ports of Scintilla this is a pointer to raw RGBA image data.\n        //!\n        //! \\sa SCI_CLEARREGISTEREDIMAGES, SCI_REGISTERIMAGE\n        SCI_REGISTERRGBAIMAGE = 2627,\n\n        //!\n        SCI_SCROLLTOSTART = 2628,\n\n        //!\n        SCI_SCROLLTOEND = 2629,\n\n        //!\n        SCI_SETTECHNOLOGY = 2630,\n\n        //!\n        SCI_GETTECHNOLOGY = 2631,\n\n        //!\n        SCI_CREATELOADER = 2632,\n\n        //!\n        SCI_COUNTCHARACTERS = 2633,\n\n        //!\n        SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR = 2634,\n\n        //!\n        SCI_AUTOCGETCASEINSENSITIVEBEHAVIOUR = 2635,\n\n        //!\n        SCI_FINDINDICATORSHOW = 2640,\n\n        //!\n        SCI_FINDINDICATORFLASH = 2641,\n\n        //!\n        SCI_FINDINDICATORHIDE = 2642,\n\n        //!\n        SCI_GETRANGEPOINTER = 2643,\n\n        //!\n        SCI_GETGAPPOSITION = 2644,\n\n        //!\n        SCI_DELETERANGE = 2645,\n\n        //!\n        SCI_GETWORDCHARS = 2646,\n\n        //!\n        SCI_GETWHITESPACECHARS = 2647,\n\n        //!\n        SCI_SETPUNCTUATIONCHARS = 2648,\n\n        //!\n        SCI_GETPUNCTUATIONCHARS = 2649,\n\n        //!\n        SCI_GETSELECTIONEMPTY = 2650,\n\n        //!\n        SCI_RGBAIMAGESETSCALE = 2651,\n\n        //!\n        SCI_VCHOMEDISPLAY = 2652,\n\n        //!\n        SCI_GETCARETLINEVISIBLEALWAYS = 2654,\n\n        //!\n        SCI_SETCARETLINEVISIBLEALWAYS = 2655,\n\n        //!\n        SCI_VCHOMEDISPLAYEXTEND = 2653,\n\n        //!\n        SCI_AUTOCSETORDER = 2660,\n\n        //!\n        SCI_AUTOCGETORDER = 2661,\n\n        //!\n        SCI_FOLDALL = 2662,\n\n        //!\n        SCI_SETAUTOMATICFOLD = 2663,\n\n        //!\n        SCI_GETAUTOMATICFOLD = 2664,\n\n        //!\n        SCI_SETREPRESENTATION = 2665,\n\n        //!\n        SCI_GETREPRESENTATION = 2666,\n\n        //!\n        SCI_CLEARREPRESENTATION = 2667,\n\n        //!\n        SCI_SETMOUSESELECTIONRECTANGULARSWITCH = 2668,\n\n        //!\n        SCI_GETMOUSESELECTIONRECTANGULARSWITCH = 2669,\n\n        //!\n        SCI_POSITIONRELATIVE = 2670,\n\n        //!\n        SCI_STARTRECORD = 3001,\n\n        //!\n        SCI_STOPRECORD = 3002,\n\n        //! This message sets the number of the lexer to use for syntax\n        //! styling.\n        //! \\a wParam is the number of the lexer and is one of the SCLEX_*\n        //! values.\n        SCI_SETLEXER = 4001,\n\n        //! This message returns the number of the lexer being used for syntax\n        //! styling.\n        SCI_GETLEXER = 4002,\n\n        //!\n        SCI_COLOURISE = 4003,\n\n        //!\n        SCI_SETPROPERTY = 4004,\n\n        //!\n        SCI_SETKEYWORDS = 4005,\n\n        //! This message sets the name of the lexer to use for syntax styling.\n        //! \\a wParam is unused.\n        //! \\a lParam is the name of the lexer.\n        SCI_SETLEXERLANGUAGE = 4006,\n\n        //!\n        SCI_LOADLEXERLIBRARY = 4007,\n\n        //!\n        SCI_GETPROPERTY = 4008,\n\n        //!\n        SCI_GETPROPERTYEXPANDED = 4009,\n\n        //!\n        SCI_GETPROPERTYINT = 4010,\n\n        //!\n        SCI_GETSTYLEBITSNEEDED = 4011,\n\n        //!\n        SCI_GETLEXERLANGUAGE = 4012,\n\n        //!\n        SCI_PRIVATELEXERCALL = 4013,\n\n        //!\n        SCI_PROPERTYNAMES = 4014,\n\n        //!\n        SCI_PROPERTYTYPE = 4015,\n\n        //!\n        SCI_DESCRIBEPROPERTY = 4016,\n\n        //!\n        SCI_DESCRIBEKEYWORDSETS = 4017,\n    };\n\n    enum\n    {\n        SC_ALPHA_TRANSPARENT = 0,\n        SC_ALPHA_OPAQUE = 255,\n        SC_ALPHA_NOALPHA = 256\n    };\n\n    enum\n    {\n        SC_CARETSTICKY_OFF = 0,\n        SC_CARETSTICKY_ON = 1,\n        SC_CARETSTICKY_WHITESPACE = 2\n    };\n\n    enum\n    {\n        SC_EFF_QUALITY_MASK = 0x0f,\n        SC_EFF_QUALITY_DEFAULT = 0,\n        SC_EFF_QUALITY_NON_ANTIALIASED = 1,\n        SC_EFF_QUALITY_ANTIALIASED = 2,\n        SC_EFF_QUALITY_LCD_OPTIMIZED = 3\n    };\n\n    enum\n    {\n        SC_MARGINOPTION_NONE = 0x00,\n        SC_MARGINOPTION_SUBLINESELECT = 0x01\n    };\n\n    enum\n    {\n        SC_MULTIPASTE_ONCE = 0,\n        SC_MULTIPASTE_EACH = 1\n    };\n\n    enum\n    {\n        SC_TYPE_BOOLEAN = 0,\n        SC_TYPE_INTEGER = 1,\n        SC_TYPE_STRING = 2\n    };\n\n    enum\n    {\n        SC_UPDATE_CONTENT = 0x01,\n        SC_UPDATE_SELECTION = 0x02,\n        SC_UPDATE_V_SCROLL = 0x04,\n        SC_UPDATE_H_SCROLL = 0x08\n    };\n\n    enum\n    {\n        SC_WRAPVISUALFLAG_NONE = 0x0000,\n        SC_WRAPVISUALFLAG_END = 0x0001,\n        SC_WRAPVISUALFLAG_START = 0x0002,\n        SC_WRAPVISUALFLAG_MARGIN = 0x0004\n    };\n\n    enum\n    {\n        SC_WRAPVISUALFLAGLOC_DEFAULT = 0x0000,\n        SC_WRAPVISUALFLAGLOC_END_BY_TEXT = 0x0001,\n        SC_WRAPVISUALFLAGLOC_START_BY_TEXT = 0x0002\n    };\n\n    //! This enum defines the different selection modes.\n    //!\n    //! \\sa SCI_GETSELECTIONMODE, SCI_SETSELECTIONMODE\n    enum\n    {\n        SC_SEL_STREAM = 0,\n        SC_SEL_RECTANGLE = 1,\n        SC_SEL_LINES = 2,\n        SC_SEL_THIN = 3\n    };\n\n    enum\n    {\n        SCVS_NONE = 0,\n        SCVS_RECTANGULARSELECTION = 1,\n        SCVS_USERACCESSIBLE = 2\n    };\n\n    enum\n    {\n        SCWS_INVISIBLE = 0,\n        SCWS_VISIBLEALWAYS = 1,\n        SCWS_VISIBLEAFTERINDENT = 2\n    };\n\n    enum\n    {\n        SC_EOL_CRLF = 0,\n        SC_EOL_CR = 1,\n        SC_EOL_LF = 2\n    };\n\n    enum\n    {\n        SC_CP_DBCS = 1,\n        SC_CP_UTF8 = 65001\n    };\n\n    //! This enum defines the different marker symbols.\n    //!\n    //! \\sa SCI_MARKERDEFINE\n    enum\n    {\n        //! A circle.\n        SC_MARK_CIRCLE = 0,\n\n        //! A rectangle.\n        SC_MARK_ROUNDRECT = 1,\n\n        //! A triangle pointing to the right.\n        SC_MARK_ARROW = 2,\n\n        //! A smaller rectangle.\n        SC_MARK_SMALLRECT = 3,\n\n        //! An arrow pointing to the right.\n        SC_MARK_SHORTARROW = 4,\n\n        //! An invisible marker that allows code to track the movement\n        //! of lines.\n        SC_MARK_EMPTY = 5,\n\n        //! A triangle pointing down.\n        SC_MARK_ARROWDOWN = 6,\n\n        //! A drawn minus sign.\n        SC_MARK_MINUS = 7,\n\n        //! A drawn plus sign.\n        SC_MARK_PLUS = 8,\n\n        //! A vertical line drawn in the background colour.\n        SC_MARK_VLINE = 9,\n\n        //! A bottom left corner drawn in the background colour.\n        SC_MARK_LCORNER = 10,\n\n        //! A vertical line with a centre right horizontal line drawn\n        //! in the background colour.\n        SC_MARK_TCORNER = 11,\n\n        //! A drawn plus sign in a box.\n        SC_MARK_BOXPLUS = 12,\n\n        //! A drawn plus sign in a connected box.\n        SC_MARK_BOXPLUSCONNECTED = 13,\n\n        //! A drawn minus sign in a box.\n        SC_MARK_BOXMINUS = 14,\n\n        //! A drawn minus sign in a connected box.\n        SC_MARK_BOXMINUSCONNECTED = 15,\n\n        //! A rounded bottom left corner drawn in the background\n        //! colour.\n        SC_MARK_LCORNERCURVE = 16,\n\n        //! A vertical line with a centre right curved line drawn in\n        //! the background colour.\n        SC_MARK_TCORNERCURVE = 17,\n\n        //! A drawn plus sign in a circle.\n        SC_MARK_CIRCLEPLUS = 18,\n\n        //! A drawn plus sign in a connected box.\n        SC_MARK_CIRCLEPLUSCONNECTED = 19,\n\n        //! A drawn minus sign in a circle.\n        SC_MARK_CIRCLEMINUS = 20,\n\n        //! A drawn minus sign in a connected circle.\n        SC_MARK_CIRCLEMINUSCONNECTED = 21,\n\n        //! No symbol is drawn but the line is drawn with the same background\n        //! color as the marker's.\n        SC_MARK_BACKGROUND = 22,\n\n        //! Three drawn dots.\n        SC_MARK_DOTDOTDOT = 23,\n\n        //! Three drawn arrows pointing right.\n        SC_MARK_ARROWS = 24,\n\n        //! An XPM format pixmap.\n        SC_MARK_PIXMAP = 25,\n\n        //! A full rectangle (ie. the margin background) using the marker's\n        //! background color.\n        SC_MARK_FULLRECT = 26,\n\n        //! A left rectangle (ie. the left part of the margin background) using\n        //! the marker's background color.\n        SC_MARK_LEFTRECT = 27,\n\n        //! The value is available for plugins to use.\n        SC_MARK_AVAILABLE = 28,\n\n        //! The line is underlined using the marker's background color.\n        SC_MARK_UNDERLINE = 29,\n\n        //! A RGBA format image.\n        SC_MARK_RGBAIMAGE = 30,\n\n        //! Characters can be used as symbols by adding this to the ASCII value\n        //! of the character.\n        SC_MARK_CHARACTER = 10000\n    };\n\n    enum\n    {\n        SC_MARKNUM_FOLDEREND = 25,\n        SC_MARKNUM_FOLDEROPENMID = 26,\n        SC_MARKNUM_FOLDERMIDTAIL = 27,\n        SC_MARKNUM_FOLDERTAIL = 28,\n        SC_MARKNUM_FOLDERSUB = 29,\n        SC_MARKNUM_FOLDER = 30,\n        SC_MARKNUM_FOLDEROPEN = 31,\n        SC_MASK_FOLDERS = 0xfe000000\n    };\n\n    //! This enum defines what can be displayed in a margin.\n    //!\n    //! \\sa SCI_GETMARGINTYPEN, SCI_SETMARGINTYPEN\n    enum\n    {\n        //! The margin can display symbols.  Note that all margins can display\n        //! symbols.\n        SC_MARGIN_SYMBOL = 0,\n\n        //! The margin will display line numbers.\n        SC_MARGIN_NUMBER = 1,\n\n        //! The margin's background color will be set to the default background\n        //! color.\n        SC_MARGIN_BACK = 2,\n\n        //! The margin's background color will be set to the default foreground\n        //! color.\n        SC_MARGIN_FORE = 3,\n\n        //! The margin will display text.\n        SC_MARGIN_TEXT = 4,\n\n        //! The margin will display right justified text.\n        SC_MARGIN_RTEXT = 5\n    };\n\n    enum\n    {\n        STYLE_DEFAULT = 32,\n        STYLE_LINENUMBER = 33,\n        STYLE_BRACELIGHT = 34,\n        STYLE_BRACEBAD = 35,\n        STYLE_CONTROLCHAR = 36,\n        STYLE_INDENTGUIDE = 37,\n        STYLE_CALLTIP = 38,\n        STYLE_LASTPREDEFINED = 39,\n        STYLE_MAX = 255\n    };\n\n    enum\n    {\n        SC_CHARSET_ANSI = 0,\n        SC_CHARSET_DEFAULT = 1,\n        SC_CHARSET_BALTIC = 186,\n        SC_CHARSET_CHINESEBIG5 = 136,\n        SC_CHARSET_EASTEUROPE = 238,\n        SC_CHARSET_GB2312 = 134,\n        SC_CHARSET_GREEK = 161,\n        SC_CHARSET_HANGUL = 129,\n        SC_CHARSET_MAC = 77,\n        SC_CHARSET_OEM = 255,\n        SC_CHARSET_RUSSIAN = 204,\n        SC_CHARSET_SHIFTJIS = 128,\n        SC_CHARSET_SYMBOL = 2,\n        SC_CHARSET_TURKISH = 162,\n        SC_CHARSET_JOHAB = 130,\n        SC_CHARSET_HEBREW = 177,\n        SC_CHARSET_ARABIC = 178,\n        SC_CHARSET_VIETNAMESE = 163,\n        SC_CHARSET_THAI = 222,\n        SC_CHARSET_8859_15 = 1000\n    };\n\n    enum\n    {\n        SC_CASE_MIXED = 0,\n        SC_CASE_UPPER = 1,\n        SC_CASE_LOWER = 2\n    };\n\n    //! This enum defines the different indentation guide views.\n    //!\n    //! \\sa SCI_GETINDENTATIONGUIDES, SCI_SETINDENTATIONGUIDES\n    enum\n    {\n        //! No indentation guides are shown.\n        SC_IV_NONE = 0,\n\n        //! Indentation guides are shown inside real indentation white space.\n        SC_IV_REAL = 1,\n\n        //! Indentation guides are shown beyond the actual indentation up to\n        //! the level of the next non-empty line.  If the previous non-empty\n        //! line was a fold header then indentation guides are shown for one\n        //! more level of indent than that line.  This setting is good for\n        //! Python.\n        SC_IV_LOOKFORWARD = 2,\n\n        //! Indentation guides are shown beyond the actual indentation up to\n        //! the level of the next non-empty line or previous non-empty line\n        //! whichever is the greater.  This setting is good for most languages.\n        SC_IV_LOOKBOTH = 3\n    };\n\n    enum\n    {\n        INDIC_PLAIN = 0,\n        INDIC_SQUIGGLE = 1,\n        INDIC_TT = 2,\n        INDIC_DIAGONAL = 3,\n        INDIC_STRIKE = 4,\n        INDIC_HIDDEN = 5,\n        INDIC_BOX = 6,\n        INDIC_ROUNDBOX = 7,\n        INDIC_STRAIGHTBOX = 8,\n        INDIC_DASH = 9,\n        INDIC_DOTS = 10,\n        INDIC_SQUIGGLELOW = 11,\n        INDIC_DOTBOX = 12,\n        INDIC_SQUIGGLEPIXMAP = 13,\n        INDIC_COMPOSITIONTHICK = 14,\n\n        INDIC_CONTAINER = 8,\n        INDIC_MAX = 31,\n        INDIC0_MASK = 0x20,\n        INDIC1_MASK = 0x40,\n        INDIC2_MASK = 0x80,\n        INDICS_MASK = 0xe0\n    };\n\n    enum\n    {\n        SC_PRINT_NORMAL = 0,\n        SC_PRINT_INVERTLIGHT = 1,\n        SC_PRINT_BLACKONWHITE = 2,\n        SC_PRINT_COLOURONWHITE = 3,\n        SC_PRINT_COLOURONWHITEDEFAULTBG = 4\n    };\n\n    enum\n    {\n        SCFIND_WHOLEWORD = 2,\n        SCFIND_MATCHCASE = 4,\n        SCFIND_WORDSTART = 0x00100000,\n        SCFIND_REGEXP = 0x00200000,\n        SCFIND_POSIX = 0x00400000\n    };\n\n    enum\n    {\n        SC_FOLDLEVELBASE = 0x00400,\n        SC_FOLDLEVELWHITEFLAG = 0x01000,\n        SC_FOLDLEVELHEADERFLAG = 0x02000,\n        SC_FOLDLEVELNUMBERMASK = 0x00fff\n    };\n\n    enum\n    {\n        SC_FOLDFLAG_LINEBEFORE_EXPANDED = 0x0002,\n        SC_FOLDFLAG_LINEBEFORE_CONTRACTED = 0x0004,\n        SC_FOLDFLAG_LINEAFTER_EXPANDED = 0x0008,\n        SC_FOLDFLAG_LINEAFTER_CONTRACTED = 0x0010,\n        SC_FOLDFLAG_LEVELNUMBERS = 0x0040\n    };\n\n    enum\n    {\n        SC_TIME_FOREVER = 10000000\n    };\n\n    enum\n    {\n        SC_WRAP_NONE = 0,\n        SC_WRAP_WORD = 1,\n        SC_WRAP_CHAR = 2\n    };\n\n    enum\n    {\n        SC_WRAPINDENT_FIXED = 0,\n        SC_WRAPINDENT_SAME = 1,\n        SC_WRAPINDENT_INDENT = 2\n    };\n\n    enum\n    {\n        SC_CACHE_NONE = 0,\n        SC_CACHE_CARET = 1,\n        SC_CACHE_PAGE = 2,\n        SC_CACHE_DOCUMENT = 3\n    };\n\n    enum\n    {\n        ANNOTATION_HIDDEN = 0,\n        ANNOTATION_STANDARD = 1,\n        ANNOTATION_BOXED = 2\n    };\n\n    enum\n    {\n        EDGE_NONE = 0,\n        EDGE_LINE = 1,\n        EDGE_BACKGROUND = 2\n    };\n\n    enum\n    {\n        SC_CURSORNORMAL = -1,\n        SC_CURSORARROW = 2,\n        SC_CURSORWAIT = 4,\n        SC_CURSORREVERSEARROW = 7\n    };\n\n    enum\n    {\n        UNDO_MAY_COALESCE = 1\n    };\n\n    enum\n    {\n        VISIBLE_SLOP = 0x01,\n        VISIBLE_STRICT = 0x04\n    };\n\n    enum\n    {\n        CARET_SLOP = 0x01,\n        CARET_STRICT = 0x04,\n        CARET_JUMPS = 0x10,\n        CARET_EVEN = 0x08\n    };\n\n    enum\n    {\n        CARETSTYLE_INVISIBLE = 0,\n        CARETSTYLE_LINE = 1,\n        CARETSTYLE_BLOCK = 2\n    };\n\n    enum\n    {\n        SC_MOD_INSERTTEXT = 0x1,\n        SC_MOD_DELETETEXT = 0x2,\n        SC_MOD_CHANGESTYLE = 0x4,\n        SC_MOD_CHANGEFOLD = 0x8,\n        SC_PERFORMED_USER = 0x10,\n        SC_PERFORMED_UNDO = 0x20,\n        SC_PERFORMED_REDO = 0x40,\n        SC_MULTISTEPUNDOREDO = 0x80,\n        SC_LASTSTEPINUNDOREDO = 0x100,\n        SC_MOD_CHANGEMARKER = 0x200,\n        SC_MOD_BEFOREINSERT = 0x400,\n        SC_MOD_BEFOREDELETE = 0x800,\n        SC_MULTILINEUNDOREDO = 0x1000,\n        SC_STARTACTION = 0x2000,\n        SC_MOD_CHANGEINDICATOR = 0x4000,\n        SC_MOD_CHANGELINESTATE = 0x8000,\n        SC_MOD_CHANGEMARGIN = 0x10000,\n        SC_MOD_CHANGEANNOTATION = 0x20000,\n        SC_MOD_CONTAINER = 0x40000,\n        SC_MOD_LEXERSTATE = 0x80000,\n        SC_MODEVENTMASKALL = 0xfffff\n    };\n\n    enum\n    {\n        SCK_DOWN = 300,\n        SCK_UP = 301,\n        SCK_LEFT = 302,\n        SCK_RIGHT = 303,\n        SCK_HOME = 304,\n        SCK_END = 305,\n        SCK_PRIOR = 306,\n        SCK_NEXT = 307,\n        SCK_DELETE = 308,\n        SCK_INSERT = 309,\n        SCK_ESCAPE = 7,\n        SCK_BACK = 8,\n        SCK_TAB = 9,\n        SCK_RETURN = 13,\n        SCK_ADD = 310,\n        SCK_SUBTRACT = 311,\n        SCK_DIVIDE = 312,\n        SCK_WIN = 313,\n        SCK_RWIN = 314,\n        SCK_MENU = 315\n    };\n\n    //! This enum defines the different modifier keys.\n    enum\n    {\n        //! No modifier key.\n        SCMOD_NORM = 0,\n\n        //! Shift key.\n        SCMOD_SHIFT = 1,\n\n        //! Control key (the Command key on OS/X, the Ctrl key on other\n        //! platforms).\n        SCMOD_CTRL = 2,\n\n        //! Alt key.\n        SCMOD_ALT = 4,\n\n        //! This is the same as SCMOD_META on all platforms.\n        SCMOD_SUPER = 8,\n\n        //! Meta key (the Ctrl key on OS/X, the Windows key on other\n        //! platforms).\n        SCMOD_META = 16\n    };\n\n    //! This enum defines the different language lexers.\n    //!\n    //! \\sa SCI_GETLEXER, SCI_SETLEXER\n    enum\n    {\n        //! No lexer is selected and the SCN_STYLENEEDED signal is emitted so\n        //! that the application can style the text as needed.  This is the\n        //! default.\n        SCLEX_CONTAINER = 0,\n\n        //! Select the null lexer that does no syntax styling.\n        SCLEX_NULL = 1,\n\n        //! Select the Python lexer.\n        SCLEX_PYTHON = 2,\n\n        //! Select the C++ lexer.\n        SCLEX_CPP = 3,\n\n        //! Select the HTML lexer.\n        SCLEX_HTML = 4,\n\n        //! Select the XML lexer.\n        SCLEX_XML = 5,\n\n        //! Select the Perl lexer.\n        SCLEX_PERL = 6,\n\n        //! Select the SQL lexer.\n        SCLEX_SQL = 7,\n\n        //! Select the Visual Basic lexer.\n        SCLEX_VB = 8,\n\n        //! Select the lexer for properties style files.\n        SCLEX_PROPERTIES = 9,\n\n        //! Select the lexer for error list style files.\n        SCLEX_ERRORLIST = 10,\n\n        //! Select the Makefile lexer.\n        SCLEX_MAKEFILE = 11,\n\n        //! Select the Windows batch file lexer.\n        SCLEX_BATCH = 12,\n\n        //! Select the LaTex lexer.\n        SCLEX_LATEX = 14,\n\n        //! Select the Lua lexer.\n        SCLEX_LUA = 15,\n\n        //! Select the lexer for diff output.\n        SCLEX_DIFF = 16,\n\n        //! Select the lexer for Apache configuration files.\n        SCLEX_CONF = 17,\n\n        //! Select the Pascal lexer.\n        SCLEX_PASCAL = 18,\n\n        //! Select the Avenue lexer.\n        SCLEX_AVE = 19,\n\n        //! Select the Ada lexer.\n        SCLEX_ADA = 20,\n\n        //! Select the Lisp lexer.\n        SCLEX_LISP = 21,\n\n        //! Select the Ruby lexer.\n        SCLEX_RUBY = 22,\n\n        //! Select the Eiffel lexer.\n        SCLEX_EIFFEL = 23,\n\n        //! Select the Eiffel lexer folding at keywords.\n        SCLEX_EIFFELKW = 24,\n\n        //! Select the Tcl lexer.\n        SCLEX_TCL = 25,\n\n        //! Select the lexer for nnCron files.\n        SCLEX_NNCRONTAB = 26,\n\n        //! Select the Bullant lexer.\n        SCLEX_BULLANT = 27,\n\n        //! Select the VBScript lexer.\n        SCLEX_VBSCRIPT = 28,\n\n        //! Select the ASP lexer.\n        SCLEX_ASP = SCLEX_HTML,\n\n        //! Select the PHP lexer.\n        SCLEX_PHP = SCLEX_HTML,\n\n        //! Select the Baan lexer.\n        SCLEX_BAAN = 31,\n\n        //! Select the Matlab lexer.\n        SCLEX_MATLAB = 32,\n\n        //! Select the Scriptol lexer.\n        SCLEX_SCRIPTOL = 33,\n\n        //! Select the assembler lexer.\n        SCLEX_ASM = 34,\n\n        //! Select the C++ lexer with case insensitive keywords.\n        SCLEX_CPPNOCASE = 35,\n\n        //! Select the FORTRAN lexer.\n        SCLEX_FORTRAN = 36,\n\n        //! Select the FORTRAN77 lexer.\n        SCLEX_F77 = 37,\n\n        //! Select the CSS lexer.\n        SCLEX_CSS = 38,\n\n        //! Select the POV lexer.\n        SCLEX_POV = 39,\n\n        //! Select the Basser Lout typesetting language lexer.\n        SCLEX_LOUT = 40,\n\n        //! Select the EScript lexer.\n        SCLEX_ESCRIPT = 41,\n\n        //! Select the PostScript lexer.\n        SCLEX_PS = 42,\n\n        //! Select the NSIS lexer.\n        SCLEX_NSIS = 43,\n\n        //! Select the MMIX assembly language lexer.\n        SCLEX_MMIXAL = 44,\n\n        //! Select the Clarion lexer.\n        SCLEX_CLW = 45,\n\n        //! Select the Clarion lexer with case insensitive keywords.\n        SCLEX_CLWNOCASE = 46,\n\n        //! Select the MPT text log file lexer.\n        SCLEX_LOT = 47,\n\n        //! Select the YAML lexer.\n        SCLEX_YAML = 48,\n\n        //! Select the TeX lexer.\n        SCLEX_TEX = 49,\n\n        //! Select the Metapost lexer.\n        SCLEX_METAPOST = 50,\n\n        //! Select the PowerBASIC lexer.\n        SCLEX_POWERBASIC = 51,\n\n        //! Select the Forth lexer.\n        SCLEX_FORTH = 52,\n\n        //! Select the Erlang lexer.\n        SCLEX_ERLANG = 53,\n\n        //! Select the Octave lexer.\n        SCLEX_OCTAVE = 54,\n\n        //! Select the MS SQL lexer.\n        SCLEX_MSSQL = 55,\n\n        //! Select the Verilog lexer.\n        SCLEX_VERILOG = 56,\n\n        //! Select the KIX-Scripts lexer.\n        SCLEX_KIX = 57,\n\n        //! Select the Gui4Cli lexer.\n        SCLEX_GUI4CLI = 58,\n\n        //! Select the Specman E lexer.\n        SCLEX_SPECMAN = 59,\n\n        //! Select the AutoIt3 lexer.\n        SCLEX_AU3 = 60,\n\n        //! Select the APDL lexer.\n        SCLEX_APDL = 61,\n\n        //! Select the Bash lexer.\n        SCLEX_BASH = 62,\n\n        //! Select the ASN.1 lexer.\n        SCLEX_ASN1 = 63,\n\n        //! Select the VHDL lexer.\n        SCLEX_VHDL = 64,\n\n        //! Select the Caml lexer.\n        SCLEX_CAML = 65,\n\n        //! Select the BlitzBasic lexer.\n        SCLEX_BLITZBASIC = 66,\n\n        //! Select the PureBasic lexer.\n        SCLEX_PUREBASIC = 67,\n\n        //! Select the Haskell lexer.\n        SCLEX_HASKELL = 68,\n\n        //! Select the PHPScript lexer.\n        SCLEX_PHPSCRIPT = 69,\n\n        //! Select the TADS3 lexer.\n        SCLEX_TADS3 = 70,\n\n        //! Select the REBOL lexer.\n        SCLEX_REBOL = 71,\n\n        //! Select the Smalltalk lexer.\n        SCLEX_SMALLTALK = 72,\n\n        //! Select the FlagShip lexer.\n        SCLEX_FLAGSHIP = 73,\n\n        //! Select the Csound lexer.\n        SCLEX_CSOUND = 74,\n\n        //! Select the FreeBasic lexer.\n        SCLEX_FREEBASIC = 75,\n\n        //! Select the InnoSetup lexer.\n        SCLEX_INNOSETUP = 76,\n\n        //! Select the Opal lexer.\n        SCLEX_OPAL = 77,\n\n        //! Select the Spice lexer.\n        SCLEX_SPICE = 78,\n\n        //! Select the D lexer.\n        SCLEX_D = 79,\n\n        //! Select the CMake lexer.\n        SCLEX_CMAKE = 80,\n\n        //! Select the GAP lexer.\n        SCLEX_GAP = 81,\n\n        //! Select the PLM lexer.\n        SCLEX_PLM = 82,\n\n        //! Select the Progress lexer.\n        SCLEX_PROGRESS = 83,\n\n        //! Select the Abaqus lexer.\n        SCLEX_ABAQUS = 84,\n\n        //! Select the Asymptote lexer.\n        SCLEX_ASYMPTOTE = 85,\n\n        //! Select the R lexer.\n        SCLEX_R = 86,\n\n        //! Select the MagikSF lexer.\n        SCLEX_MAGIK = 87,\n\n        //! Select the PowerShell lexer.\n        SCLEX_POWERSHELL = 88,\n\n        //! Select the MySQL lexer.\n        SCLEX_MYSQL = 89,\n\n        //! Select the gettext .po file lexer.\n        SCLEX_PO = 90,\n\n        //! Select the TAL lexer.\n        SCLEX_TAL = 91,\n\n        //! Select the COBOL lexer.\n        SCLEX_COBOL = 92,\n\n        //! Select the TACL lexer.\n        SCLEX_TACL = 93,\n\n        //! Select the Sorcus lexer.\n        SCLEX_SORCUS = 94,\n\n        //! Select the PowerPro lexer.\n        SCLEX_POWERPRO = 95,\n\n        //! Select the Nimrod lexer.\n        SCLEX_NIMROD = 96,\n\n        //! Select the SML lexer.\n        SCLEX_SML = 97,\n\n        //! Select the Markdown lexer.\n        SCLEX_MARKDOWN = 98,\n\n        //! Select the txt2tags lexer.\n        SCLEX_TXT2TAGS = 99,\n\n        //! Select the 68000 assembler lexer.\n        SCLEX_A68K = 100,\n\n        //! Select the Modula 3 lexer.\n        SCLEX_MODULA = 101,\n\n        //! Select the CoffeeScript lexer.\n        SCLEX_COFFEESCRIPT = 102,\n\n        //! Select the Take Command lexer.\n        SCLEX_TCMD = 103,\n\n        //! Select the AviSynth lexer.\n        SCLEX_AVS = 104,\n\n        //! Select the ECL lexer.\n        SCLEX_ECL = 105,\n\n        //! Select the OScript lexer.\n        SCLEX_OSCRIPT = 106,\n\n        //! Select the Visual Prolog lexer.\n        SCLEX_VISUALPROLOG = 107,\n\n        //! Select the Literal Haskell lexer.\n        SCLEX_LITERATEHASKELL = 108,\n\n        //! Select the Structured Text lexer.\n        SCLEX_STTXT = 109,\n\n        //! Select the KVIrc lexer.\n        SCLEX_KVIRC = 110,\n\n        //! Select the Rust lexer.\n        SCLEX_RUST = 111,\n    };\n\n    enum\n    {\n        SC_WEIGHT_NORMAL = 400,\n        SC_WEIGHT_SEMIBOLD = 600,\n        SC_WEIGHT_BOLD = 700,\n    };\n\n    enum\n    {\n        SC_TECHNOLOGY_DEFAULT = 0,\n        SC_TECHNOLOGY_DIRECTWRITE = 1,\n    };\n\n    enum\n    {\n        SC_CASEINSENSITIVEBEHAVIOUR_RESPECTCASE = 0,\n        SC_CASEINSENSITIVEBEHAVIOUR_IGNORECASE = 1,\n    };\n\n    enum\n    {\n        SC_FONT_SIZE_MULTIPLIER = 100,\n    };\n\n    enum\n    {\n        SC_FOLDACTION_CONTRACT = 0,\n        SC_FOLDACTION_EXPAND = 1,\n        SC_FOLDACTION_TOGGLE = 2,\n    };\n\n    enum\n    {\n        SC_AUTOMATICFOLD_SHOW = 0x0001,\n        SC_AUTOMATICFOLD_CLICK = 0x0002,\n        SC_AUTOMATICFOLD_CHANGE = 0x0004,\n    };\n\n    enum\n    {\n        SC_ORDER_PRESORTED = 0,\n        SC_ORDER_PERFORMSORT = 1,\n        SC_ORDER_CUSTOM = 2,\n    };\n\n    //! Construct an empty QsciScintillaBase with parent \\a parent, name \\a\n    //! name, and widget flags \\a f.\n    QsciScintillaBase(QWidget *parent = 0, const char *name = 0, WFlags f = 0);\n\n    //! Destroys the QsciScintillaBase instance.\n    virtual ~QsciScintillaBase();\n\n    //! Returns a pointer to a QsciScintillaBase instance, or 0 if there isn't\n    //! one.  This can be used by the higher level API to send messages that\n    //! aren't associated with a particular instance.\n    static QsciScintillaBase *pool();\n\n    //! Send the Scintilla message \\a msg with the optional parameters \\a\n    //! wParam and \\a lParam.\n    long SendScintilla(unsigned int msg, unsigned long wParam = 0,\n            long lParam = 0) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            void *lParam) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            const char *lParam) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, const char *lParam) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, const char *wParam,\n            const char *lParam) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, long wParam) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, int wParam) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, long cpMin, long cpMax,\n            char *lpstrText) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            const QColor &col) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, const QColor &col) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, unsigned long wParam, QPainter *hdc,\n            const QRect &rc, long cpMin, long cpMax) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            const QPixmap &lParam) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            const QImage &lParam) const;\n\n    //! Send the Scintilla message \\a msg and return a pointer result.\n    void *SendScintillaPtrResult(unsigned int msg) const;\n\n    //! Returns the horizontal scrollbar widget.\n    QScrollBar *horizontalScrollBar() const;\n\n    //! Returns the vertical scrollbar widget.\n    QScrollBar *verticalScrollBar() const;\n\n    //! Returns the viewport widget.  This is the widget that actually contains\n    //! the text.\n    QWidget *viewport() const;\n\n    //! Re-implemented to filter certain events.\n    virtual bool eventFilter(QObject *o, QEvent *e);\n\n    //! \\internal\n    static int commandKey(int qt_key, int &modifiers);\n\nsignals:\n    //! This signal is emitted when text is selected or de-selected.\n    //! \\a yes is true if text has been selected and false if text has been\n    //! deselected.\n    void QSCN_SELCHANGED(bool yes);\n\n    //! This signal is emitted when the user cancels an auto-completion list.\n    //!\n    //! \\sa SCN_AUTOCSELECTION()\n    void SCN_AUTOCCANCELLED();\n\n    //! This signal is emitted when the user deletes a character when an\n    //! auto-completion list is active.\n    void SCN_AUTOCCHARDELETED();\n\n    //! This signal is emitted when the user selects an item in an\n    //! auto-completion list.  It is emitted before the selection is inserted.\n    //! The insertion can be cancelled by sending an SCI_AUTOCANCEL message\n    //! from a connected slot.\n    //! \\a selection is the text of the selection.\n    //! \\a position is the start position of the word being completed.\n    //!\n    //! \\sa SCN_AUTOCCANCELLED()\n    void SCN_AUTOCSELECTION(const char *selection, int position);\n\n    //! This signal is emitted when the document has changed for any reason.\n    void SCEN_CHANGE();\n\n    //! This signal ir emitted when the user clicks on a calltip.\n    //! \\a direction is 1 if the user clicked on the up arrow, 2 if the user\n    //! clicked on the down arrow, and 0 if the user clicked elsewhere.\n    void SCN_CALLTIPCLICK(int direction);\n\n    //! This signal is emitted whenever the user enters an ordinary character\n    //! into the text.\n    //! \\a charadded is the character. It can be used to decide to display a\n    //! call tip or an auto-completion list.\n    void SCN_CHARADDED(int charadded);\n\n    //! This signal is emitted when the user double clicks.\n    //! \\a position is the position in the text where the click occured.\n    //! \\a line is the number of the line in the text where the click occured.\n    //! \\a modifiers is the logical or of the modifier keys that were pressed\n    //! when the user double clicked.\n    void SCN_DOUBLECLICK(int position, int line, int modifiers);\n\n    //!\n    void SCN_DWELLEND(int, int, int);\n\n    //!\n    void SCN_DWELLSTART(int, int, int);\n\n    //! This signal is emitted when focus is received.\n    void SCN_FOCUSIN();\n\n    //! This signal is emitted when focus is lost.\n    void SCN_FOCUSOUT();\n\n    //! This signal is emitted when the user clicks on text in a style with the\n    //! hotspot attribute set.\n    //! \\a position is the position in the text where the click occured.\n    //! \\a modifiers is the logical or of the modifier keys that were pressed\n    //! when the user clicked.\n    void SCN_HOTSPOTCLICK(int position, int modifiers);\n\n    //! This signal is emitted when the user double clicks on text in a style\n    //! with the hotspot attribute set.\n    //! \\a position is the position in the text where the double click occured.\n    //! \\a modifiers is the logical or of the modifier keys that were pressed\n    //! when the user double clicked.\n    void SCN_HOTSPOTDOUBLECLICK(int position, int modifiers);\n\n    //! This signal is emitted when the user releases the mouse button on text\n    //! in a style with the hotspot attribute set.\n    //! \\a position is the position in the text where the release occured.\n    //! \\a modifiers is the logical or of the modifier keys that were pressed\n    //! when the user released the button.\n    void SCN_HOTSPOTRELEASECLICK(int position, int modifiers);\n\n    //! This signal is emitted when the user clicks on text that has an\n    //! indicator.\n    //! \\a position is the position in the text where the click occured.\n    //! \\a modifiers is the logical or of the modifier keys that were pressed\n    //! when the user clicked.\n    void SCN_INDICATORCLICK(int position, int modifiers);\n\n    //! This signal is emitted when the user releases the mouse button on text\n    //! that has an indicator.\n    //! \\a position is the position in the text where the release occured.\n    //! \\a modifiers is the logical or of the modifier keys that were pressed\n    //! when the user released.\n    void SCN_INDICATORRELEASE(int position, int modifiers);\n\n    //! This signal is emitted when a recordable editor command has been\n    //! executed.\n    void SCN_MACRORECORD(unsigned int, unsigned long, void *);\n\n    //! This signal is emitted when the user clicks on a sensitive margin.\n    //! \\a position is the position of the start of the line against which the\n    //! user clicked.\n    //! \\a modifiers is the logical or of the modifier keys that were pressed\n    //! when the user clicked.\n    //! \\a margin is the number of the margin the user clicked in: 0, 1 or 2.\n    //! \n    //! \\sa SCI_GETMARGINSENSITIVEN, SCI_SETMARGINSENSITIVEN\n    void SCN_MARGINCLICK(int position, int modifiers, int margin);\n\n    //!\n    void SCN_MODIFIED(int, int, const char *, int, int, int, int, int, int, int);\n\n    //! This signal is emitted when the user attempts to modify read-only\n    //! text.\n    void SCN_MODIFYATTEMPTRO();\n\n    //!\n    void SCN_NEEDSHOWN(int, int);\n\n    //! This signal is emitted when painting has been completed.  It is useful\n    //! to trigger some other change but to have the paint be done first to\n    //! appear more reponsive to the user.\n    void SCN_PAINTED();\n\n    //! This signal is emitted when the current state of the text no longer\n    //! corresponds to the state of the text at the save point.\n    //! \n    //! \\sa SCI_SETSAVEPOINT, SCN_SAVEPOINTREACHED()\n    void SCN_SAVEPOINTLEFT();\n\n    //! This signal is emitted when the current state of the text corresponds\n    //! to the state of the text at the save point. This allows feedback to be\n    //! given to the user as to whether the text has been modified since it was\n    //! last saved.\n    //! \n    //! \\sa SCI_SETSAVEPOINT, SCN_SAVEPOINTLEFT()\n    void SCN_SAVEPOINTREACHED();\n\n    //! This signal is emitted when a range of text needs to be syntax styled.\n    //! The range is from the value returned by the SCI_GETENDSTYLED message\n    //! and \\a position.  It is only emitted if the currently selected lexer is\n    //! SCLEX_CONTAINER.\n    //!\n    //! \\sa SCI_COLOURISE, SCI_GETENDSTYLED\n    void SCN_STYLENEEDED(int position);\n\n    //! This signal is emitted when either the text or styling of the text has\n    //! changed or the selection range or scroll position has changed.\n    //! \\a updated contains the set of SC_UPDATE_* flags describing the changes\n    //! since the signal was last emitted.\n    void SCN_UPDATEUI(int updated);\n\n    //!\n    void SCN_USERLISTSELECTION(const char *, int);\n\n    //!\n    void SCN_ZOOM();\n\nprotected:\n\n    //! Re-implemented to handle the context menu.\n    virtual void contextMenuEvent(QContextMenuEvent *e);\n\n    //! Re-implemented to handle drag enters.\n    virtual void dragEnterEvent(QDragEnterEvent *e);\n\n    //! Re-implemented to handle drag leaves.\n    virtual void dragLeaveEvent(QDragLeaveEvent *e);\n\n    //! Re-implemented to handle drag moves.\n    virtual void dragMoveEvent(QDragMoveEvent *e);\n\n    //! Re-implemented to handle drops.\n    virtual void dropEvent(QDropEvent *e);\n\n    //! Re-implemented to tell Scintilla it has the focus.\n    virtual void focusInEvent(QFocusEvent *e);\n\n    //! Re-implemented to tell Scintilla it has lost the focus.\n    virtual void focusOutEvent(QFocusEvent *e);\n\n    //! Re-implemented to allow tabs to be entered as text.\n    virtual bool focusNextPrevChild(bool next);\n\n    //! Re-implemented to handle key presses.\n    virtual void keyPressEvent(QKeyEvent *e);\n\n\n    //! Re-implemented to handle mouse double-clicks.\n    virtual void mouseDoubleClickEvent(QMouseEvent *e);\n\n    //! Re-implemented to handle mouse moves.\n    virtual void mouseMoveEvent(QMouseEvent *e);\n\n    //! Re-implemented to handle mouse presses.\n    virtual void mousePressEvent(QMouseEvent *e);\n\n    //! Re-implemented to handle mouse releases.\n    virtual void mouseReleaseEvent(QMouseEvent *e);\n\n    //! Re-implemented to paint the viewport.\n    virtual void paintEvent(QPaintEvent *e);\n\n    //! Re-implemented to handle resizes.\n    virtual void resizeEvent(QResizeEvent *e);\n\n\n    //! \\internal This helps to work around some Scintilla bugs.\n    void setScrollBars();\n\n    //! \\internal Qt3 portability.\n    typedef QCString ScintillaBytes;\n\n#define ScintillaBytesConstData(b)  (b).operator const char *()\n\n\n    //! \\internal Convert a QString to encoded bytes.\n    ScintillaBytes textAsBytes(const QString &text) const;\n\n    //! \\internal Convert encoded bytes to a QString.\n    QString bytesAsText(const char *bytes) const;\n\nprivate slots:\n    void handleTimer();\n    void handleVSb(int value);\n    void handleHSb(int value);\n    void handleSelection();\n\nprivate:\n    // This is needed to allow QsciScintillaQt to emit this class's signals.\n    friend class QsciScintillaQt;\n\n    QsciScintillaQt *sci;\n    QPoint triple_click_at;\n    QTimer triple_click;\n    QScrollBar *vsb;\n    QScrollBar *hsb;\n    QWidget *txtarea;\n\n\n    QsciScintillaBase(const QsciScintillaBase &);\n    QsciScintillaBase &operator=(const QsciScintillaBase &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscistyle.h",
    "content": "// This module defines interface to the QsciStyle class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCISTYLE_H\n#define QSCISTYLE_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qstring.h>\n\n#include <Qsci/qsciglobal.h>\n\n\nclass QsciScintillaBase;\n\n\n//! \\brief The QsciStyle class encapsulates all the attributes of a style.\n//!\n//! Each character of a document has an associated style which determines how\n//! the character is displayed, e.g. its font and color.  A style is identified\n//! by a number.  Lexers define styles for each of the language's features so\n//! that they are displayed differently.  Some style numbers have hard-coded\n//! meanings, e.g. the style used for call tips.\nclass QSCINTILLA_EXPORT QsciStyle\n{\npublic:\n    //! This enum defines the different ways the displayed case of the text can\n    //! be changed.\n    enum TextCase {\n        //! The text is displayed as its original case.\n        OriginalCase = 0,\n\n        //! The text is displayed as upper case.\n        UpperCase = 1,\n\n        //! The text is displayed as lower case.\n        LowerCase = 2\n    };\n\n    //! Constructs a QsciStyle instance for style number \\a style.  If \\a style\n    //! is negative then a new style number is automatically allocated.\n    QsciStyle(int style = -1);\n\n    //! Constructs a QsciStyle instance for style number \\a style.  If \\a style\n    //! is negative then a new style number is automatically allocated.  The\n    //! styles description, color, paper color, font and end-of-line fill are\n    //! set to \\a description, \\a color, \\a paper, \\a font and \\a eolFill\n    //! respectively.\n    QsciStyle(int style, const QString &description, const QColor &color,\n            const QColor &paper, const QFont &font, bool eolFill = false);\n\n    //! \\internal Apply the style to a particular editor.\n    void apply(QsciScintillaBase *sci) const;\n\n    //! Returns the number of the style.\n    int style() const {return style_nr;}\n\n    //! The style's description is set to \\a description.\n    //!\n    //! \\sa description()\n    void setDescription(const QString &description) {style_description = description;}\n\n    //! Returns the style's description.\n    //!\n    //! \\sa setDescription()\n    QString description() const {return style_description;}\n\n    //! The style's foreground color is set to \\a color.  The default is taken\n    //! from the application's default palette.\n    //!\n    //! \\sa color()\n    void setColor(const QColor &color);\n\n    //! Returns the style's foreground color.\n    //!\n    //! \\sa setColor()\n    QColor color() const {return style_color;}\n\n    //! The style's background color is set to \\a paper.  The default is taken\n    //! from the application's default palette.\n    //!\n    //! \\sa paper()\n    void setPaper(const QColor &paper);\n\n    //! Returns the style's background color.\n    //!\n    //! \\sa setPaper()\n    QColor paper() const {return style_paper;}\n\n    //! The style's font is set to \\a font.  The default is the application's\n    //! default font.\n    //!\n    //! \\sa font()\n    void setFont(const QFont &font);\n\n    //! Returns the style's font.\n    //!\n    //! \\sa setFont()\n    QFont font() const {return style_font;}\n\n    //! The style's end-of-line fill is set to \\a fill.  The default is false.\n    //!\n    //! \\sa eolFill()\n    void setEolFill(bool fill);\n\n    //! Returns the style's end-of-line fill.\n    //!\n    //! \\sa setEolFill()\n    bool eolFill() const {return style_eol_fill;}\n\n    //! The style's text case is set to \\a text_case.  The default is\n    //! OriginalCase.\n    //!\n    //! \\sa textCase()\n    void setTextCase(TextCase text_case);\n\n    //! Returns the style's text case.\n    //!\n    //! \\sa setTextCase()\n    TextCase textCase() const {return style_case;}\n\n    //! The style's visibility is set to \\a visible.  The default is true.\n    //!\n    //! \\sa visible()\n    void setVisible(bool visible);\n\n    //! Returns the style's visibility.\n    //!\n    //! \\sa setVisible()\n    bool visible() const {return style_visible;}\n\n    //! The style's changeability is set to \\a changeable.  The default is\n    //! true.\n    //!\n    //! \\sa changeable()\n    void setChangeable(bool changeable);\n\n    //! Returns the style's changeability.\n    //!\n    //! \\sa setChangeable()\n    bool changeable() const {return style_changeable;}\n\n    //! The style's sensitivity to mouse clicks is set to \\a hotspot.  The\n    //! default is false.\n    //!\n    //! \\sa hotspot()\n    void setHotspot(bool hotspot);\n\n    //! Returns the style's sensitivity to mouse clicks.\n    //!\n    //! \\sa setHotspot()\n    bool hotspot() const {return style_hotspot;}\n\n    //! Refresh the style settings.\n    void refresh();\n\nprivate:\n    int style_nr;\n    QString style_description;\n    QColor style_color;\n    QColor style_paper;\n    QFont style_font;\n    bool style_eol_fill;\n    TextCase style_case;\n    bool style_visible;\n    bool style_changeable;\n    bool style_hotspot;\n\n    void init(int style);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/Qsci/qscistyledtext.h",
    "content": "// This module defines interface to the QsciStyledText class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCISTYLEDTEXT_H\n#define QSCISTYLEDTEXT_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qstring.h>\n\n#include <Qsci/qsciglobal.h>\n\n\nclass QsciScintillaBase;\nclass QsciStyle;\n\n\n//! \\brief The QsciStyledText class is a container for a piece of text and the\n//! style used to display the text.\nclass QSCINTILLA_EXPORT QsciStyledText\n{\npublic:\n    //! Constructs a QsciStyledText instance for text \\a text and style number\n    //! \\a style.\n    QsciStyledText(const QString &text, int style);\n\n    //! Constructs a QsciStyledText instance for text \\a text and style \\a\n    //! style.\n    QsciStyledText(const QString &text, const QsciStyle &style);\n\n    //! \\internal A default constructor needed by Qt v3's QValueList.\n    QsciStyledText() {}\n\n    //! \\internal Apply the style to a particular editor.\n    void apply(QsciScintillaBase *sci) const;\n\n    //! Returns a reference to the text.\n    const QString &text() const {return styled_text;}\n\n    //! Returns the number of the style.\n    int style() const;\n\nprivate:\n    QString styled_text;\n    int style_nr;\n    const QsciStyle *explicit_style;\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/SciClasses.cpp",
    "content": "// The implementation of various Qt version independent classes used by the\n// rest of the port.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"SciNamespace.h\"\n#include \"SciClasses.h\"\n\n#include <qevent.h>\n#include <qpainter.h>\n\n#include \"ScintillaQt.h\"\n#include \"ListBoxQt.h\"\n\n\n// Create a call tip.\nQsciSciCallTip::QsciSciCallTip(QWidget *parent, QsciScintillaQt *sci_)\n    : QWidget(parent, 0, Qt::WType_Popup|Qt::WStyle_Customize|Qt::WStyle_NoBorder),\n      sci(sci_)\n{\n    // Ensure that the main window keeps the focus (and the caret flashing)\n    // when this is displayed.\n    setFocusProxy(parent);\n}\n\n\n// Destroy a call tip.\nQsciSciCallTip::~QsciSciCallTip()\n{\n    // Ensure that the main window doesn't receive a focus out event when\n    // this is destroyed.\n    setFocusProxy(0);\n}\n\n\n// Paint a call tip.\nvoid QsciSciCallTip::paintEvent(QPaintEvent *)\n{\n    QSCI_SCI_NAMESPACE(Surface) *surfaceWindow = QSCI_SCI_NAMESPACE(Surface)::Allocate(SC_TECHNOLOGY_DEFAULT);\n\n    if (!surfaceWindow)\n        return;\n\n    QPainter p(this);\n\n    surfaceWindow->Init(&p);\n    surfaceWindow->SetUnicodeMode(sci->CodePage() == SC_CP_UTF8);\n    sci->ct.PaintCT(surfaceWindow);\n\n    delete surfaceWindow;\n}\n\n\n// Handle a mouse press in a call tip.\nvoid QsciSciCallTip::mousePressEvent(QMouseEvent *e)\n{\n    QSCI_SCI_NAMESPACE(Point) pt;\n\n    pt.x = e->x();\n    pt.y = e->y();\n\n    sci->ct.MouseClick(pt);\n    sci->CallTipClick();\n\n    update();\n}\n\n\n\n// Add an item and associated command to the popup and enable it if required.\nvoid QsciSciPopup::addItem(const QString &label, int cmd, bool enabled,\n        QsciScintillaQt *sci_)\n{\n    insertItem(label, this, SLOT(on_triggered(int)), 0, cmd);\n    setItemEnabled(cmd, enabled);\n    sci = sci_;\n}\n\n\n// Add a separator to the popup.\nvoid QsciSciPopup::addSeparator()\n{\n    insertSeparator();\n}\n\n\n// A slot to handle a menu action being triggered.\nvoid QsciSciPopup::on_triggered(int cmd)\n{\n    sci->Command(cmd);\n}\n\n\n\nQsciSciListBox::QsciSciListBox(QWidget *parent, QsciListBoxQt *lbx_)\n    : QListBox(parent,0,Qt::WType_Popup|Qt::WStyle_Customize|Qt::WStyle_NoBorder|Qt::WStaticContents), lbx(lbx_)\n{\n    setFocusProxy(parent);\n\n    setFrameShape(StyledPanel);\n    setFrameShadow(Plain);\n\n    connect(this,SIGNAL(doubleClicked(QListBoxItem *)),\n        SLOT(handleSelection()));\n\n    connect(this,SIGNAL(highlighted(QListBoxItem *)),\n        SLOT(ensureCurrentVisible()));\n}\n\n\nint QsciSciListBox::find(const QString &prefix)\n{\n    return index(findItem(prefix, Qt::CaseSensitive|Qt::BeginsWith));\n}\n\n\n\nQsciSciListBox::~QsciSciListBox()\n{\n    // Ensure that the main widget doesn't get a focus out event when this is\n    // destroyed.\n    setFocusProxy(0);\n}\n\n\nvoid QsciSciListBox::handleSelection()\n{\n    if (lbx && lbx->cb_action)\n        lbx->cb_action(lbx->cb_data);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/SciClasses.h",
    "content": "// The definition of various Qt version independent classes used by the rest of\n// the port.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef _SCICLASSES_H\n#define _SCICLASSES_H\n\n#include <qglobal.h>\n#include <qwidget.h>\n\n#include <Qsci/qsciglobal.h>\n\n\nQT_BEGIN_NAMESPACE\nclass QMouseEvent;\nclass QPaintEvent;\nQT_END_NAMESPACE\n\nclass QsciScintillaQt;\nclass QsciListBoxQt;\n\n\n// A simple QWidget sub-class to implement a call tip.  This is not put into\n// the Scintilla namespace because of moc's problems with preprocessor macros.\nclass QsciSciCallTip : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    QsciSciCallTip(QWidget *parent, QsciScintillaQt *sci_);\n    ~QsciSciCallTip();\n\nprotected:\n    void paintEvent(QPaintEvent *e);\n    void mousePressEvent(QMouseEvent *e);\n\nprivate:\n    QsciScintillaQt *sci;\n};\n\n\n// A popup menu where options correspond to a numeric command.  This is not put\n// into the Scintilla namespace because of moc's problems with preprocessor\n// macros.\n\n#include <qpopupmenu.h>\n\nclass QsciSciPopup : public QPopupMenu\n{\n    Q_OBJECT\n\npublic:\n    void addItem(const QString &label, int cmd, bool enabled,\n            QsciScintillaQt *sci_);\n    void addSeparator();\n\nprivate slots:\n    void on_triggered(int cmd);\n\nprivate:\n    QsciScintillaQt *sci;\n};\n\n\n\n// This sub-class of QListBox is needed to provide slots from which we can call\n// QsciListBox's double-click callback (and you thought this was a C++\n// program).  This is not put into the Scintilla namespace because of moc's\n// problems with preprocessor macros.\n\n\n#include <qlistbox.h>\n\nclass QsciSciListBox : public QListBox\n{\n    Q_OBJECT\n\npublic:\n    QsciSciListBox(QWidget *parent, QsciListBoxQt *lbx_);\n    virtual ~QsciSciListBox();\n\n    void addItem(const QString &txt)\n    {\n        insertItem(txt);\n    }\n\n    void addItemPixmap(const QPixmap &pm, const QString &txt)\n    {\n        insertItem(pm, txt);\n    }\n\n    int currentRow()\n    {\n        return currentItem();\n    }\n\n    void setCurrentRow(int n)\n    {\n        setSelected(n, true);\n    }\n\n    int find(const QString &prefix);\n\n    void sortItems()\n    {\n        sort();\n    }\n\nprivate slots:\n    void handleSelection();\n\nprivate:\n    QsciListBoxQt *lbx;\n};\n\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/SciNamespace.h",
    "content": "// Support for building the Scintilla code in the Scintilla namespace using the\n// -DSCI_NAMESPACE compiler flag.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef _SCINAMESPACE_H\n#define _SCINAMESPACE_H\n\n#ifdef SCI_NAMESPACE\n#define QSCI_SCI_NAMESPACE(name)    Scintilla::name\n#define QSCI_BEGIN_SCI_NAMESPACE    namespace Scintilla {\n#define QSCI_END_SCI_NAMESPACE      };\n#else\n#define QSCI_SCI_NAMESPACE(name)    name\n#define QSCI_BEGIN_SCI_NAMESPACE\n#define QSCI_END_SCI_NAMESPACE\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/ScintillaQt.cpp",
    "content": "// The implementation of the Qt specific subclass of ScintillaBase.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include <string.h>\n\n#include <qapplication.h>\n#include <qevent.h>\n#include <qpainter.h>\n#include <qscrollbar.h>\n#include <qstring.h>\n\n#include <qcstring.h>\n#include <qdragobject.h>\n\n#include \"Qsci/qsciscintillabase.h\"\n#include \"ScintillaQt.h\"\n#include \"SciClasses.h\"\n\n\n// We want to use the Scintilla notification names as Qt signal names.\n#undef  SCEN_CHANGE\n#undef  SCN_AUTOCCANCELLED\n#undef  SCN_AUTOCCHARDELETED\n#undef  SCN_AUTOCSELECTION\n#undef  SCN_CALLTIPCLICK\n#undef  SCN_CHARADDED\n#undef  SCN_DOUBLECLICK\n#undef  SCN_DWELLEND\n#undef  SCN_DWELLSTART\n#undef  SCN_FOCUSIN\n#undef  SCN_FOCUSOUT\n#undef  SCN_HOTSPOTCLICK\n#undef  SCN_HOTSPOTDOUBLECLICK\n#undef  SCN_HOTSPOTRELEASECLICK\n#undef  SCN_INDICATORCLICK\n#undef  SCN_INDICATORRELEASE\n#undef  SCN_MACRORECORD\n#undef  SCN_MARGINCLICK\n#undef  SCN_MODIFIED\n#undef  SCN_MODIFYATTEMPTRO\n#undef  SCN_NEEDSHOWN\n#undef  SCN_PAINTED\n#undef  SCN_SAVEPOINTLEFT\n#undef  SCN_SAVEPOINTREACHED\n#undef  SCN_STYLENEEDED\n#undef  SCN_UPDATEUI\n#undef  SCN_USERLISTSELECTION\n#undef  SCN_ZOOM\n\nenum\n{\n    SCEN_CHANGE = 768,\n    SCN_AUTOCCANCELLED = 2025,\n    SCN_AUTOCCHARDELETED = 2026,\n    SCN_AUTOCSELECTION = 2022,\n    SCN_CALLTIPCLICK = 2021,\n    SCN_CHARADDED = 2001,\n    SCN_DOUBLECLICK = 2006,\n    SCN_DWELLEND = 2017,\n    SCN_DWELLSTART = 2016,\n    SCN_FOCUSIN = 2028,\n    SCN_FOCUSOUT = 2029,\n    SCN_HOTSPOTCLICK = 2019,\n    SCN_HOTSPOTDOUBLECLICK = 2020,\n    SCN_HOTSPOTRELEASECLICK = 2027,\n    SCN_INDICATORCLICK = 2023,\n    SCN_INDICATORRELEASE = 2024,\n    SCN_MACRORECORD = 2009,\n    SCN_MARGINCLICK = 2010,\n    SCN_MODIFIED = 2008,\n    SCN_MODIFYATTEMPTRO = 2004,\n    SCN_NEEDSHOWN = 2011,\n    SCN_PAINTED = 2013,\n    SCN_SAVEPOINTLEFT = 2003,\n    SCN_SAVEPOINTREACHED = 2002,\n    SCN_STYLENEEDED = 2000,\n    SCN_UPDATEUI = 2007,\n    SCN_USERLISTSELECTION = 2014,\n    SCN_ZOOM = 2018\n};\n\n\n// The ctor.\nQsciScintillaQt::QsciScintillaQt(QsciScintillaBase *qsb_)\n    : capturedMouse(false), qsb(qsb_)\n{\n    wMain = qsb->viewport();\n\n    // We aren't a QObject so we use the API class to do QObject related things\n    // for us.\n    qsb->connect(&qtimer, SIGNAL(timeout()), SLOT(handleTimer()));\n    \n    Initialise();\n}\n\n\n// The dtor.\nQsciScintillaQt::~QsciScintillaQt()\n{ \n    Finalise();\n}\n\n\n// Initialise the instance.\nvoid QsciScintillaQt::Initialise()\n{\n    SetTicking(true);\n}\n\n\n// Tidy up the instance.\nvoid QsciScintillaQt::Finalise()\n{\n    SetTicking(false);\n    ScintillaBase::Finalise();\n}\n\n\n// Start a drag.\nvoid QsciScintillaQt::StartDrag()\n{\n    inDragDrop = ddDragging;\n\n    QDragObject *dobj = new QTextDrag(textRange(&drag), qsb->viewport());\n\n    // Remove the dragged text if it was a move to another widget or\n    // application.\n    if (dobj->drag() && dobj->target() != qsb->viewport())\n        ClearSelection();\n\n    SetDragPosition(QSCI_SCI_NAMESPACE(SelectionPosition)());\n    inDragDrop = ddNone;\n}\n\n\n// Re-implement to trap certain messages.\nsptr_t QsciScintillaQt::WndProc(unsigned int iMessage, uptr_t wParam,\n        sptr_t lParam)\n{\n    switch (iMessage)\n    {\n    case SCI_GETDIRECTFUNCTION:\n        return reinterpret_cast<sptr_t>(DirectFunction);\n    \n    case SCI_GETDIRECTPOINTER:\n        return reinterpret_cast<sptr_t>(this);\n    }\n\n    return ScintillaBase::WndProc(iMessage, wParam, lParam);\n}\n\n\n// Windows nonsense.\nsptr_t QsciScintillaQt::DefWndProc(unsigned int, uptr_t, sptr_t)\n{\n    return 0;\n}\n\n\n// Manage the timer.\nvoid QsciScintillaQt::SetTicking(bool on)\n{\n    if (timer.ticking != on)\n    {\n        timer.ticking = on;\n\n        if (timer.ticking)\n            qtimer.start(timer.tickSize);\n        else\n            qtimer.stop();\n    }\n\n    timer.ticksToWait = caret.period;\n}\n\n\n// Grab or release the mouse (and keyboard).\nvoid QsciScintillaQt::SetMouseCapture(bool on)\n{\n    if (mouseDownCaptures)\n        if (on)\n            qsb->viewport()->grabMouse();\n        else\n            qsb->viewport()->releaseMouse();\n\n    capturedMouse = on;\n}\n\n\n// Return true if the mouse/keyboard are currently grabbed.\nbool QsciScintillaQt::HaveMouseCapture()\n{\n    return capturedMouse;\n}\n\n\n// Set the position of the vertical scrollbar.\nvoid QsciScintillaQt::SetVerticalScrollPos()\n{\n    qsb->verticalScrollBar()->setValue(topLine);\n}\n\n\n// Set the position of the horizontal scrollbar.\nvoid QsciScintillaQt::SetHorizontalScrollPos()\n{\n    qsb->horizontalScrollBar()->setValue(xOffset);\n}\n\n\n// Set the extent of the vertical and horizontal scrollbars and return true if\n// the view needs re-drawing.\nbool QsciScintillaQt::ModifyScrollBars(int nMax,int nPage)\n{\n    qsb->verticalScrollBar()->setMinValue(0);\n    qsb->verticalScrollBar()->setMaxValue(nMax - nPage + 1);\n    qsb->verticalScrollBar()->setPageStep(nPage);\n    qsb->verticalScrollBar()->setLineStep(1);\n\n    qsb->horizontalScrollBar()->setMinValue(0);\n    qsb->horizontalScrollBar()->setMaxValue(scrollWidth);\n    qsb->horizontalScrollBar()->setPageStep(scrollWidth / 10);\n\n    return true;\n}\n\n\n// Called after SCI_SETWRAPMODE and SCI_SETHSCROLLBAR.\nvoid QsciScintillaQt::ReconfigureScrollBars()\n{\n    // Hide or show the scrollbars if needed.\n    bool hsb = (horizontalScrollBarVisible && !Wrapping());\n\n    if (hsb)\n        qsb->horizontalScrollBar()->show();\n    else\n        qsb->horizontalScrollBar()->hide();\n\n    if (verticalScrollBarVisible)\n        qsb->verticalScrollBar()->show();\n    else\n        qsb->verticalScrollBar()->hide();\n}\n\n\n// Notify interested parties of any change in the document.\nvoid QsciScintillaQt::NotifyChange()\n{\n    emit qsb->SCEN_CHANGE();\n}\n\n\n// Notify interested parties of various events.  This is the main mapping\n// between Scintilla notifications and Qt signals.\nvoid QsciScintillaQt::NotifyParent(QSCI_SCI_NAMESPACE(SCNotification) scn)\n{\n    switch (scn.nmhdr.code)\n    {\n    case SCN_CALLTIPCLICK:\n        emit qsb->SCN_CALLTIPCLICK(scn.position);\n        break;\n\n    case SCN_AUTOCCANCELLED:\n        emit qsb->SCN_AUTOCCANCELLED();\n        break;\n\n    case SCN_AUTOCCHARDELETED:\n        emit qsb->SCN_AUTOCCHARDELETED();\n        break;\n\n    case SCN_AUTOCSELECTION:\n        emit qsb->SCN_AUTOCSELECTION(scn.text, scn.lParam);\n        break;\n\n    case SCN_CHARADDED:\n        emit qsb->SCN_CHARADDED(scn.ch);\n        break;\n\n    case SCN_DOUBLECLICK:\n        emit qsb->SCN_DOUBLECLICK(scn.position, scn.line, scn.modifiers);\n        break;\n\n    case SCN_DWELLEND:\n        emit qsb->SCN_DWELLEND(scn.position, scn.x, scn.y);\n        break;\n\n    case SCN_DWELLSTART:\n        emit qsb->SCN_DWELLSTART(scn.position, scn.x, scn.y);\n        break;\n\n    case SCN_FOCUSIN:\n        emit qsb->SCN_FOCUSIN();\n        break;\n\n    case SCN_FOCUSOUT:\n        emit qsb->SCN_FOCUSOUT();\n        break;\n\n    case SCN_HOTSPOTCLICK:\n        emit qsb->SCN_HOTSPOTCLICK(scn.position, scn.modifiers);\n        break;\n\n    case SCN_HOTSPOTDOUBLECLICK:\n        emit qsb->SCN_HOTSPOTDOUBLECLICK(scn.position, scn.modifiers);\n        break;\n\n    case SCN_HOTSPOTRELEASECLICK:\n        emit qsb->SCN_HOTSPOTRELEASECLICK(scn.position, scn.modifiers);\n        break;\n\n    case SCN_INDICATORCLICK:\n        emit qsb->SCN_INDICATORCLICK(scn.position, scn.modifiers);\n        break;\n\n    case SCN_INDICATORRELEASE:\n        emit qsb->SCN_INDICATORRELEASE(scn.position, scn.modifiers);\n        break;\n\n    case SCN_MACRORECORD:\n        emit qsb->SCN_MACRORECORD(scn.message, scn.wParam,\n                reinterpret_cast<void *>(scn.lParam));\n        break;\n\n    case SCN_MARGINCLICK:\n        emit qsb->SCN_MARGINCLICK(scn.position, scn.modifiers, scn.margin);\n        break;\n\n    case SCN_MODIFIED:\n        {\n            char *text;\n\n            // Give some protection to the Python bindings.\n            if (scn.text && (scn.modificationType & (SC_MOD_INSERTTEXT|SC_MOD_DELETETEXT) != 0))\n            {\n                text = new char[scn.length + 1];\n                memcpy(text, scn.text, scn.length);\n                text[scn.length] = '\\0';\n            }\n            else\n            {\n                text = 0;\n            }\n\n            emit qsb->SCN_MODIFIED(scn.position, scn.modificationType, text,\n                    scn.length, scn.linesAdded, scn.line, scn.foldLevelNow,\n                    scn.foldLevelPrev, scn.token, scn.annotationLinesAdded);\n\n            if (text)\n                delete[] text;\n\n            break;\n        }\n\n    case SCN_MODIFYATTEMPTRO:\n        emit qsb->SCN_MODIFYATTEMPTRO();\n        break;\n\n    case SCN_NEEDSHOWN:\n        emit qsb->SCN_NEEDSHOWN(scn.position, scn.length);\n        break;\n\n    case SCN_PAINTED:\n        emit qsb->SCN_PAINTED();\n        break;\n\n    case SCN_SAVEPOINTLEFT:\n        emit qsb->SCN_SAVEPOINTLEFT();\n        break;\n\n    case SCN_SAVEPOINTREACHED:\n        emit qsb->SCN_SAVEPOINTREACHED();\n        break;\n\n    case SCN_STYLENEEDED:\n        emit qsb->SCN_STYLENEEDED(scn.position);\n        break;\n\n    case SCN_UPDATEUI:\n        emit qsb->SCN_UPDATEUI(scn.updated);\n        break;\n\n    case SCN_USERLISTSELECTION:\n        emit qsb->SCN_USERLISTSELECTION(scn.text, scn.wParam);\n        break;\n\n    case SCN_ZOOM:\n        emit qsb->SCN_ZOOM();\n        break;\n\n    default:\n        qWarning(\"Unknown notification: %u\", scn.nmhdr.code);\n    }\n}\n\n\n\n// Convert a text range to a QString.\nQString QsciScintillaQt::textRange(\n        const QSCI_SCI_NAMESPACE(SelectionText) *text) const\n{\n    const char *text_data = text->Data();\n\n    if (!text_data)\n        return QString();\n\n    if (IsUnicodeMode())\n        return QString::fromUtf8(text_data);\n\n    return QString::fromLatin1(text_data);\n}\n\n\n\n// Copy the selected text to the clipboard.\nvoid QsciScintillaQt::CopyToClipboard(\n        const QSCI_SCI_NAMESPACE(SelectionText) &selectedText)\n{\n    QApplication::clipboard()->setText(textRange(&selectedText));\n}\n\n\n// Implement copy.\nvoid QsciScintillaQt::Copy()\n{\n    if (!sel.Empty())\n    {\n        QSCI_SCI_NAMESPACE(SelectionText) text;\n\n        CopySelectionRange(&text);\n        CopyToClipboard(text);\n    }\n}\n\n\n// Implement pasting text.\nvoid QsciScintillaQt::Paste()\n{\n    pasteFromClipboard(QClipboard::Clipboard);\n}\n\n\n// Paste text from either the clipboard or selection.\nvoid QsciScintillaQt::pasteFromClipboard(QClipboard::Mode mode)\n{\n    int len;\n    const char *s;\n    bool rectangular;\n\n    // This code is historical.  We could support rectangular selections and\n    // not do the unnecessary UTF-8 conversions but we no longer actively\n    // support Qt v3.\n    QString str = QApplication::clipboard()->text(mode);\n\n    if (str.isEmpty())\n        return;\n\n    QCString bytes;\n\n    if (IsUnicodeMode())\n    {\n        bytes = str.utf8();\n\n        len = bytes.length();\n        s = bytes.data();\n    }\n    else\n    {\n        s = str.latin1();\n        len = (s ? qstrlen(s) : 0);\n    }\n\n    rectangular = false;\n\n    std::string dest = QSCI_SCI_NAMESPACE(Document)::TransformLineEnds(s, len,\n            pdoc->eolMode);\n\n    QSCI_SCI_NAMESPACE(SelectionText) selText;\n    selText.Copy(dest, (IsUnicodeMode() ? SC_CP_UTF8 : 0),\n            vs.styles[STYLE_DEFAULT].characterSet, rectangular, false);\n\n    QSCI_SCI_NAMESPACE(UndoGroup) ug(pdoc);\n\n    ClearSelection();\n\n    QSCI_SCI_NAMESPACE(SelectionPosition) start = sel.IsRectangular()\n            ? sel.Rectangular().Start() : sel.Range(sel.Main()).Start();\n\n    if (selText.rectangular)\n        PasteRectangular(start, selText.Data(), selText.Length());\n    else\n        InsertPaste(start, selText.Data(), selText.Length());\n\n    NotifyChange();\n    Redraw();\n}\n\n\n// Create a call tip window.\nvoid QsciScintillaQt::CreateCallTipWindow(QSCI_SCI_NAMESPACE(PRectangle) rc)\n{\n    if (!ct.wCallTip.Created())\n        ct.wCallTip = ct.wDraw = new QsciSciCallTip(qsb, this);\n\n    QsciSciCallTip *w = reinterpret_cast<QsciSciCallTip *>(ct.wCallTip.GetID());\n\n    w->resize(rc.right - rc.left, rc.bottom - rc.top);\n    ct.wCallTip.Show();\n}\n\n\n// Add an item to the right button menu.\nvoid QsciScintillaQt::AddToPopUp(const char *label, int cmd, bool enabled)\n{\n    QsciSciPopup *pm = static_cast<QsciSciPopup *>(popup.GetID());\n\n    if (*label)\n        pm->addItem(qApp->translate(\"ContextMenu\", label), cmd, enabled, this);\n    else\n        pm->addSeparator();\n}\n\n\n// Claim the selection.\nvoid QsciScintillaQt::ClaimSelection()\n{\n    bool isSel = !sel.Empty();\n\n    if (isSel)\n    {\n        QClipboard *cb = QApplication::clipboard();\n\n        // If we support X11 style selection then make it available now.\n        if (cb->supportsSelection())\n        {\n            QSCI_SCI_NAMESPACE(SelectionText) text;\n\n            CopySelectionRange(&text);\n\n            if (text.Data())\n                cb->setText(textRange(&text), QClipboard::Selection);\n        }\n\n        primarySelection = true;\n    }\n    else\n        primarySelection = false;\n\n    emit qsb->QSCN_SELCHANGED(isSel);\n}\n\n\n// Unclaim the selection.\nvoid QsciScintillaQt::UnclaimSelection()\n{\n    if (primarySelection)\n    {\n        primarySelection = false;\n        qsb->viewport()->update();\n    }\n}\n\n\n// Implemented to provide compatibility with the Windows version.\nsptr_t QsciScintillaQt::DirectFunction(QsciScintillaQt *sciThis, unsigned int iMessage,\n        uptr_t wParam, sptr_t lParam)\n{\n    return sciThis->WndProc(iMessage,wParam,lParam);\n}\n\n\n// Draw the contents of the widget.\nvoid QsciScintillaQt::paintEvent(QPaintEvent *e)\n{\n    QSCI_SCI_NAMESPACE(Surface) *sw = QSCI_SCI_NAMESPACE(Surface)::Allocate(SC_TECHNOLOGY_DEFAULT);\n\n    if (!sw)\n        return;\n\n    paintState = painting;\n\n    const QRect &qr = e->rect();\n\n    rcPaint.left = qr.left();\n    rcPaint.top = qr.top();\n    rcPaint.right = qr.right() + 1;\n    rcPaint.bottom = qr.bottom() + 1;\n\n    QSCI_SCI_NAMESPACE(PRectangle) rcText = GetTextRectangle();\n    paintingAllText = rcPaint.Contains(rcText);\n\n    QPainter painter(qsb->viewport());\n\n    sw->Init(&painter);\n    sw->SetUnicodeMode(CodePage() == SC_CP_UTF8);\n    Paint(sw, rcPaint);\n\n    delete sw;\n\n    // If the painting area was insufficient to cover the new style or brace\n    // highlight positions then repaint the whole thing.\n    if (paintState == paintAbandoned)\n        qsb->viewport()->update();\n\n    paintState = notPainting;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/ScintillaQt.h",
    "content": "// The definition of the Qt specific subclass of ScintillaBase.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef SCINTILLAQT_H\n#define\tSCINTILLAQT_H\n\n\n#include <qtimer.h>\n#include <qclipboard.h>\n\n#include <Qsci/qsciglobal.h>\n\n#include \"SciNamespace.h\"\n\n// These are needed because Scintilla class header files don't manage their own\n// dependencies properly.\n#include <vector>\n#include <algorithm>\n#include <assert.h>\n#include <ctype.h>\n#include <stdlib.h>\n#include <string>\n#include \"ILexer.h\"\n#include \"Platform.h\"\n#include \"Scintilla.h\"\n#include \"SplitVector.h\"\n#include \"Partitioning.h\"\n#include \"CellBuffer.h\"\n#include \"CharClassify.h\"\n#include \"RunStyles.h\"\n#include \"CaseFolder.h\"\n#include \"Decoration.h\"\n#include \"Document.h\"\n#include \"Style.h\"\n#include \"XPM.h\"\n#include \"LineMarker.h\"\n#include \"Indicator.h\"\n#include \"ViewStyle.h\"\n#include \"KeyMap.h\"\n#include \"ContractionState.h\"\n#include \"Selection.h\"\n#include \"PositionCache.h\"\n#include \"Editor.h\"\n#include \"AutoComplete.h\"\n#include \"CallTip.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n\n#include \"ScintillaBase.h\"\n\n\nQT_BEGIN_NAMESPACE\nclass QPaintEvent;\nclass QDropEvent;\nQT_END_NAMESPACE\n\nclass QsciScintillaBase;\nclass QsciSciCallTip;\nclass QsciSciPopup;\n\n\n// This is an internal class but it is referenced by a public class so it has\n// to have a Qsci prefix rather than being put in the Scintilla namespace\n// which would mean exposing the SCI_NAMESPACE mechanism).\nclass QsciScintillaQt : public QSCI_SCI_NAMESPACE(ScintillaBase)\n{\n\tfriend class QsciScintillaBase;\n\tfriend class QsciSciCallTip;\n\tfriend class QsciSciPopup;\n\npublic:\n\tQsciScintillaQt(QsciScintillaBase *qsb_);\n\tvirtual ~QsciScintillaQt();\n\n\tvirtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam,\n            sptr_t lParam);\n\nprivate:\n\tvoid Initialise();\n\tvoid Finalise();\n\tvoid StartDrag();\n\tsptr_t DefWndProc(unsigned int, uptr_t, sptr_t);\n\tvoid SetTicking(bool);\n\tvoid SetMouseCapture(bool on);\n\tbool HaveMouseCapture();\n\tvoid SetVerticalScrollPos();\n\tvoid SetHorizontalScrollPos();\n\tbool ModifyScrollBars(int nMax, int nPage);\n\tvoid ReconfigureScrollBars();\n\tvoid NotifyChange();\n\tvoid NotifyParent(QSCI_SCI_NAMESPACE(SCNotification) scn);\n\tvoid CopyToClipboard(\n            const QSCI_SCI_NAMESPACE(SelectionText) &selectedText);\n\tvoid Copy();\n\tvoid Paste();\n\tvoid CreateCallTipWindow(QSCI_SCI_NAMESPACE(PRectangle) rc);\n\tvoid AddToPopUp(const char *label, int cmd = 0, bool enabled = true);\n\tvoid ClaimSelection();\n\tvoid UnclaimSelection();\n\tstatic sptr_t DirectFunction(QsciScintillaQt *sci, unsigned int iMessage,\n            uptr_t wParam,sptr_t lParam);\n\n\tQString textRange(const QSCI_SCI_NAMESPACE(SelectionText) *text) const;\n\tvoid paintEvent(QPaintEvent *e);\n    void pasteFromClipboard(QClipboard::Mode mode);\n\n\tbool capturedMouse;\n\tQsciScintillaBase *qsb;\n\tQTimer qtimer;\n};\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qsciabstractapis.cpp",
    "content": "// This module implements the QsciAbstractAPIs class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qsciabstractapis.h\"\n\n#include \"Qsci/qscilexer.h\"\n\n\n// The ctor.\nQsciAbstractAPIs::QsciAbstractAPIs(QsciLexer *lexer, const char *name)\n    : QObject(lexer, name),\n      lex(lexer)\n{\n    lexer->setAPIs(this);\n}\n\n\n// The dtor.\nQsciAbstractAPIs::~QsciAbstractAPIs()\n{\n}\n\n\n// Return the lexer.\nQsciLexer *QsciAbstractAPIs::lexer() const\n{\n    return lex;\n}\n\n\n// Called when the user has made a selection from the auto-completion list.\nvoid QsciAbstractAPIs::autoCompletionSelected(const QString &selection)\n{\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qsciapis.cpp",
    "content": "// This module implements the QsciAPIs class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include <stdlib.h>\n\n#include \"Qsci/qsciapis.h\"\n\n#include <qapplication.h>\n#include <qdatastream.h>\n#include <qdir.h>\n#include <qevent.h>\n#include <qfile.h>\n#include <qmap.h>\n#include <qtextstream.h>\n#include <qthread.h>\n\n#include <stdlib.h>\n\n#include \"Qsci/qscilexer.h\"\n\n\n\n// The version number of the prepared API information format.\nconst unsigned char PreparedDataFormatVersion = 0;\n\n\n// This class contains prepared API information.\nstruct QsciAPIsPrepared\n{\n    // The word dictionary is a map of individual words and a list of positions\n    // each occurs in the sorted list of APIs.  A position is a tuple of the\n    // index into the list of APIs and the index into the particular API.\n    QMap<QString, QsciAPIs::WordIndexList> wdict;\n\n    // The case dictionary maps the case insensitive words to the form in which\n    // they are to be used.  It is only used if the language is case\n    // insensitive.\n    QMap<QString, QString> cdict;\n\n    // The Qt v3 QMap doesn't support lowerBound() so we keep a separate copy\n    // of the sorted keys and use a local implementation.\n    QStringList words;\n\n    static QStringList::const_iterator lowerBound(const QStringList &list,\n            const QString &word);\n\n    // The raw API information.\n    QStringList raw_apis;\n\n    QStringList apiWords(int api_idx, const QStringList &wseps,\n            bool strip_image) const;\n    static QString apiBaseName(const QString &api);\n};\n\n\n// Implement qLowerBound() for a QStringList for Qt v3.\nQStringList::const_iterator QsciAPIsPrepared::lowerBound(const QStringList &list, const QString &word)\n{\n    // It would be nice to be able to do a binary search but random access of a\n    // QValueList is \"slow\" - it probably does a search from the start of the\n    // list.  Therefore we just do a simple linear search and hope it is quick\n    // enough.  If not we will have to implement a new data type.\n    QStringList::const_iterator it = list.begin();\n\n    while (it != list.end())\n    {\n        if (word <= (*it))\n            break;\n\n        ++it;\n    }\n\n    return it;\n}\n\n// Return a particular API entry as a list of words.\nQStringList QsciAPIsPrepared::apiWords(int api_idx, const QStringList &wseps,\n        bool strip_image) const\n{\n    QString base = apiBaseName(raw_apis[api_idx]);\n\n    // Remove any embedded image reference if necessary.\n    if (strip_image)\n    {\n        int tail = base.find('?');\n\n        if (tail >= 0)\n            base.truncate(tail);\n    }\n\n    if (wseps.isEmpty())\n        return QStringList(base);\n\n    return QStringList::split(wseps.first(), base);\n}\n\n\n// Return the name of an API function, ie. without the arguments.\nQString QsciAPIsPrepared::apiBaseName(const QString &api)\n{\n    QString base = api;\n    int tail = base.find('(');\n\n    if (tail >= 0)\n        base.truncate(tail);\n\n    return base.simplifyWhiteSpace();\n}\n\n\n// The user event type that signals that the worker thread has started.\nconst QEvent::Type WorkerStarted = static_cast<QEvent::Type>(QEvent::User + 1012);\n\n\n// The user event type that signals that the worker thread has finished.\nconst QEvent::Type WorkerFinished = static_cast<QEvent::Type>(QEvent::User + 1013);\n\n\n// The user event type that signals that the worker thread has aborted.\nconst QEvent::Type WorkerAborted = static_cast<QEvent::Type>(QEvent::User + 1014);\n\n\n// This class is the worker thread that post-processes the API set.\nclass QsciAPIsWorker : public QThread\n{\npublic:\n    QsciAPIsWorker(QsciAPIs *apis);\n    virtual ~QsciAPIsWorker();\n\n    virtual void run();\n\n    QsciAPIsPrepared *prepared;\n\nprivate:\n    QsciAPIs *proxy;\n    bool abort;\n};\n\n\n// The worker thread ctor.\nQsciAPIsWorker::QsciAPIsWorker(QsciAPIs *apis)\n    : proxy(apis), prepared(0), abort(false)\n{\n}\n\n\n// The worker thread dtor.\nQsciAPIsWorker::~QsciAPIsWorker()\n{\n    // Tell the thread to stop.  There is no need to bother with a mutex.\n    abort = true;\n\n    // Wait for it to do so and hit it if it doesn't.\n    if (!wait(500))\n        terminate();\n\n    if (prepared)\n        delete prepared;\n}\n\n\n// The worker thread entry point.\nvoid QsciAPIsWorker::run()\n{\n    // Sanity check.\n    if (!prepared)\n        return;\n\n    // Tell the main thread we have started.\n    QApplication::postEvent(proxy, new QEvent(WorkerStarted));\n\n    // Sort the full list.\n    prepared->raw_apis.sort();\n\n    QStringList wseps = proxy->lexer()->autoCompletionWordSeparators();\n    bool cs = proxy->lexer()->caseSensitive();\n\n    // Split each entry into separate words but ignoring any arguments.\n    for (int a = 0; a < prepared->raw_apis.count(); ++a)\n    {\n        // Check to see if we should stop.\n        if (abort)\n            break;\n\n        QStringList words = prepared->apiWords(a, wseps, true);\n\n        for (int w = 0; w < words.count(); ++w)\n        {\n            const QString &word = words[w];\n\n            // Add the word's position to any existing list for this word.\n            QsciAPIs::WordIndexList wil = prepared->wdict[word];\n\n            // If the language is case insensitive and we haven't seen this\n            // word before then save it in the case dictionary.\n            if (!cs && wil.count() == 0)\n                prepared->cdict[word.upper()] = word;\n\n            wil.append(QsciAPIs::WordIndex(a, w));\n            prepared->wdict[word] = wil;\n        }\n    }\n\n    if (cs)\n        prepared->words = prepared->wdict.keys();\n    else\n        prepared->words = prepared->cdict.keys();\n\n    // Tell the main thread we have finished.\n    QApplication::postEvent(proxy, new QEvent(abort ? WorkerAborted : WorkerFinished));\n}\n\n\n// The ctor.\nQsciAPIs::QsciAPIs(QsciLexer *lexer, const char *name)\n    : QsciAbstractAPIs(lexer, name),\n      worker(0), origin_len(0)\n{\n    prep = new QsciAPIsPrepared;\n}\n\n\n// The dtor.\nQsciAPIs::~QsciAPIs()\n{\n    deleteWorker();\n    delete prep;\n}\n\n\n// Delete the worker thread if there is one.\nvoid QsciAPIs::deleteWorker()\n{\n    if (worker)\n    {\n        delete worker;\n        worker = 0;\n    }\n}\n\n\n//! Handle termination events from the worker thread.\nbool QsciAPIs::event(QEvent *e)\n{\n    switch (e->type())\n    {\n    case WorkerStarted:\n        emit apiPreparationStarted();\n        return true;\n\n    case WorkerAborted:\n        deleteWorker();\n        emit apiPreparationCancelled();\n        return true;\n\n    case WorkerFinished:\n        delete prep;\n        old_context.clear();\n\n        prep = worker->prepared;\n        worker->prepared = 0;\n        deleteWorker();\n\n        // Allow the raw API information to be modified.\n        apis = prep->raw_apis;\n\n        emit apiPreparationFinished();\n\n        return true;\n    }\n\n    return QObject::event(e);\n}\n\n\n// Clear the current raw API entries.\nvoid QsciAPIs::clear()\n{\n    apis.clear();\n}\n\n\n// Clear out all API information.\nbool QsciAPIs::load(const QString &filename)\n{\n    QFile f(filename);\n\n    if (!f.open(IO_ReadOnly))\n        return false;\n\n    QTextStream ts(&f);\n\n    for (;;)\n    {\n        QString line = ts.readLine();\n\n        if (line.isEmpty())\n            break;\n\n        apis.append(line);\n    }\n\n    return true;\n}\n\n\n// Add a single API entry.\nvoid QsciAPIs::add(const QString &entry)\n{\n    apis.append(entry);\n}\n\n\n// Remove a single API entry.\nvoid QsciAPIs::remove(const QString &entry)\n{\n    QStringList::iterator it = apis.find(entry);\n\n    if (it != apis.end())\n        apis.remove(it);\n}\n\n\n// Position the \"origin\" cursor into the API entries according to the user\n// supplied context.\nQStringList QsciAPIs::positionOrigin(const QStringList &context, QString &path)\n{\n    // Get the list of words and see if the context is the same as last time we\n    // were called.\n    QStringList new_context;\n    bool same_context = (old_context.count() > 0 && old_context.count() < context.count());\n\n    for (int i = 0; i < context.count(); ++i)\n    {\n        QString word = context[i];\n\n        if (!lexer()->caseSensitive())\n            word = word.upper();\n\n        if (i < old_context.count() && old_context[i] != word)\n            same_context = false;\n\n        new_context << word;\n    }\n\n    // If the context has changed then reset the origin.\n    if (!same_context)\n        origin_len = 0;\n\n    // If we have a current origin (ie. the user made a specific selection in\n    // the current context) then adjust the origin to include the last complete\n    // word as the user may have entered more parts of the name without using\n    // auto-completion.\n    if (origin_len > 0)\n    {\n        const QString wsep = lexer()->autoCompletionWordSeparators().first();\n\n        int start_new = old_context.count();\n        int end_new = new_context.count() - 1;\n\n        if (start_new == end_new)\n        {\n            path = old_context.join(wsep);\n            origin_len = path.length();\n        }\n        else\n        {\n            QString fixed = *origin;\n            fixed.truncate(origin_len);\n\n            path = fixed;\n\n            while (start_new < end_new)\n            {\n                // Add this word to the current path.\n                path.append(wsep);\n                path.append(new_context[start_new]);\n                origin_len = path.length();\n\n                // Skip entries in the current origin that don't match the\n                // path.\n                while (origin != prep->raw_apis.end())\n                {\n                    // See if the current origin has come to an end.\n                    if (!originStartsWith(fixed, wsep))\n                        origin = prep->raw_apis.end();\n                    else if (originStartsWith(path, wsep))\n                        break;\n                    else\n                        ++origin;\n                }\n\n                if (origin == prep->raw_apis.end())\n                    break;\n\n                ++start_new;\n            }\n        }\n\n        // Terminate the path.\n        path.append(wsep);\n\n        // If the new text wasn't recognised then reset the origin.\n        if (origin == prep->raw_apis.end())\n            origin_len = 0;\n    }\n\n    if (origin_len == 0)\n        path.truncate(0);\n\n    // Save the \"committed\" context for next time.\n    old_context = new_context;\n    old_context.remove(old_context.fromLast());\n\n    return new_context;\n}\n\n\n// Return true if the origin starts with the given path.\nbool QsciAPIs::originStartsWith(const QString &path, const QString &wsep)\n{\n    const QString &orig = *origin;\n\n    if (!orig.startsWith(path))\n        return false;\n\n    // Check that the path corresponds to the end of a word, ie. that what\n    // follows in the origin is either a word separator or a (.\n    QString tail = orig.mid(path.length());\n\n    return (!tail.isEmpty() && (tail.startsWith(wsep) || tail.at(0) == '('));\n}\n\n\n// Add auto-completion words to an existing list.\nvoid QsciAPIs::updateAutoCompletionList(const QStringList &context,\n        QStringList &list)\n{\n    QString path;\n    QStringList new_context = positionOrigin(context, path);\n\n    if (origin_len > 0)\n    {\n        const QString wsep = lexer()->autoCompletionWordSeparators().first();\n        QStringList::const_iterator it = origin;\n\n        unambiguous_context = path;\n\n        while (it != prep->raw_apis.end())\n        {\n            QString base = QsciAPIsPrepared::apiBaseName(*it);\n\n            if (!base.startsWith(path))\n                break;\n\n            // Make sure we have something after the path.\n            if (base != path)\n            {\n                // Get the word we are interested in (ie. the one after the\n                // current origin in path).\n                QString w = QStringList::split(wsep, base.mid(origin_len + wsep.length())).first();\n\n                // Append the space, we know the origin is unambiguous.\n                w.append(' ');\n\n                if (!list.contains(w))\n                    list << w;\n            }\n\n            ++it;\n        }\n    }\n    else\n    {\n        // At the moment we assume we will add words from multiple contexts.\n        unambiguous_context.truncate(0);\n\n        bool unambig = true;\n        QStringList with_context;\n\n        if (new_context.last().isEmpty())\n            lastCompleteWord(new_context[new_context.count() - 2], with_context, unambig);\n        else\n            lastPartialWord(new_context.last(), with_context, unambig);\n\n        for (int i = 0; i < with_context.count(); ++i)\n        {\n            // Remove any unambigious context.\n            QString noc = with_context[i];\n\n            if (unambig)\n            {\n                int op = noc.find('(');\n\n                if (op >= 0)\n                    noc.truncate(op);\n            }\n\n            list << noc;\n        }\n    }\n}\n\n\n// Get the index list for a particular word if there is one.\nconst QsciAPIs::WordIndexList *QsciAPIs::wordIndexOf(const QString &word) const\n{\n    QString csword;\n\n    // Indirect through the case dictionary if the language isn't case\n    // sensitive.\n    if (lexer()->caseSensitive())\n        csword = word;\n    else\n    {\n        csword = prep->cdict[word];\n\n        if (csword.isEmpty())\n            return 0;\n    }\n\n    // Get the possible API entries if any.\n    const WordIndexList *wl = &prep->wdict[csword];\n\n    if (wl->isEmpty())\n        return 0;\n\n    return wl;\n}\n\n\n// Add auto-completion words based on the last complete word entered.\nvoid QsciAPIs::lastCompleteWord(const QString &word, QStringList &with_context, bool &unambig)\n{\n    // Get the possible API entries if any.\n    const WordIndexList *wl = wordIndexOf(word);\n\n    if (wl)\n        addAPIEntries(*wl, true, with_context, unambig);\n}\n\n\n// Add auto-completion words based on the last partial word entered.\nvoid QsciAPIs::lastPartialWord(const QString &word, QStringList &with_context, bool &unambig)\n{\n    if (lexer()->caseSensitive())\n    {\n        QMap<QString, WordIndexList>::const_iterator it;\n        QStringList::const_iterator wit = QsciAPIsPrepared::lowerBound(prep->words, word);\n\n        if (wit == prep->words.end())\n            it = prep->wdict.end();\n        else\n            it = prep->wdict.find(*wit);\n\n        while (it != prep->wdict.end())\n        {\n            if (!it.key().startsWith(word))\n                break;\n\n            addAPIEntries(it.data(), false, with_context, unambig);\n\n            ++it;\n        }\n    }\n    else\n    {\n        QMap<QString, QString>::const_iterator it;\n        QStringList::const_iterator wit = QsciAPIsPrepared::lowerBound(prep->words, word);\n\n        if (wit == prep->words.end())\n            it = prep->cdict.end();\n        else\n            it = prep->cdict.find(*wit);\n\n        while (it != prep->cdict.end())\n        {\n            if (!it.key().startsWith(word))\n                break;\n\n            addAPIEntries(prep->wdict[it.data()], false, with_context, unambig);\n\n            ++it;\n        }\n    }\n}\n\n\n// Handle the selection of an entry in the auto-completion list.\nvoid QsciAPIs::autoCompletionSelected(const QString &selection)\n{\n    // If the selection is an API (ie. it has a space separating the selected\n    // word and the optional origin) then remember the origin.\n    QStringList lst = QStringList::split(' ', selection);\n\n    if (lst.count() != 2)\n    {\n        origin_len = 0;\n        return;\n    }\n\n    const QString &path = lst[1];\n    QString owords;\n\n    if (path.isEmpty())\n        owords = unambiguous_context;\n    else\n    {\n        // Check the parenthesis.\n        if (!path.startsWith(\"(\") || !path.endsWith(\")\"))\n        {\n            origin_len = 0;\n            return;\n        }\n\n        // Remove the parenthesis.\n        owords = path.mid(1, path.length() - 2);\n    }\n\n    origin = QsciAPIsPrepared::lowerBound(prep->raw_apis, owords);\n    origin_len = owords.length();\n}\n\n\n// Add auto-completion words for a particular word (defined by where it appears\n// in the APIs) and depending on whether the word was complete (when it's\n// actually the next word in the API entry that is of interest) or not.\nvoid QsciAPIs::addAPIEntries(const WordIndexList &wl, bool complete,\n        QStringList &with_context, bool &unambig)\n{\n    QStringList wseps = lexer()->autoCompletionWordSeparators();\n\n    for (int w = 0; w < wl.count(); ++w)\n    {\n        const WordIndex &wi = wl[w];\n\n        QStringList api_words = prep->apiWords(wi.first, wseps, false);\n\n        int idx = wi.second;\n\n        if (complete)\n        {\n            // Skip if this is the last word.\n            if (++idx >= api_words.count())\n                continue;\n        }\n\n        QString api_word;\n\n        if (idx == 0)\n            api_word = api_words[0] + ' ';\n        else\n        {\n            QStringList orgl;\n    \n            for (int i = 0; i < idx; ++i)\n                orgl.append(api_words[i]);\n\n            QString org = orgl.join(wseps.first());\n\n            api_word = QString(\"%1 (%2)\").arg(api_words[idx]).arg(org);\n\n            // See if the origin has been used before.\n            if (unambig)\n                if (unambiguous_context.isEmpty())\n                    unambiguous_context = org;\n                else if (unambiguous_context != org)\n                {\n                    unambiguous_context.truncate(0);\n                    unambig = false;\n                }\n        }\n\n        if (!with_context.contains(api_word))\n            with_context.append(api_word);\n    }\n}\n\n\n// Return the call tip for a function.\nQStringList QsciAPIs::callTips(const QStringList &context, int commas,\n        QsciScintilla::CallTipsStyle style,\n        QValueList<int> &shifts)\n{\n    QString path;\n    QStringList new_context = positionOrigin(context, path);\n    QStringList wseps = lexer()->autoCompletionWordSeparators();\n    QStringList cts;\n\n    if (origin_len > 0)\n    {\n        QStringList::const_iterator it = origin;\n        QString prev;\n\n        // Work out the length of the context.\n        const QString &wsep = wseps.first();\n        QStringList strip = QStringList::split(wsep, path);\n        strip.remove(strip.fromLast());\n        int ctstart = strip.join(wsep).length();\n\n        if (ctstart)\n            ctstart += wsep.length();\n\n        int shift;\n\n        if (style == QsciScintilla::CallTipsContext)\n        {\n            shift = ctstart;\n            ctstart = 0;\n        }\n        else\n            shift = 0;\n\n        // Make sure we only look at the functions we are interested in.\n        path.append('(');\n\n        while (it != prep->raw_apis.end() && (*it).startsWith(path))\n        {\n            QString w = (*it).mid(ctstart);\n\n            if (w != prev && enoughCommas(w, commas))\n            {\n                shifts << shift;\n                cts << w;\n                prev = w;\n            }\n\n            ++it;\n        }\n    }\n    else\n    {\n        const QString &fname = new_context[new_context.count() - 2];\n\n        // Find everywhere the function name appears in the APIs.\n        const WordIndexList *wil = wordIndexOf(fname);\n\n        if (wil)\n            for (int i = 0; i < wil->count(); ++i)\n            {\n                const WordIndex &wi = (*wil)[i];\n                QStringList awords = prep->apiWords(wi.first, wseps, true);\n\n                // Check the word is the function name and not part of any\n                // context.\n                if (wi.second != awords.count() - 1)\n                    continue;\n\n                const QString &api = prep->raw_apis[wi.first];\n\n                int tail = api.find('(');\n\n                if (tail < 0)\n                    continue;\n\n                if (!enoughCommas(api, commas))\n                    continue;\n\n                if (style == QsciScintilla::CallTipsNoContext)\n                {\n                    shifts << 0;\n                    cts << (fname + api.mid(tail));\n                }\n                else\n                {\n                    shifts << tail - fname.length();\n                    cts << api;\n                }\n            }\n    }\n\n    return cts;\n}\n\n\n// Return true if a string has enough commas in the argument list.\nbool QsciAPIs::enoughCommas(const QString &s, int commas)\n{\n    int end = s.find(')');\n\n    if (end < 0)\n        return false;\n\n    QString w = s.left(end);\n\n    return (w.contains(',') >= commas);\n}\n\n\n// Ensure the list is ready.\nvoid QsciAPIs::prepare()\n{\n    // Handle the trivial case.\n    if (worker)\n        return;\n\n    QsciAPIsPrepared *new_apis = new QsciAPIsPrepared;\n    new_apis->raw_apis = apis;\n\n    worker = new QsciAPIsWorker(this);\n    worker->prepared = new_apis;\n    worker->start();\n}\n\n\n// Cancel any current preparation.\nvoid QsciAPIs::cancelPreparation()\n{\n    deleteWorker();\n}\n\n\n// Check that a prepared API file exists.\nbool QsciAPIs::isPrepared(const QString &filename) const\n{\n    QString pname = prepName(filename);\n\n    if (pname.isEmpty())\n        return false;\n\n    QFileInfo fi(pname);\n\n    return fi.exists();\n}\n\n\n// Load the prepared API information.\nbool QsciAPIs::loadPrepared(const QString &filename)\n{\n    QString pname = prepName(filename);\n\n    if (pname.isEmpty())\n        return false;\n\n    // Read the prepared data and decompress it.\n    QFile pf(pname);\n\n    if (!pf.open(IO_ReadOnly))\n        return false;\n\n    QByteArray cpdata = pf.readAll();\n\n    pf.close();\n\n    if (cpdata.count() == 0)\n        return false;\n\n    QByteArray pdata = qUncompress(cpdata);\n\n    // Extract the data.\n    QDataStream pds(pdata, IO_ReadOnly);\n\n    unsigned char vers;\n    pds >> vers;\n\n    if (vers > PreparedDataFormatVersion)\n        return false;\n\n    char *lex_name;\n    pds >> lex_name;\n\n    if (qstrcmp(lex_name, lexer()->lexer()) != 0)\n    {\n        delete[] lex_name;\n        return false;\n    }\n\n    delete[] lex_name;\n\n    prep->wdict.clear();\n    pds >> prep->wdict;\n\n    if (!lexer()->caseSensitive())\n    {\n        // Build up the case dictionary.\n        prep->cdict.clear();\n\n        QMap<QString, WordIndexList>::const_iterator it = prep->wdict.begin();\n\n        while (it != prep->wdict.end())\n        {\n            prep->cdict[it.key().upper()] = it.key();\n\n            ++it;\n        }\n\n        prep->words = prep->cdict.keys();\n    }\n    else\n        prep->words = prep->wdict.keys();\n\n    prep->raw_apis.clear();\n    pds >> prep->raw_apis;\n\n    // Allow the raw API information to be modified.\n    apis = prep->raw_apis;\n\n    return true;\n}\n\n\n// Save the prepared API information.\nbool QsciAPIs::savePrepared(const QString &filename) const\n{\n    QString pname = prepName(filename, true);\n\n    if (pname.isEmpty())\n        return false;\n\n    // Write the prepared data to a memory buffer.\n    QByteArray pdata;\n    QDataStream pds(pdata, IO_WriteOnly);\n\n    // Use a serialisation format supported by Qt v3.0 and later.\n    pds.setVersion(4);\n    pds << PreparedDataFormatVersion;\n    pds << lexer()->lexer();\n    pds << prep->wdict;\n    pds << prep->raw_apis;\n\n    // Compress the data and write it.\n    QFile pf(pname);\n\n    if (!pf.open(IO_WriteOnly|IO_Truncate))\n        return false;\n\n    if (pf.writeBlock(qCompress(pdata)) < 0)\n    {\n        pf.close();\n        return false;\n    }\n\n    pf.close();\n    return true;\n}\n\n\n// Return the name of the default prepared API file.\nQString QsciAPIs::defaultPreparedName() const\n{\n    return prepName(QString());\n}\n\n\n// Return the name of a prepared API file.\nQString QsciAPIs::prepName(const QString &filename, bool mkpath) const\n{\n    // Handle the tivial case.\n    if (!filename.isEmpty())\n        return filename;\n\n    QString pdname;\n    char *qsci = getenv(\"QSCIDIR\");\n\n    if (qsci)\n        pdname = qsci;\n    else\n    {\n        static const char *qsci_dir = \".qsci\";\n\n        QDir pd = QDir::home();\n\n        if (mkpath && !pd.exists(qsci_dir) && !pd.mkdir(qsci_dir))\n            return QString();\n\n        pdname = pd.filePath(qsci_dir);\n    }\n\n    return QString(\"%1/%2.pap\").arg(pdname).arg(lexer()->lexer());\n}\n\n\n// Return installed API files.\nQStringList QsciAPIs::installedAPIFiles() const\n{\n    const char *qtdir = getenv(\"QTDIR\");\n\n    if (!qtdir)\n        return QStringList();\n\n    QDir apidir = QDir(QString(\"%1/qsci/api/%2\").arg(qtdir).arg(lexer()->lexer()));\n    QStringList filenames;\n\n    const QFileInfoList *flist = apidir.entryInfoList(\"*.api\", QDir::Files, QDir::IgnoreCase);\n\n    if (flist)\n    {\n        QPtrListIterator<QFileInfo> it(*flist);\n        QFileInfo *fi;\n\n        while ((fi = it.current()) != 0)\n        {\n            filenames << fi->absFilePath();\n            ++it;\n        }\n    }\n\n    return filenames;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscicommand.cpp",
    "content": "// This module implements the QsciCommand class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscicommand.h\"\n\n#include <qnamespace.h>\n#include <qapplication.h>\n\n#include \"Qsci/qsciscintilla.h\"\n#include \"Qsci/qsciscintillabase.h\"\n\n\nstatic int convert(int key);\n\n\n// The ctor.\nQsciCommand::QsciCommand(QsciScintilla *qs, QsciCommand::Command cmd, int key,\n        int altkey, const char *desc)\n    : qsCmd(qs), scicmd(cmd), qkey(key), qaltkey(altkey), descCmd(desc)\n{\n    scikey = convert(qkey);\n\n    if (scikey)\n        qsCmd->SendScintilla(QsciScintillaBase::SCI_ASSIGNCMDKEY, scikey,\n                scicmd);\n\n    scialtkey = convert(qaltkey);\n\n    if (scialtkey)\n        qsCmd->SendScintilla(QsciScintillaBase::SCI_ASSIGNCMDKEY, scialtkey,\n                scicmd);\n}\n\n\n// Execute the command.\nvoid QsciCommand::execute()\n{\n    qsCmd->SendScintilla(scicmd);\n}\n\n\n// Bind a key to a command.\nvoid QsciCommand::setKey(int key)\n{\n    bindKey(key,qkey,scikey);\n}\n\n\n// Bind an alternate key to a command.\nvoid QsciCommand::setAlternateKey(int altkey)\n{\n    bindKey(altkey,qaltkey,scialtkey);\n}\n\n\n// Do the hard work of binding a key.\nvoid QsciCommand::bindKey(int key,int &qk,int &scik)\n{\n    int new_scikey;\n\n    // Ignore if it is invalid, allowing for the fact that we might be\n    // unbinding it.\n    if (key)\n    {\n        new_scikey = convert(key);\n\n        if (!new_scikey)\n            return;\n    }\n    else\n        new_scikey = 0;\n\n    if (scik)\n        qsCmd->SendScintilla(QsciScintillaBase::SCI_CLEARCMDKEY, scik);\n\n    qk = key;\n    scik = new_scikey;\n\n    if (scik)\n        qsCmd->SendScintilla(QsciScintillaBase::SCI_ASSIGNCMDKEY, scik, scicmd);\n}\n\n\n// See if a key is valid.\nbool QsciCommand::validKey(int key)\n{\n    return convert(key);\n}\n\n\n// Convert a Qt character to the Scintilla equivalent.  Return zero if it is\n// invalid.\nstatic int convert(int key)\n{\n    // Convert the modifiers.\n    int sci_mod = 0;\n\n    if (key & Qt::SHIFT)\n        sci_mod |= QsciScintillaBase::SCMOD_SHIFT;\n\n    if (key & Qt::CTRL)\n        sci_mod |= QsciScintillaBase::SCMOD_CTRL;\n\n    if (key & Qt::ALT)\n        sci_mod |= QsciScintillaBase::SCMOD_ALT;\n\n    if (key & Qt::META)\n        sci_mod |= QsciScintillaBase::SCMOD_META;\n\n    key &= ~Qt::MODIFIER_MASK;\n\n    // Convert the key.\n    int sci_key = QsciScintillaBase::commandKey(key, sci_mod);\n\n    if (sci_key)\n        sci_key |= (sci_mod << 16);\n\n    return sci_key;\n}\n\n\n// Return the translated user friendly description.\nQString QsciCommand::description() const\n{\n    return qApp->translate(\"QsciCommand\", descCmd);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscicommandset.cpp",
    "content": "// This module implements the QsciCommandSet class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscicommandset.h\"\n\n#include <qsettings.h>\n\n#include \"Qsci/qscicommand.h\"\n#include \"Qsci/qsciscintilla.h\"\n#include \"Qsci/qsciscintillabase.h\"\n\n\n// Starting with QScintilla v2.7 the standard OS/X keyboard shortcuts are used\n// where possible.  In order to restore the behaviour of earlier versions then\n// #define DONT_USE_OSX_KEYS here or add it to the qmake project (.pro) file.\n#if defined(Q_OS_MAC) && !defined(DONT_USE_OSX_KEYS)\n#define USING_OSX_KEYS\n#else\n#undef  USING_OSX_KEYS\n#endif\n\n\n// The ctor.\nQsciCommandSet::QsciCommandSet(QsciScintilla *qs) : qsci(qs)\n{\n    struct sci_cmd {\n        QsciCommand::Command cmd;\n        int key;\n        int altkey;\n        const char *desc;\n    };\n\n    static struct sci_cmd cmd_table[] = {\n        {\n            QsciCommand::LineDown,\n            Qt::Key_Down,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_N | Qt::META,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move down one line\")\n        },\n        {\n            QsciCommand::LineDownExtend,\n            Qt::Key_Down | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_N | Qt::META | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Extend selection down one line\")\n        },\n        {\n            QsciCommand::LineDownRectExtend,\n            Qt::Key_Down | Qt::ALT | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_N | Qt::META | Qt::ALT | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend rectangular selection down one line\")\n        },\n        {\n            QsciCommand::LineScrollDown,\n            Qt::Key_Down | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Scroll view down one line\")\n        },\n        {\n            QsciCommand::LineUp,\n            Qt::Key_Up,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_P | Qt::META,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move up one line\")\n        },\n        {\n            QsciCommand::LineUpExtend,\n            Qt::Key_Up | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_P | Qt::META | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Extend selection up one line\")\n        },\n        {\n            QsciCommand::LineUpRectExtend,\n            Qt::Key_Up | Qt::ALT | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_P | Qt::META | Qt::ALT | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend rectangular selection up one line\")\n        },\n        {\n            QsciCommand::LineScrollUp,\n            Qt::Key_Up | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Scroll view up one line\")\n        },\n        {\n            QsciCommand::ScrollToStart,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Home,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Scroll to start of document\")\n        },\n        {\n            QsciCommand::ScrollToEnd,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_End,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Scroll to end of document\")\n        },\n        {\n            QsciCommand::VerticalCentreCaret,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_L | Qt::META,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Scroll vertically to centre current line\")\n        },\n        {\n            QsciCommand::ParaDown,\n            Qt::Key_BracketRight | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move down one paragraph\")\n        },\n        {\n            QsciCommand::ParaDownExtend,\n            Qt::Key_BracketRight | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection down one paragraph\")\n        },\n        {\n            QsciCommand::ParaUp,\n            Qt::Key_BracketLeft | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move up one paragraph\")\n        },\n        {\n            QsciCommand::ParaUpExtend,\n            Qt::Key_BracketLeft | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection up one paragraph\")\n        },\n        {\n            QsciCommand::CharLeft,\n            Qt::Key_Left,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_B | Qt::META,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move left one character\")\n        },\n        {\n            QsciCommand::CharLeftExtend,\n            Qt::Key_Left | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_B | Qt::META | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection left one character\")\n        },\n        {\n            QsciCommand::CharLeftRectExtend,\n            Qt::Key_Left | Qt::ALT | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_B | Qt::META | Qt::ALT | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend rectangular selection left one character\")\n        },\n        {\n            QsciCommand::CharRight,\n            Qt::Key_Right,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_F | Qt::META,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move right one character\")\n        },\n        {\n            QsciCommand::CharRightExtend,\n            Qt::Key_Right | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_F | Qt::META | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection right one character\")\n        },\n        {\n            QsciCommand::CharRightRectExtend,\n            Qt::Key_Right | Qt::ALT | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_F | Qt::META | Qt::ALT | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend rectangular selection right one character\")\n        },\n        {\n            QsciCommand::WordLeft,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Left | Qt::ALT,\n#else\n            Qt::Key_Left | Qt::CTRL,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move left one word\")\n        },\n        {\n            QsciCommand::WordLeftExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Left | Qt::ALT | Qt::SHIFT,\n#else\n            Qt::Key_Left | Qt::CTRL | Qt::SHIFT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Extend selection left one word\")\n        },\n        {\n            QsciCommand::WordRight,\n#if defined(USING_OSX_KEYS)\n            0,\n#else\n            Qt::Key_Right | Qt::CTRL,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move right one word\")\n        },\n        {\n            QsciCommand::WordRightExtend,\n            Qt::Key_Right | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Extend selection right one word\")\n        },\n        {\n            QsciCommand::WordLeftEnd,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move to end of previous word\")\n        },\n        {\n            QsciCommand::WordLeftEndExtend,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to end of previous word\")\n        },\n        {\n            QsciCommand::WordRightEnd,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Right | Qt::ALT,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move to end of next word\")\n        },\n        {\n            QsciCommand::WordRightEndExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Right | Qt::ALT | Qt::SHIFT,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to end of next word\")\n        },\n        {\n            QsciCommand::WordPartLeft,\n            Qt::Key_Slash | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move left one word part\")\n        },\n        {\n            QsciCommand::WordPartLeftExtend,\n            Qt::Key_Slash | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection left one word part\")\n        },\n        {\n            QsciCommand::WordPartRight,\n            Qt::Key_Backslash | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move right one word part\")\n        },\n        {\n            QsciCommand::WordPartRightExtend,\n            Qt::Key_Backslash | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection right one word part\")\n        },\n        {\n            QsciCommand::Home,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_A | Qt::META,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move to start of document line\")\n        },\n        {\n            QsciCommand::HomeExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_A | Qt::META | Qt::SHIFT,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to start of document line\")\n        },\n        {\n            QsciCommand::HomeRectExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_A | Qt::META | Qt::ALT | Qt::SHIFT,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend rectangular selection to start of document line\")\n        },\n        {\n            QsciCommand::HomeDisplay,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Left | Qt::CTRL,\n#else\n            Qt::Key_Home | Qt::ALT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move to start of display line\")\n        },\n        {\n            QsciCommand::HomeDisplayExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Left | Qt::CTRL | Qt::SHIFT,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to start of display line\")\n        },\n        {\n            QsciCommand::HomeWrap,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Move to start of display or document line\")\n        },\n        {\n            QsciCommand::HomeWrapExtend,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to start of display or document line\")\n        },\n        {\n            QsciCommand::VCHome,\n#if defined(USING_OSX_KEYS)\n            0,\n#else\n            Qt::Key_Home,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                \"Move to first visible character in document line\")\n        },\n        {\n            QsciCommand::VCHomeExtend,\n#if defined(USING_OSX_KEYS)\n            0,\n#else\n            Qt::Key_Home | Qt::SHIFT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                \"Extend selection to first visible character in document line\")\n        },\n        {\n            QsciCommand::VCHomeRectExtend,\n#if defined(USING_OSX_KEYS)\n            0,\n#else\n            Qt::Key_Home | Qt::ALT | Qt::SHIFT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                \"Extend rectangular selection to first visible character in document line\")\n        },\n        {\n            QsciCommand::VCHomeWrap,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Move to first visible character of display in document line\")\n        },\n        {\n            QsciCommand::VCHomeWrapExtend,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to first visible character in display or document line\")\n        },\n        {\n            QsciCommand::LineEnd,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_E | Qt::META,\n#else\n            Qt::Key_End,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move to end of document line\")\n        },\n        {\n            QsciCommand::LineEndExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_E | Qt::META | Qt::SHIFT,\n#else\n            Qt::Key_End | Qt::SHIFT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to end of document line\")\n        },\n        {\n            QsciCommand::LineEndRectExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_E | Qt::META | Qt::ALT | Qt::SHIFT,\n#else\n            Qt::Key_End | Qt::ALT | Qt::SHIFT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend rectangular selection to end of document line\")\n        },\n        {\n            QsciCommand::LineEndDisplay,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Right | Qt::CTRL,\n#else\n            Qt::Key_End | Qt::ALT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move to end of display line\")\n        },\n        {\n            QsciCommand::LineEndDisplayExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Right | Qt::CTRL | Qt::SHIFT,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to end of display line\")\n        },\n        {\n            QsciCommand::LineEndWrap,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Move to end of display or document line\")\n        },\n        {\n            QsciCommand::LineEndWrapExtend,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to end of display or document line\")\n        },\n        {\n            QsciCommand::DocumentStart,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Up | Qt::CTRL,\n#else\n            Qt::Key_Home | Qt::CTRL,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move to start of document\")\n        },\n        {\n            QsciCommand::DocumentStartExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Up | Qt::CTRL | Qt::SHIFT,\n#else\n            Qt::Key_Home | Qt::CTRL | Qt::SHIFT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to start of document\")\n        },\n        {\n            QsciCommand::DocumentEnd,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Down | Qt::CTRL,\n#else\n            Qt::Key_End | Qt::CTRL,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move to end of document\")\n        },\n        {\n            QsciCommand::DocumentEndExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Down | Qt::CTRL | Qt::SHIFT,\n#else\n            Qt::Key_End | Qt::CTRL | Qt::SHIFT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to end of document\")\n        },\n        {\n            QsciCommand::PageUp,\n            Qt::Key_Prior,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move up one page\")\n        },\n        {\n            QsciCommand::PageUpExtend,\n            Qt::Key_Prior | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Extend selection up one page\")\n        },\n        {\n            QsciCommand::PageUpRectExtend,\n            Qt::Key_Prior | Qt::ALT | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend rectangular selection up one page\")\n        },\n        {\n            QsciCommand::PageDown,\n            Qt::Key_Next,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_V | Qt::META,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move down one page\")\n        },\n        {\n            QsciCommand::PageDownExtend,\n            Qt::Key_Next | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_V | Qt::META | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Extend selection down one page\")\n        },\n        {\n            QsciCommand::PageDownRectExtend,\n            Qt::Key_Next | Qt::ALT | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_V | Qt::META | Qt::ALT | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend rectangular selection down one page\")\n        },\n        {\n            QsciCommand::StutteredPageUp,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Stuttered move up one page\")\n        },\n        {\n            QsciCommand::StutteredPageUpExtend,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Stuttered extend selection up one page\")\n        },\n        {\n            QsciCommand::StutteredPageDown,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Stuttered move down one page\")\n        },\n        {\n            QsciCommand::StutteredPageDownExtend,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Stuttered extend selection down one page\")\n        },\n        {\n            QsciCommand::Delete,\n            Qt::Key_Delete,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_D | Qt::META,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Delete current character\")\n        },\n        {\n            QsciCommand::DeleteBack,\n            Qt::Key_Backspace,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_H | Qt::META,\n#else\n            Qt::Key_Backspace | Qt::SHIFT,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Delete previous character\")\n        },\n        {\n            QsciCommand::DeleteBackNotLine,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                \"Delete previous character if not at start of line\")\n        },\n        {\n            QsciCommand::DeleteWordLeft,\n            Qt::Key_Backspace | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Delete word to left\")\n        },\n        {\n            QsciCommand::DeleteWordRight,\n            Qt::Key_Delete | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Delete word to right\")\n        },\n        {\n            QsciCommand::DeleteWordRightEnd,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Delete | Qt::ALT,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Delete right to end of next word\")\n        },\n        {\n            QsciCommand::DeleteLineLeft,\n            Qt::Key_Backspace | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Delete line to left\")\n        },\n        {\n            QsciCommand::DeleteLineRight,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_K | Qt::META,\n#else\n            Qt::Key_Delete | Qt::CTRL | Qt::SHIFT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Delete line to right\")\n        },\n        {\n            QsciCommand::LineDelete,\n            Qt::Key_L | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Delete current line\")\n        },\n        {\n            QsciCommand::LineCut,\n            Qt::Key_L | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Cut current line\")\n        },\n        {\n            QsciCommand::LineCopy,\n            Qt::Key_T | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Copy current line\")\n        },\n        {\n            QsciCommand::LineTranspose,\n            Qt::Key_T | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Transpose current and previous lines\")\n        },\n        {\n            QsciCommand::LineDuplicate,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Duplicate the current line\")\n        },\n        {\n            QsciCommand::SelectAll,\n            Qt::Key_A | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Select all\")\n        },\n        {\n            QsciCommand::MoveSelectedLinesUp,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move selected lines up one line\")\n        },\n        {\n            QsciCommand::MoveSelectedLinesDown,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Move selected lines down one line\")\n        },\n        {\n            QsciCommand::SelectionDuplicate,\n            Qt::Key_D | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Duplicate selection\")\n        },\n        {\n            QsciCommand::SelectionLowerCase,\n            Qt::Key_U | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Convert selection to lower case\")\n        },\n        {\n            QsciCommand::SelectionUpperCase,\n            Qt::Key_U | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Convert selection to upper case\")\n        },\n        {\n            QsciCommand::SelectionCut,\n            Qt::Key_X | Qt::CTRL,\n            Qt::Key_Delete | Qt::SHIFT,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Cut selection\")\n        },\n        {\n            QsciCommand::SelectionCopy,\n            Qt::Key_C | Qt::CTRL,\n            Qt::Key_Insert | Qt::CTRL,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Copy selection\")\n        },\n        {\n            QsciCommand::Paste,\n            Qt::Key_V | Qt::CTRL,\n            Qt::Key_Insert | Qt::SHIFT,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Paste\")\n        },\n        {\n            QsciCommand::EditToggleOvertype,\n            Qt::Key_Insert,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Toggle insert/overtype\")\n        },\n        {\n            QsciCommand::Newline,\n            Qt::Key_Return,\n            Qt::Key_Return | Qt::SHIFT,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Insert newline\")\n        },\n        {\n            QsciCommand::Formfeed,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Formfeed\")\n        },\n        {\n            QsciCommand::Tab,\n            Qt::Key_Tab,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Indent one level\")\n        },\n        {\n            QsciCommand::Backtab,\n            Qt::Key_Tab | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"De-indent one level\")\n        },\n        {\n            QsciCommand::Cancel,\n            Qt::Key_Escape,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Cancel\")\n        },\n        {\n            QsciCommand::Undo,\n            Qt::Key_Z | Qt::CTRL,\n            Qt::Key_Backspace | Qt::ALT,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Undo last command\")\n        },\n        {\n            QsciCommand::Redo,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Z | Qt::CTRL | Qt::SHIFT,\n#else\n            Qt::Key_Y | Qt::CTRL,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Redo last command\")\n        },\n        {\n            QsciCommand::ZoomIn,\n            Qt::Key_Plus | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Zoom in\")\n        },\n        {\n            QsciCommand::ZoomOut,\n            Qt::Key_Minus | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Zoom out\")\n        },\n    };\n\n    // Clear the default map.\n    qsci->SendScintilla(QsciScintillaBase::SCI_CLEARALLCMDKEYS);\n\n    // By default control characters don't do anything (rather than insert the\n    // control character into the text).\n    for (int k = 'A'; k <= 'Z'; ++k)\n        qsci->SendScintilla(QsciScintillaBase::SCI_ASSIGNCMDKEY,\n                k + (QsciScintillaBase::SCMOD_CTRL << 16),\n                QsciScintillaBase::SCI_NULL);\n\n    for (int i = 0; i < sizeof (cmd_table) / sizeof (cmd_table[0]); ++i)\n        cmds.append(\n                new QsciCommand(qsci, cmd_table[i].cmd, cmd_table[i].key,\n                        cmd_table[i].altkey, cmd_table[i].desc));\n}\n\n\n// The dtor.\nQsciCommandSet::~QsciCommandSet()\n{\n    for (int i = 0; i < cmds.count(); ++i)\n        delete cmds.at(i);\n}\n\n\n// Read the command set from settings.\nbool QsciCommandSet::readSettings(QSettings &qs, const char *prefix)\n{\n    bool rc = true;\n    QString skey;\n\n    for (int i = 0; i < cmds.count(); ++i)\n    {\n        QsciCommand *cmd = cmds.at(i);\n\n        skey.sprintf(\"%s/keymap/c%d/\", prefix,\n                static_cast<int>(cmd->command()));\n\n        int key;\n        bool ok;\n\n        // Read the key.\n        key = qs.readNumEntry(skey + \"key\", 0, &ok);\n\n        if (ok)\n            cmd->setKey(key);\n        else\n            rc = false;\n\n        // Read the alternate key.\n        key = qs.readNumEntry(skey + \"alt\", 0, &ok);\n\n        if (ok)\n            cmd->setAlternateKey(key);\n        else\n            rc = false;\n    }\n\n    return rc;\n}\n\n\n// Write the command set to settings.\nbool QsciCommandSet::writeSettings(QSettings &qs, const char *prefix)\n{\n    bool rc = true;\n    QString skey;\n\n    for (int i = 0; i < cmds.count(); ++i)\n    {\n        QsciCommand *cmd = cmds.at(i);\n\n        skey.sprintf(\"%s/keymap/c%d/\", prefix,\n                static_cast<int>(cmd->command()));\n\n        // Write the key.\n        if (!qs.writeEntry(skey + \"key\", cmd->key()))\n            rc = false;\n\n        // Write the alternate key.\n        if (!qs.writeEntry(skey + \"alt\", cmd->alternateKey()))\n            rc = false;\n    }\n\n    return rc;\n}\n\n\n// Clear the key bindings.\nvoid QsciCommandSet::clearKeys()\n{\n    for (int i = 0; i < cmds.count(); ++i)\n        cmds.at(i)->setKey(0);\n}\n\n\n// Clear the alternate key bindings.\nvoid QsciCommandSet::clearAlternateKeys()\n{\n    for (int i = 0; i < cmds.count(); ++i)\n        cmds.at(i)->setAlternateKey(0);\n}\n\n\n// Find the command bound to a key.\nQsciCommand *QsciCommandSet::boundTo(int key) const\n{\n    for (int i = 0; i < cmds.count(); ++i)\n    {\n        QsciCommand *cmd = const_cast<QsciCommandSet *>(this)->cmds.at(i);\n\n        if (cmd->key() == key || cmd->alternateKey() == key)\n            return cmd;\n    }\n\n    return 0;\n}\n\n\n// Find a command.\nQsciCommand *QsciCommandSet::find(QsciCommand::Command command) const\n{\n    for (int i = 0; i < cmds.count(); ++i)\n    {\n        QsciCommand *cmd = const_cast<QsciCommandSet *>(this)->cmds.at(i);\n\n        if (cmd->command() == command)\n            return cmd;\n    }\n\n    // This should never happen.\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscidocument.cpp",
    "content": "// This module implements the QsciDocument class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscidocument.h\"\n#include \"Qsci/qsciscintillabase.h\"\n\n\n// This internal class encapsulates the underlying document and is shared by\n// QsciDocument instances.\nclass QsciDocumentP\n{\npublic:\n    QsciDocumentP() : doc(0), nr_displays(0), nr_attaches(1), modified(false) {}\n\n    void *doc;              // The Scintilla document.\n    int nr_displays;        // The number of displays.\n    int nr_attaches;        // The number of attaches.\n    bool modified;          // Set if not at a save point.\n};\n\n\n// The ctor.\nQsciDocument::QsciDocument()\n{\n    pdoc = new QsciDocumentP();\n}\n\n\n// The dtor.\nQsciDocument::~QsciDocument()\n{\n    detach();\n}\n\n\n// The copy ctor.\nQsciDocument::QsciDocument(const QsciDocument &that)\n{\n    attach(that);\n}\n\n\n// The assignment operator.\nQsciDocument &QsciDocument::operator=(const QsciDocument &that)\n{\n    if (pdoc != that.pdoc)\n    {\n        detach();\n        attach(that);\n    }\n\n    return *this;\n}\n\n\n// Attach an existing document to this one.\nvoid QsciDocument::attach(const QsciDocument &that)\n{\n    ++that.pdoc->nr_attaches;\n    pdoc = that.pdoc;\n}\n\n\n// Detach the underlying document.\nvoid QsciDocument::detach()\n{\n    if (!pdoc)\n        return;\n\n    if (--pdoc->nr_attaches == 0)\n    {\n        if (pdoc->doc && pdoc->nr_displays == 0)\n        {\n            QsciScintillaBase *qsb = QsciScintillaBase::pool();\n\n            // Release the explicit reference to the document.  If the pool is\n            // empty then we just accept the memory leak.\n            if (qsb)\n                qsb->SendScintilla(QsciScintillaBase::SCI_RELEASEDOCUMENT, 0,\n                        pdoc->doc);\n        }\n\n        delete pdoc;\n    }\n\n    pdoc = 0;\n}\n\n\n// Undisplay and detach the underlying document.\nvoid QsciDocument::undisplay(QsciScintillaBase *qsb)\n{\n    if (--pdoc->nr_attaches == 0)\n        delete pdoc;\n    else if (--pdoc->nr_displays == 0)\n    {\n        // Create an explicit reference to the document to keep it alive.\n        qsb->SendScintilla(QsciScintillaBase::SCI_ADDREFDOCUMENT, 0, pdoc->doc);\n    }\n\n    pdoc = 0;\n}\n\n\n// Display the underlying document.\nvoid QsciDocument::display(QsciScintillaBase *qsb, const QsciDocument *from)\n{\n    void *ndoc = (from ? from->pdoc->doc : 0);\n\n    // SCI_SETDOCPOINTER appears to reset the EOL mode so save and restore it.\n    int eol_mode = qsb->SendScintilla(QsciScintillaBase::SCI_GETEOLMODE);\n\n    qsb->SendScintilla(QsciScintillaBase::SCI_SETDOCPOINTER, 0, ndoc);\n    ndoc = qsb->SendScintillaPtrResult(QsciScintillaBase::SCI_GETDOCPOINTER);\n\n    qsb->SendScintilla(QsciScintillaBase::SCI_SETEOLMODE, eol_mode);\n\n    pdoc->doc = ndoc;\n    ++pdoc->nr_displays;\n}\n\n\n// Return the modified state of the document.\nbool QsciDocument::isModified() const\n{\n    return pdoc->modified;\n}\n\n\n// Set the modified state of the document.\nvoid QsciDocument::setModified(bool m)\n{\n    pdoc->modified = m;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexer.cpp",
    "content": "// This module implements the QsciLexer class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexer.h\"\n\n#include <qapplication.h>\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n#include \"Qsci/qsciapis.h\"\n#include \"Qsci/qsciscintilla.h\"\n#include \"Qsci/qsciscintillabase.h\"\n\n\n// The ctor.\nQsciLexer::QsciLexer(QObject *parent, const char *name)\n    : QObject(parent, name),\n      autoIndStyle(-1), apiSet(0), attached_editor(0)\n{\n#if defined(Q_OS_WIN)\n    defFont = QFont(\"Verdana\",10);\n#elif defined(Q_OS_MAC)\n    defFont = QFont(\"Verdana\", 12);\n#else\n    defFont = QFont(\"Bitstream Vera Sans\",9);\n#endif\n\n    // Set the default fore and background colours.\n    QColorGroup cg = QApplication::palette().active();\n    defColor = cg.text();\n    defPaper = cg.base();\n\n    // Putting this on the heap means we can keep the style getters const.\n    style_map = new StyleDataMap;\n    style_map->style_data_set = false;\n}\n\n\n// The dtor.\nQsciLexer::~QsciLexer()\n{\n    delete style_map;\n}\n\n\n// Set the attached editor.\nvoid QsciLexer::setEditor(QsciScintilla *editor)\n{\n    attached_editor = editor;\n\n    if (attached_editor)\n    {\n        attached_editor->SendScintilla(QsciScintillaBase::SCI_SETSTYLEBITS,\n                styleBitsNeeded());\n    }\n}\n\n\n// Return the lexer name.\nconst char *QsciLexer::lexer() const\n{\n    return 0;\n}\n\n\n// Return the lexer identifier.\nint QsciLexer::lexerId() const\n{\n    return QsciScintillaBase::SCLEX_CONTAINER;\n}\n\n\n// Return the number of style bits needed by the lexer.\nint QsciLexer::styleBitsNeeded() const\n{\n    if (!attached_editor)\n        return 5;\n\n    return attached_editor->SendScintilla(QsciScintillaBase::SCI_GETSTYLEBITSNEEDED);\n}\n\n\n// Make sure the style defaults have been set.\nvoid QsciLexer::setStyleDefaults() const\n{\n    if (!style_map->style_data_set)\n    {\n        for (int i = 0; i < 128; ++i)\n            if (!description(i).isEmpty())\n                styleData(i);\n\n        style_map->style_data_set = true;\n    }\n}\n\n\n// Return a reference to a style's data, setting up the defaults if needed.\nQsciLexer::StyleData &QsciLexer::styleData(int style) const\n{\n    StyleData &sd = style_map->style_data[style];\n\n    // See if this is a new style by checking if the colour is valid.\n    if (!sd.color.isValid())\n    {\n        sd.color = defaultColor(style);\n        sd.paper = defaultPaper(style);\n        sd.font = defaultFont(style);\n        sd.eol_fill = defaultEolFill(style);\n    }\n\n    return sd;\n}\n\n\n// Set the APIs associated with the lexer.\nvoid QsciLexer::setAPIs(QsciAbstractAPIs *apis)\n{\n    apiSet = apis;\n}\n\n\n// Return a pointer to the current APIs if there are any.\nQsciAbstractAPIs *QsciLexer::apis() const\n{\n    return apiSet;\n}\n\n\n// Default implementation to return the set of fill up characters that can end\n// auto-completion.\nconst char *QsciLexer::autoCompletionFillups() const\n{\n    return \"(\";\n}\n\n\n// Default implementation to return the view used for indentation guides.\nint QsciLexer::indentationGuideView() const\n{\n    return QsciScintillaBase::SC_IV_LOOKBOTH;\n}\n\n\n// Default implementation to return the list of character sequences that can\n// separate auto-completion words.\nQStringList QsciLexer::autoCompletionWordSeparators() const\n{\n    return QStringList();\n}\n\n\n// Default implementation to return the list of keywords that can start a\n// block.\nconst char *QsciLexer::blockStartKeyword(int *) const\n{\n    return 0;\n}\n\n\n// Default implementation to return the list of characters that can start a\n// block.\nconst char *QsciLexer::blockStart(int *) const\n{\n    return 0;\n}\n\n\n// Default implementation to return the list of characters that can end a\n// block.\nconst char *QsciLexer::blockEnd(int *) const\n{\n    return 0;\n}\n\n\n// Default implementation to return the style used for braces.\nint QsciLexer::braceStyle() const\n{\n    return -1;\n}\n\n\n// Default implementation to return the number of lines to look back when\n// auto-indenting.\nint QsciLexer::blockLookback() const\n{\n    return 20;\n}\n\n\n// Default implementation to return the case sensitivity of the language.\nbool QsciLexer::caseSensitive() const\n{\n    return true;\n}\n\n\n// Default implementation to return the characters that make up a word.\nconst char *QsciLexer::wordCharacters() const\n{\n    return 0;\n}\n\n\n// Default implementation to return the style used for whitespace.\nint QsciLexer::defaultStyle() const\n{\n    return 0;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexer::color(int style) const\n{\n    return styleData(style).color;\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexer::paper(int style) const\n{\n    return styleData(style).paper;\n}\n\n\n// Returns the font for a style.\nQFont QsciLexer::font(int style) const\n{\n    return styleData(style).font;\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexer::eolFill(int style) const\n{\n    return styleData(style).eol_fill;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexer::keywords(int) const\n{\n    return 0;\n}\n\n\n// Returns the default EOL fill for a style.\nbool QsciLexer::defaultEolFill(int) const\n{\n    return false;\n}\n\n\n// Returns the default font for a style.\nQFont QsciLexer::defaultFont(int) const\n{\n    return defaultFont();\n}\n\n\n// Returns the default font.\nQFont QsciLexer::defaultFont() const\n{\n    return defFont;\n}\n\n\n// Sets the default font.\nvoid QsciLexer::setDefaultFont(const QFont &f)\n{\n    defFont = f;\n}\n\n\n// Returns the default text colour for a style.\nQColor QsciLexer::defaultColor(int) const\n{\n    return defaultColor();\n}\n\n\n// Returns the default text colour.\nQColor QsciLexer::defaultColor() const\n{\n    return defColor;\n}\n\n\n// Sets the default text colour.\nvoid QsciLexer::setDefaultColor(const QColor &c)\n{\n    defColor = c;\n}\n\n\n// Returns the default paper colour for a styles.\nQColor QsciLexer::defaultPaper(int) const\n{\n    return defaultPaper();\n}\n\n\n// Returns the default paper colour.\nQColor QsciLexer::defaultPaper() const\n{\n    return defPaper;\n}\n\n\n// Sets the default paper colour.\nvoid QsciLexer::setDefaultPaper(const QColor &c)\n{\n    defPaper = c;\n\n    // Normally the default values are only intended to provide defaults when a\n    // lexer is first setup because once a style has been referenced then a\n    // copy of the default is made.  However the default paper is a special\n    // case because there is no other way to set the background colour used\n    // where there is no text.  Therefore we also actively set it.\n    setPaper(c, QsciScintillaBase::STYLE_DEFAULT);\n}\n\n\n// Read properties from the settings.\nbool QsciLexer::readProperties(QSettings &,const QString &)\n{\n    return true;\n}\n\n\n// Refresh all properties.\nvoid QsciLexer::refreshProperties()\n{\n}\n\n\n// Write properties to the settings.\nbool QsciLexer::writeProperties(QSettings &,const QString &) const\n{\n    return true;\n}\n\n\n// Restore the user settings.\nbool QsciLexer::readSettings(QSettings &qs,const char *prefix)\n{\n    bool ok, flag, rc = true;\n    int num;\n    QString key, full_key;\n    QStringList fdesc;\n\n    setStyleDefaults();\n\n    // Read the styles.\n    for (int i = 0; i < 128; ++i)\n    {\n        // Ignore invalid styles.\n        if (description(i).isEmpty())\n            continue;\n\n        key.sprintf(\"%s/%s/style%d/\",prefix,language(),i);\n\n        // Read the foreground colour.\n        full_key = key + \"color\";\n\n        num = qs.readNumEntry(full_key, 0, &ok);\n\n        if (ok)\n            setColor(QColor((num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff), i);\n        else\n            rc = false;\n\n        // Read the end-of-line fill.\n        full_key = key + \"eolfill\";\n\n        flag = qs.readBoolEntry(full_key, 0, &ok);\n\n        if (ok)\n            setEolFill(flag, i);\n        else\n            rc = false;\n\n        // Read the font.  First try the deprecated format that uses an integer\n        // point size.\n        full_key = key + \"font\";\n\n        fdesc = qs.readListEntry(full_key, ',', &ok);\n\n        if (ok && fdesc.count() == 5)\n        {\n            QFont f;\n\n            f.setFamily(fdesc[0]);\n            f.setPointSize(fdesc[1].toInt());\n            f.setBold(fdesc[2].toInt());\n            f.setItalic(fdesc[3].toInt());\n            f.setUnderline(fdesc[4].toInt());\n\n            setFont(f, i);\n        }\n        else\n            rc = false;\n\n        // Now try the newer font format that uses a floating point point size.\n        // It is not an error if it doesn't exist.\n        full_key = key + \"font2\";\n\n        fdesc = qs.readListEntry(full_key, ',', &ok);\n\n        if (ok)\n        {\n            // Allow for future versions with more fields.\n            if (fdesc.count() >= 5)\n            {\n                QFont f;\n\n                f.setFamily(fdesc[0]);\n                f.setPointSizeF(fdesc[1].toDouble());\n                f.setBold(fdesc[2].toInt());\n                f.setItalic(fdesc[3].toInt());\n                f.setUnderline(fdesc[4].toInt());\n\n                setFont(f, i);\n            }\n            else\n            {\n                rc = false;\n            }\n        }\n\n        // Read the background colour.\n        full_key = key + \"paper\";\n\n        num = qs.readNumEntry(full_key, 0, &ok);\n\n        if (ok)\n            setPaper(QColor((num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff), i);\n        else\n            rc = false;\n    }\n\n    // Read the properties.\n    key.sprintf(\"%s/%s/properties/\",prefix,language());\n\n    if (!readProperties(qs,key))\n        rc = false;\n\n    refreshProperties();\n\n    // Read the rest.\n    key.sprintf(\"%s/%s/\",prefix,language());\n\n    // Read the default foreground colour.\n    full_key = key + \"defaultcolor\";\n\n    num = qs.readNumEntry(full_key, 0, &ok);\n\n    if (ok)\n        setDefaultColor(QColor((num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff));\n    else\n        rc = false;\n\n    // Read the default background colour.\n    full_key = key + \"defaultpaper\";\n\n    num = qs.readNumEntry(full_key, 0, &ok);\n\n    if (ok)\n        setDefaultPaper(QColor((num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff));\n    else\n        rc = false;\n\n    // Read the default font.  First try the deprecated format that uses an\n    // integer point size.\n    full_key = key + \"defaultfont\";\n\n    fdesc = qs.readListEntry(full_key, ',', &ok);\n\n    if (ok && fdesc.count() == 5)\n    {\n        QFont f;\n\n        f.setFamily(fdesc[0]);\n        f.setPointSize(fdesc[1].toInt());\n        f.setBold(fdesc[2].toInt());\n        f.setItalic(fdesc[3].toInt());\n        f.setUnderline(fdesc[4].toInt());\n\n        setDefaultFont(f);\n    }\n    else\n        rc = false;\n\n    // Now try the newer font format that uses a floating point point size.  It\n    // is not an error if it doesn't exist.\n    full_key = key + \"defaultfont2\";\n\n    fdesc = qs.readListEntry(full_key, ',', &ok);\n\n    if (ok)\n    {\n        // Allow for future versions with more fields.\n        if (fdesc.count() >= 5)\n        {\n            QFont f;\n\n            f.setFamily(fdesc[0]);\n            f.setPointSizeF(fdesc[1].toDouble());\n            f.setBold(fdesc[2].toInt());\n            f.setItalic(fdesc[3].toInt());\n            f.setUnderline(fdesc[4].toInt());\n\n            setDefaultFont(f);\n        }\n        else\n        {\n            rc = false;\n        }\n    }\n\n    full_key = key + \"autoindentstyle\";\n\n    num = qs.readNumEntry(full_key, 0, &ok);\n\n    if (ok)\n        setAutoIndentStyle(num);\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Save the user settings.\nbool QsciLexer::writeSettings(QSettings &qs,const char *prefix) const\n{\n    bool rc = true;\n    QString key, fmt(\"%1\");\n    int num;\n    QStringList fdesc;\n\n    setStyleDefaults();\n\n    // Write the styles.\n    for (int i = 0; i < 128; ++i)\n    {\n        // Ignore invalid styles.\n        if (description(i).isEmpty())\n            continue;\n\n        QColor c;\n\n        key.sprintf(\"%s/%s/style%d/\",prefix,language(),i);\n\n        // Write the foreground colour.\n        c = color(i);\n        num = (c.red() << 16) | (c.green() << 8) | c.blue();\n\n        if (!qs.writeEntry(key + \"color\", num))\n            rc = false;\n\n        // Write the end-of-line fill.\n        if (!qs.writeEntry(key + \"eolfill\", eolFill(i)))\n            rc = false;\n\n        // Write the font using the deprecated format.\n        QFont f = font(i);\n\n        fdesc.clear();\n        fdesc += f.family();\n        fdesc += fmt.arg(f.pointSize());\n\n        // The casts are for Borland.\n        fdesc += fmt.arg((int)f.bold());\n        fdesc += fmt.arg((int)f.italic());\n        fdesc += fmt.arg((int)f.underline());\n\n        if (!qs.writeEntry(key + \"font\", fdesc, ','))\n            rc = false;\n\n        // Write the font using the newer format.\n        fdesc[1] = fmt.arg(f.pointSizeF());\n\n        if (!qs.writeEntry(key + \"font2\", fdesc, ','))\n            rc = false;\n\n        // Write the background colour.\n        c = paper(i);\n        num = (c.red() << 16) | (c.green() << 8) | c.blue();\n\n        if (!qs.writeEntry(key + \"paper\", num))\n            rc = false;\n    }\n\n    // Write the properties.\n    key.sprintf(\"%s/%s/properties/\",prefix,language());\n\n    if (!writeProperties(qs,key))\n        rc = false;\n\n    // Write the rest.\n    key.sprintf(\"%s/%s/\",prefix,language());\n\n    // Write the default foreground colour.\n    num = (defColor.red() << 16) | (defColor.green() << 8) | defColor.blue();\n\n    if (!qs.writeEntry(key + \"defaultcolor\", num))\n        rc = false;\n\n    // Write the default background colour.\n    num = (defPaper.red() << 16) | (defPaper.green() << 8) | defPaper.blue();\n\n    if (!qs.writeEntry(key + \"defaultpaper\", num))\n        rc = false;\n\n    // Write the default font using the deprecated format.\n    fdesc.clear();\n    fdesc += defFont.family();\n    fdesc += fmt.arg(defFont.pointSize());\n\n    // The casts are for Borland.\n    fdesc += fmt.arg((int)defFont.bold());\n    fdesc += fmt.arg((int)defFont.italic());\n    fdesc += fmt.arg((int)defFont.underline());\n\n    if (!qs.writeEntry(key + \"defaultfont\", fdesc, ','))\n        rc = false;\n\n    // Write the font using the newer format.\n    fdesc[1] = fmt.arg(defFont.pointSizeF());\n\n    if (!qs.writeEntry(key + \"defaultfont2\", fdesc, ','))\n        rc = false;\n\n    if (!qs.writeEntry(key + \"autoindentstyle\", autoIndStyle))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return the auto-indentation style.\nint QsciLexer::autoIndentStyle()\n{\n    // We can't do this in the ctor because we want the virtuals to work.\n    if (autoIndStyle < 0)\n        autoIndStyle = (blockStartKeyword() || blockStart() || blockEnd()) ?\n                    0 : QsciScintilla::AiMaintain;\n\n    return autoIndStyle;\n}\n\n\n// Set the auto-indentation style.\nvoid QsciLexer::setAutoIndentStyle(int autoindentstyle)\n{\n    autoIndStyle = autoindentstyle;\n}\n\n\n// Set the foreground colour for a style.\nvoid QsciLexer::setColor(const QColor &c, int style)\n{\n    if (style >= 0)\n    {\n        styleData(style).color = c;\n        emit colorChanged(c, style);\n    }\n    else\n        for (int i = 0; i < 128; ++i)\n            if (!description(i).isEmpty())\n                setColor(c, i);\n}\n\n\n// Set the end-of-line fill for a style.\nvoid QsciLexer::setEolFill(bool eolfill, int style)\n{\n    if (style >= 0)\n    {\n        styleData(style).eol_fill = eolfill;\n        emit eolFillChanged(eolfill, style);\n    }\n    else\n        for (int i = 0; i < 128; ++i)\n            if (!description(i).isEmpty())\n                setEolFill(eolfill, i);\n}\n\n\n// Set the font for a style.\nvoid QsciLexer::setFont(const QFont &f, int style)\n{\n    if (style >= 0)\n    {\n        styleData(style).font = f;\n        emit fontChanged(f, style);\n    }\n    else\n        for (int i = 0; i < 128; ++i)\n            if (!description(i).isEmpty())\n                setFont(f, i);\n}\n\n\n// Set the background colour for a style.\nvoid QsciLexer::setPaper(const QColor &c, int style)\n{\n    if (style >= 0)\n    {\n        styleData(style).paper = c;\n        emit paperChanged(c, style);\n    }\n    else\n    {\n        for (int i = 0; i < 128; ++i)\n            if (!description(i).isEmpty())\n                setPaper(c, i);\n\n        emit paperChanged(c, QsciScintillaBase::STYLE_DEFAULT);\n    }\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexeravs.cpp",
    "content": "// This module implements the QsciLexerAVS class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexeravs.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerAVS::QsciLexerAVS(QObject *parent, const char *name)\n    : QsciLexer(parent,name),\n      fold_comments(false), fold_compact(true)\n{\n}\n\n\n// The dtor.\nQsciLexerAVS::~QsciLexerAVS()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerAVS::language() const\n{\n    return \"AVS\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerAVS::lexer() const\n{\n    return \"avs\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerAVS::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerAVS::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_#\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerAVS::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n    case Operator:\n        return QColor(0x00, 0x00, 0x00);\n\n    case BlockComment:\n    case NestedBlockComment:\n    case LineComment:\n        return QColor(0x00, 0x7f, 0x00);\n\n    case Number:\n    case Function:\n        return QColor(0x00, 0x7f, 0x7f);\n\n    case String:\n    case TripleString:\n        return QColor(0x7f, 0x00, 0x7f);\n\n    case Keyword:\n    case Filter:\n    case ClipProperty:\n        return QColor(0x00, 0x00, 0x7f);\n\n    case Plugin:\n        return QColor(0x00, 0x80, 0xc0);\n\n    case KeywordSet6:\n        return QColor(0x80, 0x00, 0xff);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerAVS::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case BlockComment:\n    case NestedBlockComment:\n    case LineComment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\", 9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Georgia\", 13);\n#else\n        f = QFont(\"Bitstream Vera Serif\", 9);\n#endif\n        break;\n\n    case Keyword:\n    case Filter:\n    case Plugin:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerAVS::keywords(int set) const\n{\n    if (set == 1)\n        return \"true false return global\";\n\n    if (set == 2)\n        return\n            \"addborders alignedsplice amplify amplifydb animate applyrange \"\n            \"assumebff assumefieldbased assumefps assumeframebased \"\n            \"assumesamplerate assumescaledfps assumetff audiodub audiodubex \"\n            \"avifilesource avisource bicubicresize bilinearresize \"\n            \"blackmanresize blackness blankclip blur bob cache changefps \"\n            \"colorbars colorkeymask coloryuv compare complementparity \"\n            \"conditionalfilter conditionalreader convertaudio \"\n            \"convertaudioto16bit convertaudioto24bit convertaudioto32bit \"\n            \"convertaudioto8bit convertaudiotofloat convertbacktoyuy2 \"\n            \"convertfps converttobackyuy2 converttomono converttorgb \"\n            \"converttorgb24 converttorgb32 converttoy8 converttoyv16 \"\n            \"converttoyv24 converttoyv411 converttoyuy2 converttoyv12 crop \"\n            \"cropbottom delayaudio deleteframe dissolve distributor \"\n            \"doubleweave duplicateframe ensurevbrmp3sync fadein fadein0 \"\n            \"fadein2 fadeio fadeio0 fadeio2 fadeout fadeout0 fadeout2 \"\n            \"fixbrokenchromaupsampling fixluminance fliphorizontal \"\n            \"flipvertical frameevaluate freezeframe gaussresize \"\n            \"generalconvolution getchannel getchannels getmtmode getparity \"\n            \"grayscale greyscale histogram horizontalreduceby2 imagereader \"\n            \"imagesource imagewriter info interleave internalcache \"\n            \"internalcachemt invert killaudio killvideo lanczos4resize \"\n            \"lanczosresize layer letterbox levels limiter loop mask maskhs \"\n            \"max merge mergeargb mergechannels mergechroma mergeluma mergergb \"\n            \"messageclip min mixaudio monotostereo normalize null \"\n            \"opendmlsource overlay peculiarblend pointresize pulldown \"\n            \"reduceby2 resampleaudio resetmask reverse rgbadjust scriptclip \"\n            \"segmentedavisource segmenteddirectshowsource selecteven \"\n            \"selectevery selectodd selectrangeevery separatefields setmtmode \"\n            \"sharpen showalpha showblue showfiveversions showframenumber \"\n            \"showgreen showred showsmpte showtime sincresize skewrows \"\n            \"spatialsoften spline16resize spline36resize spline64resize ssrc \"\n            \"stackhorizontal stackvertical subtitle subtract supereq \"\n            \"swapfields swapuv temporalsoften timestretch tone trim turn180 \"\n            \"turnleft turnright tweak unalignedsplice utoy utoy8 version \"\n            \"verticalreduceby2 vtoy vtoy8 wavsource weave writefile \"\n            \"writefileend writefileif writefilestart ytouv\";\n\n    if (set == 3)\n        return\n            \"addgrain addgrainc agc_hdragc analyzelogo animeivtc asharp \"\n            \"audiograph autocrop autoyuy2 avsrecursion awarpsharp \"\n            \"bassaudiosource bicublinresize bifrost binarize blendfields \"\n            \"blindpp blockbuster bordercontrol cfielddiff cframediff \"\n            \"chromashift cnr2 colormatrix combmask contra convolution3d \"\n            \"convolution3dyv12 dctfilter ddcc deblendlogo deblock deblock_qed \"\n            \"decimate decomb dedup deen deflate degrainmedian depan \"\n            \"depanestimate depaninterleave depanscenes depanstabilize \"\n            \"descratch despot dfttest dgbob dgsource directshowsource \"\n            \"distancefunction dss2 dup dupmc edeen edgemask ediupsizer eedi2 \"\n            \"eedi3 eedi3_rpow2 expand faerydust fastbicubicresize \"\n            \"fastbilinearresize fastediupsizer dedgemask fdecimate \"\n            \"ffaudiosource ffdshow ffindex ffmpegsource ffmpegsource2 \"\n            \"fft3dfilter fft3dgpu ffvideosource fielddeinterlace fielddiff \"\n            \"fillmargins fity2uv fity2u fity2v fitu2y fitv2y fluxsmooth \"\n            \"fluxsmoothst fluxsmootht framediff framenumber frfun3b frfun7 \"\n            \"gicocu golddust gradfun2db grapesmoother greedyhma grid \"\n            \"guavacomb hqdn3d hybridfupp hysteresymask ibob \"\n            \"improvesceneswitch inflate inpand inpaintlogo interframe \"\n            \"interlacedresize interlacedwarpedresize interleaved2planar \"\n            \"iscombed iscombedt iscombedtivtc kerneldeint leakkernelbob \"\n            \"leakkerneldeint limitedsharpen limitedsharpenfaster logic lsfmod \"\n            \"lumafilter lumayv12 manalyse maskeddeinterlace maskedmerge \"\n            \"maskedmix mblockfps mcompensate mctemporaldenoise \"\n            \"mctemporaldenoisepp mdegrain1 mdegrain2 mdegrain3 mdepan \"\n            \"medianblur mergehints mflow mflowblur mflowfps mflowinter \"\n            \"minblur mipsmooth mmask moderatesharpen monitorfilter motionmask \"\n            \"mpasource mpeg2source mrecalculate mscdetection msharpen mshow \"\n            \"msmooth msu_fieldshiftfixer msu_frc msuper mt mt_adddiff \"\n            \"mt_average mt_binarize mt_circle mt_clamp mt_convolution \"\n            \"mt_deflate mt_diamond mt_edge mt_ellipse mt_expand \"\n            \"mt_freeellipse mt_freelosange mt_freerectangle mt_hysteresis \"\n            \"mt_infix mt_inflate mt_inpand mt_invert mt_logic mt_losange \"\n            \"mt_lut mt_lutf mt_luts mt_lutspa mt_lutsx mt_lutxy mt_lutxyz \"\n            \"mt_makediff mt_mappedblur mt_merge mt_motion mt_polish \"\n            \"mt_rectangle mt_square mti mtsource multidecimate mvanalyse \"\n            \"mvblockfps mvchangecompensate mvcompensate mvdegrain1 mvdegrain2 \"\n            \"mvdegrain3 mvdenoise mvdepan mvflow mvflowblur mvflowfps \"\n            \"mvflowfps2 mvflowinter mvincrease mvmask mvrecalculate \"\n            \"mvscdetection mvshow nicac3source nicdtssource niclpcmsource \"\n            \"nicmpasource nicmpg123source nnedi nnedi2 nnedi2_rpow2 nnedi3 \"\n            \"nnedi3_rpow2 nomosmooth overlaymask peachsmoother pixiedust \"\n            \"planar2interleaved qtgmc qtinput rawavsource rawsource \"\n            \"reduceflicker reinterpolate411 removedirt removedust removegrain \"\n            \"removegrainhd removetemporalgrain repair requestlinear \"\n            \"reversefielddominance rgb3dlut rgdeinterlace rgsdeinterlace \"\n            \"rgblut rotate sangnom seesaw sharpen2 showchannels \"\n            \"showcombedtivtc smartdecimate smartdeinterlace smdegrain \"\n            \"smoothdeinterlace smoothuv soothess soxfilter spacedust sshiq \"\n            \"ssim ssiq stmedianfilter t3dlut tanisotropic tbilateral tcanny \"\n            \"tcomb tcombmask tcpserver tcpsource tdecimate tdeint tedgemask \"\n            \"telecide temporalcleaner temporalrepair temporalsmoother \"\n            \"tfieldblank tfm tisophote tivtc tmaskblank tmaskedmerge \"\n            \"tmaskedmerge3 tmm tmonitor tnlmeans tomsmocomp toon textsub \"\n            \"ttempsmooth ttempsmoothf tunsharp unblock uncomb undot unfilter \"\n            \"unsharpmask vaguedenoiser variableblur verticalcleaner \"\n            \"videoscope vinverse vobsub vqmcalc warpedresize warpsharp \"\n            \"xsharpen yadif yadifmod yuy2lut yv12convolution \"\n            \"yv12interlacedreduceby2 yv12interlacedselecttopfields yv12layer \"\n            \"yv12lut yv12lutxy yv12substract yv12torgb24 yv12toyuy2\";\n\n    if (set == 4)\n        return\n            \"abs apply assert bool ceil chr clip continueddenominator \"\n            \"continuednumerator cos default defined eval averagechromau \"\n            \"averagechromav averageluma chromaudifference chromavdifference \"\n            \"lumadifference exist exp findstr float floor frac hexvalue \"\n            \"import int isbool isclip isfloat isint isstring lcase leftstr \"\n            \"load_stdcall_plugin loadcplugin loadplugin loadvfapiplugin \"\n            \"loadvirtualdubplugin log midstr muldiv nop opt_allowfloataudio \"\n            \"opt_avipadscanlines opt_dwchannelmask opt_usewaveextensible \"\n            \"opt_vdubplanarhack pi pow rand revstr rightstr round scriptdir \"\n            \"scriptfile scriptname select setmemorymax \"\n            \"setplanarlegacyalignment rgbdifference rgbdifferencefromprevious \"\n            \"rgbdifferencetonext udifferencefromprevious udifferencetonext \"\n            \"setworkingdir sign sin spline sqrt string strlen time ucase \"\n            \"undefined value versionnumber versionstring uplanemax \"\n            \"uplanemedian uplanemin uplaneminmaxdifference \"\n            \"vdifferencefromprevious vdifferencetonext vplanemax vplanemedian \"\n            \"vplanemin vplaneminmaxdifference ydifferencefromprevious \"\n            \"ydifferencetonext yplanemax yplanemedian yplanemin \"\n            \"yplaneminmaxdifference\";\n\n    if (set == 5)\n        return\n            \"audiobits audiochannels audiolength audiolengthf audiorate \"\n            \"framecount framerate frameratedenominator frameratenumerator \"\n            \"getleftchannel getrightchannel hasaudio hasvideo height \"\n            \"isaudiofloat isaudioint isfieldbased isframebased isinterleaved \"\n            \"isplanar isrgb isrgb24 isrgb32 isyuv isyuy2 isyv12 width\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerAVS::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case BlockComment:\n        return tr(\"Block comment\");\n\n    case NestedBlockComment:\n        return tr(\"Nested block comment\");\n\n    case LineComment:\n        return tr(\"Line comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case String:\n        return tr(\"Double-quoted string\");\n\n    case TripleString:\n        return tr(\"Triple double-quoted string\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case Filter:\n        return tr(\"Filter\");\n\n    case Plugin:\n        return tr(\"Plugin\");\n\n    case Function:\n        return tr(\"Function\");\n\n    case ClipProperty:\n        return tr(\"Clip property\");\n\n    case KeywordSet6:\n        return tr(\"User defined\");\n    }\n\n    return QString();\n}\n\n\n// Refresh all properties.\nvoid QsciLexerAVS::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerAVS::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerAVS::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerAVS::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerAVS::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerAVS::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerAVS::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerAVS::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerAVS::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerbash.cpp",
    "content": "// This module implements the QsciLexerBash class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerbash.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerBash::QsciLexerBash(QObject *parent, const char *name)\n    : QsciLexer(parent, name), fold_comments(false), fold_compact(true)\n{\n}\n\n\n// The dtor.\nQsciLexerBash::~QsciLexerBash()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerBash::language() const\n{\n    return \"Bash\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerBash::lexer() const\n{\n    return \"bash\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerBash::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerBash::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$@%&\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerBash::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Error:\n    case Backticks:\n        return QColor(0xff,0xff,0x00);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case SingleQuotedHereDocument:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Operator:\n    case Identifier:\n    case Scalar:\n    case ParameterExpansion:\n    case HereDocumentDelimiter:\n        return QColor(0x00,0x00,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerBash::defaultEolFill(int style) const\n{\n    switch (style)\n    {\n    case SingleQuotedHereDocument:\n        return true;\n    }\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerBash::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case Operator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerBash::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"alias ar asa awk banner basename bash bc bdiff break \"\n            \"bunzip2 bzip2 cal calendar case cat cc cd chmod \"\n            \"cksum clear cmp col comm compress continue cp cpio \"\n            \"crypt csplit ctags cut date dc dd declare deroff dev \"\n            \"df diff diff3 dircmp dirname do done du echo ed \"\n            \"egrep elif else env esac eval ex exec exit expand \"\n            \"export expr false fc fgrep fi file find fmt fold for \"\n            \"function functions getconf getopt getopts grep gres \"\n            \"hash head help history iconv id if in integer jobs \"\n            \"join kill local lc let line ln logname look ls m4 \"\n            \"mail mailx make man mkdir more mt mv newgrp nl nm \"\n            \"nohup ntps od pack paste patch pathchk pax pcat perl \"\n            \"pg pr print printf ps pwd read readonly red return \"\n            \"rev rm rmdir sed select set sh shift size sleep sort \"\n            \"spell split start stop strings strip stty sum \"\n            \"suspend sync tail tar tee test then time times touch \"\n            \"tr trap true tsort tty type typeset ulimit umask \"\n            \"unalias uname uncompress unexpand uniq unpack unset \"\n            \"until uudecode uuencode vi vim vpax wait wc whence \"\n            \"which while who wpaste wstart xargs zcat \"\n\n            \"chgrp chown chroot dir dircolors factor groups \"\n            \"hostid install link md5sum mkfifo mknod nice pinky \"\n            \"printenv ptx readlink seq sha1sum shred stat su tac \"\n            \"unlink users vdir whoami yes\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerBash::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Error:\n        return tr(\"Error\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case Scalar:\n        return tr(\"Scalar\");\n\n    case ParameterExpansion:\n        return tr(\"Parameter expansion\");\n\n    case Backticks:\n        return tr(\"Backticks\");\n\n    case HereDocumentDelimiter:\n        return tr(\"Here document delimiter\");\n\n    case SingleQuotedHereDocument:\n        return tr(\"Single-quoted here document\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerBash::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case Error:\n        return QColor(0xff,0x00,0x00);\n\n    case Scalar:\n        return QColor(0xff,0xe0,0xe0);\n\n    case ParameterExpansion:\n        return QColor(0xff,0xff,0xe0);\n\n    case Backticks:\n        return QColor(0xa0,0x80,0x80);\n\n    case HereDocumentDelimiter:\n    case SingleQuotedHereDocument:\n        return QColor(0xdd,0xd0,0xdd);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerBash::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerBash::readProperties(QSettings &qs, const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerBash::writeProperties(QSettings &qs, const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerBash::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerBash::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerBash::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\", (fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerBash::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerBash::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerBash::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\", (fold_compact ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerbatch.cpp",
    "content": "// This module implements the QsciLexerBatch class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerbatch.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerBatch::QsciLexerBatch(QObject *parent, const char *name)\n    : QsciLexer(parent, name)\n{\n}\n\n\n// The dtor.\nQsciLexerBatch::~QsciLexerBatch()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerBatch::language() const\n{\n    return \"Batch\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerBatch::lexer() const\n{\n    return \"batch\";\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerBatch::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerBatch::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n    case Operator:\n        return QColor(0x00,0x00,0x00);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case Keyword:\n    case ExternalCommand:\n        return QColor(0x00,0x00,0x7f);\n\n    case Label:\n        return QColor(0x7f,0x00,0x7f);\n\n    case HideCommandChar:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Variable:\n        return QColor(0x80,0x00,0x80);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerBatch::defaultEolFill(int style) const\n{\n    switch (style)\n    {\n    case Label:\n        return true;\n    }\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerBatch::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case ExternalCommand:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerBatch::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"rem set if exist errorlevel for in do break call \"\n            \"chcp cd chdir choice cls country ctty date del \"\n            \"erase dir echo exit goto loadfix loadhigh mkdir md \"\n            \"move path pause prompt rename ren rmdir rd shift \"\n            \"time type ver verify vol com con lpt nul\";\n\n    return 0;\n}\n\n\n// Return the case sensitivity.\nbool QsciLexerBatch::caseSensitive() const\n{\n    return false;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerBatch::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case Label:\n        return tr(\"Label\");\n\n    case HideCommandChar:\n        return tr(\"Hide command character\");\n\n    case ExternalCommand:\n        return tr(\"External command\");\n\n    case Variable:\n        return tr(\"Variable\");\n\n    case Operator:\n        return tr(\"Operator\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerBatch::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case Label:\n        return QColor(0x60,0x60,0x60);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexercmake.cpp",
    "content": "// This module implements the QsciLexerCMake class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexercmake.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerCMake::QsciLexerCMake(QObject *parent, const char *name)\n    : QsciLexer(parent,name),\n      fold_atelse(false)\n{\n}\n\n\n// The dtor.\nQsciLexerCMake::~QsciLexerCMake()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerCMake::language() const\n{\n    return \"CMake\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerCMake::lexer() const\n{\n    return \"cmake\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerCMake::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n    case KeywordSet3:\n        return QColor(0x00,0x00,0x00);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case String:\n    case StringLeftQuote:\n    case StringRightQuote:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Function:\n    case BlockWhile:\n    case BlockForeach:\n    case BlockIf:\n    case BlockMacro:\n        return QColor(0x00,0x00,0x7f);\n\n    case Variable:\n        return QColor(0x80,0x00,0x00);\n\n    case Label:\n    case StringVariable:\n        return QColor(0xcc,0x33,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerCMake::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Function:\n    case BlockWhile:\n    case BlockForeach:\n    case BlockIf:\n    case BlockMacro:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerCMake::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"add_custom_command add_custom_target add_definitions \"\n            \"add_dependencies add_executable add_library add_subdirectory \"\n            \"add_test aux_source_directory build_command build_name \"\n            \"cmake_minimum_required configure_file create_test_sourcelist \"\n            \"else elseif enable_language enable_testing endforeach endif \"\n            \"endmacro endwhile exec_program execute_process \"\n            \"export_library_dependencies file find_file find_library \"\n            \"find_package find_path find_program fltk_wrap_ui foreach \"\n            \"get_cmake_property get_directory_property get_filename_component \"\n            \"get_source_file_property get_target_property get_test_property \"\n            \"if include include_directories include_external_msproject \"\n            \"include_regular_expression install install_files \"\n            \"install_programs install_targets link_directories link_libraries \"\n            \"list load_cache load_command macro make_directory \"\n            \"mark_as_advanced math message option output_required_files \"\n            \"project qt_wrap_cpp qt_wrap_ui remove remove_definitions \"\n            \"separate_arguments set set_directory_properties \"\n            \"set_source_files_properties set_target_properties \"\n            \"set_tests_properties site_name source_group string \"\n            \"subdir_depends subdirs target_link_libraries try_compile try_run \"\n            \"use_mangled_mesa utility_source variable_requires \"\n            \"vtk_make_instantiator vtk_wrap_java vtk_wrap_python vtk_wrap_tcl \"\n            \"while write_file\";\n\n    if (set == 2)\n        return\n            \"ABSOLUTE ABSTRACT ADDITIONAL_MAKE_CLEAN_FILES ALL AND APPEND \"\n            \"ARGS ASCII BEFORE CACHE CACHE_VARIABLES CLEAR COMMAND COMMANDS \"\n            \"COMMAND_NAME COMMENT COMPARE COMPILE_FLAGS COPYONLY DEFINED \"\n            \"DEFINE_SYMBOL DEPENDS DOC EQUAL ESCAPE_QUOTES EXCLUDE \"\n            \"EXCLUDE_FROM_ALL EXISTS EXPORT_MACRO EXT EXTRA_INCLUDE \"\n            \"FATAL_ERROR FILE FILES FORCE FUNCTION GENERATED GLOB \"\n            \"GLOB_RECURSE GREATER GROUP_SIZE HEADER_FILE_ONLY HEADER_LOCATION \"\n            \"IMMEDIATE INCLUDES INCLUDE_DIRECTORIES INCLUDE_INTERNALS \"\n            \"INCLUDE_REGULAR_EXPRESSION LESS LINK_DIRECTORIES LINK_FLAGS \"\n            \"LOCATION MACOSX_BUNDLE MACROS MAIN_DEPENDENCY MAKE_DIRECTORY \"\n            \"MATCH MATCHALL MATCHES MODULE NAME NAME_WE NOT NOTEQUAL \"\n            \"NO_SYSTEM_PATH OBJECT_DEPENDS OPTIONAL OR OUTPUT OUTPUT_VARIABLE \"\n            \"PATH PATHS POST_BUILD POST_INSTALL_SCRIPT PREFIX PREORDER \"\n            \"PRE_BUILD PRE_INSTALL_SCRIPT PRE_LINK PROGRAM PROGRAM_ARGS \"\n            \"PROPERTIES QUIET RANGE READ REGEX REGULAR_EXPRESSION REPLACE \"\n            \"REQUIRED RETURN_VALUE RUNTIME_DIRECTORY SEND_ERROR SHARED \"\n            \"SOURCES STATIC STATUS STREQUAL STRGREATER STRLESS SUFFIX TARGET \"\n            \"TOLOWER TOUPPER VAR VARIABLES VERSION WIN32 WRAP_EXCLUDE WRITE \"\n            \"APPLE MINGW MSYS CYGWIN BORLAND WATCOM MSVC MSVC_IDE MSVC60 \"\n            \"MSVC70 MSVC71 MSVC80 CMAKE_COMPILER_2005 OFF ON\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerCMake::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case String:\n        return tr(\"String\");\n\n    case StringLeftQuote:\n        return tr(\"Left quoted string\");\n\n    case StringRightQuote:\n        return tr(\"Right quoted string\");\n\n    case Function:\n        return tr(\"Function\");\n\n    case Variable:\n        return tr(\"Variable\");\n\n    case Label:\n        return tr(\"Label\");\n\n    case KeywordSet3:\n        return tr(\"User defined\");\n\n    case BlockWhile:\n        return tr(\"WHILE block\");\n\n    case BlockForeach:\n        return tr(\"FOREACH block\");\n\n    case BlockIf:\n        return tr(\"IF block\");\n\n    case BlockMacro:\n        return tr(\"MACRO block\");\n\n    case StringVariable:\n        return tr(\"Variable within a string\");\n\n    case Number:\n        return tr(\"Number\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerCMake::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case String:\n    case StringLeftQuote:\n    case StringRightQuote:\n    case StringVariable:\n        return QColor(0xee,0xee,0xee);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerCMake::refreshProperties()\n{\n    setAtElseProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerCMake::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldatelse\", false, &ok);\n\n    if (ok)\n        fold_atelse = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerCMake::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldatelse\", fold_atelse))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return true if ELSE blocks can be folded.\nbool QsciLexerCMake::foldAtElse() const\n{\n    return fold_atelse;\n}\n\n\n// Set if ELSE blocks can be folded.\nvoid QsciLexerCMake::setFoldAtElse(bool fold)\n{\n    fold_atelse = fold;\n\n    setAtElseProp();\n}\n\n\n// Set the \"fold.at.else\" property.\nvoid QsciLexerCMake::setAtElseProp()\n{\n    emit propertyChanged(\"fold.at.else\",(fold_atelse ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexercoffeescript.cpp",
    "content": "// This module implements the QsciLexerCoffeeScript class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexercoffeescript.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerCoffeeScript::QsciLexerCoffeeScript(QObject *parent, const char *name)\n    : QsciLexer(parent, name),\n      fold_comments(false), fold_compact(true), style_preproc(false),\n      dollars(true)\n{\n}\n\n\n// The dtor.\nQsciLexerCoffeeScript::~QsciLexerCoffeeScript()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerCoffeeScript::language() const\n{\n    return \"CoffeeScript\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerCoffeeScript::lexer() const\n{\n    return \"coffeescript\";\n}\n\n\n// Return the set of character sequences that can separate auto-completion\n// words.\nQStringList QsciLexerCoffeeScript::autoCompletionWordSeparators() const\n{\n    QStringList wl;\n\n    wl << \".\";\n\n    return wl;\n}\n\n\n// Return the list of keywords that can start a block.\nconst char *QsciLexerCoffeeScript::blockStartKeyword(int *style) const\n{\n    if (style)\n        *style = Keyword;\n\n    return \"catch class do else finally for if try until when while\";\n}\n\n\n// Return the list of characters that can start a block.\nconst char *QsciLexerCoffeeScript::blockStart(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"{\";\n}\n\n\n// Return the list of characters that can end a block.\nconst char *QsciLexerCoffeeScript::blockEnd(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"}\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerCoffeeScript::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerCoffeeScript::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_#\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerCoffeeScript::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80, 0x80, 0x80);\n\n    case Comment:\n    case CommentLine:\n    case CommentBlock:\n    case BlockRegexComment:\n        return QColor(0x00, 0x7f, 0x00);\n\n    case CommentDoc:\n    case CommentLineDoc:\n        return QColor(0x3f, 0x70, 0x3f);\n\n    case Number:\n        return QColor(0x00, 0x7f, 0x7f);\n\n    case Keyword:\n        return QColor(0x00, 0x00, 0x7f);\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n        return QColor(0x7f, 0x00, 0x7f);\n\n    case PreProcessor:\n        return QColor(0x7f, 0x7f, 0x00);\n\n    case Operator:\n    case UnclosedString:\n        return QColor(0x00, 0x00, 0x00);\n\n    case VerbatimString:\n        return QColor(0x00, 0x7f, 0x00);\n\n    case Regex:\n    case BlockRegex:\n        return QColor(0x3f, 0x7f, 0x3f);\n\n    case CommentDocKeyword:\n        return QColor(0x30, 0x60, 0xa0);\n\n    case CommentDocKeywordError:\n        return QColor(0x80, 0x40, 0x20);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerCoffeeScript::defaultEolFill(int style) const\n{\n    switch (style)\n    {\n    case UnclosedString:\n    case VerbatimString:\n    case Regex:\n        return true;\n    }\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerCoffeeScript::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case CommentLine:\n    case CommentDoc:\n    case CommentLineDoc:\n    case CommentDocKeyword:\n    case CommentDocKeywordError:\n    case CommentBlock:\n    case BlockRegexComment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case Operator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case UnclosedString:\n    case VerbatimString:\n    case Regex:\n    case BlockRegex:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerCoffeeScript::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"true false null this new delete typeof in instanceof return \"\n            \"throw break continue debugger if else switch for while do try \"\n            \"catch finally class extends super \"\n            \"undefined then unless until loop of by when and or is isnt not \"\n            \"yes no on off\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerCoffeeScript::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"C-style comment\");\n\n    case CommentLine:\n        return tr(\"C++-style comment\");\n\n    case CommentDoc:\n        return tr(\"JavaDoc C-style comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case UUID:\n        return tr(\"IDL UUID\");\n\n    case PreProcessor:\n        return tr(\"Pre-processor block\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case VerbatimString:\n        return tr(\"C# verbatim string\");\n\n    case Regex:\n        return tr(\"Regular expression\");\n\n    case CommentLineDoc:\n        return tr(\"JavaDoc C++-style comment\");\n\n    case KeywordSet2:\n        return tr(\"Secondary keywords and identifiers\");\n\n    case CommentDocKeyword:\n        return tr(\"JavaDoc keyword\");\n\n    case CommentDocKeywordError:\n        return tr(\"JavaDoc keyword error\");\n\n    case GlobalClass:\n        return tr(\"Global classes\");\n\n    case CommentBlock:\n        return tr(\"Block comment\");\n\n    case BlockRegex:\n        return tr(\"Block regular expression\");\n\n    case BlockRegexComment:\n        return tr(\"Block regular expression comment\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerCoffeeScript::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case UnclosedString:\n        return QColor(0xe0,0xc0,0xe0);\n\n    case VerbatimString:\n        return QColor(0xe0,0xff,0xe0);\n\n    case Regex:\n        return QColor(0xe0,0xf0,0xe0);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerCoffeeScript::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n    setStylePreprocProp();\n    setDollarsProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerCoffeeScript::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"stylepreprocessor\", false, &ok);\n\n    if (ok)\n        style_preproc = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"dollars\", true, &ok);\n\n    if (ok)\n        dollars = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerCoffeeScript::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"stylepreprocessor\", style_preproc))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"dollars\", dollars))\n        rc = false;\n\n    return rc;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerCoffeeScript::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerCoffeeScript::setCommentProp()\n{\n    emit propertyChanged(\"fold.coffeescript.comment\",\n            (fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Set if folds are compact\nvoid QsciLexerCoffeeScript::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerCoffeeScript::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\", (fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Set if preprocessor lines are styled.\nvoid QsciLexerCoffeeScript::setStylePreprocessor(bool style)\n{\n    style_preproc = style;\n\n    setStylePreprocProp();\n}\n\n\n// Set the \"styling.within.preprocessor\" property.\nvoid QsciLexerCoffeeScript::setStylePreprocProp()\n{\n    emit propertyChanged(\"styling.within.preprocessor\",\n            (style_preproc ? \"1\" : \"0\"));\n}\n\n\n// Set if '$' characters are allowed.\nvoid QsciLexerCoffeeScript::setDollarsAllowed(bool allowed)\n{\n    dollars = allowed;\n\n    setDollarsProp();\n}\n\n\n// Set the \"lexer.cpp.allow.dollars\" property.\nvoid QsciLexerCoffeeScript::setDollarsProp()\n{\n    emit propertyChanged(\"lexer.cpp.allow.dollars\", (dollars ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexercpp.cpp",
    "content": "// This module implements the QsciLexerCPP class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexercpp.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerCPP::QsciLexerCPP(QObject *parent, const char *name,\n        bool caseInsensitiveKeywords)\n    : QsciLexer(parent, name),\n      fold_atelse(false), fold_comments(false), fold_compact(true),\n      fold_preproc(true), style_preproc(false), dollars(true),\n      highlight_triple(false), highlight_hash(false),\n      nocase(caseInsensitiveKeywords)\n{\n}\n\n\n// The dtor.\nQsciLexerCPP::~QsciLexerCPP()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerCPP::language() const\n{\n    return \"C++\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerCPP::lexer() const\n{\n    return (nocase ? \"cppnocase\" : \"cpp\");\n}\n\n\n// Return the set of character sequences that can separate auto-completion\n// words.\nQStringList QsciLexerCPP::autoCompletionWordSeparators() const\n{\n    QStringList wl;\n\n    wl << \"::\" << \"->\" << \".\";\n\n    return wl;\n}\n\n\n// Return the list of keywords that can start a block.\nconst char *QsciLexerCPP::blockStartKeyword(int *style) const\n{\n    if (style)\n        *style = Keyword;\n\n    return \"case catch class default do else finally for if private \"\n           \"protected public struct try union while\";\n}\n\n\n// Return the list of characters that can start a block.\nconst char *QsciLexerCPP::blockStart(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"{\";\n}\n\n\n// Return the list of characters that can end a block.\nconst char *QsciLexerCPP::blockEnd(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"}\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerCPP::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerCPP::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_#\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerCPP::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80, 0x80, 0x80);\n\n    case Comment:\n    case CommentLine:\n        return QColor(0x00, 0x7f, 0x00);\n\n    case CommentDoc:\n    case CommentLineDoc:\n    case PreProcessorCommentLineDoc:\n        return QColor(0x3f, 0x70, 0x3f);\n\n    case Number:\n        return QColor(0x00, 0x7f, 0x7f);\n\n    case Keyword:\n        return QColor(0x00, 0x00, 0x7f);\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case RawString:\n        return QColor(0x7f, 0x00, 0x7f);\n\n    case PreProcessor:\n        return QColor(0x7f, 0x7f, 0x00);\n\n    case Operator:\n    case UnclosedString:\n        return QColor(0x00, 0x00, 0x00);\n\n    case VerbatimString:\n    case TripleQuotedVerbatimString:\n    case HashQuotedString:\n        return QColor(0x00, 0x7f, 0x00);\n\n    case Regex:\n        return QColor(0x3f, 0x7f, 0x3f);\n\n    case CommentDocKeyword:\n        return QColor(0x30, 0x60, 0xa0);\n\n    case CommentDocKeywordError:\n        return QColor(0x80, 0x40, 0x20);\n\n    case PreProcessorComment:\n        return QColor(0x65, 0x99, 0x00);\n\n    case InactiveDefault:\n    case InactiveUUID:\n    case InactiveCommentLineDoc:\n    case InactiveKeywordSet2:\n    case InactiveCommentDocKeyword:\n    case InactiveCommentDocKeywordError:\n    case InactivePreProcessorCommentLineDoc:\n        return QColor(0xc0, 0xc0, 0xc0);\n\n    case InactiveComment:\n    case InactiveCommentLine:\n    case InactiveNumber:\n    case InactiveVerbatimString:\n    case InactiveTripleQuotedVerbatimString:\n    case InactiveHashQuotedString:\n        return QColor(0x90, 0xb0, 0x90);\n\n    case InactiveCommentDoc:\n        return QColor(0xd0, 0xd0, 0xd0);\n\n    case InactiveKeyword:\n        return QColor(0x90, 0x90, 0xb0);\n\n    case InactiveDoubleQuotedString:\n    case InactiveSingleQuotedString:\n    case InactiveRawString:\n        return QColor(0xb0, 0x90, 0xb0);\n\n    case InactivePreProcessor:\n        return QColor(0xb0, 0xb0, 0x90);\n\n    case InactiveOperator:\n    case InactiveIdentifier:\n    case InactiveGlobalClass:\n        return QColor(0xb0, 0xb0, 0xb0);\n\n    case InactiveUnclosedString:\n        return QColor(0x00, 0x00, 0x00);\n\n    case InactiveRegex:\n        return QColor(0x7f, 0xaf, 0x7f);\n\n    case InactivePreProcessorComment:\n        return QColor(0xa0, 0xc0, 0x90);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerCPP::defaultEolFill(int style) const\n{\n    switch (style)\n    {\n    case UnclosedString:\n    case InactiveUnclosedString:\n    case VerbatimString:\n    case InactiveVerbatimString:\n    case Regex:\n    case InactiveRegex:\n    case TripleQuotedVerbatimString:\n    case InactiveTripleQuotedVerbatimString:\n    case HashQuotedString:\n    case InactiveHashQuotedString:\n        return true;\n    }\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerCPP::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case InactiveComment:\n    case CommentLine:\n    case InactiveCommentLine:\n    case CommentDoc:\n    case InactiveCommentDoc:\n    case CommentLineDoc:\n    case InactiveCommentLineDoc:\n    case CommentDocKeyword:\n    case InactiveCommentDocKeyword:\n    case CommentDocKeywordError:\n    case InactiveCommentDocKeywordError:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case InactiveKeyword:\n    case Operator:\n    case InactiveOperator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case DoubleQuotedString:\n    case InactiveDoubleQuotedString:\n    case SingleQuotedString:\n    case InactiveSingleQuotedString:\n    case UnclosedString:\n    case InactiveUnclosedString:\n    case VerbatimString:\n    case InactiveVerbatimString:\n    case Regex:\n    case InactiveRegex:\n    case TripleQuotedVerbatimString:\n    case InactiveTripleQuotedVerbatimString:\n    case HashQuotedString:\n    case InactiveHashQuotedString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerCPP::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"and and_eq asm auto bitand bitor bool break case \"\n            \"catch char class compl const const_cast continue \"\n            \"default delete do double dynamic_cast else enum \"\n            \"explicit export extern false float for friend goto if \"\n            \"inline int long mutable namespace new not not_eq \"\n            \"operator or or_eq private protected public register \"\n            \"reinterpret_cast return short signed sizeof static \"\n            \"static_cast struct switch template this throw true \"\n            \"try typedef typeid typename union unsigned using \"\n            \"virtual void volatile wchar_t while xor xor_eq\";\n\n    if (set == 3)\n        return\n            \"a addindex addtogroup anchor arg attention author b \"\n            \"brief bug c class code date def defgroup deprecated \"\n            \"dontinclude e em endcode endhtmlonly endif \"\n            \"endlatexonly endlink endverbatim enum example \"\n            \"exception f$ f[ f] file fn hideinitializer \"\n            \"htmlinclude htmlonly if image include ingroup \"\n            \"internal invariant interface latexonly li line link \"\n            \"mainpage name namespace nosubgrouping note overload \"\n            \"p page par param post pre ref relates remarks return \"\n            \"retval sa section see showinitializer since skip \"\n            \"skipline struct subsection test throw todo typedef \"\n            \"union until var verbatim verbinclude version warning \"\n            \"weakgroup $ @ \\\\ & < > # { }\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerCPP::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case InactiveDefault:\n        return tr(\"Inactive default\");\n\n    case Comment:\n        return tr(\"C comment\");\n\n    case InactiveComment:\n        return tr(\"Inactive C comment\");\n\n    case CommentLine:\n        return tr(\"C++ comment\");\n\n    case InactiveCommentLine:\n        return tr(\"Inactive C++ comment\");\n\n    case CommentDoc:\n        return tr(\"JavaDoc style C comment\");\n\n    case InactiveCommentDoc:\n        return tr(\"Inactive JavaDoc style C comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case InactiveNumber:\n        return tr(\"Inactive number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case InactiveKeyword:\n        return tr(\"Inactive keyword\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case InactiveDoubleQuotedString:\n        return tr(\"Inactive double-quoted string\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case InactiveSingleQuotedString:\n        return tr(\"Inactive single-quoted string\");\n\n    case UUID:\n        return tr(\"IDL UUID\");\n\n    case InactiveUUID:\n        return tr(\"Inactive IDL UUID\");\n\n    case PreProcessor:\n        return tr(\"Pre-processor block\");\n\n    case InactivePreProcessor:\n        return tr(\"Inactive pre-processor block\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case InactiveOperator:\n        return tr(\"Inactive operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case InactiveIdentifier:\n        return tr(\"Inactive identifier\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case InactiveUnclosedString:\n        return tr(\"Inactive unclosed string\");\n\n    case VerbatimString:\n        return tr(\"C# verbatim string\");\n\n    case InactiveVerbatimString:\n        return tr(\"Inactive C# verbatim string\");\n\n    case Regex:\n        return tr(\"JavaScript regular expression\");\n\n    case InactiveRegex:\n        return tr(\"Inactive JavaScript regular expression\");\n\n    case CommentLineDoc:\n        return tr(\"JavaDoc style C++ comment\");\n\n    case InactiveCommentLineDoc:\n        return tr(\"Inactive JavaDoc style C++ comment\");\n\n    case KeywordSet2:\n        return tr(\"Secondary keywords and identifiers\");\n\n    case InactiveKeywordSet2:\n        return tr(\"Inactive secondary keywords and identifiers\");\n\n    case CommentDocKeyword:\n        return tr(\"JavaDoc keyword\");\n\n    case InactiveCommentDocKeyword:\n        return tr(\"Inactive JavaDoc keyword\");\n\n    case CommentDocKeywordError:\n        return tr(\"JavaDoc keyword error\");\n\n    case InactiveCommentDocKeywordError:\n        return tr(\"Inactive JavaDoc keyword error\");\n\n    case GlobalClass:\n        return tr(\"Global classes and typedefs\");\n\n    case InactiveGlobalClass:\n        return tr(\"Inactive global classes and typedefs\");\n\n    case RawString:\n        return tr(\"C++ raw string\");\n\n    case InactiveRawString:\n        return tr(\"Inactive C++ raw string\");\n\n    case TripleQuotedVerbatimString:\n        return tr(\"Vala triple-quoted verbatim string\");\n\n    case InactiveTripleQuotedVerbatimString:\n        return tr(\"Inactive Vala triple-quoted verbatim string\");\n\n    case HashQuotedString:\n        return tr(\"Pike hash-quoted string\");\n\n    case InactiveHashQuotedString:\n        return tr(\"Inactive Pike hash-quoted string\");\n\n    case PreProcessorComment:\n        return tr(\"Pre-processor C comment\");\n\n    case InactivePreProcessorComment:\n        return tr(\"Inactive pre-processor C comment\");\n\n    case PreProcessorCommentLineDoc:\n        return tr(\"JavaDoc style pre-processor comment\");\n\n    case InactivePreProcessorCommentLineDoc:\n        return tr(\"Inactive JavaDoc style pre-processor comment\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerCPP::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case UnclosedString:\n    case InactiveUnclosedString:\n        return QColor(0xe0,0xc0,0xe0);\n\n    case VerbatimString:\n    case InactiveVerbatimString:\n    case TripleQuotedVerbatimString:\n    case InactiveTripleQuotedVerbatimString:\n        return QColor(0xe0,0xff,0xe0);\n\n    case Regex:\n    case InactiveRegex:\n        return QColor(0xe0,0xf0,0xe0);\n\n    case RawString:\n    case InactiveRawString:\n        return QColor(0xff,0xf3,0xff);\n\n    case HashQuotedString:\n    case InactiveHashQuotedString:\n        return QColor(0xe7,0xff,0xd7);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerCPP::refreshProperties()\n{\n    setAtElseProp();\n    setCommentProp();\n    setCompactProp();\n    setPreprocProp();\n    setStylePreprocProp();\n    setDollarsProp();\n    setHighlightTripleProp();\n    setHighlightHashProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerCPP::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldatelse\", false, &ok);\n\n    if (ok)\n        fold_atelse = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldpreprocessor\", true, &ok);\n\n    if (ok)\n        fold_preproc = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"stylepreprocessor\", false, &ok);\n\n    if (ok)\n        style_preproc = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"dollars\", true, &ok);\n\n    if (ok)\n        dollars = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"highlighttriple\", false, &ok);\n\n    if (ok)\n        highlight_triple = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"highlighthash\", false, &ok);\n\n    if (ok)\n        highlight_hash = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerCPP::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldatelse\", fold_atelse))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldpreprocessor\", fold_preproc))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"stylepreprocessor\", style_preproc))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"dollars\", dollars))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"highlighttriple\", highlight_triple))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"highlighthash\", highlight_hash))\n        rc = false;\n\n    return rc;\n}\n\n\n// Set if else can be folded.\nvoid QsciLexerCPP::setFoldAtElse(bool fold)\n{\n    fold_atelse = fold;\n\n    setAtElseProp();\n}\n\n\n// Set the \"fold.at.else\" property.\nvoid QsciLexerCPP::setAtElseProp()\n{\n    emit propertyChanged(\"fold.at.else\",(fold_atelse ? \"1\" : \"0\"));\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerCPP::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerCPP::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Set if folds are compact\nvoid QsciLexerCPP::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerCPP::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Set if preprocessor blocks can be folded.\nvoid QsciLexerCPP::setFoldPreprocessor(bool fold)\n{\n    fold_preproc = fold;\n\n    setPreprocProp();\n}\n\n\n// Set the \"fold.preprocessor\" property.\nvoid QsciLexerCPP::setPreprocProp()\n{\n    emit propertyChanged(\"fold.preprocessor\",(fold_preproc ? \"1\" : \"0\"));\n}\n\n\n// Set if preprocessor lines are styled.\nvoid QsciLexerCPP::setStylePreprocessor(bool style)\n{\n    style_preproc = style;\n\n    setStylePreprocProp();\n}\n\n\n// Set the \"styling.within.preprocessor\" property.\nvoid QsciLexerCPP::setStylePreprocProp()\n{\n    emit propertyChanged(\"styling.within.preprocessor\",(style_preproc ? \"1\" : \"0\"));\n}\n\n\n// Set if '$' characters are allowed.\nvoid QsciLexerCPP::setDollarsAllowed(bool allowed)\n{\n    dollars = allowed;\n\n    setDollarsProp();\n}\n\n\n// Set the \"lexer.cpp.allow.dollars\" property.\nvoid QsciLexerCPP::setDollarsProp()\n{\n    emit propertyChanged(\"lexer.cpp.allow.dollars\",(dollars ? \"1\" : \"0\"));\n}\n\n\n// Set if triple quoted strings are highlighted.\nvoid QsciLexerCPP::setHighlightTripleQuotedStrings(bool enabled)\n{\n    highlight_triple = enabled;\n\n    setHighlightTripleProp();\n}\n\n\n// Set the \"lexer.cpp.triplequoted.strings\" property.\nvoid QsciLexerCPP::setHighlightTripleProp()\n{\n    emit propertyChanged(\"lexer.cpp.triplequoted.strings\",\n            (highlight_triple ? \"1\" : \"0\"));\n}\n\n\n// Set if hash quoted strings are highlighted.\nvoid QsciLexerCPP::setHighlightHashQuotedStrings(bool enabled)\n{\n    highlight_hash = enabled;\n\n    setHighlightHashProp();\n}\n\n\n// Set the \"lexer.cpp.hashquoted.strings\" property.\nvoid QsciLexerCPP::setHighlightHashProp()\n{\n    emit propertyChanged(\"lexer.cpp.hashquoted.strings\",\n            (highlight_hash ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexercsharp.cpp",
    "content": "// This module implements the QsciLexerCSharp class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexercsharp.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n\n\n// The ctor.\nQsciLexerCSharp::QsciLexerCSharp(QObject *parent, const char *name)\n    : QsciLexerCPP(parent, name)\n{\n}\n\n\n// The dtor.\nQsciLexerCSharp::~QsciLexerCSharp()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerCSharp::language() const\n{\n    return \"C#\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerCSharp::defaultColor(int style) const\n{\n    if (style == VerbatimString)\n        return QColor(0x00,0x7f,0x00);\n\n    return QsciLexerCPP::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerCSharp::defaultEolFill(int style) const\n{\n    if (style == VerbatimString)\n        return true;\n\n    return QsciLexerCPP::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerCSharp::defaultFont(int style) const\n{\n    if (style == VerbatimString)\n#if defined(Q_OS_WIN)\n        return QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        return QFont(\"Courier\", 12);\n#else\n        return QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n\n    return QsciLexerCPP::defaultFont(style);\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerCSharp::keywords(int set) const\n{\n    if (set != 1)\n        return 0;\n\n    return \"abstract as base bool break byte case catch char checked \"\n           \"class const continue decimal default delegate do double else \"\n           \"enum event explicit extern false finally fixed float for \"\n           \"foreach goto if implicit in int interface internal is lock \"\n           \"long namespace new null object operator out override params \"\n           \"private protected public readonly ref return sbyte sealed \"\n           \"short sizeof stackalloc static string struct switch this \"\n           \"throw true try typeof uint ulong unchecked unsafe ushort \"\n           \"using virtual void while\";\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerCSharp::description(int style) const\n{\n    if (style == VerbatimString)\n        return tr(\"Verbatim string\");\n\n    return QsciLexerCPP::description(style);\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerCSharp::defaultPaper(int style) const\n{\n    if (style == VerbatimString)\n        return QColor(0xe0,0xff,0xe0);\n\n    return QsciLexer::defaultPaper(style);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexercss.cpp",
    "content": "// This module implements the QsciLexerCSS class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexercss.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerCSS::QsciLexerCSS(QObject *parent, const char *name)\n    : QsciLexer(parent, name),\n      fold_comments(false), fold_compact(true), hss_language(false),\n      less_language(false), scss_language(false)\n{\n}\n\n\n// The dtor.\nQsciLexerCSS::~QsciLexerCSS()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerCSS::language() const\n{\n    return \"CSS\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerCSS::lexer() const\n{\n    return \"css\";\n}\n\n\n// Return the list of characters that can start a block.\nconst char *QsciLexerCSS::blockStart(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"{\";\n}\n\n\n// Return the list of characters that can end a block.\nconst char *QsciLexerCSS::blockEnd(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"}\";\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerCSS::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerCSS::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0xff,0x00,0x80);\n\n    case Tag:\n        return QColor(0x00,0x00,0x7f);\n\n    case PseudoClass:\n    case Attribute:\n        return QColor(0x80,0x00,0x00);\n\n    case UnknownPseudoClass:\n    case UnknownProperty:\n        return QColor(0xff,0x00,0x00);\n\n    case Operator:\n        return QColor(0x00,0x00,0x00);\n\n    case CSS1Property:\n        return QColor(0x00,0x40,0xe0);\n\n    case Value:\n    case DoubleQuotedString:\n    case SingleQuotedString:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case IDSelector:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Important:\n        return QColor(0xff,0x80,0x00);\n\n    case AtRule:\n    case MediaRule:\n        return QColor(0x7f,0x7f,0x00);\n\n    case CSS2Property:\n        return QColor(0x00,0xa0,0xe0);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerCSS::defaultFont(int style) const\n{\n    QFont f;\n\n    if (style == Comment)\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n    else\n    {\n        f = QsciLexer::defaultFont(style);\n\n        switch (style)\n        {\n        case Tag:\n        case Important:\n        case MediaRule:\n            f.setBold(true);\n            break;\n\n        case IDSelector:\n            f.setItalic(true);\n            break;\n        }\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerCSS::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"color background-color background-image \"\n            \"background-repeat background-attachment \"\n            \"background-position background font-family \"\n            \"font-style font-variant font-weight font-size font \"\n            \"word-spacing letter-spacing text-decoration \"\n            \"vertical-align text-transform text-align \"\n            \"text-indent line-height margin-top margin-right \"\n            \"margin-bottom margin-left margin padding-top \"\n            \"padding-right padding-bottom padding-left padding \"\n            \"border-top-width border-right-width \"\n            \"border-bottom-width border-left-width border-width \"\n            \"border-top border-right border-bottom border-left \"\n            \"border border-color border-style width height float \"\n            \"clear display white-space list-style-type \"\n            \"list-style-image list-style-position list-style\";\n\n    if (set == 2)\n        return\n            \"first-letter first-line link active visited \"\n            \"first-child focus hover lang before after left \"\n            \"right first\";\n\n    if (set == 3)\n        return\n            \"border-top-color border-right-color \"\n            \"border-bottom-color border-left-color border-color \"\n            \"border-top-style border-right-style \"\n            \"border-bottom-style border-left-style border-style \"\n            \"top right bottom left position z-index direction \"\n            \"unicode-bidi min-width max-width min-height \"\n            \"max-height overflow clip visibility content quotes \"\n            \"counter-reset counter-increment marker-offset size \"\n            \"marks page-break-before page-break-after \"\n            \"page-break-inside page orphans widows font-stretch \"\n            \"font-size-adjust unicode-range units-per-em src \"\n            \"panose-1 stemv stemh slope cap-height x-height \"\n            \"ascent descent widths bbox definition-src baseline \"\n            \"centerline mathline topline text-shadow \"\n            \"caption-side table-layout border-collapse \"\n            \"border-spacing empty-cells speak-header cursor \"\n            \"outline outline-width outline-style outline-color \"\n            \"volume speak pause-before pause-after pause \"\n            \"cue-before cue-after cue play-during azimuth \"\n            \"elevation speech-rate voice-family pitch \"\n            \"pitch-range stress richness speak-punctuation \"\n            \"speak-numeral\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerCSS::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Tag:\n        return tr(\"Tag\");\n\n    case ClassSelector:\n        return tr(\"Class selector\");\n\n    case PseudoClass:\n        return tr(\"Pseudo-class\");\n\n    case UnknownPseudoClass:\n        return tr(\"Unknown pseudo-class\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case CSS1Property:\n        return tr(\"CSS1 property\");\n\n    case UnknownProperty:\n        return tr(\"Unknown property\");\n\n    case Value:\n        return tr(\"Value\");\n\n    case IDSelector:\n        return tr(\"ID selector\");\n\n    case Important:\n        return tr(\"Important\");\n\n    case AtRule:\n        return tr(\"@-rule\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case CSS2Property:\n        return tr(\"CSS2 property\");\n\n    case Attribute:\n        return tr(\"Attribute\");\n\n    case CSS3Property:\n        return tr(\"CSS3 property\");\n\n    case PseudoElement:\n        return tr(\"Pseudo-element\");\n\n    case ExtendedCSSProperty:\n        return tr(\"Extended CSS property\");\n\n    case ExtendedPseudoClass:\n        return tr(\"Extended pseudo-class\");\n\n    case ExtendedPseudoElement:\n        return tr(\"Extended pseudo-element\");\n\n    case MediaRule:\n        return tr(\"Media rule\");\n\n    case Variable:\n        return tr(\"Variable\");\n    }\n\n    return QString();\n}\n\n\n// Refresh all properties.\nvoid QsciLexerCSS::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n    setHSSProp();\n    setLessProp();\n    setSCSSProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerCSS::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"hsslanguage\", false, &ok);\n\n    if (ok)\n        hss_language = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"lesslanguage\", false, &ok);\n\n    if (ok)\n        less_language = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"scsslanguage\", false, &ok);\n\n    if (ok)\n        scss_language = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerCSS::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"hsslanguage\", hss_language))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"lesslanguage\", less_language))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"scsslanguage\", scss_language))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerCSS::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerCSS::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerCSS::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerCSS::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerCSS::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerCSS::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Set if HSS is supported.\nvoid QsciLexerCSS::setHSSLanguage(bool enabled)\n{\n    hss_language = enabled;\n\n    setHSSProp();\n}\n\n\n// Set the \"lexer.css.hss.language\" property.\nvoid QsciLexerCSS::setHSSProp()\n{\n    emit propertyChanged(\"lexer.css.hss.language\",(hss_language ? \"1\" : \"0\"));\n}\n\n\n// Set if Less CSS is supported.\nvoid QsciLexerCSS::setLessLanguage(bool enabled)\n{\n    less_language = enabled;\n\n    setLessProp();\n}\n\n\n// Set the \"lexer.css.less.language\" property.\nvoid QsciLexerCSS::setLessProp()\n{\n    emit propertyChanged(\"lexer.css.less.language\",(less_language ? \"1\" : \"0\"));\n}\n\n\n// Set if Sassy CSS is supported.\nvoid QsciLexerCSS::setSCSSLanguage(bool enabled)\n{\n    scss_language = enabled;\n\n    setSCSSProp();\n}\n\n\n// Set the \"lexer.css.scss.language\" property.\nvoid QsciLexerCSS::setSCSSProp()\n{\n    emit propertyChanged(\"lexer.css.scss.language\",(scss_language ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexercustom.cpp",
    "content": "// This module implements the QsciLexerCustom class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexercustom.h\"\n\n#include \"Qsci/qsciscintilla.h\"\n#include \"Qsci/qsciscintillabase.h\"\n#include \"Qsci/qscistyle.h\"\n\n\n// The ctor.\nQsciLexerCustom::QsciLexerCustom(QObject *parent, const char *name)\n    : QsciLexer(parent, name)\n{\n}\n\n\n// The dtor.\nQsciLexerCustom::~QsciLexerCustom()\n{\n}\n\n\n// Start styling.\nvoid QsciLexerCustom::startStyling(int start, int styleBits)\n{\n    if (!editor())\n        return;\n\n    if (styleBits == 0)\n        styleBits = (1 << styleBitsNeeded()) - 1;\n\n    editor()->SendScintilla(QsciScintillaBase::SCI_STARTSTYLING, start,\n            styleBits);\n}\n\n\n// Set the style for a number of characters.\nvoid QsciLexerCustom::setStyling(int length, int style)\n{\n    if (!editor())\n        return;\n\n    editor()->SendScintilla(QsciScintillaBase::SCI_SETSTYLING, length, style);\n}\n\n\n// Set the style for a number of characters.\nvoid QsciLexerCustom::setStyling(int length, const QsciStyle &style)\n{\n    setStyling(length, style.style());\n}\n\n\n// Set the attached editor.\nvoid QsciLexerCustom::setEditor(QsciScintilla *new_editor)\n{\n    if (editor())\n        disconnect(editor(), SIGNAL(SCN_STYLENEEDED(int)), this,\n                SLOT(handleStyleNeeded(int)));\n\n    QsciLexer::setEditor(new_editor);\n\n    if (editor())\n        connect(editor(), SIGNAL(SCN_STYLENEEDED(int)), this,\n                SLOT(handleStyleNeeded(int)));\n}\n\n\n// Return the number of style bits needed by the lexer.\nint QsciLexerCustom::styleBitsNeeded() const\n{\n    return 5;\n}\n\n\n// Handle a request to style some text.\nvoid QsciLexerCustom::handleStyleNeeded(int pos)\n{\n    int start = editor()->SendScintilla(QsciScintillaBase::SCI_GETENDSTYLED);\n    int line = editor()->SendScintilla(QsciScintillaBase::SCI_LINEFROMPOSITION,\n            start);\n    start = editor()->SendScintilla(QsciScintillaBase::SCI_POSITIONFROMLINE,\n            line);\n\n    if (start != pos)\n        styleText(start, pos);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerd.cpp",
    "content": "// This module implements the QsciLexerD class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerd.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerD::QsciLexerD(QObject *parent, const char *name)\n    : QsciLexer(parent, name),\n      fold_atelse(false), fold_comments(false), fold_compact(true)\n{\n}\n\n\n// The dtor.\nQsciLexerD::~QsciLexerD()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerD::language() const\n{\n    return \"D\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerD::lexer() const\n{\n    return \"d\";\n}\n\n\n// Return the set of character sequences that can separate auto-completion\n// words.\nQStringList QsciLexerD::autoCompletionWordSeparators() const\n{\n    QStringList wl;\n\n    wl << \".\";\n\n    return wl;\n}\n\n\n// Return the list of keywords that can start a block.\nconst char *QsciLexerD::blockStartKeyword(int *style) const\n{\n    if (style)\n        *style = Keyword;\n\n    return \"case catch class default do else finally for foreach \"\n           \"foreach_reverse if private protected public struct try union \"\n           \"while\";\n}\n\n\n// Return the list of characters that can start a block.\nconst char *QsciLexerD::blockStart(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"{\";\n}\n\n\n// Return the list of characters that can end a block.\nconst char *QsciLexerD::blockEnd(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"}\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerD::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerD::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_#\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerD::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Comment:\n    case CommentLine:\n        return QColor(0x00,0x7f,0x00);\n\n    case CommentDoc:\n    case CommentLineDoc:\n        return QColor(0x3f,0x70,0x3f);\n\n    case CommentNested:\n        return QColor(0xa0,0xc0,0xa0);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n    case KeywordSecondary:\n    case KeywordDoc:\n    case Typedefs:\n        return QColor(0x00,0x00,0x7f);\n\n    case String:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Character:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Operator:\n    case UnclosedString:\n        return QColor(0x00,0x00,0x00);\n\n    case Identifier:\n        break;\n\n    case CommentDocKeyword:\n        return QColor(0x30,0x60,0xa0);\n\n    case CommentDocKeywordError:\n        return QColor(0x80,0x40,0x20);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerD::defaultEolFill(int style) const\n{\n    if (style == UnclosedString)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerD::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case CommentLine:\n    case CommentDoc:\n    case CommentNested:\n    case CommentLineDoc:\n    case CommentDocKeyword:\n    case CommentDocKeywordError:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case KeywordSecondary:\n    case KeywordDoc:\n    case Typedefs:\n    case Operator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case String:\n    case UnclosedString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerD::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"abstract alias align asm assert auto body bool break byte case \"\n            \"cast catch cdouble cent cfloat char class const continue creal \"\n            \"dchar debug default delegate delete deprecated do double else \"\n            \"enum export extern false final finally float for foreach \"\n            \"foreach_reverse function goto idouble if ifloat import in inout \"\n            \"int interface invariant ireal is lazy long mixin module new null \"\n            \"out override package pragma private protected public real return \"\n            \"scope short static struct super switch synchronized template \"\n            \"this throw true try typedef typeid typeof ubyte ucent uint ulong \"\n            \"union unittest ushort version void volatile wchar while with\";\n\n    if (set == 3)\n        return\n            \"a addindex addtogroup anchor arg attention author b brief bug c \"\n            \"class code date def defgroup deprecated dontinclude e em endcode \"\n            \"endhtmlonly endif endlatexonly endlink endverbatim enum example \"\n            \"exception f$ f[ f] file fn hideinitializer htmlinclude htmlonly \"\n            \"if image include ingroup internal invariant interface latexonly \"\n            \"li line link mainpage name namespace nosubgrouping note overload \"\n            \"p page par param post pre ref relates remarks return retval sa \"\n            \"section see showinitializer since skip skipline struct \"\n            \"subsection test throw todo typedef union until var verbatim \"\n            \"verbinclude version warning weakgroup $ @ \\\\ & < > # { }\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerD::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Block comment\");\n\n    case CommentLine:\n        return tr(\"Line comment\");\n\n    case CommentDoc:\n        return tr(\"DDoc style block comment\");\n\n    case CommentNested:\n        return tr(\"Nesting comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case KeywordSecondary:\n        return tr(\"Secondary keyword\");\n\n    case KeywordDoc:\n        return tr(\"Documentation keyword\");\n\n    case Typedefs:\n        return tr(\"Type definition\");\n\n    case String:\n        return tr(\"String\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case Character:\n        return tr(\"Character\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case CommentLineDoc:\n        return tr(\"DDoc style line comment\");\n\n    case CommentDocKeyword:\n        return tr(\"DDoc keyword\");\n\n    case CommentDocKeywordError:\n        return tr(\"DDoc keyword error\");\n\n    case BackquoteString:\n        return tr(\"Backquoted string\");\n\n    case RawString:\n        return tr(\"Raw string\");\n\n    case KeywordSet5:\n        return tr(\"User defined 1\");\n\n    case KeywordSet6:\n        return tr(\"User defined 2\");\n\n    case KeywordSet7:\n        return tr(\"User defined 3\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerD::defaultPaper(int style) const\n{\n    if (style == UnclosedString)\n        return QColor(0xe0,0xc0,0xe0);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerD::refreshProperties()\n{\n    setAtElseProp();\n    setCommentProp();\n    setCompactProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerD::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldatelse\", false, &ok);\n\n    if (ok)\n        fold_atelse = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerD::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldatelse\", fold_atelse))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return true if else can be folded.\nbool QsciLexerD::foldAtElse() const\n{\n    return fold_atelse;\n}\n\n\n// Set if else can be folded.\nvoid QsciLexerD::setFoldAtElse(bool fold)\n{\n    fold_atelse = fold;\n\n    setAtElseProp();\n}\n\n\n// Set the \"fold.at.else\" property.\nvoid QsciLexerD::setAtElseProp()\n{\n    emit propertyChanged(\"fold.at.else\",(fold_atelse ? \"1\" : \"0\"));\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerD::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerD::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerD::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerD::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerD::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerD::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerdiff.cpp",
    "content": "// This module implements the QsciLexerDiff class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerdiff.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerDiff::QsciLexerDiff(QObject *parent, const char *name)\n    : QsciLexer(parent, name)\n{\n}\n\n\n// The dtor.\nQsciLexerDiff::~QsciLexerDiff()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerDiff::language() const\n{\n    return \"Diff\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerDiff::lexer() const\n{\n    return \"diff\";\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerDiff::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerDiff::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x00,0x00,0x00);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case Command:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Header:\n        return QColor(0x7f,0x00,0x00);\n\n    case Position:\n        return QColor(0x7f,0x00,0x7f);\n\n    case LineRemoved:\n        return QColor(0x00,0x7f,0x7f);\n\n    case LineAdded:\n        return QColor(0x00,0x00,0x7f);\n\n    case LineChanged:\n        return QColor(0x7f,0x7f,0x7f);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerDiff::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Command:\n        return tr(\"Command\");\n\n    case Header:\n        return tr(\"Header\");\n\n    case Position:\n        return tr(\"Position\");\n\n    case LineRemoved:\n        return tr(\"Removed line\");\n\n    case LineAdded:\n        return tr(\"Added line\");\n\n    case LineChanged:\n        return tr(\"Changed line\");\n    }\n\n    return QString();\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerfortran.cpp",
    "content": "// This module implements the QsciLexerFortran class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerfortran.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerFortran::QsciLexerFortran(QObject *parent, const char *name)\n    : QsciLexerFortran77(parent, name)\n{\n}\n\n\n// The dtor.\nQsciLexerFortran::~QsciLexerFortran()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerFortran::language() const\n{\n    return \"Fortran\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerFortran::lexer() const\n{\n    return \"fortran\";\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerFortran::keywords(int set) const\n{\n    if (set == 2)\n        return\n            \"abs achar acos acosd adjustl adjustr aimag aimax0 aimin0 aint \"\n            \"ajmax0 ajmin0 akmax0 akmin0 all allocated alog alog10 amax0 \"\n            \"amax1 amin0 amin1 amod anint any asin asind associated atan \"\n            \"atan2 atan2d atand bitest bitl bitlr bitrl bjtest bit_size \"\n            \"bktest break btest cabs ccos cdabs cdcos cdexp cdlog cdsin \"\n            \"cdsqrt ceiling cexp char clog cmplx conjg cos cosd cosh count \"\n            \"cpu_time cshift csin csqrt dabs dacos dacosd dasin dasind datan \"\n            \"datan2 datan2d datand date date_and_time dble dcmplx dconjg dcos \"\n            \"dcosd dcosh dcotan ddim dexp dfloat dflotk dfloti dflotj digits \"\n            \"dim dimag dint dlog dlog10 dmax1 dmin1 dmod dnint dot_product \"\n            \"dprod dreal dsign dsin dsind dsinh dsqrt dtan dtand dtanh \"\n            \"eoshift epsilon errsns exp exponent float floati floatj floatk \"\n            \"floor fraction free huge iabs iachar iand ibclr ibits ibset \"\n            \"ichar idate idim idint idnint ieor ifix iiabs iiand iibclr \"\n            \"iibits iibset iidim iidint iidnnt iieor iifix iint iior iiqint \"\n            \"iiqnnt iishft iishftc iisign ilen imax0 imax1 imin0 imin1 imod \"\n            \"index inint inot int int1 int2 int4 int8 iqint iqnint ior ishft \"\n            \"ishftc isign isnan izext jiand jibclr jibits jibset jidim jidint \"\n            \"jidnnt jieor jifix jint jior jiqint jiqnnt jishft jishftc jisign \"\n            \"jmax0 jmax1 jmin0 jmin1 jmod jnint jnot jzext kiabs kiand kibclr \"\n            \"kibits kibset kidim kidint kidnnt kieor kifix kind kint kior \"\n            \"kishft kishftc kisign kmax0 kmax1 kmin0 kmin1 kmod knint knot \"\n            \"kzext lbound leadz len len_trim lenlge lge lgt lle llt log log10 \"\n            \"logical lshift malloc matmul max max0 max1 maxexponent maxloc \"\n            \"maxval merge min min0 min1 minexponent minloc minval mod modulo \"\n            \"mvbits nearest nint not nworkers number_of_processors pack \"\n            \"popcnt poppar precision present product radix random \"\n            \"random_number random_seed range real repeat reshape rrspacing \"\n            \"rshift scale scan secnds selected_int_kind selected_real_kind \"\n            \"set_exponent shape sign sin sind sinh size sizeof sngl snglq \"\n            \"spacing spread sqrt sum system_clock tan tand tanh tiny transfer \"\n            \"transpose trim ubound unpack verify\";\n\n    if (set == 3)\n        return\n            \"cdabs cdcos cdexp cdlog cdsin cdsqrt cotan cotand dcmplx dconjg \"\n            \"dcotan dcotand decode dimag dll_export dll_import doublecomplex \"\n            \"dreal dvchk encode find flen flush getarg getcharqq getcl getdat \"\n            \"getenv gettim hfix ibchng identifier imag int1 int2 int4 intc \"\n            \"intrup invalop iostat_msg isha ishc ishl jfix lacfar locking \"\n            \"locnear map nargs nbreak ndperr ndpexc offset ovefl peekcharqq \"\n            \"precfill prompt qabs qacos qacosd qasin qasind qatan qatand \"\n            \"qatan2 qcmplx qconjg qcos qcosd qcosh qdim qexp qext qextd \"\n            \"qfloat qimag qlog qlog10 qmax1 qmin1 qmod qreal qsign qsin qsind \"\n            \"qsinh qsqrt qtan qtand qtanh ran rand randu rewrite segment \"\n            \"setdat settim system timer undfl unlock union val virtual \"\n            \"volatile zabs zcos zexp zlog zsin zsqrt\";\n\n    return QsciLexerFortran77::keywords(set);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerfortran77.cpp",
    "content": "// This module implements the QsciLexerFortran77 class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerfortran77.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerFortran77::QsciLexerFortran77(QObject *parent, const char *name)\n    : QsciLexer(parent, name),\n      fold_compact(true)\n{\n}\n\n\n// The dtor.\nQsciLexerFortran77::~QsciLexerFortran77()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerFortran77::language() const\n{\n    return \"Fortran77\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerFortran77::lexer() const\n{\n    return \"f77\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerFortran77::braceStyle() const\n{\n    return Default;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerFortran77::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case SingleQuotedString:\n    case DoubleQuotedString:\n        return QColor(0x7f,0x00,0x7f);\n\n    case UnclosedString:\n    case Operator:\n    case DottedOperator:\n    case Continuation:\n        return QColor(0x00,0x00,0x00);\n\n    case Identifier:\n        break;\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case IntrinsicFunction:\n        return QColor(0xb0,0x00,0x40);\n\n    case ExtendedFunction:\n        return QColor(0xb0,0x40,0x80);\n\n    case PreProcessor:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Label:\n        return QColor(0xe0,0xc0,0xe0);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerFortran77::defaultEolFill(int style) const\n{\n    if (style == UnclosedString)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerFortran77::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Operator:\n    case DottedOperator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerFortran77::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"access action advance allocatable allocate apostrophe assign \"\n            \"assignment associate asynchronous backspace bind blank blockdata \"\n            \"call case character class close common complex contains continue \"\n            \"cycle data deallocate decimal delim default dimension direct do \"\n            \"dowhile double doubleprecision else elseif elsewhere encoding \"\n            \"end endassociate endblockdata enddo endfile endforall \"\n            \"endfunction endif endinterface endmodule endprogram endselect \"\n            \"endsubroutine endtype endwhere entry eor equivalence err errmsg \"\n            \"exist exit external file flush fmt forall form format formatted \"\n            \"function go goto id if implicit in include inout integer inquire \"\n            \"intent interface intrinsic iomsg iolength iostat kind len \"\n            \"logical module name named namelist nextrec nml none nullify \"\n            \"number only open opened operator optional out pad parameter pass \"\n            \"pause pending pointer pos position precision print private \"\n            \"program protected public quote read readwrite real rec recl \"\n            \"recursive result return rewind save select selectcase selecttype \"\n            \"sequential sign size stat status stop stream subroutine target \"\n            \"then to type unformatted unit use value volatile wait where \"\n            \"while write\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerFortran77::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case IntrinsicFunction:\n        return tr(\"Intrinsic function\");\n\n    case ExtendedFunction:\n        return tr(\"Extended function\");\n\n    case PreProcessor:\n        return tr(\"Pre-processor block\");\n\n    case DottedOperator:\n        return tr(\"Dotted operator\");\n\n    case Label:\n        return tr(\"Label\");\n\n    case Continuation:\n        return tr(\"Continuation\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerFortran77::defaultPaper(int style) const\n{\n    if (style == UnclosedString)\n        return QColor(0xe0,0xc0,0xe0);\n\n    if (style == Continuation)\n        return QColor(0xf0,0xe0,0x80);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerFortran77::refreshProperties()\n{\n    setCompactProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerFortran77::readProperties(QSettings &qs, const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerFortran77::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerFortran77::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerFortran77::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerFortran77::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerhtml.cpp",
    "content": "// This module implements the QsciLexerHTML class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerhtml.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n#include \"Qsci/qscilexerjavascript.h\"\n#include \"Qsci/qscilexerpython.h\"\n\n\n// The ctor.\nQsciLexerHTML::QsciLexerHTML(QObject *parent, const char *name)\n    : QsciLexer(parent, name),\n      fold_compact(true), fold_preproc(true), case_sens_tags(false),\n      fold_script_comments(false), fold_script_heredocs(false),\n      django_templates(false), mako_templates(false)\n{\n}\n\n\n// The dtor.\nQsciLexerHTML::~QsciLexerHTML()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerHTML::language() const\n{\n    return \"HTML\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerHTML::lexer() const\n{\n    return \"hypertext\";\n}\n\n\n// Return the auto-completion fillup characters.\nconst char *QsciLexerHTML::autoCompletionFillups() const\n{\n    return \"/>\";\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerHTML::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerHTML::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n    case JavaScriptDefault:\n    case JavaScriptWord:\n    case JavaScriptSymbol:\n    case ASPJavaScriptDefault:\n    case ASPJavaScriptWord:\n    case ASPJavaScriptSymbol:\n    case VBScriptDefault:\n    case ASPVBScriptDefault:\n    case PHPOperator:\n        return QColor(0x00,0x00,0x00);\n\n    case Tag:\n    case XMLTagEnd:\n    case Script:\n    case SGMLDefault:\n    case SGMLCommand:\n    case VBScriptKeyword:\n    case VBScriptIdentifier:\n    case VBScriptUnclosedString:\n    case ASPVBScriptKeyword:\n    case ASPVBScriptIdentifier:\n    case ASPVBScriptUnclosedString:\n        return QColor(0x00,0x00,0x80);\n\n    case UnknownTag:\n    case UnknownAttribute:\n        return QColor(0xff,0x00,0x00);\n\n    case Attribute:\n    case VBScriptNumber:\n    case ASPVBScriptNumber:\n        return QColor(0x00,0x80,0x80);\n\n    case HTMLNumber:\n    case JavaScriptNumber:\n    case ASPJavaScriptNumber:\n    case PythonNumber:\n    case PythonFunctionMethodName:\n    case ASPPythonNumber:\n    case ASPPythonFunctionMethodName:\n        return QColor(0x00,0x7f,0x7f);\n\n    case HTMLDoubleQuotedString:\n    case HTMLSingleQuotedString:\n    case JavaScriptDoubleQuotedString:\n    case JavaScriptSingleQuotedString:\n    case ASPJavaScriptDoubleQuotedString:\n    case ASPJavaScriptSingleQuotedString:\n    case PythonDoubleQuotedString:\n    case PythonSingleQuotedString:\n    case ASPPythonDoubleQuotedString:\n    case ASPPythonSingleQuotedString:\n    case PHPKeyword:\n        return QColor(0x7f,0x00,0x7f);\n\n    case OtherInTag:\n    case Entity:\n    case VBScriptString:\n    case ASPVBScriptString:\n        return QColor(0x80,0x00,0x80);\n\n    case HTMLComment:\n    case SGMLComment:\n        return QColor(0x80,0x80,0x00);\n\n    case XMLStart:\n    case XMLEnd:\n    case PHPStart:\n    case PythonClassName:\n    case ASPPythonClassName:\n        return QColor(0x00,0x00,0xff);\n\n    case HTMLValue:\n        return QColor(0xff,0x00,0xff);\n\n    case SGMLParameter:\n        return QColor(0x00,0x66,0x00);\n\n    case SGMLDoubleQuotedString:\n    case SGMLError:\n        return QColor(0x80,0x00,0x00);\n\n    case SGMLSingleQuotedString:\n        return QColor(0x99,0x33,0x00);\n\n    case SGMLSpecial:\n        return QColor(0x33,0x66,0xff);\n\n    case SGMLEntity:\n        return QColor(0x33,0x33,0x33);\n\n    case SGMLBlockDefault:\n        return QColor(0x00,0x00,0x66);\n\n    case JavaScriptStart:\n    case ASPJavaScriptStart:\n        return QColor(0x7f,0x7f,0x00);\n\n    case JavaScriptComment:\n    case JavaScriptCommentLine:\n    case ASPJavaScriptComment:\n    case ASPJavaScriptCommentLine:\n    case PythonComment:\n    case ASPPythonComment:\n    case PHPDoubleQuotedString:\n        return QColor(0x00,0x7f,0x00);\n\n    case JavaScriptCommentDoc:\n        return QColor(0x3f,0x70,0x3f);\n\n    case JavaScriptKeyword:\n    case ASPJavaScriptKeyword:\n    case PythonKeyword:\n    case ASPPythonKeyword:\n    case PHPVariable:\n    case PHPDoubleQuotedVariable:\n        return QColor(0x00,0x00,0x7f);\n\n    case ASPJavaScriptCommentDoc:\n        return QColor(0x7f,0x7f,0x7f);\n\n    case VBScriptComment:\n    case ASPVBScriptComment:\n        return QColor(0x00,0x80,0x00);\n\n    case PythonStart:\n    case PythonDefault:\n    case ASPPythonStart:\n    case ASPPythonDefault:\n        return QColor(0x80,0x80,0x80);\n\n    case PythonTripleSingleQuotedString:\n    case PythonTripleDoubleQuotedString:\n    case ASPPythonTripleSingleQuotedString:\n    case ASPPythonTripleDoubleQuotedString:\n        return QColor(0x7f,0x00,0x00);\n\n    case PHPDefault:\n        return QColor(0x00,0x00,0x33);\n\n    case PHPSingleQuotedString:\n        return QColor(0x00,0x9f,0x00);\n\n    case PHPNumber:\n        return QColor(0xcc,0x99,0x00);\n\n    case PHPComment:\n        return QColor(0x99,0x99,0x99);\n\n    case PHPCommentLine:\n        return QColor(0x66,0x66,0x66);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerHTML::defaultEolFill(int style) const\n{\n    switch (style)\n    {\n    case JavaScriptDefault:\n    case JavaScriptComment:\n    case JavaScriptCommentDoc:\n    case JavaScriptUnclosedString:\n    case ASPJavaScriptDefault:\n    case ASPJavaScriptComment:\n    case ASPJavaScriptCommentDoc:\n    case ASPJavaScriptUnclosedString:\n    case VBScriptDefault:\n    case VBScriptComment:\n    case VBScriptNumber:\n    case VBScriptKeyword:\n    case VBScriptString:\n    case VBScriptIdentifier:\n    case VBScriptUnclosedString:\n    case ASPVBScriptDefault:\n    case ASPVBScriptComment:\n    case ASPVBScriptNumber:\n    case ASPVBScriptKeyword:\n    case ASPVBScriptString:\n    case ASPVBScriptIdentifier:\n    case ASPVBScriptUnclosedString:\n    case PythonDefault:\n    case PythonComment:\n    case PythonNumber:\n    case PythonDoubleQuotedString:\n    case PythonSingleQuotedString:\n    case PythonKeyword:\n    case PythonTripleSingleQuotedString:\n    case PythonTripleDoubleQuotedString:\n    case PythonClassName:\n    case PythonFunctionMethodName:\n    case PythonOperator:\n    case PythonIdentifier:\n    case ASPPythonDefault:\n    case ASPPythonComment:\n    case ASPPythonNumber:\n    case ASPPythonDoubleQuotedString:\n    case ASPPythonSingleQuotedString:\n    case ASPPythonKeyword:\n    case ASPPythonTripleSingleQuotedString:\n    case ASPPythonTripleDoubleQuotedString:\n    case ASPPythonClassName:\n    case ASPPythonFunctionMethodName:\n    case ASPPythonOperator:\n    case ASPPythonIdentifier:\n    case PHPDefault:\n        return true;\n    }\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerHTML::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Default:\n    case Entity:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Times New Roman\",11);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Times New Roman\", 12);\n#else\n        f = QFont(\"Bitstream Charter\",10);\n#endif\n        break;\n\n    case HTMLComment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Verdana\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Verdana\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans\",8);\n#endif\n        break;\n\n    case SGMLCommand:\n    case PythonKeyword:\n    case PythonClassName:\n    case PythonFunctionMethodName:\n    case PythonOperator:\n    case ASPPythonKeyword:\n    case ASPPythonClassName:\n    case ASPPythonFunctionMethodName:\n    case ASPPythonOperator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case JavaScriptDefault:\n    case JavaScriptCommentDoc:\n    case JavaScriptKeyword:\n    case JavaScriptSymbol:\n    case ASPJavaScriptDefault:\n    case ASPJavaScriptCommentDoc:\n    case ASPJavaScriptKeyword:\n    case ASPJavaScriptSymbol:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        f.setBold(true);\n        break;\n\n    case JavaScriptComment:\n    case JavaScriptCommentLine:\n    case JavaScriptNumber:\n    case JavaScriptWord:\n    case JavaScriptDoubleQuotedString:\n    case JavaScriptSingleQuotedString:\n    case ASPJavaScriptComment:\n    case ASPJavaScriptCommentLine:\n    case ASPJavaScriptNumber:\n    case ASPJavaScriptWord:\n    case ASPJavaScriptDoubleQuotedString:\n    case ASPJavaScriptSingleQuotedString:\n    case VBScriptComment:\n    case ASPVBScriptComment:\n    case PythonComment:\n    case ASPPythonComment:\n    case PHPComment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case VBScriptDefault:\n    case VBScriptNumber:\n    case VBScriptString:\n    case VBScriptIdentifier:\n    case VBScriptUnclosedString:\n    case ASPVBScriptDefault:\n    case ASPVBScriptNumber:\n    case ASPVBScriptString:\n    case ASPVBScriptIdentifier:\n    case ASPVBScriptUnclosedString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Lucida Sans Unicode\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Lucida Grande\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case VBScriptKeyword:\n    case ASPVBScriptKeyword:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Lucida Sans Unicode\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Lucida Grande\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        f.setBold(true);\n        break;\n\n    case PythonDoubleQuotedString:\n    case PythonSingleQuotedString:\n    case ASPPythonDoubleQuotedString:\n    case ASPPythonSingleQuotedString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier New\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    case PHPKeyword:\n    case PHPVariable:\n    case PHPDoubleQuotedVariable:\n        f = QsciLexer::defaultFont(style);\n        f.setItalic(true);\n        break;\n\n    case PHPCommentLine:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        f.setItalic(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerHTML::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"a abbr acronym address applet area \"\n            \"b base basefont bdo big blockquote body br button \"\n            \"caption center cite code col colgroup \"\n            \"dd del dfn dir div dl dt \"\n            \"em \"\n            \"fieldset font form frame frameset \"\n            \"h1 h2 h3 h4 h5 h6 head hr html \"\n            \"i iframe img input ins isindex \"\n            \"kbd \"\n            \"label legend li link \"\n            \"map menu meta \"\n            \"noframes noscript \"\n            \"object ol optgroup option \"\n            \"p param pre \"\n            \"q \"\n            \"s samp script select small span strike strong style \"\n            \"sub sup \"\n            \"table tbody td textarea tfoot th thead title tr tt \"\n            \"u ul \"\n            \"var \"\n            \"xml xmlns \"\n            \"abbr accept-charset accept accesskey action align \"\n            \"alink alt archive axis \"\n            \"background bgcolor border \"\n            \"cellpadding cellspacing char charoff charset checked \"\n            \"cite class classid clear codebase codetype color \"\n            \"cols colspan compact content coords \"\n            \"data datafld dataformatas datapagesize datasrc \"\n            \"datetime declare defer dir disabled \"\n            \"enctype event \"\n            \"face for frame frameborder \"\n            \"headers height href hreflang hspace http-equiv \"\n            \"id ismap label lang language leftmargin link \"\n            \"longdesc \"\n            \"marginwidth marginheight maxlength media method \"\n            \"multiple \"\n            \"name nohref noresize noshade nowrap \"\n            \"object onblur onchange onclick ondblclick onfocus \"\n            \"onkeydown onkeypress onkeyup onload onmousedown \"\n            \"onmousemove onmouseover onmouseout onmouseup onreset \"\n            \"onselect onsubmit onunload \"\n            \"profile prompt \"\n            \"readonly rel rev rows rowspan rules \"\n            \"scheme scope selected shape size span src standby \"\n            \"start style summary \"\n            \"tabindex target text title topmargin type \"\n            \"usemap \"\n            \"valign value valuetype version vlink vspace \"\n            \"width \"\n            \"text password checkbox radio submit reset file \"\n            \"hidden image \"\n            \"public !doctype\";\n\n    if (set == 2)\n        return QsciLexerJavaScript::keywordClass;\n\n    if (set == 3)\n        return\n            // Move these to QsciLexerVisualBasic when we\n            // get round to implementing it.\n            \"and begin case call continue do each else elseif end \"\n            \"erase error event exit false for function get gosub \"\n            \"goto if implement in load loop lset me mid new next \"\n            \"not nothing on or property raiseevent rem resume \"\n            \"return rset select set stop sub then to true unload \"\n            \"until wend while with withevents attribute alias as \"\n            \"boolean byref byte byval const compare currency date \"\n            \"declare dim double enum explicit friend global \"\n            \"integer let lib long module object option optional \"\n            \"preserve private property public redim single static \"\n            \"string type variant\";\n\n    if (set == 4)\n        return QsciLexerPython::keywordClass;\n\n    if (set == 5)\n        return\n            \"and argv as argc break case cfunction class continue \"\n            \"declare default do die \"\n            \"echo else elseif empty enddeclare endfor endforeach \"\n            \"endif endswitch endwhile e_all e_parse e_error \"\n            \"e_warning eval exit extends \"\n            \"false for foreach function global \"\n            \"http_cookie_vars http_get_vars http_post_vars \"\n            \"http_post_files http_env_vars http_server_vars \"\n            \"if include include_once list new not null \"\n            \"old_function or \"\n            \"parent php_os php_self php_version print \"\n            \"require require_once return \"\n            \"static switch stdclass this true var xor virtual \"\n            \"while \"\n            \"__file__ __line__ __sleep __wakeup\";\n\n    if (set == 6)\n        return \"ELEMENT DOCTYPE ATTLIST ENTITY NOTATION\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerHTML::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"HTML default\");\n\n    case Tag:\n        return tr(\"Tag\");\n\n    case UnknownTag:\n        return tr(\"Unknown tag\");\n\n    case Attribute:\n        return tr(\"Attribute\");\n\n    case UnknownAttribute:\n        return tr(\"Unknown attribute\");\n\n    case HTMLNumber:\n        return tr(\"HTML number\");\n\n    case HTMLDoubleQuotedString:\n        return tr(\"HTML double-quoted string\");\n\n    case HTMLSingleQuotedString:\n        return tr(\"HTML single-quoted string\");\n\n    case OtherInTag:\n        return tr(\"Other text in a tag\");\n\n    case HTMLComment:\n        return tr(\"HTML comment\");\n\n    case Entity:\n        return tr(\"Entity\");\n\n    case XMLTagEnd:\n        return tr(\"End of a tag\");\n\n    case XMLStart:\n        return tr(\"Start of an XML fragment\");\n\n    case XMLEnd:\n        return tr(\"End of an XML fragment\");\n\n    case Script:\n        return tr(\"Script tag\");\n\n    case ASPAtStart:\n        return tr(\"Start of an ASP fragment with @\");\n\n    case ASPStart:\n        return tr(\"Start of an ASP fragment\");\n\n    case CDATA:\n        return tr(\"CDATA\");\n\n    case PHPStart:\n        return tr(\"Start of a PHP fragment\");\n\n    case HTMLValue:\n        return tr(\"Unquoted HTML value\");\n\n    case ASPXCComment:\n        return tr(\"ASP X-Code comment\");\n\n    case SGMLDefault:\n        return tr(\"SGML default\");\n\n    case SGMLCommand:\n        return tr(\"SGML command\");\n\n    case SGMLParameter:\n        return tr(\"First parameter of an SGML command\");\n\n    case SGMLDoubleQuotedString:\n        return tr(\"SGML double-quoted string\");\n\n    case SGMLSingleQuotedString:\n        return tr(\"SGML single-quoted string\");\n\n    case SGMLError:\n        return tr(\"SGML error\");\n\n    case SGMLSpecial:\n        return tr(\"SGML special entity\");\n\n    case SGMLComment:\n        return tr(\"SGML comment\");\n\n    case SGMLParameterComment:\n        return tr(\"First parameter comment of an SGML command\");\n\n    case SGMLBlockDefault:\n        return tr(\"SGML block default\");\n\n    case JavaScriptStart:\n        return tr(\"Start of a JavaScript fragment\");\n\n    case JavaScriptDefault:\n        return tr(\"JavaScript default\");\n\n    case JavaScriptComment:\n        return tr(\"JavaScript comment\");\n\n    case JavaScriptCommentLine:\n        return tr(\"JavaScript line comment\");\n\n    case JavaScriptCommentDoc:\n        return tr(\"JavaDoc style JavaScript comment\");\n\n    case JavaScriptNumber:\n        return tr(\"JavaScript number\");\n\n    case JavaScriptWord:\n        return tr(\"JavaScript word\");\n\n    case JavaScriptKeyword:\n        return tr(\"JavaScript keyword\");\n\n    case JavaScriptDoubleQuotedString:\n        return tr(\"JavaScript double-quoted string\");\n\n    case JavaScriptSingleQuotedString:\n        return tr(\"JavaScript single-quoted string\");\n\n    case JavaScriptSymbol:\n        return tr(\"JavaScript symbol\");\n\n    case JavaScriptUnclosedString:\n        return tr(\"JavaScript unclosed string\");\n\n    case JavaScriptRegex:\n        return tr(\"JavaScript regular expression\");\n\n    case ASPJavaScriptStart:\n        return tr(\"Start of an ASP JavaScript fragment\");\n\n    case ASPJavaScriptDefault:\n        return tr(\"ASP JavaScript default\");\n\n    case ASPJavaScriptComment:\n        return tr(\"ASP JavaScript comment\");\n\n    case ASPJavaScriptCommentLine:\n        return tr(\"ASP JavaScript line comment\");\n\n    case ASPJavaScriptCommentDoc:\n        return tr(\"JavaDoc style ASP JavaScript comment\");\n\n    case ASPJavaScriptNumber:\n        return tr(\"ASP JavaScript number\");\n\n    case ASPJavaScriptWord:\n        return tr(\"ASP JavaScript word\");\n\n    case ASPJavaScriptKeyword:\n        return tr(\"ASP JavaScript keyword\");\n\n    case ASPJavaScriptDoubleQuotedString:\n        return tr(\"ASP JavaScript double-quoted string\");\n\n    case ASPJavaScriptSingleQuotedString:\n        return tr(\"ASP JavaScript single-quoted string\");\n\n    case ASPJavaScriptSymbol:\n        return tr(\"ASP JavaScript symbol\");\n\n    case ASPJavaScriptUnclosedString:\n        return tr(\"ASP JavaScript unclosed string\");\n\n    case ASPJavaScriptRegex:\n        return tr(\"ASP JavaScript regular expression\");\n\n    case VBScriptStart:\n        return tr(\"Start of a VBScript fragment\");\n\n    case VBScriptDefault:\n        return tr(\"VBScript default\");\n\n    case VBScriptComment:\n        return tr(\"VBScript comment\");\n\n    case VBScriptNumber:\n        return tr(\"VBScript number\");\n\n    case VBScriptKeyword:\n        return tr(\"VBScript keyword\");\n\n    case VBScriptString:\n        return tr(\"VBScript string\");\n\n    case VBScriptIdentifier:\n        return tr(\"VBScript identifier\");\n\n    case VBScriptUnclosedString:\n        return tr(\"VBScript unclosed string\");\n\n    case ASPVBScriptStart:\n        return tr(\"Start of an ASP VBScript fragment\");\n\n    case ASPVBScriptDefault:\n        return tr(\"ASP VBScript default\");\n\n    case ASPVBScriptComment:\n        return tr(\"ASP VBScript comment\");\n\n    case ASPVBScriptNumber:\n        return tr(\"ASP VBScript number\");\n\n    case ASPVBScriptKeyword:\n        return tr(\"ASP VBScript keyword\");\n\n    case ASPVBScriptString:\n        return tr(\"ASP VBScript string\");\n\n    case ASPVBScriptIdentifier:\n        return tr(\"ASP VBScript identifier\");\n\n    case ASPVBScriptUnclosedString:\n        return tr(\"ASP VBScript unclosed string\");\n\n    case PythonStart:\n        return tr(\"Start of a Python fragment\");\n\n    case PythonDefault:\n        return tr(\"Python default\");\n\n    case PythonComment:\n        return tr(\"Python comment\");\n\n    case PythonNumber:\n        return tr(\"Python number\");\n\n    case PythonDoubleQuotedString:\n        return tr(\"Python double-quoted string\");\n\n    case PythonSingleQuotedString:\n        return tr(\"Python single-quoted string\");\n\n    case PythonKeyword:\n        return tr(\"Python keyword\");\n\n    case PythonTripleDoubleQuotedString:\n        return tr(\"Python triple double-quoted string\");\n\n    case PythonTripleSingleQuotedString:\n        return tr(\"Python triple single-quoted string\");\n\n    case PythonClassName:\n        return tr(\"Python class name\");\n\n    case PythonFunctionMethodName:\n        return tr(\"Python function or method name\");\n\n    case PythonOperator:\n        return tr(\"Python operator\");\n\n    case PythonIdentifier:\n        return tr(\"Python identifier\");\n\n    case ASPPythonStart:\n        return tr(\"Start of an ASP Python fragment\");\n\n    case ASPPythonDefault:\n        return tr(\"ASP Python default\");\n\n    case ASPPythonComment:\n        return tr(\"ASP Python comment\");\n\n    case ASPPythonNumber:\n        return tr(\"ASP Python number\");\n\n    case ASPPythonDoubleQuotedString:\n        return tr(\"ASP Python double-quoted string\");\n\n    case ASPPythonSingleQuotedString:\n        return tr(\"ASP Python single-quoted string\");\n\n    case ASPPythonKeyword:\n        return tr(\"ASP Python keyword\");\n\n    case ASPPythonTripleDoubleQuotedString:\n        return tr(\"ASP Python triple double-quoted string\");\n\n    case ASPPythonTripleSingleQuotedString:\n        return tr(\"ASP Python triple single-quoted string\");\n\n    case ASPPythonClassName:\n        return tr(\"ASP Python class name\");\n\n    case ASPPythonFunctionMethodName:\n        return tr(\"ASP Python function or method name\");\n\n    case ASPPythonOperator:\n        return tr(\"ASP Python operator\");\n\n    case ASPPythonIdentifier:\n        return tr(\"ASP Python identifier\");\n\n    case PHPDefault:\n        return tr(\"PHP default\");\n\n    case PHPDoubleQuotedString:\n        return tr(\"PHP double-quoted string\");\n\n    case PHPSingleQuotedString:\n        return tr(\"PHP single-quoted string\");\n\n    case PHPKeyword:\n        return tr(\"PHP keyword\");\n\n    case PHPNumber:\n        return tr(\"PHP number\");\n\n    case PHPVariable:\n        return tr(\"PHP variable\");\n\n    case PHPComment:\n        return tr(\"PHP comment\");\n\n    case PHPCommentLine:\n        return tr(\"PHP line comment\");\n\n    case PHPDoubleQuotedVariable:\n        return tr(\"PHP double-quoted variable\");\n\n    case PHPOperator:\n        return tr(\"PHP operator\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerHTML::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case ASPAtStart:\n        return QColor(0xff,0xff,0x00);\n\n    case ASPStart:\n    case CDATA:\n        return QColor(0xff,0xdf,0x00);\n\n    case PHPStart:\n        return QColor(0xff,0xef,0xbf);\n\n    case HTMLValue:\n        return QColor(0xff,0xef,0xff);\n\n    case SGMLDefault:\n    case SGMLCommand:\n    case SGMLParameter:\n    case SGMLDoubleQuotedString:\n    case SGMLSingleQuotedString:\n    case SGMLSpecial:\n    case SGMLEntity:\n    case SGMLComment:\n        return QColor(0xef,0xef,0xff);\n\n    case SGMLError:\n        return QColor(0xff,0x66,0x66);\n\n    case SGMLBlockDefault:\n        return QColor(0xcc,0xcc,0xe0);\n\n    case JavaScriptDefault:\n    case JavaScriptComment:\n    case JavaScriptCommentLine:\n    case JavaScriptCommentDoc:\n    case JavaScriptNumber:\n    case JavaScriptWord:\n    case JavaScriptKeyword:\n    case JavaScriptDoubleQuotedString:\n    case JavaScriptSingleQuotedString:\n    case JavaScriptSymbol:\n        return QColor(0xf0,0xf0,0xff);\n\n    case JavaScriptUnclosedString:\n    case ASPJavaScriptUnclosedString:\n        return QColor(0xbf,0xbb,0xb0);\n\n    case JavaScriptRegex:\n    case ASPJavaScriptRegex:\n        return QColor(0xff,0xbb,0xb0);\n\n    case ASPJavaScriptDefault:\n    case ASPJavaScriptComment:\n    case ASPJavaScriptCommentLine:\n    case ASPJavaScriptCommentDoc:\n    case ASPJavaScriptNumber:\n    case ASPJavaScriptWord:\n    case ASPJavaScriptKeyword:\n    case ASPJavaScriptDoubleQuotedString:\n    case ASPJavaScriptSingleQuotedString:\n    case ASPJavaScriptSymbol:\n        return QColor(0xdf,0xdf,0x7f);\n\n    case VBScriptDefault:\n    case VBScriptComment:\n    case VBScriptNumber:\n    case VBScriptKeyword:\n    case VBScriptString:\n    case VBScriptIdentifier:\n        return QColor(0xef,0xef,0xff);\n\n    case VBScriptUnclosedString:\n    case ASPVBScriptUnclosedString:\n        return QColor(0x7f,0x7f,0xff);\n\n    case ASPVBScriptDefault:\n    case ASPVBScriptComment:\n    case ASPVBScriptNumber:\n    case ASPVBScriptKeyword:\n    case ASPVBScriptString:\n    case ASPVBScriptIdentifier:\n        return QColor(0xcf,0xcf,0xef);\n\n    case PythonDefault:\n    case PythonComment:\n    case PythonNumber:\n    case PythonDoubleQuotedString:\n    case PythonSingleQuotedString:\n    case PythonKeyword:\n    case PythonTripleSingleQuotedString:\n    case PythonTripleDoubleQuotedString:\n    case PythonClassName:\n    case PythonFunctionMethodName:\n    case PythonOperator:\n    case PythonIdentifier:\n        return QColor(0xef,0xff,0xef);\n\n    case ASPPythonDefault:\n    case ASPPythonComment:\n    case ASPPythonNumber:\n    case ASPPythonDoubleQuotedString:\n    case ASPPythonSingleQuotedString:\n    case ASPPythonKeyword:\n    case ASPPythonTripleSingleQuotedString:\n    case ASPPythonTripleDoubleQuotedString:\n    case ASPPythonClassName:\n    case ASPPythonFunctionMethodName:\n    case ASPPythonOperator:\n    case ASPPythonIdentifier:\n        return QColor(0xcf,0xef,0xcf);\n\n    case PHPDefault:\n    case PHPDoubleQuotedString:\n    case PHPSingleQuotedString:\n    case PHPKeyword:\n    case PHPNumber:\n    case PHPVariable:\n    case PHPComment:\n    case PHPCommentLine:\n    case PHPDoubleQuotedVariable:\n    case PHPOperator:\n        return QColor(0xff,0xf8,0xf8);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerHTML::refreshProperties()\n{\n    setCompactProp();\n    setPreprocProp();\n    setCaseSensTagsProp();\n    setScriptCommentsProp();\n    setScriptHeredocsProp();\n    setDjangoProp();\n    setMakoProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerHTML::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldpreprocessor\", false, &ok);\n\n    if (ok)\n        fold_preproc = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"casesensitivetags\", false, &ok);\n\n    if (ok)\n        case_sens_tags = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldscriptcomments\", false, &ok);\n\n    if (ok)\n        fold_script_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldscriptheredocs\", false, &ok);\n\n    if (ok)\n        fold_script_heredocs = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"djangotemplates\", false, &ok);\n\n    if (ok)\n        django_templates = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"makotemplates\", false, &ok);\n\n    if (ok)\n        mako_templates = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerHTML::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldpreprocessor\", fold_preproc))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"casesensitivetags\", case_sens_tags))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldscriptcomments\", fold_script_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldscriptheredocs\", fold_script_heredocs))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"djangotemplates\", django_templates))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"makotemplates\", mako_templates))\n        rc = false;\n\n    return rc;\n}\n\n\n// Set if tags are case sensitive.\nvoid QsciLexerHTML::setCaseSensitiveTags(bool sens)\n{\n    case_sens_tags = sens;\n\n    setCaseSensTagsProp();\n}\n\n\n// Set the \"html.tags.case.sensitive\" property.\nvoid QsciLexerHTML::setCaseSensTagsProp()\n{\n    emit propertyChanged(\"html.tags.case.sensitive\",(case_sens_tags ? \"1\" : \"0\"));\n}\n\n\n// Set if folds are compact\nvoid QsciLexerHTML::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerHTML::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Set if preprocessor blocks can be folded.\nvoid QsciLexerHTML::setFoldPreprocessor(bool fold)\n{\n    fold_preproc = fold;\n\n    setPreprocProp();\n}\n\n\n// Set the \"fold.html.preprocessor\" property.\nvoid QsciLexerHTML::setPreprocProp()\n{\n    emit propertyChanged(\"fold.html.preprocessor\",(fold_preproc ? \"1\" : \"0\"));\n}\n\n\n// Set if script comments can be folded.\nvoid QsciLexerHTML::setFoldScriptComments(bool fold)\n{\n    fold_script_comments = fold;\n\n    setScriptCommentsProp();\n}\n\n\n// Set the \"fold.hypertext.comment\" property.\nvoid QsciLexerHTML::setScriptCommentsProp()\n{\n    emit propertyChanged(\"fold.hypertext.comment\",(fold_script_comments ? \"1\" : \"0\"));\n}\n\n\n// Set if script heredocs can be folded.\nvoid QsciLexerHTML::setFoldScriptHeredocs(bool fold)\n{\n    fold_script_heredocs = fold;\n\n    setScriptHeredocsProp();\n}\n\n\n// Set the \"fold.hypertext.heredoc\" property.\nvoid QsciLexerHTML::setScriptHeredocsProp()\n{\n    emit propertyChanged(\"fold.hypertext.heredoc\",(fold_script_heredocs ? \"1\" : \"0\"));\n}\n\n\n// Set if Django templates are supported.\nvoid QsciLexerHTML::setDjangoTemplates(bool enable)\n{\n    django_templates = enable;\n\n    setDjangoProp();\n}\n\n\n// Set the \"lexer.html.django\" property.\nvoid QsciLexerHTML::setDjangoProp()\n{\n    emit propertyChanged(\"lexer.html.django\", (django_templates ? \"1\" : \"0\"));\n}\n\n\n// Set if Mako templates are supported.\nvoid QsciLexerHTML::setMakoTemplates(bool enable)\n{\n    mako_templates = enable;\n\n    setMakoProp();\n}\n\n\n// Set the \"lexer.html.mako\" property.\nvoid QsciLexerHTML::setMakoProp()\n{\n    emit propertyChanged(\"lexer.html.mako\", (mako_templates ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexeridl.cpp",
    "content": "// This module implements the QsciLexerIDL class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexeridl.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n\n\n// The ctor.\nQsciLexerIDL::QsciLexerIDL(QObject *parent, const char *name)\n    : QsciLexerCPP(parent, name)\n{\n}\n\n\n// The dtor.\nQsciLexerIDL::~QsciLexerIDL()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerIDL::language() const\n{\n    return \"IDL\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerIDL::defaultColor(int style) const\n{\n    if (style == UUID)\n        return QColor(0x80,0x40,0x80);\n\n    return QsciLexerCPP::defaultColor(style);\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerIDL::keywords(int set) const\n{\n    if (set != 1)\n        return 0;\n\n    return \"aggregatable allocate appobject arrays async async_uuid \"\n           \"auto_handle bindable boolean broadcast byte byte_count \"\n           \"call_as callback char coclass code comm_status const \"\n           \"context_handle context_handle_noserialize \"\n           \"context_handle_serialize control cpp_quote custom decode \"\n           \"default defaultbind defaultcollelem defaultvalue \"\n           \"defaultvtable dispinterface displaybind dllname double dual \"\n           \"enable_allocate encode endpoint entry enum error_status_t \"\n           \"explicit_handle fault_status first_is float handle_t heap \"\n           \"helpcontext helpfile helpstring helpstringcontext \"\n           \"helpstringdll hidden hyper id idempotent ignore iid_as iid_is \"\n           \"immediatebind implicit_handle import importlib in include \"\n           \"in_line int __int64 __int3264 interface last_is lcid \"\n           \"length_is library licensed local long max_is maybe message \"\n           \"methods midl_pragma midl_user_allocate midl_user_free min_is \"\n           \"module ms_union ncacn_at_dsp ncacn_dnet_nsp ncacn_http \"\n           \"ncacn_ip_tcp ncacn_nb_ipx ncacn_nb_nb ncacn_nb_tcp ncacn_np \"\n           \"ncacn_spx ncacn_vns_spp ncadg_ip_udp ncadg_ipx ncadg_mq \"\n           \"ncalrpc nocode nonbrowsable noncreatable nonextensible notify \"\n           \"object odl oleautomation optimize optional out out_of_line \"\n           \"pipe pointer_default pragma properties propget propput \"\n           \"propputref ptr public range readonly ref represent_as \"\n           \"requestedit restricted retval shape short signed size_is \"\n           \"small source strict_context_handle string struct switch \"\n           \"switch_is switch_type transmit_as typedef uidefault union \"\n           \"unique unsigned user_marshal usesgetlasterror uuid v1_enum \"\n           \"vararg version void wchar_t wire_marshal\";\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerIDL::description(int style) const\n{\n    if (style == UUID)\n        return tr(\"UUID\");\n\n    return QsciLexerCPP::description(style);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerjava.cpp",
    "content": "// This module implements the QsciLexerJava class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerjava.h\"\n\n\n// The ctor.\nQsciLexerJava::QsciLexerJava(QObject *parent, const char *name)\n    : QsciLexerCPP(parent, name)\n{\n}\n\n\n// The dtor.\nQsciLexerJava::~QsciLexerJava()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerJava::language() const\n{\n    return \"Java\";\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerJava::keywords(int set) const\n{\n    if (set != 1)\n        return 0;\n\n    return \"abstract assert boolean break byte case catch char class \"\n           \"const continue default do double else extends final finally \"\n           \"float for future generic goto if implements import inner \"\n           \"instanceof int interface long native new null operator outer \"\n           \"package private protected public rest return short static \"\n           \"super switch synchronized this throw throws transient try var \"\n           \"void volatile while\";\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerjavascript.cpp",
    "content": "// This module implements the QsciLexerJavaScript class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerjavascript.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n\n\n// The list of JavaScript keywords that can be used by other friendly lexers.\nconst char *QsciLexerJavaScript::keywordClass =\n    \"abstract boolean break byte case catch char class const continue \"\n    \"debugger default delete do double else enum export extends final \"\n    \"finally float for function goto if implements import in instanceof \"\n    \"int interface long native new package private protected public \"\n    \"return short static super switch synchronized this throw throws \"\n    \"transient try typeof var void volatile while with\";\n\n\n// The ctor.\nQsciLexerJavaScript::QsciLexerJavaScript(QObject *parent, const char *name)\n    : QsciLexerCPP(parent, name)\n{\n}\n\n\n// The dtor.\nQsciLexerJavaScript::~QsciLexerJavaScript()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerJavaScript::language() const\n{\n    return \"JavaScript\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerJavaScript::defaultColor(int style) const\n{\n    if (style == Regex)\n        return QColor(0x3f,0x7f,0x3f);\n\n    return QsciLexerCPP::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerJavaScript::defaultEolFill(int style) const\n{\n    if (style == Regex)\n        return true;\n\n    return QsciLexerCPP::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerJavaScript::defaultFont(int style) const\n{\n    if (style == Regex)\n#if defined(Q_OS_WIN)\n        return QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        return QFont(\"Courier\", 12);\n#else\n        return QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n\n    return QsciLexerCPP::defaultFont(style);\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerJavaScript::keywords(int set) const\n{\n    if (set != 1)\n        return 0;\n\n    return keywordClass;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerJavaScript::description(int style) const\n{\n    if (style == Regex)\n        return tr(\"Regular expression\");\n\n    return QsciLexerCPP::description(style);\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerJavaScript::defaultPaper(int style) const\n{\n    if (style == Regex)\n        return QColor(0xe0,0xf0,0xff);\n\n    return QsciLexer::defaultPaper(style);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerlua.cpp",
    "content": "// This module implements the QsciLexerLua class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerlua.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerLua::QsciLexerLua(QObject *parent, const char *name)\n    : QsciLexer(parent, name),\n      fold_compact(true)\n{\n}\n\n\n// The dtor.\nQsciLexerLua::~QsciLexerLua()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerLua::language() const\n{\n    return \"Lua\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerLua::lexer() const\n{\n    return \"lua\";\n}\n\n\n// Return the set of character sequences that can separate auto-completion\n// words.\nQStringList QsciLexerLua::autoCompletionWordSeparators() const\n{\n    QStringList wl;\n\n    wl << \":\" << \".\";\n\n    return wl;\n}\n\n\n// Return the list of characters that can start a block.\nconst char *QsciLexerLua::blockStart(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerLua::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerLua::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x00,0x00,0x00);\n\n    case Comment:\n    case LineComment:\n        return QColor(0x00,0x7f,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n    case BasicFunctions:\n    case StringTableMathsFunctions:\n    case CoroutinesIOSystemFacilities:\n        return QColor(0x00,0x00,0x7f);\n\n    case String:\n    case Character:\n    case LiteralString:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Preprocessor:\n    case Label:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Operator:\n    case Identifier:\n        break;\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerLua::defaultEolFill(int style) const\n{\n    if (style == Comment || style == UnclosedString)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerLua::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case LineComment:\n    case LiteralString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerLua::keywords(int set) const\n{\n    if (set == 1)\n        // Keywords.\n        return\n            \"and break do else elseif end false for function if \"\n            \"in local nil not or repeat return then true until \"\n            \"while\";\n\n    if (set == 2)\n        // Basic functions.\n        return\n            \"_ALERT _ERRORMESSAGE _INPUT _PROMPT _OUTPUT _STDERR \"\n            \"_STDIN _STDOUT call dostring foreach foreachi getn \"\n            \"globals newtype rawget rawset require sort tinsert \"\n            \"tremove \"\n\n            \"G getfenv getmetatable ipairs loadlib next pairs \"\n            \"pcall rawegal rawget rawset require setfenv \"\n            \"setmetatable xpcall string table math coroutine io \"\n            \"os debug\";\n\n    if (set == 3)\n        // String, table and maths functions.\n        return\n            \"abs acos asin atan atan2 ceil cos deg exp floor \"\n            \"format frexp gsub ldexp log log10 max min mod rad \"\n            \"random randomseed sin sqrt strbyte strchar strfind \"\n            \"strlen strlower strrep strsub strupper tan \"\n\n            \"string.byte string.char string.dump string.find \"\n            \"string.len string.lower string.rep string.sub \"\n            \"string.upper string.format string.gfind string.gsub \"\n            \"table.concat table.foreach table.foreachi table.getn \"\n            \"table.sort table.insert table.remove table.setn \"\n            \"math.abs math.acos math.asin math.atan math.atan2 \"\n            \"math.ceil math.cos math.deg math.exp math.floor \"\n            \"math.frexp math.ldexp math.log math.log10 math.max \"\n            \"math.min math.mod math.pi math.rad math.random \"\n            \"math.randomseed math.sin math.sqrt math.tan\";\n\n    if (set == 4)\n        // Coroutine, I/O and system facilities.\n        return\n            \"openfile closefile readfrom writeto appendto remove \"\n            \"rename flush seek tmpfile tmpname read write clock \"\n            \"date difftime execute exit getenv setlocale time \"\n\n            \"coroutine.create coroutine.resume coroutine.status \"\n            \"coroutine.wrap coroutine.yield io.close io.flush \"\n            \"io.input io.lines io.open io.output io.read \"\n            \"io.tmpfile io.type io.write io.stdin io.stdout \"\n            \"io.stderr os.clock os.date os.difftime os.execute \"\n            \"os.exit os.getenv os.remove os.rename os.setlocale \"\n            \"os.time os.tmpname\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerLua::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case LineComment:\n        return tr(\"Line comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case String:\n        return tr(\"String\");\n\n    case Character:\n        return tr(\"Character\");\n\n    case LiteralString:\n        return tr(\"Literal string\");\n\n    case Preprocessor:\n        return tr(\"Preprocessor\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case BasicFunctions:\n        return tr(\"Basic functions\");\n\n    case StringTableMathsFunctions:\n        return tr(\"String, table and maths functions\");\n\n    case CoroutinesIOSystemFacilities:\n        return tr(\"Coroutines, i/o and system facilities\");\n\n    case KeywordSet5:\n        return tr(\"User defined 1\");\n\n    case KeywordSet6:\n        return tr(\"User defined 2\");\n\n    case KeywordSet7:\n        return tr(\"User defined 3\");\n\n    case KeywordSet8:\n        return tr(\"User defined 4\");\n\n    case Label:\n        return tr(\"Label\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerLua::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case Comment:\n        return QColor(0xd0,0xf0,0xf0);\n\n    case LiteralString:\n        return QColor(0xe0,0xff,0xff);\n\n    case UnclosedString:\n        return QColor(0xe0,0xc0,0xe0);\n\n    case BasicFunctions:\n        return QColor(0xd0,0xff,0xd0);\n\n    case StringTableMathsFunctions:\n        return QColor(0xd0,0xd0,0xff);\n\n    case CoroutinesIOSystemFacilities:\n        return QColor(0xff,0xd0,0xd0);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerLua::refreshProperties()\n{\n    setCompactProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerLua::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerLua::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerLua::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact.\nvoid QsciLexerLua::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerLua::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexermakefile.cpp",
    "content": "// This module implements the QsciLexerMakefile class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexermakefile.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n\n\n// The ctor.\nQsciLexerMakefile::QsciLexerMakefile(QObject *parent, const char *name)\n    : QsciLexer(parent, name)\n{\n}\n\n\n// The dtor.\nQsciLexerMakefile::~QsciLexerMakefile()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerMakefile::language() const\n{\n    return \"Makefile\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerMakefile::lexer() const\n{\n    return \"makefile\";\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerMakefile::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerMakefile::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n    case Operator:\n        return QColor(0x00,0x00,0x00);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case Preprocessor:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Variable:\n        return QColor(0x00,0x00,0x80);\n\n    case Target:\n        return QColor(0xa0,0x00,0x00);\n\n    case Error:\n        return QColor(0xff,0xff,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerMakefile::defaultEolFill(int style) const\n{\n    if (style == Error)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerMakefile::defaultFont(int style) const\n{\n    QFont f;\n\n    if (style == Comment)\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n    else\n        f = QsciLexer::defaultFont(style);\n\n    return f;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerMakefile::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Preprocessor:\n        return tr(\"Preprocessor\");\n\n    case Variable:\n        return tr(\"Variable\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Target:\n        return tr(\"Target\");\n\n    case Error:\n        return tr(\"Error\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerMakefile::defaultPaper(int style) const\n{\n    if (style == Error)\n        return QColor(0xff,0x00,0x00);\n\n    return QsciLexer::defaultPaper(style);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexermatlab.cpp",
    "content": "// This module implements the QsciLexerMatlab class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexermatlab.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n\n\n// The ctor.\nQsciLexerMatlab::QsciLexerMatlab(QObject *parent, const char *name)\n    : QsciLexer(parent, name)\n{\n}\n\n\n// The dtor.\nQsciLexerMatlab::~QsciLexerMatlab()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerMatlab::language() const\n{\n    return \"Matlab\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerMatlab::lexer() const\n{\n    return \"matlab\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerMatlab::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n    case Operator:\n        return QColor(0x00,0x00,0x00);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case Command:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case SingleQuotedString:\n    case DoubleQuotedString:\n        return QColor(0x7f,0x00,0x7f);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerMatlab::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case Operator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerMatlab::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"break case catch continue else elseif end for function \"\n            \"global if otherwise persistent return switch try while\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerMatlab::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Command:\n        return tr(\"Command\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n    }\n\n    return QString();\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexeroctave.cpp",
    "content": "// This module implements the QsciLexerOctave class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexeroctave.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n\n\n// The ctor.\nQsciLexerOctave::QsciLexerOctave(QObject *parent, const char *name)\n    : QsciLexerMatlab(parent, name)\n{\n}\n\n\n// The dtor.\nQsciLexerOctave::~QsciLexerOctave()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerOctave::language() const\n{\n    return \"Octave\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerOctave::lexer() const\n{\n    return \"octave\";\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerOctave::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"__FILE__ __LINE__ break case catch classdef continue do else \"\n            \"elseif end end_try_catch end_unwind_protect endclassdef \"\n            \"endenumeration endevents endfor endfunction endif endmethods \"\n            \"endparfor endproperties endswitch endwhile enumeration events \"\n            \"for function get global if methods otherwise parfor persistent \"\n            \"properties return set static switch try until unwind_protect \"\n            \"unwind_protect_cleanup while\";\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerpascal.cpp",
    "content": "// This module implements the QsciLexerPascal class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerpascal.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerPascal::QsciLexerPascal(QObject *parent, const char *name)\n    : QsciLexer(parent, name),\n      fold_comments(false), fold_compact(true), fold_preproc(false),\n      smart_highlight(true)\n{\n}\n\n\n// The dtor.\nQsciLexerPascal::~QsciLexerPascal()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerPascal::language() const\n{\n    return \"Pascal\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerPascal::lexer() const\n{\n    return \"pascal\";\n}\n\n\n// Return the set of character sequences that can separate auto-completion\n// words.\nQStringList QsciLexerPascal::autoCompletionWordSeparators() const\n{\n    QStringList wl;\n\n    wl << \".\" << \"^\";\n\n    return wl;\n}\n\n\n// Return the list of keywords that can start a block.\nconst char *QsciLexerPascal::blockStartKeyword(int *style) const\n{\n    if (style)\n        *style = Keyword;\n\n    return\n        \"case class do else for then private protected public published \"\n        \"repeat try while type\";\n}\n\n\n// Return the list of characters that can start a block.\nconst char *QsciLexerPascal::blockStart(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"begin\";\n}\n\n\n// Return the list of characters that can end a block.\nconst char *QsciLexerPascal::blockEnd(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"end\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerPascal::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerPascal::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Identifier:\n        break;\n\n    case Comment:\n    case CommentParenthesis:\n    case CommentLine:\n        return QColor(0x00,0x7f,0x00);\n\n    case PreProcessor:\n    case PreProcessorParenthesis:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Number:\n    case HexNumber:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case SingleQuotedString:\n    case Character:\n        return QColor(0x7f,0x00,0x7f);\n\n    case UnclosedString:\n    case Operator:\n        return QColor(0x00,0x00,0x00);\n\n    case Asm:\n        return QColor(0x80,0x40,0x80);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerPascal::defaultEolFill(int style) const\n{\n    if (style == UnclosedString)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerPascal::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case CommentParenthesis:\n    case CommentLine:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case Operator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case SingleQuotedString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Times New Roman\", 11);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Times New Roman\", 12);\n#else\n        f = QFont(\"Bitstream Charter\", 10);\n#endif\n        f.setItalic(true);\n        break;\n\n    case UnclosedString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\", 10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\", 9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerPascal::defaultPaper(int style) const\n{\n    if (style == UnclosedString)\n        return QColor(0xe0,0xc0,0xe0);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerPascal::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"absolute abstract and array as asm assembler automated begin \"\n            \"case cdecl class const constructor delayed deprecated destructor \"\n            \"dispid dispinterface div do downto dynamic else end except \"\n            \"experimental export exports external far file final finalization \"\n            \"finally for forward function goto helper if implementation in \"\n            \"inherited initialization inline interface is label library \"\n            \"message mod near nil not object of on operator or out overload \"\n            \"override packed pascal platform private procedure program \"\n            \"property protected public published raise record reference \"\n            \"register reintroduce repeat resourcestring safecall sealed set \"\n            \"shl shr static stdcall strict string then threadvar to try type \"\n            \"unit unsafe until uses var varargs virtual while winapi with xor\"\n            \"add default implements index name nodefault read readonly remove \"\n            \"stored write writeonly\"\n            \"package contains requires\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerPascal::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case Comment:\n        return tr(\"'{ ... }' style comment\");\n\n    case CommentParenthesis:\n        return tr(\"'(* ... *)' style comment\");\n\n    case CommentLine:\n        return tr(\"Line comment\");\n\n    case PreProcessor:\n        return tr(\"'{$ ... }' style pre-processor block\");\n\n    case PreProcessorParenthesis:\n        return tr(\"'(*$ ... *)' style pre-processor block\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case HexNumber:\n        return tr(\"Hexadecimal number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case Character:\n        return tr(\"Character\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Asm:\n        return tr(\"Inline asm\");\n    }\n\n    return QString();\n}\n\n\n// Refresh all properties.\nvoid QsciLexerPascal::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n    setPreprocProp();\n    setSmartHighlightProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerPascal::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldpreprocessor\", true, &ok);\n\n    if (ok)\n        fold_preproc = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"smarthighlight\", true, &ok);\n\n    if (ok)\n        smart_highlight = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerPascal::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldpreprocessor\", fold_preproc))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"smarthighlight\", smart_highlight))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerPascal::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerPascal::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerPascal::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerPascal::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerPascal::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerPascal::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Return true if preprocessor blocks can be folded.\nbool QsciLexerPascal::foldPreprocessor() const\n{\n    return fold_preproc;\n}\n\n\n// Set if preprocessor blocks can be folded.\nvoid QsciLexerPascal::setFoldPreprocessor(bool fold)\n{\n    fold_preproc = fold;\n\n    setPreprocProp();\n}\n\n\n// Set the \"fold.preprocessor\" property.\nvoid QsciLexerPascal::setPreprocProp()\n{\n    emit propertyChanged(\"fold.preprocessor\",(fold_preproc ? \"1\" : \"0\"));\n}\n\n\n// Return true if smart highlighting is enabled.\nbool QsciLexerPascal::smartHighlighting() const\n{\n    return smart_highlight;\n}\n\n\n// Set if smart highlighting is enabled.\nvoid QsciLexerPascal::setSmartHighlighting(bool enabled)\n{\n    smart_highlight = enabled;\n\n    setSmartHighlightProp();\n}\n\n\n// Set the \"lexer.pascal.smart.highlighting\" property.\nvoid QsciLexerPascal::setSmartHighlightProp()\n{\n    emit propertyChanged(\"lexer.pascal.smart.highlighting\", (smart_highlight ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerperl.cpp",
    "content": "// This module implements the QsciLexerPerl class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerperl.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerPerl::QsciLexerPerl(QObject *parent, const char *name)\n    : QsciLexer(parent, name),\n      fold_atelse(false), fold_comments(false), fold_compact(true),\n      fold_packages(true), fold_pod_blocks(true)\n{\n}\n\n\n// The dtor.\nQsciLexerPerl::~QsciLexerPerl()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerPerl::language() const\n{\n    return \"Perl\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerPerl::lexer() const\n{\n    return \"perl\";\n}\n\n\n// Return the set of character sequences that can separate auto-completion\n// words.\nQStringList QsciLexerPerl::autoCompletionWordSeparators() const\n{\n    QStringList wl;\n\n    wl << \"::\" << \"->\";\n\n    return wl;\n}\n\n\n// Return the list of characters that can start a block.\nconst char *QsciLexerPerl::blockStart(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"{\";\n}\n\n\n// Return the list of characters that can end a block.\nconst char *QsciLexerPerl::blockEnd(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"}\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerPerl::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerPerl::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$@%&\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerPerl::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Error:\n    case Backticks:\n    case QuotedStringQX:\n        return QColor(0xff,0xff,0x00);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case POD:\n    case PODVerbatim:\n        return QColor(0x00,0x40,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case SingleQuotedHereDocument:\n    case DoubleQuotedHereDocument:\n    case BacktickHereDocument:\n    case QuotedStringQ:\n    case QuotedStringQQ:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Operator:\n    case Identifier:\n    case Scalar:\n    case Array:\n    case Hash:\n    case SymbolTable:\n    case Regex:\n    case Substitution:\n    case HereDocumentDelimiter:\n    case QuotedStringQR:\n    case QuotedStringQW:\n    case SubroutinePrototype:\n    case Translation:\n        return QColor(0x00,0x00,0x00);\n\n    case DataSection:\n        return QColor(0x60,0x00,0x00);\n\n    case FormatIdentifier:\n    case FormatBody:\n        return QColor(0xc0,0x00,0xc0);\n\n    case DoubleQuotedStringVar:\n    case RegexVar:\n    case SubstitutionVar:\n    case BackticksVar:\n    case DoubleQuotedHereDocumentVar:\n    case BacktickHereDocumentVar:\n    case QuotedStringQQVar:\n    case QuotedStringQXVar:\n    case QuotedStringQRVar:\n        return QColor(0xd0, 0x00, 0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerPerl::defaultEolFill(int style) const\n{\n    switch (style)\n    {\n    case POD:\n    case DataSection:\n    case SingleQuotedHereDocument:\n    case DoubleQuotedHereDocument:\n    case BacktickHereDocument:\n    case PODVerbatim:\n    case FormatBody:\n    case DoubleQuotedHereDocumentVar:\n    case BacktickHereDocumentVar:\n        return true;\n    }\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerPerl::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case POD:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Times New Roman\",11);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Times New Roman\", 12);\n#else\n        f = QFont(\"Bitstream Charter\",10);\n#endif\n        break;\n\n    case Keyword:\n    case Operator:\n    case DoubleQuotedHereDocument:\n    case FormatIdentifier:\n    case RegexVar:\n    case SubstitutionVar:\n    case BackticksVar:\n    case DoubleQuotedHereDocumentVar:\n    case BacktickHereDocumentVar:\n    case QuotedStringQXVar:\n    case QuotedStringQRVar:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case QuotedStringQQ:\n    case PODVerbatim:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    case BacktickHereDocument:\n    case SubroutinePrototype:\n        f = QsciLexer::defaultFont(style);\n        f.setItalic(true);\n        break;\n\n    case DoubleQuotedStringVar:\n    case QuotedStringQQVar:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerPerl::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"NULL __FILE__ __LINE__ __PACKAGE__ __DATA__ __END__ \"\n            \"AUTOLOAD BEGIN CORE DESTROY END EQ GE GT INIT LE LT \"\n            \"NE CHECK abs accept alarm and atan2 bind binmode \"\n            \"bless caller chdir chmod chomp chop chown chr chroot \"\n            \"close closedir cmp connect continue cos crypt \"\n            \"dbmclose dbmopen defined delete die do dump each \"\n            \"else elsif endgrent endhostent endnetent endprotoent \"\n            \"endpwent endservent eof eq eval exec exists exit exp \"\n            \"fcntl fileno flock for foreach fork format formline \"\n            \"ge getc getgrent getgrgid getgrnam gethostbyaddr \"\n            \"gethostbyname gethostent getlogin getnetbyaddr \"\n            \"getnetbyname getnetent getpeername getpgrp getppid \"\n            \"getpriority getprotobyname getprotobynumber \"\n            \"getprotoent getpwent getpwnam getpwuid getservbyname \"\n            \"getservbyport getservent getsockname getsockopt glob \"\n            \"gmtime goto grep gt hex if index int ioctl join keys \"\n            \"kill last lc lcfirst le length link listen local \"\n            \"localtime lock log lstat lt m map mkdir msgctl \"\n            \"msgget msgrcv msgsnd my ne next no not oct open \"\n            \"opendir or ord our pack package pipe pop pos print \"\n            \"printf prototype push q qq qr quotemeta qu qw qx \"\n            \"rand read readdir readline readlink readpipe recv \"\n            \"redo ref rename require reset return reverse \"\n            \"rewinddir rindex rmdir s scalar seek seekdir select \"\n            \"semctl semget semop send setgrent sethostent \"\n            \"setnetent setpgrp setpriority setprotoent setpwent \"\n            \"setservent setsockopt shift shmctl shmget shmread \"\n            \"shmwrite shutdown sin sleep socket socketpair sort \"\n            \"splice split sprintf sqrt srand stat study sub \"\n            \"substr symlink syscall sysopen sysread sysseek \"\n            \"system syswrite tell telldir tie tied time times tr \"\n            \"truncate uc ucfirst umask undef unless unlink unpack \"\n            \"unshift untie until use utime values vec wait \"\n            \"waitpid wantarray warn while write x xor y\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerPerl::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Error:\n        return tr(\"Error\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case POD:\n        return tr(\"POD\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case Scalar:\n        return tr(\"Scalar\");\n\n    case Array:\n        return tr(\"Array\");\n\n    case Hash:\n        return tr(\"Hash\");\n\n    case SymbolTable:\n        return tr(\"Symbol table\");\n\n    case Regex:\n        return tr(\"Regular expression\");\n\n    case Substitution:\n        return tr(\"Substitution\");\n\n    case Backticks:\n        return tr(\"Backticks\");\n\n    case DataSection:\n        return tr(\"Data section\");\n\n    case HereDocumentDelimiter:\n        return tr(\"Here document delimiter\");\n\n    case SingleQuotedHereDocument:\n        return tr(\"Single-quoted here document\");\n\n    case DoubleQuotedHereDocument:\n        return tr(\"Double-quoted here document\");\n\n    case BacktickHereDocument:\n        return tr(\"Backtick here document\");\n\n    case QuotedStringQ:\n        return tr(\"Quoted string (q)\");\n\n    case QuotedStringQQ:\n        return tr(\"Quoted string (qq)\");\n\n    case QuotedStringQX:\n        return tr(\"Quoted string (qx)\");\n\n    case QuotedStringQR:\n        return tr(\"Quoted string (qr)\");\n\n    case QuotedStringQW:\n        return tr(\"Quoted string (qw)\");\n\n    case PODVerbatim:\n        return tr(\"POD verbatim\");\n\n    case SubroutinePrototype:\n        return tr(\"Subroutine prototype\");\n\n    case FormatIdentifier:\n        return tr(\"Format identifier\");\n\n    case FormatBody:\n        return tr(\"Format body\");\n\n    case DoubleQuotedStringVar:\n        return tr(\"Double-quoted string (interpolated variable)\");\n\n    case Translation:\n        return tr(\"Translation\");\n\n    case RegexVar:\n        return tr(\"Regular expression (interpolated variable)\");\n\n    case SubstitutionVar:\n        return tr(\"Substitution (interpolated variable)\");\n\n    case BackticksVar:\n        return tr(\"Backticks (interpolated variable)\");\n\n    case DoubleQuotedHereDocumentVar:\n        return tr(\"Double-quoted here document (interpolated variable)\");\n\n    case BacktickHereDocumentVar:\n        return tr(\"Backtick here document (interpolated variable)\");\n\n    case QuotedStringQQVar:\n        return tr(\"Quoted string (qq, interpolated variable)\");\n\n    case QuotedStringQXVar:\n        return tr(\"Quoted string (qx, interpolated variable)\");\n\n    case QuotedStringQRVar:\n        return tr(\"Quoted string (qr, interpolated variable)\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerPerl::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case Error:\n        return QColor(0xff,0x00,0x00);\n\n    case POD:\n        return QColor(0xe0,0xff,0xe0);\n\n    case Scalar:\n        return QColor(0xff,0xe0,0xe0);\n\n    case Array:\n        return QColor(0xff,0xff,0xe0);\n\n    case Hash:\n        return QColor(0xff,0xe0,0xff);\n\n    case SymbolTable:\n        return QColor(0xe0,0xe0,0xe0);\n\n    case Regex:\n        return QColor(0xa0,0xff,0xa0);\n\n    case Substitution:\n    case Translation:\n        return QColor(0xf0,0xe0,0x80);\n\n    case Backticks:\n    case BackticksVar:\n    case QuotedStringQXVar:\n        return QColor(0xa0,0x80,0x80);\n\n    case DataSection:\n        return QColor(0xff,0xf0,0xd8);\n\n    case HereDocumentDelimiter:\n    case SingleQuotedHereDocument:\n    case DoubleQuotedHereDocument:\n    case BacktickHereDocument:\n    case DoubleQuotedHereDocumentVar:\n    case BacktickHereDocumentVar:\n        return QColor(0xdd,0xd0,0xdd);\n\n    case PODVerbatim:\n        return QColor(0xc0,0xff,0xc0);\n\n    case FormatBody:\n        return QColor(0xff,0xf0,0xff);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerPerl::refreshProperties()\n{\n    setAtElseProp();\n    setCommentProp();\n    setCompactProp();\n    setPackagesProp();\n    setPODBlocksProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerPerl::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldatelse\", false, &ok);\n\n    if (ok)\n        fold_atelse = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldpackages\", true, &ok);\n\n    if (ok)\n        fold_packages = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldpodblocks\", true, &ok);\n\n    if (ok)\n        fold_pod_blocks = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerPerl::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldatelse\", fold_atelse))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldpackages\", fold_packages))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldpodblocks\", fold_pod_blocks))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerPerl::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerPerl::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerPerl::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerPerl::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerPerl::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerPerl::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Return true if packages can be folded.\nbool QsciLexerPerl::foldPackages() const\n{\n    return fold_packages;\n}\n\n\n// Set if packages can be folded.\nvoid QsciLexerPerl::setFoldPackages(bool fold)\n{\n    fold_packages = fold;\n\n    setPackagesProp();\n}\n\n\n// Set the \"fold.perl.package\" property.\nvoid QsciLexerPerl::setPackagesProp()\n{\n    emit propertyChanged(\"fold.perl.package\",(fold_packages ? \"1\" : \"0\"));\n}\n\n\n// Return true if POD blocks can be folded.\nbool QsciLexerPerl::foldPODBlocks() const\n{\n    return fold_pod_blocks;\n}\n\n\n// Set if POD blocks can be folded.\nvoid QsciLexerPerl::setFoldPODBlocks(bool fold)\n{\n    fold_pod_blocks = fold;\n\n    setPODBlocksProp();\n}\n\n\n// Set the \"fold.perl.pod\" property.\nvoid QsciLexerPerl::setPODBlocksProp()\n{\n    emit propertyChanged(\"fold.perl.pod\",(fold_pod_blocks ? \"1\" : \"0\"));\n}\n\n\n// Set if else can be folded.\nvoid QsciLexerPerl::setFoldAtElse(bool fold)\n{\n    fold_atelse = fold;\n\n    setAtElseProp();\n}\n\n\n// Set the \"fold.perl.at.else\" property.\nvoid QsciLexerPerl::setAtElseProp()\n{\n    emit propertyChanged(\"fold.perl.at.else\",(fold_atelse ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerpo.cpp",
    "content": "// This module implements the QsciLexerPO class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerpo.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerPO::QsciLexerPO(QObject *parent, const char *name)\n    : QsciLexer(parent,name),\n      fold_comments(false), fold_compact(true)\n{\n}\n\n\n// The dtor.\nQsciLexerPO::~QsciLexerPO()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerPO::language() const\n{\n    return \"PO\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerPO::lexer() const\n{\n    return \"po\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerPO::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Comment:\n        return QColor(0x00, 0x7f, 0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerPO::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\", 9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Georgia\", 13);\n#else\n        f = QFont(\"Bitstream Vera Serif\", 9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerPO::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case MessageId:\n        return tr(\"Message identifier\");\n\n    case MessageIdText:\n        return tr(\"Message identifier text\");\n\n    case MessageString:\n        return tr(\"Message string\");\n\n    case MessageStringText:\n        return tr(\"Message string text\");\n\n    case MessageContext:\n        return tr(\"Message context\");\n\n    case MessageContextText:\n        return tr(\"Message context text\");\n\n    case Fuzzy:\n        return tr(\"Fuzzy flag\");\n\n    case ProgrammerComment:\n        return tr(\"Programmer comment\");\n\n    case Reference:\n        return tr(\"Reference\");\n\n    case Flags:\n        return tr(\"Flags\");\n\n    case MessageIdTextEOL:\n        return tr(\"Message identifier text end-of-line\");\n\n    case MessageStringTextEOL:\n        return tr(\"Message string text end-of-line\");\n\n    case MessageContextTextEOL:\n        return tr(\"Message context text end-of-line\");\n    }\n\n    return QString();\n}\n\n\n// Refresh all properties.\nvoid QsciLexerPO::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerPO::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerPO::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerPO::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerPO::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerPO::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerPO::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerPO::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerPO::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerpostscript.cpp",
    "content": "// This module implements the QsciLexerPostScript class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerpostscript.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerPostScript::QsciLexerPostScript(QObject *parent, const char *name)\n    : QsciLexer(parent,name),\n      ps_tokenize(false), ps_level(3), fold_compact(true), fold_atelse(false)\n{\n}\n\n\n// The dtor.\nQsciLexerPostScript::~QsciLexerPostScript()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerPostScript::language() const\n{\n    return \"PostScript\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerPostScript::lexer() const\n{\n    return \"ps\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerPostScript::braceStyle() const\n{\n    return ProcedureParenthesis;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerPostScript::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case DSCComment:\n        return QColor(0x3f,0x70,0x3f);\n\n    case DSCCommentValue:\n    case DictionaryParenthesis:\n        return QColor(0x30,0x60,0xa0);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Name:\n    case ProcedureParenthesis:\n        return QColor(0x00,0x00,0x00);\n\n    case Keyword:\n    case ArrayParenthesis:\n        return QColor(0x00,0x00,0x7f);\n\n    case Literal:\n    case ImmediateEvalLiteral:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Text:\n    case Base85String:\n        return QColor(0x7f,0x00,0x7f);\n\n    case HexString:\n        return QColor(0x3f,0x7f,0x3f);\n\n    case BadStringCharacter:\n        return QColor(0xff,0xff,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerPostScript::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case DSCComment:\n    case DSCCommentValue:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case ProcedureParenthesis:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n\n    case Text:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Times New Roman\", 11);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Times New Roman\", 12);\n#else\n        f = QFont(\"Bitstream Charter\", 10);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerPostScript::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"$error = == FontDirectory StandardEncoding UserObjects abs add \"\n            \"aload anchorsearch and arc arcn arcto array ashow astore atan \"\n            \"awidthshow begin bind bitshift bytesavailable cachestatus \"\n            \"ceiling charpath clear cleardictstack cleartomark clip clippath \"\n            \"closefile closepath concat concatmatrix copy copypage cos count \"\n            \"countdictstack countexecstack counttomark currentcmykcolor \"\n            \"currentcolorspace currentdash currentdict currentfile \"\n            \"currentflat currentfont currentgray currenthsbcolor \"\n            \"currentlinecap currentlinejoin currentlinewidth currentmatrix \"\n            \"currentmiterlimit currentpagedevice currentpoint currentrgbcolor \"\n            \"currentscreen currenttransfer cvi cvlit cvn cvr cvrs cvs cvx def \"\n            \"defaultmatrix definefont dict dictstack div dtransform dup echo \"\n            \"end eoclip eofill eq erasepage errordict exch exec execstack \"\n            \"executeonly executive exit exp false file fill findfont \"\n            \"flattenpath floor flush flushfile for forall ge get getinterval \"\n            \"grestore grestoreall gsave gt idetmatrix idiv idtransform if \"\n            \"ifelse image imagemask index initclip initgraphics initmatrix \"\n            \"inustroke invertmatrix itransform known kshow le length lineto \"\n            \"ln load log loop lt makefont mark matrix maxlength mod moveto \"\n            \"mul ne neg newpath noaccess nor not null nulldevice or pathbbox \"\n            \"pathforall pop print prompt pstack put putinterval quit rand \"\n            \"rcheck rcurveto read readhexstring readline readonly readstring \"\n            \"rectstroke repeat resetfile restore reversepath rlineto rmoveto \"\n            \"roll rotate round rrand run save scale scalefont search \"\n            \"setblackgeneration setcachedevice setcachelimit setcharwidth \"\n            \"setcolorscreen setcolortransfer setdash setflat setfont setgray \"\n            \"sethsbcolor setlinecap setlinejoin setlinewidth setmatrix \"\n            \"setmiterlimit setpagedevice setrgbcolor setscreen settransfer \"\n            \"setvmthreshold show showpage sin sqrt srand stack start status \"\n            \"statusdict stop stopped store string stringwidth stroke \"\n            \"strokepath sub systemdict token token transform translate true \"\n            \"truncate type ueofill undefineresource userdict usertime version \"\n            \"vmstatus wcheck where widthshow write writehexstring writestring \"\n            \"xcheck xor\";\n\n    if (set == 2)\n        return\n            \"GlobalFontDirectory ISOLatin1Encoding SharedFontDirectory \"\n            \"UserObject arct colorimage cshow currentblackgeneration \"\n            \"currentcacheparams currentcmykcolor currentcolor \"\n            \"currentcolorrendering currentcolorscreen currentcolorspace \"\n            \"currentcolortransfer currentdevparams currentglobal \"\n            \"currentgstate currenthalftone currentobjectformat \"\n            \"currentoverprint currentpacking currentpagedevice currentshared \"\n            \"currentstrokeadjust currentsystemparams currentundercolorremoval \"\n            \"currentuserparams defineresource defineuserobject deletefile \"\n            \"execform execuserobject filenameforall fileposition filter \"\n            \"findencoding findresource gcheck globaldict glyphshow gstate \"\n            \"ineofill infill instroke inueofill inufill inustroke \"\n            \"languagelevel makepattern packedarray printobject product \"\n            \"realtime rectclip rectfill rectstroke renamefile resourceforall \"\n            \"resourcestatus revision rootfont scheck selectfont serialnumber \"\n            \"setbbox setblackgeneration setcachedevice2 setcacheparams \"\n            \"setcmykcolor setcolor setcolorrendering setcolorscreen \"\n            \"setcolorspace setcolortranfer setdevparams setfileposition \"\n            \"setglobal setgstate sethalftone setobjectformat setoverprint \"\n            \"setpacking setpagedevice setpattern setshared setstrokeadjust \"\n            \"setsystemparams setucacheparams setundercolorremoval \"\n            \"setuserparams setvmthreshold shareddict startjob uappend ucache \"\n            \"ucachestatus ueofill ufill undef undefinefont undefineresource \"\n            \"undefineuserobject upath ustroke ustrokepath vmreclaim \"\n            \"writeobject xshow xyshow yshow\";\n\n    if (set == 3)\n        return\n            \"cliprestore clipsave composefont currentsmoothness \"\n            \"findcolorrendering setsmoothness shfill\";\n\n    if (set == 4)\n        return\n            \".begintransparencygroup .begintransparencymask .bytestring \"\n            \".charboxpath .currentaccuratecurves .currentblendmode \"\n            \".currentcurvejoin .currentdashadapt .currentdotlength \"\n            \".currentfilladjust2 .currentlimitclamp .currentopacityalpha \"\n            \".currentoverprintmode .currentrasterop .currentshapealpha \"\n            \".currentsourcetransparent .currenttextknockout \"\n            \".currenttexturetransparent .dashpath .dicttomark \"\n            \".discardtransparencygroup .discardtransparencymask \"\n            \".endtransparencygroup .endtransparencymask .execn .filename \"\n            \".filename .fileposition .forceput .forceundef .forgetsave \"\n            \".getbitsrect .getdevice .inittransparencymask .knownget \"\n            \".locksafe .makeoperator .namestring .oserrno .oserrorstring \"\n            \".peekstring .rectappend .runandhide .setaccuratecurves \"\n            \".setblendmode .setcurvejoin .setdashadapt .setdebug \"\n            \".setdefaultmatrix .setdotlength .setfilladjust2 .setlimitclamp \"\n            \".setmaxlength .setopacityalpha .setoverprintmode .setrasterop \"\n            \".setsafe .setshapealpha .setsourcetransparent .settextknockout \"\n            \".settexturetransparent .stringbreak .stringmatch .tempfile \"\n            \".type1decrypt .type1encrypt .type1execchar .unread arccos \"\n            \"arcsin copydevice copyscanlines currentdevice finddevice \"\n            \"findlibfile findprotodevice flushpage getdeviceprops getenv \"\n            \"makeimagedevice makewordimagedevice max min putdeviceprops \"\n            \"setdevice\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerPostScript::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case DSCComment:\n        return tr(\"DSC comment\");\n\n    case DSCCommentValue:\n        return tr(\"DSC comment value\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Name:\n        return tr(\"Name\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case Literal:\n        return tr(\"Literal\");\n\n    case ImmediateEvalLiteral:\n        return tr(\"Immediately evaluated literal\");\n\n    case ArrayParenthesis:\n        return tr(\"Array parenthesis\");\n\n    case DictionaryParenthesis:\n        return tr(\"Dictionary parenthesis\");\n\n    case ProcedureParenthesis:\n        return tr(\"Procedure parenthesis\");\n\n    case Text:\n        return tr(\"Text\");\n\n    case HexString:\n        return tr(\"Hexadecimal string\");\n\n    case Base85String:\n        return tr(\"Base85 string\");\n\n    case BadStringCharacter:\n        return tr(\"Bad string character\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerPostScript::defaultPaper(int style) const\n{\n    if (style == BadStringCharacter)\n        return QColor(0xff,0x00,0x00);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerPostScript::refreshProperties()\n{\n    setTokenizeProp();\n    setLevelProp();\n    setCompactProp();\n    setAtElseProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerPostScript::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n    int i_val;\n\n    flag = qs.readBoolEntry(prefix + \"pstokenize\", true, &ok);\n\n    if (ok)\n        ps_tokenize = flag;\n    else\n        rc = false;\n\n    i_val = qs.readNumEntry(prefix + \"pslevel\", 3, &ok);\n\n    if (ok)\n        ps_level = i_val;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldatelse\", false, &ok);\n\n    if (ok)\n        fold_atelse = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerPostScript::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"pstokenize\", ps_tokenize))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"pslevel\", ps_level))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldatelse\", fold_atelse))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return true if tokens are marked.\nbool QsciLexerPostScript::tokenize() const\n{\n    return ps_tokenize;\n}\n\n\n// Set if tokens are marked.\nvoid QsciLexerPostScript::setTokenize(bool tokenize)\n{\n    ps_tokenize = tokenize;\n\n    setTokenizeProp();\n}\n\n\n// Set the \"ps.tokenize\" property.\nvoid QsciLexerPostScript::setTokenizeProp()\n{\n    emit propertyChanged(\"ps.tokenize\",(ps_tokenize ? \"1\" : \"0\"));\n}\n\n\n// Return the PostScript level.\nint QsciLexerPostScript::level() const\n{\n    return ps_level;\n}\n\n\n// Set the PostScript level.\nvoid QsciLexerPostScript::setLevel(int level)\n{\n    ps_level = level;\n\n    setLevelProp();\n}\n\n\n// Set the \"ps.level\" property.\nvoid QsciLexerPostScript::setLevelProp()\n{\n    emit propertyChanged(\"ps.level\", QString::number(ps_level));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerPostScript::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerPostScript::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerPostScript::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Return true if else blocks can be folded.\nbool QsciLexerPostScript::foldAtElse() const\n{\n    return fold_atelse;\n}\n\n\n// Set if else blocks can be folded.\nvoid QsciLexerPostScript::setFoldAtElse(bool fold)\n{\n    fold_atelse = fold;\n\n    setAtElseProp();\n}\n\n\n// Set the \"fold.at.else\" property.\nvoid QsciLexerPostScript::setAtElseProp()\n{\n    emit propertyChanged(\"fold.at.else\",(fold_atelse ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerpov.cpp",
    "content": "// This module implements the QsciLexerPOV class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerpov.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerPOV::QsciLexerPOV(QObject *parent, const char *name)\n    : QsciLexer(parent,name),\n      fold_comments(false), fold_compact(true), fold_directives(false) \n{\n}\n\n\n// The dtor.\nQsciLexerPOV::~QsciLexerPOV()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerPOV::language() const\n{\n    return \"POV\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerPOV::lexer() const\n{\n    return \"pov\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerPOV::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerPOV::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_#\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerPOV::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0xff,0x00,0x80);\n\n    case Comment:\n    case CommentLine:\n        return QColor(0x00,0x7f,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Operator:\n        return QColor(0x00,0x00,0x00);\n\n    case String:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Directive:\n        return QColor(0x7f,0x7f,0x00);\n\n    case BadDirective:\n        return QColor(0x80,0x40,0x20);\n\n    case ObjectsCSGAppearance:\n    case TypesModifiersItems:\n    case PredefinedIdentifiers:\n    case PredefinedFunctions:\n    case KeywordSet6:\n    case KeywordSet7:\n    case KeywordSet8:\n        return QColor(0x00,0x00,0x7f);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerPOV::defaultEolFill(int style) const\n{\n    if (style == UnclosedString)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerPOV::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case CommentLine:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case UnclosedString:\n    case PredefinedIdentifiers:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case BadDirective:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        f.setItalic(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerPOV::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"declare local include undef fopen fclose read write \"\n            \"default version case range break debug error \"\n            \"warning if ifdef ifndef switch while macro else end\";\n\n    if (set == 2)\n        return\n            \"camera light_source light_group object blob sphere \"\n            \"cylinder box cone height_field julia_fractal lathe \"\n            \"prism sphere_sweep superellipsoid sor text torus \"\n            \"bicubic_patch disc mesh mesh2 polygon triangle \"\n            \"smooth_triangle plane poly cubic quartic quadric \"\n            \"isosurface parametric union intersection difference \"\n            \"merge function array spline vertex_vectors \"\n            \"normal_vectors uv_vectors face_indices \"\n            \"normal_indices uv_indices texture texture_list \"\n            \"interior_texture texture_map material_map image_map \"\n            \"color_map colour_map pigment_map normal_map \"\n            \"slope_map bump_map density_map pigment normal \"\n            \"material interior finish reflection irid slope \"\n            \"pigment_pattern image_pattern warp media scattering \"\n            \"density background fog sky_sphere rainbow \"\n            \"global_settings radiosity photons pattern transform \"\n            \"looks_like projected_through contained_by \"\n            \"clipped_by bounded_by\";\n\n    if (set == 3)\n        return\n            \"linear_spline quadratic_spline cubic_spline \"\n            \"natural_spline bezier_spline b_spline read write \"\n            \"append inverse open perspective orthographic \"\n            \"fisheye ultra_wide_angle omnimax panoramic \"\n            \"spherical spotlight jitter circular orient \"\n            \"media_attenuation media_interaction shadowless \"\n            \"parallel refraction collect pass_through \"\n            \"global_lights hierarchy sturm smooth gif tga iff \"\n            \"pot png pgm ppm jpeg tiff sys ttf quaternion \"\n            \"hypercomplex linear_sweep conic_sweep type \"\n            \"all_intersections split_union cutaway_textures \"\n            \"no_shadow no_image no_reflection double_illuminate \"\n            \"hollow uv_mapping all use_index use_color \"\n            \"use_colour no_bump_scale conserve_energy fresnel \"\n            \"average agate boxed bozo bumps cells crackle \"\n            \"cylindrical density_file dents facets granite \"\n            \"leopard marble onion planar quilted radial ripples \"\n            \"spotted waves wood wrinkles solid use_alpha \"\n            \"interpolate magnet noise_generator toroidal \"\n            \"ramp_wave triangle_wave sine_wave scallop_wave \"\n            \"cubic_wave poly_wave once map_type method fog_type \"\n            \"hf_gray_16 charset ascii utf8 rotate scale \"\n            \"translate matrix location right up direction sky \"\n            \"angle look_at aperture blur_samples focal_point \"\n            \"confidence variance radius falloff tightness \"\n            \"point_at area_light adaptive fade_distance \"\n            \"fade_power threshold strength water_level tolerance \"\n            \"max_iteration precision slice u_steps v_steps \"\n            \"flatness inside_vector accuracy max_gradient \"\n            \"evaluate max_trace precompute target ior dispersion \"\n            \"dispersion_samples caustics color colour rgb rgbf \"\n            \"rgbt rgbft red green blue filter transmit gray hf \"\n            \"fade_color fade_colour quick_color quick_colour \"\n            \"brick checker hexagon brick_size mortar bump_size \"\n            \"ambient diffuse brilliance crand phong phong_size \"\n            \"metallic specular roughness reflection_exponent \"\n            \"exponent thickness gradient spiral1 spiral2 \"\n            \"agate_turb form metric offset df3 coords size \"\n            \"mandel exterior julia control0 control1 altitude \"\n            \"turbulence octaves omega lambda repeat flip \"\n            \"black-hole orientation dist_exp major_radius \"\n            \"frequency phase intervals samples ratio absorption \"\n            \"emission aa_threshold aa_level eccentricity \"\n            \"extinction distance turb_depth fog_offset fog_alt \"\n            \"width arc_angle falloff_angle adc_bailout \"\n            \"ambient_light assumed_gamma irid_wavelength \"\n            \"number_of_waves always_sample brigthness count \"\n            \"error_bound gray_threshold load_file \"\n            \"low_error_factor max_sample minimum_reuse \"\n            \"nearest_count pretrace_end pretrace_start \"\n            \"recursion_limit save_file spacing gather \"\n            \"max_trace_level autostop expand_thresholds\";\n\n    if (set == 4)\n        return\n            \"x y z t u v yes no true false on off clock \"\n            \"clock_delta clock_on final_clock final_frame \"\n            \"frame_number image_height image_width initial_clock \"\n            \"initial_frame pi version\";\n\n    if (set == 5)\n        return\n            \"abs acos acosh asc asin asinh atan atanh atan2 ceil \"\n            \"cos cosh defined degrees dimensions dimension_size \"\n            \"div exp file_exists floor inside int ln log max min \"\n            \"mod pow prod radians rand seed select sin sinh sqrt \"\n            \"strcmp strlen sum tan tanh val vdot vlength \"\n            \"min_extent max_extent trace vaxis_rotate vcross \"\n            \"vrotate vnormalize vturbulence chr concat str \"\n            \"strlwr strupr substr vstr sqr cube reciprocal pwr\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerPOV::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case CommentLine:\n        return tr(\"Comment line\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case String:\n        return tr(\"String\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case Directive:\n        return tr(\"Directive\");\n\n    case BadDirective:\n        return tr(\"Bad directive\");\n\n    case ObjectsCSGAppearance:\n        return tr(\"Objects, CSG and appearance\");\n\n    case TypesModifiersItems:\n        return tr(\"Types, modifiers and items\");\n\n    case PredefinedIdentifiers:\n        return tr(\"Predefined identifiers\");\n\n    case PredefinedFunctions:\n        return tr(\"Predefined functions\");\n\n    case KeywordSet6:\n        return tr(\"User defined 1\");\n\n    case KeywordSet7:\n        return tr(\"User defined 2\");\n\n    case KeywordSet8:\n        return tr(\"User defined 3\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerPOV::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case UnclosedString:\n        return QColor(0xe0,0xc0,0xe0);\n\n    case ObjectsCSGAppearance:\n        return QColor(0xff,0xd0,0xd0);\n\n    case TypesModifiersItems:\n        return QColor(0xff,0xff,0xd0);\n\n    case PredefinedFunctions:\n        return QColor(0xd0,0xd0,0xff);\n\n    case KeywordSet6:\n        return QColor(0xd0,0xff,0xd0);\n\n    case KeywordSet7:\n        return QColor(0xd0,0xd0,0xd0);\n\n    case KeywordSet8:\n        return QColor(0xe0,0xe0,0xe0);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerPOV::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n    setDirectiveProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerPOV::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"folddirectives\", false, &ok);\n\n    if (ok)\n        fold_directives = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerPOV::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"folddirectives\", fold_directives))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerPOV::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerPOV::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerPOV::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerPOV::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerPOV::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerPOV::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Return true if directives can be folded.\nbool QsciLexerPOV::foldDirectives() const\n{\n    return fold_directives;\n}\n\n\n// Set if directives can be folded.\nvoid QsciLexerPOV::setFoldDirectives(bool fold)\n{\n    fold_directives = fold;\n\n    setDirectiveProp();\n}\n\n\n// Set the \"fold.directive\" property.\nvoid QsciLexerPOV::setDirectiveProp()\n{\n    emit propertyChanged(\"fold.directive\",(fold_directives ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerproperties.cpp",
    "content": "// This module implements the QsciLexerProperties class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerproperties.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerProperties::QsciLexerProperties(QObject *parent, const char *name)\n    : QsciLexer(parent, name),\n      fold_compact(true), initial_spaces(true)\n{\n}\n\n\n// The dtor.\nQsciLexerProperties::~QsciLexerProperties()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerProperties::language() const\n{\n    return \"Properties\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerProperties::lexer() const\n{\n    return \"props\";\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerProperties::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerProperties::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Comment:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Section:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Assignment:\n        return QColor(0xb0,0x60,0x00);\n\n    case DefaultValue:\n        return QColor(0x7f,0x7f,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerProperties::defaultEolFill(int style) const\n{\n    if (style == Section)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerProperties::defaultFont(int style) const\n{\n    QFont f;\n\n    if (style == Comment)\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n    else\n        f = QsciLexer::defaultFont(style);\n\n    return f;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerProperties::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Section:\n        return tr(\"Section\");\n\n    case Assignment:\n        return tr(\"Assignment\");\n\n    case DefaultValue:\n        return tr(\"Default value\");\n\n    case Key:\n        return tr(\"Key\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerProperties::defaultPaper(int style) const\n{\n    if (style == Section)\n        return QColor(0xe0,0xf0,0xf0);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerProperties::refreshProperties()\n{\n    setCompactProp();\n    setInitialSpacesProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerProperties::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"initialspaces\", true, &ok);\n\n    if (ok)\n        initial_spaces = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerProperties::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"initialspaces\", initial_spaces))\n        rc = false;\n\n    return rc;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerProperties::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerProperties::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\", (fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Set if initial spaces are allowed.\nvoid QsciLexerProperties::setInitialSpaces(bool enable)\n{\n    initial_spaces = enable;\n\n    setInitialSpacesProp();\n}\n\n\n// Set the \"lexer.props.allow.initial.spaces\" property.\nvoid QsciLexerProperties::setInitialSpacesProp()\n{\n    emit propertyChanged(\"lexer.props.allow.initial.spaces\", (fold_compact ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerpython.cpp",
    "content": "// This module implements the QsciLexerPython class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerpython.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The list of Python keywords that can be used by other friendly lexers.\nconst char *QsciLexerPython::keywordClass =\n    \"and as assert break class continue def del elif else except exec \"\n    \"finally for from global if import in is lambda None not or pass \"\n    \"print raise return try while with yield\";\n\n\n// The ctor.\nQsciLexerPython::QsciLexerPython(QObject *parent, const char *name)\n    : QsciLexer(parent, name),\n      fold_comments(false), fold_compact(true), fold_quotes(false),\n      indent_warn(NoWarning), strings_over_newline(false), v2_unicode(true),\n      v3_binary_octal(true), v3_bytes(true), highlight_subids(true)\n{\n}\n\n\n// The dtor.\nQsciLexerPython::~QsciLexerPython()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerPython::language() const\n{\n    return \"Python\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerPython::lexer() const\n{\n    return \"python\";\n}\n\n\n// Return the view used for indentation guides.\nint QsciLexerPython::indentationGuideView() const\n{\n    return QsciScintillaBase::SC_IV_LOOKFORWARD;\n}\n\n\n// Return the set of character sequences that can separate auto-completion\n// words.\nQStringList QsciLexerPython::autoCompletionWordSeparators() const\n{\n    QStringList wl;\n\n    wl << \".\";\n\n    return wl;\n}\n\n// Return the list of characters that can start a block.\nconst char *QsciLexerPython::blockStart(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \":\";\n}\n\n\n// Return the number of lines to look back when auto-indenting.\nint QsciLexerPython::blockLookback() const\n{\n    // This must be 0 otherwise de-indenting a Python block gets very\n    // difficult.\n    return 0;\n}\n\n\n// Return the style used for braces.\nint QsciLexerPython::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerPython::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case TripleSingleQuotedString:\n    case TripleDoubleQuotedString:\n        return QColor(0x7f,0x00,0x00);\n\n    case ClassName:\n        return QColor(0x00,0x00,0xff);\n\n    case FunctionMethodName:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Operator:\n    case Identifier:\n        break;\n\n    case CommentBlock:\n        return QColor(0x7f,0x7f,0x7f);\n\n    case UnclosedString:\n        return QColor(0x00,0x00,0x00);\n\n    case HighlightedIdentifier:\n        return QColor(0x40,0x70,0x90);\n\n    case Decorator:\n        return QColor(0x80,0x50,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerPython::defaultEolFill(int style) const\n{\n    if (style == UnclosedString)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerPython::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case UnclosedString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    case Keyword:\n    case ClassName:\n    case FunctionMethodName:\n    case Operator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerPython::keywords(int set) const\n{\n    if (set != 1)\n        return 0;\n\n    return keywordClass;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerPython::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case TripleSingleQuotedString:\n        return tr(\"Triple single-quoted string\");\n\n    case TripleDoubleQuotedString:\n        return tr(\"Triple double-quoted string\");\n\n    case ClassName:\n        return tr(\"Class name\");\n\n    case FunctionMethodName:\n        return tr(\"Function or method name\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case CommentBlock:\n        return tr(\"Comment block\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case HighlightedIdentifier:\n        return tr(\"Highlighted identifier\");\n\n    case Decorator:\n        return tr(\"Decorator\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerPython::defaultPaper(int style) const\n{\n    if (style == UnclosedString)\n        return QColor(0xe0,0xc0,0xe0);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerPython::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n    setQuotesProp();\n    setTabWhingeProp();\n    setStringsOverNewlineProp();\n    setV2UnicodeProp();\n    setV3BinaryOctalProp();\n    setV3BytesProp();\n    setHighlightSubidsProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerPython::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true, num;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldquotes\", false, &ok);\n\n    if (ok)\n        fold_quotes = flag;\n    else\n        rc = false;\n\n    num = qs.readNumEntry(prefix + \"indentwarning\", (int)NoWarning, &ok);\n\n    if (ok)\n        indent_warn = (IndentationWarning)num;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"stringsovernewline\", false, &ok);\n\n    if (ok)\n        strings_over_newline = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"v2unicode\", true, &ok);\n\n    if (ok)\n        v2_unicode = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"v3binaryoctal\", true, &ok);\n\n    if (ok)\n        v3_binary_octal = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"v3bytes\", true, &ok);\n\n    if (ok)\n        v3_bytes = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"highlightsubids\", true, &ok);\n\n    if (ok)\n        highlight_subids = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerPython::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldquotes\", fold_quotes))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"indentwarning\", (int)indent_warn))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"stringsovernewline\", strings_over_newline))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"v2unicode\", v2_unicode))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"v3binaryoctal\", v3_binary_octal))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"v3bytes\", v3_bytes))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"highlightsubids\", highlight_subids))\n        rc = false;\n\n    return rc;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerPython::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment.python\" property.\nvoid QsciLexerPython::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment.python\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Set if folds are compact.\nvoid QsciLexerPython::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerPython::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Set if quotes can be folded.\nvoid QsciLexerPython::setFoldQuotes(bool fold)\n{\n    fold_quotes = fold;\n\n    setQuotesProp();\n}\n\n\n// Set the \"fold.quotes.python\" property.\nvoid QsciLexerPython::setQuotesProp()\n{\n    emit propertyChanged(\"fold.quotes.python\",(fold_quotes ? \"1\" : \"0\"));\n}\n\n\n// Set the indentation warning.\nvoid QsciLexerPython::setIndentationWarning(QsciLexerPython::IndentationWarning warn)\n{\n    indent_warn = warn;\n\n    setTabWhingeProp();\n}\n\n\n// Set the \"tab.timmy.whinge.level\" property.\nvoid QsciLexerPython::setTabWhingeProp()\n{\n    emit propertyChanged(\"tab.timmy.whinge.level\", QString::number(indent_warn));\n}\n\n\n// Set if string literals can span newlines.\nvoid QsciLexerPython::setStringsOverNewlineAllowed(bool allowed)\n{\n    strings_over_newline = allowed;\n\n    setStringsOverNewlineProp();\n}\n\n\n// Set the \"lexer.python.strings.u\" property.\nvoid QsciLexerPython::setStringsOverNewlineProp()\n{\n    emit propertyChanged(\"lexer.python.strings.over.newline\", (strings_over_newline ? \"1\" : \"0\"));\n}\n\n\n// Set if v2 unicode string literals are allowed.\nvoid QsciLexerPython::setV2UnicodeAllowed(bool allowed)\n{\n    v2_unicode = allowed;\n\n    setV2UnicodeProp();\n}\n\n\n// Set the \"lexer.python.strings.u\" property.\nvoid QsciLexerPython::setV2UnicodeProp()\n{\n    emit propertyChanged(\"lexer.python.strings.u\", (v2_unicode ? \"1\" : \"0\"));\n}\n\n\n// Set if v3 binary and octal literals are allowed.\nvoid QsciLexerPython::setV3BinaryOctalAllowed(bool allowed)\n{\n    v3_binary_octal = allowed;\n\n    setV3BinaryOctalProp();\n}\n\n\n// Set the \"lexer.python.literals.binary\" property.\nvoid QsciLexerPython::setV3BinaryOctalProp()\n{\n    emit propertyChanged(\"lexer.python.literals.binary\", (v3_binary_octal ? \"1\" : \"0\"));\n}\n\n\n// Set if v3 bytes string literals are allowed.\nvoid QsciLexerPython::setV3BytesAllowed(bool allowed)\n{\n    v3_bytes = allowed;\n\n    setV3BytesProp();\n}\n\n\n// Set the \"lexer.python.strings.b\" property.\nvoid QsciLexerPython::setV3BytesProp()\n{\n    emit propertyChanged(\"lexer.python.strings.b\",(v3_bytes ? \"1\" : \"0\"));\n}\n\n\n// Set if sub-identifiers are highlighted.\nvoid QsciLexerPython::setHighlightSubidentifiers(bool enabled)\n{\n    highlight_subids = enabled;\n\n    setHighlightSubidsProp();\n}\n\n\n// Set the \"lexer.python.keywords2.no.sub.identifiers\" property.\nvoid QsciLexerPython::setHighlightSubidsProp()\n{\n    emit propertyChanged(\"lexer.python.keywords2.no.sub.identifiers\",\n            (highlight_subids ? \"0\" : \"1\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerruby.cpp",
    "content": "// This module implements the QsciLexerRuby class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerruby.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerRuby::QsciLexerRuby(QObject *parent, const char *name)\n    : QsciLexer(parent, name),\n      fold_comments(false), fold_compact(true)\n{\n}\n\n\n// The dtor.\nQsciLexerRuby::~QsciLexerRuby()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerRuby::language() const\n{\n    return \"Ruby\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerRuby::lexer() const\n{\n    return \"ruby\";\n}\n\n\n// Return the list of words that can start a block.\nconst char *QsciLexerRuby::blockStart(int *style) const\n{\n    if (style)\n        *style = Keyword;\n\n    return \"do\";\n}\n\n\n// Return the list of words that can start end a block.\nconst char *QsciLexerRuby::blockEnd(int *style) const\n{\n    if (style)\n        *style = Keyword;\n\n    return \"end\";\n}\n\n\n// Return the list of words that can start end a block.\nconst char *QsciLexerRuby::blockStartKeyword(int *style) const\n{\n    if (style)\n        *style = Keyword;\n\n    return \"def class if do elsif else case while for\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerRuby::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerRuby::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case POD:\n        return QColor(0x00,0x40,0x00);\n\n    case Number:\n    case FunctionMethodName:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n    case DemotedKeyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case HereDocument:\n    case PercentStringq:\n    case PercentStringQ:\n        return QColor(0x7f,0x00,0x7f);\n\n    case ClassName:\n        return QColor(0x00,0x00,0xff);\n\n    case Regex:\n    case HereDocumentDelimiter:\n    case PercentStringr:\n    case PercentStringw:\n        return QColor(0x00,0x00,0x00);\n\n    case Global:\n        return QColor(0x80,0x00,0x80);\n\n    case Symbol:\n        return QColor(0xc0,0xa0,0x30);\n\n    case ModuleName:\n        return QColor(0xa0,0x00,0xa0);\n\n    case InstanceVariable:\n        return QColor(0xb0,0x00,0x80);\n\n    case ClassVariable:\n        return QColor(0x80,0x00,0xb0);\n\n    case Backticks:\n    case PercentStringx:\n        return QColor(0xff,0xff,0x00);\n\n    case DataSection:\n        return QColor(0x60,0x00,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerRuby::defaultEolFill(int style) const\n{\n    bool fill;\n\n    switch (style)\n    {\n    case POD:\n    case DataSection:\n    case HereDocument:\n        fill = true;\n        break;\n\n    default:\n        fill = QsciLexer::defaultEolFill(style);\n    }\n\n    return fill;\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerRuby::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case POD:\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case PercentStringq:\n    case PercentStringQ:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    case Keyword:\n    case ClassName:\n    case FunctionMethodName:\n    case Operator:\n    case ModuleName:\n    case DemotedKeyword:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerRuby::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"__FILE__ and def end in or self unless __LINE__ \"\n            \"begin defined? ensure module redo super until BEGIN \"\n            \"break do false next rescue then when END case else \"\n            \"for nil require retry true while alias class elsif \"\n            \"if not return undef yield\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerRuby::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Error:\n        return tr(\"Error\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case POD:\n        return tr(\"POD\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case ClassName:\n        return tr(\"Class name\");\n\n    case FunctionMethodName:\n        return tr(\"Function or method name\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case Regex:\n        return tr(\"Regular expression\");\n\n    case Global:\n        return tr(\"Global\");\n\n    case Symbol:\n        return tr(\"Symbol\");\n\n    case ModuleName:\n        return tr(\"Module name\");\n\n    case InstanceVariable:\n        return tr(\"Instance variable\");\n\n    case ClassVariable:\n        return tr(\"Class variable\");\n\n    case Backticks:\n        return tr(\"Backticks\");\n\n    case DataSection:\n        return tr(\"Data section\");\n\n    case HereDocumentDelimiter:\n        return tr(\"Here document delimiter\");\n\n    case HereDocument:\n        return tr(\"Here document\");\n\n    case PercentStringq:\n        return tr(\"%q string\");\n\n    case PercentStringQ:\n        return tr(\"%Q string\");\n\n    case PercentStringx:\n        return tr(\"%x string\");\n\n    case PercentStringr:\n        return tr(\"%r string\");\n\n    case PercentStringw:\n        return tr(\"%w string\");\n\n    case DemotedKeyword:\n        return tr(\"Demoted keyword\");\n\n    case Stdin:\n        return tr(\"stdin\");\n\n    case Stdout:\n        return tr(\"stdout\");\n\n    case Stderr:\n        return tr(\"stderr\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerRuby::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case Error:\n        return QColor(0xff,0x00,0x00);\n\n    case POD:\n        return QColor(0xc0,0xff,0xc0);\n\n    case Regex:\n    case PercentStringr:\n        return QColor(0xa0,0xff,0xa0);\n\n    case Backticks:\n    case PercentStringx:\n        return QColor(0xa0,0x80,0x80);\n\n    case DataSection:\n        return QColor(0xff,0xf0,0xd8);\n\n    case HereDocumentDelimiter:\n    case HereDocument:\n        return QColor(0xdd,0xd0,0xdd);\n\n    case PercentStringw:\n        return QColor(0xff,0xff,0xe0);\n\n    case Stdin:\n    case Stdout:\n    case Stderr:\n        return QColor(0xff,0x80,0x80);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerRuby::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerRuby::readProperties(QSettings &qs, const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = true;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerRuby::writeProperties(QSettings &qs, const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    return rc;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerRuby::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerRuby::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\", (fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Set if folds are compact\nvoid QsciLexerRuby::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerRuby::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\", (fold_compact ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerspice.cpp",
    "content": "// This module implements the QsciLexerSpice class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerspice.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n\n\n// The ctor.\nQsciLexerSpice::QsciLexerSpice(QObject *parent, const char *name)\n    : QsciLexer(parent, name)\n{\n}\n\n\n// The dtor.\nQsciLexerSpice::~QsciLexerSpice()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerSpice::language() const\n{\n    return \"Spice\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerSpice::lexer() const\n{\n    return \"spice\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerSpice::braceStyle() const\n{\n    return Parameter;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerSpice::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"ac alias alter alterparam append askvalues assertvalid \"\n            \"autoscale break compose copy copytodoc dc delete destroy \"\n            \"destroyvec diff display disto dowhile echo else end errorstop \"\n            \"fftinit filter foreach fourier freqtotime function \"\n            \"functionundef goto homecursors if isdisplayed label let \"\n            \"linearize listing load loadaccumulator makelabel movelabel \"\n            \"makesmithplot movecursorleft movecursorright msgbox nameplot \"\n            \"newplot nextparam noise nopoints op plot plotf plotref poly \"\n            \"print printcursors printevent printname printplot printstatus \"\n            \"printtext printtol printunits printval printvector pwl pz quit \"\n            \"removesmithplot rename repeat resume rotate runs rusage save \"\n            \"sendplot sendscript sens set setcursor setdoc setlabel \"\n            \"setlabeltype setmargins setnthtrigger setunits setvec setparam \"\n            \"setplot setquery setscaletype settracecolor settracestyle \"\n            \"setsource settrigger setvec setxlimits setylimits show showmod \"\n            \"sort status step stop switch tf timetofreq timetowave tran \"\n            \"unalias unlet unset unalterparam update version view wavefilter \"\n            \"wavetotime where while write\";\n\n    if (set == 2)\n        return\n            \"abs askvalue atan average ceil cos db differentiate \"\n            \"differentiatex exp finalvalue floor getcursorx getcursory \"\n            \"getcursory0 getcursory1 getparam im ln initialvalue integrate \"\n            \"integratex interpolate isdef isdisplayed j log length mag max \"\n            \"maxscale mean meanpts min minscale nextplot nextvector norm \"\n            \"operatingpoint ph phase phaseextend pk_pk pos pulse re rms \"\n            \"rmspts rnd sameplot sin sqrt stddev stddevpts tan tfall \"\n            \"tolerance trise unitvec vector\";\n\n    if (set == 3)\n        return \"param nodeset include options dcconv subckt ends model\";\n\n    return 0;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerSpice::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Command:\n    case Function:\n        return QColor(0x00,0x00,0x7f);\n\n    case Parameter:\n        return QColor(0x00,0x40,0xe0);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Delimiter:\n        return QColor(0x00,0x00,0x00);\n\n    case Value:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerSpice::defaultFont(int style) const\n{\n    QFont f;\n\n    if (style == Comment)\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n    else\n    {\n        f = QsciLexer::defaultFont(style);\n\n        if (style == Function || style == Delimiter)\n            f.setBold(true);\n    }\n\n    return f;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerSpice::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case Command:\n        return tr(\"Command\");\n\n    case Function:\n        return tr(\"Function\");\n\n    case Parameter:\n        return tr(\"Parameter\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Delimiter:\n        return tr(\"Delimiter\");\n\n    case Value:\n        return tr(\"Value\");\n\n    case Comment:\n        return tr(\"Comment\");\n    }\n\n    return QString();\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexersql.cpp",
    "content": "// This module implements the QsciLexerSQL class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexersql.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerSQL::QsciLexerSQL(QObject *parent, const char *name)\n    : QsciLexer(parent, name),\n      at_else(false), fold_comments(false), fold_compact(true),\n      only_begin(false), backticks_identifier(false),\n      numbersign_comment(false), backslash_escapes(false),\n      allow_dotted_word(false)\n{\n}\n\n\n// The dtor.\nQsciLexerSQL::~QsciLexerSQL()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerSQL::language() const\n{\n    return \"SQL\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerSQL::lexer() const\n{\n    return \"sql\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerSQL::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerSQL::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Comment:\n    case CommentLine:\n    case PlusPrompt:\n    case PlusComment:\n    case CommentLineHash:\n        return QColor(0x00,0x7f,0x00);\n\n    case CommentDoc:\n        return QColor(0x7f,0x7f,0x7f);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n        return QColor(0x7f,0x00,0x7f);\n\n    case PlusKeyword:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Operator:\n    case Identifier:\n        break;\n\n    case CommentDocKeyword:\n        return QColor(0x30,0x60,0xa0);\n\n    case CommentDocKeywordError:\n        return QColor(0x80,0x40,0x20);\n\n    case KeywordSet5:\n        return QColor(0x4b,0x00,0x82);\n\n    case KeywordSet6:\n        return QColor(0xb0,0x00,0x40);\n\n    case KeywordSet7:\n        return QColor(0x8b,0x00,0x00);\n\n    case KeywordSet8:\n        return QColor(0x80,0x00,0x80);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerSQL::defaultEolFill(int style) const\n{\n    if (style == PlusPrompt)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerSQL::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case CommentLine:\n    case PlusComment:\n    case CommentLineHash:\n    case CommentDocKeyword:\n    case CommentDocKeywordError:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case Operator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case PlusPrompt:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerSQL::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"absolute action add admin after aggregate alias all \"\n            \"allocate alter and any are array as asc assertion \"\n            \"at authorization before begin binary bit blob \"\n            \"boolean both breadth by call cascade cascaded case \"\n            \"cast catalog char character check class clob close \"\n            \"collate collation column commit completion connect \"\n            \"connection constraint constraints constructor \"\n            \"continue corresponding create cross cube current \"\n            \"current_date current_path current_role current_time \"\n            \"current_timestamp current_user cursor cycle data \"\n            \"date day deallocate dec decimal declare default \"\n            \"deferrable deferred delete depth deref desc \"\n            \"describe descriptor destroy destructor \"\n            \"deterministic dictionary diagnostics disconnect \"\n            \"distinct domain double drop dynamic each else end \"\n            \"end-exec equals escape every except exception exec \"\n            \"execute external false fetch first float for \"\n            \"foreign found from free full function general get \"\n            \"global go goto grant group grouping having host \"\n            \"hour identity if ignore immediate in indicator \"\n            \"initialize initially inner inout input insert int \"\n            \"integer intersect interval into is isolation \"\n            \"iterate join key language large last lateral \"\n            \"leading left less level like limit local localtime \"\n            \"localtimestamp locator map match minute modifies \"\n            \"modify module month names national natural nchar \"\n            \"nclob new next no none not null numeric object of \"\n            \"off old on only open operation option or order \"\n            \"ordinality out outer output pad parameter \"\n            \"parameters partial path postfix precision prefix \"\n            \"preorder prepare preserve primary prior privileges \"\n            \"procedure public read reads real recursive ref \"\n            \"references referencing relative restrict result \"\n            \"return returns revoke right role rollback rollup \"\n            \"routine row rows savepoint schema scroll scope \"\n            \"search second section select sequence session \"\n            \"session_user set sets size smallint some| space \"\n            \"specific specifictype sql sqlexception sqlstate \"\n            \"sqlwarning start state statement static structure \"\n            \"system_user table temporary terminate than then \"\n            \"time timestamp timezone_hour timezone_minute to \"\n            \"trailing transaction translation treat trigger \"\n            \"true under union unique unknown unnest update usage \"\n            \"user using value values varchar variable varying \"\n            \"view when whenever where with without work write \"\n            \"year zone\";\n\n    if (set == 3)\n        return\n            \"param author since return see deprecated todo\";\n\n    if (set == 4)\n        return\n            \"acc~ept a~ppend archive log attribute bre~ak \"\n            \"bti~tle c~hange cl~ear col~umn comp~ute conn~ect \"\n            \"copy def~ine del desc~ribe disc~onnect e~dit \"\n            \"exec~ute exit get help ho~st i~nput l~ist passw~ord \"\n            \"pau~se pri~nt pro~mpt quit recover rem~ark \"\n            \"repf~ooter reph~eader r~un sav~e set sho~w shutdown \"\n            \"spo~ol sta~rt startup store timi~ng tti~tle \"\n            \"undef~ine var~iable whenever oserror whenever \"\n            \"sqlerror\";\n\n    if (set == 5)\n        return\n            \"dbms_output.disable dbms_output.enable dbms_output.get_line \"\n            \"dbms_output.get_lines dbms_output.new_line dbms_output.put \"\n            \"dbms_output.put_line\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerSQL::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case CommentLine:\n        return tr(\"Comment line\");\n\n    case CommentDoc:\n        return tr(\"JavaDoc style comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case PlusKeyword:\n        return tr(\"SQL*Plus keyword\");\n\n    case PlusPrompt:\n        return tr(\"SQL*Plus prompt\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case PlusComment:\n        return tr(\"SQL*Plus comment\");\n\n    case CommentLineHash:\n        return tr(\"# comment line\");\n\n    case CommentDocKeyword:\n        return tr(\"JavaDoc keyword\");\n\n    case CommentDocKeywordError:\n        return tr(\"JavaDoc keyword error\");\n\n    case KeywordSet5:\n        return tr(\"User defined 1\");\n\n    case KeywordSet6:\n        return tr(\"User defined 2\");\n\n    case KeywordSet7:\n        return tr(\"User defined 3\");\n\n    case KeywordSet8:\n        return tr(\"User defined 4\");\n\n    case QuotedIdentifier:\n        return tr(\"Quoted identifier\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerSQL::defaultPaper(int style) const\n{\n    if (style == PlusPrompt)\n        return QColor(0xe0,0xff,0xe0);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerSQL::refreshProperties()\n{\n    setAtElseProp();\n    setCommentProp();\n    setCompactProp();\n    setOnlyBeginProp();\n    setBackticksIdentifierProp();\n    setNumbersignCommentProp();\n    setBackslashEscapesProp();\n    setAllowDottedWordProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerSQL::readProperties(QSettings &qs, const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"atelse\", false, &ok);\n\n    if (ok)\n        at_else = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"onlybegin\", false, &ok);\n\n    if (ok)\n        only_begin = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"backticksidentifier\", false, &ok);\n\n    if (ok)\n        backticks_identifier = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"numbersigncomment\", false, &ok);\n\n    if (ok)\n        numbersign_comment = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"backslashescapes\", false, &ok);\n\n    if (ok)\n        backslash_escapes = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"allowdottedword\", false, &ok);\n\n    if (ok)\n        allow_dotted_word = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerSQL::writeProperties(QSettings &qs, const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"atelse\", at_else))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"onlybegin\", only_begin))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"backticksidentifier\", backticks_identifier))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"numbersigncomment\", numbersign_comment))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"backslashescapes\", backslash_escapes))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"allowdottedword\", allow_dotted_word))\n        rc = false;\n\n    return rc;\n}\n\n\n// Set if ELSE blocks can be folded.\nvoid QsciLexerSQL::setFoldAtElse(bool fold)\n{\n    at_else = fold;\n\n    setAtElseProp();\n}\n\n\n// Set the \"fold.sql.at.else\" property.\nvoid QsciLexerSQL::setAtElseProp()\n{\n    emit propertyChanged(\"fold.sql.at.else\", (at_else ? \"1\" : \"0\"));\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerSQL::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerSQL::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\", (fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Set if folds are compact\nvoid QsciLexerSQL::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerSQL::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\", (fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Set if BEGIN blocks only can be folded.\nvoid QsciLexerSQL::setFoldOnlyBegin(bool fold)\n{\n    only_begin = fold;\n\n    setOnlyBeginProp();\n}\n\n\n// Set the \"fold.sql.only.begin\" property.\nvoid QsciLexerSQL::setOnlyBeginProp()\n{\n    emit propertyChanged(\"fold.sql.only.begin\", (only_begin ? \"1\" : \"0\"));\n}\n\n\n// Enable quoted identifiers.\nvoid QsciLexerSQL::setQuotedIdentifiers(bool enable)\n{\n    backticks_identifier = enable;\n\n    setBackticksIdentifierProp();\n}\n\n\n// Set the \"lexer.sql.backticks.identifier\" property.\nvoid QsciLexerSQL::setBackticksIdentifierProp()\n{\n    emit propertyChanged(\"lexer.sql.backticks.identifier\", (backticks_identifier ? \"1\" : \"0\"));\n}\n\n\n// Enable '#' as a comment character.\nvoid QsciLexerSQL::setHashComments(bool enable)\n{\n    numbersign_comment = enable;\n\n    setNumbersignCommentProp();\n}\n\n\n// Set the \"lexer.sql.numbersign.comment\" property.\nvoid QsciLexerSQL::setNumbersignCommentProp()\n{\n    emit propertyChanged(\"lexer.sql.numbersign.comment\", (numbersign_comment ? \"1\" : \"0\"));\n}\n\n\n// Enable/disable backslash escapes.\nvoid QsciLexerSQL::setBackslashEscapes(bool enable)\n{\n    backslash_escapes = enable;\n\n    setBackslashEscapesProp();\n}\n\n\n// Set the \"sql.backslash.escapes\" property.\nvoid QsciLexerSQL::setBackslashEscapesProp()\n{\n    emit propertyChanged(\"sql.backslash.escapes\", (backslash_escapes ? \"1\" : \"0\"));\n}\n\n\n// Enable dotted words.\nvoid QsciLexerSQL::setDottedWords(bool enable)\n{\n    allow_dotted_word = enable;\n\n    setAllowDottedWordProp();\n}\n\n\n// Set the \"lexer.sql.allow.dotted.word\" property.\nvoid QsciLexerSQL::setAllowDottedWordProp()\n{\n    emit propertyChanged(\"lexer.sql.allow.dotted.word\", (allow_dotted_word ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexertcl.cpp",
    "content": "// This module implements the QsciLexerTCL class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexertcl.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerTCL::QsciLexerTCL(QObject *parent, const char *name)\n    : QsciLexer(parent, name),\n      fold_comments(false)\n{\n}\n\n\n// The dtor.\nQsciLexerTCL::~QsciLexerTCL()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerTCL::language() const\n{\n    return \"TCL\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerTCL::lexer() const\n{\n    return \"tcl\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerTCL::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerTCL::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Comment:\n    case CommentLine:\n    case CommentBox:\n        return QColor(0x00,0x7f,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case QuotedKeyword:\n    case QuotedString:\n    case Modifier:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Operator:\n        return QColor(0x00,0x00,0x00);\n\n    case Identifier:\n    case ExpandKeyword:\n    case TCLKeyword:\n    case TkKeyword:\n    case ITCLKeyword:\n    case TkCommand:\n    case KeywordSet6:\n    case KeywordSet7:\n    case KeywordSet8:\n    case KeywordSet9:\n        return QColor(0x00,0x00,0x7f);\n\n    case Substitution:\n    case SubstitutionBrace:\n        return QColor(0x7f,0x7f,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerTCL::defaultEolFill(int style) const\n{\n    switch (style)\n    {\n    case QuotedString:\n    case CommentBox:\n        return true;\n    }\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerTCL::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case CommentLine:\n    case CommentBox:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\", 9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\", 9);\n#endif\n        break;\n\n    case QuotedKeyword:\n    case Operator:\n    case ExpandKeyword:\n    case TCLKeyword:\n    case TkKeyword:\n    case ITCLKeyword:\n    case TkCommand:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case CommentBlock:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\", 8);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 11);\n#else\n        f = QFont(\"Serif\", 9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerTCL::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"after append array auto_execok auto_import auto_load \"\n            \"auto_load_index auto_qualify beep bgerror binary break case \"\n            \"catch cd clock close concat continue dde default echo else \"\n            \"elseif encoding eof error eval exec exit expr fblocked \"\n            \"fconfigure fcopy file fileevent flush for foreach format gets \"\n            \"glob global history http if incr info interp join lappend lindex \"\n            \"linsert list llength load loadTk lrange lreplace lsearch lset \"\n            \"lsort memory msgcat namespace open package pid pkg::create \"\n            \"pkg_mkIndex Platform-specific proc puts pwd re_syntax read \"\n            \"regexp registry regsub rename resource return scan seek set \"\n            \"socket source split string subst switch tclLog tclMacPkgSearch \"\n            \"tclPkgSetup tclPkgUnknown tell time trace unknown unset update \"\n            \"uplevel upvar variable vwait while\";\n\n    if (set == 2)\n        return\n            \"bell bind bindtags bitmap button canvas checkbutton clipboard \"\n            \"colors console cursors destroy entry event focus font frame grab \"\n            \"grid image Inter-client keysyms label labelframe listbox lower \"\n            \"menu menubutton message option options pack panedwindow photo \"\n            \"place radiobutton raise scale scrollbar selection send spinbox \"\n            \"text tk tk_chooseColor tk_chooseDirectory tk_dialog tk_focusNext \"\n            \"tk_getOpenFile tk_messageBox tk_optionMenu tk_popup \"\n            \"tk_setPalette tkerror tkvars tkwait toplevel winfo wish wm\";\n\n    if (set == 3)\n        return\n            \"@scope body class code common component configbody constructor \"\n            \"define destructor hull import inherit itcl itk itk_component \"\n            \"itk_initialize itk_interior itk_option iwidgets keep method \"\n            \"private protected public\";\n\n    if (set == 4)\n        return\n            \"tk_bisque tk_chooseColor tk_dialog tk_focusFollowsMouse \"\n            \"tk_focusNext tk_focusPrev tk_getOpenFile tk_getSaveFile \"\n            \"tk_messageBox tk_optionMenu tk_popup tk_setPalette tk_textCopy \"\n            \"tk_textCut tk_textPaste tkButtonAutoInvoke tkButtonDown \"\n            \"tkButtonEnter tkButtonInvoke tkButtonLeave tkButtonUp \"\n            \"tkCancelRepeat tkCheckRadioDown tkCheckRadioEnter \"\n            \"tkCheckRadioInvoke tkColorDialog tkColorDialog_BuildDialog \"\n            \"tkColorDialog_CancelCmd tkColorDialog_Config \"\n            \"tkColorDialog_CreateSelector tkColorDialog_DrawColorScale \"\n            \"tkColorDialog_EnterColorBar tkColorDialog_HandleRGB Entry \"\n            \"tkColorDialog_HandleSelEntry tkColorDialog_InitValues \"\n            \"tkColorDialog_LeaveColorBar tkColorDialog_MoveSelector \"\n            \"tkColorDialog_OkCmd tkColorDialog_RedrawColorBars \"\n            \"tkColorDialog_RedrawFinalColor tkColorDialog_ReleaseMouse \"\n            \"tkColorDialog_ResizeColorBars tkColorDialog_RgbToX \"\n            \"tkColorDialog_SetRGBValue tkColorDialog_StartMove \"\n            \"tkColorDialog_XToRgb tkConsoleAbout tkConsoleBind tkConsoleExit \"\n            \"tkConsoleHistory tkConsoleInit tkConsoleInsert tkConsoleInvoke \"\n            \"tkConsoleOutput tkConsolePrompt tkConsoleSource tkDarken \"\n            \"tkEntryAutoScan tkEntryBackspace tkEntryButton1 \"\n            \"tkEntryClosestGap tkEntryGetSelection tkEntryInsert \"\n            \"tkEntryKeySelect tkEntryMouseSelect tkEntryNextWord tkEntryPaste \"\n            \"tkEntryPreviousWord tkEntrySeeInsert tkEntrySetCursor \"\n            \"tkEntryTranspose tkEventMotifBindings tkFDGetFileTypes \"\n            \"tkFirstMenu tkFocusGroup_BindIn tkFocusGroup_BindOut \"\n            \"tkFocusGroup_Create tkFocusGroup_Destroy tkFocusGroup_In \"\n            \"tkFocusGroup_Out tkFocusOK tkGenerateMenuSelect tkIconList \"\n            \"tkIconList_Add tkIconList_Arrange tkIconList_AutoScan \"\n            \"tkIconList_Btn1 tkIconList_Config tkIconList_Create \"\n            \"tkIconList_CtrlBtn1 tkIconList_Curselection tkIconList_DeleteAll \"\n            \"tkIconList_Double1 tkIconList_DrawSelection tkIconList_FocusIn \"\n            \"tkIconList_FocusOut tkIconList_Get tkIconList_Goto \"\n            \"tkIconList_Index tkIconList_Invoke tkIconList_KeyPress \"\n            \"tkIconList_Leave1 tkIconList_LeftRight tkIconList_Motion1 \"\n            \"tkIconList_Reset tkIconList_ReturnKey tkIconList_See \"\n            \"tkIconList_Select tkIconList_Selection tkIconList_ShiftBtn1 \"\n            \"tkIconList_UpDown tkListbox tkListboxAutoScan \"\n            \"tkListboxBeginExtend tkListboxBeginSelect tkListboxBeginToggle \"\n            \"tkListboxCancel tkListboxDataExtend tkListboxExtendUpDown \"\n            \"tkListboxKeyAccel_Goto tkListboxKeyAccel_Key \"\n            \"tkListboxKeyAccel_Reset tkListboxKeyAccel_Set \"\n            \"tkListboxKeyAccel_Unset tkListboxMotion tkListboxSelectAll \"\n            \"tkListboxUpDown tkMbButtonUp tkMbEnter tkMbLeave tkMbMotion \"\n            \"tkMbPost tkMenuButtonDown tkMenuDownArrow tkMenuDup tkMenuEscape \"\n            \"tkMenuFind tkMenuFindName tkMenuFirstEntry tkMenuInvoke \"\n            \"tkMenuLeave tkMenuLeftArrow tkMenuMotion tkMenuNextEntry \"\n            \"tkMenuNextMenu tkMenuRightArrow tkMenuUnpost tkMenuUpArrow \"\n            \"tkMessageBox tkMotifFDialog tkMotifFDialog_ActivateDList \"\n            \"tkMotifFDialog_ActivateFEnt tkMotifFDialog_ActivateFList \"\n            \"tkMotifFDialog_ActivateSEnt tkMotifFDialog_BrowseDList \"\n            \"tkMotifFDialog_BrowseFList tkMotifFDialog_BuildUI \"\n            \"tkMotifFDialog_CancelCmd tkMotifFDialog_Config \"\n            \"tkMotifFDialog_Create tkMotifFDialog_FileTypes \"\n            \"tkMotifFDialog_FilterCmd tkMotifFDialog_InterpFilter \"\n            \"tkMotifFDialog_LoadFiles tkMotifFDialog_MakeSList \"\n            \"tkMotifFDialog_OkCmd tkMotifFDialog_SetFilter \"\n            \"tkMotifFDialog_SetListMode tkMotifFDialog_Update tkPostOverPoint \"\n            \"tkRecolorTree tkRestoreOldGrab tkSaveGrabInfo tkScaleActivate \"\n            \"tkScaleButton2Down tkScaleButtonDown tkScaleControlPress \"\n            \"tkScaleDrag tkScaleEndDrag tkScaleIncrement tkScreenChanged \"\n            \"tkScrollButton2Down tkScrollButtonDown tkScrollButtonDrag \"\n            \"tkScrollButtonUp tkScrollByPages tkScrollByUnits tkScrollDrag \"\n            \"tkScrollEndDrag tkScrollSelect tkScrollStartDrag \"\n            \"tkScrollTopBottom tkScrollToPos tkTabToWindow tkTearOffMenu \"\n            \"tkTextAutoScan tkTextButton1 tkTextClosestGap tkTextInsert \"\n            \"tkTextKeyExtend tkTextKeySelect tkTextNextPara tkTextNextPos \"\n            \"tkTextNextWord tkTextPaste tkTextPrevPara tkTextPrevPos \"\n            \"tkTextPrevWord tkTextResetAnchor tkTextScrollPages \"\n            \"tkTextSelectTo tkTextSetCursor tkTextTranspose tkTextUpDownLine \"\n            \"tkTraverseToMenu tkTraverseWithinMenu\";\n\n    if (set == 5)\n        return \"expand\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerTCL::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case CommentLine:\n        return tr(\"Comment line\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case QuotedKeyword:\n        return tr(\"Quoted keyword\");\n\n    case QuotedString:\n        return tr(\"Quoted string\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case Substitution:\n        return tr(\"Substitution\");\n\n    case SubstitutionBrace:\n        return tr(\"Brace substitution\");\n\n    case Modifier:\n        return tr(\"Modifier\");\n\n    case ExpandKeyword:\n        return tr(\"Expand keyword\");\n\n    case TCLKeyword:\n        return tr(\"TCL keyword\");\n\n    case TkKeyword:\n        return tr(\"Tk keyword\");\n\n    case ITCLKeyword:\n        return tr(\"iTCL keyword\");\n\n    case TkCommand:\n        return tr(\"Tk command\");\n\n    case KeywordSet6:\n        return tr(\"User defined 1\");\n\n    case KeywordSet7:\n        return tr(\"User defined 2\");\n\n    case KeywordSet8:\n        return tr(\"User defined 3\");\n\n    case KeywordSet9:\n        return tr(\"User defined 4\");\n\n    case CommentBox:\n        return tr(\"Comment box\");\n\n    case CommentBlock:\n        return tr(\"Comment block\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerTCL::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case Comment:\n        return QColor(0xf0,0xff,0xe0);\n\n    case QuotedKeyword:\n    case QuotedString:\n    case ITCLKeyword:\n        return QColor(0xff,0xf0,0xf0);\n\n    case Substitution:\n        return QColor(0xef,0xff,0xf0);\n\n    case ExpandKeyword:\n        return QColor(0xff,0xff,0x80);\n\n    case TkKeyword:\n        return QColor(0xe0,0xff,0xf0);\n\n    case TkCommand:\n        return QColor(0xff,0xd0,0xd0);\n\n    case CommentBox:\n    case CommentBlock:\n        return QColor(0xf0,0xff,0xf0);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerTCL::refreshProperties()\n{\n    setCommentProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerTCL::readProperties(QSettings &qs, const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerTCL::writeProperties(QSettings &qs, const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    return rc;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerTCL::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerTCL::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\", (fold_comments ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexertex.cpp",
    "content": "// This module implements the QsciLexerTeX class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexertex.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerTeX::QsciLexerTeX(QObject *parent, const char *name)\n    : QsciLexer(parent, name),\n      fold_comments(false), fold_compact(true), process_comments(false),\n      process_if(true)\n{\n}\n\n\n// The dtor.\nQsciLexerTeX::~QsciLexerTeX()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerTeX::language() const\n{\n    return \"TeX\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerTeX::lexer() const\n{\n    return \"tex\";\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerTeX::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\\\\@\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerTeX::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x3f,0x3f,0x3f);\n\n    case Special:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Group:\n        return QColor(0x7f,0x00,0x00);\n\n    case Symbol:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Command:\n        return QColor(0x00,0x7f,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerTeX::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"above abovedisplayshortskip abovedisplayskip \"\n            \"abovewithdelims accent adjdemerits advance \"\n            \"afterassignment aftergroup atop atopwithdelims \"\n            \"badness baselineskip batchmode begingroup \"\n            \"belowdisplayshortskip belowdisplayskip binoppenalty \"\n            \"botmark box boxmaxdepth brokenpenalty catcode char \"\n            \"chardef cleaders closein closeout clubpenalty copy \"\n            \"count countdef cr crcr csname day deadcycles def \"\n            \"defaulthyphenchar defaultskewchar delcode delimiter \"\n            \"delimiterfactor delimeters delimitershortfall \"\n            \"delimeters dimen dimendef discretionary \"\n            \"displayindent displaylimits displaystyle \"\n            \"displaywidowpenalty displaywidth divide \"\n            \"doublehyphendemerits dp dump edef else \"\n            \"emergencystretch end endcsname endgroup endinput \"\n            \"endlinechar eqno errhelp errmessage \"\n            \"errorcontextlines errorstopmode escapechar everycr \"\n            \"everydisplay everyhbox everyjob everymath everypar \"\n            \"everyvbox exhyphenpenalty expandafter fam fi \"\n            \"finalhyphendemerits firstmark floatingpenalty font \"\n            \"fontdimen fontname futurelet gdef global group \"\n            \"globaldefs halign hangafter hangindent hbadness \"\n            \"hbox hfil horizontal hfill horizontal hfilneg hfuzz \"\n            \"hoffset holdinginserts hrule hsize hskip hss \"\n            \"horizontal ht hyphenation hyphenchar hyphenpenalty \"\n            \"hyphen if ifcase ifcat ifdim ifeof iffalse ifhbox \"\n            \"ifhmode ifinner ifmmode ifnum ifodd iftrue ifvbox \"\n            \"ifvmode ifvoid ifx ignorespaces immediate indent \"\n            \"input inputlineno input insert insertpenalties \"\n            \"interlinepenalty jobname kern language lastbox \"\n            \"lastkern lastpenalty lastskip lccode leaders left \"\n            \"lefthyphenmin leftskip leqno let limits linepenalty \"\n            \"line lineskip lineskiplimit long looseness lower \"\n            \"lowercase mag mark mathaccent mathbin mathchar \"\n            \"mathchardef mathchoice mathclose mathcode mathinner \"\n            \"mathop mathopen mathord mathpunct mathrel \"\n            \"mathsurround maxdeadcycles maxdepth meaning \"\n            \"medmuskip message mkern month moveleft moveright \"\n            \"mskip multiply muskip muskipdef newlinechar noalign \"\n            \"noboundary noexpand noindent nolimits nonscript \"\n            \"scriptscript nonstopmode nulldelimiterspace \"\n            \"nullfont number omit openin openout or outer output \"\n            \"outputpenalty over overfullrule overline \"\n            \"overwithdelims pagedepth pagefilllstretch \"\n            \"pagefillstretch pagefilstretch pagegoal pageshrink \"\n            \"pagestretch pagetotal par parfillskip parindent \"\n            \"parshape parskip patterns pausing penalty \"\n            \"postdisplaypenalty predisplaypenalty predisplaysize \"\n            \"pretolerance prevdepth prevgraf radical raise read \"\n            \"relax relpenalty right righthyphenmin rightskip \"\n            \"romannumeral scriptfont scriptscriptfont \"\n            \"scriptscriptstyle scriptspace scriptstyle \"\n            \"scrollmode setbox setlanguage sfcode shipout show \"\n            \"showbox showboxbreadth showboxdepth showlists \"\n            \"showthe skewchar skip skipdef spacefactor spaceskip \"\n            \"span special splitbotmark splitfirstmark \"\n            \"splitmaxdepth splittopskip string tabskip textfont \"\n            \"textstyle the thickmuskip thinmuskip time toks \"\n            \"toksdef tolerance topmark topskip tracingcommands \"\n            \"tracinglostchars tracingmacros tracingonline \"\n            \"tracingoutput tracingpages tracingparagraphs \"\n            \"tracingrestores tracingstats uccode uchyph \"\n            \"underline unhbox unhcopy unkern unpenalty unskip \"\n            \"unvbox unvcopy uppercase vadjust valign vbadness \"\n            \"vbox vcenter vfil vfill vfilneg vfuzz voffset vrule \"\n            \"vsize vskip vsplit vss vtop wd widowpenalty write \"\n            \"xdef xleaders xspaceskip year \"\n            \"TeX bgroup egroup endgraf space empty null newcount \"\n            \"newdimen newskip newmuskip newbox newtoks newhelp \"\n            \"newread newwrite newfam newlanguage newinsert newif \"\n            \"maxdimen magstephalf magstep frenchspacing \"\n            \"nonfrenchspacing normalbaselines obeylines \"\n            \"obeyspaces raggedr ight ttraggedright thinspace \"\n            \"negthinspace enspace enskip quad qquad smallskip \"\n            \"medskip bigskip removelastskip topglue vglue hglue \"\n            \"break nobreak allowbreak filbreak goodbreak \"\n            \"smallbreak medbreak bigbreak line leftline \"\n            \"rightline centerline rlap llap underbar strutbox \"\n            \"strut cases matrix pmatrix bordermatrix eqalign \"\n            \"displaylines eqalignno leqalignno pageno folio \"\n            \"tracingall showhyphens fmtname fmtversion hphantom \"\n            \"vphantom phantom smash\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerTeX::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Special:\n        return tr(\"Special\");\n\n    case Group:\n        return tr(\"Group\");\n\n    case Symbol:\n        return tr(\"Symbol\");\n\n    case Command:\n        return tr(\"Command\");\n\n    case Text:\n        return tr(\"Text\");\n    }\n\n    return QString();\n}\n\n\n// Refresh all properties.\nvoid QsciLexerTeX::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n    setProcessCommentsProp();\n    setAutoIfProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerTeX::readProperties(QSettings &qs, const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = true;\n\n    flag = qs.readBoolEntry(prefix + \"processcomments\", false, &ok);\n\n    if (ok)\n        process_comments = flag;\n    else\n        rc = true;\n\n    flag = qs.readBoolEntry(prefix + \"processif\", true, &ok);\n\n    if (ok)\n        process_if = flag;\n    else\n        rc = true;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerTeX::writeProperties(QSettings &qs, const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"processcomments\", process_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"processif\", process_if))\n        rc = false;\n\n    return rc;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerTeX::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerTeX::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\", (fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Set if folds are compact.\nvoid QsciLexerTeX::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerTeX::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\", (fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Set if comments are processed\nvoid QsciLexerTeX::setProcessComments(bool enable)\n{\n    process_comments = enable;\n\n    setProcessCommentsProp();\n}\n\n\n// Set the \"lexer.tex.comment.process\" property.\nvoid QsciLexerTeX::setProcessCommentsProp()\n{\n    emit propertyChanged(\"lexer.tex.comment.process\", (process_comments ? \"1\" : \"0\"));\n}\n\n\n// Set if \\if<unknown> is processed\nvoid QsciLexerTeX::setProcessIf(bool enable)\n{\n    process_if = enable;\n\n    setAutoIfProp();\n}\n\n\n// Set the \"lexer.tex.auto.if\" property.\nvoid QsciLexerTeX::setAutoIfProp()\n{\n    emit propertyChanged(\"lexer.tex.auto.if\", (process_if ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerverilog.cpp",
    "content": "// This module implements the QsciLexerVerilog class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerverilog.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerVerilog::QsciLexerVerilog(QObject *parent, const char *name)\n    : QsciLexer(parent, name),\n      fold_atelse(false), fold_comments(false), fold_compact(true),\n      fold_preproc(false), fold_atmodule(false)\n{\n}\n\n\n// The dtor.\nQsciLexerVerilog::~QsciLexerVerilog()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerVerilog::language() const\n{\n    return \"Verilog\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerVerilog::lexer() const\n{\n    return \"verilog\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerVerilog::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerVerilog::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"always and assign automatic begin buf bufif0 bufif1 case casex \"\n            \"casez cell cmos config deassign default defparam design disable \"\n            \"edge else end endcase endconfig endfunction endgenerate \"\n            \"endmodule endprimitiveendspecify endtable endtask event for \"\n            \"force forever fork function generate genvar highz0 highz1 if \"\n            \"ifnone incdir include initial inout input instance integer join \"\n            \"large liblist library localparam macromodule medium module nand \"\n            \"negedge nmos nor noshowcancelled not notif0 notif1 or output \"\n            \"parameter pmos posedge primitive pull0 pull1 pulldown pullup \"\n            \"pulsestyle_ondetect pulsestyle_onevent rcmos real realtime reg \"\n            \"release repeat rnmos rpmos rtran rtranif0 rtranif1 scalared \"\n            \"showcancelled signed small specify specparam strong0 strong1 \"\n            \"supply0 supply1 table task time tran tranif0 tranif1 tri tri0 \"\n            \"tri1 triand trior trireg unsigned use vectored wait wand weak0 \"\n            \"weak1 while wire wor xnor xor\";\n\n    if (set == 3)\n        return\n            \"$async$and$array $async$and$plane $async$nand$array \"\n            \"$async$nand$plane $async$nor$array $async$nor$plane \"\n            \"$async$or$array $async$or$plane $bitstoreal $countdrivers \"\n            \"$display $displayb $displayh $displayo $dist_chi_square \"\n            \"$dist_erlang $dist_exponential $dist_normal $dist_poisson \"\n            \"$dist_t $dist_uniform $dumpall $dumpfile $dumpflush $dumplimit \"\n            \"$dumpoff $dumpon $dumpportsall $dumpportsflush $dumpportslimit \"\n            \"$dumpportsoff $dumpportson $dumpvars $fclose $fdisplayh \"\n            \"$fdisplay $fdisplayf $fdisplayb $ferror $fflush $fgetc $fgets \"\n            \"$finish $fmonitorb $fmonitor $fmonitorf $fmonitorh $fopen \"\n            \"$fread $fscanf $fseek $fsscanf $fstrobe $fstrobebb $fstrobef \"\n            \"$fstrobeh $ftel $fullskew $fwriteb $fwritef $fwriteh $fwrite \"\n            \"$getpattern $history $hold $incsave $input $itor $key $list \"\n            \"$log $monitorb $monitorh $monitoroff $monitoron $monitor \"\n            \"$monitoro $nochange $nokey $nolog $period $printtimescale \"\n            \"$q_add $q_exam $q_full $q_initialize $q_remove $random \"\n            \"$readmemb $readmemh $readmemh $realtime $realtobits $recovery \"\n            \"$recrem $removal $reset_count $reset $reset_value $restart \"\n            \"$rewind $rtoi $save $scale $scope $sdf_annotate $setup \"\n            \"$setuphold $sformat $showscopes $showvariables $showvars \"\n            \"$signed $skew $sreadmemb $sreadmemh $stime $stop $strobeb \"\n            \"$strobe $strobeh $strobeo $swriteb $swriteh $swriteo $swrite \"\n            \"$sync$and$array $sync$and$plane $sync$nand$array \"\n            \"$sync$nand$plane $sync$nor$array $sync$nor$plane $sync$or$array \"\n            \"$sync$or$plane $test$plusargs $time $timeformat $timeskew \"\n            \"$ungetc $unsigned $value$plusargs $width $writeb $writeh $write \"\n            \"$writeo\";\n\n    return 0;\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerVerilog::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerVerilog::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Comment:\n    case CommentLine:\n        return QColor(0x00,0x7f,0x00);\n\n    case CommentBang:\n        return QColor(0x3f,0x7f,0x3f);\n\n    case Number:\n    case KeywordSet2:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case String:\n        return QColor(0x7f,0x00,0x7f);\n\n    case SystemTask:\n    case UserKeywordSet:\n        return QColor(0x80,0x40,0x20);\n\n    case Preprocessor:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Operator:\n        return QColor(0x00,0x70,0x70);\n\n    case UnclosedString:\n        return QColor(0x00,0x00,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerVerilog::defaultEolFill(int style) const\n{\n    if (style == CommentBang || style == UnclosedString)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerVerilog::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case CommentLine:\n    case CommentBang:\n    case UserKeywordSet:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case Operator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerVerilog::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case CommentLine:\n        return tr(\"Line comment\");\n\n    case CommentBang:\n        return tr(\"Bang comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Primary keywords and identifiers\");\n\n    case String:\n        return tr(\"String\");\n\n    case KeywordSet2:\n        return tr(\"Secondary keywords and identifiers\");\n\n    case SystemTask:\n        return tr(\"System task\");\n\n    case Preprocessor:\n        return tr(\"Preprocessor block\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case UserKeywordSet:\n        return tr(\"User defined tasks and identifiers\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerVerilog::defaultPaper(int style) const\n{\n    if (style == CommentBang)\n        return QColor(0xe0,0xf0,0xff);\n\n    if (style == UnclosedString)\n        return QColor(0xe0,0xc0,0xe0);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerVerilog::refreshProperties()\n{\n    setAtElseProp();\n    setCommentProp();\n    setCompactProp();\n    setPreprocProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerVerilog::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldatelse\", false, &ok);\n\n    if (ok)\n        fold_atelse = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldpreprocessor\", false, &ok);\n\n    if (ok)\n        fold_preproc = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldverilogflags\", false, &ok);\n\n    if (ok)\n        fold_atmodule = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerVerilog::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldatelse\", fold_atelse))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldpreprocessor\", fold_preproc))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldverilogflags\", fold_atmodule))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return true if else can be folded.\nbool QsciLexerVerilog::foldAtElse() const\n{\n    return fold_atelse;\n}\n\n\n// Set if else can be folded.\nvoid QsciLexerVerilog::setFoldAtElse(bool fold)\n{\n    fold_atelse = fold;\n\n    setAtElseProp();\n}\n\n\n// Set the \"fold.at.else\" property.\nvoid QsciLexerVerilog::setAtElseProp()\n{\n    emit propertyChanged(\"fold.at.else\",(fold_atelse ? \"1\" : \"0\"));\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerVerilog::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerVerilog::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerVerilog::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerVerilog::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerVerilog::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerVerilog::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Return true if preprocessor blocks can be folded.\nbool QsciLexerVerilog::foldPreprocessor() const\n{\n    return fold_preproc;\n}\n\n\n// Set if preprocessor blocks can be folded.\nvoid QsciLexerVerilog::setFoldPreprocessor(bool fold)\n{\n    fold_preproc = fold;\n\n    setPreprocProp();\n}\n\n\n// Set the \"fold.preprocessor\" property.\nvoid QsciLexerVerilog::setPreprocProp()\n{\n    emit propertyChanged(\"fold.preprocessor\",(fold_preproc ? \"1\" : \"0\"));\n}\n\n\n// Return true if modules can be folded.\nbool QsciLexerVerilog::foldAtModule() const\n{\n    return fold_atmodule;\n}\n\n\n// Set if modules can be folded.\nvoid QsciLexerVerilog::setFoldAtModule(bool fold)\n{\n    fold_atmodule = fold;\n\n    setAtModuleProp();\n}\n\n\n// Set the \"fold.verilog.flags\" property.\nvoid QsciLexerVerilog::setAtModuleProp()\n{\n    emit propertyChanged(\"fold.verilog.flags\",(fold_atmodule ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexervhdl.cpp",
    "content": "// This module implements the QsciLexerVHDL class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexervhdl.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerVHDL::QsciLexerVHDL(QObject *parent, const char *name)\n    : QsciLexer(parent,name),\n      fold_comments(true), fold_compact(true), fold_atelse(true),\n      fold_atbegin(true), fold_atparenth(true)\n{\n}\n\n\n// The dtor.\nQsciLexerVHDL::~QsciLexerVHDL()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerVHDL::language() const\n{\n    return \"VHDL\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerVHDL::lexer() const\n{\n    return \"vhdl\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerVHDL::braceStyle() const\n{\n    return Attribute;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerVHDL::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x00,0x80);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case CommentLine:\n        return QColor(0x3f,0x7f,0x3f);\n\n    case Number:\n    case StandardOperator:\n        return QColor(0x00,0x7f,0x7f);\n\n    case String:\n        return QColor(0x7f,0x00,0x7f);\n\n    case UnclosedString:\n        return QColor(0x00,0x00,0x00);\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case Attribute:\n        return QColor(0x80,0x40,0x20);\n\n    case StandardFunction:\n        return QColor(0x80,0x80,0x20);\n\n    case StandardPackage:\n        return QColor(0x20,0x80,0x20);\n\n    case StandardType:\n        return QColor(0x20,0x80,0x80);\n\n    case KeywordSet7:\n        return QColor(0x80,0x40,0x20);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerVHDL::defaultEolFill(int style) const\n{\n    if (style == UnclosedString)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerVHDL::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case CommentLine:\n    case KeywordSet7:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerVHDL::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"access after alias all architecture array assert attribute begin \"\n            \"block body buffer bus case component configuration constant \"\n            \"disconnect downto else elsif end entity exit file for function \"\n            \"generate generic group guarded if impure in inertial inout is \"\n            \"label library linkage literal loop map new next null of on open \"\n            \"others out package port postponed procedure process pure range \"\n            \"record register reject report return select severity shared \"\n            \"signal subtype then to transport type unaffected units until use \"\n            \"variable wait when while with\";\n\n    if (set == 2)\n        return\n            \"abs and mod nand nor not or rem rol ror sla sll sra srl xnor xor\";\n\n    if (set == 3)\n        return\n            \"left right low high ascending image value pos val succ pred \"\n            \"leftof rightof base range reverse_range length delayed stable \"\n            \"quiet transaction event active last_event last_active last_value \"\n            \"driving driving_value simple_name path_name instance_name\";\n\n    if (set == 4)\n        return\n            \"now readline read writeline write endfile resolved to_bit \"\n            \"to_bitvector to_stdulogic to_stdlogicvector to_stdulogicvector \"\n            \"to_x01 to_x01z to_UX01 rising_edge falling_edge is_x shift_left \"\n            \"shift_right rotate_left rotate_right resize to_integer \"\n            \"to_unsigned to_signed std_match to_01\";\n\n    if (set == 5)\n        return\n            \"std ieee work standard textio std_logic_1164 std_logic_arith \"\n            \"std_logic_misc std_logic_signed std_logic_textio \"\n            \"std_logic_unsigned numeric_bit numeric_std math_complex \"\n            \"math_real vital_primitives vital_timing\";\n\n    if (set == 6)\n        return\n            \"boolean bit character severity_level integer real time \"\n            \"delay_length natural positive string bit_vector file_open_kind \"\n            \"file_open_status line text side width std_ulogic \"\n            \"std_ulogic_vector std_logic std_logic_vector X01 X01Z UX01 UX01Z \"\n            \"unsigned signed\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerVHDL::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case CommentLine:\n        return tr(\"Comment line\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case String:\n        return tr(\"String\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case StandardOperator:\n        return tr(\"Standard operator\");\n\n    case Attribute:\n        return tr(\"Attribute\");\n\n    case StandardFunction:\n        return tr(\"Standard function\");\n\n    case StandardPackage:\n        return tr(\"Standard package\");\n\n    case StandardType:\n        return tr(\"Standard type\");\n\n    case KeywordSet7:\n        return tr(\"User defined\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerVHDL::defaultPaper(int style) const\n{\n    if (style == UnclosedString)\n        return QColor(0xe0,0xc0,0xe0);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerVHDL::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n    setAtElseProp();\n    setAtBeginProp();\n    setAtParenthProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerVHDL::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", true, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldcompact\", true, &ok);\n\n    if (ok)\n        fold_compact = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldatelse\", true, &ok);\n\n    if (ok)\n        fold_atelse = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldatbegin\", true, &ok);\n\n    if (ok)\n        fold_atbegin = flag;\n    else\n        rc = false;\n\n    flag = qs.readBoolEntry(prefix + \"foldatparenthesis\", true, &ok);\n\n    if (ok)\n        fold_atparenth = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerVHDL::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldcompact\", fold_compact))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldatelse\", fold_atelse))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldatbegin\", fold_atbegin))\n        rc = false;\n\n    if (!qs.writeEntry(prefix + \"foldatparenthesis\", fold_atparenth))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerVHDL::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerVHDL::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerVHDL::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerVHDL::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerVHDL::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerVHDL::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Return true if else blocks can be folded.\nbool QsciLexerVHDL::foldAtElse() const\n{\n    return fold_atelse;\n}\n\n\n// Set if else blocks can be folded.\nvoid QsciLexerVHDL::setFoldAtElse(bool fold)\n{\n    fold_atelse = fold;\n\n    setAtElseProp();\n}\n\n\n// Set the \"fold.at.else\" property.\nvoid QsciLexerVHDL::setAtElseProp()\n{\n    emit propertyChanged(\"fold.at.else\",(fold_atelse ? \"1\" : \"0\"));\n}\n\n\n// Return true if begin blocks can be folded.\nbool QsciLexerVHDL::foldAtBegin() const\n{\n    return fold_atbegin;\n}\n\n\n// Set if begin blocks can be folded.\nvoid QsciLexerVHDL::setFoldAtBegin(bool fold)\n{\n    fold_atbegin = fold;\n\n    setAtBeginProp();\n}\n\n\n// Set the \"fold.at.Begin\" property.\nvoid QsciLexerVHDL::setAtBeginProp()\n{\n    emit propertyChanged(\"fold.at.Begin\",(fold_atelse ? \"1\" : \"0\"));\n}\n\n\n// Return true if blocks can be folded at a parenthesis.\nbool QsciLexerVHDL::foldAtParenthesis() const\n{\n    return fold_atparenth;\n}\n\n\n// Set if blocks can be folded at a parenthesis.\nvoid QsciLexerVHDL::setFoldAtParenthesis(bool fold)\n{\n    fold_atparenth = fold;\n\n    setAtParenthProp();\n}\n\n\n// Set the \"fold.at.Parenthese\" property.\nvoid QsciLexerVHDL::setAtParenthProp()\n{\n    emit propertyChanged(\"fold.at.Parenthese\",(fold_atparenth ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexerxml.cpp",
    "content": "// This module implements the QsciLexerXML class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerxml.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerXML::QsciLexerXML(QObject *parent, const char *name)\n    : QsciLexerHTML(parent, name),\n      scripts(true)\n{\n}\n\n\n// The dtor.\nQsciLexerXML::~QsciLexerXML()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerXML::language() const\n{\n    return \"XML\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerXML::lexer() const\n{\n    return \"xml\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerXML::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x00,0x00,0x00);\n\n    case Tag:\n    case UnknownTag:\n    case XMLTagEnd:\n    case SGMLDefault:\n    case SGMLCommand:\n        return QColor(0x00,0x00,0x80);\n\n    case Attribute:\n    case UnknownAttribute:\n        return QColor(0x00,0x80,0x80);\n\n    case HTMLNumber:\n        return QColor(0x00,0x7f,0x7f);\n\n    case HTMLDoubleQuotedString:\n    case HTMLSingleQuotedString:\n        return QColor(0x7f,0x00,0x7f);\n\n    case OtherInTag:\n    case Entity:\n    case XMLStart:\n    case XMLEnd:\n        return QColor(0x80,0x00,0x80);\n\n    case HTMLComment:\n    case SGMLComment:\n        return QColor(0x80,0x80,0x00);\n\n    case CDATA:\n    case PHPStart:\n    case SGMLDoubleQuotedString:\n    case SGMLError:\n        return QColor(0x80,0x00,0x00);\n\n    case HTMLValue:\n        return QColor(0x60,0x80,0x60);\n\n    case SGMLParameter:\n        return QColor(0x00,0x66,0x00);\n\n    case SGMLSingleQuotedString:\n        return QColor(0x99,0x33,0x00);\n\n    case SGMLSpecial:\n        return QColor(0x33,0x66,0xff);\n\n    case SGMLEntity:\n        return QColor(0x33,0x33,0x33);\n\n    case SGMLBlockDefault:\n        return QColor(0x00,0x00,0x66);\n    }\n\n    return QsciLexerHTML::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerXML::defaultEolFill(int style) const\n{\n    if (style == CDATA)\n        return true;\n\n    return QsciLexerHTML::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerXML::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Default:\n    case Entity:\n    case CDATA:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Times New Roman\",11);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Times New Roman\", 12);\n#else\n        f = QFont(\"Bitstream Charter\",10);\n#endif\n        break;\n\n    case XMLStart:\n    case XMLEnd:\n    case SGMLCommand:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexerHTML::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerXML::keywords(int set) const\n{\n    if (set == 6)\n        return QsciLexerHTML::keywords(set);\n\n    return 0;\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerXML::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case CDATA:\n        return QColor(0xff,0xf0,0xf0);\n\n    case SGMLDefault:\n    case SGMLCommand:\n    case SGMLParameter:\n    case SGMLDoubleQuotedString:\n    case SGMLSingleQuotedString:\n    case SGMLSpecial:\n    case SGMLEntity:\n    case SGMLComment:\n        return QColor(0xef,0xef,0xff);\n\n    case SGMLError:\n        return QColor(0xff,0x66,0x66);\n\n    case SGMLBlockDefault:\n        return QColor(0xcc,0xcc,0xe0);\n    }\n\n    return QsciLexerHTML::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerXML::refreshProperties()\n{\n    setScriptsProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerXML::readProperties(QSettings &qs, const QString &prefix)\n{\n    int rc = QsciLexerHTML::readProperties(qs, prefix), num;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"scriptsstyled\", true, &ok);\n\n    if (ok)\n        scripts = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerXML::writeProperties(QSettings &qs, const QString &prefix) const\n{\n    int rc = QsciLexerHTML::writeProperties(qs, prefix);\n\n    if (!qs.writeEntry(prefix + \"scriptsstyled\", scripts))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return true if scripts are styled.\nbool QsciLexerXML::scriptsStyled() const\n{\n    return scripts;\n}\n\n\n// Set if scripts are styled.\nvoid QsciLexerXML::setScriptsStyled(bool styled)\n{\n    scripts = styled;\n\n    setScriptsProp();\n}\n\n\n// Set the \"lexer.xml.allow.scripts\" property.\nvoid QsciLexerXML::setScriptsProp()\n{\n    emit propertyChanged(\"lexer.xml.allow.scripts\",(scripts ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscilexeryaml.cpp",
    "content": "// This module implements the QsciLexerYAML class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexeryaml.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerYAML::QsciLexerYAML(QObject *parent, const char *name)\n    : QsciLexer(parent,name),\n      fold_comments(false)\n{\n}\n\n\n// The dtor.\nQsciLexerYAML::~QsciLexerYAML()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerYAML::language() const\n{\n    return \"YAML\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerYAML::lexer() const\n{\n    return \"yaml\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerYAML::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x00,0x00,0x00);\n\n    case Comment:\n        return QColor(0x00,0x88,0x00);\n\n    case Identifier:\n        return QColor(0x00,0x00,0x88);\n\n    case Keyword:\n        return QColor(0x88,0x00,0x88);\n\n    case Number:\n        return QColor(0x88,0x00,0x00);\n\n    case Reference:\n        return QColor(0x00,0x88,0x88);\n\n    case DocumentDelimiter:\n    case SyntaxErrorMarker:\n        return QColor(0xff,0xff,0xff);\n\n    case TextBlockMarker:\n        return QColor(0x33,0x33,0x66);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerYAML::defaultEolFill(int style) const\n{\n    if (style == DocumentDelimiter || style == SyntaxErrorMarker)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerYAML::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Default:\n    case TextBlockMarker:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Times New Roman\", 11);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Times New Roman\", 12);\n#else\n        f = QFont(\"Bitstream Charter\", 10);\n#endif\n        break;\n\n    case Identifier:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case DocumentDelimiter:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        f.setBold(true);\n        break;\n\n    case SyntaxErrorMarker:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Times New Roman\", 11);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Times New Roman\", 12);\n#else\n        f = QFont(\"Bitstream Charter\", 10);\n#endif\n        f.setBold(true);\n        f.setItalic(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerYAML::keywords(int set) const\n{\n    if (set == 1)\n        return \"true false yes no\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerYAML::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Reference:\n        return tr(\"Reference\");\n\n    case DocumentDelimiter:\n        return tr(\"Document delimiter\");\n\n    case TextBlockMarker:\n        return tr(\"Text block marker\");\n\n    case SyntaxErrorMarker:\n        return tr(\"Syntax error marker\");\n\n    case Operator:\n        return tr(\"Operator\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerYAML::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case DocumentDelimiter:\n        return QColor(0x00,0x00,0x88);\n\n    case SyntaxErrorMarker:\n        return QColor(0xff,0x00,0x00);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerYAML::refreshProperties()\n{\n    setCommentProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerYAML::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    bool ok, flag;\n\n    flag = qs.readBoolEntry(prefix + \"foldcomments\", false, &ok);\n\n    if (ok)\n        fold_comments = flag;\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerYAML::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    if (!qs.writeEntry(prefix + \"foldcomments\", fold_comments))\n        rc = false;\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerYAML::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerYAML::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment.yaml\" property.\nvoid QsciLexerYAML::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment.yaml\",(fold_comments ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscimacro.cpp",
    "content": "// This module implements the QsciMacro class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscimacro.h\"\n\n#include <qstringlist.h>\n\n#include \"Qsci/qsciscintilla.h\"\n\n\nstatic int fromHex(unsigned char ch);\n\n\n\n// The ctor.\nQsciMacro::QsciMacro(QsciScintilla *parent, const char *name)\n    : QObject(parent, name), qsci(parent)\n{\n}\n\n\n// The ctor that initialises the macro.\nQsciMacro::QsciMacro(const QString &asc, QsciScintilla *parent,\n        const char *name)\n    : QObject(parent, name), qsci(parent)\n{\n    load(asc);\n}\n\n\n// The dtor.\nQsciMacro::~QsciMacro()\n{\n}\n\n\n// Clear the contents of the macro.\nvoid QsciMacro::clear()\n{\n    macro.clear();\n}\n\n\n// Read a macro from a string.\nbool QsciMacro::load(const QString &asc)\n{\n    bool ok = true;\n\n    macro.clear();\n\n    QStringList fields = QStringList::split(' ', asc);\n\n    int f = 0;\n\n    while (f < fields.size())\n    {\n        Macro cmd;\n        unsigned len;\n\n        // Extract the 3 fixed fields.\n        if (f + 3 > fields.size())\n        {\n            ok = false;\n            break;\n        }\n\n        cmd.msg = fields[f++].toUInt(&ok);\n\n        if (!ok)\n            break;\n\n        cmd.wParam = fields[f++].toULong(&ok);\n\n        if (!ok)\n            break;\n\n        len = fields[f++].toUInt(&ok);\n\n        if (!ok)\n            break;\n\n        // Extract any text.\n        if (len)\n        {\n            if (f + 1 > fields.size())\n            {\n                ok = false;\n                break;\n            }\n\n            const char *sp = fields[f++].ascii();\n\n            if (!sp)\n            {\n                ok = false;\n                break;\n            }\n\n            // Because of historical bugs the length field is unreliable.\n            bool embedded_null = false;\n            unsigned char ch;\n\n            while ((ch = *sp++) != '\\0')\n            {\n                if (ch == '\"' || ch <= ' ' || ch >= 0x7f)\n                {\n                    ok = false;\n                    break;\n                }\n\n                if (ch == '\\\\')\n                {\n                    int b1, b2;\n\n                    if ((b1 = fromHex(*sp++)) < 0 ||\n                        (b2 = fromHex(*sp++)) < 0)\n                    {\n                        ok = false;\n                        break;\n                    }\n\n                    ch = (b1 << 4) + b2;\n                }\n\n                if (ch == '\\0')\n                {\n                    // Don't add it now as it may be the terminating '\\0'.\n                    embedded_null = true;\n                }\n                else\n                {\n                    if (embedded_null)\n                    {\n                        // Add the pending embedded '\\0'.\n                        cmd.text += '\\0';\n                        embedded_null = false;\n                    }\n\n                    cmd.text += ch;\n                }\n            }\n\n            if (!ok)\n                break;\n\n            cmd.text += '\\0';\n        }\n\n        macro.append(cmd);\n    }\n        \n    if (!ok)\n        macro.clear();\n\n    return ok;\n}\n\n\n// Write a macro to a string.\nQString QsciMacro::save() const\n{\n    QString ms;\n\n    QValueList<Macro>::const_iterator it;\n\n    for (it = macro.begin(); it != macro.end(); ++it)\n    {\n        if (!ms.isEmpty())\n            ms += ' ';\n\n        unsigned len = (*it).text.size();\n        QString m;\n\n        ms += m.sprintf(\"%u %lu %u\", (*it).msg, (*it).wParam, len);\n\n        if (len)\n        {\n\n            ms += ' ';\n\n            const char *cp = (*it).text.data();\n\n            while (len--)\n            {\n                unsigned char ch = *cp++;\n\n                if (ch == '\\\\' || ch == '\"' || ch <= ' ' || ch >= 0x7f)\n                {\n                    QString buf;\n\n                    ms += buf.sprintf(\"\\\\%02x\", ch);\n                }\n                else\n                    ms += ch;\n            }\n        }\n    }\n\n    return ms;\n}\n\n\n// Play the macro.\nvoid QsciMacro::play()\n{\n    if (!qsci)\n        return;\n\n    QValueList<Macro>::const_iterator it;\n\n    for (it = macro.begin(); it != macro.end(); ++it)\n        qsci->SendScintilla((*it).msg, (*it).wParam, (*it).text.data());\n}\n\n\n// Start recording.\nvoid QsciMacro::startRecording()\n{\n    if (!qsci)\n        return;\n\n    macro.clear();\n\n    connect(qsci, SIGNAL(SCN_MACRORECORD(unsigned int, unsigned long, void *)),\n            SLOT(record(unsigned int, unsigned long, void *)));\n\n    qsci->SendScintilla(QsciScintillaBase::SCI_STARTRECORD);\n}\n\n\n// End recording.\nvoid QsciMacro::endRecording()\n{\n    if (!qsci)\n        return;\n\n    qsci->SendScintilla(QsciScintillaBase::SCI_STOPRECORD);\n    qsci->disconnect(this);\n}\n\n\n// Record a command.\nvoid QsciMacro::record(unsigned int msg, unsigned long wParam, void *lParam)\n{\n    Macro m;\n\n    m.msg = msg;\n    m.wParam = wParam;\n\n    // Determine commands which need special handling of the parameters.\n    switch (msg)\n    {\n    case QsciScintillaBase::SCI_ADDTEXT:\n        m.text.duplicate(reinterpret_cast<const char *>(lParam), wParam);\n        break;\n\n    case QsciScintillaBase::SCI_REPLACESEL:\n        if (!macro.isEmpty() && macro.last().msg == QsciScintillaBase::SCI_REPLACESEL)\n        {\n            // This is the command used for ordinary user input so it's a\n            // significant space reduction to append it to the previous\n            // command.\n\n            macro.last().text.append(reinterpret_cast<const char *>(lParam));\n            return;\n        }\n\n        /* Drop through. */\n\n    case QsciScintillaBase::SCI_INSERTTEXT:\n    case QsciScintillaBase::SCI_APPENDTEXT:\n    case QsciScintillaBase::SCI_SEARCHNEXT:\n    case QsciScintillaBase::SCI_SEARCHPREV:\n        m.text.append(reinterpret_cast<const char *>(lParam));\n        break;\n    }\n\n    macro.append(m);\n}\n\n\n// Return the given hex character as a binary.\nstatic int fromHex(unsigned char ch)\n{\n    if (ch >= '0' && ch <= '9')\n        return ch - '0';\n\n    if (ch >= 'a' && ch <= 'f')\n        return ch - 'a' + 10;\n\n    return -1;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscintilla.pro",
    "content": "# The project file for the QScintilla library.\n#\n# Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n# \n# This file is part of QScintilla.\n# \n# This file may be used under the terms of the GNU General Public\n# License versions 2.0 or 3.0 as published by the Free Software\n# Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n# included in the packaging of this file.  Alternatively you may (at\n# your option) use any later version of the GNU General Public\n# License if such license has been publicly approved by Riverbank\n# Computing Limited (or its successors, if any) and the KDE Free Qt\n# Foundation. In addition, as a special exception, Riverbank gives you\n# certain additional rights. These rights are described in the Riverbank\n# GPL Exception version 1.1, which can be found in the file\n# GPL_EXCEPTION.txt in this package.\n# \n# If you are unsure which license is appropriate for your use, please\n# contact the sales department at sales@riverbankcomputing.com.\n# \n# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n# This must be kept in sync with Python/configure.py, Python/configure-old.py,\n# example-Qt4Qt5/application.pro and designer-Qt4Qt5/designer.pro.\n!win32:VERSION = 11.3.0\n\nTEMPLATE = lib\nTARGET = qscintilla2\nCONFIG += qt warn_off release thread exceptions\nINCLUDEPATH += . ../include ../lexlib ../src\n\nDEFINES += QSCINTILLA_MAKE_DLL SCINTILLA_QT SCI_LEXER\ngreaterThan(QT_MAJOR_VERSION, 3) {\n    CONFIG(staticlib) {\n        DEFINES -= QSCINTILLA_MAKE_DLL\n    }\n}\n\ngreaterThan(QT_MAJOR_VERSION, 4) {\n\tQT += widgets printsupport\n\n    greaterThan(QT_MINOR_VERSION, 1) {\n\t    macx:QT += macextras\n    }\n\n    # Work around QTBUG-39300.\n    CONFIG -= android_install\n}\n\n# Comment this in if you want the internal Scintilla classes to be placed in a\n# Scintilla namespace rather than pollute the global namespace.\n#DEFINES += SCI_NAMESPACE\n\n# Handle both Qt v4 and v3.\ntarget.path = $$[QT_INSTALL_LIBS]\nisEmpty(target.path) {\n\ttarget.path = $(QTDIR)/lib\n}\n\nheader.path = $$[QT_INSTALL_HEADERS]\nheader.files = Qsci\nisEmpty(header.path) {\n\theader.path = $(QTDIR)/include/Qsci\n\theader.files = Qsci/qsci*.h\n}\n\ntrans.path = $$[QT_INSTALL_TRANSLATIONS]\ntrans.files = qscintilla_*.qm\nisEmpty(trans.path) {\n\ttrans.path = $(QTDIR)/translations\n}\n\nqsci.path = $$[QT_INSTALL_DATA]\nqsci.files = ../qsci\nisEmpty(qsci.path) {\n\tqsci.path = $(QTDIR)\n}\n\nINSTALLS += header trans qsci target\n\ngreaterThan(QT_MAJOR_VERSION, 3) {\n    features.path = $$[QT_INSTALL_DATA]/mkspecs/features\n    features.files = $$PWD/features/qscintilla2.prf\n    INSTALLS += features\n}\n\nHEADERS = \\\n\t./Qsci/qsciglobal.h \\\n\t./Qsci/qsciscintilla.h \\\n\t./Qsci/qsciscintillabase.h \\\n\t./Qsci/qsciabstractapis.h \\\n\t./Qsci/qsciapis.h \\\n\t./Qsci/qscicommand.h \\\n\t./Qsci/qscicommandset.h \\\n\t./Qsci/qscidocument.h \\\n\t./Qsci/qscilexer.h \\\n\t./Qsci/qscilexeravs.h \\\n\t./Qsci/qscilexerbash.h \\\n\t./Qsci/qscilexerbatch.h \\\n\t./Qsci/qscilexercmake.h \\\n\t./Qsci/qscilexercoffeescript.h \\\n\t./Qsci/qscilexercpp.h \\\n\t./Qsci/qscilexercsharp.h \\\n\t./Qsci/qscilexercss.h \\\n\t./Qsci/qscilexercustom.h \\\n\t./Qsci/qscilexerd.h \\\n\t./Qsci/qscilexerdiff.h \\\n\t./Qsci/qscilexerfortran.h \\\n\t./Qsci/qscilexerfortran77.h \\\n\t./Qsci/qscilexerhtml.h \\\n\t./Qsci/qscilexeridl.h \\\n\t./Qsci/qscilexerjava.h \\\n\t./Qsci/qscilexerjavascript.h \\\n\t./Qsci/qscilexerlua.h \\\n\t./Qsci/qscilexermakefile.h \\\n\t./Qsci/qscilexermatlab.h \\\n\t./Qsci/qscilexeroctave.h \\\n\t./Qsci/qscilexerpascal.h \\\n\t./Qsci/qscilexerperl.h \\\n\t./Qsci/qscilexerpostscript.h \\\n\t./Qsci/qscilexerpo.h \\\n\t./Qsci/qscilexerpov.h \\\n\t./Qsci/qscilexerproperties.h \\\n\t./Qsci/qscilexerpython.h \\\n\t./Qsci/qscilexerruby.h \\\n\t./Qsci/qscilexerspice.h \\\n\t./Qsci/qscilexersql.h \\\n\t./Qsci/qscilexertcl.h \\\n\t./Qsci/qscilexertex.h \\\n\t./Qsci/qscilexerverilog.h \\\n\t./Qsci/qscilexervhdl.h \\\n\t./Qsci/qscilexerxml.h \\\n\t./Qsci/qscilexeryaml.h \\\n\t./Qsci/qscimacro.h \\\n\t./Qsci/qsciprinter.h \\\n\t./Qsci/qscistyle.h \\\n\t./Qsci/qscistyledtext.h \\\n\tListBoxQt.h \\\n\tSciClasses.h \\\n\tSciNamespace.h \\\n\tScintillaQt.h \\\n\t../include/ILexer.h \\\n\t../include/Platform.h \\\n\t../include/SciLexer.h \\\n\t../include/Scintilla.h \\\n\t../include/ScintillaWidget.h \\\n\t../lexlib/Accessor.h \\\n\t../lexlib/CharacterCategory.h \\\n\t../lexlib/CharacterSet.h \\\n\t../lexlib/LexAccessor.h \\\n\t../lexlib/LexerBase.h \\\n\t../lexlib/LexerModule.h \\\n\t../lexlib/LexerNoExceptions.h \\\n\t../lexlib/LexerSimple.h \\\n\t../lexlib/OptionSet.h \\\n\t../lexlib/PropSetSimple.h \\\n\t../lexlib/StyleContext.h \\\n\t../lexlib/SubStyles.h \\\n\t../lexlib/WordList.h \\\n\t../src/AutoComplete.h \\\n\t../src/CallTip.h \\\n\t../src/CaseConvert.h \\\n\t../src/CaseFolder.h \\\n\t../src/Catalogue.h \\\n\t../src/CellBuffer.h \\\n\t../src/CharClassify.h \\\n\t../src/ContractionState.h \\\n\t../src/Decoration.h \\\n\t../src/Document.h \\\n\t../src/Editor.h \\\n\t../src/ExternalLexer.h \\\n\t../src/FontQuality.h \\\n\t../src/Indicator.h \\\n\t../src/KeyMap.h \\\n\t../src/LineMarker.h \\\n\t../src/Partitioning.h \\\n\t../src/PerLine.h \\\n\t../src/PositionCache.h \\\n\t../src/RESearch.h \\\n\t../src/RunStyles.h \\\n\t../src/ScintillaBase.h \\\n\t../src/Selection.h \\\n\t../src/SplitVector.h \\\n\t../src/Style.h \\\n\t../src/UnicodeFromUTF8.h \\\n\t../src/UniConversion.h \\\n\t../src/ViewStyle.h \\\n\t../src/XPM.h\n\nSOURCES = \\\n\tqsciscintilla.cpp \\\n\tqsciscintillabase.cpp \\\n\tqsciabstractapis.cpp \\\n\tqsciapis.cpp \\\n\tqscicommand.cpp \\\n\tqscicommandset.cpp \\\n\tqscidocument.cpp \\\n\tqscilexer.cpp \\\n\tqscilexeravs.cpp \\\n\tqscilexerbash.cpp \\\n\tqscilexerbatch.cpp \\\n\tqscilexercmake.cpp \\\n\tqscilexercoffeescript.cpp \\\n\tqscilexercpp.cpp \\\n\tqscilexercsharp.cpp \\\n\tqscilexercss.cpp \\\n\tqscilexercustom.cpp \\\n\tqscilexerd.cpp \\\n\tqscilexerdiff.cpp \\\n\tqscilexerfortran.cpp \\\n\tqscilexerfortran77.cpp \\\n\tqscilexerhtml.cpp \\\n\tqscilexeridl.cpp \\\n\tqscilexerjava.cpp \\\n\tqscilexerjavascript.cpp \\\n\tqscilexerlua.cpp \\\n\tqscilexermakefile.cpp \\\n\tqscilexermatlab.cpp \\\n\tqscilexeroctave.cpp \\\n\tqscilexerpascal.cpp \\\n\tqscilexerperl.cpp \\\n\tqscilexerpostscript.cpp \\\n\tqscilexerpo.cpp \\\n\tqscilexerpov.cpp \\\n\tqscilexerproperties.cpp \\\n\tqscilexerpython.cpp \\\n\tqscilexerruby.cpp \\\n\tqscilexerspice.cpp \\\n\tqscilexersql.cpp \\\n\tqscilexertcl.cpp \\\n\tqscilexertex.cpp \\\n\tqscilexerverilog.cpp \\\n\tqscilexervhdl.cpp \\\n\tqscilexerxml.cpp \\\n\tqscilexeryaml.cpp \\\n\tqscimacro.cpp \\\n\tqsciprinter.cpp \\\n\tqscistyle.cpp \\\n\tqscistyledtext.cpp \\\n    MacPasteboardMime.cpp \\\n    InputMethod.cpp \\\n\tSciClasses.cpp \\\n\tListBoxQt.cpp \\\n\tPlatQt.cpp \\\n\tScintillaQt.cpp \\\n\t../lexers/LexA68k.cpp \\\n\t../lexers/LexAbaqus.cpp \\\n\t../lexers/LexAda.cpp \\\n\t../lexers/LexAPDL.cpp \\\n\t../lexers/LexAsm.cpp \\\n\t../lexers/LexAsn1.cpp \\\n\t../lexers/LexASY.cpp \\\n\t../lexers/LexAU3.cpp \\\n\t../lexers/LexAVE.cpp \\\n\t../lexers/LexAVS.cpp \\\n\t../lexers/LexBaan.cpp \\\n\t../lexers/LexBash.cpp \\\n\t../lexers/LexBasic.cpp \\\n\t../lexers/LexBullant.cpp \\\n\t../lexers/LexCaml.cpp \\\n\t../lexers/LexCLW.cpp \\\n\t../lexers/LexCmake.cpp \\\n\t../lexers/LexCOBOL.cpp \\\n\t../lexers/LexCoffeeScript.cpp \\\n\t../lexers/LexConf.cpp \\\n\t../lexers/LexCPP.cpp \\\n\t../lexers/LexCrontab.cpp \\\n\t../lexers/LexCsound.cpp \\\n\t../lexers/LexCSS.cpp \\\n\t../lexers/LexD.cpp \\\n\t../lexers/LexECL.cpp \\\n\t../lexers/LexEiffel.cpp \\\n\t../lexers/LexErlang.cpp \\\n\t../lexers/LexEScript.cpp \\\n\t../lexers/LexFlagship.cpp \\\n\t../lexers/LexForth.cpp \\\n\t../lexers/LexFortran.cpp \\\n\t../lexers/LexGAP.cpp \\\n\t../lexers/LexGui4Cli.cpp \\\n\t../lexers/LexHaskell.cpp \\\n\t../lexers/LexHTML.cpp \\\n\t../lexers/LexInno.cpp \\\n\t../lexers/LexKix.cpp \\\n\t../lexers/LexKVIrc.cpp \\\n\t../lexers/LexLaTex.cpp \\\n\t../lexers/LexLisp.cpp \\\n\t../lexers/LexLout.cpp \\\n\t../lexers/LexLua.cpp \\\n\t../lexers/LexMagik.cpp \\\n\t../lexers/LexMarkdown.cpp \\\n\t../lexers/LexMatlab.cpp \\\n\t../lexers/LexMetapost.cpp \\\n\t../lexers/LexMMIXAL.cpp \\\n\t../lexers/LexModula.cpp \\\n\t../lexers/LexMPT.cpp \\\n\t../lexers/LexMSSQL.cpp \\\n\t../lexers/LexMySQL.cpp \\\n\t../lexers/LexNimrod.cpp \\\n\t../lexers/LexNsis.cpp \\\n\t../lexers/LexOpal.cpp \\\n\t../lexers/LexOScript.cpp \\\n\t../lexers/LexOthers.cpp \\\n\t../lexers/LexPascal.cpp \\\n\t../lexers/LexPB.cpp \\\n\t../lexers/LexPerl.cpp \\\n\t../lexers/LexPLM.cpp \\\n\t../lexers/LexPO.cpp \\\n\t../lexers/LexPOV.cpp \\\n\t../lexers/LexPowerPro.cpp \\\n\t../lexers/LexPowerShell.cpp \\\n\t../lexers/LexProgress.cpp \\\n\t../lexers/LexPS.cpp \\\n\t../lexers/LexPython.cpp \\\n\t../lexers/LexR.cpp \\\n\t../lexers/LexRebol.cpp \\\n\t../lexers/LexRuby.cpp \\\n\t../lexers/LexRust.cpp \\\n\t../lexers/LexScriptol.cpp \\\n\t../lexers/LexSmalltalk.cpp \\\n\t../lexers/LexSML.cpp \\\n\t../lexers/LexSorcus.cpp \\\n\t../lexers/LexSpecman.cpp \\\n\t../lexers/LexSpice.cpp \\\n\t../lexers/LexSQL.cpp \\\n\t../lexers/LexSTTXT.cpp \\\n\t../lexers/LexTACL.cpp \\\n\t../lexers/LexTADS3.cpp \\\n\t../lexers/LexTAL.cpp \\\n\t../lexers/LexTCL.cpp \\\n\t../lexers/LexTCMD.cpp \\\n\t../lexers/LexTeX.cpp \\\n\t../lexers/LexTxt2tags.cpp \\\n\t../lexers/LexVB.cpp \\\n\t../lexers/LexVerilog.cpp \\\n\t../lexers/LexVHDL.cpp \\\n\t../lexers/LexVisualProlog.cpp \\\n\t../lexers/LexYAML.cpp \\\n\t../lexlib/Accessor.cpp \\\n\t../lexlib/CharacterCategory.cpp \\\n\t../lexlib/CharacterSet.cpp \\\n\t../lexlib/LexerBase.cpp \\\n\t../lexlib/LexerModule.cpp \\\n\t../lexlib/LexerNoExceptions.cpp \\\n\t../lexlib/LexerSimple.cpp \\\n\t../lexlib/PropSetSimple.cpp \\\n\t../lexlib/StyleContext.cpp \\\n\t../lexlib/WordList.cpp \\\n\t../src/AutoComplete.cpp \\\n\t../src/CallTip.cpp \\\n\t../src/CaseConvert.cpp \\\n\t../src/CaseFolder.cpp \\\n\t../src/Catalogue.cpp \\\n\t../src/CellBuffer.cpp \\\n\t../src/CharClassify.cpp \\\n\t../src/ContractionState.cpp \\\n\t../src/Decoration.cpp \\\n\t../src/Document.cpp \\\n\t../src/Editor.cpp \\\n\t../src/ExternalLexer.cpp \\\n\t../src/Indicator.cpp \\\n    ../src/KeyMap.cpp \\\n\t../src/LineMarker.cpp \\\n\t../src/PerLine.cpp \\\n\t../src/PositionCache.cpp \\\n    ../src/RESearch.cpp \\\n\t../src/RunStyles.cpp \\\n    ../src/ScintillaBase.cpp \\\n    ../src/Selection.cpp \\\n\t../src/Style.cpp \\\n\t../src/UniConversion.cpp \\\n\t../src/ViewStyle.cpp \\\n\t../src/XPM.cpp\n\nTRANSLATIONS = \\\n\tqscintilla_cs.ts \\\n\tqscintilla_de.ts \\\n\tqscintilla_es.ts \\\n\tqscintilla_fr.ts \\\n\tqscintilla_pt_br.ts\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscintilla_cs.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"pt\">\n<context>\n    <name>QsciCommand</name>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"44\"/>\n        <source>Move down one line</source>\n        <translation>Posun o jednu řádku dolů</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"54\"/>\n        <source>Extend selection down one line</source>\n        <translation>Rozšířit výběr o jednu řádku dolů</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"71\"/>\n        <source>Scroll view down one line</source>\n        <translation>Rolovat pohled o jednu řádku dolů</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"64\"/>\n        <source>Extend rectangular selection down one line</source>\n        <translation>Rozšířit obdélníkový výběr o jednu řádku dolů</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"81\"/>\n        <source>Move up one line</source>\n        <translation>Posun o jednu řádku nahoru</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"91\"/>\n        <source>Extend selection up one line</source>\n        <translation>Rozšířit výběr o jednu řádku nahoru</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"108\"/>\n        <source>Scroll view up one line</source>\n        <translation>Rolovat pohled o jednu řádku nahoru</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"101\"/>\n        <source>Extend rectangular selection up one line</source>\n        <translation>Rozšířit obdélníkový výběr o jednu řádku nahoru</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"158\"/>\n        <source>Move up one paragraph</source>\n        <translation>Posun o jeden odstavec nahoru</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"164\"/>\n        <source>Extend selection up one paragraph</source>\n        <translation>Rozšířit výběr o jeden odstavec nahoru</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"145\"/>\n        <source>Move down one paragraph</source>\n        <translation>Posun o jeden odstavec dolů</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"118\"/>\n        <source>Scroll to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"128\"/>\n        <source>Scroll to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"138\"/>\n        <source>Scroll vertically to centre current line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"151\"/>\n        <source>Extend selection down one paragraph</source>\n        <translation>Rozšířit výběr o jeden odstavec dolů</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"175\"/>\n        <source>Move left one character</source>\n        <translation>Posun o jedno písmeno doleva</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"185\"/>\n        <source>Extend selection left one character</source>\n        <translation>Rozšířit výběr o jedno písmeno doleva</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"239\"/>\n        <source>Move left one word</source>\n        <translation>Posun o jedno slovo vlevo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"249\"/>\n        <source>Extend selection left one word</source>\n        <translation>Rozšířit výběr o jedno slovo doleva</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"196\"/>\n        <source>Extend rectangular selection left one character</source>\n        <translation>Rozšířit obdélníkový výběr o jedno písmeno doleva</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"207\"/>\n        <source>Move right one character</source>\n        <translation>Posun o jedno písmeno doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"217\"/>\n        <source>Extend selection right one character</source>\n        <translation>Rozšířit výběr o jedno písmeno doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"259\"/>\n        <source>Move right one word</source>\n        <translation>Posun o jedno slovo doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"265\"/>\n        <source>Extend selection right one word</source>\n        <translation>Rozšířit výběr o jedno slovo doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"228\"/>\n        <source>Extend rectangular selection right one character</source>\n        <translation>Rozšířit obdélníkový výběr o jedno písmeno doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"271\"/>\n        <source>Move to end of previous word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"277\"/>\n        <source>Extend selection to end of previous word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"288\"/>\n        <source>Move to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"298\"/>\n        <source>Extend selection to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"305\"/>\n        <source>Move left one word part</source>\n        <translation>Posun o část slova doleva</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"311\"/>\n        <source>Extend selection left one word part</source>\n        <translation>Rozšířit výběr o část slova doleva</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"318\"/>\n        <source>Move right one word part</source>\n        <translation>Posun o část slova doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"324\"/>\n        <source>Extend selection right one word part</source>\n        <translation>Rozšířit výběr o část slova doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"558\"/>\n        <source>Move up one page</source>\n        <translation>Posun na předchozí stranu</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"568\"/>\n        <source>Extend selection up one page</source>\n        <translation>Rozšířit výběr na předchozí stranu</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"578\"/>\n        <source>Extend rectangular selection up one page</source>\n        <translation>Rozšířit obdélníkový výběr na předchozí stranu</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"593\"/>\n        <source>Move down one page</source>\n        <translation>Posun na další stranu</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"607\"/>\n        <source>Extend selection down one page</source>\n        <translation>Rozšířit výběr na další stranu</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"621\"/>\n        <source>Extend rectangular selection down one page</source>\n        <translation>Rozšířit obdélníkový výběr na další stranu</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"658\"/>\n        <source>Delete current character</source>\n        <translation>Smazat aktuální znak</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"788\"/>\n        <source>Cut selection</source>\n        <translation>Vyjmout výběr</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"687\"/>\n        <source>Delete word to right</source>\n        <translation>Smazat slovo doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"335\"/>\n        <source>Move to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"345\"/>\n        <source>Extend selection to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"356\"/>\n        <source>Extend rectangular selection to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"367\"/>\n        <source>Move to start of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"377\"/>\n        <source>Extend selection to start of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"384\"/>\n        <source>Move to start of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"391\"/>\n        <source>Extend selection to start of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"402\"/>\n        <source>Move to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"413\"/>\n        <source>Extend selection to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"424\"/>\n        <source>Extend rectangular selection to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"431\"/>\n        <source>Move to first visible character of display in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"438\"/>\n        <source>Extend selection to first visible character in display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"449\"/>\n        <source>Move to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"459\"/>\n        <source>Extend selection to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"470\"/>\n        <source>Extend rectangular selection to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"481\"/>\n        <source>Move to end of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"491\"/>\n        <source>Extend selection to end of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"498\"/>\n        <source>Move to end of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"505\"/>\n        <source>Extend selection to end of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"516\"/>\n        <source>Move to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"526\"/>\n        <source>Extend selection to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"537\"/>\n        <source>Move to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"547\"/>\n        <source>Extend selection to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"628\"/>\n        <source>Stuttered move up one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"634\"/>\n        <source>Stuttered extend selection up one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"641\"/>\n        <source>Stuttered move down one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"647\"/>\n        <source>Stuttered extend selection down one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"674\"/>\n        <source>Delete previous character if not at start of line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"697\"/>\n        <source>Delete right to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"714\"/>\n        <source>Delete line to right</source>\n        <translation>Smazat řádku doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"738\"/>\n        <source>Transpose current and previous lines</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"745\"/>\n        <source>Duplicate the current line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"751\"/>\n        <source>Select all</source>\n        <oldsource>Select document</oldsource>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"757\"/>\n        <source>Move selected lines up one line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"763\"/>\n        <source>Move selected lines down one line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"806\"/>\n        <source>Toggle insert/overtype</source>\n        <translation>Přepnout vkládání/přepisování</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"800\"/>\n        <source>Paste</source>\n        <translation>Vložit</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"794\"/>\n        <source>Copy selection</source>\n        <translation>Kopírovat výběr</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"812\"/>\n        <source>Insert newline</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"830\"/>\n        <source>De-indent one level</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"836\"/>\n        <source>Cancel</source>\n        <translation>Zrušit</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"668\"/>\n        <source>Delete previous character</source>\n        <translation>Smazat předchozí znak</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"681\"/>\n        <source>Delete word to left</source>\n        <translation>Smazat slovo doleva</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"704\"/>\n        <source>Delete line to left</source>\n        <translation>Smazat řádku doleva</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"842\"/>\n        <source>Undo last command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"852\"/>\n        <source>Redo last command</source>\n        <translation>Znovu použít poslední příkaz</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"824\"/>\n        <source>Indent one level</source>\n        <translation>Odsadit o jednu úroveň</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"858\"/>\n        <source>Zoom in</source>\n        <translation>Zvětšit</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"864\"/>\n        <source>Zoom out</source>\n        <translation>Zmenšit</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"818\"/>\n        <source>Formfeed</source>\n        <translation>Vysunout</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"726\"/>\n        <source>Cut current line</source>\n        <translation>Vyjmout aktuální řádku</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"720\"/>\n        <source>Delete current line</source>\n        <translation>Smazat aktuální řádku</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"732\"/>\n        <source>Copy current line</source>\n        <translation>Kopírovat aktuální řádku</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"776\"/>\n        <source>Convert selection to lower case</source>\n        <translation>Vybraný text převést na malá písmena</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"782\"/>\n        <source>Convert selection to upper case</source>\n        <translation>Vybraný text převést na velká písmena</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"770\"/>\n        <source>Duplicate selection</source>\n        <translation>Duplikovat výběr</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerAVS</name>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"280\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"283\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"286\"/>\n        <source>Nested block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"289\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"301\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"304\"/>\n        <source>Triple double-quoted string</source>\n        <translation type=\"unfinished\">String ve třech dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"307\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"310\"/>\n        <source>Filter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"313\"/>\n        <source>Plugin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"316\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"319\"/>\n        <source>Clip property</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"322\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBash</name>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"193\"/>\n        <source>Default</source>\n        <translation>Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"196\"/>\n        <source>Error</source>\n        <translation>Chyba</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"199\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"202\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"205\"/>\n        <source>Keyword</source>\n        <translation>Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"208\"/>\n        <source>Double-quoted string</source>\n        <translation>String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"211\"/>\n        <source>Single-quoted string</source>\n        <translation>String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"214\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"217\"/>\n        <source>Identifier</source>\n        <translation>Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"220\"/>\n        <source>Scalar</source>\n        <translation>Skalár</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"223\"/>\n        <source>Parameter expansion</source>\n        <translation>Rozklad parametru</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"226\"/>\n        <source>Backticks</source>\n        <translation>Zpětný chod</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"229\"/>\n        <source>Here document delimiter</source>\n        <translation>Zde je oddělovač dokumentu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"232\"/>\n        <source>Single-quoted here document</source>\n        <translation>Jednoduché uvozovky zde v dokumentu</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBatch</name>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"164\"/>\n        <source>Default</source>\n        <translation>Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"167\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation>Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"173\"/>\n        <source>Label</source>\n        <translation>Nadpis</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"176\"/>\n        <source>Hide command character</source>\n        <translation>Skrýt písmeno příkazu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"179\"/>\n        <source>External command</source>\n        <translation>Externí příkaz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"182\"/>\n        <source>Variable</source>\n        <translation>Proměnná</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"185\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCMake</name>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"181\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"184\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"187\"/>\n        <source>String</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"190\"/>\n        <source>Left quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"193\"/>\n        <source>Right quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"196\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"199\"/>\n        <source>Variable</source>\n        <translation type=\"unfinished\">Proměnná</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"202\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Nadpis</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"205\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"208\"/>\n        <source>WHILE block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"211\"/>\n        <source>FOREACH block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"214\"/>\n        <source>IF block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"217\"/>\n        <source>MACRO block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"220\"/>\n        <source>Variable within a string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"223\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCPP</name>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"340\"/>\n        <source>Default</source>\n        <translation>Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"343\"/>\n        <source>Inactive default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"346\"/>\n        <source>C comment</source>\n        <translation>C komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"349\"/>\n        <source>Inactive C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"352\"/>\n        <source>C++ comment</source>\n        <translation>C++ komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"355\"/>\n        <source>Inactive C++ comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"358\"/>\n        <source>JavaDoc style C comment</source>\n        <translation>JavaDoc styl C komentáře</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"361\"/>\n        <source>Inactive JavaDoc style C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"364\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"367\"/>\n        <source>Inactive number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"370\"/>\n        <source>Keyword</source>\n        <translation>Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"373\"/>\n        <source>Inactive keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"376\"/>\n        <source>Double-quoted string</source>\n        <translation>String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"379\"/>\n        <source>Inactive double-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"382\"/>\n        <source>Single-quoted string</source>\n        <translation>String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"385\"/>\n        <source>Inactive single-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"388\"/>\n        <source>IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"391\"/>\n        <source>Inactive IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"394\"/>\n        <source>Pre-processor block</source>\n        <translation>Pre-procesor blok</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"397\"/>\n        <source>Inactive pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"400\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"403\"/>\n        <source>Inactive operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"406\"/>\n        <source>Identifier</source>\n        <translation>Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"409\"/>\n        <source>Inactive identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"412\"/>\n        <source>Unclosed string</source>\n        <translation>Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"415\"/>\n        <source>Inactive unclosed string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"418\"/>\n        <source>C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"421\"/>\n        <source>Inactive C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"424\"/>\n        <source>JavaScript regular expression</source>\n        <translation type=\"unfinished\">JavaSript regulární výraz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"427\"/>\n        <source>Inactive JavaScript regular expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"430\"/>\n        <source>JavaDoc style C++ comment</source>\n        <translation>JavaDoc styl C++ komentáře</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"433\"/>\n        <source>Inactive JavaDoc style C++ comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"436\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Sekundární klíčová slova a identifikátory</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"439\"/>\n        <source>Inactive secondary keywords and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"442\"/>\n        <source>JavaDoc keyword</source>\n        <translation>JavaDoc klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"445\"/>\n        <source>Inactive JavaDoc keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"448\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>JavaDoc klíčové slovo chyby</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"451\"/>\n        <source>Inactive JavaDoc keyword error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"454\"/>\n        <source>Global classes and typedefs</source>\n        <translation>Globální třídy a definice typů</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"457\"/>\n        <source>Inactive global classes and typedefs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"460\"/>\n        <source>C++ raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"463\"/>\n        <source>Inactive C++ raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"466\"/>\n        <source>Vala triple-quoted verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"469\"/>\n        <source>Inactive Vala triple-quoted verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"472\"/>\n        <source>Pike hash-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"475\"/>\n        <source>Inactive Pike hash-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"478\"/>\n        <source>Pre-processor C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"481\"/>\n        <source>Inactive pre-processor C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"484\"/>\n        <source>JavaDoc style pre-processor comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"487\"/>\n        <source>Inactive JavaDoc style pre-processor comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSS</name>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"225\"/>\n        <source>Tag</source>\n        <translation>Tag</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"228\"/>\n        <source>Class selector</source>\n        <translation>Selektor třídy</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"231\"/>\n        <source>Pseudo-class</source>\n        <translation>Pseudotřída</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"234\"/>\n        <source>Unknown pseudo-class</source>\n        <translation>Nedefinovaná pseudotřída</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"237\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"240\"/>\n        <source>CSS1 property</source>\n        <translation>CSS1 vlastnost</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"243\"/>\n        <source>Unknown property</source>\n        <translation>Nedefinovaná vlastnost</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"246\"/>\n        <source>Value</source>\n        <translation>Hodnota</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"249\"/>\n        <source>ID selector</source>\n        <translation>ID selektor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"252\"/>\n        <source>Important</source>\n        <translation>Important</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"255\"/>\n        <source>@-rule</source>\n        <translation>@-pravidlo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"258\"/>\n        <source>Double-quoted string</source>\n        <translation>String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"261\"/>\n        <source>Single-quoted string</source>\n        <translation>String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"264\"/>\n        <source>CSS2 property</source>\n        <translation>CSS2 vlastnost</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"267\"/>\n        <source>Attribute</source>\n        <translation>Atribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"270\"/>\n        <source>CSS3 property</source>\n        <translation type=\"unfinished\">CSS2 vlastnost {3 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"273\"/>\n        <source>Pseudo-element</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"276\"/>\n        <source>Extended CSS property</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"279\"/>\n        <source>Extended pseudo-class</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"282\"/>\n        <source>Extended pseudo-element</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"285\"/>\n        <source>Media rule</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"288\"/>\n        <source>Variable</source>\n        <translation type=\"unfinished\">Proměnná</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSharp</name>\n    <message>\n        <location filename=\"qscilexercsharp.cpp\" line=\"95\"/>\n        <source>Verbatim string</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCoffeeScript</name>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"244\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"247\"/>\n        <source>C-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"250\"/>\n        <source>C++-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"253\"/>\n        <source>JavaDoc C-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"256\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"259\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"262\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"265\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"268\"/>\n        <source>IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"271\"/>\n        <source>Pre-processor block</source>\n        <translation type=\"unfinished\">Pre-procesor blok</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"274\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"277\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"280\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"283\"/>\n        <source>C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"286\"/>\n        <source>Regular expression</source>\n        <translation type=\"unfinished\">Regulární výraz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"289\"/>\n        <source>JavaDoc C++-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"292\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation type=\"unfinished\">Sekundární klíčová slova a identifikátory</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"295\"/>\n        <source>JavaDoc keyword</source>\n        <translation type=\"unfinished\">JavaDoc klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword error</source>\n        <translation type=\"unfinished\">JavaDoc klíčové slovo chyby</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"301\"/>\n        <source>Global classes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"304\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"307\"/>\n        <source>Block regular expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"310\"/>\n        <source>Block regular expression comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerD</name>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"259\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"262\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"265\"/>\n        <source>DDoc style block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"268\"/>\n        <source>Nesting comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"271\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"274\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"277\"/>\n        <source>Secondary keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"280\"/>\n        <source>Documentation keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"283\"/>\n        <source>Type definition</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"286\"/>\n        <source>String</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"289\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"292\"/>\n        <source>Character</source>\n        <translation type=\"unfinished\">Znak</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"301\"/>\n        <source>DDoc style line comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"304\"/>\n        <source>DDoc keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"307\"/>\n        <source>DDoc keyword error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"310\"/>\n        <source>Backquoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"313\"/>\n        <source>Raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"316\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Definováno uživatelem 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"319\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Definováno uživatelem 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"322\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Definováno uživatelem 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerDiff</name>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"92\"/>\n        <source>Default</source>\n        <translation>Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"95\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"98\"/>\n        <source>Command</source>\n        <translation>Příkaz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"101\"/>\n        <source>Header</source>\n        <translation>Hlavička</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"104\"/>\n        <source>Position</source>\n        <translation>Pozice</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"107\"/>\n        <source>Removed line</source>\n        <translation>Odebraná řádka</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"110\"/>\n        <source>Added line</source>\n        <translation>Přidaná řádka</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"113\"/>\n        <source>Changed line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerFortran77</name>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"176\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"179\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"182\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"185\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"188\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"191\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"194\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"197\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"200\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"203\"/>\n        <source>Intrinsic function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"206\"/>\n        <source>Extended function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"209\"/>\n        <source>Pre-processor block</source>\n        <translation type=\"unfinished\">Pre-procesor blok</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"212\"/>\n        <source>Dotted operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"215\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Nadpis</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"218\"/>\n        <source>Continuation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerHTML</name>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"553\"/>\n        <source>HTML default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"556\"/>\n        <source>Tag</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"559\"/>\n        <source>Unknown tag</source>\n        <translation>Nedefinovaný tag</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"562\"/>\n        <source>Attribute</source>\n        <translation>Atribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"565\"/>\n        <source>Unknown attribute</source>\n        <translation>Nedefinovaný atribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"568\"/>\n        <source>HTML number</source>\n        <translation>HTML číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"571\"/>\n        <source>HTML double-quoted string</source>\n        <translation>HTML string ve dojtých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"574\"/>\n        <source>HTML single-quoted string</source>\n        <translation>HTML string v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"577\"/>\n        <source>Other text in a tag</source>\n        <translation>Další text v tagu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"580\"/>\n        <source>HTML comment</source>\n        <translation>HTML komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"583\"/>\n        <source>Entity</source>\n        <translation>Entita</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"586\"/>\n        <source>End of a tag</source>\n        <translation>Konec tagu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"589\"/>\n        <source>Start of an XML fragment</source>\n        <translation>Začátek XML části</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"592\"/>\n        <source>End of an XML fragment</source>\n        <translation>Konec XML části</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"595\"/>\n        <source>Script tag</source>\n        <translation>Tag skriptu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"598\"/>\n        <source>Start of an ASP fragment with @</source>\n        <translation>Začátek ASP kódu s @</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"601\"/>\n        <source>Start of an ASP fragment</source>\n        <translation>Začátek ASP kódu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"604\"/>\n        <source>CDATA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"607\"/>\n        <source>Start of a PHP fragment</source>\n        <translation>Začátek PHP kódu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"610\"/>\n        <source>Unquoted HTML value</source>\n        <translation>HTML hodnota bez uvozovek</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"613\"/>\n        <source>ASP X-Code comment</source>\n        <translation>ASP X-Code komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"616\"/>\n        <source>SGML default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"619\"/>\n        <source>SGML command</source>\n        <translation>SGML příkaz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"622\"/>\n        <source>First parameter of an SGML command</source>\n        <translation>První parametr v SGML příkazu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"625\"/>\n        <source>SGML double-quoted string</source>\n        <translation>SGML string ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"628\"/>\n        <source>SGML single-quoted string</source>\n        <translation>SGML string v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"631\"/>\n        <source>SGML error</source>\n        <translation>SGML chyba</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"634\"/>\n        <source>SGML special entity</source>\n        <translation>SGML speciální entita</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"637\"/>\n        <source>SGML comment</source>\n        <translation>SGML komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"640\"/>\n        <source>First parameter comment of an SGML command</source>\n        <translation>Komentář prvního parametru SGML příkazu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"643\"/>\n        <source>SGML block default</source>\n        <translation>SGML defaultní blok</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"646\"/>\n        <source>Start of a JavaScript fragment</source>\n        <translation>Začátek JavaScript kódu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"649\"/>\n        <source>JavaScript default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"652\"/>\n        <source>JavaScript comment</source>\n        <translation>JavaScript komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"655\"/>\n        <source>JavaScript line comment</source>\n        <translation>JavaScript jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"658\"/>\n        <source>JavaDoc style JavaScript comment</source>\n        <translation>JavaDoc styl JavaScript komentáře</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"661\"/>\n        <source>JavaScript number</source>\n        <translation>JavaScript číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"664\"/>\n        <source>JavaScript word</source>\n        <translation>JavaSript slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"667\"/>\n        <source>JavaScript keyword</source>\n        <translation>JavaSript klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"670\"/>\n        <source>JavaScript double-quoted string</source>\n        <translation>JavaSript string ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"673\"/>\n        <source>JavaScript single-quoted string</source>\n        <translation>JavaSript string v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"676\"/>\n        <source>JavaScript symbol</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"679\"/>\n        <source>JavaScript unclosed string</source>\n        <translation>JavaSript neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"682\"/>\n        <source>JavaScript regular expression</source>\n        <translation>JavaSript regulární výraz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"685\"/>\n        <source>Start of an ASP JavaScript fragment</source>\n        <translation>Začátek ASP JavaScript kódu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"688\"/>\n        <source>ASP JavaScript default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"691\"/>\n        <source>ASP JavaScript comment</source>\n        <translation>ASP JavaScript komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"694\"/>\n        <source>ASP JavaScript line comment</source>\n        <translation>ASP JavaScript jednořádkový komenář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"697\"/>\n        <source>JavaDoc style ASP JavaScript comment</source>\n        <translation>JavaDoc styl ASP JavaScript komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"700\"/>\n        <source>ASP JavaScript number</source>\n        <translation>ASP JavaScript číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"703\"/>\n        <source>ASP JavaScript word</source>\n        <translation>ASP JavaScript slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"706\"/>\n        <source>ASP JavaScript keyword</source>\n        <translation>ASP JavaScript klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"709\"/>\n        <source>ASP JavaScript double-quoted string</source>\n        <translation>ASP JavaScript string ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"712\"/>\n        <source>ASP JavaScript single-quoted string</source>\n        <translation>ASP JavaScript v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"715\"/>\n        <source>ASP JavaScript symbol</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"718\"/>\n        <source>ASP JavaScript unclosed string</source>\n        <translation>ASP JavaScript neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"721\"/>\n        <source>ASP JavaScript regular expression</source>\n        <translation>ASP JavaScript regulární výraz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"724\"/>\n        <source>Start of a VBScript fragment</source>\n        <translation>Začátek VBScript kódu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"727\"/>\n        <source>VBScript default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"730\"/>\n        <source>VBScript comment</source>\n        <translation>VBScript komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"733\"/>\n        <source>VBScript number</source>\n        <translation>VBScript číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"736\"/>\n        <source>VBScript keyword</source>\n        <translation>VBScript klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"739\"/>\n        <source>VBScript string</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"742\"/>\n        <source>VBScript identifier</source>\n        <translation>VBScript identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"745\"/>\n        <source>VBScript unclosed string</source>\n        <translation>VBScript neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"748\"/>\n        <source>Start of an ASP VBScript fragment</source>\n        <translation>Začátek ASP VBScript kódu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"751\"/>\n        <source>ASP VBScript default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"754\"/>\n        <source>ASP VBScript comment</source>\n        <translation>ASP VBScript komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"757\"/>\n        <source>ASP VBScript number</source>\n        <translation>ASP VBScript číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"760\"/>\n        <source>ASP VBScript keyword</source>\n        <translation>ASP VBScript klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"763\"/>\n        <source>ASP VBScript string</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"766\"/>\n        <source>ASP VBScript identifier</source>\n        <translation>ASP VBScript identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"769\"/>\n        <source>ASP VBScript unclosed string</source>\n        <translation>ASP VBScript neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"772\"/>\n        <source>Start of a Python fragment</source>\n        <translation>Začátek Python kódu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"775\"/>\n        <source>Python default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"778\"/>\n        <source>Python comment</source>\n        <translation>Python komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"781\"/>\n        <source>Python number</source>\n        <translation>Python číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"784\"/>\n        <source>Python double-quoted string</source>\n        <translation>Python string ve dojtých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"787\"/>\n        <source>Python single-quoted string</source>\n        <translation>Python string v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"790\"/>\n        <source>Python keyword</source>\n        <translation>Python klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"793\"/>\n        <source>Python triple double-quoted string</source>\n        <translation>Python string ve třech dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"796\"/>\n        <source>Python triple single-quoted string</source>\n        <translation>Python ve třech jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"799\"/>\n        <source>Python class name</source>\n        <translation>Python jméno třídy</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"802\"/>\n        <source>Python function or method name</source>\n        <translation>Python jméno funkce nebo metody</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"805\"/>\n        <source>Python operator</source>\n        <translation>Python operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"808\"/>\n        <source>Python identifier</source>\n        <translation>Python identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"811\"/>\n        <source>Start of an ASP Python fragment</source>\n        <translation>Začátek ASP Python kódu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"814\"/>\n        <source>ASP Python default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"817\"/>\n        <source>ASP Python comment</source>\n        <translation>ASP Python komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"820\"/>\n        <source>ASP Python number</source>\n        <translation>ASP Python číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"823\"/>\n        <source>ASP Python double-quoted string</source>\n        <translation>ASP Python string ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"826\"/>\n        <source>ASP Python single-quoted string</source>\n        <translation>ASP Python v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"829\"/>\n        <source>ASP Python keyword</source>\n        <translation>ASP Python klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"832\"/>\n        <source>ASP Python triple double-quoted string</source>\n        <translation>ASP Python ve třech dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"835\"/>\n        <source>ASP Python triple single-quoted string</source>\n        <translation>ASP Python ve třech jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"838\"/>\n        <source>ASP Python class name</source>\n        <translation>ASP Python jméno třídy</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"841\"/>\n        <source>ASP Python function or method name</source>\n        <translation>ASP Python jméno funkce  nebo metody</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"844\"/>\n        <source>ASP Python operator</source>\n        <translation>ASP Python operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"847\"/>\n        <source>ASP Python identifier</source>\n        <translation>ASP Python identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"850\"/>\n        <source>PHP default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"853\"/>\n        <source>PHP double-quoted string</source>\n        <translation>PHP string ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"856\"/>\n        <source>PHP single-quoted string</source>\n        <translation>PHP v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"859\"/>\n        <source>PHP keyword</source>\n        <translation>PHP klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"862\"/>\n        <source>PHP number</source>\n        <translation>PHP číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"865\"/>\n        <source>PHP variable</source>\n        <translation>PHP proměnná</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"868\"/>\n        <source>PHP comment</source>\n        <translation>PHP komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"871\"/>\n        <source>PHP line comment</source>\n        <translation>PHP jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"874\"/>\n        <source>PHP double-quoted variable</source>\n        <translation>PHP proměnná ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"877\"/>\n        <source>PHP operator</source>\n        <translation>PHP operátor</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerIDL</name>\n    <message>\n        <location filename=\"qscilexeridl.cpp\" line=\"87\"/>\n        <source>UUID</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerJavaScript</name>\n    <message>\n        <location filename=\"qscilexerjavascript.cpp\" line=\"97\"/>\n        <source>Regular expression</source>\n        <translation>Regulární výraz</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerLua</name>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"218\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"221\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"224\"/>\n        <source>Line comment</source>\n        <translation>Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"227\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"230\"/>\n        <source>Keyword</source>\n        <translation>Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"233\"/>\n        <source>String</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"236\"/>\n        <source>Character</source>\n        <translation>Znak</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"239\"/>\n        <source>Literal string</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"242\"/>\n        <source>Preprocessor</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"245\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"248\"/>\n        <source>Identifier</source>\n        <translation>Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"251\"/>\n        <source>Unclosed string</source>\n        <translation>Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"254\"/>\n        <source>Basic functions</source>\n        <translation>Základní funkce</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"257\"/>\n        <source>String, table and maths functions</source>\n        <translation>String, tabulka a matematické funkce</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"260\"/>\n        <source>Coroutines, i/o and system facilities</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"263\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Definováno uživatelem 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"266\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Definováno uživatelem 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"269\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Definováno uživatelem 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"272\"/>\n        <source>User defined 4</source>\n        <translation type=\"unfinished\">Definováno uživatelem 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"275\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Nadpis</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMakefile</name>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"116\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"119\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"122\"/>\n        <source>Preprocessor</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"125\"/>\n        <source>Variable</source>\n        <translation>Proměnná</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"128\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"131\"/>\n        <source>Target</source>\n        <translation>Cíl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"134\"/>\n        <source>Error</source>\n        <translation>Chyba</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMatlab</name>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"123\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"126\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"129\"/>\n        <source>Command</source>\n        <translation type=\"unfinished\">Příkaz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"132\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"135\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"138\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"141\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"144\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"147\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">String ve dvojitých uvozovkách</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPO</name>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"90\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"93\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"96\"/>\n        <source>Message identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"99\"/>\n        <source>Message identifier text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"102\"/>\n        <source>Message string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"105\"/>\n        <source>Message string text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"108\"/>\n        <source>Message context</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"111\"/>\n        <source>Message context text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"114\"/>\n        <source>Fuzzy flag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"117\"/>\n        <source>Programmer comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"120\"/>\n        <source>Reference</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"123\"/>\n        <source>Flags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"126\"/>\n        <source>Message identifier text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"129\"/>\n        <source>Message string text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"132\"/>\n        <source>Message context text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPOV</name>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"267\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"270\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"273\"/>\n        <source>Comment line</source>\n        <translation>Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"276\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"279\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"282\"/>\n        <source>Identifier</source>\n        <translation>Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"285\"/>\n        <source>String</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"288\"/>\n        <source>Unclosed string</source>\n        <translation>Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"291\"/>\n        <source>Directive</source>\n        <translation>Direktiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"294\"/>\n        <source>Bad directive</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"297\"/>\n        <source>Objects, CSG and appearance</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"300\"/>\n        <source>Types, modifiers and items</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"303\"/>\n        <source>Predefined identifiers</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"306\"/>\n        <source>Predefined functions</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"309\"/>\n        <source>User defined 1</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"312\"/>\n        <source>User defined 2</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"315\"/>\n        <source>User defined 3</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPascal</name>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"246\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"258\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"267\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"273\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"276\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"285\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"249\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"252\"/>\n        <source>&apos;{ ... }&apos; style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"255\"/>\n        <source>&apos;(* ... *)&apos; style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"261\"/>\n        <source>&apos;{$ ... }&apos; style pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"264\"/>\n        <source>&apos;(*$ ... *)&apos; style pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"270\"/>\n        <source>Hexadecimal number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"279\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"282\"/>\n        <source>Character</source>\n        <translation type=\"unfinished\">Znak</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"288\"/>\n        <source>Inline asm</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPerl</name>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"318\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"321\"/>\n        <source>Error</source>\n        <translation>Chyba</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"324\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"327\"/>\n        <source>POD</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"330\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"333\"/>\n        <source>Keyword</source>\n        <translation>Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"336\"/>\n        <source>Double-quoted string</source>\n        <translation>String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"339\"/>\n        <source>Single-quoted string</source>\n        <translation>String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"342\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"345\"/>\n        <source>Identifier</source>\n        <translation>Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"348\"/>\n        <source>Scalar</source>\n        <translation>Skalár</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"351\"/>\n        <source>Array</source>\n        <translation>Pole</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"354\"/>\n        <source>Hash</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"357\"/>\n        <source>Symbol table</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"360\"/>\n        <source>Regular expression</source>\n        <translation>Regulární výraz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"363\"/>\n        <source>Substitution</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"366\"/>\n        <source>Backticks</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"369\"/>\n        <source>Data section</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"372\"/>\n        <source>Here document delimiter</source>\n        <translation>Zde je oddělovač dokumentu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"375\"/>\n        <source>Single-quoted here document</source>\n        <translation>Zde je dokument v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"378\"/>\n        <source>Double-quoted here document</source>\n        <translation>Zde je dokument ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"381\"/>\n        <source>Backtick here document</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"384\"/>\n        <source>Quoted string (q)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"387\"/>\n        <source>Quoted string (qq)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"390\"/>\n        <source>Quoted string (qx)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"393\"/>\n        <source>Quoted string (qr)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"396\"/>\n        <source>Quoted string (qw)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"399\"/>\n        <source>POD verbatim</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"402\"/>\n        <source>Subroutine prototype</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"405\"/>\n        <source>Format identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"408\"/>\n        <source>Format body</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"411\"/>\n        <source>Double-quoted string (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"414\"/>\n        <source>Translation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"417\"/>\n        <source>Regular expression (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"420\"/>\n        <source>Substitution (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"423\"/>\n        <source>Backticks (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"426\"/>\n        <source>Double-quoted here document (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"429\"/>\n        <source>Backtick here document (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"432\"/>\n        <source>Quoted string (qq, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"435\"/>\n        <source>Quoted string (qx, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"438\"/>\n        <source>Quoted string (qr, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPostScript</name>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"249\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"252\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"255\"/>\n        <source>DSC comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"258\"/>\n        <source>DSC comment value</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"261\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"264\"/>\n        <source>Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"267\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"270\"/>\n        <source>Literal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"273\"/>\n        <source>Immediately evaluated literal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"276\"/>\n        <source>Array parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"279\"/>\n        <source>Dictionary parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"282\"/>\n        <source>Procedure parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"285\"/>\n        <source>Text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"288\"/>\n        <source>Hexadecimal string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"291\"/>\n        <source>Base85 string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"294\"/>\n        <source>Bad string character</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerProperties</name>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"111\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"114\"/>\n        <source>Comment</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"117\"/>\n        <source>Section</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"120\"/>\n        <source>Assignment</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"123\"/>\n        <source>Default value</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"126\"/>\n        <source>Key</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPython</name>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"225\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"228\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"231\"/>\n        <source>Double-quoted string</source>\n        <translation>String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"234\"/>\n        <source>Single-quoted string</source>\n        <translation>String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"237\"/>\n        <source>Keyword</source>\n        <translation>Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"240\"/>\n        <source>Triple single-quoted string</source>\n        <translation>String ve třech jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"243\"/>\n        <source>Triple double-quoted string</source>\n        <translation>String ve třech dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"246\"/>\n        <source>Class name</source>\n        <translation>Jméno třídy</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"249\"/>\n        <source>Function or method name</source>\n        <translation>Jméno funkce nebo metody</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"252\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"255\"/>\n        <source>Identifier</source>\n        <translation>Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"258\"/>\n        <source>Comment block</source>\n        <translation>Blok komentáře</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"261\"/>\n        <source>Unclosed string</source>\n        <translation>Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"264\"/>\n        <source>Highlighted identifier</source>\n        <translation>Zvýrazněný identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"267\"/>\n        <source>Decorator</source>\n        <translation>Dekorátor</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerRuby</name>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"239\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"245\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"251\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"257\"/>\n        <source>Double-quoted string</source>\n        <translation>String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"260\"/>\n        <source>Single-quoted string</source>\n        <translation>String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"254\"/>\n        <source>Keyword</source>\n        <translation>Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"263\"/>\n        <source>Class name</source>\n        <translation>Jméno třídy</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"266\"/>\n        <source>Function or method name</source>\n        <translation>Jméno funkce nebo metody</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"269\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"272\"/>\n        <source>Identifier</source>\n        <translation>Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"242\"/>\n        <source>Error</source>\n        <translation>Chyba</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"248\"/>\n        <source>POD</source>\n        <translation>POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"275\"/>\n        <source>Regular expression</source>\n        <translation>Regulární výraz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"278\"/>\n        <source>Global</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"281\"/>\n        <source>Symbol</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"284\"/>\n        <source>Module name</source>\n        <translation>Jméno modulu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"287\"/>\n        <source>Instance variable</source>\n        <translation>Proměnná instance</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"290\"/>\n        <source>Class variable</source>\n        <translation>Proměnná třídy</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"293\"/>\n        <source>Backticks</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"296\"/>\n        <source>Data section</source>\n        <translation>Datová sekce</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"299\"/>\n        <source>Here document delimiter</source>\n        <translation>Zde je oddělovač dokumentu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"302\"/>\n        <source>Here document</source>\n        <translation>Zde je dokument</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"305\"/>\n        <source>%q string</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"308\"/>\n        <source>%Q string</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"311\"/>\n        <source>%x string</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"314\"/>\n        <source>%r string</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"317\"/>\n        <source>%w string</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"320\"/>\n        <source>Demoted keyword</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"323\"/>\n        <source>stdin</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"326\"/>\n        <source>stdout</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"329\"/>\n        <source>stderr</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSQL</name>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"259\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"268\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"271\"/>\n        <source>Keyword</source>\n        <translation>Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"277\"/>\n        <source>Single-quoted string</source>\n        <translation>String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"286\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"289\"/>\n        <source>Identifier</source>\n        <translation>Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"262\"/>\n        <source>Comment line</source>\n        <translation>Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"265\"/>\n        <source>JavaDoc style comment</source>\n        <translation>JavaDoc styl komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"274\"/>\n        <source>Double-quoted string</source>\n        <translation>String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"280\"/>\n        <source>SQL*Plus keyword</source>\n        <translation>SQL*Plus klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"283\"/>\n        <source>SQL*Plus prompt</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"292\"/>\n        <source>SQL*Plus comment</source>\n        <translation>SQL*Plus komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"295\"/>\n        <source># comment line</source>\n        <translation># jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword</source>\n        <translation>JavaDoc klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"301\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>JavaDoc klíčové slovo chyby</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"304\"/>\n        <source>User defined 1</source>\n        <translation>Definováno uživatelem 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"307\"/>\n        <source>User defined 2</source>\n        <translation>Definováno uživatelem 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"310\"/>\n        <source>User defined 3</source>\n        <translation>Definováno uživatelem 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"313\"/>\n        <source>User defined 4</source>\n        <translation>Definováno uživatelem 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"316\"/>\n        <source>Quoted identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSpice</name>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"156\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"159\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"162\"/>\n        <source>Command</source>\n        <translation type=\"unfinished\">Příkaz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"165\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"168\"/>\n        <source>Parameter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"171\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"174\"/>\n        <source>Delimiter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"177\"/>\n        <source>Value</source>\n        <translation type=\"unfinished\">Hodnota</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"180\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTCL</name>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"283\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"286\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"289\"/>\n        <source>Comment line</source>\n        <translation type=\"unfinished\">Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"295\"/>\n        <source>Quoted keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"298\"/>\n        <source>Quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"301\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"304\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"307\"/>\n        <source>Substitution</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"310\"/>\n        <source>Brace substitution</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"313\"/>\n        <source>Modifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"316\"/>\n        <source>Expand keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"319\"/>\n        <source>TCL keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"322\"/>\n        <source>Tk keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"325\"/>\n        <source>iTCL keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"328\"/>\n        <source>Tk command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"331\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Definováno uživatelem 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"334\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Definováno uživatelem 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"337\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Definováno uživatelem 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"340\"/>\n        <source>User defined 4</source>\n        <translation type=\"unfinished\">Definováno uživatelem 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"343\"/>\n        <source>Comment box</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"346\"/>\n        <source>Comment block</source>\n        <translation type=\"unfinished\">Blok komentáře</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTeX</name>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"177\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"180\"/>\n        <source>Special</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"183\"/>\n        <source>Group</source>\n        <translation>Skupina</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"186\"/>\n        <source>Symbol</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"189\"/>\n        <source>Command</source>\n        <translation>Příkaz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"192\"/>\n        <source>Text</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVHDL</name>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"197\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"200\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"203\"/>\n        <source>Comment line</source>\n        <translation type=\"unfinished\">Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"206\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"209\"/>\n        <source>String</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"212\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"215\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"218\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"221\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"224\"/>\n        <source>Standard operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"227\"/>\n        <source>Attribute</source>\n        <translation type=\"unfinished\">Atribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"230\"/>\n        <source>Standard function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"233\"/>\n        <source>Standard package</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"236\"/>\n        <source>Standard type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"239\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVerilog</name>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"209\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"212\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"215\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"218\"/>\n        <source>Bang comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"221\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"224\"/>\n        <source>Primary keywords and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"227\"/>\n        <source>String</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"230\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation type=\"unfinished\">Sekundární klíčová slova a identifikátory</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"233\"/>\n        <source>System task</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"236\"/>\n        <source>Preprocessor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"239\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"242\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"245\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"248\"/>\n        <source>User defined tasks and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerYAML</name>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"161\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"164\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"167\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"173\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"176\"/>\n        <source>Reference</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"179\"/>\n        <source>Document delimiter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"182\"/>\n        <source>Text block marker</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"185\"/>\n        <source>Syntax error marker</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"188\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n</context>\n<context>\n    <name>QsciScintilla</name>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4359\"/>\n        <source>&amp;Undo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4363\"/>\n        <source>&amp;Redo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4369\"/>\n        <source>Cu&amp;t</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4374\"/>\n        <source>&amp;Copy</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4380\"/>\n        <source>&amp;Paste</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4384\"/>\n        <source>Delete</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4391\"/>\n        <source>Select All</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscintilla_de.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.0\" language=\"de\">\n<context>\n    <name>QsciCommand</name>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"175\"/>\n        <source>Move left one character</source>\n        <translation>Ein Zeichen nach links</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"207\"/>\n        <source>Move right one character</source>\n        <translation>Ein Zeichen nach rechts</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"81\"/>\n        <source>Move up one line</source>\n        <translation>Eine Zeile nach oben</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"44\"/>\n        <source>Move down one line</source>\n        <translation>Eine Zeile nach unten</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"305\"/>\n        <source>Move left one word part</source>\n        <translation>Ein Wortteil nach links</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"318\"/>\n        <source>Move right one word part</source>\n        <translation>Ein Wortteil nach rechts</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"239\"/>\n        <source>Move left one word</source>\n        <translation>Ein Wort nach links</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"259\"/>\n        <source>Move right one word</source>\n        <translation>Ein Wort nach rechts</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"71\"/>\n        <source>Scroll view down one line</source>\n        <translation>Eine Zeile nach unten rollen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"108\"/>\n        <source>Scroll view up one line</source>\n        <translation>Eine Zeile nach oben rollen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"558\"/>\n        <source>Move up one page</source>\n        <translation>Eine Seite hoch</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"593\"/>\n        <source>Move down one page</source>\n        <translation>Eine Seite nach unten</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"824\"/>\n        <source>Indent one level</source>\n        <translation>Eine Ebene einrücken</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"185\"/>\n        <source>Extend selection left one character</source>\n        <translation>Auswahl um ein Zeichen nach links erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"217\"/>\n        <source>Extend selection right one character</source>\n        <translation>Auswahl um ein Zeichen nach rechts erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"91\"/>\n        <source>Extend selection up one line</source>\n        <translation>Auswahl um eine Zeile nach oben erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"54\"/>\n        <source>Extend selection down one line</source>\n        <translation>Auswahl um eine Zeile nach unten erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"311\"/>\n        <source>Extend selection left one word part</source>\n        <translation>Auswahl um einen Wortteil nach links erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"324\"/>\n        <source>Extend selection right one word part</source>\n        <translation>Auswahl um einen Wortteil nach rechts erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"249\"/>\n        <source>Extend selection left one word</source>\n        <translation>Auswahl um ein Wort nach links erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"265\"/>\n        <source>Extend selection right one word</source>\n        <translation>Auswahl um ein Wort nach rechts erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"568\"/>\n        <source>Extend selection up one page</source>\n        <translation>Auswahl um eine Seite nach oben erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"607\"/>\n        <source>Extend selection down one page</source>\n        <translation>Auswahl um eine Seite nach unten erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"668\"/>\n        <source>Delete previous character</source>\n        <translation>Zeichen links löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"658\"/>\n        <source>Delete current character</source>\n        <translation>Aktuelles Zeichen löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"681\"/>\n        <source>Delete word to left</source>\n        <translation>Wort links löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"687\"/>\n        <source>Delete word to right</source>\n        <translation>Wort rechts löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"704\"/>\n        <source>Delete line to left</source>\n        <translation>Zeile links löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"714\"/>\n        <source>Delete line to right</source>\n        <translation>Zeile rechts löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"720\"/>\n        <source>Delete current line</source>\n        <translation>Aktuelle Zeile löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"726\"/>\n        <source>Cut current line</source>\n        <translation>Aktuelle Zeile ausschneiden</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"788\"/>\n        <source>Cut selection</source>\n        <translation>Auswahl ausschneiden</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"794\"/>\n        <source>Copy selection</source>\n        <translation>Auswahl kopieren</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"800\"/>\n        <source>Paste</source>\n        <translation>Einfügen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"852\"/>\n        <source>Redo last command</source>\n        <translation>Letzten Befehl wiederholen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"836\"/>\n        <source>Cancel</source>\n        <translation>Abbrechen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"806\"/>\n        <source>Toggle insert/overtype</source>\n        <translation>Einfügen/Überschreiben umschalten</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"118\"/>\n        <source>Scroll to start of document</source>\n        <translation>Zum Dokumentenanfang rollen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"128\"/>\n        <source>Scroll to end of document</source>\n        <translation>Zum Dokumentenende rollen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"138\"/>\n        <source>Scroll vertically to centre current line</source>\n        <translation>Vertical rollen, um aktuelle Zeile zu zentrieren</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"271\"/>\n        <source>Move to end of previous word</source>\n        <translation>Zum Ende des vorigen Wortes springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"277\"/>\n        <source>Extend selection to end of previous word</source>\n        <translation>Auswahl bis zum Ende des vorigen Wortes erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"288\"/>\n        <source>Move to end of next word</source>\n        <translation>Zum Ende des nächsten Wortes springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"298\"/>\n        <source>Extend selection to end of next word</source>\n        <translation>Auswahl bis zum Ende des nächsten Wortes erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"335\"/>\n        <source>Move to start of document line</source>\n        <translation>Zum Beginn der Dokumentenzeile springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"345\"/>\n        <source>Extend selection to start of document line</source>\n        <translation>Auswahl zum Beginn der Dokumentenzeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"356\"/>\n        <source>Extend rectangular selection to start of document line</source>\n        <translation>Rechteckige Auswahl zum Beginn der Dokumentenzeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"367\"/>\n        <source>Move to start of display line</source>\n        <translation>Zum Beginn der Anzeigezeile springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"377\"/>\n        <source>Extend selection to start of display line</source>\n        <translation>Auswahl zum Beginn der Anzeigezeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"384\"/>\n        <source>Move to start of display or document line</source>\n        <translation>Zum Beginn der Dokumenten- oder Anzeigezeile springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"391\"/>\n        <source>Extend selection to start of display or document line</source>\n        <translation>Rechteckige Auswahl zum Beginn der Dokumenten- oder Anzeigezeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"402\"/>\n        <source>Move to first visible character in document line</source>\n        <translation>Zum ersten sichtbaren Zeichen der Dokumentzeile springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"413\"/>\n        <source>Extend selection to first visible character in document line</source>\n        <translation>Auswahl zum ersten sichtbaren Zeichen der Dokumentzeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"424\"/>\n        <source>Extend rectangular selection to first visible character in document line</source>\n        <translation>Rechteckige Auswahl zum ersten sichtbaren Zeichen der Dokumentzeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"431\"/>\n        <source>Move to first visible character of display in document line</source>\n        <translation>Zum ersten angezeigten Zeichen der Dokumentzeile springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"438\"/>\n        <source>Extend selection to first visible character in display or document line</source>\n        <translation>Auswahl zum ersten sichtbaren Zeichen der Dokument- oder Anzeigezeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"449\"/>\n        <source>Move to end of document line</source>\n        <translation>Zum Ende der Dokumentzeile springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"459\"/>\n        <source>Extend selection to end of document line</source>\n        <translation>Auswahl zum Ende der Dokumentenzeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"470\"/>\n        <source>Extend rectangular selection to end of document line</source>\n        <translation>Rechteckige Auswahl zum Ende der Dokumentenzeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"481\"/>\n        <source>Move to end of display line</source>\n        <translation>Zum Ende der Anzeigezeile springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"491\"/>\n        <source>Extend selection to end of display line</source>\n        <translation>Auswahl zum Ende der Anzeigezeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"498\"/>\n        <source>Move to end of display or document line</source>\n        <translation>Zum Ende der Dokumenten- oder Anzeigezeile springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"505\"/>\n        <source>Extend selection to end of display or document line</source>\n        <translation>Rechteckige Auswahl zum Ende der Dokumenten- oder Anzeigezeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"516\"/>\n        <source>Move to start of document</source>\n        <translation>Zum Dokumentenanfang springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"526\"/>\n        <source>Extend selection to start of document</source>\n        <translation>Auswahl zum Dokumentenanfang erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"537\"/>\n        <source>Move to end of document</source>\n        <translation>Zum Dokumentenende springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"547\"/>\n        <source>Extend selection to end of document</source>\n        <translation>Auswahl zum Dokumentenende erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"628\"/>\n        <source>Stuttered move up one page</source>\n        <translation>&quot;Stotternd&quot; um eine Seite nach oben</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"634\"/>\n        <source>Stuttered extend selection up one page</source>\n        <translation>Auswahl &quot;stotternd&quot; um eine Seite nach oben erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"641\"/>\n        <source>Stuttered move down one page</source>\n        <translation>&quot;Stotternd&quot; um eine Seite nach unten</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"647\"/>\n        <source>Stuttered extend selection down one page</source>\n        <translation>Auswahl &quot;stotternd&quot; um eine Seite nach unten erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"674\"/>\n        <source>Delete previous character if not at start of line</source>\n        <translation>Zeichen links löschen, wenn nicht am Zeilenanfang</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"697\"/>\n        <source>Delete right to end of next word</source>\n        <translation>Rechts bis zum Ende des nächsten Wortes löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"738\"/>\n        <source>Transpose current and previous lines</source>\n        <translation>Aktuelle und vorherige Zeile tauschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"745\"/>\n        <source>Duplicate the current line</source>\n        <translation>Aktuelle Zeile duplizieren</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"751\"/>\n        <source>Select all</source>\n        <oldsource>Select document</oldsource>\n        <translation>Alle auswählen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"757\"/>\n        <source>Move selected lines up one line</source>\n        <translation>Ausgewählte Zeilen um eine Zeile nach oben</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"763\"/>\n        <source>Move selected lines down one line</source>\n        <translation>Ausgewählte Zeilen um eine Zeile nach unten</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"776\"/>\n        <source>Convert selection to lower case</source>\n        <translation>Auswahl in Kleinbuchstaben umwandeln</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"782\"/>\n        <source>Convert selection to upper case</source>\n        <translation>Auswahl in Großbuchstaben umwandeln</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"812\"/>\n        <source>Insert newline</source>\n        <translation>Neue Zeile einfügen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"830\"/>\n        <source>De-indent one level</source>\n        <translation>Eine Ebene ausrücken</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"842\"/>\n        <source>Undo last command</source>\n        <translation>Letzten Befehl rückgängig machen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"858\"/>\n        <source>Zoom in</source>\n        <translation>Vergrößern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"864\"/>\n        <source>Zoom out</source>\n        <translation>Verkleinern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"158\"/>\n        <source>Move up one paragraph</source>\n        <translation>Einen Absatz nach oben</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"145\"/>\n        <source>Move down one paragraph</source>\n        <translation>Einen Absatz nach unten</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"164\"/>\n        <source>Extend selection up one paragraph</source>\n        <translation>Auswahl um einen Absatz nach oben erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"151\"/>\n        <source>Extend selection down one paragraph</source>\n        <translation>Auswahl um einen Absatz nach unten erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"732\"/>\n        <source>Copy current line</source>\n        <translation>Aktuelle Zeile kopieren</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"64\"/>\n        <source>Extend rectangular selection down one line</source>\n        <translation>Rechteckige Auswahl um eine Zeile nach unten erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"101\"/>\n        <source>Extend rectangular selection up one line</source>\n        <translation>Rechteckige Auswahl um eine Zeile nach oben erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"196\"/>\n        <source>Extend rectangular selection left one character</source>\n        <translation>Rechteckige Auswahl um ein Zeichen nach links erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"228\"/>\n        <source>Extend rectangular selection right one character</source>\n        <translation>Rechteckige Auswahl um ein Zeichen nach rechts erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"578\"/>\n        <source>Extend rectangular selection up one page</source>\n        <translation>Rechteckige Auswahl um eine Seite nach oben erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"621\"/>\n        <source>Extend rectangular selection down one page</source>\n        <translation>Rechteckige Auswahl um eine Seite nach unten erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"818\"/>\n        <source>Formfeed</source>\n        <translation>Seitenumbruch</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"770\"/>\n        <source>Duplicate selection</source>\n        <translation>Auswahl duplizieren</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerAVS</name>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"280\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"283\"/>\n        <source>Block comment</source>\n        <translation>Blockkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"286\"/>\n        <source>Nested block comment</source>\n        <translation>Verschachtelter Blockkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"289\"/>\n        <source>Line comment</source>\n        <translation>Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"301\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"304\"/>\n        <source>Triple double-quoted string</source>\n        <translation>Zeichenkette in dreifachen Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"307\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"310\"/>\n        <source>Filter</source>\n        <translation>Filter</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"313\"/>\n        <source>Plugin</source>\n        <translation>Plugin</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"316\"/>\n        <source>Function</source>\n        <translation>Funktion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"319\"/>\n        <source>Clip property</source>\n        <translation>Clip Eigenschaft</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"322\"/>\n        <source>User defined</source>\n        <translation>Nutzer definiert</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBash</name>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"193\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"196\"/>\n        <source>Error</source>\n        <translation>Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"199\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"202\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"205\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"208\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"211\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"214\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"217\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"220\"/>\n        <source>Scalar</source>\n        <translation>Skalar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"223\"/>\n        <source>Parameter expansion</source>\n        <translation>Parametererweiterung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"226\"/>\n        <source>Backticks</source>\n        <translation>Backticks</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"229\"/>\n        <source>Here document delimiter</source>\n        <translation>Here Dokument-Begrenzer</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"232\"/>\n        <source>Single-quoted here document</source>\n        <translation>Here Dokument in Hochkommata</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBatch</name>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"164\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"167\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"173\"/>\n        <source>Label</source>\n        <translation>Marke</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"182\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"185\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"176\"/>\n        <source>Hide command character</source>\n        <translation>&quot;Befehl verbergen&quot; Zeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"179\"/>\n        <source>External command</source>\n        <translation>Externer Befehl</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCMake</name>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"181\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"184\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"187\"/>\n        <source>String</source>\n        <translation>Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"190\"/>\n        <source>Left quoted string</source>\n        <translation>Links quotierte Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"193\"/>\n        <source>Right quoted string</source>\n        <translation>Rechts quotierte Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"196\"/>\n        <source>Function</source>\n        <translation>Funktion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"199\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"202\"/>\n        <source>Label</source>\n        <translation>Marke</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"205\"/>\n        <source>User defined</source>\n        <translation>Nutzer definiert</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"208\"/>\n        <source>WHILE block</source>\n        <translation>WHILE Block</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"211\"/>\n        <source>FOREACH block</source>\n        <translation>FOREACH Block</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"214\"/>\n        <source>IF block</source>\n        <translation>IF Block</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"217\"/>\n        <source>MACRO block</source>\n        <translation>MACRO Block</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"220\"/>\n        <source>Variable within a string</source>\n        <translation>Variable in einer Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"223\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCPP</name>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"364\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"370\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"376\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"382\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"388\"/>\n        <source>IDL UUID</source>\n        <translation>IDL UUID</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"394\"/>\n        <source>Pre-processor block</source>\n        <translation>Präprozessorblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"400\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"406\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"412\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"340\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"343\"/>\n        <source>Inactive default</source>\n        <translation>Inaktiver Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"346\"/>\n        <source>C comment</source>\n        <translation>C Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"349\"/>\n        <source>Inactive C comment</source>\n        <translation>Inaktiver C Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"352\"/>\n        <source>C++ comment</source>\n        <translation>C++ Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"355\"/>\n        <source>Inactive C++ comment</source>\n        <translation>Inaktiver C++ Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"358\"/>\n        <source>JavaDoc style C comment</source>\n        <translation>JavaDoc C Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"361\"/>\n        <source>Inactive JavaDoc style C comment</source>\n        <translation>Inaktiver JavaDoc C Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"367\"/>\n        <source>Inactive number</source>\n        <translation>Inaktive Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"373\"/>\n        <source>Inactive keyword</source>\n        <translation>Inaktives Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"379\"/>\n        <source>Inactive double-quoted string</source>\n        <translation>Inaktive Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"385\"/>\n        <source>Inactive single-quoted string</source>\n        <translation>Inaktive Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"391\"/>\n        <source>Inactive IDL UUID</source>\n        <translation>Inaktive IDL UUID</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"397\"/>\n        <source>Inactive pre-processor block</source>\n        <translation>Inaktiver Präprozessorblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"403\"/>\n        <source>Inactive operator</source>\n        <translation>Inaktiver Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"409\"/>\n        <source>Inactive identifier</source>\n        <translation>Inaktiver Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"415\"/>\n        <source>Inactive unclosed string</source>\n        <translation>Inaktive unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"418\"/>\n        <source>C# verbatim string</source>\n        <translation>Uninterpretierte C# Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"421\"/>\n        <source>Inactive C# verbatim string</source>\n        <translation>Inaktive, Uninterpretierte C# Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"424\"/>\n        <source>JavaScript regular expression</source>\n        <translation>JavaScript Regulärer Ausdruck</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"427\"/>\n        <source>Inactive JavaScript regular expression</source>\n        <translation>JavaScript Inaktiver Regulärer Ausdruck</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"430\"/>\n        <source>JavaDoc style C++ comment</source>\n        <translation>JavaDoc C++ Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"433\"/>\n        <source>Inactive JavaDoc style C++ comment</source>\n        <translation>Inaktiver JavaDoc C++ Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"439\"/>\n        <source>Inactive secondary keywords and identifiers</source>\n        <translation>Inaktive sekundäre Schlusselwörter und Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"442\"/>\n        <source>JavaDoc keyword</source>\n        <translation>JavaDoc Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"445\"/>\n        <source>Inactive JavaDoc keyword</source>\n        <translation>Inaktives JavaDoc Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"448\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>JavaDoc Schlüsselwortfehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"457\"/>\n        <source>Inactive global classes and typedefs</source>\n        <translation>Inaktive globale Klassen und Typdefinitionen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"460\"/>\n        <source>C++ raw string</source>\n        <translation>Rohe C++ Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"463\"/>\n        <source>Inactive C++ raw string</source>\n        <translation>Inaktive rohe C++ Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"466\"/>\n        <source>Vala triple-quoted verbatim string</source>\n        <translation>Vala Zeichenkette in dreifachen Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"469\"/>\n        <source>Inactive Vala triple-quoted verbatim string</source>\n        <translation>Inaktive Vala Zeichenkette in dreifachen Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"472\"/>\n        <source>Pike hash-quoted string</source>\n        <translation>Pike Zeichenkette in &apos;#-Anführungszeichen&apos;</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"475\"/>\n        <source>Inactive Pike hash-quoted string</source>\n        <translation>Inaktive Pike Zeichenkette in &apos;#-Anführungszeichen&apos;</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"478\"/>\n        <source>Pre-processor C comment</source>\n        <translation>C Präprozessorkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"481\"/>\n        <source>Inactive pre-processor C comment</source>\n        <translation>Inaktiver C Präprozessorkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"484\"/>\n        <source>JavaDoc style pre-processor comment</source>\n        <translation>JavaDoc Präprozessorkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"487\"/>\n        <source>Inactive JavaDoc style pre-processor comment</source>\n        <translation>Inaktiver JavaDoc Präprozessorkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"436\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Sekundäre Schlusselwörter und Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"451\"/>\n        <source>Inactive JavaDoc keyword error</source>\n        <translation>Inaktiver JavaDoc Schlüsselwortfehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"454\"/>\n        <source>Global classes and typedefs</source>\n        <translation>Globale Klassen und Typdefinitionen</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSS</name>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"225\"/>\n        <source>Tag</source>\n        <translation>Tag</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"228\"/>\n        <source>Class selector</source>\n        <translation>Klassenselektor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"231\"/>\n        <source>Pseudo-class</source>\n        <translation>Pseudoklasse</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"234\"/>\n        <source>Unknown pseudo-class</source>\n        <translation>Unbekannte Pseudoklasse</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"237\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"240\"/>\n        <source>CSS1 property</source>\n        <translation>CSS1 Eigenschaft</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"243\"/>\n        <source>Unknown property</source>\n        <translation>Unbekannte Eigenschaft</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"246\"/>\n        <source>Value</source>\n        <translation>Wert</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"249\"/>\n        <source>ID selector</source>\n        <translation>ID-Selektor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"252\"/>\n        <source>Important</source>\n        <translation>Wichtig</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"255\"/>\n        <source>@-rule</source>\n        <translation>@-Regel</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"258\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"261\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"264\"/>\n        <source>CSS2 property</source>\n        <translation>CSS2 Eigenschaft</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"267\"/>\n        <source>Attribute</source>\n        <translation>Attribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"270\"/>\n        <source>CSS3 property</source>\n        <translation>CSS3 Eigenschaft</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"273\"/>\n        <source>Pseudo-element</source>\n        <translation>Pseudoelement</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"276\"/>\n        <source>Extended CSS property</source>\n        <translation>Erweiterte CSS Eigenschaft</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"279\"/>\n        <source>Extended pseudo-class</source>\n        <translation>Erweiterte Pseudoklasse</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"282\"/>\n        <source>Extended pseudo-element</source>\n        <translation>Erweitertes Pseudoelement</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"285\"/>\n        <source>Media rule</source>\n        <translation>Medienregel</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"288\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSharp</name>\n    <message>\n        <location filename=\"qscilexercsharp.cpp\" line=\"95\"/>\n        <source>Verbatim string</source>\n        <translation>Uninterpretierte Zeichenkette</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCoffeeScript</name>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"244\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"247\"/>\n        <source>C-style comment</source>\n        <translation>C Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"250\"/>\n        <source>C++-style comment</source>\n        <translation>C++ Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"253\"/>\n        <source>JavaDoc C-style comment</source>\n        <translation>JavaDoc C Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"256\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"259\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"262\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"265\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"268\"/>\n        <source>IDL UUID</source>\n        <translation>IDL UUID</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"271\"/>\n        <source>Pre-processor block</source>\n        <translation>Präprozessorblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"274\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"277\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"280\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"283\"/>\n        <source>C# verbatim string</source>\n        <translation>Uninterpretierte C# Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"286\"/>\n        <source>Regular expression</source>\n        <translation>Regulärer Ausdruck</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"289\"/>\n        <source>JavaDoc C++-style comment</source>\n        <translation>JavaDoc C++ Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"292\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Sekundäre Schlusselwörter und Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"295\"/>\n        <source>JavaDoc keyword</source>\n        <translation>JavaDoc Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>JavaDoc Schlüsselwortfehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"301\"/>\n        <source>Global classes</source>\n        <translation>Globale Klassen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"304\"/>\n        <source>Block comment</source>\n        <translation>Blockkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"307\"/>\n        <source>Block regular expression</source>\n        <translation>Regulärer Ausdrucksblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"310\"/>\n        <source>Block regular expression comment</source>\n        <translation>Regulärer Ausdrucksblockkommentar</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerD</name>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"259\"/>\n        <source>Block comment</source>\n        <translation>Blockkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"262\"/>\n        <source>Line comment</source>\n        <translation>Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"265\"/>\n        <source>DDoc style block comment</source>\n        <translation>DDoc Blockkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"268\"/>\n        <source>Nesting comment</source>\n        <translation>schachtelbarer Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"271\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"274\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"277\"/>\n        <source>Secondary keyword</source>\n        <translation>Sekundäres Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"280\"/>\n        <source>Documentation keyword</source>\n        <translation>Dokumentationsschlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"283\"/>\n        <source>Type definition</source>\n        <translation>Typdefinition</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"286\"/>\n        <source>String</source>\n        <translation>Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"289\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"292\"/>\n        <source>Character</source>\n        <translation>Zeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"301\"/>\n        <source>DDoc style line comment</source>\n        <translation>DDoc Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"304\"/>\n        <source>DDoc keyword</source>\n        <translation>DDoc Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"307\"/>\n        <source>DDoc keyword error</source>\n        <translation>DDoc Schlüsselwortfehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"310\"/>\n        <source>Backquoted string</source>\n        <translation>Zeichenkette in Rückwärtsstrichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"313\"/>\n        <source>Raw string</source>\n        <translation>Rohe Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"316\"/>\n        <source>User defined 1</source>\n        <translation>Nutzer definiert 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"319\"/>\n        <source>User defined 2</source>\n        <translation>Nutzer definiert 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"322\"/>\n        <source>User defined 3</source>\n        <translation>Nutzer definiert 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerDiff</name>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"92\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"95\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"98\"/>\n        <source>Command</source>\n        <translation>Befehl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"101\"/>\n        <source>Header</source>\n        <translation>Kopfzeilen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"104\"/>\n        <source>Position</source>\n        <translation>Position</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"107\"/>\n        <source>Removed line</source>\n        <translation>Entfernte Zeile</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"110\"/>\n        <source>Added line</source>\n        <translation>Hinzugefügte Zeile</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"113\"/>\n        <source>Changed line</source>\n        <translation>Geänderte Zeile</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerFortran77</name>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"176\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"179\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"182\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"185\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"188\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"191\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"194\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"197\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"200\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"203\"/>\n        <source>Intrinsic function</source>\n        <translation>Intrinsic-Funktion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"206\"/>\n        <source>Extended function</source>\n        <translation>Erweiterte Funktion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"209\"/>\n        <source>Pre-processor block</source>\n        <translation>Präprozessorblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"212\"/>\n        <source>Dotted operator</source>\n        <translation>Dotted Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"215\"/>\n        <source>Label</source>\n        <translation>Marke</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"218\"/>\n        <source>Continuation</source>\n        <translation>Fortsetzung</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerHTML</name>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"553\"/>\n        <source>HTML default</source>\n        <translation>HTML Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"556\"/>\n        <source>Tag</source>\n        <translation>Tag</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"559\"/>\n        <source>Unknown tag</source>\n        <translation>Unbekanntes Tag</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"562\"/>\n        <source>Attribute</source>\n        <translation>Attribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"565\"/>\n        <source>Unknown attribute</source>\n        <translation>Unbekanntes Attribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"568\"/>\n        <source>HTML number</source>\n        <translation>HTML Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"571\"/>\n        <source>HTML double-quoted string</source>\n        <translation>HTML Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"574\"/>\n        <source>HTML single-quoted string</source>\n        <translation>HTML Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"577\"/>\n        <source>Other text in a tag</source>\n        <translation>Anderer Text in einem Tag</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"580\"/>\n        <source>HTML comment</source>\n        <translation>HTML Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"583\"/>\n        <source>Entity</source>\n        <translation>Entität</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"586\"/>\n        <source>End of a tag</source>\n        <translation>Tagende</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"589\"/>\n        <source>Start of an XML fragment</source>\n        <translation>Beginn eines XML Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"592\"/>\n        <source>End of an XML fragment</source>\n        <translation>Ende eines XML Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"595\"/>\n        <source>Script tag</source>\n        <translation>Skript Tag</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"598\"/>\n        <source>Start of an ASP fragment with @</source>\n        <translation>Beginn eines ASP Fragmentes mit @</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"601\"/>\n        <source>Start of an ASP fragment</source>\n        <translation>Beginn eines ASP Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"604\"/>\n        <source>CDATA</source>\n        <translation>CDATA</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"607\"/>\n        <source>Start of a PHP fragment</source>\n        <translation>Beginn eines PHP Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"610\"/>\n        <source>Unquoted HTML value</source>\n        <translation>HTML Wert ohne Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"613\"/>\n        <source>ASP X-Code comment</source>\n        <translation>ASP X-Code Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"616\"/>\n        <source>SGML default</source>\n        <translation>SGML Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"619\"/>\n        <source>SGML command</source>\n        <translation>SGML Befehl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"622\"/>\n        <source>First parameter of an SGML command</source>\n        <translation>Erster Parameter eines SGML Befehls</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"625\"/>\n        <source>SGML double-quoted string</source>\n        <translation>SGML Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"628\"/>\n        <source>SGML single-quoted string</source>\n        <translation>SGML Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"631\"/>\n        <source>SGML error</source>\n        <translation>SGML Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"634\"/>\n        <source>SGML special entity</source>\n        <translation>SGML Spezielle Entität</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"637\"/>\n        <source>SGML comment</source>\n        <translation>SGML Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"640\"/>\n        <source>First parameter comment of an SGML command</source>\n        <translation>Kommentar des ersten Parameters eines SGML Befehls</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"643\"/>\n        <source>SGML block default</source>\n        <translation>SGML Standardblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"646\"/>\n        <source>Start of a JavaScript fragment</source>\n        <translation>Beginn eines JavaScript Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"649\"/>\n        <source>JavaScript default</source>\n        <translation>JavaScript Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"652\"/>\n        <source>JavaScript comment</source>\n        <translation>JavaScript Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"655\"/>\n        <source>JavaScript line comment</source>\n        <translation>JavaScript Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"658\"/>\n        <source>JavaDoc style JavaScript comment</source>\n        <translation>JavaDoc JavaScript Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"661\"/>\n        <source>JavaScript number</source>\n        <translation>JavaScript Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"664\"/>\n        <source>JavaScript word</source>\n        <translation>JavaScript Wort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"667\"/>\n        <source>JavaScript keyword</source>\n        <translation>JavaScript Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"670\"/>\n        <source>JavaScript double-quoted string</source>\n        <translation>JavaScript Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"673\"/>\n        <source>JavaScript single-quoted string</source>\n        <translation>JavaScript Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"676\"/>\n        <source>JavaScript symbol</source>\n        <translation>JavaScript Symbol</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"679\"/>\n        <source>JavaScript unclosed string</source>\n        <translation>JavaScript Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"682\"/>\n        <source>JavaScript regular expression</source>\n        <translation>JavaScript Regulärer Ausdruck</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"685\"/>\n        <source>Start of an ASP JavaScript fragment</source>\n        <translation>Beginn eines ASP JavaScript Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"688\"/>\n        <source>ASP JavaScript default</source>\n        <translation>ASP JavaScript Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"691\"/>\n        <source>ASP JavaScript comment</source>\n        <translation>ASP JavaScript Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"694\"/>\n        <source>ASP JavaScript line comment</source>\n        <translation>ASP JavaScript Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"697\"/>\n        <source>JavaDoc style ASP JavaScript comment</source>\n        <translation>JavaDoc ASP JavaScript Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"700\"/>\n        <source>ASP JavaScript number</source>\n        <translation>ASP JavaScript Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"703\"/>\n        <source>ASP JavaScript word</source>\n        <translation>ASP JavaScript Wort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"706\"/>\n        <source>ASP JavaScript keyword</source>\n        <translation>ASP JavaScript Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"709\"/>\n        <source>ASP JavaScript double-quoted string</source>\n        <translation>ASP JavaScript Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"712\"/>\n        <source>ASP JavaScript single-quoted string</source>\n        <translation>ASP JavaScript Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"715\"/>\n        <source>ASP JavaScript symbol</source>\n        <translation>ASP JavaScript Symbol</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"718\"/>\n        <source>ASP JavaScript unclosed string</source>\n        <translation>ASP JavaScript Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"721\"/>\n        <source>ASP JavaScript regular expression</source>\n        <translation>ASP JavaScript Regulärer Ausdruck</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"724\"/>\n        <source>Start of a VBScript fragment</source>\n        <translation>Beginn eines VBScript Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"727\"/>\n        <source>VBScript default</source>\n        <translation>VBScript Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"730\"/>\n        <source>VBScript comment</source>\n        <translation>VBScript Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"733\"/>\n        <source>VBScript number</source>\n        <translation>VBScript Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"736\"/>\n        <source>VBScript keyword</source>\n        <translation>VBScript Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"739\"/>\n        <source>VBScript string</source>\n        <translation>VBScript Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"742\"/>\n        <source>VBScript identifier</source>\n        <translation>VBScript Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"745\"/>\n        <source>VBScript unclosed string</source>\n        <translation>VBScript Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"748\"/>\n        <source>Start of an ASP VBScript fragment</source>\n        <translation>Beginn eines ASP VBScript Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"751\"/>\n        <source>ASP VBScript default</source>\n        <translation>ASP VBScript Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"754\"/>\n        <source>ASP VBScript comment</source>\n        <translation>ASP VBScript Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"757\"/>\n        <source>ASP VBScript number</source>\n        <translation>ASP VBScript Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"760\"/>\n        <source>ASP VBScript keyword</source>\n        <translation>ASP VBScript Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"763\"/>\n        <source>ASP VBScript string</source>\n        <translation>ASP VBScript Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"766\"/>\n        <source>ASP VBScript identifier</source>\n        <translation>ASP VBScript Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"769\"/>\n        <source>ASP VBScript unclosed string</source>\n        <translation>ASP VBScript Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"772\"/>\n        <source>Start of a Python fragment</source>\n        <translation>Beginn eines Python Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"775\"/>\n        <source>Python default</source>\n        <translation>Python Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"778\"/>\n        <source>Python comment</source>\n        <translation>Python Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"781\"/>\n        <source>Python number</source>\n        <translation>Python Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"784\"/>\n        <source>Python double-quoted string</source>\n        <translation>Python Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"787\"/>\n        <source>Python single-quoted string</source>\n        <translation>Python Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"790\"/>\n        <source>Python keyword</source>\n        <translation>Python Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"793\"/>\n        <source>Python triple double-quoted string</source>\n        <translation>Python Zeichenkette in dreifachen Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"796\"/>\n        <source>Python triple single-quoted string</source>\n        <translation>Python Zeichenkette in dreifachen Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"799\"/>\n        <source>Python class name</source>\n        <translation>Python Klassenname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"802\"/>\n        <source>Python function or method name</source>\n        <translation>Python Funktions- oder Methodenname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"805\"/>\n        <source>Python operator</source>\n        <translation>Python Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"808\"/>\n        <source>Python identifier</source>\n        <translation>Python Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"811\"/>\n        <source>Start of an ASP Python fragment</source>\n        <translation>Beginn eines ASP Python Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"814\"/>\n        <source>ASP Python default</source>\n        <translation>ASP Python Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"817\"/>\n        <source>ASP Python comment</source>\n        <translation>ASP Python Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"820\"/>\n        <source>ASP Python number</source>\n        <translation>ASP Python Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"823\"/>\n        <source>ASP Python double-quoted string</source>\n        <translation>ASP Python Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"826\"/>\n        <source>ASP Python single-quoted string</source>\n        <translation>ASP Python Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"829\"/>\n        <source>ASP Python keyword</source>\n        <translation>ASP Python Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"832\"/>\n        <source>ASP Python triple double-quoted string</source>\n        <translation>ASP Python Zeichenkette in dreifachen Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"835\"/>\n        <source>ASP Python triple single-quoted string</source>\n        <translation>ASP Python Zeichenkette in dreifachen Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"838\"/>\n        <source>ASP Python class name</source>\n        <translation>ASP Python Klassenname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"841\"/>\n        <source>ASP Python function or method name</source>\n        <translation>ASP Python Funktions- oder Methodenname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"844\"/>\n        <source>ASP Python operator</source>\n        <translation>ASP Python Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"847\"/>\n        <source>ASP Python identifier</source>\n        <translation>ASP Python Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"850\"/>\n        <source>PHP default</source>\n        <translation>PHP Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"853\"/>\n        <source>PHP double-quoted string</source>\n        <translation>PHP Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"856\"/>\n        <source>PHP single-quoted string</source>\n        <translation>PHP Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"859\"/>\n        <source>PHP keyword</source>\n        <translation>PHP Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"862\"/>\n        <source>PHP number</source>\n        <translation>PHP Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"868\"/>\n        <source>PHP comment</source>\n        <translation>PHP Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"871\"/>\n        <source>PHP line comment</source>\n        <translation>PHP Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"874\"/>\n        <source>PHP double-quoted variable</source>\n        <translation>PHP Variable in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"877\"/>\n        <source>PHP operator</source>\n        <translation>PHP Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"865\"/>\n        <source>PHP variable</source>\n        <translation>PHP Variable</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerIDL</name>\n    <message>\n        <location filename=\"qscilexeridl.cpp\" line=\"87\"/>\n        <source>UUID</source>\n        <translation>UUID</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerJavaScript</name>\n    <message>\n        <location filename=\"qscilexerjavascript.cpp\" line=\"97\"/>\n        <source>Regular expression</source>\n        <translation>Regulärer Ausdruck</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerLua</name>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"218\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"221\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"224\"/>\n        <source>Line comment</source>\n        <translation>Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"227\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"230\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"233\"/>\n        <source>String</source>\n        <translation>Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"236\"/>\n        <source>Character</source>\n        <translation>Zeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"239\"/>\n        <source>Literal string</source>\n        <translation>Uninterpretierte Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"242\"/>\n        <source>Preprocessor</source>\n        <translation>Präprozessor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"245\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"248\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"251\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"254\"/>\n        <source>Basic functions</source>\n        <translation>Basisfunktionen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"257\"/>\n        <source>String, table and maths functions</source>\n        <translation>Zeichenketten-, Tabelle- und mathematische Funktionen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"260\"/>\n        <source>Coroutines, i/o and system facilities</source>\n        <translation>Koroutinen, I/O- und Systemfunktionen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"263\"/>\n        <source>User defined 1</source>\n        <translation>Nutzer definiert 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"266\"/>\n        <source>User defined 2</source>\n        <translation>Nutzer definiert 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"269\"/>\n        <source>User defined 3</source>\n        <translation>Nutzer definiert 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"272\"/>\n        <source>User defined 4</source>\n        <translation>Nutzer definiert 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"275\"/>\n        <source>Label</source>\n        <translation>Marke</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMakefile</name>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"116\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"119\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"122\"/>\n        <source>Preprocessor</source>\n        <translation>Präprozessor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"125\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"128\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"131\"/>\n        <source>Target</source>\n        <translation>Ziel</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"134\"/>\n        <source>Error</source>\n        <translation>Fehler</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMatlab</name>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"123\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"126\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"129\"/>\n        <source>Command</source>\n        <translation>Befehl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"132\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"135\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"138\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"141\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"144\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"147\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPO</name>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"90\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"93\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"96\"/>\n        <source>Message identifier</source>\n        <translation>Meldungsbezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"99\"/>\n        <source>Message identifier text</source>\n        <translation>Meldungsbezeichnertext</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"102\"/>\n        <source>Message string</source>\n        <translation>Meldungszeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"105\"/>\n        <source>Message string text</source>\n        <translation>Meldungszeichenkettentext</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"108\"/>\n        <source>Message context</source>\n        <translation>Meldungskontext</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"111\"/>\n        <source>Message context text</source>\n        <translation>Meldungskontexttext</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"114\"/>\n        <source>Fuzzy flag</source>\n        <translation>Unschrfmarkierung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"117\"/>\n        <source>Programmer comment</source>\n        <translation>Programmiererkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"120\"/>\n        <source>Reference</source>\n        <translation>Referenz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"123\"/>\n        <source>Flags</source>\n        <translation>Markierung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"126\"/>\n        <source>Message identifier text end-of-line</source>\n        <translation>Meldungsbezeichnertext Zeilenende</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"129\"/>\n        <source>Message string text end-of-line</source>\n        <translation>Meldungszeichenkettentext Zeilenende</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"132\"/>\n        <source>Message context text end-of-line</source>\n        <translation>Meldungskontexttext Zeilenende</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPOV</name>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"267\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"270\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"273\"/>\n        <source>Comment line</source>\n        <translation>Kommentarzeile</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"276\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"279\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"282\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"285\"/>\n        <source>String</source>\n        <translation>Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"288\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"291\"/>\n        <source>Directive</source>\n        <translation>Direktive</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"294\"/>\n        <source>Bad directive</source>\n        <translation>Ungültige Direktive</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"297\"/>\n        <source>Objects, CSG and appearance</source>\n        <translation>Objekte, CSG und Erscheinung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"300\"/>\n        <source>Types, modifiers and items</source>\n        <translation>Typen, Modifizierer und Items</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"303\"/>\n        <source>Predefined identifiers</source>\n        <translation>Vordefinierter Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"306\"/>\n        <source>Predefined functions</source>\n        <translation>Vordefinierte Funktion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"309\"/>\n        <source>User defined 1</source>\n        <translation>Nutzer definiert 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"312\"/>\n        <source>User defined 2</source>\n        <translation>Nutzer definiert 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"315\"/>\n        <source>User defined 3</source>\n        <translation>Nutzer definiert 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPascal</name>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"246\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"258\"/>\n        <source>Line comment</source>\n        <translation>Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"267\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"273\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"276\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"285\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"249\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"252\"/>\n        <source>&apos;{ ... }&apos; style comment</source>\n        <translation>&apos;{ ... }&apos; Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"255\"/>\n        <source>&apos;(* ... *)&apos; style comment</source>\n        <translation>&apos;(* ... *)&apos; Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"261\"/>\n        <source>&apos;{$ ... }&apos; style pre-processor block</source>\n        <translation>&apos;{$ ... }&apos; Präprozessorblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"264\"/>\n        <source>&apos;(*$ ... *)&apos; style pre-processor block</source>\n        <translation>&apos;(*$ ... *)&apos; Präprozessorblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"270\"/>\n        <source>Hexadecimal number</source>\n        <translation>Hexadezimale Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"279\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"282\"/>\n        <source>Character</source>\n        <translation>Zeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"288\"/>\n        <source>Inline asm</source>\n        <translation>Inline Assembler</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPerl</name>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"318\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"321\"/>\n        <source>Error</source>\n        <translation>Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"324\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"327\"/>\n        <source>POD</source>\n        <translation>POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"330\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"333\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"336\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"339\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"342\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"345\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"348\"/>\n        <source>Scalar</source>\n        <translation>Skalar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"351\"/>\n        <source>Array</source>\n        <translation>Feld</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"354\"/>\n        <source>Hash</source>\n        <translation>Hash</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"357\"/>\n        <source>Symbol table</source>\n        <translation>Symboltabelle</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"360\"/>\n        <source>Regular expression</source>\n        <translation>Regulärer Ausdruck</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"363\"/>\n        <source>Substitution</source>\n        <translation>Ersetzung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"366\"/>\n        <source>Backticks</source>\n        <translation>Backticks</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"369\"/>\n        <source>Data section</source>\n        <translation>Datensektion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"372\"/>\n        <source>Here document delimiter</source>\n        <translation>Here Dokument-Begrenzer</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"375\"/>\n        <source>Single-quoted here document</source>\n        <translation>Here Dokument in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"378\"/>\n        <source>Double-quoted here document</source>\n        <translation>Here Dokument in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"381\"/>\n        <source>Backtick here document</source>\n        <translation>Here Dokument in Backticks</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"384\"/>\n        <source>Quoted string (q)</source>\n        <translation>Zeichenkette (q)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"387\"/>\n        <source>Quoted string (qq)</source>\n        <translation>Zeichenkette (qq)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"390\"/>\n        <source>Quoted string (qx)</source>\n        <translation>Zeichenkette (qx)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"393\"/>\n        <source>Quoted string (qr)</source>\n        <translation>Zeichenkette (qr)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"396\"/>\n        <source>Quoted string (qw)</source>\n        <translation>Zeichenkette (qw)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"399\"/>\n        <source>POD verbatim</source>\n        <translation>POD wörtlich</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"402\"/>\n        <source>Subroutine prototype</source>\n        <translation>Subroutinen Prototyp</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"405\"/>\n        <source>Format identifier</source>\n        <translation>Formatidentifikator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"408\"/>\n        <source>Format body</source>\n        <translation>Formatzweig</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"411\"/>\n        <source>Double-quoted string (interpolated variable)</source>\n        <translation>Zeichenkette in Anführungszeichen (interpolierte Variable)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"414\"/>\n        <source>Translation</source>\n        <translation>Übersetzung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"417\"/>\n        <source>Regular expression (interpolated variable)</source>\n        <translation>Regulärer Ausdruck (interpolierte Variable)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"420\"/>\n        <source>Substitution (interpolated variable)</source>\n        <translation>Ersetzung (interpolierte Variable)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"423\"/>\n        <source>Backticks (interpolated variable)</source>\n        <translation>Backticks (interpolierte Variable)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"426\"/>\n        <source>Double-quoted here document (interpolated variable)</source>\n        <translation>Here Dokument in Anführungszeichen (interpolierte Variable)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"429\"/>\n        <source>Backtick here document (interpolated variable)</source>\n        <translation>Here Dokument in Backticks (interpolierte Variable)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"432\"/>\n        <source>Quoted string (qq, interpolated variable)</source>\n        <translation>Zeichenkette (qq, interpolierte Variable)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"435\"/>\n        <source>Quoted string (qx, interpolated variable)</source>\n        <translation>Zeichenkette (qx, interpolierte Variable)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"438\"/>\n        <source>Quoted string (qr, interpolated variable)</source>\n        <translation>Zeichenkette (qr, interpolierte Variable)</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPostScript</name>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"249\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"252\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"255\"/>\n        <source>DSC comment</source>\n        <translation>DSC Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"258\"/>\n        <source>DSC comment value</source>\n        <translation>DSC Kommentarwert</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"261\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"264\"/>\n        <source>Name</source>\n        <translation>Name</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"267\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"270\"/>\n        <source>Literal</source>\n        <translation>Literal</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"273\"/>\n        <source>Immediately evaluated literal</source>\n        <translation>Direkt ausgeführtes Literal</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"276\"/>\n        <source>Array parenthesis</source>\n        <translation>Feldklammern</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"279\"/>\n        <source>Dictionary parenthesis</source>\n        <translation>Dictionary-Klammern</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"282\"/>\n        <source>Procedure parenthesis</source>\n        <translation>Prozedurklammern</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"285\"/>\n        <source>Text</source>\n        <translation>Text</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"288\"/>\n        <source>Hexadecimal string</source>\n        <translation>Hexadezimale Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"291\"/>\n        <source>Base85 string</source>\n        <translation>Base85 Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"294\"/>\n        <source>Bad string character</source>\n        <translation>Ungültiges Zeichen für Zeichenkette</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerProperties</name>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"111\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"114\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"117\"/>\n        <source>Section</source>\n        <translation>Abschnitt</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"120\"/>\n        <source>Assignment</source>\n        <translation>Zuweisung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"123\"/>\n        <source>Default value</source>\n        <translation>Standardwert</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"126\"/>\n        <source>Key</source>\n        <translation>Schlüssel</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPython</name>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"225\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"228\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"231\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"234\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"237\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"240\"/>\n        <source>Triple single-quoted string</source>\n        <translation>Zeichenkette in dreifachen Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"243\"/>\n        <source>Triple double-quoted string</source>\n        <translation>Zeichenkette in dreifachen Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"246\"/>\n        <source>Class name</source>\n        <translation>Klassenname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"249\"/>\n        <source>Function or method name</source>\n        <translation>Funktions- oder Methodenname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"252\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"255\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"258\"/>\n        <source>Comment block</source>\n        <translation>Kommentarblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"261\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"264\"/>\n        <source>Highlighted identifier</source>\n        <translation>Hervorgehobener Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"267\"/>\n        <source>Decorator</source>\n        <translation>Dekorator</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerRuby</name>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"239\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"245\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"251\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"257\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"260\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"254\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"263\"/>\n        <source>Class name</source>\n        <translation>Klassenname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"266\"/>\n        <source>Function or method name</source>\n        <translation>Funktions- oder Methodenname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"269\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"272\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"242\"/>\n        <source>Error</source>\n        <translation>Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"248\"/>\n        <source>POD</source>\n        <translation>POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"275\"/>\n        <source>Regular expression</source>\n        <translation>Regulärer Ausdruck</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"278\"/>\n        <source>Global</source>\n        <translation>Global</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"281\"/>\n        <source>Symbol</source>\n        <translation>Symbol</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"284\"/>\n        <source>Module name</source>\n        <translation>Modulname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"287\"/>\n        <source>Instance variable</source>\n        <translation>Instanzvariable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"290\"/>\n        <source>Class variable</source>\n        <translation>Klassenvariable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"293\"/>\n        <source>Backticks</source>\n        <translation>Backticks</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"296\"/>\n        <source>Data section</source>\n        <translation>Datensektion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"299\"/>\n        <source>Here document delimiter</source>\n        <translation>Here Dokument-Begrenzer</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"302\"/>\n        <source>Here document</source>\n        <translation>Here Dokument</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"305\"/>\n        <source>%q string</source>\n        <translation>%q Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"308\"/>\n        <source>%Q string</source>\n        <translation>%Q Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"311\"/>\n        <source>%x string</source>\n        <translation>%x Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"314\"/>\n        <source>%r string</source>\n        <translation>%r Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"317\"/>\n        <source>%w string</source>\n        <translation>%w Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"320\"/>\n        <source>Demoted keyword</source>\n        <translation>zurückgestuftes Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"323\"/>\n        <source>stdin</source>\n        <translation>Stdin</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"326\"/>\n        <source>stdout</source>\n        <translation>Stdout</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"329\"/>\n        <source>stderr</source>\n        <translation>Stderr</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSQL</name>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"259\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"268\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"271\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"277\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"286\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"289\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"262\"/>\n        <source>Comment line</source>\n        <translation>Kommentarzeile</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"265\"/>\n        <source>JavaDoc style comment</source>\n        <translation>JavaDoc Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"274\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"280\"/>\n        <source>SQL*Plus keyword</source>\n        <translation>SQL*Plus Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"283\"/>\n        <source>SQL*Plus prompt</source>\n        <translation>SQL*Plus Eingabe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"292\"/>\n        <source>SQL*Plus comment</source>\n        <translation>SQL*Plus Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"295\"/>\n        <source># comment line</source>\n        <translation># Kommentarzeile</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword</source>\n        <translation>JavaDoc Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"301\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>JavaDoc Schlüsselwortfehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"304\"/>\n        <source>User defined 1</source>\n        <translation>Nutzer definiert 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"307\"/>\n        <source>User defined 2</source>\n        <translation>Nutzer definiert 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"310\"/>\n        <source>User defined 3</source>\n        <translation>Nutzer definiert 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"313\"/>\n        <source>User defined 4</source>\n        <translation>Nutzer definiert 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"316\"/>\n        <source>Quoted identifier</source>\n        <translation>Bezeichner in Anführungszeichen</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSpice</name>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"156\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"159\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"162\"/>\n        <source>Command</source>\n        <translation>Befehl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"165\"/>\n        <source>Function</source>\n        <translation>Funktion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"168\"/>\n        <source>Parameter</source>\n        <translation>Parameter</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"171\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"174\"/>\n        <source>Delimiter</source>\n        <translation>Delimiter</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"177\"/>\n        <source>Value</source>\n        <translation>Wert</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"180\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTCL</name>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"283\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"286\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"289\"/>\n        <source>Comment line</source>\n        <translation>Kommentarzeile</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"295\"/>\n        <source>Quoted keyword</source>\n        <translation>angeführtes Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"298\"/>\n        <source>Quoted string</source>\n        <translation>Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"301\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"304\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"307\"/>\n        <source>Substitution</source>\n        <translation>Ersetzung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"310\"/>\n        <source>Brace substitution</source>\n        <translation>Klammerersetzung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"313\"/>\n        <source>Modifier</source>\n        <translation>Modifizierer</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"316\"/>\n        <source>Expand keyword</source>\n        <translation>Erweiterungsschlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"319\"/>\n        <source>TCL keyword</source>\n        <translation>TCL Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"322\"/>\n        <source>Tk keyword</source>\n        <translation>Tk Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"325\"/>\n        <source>iTCL keyword</source>\n        <translation>iTCL Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"328\"/>\n        <source>Tk command</source>\n        <translation>Tk Befehl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"331\"/>\n        <source>User defined 1</source>\n        <translation>Nutzer definiert 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"334\"/>\n        <source>User defined 2</source>\n        <translation>Nutzer definiert 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"337\"/>\n        <source>User defined 3</source>\n        <translation>Nutzer definiert 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"340\"/>\n        <source>User defined 4</source>\n        <translation>Nutzer definiert 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"343\"/>\n        <source>Comment box</source>\n        <translation>Kommentarbox</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"346\"/>\n        <source>Comment block</source>\n        <translation>Kommentarblock</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTeX</name>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"177\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"180\"/>\n        <source>Special</source>\n        <translation>Spezial</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"183\"/>\n        <source>Group</source>\n        <translation>Gruppe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"186\"/>\n        <source>Symbol</source>\n        <translation>Symbol</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"189\"/>\n        <source>Command</source>\n        <translation>Befehl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"192\"/>\n        <source>Text</source>\n        <translation>Text</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVHDL</name>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"197\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"200\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"203\"/>\n        <source>Comment line</source>\n        <translation>Kommentarzeile</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"206\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"209\"/>\n        <source>String</source>\n        <translation>Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"212\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"215\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"218\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"221\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"224\"/>\n        <source>Standard operator</source>\n        <translation>Standardoperator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"227\"/>\n        <source>Attribute</source>\n        <translation>Attribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"230\"/>\n        <source>Standard function</source>\n        <translation>Standardfunktion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"233\"/>\n        <source>Standard package</source>\n        <translation>Standardpaket</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"236\"/>\n        <source>Standard type</source>\n        <translation>Standardtyp</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"239\"/>\n        <source>User defined</source>\n        <translation>Nutzer definiert</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVerilog</name>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"209\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"212\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"215\"/>\n        <source>Line comment</source>\n        <translation>Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"218\"/>\n        <source>Bang comment</source>\n        <translation>Bang Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"221\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"224\"/>\n        <source>Primary keywords and identifiers</source>\n        <translation>Primäre Schlusselwörter und Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"227\"/>\n        <source>String</source>\n        <translation>Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"230\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Sekundäre Schlusselwörter und Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"233\"/>\n        <source>System task</source>\n        <translation>Systemtask</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"236\"/>\n        <source>Preprocessor block</source>\n        <translation>Präprozessorblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"239\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"242\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"245\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"248\"/>\n        <source>User defined tasks and identifiers</source>\n        <translation>Nutzerdefinierte Tasks und Bezeichner</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerYAML</name>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"161\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"164\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"167\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"173\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"176\"/>\n        <source>Reference</source>\n        <translation>Referenz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"179\"/>\n        <source>Document delimiter</source>\n        <translation>Dokumentbegrenzer</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"182\"/>\n        <source>Text block marker</source>\n        <translation>Textblock Markierung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"185\"/>\n        <source>Syntax error marker</source>\n        <translation>Syntaxfehler Markierung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"188\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n</context>\n<context>\n    <name>QsciScintilla</name>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4359\"/>\n        <source>&amp;Undo</source>\n        <translation>&amp;Rückgängig</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4363\"/>\n        <source>&amp;Redo</source>\n        <translation>Wieder&amp;herstellen</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4369\"/>\n        <source>Cu&amp;t</source>\n        <translation>&amp;Ausschneiden</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4374\"/>\n        <source>&amp;Copy</source>\n        <translation>&amp;Kopieren</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4380\"/>\n        <source>&amp;Paste</source>\n        <translation>Ein&amp;fügen</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4384\"/>\n        <source>Delete</source>\n        <translation>Löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4391\"/>\n        <source>Select All</source>\n        <translation>Alle auswählen</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscintilla_es.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.0\" language=\"es\">\n<context>\n    <name>QsciCommand</name>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"44\"/>\n        <source>Move down one line</source>\n        <translation>Desplazar una línea hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"54\"/>\n        <source>Extend selection down one line</source>\n        <translation>Extender la selección una línea hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"71\"/>\n        <source>Scroll view down one line</source>\n        <translation>Desplazar la vista una línea hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"64\"/>\n        <source>Extend rectangular selection down one line</source>\n        <translation>Extender la selección rectangular una línea hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"81\"/>\n        <source>Move up one line</source>\n        <translation>Desplazar una línea hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"91\"/>\n        <source>Extend selection up one line</source>\n        <translation>Extender la selección una línea hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"108\"/>\n        <source>Scroll view up one line</source>\n        <translation>Desplazar la vista una línea hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"101\"/>\n        <source>Extend rectangular selection up one line</source>\n        <translation>Extender la selección rectangular una línea hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"158\"/>\n        <source>Move up one paragraph</source>\n        <translation>Desplazar un párrafo hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"164\"/>\n        <source>Extend selection up one paragraph</source>\n        <translation>Extender la selección un párrafo hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"145\"/>\n        <source>Move down one paragraph</source>\n        <translation>Desplazar un párrafo hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"118\"/>\n        <source>Scroll to start of document</source>\n        <translation>Desplazar al principio del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"128\"/>\n        <source>Scroll to end of document</source>\n        <translation>Desplazar al final del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"138\"/>\n        <source>Scroll vertically to centre current line</source>\n        <translation>Desplazar verticalmente al centro de la línea actual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"151\"/>\n        <source>Extend selection down one paragraph</source>\n        <translation>Extender la selección un párrafo hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"175\"/>\n        <source>Move left one character</source>\n        <translation>Mover un carácter hacia la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"185\"/>\n        <source>Extend selection left one character</source>\n        <translation>Extender la selección un carácter hacia la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"239\"/>\n        <source>Move left one word</source>\n        <translation>Mover una palabra hacia la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"249\"/>\n        <source>Extend selection left one word</source>\n        <translation>Extender la selección una palabra a la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"196\"/>\n        <source>Extend rectangular selection left one character</source>\n        <translation>Extender la selección rectangular un carácter hacia la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"207\"/>\n        <source>Move right one character</source>\n        <translation>Mover un carácter hacia la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"217\"/>\n        <source>Extend selection right one character</source>\n        <translation>Extender la selección un carácter hacia la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"259\"/>\n        <source>Move right one word</source>\n        <translation>Mover una palabra hacia la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"265\"/>\n        <source>Extend selection right one word</source>\n        <translation>Extender la selección una palabra a la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"228\"/>\n        <source>Extend rectangular selection right one character</source>\n        <translation>Extender la selección rectangular un carácter hacia la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"271\"/>\n        <source>Move to end of previous word</source>\n        <translation>Mover al final de palabra anterior</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"277\"/>\n        <source>Extend selection to end of previous word</source>\n        <translation>Extender selección al final de la palabra anterior</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"288\"/>\n        <source>Move to end of next word</source>\n        <translation>Mover al final de la palabra siguiente</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"298\"/>\n        <source>Extend selection to end of next word</source>\n        <translation>Extender la selección hasta el final de la palabra siguiente</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"305\"/>\n        <source>Move left one word part</source>\n        <translation>Mover parte de una palabra hacia la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"311\"/>\n        <source>Extend selection left one word part</source>\n        <translation>Extender la selección parte de una palabra a la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"318\"/>\n        <source>Move right one word part</source>\n        <translation>Mover parte de una palabra hacia la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"324\"/>\n        <source>Extend selection right one word part</source>\n        <translation>Extender la selección parte de una palabra a la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"558\"/>\n        <source>Move up one page</source>\n        <translation>Mover hacia arriba una página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"568\"/>\n        <source>Extend selection up one page</source>\n        <translation>Extender la selección hacia arriba una página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"578\"/>\n        <source>Extend rectangular selection up one page</source>\n        <translation>Extender la selección rectangular hacia arriba una página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"593\"/>\n        <source>Move down one page</source>\n        <translation>Mover hacia abajo una página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"607\"/>\n        <source>Extend selection down one page</source>\n        <translation>Extender la selección hacia abajo una página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"621\"/>\n        <source>Extend rectangular selection down one page</source>\n        <translation>Extender la selección rectangular una página hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"658\"/>\n        <source>Delete current character</source>\n        <translation>Borrar el carácter actual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"788\"/>\n        <source>Cut selection</source>\n        <translation>Cortar selección</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"687\"/>\n        <source>Delete word to right</source>\n        <translation>Borrar palabra hacia la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"335\"/>\n        <source>Move to start of document line</source>\n        <translation>Mover al principio de la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"345\"/>\n        <source>Extend selection to start of document line</source>\n        <translation>Extender selección al principio de la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"356\"/>\n        <source>Extend rectangular selection to start of document line</source>\n        <translation>Extender selección rectangular al principio de la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"367\"/>\n        <source>Move to start of display line</source>\n        <translation>Mover al principio de la línea visualizada</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"377\"/>\n        <source>Extend selection to start of display line</source>\n        <translation>Extender selección al principio de la línea visualizada</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"384\"/>\n        <source>Move to start of display or document line</source>\n        <translation>Mover al principio de la línea visualizada o del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"391\"/>\n        <source>Extend selection to start of display or document line</source>\n        <translation>Extender selección al principio de la línea visualizada o del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"402\"/>\n        <source>Move to first visible character in document line</source>\n        <translation>Mover al primer carácter visible en la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"413\"/>\n        <source>Extend selection to first visible character in document line</source>\n        <translation>Extender selección al primer carácter visible en la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"424\"/>\n        <source>Extend rectangular selection to first visible character in document line</source>\n        <translation>Extender selección rectangular al primer carácter visible en la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"431\"/>\n        <source>Move to first visible character of display in document line</source>\n        <translation>Extender selección al primer carácter visualizado en la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"438\"/>\n        <source>Extend selection to first visible character in display or document line</source>\n        <translation>Extender selección al primer carácter de línea visualizada o del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"449\"/>\n        <source>Move to end of document line</source>\n        <translation>Mover al final de la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"459\"/>\n        <source>Extend selection to end of document line</source>\n        <translation>Extender selección al final de la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"470\"/>\n        <source>Extend rectangular selection to end of document line</source>\n        <translation>Extender selección rectangular al final de la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"481\"/>\n        <source>Move to end of display line</source>\n        <translation>Mover al final de la línea visualizada</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"491\"/>\n        <source>Extend selection to end of display line</source>\n        <translation>Extender selección al final de la línea visualizada</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"498\"/>\n        <source>Move to end of display or document line</source>\n        <translation>Mover al final de la línea visualizada o del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"505\"/>\n        <source>Extend selection to end of display or document line</source>\n        <translation>Extender selección al final de la línea visualizada o del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"516\"/>\n        <source>Move to start of document</source>\n        <translation>Mover al principio del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"526\"/>\n        <source>Extend selection to start of document</source>\n        <translation>Extender selección al principio del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"537\"/>\n        <source>Move to end of document</source>\n        <translation>Mover al final del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"547\"/>\n        <source>Extend selection to end of document</source>\n        <translation>Extender selección al final del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"628\"/>\n        <source>Stuttered move up one page</source>\n        <translation>Mover progresivamente una página hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"634\"/>\n        <source>Stuttered extend selection up one page</source>\n        <translation>Extender progresivamente selección hacia arriba una página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"641\"/>\n        <source>Stuttered move down one page</source>\n        <translation>Mover progresivamente una página hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"647\"/>\n        <source>Stuttered extend selection down one page</source>\n        <translation>Extender progresivamente selección hacia abajo una página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"674\"/>\n        <source>Delete previous character if not at start of line</source>\n        <translation>Borrar carácter anterior si no está al principio de una línea</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"697\"/>\n        <source>Delete right to end of next word</source>\n        <translation>Borrar a la derecha hasta el final de la siguiente palabra</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"714\"/>\n        <source>Delete line to right</source>\n        <translation>Borrar línea hacia la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"738\"/>\n        <source>Transpose current and previous lines</source>\n        <translation>Transponer líneas actual y anterior</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"745\"/>\n        <source>Duplicate the current line</source>\n        <translation>Duplicar línea actual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"751\"/>\n        <source>Select all</source>\n        <oldsource>Select document</oldsource>\n        <translation>Seleccionar todo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"757\"/>\n        <source>Move selected lines up one line</source>\n        <translation>Mover las líneas seleccionadas una línea hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"763\"/>\n        <source>Move selected lines down one line</source>\n        <translation>Mover las líneas seleccionadas una línea hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"806\"/>\n        <source>Toggle insert/overtype</source>\n        <translation>Conmutar insertar/sobreescribir</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"800\"/>\n        <source>Paste</source>\n        <translation>Pegar</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"794\"/>\n        <source>Copy selection</source>\n        <translation>Copiar selección</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"812\"/>\n        <source>Insert newline</source>\n        <translation>Insertar carácter de nueva línea</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"830\"/>\n        <source>De-indent one level</source>\n        <translation>Deshacer un nivel de indentado</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"836\"/>\n        <source>Cancel</source>\n        <translation>Cancelar</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"668\"/>\n        <source>Delete previous character</source>\n        <translation>Borrar carácter anterior</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"681\"/>\n        <source>Delete word to left</source>\n        <translation>Borrar palabra hacia la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"704\"/>\n        <source>Delete line to left</source>\n        <translation>Borrar línea hacia la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"842\"/>\n        <source>Undo last command</source>\n        <translation>Deshacer último comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"852\"/>\n        <source>Redo last command</source>\n        <translation>Rehacer último comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"824\"/>\n        <source>Indent one level</source>\n        <translation>Indentar un nivel</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"858\"/>\n        <source>Zoom in</source>\n        <translation>Aumentar zoom</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"864\"/>\n        <source>Zoom out</source>\n        <translation>Disminuir zoom</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"818\"/>\n        <source>Formfeed</source>\n        <translation>Carga de la página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"726\"/>\n        <source>Cut current line</source>\n        <translation>Cortar línea actual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"720\"/>\n        <source>Delete current line</source>\n        <translation>Borrar línea actual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"732\"/>\n        <source>Copy current line</source>\n        <translation>Copiar línea actual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"776\"/>\n        <source>Convert selection to lower case</source>\n        <translation>Convertir selección a minúsculas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"782\"/>\n        <source>Convert selection to upper case</source>\n        <translation>Convertir selección a mayúsculas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"770\"/>\n        <source>Duplicate selection</source>\n        <translation>Duplicar selección</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerAVS</name>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"280\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"283\"/>\n        <source>Block comment</source>\n        <translation>Comentario de bloque</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"286\"/>\n        <source>Nested block comment</source>\n        <translation>Comentario de bloque anidado</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"289\"/>\n        <source>Line comment</source>\n        <translation>Comentario de línea</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"301\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"304\"/>\n        <source>Triple double-quoted string</source>\n        <translation>Cadena con triple comilla doble</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"307\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"310\"/>\n        <source>Filter</source>\n        <translation>Filtro</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"313\"/>\n        <source>Plugin</source>\n        <translation>Plugin</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"316\"/>\n        <source>Function</source>\n        <translation>Función</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"319\"/>\n        <source>Clip property</source>\n        <translation>Propiedad de recorte</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"322\"/>\n        <source>User defined</source>\n        <translation>Definido por el usuario</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBash</name>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"193\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"196\"/>\n        <source>Error</source>\n        <translation>Error</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"199\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"202\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"205\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"208\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"211\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"214\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"217\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"220\"/>\n        <source>Scalar</source>\n        <translation>Escalar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"223\"/>\n        <source>Parameter expansion</source>\n        <translation>Expansión de parámetros</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"226\"/>\n        <source>Backticks</source>\n        <translation>Comilla inversa</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"229\"/>\n        <source>Here document delimiter</source>\n        <translation>Delimitador de documento integrado (here document)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"232\"/>\n        <source>Single-quoted here document</source>\n        <translation>Documento integrado (here document) con comilla simple</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBatch</name>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"164\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"167\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"173\"/>\n        <source>Label</source>\n        <translation>Etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"176\"/>\n        <source>Hide command character</source>\n        <translation>Ocultar caracteres de comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"179\"/>\n        <source>External command</source>\n        <translation>Comando externo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"182\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"185\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCMake</name>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"181\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"184\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"187\"/>\n        <source>String</source>\n        <translation>Cadena de caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"190\"/>\n        <source>Left quoted string</source>\n        <translation>Cadena con comillas a la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"193\"/>\n        <source>Right quoted string</source>\n        <translation>Cadena con comillas a la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"196\"/>\n        <source>Function</source>\n        <translation>Función</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"199\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"202\"/>\n        <source>Label</source>\n        <translation>Etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"205\"/>\n        <source>User defined</source>\n        <translation>Definido por el usuario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"208\"/>\n        <source>WHILE block</source>\n        <translation>Bloque WHILE</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"211\"/>\n        <source>FOREACH block</source>\n        <translation>Bloque FOREACH</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"214\"/>\n        <source>IF block</source>\n        <translation>Bloque IF</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"217\"/>\n        <source>MACRO block</source>\n        <translation>Bloque MACRO</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"220\"/>\n        <source>Variable within a string</source>\n        <translation>Variable en una cadena</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"223\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCPP</name>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"340\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"343\"/>\n        <source>Inactive default</source>\n        <translation>Por defecto inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"346\"/>\n        <source>C comment</source>\n        <translation>Comentario C</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"349\"/>\n        <source>Inactive C comment</source>\n        <translation>Comentario C inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"352\"/>\n        <source>C++ comment</source>\n        <translation>Comentario C++</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"355\"/>\n        <source>Inactive C++ comment</source>\n        <translation>Comentario C++ inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"358\"/>\n        <source>JavaDoc style C comment</source>\n        <translation>Comentario C de estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"361\"/>\n        <source>Inactive JavaDoc style C comment</source>\n        <translation>Comentario C estilo JavaDoc inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"364\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"367\"/>\n        <source>Inactive number</source>\n        <translation>Número inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"370\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"373\"/>\n        <source>Inactive keyword</source>\n        <translation>Palabra clave inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"376\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"379\"/>\n        <source>Inactive double-quoted string</source>\n        <translation>Cadena con doble comilla inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"382\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"385\"/>\n        <source>Inactive single-quoted string</source>\n        <translation>Cadena con comilla simple inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"388\"/>\n        <source>IDL UUID</source>\n        <translation>IDL UUID</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"391\"/>\n        <source>Inactive IDL UUID</source>\n        <translation>IDL UUID inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"394\"/>\n        <source>Pre-processor block</source>\n        <translation>Bloque de preprocesador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"397\"/>\n        <source>Inactive pre-processor block</source>\n        <translation>Bloque de preprocesador inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"400\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"403\"/>\n        <source>Inactive operator</source>\n        <translation>Operador inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"406\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"409\"/>\n        <source>Inactive identifier</source>\n        <translation>Identificador inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"412\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"415\"/>\n        <source>Inactive unclosed string</source>\n        <translation>Cadena sin cerrar inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"418\"/>\n        <source>C# verbatim string</source>\n        <translation>Cadena C# textual</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"421\"/>\n        <source>Inactive C# verbatim string</source>\n        <translation>Cadena C# textual inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"424\"/>\n        <source>JavaScript regular expression</source>\n        <translation>Expresión regular JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"427\"/>\n        <source>Inactive JavaScript regular expression</source>\n        <translation>Expresión regular JavaScript inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"430\"/>\n        <source>JavaDoc style C++ comment</source>\n        <translation>Comentario C++ de estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"433\"/>\n        <source>Inactive JavaDoc style C++ comment</source>\n        <translation>Comentario C++ estilo JavaDoc inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"436\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Identificadores y palabras clave secundarios</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"439\"/>\n        <source>Inactive secondary keywords and identifiers</source>\n        <translation>Identificadores y palabras clave secundarios inactivos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"442\"/>\n        <source>JavaDoc keyword</source>\n        <translation>Palabra clave de Javadoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"445\"/>\n        <source>Inactive JavaDoc keyword</source>\n        <translation>Palabra clave de JavaDoc inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"448\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>Error en palabra clave de Javadoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"451\"/>\n        <source>Inactive JavaDoc keyword error</source>\n        <translation>Error en palabra clave de Javadoc inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"454\"/>\n        <source>Global classes and typedefs</source>\n        <translation>Clases globales y typedefs</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"457\"/>\n        <source>Inactive global classes and typedefs</source>\n        <translation>Clases globales y typedefs inactivos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"460\"/>\n        <source>C++ raw string</source>\n        <translation>Cadena en bruto C++</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"463\"/>\n        <source>Inactive C++ raw string</source>\n        <translation>Cadena inactiva C++</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"466\"/>\n        <source>Vala triple-quoted verbatim string</source>\n        <translation>Cadena Vala con triple comilla textual</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"469\"/>\n        <source>Inactive Vala triple-quoted verbatim string</source>\n        <translation>Cadena Vala con triple comilla textual inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"472\"/>\n        <source>Pike hash-quoted string</source>\n        <translation>Cadena Pike con hash entrecomillado</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"475\"/>\n        <source>Inactive Pike hash-quoted string</source>\n        <translation>Cadena Pike con hash entrecomillado inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"478\"/>\n        <source>Pre-processor C comment</source>\n        <translation>Comentario C de preprocesador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"481\"/>\n        <source>Inactive pre-processor C comment</source>\n        <translation>Comentario C de preprocesador inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"484\"/>\n        <source>JavaDoc style pre-processor comment</source>\n        <translation>Comentario de preprocesador estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"487\"/>\n        <source>Inactive JavaDoc style pre-processor comment</source>\n        <translation>Comentario de preprocesador estilo JavaDoc inactivo</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSS</name>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"225\"/>\n        <source>Tag</source>\n        <translation>Etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"228\"/>\n        <source>Class selector</source>\n        <translation>Selector de clase</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"231\"/>\n        <source>Pseudo-class</source>\n        <translation>Pseudoclase</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"234\"/>\n        <source>Unknown pseudo-class</source>\n        <translation>Pseudoclase desconocida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"237\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"240\"/>\n        <source>CSS1 property</source>\n        <translation>Propiedad CSS1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"243\"/>\n        <source>Unknown property</source>\n        <translation>Propiedad desconocida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"246\"/>\n        <source>Value</source>\n        <translation>Valor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"249\"/>\n        <source>ID selector</source>\n        <translation>Selector de ID</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"252\"/>\n        <source>Important</source>\n        <translation>Importante</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"255\"/>\n        <source>@-rule</source>\n        <translation>Regla-@</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"258\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"261\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"264\"/>\n        <source>CSS2 property</source>\n        <translation>Propiedad CSS2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"267\"/>\n        <source>Attribute</source>\n        <translation>Atributo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"270\"/>\n        <source>CSS3 property</source>\n        <translation>Propiedad CSS3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"273\"/>\n        <source>Pseudo-element</source>\n        <translation>Pseudoelemento</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"276\"/>\n        <source>Extended CSS property</source>\n        <translation>Propiedad CSS extendida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"279\"/>\n        <source>Extended pseudo-class</source>\n        <translation>Pseudoclase extendida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"282\"/>\n        <source>Extended pseudo-element</source>\n        <translation>Pseudoelemento extendido</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"285\"/>\n        <source>Media rule</source>\n        <translation>Regla de &apos;@media&apos;</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"288\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSharp</name>\n    <message>\n        <location filename=\"qscilexercsharp.cpp\" line=\"95\"/>\n        <source>Verbatim string</source>\n        <translation>Cadena textual</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCoffeeScript</name>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"244\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"247\"/>\n        <source>C-style comment</source>\n        <translation>Comentario de estilo C</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"250\"/>\n        <source>C++-style comment</source>\n        <translation>Comentario de estilo C++</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"253\"/>\n        <source>JavaDoc C-style comment</source>\n        <translation>Comentario de estilo JavaDoc C</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"256\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"259\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"262\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"265\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comilla simple</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"268\"/>\n        <source>IDL UUID</source>\n        <translation>IDL UUID</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"271\"/>\n        <source>Pre-processor block</source>\n        <translation>Bloque de preprocesador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"274\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"277\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"280\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"283\"/>\n        <source>C# verbatim string</source>\n        <translation>Cadena C# textual</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"286\"/>\n        <source>Regular expression</source>\n        <translation>Expresión regular</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"289\"/>\n        <source>JavaDoc C++-style comment</source>\n        <translation>Comentario de estilo JavaDoc C++</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"292\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Identificadores y palabras clave secundarios</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"295\"/>\n        <source>JavaDoc keyword</source>\n        <translation>Palabra clave de JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>Error en palabra clave de JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"301\"/>\n        <source>Global classes</source>\n        <translation>Clases globales</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"304\"/>\n        <source>Block comment</source>\n        <translation>Comentario de bloque</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"307\"/>\n        <source>Block regular expression</source>\n        <translation>Expresión regular de bloque</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"310\"/>\n        <source>Block regular expression comment</source>\n        <translation>Comentario de expresión regular de bloque</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerD</name>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"259\"/>\n        <source>Block comment</source>\n        <translation>Comentario de bloque</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"262\"/>\n        <source>Line comment</source>\n        <translation>Comentario de línea</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"265\"/>\n        <source>DDoc style block comment</source>\n        <translation>Comentario de bloque estilo DDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"268\"/>\n        <source>Nesting comment</source>\n        <translation>Comentario anidado</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"271\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"274\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"277\"/>\n        <source>Secondary keyword</source>\n        <translation>Palabra clave secundaria</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"280\"/>\n        <source>Documentation keyword</source>\n        <translation>Palabra clave de documentación</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"283\"/>\n        <source>Type definition</source>\n        <translation>Definición de tipo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"286\"/>\n        <source>String</source>\n        <translation>Cadena de caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"289\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"292\"/>\n        <source>Character</source>\n        <translation>Carácter</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"301\"/>\n        <source>DDoc style line comment</source>\n        <translation>Comentario de línea estilo DDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"304\"/>\n        <source>DDoc keyword</source>\n        <translation>Palabra clave DDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"307\"/>\n        <source>DDoc keyword error</source>\n        <translation>Error en palabra clave DDOC</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"310\"/>\n        <source>Backquoted string</source>\n        <translation>Cadena con comillas hacia atrás</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"313\"/>\n        <source>Raw string</source>\n        <translation>Cadena en bruto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"316\"/>\n        <source>User defined 1</source>\n        <translation>Definido por el usuario 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"319\"/>\n        <source>User defined 2</source>\n        <translation>Definido por el usuario 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"322\"/>\n        <source>User defined 3</source>\n        <translation>Definido por el usuario 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerDiff</name>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"92\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"95\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"98\"/>\n        <source>Command</source>\n        <translation>Comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"101\"/>\n        <source>Header</source>\n        <translation>Encabezado</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"104\"/>\n        <source>Position</source>\n        <translation>Posición</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"107\"/>\n        <source>Removed line</source>\n        <translation>Línea eliminada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"110\"/>\n        <source>Added line</source>\n        <translation>Línea añadida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"113\"/>\n        <source>Changed line</source>\n        <translation>Línea modificada</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerFortran77</name>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"176\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"179\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"182\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"185\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"188\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"191\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"194\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"197\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"200\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"203\"/>\n        <source>Intrinsic function</source>\n        <translation>Función intrínseca</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"206\"/>\n        <source>Extended function</source>\n        <translation>Función extendida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"209\"/>\n        <source>Pre-processor block</source>\n        <translation>Bloque de preprocesador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"212\"/>\n        <source>Dotted operator</source>\n        <translation>Operador punteado</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"215\"/>\n        <source>Label</source>\n        <translation>Etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"218\"/>\n        <source>Continuation</source>\n        <translation>Continuación</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerHTML</name>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"553\"/>\n        <source>HTML default</source>\n        <translation>HTML por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"556\"/>\n        <source>Tag</source>\n        <translation>Etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"559\"/>\n        <source>Unknown tag</source>\n        <translation>Etiqueta desconocida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"562\"/>\n        <source>Attribute</source>\n        <translation>Atributo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"565\"/>\n        <source>Unknown attribute</source>\n        <translation>Atributo desconocido</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"568\"/>\n        <source>HTML number</source>\n        <translation>Número HTML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"571\"/>\n        <source>HTML double-quoted string</source>\n        <translation>Cadena HTML con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"574\"/>\n        <source>HTML single-quoted string</source>\n        <translation>Cadena HTML con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"577\"/>\n        <source>Other text in a tag</source>\n        <translation>Otro texto en una etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"580\"/>\n        <source>HTML comment</source>\n        <translation>Comentario HTML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"583\"/>\n        <source>Entity</source>\n        <translation>Entidad</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"586\"/>\n        <source>End of a tag</source>\n        <translation>Final de una etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"589\"/>\n        <source>Start of an XML fragment</source>\n        <translation>Inicio de un fragmento XML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"592\"/>\n        <source>End of an XML fragment</source>\n        <translation>Fin de un fragmento XML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"595\"/>\n        <source>Script tag</source>\n        <translation>Etiqueta de script</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"598\"/>\n        <source>Start of an ASP fragment with @</source>\n        <translation>Inicio de un fragmento ASP con @</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"601\"/>\n        <source>Start of an ASP fragment</source>\n        <translation>Inicio de un fragmento ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"604\"/>\n        <source>CDATA</source>\n        <translation>CDATA</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"607\"/>\n        <source>Start of a PHP fragment</source>\n        <translation>Inicio de un fragmento PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"610\"/>\n        <source>Unquoted HTML value</source>\n        <translation>Valor HTML sin comillas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"613\"/>\n        <source>ASP X-Code comment</source>\n        <translation>Comentario ASP X-Code</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"616\"/>\n        <source>SGML default</source>\n        <translation>SGML por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"619\"/>\n        <source>SGML command</source>\n        <translation>Comando SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"622\"/>\n        <source>First parameter of an SGML command</source>\n        <translation>Primer parametro de un comando SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"625\"/>\n        <source>SGML double-quoted string</source>\n        <translation>Cadena SGML con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"628\"/>\n        <source>SGML single-quoted string</source>\n        <translation>Cadena SGML con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"631\"/>\n        <source>SGML error</source>\n        <translation>Error SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"634\"/>\n        <source>SGML special entity</source>\n        <translation>Entidad SGML especial</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"637\"/>\n        <source>SGML comment</source>\n        <translation>Comentario SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"640\"/>\n        <source>First parameter comment of an SGML command</source>\n        <translation>Comentario de primer parametro de un comando SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"643\"/>\n        <source>SGML block default</source>\n        <translation>Bloque SGML por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"646\"/>\n        <source>Start of a JavaScript fragment</source>\n        <translation>Inicio de un fragmento JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"649\"/>\n        <source>JavaScript default</source>\n        <translation>JavaScript por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"652\"/>\n        <source>JavaScript comment</source>\n        <translation>Comentario JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"655\"/>\n        <source>JavaScript line comment</source>\n        <translation>Comentario de línea de JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"658\"/>\n        <source>JavaDoc style JavaScript comment</source>\n        <translation>Comentario JavaScript de estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"661\"/>\n        <source>JavaScript number</source>\n        <translation>Número JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"664\"/>\n        <source>JavaScript word</source>\n        <translation>Palabra JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"667\"/>\n        <source>JavaScript keyword</source>\n        <translation>Palabra clave JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"670\"/>\n        <source>JavaScript double-quoted string</source>\n        <translation>Cadena JavaScript con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"673\"/>\n        <source>JavaScript single-quoted string</source>\n        <translation>Cadena JavaScript con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"676\"/>\n        <source>JavaScript symbol</source>\n        <translation>Símbolo JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"679\"/>\n        <source>JavaScript unclosed string</source>\n        <translation>Cadena JavaScript sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"682\"/>\n        <source>JavaScript regular expression</source>\n        <translation>Expresión regular JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"685\"/>\n        <source>Start of an ASP JavaScript fragment</source>\n        <translation>Inicio de un fragmento de ASP JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"688\"/>\n        <source>ASP JavaScript default</source>\n        <translation>ASP JavaScript por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"691\"/>\n        <source>ASP JavaScript comment</source>\n        <translation>Comentario de ASP JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"694\"/>\n        <source>ASP JavaScript line comment</source>\n        <translation>Comentario de línea de ASP JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"697\"/>\n        <source>JavaDoc style ASP JavaScript comment</source>\n        <translation>Comentario ASP JavaScript de estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"700\"/>\n        <source>ASP JavaScript number</source>\n        <translation>Número ASP JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"703\"/>\n        <source>ASP JavaScript word</source>\n        <translation>Palabra ASP JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"706\"/>\n        <source>ASP JavaScript keyword</source>\n        <translation>Palabra clave ASP JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"709\"/>\n        <source>ASP JavaScript double-quoted string</source>\n        <translation>Cadena ASP JavaScript con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"712\"/>\n        <source>ASP JavaScript single-quoted string</source>\n        <translation>Cadena ASP JavaScript con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"715\"/>\n        <source>ASP JavaScript symbol</source>\n        <translation>Símbolo ASP JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"718\"/>\n        <source>ASP JavaScript unclosed string</source>\n        <translation>Cadena ASP JavaScript sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"721\"/>\n        <source>ASP JavaScript regular expression</source>\n        <translation>Expresión regular ASP JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"724\"/>\n        <source>Start of a VBScript fragment</source>\n        <translation>Inicio de un fragmento VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"727\"/>\n        <source>VBScript default</source>\n        <translation>VBScript por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"730\"/>\n        <source>VBScript comment</source>\n        <translation>Comentario VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"733\"/>\n        <source>VBScript number</source>\n        <translation>Número VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"736\"/>\n        <source>VBScript keyword</source>\n        <translation>Palabra clave VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"739\"/>\n        <source>VBScript string</source>\n        <translation>Cadena de caracteres VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"742\"/>\n        <source>VBScript identifier</source>\n        <translation>Identificador VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"745\"/>\n        <source>VBScript unclosed string</source>\n        <translation>Cadena VBScript sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"748\"/>\n        <source>Start of an ASP VBScript fragment</source>\n        <translation>Inicio de un fragmento de ASP VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"751\"/>\n        <source>ASP VBScript default</source>\n        <translation>ASP VBScript por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"754\"/>\n        <source>ASP VBScript comment</source>\n        <translation>Comentario de ASP VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"757\"/>\n        <source>ASP VBScript number</source>\n        <translation>Número ASP VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"760\"/>\n        <source>ASP VBScript keyword</source>\n        <translation>Palabra clave ASP VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"763\"/>\n        <source>ASP VBScript string</source>\n        <translation>Cadena de caracteres ASP VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"766\"/>\n        <source>ASP VBScript identifier</source>\n        <translation>Identificador ASP VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"769\"/>\n        <source>ASP VBScript unclosed string</source>\n        <translation>Cadena ASP VBScript sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"772\"/>\n        <source>Start of a Python fragment</source>\n        <translation>Inicio de un fragmento Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"775\"/>\n        <source>Python default</source>\n        <translation>Python por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"778\"/>\n        <source>Python comment</source>\n        <translation>Comentario Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"781\"/>\n        <source>Python number</source>\n        <translation>Número Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"784\"/>\n        <source>Python double-quoted string</source>\n        <translation>Cadena Python con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"787\"/>\n        <source>Python single-quoted string</source>\n        <translation>Cadena Python con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"790\"/>\n        <source>Python keyword</source>\n        <translation>Palabra clave de Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"793\"/>\n        <source>Python triple double-quoted string</source>\n        <translation>Cadena Python con triple comilla doble</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"796\"/>\n        <source>Python triple single-quoted string</source>\n        <translation>Cadena Python con triple comilla simple</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"799\"/>\n        <source>Python class name</source>\n        <translation>Nombre de clase Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"802\"/>\n        <source>Python function or method name</source>\n        <translation>Nombre de método o función Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"805\"/>\n        <source>Python operator</source>\n        <translation>Operador Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"808\"/>\n        <source>Python identifier</source>\n        <translation>Identificador Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"811\"/>\n        <source>Start of an ASP Python fragment</source>\n        <translation>Inicio de un fragmento ASP Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"814\"/>\n        <source>ASP Python default</source>\n        <translation>ASP Python por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"817\"/>\n        <source>ASP Python comment</source>\n        <translation>Comentario ASP Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"820\"/>\n        <source>ASP Python number</source>\n        <translation>Número ASP Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"823\"/>\n        <source>ASP Python double-quoted string</source>\n        <translation>Cadena ASP Python con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"826\"/>\n        <source>ASP Python single-quoted string</source>\n        <translation>Cadena ASP Python con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"829\"/>\n        <source>ASP Python keyword</source>\n        <translation>Palabra clave de ASP Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"832\"/>\n        <source>ASP Python triple double-quoted string</source>\n        <translation>Cadena ASP Python con triple comilla doble</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"835\"/>\n        <source>ASP Python triple single-quoted string</source>\n        <translation>Cadena ASP Python con triple comilla simple</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"838\"/>\n        <source>ASP Python class name</source>\n        <translation>Nombre de clase ASP Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"841\"/>\n        <source>ASP Python function or method name</source>\n        <translation>Nombre de método o función ASP Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"844\"/>\n        <source>ASP Python operator</source>\n        <translation>Operador ASP Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"847\"/>\n        <source>ASP Python identifier</source>\n        <translation>Identificador ASP Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"850\"/>\n        <source>PHP default</source>\n        <translation>PHP por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"853\"/>\n        <source>PHP double-quoted string</source>\n        <translation>Cadena PHP con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"856\"/>\n        <source>PHP single-quoted string</source>\n        <translation>Cadena PHP con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"859\"/>\n        <source>PHP keyword</source>\n        <translation>Palabra clave PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"862\"/>\n        <source>PHP number</source>\n        <translation>Número PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"865\"/>\n        <source>PHP variable</source>\n        <translation>Variable PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"868\"/>\n        <source>PHP comment</source>\n        <translation>Comentario PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"871\"/>\n        <source>PHP line comment</source>\n        <translation>Comentario de línea PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"874\"/>\n        <source>PHP double-quoted variable</source>\n        <translation>Variable PHP con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"877\"/>\n        <source>PHP operator</source>\n        <translation>Operador PHP</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerIDL</name>\n    <message>\n        <location filename=\"qscilexeridl.cpp\" line=\"87\"/>\n        <source>UUID</source>\n        <translation>UUID</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerJavaScript</name>\n    <message>\n        <location filename=\"qscilexerjavascript.cpp\" line=\"97\"/>\n        <source>Regular expression</source>\n        <translation>Expresión regular</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerLua</name>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"218\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"221\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"224\"/>\n        <source>Line comment</source>\n        <translation>Comentario de línea</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"227\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"230\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"233\"/>\n        <source>String</source>\n        <translation>Cadena de caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"236\"/>\n        <source>Character</source>\n        <translation>Carácter</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"239\"/>\n        <source>Literal string</source>\n        <translation>Cadena literal</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"242\"/>\n        <source>Preprocessor</source>\n        <translation>Preprocesador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"245\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"248\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"251\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"254\"/>\n        <source>Basic functions</source>\n        <translation>Funciones basicas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"257\"/>\n        <source>String, table and maths functions</source>\n        <translation>Funcines de cadena, tabla y matemáticas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"260\"/>\n        <source>Coroutines, i/o and system facilities</source>\n        <translation>Co-rutinas, e/s y funciones del sistema</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"263\"/>\n        <source>User defined 1</source>\n        <translation>Definido por el usuario 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"266\"/>\n        <source>User defined 2</source>\n        <translation>Definido por el usuario 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"269\"/>\n        <source>User defined 3</source>\n        <translation>Definido por el usuario 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"272\"/>\n        <source>User defined 4</source>\n        <translation>Definido por el usuario 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"275\"/>\n        <source>Label</source>\n        <translation>Etiqueta</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMakefile</name>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"116\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"119\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"122\"/>\n        <source>Preprocessor</source>\n        <translation>Preprocesador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"125\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"128\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"131\"/>\n        <source>Target</source>\n        <translation>Objetivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"134\"/>\n        <source>Error</source>\n        <translation>Error</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMatlab</name>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"123\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"126\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"129\"/>\n        <source>Command</source>\n        <translation>Comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"132\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"135\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"138\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"141\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"144\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"147\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPO</name>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"90\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"93\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"96\"/>\n        <source>Message identifier</source>\n        <translation>Identificador de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"99\"/>\n        <source>Message identifier text</source>\n        <translation>Texto identificador de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"102\"/>\n        <source>Message string</source>\n        <translation>Cadena de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"105\"/>\n        <source>Message string text</source>\n        <translation>Texto de cadena de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"108\"/>\n        <source>Message context</source>\n        <translation>Contexto de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"111\"/>\n        <source>Message context text</source>\n        <translation>Texto de contexto de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"114\"/>\n        <source>Fuzzy flag</source>\n        <translation>Señalador difuso</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"117\"/>\n        <source>Programmer comment</source>\n        <translation>Comentario de programador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"120\"/>\n        <source>Reference</source>\n        <translation>Referencia</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"123\"/>\n        <source>Flags</source>\n        <translation>Señaladores</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"126\"/>\n        <source>Message identifier text end-of-line</source>\n        <translation>Fin de línea de texto identificador de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"129\"/>\n        <source>Message string text end-of-line</source>\n        <translation>Fin de línea de texto de cadena de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"132\"/>\n        <source>Message context text end-of-line</source>\n        <translation>Fin de línea de texto de contexto de mensaje</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPOV</name>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"267\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"270\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"273\"/>\n        <source>Comment line</source>\n        <translation>Línea de comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"276\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"279\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"282\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"285\"/>\n        <source>String</source>\n        <translation>Cadena de caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"288\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"291\"/>\n        <source>Directive</source>\n        <translation>Directiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"294\"/>\n        <source>Bad directive</source>\n        <translation>Mala directiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"297\"/>\n        <source>Objects, CSG and appearance</source>\n        <translation>Objetos, CSG y apariencia</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"300\"/>\n        <source>Types, modifiers and items</source>\n        <translation>Tipos, modificadores y elementos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"303\"/>\n        <source>Predefined identifiers</source>\n        <translation>Identificadores predefinidos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"306\"/>\n        <source>Predefined functions</source>\n        <translation>Funciones predefinidas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"309\"/>\n        <source>User defined 1</source>\n        <translation>Definido por el usuario 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"312\"/>\n        <source>User defined 2</source>\n        <translation>Definido por el usuario 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"315\"/>\n        <source>User defined 3</source>\n        <translation>Definido por el usuario 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPascal</name>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"246\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"258\"/>\n        <source>Line comment</source>\n        <translation>Comentario de línea</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"267\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"273\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"276\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"285\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"249\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"252\"/>\n        <source>&apos;{ ... }&apos; style comment</source>\n        <translation>Comentario de estilo &apos;{ ... }&apos; </translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"255\"/>\n        <source>&apos;(* ... *)&apos; style comment</source>\n        <translation>Comentario de estilo &apos;(* ... *)&apos;</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"261\"/>\n        <source>&apos;{$ ... }&apos; style pre-processor block</source>\n        <translation>Bloque de preprocesador de estilo &apos;{$ ... }&apos;</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"264\"/>\n        <source>&apos;(*$ ... *)&apos; style pre-processor block</source>\n        <translation>Bloque de preprocesador de estilo &apos;(*$ ... *)&apos;</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"270\"/>\n        <source>Hexadecimal number</source>\n        <translation>Número hexadecimal</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"279\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"282\"/>\n        <source>Character</source>\n        <translation>Carácter</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"288\"/>\n        <source>Inline asm</source>\n        <translation>asm inline </translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPerl</name>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"318\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"321\"/>\n        <source>Error</source>\n        <translation>Error</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"324\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"327\"/>\n        <source>POD</source>\n        <translation>POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"330\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"333\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"336\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"339\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"342\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"345\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"348\"/>\n        <source>Scalar</source>\n        <translation>Escalar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"351\"/>\n        <source>Array</source>\n        <translation>Array</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"354\"/>\n        <source>Hash</source>\n        <translation>Hash</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"357\"/>\n        <source>Symbol table</source>\n        <translation>Tabla de símbolos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"360\"/>\n        <source>Regular expression</source>\n        <translation>Expresión regular</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"363\"/>\n        <source>Substitution</source>\n        <translation>Sustitución</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"366\"/>\n        <source>Backticks</source>\n        <translation>Comilla inversa</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"369\"/>\n        <source>Data section</source>\n        <translation>Sección de datos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"372\"/>\n        <source>Here document delimiter</source>\n        <translation>Delimitador de documento integrado (here document)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"375\"/>\n        <source>Single-quoted here document</source>\n        <translation>Documento integrado (here document) con comilla simple</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"378\"/>\n        <source>Double-quoted here document</source>\n        <translation>Documento integrado (here document) con comilla doble</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"381\"/>\n        <source>Backtick here document</source>\n        <translation>Documento integrado (here document) con comilla inversa</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"384\"/>\n        <source>Quoted string (q)</source>\n        <translation>Cadena con comillas (q)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"387\"/>\n        <source>Quoted string (qq)</source>\n        <translation>Cadena con comillas (qq)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"390\"/>\n        <source>Quoted string (qx)</source>\n        <translation>Cadena con comillas (qx)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"393\"/>\n        <source>Quoted string (qr)</source>\n        <translation>Cadena con comillas (qr)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"396\"/>\n        <source>Quoted string (qw)</source>\n        <translation>Cadena con comillas (qw)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"399\"/>\n        <source>POD verbatim</source>\n        <translation>POD textual</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"402\"/>\n        <source>Subroutine prototype</source>\n        <translation>Prototipo de subrutina</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"405\"/>\n        <source>Format identifier</source>\n        <translation>Identificador de formato</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"408\"/>\n        <source>Format body</source>\n        <translation>Cuerpo de formato</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"411\"/>\n        <source>Double-quoted string (interpolated variable)</source>\n        <translation>Cadena con doble comilla (variable interpolada)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"414\"/>\n        <source>Translation</source>\n        <translation>Traducción</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"417\"/>\n        <source>Regular expression (interpolated variable)</source>\n        <translation>Expresión regular (variable interpolada)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"420\"/>\n        <source>Substitution (interpolated variable)</source>\n        <translation>Substitución (variable interpolada)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"423\"/>\n        <source>Backticks (interpolated variable)</source>\n        <translation>Comilla hacia atrás (variable interpolada)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"426\"/>\n        <source>Double-quoted here document (interpolated variable)</source>\n        <translation>Here document con comilla doble (variable interpolada)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"429\"/>\n        <source>Backtick here document (interpolated variable)</source>\n        <translation>Here document con comilla hacia atrás (variable interpolada)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"432\"/>\n        <source>Quoted string (qq, interpolated variable)</source>\n        <translation>Cadena entrecomillada (qq, variable interpolada)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"435\"/>\n        <source>Quoted string (qx, interpolated variable)</source>\n        <translation>Cadena entrecomillada (qx, variable interpolada)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"438\"/>\n        <source>Quoted string (qr, interpolated variable)</source>\n        <translation>Cadena entrecomillada (qr, variable interpolada)</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPostScript</name>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"249\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"252\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"255\"/>\n        <source>DSC comment</source>\n        <translation>Comentario DSC</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"258\"/>\n        <source>DSC comment value</source>\n        <translation>Valor de comentario DSC</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"261\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"264\"/>\n        <source>Name</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"267\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"270\"/>\n        <source>Literal</source>\n        <translation>Literal</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"273\"/>\n        <source>Immediately evaluated literal</source>\n        <translation>Literal de evaluación inmediata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"276\"/>\n        <source>Array parenthesis</source>\n        <translation>Paréntesis de array</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"279\"/>\n        <source>Dictionary parenthesis</source>\n        <translation>Paréntesis de diccionario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"282\"/>\n        <source>Procedure parenthesis</source>\n        <translation>Paréntesis de procedimiento</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"285\"/>\n        <source>Text</source>\n        <translation>Texto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"288\"/>\n        <source>Hexadecimal string</source>\n        <translation>Cadena hexadecimal</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"291\"/>\n        <source>Base85 string</source>\n        <translation>Cadena Base85</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"294\"/>\n        <source>Bad string character</source>\n        <translation>Carácter de cadena mala</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerProperties</name>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"111\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"114\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"117\"/>\n        <source>Section</source>\n        <translation>Sección</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"120\"/>\n        <source>Assignment</source>\n        <translation>Asignación</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"123\"/>\n        <source>Default value</source>\n        <translation>Valor por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"126\"/>\n        <source>Key</source>\n        <translation>Clave</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPython</name>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"225\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"228\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"231\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"234\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"237\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"240\"/>\n        <source>Triple single-quoted string</source>\n        <translation>Cadena con triple comilla simple</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"243\"/>\n        <source>Triple double-quoted string</source>\n        <translation>Cadena con triple comilla doble</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"246\"/>\n        <source>Class name</source>\n        <translation>Nombre de clase</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"249\"/>\n        <source>Function or method name</source>\n        <translation>Nombre de método o función</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"252\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"255\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"258\"/>\n        <source>Comment block</source>\n        <translation>Bloque de comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"261\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"264\"/>\n        <source>Highlighted identifier</source>\n        <translation>Identificador resaltado</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"267\"/>\n        <source>Decorator</source>\n        <translation>Decorador</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerRuby</name>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"239\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"245\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"251\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"257\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"260\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"254\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"263\"/>\n        <source>Class name</source>\n        <translation>Nombre de clase</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"266\"/>\n        <source>Function or method name</source>\n        <translation>Nombre de método o función</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"269\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"272\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"242\"/>\n        <source>Error</source>\n        <translation>Error</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"248\"/>\n        <source>POD</source>\n        <translation>POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"275\"/>\n        <source>Regular expression</source>\n        <translation>Expresión regular</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"278\"/>\n        <source>Global</source>\n        <translation>Global</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"281\"/>\n        <source>Symbol</source>\n        <translation>Símbolo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"284\"/>\n        <source>Module name</source>\n        <translation>Nombre de módulo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"287\"/>\n        <source>Instance variable</source>\n        <translation>Variable de instancia</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"290\"/>\n        <source>Class variable</source>\n        <translation>Variable de clase</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"293\"/>\n        <source>Backticks</source>\n        <translation>Comilla inversa</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"296\"/>\n        <source>Data section</source>\n        <translation>Sección de datos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"299\"/>\n        <source>Here document delimiter</source>\n        <translation>Delimitador de documento integrado (here document)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"302\"/>\n        <source>Here document</source>\n        <translation>Documento integrado (here document)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"305\"/>\n        <source>%q string</source>\n        <translation>Cadena %q</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"308\"/>\n        <source>%Q string</source>\n        <translation>Cadena %Q</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"311\"/>\n        <source>%x string</source>\n        <translation>Cadena %x</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"314\"/>\n        <source>%r string</source>\n        <translation>Cadena %r</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"317\"/>\n        <source>%w string</source>\n        <translation>Cadena %w</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"320\"/>\n        <source>Demoted keyword</source>\n        <translation>Palabra clave degradada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"323\"/>\n        <source>stdin</source>\n        <translation>stdin</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"326\"/>\n        <source>stdout</source>\n        <translation>stdout</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"329\"/>\n        <source>stderr</source>\n        <translation>stderr</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSQL</name>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"259\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"268\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"271\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"277\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"286\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"289\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"262\"/>\n        <source>Comment line</source>\n        <translation>Línea de comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"265\"/>\n        <source>JavaDoc style comment</source>\n        <translation>Comentario de estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"274\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"280\"/>\n        <source>SQL*Plus keyword</source>\n        <translation>Palabra clave SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"283\"/>\n        <source>SQL*Plus prompt</source>\n        <translation>Prompt SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"292\"/>\n        <source>SQL*Plus comment</source>\n        <translation>Comentario SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"295\"/>\n        <source># comment line</source>\n        <translation># línea de comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword</source>\n        <translation>Palabra clave de Javadoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"301\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>Error en palabra clave de Javadoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"304\"/>\n        <source>User defined 1</source>\n        <translation>Definido por el usuario 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"307\"/>\n        <source>User defined 2</source>\n        <translation>Definido por el usuario 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"310\"/>\n        <source>User defined 3</source>\n        <translation>Definido por el usuario 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"313\"/>\n        <source>User defined 4</source>\n        <translation>Definido por el usuario 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"316\"/>\n        <source>Quoted identifier</source>\n        <translation>Identificador entrecomillado</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSpice</name>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"156\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"159\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"162\"/>\n        <source>Command</source>\n        <translation>Comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"165\"/>\n        <source>Function</source>\n        <translation>Función</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"168\"/>\n        <source>Parameter</source>\n        <translation>Parámetro</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"171\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"174\"/>\n        <source>Delimiter</source>\n        <translation>Delimitador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"177\"/>\n        <source>Value</source>\n        <translation>Valor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"180\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTCL</name>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"283\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"286\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"289\"/>\n        <source>Comment line</source>\n        <translation>Línea de comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"295\"/>\n        <source>Quoted keyword</source>\n        <translation>Palabra clave entrecomillada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"298\"/>\n        <source>Quoted string</source>\n        <translation>Cadena entrecomillada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"301\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"304\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"307\"/>\n        <source>Substitution</source>\n        <translation>Sustitución</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"310\"/>\n        <source>Brace substitution</source>\n        <translation>Sustitución de corchetes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"313\"/>\n        <source>Modifier</source>\n        <translation>Modificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"316\"/>\n        <source>Expand keyword</source>\n        <translation>Expandir palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"319\"/>\n        <source>TCL keyword</source>\n        <translation>Palabra clave TCL</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"322\"/>\n        <source>Tk keyword</source>\n        <translation>Palabra clave Tk</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"325\"/>\n        <source>iTCL keyword</source>\n        <translation>Palabra clave iTCL</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"328\"/>\n        <source>Tk command</source>\n        <translation>Comando Tk</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"331\"/>\n        <source>User defined 1</source>\n        <translation>Definido por el usuario 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"334\"/>\n        <source>User defined 2</source>\n        <translation>Definido por el usuario 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"337\"/>\n        <source>User defined 3</source>\n        <translation>Definido por el usuario 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"340\"/>\n        <source>User defined 4</source>\n        <translation>Definido por el usuario 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"343\"/>\n        <source>Comment box</source>\n        <translation>Caja de comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"346\"/>\n        <source>Comment block</source>\n        <translation>Bloque de comentario</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTeX</name>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"177\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"180\"/>\n        <source>Special</source>\n        <translation>Especial</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"183\"/>\n        <source>Group</source>\n        <translation>Grupo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"186\"/>\n        <source>Symbol</source>\n        <translation>Símbolo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"189\"/>\n        <source>Command</source>\n        <translation>Comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"192\"/>\n        <source>Text</source>\n        <translation>Texto</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVHDL</name>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"197\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"200\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"203\"/>\n        <source>Comment line</source>\n        <translation>Línea de comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"206\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"209\"/>\n        <source>String</source>\n        <translation>Cadena de caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"212\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"215\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"218\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"221\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"224\"/>\n        <source>Standard operator</source>\n        <translation>Operador estándar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"227\"/>\n        <source>Attribute</source>\n        <translation>Atributo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"230\"/>\n        <source>Standard function</source>\n        <translation>Función estándar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"233\"/>\n        <source>Standard package</source>\n        <translation>Paquete estándar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"236\"/>\n        <source>Standard type</source>\n        <translation>Tipo estándar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"239\"/>\n        <source>User defined</source>\n        <translation>Definido por el usuario</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVerilog</name>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"209\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"212\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"215\"/>\n        <source>Line comment</source>\n        <translation>Comentario de línea</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"218\"/>\n        <source>Bang comment</source>\n        <translation>Comentario&apos;Bang</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"221\"/>\n        <source>Number</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"224\"/>\n        <source>Primary keywords and identifiers</source>\n        <translation>Identificadores y palabras clave primarios</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"227\"/>\n        <source>String</source>\n        <translation>Cadena</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"230\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Palabras clave e identificadores secundarios</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"233\"/>\n        <source>System task</source>\n        <translation>Tarea de sistema</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"236\"/>\n        <source>Preprocessor block</source>\n        <translation>Bloque de preprocesador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"239\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"242\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"245\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"248\"/>\n        <source>User defined tasks and identifiers</source>\n        <translation>Tareas definidas por el usuario e identificadores</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerYAML</name>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"161\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"164\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"167\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"173\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"176\"/>\n        <source>Reference</source>\n        <translation>Referencia</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"179\"/>\n        <source>Document delimiter</source>\n        <translation>Delimitador de documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"182\"/>\n        <source>Text block marker</source>\n        <translation>Marcador de bloque de texto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"185\"/>\n        <source>Syntax error marker</source>\n        <translation>Marcador de error de sintaxis</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"188\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n</context>\n<context>\n    <name>QsciScintilla</name>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4359\"/>\n        <source>&amp;Undo</source>\n        <translation>&amp;Deshacer</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4363\"/>\n        <source>&amp;Redo</source>\n        <translation>&amp;Rehacer</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4369\"/>\n        <source>Cu&amp;t</source>\n        <translation>Cor&amp;tar</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4374\"/>\n        <source>&amp;Copy</source>\n        <translation>&amp;Copiar</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4380\"/>\n        <source>&amp;Paste</source>\n        <translation>&amp;Pegar</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4384\"/>\n        <source>Delete</source>\n        <translation>Borrar</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4391\"/>\n        <source>Select All</source>\n        <translation>Seleccionar todo</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscintilla_fr.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\">\n<context>\n    <name>QsciCommand</name>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"44\"/>\n        <source>Move down one line</source>\n        <translation>Déplacement d&apos;une ligne vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"54\"/>\n        <source>Extend selection down one line</source>\n        <translation>Extension de la sélection d&apos;une ligne vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"71\"/>\n        <source>Scroll view down one line</source>\n        <translation>Decendre la vue d&apos;une ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"64\"/>\n        <source>Extend rectangular selection down one line</source>\n        <translation>Extension de la sélection rectangulaire d&apos;une ligne vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"81\"/>\n        <source>Move up one line</source>\n        <translation>Déplacement d&apos;une ligne vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"91\"/>\n        <source>Extend selection up one line</source>\n        <translation>Extension de la sélection d&apos;une ligne vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"108\"/>\n        <source>Scroll view up one line</source>\n        <translation>Remonter la vue d&apos;une ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"101\"/>\n        <source>Extend rectangular selection up one line</source>\n        <translation>Extension de la sélection rectangulaire d&apos;une ligne vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"158\"/>\n        <source>Move up one paragraph</source>\n        <translation>Déplacement d&apos;un paragraphe vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"164\"/>\n        <source>Extend selection up one paragraph</source>\n        <translation>Extension de la sélection d&apos;un paragraphe vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"145\"/>\n        <source>Move down one paragraph</source>\n        <translation>Déplacement d&apos;un paragraphe vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"118\"/>\n        <source>Scroll to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"128\"/>\n        <source>Scroll to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"138\"/>\n        <source>Scroll vertically to centre current line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"151\"/>\n        <source>Extend selection down one paragraph</source>\n        <translation>Extension de la sélection d&apos;un paragraphe vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"175\"/>\n        <source>Move left one character</source>\n        <translation>Déplacement d&apos;un caractère vers la gauche</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"185\"/>\n        <source>Extend selection left one character</source>\n        <translation>Extension de la sélection d&apos;un caractère vers la gauche</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"239\"/>\n        <source>Move left one word</source>\n        <translation>Déplacement d&apos;un mot vers la gauche</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"249\"/>\n        <source>Extend selection left one word</source>\n        <translation>Extension de la sélection d&apos;un mot vers la gauche</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"196\"/>\n        <source>Extend rectangular selection left one character</source>\n        <translation>Extension de la sélection rectangulaire d&apos;un caractère vers la gauche</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"207\"/>\n        <source>Move right one character</source>\n        <translation>Déplacement d&apos;un caractère vers la droite</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"217\"/>\n        <source>Extend selection right one character</source>\n        <translation>Extension de la sélection d&apos;un caractère vers la droite</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"259\"/>\n        <source>Move right one word</source>\n        <translation>Déplacement d&apos;un mot vers la droite</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"265\"/>\n        <source>Extend selection right one word</source>\n        <translation>Extension de la sélection d&apos;un mot vers la droite</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"228\"/>\n        <source>Extend rectangular selection right one character</source>\n        <translation>Extension de la sélection rectangulaire d&apos;un caractère vers la droite</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"271\"/>\n        <source>Move to end of previous word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"277\"/>\n        <source>Extend selection to end of previous word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"288\"/>\n        <source>Move to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"298\"/>\n        <source>Extend selection to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"305\"/>\n        <source>Move left one word part</source>\n        <translation>Déplacement d&apos;une part de mot vers la gauche</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"311\"/>\n        <source>Extend selection left one word part</source>\n        <translation>Extension de la sélection d&apos;une part de mot vers la gauche</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"318\"/>\n        <source>Move right one word part</source>\n        <translation>Déplacement d&apos;une part de mot vers la droite</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"324\"/>\n        <source>Extend selection right one word part</source>\n        <translation>Extension de la sélection d&apos;une part de mot vers la droite</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"558\"/>\n        <source>Move up one page</source>\n        <translation>Déplacement d&apos;une page vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"568\"/>\n        <source>Extend selection up one page</source>\n        <translation>Extension de la sélection d&apos;une page vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"578\"/>\n        <source>Extend rectangular selection up one page</source>\n        <translation>Extension de la sélection rectangulaire d&apos;une page vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"593\"/>\n        <source>Move down one page</source>\n        <translation>Déplacement d&apos;une page vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"607\"/>\n        <source>Extend selection down one page</source>\n        <translation>Extension de la sélection d&apos;une page vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"621\"/>\n        <source>Extend rectangular selection down one page</source>\n        <translation>Extension de la sélection rectangulaire d&apos;une page vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"658\"/>\n        <source>Delete current character</source>\n        <translation>Effacement du caractère courant</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"788\"/>\n        <source>Cut selection</source>\n        <translation>Couper la sélection</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"687\"/>\n        <source>Delete word to right</source>\n        <translation>Suppression du mot de droite</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"335\"/>\n        <source>Move to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"345\"/>\n        <source>Extend selection to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"356\"/>\n        <source>Extend rectangular selection to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"367\"/>\n        <source>Move to start of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"377\"/>\n        <source>Extend selection to start of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"384\"/>\n        <source>Move to start of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"391\"/>\n        <source>Extend selection to start of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"402\"/>\n        <source>Move to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"413\"/>\n        <source>Extend selection to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"424\"/>\n        <source>Extend rectangular selection to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"431\"/>\n        <source>Move to first visible character of display in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"438\"/>\n        <source>Extend selection to first visible character in display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"449\"/>\n        <source>Move to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"459\"/>\n        <source>Extend selection to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"470\"/>\n        <source>Extend rectangular selection to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"481\"/>\n        <source>Move to end of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"491\"/>\n        <source>Extend selection to end of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"498\"/>\n        <source>Move to end of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"505\"/>\n        <source>Extend selection to end of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"516\"/>\n        <source>Move to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"526\"/>\n        <source>Extend selection to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"537\"/>\n        <source>Move to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"547\"/>\n        <source>Extend selection to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"628\"/>\n        <source>Stuttered move up one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"634\"/>\n        <source>Stuttered extend selection up one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"641\"/>\n        <source>Stuttered move down one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"647\"/>\n        <source>Stuttered extend selection down one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"674\"/>\n        <source>Delete previous character if not at start of line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"697\"/>\n        <source>Delete right to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"714\"/>\n        <source>Delete line to right</source>\n        <translation>Suppression de la partie droite de la ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"738\"/>\n        <source>Transpose current and previous lines</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"745\"/>\n        <source>Duplicate the current line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"751\"/>\n        <source>Select all</source>\n        <oldsource>Select document</oldsource>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"757\"/>\n        <source>Move selected lines up one line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"763\"/>\n        <source>Move selected lines down one line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"806\"/>\n        <source>Toggle insert/overtype</source>\n        <translation>Basculement Insertion /Ecrasement</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"800\"/>\n        <source>Paste</source>\n        <translation>Coller</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"794\"/>\n        <source>Copy selection</source>\n        <translation>Copier la sélection</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"812\"/>\n        <source>Insert newline</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"830\"/>\n        <source>De-indent one level</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"836\"/>\n        <source>Cancel</source>\n        <translation>Annuler</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"668\"/>\n        <source>Delete previous character</source>\n        <translation>Suppression du dernier caractère</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"681\"/>\n        <source>Delete word to left</source>\n        <translation>Suppression du mot de gauche</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"704\"/>\n        <source>Delete line to left</source>\n        <translation>Effacer la partie gauche de la ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"842\"/>\n        <source>Undo last command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"852\"/>\n        <source>Redo last command</source>\n        <translation>Refaire la dernière commande</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"824\"/>\n        <source>Indent one level</source>\n        <translation>Indentation d&apos;un niveau</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"858\"/>\n        <source>Zoom in</source>\n        <translation>Zoom avant</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"864\"/>\n        <source>Zoom out</source>\n        <translation>Zoom arrière</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"818\"/>\n        <source>Formfeed</source>\n        <translation>Chargement de la page</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"726\"/>\n        <source>Cut current line</source>\n        <translation>Couper la ligne courante</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"720\"/>\n        <source>Delete current line</source>\n        <translation>Suppression de la ligne courante</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"732\"/>\n        <source>Copy current line</source>\n        <translation>Copier la ligne courante</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"776\"/>\n        <source>Convert selection to lower case</source>\n        <translation>Conversion de la ligne courante en minuscules</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"782\"/>\n        <source>Convert selection to upper case</source>\n        <translation>Conversion de la ligne courante en majuscules</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"770\"/>\n        <source>Duplicate selection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerAVS</name>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"280\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"283\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"286\"/>\n        <source>Nested block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"289\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Commentaire de ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"301\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"304\"/>\n        <source>Triple double-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères HTML (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"307\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"310\"/>\n        <source>Filter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"313\"/>\n        <source>Plugin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"316\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"319\"/>\n        <source>Clip property</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"322\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBash</name>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"193\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"196\"/>\n        <source>Error</source>\n        <translation>Erreur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"199\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"202\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"205\"/>\n        <source>Keyword</source>\n        <translation>Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"208\"/>\n        <source>Double-quoted string</source>\n        <translation>Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"211\"/>\n        <source>Single-quoted string</source>\n        <translation>Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"214\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"217\"/>\n        <source>Identifier</source>\n        <translation>Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"220\"/>\n        <source>Scalar</source>\n        <translation>Scalaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"223\"/>\n        <source>Parameter expansion</source>\n        <translation>Extension de paramètre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"226\"/>\n        <source>Backticks</source>\n        <translation>Quotes inverses</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"229\"/>\n        <source>Here document delimiter</source>\n        <translation>Délimiteur de texte intégré (cat &lt;&lt;EOF....EOF)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"232\"/>\n        <source>Single-quoted here document</source>\n        <translation>Document intégré guillemets simples</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBatch</name>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"164\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"167\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation>Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"173\"/>\n        <source>Label</source>\n        <translation>Titre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"176\"/>\n        <source>Hide command character</source>\n        <translation>Cacher le caratère de commande</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"179\"/>\n        <source>External command</source>\n        <translation>Commande externe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"182\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"185\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCMake</name>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"181\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"184\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"187\"/>\n        <source>String</source>\n        <translation type=\"unfinished\">Chaîne de caractères</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"190\"/>\n        <source>Left quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"193\"/>\n        <source>Right quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"196\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"199\"/>\n        <source>Variable</source>\n        <translation type=\"unfinished\">Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"202\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Titre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"205\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"208\"/>\n        <source>WHILE block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"211\"/>\n        <source>FOREACH block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"214\"/>\n        <source>IF block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"217\"/>\n        <source>MACRO block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"220\"/>\n        <source>Variable within a string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"223\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCPP</name>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"340\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"343\"/>\n        <source>Inactive default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"346\"/>\n        <source>C comment</source>\n        <translation>Commentaire C</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"349\"/>\n        <source>Inactive C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"352\"/>\n        <source>C++ comment</source>\n        <translation>Commentaire C++</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"355\"/>\n        <source>Inactive C++ comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"358\"/>\n        <source>JavaDoc style C comment</source>\n        <translation>Commentaire C de style JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"361\"/>\n        <source>Inactive JavaDoc style C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"364\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"367\"/>\n        <source>Inactive number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"370\"/>\n        <source>Keyword</source>\n        <translation>Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"373\"/>\n        <source>Inactive keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"376\"/>\n        <source>Double-quoted string</source>\n        <translation>Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"379\"/>\n        <source>Inactive double-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"382\"/>\n        <source>Single-quoted string</source>\n        <translation>Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"385\"/>\n        <source>Inactive single-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"388\"/>\n        <source>IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"391\"/>\n        <source>Inactive IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"394\"/>\n        <source>Pre-processor block</source>\n        <translation>Instructions de pré-processing</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"397\"/>\n        <source>Inactive pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"400\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"403\"/>\n        <source>Inactive operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"406\"/>\n        <source>Identifier</source>\n        <translation>Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"409\"/>\n        <source>Inactive identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"412\"/>\n        <source>Unclosed string</source>\n        <translation>Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"415\"/>\n        <source>Inactive unclosed string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"418\"/>\n        <source>C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"421\"/>\n        <source>Inactive C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"424\"/>\n        <source>JavaScript regular expression</source>\n        <translation type=\"unfinished\">Expression régulière JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"427\"/>\n        <source>Inactive JavaScript regular expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"430\"/>\n        <source>JavaDoc style C++ comment</source>\n        <translation>Commentaire C++ de style JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"433\"/>\n        <source>Inactive JavaDoc style C++ comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"436\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Seconds mots-clés et identificateurs</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"439\"/>\n        <source>Inactive secondary keywords and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"442\"/>\n        <source>JavaDoc keyword</source>\n        <translation>Mot-clé JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"445\"/>\n        <source>Inactive JavaDoc keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"448\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>Erreur de mot-clé JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"451\"/>\n        <source>Inactive JavaDoc keyword error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"454\"/>\n        <source>Global classes and typedefs</source>\n        <translation>Classes globales et définitions de types</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"457\"/>\n        <source>Inactive global classes and typedefs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"460\"/>\n        <source>C++ raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"463\"/>\n        <source>Inactive C++ raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"466\"/>\n        <source>Vala triple-quoted verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"469\"/>\n        <source>Inactive Vala triple-quoted verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"472\"/>\n        <source>Pike hash-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"475\"/>\n        <source>Inactive Pike hash-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"478\"/>\n        <source>Pre-processor C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"481\"/>\n        <source>Inactive pre-processor C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"484\"/>\n        <source>JavaDoc style pre-processor comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"487\"/>\n        <source>Inactive JavaDoc style pre-processor comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSS</name>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"225\"/>\n        <source>Tag</source>\n        <translation>Balise</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"228\"/>\n        <source>Class selector</source>\n        <translation>Classe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"231\"/>\n        <source>Pseudo-class</source>\n        <translation>Pseudo-classe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"234\"/>\n        <source>Unknown pseudo-class</source>\n        <translation>Peudo-classe inconnue</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"237\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"240\"/>\n        <source>CSS1 property</source>\n        <translation>Propriété CSS1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"243\"/>\n        <source>Unknown property</source>\n        <translation>Propriété inconnue</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"246\"/>\n        <source>Value</source>\n        <translation>Valeur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"249\"/>\n        <source>ID selector</source>\n        <translation>ID</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"252\"/>\n        <source>Important</source>\n        <translation>Important</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"255\"/>\n        <source>@-rule</source>\n        <translation>règle-@</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"258\"/>\n        <source>Double-quoted string</source>\n        <translation>Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"261\"/>\n        <source>Single-quoted string</source>\n        <translation>Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"264\"/>\n        <source>CSS2 property</source>\n        <translation>Propriété CSS2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"267\"/>\n        <source>Attribute</source>\n        <translation>Attribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"270\"/>\n        <source>CSS3 property</source>\n        <translation type=\"unfinished\">Propriété CSS2 {3 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"273\"/>\n        <source>Pseudo-element</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"276\"/>\n        <source>Extended CSS property</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"279\"/>\n        <source>Extended pseudo-class</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"282\"/>\n        <source>Extended pseudo-element</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"285\"/>\n        <source>Media rule</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"288\"/>\n        <source>Variable</source>\n        <translation type=\"unfinished\">Variable</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSharp</name>\n    <message>\n        <location filename=\"qscilexercsharp.cpp\" line=\"95\"/>\n        <source>Verbatim string</source>\n        <translation>Chaine verbatim</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCoffeeScript</name>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"244\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"247\"/>\n        <source>C-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"250\"/>\n        <source>C++-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"253\"/>\n        <source>JavaDoc C-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"256\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"259\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"262\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"265\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"268\"/>\n        <source>IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"271\"/>\n        <source>Pre-processor block</source>\n        <translation type=\"unfinished\">Instructions de pré-processing</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"274\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"277\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"280\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"283\"/>\n        <source>C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"286\"/>\n        <source>Regular expression</source>\n        <translation type=\"unfinished\">Expression régulière</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"289\"/>\n        <source>JavaDoc C++-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"292\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation type=\"unfinished\">Seconds mots-clés et identificateurs</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"295\"/>\n        <source>JavaDoc keyword</source>\n        <translation type=\"unfinished\">Mot-clé JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword error</source>\n        <translation type=\"unfinished\">Erreur de mot-clé JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"301\"/>\n        <source>Global classes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"304\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"307\"/>\n        <source>Block regular expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"310\"/>\n        <source>Block regular expression comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerD</name>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"259\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"262\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Commentaire de ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"265\"/>\n        <source>DDoc style block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"268\"/>\n        <source>Nesting comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"271\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"274\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"277\"/>\n        <source>Secondary keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"280\"/>\n        <source>Documentation keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"283\"/>\n        <source>Type definition</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"286\"/>\n        <source>String</source>\n        <translation type=\"unfinished\">Chaîne de caractères</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"289\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"292\"/>\n        <source>Character</source>\n        <translation type=\"unfinished\">Caractère</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"301\"/>\n        <source>DDoc style line comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"304\"/>\n        <source>DDoc keyword</source>\n        <translation type=\"unfinished\">Mot-clé JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"307\"/>\n        <source>DDoc keyword error</source>\n        <translation type=\"unfinished\">Erreur de mot-clé JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"310\"/>\n        <source>Backquoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"313\"/>\n        <source>Raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"316\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Définition utilisateur 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"319\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Définition utilisateur 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"322\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Définition utilisateur 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerDiff</name>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"92\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"95\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"98\"/>\n        <source>Command</source>\n        <translation>Commande</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"101\"/>\n        <source>Header</source>\n        <translation>En-tête</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"104\"/>\n        <source>Position</source>\n        <translation>Position</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"107\"/>\n        <source>Removed line</source>\n        <translation>Ligne supprimée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"110\"/>\n        <source>Added line</source>\n        <translation>Ligne ajoutée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"113\"/>\n        <source>Changed line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerFortran77</name>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"176\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"179\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"182\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"185\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"188\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"191\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"194\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"197\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"200\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"203\"/>\n        <source>Intrinsic function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"206\"/>\n        <source>Extended function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"209\"/>\n        <source>Pre-processor block</source>\n        <translation type=\"unfinished\">Instructions de pré-processing</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"212\"/>\n        <source>Dotted operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"215\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Titre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"218\"/>\n        <source>Continuation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerHTML</name>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"553\"/>\n        <source>HTML default</source>\n        <translation>HTML par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"556\"/>\n        <source>Tag</source>\n        <translation>Balise</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"559\"/>\n        <source>Unknown tag</source>\n        <translation>Balise inconnue</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"562\"/>\n        <source>Attribute</source>\n        <translation>Attribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"565\"/>\n        <source>Unknown attribute</source>\n        <translation>Attribut inconnu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"568\"/>\n        <source>HTML number</source>\n        <translation>Nombre HTML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"571\"/>\n        <source>HTML double-quoted string</source>\n        <translation>Chaine de caractères HTML (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"574\"/>\n        <source>HTML single-quoted string</source>\n        <translation>Chaine de caractères HTML (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"577\"/>\n        <source>Other text in a tag</source>\n        <translation>Autre texte dans les balises</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"580\"/>\n        <source>HTML comment</source>\n        <translation>Commentaire HTML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"583\"/>\n        <source>Entity</source>\n        <translation>Entité</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"586\"/>\n        <source>End of a tag</source>\n        <translation>Balise fermante</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"589\"/>\n        <source>Start of an XML fragment</source>\n        <translation>Début de block XML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"592\"/>\n        <source>End of an XML fragment</source>\n        <translation>Fin de block XML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"595\"/>\n        <source>Script tag</source>\n        <translation>Balise de script</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"598\"/>\n        <source>Start of an ASP fragment with @</source>\n        <translation>Début de block ASP avec @</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"601\"/>\n        <source>Start of an ASP fragment</source>\n        <translation>Début de block ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"604\"/>\n        <source>CDATA</source>\n        <translation>CDATA</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"607\"/>\n        <source>Start of a PHP fragment</source>\n        <translation>Début de block PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"610\"/>\n        <source>Unquoted HTML value</source>\n        <translation>Valeur HTML sans guillemets</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"613\"/>\n        <source>ASP X-Code comment</source>\n        <translation>Commentaire X-Code ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"616\"/>\n        <source>SGML default</source>\n        <translation>SGML par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"619\"/>\n        <source>SGML command</source>\n        <translation>Commande SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"622\"/>\n        <source>First parameter of an SGML command</source>\n        <translation>Premier paramètre de commande SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"625\"/>\n        <source>SGML double-quoted string</source>\n        <translation>Chaine de caractères SGML (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"628\"/>\n        <source>SGML single-quoted string</source>\n        <translation>Chaine de caractères SGML (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"631\"/>\n        <source>SGML error</source>\n        <translation>Erreur SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"634\"/>\n        <source>SGML special entity</source>\n        <translation>Entité SGML spéciale</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"637\"/>\n        <source>SGML comment</source>\n        <translation>Commentaire SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"640\"/>\n        <source>First parameter comment of an SGML command</source>\n        <translation>Premier paramètre de commentaire de commande SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"643\"/>\n        <source>SGML block default</source>\n        <translation>Block SGML par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"646\"/>\n        <source>Start of a JavaScript fragment</source>\n        <translation>Début de block JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"649\"/>\n        <source>JavaScript default</source>\n        <translation>JavaScript par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"652\"/>\n        <source>JavaScript comment</source>\n        <translation>Commentaire JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"655\"/>\n        <source>JavaScript line comment</source>\n        <translation>Commentaire de ligne JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"658\"/>\n        <source>JavaDoc style JavaScript comment</source>\n        <translation>Commentaire JavaScript de style JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"661\"/>\n        <source>JavaScript number</source>\n        <translation>Nombre JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"664\"/>\n        <source>JavaScript word</source>\n        <translation>Mot JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"667\"/>\n        <source>JavaScript keyword</source>\n        <translation>Mot-clé JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"670\"/>\n        <source>JavaScript double-quoted string</source>\n        <translation>Chaine de caractères JavaScript (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"673\"/>\n        <source>JavaScript single-quoted string</source>\n        <translation>Chaine de caractères JavaScript (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"676\"/>\n        <source>JavaScript symbol</source>\n        <translation>Symbole JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"679\"/>\n        <source>JavaScript unclosed string</source>\n        <translation>Chaine de caractères JavaScript non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"682\"/>\n        <source>JavaScript regular expression</source>\n        <translation>Expression régulière JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"685\"/>\n        <source>Start of an ASP JavaScript fragment</source>\n        <translation>Début de block JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"688\"/>\n        <source>ASP JavaScript default</source>\n        <translation>JavaScript ASP par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"691\"/>\n        <source>ASP JavaScript comment</source>\n        <translation>Commentaire JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"694\"/>\n        <source>ASP JavaScript line comment</source>\n        <translation>Commentaire de ligne JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"697\"/>\n        <source>JavaDoc style ASP JavaScript comment</source>\n        <translation>Commentaire JavaScript ASP de style JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"700\"/>\n        <source>ASP JavaScript number</source>\n        <translation>Nombre JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"703\"/>\n        <source>ASP JavaScript word</source>\n        <translation>Mot JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"706\"/>\n        <source>ASP JavaScript keyword</source>\n        <translation>Mot-clé JavaScript ASP </translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"709\"/>\n        <source>ASP JavaScript double-quoted string</source>\n        <translation>Chaine de caractères JavaScript ASP (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"712\"/>\n        <source>ASP JavaScript single-quoted string</source>\n        <translation>Chaine de caractères JavaScript ASP (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"715\"/>\n        <source>ASP JavaScript symbol</source>\n        <translation>Symbole JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"718\"/>\n        <source>ASP JavaScript unclosed string</source>\n        <translation>Chaine de caractères JavaScript ASP non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"721\"/>\n        <source>ASP JavaScript regular expression</source>\n        <translation>Expression régulière JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"724\"/>\n        <source>Start of a VBScript fragment</source>\n        <translation>Début de block VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"727\"/>\n        <source>VBScript default</source>\n        <translation>VBScript par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"730\"/>\n        <source>VBScript comment</source>\n        <translation>Commentaire VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"733\"/>\n        <source>VBScript number</source>\n        <translation>Nombre VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"736\"/>\n        <source>VBScript keyword</source>\n        <translation>Mot-clé VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"739\"/>\n        <source>VBScript string</source>\n        <translation>Chaine de caractères VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"742\"/>\n        <source>VBScript identifier</source>\n        <translation>Identificateur VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"745\"/>\n        <source>VBScript unclosed string</source>\n        <translation>Chaine de caractères VBScript non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"748\"/>\n        <source>Start of an ASP VBScript fragment</source>\n        <translation>Début de block VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"751\"/>\n        <source>ASP VBScript default</source>\n        <translation>VBScript ASP par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"754\"/>\n        <source>ASP VBScript comment</source>\n        <translation>Commentaire VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"757\"/>\n        <source>ASP VBScript number</source>\n        <translation>Nombre VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"760\"/>\n        <source>ASP VBScript keyword</source>\n        <translation>Mot-clé VBScript ASP </translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"763\"/>\n        <source>ASP VBScript string</source>\n        <translation>Chaine de caractères VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"766\"/>\n        <source>ASP VBScript identifier</source>\n        <translation>Identificateur VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"769\"/>\n        <source>ASP VBScript unclosed string</source>\n        <translation>Chaine de caractères VBScript ASP non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"772\"/>\n        <source>Start of a Python fragment</source>\n        <translation>Début de block Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"775\"/>\n        <source>Python default</source>\n        <translation>Python par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"778\"/>\n        <source>Python comment</source>\n        <translation>Commentaire Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"781\"/>\n        <source>Python number</source>\n        <translation>Nombre Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"784\"/>\n        <source>Python double-quoted string</source>\n        <translation>Chaine de caractères Python (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"787\"/>\n        <source>Python single-quoted string</source>\n        <translation>Chaine de caractères Python (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"790\"/>\n        <source>Python keyword</source>\n        <translation>Mot-clé Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"793\"/>\n        <source>Python triple double-quoted string</source>\n        <translation>Chaine de caractères Python (triples guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"796\"/>\n        <source>Python triple single-quoted string</source>\n        <translation>Chaine de caractères Python (triples guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"799\"/>\n        <source>Python class name</source>\n        <translation>Nom de classe Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"802\"/>\n        <source>Python function or method name</source>\n        <translation>Méthode ou fonction Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"805\"/>\n        <source>Python operator</source>\n        <translation>Opérateur Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"808\"/>\n        <source>Python identifier</source>\n        <translation>Identificateur Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"811\"/>\n        <source>Start of an ASP Python fragment</source>\n        <translation>Début de block Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"814\"/>\n        <source>ASP Python default</source>\n        <translation>Python ASP par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"817\"/>\n        <source>ASP Python comment</source>\n        <translation>Commentaire Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"820\"/>\n        <source>ASP Python number</source>\n        <translation>Nombre Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"823\"/>\n        <source>ASP Python double-quoted string</source>\n        <translation>Chaine de caractères Python ASP (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"826\"/>\n        <source>ASP Python single-quoted string</source>\n        <translation>Chaine de caractères Python ASP (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"829\"/>\n        <source>ASP Python keyword</source>\n        <translation>Mot-clé Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"832\"/>\n        <source>ASP Python triple double-quoted string</source>\n        <translation>Chaine de caractères Python ASP (triples guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"835\"/>\n        <source>ASP Python triple single-quoted string</source>\n        <translation>Chaine de caractères Python ASP (triples guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"838\"/>\n        <source>ASP Python class name</source>\n        <translation>Nom de classe Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"841\"/>\n        <source>ASP Python function or method name</source>\n        <translation>Méthode ou fonction Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"844\"/>\n        <source>ASP Python operator</source>\n        <translation>Opérateur Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"847\"/>\n        <source>ASP Python identifier</source>\n        <translation>Identificateur Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"850\"/>\n        <source>PHP default</source>\n        <translation>PHP par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"853\"/>\n        <source>PHP double-quoted string</source>\n        <translation>Chaine de caractères PHP (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"856\"/>\n        <source>PHP single-quoted string</source>\n        <translation>Chaine de caractères PHP (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"859\"/>\n        <source>PHP keyword</source>\n        <translation>Mot-clé PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"862\"/>\n        <source>PHP number</source>\n        <translation>Nombre PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"865\"/>\n        <source>PHP variable</source>\n        <translation>Variable PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"868\"/>\n        <source>PHP comment</source>\n        <translation>Commentaire PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"871\"/>\n        <source>PHP line comment</source>\n        <translation>Commentaire de ligne PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"874\"/>\n        <source>PHP double-quoted variable</source>\n        <translation>Variable PHP (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"877\"/>\n        <source>PHP operator</source>\n        <translation>Opérateur PHP</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerIDL</name>\n    <message>\n        <location filename=\"qscilexeridl.cpp\" line=\"87\"/>\n        <source>UUID</source>\n        <translation>UUID</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerJavaScript</name>\n    <message>\n        <location filename=\"qscilexerjavascript.cpp\" line=\"97\"/>\n        <source>Regular expression</source>\n        <translation>Expression régulière</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerLua</name>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"218\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"221\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"224\"/>\n        <source>Line comment</source>\n        <translation>Commentaire de ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"227\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"230\"/>\n        <source>Keyword</source>\n        <translation>Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"233\"/>\n        <source>String</source>\n        <translation>Chaîne de caractères</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"236\"/>\n        <source>Character</source>\n        <translation>Caractère</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"239\"/>\n        <source>Literal string</source>\n        <translation>Chaîne littérale</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"242\"/>\n        <source>Preprocessor</source>\n        <translation>Préprocessing</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"245\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"248\"/>\n        <source>Identifier</source>\n        <translation>Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"251\"/>\n        <source>Unclosed string</source>\n        <translation>Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"254\"/>\n        <source>Basic functions</source>\n        <translation>Fonctions de base</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"257\"/>\n        <source>String, table and maths functions</source>\n        <translation>Fonctions sur les chaines, tables et fonctions math</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"260\"/>\n        <source>Coroutines, i/o and system facilities</source>\n        <translation>Coroutines, i/o et fonctions système</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"263\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Définition utilisateur 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"266\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Définition utilisateur 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"269\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Définition utilisateur 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"272\"/>\n        <source>User defined 4</source>\n        <translation type=\"unfinished\">Définition utilisateur 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"275\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Titre</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMakefile</name>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"116\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"119\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"122\"/>\n        <source>Preprocessor</source>\n        <translation>Préprocessing</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"125\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"128\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"131\"/>\n        <source>Target</source>\n        <translation>Cible</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"134\"/>\n        <source>Error</source>\n        <translation>Erreur</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMatlab</name>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"123\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"126\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"129\"/>\n        <source>Command</source>\n        <translation type=\"unfinished\">Commande</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"132\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"135\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"138\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"141\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"144\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"147\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères (guillemets doubles)</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPO</name>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"90\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"93\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"96\"/>\n        <source>Message identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"99\"/>\n        <source>Message identifier text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"102\"/>\n        <source>Message string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"105\"/>\n        <source>Message string text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"108\"/>\n        <source>Message context</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"111\"/>\n        <source>Message context text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"114\"/>\n        <source>Fuzzy flag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"117\"/>\n        <source>Programmer comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"120\"/>\n        <source>Reference</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"123\"/>\n        <source>Flags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"126\"/>\n        <source>Message identifier text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"129\"/>\n        <source>Message string text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"132\"/>\n        <source>Message context text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPOV</name>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"267\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"270\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"273\"/>\n        <source>Comment line</source>\n        <translation>Ligne commentée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"276\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"279\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"282\"/>\n        <source>Identifier</source>\n        <translation>Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"285\"/>\n        <source>String</source>\n        <translation>Chaîne de caractères</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"288\"/>\n        <source>Unclosed string</source>\n        <translation>Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"291\"/>\n        <source>Directive</source>\n        <translation>Directive</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"294\"/>\n        <source>Bad directive</source>\n        <translation>Mauvaise directive</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"297\"/>\n        <source>Objects, CSG and appearance</source>\n        <translation>Objets, CSG et apparence</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"300\"/>\n        <source>Types, modifiers and items</source>\n        <translation>Types, modifieurs et éléments</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"303\"/>\n        <source>Predefined identifiers</source>\n        <translation>Identifiants prédéfinis</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"306\"/>\n        <source>Predefined functions</source>\n        <translation>Fonctions prédéfinies</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"309\"/>\n        <source>User defined 1</source>\n        <translation>Définition utilisateur 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"312\"/>\n        <source>User defined 2</source>\n        <translation>Définition utilisateur 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"315\"/>\n        <source>User defined 3</source>\n        <translation>Définition utilisateur 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPascal</name>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"246\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"258\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Commentaire de ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"267\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"273\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"276\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"285\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"249\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"252\"/>\n        <source>&apos;{ ... }&apos; style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"255\"/>\n        <source>&apos;(* ... *)&apos; style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"261\"/>\n        <source>&apos;{$ ... }&apos; style pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"264\"/>\n        <source>&apos;(*$ ... *)&apos; style pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"270\"/>\n        <source>Hexadecimal number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"279\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"282\"/>\n        <source>Character</source>\n        <translation type=\"unfinished\">Caractère</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"288\"/>\n        <source>Inline asm</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPerl</name>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"318\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"321\"/>\n        <source>Error</source>\n        <translation>Erreur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"324\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"327\"/>\n        <source>POD</source>\n        <translation>POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"330\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"333\"/>\n        <source>Keyword</source>\n        <translation>Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"336\"/>\n        <source>Double-quoted string</source>\n        <translation>Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"339\"/>\n        <source>Single-quoted string</source>\n        <translation>Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"342\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"345\"/>\n        <source>Identifier</source>\n        <translation>Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"348\"/>\n        <source>Scalar</source>\n        <translation>Scalaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"351\"/>\n        <source>Array</source>\n        <translation>Tableau</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"354\"/>\n        <source>Hash</source>\n        <translation>Hashage</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"357\"/>\n        <source>Symbol table</source>\n        <translation>Table de symboles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"360\"/>\n        <source>Regular expression</source>\n        <translation>Expression régulière</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"363\"/>\n        <source>Substitution</source>\n        <translation>Substitution</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"366\"/>\n        <source>Backticks</source>\n        <translation>Quotes inverses</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"369\"/>\n        <source>Data section</source>\n        <translation>Section de données</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"372\"/>\n        <source>Here document delimiter</source>\n        <translation>Délimiteur de texte intégré (cat &lt;&lt;EOF....EOF)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"375\"/>\n        <source>Single-quoted here document</source>\n        <translation>Document intégré guillemets simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"378\"/>\n        <source>Double-quoted here document</source>\n        <translation>Document intégré guillemets doubles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"381\"/>\n        <source>Backtick here document</source>\n        <translation>Document intégré quotes inverses</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"384\"/>\n        <source>Quoted string (q)</source>\n        <translation>Chaine quotée (q)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"387\"/>\n        <source>Quoted string (qq)</source>\n        <translation>Chaine quotée (qq)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"390\"/>\n        <source>Quoted string (qx)</source>\n        <translation>Chaine quotée (qx)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"393\"/>\n        <source>Quoted string (qr)</source>\n        <translation>Chaine quotée (qr)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"396\"/>\n        <source>Quoted string (qw)</source>\n        <translation>Chaine quotée (qw)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"399\"/>\n        <source>POD verbatim</source>\n        <translation>POD verbatim</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"402\"/>\n        <source>Subroutine prototype</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"405\"/>\n        <source>Format identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"408\"/>\n        <source>Format body</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"411\"/>\n        <source>Double-quoted string (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"414\"/>\n        <source>Translation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"417\"/>\n        <source>Regular expression (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"420\"/>\n        <source>Substitution (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"423\"/>\n        <source>Backticks (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"426\"/>\n        <source>Double-quoted here document (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"429\"/>\n        <source>Backtick here document (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"432\"/>\n        <source>Quoted string (qq, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"435\"/>\n        <source>Quoted string (qx, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"438\"/>\n        <source>Quoted string (qr, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPostScript</name>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"249\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"252\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"255\"/>\n        <source>DSC comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"258\"/>\n        <source>DSC comment value</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"261\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"264\"/>\n        <source>Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"267\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"270\"/>\n        <source>Literal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"273\"/>\n        <source>Immediately evaluated literal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"276\"/>\n        <source>Array parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"279\"/>\n        <source>Dictionary parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"282\"/>\n        <source>Procedure parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"285\"/>\n        <source>Text</source>\n        <translation type=\"unfinished\">Texte</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"288\"/>\n        <source>Hexadecimal string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"291\"/>\n        <source>Base85 string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"294\"/>\n        <source>Bad string character</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerProperties</name>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"111\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"114\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"117\"/>\n        <source>Section</source>\n        <translation>Section</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"120\"/>\n        <source>Assignment</source>\n        <translation>Affectation</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"123\"/>\n        <source>Default value</source>\n        <translation>Valeur par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"126\"/>\n        <source>Key</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPython</name>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"225\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"228\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"231\"/>\n        <source>Double-quoted string</source>\n        <translation>Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"234\"/>\n        <source>Single-quoted string</source>\n        <translation>Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"237\"/>\n        <source>Keyword</source>\n        <translation>Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"240\"/>\n        <source>Triple single-quoted string</source>\n        <translation>Chaine de caractères HTML (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"243\"/>\n        <source>Triple double-quoted string</source>\n        <translation>Chaine de caractères HTML (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"246\"/>\n        <source>Class name</source>\n        <translation>Nom de classe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"249\"/>\n        <source>Function or method name</source>\n        <translation>Nom de méthode ou de fonction</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"252\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"255\"/>\n        <source>Identifier</source>\n        <translation>Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"258\"/>\n        <source>Comment block</source>\n        <translation>Block de commentaires</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"261\"/>\n        <source>Unclosed string</source>\n        <translation>Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"264\"/>\n        <source>Highlighted identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"267\"/>\n        <source>Decorator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerRuby</name>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"239\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"245\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"251\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"257\"/>\n        <source>Double-quoted string</source>\n        <translation>Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"260\"/>\n        <source>Single-quoted string</source>\n        <translation>Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"254\"/>\n        <source>Keyword</source>\n        <translation>Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"263\"/>\n        <source>Class name</source>\n        <translation>Nom de classe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"266\"/>\n        <source>Function or method name</source>\n        <translation>Nom de méthode ou de fonction</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"269\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"272\"/>\n        <source>Identifier</source>\n        <translation>Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"242\"/>\n        <source>Error</source>\n        <translation type=\"unfinished\">Erreur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"248\"/>\n        <source>POD</source>\n        <translation type=\"unfinished\">POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"275\"/>\n        <source>Regular expression</source>\n        <translation type=\"unfinished\">Expression régulière</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"278\"/>\n        <source>Global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"281\"/>\n        <source>Symbol</source>\n        <translation type=\"unfinished\">Symbole</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"284\"/>\n        <source>Module name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"287\"/>\n        <source>Instance variable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"290\"/>\n        <source>Class variable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"293\"/>\n        <source>Backticks</source>\n        <translation type=\"unfinished\">Quotes inverses</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"296\"/>\n        <source>Data section</source>\n        <translation type=\"unfinished\">Section de données</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"299\"/>\n        <source>Here document delimiter</source>\n        <translation type=\"unfinished\">Délimiteur de texte intégré (cat &lt;&lt;EOF....EOF)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"302\"/>\n        <source>Here document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"305\"/>\n        <source>%q string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"308\"/>\n        <source>%Q string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"311\"/>\n        <source>%x string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"314\"/>\n        <source>%r string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"317\"/>\n        <source>%w string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"320\"/>\n        <source>Demoted keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"323\"/>\n        <source>stdin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"326\"/>\n        <source>stdout</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"329\"/>\n        <source>stderr</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSQL</name>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"259\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"268\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"271\"/>\n        <source>Keyword</source>\n        <translation>Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"277\"/>\n        <source>Single-quoted string</source>\n        <translation>Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"286\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"289\"/>\n        <source>Identifier</source>\n        <translation>Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"262\"/>\n        <source>Comment line</source>\n        <translation>Ligne commentée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"265\"/>\n        <source>JavaDoc style comment</source>\n        <translation>Commentaire style JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"274\"/>\n        <source>Double-quoted string</source>\n        <translation>Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"280\"/>\n        <source>SQL*Plus keyword</source>\n        <translation>Mot-clé SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"283\"/>\n        <source>SQL*Plus prompt</source>\n        <translation>Prompt SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"292\"/>\n        <source>SQL*Plus comment</source>\n        <translation>Commentaire SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"295\"/>\n        <source># comment line</source>\n        <translation># Ligne commentée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword</source>\n        <translation>Mot-clé JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"301\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>Erreur de mot-clé JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"304\"/>\n        <source>User defined 1</source>\n        <translation>Définition utilisateur 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"307\"/>\n        <source>User defined 2</source>\n        <translation>Définition utilisateur 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"310\"/>\n        <source>User defined 3</source>\n        <translation>Définition utilisateur 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"313\"/>\n        <source>User defined 4</source>\n        <translation>Définition utilisateur 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"316\"/>\n        <source>Quoted identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSpice</name>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"156\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"159\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"162\"/>\n        <source>Command</source>\n        <translation type=\"unfinished\">Commande</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"165\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"168\"/>\n        <source>Parameter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"171\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"174\"/>\n        <source>Delimiter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"177\"/>\n        <source>Value</source>\n        <translation type=\"unfinished\">Valeur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"180\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTCL</name>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"283\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"286\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"289\"/>\n        <source>Comment line</source>\n        <translation type=\"unfinished\">Ligne commentée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"295\"/>\n        <source>Quoted keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"298\"/>\n        <source>Quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"301\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"304\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"307\"/>\n        <source>Substitution</source>\n        <translation type=\"unfinished\">Substitution</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"310\"/>\n        <source>Brace substitution</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"313\"/>\n        <source>Modifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"316\"/>\n        <source>Expand keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"319\"/>\n        <source>TCL keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"322\"/>\n        <source>Tk keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"325\"/>\n        <source>iTCL keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"328\"/>\n        <source>Tk command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"331\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Définition utilisateur 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"334\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Définition utilisateur 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"337\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Définition utilisateur 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"340\"/>\n        <source>User defined 4</source>\n        <translation type=\"unfinished\">Définition utilisateur 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"343\"/>\n        <source>Comment box</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"346\"/>\n        <source>Comment block</source>\n        <translation type=\"unfinished\">Block de commentaires</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTeX</name>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"177\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"180\"/>\n        <source>Special</source>\n        <translation>Spécial</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"183\"/>\n        <source>Group</source>\n        <translation>Groupe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"186\"/>\n        <source>Symbol</source>\n        <translation>Symbole</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"189\"/>\n        <source>Command</source>\n        <translation>Commande</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"192\"/>\n        <source>Text</source>\n        <translation>Texte</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVHDL</name>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"197\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"200\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"203\"/>\n        <source>Comment line</source>\n        <translation type=\"unfinished\">Ligne commentée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"206\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"209\"/>\n        <source>String</source>\n        <translation type=\"unfinished\">Chaîne de caractères</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"212\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"215\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"218\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"221\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"224\"/>\n        <source>Standard operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"227\"/>\n        <source>Attribute</source>\n        <translation type=\"unfinished\">Attribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"230\"/>\n        <source>Standard function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"233\"/>\n        <source>Standard package</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"236\"/>\n        <source>Standard type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"239\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVerilog</name>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"209\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"212\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"215\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Commentaire de ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"218\"/>\n        <source>Bang comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"221\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"224\"/>\n        <source>Primary keywords and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"227\"/>\n        <source>String</source>\n        <translation type=\"unfinished\">Chaîne de caractères</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"230\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation type=\"unfinished\">Seconds mots-clés et identificateurs</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"233\"/>\n        <source>System task</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"236\"/>\n        <source>Preprocessor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"239\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"242\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"245\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"248\"/>\n        <source>User defined tasks and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerYAML</name>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"161\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"164\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"167\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"173\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"176\"/>\n        <source>Reference</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"179\"/>\n        <source>Document delimiter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"182\"/>\n        <source>Text block marker</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"185\"/>\n        <source>Syntax error marker</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"188\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n</context>\n<context>\n    <name>QsciScintilla</name>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4359\"/>\n        <source>&amp;Undo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4363\"/>\n        <source>&amp;Redo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4369\"/>\n        <source>Cu&amp;t</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4374\"/>\n        <source>&amp;Copy</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4380\"/>\n        <source>&amp;Paste</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4384\"/>\n        <source>Delete</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4391\"/>\n        <source>Select All</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscintilla_pt_br.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\">\n<context>\n    <name>QsciCommand</name>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"44\"/>\n        <source>Move down one line</source>\n        <translation>Mover uma linha para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"54\"/>\n        <source>Extend selection down one line</source>\n        <translation>Extender a seleção uma linha para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"71\"/>\n        <source>Scroll view down one line</source>\n        <translation>Descer a visão uma linha para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"64\"/>\n        <source>Extend rectangular selection down one line</source>\n        <translation>Extender a seleção retangular uma linha para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"81\"/>\n        <source>Move up one line</source>\n        <translation>Mover uma linha para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"91\"/>\n        <source>Extend selection up one line</source>\n        <translation>Extender a seleção uma linha para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"108\"/>\n        <source>Scroll view up one line</source>\n        <translation>Subir a visão uma linha para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"101\"/>\n        <source>Extend rectangular selection up one line</source>\n        <translation>Extender a seleção retangular uma linha para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"158\"/>\n        <source>Move up one paragraph</source>\n        <translation>Mover um paragrafo para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"164\"/>\n        <source>Extend selection up one paragraph</source>\n        <translation>Extender a seleção um paragrafo para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"145\"/>\n        <source>Move down one paragraph</source>\n        <translation>Mover um paragrafo para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"118\"/>\n        <source>Scroll to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"128\"/>\n        <source>Scroll to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"138\"/>\n        <source>Scroll vertically to centre current line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"151\"/>\n        <source>Extend selection down one paragraph</source>\n        <translation>Extender a seleção  um paragrafo para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"175\"/>\n        <source>Move left one character</source>\n        <translation>Mover um caractere para a esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"185\"/>\n        <source>Extend selection left one character</source>\n        <translation>Extender a seleção um caractere para esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"239\"/>\n        <source>Move left one word</source>\n        <translation>Mover uma palavra para esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"249\"/>\n        <source>Extend selection left one word</source>\n        <translation>Extender a seleção uma palavra para esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"196\"/>\n        <source>Extend rectangular selection left one character</source>\n        <translation>Extender a seleção retangular um caractere para esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"207\"/>\n        <source>Move right one character</source>\n        <translation>Mover um caractere para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"217\"/>\n        <source>Extend selection right one character</source>\n        <translation>Extender a seleção um caractere para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"259\"/>\n        <source>Move right one word</source>\n        <translation>Mover uma palavra para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"265\"/>\n        <source>Extend selection right one word</source>\n        <translation>Extender a seleção uma palavra para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"228\"/>\n        <source>Extend rectangular selection right one character</source>\n        <translation>Extender a seleção retangular um caractere para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"271\"/>\n        <source>Move to end of previous word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"277\"/>\n        <source>Extend selection to end of previous word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"288\"/>\n        <source>Move to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"298\"/>\n        <source>Extend selection to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"305\"/>\n        <source>Move left one word part</source>\n        <translation>Mover uma parte da palavra para esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"311\"/>\n        <source>Extend selection left one word part</source>\n        <translation>Extender a seleção uma parte de palavra para esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"318\"/>\n        <source>Move right one word part</source>\n        <translation>Mover uma parte da palavra para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"324\"/>\n        <source>Extend selection right one word part</source>\n        <translation>Extender a seleção uma parte de palavra para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"558\"/>\n        <source>Move up one page</source>\n        <translation>Mover uma página para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"568\"/>\n        <source>Extend selection up one page</source>\n        <translation>Extender a seleção uma página para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"578\"/>\n        <source>Extend rectangular selection up one page</source>\n        <translation>Extender a seleção retangular uma página para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"593\"/>\n        <source>Move down one page</source>\n        <translation>Mover uma página para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"607\"/>\n        <source>Extend selection down one page</source>\n        <translation>Extender a seleção uma página para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"621\"/>\n        <source>Extend rectangular selection down one page</source>\n        <translation>Extender a seleção retangular uma página para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"658\"/>\n        <source>Delete current character</source>\n        <translation>Excluir caractere atual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"788\"/>\n        <source>Cut selection</source>\n        <translation>Recortar seleção</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"687\"/>\n        <source>Delete word to right</source>\n        <translation>Excluir palavra para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"335\"/>\n        <source>Move to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"345\"/>\n        <source>Extend selection to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"356\"/>\n        <source>Extend rectangular selection to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"367\"/>\n        <source>Move to start of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"377\"/>\n        <source>Extend selection to start of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"384\"/>\n        <source>Move to start of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"391\"/>\n        <source>Extend selection to start of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"402\"/>\n        <source>Move to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"413\"/>\n        <source>Extend selection to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"424\"/>\n        <source>Extend rectangular selection to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"431\"/>\n        <source>Move to first visible character of display in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"438\"/>\n        <source>Extend selection to first visible character in display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"449\"/>\n        <source>Move to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"459\"/>\n        <source>Extend selection to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"470\"/>\n        <source>Extend rectangular selection to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"481\"/>\n        <source>Move to end of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"491\"/>\n        <source>Extend selection to end of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"498\"/>\n        <source>Move to end of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"505\"/>\n        <source>Extend selection to end of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"516\"/>\n        <source>Move to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"526\"/>\n        <source>Extend selection to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"537\"/>\n        <source>Move to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"547\"/>\n        <source>Extend selection to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"628\"/>\n        <source>Stuttered move up one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"634\"/>\n        <source>Stuttered extend selection up one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"641\"/>\n        <source>Stuttered move down one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"647\"/>\n        <source>Stuttered extend selection down one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"674\"/>\n        <source>Delete previous character if not at start of line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"697\"/>\n        <source>Delete right to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"714\"/>\n        <source>Delete line to right</source>\n        <translation>Excluir linha para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"738\"/>\n        <source>Transpose current and previous lines</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"745\"/>\n        <source>Duplicate the current line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"751\"/>\n        <source>Select all</source>\n        <oldsource>Select document</oldsource>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"757\"/>\n        <source>Move selected lines up one line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"763\"/>\n        <source>Move selected lines down one line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"806\"/>\n        <source>Toggle insert/overtype</source>\n        <translation>Alternar entre modo de inserir/sobreescrever</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"800\"/>\n        <source>Paste</source>\n        <translation>Copiar</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"794\"/>\n        <source>Copy selection</source>\n        <translation>Copiar seleção</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"812\"/>\n        <source>Insert newline</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"830\"/>\n        <source>De-indent one level</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"836\"/>\n        <source>Cancel</source>\n        <translation>Cancelar</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"668\"/>\n        <source>Delete previous character</source>\n        <translation>Excluir caractere anterior</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"681\"/>\n        <source>Delete word to left</source>\n        <translation>Excluir palavra a esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"704\"/>\n        <source>Delete line to left</source>\n        <translation>Excluir linha a esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"842\"/>\n        <source>Undo last command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"852\"/>\n        <source>Redo last command</source>\n        <translation>Refazer último comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"824\"/>\n        <source>Indent one level</source>\n        <translation>Indentar um nível</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"858\"/>\n        <source>Zoom in</source>\n        <translation>Aumentar zoom</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"864\"/>\n        <source>Zoom out</source>\n        <translation>Diminuir zoom</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"818\"/>\n        <source>Formfeed</source>\n        <translation>Alimentação da Página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"726\"/>\n        <source>Cut current line</source>\n        <translation>Configurar linha atual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"720\"/>\n        <source>Delete current line</source>\n        <translation>Excluir linha atual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"732\"/>\n        <source>Copy current line</source>\n        <translation>Copiar linha atual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"776\"/>\n        <source>Convert selection to lower case</source>\n        <translation>Converter a seleção para minúscula</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"782\"/>\n        <source>Convert selection to upper case</source>\n        <translation>Converter a seleção para maiúscula</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"770\"/>\n        <source>Duplicate selection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerAVS</name>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"280\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"283\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"286\"/>\n        <source>Nested block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"289\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Comentar Linha</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"301\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"304\"/>\n        <source>Triple double-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por três aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"307\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"310\"/>\n        <source>Filter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"313\"/>\n        <source>Plugin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"316\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"319\"/>\n        <source>Clip property</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"322\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBash</name>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"193\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"196\"/>\n        <source>Error</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"199\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"202\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"205\"/>\n        <source>Keyword</source>\n        <translation>Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"208\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"211\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"214\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"217\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"220\"/>\n        <source>Scalar</source>\n        <translation>Escalar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"223\"/>\n        <source>Parameter expansion</source>\n        <translation>Parâmetro de Expansão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"226\"/>\n        <source>Backticks</source>\n        <translation>Aspas Invertidas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"229\"/>\n        <source>Here document delimiter</source>\n        <translation>Delimitador de &quot;here documents&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"232\"/>\n        <source>Single-quoted here document</source>\n        <translation>&quot;here document&quot; envolvido por aspas simples</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBatch</name>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"164\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"167\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation>Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"173\"/>\n        <source>Label</source>\n        <translation>Rótulo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"176\"/>\n        <source>Hide command character</source>\n        <translation>Esconder caractere de comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"179\"/>\n        <source>External command</source>\n        <translation>Comando externo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"182\"/>\n        <source>Variable</source>\n        <translation>Variável</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"185\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCMake</name>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"181\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"184\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"187\"/>\n        <source>String</source>\n        <translation type=\"unfinished\">Cadeia de Caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"190\"/>\n        <source>Left quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"193\"/>\n        <source>Right quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"196\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"199\"/>\n        <source>Variable</source>\n        <translation type=\"unfinished\">Variável</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"202\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Rótulo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"205\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"208\"/>\n        <source>WHILE block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"211\"/>\n        <source>FOREACH block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"214\"/>\n        <source>IF block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"217\"/>\n        <source>MACRO block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"220\"/>\n        <source>Variable within a string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"223\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCPP</name>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"340\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"343\"/>\n        <source>Inactive default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"346\"/>\n        <source>C comment</source>\n        <translation>Comentário C</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"349\"/>\n        <source>Inactive C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"352\"/>\n        <source>C++ comment</source>\n        <translation>Comentário C++</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"355\"/>\n        <source>Inactive C++ comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"358\"/>\n        <source>JavaDoc style C comment</source>\n        <translation>Comentário JavaDoc estilo C</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"361\"/>\n        <source>Inactive JavaDoc style C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"364\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"367\"/>\n        <source>Inactive number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"370\"/>\n        <source>Keyword</source>\n        <translation>Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"373\"/>\n        <source>Inactive keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"376\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"379\"/>\n        <source>Inactive double-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"382\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"385\"/>\n        <source>Inactive single-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"388\"/>\n        <source>IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"391\"/>\n        <source>Inactive IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"394\"/>\n        <source>Pre-processor block</source>\n        <translation>Instruções de pré-processamento</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"397\"/>\n        <source>Inactive pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"400\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"403\"/>\n        <source>Inactive operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"406\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"409\"/>\n        <source>Inactive identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"412\"/>\n        <source>Unclosed string</source>\n        <translation>Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"415\"/>\n        <source>Inactive unclosed string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"418\"/>\n        <source>C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"421\"/>\n        <source>Inactive C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"424\"/>\n        <source>JavaScript regular expression</source>\n        <translation type=\"unfinished\">Expressão regular JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"427\"/>\n        <source>Inactive JavaScript regular expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"430\"/>\n        <source>JavaDoc style C++ comment</source>\n        <translation>Comentário JavaDoc estilo C++</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"433\"/>\n        <source>Inactive JavaDoc style C++ comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"436\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Identificadores e palavras chave secundárias</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"439\"/>\n        <source>Inactive secondary keywords and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"442\"/>\n        <source>JavaDoc keyword</source>\n        <translation>Palavra chave JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"445\"/>\n        <source>Inactive JavaDoc keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"448\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>Erro de palavra chave do JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"451\"/>\n        <source>Inactive JavaDoc keyword error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"454\"/>\n        <source>Global classes and typedefs</source>\n        <translation>Classes e definições de tipo globais</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"457\"/>\n        <source>Inactive global classes and typedefs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"460\"/>\n        <source>C++ raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"463\"/>\n        <source>Inactive C++ raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"466\"/>\n        <source>Vala triple-quoted verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"469\"/>\n        <source>Inactive Vala triple-quoted verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"472\"/>\n        <source>Pike hash-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"475\"/>\n        <source>Inactive Pike hash-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"478\"/>\n        <source>Pre-processor C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"481\"/>\n        <source>Inactive pre-processor C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"484\"/>\n        <source>JavaDoc style pre-processor comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"487\"/>\n        <source>Inactive JavaDoc style pre-processor comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSS</name>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"225\"/>\n        <source>Tag</source>\n        <translation>Marcador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"228\"/>\n        <source>Class selector</source>\n        <translation>Seletor de classe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"231\"/>\n        <source>Pseudo-class</source>\n        <translation>Pseudo-classe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"234\"/>\n        <source>Unknown pseudo-class</source>\n        <translation>Pseudo-classe desconhecida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"237\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"240\"/>\n        <source>CSS1 property</source>\n        <translation>Propriedade CSS1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"243\"/>\n        <source>Unknown property</source>\n        <translation>Propriedade desconhecida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"246\"/>\n        <source>Value</source>\n        <translation>Valor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"249\"/>\n        <source>ID selector</source>\n        <translation>Seletor de ID</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"252\"/>\n        <source>Important</source>\n        <translation>Importante</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"255\"/>\n        <source>@-rule</source>\n        <translation>regra-@</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"258\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"261\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"264\"/>\n        <source>CSS2 property</source>\n        <translation>Propriedade CSS2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"267\"/>\n        <source>Attribute</source>\n        <translation>Atributo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"270\"/>\n        <source>CSS3 property</source>\n        <translation type=\"unfinished\">Propriedade CSS2 {3 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"273\"/>\n        <source>Pseudo-element</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"276\"/>\n        <source>Extended CSS property</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"279\"/>\n        <source>Extended pseudo-class</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"282\"/>\n        <source>Extended pseudo-element</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"285\"/>\n        <source>Media rule</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"288\"/>\n        <source>Variable</source>\n        <translation type=\"unfinished\">Variável</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSharp</name>\n    <message>\n        <location filename=\"qscilexercsharp.cpp\" line=\"95\"/>\n        <source>Verbatim string</source>\n        <translation>Cadeia de caracteres no formato verbatim</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCoffeeScript</name>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"244\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"247\"/>\n        <source>C-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"250\"/>\n        <source>C++-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"253\"/>\n        <source>JavaDoc C-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"256\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"259\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"262\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"265\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"268\"/>\n        <source>IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"271\"/>\n        <source>Pre-processor block</source>\n        <translation type=\"unfinished\">Instruções de pré-processamento</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"274\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"277\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"280\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"283\"/>\n        <source>C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"286\"/>\n        <source>Regular expression</source>\n        <translation type=\"unfinished\">Expressão Regular</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"289\"/>\n        <source>JavaDoc C++-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"292\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation type=\"unfinished\">Identificadores e palavras chave secundárias</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"295\"/>\n        <source>JavaDoc keyword</source>\n        <translation type=\"unfinished\">Palavra chave JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword error</source>\n        <translation type=\"unfinished\">Erro de palavra chave do JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"301\"/>\n        <source>Global classes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"304\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"307\"/>\n        <source>Block regular expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"310\"/>\n        <source>Block regular expression comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerD</name>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"259\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"262\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Comentar Linha</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"265\"/>\n        <source>DDoc style block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"268\"/>\n        <source>Nesting comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"271\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"274\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"277\"/>\n        <source>Secondary keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"280\"/>\n        <source>Documentation keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"283\"/>\n        <source>Type definition</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"286\"/>\n        <source>String</source>\n        <translation type=\"unfinished\">Cadeia de Caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"289\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"292\"/>\n        <source>Character</source>\n        <translation type=\"unfinished\">Caractere</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"301\"/>\n        <source>DDoc style line comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"304\"/>\n        <source>DDoc keyword</source>\n        <translation type=\"unfinished\">Palavra chave JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"307\"/>\n        <source>DDoc keyword error</source>\n        <translation type=\"unfinished\">Erro de palavra chave do JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"310\"/>\n        <source>Backquoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"313\"/>\n        <source>Raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"316\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Definição de usuário 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"319\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Definição de usuário 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"322\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Definição de usuário 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerDiff</name>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"92\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"95\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"98\"/>\n        <source>Command</source>\n        <translation>Comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"101\"/>\n        <source>Header</source>\n        <translation>Cabeçalho</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"104\"/>\n        <source>Position</source>\n        <translation>Posição</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"107\"/>\n        <source>Removed line</source>\n        <translation>Linha Removida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"110\"/>\n        <source>Added line</source>\n        <translation>Linha Adicionada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"113\"/>\n        <source>Changed line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerFortran77</name>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"176\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"179\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"182\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"185\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"188\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"191\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"194\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"197\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"200\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"203\"/>\n        <source>Intrinsic function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"206\"/>\n        <source>Extended function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"209\"/>\n        <source>Pre-processor block</source>\n        <translation type=\"unfinished\">Instruções de pré-processamento</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"212\"/>\n        <source>Dotted operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"215\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Rótulo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"218\"/>\n        <source>Continuation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerHTML</name>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"553\"/>\n        <source>HTML default</source>\n        <translation>HTML por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"556\"/>\n        <source>Tag</source>\n        <translation>Marcador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"559\"/>\n        <source>Unknown tag</source>\n        <translation>Marcador desconhecido</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"562\"/>\n        <source>Attribute</source>\n        <translation>Atributo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"565\"/>\n        <source>Unknown attribute</source>\n        <translation>Atributo desconhecido</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"568\"/>\n        <source>HTML number</source>\n        <translation>Número HTML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"571\"/>\n        <source>HTML double-quoted string</source>\n        <translation>Cadeia de caracteres HTML envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"574\"/>\n        <source>HTML single-quoted string</source>\n        <translation>Cadeia de caracteres HTML envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"577\"/>\n        <source>Other text in a tag</source>\n        <translation>Outro texto em um marcador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"580\"/>\n        <source>HTML comment</source>\n        <translation>Comentário HTML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"583\"/>\n        <source>Entity</source>\n        <translation>Entidade</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"586\"/>\n        <source>End of a tag</source>\n        <translation>Final de um marcador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"589\"/>\n        <source>Start of an XML fragment</source>\n        <translation>Início de um bloco XML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"592\"/>\n        <source>End of an XML fragment</source>\n        <translation>Final de um bloco XML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"595\"/>\n        <source>Script tag</source>\n        <translation>Marcador de script</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"598\"/>\n        <source>Start of an ASP fragment with @</source>\n        <translation>Início de um bloco ASP com @</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"601\"/>\n        <source>Start of an ASP fragment</source>\n        <translation>Início de um bloco ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"604\"/>\n        <source>CDATA</source>\n        <translation>CDATA</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"607\"/>\n        <source>Start of a PHP fragment</source>\n        <translation>Início de um bloco PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"610\"/>\n        <source>Unquoted HTML value</source>\n        <translation>Valor HTML não envolvido por aspas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"613\"/>\n        <source>ASP X-Code comment</source>\n        <translation>Comentário ASP X-Code</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"616\"/>\n        <source>SGML default</source>\n        <translation>SGML por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"619\"/>\n        <source>SGML command</source>\n        <translation>Comando SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"622\"/>\n        <source>First parameter of an SGML command</source>\n        <translation>Primeiro parâmetro em um comando SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"625\"/>\n        <source>SGML double-quoted string</source>\n        <translation>Cadeia de caracteres SGML envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"628\"/>\n        <source>SGML single-quoted string</source>\n        <translation>Cadeia de caracteres SGML envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"631\"/>\n        <source>SGML error</source>\n        <translation>Erro SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"634\"/>\n        <source>SGML special entity</source>\n        <translation>Entidade especial SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"637\"/>\n        <source>SGML comment</source>\n        <translation>Comando SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"640\"/>\n        <source>First parameter comment of an SGML command</source>\n        <translation>Primeiro comentário de parâmetro de uma comando SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"643\"/>\n        <source>SGML block default</source>\n        <translation>Bloco SGML por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"646\"/>\n        <source>Start of a JavaScript fragment</source>\n        <translation>Início de um bloco Javascript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"649\"/>\n        <source>JavaScript default</source>\n        <translation>JavaScript por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"652\"/>\n        <source>JavaScript comment</source>\n        <translation>Comentário JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"655\"/>\n        <source>JavaScript line comment</source>\n        <translation>Comentário de linha JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"658\"/>\n        <source>JavaDoc style JavaScript comment</source>\n        <translation>Comentário JavaScript no estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"661\"/>\n        <source>JavaScript number</source>\n        <translation>Número JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"664\"/>\n        <source>JavaScript word</source>\n        <translation>Palavra JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"667\"/>\n        <source>JavaScript keyword</source>\n        <translation>Palavra chave JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"670\"/>\n        <source>JavaScript double-quoted string</source>\n        <translation>Cadeia de caracteres JavaScript envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"673\"/>\n        <source>JavaScript single-quoted string</source>\n        <translation>Cadeia de caracteres JavaScript envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"676\"/>\n        <source>JavaScript symbol</source>\n        <translation>Símbolo JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"679\"/>\n        <source>JavaScript unclosed string</source>\n        <translation>Cadeia de caracteres JavaScript não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"682\"/>\n        <source>JavaScript regular expression</source>\n        <translation>Expressão regular JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"685\"/>\n        <source>Start of an ASP JavaScript fragment</source>\n        <translation>Início de um bloco Javascript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"688\"/>\n        <source>ASP JavaScript default</source>\n        <translation>JavaScript ASP por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"691\"/>\n        <source>ASP JavaScript comment</source>\n        <translation>Comentário JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"694\"/>\n        <source>ASP JavaScript line comment</source>\n        <translation>Comentário de linha JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"697\"/>\n        <source>JavaDoc style ASP JavaScript comment</source>\n        <translation>Comentário JavaScript ASP no estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"700\"/>\n        <source>ASP JavaScript number</source>\n        <translation>Número JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"703\"/>\n        <source>ASP JavaScript word</source>\n        <translation>Palavra chave JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"706\"/>\n        <source>ASP JavaScript keyword</source>\n        <translation>Palavra chave JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"709\"/>\n        <source>ASP JavaScript double-quoted string</source>\n        <translation>Cadeia de caracteres JavaScript ASP envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"712\"/>\n        <source>ASP JavaScript single-quoted string</source>\n        <translation>Cadeia de caracteres JavaScript ASP envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"715\"/>\n        <source>ASP JavaScript symbol</source>\n        <translation>Símbolo JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"718\"/>\n        <source>ASP JavaScript unclosed string</source>\n        <translation>Cadeia de caracteres JavaScript ASP não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"721\"/>\n        <source>ASP JavaScript regular expression</source>\n        <translation>Expressão regular JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"724\"/>\n        <source>Start of a VBScript fragment</source>\n        <translation>Início de um bloco VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"727\"/>\n        <source>VBScript default</source>\n        <translation>VBScript por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"730\"/>\n        <source>VBScript comment</source>\n        <translation>Comentário VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"733\"/>\n        <source>VBScript number</source>\n        <translation>Número VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"736\"/>\n        <source>VBScript keyword</source>\n        <translation>Palavra chave VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"739\"/>\n        <source>VBScript string</source>\n        <translation>Cadeia de caracteres VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"742\"/>\n        <source>VBScript identifier</source>\n        <translation>Identificador VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"745\"/>\n        <source>VBScript unclosed string</source>\n        <translation>Cadeia de caracteres VBScript não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"748\"/>\n        <source>Start of an ASP VBScript fragment</source>\n        <translation>Início de um bloco VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"751\"/>\n        <source>ASP VBScript default</source>\n        <translation>VBScript ASP por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"754\"/>\n        <source>ASP VBScript comment</source>\n        <translation>Comentário VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"757\"/>\n        <source>ASP VBScript number</source>\n        <translation>Número VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"760\"/>\n        <source>ASP VBScript keyword</source>\n        <translation>Palavra chave VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"763\"/>\n        <source>ASP VBScript string</source>\n        <translation>Cadeia de caracteres VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"766\"/>\n        <source>ASP VBScript identifier</source>\n        <translation>Identificador VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"769\"/>\n        <source>ASP VBScript unclosed string</source>\n        <translation>Cadeia de caracteres VBScript ASP não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"772\"/>\n        <source>Start of a Python fragment</source>\n        <translation>Início de um bloco Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"775\"/>\n        <source>Python default</source>\n        <translation>Python por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"778\"/>\n        <source>Python comment</source>\n        <translation>Comentário Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"781\"/>\n        <source>Python number</source>\n        <translation>Número Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"784\"/>\n        <source>Python double-quoted string</source>\n        <translation>Cadeia de caracteres Python envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"787\"/>\n        <source>Python single-quoted string</source>\n        <translation>Cadeia de caracteres Python envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"790\"/>\n        <source>Python keyword</source>\n        <translation>Palavra chave Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"793\"/>\n        <source>Python triple double-quoted string</source>\n        <translation>Cadeia de caracteres Python envolvida por aspas triplas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"796\"/>\n        <source>Python triple single-quoted string</source>\n        <translation>Cadeia de caracteres Python envolvida por aspas triplas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"799\"/>\n        <source>Python class name</source>\n        <translation>Nome de classe Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"802\"/>\n        <source>Python function or method name</source>\n        <translation>Nome de método ou função Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"805\"/>\n        <source>Python operator</source>\n        <translation>Operador Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"808\"/>\n        <source>Python identifier</source>\n        <translation>Identificador Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"811\"/>\n        <source>Start of an ASP Python fragment</source>\n        <translation>Início de um bloco Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"814\"/>\n        <source>ASP Python default</source>\n        <translation>Python ASP por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"817\"/>\n        <source>ASP Python comment</source>\n        <translation>Comentário Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"820\"/>\n        <source>ASP Python number</source>\n        <translation>Número Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"823\"/>\n        <source>ASP Python double-quoted string</source>\n        <translation>Cadeia de caracteres Python ASP envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"826\"/>\n        <source>ASP Python single-quoted string</source>\n        <translation>Cadeia de caracteres Python ASP envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"829\"/>\n        <source>ASP Python keyword</source>\n        <translation>Palavra chave Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"832\"/>\n        <source>ASP Python triple double-quoted string</source>\n        <translation>Cadeia de caracteres Python ASP envolvida por aspas triplas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"835\"/>\n        <source>ASP Python triple single-quoted string</source>\n        <translation>Cadeia de caracteres Python ASP envolvida por aspas triplas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"838\"/>\n        <source>ASP Python class name</source>\n        <translation>Nome de classe Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"841\"/>\n        <source>ASP Python function or method name</source>\n        <translation>Nome de método ou função Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"844\"/>\n        <source>ASP Python operator</source>\n        <translation>Operador Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"847\"/>\n        <source>ASP Python identifier</source>\n        <translation>Identificador Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"850\"/>\n        <source>PHP default</source>\n        <translation>PHP por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"853\"/>\n        <source>PHP double-quoted string</source>\n        <translation>Cadeia de caracteres PHP envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"856\"/>\n        <source>PHP single-quoted string</source>\n        <translation>Cadeia de caracteres PHP envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"859\"/>\n        <source>PHP keyword</source>\n        <translation>Palavra chave PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"862\"/>\n        <source>PHP number</source>\n        <translation>Número PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"865\"/>\n        <source>PHP variable</source>\n        <translation>Variável PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"868\"/>\n        <source>PHP comment</source>\n        <translation>Comentário PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"871\"/>\n        <source>PHP line comment</source>\n        <translation>Comentário de linha PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"874\"/>\n        <source>PHP double-quoted variable</source>\n        <translation>Variável PHP envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"877\"/>\n        <source>PHP operator</source>\n        <translation>Operador PHP</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerIDL</name>\n    <message>\n        <location filename=\"qscilexeridl.cpp\" line=\"87\"/>\n        <source>UUID</source>\n        <translation>UUID</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerJavaScript</name>\n    <message>\n        <location filename=\"qscilexerjavascript.cpp\" line=\"97\"/>\n        <source>Regular expression</source>\n        <translation>Expressão Regular</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerLua</name>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"218\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"221\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"224\"/>\n        <source>Line comment</source>\n        <translation>Comentar Linha</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"227\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"230\"/>\n        <source>Keyword</source>\n        <translation>Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"233\"/>\n        <source>String</source>\n        <translation>Cadeia de Caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"236\"/>\n        <source>Character</source>\n        <translation>Caractere</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"239\"/>\n        <source>Literal string</source>\n        <translation>Cadeia de caracteres literal</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"242\"/>\n        <source>Preprocessor</source>\n        <translation>Preprocessador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"245\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"248\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"251\"/>\n        <source>Unclosed string</source>\n        <translation>Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"254\"/>\n        <source>Basic functions</source>\n        <translation>Funções básicas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"257\"/>\n        <source>String, table and maths functions</source>\n        <translation>Funções de cadeia de caracteres e de tabelas matemáticas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"260\"/>\n        <source>Coroutines, i/o and system facilities</source>\n        <translation>Funções auxiiares, e/s e funções de sistema</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"263\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Definição de usuário 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"266\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Definição de usuário 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"269\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Definição de usuário 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"272\"/>\n        <source>User defined 4</source>\n        <translation type=\"unfinished\">Definição de usuário 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"275\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Rótulo</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMakefile</name>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"116\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"119\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"122\"/>\n        <source>Preprocessor</source>\n        <translation>Preprocessador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"125\"/>\n        <source>Variable</source>\n        <translation>Variável</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"128\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"131\"/>\n        <source>Target</source>\n        <translation>Destino</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"134\"/>\n        <source>Error</source>\n        <translation>Erro</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMatlab</name>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"123\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"126\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"129\"/>\n        <source>Command</source>\n        <translation type=\"unfinished\">Comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"132\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"135\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"138\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"141\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"144\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"147\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPO</name>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"90\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"93\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"96\"/>\n        <source>Message identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"99\"/>\n        <source>Message identifier text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"102\"/>\n        <source>Message string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"105\"/>\n        <source>Message string text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"108\"/>\n        <source>Message context</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"111\"/>\n        <source>Message context text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"114\"/>\n        <source>Fuzzy flag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"117\"/>\n        <source>Programmer comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"120\"/>\n        <source>Reference</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"123\"/>\n        <source>Flags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"126\"/>\n        <source>Message identifier text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"129\"/>\n        <source>Message string text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"132\"/>\n        <source>Message context text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPOV</name>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"267\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"270\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"273\"/>\n        <source>Comment line</source>\n        <translation>Comentar Linha</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"276\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"279\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"282\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"285\"/>\n        <source>String</source>\n        <translation>Cadeia de Caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"288\"/>\n        <source>Unclosed string</source>\n        <translation>Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"291\"/>\n        <source>Directive</source>\n        <translation>Diretiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"294\"/>\n        <source>Bad directive</source>\n        <translation>Diretiva ruim</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"297\"/>\n        <source>Objects, CSG and appearance</source>\n        <translation>Objetos, CSG e aparência</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"300\"/>\n        <source>Types, modifiers and items</source>\n        <translation>Tipos, modificadores e itens</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"303\"/>\n        <source>Predefined identifiers</source>\n        <translation>Identificadores predefinidos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"306\"/>\n        <source>Predefined functions</source>\n        <translation>Funções predefinidas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"309\"/>\n        <source>User defined 1</source>\n        <translation>Definição de usuário 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"312\"/>\n        <source>User defined 2</source>\n        <translation>Definição de usuário 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"315\"/>\n        <source>User defined 3</source>\n        <translation>Definição de usuário 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPascal</name>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"246\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"258\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Comentar Linha</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"267\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"273\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"276\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"285\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"249\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"252\"/>\n        <source>&apos;{ ... }&apos; style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"255\"/>\n        <source>&apos;(* ... *)&apos; style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"261\"/>\n        <source>&apos;{$ ... }&apos; style pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"264\"/>\n        <source>&apos;(*$ ... *)&apos; style pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"270\"/>\n        <source>Hexadecimal number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"279\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"282\"/>\n        <source>Character</source>\n        <translation type=\"unfinished\">Caractere</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"288\"/>\n        <source>Inline asm</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPerl</name>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"318\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"321\"/>\n        <source>Error</source>\n        <translation>Erro</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"324\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"327\"/>\n        <source>POD</source>\n        <translation>POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"330\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"333\"/>\n        <source>Keyword</source>\n        <translation>Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"336\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"339\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"342\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"345\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"348\"/>\n        <source>Scalar</source>\n        <translation>Escalar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"351\"/>\n        <source>Array</source>\n        <translation>Vetor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"354\"/>\n        <source>Hash</source>\n        <translation>Hash</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"357\"/>\n        <source>Symbol table</source>\n        <translation>Tabela de Símbolos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"360\"/>\n        <source>Regular expression</source>\n        <translation>Expressão Regular</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"363\"/>\n        <source>Substitution</source>\n        <translation>Substituição</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"366\"/>\n        <source>Backticks</source>\n        <translation>Aspas Invertidas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"369\"/>\n        <source>Data section</source>\n        <translation>Seção de dados</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"372\"/>\n        <source>Here document delimiter</source>\n        <translation>Delimitador de documentos criados através de redicionadores (&gt;&gt; e &gt;)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"375\"/>\n        <source>Single-quoted here document</source>\n        <translation>&quot;here document&quot; envolvido por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"378\"/>\n        <source>Double-quoted here document</source>\n        <translation>&quot;here document&quot; envolvido por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"381\"/>\n        <source>Backtick here document</source>\n        <translation>&quot;here document&quot; envolvido por aspas invertidas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"384\"/>\n        <source>Quoted string (q)</source>\n        <translation>Cadeia de caracteres envolvida por aspas (q)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"387\"/>\n        <source>Quoted string (qq)</source>\n        <translation>Cadeia de caracteres envolvida por aspas (qq)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"390\"/>\n        <source>Quoted string (qx)</source>\n        <translation>Cadeia de caracteres envolvida por aspas (qx)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"393\"/>\n        <source>Quoted string (qr)</source>\n        <translation>Cadeia de caracteres envolvida por aspas (qr)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"396\"/>\n        <source>Quoted string (qw)</source>\n        <translation>Cadeia de caracteres envolvida por aspas (qw)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"399\"/>\n        <source>POD verbatim</source>\n        <translation>POD em formato verbatim</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"402\"/>\n        <source>Subroutine prototype</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"405\"/>\n        <source>Format identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"408\"/>\n        <source>Format body</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"411\"/>\n        <source>Double-quoted string (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"414\"/>\n        <source>Translation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"417\"/>\n        <source>Regular expression (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"420\"/>\n        <source>Substitution (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"423\"/>\n        <source>Backticks (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"426\"/>\n        <source>Double-quoted here document (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"429\"/>\n        <source>Backtick here document (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"432\"/>\n        <source>Quoted string (qq, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"435\"/>\n        <source>Quoted string (qx, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"438\"/>\n        <source>Quoted string (qr, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPostScript</name>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"249\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"252\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"255\"/>\n        <source>DSC comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"258\"/>\n        <source>DSC comment value</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"261\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"264\"/>\n        <source>Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"267\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"270\"/>\n        <source>Literal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"273\"/>\n        <source>Immediately evaluated literal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"276\"/>\n        <source>Array parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"279\"/>\n        <source>Dictionary parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"282\"/>\n        <source>Procedure parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"285\"/>\n        <source>Text</source>\n        <translation type=\"unfinished\">Texto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"288\"/>\n        <source>Hexadecimal string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"291\"/>\n        <source>Base85 string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"294\"/>\n        <source>Bad string character</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerProperties</name>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"111\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"114\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"117\"/>\n        <source>Section</source>\n        <translation>Seção</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"120\"/>\n        <source>Assignment</source>\n        <translation>Atribuição</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"123\"/>\n        <source>Default value</source>\n        <translation>Valor Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"126\"/>\n        <source>Key</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPython</name>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"225\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"228\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"231\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"234\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"237\"/>\n        <source>Keyword</source>\n        <translation>Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"240\"/>\n        <source>Triple single-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por três aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"243\"/>\n        <source>Triple double-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por três aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"246\"/>\n        <source>Class name</source>\n        <translation>Nome da classe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"249\"/>\n        <source>Function or method name</source>\n        <translation>Nome da função ou método</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"252\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"255\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"258\"/>\n        <source>Comment block</source>\n        <translation>Bloco de comentários</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"261\"/>\n        <source>Unclosed string</source>\n        <translation>Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"264\"/>\n        <source>Highlighted identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"267\"/>\n        <source>Decorator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerRuby</name>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"239\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"245\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"251\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"257\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"260\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"254\"/>\n        <source>Keyword</source>\n        <translation>Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"263\"/>\n        <source>Class name</source>\n        <translation>Nome da classe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"266\"/>\n        <source>Function or method name</source>\n        <translation>Nome da função ou método</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"269\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"272\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"242\"/>\n        <source>Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"248\"/>\n        <source>POD</source>\n        <translation type=\"unfinished\">POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"275\"/>\n        <source>Regular expression</source>\n        <translation type=\"unfinished\">Expressão Regular</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"278\"/>\n        <source>Global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"281\"/>\n        <source>Symbol</source>\n        <translation type=\"unfinished\">Símbolo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"284\"/>\n        <source>Module name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"287\"/>\n        <source>Instance variable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"290\"/>\n        <source>Class variable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"293\"/>\n        <source>Backticks</source>\n        <translation type=\"unfinished\">Aspas Invertidas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"296\"/>\n        <source>Data section</source>\n        <translation type=\"unfinished\">Seção de dados</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"299\"/>\n        <source>Here document delimiter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"302\"/>\n        <source>Here document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"305\"/>\n        <source>%q string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"308\"/>\n        <source>%Q string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"311\"/>\n        <source>%x string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"314\"/>\n        <source>%r string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"317\"/>\n        <source>%w string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"320\"/>\n        <source>Demoted keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"323\"/>\n        <source>stdin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"326\"/>\n        <source>stdout</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"329\"/>\n        <source>stderr</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSQL</name>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"259\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"268\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"271\"/>\n        <source>Keyword</source>\n        <translation>Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"277\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"286\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"289\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"262\"/>\n        <source>Comment line</source>\n        <translation>Comentário de Linha</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"265\"/>\n        <source>JavaDoc style comment</source>\n        <translation>Comentário estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"274\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"280\"/>\n        <source>SQL*Plus keyword</source>\n        <translation>Palavra chave do SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"283\"/>\n        <source>SQL*Plus prompt</source>\n        <translation>Prompt do SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"292\"/>\n        <source>SQL*Plus comment</source>\n        <translation>Comentário do SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"295\"/>\n        <source># comment line</source>\n        <translation>Comentário de linha usando #</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword</source>\n        <translation>Palavra chave JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"301\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>Erro de palavra chave do JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"304\"/>\n        <source>User defined 1</source>\n        <translation>Definição de usuário 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"307\"/>\n        <source>User defined 2</source>\n        <translation>Definição de usuário 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"310\"/>\n        <source>User defined 3</source>\n        <translation>Definição de usuário 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"313\"/>\n        <source>User defined 4</source>\n        <translation>Definição de usuário 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"316\"/>\n        <source>Quoted identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSpice</name>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"156\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"159\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"162\"/>\n        <source>Command</source>\n        <translation type=\"unfinished\">Comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"165\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"168\"/>\n        <source>Parameter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"171\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"174\"/>\n        <source>Delimiter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"177\"/>\n        <source>Value</source>\n        <translation type=\"unfinished\">Valor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"180\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTCL</name>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"283\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"286\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"289\"/>\n        <source>Comment line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"295\"/>\n        <source>Quoted keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"298\"/>\n        <source>Quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"301\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"304\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"307\"/>\n        <source>Substitution</source>\n        <translation type=\"unfinished\">Substituição</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"310\"/>\n        <source>Brace substitution</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"313\"/>\n        <source>Modifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"316\"/>\n        <source>Expand keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"319\"/>\n        <source>TCL keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"322\"/>\n        <source>Tk keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"325\"/>\n        <source>iTCL keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"328\"/>\n        <source>Tk command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"331\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Definição de usuário 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"334\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Definição de usuário 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"337\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Definição de usuário 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"340\"/>\n        <source>User defined 4</source>\n        <translation type=\"unfinished\">Definição de usuário 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"343\"/>\n        <source>Comment box</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"346\"/>\n        <source>Comment block</source>\n        <translation type=\"unfinished\">Bloco de comentários</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTeX</name>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"177\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"180\"/>\n        <source>Special</source>\n        <translation>Especial</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"183\"/>\n        <source>Group</source>\n        <translation>Grupo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"186\"/>\n        <source>Symbol</source>\n        <translation>Símbolo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"189\"/>\n        <source>Command</source>\n        <translation>Comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"192\"/>\n        <source>Text</source>\n        <translation>Texto</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVHDL</name>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"197\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"200\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"203\"/>\n        <source>Comment line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"206\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"209\"/>\n        <source>String</source>\n        <translation type=\"unfinished\">Cadeia de Caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"212\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"215\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"218\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"221\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"224\"/>\n        <source>Standard operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"227\"/>\n        <source>Attribute</source>\n        <translation type=\"unfinished\">Atributo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"230\"/>\n        <source>Standard function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"233\"/>\n        <source>Standard package</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"236\"/>\n        <source>Standard type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"239\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVerilog</name>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"209\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"212\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"215\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Comentar Linha</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"218\"/>\n        <source>Bang comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"221\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"224\"/>\n        <source>Primary keywords and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"227\"/>\n        <source>String</source>\n        <translation type=\"unfinished\">Cadeia de Caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"230\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation type=\"unfinished\">Identificadores e palavras chave secundárias</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"233\"/>\n        <source>System task</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"236\"/>\n        <source>Preprocessor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"239\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"242\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"245\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"248\"/>\n        <source>User defined tasks and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerYAML</name>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"161\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"164\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"167\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"173\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"176\"/>\n        <source>Reference</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"179\"/>\n        <source>Document delimiter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"182\"/>\n        <source>Text block marker</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"185\"/>\n        <source>Syntax error marker</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"188\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n</context>\n<context>\n    <name>QsciScintilla</name>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4359\"/>\n        <source>&amp;Undo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4363\"/>\n        <source>&amp;Redo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4369\"/>\n        <source>Cu&amp;t</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4374\"/>\n        <source>&amp;Copy</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4380\"/>\n        <source>&amp;Paste</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4384\"/>\n        <source>Delete</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4391\"/>\n        <source>Select All</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qsciprinter.cpp",
    "content": "// This module implements the QsciPrinter class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qsciprinter.h\"\n\n#if !defined(QT_NO_PRINTER)\n\n#include <qprinter.h>\n#include <qpainter.h>\n\n#include <qpaintdevicemetrics.h>\n#include <qvaluestack.h>\n\n#include \"Qsci/qsciscintillabase.h\"\n\n\n// The ctor.\nQsciPrinter::QsciPrinter(QPrinter::PrinterMode mode)\n    : QPrinter(mode), mag(0), wrap(QsciScintilla::WrapWord)\n{\n}\n\n\n// The dtor.\nQsciPrinter::~QsciPrinter()\n{\n}\n\n\n// Format the page before the document text is drawn.\nvoid QsciPrinter::formatPage(QPainter &, bool, QRect &, int)\n{\n}\n\n\n// Print a range of lines to a printer.\nint QsciPrinter::printRange(QsciScintillaBase *qsb, int from, int to)\n{\n    // Sanity check.\n    if (!qsb)\n        return false;\n\n    // Setup the printing area.\n    QRect def_area;\n\n    def_area.setX(0);\n    def_area.setY(0);\n\n    QPaintDeviceMetrics metrics(this);\n    def_area.setWidth(metrics.width());\n    def_area.setHeight(metrics.height());\n\n    // Get the page range.\n    int pgFrom, pgTo;\n\n    pgFrom = fromPage();\n    pgTo = toPage();\n\n    // Find the position range.\n    long startPos, endPos;\n\n    endPos = qsb->SendScintilla(QsciScintillaBase::SCI_GETLENGTH);\n\n    startPos = (from > 0 ? qsb -> SendScintilla(QsciScintillaBase::SCI_POSITIONFROMLINE,from) : 0);\n\n    if (to >= 0)\n    {\n        long toPos = qsb -> SendScintilla(QsciScintillaBase::SCI_POSITIONFROMLINE,to + 1);\n\n        if (endPos > toPos)\n            endPos = toPos;\n    }\n\n    if (startPos >= endPos)\n        return false;\n\n    QPainter painter(this);\n    bool reverse = (pageOrder() == LastPageFirst);\n    bool needNewPage = false;\n\n    qsb -> SendScintilla(QsciScintillaBase::SCI_SETPRINTMAGNIFICATION,mag);\n    qsb -> SendScintilla(QsciScintillaBase::SCI_SETPRINTWRAPMODE,wrap);\n\n    for (int i = 1; i <= numCopies(); ++i)\n    {\n        // If we are printing in reverse page order then remember the start\n        // position of each page.\n        QValueStack<long> pageStarts;\n\n        int currPage = 1;\n        long pos = startPos;\n\n        while (pos < endPos)\n        {\n            // See if we have finished the requested page range.\n            if (pgTo > 0 && pgTo < currPage)\n                break;\n\n            // See if we are going to render this page, or just see how much\n            // would fit onto it.\n            bool render = false;\n\n            if (pgFrom == 0 || pgFrom <= currPage)\n            {\n                if (reverse)\n                    pageStarts.push(pos);\n                else\n                {\n                    render = true;\n\n                    if (needNewPage)\n                    {\n                        if (!newPage())\n                            return false;\n                    }\n                    else\n                        needNewPage = true;\n                }\n            }\n\n            QRect area = def_area;\n\n            formatPage(painter,render,area,currPage);\n            pos = qsb -> SendScintilla(QsciScintillaBase::SCI_FORMATRANGE,render,&painter,area,pos,endPos);\n\n            ++currPage;\n        }\n\n        // All done if we are printing in normal page order.\n        if (!reverse)\n            continue;\n\n        // Now go through each page on the stack and really print it.\n        while (!pageStarts.isEmpty())\n        {\n            --currPage;\n\n            long ePos = pos;\n            pos = pageStarts.pop();\n\n            if (needNewPage)\n            {\n                if (!newPage())\n                    return false;\n            }\n            else\n                needNewPage = true;\n\n            QRect area = def_area;\n\n            formatPage(painter,true,area,currPage);\n            qsb->SendScintilla(QsciScintillaBase::SCI_FORMATRANGE,true,&painter,area,pos,ePos);\n        }\n    }\n\n    return true;\n}\n\n\n// Set the print magnification in points.\nvoid QsciPrinter::setMagnification(int magnification)\n{\n    mag = magnification;\n}\n\n\n// Set the line wrap mode.\nvoid QsciPrinter::setWrapMode(QsciScintilla::WrapMode wmode)\n{\n    wrap = wmode;\n}\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qsciscintilla.cpp",
    "content": "// This module implements the \"official\" high-level API of the Qt port of\n// Scintilla.  It is modelled on QTextEdit - a method of the same name should\n// behave in the same way.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qsciscintilla.h\"\n\n#include <string.h>\n#include <qaction.h>\n#include <qapplication.h>\n#include <qcolor.h>\n#include <qevent.h>\n#include <qimage.h>\n#include <qiodevice.h>\n#include <qkeysequence.h>\n#include <qpoint.h>\n\n\n#include \"Qsci/qsciabstractapis.h\"\n#include \"Qsci/qscicommandset.h\"\n#include \"Qsci/qscilexer.h\"\n#include \"Qsci/qscistyle.h\"\n#include \"Qsci/qscistyledtext.h\"\n\n\n// Make sure these match the values in Scintilla.h.  We don't #include that\n// file because it just causes more clashes.\n#define KEYWORDSET_MAX  8\n#define MARKER_MAX      31\n\n// The list separators for auto-completion and user lists.\nconst char acSeparator = '\\x03';\nconst char userSeparator = '\\x04';\n\n// The default fold margin width.\nstatic const int defaultFoldMarginWidth = 14;\n\n// The default set of characters that make up a word.\nstatic const char *defaultWordChars = \"_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n\n\n// The ctor.\nQsciScintilla::QsciScintilla(QWidget *parent, const char *name, Qt::WFlags f)\n    : QsciScintillaBase(parent, name, f),\n      allocatedMarkers(0), allocatedIndicators(7), oldPos(-1), selText(false),\n      fold(NoFoldStyle), foldmargin(2), autoInd(false),\n      braceMode(NoBraceMatch), acSource(AcsNone), acThresh(-1),\n      wchars(defaultWordChars), call_tips_position(CallTipsBelowText),\n      call_tips_style(CallTipsNoContext), maxCallTips(-1),\n      use_single(AcusNever), explicit_fillups(\"\"), fillups_enabled(false)\n{\n    connect(this,SIGNAL(SCN_MODIFYATTEMPTRO()),\n             SIGNAL(modificationAttempted()));\n\n    connect(this,SIGNAL(SCN_MODIFIED(int,int,const char *,int,int,int,int,int,int,int)),\n             SLOT(handleModified(int,int,const char *,int,int,int,int,int,int,int)));\n    connect(this,SIGNAL(SCN_CALLTIPCLICK(int)),\n             SLOT(handleCallTipClick(int)));\n    connect(this,SIGNAL(SCN_CHARADDED(int)),\n             SLOT(handleCharAdded(int)));\n    connect(this,SIGNAL(SCN_INDICATORCLICK(int,int)),\n             SLOT(handleIndicatorClick(int,int)));\n    connect(this,SIGNAL(SCN_INDICATORRELEASE(int,int)),\n             SLOT(handleIndicatorRelease(int,int)));\n    connect(this,SIGNAL(SCN_MARGINCLICK(int,int,int)),\n             SLOT(handleMarginClick(int,int,int)));\n    connect(this,SIGNAL(SCN_SAVEPOINTREACHED()),\n             SLOT(handleSavePointReached()));\n    connect(this,SIGNAL(SCN_SAVEPOINTLEFT()),\n             SLOT(handleSavePointLeft()));\n    connect(this,SIGNAL(SCN_UPDATEUI(int)),\n             SLOT(handleUpdateUI(int)));\n    connect(this,SIGNAL(QSCN_SELCHANGED(bool)),\n             SLOT(handleSelectionChanged(bool)));\n    connect(this,SIGNAL(SCN_AUTOCSELECTION(const char *,int)),\n             SLOT(handleAutoCompletionSelection()));\n    connect(this,SIGNAL(SCN_USERLISTSELECTION(const char *,int)),\n             SLOT(handleUserListSelection(const char *,int)));\n\n    // Set the default font.\n    setFont(QApplication::font());\n\n    // Set the default fore and background colours.\n    QColorGroup cg = QApplication::palette().active();\n    setColor(cg.text());\n    setPaper(cg.base());\n    setSelectionForegroundColor(cg.highlightedText());\n    setSelectionBackgroundColor(cg.highlight());\n\n#if defined(Q_OS_WIN)\n    setEolMode(EolWindows);\n#else\n    // Note that EolMac is pre-OS/X.\n    setEolMode(EolUnix);\n#endif\n\n    // Capturing the mouse seems to cause problems on multi-head systems. Qt\n    // should do the right thing anyway.\n    SendScintilla(SCI_SETMOUSEDOWNCAPTURES, 0UL);\n\n    setMatchedBraceForegroundColor(Qt::blue);\n    setUnmatchedBraceForegroundColor(Qt::red);\n\n    setAnnotationDisplay(AnnotationStandard);\n    setLexer();\n\n    // Set the visible policy.  These are the same as SciTE's defaults\n    // which, presumably, are sensible.\n    SendScintilla(SCI_SETVISIBLEPOLICY, VISIBLE_STRICT | VISIBLE_SLOP, 4);\n\n    // The default behaviour is unexpected.\n    SendScintilla(SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR,\n            SC_CASEINSENSITIVEBEHAVIOUR_IGNORECASE);\n\n    // Create the standard command set.\n    stdCmds = new QsciCommandSet(this);\n\n    doc.display(this,0);\n}\n\n\n// The dtor.\nQsciScintilla::~QsciScintilla()\n{\n    // Detach any current lexer.\n    detachLexer();\n\n    doc.undisplay(this);\n    delete stdCmds;\n}\n\n\n// Return the current text colour.\nQColor QsciScintilla::color() const\n{\n    return nl_text_colour;\n}\n\n\n// Set the text colour.\nvoid QsciScintilla::setColor(const QColor &c)\n{\n    if (lex.isNull())\n    {\n        // Assume style 0 applies to everything so that we don't need to use\n        // SCI_STYLECLEARALL which clears everything.\n        SendScintilla(SCI_STYLESETFORE, 0, c);\n        nl_text_colour = c;\n    }\n}\n\n\n// Return the overwrite mode.\nbool QsciScintilla::overwriteMode() const\n{\n    return SendScintilla(SCI_GETOVERTYPE);\n}\n\n\n// Set the overwrite mode.\nvoid QsciScintilla::setOverwriteMode(bool overwrite)\n{\n    SendScintilla(SCI_SETOVERTYPE, overwrite);\n}\n\n\n// Return the current paper colour.\nQColor QsciScintilla::paper() const\n{\n    return nl_paper_colour;\n}\n\n\n// Set the paper colour.\nvoid QsciScintilla::setPaper(const QColor &c)\n{\n    if (lex.isNull())\n    {\n        // Assume style 0 applies to everything so that we don't need to use\n        // SCI_STYLECLEARALL which clears everything.  We still have to set the\n        // default style as well for the background without any text.\n        SendScintilla(SCI_STYLESETBACK, 0, c);\n        SendScintilla(SCI_STYLESETBACK, STYLE_DEFAULT, c);\n        nl_paper_colour = c;\n    }\n}\n\n\n// Set the default font.\nvoid QsciScintilla::setFont(const QFont &f)\n{\n    if (lex.isNull())\n    {\n        // Assume style 0 applies to everything so that we don't need to use\n        // SCI_STYLECLEARALL which clears everything.\n        setStylesFont(f, 0);\n        QWidget::setFont(f);\n    }\n}\n\n\n// Enable/disable auto-indent.\nvoid QsciScintilla::setAutoIndent(bool autoindent)\n{\n    autoInd = autoindent;\n}\n\n\n// Set the brace matching mode.\nvoid QsciScintilla::setBraceMatching(BraceMatch bm)\n{\n    braceMode = bm;\n}\n\n\n// Handle the addition of a character.\nvoid QsciScintilla::handleCharAdded(int ch)\n{\n    // Ignore if there is a selection.\n    long pos = SendScintilla(SCI_GETSELECTIONSTART);\n\n    if (pos != SendScintilla(SCI_GETSELECTIONEND) || pos == 0)\n        return;\n\n    // If auto-completion is already active then see if this character is a\n    // start character.  If it is then create a new list which will be a subset\n    // of the current one.  The case where it isn't a start character seems to\n    // be handled correctly elsewhere.\n    if (isListActive())\n    {\n        if (isStartChar(ch))\n        {\n            cancelList();\n            startAutoCompletion(acSource, false, use_single == AcusAlways);\n        }\n\n        return;\n    }\n\n    // Handle call tips.\n    if (call_tips_style != CallTipsNone && !lex.isNull() && strchr(\"(),\", ch) != NULL)\n        callTip();\n\n    // Handle auto-indentation.\n    if (autoInd)\n        if (lex.isNull() || (lex->autoIndentStyle() & AiMaintain))\n            maintainIndentation(ch, pos);\n        else\n            autoIndentation(ch, pos);\n\n    // See if we might want to start auto-completion.\n    if (!isCallTipActive() && acSource != AcsNone)\n        if (isStartChar(ch))\n            startAutoCompletion(acSource, false, use_single == AcusAlways);\n        else if (acThresh >= 1 && isWordCharacter(ch))\n            startAutoCompletion(acSource, true, use_single == AcusAlways);\n}\n\n\n// See if a call tip is active.\nbool QsciScintilla::isCallTipActive() const\n{\n    return SendScintilla(SCI_CALLTIPACTIVE);\n}\n\n\n// Handle a possible change to any current call tip.\nvoid QsciScintilla::callTip()\n{\n    QsciAbstractAPIs *apis = lex->apis();\n\n    if (!apis)\n        return;\n\n    int pos, commas = 0;\n    bool found = false;\n    char ch;\n\n    pos = SendScintilla(SCI_GETCURRENTPOS);\n\n    // Move backwards through the line looking for the start of the current\n    // call tip and working out which argument it is.\n    while ((ch = getCharacter(pos)) != '\\0')\n    {\n        if (ch == ',')\n            ++commas;\n        else if (ch == ')')\n        {\n            int depth = 1;\n\n            // Ignore everything back to the start of the corresponding\n            // parenthesis.\n            while ((ch = getCharacter(pos)) != '\\0')\n            {\n                if (ch == ')')\n                    ++depth;\n                else if (ch == '(' && --depth == 0)\n                    break;\n            }\n        }\n        else if (ch == '(')\n        {\n            found = true;\n            break;\n        }\n    }\n\n    // Cancel any existing call tip.\n    SendScintilla(SCI_CALLTIPCANCEL);\n\n    // Done if there is no new call tip to set.\n    if (!found)\n        return;\n\n    QStringList context = apiContext(pos, pos, ctPos);\n\n    if (context.isEmpty())\n        return;\n\n    // The last word is complete, not partial.\n    context << QString();\n\n    ct_cursor = 0;\n    ct_shifts.clear();\n    ct_entries = apis->callTips(context, commas, call_tips_style, ct_shifts);\n\n    int nr_entries = ct_entries.count();\n\n    if (nr_entries == 0)\n        return;\n\n    if (maxCallTips > 0 && maxCallTips < nr_entries)\n    {\n        ct_entries.erase(ct_entries.at(maxCallTips), ct_entries.end());\n        nr_entries = maxCallTips;\n    }\n\n    int shift;\n    QString ct;\n\n    int nr_shifts = ct_shifts.count();\n\n    if (maxCallTips < 0 && nr_entries > 1)\n    {\n        shift = (nr_shifts > 0 ? ct_shifts.first() : 0);\n        ct = ct_entries[0];\n        ct.prepend('\\002');\n    }\n    else\n    {\n        if (nr_shifts > nr_entries)\n            nr_shifts = nr_entries;\n\n        // Find the biggest shift.\n        shift = 0;\n\n        for (int i = 0; i < nr_shifts; ++i)\n        {\n            int sh = ct_shifts[i];\n\n            if (shift < sh)\n                shift = sh;\n        }\n\n        ct = ct_entries.join(\"\\n\");\n    }\n\n    const char *cts = ct.latin1();\n\n    SendScintilla(SCI_CALLTIPSHOW, adjustedCallTipPosition(shift), cts);\n\n    // Done if there is more than one call tip.\n    if (nr_entries > 1)\n        return;\n\n    // Highlight the current argument.\n    const char *astart;\n\n    if (commas == 0)\n        astart = strchr(cts, '(');\n    else\n        for (astart = strchr(cts, ','); astart && --commas > 0; astart = strchr(astart + 1, ','))\n            ;\n\n    if (!astart || !*++astart)\n        return;\n\n    // The end is at the next comma or unmatched closing parenthesis.\n    const char *aend;\n    int depth = 0;\n\n    for (aend = astart; *aend; ++aend)\n    {\n        char ch = *aend;\n\n        if (ch == ',' && depth == 0)\n            break;\n        else if (ch == '(')\n            ++depth;\n        else if (ch == ')')\n        {\n            if (depth == 0)\n                break;\n\n            --depth;\n        }\n    }\n\n    if (astart != aend)\n        SendScintilla(SCI_CALLTIPSETHLT, astart - cts, aend - cts);\n}\n\n\n// Handle a call tip click.\nvoid QsciScintilla::handleCallTipClick(int dir)\n{\n    int nr_entries = ct_entries.count();\n\n    // Move the cursor while bounds checking.\n    if (dir == 1)\n    {\n        if (ct_cursor - 1 < 0)\n            return;\n\n        --ct_cursor;\n    }\n    else if (dir == 2)\n    {\n        if (ct_cursor + 1 >= nr_entries)\n            return;\n\n        ++ct_cursor;\n    }\n    else\n        return;\n\n    int shift = (ct_shifts.count() > ct_cursor ? ct_shifts[ct_cursor] : 0);\n    QString ct = ct_entries[ct_cursor];\n\n    // Add the arrows.\n    if (ct_cursor < nr_entries - 1)\n        ct.prepend('\\002');\n\n    if (ct_cursor > 0)\n        ct.prepend('\\001');\n\n    SendScintilla(SCI_CALLTIPSHOW, adjustedCallTipPosition(shift), ct.latin1());\n}\n\n\n// Shift the position of the call tip (to take any context into account) but\n// don't go before the start of the line.\nint QsciScintilla::adjustedCallTipPosition(int ctshift) const\n{\n    int ct = ctPos;\n\n    if (ctshift)\n    {\n        int ctmin = SendScintilla(SCI_POSITIONFROMLINE, SendScintilla(SCI_LINEFROMPOSITION, ct));\n\n        if (ct - ctshift < ctmin)\n            ct = ctmin;\n    }\n\n    return ct;\n}\n\n\n// Return the list of words that make up the context preceding the given\n// position.  The list will only have more than one element if there is a lexer\n// set and it defines start strings.  If so, then the last element might be\n// empty if a start string has just been typed.  On return pos is at the start\n// of the context.\nQStringList QsciScintilla::apiContext(int pos, int &context_start,\n        int &last_word_start)\n{\n    enum {\n        Either,\n        Separator,\n        Word\n    };\n\n    QStringList words;\n    int good_pos = pos, expecting = Either;\n\n    last_word_start = -1;\n\n    while (pos > 0)\n    {\n        if (getSeparator(pos))\n        {\n            if (expecting == Either)\n                words.prepend(QString());\n            else if (expecting == Word)\n                break;\n\n            good_pos = pos;\n            expecting = Word;\n        }\n        else\n        {\n            QString word = getWord(pos);\n\n            if (word.isEmpty() || expecting == Separator)\n                break;\n\n            words.prepend(word);\n            good_pos = pos;\n            expecting = Separator;\n\n            // Return the position of the start of the last word if required.\n            if (last_word_start < 0)\n                last_word_start = pos;\n        }\n\n        // Strip any preceding spaces (mainly around operators).\n        char ch;\n\n        while ((ch = getCharacter(pos)) != '\\0')\n        {\n            // This is the same definition of space that Scintilla uses.\n            if (ch != ' ' && (ch < 0x09 || ch > 0x0d))\n            {\n                ++pos;\n                break;\n            }\n        }\n    }\n\n    // A valid sequence always starts with a word and so should be expecting a\n    // separator.\n    if (expecting != Separator)\n        words.clear();\n\n    context_start = good_pos;\n\n    return words;\n}\n\n\n// Try and get a lexer's word separator from the text before the current\n// position.  Return true if one was found and adjust the position accordingly.\nbool QsciScintilla::getSeparator(int &pos) const\n{\n    int opos = pos;\n\n    // Go through each separator.\n    for (int i = 0; i < wseps.count(); ++i)\n    {\n        const QString &ws = wseps[i];\n\n        // Work backwards.\n        uint l;\n\n        for (l = ws.length(); l; --l)\n        {\n            char ch = getCharacter(pos);\n\n            if (ch == '\\0' || ws.at(l - 1) != ch)\n                break;\n        }\n\n        if (!l)\n            return true;\n\n        // Reset for the next separator.\n        pos = opos;\n    }\n\n    return false;\n}\n\n\n// Try and get a word from the text before the current position.  Return the\n// word if one was found and adjust the position accordingly.\nQString QsciScintilla::getWord(int &pos) const\n{\n    QString word;\n    bool numeric = true;\n    char ch;\n\n    while ((ch = getCharacter(pos)) != '\\0')\n    {\n        if (!isWordCharacter(ch))\n        {\n            ++pos;\n            break;\n        }\n\n        if (ch < '0' || ch > '9')\n            numeric = false;\n\n        word.prepend(ch);\n    }\n\n    // We don't auto-complete numbers.\n    if (numeric)\n        word.truncate(0);\n\n    return word;\n}\n\n\n// Get the \"next\" character (ie. the one before the current position) in the\n// current line.  The character will be '\\0' if there are no more.\nchar QsciScintilla::getCharacter(int &pos) const\n{\n    if (pos <= 0)\n        return '\\0';\n\n    char ch = SendScintilla(SCI_GETCHARAT, --pos);\n\n    // Don't go past the end of the previous line.\n    if (ch == '\\n' || ch == '\\r')\n    {\n        ++pos;\n        return '\\0';\n    }\n\n    return ch;\n}\n\n\n// See if a character is an auto-completion start character, ie. the last\n// character of a word separator.\nbool QsciScintilla::isStartChar(char ch) const\n{\n    QString s = QChar(ch);\n\n    for (int i = 0; i < wseps.count(); ++i)\n        if (wseps[i].endsWith(s))\n            return true;\n\n    return false;\n}\n\n\n// Possibly start auto-completion.\nvoid QsciScintilla::startAutoCompletion(AutoCompletionSource acs,\n        bool checkThresh, bool choose_single)\n{\n    int start, ignore;\n    QStringList context = apiContext(SendScintilla(SCI_GETCURRENTPOS), start,\n            ignore);\n\n    if (context.isEmpty())\n        return;\n\n    // Get the last word's raw data and length.\n    ScintillaBytes s = textAsBytes(context.last());\n    const char *last_data = ScintillaBytesConstData(s);\n    int last_len = s.length();\n\n    if (checkThresh && last_len < acThresh)\n        return;\n\n    // Generate the string representing the valid words to select from.\n    QStringList wlist;\n\n    if ((acs == AcsAll || acs == AcsAPIs) && !lex.isNull())\n    {\n        QsciAbstractAPIs *apis = lex->apis();\n\n        if (apis)\n            apis->updateAutoCompletionList(context, wlist);\n    }\n\n    if (acs == AcsAll || acs == AcsDocument)\n    {\n        int sflags = SCFIND_WORDSTART;\n\n        if (!SendScintilla(SCI_AUTOCGETIGNORECASE))\n            sflags |= SCFIND_MATCHCASE;\n\n        SendScintilla(SCI_SETSEARCHFLAGS, sflags);\n\n        int pos = 0;\n        int dlen = SendScintilla(SCI_GETLENGTH);\n        int caret = SendScintilla(SCI_GETCURRENTPOS);\n        int clen = caret - start;\n        char *orig_context = new char[clen + 1];\n\n        SendScintilla(SCI_GETTEXTRANGE, start, caret, orig_context);\n\n        for (;;)\n        {\n            int fstart;\n\n            SendScintilla(SCI_SETTARGETSTART, pos);\n            SendScintilla(SCI_SETTARGETEND, dlen);\n\n            if ((fstart = SendScintilla(SCI_SEARCHINTARGET, clen, orig_context)) < 0)\n                break;\n\n            // Move past the root part.\n            pos = fstart + clen;\n\n            // Skip if this is the context we are auto-completing.\n            if (pos == caret)\n                continue;\n\n            // Get the rest of this word.\n            QString w = last_data;\n\n            while (pos < dlen)\n            {\n                char ch = SendScintilla(SCI_GETCHARAT, pos);\n\n                if (!isWordCharacter(ch))\n                    break;\n\n                w += ch;\n                ++pos;\n            }\n\n            // Add the word if it isn't already there.\n            if (!w.isEmpty())\n            {\n                bool keep;\n\n                // If there are APIs then check if the word is already present\n                // as an API word (i.e. with a trailing space).\n                if (acs == AcsAll)\n                {\n                    QString api_w = w;\n                    api_w.append(' ');\n\n                    keep = (wlist.findIndex(api_w) < 0);\n                }\n                else\n                {\n                    keep = true;\n                }\n\n                if (keep && wlist.findIndex(w) < 0)\n                    wlist.append(w);\n            }\n        }\n\n        delete []orig_context;\n    }\n\n    if (wlist.isEmpty())\n        return;\n\n    wlist.sort();\n\n    SendScintilla(SCI_AUTOCSETCHOOSESINGLE, choose_single);\n    SendScintilla(SCI_AUTOCSETSEPARATOR, acSeparator);\n\n    ScintillaBytes wlist_s = textAsBytes(wlist.join(QChar(acSeparator)));\n    SendScintilla(SCI_AUTOCSHOW, last_len, ScintillaBytesConstData(wlist_s));\n}\n\n\n// Maintain the indentation of the previous line.\nvoid QsciScintilla::maintainIndentation(char ch, long pos)\n{\n    if (ch != '\\r' && ch != '\\n')\n        return;\n\n    int curr_line = SendScintilla(SCI_LINEFROMPOSITION, pos);\n\n    // Get the indentation of the preceding non-zero length line.\n    int ind = 0;\n\n    for (int line = curr_line - 1; line >= 0; --line)\n    {\n        if (SendScintilla(SCI_GETLINEENDPOSITION, line) >\n            SendScintilla(SCI_POSITIONFROMLINE, line))\n        {\n            ind = indentation(line);\n            break;\n        }\n    }\n\n    if (ind > 0)\n        autoIndentLine(pos, curr_line, ind);\n}\n\n\n// Implement auto-indentation.\nvoid QsciScintilla::autoIndentation(char ch, long pos)\n{\n    int curr_line = SendScintilla(SCI_LINEFROMPOSITION, pos);\n    int ind_width = indentWidth();\n    long curr_line_start = SendScintilla(SCI_POSITIONFROMLINE, curr_line);\n\n    const char *block_start = lex->blockStart();\n    bool start_single = (block_start && qstrlen(block_start) == 1);\n\n    const char *block_end = lex->blockEnd();\n    bool end_single = (block_end && qstrlen(block_end) == 1);\n\n    if (end_single && block_end[0] == ch)\n    {\n        if (!(lex->autoIndentStyle() & AiClosing) && rangeIsWhitespace(curr_line_start, pos - 1))\n            autoIndentLine(pos, curr_line, blockIndent(curr_line - 1) - ind_width);\n    }\n    else if (start_single && block_start[0] == ch)\n    {\n        // De-indent if we have already indented because the previous line was\n        // a start of block keyword.\n        if (!(lex->autoIndentStyle() & AiOpening) && curr_line > 0 && getIndentState(curr_line - 1) == isKeywordStart && rangeIsWhitespace(curr_line_start, pos - 1))\n            autoIndentLine(pos, curr_line, blockIndent(curr_line - 1) - ind_width);\n    }\n    else if (ch == '\\r' || ch == '\\n')\n    {\n        // Don't auto-indent the line (ie. preserve its existing indentation)\n        // if we have inserted a new line above by pressing return at the start\n        // of this line - in other words, if the previous line is empty.\n        long prev_line_length = SendScintilla(SCI_GETLINEENDPOSITION, curr_line - 1) - SendScintilla(SCI_POSITIONFROMLINE, curr_line - 1);\n\n        if (prev_line_length != 0)\n            autoIndentLine(pos, curr_line, blockIndent(curr_line - 1));\n    }\n}\n\n\n// Set the indentation for a line.\nvoid QsciScintilla::autoIndentLine(long pos, int line, int indent)\n{\n    if (indent < 0)\n        return;\n\n    long pos_before = SendScintilla(SCI_GETLINEINDENTPOSITION, line);\n    SendScintilla(SCI_SETLINEINDENTATION, line, indent);\n    long pos_after = SendScintilla(SCI_GETLINEINDENTPOSITION, line);\n    long new_pos = -1;\n\n    if (pos_after > pos_before)\n        new_pos = pos + (pos_after - pos_before);\n    else if (pos_after < pos_before && pos >= pos_after)\n        if (pos >= pos_before)\n            new_pos = pos + (pos_after - pos_before);\n        else\n            new_pos = pos_after;\n\n    if (new_pos >= 0)\n        SendScintilla(SCI_SETSEL, new_pos, new_pos);\n}\n\n\n// Return the indentation of the block defined by the given line (or something\n// significant before).\nint QsciScintilla::blockIndent(int line)\n{\n    if (line < 0)\n        return 0;\n\n    // Handle the trvial case.\n    if (!lex->blockStartKeyword() && !lex->blockStart() && !lex->blockEnd())\n        return indentation(line);\n\n    int line_limit = line - lex->blockLookback();\n\n    if (line_limit < 0)\n        line_limit = 0;\n\n    for (int l = line; l >= line_limit; --l)\n    {\n        IndentState istate = getIndentState(l);\n\n        if (istate != isNone)\n        {\n            int ind_width = indentWidth();\n            int ind = indentation(l);\n\n            if (istate == isBlockStart)\n            {\n                if (!(lex -> autoIndentStyle() & AiOpening))\n                    ind += ind_width;\n            }\n            else if (istate == isBlockEnd)\n            {\n                if (lex -> autoIndentStyle() & AiClosing)\n                    ind -= ind_width;\n\n                if (ind < 0)\n                    ind = 0;\n            }\n            else if (line == l)\n                ind += ind_width;\n\n            return ind;\n        }\n    }\n\n    return indentation(line);\n}\n\n\n// Return true if all characters starting at spos up to, but not including\n// epos, are spaces or tabs.\nbool QsciScintilla::rangeIsWhitespace(long spos, long epos)\n{\n    while (spos < epos)\n    {\n        char ch = SendScintilla(SCI_GETCHARAT, spos);\n\n        if (ch != ' ' && ch != '\\t')\n            return false;\n\n        ++spos;\n    }\n\n    return true;\n}\n\n\n// Returns the indentation state of a line.\nQsciScintilla::IndentState QsciScintilla::getIndentState(int line)\n{\n    IndentState istate;\n\n    // Get the styled text.\n    long spos = SendScintilla(SCI_POSITIONFROMLINE, line);\n    long epos = SendScintilla(SCI_POSITIONFROMLINE, line + 1);\n\n    char *text = new char[(epos - spos + 1) * 2];\n\n    SendScintilla(SCI_GETSTYLEDTEXT, spos, epos, text);\n\n    int style, bstart_off, bend_off;\n\n    // Block start/end takes precedence over keywords.\n    const char *bstart_words = lex->blockStart(&style);\n    bstart_off = findStyledWord(text, style, bstart_words);\n\n    const char *bend_words = lex->blockEnd(&style);\n    bend_off = findStyledWord(text, style, bend_words);\n\n    // If there is a block start but no block end characters then ignore it\n    // unless the block start is the last significant thing on the line, ie.\n    // assume Python-like blocking.\n    if (bstart_off >= 0 && !bend_words)\n        for (int i = bstart_off * 2; text[i] != '\\0'; i += 2)\n            if (!QChar(text[i]).isSpace())\n                return isNone;\n\n    if (bstart_off > bend_off)\n        istate = isBlockStart;\n    else if (bend_off > bstart_off)\n        istate = isBlockEnd;\n    else\n    {\n        const char *words = lex->blockStartKeyword(&style);\n\n        istate = (findStyledWord(text,style,words) >= 0) ? isKeywordStart : isNone;\n    }\n\n    delete[] text;\n\n    return istate;\n}\n\n\n// text is a pointer to some styled text (ie. a character byte followed by a\n// style byte).  style is a style number.  words is a space separated list of\n// words.  Returns the position in the text immediately after the last one of\n// the words with the style.  The reason we are after the last, and not the\n// first, occurance is that we are looking for words that start and end a block\n// where the latest one is the most significant.\nint QsciScintilla::findStyledWord(const char *text, int style,\n        const char *words)\n{\n    if (!words)\n        return -1;\n\n    // Find the range of text with the style we are looking for.\n    const char *stext;\n\n    for (stext = text; stext[1] != style; stext += 2)\n        if (stext[0] == '\\0')\n            return -1;\n\n    // Move to the last character.\n    const char *etext = stext;\n\n    while (etext[2] != '\\0')\n        etext += 2;\n\n    // Backtrack until we find the style.  There will be one.\n    while (etext[1] != style)\n        etext -= 2;\n\n    // Look for each word in turn.\n    while (words[0] != '\\0')\n    {\n        // Find the end of the word.\n        const char *eword = words;\n\n        while (eword[1] != ' ' && eword[1] != '\\0')\n            ++eword;\n\n        // Now search the text backwards.\n        const char *wp = eword;\n\n        for (const char *tp = etext; tp >= stext; tp -= 2)\n        {\n            if (tp[0] != wp[0] || tp[1] != style)\n            {\n                // Reset the search.\n                wp = eword;\n                continue;\n            }\n\n            // See if all the word has matched.\n            if (wp-- == words)\n                return ((tp - text) / 2) + (eword - words) + 1;\n        }\n\n        // Move to the start of the next word if there is one.\n        words = eword + 1;\n\n        if (words[0] == ' ')\n            ++words;\n    }\n\n    return -1;\n}\n\n\n// Return true if the code page is UTF8.\nbool QsciScintilla::isUtf8() const\n{\n    return (SendScintilla(SCI_GETCODEPAGE) == SC_CP_UTF8);\n}\n\n\n// Set the code page.\nvoid QsciScintilla::setUtf8(bool cp)\n{\n    SendScintilla(SCI_SETCODEPAGE, (cp ? SC_CP_UTF8 : 0));\n}\n\n\n// Return the end-of-line mode.\nQsciScintilla::EolMode QsciScintilla::eolMode() const\n{\n    return (EolMode)SendScintilla(SCI_GETEOLMODE);\n}\n\n\n// Set the end-of-line mode.\nvoid QsciScintilla::setEolMode(EolMode mode)\n{\n    SendScintilla(SCI_SETEOLMODE, mode);\n}\n\n\n// Convert the end-of-lines to a particular mode.\nvoid QsciScintilla::convertEols(EolMode mode)\n{\n    SendScintilla(SCI_CONVERTEOLS, mode);\n}\n\n\n// Return the edge colour.\nQColor QsciScintilla::edgeColor() const\n{\n    long res = SendScintilla(SCI_GETEDGECOLOUR);\n\n    return QColor((int)res, ((int)(res >> 8)) & 0x00ff, ((int)(res >> 16)) & 0x00ff);\n}\n\n\n// Set the edge colour.\nvoid QsciScintilla::setEdgeColor(const QColor &col)\n{\n    SendScintilla(SCI_SETEDGECOLOUR, col);\n}\n\n\n// Return the edge column.\nint QsciScintilla::edgeColumn() const\n{\n    return SendScintilla(SCI_GETEDGECOLUMN);\n}\n\n\n// Set the edge column.\nvoid QsciScintilla::setEdgeColumn(int colnr)\n{\n    SendScintilla(SCI_SETEDGECOLUMN, colnr);\n}\n\n\n// Return the edge mode.\nQsciScintilla::EdgeMode QsciScintilla::edgeMode() const\n{\n    return (EdgeMode)SendScintilla(SCI_GETEDGEMODE);\n}\n\n\n// Set the edge mode.\nvoid QsciScintilla::setEdgeMode(EdgeMode mode)\n{\n    SendScintilla(SCI_SETEDGEMODE, mode);\n}\n\n\n// Return the end-of-line visibility.\nbool QsciScintilla::eolVisibility() const\n{\n    return SendScintilla(SCI_GETVIEWEOL);\n}\n\n\n// Set the end-of-line visibility.\nvoid QsciScintilla::setEolVisibility(bool visible)\n{\n    SendScintilla(SCI_SETVIEWEOL, visible);\n}\n\n\n// Return the extra ascent.\nint QsciScintilla::extraAscent() const\n{\n    return SendScintilla(SCI_GETEXTRAASCENT);\n}\n\n\n// Set the extra ascent.\nvoid QsciScintilla::setExtraAscent(int extra)\n{\n    SendScintilla(SCI_SETEXTRAASCENT, extra);\n}\n\n\n// Return the extra descent.\nint QsciScintilla::extraDescent() const\n{\n    return SendScintilla(SCI_GETEXTRADESCENT);\n}\n\n\n// Set the extra descent.\nvoid QsciScintilla::setExtraDescent(int extra)\n{\n    SendScintilla(SCI_SETEXTRADESCENT, extra);\n}\n\n\n// Return the whitespace size.\nint QsciScintilla::whitespaceSize() const\n{\n    return SendScintilla(SCI_GETWHITESPACESIZE);\n}\n\n\n// Set the whitespace size.\nvoid QsciScintilla::setWhitespaceSize(int size)\n{\n    SendScintilla(SCI_SETWHITESPACESIZE, size);\n}\n\n\n// Set the whitespace background colour.\nvoid QsciScintilla::setWhitespaceBackgroundColor(const QColor &col)\n{\n    SendScintilla(SCI_SETWHITESPACEBACK, col.isValid(), col);\n}\n\n\n// Set the whitespace foreground colour.\nvoid QsciScintilla::setWhitespaceForegroundColor(const QColor &col)\n{\n    SendScintilla(SCI_SETWHITESPACEFORE, col.isValid(), col);\n}\n\n\n// Return the whitespace visibility.\nQsciScintilla::WhitespaceVisibility QsciScintilla::whitespaceVisibility() const\n{\n    return (WhitespaceVisibility)SendScintilla(SCI_GETVIEWWS);\n}\n\n\n// Set the whitespace visibility.\nvoid QsciScintilla::setWhitespaceVisibility(WhitespaceVisibility mode)\n{\n    SendScintilla(SCI_SETVIEWWS, mode);\n}\n\n\n// Return the line wrap mode.\nQsciScintilla::WrapMode QsciScintilla::wrapMode() const\n{\n    return (WrapMode)SendScintilla(SCI_GETWRAPMODE);\n}\n\n\n// Set the line wrap mode.\nvoid QsciScintilla::setWrapMode(WrapMode mode)\n{\n    SendScintilla(SCI_SETLAYOUTCACHE,\n            (mode == WrapNone ? SC_CACHE_CARET : SC_CACHE_DOCUMENT));\n    SendScintilla(SCI_SETWRAPMODE, mode);\n}\n\n\n// Return the line wrap indent mode.\nQsciScintilla::WrapIndentMode QsciScintilla::wrapIndentMode() const\n{\n    return (WrapIndentMode)SendScintilla(SCI_GETWRAPINDENTMODE);\n}\n\n\n// Set the line wrap indent mode.\nvoid QsciScintilla::setWrapIndentMode(WrapIndentMode mode)\n{\n    SendScintilla(SCI_SETWRAPINDENTMODE, mode);\n}\n\n\n// Set the line wrap visual flags.\nvoid QsciScintilla::setWrapVisualFlags(WrapVisualFlag endFlag,\n        WrapVisualFlag startFlag, int indent)\n{\n    int flags = SC_WRAPVISUALFLAG_NONE;\n    int loc = SC_WRAPVISUALFLAGLOC_DEFAULT;\n\n    switch (endFlag)\n    {\n    case WrapFlagByText:\n        flags |= SC_WRAPVISUALFLAG_END;\n        loc |= SC_WRAPVISUALFLAGLOC_END_BY_TEXT;\n        break;\n\n    case WrapFlagByBorder:\n        flags |= SC_WRAPVISUALFLAG_END;\n        break;\n\n    case WrapFlagInMargin:\n        flags |= SC_WRAPVISUALFLAG_MARGIN;\n        break;\n    }\n\n    switch (startFlag)\n    {\n    case WrapFlagByText:\n        flags |= SC_WRAPVISUALFLAG_START;\n        loc |= SC_WRAPVISUALFLAGLOC_START_BY_TEXT;\n        break;\n\n    case WrapFlagByBorder:\n        flags |= SC_WRAPVISUALFLAG_START;\n        break;\n\n    case WrapFlagInMargin:\n        flags |= SC_WRAPVISUALFLAG_MARGIN;\n        break;\n    }\n\n    SendScintilla(SCI_SETWRAPVISUALFLAGS, flags);\n    SendScintilla(SCI_SETWRAPVISUALFLAGSLOCATION, loc);\n    SendScintilla(SCI_SETWRAPSTARTINDENT, indent);\n}\n\n\n// Set the folding style.\nvoid QsciScintilla::setFolding(FoldStyle folding, int margin)\n{\n    fold = folding;\n    foldmargin = margin;\n\n    if (folding == NoFoldStyle)\n    {\n        SendScintilla(SCI_SETMARGINWIDTHN, margin, 0L);\n        return;\n    }\n\n    int mask = SendScintilla(SCI_GETMODEVENTMASK);\n    SendScintilla(SCI_SETMODEVENTMASK, mask | SC_MOD_CHANGEFOLD);\n\n    SendScintilla(SCI_SETFOLDFLAGS, SC_FOLDFLAG_LINEAFTER_CONTRACTED);\n\n    SendScintilla(SCI_SETMARGINTYPEN, margin, (long)SC_MARGIN_SYMBOL);\n    SendScintilla(SCI_SETMARGINMASKN, margin, SC_MASK_FOLDERS);\n    SendScintilla(SCI_SETMARGINSENSITIVEN, margin, 1);\n\n    // Set the marker symbols to use.\n    switch (folding)\n    {\n    case PlainFoldStyle:\n        setFoldMarker(SC_MARKNUM_FOLDEROPEN, SC_MARK_MINUS);\n        setFoldMarker(SC_MARKNUM_FOLDER, SC_MARK_PLUS);\n        setFoldMarker(SC_MARKNUM_FOLDERSUB);\n        setFoldMarker(SC_MARKNUM_FOLDERTAIL);\n        setFoldMarker(SC_MARKNUM_FOLDEREND);\n        setFoldMarker(SC_MARKNUM_FOLDEROPENMID);\n        setFoldMarker(SC_MARKNUM_FOLDERMIDTAIL);\n        break;\n\n    case CircledFoldStyle:\n        setFoldMarker(SC_MARKNUM_FOLDEROPEN, SC_MARK_CIRCLEMINUS);\n        setFoldMarker(SC_MARKNUM_FOLDER, SC_MARK_CIRCLEPLUS);\n        setFoldMarker(SC_MARKNUM_FOLDERSUB);\n        setFoldMarker(SC_MARKNUM_FOLDERTAIL);\n        setFoldMarker(SC_MARKNUM_FOLDEREND);\n        setFoldMarker(SC_MARKNUM_FOLDEROPENMID);\n        setFoldMarker(SC_MARKNUM_FOLDERMIDTAIL);\n        break;\n\n    case BoxedFoldStyle:\n        setFoldMarker(SC_MARKNUM_FOLDEROPEN, SC_MARK_BOXMINUS);\n        setFoldMarker(SC_MARKNUM_FOLDER, SC_MARK_BOXPLUS);\n        setFoldMarker(SC_MARKNUM_FOLDERSUB);\n        setFoldMarker(SC_MARKNUM_FOLDERTAIL);\n        setFoldMarker(SC_MARKNUM_FOLDEREND);\n        setFoldMarker(SC_MARKNUM_FOLDEROPENMID);\n        setFoldMarker(SC_MARKNUM_FOLDERMIDTAIL);\n        break;\n\n    case CircledTreeFoldStyle:\n        setFoldMarker(SC_MARKNUM_FOLDEROPEN, SC_MARK_CIRCLEMINUS);\n        setFoldMarker(SC_MARKNUM_FOLDER, SC_MARK_CIRCLEPLUS);\n        setFoldMarker(SC_MARKNUM_FOLDERSUB, SC_MARK_VLINE);\n        setFoldMarker(SC_MARKNUM_FOLDERTAIL, SC_MARK_LCORNERCURVE);\n        setFoldMarker(SC_MARKNUM_FOLDEREND, SC_MARK_CIRCLEPLUSCONNECTED);\n        setFoldMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_CIRCLEMINUSCONNECTED);\n        setFoldMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_TCORNERCURVE);\n        break;\n\n    case BoxedTreeFoldStyle:\n        setFoldMarker(SC_MARKNUM_FOLDEROPEN, SC_MARK_BOXMINUS);\n        setFoldMarker(SC_MARKNUM_FOLDER, SC_MARK_BOXPLUS);\n        setFoldMarker(SC_MARKNUM_FOLDERSUB, SC_MARK_VLINE);\n        setFoldMarker(SC_MARKNUM_FOLDERTAIL, SC_MARK_LCORNER);\n        setFoldMarker(SC_MARKNUM_FOLDEREND, SC_MARK_BOXPLUSCONNECTED);\n        setFoldMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_BOXMINUSCONNECTED);\n        setFoldMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_TCORNER);\n        break;\n    }\n\n    SendScintilla(SCI_SETMARGINWIDTHN, margin, defaultFoldMarginWidth);\n}\n\n\n// Clear all current folds.\nvoid QsciScintilla::clearFolds()\n{\n    recolor();\n\n    int maxLine = SendScintilla(SCI_GETLINECOUNT);\n\n    for (int line = 0; line < maxLine; line++)\n    {\n        int level = SendScintilla(SCI_GETFOLDLEVEL, line);\n\n        if (level & SC_FOLDLEVELHEADERFLAG)\n        {\n            SendScintilla(SCI_SETFOLDEXPANDED, line, 1);\n            foldExpand(line, true, false, 0, level);\n            line--;\n        }\n    }\n}\n\n\n// Set up a folder marker.\nvoid QsciScintilla::setFoldMarker(int marknr, int mark)\n{\n    SendScintilla(SCI_MARKERDEFINE, marknr, mark);\n\n    if (mark != SC_MARK_EMPTY)\n    {\n        SendScintilla(SCI_MARKERSETFORE, marknr, Qt::white);\n        SendScintilla(SCI_MARKERSETBACK, marknr, Qt::black);\n    }\n}\n\n\n// Handle a click in the fold margin.  This is mostly taken from SciTE.\nvoid QsciScintilla::foldClick(int lineClick, int bstate)\n{\n    bool shift = bstate & ShiftButton;\n    bool ctrl = bstate & ControlButton;\n\n    if (shift && ctrl)\n    {\n        foldAll();\n        return;\n    }\n\n    int levelClick = SendScintilla(SCI_GETFOLDLEVEL, lineClick);\n\n    if (levelClick & SC_FOLDLEVELHEADERFLAG)\n    {\n        if (shift)\n        {\n            // Ensure all children are visible.\n            SendScintilla(SCI_SETFOLDEXPANDED, lineClick, 1);\n            foldExpand(lineClick, true, true, 100, levelClick);\n        }\n        else if (ctrl)\n        {\n            if (SendScintilla(SCI_GETFOLDEXPANDED, lineClick))\n            {\n                // Contract this line and all its children.\n                SendScintilla(SCI_SETFOLDEXPANDED, lineClick, 0L);\n                foldExpand(lineClick, false, true, 0, levelClick);\n            }\n            else\n            {\n                // Expand this line and all its children.\n                SendScintilla(SCI_SETFOLDEXPANDED, lineClick, 1);\n                foldExpand(lineClick, true, true, 100, levelClick);\n            }\n        }\n        else\n        {\n            // Toggle this line.\n            SendScintilla(SCI_TOGGLEFOLD, lineClick);\n        }\n    }\n}\n\n\n// Do the hard work of hiding and showing lines.  This is mostly taken from\n// SciTE.\nvoid QsciScintilla::foldExpand(int &line, bool doExpand, bool force,\n        int visLevels, int level)\n{\n    int lineMaxSubord = SendScintilla(SCI_GETLASTCHILD, line,\n            level & SC_FOLDLEVELNUMBERMASK);\n\n    line++;\n\n    while (line <= lineMaxSubord)\n    {\n        if (force)\n        {\n            if (visLevels > 0)\n                SendScintilla(SCI_SHOWLINES, line, line);\n            else\n                SendScintilla(SCI_HIDELINES, line, line);\n        }\n        else if (doExpand)\n            SendScintilla(SCI_SHOWLINES, line, line);\n\n        int levelLine = level;\n\n        if (levelLine == -1)\n            levelLine = SendScintilla(SCI_GETFOLDLEVEL, line);\n\n        if (levelLine & SC_FOLDLEVELHEADERFLAG)\n        {\n            if (force)\n            {\n                if (visLevels > 1)\n                    SendScintilla(SCI_SETFOLDEXPANDED, line, 1);\n                else\n                    SendScintilla(SCI_SETFOLDEXPANDED, line, 0L);\n\n                foldExpand(line, doExpand, force, visLevels - 1);\n            }\n            else if (doExpand)\n            {\n                if (!SendScintilla(SCI_GETFOLDEXPANDED, line))\n                    SendScintilla(SCI_SETFOLDEXPANDED, line, 1);\n\n                foldExpand(line, true, force, visLevels - 1);\n            }\n            else\n                foldExpand(line, false, force, visLevels - 1);\n        }\n        else\n            line++;\n    }\n}\n\n\n// Fully expand (if there is any line currently folded) all text.  Otherwise,\n// fold all text.  This is mostly taken from SciTE.\nvoid QsciScintilla::foldAll(bool children)\n{\n    recolor();\n\n    int maxLine = SendScintilla(SCI_GETLINECOUNT);\n    bool expanding = true;\n\n    for (int lineSeek = 0; lineSeek < maxLine; lineSeek++)\n    {\n        if (SendScintilla(SCI_GETFOLDLEVEL,lineSeek) & SC_FOLDLEVELHEADERFLAG)\n        {\n            expanding = !SendScintilla(SCI_GETFOLDEXPANDED, lineSeek);\n            break;\n        }\n    }\n\n    for (int line = 0; line < maxLine; line++)\n    {\n        int level = SendScintilla(SCI_GETFOLDLEVEL, line);\n\n        if (!(level & SC_FOLDLEVELHEADERFLAG))\n            continue;\n\n        if (children ||\n            (SC_FOLDLEVELBASE == (level & SC_FOLDLEVELNUMBERMASK)))\n        {\n            if (expanding)\n            {\n                SendScintilla(SCI_SETFOLDEXPANDED, line, 1);\n                foldExpand(line, true, false, 0, level);\n                line--;\n            }\n            else\n            {\n                int lineMaxSubord = SendScintilla(SCI_GETLASTCHILD, line, -1);\n\n                SendScintilla(SCI_SETFOLDEXPANDED, line, 0L);\n\n                if (lineMaxSubord > line)\n                    SendScintilla(SCI_HIDELINES, line + 1, lineMaxSubord);\n            }\n        }\n    }\n}\n\n\n// Handle a fold change.  This is mostly taken from SciTE.\nvoid QsciScintilla::foldChanged(int line,int levelNow,int levelPrev)\n{\n    if (levelNow & SC_FOLDLEVELHEADERFLAG)\n    {\n        if (!(levelPrev & SC_FOLDLEVELHEADERFLAG))\n            SendScintilla(SCI_SETFOLDEXPANDED, line, 1);\n    }\n    else if (levelPrev & SC_FOLDLEVELHEADERFLAG)\n    {\n        if (!SendScintilla(SCI_GETFOLDEXPANDED, line))\n        {\n            // Removing the fold from one that has been contracted so should\n            // expand.  Otherwise lines are left invisible with no way to make\n            // them visible.\n            foldExpand(line, true, false, 0, levelPrev);\n        }\n    }\n}\n\n\n// Toggle the fold for a line if it contains a fold marker.\nvoid QsciScintilla::foldLine(int line)\n{\n    SendScintilla(SCI_TOGGLEFOLD, line);\n}\n\n\n// Return the list of folded lines.\nQValueList<int> QsciScintilla::contractedFolds() const\n{\n    QValueList<int> folds;\n    int linenr = 0, fold_line;\n\n    while ((fold_line = SendScintilla(SCI_CONTRACTEDFOLDNEXT, linenr)) >= 0)\n    {\n        folds.append(fold_line);\n        linenr = fold_line + 1;\n    }\n\n    return folds;\n}\n\n\n// Set the fold state from a list.\nvoid QsciScintilla::setContractedFolds(const QValueList<int> &folds)\n{\n    for (int i = 0; i < folds.count(); ++i)\n    {\n        int line = folds[i];\n        int last_line = SendScintilla(SCI_GETLASTCHILD, line, -1);\n\n        SendScintilla(SCI_SETFOLDEXPANDED, line, 0L);\n        SendScintilla(SCI_HIDELINES, line + 1, last_line);\n    }\n}\n\n\n// Handle the SCN_MODIFIED notification.\nvoid QsciScintilla::handleModified(int pos, int mtype, const char *text,\n        int len, int added, int line, int foldNow, int foldPrev, int token,\n        int annotationLinesAdded)\n{\n    if (mtype & SC_MOD_CHANGEFOLD)\n    {\n        if (fold)\n            foldChanged(line, foldNow, foldPrev);\n    }\n\n    if (mtype & (SC_MOD_INSERTTEXT | SC_MOD_DELETETEXT))\n    {\n        emit textChanged();\n\n        if (added != 0)\n            emit linesChanged();\n    }\n}\n\n\n// Zoom in a number of points.\nvoid QsciScintilla::zoomIn(int range)\n{\n    zoomTo(SendScintilla(SCI_GETZOOM) + range);\n}\n\n\n// Zoom in a single point.\nvoid QsciScintilla::zoomIn()\n{\n    SendScintilla(SCI_ZOOMIN);\n}\n\n\n// Zoom out a number of points.\nvoid QsciScintilla::zoomOut(int range)\n{\n    zoomTo(SendScintilla(SCI_GETZOOM) - range);\n}\n\n\n// Zoom out a single point.\nvoid QsciScintilla::zoomOut()\n{\n    SendScintilla(SCI_ZOOMOUT);\n}\n\n\n// Set the zoom to a number of points.\nvoid QsciScintilla::zoomTo(int size)\n{\n    if (size < -10)\n        size = -10;\n    else if (size > 20)\n        size = 20;\n\n    SendScintilla(SCI_SETZOOM, size);\n}\n\n\n// Find the first occurrence of a string.\nbool QsciScintilla::findFirst(const QString &expr, bool re, bool cs, bool wo,\n        bool wrap, bool forward, int line, int index, bool show, bool posix)\n{\n    if (expr.isEmpty())\n    {\n        findState.status = FindState::Idle;\n        return false;\n    }\n\n    findState.status = FindState::Finding;\n    findState.expr = expr;\n    findState.wrap = wrap;\n    findState.forward = forward;\n\n    findState.flags =\n        (cs ? SCFIND_MATCHCASE : 0) |\n        (wo ? SCFIND_WHOLEWORD : 0) |\n        (re ? SCFIND_REGEXP : 0) |\n        (posix ? SCFIND_POSIX : 0);\n\n    if (line < 0 || index < 0)\n        findState.startpos = SendScintilla(SCI_GETCURRENTPOS);\n    else\n        findState.startpos = positionFromLineIndex(line, index);\n\n    if (forward)\n        findState.endpos = SendScintilla(SCI_GETLENGTH);\n    else\n        findState.endpos = 0;\n\n    findState.show = show;\n\n    return doFind();\n}\n\n\n// Find the first occurrence of a string in the current selection.\nbool QsciScintilla::findFirstInSelection(const QString &expr, bool re, bool cs,\n        bool wo, bool forward, bool show, bool posix)\n{\n    if (expr.isEmpty())\n    {\n        findState.status = FindState::Idle;\n        return false;\n    }\n\n    findState.status = FindState::FindingInSelection;\n    findState.expr = expr;\n    findState.wrap = false;\n    findState.forward = forward;\n\n    findState.flags =\n        (cs ? SCFIND_MATCHCASE : 0) |\n        (wo ? SCFIND_WHOLEWORD : 0) |\n        (re ? SCFIND_REGEXP : 0) |\n        (posix ? SCFIND_POSIX : 0);\n\n    findState.startpos_orig = SendScintilla(SCI_GETSELECTIONSTART);\n    findState.endpos_orig = SendScintilla(SCI_GETSELECTIONEND);\n\n    if (forward)\n    {\n        findState.startpos = findState.startpos_orig;\n        findState.endpos = findState.endpos_orig;\n    }\n    else\n    {\n        findState.startpos = findState.endpos_orig;\n        findState.endpos = findState.startpos_orig;\n    }\n\n    findState.show = show;\n\n    return doFind();\n}\n\n\n// Find the next occurrence of a string.\nbool QsciScintilla::findNext()\n{\n    if (findState.status == FindState::Idle)\n        return false;\n\n    return doFind();\n}\n\n\n// Do the hard work of the find methods.\nbool QsciScintilla::doFind()\n{\n    SendScintilla(SCI_SETSEARCHFLAGS, findState.flags);\n\n    int pos = simpleFind();\n\n    // See if it was found.  If not and wraparound is wanted, try again.\n    if (pos == -1 && findState.wrap)\n    {\n        if (findState.forward)\n        {\n            findState.startpos = 0;\n            findState.endpos = SendScintilla(SCI_GETLENGTH);\n        }\n        else\n        {\n            findState.startpos = SendScintilla(SCI_GETLENGTH);\n            findState.endpos = 0;\n        }\n\n        pos = simpleFind();\n    }\n\n    if (pos == -1)\n    {\n        // Restore the original selection.\n        if (findState.status == FindState::FindingInSelection)\n            SendScintilla(SCI_SETSEL, findState.startpos_orig,\n                    findState.endpos_orig);\n\n        findState.status = FindState::Idle;\n        return false;\n    }\n\n    // It was found.\n    long targstart = SendScintilla(SCI_GETTARGETSTART);\n    long targend = SendScintilla(SCI_GETTARGETEND);\n\n    // Ensure the text found is visible if required.\n    if (findState.show)\n    {\n        int startLine = SendScintilla(SCI_LINEFROMPOSITION, targstart);\n        int endLine = SendScintilla(SCI_LINEFROMPOSITION, targend);\n\n        for (int i = startLine; i <= endLine; ++i)\n            SendScintilla(SCI_ENSUREVISIBLEENFORCEPOLICY, i);\n    }\n\n    // Now set the selection.\n    SendScintilla(SCI_SETSEL, targstart, targend);\n\n    // Finally adjust the start position so that we don't find the same one\n    // again.\n    if (findState.forward)\n        findState.startpos = targend;\n    else if ((findState.startpos = targstart - 1) < 0)\n        findState.startpos = 0;\n\n    return true;\n}\n\n\n// Do a simple find between the start and end positions.\nint QsciScintilla::simpleFind()\n{\n    if (findState.startpos == findState.endpos)\n        return -1;\n\n    SendScintilla(SCI_SETTARGETSTART, findState.startpos);\n    SendScintilla(SCI_SETTARGETEND, findState.endpos);\n\n    ScintillaBytes s = textAsBytes(findState.expr);\n\n    return SendScintilla(SCI_SEARCHINTARGET, s.length(),\n            ScintillaBytesConstData(s));\n}\n\n\n// Replace the text found with the previous find method.\nvoid QsciScintilla::replace(const QString &replaceStr)\n{\n    if (findState.status == FindState::Idle)\n        return;\n\n    long start = SendScintilla(SCI_GETSELECTIONSTART);\n    long orig_len = SendScintilla(SCI_GETSELECTIONEND) - start;\n\n    SendScintilla(SCI_TARGETFROMSELECTION);\n\n    int cmd = (findState.flags & SCFIND_REGEXP) ? SCI_REPLACETARGETRE : SCI_REPLACETARGET;\n\n    ScintillaBytes s = textAsBytes(replaceStr);\n    long len = SendScintilla(cmd, -1, ScintillaBytesConstData(s));\n\n    // Reset the selection.\n    SendScintilla(SCI_SETSELECTIONSTART, start);\n    SendScintilla(SCI_SETSELECTIONEND, start + len);\n\n    // Fix the original selection.\n    findState.endpos_orig += (len - orig_len);\n\n    if (findState.forward)\n        findState.startpos = start + len;\n}\n\n\n// Query the modified state.\nbool QsciScintilla::isModified() const\n{\n    return doc.isModified();\n}\n\n\n// Set the modified state.\nvoid QsciScintilla::setModified(bool m)\n{\n    if (!m)\n        SendScintilla(SCI_SETSAVEPOINT);\n}\n\n\n// Handle the SCN_INDICATORCLICK notification.\nvoid QsciScintilla::handleIndicatorClick(int pos, int modifiers)\n{\n    int state = mapModifiers(modifiers);\n    int line, index;\n\n    lineIndexFromPosition(pos, &line, &index);\n\n    emit indicatorClicked(line, index, (Qt::ButtonState)state);\n}\n\n\n// Handle the SCN_INDICATORRELEASE notification.\nvoid QsciScintilla::handleIndicatorRelease(int pos, int modifiers)\n{\n    int state = mapModifiers(modifiers);\n    int line, index;\n\n    lineIndexFromPosition(pos, &line, &index);\n\n    emit indicatorReleased(line, index, (Qt::ButtonState)state);\n}\n\n\n// Handle the SCN_MARGINCLICK notification.\nvoid QsciScintilla::handleMarginClick(int pos, int modifiers, int margin)\n{\n    int state = mapModifiers(modifiers);\n    int line = SendScintilla(SCI_LINEFROMPOSITION, pos);\n\n    if (fold && margin == foldmargin)\n        foldClick(line, state);\n    else\n        emit marginClicked(margin, line, (Qt::ButtonState)state);\n}\n\n\n// Handle the SCN_SAVEPOINTREACHED notification.\nvoid QsciScintilla::handleSavePointReached()\n{\n    doc.setModified(false);\n    emit modificationChanged(false);\n}\n\n\n// Handle the SCN_SAVEPOINTLEFT notification.\nvoid QsciScintilla::handleSavePointLeft()\n{\n    doc.setModified(true);\n    emit modificationChanged(true);\n}\n\n\n// Handle the QSCN_SELCHANGED signal.\nvoid QsciScintilla::handleSelectionChanged(bool yes)\n{\n    selText = yes;\n\n    emit copyAvailable(yes);\n    emit selectionChanged();\n}\n\n\n// Get the current selection.\nvoid QsciScintilla::getSelection(int *lineFrom, int *indexFrom, int *lineTo,\n        int *indexTo) const\n{\n    if (selText)\n    {\n        lineIndexFromPosition(SendScintilla(SCI_GETSELECTIONSTART), lineFrom,\n                indexFrom);\n        lineIndexFromPosition(SendScintilla(SCI_GETSELECTIONEND), lineTo,\n                indexTo);\n    }\n    else\n        *lineFrom = *indexFrom = *lineTo = *indexTo = -1;\n}\n\n\n// Sets the current selection.\nvoid QsciScintilla::setSelection(int lineFrom, int indexFrom, int lineTo,\n        int indexTo)\n{\n    SendScintilla(SCI_SETSEL, positionFromLineIndex(lineFrom, indexFrom),\n            positionFromLineIndex(lineTo, indexTo));\n}\n\n\n// Set the background colour of selected text.\nvoid QsciScintilla::setSelectionBackgroundColor(const QColor &col)\n{\n    int alpha = qAlpha(col.rgb());\n    \n    if (alpha == 255)\n        alpha = SC_ALPHA_NOALPHA;\n\n    SendScintilla(SCI_SETSELBACK, 1, col);\n    SendScintilla(SCI_SETSELALPHA, alpha);\n}\n\n\n// Set the foreground colour of selected text.\nvoid QsciScintilla::setSelectionForegroundColor(const QColor &col)\n{\n    SendScintilla(SCI_SETSELFORE, 1, col);\n}\n\n\n// Reset the background colour of selected text to the default.\nvoid QsciScintilla::resetSelectionBackgroundColor()\n{\n    SendScintilla(SCI_SETSELALPHA, SC_ALPHA_NOALPHA);\n    SendScintilla(SCI_SETSELBACK, 0UL);\n}\n\n\n// Reset the foreground colour of selected text to the default.\nvoid QsciScintilla::resetSelectionForegroundColor()\n{\n    SendScintilla(SCI_SETSELFORE, 0UL);\n}\n\n\n// Set the fill to the end-of-line for the selection.\nvoid QsciScintilla::setSelectionToEol(bool filled)\n{\n    SendScintilla(SCI_SETSELEOLFILLED, filled);\n}\n\n\n// Return the fill to the end-of-line for the selection.\nbool QsciScintilla::selectionToEol() const\n{\n    return SendScintilla(SCI_GETSELEOLFILLED);\n}\n\n\n// Set the width of the caret.\nvoid QsciScintilla::setCaretWidth(int width)\n{\n    SendScintilla(SCI_SETCARETWIDTH, width);\n}\n\n\n// Set the foreground colour of the caret.\nvoid QsciScintilla::setCaretForegroundColor(const QColor &col)\n{\n    SendScintilla(SCI_SETCARETFORE, col);\n}\n\n\n// Set the background colour of the line containing the caret.\nvoid QsciScintilla::setCaretLineBackgroundColor(const QColor &col)\n{\n    int alpha = qAlpha(col.rgb());\n\n    if (alpha == 255)\n        alpha = SC_ALPHA_NOALPHA;\n\n    SendScintilla(SCI_SETCARETLINEBACK, col);\n    SendScintilla(SCI_SETCARETLINEBACKALPHA, alpha);\n}\n\n\n// Set the state of the background colour of the line containing the caret.\nvoid QsciScintilla::setCaretLineVisible(bool enable)\n{\n    SendScintilla(SCI_SETCARETLINEVISIBLE, enable);\n}\n\n\n// Set the background colour of a hotspot area.\nvoid QsciScintilla::setHotspotBackgroundColor(const QColor &col)\n{\n    SendScintilla(SCI_SETSELBACK, 1, col);\n}\n\n\n// Set the foreground colour of a hotspot area.\nvoid QsciScintilla::setHotspotForegroundColor(const QColor &col)\n{\n    SendScintilla(SCI_SETHOTSPOTACTIVEFORE, 1, col);\n}\n\n\n// Reset the background colour of a hotspot area to the default.\nvoid QsciScintilla::resetHotspotBackgroundColor()\n{\n    SendScintilla(SCI_SETSELBACK, 0UL);\n}\n\n\n// Reset the foreground colour of a hotspot area to the default.\nvoid QsciScintilla::resetHotspotForegroundColor()\n{\n    SendScintilla(SCI_SETHOTSPOTACTIVEFORE, 0UL);\n}\n\n\n// Set the underline of a hotspot area.\nvoid QsciScintilla::setHotspotUnderline(bool enable)\n{\n    SendScintilla(SCI_SETHOTSPOTACTIVEUNDERLINE, enable);\n}\n\n\n// Set the wrapping of a hotspot area.\nvoid QsciScintilla::setHotspotWrap(bool enable)\n{\n    SendScintilla(SCI_SETHOTSPOTSINGLELINE, !enable);\n}\n\n\n// Query the read-only state.\nbool QsciScintilla::isReadOnly() const\n{\n    return SendScintilla(SCI_GETREADONLY);\n}\n\n\n// Set the read-only state.\nvoid QsciScintilla::setReadOnly(bool ro)\n{\n    SendScintilla(SCI_SETREADONLY, ro);\n}\n\n\n// Append the given text.\nvoid QsciScintilla::append(const QString &text)\n{\n    bool ro = ensureRW();\n\n    ScintillaBytes s = textAsBytes(text);\n    SendScintilla(SCI_APPENDTEXT, s.length(), ScintillaBytesConstData(s));\n\n    SendScintilla(SCI_EMPTYUNDOBUFFER);\n\n    setReadOnly(ro);\n}\n\n\n// Insert the given text at the current position.\nvoid QsciScintilla::insert(const QString &text)\n{\n    insertAtPos(text, -1);\n}\n\n\n// Insert the given text at the given line and offset.\nvoid QsciScintilla::insertAt(const QString &text, int line, int index)\n{\n    insertAtPos(text, positionFromLineIndex(line, index));\n}\n\n\n// Insert the given text at the given position.\nvoid QsciScintilla::insertAtPos(const QString &text, int pos)\n{\n    bool ro = ensureRW();\n\n    SendScintilla(SCI_BEGINUNDOACTION);\n    SendScintilla(SCI_INSERTTEXT, pos,\n            ScintillaBytesConstData(textAsBytes(text)));\n    SendScintilla(SCI_ENDUNDOACTION);\n\n    setReadOnly(ro);\n}\n\n\n// Begin a sequence of undoable actions.\nvoid QsciScintilla::beginUndoAction()\n{\n    SendScintilla(SCI_BEGINUNDOACTION);\n}\n\n\n// End a sequence of undoable actions.\nvoid QsciScintilla::endUndoAction()\n{\n    SendScintilla(SCI_ENDUNDOACTION);\n}\n\n\n// Redo a sequence of actions.\nvoid QsciScintilla::redo()\n{\n    SendScintilla(SCI_REDO);\n}\n\n\n// Undo a sequence of actions.\nvoid QsciScintilla::undo()\n{\n    SendScintilla(SCI_UNDO);\n}\n\n\n// See if there is something to redo.\nbool QsciScintilla::isRedoAvailable() const\n{\n    return SendScintilla(SCI_CANREDO);\n}\n\n\n// See if there is something to undo.\nbool QsciScintilla::isUndoAvailable() const\n{\n    return SendScintilla(SCI_CANUNDO);\n}\n\n\n// Return the number of lines.\nint QsciScintilla::lines() const\n{\n    return SendScintilla(SCI_GETLINECOUNT);\n}\n\n\n// Return the line at a position.\nint QsciScintilla::lineAt(const QPoint &pos) const\n{\n    long chpos = SendScintilla(SCI_POSITIONFROMPOINTCLOSE, pos.x(), pos.y());\n\n    if (chpos < 0)\n        return -1;\n\n    return SendScintilla(SCI_LINEFROMPOSITION, chpos);\n}\n\n\n// Return the length of a line.\nint QsciScintilla::lineLength(int line) const\n{\n    if (line < 0 || line >= SendScintilla(SCI_GETLINECOUNT))\n        return -1;\n\n    return SendScintilla(SCI_LINELENGTH, line);\n}\n\n\n// Return the length of the current text.\nint QsciScintilla::length() const\n{\n    return SendScintilla(SCI_GETTEXTLENGTH);\n}\n\n\n// Remove any selected text.\nvoid QsciScintilla::removeSelectedText()\n{\n    SendScintilla(SCI_REPLACESEL, \"\");\n}\n\n\n// Replace any selected text.\nvoid QsciScintilla::replaceSelectedText(const QString &text)\n{\n    SendScintilla(SCI_REPLACESEL, ScintillaBytesConstData(textAsBytes(text)));\n}\n\n\n// Return the current selected text.\nQString QsciScintilla::selectedText() const\n{\n    if (!selText)\n        return QString();\n\n    char *buf = new char[SendScintilla(SCI_GETSELECTIONEND) - SendScintilla(SCI_GETSELECTIONSTART) + 1];\n\n    SendScintilla(SCI_GETSELTEXT, buf);\n\n    QString qs = bytesAsText(buf);\n    delete[] buf;\n\n    return qs;\n}\n\n\n// Return the current text.\nQString QsciScintilla::text() const\n{\n    int buflen = length() + 1;\n    char *buf = new char[buflen];\n\n    SendScintilla(SCI_GETTEXT, buflen, buf);\n\n    QString qs = bytesAsText(buf);\n    delete[] buf;\n\n    return qs;\n}\n\n\n// Return the text of a line.\nQString QsciScintilla::text(int line) const\n{\n    int line_len = lineLength(line);\n\n    if (line_len < 1)\n        return QString();\n\n    char *buf = new char[line_len + 1];\n\n    SendScintilla(SCI_GETLINE, line, buf);\n    buf[line_len] = '\\0';\n\n    QString qs = bytesAsText(buf);\n    delete[] buf;\n\n    return qs;\n}\n\n\n// Set the given text.\nvoid QsciScintilla::setText(const QString &text)\n{\n    bool ro = ensureRW();\n\n    SendScintilla(SCI_SETTEXT, ScintillaBytesConstData(textAsBytes(text)));\n    SendScintilla(SCI_EMPTYUNDOBUFFER);\n\n    setReadOnly(ro);\n}\n\n\n// Get the cursor position\nvoid QsciScintilla::getCursorPosition(int *line, int *index) const\n{\n    lineIndexFromPosition(SendScintilla(SCI_GETCURRENTPOS), line, index);\n}\n\n\n// Set the cursor position\nvoid QsciScintilla::setCursorPosition(int line, int index)\n{\n    SendScintilla(SCI_GOTOPOS, positionFromLineIndex(line, index));\n}\n\n\n// Ensure the cursor is visible.\nvoid QsciScintilla::ensureCursorVisible()\n{\n    SendScintilla(SCI_SCROLLCARET);\n}\n\n\n// Ensure a line is visible.\nvoid QsciScintilla::ensureLineVisible(int line)\n{\n    SendScintilla(SCI_ENSUREVISIBLEENFORCEPOLICY, line);\n}\n\n\n// Copy text to the clipboard.\nvoid QsciScintilla::copy()\n{\n    SendScintilla(SCI_COPY);\n}\n\n\n// Cut text to the clipboard.\nvoid QsciScintilla::cut()\n{\n    SendScintilla(SCI_CUT);\n}\n\n\n// Paste text from the clipboard.\nvoid QsciScintilla::paste()\n{\n    SendScintilla(SCI_PASTE);\n}\n\n\n// Select all text, or deselect any selected text.\nvoid QsciScintilla::selectAll(bool select)\n{\n    if (select)\n        SendScintilla(SCI_SELECTALL);\n    else\n        SendScintilla(SCI_SETANCHOR, SendScintilla(SCI_GETCURRENTPOS));\n}\n\n\n// Delete all text.\nvoid QsciScintilla::clear()\n{\n    bool ro = ensureRW();\n\n    SendScintilla(SCI_BEGINUNDOACTION);\n    SendScintilla(SCI_CLEARALL);\n    SendScintilla(SCI_ENDUNDOACTION);\n\n    setReadOnly(ro);\n}\n\n\n// Return the indentation of a line.\nint QsciScintilla::indentation(int line) const\n{\n    return SendScintilla(SCI_GETLINEINDENTATION, line);\n}\n\n\n// Set the indentation of a line.\nvoid QsciScintilla::setIndentation(int line, int indentation)\n{\n    SendScintilla(SCI_BEGINUNDOACTION);\n    SendScintilla(SCI_SETLINEINDENTATION, line, indentation);\n    SendScintilla(SCI_ENDUNDOACTION);\n}\n\n\n// Indent a line.\nvoid QsciScintilla::indent(int line)\n{\n    setIndentation(line, indentation(line) + indentWidth());\n}\n\n\n// Unindent a line.\nvoid QsciScintilla::unindent(int line)\n{\n    int newIndent = indentation(line) - indentWidth();\n\n    if (newIndent < 0)\n        newIndent = 0;\n\n    setIndentation(line, newIndent);\n}\n\n\n// Return the indentation of the current line.\nint QsciScintilla::currentIndent() const\n{\n    return indentation(SendScintilla(SCI_LINEFROMPOSITION,\n                SendScintilla(SCI_GETCURRENTPOS)));\n}\n\n\n// Return the current indentation width.\nint QsciScintilla::indentWidth() const\n{\n    int w = indentationWidth();\n\n    if (w == 0)\n        w = tabWidth();\n\n    return w;\n}\n\n\n// Return the state of indentation guides.\nbool QsciScintilla::indentationGuides() const\n{\n    return (SendScintilla(SCI_GETINDENTATIONGUIDES) != SC_IV_NONE);\n}\n\n\n// Enable and disable indentation guides.\nvoid QsciScintilla::setIndentationGuides(bool enable)\n{\n    int iv;\n\n    if (!enable)\n        iv = SC_IV_NONE;\n    else if (lex.isNull())\n        iv = SC_IV_REAL;\n    else\n        iv = lex->indentationGuideView();\n\n    SendScintilla(SCI_SETINDENTATIONGUIDES, iv);\n}\n\n\n// Set the background colour of indentation guides.\nvoid QsciScintilla::setIndentationGuidesBackgroundColor(const QColor &col)\n{\n    SendScintilla(SCI_STYLESETBACK, STYLE_INDENTGUIDE, col);\n}\n\n\n// Set the foreground colour of indentation guides.\nvoid QsciScintilla::setIndentationGuidesForegroundColor(const QColor &col)\n{\n    SendScintilla(SCI_STYLESETFORE, STYLE_INDENTGUIDE, col);\n}\n\n\n// Return the indentation width.\nint QsciScintilla::indentationWidth() const\n{\n    return SendScintilla(SCI_GETINDENT);\n}\n\n\n// Set the indentation width.\nvoid QsciScintilla::setIndentationWidth(int width)\n{\n    SendScintilla(SCI_SETINDENT, width);\n}\n\n\n// Return the tab width.\nint QsciScintilla::tabWidth() const\n{\n    return SendScintilla(SCI_GETTABWIDTH);\n}\n\n\n// Set the tab width.\nvoid QsciScintilla::setTabWidth(int width)\n{\n    SendScintilla(SCI_SETTABWIDTH, width);\n}\n\n\n// Return the effect of the backspace key.\nbool QsciScintilla::backspaceUnindents() const\n{\n    return SendScintilla(SCI_GETBACKSPACEUNINDENTS);\n}\n\n\n// Set the effect of the backspace key.\nvoid QsciScintilla::setBackspaceUnindents(bool unindents)\n{\n    SendScintilla(SCI_SETBACKSPACEUNINDENTS, unindents);\n}\n\n\n// Return the effect of the tab key.\nbool QsciScintilla::tabIndents() const\n{\n    return SendScintilla(SCI_GETTABINDENTS);\n}\n\n\n// Set the effect of the tab key.\nvoid QsciScintilla::setTabIndents(bool indents)\n{\n    SendScintilla(SCI_SETTABINDENTS, indents);\n}\n\n\n// Return the indentation use of tabs.\nbool QsciScintilla::indentationsUseTabs() const\n{\n    return SendScintilla(SCI_GETUSETABS);\n}\n\n\n// Set the indentation use of tabs.\nvoid QsciScintilla::setIndentationsUseTabs(bool tabs)\n{\n    SendScintilla(SCI_SETUSETABS, tabs);\n}\n\n\n// Return the margin options.\nint QsciScintilla::marginOptions() const\n{\n    return SendScintilla(SCI_GETMARGINOPTIONS);\n}\n\n\n// Set the margin options.\nvoid QsciScintilla::setMarginOptions(int options)\n{\n    SendScintilla(SCI_SETMARGINOPTIONS, options);\n}\n\n\n// Return the margin type.\nQsciScintilla::MarginType QsciScintilla::marginType(int margin) const\n{\n    return (MarginType)SendScintilla(SCI_GETMARGINTYPEN, margin);\n}\n\n\n// Set the margin type.\nvoid QsciScintilla::setMarginType(int margin, QsciScintilla::MarginType type)\n{\n    SendScintilla(SCI_SETMARGINTYPEN, margin, type);\n}\n\n\n// Clear margin text.\nvoid QsciScintilla::clearMarginText(int line)\n{\n    if (line < 0)\n        SendScintilla(SCI_MARGINSETTEXT, line, (const char *)0);\n    else\n        SendScintilla(SCI_MARGINTEXTCLEARALL);\n}\n\n\n// Annotate a line.\nvoid QsciScintilla::setMarginText(int line, const QString &text, int style)\n{\n    int style_offset = SendScintilla(SCI_MARGINGETSTYLEOFFSET);\n\n    SendScintilla(SCI_MARGINSETTEXT, line,\n            ScintillaBytesConstData(textAsBytes(text)));\n\n    SendScintilla(SCI_MARGINSETSTYLE, line, style - style_offset);\n}\n\n\n// Annotate a line.\nvoid QsciScintilla::setMarginText(int line, const QString &text, const QsciStyle &style)\n{\n    style.apply(this);\n\n    setMarginText(line, text, style.style());\n}\n\n\n// Annotate a line.\nvoid QsciScintilla::setMarginText(int line, const QsciStyledText &text)\n{\n    text.apply(this);\n\n    setMarginText(line, text.text(), text.style());\n}\n\n\n// Annotate a line.\nvoid QsciScintilla::setMarginText(int line, const QValueList<QsciStyledText> &text)\n{\n    char *styles;\n    ScintillaBytes styled_text = styleText(text, &styles,\n            SendScintilla(SCI_MARGINGETSTYLEOFFSET));\n\n    SendScintilla(SCI_MARGINSETTEXT, line,\n            ScintillaBytesConstData(styled_text));\n    SendScintilla(SCI_MARGINSETSTYLES, line, styles);\n\n    delete[] styles;\n}\n\n\n// Return the state of line numbers in a margin.\nbool QsciScintilla::marginLineNumbers(int margin) const\n{\n    return SendScintilla(SCI_GETMARGINTYPEN, margin);\n}\n\n\n// Enable and disable line numbers in a margin.\nvoid QsciScintilla::setMarginLineNumbers(int margin, bool lnrs)\n{\n    SendScintilla(SCI_SETMARGINTYPEN, margin,\n            lnrs ? SC_MARGIN_NUMBER : SC_MARGIN_SYMBOL);\n}\n\n\n// Return the marker mask of a margin.\nint QsciScintilla::marginMarkerMask(int margin) const\n{\n    return SendScintilla(SCI_GETMARGINMASKN, margin);\n}\n\n\n// Set the marker mask of a margin.\nvoid QsciScintilla::setMarginMarkerMask(int margin,int mask)\n{\n    SendScintilla(SCI_SETMARGINMASKN, margin, mask);\n}\n\n\n// Return the state of a margin's sensitivity.\nbool QsciScintilla::marginSensitivity(int margin) const\n{\n    return SendScintilla(SCI_GETMARGINSENSITIVEN, margin);\n}\n\n\n// Enable and disable a margin's sensitivity.\nvoid QsciScintilla::setMarginSensitivity(int margin,bool sens)\n{\n    SendScintilla(SCI_SETMARGINSENSITIVEN, margin, sens);\n}\n\n\n// Return the width of a margin.\nint QsciScintilla::marginWidth(int margin) const\n{\n    return SendScintilla(SCI_GETMARGINWIDTHN, margin);\n}\n\n\n// Set the width of a margin.\nvoid QsciScintilla::setMarginWidth(int margin, int width)\n{\n    SendScintilla(SCI_SETMARGINWIDTHN, margin, width);\n}\n\n\n// Set the width of a margin to the width of some text.\nvoid QsciScintilla::setMarginWidth(int margin, const QString &s)\n{\n    int width = SendScintilla(SCI_TEXTWIDTH, STYLE_LINENUMBER,\n            ScintillaBytesConstData(textAsBytes(s)));\n\n    setMarginWidth(margin, width);\n}\n\n\n// Set the background colour of all margins.\nvoid QsciScintilla::setMarginsBackgroundColor(const QColor &col)\n{\n    handleStylePaperChange(col, STYLE_LINENUMBER);\n}\n\n\n// Set the foreground colour of all margins.\nvoid QsciScintilla::setMarginsForegroundColor(const QColor &col)\n{\n    handleStyleColorChange(col, STYLE_LINENUMBER);\n}\n\n\n// Set the font of all margins.\nvoid QsciScintilla::setMarginsFont(const QFont &f)\n{\n    setStylesFont(f, STYLE_LINENUMBER);\n}\n\n\n// Define an indicator.\nint QsciScintilla::indicatorDefine(IndicatorStyle style, int indicatorNumber)\n{\n    checkIndicator(indicatorNumber);\n\n    if (indicatorNumber >= 0)\n        SendScintilla(SCI_INDICSETSTYLE, indicatorNumber, static_cast<long>(style));\n\n    return indicatorNumber;\n}\n\n\n// Return the state of an indicator being drawn under the text.\nbool QsciScintilla::indicatorDrawUnder(int indicatorNumber) const\n{\n    if (indicatorNumber < 0 || indicatorNumber >= INDIC_MAX)\n        return false;\n\n    return SendScintilla(SCI_INDICGETUNDER, indicatorNumber);\n}\n\n\n// Set the state of indicators being drawn under the text.\nvoid QsciScintilla::setIndicatorDrawUnder(bool under, int indicatorNumber)\n{\n    if (indicatorNumber <= INDIC_MAX)\n    {\n        // We ignore allocatedIndicators to allow any indicators defined\n        // elsewhere (e.g. in lexers) to be set.\n        if (indicatorNumber < 0)\n        {\n            for (int i = 0; i <= INDIC_MAX; ++i)\n                SendScintilla(SCI_INDICSETUNDER, i, under);\n        }\n        else\n        {\n            SendScintilla(SCI_INDICSETUNDER, indicatorNumber, under);\n        }\n    }\n}\n\n\n// Set the indicator foreground colour.\nvoid QsciScintilla::setIndicatorForegroundColor(const QColor &col, int indicatorNumber)\n{\n    if (indicatorNumber <= INDIC_MAX)\n    {\n        int alpha = qAlpha(col.rgb());\n\n        // We ignore allocatedIndicators to allow any indicators defined\n        // elsewhere (e.g. in lexers) to be set.\n        if (indicatorNumber < 0)\n        {\n            for (int i = 0; i <= INDIC_MAX; ++i)\n            {\n                SendScintilla(SCI_INDICSETFORE, i, col);\n                SendScintilla(SCI_INDICSETALPHA, i, alpha);\n            }\n        }\n        else\n        {\n            SendScintilla(SCI_INDICSETFORE, indicatorNumber, col);\n            SendScintilla(SCI_INDICSETALPHA, indicatorNumber, alpha);\n        }\n    }\n}\n\n\n// Set the indicator outline colour.\nvoid QsciScintilla::setIndicatorOutlineColor(const QColor &col, int indicatorNumber)\n{\n    if (indicatorNumber <= INDIC_MAX)\n    {\n        int alpha = qAlpha(col.rgb());\n\n        // We ignore allocatedIndicators to allow any indicators defined\n        // elsewhere (e.g. in lexers) to be set.\n        if (indicatorNumber < 0)\n        {\n            for (int i = 0; i <= INDIC_MAX; ++i)\n                SendScintilla(SCI_INDICSETOUTLINEALPHA, i, alpha);\n        }\n        else\n        {\n            SendScintilla(SCI_INDICSETOUTLINEALPHA, indicatorNumber, alpha);\n        }\n    }\n}\n\n\n// Fill a range with an indicator.\nvoid QsciScintilla::fillIndicatorRange(int lineFrom, int indexFrom,\n        int lineTo, int indexTo, int indicatorNumber)\n{\n    if (indicatorNumber <= INDIC_MAX)\n    {\n        int start = positionFromLineIndex(lineFrom, indexFrom);\n        int finish = positionFromLineIndex(lineTo, indexTo);\n\n        // We ignore allocatedIndicators to allow any indicators defined\n        // elsewhere (e.g. in lexers) to be set.\n        if (indicatorNumber < 0)\n        {\n            for (int i = 0; i <= INDIC_MAX; ++i)\n            {\n                SendScintilla(SCI_SETINDICATORCURRENT, i);\n                SendScintilla(SCI_INDICATORFILLRANGE, start, finish - start);\n            }\n        }\n        else\n        {\n            SendScintilla(SCI_SETINDICATORCURRENT, indicatorNumber);\n            SendScintilla(SCI_INDICATORFILLRANGE, start, finish - start);\n        }\n    }\n}\n\n\n// Clear a range with an indicator.\nvoid QsciScintilla::clearIndicatorRange(int lineFrom, int indexFrom,\n        int lineTo, int indexTo, int indicatorNumber)\n{\n    if (indicatorNumber <= INDIC_MAX)\n    {\n        int start = positionFromLineIndex(lineFrom, indexFrom);\n        int finish = positionFromLineIndex(lineTo, indexTo);\n\n        // We ignore allocatedIndicators to allow any indicators defined\n        // elsewhere (e.g. in lexers) to be set.\n        if (indicatorNumber < 0)\n        {\n            for (int i = 0; i <= INDIC_MAX; ++i)\n            {\n                SendScintilla(SCI_SETINDICATORCURRENT, i);\n                SendScintilla(SCI_INDICATORCLEARRANGE, start, finish - start);\n            }\n        }\n        else\n        {\n            SendScintilla(SCI_SETINDICATORCURRENT, indicatorNumber);\n            SendScintilla(SCI_INDICATORCLEARRANGE, start, finish - start);\n        }\n    }\n}\n\n\n// Define a marker based on a symbol.\nint QsciScintilla::markerDefine(MarkerSymbol sym, int markerNumber)\n{\n    checkMarker(markerNumber);\n\n    if (markerNumber >= 0)\n        SendScintilla(SCI_MARKERDEFINE, markerNumber, static_cast<long>(sym));\n\n    return markerNumber;\n}\n\n\n// Define a marker based on a character.\nint QsciScintilla::markerDefine(char ch, int markerNumber)\n{\n    checkMarker(markerNumber);\n\n    if (markerNumber >= 0)\n        SendScintilla(SCI_MARKERDEFINE, markerNumber,\n                static_cast<long>(SC_MARK_CHARACTER) + ch);\n\n    return markerNumber;\n}\n\n\n// Define a marker based on a QPixmap.\nint QsciScintilla::markerDefine(const QPixmap &pm, int markerNumber)\n{\n    checkMarker(markerNumber);\n\n    if (markerNumber >= 0)\n        SendScintilla(SCI_MARKERDEFINEPIXMAP, markerNumber, pm);\n\n    return markerNumber;\n}\n\n\n// Define a marker based on a QImage.\nint QsciScintilla::markerDefine(const QImage &im, int markerNumber)\n{\n    checkMarker(markerNumber);\n\n    if (markerNumber >= 0)\n    {\n        SendScintilla(SCI_RGBAIMAGESETHEIGHT, im.height());\n        SendScintilla(SCI_RGBAIMAGESETWIDTH, im.width());\n        SendScintilla(SCI_MARKERDEFINERGBAIMAGE, markerNumber, im);\n    }\n\n    return markerNumber;\n}\n\n\n// Add a marker to a line.\nint QsciScintilla::markerAdd(int linenr, int markerNumber)\n{\n    if (markerNumber < 0 || markerNumber > MARKER_MAX || (allocatedMarkers & (1 << markerNumber)) == 0)\n        return -1;\n\n    return SendScintilla(SCI_MARKERADD, linenr, markerNumber);\n}\n\n\n// Get the marker mask for a line.\nunsigned QsciScintilla::markersAtLine(int linenr) const\n{\n    return SendScintilla(SCI_MARKERGET, linenr);\n}\n\n\n// Delete a marker from a line.\nvoid QsciScintilla::markerDelete(int linenr, int markerNumber)\n{\n    if (markerNumber <= MARKER_MAX)\n    {\n        if (markerNumber < 0)\n        {\n            unsigned am = allocatedMarkers;\n\n            for (int m = 0; m <= MARKER_MAX; ++m)\n            {\n                if (am & 1)\n                    SendScintilla(SCI_MARKERDELETE, linenr, m);\n\n                am >>= 1;\n            }\n        }\n        else if (allocatedMarkers & (1 << markerNumber))\n            SendScintilla(SCI_MARKERDELETE, linenr, markerNumber);\n    }\n}\n\n\n// Delete a marker from the text.\nvoid QsciScintilla::markerDeleteAll(int markerNumber)\n{\n    if (markerNumber <= MARKER_MAX)\n    {\n        if (markerNumber < 0)\n            SendScintilla(SCI_MARKERDELETEALL, -1);\n        else if (allocatedMarkers & (1 << markerNumber))\n            SendScintilla(SCI_MARKERDELETEALL, markerNumber);\n    }\n}\n\n\n// Delete a marker handle from the text.\nvoid QsciScintilla::markerDeleteHandle(int mhandle)\n{\n    SendScintilla(SCI_MARKERDELETEHANDLE, mhandle);\n}\n\n\n// Return the line containing a marker instance.\nint QsciScintilla::markerLine(int mhandle) const\n{\n    return SendScintilla(SCI_MARKERLINEFROMHANDLE, mhandle);\n}\n\n\n// Search forwards for a marker.\nint QsciScintilla::markerFindNext(int linenr, unsigned mask) const\n{\n    return SendScintilla(SCI_MARKERNEXT, linenr, mask);\n}\n\n\n// Search backwards for a marker.\nint QsciScintilla::markerFindPrevious(int linenr, unsigned mask) const\n{\n    return SendScintilla(SCI_MARKERPREVIOUS, linenr, mask);\n}\n\n\n// Set the marker background colour.\nvoid QsciScintilla::setMarkerBackgroundColor(const QColor &col, int markerNumber)\n{\n    if (markerNumber <= MARKER_MAX)\n    {\n        int alpha = qAlpha(col.rgb());\n\n        // An opaque background would make the text invisible.\n        if (alpha == 255)\n            alpha = SC_ALPHA_NOALPHA;\n\n        if (markerNumber < 0)\n        {\n            unsigned am = allocatedMarkers;\n\n            for (int m = 0; m <= MARKER_MAX; ++m)\n            {\n                if (am & 1)\n                {\n                    SendScintilla(SCI_MARKERSETBACK, m, col);\n                    SendScintilla(SCI_MARKERSETALPHA, m, alpha);\n                }\n\n                am >>= 1;\n            }\n        }\n        else if (allocatedMarkers & (1 << markerNumber))\n        {\n            SendScintilla(SCI_MARKERSETBACK, markerNumber, col);\n            SendScintilla(SCI_MARKERSETALPHA, markerNumber, alpha);\n        }\n    }\n}\n\n\n// Set the marker foreground colour.\nvoid QsciScintilla::setMarkerForegroundColor(const QColor &col, int markerNumber)\n{\n    if (markerNumber <= MARKER_MAX)\n    {\n        if (markerNumber < 0)\n        {\n            unsigned am = allocatedMarkers;\n\n            for (int m = 0; m <= MARKER_MAX; ++m)\n            {\n                if (am & 1)\n                    SendScintilla(SCI_MARKERSETFORE, m, col);\n\n                am >>= 1;\n            }\n        }\n        else if (allocatedMarkers & (1 << markerNumber))\n        {\n            SendScintilla(SCI_MARKERSETFORE, markerNumber, col);\n        }\n    }\n}\n\n\n// Check a marker, allocating a marker number if necessary.\nvoid QsciScintilla::checkMarker(int &markerNumber)\n{\n    allocateId(markerNumber, allocatedMarkers, 0, MARKER_MAX);\n}\n\n\n// Check an indicator, allocating an indicator number if necessary.\nvoid QsciScintilla::checkIndicator(int &indicatorNumber)\n{\n    allocateId(indicatorNumber, allocatedIndicators, INDIC_CONTAINER,\n            INDIC_MAX);\n}\n\n\n// Make sure an identifier is valid and allocate it if necessary.\nvoid QsciScintilla::allocateId(int &id, unsigned &allocated, int min, int max)\n{\n    if (id >= 0)\n    {\n        // Note that we allow existing identifiers to be explicitly redefined.\n        if (id > max)\n            id = -1;\n    }\n    else\n    {\n        unsigned aids = allocated >> min;\n\n        // Find the smallest unallocated identifier.\n        for (id = min; id <= max; ++id)\n        {\n            if ((aids & 1) == 0)\n                break;\n\n            aids >>= 1;\n        }\n    }\n\n    // Allocate the identifier if it is valid.\n    if (id >= 0)\n        allocated |= (1 << id);\n}\n\n\n// Reset the fold margin colours.\nvoid QsciScintilla::resetFoldMarginColors()\n{\n    SendScintilla(SCI_SETFOLDMARGINHICOLOUR, 0, 0L);\n    SendScintilla(SCI_SETFOLDMARGINCOLOUR, 0, 0L);\n}\n\n\n// Set the fold margin colours.\nvoid QsciScintilla::setFoldMarginColors(const QColor &fore, const QColor &back)\n{\n    SendScintilla(SCI_SETFOLDMARGINHICOLOUR, 1, fore);\n    SendScintilla(SCI_SETFOLDMARGINCOLOUR, 1, back);\n}\n\n\n// Set the call tips background colour.\nvoid QsciScintilla::setCallTipsBackgroundColor(const QColor &col)\n{\n    SendScintilla(SCI_CALLTIPSETBACK, col);\n}\n\n\n// Set the call tips foreground colour.\nvoid QsciScintilla::setCallTipsForegroundColor(const QColor &col)\n{\n    SendScintilla(SCI_CALLTIPSETFORE, col);\n}\n\n\n// Set the call tips highlight colour.\nvoid QsciScintilla::setCallTipsHighlightColor(const QColor &col)\n{\n    SendScintilla(SCI_CALLTIPSETFOREHLT, col);\n}\n\n\n// Set the matched brace background colour.\nvoid QsciScintilla::setMatchedBraceBackgroundColor(const QColor &col)\n{\n    SendScintilla(SCI_STYLESETBACK, STYLE_BRACELIGHT, col);\n}\n\n\n// Set the matched brace foreground colour.\nvoid QsciScintilla::setMatchedBraceForegroundColor(const QColor &col)\n{\n    SendScintilla(SCI_STYLESETFORE, STYLE_BRACELIGHT, col);\n}\n\n\n// Set the matched brace indicator.\nvoid QsciScintilla::setMatchedBraceIndicator(int indicatorNumber)\n{\n    SendScintilla(SCI_BRACEHIGHLIGHTINDICATOR, 1, indicatorNumber);\n}\n\n\n// Reset the matched brace indicator.\nvoid QsciScintilla::resetMatchedBraceIndicator()\n{\n    SendScintilla(SCI_BRACEHIGHLIGHTINDICATOR, 0, 0L);\n}\n\n\n// Set the unmatched brace background colour.\nvoid QsciScintilla::setUnmatchedBraceBackgroundColor(const QColor &col)\n{\n    SendScintilla(SCI_STYLESETBACK, STYLE_BRACEBAD, col);\n}\n\n\n// Set the unmatched brace foreground colour.\nvoid QsciScintilla::setUnmatchedBraceForegroundColor(const QColor &col)\n{\n    SendScintilla(SCI_STYLESETFORE, STYLE_BRACEBAD, col);\n}\n\n\n// Set the unmatched brace indicator.\nvoid QsciScintilla::setUnmatchedBraceIndicator(int indicatorNumber)\n{\n    SendScintilla(SCI_BRACEBADLIGHTINDICATOR, 1, indicatorNumber);\n}\n\n\n// Reset the unmatched brace indicator.\nvoid QsciScintilla::resetUnmatchedBraceIndicator()\n{\n    SendScintilla(SCI_BRACEBADLIGHTINDICATOR, 0, 0L);\n}\n\n\n// Detach any lexer.\nvoid QsciScintilla::detachLexer()\n{\n    if (!lex.isNull())\n    {\n        lex->setEditor(0);\n        lex->disconnect(this);\n\n        SendScintilla(SCI_STYLERESETDEFAULT);\n        SendScintilla(SCI_STYLECLEARALL);\n        SendScintilla(SCI_CLEARDOCUMENTSTYLE);\n    }\n}\n\n\n// Set the lexer.\nvoid QsciScintilla::setLexer(QsciLexer *lexer)\n{\n    // Detach any current lexer.\n    detachLexer();\n\n    // Connect up the new lexer.\n    lex = lexer;\n\n    if (lex)\n    {\n        if (lex->lexer())\n            SendScintilla(SCI_SETLEXERLANGUAGE, lex->lexer());\n        else\n            SendScintilla(SCI_SETLEXER, lex->lexerId());\n\n        lex->setEditor(this);\n\n        connect(lex,SIGNAL(colorChanged(const QColor &, int)),\n                SLOT(handleStyleColorChange(const QColor &, int)));\n        connect(lex,SIGNAL(eolFillChanged(bool, int)),\n                SLOT(handleStyleEolFillChange(bool, int)));\n        connect(lex,SIGNAL(fontChanged(const QFont &, int)),\n                SLOT(handleStyleFontChange(const QFont &, int)));\n        connect(lex,SIGNAL(paperChanged(const QColor &, int)),\n                SLOT(handleStylePaperChange(const QColor &, int)));\n        connect(lex,SIGNAL(propertyChanged(const char *, const char *)),\n                SLOT(handlePropertyChange(const char *, const char *)));\n\n        SendScintilla(SCI_SETPROPERTY, \"fold\", \"1\");\n        SendScintilla(SCI_SETPROPERTY, \"fold.html\", \"1\");\n\n        // Set the keywords.  Scintilla allows for sets numbered 0 to\n        // KEYWORDSET_MAX (although the lexers only seem to exploit 0 to\n        // KEYWORDSET_MAX - 1).  We number from 1 in line with SciTE's property\n        // files.\n        for (int k = 0; k <= KEYWORDSET_MAX; ++k)\n        {\n            const char *kw = lex -> keywords(k + 1);\n\n            if (!kw)\n                kw = \"\";\n\n            SendScintilla(SCI_SETKEYWORDS, k, kw);\n        }\n\n        // Initialise each style.  Do the default first so its (possibly\n        // incorrect) font setting gets reset when style 0 is set.\n        setLexerStyle(STYLE_DEFAULT);\n\n        int nrStyles = 1 << SendScintilla(SCI_GETSTYLEBITS);\n\n        for (int s = 0; s < nrStyles; ++s)\n            if (!lex->description(s).isNull())\n                setLexerStyle(s);\n\n        // Initialise the properties.\n        lex->refreshProperties();\n\n        // Set the auto-completion fillups and word separators.\n        setAutoCompletionFillupsEnabled(fillups_enabled);\n        wseps = lex->autoCompletionWordSeparators();\n\n        wchars = lex->wordCharacters();\n\n        if (!wchars)\n            wchars = defaultWordChars;\n\n        SendScintilla(SCI_AUTOCSETIGNORECASE, !lex->caseSensitive());\n\n        recolor();\n    }\n    else\n    {\n        SendScintilla(SCI_SETLEXER, SCLEX_CONTAINER);\n\n        setColor(nl_text_colour);\n        setPaper(nl_paper_colour);\n\n        SendScintilla(SCI_AUTOCSETFILLUPS, \"\");\n        SendScintilla(SCI_AUTOCSETIGNORECASE, false);\n        wseps.clear();\n        wchars = defaultWordChars;\n    }\n}\n\n\n// Set a particular style of the current lexer.\nvoid QsciScintilla::setLexerStyle(int style)\n{\n    handleStyleColorChange(lex->color(style), style);\n    handleStyleEolFillChange(lex->eolFill(style), style);\n    handleStyleFontChange(lex->font(style), style);\n    handleStylePaperChange(lex->paper(style), style);\n}\n\n\n// Get the current lexer.\nQsciLexer *QsciScintilla::lexer() const\n{\n    return lex;\n}\n\n\n// Handle a change in lexer style foreground colour.\nvoid QsciScintilla::handleStyleColorChange(const QColor &c, int style)\n{\n    SendScintilla(SCI_STYLESETFORE, style, c);\n}\n\n\n// Handle a change in lexer style end-of-line fill.\nvoid QsciScintilla::handleStyleEolFillChange(bool eolfill, int style)\n{\n    SendScintilla(SCI_STYLESETEOLFILLED, style, eolfill);\n}\n\n\n// Handle a change in lexer style font.\nvoid QsciScintilla::handleStyleFontChange(const QFont &f, int style)\n{\n    setStylesFont(f, style);\n\n    if (style == lex->braceStyle())\n    {\n        setStylesFont(f, STYLE_BRACELIGHT);\n        setStylesFont(f, STYLE_BRACEBAD);\n    }\n}\n\n\n// Set the font for a style.\nvoid QsciScintilla::setStylesFont(const QFont &f, int style)\n{\n    SendScintilla(SCI_STYLESETFONT, style, f.family().ascii());\n    SendScintilla(SCI_STYLESETSIZEFRACTIONAL, style,\n            long(f.pointSizeF() * SC_FONT_SIZE_MULTIPLIER));\n\n    // Pass the Qt weight via the back door.\n    SendScintilla(SCI_STYLESETWEIGHT, style, -f.weight());\n\n    SendScintilla(SCI_STYLESETITALIC, style, f.italic());\n    SendScintilla(SCI_STYLESETUNDERLINE, style, f.underline());\n\n    // Tie the font settings of the default style to that of style 0 (the style\n    // conventionally used for whitespace by lexers).  This is needed so that\n    // fold marks, indentations, edge columns etc are set properly.\n    if (style == 0)\n        setStylesFont(f, STYLE_DEFAULT);\n}\n\n\n// Handle a change in lexer style background colour.\nvoid QsciScintilla::handleStylePaperChange(const QColor &c, int style)\n{\n    SendScintilla(SCI_STYLESETBACK, style, c);\n}\n\n\n// Handle a change in lexer property.\nvoid QsciScintilla::handlePropertyChange(const char *prop, const char *val)\n{\n    SendScintilla(SCI_SETPROPERTY, prop, val);\n}\n\n\n// Handle a change to the user visible user interface.\nvoid QsciScintilla::handleUpdateUI(int)\n{\n    int newPos = SendScintilla(SCI_GETCURRENTPOS);\n\n    if (newPos != oldPos)\n    {\n        oldPos = newPos;\n\n        int line = SendScintilla(SCI_LINEFROMPOSITION, newPos);\n        int col = SendScintilla(SCI_GETCOLUMN, newPos);\n\n        emit cursorPositionChanged(line, col);\n    }\n\n    if (braceMode != NoBraceMatch)\n        braceMatch();\n}\n\n\n// Handle brace matching.\nvoid QsciScintilla::braceMatch()\n{\n    long braceAtCaret, braceOpposite;\n\n    findMatchingBrace(braceAtCaret, braceOpposite, braceMode);\n\n    if (braceAtCaret >= 0 && braceOpposite < 0)\n    {\n        SendScintilla(SCI_BRACEBADLIGHT, braceAtCaret);\n        SendScintilla(SCI_SETHIGHLIGHTGUIDE, 0UL);\n    }\n    else\n    {\n        char chBrace = SendScintilla(SCI_GETCHARAT, braceAtCaret);\n\n        SendScintilla(SCI_BRACEHIGHLIGHT, braceAtCaret, braceOpposite);\n\n        long columnAtCaret = SendScintilla(SCI_GETCOLUMN, braceAtCaret);\n        long columnOpposite = SendScintilla(SCI_GETCOLUMN, braceOpposite);\n\n        if (chBrace == ':')\n        {\n            long lineStart = SendScintilla(SCI_LINEFROMPOSITION, braceAtCaret);\n            long indentPos = SendScintilla(SCI_GETLINEINDENTPOSITION,\n                    lineStart);\n            long indentPosNext = SendScintilla(SCI_GETLINEINDENTPOSITION,\n                    lineStart + 1);\n\n            columnAtCaret = SendScintilla(SCI_GETCOLUMN, indentPos);\n\n            long columnAtCaretNext = SendScintilla(SCI_GETCOLUMN,\n                    indentPosNext);\n            long indentSize = SendScintilla(SCI_GETINDENT);\n\n            if (columnAtCaretNext - indentSize > 1)\n                columnAtCaret = columnAtCaretNext - indentSize;\n\n            if (columnOpposite == 0)\n                columnOpposite = columnAtCaret;\n        }\n\n        long column = columnAtCaret;\n\n        if (column > columnOpposite)\n            column = columnOpposite;\n\n        SendScintilla(SCI_SETHIGHLIGHTGUIDE, column);\n    }\n}\n\n\n// Check if the character at a position is a brace.\nlong QsciScintilla::checkBrace(long pos, int brace_style, bool &colonMode)\n{\n    long brace_pos = -1;\n    char ch = SendScintilla(SCI_GETCHARAT, pos);\n\n    if (ch == ':')\n    {\n        // A bit of a hack, we should really use a virtual.\n        if (!lex.isNull() && qstrcmp(lex->lexer(), \"python\") == 0)\n        {\n            brace_pos = pos;\n            colonMode = true;\n        }\n    }\n    else if (ch && strchr(\"[](){}<>\", ch))\n    {\n        if (brace_style < 0)\n            brace_pos = pos;\n        else\n        {\n            int style = SendScintilla(SCI_GETSTYLEAT, pos) & 0x1f;\n\n            if (style == brace_style)\n                brace_pos = pos;\n        }\n    }\n\n    return brace_pos;\n}\n\n\n// Find a brace and it's match.  Return true if the current position is inside\n// a pair of braces.\nbool QsciScintilla::findMatchingBrace(long &brace, long &other,BraceMatch mode)\n{\n    bool colonMode = false;\n    int brace_style = (lex.isNull() ? -1 : lex->braceStyle());\n\n    brace = -1;\n    other = -1;\n\n    long caretPos = SendScintilla(SCI_GETCURRENTPOS);\n\n    if (caretPos > 0)\n        brace = checkBrace(caretPos - 1, brace_style, colonMode);\n\n    bool isInside = false;\n\n    if (brace < 0 && mode == SloppyBraceMatch)\n    {\n        brace = checkBrace(caretPos, brace_style, colonMode);\n\n        if (brace >= 0 && !colonMode)\n            isInside = true;\n    }\n\n    if (brace >= 0)\n    {\n        if (colonMode)\n        {\n            // Find the end of the Python indented block.\n            long lineStart = SendScintilla(SCI_LINEFROMPOSITION, brace);\n            long lineMaxSubord = SendScintilla(SCI_GETLASTCHILD, lineStart, -1);\n\n            other = SendScintilla(SCI_GETLINEENDPOSITION, lineMaxSubord);\n        }\n        else\n            other = SendScintilla(SCI_BRACEMATCH, brace);\n\n        if (other > brace)\n            isInside = !isInside;\n    }\n\n    return isInside;\n}\n\n\n// Move to the matching brace.\nvoid QsciScintilla::moveToMatchingBrace()\n{\n    gotoMatchingBrace(false);\n}\n\n\n// Select to the matching brace.\nvoid QsciScintilla::selectToMatchingBrace()\n{\n    gotoMatchingBrace(true);\n}\n\n\n// Move to the matching brace and optionally select the text.\nvoid QsciScintilla::gotoMatchingBrace(bool select)\n{\n    long braceAtCaret;\n    long braceOpposite;\n\n    bool isInside = findMatchingBrace(braceAtCaret, braceOpposite,\n            SloppyBraceMatch);\n\n    if (braceOpposite >= 0)\n    {\n        // Convert the character positions into caret positions based on\n        // whether the caret position was inside or outside the braces.\n        if (isInside)\n        {\n            if (braceOpposite > braceAtCaret)\n                braceAtCaret++;\n            else\n                braceOpposite++;\n        }\n        else\n        {\n            if (braceOpposite > braceAtCaret)\n                braceOpposite++;\n            else\n                braceAtCaret++;\n        }\n\n        ensureLineVisible(SendScintilla(SCI_LINEFROMPOSITION, braceOpposite));\n\n        if (select)\n            SendScintilla(SCI_SETSEL, braceAtCaret, braceOpposite);\n        else\n            SendScintilla(SCI_SETSEL, braceOpposite, braceOpposite);\n    }\n}\n\n\n// Return a position from a line number and an index within the line.\nint QsciScintilla::positionFromLineIndex(int line, int index) const\n{\n    int pos = SendScintilla(SCI_POSITIONFROMLINE, line);\n\n    // Allow for multi-byte characters.\n    for(int i = 0; i < index; i++)\n        pos = SendScintilla(SCI_POSITIONAFTER, pos);\n\n    return pos;\n}\n\n\n// Return a line number and an index within the line from a position.\nvoid QsciScintilla::lineIndexFromPosition(int position, int *line, int *index) const\n{\n    int lin = SendScintilla(SCI_LINEFROMPOSITION, position);\n    int linpos = SendScintilla(SCI_POSITIONFROMLINE, lin);\n    int indx = 0;\n\n    // Allow for multi-byte characters.\n    while (linpos < position)\n    {\n        int new_linpos = SendScintilla(SCI_POSITIONAFTER, linpos);\n\n        // If the position hasn't moved then we must be at the end of the text\n        // (which implies that the position passed was beyond the end of the\n        // text).\n        if (new_linpos == linpos)\n            break;\n\n        linpos = new_linpos;\n        ++indx;\n    }\n\n    *line = lin;\n    *index = indx;\n}\n\n\n// Set the source of the automatic auto-completion list.\nvoid QsciScintilla::setAutoCompletionSource(AutoCompletionSource source)\n{\n    acSource = source;\n}\n\n\n// Set the threshold for automatic auto-completion.\nvoid QsciScintilla::setAutoCompletionThreshold(int thresh)\n{\n    acThresh = thresh;\n}\n\n\n// Set the auto-completion word separators if there is no current lexer.\nvoid QsciScintilla::setAutoCompletionWordSeparators(const QStringList &separators)\n{\n    if (lex.isNull())\n        wseps = separators;\n}\n\n\n// Explicitly auto-complete from all sources.\nvoid QsciScintilla::autoCompleteFromAll()\n{\n    startAutoCompletion(AcsAll, false, use_single != AcusNever);\n}\n\n\n// Explicitly auto-complete from the APIs.\nvoid QsciScintilla::autoCompleteFromAPIs()\n{\n    startAutoCompletion(AcsAPIs, false, use_single != AcusNever);\n}\n\n\n// Explicitly auto-complete from the document.\nvoid QsciScintilla::autoCompleteFromDocument()\n{\n    startAutoCompletion(AcsDocument, false, use_single != AcusNever);\n}\n\n\n// Check if a character can be in a word.\nbool QsciScintilla::isWordCharacter(char ch) const\n{\n    return (strchr(wchars, ch) != NULL);\n}\n\n\n// Return the set of valid word characters.\nconst char *QsciScintilla::wordCharacters() const\n{\n    return wchars;\n}\n\n\n// Recolour the document.\nvoid QsciScintilla::recolor(int start, int end)\n{\n    SendScintilla(SCI_COLOURISE, start, end);\n}\n\n\n// Registered a QPixmap image.\nvoid QsciScintilla::registerImage(int id, const QPixmap &pm)\n{\n    SendScintilla(SCI_REGISTERIMAGE, id, pm);\n}\n\n\n// Registered a QImage image.\nvoid QsciScintilla::registerImage(int id, const QImage &im)\n{\n    SendScintilla(SCI_RGBAIMAGESETHEIGHT, im.height());\n    SendScintilla(SCI_RGBAIMAGESETWIDTH, im.width());\n    SendScintilla(SCI_REGISTERRGBAIMAGE, id, im);\n}\n\n\n// Clear all registered images.\nvoid QsciScintilla::clearRegisteredImages()\n{\n    SendScintilla(SCI_CLEARREGISTEREDIMAGES);\n}\n\n\n// Enable auto-completion fill-ups.\nvoid QsciScintilla::setAutoCompletionFillupsEnabled(bool enable)\n{\n    const char *fillups;\n\n    if (!enable)\n        fillups = \"\";\n    else if (!lex.isNull())\n        fillups = lex->autoCompletionFillups();\n    else\n        fillups = explicit_fillups.data();\n\n    SendScintilla(SCI_AUTOCSETFILLUPS, fillups);\n\n    fillups_enabled = enable;\n}\n\n\n// See if auto-completion fill-ups are enabled.\nbool QsciScintilla::autoCompletionFillupsEnabled() const\n{\n    return fillups_enabled;\n}\n\n\n// Set the fill-up characters for auto-completion if there is no current lexer.\nvoid QsciScintilla::setAutoCompletionFillups(const char *fillups)\n{\n    explicit_fillups = fillups;\n    setAutoCompletionFillupsEnabled(fillups_enabled);\n}\n\n\n// Set the case sensitivity for auto-completion.\nvoid QsciScintilla::setAutoCompletionCaseSensitivity(bool cs)\n{\n    SendScintilla(SCI_AUTOCSETIGNORECASE, !cs);\n}\n\n\n// Return the case sensitivity for auto-completion.\nbool QsciScintilla::autoCompletionCaseSensitivity() const\n{\n    return !SendScintilla(SCI_AUTOCGETIGNORECASE);\n}\n\n\n// Set the replace word mode for auto-completion.\nvoid QsciScintilla::setAutoCompletionReplaceWord(bool replace)\n{\n    SendScintilla(SCI_AUTOCSETDROPRESTOFWORD, replace);\n}\n\n\n// Return the replace word mode for auto-completion.\nbool QsciScintilla::autoCompletionReplaceWord() const\n{\n    return SendScintilla(SCI_AUTOCGETDROPRESTOFWORD);\n}\n\n\n// Set the single item mode for auto-completion.\nvoid QsciScintilla::setAutoCompletionUseSingle(AutoCompletionUseSingle single)\n{\n    use_single = single;\n}\n\n\n// Return the single item mode for auto-completion.\nQsciScintilla::AutoCompletionUseSingle QsciScintilla::autoCompletionUseSingle() const\n{\n    return use_single;\n}\n\n\n// Set the single item mode for auto-completion (deprecated).\nvoid QsciScintilla::setAutoCompletionShowSingle(bool single)\n{\n    use_single = (single ? AcusExplicit : AcusNever);\n}\n\n\n// Return the single item mode for auto-completion (deprecated).\nbool QsciScintilla::autoCompletionShowSingle() const\n{\n    return (use_single != AcusNever);\n}\n\n\n// Set current call tip position.\nvoid QsciScintilla::setCallTipsPosition(CallTipsPosition position)\n{\n    SendScintilla(SCI_CALLTIPSETPOSITION, (position == CallTipsAboveText));\n    call_tips_position = position;\n}\n\n\n// Set current call tip style.\nvoid QsciScintilla::setCallTipsStyle(CallTipsStyle style)\n{\n    call_tips_style = style;\n}\n\n\n// Set maximum number of call tips displayed.\nvoid QsciScintilla::setCallTipsVisible(int nr)\n{\n    maxCallTips = nr;\n}\n\n\n// Set the document to display.\nvoid QsciScintilla::setDocument(const QsciDocument &document)\n{\n    if (doc.pdoc != document.pdoc)\n    {\n        doc.undisplay(this);\n        doc.attach(document);\n        doc.display(this,&document);\n    }\n}\n\n\n// Ensure the document is read-write and return true if was was read-only.\nbool QsciScintilla::ensureRW()\n{\n    bool ro = isReadOnly();\n\n    if (ro)\n        setReadOnly(false);\n\n    return ro;\n}\n\n\n// Return the number of the first visible line.\nint QsciScintilla::firstVisibleLine() const\n{\n    return SendScintilla(SCI_GETFIRSTVISIBLELINE);\n}\n\n\n// Set the number of the first visible line.\nvoid QsciScintilla::setFirstVisibleLine(int linenr)\n{\n    SendScintilla(SCI_SETFIRSTVISIBLELINE, linenr);\n}\n\n\n// Return the height in pixels of the text in a particular line.\nint QsciScintilla::textHeight(int linenr) const\n{\n    return SendScintilla(SCI_TEXTHEIGHT, linenr);\n}\n\n\n// See if auto-completion or user list is active.\nbool QsciScintilla::isListActive() const\n{\n    return SendScintilla(SCI_AUTOCACTIVE);\n}\n\n\n// Cancel any current auto-completion or user list.\nvoid QsciScintilla::cancelList()\n{\n    SendScintilla(SCI_AUTOCCANCEL);\n}\n\n\n// Handle a selection from the auto-completion list.\nvoid QsciScintilla::handleAutoCompletionSelection()\n{\n    if (!lex.isNull())\n    {\n        QsciAbstractAPIs *apis = lex->apis();\n\n        if (apis)\n            apis->autoCompletionSelected(acSelection);\n    }\n}\n\n\n// Display a user list.\nvoid QsciScintilla::showUserList(int id, const QStringList &list)\n{\n    // Sanity check to make sure auto-completion doesn't get confused.\n    if (id <= 0)\n        return;\n\n    SendScintilla(SCI_AUTOCSETSEPARATOR, userSeparator);\n\n    ScintillaBytes s = textAsBytes(list.join(QChar(userSeparator)));\n    SendScintilla(SCI_USERLISTSHOW, id, ScintillaBytesConstData(s));\n}\n\n\n// Translate the SCN_USERLISTSELECTION notification into something more useful.\nvoid QsciScintilla::handleUserListSelection(const char *text, int id)\n{\n    emit userListActivated(id, QString(text));\n\n}\n\n\n// Return the case sensitivity of any lexer.\nbool QsciScintilla::caseSensitive() const\n{\n    return lex.isNull() ? true : lex->caseSensitive();\n}\n\n\n// Return true if the current list is an auto-completion list rather than a\n// user list.\nbool QsciScintilla::isAutoCompletionList() const\n{\n    return (SendScintilla(SCI_AUTOCGETSEPARATOR) == acSeparator);\n}\n\n\n// Read the text from a QIODevice.\nbool QsciScintilla::read(QIODevice *io)\n{\n    const int min_size = 1024 * 8;\n\n    int buf_size = min_size;\n    char *buf = new char[buf_size];\n\n    int data_len = 0;\n    bool ok = true;\n\n    Q_LONG part;\n\n    // Read the whole lot in so we don't have to worry about character\n    // boundaries.\n    do\n    {\n        // Make sure there is a minimum amount of room.\n        if (buf_size - data_len < min_size)\n        {\n            buf_size *= 2;\n            char *new_buf = new char[buf_size * 2];\n\n            memcpy(new_buf, buf, data_len);\n            delete[] buf;\n            buf = new_buf;\n        }\n\n        part = io->readBlock(buf + data_len, buf_size - data_len - 1);\n\n        data_len += part;\n    }\n    while (part > 0);\n\n    if (part < 0)\n        ok = false;\n    else\n    {\n        buf[data_len] = '\\0';\n\n        bool ro = ensureRW();\n\n        SendScintilla(SCI_SETTEXT, buf);\n        SendScintilla(SCI_EMPTYUNDOBUFFER);\n\n        setReadOnly(ro);\n    }\n\n    delete[] buf;\n\n    return ok;\n}\n\n\n// Write the text to a QIODevice.\nbool QsciScintilla::write(QIODevice *io) const\n{\n    const char *buf = reinterpret_cast<const char *>(SendScintillaPtrResult(SCI_GETCHARACTERPOINTER));\n\n    const char *bp = buf;\n    uint buflen = qstrlen(buf);\n\n    while (buflen > 0)\n    {\n        Q_LONG part = io->writeBlock(bp, buflen);\n\n        if (part < 0)\n            return false;\n\n        bp += part;\n        buflen -= part;\n    }\n\n    return true;\n}\n\n\n// Return the word at the given coordinates.\nQString QsciScintilla::wordAtLineIndex(int line, int index) const\n{\n    return wordAtPosition(positionFromLineIndex(line, index));\n}\n\n\n// Return the word at the given coordinates.\nQString QsciScintilla::wordAtPoint(const QPoint &point) const\n{\n    long close_pos = SendScintilla(SCI_POSITIONFROMPOINTCLOSE, point.x(),\n            point.y());\n\n    return wordAtPosition(close_pos);\n}\n\n\n// Return the word at the given position.\nQString QsciScintilla::wordAtPosition(int position) const\n{\n    if (position < 0)\n        return QString();\n\n    long start_pos = SendScintilla(SCI_WORDSTARTPOSITION, position, true);\n    long end_pos = SendScintilla(SCI_WORDENDPOSITION, position, true);\n    int word_len = end_pos - start_pos;\n\n    if (word_len <= 0)\n        return QString();\n\n    char *buf = new char[word_len + 1];\n    SendScintilla(SCI_GETTEXTRANGE, start_pos, end_pos, buf);\n    QString word = bytesAsText(buf);\n    delete[] buf;\n\n    return word;\n}\n\n\n// Return the display style for annotations.\nQsciScintilla::AnnotationDisplay QsciScintilla::annotationDisplay() const\n{\n    return (AnnotationDisplay)SendScintilla(SCI_ANNOTATIONGETVISIBLE);\n}\n\n\n// Set the display style for annotations.\nvoid QsciScintilla::setAnnotationDisplay(QsciScintilla::AnnotationDisplay display)\n{\n    SendScintilla(SCI_ANNOTATIONSETVISIBLE, display);\n    setScrollBars();\n}\n\n\n// Clear annotations.\nvoid QsciScintilla::clearAnnotations(int line)\n{\n    if (line >= 0)\n        SendScintilla(SCI_ANNOTATIONSETTEXT, line, (const char *)0);\n    else\n        SendScintilla(SCI_ANNOTATIONCLEARALL);\n\n    setScrollBars();\n}\n\n\n// Annotate a line.\nvoid QsciScintilla::annotate(int line, const QString &text, int style)\n{\n    int style_offset = SendScintilla(SCI_ANNOTATIONGETSTYLEOFFSET);\n\n    ScintillaBytes s = textAsBytes(text);\n\n    SendScintilla(SCI_ANNOTATIONSETTEXT, line, ScintillaBytesConstData(s));\n    SendScintilla(SCI_ANNOTATIONSETSTYLE, line, style - style_offset);\n\n    setScrollBars();\n}\n\n\n// Annotate a line.\nvoid QsciScintilla::annotate(int line, const QString &text, const QsciStyle &style)\n{\n    style.apply(this);\n\n    annotate(line, text, style.style());\n}\n\n\n// Annotate a line.\nvoid QsciScintilla::annotate(int line, const QsciStyledText &text)\n{\n    text.apply(this);\n\n    annotate(line, text.text(), text.style());\n}\n\n\n// Annotate a line.\nvoid QsciScintilla::annotate(int line, const QValueList<QsciStyledText> &text)\n{\n    char *styles;\n    ScintillaBytes styled_text = styleText(text, &styles,\n            SendScintilla(SCI_ANNOTATIONGETSTYLEOFFSET));\n\n    SendScintilla(SCI_ANNOTATIONSETTEXT, line,\n            ScintillaBytesConstData(styled_text));\n    SendScintilla(SCI_ANNOTATIONSETSTYLES, line, styles);\n\n    delete[] styles;\n}\n\n\n// Get the annotation for a line, if any.\nQString QsciScintilla::annotation(int line) const\n{\n    char *buf = new char[SendScintilla(SCI_ANNOTATIONGETTEXT, line, (const char *)0) + 1];\n\n    buf[SendScintilla(SCI_ANNOTATIONGETTEXT, line, buf)] = '\\0';\n\n    QString qs = bytesAsText(buf);\n    delete[] buf;\n\n    return qs;\n}\n\n\n// Convert a list of styled text to the low-level arrays.\nQsciScintillaBase::ScintillaBytes QsciScintilla::styleText(const QValueList<QsciStyledText> &styled_text, char **styles, int style_offset)\n{\n    QString text;\n    int i;\n\n    // Build the full text.\n    for (i = 0; i < styled_text.count(); ++i)\n    {\n        const QsciStyledText &st = styled_text[i];\n\n        st.apply(this);\n\n        text.append(st.text());\n    }\n\n    ScintillaBytes s = textAsBytes(text);\n\n    // There is a style byte for every byte.\n    char *sp = *styles = new char[s.length()];\n\n    for (i = 0; i < styled_text.count(); ++i)\n    {\n        const QsciStyledText &st = styled_text[i];\n        ScintillaBytes part = textAsBytes(st.text());\n        int part_length = part.length();\n\n        for (int c = 0; c < part_length; ++c)\n            *sp++ = (char)(st.style() - style_offset);\n    }\n\n    return s;\n}\n\n\n// Convert Scintilla modifiers to the Qt equivalent.\nint QsciScintilla::mapModifiers(int modifiers)\n{\n    int state = 0;\n\n    if (modifiers & SCMOD_SHIFT)\n        state |= Qt::ShiftButton;\n\n    if (modifiers & SCMOD_CTRL)\n        state |= Qt::ControlButton;\n\n    if (modifiers & SCMOD_ALT)\n        state |= Qt::AltButton;\n\n    if (modifiers & (SCMOD_SUPER | SCMOD_META))\n        state |= Qt::MetaButton;\n\n    return state;\n}\n\n\n// We no longer add features to the Qt3 version if it is a hassle.\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qsciscintillabase.cpp",
    "content": "// This module implements the \"official\" low-level API.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qsciscintillabase.h\"\n\n#include <qapplication.h>\n#include <qclipboard.h>\n#include <qcolor.h>\n#include <qscrollbar.h>\n#include <qtextcodec.h>\n\n#include <qdragobject.h>\n#include <qevent.h>\n#include <qlayout.h>\n#include <qpainter.h>\n#include <qptrlist.h>\n\n#include \"ScintillaQt.h\"\n\n\n// The #defines in Scintilla.h and the enums in qsciscintillabase.h conflict\n// (because we want to use the same names) so we have to undefine those we use\n// in this file.\n#undef  SCI_SETCARETPERIOD\n#undef  SCK_DOWN\n#undef  SCK_UP\n#undef  SCK_LEFT\n#undef  SCK_RIGHT\n#undef  SCK_HOME\n#undef  SCK_END\n#undef  SCK_PRIOR\n#undef  SCK_NEXT\n#undef  SCK_DELETE\n#undef  SCK_INSERT\n#undef  SCK_ESCAPE\n#undef  SCK_BACK\n#undef  SCK_TAB\n#undef  SCK_RETURN\n#undef  SCK_ADD\n#undef  SCK_SUBTRACT\n#undef  SCK_DIVIDE\n#undef  SCK_WIN\n#undef  SCK_RWIN\n#undef  SCK_MENU\n\n\n// Remember if we have linked the lexers.\nstatic bool lexersLinked = false;\n\n// The list of instances.\nstatic QPtrList<QsciScintillaBase> poolList;\n\n\n// The ctor.\nQsciScintillaBase::QsciScintillaBase(QWidget *parent, const char *name,\n        WFlags f)\n    : QWidget(parent, name, f)\n{\n    QGridLayout *layout = new QGridLayout(this, 2, 2);\n\n    txtarea = new QWidget(this, 0, WRepaintNoErase|WResizeNoErase);\n    txtarea->setSizePolicy(QSizePolicy(QSizePolicy::Expanding,\n                QSizePolicy::Expanding));\n    txtarea->setMouseTracking(true);\n    txtarea->setAcceptDrops(true);\n    txtarea->setFocusPolicy(WheelFocus);\n    txtarea->setFocusProxy(this);\n    layout->addWidget(txtarea, 0, 0);\n\n    vsb = new QScrollBar(Vertical, this);\n    layout->addWidget(vsb, 0, 1);\n    connect(vsb, SIGNAL(valueChanged(int)), SLOT(handleVSb(int)));\n\n    hsb = new QScrollBar(Horizontal, this);\n    layout->addWidget(hsb, 1, 0);\n    connect(hsb, SIGNAL(valueChanged(int)), SLOT(handleHSb(int)));\n\n    txtarea->installEventFilter(this);\n\n    setFocusPolicy(WheelFocus);\n\n#if (QT_VERSION >= 0x040200 && QT_VERSION < 0x050000 && defined(Q_OS_MAC)) || (QT_VERSION >= 0x050200 && defined(Q_OS_OSX))\n    initialiseRectangularPasteboardMime();\n#endif\n\n    sci = new QsciScintillaQt(this);\n\n    SendScintilla(SCI_SETCARETPERIOD, QApplication::cursorFlashTime() / 2);\n\n    // Make sure the lexers are linked in.\n    if (!lexersLinked)\n    {\n        Scintilla_LinkLexers();\n        lexersLinked = true;\n    }\n\n    QClipboard *cb = QApplication::clipboard();\n\n    if (cb->supportsSelection())\n        connect(cb, SIGNAL(selectionChanged()), SLOT(handleSelection()));\n\n    // Add it to the pool.\n    poolList.append(this);\n}\n\n\n// The dtor.\nQsciScintillaBase::~QsciScintillaBase()\n{\n    // Remove it from the pool.\n    poolList.remove(this);\n\n    delete sci;\n}\n\n\n// Return an instance from the pool.\nQsciScintillaBase *QsciScintillaBase::pool()\n{\n    return poolList.first();\n}\n\n\n// Tell Scintilla to update the scroll bars.  Scintilla should be doing this\n// itself.\nvoid QsciScintillaBase::setScrollBars()\n{\n    sci->SetScrollBars();\n}\n\n\n// Return the horizontal scrollbar widget.\nQScrollBar *QsciScintillaBase::horizontalScrollBar() const\n{\n    return hsb;\n}\n\n\n// Return the vertical scrollbar widget.\nQScrollBar *QsciScintillaBase::verticalScrollBar() const\n{\n    return vsb;\n}\n\n\n// Return the viewport widget.\nQWidget *QsciScintillaBase::viewport() const\n{\n    return txtarea;\n}\n\n\n// Handle events on behalf of the text area.\nbool QsciScintillaBase::eventFilter(QObject *o, QEvent *e)\n{\n    if (o != txtarea)\n        return QWidget::eventFilter(o, e);\n\n    bool used = true;\n\n    switch (e->type())\n    {\n    case QEvent::ContextMenu:\n        contextMenuEvent(static_cast<QContextMenuEvent *>(e));\n        break;\n\n    case QEvent::DragEnter:\n        dragEnterEvent(static_cast<QDragEnterEvent *>(e));\n        break;\n\n    case QEvent::DragLeave:\n        dragLeaveEvent(static_cast<QDragLeaveEvent *>(e));\n        break;\n\n    case QEvent::DragMove:\n        dragMoveEvent(static_cast<QDragMoveEvent *>(e));\n        break;\n\n    case QEvent::Drop:\n        dropEvent(static_cast<QDropEvent *>(e));\n        break;\n\n    case QEvent::MouseButtonDblClick:\n        mouseDoubleClickEvent(static_cast<QMouseEvent *>(e));\n        break;\n\n    case QEvent::MouseButtonPress:\n        mousePressEvent(static_cast<QMouseEvent *>(e));\n        break;\n\n    case QEvent::MouseButtonRelease:\n        mouseReleaseEvent(static_cast<QMouseEvent *>(e));\n        break;\n\n    case QEvent::MouseMove:\n        mouseMoveEvent(static_cast<QMouseEvent *>(e));\n        break;\n\n    case QEvent::Paint:\n        paintEvent(static_cast<QPaintEvent *>(e));\n        break;\n\n    case QEvent::Resize:\n        resizeEvent(static_cast<QResizeEvent *>(e));\n        break;\n\n    case QEvent::Wheel:\n        {\n            QWheelEvent *we = static_cast<QWheelEvent *>(e);\n\n            setFocus();\n\n            if (we->orientation() == Horizontal || we->state() & ShiftButton)\n                QApplication::sendEvent(hsb, we);\n            else if (we->orientation() == Vertical)\n                QApplication::sendEvent(vsb, we);\n\n            break;\n        }\n\n    default:\n        used = false;\n    }\n\n    return used;\n}\n\n\n// Send a message to the real Scintilla widget using the low level Scintilla\n// API.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, unsigned long wParam,\n        long lParam) const\n{\n    return sci->WndProc(msg, wParam, lParam);\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, unsigned long wParam,\n        void *lParam) const\n{\n    return sci->WndProc(msg, wParam, reinterpret_cast<sptr_t>(lParam));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, unsigned long wParam,\n        const char *lParam) const\n{\n    return sci->WndProc(msg, wParam, reinterpret_cast<sptr_t>(lParam));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg,\n        const char *lParam) const\n{\n    return sci->WndProc(msg, static_cast<uptr_t>(0),\n            reinterpret_cast<sptr_t>(lParam));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, const char *wParam,\n        const char *lParam) const\n{\n    return sci->WndProc(msg, reinterpret_cast<uptr_t>(wParam),\n            reinterpret_cast<sptr_t>(lParam));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, long wParam) const\n{\n    return sci->WndProc(msg, static_cast<uptr_t>(wParam),\n            static_cast<sptr_t>(0));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, int wParam) const\n{\n    return sci->WndProc(msg, static_cast<uptr_t>(wParam),\n            static_cast<sptr_t>(0));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, long cpMin, long cpMax,\n        char *lpstrText) const\n{\n    QSCI_SCI_NAMESPACE(TextRange) tr;\n\n    tr.chrg.cpMin = cpMin;\n    tr.chrg.cpMax = cpMax;\n    tr.lpstrText = lpstrText;\n\n    return sci->WndProc(msg, static_cast<uptr_t>(0),\n            reinterpret_cast<sptr_t>(&tr));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, unsigned long wParam,\n        const QColor &col) const\n{\n    sptr_t lParam = (col.blue() << 16) | (col.green() << 8) | col.red();\n\n    return sci->WndProc(msg, wParam, lParam);\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, const QColor &col) const\n{\n    uptr_t wParam = (col.blue() << 16) | (col.green() << 8) | col.red();\n\n    return sci->WndProc(msg, wParam, static_cast<sptr_t>(0));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, unsigned long wParam,\n        QPainter *hdc, const QRect &rc, long cpMin, long cpMax) const\n{\n    QSCI_SCI_NAMESPACE(RangeToFormat) rf;\n\n    rf.hdc = rf.hdcTarget = reinterpret_cast<QSCI_SCI_NAMESPACE(SurfaceID)>(hdc);\n\n    rf.rc.left = rc.left();\n    rf.rc.top = rc.top();\n    rf.rc.right = rc.right() + 1;\n    rf.rc.bottom = rc.bottom() + 1;\n\n    rf.chrg.cpMin = cpMin;\n    rf.chrg.cpMax = cpMax;\n\n    return sci->WndProc(msg, wParam, reinterpret_cast<sptr_t>(&rf));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, unsigned long wParam,\n        const QPixmap &lParam) const\n{\n    return sci->WndProc(msg, wParam, reinterpret_cast<sptr_t>(&lParam));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, unsigned long wParam,\n        const QImage &lParam) const\n{\n    return sci->WndProc(msg, wParam, reinterpret_cast<sptr_t>(&lParam));\n}\n\n\n// Send a message to the real Scintilla widget using the low level Scintilla\n// API that returns a pointer result.\nvoid *QsciScintillaBase::SendScintillaPtrResult(unsigned int msg) const\n{\n    return reinterpret_cast<void *>(sci->WndProc(msg, static_cast<uptr_t>(0),\n            static_cast<sptr_t>(0)));\n}\n\n\n// Handle the timer on behalf of the QsciScintillaQt instance.\nvoid QsciScintillaBase::handleTimer()\n{\n    sci->Tick();\n}\n\n\n// Re-implemented to handle the context menu.\nvoid QsciScintillaBase::contextMenuEvent(QContextMenuEvent *e)\n{\n    sci->ContextMenu(QSCI_SCI_NAMESPACE(Point)(e->globalX(), e->globalY()));\n}\n\n\n// Re-implemented to tell the widget it has the focus.\nvoid QsciScintillaBase::focusInEvent(QFocusEvent *e)\n{\n    sci->SetFocusState(true);\n\n#if QT_VERSION >= 0x050000\n    clickCausedFocus = (e->reason() == Qt::MouseFocusReason);\n#endif\n\n    QWidget::focusInEvent(e);\n}\n\n\n// Re-implemented to tell the widget it has lost the focus.\nvoid QsciScintillaBase::focusOutEvent(QFocusEvent *e)\n{\n    // Only tell Scintilla we have lost focus if the new active window isn't\n    // our auto-completion list.  This is probably only an issue on Linux and\n    // there are still problems because subsequent focus out events don't\n    // always seem to get generated (at least with Qt5).\n\n    {\n        QWidget *aw = qApp->activeWindow();\n\n        if (!aw || aw->parent() != this || !aw->inherits(\"QsciSciListBox\"))\n            sci->SetFocusState(false);\n    }\n\n    QWidget::focusOutEvent(e);\n}\n\n\n// Re-implemented to make sure tabs are passed to the editor.\nbool QsciScintillaBase::focusNextPrevChild(bool next)\n{\n    if (!sci->pdoc->IsReadOnly())\n        return false;\n\n    return QWidget::focusNextPrevChild(next);\n}\n\n\n// Handle the selection changing.\nvoid QsciScintillaBase::handleSelection()\n{\n    if (!QApplication::clipboard()->ownsSelection())\n        sci->UnclaimSelection();\n}\n\n\n// Handle key presses.\nvoid QsciScintillaBase::keyPressEvent(QKeyEvent *e)\n{\n    int modifiers = 0;\n\n    if (e->state() & Qt::ShiftButton)\n        modifiers |= SCMOD_SHIFT;\n\n    if (e->state() & Qt::ControlButton)\n        modifiers |= SCMOD_CTRL;\n\n    if (e->state() & Qt::AltButton)\n        modifiers |= SCMOD_ALT;\n\n    if (e->state() & Qt::MetaButton)\n        modifiers |= SCMOD_META;\n\n    int key = commandKey(e->key(), modifiers);\n\n    if (key)\n    {\n        bool consumed = false;\n\n        sci->KeyDownWithModifiers(key, modifiers, &consumed);\n\n        if (consumed)\n        {\n            e->accept();\n            return;\n        }\n    }\n\n    QString text = e->text();\n\n    if (!text.isEmpty() && text[0].isPrint())\n    {\n        ScintillaBytes bytes = textAsBytes(text);\n        sci->AddCharUTF(bytes.data(), bytes.length());\n        e->accept();\n    }\n    else\n    {\n        QWidget::keyPressEvent(e);\n    }\n}\n\n\n// Map a Qt key to a valid Scintilla command key, or 0 if none.\nint QsciScintillaBase::commandKey(int qt_key, int &modifiers)\n{\n    int key;\n\n    switch (qt_key)\n    {\n    case Qt::Key_Down:\n        key = SCK_DOWN;\n        break;\n\n    case Qt::Key_Up:\n        key = SCK_UP;\n        break;\n\n    case Qt::Key_Left:\n        key = SCK_LEFT;\n        break;\n\n    case Qt::Key_Right:\n        key = SCK_RIGHT;\n        break;\n\n    case Qt::Key_Home:\n        key = SCK_HOME;\n        break;\n\n    case Qt::Key_End:\n        key = SCK_END;\n        break;\n\n    case Qt::Key_Prior:\n        key = SCK_PRIOR;\n        break;\n\n    case Qt::Key_Next:\n        key = SCK_NEXT;\n        break;\n\n    case Qt::Key_Delete:\n        key = SCK_DELETE;\n        break;\n\n    case Qt::Key_Insert:\n        key = SCK_INSERT;\n        break;\n\n    case Qt::Key_Escape:\n        key = SCK_ESCAPE;\n        break;\n\n    case Qt::Key_Backspace:\n        key = SCK_BACK;\n        break;\n\n    case Qt::Key_Tab:\n        key = SCK_TAB;\n        break;\n\n    case Qt::Key_Backtab:\n        // Scintilla assumes a backtab is shift-tab.\n        key = SCK_TAB;\n        modifiers |= SCMOD_SHIFT;\n        break;\n\n    case Qt::Key_Return:\n    case Qt::Key_Enter:\n        key = SCK_RETURN;\n        break;\n\n    case Qt::Key_Super_L:\n        key = SCK_WIN;\n        break;\n\n    case Qt::Key_Super_R:\n        key = SCK_RWIN;\n        break;\n\n    case Qt::Key_Menu:\n        key = SCK_MENU;\n        break;\n\n    default:\n        if ((key = qt_key) > 0x7f)\n            key = 0;\n    }\n\n    return key;\n}\n\n\n// Encode a QString as bytes.\nQsciScintillaBase::ScintillaBytes QsciScintillaBase::textAsBytes(const QString &text) const\n{\n    if (sci->IsUnicodeMode())\n        return text.utf8();\n\n    return QCString(text.latin1());\n}\n\n\n// Decode bytes as a QString.\nQString QsciScintillaBase::bytesAsText(const char *bytes) const\n{\n    if (sci->IsUnicodeMode())\n        return QString::fromUtf8(bytes);\n\n    return QString::fromLatin1(bytes);\n}\n\n\n// Handle a mouse button double click.\nvoid QsciScintillaBase::mouseDoubleClickEvent(QMouseEvent *e)\n{\n    if (e->button() != Qt::LeftButton)\n    {\n        e->ignore();\n        return;\n    }\n\n    setFocus();\n\n    // Make sure Scintilla will interpret this as a double-click.\n    unsigned clickTime = sci->lastClickTime + QSCI_SCI_NAMESPACE(Platform)::DoubleClickTime() - 1;\n\n    bool shift = e->state() & Qt::ShiftButton;\n    bool ctrl = e->state() & Qt::ControlButton;\n    bool alt = e->state() & Qt::AltButton;\n\n    sci->ButtonDown(QSCI_SCI_NAMESPACE(Point)(e->x(), e->y()), clickTime,\n            shift, ctrl, alt);\n\n    // Remember the current position and time in case it turns into a triple\n    // click.\n    triple_click_at = e->globalPos();\n    triple_click.start(QApplication::doubleClickInterval());\n}\n\n\n// Handle a mouse move.\nvoid QsciScintillaBase::mouseMoveEvent(QMouseEvent *e)\n{\n    sci->ButtonMove(QSCI_SCI_NAMESPACE(Point)(e->x(), e->y()));\n}\n\n\n// Handle a mouse button press.\nvoid QsciScintillaBase::mousePressEvent(QMouseEvent *e)\n{\n    setFocus();\n\n    QSCI_SCI_NAMESPACE(Point) pt(e->x(), e->y());\n\n    if (e->button() == Qt::LeftButton)\n    {\n        unsigned clickTime;\n\n        // It is a triple click if the timer is running and the mouse hasn't\n        // moved too much.\n        if (triple_click.isActive() && (e->globalPos() - triple_click_at).manhattanLength() < QApplication::startDragDistance())\n            clickTime = sci->lastClickTime + QSCI_SCI_NAMESPACE(Platform)::DoubleClickTime() - 1;\n        else\n            clickTime = sci->lastClickTime + QSCI_SCI_NAMESPACE(Platform)::DoubleClickTime() + 1;\n\n        triple_click.stop();\n\n        // Scintilla uses the Alt modifier to initiate rectangular selection.\n        // However the GTK port (under X11, not Windows) uses the Control\n        // modifier (by default, although it is configurable).  It does this\n        // because most X11 window managers hijack Alt-drag to move the window.\n        // We do the same, except that (for the moment at least) we don't allow\n        // the modifier to be configured.\n        bool shift = e->state() & Qt::ShiftButton;\n        bool ctrl = e->state() & Qt::ControlButton;\n#if !defined(Q_WS_X11)\n        bool alt = e->modifiers() & Qt::AltButton;\n#else\n        bool alt = ctrl;\n#endif\n\n        sci->ButtonDown(pt, clickTime, shift, ctrl, alt);\n    }\n    else if (e->button() == Qt::MidButton)\n    {\n        QClipboard *cb = QApplication::clipboard();\n\n        if (cb->supportsSelection())\n        {\n            int pos = sci->PositionFromLocation(pt);\n\n            sci->sel.Clear();\n            sci->SetSelection(pos, pos);\n\n            sci->pasteFromClipboard(QClipboard::Selection);\n        }\n    }\n}\n\n\n// Handle a mouse button releases.\nvoid QsciScintillaBase::mouseReleaseEvent(QMouseEvent *e)\n{\n    if (e->button() != Qt::LeftButton)\n        return;\n\n    QSCI_SCI_NAMESPACE(Point) pt(e->x(), e->y());\n\n    if (sci->HaveMouseCapture())\n    {\n        bool ctrl = e->state() & Qt::ControlButton;\n\n        sci->ButtonUp(pt, 0, ctrl);\n    }\n\n#if QT_VERSION >= 0x050000\n    if (!sci->pdoc->IsReadOnly() && !sci->PointInSelMargin(pt) && qApp->autoSipEnabled())\n    {\n        QStyle::RequestSoftwareInputPanel rsip = QStyle::RequestSoftwareInputPanel(style()->styleHint(QStyle::SH_RequestSoftwareInputPanel));\n\n        if (!clickCausedFocus || rsip == QStyle::RSIP_OnMouseClick)\n            qApp->inputMethod()->show();\n    }\n\n    clickCausedFocus = false;\n#endif\n}\n\n\n// Handle paint events.\nvoid QsciScintillaBase::paintEvent(QPaintEvent *e)\n{\n    sci->paintEvent(e);\n}\n\n\n// Handle resize events.\nvoid QsciScintillaBase::resizeEvent(QResizeEvent *)\n{\n    sci->ChangeSize();\n}\n\n\n// Handle the vertical scrollbar.\nvoid QsciScintillaBase::handleVSb(int value)\n{\n    sci->ScrollTo(value);\n}\n\n\n// Handle the horizontal scrollbar.\nvoid QsciScintillaBase::handleHSb(int value)\n{\n    sci->HorizontalScrollTo(value);\n}\n\n\n// Handle drag enters.\nvoid QsciScintillaBase::dragEnterEvent(QDragEnterEvent *e)\n{\n    QsciScintillaBase::dragMoveEvent(e);\n}\n\n\n// Handle drag leaves.\nvoid QsciScintillaBase::dragLeaveEvent(QDragLeaveEvent *)\n{\n    sci->SetDragPosition(QSCI_SCI_NAMESPACE(SelectionPosition)());\n}\n\n\n// Handle drag moves.\nvoid QsciScintillaBase::dragMoveEvent(QDragMoveEvent *e)\n{\n    sci->SetDragPosition(\n            sci->SPositionFromLocation(\n                    QSCI_SCI_NAMESPACE(Point)(e->pos().x(), e->pos().y()),\n                    false, false, sci->UserVirtualSpace()));\n\n    if (sci->pdoc->IsReadOnly() || !QTextDrag::canDecode(e))\n    {\n        e->ignore();\n        return;\n    }\n\n    e->acceptAction();\n}\n\n\n// Handle drops.\nvoid QsciScintillaBase::dropEvent(QDropEvent *e)\n{\n    bool moving;\n    int len;\n    const char *s;\n    bool rectangular;\n\n    QString text;\n\n    if (sci->pdoc->IsReadOnly() || !QTextDrag::decode(e, text))\n    {\n        e->ignore();\n        return;\n    }\n\n    moving = (e->source() == txtarea && e->action() == QDropEvent::Move);\n\n    e->acceptAction();\n\n    QCString bytes;\n\n    if (sci->IsUnicodeMode())\n    {\n        bytes = text.utf8();\n\n        len = bytes.length();\n        s = bytes.data();\n    }\n    else\n    {\n        s = text.latin1();\n        len = (s ? qstrlen(s) : 0);\n    }\n\n    rectangular = false;\n\n    std::string dest = QSCI_SCI_NAMESPACE(Document)::TransformLineEnds(s, len,\n                sci->pdoc->eolMode);\n\n    sci->DropAt(sci->posDrop, dest.c_str(), dest.length(), moving,\n            rectangular);\n\n    sci->Redraw();\n}\n\n\n\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscistyle.cpp",
    "content": "// This module implements the QsciStyle class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscistyle.h\"\n\n#include <qapplication.h>\n\n#include \"Qsci/qsciscintillabase.h\"\n\n\n// A ctor.\nQsciStyle::QsciStyle(int style)\n{\n    init(style);\n\n    QColorGroup cg = QApplication::palette().active();\n    setColor(cg.text());\n    setPaper(cg.base());\n\n    setFont(QApplication::font());\n    setEolFill(false);\n}\n\n\n// A ctor.\nQsciStyle::QsciStyle(int style, const QString &description,\n        const QColor &color, const QColor &paper, const QFont &font,\n        bool eolFill)\n{\n    init(style);\n\n    setDescription(description);\n\n    setColor(color);\n    setPaper(paper);\n\n    setFont(font);\n    setEolFill(eolFill);\n}\n\n\n// Initialisation common to all ctors.\nvoid QsciStyle::init(int style)\n{\n    // The next style number to allocate.  The initial values corresponds to\n    // the amount of space that Scintilla initially creates for styles.\n    static int next_style_nr = 63;\n\n    // See if a new style should be allocated.  Note that we allow styles to be\n    // passed in that are bigger than STYLE_MAX because the styles used for\n    // annotations are allowed to be.\n    if (style < 0)\n    {\n        // Note that we don't deal with the situation where the newly allocated\n        // style number has already been used explicitly.\n        if (next_style_nr > QsciScintillaBase::STYLE_LASTPREDEFINED)\n            style = next_style_nr--;\n    }\n\n    style_nr = style;\n\n    // Initialise the minor attributes.\n    setTextCase(QsciStyle::OriginalCase);\n    setVisible(true);\n    setChangeable(true);\n    setHotspot(false);\n}\n\n\n// Apply the style to a particular editor.\nvoid QsciStyle::apply(QsciScintillaBase *sci) const\n{\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETFORE, style_nr,\n            style_color);\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETBACK, style_nr,\n            style_paper);\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETFONT, style_nr,\n            style_font.family().ascii());\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETSIZEFRACTIONAL, style_nr,\n            long(style_font.pointSizeF() * QsciScintillaBase::SC_FONT_SIZE_MULTIPLIER));\n\n    // Pass the Qt weight via the back door.\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETWEIGHT, style_nr,\n            -style_font.weight());\n\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETITALIC, style_nr,\n            style_font.italic());\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETUNDERLINE, style_nr,\n            style_font.underline());\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETEOLFILLED, style_nr,\n            style_eol_fill);\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETCASE, style_nr,\n            (long)style_case);\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETVISIBLE, style_nr,\n            style_visible);\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETCHANGEABLE, style_nr,\n            style_changeable);\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETHOTSPOT, style_nr,\n            style_hotspot);\n}\n\n\n// Set the color attribute.\nvoid QsciStyle::setColor(const QColor &color)\n{\n    style_color = color;\n}\n\n\n// Set the paper attribute.\nvoid QsciStyle::setPaper(const QColor &paper)\n{\n    style_paper = paper;\n}\n\n\n// Set the font attribute.\nvoid QsciStyle::setFont(const QFont &font)\n{\n    style_font = font;\n}\n\n\n// Set the eol fill attribute.\nvoid QsciStyle::setEolFill(bool eolFill)\n{\n    style_eol_fill = eolFill;\n}\n\n\n// Set the text case attribute.\nvoid QsciStyle::setTextCase(QsciStyle::TextCase text_case)\n{\n    style_case = text_case;\n}\n\n\n// Set the visible attribute.\nvoid QsciStyle::setVisible(bool visible)\n{\n    style_visible = visible;\n}\n\n\n// Set the changeable attribute.\nvoid QsciStyle::setChangeable(bool changeable)\n{\n    style_changeable = changeable;\n}\n\n\n// Set the hotspot attribute.\nvoid QsciStyle::setHotspot(bool hotspot)\n{\n    style_hotspot = hotspot;\n}\n\n\n// Refresh the style.  Note that since we had to add apply() then this can't do\n// anything useful so we leave it as a no-op.\nvoid QsciStyle::refresh()\n{\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt3/qscistyledtext.cpp",
    "content": "// This module implements the QsciStyledText class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscistyledtext.h\"\n\n#include \"Qsci/qsciscintillabase.h\"\n#include \"Qsci/qscistyle.h\"\n\n\n// A ctor.\nQsciStyledText::QsciStyledText(const QString &text, int style)\n    : styled_text(text), style_nr(style), explicit_style(0)\n{\n}\n\n\n// A ctor.\nQsciStyledText::QsciStyledText(const QString &text, const QsciStyle &style)\n    : styled_text(text), style_nr(-1)\n{\n    explicit_style = new QsciStyle(style);\n}\n\n\n// Return the number of the style.\nint QsciStyledText::style() const\n{\n    return explicit_style ? explicit_style->style() : style_nr;\n}\n\n\n// Apply any explicit style to an editor.\nvoid QsciStyledText::apply(QsciScintillaBase *sci) const\n{\n    if (explicit_style)\n        explicit_style->apply(sci);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/InputMethod.cpp",
    "content": "// Copyright (c) 2014 Riverbank Computing Limited\n// Copyright (c) 2011 Archaeopteryx Software, Inc.\n// Copyright (c) 1990-2011, Scientific Toolworks, Inc.\n//\n// The License.txt file describes the conditions under which this software may\n// be distributed.\n\n\n#include <qglobal.h>\n\n\n#include \"Qsci/qsciscintillabase.h\"\n\n#include <QColor>\n#include <QFont>\n#include <QInputMethodEvent>\n#include <QRect>\n#include <QTextCharFormat>\n#include <QTextFormat>\n#include <QVariant>\n#include <QVarLengthArray>\n\n#include \"ScintillaQt.h\"\n\n\n#define INDIC_INPUTMETHOD 24\n\n\nvoid QsciScintillaBase::inputMethodEvent(QInputMethodEvent *event)\n{\n    // Do nothing if it appears to be a non-event.  This can sometimes happen\n    // (but why?) on losing focus.\n    if (event->commitString().isEmpty() && event->preeditString().isEmpty() && event->replacementLength() == 0)\n        return;\n\n    ScintillaBytes bytes;\n\n    // Clear the current selection.\n    sci->ClearSelection();\n    if (preeditPos >= 0)\n        sci->SetSelection(preeditPos, preeditPos);\n\n    // Insert the commit string.\n    if (!event->commitString().isEmpty() || event->replacementLength()) {\n        // Select the text to be removed.\n        int commitPos = SendScintilla(SCI_GETCURRENTPOS);\n        int start = commitPos + event->replacementStart();\n        int end = start + event->replacementLength();\n        sci->SetSelection(start, end);\n\n        // Replace the selection with the commit string.\n        bytes = textAsBytes(event->commitString());\n        sci->AddCharUTF(bytes.data(), bytes.length());\n    }\n\n    // Select the previous preedit string.\n    int pos = SendScintilla(SCI_GETCURRENTPOS);\n    sci->SetSelection(pos, pos + preeditNrBytes);\n\n    // Replace the selection with the new preedit string.\n    bool recording = sci->recordingMacro;\n    sci->recordingMacro = false;\n    SendScintilla(SCI_SETUNDOCOLLECTION, false);\n    bytes = textAsBytes(event->preeditString());\n    sci->AddCharUTF(bytes.data(), bytes.length());\n    SendScintilla(SCI_SETUNDOCOLLECTION, true);\n    sci->recordingMacro = recording;\n    sci->SetSelection(pos, pos);\n\n    // Store the state of the current preedit string.\n    preeditString = event->preeditString();\n    preeditNrBytes = bytes.length();\n    preeditPos = preeditNrBytes ? SendScintilla(SCI_GETCURRENTPOS) : -1;\n\n    if (preeditNrBytes) {\n        // Apply attributes to the preedit string.\n        int indicNum = 0;\n        sci->ShowCaretAtCurrentPosition();\n        foreach (QInputMethodEvent::Attribute a, event->attributes()) {\n            QString prefix = preeditString.left(a.start);\n            int prefixLength = textAsBytes(prefix).length();\n            int caretPos = preeditPos + prefixLength;\n\n            if (a.type == QInputMethodEvent::Cursor) {\n                sci->SetSelection(caretPos, caretPos);\n                if (!a.length)\n                    sci->DropCaret();\n\n            } else if (a.type == QInputMethodEvent::TextFormat) {\n                Q_ASSERT(a.value.canConvert(QVariant::TextFormat));\n                QTextFormat format = a.value.value<QTextFormat>();\n                Q_ASSERT(format.isCharFormat());\n                QTextCharFormat charFormat = format.toCharFormat();\n\n                if (charFormat.underlineStyle() != QTextCharFormat::NoUnderline) {\n                    QString sub = preeditString.mid(a.start, a.length);\n                    int subLength = textAsBytes(sub).length();\n\n                    // Set temporary indicator for underline style.\n                    QColor uc = charFormat.underlineColor();\n                    int style = INDIC_COMPOSITIONTHICK;\n                    if (charFormat.underlineStyle() == QTextCharFormat::DashUnderline)\n                        style = INDIC_DASH;\n\n                    SendScintilla(SCI_INDICSETSTYLE, INDIC_INPUTMETHOD + indicNum, style);\n                    SendScintilla(SCI_INDICSETFORE, INDIC_INPUTMETHOD + indicNum, uc.rgb());\n                    SendScintilla(SCI_SETINDICATORCURRENT, INDIC_INPUTMETHOD + indicNum);\n                    SendScintilla(SCI_INDICATORFILLRANGE, caretPos, subLength);\n                    indicNum++;\n                }\n            }\n        }\n    }\n}\n\nQVariant QsciScintillaBase::inputMethodQuery(Qt::InputMethodQuery query) const\n{\n    int pos = SendScintilla(SCI_GETCURRENTPOS);\n    int line = SendScintilla(SCI_LINEFROMPOSITION, pos);\n\n    switch (query) {\n#if QT_VERSION >= 0x050000\n        case Qt::ImHints:\n            return QWidget::inputMethodQuery(query);\n#endif\n\n        case Qt::ImMicroFocus:\n        {\n            int startPos = (preeditPos >= 0) ? preeditPos : pos;\n            Point pt = sci->LocationFromPosition(startPos);\n            int width = SendScintilla(SCI_GETCARETWIDTH);\n            int height = SendScintilla(SCI_TEXTHEIGHT, line);\n            return QRect(pt.x, pt.y, width, height);\n        }\n\n        case Qt::ImFont:\n        {\n            char fontName[64];\n            int style = SendScintilla(SCI_GETSTYLEAT, pos);\n            int len = SendScintilla(SCI_STYLEGETFONT, style, (sptr_t)fontName);\n            int size = SendScintilla(SCI_STYLEGETSIZE, style);\n            bool italic = SendScintilla(SCI_STYLEGETITALIC, style);\n            int weight = SendScintilla(SCI_STYLEGETBOLD, style) ? QFont::Bold : -1;\n            return QFont(QString::fromUtf8(fontName, len), size, weight, italic);\n        }\n\n        case Qt::ImCursorPosition:\n        {\n            int paraStart = sci->pdoc->ParaUp(pos);\n            return pos - paraStart;\n        }\n\n        case Qt::ImSurroundingText:\n        {\n            int paraStart = sci->pdoc->ParaUp(pos);\n            int paraEnd = sci->pdoc->ParaDown(pos);\n            QVarLengthArray<char,1024> buffer(paraEnd - paraStart + 1);\n\n            Sci_CharacterRange charRange;\n            charRange.cpMin = paraStart;\n            charRange.cpMax = paraEnd;\n\n            Sci_TextRange textRange;\n            textRange.chrg = charRange;\n            textRange.lpstrText = buffer.data();\n\n            SendScintilla(SCI_GETTEXTRANGE, 0, (sptr_t)&textRange);\n\n            return bytesAsText(buffer.constData());\n        }\n\n        case Qt::ImCurrentSelection:\n        {\n            QVarLengthArray<char,1024> buffer(SendScintilla(SCI_GETSELTEXT));\n            SendScintilla(SCI_GETSELTEXT, 0, (sptr_t)buffer.data());\n\n            return bytesAsText(buffer.constData());\n        }\n\n        default:\n            return QVariant();\n    }\n}\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ListBoxQt.cpp",
    "content": "// This module implements the specialisation of QListBox that handles the\n// Scintilla double-click callback.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"ListBoxQt.h\"\n\n#include <stdlib.h>\n\n#include \"SciClasses.h\"\n#include \"Qsci/qsciscintilla.h\"\n\n\nQsciListBoxQt::QsciListBoxQt()\n    : cb_action(0), cb_data(0), slb(0), visible_rows(5), utf8(false)\n{\n}\n\n\nvoid QsciListBoxQt::SetFont(QSCI_SCI_NAMESPACE(Font) &font)\n{\n    QFont *f = reinterpret_cast<QFont *>(font.GetID());\n\n    if (f)\n        slb->setFont(*f);\n}\n\n\nvoid QsciListBoxQt::Create(QSCI_SCI_NAMESPACE(Window) &parent, int,\n        QSCI_SCI_NAMESPACE(Point), int, bool unicodeMode, int)\n{\n    utf8 = unicodeMode;\n\n    // The parent we want is the QsciScintillaBase, not the text area.\n    wid = slb = new QsciSciListBox(reinterpret_cast<QWidget *>(parent.GetID())->parentWidget(), this);\n}\n\n\nvoid QsciListBoxQt::SetAverageCharWidth(int)\n{\n    // We rely on sizeHint() for the size of the list box rather than make\n    // calculations based on the average character width and the number of\n    // visible rows.\n}\n\n\nvoid QsciListBoxQt::SetVisibleRows(int vrows)\n{\n    // We only pretend to implement this.\n    visible_rows = vrows;\n}\n\n\nint QsciListBoxQt::GetVisibleRows() const\n{\n    return visible_rows;\n}\n\n\nQSCI_SCI_NAMESPACE(PRectangle) QsciListBoxQt::GetDesiredRect()\n{\n    QSCI_SCI_NAMESPACE(PRectangle) rc(0, 0, 100, 100);\n\n    if (slb)\n    {\n        QSize sh = slb->sizeHint();\n\n        rc.right = sh.width();\n        rc.bottom = sh.height();\n    }\n\n    return rc;\n}\n\n\nint QsciListBoxQt::CaretFromEdge()\n{\n    int dist = 0;\n\n    // Find the width of the biggest image.\n    for (xpmMap::const_iterator it = xset.begin(); it != xset.end(); ++it)\n    {\n        int w = it.value().width();\n\n        if (dist < w)\n            dist = w;\n    }\n\n    if (slb)\n        dist += slb->frameWidth();\n\n    // Fudge factor - adjust if required.\n    dist += 3;\n\n    return dist;\n}\n\n\nvoid QsciListBoxQt::Clear()\n{\n    Q_ASSERT(slb);\n\n    slb->clear();\n}\n\n\nvoid QsciListBoxQt::Append(char *s, int type)\n{\n    Q_ASSERT(slb);\n\n    QString qs;\n\n    if (utf8)\n        qs = QString::fromUtf8(s);\n    else\n        qs = QString::fromLatin1(s);\n\n    xpmMap::const_iterator it;\n\n    if (type < 0 || (it = xset.find(type)) == xset.end())\n        slb->addItem(qs);\n    else\n        slb->addItemPixmap(it.value(), qs);\n}\n\n\nint QsciListBoxQt::Length()\n{\n    Q_ASSERT(slb);\n\n    return slb->count();\n}\n\n\nvoid QsciListBoxQt::Select(int n)\n{\n    Q_ASSERT(slb);\n\n    slb->setCurrentRow(n);\n}\n\n\nint QsciListBoxQt::GetSelection()\n{\n    Q_ASSERT(slb);\n\n    return slb->currentRow();\n}\n\n\nint QsciListBoxQt::Find(const char *prefix)\n{\n    Q_ASSERT(slb);\n\n    return slb->find(prefix);\n}\n\n\nvoid QsciListBoxQt::GetValue(int n, char *value, int len)\n{\n    Q_ASSERT(slb);\n\n    QString selection = slb->text(n);\n\n    bool trim_selection = false;\n    QObject *sci_obj = slb->parent();\n\n    if (sci_obj->inherits(\"QsciScintilla\"))\n    {\n        QsciScintilla *sci = static_cast<QsciScintilla *>(sci_obj);\n\n        if (sci->isAutoCompletionList())\n        {\n            // Save the full selection and trim the value we return.\n            sci->acSelection = selection;\n            trim_selection = true;\n        }\n    }\n\n    if (selection.isEmpty() || len <= 0)\n        value[0] = '\\0';\n    else\n    {\n        const char *s;\n        int slen;\n\n        QByteArray bytes;\n\n        if (utf8)\n            bytes = selection.toUtf8();\n        else\n            bytes = selection.toLatin1();\n\n        s = bytes.data();\n        slen = bytes.length();\n\n        while (slen-- && len--)\n        {\n            if (trim_selection && *s == ' ')\n                break;\n\n            *value++ = *s++;\n        }\n\n        *value = '\\0';\n    }\n}\n\n\nvoid QsciListBoxQt::Sort()\n{\n    Q_ASSERT(slb);\n\n    slb->sortItems();\n}\n\n\nvoid QsciListBoxQt::RegisterImage(int type, const char *xpm_data)\n{\n    xset.insert(type, *reinterpret_cast<const QPixmap *>(xpm_data));\n}\n\n\nvoid QsciListBoxQt::RegisterRGBAImage(int type, int, int,\n        const unsigned char *pixelsImage)\n{\n    QPixmap pm;\n\n    pm = QPixmap::fromImage(*reinterpret_cast<const QImage *>(pixelsImage));\n\n    xset.insert(type, pm);\n}\n\n\nvoid QsciListBoxQt::ClearRegisteredImages()\n{\n    xset.clear();\n}\n\n\nvoid QsciListBoxQt::SetDoubleClickAction(\n        QSCI_SCI_NAMESPACE(CallBackAction) action, void *data)\n{\n    cb_action = action;\n    cb_data = data;\n}\n\n\nvoid QsciListBoxQt::SetList(const char *list, char separator, char typesep)\n{\n    char *words;\n\n    Clear();\n\n    if ((words = qstrdup(list)) != NULL)\n    {\n        char *startword = words;\n        char *numword = NULL;\n\n        for (int i = 0; words[i] != '\\0'; i++)\n        {\n            if (words[i] == separator)\n            {\n                words[i] = '\\0';\n\n                if (numword)\n                    *numword = '\\0';\n\n                Append(startword, numword ? atoi(numword + 1) : -1);\n\n                startword = words + i + 1;\n                numword = NULL;\n            }\n            else if (words[i] == typesep)\n            {\n                numword = words + i;\n            }\n        }\n\n        if (startword)\n        {\n            if (numword)\n                *numword = '\\0';\n\n            Append(startword, numword ? atoi(numword + 1) : -1);\n        }\n\n        delete[] words;\n    }\n}\n\n\n// The ListBox methods that need to be implemented explicitly.\n\nQSCI_SCI_NAMESPACE(ListBox)::ListBox()\n{\n}\n\n\nQSCI_SCI_NAMESPACE(ListBox)::~ListBox()\n{\n}\n\n\nQSCI_SCI_NAMESPACE(ListBox) *QSCI_SCI_NAMESPACE(ListBox)::Allocate()\n{\n    return new QsciListBoxQt();\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ListBoxQt.h",
    "content": "// This defines the specialisation of QListBox that handles the Scintilla\n// double-click callback.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include <qmap.h>\n#include <qpixmap.h>\n#include <qstring.h>\n\n#include \"SciNamespace.h\"\n\n#include \"Platform.h\"\n\n\nclass QsciSciListBox;\n\n\n// This is an internal class but it is referenced by a public class so it has\n// to have a Qsci prefix rather than being put in the Scintilla namespace\n// which would mean exposing the SCI_NAMESPACE mechanism).\nclass QsciListBoxQt : public QSCI_SCI_NAMESPACE(ListBox)\n{\npublic:\n    QsciListBoxQt();\n\n    QSCI_SCI_NAMESPACE(CallBackAction) cb_action;\n    void *cb_data;\n\n    virtual void SetFont(QSCI_SCI_NAMESPACE(Font) &font);\n    virtual void Create(QSCI_SCI_NAMESPACE(Window) &parent, int,\n            QSCI_SCI_NAMESPACE(Point), int, bool unicodeMode, int);\n    virtual void SetAverageCharWidth(int);\n    virtual void SetVisibleRows(int);\n    virtual int GetVisibleRows() const;\n    virtual QSCI_SCI_NAMESPACE(PRectangle) GetDesiredRect();\n    virtual int CaretFromEdge();\n    virtual void Clear();\n    virtual void Append(char *s, int type = -1);\n    virtual int Length();\n    virtual void Select(int n);\n    virtual int GetSelection();\n    virtual int Find(const char *prefix);\n    virtual void GetValue(int n, char *value, int len);\n    virtual void Sort();\n    virtual void RegisterImage(int type, const char *xpm_data);\n    virtual void RegisterRGBAImage(int type, int width, int height,\n            const unsigned char *pixelsImage);\n    virtual void ClearRegisteredImages();\n    virtual void SetDoubleClickAction(\n            QSCI_SCI_NAMESPACE(CallBackAction) action, void *data);\n    virtual void SetList(const char *list, char separator, char typesep);\n\nprivate:\n    QsciSciListBox *slb;\n    int visible_rows;\n    bool utf8;\n\n    typedef QMap<int, QPixmap> xpmMap;\n    xpmMap xset;\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/MacPasteboardMime.cpp",
    "content": "// This module implements part of the support for rectangular selections on\n// OS/X.  It is a separate file to avoid clashes between OS/X and Scintilla\n// data types.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include <qglobal.h>\n\n#if (QT_VERSION >= 0x040200 && QT_VERSION < 0x050000 && defined(Q_OS_MAC)) || (QT_VERSION >= 0x050200 && defined(Q_OS_OSX))\n\n#include <QByteArray>\n#include <QLatin1String>\n#include <QList>\n#include <QString>\n#include <QStringList>\n#include <QVariant>\n\n#include <QMacPasteboardMime>\n\n\nstatic const QLatin1String mimeRectangular(\"text/x-qscintilla-rectangular\");\nstatic const QLatin1String utiRectangularMac(\"com.scintilla.utf16-plain-text.rectangular\");\n\n\nclass RectangularPasteboardMime : public QMacPasteboardMime\n{\npublic:\n    RectangularPasteboardMime() : QMacPasteboardMime(MIME_ALL)\n    {\n    }\n\n    bool canConvert(const QString &mime, QString flav)\n    {\n        return mime == mimeRectangular && flav == utiRectangularMac;\n    }\n\n    QList<QByteArray> convertFromMime(const QString &, QVariant data, QString)\n    {\n        QList<QByteArray> converted;\n\n        converted.append(data.toByteArray());\n\n        return converted;\n    }\n\n    QVariant convertToMime(const QString &, QList<QByteArray> data, QString)\n    {\n        QByteArray converted;\n\n        foreach (QByteArray i, data)\n        {\n            converted += i;\n        }\n\n        return QVariant(converted);\n    }\n\n    QString convertorName()\n    {\n        return QString(\"QScintillaRectangular\");\n    }\n\n    QString flavorFor(const QString &mime)\n    {\n        if (mime == mimeRectangular)\n            return QString(utiRectangularMac);\n\n        return QString();\n    }\n\n    QString mimeFor(QString flav)\n    {\n        if (flav == utiRectangularMac)\n            return QString(mimeRectangular);\n\n        return QString();\n    }\n};\n\n\n// Initialise the singleton instance.\nvoid initialiseRectangularPasteboardMime()\n{\n    static RectangularPasteboardMime *instance = 0;\n\n    if (!instance)\n    {\n        instance = new RectangularPasteboardMime();\n\n        qRegisterDraggedTypes(QStringList(utiRectangularMac));\n    }\n}\n\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/PlatQt.cpp",
    "content": "// This module implements the portability layer for the Qt port of Scintilla.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include <stdio.h>\n#include <stdarg.h>\n#include <string.h>\n\n#include <qapplication.h>\n#include <qwidget.h>\n#include <qfont.h>\n#include <qpixmap.h>\n#include <qimage.h>\n#include <qstring.h>\n#include <qdatetime.h>\n#include <qpainter.h>\n#include <qcursor.h>\n#include <qlibrary.h>\n\n#include <qdesktopwidget.h>\n#include <qpolygon.h>\n#include <qtextlayout.h>\n\n#include \"SciNamespace.h\"\n\n#include \"Platform.h\"\n#include \"XPM.h\"\n\n#include \"Qsci/qsciscintillabase.h\"\n#include \"SciClasses.h\"\n\n#include \"FontQuality.h\"\n\n\nQSCI_BEGIN_SCI_NAMESPACE\n\n// Type convertors.\nstatic QFont *PFont(FontID fid)\n{\n    return reinterpret_cast<QFont *>(fid);\n}\n\nstatic QWidget *PWindow(WindowID wid)\n{\n    return reinterpret_cast<QWidget *>(wid);\n}\n\nstatic QsciSciPopup *PMenu(MenuID mid)\n{\n    return reinterpret_cast<QsciSciPopup *>(mid);\n}\n\n\n// Create a Point instance from a long value.\nPoint Point::FromLong(long lpoint)\n{\n    return Point(Platform::LowShortFromLong(lpoint),\n            Platform::HighShortFromLong(lpoint));\n}\n\n\n// Font management.\nFont::Font() : fid(0)\n{\n}\n\nFont::~Font()\n{\n}\n\nvoid Font::Create(const FontParameters &fp)\n{\n    Release();\n\n    QFont *f = new QFont();\n\n    QFont::StyleStrategy strategy;\n\n    switch (fp.extraFontFlag & SC_EFF_QUALITY_MASK)\n    {\n    case SC_EFF_QUALITY_NON_ANTIALIASED:\n        strategy = QFont::NoAntialias;\n        break;\n\n    case SC_EFF_QUALITY_ANTIALIASED:\n        strategy = QFont::PreferAntialias;\n        break;\n\n    default:\n        strategy = QFont::PreferDefault;\n    }\n\n#if defined(Q_OS_MAC)\n#if QT_VERSION >= 0x040700\n    strategy = static_cast<QFont::StyleStrategy>(strategy | QFont::ForceIntegerMetrics);\n#else\n#warning \"Correct handling of QFont metrics requires Qt v4.7.0 or later\"\n#endif\n#endif\n\n    f->setStyleStrategy(strategy);\n\n    // If name of the font begins with a '-', assume, that it is an XLFD.\n    if (fp.faceName[0] == '-')\n    {\n        f->setRawName(fp.faceName);\n    }\n    else\n    {\n        f->setFamily(fp.faceName);\n        f->setPointSizeF(fp.size);\n\n        // See if the Qt weight has been passed via the back door.   Otherwise\n        // map Scintilla weights to Qt weights ensuring that the SC_WEIGHT_*\n        // values get mapped to the correct QFont::Weight values.\n        int qt_weight;\n\n        if (fp.weight < 0)\n            qt_weight = -fp.weight;\n        else if (fp.weight <= 200)\n            qt_weight = QFont::Light;\n        else if (fp.weight <= QsciScintillaBase::SC_WEIGHT_NORMAL)\n            qt_weight = QFont::Normal;\n        else if (fp.weight <= 600)\n            qt_weight = QFont::DemiBold;\n        else if (fp.weight <= 850)\n            qt_weight = QFont::Bold;\n        else\n            qt_weight = QFont::Black;\n\n        f->setWeight(qt_weight);\n\n        f->setItalic(fp.italic);\n    }\n\n    fid = f;\n}\n\nvoid Font::Release()\n{\n    if (fid)\n    {\n        delete PFont(fid);\n        fid = 0;\n    }\n}\n\n\n// A surface abstracts a place to draw.\nclass SurfaceImpl : public Surface\n{\npublic:\n    SurfaceImpl();\n    virtual ~SurfaceImpl();\n\n    void Init(WindowID wid);\n    void Init(SurfaceID sid, WindowID);\n    void Init(QPainter *p);\n    void InitPixMap(int width, int height, Surface *, WindowID wid);\n\n    void Release();\n    bool Initialised() {return painter;}\n    void PenColour(ColourDesired fore);\n    int LogPixelsY() {return pd->logicalDpiY();}\n    int DeviceHeightFont(int points) {return points;}\n    void MoveTo(int x_,int y_);\n    void LineTo(int x_,int y_);\n    void Polygon(Point *pts, int npts, ColourDesired fore,\n            ColourDesired back);\n    void RectangleDraw(PRectangle rc, ColourDesired fore,\n            ColourDesired back);\n    void FillRectangle(PRectangle rc, ColourDesired back);\n    void FillRectangle(PRectangle rc, Surface &surfacePattern);\n    void RoundedRectangle(PRectangle rc, ColourDesired fore,\n            ColourDesired back);\n    void AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill,\n            int alphaFill, ColourDesired outline, int alphaOutline,\n            int flags);\n    void DrawRGBAImage(PRectangle rc, int width, int height, const unsigned char *pixelsImage);\n    void Ellipse(PRectangle rc, ColourDesired fore, ColourDesired back);\n    void Copy(PRectangle rc, Point from, Surface &surfaceSource);\n\n    void DrawTextNoClip(PRectangle rc, Font &font_, XYPOSITION ybase,\n            const char *s, int len, ColourDesired fore, ColourDesired back);\n    void DrawTextClipped(PRectangle rc, Font &font_, XYPOSITION ybase,\n            const char *s, int len, ColourDesired fore, ColourDesired back);\n    void DrawTextTransparent(PRectangle rc, Font &font_, XYPOSITION ybase,\n            const char *s, int len, ColourDesired fore);\n    void MeasureWidths(Font &font_, const char *s, int len,\n            XYPOSITION *positions);\n    XYPOSITION WidthText(Font &font_, const char *s, int len);\n    XYPOSITION WidthChar(Font &font_, char ch);\n    XYPOSITION Ascent(Font &font_);\n    XYPOSITION Descent(Font &font_);\n    XYPOSITION InternalLeading(Font &font_) {return 0;}\n    XYPOSITION ExternalLeading(Font &font_);\n    XYPOSITION Height(Font &font_);\n    XYPOSITION AverageCharWidth(Font &font_);\n\n    void SetClip(PRectangle rc);\n    void FlushCachedState();\n\n    void SetUnicodeMode(bool unicodeMode_) {unicodeMode = unicodeMode_;}\n    void SetDBCSMode(int codePage) {}\n\n    void DrawXPM(PRectangle rc, const XPM *xpm);\n\nprivate:\n    void drawRect(const PRectangle &rc);\n    void drawText(const PRectangle &rc, Font &font_, XYPOSITION ybase,\n            const char *s, int len, ColourDesired fore);\n    static QFont convertQFont(Font &font);\n    QFontMetricsF metrics(Font &font_);\n    QString convertText(const char *s, int len);\n    static QColor convertQColor(const ColourDesired &col,\n            unsigned alpha = 255);\n\n    bool unicodeMode;\n    QPaintDevice *pd;\n    QPainter *painter;\n    bool my_resources;\n    int pen_x, pen_y;\n};\n\nSurface *Surface::Allocate(int)\n{\n    return new SurfaceImpl;\n}\n\nSurfaceImpl::SurfaceImpl()\n    : unicodeMode(false), pd(0), painter(0), my_resources(false), pen_x(0),\n      pen_y(0)\n{\n}\n\nSurfaceImpl::~SurfaceImpl()\n{\n    Release();\n}\n\nvoid SurfaceImpl::Init(WindowID wid)\n{\n    Release();\n\n    pd = reinterpret_cast<QWidget *>(wid);\n}\n\nvoid SurfaceImpl::Init(SurfaceID sid, WindowID)\n{\n    Release();\n\n    // This method, and the SurfaceID type, is only used when printing.  As it\n    // is actually a void * we pass (when using SCI_FORMATRANGE) a pointer to a\n    // QPainter rather than a pointer to a SurfaceImpl as might be expected.\n    QPainter *p = reinterpret_cast<QPainter *>(sid);\n\n    pd = p->device();\n    painter = p;\n}\n\nvoid SurfaceImpl::Init(QPainter *p)\n{\n    Release();\n\n    pd = p->device();\n    painter = p;\n}\n\nvoid SurfaceImpl::InitPixMap(int width, int height, Surface *, WindowID wid)\n{\n    Release();\n\n#if QT_VERSION >= 0x050100\n    int dpr = PWindow(wid)->devicePixelRatio();\n    QPixmap *pixmap = new QPixmap(width * dpr, height * dpr);\n    pixmap->setDevicePixelRatio(dpr);\n#else\n    QPixmap *pixmap = new QPixmap(width, height);\n    Q_UNUSED(wid);\n#endif\n\n    pd = pixmap;\n\n    painter = new QPainter(pd);\n    my_resources = true;\n}\n\nvoid SurfaceImpl::Release()\n{\n    if (my_resources)\n    {\n        if (painter)\n            delete painter;\n\n        if (pd)\n            delete pd;\n\n        my_resources = false;\n    }\n\n    painter = 0;\n    pd = 0;\n}\n\nvoid SurfaceImpl::MoveTo(int x_, int y_)\n{\n    Q_ASSERT(painter);\n\n    pen_x = x_;\n    pen_y = y_;\n}\n\nvoid SurfaceImpl::LineTo(int x_, int y_)\n{\n    Q_ASSERT(painter);\n\n    painter->drawLine(pen_x, pen_y, x_, y_);\n\n    pen_x = x_;\n    pen_y = y_;\n}\n\nvoid SurfaceImpl::PenColour(ColourDesired fore)\n{\n    Q_ASSERT(painter);\n\n    painter->setPen(convertQColor(fore));\n}\n\nvoid SurfaceImpl::Polygon(Point *pts, int npts, ColourDesired fore,\n        ColourDesired back)\n{\n    Q_ASSERT(painter);\n\n    QPolygonF qpts(npts);\n\n    for (int i = 0; i < npts; ++i)\n        qpts[i] = QPointF(pts[i].x, pts[i].y);\n\n    painter->setPen(convertQColor(fore));\n    painter->setBrush(convertQColor(back));\n    painter->drawPolygon(qpts);\n}\n\nvoid SurfaceImpl::RectangleDraw(PRectangle rc, ColourDesired fore,\n        ColourDesired back)\n{\n    Q_ASSERT(painter);\n\n    painter->setPen(convertQColor(fore));\n    painter->setBrush(convertQColor(back));\n    drawRect(rc);\n}\n\nvoid SurfaceImpl::FillRectangle(PRectangle rc, ColourDesired back)\n{\n    Q_ASSERT(painter);\n\n    painter->setPen(Qt::NoPen);\n    painter->setBrush(convertQColor(back));\n    drawRect(rc);\n}\n\nvoid SurfaceImpl::FillRectangle(PRectangle rc, Surface &surfacePattern)\n{\n    Q_ASSERT(painter);\n\n    SurfaceImpl &si = static_cast<SurfaceImpl &>(surfacePattern);\n    QPixmap *pm = static_cast<QPixmap *>(si.pd);\n\n    if (pm)\n    {\n        QBrush brsh(Qt::black, *pm);\n\n        painter->setPen(Qt::NoPen);\n        painter->setBrush(brsh);\n        drawRect(rc);\n    }\n    else\n    {\n        FillRectangle(rc, ColourDesired(0));\n    }\n}\n\nvoid SurfaceImpl::RoundedRectangle(PRectangle rc, ColourDesired fore,\n        ColourDesired back)\n{\n    Q_ASSERT(painter);\n\n    painter->setPen(convertQColor(fore));\n    painter->setBrush(convertQColor(back));\n    painter->drawRoundRect(\n            QRectF(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top));\n}\n\nvoid SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize,\n        ColourDesired fill, int alphaFill, ColourDesired outline,\n        int alphaOutline, int)\n{\n    Q_ASSERT(painter);\n\n    QColor outline_colour = convertQColor(outline, alphaOutline);\n    QColor fill_colour = convertQColor(fill, alphaFill);\n\n    // There was a report of Qt seeming to ignore the alpha value of the pen so\n    // so we disable the pen if the outline and fill colours are the same.\n    if (outline_colour == fill_colour)\n        painter->setPen(Qt::NoPen);\n    else\n        painter->setPen(outline_colour);\n\n    painter->setBrush(fill_colour);\n\n    const int radius = (cornerSize ? 25 : 0);\n\n    painter->drawRoundRect(\n            QRectF(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top),\n            radius, radius);\n}\n\nvoid SurfaceImpl::drawRect(const PRectangle &rc)\n{\n    painter->drawRect(\n            QRectF(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top));\n}\n\nvoid SurfaceImpl::Ellipse(PRectangle rc, ColourDesired fore,\n        ColourDesired back)\n{\n    Q_ASSERT(painter);\n\n    painter->setPen(convertQColor(fore));\n    painter->setBrush(convertQColor(back));\n    painter->drawEllipse(\n            QRectF(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top));\n}\n\nvoid SurfaceImpl::Copy(PRectangle rc, Point from, Surface &surfaceSource)\n{\n    Q_ASSERT(painter);\n\n    SurfaceImpl &si = static_cast<SurfaceImpl &>(surfaceSource);\n\n    if (si.pd)\n    {\n        QPixmap *pm = static_cast<QPixmap *>(si.pd);\n        qreal x = from.x;\n        qreal y = from.y;\n        qreal width = rc.right - rc.left;\n        qreal height = rc.bottom - rc.top;\n\n#if QT_VERSION >= 0x050100\n        qreal dpr = pm->devicePixelRatio();\n\n        x *= dpr;\n        y *= dpr;\n        width *= dpr;\n        height *= dpr;\n#endif\n\n        painter->drawPixmap(QPointF(rc.left, rc.top), *pm,\n                QRectF(x, y, width, height));\n    }\n}\n\nvoid SurfaceImpl::DrawTextNoClip(PRectangle rc, Font &font_, XYPOSITION ybase,\n        const char *s, int len, ColourDesired fore, ColourDesired back)\n{\n    Q_ASSERT(painter);\n\n    FillRectangle(rc, back);\n    drawText(rc, font_, ybase, s, len, fore);\n}\n\nvoid SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font_, XYPOSITION ybase,\n        const char *s, int len, ColourDesired fore, ColourDesired back)\n{\n    Q_ASSERT(painter);\n\n    SetClip(rc);\n    DrawTextNoClip(rc, font_, ybase, s, len, fore, back);\n    painter->setClipping(false);\n}\n\nvoid SurfaceImpl::DrawTextTransparent(PRectangle rc, Font &font_,\n        XYPOSITION ybase, const char *s, int len, ColourDesired fore)\n{\n    // Only draw if there is a non-space.\n    for (int i = 0; i < len; ++i)\n        if (s[i] != ' ')\n        {\n            drawText(rc, font_, ybase, s, len, fore);\n            return;\n        }\n}\n\nvoid SurfaceImpl::drawText(const PRectangle &rc, Font &font_, XYPOSITION ybase,\n        const char *s, int len, ColourDesired fore)\n{\n    QString qs = convertText(s, len);\n\n    QFont *f = PFont(font_.GetID());\n\n    if (f)\n        painter->setFont(*f);\n\n    painter->setPen(convertQColor(fore));\n    painter->drawText(QPointF(rc.left, ybase), qs);\n}\n\nvoid SurfaceImpl::DrawXPM(PRectangle rc, const XPM *xpm)\n{\n    Q_ASSERT(painter);\n\n    XYPOSITION x, y;\n    const QPixmap &qpm = xpm->Pixmap();\n\n    x = rc.left + (rc.Width() - qpm.width()) / 2.0;\n    y = rc.top + (rc.Height() - qpm.height()) / 2.0;\n\n    painter->drawPixmap(QPointF(x, y), qpm);\n}\n\nvoid SurfaceImpl::DrawRGBAImage(PRectangle rc, int width, int height,\n        const unsigned char *pixelsImage)\n{\n    Q_ASSERT(painter);\n\n    const QImage *qim = reinterpret_cast<const QImage *>(pixelsImage);\n\n    painter->drawImage(QPointF(rc.left, rc.top), *qim);\n}\n\nvoid SurfaceImpl::MeasureWidths(Font &font_, const char *s, int len,\n        XYPOSITION *positions)\n{\n    QString qs = convertText(s, len);\n    QTextLayout text_layout(qs, convertQFont(font_), pd);\n\n    text_layout.beginLayout();\n    QTextLine text_line = text_layout.createLine();\n    text_layout.endLayout();\n\n    if (unicodeMode)\n    {\n        int i_char = 0, i_byte = 0;;\n\n        while (i_char < qs.size())\n        {\n            unsigned char byte = s[i_byte];\n            int nbytes, code_units;\n\n            // Work out character sizes by looking at the byte stream.\n            if (byte >= 0xf0)\n            {\n                nbytes = 4;\n                code_units = 2;\n            }\n            else\n            {\n                if (byte >= 0xe0)\n                    nbytes = 3;\n                else if (byte >= 0x80)\n                    nbytes = 2;\n                else\n                    nbytes = 1;\n\n                code_units = 1;\n            }\n\n            XYPOSITION position = text_line.cursorToX(i_char + code_units);\n\n            // Set the same position for each byte of the character.\n            for (int i = 0; i < nbytes && i_byte < len; ++i)\n                positions[i_byte++] = position;\n\n            i_char += code_units;\n        }\n\n        // This shouldn't be necessary...\n        XYPOSITION last_position = ((i_byte > 0) ? positions[i_byte - 1] : 0);\n\n        while (i_byte < len)\n            positions[i_byte++] = last_position;\n    }\n    else\n    {\n        for (int i = 0; i < len; ++i)\n            positions[i] = text_line.cursorToX(i + 1);\n    }\n}\n\nXYPOSITION SurfaceImpl::WidthText(Font &font_, const char *s, int len)\n{\n    return metrics(font_).width(convertText(s, len));\n\n}\n\nXYPOSITION SurfaceImpl::WidthChar(Font &font_, char ch)\n{\n    return metrics(font_).width(ch);\n}\n\nXYPOSITION SurfaceImpl::Ascent(Font &font_)\n{\n    return metrics(font_).ascent();\n}\n\nXYPOSITION SurfaceImpl::Descent(Font &font_)\n{\n    // Qt doesn't include the baseline in the descent, so add it.  Note that\n    // a descent from Qt4 always seems to be 2 pixels larger (irrespective of\n    // font or size) than the same descent from Qt3.  This means that text is a\n    // little more spaced out with Qt4 - and will be more noticeable with\n    // smaller fonts.\n    return metrics(font_).descent() + 1;\n}\n\nXYPOSITION SurfaceImpl::ExternalLeading(Font &font_)\n{\n    // Scintilla doesn't use this at the moment, which is good because Qt4 can\n    // return a negative value.\n    return metrics(font_).leading();\n}\n\nXYPOSITION SurfaceImpl::Height(Font &font_)\n{\n    return metrics(font_).height();\n}\n\nXYPOSITION SurfaceImpl::AverageCharWidth(Font &font_)\n{\n#if QT_VERSION >= 0x040200\n    return metrics(font_).averageCharWidth();\n#else\n    return WidthChar(font_, 'n');\n#endif\n}\n\nvoid SurfaceImpl::SetClip(PRectangle rc)\n{\n    Q_ASSERT(painter);\n\n    painter->setClipRect(\n            QRectF(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top));\n}\n\nvoid SurfaceImpl::FlushCachedState()\n{\n}\n\n// Return the QFont for a Font.\nQFont SurfaceImpl::convertQFont(Font &font)\n{\n    QFont *f = PFont(font.GetID());\n\n    if (f)\n        return *f;\n\n    return QApplication::font();\n}\n\n// Get the metrics for a font.\nQFontMetricsF SurfaceImpl::metrics(Font &font_)\n{\n    QFont fnt = convertQFont(font_);\n\n    return QFontMetricsF(fnt, pd);\n}\n\n// Convert a Scintilla string to a Qt Unicode string.\nQString SurfaceImpl::convertText(const char *s, int len)\n{\n    if (unicodeMode)\n        return QString::fromUtf8(s, len);\n\n    return QString::fromLatin1(s, len);\n}\n\n\n// Convert a Scintilla colour, and alpha component, to a Qt QColor.\nQColor SurfaceImpl::convertQColor(const ColourDesired &col, unsigned alpha)\n{\n    long c = col.AsLong();\n\n    unsigned r = c & 0xff;\n    unsigned g = (c >> 8) & 0xff;\n    unsigned b = (c >> 16) & 0xff;\n\n    return QColor(r, g, b, alpha);\n}\n\n\n// Window (widget) management.\nWindow::~Window()\n{\n}\n\nvoid Window::Destroy()\n{\n    QWidget *w = PWindow(wid);\n\n    if (w)\n    {\n        // Delete the widget next time round the event loop rather than\n        // straight away.  This gets round a problem when auto-completion lists\n        // are cancelled after an entry has been double-clicked, ie. the list's\n        // dtor is called from one of the list's slots.  There are other ways\n        // around the problem but this is the simplest and doesn't seem to\n        // cause problems of its own.\n        w->deleteLater();\n        wid = 0;\n    }\n}\n\nbool Window::HasFocus()\n{\n    return PWindow(wid)->hasFocus();\n}\n\nPRectangle Window::GetPosition()\n{\n    QWidget *w = PWindow(wid);\n\n    // Before any size allocated pretend its big enough not to be scrolled.\n    PRectangle rc(0,0,5000,5000);\n\n    if (w)\n    {\n        const QRect &r = w->geometry();\n\n        rc.right = r.right() - r.left() + 1;\n        rc.bottom = r.bottom() - r.top() + 1;\n    }\n\n    return rc;\n}\n\nvoid Window::SetPosition(PRectangle rc)\n{\n    PWindow(wid)->setGeometry(rc.left, rc.top, rc.right - rc.left,\n            rc.bottom - rc.top);\n}\n\nvoid Window::SetPositionRelative(PRectangle rc, Window relativeTo)\n{\n    QWidget *rel = PWindow(relativeTo.wid);\n    QPoint pos = rel->mapToGlobal(rel->pos());\n\n    int x = pos.x() + rc.left;\n    int y = pos.y() + rc.top;\n\n    PWindow(wid)->setGeometry(x, y, rc.right - rc.left, rc.bottom - rc.top);\n}\n\nPRectangle Window::GetClientPosition()\n{\n    return GetPosition();\n}\n\nvoid Window::Show(bool show)\n{\n    QWidget *w = PWindow(wid);\n\n    if (show)\n        w->show();\n    else\n        w->hide();\n}\n\nvoid Window::InvalidateAll()\n{\n    QWidget *w = PWindow(wid);\n\n    if (w)\n        w->update();\n}\n\nvoid Window::InvalidateRectangle(PRectangle rc)\n{\n    QWidget *w = PWindow(wid);\n\n    if (w)\n        w->update(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);\n}\n\nvoid Window::SetFont(Font &font)\n{\n    PWindow(wid)->setFont(*PFont(font.GetID()));\n}\n\nvoid Window::SetCursor(Cursor curs)\n{\n    Qt::CursorShape qc;\n\n    switch (curs)\n    {\n    case cursorText:\n        qc = Qt::IBeamCursor;\n        break;\n\n    case cursorUp:\n        qc = Qt::UpArrowCursor;\n        break;\n\n    case cursorWait:\n        qc = Qt::WaitCursor;\n        break;\n\n    case cursorHoriz:\n        qc = Qt::SizeHorCursor;\n        break;\n\n    case cursorVert:\n        qc = Qt::SizeVerCursor;\n        break;\n\n    case cursorHand:\n        qc = Qt::PointingHandCursor;\n        break;\n\n    default:\n        // Note that Qt doesn't have a standard cursor that could be used to\n        // implement cursorReverseArrow.\n        qc = Qt::ArrowCursor;\n    }\n\n    PWindow(wid)->setCursor(qc);\n}\n\nvoid Window::SetTitle(const char *s)\n{\n    PWindow(wid)->setWindowTitle(s);\n}\n\n\nPRectangle Window::GetMonitorRect(Point pt)\n{\n    QPoint qpt = PWindow(wid)->mapToGlobal(QPoint(pt.x, pt.y));\n    QRect qr = QApplication::desktop()->availableGeometry(qpt);\n    qpt = PWindow(wid)->mapFromGlobal(qr.topLeft());\n\n    return PRectangle(qpt.x(), qpt.y(), qpt.x() + qr.width(), qpt.y() + qr.height());\n}\n\n\n// Menu management.\nMenu::Menu() : mid(0)\n{\n}\n\nvoid Menu::CreatePopUp()\n{\n    Destroy();\n    mid = new QsciSciPopup();\n}\n\nvoid Menu::Destroy()\n{\n    QsciSciPopup *m = PMenu(mid);\n\n    if (m)\n    {\n        delete m;\n        mid = 0;\n    }\n}\n\nvoid Menu::Show(Point pt, Window &)\n{\n    PMenu(mid)->popup(QPoint(pt.x, pt.y));\n}\n\n\nclass DynamicLibraryImpl : public DynamicLibrary\n{\npublic:\n    DynamicLibraryImpl(const char *modulePath)\n    {\n        m = new QLibrary(modulePath);\n        m->load();\n    }\n\n    virtual ~DynamicLibraryImpl()\n    {\n        if (m)\n            delete m;\n    }\n\n    virtual Function FindFunction(const char *name)\n    {\n        if (m)\n            return (Function)m->resolve(name);\n\n        return 0;\n    }\n\n    virtual bool IsValid()\n    {\n        return m && m->isLoaded();\n    }\n\nprivate:\n    QLibrary* m;\n};\n\nDynamicLibrary *DynamicLibrary::Load(const char *modulePath)\n{\n    return new DynamicLibraryImpl(modulePath);\n}\n\n\n// Elapsed time.  This implementation assumes that the maximum elapsed time is\n// less than 48 hours.\nElapsedTime::ElapsedTime()\n{\n    QTime now = QTime::currentTime();\n\n    bigBit = now.hour() * 60 * 60 + now.minute() * 60 + now.second();\n    littleBit = now.msec();\n}\n\ndouble ElapsedTime::Duration(bool reset)\n{\n    long endBigBit, endLittleBit;\n    QTime now = QTime::currentTime();\n\n    endBigBit = now.hour() * 60 * 60 + now.minute() * 60 + now.second();\n    endLittleBit = now.msec();\n\n    double duration = endBigBit - bigBit;\n\n    if (duration < 0 || (duration == 0 && endLittleBit < littleBit))\n        duration += 24 * 60 * 60;\n\n    duration += (endLittleBit - littleBit) / 1000.0;\n\n    if (reset)\n    {\n        bigBit = endBigBit;\n        littleBit = endLittleBit;\n    }\n\n    return duration;\n}\n\n\n// Manage system wide parameters.\nColourDesired Platform::Chrome()\n{\n    return ColourDesired(0xe0,0xe0,0xe0);\n}\n\nColourDesired Platform::ChromeHighlight()\n{\n    return ColourDesired(0xff,0xff,0xff);\n}\n\nconst char *Platform::DefaultFont()\n{\n    static QByteArray def_font;\n\n    def_font = QApplication::font().family().toLatin1();\n\n    return def_font.constData();\n}\n\nint Platform::DefaultFontSize()\n{\n    return QApplication::font().pointSize();\n}\n\nunsigned int Platform::DoubleClickTime()\n{\n    return QApplication::doubleClickInterval();\n}\n\nbool Platform::MouseButtonBounce()\n{\n    return true;\n}\n\nvoid Platform::DebugDisplay(const char *s)\n{\n    qDebug(\"%s\", s);\n}\n\nbool Platform::IsKeyDown(int)\n{\n    return false;\n}\n\nlong Platform::SendScintilla(WindowID w, unsigned int msg,\n        unsigned long wParam, long lParam)\n{\n    // This is never called.\n    return 0;\n}\n\nlong Platform::SendScintillaPointer(WindowID w, unsigned int msg,\n        unsigned long wParam, void *lParam)\n{\n    // This is never called.\n    return 0;\n}\n\nbool Platform::IsDBCSLeadByte(int, char)\n{\n    // We don't support DBCS.\n    return false;\n}\n\nint Platform::DBCSCharLength(int, const char *)\n{\n    // We don't support DBCS.\n    return 1;\n}\n\nint Platform::DBCSCharMaxLength()\n{\n    // We don't support DBCS.\n    return 2;\n}\n\nint Platform::Minimum(int a, int b)\n{\n    return (a < b) ? a : b;\n}\n\nint Platform::Maximum(int a, int b)\n{\n    return (a > b) ? a : b;\n}\n\nint Platform::Clamp(int val, int minVal, int maxVal)\n{\n    if (val > maxVal)\n        val = maxVal;\n\n    if (val < minVal)\n        val = minVal;\n\n    return val;\n}\n\n\n//#define TRACE\n\n#ifdef TRACE\nvoid Platform::DebugPrintf(const char *format, ...)\n{\n    char buffer[2000];\n    va_list pArguments;\n\n    va_start(pArguments, format);\n    vsprintf(buffer, format, pArguments);\n    va_end(pArguments);\n\n    DebugDisplay(buffer);\n}\n#else\nvoid Platform::DebugPrintf(const char *, ...)\n{\n}\n#endif\n\nstatic bool assertionPopUps = true;\n\nbool Platform::ShowAssertionPopUps(bool assertionPopUps_)\n{\n    bool ret = assertionPopUps;\n\n    assertionPopUps = assertionPopUps_;\n\n    return ret;\n}\n\nvoid Platform::Assert(const char *c, const char *file, int line)\n{\n    qFatal(\"Assertion [%s] failed at %s %d\\n\", c, file, line);\n}\n\nQSCI_END_SCI_NAMESPACE\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciabstractapis.h",
    "content": "// This module defines interface to the QsciAbstractAPIs class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCIABSTRACTAPIS_H\n#define QSCIABSTRACTAPIS_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n#include <qstringlist.h>\n\n#include <QList>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qsciscintilla.h>\n\n\nclass QsciLexer;\n\n\n//! \\brief The QsciAbstractAPIs class represents the interface to the textual\n//! API information used in call tips and for auto-completion.  A sub-class\n//! will provide the actual implementation of the interface.\n//!\n//! API information is specific to a particular language lexer but can be\n//! shared by multiple instances of the lexer.\nclass QSCINTILLA_EXPORT QsciAbstractAPIs : public QObject\n{\n    Q_OBJECT\n\npublic:\n    //! Constructs a QsciAbstractAPIs instance attached to lexer \\a lexer.  \\a\n    //! lexer becomes the instance's parent object although the instance can\n    //! also be subsequently attached to other lexers.\n    QsciAbstractAPIs(QsciLexer *lexer);\n\n    //! Destroy the QsciAbstractAPIs instance.\n    virtual ~QsciAbstractAPIs();\n\n    //! Return the lexer that the instance is attached to.\n    QsciLexer *lexer() const;\n\n    //! Update the list \\a list with API entries derived from \\a context.  \\a\n    //! context is the list of words in the text preceding the cursor position.\n    //! The characters that make up a word and the characters that separate\n    //! words are defined by the lexer.  The last word is a partial word and\n    //! may be empty if the user has just entered a word separator.\n    virtual void updateAutoCompletionList(const QStringList &context,\n            QStringList &list) = 0;\n\n    //! This is called when the user selects the entry \\a selection from the\n    //! auto-completion list.  A sub-class can use this as a hint to provide\n    //! more specific API entries in future calls to\n    //! updateAutoCompletionList().  The default implementation does nothing.\n    virtual void autoCompletionSelected(const QString &selection);\n\n    //! Return the call tips valid for the context \\a context.  (Note that the\n    //! last word of the context will always be empty.)  \\a commas is the number\n    //! of commas the user has typed after the context and before the cursor\n    //! position.  The exact position of the list of call tips can be adjusted\n    //! by specifying a corresponding left character shift in \\a shifts.  This\n    //! is normally done to correct for any displayed context according to \\a\n    //! style.\n    //!\n    //! \\sa updateAutoCompletionList()\n    virtual QStringList callTips(const QStringList &context, int commas,\n            QsciScintilla::CallTipsStyle style,\n            QList<int> &shifts) = 0;\n\nprivate:\n    QsciLexer *lex;\n\n    QsciAbstractAPIs(const QsciAbstractAPIs &);\n    QsciAbstractAPIs &operator=(const QsciAbstractAPIs &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciapis.h",
    "content": "// This module defines interface to the QsciAPIs class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCIAPIS_H\n#define QSCIAPIS_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n#include <qpair.h>\n#include <qstringlist.h>\n\n#include <QList>\n\n#include <Qsci/qsciabstractapis.h>\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qsciscintilla.h>\n\n\nclass QsciAPIsPrepared;\nclass QsciAPIsWorker;\nclass QsciLexer;\n\n\n//! \\brief The QsciAPIs class provies an implementation of the textual API\n//! information used in call tips and for auto-completion.\n//!\n//! Raw API information is read from one or more files.  Each API function is\n//! described by a single line of text comprising the function's name, followed\n//! by the function's optional comma separated parameters enclosed in\n//! parenthesis, and finally followed by optional explanatory text.\n//!\n//! A function name may be followed by a `?' and a number.  The number is used\n//! by auto-completion to display a registered QPixmap with the function name.\n//!\n//! All function names are used by auto-completion, but only those that include\n//! function parameters are used in call tips.\n//!\n//! QScintilla only deals with prepared API information and not the raw\n//! information described above.  This is done so that large APIs can be\n//! handled while still being responsive to user input.  The conversion of raw\n//! information to prepared information is time consuming (think tens of\n//! seconds) and implemented in a separate thread.  Prepared information can\n//! be quickly saved to and loaded from files.  Such files are portable between\n//! different architectures.\n//!\n//! QScintilla based applications that want to support large APIs would\n//! normally provide the user with the ability to specify a set of, possibly\n//! project specific, raw API files and convert them to prepared files that are\n//! loaded quickly when the application is invoked.\nclass QSCINTILLA_EXPORT QsciAPIs : public QsciAbstractAPIs\n{\n    Q_OBJECT\n\npublic:\n    //! Constructs a QsciAPIs instance attached to lexer \\a lexer.  \\a lexer\n    //! becomes the instance's parent object although the instance can also be\n    //! subsequently attached to other lexers.\n    QsciAPIs(QsciLexer *lexer);\n\n    //! Destroy the QsciAPIs instance.\n    virtual ~QsciAPIs();\n\n    //! Add the single raw API entry \\a entry to the current set.\n    //!\n    //! \\sa clear(), load(), remove()\n    void add(const QString &entry);\n\n    //! Deletes all raw API information.\n    //!\n    //! \\sa add(), load(), remove()\n    void clear();\n\n    //! Load the API information from the file named \\a filename, adding it to\n    //! the current set.  Returns true if successful, otherwise false.\n    bool load(const QString &filename);\n\n    //! Remove the single raw API entry \\a entry from the current set.\n    //!\n    //! \\sa add(), clear(), load()\n    void remove(const QString &entry);\n\n    //! Convert the current raw API information to prepared API information.\n    //! This is implemented by a separate thread.\n    //!\n    //! \\sa cancelPreparation()\n    void prepare();\n\n    //! Cancel the conversion of the current raw API information to prepared\n    //! API information.\n    //!\n    //! \\sa prepare()\n    void cancelPreparation();\n\n    //! Return the default name of the prepared API information file.  It is\n    //! based on the name of the associated lexer and in the directory defined\n    //! by the QSCIDIR environment variable.  If the environment variable isn't\n    //! set then $HOME/.qsci is used.\n    QString defaultPreparedName() const;\n\n    //! Check to see is a prepared API information file named \\a filename\n    //! exists.  If \\a filename is empty then the value returned by\n    //! defaultPreparedName() is used.  Returns true if successful, otherwise\n    //! false.\n    //!\n    //! \\sa defaultPreparedName()\n    bool isPrepared(const QString &filename = QString()) const;\n\n    //! Load the prepared API information from the file named \\a filename.  If\n    //! \\a filename is empty then a name is constructed based on the name of\n    //! the associated lexer and saved in the directory defined by the QSCIDIR\n    //! environment variable.  If the environment variable isn't set then\n    //! $HOME/.qsci is used.  Returns true if successful, otherwise false.\n    bool loadPrepared(const QString &filename = QString());\n\n    //! Save the prepared API information to the file named \\a filename.  If\n    //! \\a filename is empty then a name is constructed based on the name of\n    //! the associated lexer and saved in the directory defined by the QSCIDIR\n    //! environment variable.  If the environment variable isn't set then\n    //! $HOME/.qsci is used.  Returns true if successful, otherwise false.\n    bool savePrepared(const QString &filename = QString()) const;\n\n    //! \\reimp\n    virtual void updateAutoCompletionList(const QStringList &context,\n            QStringList &list);\n\n    //! \\reimp\n    virtual void autoCompletionSelected(const QString &sel);\n\n    //! \\reimp\n    virtual QStringList callTips(const QStringList &context, int commas,\n            QsciScintilla::CallTipsStyle style,\n            QList<int> &shifts);\n\n    //! \\internal Reimplemented to receive termination events from the worker\n    //! thread.\n    virtual bool event(QEvent *e);\n\n    //! Return a list of the installed raw API file names for the associated\n    //! lexer.\n    QStringList installedAPIFiles() const;\n\nsignals:\n    //! This signal is emitted when the conversion of raw API information to\n    //! prepared API information has been cancelled.\n    //!\n    //! \\sa apiPreparationFinished(), apiPreparationStarted()\n    void apiPreparationCancelled();\n\n    //! This signal is emitted when the conversion of raw API information to\n    //! prepared API information starts and can be used to give some visual\n    //! feedback to the user.\n    //!\n    //! \\sa apiPreparationCancelled(), apiPreparationFinished()\n    void apiPreparationStarted();\n    \n    //! This signal is emitted when the conversion of raw API information to\n    //! prepared API information has finished.\n    //!\n    //! \\sa apiPreparationCancelled(), apiPreparationStarted()\n    void apiPreparationFinished();\n\nprivate:\n    friend class QsciAPIsPrepared;\n    friend class QsciAPIsWorker;\n\n    // This indexes a word in a set of raw APIs.  The first part indexes the\n    // entry in the set, the second part indexes the word within the entry.\n    typedef QPair<quint32, quint32> WordIndex;\n\n    // This is a list of word indexes.\n    typedef QList<WordIndex> WordIndexList;\n\n    QsciAPIsWorker *worker;\n    QStringList old_context;\n    QStringList::const_iterator origin;\n    int origin_len;\n    QString unambiguous_context;\n    QStringList apis;\n    QsciAPIsPrepared *prep;\n\n    static bool enoughCommas(const QString &s, int commas);\n\n    QStringList positionOrigin(const QStringList &context, QString &path);\n    bool originStartsWith(const QString &path, const QString &wsep);\n    const WordIndexList *wordIndexOf(const QString &word) const;\n    void lastCompleteWord(const QString &word, QStringList &with_context,\n            bool &unambig);\n    void lastPartialWord(const QString &word, QStringList &with_context,\n            bool &unambig);\n    void addAPIEntries(const WordIndexList &wl, bool complete,\n            QStringList &with_context, bool &unambig);\n    QString prepName(const QString &filename, bool mkpath = false) const;\n    void deleteWorker();\n\n    QsciAPIs(const QsciAPIs &);\n    QsciAPIs &operator=(const QsciAPIs &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscicommand.h",
    "content": "// This defines the interface to the QsciCommand class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCICOMMAND_H\n#define QSCICOMMAND_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qstring.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qsciscintillabase.h>\n\n\nclass QsciScintilla;\n\n\n//! \\brief The QsciCommand class represents an internal editor command that may\n//! have one or two keys bound to it.\n//!\n//! Methods are provided to change the keys bound to the command and to remove\n//! a key binding.  Each command has a user friendly description of the command\n//! for use in key mapping dialogs.\nclass QSCINTILLA_EXPORT QsciCommand\n{\npublic:\n    //! This enum defines the different commands that can be assigned to a key.\n    enum Command {\n        //! Move down one line.\n        LineDown = QsciScintillaBase::SCI_LINEDOWN,\n\n        //! Extend the selection down one line.\n        LineDownExtend = QsciScintillaBase::SCI_LINEDOWNEXTEND,\n\n        //! Extend the rectangular selection down one line.\n        LineDownRectExtend = QsciScintillaBase::SCI_LINEDOWNRECTEXTEND,\n\n        //! Scroll the view down one line.\n        LineScrollDown = QsciScintillaBase::SCI_LINESCROLLDOWN,\n\n        //! Move up one line.\n        LineUp = QsciScintillaBase::SCI_LINEUP,\n\n        //! Extend the selection up one line.\n        LineUpExtend = QsciScintillaBase::SCI_LINEUPEXTEND,\n\n        //! Extend the rectangular selection up one line.\n        LineUpRectExtend = QsciScintillaBase::SCI_LINEUPRECTEXTEND,\n\n        //! Scroll the view up one line.\n        LineScrollUp = QsciScintillaBase::SCI_LINESCROLLUP,\n\n        //! Scroll to the start of the document.\n        ScrollToStart = QsciScintillaBase::SCI_SCROLLTOSTART,\n\n        //! Scroll to the end of the document.\n        ScrollToEnd = QsciScintillaBase::SCI_SCROLLTOEND,\n\n        //! Scroll vertically to centre the current line.\n        VerticalCentreCaret = QsciScintillaBase::SCI_VERTICALCENTRECARET,\n\n        //! Move down one paragraph.\n        ParaDown = QsciScintillaBase::SCI_PARADOWN,\n\n        //! Extend the selection down one paragraph.\n        ParaDownExtend = QsciScintillaBase::SCI_PARADOWNEXTEND,\n\n        //! Move up one paragraph.\n        ParaUp = QsciScintillaBase::SCI_PARAUP,\n\n        //! Extend the selection up one paragraph.\n        ParaUpExtend = QsciScintillaBase::SCI_PARAUPEXTEND,\n\n        //! Move left one character.\n        CharLeft = QsciScintillaBase::SCI_CHARLEFT,\n\n        //! Extend the selection left one character.\n        CharLeftExtend = QsciScintillaBase::SCI_CHARLEFTEXTEND,\n\n        //! Extend the rectangular selection left one character.\n        CharLeftRectExtend = QsciScintillaBase::SCI_CHARLEFTRECTEXTEND,\n\n        //! Move right one character.\n        CharRight = QsciScintillaBase::SCI_CHARRIGHT,\n\n        //! Extend the selection right one character.\n        CharRightExtend = QsciScintillaBase::SCI_CHARRIGHTEXTEND,\n\n        //! Extend the rectangular selection right one character.\n        CharRightRectExtend = QsciScintillaBase::SCI_CHARRIGHTRECTEXTEND,\n\n        //! Move left one word.\n        WordLeft = QsciScintillaBase::SCI_WORDLEFT,\n\n        //! Extend the selection left one word.\n        WordLeftExtend = QsciScintillaBase::SCI_WORDLEFTEXTEND,\n\n        //! Move right one word.\n        WordRight = QsciScintillaBase::SCI_WORDRIGHT,\n\n        //! Extend the selection right one word.\n        WordRightExtend = QsciScintillaBase::SCI_WORDRIGHTEXTEND,\n\n        //! Move to the end of the previous word.\n        WordLeftEnd = QsciScintillaBase::SCI_WORDLEFTEND,\n\n        //! Extend the selection to the end of the previous word.\n        WordLeftEndExtend = QsciScintillaBase::SCI_WORDLEFTENDEXTEND,\n\n        //! Move to the end of the next word.\n        WordRightEnd = QsciScintillaBase::SCI_WORDRIGHTEND,\n\n        //! Extend the selection to the end of the next word.\n        WordRightEndExtend = QsciScintillaBase::SCI_WORDRIGHTENDEXTEND,\n\n        //! Move left one word part.\n        WordPartLeft = QsciScintillaBase::SCI_WORDPARTLEFT,\n\n        //! Extend the selection left one word part.\n        WordPartLeftExtend = QsciScintillaBase::SCI_WORDPARTLEFTEXTEND,\n\n        //! Move right one word part.\n        WordPartRight = QsciScintillaBase::SCI_WORDPARTRIGHT,\n\n        //! Extend the selection right one word part.\n        WordPartRightExtend = QsciScintillaBase::SCI_WORDPARTRIGHTEXTEND,\n\n        //! Move to the start of the document line.\n        Home = QsciScintillaBase::SCI_HOME,\n\n        //! Extend the selection to the start of the document line.\n        HomeExtend = QsciScintillaBase::SCI_HOMEEXTEND,\n\n        //! Extend the rectangular selection to the start of the document line.\n        HomeRectExtend = QsciScintillaBase::SCI_HOMERECTEXTEND,\n\n        //! Move to the start of the displayed line.\n        HomeDisplay = QsciScintillaBase::SCI_HOMEDISPLAY,\n\n        //! Extend the selection to the start of the displayed line.\n        HomeDisplayExtend = QsciScintillaBase::SCI_HOMEDISPLAYEXTEND,\n\n        //! Move to the start of the displayed or document line.\n        HomeWrap = QsciScintillaBase::SCI_HOMEWRAP,\n\n        //! Extend the selection to the start of the displayed or document\n        //! line.\n        HomeWrapExtend = QsciScintillaBase::SCI_HOMEWRAPEXTEND,\n\n        //! Move to the first visible character in the document line.\n        VCHome = QsciScintillaBase::SCI_VCHOME,\n\n        //! Extend the selection to the first visible character in the document\n        //! line.\n        VCHomeExtend = QsciScintillaBase::SCI_VCHOMEEXTEND,\n\n        //! Extend the rectangular selection to the first visible character in\n        //! the document line.\n        VCHomeRectExtend = QsciScintillaBase::SCI_VCHOMERECTEXTEND,\n\n        //! Move to the first visible character of the displayed or document\n        //! line.\n        VCHomeWrap = QsciScintillaBase::SCI_VCHOMEWRAP,\n\n        //! Extend the selection to the first visible character of the\n        //! displayed or document line.\n        VCHomeWrapExtend = QsciScintillaBase::SCI_VCHOMEWRAPEXTEND,\n\n        //! Move to the end of the document line.\n        LineEnd = QsciScintillaBase::SCI_LINEEND,\n\n        //! Extend the selection to the end of the document line.\n        LineEndExtend = QsciScintillaBase::SCI_LINEENDEXTEND,\n\n        //! Extend the rectangular selection to the end of the document line.\n        LineEndRectExtend = QsciScintillaBase::SCI_LINEENDRECTEXTEND,\n\n        //! Move to the end of the displayed line.\n        LineEndDisplay = QsciScintillaBase::SCI_LINEENDDISPLAY,\n\n        //! Extend the selection to the end of the displayed line.\n        LineEndDisplayExtend = QsciScintillaBase::SCI_LINEENDDISPLAYEXTEND,\n\n        //! Move to the end of the displayed or document line.\n        LineEndWrap = QsciScintillaBase::SCI_LINEENDWRAP,\n\n        //! Extend the selection to the end of the displayed or document line.\n        LineEndWrapExtend = QsciScintillaBase::SCI_LINEENDWRAPEXTEND,\n\n        //! Move to the start of the document.\n        DocumentStart = QsciScintillaBase::SCI_DOCUMENTSTART,\n\n        //! Extend the selection to the start of the document.\n        DocumentStartExtend = QsciScintillaBase::SCI_DOCUMENTSTARTEXTEND,\n\n        //! Move to the end of the document.\n        DocumentEnd = QsciScintillaBase::SCI_DOCUMENTEND,\n\n        //! Extend the selection to the end of the document.\n        DocumentEndExtend = QsciScintillaBase::SCI_DOCUMENTENDEXTEND,\n\n        //! Move up one page.\n        PageUp = QsciScintillaBase::SCI_PAGEUP,\n\n        //! Extend the selection up one page.\n        PageUpExtend = QsciScintillaBase::SCI_PAGEUPEXTEND,\n\n        //! Extend the rectangular selection up one page.\n        PageUpRectExtend = QsciScintillaBase::SCI_PAGEUPRECTEXTEND,\n\n        //! Move down one page.\n        PageDown = QsciScintillaBase::SCI_PAGEDOWN,\n\n        //! Extend the selection down one page.\n        PageDownExtend = QsciScintillaBase::SCI_PAGEDOWNEXTEND,\n\n        //! Extend the rectangular selection down one page.\n        PageDownRectExtend = QsciScintillaBase::SCI_PAGEDOWNRECTEXTEND,\n\n        //! Stuttered move up one page.\n        StutteredPageUp = QsciScintillaBase::SCI_STUTTEREDPAGEUP,\n\n        //! Stuttered extend the selection up one page.\n        StutteredPageUpExtend = QsciScintillaBase::SCI_STUTTEREDPAGEUPEXTEND,\n\n        //! Stuttered move down one page.\n        StutteredPageDown = QsciScintillaBase::SCI_STUTTEREDPAGEDOWN,\n\n        //! Stuttered extend the selection down one page.\n        StutteredPageDownExtend = QsciScintillaBase::SCI_STUTTEREDPAGEDOWNEXTEND,\n\n        //! Delete the current character.\n        Delete = QsciScintillaBase::SCI_CLEAR,\n\n        //! Delete the previous character.\n        DeleteBack = QsciScintillaBase::SCI_DELETEBACK,\n\n        //! Delete the previous character if not at start of line.\n        DeleteBackNotLine = QsciScintillaBase::SCI_DELETEBACKNOTLINE,\n\n        //! Delete the word to the left.\n        DeleteWordLeft = QsciScintillaBase::SCI_DELWORDLEFT,\n\n        //! Delete the word to the right.\n        DeleteWordRight = QsciScintillaBase::SCI_DELWORDRIGHT,\n\n        //! Delete right to the end of the next word.\n        DeleteWordRightEnd = QsciScintillaBase::SCI_DELWORDRIGHTEND,\n\n        //! Delete the line to the left.\n        DeleteLineLeft = QsciScintillaBase::SCI_DELLINELEFT,\n\n        //! Delete the line to the right.\n        DeleteLineRight = QsciScintillaBase::SCI_DELLINERIGHT,\n\n        //! Delete the current line.\n        LineDelete = QsciScintillaBase::SCI_LINEDELETE,\n\n        //! Cut the current line to the clipboard.\n        LineCut = QsciScintillaBase::SCI_LINECUT,\n\n        //! Copy the current line to the clipboard.\n        LineCopy = QsciScintillaBase::SCI_LINECOPY,\n\n        //! Transpose the current and previous lines.\n        LineTranspose = QsciScintillaBase::SCI_LINETRANSPOSE,\n\n        //! Duplicate the current line.\n        LineDuplicate = QsciScintillaBase::SCI_LINEDUPLICATE,\n\n        //! Select the whole document.\n        SelectAll = QsciScintillaBase::SCI_SELECTALL,\n\n        //! Move the selected lines up one line.\n        MoveSelectedLinesUp = QsciScintillaBase::SCI_MOVESELECTEDLINESUP,\n\n        //! Move the selected lines down one line.\n        MoveSelectedLinesDown = QsciScintillaBase::SCI_MOVESELECTEDLINESDOWN,\n\n        //! Duplicate the selection.\n        SelectionDuplicate = QsciScintillaBase::SCI_SELECTIONDUPLICATE,\n\n        //! Convert the selection to lower case.\n        SelectionLowerCase = QsciScintillaBase::SCI_LOWERCASE,\n\n        //! Convert the selection to upper case.\n        SelectionUpperCase = QsciScintillaBase::SCI_UPPERCASE,\n\n        //! Cut the selection to the clipboard.\n        SelectionCut = QsciScintillaBase::SCI_CUT,\n\n        //! Copy the selection to the clipboard.\n        SelectionCopy = QsciScintillaBase::SCI_COPY,\n\n        //! Paste from the clipboard.\n        Paste = QsciScintillaBase::SCI_PASTE,\n\n        //! Toggle insert/overtype.\n        EditToggleOvertype = QsciScintillaBase::SCI_EDITTOGGLEOVERTYPE,\n\n        //! Insert a platform dependent newline.\n        Newline = QsciScintillaBase::SCI_NEWLINE,\n\n        //! Insert a formfeed.\n        Formfeed = QsciScintillaBase::SCI_FORMFEED,\n\n        //! Indent one level.\n        Tab = QsciScintillaBase::SCI_TAB,\n\n        //! De-indent one level.\n        Backtab = QsciScintillaBase::SCI_BACKTAB,\n\n        //! Cancel any current operation.\n        Cancel = QsciScintillaBase::SCI_CANCEL,\n\n        //! Undo the last command.\n        Undo = QsciScintillaBase::SCI_UNDO,\n\n        //! Redo the last command.\n        Redo = QsciScintillaBase::SCI_REDO,\n\n        //! Zoom in.\n        ZoomIn = QsciScintillaBase::SCI_ZOOMIN,\n\n        //! Zoom out.\n        ZoomOut = QsciScintillaBase::SCI_ZOOMOUT,\n    };\n\n    //! Return the command that will be executed by this instance.\n    Command command() const {return scicmd;}\n\n    //! Execute the command.\n    void execute();\n\n    //! Binds the key \\a key to the command.  If \\a key is 0 then the key\n    //! binding is removed.  If \\a key is invalid then the key binding is\n    //! unchanged.  Valid keys are any visible or control character or any\n    //! of \\c Qt::Key_Down, \\c Qt::Key_Up, \\c Qt::Key_Left, \\c Qt::Key_Right,\n    //! \\c Qt::Key_Home, \\c Qt::Key_End, \\c Qt::Key_PageUp,\n    //! \\c Qt::Key_PageDown, \\c Qt::Key_Delete, \\c Qt::Key_Insert,\n    //! \\c Qt::Key_Escape, \\c Qt::Key_Backspace, \\c Qt::Key_Tab,\n    //! \\c Qt::Key_Backtab, \\c Qt::Key_Return, \\c Qt::Key_Enter,\n    //! \\c Qt::Key_Super_L, \\c Qt::Key_Super_R or \\c Qt::Key_Menu.  Keys may be\n    //! modified with any combination of \\c Qt::ShiftModifier,\n    //! \\c Qt::ControlModifier, \\c Qt::AltModifier and \\c Qt::MetaModifier.\n    //!\n    //! \\sa key(), setAlternateKey(), validKey()\n    void setKey(int key);\n\n    //! Binds the alternate key \\a altkey to the command.  If \\a key is 0\n    //! then the alternate key binding is removed.\n    //!\n    //! \\sa alternateKey(), setKey(), validKey()\n    void setAlternateKey(int altkey);\n\n    //! The key that is currently bound to the command is returned.\n    //!\n    //! \\sa setKey(), alternateKey()\n    int key() const {return qkey;}\n\n    //! The alternate key that is currently bound to the command is\n    //! returned.\n    //!\n    //! \\sa setAlternateKey(), key()\n    int alternateKey() const {return qaltkey;}\n\n    //! If the key \\a key is valid then true is returned.\n    static bool validKey(int key);\n\n    //! The user friendly description of the command is returned.\n    QString description() const;\n\nprivate:\n    friend class QsciCommandSet;\n\n    QsciCommand(QsciScintilla *qs, Command cmd, int key, int altkey,\n            const char *desc);\n\n    void bindKey(int key,int &qk,int &scik);\n\n    QsciScintilla *qsCmd;\n    Command scicmd;\n    int qkey, scikey, qaltkey, scialtkey;\n    const char *descCmd;\n\n    QsciCommand(const QsciCommand &);\n    QsciCommand &operator=(const QsciCommand &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscicommandset.h",
    "content": "// This defines the interface to the QsciCommandSet class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCICOMMANDSET_H\n#define QSCICOMMANDSET_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qglobal.h>\n\n#include <QList>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscicommand.h>\n\n\nQT_BEGIN_NAMESPACE\nclass QSettings;\nQT_END_NAMESPACE\n\nclass QsciScintilla;\n\n\n//! \\brief The QsciCommandSet class represents the set of all internal editor\n//! commands that may have keys bound.\n//!\n//! Methods are provided to access the individual commands and to read and\n//! write the current bindings from and to settings files.\nclass QSCINTILLA_EXPORT QsciCommandSet\n{\npublic:\n    //! The key bindings for each command in the set are read from the\n    //! settings \\a qs.  \\a prefix is prepended to the key of each entry.\n    //! true is returned if there was no error.\n    //!\n    //! \\sa writeSettings()\n    bool readSettings(QSettings &qs, const char *prefix = \"/Scintilla\");\n\n    //! The key bindings for each command in the set are written to the\n    //! settings \\a qs.  \\a prefix is prepended to the key of each entry.\n    //! true is returned if there was no error.\n    //!\n    //! \\sa readSettings()\n    bool writeSettings(QSettings &qs, const char *prefix = \"/Scintilla\");\n\n    //! The commands in the set are returned as a list.\n    QList<QsciCommand *> &commands() {return cmds;}\n\n    //! The primary keys bindings for all commands are removed.\n    void clearKeys();\n\n    //! The alternate keys bindings for all commands are removed.\n    void clearAlternateKeys();\n\n    // Find the command that is bound to \\a key.\n    QsciCommand *boundTo(int key) const;\n\n    // Find a specific command \\a command.\n    QsciCommand *find(QsciCommand::Command command) const;\n\nprivate:\n    friend class QsciScintilla;\n\n    QsciCommandSet(QsciScintilla *qs);\n    ~QsciCommandSet();\n\n    QsciScintilla *qsci;\n    QList<QsciCommand *> cmds;\n\n    QsciCommandSet(const QsciCommandSet &);\n    QsciCommandSet &operator=(const QsciCommandSet &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscidocument.h",
    "content": "// This defines the interface to the QsciDocument class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCIDOCUMENT_H\n#define QSCIDOCUMENT_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <Qsci/qsciglobal.h>\n\n\nclass QsciScintillaBase;\nclass QsciDocumentP;\n\n\n//! \\brief The QsciDocument class represents a document to be edited.\n//!\n//! It is an opaque class that can be attached to multiple instances of\n//! QsciScintilla to create different simultaneous views of the same document.\n//! QsciDocument uses implicit sharing so that copying class instances is a\n//! cheap operation.\nclass QSCINTILLA_EXPORT QsciDocument\n{\npublic:\n    //! Create a new unattached document.\n    QsciDocument();\n    virtual ~QsciDocument();\n\n    QsciDocument(const QsciDocument &);\n    QsciDocument &operator=(const QsciDocument &);\n\nprivate:\n    friend class QsciScintilla;\n\n    void attach(const QsciDocument &that);\n    void detach();\n    void display(QsciScintillaBase *qsb, const QsciDocument *from);\n    void undisplay(QsciScintillaBase *qsb);\n\n    bool isModified() const;\n    void setModified(bool m);\n\n    QsciDocumentP *pdoc;\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h",
    "content": "// This module defines various things common to all of the Scintilla Qt port.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCIGLOBAL_H\n#define QSCIGLOBAL_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qglobal.h>\n\n\n#define QSCINTILLA_VERSION      0x020804\n#define QSCINTILLA_VERSION_STR  \"2.8.4\"\n\n\n// Under Windows, define QSCINTILLA_MAKE_DLL to create a Scintilla DLL, or\n// define QSCINTILLA_DLL to link against a Scintilla DLL, or define neither\n// to either build or link against a static Scintilla library.\n#if defined(Q_OS_WIN)\n\n#if defined(QSCINTILLA_DLL)\n#define QSCINTILLA_EXPORT       __declspec(dllimport)\n#elif defined(QSCINTILLA_MAKE_DLL)\n#define QSCINTILLA_EXPORT       __declspec(dllexport)\n#endif\n\n#endif\n\n#if !defined(QSCINTILLA_EXPORT)\n#define QSCINTILLA_EXPORT\n#endif\n\n\n#if !defined(QT_BEGIN_NAMESPACE)\n#define QT_BEGIN_NAMESPACE\n#define QT_END_NAMESPACE\n#endif\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexer.h",
    "content": "// This defines the interface to the QsciLexer class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXER_H\n#define QSCILEXER_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qmap.h>\n#include <qobject.h>\n#include <qstring.h>\n\n#include <Qsci/qsciglobal.h>\n\n\nQT_BEGIN_NAMESPACE\nclass QSettings;\nQT_END_NAMESPACE\n\nclass QsciAbstractAPIs;\nclass QsciScintilla;\n\n\n//! \\brief The QsciLexer class is an abstract class used as a base for language\n//! lexers.\n//!\n//! A lexer scans the text breaking it up into separate language objects, e.g.\n//! keywords, strings, operators.  The lexer then uses a different style to\n//! draw each object.  A style is identified by a style number and has a number\n//! of attributes, including colour and font.  A specific language lexer will\n//! implement appropriate default styles which can be overriden by an\n//! application by further sub-classing the specific language lexer.\n//!\n//! A lexer may provide one or more sets of words to be recognised as keywords.\n//! Most lexers only provide one set, but some may support languages embedded\n//! in other languages and provide several sets.\n//!\n//! QsciLexer provides convenience methods for saving and restoring user\n//! preferences for fonts and colours.\n//!\n//! If you want to write a lexer for a new language then you can add it to the\n//! underlying Scintilla code and implement a corresponding QsciLexer sub-class\n//! to manage the different styles used.  Alternatively you can implement a\n//! sub-class of QsciLexerCustom.\nclass QSCINTILLA_EXPORT QsciLexer : public QObject\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexer with parent \\a parent.  \\a parent is typically\n    //! the QsciScintilla instance.\n    QsciLexer(QObject *parent = 0);\n\n    //! Destroy the QSciLexer.\n    virtual ~QsciLexer();\n\n    //! Returns the name of the language.  It must be re-implemented by a\n    //! sub-class.\n    virtual const char *language() const = 0;\n\n    //! Returns the name of the lexer.  If 0 is returned then the lexer's\n    //! numeric identifier is used.  The default implementation returns 0.\n    //!\n    //! \\sa lexerId()\n    virtual const char *lexer() const;\n\n    //! Returns the identifier (i.e. a QsciScintillaBase::SCLEX_* value) of the\n    //! lexer.  This is only used if lexer() returns 0.  The default\n    //! implementation returns QsciScintillaBase::SCLEX_CONTAINER.\n    //!\n    //! \\sa lexer()\n    virtual int lexerId() const;\n\n    //! Returns the current API set or 0 if there isn't one.\n    //!\n    //! \\sa setAPIs()\n    QsciAbstractAPIs *apis() const;\n\n    //! \\internal Returns the characters that can fill up auto-completion.\n    virtual const char *autoCompletionFillups() const;\n\n    //! \\internal Returns the list of character sequences that can separate\n    //! auto-completion words.  The first in the list is assumed to be the\n    //! sequence used to separate words in the lexer's API files.\n    virtual QStringList autoCompletionWordSeparators() const;\n\n    //! Returns the auto-indentation style.  The default is 0 if the\n    //! language is block structured, or QsciScintilla::AiMaintain if not.\n    //!\n    //! \\sa setAutoIndentStyle(), QsciScintilla::AiMaintain,\n    //! QsciScintilla::AiOpening, QsciScintilla::AiClosing\n    int autoIndentStyle();\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the end of a block for\n    //! auto-indentation.  The style is returned via \\a style.\n    virtual const char *blockEnd(int *style = 0) const;\n\n    //! \\internal Returns the number of lines prior to the current one when\n    //! determining the scope of a block when auto-indenting.\n    virtual int blockLookback() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The style is returned via \\a style.\n    virtual const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of keywords in a\n    //! particular style that define the start of a block for\n    //! auto-indentation.  The style is returned via \\a style.\n    virtual const char *blockStartKeyword(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    virtual int braceStyle() const;\n\n    //! \\internal Returns true if the language is case sensitive.  The default\n    //! is true.\n    virtual bool caseSensitive() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //! The default colour is that returned by defaultColor().\n    //!\n    //! \\sa defaultColor(), paper()\n    virtual QColor color(int style) const;\n\n    //! Returns the end-of-line for style number \\a style.  The default is\n    //! false.\n    virtual bool eolFill(int style) const;\n\n    //! Returns the font for style number \\a style.  The default font is\n    //! that returned by defaultFont().\n    //!\n    //! \\sa defaultFont()\n    virtual QFont font(int style) const;\n\n    //! \\internal Returns the view used for indentation guides.\n    virtual int indentationGuideView() const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.  0 is returned if there\n    //! is no such set.\n    virtual const char *keywords(int set) const;\n\n    //! \\internal Returns the number of the style used for whitespace.  The\n    //! default implementation returns 0 which is the convention adopted by\n    //! most lexers.\n    virtual int defaultStyle() const;\n\n    //! Returns the descriptive name for style number \\a style.  For a valid\n    //! style number for this language a non-empty QString must be returned.\n    //! If the style number is invalid then an empty QString must be returned.\n    //! This is intended to be used in user preference dialogs.\n    virtual QString description(int style) const = 0;\n\n    //! Returns the background colour of the text for style number\n    //! \\a style.\n    //!\n    //! \\sa defaultPaper(), color()\n    virtual QColor paper(int style) const;\n\n    //! Returns the default text colour.\n    //!\n    //! \\sa setDefaultColor()\n    QColor defaultColor() const;\n\n    //! Returns the default text colour for style number \\a style.\n    virtual QColor defaultColor(int style) const;\n\n    //! Returns the default end-of-line for style number \\a style.  The default\n    //! is false.\n    virtual bool defaultEolFill(int style) const;\n\n    //! Returns the default font.\n    //!\n    //! \\sa setDefaultFont()\n    QFont defaultFont() const;\n\n    //! Returns the default font for style number \\a style.\n    virtual QFont defaultFont(int style) const;\n\n    //! Returns the default paper colour.\n    //!\n    //! \\sa setDefaultPaper()\n    QColor defaultPaper() const;\n\n    //! Returns the default paper colour for style number \\a style.\n    virtual QColor defaultPaper(int style) const;\n\n    //! Returns the QsciScintilla instance that the lexer is currently attached\n    //! to or 0 if it is unattached.\n    QsciScintilla *editor() const {return attached_editor;}\n\n    //! The current set of APIs is set to \\a apis.  If \\a apis is 0 then any\n    //! existing APIs for this lexer are removed.\n    //!\n    //! \\sa apis()\n    void setAPIs(QsciAbstractAPIs *apis);\n\n    //! The default text colour is set to \\a c.\n    //!\n    //! \\sa defaultColor(), color()\n    void setDefaultColor(const QColor &c);\n\n    //! The default font is set to \\a f.\n    //!\n    //! \\sa defaultFont(), font()\n    void setDefaultFont(const QFont &f);\n\n    //! The default paper colour is set to \\a c.\n    //!\n    //! \\sa defaultPaper(), paper()\n    void setDefaultPaper(const QColor &c);\n\n    //! \\internal Set the QsciScintilla instance that the lexer is attached to.\n    virtual void setEditor(QsciScintilla *editor);\n\n    //! The colour, paper, font and end-of-line for each style number, and\n    //! all lexer specific properties are read from the settings \\a qs.\n    //! \\a prefix is prepended to the key of each entry.  true is returned\n    //! if there was no error.\n    //!\n    //! \\sa writeSettings(), QsciScintilla::setLexer()\n    bool readSettings(QSettings &qs,const char *prefix = \"/Scintilla\");\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    virtual void refreshProperties();\n\n    //! Returns the number of style bits needed by the lexer.  Normally this\n    //! should only be re-implemented by custom lexers.\n    virtual int styleBitsNeeded() const;\n\n    //! Returns the string of characters that comprise a word.  The default is\n    //! 0 which implies the upper and lower case alphabetic characters and\n    //! underscore.\n    virtual const char *wordCharacters() const;\n\n    //! The colour, paper, font and end-of-line for each style number, and\n    //! all lexer specific properties are written to the settings \\a qs.\n    //! \\a prefix is prepended to the key of each entry.  true is returned\n    //! if there was no error.\n    //!\n    //! \\sa readSettings()\n    bool writeSettings(QSettings &qs,\n               const char *prefix = \"/Scintilla\") const;\n\npublic slots:\n    //! The auto-indentation style is set to \\a autoindentstyle.\n    //!\n    //! \\sa autoIndentStyle(), QsciScintilla::AiMaintain,\n    //! QsciScintilla::AiOpening, QsciScintilla::AiClosing\n    virtual void setAutoIndentStyle(int autoindentstyle);\n\n    //! The foreground colour for style number \\a style is set to \\a c.  If\n    //! \\a style is -1 then the colour is set for all styles.\n    virtual void setColor(const QColor &c,int style = -1);\n\n    //! The end-of-line fill for style number \\a style is set to\n    //! \\a eoffill.  If \\a style is -1 then the fill is set for all styles.\n    virtual void setEolFill(bool eoffill,int style = -1);\n\n    //! The font for style number \\a style is set to \\a f.  If \\a style is\n    //! -1 then the font is set for all styles.\n    virtual void setFont(const QFont &f,int style = -1);\n\n    //! The background colour for style number \\a style is set to \\a c.  If\n    //! \\a style is -1 then the colour is set for all styles.\n    virtual void setPaper(const QColor &c,int style = -1);\n\nsignals:\n    //! This signal is emitted when the foreground colour of style number\n    //! \\a style has changed.  The new colour is \\a c.\n    void colorChanged(const QColor &c,int style);\n\n    //! This signal is emitted when the end-of-file fill of style number\n    //! \\a style has changed.  The new fill is \\a eolfilled.\n    void eolFillChanged(bool eolfilled,int style);\n\n    //! This signal is emitted when the font of style number \\a style has\n    //! changed.  The new font is \\a f.\n    void fontChanged(const QFont &f,int style);\n\n    //! This signal is emitted when the background colour of style number\n    //! \\a style has changed.  The new colour is \\a c.\n    void paperChanged(const QColor &c,int style);\n\n    //! This signal is emitted when the value of the lexer property \\a prop\n    //! needs to be changed.  The new value is \\a val.\n    void propertyChanged(const char *prop, const char *val);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    virtual bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    virtual bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    struct StyleData {\n        QFont font;\n        QColor color;\n        QColor paper;\n        bool eol_fill;\n    };\n\n    struct StyleDataMap {\n        bool style_data_set;\n        QMap<int, StyleData> style_data;\n    };\n\n    StyleDataMap *style_map;\n\n    int autoIndStyle;\n    QFont defFont;\n    QColor defColor;\n    QColor defPaper;\n    QsciAbstractAPIs *apiSet;\n    QsciScintilla *attached_editor;\n\n    void setStyleDefaults() const;\n    StyleData &styleData(int style) const;\n\n    QsciLexer(const QsciLexer &);\n    QsciLexer &operator=(const QsciLexer &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexeravs.h",
    "content": "// This defines the interface to the QsciLexerAVS class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERAVS_H\n#define QSCILEXERAVS_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerAVS class encapsulates the Scintilla AVS lexer.\nclass QSCINTILLA_EXPORT QsciLexerAVS : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! AVS lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A block comment.\n        BlockComment = 1,\n\n        //! A nested block comment.\n        NestedBlockComment = 2,\n\n        //! A line comment.\n        LineComment = 3,\n\n        //! A number.\n        Number = 4,\n\n        //! An operator.\n        Operator = 5,\n\n        //! An identifier\n        Identifier = 6,\n\n        //! A string.\n        String = 7,\n\n        //! A triple quoted string.\n        TripleString = 8,\n\n        //! A keyword (as defined by keyword set number 1)..\n        Keyword = 9,\n\n        //! A filter (as defined by keyword set number 2).\n        Filter = 10,\n\n        //! A plugin (as defined by keyword set number 3).\n        Plugin = 11,\n\n        //! A function (as defined by keyword set number 4).\n        Function = 12,\n\n        //! A clip property (as defined by keyword set number 5).\n        ClipProperty = 13,\n\n        //! A keyword defined in keyword set number 6.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet6 = 14\n    };\n\n    //! Construct a QsciLexerAVS with parent \\a parent.  \\a parent is typically\n    //! the QsciScintilla instance.\n    QsciLexerAVS(QObject *parent = 0);\n\n    //! Destroys the QsciLexerAVS instance.\n    virtual ~QsciLexerAVS();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the propertyChanged()\n    //! signal as required.\n    void refreshProperties();\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\npublic slots:\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n\n    bool fold_comments;\n    bool fold_compact;\n\n    QsciLexerAVS(const QsciLexerAVS &);\n    QsciLexerAVS &operator=(const QsciLexerAVS &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerbash.h",
    "content": "// This defines the interface to the QsciLexerBash class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERBASH_H\n#define QSCILEXERBASH_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerBash class encapsulates the Scintilla Bash lexer.\nclass QSCINTILLA_EXPORT QsciLexerBash : public QsciLexer\n{\n\tQ_OBJECT\n\npublic:\n\t//! This enum defines the meanings of the different styles used by the\n\t//! Bash lexer.\n\tenum {\n\t\t//! The default.\n\t\tDefault = 0,\n\n\t\t//! An error.\n\t\tError = 1,\n\n\t\t//! A comment.\n\t\tComment = 2,\n\n\t\t//! A number.\n\t\tNumber = 3,\n\n\t\t//! A keyword.\n\t\tKeyword = 4,\n\n\t\t//! A double-quoted string.\n\t\tDoubleQuotedString = 5,\n\n\t\t//! A single-quoted string.\n\t\tSingleQuotedString = 6,\n\n\t\t//! An operator.\n\t\tOperator = 7,\n\n\t\t//! An identifier\n\t\tIdentifier = 8,\n\n\t\t//! A scalar.\n\t\tScalar = 9,\n\n\t\t//! Parameter expansion.\n\t\tParameterExpansion = 10,\n\n\t\t//! Backticks.\n\t\tBackticks = 11,\n\n\t\t//! A here document delimiter.\n\t\tHereDocumentDelimiter = 12,\n\n\t\t//! A single quoted here document.\n\t\tSingleQuotedHereDocument = 13\n\t};\n\n\t//! Construct a QsciLexerBash with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n\tQsciLexerBash(QObject *parent = 0);\n\n\t//! Destroys the QsciLexerBash instance.\n\tvirtual ~QsciLexerBash();\n\n\t//! Returns the name of the language.\n\tconst char *language() const;\n\n\t//! Returns the name of the lexer.  Some lexers support a number of\n\t//! languages.\n\tconst char *lexer() const;\n\n\t//! \\internal Returns the style used for braces for brace matching.\n\tint braceStyle() const;\n\n\t//! Returns the string of characters that comprise a word.\n\tconst char *wordCharacters() const;\n\n\t//! Returns the foreground colour of the text for style number \\a style.\n\t//!\n\t//! \\sa defaultPaper()\n\tQColor defaultColor(int style) const;\n\n\t//! Returns the end-of-line fill for style number \\a style.\n\tbool defaultEolFill(int style) const;\n\n\t//! Returns the font for style number \\a style.\n\tQFont defaultFont(int style) const;\n\n\t//! Returns the background colour of the text for style number \\a style.\n\t//!\n\t//! \\sa defaultColor()\n\tQColor defaultPaper(int style) const;\n\n\t//! Returns the set of keywords for the keyword set \\a set recognised\n\t//! by the lexer as a space separated string.\n\tconst char *keywords(int set) const;\n\n\t//! Returns the descriptive name for style number \\a style.  If the\n\t//! style is invalid for this language then an empty QString is returned.\n\t//! This is intended to be used in user preference dialogs.\n\tQString description(int style) const;\n\n\t//! Causes all properties to be refreshed by emitting the\n\t//! propertyChanged() signal as required.\n\tvoid refreshProperties();\n\n\t//! Returns true if multi-line comment blocks can be folded.\n\t//!\n\t//! \\sa setFoldComments()\n\tbool foldComments() const;\n\n\t//! Returns true if trailing blank lines are included in a fold block.\n\t//!\n\t//! \\sa setFoldCompact()\n\tbool foldCompact() const;\n\npublic slots:\n\t//! If \\a fold is true then multi-line comment blocks can be folded.\n\t//! The default is false.\n\t//!\n\t//! \\sa foldComments()\n\tvirtual void setFoldComments(bool fold);\n\n\t//! If \\a fold is true then trailing blank lines are included in a fold\n\t//! block. The default is true.\n\t//!\n\t//! \\sa foldCompact()\n\tvirtual void setFoldCompact(bool fold);\n\nprotected:\n\t//! The lexer's properties are read from the settings \\a qs.  \\a prefix\n\t//! (which has a trailing '/') should be used as a prefix to the key of\n\t//! each setting.  true is returned if there is no error.\n\t//!\n\tbool readProperties(QSettings &qs,const QString &prefix);\n\n\t//! The lexer's properties are written to the settings \\a qs.\n\t//! \\a prefix (which has a trailing '/') should be used as a prefix to\n\t//! the key of each setting.  true is returned if there is no error.\n\t//!\n\tbool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n\tvoid setCommentProp();\n\tvoid setCompactProp();\n\n\tbool fold_comments;\n\tbool fold_compact;\n\n\tQsciLexerBash(const QsciLexerBash &);\n\tQsciLexerBash &operator=(const QsciLexerBash &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerbatch.h",
    "content": "// This defines the interface to the QsciLexerBatch class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERBATCH_H\n#define QSCILEXERBATCH_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerBatch class encapsulates the Scintilla batch file\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerBatch : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! batch file lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A keyword.\n        Keyword = 2,\n\n        //! A label.\n        Label = 3,\n\n        //! An hide command character.\n        HideCommandChar = 4,\n\n        //! An external command .\n        ExternalCommand = 5,\n\n        //! A variable.\n        Variable = 6,\n        \n        //! An operator\n        Operator = 7\n    };\n\n    //! Construct a QsciLexerBatch with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerBatch(QObject *parent = 0);\n\n    //! Destroys the QsciLexerBatch instance.\n    virtual ~QsciLexerBatch();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! \\internal Returns true if the language is case sensitive.\n    bool caseSensitive() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\nprivate:\n    QsciLexerBatch(const QsciLexerBatch &);\n    QsciLexerBatch &operator=(const QsciLexerBatch &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexercmake.h",
    "content": "// This defines the interface to the QsciLexerCMake class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERCMAKE_H\n#define QSCILEXERCMAKE_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerCMake class encapsulates the Scintilla CMake lexer.\nclass QSCINTILLA_EXPORT QsciLexerCMake : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! CMake lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A string.\n        String = 2,\n\n        //! A left quoted string.\n        StringLeftQuote = 3,\n\n        //! A right quoted string.\n        StringRightQuote = 4,\n\n        //! A function.  (Defined by keyword set number 1.)\n        Function = 5,\n\n        //! A variable. (Defined by keyword set number 2.)\n        Variable = 6,\n\n        //! A label.\n        Label = 7,\n\n        //! A keyword defined in keyword set number 3.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet3 = 8,\n\n        //! A WHILE block.\n        BlockWhile = 9,\n\n        //! A FOREACH block.\n        BlockForeach = 10,\n\n        //! An IF block.\n        BlockIf = 11,\n\n        //! A MACRO block.\n        BlockMacro = 12,\n\n        //! A variable within a string.\n        StringVariable = 13,\n\n        //! A number.\n        Number = 14\n    };\n\n    //! Construct a QsciLexerCMake with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerCMake(QObject *parent = 0);\n\n    //! Destroys the QsciLexerCMake instance.\n    virtual ~QsciLexerCMake();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the propertyChanged()\n    //! signal as required.\n    void refreshProperties();\n\n    //! Returns true if ELSE blocks can be folded.\n    //!\n    //! \\sa setFoldAtElse()\n    bool foldAtElse() const;\n\npublic slots:\n    //! If \\a fold is true then ELSE blocks can be folded.  The default is\n    //! false.\n    //!\n    //! \\sa foldAtElse()\n    virtual void setFoldAtElse(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setAtElseProp();\n\n    bool fold_atelse;\n\n    QsciLexerCMake(const QsciLexerCMake &);\n    QsciLexerCMake &operator=(const QsciLexerCMake &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexercoffeescript.h",
    "content": "// This defines the interface to the QsciLexerCoffeeScript class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERCOFFEESCRIPT_H\n#define QSCILEXERCOFFEESCRIPT_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerCoffeeScript class encapsulates the Scintilla\n//! CoffeeScript lexer.\nclass QSCINTILLA_EXPORT QsciLexerCoffeeScript : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! C++ lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A C-style comment.\n        Comment = 1,\n\n        //! A C++-style comment line.\n        CommentLine = 2,\n\n        //! A JavaDoc/Doxygen C-style comment.\n        CommentDoc = 3,\n\n        //! A number.\n        Number = 4,\n\n        //! A keyword.\n        Keyword = 5,\n\n        //! A double-quoted string.\n        DoubleQuotedString = 6,\n\n        //! A single-quoted string.\n        SingleQuotedString = 7,\n\n        //! An IDL UUID.\n        UUID = 8,\n\n        //! A pre-processor block.\n        PreProcessor = 9,\n\n        //! An operator.\n        Operator = 10,\n\n        //! An identifier\n        Identifier = 11,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 12,\n\n        //! A C# verbatim string.\n        VerbatimString = 13,\n\n        //! A regular expression.\n        Regex = 14,\n\n        //! A JavaDoc/Doxygen C++-style comment line.\n        CommentLineDoc = 15,\n\n        //! A keyword defined in keyword set number 2.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet2 = 16,\n\n        //! A JavaDoc/Doxygen keyword.\n        CommentDocKeyword = 17,\n\n        //! A JavaDoc/Doxygen keyword error defined in keyword set number 3.\n        //! The class must be sub-classed and re-implement keywords() to make\n        //! use of this style.\n        CommentDocKeywordError = 18,\n\n        //! A global class defined in keyword set number 4.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        GlobalClass = 19,\n\n        //! A block comment.\n        CommentBlock = 22,\n\n        //! A block regular expression.\n        BlockRegex = 23,\n\n        //! A block regular expression comment.\n        BlockRegexComment = 24,\n    };\n\n    //! Construct a QsciLexerCoffeeScript with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerCoffeeScript(QObject *parent = 0);\n\n    //! Destroys the QsciLexerCoffeeScript instance.\n    virtual ~QsciLexerCoffeeScript();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the character sequences that can separate\n    //! auto-completion words.\n    QStringList autoCompletionWordSeparators() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the end of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockEnd(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of keywords in a\n    //! particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStartKeyword(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.  Set 1 is normally used for\n    //! primary keywords and identifiers.  Set 2 is normally used for secondary\n    //! keywords and identifiers.  Set 3 is normally used for documentation\n    //! comment keywords.  Set 4 is normally used for global classes and\n    //! typedefs.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if '$' characters are allowed in identifier names.\n    //!\n    //! \\sa setDollarsAllowed()\n    bool dollarsAllowed() const {return dollars;}\n\n    //! If \\a allowed is true then '$' characters are allowed in identifier\n    //! names.  The default is true.\n    //!\n    //! \\sa dollarsAllowed()\n    void setDollarsAllowed(bool allowed);\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const {return fold_comments;}\n\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    void setFoldComments(bool fold);\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const {return fold_compact;}\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    void setFoldCompact(bool fold);\n\n    //! Returns true if preprocessor lines (after the preprocessor\n    //! directive) are styled.\n    //!\n    //! \\sa setStylePreprocessor()\n    bool stylePreprocessor() const {return style_preproc;}\n\n    //! If \\a style is true then preprocessor lines (after the preprocessor\n    //! directive) are styled.  The default is false.\n    //!\n    //! \\sa stylePreprocessor()\n    void setStylePreprocessor(bool style);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    //! \\sa writeProperties()\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    //! \\sa readProperties()\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n    void setStylePreprocProp();\n    void setDollarsProp();\n\n    bool fold_comments;\n    bool fold_compact;\n    bool style_preproc;\n    bool dollars;\n\n    QsciLexerCoffeeScript(const QsciLexerCoffeeScript &);\n    QsciLexerCoffeeScript &operator=(const QsciLexerCoffeeScript &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexercpp.h",
    "content": "// This defines the interface to the QsciLexerCPP class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERCPP_H\n#define QSCILEXERCPP_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerCPP class encapsulates the Scintilla C++\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerCPP : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! C++ lexer.\n    enum {\n        //! The default.\n        Default = 0,\n        InactiveDefault = Default + 64,\n\n        //! A C comment.\n        Comment = 1,\n        InactiveComment = Comment + 64,\n\n        //! A C++ comment line.\n        CommentLine = 2,\n        InactiveCommentLine = CommentLine + 64,\n\n        //! A JavaDoc/Doxygen style C comment.\n        CommentDoc = 3,\n        InactiveCommentDoc = CommentDoc + 64,\n\n        //! A number.\n        Number = 4,\n        InactiveNumber = Number + 64,\n\n        //! A keyword.\n        Keyword = 5,\n        InactiveKeyword = Keyword + 64,\n\n        //! A double-quoted string.\n        DoubleQuotedString = 6,\n        InactiveDoubleQuotedString = DoubleQuotedString + 64,\n\n        //! A single-quoted string.\n        SingleQuotedString = 7,\n        InactiveSingleQuotedString = SingleQuotedString + 64,\n\n        //! An IDL UUID.\n        UUID = 8,\n        InactiveUUID = UUID + 64,\n\n        //! A pre-processor block.\n        PreProcessor = 9,\n        InactivePreProcessor = PreProcessor + 64,\n\n        //! An operator.\n        Operator = 10,\n        InactiveOperator = Operator + 64,\n\n        //! An identifier\n        Identifier = 11,\n        InactiveIdentifier = Identifier + 64,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 12,\n        InactiveUnclosedString = UnclosedString + 64,\n\n        //! A C# verbatim string.\n        VerbatimString = 13,\n        InactiveVerbatimString = VerbatimString + 64,\n\n        //! A JavaScript regular expression.\n        Regex = 14,\n        InactiveRegex = Regex + 64,\n\n        //! A JavaDoc/Doxygen style C++ comment line.\n        CommentLineDoc = 15,\n        InactiveCommentLineDoc = CommentLineDoc + 64,\n\n        //! A keyword defined in keyword set number 2.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet2 = 16,\n        InactiveKeywordSet2 = KeywordSet2 + 64,\n\n        //! A JavaDoc/Doxygen keyword.\n        CommentDocKeyword = 17,\n        InactiveCommentDocKeyword = CommentDocKeyword + 64,\n\n        //! A JavaDoc/Doxygen keyword error.\n        CommentDocKeywordError = 18,\n        InactiveCommentDocKeywordError = CommentDocKeywordError + 64,\n\n        //! A global class or typedef defined in keyword set number 5.  The\n        //! class must be sub-classed and re-implement keywords() to make use\n        //! of this style.\n        GlobalClass = 19,\n        InactiveGlobalClass = GlobalClass + 64,\n\n        //! A C++ raw string.\n        RawString = 20,\n        InactiveRawString = RawString + 20,\n\n        //! A Vala triple-quoted verbatim string.\n        TripleQuotedVerbatimString = 21,\n        InactiveTripleQuotedVerbatimString = TripleQuotedVerbatimString + 21,\n\n        //! A Pike hash-quoted string.\n        HashQuotedString = 22,\n        InactiveHashQuotedString = HashQuotedString + 22,\n\n        //! A pre-processor stream comment.\n        PreProcessorComment = 23,\n        InactivePreProcessorComment = PreProcessorComment + 23,\n\n        //! A JavaDoc/Doxygen style pre-processor comment.\n        PreProcessorCommentLineDoc = 24,\n        InactivePreProcessorCommentLineDoc = PreProcessorCommentLineDoc + 64,\n    };\n\n    //! Construct a QsciLexerCPP with parent \\a parent.  \\a parent is typically\n    //! the QsciScintilla instance.  \\a caseInsensitiveKeywords is true if the\n    //! lexer ignores the case of keywords.\n    QsciLexerCPP(QObject *parent = 0, bool caseInsensitiveKeywords = false);\n\n    //! Destroys the QsciLexerCPP instance.\n    virtual ~QsciLexerCPP();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the character sequences that can separate\n    //! auto-completion words.\n    QStringList autoCompletionWordSeparators() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the end of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockEnd(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of keywords in a\n    //! particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStartKeyword(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.  Set 1 is normally used for\n    //! primary keywords and identifiers.  Set 2 is normally used for secondary\n    //! keywords and identifiers.  Set 3 is normally used for documentation\n    //! comment keywords.  Set 4 is normally used for global classes and\n    //! typedefs.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if \"} else {\" lines can be folded.\n    //!\n    //! \\sa setFoldAtElse()\n    bool foldAtElse() const {return fold_atelse;}\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const {return fold_comments;}\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const {return fold_compact;}\n\n    //! Returns true if preprocessor blocks can be folded.\n    //!\n    //! \\sa setFoldPreprocessor()\n    bool foldPreprocessor() const {return fold_preproc;}\n\n    //! Returns true if preprocessor lines (after the preprocessor\n    //! directive) are styled.\n    //!\n    //! \\sa setStylePreprocessor()\n    bool stylePreprocessor() const {return style_preproc;}\n\n    //! If \\a allowed is true then '$' characters are allowed in identifier\n    //! names.  The default is true.\n    //!\n    //! \\sa dollarsAllowed()\n    void setDollarsAllowed(bool allowed);\n\n    //! Returns true if '$' characters are allowed in identifier names.\n    //!\n    //! \\sa setDollarsAllowed()\n    bool dollarsAllowed() const {return dollars;}\n\n    //! If \\a enabled is true then triple quoted strings are highlighted.  The\n    //! default is false.\n    //!\n    //! \\sa highlightTripleQuotedStrings()\n    void setHighlightTripleQuotedStrings(bool enabled);\n\n    //! Returns true if triple quoted strings should be highlighted.\n    //!\n    //! \\sa setHighlightTripleQuotedStrings()\n    bool highlightTripleQuotedStrings() const {return highlight_triple;}\n\n    //! If \\a enabled is true then hash quoted strings are highlighted.  The\n    //! default is false.\n    //!\n    //! \\sa highlightHashQuotedStrings()\n    void setHighlightHashQuotedStrings(bool enabled);\n\n    //! Returns true if hash quoted strings should be highlighted.\n    //!\n    //! \\sa setHighlightHashQuotedStrings()\n    bool highlightHashQuotedStrings() const {return highlight_hash;}\n\npublic slots:\n    //! If \\a fold is true then \"} else {\" lines can be folded.  The\n    //! default is false.\n    //!\n    //! \\sa foldAtElse()\n    virtual void setFoldAtElse(bool fold);\n\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\n    //! If \\a fold is true then preprocessor blocks can be folded.  The\n    //! default is true.\n    //!\n    //! \\sa foldPreprocessor()\n    virtual void setFoldPreprocessor(bool fold);\n\n    //! If \\a style is true then preprocessor lines (after the preprocessor\n    //! directive) are styled.  The default is false.\n    //!\n    //! \\sa stylePreprocessor()\n    virtual void setStylePreprocessor(bool style);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    //! \\sa writeProperties()\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    //! \\sa readProperties()\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setAtElseProp();\n    void setCommentProp();\n    void setCompactProp();\n    void setPreprocProp();\n    void setStylePreprocProp();\n    void setDollarsProp();\n    void setHighlightTripleProp();\n    void setHighlightHashProp();\n\n    bool fold_atelse;\n    bool fold_comments;\n    bool fold_compact;\n    bool fold_preproc;\n    bool style_preproc;\n    bool dollars;\n    bool highlight_triple;\n    bool highlight_hash;\n\n    bool nocase;\n\n    QsciLexerCPP(const QsciLexerCPP &);\n    QsciLexerCPP &operator=(const QsciLexerCPP &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexercsharp.h",
    "content": "// This defines the interface to the QsciLexerCSharp class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERCSHARP_H\n#define QSCILEXERCSHARP_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexercpp.h>\n\n\n//! \\brief The QsciLexerCSharp class encapsulates the Scintilla C#\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerCSharp : public QsciLexerCPP\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexerCSharp with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerCSharp(QObject *parent = 0);\n\n    //! Destroys the QsciLexerCSharp instance.\n    virtual ~QsciLexerCSharp();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\nprivate:\n    QsciLexerCSharp(const QsciLexerCSharp &);\n    QsciLexerCSharp &operator=(const QsciLexerCSharp &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexercss.h",
    "content": "// This defines the interface to the QsciLexerCSS class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERCSS_H\n#define QSCILEXERCSS_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerCSS class encapsulates the Scintilla CSS lexer.\nclass QSCINTILLA_EXPORT QsciLexerCSS : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! CSS lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A tag.\n        Tag = 1,\n\n        //! A class selector.\n        ClassSelector = 2,\n\n        //! A pseudo class.  The list of pseudo classes is defined by keyword\n        //! set 2.\n        PseudoClass = 3,\n\n        //! An unknown pseudo class.\n        UnknownPseudoClass = 4,\n\n        //! An operator.\n        Operator = 5,\n\n        //! A CSS1 property.  The list of CSS1 properties is defined by keyword\n        //! set 1.\n        CSS1Property = 6,\n\n        //! An unknown property.\n        UnknownProperty = 7,\n\n        //! A value.\n        Value = 8,\n\n        //! A comment.\n        Comment = 9,\n\n        //! An ID selector.\n        IDSelector = 10,\n\n        //! An important value.\n        Important = 11,\n\n        //! An @-rule.\n        AtRule = 12,\n\n        //! A double-quoted string.\n        DoubleQuotedString = 13,\n\n        //! A single-quoted string.\n        SingleQuotedString = 14,\n\n        //! A CSS2 property.  The list of CSS2 properties is defined by keyword\n        //! set 3.\n        CSS2Property = 15,\n\n        //! An attribute.\n        Attribute = 16,\n\n        //! A CSS3 property.  The list of CSS3 properties is defined by keyword\n        //! set 4.\n        CSS3Property = 17,\n\n        //! A pseudo element.  The list of pseudo elements is defined by\n        //! keyword set 5.\n        PseudoElement = 18,\n\n        //! An extended (browser specific) CSS property.  The list of extended\n        //! CSS properties is defined by keyword set 6.\n        ExtendedCSSProperty = 19,\n\n        //! An extended (browser specific) pseudo class.  The list of extended\n        //! pseudo classes is defined by keyword set 7.\n        ExtendedPseudoClass = 20,\n\n        //! An extended (browser specific) pseudo element.  The list of\n        //! extended pseudo elements is defined by keyword set 8.\n        ExtendedPseudoElement = 21,\n\n        //! A media rule.\n        MediaRule = 22,\n\n        //! A variable.\n        Variable = 23,\n    };\n\n    //! Construct a QsciLexerCSS with parent \\a parent.  \\a parent is typically\n    //! the QsciScintilla instance.\n    QsciLexerCSS(QObject *parent = 0);\n\n    //! Destroys the QsciLexerCSS instance.\n    virtual ~QsciLexerCSS();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the end of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockEnd(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    QColor defaultColor(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\n    //! If \\a enabled is true then support for HSS is enabled.  The default is\n    //! false.\n    //!\n    //! \\sa HSSLanguage()\n    void setHSSLanguage(bool enabled);\n\n    //! Returns true if support for HSS is enabled.\n    //!\n    //! \\sa setHSSLanguage()\n    bool HSSLanguage() const {return hss_language;}\n\n    //! If \\a enabled is true then support for Less CSS is enabled.  The\n    //! default is false.\n    //!\n    //! \\sa LessLanguage()\n    void setLessLanguage(bool enabled);\n\n    //! Returns true if support for Less CSS is enabled.\n    //!\n    //! \\sa setLessLanguage()\n    bool LessLanguage() const {return less_language;}\n\n    //! If \\a enabled is true then support for Sassy CSS is enabled.  The\n    //! default is false.\n    //!\n    //! \\sa SCSSLanguage()\n    void setSCSSLanguage(bool enabled);\n\n    //! Returns true if support for Sassy CSS is enabled.\n    //!\n    //! \\sa setSCSSLanguage()\n    bool SCSSLanguage() const {return scss_language;}\n\npublic slots:\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n    void setHSSProp();\n    void setLessProp();\n    void setSCSSProp();\n\n    bool fold_comments;\n    bool fold_compact;\n    bool hss_language;\n    bool less_language;\n    bool scss_language;\n\n    QsciLexerCSS(const QsciLexerCSS &);\n    QsciLexerCSS &operator=(const QsciLexerCSS &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexercustom.h",
    "content": "// This defines the interface to the QsciLexerCustom class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERCUSTOM_H\n#define QSCILEXERCUSTOM_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\nclass QsciScintilla;\nclass QsciStyle;\n\n\n//! \\brief The QsciLexerCustom class is an abstract class used as a base for\n//! new language lexers.\n//!\n//! The advantage of implementing a new lexer this way (as opposed to adding\n//! the lexer to the underlying Scintilla code) is that it does not require the\n//! QScintilla library to be re-compiled.  It also makes it possible to\n//! integrate external lexers.\n//!\n//! All that is necessary to implement a new lexer is to define appropriate\n//! styles and to re-implement the styleText() method.\nclass QSCINTILLA_EXPORT QsciLexerCustom : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexerCustom with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerCustom(QObject *parent = 0);\n\n    //! Destroy the QSciLexerCustom.\n    virtual ~QsciLexerCustom();\n\n    //! The next \\a length characters starting from the current styling\n    //! position have their style set to style number \\a style.  The current\n    //! styling position is moved.  The styling position is initially set by\n    //! calling startStyling().\n    //!\n    //! \\sa startStyling(), styleText()\n    void setStyling(int length, int style);\n\n    //! The next \\a length characters starting from the current styling\n    //! position have their style set to style \\a style.  The current styling\n    //! position is moved.  The styling position is initially set by calling\n    //! startStyling().\n    //!\n    //! \\sa startStyling(), styleText()\n    void setStyling(int length, const QsciStyle &style);\n\n    //! The styling position is set to \\a start and the mask of style bits that\n    //! can be set is set to \\a styleBits.  \\a styleBits allows the styling of\n    //! text to be done over several passes by setting different style bits on\n    //! each pass.  If \\a styleBits is 0 then all style bits (as returned by\n    //! styleBitsNeeded()) are set.\n    //!\n    //! \\sa setStyling(), styleBitsNeeded(), styleText()\n    void startStyling(int pos, int styleBits = 0);\n\n    //! This is called when the section of text beginning at position \\a start\n    //! and up to position \\a end needs to be styled.  \\a start will always be\n    //! at the start of a line.  The text is styled by calling startStyling()\n    //! followed by one or more calls to setStyling().  It must be\n    //! re-implemented by a sub-class.\n    //!\n    //! \\sa setStyling(), startStyling()\n    virtual void styleText(int start, int end) = 0;\n\n    //! \\reimp\n    virtual void setEditor(QsciScintilla *editor);\n\n    //! \\reimp This re-implementation returns 5 as the number of style bits\n    //! needed.\n    virtual int styleBitsNeeded() const;\n\nprivate slots:\n    void handleStyleNeeded(int pos);\n\nprivate:\n    QsciLexerCustom(const QsciLexerCustom &);\n    QsciLexerCustom &operator=(const QsciLexerCustom &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerd.h",
    "content": "// This defines the interface to the QsciLexerD class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERD_H\n#define QSCILEXERD_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerD class encapsulates the Scintilla D lexer.\nclass QSCINTILLA_EXPORT QsciLexerD : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the D\n    //! lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A comment line.\n        CommentLine = 2,\n\n        //! A JavaDoc and Doxygen comment.\n        CommentDoc = 3,\n\n        //! A nested comment.\n        CommentNested = 4,\n\n        //! A number.\n        Number = 5,\n\n        //! A keyword.\n        Keyword = 6,\n\n        //! A secondary keyword.\n        KeywordSecondary = 7,\n\n        //! A doc keyword\n        KeywordDoc = 8,\n        \n        //! Typedefs and aliases\n        Typedefs = 9,\n        \n        //! A string.\n        String = 10,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 11,\n        \n        //! A character\n        Character = 12,\n\n        //! An operator.\n        Operator = 13,\n\n        //! An identifier\n        Identifier = 14,\n\n        //! A JavaDoc and Doxygen line.\n        CommentLineDoc = 15,\n\n        //! A JavaDoc and Doxygen  keyword.\n        CommentDocKeyword = 16,\n\n        //! A JavaDoc and Doxygen keyword error.\n        CommentDocKeywordError = 17,\n\n        //! A backquoted string.\n        BackquoteString = 18,\n\n        //! A raw, hexadecimal or delimited string.\n        RawString = 19,\n\n        //! A keyword defined in keyword set number 5.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet5 = 20,\n\n        //! A keyword defined in keyword set number 6.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet6 = 21,\n\n        //! A keyword defined in keyword set number 7.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet7 = 22,\n    };\n\n    //! Construct a QsciLexerD with parent \\a parent.  \\a parent is typically\n    //! the QsciScintilla instance.\n    QsciLexerD(QObject *parent = 0);\n\n    //! Destroys the QsciLexerD instance.\n    virtual ~QsciLexerD();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the character sequences that can separate\n    //! auto-completion words.\n    QStringList autoCompletionWordSeparators() const;\n\n    //! \\internal Returns a space separated list of words or characters in a\n    //! particular style that define the end of a block for auto-indentation.\n    //! The styles is returned via \\a style.\n    const char *blockEnd(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of words or characters in a\n    //! particular style that define the start of a block for auto-indentation.\n    //! The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of keywords in a particular\n    //! style that define the start of a block for auto-indentation.  The\n    //! styles is returned via \\a style.\n    const char *blockStartKeyword(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised by\n    //! the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the style\n    //! is invalid for this language then an empty QString is returned.  This\n    //! is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the propertyChanged()\n    //! signal as required.\n    void refreshProperties();\n\n    //! Returns true if \"} else {\" lines can be folded.\n    //!\n    //! \\sa setFoldAtElse()\n    bool foldAtElse() const;\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\npublic slots:\n    //! If \\a fold is true then \"} else {\" lines can be folded.  The default is\n    //! false.\n    //!\n    //! \\sa foldAtElse()\n    virtual void setFoldAtElse(bool fold);\n\n    //! If \\a fold is true then multi-line comment blocks can be folded.  The\n    //! default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    //! \\sa writeProperties()\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    //! \\sa readProperties()\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setAtElseProp();\n    void setCommentProp();\n    void setCompactProp();\n\n    bool fold_atelse;\n    bool fold_comments;\n    bool fold_compact;\n\n    QsciLexerD(const QsciLexerD &);\n    QsciLexerD &operator=(const QsciLexerD &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerdiff.h",
    "content": "// This defines the interface to the QsciLexerDiff class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERDIFF_H\n#define QSCILEXERDIFF_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerDiff class encapsulates the Scintilla Diff\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerDiff : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Diff lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A command.\n        Command = 2,\n\n        //! A header.\n        Header = 3,\n\n        //! A position.\n        Position = 4,\n\n        //! A removed line.\n        LineRemoved = 5,\n\n        //! An added line.\n        LineAdded = 6,\n\n        //! A changed line.\n        LineChanged = 7\n    };\n\n    //! Construct a QsciLexerDiff with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerDiff(QObject *parent = 0);\n\n    //! Destroys the QsciLexerDiff instance.\n    virtual ~QsciLexerDiff();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    QColor defaultColor(int style) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\nprivate:\n    QsciLexerDiff(const QsciLexerDiff &);\n    QsciLexerDiff &operator=(const QsciLexerDiff &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerfortran.h",
    "content": "// This defines the interface to the QsciLexerFortran class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERFORTRAN_H\n#define QSCILEXERFORTRAN_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexerfortran77.h>\n\n\n//! \\brief The QsciLexerFortran class encapsulates the Scintilla Fortran lexer.\nclass QSCINTILLA_EXPORT QsciLexerFortran : public QsciLexerFortran77\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexerFortran with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerFortran(QObject *parent = 0);\n\n    //! Destroys the QsciLexerFortran instance.\n    virtual ~QsciLexerFortran();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\nprivate:\n    QsciLexerFortran(const QsciLexerFortran &);\n    QsciLexerFortran &operator=(const QsciLexerFortran &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerfortran77.h",
    "content": "// This defines the interface to the QsciLexerFortran77 class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERFORTRAN77_H\n#define QSCILEXERFORTRAN77_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerFortran77 class encapsulates the Scintilla Fortran77\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerFortran77 : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Fortran77 lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A number.\n        Number = 2,\n\n        //! A single-quoted string.\n        SingleQuotedString = 3,\n\n        //! A double-quoted string.\n        DoubleQuotedString = 4,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 5,\n\n        //! An operator.\n        Operator = 6,\n\n        //! An identifier\n        Identifier = 7,\n\n        //! A keyword.\n        Keyword = 8,\n\n        //! An intrinsic function.\n        IntrinsicFunction = 9,\n\n        //! An extended, non-standard or user defined function.\n        ExtendedFunction = 10,\n\n        //! A pre-processor block.\n        PreProcessor = 11,\n\n        //! An operator in .NAME. format.\n        DottedOperator = 12,\n\n        //! A label.\n        Label = 13,\n\n        //! A continuation.\n        Continuation = 14\n    };\n\n    //! Construct a QsciLexerFortran77 with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerFortran77(QObject *parent = 0);\n\n    //! Destroys the QsciLexerFortran77 instance.\n    virtual ~QsciLexerFortran77();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\npublic slots:\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    //! \\sa writeProperties()\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    //! \\sa readProperties()\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCompactProp();\n\n    bool fold_compact;\n\n    QsciLexerFortran77(const QsciLexerFortran77 &);\n    QsciLexerFortran77 &operator=(const QsciLexerFortran77 &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerhtml.h",
    "content": "// This defines the interface to the QsciLexerHTML class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERHTML_H\n#define QSCILEXERHTML_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerHTML class encapsulates the Scintilla HTML lexer.\nclass QSCINTILLA_EXPORT QsciLexerHTML : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! HTML lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A tag.\n        Tag = 1,\n\n        //! An unknown tag.\n        UnknownTag = 2,\n\n        //! An attribute.\n        Attribute = 3,\n\n        //! An unknown attribute.\n        UnknownAttribute = 4,\n\n        //! An HTML number.\n        HTMLNumber = 5,\n\n        //! An HTML double-quoted string.\n        HTMLDoubleQuotedString = 6,\n\n        //! An HTML single-quoted string.\n        HTMLSingleQuotedString = 7,\n\n        //! Other text within a tag.\n        OtherInTag = 8,\n\n        //! An HTML comment.\n        HTMLComment = 9,\n\n        //! An entity.\n        Entity = 10,\n\n        //! The end of an XML style tag.\n        XMLTagEnd = 11,\n\n        //! The start of an XML fragment.\n        XMLStart = 12,\n\n        //! The end of an XML fragment.\n        XMLEnd = 13,\n\n        //! A script tag.\n        Script = 14,\n\n        //! The start of an ASP fragment with @.\n        ASPAtStart = 15,\n\n        //! The start of an ASP fragment.\n        ASPStart = 16,\n\n        //! CDATA.\n        CDATA = 17,\n\n        //! The start of a PHP fragment.\n        PHPStart = 18,\n\n        //! An unquoted HTML value.\n        HTMLValue = 19,\n\n        //! An ASP X-Code comment.\n        ASPXCComment = 20,\n\n        //! The default for SGML.\n        SGMLDefault = 21,\n\n        //! An SGML command.\n        SGMLCommand = 22,\n\n        //! The first parameter of an SGML command.\n        SGMLParameter = 23,\n\n        //! An SGML double-quoted string.\n        SGMLDoubleQuotedString = 24,\n\n        //! An SGML single-quoted string.\n        SGMLSingleQuotedString = 25,\n\n        //! An SGML error.\n        SGMLError = 26,\n\n        //! An SGML special entity.\n        SGMLSpecial = 27,\n\n        //! An SGML entity.\n        SGMLEntity = 28,\n\n        //! An SGML comment.\n        SGMLComment = 29,\n\n        //! A comment with the first parameter of an SGML command.\n        SGMLParameterComment = 30,\n\n        //! The default for an SGML block.\n        SGMLBlockDefault = 31,\n\n        //! The start of a JavaScript fragment.\n        JavaScriptStart = 40,\n\n        //! The default for JavaScript.\n        JavaScriptDefault = 41,\n\n        //! A JavaScript comment.\n        JavaScriptComment = 42,\n\n        //! A JavaScript line comment.\n        JavaScriptCommentLine = 43,\n\n        //! A JavaDoc style JavaScript comment.\n        JavaScriptCommentDoc = 44,\n\n        //! A JavaScript number.\n        JavaScriptNumber = 45,\n\n        //! A JavaScript word.\n        JavaScriptWord = 46,\n\n        //! A JavaScript keyword.\n        JavaScriptKeyword = 47,\n\n        //! A JavaScript double-quoted string.\n        JavaScriptDoubleQuotedString = 48,\n\n        //! A JavaScript single-quoted string.\n        JavaScriptSingleQuotedString = 49,\n\n        //! A JavaScript symbol.\n        JavaScriptSymbol = 50,\n\n        //! The end of a JavaScript line where a string is not closed.\n        JavaScriptUnclosedString = 51,\n\n        //! A JavaScript regular expression.\n        JavaScriptRegex = 52,\n\n        //! The start of an ASP JavaScript fragment.\n        ASPJavaScriptStart = 55,\n\n        //! The default for ASP JavaScript.\n        ASPJavaScriptDefault = 56,\n\n        //! An ASP JavaScript comment.\n        ASPJavaScriptComment = 57,\n\n        //! An ASP JavaScript line comment.\n        ASPJavaScriptCommentLine = 58,\n\n        //! An ASP JavaDoc style JavaScript comment.\n        ASPJavaScriptCommentDoc = 59,\n\n        //! An ASP JavaScript number.\n        ASPJavaScriptNumber = 60,\n\n        //! An ASP JavaScript word.\n        ASPJavaScriptWord = 61,\n\n        //! An ASP JavaScript keyword.\n        ASPJavaScriptKeyword = 62,\n\n        //! An ASP JavaScript double-quoted string.\n        ASPJavaScriptDoubleQuotedString = 63,\n\n        //! An ASP JavaScript single-quoted string.\n        ASPJavaScriptSingleQuotedString = 64,\n\n        //! An ASP JavaScript symbol.\n        ASPJavaScriptSymbol = 65,\n\n        //! The end of an ASP JavaScript line where a string is not\n        //! closed.\n        ASPJavaScriptUnclosedString = 66,\n\n        //! An ASP JavaScript regular expression.\n        ASPJavaScriptRegex = 67,\n\n        //! The start of a VBScript fragment.\n        VBScriptStart = 70,\n\n        //! The default for VBScript.\n        VBScriptDefault = 71,\n\n        //! A VBScript comment.\n        VBScriptComment = 72,\n\n        //! A VBScript number.\n        VBScriptNumber = 73,\n\n        //! A VBScript keyword.\n        VBScriptKeyword = 74,\n\n        //! A VBScript string.\n        VBScriptString = 75,\n\n        //! A VBScript identifier.\n        VBScriptIdentifier = 76,\n\n        //! The end of a VBScript line where a string is not closed.\n        VBScriptUnclosedString = 77,\n\n        //! The start of an ASP VBScript fragment.\n        ASPVBScriptStart = 80,\n\n        //! The default for ASP VBScript.\n        ASPVBScriptDefault = 81,\n\n        //! An ASP VBScript comment.\n        ASPVBScriptComment = 82,\n\n        //! An ASP VBScript number.\n        ASPVBScriptNumber = 83,\n\n        //! An ASP VBScript keyword.\n        ASPVBScriptKeyword = 84,\n\n        //! An ASP VBScript string.\n        ASPVBScriptString = 85,\n\n        //! An ASP VBScript identifier.\n        ASPVBScriptIdentifier = 86,\n\n        //! The end of an ASP VBScript line where a string is not\n        //! closed.\n        ASPVBScriptUnclosedString = 87,\n\n        //! The start of a Python fragment.\n        PythonStart = 90,\n\n        //! The default for Python.\n        PythonDefault = 91,\n\n        //! A Python comment.\n        PythonComment = 92,\n\n        //! A Python number.\n        PythonNumber = 93,\n\n        //! A Python double-quoted string.\n        PythonDoubleQuotedString = 94,\n\n        //! A Python single-quoted string.\n        PythonSingleQuotedString = 95,\n\n        //! A Python keyword.\n        PythonKeyword = 96,\n\n        //! A Python triple single-quoted string.\n        PythonTripleSingleQuotedString = 97,\n\n        //! A Python triple double-quoted string.\n        PythonTripleDoubleQuotedString = 98,\n\n        //! The name of a Python class.\n        PythonClassName = 99,\n\n        //! The name of a Python function or method.\n        PythonFunctionMethodName = 100,\n\n        //! A Python operator.\n        PythonOperator = 101,\n\n        //! A Python identifier.\n        PythonIdentifier = 102,\n\n        //! The start of an ASP Python fragment.\n        ASPPythonStart = 105,\n\n        //! The default for ASP Python.\n        ASPPythonDefault = 106,\n\n        //! An ASP Python comment.\n        ASPPythonComment = 107,\n\n        //! An ASP Python number.\n        ASPPythonNumber = 108,\n\n        //! An ASP Python double-quoted string.\n        ASPPythonDoubleQuotedString = 109,\n\n        //! An ASP Python single-quoted string.\n        ASPPythonSingleQuotedString = 110,\n\n        //! An ASP Python keyword.\n        ASPPythonKeyword = 111,\n\n        //! An ASP Python triple single-quoted string.\n        ASPPythonTripleSingleQuotedString = 112,\n\n        //! An ASP Python triple double-quoted string.\n        ASPPythonTripleDoubleQuotedString = 113,\n\n        //! The name of an ASP Python class.\n        ASPPythonClassName = 114,\n\n        //! The name of an ASP Python function or method.\n        ASPPythonFunctionMethodName = 115,\n\n        //! An ASP Python operator.\n        ASPPythonOperator = 116,\n\n        //! An ASP Python identifier\n        ASPPythonIdentifier = 117,\n\n        //! The default for PHP.\n        PHPDefault = 118,\n\n        //! A PHP double-quoted string.\n        PHPDoubleQuotedString = 119,\n\n        //! A PHP single-quoted string.\n        PHPSingleQuotedString = 120,\n\n        //! A PHP keyword.\n        PHPKeyword = 121,\n\n        //! A PHP number.\n        PHPNumber = 122,\n\n        //! A PHP variable.\n        PHPVariable = 123,\n\n        //! A PHP comment.\n        PHPComment = 124,\n\n        //! A PHP line comment.\n        PHPCommentLine = 125,\n\n        //! A PHP double-quoted variable.\n        PHPDoubleQuotedVariable = 126,\n\n        //! A PHP operator.\n        PHPOperator = 127\n    };\n\n    //! Construct a QsciLexerHTML with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerHTML(QObject *parent = 0);\n\n    //! Destroys the QsciLexerHTML instance.\n    virtual ~QsciLexerHTML();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the auto-completion fillup characters.\n    const char *autoCompletionFillups() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if tags are case sensitive.\n    //!\n    //! \\sa setCaseSensitiveTags()\n    bool caseSensitiveTags() const {return case_sens_tags;}\n\n    //! If \\a enabled is true then Django templates are enabled.  The default\n    //! is false.\n    //!\n    //! \\sa djangoTemplates()\n    void setDjangoTemplates(bool enabled);\n\n    //! Returns true if support for Django templates is enabled.\n    //!\n    //! \\sa setDjangoTemplates()\n    bool djangoTemplates() const {return django_templates;}\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const {return fold_compact;}\n\n    //! Returns true if preprocessor blocks can be folded.\n    //!\n    //! \\sa setFoldPreprocessor()\n    bool foldPreprocessor() const {return fold_preproc;}\n\n    //! If \\a fold is true then script comments can be folded.  The default is\n    //! false.\n    //!\n    //! \\sa foldScriptComments()\n    void setFoldScriptComments(bool fold);\n\n    //! Returns true if script comments can be folded.\n    //!\n    //! \\sa setFoldScriptComments()\n    bool foldScriptComments() const {return fold_script_comments;}\n\n    //! If \\a fold is true then script heredocs can be folded.  The default is\n    //! false.\n    //!\n    //! \\sa foldScriptHeredocs()\n    void setFoldScriptHeredocs(bool fold);\n\n    //! Returns true if script heredocs can be folded.\n    //!\n    //! \\sa setFoldScriptHeredocs()\n    bool foldScriptHeredocs() const {return fold_script_heredocs;}\n\n    //! If \\a enabled is true then Mako templates are enabled.  The default is\n    //! false.\n    //!\n    //! \\sa makoTemplates()\n    void setMakoTemplates(bool enabled);\n\n    //! Returns true if support for Mako templates is enabled.\n    //!\n    //! \\sa setMakoTemplates()\n    bool makoTemplates() const {return mako_templates;}\n\npublic slots:\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\n    //! If \\a fold is true then preprocessor blocks can be folded.  The\n    //! default is false.\n    //!\n    //! \\sa foldPreprocessor()\n    virtual void setFoldPreprocessor(bool fold);\n\n    //! If \\a sens is true then tags are case sensitive.  The default is false.\n    //!\n    //! \\sa caseSensitiveTags()\n    virtual void setCaseSensitiveTags(bool sens);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCompactProp();\n    void setPreprocProp();\n    void setCaseSensTagsProp();\n    void setScriptCommentsProp();\n    void setScriptHeredocsProp();\n    void setDjangoProp();\n    void setMakoProp();\n\n    bool fold_compact;\n    bool fold_preproc;\n    bool case_sens_tags;\n    bool fold_script_comments;\n    bool fold_script_heredocs;\n    bool django_templates;\n    bool mako_templates;\n\n    QsciLexerHTML(const QsciLexerHTML &);\n    QsciLexerHTML &operator=(const QsciLexerHTML &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexeridl.h",
    "content": "// This defines the interface to the QsciLexerIDL class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERIDL_H\n#define QSCILEXERIDL_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexercpp.h>\n\n\n//! \\brief The QsciLexerIDL class encapsulates the Scintilla IDL\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerIDL : public QsciLexerCPP\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexerIDL with parent \\a parent.  \\a parent is typically\n    //! the QsciScintilla instance.\n    QsciLexerIDL(QObject *parent = 0);\n\n    //! Destroys the QsciLexerIDL instance.\n    virtual ~QsciLexerIDL();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    QColor defaultColor(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\nprivate:\n    QsciLexerIDL(const QsciLexerIDL &);\n    QsciLexerIDL &operator=(const QsciLexerIDL &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerjava.h",
    "content": "// This defines the interface to the QsciLexerJava class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERJAVA_H\n#define QSCILEXERJAVA_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexercpp.h>\n\n\n//! \\brief The QsciLexerJava class encapsulates the Scintilla Java lexer.\nclass QSCINTILLA_EXPORT QsciLexerJava : public QsciLexerCPP\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexerJava with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerJava(QObject *parent = 0);\n\n    //! Destroys the QsciLexerJava instance.\n    virtual ~QsciLexerJava();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\nprivate:\n    QsciLexerJava(const QsciLexerJava &);\n    QsciLexerJava &operator=(const QsciLexerJava &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerjavascript.h",
    "content": "// This defines the interface to the QsciLexerJavaScript class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERJSCRIPT_H\n#define QSCILEXERJSCRIPT_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexercpp.h>\n\n\n//! \\brief The QsciLexerJavaScript class encapsulates the Scintilla JavaScript\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerJavaScript : public QsciLexerCPP\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexerJavaScript with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerJavaScript(QObject *parent = 0);\n\n    //! Destroys the QsciLexerJavaScript instance.\n    virtual ~QsciLexerJavaScript();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\nprivate:\n    friend class QsciLexerHTML;\n\n    static const char *keywordClass;\n\n    QsciLexerJavaScript(const QsciLexerJavaScript &);\n    QsciLexerJavaScript &operator=(const QsciLexerJavaScript &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerlua.h",
    "content": "// This defines the interface to the QsciLexerLua class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERLUA_H\n#define QSCILEXERLUA_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerLua class encapsulates the Scintilla Lua\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerLua : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Lua lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A block comment.\n        Comment = 1,\n\n        //! A line comment.\n        LineComment = 2,\n\n        //! A number.\n        Number = 4,\n\n        //! A keyword.\n        Keyword = 5,\n\n        //! A string.\n        String = 6,\n\n        //! A character.\n        Character = 7,\n\n        //! A literal string.\n        LiteralString = 8,\n\n        //! Preprocessor\n        Preprocessor = 9,\n\n        //! An operator.\n        Operator = 10,\n\n        //! An identifier\n        Identifier = 11,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 12,\n\n        //! Basic functions.\n        BasicFunctions = 13,\n\n        //! String, table and maths functions.\n        StringTableMathsFunctions = 14,\n\n        //! Coroutines, I/O and system facilities.\n        CoroutinesIOSystemFacilities = 15,\n\n        //! A keyword defined in keyword set number 5.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet5 = 16,\n\n        //! A keyword defined in keyword set number 6.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet6 = 17,\n\n        //! A keyword defined in keyword set number 7.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet7 = 18,\n\n        //! A keyword defined in keyword set number 8.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet8 = 19,\n\n        //! A label.\n        Label = 20\n    };\n\n    //! Construct a QsciLexerLua with parent \\a parent.  \\a parent is typically\n    //! the QsciScintilla instance.\n    QsciLexerLua(QObject *parent = 0);\n\n    //! Destroys the QsciLexerLua instance.\n    virtual ~QsciLexerLua();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the character sequences that can separate\n    //! auto-completion words.\n    QStringList autoCompletionWordSeparators() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\npublic slots:\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCompactProp();\n\n    bool fold_compact;\n\n    QsciLexerLua(const QsciLexerLua &);\n    QsciLexerLua &operator=(const QsciLexerLua &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexermakefile.h",
    "content": "// This defines the interface to the QsciLexerMakefile class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERMAKEFILE_H\n#define QSCILEXERMAKEFILE_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerMakefile class encapsulates the Scintilla\n//! Makefile lexer.\nclass QSCINTILLA_EXPORT QsciLexerMakefile : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Makefile lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A pre-processor directive.\n        Preprocessor = 2,\n\n        //! A variable.\n        Variable = 3,\n\n        //! An operator.\n        Operator = 4,\n\n        //! A target.\n        Target = 5,\n\n        //! An error.\n        Error = 9\n    };\n\n    //! Construct a QsciLexerMakefile with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerMakefile(QObject *parent = 0);\n\n    //! Destroys the QsciLexerMakefile instance.\n    virtual ~QsciLexerMakefile();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\nprivate:\n    QsciLexerMakefile(const QsciLexerMakefile &);\n    QsciLexerMakefile &operator=(const QsciLexerMakefile &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexermatlab.h",
    "content": "// This defines the interface to the QsciLexerMatlab class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERMATLAB_H\n#define QSCILEXERMATLAB_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerMatlab class encapsulates the Scintilla Matlab file\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerMatlab : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Matlab file lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A command.\n        Command = 2,\n\n        //! A number.\n        Number = 3,\n\n        //! A keyword.\n        Keyword = 4,\n\n        //! A single quoted string.\n        SingleQuotedString = 5,\n\n        //! An operator\n        Operator = 6,\n\n        //! An identifier.\n        Identifier = 7,\n\n        //! A double quoted string.\n        DoubleQuotedString = 8\n    };\n\n    //! Construct a QsciLexerMatlab with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerMatlab(QObject *parent = 0);\n\n    //! Destroys the QsciLexerMatlab instance.\n    virtual ~QsciLexerMatlab();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\nprivate:\n    QsciLexerMatlab(const QsciLexerMatlab &);\n    QsciLexerMatlab &operator=(const QsciLexerMatlab &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexeroctave.h",
    "content": "// This defines the interface to the QsciLexerOctave class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXEROCTAVE_H\n#define QSCILEXEROCTAVE_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexermatlab.h>\n\n\n//! \\brief The QsciLexerOctave class encapsulates the Scintilla Octave file\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerOctave : public QsciLexerMatlab\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexerOctave with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerOctave(QObject *parent = 0);\n\n    //! Destroys the QsciLexerOctave instance.\n    virtual ~QsciLexerOctave();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\nprivate:\n    QsciLexerOctave(const QsciLexerOctave &);\n    QsciLexerOctave &operator=(const QsciLexerOctave &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerpascal.h",
    "content": "// This defines the interface to the QsciLexerPascal class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERPASCAL_H\n#define QSCILEXERPASCAL_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerPascal class encapsulates the Scintilla Pascal lexer.\nclass QSCINTILLA_EXPORT QsciLexerPascal : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! C++ lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! An identifier\n        Identifier = 1,\n\n        //! A '{ ... }' style comment.\n        Comment = 2,\n\n        //! A '(* ... *)' style comment.\n        CommentParenthesis = 3,\n\n        //! A comment line.\n        CommentLine = 4,\n\n        //! A '{$ ... }' style pre-processor block.\n        PreProcessor = 5,\n\n        //! A '(*$ ... *)' style pre-processor block.\n        PreProcessorParenthesis = 6,\n\n        //! A number.\n        Number = 7,\n\n        //! A hexadecimal number.\n        HexNumber = 8,\n\n        //! A keyword.\n        Keyword = 9,\n\n        //! A single-quoted string.\n        SingleQuotedString = 10,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 11,\n\n        //! A character.\n        Character = 12,\n\n        //! An operator.\n        Operator = 13,\n\n        //! Inline Asm.\n        Asm = 14\n    };\n\n    //! Construct a QsciLexerPascal with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerPascal(QObject *parent = 0);\n\n    //! Destroys the QsciLexerPascal instance.\n    virtual ~QsciLexerPascal();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the character sequences that can separate\n    //! auto-completion words.\n    QStringList autoCompletionWordSeparators() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the end of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockEnd(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of keywords in a\n    //! particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStartKeyword(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\n    //! Returns true if preprocessor blocks can be folded.\n    //!\n    //! \\sa setFoldPreprocessor()\n    bool foldPreprocessor() const;\n\n    //! If \\a enabled is true then some keywords will only be highlighted in an\n    //! appropriate context (similar to how the Delphi IDE works).  The default\n    //! is true.\n    //!\n    //! \\sa smartHighlighting()\n    void setSmartHighlighting(bool enabled);\n\n    //! Returns true if some keywords will only be highlighted in an\n    //! appropriate context (similar to how the Delphi IDE works).\n    //!\n    //! \\sa setSmartHighlighting()\n    bool smartHighlighting() const;\n\npublic slots:\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\n    //! If \\a fold is true then preprocessor blocks can be folded.  The\n    //! default is true.\n    //!\n    //! \\sa foldPreprocessor()\n    virtual void setFoldPreprocessor(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    //! \\sa writeProperties()\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    //! \\sa readProperties()\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n    void setPreprocProp();\n    void setSmartHighlightProp();\n\n    bool fold_comments;\n    bool fold_compact;\n    bool fold_preproc;\n    bool smart_highlight;\n\n    QsciLexerPascal(const QsciLexerPascal &);\n    QsciLexerPascal &operator=(const QsciLexerPascal &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerperl.h",
    "content": "// This defines the interface to the QsciLexerPerl class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERPERL_H\n#define QSCILEXERPERL_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerPerl class encapsulates the Scintilla Perl\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerPerl : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Perl lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! An error.\n        Error = 1,\n\n        //! A comment.\n        Comment = 2,\n\n        //! A POD.\n        POD = 3,\n\n        //! A number.\n        Number = 4,\n\n        //! A keyword.\n        Keyword = 5,\n\n        //! A double-quoted string.\n        DoubleQuotedString = 6,\n\n        //! A single-quoted string.\n        SingleQuotedString = 7,\n\n        //! An operator.\n        Operator = 10,\n\n        //! An identifier\n        Identifier = 11,\n\n        //! A scalar.\n        Scalar = 12,\n\n        //! An array.\n        Array = 13,\n\n        //! A hash.\n        Hash = 14,\n\n        //! A symbol table.\n        SymbolTable = 15,\n\n        //! A regular expression.\n        Regex = 17,\n\n        //! A substitution.\n        Substitution = 18,\n\n        //! Backticks.\n        Backticks = 20,\n\n        //! A data section.\n        DataSection = 21,\n\n        //! A here document delimiter.\n        HereDocumentDelimiter = 22,\n\n        //! A single quoted here document.\n        SingleQuotedHereDocument = 23,\n\n        //! A double quoted here document.\n        DoubleQuotedHereDocument = 24,\n\n        //! A backtick here document.\n        BacktickHereDocument = 25,\n\n        //! A quoted string (q).\n        QuotedStringQ = 26,\n\n        //! A quoted string (qq).\n        QuotedStringQQ = 27,\n\n        //! A quoted string (qx).\n        QuotedStringQX = 28,\n\n        //! A quoted string (qr).\n        QuotedStringQR = 29,\n\n        //! A quoted string (qw).\n        QuotedStringQW = 30,\n\n        //! A verbatim POD.\n        PODVerbatim = 31,\n\n        //! A Subroutine prototype.\n        SubroutinePrototype = 40,\n\n        //! A format identifier.\n        FormatIdentifier = 41,\n\n        //! A format body.\n        FormatBody = 42,\n\n        //! A double-quoted string (interpolated variable).\n        DoubleQuotedStringVar = 43,\n\n        //! A translation.\n        Translation = 44,\n\n        //! A regular expression (interpolated variable).\n        RegexVar = 54,\n\n        //! A substitution (interpolated variable).\n        SubstitutionVar = 55,\n\n        //! Backticks (interpolated variable).\n        BackticksVar = 57,\n\n        //! A double quoted here document (interpolated variable).\n        DoubleQuotedHereDocumentVar = 61,\n\n        //! A backtick here document (interpolated variable).\n        BacktickHereDocumentVar = 62,\n\n        //! A quoted string (qq, interpolated variable).\n        QuotedStringQQVar = 64,\n\n        //! A quoted string (qx, interpolated variable).\n        QuotedStringQXVar = 65,\n\n        //! A quoted string (qr, interpolated variable).\n        QuotedStringQRVar = 66\n    };\n\n    //! Construct a QsciLexerPerl with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerPerl(QObject *parent = 0);\n\n    //! Destroys the QsciLexerPerl instance.\n    virtual ~QsciLexerPerl();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the character sequences that can separate\n    //! auto-completion words.\n    QStringList autoCompletionWordSeparators() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the end of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockEnd(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number\n    //! \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! If \\a fold is true then \"} else {\" lines can be folded.  The default is\n    //! false.\n    //!\n    //! \\sa foldAtElse()\n    void setFoldAtElse(bool fold);\n\n    //! Returns true if \"} else {\" lines can be folded.\n    //!\n    //! \\sa setFoldAtElse()\n    bool foldAtElse() const {return fold_atelse;}\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\n    //! If \\a fold is true then packages can be folded.  The default is true.\n    //!\n    //! \\sa foldPackages()\n    void setFoldPackages(bool fold);\n\n    //! Returns true if packages can be folded.\n    //!\n    //! \\sa setFoldPackages()\n    bool foldPackages() const;\n\n    //! If \\a fold is true then POD blocks can be folded.  The default is true.\n    //!\n    //! \\sa foldPODBlocks()\n    void setFoldPODBlocks(bool fold);\n\n    //! Returns true if POD blocks can be folded.\n    //!\n    //! \\sa setFoldPODBlocks()\n    bool foldPODBlocks() const;\n\npublic slots:\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setAtElseProp();\n    void setCommentProp();\n    void setCompactProp();\n    void setPackagesProp();\n    void setPODBlocksProp();\n\n    bool fold_atelse;\n    bool fold_comments;\n    bool fold_compact;\n    bool fold_packages;\n    bool fold_pod_blocks;\n\n    QsciLexerPerl(const QsciLexerPerl &);\n    QsciLexerPerl &operator=(const QsciLexerPerl &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerpo.h",
    "content": "// This defines the interface to the QsciLexerPO class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERPO_H\n#define QSCILEXERPO_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerPO class encapsulates the Scintilla PO lexer.\nclass QSCINTILLA_EXPORT QsciLexerPO : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! PO lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A message identifier.\n        MessageId = 2,\n\n        //! The text of a message identifier.\n        MessageIdText = 3,\n\n        //! A message string.\n        MessageString = 4,\n\n        //! The text of a message string.\n        MessageStringText = 5,\n\n        //! A message context.\n        MessageContext = 6,\n\n        //! The text of a message context.\n        MessageContextText = 7,\n\n        //! The \"fuzzy\" flag.\n        Fuzzy = 8,\n\n        //! A programmer comment.\n        ProgrammerComment = 9,\n\n        //! A reference.\n        Reference = 10,\n\n        //! A flag.\n        Flags = 11,\n\n        //! A message identifier text end-of-line.\n        MessageIdTextEOL = 12,\n\n        //! A message string text end-of-line.\n        MessageStringTextEOL = 13,\n\n        //! A message context text end-of-line.\n        MessageContextTextEOL = 14\n    };\n\n    //! Construct a QsciLexerPO with parent \\a parent.  \\a parent is typically\n    //! the QsciScintilla instance.\n    QsciLexerPO(QObject *parent = 0);\n\n    //! Destroys the QsciLexerPO instance.\n    virtual ~QsciLexerPO();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the propertyChanged()\n    //! signal as required.\n    void refreshProperties();\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\npublic slots:\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n\n    bool fold_comments;\n    bool fold_compact;\n\n    QsciLexerPO(const QsciLexerPO &);\n    QsciLexerPO &operator=(const QsciLexerPO &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerpostscript.h",
    "content": "// This defines the interface to the QsciLexerPostScript class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERPOSTSCRIPT_H\n#define QSCILEXERPOSTSCRIPT_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerPostScript class encapsulates the Scintilla PostScript\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerPostScript : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! PostScript lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A DSC comment.\n        DSCComment = 2,\n\n        //! A DSC comment value.\n        DSCCommentValue = 3,\n\n        //! A number.\n        Number = 4,\n\n        //! A name.\n        Name = 5,\n\n        //! A keyword.\n        Keyword = 6,\n\n        //! A literal.\n        Literal = 7,\n\n        //! An immediately evaluated literal.\n        ImmediateEvalLiteral = 8,\n\n        //! Array parenthesis.\n        ArrayParenthesis = 9,\n\n        //! Dictionary parenthesis.\n        DictionaryParenthesis = 10,\n\n        //! Procedure parenthesis.\n        ProcedureParenthesis = 11,\n\n        //! Text.\n        Text = 12,\n\n        //! A hexadecimal string.\n        HexString = 13,\n\n        //! A base85 string.\n        Base85String = 14,\n\n        //! A bad string character.\n        BadStringCharacter = 15\n    };\n\n    //! Construct a QsciLexerPostScript with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerPostScript(QObject *parent = 0);\n\n    //! Destroys the QsciLexerPostScript instance.\n    virtual ~QsciLexerPostScript();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.  Set 5 can be used to provide\n    //! additional user defined keywords.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the propertyChanged()\n    //! signal as required.\n    void refreshProperties();\n\n    //! Returns true if tokens should be marked.\n    //!\n    //! \\sa setTokenize()\n    bool tokenize() const;\n\n    //! Returns the PostScript level.\n    //!\n    //! \\sa setLevel()\n    int level() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\n    //! Returns true if else blocks can be folded.\n    //!\n    //! \\sa setFoldAtElse()\n    bool foldAtElse() const;\n\npublic slots:\n    //! If \\a tokenize is true then tokens are marked.  The default is false.\n    //!\n    //! \\sa tokenize()\n    virtual void setTokenize(bool tokenize);\n\n    //! The PostScript level is set to \\a level.  The default is 3.\n    //!\n    //! \\sa level()\n    virtual void setLevel(int level);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\n    //! If \\a fold is true then else blocks can be folded.  The default is\n    //! false.\n    //!\n    //! \\sa foldAtElse()\n    virtual void setFoldAtElse(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setTokenizeProp();\n    void setLevelProp();\n    void setCompactProp();\n    void setAtElseProp();\n\n    bool ps_tokenize;\n    int ps_level;\n    bool fold_compact;\n    bool fold_atelse;\n\n    QsciLexerPostScript(const QsciLexerPostScript &);\n    QsciLexerPostScript &operator=(const QsciLexerPostScript &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerpov.h",
    "content": "// This defines the interface to the QsciLexerPOV class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERPOV_H\n#define QSCILEXERPOV_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerPOV class encapsulates the Scintilla POV lexer.\nclass QSCINTILLA_EXPORT QsciLexerPOV : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! POV lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A comment line.\n        CommentLine = 2,\n\n        //! A number.\n        Number = 3,\n\n        //! An operator.\n        Operator = 4,\n\n        //! An identifier\n        Identifier = 5,\n\n        //! A string.\n        String = 6,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 7,\n\n        //! A directive.\n        Directive = 8,\n\n        //! A bad directive.\n        BadDirective = 9,\n\n        //! Objects, CSG and appearance.\n        ObjectsCSGAppearance = 10,\n\n        //! Types, modifiers and items.\n        TypesModifiersItems = 11,\n\n        //! Predefined identifiers.\n        PredefinedIdentifiers = 12,\n\n        //! Predefined identifiers.\n        PredefinedFunctions = 13,\n\n        //! A keyword defined in keyword set number 6.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet6 = 14,\n\n        //! A keyword defined in keyword set number 7.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet7 = 15,\n\n        //! A keyword defined in keyword set number 8.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet8 = 16\n    };\n\n    //! Construct a QsciLexerPOV with parent \\a parent.  \\a parent is typically\n    //! the QsciScintilla instance.\n    QsciLexerPOV(QObject *parent = 0);\n\n    //! Destroys the QsciLexerPOV instance.\n    virtual ~QsciLexerPOV();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the propertyChanged()\n    //! signal as required.\n    void refreshProperties();\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\n    //! Returns true if directives can be folded.\n    //!\n    //! \\sa setFoldDirectives()\n    bool foldDirectives() const;\n\npublic slots:\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\n    //! If \\a fold is true then directives can be folded.  The default is\n    //! false.\n    //!\n    //! \\sa foldDirectives()\n    virtual void setFoldDirectives(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n    void setDirectiveProp();\n\n    bool fold_comments;\n    bool fold_compact;\n    bool fold_directives;\n\n    QsciLexerPOV(const QsciLexerPOV &);\n    QsciLexerPOV &operator=(const QsciLexerPOV &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerproperties.h",
    "content": "// This defines the interface to the QsciLexerProperties class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERPROPERTIES_H\n#define QSCILEXERPROPERTIES_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerProperties class encapsulates the Scintilla\n//! Properties lexer.\nclass QSCINTILLA_EXPORT QsciLexerProperties : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Properties lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A section.\n        Section = 2,\n\n        //! An assignment operator.\n        Assignment = 3,\n\n        //! A default value.\n        DefaultValue = 4,\n\n        //! A key.\n        Key = 5\n    };\n\n    //! Construct a QsciLexerProperties with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerProperties(QObject *parent = 0);\n\n    //! Destroys the QsciLexerProperties instance.\n    virtual ~QsciLexerProperties();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the style\n    //! is invalid for this language then an empty QString is returned.  This\n    //! is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const {return fold_compact;}\n\n    //! If \\a enable is true then initial spaces in a line are allowed.  The\n    //! default is true.\n    //!\n    //! \\sa initialSpaces()\n    void setInitialSpaces(bool enable);\n\n    //! Returns true if initial spaces in a line are allowed.\n    //!\n    //! \\sa setInitialSpaces()\n    bool initialSpaces() const {return initial_spaces;}\n\npublic slots:\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    //! \\sa writeProperties()\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    //! \\sa readProperties()\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCompactProp();\n    void setInitialSpacesProp();\n\n    bool fold_compact;\n    bool initial_spaces;\n\n    QsciLexerProperties(const QsciLexerProperties &);\n    QsciLexerProperties &operator=(const QsciLexerProperties &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerpython.h",
    "content": "// This defines the interface to the QsciLexerPython class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERPYTHON_H\n#define QSCILEXERPYTHON_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n#include \"Qsci/qsciscintillabase.h\"\n\n\n//! \\brief The QsciLexerPython class encapsulates the Scintilla Python lexer.\nclass QSCINTILLA_EXPORT QsciLexerPython : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Python lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A number.\n        Number = 2,\n\n        //! A double-quoted string.\n        DoubleQuotedString = 3,\n\n        //! A single-quoted string.\n        SingleQuotedString = 4,\n\n        //! A keyword.\n        Keyword = 5,\n\n        //! A triple single-quoted string.\n        TripleSingleQuotedString = 6,\n\n        //! A triple double-quoted string.\n        TripleDoubleQuotedString = 7,\n\n        //! The name of a class.\n        ClassName = 8,\n\n        //! The name of a function or method.\n        FunctionMethodName = 9,\n\n        //! An operator.\n        Operator = 10,\n\n        //! An identifier\n        Identifier = 11,\n\n        //! A comment block.\n        CommentBlock = 12,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 13,\n\n        //! A highlighted identifier.  These are defined by keyword set\n        //! 2.  Reimplement keywords() to define keyword set 2.\n        HighlightedIdentifier = 14,\n\n        //! A decorator.\n        Decorator = 15\n    };\n\n    //! This enum defines the different conditions that can cause\n    //! indentations to be displayed as being bad.\n    enum IndentationWarning {\n        //! Bad indentation is not displayed differently.\n        NoWarning = 0,\n\n        //! The indentation is inconsistent when compared to the\n        //! previous line, ie. it is made up of a different combination\n        //! of tabs and/or spaces.\n        Inconsistent = 1,\n\n        //! The indentation is made up of spaces followed by tabs.\n        TabsAfterSpaces = 2,\n\n        //! The indentation contains spaces.\n        Spaces = 3,\n\n        //! The indentation contains tabs.\n        Tabs = 4\n    };\n\n    //! Construct a QsciLexerPython with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerPython(QObject *parent = 0);\n\n    //! Destroys the QsciLexerPython instance.\n    virtual ~QsciLexerPython();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the character sequences that can separate\n    //! auto-completion words.\n    QStringList autoCompletionWordSeparators() const;\n\n    //! \\internal Returns the number of lines prior to the current one when\n    //! determining the scope of a block when auto-indenting.\n    int blockLookback() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! \\internal Returns the view used for indentation guides.\n    virtual int indentationGuideView() const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if indented comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const {return fold_comments;}\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    void setFoldCompact(bool fold);\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const {return fold_compact;}\n\n    //! Returns true if triple quoted strings can be folded.\n    //!\n    //! \\sa setFoldQuotes()\n    bool foldQuotes() const {return fold_quotes;}\n\n    //! Returns the condition that will cause bad indentations to be\n    //! displayed.\n    //!\n    //! \\sa setIndentationWarning()\n    QsciLexerPython::IndentationWarning indentationWarning() const {return indent_warn;}\n\n    //! If \\a enabled is true then sub-identifiers defined in keyword set 2\n    //! will be highlighted.  For example, if it is false and \"open\" is defined\n    //! in keyword set 2 then \"foo.open\" will not be highlighted.  The default\n    //! is true.\n    //!\n    //! \\sa highlightSubidentifiers()\n    void setHighlightSubidentifiers(bool enabled);\n\n    //! Returns true if string literals are allowed to span newline characters.\n    //!\n    //! \\sa setHighlightSubidentifiers()\n    bool highlightSubidentifiers() const {return highlight_subids;}\n\n    //! If \\a allowed is true then string literals are allowed to span newline\n    //! characters.  The default is false.\n    //!\n    //! \\sa stringsOverNewlineAllowed()\n    void setStringsOverNewlineAllowed(bool allowed);\n\n    //! Returns true if string literals are allowed to span newline characters.\n    //!\n    //! \\sa setStringsOverNewlineAllowed()\n    bool stringsOverNewlineAllowed() const {return strings_over_newline;}\n\n    //! If \\a allowed is true then Python v2 unicode string literals (e.g.\n    //! u\"utf8\") are allowed.  The default is true.\n    //!\n    //! \\sa v2UnicodeAllowed()\n    void setV2UnicodeAllowed(bool allowed);\n\n    //! Returns true if Python v2 unicode string literals (e.g. u\"utf8\") are\n    //! allowed.\n    //!\n    //! \\sa setV2UnicodeAllowed()\n    bool v2UnicodeAllowed() const {return v2_unicode;}\n\n    //! If \\a allowed is true then Python v3 binary and octal literals (e.g.\n    //! 0b1011, 0o712) are allowed.  The default is true.\n    //!\n    //! \\sa v3BinaryOctalAllowed()\n    void setV3BinaryOctalAllowed(bool allowed);\n\n    //! Returns true if Python v3 binary and octal literals (e.g. 0b1011,\n    //! 0o712) are allowed.\n    //!\n    //! \\sa setV3BinaryOctalAllowed()\n    bool v3BinaryOctalAllowed() const {return v3_binary_octal;}\n\n    //! If \\a allowed is true then Python v3 bytes string literals (e.g.\n    //! b\"bytes\") are allowed.  The default is true.\n    //!\n    //! \\sa v3BytesAllowed()\n    void setV3BytesAllowed(bool allowed);\n\n    //! Returns true if Python v3 bytes string literals (e.g. b\"bytes\") are\n    //! allowed.\n    //!\n    //! \\sa setV3BytesAllowed()\n    bool v3BytesAllowed() const {return v3_bytes;}\n\npublic slots:\n    //! If \\a fold is true then indented comment blocks can be folded.  The\n    //! default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then triple quoted strings can be folded.  The\n    //! default is false.\n    //!\n    //! \\sa foldQuotes()\n    virtual void setFoldQuotes(bool fold);\n\n    //! Sets the condition that will cause bad indentations to be\n    //! displayed.\n    //!\n    //! \\sa indentationWarning()\n    virtual void setIndentationWarning(QsciLexerPython::IndentationWarning warn);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n    void setQuotesProp();\n    void setTabWhingeProp();\n    void setStringsOverNewlineProp();\n    void setV2UnicodeProp();\n    void setV3BinaryOctalProp();\n    void setV3BytesProp();\n    void setHighlightSubidsProp();\n\n    bool fold_comments;\n    bool fold_compact;\n    bool fold_quotes;\n    IndentationWarning indent_warn;\n    bool strings_over_newline;\n    bool v2_unicode;\n    bool v3_binary_octal;\n    bool v3_bytes;\n    bool highlight_subids;\n\n    friend class QsciLexerHTML;\n\n    static const char *keywordClass;\n\n    QsciLexerPython(const QsciLexerPython &);\n    QsciLexerPython &operator=(const QsciLexerPython &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerruby.h",
    "content": "// This defines the interface to the QsciLexerRuby class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERRUBY_H\n#define QSCILEXERRUBY_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerRuby class encapsulates the Scintilla Ruby lexer.\nclass QSCINTILLA_EXPORT QsciLexerRuby : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Ruby lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! An error.\n        Error = 1,\n\n        //! A comment.\n        Comment = 2,\n\n        //! A POD.\n        POD = 3,\n\n        //! A number.\n        Number = 4,\n\n        //! A keyword.\n        Keyword = 5,\n\n        //! A double-quoted string.\n        DoubleQuotedString = 6,\n\n        //! A single-quoted string.\n        SingleQuotedString = 7,\n\n        //! The name of a class.\n        ClassName = 8,\n\n        //! The name of a function or method.\n        FunctionMethodName = 9,\n\n        //! An operator.\n        Operator = 10,\n\n        //! An identifier\n        Identifier = 11,\n\n        //! A regular expression.\n        Regex = 12,\n\n        //! A global.\n        Global = 13,\n\n        //! A symbol.\n        Symbol = 14,\n\n        //! The name of a module.\n        ModuleName = 15,\n\n        //! An instance variable.\n        InstanceVariable = 16,\n\n        //! A class variable.\n        ClassVariable = 17,\n\n        //! Backticks.\n        Backticks = 18,\n\n        //! A data section.\n        DataSection = 19,\n\n        //! A here document delimiter.\n        HereDocumentDelimiter = 20,\n\n        //! A here document.\n        HereDocument = 21,\n\n        //! A %q string.\n        PercentStringq = 24,\n\n        //! A %Q string.\n        PercentStringQ = 25,\n\n        //! A %x string.\n        PercentStringx = 26,\n\n        //! A %r string.\n        PercentStringr = 27,\n\n        //! A %w string.\n        PercentStringw = 28,\n\n        //! A demoted keyword.\n        DemotedKeyword = 29,\n\n        //! stdin.\n        Stdin = 30,\n\n        //! stdout.\n        Stdout = 31,\n\n        //! stderr.\n        Stderr = 40\n    };\n\n    //! Construct a QsciLexerRuby with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerRuby(QObject *parent = 0);\n\n    //! Destroys the QsciLexerRuby instance.\n    virtual ~QsciLexerRuby();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the end of a block for\n    //! auto-indentation.  The style is returned via \\a style.\n    const char *blockEnd(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of words or characters in\n    //! a particular style that define the start of a block for\n    //! auto-indentation.  The styles is returned via \\a style.\n    const char *blockStart(int *style = 0) const;\n\n    //! \\internal Returns a space separated list of keywords in a\n    //! particular style that define the start of a block for\n    //! auto-indentation.  The style is returned via \\a style.\n    const char *blockStartKeyword(int *style = 0) const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultpaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the style\n    //! is invalid for this language then an empty QString is returned.  This\n    //! is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    void setFoldComments(bool fold);\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const {return fold_comments;}\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    void setFoldCompact(bool fold);\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const {return fold_compact;}\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs, const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n\n    bool fold_comments;\n    bool fold_compact;\n\n    QsciLexerRuby(const QsciLexerRuby &);\n    QsciLexerRuby &operator=(const QsciLexerRuby &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerspice.h",
    "content": "// This defines the interface to the QsciLexerSpice class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERSPICE_H\n#define QSCILEXERSPICE_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerSpice class encapsulates the Scintilla Spice lexer.\nclass QSCINTILLA_EXPORT QsciLexerSpice : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Spice lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! An identifier.\n        Identifier = 1,\n\n        //! A command.\n        Command = 2,\n\n        //! A function.\n        Function = 3,\n\n        //! A parameter.\n        Parameter = 4,\n\n        //! A number.\n        Number = 5,\n\n        //! A delimiter.\n        Delimiter = 6,\n\n        //! A value.\n        Value = 7,\n\n        //! A comment.\n        Comment = 8\n    };\n\n    //! Construct a QsciLexerSpice with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerSpice(QObject *parent = 0);\n\n    //! Destroys the QsciLexerSpice instance.\n    virtual ~QsciLexerSpice();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\nprivate:\n    QsciLexerSpice(const QsciLexerSpice &);\n    QsciLexerSpice &operator=(const QsciLexerSpice &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexersql.h",
    "content": "// This defines the interface to the QsciLexerSQL class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERSQL_H\n#define QSCILEXERSQL_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerSQL class encapsulates the Scintilla SQL lexer.\nclass QSCINTILLA_EXPORT QsciLexerSQL : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! SQL lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A line comment.\n        CommentLine = 2,\n\n        //! A JavaDoc/Doxygen style comment.\n        CommentDoc = 3,\n\n        //! A number.\n        Number = 4,\n\n        //! A keyword.\n        Keyword = 5,\n\n        //! A double-quoted string.\n        DoubleQuotedString = 6,\n\n        //! A single-quoted string.\n        SingleQuotedString = 7,\n\n        //! An SQL*Plus keyword.\n        PlusKeyword = 8,\n\n        //! An SQL*Plus prompt.\n        PlusPrompt = 9,\n\n        //! An operator.\n        Operator = 10,\n\n        //! An identifier\n        Identifier = 11,\n\n        //! An SQL*Plus comment.\n        PlusComment = 13,\n\n        //! A '#' line comment.\n        CommentLineHash = 15,\n\n        //! A JavaDoc/Doxygen keyword.\n        CommentDocKeyword = 17,\n\n        //! A JavaDoc/Doxygen keyword error.\n        CommentDocKeywordError = 18,\n\n        //! A keyword defined in keyword set number 5.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        //! Note that keywords must be defined using lower case.\n        KeywordSet5 = 19,\n\n        //! A keyword defined in keyword set number 6.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        //! Note that keywords must be defined using lower case.\n        KeywordSet6 = 20,\n\n        //! A keyword defined in keyword set number 7.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        //! Note that keywords must be defined using lower case.\n        KeywordSet7 = 21,\n\n        //! A keyword defined in keyword set number 8.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        //! Note that keywords must be defined using lower case.\n        KeywordSet8 = 22,\n\n        //! A quoted identifier.\n        QuotedIdentifier = 23\n    };\n\n    //! Construct a QsciLexerSQL with parent \\a parent.  \\a parent is typically\n    //! the QsciScintilla instance.\n    QsciLexerSQL(QObject *parent = 0);\n\n    //! Destroys the QsciLexerSQL instance.\n    virtual ~QsciLexerSQL();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised by\n    //! the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the style\n    //! is invalid for this language then an empty QString is returned.  This\n    //! is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! Returns true if backslash escapes are enabled.\n    //!\n    //! \\sa setBackslashEscapes()\n    bool backslashEscapes() const {return backslash_escapes;}\n\n    //! If \\a enable is true then words may contain dots (i.e. periods or full\n    //! stops).  The default is false.\n    //!\n    //! \\sa dottedWords()\n    void setDottedWords(bool enable);\n\n    //! Returns true if words may contain dots (i.e. periods or full stops).\n    //!\n    //! \\sa setDottedWords()\n    bool dottedWords() const {return allow_dotted_word;}\n\n    //! If \\a fold is true then ELSE blocks can be folded.  The default is\n    //! false.\n    //!\n    //! \\sa foldAtElse()\n    void setFoldAtElse(bool fold);\n\n    //! Returns true if ELSE blocks can be folded.\n    //!\n    //! \\sa setFoldAtElse()\n    bool foldAtElse() const {return at_else;}\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const {return fold_comments;}\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const {return fold_compact;}\n\n    //! If \\a fold is true then only BEGIN blocks can be folded.  The default\n    //! is false.\n    //!\n    //! \\sa foldOnlyBegin()\n    void setFoldOnlyBegin(bool fold);\n\n    //! Returns true if BEGIN blocks only can be folded.\n    //!\n    //! \\sa setFoldOnlyBegin()\n    bool foldOnlyBegin() const {return only_begin;}\n\n    //! If \\a enable is true then '#' is used as a comment character.  It is\n    //! typically enabled for MySQL and disabled for Oracle.  The default is\n    //! false.\n    //!\n    //! \\sa hashComments()\n    void setHashComments(bool enable);\n\n    //! Returns true if '#' is used as a comment character.\n    //!\n    //! \\sa setHashComments()\n    bool hashComments() const {return numbersign_comment;}\n\n    //! If \\a enable is true then quoted identifiers are enabled.  The default\n    //! is false.\n    //!\n    //! \\sa quotedIdentifiers()\n    void setQuotedIdentifiers(bool enable);\n\n    //! Returns true if quoted identifiers are enabled.\n    //!\n    //! \\sa setQuotedIdentifiers()\n    bool quotedIdentifiers() const {return backticks_identifier;}\n\npublic slots:\n    //! If \\a enable is true then backslash escapes are enabled.  The\n    //! default is false.\n    //!\n    //! \\sa backslashEscapes()\n    virtual void setBackslashEscapes(bool enable);\n\n    //! If \\a fold is true then multi-line comment blocks can be folded.  The\n    //! default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs, const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    void setAtElseProp();\n    void setCommentProp();\n    void setCompactProp();\n    void setOnlyBeginProp();\n    void setBackticksIdentifierProp();\n    void setNumbersignCommentProp();\n    void setBackslashEscapesProp();\n    void setAllowDottedWordProp();\n\n    bool at_else;\n    bool fold_comments;\n    bool fold_compact;\n    bool only_begin;\n    bool backticks_identifier;\n    bool numbersign_comment;\n    bool backslash_escapes;\n    bool allow_dotted_word;\n\n    QsciLexerSQL(const QsciLexerSQL &);\n    QsciLexerSQL &operator=(const QsciLexerSQL &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexertcl.h",
    "content": "// This defines the interface to the QsciLexerTCL class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERTCL_H\n#define QSCILEXERTCL_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerTCL class encapsulates the Scintilla TCL lexer.\nclass QSCINTILLA_EXPORT QsciLexerTCL : public QsciLexer\n{\n\tQ_OBJECT\n\npublic:\n\t//! This enum defines the meanings of the different styles used by the TCL\n\t//! lexer.\n\tenum {\n\t\t//! The default.\n\t\tDefault = 0,\n\n\t\t//! A comment.\n\t\tComment = 1,\n\n\t\t//! A comment line.\n\t\tCommentLine = 2,\n\n\t\t//! A number.\n\t\tNumber = 3,\n\n\t\t//! A quoted keyword.\n\t\tQuotedKeyword = 4,\n\n\t\t//! A quoted string.\n\t\tQuotedString = 5,\n\n\t\t//! An operator.\n\t\tOperator = 6,\n\n\t\t//! An identifier\n\t\tIdentifier = 7,\n\n\t\t//! A substitution.\n\t\tSubstitution = 8,\n\n\t\t//! A substitution starting with a brace.\n\t\tSubstitutionBrace = 9,\n\n\t\t//! A modifier.\n\t\tModifier = 10,\n\n\t\t//! Expand keyword (defined in keyword set number 5).\n\t\tExpandKeyword = 11,\n\n        //! A TCL keyword (defined in keyword set number 1).\n        TCLKeyword = 12,\n\n        //! A Tk keyword (defined in keyword set number 2).\n        TkKeyword = 13,\n\n        //! An iTCL keyword (defined in keyword set number 3).\n        ITCLKeyword = 14,\n\n        //! A Tk command (defined in keyword set number 4).\n        TkCommand = 15,\n\n        //! A keyword defined in keyword set number 6.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet6 = 16,\n\n        //! A keyword defined in keyword set number 7.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet7 = 17,\n\n        //! A keyword defined in keyword set number 8.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet8 = 18,\n\n        //! A keyword defined in keyword set number 9.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet9 = 19,\n\n        //! A comment box.\n        CommentBox = 20,\n\n        //! A comment block.\n        CommentBlock = 21\n\t};\n\n\t//! Construct a QsciLexerTCL with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n\tQsciLexerTCL(QObject *parent = 0);\n\n\t//! Destroys the QsciLexerTCL instance.\n\tvirtual ~QsciLexerTCL();\n\n\t//! Returns the name of the language.\n\tconst char *language() const;\n\n\t//! Returns the name of the lexer.  Some lexers support a number of\n\t//! languages.\n\tconst char *lexer() const;\n\n\t//! \\internal Returns the style used for braces for brace matching.\n\tint braceStyle() const;\n\n\t//! Returns the foreground colour of the text for style number \\a style.\n\t//!\n\t//! \\sa defaultPaper()\n\tQColor defaultColor(int style) const;\n\n\t//! Returns the end-of-line fill for style number \\a style.\n\tbool defaultEolFill(int style) const;\n\n\t//! Returns the font for style number \\a style.\n\tQFont defaultFont(int style) const;\n\n\t//! Returns the background colour of the text for style number \\a style.\n\t//!\n\t//! \\sa defaultColor()\n\tQColor defaultPaper(int style) const;\n\n\t//! Returns the set of keywords for the keyword set \\a set recognised\n\t//! by the lexer as a space separated string.\n\tconst char *keywords(int set) const;\n\n\t//! Returns the descriptive name for style number \\a style.  If the style\n\t//! is invalid for this language then an empty QString is returned.  This\n\t//! is intended to be used in user preference dialogs.\n\tQString description(int style) const;\n\n\t//! Causes all properties to be refreshed by emitting the\n\t//! propertyChanged() signal as required.\n\tvoid refreshProperties();\n\n\t//! If \\a fold is true then multi-line comment blocks can be folded.  The\n    //! default is false.\n\t//!\n\t//! \\sa foldComments()\n\tvoid setFoldComments(bool fold);\n\n    //! Returns true if multi-line comment blocks can be folded.\n\t//!\n\t//! \\sa setFoldComments()\n\tbool foldComments() const {return fold_comments;}\n\nprotected:\n\t//! The lexer's properties are read from the settings \\a qs.  \\a prefix\n\t//! (which has a trailing '/') should be used as a prefix to the key of\n\t//! each setting.  true is returned if there is no error.\n\t//!\n\tbool readProperties(QSettings &qs,const QString &prefix);\n\n\t//! The lexer's properties are written to the settings \\a qs.\n\t//! \\a prefix (which has a trailing '/') should be used as a prefix to\n\t//! the key of each setting.  true is returned if there is no error.\n\t//!\n\tbool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n\tvoid setCommentProp();\n\n\tbool fold_comments;\n\n\tQsciLexerTCL(const QsciLexerTCL &);\n\tQsciLexerTCL &operator=(const QsciLexerTCL &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexertex.h",
    "content": "// This defines the interface to the QsciLexerTeX class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERTEX_H\n#define QSCILEXERTEX_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerTeX class encapsulates the Scintilla TeX lexer.\nclass QSCINTILLA_EXPORT QsciLexerTeX : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! TeX lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A special.\n        Special = 1,\n\n        //! A group.\n        Group = 2,\n\n        //! A symbol.\n        Symbol = 3,\n\n        //! A command.\n        Command = 4,\n\n        //! Text.\n        Text = 5\n    };\n\n    //! Construct a QsciLexerTeX with parent \\a parent.  \\a parent is typically\n    //! the QsciScintilla instance.\n    QsciLexerTeX(QObject *parent = 0);\n\n    //! Destroys the QsciLexerTeX instance.\n    virtual ~QsciLexerTeX();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    QColor defaultColor(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! If \\a fold is true then multi-line comment blocks can be folded.  The\n    //! default is false.\n    //!\n    //! \\sa foldComments()\n    void setFoldComments(bool fold);\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const {return fold_comments;}\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    void setFoldCompact(bool fold);\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const {return fold_compact;}\n\n    //! If \\a enable is true then comments are processed as TeX source\n    //! otherwise they are ignored.  The default is false.\n    //!\n    //! \\sa processComments()\n    void setProcessComments(bool enable);\n\n    //! Returns true if comments are processed as TeX source.\n    //!\n    //! \\sa setProcessComments()\n    bool processComments() const {return process_comments;}\n\n    //! If \\a enable is true then \\\\if<unknown> processed is processed as a\n    //! command.  The default is true.\n    //!\n    //! \\sa processIf()\n    void setProcessIf(bool enable);\n\n    //! Returns true if \\\\if<unknown> is processed as a command.\n    //!\n    //! \\sa setProcessIf()\n    bool processIf() const {return process_if;}\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs, const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n    void setProcessCommentsProp();\n    void setAutoIfProp();\n\n    bool fold_comments;\n    bool fold_compact;\n    bool process_comments;\n    bool process_if;\n\n    QsciLexerTeX(const QsciLexerTeX &);\n    QsciLexerTeX &operator=(const QsciLexerTeX &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerverilog.h",
    "content": "// This defines the interface to the QsciLexerVerilog class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERVERILOG_H\n#define QSCILEXERVERILOG_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerVerilog class encapsulates the Scintilla Verilog\n//! lexer.\nclass QSCINTILLA_EXPORT QsciLexerVerilog : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! Verilog lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A line comment.\n        CommentLine = 2,\n\n        //! A bang comment.\n        CommentBang = 3,\n\n        //! A number\n        Number = 4,\n\n        //! A keyword.\n        Keyword = 5,\n\n        //! A string.\n        String = 6,\n\n        //! A keyword defined in keyword set number 2.  The class must\n        //! be sub-classed and re-implement keywords() to make use of\n        //! this style.\n        KeywordSet2 = 7,\n\n        //! A system task.\n        SystemTask = 8,\n\n        //! A pre-processor block.\n        Preprocessor = 9,\n\n        //! An operator.\n        Operator = 10,\n\n        //! An identifier.\n        Identifier = 11,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 12,\n\n        //! A keyword defined in keyword set number 4.  The class must\n        //! be sub-classed and re-implement keywords() to make use of\n        //! this style.  This set is intended to be used for user defined\n        //! identifiers and tasks.\n        UserKeywordSet = 19\n    };\n\n    //! Construct a QsciLexerVerilog with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerVerilog(QObject *parent = 0);\n\n    //! Destroys the QsciLexerVerilog instance.\n    virtual ~QsciLexerVerilog();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the string of characters that comprise a word.\n    const char *wordCharacters() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! If \\a fold is true then \"} else {\" lines can be folded.  The\n    //! default is false.\n    //!\n    //! \\sa foldAtElse()\n    void setFoldAtElse(bool fold);\n\n    //! Returns true if \"} else {\" lines can be folded.\n    //!\n    //! \\sa setFoldAtElse()\n    bool foldAtElse() const;\n\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    void setFoldComments(bool fold);\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    void setFoldCompact(bool fold);\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\n    //! If \\a fold is true then preprocessor blocks can be folded.  The\n    //! default is true.\n    //!\n    //! \\sa foldPreprocessor()\n    void setFoldPreprocessor(bool fold);\n\n    //! Returns true if preprocessor blocks can be folded.\n    //!\n    //! \\sa setFoldPreprocessor()\n    bool foldPreprocessor() const;\n\n    //! If \\a fold is true then modules can be folded.  The default is false.\n    //!\n    //! \\sa foldAtModule()\n    void setFoldAtModule(bool fold);\n\n    //! Returns true if modules can be folded.\n    //!\n    //! \\sa setFoldAtModule()\n    bool foldAtModule() const;\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    //! \\sa writeProperties()\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    //! \\sa readProperties()\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setAtElseProp();\n    void setCommentProp();\n    void setCompactProp();\n    void setPreprocProp();\n    void setAtModuleProp();\n\n    bool fold_atelse;\n    bool fold_comments;\n    bool fold_compact;\n    bool fold_preproc;\n    bool fold_atmodule;\n\n    QsciLexerVerilog(const QsciLexerVerilog &);\n    QsciLexerVerilog &operator=(const QsciLexerVerilog &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexervhdl.h",
    "content": "// This defines the interface to the QsciLexerVHDL class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERVHDL_H\n#define QSCILEXERVHDL_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerVHDL class encapsulates the Scintilla VHDL lexer.\nclass QSCINTILLA_EXPORT QsciLexerVHDL : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! VHDL lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! A comment line.\n        CommentLine = 2,\n\n        //! A number.\n        Number = 3,\n\n        //! A string.\n        String = 4,\n\n        //! An operator.\n        Operator = 5,\n\n        //! An identifier\n        Identifier = 6,\n\n        //! The end of a line where a string is not closed.\n        UnclosedString = 7,\n\n        //! A keyword.\n        Keyword = 8,\n\n        //! A standard operator.\n        StandardOperator = 9,\n\n        //! An attribute.\n        Attribute = 10,\n\n        //! A standard function.\n        StandardFunction = 11,\n\n        //! A standard package.\n        StandardPackage = 12,\n\n        //! A standard type.\n        StandardType = 13,\n\n        //! A keyword defined in keyword set number 7.  The class must be\n        //! sub-classed and re-implement keywords() to make use of this style.\n        KeywordSet7 = 14\n    };\n\n    //! Construct a QsciLexerVHDL with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerVHDL(QObject *parent = 0);\n\n    //! Destroys the QsciLexerVHDL instance.\n    virtual ~QsciLexerVHDL();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! \\internal Returns the style used for braces for brace matching.\n    int braceStyle() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the propertyChanged()\n    //! signal as required.\n    void refreshProperties();\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\n    //! Returns true if trailing blank lines are included in a fold block.\n    //!\n    //! \\sa setFoldCompact()\n    bool foldCompact() const;\n\n    //! Returns true if else blocks can be folded.\n    //!\n    //! \\sa setFoldAtElse()\n    bool foldAtElse() const;\n\n    //! Returns true if begin blocks can be folded.\n    //!\n    //! \\sa setFoldAtBegin()\n    bool foldAtBegin() const;\n\n    //! Returns true if blocks can be folded at a parenthesis.\n    //!\n    //! \\sa setFoldAtParenthesis()\n    bool foldAtParenthesis() const;\n\npublic slots:\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is true.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\n    //! If \\a fold is true then trailing blank lines are included in a fold\n    //! block. The default is true.\n    //!\n    //! \\sa foldCompact()\n    virtual void setFoldCompact(bool fold);\n\n    //! If \\a fold is true then else blocks can be folded.  The default is\n    //! true.\n    //!\n    //! \\sa foldAtElse()\n    virtual void setFoldAtElse(bool fold);\n\n    //! If \\a fold is true then begin blocks can be folded.  The default is\n    //! true.\n    //!\n    //! \\sa foldAtBegin()\n    virtual void setFoldAtBegin(bool fold);\n\n    //! If \\a fold is true then blocks can be folded at a parenthesis.  The\n    //! default is true.\n    //!\n    //! \\sa foldAtParenthesis()\n    virtual void setFoldAtParenthesis(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n    void setCompactProp();\n    void setAtElseProp();\n    void setAtBeginProp();\n    void setAtParenthProp();\n\n    bool fold_comments;\n    bool fold_compact;\n    bool fold_atelse;\n    bool fold_atbegin;\n    bool fold_atparenth;\n\n    QsciLexerVHDL(const QsciLexerVHDL &);\n    QsciLexerVHDL &operator=(const QsciLexerVHDL &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerxml.h",
    "content": "// This defines the interface to the QsciLexerXML class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERXML_H\n#define QSCILEXERXML_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexerhtml.h>\n\n\n//! \\brief The QsciLexerXML class encapsulates the Scintilla XML lexer.\nclass QSCINTILLA_EXPORT QsciLexerXML : public QsciLexerHTML\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciLexerXML with parent \\a parent.  \\a parent is typically\n    //! the QsciScintilla instance.\n    QsciLexerXML(QObject *parent = 0);\n\n    //! Destroys the QsciLexerXML instance.\n    virtual ~QsciLexerXML();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Causes all properties to be refreshed by emitting the\n    //! propertyChanged() signal as required.\n    void refreshProperties();\n\n    //! If \\a allowed is true then scripts are styled.  The default is true.\n    //!\n    //! \\sa scriptsStyled()\n    void setScriptsStyled(bool styled);\n\n    //! Returns true if scripts are styled.\n    //!\n    //! \\sa setScriptsStyled()\n    bool scriptsStyled() const;\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs, const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs, const QString &prefix) const;\n\nprivate:\n    void setScriptsProp();\n\n    bool scripts;\n\n    QsciLexerXML(const QsciLexerXML &);\n    QsciLexerXML &operator=(const QsciLexerXML &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexeryaml.h",
    "content": "// This defines the interface to the QsciLexerYAML class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCILEXERYAML_H\n#define QSCILEXERYAML_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscilexer.h>\n\n\n//! \\brief The QsciLexerYAML class encapsulates the Scintilla YAML lexer.\nclass QSCINTILLA_EXPORT QsciLexerYAML : public QsciLexer\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the meanings of the different styles used by the\n    //! YAML lexer.\n    enum {\n        //! The default.\n        Default = 0,\n\n        //! A comment.\n        Comment = 1,\n\n        //! An identifier.\n        Identifier = 2,\n\n        //! A keyword\n        Keyword = 3,\n\n        //! A number.\n        Number = 4,\n\n        //! A reference.\n        Reference = 5,\n\n        //! A document delimiter.\n        DocumentDelimiter = 6,\n\n        //! A text block marker.\n        TextBlockMarker = 7,\n\n        //! A syntax error marker.\n        SyntaxErrorMarker = 8,\n\n        //! An operator.\n        Operator = 9\n    };\n\n    //! Construct a QsciLexerYAML with parent \\a parent.  \\a parent is\n    //! typically the QsciScintilla instance.\n    QsciLexerYAML(QObject *parent = 0);\n\n    //! Destroys the QsciLexerYAML instance.\n    virtual ~QsciLexerYAML();\n\n    //! Returns the name of the language.\n    const char *language() const;\n\n    //! Returns the name of the lexer.  Some lexers support a number of\n    //! languages.\n    const char *lexer() const;\n\n    //! Returns the foreground colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultPaper()\n    QColor defaultColor(int style) const;\n\n    //! Returns the end-of-line fill for style number \\a style.\n    bool defaultEolFill(int style) const;\n\n    //! Returns the font for style number \\a style.\n    QFont defaultFont(int style) const;\n\n    //! Returns the background colour of the text for style number \\a style.\n    //!\n    //! \\sa defaultColor()\n    QColor defaultPaper(int style) const;\n\n    //! Returns the set of keywords for the keyword set \\a set recognised\n    //! by the lexer as a space separated string.\n    const char *keywords(int set) const;\n\n    //! Returns the descriptive name for style number \\a style.  If the\n    //! style is invalid for this language then an empty QString is returned.\n    //! This is intended to be used in user preference dialogs.\n    QString description(int style) const;\n\n    //! Causes all properties to be refreshed by emitting the propertyChanged()\n    //! signal as required.\n    void refreshProperties();\n\n    //! Returns true if multi-line comment blocks can be folded.\n    //!\n    //! \\sa setFoldComments()\n    bool foldComments() const;\n\npublic slots:\n    //! If \\a fold is true then multi-line comment blocks can be folded.\n    //! The default is false.\n    //!\n    //! \\sa foldComments()\n    virtual void setFoldComments(bool fold);\n\nprotected:\n    //! The lexer's properties are read from the settings \\a qs.  \\a prefix\n    //! (which has a trailing '/') should be used as a prefix to the key of\n    //! each setting.  true is returned if there is no error.\n    //!\n    bool readProperties(QSettings &qs,const QString &prefix);\n\n    //! The lexer's properties are written to the settings \\a qs.\n    //! \\a prefix (which has a trailing '/') should be used as a prefix to\n    //! the key of each setting.  true is returned if there is no error.\n    //!\n    bool writeProperties(QSettings &qs,const QString &prefix) const;\n\nprivate:\n    void setCommentProp();\n\n    bool fold_comments;\n\n    QsciLexerYAML(const QsciLexerYAML &);\n    QsciLexerYAML &operator=(const QsciLexerYAML &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscimacro.h",
    "content": "// This defines the interface to the QsciMacro class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCIMACRO_H\n#define QSCIMACRO_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qobject.h>\n#include <qstring.h>\n\n#include <qlist.h>\n\n#include <Qsci/qsciglobal.h>\n\n\nclass QsciScintilla;\n\n\n//! \\brief The QsciMacro class represents a sequence of recordable editor\n//! commands.\n//!\n//! Methods are provided to convert convert a macro to and from a textual\n//! representation so that they can be easily written to and read from\n//! permanent storage.\nclass QSCINTILLA_EXPORT QsciMacro : public QObject\n{\n    Q_OBJECT\n\npublic:\n    //! Construct a QsciMacro with parent \\a parent.\n    QsciMacro(QsciScintilla *parent);\n\n    //! Construct a QsciMacro from the printable ASCII representation \\a asc,\n    //! with parent \\a parent.\n    QsciMacro(const QString &asc, QsciScintilla *parent);\n\n    //! Destroy the QsciMacro instance.\n    virtual ~QsciMacro();\n\n    //! Clear the contents of the macro.\n    void clear();\n\n    //! Load the macro from the printable ASCII representation \\a asc.  Returns\n    //! true if there was no error.\n    //!\n    //! \\sa save()\n    bool load(const QString &asc);\n\n    //! Return a printable ASCII representation of the macro.  It is guaranteed\n    //! that only printable ASCII characters are used and that double quote\n    //! characters will not be used.\n    //!\n    //! \\sa load()\n    QString save() const;\n\npublic slots:\n    //! Play the macro.\n    virtual void play();\n\n    //! Start recording user commands and add them to the macro.\n    virtual void startRecording();\n\n    //! Stop recording user commands.\n    virtual void endRecording();\n\nprivate slots:\n    void record(unsigned int msg, unsigned long wParam, void *lParam);\n\nprivate:\n    struct Macro {\n        unsigned int msg;\n        unsigned long wParam;\n        QByteArray text;\n    };\n\n    QsciScintilla *qsci;\n    QList<Macro> macro;\n\n    QsciMacro(const QsciMacro &);\n    QsciMacro &operator=(const QsciMacro &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciprinter.h",
    "content": "// This module defines interface to the QsciPrinter class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCIPRINTER_H\n#define QSCIPRINTER_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n// This is needed for Qt v5.0.0-alpha.\n#if defined(B0)\n#undef B0\n#endif\n\n#include <qprinter.h>\n\n#if !defined(QT_NO_PRINTER)\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qsciscintilla.h>\n\n\nQT_BEGIN_NAMESPACE\nclass QRect;\nclass QPainter;\nQT_END_NAMESPACE\n\nclass QsciScintillaBase;\n\n\n//! \\brief The QsciPrinter class is a sub-class of the Qt QPrinter class that\n//! is able to print the text of a Scintilla document.\n//!\n//! The class can be further sub-classed to alter to layout of the text, adding\n//! headers and footers for example.\nclass QSCINTILLA_EXPORT QsciPrinter : public QPrinter\n{\npublic:\n    //! Constructs a printer paint device with mode \\a mode.\n    QsciPrinter(PrinterMode mode = ScreenResolution);\n\n    //! Destroys the QsciPrinter instance.\n    virtual ~QsciPrinter();\n\n    //! Format a page, by adding headers and footers for example, before the\n    //! document text is drawn on it.  \\a painter is the painter to be used to\n    //! add customised text and graphics.  \\a drawing is true if the page is\n    //! actually being drawn rather than being sized.  \\a painter drawing\n    //! methods must only be called when \\a drawing is true.  \\a area is the\n    //! area of the page that will be used to draw the text.  This should be\n    //! modified if it is necessary to reserve space for any customised text or\n    //! graphics.  By default the area is relative to the printable area of the\n    //! page.  Use QPrinter::setFullPage() because calling printRange() if you\n    //! want to try and print over the whole page.  \\a pagenr is the number of\n    //! the page.  The first page is numbered 1.\n    virtual void formatPage(QPainter &painter, bool drawing, QRect &area,\n            int pagenr);\n\n    //! Return the number of points to add to each font when printing.\n    //!\n    //! \\sa setMagnification()\n    int magnification() const {return mag;}\n\n    //! Sets the number of points to add to each font when printing to \\a\n    //! magnification.\n    //!\n    //! \\sa magnification()\n    virtual void setMagnification(int magnification);\n\n    //! Print a range of lines from the Scintilla instance \\a qsb.  \\a from is\n    //! the first line to print and a negative value signifies the first line\n    //! of text.  \\a to is the last line to print and a negative value\n    //! signifies the last line of text.  true is returned if there was no\n    //! error.\n    virtual int printRange(QsciScintillaBase *qsb, int from = -1, int to = -1);\n\n    //! Return the line wrap mode used when printing.  The default is\n    //! QsciScintilla::WrapWord.\n    //!\n    //! \\sa setWrapMode()\n    QsciScintilla::WrapMode wrapMode() const {return wrap;}\n\n    //! Sets the line wrap mode used when printing to \\a wmode.\n    //!\n    //! \\sa wrapMode()\n    virtual void setWrapMode(QsciScintilla::WrapMode wmode);\n\nprivate:\n    int mag;\n    QsciScintilla::WrapMode wrap;\n\n    QsciPrinter(const QsciPrinter &);\n    QsciPrinter &operator=(const QsciPrinter &);\n};\n\n#endif\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciscintilla.h",
    "content": "// This module defines the \"official\" high-level API of the Qt port of\n// Scintilla.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCISCINTILLA_H\n#define QSCISCINTILLA_H\n\n/*---OPENCOR---\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n*/\n\n#include <qobject.h>\n#include <qstringlist.h>\n\n#include <QByteArray>\n#include <QList>\n#include <QPointer>\n\n#include <Qsci/qsciglobal.h>\n#include <Qsci/qscicommand.h>\n#include <Qsci/qscidocument.h>\n#include <Qsci/qsciscintillabase.h>\n\n\nQT_BEGIN_NAMESPACE\nclass QAction;\nclass QImage;\nclass QIODevice;\nclass QMenu;\nclass QPoint;\nQT_END_NAMESPACE\n\nclass QsciCommandSet;\nclass QsciLexer;\nclass QsciStyle;\nclass QsciStyledText;\nclass QsciListBoxQt;\n\n\n//! \\brief The QsciScintilla class implements a higher level, more Qt-like,\n//! API to the Scintilla editor widget.\n//!\n//! QsciScintilla implements methods, signals and slots similar to those found\n//! in other Qt editor classes. It also provides a higher level interface to\n//! features specific to Scintilla such as syntax styling, call tips,\n//! auto-indenting and auto-completion than that provided by QsciScintillaBase.\nclass QSCINTILLA_EXPORT QsciScintilla : public QsciScintillaBase\n{\n    Q_OBJECT\n\npublic:\n    //! This enum defines the different auto-indentation styles.\n    enum {\n        //! A line is automatically indented to match the previous line.\n        AiMaintain = 0x01,\n\n        //! If the language supported by the current lexer has a specific start\n        //! of block character (e.g. { in C++), then a line that begins with\n        //! that character is indented as well as the lines that make up the\n        //! block.  It may be logically ored with AiClosing.\n        AiOpening = 0x02,\n\n        //! If the language supported by the current lexer has a specific end\n        //! of block character (e.g. } in C++), then a line that begins with\n        //! that character is indented as well as the lines that make up the\n        //! block.  It may be logically ored with AiOpening.\n        AiClosing = 0x04\n    };\n\n    //! This enum defines the different annotation display styles.\n    enum AnnotationDisplay {\n        //! Annotations are not displayed.\n        AnnotationHidden = ANNOTATION_HIDDEN,\n\n        //! Annotations are drawn left justified with no adornment.\n        AnnotationStandard = ANNOTATION_STANDARD,\n\n        //! Annotations are surrounded by a box.\n        AnnotationBoxed = ANNOTATION_BOXED\n    };\n\n    //! This enum defines the behavior if an auto-completion list contains a\n    //! single entry.\n    enum AutoCompletionUseSingle {\n        //! The single entry is not used automatically and the auto-completion\n        //! list is displayed.\n        AcusNever,\n\n        //! The single entry is used automatically when auto-completion is\n        //! explicitly requested (using autoCompleteFromAPIs() or\n        //! autoCompleteFromDocument()) but not when auto-completion is\n        //! triggered as the user types.\n        AcusExplicit,\n\n        //! The single entry is used automatically and the auto-completion list\n        //! is not displayed.\n        AcusAlways\n    };\n\n    //! This enum defines the different sources for auto-completion lists.\n    enum AutoCompletionSource {\n        //! No sources are used, ie. automatic auto-completion is disabled.\n        AcsNone,\n\n        //! The source is all available sources.\n        AcsAll,\n\n        //! The source is the current document.\n        AcsDocument,\n\n        //! The source is any installed APIs.\n        AcsAPIs\n    };\n\n    //! This enum defines the different brace matching modes.  The character\n    //! pairs {}, [] and () are treated as braces.  The Python lexer will also\n    //! match a : with the end of the corresponding indented block.\n    enum BraceMatch {\n        //! Brace matching is disabled.\n        NoBraceMatch,\n\n        //! Brace matching is enabled for a brace immediately before the\n        //! current position.\n        StrictBraceMatch,\n\n        //! Brace matching is enabled for a brace immediately before or after\n        //! the current position.\n        SloppyBraceMatch\n    };\n\n    //! This enum defines the different call tip positions.\n    enum CallTipsPosition {\n        //! Call tips are placed below the text.\n        CallTipsBelowText,\n\n        //! Call tips are placed above the text.\n        CallTipsAboveText,\n    };\n\n    //! This enum defines the different call tip styles.\n    enum CallTipsStyle {\n        //! Call tips are disabled.\n        CallTipsNone,\n\n        //! Call tips are displayed without a context.  A context is any scope\n        //! (e.g. a C++ namespace or a Python module) prior to the function\n        //! name.\n        CallTipsNoContext,\n\n        //! Call tips are displayed with a context only if the user hasn't\n        //! already implicitly identified the context using autocompletion.\n        //! Note that this style may not always be able to align the call tip\n        //! with the text being entered.\n        CallTipsNoAutoCompletionContext,\n\n        //! Call tips are displayed with a context.  Note that this style\n        //! may not always be able to align the call tip with the text being\n        //! entered.\n        CallTipsContext\n    };\n\n    //! This enum defines the different edge modes for long lines.\n    enum EdgeMode {\n        //! Long lines are not marked.\n        EdgeNone = EDGE_NONE,\n\n        //! A vertical line is drawn at the column set by setEdgeColumn().\n        //! This is recommended for monospace fonts.\n        EdgeLine = EDGE_LINE,\n\n        //! The background color of characters after the column limit is\n        //! changed to the color set by setEdgeColor().  This is recommended\n        //! for proportional fonts.\n        EdgeBackground = EDGE_BACKGROUND\n    };\n\n    //! This enum defines the different end-of-line modes.\n    enum EolMode {\n        //! A carriage return/line feed as used on Windows systems.\n        EolWindows = SC_EOL_CRLF,\n\n        //! A line feed as used on Unix systems, including OS/X.\n        EolUnix = SC_EOL_LF,\n\n        //! A carriage return as used on Mac systems prior to OS/X.\n        EolMac = SC_EOL_CR\n    };\n\n    //! This enum defines the different styles for the folding margin.\n    enum FoldStyle {\n        //! Folding is disabled.\n        NoFoldStyle,\n\n        //! Plain folding style using plus and minus symbols.\n        PlainFoldStyle,\n\n        //! Circled folding style using circled plus and minus symbols.\n        CircledFoldStyle,\n\n        //! Boxed folding style using boxed plus and minus symbols.\n        BoxedFoldStyle,\n\n        //! Circled tree style using a flattened tree with circled plus and\n        //! minus symbols and rounded corners.\n        CircledTreeFoldStyle,\n\n        //! Boxed tree style using a flattened tree with boxed plus and minus\n        //! symbols and right-angled corners.\n        BoxedTreeFoldStyle\n    };\n\n    //! This enum defines the different indicator styles.\n    enum IndicatorStyle {\n        //! A single straight underline.\n        PlainIndicator = INDIC_PLAIN,\n\n        //! A squiggly underline that requires 3 pixels of descender space.\n        SquiggleIndicator = INDIC_SQUIGGLE,\n\n        //! A line of small T shapes.\n        TTIndicator = INDIC_TT,\n\n        //! Diagonal hatching.\n        DiagonalIndicator = INDIC_DIAGONAL,\n\n        //! Strike out.\n        StrikeIndicator = INDIC_STRIKE,\n\n        //! An indicator with no visual appearence.\n        HiddenIndicator = INDIC_HIDDEN,\n\n        //! A rectangle around the text.\n        BoxIndicator = INDIC_BOX,\n\n        //! A rectangle with rounded corners around the text with the interior\n        //! usually more transparent than the border.\n        RoundBoxIndicator = INDIC_ROUNDBOX,\n\n        //! A rectangle around the text with the interior usually more\n        //! transparent than the border.\n        StraightBoxIndicator = INDIC_STRAIGHTBOX,\n\n        //! A dashed underline.\n        DashesIndicator = INDIC_DASH,\n\n        //! A dotted underline.\n        DotsIndicator = INDIC_DOTS,\n\n        //! A squiggly underline that requires 2 pixels of descender space and\n        //! so will fit under smaller fonts.\n        SquiggleLowIndicator = INDIC_SQUIGGLELOW,\n\n        //! A dotted rectangle around the text with the interior usually more\n        //! transparent than the border.\n        DotBoxIndicator = INDIC_DOTBOX,\n\n        //! A version of SquiggleIndicator that uses a pixmap.  This is quicker\n        //! but may be of lower quality.\n        SquigglePixmapIndicator = INDIC_SQUIGGLEPIXMAP,\n\n        //! A thick underline typically used during Asian language input\n        //! composition.\n        ThickCompositionIndicator = INDIC_COMPOSITIONTHICK,\n    };\n\n    //! This enum defines the different margin options.\n    enum {\n        //! Reset all margin options.\n        MoNone = SC_MARGINOPTION_NONE,\n\n        //! If this is set then only the first sub-line of a wrapped line will\n        //! be selected when clicking on a margin.\n        MoSublineSelect = SC_MARGINOPTION_SUBLINESELECT\n    };\n\n    //! This enum defines the different margin types.\n    enum MarginType {\n        //! The margin contains symbols, including those used for folding.\n        SymbolMargin = SC_MARGIN_SYMBOL,\n\n        //! The margin contains symbols and uses the default foreground color\n        //! as its background color.\n        SymbolMarginDefaultForegroundColor = SC_MARGIN_FORE,\n\n        //! The margin contains symbols and uses the default background color\n        //! as its background color.\n        SymbolMarginDefaultBackgroundColor = SC_MARGIN_BACK,\n\n        //! The margin contains line numbers.\n        NumberMargin = SC_MARGIN_NUMBER,\n\n        //! The margin contains styled text.\n        TextMargin = SC_MARGIN_TEXT,\n\n        //! The margin contains right justified styled text.\n        TextMarginRightJustified = SC_MARGIN_RTEXT\n    };\n\n    //! This enum defines the different pre-defined marker symbols.\n    enum MarkerSymbol {\n        //! A circle.\n        Circle = SC_MARK_CIRCLE,\n\n        //! A rectangle.\n        Rectangle = SC_MARK_ROUNDRECT,\n\n        //! A triangle pointing to the right.\n        RightTriangle = SC_MARK_ARROW,\n\n        //! A smaller rectangle.\n        SmallRectangle = SC_MARK_SMALLRECT,\n\n        //! An arrow pointing to the right.\n        RightArrow = SC_MARK_SHORTARROW,\n\n        //! An invisible marker that allows code to track the movement\n        //! of lines.\n        Invisible = SC_MARK_EMPTY,\n\n        //! A triangle pointing down.\n        DownTriangle = SC_MARK_ARROWDOWN,\n\n        //! A drawn minus sign.\n        Minus = SC_MARK_MINUS,\n\n        //! A drawn plus sign.\n        Plus = SC_MARK_PLUS,\n\n        //! A vertical line drawn in the background colour.\n        VerticalLine = SC_MARK_VLINE,\n\n        //! A bottom left corner drawn in the background colour.\n        BottomLeftCorner = SC_MARK_LCORNER,\n\n        //! A vertical line with a centre right horizontal line drawn\n        //! in the background colour.\n        LeftSideSplitter = SC_MARK_TCORNER,\n\n        //! A drawn plus sign in a box.\n        BoxedPlus = SC_MARK_BOXPLUS,\n\n        //! A drawn plus sign in a connected box.\n        BoxedPlusConnected = SC_MARK_BOXPLUSCONNECTED,\n\n        //! A drawn minus sign in a box.\n        BoxedMinus = SC_MARK_BOXMINUS,\n\n        //! A drawn minus sign in a connected box.\n        BoxedMinusConnected = SC_MARK_BOXMINUSCONNECTED,\n\n        //! A rounded bottom left corner drawn in the background\n        //! colour.\n        RoundedBottomLeftCorner = SC_MARK_LCORNERCURVE,\n\n        //! A vertical line with a centre right curved line drawn in the\n        //! background colour.\n        LeftSideRoundedSplitter = SC_MARK_TCORNERCURVE,\n\n        //! A drawn plus sign in a circle.\n        CircledPlus = SC_MARK_CIRCLEPLUS,\n\n        //! A drawn plus sign in a connected box.\n        CircledPlusConnected = SC_MARK_CIRCLEPLUSCONNECTED,\n\n        //! A drawn minus sign in a circle.\n        CircledMinus = SC_MARK_CIRCLEMINUS,\n\n        //! A drawn minus sign in a connected circle.\n        CircledMinusConnected = SC_MARK_CIRCLEMINUSCONNECTED,\n\n        //! No symbol is drawn but the line is drawn with the same background\n        //! color as the marker's.\n        Background = SC_MARK_BACKGROUND,\n\n        //! Three drawn dots.\n        ThreeDots = SC_MARK_DOTDOTDOT,\n\n        //! Three drawn arrows pointing right.\n        ThreeRightArrows = SC_MARK_ARROWS,\n\n        //! A full rectangle (ie. the margin background) using the marker's\n        //! background color.\n        FullRectangle = SC_MARK_FULLRECT,\n\n        //! A left rectangle (ie. the left part of the margin background) using\n        //! the marker's background color.\n        LeftRectangle = SC_MARK_LEFTRECT,\n\n        //! No symbol is drawn but the line is drawn underlined using the\n        //! marker's background color.\n        Underline = SC_MARK_UNDERLINE\n    };\n\n    //! This enum defines the different whitespace visibility modes.  When\n    //! whitespace is visible spaces are displayed as small centred dots and\n    //! tabs are displayed as light arrows pointing to the right.\n    enum WhitespaceVisibility {\n        //! Whitespace is invisible.\n        WsInvisible = SCWS_INVISIBLE,\n\n        //! Whitespace is always visible.\n        WsVisible = SCWS_VISIBLEALWAYS,\n\n        //! Whitespace is visible after the whitespace used for indentation.\n        WsVisibleAfterIndent = SCWS_VISIBLEAFTERINDENT\n    };\n\n    //! This enum defines the different line wrap modes.\n    enum WrapMode {\n        //! Lines are not wrapped.\n        WrapNone = SC_WRAP_NONE,\n\n        //! Lines are wrapped at word boundaries.\n        WrapWord = SC_WRAP_WORD,\n\n        //! Lines are wrapped at character boundaries.\n        WrapCharacter = SC_WRAP_CHAR\n    };\n\n    //! This enum defines the different line wrap visual flags.\n    enum WrapVisualFlag {\n        //! No wrap flag is displayed.\n        WrapFlagNone,\n\n        //! A wrap flag is displayed by the text.\n        WrapFlagByText,\n\n        //! A wrap flag is displayed by the border.\n        WrapFlagByBorder,\n\n        //! A wrap flag is displayed in the line number margin.\n        WrapFlagInMargin\n    };\n\n    //! This enum defines the different line wrap indentation modes.\n    enum WrapIndentMode {\n        //! Wrapped sub-lines are indented by the amount set by\n        //! setWrapVisualFlags().\n        WrapIndentFixed = SC_WRAPINDENT_FIXED,\n\n        //! Wrapped sub-lines are indented by the same amount as the first\n        //! sub-line.\n        WrapIndentSame = SC_WRAPINDENT_SAME,\n\n        //! Wrapped sub-lines are indented by the same amount as the first\n        //! sub-line plus one more level of indentation.\n        WrapIndentIndented = SC_WRAPINDENT_INDENT\n    };\n\n    //! Construct an empty QsciScintilla with parent \\a parent.\n    QsciScintilla(QWidget *parent = 0);\n\n    //! Destroys the QsciScintilla instance.\n    virtual ~QsciScintilla();\n\n    //! Returns the API context, which is a list of words, before the position\n    //! \\a pos in the document.  The context can be used by auto-completion and\n    //! call tips to help to identify which API call the user is referring to.\n    //! In the default implementation the current lexer determines what\n    //! characters make up a word, and what characters determine the boundaries\n    //! of words (ie. the start characters).  If there is no current lexer then\n    //! the context will consist of a single word.  On return \\a context_start\n    //! will contain the position in the document of the start of the context\n    //! and \\a last_word_start will contain the position in the document of the\n    //! start of the last word of the context.\n    virtual QStringList apiContext(int pos, int &context_start,\n            int &last_word_start);\n\n    //! Annotate the line \\a line with the text \\a text using the style number\n    //! \\a style.\n    void annotate(int line, const QString &text, int style);\n\n    //! Annotate the line \\a line with the text \\a text using the style \\a\n    //! style.\n    void annotate(int line, const QString &text, const QsciStyle &style);\n\n    //! Annotate the line \\a line with the styled text \\a text.\n    void annotate(int line, const QsciStyledText &text);\n\n    //! Annotate the line \\a line with the list of styled text \\a text.\n    void annotate(int line, const QList<QsciStyledText> &text);\n\n    //! Returns the annotation on line \\a line, if any.\n    QString annotation(int line) const;\n\n    //! Returns the display style for annotations.\n    //!\n    //! \\sa setAnnotationDisplay()\n    AnnotationDisplay annotationDisplay() const;\n\n    //! The annotations on line \\a line are removed.  If \\a line is negative\n    //! then all annotations are removed.\n    void clearAnnotations(int line = -1);\n\n    //! Returns true if auto-completion lists are case sensitive.\n    //!\n    //! \\sa setAutoCompletionCaseSensitivity()\n    bool autoCompletionCaseSensitivity() const;\n\n    //! Returns true if auto-completion fill-up characters are enabled.\n    //!\n    //! \\sa setAutoCompletionFillups(), setAutoCompletionFillupsEnabled()\n    bool autoCompletionFillupsEnabled() const;\n\n    //! Returns true if the rest of the word to the right of the current cursor\n    //! is removed when an item from an auto-completion list is selected.\n    //!\n    //! \\sa setAutoCompletionReplaceWord()\n    bool autoCompletionReplaceWord() const;\n\n    //! Returns true if the only item in an auto-completion list with a single\n    //! entry is automatically used and the list not displayed.  Note that this\n    //! is deprecated and autoCompletionUseSingle() should be used instead.\n    //!\n    //! \\sa setAutoCompletionShowSingle()\n    bool autoCompletionShowSingle() const;\n\n    //! Returns the current source for the auto-completion list when it is\n    //! being displayed automatically as the user types.\n    //!\n    //! \\sa setAutoCompletionSource()\n    AutoCompletionSource autoCompletionSource() const {return acSource;}\n\n    //! Returns the current threshold for the automatic display of the\n    //! auto-completion list as the user types.\n    //!\n    //! \\sa setAutoCompletionThreshold()\n    int autoCompletionThreshold() const {return acThresh;}\n\n    //! Returns the current behavior when an auto-completion list contains a\n    //! single entry.\n    //!\n    //! \\sa setAutoCompletionUseSingle()\n    AutoCompletionUseSingle autoCompletionUseSingle() const;\n\n    //! Returns true if auto-indentation is enabled.\n    //!\n    //! \\sa setAutoIndent()\n    bool autoIndent() const {return autoInd;}\n\n    //! Returns true if the backspace key unindents a line instead of deleting\n    //! a character.  The default is false.\n    //!\n    //! \\sa setBackspaceUnindents(), tabIndents(), setTabIndents()\n    bool backspaceUnindents() const;\n\n    //! Mark the beginning of a sequence of actions that can be undone by a\n    //! single call to undo().\n    //!\n    //! \\sa endUndoAction(), undo()\n    void beginUndoAction();\n\n    //! Returns the brace matching mode.\n    //!\n    //! \\sa setBraceMatching()\n    BraceMatch braceMatching() const {return braceMode;}\n\n    //! Returns the current call tip position.\n    //!\n    //! \\sa setCallTipsPosition()\n    CallTipsPosition callTipsPosition() const {return call_tips_position;}\n\n    //! Returns the current call tip style.\n    //!\n    //! \\sa setCallTipsStyle()\n    CallTipsStyle callTipsStyle() const {return call_tips_style;}\n\n    //! Returns the maximum number of call tips that are displayed.\n    //!\n    //! \\sa setCallTipsVisible()\n    int callTipsVisible() const {return maxCallTips;}\n\n    //! Cancel any current auto-completion or user defined list.\n    void cancelList();\n\n    //! Returns true if the current language lexer is case sensitive.  If there\n    //! is no current lexer then true is returned.\n    bool caseSensitive() const;\n\n    //! Clear all current folds, i.e. ensure that all lines are displayed\n    //! unfolded.\n    //!\n    //! \\sa setFolding()\n    void clearFolds();\n\n    //! Clears the range of text with indicator \\a indicatorNumber starting at\n    //! position \\a indexFrom in line \\a lineFrom and finishing at position\n    //! \\a indexTo in line \\a lineTo.\n    //!\n    //! \\sa fillIndicatorRange()\n    void clearIndicatorRange(int lineFrom, int indexFrom, int lineTo,\n            int indexTo, int indicatorNumber);\n\n    //! Clear all registered images.\n    //!\n    //! \\sa registerImage()\n    void clearRegisteredImages();\n\n    //! Returns the widget's text (ie. foreground) colour.\n    //!\n    //! \\sa setColor()\n    QColor color() const;\n\n    //! Returns a list of the line numbers that have contracted folds.  This is\n    //! typically used to save the fold state of a document.\n    //!\n    //! \\sa setContractedFolds()\n    QList<int> contractedFolds() const;\n\n    //! All the lines of the text have their end-of-lines converted to mode\n    //! \\a mode.\n    //!\n    //! \\sa eolMode(), setEolMode()\n    void convertEols(EolMode mode);\n\n    //! Create the standard context menu which is shown when the user clicks\n    //! with the right mouse button.  It is called from contextMenuEvent().\n    //! The menu's ownership is transferred to the caller.\n    QMenu *createStandardContextMenu();\n\n    //! Returns the attached document.\n    //!\n    //! \\sa setDocument()\n    QsciDocument document() const {return doc;}\n\n    //! Mark the end of a sequence of actions that can be undone by a single\n    //! call to undo().\n    //!\n    //! \\sa beginUndoAction(), undo()\n    void endUndoAction();\n\n    //! Returns the color of the marker used to show that a line has exceeded\n    //! the length set by setEdgeColumn().\n    //!\n    //! \\sa setEdgeColor(), \\sa setEdgeColumn\n    QColor edgeColor() const;\n\n    //! Returns the number of the column after which lines are considered to be\n    //! long.\n    //!\n    //! \\sa setEdgeColumn()\n    int edgeColumn() const;\n\n    //! Returns the edge mode which determines how long lines are marked.\n    //!\n    //! \\sa setEdgeMode()\n    EdgeMode edgeMode() const;\n\n    //! Set the default font.  This has no effect if a language lexer has been\n    //! set.\n    void setFont(const QFont &f);\n\n    //! Returns the end-of-line mode.\n    //!\n    //! \\sa setEolMode()\n    EolMode eolMode() const;\n\n    //! Returns the visibility of end-of-lines.\n    //!\n    //! \\sa setEolVisibility()\n    bool eolVisibility() const;\n\n    //! Returns the extra space added to the height of a line above the\n    //! baseline of the text.\n    //!\n    //! \\sa setExtraAscent(), extraDescent()\n    int extraAscent() const;\n\n    //! Returns the extra space added to the height of a line below the\n    //! baseline of the text.\n    //!\n    //! \\sa setExtraDescent(), extraAscent()\n    int extraDescent() const;\n\n    //! Fills the range of text with indicator \\a indicatorNumber starting at\n    //! position \\a indexFrom in line \\a lineFrom and finishing at position\n    //! \\a indexTo in line \\a lineTo.\n    //!\n    //! \\sa clearIndicatorRange()\n    void fillIndicatorRange(int lineFrom, int indexFrom, int lineTo,\n            int indexTo, int indicatorNumber);\n\n    //! Find the first occurrence of the string \\a expr and return true if\n    //! \\a expr was found, otherwise returns false.  If \\a expr is found it\n    //! becomes the current selection.\n    //!\n    //! If \\a re is true then \\a expr is interpreted as a regular expression\n    //! rather than a simple string.\n    //!\n    //! If \\a cs is true then the search is case sensitive.\n    //!\n    //! If \\a wo is true then the search looks for whole word matches only,\n    //! otherwise it searches for any matching text.\n    //!\n    //! If \\a wrap is true then the search wraps around the end of the text.\n    //!\n    //! If \\a forward is true (the default) then the search is forward from the\n    //! starting position to the end of the text, otherwise it is backwards to\n    //! the beginning of the text. \n    //!\n    //! If either \\a line or \\a index are negative (the default) then the\n    //! search begins from the current cursor position.  Otherwise the search\n    //! begins at position \\a index of line \\a line.\n    //!\n    //! If \\a show is true (the default) then any text found is made visible\n    //! (ie. it is unfolded).\n    //!\n    //! If \\a posix is true then a regular expression is treated in a more\n    //! POSIX compatible manner by interpreting bare ( and ) as tagged sections\n    //! rather than \\( and \\).\n    //!\n    //! \\sa findFirstInSelection(), findNext(), replace()\n    virtual bool findFirst(const QString &expr, bool re, bool cs, bool wo,\n            bool wrap, bool forward = true, int line = -1, int index = -1,\n            bool show = true, bool posix = false);\n\n    //! Find the first occurrence of the string \\a expr in the current\n    //! selection and return true if \\a expr was found, otherwise returns\n    //! false.  If \\a expr is found it becomes the current selection.  The\n    //! original selection is restored when a subsequent call to findNext()\n    //! returns false.\n    //!\n    //! If \\a re is true then \\a expr is interpreted as a regular expression\n    //! rather than a simple string.\n    //!\n    //! If \\a cs is true then the search is case sensitive.\n    //!\n    //! If \\a wo is true then the search looks for whole word matches only,\n    //! otherwise it searches for any matching text.\n    //!\n    //! If \\a forward is true (the default) then the search is forward from the\n    //! start to the end of the selection, otherwise it is backwards from the\n    //! end to the start of the selection.\n    //!\n    //! If \\a show is true (the default) then any text found is made visible\n    //! (ie. it is unfolded).\n    //!\n    //! If \\a posix is true then a regular expression is treated in a more\n    //! POSIX compatible manner by interpreting bare ( and ) as tagged sections\n    //! rather than \\( and \\).\n    //!\n    //! \\sa findFirstInSelection(), findNext(), replace()\n    virtual bool findFirstInSelection(const QString &expr, bool re, bool cs,\n            bool wo, bool forward = true, bool show = true,\n            bool posix = false);\n\n    //! Find the next occurence of the string found using findFirst() or\n    //! findFirstInSelection().\n    //!\n    //! \\sa findFirst(), findFirstInSelection(), replace()\n    virtual bool findNext();\n\n    //! Returns the number of the first visible line.\n    //!\n    //! \\sa setFirstVisibleLine()\n    int firstVisibleLine() const;\n\n    //! Returns the current folding style.\n    //!\n    //! \\sa setFolding()\n    FoldStyle folding() const {return fold;}\n\n    //! Sets \\a *line and \\a *index to the line and index of the cursor.\n    //!\n    //! \\sa setCursorPosition()\n    void getCursorPosition(int *line, int *index) const;\n\n    //! If there is a selection, \\a *lineFrom is set to the line number in\n    //! which the selection begins and \\a *lineTo is set to the line number in\n    //! which the selection ends.  (They could be the same.)  \\a *indexFrom is\n    //! set to the index at which the selection begins within \\a *lineFrom, and\n    //! \\a *indexTo is set to the index at which the selection ends within\n    //! \\a *lineTo.  If there is no selection, \\a *lineFrom, \\a *indexFrom,\n    //! \\a *lineTo and \\a *indexTo are all set to -1. \n    //!\n    //! \\sa setSelection()\n    void getSelection(int *lineFrom, int *indexFrom, int *lineTo,\n            int *indexTo) const;\n\n    //! Returns true if some text is selected.\n    //!\n    //! \\sa selectedText()\n    bool hasSelectedText() const {return selText;}\n\n    //! Returns the number of characters that line \\a line is indented by.\n    //!\n    //! \\sa setIndentation()\n    int indentation(int line) const;\n\n    //! Returns true if the display of indentation guides is enabled.\n    //!\n    //! \\sa setIndentationGuides()\n    bool indentationGuides() const;\n\n    //! Returns true if indentations are created using tabs and spaces, rather\n    //! than just spaces.  The default is true.\n    //!\n    //! \\sa setIndentationsUseTabs()\n    bool indentationsUseTabs() const;\n\n    //! Returns the indentation width in characters.  The default is 0 which\n    //! means that the value returned by tabWidth() is actually used.\n    //!\n    //! \\sa setIndentationWidth(), tabWidth()\n    int indentationWidth() const;\n\n    //! Define a type of indicator using the style \\a style with the indicator\n    //! number \\a indicatorNumber.  If \\a indicatorNumber is -1 then the\n    //! indicator number is automatically allocated.  The indicator number is\n    //! returned or -1 if too many types of indicator have been defined.\n    //!\n    //! Indicators are used to display additional information over the top of\n    //! styling.  They can be used to show, for example, syntax errors,\n    //! deprecated names and bad indentation by drawing lines under text or\n    //! boxes around text.\n    //!\n    //! There may be up to 32 types of indicator defined at a time.  The first\n    //! 8 are normally used by lexers.  By default indicator number 0 is a\n    //! dark green SquiggleIndicator, 1 is a blue TTIndicator, and 2 is a red\n    //! PlainIndicator.\n    int indicatorDefine(IndicatorStyle style, int indicatorNumber = -1);\n\n    //! Returns true if the indicator \\a indicatorNumber is drawn under the\n    //! text (i.e. in the background).  The default is false.\n    //!\n    //! \\sa setIndicatorDrawUnder()\n    bool indicatorDrawUnder(int indicatorNumber) const;\n\n    //! Returns true if a call tip is currently active.\n    bool isCallTipActive() const;\n\n    //! Returns true if an auto-completion or user defined list is currently\n    //! active.\n    bool isListActive() const;\n\n    //! Returns true if the text has been modified.\n    //!\n    //! \\sa setModified(), modificationChanged()\n    bool isModified() const;\n\n    //! Returns true if the text edit is read-only.\n    //!\n    //! \\sa setReadOnly()\n    bool isReadOnly() const;\n\n    //! Returns true if there is something that can be redone.\n    //!\n    //! \\sa redo()\n    bool isRedoAvailable() const;\n\n    //! Returns true if there is something that can be undone.\n    //!\n    //! \\sa undo()\n    bool isUndoAvailable() const;\n\n    //! Returns true if text is interpreted as being UTF8 encoded.  The default\n    //! is to interpret the text as Latin1 encoded.\n    //!\n    //! \\sa setUtf8()\n    bool isUtf8() const;\n\n    //! Returns true if character \\a ch is a valid word character.\n    //!\n    //! \\sa wordCharacters()\n    bool isWordCharacter(char ch) const;\n\n    //! Returns the line which is at \\a point pixel coordinates or -1 if there\n    //! is no line at that point.\n    int lineAt(const QPoint &point) const;\n\n    //! QScintilla uses the combination of a line number and a character index\n    //! from the start of that line to specify the position of a character\n    //! within the text.  The underlying Scintilla instead uses a byte index\n    //! from the start of the text.  This will convert the \\a position byte\n    //! index to the \\a *line line number and \\a *index character index.\n    //!\n    //! \\sa positionFromLineIndex()\n    void lineIndexFromPosition(int position, int *line, int *index) const;\n\n    //! Returns the length of line \\a line int bytes or -1 if there is no such\n    //! line.  In order to get the length in characters use text(line).length().\n    int lineLength(int line) const;\n\n    //! Returns the number of lines of text.\n    int lines() const;\n\n    //! Returns the length of the text edit's text in bytes.  In order to get\n    //! the length in characters use text().length().\n    int length() const;\n\n    //! Returns the current language lexer used to style text.  If it is 0 then\n    //! syntax styling is disabled.\n    //!\n    //! \\sa setLexer()\n    QsciLexer *lexer() const;\n\n    //! Returns true if line numbers are enabled for margin \\a margin.\n    //!\n    //! \\sa setMarginLineNumbers(), marginType(), SCI_GETMARGINTYPEN\n    bool marginLineNumbers(int margin) const;\n\n    //! Returns the marker mask of margin \\a margin.\n    //!\n    //! \\sa setMarginMask(), QsciMarker, SCI_GETMARGINMASKN\n    int marginMarkerMask(int margin) const;\n\n    //! Returns the margin options.  The default is MoNone.\n    //!\n    //! \\sa setMarginOptions(), MoNone, MoSublineSelect.\n    int marginOptions() const;\n\n    //! Returns true if margin \\a margin is sensitive to mouse clicks.\n    //!\n    //! \\sa setMarginSensitivity(), marginClicked(), SCI_GETMARGINTYPEN\n    bool marginSensitivity(int margin) const;\n\n    //! Returns the type of margin \\a margin.\n    //!\n    //! \\sa setMarginType(), SCI_GETMARGINTYPEN\n    MarginType marginType(int margin) const;\n\n    //! Returns the width in pixels of margin \\a margin.\n    //!\n    //! \\sa setMarginWidth(), SCI_GETMARGINWIDTHN\n    int marginWidth(int margin) const;\n\n    //! Define a type of marker using the symbol \\a sym with the marker number\n    //! \\a markerNumber.  If \\a markerNumber is -1 then the marker number is\n    //! automatically allocated.  The marker number is returned or -1 if too\n    //! many types of marker have been defined.\n    //!\n    //! Markers are small geometric symbols and characters used, for example,\n    //! to indicate the current line or, in debuggers, to indicate breakpoints.\n    //! If a margin has a width of 0 then its markers are not drawn, but their\n    //! background colours affect the background colour of the corresponding\n    //! line of text.\n    //!\n    //! There may be up to 32 types of marker defined at a time and each line\n    //! of text has a set of marker instances associated with it.  Markers are\n    //! drawn according to their numerical identifier.  Markers try to move\n    //! with their text by tracking where the start of their line moves to.\n    //! For example, when a line is deleted its markers are added to previous\n    //! line's markers.\n    //!\n    //! Each marker type is identified by a marker number.  Each instance of a\n    //! marker is identified by a marker handle.\n    int markerDefine(MarkerSymbol sym, int markerNumber = -1);\n\n    //! Define a marker using the character \\a ch with the marker number\n    //! \\a markerNumber.  If \\a markerNumber is -1 then the marker number is\n    //! automatically allocated.  The marker number is returned or -1 if too\n    //! many markers have been defined.\n    int markerDefine(char ch, int markerNumber = -1);\n\n    //! Define a marker using a copy of the pixmap \\a pm with the marker number\n    //! \\a markerNumber.  If \\a markerNumber is -1 then the marker number is\n    //! automatically allocated.  The marker number is returned or -1 if too\n    //! many markers have been defined.\n    int markerDefine(const QPixmap &pm, int markerNumber = -1);\n\n    //! Define a marker using a copy of the image \\a im with the marker number\n    //! \\a markerNumber.  If \\a markerNumber is -1 then the marker number is\n    //! automatically allocated.  The marker number is returned or -1 if too\n    //! many markers have been defined.\n    int markerDefine(const QImage &im, int markerNumber = -1);\n\n    //! Add an instance of marker number \\a markerNumber to line number\n    //! \\a linenr.  A handle for the marker is returned which can be used to\n    //! track the marker's position, or -1 if the \\a markerNumber was invalid.\n    //!\n    //! \\sa markerDelete(), markerDeleteAll(), markerDeleteHandle()\n    int markerAdd(int linenr, int markerNumber);\n\n    //! Returns the 32 bit mask of marker numbers at line number \\a linenr.\n    //!\n    //! \\sa markerAdd()\n    unsigned markersAtLine(int linenr) const;\n\n    //! Delete all markers with the marker number \\a markerNumber in the line\n    //! \\a linenr.  If \\a markerNumber is -1 then delete all markers from line\n    //! \\a linenr.\n    //!\n    //! \\sa markerAdd(), markerDeleteAll(), markerDeleteHandle()\n    void markerDelete(int linenr, int markerNumber = -1);\n\n    //! Delete the all markers with the marker number \\a markerNumber.  If\n    //! \\a markerNumber is -1 then delete all markers.\n    //!\n    //! \\sa markerAdd(), markerDelete(), markerDeleteHandle()\n    void markerDeleteAll(int markerNumber = -1);\n\n    //! Delete the the marker instance with the marker handle \\a mhandle.\n    //!\n    //! \\sa markerAdd(), markerDelete(), markerDeleteAll()\n    void markerDeleteHandle(int mhandle);\n\n    //! Return the line number that contains the marker instance with the\n    //! marker handle \\a mhandle.\n    int markerLine(int mhandle) const;\n\n    //! Return the number of the next line to contain at least one marker from\n    //! a 32 bit mask of markers.  \\a linenr is the line number to start the\n    //! search from.  \\a mask is the mask of markers to search for.\n    //!\n    //! \\sa markerFindPrevious()\n    int markerFindNext(int linenr, unsigned mask) const;\n\n    //! Return the number of the previous line to contain at least one marker\n    //! from a 32 bit mask of markers.  \\a linenr is the line number to start\n    //! the search from.  \\a mask is the mask of markers to search for.\n    //!\n    //! \\sa markerFindNext()\n    int markerFindPrevious(int linenr, unsigned mask) const;\n\n    //! Returns true if text entered by the user will overwrite existing text.\n    //!\n    //! \\sa setOverwriteMode()\n    bool overwriteMode() const;\n\n    //! Returns the widget's paper (ie. background) colour.\n    //!\n    //! \\sa setPaper()\n    QColor paper() const;\n\n    //! QScintilla uses the combination of a line number and a character index\n    //! from the start of that line to specify the position of a character\n    //! within the text.  The underlying Scintilla instead uses a byte index\n    //! from the start of the text.  This will return the byte index\n    //! corresponding to the \\a line line number and \\a index character index.\n    //!\n    //! \\sa lineIndexFromPosition()\n    int positionFromLineIndex(int line, int index) const;\n\n    //! Reads the current document from the \\a io device and returns true if\n    //! there was no error.\n    //!\n    //! \\sa write()\n    bool read(QIODevice *io);\n\n    //! Recolours the document between the \\a start and \\a end positions.\n    //! \\a start defaults to the start of the document and \\a end defaults to\n    //! the end of the document.\n    virtual void recolor(int start = 0, int end = -1);\n\n    //! Register an image \\a pm with ID \\a id.  Registered images can be\n    //! displayed in auto-completion lists.\n    //!\n    //! \\sa clearRegisteredImages(), QsciLexer::apiLoad()\n    void registerImage(int id, const QPixmap &pm);\n\n    //! Register an image \\a im with ID \\a id.  Registered images can be\n    //! displayed in auto-completion lists.\n    //!\n    //! \\sa clearRegisteredImages(), QsciLexer::apiLoad()\n    void registerImage(int id, const QImage &im);\n\n    //! Replace the current selection, set by a previous call to findFirst(),\n    //! findFirstInSelection() or findNext(), with \\a replaceStr.\n    //!\n    //! \\sa findFirst(), findFirstInSelection(), findNext()\n    virtual void replace(const QString &replaceStr);\n\n    //! Reset the fold margin colours to their defaults.\n    //!\n    //! \\sa setFoldMarginColors()\n    void resetFoldMarginColors();\n\n    //! Resets the background colour of an active hotspot area to the default.\n    //!\n    //! \\sa setHotspotBackgroundColor(), resetHotspotForegroundColor()\n    void resetHotspotBackgroundColor();\n\n    //! Resets the foreground colour of an active hotspot area to the default.\n    //!\n    //! \\sa setHotspotForegroundColor(), resetHotspotBackgroundColor()\n    void resetHotspotForegroundColor();\n\n    //! The fold margin may be drawn as a one pixel sized checkerboard pattern\n    //! of two colours, \\a fore and \\a back.\n    //!\n    //! \\sa resetFoldMarginColors()\n    void setFoldMarginColors(const QColor &fore, const QColor &back);\n\n    //! Set the display style for annotations.  The default is\n    //! AnnotationStandard.\n    //!\n    //! \\sa annotationDisplay()\n    void setAnnotationDisplay(AnnotationDisplay display);\n\n    //! Enable the use of fill-up characters, either those explicitly set or\n    //! those set by a lexer.  By default, fill-up characters are disabled.\n    //!\n    //! \\sa autoCompletionFillupsEnabled(), setAutoCompletionFillups()\n    void setAutoCompletionFillupsEnabled(bool enabled);\n\n    //! A fill-up character is one that, when entered while an auto-completion\n    //! list is being displayed, causes the currently selected item from the\n    //! list to be added to the text followed by the fill-up character.\n    //! \\a fillups is the set of fill-up characters.  If a language lexer has\n    //! been set then this is ignored and the lexer defines the fill-up\n    //! characters.  The default is that no fill-up characters are set.\n    //!\n    //! \\sa autoCompletionFillupsEnabled(), setAutoCompletionFillupsEnabled()\n    void setAutoCompletionFillups(const char *fillups);\n\n    //! A word separator is a sequence of characters that, when entered, causes\n    //! the auto-completion list to be displayed.  If a language lexer has been\n    //! set then this is ignored and the lexer defines the word separators.\n    //! The default is that no word separators are set.\n    //!\n    //! \\sa setAutoCompletionThreshold()\n    void setAutoCompletionWordSeparators(const QStringList &separators);\n\n    //! Set the background colour of call tips to \\a col.  The default is\n    //! white.\n    void setCallTipsBackgroundColor(const QColor &col);\n\n    //! Set the foreground colour of call tips to \\a col.  The default is\n    //! mid-gray.\n    void setCallTipsForegroundColor(const QColor &col);\n\n    //! Set the highlighted colour of call tip text to \\a col.  The default is\n    //! dark blue.\n    void setCallTipsHighlightColor(const QColor &col);\n\n    //! Set the current call tip position.  The default is CallTipsBelowText.\n    //!\n    //! \\sa callTipsPosition()\n    void setCallTipsPosition(CallTipsPosition position);\n\n    //! Set the current call tip style.  The default is CallTipsNoContext.\n    //!\n    //! \\sa callTipsStyle()\n    void setCallTipsStyle(CallTipsStyle style);\n\n    //! Set the maximum number of call tips that are displayed to \\a nr.  If\n    //! the maximum number is 0 then all applicable call tips are displayed.\n    //! If the maximum number is -1 then one call tip will be displayed with up\n    //! and down arrows that allow the use to scroll through the full list.\n    //! The default is -1.\n    //!\n    //! \\sa callTipsVisible()\n    void setCallTipsVisible(int nr);\n\n    //! Sets each line in the \\a folds list of line numbers to be a contracted\n    //! fold.  This is typically used to restore the fold state of a document.\n    //!\n    //! \\sa contractedFolds()\n    void setContractedFolds(const QList<int> &folds);\n\n    //! Attach the document \\a document, replacing the currently attached\n    //! document.\n    //!\n    //! \\sa document()\n    void setDocument(const QsciDocument &document);\n\n    //! Set the color of the marker used to show that a line has exceeded the\n    //! length set by setEdgeColumn().\n    //!\n    //! \\sa edgeColor(), \\sa setEdgeColumn\n    void setEdgeColor(const QColor &col);\n\n    //! Set the number of the column after which lines are considered to be\n    //! long.\n    //!\n    //! \\sa edgeColumn()\n    void setEdgeColumn(int colnr);\n\n    //! Set the edge mode which determines how long lines are marked.\n    //!\n    //! \\sa edgeMode()\n    void setEdgeMode(EdgeMode mode);\n\n    //! Set the number of the first visible line to \\a linenr.\n    //!\n    //! \\sa firstVisibleLine()\n    void setFirstVisibleLine(int linenr);\n\n    //! Enables or disables, according to \\a under, if the indicator\n    //! \\a indicatorNumber is drawn under or over the text (i.e. in the\n    //! background or foreground).  If \\a indicatorNumber is -1 then the state\n    //! of all indicators is set.\n    //!\n    //! \\sa indicatorDrawUnder()\n    void setIndicatorDrawUnder(bool under, int indicatorNumber = -1);\n\n    //! Set the foreground colour of indicator \\a indicatorNumber to \\a col.\n    //! If \\a indicatorNumber is -1 then the colour of all indicators is set.\n    void setIndicatorForegroundColor(const QColor &col, int indicatorNumber = -1);\n\n    //! Set the outline colour of indicator \\a indicatorNumber to \\a col.\n    //! If \\a indicatorNumber is -1 then the colour of all indicators is set.\n    //! At the moment only the alpha value of the colour has any affect.\n    void setIndicatorOutlineColor(const QColor &col, int indicatorNumber = -1);\n\n    //! Set the margin options to \\a options.\n    //!\n    //! \\sa marginOptions(), MoNone, MoSublineSelect.\n    void setMarginOptions(int options);\n\n    //! Set the margin text of line \\a line with the text \\a text using the\n    //! style number \\a style.\n    void setMarginText(int line, const QString &text, int style);\n\n    //! Set the margin text of line \\a line with the text \\a text using the\n    //! style \\a style.\n    void setMarginText(int line, const QString &text, const QsciStyle &style);\n\n    //! Set the margin text of line \\a line with the styled text \\a text.\n    void setMarginText(int line, const QsciStyledText &text);\n\n    //! Set the margin text of line \\a line with the list of styled text \\a\n    //! text.\n    void setMarginText(int line, const QList<QsciStyledText> &text);\n\n    //! Set the type of margin \\a margin to type \\a type.\n    //!\n    //! \\sa marginType(), SCI_SETMARGINTYPEN\n    void setMarginType(int margin, MarginType type);\n\n    //! The margin text on line \\a line is removed.  If \\a line is negative\n    //! then all margin text is removed.\n    void clearMarginText(int line = -1);\n\n    //! Set the background colour, including the alpha component, of marker\n    //! \\a markerNumber to \\a col.  If \\a markerNumber is -1 then the colour of\n    //! all markers is set.  The default is white.\n    //!\n    //! \\sa setMarkerForegroundColor()\n    void setMarkerBackgroundColor(const QColor &col, int markerNumber = -1);\n\n    //! Set the foreground colour of marker \\a markerNumber to \\a col.  If\n    //! \\a markerNumber is -1 then the colour of all markers is set.  The\n    //! default is black.\n    //!\n    //! \\sa setMarkerBackgroundColor()\n    void setMarkerForegroundColor(const QColor &col, int markerNumber = -1);\n\n    //! Set the background colour used to display matched braces to \\a col.  It\n    //! is ignored if an indicator is being used.  The default is white.\n    //!\n    //! \\sa setMatchedBraceForegroundColor(), setMatchedBraceIndicator()\n    void setMatchedBraceBackgroundColor(const QColor &col);\n\n    //! Set the foreground colour used to display matched braces to \\a col.  It\n    //! is ignored if an indicator is being used.  The default is red.\n    //!\n    //! \\sa setMatchedBraceBackgroundColor(), setMatchedBraceIndicator()\n    void setMatchedBraceForegroundColor(const QColor &col);\n\n    //! Set the indicator used to display matched braces to \\a indicatorNumber.\n    //! The default is not to use an indicator.\n    //!\n    //! \\sa resetMatchedBraceIndicator(), setMatchedBraceBackgroundColor()\n    void setMatchedBraceIndicator(int indicatorNumber);\n\n    //! Stop using an indicator to display matched braces.\n    //!\n    //! \\sa setMatchedBraceIndicator()\n    void resetMatchedBraceIndicator();\n\n    //! Set the background colour used to display unmatched braces to \\a col.\n    //! It is ignored if an indicator is being used.  The default is white.\n    //!\n    //! \\sa setUnmatchedBraceForegroundColor(), setUnmatchedBraceIndicator()\n    void setUnmatchedBraceBackgroundColor(const QColor &col);\n\n    //! Set the foreground colour used to display unmatched braces to \\a col.\n    //! It is ignored if an indicator is being used.  The default is blue.\n    //!\n    //! \\sa setUnmatchedBraceBackgroundColor(), setUnmatchedBraceIndicator()\n    void setUnmatchedBraceForegroundColor(const QColor &col);\n\n    //! Set the indicator used to display unmatched braces to\n    //! \\a indicatorNumber.  The default is not to use an indicator.\n    //!\n    //! \\sa resetUnmatchedBraceIndicator(), setUnmatchedBraceBackgroundColor()\n    void setUnmatchedBraceIndicator(int indicatorNumber);\n\n    //! Stop using an indicator to display unmatched braces.\n    //!\n    //! \\sa setUnmatchedBraceIndicator()\n    void resetUnmatchedBraceIndicator();\n\n    //! Set the visual flags displayed when a line is wrapped.  \\a endFlag\n    //! determines if and where the flag at the end of a line is displayed.\n    //! \\a startFlag determines if and where the flag at the start of a line is\n    //! displayed.  \\a indent is the number of characters a wrapped line is\n    //! indented by.  By default no visual flags are displayed.\n    void setWrapVisualFlags(WrapVisualFlag endFlag,\n            WrapVisualFlag startFlag = WrapFlagNone, int indent = 0);\n\n    //! Returns the selected text or an empty string if there is no currently\n    //! selected text.\n    //!\n    //! \\sa hasSelectedText()\n    QString selectedText() const;\n\n    //! Returns whether or not the selection is drawn up to the right hand\n    //! border.\n    //!\n    //! \\sa setSelectionToEol()\n    bool selectionToEol() const;\n\n    //! Sets the background colour of an active hotspot area to \\a col.\n    //!\n    //! \\sa resetHotspotBackgroundColor(), setHotspotForegroundColor()\n    void setHotspotBackgroundColor(const QColor &col);\n\n    //! Sets the foreground colour of an active hotspot area to \\a col.\n    //!\n    //! \\sa resetHotspotForegroundColor(), setHotspotBackgroundColor()\n    void setHotspotForegroundColor(const QColor &col);\n\n    //! Enables or disables, according to \\a enable, the underlining of an\n    //! active hotspot area.  The default is false.\n    void setHotspotUnderline(bool enable);\n\n    //! Enables or disables, according to \\a enable, the wrapping of a hotspot\n    //! area to following lines.  The default is true.\n    void setHotspotWrap(bool enable);\n\n    //! Sets whether or not the selection is drawn up to the right hand border.\n    //! \\a filled is set if the selection is drawn to the border.\n    //!\n    //! \\sa selectionToEol()\n    void setSelectionToEol(bool filled);\n\n    //! Sets the extra space added to the height of a line above the baseline\n    //! of the text to \\a extra.\n    //!\n    //! \\sa extraAscent(), setExtraDescent()\n    void setExtraAscent(int extra);\n\n    //! Sets the extra space added to the height of a line below the baseline\n    //! of the text to \\a extra.\n    //!\n    //! \\sa extraDescent(), setExtraAscent()\n    void setExtraDescent(int extra);\n\n    //! Text entered by the user will overwrite existing text if \\a overwrite\n    //! is true.\n    //!\n    //! \\sa overwriteMode()\n    void setOverwriteMode(bool overwrite);\n\n    //! Sets the background colour of visible whitespace to \\a col.  If \\a col\n    //! is an invalid color (the default) then the color specified by the\n    //! current lexer is used.\n    void setWhitespaceBackgroundColor(const QColor &col);\n\n    //! Sets the foreground colour of visible whitespace to \\a col.  If \\a col\n    //! is an invalid color (the default) then the color specified by the\n    //! current lexer is used.\n    void setWhitespaceForegroundColor(const QColor &col);\n\n    //! Sets the size of the dots used to represent visible whitespace.\n    //!\n    //! \\sa whitespaceSize()\n    void setWhitespaceSize(int size);\n\n    //! Sets the line wrap indentation mode to \\a mode.  The default is\n    //! WrapIndentFixed.\n    //!\n    //! \\sa wrapIndentMode()\n    void setWrapIndentMode(WrapIndentMode mode);\n\n    //! Displays a user defined list which can be interacted with like an\n    //! auto-completion list.  \\a id is an identifier for the list which is\n    //! passed as an argument to the userListActivated() signal and must be at\n    //! least 1.  \\a list is the text with which the list is populated.\n    //!\n    //! \\sa cancelList(), isListActive(), userListActivated()\n    void showUserList(int id, const QStringList &list);\n\n    //! The standard command set is returned.\n    QsciCommandSet *standardCommands() const {return stdCmds;}\n\n    //! Returns true if the tab key indents a line instead of inserting a tab\n    //! character.  The default is true.\n    //!\n    //! \\sa setTabIndents(), backspaceUnindents(), setBackspaceUnindents()\n    bool tabIndents() const;\n\n    //! Returns the tab width in characters.  The default is 8.\n    //!\n    //! \\sa setTabWidth()\n    int tabWidth() const;\n\n    //! Returns the text of the current document.\n    //!\n    //! \\sa setText()\n    QString text() const;\n\n    //! \\overload\n    //!\n    //! Returns the text of line \\a line.\n    //!\n    //! \\sa setText()\n    QString text(int line) const;\n\n    //! Returns the height in pixels of the text in line number \\a linenr.\n    int textHeight(int linenr) const;\n\n    //! Returns the size of the dots used to represent visible whitespace.\n    //!\n    //! \\sa setWhitespaceSize()\n    int whitespaceSize() const;\n\n    //! Returns the visibility of whitespace.\n    //!\n    //! \\sa setWhitespaceVisibility()\n    WhitespaceVisibility whitespaceVisibility() const;\n\n    //! Returns the word at the \\a line line number and \\a index character\n    //! index.\n    QString wordAtLineIndex(int line, int index) const;\n\n    //! Returns the word at the \\a point pixel coordinates.\n    QString wordAtPoint(const QPoint &point) const;\n\n    //! Returns the set of valid word character as defined by the current\n    //! language lexer.  If there is no current lexer then the set contains an\n    //! an underscore, numbers and all upper and lower case alphabetic\n    //! characters.\n    //!\n    //! \\sa isWordCharacter()\n    const char *wordCharacters() const;\n\n    //! Returns the line wrap mode.\n    //!\n    //! \\sa setWrapMode()\n    WrapMode wrapMode() const;\n\n    //! Returns the line wrap indentation mode.\n    //!\n    //! \\sa setWrapIndentMode()\n    WrapIndentMode wrapIndentMode() const;\n\n    //! Writes the current document to the \\a io device and returns true if\n    //! there was no error.\n    //!\n    //! \\sa read()\n    bool write(QIODevice *io) const;\n\npublic slots:\n    //! Appends the text \\a text to the end of the text edit.  Note that the\n    //! undo/redo history is cleared by this function.\n    virtual void append(const QString &text);\n\n    //! Display an auto-completion list based on any installed APIs, the\n    //! current contents of the document and the characters immediately to the\n    //! left of the cursor.\n    //!\n    //! \\sa autoCompleteFromAPIs(), autoCompleteFromDocument()\n    virtual void autoCompleteFromAll();\n\n    //! Display an auto-completion list based on any installed APIs and the\n    //! characters immediately to the left of the cursor.\n    //!\n    //! \\sa autoCompleteFromAll(), autoCompleteFromDocument(),\n    //! setAutoCompletionAPIs()\n    virtual void autoCompleteFromAPIs();\n\n    //! Display an auto-completion list based on the current contents of the\n    //! document and the characters immediately to the left of the cursor.\n    //!\n    //! \\sa autoCompleteFromAll(), autoCompleteFromAPIs()\n    virtual void autoCompleteFromDocument();\n\n    //! Display a call tip based on the the characters immediately to the left\n    //! of the cursor.\n    virtual void callTip();\n\n    //! Deletes all the text in the text edit.\n    virtual void clear();\n\n    //! Copies any selected text to the clipboard.\n    //!\n    //! \\sa copyAvailable(), cut(), paste()\n    virtual void copy();\n\n    //! Copies any selected text to the clipboard and then deletes the text.\n    //!\n    //! \\sa copy(), paste()\n    virtual void cut();\n\n    //! Ensures that the cursor is visible.\n    virtual void ensureCursorVisible();\n\n    //! Ensures that the line number \\a line is visible.\n    virtual void ensureLineVisible(int line);\n\n    //! If any lines are currently folded then they are all unfolded.\n    //! Otherwise all lines are folded.  This has the same effect as clicking\n    //! in the fold margin with the shift and control keys pressed.  If\n    //! \\a children is not set (the default) then only the top level fold\n    //! points are affected, otherwise the state of all fold points are\n    //! changed.\n    virtual void foldAll(bool children = false);\n\n    //! If the line \\a line is folded then it is unfolded.  Otherwise it is\n    //! folded.  This has the same effect as clicking in the fold margin.\n    virtual void foldLine(int line);\n\n    //! Increases the indentation of line \\a line by an indentation width.\n    //!\n    //! \\sa unindent()\n    virtual void indent(int line);\n\n    //! Insert the text \\a text at the current position.\n    virtual void insert(const QString &text);\n\n    //! Insert the text \\a text in the line \\a line at the position\n    //! \\a index.\n    virtual void insertAt(const QString &text, int line, int index);\n\n    //! If the cursor is either side of a brace character then move it to the\n    //! position of the corresponding brace.\n    virtual void moveToMatchingBrace();\n\n    //! Pastes any text from the clipboard into the text edit at the current\n    //! cursor position.\n    //!\n    //! \\sa copy(), cut()\n    virtual void paste();\n\n    //! Redo the last change or sequence of changes.\n    //!\n    //! \\sa isRedoAvailable()\n    virtual void redo();\n\n    //! Removes any selected text.\n    //!\n    //! \\sa replaceSelectedText()\n    virtual void removeSelectedText();\n\n    //! Replaces any selected text with \\a text.\n    //!\n    //! \\sa removeSelectedText()\n    virtual void replaceSelectedText(const QString &text);\n\n    //! Resets the background colour of selected text to the default.\n    //!\n    //! \\sa setSelectionBackgroundColor(), resetSelectionForegroundColor()\n    virtual void resetSelectionBackgroundColor();\n\n    //! Resets the foreground colour of selected text to the default.\n    //!\n    //! \\sa setSelectionForegroundColor(), resetSelectionBackgroundColor()\n    virtual void resetSelectionForegroundColor();\n\n    //! If \\a select is true (the default) then all the text is selected.  If\n    //! \\a select is false then any currently selected text is deselected.\n    virtual void selectAll(bool select = true);\n\n    //! If the cursor is either side of a brace character then move it to the\n    //! position of the corresponding brace and select the text between the\n    //! braces.\n    virtual void selectToMatchingBrace();\n\n    //! If \\a cs is true then auto-completion lists are case sensitive.  The\n    //! default is true.  Note that setting a lexer may change the case\n    //! sensitivity.\n    //!\n    //! \\sa autoCompletionCaseSensitivity()\n    virtual void setAutoCompletionCaseSensitivity(bool cs);\n\n    //! If \\a replace is true then when an item from an auto-completion list is\n    //! selected, the rest of the word to the right of the current cursor is\n    //! removed.  The default is false.\n    //!\n    //! \\sa autoCompletionReplaceWord()\n    virtual void setAutoCompletionReplaceWord(bool replace);\n\n    //! If \\a single is true then when there is only a single entry in an\n    //! auto-completion list it is automatically used and the list is not\n    //! displayed.  This only has an effect when auto-completion is explicitly\n    //! requested (using autoCompleteFromAPIs() and autoCompleteFromDocument())\n    //! and has no effect when auto-completion is triggered as the user types.\n    //! The default is false.  Note that this is deprecated and\n    //! setAutoCompletionUseSingle() should be used instead.\n    //!\n    //! \\sa autoCompletionShowSingle()\n    virtual void setAutoCompletionShowSingle(bool single);\n\n    //! Sets the source for the auto-completion list when it is being displayed\n    //! automatically as the user types to \\a source.  The default is AcsNone,\n    //! ie. it is disabled.\n    //!\n    //! \\sa autoCompletionSource()\n    virtual void setAutoCompletionSource(AutoCompletionSource source);\n\n    //! Sets the threshold for the automatic display of the auto-completion\n    //! list as the user types to \\a thresh.  The threshold is the number of\n    //! characters that the user must type before the list is displayed.  If\n    //! the threshold is less than or equal to 0 then the list is disabled.\n    //! The default is -1.\n    //!\n    //! \\sa autoCompletionThreshold(), setAutoCompletionWordSeparators()\n    virtual void setAutoCompletionThreshold(int thresh);\n\n    //! Sets the behavior of the auto-completion list when it has a single\n    //! entry.  The default is AcusNever.\n    //!\n    //! \\sa autoCompletionUseSingle()\n    virtual void setAutoCompletionUseSingle(AutoCompletionUseSingle single);\n\n    //! If \\a autoindent is true then auto-indentation is enabled.  The default\n    //! is false.\n    //!\n    //! \\sa autoIndent()\n    virtual void setAutoIndent(bool autoindent);\n\n    //! Sets the brace matching mode to \\a bm.  The default is NoBraceMatching.\n    //!\n    //! \\sa braceMatching()\n    virtual void setBraceMatching(BraceMatch bm);\n\n    //! If \\a deindent is true then the backspace key will unindent a line\n    //! rather then delete a character.\n    //!\n    //! \\sa backspaceUnindents(), tabIndents(), setTabIndents()\n    virtual void setBackspaceUnindents(bool unindent);\n\n    //! Sets the foreground colour of the caret to \\a col.\n    virtual void setCaretForegroundColor(const QColor &col);\n\n    //! Sets the background colour, including the alpha component, of the line\n    //! containing the caret to \\a col.\n    //!\n    //! \\sa setCaretLineVisible()\n    virtual void setCaretLineBackgroundColor(const QColor &col);\n\n    //! Enables or disables, according to \\a enable, the background color of\n    //! the line containing the caret.\n    //!\n    //! \\sa setCaretLineBackgroundColor()\n    virtual void setCaretLineVisible(bool enable);\n\n    //! Sets the width of the caret to \\a width pixels.  A \\a width of 0 makes\n    //! the caret invisible.\n    virtual void setCaretWidth(int width);\n\n    //! The widget's text (ie. foreground) colour is set to \\a c.  This has no\n    //! effect if a language lexer has been set.\n    //!\n    //! \\sa color()\n    virtual void setColor(const QColor &c);\n\n    //! Sets the cursor to the line \\a line at the position \\a index.\n    //!\n    //! \\sa getCursorPosition()\n    virtual void setCursorPosition(int line, int index);\n\n    //! Sets the end-of-line mode to \\a mode.  The default is the platform's\n    //! natural mode.\n    //!\n    //! \\sa eolMode()\n    virtual void setEolMode(EolMode mode);\n\n    //! If \\a visible is true then end-of-lines are made visible.  The default\n    //! is that they are invisible.\n    //!\n    //! \\sa eolVisibility()\n    virtual void setEolVisibility(bool visible);\n\n    //! Sets the folding style for margin \\a margin to \\a fold.  The default\n    //! style is NoFoldStyle (ie. folding is disabled) and the default margin\n    //! is 2.\n    //!\n    //! \\sa folding()\n    virtual void setFolding(FoldStyle fold, int margin = 2);\n\n    //! Sets the indentation of line \\a line to \\a indentation characters.\n    //!\n    //! \\sa indentation()\n    virtual void setIndentation(int line, int indentation);\n\n    //! Enables or disables, according to \\a enable, this display of\n    //! indentation guides.\n    //!\n    //! \\sa indentationGuides()\n    virtual void setIndentationGuides(bool enable);\n\n    //! Set the background colour of indentation guides to \\a col.\n    //!\n    //! \\sa setIndentationGuidesForegroundColor()\n    virtual void setIndentationGuidesBackgroundColor(const QColor &col);\n\n    //! Set the foreground colour of indentation guides to \\a col.\n    //!\n    //! \\sa setIndentationGuidesBackgroundColor()\n    virtual void setIndentationGuidesForegroundColor(const QColor &col);\n\n    //! If \\a tabs is true then indentations are created using tabs and spaces,\n    //! rather than just spaces.\n    //!\n    //! \\sa indentationsUseTabs()\n    virtual void setIndentationsUseTabs(bool tabs);\n\n    //! Sets the indentation width to \\a width characters.  If \\a width is 0\n    //! then the value returned by tabWidth() is used.\n    //!\n    //! \\sa indentationWidth(), tabWidth()\n    virtual void setIndentationWidth(int width);\n\n    //! Sets the specific language lexer used to style text to \\a lex.  If\n    //! \\a lex is 0 then syntax styling is disabled.\n    //!\n    //! \\sa lexer()\n    virtual void setLexer(QsciLexer *lexer = 0);\n\n    //! Set the background colour of all margins to \\a col.  The default is a\n    //! gray.\n    //!\n    //! \\sa setMarginsForegroundColor()\n    virtual void setMarginsBackgroundColor(const QColor &col);\n\n    //! Set the font used in all margins to \\a f.\n    virtual void setMarginsFont(const QFont &f);\n\n    //! Set the foreground colour of all margins to \\a col.  The default is\n    //! black.\n    //!\n    //! \\sa setMarginsBackgroundColor()\n    virtual void setMarginsForegroundColor(const QColor &col);\n\n    //! Enables or disables, according to \\a lnrs, the display of line numbers\n    //! in margin \\a margin.\n    //!\n    //! \\sa marginLineNumbers(), setMarginType(), SCI_SETMARGINTYPEN\n    virtual void setMarginLineNumbers(int margin, bool lnrs);\n\n    //! Sets the marker mask of margin \\a margin to \\a mask.  Only those\n    //! markers whose bit is set in the mask are displayed in the margin.\n    //!\n    //! \\sa marginMarkerMask(), QsciMarker, SCI_SETMARGINMASKN\n    virtual void setMarginMarkerMask(int margin, int mask);\n\n    //! Enables or disables, according to \\a sens, the sensitivity of margin\n    //! \\a margin to mouse clicks.  If the user clicks in a sensitive margin\n    //! the marginClicked() signal is emitted.\n    //!\n    //! \\sa marginSensitivity(), marginClicked(), SCI_SETMARGINSENSITIVEN\n    virtual void setMarginSensitivity(int margin, bool sens);\n\n    //! Sets the width of margin \\a margin to \\a width pixels.  If the width of\n    //! a margin is 0 then it is not displayed.\n    //!\n    //! \\sa marginWidth(), SCI_SETMARGINWIDTHN\n    virtual void setMarginWidth(int margin, int width);\n\n    //! Sets the width of margin \\a margin so that it is wide enough to display\n    //! \\a s in the current margin font.\n    //!\n    //! \\sa marginWidth(), SCI_SETMARGINWIDTHN\n    virtual void setMarginWidth(int margin, const QString &s);\n\n    //! Sets the modified state of the text edit to \\a m.  Note that it is only\n    //! possible to clear the modified state (where \\a m is false).  Attempts\n    //! to set the modified state (where \\a m is true) are ignored.\n    //!\n    //! \\sa isModified(), modificationChanged()\n    virtual void setModified(bool m);\n\n    //! The widget's paper (ie. background) colour is set to \\a c.  This has no\n    //! effect if a language lexer has been set.\n    //!\n    //! \\sa paper()\n    virtual void setPaper(const QColor &c);\n\n    //! Sets the read-only state of the text edit to \\a ro.\n    //!\n    //! \\sa isReadOnly()\n    virtual void setReadOnly(bool ro);\n\n    //! Sets the selection which starts at position \\a indexFrom in line\n    //! \\a lineFrom and ends at position \\a indexTo in line \\a lineTo.  The\n    //! cursor is moved to position \\a indexTo in \\a lineTo.\n    //!\n    //! \\sa getSelection()\n    virtual void setSelection(int lineFrom, int indexFrom, int lineTo,\n            int indexTo);\n\n    //! Sets the background colour, including the alpha component, of selected\n    //! text to \\a col.\n    //!\n    //! \\sa resetSelectionBackgroundColor(), setSelectionForegroundColor()\n    virtual void setSelectionBackgroundColor(const QColor &col);\n\n    //! Sets the foreground colour of selected text to \\a col.\n    //!\n    //! \\sa resetSelectionForegroundColor(), setSelectionBackgroundColor()\n    virtual void setSelectionForegroundColor(const QColor &col);\n\n    //! If \\a indent is true then the tab key will indent a line rather than\n    //! insert a tab character.\n    //!\n    //! \\sa tabIndents(), backspaceUnindents(), setBackspaceUnindents()\n    virtual void setTabIndents(bool indent);\n\n    //! Sets the tab width to \\a width characters.\n    //!\n    //! \\sa tabWidth()\n    virtual void setTabWidth(int width);\n\n    //! Replaces all of the current text with \\a text.  Note that the\n    //! undo/redo history is cleared by this function.\n    //!\n    //! \\sa text()\n    virtual void setText(const QString &text);\n\n    //! Sets the current text encoding.  If \\a cp is true then UTF8 is used,\n    //! otherwise Latin1 is used.\n    //!\n    //! \\sa isUtf8()\n    virtual void setUtf8(bool cp);\n\n    //! Sets the visibility of whitespace to mode \\a mode.  The default is that\n    //! whitespace is invisible.\n    //!\n    //! \\sa whitespaceVisibility()\n    virtual void setWhitespaceVisibility(WhitespaceVisibility mode);\n\n    //! Sets the line wrap mode to \\a mode.  The default is that lines are not\n    //! wrapped.\n    //!\n    //! \\sa wrapMode()\n    virtual void setWrapMode(WrapMode mode);\n\n    //! Undo the last change or sequence of changes.\n    //!\n    //! Scintilla has multiple level undo and redo.  It will continue to record\n    //! undoable actions until memory runs out.  Sequences of typing or\n    //! deleting are compressed into single actions to make it easier to undo\n    //! and redo at a sensible level of detail.  Sequences of actions can be\n    //! combined into actions that are undone as a unit.  These sequences occur\n    //! between calls to beginUndoAction() and endUndoAction().  These\n    //! sequences can be nested and only the top level sequences are undone as\n    //! units. \n    //!\n    //! \\sa beginUndoAction(), endUndoAction(), isUndoAvailable()\n    virtual void undo();\n\n    //! Decreases the indentation of line \\a line by an indentation width.\n    //!\n    //! \\sa indent()\n    virtual void unindent(int line);\n\n    //! Zooms in on the text by by making the base font size \\a range points\n    //! larger and recalculating all font sizes.\n    //!\n    //! \\sa zoomOut(), zoomTo()\n    virtual void zoomIn(int range);\n\n    //! \\overload\n    //!\n    //! Zooms in on the text by by making the base font size one point larger\n    //! and recalculating all font sizes.\n    virtual void zoomIn();\n\n    //! Zooms out on the text by by making the base font size \\a range points\n    //! smaller and recalculating all font sizes.\n    //!\n    //! \\sa zoomIn(), zoomTo()\n    virtual void zoomOut(int range);\n\n    //! \\overload\n    //!\n    //! Zooms out on the text by by making the base font size one point larger\n    //! and recalculating all font sizes.\n    virtual void zoomOut();\n\n    //! Zooms the text by making the base font size \\a size points and\n    //! recalculating all font sizes.\n    //!\n    //! \\sa zoomIn(), zoomOut()\n    virtual void zoomTo(int size);\n\nsignals:\n    //! This signal is emitted whenever the cursor position changes.  \\a line\n    //! contains the line number and \\a index contains the character index\n    //! within the line.\n    void cursorPositionChanged(int line, int index);\n\n    //! This signal is emitted whenever text is selected or de-selected.\n    //! \\a yes is true if text has been selected and false if text has been\n    //! deselected.  If \\a yes is true then copy() can be used to copy the\n    //! selection to the clipboard.  If \\a yes is false then copy() does\n    //! nothing. \n    //!\n    //! \\sa copy(), selectionChanged()\n    void copyAvailable(bool yes);\n\n    //! This signal is emitted whenever the user clicks on an indicator.  \\a\n    //! line is the number of the line where the user clicked.  \\a index is the\n    //! character index within the line.  \\a state is the state of the modifier\n    //! keys (Qt::ShiftModifier, Qt::ControlModifier, Qt::AltModifer and\n    //! Qt::MetaModifier) when the user clicked.\n    //!\n    //! \\sa indicatorReleased()\n    void indicatorClicked(int line, int index, Qt::KeyboardModifiers state);\n\n    //! This signal is emitted whenever the user releases the mouse on an\n    //! indicator.  \\a line is the number of the line where the user clicked.\n    //! \\a index is the character index within the line.  \\a state is the state\n    //! of the modifier keys (Qt::ShiftModifier, Qt::ControlModifier,\n    //! Qt::AltModifer and Qt::MetaModifier) when the user released the mouse.\n    //!\n    //! \\sa indicatorClicked()\n    void indicatorReleased(int line, int index, Qt::KeyboardModifiers state);\n\n    //! This signal is emitted whenever the number of lines of text changes.\n    void linesChanged();\n\n    //! This signal is emitted whenever the user clicks on a sensitive margin.\n    //! \\a margin is the margin.  \\a line is the number of the line where the\n    //! user clicked.  \\a state is the state of the modifier keys\n    //! (Qt::ShiftModifier, Qt::ControlModifier, Qt::AltModifer and\n    //! Qt::MetaModifier) when the user clicked.\n    //!\n    //! \\sa marginSensitivity(), setMarginSensitivity()\n    void marginClicked(int margin, int line, Qt::KeyboardModifiers state);\n\n    //! This signal is emitted whenever the user attempts to modify read-only\n    //! text.\n    //!\n    //! \\sa isReadOnly(), setReadOnly()\n    void modificationAttempted();\n\n    //! This signal is emitted whenever the modification state of the text\n    //! changes.  \\a m is true if the text has been modified.\n    //!\n    //! \\sa isModified(), setModified()\n    void modificationChanged(bool m);\n\n    //! This signal is emitted whenever the selection changes.\n    //!\n    //! \\sa copyAvailable()\n    void selectionChanged();\n\n    //! This signal is emitted whenever the text in the text edit changes.\n    void textChanged();\n\n    //! This signal is emitted when an item in a user defined list is activated\n    //! (selected).  \\a id is the list identifier.  \\a string is the text of\n    //! the item.\n    //!\n    //! \\sa showUserList()\n    void userListActivated(int id, const QString &string);\n\nprotected:\n    //! \\reimp\n    virtual bool event(QEvent *e);\n\n    //! \\reimp\n    virtual void changeEvent(QEvent *e);\n\n    //! \\reimp\n    virtual void contextMenuEvent(QContextMenuEvent *e);\n\nprivate slots:\n    void handleCallTipClick(int dir);\n    void handleCharAdded(int charadded);\n    void handleIndicatorClick(int pos, int modifiers);\n    void handleIndicatorRelease(int pos, int modifiers);\n    void handleMarginClick(int pos, int margin, int modifiers);\n    void handleModified(int pos, int mtype, const char *text, int len,\n            int added, int line, int foldNow, int foldPrev, int token,\n            int annotationLinesAdded);\n    void handlePropertyChange(const char *prop, const char *val);\n    void handleSavePointReached();\n    void handleSavePointLeft();\n    void handleSelectionChanged(bool yes);\n    void handleAutoCompletionSelection();\n    void handleUserListSelection(const char *text, int id);\n\n    void handleStyleColorChange(const QColor &c, int style);\n    void handleStyleEolFillChange(bool eolfill, int style);\n    void handleStyleFontChange(const QFont &f, int style);\n    void handleStylePaperChange(const QColor &c, int style);\n\n    void handleUpdateUI(int updated);\n\n    void delete_selection();\n\nprivate:\n    void detachLexer();\n\n    enum IndentState {\n        isNone,\n        isKeywordStart,\n        isBlockStart,\n        isBlockEnd\n    };\n\n    void maintainIndentation(char ch, long pos);\n    void autoIndentation(char ch, long pos);\n    void autoIndentLine(long pos, int line, int indent);\n    int blockIndent(int line);\n    IndentState getIndentState(int line);\n    bool rangeIsWhitespace(long spos, long epos);\n    int findStyledWord(const char *text, int style, const char *words);\n\n    void checkMarker(int &markerNumber);\n    void checkIndicator(int &indicatorNumber);\n    static void allocateId(int &id, unsigned &allocated, int min, int max);\n    int currentIndent() const;\n    int indentWidth() const;\n    bool doFind();\n    int simpleFind();\n    void foldClick(int lineClick, int bstate);\n    void foldChanged(int line, int levelNow, int levelPrev);\n    void foldExpand(int &line, bool doExpand, bool force = false,\n            int visLevels = 0, int level = -1);\n    void setFoldMarker(int marknr, int mark = SC_MARK_EMPTY);\n    void setLexerStyle(int style);\n    void setStylesFont(const QFont &f, int style);\n    void setEnabledColors(int style, QColor &fore, QColor &back);\n\n    void braceMatch();\n    bool findMatchingBrace(long &brace, long &other, BraceMatch mode);\n    long checkBrace(long pos, int brace_style, bool &colonMode);\n    void gotoMatchingBrace(bool select);\n\n    void startAutoCompletion(AutoCompletionSource acs, bool checkThresh,\n            bool choose_single);\n\n    int adjustedCallTipPosition(int ctshift) const;\n    bool getSeparator(int &pos) const;\n    QString getWord(int &pos) const;\n    char getCharacter(int &pos) const;\n    bool isStartChar(char ch) const;\n\n    bool ensureRW();\n    void insertAtPos(const QString &text, int pos);\n    static int mapModifiers(int modifiers);\n\n    QString wordAtPosition(int position) const;\n\n    ScintillaBytes styleText(const QList<QsciStyledText> &styled_text,\n            char **styles, int style_offset = 0);\n\n    struct FindState\n    {\n        enum Status\n        {\n            Finding,\n            FindingInSelection,\n            Idle\n        };\n\n        FindState() : status(Idle) {}\n\n        Status status;\n        QString expr;\n        bool wrap;\n        bool forward;\n        int flags;\n        long startpos, startpos_orig;\n        long endpos, endpos_orig;\n        bool show;\n    };\n\n    FindState findState;\n\n    unsigned allocatedMarkers;\n    unsigned allocatedIndicators;\n    int oldPos;\n    int ctPos;\n    bool selText;\n    FoldStyle fold;\n    int foldmargin;\n    bool autoInd;\n    BraceMatch braceMode;\n    AutoCompletionSource acSource;\n    int acThresh;\n    QStringList wseps;\n    const char *wchars;\n    CallTipsPosition call_tips_position;\n    CallTipsStyle call_tips_style;\n    int maxCallTips;\n    QStringList ct_entries;\n    int ct_cursor;\n    QList<int> ct_shifts;\n    AutoCompletionUseSingle use_single;\n/*---OPENCOR---\n    QPointer<QsciLexer> lex;\n*/\n//---OPENCOR--- BEGIN\n    struct Lexer;\n    Lexer *lexerStruct;\n//---OPENCOR--- END\n    QsciCommandSet *stdCmds;\n    QsciDocument doc;\n    QColor nl_text_colour;\n    QColor nl_paper_colour;\n    QByteArray explicit_fillups;\n    bool fillups_enabled;\n\n    // The following allow QsciListBoxQt to distinguish between an\n    // auto-completion list and a user list, and to return the full selection\n    // of an auto-completion list.\n    friend class QsciListBoxQt;\n\n    QString acSelection;\n    bool isAutoCompletionList() const;\n\n    void set_shortcut(QAction *action, QsciCommand::Command cmd_id) const;\n\n    QsciScintilla(const QsciScintilla &);\n    QsciScintilla &operator=(const QsciScintilla &);\n};\n\n/*---OPENCOR---\n#ifdef __APPLE__\n}\n#endif\n*/\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciscintillabase.h",
    "content": "// This class defines the \"official\" low-level API.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCISCINTILLABASE_H\n#define QSCISCINTILLABASE_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qglobal.h>\n\n#include <QAbstractScrollArea>\n#include <QByteArray>\n\n#include <qpoint.h>\n#include <qtimer.h>\n\n#include <Qsci/qsciglobal.h>\n\n\nQT_BEGIN_NAMESPACE\nclass QColor;\nclass QImage;\nclass QPainter;\nclass QPixmap;\nclass QMimeData;\nQT_END_NAMESPACE\n\nclass QsciScintillaQt;\n\n\n//! \\brief The QsciScintillaBase class implements the Scintilla editor widget\n//! and its low-level API.\n//!\n//! Scintilla (http://www.scintilla.org) is a powerful C++ editor class that\n//! supports many features including syntax styling, error indicators, code\n//! completion and call tips. It is particularly useful as a programmer's\n//! editor.\n//!\n//! QsciScintillaBase is a port to Qt of Scintilla. It implements the standard\n//! Scintilla API which consists of a number of messages each taking up to\n//! two arguments.\n//!\n//! See QsciScintilla for the implementation of a higher level API that is more\n//! consistent with the rest of the Qt toolkit.\nclass QSCINTILLA_EXPORT QsciScintillaBase : public QAbstractScrollArea\n{\n    Q_OBJECT\n\npublic:\n    //! The low-level Scintilla API is implemented as a set of messages each of\n    //! which takes up to two parameters (\\a wParam and \\a lParam) and\n    //! optionally return a value. This enum defines all the possible messages.\n    enum\n    {\n        //!\n        SCI_START = 2000,\n\n        //!\n        SCI_OPTIONAL_START = 3000,\n\n        //!\n        SCI_LEXER_START = 4000,\n\n        //! This message appends some text to the end of the document.\n        //! \\a wParam is the length of the text.\n        //! \\a lParam is the text to be appended.\n        SCI_ADDTEXT = 2001,\n\n        //!\n        SCI_ADDSTYLEDTEXT = 2002,\n\n        //!\n        SCI_INSERTTEXT = 2003,\n\n        //!\n        SCI_CLEARALL = 2004,\n\n        //!\n        SCI_CLEARDOCUMENTSTYLE = 2005,\n\n        //!\n        SCI_GETLENGTH = 2006,\n\n        //!\n        SCI_GETCHARAT = 2007,\n\n        //! This message returns the current position.\n        //! \n        //! \\sa SCI_SETCURRENTPOS\n        SCI_GETCURRENTPOS = 2008,\n\n        //! This message returns the anchor.\n        //! \n        //! \\sa SCI_SETANCHOR\n        SCI_GETANCHOR = 2009,\n\n        //!\n        SCI_GETSTYLEAT = 2010,\n\n        //!\n        SCI_REDO = 2011,\n\n        //!\n        SCI_SETUNDOCOLLECTION = 2012,\n\n        //!\n        SCI_SELECTALL = 2013,\n\n        //! This message marks the current state of the text as the the save\n        //! point. This is usually done when the text is saved or loaded.\n        //! \n        //! \\sa SCN_SAVEPOINTREACHED(), SCN_SAVEPOINTLEFT()\n        SCI_SETSAVEPOINT = 2014,\n\n        //!\n        SCI_GETSTYLEDTEXT = 2015,\n\n        //!\n        SCI_CANREDO = 2016,\n\n        //! This message returns the line that contains a particular instance\n        //! of a marker.\n        //! \\a wParam is the handle of the marker.\n        //!\n        //! \\sa SCI_MARKERADD\n        SCI_MARKERLINEFROMHANDLE = 2017,\n\n        //! This message removes a particular instance of a marker.\n        //! \\a wParam is the handle of the marker.\n        //!\n        //! \\sa SCI_MARKERADD\n        SCI_MARKERDELETEHANDLE = 2018,\n\n        //!\n        SCI_GETUNDOCOLLECTION = 2019,\n\n        //!\n        SCI_GETVIEWWS = 2020,\n\n        //!\n        SCI_SETVIEWWS = 2021,\n\n        //!\n        SCI_POSITIONFROMPOINT = 2022,\n\n        //!\n        SCI_POSITIONFROMPOINTCLOSE = 2023,\n\n        //!\n        SCI_GOTOLINE = 2024,\n\n        //! This message clears the current selection and sets the current\n        //! position.\n        //! \\a wParam is the new current position.\n        //! \n        //! \\sa SCI_SETCURRENTPOS\n        SCI_GOTOPOS = 2025,\n\n        //! This message sets the anchor.\n        //! \\a wParam is the new anchor.\n        //! \n        //! \\sa SCI_GETANCHOR\n        SCI_SETANCHOR = 2026,\n\n        //!\n        SCI_GETCURLINE = 2027,\n\n        //! This message returns the character position of the start of the\n        //! text that needs to be syntax styled.\n        //! \n        //! \\sa SCN_STYLENEEDED()\n        SCI_GETENDSTYLED = 2028,\n\n        //!\n        SCI_CONVERTEOLS = 2029,\n\n        //!\n        SCI_GETEOLMODE = 2030,\n\n        //!\n        SCI_SETEOLMODE = 2031,\n\n        //!\n        SCI_STARTSTYLING = 2032,\n\n        //!\n        SCI_SETSTYLING = 2033,\n\n        //!\n        SCI_GETBUFFEREDDRAW = 2034,\n\n        //!\n        SCI_SETBUFFEREDDRAW = 2035,\n\n        //!\n        SCI_SETTABWIDTH = 2036,\n\n        //!\n        SCI_GETTABWIDTH = 2121,\n\n        //!\n        SCI_SETCODEPAGE = 2037,\n\n        //! This message sets the symbol used to draw one of 32 markers.  Some\n        //! markers have pre-defined uses, see the SC_MARKNUM_* values.\n        //! \\a wParam is the number of the marker.\n        //! \\a lParam is the marker symbol and is one of the SC_MARK_* values.\n        //!\n        //! \\sa SCI_MARKERADD, SCI_MARKERDEFINEPIXMAP,\n        //! SCI_MARKERDEFINERGBAIMAGE\n        SCI_MARKERDEFINE = 2040,\n\n        //! This message sets the foreground colour used to draw a marker.  A\n        //! colour is represented as a 24 bit value.  The 8 least significant\n        //! bits correspond to red, the middle 8 bits correspond to green, and\n        //! the 8 most significant bits correspond to blue.  The default value\n        //! is 0x000000.\n        //! \\a wParam is the number of the marker.\n        //! \\a lParam is the colour.\n        //!\n        //! \\sa SCI_MARKERSETBACK\n        SCI_MARKERSETFORE = 2041,\n\n        //! This message sets the background colour used to draw a marker.  A\n        //! colour is represented as a 24 bit value.  The 8 least significant\n        //! bits correspond to red, the middle 8 bits correspond to green, and\n        //! the 8 most significant bits correspond to blue.  The default value\n        //! is 0xffffff.\n        //! \\a wParam is the number of the marker.\n        //! \\a lParam is the colour.\n        //!\n        //! \\sa SCI_MARKERSETFORE\n        SCI_MARKERSETBACK = 2042,\n\n        //! This message adds a marker to a line.  A handle for the marker is\n        //! returned which can be used to track the marker's position.\n        //! \\a wParam is the line number.\n        //! \\a lParam is the number of the marker.\n        //!\n        //! \\sa SCI_MARKERDELETE, SCI_MARKERDELETEALL,\n        //! SCI_MARKERDELETEHANDLE\n        SCI_MARKERADD = 2043,\n\n        //! This message deletes a marker from a line.\n        //! \\a wParam is the line number.\n        //! \\a lParam is the number of the marker.\n        //!\n        //! \\sa SCI_MARKERADD, SCI_MARKERDELETEALL\n        SCI_MARKERDELETE = 2044,\n\n        //! This message deletes all occurences of a marker.\n        //! \\a wParam is the number of the marker.  If \\a wParam is -1 then all\n        //! markers are removed.\n        //!\n        //! \\sa SCI_MARKERADD, SCI_MARKERDELETE\n        SCI_MARKERDELETEALL = 2045,\n\n        //! This message returns the 32 bit mask of markers at a line.\n        //! \\a wParam is the line number.\n        SCI_MARKERGET = 2046,\n\n        //! This message looks for the next line to contain at least one marker\n        //! contained in a 32 bit mask of markers and returns the line number.\n        //! \\a wParam is the line number to start the search from.\n        //! \\a lParam is the mask of markers to search for.\n        //!\n        //! \\sa SCI_MARKERPREVIOUS\n        SCI_MARKERNEXT = 2047,\n\n        //! This message looks for the previous line to contain at least one\n        //! marker contained in a 32 bit mask of markers and returns the line\n        //! number.\n        //! \\a wParam is the line number to start the search from.\n        //! \\a lParam is the mask of markers to search for.\n        //!\n        //! \\sa SCI_MARKERNEXT\n        SCI_MARKERPREVIOUS = 2048,\n\n        //! This message sets the symbol used to draw one of the 32 markers to\n        //! a pixmap.  Pixmaps use the SC_MARK_PIXMAP marker symbol.\n        //! \\a wParam is the number of the marker.\n        //! \\a lParam is a pointer to a QPixmap instance.  Note that in other\n        //! ports of Scintilla this is a pointer to either raw or textual XPM\n        //! image data.\n        //!\n        //! \\sa SCI_MARKERDEFINE, SCI_MARKERDEFINERGBAIMAGE\n        SCI_MARKERDEFINEPIXMAP = 2049,\n\n        //! This message sets what can be displayed in a margin.\n        //! \\a wParam is the number of the margin.\n        //! \\a lParam is the logical or of the SC_MARGIN_* values.\n        //!\n        //! \\sa SCI_GETMARGINTYPEN\n        SCI_SETMARGINTYPEN = 2240,\n\n        //! This message returns what can be displayed in a margin.\n        //! \\a wParam is the number of the margin.\n        //!\n        //! \\sa SCI_SETMARGINTYPEN\n        SCI_GETMARGINTYPEN = 2241,\n\n        //! This message sets the width of a margin in pixels.\n        //! \\a wParam is the number of the margin.\n        //! \\a lParam is the new margin width.\n        //!\n        //! \\sa SCI_GETMARGINWIDTHN\n        SCI_SETMARGINWIDTHN = 2242,\n\n        //! This message returns the width of a margin in pixels.\n        //! \\a wParam is the number of the margin.\n        //!\n        //! \\sa SCI_SETMARGINWIDTHN\n        SCI_GETMARGINWIDTHN = 2243,\n\n        //! This message sets the mask of a margin.  The mask is a 32 value\n        //! with one bit for each possible marker.  If a bit is set then the\n        //! corresponding marker is displayed.  By default, all markers are\n        //! displayed.\n        //! \\a wParam is the number of the margin.\n        //! \\a lParam is the new margin mask.\n        //!\n        //! \\sa SCI_GETMARGINMASKN, SCI_MARKERDEFINE\n        SCI_SETMARGINMASKN = 2244,\n\n        //! This message returns the mask of a margin.\n        //! \\a wParam is the number of the margin.\n        //!\n        //! \\sa SCI_SETMARGINMASKN\n        SCI_GETMARGINMASKN = 2245,\n\n        //! This message sets the sensitivity of a margin to mouse clicks.\n        //! \\a wParam is the number of the margin.\n        //! \\a lParam is non-zero to make the margin sensitive to mouse clicks.\n        //! When the mouse is clicked the SCN_MARGINCLICK() signal is emitted.\n        //!\n        //! \\sa SCI_GETMARGINSENSITIVEN, SCN_MARGINCLICK()\n        SCI_SETMARGINSENSITIVEN = 2246,\n\n        //! This message returns the sensitivity of a margin to mouse clicks.\n        //! \\a wParam is the number of the margin.\n        //!\n        //! \\sa SCI_SETMARGINSENSITIVEN, SCN_MARGINCLICK()\n        SCI_GETMARGINSENSITIVEN = 2247,\n\n        //! This message sets the cursor shape displayed over a margin.\n        //! \\a wParam is the number of the margin.\n        //! \\a lParam is the cursor shape, normally either SC_CURSORARROW or\n        //! SC_CURSORREVERSEARROW.  Note that, currently, QScintilla implements\n        //! both of these as Qt::ArrowCursor.\n        //!\n        //! \\sa SCI_GETMARGINCURSORN\n        SCI_SETMARGINCURSORN = 2248,\n\n        //! This message returns the cursor shape displayed over a margin.\n        //! \\a wParam is the number of the margin.\n        //!\n        //! \\sa SCI_SETMARGINCURSORN\n        SCI_GETMARGINCURSORN = 2249,\n\n        //!\n        SCI_STYLECLEARALL = 2050,\n\n        //!\n        SCI_STYLESETFORE = 2051,\n\n        //!\n        SCI_STYLESETBACK = 2052,\n\n        //!\n        SCI_STYLESETBOLD = 2053,\n\n        //!\n        SCI_STYLESETITALIC = 2054,\n\n        //!\n        SCI_STYLESETSIZE = 2055,\n\n        //!\n        SCI_STYLESETFONT = 2056,\n\n        //!\n        SCI_STYLESETEOLFILLED = 2057,\n\n        //!\n        SCI_STYLERESETDEFAULT = 2058,\n\n        //!\n        SCI_STYLESETUNDERLINE = 2059,\n\n        //!\n        SCI_STYLESETCASE = 2060,\n\n        //!\n        SCI_STYLESETSIZEFRACTIONAL = 2061,\n\n        //!\n        SCI_STYLEGETSIZEFRACTIONAL = 2062,\n\n        //!\n        SCI_STYLESETWEIGHT = 2063,\n\n        //!\n        SCI_STYLEGETWEIGHT = 2064,\n\n        //!\n        SCI_STYLESETCHARACTERSET = 2066,\n\n        //!\n        SCI_SETSELFORE = 2067,\n\n        //!\n        SCI_SETSELBACK = 2068,\n\n        //!\n        SCI_SETCARETFORE = 2069,\n\n        //!\n        SCI_ASSIGNCMDKEY = 2070,\n\n        //!\n        SCI_CLEARCMDKEY = 2071,\n\n        //!\n        SCI_CLEARALLCMDKEYS = 2072,\n\n        //!\n        SCI_SETSTYLINGEX = 2073,\n\n        //!\n        SCI_STYLESETVISIBLE = 2074,\n\n        //!\n        SCI_GETCARETPERIOD = 2075,\n\n        //!\n        SCI_SETCARETPERIOD = 2076,\n\n        //!\n        SCI_SETWORDCHARS = 2077,\n\n        //!\n        SCI_BEGINUNDOACTION = 2078,\n\n        //!\n        SCI_ENDUNDOACTION = 2079,\n\n        //!\n        SCI_INDICSETSTYLE = 2080,\n\n        //!\n        SCI_INDICGETSTYLE = 2081,\n\n        //!\n        SCI_INDICSETFORE = 2082,\n\n        //!\n        SCI_INDICGETFORE = 2083,\n\n        //!\n        SCI_SETWHITESPACEFORE = 2084,\n\n        //!\n        SCI_SETWHITESPACEBACK = 2085,\n\n        //!\n        SCI_SETWHITESPACESIZE = 2086,\n\n        //!\n        SCI_GETWHITESPACESIZE = 2087,\n\n        //!\n        SCI_SETSTYLEBITS = 2090,\n\n        //!\n        SCI_GETSTYLEBITS = 2091,\n\n        //!\n        SCI_SETLINESTATE = 2092,\n\n        //!\n        SCI_GETLINESTATE = 2093,\n\n        //!\n        SCI_GETMAXLINESTATE = 2094,\n\n        //!\n        SCI_GETCARETLINEVISIBLE = 2095,\n\n        //!\n        SCI_SETCARETLINEVISIBLE = 2096,\n\n        //!\n        SCI_GETCARETLINEBACK = 2097,\n\n        //!\n        SCI_SETCARETLINEBACK = 2098,\n\n        //!\n        SCI_STYLESETCHANGEABLE = 2099,\n\n        //!\n        SCI_AUTOCSHOW = 2100,\n\n        //!\n        SCI_AUTOCCANCEL = 2101,\n\n        //!\n        SCI_AUTOCACTIVE = 2102,\n\n        //!\n        SCI_AUTOCPOSSTART = 2103,\n\n        //!\n        SCI_AUTOCCOMPLETE = 2104,\n\n        //!\n        SCI_AUTOCSTOPS = 2105,\n\n        //!\n        SCI_AUTOCSETSEPARATOR = 2106,\n\n        //!\n        SCI_AUTOCGETSEPARATOR = 2107,\n\n        //!\n        SCI_AUTOCSELECT = 2108,\n\n        //!\n        SCI_AUTOCSETCANCELATSTART = 2110,\n\n        //!\n        SCI_AUTOCGETCANCELATSTART = 2111,\n\n        //!\n        SCI_AUTOCSETFILLUPS = 2112,\n\n        //!\n        SCI_AUTOCSETCHOOSESINGLE = 2113,\n\n        //!\n        SCI_AUTOCGETCHOOSESINGLE = 2114,\n\n        //!\n        SCI_AUTOCSETIGNORECASE = 2115,\n\n        //!\n        SCI_AUTOCGETIGNORECASE = 2116,\n\n        //!\n        SCI_USERLISTSHOW = 2117,\n\n        //!\n        SCI_AUTOCSETAUTOHIDE = 2118,\n\n        //!\n        SCI_AUTOCGETAUTOHIDE = 2119,\n\n        //!\n        SCI_AUTOCSETDROPRESTOFWORD = 2270,\n\n        //!\n        SCI_AUTOCGETDROPRESTOFWORD = 2271,\n\n        //!\n        SCI_SETINDENT = 2122,\n\n        //!\n        SCI_GETINDENT = 2123,\n\n        //!\n        SCI_SETUSETABS = 2124,\n\n        //!\n        SCI_GETUSETABS = 2125,\n\n        //!\n        SCI_SETLINEINDENTATION = 2126,\n\n        //!\n        SCI_GETLINEINDENTATION = 2127,\n\n        //!\n        SCI_GETLINEINDENTPOSITION = 2128,\n\n        //!\n        SCI_GETCOLUMN = 2129,\n\n        //!\n        SCI_SETHSCROLLBAR = 2130,\n\n        //!\n        SCI_GETHSCROLLBAR = 2131,\n\n        //!\n        SCI_SETINDENTATIONGUIDES = 2132,\n\n        //!\n        SCI_GETINDENTATIONGUIDES = 2133,\n\n        //!\n        SCI_SETHIGHLIGHTGUIDE = 2134,\n\n        //!\n        SCI_GETHIGHLIGHTGUIDE = 2135,\n\n        //!\n        SCI_GETLINEENDPOSITION = 2136,\n\n        //!\n        SCI_GETCODEPAGE = 2137,\n\n        //!\n        SCI_GETCARETFORE = 2138,\n\n        //! This message returns a non-zero value if the document is read-only.\n        //! \n        //! \\sa SCI_SETREADONLY\n        SCI_GETREADONLY = 2140,\n\n        //! This message sets the current position.\n        //! \\a wParam is the new current position.\n        //! \n        //! \\sa SCI_GETCURRENTPOS\n        SCI_SETCURRENTPOS = 2141,\n\n        //!\n        SCI_SETSELECTIONSTART = 2142,\n\n        //!\n        SCI_GETSELECTIONSTART = 2143,\n\n        //!\n        SCI_SETSELECTIONEND = 2144,\n\n        //!\n        SCI_GETSELECTIONEND = 2145,\n\n        //!\n        SCI_SETPRINTMAGNIFICATION = 2146,\n\n        //!\n        SCI_GETPRINTMAGNIFICATION = 2147,\n\n        //!\n        SCI_SETPRINTCOLOURMODE = 2148,\n\n        //!\n        SCI_GETPRINTCOLOURMODE = 2149,\n\n        //!\n        SCI_FINDTEXT = 2150,\n\n        //!\n        SCI_FORMATRANGE = 2151,\n\n        //!\n        SCI_GETFIRSTVISIBLELINE = 2152,\n\n        //!\n        SCI_GETLINE = 2153,\n\n        //!\n        SCI_GETLINECOUNT = 2154,\n\n        //!\n        SCI_SETMARGINLEFT = 2155,\n\n        //!\n        SCI_GETMARGINLEFT = 2156,\n\n        //!\n        SCI_SETMARGINRIGHT = 2157,\n\n        //!\n        SCI_GETMARGINRIGHT = 2158,\n\n        //! This message returns a non-zero value if the document has been\n        //! modified.\n        SCI_GETMODIFY = 2159,\n\n        //!\n        SCI_SETSEL = 2160,\n\n        //!\n        SCI_GETSELTEXT = 2161,\n\n        //!\n        SCI_GETTEXTRANGE = 2162,\n\n        //!\n        SCI_HIDESELECTION = 2163,\n\n        //!\n        SCI_POINTXFROMPOSITION = 2164,\n\n        //!\n        SCI_POINTYFROMPOSITION = 2165,\n\n        //!\n        SCI_LINEFROMPOSITION = 2166,\n\n        //!\n        SCI_POSITIONFROMLINE = 2167,\n\n        //!\n        SCI_LINESCROLL = 2168,\n\n        //!\n        SCI_SCROLLCARET = 2169,\n\n        //!\n        SCI_REPLACESEL = 2170,\n\n        //! This message sets the read-only state of the document.\n        //! \\a wParam is the new read-only state of the document.\n        //! \n        //! \\sa SCI_GETREADONLY\n        SCI_SETREADONLY = 2171,\n\n        //!\n        SCI_NULL = 2172,\n\n        //!\n        SCI_CANPASTE = 2173,\n\n        //!\n        SCI_CANUNDO = 2174,\n\n        //! This message empties the undo buffer.\n        SCI_EMPTYUNDOBUFFER = 2175,\n\n        //!\n        SCI_UNDO = 2176,\n\n        //!\n        SCI_CUT = 2177,\n\n        //!\n        SCI_COPY = 2178,\n\n        //!\n        SCI_PASTE = 2179,\n\n        //!\n        SCI_CLEAR = 2180,\n\n        //! This message sets the text of the document.\n        //! \\a wParam is unused.\n        //! \\a lParam is the new text of the document.\n        //! \n        //! \\sa SCI_GETTEXT\n        SCI_SETTEXT = 2181,\n\n        //! This message gets the text of the document.\n        //! \\a wParam is size of the buffer that the text is copied to.\n        //! \\a lParam is the address of the buffer that the text is copied to.\n        //! \n        //! \\sa SCI_SETTEXT\n        SCI_GETTEXT = 2182,\n\n        //! This message returns the length of the document.\n        SCI_GETTEXTLENGTH = 2183,\n\n        //!\n        SCI_GETDIRECTFUNCTION = 2184,\n\n        //!\n        SCI_GETDIRECTPOINTER = 2185,\n\n        //!\n        SCI_SETOVERTYPE = 2186,\n\n        //!\n        SCI_GETOVERTYPE = 2187,\n\n        //!\n        SCI_SETCARETWIDTH = 2188,\n\n        //!\n        SCI_GETCARETWIDTH = 2189,\n\n        //!\n        SCI_SETTARGETSTART = 2190,\n\n        //!\n        SCI_GETTARGETSTART = 2191,\n\n        //!\n        SCI_SETTARGETEND = 2192,\n\n        //!\n        SCI_GETTARGETEND = 2193,\n\n        //!\n        SCI_REPLACETARGET = 2194,\n\n        //!\n        SCI_REPLACETARGETRE = 2195,\n\n        //!\n        SCI_SEARCHINTARGET = 2197,\n\n        //!\n        SCI_SETSEARCHFLAGS = 2198,\n\n        //!\n        SCI_GETSEARCHFLAGS = 2199,\n\n        //!\n        SCI_CALLTIPSHOW = 2200,\n\n        //!\n        SCI_CALLTIPCANCEL = 2201,\n\n        //!\n        SCI_CALLTIPACTIVE = 2202,\n\n        //!\n        SCI_CALLTIPPOSSTART = 2203,\n\n        //!\n        SCI_CALLTIPSETHLT = 2204,\n\n        //!\n        SCI_CALLTIPSETBACK = 2205,\n\n        //!\n        SCI_CALLTIPSETFORE = 2206,\n\n        //!\n        SCI_CALLTIPSETFOREHLT = 2207,\n\n        //!\n        SCI_AUTOCSETMAXWIDTH = 2208,\n\n        //!\n        SCI_AUTOCGETMAXWIDTH = 2209,\n\n        //! This message is not implemented.\n        SCI_AUTOCSETMAXHEIGHT = 2210,\n\n        //!\n        SCI_AUTOCGETMAXHEIGHT = 2211,\n\n        //!\n        SCI_CALLTIPUSESTYLE = 2212,\n\n        //!\n        SCI_CALLTIPSETPOSITION = 2213,\n\n        //!\n        SCI_VISIBLEFROMDOCLINE = 2220,\n\n        //!\n        SCI_DOCLINEFROMVISIBLE = 2221,\n\n        //!\n        SCI_SETFOLDLEVEL = 2222,\n\n        //!\n        SCI_GETFOLDLEVEL = 2223,\n\n        //!\n        SCI_GETLASTCHILD = 2224,\n\n        //!\n        SCI_GETFOLDPARENT = 2225,\n\n        //!\n        SCI_SHOWLINES = 2226,\n\n        //!\n        SCI_HIDELINES = 2227,\n\n        //!\n        SCI_GETLINEVISIBLE = 2228,\n\n        //!\n        SCI_SETFOLDEXPANDED = 2229,\n\n        //!\n        SCI_GETFOLDEXPANDED = 2230,\n\n        //!\n        SCI_TOGGLEFOLD = 2231,\n\n        //!\n        SCI_ENSUREVISIBLE = 2232,\n\n        //!\n        SCI_SETFOLDFLAGS = 2233,\n\n        //!\n        SCI_ENSUREVISIBLEENFORCEPOLICY = 2234,\n\n        //!\n        SCI_WRAPCOUNT = 2235,\n\n        //!\n        SCI_GETALLLINESVISIBLE = 2236,\n\n        //!\n        SCI_FOLDLINE = 2237,\n\n        //!\n        SCI_FOLDCHILDREN = 2238,\n\n        //!\n        SCI_EXPANDCHILDREN = 2239,\n\n        //!\n        SCI_SETTABINDENTS = 2260,\n\n        //!\n        SCI_GETTABINDENTS = 2261,\n\n        //!\n        SCI_SETBACKSPACEUNINDENTS = 2262,\n\n        //!\n        SCI_GETBACKSPACEUNINDENTS = 2263,\n\n        //!\n        SCI_SETMOUSEDWELLTIME = 2264,\n\n        //!\n        SCI_GETMOUSEDWELLTIME = 2265,\n\n        //!\n        SCI_WORDSTARTPOSITION = 2266,\n\n        //!\n        SCI_WORDENDPOSITION = 2267,\n\n        //!\n        SCI_SETWRAPMODE = 2268,\n\n        //!\n        SCI_GETWRAPMODE = 2269,\n\n        //!\n        SCI_SETLAYOUTCACHE = 2272,\n\n        //!\n        SCI_GETLAYOUTCACHE = 2273,\n\n        //!\n        SCI_SETSCROLLWIDTH = 2274,\n\n        //!\n        SCI_GETSCROLLWIDTH = 2275,\n\n        //! This message returns the width of some text when rendered in a\n        //! particular style.\n        //! \\a wParam is the style number and is one of the STYLE_* values or\n        //! one of the styles defined by a lexer.\n        //! \\a lParam is a pointer to the text.\n        SCI_TEXTWIDTH = 2276,\n\n        //!\n        SCI_SETENDATLASTLINE = 2277,\n\n        //!\n        SCI_GETENDATLASTLINE = 2278,\n\n        //!\n        SCI_TEXTHEIGHT = 2279,\n\n        //!\n        SCI_SETVSCROLLBAR = 2280,\n\n        //!\n        SCI_GETVSCROLLBAR = 2281,\n\n        //!\n        SCI_APPENDTEXT = 2282,\n\n        //!\n        SCI_GETTWOPHASEDRAW = 2283,\n\n        //!\n        SCI_SETTWOPHASEDRAW = 2284,\n\n        //!\n        SCI_AUTOCGETTYPESEPARATOR = 2285,\n\n        //!\n        SCI_AUTOCSETTYPESEPARATOR = 2286,\n\n        //!\n        SCI_TARGETFROMSELECTION = 2287,\n\n        //!\n        SCI_LINESJOIN = 2288,\n\n        //!\n        SCI_LINESSPLIT = 2289,\n\n        //!\n        SCI_SETFOLDMARGINCOLOUR = 2290,\n\n        //!\n        SCI_SETFOLDMARGINHICOLOUR = 2291,\n\n        //!\n        SCI_MARKERSETBACKSELECTED = 2292,\n\n        //!\n        SCI_MARKERENABLEHIGHLIGHT = 2293,\n\n        //!\n        SCI_LINEDOWN = 2300,\n\n        //!\n        SCI_LINEDOWNEXTEND = 2301,\n\n        //!\n        SCI_LINEUP = 2302,\n\n        //!\n        SCI_LINEUPEXTEND = 2303,\n\n        //!\n        SCI_CHARLEFT = 2304,\n\n        //!\n        SCI_CHARLEFTEXTEND = 2305,\n\n        //!\n        SCI_CHARRIGHT = 2306,\n\n        //!\n        SCI_CHARRIGHTEXTEND = 2307,\n\n        //!\n        SCI_WORDLEFT = 2308,\n\n        //!\n        SCI_WORDLEFTEXTEND = 2309,\n\n        //!\n        SCI_WORDRIGHT = 2310,\n\n        //!\n        SCI_WORDRIGHTEXTEND = 2311,\n\n        //!\n        SCI_HOME = 2312,\n\n        //!\n        SCI_HOMEEXTEND = 2313,\n\n        //!\n        SCI_LINEEND = 2314,\n\n        //!\n        SCI_LINEENDEXTEND = 2315,\n\n        //!\n        SCI_DOCUMENTSTART = 2316,\n\n        //!\n        SCI_DOCUMENTSTARTEXTEND = 2317,\n\n        //!\n        SCI_DOCUMENTEND = 2318,\n\n        //!\n        SCI_DOCUMENTENDEXTEND = 2319,\n\n        //!\n        SCI_PAGEUP = 2320,\n\n        //!\n        SCI_PAGEUPEXTEND = 2321,\n\n        //!\n        SCI_PAGEDOWN = 2322,\n\n        //!\n        SCI_PAGEDOWNEXTEND = 2323,\n\n        //!\n        SCI_EDITTOGGLEOVERTYPE = 2324,\n\n        //!\n        SCI_CANCEL = 2325,\n\n        //!\n        SCI_DELETEBACK = 2326,\n\n        //!\n        SCI_TAB = 2327,\n\n        //!\n        SCI_BACKTAB = 2328,\n\n        //!\n        SCI_NEWLINE = 2329,\n\n        //!\n        SCI_FORMFEED = 2330,\n\n        //!\n        SCI_VCHOME = 2331,\n\n        //!\n        SCI_VCHOMEEXTEND = 2332,\n\n        //!\n        SCI_ZOOMIN = 2333,\n\n        //!\n        SCI_ZOOMOUT = 2334,\n\n        //!\n        SCI_DELWORDLEFT = 2335,\n\n        //!\n        SCI_DELWORDRIGHT = 2336,\n\n        //!\n        SCI_LINECUT = 2337,\n\n        //!\n        SCI_LINEDELETE = 2338,\n\n        //!\n        SCI_LINETRANSPOSE = 2339,\n\n        //!\n        SCI_LOWERCASE = 2340,\n\n        //!\n        SCI_UPPERCASE = 2341,\n\n        //!\n        SCI_LINESCROLLDOWN = 2342,\n\n        //!\n        SCI_LINESCROLLUP = 2343,\n\n        //!\n        SCI_DELETEBACKNOTLINE = 2344,\n\n        //!\n        SCI_HOMEDISPLAY = 2345,\n\n        //!\n        SCI_HOMEDISPLAYEXTEND = 2346,\n\n        //!\n        SCI_LINEENDDISPLAY = 2347,\n\n        //!\n        SCI_LINEENDDISPLAYEXTEND = 2348,\n\n        //!\n        SCI_MOVECARETINSIDEVIEW = 2401,\n\n        //!\n        SCI_LINELENGTH = 2350,\n\n        //!\n        SCI_BRACEHIGHLIGHT = 2351,\n\n        //!\n        SCI_BRACEBADLIGHT = 2352,\n\n        //!\n        SCI_BRACEMATCH = 2353,\n\n        //!\n        SCI_GETVIEWEOL = 2355,\n\n        //!\n        SCI_SETVIEWEOL = 2356,\n\n        //!\n        SCI_GETDOCPOINTER = 2357,\n\n        //!\n        SCI_SETDOCPOINTER = 2358,\n\n        //!\n        SCI_SETMODEVENTMASK = 2359,\n\n        //!\n        SCI_GETEDGECOLUMN = 2360,\n\n        //!\n        SCI_SETEDGECOLUMN = 2361,\n\n        //!\n        SCI_GETEDGEMODE = 2362,\n\n        //!\n        SCI_SETEDGEMODE = 2363,\n\n        //!\n        SCI_GETEDGECOLOUR = 2364,\n\n        //!\n        SCI_SETEDGECOLOUR = 2365,\n\n        //!\n        SCI_SEARCHANCHOR = 2366,\n\n        //!\n        SCI_SEARCHNEXT = 2367,\n\n        //!\n        SCI_SEARCHPREV = 2368,\n\n        //!\n        SCI_LINESONSCREEN = 2370,\n\n        //!\n        SCI_USEPOPUP = 2371,\n\n        //!\n        SCI_SELECTIONISRECTANGLE = 2372,\n\n        //!\n        SCI_SETZOOM = 2373,\n\n        //!\n        SCI_GETZOOM = 2374,\n\n        //!\n        SCI_CREATEDOCUMENT = 2375,\n\n        //!\n        SCI_ADDREFDOCUMENT = 2376,\n\n        //!\n        SCI_RELEASEDOCUMENT = 2377,\n\n        //!\n        SCI_GETMODEVENTMASK = 2378,\n\n        //!\n        SCI_SETFOCUS = 2380,\n\n        //!\n        SCI_GETFOCUS = 2381,\n\n        //!\n        SCI_SETSTATUS = 2382,\n\n        //!\n        SCI_GETSTATUS = 2383,\n\n        //!\n        SCI_SETMOUSEDOWNCAPTURES = 2384,\n\n        //!\n        SCI_GETMOUSEDOWNCAPTURES = 2385,\n\n        //!\n        SCI_SETCURSOR = 2386,\n\n        //!\n        SCI_GETCURSOR = 2387,\n\n        //!\n        SCI_SETCONTROLCHARSYMBOL = 2388,\n\n        //!\n        SCI_GETCONTROLCHARSYMBOL = 2389,\n\n        //!\n        SCI_WORDPARTLEFT = 2390,\n\n        //!\n        SCI_WORDPARTLEFTEXTEND = 2391,\n\n        //!\n        SCI_WORDPARTRIGHT = 2392,\n\n        //!\n        SCI_WORDPARTRIGHTEXTEND = 2393,\n\n        //!\n        SCI_SETVISIBLEPOLICY = 2394,\n\n        //!\n        SCI_DELLINELEFT = 2395,\n\n        //!\n        SCI_DELLINERIGHT = 2396,\n\n        //!\n        SCI_SETXOFFSET = 2397,\n\n        //!\n        SCI_GETXOFFSET = 2398,\n\n        //!\n        SCI_CHOOSECARETX = 2399,\n\n        //!\n        SCI_GRABFOCUS = 2400,\n\n        //!\n        SCI_SETXCARETPOLICY = 2402,\n\n        //!\n        SCI_SETYCARETPOLICY = 2403,\n\n        //!\n        SCI_LINEDUPLICATE = 2404,\n\n        //! This message takes a copy of an image and registers it so that it\n        //! can be refered to by a unique integer identifier.\n        //! \\a wParam is the image's identifier.\n        //! \\a lParam is a pointer to a QPixmap instance.  Note that in other\n        //! ports of Scintilla this is a pointer to either raw or textual XPM\n        //! image data.\n        //!\n        //! \\sa SCI_CLEARREGISTEREDIMAGES, SCI_REGISTERRGBAIMAGE\n        SCI_REGISTERIMAGE = 2405,\n\n        //!\n        SCI_SETPRINTWRAPMODE = 2406,\n\n        //!\n        SCI_GETPRINTWRAPMODE = 2407,\n\n        //! This message de-registers all currently registered images.\n        //!\n        //! \\sa SCI_REGISTERIMAGE, SCI_REGISTERRGBAIMAGE\n        SCI_CLEARREGISTEREDIMAGES = 2408,\n\n        //!\n        SCI_STYLESETHOTSPOT = 2409,\n\n        //!\n        SCI_SETHOTSPOTACTIVEFORE = 2410,\n\n        //!\n        SCI_SETHOTSPOTACTIVEBACK = 2411,\n\n        //!\n        SCI_SETHOTSPOTACTIVEUNDERLINE = 2412,\n\n        //!\n        SCI_PARADOWN = 2413,\n\n        //!\n        SCI_PARADOWNEXTEND = 2414,\n\n        //!\n        SCI_PARAUP = 2415,\n\n        //!\n        SCI_PARAUPEXTEND = 2416,\n\n        //!\n        SCI_POSITIONBEFORE = 2417,\n\n        //!\n        SCI_POSITIONAFTER = 2418,\n\n        //!\n        SCI_COPYRANGE = 2419,\n\n        //!\n        SCI_COPYTEXT = 2420,\n\n        //!\n        SCI_SETHOTSPOTSINGLELINE = 2421,\n\n        //!\n        SCI_SETSELECTIONMODE = 2422,\n\n        //!\n        SCI_GETSELECTIONMODE = 2423,\n\n        //!\n        SCI_GETLINESELSTARTPOSITION = 2424,\n\n        //!\n        SCI_GETLINESELENDPOSITION = 2425,\n\n        //!\n        SCI_LINEDOWNRECTEXTEND = 2426,\n\n        //!\n        SCI_LINEUPRECTEXTEND = 2427,\n\n        //!\n        SCI_CHARLEFTRECTEXTEND = 2428,\n\n        //!\n        SCI_CHARRIGHTRECTEXTEND = 2429,\n\n        //!\n        SCI_HOMERECTEXTEND = 2430,\n\n        //!\n        SCI_VCHOMERECTEXTEND = 2431,\n\n        //!\n        SCI_LINEENDRECTEXTEND = 2432,\n\n        //!\n        SCI_PAGEUPRECTEXTEND = 2433,\n\n        //!\n        SCI_PAGEDOWNRECTEXTEND = 2434,\n\n        //!\n        SCI_STUTTEREDPAGEUP = 2435,\n\n        //!\n        SCI_STUTTEREDPAGEUPEXTEND = 2436,\n\n        //!\n        SCI_STUTTEREDPAGEDOWN = 2437,\n\n        //!\n        SCI_STUTTEREDPAGEDOWNEXTEND = 2438,\n\n        //!\n        SCI_WORDLEFTEND = 2439,\n\n        //!\n        SCI_WORDLEFTENDEXTEND = 2440,\n\n        //!\n        SCI_WORDRIGHTEND = 2441,\n\n        //!\n        SCI_WORDRIGHTENDEXTEND = 2442,\n\n        //!\n        SCI_SETWHITESPACECHARS = 2443,\n\n        //!\n        SCI_SETCHARSDEFAULT = 2444,\n\n        //!\n        SCI_AUTOCGETCURRENT = 2445,\n\n        //!\n        SCI_ALLOCATE = 2446,\n\n        //!\n        SCI_HOMEWRAP = 2349,\n\n        //!\n        SCI_HOMEWRAPEXTEND = 2450,\n\n        //!\n        SCI_LINEENDWRAP = 2451,\n\n        //!\n        SCI_LINEENDWRAPEXTEND = 2452,\n\n        //!\n        SCI_VCHOMEWRAP = 2453,\n\n        //!\n        SCI_VCHOMEWRAPEXTEND = 2454,\n\n        //!\n        SCI_LINECOPY = 2455,\n\n        //!\n        SCI_FINDCOLUMN = 2456,\n\n        //!\n        SCI_GETCARETSTICKY = 2457,\n\n        //!\n        SCI_SETCARETSTICKY = 2458,\n\n        //!\n        SCI_TOGGLECARETSTICKY = 2459,\n\n        //!\n        SCI_SETWRAPVISUALFLAGS = 2460,\n\n        //!\n        SCI_GETWRAPVISUALFLAGS = 2461,\n\n        //!\n        SCI_SETWRAPVISUALFLAGSLOCATION = 2462,\n\n        //!\n        SCI_GETWRAPVISUALFLAGSLOCATION = 2463,\n\n        //!\n        SCI_SETWRAPSTARTINDENT = 2464,\n\n        //!\n        SCI_GETWRAPSTARTINDENT = 2465,\n\n        //!\n        SCI_MARKERADDSET = 2466,\n\n        //!\n        SCI_SETPASTECONVERTENDINGS = 2467,\n\n        //!\n        SCI_GETPASTECONVERTENDINGS = 2468,\n\n        //!\n        SCI_SELECTIONDUPLICATE = 2469,\n\n        //!\n        SCI_SETCARETLINEBACKALPHA = 2470,\n\n        //!\n        SCI_GETCARETLINEBACKALPHA = 2471,\n\n        //!\n        SCI_SETWRAPINDENTMODE = 2472,\n\n        //!\n        SCI_GETWRAPINDENTMODE = 2473,\n\n        //!\n        SCI_MARKERSETALPHA = 2476,\n\n        //!\n        SCI_GETSELALPHA = 2477,\n\n        //!\n        SCI_SETSELALPHA = 2478,\n\n        //!\n        SCI_GETSELEOLFILLED = 2479,\n\n        //!\n        SCI_SETSELEOLFILLED = 2480,\n\n        //!\n        SCI_STYLEGETFORE = 2481,\n\n        //!\n        SCI_STYLEGETBACK = 2482,\n\n        //!\n        SCI_STYLEGETBOLD = 2483,\n\n        //!\n        SCI_STYLEGETITALIC = 2484,\n\n        //!\n        SCI_STYLEGETSIZE = 2485,\n\n        //!\n        SCI_STYLEGETFONT = 2486,\n\n        //!\n        SCI_STYLEGETEOLFILLED = 2487,\n\n        //!\n        SCI_STYLEGETUNDERLINE = 2488,\n\n        //!\n        SCI_STYLEGETCASE = 2489,\n\n        //!\n        SCI_STYLEGETCHARACTERSET = 2490,\n\n        //!\n        SCI_STYLEGETVISIBLE = 2491,\n\n        //!\n        SCI_STYLEGETCHANGEABLE = 2492,\n\n        //!\n        SCI_STYLEGETHOTSPOT = 2493,\n\n        //!\n        SCI_GETHOTSPOTACTIVEFORE = 2494,\n\n        //!\n        SCI_GETHOTSPOTACTIVEBACK = 2495,\n\n        //!\n        SCI_GETHOTSPOTACTIVEUNDERLINE = 2496,\n\n        //!\n        SCI_GETHOTSPOTSINGLELINE = 2497,\n\n        //!\n        SCI_BRACEHIGHLIGHTINDICATOR = 2498,\n\n        //!\n        SCI_BRACEBADLIGHTINDICATOR = 2499,\n\n        //!\n        SCI_SETINDICATORCURRENT = 2500,\n\n        //!\n        SCI_GETINDICATORCURRENT = 2501,\n\n        //!\n        SCI_SETINDICATORVALUE = 2502,\n\n        //!\n        SCI_GETINDICATORVALUE = 2503,\n\n        //!\n        SCI_INDICATORFILLRANGE = 2504,\n\n        //!\n        SCI_INDICATORCLEARRANGE = 2505,\n\n        //!\n        SCI_INDICATORALLONFOR = 2506,\n\n        //!\n        SCI_INDICATORVALUEAT = 2507,\n\n        //!\n        SCI_INDICATORSTART = 2508,\n\n        //!\n        SCI_INDICATOREND = 2509,\n\n        //!\n        SCI_INDICSETUNDER = 2510,\n\n        //!\n        SCI_INDICGETUNDER = 2511,\n\n        //!\n        SCI_SETCARETSTYLE = 2512,\n\n        //!\n        SCI_GETCARETSTYLE = 2513,\n\n        //!\n        SCI_SETPOSITIONCACHE = 2514,\n\n        //!\n        SCI_GETPOSITIONCACHE = 2515,\n\n        //!\n        SCI_SETSCROLLWIDTHTRACKING = 2516,\n\n        //!\n        SCI_GETSCROLLWIDTHTRACKING = 2517,\n\n        //!\n        SCI_DELWORDRIGHTEND = 2518,\n\n        //! This message copies the selection.  If the selection is empty then\n        //! copy the line with the caret.\n        SCI_COPYALLOWLINE = 2519,\n\n        //! This message returns a pointer to the document text.  Any\n        //! subsequent message will invalidate the pointer.\n        SCI_GETCHARACTERPOINTER = 2520,\n\n        //!\n        SCI_SETKEYSUNICODE = 2521,\n\n        //!\n        SCI_GETKEYSUNICODE = 2522,\n\n        //!\n        SCI_INDICSETALPHA = 2523,\n\n        //!\n        SCI_INDICGETALPHA = 2524,\n\n        //!\n        SCI_SETEXTRAASCENT = 2525,\n\n        //!\n        SCI_GETEXTRAASCENT = 2526,\n\n        //!\n        SCI_SETEXTRADESCENT = 2527,\n\n        //!\n        SCI_GETEXTRADESCENT = 2528,\n\n        //!\n        SCI_MARKERSYMBOLDEFINED = 2529,\n\n        //!\n        SCI_MARGINSETTEXT = 2530,\n\n        //!\n        SCI_MARGINGETTEXT = 2531,\n\n        //!\n        SCI_MARGINSETSTYLE = 2532,\n\n        //!\n        SCI_MARGINGETSTYLE = 2533,\n\n        //!\n        SCI_MARGINSETSTYLES = 2534,\n\n        //!\n        SCI_MARGINGETSTYLES = 2535,\n\n        //!\n        SCI_MARGINTEXTCLEARALL = 2536,\n\n        //!\n        SCI_MARGINSETSTYLEOFFSET = 2537,\n\n        //!\n        SCI_MARGINGETSTYLEOFFSET = 2538,\n\n        //!\n        SCI_SETMARGINOPTIONS = 2539,\n\n        //!\n        SCI_ANNOTATIONSETTEXT = 2540,\n\n        //!\n        SCI_ANNOTATIONGETTEXT = 2541,\n\n        //!\n        SCI_ANNOTATIONSETSTYLE = 2542,\n\n        //!\n        SCI_ANNOTATIONGETSTYLE = 2543,\n\n        //!\n        SCI_ANNOTATIONSETSTYLES = 2544,\n\n        //!\n        SCI_ANNOTATIONGETSTYLES = 2545,\n\n        //!\n        SCI_ANNOTATIONGETLINES = 2546,\n\n        //!\n        SCI_ANNOTATIONCLEARALL = 2547,\n\n        //!\n        SCI_ANNOTATIONSETVISIBLE = 2548,\n\n        //!\n        SCI_ANNOTATIONGETVISIBLE = 2549,\n\n        //!\n        SCI_ANNOTATIONSETSTYLEOFFSET = 2550,\n\n        //!\n        SCI_ANNOTATIONGETSTYLEOFFSET = 2551,\n\n        //!\n        SCI_RELEASEALLEXTENDEDSTYLES = 2552,\n\n        //!\n        SCI_ALLOCATEEXTENDEDSTYLES = 2553,\n\n        //!\n        SCI_SETEMPTYSELECTION = 2556,\n\n        //!\n        SCI_GETMARGINOPTIONS = 2557,\n\n        //!\n        SCI_INDICSETOUTLINEALPHA = 2558,\n\n        //!\n        SCI_INDICGETOUTLINEALPHA = 2559,\n\n        //!\n        SCI_ADDUNDOACTION = 2560,\n\n        //!\n        SCI_CHARPOSITIONFROMPOINT = 2561,\n\n        //!\n        SCI_CHARPOSITIONFROMPOINTCLOSE = 2562,\n\n        //!\n        SCI_SETMULTIPLESELECTION = 2563,\n\n        //!\n        SCI_GETMULTIPLESELECTION = 2564,\n\n        //!\n        SCI_SETADDITIONALSELECTIONTYPING = 2565,\n\n        //!\n        SCI_GETADDITIONALSELECTIONTYPING = 2566,\n\n        //!\n        SCI_SETADDITIONALCARETSBLINK = 2567,\n\n        //!\n        SCI_GETADDITIONALCARETSBLINK = 2568,\n\n        //!\n        SCI_SCROLLRANGE = 2569,\n\n        //!\n        SCI_SETADDITIONALCARETSVISIBLE = 2608,\n\n        //!\n        SCI_GETADDITIONALCARETSVISIBLE = 2609,\n\n        //!\n        SCI_AUTOCGETCURRENTTEXT = 2610,\n\n        //!\n        SCI_GETSELECTIONS = 2570,\n\n        //!\n        SCI_CLEARSELECTIONS = 2571,\n\n        //!\n        SCI_SETSELECTION = 2572,\n\n        //!\n        SCI_ADDSELECTION = 2573,\n\n        //!\n        SCI_SETMAINSELECTION = 2574,\n\n        //!\n        SCI_GETMAINSELECTION = 2575,\n\n        //!\n        SCI_SETSELECTIONNCARET = 2576,\n\n        //!\n        SCI_GETSELECTIONNCARET = 2577,\n\n        //!\n        SCI_SETSELECTIONNANCHOR = 2578,\n\n        //!\n        SCI_GETSELECTIONNANCHOR = 2579,\n\n        //!\n        SCI_SETSELECTIONNCARETVIRTUALSPACE = 2580,\n\n        //!\n        SCI_GETSELECTIONNCARETVIRTUALSPACE = 2581,\n\n        //!\n        SCI_SETSELECTIONNANCHORVIRTUALSPACE = 2582,\n\n        //!\n        SCI_GETSELECTIONNANCHORVIRTUALSPACE = 2583,\n\n        //!\n        SCI_SETSELECTIONNSTART = 2584,\n\n        //!\n        SCI_GETSELECTIONNSTART = 2585,\n\n        //!\n        SCI_SETSELECTIONNEND = 2586,\n\n        //!\n        SCI_GETSELECTIONNEND = 2587,\n\n        //!\n        SCI_SETRECTANGULARSELECTIONCARET = 2588,\n\n        //!\n        SCI_GETRECTANGULARSELECTIONCARET = 2589,\n\n        //!\n        SCI_SETRECTANGULARSELECTIONANCHOR = 2590,\n\n        //!\n        SCI_GETRECTANGULARSELECTIONANCHOR = 2591,\n\n        //!\n        SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE = 2592,\n\n        //!\n        SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE = 2593,\n\n        //!\n        SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE = 2594,\n\n        //!\n        SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE = 2595,\n\n        //!\n        SCI_SETVIRTUALSPACEOPTIONS = 2596,\n\n        //!\n        SCI_GETVIRTUALSPACEOPTIONS = 2597,\n\n        //!\n        SCI_SETRECTANGULARSELECTIONMODIFIER = 2598,\n\n        //!\n        SCI_GETRECTANGULARSELECTIONMODIFIER = 2599,\n\n        //!\n        SCI_SETADDITIONALSELFORE = 2600,\n\n        //!\n        SCI_SETADDITIONALSELBACK = 2601,\n\n        //!\n        SCI_SETADDITIONALSELALPHA = 2602,\n\n        //!\n        SCI_GETADDITIONALSELALPHA = 2603,\n\n        //!\n        SCI_SETADDITIONALCARETFORE = 2604,\n\n        //!\n        SCI_GETADDITIONALCARETFORE = 2605,\n\n        //!\n        SCI_ROTATESELECTION = 2606,\n\n        //!\n        SCI_SWAPMAINANCHORCARET = 2607,\n\n        //!\n        SCI_SETFONTQUALITY = 2611,\n\n        //!\n        SCI_GETFONTQUALITY = 2612,\n\n        //!\n        SCI_SETFIRSTVISIBLELINE = 2613,\n\n        //!\n        SCI_SETMULTIPASTE = 2614,\n\n        //!\n        SCI_GETMULTIPASTE = 2615,\n\n        //!\n        SCI_GETTAG = 2616,\n\n        //!\n        SCI_CHANGELEXERSTATE = 2617,\n\n        //!\n        SCI_CONTRACTEDFOLDNEXT = 2618,\n\n        //!\n        SCI_VERTICALCENTRECARET = 2619,\n\n        //!\n        SCI_MOVESELECTEDLINESUP = 2620,\n\n        //!\n        SCI_MOVESELECTEDLINESDOWN = 2621,\n\n        //!\n        SCI_SETIDENTIFIER = 2622,\n\n        //!\n        SCI_GETIDENTIFIER = 2623,\n\n        //! This message sets the width of an RGBA image specified by a future\n        //! call to SCI_MARKERDEFINERGBAIMAGE or SCI_REGISTERRGBAIMAGE.\n        //!\n        //! \\sa SCI_RGBAIMAGESETHEIGHT, SCI_MARKERDEFINERGBAIMAGE,\n        //! SCI_REGISTERRGBAIMAGE.\n        SCI_RGBAIMAGESETWIDTH = 2624,\n\n        //! This message sets the height of an RGBA image specified by a future\n        //! call to SCI_MARKERDEFINERGBAIMAGE or SCI_REGISTERRGBAIMAGE.\n        //!\n        //! \\sa SCI_RGBAIMAGESETWIDTH, SCI_MARKERDEFINERGBAIMAGE,\n        //! SCI_REGISTERRGBAIMAGE.\n        SCI_RGBAIMAGESETHEIGHT = 2625,\n\n        //! This message sets the symbol used to draw one of the 32 markers to\n        //! an RGBA image.  RGBA images use the SC_MARK_RGBAIMAGE marker\n        //! symbol.\n        //! \\a wParam is the number of the marker.\n        //! \\a lParam is a pointer to a QImage instance.  Note that in other\n        //! ports of Scintilla this is a pointer to raw RGBA image data.\n        //!\n        //! \\sa SCI_MARKERDEFINE, SCI_MARKERDEFINEPIXMAP\n        SCI_MARKERDEFINERGBAIMAGE = 2626,\n\n        //! This message takes a copy of an image and registers it so that it\n        //! can be refered to by a unique integer identifier.\n        //! \\a wParam is the image's identifier.\n        //! \\a lParam is a pointer to a QImage instance.  Note that in other\n        //! ports of Scintilla this is a pointer to raw RGBA image data.\n        //!\n        //! \\sa SCI_CLEARREGISTEREDIMAGES, SCI_REGISTERIMAGE\n        SCI_REGISTERRGBAIMAGE = 2627,\n\n        //!\n        SCI_SCROLLTOSTART = 2628,\n\n        //!\n        SCI_SCROLLTOEND = 2629,\n\n        //!\n        SCI_SETTECHNOLOGY = 2630,\n\n        //!\n        SCI_GETTECHNOLOGY = 2631,\n\n        //!\n        SCI_CREATELOADER = 2632,\n\n        //!\n        SCI_COUNTCHARACTERS = 2633,\n\n        //!\n        SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR = 2634,\n\n        //!\n        SCI_AUTOCGETCASEINSENSITIVEBEHAVIOUR = 2635,\n\n        //!\n        SCI_FINDINDICATORSHOW = 2640,\n\n        //!\n        SCI_FINDINDICATORFLASH = 2641,\n\n        //!\n        SCI_FINDINDICATORHIDE = 2642,\n\n        //!\n        SCI_GETRANGEPOINTER = 2643,\n\n        //!\n        SCI_GETGAPPOSITION = 2644,\n\n        //!\n        SCI_DELETERANGE = 2645,\n\n        //!\n        SCI_GETWORDCHARS = 2646,\n\n        //!\n        SCI_GETWHITESPACECHARS = 2647,\n\n        //!\n        SCI_SETPUNCTUATIONCHARS = 2648,\n\n        //!\n        SCI_GETPUNCTUATIONCHARS = 2649,\n\n        //!\n        SCI_GETSELECTIONEMPTY = 2650,\n\n        //!\n        SCI_RGBAIMAGESETSCALE = 2651,\n\n        //!\n        SCI_VCHOMEDISPLAY = 2652,\n\n        //!\n        SCI_GETCARETLINEVISIBLEALWAYS = 2654,\n\n        //!\n        SCI_SETCARETLINEVISIBLEALWAYS = 2655,\n\n        //!\n        SCI_VCHOMEDISPLAYEXTEND = 2653,\n\n        //!\n        SCI_AUTOCSETORDER = 2660,\n\n        //!\n        SCI_AUTOCGETORDER = 2661,\n\n        //!\n        SCI_FOLDALL = 2662,\n\n        //!\n        SCI_SETAUTOMATICFOLD = 2663,\n\n        //!\n        SCI_GETAUTOMATICFOLD = 2664,\n\n        //!\n        SCI_SETREPRESENTATION = 2665,\n\n        //!\n        SCI_GETREPRESENTATION = 2666,\n\n        //!\n        SCI_CLEARREPRESENTATION = 2667,\n\n        //!\n        SCI_SETMOUSESELECTIONRECTANGULARSWITCH = 2668,\n\n        //!\n        SCI_GETMOUSESELECTIONRECTANGULARSWITCH = 2669,\n\n        //!\n        SCI_POSITIONRELATIVE = 2670,\n\n        //!\n        SCI_STARTRECORD = 3001,\n\n        //!\n        SCI_STOPRECORD = 3002,\n\n        //! This message sets the number of the lexer to use for syntax\n        //! styling.\n        //! \\a wParam is the number of the lexer and is one of the SCLEX_*\n        //! values.\n        SCI_SETLEXER = 4001,\n\n        //! This message returns the number of the lexer being used for syntax\n        //! styling.\n        SCI_GETLEXER = 4002,\n\n        //!\n        SCI_COLOURISE = 4003,\n\n        //!\n        SCI_SETPROPERTY = 4004,\n\n        //!\n        SCI_SETKEYWORDS = 4005,\n\n        //! This message sets the name of the lexer to use for syntax styling.\n        //! \\a wParam is unused.\n        //! \\a lParam is the name of the lexer.\n        SCI_SETLEXERLANGUAGE = 4006,\n\n        //!\n        SCI_LOADLEXERLIBRARY = 4007,\n\n        //!\n        SCI_GETPROPERTY = 4008,\n\n        //!\n        SCI_GETPROPERTYEXPANDED = 4009,\n\n        //!\n        SCI_GETPROPERTYINT = 4010,\n\n        //!\n        SCI_GETSTYLEBITSNEEDED = 4011,\n\n        //!\n        SCI_GETLEXERLANGUAGE = 4012,\n\n        //!\n        SCI_PRIVATELEXERCALL = 4013,\n\n        //!\n        SCI_PROPERTYNAMES = 4014,\n\n        //!\n        SCI_PROPERTYTYPE = 4015,\n\n        //!\n        SCI_DESCRIBEPROPERTY = 4016,\n\n        //!\n        SCI_DESCRIBEKEYWORDSETS = 4017,\n    };\n\n    enum\n    {\n        SC_ALPHA_TRANSPARENT = 0,\n        SC_ALPHA_OPAQUE = 255,\n        SC_ALPHA_NOALPHA = 256\n    };\n\n    enum\n    {\n        SC_CARETSTICKY_OFF = 0,\n        SC_CARETSTICKY_ON = 1,\n        SC_CARETSTICKY_WHITESPACE = 2\n    };\n\n    enum\n    {\n        SC_EFF_QUALITY_MASK = 0x0f,\n        SC_EFF_QUALITY_DEFAULT = 0,\n        SC_EFF_QUALITY_NON_ANTIALIASED = 1,\n        SC_EFF_QUALITY_ANTIALIASED = 2,\n        SC_EFF_QUALITY_LCD_OPTIMIZED = 3\n    };\n\n    enum\n    {\n        SC_MARGINOPTION_NONE = 0x00,\n        SC_MARGINOPTION_SUBLINESELECT = 0x01\n    };\n\n    enum\n    {\n        SC_MULTIPASTE_ONCE = 0,\n        SC_MULTIPASTE_EACH = 1\n    };\n\n    enum\n    {\n        SC_TYPE_BOOLEAN = 0,\n        SC_TYPE_INTEGER = 1,\n        SC_TYPE_STRING = 2\n    };\n\n    enum\n    {\n        SC_UPDATE_CONTENT = 0x01,\n        SC_UPDATE_SELECTION = 0x02,\n        SC_UPDATE_V_SCROLL = 0x04,\n        SC_UPDATE_H_SCROLL = 0x08\n    };\n\n    enum\n    {\n        SC_WRAPVISUALFLAG_NONE = 0x0000,\n        SC_WRAPVISUALFLAG_END = 0x0001,\n        SC_WRAPVISUALFLAG_START = 0x0002,\n        SC_WRAPVISUALFLAG_MARGIN = 0x0004\n    };\n\n    enum\n    {\n        SC_WRAPVISUALFLAGLOC_DEFAULT = 0x0000,\n        SC_WRAPVISUALFLAGLOC_END_BY_TEXT = 0x0001,\n        SC_WRAPVISUALFLAGLOC_START_BY_TEXT = 0x0002\n    };\n\n    //! This enum defines the different selection modes.\n    //!\n    //! \\sa SCI_GETSELECTIONMODE, SCI_SETSELECTIONMODE\n    enum\n    {\n        SC_SEL_STREAM = 0,\n        SC_SEL_RECTANGLE = 1,\n        SC_SEL_LINES = 2,\n        SC_SEL_THIN = 3\n    };\n\n    enum\n    {\n        SCVS_NONE = 0,\n        SCVS_RECTANGULARSELECTION = 1,\n        SCVS_USERACCESSIBLE = 2\n    };\n\n    enum\n    {\n        SCWS_INVISIBLE = 0,\n        SCWS_VISIBLEALWAYS = 1,\n        SCWS_VISIBLEAFTERINDENT = 2\n    };\n\n    enum\n    {\n        SC_EOL_CRLF = 0,\n        SC_EOL_CR = 1,\n        SC_EOL_LF = 2\n    };\n\n    enum\n    {\n        SC_CP_DBCS = 1,\n        SC_CP_UTF8 = 65001\n    };\n\n    //! This enum defines the different marker symbols.\n    //!\n    //! \\sa SCI_MARKERDEFINE\n    enum\n    {\n        //! A circle.\n        SC_MARK_CIRCLE = 0,\n\n        //! A rectangle.\n        SC_MARK_ROUNDRECT = 1,\n\n        //! A triangle pointing to the right.\n        SC_MARK_ARROW = 2,\n\n        //! A smaller rectangle.\n        SC_MARK_SMALLRECT = 3,\n\n        //! An arrow pointing to the right.\n        SC_MARK_SHORTARROW = 4,\n\n        //! An invisible marker that allows code to track the movement\n        //! of lines.\n        SC_MARK_EMPTY = 5,\n\n        //! A triangle pointing down.\n        SC_MARK_ARROWDOWN = 6,\n\n        //! A drawn minus sign.\n        SC_MARK_MINUS = 7,\n\n        //! A drawn plus sign.\n        SC_MARK_PLUS = 8,\n\n        //! A vertical line drawn in the background colour.\n        SC_MARK_VLINE = 9,\n\n        //! A bottom left corner drawn in the background colour.\n        SC_MARK_LCORNER = 10,\n\n        //! A vertical line with a centre right horizontal line drawn\n        //! in the background colour.\n        SC_MARK_TCORNER = 11,\n\n        //! A drawn plus sign in a box.\n        SC_MARK_BOXPLUS = 12,\n\n        //! A drawn plus sign in a connected box.\n        SC_MARK_BOXPLUSCONNECTED = 13,\n\n        //! A drawn minus sign in a box.\n        SC_MARK_BOXMINUS = 14,\n\n        //! A drawn minus sign in a connected box.\n        SC_MARK_BOXMINUSCONNECTED = 15,\n\n        //! A rounded bottom left corner drawn in the background\n        //! colour.\n        SC_MARK_LCORNERCURVE = 16,\n\n        //! A vertical line with a centre right curved line drawn in\n        //! the background colour.\n        SC_MARK_TCORNERCURVE = 17,\n\n        //! A drawn plus sign in a circle.\n        SC_MARK_CIRCLEPLUS = 18,\n\n        //! A drawn plus sign in a connected box.\n        SC_MARK_CIRCLEPLUSCONNECTED = 19,\n\n        //! A drawn minus sign in a circle.\n        SC_MARK_CIRCLEMINUS = 20,\n\n        //! A drawn minus sign in a connected circle.\n        SC_MARK_CIRCLEMINUSCONNECTED = 21,\n\n        //! No symbol is drawn but the line is drawn with the same background\n        //! color as the marker's.\n        SC_MARK_BACKGROUND = 22,\n\n        //! Three drawn dots.\n        SC_MARK_DOTDOTDOT = 23,\n\n        //! Three drawn arrows pointing right.\n        SC_MARK_ARROWS = 24,\n\n        //! An XPM format pixmap.\n        SC_MARK_PIXMAP = 25,\n\n        //! A full rectangle (ie. the margin background) using the marker's\n        //! background color.\n        SC_MARK_FULLRECT = 26,\n\n        //! A left rectangle (ie. the left part of the margin background) using\n        //! the marker's background color.\n        SC_MARK_LEFTRECT = 27,\n\n        //! The value is available for plugins to use.\n        SC_MARK_AVAILABLE = 28,\n\n        //! The line is underlined using the marker's background color.\n        SC_MARK_UNDERLINE = 29,\n\n        //! A RGBA format image.\n        SC_MARK_RGBAIMAGE = 30,\n\n        //! Characters can be used as symbols by adding this to the ASCII value\n        //! of the character.\n        SC_MARK_CHARACTER = 10000\n    };\n\n    enum\n    {\n        SC_MARKNUM_FOLDEREND = 25,\n        SC_MARKNUM_FOLDEROPENMID = 26,\n        SC_MARKNUM_FOLDERMIDTAIL = 27,\n        SC_MARKNUM_FOLDERTAIL = 28,\n        SC_MARKNUM_FOLDERSUB = 29,\n        SC_MARKNUM_FOLDER = 30,\n        SC_MARKNUM_FOLDEROPEN = 31,\n        SC_MASK_FOLDERS = 0xfe000000\n    };\n\n    //! This enum defines what can be displayed in a margin.\n    //!\n    //! \\sa SCI_GETMARGINTYPEN, SCI_SETMARGINTYPEN\n    enum\n    {\n        //! The margin can display symbols.  Note that all margins can display\n        //! symbols.\n        SC_MARGIN_SYMBOL = 0,\n\n        //! The margin will display line numbers.\n        SC_MARGIN_NUMBER = 1,\n\n        //! The margin's background color will be set to the default background\n        //! color.\n        SC_MARGIN_BACK = 2,\n\n        //! The margin's background color will be set to the default foreground\n        //! color.\n        SC_MARGIN_FORE = 3,\n\n        //! The margin will display text.\n        SC_MARGIN_TEXT = 4,\n\n        //! The margin will display right justified text.\n        SC_MARGIN_RTEXT = 5\n    };\n\n    enum\n    {\n        STYLE_DEFAULT = 32,\n        STYLE_LINENUMBER = 33,\n        STYLE_BRACELIGHT = 34,\n        STYLE_BRACEBAD = 35,\n        STYLE_CONTROLCHAR = 36,\n        STYLE_INDENTGUIDE = 37,\n        STYLE_CALLTIP = 38,\n        STYLE_LASTPREDEFINED = 39,\n        STYLE_MAX = 255\n    };\n\n    enum\n    {\n        SC_CHARSET_ANSI = 0,\n        SC_CHARSET_DEFAULT = 1,\n        SC_CHARSET_BALTIC = 186,\n        SC_CHARSET_CHINESEBIG5 = 136,\n        SC_CHARSET_EASTEUROPE = 238,\n        SC_CHARSET_GB2312 = 134,\n        SC_CHARSET_GREEK = 161,\n        SC_CHARSET_HANGUL = 129,\n        SC_CHARSET_MAC = 77,\n        SC_CHARSET_OEM = 255,\n        SC_CHARSET_RUSSIAN = 204,\n        SC_CHARSET_SHIFTJIS = 128,\n        SC_CHARSET_SYMBOL = 2,\n        SC_CHARSET_TURKISH = 162,\n        SC_CHARSET_JOHAB = 130,\n        SC_CHARSET_HEBREW = 177,\n        SC_CHARSET_ARABIC = 178,\n        SC_CHARSET_VIETNAMESE = 163,\n        SC_CHARSET_THAI = 222,\n        SC_CHARSET_8859_15 = 1000\n    };\n\n    enum\n    {\n        SC_CASE_MIXED = 0,\n        SC_CASE_UPPER = 1,\n        SC_CASE_LOWER = 2\n    };\n\n    //! This enum defines the different indentation guide views.\n    //!\n    //! \\sa SCI_GETINDENTATIONGUIDES, SCI_SETINDENTATIONGUIDES\n    enum\n    {\n        //! No indentation guides are shown.\n        SC_IV_NONE = 0,\n\n        //! Indentation guides are shown inside real indentation white space.\n        SC_IV_REAL = 1,\n\n        //! Indentation guides are shown beyond the actual indentation up to\n        //! the level of the next non-empty line.  If the previous non-empty\n        //! line was a fold header then indentation guides are shown for one\n        //! more level of indent than that line.  This setting is good for\n        //! Python.\n        SC_IV_LOOKFORWARD = 2,\n\n        //! Indentation guides are shown beyond the actual indentation up to\n        //! the level of the next non-empty line or previous non-empty line\n        //! whichever is the greater.  This setting is good for most languages.\n        SC_IV_LOOKBOTH = 3\n    };\n\n    enum\n    {\n        INDIC_PLAIN = 0,\n        INDIC_SQUIGGLE = 1,\n        INDIC_TT = 2,\n        INDIC_DIAGONAL = 3,\n        INDIC_STRIKE = 4,\n        INDIC_HIDDEN = 5,\n        INDIC_BOX = 6,\n        INDIC_ROUNDBOX = 7,\n        INDIC_STRAIGHTBOX = 8,\n        INDIC_DASH = 9,\n        INDIC_DOTS = 10,\n        INDIC_SQUIGGLELOW = 11,\n        INDIC_DOTBOX = 12,\n        INDIC_SQUIGGLEPIXMAP = 13,\n        INDIC_COMPOSITIONTHICK = 14,\n\n        INDIC_CONTAINER = 8,\n        INDIC_MAX = 31,\n        INDIC0_MASK = 0x20,\n        INDIC1_MASK = 0x40,\n        INDIC2_MASK = 0x80,\n        INDICS_MASK = 0xe0\n    };\n\n    enum\n    {\n        SC_PRINT_NORMAL = 0,\n        SC_PRINT_INVERTLIGHT = 1,\n        SC_PRINT_BLACKONWHITE = 2,\n        SC_PRINT_COLOURONWHITE = 3,\n        SC_PRINT_COLOURONWHITEDEFAULTBG = 4\n    };\n\n    enum\n    {\n        SCFIND_WHOLEWORD = 2,\n        SCFIND_MATCHCASE = 4,\n        SCFIND_WORDSTART = 0x00100000,\n        SCFIND_REGEXP = 0x00200000,\n        SCFIND_POSIX = 0x00400000\n    };\n\n    enum\n    {\n        SC_FOLDLEVELBASE = 0x00400,\n        SC_FOLDLEVELWHITEFLAG = 0x01000,\n        SC_FOLDLEVELHEADERFLAG = 0x02000,\n        SC_FOLDLEVELNUMBERMASK = 0x00fff\n    };\n\n    enum\n    {\n        SC_FOLDFLAG_LINEBEFORE_EXPANDED = 0x0002,\n        SC_FOLDFLAG_LINEBEFORE_CONTRACTED = 0x0004,\n        SC_FOLDFLAG_LINEAFTER_EXPANDED = 0x0008,\n        SC_FOLDFLAG_LINEAFTER_CONTRACTED = 0x0010,\n        SC_FOLDFLAG_LEVELNUMBERS = 0x0040\n    };\n\n    enum\n    {\n        SC_TIME_FOREVER = 10000000\n    };\n\n    enum\n    {\n        SC_WRAP_NONE = 0,\n        SC_WRAP_WORD = 1,\n        SC_WRAP_CHAR = 2\n    };\n\n    enum\n    {\n        SC_WRAPINDENT_FIXED = 0,\n        SC_WRAPINDENT_SAME = 1,\n        SC_WRAPINDENT_INDENT = 2\n    };\n\n    enum\n    {\n        SC_CACHE_NONE = 0,\n        SC_CACHE_CARET = 1,\n        SC_CACHE_PAGE = 2,\n        SC_CACHE_DOCUMENT = 3\n    };\n\n    enum\n    {\n        ANNOTATION_HIDDEN = 0,\n        ANNOTATION_STANDARD = 1,\n        ANNOTATION_BOXED = 2\n    };\n\n    enum\n    {\n        EDGE_NONE = 0,\n        EDGE_LINE = 1,\n        EDGE_BACKGROUND = 2\n    };\n\n    enum\n    {\n        SC_CURSORNORMAL = -1,\n        SC_CURSORARROW = 2,\n        SC_CURSORWAIT = 4,\n        SC_CURSORREVERSEARROW = 7\n    };\n\n    enum\n    {\n        UNDO_MAY_COALESCE = 1\n    };\n\n    enum\n    {\n        VISIBLE_SLOP = 0x01,\n        VISIBLE_STRICT = 0x04\n    };\n\n    enum\n    {\n        CARET_SLOP = 0x01,\n        CARET_STRICT = 0x04,\n        CARET_JUMPS = 0x10,\n        CARET_EVEN = 0x08\n    };\n\n    enum\n    {\n        CARETSTYLE_INVISIBLE = 0,\n        CARETSTYLE_LINE = 1,\n        CARETSTYLE_BLOCK = 2\n    };\n\n    enum\n    {\n        SC_MOD_INSERTTEXT = 0x1,\n        SC_MOD_DELETETEXT = 0x2,\n        SC_MOD_CHANGESTYLE = 0x4,\n        SC_MOD_CHANGEFOLD = 0x8,\n        SC_PERFORMED_USER = 0x10,\n        SC_PERFORMED_UNDO = 0x20,\n        SC_PERFORMED_REDO = 0x40,\n        SC_MULTISTEPUNDOREDO = 0x80,\n        SC_LASTSTEPINUNDOREDO = 0x100,\n        SC_MOD_CHANGEMARKER = 0x200,\n        SC_MOD_BEFOREINSERT = 0x400,\n        SC_MOD_BEFOREDELETE = 0x800,\n        SC_MULTILINEUNDOREDO = 0x1000,\n        SC_STARTACTION = 0x2000,\n        SC_MOD_CHANGEINDICATOR = 0x4000,\n        SC_MOD_CHANGELINESTATE = 0x8000,\n        SC_MOD_CHANGEMARGIN = 0x10000,\n        SC_MOD_CHANGEANNOTATION = 0x20000,\n        SC_MOD_CONTAINER = 0x40000,\n        SC_MOD_LEXERSTATE = 0x80000,\n        SC_MODEVENTMASKALL = 0xfffff\n    };\n\n    enum\n    {\n        SCK_DOWN = 300,\n        SCK_UP = 301,\n        SCK_LEFT = 302,\n        SCK_RIGHT = 303,\n        SCK_HOME = 304,\n        SCK_END = 305,\n        SCK_PRIOR = 306,\n        SCK_NEXT = 307,\n        SCK_DELETE = 308,\n        SCK_INSERT = 309,\n        SCK_ESCAPE = 7,\n        SCK_BACK = 8,\n        SCK_TAB = 9,\n        SCK_RETURN = 13,\n        SCK_ADD = 310,\n        SCK_SUBTRACT = 311,\n        SCK_DIVIDE = 312,\n        SCK_WIN = 313,\n        SCK_RWIN = 314,\n        SCK_MENU = 315\n    };\n\n    //! This enum defines the different modifier keys.\n    enum\n    {\n        //! No modifier key.\n        SCMOD_NORM = 0,\n\n        //! Shift key.\n        SCMOD_SHIFT = 1,\n\n        //! Control key (the Command key on OS/X, the Ctrl key on other\n        //! platforms).\n        SCMOD_CTRL = 2,\n\n        //! Alt key.\n        SCMOD_ALT = 4,\n\n        //! This is the same as SCMOD_META on all platforms.\n        SCMOD_SUPER = 8,\n\n        //! Meta key (the Ctrl key on OS/X, the Windows key on other\n        //! platforms).\n        SCMOD_META = 16\n    };\n\n    //! This enum defines the different language lexers.\n    //!\n    //! \\sa SCI_GETLEXER, SCI_SETLEXER\n    enum\n    {\n        //! No lexer is selected and the SCN_STYLENEEDED signal is emitted so\n        //! that the application can style the text as needed.  This is the\n        //! default.\n        SCLEX_CONTAINER = 0,\n\n        //! Select the null lexer that does no syntax styling.\n        SCLEX_NULL = 1,\n\n        //! Select the Python lexer.\n        SCLEX_PYTHON = 2,\n\n        //! Select the C++ lexer.\n        SCLEX_CPP = 3,\n\n        //! Select the HTML lexer.\n        SCLEX_HTML = 4,\n\n        //! Select the XML lexer.\n        SCLEX_XML = 5,\n\n        //! Select the Perl lexer.\n        SCLEX_PERL = 6,\n\n        //! Select the SQL lexer.\n        SCLEX_SQL = 7,\n\n        //! Select the Visual Basic lexer.\n        SCLEX_VB = 8,\n\n        //! Select the lexer for properties style files.\n        SCLEX_PROPERTIES = 9,\n\n        //! Select the lexer for error list style files.\n        SCLEX_ERRORLIST = 10,\n\n        //! Select the Makefile lexer.\n        SCLEX_MAKEFILE = 11,\n\n        //! Select the Windows batch file lexer.\n        SCLEX_BATCH = 12,\n\n        //! Select the LaTex lexer.\n        SCLEX_LATEX = 14,\n\n        //! Select the Lua lexer.\n        SCLEX_LUA = 15,\n\n        //! Select the lexer for diff output.\n        SCLEX_DIFF = 16,\n\n        //! Select the lexer for Apache configuration files.\n        SCLEX_CONF = 17,\n\n        //! Select the Pascal lexer.\n        SCLEX_PASCAL = 18,\n\n        //! Select the Avenue lexer.\n        SCLEX_AVE = 19,\n\n        //! Select the Ada lexer.\n        SCLEX_ADA = 20,\n\n        //! Select the Lisp lexer.\n        SCLEX_LISP = 21,\n\n        //! Select the Ruby lexer.\n        SCLEX_RUBY = 22,\n\n        //! Select the Eiffel lexer.\n        SCLEX_EIFFEL = 23,\n\n        //! Select the Eiffel lexer folding at keywords.\n        SCLEX_EIFFELKW = 24,\n\n        //! Select the Tcl lexer.\n        SCLEX_TCL = 25,\n\n        //! Select the lexer for nnCron files.\n        SCLEX_NNCRONTAB = 26,\n\n        //! Select the Bullant lexer.\n        SCLEX_BULLANT = 27,\n\n        //! Select the VBScript lexer.\n        SCLEX_VBSCRIPT = 28,\n\n        //! Select the ASP lexer.\n        SCLEX_ASP = SCLEX_HTML,\n\n        //! Select the PHP lexer.\n        SCLEX_PHP = SCLEX_HTML,\n\n        //! Select the Baan lexer.\n        SCLEX_BAAN = 31,\n\n        //! Select the Matlab lexer.\n        SCLEX_MATLAB = 32,\n\n        //! Select the Scriptol lexer.\n        SCLEX_SCRIPTOL = 33,\n\n        //! Select the assembler lexer.\n        SCLEX_ASM = 34,\n\n        //! Select the C++ lexer with case insensitive keywords.\n        SCLEX_CPPNOCASE = 35,\n\n        //! Select the FORTRAN lexer.\n        SCLEX_FORTRAN = 36,\n\n        //! Select the FORTRAN77 lexer.\n        SCLEX_F77 = 37,\n\n        //! Select the CSS lexer.\n        SCLEX_CSS = 38,\n\n        //! Select the POV lexer.\n        SCLEX_POV = 39,\n\n        //! Select the Basser Lout typesetting language lexer.\n        SCLEX_LOUT = 40,\n\n        //! Select the EScript lexer.\n        SCLEX_ESCRIPT = 41,\n\n        //! Select the PostScript lexer.\n        SCLEX_PS = 42,\n\n        //! Select the NSIS lexer.\n        SCLEX_NSIS = 43,\n\n        //! Select the MMIX assembly language lexer.\n        SCLEX_MMIXAL = 44,\n\n        //! Select the Clarion lexer.\n        SCLEX_CLW = 45,\n\n        //! Select the Clarion lexer with case insensitive keywords.\n        SCLEX_CLWNOCASE = 46,\n\n        //! Select the MPT text log file lexer.\n        SCLEX_LOT = 47,\n\n        //! Select the YAML lexer.\n        SCLEX_YAML = 48,\n\n        //! Select the TeX lexer.\n        SCLEX_TEX = 49,\n\n        //! Select the Metapost lexer.\n        SCLEX_METAPOST = 50,\n\n        //! Select the PowerBASIC lexer.\n        SCLEX_POWERBASIC = 51,\n\n        //! Select the Forth lexer.\n        SCLEX_FORTH = 52,\n\n        //! Select the Erlang lexer.\n        SCLEX_ERLANG = 53,\n\n        //! Select the Octave lexer.\n        SCLEX_OCTAVE = 54,\n\n        //! Select the MS SQL lexer.\n        SCLEX_MSSQL = 55,\n\n        //! Select the Verilog lexer.\n        SCLEX_VERILOG = 56,\n\n        //! Select the KIX-Scripts lexer.\n        SCLEX_KIX = 57,\n\n        //! Select the Gui4Cli lexer.\n        SCLEX_GUI4CLI = 58,\n\n        //! Select the Specman E lexer.\n        SCLEX_SPECMAN = 59,\n\n        //! Select the AutoIt3 lexer.\n        SCLEX_AU3 = 60,\n\n        //! Select the APDL lexer.\n        SCLEX_APDL = 61,\n\n        //! Select the Bash lexer.\n        SCLEX_BASH = 62,\n\n        //! Select the ASN.1 lexer.\n        SCLEX_ASN1 = 63,\n\n        //! Select the VHDL lexer.\n        SCLEX_VHDL = 64,\n\n        //! Select the Caml lexer.\n        SCLEX_CAML = 65,\n\n        //! Select the BlitzBasic lexer.\n        SCLEX_BLITZBASIC = 66,\n\n        //! Select the PureBasic lexer.\n        SCLEX_PUREBASIC = 67,\n\n        //! Select the Haskell lexer.\n        SCLEX_HASKELL = 68,\n\n        //! Select the PHPScript lexer.\n        SCLEX_PHPSCRIPT = 69,\n\n        //! Select the TADS3 lexer.\n        SCLEX_TADS3 = 70,\n\n        //! Select the REBOL lexer.\n        SCLEX_REBOL = 71,\n\n        //! Select the Smalltalk lexer.\n        SCLEX_SMALLTALK = 72,\n\n        //! Select the FlagShip lexer.\n        SCLEX_FLAGSHIP = 73,\n\n        //! Select the Csound lexer.\n        SCLEX_CSOUND = 74,\n\n        //! Select the FreeBasic lexer.\n        SCLEX_FREEBASIC = 75,\n\n        //! Select the InnoSetup lexer.\n        SCLEX_INNOSETUP = 76,\n\n        //! Select the Opal lexer.\n        SCLEX_OPAL = 77,\n\n        //! Select the Spice lexer.\n        SCLEX_SPICE = 78,\n\n        //! Select the D lexer.\n        SCLEX_D = 79,\n\n        //! Select the CMake lexer.\n        SCLEX_CMAKE = 80,\n\n        //! Select the GAP lexer.\n        SCLEX_GAP = 81,\n\n        //! Select the PLM lexer.\n        SCLEX_PLM = 82,\n\n        //! Select the Progress lexer.\n        SCLEX_PROGRESS = 83,\n\n        //! Select the Abaqus lexer.\n        SCLEX_ABAQUS = 84,\n\n        //! Select the Asymptote lexer.\n        SCLEX_ASYMPTOTE = 85,\n\n        //! Select the R lexer.\n        SCLEX_R = 86,\n\n        //! Select the MagikSF lexer.\n        SCLEX_MAGIK = 87,\n\n        //! Select the PowerShell lexer.\n        SCLEX_POWERSHELL = 88,\n\n        //! Select the MySQL lexer.\n        SCLEX_MYSQL = 89,\n\n        //! Select the gettext .po file lexer.\n        SCLEX_PO = 90,\n\n        //! Select the TAL lexer.\n        SCLEX_TAL = 91,\n\n        //! Select the COBOL lexer.\n        SCLEX_COBOL = 92,\n\n        //! Select the TACL lexer.\n        SCLEX_TACL = 93,\n\n        //! Select the Sorcus lexer.\n        SCLEX_SORCUS = 94,\n\n        //! Select the PowerPro lexer.\n        SCLEX_POWERPRO = 95,\n\n        //! Select the Nimrod lexer.\n        SCLEX_NIMROD = 96,\n\n        //! Select the SML lexer.\n        SCLEX_SML = 97,\n\n        //! Select the Markdown lexer.\n        SCLEX_MARKDOWN = 98,\n\n        //! Select the txt2tags lexer.\n        SCLEX_TXT2TAGS = 99,\n\n        //! Select the 68000 assembler lexer.\n        SCLEX_A68K = 100,\n\n        //! Select the Modula 3 lexer.\n        SCLEX_MODULA = 101,\n\n        //! Select the CoffeeScript lexer.\n        SCLEX_COFFEESCRIPT = 102,\n\n        //! Select the Take Command lexer.\n        SCLEX_TCMD = 103,\n\n        //! Select the AviSynth lexer.\n        SCLEX_AVS = 104,\n\n        //! Select the ECL lexer.\n        SCLEX_ECL = 105,\n\n        //! Select the OScript lexer.\n        SCLEX_OSCRIPT = 106,\n\n        //! Select the Visual Prolog lexer.\n        SCLEX_VISUALPROLOG = 107,\n\n        //! Select the Literal Haskell lexer.\n        SCLEX_LITERATEHASKELL = 108,\n\n        //! Select the Structured Text lexer.\n        SCLEX_STTXT = 109,\n\n        //! Select the KVIrc lexer.\n        SCLEX_KVIRC = 110,\n\n        //! Select the Rust lexer.\n        SCLEX_RUST = 111,\n    };\n\n    enum\n    {\n        SC_WEIGHT_NORMAL = 400,\n        SC_WEIGHT_SEMIBOLD = 600,\n        SC_WEIGHT_BOLD = 700,\n    };\n\n    enum\n    {\n        SC_TECHNOLOGY_DEFAULT = 0,\n        SC_TECHNOLOGY_DIRECTWRITE = 1,\n    };\n\n    enum\n    {\n        SC_CASEINSENSITIVEBEHAVIOUR_RESPECTCASE = 0,\n        SC_CASEINSENSITIVEBEHAVIOUR_IGNORECASE = 1,\n    };\n\n    enum\n    {\n        SC_FONT_SIZE_MULTIPLIER = 100,\n    };\n\n    enum\n    {\n        SC_FOLDACTION_CONTRACT = 0,\n        SC_FOLDACTION_EXPAND = 1,\n        SC_FOLDACTION_TOGGLE = 2,\n    };\n\n    enum\n    {\n        SC_AUTOMATICFOLD_SHOW = 0x0001,\n        SC_AUTOMATICFOLD_CLICK = 0x0002,\n        SC_AUTOMATICFOLD_CHANGE = 0x0004,\n    };\n\n    enum\n    {\n        SC_ORDER_PRESORTED = 0,\n        SC_ORDER_PERFORMSORT = 1,\n        SC_ORDER_CUSTOM = 2,\n    };\n\n    //! Construct an empty QsciScintillaBase with parent \\a parent.\n    explicit QsciScintillaBase(QWidget *parent = 0);\n\n    //! Destroys the QsciScintillaBase instance.\n    virtual ~QsciScintillaBase();\n\n    //! Returns a pointer to a QsciScintillaBase instance, or 0 if there isn't\n    //! one.  This can be used by the higher level API to send messages that\n    //! aren't associated with a particular instance.\n    static QsciScintillaBase *pool();\n\n    //! Send the Scintilla message \\a msg with the optional parameters \\a\n    //! wParam and \\a lParam.\n    long SendScintilla(unsigned int msg, unsigned long wParam = 0,\n            long lParam = 0) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            void *lParam) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            const char *lParam) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, const char *lParam) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, const char *wParam,\n            const char *lParam) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, long wParam) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, int wParam) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, long cpMin, long cpMax,\n            char *lpstrText) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            const QColor &col) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, const QColor &col) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, unsigned long wParam, QPainter *hdc,\n            const QRect &rc, long cpMin, long cpMax) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            const QPixmap &lParam) const;\n\n    //! \\overload\n    long SendScintilla(unsigned int msg, unsigned long wParam,\n            const QImage &lParam) const;\n\n    //! Send the Scintilla message \\a msg and return a pointer result.\n    void *SendScintillaPtrResult(unsigned int msg) const;\n\n\n    //! \\internal\n    static int commandKey(int qt_key, int &modifiers);\n\nsignals:\n    //! This signal is emitted when text is selected or de-selected.\n    //! \\a yes is true if text has been selected and false if text has been\n    //! deselected.\n    void QSCN_SELCHANGED(bool yes);\n\n    //! This signal is emitted when the user cancels an auto-completion list.\n    //!\n    //! \\sa SCN_AUTOCSELECTION()\n    void SCN_AUTOCCANCELLED();\n\n    //! This signal is emitted when the user deletes a character when an\n    //! auto-completion list is active.\n    void SCN_AUTOCCHARDELETED();\n\n    //! This signal is emitted when the user selects an item in an\n    //! auto-completion list.  It is emitted before the selection is inserted.\n    //! The insertion can be cancelled by sending an SCI_AUTOCANCEL message\n    //! from a connected slot.\n    //! \\a selection is the text of the selection.\n    //! \\a position is the start position of the word being completed.\n    //!\n    //! \\sa SCN_AUTOCCANCELLED()\n    void SCN_AUTOCSELECTION(const char *selection, int position);\n\n    //! This signal is emitted when the document has changed for any reason.\n    void SCEN_CHANGE();\n\n    //! This signal ir emitted when the user clicks on a calltip.\n    //! \\a direction is 1 if the user clicked on the up arrow, 2 if the user\n    //! clicked on the down arrow, and 0 if the user clicked elsewhere.\n    void SCN_CALLTIPCLICK(int direction);\n\n    //! This signal is emitted whenever the user enters an ordinary character\n    //! into the text.\n    //! \\a charadded is the character. It can be used to decide to display a\n    //! call tip or an auto-completion list.\n    void SCN_CHARADDED(int charadded);\n\n    //! This signal is emitted when the user double clicks.\n    //! \\a position is the position in the text where the click occured.\n    //! \\a line is the number of the line in the text where the click occured.\n    //! \\a modifiers is the logical or of the modifier keys that were pressed\n    //! when the user double clicked.\n    void SCN_DOUBLECLICK(int position, int line, int modifiers);\n\n    //!\n    void SCN_DWELLEND(int, int, int);\n\n    //!\n    void SCN_DWELLSTART(int, int, int);\n\n    //! This signal is emitted when focus is received.\n    void SCN_FOCUSIN();\n\n    //! This signal is emitted when focus is lost.\n    void SCN_FOCUSOUT();\n\n    //! This signal is emitted when the user clicks on text in a style with the\n    //! hotspot attribute set.\n    //! \\a position is the position in the text where the click occured.\n    //! \\a modifiers is the logical or of the modifier keys that were pressed\n    //! when the user clicked.\n    void SCN_HOTSPOTCLICK(int position, int modifiers);\n\n    //! This signal is emitted when the user double clicks on text in a style\n    //! with the hotspot attribute set.\n    //! \\a position is the position in the text where the double click occured.\n    //! \\a modifiers is the logical or of the modifier keys that were pressed\n    //! when the user double clicked.\n    void SCN_HOTSPOTDOUBLECLICK(int position, int modifiers);\n\n    //! This signal is emitted when the user releases the mouse button on text\n    //! in a style with the hotspot attribute set.\n    //! \\a position is the position in the text where the release occured.\n    //! \\a modifiers is the logical or of the modifier keys that were pressed\n    //! when the user released the button.\n    void SCN_HOTSPOTRELEASECLICK(int position, int modifiers);\n\n    //! This signal is emitted when the user clicks on text that has an\n    //! indicator.\n    //! \\a position is the position in the text where the click occured.\n    //! \\a modifiers is the logical or of the modifier keys that were pressed\n    //! when the user clicked.\n    void SCN_INDICATORCLICK(int position, int modifiers);\n\n    //! This signal is emitted when the user releases the mouse button on text\n    //! that has an indicator.\n    //! \\a position is the position in the text where the release occured.\n    //! \\a modifiers is the logical or of the modifier keys that were pressed\n    //! when the user released.\n    void SCN_INDICATORRELEASE(int position, int modifiers);\n\n    //! This signal is emitted when a recordable editor command has been\n    //! executed.\n    void SCN_MACRORECORD(unsigned int, unsigned long, void *);\n\n    //! This signal is emitted when the user clicks on a sensitive margin.\n    //! \\a position is the position of the start of the line against which the\n    //! user clicked.\n    //! \\a modifiers is the logical or of the modifier keys that were pressed\n    //! when the user clicked.\n    //! \\a margin is the number of the margin the user clicked in: 0, 1 or 2.\n    //! \n    //! \\sa SCI_GETMARGINSENSITIVEN, SCI_SETMARGINSENSITIVEN\n    void SCN_MARGINCLICK(int position, int modifiers, int margin);\n\n    //!\n    void SCN_MODIFIED(int, int, const char *, int, int, int, int, int, int, int);\n\n    //! This signal is emitted when the user attempts to modify read-only\n    //! text.\n    void SCN_MODIFYATTEMPTRO();\n\n    //!\n    void SCN_NEEDSHOWN(int, int);\n\n    //! This signal is emitted when painting has been completed.  It is useful\n    //! to trigger some other change but to have the paint be done first to\n    //! appear more reponsive to the user.\n    void SCN_PAINTED();\n\n    //! This signal is emitted when the current state of the text no longer\n    //! corresponds to the state of the text at the save point.\n    //! \n    //! \\sa SCI_SETSAVEPOINT, SCN_SAVEPOINTREACHED()\n    void SCN_SAVEPOINTLEFT();\n\n    //! This signal is emitted when the current state of the text corresponds\n    //! to the state of the text at the save point. This allows feedback to be\n    //! given to the user as to whether the text has been modified since it was\n    //! last saved.\n    //! \n    //! \\sa SCI_SETSAVEPOINT, SCN_SAVEPOINTLEFT()\n    void SCN_SAVEPOINTREACHED();\n\n    //! This signal is emitted when a range of text needs to be syntax styled.\n    //! The range is from the value returned by the SCI_GETENDSTYLED message\n    //! and \\a position.  It is only emitted if the currently selected lexer is\n    //! SCLEX_CONTAINER.\n    //!\n    //! \\sa SCI_COLOURISE, SCI_GETENDSTYLED\n    void SCN_STYLENEEDED(int position);\n\n    //! This signal is emitted when either the text or styling of the text has\n    //! changed or the selection range or scroll position has changed.\n    //! \\a updated contains the set of SC_UPDATE_* flags describing the changes\n    //! since the signal was last emitted.\n    void SCN_UPDATEUI(int updated);\n\n    //!\n    void SCN_USERLISTSELECTION(const char *, int);\n\n    //!\n    void SCN_ZOOM();\n\nprotected:\n    //! Returns true if the contents of a MIME data object can be decoded and\n    //! inserted into the document.  It is called during drag and paste\n    //! operations.\n    //! \\a source is the MIME data object.\n    //!\n    //! \\sa fromMimeData(), toMimeData()\n    virtual bool canInsertFromMimeData(const QMimeData *source) const;\n\n    //! Returns the text of a MIME data object.  It is called when a drag and\n    //! drop is completed and when text is pasted from the clipboard.\n    //! \\a source is the MIME data object.  On return \\a rectangular is set if\n    //! the text corresponds to a rectangular selection.\n    //!\n    //! \\sa canInsertFromMimeData(), toMimeData()\n    virtual QByteArray fromMimeData(const QMimeData *source, bool &rectangular) const;\n\n    //! Returns a new MIME data object containing some text and whether it\n    //! corresponds to a rectangular selection.  It is called when a drag and\n    //! drop is started and when the selection is copied to the clipboard.\n    //! Ownership of the object is passed to the caller.  \\a text is the text.\n    //! \\a rectangular is set if the text corresponds to a rectangular\n    //! selection.\n    //!\n    //! \\sa canInsertFromMimeData(), fromMimeData()\n    virtual QMimeData *toMimeData(const QByteArray &text, bool rectangular) const;\n\n    //! Re-implemented to handle the context menu.\n    virtual void contextMenuEvent(QContextMenuEvent *e);\n\n    //! Re-implemented to handle drag enters.\n    virtual void dragEnterEvent(QDragEnterEvent *e);\n\n    //! Re-implemented to handle drag leaves.\n    virtual void dragLeaveEvent(QDragLeaveEvent *e);\n\n    //! Re-implemented to handle drag moves.\n    virtual void dragMoveEvent(QDragMoveEvent *e);\n\n    //! Re-implemented to handle drops.\n    virtual void dropEvent(QDropEvent *e);\n\n    //! Re-implemented to tell Scintilla it has the focus.\n    virtual void focusInEvent(QFocusEvent *e);\n\n    //! Re-implemented to tell Scintilla it has lost the focus.\n    virtual void focusOutEvent(QFocusEvent *e);\n\n    //! Re-implemented to allow tabs to be entered as text.\n    virtual bool focusNextPrevChild(bool next);\n\n    //! Re-implemented to handle key presses.\n    virtual void keyPressEvent(QKeyEvent *e);\n\n    //! Re-implemented to handle composed characters.\n    virtual void inputMethodEvent(QInputMethodEvent *event);\n    virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const;\n\n    //! Re-implemented to handle mouse double-clicks.\n    virtual void mouseDoubleClickEvent(QMouseEvent *e);\n\n    //! Re-implemented to handle mouse moves.\n    virtual void mouseMoveEvent(QMouseEvent *e);\n\n    //! Re-implemented to handle mouse presses.\n    virtual void mousePressEvent(QMouseEvent *e);\n\n    //! Re-implemented to handle mouse releases.\n    virtual void mouseReleaseEvent(QMouseEvent *e);\n\n    //! Re-implemented to paint the viewport.\n    virtual void paintEvent(QPaintEvent *e);\n\n    //! Re-implemented to handle resizes.\n    virtual void resizeEvent(QResizeEvent *e);\n\n    //! \\internal Re-implemented to handle scrolling.\n    virtual void scrollContentsBy(int dx, int dy);\n\n    //! \\internal This helps to work around some Scintilla bugs.\n    void setScrollBars();\n\n    //! \\internal Qt4, Qt5 portability.\n    typedef QByteArray ScintillaBytes;\n\n#define ScintillaBytesConstData(b)  (b).constData()\n\n\n    //! \\internal Convert a QString to encoded bytes.\n    ScintillaBytes textAsBytes(const QString &text) const;\n\n    //! \\internal Convert encoded bytes to a QString.\n    QString bytesAsText(const char *bytes) const;\n\nprivate slots:\n    void handleTimer();\n    void handleVSb(int value);\n    void handleHSb(int value);\n    void handleSelection();\n\nprivate:\n    // This is needed to allow QsciScintillaQt to emit this class's signals.\n    friend class QsciScintillaQt;\n\n    QsciScintillaQt *sci;\n    QPoint triple_click_at;\n    QTimer triple_click;\n    int preeditPos;\n    int preeditNrBytes;\n    QString preeditString;\n#if QT_VERSION >= 0x050000\n    bool clickCausedFocus;\n#endif\n\n    void acceptAction(QDropEvent *e);\n\n    QsciScintillaBase(const QsciScintillaBase &);\n    QsciScintillaBase &operator=(const QsciScintillaBase &);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscistyle.h",
    "content": "// This module defines interface to the QsciStyle class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCISTYLE_H\n#define QSCISTYLE_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qstring.h>\n\n#include <Qsci/qsciglobal.h>\n\n\nclass QsciScintillaBase;\n\n\n//! \\brief The QsciStyle class encapsulates all the attributes of a style.\n//!\n//! Each character of a document has an associated style which determines how\n//! the character is displayed, e.g. its font and color.  A style is identified\n//! by a number.  Lexers define styles for each of the language's features so\n//! that they are displayed differently.  Some style numbers have hard-coded\n//! meanings, e.g. the style used for call tips.\nclass QSCINTILLA_EXPORT QsciStyle\n{\npublic:\n    //! This enum defines the different ways the displayed case of the text can\n    //! be changed.\n    enum TextCase {\n        //! The text is displayed as its original case.\n        OriginalCase = 0,\n\n        //! The text is displayed as upper case.\n        UpperCase = 1,\n\n        //! The text is displayed as lower case.\n        LowerCase = 2\n    };\n\n    //! Constructs a QsciStyle instance for style number \\a style.  If \\a style\n    //! is negative then a new style number is automatically allocated.\n    QsciStyle(int style = -1);\n\n    //! Constructs a QsciStyle instance for style number \\a style.  If \\a style\n    //! is negative then a new style number is automatically allocated.  The\n    //! styles description, color, paper color, font and end-of-line fill are\n    //! set to \\a description, \\a color, \\a paper, \\a font and \\a eolFill\n    //! respectively.\n    QsciStyle(int style, const QString &description, const QColor &color,\n            const QColor &paper, const QFont &font, bool eolFill = false);\n\n    //! \\internal Apply the style to a particular editor.\n    void apply(QsciScintillaBase *sci) const;\n\n    //! Returns the number of the style.\n    int style() const {return style_nr;}\n\n    //! The style's description is set to \\a description.\n    //!\n    //! \\sa description()\n    void setDescription(const QString &description) {style_description = description;}\n\n    //! Returns the style's description.\n    //!\n    //! \\sa setDescription()\n    QString description() const {return style_description;}\n\n    //! The style's foreground color is set to \\a color.  The default is taken\n    //! from the application's default palette.\n    //!\n    //! \\sa color()\n    void setColor(const QColor &color);\n\n    //! Returns the style's foreground color.\n    //!\n    //! \\sa setColor()\n    QColor color() const {return style_color;}\n\n    //! The style's background color is set to \\a paper.  The default is taken\n    //! from the application's default palette.\n    //!\n    //! \\sa paper()\n    void setPaper(const QColor &paper);\n\n    //! Returns the style's background color.\n    //!\n    //! \\sa setPaper()\n    QColor paper() const {return style_paper;}\n\n    //! The style's font is set to \\a font.  The default is the application's\n    //! default font.\n    //!\n    //! \\sa font()\n    void setFont(const QFont &font);\n\n    //! Returns the style's font.\n    //!\n    //! \\sa setFont()\n    QFont font() const {return style_font;}\n\n    //! The style's end-of-line fill is set to \\a fill.  The default is false.\n    //!\n    //! \\sa eolFill()\n    void setEolFill(bool fill);\n\n    //! Returns the style's end-of-line fill.\n    //!\n    //! \\sa setEolFill()\n    bool eolFill() const {return style_eol_fill;}\n\n    //! The style's text case is set to \\a text_case.  The default is\n    //! OriginalCase.\n    //!\n    //! \\sa textCase()\n    void setTextCase(TextCase text_case);\n\n    //! Returns the style's text case.\n    //!\n    //! \\sa setTextCase()\n    TextCase textCase() const {return style_case;}\n\n    //! The style's visibility is set to \\a visible.  The default is true.\n    //!\n    //! \\sa visible()\n    void setVisible(bool visible);\n\n    //! Returns the style's visibility.\n    //!\n    //! \\sa setVisible()\n    bool visible() const {return style_visible;}\n\n    //! The style's changeability is set to \\a changeable.  The default is\n    //! true.\n    //!\n    //! \\sa changeable()\n    void setChangeable(bool changeable);\n\n    //! Returns the style's changeability.\n    //!\n    //! \\sa setChangeable()\n    bool changeable() const {return style_changeable;}\n\n    //! The style's sensitivity to mouse clicks is set to \\a hotspot.  The\n    //! default is false.\n    //!\n    //! \\sa hotspot()\n    void setHotspot(bool hotspot);\n\n    //! Returns the style's sensitivity to mouse clicks.\n    //!\n    //! \\sa setHotspot()\n    bool hotspot() const {return style_hotspot;}\n\n    //! Refresh the style settings.\n    void refresh();\n\nprivate:\n    int style_nr;\n    QString style_description;\n    QColor style_color;\n    QColor style_paper;\n    QFont style_font;\n    bool style_eol_fill;\n    TextCase style_case;\n    bool style_visible;\n    bool style_changeable;\n    bool style_hotspot;\n\n    void init(int style);\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscistyledtext.h",
    "content": "// This module defines interface to the QsciStyledText class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef QSCISTYLEDTEXT_H\n#define QSCISTYLEDTEXT_H\n\n#ifdef __APPLE__\nextern \"C++\" {\n#endif\n\n#include <qstring.h>\n\n#include <Qsci/qsciglobal.h>\n\n\nclass QsciScintillaBase;\nclass QsciStyle;\n\n\n//! \\brief The QsciStyledText class is a container for a piece of text and the\n//! style used to display the text.\nclass QSCINTILLA_EXPORT QsciStyledText\n{\npublic:\n    //! Constructs a QsciStyledText instance for text \\a text and style number\n    //! \\a style.\n    QsciStyledText(const QString &text, int style);\n\n    //! Constructs a QsciStyledText instance for text \\a text and style \\a\n    //! style.\n    QsciStyledText(const QString &text, const QsciStyle &style);\n\n\n    //! \\internal Apply the style to a particular editor.\n    void apply(QsciScintillaBase *sci) const;\n\n    //! Returns a reference to the text.\n    const QString &text() const {return styled_text;}\n\n    //! Returns the number of the style.\n    int style() const;\n\nprivate:\n    QString styled_text;\n    int style_nr;\n    const QsciStyle *explicit_style;\n};\n\n#ifdef __APPLE__\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/SciClasses.cpp",
    "content": "// The implementation of various Qt version independent classes used by the\n// rest of the port.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"SciNamespace.h\"\n#include \"SciClasses.h\"\n\n#include <qevent.h>\n#include <qpainter.h>\n#include <QCoreApplication>\n\n#include \"ScintillaQt.h\"\n#include \"ListBoxQt.h\"\n\n\n// Create a call tip.\nQsciSciCallTip::QsciSciCallTip(QWidget *parent, QsciScintillaQt *sci_)\n    : QWidget(parent, Qt::WindowFlags(Qt::Popup|Qt::FramelessWindowHint|Qt::WA_StaticContents)),\n      sci(sci_)\n{\n    // Ensure that the main window keeps the focus (and the caret flashing)\n    // when this is displayed.\n    setFocusProxy(parent);\n}\n\n\n// Destroy a call tip.\nQsciSciCallTip::~QsciSciCallTip()\n{\n    // Ensure that the main window doesn't receive a focus out event when\n    // this is destroyed.\n    setFocusProxy(0);\n}\n\n\n// Paint a call tip.\nvoid QsciSciCallTip::paintEvent(QPaintEvent *)\n{\n    QSCI_SCI_NAMESPACE(Surface) *surfaceWindow = QSCI_SCI_NAMESPACE(Surface)::Allocate(SC_TECHNOLOGY_DEFAULT);\n\n    if (!surfaceWindow)\n        return;\n\n    QPainter p(this);\n\n    surfaceWindow->Init(&p);\n    surfaceWindow->SetUnicodeMode(sci->CodePage() == SC_CP_UTF8);\n    sci->ct.PaintCT(surfaceWindow);\n\n    delete surfaceWindow;\n}\n\n\n// Handle a mouse press in a call tip.\nvoid QsciSciCallTip::mousePressEvent(QMouseEvent *e)\n{\n    QSCI_SCI_NAMESPACE(Point) pt;\n\n    pt.x = e->x();\n    pt.y = e->y();\n\n    sci->ct.MouseClick(pt);\n    sci->CallTipClick();\n\n    update();\n}\n\n\n\n// Create the popup instance.\nQsciSciPopup::QsciSciPopup()\n{\n    // Set up the mapper.\n    connect(&mapper, SIGNAL(mapped(int)), this, SLOT(on_triggered(int)));\n}\n\n\n// Add an item and associated command to the popup and enable it if required.\nvoid QsciSciPopup::addItem(const QString &label, int cmd, bool enabled,\n        QsciScintillaQt *sci_)\n{\n    QAction *act = addAction(label, &mapper, SLOT(map()));\n    mapper.setMapping(act, cmd);\n    act->setEnabled(enabled);\n    sci = sci_;\n}\n\n\n// A slot to handle a menu action being triggered.\nvoid QsciSciPopup::on_triggered(int cmd)\n{\n    sci->Command(cmd);\n}\n\n\n\n#include <QListWidgetItem>\n\n\nQsciSciListBox::QsciSciListBox(QWidget *parent, QsciListBoxQt *lbx_)\n    : QListWidget(parent), lbx(lbx_)\n{\n    setAttribute(Qt::WA_StaticContents);\n\n#if defined(Q_OS_WIN)\n    setWindowFlags(Qt::Tool|Qt::FramelessWindowHint);\n\n    // This stops the main widget losing focus when the user clicks on this one\n    // (which prevents this one being destroyed).\n    setFocusPolicy(Qt::NoFocus);\n#else\n    // This is the root of the focus problems under Gnome's window manager.  We\n    // have tried many flag combinations in the past.  The consensus now seems\n    // to be that the following works.  However it might now work because of a\n    // change in Qt so we only enable it for recent versions in order to\n    // reduce the risk of breaking something that works with earlier versions.\n#if QT_VERSION >= 0x040500\n    setWindowFlags(Qt::ToolTip|Qt::WindowStaysOnTopHint);\n#else\n    setWindowFlags(Qt::Tool|Qt::FramelessWindowHint);\n#endif\n\n    // This may not be needed.\n    setFocusProxy(parent);\n#endif\n\n    setFrameShape(StyledPanel);\n    setFrameShadow(Plain);\n\n    connect(this, SIGNAL(itemDoubleClicked(QListWidgetItem *)),\n            SLOT(handleSelection()));\n}\n\n\nvoid QsciSciListBox::addItemPixmap(const QPixmap &pm, const QString &txt)\n{\n    new QListWidgetItem(pm, txt, this);\n}\n\n\nint QsciSciListBox::find(const QString &prefix)\n{\n    QList<QListWidgetItem *> itms = findItems(prefix,\n            Qt::MatchStartsWith|Qt::MatchCaseSensitive);\n\n    if (itms.size() == 0)\n        return -1;\n\n    return row(itms[0]);\n}\n\n\nQString QsciSciListBox::text(int n)\n{\n    QListWidgetItem *itm = item(n);\n\n    if (!itm)\n        return QString();\n\n    return itm->text();\n}\n\n\n// Reimplemented to close the list when the user presses Escape.\nvoid QsciSciListBox::keyPressEvent(QKeyEvent *e)\n{\n    if (e->key() == Qt::Key_Escape)\n    {\n        e->accept();\n        close();\n    }\n    else\n    {\n        QListWidget::keyPressEvent(e);\n\n        if (!e->isAccepted())\n            QCoreApplication::sendEvent(parent(), e);\n    }\n}\n\n\n\nQsciSciListBox::~QsciSciListBox()\n{\n    // Ensure that the main widget doesn't get a focus out event when this is\n    // destroyed.\n    setFocusProxy(0);\n}\n\n\nvoid QsciSciListBox::handleSelection()\n{\n    if (lbx && lbx->cb_action)\n        lbx->cb_action(lbx->cb_data);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/SciClasses.h",
    "content": "// The definition of various Qt version independent classes used by the rest of\n// the port.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef _SCICLASSES_H\n#define _SCICLASSES_H\n\n#include <qglobal.h>\n#include <qwidget.h>\n\n#include <Qsci/qsciglobal.h>\n\n\nQT_BEGIN_NAMESPACE\nclass QMouseEvent;\nclass QPaintEvent;\nQT_END_NAMESPACE\n\nclass QsciScintillaQt;\nclass QsciListBoxQt;\n\n\n// A simple QWidget sub-class to implement a call tip.  This is not put into\n// the Scintilla namespace because of moc's problems with preprocessor macros.\nclass QsciSciCallTip : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    QsciSciCallTip(QWidget *parent, QsciScintillaQt *sci_);\n    ~QsciSciCallTip();\n\nprotected:\n    void paintEvent(QPaintEvent *e);\n    void mousePressEvent(QMouseEvent *e);\n\nprivate:\n    QsciScintillaQt *sci;\n};\n\n\n// A popup menu where options correspond to a numeric command.  This is not put\n// into the Scintilla namespace because of moc's problems with preprocessor\n// macros.\n\n#include <QMenu>\n#include <QSignalMapper>\n\nclass QsciSciPopup : public QMenu\n{\n    Q_OBJECT\n\npublic:\n    QsciSciPopup();\n\n    void addItem(const QString &label, int cmd, bool enabled,\n            QsciScintillaQt *sci_);\n\nprivate slots:\n    void on_triggered(int cmd);\n\nprivate:\n    QsciScintillaQt *sci;\n    QSignalMapper mapper;\n};\n\n\n\n// This sub-class of QListBox is needed to provide slots from which we can call\n// QsciListBox's double-click callback (and you thought this was a C++\n// program).  This is not put into the Scintilla namespace because of moc's\n// problems with preprocessor macros.\n\n\n#include <QListWidget>\n\nclass QsciSciListBox : public QListWidget\n{\n    Q_OBJECT\n\npublic:\n    QsciSciListBox(QWidget *parent, QsciListBoxQt *lbx_);\n    virtual ~QsciSciListBox();\n\n    void addItemPixmap(const QPixmap &pm, const QString &txt);\n\n    int find(const QString &prefix);\n    QString text(int n);\n\nprotected:\n    void keyPressEvent(QKeyEvent *e);\n\nprivate slots:\n    void handleSelection();\n\nprivate:\n    QsciListBoxQt *lbx;\n};\n\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/SciNamespace.h",
    "content": "// Support for building the Scintilla code in the Scintilla namespace using the\n// -DSCI_NAMESPACE compiler flag.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef _SCINAMESPACE_H\n#define _SCINAMESPACE_H\n\n#ifdef SCI_NAMESPACE\n#define QSCI_SCI_NAMESPACE(name)    Scintilla::name\n#define QSCI_BEGIN_SCI_NAMESPACE    namespace Scintilla {\n#define QSCI_END_SCI_NAMESPACE      };\n#else\n#define QSCI_SCI_NAMESPACE(name)    name\n#define QSCI_BEGIN_SCI_NAMESPACE\n#define QSCI_END_SCI_NAMESPACE\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ScintillaQt.cpp",
    "content": "// The implementation of the Qt specific subclass of ScintillaBase.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include <string.h>\n\n#include <qapplication.h>\n#include <qevent.h>\n#include <qpainter.h>\n#include <qscrollbar.h>\n#include <qstring.h>\n\n#include <qbytearray.h>\n#include <qdrag.h>\n#include <qmimedata.h>\n\n#include \"Qsci/qsciscintillabase.h\"\n#include \"ScintillaQt.h\"\n#include \"SciClasses.h\"\n\n\n// We want to use the Scintilla notification names as Qt signal names.\n#undef  SCEN_CHANGE\n#undef  SCN_AUTOCCANCELLED\n#undef  SCN_AUTOCCHARDELETED\n#undef  SCN_AUTOCSELECTION\n#undef  SCN_CALLTIPCLICK\n#undef  SCN_CHARADDED\n#undef  SCN_DOUBLECLICK\n#undef  SCN_DWELLEND\n#undef  SCN_DWELLSTART\n#undef  SCN_FOCUSIN\n#undef  SCN_FOCUSOUT\n#undef  SCN_HOTSPOTCLICK\n#undef  SCN_HOTSPOTDOUBLECLICK\n#undef  SCN_HOTSPOTRELEASECLICK\n#undef  SCN_INDICATORCLICK\n#undef  SCN_INDICATORRELEASE\n#undef  SCN_MACRORECORD\n#undef  SCN_MARGINCLICK\n#undef  SCN_MODIFIED\n#undef  SCN_MODIFYATTEMPTRO\n#undef  SCN_NEEDSHOWN\n#undef  SCN_PAINTED\n#undef  SCN_SAVEPOINTLEFT\n#undef  SCN_SAVEPOINTREACHED\n#undef  SCN_STYLENEEDED\n#undef  SCN_UPDATEUI\n#undef  SCN_USERLISTSELECTION\n#undef  SCN_ZOOM\n\nenum\n{\n    SCEN_CHANGE = 768,\n    SCN_AUTOCCANCELLED = 2025,\n    SCN_AUTOCCHARDELETED = 2026,\n    SCN_AUTOCSELECTION = 2022,\n    SCN_CALLTIPCLICK = 2021,\n    SCN_CHARADDED = 2001,\n    SCN_DOUBLECLICK = 2006,\n    SCN_DWELLEND = 2017,\n    SCN_DWELLSTART = 2016,\n    SCN_FOCUSIN = 2028,\n    SCN_FOCUSOUT = 2029,\n    SCN_HOTSPOTCLICK = 2019,\n    SCN_HOTSPOTDOUBLECLICK = 2020,\n    SCN_HOTSPOTRELEASECLICK = 2027,\n    SCN_INDICATORCLICK = 2023,\n    SCN_INDICATORRELEASE = 2024,\n    SCN_MACRORECORD = 2009,\n    SCN_MARGINCLICK = 2010,\n    SCN_MODIFIED = 2008,\n    SCN_MODIFYATTEMPTRO = 2004,\n    SCN_NEEDSHOWN = 2011,\n    SCN_PAINTED = 2013,\n    SCN_SAVEPOINTLEFT = 2003,\n    SCN_SAVEPOINTREACHED = 2002,\n    SCN_STYLENEEDED = 2000,\n    SCN_UPDATEUI = 2007,\n    SCN_USERLISTSELECTION = 2014,\n    SCN_ZOOM = 2018\n};\n\n\n// The ctor.\nQsciScintillaQt::QsciScintillaQt(QsciScintillaBase *qsb_)\n    : capturedMouse(false), qsb(qsb_)\n{\n    wMain = qsb->viewport();\n\n    // We aren't a QObject so we use the API class to do QObject related things\n    // for us.\n    qsb->connect(&qtimer, SIGNAL(timeout()), SLOT(handleTimer()));\n    \n    Initialise();\n}\n\n\n// The dtor.\nQsciScintillaQt::~QsciScintillaQt()\n{ \n    Finalise();\n}\n\n\n// Initialise the instance.\nvoid QsciScintillaQt::Initialise()\n{\n    SetTicking(true);\n}\n\n\n// Tidy up the instance.\nvoid QsciScintillaQt::Finalise()\n{\n    SetTicking(false);\n    ScintillaBase::Finalise();\n}\n\n\n// Start a drag.\nvoid QsciScintillaQt::StartDrag()\n{\n    inDragDrop = ddDragging;\n\n    QDrag *qdrag = new QDrag(qsb);\n    qdrag->setMimeData(mimeSelection(drag));\n\n# if QT_VERSION >= 0x040300\n    Qt::DropAction action = qdrag->exec(Qt::MoveAction | Qt::CopyAction, Qt::MoveAction);\n# else\n    Qt::DropAction action = qdrag->start(Qt::MoveAction);\n# endif\n\n    // Remove the dragged text if it was a move to another widget or\n    // application.\n    if (action == Qt::MoveAction && qdrag->target() != qsb->viewport())\n        ClearSelection();\n\n    SetDragPosition(QSCI_SCI_NAMESPACE(SelectionPosition)());\n    inDragDrop = ddNone;\n}\n\n\n// Re-implement to trap certain messages.\nsptr_t QsciScintillaQt::WndProc(unsigned int iMessage, uptr_t wParam,\n        sptr_t lParam)\n{\n    switch (iMessage)\n    {\n    case SCI_GETDIRECTFUNCTION:\n        return reinterpret_cast<sptr_t>(DirectFunction);\n    \n    case SCI_GETDIRECTPOINTER:\n        return reinterpret_cast<sptr_t>(this);\n    }\n\n    return ScintillaBase::WndProc(iMessage, wParam, lParam);\n}\n\n\n// Windows nonsense.\nsptr_t QsciScintillaQt::DefWndProc(unsigned int, uptr_t, sptr_t)\n{\n    return 0;\n}\n\n\n// Manage the timer.\nvoid QsciScintillaQt::SetTicking(bool on)\n{\n    if (timer.ticking != on)\n    {\n        timer.ticking = on;\n\n        if (timer.ticking)\n            qtimer.start(timer.tickSize);\n        else\n            qtimer.stop();\n    }\n\n    timer.ticksToWait = caret.period;\n}\n\n\n// Grab or release the mouse (and keyboard).\nvoid QsciScintillaQt::SetMouseCapture(bool on)\n{\n    if (mouseDownCaptures)\n        if (on)\n            qsb->viewport()->grabMouse();\n        else\n            qsb->viewport()->releaseMouse();\n\n    capturedMouse = on;\n}\n\n\n// Return true if the mouse/keyboard are currently grabbed.\nbool QsciScintillaQt::HaveMouseCapture()\n{\n    return capturedMouse;\n}\n\n\n// Set the position of the vertical scrollbar.\nvoid QsciScintillaQt::SetVerticalScrollPos()\n{\n    qsb->verticalScrollBar()->setValue(topLine);\n}\n\n\n// Set the position of the horizontal scrollbar.\nvoid QsciScintillaQt::SetHorizontalScrollPos()\n{\n    qsb->horizontalScrollBar()->setValue(xOffset);\n}\n\n\n// Set the extent of the vertical and horizontal scrollbars and return true if\n// the view needs re-drawing.\nbool QsciScintillaQt::ModifyScrollBars(int nMax,int nPage)\n{\n    qsb->verticalScrollBar()->setMinimum(0);\n    qsb->verticalScrollBar()->setMaximum(nMax - nPage + 1);\n    qsb->verticalScrollBar()->setPageStep(nPage);\n    qsb->verticalScrollBar()->setSingleStep(1);\n\n    // QAbstractScrollArea ignores Qt::ScrollBarAsNeeded and shows the\n    // horizontal scrollbar if a non-zero maximum is set.  That isn't the\n    // behavior we want, so set the maximum to zero unless scrollWidth exceeds\n    // the viewport.\n    const int widthBeyondViewport = qMax(0,\n            scrollWidth - qsb->viewport()->width());\n\n    qsb->horizontalScrollBar()->setMinimum(0);\n    qsb->horizontalScrollBar()->setMaximum(qMax(0, widthBeyondViewport - 1));\n    qsb->horizontalScrollBar()->setPageStep(widthBeyondViewport / 10);\n\n    return true;\n}\n\n\n// Called after SCI_SETWRAPMODE and SCI_SETHSCROLLBAR.\nvoid QsciScintillaQt::ReconfigureScrollBars()\n{\n    // Hide or show the scrollbars if needed.\n    bool hsb = (horizontalScrollBarVisible && !Wrapping());\n\n    qsb->setHorizontalScrollBarPolicy(hsb ? Qt::ScrollBarAsNeeded : Qt::ScrollBarAlwaysOff);\n    qsb->setVerticalScrollBarPolicy(verticalScrollBarVisible ? Qt::ScrollBarAsNeeded : Qt::ScrollBarAlwaysOff);\n}\n\n\n// Notify interested parties of any change in the document.\nvoid QsciScintillaQt::NotifyChange()\n{\n    emit qsb->SCEN_CHANGE();\n}\n\n\n// Notify interested parties of various events.  This is the main mapping\n// between Scintilla notifications and Qt signals.\nvoid QsciScintillaQt::NotifyParent(QSCI_SCI_NAMESPACE(SCNotification) scn)\n{\n    switch (scn.nmhdr.code)\n    {\n    case SCN_CALLTIPCLICK:\n        emit qsb->SCN_CALLTIPCLICK(scn.position);\n        break;\n\n    case SCN_AUTOCCANCELLED:\n        emit qsb->SCN_AUTOCCANCELLED();\n        break;\n\n    case SCN_AUTOCCHARDELETED:\n        emit qsb->SCN_AUTOCCHARDELETED();\n        break;\n\n    case SCN_AUTOCSELECTION:\n        emit qsb->SCN_AUTOCSELECTION(scn.text, scn.lParam);\n        break;\n\n    case SCN_CHARADDED:\n        emit qsb->SCN_CHARADDED(scn.ch);\n        break;\n\n    case SCN_DOUBLECLICK:\n        emit qsb->SCN_DOUBLECLICK(scn.position, scn.line, scn.modifiers);\n        break;\n\n    case SCN_DWELLEND:\n        emit qsb->SCN_DWELLEND(scn.position, scn.x, scn.y);\n        break;\n\n    case SCN_DWELLSTART:\n        emit qsb->SCN_DWELLSTART(scn.position, scn.x, scn.y);\n        break;\n\n    case SCN_FOCUSIN:\n        emit qsb->SCN_FOCUSIN();\n        break;\n\n    case SCN_FOCUSOUT:\n        emit qsb->SCN_FOCUSOUT();\n        break;\n\n    case SCN_HOTSPOTCLICK:\n        emit qsb->SCN_HOTSPOTCLICK(scn.position, scn.modifiers);\n        break;\n\n    case SCN_HOTSPOTDOUBLECLICK:\n        emit qsb->SCN_HOTSPOTDOUBLECLICK(scn.position, scn.modifiers);\n        break;\n\n    case SCN_HOTSPOTRELEASECLICK:\n        emit qsb->SCN_HOTSPOTRELEASECLICK(scn.position, scn.modifiers);\n        break;\n\n    case SCN_INDICATORCLICK:\n        emit qsb->SCN_INDICATORCLICK(scn.position, scn.modifiers);\n        break;\n\n    case SCN_INDICATORRELEASE:\n        emit qsb->SCN_INDICATORRELEASE(scn.position, scn.modifiers);\n        break;\n\n    case SCN_MACRORECORD:\n        emit qsb->SCN_MACRORECORD(scn.message, scn.wParam,\n                reinterpret_cast<void *>(scn.lParam));\n        break;\n\n    case SCN_MARGINCLICK:\n        emit qsb->SCN_MARGINCLICK(scn.position, scn.modifiers, scn.margin);\n        break;\n\n    case SCN_MODIFIED:\n        {\n            char *text;\n\n            // Give some protection to the Python bindings.\n            if (scn.text && (scn.modificationType & (SC_MOD_INSERTTEXT|SC_MOD_DELETETEXT) != 0))\n            {\n                text = new char[scn.length + 1];\n                memcpy(text, scn.text, scn.length);\n                text[scn.length] = '\\0';\n            }\n            else\n            {\n                text = 0;\n            }\n\n            emit qsb->SCN_MODIFIED(scn.position, scn.modificationType, text,\n                    scn.length, scn.linesAdded, scn.line, scn.foldLevelNow,\n                    scn.foldLevelPrev, scn.token, scn.annotationLinesAdded);\n\n            if (text)\n                delete[] text;\n\n            break;\n        }\n\n    case SCN_MODIFYATTEMPTRO:\n        emit qsb->SCN_MODIFYATTEMPTRO();\n        break;\n\n    case SCN_NEEDSHOWN:\n        emit qsb->SCN_NEEDSHOWN(scn.position, scn.length);\n        break;\n\n    case SCN_PAINTED:\n        emit qsb->SCN_PAINTED();\n        break;\n\n    case SCN_SAVEPOINTLEFT:\n        emit qsb->SCN_SAVEPOINTLEFT();\n        break;\n\n    case SCN_SAVEPOINTREACHED:\n        emit qsb->SCN_SAVEPOINTREACHED();\n        break;\n\n    case SCN_STYLENEEDED:\n        emit qsb->SCN_STYLENEEDED(scn.position);\n        break;\n\n    case SCN_UPDATEUI:\n        emit qsb->SCN_UPDATEUI(scn.updated);\n        break;\n\n    case SCN_USERLISTSELECTION:\n        emit qsb->SCN_USERLISTSELECTION(scn.text, scn.wParam);\n        break;\n\n    case SCN_ZOOM:\n        emit qsb->SCN_ZOOM();\n        break;\n\n    default:\n        qWarning(\"Unknown notification: %u\", scn.nmhdr.code);\n    }\n}\n\n\n\n// Convert a selection to mime data.\nQMimeData *QsciScintillaQt::mimeSelection(\n        const QSCI_SCI_NAMESPACE(SelectionText) &text) const\n{\n    return qsb->toMimeData(QByteArray(text.Data()), text.rectangular);\n}\n\n\n\n// Copy the selected text to the clipboard.\nvoid QsciScintillaQt::CopyToClipboard(\n        const QSCI_SCI_NAMESPACE(SelectionText) &selectedText)\n{\n    QApplication::clipboard()->setMimeData(mimeSelection(selectedText));\n}\n\n\n// Implement copy.\nvoid QsciScintillaQt::Copy()\n{\n    if (!sel.Empty())\n    {\n        QSCI_SCI_NAMESPACE(SelectionText) text;\n\n        CopySelectionRange(&text);\n        CopyToClipboard(text);\n    }\n}\n\n\n// Implement pasting text.\nvoid QsciScintillaQt::Paste()\n{\n    pasteFromClipboard(QClipboard::Clipboard);\n}\n\n\n// Paste text from either the clipboard or selection.\nvoid QsciScintillaQt::pasteFromClipboard(QClipboard::Mode mode)\n{\n    int len;\n    const char *s;\n    bool rectangular;\n\n    const QMimeData *source = QApplication::clipboard()->mimeData(mode);\n\n    if (!source || !qsb->canInsertFromMimeData(source))\n        return;\n\n    QByteArray text = qsb->fromMimeData(source, rectangular);\n    len = text.length();\n    s = text.data();\n\n    std::string dest = QSCI_SCI_NAMESPACE(Document)::TransformLineEnds(s, len,\n            pdoc->eolMode);\n\n    QSCI_SCI_NAMESPACE(SelectionText) selText;\n    selText.Copy(dest, (IsUnicodeMode() ? SC_CP_UTF8 : 0),\n            vs.styles[STYLE_DEFAULT].characterSet, rectangular, false);\n\n    QSCI_SCI_NAMESPACE(UndoGroup) ug(pdoc);\n\n    ClearSelection();\n\n    QSCI_SCI_NAMESPACE(SelectionPosition) start = sel.IsRectangular()\n            ? sel.Rectangular().Start() : sel.Range(sel.Main()).Start();\n\n    if (selText.rectangular)\n        PasteRectangular(start, selText.Data(), selText.Length());\n    else\n        InsertPaste(start, selText.Data(), selText.Length());\n\n    NotifyChange();\n    Redraw();\n}\n\n\n// Create a call tip window.\nvoid QsciScintillaQt::CreateCallTipWindow(QSCI_SCI_NAMESPACE(PRectangle) rc)\n{\n    if (!ct.wCallTip.Created())\n        ct.wCallTip = ct.wDraw = new QsciSciCallTip(qsb, this);\n\n    QsciSciCallTip *w = reinterpret_cast<QsciSciCallTip *>(ct.wCallTip.GetID());\n\n    w->resize(rc.right - rc.left, rc.bottom - rc.top);\n    ct.wCallTip.Show();\n}\n\n\n// Add an item to the right button menu.\nvoid QsciScintillaQt::AddToPopUp(const char *label, int cmd, bool enabled)\n{\n    QsciSciPopup *pm = static_cast<QsciSciPopup *>(popup.GetID());\n\n    if (*label)\n        pm->addItem(qApp->translate(\"ContextMenu\", label), cmd, enabled, this);\n    else\n        pm->addSeparator();\n}\n\n\n// Claim the selection.\nvoid QsciScintillaQt::ClaimSelection()\n{\n    bool isSel = !sel.Empty();\n\n    if (isSel)\n    {\n        QClipboard *cb = QApplication::clipboard();\n\n        // If we support X11 style selection then make it available now.\n        if (cb->supportsSelection())\n        {\n            QSCI_SCI_NAMESPACE(SelectionText) text;\n\n            CopySelectionRange(&text);\n\n            if (text.Data())\n                cb->setMimeData(mimeSelection(text), QClipboard::Selection);\n        }\n\n        primarySelection = true;\n    }\n    else\n        primarySelection = false;\n\n    emit qsb->QSCN_SELCHANGED(isSel);\n}\n\n\n// Unclaim the selection.\nvoid QsciScintillaQt::UnclaimSelection()\n{\n    if (primarySelection)\n    {\n        primarySelection = false;\n        qsb->viewport()->update();\n    }\n}\n\n\n// Implemented to provide compatibility with the Windows version.\nsptr_t QsciScintillaQt::DirectFunction(QsciScintillaQt *sciThis, unsigned int iMessage,\n        uptr_t wParam, sptr_t lParam)\n{\n    return sciThis->WndProc(iMessage,wParam,lParam);\n}\n\n\n// Draw the contents of the widget.\nvoid QsciScintillaQt::paintEvent(QPaintEvent *e)\n{\n    QSCI_SCI_NAMESPACE(Surface) *sw = QSCI_SCI_NAMESPACE(Surface)::Allocate(SC_TECHNOLOGY_DEFAULT);\n\n    if (!sw)\n        return;\n\n    paintState = painting;\n\n    const QRect &qr = e->rect();\n\n    rcPaint.left = qr.left();\n    rcPaint.top = qr.top();\n    rcPaint.right = qr.right() + 1;\n    rcPaint.bottom = qr.bottom() + 1;\n\n    QSCI_SCI_NAMESPACE(PRectangle) rcText = GetTextRectangle();\n    paintingAllText = rcPaint.Contains(rcText);\n\n    QPainter painter(qsb->viewport());\n\n    sw->Init(&painter);\n    sw->SetUnicodeMode(CodePage() == SC_CP_UTF8);\n    Paint(sw, rcPaint);\n\n    delete sw;\n\n    // If the painting area was insufficient to cover the new style or brace\n    // highlight positions then repaint the whole thing.\n    if (paintState == paintAbandoned)\n        qsb->viewport()->update();\n\n    paintState = notPainting;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ScintillaQt.h",
    "content": "// The definition of the Qt specific subclass of ScintillaBase.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#ifndef SCINTILLAQT_H\n#define\tSCINTILLAQT_H\n\n\n#include <qtimer.h>\n#include <qclipboard.h>\n\n#include <Qsci/qsciglobal.h>\n\n#include \"SciNamespace.h\"\n\n// These are needed because Scintilla class header files don't manage their own\n// dependencies properly.\n#include <algorithm>\n#include <assert.h>\n#include <ctype.h>\n#include <stdlib.h>\n#include <string>\n#include \"ILexer.h\"\n#include \"Platform.h\"\n#include \"Scintilla.h\"\n#include \"SplitVector.h\"\n#include \"Partitioning.h\"\n#include \"CellBuffer.h\"\n#include \"CharClassify.h\"\n#include \"RunStyles.h\"\n#include \"CaseFolder.h\"\n#include \"Decoration.h\"\n#include \"Document.h\"\n#include \"Style.h\"\n#include \"XPM.h\"\n#include \"LineMarker.h\"\n#include \"Indicator.h\"\n#include \"ViewStyle.h\"\n#include \"KeyMap.h\"\n#include \"ContractionState.h\"\n#include \"Selection.h\"\n#include \"PositionCache.h\"\n#include \"Editor.h\"\n#include \"AutoComplete.h\"\n#include \"CallTip.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n\n#include \"ScintillaBase.h\"\n\n\nQT_BEGIN_NAMESPACE\nclass QPaintEvent;\nclass QDropEvent;\nclass QMimeData;\nQT_END_NAMESPACE\n\nclass QsciScintillaBase;\nclass QsciSciCallTip;\nclass QsciSciPopup;\n\n\n// This is an internal class but it is referenced by a public class so it has\n// to have a Qsci prefix rather than being put in the Scintilla namespace\n// which would mean exposing the SCI_NAMESPACE mechanism).\nclass QsciScintillaQt : public QSCI_SCI_NAMESPACE(ScintillaBase)\n{\n\tfriend class QsciScintillaBase;\n\tfriend class QsciSciCallTip;\n\tfriend class QsciSciPopup;\n\npublic:\n\tQsciScintillaQt(QsciScintillaBase *qsb_);\n\tvirtual ~QsciScintillaQt();\n\n\tvirtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam,\n            sptr_t lParam);\n\nprivate:\n\tvoid Initialise();\n\tvoid Finalise();\n\tvoid StartDrag();\n\tsptr_t DefWndProc(unsigned int, uptr_t, sptr_t);\n\tvoid SetTicking(bool);\n\tvoid SetMouseCapture(bool on);\n\tbool HaveMouseCapture();\n\tvoid SetVerticalScrollPos();\n\tvoid SetHorizontalScrollPos();\n\tbool ModifyScrollBars(int nMax, int nPage);\n\tvoid ReconfigureScrollBars();\n\tvoid NotifyChange();\n\tvoid NotifyParent(QSCI_SCI_NAMESPACE(SCNotification) scn);\n\tvoid CopyToClipboard(\n            const QSCI_SCI_NAMESPACE(SelectionText) &selectedText);\n\tvoid Copy();\n\tvoid Paste();\n\tvoid CreateCallTipWindow(QSCI_SCI_NAMESPACE(PRectangle) rc);\n\tvoid AddToPopUp(const char *label, int cmd = 0, bool enabled = true);\n\tvoid ClaimSelection();\n\tvoid UnclaimSelection();\n\tstatic sptr_t DirectFunction(QsciScintillaQt *sci, unsigned int iMessage,\n            uptr_t wParam,sptr_t lParam);\n\n\tQMimeData *mimeSelection(\n            const QSCI_SCI_NAMESPACE(SelectionText) &text) const;\n\tvoid paintEvent(QPaintEvent *e);\n    void pasteFromClipboard(QClipboard::Mode mode);\n\n\tbool capturedMouse;\n\tQsciScintillaBase *qsb;\n\tQTimer qtimer;\n};\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/features/qscintilla2.prf",
    "content": "greaterThan(QT_MAJOR_VERSION, 4) {\n    QT += widgets printsupport\n\n    greaterThan(QT_MINOR_VERSION, 1) {\n        macx:QT += macextras\n    }\n}\n\nINCLUDEPATH += $$[QT_INSTALL_HEADERS]\n\nLIBS += -L$$[QT_INSTALL_LIBS]\n\nCONFIG(debug, debug|release) {\n    mac: {\n        LIBS += -lqscintilla2_debug\n    } else {\n        win32: {\n            LIBS += -lqscintilla2d\n        } else {\n            LIBS += -lqscintilla2\n        }\n    }\n} else {\n    LIBS += -lqscintilla2\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciabstractapis.cpp",
    "content": "// This module implements the QsciAbstractAPIs class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qsciabstractapis.h\"\n\n#include \"Qsci/qscilexer.h\"\n\n\n// The ctor.\nQsciAbstractAPIs::QsciAbstractAPIs(QsciLexer *lexer)\n    : QObject(lexer),\n      lex(lexer)\n{\n    lexer->setAPIs(this);\n}\n\n\n// The dtor.\nQsciAbstractAPIs::~QsciAbstractAPIs()\n{\n}\n\n\n// Return the lexer.\nQsciLexer *QsciAbstractAPIs::lexer() const\n{\n    return lex;\n}\n\n\n// Called when the user has made a selection from the auto-completion list.\nvoid QsciAbstractAPIs::autoCompletionSelected(const QString &selection)\n{\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciapis.cpp",
    "content": "// This module implements the QsciAPIs class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include <stdlib.h>\n\n#include \"Qsci/qsciapis.h\"\n\n#include <qapplication.h>\n#include <qdatastream.h>\n#include <qdir.h>\n#include <qevent.h>\n#include <qfile.h>\n#include <qmap.h>\n#include <qtextstream.h>\n#include <qthread.h>\n\n#include <QLibraryInfo>\n\n#include \"Qsci/qscilexer.h\"\n\n\n\n// The version number of the prepared API information format.\nconst unsigned char PreparedDataFormatVersion = 0;\n\n\n// This class contains prepared API information.\nstruct QsciAPIsPrepared\n{\n    // The word dictionary is a map of individual words and a list of positions\n    // each occurs in the sorted list of APIs.  A position is a tuple of the\n    // index into the list of APIs and the index into the particular API.\n    QMap<QString, QsciAPIs::WordIndexList> wdict;\n\n    // The case dictionary maps the case insensitive words to the form in which\n    // they are to be used.  It is only used if the language is case\n    // insensitive.\n    QMap<QString, QString> cdict;\n\n\n    // The raw API information.\n    QStringList raw_apis;\n\n    QStringList apiWords(int api_idx, const QStringList &wseps,\n            bool strip_image) const;\n    static QString apiBaseName(const QString &api);\n};\n\n\n\n// Return a particular API entry as a list of words.\nQStringList QsciAPIsPrepared::apiWords(int api_idx, const QStringList &wseps,\n        bool strip_image) const\n{\n    QString base = apiBaseName(raw_apis[api_idx]);\n\n    // Remove any embedded image reference if necessary.\n    if (strip_image)\n    {\n        int tail = base.indexOf('?');\n\n        if (tail >= 0)\n            base.truncate(tail);\n    }\n\n    if (wseps.isEmpty())\n        return QStringList(base);\n\n    return base.split(wseps.first());\n}\n\n\n// Return the name of an API function, ie. without the arguments.\nQString QsciAPIsPrepared::apiBaseName(const QString &api)\n{\n    QString base = api;\n    int tail = base.indexOf('(');\n\n    if (tail >= 0)\n        base.truncate(tail);\n\n    return base.simplified();\n}\n\n\n// The user event type that signals that the worker thread has started.\nconst QEvent::Type WorkerStarted = static_cast<QEvent::Type>(QEvent::User + 1012);\n\n\n// The user event type that signals that the worker thread has finished.\nconst QEvent::Type WorkerFinished = static_cast<QEvent::Type>(QEvent::User + 1013);\n\n\n// The user event type that signals that the worker thread has aborted.\nconst QEvent::Type WorkerAborted = static_cast<QEvent::Type>(QEvent::User + 1014);\n\n\n// This class is the worker thread that post-processes the API set.\nclass QsciAPIsWorker : public QThread\n{\npublic:\n    QsciAPIsWorker(QsciAPIs *apis);\n    virtual ~QsciAPIsWorker();\n\n    virtual void run();\n\n    QsciAPIsPrepared *prepared;\n\nprivate:\n    QsciAPIs *proxy;\n    bool abort;\n};\n\n\n// The worker thread ctor.\nQsciAPIsWorker::QsciAPIsWorker(QsciAPIs *apis)\n    : proxy(apis), prepared(0), abort(false)\n{\n}\n\n\n// The worker thread dtor.\nQsciAPIsWorker::~QsciAPIsWorker()\n{\n    // Tell the thread to stop.  There is no need to bother with a mutex.\n    abort = true;\n\n    // Wait for it to do so and hit it if it doesn't.\n    if (!wait(500))\n        terminate();\n\n    if (prepared)\n        delete prepared;\n}\n\n\n// The worker thread entry point.\nvoid QsciAPIsWorker::run()\n{\n    // Sanity check.\n    if (!prepared)\n        return;\n\n    // Tell the main thread we have started.\n    QApplication::postEvent(proxy, new QEvent(WorkerStarted));\n\n    // Sort the full list.\n    prepared->raw_apis.sort();\n\n    QStringList wseps = proxy->lexer()->autoCompletionWordSeparators();\n    bool cs = proxy->lexer()->caseSensitive();\n\n    // Split each entry into separate words but ignoring any arguments.\n    for (int a = 0; a < prepared->raw_apis.count(); ++a)\n    {\n        // Check to see if we should stop.\n        if (abort)\n            break;\n\n        QStringList words = prepared->apiWords(a, wseps, true);\n\n        for (int w = 0; w < words.count(); ++w)\n        {\n            const QString &word = words[w];\n\n            // Add the word's position to any existing list for this word.\n            QsciAPIs::WordIndexList wil = prepared->wdict[word];\n\n            // If the language is case insensitive and we haven't seen this\n            // word before then save it in the case dictionary.\n            if (!cs && wil.count() == 0)\n                prepared->cdict[word.toUpper()] = word;\n\n            wil.append(QsciAPIs::WordIndex(a, w));\n            prepared->wdict[word] = wil;\n        }\n    }\n\n\n    // Tell the main thread we have finished.\n    QApplication::postEvent(proxy, new QEvent(abort ? WorkerAborted : WorkerFinished));\n}\n\n\n// The ctor.\nQsciAPIs::QsciAPIs(QsciLexer *lexer)\n    : QsciAbstractAPIs(lexer),\n      worker(0), origin_len(0)\n{\n    prep = new QsciAPIsPrepared;\n}\n\n\n// The dtor.\nQsciAPIs::~QsciAPIs()\n{\n    deleteWorker();\n    delete prep;\n}\n\n\n// Delete the worker thread if there is one.\nvoid QsciAPIs::deleteWorker()\n{\n    if (worker)\n    {\n        delete worker;\n        worker = 0;\n    }\n}\n\n\n//! Handle termination events from the worker thread.\nbool QsciAPIs::event(QEvent *e)\n{\n    switch (e->type())\n    {\n    case WorkerStarted:\n        emit apiPreparationStarted();\n        return true;\n\n    case WorkerAborted:\n        deleteWorker();\n        emit apiPreparationCancelled();\n        return true;\n\n    case WorkerFinished:\n        delete prep;\n        old_context.clear();\n\n        prep = worker->prepared;\n        worker->prepared = 0;\n        deleteWorker();\n\n        // Allow the raw API information to be modified.\n        apis = prep->raw_apis;\n\n        emit apiPreparationFinished();\n\n        return true;\n    }\n\n    return QObject::event(e);\n}\n\n\n// Clear the current raw API entries.\nvoid QsciAPIs::clear()\n{\n    apis.clear();\n}\n\n\n// Clear out all API information.\nbool QsciAPIs::load(const QString &filename)\n{\n    QFile f(filename);\n\n    if (!f.open(QIODevice::ReadOnly))\n        return false;\n\n    QTextStream ts(&f);\n\n    for (;;)\n    {\n        QString line = ts.readLine();\n\n        if (line.isEmpty())\n            break;\n\n        apis.append(line);\n    }\n\n    return true;\n}\n\n\n// Add a single API entry.\nvoid QsciAPIs::add(const QString &entry)\n{\n    apis.append(entry);\n}\n\n\n// Remove a single API entry.\nvoid QsciAPIs::remove(const QString &entry)\n{\n    int idx = apis.indexOf(entry);\n\n    if (idx >= 0)\n        apis.removeAt(idx);\n}\n\n\n// Position the \"origin\" cursor into the API entries according to the user\n// supplied context.\nQStringList QsciAPIs::positionOrigin(const QStringList &context, QString &path)\n{\n    // Get the list of words and see if the context is the same as last time we\n    // were called.\n    QStringList new_context;\n    bool same_context = (old_context.count() > 0 && old_context.count() < context.count());\n\n    for (int i = 0; i < context.count(); ++i)\n    {\n        QString word = context[i];\n\n        if (!lexer()->caseSensitive())\n            word = word.toUpper();\n\n        if (i < old_context.count() && old_context[i] != word)\n            same_context = false;\n\n        new_context << word;\n    }\n\n    // If the context has changed then reset the origin.\n    if (!same_context)\n        origin_len = 0;\n\n    // If we have a current origin (ie. the user made a specific selection in\n    // the current context) then adjust the origin to include the last complete\n    // word as the user may have entered more parts of the name without using\n    // auto-completion.\n    if (origin_len > 0)\n    {\n        const QString wsep = lexer()->autoCompletionWordSeparators().first();\n\n        int start_new = old_context.count();\n        int end_new = new_context.count() - 1;\n\n        if (start_new == end_new)\n        {\n            path = old_context.join(wsep);\n            origin_len = path.length();\n        }\n        else\n        {\n            QString fixed = *origin;\n            fixed.truncate(origin_len);\n\n            path = fixed;\n\n            while (start_new < end_new)\n            {\n                // Add this word to the current path.\n                path.append(wsep);\n                path.append(new_context[start_new]);\n                origin_len = path.length();\n\n                // Skip entries in the current origin that don't match the\n                // path.\n                while (origin != prep->raw_apis.end())\n                {\n                    // See if the current origin has come to an end.\n                    if (!originStartsWith(fixed, wsep))\n                        origin = prep->raw_apis.end();\n                    else if (originStartsWith(path, wsep))\n                        break;\n                    else\n                        ++origin;\n                }\n\n                if (origin == prep->raw_apis.end())\n                    break;\n\n                ++start_new;\n            }\n        }\n\n        // Terminate the path.\n        path.append(wsep);\n\n        // If the new text wasn't recognised then reset the origin.\n        if (origin == prep->raw_apis.end())\n            origin_len = 0;\n    }\n\n    if (origin_len == 0)\n        path.truncate(0);\n\n    // Save the \"committed\" context for next time.\n    old_context = new_context;\n    old_context.removeLast();\n\n    return new_context;\n}\n\n\n// Return true if the origin starts with the given path.\nbool QsciAPIs::originStartsWith(const QString &path, const QString &wsep)\n{\n    const QString &orig = *origin;\n\n    if (!orig.startsWith(path))\n        return false;\n\n    // Check that the path corresponds to the end of a word, ie. that what\n    // follows in the origin is either a word separator or a (.\n    QString tail = orig.mid(path.length());\n\n    return (!tail.isEmpty() && (tail.startsWith(wsep) || tail.at(0) == '('));\n}\n\n\n// Add auto-completion words to an existing list.\nvoid QsciAPIs::updateAutoCompletionList(const QStringList &context,\n        QStringList &list)\n{\n    QString path;\n    QStringList new_context = positionOrigin(context, path);\n\n    if (origin_len > 0)\n    {\n        const QString wsep = lexer()->autoCompletionWordSeparators().first();\n        QStringList::const_iterator it = origin;\n\n        unambiguous_context = path;\n\n        while (it != prep->raw_apis.end())\n        {\n            QString base = QsciAPIsPrepared::apiBaseName(*it);\n\n            if (!base.startsWith(path))\n                break;\n\n            // Make sure we have something after the path.\n            if (base != path)\n            {\n                // Get the word we are interested in (ie. the one after the\n                // current origin in path).\n                QString w = base.mid(origin_len + wsep.length()).split(wsep).first();\n\n                // Append the space, we know the origin is unambiguous.\n                w.append(' ');\n\n                if (!list.contains(w))\n                    list << w;\n            }\n\n            ++it;\n        }\n    }\n    else\n    {\n        // At the moment we assume we will add words from multiple contexts.\n        unambiguous_context.truncate(0);\n\n        bool unambig = true;\n        QStringList with_context;\n\n        if (new_context.last().isEmpty())\n            lastCompleteWord(new_context[new_context.count() - 2], with_context, unambig);\n        else\n            lastPartialWord(new_context.last(), with_context, unambig);\n\n        for (int i = 0; i < with_context.count(); ++i)\n        {\n            // Remove any unambigious context.\n            QString noc = with_context[i];\n\n            if (unambig)\n            {\n                int op = noc.indexOf('(');\n\n                if (op >= 0)\n                    noc.truncate(op);\n            }\n\n            list << noc;\n        }\n    }\n}\n\n\n// Get the index list for a particular word if there is one.\nconst QsciAPIs::WordIndexList *QsciAPIs::wordIndexOf(const QString &word) const\n{\n    QString csword;\n\n    // Indirect through the case dictionary if the language isn't case\n    // sensitive.\n    if (lexer()->caseSensitive())\n        csword = word;\n    else\n    {\n        csword = prep->cdict[word];\n\n        if (csword.isEmpty())\n            return 0;\n    }\n\n    // Get the possible API entries if any.\n    const WordIndexList *wl = &prep->wdict[csword];\n\n    if (wl->isEmpty())\n        return 0;\n\n    return wl;\n}\n\n\n// Add auto-completion words based on the last complete word entered.\nvoid QsciAPIs::lastCompleteWord(const QString &word, QStringList &with_context, bool &unambig)\n{\n    // Get the possible API entries if any.\n    const WordIndexList *wl = wordIndexOf(word);\n\n    if (wl)\n        addAPIEntries(*wl, true, with_context, unambig);\n}\n\n\n// Add auto-completion words based on the last partial word entered.\nvoid QsciAPIs::lastPartialWord(const QString &word, QStringList &with_context, bool &unambig)\n{\n    if (lexer()->caseSensitive())\n    {\n        QMap<QString, WordIndexList>::const_iterator it = prep->wdict.lowerBound(word);\n\n        while (it != prep->wdict.end())\n        {\n            if (!it.key().startsWith(word))\n                break;\n\n            addAPIEntries(it.value(), false, with_context, unambig);\n\n            ++it;\n        }\n    }\n    else\n    {\n        QMap<QString, QString>::const_iterator it = prep->cdict.lowerBound(word);\n\n        while (it != prep->cdict.end())\n        {\n            if (!it.key().startsWith(word))\n                break;\n\n            addAPIEntries(prep->wdict[it.value()], false, with_context, unambig);\n\n            ++it;\n        }\n    }\n}\n\n\n// Handle the selection of an entry in the auto-completion list.\nvoid QsciAPIs::autoCompletionSelected(const QString &selection)\n{\n    // If the selection is an API (ie. it has a space separating the selected\n    // word and the optional origin) then remember the origin.\n    QStringList lst = selection.split(' ');\n\n    if (lst.count() != 2)\n    {\n        origin_len = 0;\n        return;\n    }\n\n    const QString &path = lst[1];\n    QString owords;\n\n    if (path.isEmpty())\n        owords = unambiguous_context;\n    else\n    {\n        // Check the parenthesis.\n        if (!path.startsWith(\"(\") || !path.endsWith(\")\"))\n        {\n            origin_len = 0;\n            return;\n        }\n\n        // Remove the parenthesis.\n        owords = path.mid(1, path.length() - 2);\n    }\n\n    origin = qLowerBound(prep->raw_apis, owords);\n    /*\n     * There is a bug somewhere, either in qLowerBound() or QList (or in GCC as\n     * it seems to be Linux specific and the Qt code is the same on all\n     * platforms) that the following line seems to fix.  Note that it is\n     * actually the call to detach() within begin() that is the important bit.\n     */\n    prep->raw_apis.begin();\n    origin_len = owords.length();\n}\n\n\n// Add auto-completion words for a particular word (defined by where it appears\n// in the APIs) and depending on whether the word was complete (when it's\n// actually the next word in the API entry that is of interest) or not.\nvoid QsciAPIs::addAPIEntries(const WordIndexList &wl, bool complete,\n        QStringList &with_context, bool &unambig)\n{\n    QStringList wseps = lexer()->autoCompletionWordSeparators();\n\n    for (int w = 0; w < wl.count(); ++w)\n    {\n        const WordIndex &wi = wl[w];\n\n        QStringList api_words = prep->apiWords(wi.first, wseps, false);\n\n        int idx = wi.second;\n\n        if (complete)\n        {\n            // Skip if this is the last word.\n            if (++idx >= api_words.count())\n                continue;\n        }\n\n        QString api_word;\n\n        if (idx == 0)\n            api_word = api_words[0] + ' ';\n        else\n        {\n            QStringList orgl = api_words.mid(0, idx);\n\n            QString org = orgl.join(wseps.first());\n\n            api_word = QString(\"%1 (%2)\").arg(api_words[idx]).arg(org);\n\n            // See if the origin has been used before.\n            if (unambig)\n                if (unambiguous_context.isEmpty())\n                    unambiguous_context = org;\n                else if (unambiguous_context != org)\n                {\n                    unambiguous_context.truncate(0);\n                    unambig = false;\n                }\n        }\n\n        if (!with_context.contains(api_word))\n            with_context.append(api_word);\n    }\n}\n\n\n// Return the call tip for a function.\nQStringList QsciAPIs::callTips(const QStringList &context, int commas,\n        QsciScintilla::CallTipsStyle style,\n        QList<int> &shifts)\n{\n    QString path;\n    QStringList new_context = positionOrigin(context, path);\n    QStringList wseps = lexer()->autoCompletionWordSeparators();\n    QStringList cts;\n\n    if (origin_len > 0)\n    {\n        QStringList::const_iterator it = origin;\n        QString prev;\n\n        // Work out the length of the context.\n        const QString &wsep = wseps.first();\n        QStringList strip = path.split(wsep);\n        strip.removeLast();\n        int ctstart = strip.join(wsep).length();\n\n        if (ctstart)\n            ctstart += wsep.length();\n\n        int shift;\n\n        if (style == QsciScintilla::CallTipsContext)\n        {\n            shift = ctstart;\n            ctstart = 0;\n        }\n        else\n            shift = 0;\n\n        // Make sure we only look at the functions we are interested in.\n        path.append('(');\n\n        while (it != prep->raw_apis.end() && (*it).startsWith(path))\n        {\n            QString w = (*it).mid(ctstart);\n\n            if (w != prev && enoughCommas(w, commas))\n            {\n                shifts << shift;\n                cts << w;\n                prev = w;\n            }\n\n            ++it;\n        }\n    }\n    else\n    {\n        const QString &fname = new_context[new_context.count() - 2];\n\n        // Find everywhere the function name appears in the APIs.\n        const WordIndexList *wil = wordIndexOf(fname);\n\n        if (wil)\n            for (int i = 0; i < wil->count(); ++i)\n            {\n                const WordIndex &wi = (*wil)[i];\n                QStringList awords = prep->apiWords(wi.first, wseps, true);\n\n                // Check the word is the function name and not part of any\n                // context.\n                if (wi.second != awords.count() - 1)\n                    continue;\n\n                const QString &api = prep->raw_apis[wi.first];\n\n                int tail = api.indexOf('(');\n\n                if (tail < 0)\n                    continue;\n\n                if (!enoughCommas(api, commas))\n                    continue;\n\n                if (style == QsciScintilla::CallTipsNoContext)\n                {\n                    shifts << 0;\n                    cts << (fname + api.mid(tail));\n                }\n                else\n                {\n                    shifts << tail - fname.length();\n                    cts << api;\n                }\n            }\n    }\n\n    return cts;\n}\n\n\n// Return true if a string has enough commas in the argument list.\nbool QsciAPIs::enoughCommas(const QString &s, int commas)\n{\n    int end = s.indexOf(')');\n\n    if (end < 0)\n        return false;\n\n    QString w = s.left(end);\n\n    return (w.count(',') >= commas);\n}\n\n\n// Ensure the list is ready.\nvoid QsciAPIs::prepare()\n{\n    // Handle the trivial case.\n    if (worker)\n        return;\n\n    QsciAPIsPrepared *new_apis = new QsciAPIsPrepared;\n    new_apis->raw_apis = apis;\n\n    worker = new QsciAPIsWorker(this);\n    worker->prepared = new_apis;\n    worker->start();\n}\n\n\n// Cancel any current preparation.\nvoid QsciAPIs::cancelPreparation()\n{\n    deleteWorker();\n}\n\n\n// Check that a prepared API file exists.\nbool QsciAPIs::isPrepared(const QString &filename) const\n{\n    QString pname = prepName(filename);\n\n    if (pname.isEmpty())\n        return false;\n\n    QFileInfo fi(pname);\n\n    return fi.exists();\n}\n\n\n// Load the prepared API information.\nbool QsciAPIs::loadPrepared(const QString &filename)\n{\n    QString pname = prepName(filename);\n\n    if (pname.isEmpty())\n        return false;\n\n    // Read the prepared data and decompress it.\n    QFile pf(pname);\n\n    if (!pf.open(QIODevice::ReadOnly))\n        return false;\n\n    QByteArray cpdata = pf.readAll();\n\n    pf.close();\n\n    if (cpdata.count() == 0)\n        return false;\n\n    QByteArray pdata = qUncompress(cpdata);\n\n    // Extract the data.\n    QDataStream pds(pdata);\n\n    unsigned char vers;\n    pds >> vers;\n\n    if (vers > PreparedDataFormatVersion)\n        return false;\n\n    char *lex_name;\n    pds >> lex_name;\n\n    if (qstrcmp(lex_name, lexer()->lexer()) != 0)\n    {\n        delete[] lex_name;\n        return false;\n    }\n\n    delete[] lex_name;\n\n    prep->wdict.clear();\n    pds >> prep->wdict;\n\n    if (!lexer()->caseSensitive())\n    {\n        // Build up the case dictionary.\n        prep->cdict.clear();\n\n        QMap<QString, WordIndexList>::const_iterator it = prep->wdict.begin();\n\n        while (it != prep->wdict.end())\n        {\n            prep->cdict[it.key().toUpper()] = it.key();\n\n            ++it;\n        }\n\n    }\n\n    prep->raw_apis.clear();\n    pds >> prep->raw_apis;\n\n    // Allow the raw API information to be modified.\n    apis = prep->raw_apis;\n\n    return true;\n}\n\n\n// Save the prepared API information.\nbool QsciAPIs::savePrepared(const QString &filename) const\n{\n    QString pname = prepName(filename, true);\n\n    if (pname.isEmpty())\n        return false;\n\n    // Write the prepared data to a memory buffer.\n    QByteArray pdata;\n    QDataStream pds(&pdata, QIODevice::WriteOnly);\n\n    // Use a serialisation format supported by Qt v3.0 and later.\n    pds.setVersion(QDataStream::Qt_3_0);\n    pds << PreparedDataFormatVersion;\n    pds << lexer()->lexer();\n    pds << prep->wdict;\n    pds << prep->raw_apis;\n\n    // Compress the data and write it.\n    QFile pf(pname);\n\n    if (!pf.open(QIODevice::WriteOnly|QIODevice::Truncate))\n        return false;\n\n    if (pf.write(qCompress(pdata)) < 0)\n    {\n        pf.close();\n        return false;\n    }\n\n    pf.close();\n    return true;\n}\n\n\n// Return the name of the default prepared API file.\nQString QsciAPIs::defaultPreparedName() const\n{\n    return prepName(QString());\n}\n\n\n// Return the name of a prepared API file.\nQString QsciAPIs::prepName(const QString &filename, bool mkpath) const\n{\n    // Handle the tivial case.\n    if (!filename.isEmpty())\n        return filename;\n\n    QString pdname;\n    char *qsci = getenv(\"QSCIDIR\");\n\n    if (qsci)\n        pdname = qsci;\n    else\n    {\n        static const char *qsci_dir = \".qsci\";\n\n        QDir pd = QDir::home();\n\n        if (mkpath && !pd.exists(qsci_dir) && !pd.mkdir(qsci_dir))\n            return QString();\n\n        pdname = pd.filePath(qsci_dir);\n    }\n\n    return QString(\"%1/%2.pap\").arg(pdname).arg(lexer()->lexer());\n}\n\n\n// Return installed API files.\nQStringList QsciAPIs::installedAPIFiles() const\n{\n    QString qtdir = QLibraryInfo::location(QLibraryInfo::DataPath);\n\n    QDir apidir = QDir(QString(\"%1/qsci/api/%2\").arg(qtdir).arg(lexer()->lexer()));\n    QStringList filenames;\n\n    QStringList filters;\n    filters << \"*.api\";\n\n    QFileInfoList flist = apidir.entryInfoList(filters, QDir::Files, QDir::IgnoreCase);\n\n    foreach (QFileInfo fi, flist)\n        filenames << fi.absoluteFilePath();\n\n    return filenames;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscicommand.cpp",
    "content": "// This module implements the QsciCommand class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscicommand.h\"\n\n#include <qnamespace.h>\n#include <qapplication.h>\n\n#include \"Qsci/qsciscintilla.h\"\n#include \"Qsci/qsciscintillabase.h\"\n\n\nstatic int convert(int key);\n\n\n// The ctor.\nQsciCommand::QsciCommand(QsciScintilla *qs, QsciCommand::Command cmd, int key,\n        int altkey, const char *desc)\n    : qsCmd(qs), scicmd(cmd), qkey(key), qaltkey(altkey), descCmd(desc)\n{\n    scikey = convert(qkey);\n\n    if (scikey)\n        qsCmd->SendScintilla(QsciScintillaBase::SCI_ASSIGNCMDKEY, scikey,\n                scicmd);\n\n    scialtkey = convert(qaltkey);\n\n    if (scialtkey)\n        qsCmd->SendScintilla(QsciScintillaBase::SCI_ASSIGNCMDKEY, scialtkey,\n                scicmd);\n}\n\n\n// Execute the command.\nvoid QsciCommand::execute()\n{\n    qsCmd->SendScintilla(scicmd);\n}\n\n\n// Bind a key to a command.\nvoid QsciCommand::setKey(int key)\n{\n    bindKey(key,qkey,scikey);\n}\n\n\n// Bind an alternate key to a command.\nvoid QsciCommand::setAlternateKey(int altkey)\n{\n    bindKey(altkey,qaltkey,scialtkey);\n}\n\n\n// Do the hard work of binding a key.\nvoid QsciCommand::bindKey(int key,int &qk,int &scik)\n{\n    int new_scikey;\n\n    // Ignore if it is invalid, allowing for the fact that we might be\n    // unbinding it.\n    if (key)\n    {\n        new_scikey = convert(key);\n\n        if (!new_scikey)\n            return;\n    }\n    else\n        new_scikey = 0;\n\n    if (scik)\n        qsCmd->SendScintilla(QsciScintillaBase::SCI_CLEARCMDKEY, scik);\n\n    qk = key;\n    scik = new_scikey;\n\n    if (scik)\n        qsCmd->SendScintilla(QsciScintillaBase::SCI_ASSIGNCMDKEY, scik, scicmd);\n}\n\n\n// See if a key is valid.\nbool QsciCommand::validKey(int key)\n{\n    return convert(key);\n}\n\n\n// Convert a Qt character to the Scintilla equivalent.  Return zero if it is\n// invalid.\nstatic int convert(int key)\n{\n    // Convert the modifiers.\n    int sci_mod = 0;\n\n    if (key & Qt::SHIFT)\n        sci_mod |= QsciScintillaBase::SCMOD_SHIFT;\n\n    if (key & Qt::CTRL)\n        sci_mod |= QsciScintillaBase::SCMOD_CTRL;\n\n    if (key & Qt::ALT)\n        sci_mod |= QsciScintillaBase::SCMOD_ALT;\n\n    if (key & Qt::META)\n        sci_mod |= QsciScintillaBase::SCMOD_META;\n\n    key &= ~Qt::MODIFIER_MASK;\n\n    // Convert the key.\n    int sci_key = QsciScintillaBase::commandKey(key, sci_mod);\n\n    if (sci_key)\n        sci_key |= (sci_mod << 16);\n\n    return sci_key;\n}\n\n\n// Return the translated user friendly description.\nQString QsciCommand::description() const\n{\n    return qApp->translate(\"QsciCommand\", descCmd);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscicommandset.cpp",
    "content": "// This module implements the QsciCommandSet class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscicommandset.h\"\n\n#include <qsettings.h>\n\n#include \"Qsci/qscicommand.h\"\n#include \"Qsci/qsciscintilla.h\"\n#include \"Qsci/qsciscintillabase.h\"\n\n\n// Starting with QScintilla v2.7 the standard OS/X keyboard shortcuts are used\n// where possible.  In order to restore the behaviour of earlier versions then\n// #define DONT_USE_OSX_KEYS here or add it to the qmake project (.pro) file.\n#if defined(Q_OS_MAC) && !defined(DONT_USE_OSX_KEYS)\n#define USING_OSX_KEYS\n#else\n#undef  USING_OSX_KEYS\n#endif\n\n\n// The ctor.\nQsciCommandSet::QsciCommandSet(QsciScintilla *qs) : qsci(qs)\n{\n    struct sci_cmd {\n        QsciCommand::Command cmd;\n        int key;\n        int altkey;\n        const char *desc;\n    };\n\n    static struct sci_cmd cmd_table[] = {\n        {\n            QsciCommand::LineDown,\n            Qt::Key_Down,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_N | Qt::META,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move down one line\")\n        },\n        {\n            QsciCommand::LineDownExtend,\n            Qt::Key_Down | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_N | Qt::META | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Extend selection down one line\")\n        },\n        {\n            QsciCommand::LineDownRectExtend,\n            Qt::Key_Down | Qt::ALT | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_N | Qt::META | Qt::ALT | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend rectangular selection down one line\")\n        },\n        {\n            QsciCommand::LineScrollDown,\n            Qt::Key_Down | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Scroll view down one line\")\n        },\n        {\n            QsciCommand::LineUp,\n            Qt::Key_Up,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_P | Qt::META,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move up one line\")\n        },\n        {\n            QsciCommand::LineUpExtend,\n            Qt::Key_Up | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_P | Qt::META | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Extend selection up one line\")\n        },\n        {\n            QsciCommand::LineUpRectExtend,\n            Qt::Key_Up | Qt::ALT | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_P | Qt::META | Qt::ALT | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend rectangular selection up one line\")\n        },\n        {\n            QsciCommand::LineScrollUp,\n            Qt::Key_Up | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Scroll view up one line\")\n        },\n        {\n            QsciCommand::ScrollToStart,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Home,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Scroll to start of document\")\n        },\n        {\n            QsciCommand::ScrollToEnd,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_End,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Scroll to end of document\")\n        },\n        {\n            QsciCommand::VerticalCentreCaret,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_L | Qt::META,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Scroll vertically to centre current line\")\n        },\n        {\n            QsciCommand::ParaDown,\n            Qt::Key_BracketRight | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move down one paragraph\")\n        },\n        {\n            QsciCommand::ParaDownExtend,\n            Qt::Key_BracketRight | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection down one paragraph\")\n        },\n        {\n            QsciCommand::ParaUp,\n            Qt::Key_BracketLeft | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move up one paragraph\")\n        },\n        {\n            QsciCommand::ParaUpExtend,\n            Qt::Key_BracketLeft | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection up one paragraph\")\n        },\n        {\n            QsciCommand::CharLeft,\n            Qt::Key_Left,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_B | Qt::META,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move left one character\")\n        },\n        {\n            QsciCommand::CharLeftExtend,\n            Qt::Key_Left | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_B | Qt::META | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection left one character\")\n        },\n        {\n            QsciCommand::CharLeftRectExtend,\n            Qt::Key_Left | Qt::ALT | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_B | Qt::META | Qt::ALT | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend rectangular selection left one character\")\n        },\n        {\n            QsciCommand::CharRight,\n            Qt::Key_Right,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_F | Qt::META,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move right one character\")\n        },\n        {\n            QsciCommand::CharRightExtend,\n            Qt::Key_Right | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_F | Qt::META | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection right one character\")\n        },\n        {\n            QsciCommand::CharRightRectExtend,\n            Qt::Key_Right | Qt::ALT | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_F | Qt::META | Qt::ALT | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend rectangular selection right one character\")\n        },\n        {\n            QsciCommand::WordLeft,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Left | Qt::ALT,\n#else\n            Qt::Key_Left | Qt::CTRL,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move left one word\")\n        },\n        {\n            QsciCommand::WordLeftExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Left | Qt::ALT | Qt::SHIFT,\n#else\n            Qt::Key_Left | Qt::CTRL | Qt::SHIFT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Extend selection left one word\")\n        },\n        {\n            QsciCommand::WordRight,\n#if defined(USING_OSX_KEYS)\n            0,\n#else\n            Qt::Key_Right | Qt::CTRL,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move right one word\")\n        },\n        {\n            QsciCommand::WordRightExtend,\n            Qt::Key_Right | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Extend selection right one word\")\n        },\n        {\n            QsciCommand::WordLeftEnd,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move to end of previous word\")\n        },\n        {\n            QsciCommand::WordLeftEndExtend,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to end of previous word\")\n        },\n        {\n            QsciCommand::WordRightEnd,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Right | Qt::ALT,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move to end of next word\")\n        },\n        {\n            QsciCommand::WordRightEndExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Right | Qt::ALT | Qt::SHIFT,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to end of next word\")\n        },\n        {\n            QsciCommand::WordPartLeft,\n            Qt::Key_Slash | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move left one word part\")\n        },\n        {\n            QsciCommand::WordPartLeftExtend,\n            Qt::Key_Slash | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection left one word part\")\n        },\n        {\n            QsciCommand::WordPartRight,\n            Qt::Key_Backslash | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move right one word part\")\n        },\n        {\n            QsciCommand::WordPartRightExtend,\n            Qt::Key_Backslash | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection right one word part\")\n        },\n        {\n            QsciCommand::Home,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_A | Qt::META,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move to start of document line\")\n        },\n        {\n            QsciCommand::HomeExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_A | Qt::META | Qt::SHIFT,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to start of document line\")\n        },\n        {\n            QsciCommand::HomeRectExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_A | Qt::META | Qt::ALT | Qt::SHIFT,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend rectangular selection to start of document line\")\n        },\n        {\n            QsciCommand::HomeDisplay,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Left | Qt::CTRL,\n#else\n            Qt::Key_Home | Qt::ALT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move to start of display line\")\n        },\n        {\n            QsciCommand::HomeDisplayExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Left | Qt::CTRL | Qt::SHIFT,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to start of display line\")\n        },\n        {\n            QsciCommand::HomeWrap,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Move to start of display or document line\")\n        },\n        {\n            QsciCommand::HomeWrapExtend,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to start of display or document line\")\n        },\n        {\n            QsciCommand::VCHome,\n#if defined(USING_OSX_KEYS)\n            0,\n#else\n            Qt::Key_Home,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                \"Move to first visible character in document line\")\n        },\n        {\n            QsciCommand::VCHomeExtend,\n#if defined(USING_OSX_KEYS)\n            0,\n#else\n            Qt::Key_Home | Qt::SHIFT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                \"Extend selection to first visible character in document line\")\n        },\n        {\n            QsciCommand::VCHomeRectExtend,\n#if defined(USING_OSX_KEYS)\n            0,\n#else\n            Qt::Key_Home | Qt::ALT | Qt::SHIFT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                \"Extend rectangular selection to first visible character in document line\")\n        },\n        {\n            QsciCommand::VCHomeWrap,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Move to first visible character of display in document line\")\n        },\n        {\n            QsciCommand::VCHomeWrapExtend,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to first visible character in display or document line\")\n        },\n        {\n            QsciCommand::LineEnd,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_E | Qt::META,\n#else\n            Qt::Key_End,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move to end of document line\")\n        },\n        {\n            QsciCommand::LineEndExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_E | Qt::META | Qt::SHIFT,\n#else\n            Qt::Key_End | Qt::SHIFT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to end of document line\")\n        },\n        {\n            QsciCommand::LineEndRectExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_E | Qt::META | Qt::ALT | Qt::SHIFT,\n#else\n            Qt::Key_End | Qt::ALT | Qt::SHIFT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend rectangular selection to end of document line\")\n        },\n        {\n            QsciCommand::LineEndDisplay,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Right | Qt::CTRL,\n#else\n            Qt::Key_End | Qt::ALT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move to end of display line\")\n        },\n        {\n            QsciCommand::LineEndDisplayExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Right | Qt::CTRL | Qt::SHIFT,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to end of display line\")\n        },\n        {\n            QsciCommand::LineEndWrap,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Move to end of display or document line\")\n        },\n        {\n            QsciCommand::LineEndWrapExtend,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to end of display or document line\")\n        },\n        {\n            QsciCommand::DocumentStart,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Up | Qt::CTRL,\n#else\n            Qt::Key_Home | Qt::CTRL,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move to start of document\")\n        },\n        {\n            QsciCommand::DocumentStartExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Up | Qt::CTRL | Qt::SHIFT,\n#else\n            Qt::Key_Home | Qt::CTRL | Qt::SHIFT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to start of document\")\n        },\n        {\n            QsciCommand::DocumentEnd,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Down | Qt::CTRL,\n#else\n            Qt::Key_End | Qt::CTRL,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move to end of document\")\n        },\n        {\n            QsciCommand::DocumentEndExtend,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Down | Qt::CTRL | Qt::SHIFT,\n#else\n            Qt::Key_End | Qt::CTRL | Qt::SHIFT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend selection to end of document\")\n        },\n        {\n            QsciCommand::PageUp,\n            Qt::Key_PageUp,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move up one page\")\n        },\n        {\n            QsciCommand::PageUpExtend,\n            Qt::Key_PageUp | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Extend selection up one page\")\n        },\n        {\n            QsciCommand::PageUpRectExtend,\n            Qt::Key_PageUp | Qt::ALT | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend rectangular selection up one page\")\n        },\n        {\n            QsciCommand::PageDown,\n            Qt::Key_PageDown,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_V | Qt::META,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move down one page\")\n        },\n        {\n            QsciCommand::PageDownExtend,\n            Qt::Key_PageDown | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_V | Qt::META | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Extend selection down one page\")\n        },\n        {\n            QsciCommand::PageDownRectExtend,\n            Qt::Key_PageDown | Qt::ALT | Qt::SHIFT,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_V | Qt::META | Qt::ALT | Qt::SHIFT,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Extend rectangular selection down one page\")\n        },\n        {\n            QsciCommand::StutteredPageUp,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Stuttered move up one page\")\n        },\n        {\n            QsciCommand::StutteredPageUpExtend,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Stuttered extend selection up one page\")\n        },\n        {\n            QsciCommand::StutteredPageDown,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Stuttered move down one page\")\n        },\n        {\n            QsciCommand::StutteredPageDownExtend,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Stuttered extend selection down one page\")\n        },\n        {\n            QsciCommand::Delete,\n            Qt::Key_Delete,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_D | Qt::META,\n#else\n            0,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Delete current character\")\n        },\n        {\n            QsciCommand::DeleteBack,\n            Qt::Key_Backspace,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_H | Qt::META,\n#else\n            Qt::Key_Backspace | Qt::SHIFT,\n#endif\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Delete previous character\")\n        },\n        {\n            QsciCommand::DeleteBackNotLine,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                \"Delete previous character if not at start of line\")\n        },\n        {\n            QsciCommand::DeleteWordLeft,\n            Qt::Key_Backspace | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Delete word to left\")\n        },\n        {\n            QsciCommand::DeleteWordRight,\n            Qt::Key_Delete | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Delete word to right\")\n        },\n        {\n            QsciCommand::DeleteWordRightEnd,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Delete | Qt::ALT,\n#else\n            0,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Delete right to end of next word\")\n        },\n        {\n            QsciCommand::DeleteLineLeft,\n            Qt::Key_Backspace | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Delete line to left\")\n        },\n        {\n            QsciCommand::DeleteLineRight,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_K | Qt::META,\n#else\n            Qt::Key_Delete | Qt::CTRL | Qt::SHIFT,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Delete line to right\")\n        },\n        {\n            QsciCommand::LineDelete,\n            Qt::Key_L | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Delete current line\")\n        },\n        {\n            QsciCommand::LineCut,\n            Qt::Key_L | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Cut current line\")\n        },\n        {\n            QsciCommand::LineCopy,\n            Qt::Key_T | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Copy current line\")\n        },\n        {\n            QsciCommand::LineTranspose,\n            Qt::Key_T | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Transpose current and previous lines\")\n        },\n        {\n            QsciCommand::LineDuplicate,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Duplicate the current line\")\n        },\n        {\n            QsciCommand::SelectAll,\n            Qt::Key_A | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Select all\")\n        },\n        {\n            QsciCommand::MoveSelectedLinesUp,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Move selected lines up one line\")\n        },\n        {\n            QsciCommand::MoveSelectedLinesDown,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\",\n                    \"Move selected lines down one line\")\n        },\n        {\n            QsciCommand::SelectionDuplicate,\n            Qt::Key_D | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Duplicate selection\")\n        },\n        {\n            QsciCommand::SelectionLowerCase,\n            Qt::Key_U | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Convert selection to lower case\")\n        },\n        {\n            QsciCommand::SelectionUpperCase,\n            Qt::Key_U | Qt::CTRL | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Convert selection to upper case\")\n        },\n        {\n            QsciCommand::SelectionCut,\n            Qt::Key_X | Qt::CTRL,\n            Qt::Key_Delete | Qt::SHIFT,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Cut selection\")\n        },\n        {\n            QsciCommand::SelectionCopy,\n            Qt::Key_C | Qt::CTRL,\n            Qt::Key_Insert | Qt::CTRL,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Copy selection\")\n        },\n        {\n            QsciCommand::Paste,\n            Qt::Key_V | Qt::CTRL,\n            Qt::Key_Insert | Qt::SHIFT,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Paste\")\n        },\n        {\n            QsciCommand::EditToggleOvertype,\n            Qt::Key_Insert,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Toggle insert/overtype\")\n        },\n        {\n            QsciCommand::Newline,\n            Qt::Key_Return,\n            Qt::Key_Return | Qt::SHIFT,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Insert newline\")\n        },\n        {\n            QsciCommand::Formfeed,\n            0,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Formfeed\")\n        },\n        {\n            QsciCommand::Tab,\n            Qt::Key_Tab,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Indent one level\")\n        },\n        {\n            QsciCommand::Backtab,\n            Qt::Key_Tab | Qt::SHIFT,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"De-indent one level\")\n        },\n        {\n            QsciCommand::Cancel,\n            Qt::Key_Escape,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Cancel\")\n        },\n        {\n            QsciCommand::Undo,\n            Qt::Key_Z | Qt::CTRL,\n            Qt::Key_Backspace | Qt::ALT,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Undo last command\")\n        },\n        {\n            QsciCommand::Redo,\n#if defined(USING_OSX_KEYS)\n            Qt::Key_Z | Qt::CTRL | Qt::SHIFT,\n#else\n            Qt::Key_Y | Qt::CTRL,\n#endif\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Redo last command\")\n        },\n        {\n            QsciCommand::ZoomIn,\n            Qt::Key_Plus | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Zoom in\")\n        },\n        {\n            QsciCommand::ZoomOut,\n            Qt::Key_Minus | Qt::CTRL,\n            0,\n            QT_TRANSLATE_NOOP(\"QsciCommand\", \"Zoom out\")\n        },\n    };\n\n    // Clear the default map.\n    qsci->SendScintilla(QsciScintillaBase::SCI_CLEARALLCMDKEYS);\n\n    // By default control characters don't do anything (rather than insert the\n    // control character into the text).\n    for (int k = 'A'; k <= 'Z'; ++k)\n        qsci->SendScintilla(QsciScintillaBase::SCI_ASSIGNCMDKEY,\n                k + (QsciScintillaBase::SCMOD_CTRL << 16),\n                QsciScintillaBase::SCI_NULL);\n\n    for (int i = 0; i < sizeof (cmd_table) / sizeof (cmd_table[0]); ++i)\n        cmds.append(\n                new QsciCommand(qsci, cmd_table[i].cmd, cmd_table[i].key,\n                        cmd_table[i].altkey, cmd_table[i].desc));\n}\n\n\n// The dtor.\nQsciCommandSet::~QsciCommandSet()\n{\n    for (int i = 0; i < cmds.count(); ++i)\n        delete cmds.at(i);\n}\n\n\n// Read the command set from settings.\nbool QsciCommandSet::readSettings(QSettings &qs, const char *prefix)\n{\n    bool rc = true;\n    QString skey;\n\n    for (int i = 0; i < cmds.count(); ++i)\n    {\n        QsciCommand *cmd = cmds.at(i);\n\n        skey.sprintf(\"%s/keymap/c%d/\", prefix,\n                static_cast<int>(cmd->command()));\n\n        int key;\n        bool ok;\n\n        // Read the key.\n        ok = qs.contains(skey + \"key\");\n        key = qs.value(skey + \"key\", 0).toInt();\n\n        if (ok)\n            cmd->setKey(key);\n        else\n            rc = false;\n\n        // Read the alternate key.\n        ok = qs.contains(skey + \"alt\");\n        key = qs.value(skey + \"alt\", 0).toInt();\n\n        if (ok)\n            cmd->setAlternateKey(key);\n        else\n            rc = false;\n    }\n\n    return rc;\n}\n\n\n// Write the command set to settings.\nbool QsciCommandSet::writeSettings(QSettings &qs, const char *prefix)\n{\n    bool rc = true;\n    QString skey;\n\n    for (int i = 0; i < cmds.count(); ++i)\n    {\n        QsciCommand *cmd = cmds.at(i);\n\n        skey.sprintf(\"%s/keymap/c%d/\", prefix,\n                static_cast<int>(cmd->command()));\n\n        // Write the key.\n        qs.setValue(skey + \"key\", cmd->key());\n\n        // Write the alternate key.\n        qs.setValue(skey + \"alt\", cmd->key());\n    }\n\n    return rc;\n}\n\n\n// Clear the key bindings.\nvoid QsciCommandSet::clearKeys()\n{\n    for (int i = 0; i < cmds.count(); ++i)\n        cmds.at(i)->setKey(0);\n}\n\n\n// Clear the alternate key bindings.\nvoid QsciCommandSet::clearAlternateKeys()\n{\n    for (int i = 0; i < cmds.count(); ++i)\n        cmds.at(i)->setAlternateKey(0);\n}\n\n\n// Find the command bound to a key.\nQsciCommand *QsciCommandSet::boundTo(int key) const\n{\n    for (int i = 0; i < cmds.count(); ++i)\n    {\n        QsciCommand *cmd = cmds.at(i);\n\n        if (cmd->key() == key || cmd->alternateKey() == key)\n            return cmd;\n    }\n\n    return 0;\n}\n\n\n// Find a command.\nQsciCommand *QsciCommandSet::find(QsciCommand::Command command) const\n{\n    for (int i = 0; i < cmds.count(); ++i)\n    {\n        QsciCommand *cmd = cmds.at(i);\n\n        if (cmd->command() == command)\n            return cmd;\n    }\n\n    // This should never happen.\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscidocument.cpp",
    "content": "// This module implements the QsciDocument class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscidocument.h\"\n#include \"Qsci/qsciscintillabase.h\"\n\n\n// This internal class encapsulates the underlying document and is shared by\n// QsciDocument instances.\nclass QsciDocumentP\n{\npublic:\n    QsciDocumentP() : doc(0), nr_displays(0), nr_attaches(1), modified(false) {}\n\n    void *doc;              // The Scintilla document.\n    int nr_displays;        // The number of displays.\n    int nr_attaches;        // The number of attaches.\n    bool modified;          // Set if not at a save point.\n};\n\n\n// The ctor.\nQsciDocument::QsciDocument()\n{\n    pdoc = new QsciDocumentP();\n}\n\n\n// The dtor.\nQsciDocument::~QsciDocument()\n{\n    detach();\n}\n\n\n// The copy ctor.\nQsciDocument::QsciDocument(const QsciDocument &that)\n{\n    attach(that);\n}\n\n\n// The assignment operator.\nQsciDocument &QsciDocument::operator=(const QsciDocument &that)\n{\n    if (pdoc != that.pdoc)\n    {\n        detach();\n        attach(that);\n    }\n\n    return *this;\n}\n\n\n// Attach an existing document to this one.\nvoid QsciDocument::attach(const QsciDocument &that)\n{\n    ++that.pdoc->nr_attaches;\n    pdoc = that.pdoc;\n}\n\n\n// Detach the underlying document.\nvoid QsciDocument::detach()\n{\n    if (!pdoc)\n        return;\n\n    if (--pdoc->nr_attaches == 0)\n    {\n        if (pdoc->doc && pdoc->nr_displays == 0)\n        {\n            QsciScintillaBase *qsb = QsciScintillaBase::pool();\n\n            // Release the explicit reference to the document.  If the pool is\n            // empty then we just accept the memory leak.\n            if (qsb)\n                qsb->SendScintilla(QsciScintillaBase::SCI_RELEASEDOCUMENT, 0,\n                        pdoc->doc);\n        }\n\n        delete pdoc;\n    }\n\n    pdoc = 0;\n}\n\n\n// Undisplay and detach the underlying document.\nvoid QsciDocument::undisplay(QsciScintillaBase *qsb)\n{\n    if (--pdoc->nr_attaches == 0)\n        delete pdoc;\n    else if (--pdoc->nr_displays == 0)\n    {\n        // Create an explicit reference to the document to keep it alive.\n        qsb->SendScintilla(QsciScintillaBase::SCI_ADDREFDOCUMENT, 0, pdoc->doc);\n    }\n\n    pdoc = 0;\n}\n\n\n// Display the underlying document.\nvoid QsciDocument::display(QsciScintillaBase *qsb, const QsciDocument *from)\n{\n    void *ndoc = (from ? from->pdoc->doc : 0);\n\n    // SCI_SETDOCPOINTER appears to reset the EOL mode so save and restore it.\n    int eol_mode = qsb->SendScintilla(QsciScintillaBase::SCI_GETEOLMODE);\n\n    qsb->SendScintilla(QsciScintillaBase::SCI_SETDOCPOINTER, 0, ndoc);\n    ndoc = qsb->SendScintillaPtrResult(QsciScintillaBase::SCI_GETDOCPOINTER);\n\n    qsb->SendScintilla(QsciScintillaBase::SCI_SETEOLMODE, eol_mode);\n\n    pdoc->doc = ndoc;\n    ++pdoc->nr_displays;\n}\n\n\n// Return the modified state of the document.\nbool QsciDocument::isModified() const\n{\n    return pdoc->modified;\n}\n\n\n// Set the modified state of the document.\nvoid QsciDocument::setModified(bool m)\n{\n    pdoc->modified = m;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexer.cpp",
    "content": "// This module implements the QsciLexer class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexer.h\"\n\n#include <qapplication.h>\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n#include \"Qsci/qsciapis.h\"\n#include \"Qsci/qsciscintilla.h\"\n#include \"Qsci/qsciscintillabase.h\"\n\n\n// The ctor.\nQsciLexer::QsciLexer(QObject *parent)\n    : QObject(parent),\n      autoIndStyle(-1), apiSet(0), attached_editor(0)\n{\n#if defined(Q_OS_WIN)\n    defFont = QFont(\"Verdana\",10);\n#elif defined(Q_OS_MAC)\n    defFont = QFont(\"Verdana\", 12);\n#else\n    defFont = QFont(\"Bitstream Vera Sans\",9);\n#endif\n\n    // Set the default fore and background colours.\n    QPalette pal = QApplication::palette();\n    defColor = pal.text().color();\n    defPaper = pal.base().color();\n\n    // Putting this on the heap means we can keep the style getters const.\n    style_map = new StyleDataMap;\n    style_map->style_data_set = false;\n}\n\n\n// The dtor.\nQsciLexer::~QsciLexer()\n{\n    delete style_map;\n}\n\n\n// Set the attached editor.\nvoid QsciLexer::setEditor(QsciScintilla *editor)\n{\n    attached_editor = editor;\n\n    if (attached_editor)\n    {\n        attached_editor->SendScintilla(QsciScintillaBase::SCI_SETSTYLEBITS,\n                styleBitsNeeded());\n    }\n}\n\n\n// Return the lexer name.\nconst char *QsciLexer::lexer() const\n{\n    return 0;\n}\n\n\n// Return the lexer identifier.\nint QsciLexer::lexerId() const\n{\n    return QsciScintillaBase::SCLEX_CONTAINER;\n}\n\n\n// Return the number of style bits needed by the lexer.\nint QsciLexer::styleBitsNeeded() const\n{\n    if (!attached_editor)\n        return 5;\n\n    return attached_editor->SendScintilla(QsciScintillaBase::SCI_GETSTYLEBITSNEEDED);\n}\n\n\n// Make sure the style defaults have been set.\nvoid QsciLexer::setStyleDefaults() const\n{\n    if (!style_map->style_data_set)\n    {\n        for (int i = 0; i < 128; ++i)\n            if (!description(i).isEmpty())\n                styleData(i);\n\n        style_map->style_data_set = true;\n    }\n}\n\n\n// Return a reference to a style's data, setting up the defaults if needed.\nQsciLexer::StyleData &QsciLexer::styleData(int style) const\n{\n    StyleData &sd = style_map->style_data[style];\n\n    // See if this is a new style by checking if the colour is valid.\n    if (!sd.color.isValid())\n    {\n        sd.color = defaultColor(style);\n        sd.paper = defaultPaper(style);\n        sd.font = defaultFont(style);\n        sd.eol_fill = defaultEolFill(style);\n    }\n\n    return sd;\n}\n\n\n// Set the APIs associated with the lexer.\nvoid QsciLexer::setAPIs(QsciAbstractAPIs *apis)\n{\n    apiSet = apis;\n}\n\n\n// Return a pointer to the current APIs if there are any.\nQsciAbstractAPIs *QsciLexer::apis() const\n{\n    return apiSet;\n}\n\n\n// Default implementation to return the set of fill up characters that can end\n// auto-completion.\nconst char *QsciLexer::autoCompletionFillups() const\n{\n    return \"(\";\n}\n\n\n// Default implementation to return the view used for indentation guides.\nint QsciLexer::indentationGuideView() const\n{\n    return QsciScintillaBase::SC_IV_LOOKBOTH;\n}\n\n\n// Default implementation to return the list of character sequences that can\n// separate auto-completion words.\nQStringList QsciLexer::autoCompletionWordSeparators() const\n{\n    return QStringList();\n}\n\n\n// Default implementation to return the list of keywords that can start a\n// block.\nconst char *QsciLexer::blockStartKeyword(int *) const\n{\n    return 0;\n}\n\n\n// Default implementation to return the list of characters that can start a\n// block.\nconst char *QsciLexer::blockStart(int *) const\n{\n    return 0;\n}\n\n\n// Default implementation to return the list of characters that can end a\n// block.\nconst char *QsciLexer::blockEnd(int *) const\n{\n    return 0;\n}\n\n\n// Default implementation to return the style used for braces.\nint QsciLexer::braceStyle() const\n{\n    return -1;\n}\n\n\n// Default implementation to return the number of lines to look back when\n// auto-indenting.\nint QsciLexer::blockLookback() const\n{\n    return 20;\n}\n\n\n// Default implementation to return the case sensitivity of the language.\nbool QsciLexer::caseSensitive() const\n{\n    return true;\n}\n\n\n// Default implementation to return the characters that make up a word.\nconst char *QsciLexer::wordCharacters() const\n{\n    return 0;\n}\n\n\n// Default implementation to return the style used for whitespace.\nint QsciLexer::defaultStyle() const\n{\n    return 0;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexer::color(int style) const\n{\n    return styleData(style).color;\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexer::paper(int style) const\n{\n    return styleData(style).paper;\n}\n\n\n// Returns the font for a style.\nQFont QsciLexer::font(int style) const\n{\n    return styleData(style).font;\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexer::eolFill(int style) const\n{\n    return styleData(style).eol_fill;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexer::keywords(int) const\n{\n    return 0;\n}\n\n\n// Returns the default EOL fill for a style.\nbool QsciLexer::defaultEolFill(int) const\n{\n    return false;\n}\n\n\n// Returns the default font for a style.\nQFont QsciLexer::defaultFont(int) const\n{\n    return defaultFont();\n}\n\n\n// Returns the default font.\nQFont QsciLexer::defaultFont() const\n{\n    return defFont;\n}\n\n\n// Sets the default font.\nvoid QsciLexer::setDefaultFont(const QFont &f)\n{\n    defFont = f;\n}\n\n\n// Returns the default text colour for a style.\nQColor QsciLexer::defaultColor(int) const\n{\n    return defaultColor();\n}\n\n\n// Returns the default text colour.\nQColor QsciLexer::defaultColor() const\n{\n    return defColor;\n}\n\n\n// Sets the default text colour.\nvoid QsciLexer::setDefaultColor(const QColor &c)\n{\n    defColor = c;\n}\n\n\n// Returns the default paper colour for a styles.\nQColor QsciLexer::defaultPaper(int) const\n{\n    return defaultPaper();\n}\n\n\n// Returns the default paper colour.\nQColor QsciLexer::defaultPaper() const\n{\n    return defPaper;\n}\n\n\n// Sets the default paper colour.\nvoid QsciLexer::setDefaultPaper(const QColor &c)\n{\n    defPaper = c;\n\n    // Normally the default values are only intended to provide defaults when a\n    // lexer is first setup because once a style has been referenced then a\n    // copy of the default is made.  However the default paper is a special\n    // case because there is no other way to set the background colour used\n    // where there is no text.  Therefore we also actively set it.\n    setPaper(c, QsciScintillaBase::STYLE_DEFAULT);\n}\n\n\n// Read properties from the settings.\nbool QsciLexer::readProperties(QSettings &,const QString &)\n{\n    return true;\n}\n\n\n// Refresh all properties.\nvoid QsciLexer::refreshProperties()\n{\n}\n\n\n// Write properties to the settings.\nbool QsciLexer::writeProperties(QSettings &,const QString &) const\n{\n    return true;\n}\n\n\n// Restore the user settings.\nbool QsciLexer::readSettings(QSettings &qs,const char *prefix)\n{\n    bool ok, flag, rc = true;\n    int num;\n    QString key, full_key;\n    QStringList fdesc;\n\n    setStyleDefaults();\n\n    // Read the styles.\n    for (int i = 0; i < 128; ++i)\n    {\n        // Ignore invalid styles.\n        if (description(i).isEmpty())\n            continue;\n\n        key.sprintf(\"%s/%s/style%d/\",prefix,language(),i);\n\n        // Read the foreground colour.\n        full_key = key + \"color\";\n\n        ok = qs.contains(full_key);\n        num = qs.value(full_key).toInt();\n\n        if (ok)\n            setColor(QColor((num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff), i);\n        else\n            rc = false;\n\n        // Read the end-of-line fill.\n        full_key = key + \"eolfill\";\n\n        ok = qs.contains(full_key);\n        flag = qs.value(full_key, false).toBool();\n\n        if (ok)\n            setEolFill(flag, i);\n        else\n            rc = false;\n\n        // Read the font.  First try the deprecated format that uses an integer\n        // point size.\n        full_key = key + \"font\";\n\n        ok = qs.contains(full_key);\n        fdesc = qs.value(full_key).toStringList();\n\n        if (ok && fdesc.count() == 5)\n        {\n            QFont f;\n\n            f.setFamily(fdesc[0]);\n            f.setPointSize(fdesc[1].toInt());\n            f.setBold(fdesc[2].toInt());\n            f.setItalic(fdesc[3].toInt());\n            f.setUnderline(fdesc[4].toInt());\n\n            setFont(f, i);\n        }\n        else\n            rc = false;\n\n        // Now try the newer font format that uses a floating point point size.\n        // It is not an error if it doesn't exist.\n        full_key = key + \"font2\";\n\n        ok = qs.contains(full_key);\n        fdesc = qs.value(full_key).toStringList();\n\n        if (ok)\n        {\n            // Allow for future versions with more fields.\n            if (fdesc.count() >= 5)\n            {\n                QFont f;\n\n                f.setFamily(fdesc[0]);\n                f.setPointSizeF(fdesc[1].toDouble());\n                f.setBold(fdesc[2].toInt());\n                f.setItalic(fdesc[3].toInt());\n                f.setUnderline(fdesc[4].toInt());\n\n                setFont(f, i);\n            }\n            else\n            {\n                rc = false;\n            }\n        }\n\n        // Read the background colour.\n        full_key = key + \"paper\";\n\n        ok = qs.contains(full_key);\n        num = qs.value(full_key).toInt();\n\n        if (ok)\n            setPaper(QColor((num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff), i);\n        else\n            rc = false;\n    }\n\n    // Read the properties.\n    key.sprintf(\"%s/%s/properties/\",prefix,language());\n\n    if (!readProperties(qs,key))\n        rc = false;\n\n    refreshProperties();\n\n    // Read the rest.\n    key.sprintf(\"%s/%s/\",prefix,language());\n\n    // Read the default foreground colour.\n    full_key = key + \"defaultcolor\";\n\n    ok = qs.contains(full_key);\n    num = qs.value(full_key).toInt();\n\n    if (ok)\n        setDefaultColor(QColor((num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff));\n    else\n        rc = false;\n\n    // Read the default background colour.\n    full_key = key + \"defaultpaper\";\n\n    ok = qs.contains(full_key);\n    num = qs.value(full_key).toInt();\n\n    if (ok)\n        setDefaultPaper(QColor((num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff));\n    else\n        rc = false;\n\n    // Read the default font.  First try the deprecated format that uses an\n    // integer point size.\n    full_key = key + \"defaultfont\";\n\n    ok = qs.contains(full_key);\n    fdesc = qs.value(full_key).toStringList();\n\n    if (ok && fdesc.count() == 5)\n    {\n        QFont f;\n\n        f.setFamily(fdesc[0]);\n        f.setPointSize(fdesc[1].toInt());\n        f.setBold(fdesc[2].toInt());\n        f.setItalic(fdesc[3].toInt());\n        f.setUnderline(fdesc[4].toInt());\n\n        setDefaultFont(f);\n    }\n    else\n        rc = false;\n\n    // Now try the newer font format that uses a floating point point size.  It\n    // is not an error if it doesn't exist.\n    full_key = key + \"defaultfont2\";\n\n    ok = qs.contains(full_key);\n    fdesc = qs.value(full_key).toStringList();\n\n    if (ok)\n    {\n        // Allow for future versions with more fields.\n        if (fdesc.count() >= 5)\n        {\n            QFont f;\n\n            f.setFamily(fdesc[0]);\n            f.setPointSizeF(fdesc[1].toDouble());\n            f.setBold(fdesc[2].toInt());\n            f.setItalic(fdesc[3].toInt());\n            f.setUnderline(fdesc[4].toInt());\n\n            setDefaultFont(f);\n        }\n        else\n        {\n            rc = false;\n        }\n    }\n\n    full_key = key + \"autoindentstyle\";\n\n    ok = qs.contains(full_key);\n    num = qs.value(full_key).toInt();\n\n    if (ok)\n        setAutoIndentStyle(num);\n    else\n        rc = false;\n\n    return rc;\n}\n\n\n// Save the user settings.\nbool QsciLexer::writeSettings(QSettings &qs,const char *prefix) const\n{\n    bool rc = true;\n    QString key, fmt(\"%1\");\n    int num;\n    QStringList fdesc;\n\n    setStyleDefaults();\n\n    // Write the styles.\n    for (int i = 0; i < 128; ++i)\n    {\n        // Ignore invalid styles.\n        if (description(i).isEmpty())\n            continue;\n\n        QColor c;\n\n        key.sprintf(\"%s/%s/style%d/\",prefix,language(),i);\n\n        // Write the foreground colour.\n        c = color(i);\n        num = (c.red() << 16) | (c.green() << 8) | c.blue();\n\n        qs.setValue(key + \"color\", num);\n\n        // Write the end-of-line fill.\n        qs.setValue(key + \"eolfill\", eolFill(i));\n\n        // Write the font using the deprecated format.\n        QFont f = font(i);\n\n        fdesc.clear();\n        fdesc += f.family();\n        fdesc += fmt.arg(f.pointSize());\n\n        // The casts are for Borland.\n        fdesc += fmt.arg((int)f.bold());\n        fdesc += fmt.arg((int)f.italic());\n        fdesc += fmt.arg((int)f.underline());\n\n        qs.setValue(key + \"font\", fdesc);\n\n        // Write the font using the newer format.\n        fdesc[1] = fmt.arg(f.pointSizeF());\n\n        qs.setValue(key + \"font2\", fdesc);\n\n        // Write the background colour.\n        c = paper(i);\n        num = (c.red() << 16) | (c.green() << 8) | c.blue();\n\n        qs.setValue(key + \"paper\", num);\n    }\n\n    // Write the properties.\n    key.sprintf(\"%s/%s/properties/\",prefix,language());\n\n    if (!writeProperties(qs,key))\n        rc = false;\n\n    // Write the rest.\n    key.sprintf(\"%s/%s/\",prefix,language());\n\n    // Write the default foreground colour.\n    num = (defColor.red() << 16) | (defColor.green() << 8) | defColor.blue();\n\n    qs.setValue(key + \"defaultcolor\", num);\n\n    // Write the default background colour.\n    num = (defPaper.red() << 16) | (defPaper.green() << 8) | defPaper.blue();\n\n    qs.setValue(key + \"defaultpaper\", num);\n\n    // Write the default font using the deprecated format.\n    fdesc.clear();\n    fdesc += defFont.family();\n    fdesc += fmt.arg(defFont.pointSize());\n\n    // The casts are for Borland.\n    fdesc += fmt.arg((int)defFont.bold());\n    fdesc += fmt.arg((int)defFont.italic());\n    fdesc += fmt.arg((int)defFont.underline());\n\n    qs.setValue(key + \"defaultfont\", fdesc);\n\n    // Write the font using the newer format.\n    fdesc[1] = fmt.arg(defFont.pointSizeF());\n\n    qs.setValue(key + \"defaultfont2\", fdesc);\n\n    qs.setValue(key + \"autoindentstyle\", autoIndStyle);\n\n    return rc;\n}\n\n\n// Return the auto-indentation style.\nint QsciLexer::autoIndentStyle()\n{\n    // We can't do this in the ctor because we want the virtuals to work.\n    if (autoIndStyle < 0)\n        autoIndStyle = (blockStartKeyword() || blockStart() || blockEnd()) ?\n                    0 : QsciScintilla::AiMaintain;\n\n    return autoIndStyle;\n}\n\n\n// Set the auto-indentation style.\nvoid QsciLexer::setAutoIndentStyle(int autoindentstyle)\n{\n    autoIndStyle = autoindentstyle;\n}\n\n\n// Set the foreground colour for a style.\nvoid QsciLexer::setColor(const QColor &c, int style)\n{\n    if (style >= 0)\n    {\n        styleData(style).color = c;\n        emit colorChanged(c, style);\n    }\n    else\n        for (int i = 0; i < 128; ++i)\n            if (!description(i).isEmpty())\n                setColor(c, i);\n}\n\n\n// Set the end-of-line fill for a style.\nvoid QsciLexer::setEolFill(bool eolfill, int style)\n{\n    if (style >= 0)\n    {\n        styleData(style).eol_fill = eolfill;\n        emit eolFillChanged(eolfill, style);\n    }\n    else\n        for (int i = 0; i < 128; ++i)\n            if (!description(i).isEmpty())\n                setEolFill(eolfill, i);\n}\n\n\n// Set the font for a style.\nvoid QsciLexer::setFont(const QFont &f, int style)\n{\n    if (style >= 0)\n    {\n        styleData(style).font = f;\n        emit fontChanged(f, style);\n    }\n    else\n        for (int i = 0; i < 128; ++i)\n            if (!description(i).isEmpty())\n                setFont(f, i);\n}\n\n\n// Set the background colour for a style.\nvoid QsciLexer::setPaper(const QColor &c, int style)\n{\n    if (style >= 0)\n    {\n        styleData(style).paper = c;\n        emit paperChanged(c, style);\n    }\n    else\n    {\n        for (int i = 0; i < 128; ++i)\n            if (!description(i).isEmpty())\n                setPaper(c, i);\n\n        emit paperChanged(c, QsciScintillaBase::STYLE_DEFAULT);\n    }\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexeravs.cpp",
    "content": "// This module implements the QsciLexerAVS class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexeravs.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerAVS::QsciLexerAVS(QObject *parent)\n    : QsciLexer(parent),\n      fold_comments(false), fold_compact(true)\n{\n}\n\n\n// The dtor.\nQsciLexerAVS::~QsciLexerAVS()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerAVS::language() const\n{\n    return \"AVS\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerAVS::lexer() const\n{\n    return \"avs\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerAVS::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerAVS::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_#\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerAVS::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n    case Operator:\n        return QColor(0x00, 0x00, 0x00);\n\n    case BlockComment:\n    case NestedBlockComment:\n    case LineComment:\n        return QColor(0x00, 0x7f, 0x00);\n\n    case Number:\n    case Function:\n        return QColor(0x00, 0x7f, 0x7f);\n\n    case String:\n    case TripleString:\n        return QColor(0x7f, 0x00, 0x7f);\n\n    case Keyword:\n    case Filter:\n    case ClipProperty:\n        return QColor(0x00, 0x00, 0x7f);\n\n    case Plugin:\n        return QColor(0x00, 0x80, 0xc0);\n\n    case KeywordSet6:\n        return QColor(0x80, 0x00, 0xff);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerAVS::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case BlockComment:\n    case NestedBlockComment:\n    case LineComment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\", 9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Georgia\", 13);\n#else\n        f = QFont(\"Bitstream Vera Serif\", 9);\n#endif\n        break;\n\n    case Keyword:\n    case Filter:\n    case Plugin:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerAVS::keywords(int set) const\n{\n    if (set == 1)\n        return \"true false return global\";\n\n    if (set == 2)\n        return\n            \"addborders alignedsplice amplify amplifydb animate applyrange \"\n            \"assumebff assumefieldbased assumefps assumeframebased \"\n            \"assumesamplerate assumescaledfps assumetff audiodub audiodubex \"\n            \"avifilesource avisource bicubicresize bilinearresize \"\n            \"blackmanresize blackness blankclip blur bob cache changefps \"\n            \"colorbars colorkeymask coloryuv compare complementparity \"\n            \"conditionalfilter conditionalreader convertaudio \"\n            \"convertaudioto16bit convertaudioto24bit convertaudioto32bit \"\n            \"convertaudioto8bit convertaudiotofloat convertbacktoyuy2 \"\n            \"convertfps converttobackyuy2 converttomono converttorgb \"\n            \"converttorgb24 converttorgb32 converttoy8 converttoyv16 \"\n            \"converttoyv24 converttoyv411 converttoyuy2 converttoyv12 crop \"\n            \"cropbottom delayaudio deleteframe dissolve distributor \"\n            \"doubleweave duplicateframe ensurevbrmp3sync fadein fadein0 \"\n            \"fadein2 fadeio fadeio0 fadeio2 fadeout fadeout0 fadeout2 \"\n            \"fixbrokenchromaupsampling fixluminance fliphorizontal \"\n            \"flipvertical frameevaluate freezeframe gaussresize \"\n            \"generalconvolution getchannel getchannels getmtmode getparity \"\n            \"grayscale greyscale histogram horizontalreduceby2 imagereader \"\n            \"imagesource imagewriter info interleave internalcache \"\n            \"internalcachemt invert killaudio killvideo lanczos4resize \"\n            \"lanczosresize layer letterbox levels limiter loop mask maskhs \"\n            \"max merge mergeargb mergechannels mergechroma mergeluma mergergb \"\n            \"messageclip min mixaudio monotostereo normalize null \"\n            \"opendmlsource overlay peculiarblend pointresize pulldown \"\n            \"reduceby2 resampleaudio resetmask reverse rgbadjust scriptclip \"\n            \"segmentedavisource segmenteddirectshowsource selecteven \"\n            \"selectevery selectodd selectrangeevery separatefields setmtmode \"\n            \"sharpen showalpha showblue showfiveversions showframenumber \"\n            \"showgreen showred showsmpte showtime sincresize skewrows \"\n            \"spatialsoften spline16resize spline36resize spline64resize ssrc \"\n            \"stackhorizontal stackvertical subtitle subtract supereq \"\n            \"swapfields swapuv temporalsoften timestretch tone trim turn180 \"\n            \"turnleft turnright tweak unalignedsplice utoy utoy8 version \"\n            \"verticalreduceby2 vtoy vtoy8 wavsource weave writefile \"\n            \"writefileend writefileif writefilestart ytouv\";\n\n    if (set == 3)\n        return\n            \"addgrain addgrainc agc_hdragc analyzelogo animeivtc asharp \"\n            \"audiograph autocrop autoyuy2 avsrecursion awarpsharp \"\n            \"bassaudiosource bicublinresize bifrost binarize blendfields \"\n            \"blindpp blockbuster bordercontrol cfielddiff cframediff \"\n            \"chromashift cnr2 colormatrix combmask contra convolution3d \"\n            \"convolution3dyv12 dctfilter ddcc deblendlogo deblock deblock_qed \"\n            \"decimate decomb dedup deen deflate degrainmedian depan \"\n            \"depanestimate depaninterleave depanscenes depanstabilize \"\n            \"descratch despot dfttest dgbob dgsource directshowsource \"\n            \"distancefunction dss2 dup dupmc edeen edgemask ediupsizer eedi2 \"\n            \"eedi3 eedi3_rpow2 expand faerydust fastbicubicresize \"\n            \"fastbilinearresize fastediupsizer dedgemask fdecimate \"\n            \"ffaudiosource ffdshow ffindex ffmpegsource ffmpegsource2 \"\n            \"fft3dfilter fft3dgpu ffvideosource fielddeinterlace fielddiff \"\n            \"fillmargins fity2uv fity2u fity2v fitu2y fitv2y fluxsmooth \"\n            \"fluxsmoothst fluxsmootht framediff framenumber frfun3b frfun7 \"\n            \"gicocu golddust gradfun2db grapesmoother greedyhma grid \"\n            \"guavacomb hqdn3d hybridfupp hysteresymask ibob \"\n            \"improvesceneswitch inflate inpand inpaintlogo interframe \"\n            \"interlacedresize interlacedwarpedresize interleaved2planar \"\n            \"iscombed iscombedt iscombedtivtc kerneldeint leakkernelbob \"\n            \"leakkerneldeint limitedsharpen limitedsharpenfaster logic lsfmod \"\n            \"lumafilter lumayv12 manalyse maskeddeinterlace maskedmerge \"\n            \"maskedmix mblockfps mcompensate mctemporaldenoise \"\n            \"mctemporaldenoisepp mdegrain1 mdegrain2 mdegrain3 mdepan \"\n            \"medianblur mergehints mflow mflowblur mflowfps mflowinter \"\n            \"minblur mipsmooth mmask moderatesharpen monitorfilter motionmask \"\n            \"mpasource mpeg2source mrecalculate mscdetection msharpen mshow \"\n            \"msmooth msu_fieldshiftfixer msu_frc msuper mt mt_adddiff \"\n            \"mt_average mt_binarize mt_circle mt_clamp mt_convolution \"\n            \"mt_deflate mt_diamond mt_edge mt_ellipse mt_expand \"\n            \"mt_freeellipse mt_freelosange mt_freerectangle mt_hysteresis \"\n            \"mt_infix mt_inflate mt_inpand mt_invert mt_logic mt_losange \"\n            \"mt_lut mt_lutf mt_luts mt_lutspa mt_lutsx mt_lutxy mt_lutxyz \"\n            \"mt_makediff mt_mappedblur mt_merge mt_motion mt_polish \"\n            \"mt_rectangle mt_square mti mtsource multidecimate mvanalyse \"\n            \"mvblockfps mvchangecompensate mvcompensate mvdegrain1 mvdegrain2 \"\n            \"mvdegrain3 mvdenoise mvdepan mvflow mvflowblur mvflowfps \"\n            \"mvflowfps2 mvflowinter mvincrease mvmask mvrecalculate \"\n            \"mvscdetection mvshow nicac3source nicdtssource niclpcmsource \"\n            \"nicmpasource nicmpg123source nnedi nnedi2 nnedi2_rpow2 nnedi3 \"\n            \"nnedi3_rpow2 nomosmooth overlaymask peachsmoother pixiedust \"\n            \"planar2interleaved qtgmc qtinput rawavsource rawsource \"\n            \"reduceflicker reinterpolate411 removedirt removedust removegrain \"\n            \"removegrainhd removetemporalgrain repair requestlinear \"\n            \"reversefielddominance rgb3dlut rgdeinterlace rgsdeinterlace \"\n            \"rgblut rotate sangnom seesaw sharpen2 showchannels \"\n            \"showcombedtivtc smartdecimate smartdeinterlace smdegrain \"\n            \"smoothdeinterlace smoothuv soothess soxfilter spacedust sshiq \"\n            \"ssim ssiq stmedianfilter t3dlut tanisotropic tbilateral tcanny \"\n            \"tcomb tcombmask tcpserver tcpsource tdecimate tdeint tedgemask \"\n            \"telecide temporalcleaner temporalrepair temporalsmoother \"\n            \"tfieldblank tfm tisophote tivtc tmaskblank tmaskedmerge \"\n            \"tmaskedmerge3 tmm tmonitor tnlmeans tomsmocomp toon textsub \"\n            \"ttempsmooth ttempsmoothf tunsharp unblock uncomb undot unfilter \"\n            \"unsharpmask vaguedenoiser variableblur verticalcleaner \"\n            \"videoscope vinverse vobsub vqmcalc warpedresize warpsharp \"\n            \"xsharpen yadif yadifmod yuy2lut yv12convolution \"\n            \"yv12interlacedreduceby2 yv12interlacedselecttopfields yv12layer \"\n            \"yv12lut yv12lutxy yv12substract yv12torgb24 yv12toyuy2\";\n\n    if (set == 4)\n        return\n            \"abs apply assert bool ceil chr clip continueddenominator \"\n            \"continuednumerator cos default defined eval averagechromau \"\n            \"averagechromav averageluma chromaudifference chromavdifference \"\n            \"lumadifference exist exp findstr float floor frac hexvalue \"\n            \"import int isbool isclip isfloat isint isstring lcase leftstr \"\n            \"load_stdcall_plugin loadcplugin loadplugin loadvfapiplugin \"\n            \"loadvirtualdubplugin log midstr muldiv nop opt_allowfloataudio \"\n            \"opt_avipadscanlines opt_dwchannelmask opt_usewaveextensible \"\n            \"opt_vdubplanarhack pi pow rand revstr rightstr round scriptdir \"\n            \"scriptfile scriptname select setmemorymax \"\n            \"setplanarlegacyalignment rgbdifference rgbdifferencefromprevious \"\n            \"rgbdifferencetonext udifferencefromprevious udifferencetonext \"\n            \"setworkingdir sign sin spline sqrt string strlen time ucase \"\n            \"undefined value versionnumber versionstring uplanemax \"\n            \"uplanemedian uplanemin uplaneminmaxdifference \"\n            \"vdifferencefromprevious vdifferencetonext vplanemax vplanemedian \"\n            \"vplanemin vplaneminmaxdifference ydifferencefromprevious \"\n            \"ydifferencetonext yplanemax yplanemedian yplanemin \"\n            \"yplaneminmaxdifference\";\n\n    if (set == 5)\n        return\n            \"audiobits audiochannels audiolength audiolengthf audiorate \"\n            \"framecount framerate frameratedenominator frameratenumerator \"\n            \"getleftchannel getrightchannel hasaudio hasvideo height \"\n            \"isaudiofloat isaudioint isfieldbased isframebased isinterleaved \"\n            \"isplanar isrgb isrgb24 isrgb32 isyuv isyuy2 isyv12 width\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerAVS::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case BlockComment:\n        return tr(\"Block comment\");\n\n    case NestedBlockComment:\n        return tr(\"Nested block comment\");\n\n    case LineComment:\n        return tr(\"Line comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case String:\n        return tr(\"Double-quoted string\");\n\n    case TripleString:\n        return tr(\"Triple double-quoted string\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case Filter:\n        return tr(\"Filter\");\n\n    case Plugin:\n        return tr(\"Plugin\");\n\n    case Function:\n        return tr(\"Function\");\n\n    case ClipProperty:\n        return tr(\"Clip property\");\n\n    case KeywordSet6:\n        return tr(\"User defined\");\n    }\n\n    return QString();\n}\n\n\n// Refresh all properties.\nvoid QsciLexerAVS::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerAVS::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerAVS::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldcomments\", fold_comments);\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerAVS::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerAVS::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerAVS::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerAVS::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerAVS::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerAVS::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerbash.cpp",
    "content": "// This module implements the QsciLexerBash class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerbash.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerBash::QsciLexerBash(QObject *parent)\n    : QsciLexer(parent), fold_comments(false), fold_compact(true)\n{\n}\n\n\n// The dtor.\nQsciLexerBash::~QsciLexerBash()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerBash::language() const\n{\n    return \"Bash\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerBash::lexer() const\n{\n    return \"bash\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerBash::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerBash::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$@%&\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerBash::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Error:\n    case Backticks:\n        return QColor(0xff,0xff,0x00);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case SingleQuotedHereDocument:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Operator:\n    case Identifier:\n    case Scalar:\n    case ParameterExpansion:\n    case HereDocumentDelimiter:\n        return QColor(0x00,0x00,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerBash::defaultEolFill(int style) const\n{\n    switch (style)\n    {\n    case SingleQuotedHereDocument:\n        return true;\n    }\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerBash::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case Operator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerBash::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"alias ar asa awk banner basename bash bc bdiff break \"\n            \"bunzip2 bzip2 cal calendar case cat cc cd chmod \"\n            \"cksum clear cmp col comm compress continue cp cpio \"\n            \"crypt csplit ctags cut date dc dd declare deroff dev \"\n            \"df diff diff3 dircmp dirname do done du echo ed \"\n            \"egrep elif else env esac eval ex exec exit expand \"\n            \"export expr false fc fgrep fi file find fmt fold for \"\n            \"function functions getconf getopt getopts grep gres \"\n            \"hash head help history iconv id if in integer jobs \"\n            \"join kill local lc let line ln logname look ls m4 \"\n            \"mail mailx make man mkdir more mt mv newgrp nl nm \"\n            \"nohup ntps od pack paste patch pathchk pax pcat perl \"\n            \"pg pr print printf ps pwd read readonly red return \"\n            \"rev rm rmdir sed select set sh shift size sleep sort \"\n            \"spell split start stop strings strip stty sum \"\n            \"suspend sync tail tar tee test then time times touch \"\n            \"tr trap true tsort tty type typeset ulimit umask \"\n            \"unalias uname uncompress unexpand uniq unpack unset \"\n            \"until uudecode uuencode vi vim vpax wait wc whence \"\n            \"which while who wpaste wstart xargs zcat \"\n\n            \"chgrp chown chroot dir dircolors factor groups \"\n            \"hostid install link md5sum mkfifo mknod nice pinky \"\n            \"printenv ptx readlink seq sha1sum shred stat su tac \"\n            \"unlink users vdir whoami yes\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerBash::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Error:\n        return tr(\"Error\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case Scalar:\n        return tr(\"Scalar\");\n\n    case ParameterExpansion:\n        return tr(\"Parameter expansion\");\n\n    case Backticks:\n        return tr(\"Backticks\");\n\n    case HereDocumentDelimiter:\n        return tr(\"Here document delimiter\");\n\n    case SingleQuotedHereDocument:\n        return tr(\"Single-quoted here document\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerBash::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case Error:\n        return QColor(0xff,0x00,0x00);\n\n    case Scalar:\n        return QColor(0xff,0xe0,0xe0);\n\n    case ParameterExpansion:\n        return QColor(0xff,0xff,0xe0);\n\n    case Backticks:\n        return QColor(0xa0,0x80,0x80);\n\n    case HereDocumentDelimiter:\n    case SingleQuotedHereDocument:\n        return QColor(0xdd,0xd0,0xdd);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerBash::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerBash::readProperties(QSettings &qs, const QString &prefix)\n{\n    int rc = true;\n\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerBash::writeProperties(QSettings &qs, const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldcomments\", fold_comments);\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerBash::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerBash::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerBash::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\", (fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerBash::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerBash::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerBash::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\", (fold_compact ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerbatch.cpp",
    "content": "// This module implements the QsciLexerBatch class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerbatch.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerBatch::QsciLexerBatch(QObject *parent)\n    : QsciLexer(parent)\n{\n}\n\n\n// The dtor.\nQsciLexerBatch::~QsciLexerBatch()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerBatch::language() const\n{\n    return \"Batch\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerBatch::lexer() const\n{\n    return \"batch\";\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerBatch::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerBatch::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n    case Operator:\n        return QColor(0x00,0x00,0x00);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case Keyword:\n    case ExternalCommand:\n        return QColor(0x00,0x00,0x7f);\n\n    case Label:\n        return QColor(0x7f,0x00,0x7f);\n\n    case HideCommandChar:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Variable:\n        return QColor(0x80,0x00,0x80);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerBatch::defaultEolFill(int style) const\n{\n    switch (style)\n    {\n    case Label:\n        return true;\n    }\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerBatch::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case ExternalCommand:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerBatch::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"rem set if exist errorlevel for in do break call \"\n            \"chcp cd chdir choice cls country ctty date del \"\n            \"erase dir echo exit goto loadfix loadhigh mkdir md \"\n            \"move path pause prompt rename ren rmdir rd shift \"\n            \"time type ver verify vol com con lpt nul\";\n\n    return 0;\n}\n\n\n// Return the case sensitivity.\nbool QsciLexerBatch::caseSensitive() const\n{\n    return false;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerBatch::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case Label:\n        return tr(\"Label\");\n\n    case HideCommandChar:\n        return tr(\"Hide command character\");\n\n    case ExternalCommand:\n        return tr(\"External command\");\n\n    case Variable:\n        return tr(\"Variable\");\n\n    case Operator:\n        return tr(\"Operator\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerBatch::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case Label:\n        return QColor(0x60,0x60,0x60);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexercmake.cpp",
    "content": "// This module implements the QsciLexerCMake class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexercmake.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerCMake::QsciLexerCMake(QObject *parent)\n    : QsciLexer(parent),\n      fold_atelse(false)\n{\n}\n\n\n// The dtor.\nQsciLexerCMake::~QsciLexerCMake()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerCMake::language() const\n{\n    return \"CMake\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerCMake::lexer() const\n{\n    return \"cmake\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerCMake::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n    case KeywordSet3:\n        return QColor(0x00,0x00,0x00);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case String:\n    case StringLeftQuote:\n    case StringRightQuote:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Function:\n    case BlockWhile:\n    case BlockForeach:\n    case BlockIf:\n    case BlockMacro:\n        return QColor(0x00,0x00,0x7f);\n\n    case Variable:\n        return QColor(0x80,0x00,0x00);\n\n    case Label:\n    case StringVariable:\n        return QColor(0xcc,0x33,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerCMake::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Function:\n    case BlockWhile:\n    case BlockForeach:\n    case BlockIf:\n    case BlockMacro:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerCMake::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"add_custom_command add_custom_target add_definitions \"\n            \"add_dependencies add_executable add_library add_subdirectory \"\n            \"add_test aux_source_directory build_command build_name \"\n            \"cmake_minimum_required configure_file create_test_sourcelist \"\n            \"else elseif enable_language enable_testing endforeach endif \"\n            \"endmacro endwhile exec_program execute_process \"\n            \"export_library_dependencies file find_file find_library \"\n            \"find_package find_path find_program fltk_wrap_ui foreach \"\n            \"get_cmake_property get_directory_property get_filename_component \"\n            \"get_source_file_property get_target_property get_test_property \"\n            \"if include include_directories include_external_msproject \"\n            \"include_regular_expression install install_files \"\n            \"install_programs install_targets link_directories link_libraries \"\n            \"list load_cache load_command macro make_directory \"\n            \"mark_as_advanced math message option output_required_files \"\n            \"project qt_wrap_cpp qt_wrap_ui remove remove_definitions \"\n            \"separate_arguments set set_directory_properties \"\n            \"set_source_files_properties set_target_properties \"\n            \"set_tests_properties site_name source_group string \"\n            \"subdir_depends subdirs target_link_libraries try_compile try_run \"\n            \"use_mangled_mesa utility_source variable_requires \"\n            \"vtk_make_instantiator vtk_wrap_java vtk_wrap_python vtk_wrap_tcl \"\n            \"while write_file\";\n\n    if (set == 2)\n        return\n            \"ABSOLUTE ABSTRACT ADDITIONAL_MAKE_CLEAN_FILES ALL AND APPEND \"\n            \"ARGS ASCII BEFORE CACHE CACHE_VARIABLES CLEAR COMMAND COMMANDS \"\n            \"COMMAND_NAME COMMENT COMPARE COMPILE_FLAGS COPYONLY DEFINED \"\n            \"DEFINE_SYMBOL DEPENDS DOC EQUAL ESCAPE_QUOTES EXCLUDE \"\n            \"EXCLUDE_FROM_ALL EXISTS EXPORT_MACRO EXT EXTRA_INCLUDE \"\n            \"FATAL_ERROR FILE FILES FORCE FUNCTION GENERATED GLOB \"\n            \"GLOB_RECURSE GREATER GROUP_SIZE HEADER_FILE_ONLY HEADER_LOCATION \"\n            \"IMMEDIATE INCLUDES INCLUDE_DIRECTORIES INCLUDE_INTERNALS \"\n            \"INCLUDE_REGULAR_EXPRESSION LESS LINK_DIRECTORIES LINK_FLAGS \"\n            \"LOCATION MACOSX_BUNDLE MACROS MAIN_DEPENDENCY MAKE_DIRECTORY \"\n            \"MATCH MATCHALL MATCHES MODULE NAME NAME_WE NOT NOTEQUAL \"\n            \"NO_SYSTEM_PATH OBJECT_DEPENDS OPTIONAL OR OUTPUT OUTPUT_VARIABLE \"\n            \"PATH PATHS POST_BUILD POST_INSTALL_SCRIPT PREFIX PREORDER \"\n            \"PRE_BUILD PRE_INSTALL_SCRIPT PRE_LINK PROGRAM PROGRAM_ARGS \"\n            \"PROPERTIES QUIET RANGE READ REGEX REGULAR_EXPRESSION REPLACE \"\n            \"REQUIRED RETURN_VALUE RUNTIME_DIRECTORY SEND_ERROR SHARED \"\n            \"SOURCES STATIC STATUS STREQUAL STRGREATER STRLESS SUFFIX TARGET \"\n            \"TOLOWER TOUPPER VAR VARIABLES VERSION WIN32 WRAP_EXCLUDE WRITE \"\n            \"APPLE MINGW MSYS CYGWIN BORLAND WATCOM MSVC MSVC_IDE MSVC60 \"\n            \"MSVC70 MSVC71 MSVC80 CMAKE_COMPILER_2005 OFF ON\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerCMake::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case String:\n        return tr(\"String\");\n\n    case StringLeftQuote:\n        return tr(\"Left quoted string\");\n\n    case StringRightQuote:\n        return tr(\"Right quoted string\");\n\n    case Function:\n        return tr(\"Function\");\n\n    case Variable:\n        return tr(\"Variable\");\n\n    case Label:\n        return tr(\"Label\");\n\n    case KeywordSet3:\n        return tr(\"User defined\");\n\n    case BlockWhile:\n        return tr(\"WHILE block\");\n\n    case BlockForeach:\n        return tr(\"FOREACH block\");\n\n    case BlockIf:\n        return tr(\"IF block\");\n\n    case BlockMacro:\n        return tr(\"MACRO block\");\n\n    case StringVariable:\n        return tr(\"Variable within a string\");\n\n    case Number:\n        return tr(\"Number\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerCMake::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case String:\n    case StringLeftQuote:\n    case StringRightQuote:\n    case StringVariable:\n        return QColor(0xee,0xee,0xee);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerCMake::refreshProperties()\n{\n    setAtElseProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerCMake::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    fold_atelse = qs.value(prefix + \"foldatelse\", false).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerCMake::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldatelse\", fold_atelse);\n\n    return rc;\n}\n\n\n// Return true if ELSE blocks can be folded.\nbool QsciLexerCMake::foldAtElse() const\n{\n    return fold_atelse;\n}\n\n\n// Set if ELSE blocks can be folded.\nvoid QsciLexerCMake::setFoldAtElse(bool fold)\n{\n    fold_atelse = fold;\n\n    setAtElseProp();\n}\n\n\n// Set the \"fold.at.else\" property.\nvoid QsciLexerCMake::setAtElseProp()\n{\n    emit propertyChanged(\"fold.at.else\",(fold_atelse ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexercoffeescript.cpp",
    "content": "// This module implements the QsciLexerCoffeeScript class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexercoffeescript.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerCoffeeScript::QsciLexerCoffeeScript(QObject *parent)\n    : QsciLexer(parent),\n      fold_comments(false), fold_compact(true), style_preproc(false),\n      dollars(true)\n{\n}\n\n\n// The dtor.\nQsciLexerCoffeeScript::~QsciLexerCoffeeScript()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerCoffeeScript::language() const\n{\n    return \"CoffeeScript\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerCoffeeScript::lexer() const\n{\n    return \"coffeescript\";\n}\n\n\n// Return the set of character sequences that can separate auto-completion\n// words.\nQStringList QsciLexerCoffeeScript::autoCompletionWordSeparators() const\n{\n    QStringList wl;\n\n    wl << \".\";\n\n    return wl;\n}\n\n\n// Return the list of keywords that can start a block.\nconst char *QsciLexerCoffeeScript::blockStartKeyword(int *style) const\n{\n    if (style)\n        *style = Keyword;\n\n    return \"catch class do else finally for if try until when while\";\n}\n\n\n// Return the list of characters that can start a block.\nconst char *QsciLexerCoffeeScript::blockStart(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"{\";\n}\n\n\n// Return the list of characters that can end a block.\nconst char *QsciLexerCoffeeScript::blockEnd(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"}\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerCoffeeScript::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerCoffeeScript::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_#\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerCoffeeScript::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80, 0x80, 0x80);\n\n    case Comment:\n    case CommentLine:\n    case CommentBlock:\n    case BlockRegexComment:\n        return QColor(0x00, 0x7f, 0x00);\n\n    case CommentDoc:\n    case CommentLineDoc:\n        return QColor(0x3f, 0x70, 0x3f);\n\n    case Number:\n        return QColor(0x00, 0x7f, 0x7f);\n\n    case Keyword:\n        return QColor(0x00, 0x00, 0x7f);\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n        return QColor(0x7f, 0x00, 0x7f);\n\n    case PreProcessor:\n        return QColor(0x7f, 0x7f, 0x00);\n\n    case Operator:\n    case UnclosedString:\n        return QColor(0x00, 0x00, 0x00);\n\n    case VerbatimString:\n        return QColor(0x00, 0x7f, 0x00);\n\n    case Regex:\n    case BlockRegex:\n        return QColor(0x3f, 0x7f, 0x3f);\n\n    case CommentDocKeyword:\n        return QColor(0x30, 0x60, 0xa0);\n\n    case CommentDocKeywordError:\n        return QColor(0x80, 0x40, 0x20);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerCoffeeScript::defaultEolFill(int style) const\n{\n    switch (style)\n    {\n    case UnclosedString:\n    case VerbatimString:\n    case Regex:\n        return true;\n    }\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerCoffeeScript::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case CommentLine:\n    case CommentDoc:\n    case CommentLineDoc:\n    case CommentDocKeyword:\n    case CommentDocKeywordError:\n    case CommentBlock:\n    case BlockRegexComment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case Operator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case UnclosedString:\n    case VerbatimString:\n    case Regex:\n    case BlockRegex:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerCoffeeScript::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"true false null this new delete typeof in instanceof return \"\n            \"throw break continue debugger if else switch for while do try \"\n            \"catch finally class extends super \"\n            \"undefined then unless until loop of by when and or is isnt not \"\n            \"yes no on off\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerCoffeeScript::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"C-style comment\");\n\n    case CommentLine:\n        return tr(\"C++-style comment\");\n\n    case CommentDoc:\n        return tr(\"JavaDoc C-style comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case UUID:\n        return tr(\"IDL UUID\");\n\n    case PreProcessor:\n        return tr(\"Pre-processor block\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case VerbatimString:\n        return tr(\"C# verbatim string\");\n\n    case Regex:\n        return tr(\"Regular expression\");\n\n    case CommentLineDoc:\n        return tr(\"JavaDoc C++-style comment\");\n\n    case KeywordSet2:\n        return tr(\"Secondary keywords and identifiers\");\n\n    case CommentDocKeyword:\n        return tr(\"JavaDoc keyword\");\n\n    case CommentDocKeywordError:\n        return tr(\"JavaDoc keyword error\");\n\n    case GlobalClass:\n        return tr(\"Global classes\");\n\n    case CommentBlock:\n        return tr(\"Block comment\");\n\n    case BlockRegex:\n        return tr(\"Block regular expression\");\n\n    case BlockRegexComment:\n        return tr(\"Block regular expression comment\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerCoffeeScript::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case UnclosedString:\n        return QColor(0xe0,0xc0,0xe0);\n\n    case VerbatimString:\n        return QColor(0xe0,0xff,0xe0);\n\n    case Regex:\n        return QColor(0xe0,0xf0,0xe0);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerCoffeeScript::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n    setStylePreprocProp();\n    setDollarsProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerCoffeeScript::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n    style_preproc = qs.value(prefix + \"stylepreprocessor\", false).toBool();\n    dollars = qs.value(prefix + \"dollars\", true).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerCoffeeScript::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldcomments\", fold_comments);\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n    qs.setValue(prefix + \"stylepreprocessor\", style_preproc);\n    qs.setValue(prefix + \"dollars\", dollars);\n\n    return rc;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerCoffeeScript::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerCoffeeScript::setCommentProp()\n{\n    emit propertyChanged(\"fold.coffeescript.comment\",\n            (fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Set if folds are compact\nvoid QsciLexerCoffeeScript::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerCoffeeScript::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\", (fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Set if preprocessor lines are styled.\nvoid QsciLexerCoffeeScript::setStylePreprocessor(bool style)\n{\n    style_preproc = style;\n\n    setStylePreprocProp();\n}\n\n\n// Set the \"styling.within.preprocessor\" property.\nvoid QsciLexerCoffeeScript::setStylePreprocProp()\n{\n    emit propertyChanged(\"styling.within.preprocessor\",\n            (style_preproc ? \"1\" : \"0\"));\n}\n\n\n// Set if '$' characters are allowed.\nvoid QsciLexerCoffeeScript::setDollarsAllowed(bool allowed)\n{\n    dollars = allowed;\n\n    setDollarsProp();\n}\n\n\n// Set the \"lexer.cpp.allow.dollars\" property.\nvoid QsciLexerCoffeeScript::setDollarsProp()\n{\n    emit propertyChanged(\"lexer.cpp.allow.dollars\", (dollars ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexercpp.cpp",
    "content": "// This module implements the QsciLexerCPP class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexercpp.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerCPP::QsciLexerCPP(QObject *parent, bool caseInsensitiveKeywords)\n    : QsciLexer(parent),\n      fold_atelse(false), fold_comments(false), fold_compact(true),\n      fold_preproc(true), style_preproc(false), dollars(true),\n      highlight_triple(false), highlight_hash(false),\n      nocase(caseInsensitiveKeywords)\n{\n}\n\n\n// The dtor.\nQsciLexerCPP::~QsciLexerCPP()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerCPP::language() const\n{\n    return \"C++\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerCPP::lexer() const\n{\n    return (nocase ? \"cppnocase\" : \"cpp\");\n}\n\n\n// Return the set of character sequences that can separate auto-completion\n// words.\nQStringList QsciLexerCPP::autoCompletionWordSeparators() const\n{\n    QStringList wl;\n\n    wl << \"::\" << \"->\" << \".\";\n\n    return wl;\n}\n\n\n// Return the list of keywords that can start a block.\nconst char *QsciLexerCPP::blockStartKeyword(int *style) const\n{\n    if (style)\n        *style = Keyword;\n\n    return \"case catch class default do else finally for if private \"\n           \"protected public struct try union while\";\n}\n\n\n// Return the list of characters that can start a block.\nconst char *QsciLexerCPP::blockStart(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"{\";\n}\n\n\n// Return the list of characters that can end a block.\nconst char *QsciLexerCPP::blockEnd(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"}\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerCPP::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerCPP::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_#\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerCPP::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80, 0x80, 0x80);\n\n    case Comment:\n    case CommentLine:\n        return QColor(0x00, 0x7f, 0x00);\n\n    case CommentDoc:\n    case CommentLineDoc:\n    case PreProcessorCommentLineDoc:\n        return QColor(0x3f, 0x70, 0x3f);\n\n    case Number:\n        return QColor(0x00, 0x7f, 0x7f);\n\n    case Keyword:\n        return QColor(0x00, 0x00, 0x7f);\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case RawString:\n        return QColor(0x7f, 0x00, 0x7f);\n\n    case PreProcessor:\n        return QColor(0x7f, 0x7f, 0x00);\n\n    case Operator:\n    case UnclosedString:\n        return QColor(0x00, 0x00, 0x00);\n\n    case VerbatimString:\n    case TripleQuotedVerbatimString:\n    case HashQuotedString:\n        return QColor(0x00, 0x7f, 0x00);\n\n    case Regex:\n        return QColor(0x3f, 0x7f, 0x3f);\n\n    case CommentDocKeyword:\n        return QColor(0x30, 0x60, 0xa0);\n\n    case CommentDocKeywordError:\n        return QColor(0x80, 0x40, 0x20);\n\n    case PreProcessorComment:\n        return QColor(0x65, 0x99, 0x00);\n\n    case InactiveDefault:\n    case InactiveUUID:\n    case InactiveCommentLineDoc:\n    case InactiveKeywordSet2:\n    case InactiveCommentDocKeyword:\n    case InactiveCommentDocKeywordError:\n    case InactivePreProcessorCommentLineDoc:\n        return QColor(0xc0, 0xc0, 0xc0);\n\n    case InactiveComment:\n    case InactiveCommentLine:\n    case InactiveNumber:\n    case InactiveVerbatimString:\n    case InactiveTripleQuotedVerbatimString:\n    case InactiveHashQuotedString:\n        return QColor(0x90, 0xb0, 0x90);\n\n    case InactiveCommentDoc:\n        return QColor(0xd0, 0xd0, 0xd0);\n\n    case InactiveKeyword:\n        return QColor(0x90, 0x90, 0xb0);\n\n    case InactiveDoubleQuotedString:\n    case InactiveSingleQuotedString:\n    case InactiveRawString:\n        return QColor(0xb0, 0x90, 0xb0);\n\n    case InactivePreProcessor:\n        return QColor(0xb0, 0xb0, 0x90);\n\n    case InactiveOperator:\n    case InactiveIdentifier:\n    case InactiveGlobalClass:\n        return QColor(0xb0, 0xb0, 0xb0);\n\n    case InactiveUnclosedString:\n        return QColor(0x00, 0x00, 0x00);\n\n    case InactiveRegex:\n        return QColor(0x7f, 0xaf, 0x7f);\n\n    case InactivePreProcessorComment:\n        return QColor(0xa0, 0xc0, 0x90);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerCPP::defaultEolFill(int style) const\n{\n    switch (style)\n    {\n    case UnclosedString:\n    case InactiveUnclosedString:\n    case VerbatimString:\n    case InactiveVerbatimString:\n    case Regex:\n    case InactiveRegex:\n    case TripleQuotedVerbatimString:\n    case InactiveTripleQuotedVerbatimString:\n    case HashQuotedString:\n    case InactiveHashQuotedString:\n        return true;\n    }\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerCPP::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case InactiveComment:\n    case CommentLine:\n    case InactiveCommentLine:\n    case CommentDoc:\n    case InactiveCommentDoc:\n    case CommentLineDoc:\n    case InactiveCommentLineDoc:\n    case CommentDocKeyword:\n    case InactiveCommentDocKeyword:\n    case CommentDocKeywordError:\n    case InactiveCommentDocKeywordError:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case InactiveKeyword:\n    case Operator:\n    case InactiveOperator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case DoubleQuotedString:\n    case InactiveDoubleQuotedString:\n    case SingleQuotedString:\n    case InactiveSingleQuotedString:\n    case UnclosedString:\n    case InactiveUnclosedString:\n    case VerbatimString:\n    case InactiveVerbatimString:\n    case Regex:\n    case InactiveRegex:\n    case TripleQuotedVerbatimString:\n    case InactiveTripleQuotedVerbatimString:\n    case HashQuotedString:\n    case InactiveHashQuotedString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerCPP::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"and and_eq asm auto bitand bitor bool break case \"\n            \"catch char class compl const const_cast continue \"\n            \"default delete do double dynamic_cast else enum \"\n            \"explicit export extern false float for friend goto if \"\n            \"inline int long mutable namespace new not not_eq \"\n            \"operator or or_eq private protected public register \"\n            \"reinterpret_cast return short signed sizeof static \"\n            \"static_cast struct switch template this throw true \"\n            \"try typedef typeid typename union unsigned using \"\n            \"virtual void volatile wchar_t while xor xor_eq\";\n\n    if (set == 3)\n        return\n            \"a addindex addtogroup anchor arg attention author b \"\n            \"brief bug c class code date def defgroup deprecated \"\n            \"dontinclude e em endcode endhtmlonly endif \"\n            \"endlatexonly endlink endverbatim enum example \"\n            \"exception f$ f[ f] file fn hideinitializer \"\n            \"htmlinclude htmlonly if image include ingroup \"\n            \"internal invariant interface latexonly li line link \"\n            \"mainpage name namespace nosubgrouping note overload \"\n            \"p page par param post pre ref relates remarks return \"\n            \"retval sa section see showinitializer since skip \"\n            \"skipline struct subsection test throw todo typedef \"\n            \"union until var verbatim verbinclude version warning \"\n            \"weakgroup $ @ \\\\ & < > # { }\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerCPP::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case InactiveDefault:\n        return tr(\"Inactive default\");\n\n    case Comment:\n        return tr(\"C comment\");\n\n    case InactiveComment:\n        return tr(\"Inactive C comment\");\n\n    case CommentLine:\n        return tr(\"C++ comment\");\n\n    case InactiveCommentLine:\n        return tr(\"Inactive C++ comment\");\n\n    case CommentDoc:\n        return tr(\"JavaDoc style C comment\");\n\n    case InactiveCommentDoc:\n        return tr(\"Inactive JavaDoc style C comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case InactiveNumber:\n        return tr(\"Inactive number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case InactiveKeyword:\n        return tr(\"Inactive keyword\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case InactiveDoubleQuotedString:\n        return tr(\"Inactive double-quoted string\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case InactiveSingleQuotedString:\n        return tr(\"Inactive single-quoted string\");\n\n    case UUID:\n        return tr(\"IDL UUID\");\n\n    case InactiveUUID:\n        return tr(\"Inactive IDL UUID\");\n\n    case PreProcessor:\n        return tr(\"Pre-processor block\");\n\n    case InactivePreProcessor:\n        return tr(\"Inactive pre-processor block\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case InactiveOperator:\n        return tr(\"Inactive operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case InactiveIdentifier:\n        return tr(\"Inactive identifier\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case InactiveUnclosedString:\n        return tr(\"Inactive unclosed string\");\n\n    case VerbatimString:\n        return tr(\"C# verbatim string\");\n\n    case InactiveVerbatimString:\n        return tr(\"Inactive C# verbatim string\");\n\n    case Regex:\n        return tr(\"JavaScript regular expression\");\n\n    case InactiveRegex:\n        return tr(\"Inactive JavaScript regular expression\");\n\n    case CommentLineDoc:\n        return tr(\"JavaDoc style C++ comment\");\n\n    case InactiveCommentLineDoc:\n        return tr(\"Inactive JavaDoc style C++ comment\");\n\n    case KeywordSet2:\n        return tr(\"Secondary keywords and identifiers\");\n\n    case InactiveKeywordSet2:\n        return tr(\"Inactive secondary keywords and identifiers\");\n\n    case CommentDocKeyword:\n        return tr(\"JavaDoc keyword\");\n\n    case InactiveCommentDocKeyword:\n        return tr(\"Inactive JavaDoc keyword\");\n\n    case CommentDocKeywordError:\n        return tr(\"JavaDoc keyword error\");\n\n    case InactiveCommentDocKeywordError:\n        return tr(\"Inactive JavaDoc keyword error\");\n\n    case GlobalClass:\n        return tr(\"Global classes and typedefs\");\n\n    case InactiveGlobalClass:\n        return tr(\"Inactive global classes and typedefs\");\n\n    case RawString:\n        return tr(\"C++ raw string\");\n\n    case InactiveRawString:\n        return tr(\"Inactive C++ raw string\");\n\n    case TripleQuotedVerbatimString:\n        return tr(\"Vala triple-quoted verbatim string\");\n\n    case InactiveTripleQuotedVerbatimString:\n        return tr(\"Inactive Vala triple-quoted verbatim string\");\n\n    case HashQuotedString:\n        return tr(\"Pike hash-quoted string\");\n\n    case InactiveHashQuotedString:\n        return tr(\"Inactive Pike hash-quoted string\");\n\n    case PreProcessorComment:\n        return tr(\"Pre-processor C comment\");\n\n    case InactivePreProcessorComment:\n        return tr(\"Inactive pre-processor C comment\");\n\n    case PreProcessorCommentLineDoc:\n        return tr(\"JavaDoc style pre-processor comment\");\n\n    case InactivePreProcessorCommentLineDoc:\n        return tr(\"Inactive JavaDoc style pre-processor comment\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerCPP::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case UnclosedString:\n    case InactiveUnclosedString:\n        return QColor(0xe0,0xc0,0xe0);\n\n    case VerbatimString:\n    case InactiveVerbatimString:\n    case TripleQuotedVerbatimString:\n    case InactiveTripleQuotedVerbatimString:\n        return QColor(0xe0,0xff,0xe0);\n\n    case Regex:\n    case InactiveRegex:\n        return QColor(0xe0,0xf0,0xe0);\n\n    case RawString:\n    case InactiveRawString:\n        return QColor(0xff,0xf3,0xff);\n\n    case HashQuotedString:\n    case InactiveHashQuotedString:\n        return QColor(0xe7,0xff,0xd7);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerCPP::refreshProperties()\n{\n    setAtElseProp();\n    setCommentProp();\n    setCompactProp();\n    setPreprocProp();\n    setStylePreprocProp();\n    setDollarsProp();\n    setHighlightTripleProp();\n    setHighlightHashProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerCPP::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    fold_atelse = qs.value(prefix + \"foldatelse\", false).toBool();\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n    fold_preproc = qs.value(prefix + \"foldpreprocessor\", true).toBool();\n    style_preproc = qs.value(prefix + \"stylepreprocessor\", false).toBool();\n    dollars = qs.value(prefix + \"dollars\", true).toBool();\n    highlight_triple = qs.value(prefix + \"highlighttriple\", false).toBool();\n    highlight_hash = qs.value(prefix + \"highlighthash\", false).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerCPP::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldatelse\", fold_atelse);\n    qs.setValue(prefix + \"foldcomments\", fold_comments);\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n    qs.setValue(prefix + \"foldpreprocessor\", fold_preproc);\n    qs.setValue(prefix + \"stylepreprocessor\", style_preproc);\n    qs.setValue(prefix + \"dollars\", dollars);\n    qs.setValue(prefix + \"highlighttriple\", highlight_triple);\n    qs.setValue(prefix + \"highlighthash\", highlight_hash);\n\n    return rc;\n}\n\n\n// Set if else can be folded.\nvoid QsciLexerCPP::setFoldAtElse(bool fold)\n{\n    fold_atelse = fold;\n\n    setAtElseProp();\n}\n\n\n// Set the \"fold.at.else\" property.\nvoid QsciLexerCPP::setAtElseProp()\n{\n    emit propertyChanged(\"fold.at.else\",(fold_atelse ? \"1\" : \"0\"));\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerCPP::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerCPP::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Set if folds are compact\nvoid QsciLexerCPP::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerCPP::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Set if preprocessor blocks can be folded.\nvoid QsciLexerCPP::setFoldPreprocessor(bool fold)\n{\n    fold_preproc = fold;\n\n    setPreprocProp();\n}\n\n\n// Set the \"fold.preprocessor\" property.\nvoid QsciLexerCPP::setPreprocProp()\n{\n    emit propertyChanged(\"fold.preprocessor\",(fold_preproc ? \"1\" : \"0\"));\n}\n\n\n// Set if preprocessor lines are styled.\nvoid QsciLexerCPP::setStylePreprocessor(bool style)\n{\n    style_preproc = style;\n\n    setStylePreprocProp();\n}\n\n\n// Set the \"styling.within.preprocessor\" property.\nvoid QsciLexerCPP::setStylePreprocProp()\n{\n    emit propertyChanged(\"styling.within.preprocessor\",(style_preproc ? \"1\" : \"0\"));\n}\n\n\n// Set if '$' characters are allowed.\nvoid QsciLexerCPP::setDollarsAllowed(bool allowed)\n{\n    dollars = allowed;\n\n    setDollarsProp();\n}\n\n\n// Set the \"lexer.cpp.allow.dollars\" property.\nvoid QsciLexerCPP::setDollarsProp()\n{\n    emit propertyChanged(\"lexer.cpp.allow.dollars\",(dollars ? \"1\" : \"0\"));\n}\n\n\n// Set if triple quoted strings are highlighted.\nvoid QsciLexerCPP::setHighlightTripleQuotedStrings(bool enabled)\n{\n    highlight_triple = enabled;\n\n    setHighlightTripleProp();\n}\n\n\n// Set the \"lexer.cpp.triplequoted.strings\" property.\nvoid QsciLexerCPP::setHighlightTripleProp()\n{\n    emit propertyChanged(\"lexer.cpp.triplequoted.strings\",\n            (highlight_triple ? \"1\" : \"0\"));\n}\n\n\n// Set if hash quoted strings are highlighted.\nvoid QsciLexerCPP::setHighlightHashQuotedStrings(bool enabled)\n{\n    highlight_hash = enabled;\n\n    setHighlightHashProp();\n}\n\n\n// Set the \"lexer.cpp.hashquoted.strings\" property.\nvoid QsciLexerCPP::setHighlightHashProp()\n{\n    emit propertyChanged(\"lexer.cpp.hashquoted.strings\",\n            (highlight_hash ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexercsharp.cpp",
    "content": "// This module implements the QsciLexerCSharp class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexercsharp.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n\n\n// The ctor.\nQsciLexerCSharp::QsciLexerCSharp(QObject *parent)\n    : QsciLexerCPP(parent)\n{\n}\n\n\n// The dtor.\nQsciLexerCSharp::~QsciLexerCSharp()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerCSharp::language() const\n{\n    return \"C#\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerCSharp::defaultColor(int style) const\n{\n    if (style == VerbatimString)\n        return QColor(0x00,0x7f,0x00);\n\n    return QsciLexerCPP::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerCSharp::defaultEolFill(int style) const\n{\n    if (style == VerbatimString)\n        return true;\n\n    return QsciLexerCPP::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerCSharp::defaultFont(int style) const\n{\n    if (style == VerbatimString)\n#if defined(Q_OS_WIN)\n        return QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        return QFont(\"Courier\", 12);\n#else\n        return QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n\n    return QsciLexerCPP::defaultFont(style);\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerCSharp::keywords(int set) const\n{\n    if (set != 1)\n        return 0;\n\n    return \"abstract as base bool break byte case catch char checked \"\n           \"class const continue decimal default delegate do double else \"\n           \"enum event explicit extern false finally fixed float for \"\n           \"foreach goto if implicit in int interface internal is lock \"\n           \"long namespace new null object operator out override params \"\n           \"private protected public readonly ref return sbyte sealed \"\n           \"short sizeof stackalloc static string struct switch this \"\n           \"throw true try typeof uint ulong unchecked unsafe ushort \"\n           \"using virtual void while\";\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerCSharp::description(int style) const\n{\n    if (style == VerbatimString)\n        return tr(\"Verbatim string\");\n\n    return QsciLexerCPP::description(style);\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerCSharp::defaultPaper(int style) const\n{\n    if (style == VerbatimString)\n        return QColor(0xe0,0xff,0xe0);\n\n    return QsciLexer::defaultPaper(style);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexercss.cpp",
    "content": "// This module implements the QsciLexerCSS class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexercss.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerCSS::QsciLexerCSS(QObject *parent)\n    : QsciLexer(parent),\n      fold_comments(false), fold_compact(true), hss_language(false),\n      less_language(false), scss_language(false)\n{\n}\n\n\n// The dtor.\nQsciLexerCSS::~QsciLexerCSS()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerCSS::language() const\n{\n    return \"CSS\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerCSS::lexer() const\n{\n    return \"css\";\n}\n\n\n// Return the list of characters that can start a block.\nconst char *QsciLexerCSS::blockStart(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"{\";\n}\n\n\n// Return the list of characters that can end a block.\nconst char *QsciLexerCSS::blockEnd(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"}\";\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerCSS::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerCSS::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0xff,0x00,0x80);\n\n    case Tag:\n        return QColor(0x00,0x00,0x7f);\n\n    case PseudoClass:\n    case Attribute:\n        return QColor(0x80,0x00,0x00);\n\n    case UnknownPseudoClass:\n    case UnknownProperty:\n        return QColor(0xff,0x00,0x00);\n\n    case Operator:\n        return QColor(0x00,0x00,0x00);\n\n    case CSS1Property:\n        return QColor(0x00,0x40,0xe0);\n\n    case Value:\n    case DoubleQuotedString:\n    case SingleQuotedString:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case IDSelector:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Important:\n        return QColor(0xff,0x80,0x00);\n\n    case AtRule:\n    case MediaRule:\n        return QColor(0x7f,0x7f,0x00);\n\n    case CSS2Property:\n        return QColor(0x00,0xa0,0xe0);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerCSS::defaultFont(int style) const\n{\n    QFont f;\n\n    if (style == Comment)\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n    else\n    {\n        f = QsciLexer::defaultFont(style);\n\n        switch (style)\n        {\n        case Tag:\n        case Important:\n        case MediaRule:\n            f.setBold(true);\n            break;\n\n        case IDSelector:\n            f.setItalic(true);\n            break;\n        }\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerCSS::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"color background-color background-image \"\n            \"background-repeat background-attachment \"\n            \"background-position background font-family \"\n            \"font-style font-variant font-weight font-size font \"\n            \"word-spacing letter-spacing text-decoration \"\n            \"vertical-align text-transform text-align \"\n            \"text-indent line-height margin-top margin-right \"\n            \"margin-bottom margin-left margin padding-top \"\n            \"padding-right padding-bottom padding-left padding \"\n            \"border-top-width border-right-width \"\n            \"border-bottom-width border-left-width border-width \"\n            \"border-top border-right border-bottom border-left \"\n            \"border border-color border-style width height float \"\n            \"clear display white-space list-style-type \"\n            \"list-style-image list-style-position list-style\";\n\n    if (set == 2)\n        return\n            \"first-letter first-line link active visited \"\n            \"first-child focus hover lang before after left \"\n            \"right first\";\n\n    if (set == 3)\n        return\n            \"border-top-color border-right-color \"\n            \"border-bottom-color border-left-color border-color \"\n            \"border-top-style border-right-style \"\n            \"border-bottom-style border-left-style border-style \"\n            \"top right bottom left position z-index direction \"\n            \"unicode-bidi min-width max-width min-height \"\n            \"max-height overflow clip visibility content quotes \"\n            \"counter-reset counter-increment marker-offset size \"\n            \"marks page-break-before page-break-after \"\n            \"page-break-inside page orphans widows font-stretch \"\n            \"font-size-adjust unicode-range units-per-em src \"\n            \"panose-1 stemv stemh slope cap-height x-height \"\n            \"ascent descent widths bbox definition-src baseline \"\n            \"centerline mathline topline text-shadow \"\n            \"caption-side table-layout border-collapse \"\n            \"border-spacing empty-cells speak-header cursor \"\n            \"outline outline-width outline-style outline-color \"\n            \"volume speak pause-before pause-after pause \"\n            \"cue-before cue-after cue play-during azimuth \"\n            \"elevation speech-rate voice-family pitch \"\n            \"pitch-range stress richness speak-punctuation \"\n            \"speak-numeral\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerCSS::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Tag:\n        return tr(\"Tag\");\n\n    case ClassSelector:\n        return tr(\"Class selector\");\n\n    case PseudoClass:\n        return tr(\"Pseudo-class\");\n\n    case UnknownPseudoClass:\n        return tr(\"Unknown pseudo-class\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case CSS1Property:\n        return tr(\"CSS1 property\");\n\n    case UnknownProperty:\n        return tr(\"Unknown property\");\n\n    case Value:\n        return tr(\"Value\");\n\n    case IDSelector:\n        return tr(\"ID selector\");\n\n    case Important:\n        return tr(\"Important\");\n\n    case AtRule:\n        return tr(\"@-rule\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case CSS2Property:\n        return tr(\"CSS2 property\");\n\n    case Attribute:\n        return tr(\"Attribute\");\n\n    case CSS3Property:\n        return tr(\"CSS3 property\");\n\n    case PseudoElement:\n        return tr(\"Pseudo-element\");\n\n    case ExtendedCSSProperty:\n        return tr(\"Extended CSS property\");\n\n    case ExtendedPseudoClass:\n        return tr(\"Extended pseudo-class\");\n\n    case ExtendedPseudoElement:\n        return tr(\"Extended pseudo-element\");\n\n    case MediaRule:\n        return tr(\"Media rule\");\n\n    case Variable:\n        return tr(\"Variable\");\n    }\n\n    return QString();\n}\n\n\n// Refresh all properties.\nvoid QsciLexerCSS::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n    setHSSProp();\n    setLessProp();\n    setSCSSProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerCSS::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n    hss_language = qs.value(prefix + \"hsslanguage\", false).toBool();\n    less_language = qs.value(prefix + \"lesslanguage\", false).toBool();\n    scss_language = qs.value(prefix + \"scsslanguage\", false).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerCSS::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldcomments\", fold_comments);\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n    qs.setValue(prefix + \"hsslanguage\", hss_language);\n    qs.setValue(prefix + \"lesslanguage\", less_language);\n    qs.setValue(prefix + \"scsslanguage\", scss_language);\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerCSS::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerCSS::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerCSS::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerCSS::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerCSS::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerCSS::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Set if HSS is supported.\nvoid QsciLexerCSS::setHSSLanguage(bool enabled)\n{\n    hss_language = enabled;\n\n    setHSSProp();\n}\n\n\n// Set the \"lexer.css.hss.language\" property.\nvoid QsciLexerCSS::setHSSProp()\n{\n    emit propertyChanged(\"lexer.css.hss.language\",(hss_language ? \"1\" : \"0\"));\n}\n\n\n// Set if Less CSS is supported.\nvoid QsciLexerCSS::setLessLanguage(bool enabled)\n{\n    less_language = enabled;\n\n    setLessProp();\n}\n\n\n// Set the \"lexer.css.less.language\" property.\nvoid QsciLexerCSS::setLessProp()\n{\n    emit propertyChanged(\"lexer.css.less.language\",(less_language ? \"1\" : \"0\"));\n}\n\n\n// Set if Sassy CSS is supported.\nvoid QsciLexerCSS::setSCSSLanguage(bool enabled)\n{\n    scss_language = enabled;\n\n    setSCSSProp();\n}\n\n\n// Set the \"lexer.css.scss.language\" property.\nvoid QsciLexerCSS::setSCSSProp()\n{\n    emit propertyChanged(\"lexer.css.scss.language\",(scss_language ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexercustom.cpp",
    "content": "// This module implements the QsciLexerCustom class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexercustom.h\"\n\n#include \"Qsci/qsciscintilla.h\"\n#include \"Qsci/qsciscintillabase.h\"\n#include \"Qsci/qscistyle.h\"\n\n\n// The ctor.\nQsciLexerCustom::QsciLexerCustom(QObject *parent)\n    : QsciLexer(parent)\n{\n}\n\n\n// The dtor.\nQsciLexerCustom::~QsciLexerCustom()\n{\n}\n\n\n// Start styling.\nvoid QsciLexerCustom::startStyling(int start, int styleBits)\n{\n    if (!editor())\n        return;\n\n    if (styleBits == 0)\n        styleBits = (1 << styleBitsNeeded()) - 1;\n\n    editor()->SendScintilla(QsciScintillaBase::SCI_STARTSTYLING, start,\n            styleBits);\n}\n\n\n// Set the style for a number of characters.\nvoid QsciLexerCustom::setStyling(int length, int style)\n{\n    if (!editor())\n        return;\n\n    editor()->SendScintilla(QsciScintillaBase::SCI_SETSTYLING, length, style);\n}\n\n\n// Set the style for a number of characters.\nvoid QsciLexerCustom::setStyling(int length, const QsciStyle &style)\n{\n    setStyling(length, style.style());\n}\n\n\n// Set the attached editor.\nvoid QsciLexerCustom::setEditor(QsciScintilla *new_editor)\n{\n    if (editor())\n        disconnect(editor(), SIGNAL(SCN_STYLENEEDED(int)), this,\n                SLOT(handleStyleNeeded(int)));\n\n    QsciLexer::setEditor(new_editor);\n\n    if (editor())\n        connect(editor(), SIGNAL(SCN_STYLENEEDED(int)), this,\n                SLOT(handleStyleNeeded(int)));\n}\n\n\n// Return the number of style bits needed by the lexer.\nint QsciLexerCustom::styleBitsNeeded() const\n{\n    return 5;\n}\n\n\n// Handle a request to style some text.\nvoid QsciLexerCustom::handleStyleNeeded(int pos)\n{\n    int start = editor()->SendScintilla(QsciScintillaBase::SCI_GETENDSTYLED);\n    int line = editor()->SendScintilla(QsciScintillaBase::SCI_LINEFROMPOSITION,\n            start);\n    start = editor()->SendScintilla(QsciScintillaBase::SCI_POSITIONFROMLINE,\n            line);\n\n    if (start != pos)\n        styleText(start, pos);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerd.cpp",
    "content": "// This module implements the QsciLexerD class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerd.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerD::QsciLexerD(QObject *parent)\n    : QsciLexer(parent),\n      fold_atelse(false), fold_comments(false), fold_compact(true)\n{\n}\n\n\n// The dtor.\nQsciLexerD::~QsciLexerD()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerD::language() const\n{\n    return \"D\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerD::lexer() const\n{\n    return \"d\";\n}\n\n\n// Return the set of character sequences that can separate auto-completion\n// words.\nQStringList QsciLexerD::autoCompletionWordSeparators() const\n{\n    QStringList wl;\n\n    wl << \".\";\n\n    return wl;\n}\n\n\n// Return the list of keywords that can start a block.\nconst char *QsciLexerD::blockStartKeyword(int *style) const\n{\n    if (style)\n        *style = Keyword;\n\n    return \"case catch class default do else finally for foreach \"\n           \"foreach_reverse if private protected public struct try union \"\n           \"while\";\n}\n\n\n// Return the list of characters that can start a block.\nconst char *QsciLexerD::blockStart(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"{\";\n}\n\n\n// Return the list of characters that can end a block.\nconst char *QsciLexerD::blockEnd(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"}\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerD::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerD::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_#\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerD::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Comment:\n    case CommentLine:\n        return QColor(0x00,0x7f,0x00);\n\n    case CommentDoc:\n    case CommentLineDoc:\n        return QColor(0x3f,0x70,0x3f);\n\n    case CommentNested:\n        return QColor(0xa0,0xc0,0xa0);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n    case KeywordSecondary:\n    case KeywordDoc:\n    case Typedefs:\n        return QColor(0x00,0x00,0x7f);\n\n    case String:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Character:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Operator:\n    case UnclosedString:\n        return QColor(0x00,0x00,0x00);\n\n    case Identifier:\n        break;\n\n    case CommentDocKeyword:\n        return QColor(0x30,0x60,0xa0);\n\n    case CommentDocKeywordError:\n        return QColor(0x80,0x40,0x20);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerD::defaultEolFill(int style) const\n{\n    if (style == UnclosedString)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerD::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case CommentLine:\n    case CommentDoc:\n    case CommentNested:\n    case CommentLineDoc:\n    case CommentDocKeyword:\n    case CommentDocKeywordError:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case KeywordSecondary:\n    case KeywordDoc:\n    case Typedefs:\n    case Operator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case String:\n    case UnclosedString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerD::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"abstract alias align asm assert auto body bool break byte case \"\n            \"cast catch cdouble cent cfloat char class const continue creal \"\n            \"dchar debug default delegate delete deprecated do double else \"\n            \"enum export extern false final finally float for foreach \"\n            \"foreach_reverse function goto idouble if ifloat import in inout \"\n            \"int interface invariant ireal is lazy long mixin module new null \"\n            \"out override package pragma private protected public real return \"\n            \"scope short static struct super switch synchronized template \"\n            \"this throw true try typedef typeid typeof ubyte ucent uint ulong \"\n            \"union unittest ushort version void volatile wchar while with\";\n\n    if (set == 3)\n        return\n            \"a addindex addtogroup anchor arg attention author b brief bug c \"\n            \"class code date def defgroup deprecated dontinclude e em endcode \"\n            \"endhtmlonly endif endlatexonly endlink endverbatim enum example \"\n            \"exception f$ f[ f] file fn hideinitializer htmlinclude htmlonly \"\n            \"if image include ingroup internal invariant interface latexonly \"\n            \"li line link mainpage name namespace nosubgrouping note overload \"\n            \"p page par param post pre ref relates remarks return retval sa \"\n            \"section see showinitializer since skip skipline struct \"\n            \"subsection test throw todo typedef union until var verbatim \"\n            \"verbinclude version warning weakgroup $ @ \\\\ & < > # { }\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerD::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Block comment\");\n\n    case CommentLine:\n        return tr(\"Line comment\");\n\n    case CommentDoc:\n        return tr(\"DDoc style block comment\");\n\n    case CommentNested:\n        return tr(\"Nesting comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case KeywordSecondary:\n        return tr(\"Secondary keyword\");\n\n    case KeywordDoc:\n        return tr(\"Documentation keyword\");\n\n    case Typedefs:\n        return tr(\"Type definition\");\n\n    case String:\n        return tr(\"String\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case Character:\n        return tr(\"Character\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case CommentLineDoc:\n        return tr(\"DDoc style line comment\");\n\n    case CommentDocKeyword:\n        return tr(\"DDoc keyword\");\n\n    case CommentDocKeywordError:\n        return tr(\"DDoc keyword error\");\n\n    case BackquoteString:\n        return tr(\"Backquoted string\");\n\n    case RawString:\n        return tr(\"Raw string\");\n\n    case KeywordSet5:\n        return tr(\"User defined 1\");\n\n    case KeywordSet6:\n        return tr(\"User defined 2\");\n\n    case KeywordSet7:\n        return tr(\"User defined 3\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerD::defaultPaper(int style) const\n{\n    if (style == UnclosedString)\n        return QColor(0xe0,0xc0,0xe0);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerD::refreshProperties()\n{\n    setAtElseProp();\n    setCommentProp();\n    setCompactProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerD::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    fold_atelse = qs.value(prefix + \"foldatelse\", false).toBool();\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerD::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldatelse\", fold_atelse);\n    qs.setValue(prefix + \"foldcomments\", fold_comments);\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n\n    return rc;\n}\n\n\n// Return true if else can be folded.\nbool QsciLexerD::foldAtElse() const\n{\n    return fold_atelse;\n}\n\n\n// Set if else can be folded.\nvoid QsciLexerD::setFoldAtElse(bool fold)\n{\n    fold_atelse = fold;\n\n    setAtElseProp();\n}\n\n\n// Set the \"fold.at.else\" property.\nvoid QsciLexerD::setAtElseProp()\n{\n    emit propertyChanged(\"fold.at.else\",(fold_atelse ? \"1\" : \"0\"));\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerD::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerD::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerD::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerD::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerD::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerD::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerdiff.cpp",
    "content": "// This module implements the QsciLexerDiff class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerdiff.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerDiff::QsciLexerDiff(QObject *parent)\n    : QsciLexer(parent)\n{\n}\n\n\n// The dtor.\nQsciLexerDiff::~QsciLexerDiff()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerDiff::language() const\n{\n    return \"Diff\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerDiff::lexer() const\n{\n    return \"diff\";\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerDiff::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerDiff::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x00,0x00,0x00);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case Command:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Header:\n        return QColor(0x7f,0x00,0x00);\n\n    case Position:\n        return QColor(0x7f,0x00,0x7f);\n\n    case LineRemoved:\n        return QColor(0x00,0x7f,0x7f);\n\n    case LineAdded:\n        return QColor(0x00,0x00,0x7f);\n\n    case LineChanged:\n        return QColor(0x7f,0x7f,0x7f);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerDiff::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Command:\n        return tr(\"Command\");\n\n    case Header:\n        return tr(\"Header\");\n\n    case Position:\n        return tr(\"Position\");\n\n    case LineRemoved:\n        return tr(\"Removed line\");\n\n    case LineAdded:\n        return tr(\"Added line\");\n\n    case LineChanged:\n        return tr(\"Changed line\");\n    }\n\n    return QString();\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerfortran.cpp",
    "content": "// This module implements the QsciLexerFortran class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerfortran.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerFortran::QsciLexerFortran(QObject *parent)\n    : QsciLexerFortran77(parent)\n{\n}\n\n\n// The dtor.\nQsciLexerFortran::~QsciLexerFortran()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerFortran::language() const\n{\n    return \"Fortran\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerFortran::lexer() const\n{\n    return \"fortran\";\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerFortran::keywords(int set) const\n{\n    if (set == 2)\n        return\n            \"abs achar acos acosd adjustl adjustr aimag aimax0 aimin0 aint \"\n            \"ajmax0 ajmin0 akmax0 akmin0 all allocated alog alog10 amax0 \"\n            \"amax1 amin0 amin1 amod anint any asin asind associated atan \"\n            \"atan2 atan2d atand bitest bitl bitlr bitrl bjtest bit_size \"\n            \"bktest break btest cabs ccos cdabs cdcos cdexp cdlog cdsin \"\n            \"cdsqrt ceiling cexp char clog cmplx conjg cos cosd cosh count \"\n            \"cpu_time cshift csin csqrt dabs dacos dacosd dasin dasind datan \"\n            \"datan2 datan2d datand date date_and_time dble dcmplx dconjg dcos \"\n            \"dcosd dcosh dcotan ddim dexp dfloat dflotk dfloti dflotj digits \"\n            \"dim dimag dint dlog dlog10 dmax1 dmin1 dmod dnint dot_product \"\n            \"dprod dreal dsign dsin dsind dsinh dsqrt dtan dtand dtanh \"\n            \"eoshift epsilon errsns exp exponent float floati floatj floatk \"\n            \"floor fraction free huge iabs iachar iand ibclr ibits ibset \"\n            \"ichar idate idim idint idnint ieor ifix iiabs iiand iibclr \"\n            \"iibits iibset iidim iidint iidnnt iieor iifix iint iior iiqint \"\n            \"iiqnnt iishft iishftc iisign ilen imax0 imax1 imin0 imin1 imod \"\n            \"index inint inot int int1 int2 int4 int8 iqint iqnint ior ishft \"\n            \"ishftc isign isnan izext jiand jibclr jibits jibset jidim jidint \"\n            \"jidnnt jieor jifix jint jior jiqint jiqnnt jishft jishftc jisign \"\n            \"jmax0 jmax1 jmin0 jmin1 jmod jnint jnot jzext kiabs kiand kibclr \"\n            \"kibits kibset kidim kidint kidnnt kieor kifix kind kint kior \"\n            \"kishft kishftc kisign kmax0 kmax1 kmin0 kmin1 kmod knint knot \"\n            \"kzext lbound leadz len len_trim lenlge lge lgt lle llt log log10 \"\n            \"logical lshift malloc matmul max max0 max1 maxexponent maxloc \"\n            \"maxval merge min min0 min1 minexponent minloc minval mod modulo \"\n            \"mvbits nearest nint not nworkers number_of_processors pack \"\n            \"popcnt poppar precision present product radix random \"\n            \"random_number random_seed range real repeat reshape rrspacing \"\n            \"rshift scale scan secnds selected_int_kind selected_real_kind \"\n            \"set_exponent shape sign sin sind sinh size sizeof sngl snglq \"\n            \"spacing spread sqrt sum system_clock tan tand tanh tiny transfer \"\n            \"transpose trim ubound unpack verify\";\n\n    if (set == 3)\n        return\n            \"cdabs cdcos cdexp cdlog cdsin cdsqrt cotan cotand dcmplx dconjg \"\n            \"dcotan dcotand decode dimag dll_export dll_import doublecomplex \"\n            \"dreal dvchk encode find flen flush getarg getcharqq getcl getdat \"\n            \"getenv gettim hfix ibchng identifier imag int1 int2 int4 intc \"\n            \"intrup invalop iostat_msg isha ishc ishl jfix lacfar locking \"\n            \"locnear map nargs nbreak ndperr ndpexc offset ovefl peekcharqq \"\n            \"precfill prompt qabs qacos qacosd qasin qasind qatan qatand \"\n            \"qatan2 qcmplx qconjg qcos qcosd qcosh qdim qexp qext qextd \"\n            \"qfloat qimag qlog qlog10 qmax1 qmin1 qmod qreal qsign qsin qsind \"\n            \"qsinh qsqrt qtan qtand qtanh ran rand randu rewrite segment \"\n            \"setdat settim system timer undfl unlock union val virtual \"\n            \"volatile zabs zcos zexp zlog zsin zsqrt\";\n\n    return QsciLexerFortran77::keywords(set);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerfortran77.cpp",
    "content": "// This module implements the QsciLexerFortran77 class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerfortran77.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerFortran77::QsciLexerFortran77(QObject *parent)\n    : QsciLexer(parent),\n      fold_compact(true)\n{\n}\n\n\n// The dtor.\nQsciLexerFortran77::~QsciLexerFortran77()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerFortran77::language() const\n{\n    return \"Fortran77\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerFortran77::lexer() const\n{\n    return \"f77\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerFortran77::braceStyle() const\n{\n    return Default;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerFortran77::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case SingleQuotedString:\n    case DoubleQuotedString:\n        return QColor(0x7f,0x00,0x7f);\n\n    case UnclosedString:\n    case Operator:\n    case DottedOperator:\n    case Continuation:\n        return QColor(0x00,0x00,0x00);\n\n    case Identifier:\n        break;\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case IntrinsicFunction:\n        return QColor(0xb0,0x00,0x40);\n\n    case ExtendedFunction:\n        return QColor(0xb0,0x40,0x80);\n\n    case PreProcessor:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Label:\n        return QColor(0xe0,0xc0,0xe0);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerFortran77::defaultEolFill(int style) const\n{\n    if (style == UnclosedString)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerFortran77::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Operator:\n    case DottedOperator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerFortran77::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"access action advance allocatable allocate apostrophe assign \"\n            \"assignment associate asynchronous backspace bind blank blockdata \"\n            \"call case character class close common complex contains continue \"\n            \"cycle data deallocate decimal delim default dimension direct do \"\n            \"dowhile double doubleprecision else elseif elsewhere encoding \"\n            \"end endassociate endblockdata enddo endfile endforall \"\n            \"endfunction endif endinterface endmodule endprogram endselect \"\n            \"endsubroutine endtype endwhere entry eor equivalence err errmsg \"\n            \"exist exit external file flush fmt forall form format formatted \"\n            \"function go goto id if implicit in include inout integer inquire \"\n            \"intent interface intrinsic iomsg iolength iostat kind len \"\n            \"logical module name named namelist nextrec nml none nullify \"\n            \"number only open opened operator optional out pad parameter pass \"\n            \"pause pending pointer pos position precision print private \"\n            \"program protected public quote read readwrite real rec recl \"\n            \"recursive result return rewind save select selectcase selecttype \"\n            \"sequential sign size stat status stop stream subroutine target \"\n            \"then to type unformatted unit use value volatile wait where \"\n            \"while write\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerFortran77::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case IntrinsicFunction:\n        return tr(\"Intrinsic function\");\n\n    case ExtendedFunction:\n        return tr(\"Extended function\");\n\n    case PreProcessor:\n        return tr(\"Pre-processor block\");\n\n    case DottedOperator:\n        return tr(\"Dotted operator\");\n\n    case Label:\n        return tr(\"Label\");\n\n    case Continuation:\n        return tr(\"Continuation\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerFortran77::defaultPaper(int style) const\n{\n    if (style == UnclosedString)\n        return QColor(0xe0,0xc0,0xe0);\n\n    if (style == Continuation)\n        return QColor(0xf0,0xe0,0x80);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerFortran77::refreshProperties()\n{\n    setCompactProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerFortran77::readProperties(QSettings &qs, const QString &prefix)\n{\n    int rc = true;\n\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerFortran77::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n\n    return rc;\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerFortran77::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerFortran77::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerFortran77::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerhtml.cpp",
    "content": "// This module implements the QsciLexerHTML class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerhtml.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n#include \"Qsci/qscilexerjavascript.h\"\n#include \"Qsci/qscilexerpython.h\"\n\n\n// The ctor.\nQsciLexerHTML::QsciLexerHTML(QObject *parent)\n    : QsciLexer(parent),\n      fold_compact(true), fold_preproc(true), case_sens_tags(false),\n      fold_script_comments(false), fold_script_heredocs(false),\n      django_templates(false), mako_templates(false)\n{\n}\n\n\n// The dtor.\nQsciLexerHTML::~QsciLexerHTML()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerHTML::language() const\n{\n    return \"HTML\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerHTML::lexer() const\n{\n    return \"hypertext\";\n}\n\n\n// Return the auto-completion fillup characters.\nconst char *QsciLexerHTML::autoCompletionFillups() const\n{\n    return \"/>\";\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerHTML::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerHTML::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n    case JavaScriptDefault:\n    case JavaScriptWord:\n    case JavaScriptSymbol:\n    case ASPJavaScriptDefault:\n    case ASPJavaScriptWord:\n    case ASPJavaScriptSymbol:\n    case VBScriptDefault:\n    case ASPVBScriptDefault:\n    case PHPOperator:\n        return QColor(0x00,0x00,0x00);\n\n    case Tag:\n    case XMLTagEnd:\n    case Script:\n    case SGMLDefault:\n    case SGMLCommand:\n    case VBScriptKeyword:\n    case VBScriptIdentifier:\n    case VBScriptUnclosedString:\n    case ASPVBScriptKeyword:\n    case ASPVBScriptIdentifier:\n    case ASPVBScriptUnclosedString:\n        return QColor(0x00,0x00,0x80);\n\n    case UnknownTag:\n    case UnknownAttribute:\n        return QColor(0xff,0x00,0x00);\n\n    case Attribute:\n    case VBScriptNumber:\n    case ASPVBScriptNumber:\n        return QColor(0x00,0x80,0x80);\n\n    case HTMLNumber:\n    case JavaScriptNumber:\n    case ASPJavaScriptNumber:\n    case PythonNumber:\n    case PythonFunctionMethodName:\n    case ASPPythonNumber:\n    case ASPPythonFunctionMethodName:\n        return QColor(0x00,0x7f,0x7f);\n\n    case HTMLDoubleQuotedString:\n    case HTMLSingleQuotedString:\n    case JavaScriptDoubleQuotedString:\n    case JavaScriptSingleQuotedString:\n    case ASPJavaScriptDoubleQuotedString:\n    case ASPJavaScriptSingleQuotedString:\n    case PythonDoubleQuotedString:\n    case PythonSingleQuotedString:\n    case ASPPythonDoubleQuotedString:\n    case ASPPythonSingleQuotedString:\n    case PHPKeyword:\n        return QColor(0x7f,0x00,0x7f);\n\n    case OtherInTag:\n    case Entity:\n    case VBScriptString:\n    case ASPVBScriptString:\n        return QColor(0x80,0x00,0x80);\n\n    case HTMLComment:\n    case SGMLComment:\n        return QColor(0x80,0x80,0x00);\n\n    case XMLStart:\n    case XMLEnd:\n    case PHPStart:\n    case PythonClassName:\n    case ASPPythonClassName:\n        return QColor(0x00,0x00,0xff);\n\n    case HTMLValue:\n        return QColor(0xff,0x00,0xff);\n\n    case SGMLParameter:\n        return QColor(0x00,0x66,0x00);\n\n    case SGMLDoubleQuotedString:\n    case SGMLError:\n        return QColor(0x80,0x00,0x00);\n\n    case SGMLSingleQuotedString:\n        return QColor(0x99,0x33,0x00);\n\n    case SGMLSpecial:\n        return QColor(0x33,0x66,0xff);\n\n    case SGMLEntity:\n        return QColor(0x33,0x33,0x33);\n\n    case SGMLBlockDefault:\n        return QColor(0x00,0x00,0x66);\n\n    case JavaScriptStart:\n    case ASPJavaScriptStart:\n        return QColor(0x7f,0x7f,0x00);\n\n    case JavaScriptComment:\n    case JavaScriptCommentLine:\n    case ASPJavaScriptComment:\n    case ASPJavaScriptCommentLine:\n    case PythonComment:\n    case ASPPythonComment:\n    case PHPDoubleQuotedString:\n        return QColor(0x00,0x7f,0x00);\n\n    case JavaScriptCommentDoc:\n        return QColor(0x3f,0x70,0x3f);\n\n    case JavaScriptKeyword:\n    case ASPJavaScriptKeyword:\n    case PythonKeyword:\n    case ASPPythonKeyword:\n    case PHPVariable:\n    case PHPDoubleQuotedVariable:\n        return QColor(0x00,0x00,0x7f);\n\n    case ASPJavaScriptCommentDoc:\n        return QColor(0x7f,0x7f,0x7f);\n\n    case VBScriptComment:\n    case ASPVBScriptComment:\n        return QColor(0x00,0x80,0x00);\n\n    case PythonStart:\n    case PythonDefault:\n    case ASPPythonStart:\n    case ASPPythonDefault:\n        return QColor(0x80,0x80,0x80);\n\n    case PythonTripleSingleQuotedString:\n    case PythonTripleDoubleQuotedString:\n    case ASPPythonTripleSingleQuotedString:\n    case ASPPythonTripleDoubleQuotedString:\n        return QColor(0x7f,0x00,0x00);\n\n    case PHPDefault:\n        return QColor(0x00,0x00,0x33);\n\n    case PHPSingleQuotedString:\n        return QColor(0x00,0x9f,0x00);\n\n    case PHPNumber:\n        return QColor(0xcc,0x99,0x00);\n\n    case PHPComment:\n        return QColor(0x99,0x99,0x99);\n\n    case PHPCommentLine:\n        return QColor(0x66,0x66,0x66);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerHTML::defaultEolFill(int style) const\n{\n    switch (style)\n    {\n    case JavaScriptDefault:\n    case JavaScriptComment:\n    case JavaScriptCommentDoc:\n    case JavaScriptUnclosedString:\n    case ASPJavaScriptDefault:\n    case ASPJavaScriptComment:\n    case ASPJavaScriptCommentDoc:\n    case ASPJavaScriptUnclosedString:\n    case VBScriptDefault:\n    case VBScriptComment:\n    case VBScriptNumber:\n    case VBScriptKeyword:\n    case VBScriptString:\n    case VBScriptIdentifier:\n    case VBScriptUnclosedString:\n    case ASPVBScriptDefault:\n    case ASPVBScriptComment:\n    case ASPVBScriptNumber:\n    case ASPVBScriptKeyword:\n    case ASPVBScriptString:\n    case ASPVBScriptIdentifier:\n    case ASPVBScriptUnclosedString:\n    case PythonDefault:\n    case PythonComment:\n    case PythonNumber:\n    case PythonDoubleQuotedString:\n    case PythonSingleQuotedString:\n    case PythonKeyword:\n    case PythonTripleSingleQuotedString:\n    case PythonTripleDoubleQuotedString:\n    case PythonClassName:\n    case PythonFunctionMethodName:\n    case PythonOperator:\n    case PythonIdentifier:\n    case ASPPythonDefault:\n    case ASPPythonComment:\n    case ASPPythonNumber:\n    case ASPPythonDoubleQuotedString:\n    case ASPPythonSingleQuotedString:\n    case ASPPythonKeyword:\n    case ASPPythonTripleSingleQuotedString:\n    case ASPPythonTripleDoubleQuotedString:\n    case ASPPythonClassName:\n    case ASPPythonFunctionMethodName:\n    case ASPPythonOperator:\n    case ASPPythonIdentifier:\n    case PHPDefault:\n        return true;\n    }\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerHTML::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Default:\n    case Entity:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Times New Roman\",11);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Times New Roman\", 12);\n#else\n        f = QFont(\"Bitstream Charter\",10);\n#endif\n        break;\n\n    case HTMLComment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Verdana\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Verdana\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans\",8);\n#endif\n        break;\n\n    case SGMLCommand:\n    case PythonKeyword:\n    case PythonClassName:\n    case PythonFunctionMethodName:\n    case PythonOperator:\n    case ASPPythonKeyword:\n    case ASPPythonClassName:\n    case ASPPythonFunctionMethodName:\n    case ASPPythonOperator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case JavaScriptDefault:\n    case JavaScriptCommentDoc:\n    case JavaScriptKeyword:\n    case JavaScriptSymbol:\n    case ASPJavaScriptDefault:\n    case ASPJavaScriptCommentDoc:\n    case ASPJavaScriptKeyword:\n    case ASPJavaScriptSymbol:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        f.setBold(true);\n        break;\n\n    case JavaScriptComment:\n    case JavaScriptCommentLine:\n    case JavaScriptNumber:\n    case JavaScriptWord:\n    case JavaScriptDoubleQuotedString:\n    case JavaScriptSingleQuotedString:\n    case ASPJavaScriptComment:\n    case ASPJavaScriptCommentLine:\n    case ASPJavaScriptNumber:\n    case ASPJavaScriptWord:\n    case ASPJavaScriptDoubleQuotedString:\n    case ASPJavaScriptSingleQuotedString:\n    case VBScriptComment:\n    case ASPVBScriptComment:\n    case PythonComment:\n    case ASPPythonComment:\n    case PHPComment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case VBScriptDefault:\n    case VBScriptNumber:\n    case VBScriptString:\n    case VBScriptIdentifier:\n    case VBScriptUnclosedString:\n    case ASPVBScriptDefault:\n    case ASPVBScriptNumber:\n    case ASPVBScriptString:\n    case ASPVBScriptIdentifier:\n    case ASPVBScriptUnclosedString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Lucida Sans Unicode\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Lucida Grande\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case VBScriptKeyword:\n    case ASPVBScriptKeyword:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Lucida Sans Unicode\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Lucida Grande\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        f.setBold(true);\n        break;\n\n    case PythonDoubleQuotedString:\n    case PythonSingleQuotedString:\n    case ASPPythonDoubleQuotedString:\n    case ASPPythonSingleQuotedString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier New\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    case PHPKeyword:\n    case PHPVariable:\n    case PHPDoubleQuotedVariable:\n        f = QsciLexer::defaultFont(style);\n        f.setItalic(true);\n        break;\n\n    case PHPCommentLine:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        f.setItalic(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerHTML::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"a abbr acronym address applet area \"\n            \"b base basefont bdo big blockquote body br button \"\n            \"caption center cite code col colgroup \"\n            \"dd del dfn dir div dl dt \"\n            \"em \"\n            \"fieldset font form frame frameset \"\n            \"h1 h2 h3 h4 h5 h6 head hr html \"\n            \"i iframe img input ins isindex \"\n            \"kbd \"\n            \"label legend li link \"\n            \"map menu meta \"\n            \"noframes noscript \"\n            \"object ol optgroup option \"\n            \"p param pre \"\n            \"q \"\n            \"s samp script select small span strike strong style \"\n            \"sub sup \"\n            \"table tbody td textarea tfoot th thead title tr tt \"\n            \"u ul \"\n            \"var \"\n            \"xml xmlns \"\n            \"abbr accept-charset accept accesskey action align \"\n            \"alink alt archive axis \"\n            \"background bgcolor border \"\n            \"cellpadding cellspacing char charoff charset checked \"\n            \"cite class classid clear codebase codetype color \"\n            \"cols colspan compact content coords \"\n            \"data datafld dataformatas datapagesize datasrc \"\n            \"datetime declare defer dir disabled \"\n            \"enctype event \"\n            \"face for frame frameborder \"\n            \"headers height href hreflang hspace http-equiv \"\n            \"id ismap label lang language leftmargin link \"\n            \"longdesc \"\n            \"marginwidth marginheight maxlength media method \"\n            \"multiple \"\n            \"name nohref noresize noshade nowrap \"\n            \"object onblur onchange onclick ondblclick onfocus \"\n            \"onkeydown onkeypress onkeyup onload onmousedown \"\n            \"onmousemove onmouseover onmouseout onmouseup onreset \"\n            \"onselect onsubmit onunload \"\n            \"profile prompt \"\n            \"readonly rel rev rows rowspan rules \"\n            \"scheme scope selected shape size span src standby \"\n            \"start style summary \"\n            \"tabindex target text title topmargin type \"\n            \"usemap \"\n            \"valign value valuetype version vlink vspace \"\n            \"width \"\n            \"text password checkbox radio submit reset file \"\n            \"hidden image \"\n            \"public !doctype\";\n\n    if (set == 2)\n        return QsciLexerJavaScript::keywordClass;\n\n    if (set == 3)\n        return\n            // Move these to QsciLexerVisualBasic when we\n            // get round to implementing it.\n            \"and begin case call continue do each else elseif end \"\n            \"erase error event exit false for function get gosub \"\n            \"goto if implement in load loop lset me mid new next \"\n            \"not nothing on or property raiseevent rem resume \"\n            \"return rset select set stop sub then to true unload \"\n            \"until wend while with withevents attribute alias as \"\n            \"boolean byref byte byval const compare currency date \"\n            \"declare dim double enum explicit friend global \"\n            \"integer let lib long module object option optional \"\n            \"preserve private property public redim single static \"\n            \"string type variant\";\n\n    if (set == 4)\n        return QsciLexerPython::keywordClass;\n\n    if (set == 5)\n        return\n            \"and argv as argc break case cfunction class continue \"\n            \"declare default do die \"\n            \"echo else elseif empty enddeclare endfor endforeach \"\n            \"endif endswitch endwhile e_all e_parse e_error \"\n            \"e_warning eval exit extends \"\n            \"false for foreach function global \"\n            \"http_cookie_vars http_get_vars http_post_vars \"\n            \"http_post_files http_env_vars http_server_vars \"\n            \"if include include_once list new not null \"\n            \"old_function or \"\n            \"parent php_os php_self php_version print \"\n            \"require require_once return \"\n            \"static switch stdclass this true var xor virtual \"\n            \"while \"\n            \"__file__ __line__ __sleep __wakeup\";\n\n    if (set == 6)\n        return \"ELEMENT DOCTYPE ATTLIST ENTITY NOTATION\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerHTML::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"HTML default\");\n\n    case Tag:\n        return tr(\"Tag\");\n\n    case UnknownTag:\n        return tr(\"Unknown tag\");\n\n    case Attribute:\n        return tr(\"Attribute\");\n\n    case UnknownAttribute:\n        return tr(\"Unknown attribute\");\n\n    case HTMLNumber:\n        return tr(\"HTML number\");\n\n    case HTMLDoubleQuotedString:\n        return tr(\"HTML double-quoted string\");\n\n    case HTMLSingleQuotedString:\n        return tr(\"HTML single-quoted string\");\n\n    case OtherInTag:\n        return tr(\"Other text in a tag\");\n\n    case HTMLComment:\n        return tr(\"HTML comment\");\n\n    case Entity:\n        return tr(\"Entity\");\n\n    case XMLTagEnd:\n        return tr(\"End of a tag\");\n\n    case XMLStart:\n        return tr(\"Start of an XML fragment\");\n\n    case XMLEnd:\n        return tr(\"End of an XML fragment\");\n\n    case Script:\n        return tr(\"Script tag\");\n\n    case ASPAtStart:\n        return tr(\"Start of an ASP fragment with @\");\n\n    case ASPStart:\n        return tr(\"Start of an ASP fragment\");\n\n    case CDATA:\n        return tr(\"CDATA\");\n\n    case PHPStart:\n        return tr(\"Start of a PHP fragment\");\n\n    case HTMLValue:\n        return tr(\"Unquoted HTML value\");\n\n    case ASPXCComment:\n        return tr(\"ASP X-Code comment\");\n\n    case SGMLDefault:\n        return tr(\"SGML default\");\n\n    case SGMLCommand:\n        return tr(\"SGML command\");\n\n    case SGMLParameter:\n        return tr(\"First parameter of an SGML command\");\n\n    case SGMLDoubleQuotedString:\n        return tr(\"SGML double-quoted string\");\n\n    case SGMLSingleQuotedString:\n        return tr(\"SGML single-quoted string\");\n\n    case SGMLError:\n        return tr(\"SGML error\");\n\n    case SGMLSpecial:\n        return tr(\"SGML special entity\");\n\n    case SGMLComment:\n        return tr(\"SGML comment\");\n\n    case SGMLParameterComment:\n        return tr(\"First parameter comment of an SGML command\");\n\n    case SGMLBlockDefault:\n        return tr(\"SGML block default\");\n\n    case JavaScriptStart:\n        return tr(\"Start of a JavaScript fragment\");\n\n    case JavaScriptDefault:\n        return tr(\"JavaScript default\");\n\n    case JavaScriptComment:\n        return tr(\"JavaScript comment\");\n\n    case JavaScriptCommentLine:\n        return tr(\"JavaScript line comment\");\n\n    case JavaScriptCommentDoc:\n        return tr(\"JavaDoc style JavaScript comment\");\n\n    case JavaScriptNumber:\n        return tr(\"JavaScript number\");\n\n    case JavaScriptWord:\n        return tr(\"JavaScript word\");\n\n    case JavaScriptKeyword:\n        return tr(\"JavaScript keyword\");\n\n    case JavaScriptDoubleQuotedString:\n        return tr(\"JavaScript double-quoted string\");\n\n    case JavaScriptSingleQuotedString:\n        return tr(\"JavaScript single-quoted string\");\n\n    case JavaScriptSymbol:\n        return tr(\"JavaScript symbol\");\n\n    case JavaScriptUnclosedString:\n        return tr(\"JavaScript unclosed string\");\n\n    case JavaScriptRegex:\n        return tr(\"JavaScript regular expression\");\n\n    case ASPJavaScriptStart:\n        return tr(\"Start of an ASP JavaScript fragment\");\n\n    case ASPJavaScriptDefault:\n        return tr(\"ASP JavaScript default\");\n\n    case ASPJavaScriptComment:\n        return tr(\"ASP JavaScript comment\");\n\n    case ASPJavaScriptCommentLine:\n        return tr(\"ASP JavaScript line comment\");\n\n    case ASPJavaScriptCommentDoc:\n        return tr(\"JavaDoc style ASP JavaScript comment\");\n\n    case ASPJavaScriptNumber:\n        return tr(\"ASP JavaScript number\");\n\n    case ASPJavaScriptWord:\n        return tr(\"ASP JavaScript word\");\n\n    case ASPJavaScriptKeyword:\n        return tr(\"ASP JavaScript keyword\");\n\n    case ASPJavaScriptDoubleQuotedString:\n        return tr(\"ASP JavaScript double-quoted string\");\n\n    case ASPJavaScriptSingleQuotedString:\n        return tr(\"ASP JavaScript single-quoted string\");\n\n    case ASPJavaScriptSymbol:\n        return tr(\"ASP JavaScript symbol\");\n\n    case ASPJavaScriptUnclosedString:\n        return tr(\"ASP JavaScript unclosed string\");\n\n    case ASPJavaScriptRegex:\n        return tr(\"ASP JavaScript regular expression\");\n\n    case VBScriptStart:\n        return tr(\"Start of a VBScript fragment\");\n\n    case VBScriptDefault:\n        return tr(\"VBScript default\");\n\n    case VBScriptComment:\n        return tr(\"VBScript comment\");\n\n    case VBScriptNumber:\n        return tr(\"VBScript number\");\n\n    case VBScriptKeyword:\n        return tr(\"VBScript keyword\");\n\n    case VBScriptString:\n        return tr(\"VBScript string\");\n\n    case VBScriptIdentifier:\n        return tr(\"VBScript identifier\");\n\n    case VBScriptUnclosedString:\n        return tr(\"VBScript unclosed string\");\n\n    case ASPVBScriptStart:\n        return tr(\"Start of an ASP VBScript fragment\");\n\n    case ASPVBScriptDefault:\n        return tr(\"ASP VBScript default\");\n\n    case ASPVBScriptComment:\n        return tr(\"ASP VBScript comment\");\n\n    case ASPVBScriptNumber:\n        return tr(\"ASP VBScript number\");\n\n    case ASPVBScriptKeyword:\n        return tr(\"ASP VBScript keyword\");\n\n    case ASPVBScriptString:\n        return tr(\"ASP VBScript string\");\n\n    case ASPVBScriptIdentifier:\n        return tr(\"ASP VBScript identifier\");\n\n    case ASPVBScriptUnclosedString:\n        return tr(\"ASP VBScript unclosed string\");\n\n    case PythonStart:\n        return tr(\"Start of a Python fragment\");\n\n    case PythonDefault:\n        return tr(\"Python default\");\n\n    case PythonComment:\n        return tr(\"Python comment\");\n\n    case PythonNumber:\n        return tr(\"Python number\");\n\n    case PythonDoubleQuotedString:\n        return tr(\"Python double-quoted string\");\n\n    case PythonSingleQuotedString:\n        return tr(\"Python single-quoted string\");\n\n    case PythonKeyword:\n        return tr(\"Python keyword\");\n\n    case PythonTripleDoubleQuotedString:\n        return tr(\"Python triple double-quoted string\");\n\n    case PythonTripleSingleQuotedString:\n        return tr(\"Python triple single-quoted string\");\n\n    case PythonClassName:\n        return tr(\"Python class name\");\n\n    case PythonFunctionMethodName:\n        return tr(\"Python function or method name\");\n\n    case PythonOperator:\n        return tr(\"Python operator\");\n\n    case PythonIdentifier:\n        return tr(\"Python identifier\");\n\n    case ASPPythonStart:\n        return tr(\"Start of an ASP Python fragment\");\n\n    case ASPPythonDefault:\n        return tr(\"ASP Python default\");\n\n    case ASPPythonComment:\n        return tr(\"ASP Python comment\");\n\n    case ASPPythonNumber:\n        return tr(\"ASP Python number\");\n\n    case ASPPythonDoubleQuotedString:\n        return tr(\"ASP Python double-quoted string\");\n\n    case ASPPythonSingleQuotedString:\n        return tr(\"ASP Python single-quoted string\");\n\n    case ASPPythonKeyword:\n        return tr(\"ASP Python keyword\");\n\n    case ASPPythonTripleDoubleQuotedString:\n        return tr(\"ASP Python triple double-quoted string\");\n\n    case ASPPythonTripleSingleQuotedString:\n        return tr(\"ASP Python triple single-quoted string\");\n\n    case ASPPythonClassName:\n        return tr(\"ASP Python class name\");\n\n    case ASPPythonFunctionMethodName:\n        return tr(\"ASP Python function or method name\");\n\n    case ASPPythonOperator:\n        return tr(\"ASP Python operator\");\n\n    case ASPPythonIdentifier:\n        return tr(\"ASP Python identifier\");\n\n    case PHPDefault:\n        return tr(\"PHP default\");\n\n    case PHPDoubleQuotedString:\n        return tr(\"PHP double-quoted string\");\n\n    case PHPSingleQuotedString:\n        return tr(\"PHP single-quoted string\");\n\n    case PHPKeyword:\n        return tr(\"PHP keyword\");\n\n    case PHPNumber:\n        return tr(\"PHP number\");\n\n    case PHPVariable:\n        return tr(\"PHP variable\");\n\n    case PHPComment:\n        return tr(\"PHP comment\");\n\n    case PHPCommentLine:\n        return tr(\"PHP line comment\");\n\n    case PHPDoubleQuotedVariable:\n        return tr(\"PHP double-quoted variable\");\n\n    case PHPOperator:\n        return tr(\"PHP operator\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerHTML::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case ASPAtStart:\n        return QColor(0xff,0xff,0x00);\n\n    case ASPStart:\n    case CDATA:\n        return QColor(0xff,0xdf,0x00);\n\n    case PHPStart:\n        return QColor(0xff,0xef,0xbf);\n\n    case HTMLValue:\n        return QColor(0xff,0xef,0xff);\n\n    case SGMLDefault:\n    case SGMLCommand:\n    case SGMLParameter:\n    case SGMLDoubleQuotedString:\n    case SGMLSingleQuotedString:\n    case SGMLSpecial:\n    case SGMLEntity:\n    case SGMLComment:\n        return QColor(0xef,0xef,0xff);\n\n    case SGMLError:\n        return QColor(0xff,0x66,0x66);\n\n    case SGMLBlockDefault:\n        return QColor(0xcc,0xcc,0xe0);\n\n    case JavaScriptDefault:\n    case JavaScriptComment:\n    case JavaScriptCommentLine:\n    case JavaScriptCommentDoc:\n    case JavaScriptNumber:\n    case JavaScriptWord:\n    case JavaScriptKeyword:\n    case JavaScriptDoubleQuotedString:\n    case JavaScriptSingleQuotedString:\n    case JavaScriptSymbol:\n        return QColor(0xf0,0xf0,0xff);\n\n    case JavaScriptUnclosedString:\n    case ASPJavaScriptUnclosedString:\n        return QColor(0xbf,0xbb,0xb0);\n\n    case JavaScriptRegex:\n    case ASPJavaScriptRegex:\n        return QColor(0xff,0xbb,0xb0);\n\n    case ASPJavaScriptDefault:\n    case ASPJavaScriptComment:\n    case ASPJavaScriptCommentLine:\n    case ASPJavaScriptCommentDoc:\n    case ASPJavaScriptNumber:\n    case ASPJavaScriptWord:\n    case ASPJavaScriptKeyword:\n    case ASPJavaScriptDoubleQuotedString:\n    case ASPJavaScriptSingleQuotedString:\n    case ASPJavaScriptSymbol:\n        return QColor(0xdf,0xdf,0x7f);\n\n    case VBScriptDefault:\n    case VBScriptComment:\n    case VBScriptNumber:\n    case VBScriptKeyword:\n    case VBScriptString:\n    case VBScriptIdentifier:\n        return QColor(0xef,0xef,0xff);\n\n    case VBScriptUnclosedString:\n    case ASPVBScriptUnclosedString:\n        return QColor(0x7f,0x7f,0xff);\n\n    case ASPVBScriptDefault:\n    case ASPVBScriptComment:\n    case ASPVBScriptNumber:\n    case ASPVBScriptKeyword:\n    case ASPVBScriptString:\n    case ASPVBScriptIdentifier:\n        return QColor(0xcf,0xcf,0xef);\n\n    case PythonDefault:\n    case PythonComment:\n    case PythonNumber:\n    case PythonDoubleQuotedString:\n    case PythonSingleQuotedString:\n    case PythonKeyword:\n    case PythonTripleSingleQuotedString:\n    case PythonTripleDoubleQuotedString:\n    case PythonClassName:\n    case PythonFunctionMethodName:\n    case PythonOperator:\n    case PythonIdentifier:\n        return QColor(0xef,0xff,0xef);\n\n    case ASPPythonDefault:\n    case ASPPythonComment:\n    case ASPPythonNumber:\n    case ASPPythonDoubleQuotedString:\n    case ASPPythonSingleQuotedString:\n    case ASPPythonKeyword:\n    case ASPPythonTripleSingleQuotedString:\n    case ASPPythonTripleDoubleQuotedString:\n    case ASPPythonClassName:\n    case ASPPythonFunctionMethodName:\n    case ASPPythonOperator:\n    case ASPPythonIdentifier:\n        return QColor(0xcf,0xef,0xcf);\n\n    case PHPDefault:\n    case PHPDoubleQuotedString:\n    case PHPSingleQuotedString:\n    case PHPKeyword:\n    case PHPNumber:\n    case PHPVariable:\n    case PHPComment:\n    case PHPCommentLine:\n    case PHPDoubleQuotedVariable:\n    case PHPOperator:\n        return QColor(0xff,0xf8,0xf8);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerHTML::refreshProperties()\n{\n    setCompactProp();\n    setPreprocProp();\n    setCaseSensTagsProp();\n    setScriptCommentsProp();\n    setScriptHeredocsProp();\n    setDjangoProp();\n    setMakoProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerHTML::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n    fold_preproc = qs.value(prefix + \"foldpreprocessor\", false).toBool();\n    case_sens_tags = qs.value(prefix + \"casesensitivetags\", false).toBool();\n    fold_script_comments = qs.value(prefix + \"foldscriptcomments\", false).toBool();\n    fold_script_heredocs = qs.value(prefix + \"foldscriptheredocs\", false).toBool();\n    django_templates = qs.value(prefix + \"djangotemplates\", false).toBool();\n    mako_templates = qs.value(prefix + \"makotemplates\", false).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerHTML::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n    qs.setValue(prefix + \"foldpreprocessor\", fold_preproc);\n    qs.setValue(prefix + \"casesensitivetags\", case_sens_tags);\n    qs.setValue(prefix + \"foldscriptcomments\", fold_script_comments);\n    qs.setValue(prefix + \"foldscriptheredocs\", fold_script_heredocs);\n    qs.setValue(prefix + \"djangotemplates\", django_templates);\n    qs.setValue(prefix + \"makotemplates\", mako_templates);\n\n    return rc;\n}\n\n\n// Set if tags are case sensitive.\nvoid QsciLexerHTML::setCaseSensitiveTags(bool sens)\n{\n    case_sens_tags = sens;\n\n    setCaseSensTagsProp();\n}\n\n\n// Set the \"html.tags.case.sensitive\" property.\nvoid QsciLexerHTML::setCaseSensTagsProp()\n{\n    emit propertyChanged(\"html.tags.case.sensitive\",(case_sens_tags ? \"1\" : \"0\"));\n}\n\n\n// Set if folds are compact\nvoid QsciLexerHTML::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerHTML::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Set if preprocessor blocks can be folded.\nvoid QsciLexerHTML::setFoldPreprocessor(bool fold)\n{\n    fold_preproc = fold;\n\n    setPreprocProp();\n}\n\n\n// Set the \"fold.html.preprocessor\" property.\nvoid QsciLexerHTML::setPreprocProp()\n{\n    emit propertyChanged(\"fold.html.preprocessor\",(fold_preproc ? \"1\" : \"0\"));\n}\n\n\n// Set if script comments can be folded.\nvoid QsciLexerHTML::setFoldScriptComments(bool fold)\n{\n    fold_script_comments = fold;\n\n    setScriptCommentsProp();\n}\n\n\n// Set the \"fold.hypertext.comment\" property.\nvoid QsciLexerHTML::setScriptCommentsProp()\n{\n    emit propertyChanged(\"fold.hypertext.comment\",(fold_script_comments ? \"1\" : \"0\"));\n}\n\n\n// Set if script heredocs can be folded.\nvoid QsciLexerHTML::setFoldScriptHeredocs(bool fold)\n{\n    fold_script_heredocs = fold;\n\n    setScriptHeredocsProp();\n}\n\n\n// Set the \"fold.hypertext.heredoc\" property.\nvoid QsciLexerHTML::setScriptHeredocsProp()\n{\n    emit propertyChanged(\"fold.hypertext.heredoc\",(fold_script_heredocs ? \"1\" : \"0\"));\n}\n\n\n// Set if Django templates are supported.\nvoid QsciLexerHTML::setDjangoTemplates(bool enable)\n{\n    django_templates = enable;\n\n    setDjangoProp();\n}\n\n\n// Set the \"lexer.html.django\" property.\nvoid QsciLexerHTML::setDjangoProp()\n{\n    emit propertyChanged(\"lexer.html.django\", (django_templates ? \"1\" : \"0\"));\n}\n\n\n// Set if Mako templates are supported.\nvoid QsciLexerHTML::setMakoTemplates(bool enable)\n{\n    mako_templates = enable;\n\n    setMakoProp();\n}\n\n\n// Set the \"lexer.html.mako\" property.\nvoid QsciLexerHTML::setMakoProp()\n{\n    emit propertyChanged(\"lexer.html.mako\", (mako_templates ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexeridl.cpp",
    "content": "// This module implements the QsciLexerIDL class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexeridl.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n\n\n// The ctor.\nQsciLexerIDL::QsciLexerIDL(QObject *parent)\n    : QsciLexerCPP(parent)\n{\n}\n\n\n// The dtor.\nQsciLexerIDL::~QsciLexerIDL()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerIDL::language() const\n{\n    return \"IDL\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerIDL::defaultColor(int style) const\n{\n    if (style == UUID)\n        return QColor(0x80,0x40,0x80);\n\n    return QsciLexerCPP::defaultColor(style);\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerIDL::keywords(int set) const\n{\n    if (set != 1)\n        return 0;\n\n    return \"aggregatable allocate appobject arrays async async_uuid \"\n           \"auto_handle bindable boolean broadcast byte byte_count \"\n           \"call_as callback char coclass code comm_status const \"\n           \"context_handle context_handle_noserialize \"\n           \"context_handle_serialize control cpp_quote custom decode \"\n           \"default defaultbind defaultcollelem defaultvalue \"\n           \"defaultvtable dispinterface displaybind dllname double dual \"\n           \"enable_allocate encode endpoint entry enum error_status_t \"\n           \"explicit_handle fault_status first_is float handle_t heap \"\n           \"helpcontext helpfile helpstring helpstringcontext \"\n           \"helpstringdll hidden hyper id idempotent ignore iid_as iid_is \"\n           \"immediatebind implicit_handle import importlib in include \"\n           \"in_line int __int64 __int3264 interface last_is lcid \"\n           \"length_is library licensed local long max_is maybe message \"\n           \"methods midl_pragma midl_user_allocate midl_user_free min_is \"\n           \"module ms_union ncacn_at_dsp ncacn_dnet_nsp ncacn_http \"\n           \"ncacn_ip_tcp ncacn_nb_ipx ncacn_nb_nb ncacn_nb_tcp ncacn_np \"\n           \"ncacn_spx ncacn_vns_spp ncadg_ip_udp ncadg_ipx ncadg_mq \"\n           \"ncalrpc nocode nonbrowsable noncreatable nonextensible notify \"\n           \"object odl oleautomation optimize optional out out_of_line \"\n           \"pipe pointer_default pragma properties propget propput \"\n           \"propputref ptr public range readonly ref represent_as \"\n           \"requestedit restricted retval shape short signed size_is \"\n           \"small source strict_context_handle string struct switch \"\n           \"switch_is switch_type transmit_as typedef uidefault union \"\n           \"unique unsigned user_marshal usesgetlasterror uuid v1_enum \"\n           \"vararg version void wchar_t wire_marshal\";\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerIDL::description(int style) const\n{\n    if (style == UUID)\n        return tr(\"UUID\");\n\n    return QsciLexerCPP::description(style);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerjava.cpp",
    "content": "// This module implements the QsciLexerJava class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerjava.h\"\n\n\n// The ctor.\nQsciLexerJava::QsciLexerJava(QObject *parent)\n    : QsciLexerCPP(parent)\n{\n}\n\n\n// The dtor.\nQsciLexerJava::~QsciLexerJava()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerJava::language() const\n{\n    return \"Java\";\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerJava::keywords(int set) const\n{\n    if (set != 1)\n        return 0;\n\n    return \"abstract assert boolean break byte case catch char class \"\n           \"const continue default do double else extends final finally \"\n           \"float for future generic goto if implements import inner \"\n           \"instanceof int interface long native new null operator outer \"\n           \"package private protected public rest return short static \"\n           \"super switch synchronized this throw throws transient try var \"\n           \"void volatile while\";\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerjavascript.cpp",
    "content": "// This module implements the QsciLexerJavaScript class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerjavascript.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n\n\n// The list of JavaScript keywords that can be used by other friendly lexers.\nconst char *QsciLexerJavaScript::keywordClass =\n    \"abstract boolean break byte case catch char class const continue \"\n    \"debugger default delete do double else enum export extends final \"\n    \"finally float for function goto if implements import in instanceof \"\n    \"int interface long native new package private protected public \"\n    \"return short static super switch synchronized this throw throws \"\n    \"transient try typeof var void volatile while with\";\n\n\n// The ctor.\nQsciLexerJavaScript::QsciLexerJavaScript(QObject *parent)\n    : QsciLexerCPP(parent)\n{\n}\n\n\n// The dtor.\nQsciLexerJavaScript::~QsciLexerJavaScript()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerJavaScript::language() const\n{\n    return \"JavaScript\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerJavaScript::defaultColor(int style) const\n{\n    if (style == Regex)\n        return QColor(0x3f,0x7f,0x3f);\n\n    return QsciLexerCPP::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerJavaScript::defaultEolFill(int style) const\n{\n    if (style == Regex)\n        return true;\n\n    return QsciLexerCPP::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerJavaScript::defaultFont(int style) const\n{\n    if (style == Regex)\n#if defined(Q_OS_WIN)\n        return QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        return QFont(\"Courier\", 12);\n#else\n        return QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n\n    return QsciLexerCPP::defaultFont(style);\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerJavaScript::keywords(int set) const\n{\n    if (set != 1)\n        return 0;\n\n    return keywordClass;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerJavaScript::description(int style) const\n{\n    if (style == Regex)\n        return tr(\"Regular expression\");\n\n    return QsciLexerCPP::description(style);\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerJavaScript::defaultPaper(int style) const\n{\n    if (style == Regex)\n        return QColor(0xe0,0xf0,0xff);\n\n    return QsciLexer::defaultPaper(style);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerlua.cpp",
    "content": "// This module implements the QsciLexerLua class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerlua.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerLua::QsciLexerLua(QObject *parent)\n    : QsciLexer(parent),\n      fold_compact(true)\n{\n}\n\n\n// The dtor.\nQsciLexerLua::~QsciLexerLua()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerLua::language() const\n{\n    return \"Lua\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerLua::lexer() const\n{\n    return \"lua\";\n}\n\n\n// Return the set of character sequences that can separate auto-completion\n// words.\nQStringList QsciLexerLua::autoCompletionWordSeparators() const\n{\n    QStringList wl;\n\n    wl << \":\" << \".\";\n\n    return wl;\n}\n\n\n// Return the list of characters that can start a block.\nconst char *QsciLexerLua::blockStart(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerLua::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerLua::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x00,0x00,0x00);\n\n    case Comment:\n    case LineComment:\n        return QColor(0x00,0x7f,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n    case BasicFunctions:\n    case StringTableMathsFunctions:\n    case CoroutinesIOSystemFacilities:\n        return QColor(0x00,0x00,0x7f);\n\n    case String:\n    case Character:\n    case LiteralString:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Preprocessor:\n    case Label:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Operator:\n    case Identifier:\n        break;\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerLua::defaultEolFill(int style) const\n{\n    if (style == Comment || style == UnclosedString)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerLua::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case LineComment:\n    case LiteralString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerLua::keywords(int set) const\n{\n    if (set == 1)\n        // Keywords.\n        return\n            \"and break do else elseif end false for function if \"\n            \"in local nil not or repeat return then true until \"\n            \"while\";\n\n    if (set == 2)\n        // Basic functions.\n        return\n            \"_ALERT _ERRORMESSAGE _INPUT _PROMPT _OUTPUT _STDERR \"\n            \"_STDIN _STDOUT call dostring foreach foreachi getn \"\n            \"globals newtype rawget rawset require sort tinsert \"\n            \"tremove \"\n\n            \"G getfenv getmetatable ipairs loadlib next pairs \"\n            \"pcall rawegal rawget rawset require setfenv \"\n            \"setmetatable xpcall string table math coroutine io \"\n            \"os debug\";\n\n    if (set == 3)\n        // String, table and maths functions.\n        return\n            \"abs acos asin atan atan2 ceil cos deg exp floor \"\n            \"format frexp gsub ldexp log log10 max min mod rad \"\n            \"random randomseed sin sqrt strbyte strchar strfind \"\n            \"strlen strlower strrep strsub strupper tan \"\n\n            \"string.byte string.char string.dump string.find \"\n            \"string.len string.lower string.rep string.sub \"\n            \"string.upper string.format string.gfind string.gsub \"\n            \"table.concat table.foreach table.foreachi table.getn \"\n            \"table.sort table.insert table.remove table.setn \"\n            \"math.abs math.acos math.asin math.atan math.atan2 \"\n            \"math.ceil math.cos math.deg math.exp math.floor \"\n            \"math.frexp math.ldexp math.log math.log10 math.max \"\n            \"math.min math.mod math.pi math.rad math.random \"\n            \"math.randomseed math.sin math.sqrt math.tan\";\n\n    if (set == 4)\n        // Coroutine, I/O and system facilities.\n        return\n            \"openfile closefile readfrom writeto appendto remove \"\n            \"rename flush seek tmpfile tmpname read write clock \"\n            \"date difftime execute exit getenv setlocale time \"\n\n            \"coroutine.create coroutine.resume coroutine.status \"\n            \"coroutine.wrap coroutine.yield io.close io.flush \"\n            \"io.input io.lines io.open io.output io.read \"\n            \"io.tmpfile io.type io.write io.stdin io.stdout \"\n            \"io.stderr os.clock os.date os.difftime os.execute \"\n            \"os.exit os.getenv os.remove os.rename os.setlocale \"\n            \"os.time os.tmpname\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerLua::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case LineComment:\n        return tr(\"Line comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case String:\n        return tr(\"String\");\n\n    case Character:\n        return tr(\"Character\");\n\n    case LiteralString:\n        return tr(\"Literal string\");\n\n    case Preprocessor:\n        return tr(\"Preprocessor\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case BasicFunctions:\n        return tr(\"Basic functions\");\n\n    case StringTableMathsFunctions:\n        return tr(\"String, table and maths functions\");\n\n    case CoroutinesIOSystemFacilities:\n        return tr(\"Coroutines, i/o and system facilities\");\n\n    case KeywordSet5:\n        return tr(\"User defined 1\");\n\n    case KeywordSet6:\n        return tr(\"User defined 2\");\n\n    case KeywordSet7:\n        return tr(\"User defined 3\");\n\n    case KeywordSet8:\n        return tr(\"User defined 4\");\n\n    case Label:\n        return tr(\"Label\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerLua::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case Comment:\n        return QColor(0xd0,0xf0,0xf0);\n\n    case LiteralString:\n        return QColor(0xe0,0xff,0xff);\n\n    case UnclosedString:\n        return QColor(0xe0,0xc0,0xe0);\n\n    case BasicFunctions:\n        return QColor(0xd0,0xff,0xd0);\n\n    case StringTableMathsFunctions:\n        return QColor(0xd0,0xd0,0xff);\n\n    case CoroutinesIOSystemFacilities:\n        return QColor(0xff,0xd0,0xd0);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerLua::refreshProperties()\n{\n    setCompactProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerLua::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerLua::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n\n    return rc;\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerLua::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact.\nvoid QsciLexerLua::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerLua::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexermakefile.cpp",
    "content": "// This module implements the QsciLexerMakefile class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexermakefile.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n\n\n// The ctor.\nQsciLexerMakefile::QsciLexerMakefile(QObject *parent)\n    : QsciLexer(parent)\n{\n}\n\n\n// The dtor.\nQsciLexerMakefile::~QsciLexerMakefile()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerMakefile::language() const\n{\n    return \"Makefile\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerMakefile::lexer() const\n{\n    return \"makefile\";\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerMakefile::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerMakefile::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n    case Operator:\n        return QColor(0x00,0x00,0x00);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case Preprocessor:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Variable:\n        return QColor(0x00,0x00,0x80);\n\n    case Target:\n        return QColor(0xa0,0x00,0x00);\n\n    case Error:\n        return QColor(0xff,0xff,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerMakefile::defaultEolFill(int style) const\n{\n    if (style == Error)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerMakefile::defaultFont(int style) const\n{\n    QFont f;\n\n    if (style == Comment)\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n    else\n        f = QsciLexer::defaultFont(style);\n\n    return f;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerMakefile::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Preprocessor:\n        return tr(\"Preprocessor\");\n\n    case Variable:\n        return tr(\"Variable\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Target:\n        return tr(\"Target\");\n\n    case Error:\n        return tr(\"Error\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerMakefile::defaultPaper(int style) const\n{\n    if (style == Error)\n        return QColor(0xff,0x00,0x00);\n\n    return QsciLexer::defaultPaper(style);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexermatlab.cpp",
    "content": "// This module implements the QsciLexerMatlab class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexermatlab.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n\n\n// The ctor.\nQsciLexerMatlab::QsciLexerMatlab(QObject *parent)\n    : QsciLexer(parent)\n{\n}\n\n\n// The dtor.\nQsciLexerMatlab::~QsciLexerMatlab()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerMatlab::language() const\n{\n    return \"Matlab\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerMatlab::lexer() const\n{\n    return \"matlab\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerMatlab::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n    case Operator:\n        return QColor(0x00,0x00,0x00);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case Command:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case SingleQuotedString:\n    case DoubleQuotedString:\n        return QColor(0x7f,0x00,0x7f);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerMatlab::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case Operator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerMatlab::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"break case catch continue else elseif end for function \"\n            \"global if otherwise persistent return switch try while\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerMatlab::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Command:\n        return tr(\"Command\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n    }\n\n    return QString();\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexeroctave.cpp",
    "content": "// This module implements the QsciLexerOctave class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexeroctave.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n\n\n// The ctor.\nQsciLexerOctave::QsciLexerOctave(QObject *parent)\n    : QsciLexerMatlab(parent)\n{\n}\n\n\n// The dtor.\nQsciLexerOctave::~QsciLexerOctave()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerOctave::language() const\n{\n    return \"Octave\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerOctave::lexer() const\n{\n    return \"octave\";\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerOctave::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"__FILE__ __LINE__ break case catch classdef continue do else \"\n            \"elseif end end_try_catch end_unwind_protect endclassdef \"\n            \"endenumeration endevents endfor endfunction endif endmethods \"\n            \"endparfor endproperties endswitch endwhile enumeration events \"\n            \"for function get global if methods otherwise parfor persistent \"\n            \"properties return set static switch try until unwind_protect \"\n            \"unwind_protect_cleanup while\";\n\n    return 0;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerpascal.cpp",
    "content": "// This module implements the QsciLexerPascal class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerpascal.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerPascal::QsciLexerPascal(QObject *parent)\n    : QsciLexer(parent),\n      fold_comments(false), fold_compact(true), fold_preproc(false),\n      smart_highlight(true)\n{\n}\n\n\n// The dtor.\nQsciLexerPascal::~QsciLexerPascal()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerPascal::language() const\n{\n    return \"Pascal\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerPascal::lexer() const\n{\n    return \"pascal\";\n}\n\n\n// Return the set of character sequences that can separate auto-completion\n// words.\nQStringList QsciLexerPascal::autoCompletionWordSeparators() const\n{\n    QStringList wl;\n\n    wl << \".\" << \"^\";\n\n    return wl;\n}\n\n\n// Return the list of keywords that can start a block.\nconst char *QsciLexerPascal::blockStartKeyword(int *style) const\n{\n    if (style)\n        *style = Keyword;\n\n    return\n        \"case class do else for then private protected public published \"\n        \"repeat try while type\";\n}\n\n\n// Return the list of characters that can start a block.\nconst char *QsciLexerPascal::blockStart(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"begin\";\n}\n\n\n// Return the list of characters that can end a block.\nconst char *QsciLexerPascal::blockEnd(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"end\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerPascal::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerPascal::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Identifier:\n        break;\n\n    case Comment:\n    case CommentParenthesis:\n    case CommentLine:\n        return QColor(0x00,0x7f,0x00);\n\n    case PreProcessor:\n    case PreProcessorParenthesis:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Number:\n    case HexNumber:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case SingleQuotedString:\n    case Character:\n        return QColor(0x7f,0x00,0x7f);\n\n    case UnclosedString:\n    case Operator:\n        return QColor(0x00,0x00,0x00);\n\n    case Asm:\n        return QColor(0x80,0x40,0x80);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerPascal::defaultEolFill(int style) const\n{\n    if (style == UnclosedString)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerPascal::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case CommentParenthesis:\n    case CommentLine:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case Operator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case SingleQuotedString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Times New Roman\", 11);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Times New Roman\", 12);\n#else\n        f = QFont(\"Bitstream Charter\", 10);\n#endif\n        f.setItalic(true);\n        break;\n\n    case UnclosedString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\", 10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\", 9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerPascal::defaultPaper(int style) const\n{\n    if (style == UnclosedString)\n        return QColor(0xe0,0xc0,0xe0);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerPascal::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"absolute abstract and array as asm assembler automated begin \"\n            \"case cdecl class const constructor delayed deprecated destructor \"\n            \"dispid dispinterface div do downto dynamic else end except \"\n            \"experimental export exports external far file final finalization \"\n            \"finally for forward function goto helper if implementation in \"\n            \"inherited initialization inline interface is label library \"\n            \"message mod near nil not object of on operator or out overload \"\n            \"override packed pascal platform private procedure program \"\n            \"property protected public published raise record reference \"\n            \"register reintroduce repeat resourcestring safecall sealed set \"\n            \"shl shr static stdcall strict string then threadvar to try type \"\n            \"unit unsafe until uses var varargs virtual while winapi with xor\"\n            \"add default implements index name nodefault read readonly remove \"\n            \"stored write writeonly\"\n            \"package contains requires\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerPascal::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case Comment:\n        return tr(\"'{ ... }' style comment\");\n\n    case CommentParenthesis:\n        return tr(\"'(* ... *)' style comment\");\n\n    case CommentLine:\n        return tr(\"Line comment\");\n\n    case PreProcessor:\n        return tr(\"'{$ ... }' style pre-processor block\");\n\n    case PreProcessorParenthesis:\n        return tr(\"'(*$ ... *)' style pre-processor block\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case HexNumber:\n        return tr(\"Hexadecimal number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case Character:\n        return tr(\"Character\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Asm:\n        return tr(\"Inline asm\");\n    }\n\n    return QString();\n}\n\n\n// Refresh all properties.\nvoid QsciLexerPascal::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n    setPreprocProp();\n    setSmartHighlightProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerPascal::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n    fold_preproc = qs.value(prefix + \"foldpreprocessor\", true).toBool();\n    smart_highlight = qs.value(prefix + \"smarthighlight\", true).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerPascal::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldcomments\", fold_comments);\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n    qs.setValue(prefix + \"foldpreprocessor\", fold_preproc);\n    qs.setValue(prefix + \"smarthighlight\", smart_highlight);\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerPascal::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerPascal::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerPascal::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerPascal::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerPascal::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerPascal::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Return true if preprocessor blocks can be folded.\nbool QsciLexerPascal::foldPreprocessor() const\n{\n    return fold_preproc;\n}\n\n\n// Set if preprocessor blocks can be folded.\nvoid QsciLexerPascal::setFoldPreprocessor(bool fold)\n{\n    fold_preproc = fold;\n\n    setPreprocProp();\n}\n\n\n// Set the \"fold.preprocessor\" property.\nvoid QsciLexerPascal::setPreprocProp()\n{\n    emit propertyChanged(\"fold.preprocessor\",(fold_preproc ? \"1\" : \"0\"));\n}\n\n\n// Return true if smart highlighting is enabled.\nbool QsciLexerPascal::smartHighlighting() const\n{\n    return smart_highlight;\n}\n\n\n// Set if smart highlighting is enabled.\nvoid QsciLexerPascal::setSmartHighlighting(bool enabled)\n{\n    smart_highlight = enabled;\n\n    setSmartHighlightProp();\n}\n\n\n// Set the \"lexer.pascal.smart.highlighting\" property.\nvoid QsciLexerPascal::setSmartHighlightProp()\n{\n    emit propertyChanged(\"lexer.pascal.smart.highlighting\", (smart_highlight ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerperl.cpp",
    "content": "// This module implements the QsciLexerPerl class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerperl.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerPerl::QsciLexerPerl(QObject *parent)\n    : QsciLexer(parent),\n      fold_atelse(false), fold_comments(false), fold_compact(true),\n      fold_packages(true), fold_pod_blocks(true)\n{\n}\n\n\n// The dtor.\nQsciLexerPerl::~QsciLexerPerl()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerPerl::language() const\n{\n    return \"Perl\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerPerl::lexer() const\n{\n    return \"perl\";\n}\n\n\n// Return the set of character sequences that can separate auto-completion\n// words.\nQStringList QsciLexerPerl::autoCompletionWordSeparators() const\n{\n    QStringList wl;\n\n    wl << \"::\" << \"->\";\n\n    return wl;\n}\n\n\n// Return the list of characters that can start a block.\nconst char *QsciLexerPerl::blockStart(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"{\";\n}\n\n\n// Return the list of characters that can end a block.\nconst char *QsciLexerPerl::blockEnd(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \"}\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerPerl::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerPerl::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$@%&\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerPerl::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Error:\n    case Backticks:\n    case QuotedStringQX:\n        return QColor(0xff,0xff,0x00);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case POD:\n    case PODVerbatim:\n        return QColor(0x00,0x40,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case SingleQuotedHereDocument:\n    case DoubleQuotedHereDocument:\n    case BacktickHereDocument:\n    case QuotedStringQ:\n    case QuotedStringQQ:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Operator:\n    case Identifier:\n    case Scalar:\n    case Array:\n    case Hash:\n    case SymbolTable:\n    case Regex:\n    case Substitution:\n    case HereDocumentDelimiter:\n    case QuotedStringQR:\n    case QuotedStringQW:\n    case SubroutinePrototype:\n    case Translation:\n        return QColor(0x00,0x00,0x00);\n\n    case DataSection:\n        return QColor(0x60,0x00,0x00);\n\n    case FormatIdentifier:\n    case FormatBody:\n        return QColor(0xc0,0x00,0xc0);\n\n    case DoubleQuotedStringVar:\n    case RegexVar:\n    case SubstitutionVar:\n    case BackticksVar:\n    case DoubleQuotedHereDocumentVar:\n    case BacktickHereDocumentVar:\n    case QuotedStringQQVar:\n    case QuotedStringQXVar:\n    case QuotedStringQRVar:\n        return QColor(0xd0, 0x00, 0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerPerl::defaultEolFill(int style) const\n{\n    switch (style)\n    {\n    case POD:\n    case DataSection:\n    case SingleQuotedHereDocument:\n    case DoubleQuotedHereDocument:\n    case BacktickHereDocument:\n    case PODVerbatim:\n    case FormatBody:\n    case DoubleQuotedHereDocumentVar:\n    case BacktickHereDocumentVar:\n        return true;\n    }\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerPerl::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case POD:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Times New Roman\",11);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Times New Roman\", 12);\n#else\n        f = QFont(\"Bitstream Charter\",10);\n#endif\n        break;\n\n    case Keyword:\n    case Operator:\n    case DoubleQuotedHereDocument:\n    case FormatIdentifier:\n    case RegexVar:\n    case SubstitutionVar:\n    case BackticksVar:\n    case DoubleQuotedHereDocumentVar:\n    case BacktickHereDocumentVar:\n    case QuotedStringQXVar:\n    case QuotedStringQRVar:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case QuotedStringQQ:\n    case PODVerbatim:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    case BacktickHereDocument:\n    case SubroutinePrototype:\n        f = QsciLexer::defaultFont(style);\n        f.setItalic(true);\n        break;\n\n    case DoubleQuotedStringVar:\n    case QuotedStringQQVar:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerPerl::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"NULL __FILE__ __LINE__ __PACKAGE__ __DATA__ __END__ \"\n            \"AUTOLOAD BEGIN CORE DESTROY END EQ GE GT INIT LE LT \"\n            \"NE CHECK abs accept alarm and atan2 bind binmode \"\n            \"bless caller chdir chmod chomp chop chown chr chroot \"\n            \"close closedir cmp connect continue cos crypt \"\n            \"dbmclose dbmopen defined delete die do dump each \"\n            \"else elsif endgrent endhostent endnetent endprotoent \"\n            \"endpwent endservent eof eq eval exec exists exit exp \"\n            \"fcntl fileno flock for foreach fork format formline \"\n            \"ge getc getgrent getgrgid getgrnam gethostbyaddr \"\n            \"gethostbyname gethostent getlogin getnetbyaddr \"\n            \"getnetbyname getnetent getpeername getpgrp getppid \"\n            \"getpriority getprotobyname getprotobynumber \"\n            \"getprotoent getpwent getpwnam getpwuid getservbyname \"\n            \"getservbyport getservent getsockname getsockopt glob \"\n            \"gmtime goto grep gt hex if index int ioctl join keys \"\n            \"kill last lc lcfirst le length link listen local \"\n            \"localtime lock log lstat lt m map mkdir msgctl \"\n            \"msgget msgrcv msgsnd my ne next no not oct open \"\n            \"opendir or ord our pack package pipe pop pos print \"\n            \"printf prototype push q qq qr quotemeta qu qw qx \"\n            \"rand read readdir readline readlink readpipe recv \"\n            \"redo ref rename require reset return reverse \"\n            \"rewinddir rindex rmdir s scalar seek seekdir select \"\n            \"semctl semget semop send setgrent sethostent \"\n            \"setnetent setpgrp setpriority setprotoent setpwent \"\n            \"setservent setsockopt shift shmctl shmget shmread \"\n            \"shmwrite shutdown sin sleep socket socketpair sort \"\n            \"splice split sprintf sqrt srand stat study sub \"\n            \"substr symlink syscall sysopen sysread sysseek \"\n            \"system syswrite tell telldir tie tied time times tr \"\n            \"truncate uc ucfirst umask undef unless unlink unpack \"\n            \"unshift untie until use utime values vec wait \"\n            \"waitpid wantarray warn while write x xor y\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerPerl::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Error:\n        return tr(\"Error\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case POD:\n        return tr(\"POD\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case Scalar:\n        return tr(\"Scalar\");\n\n    case Array:\n        return tr(\"Array\");\n\n    case Hash:\n        return tr(\"Hash\");\n\n    case SymbolTable:\n        return tr(\"Symbol table\");\n\n    case Regex:\n        return tr(\"Regular expression\");\n\n    case Substitution:\n        return tr(\"Substitution\");\n\n    case Backticks:\n        return tr(\"Backticks\");\n\n    case DataSection:\n        return tr(\"Data section\");\n\n    case HereDocumentDelimiter:\n        return tr(\"Here document delimiter\");\n\n    case SingleQuotedHereDocument:\n        return tr(\"Single-quoted here document\");\n\n    case DoubleQuotedHereDocument:\n        return tr(\"Double-quoted here document\");\n\n    case BacktickHereDocument:\n        return tr(\"Backtick here document\");\n\n    case QuotedStringQ:\n        return tr(\"Quoted string (q)\");\n\n    case QuotedStringQQ:\n        return tr(\"Quoted string (qq)\");\n\n    case QuotedStringQX:\n        return tr(\"Quoted string (qx)\");\n\n    case QuotedStringQR:\n        return tr(\"Quoted string (qr)\");\n\n    case QuotedStringQW:\n        return tr(\"Quoted string (qw)\");\n\n    case PODVerbatim:\n        return tr(\"POD verbatim\");\n\n    case SubroutinePrototype:\n        return tr(\"Subroutine prototype\");\n\n    case FormatIdentifier:\n        return tr(\"Format identifier\");\n\n    case FormatBody:\n        return tr(\"Format body\");\n\n    case DoubleQuotedStringVar:\n        return tr(\"Double-quoted string (interpolated variable)\");\n\n    case Translation:\n        return tr(\"Translation\");\n\n    case RegexVar:\n        return tr(\"Regular expression (interpolated variable)\");\n\n    case SubstitutionVar:\n        return tr(\"Substitution (interpolated variable)\");\n\n    case BackticksVar:\n        return tr(\"Backticks (interpolated variable)\");\n\n    case DoubleQuotedHereDocumentVar:\n        return tr(\"Double-quoted here document (interpolated variable)\");\n\n    case BacktickHereDocumentVar:\n        return tr(\"Backtick here document (interpolated variable)\");\n\n    case QuotedStringQQVar:\n        return tr(\"Quoted string (qq, interpolated variable)\");\n\n    case QuotedStringQXVar:\n        return tr(\"Quoted string (qx, interpolated variable)\");\n\n    case QuotedStringQRVar:\n        return tr(\"Quoted string (qr, interpolated variable)\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerPerl::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case Error:\n        return QColor(0xff,0x00,0x00);\n\n    case POD:\n        return QColor(0xe0,0xff,0xe0);\n\n    case Scalar:\n        return QColor(0xff,0xe0,0xe0);\n\n    case Array:\n        return QColor(0xff,0xff,0xe0);\n\n    case Hash:\n        return QColor(0xff,0xe0,0xff);\n\n    case SymbolTable:\n        return QColor(0xe0,0xe0,0xe0);\n\n    case Regex:\n        return QColor(0xa0,0xff,0xa0);\n\n    case Substitution:\n    case Translation:\n        return QColor(0xf0,0xe0,0x80);\n\n    case Backticks:\n    case BackticksVar:\n    case QuotedStringQXVar:\n        return QColor(0xa0,0x80,0x80);\n\n    case DataSection:\n        return QColor(0xff,0xf0,0xd8);\n\n    case HereDocumentDelimiter:\n    case SingleQuotedHereDocument:\n    case DoubleQuotedHereDocument:\n    case BacktickHereDocument:\n    case DoubleQuotedHereDocumentVar:\n    case BacktickHereDocumentVar:\n        return QColor(0xdd,0xd0,0xdd);\n\n    case PODVerbatim:\n        return QColor(0xc0,0xff,0xc0);\n\n    case FormatBody:\n        return QColor(0xff,0xf0,0xff);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerPerl::refreshProperties()\n{\n    setAtElseProp();\n    setCommentProp();\n    setCompactProp();\n    setPackagesProp();\n    setPODBlocksProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerPerl::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    fold_atelse = qs.value(prefix + \"foldatelse\", false).toBool();\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n    fold_packages = qs.value(prefix + \"foldpackages\", true).toBool();\n    fold_pod_blocks = qs.value(prefix + \"foldpodblocks\", true).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerPerl::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldatelse\", fold_atelse);\n    qs.setValue(prefix + \"foldcomments\", fold_comments);\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n    qs.setValue(prefix + \"foldpackages\", fold_packages);\n    qs.setValue(prefix + \"foldpodblocks\", fold_pod_blocks);\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerPerl::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerPerl::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerPerl::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerPerl::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerPerl::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerPerl::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Return true if packages can be folded.\nbool QsciLexerPerl::foldPackages() const\n{\n    return fold_packages;\n}\n\n\n// Set if packages can be folded.\nvoid QsciLexerPerl::setFoldPackages(bool fold)\n{\n    fold_packages = fold;\n\n    setPackagesProp();\n}\n\n\n// Set the \"fold.perl.package\" property.\nvoid QsciLexerPerl::setPackagesProp()\n{\n    emit propertyChanged(\"fold.perl.package\",(fold_packages ? \"1\" : \"0\"));\n}\n\n\n// Return true if POD blocks can be folded.\nbool QsciLexerPerl::foldPODBlocks() const\n{\n    return fold_pod_blocks;\n}\n\n\n// Set if POD blocks can be folded.\nvoid QsciLexerPerl::setFoldPODBlocks(bool fold)\n{\n    fold_pod_blocks = fold;\n\n    setPODBlocksProp();\n}\n\n\n// Set the \"fold.perl.pod\" property.\nvoid QsciLexerPerl::setPODBlocksProp()\n{\n    emit propertyChanged(\"fold.perl.pod\",(fold_pod_blocks ? \"1\" : \"0\"));\n}\n\n\n// Set if else can be folded.\nvoid QsciLexerPerl::setFoldAtElse(bool fold)\n{\n    fold_atelse = fold;\n\n    setAtElseProp();\n}\n\n\n// Set the \"fold.perl.at.else\" property.\nvoid QsciLexerPerl::setAtElseProp()\n{\n    emit propertyChanged(\"fold.perl.at.else\",(fold_atelse ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerpo.cpp",
    "content": "// This module implements the QsciLexerPO class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerpo.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerPO::QsciLexerPO(QObject *parent)\n    : QsciLexer(parent),\n      fold_comments(false), fold_compact(true)\n{\n}\n\n\n// The dtor.\nQsciLexerPO::~QsciLexerPO()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerPO::language() const\n{\n    return \"PO\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerPO::lexer() const\n{\n    return \"po\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerPO::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Comment:\n        return QColor(0x00, 0x7f, 0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerPO::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\", 9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Georgia\", 13);\n#else\n        f = QFont(\"Bitstream Vera Serif\", 9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerPO::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case MessageId:\n        return tr(\"Message identifier\");\n\n    case MessageIdText:\n        return tr(\"Message identifier text\");\n\n    case MessageString:\n        return tr(\"Message string\");\n\n    case MessageStringText:\n        return tr(\"Message string text\");\n\n    case MessageContext:\n        return tr(\"Message context\");\n\n    case MessageContextText:\n        return tr(\"Message context text\");\n\n    case Fuzzy:\n        return tr(\"Fuzzy flag\");\n\n    case ProgrammerComment:\n        return tr(\"Programmer comment\");\n\n    case Reference:\n        return tr(\"Reference\");\n\n    case Flags:\n        return tr(\"Flags\");\n\n    case MessageIdTextEOL:\n        return tr(\"Message identifier text end-of-line\");\n\n    case MessageStringTextEOL:\n        return tr(\"Message string text end-of-line\");\n\n    case MessageContextTextEOL:\n        return tr(\"Message context text end-of-line\");\n    }\n\n    return QString();\n}\n\n\n// Refresh all properties.\nvoid QsciLexerPO::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerPO::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerPO::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldcomments\", fold_comments);\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerPO::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerPO::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerPO::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerPO::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerPO::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerPO::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerpostscript.cpp",
    "content": "// This module implements the QsciLexerPostScript class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerpostscript.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerPostScript::QsciLexerPostScript(QObject *parent)\n    : QsciLexer(parent),\n      ps_tokenize(false), ps_level(3), fold_compact(true), fold_atelse(false)\n{\n}\n\n\n// The dtor.\nQsciLexerPostScript::~QsciLexerPostScript()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerPostScript::language() const\n{\n    return \"PostScript\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerPostScript::lexer() const\n{\n    return \"ps\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerPostScript::braceStyle() const\n{\n    return ProcedureParenthesis;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerPostScript::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case DSCComment:\n        return QColor(0x3f,0x70,0x3f);\n\n    case DSCCommentValue:\n    case DictionaryParenthesis:\n        return QColor(0x30,0x60,0xa0);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Name:\n    case ProcedureParenthesis:\n        return QColor(0x00,0x00,0x00);\n\n    case Keyword:\n    case ArrayParenthesis:\n        return QColor(0x00,0x00,0x7f);\n\n    case Literal:\n    case ImmediateEvalLiteral:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Text:\n    case Base85String:\n        return QColor(0x7f,0x00,0x7f);\n\n    case HexString:\n        return QColor(0x3f,0x7f,0x3f);\n\n    case BadStringCharacter:\n        return QColor(0xff,0xff,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerPostScript::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case DSCComment:\n    case DSCCommentValue:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case ProcedureParenthesis:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n\n    case Text:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Times New Roman\", 11);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Times New Roman\", 12);\n#else\n        f = QFont(\"Bitstream Charter\", 10);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerPostScript::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"$error = == FontDirectory StandardEncoding UserObjects abs add \"\n            \"aload anchorsearch and arc arcn arcto array ashow astore atan \"\n            \"awidthshow begin bind bitshift bytesavailable cachestatus \"\n            \"ceiling charpath clear cleardictstack cleartomark clip clippath \"\n            \"closefile closepath concat concatmatrix copy copypage cos count \"\n            \"countdictstack countexecstack counttomark currentcmykcolor \"\n            \"currentcolorspace currentdash currentdict currentfile \"\n            \"currentflat currentfont currentgray currenthsbcolor \"\n            \"currentlinecap currentlinejoin currentlinewidth currentmatrix \"\n            \"currentmiterlimit currentpagedevice currentpoint currentrgbcolor \"\n            \"currentscreen currenttransfer cvi cvlit cvn cvr cvrs cvs cvx def \"\n            \"defaultmatrix definefont dict dictstack div dtransform dup echo \"\n            \"end eoclip eofill eq erasepage errordict exch exec execstack \"\n            \"executeonly executive exit exp false file fill findfont \"\n            \"flattenpath floor flush flushfile for forall ge get getinterval \"\n            \"grestore grestoreall gsave gt idetmatrix idiv idtransform if \"\n            \"ifelse image imagemask index initclip initgraphics initmatrix \"\n            \"inustroke invertmatrix itransform known kshow le length lineto \"\n            \"ln load log loop lt makefont mark matrix maxlength mod moveto \"\n            \"mul ne neg newpath noaccess nor not null nulldevice or pathbbox \"\n            \"pathforall pop print prompt pstack put putinterval quit rand \"\n            \"rcheck rcurveto read readhexstring readline readonly readstring \"\n            \"rectstroke repeat resetfile restore reversepath rlineto rmoveto \"\n            \"roll rotate round rrand run save scale scalefont search \"\n            \"setblackgeneration setcachedevice setcachelimit setcharwidth \"\n            \"setcolorscreen setcolortransfer setdash setflat setfont setgray \"\n            \"sethsbcolor setlinecap setlinejoin setlinewidth setmatrix \"\n            \"setmiterlimit setpagedevice setrgbcolor setscreen settransfer \"\n            \"setvmthreshold show showpage sin sqrt srand stack start status \"\n            \"statusdict stop stopped store string stringwidth stroke \"\n            \"strokepath sub systemdict token token transform translate true \"\n            \"truncate type ueofill undefineresource userdict usertime version \"\n            \"vmstatus wcheck where widthshow write writehexstring writestring \"\n            \"xcheck xor\";\n\n    if (set == 2)\n        return\n            \"GlobalFontDirectory ISOLatin1Encoding SharedFontDirectory \"\n            \"UserObject arct colorimage cshow currentblackgeneration \"\n            \"currentcacheparams currentcmykcolor currentcolor \"\n            \"currentcolorrendering currentcolorscreen currentcolorspace \"\n            \"currentcolortransfer currentdevparams currentglobal \"\n            \"currentgstate currenthalftone currentobjectformat \"\n            \"currentoverprint currentpacking currentpagedevice currentshared \"\n            \"currentstrokeadjust currentsystemparams currentundercolorremoval \"\n            \"currentuserparams defineresource defineuserobject deletefile \"\n            \"execform execuserobject filenameforall fileposition filter \"\n            \"findencoding findresource gcheck globaldict glyphshow gstate \"\n            \"ineofill infill instroke inueofill inufill inustroke \"\n            \"languagelevel makepattern packedarray printobject product \"\n            \"realtime rectclip rectfill rectstroke renamefile resourceforall \"\n            \"resourcestatus revision rootfont scheck selectfont serialnumber \"\n            \"setbbox setblackgeneration setcachedevice2 setcacheparams \"\n            \"setcmykcolor setcolor setcolorrendering setcolorscreen \"\n            \"setcolorspace setcolortranfer setdevparams setfileposition \"\n            \"setglobal setgstate sethalftone setobjectformat setoverprint \"\n            \"setpacking setpagedevice setpattern setshared setstrokeadjust \"\n            \"setsystemparams setucacheparams setundercolorremoval \"\n            \"setuserparams setvmthreshold shareddict startjob uappend ucache \"\n            \"ucachestatus ueofill ufill undef undefinefont undefineresource \"\n            \"undefineuserobject upath ustroke ustrokepath vmreclaim \"\n            \"writeobject xshow xyshow yshow\";\n\n    if (set == 3)\n        return\n            \"cliprestore clipsave composefont currentsmoothness \"\n            \"findcolorrendering setsmoothness shfill\";\n\n    if (set == 4)\n        return\n            \".begintransparencygroup .begintransparencymask .bytestring \"\n            \".charboxpath .currentaccuratecurves .currentblendmode \"\n            \".currentcurvejoin .currentdashadapt .currentdotlength \"\n            \".currentfilladjust2 .currentlimitclamp .currentopacityalpha \"\n            \".currentoverprintmode .currentrasterop .currentshapealpha \"\n            \".currentsourcetransparent .currenttextknockout \"\n            \".currenttexturetransparent .dashpath .dicttomark \"\n            \".discardtransparencygroup .discardtransparencymask \"\n            \".endtransparencygroup .endtransparencymask .execn .filename \"\n            \".filename .fileposition .forceput .forceundef .forgetsave \"\n            \".getbitsrect .getdevice .inittransparencymask .knownget \"\n            \".locksafe .makeoperator .namestring .oserrno .oserrorstring \"\n            \".peekstring .rectappend .runandhide .setaccuratecurves \"\n            \".setblendmode .setcurvejoin .setdashadapt .setdebug \"\n            \".setdefaultmatrix .setdotlength .setfilladjust2 .setlimitclamp \"\n            \".setmaxlength .setopacityalpha .setoverprintmode .setrasterop \"\n            \".setsafe .setshapealpha .setsourcetransparent .settextknockout \"\n            \".settexturetransparent .stringbreak .stringmatch .tempfile \"\n            \".type1decrypt .type1encrypt .type1execchar .unread arccos \"\n            \"arcsin copydevice copyscanlines currentdevice finddevice \"\n            \"findlibfile findprotodevice flushpage getdeviceprops getenv \"\n            \"makeimagedevice makewordimagedevice max min putdeviceprops \"\n            \"setdevice\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerPostScript::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case DSCComment:\n        return tr(\"DSC comment\");\n\n    case DSCCommentValue:\n        return tr(\"DSC comment value\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Name:\n        return tr(\"Name\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case Literal:\n        return tr(\"Literal\");\n\n    case ImmediateEvalLiteral:\n        return tr(\"Immediately evaluated literal\");\n\n    case ArrayParenthesis:\n        return tr(\"Array parenthesis\");\n\n    case DictionaryParenthesis:\n        return tr(\"Dictionary parenthesis\");\n\n    case ProcedureParenthesis:\n        return tr(\"Procedure parenthesis\");\n\n    case Text:\n        return tr(\"Text\");\n\n    case HexString:\n        return tr(\"Hexadecimal string\");\n\n    case Base85String:\n        return tr(\"Base85 string\");\n\n    case BadStringCharacter:\n        return tr(\"Bad string character\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerPostScript::defaultPaper(int style) const\n{\n    if (style == BadStringCharacter)\n        return QColor(0xff,0x00,0x00);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerPostScript::refreshProperties()\n{\n    setTokenizeProp();\n    setLevelProp();\n    setCompactProp();\n    setAtElseProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerPostScript::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    ps_tokenize = qs.value(prefix + \"pstokenize\", false).toBool();\n    ps_level = qs.value(prefix + \"pslevel\", 3).toInt();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n    fold_atelse = qs.value(prefix + \"foldatelse\", false).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerPostScript::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"pstokenize\", ps_tokenize);\n    qs.setValue(prefix + \"pslevel\", ps_level);\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n    qs.setValue(prefix + \"foldatelse\", fold_atelse);\n\n    return rc;\n}\n\n\n// Return true if tokens are marked.\nbool QsciLexerPostScript::tokenize() const\n{\n    return ps_tokenize;\n}\n\n\n// Set if tokens are marked.\nvoid QsciLexerPostScript::setTokenize(bool tokenize)\n{\n    ps_tokenize = tokenize;\n\n    setTokenizeProp();\n}\n\n\n// Set the \"ps.tokenize\" property.\nvoid QsciLexerPostScript::setTokenizeProp()\n{\n    emit propertyChanged(\"ps.tokenize\",(ps_tokenize ? \"1\" : \"0\"));\n}\n\n\n// Return the PostScript level.\nint QsciLexerPostScript::level() const\n{\n    return ps_level;\n}\n\n\n// Set the PostScript level.\nvoid QsciLexerPostScript::setLevel(int level)\n{\n    ps_level = level;\n\n    setLevelProp();\n}\n\n\n// Set the \"ps.level\" property.\nvoid QsciLexerPostScript::setLevelProp()\n{\n    emit propertyChanged(\"ps.level\", QByteArray::number(ps_level));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerPostScript::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerPostScript::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerPostScript::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Return true if else blocks can be folded.\nbool QsciLexerPostScript::foldAtElse() const\n{\n    return fold_atelse;\n}\n\n\n// Set if else blocks can be folded.\nvoid QsciLexerPostScript::setFoldAtElse(bool fold)\n{\n    fold_atelse = fold;\n\n    setAtElseProp();\n}\n\n\n// Set the \"fold.at.else\" property.\nvoid QsciLexerPostScript::setAtElseProp()\n{\n    emit propertyChanged(\"fold.at.else\",(fold_atelse ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerpov.cpp",
    "content": "// This module implements the QsciLexerPOV class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerpov.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerPOV::QsciLexerPOV(QObject *parent)\n    : QsciLexer(parent),\n      fold_comments(false), fold_compact(true), fold_directives(false) \n{\n}\n\n\n// The dtor.\nQsciLexerPOV::~QsciLexerPOV()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerPOV::language() const\n{\n    return \"POV\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerPOV::lexer() const\n{\n    return \"pov\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerPOV::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerPOV::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_#\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerPOV::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0xff,0x00,0x80);\n\n    case Comment:\n    case CommentLine:\n        return QColor(0x00,0x7f,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Operator:\n        return QColor(0x00,0x00,0x00);\n\n    case String:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Directive:\n        return QColor(0x7f,0x7f,0x00);\n\n    case BadDirective:\n        return QColor(0x80,0x40,0x20);\n\n    case ObjectsCSGAppearance:\n    case TypesModifiersItems:\n    case PredefinedIdentifiers:\n    case PredefinedFunctions:\n    case KeywordSet6:\n    case KeywordSet7:\n    case KeywordSet8:\n        return QColor(0x00,0x00,0x7f);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerPOV::defaultEolFill(int style) const\n{\n    if (style == UnclosedString)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerPOV::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case CommentLine:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case UnclosedString:\n    case PredefinedIdentifiers:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case BadDirective:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        f.setItalic(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerPOV::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"declare local include undef fopen fclose read write \"\n            \"default version case range break debug error \"\n            \"warning if ifdef ifndef switch while macro else end\";\n\n    if (set == 2)\n        return\n            \"camera light_source light_group object blob sphere \"\n            \"cylinder box cone height_field julia_fractal lathe \"\n            \"prism sphere_sweep superellipsoid sor text torus \"\n            \"bicubic_patch disc mesh mesh2 polygon triangle \"\n            \"smooth_triangle plane poly cubic quartic quadric \"\n            \"isosurface parametric union intersection difference \"\n            \"merge function array spline vertex_vectors \"\n            \"normal_vectors uv_vectors face_indices \"\n            \"normal_indices uv_indices texture texture_list \"\n            \"interior_texture texture_map material_map image_map \"\n            \"color_map colour_map pigment_map normal_map \"\n            \"slope_map bump_map density_map pigment normal \"\n            \"material interior finish reflection irid slope \"\n            \"pigment_pattern image_pattern warp media scattering \"\n            \"density background fog sky_sphere rainbow \"\n            \"global_settings radiosity photons pattern transform \"\n            \"looks_like projected_through contained_by \"\n            \"clipped_by bounded_by\";\n\n    if (set == 3)\n        return\n            \"linear_spline quadratic_spline cubic_spline \"\n            \"natural_spline bezier_spline b_spline read write \"\n            \"append inverse open perspective orthographic \"\n            \"fisheye ultra_wide_angle omnimax panoramic \"\n            \"spherical spotlight jitter circular orient \"\n            \"media_attenuation media_interaction shadowless \"\n            \"parallel refraction collect pass_through \"\n            \"global_lights hierarchy sturm smooth gif tga iff \"\n            \"pot png pgm ppm jpeg tiff sys ttf quaternion \"\n            \"hypercomplex linear_sweep conic_sweep type \"\n            \"all_intersections split_union cutaway_textures \"\n            \"no_shadow no_image no_reflection double_illuminate \"\n            \"hollow uv_mapping all use_index use_color \"\n            \"use_colour no_bump_scale conserve_energy fresnel \"\n            \"average agate boxed bozo bumps cells crackle \"\n            \"cylindrical density_file dents facets granite \"\n            \"leopard marble onion planar quilted radial ripples \"\n            \"spotted waves wood wrinkles solid use_alpha \"\n            \"interpolate magnet noise_generator toroidal \"\n            \"ramp_wave triangle_wave sine_wave scallop_wave \"\n            \"cubic_wave poly_wave once map_type method fog_type \"\n            \"hf_gray_16 charset ascii utf8 rotate scale \"\n            \"translate matrix location right up direction sky \"\n            \"angle look_at aperture blur_samples focal_point \"\n            \"confidence variance radius falloff tightness \"\n            \"point_at area_light adaptive fade_distance \"\n            \"fade_power threshold strength water_level tolerance \"\n            \"max_iteration precision slice u_steps v_steps \"\n            \"flatness inside_vector accuracy max_gradient \"\n            \"evaluate max_trace precompute target ior dispersion \"\n            \"dispersion_samples caustics color colour rgb rgbf \"\n            \"rgbt rgbft red green blue filter transmit gray hf \"\n            \"fade_color fade_colour quick_color quick_colour \"\n            \"brick checker hexagon brick_size mortar bump_size \"\n            \"ambient diffuse brilliance crand phong phong_size \"\n            \"metallic specular roughness reflection_exponent \"\n            \"exponent thickness gradient spiral1 spiral2 \"\n            \"agate_turb form metric offset df3 coords size \"\n            \"mandel exterior julia control0 control1 altitude \"\n            \"turbulence octaves omega lambda repeat flip \"\n            \"black-hole orientation dist_exp major_radius \"\n            \"frequency phase intervals samples ratio absorption \"\n            \"emission aa_threshold aa_level eccentricity \"\n            \"extinction distance turb_depth fog_offset fog_alt \"\n            \"width arc_angle falloff_angle adc_bailout \"\n            \"ambient_light assumed_gamma irid_wavelength \"\n            \"number_of_waves always_sample brigthness count \"\n            \"error_bound gray_threshold load_file \"\n            \"low_error_factor max_sample minimum_reuse \"\n            \"nearest_count pretrace_end pretrace_start \"\n            \"recursion_limit save_file spacing gather \"\n            \"max_trace_level autostop expand_thresholds\";\n\n    if (set == 4)\n        return\n            \"x y z t u v yes no true false on off clock \"\n            \"clock_delta clock_on final_clock final_frame \"\n            \"frame_number image_height image_width initial_clock \"\n            \"initial_frame pi version\";\n\n    if (set == 5)\n        return\n            \"abs acos acosh asc asin asinh atan atanh atan2 ceil \"\n            \"cos cosh defined degrees dimensions dimension_size \"\n            \"div exp file_exists floor inside int ln log max min \"\n            \"mod pow prod radians rand seed select sin sinh sqrt \"\n            \"strcmp strlen sum tan tanh val vdot vlength \"\n            \"min_extent max_extent trace vaxis_rotate vcross \"\n            \"vrotate vnormalize vturbulence chr concat str \"\n            \"strlwr strupr substr vstr sqr cube reciprocal pwr\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerPOV::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case CommentLine:\n        return tr(\"Comment line\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case String:\n        return tr(\"String\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case Directive:\n        return tr(\"Directive\");\n\n    case BadDirective:\n        return tr(\"Bad directive\");\n\n    case ObjectsCSGAppearance:\n        return tr(\"Objects, CSG and appearance\");\n\n    case TypesModifiersItems:\n        return tr(\"Types, modifiers and items\");\n\n    case PredefinedIdentifiers:\n        return tr(\"Predefined identifiers\");\n\n    case PredefinedFunctions:\n        return tr(\"Predefined functions\");\n\n    case KeywordSet6:\n        return tr(\"User defined 1\");\n\n    case KeywordSet7:\n        return tr(\"User defined 2\");\n\n    case KeywordSet8:\n        return tr(\"User defined 3\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerPOV::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case UnclosedString:\n        return QColor(0xe0,0xc0,0xe0);\n\n    case ObjectsCSGAppearance:\n        return QColor(0xff,0xd0,0xd0);\n\n    case TypesModifiersItems:\n        return QColor(0xff,0xff,0xd0);\n\n    case PredefinedFunctions:\n        return QColor(0xd0,0xd0,0xff);\n\n    case KeywordSet6:\n        return QColor(0xd0,0xff,0xd0);\n\n    case KeywordSet7:\n        return QColor(0xd0,0xd0,0xd0);\n\n    case KeywordSet8:\n        return QColor(0xe0,0xe0,0xe0);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerPOV::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n    setDirectiveProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerPOV::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n    fold_directives = qs.value(prefix + \"folddirectives\", false).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerPOV::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldcomments\", fold_comments);\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n    qs.setValue(prefix + \"folddirectives\", fold_directives);\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerPOV::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerPOV::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerPOV::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerPOV::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerPOV::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerPOV::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Return true if directives can be folded.\nbool QsciLexerPOV::foldDirectives() const\n{\n    return fold_directives;\n}\n\n\n// Set if directives can be folded.\nvoid QsciLexerPOV::setFoldDirectives(bool fold)\n{\n    fold_directives = fold;\n\n    setDirectiveProp();\n}\n\n\n// Set the \"fold.directive\" property.\nvoid QsciLexerPOV::setDirectiveProp()\n{\n    emit propertyChanged(\"fold.directive\",(fold_directives ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerproperties.cpp",
    "content": "// This module implements the QsciLexerProperties class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerproperties.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerProperties::QsciLexerProperties(QObject *parent)\n    : QsciLexer(parent),\n      fold_compact(true), initial_spaces(true)\n{\n}\n\n\n// The dtor.\nQsciLexerProperties::~QsciLexerProperties()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerProperties::language() const\n{\n    return \"Properties\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerProperties::lexer() const\n{\n    return \"props\";\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerProperties::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerProperties::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Comment:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Section:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Assignment:\n        return QColor(0xb0,0x60,0x00);\n\n    case DefaultValue:\n        return QColor(0x7f,0x7f,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerProperties::defaultEolFill(int style) const\n{\n    if (style == Section)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerProperties::defaultFont(int style) const\n{\n    QFont f;\n\n    if (style == Comment)\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n    else\n        f = QsciLexer::defaultFont(style);\n\n    return f;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerProperties::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Section:\n        return tr(\"Section\");\n\n    case Assignment:\n        return tr(\"Assignment\");\n\n    case DefaultValue:\n        return tr(\"Default value\");\n\n    case Key:\n        return tr(\"Key\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerProperties::defaultPaper(int style) const\n{\n    if (style == Section)\n        return QColor(0xe0,0xf0,0xf0);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerProperties::refreshProperties()\n{\n    setCompactProp();\n    setInitialSpacesProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerProperties::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n    initial_spaces = qs.value(prefix + \"initialspaces\", true).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerProperties::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n    qs.setValue(prefix + \"initialspaces\", initial_spaces);\n\n    return rc;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerProperties::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerProperties::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\", (fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Set if initial spaces are allowed.\nvoid QsciLexerProperties::setInitialSpaces(bool enable)\n{\n    initial_spaces = enable;\n\n    setInitialSpacesProp();\n}\n\n\n// Set the \"lexer.props.allow.initial.spaces\" property.\nvoid QsciLexerProperties::setInitialSpacesProp()\n{\n    emit propertyChanged(\"lexer.props.allow.initial.spaces\", (fold_compact ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerpython.cpp",
    "content": "// This module implements the QsciLexerPython class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerpython.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The list of Python keywords that can be used by other friendly lexers.\nconst char *QsciLexerPython::keywordClass =\n    \"and as assert break class continue def del elif else except exec \"\n    \"finally for from global if import in is lambda None not or pass \"\n    \"print raise return try while with yield\";\n\n\n// The ctor.\nQsciLexerPython::QsciLexerPython(QObject *parent)\n    : QsciLexer(parent),\n      fold_comments(false), fold_compact(true), fold_quotes(false),\n      indent_warn(NoWarning), strings_over_newline(false), v2_unicode(true),\n      v3_binary_octal(true), v3_bytes(true), highlight_subids(true)\n{\n}\n\n\n// The dtor.\nQsciLexerPython::~QsciLexerPython()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerPython::language() const\n{\n    return \"Python\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerPython::lexer() const\n{\n    return \"python\";\n}\n\n\n// Return the view used for indentation guides.\nint QsciLexerPython::indentationGuideView() const\n{\n    return QsciScintillaBase::SC_IV_LOOKFORWARD;\n}\n\n\n// Return the set of character sequences that can separate auto-completion\n// words.\nQStringList QsciLexerPython::autoCompletionWordSeparators() const\n{\n    QStringList wl;\n\n    wl << \".\";\n\n    return wl;\n}\n\n// Return the list of characters that can start a block.\nconst char *QsciLexerPython::blockStart(int *style) const\n{\n    if (style)\n        *style = Operator;\n\n    return \":\";\n}\n\n\n// Return the number of lines to look back when auto-indenting.\nint QsciLexerPython::blockLookback() const\n{\n    // This must be 0 otherwise de-indenting a Python block gets very\n    // difficult.\n    return 0;\n}\n\n\n// Return the style used for braces.\nint QsciLexerPython::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerPython::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case TripleSingleQuotedString:\n    case TripleDoubleQuotedString:\n        return QColor(0x7f,0x00,0x00);\n\n    case ClassName:\n        return QColor(0x00,0x00,0xff);\n\n    case FunctionMethodName:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Operator:\n    case Identifier:\n        break;\n\n    case CommentBlock:\n        return QColor(0x7f,0x7f,0x7f);\n\n    case UnclosedString:\n        return QColor(0x00,0x00,0x00);\n\n    case HighlightedIdentifier:\n        return QColor(0x40,0x70,0x90);\n\n    case Decorator:\n        return QColor(0x80,0x50,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerPython::defaultEolFill(int style) const\n{\n    if (style == UnclosedString)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerPython::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case UnclosedString:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    case Keyword:\n    case ClassName:\n    case FunctionMethodName:\n    case Operator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerPython::keywords(int set) const\n{\n    if (set != 1)\n        return 0;\n\n    return keywordClass;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerPython::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case TripleSingleQuotedString:\n        return tr(\"Triple single-quoted string\");\n\n    case TripleDoubleQuotedString:\n        return tr(\"Triple double-quoted string\");\n\n    case ClassName:\n        return tr(\"Class name\");\n\n    case FunctionMethodName:\n        return tr(\"Function or method name\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case CommentBlock:\n        return tr(\"Comment block\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case HighlightedIdentifier:\n        return tr(\"Highlighted identifier\");\n\n    case Decorator:\n        return tr(\"Decorator\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerPython::defaultPaper(int style) const\n{\n    if (style == UnclosedString)\n        return QColor(0xe0,0xc0,0xe0);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerPython::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n    setQuotesProp();\n    setTabWhingeProp();\n    setStringsOverNewlineProp();\n    setV2UnicodeProp();\n    setV3BinaryOctalProp();\n    setV3BytesProp();\n    setHighlightSubidsProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerPython::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true, num;\n\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n    fold_quotes = qs.value(prefix + \"foldquotes\", false).toBool();\n    indent_warn = (IndentationWarning)qs.value(prefix + \"indentwarning\", (int)NoWarning).toInt();\n    strings_over_newline = qs.value(prefix + \"stringsovernewline\", false).toBool();\n    v2_unicode = qs.value(prefix + \"v2unicode\", true).toBool();\n    v3_binary_octal = qs.value(prefix + \"v3binaryoctal\", true).toBool();\n    v3_bytes = qs.value(prefix + \"v3bytes\", true).toBool();\n    highlight_subids = qs.value(prefix + \"highlightsubids\", true).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerPython::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldcomments\", fold_comments);\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n    qs.setValue(prefix + \"foldquotes\", fold_quotes);\n    qs.setValue(prefix + \"indentwarning\", (int)indent_warn);\n    qs.setValue(prefix + \"stringsovernewline\", strings_over_newline);\n    qs.setValue(prefix + \"v2unicode\", v2_unicode);\n    qs.setValue(prefix + \"v3binaryoctal\", v3_binary_octal);\n    qs.setValue(prefix + \"v3bytes\", v3_bytes);\n    qs.setValue(prefix + \"highlightsubids\", highlight_subids);\n\n    return rc;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerPython::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment.python\" property.\nvoid QsciLexerPython::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment.python\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Set if folds are compact.\nvoid QsciLexerPython::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerPython::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Set if quotes can be folded.\nvoid QsciLexerPython::setFoldQuotes(bool fold)\n{\n    fold_quotes = fold;\n\n    setQuotesProp();\n}\n\n\n// Set the \"fold.quotes.python\" property.\nvoid QsciLexerPython::setQuotesProp()\n{\n    emit propertyChanged(\"fold.quotes.python\",(fold_quotes ? \"1\" : \"0\"));\n}\n\n\n// Set the indentation warning.\nvoid QsciLexerPython::setIndentationWarning(QsciLexerPython::IndentationWarning warn)\n{\n    indent_warn = warn;\n\n    setTabWhingeProp();\n}\n\n\n// Set the \"tab.timmy.whinge.level\" property.\nvoid QsciLexerPython::setTabWhingeProp()\n{\n    emit propertyChanged(\"tab.timmy.whinge.level\", QByteArray::number(indent_warn));\n}\n\n\n// Set if string literals can span newlines.\nvoid QsciLexerPython::setStringsOverNewlineAllowed(bool allowed)\n{\n    strings_over_newline = allowed;\n\n    setStringsOverNewlineProp();\n}\n\n\n// Set the \"lexer.python.strings.u\" property.\nvoid QsciLexerPython::setStringsOverNewlineProp()\n{\n    emit propertyChanged(\"lexer.python.strings.over.newline\", (strings_over_newline ? \"1\" : \"0\"));\n}\n\n\n// Set if v2 unicode string literals are allowed.\nvoid QsciLexerPython::setV2UnicodeAllowed(bool allowed)\n{\n    v2_unicode = allowed;\n\n    setV2UnicodeProp();\n}\n\n\n// Set the \"lexer.python.strings.u\" property.\nvoid QsciLexerPython::setV2UnicodeProp()\n{\n    emit propertyChanged(\"lexer.python.strings.u\", (v2_unicode ? \"1\" : \"0\"));\n}\n\n\n// Set if v3 binary and octal literals are allowed.\nvoid QsciLexerPython::setV3BinaryOctalAllowed(bool allowed)\n{\n    v3_binary_octal = allowed;\n\n    setV3BinaryOctalProp();\n}\n\n\n// Set the \"lexer.python.literals.binary\" property.\nvoid QsciLexerPython::setV3BinaryOctalProp()\n{\n    emit propertyChanged(\"lexer.python.literals.binary\", (v3_binary_octal ? \"1\" : \"0\"));\n}\n\n\n// Set if v3 bytes string literals are allowed.\nvoid QsciLexerPython::setV3BytesAllowed(bool allowed)\n{\n    v3_bytes = allowed;\n\n    setV3BytesProp();\n}\n\n\n// Set the \"lexer.python.strings.b\" property.\nvoid QsciLexerPython::setV3BytesProp()\n{\n    emit propertyChanged(\"lexer.python.strings.b\",(v3_bytes ? \"1\" : \"0\"));\n}\n\n\n// Set if sub-identifiers are highlighted.\nvoid QsciLexerPython::setHighlightSubidentifiers(bool enabled)\n{\n    highlight_subids = enabled;\n\n    setHighlightSubidsProp();\n}\n\n\n// Set the \"lexer.python.keywords2.no.sub.identifiers\" property.\nvoid QsciLexerPython::setHighlightSubidsProp()\n{\n    emit propertyChanged(\"lexer.python.keywords2.no.sub.identifiers\",\n            (highlight_subids ? \"0\" : \"1\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerruby.cpp",
    "content": "// This module implements the QsciLexerRuby class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerruby.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerRuby::QsciLexerRuby(QObject *parent)\n    : QsciLexer(parent),\n      fold_comments(false), fold_compact(true)\n{\n}\n\n\n// The dtor.\nQsciLexerRuby::~QsciLexerRuby()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerRuby::language() const\n{\n    return \"Ruby\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerRuby::lexer() const\n{\n    return \"ruby\";\n}\n\n\n// Return the list of words that can start a block.\nconst char *QsciLexerRuby::blockStart(int *style) const\n{\n    if (style)\n        *style = Keyword;\n\n    return \"do\";\n}\n\n\n// Return the list of words that can start end a block.\nconst char *QsciLexerRuby::blockEnd(int *style) const\n{\n    if (style)\n        *style = Keyword;\n\n    return \"end\";\n}\n\n\n// Return the list of words that can start end a block.\nconst char *QsciLexerRuby::blockStartKeyword(int *style) const\n{\n    if (style)\n        *style = Keyword;\n\n    return \"def class if do elsif else case while for\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerRuby::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerRuby::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case POD:\n        return QColor(0x00,0x40,0x00);\n\n    case Number:\n    case FunctionMethodName:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n    case DemotedKeyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case HereDocument:\n    case PercentStringq:\n    case PercentStringQ:\n        return QColor(0x7f,0x00,0x7f);\n\n    case ClassName:\n        return QColor(0x00,0x00,0xff);\n\n    case Regex:\n    case HereDocumentDelimiter:\n    case PercentStringr:\n    case PercentStringw:\n        return QColor(0x00,0x00,0x00);\n\n    case Global:\n        return QColor(0x80,0x00,0x80);\n\n    case Symbol:\n        return QColor(0xc0,0xa0,0x30);\n\n    case ModuleName:\n        return QColor(0xa0,0x00,0xa0);\n\n    case InstanceVariable:\n        return QColor(0xb0,0x00,0x80);\n\n    case ClassVariable:\n        return QColor(0x80,0x00,0xb0);\n\n    case Backticks:\n    case PercentStringx:\n        return QColor(0xff,0xff,0x00);\n\n    case DataSection:\n        return QColor(0x60,0x00,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerRuby::defaultEolFill(int style) const\n{\n    bool fill;\n\n    switch (style)\n    {\n    case POD:\n    case DataSection:\n    case HereDocument:\n        fill = true;\n        break;\n\n    default:\n        fill = QsciLexer::defaultEolFill(style);\n    }\n\n    return fill;\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerRuby::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case POD:\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case PercentStringq:\n    case PercentStringQ:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    case Keyword:\n    case ClassName:\n    case FunctionMethodName:\n    case Operator:\n    case ModuleName:\n    case DemotedKeyword:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerRuby::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"__FILE__ and def end in or self unless __LINE__ \"\n            \"begin defined? ensure module redo super until BEGIN \"\n            \"break do false next rescue then when END case else \"\n            \"for nil require retry true while alias class elsif \"\n            \"if not return undef yield\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerRuby::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Error:\n        return tr(\"Error\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case POD:\n        return tr(\"POD\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case ClassName:\n        return tr(\"Class name\");\n\n    case FunctionMethodName:\n        return tr(\"Function or method name\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case Regex:\n        return tr(\"Regular expression\");\n\n    case Global:\n        return tr(\"Global\");\n\n    case Symbol:\n        return tr(\"Symbol\");\n\n    case ModuleName:\n        return tr(\"Module name\");\n\n    case InstanceVariable:\n        return tr(\"Instance variable\");\n\n    case ClassVariable:\n        return tr(\"Class variable\");\n\n    case Backticks:\n        return tr(\"Backticks\");\n\n    case DataSection:\n        return tr(\"Data section\");\n\n    case HereDocumentDelimiter:\n        return tr(\"Here document delimiter\");\n\n    case HereDocument:\n        return tr(\"Here document\");\n\n    case PercentStringq:\n        return tr(\"%q string\");\n\n    case PercentStringQ:\n        return tr(\"%Q string\");\n\n    case PercentStringx:\n        return tr(\"%x string\");\n\n    case PercentStringr:\n        return tr(\"%r string\");\n\n    case PercentStringw:\n        return tr(\"%w string\");\n\n    case DemotedKeyword:\n        return tr(\"Demoted keyword\");\n\n    case Stdin:\n        return tr(\"stdin\");\n\n    case Stdout:\n        return tr(\"stdout\");\n\n    case Stderr:\n        return tr(\"stderr\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerRuby::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case Error:\n        return QColor(0xff,0x00,0x00);\n\n    case POD:\n        return QColor(0xc0,0xff,0xc0);\n\n    case Regex:\n    case PercentStringr:\n        return QColor(0xa0,0xff,0xa0);\n\n    case Backticks:\n    case PercentStringx:\n        return QColor(0xa0,0x80,0x80);\n\n    case DataSection:\n        return QColor(0xff,0xf0,0xd8);\n\n    case HereDocumentDelimiter:\n    case HereDocument:\n        return QColor(0xdd,0xd0,0xdd);\n\n    case PercentStringw:\n        return QColor(0xff,0xff,0xe0);\n\n    case Stdin:\n    case Stdout:\n    case Stderr:\n        return QColor(0xff,0x80,0x80);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerRuby::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerRuby::readProperties(QSettings &qs, const QString &prefix)\n{\n    int rc = true;\n\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerRuby::writeProperties(QSettings &qs, const QString &prefix) const\n{\n    int rc = true;\n\n    qs.value(prefix + \"foldcomments\", fold_comments);\n    qs.value(prefix + \"foldcompact\", fold_compact);\n\n    return rc;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerRuby::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerRuby::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\", (fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Set if folds are compact\nvoid QsciLexerRuby::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerRuby::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\", (fold_compact ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerspice.cpp",
    "content": "// This module implements the QsciLexerSpice class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerspice.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n\n\n// The ctor.\nQsciLexerSpice::QsciLexerSpice(QObject *parent)\n    : QsciLexer(parent)\n{\n}\n\n\n// The dtor.\nQsciLexerSpice::~QsciLexerSpice()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerSpice::language() const\n{\n    return \"Spice\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerSpice::lexer() const\n{\n    return \"spice\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerSpice::braceStyle() const\n{\n    return Parameter;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerSpice::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"ac alias alter alterparam append askvalues assertvalid \"\n            \"autoscale break compose copy copytodoc dc delete destroy \"\n            \"destroyvec diff display disto dowhile echo else end errorstop \"\n            \"fftinit filter foreach fourier freqtotime function \"\n            \"functionundef goto homecursors if isdisplayed label let \"\n            \"linearize listing load loadaccumulator makelabel movelabel \"\n            \"makesmithplot movecursorleft movecursorright msgbox nameplot \"\n            \"newplot nextparam noise nopoints op plot plotf plotref poly \"\n            \"print printcursors printevent printname printplot printstatus \"\n            \"printtext printtol printunits printval printvector pwl pz quit \"\n            \"removesmithplot rename repeat resume rotate runs rusage save \"\n            \"sendplot sendscript sens set setcursor setdoc setlabel \"\n            \"setlabeltype setmargins setnthtrigger setunits setvec setparam \"\n            \"setplot setquery setscaletype settracecolor settracestyle \"\n            \"setsource settrigger setvec setxlimits setylimits show showmod \"\n            \"sort status step stop switch tf timetofreq timetowave tran \"\n            \"unalias unlet unset unalterparam update version view wavefilter \"\n            \"wavetotime where while write\";\n\n    if (set == 2)\n        return\n            \"abs askvalue atan average ceil cos db differentiate \"\n            \"differentiatex exp finalvalue floor getcursorx getcursory \"\n            \"getcursory0 getcursory1 getparam im ln initialvalue integrate \"\n            \"integratex interpolate isdef isdisplayed j log length mag max \"\n            \"maxscale mean meanpts min minscale nextplot nextvector norm \"\n            \"operatingpoint ph phase phaseextend pk_pk pos pulse re rms \"\n            \"rmspts rnd sameplot sin sqrt stddev stddevpts tan tfall \"\n            \"tolerance trise unitvec vector\";\n\n    if (set == 3)\n        return \"param nodeset include options dcconv subckt ends model\";\n\n    return 0;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerSpice::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Command:\n    case Function:\n        return QColor(0x00,0x00,0x7f);\n\n    case Parameter:\n        return QColor(0x00,0x40,0xe0);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Delimiter:\n        return QColor(0x00,0x00,0x00);\n\n    case Value:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerSpice::defaultFont(int style) const\n{\n    QFont f;\n\n    if (style == Comment)\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n    else\n    {\n        f = QsciLexer::defaultFont(style);\n\n        if (style == Function || style == Delimiter)\n            f.setBold(true);\n    }\n\n    return f;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerSpice::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case Command:\n        return tr(\"Command\");\n\n    case Function:\n        return tr(\"Function\");\n\n    case Parameter:\n        return tr(\"Parameter\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Delimiter:\n        return tr(\"Delimiter\");\n\n    case Value:\n        return tr(\"Value\");\n\n    case Comment:\n        return tr(\"Comment\");\n    }\n\n    return QString();\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexersql.cpp",
    "content": "// This module implements the QsciLexerSQL class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexersql.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerSQL::QsciLexerSQL(QObject *parent)\n    : QsciLexer(parent),\n      at_else(false), fold_comments(false), fold_compact(true),\n      only_begin(false), backticks_identifier(false),\n      numbersign_comment(false), backslash_escapes(false),\n      allow_dotted_word(false)\n{\n}\n\n\n// The dtor.\nQsciLexerSQL::~QsciLexerSQL()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerSQL::language() const\n{\n    return \"SQL\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerSQL::lexer() const\n{\n    return \"sql\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerSQL::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerSQL::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Comment:\n    case CommentLine:\n    case PlusPrompt:\n    case PlusComment:\n    case CommentLineHash:\n        return QColor(0x00,0x7f,0x00);\n\n    case CommentDoc:\n        return QColor(0x7f,0x7f,0x7f);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n        return QColor(0x7f,0x00,0x7f);\n\n    case PlusKeyword:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Operator:\n    case Identifier:\n        break;\n\n    case CommentDocKeyword:\n        return QColor(0x30,0x60,0xa0);\n\n    case CommentDocKeywordError:\n        return QColor(0x80,0x40,0x20);\n\n    case KeywordSet5:\n        return QColor(0x4b,0x00,0x82);\n\n    case KeywordSet6:\n        return QColor(0xb0,0x00,0x40);\n\n    case KeywordSet7:\n        return QColor(0x8b,0x00,0x00);\n\n    case KeywordSet8:\n        return QColor(0x80,0x00,0x80);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerSQL::defaultEolFill(int style) const\n{\n    if (style == PlusPrompt)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerSQL::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case CommentLine:\n    case PlusComment:\n    case CommentLineHash:\n    case CommentDocKeyword:\n    case CommentDocKeywordError:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case Operator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case DoubleQuotedString:\n    case SingleQuotedString:\n    case PlusPrompt:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Courier New\",10);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Courier\", 12);\n#else\n        f = QFont(\"Bitstream Vera Sans Mono\",9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerSQL::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"absolute action add admin after aggregate alias all \"\n            \"allocate alter and any are array as asc assertion \"\n            \"at authorization before begin binary bit blob \"\n            \"boolean both breadth by call cascade cascaded case \"\n            \"cast catalog char character check class clob close \"\n            \"collate collation column commit completion connect \"\n            \"connection constraint constraints constructor \"\n            \"continue corresponding create cross cube current \"\n            \"current_date current_path current_role current_time \"\n            \"current_timestamp current_user cursor cycle data \"\n            \"date day deallocate dec decimal declare default \"\n            \"deferrable deferred delete depth deref desc \"\n            \"describe descriptor destroy destructor \"\n            \"deterministic dictionary diagnostics disconnect \"\n            \"distinct domain double drop dynamic each else end \"\n            \"end-exec equals escape every except exception exec \"\n            \"execute external false fetch first float for \"\n            \"foreign found from free full function general get \"\n            \"global go goto grant group grouping having host \"\n            \"hour identity if ignore immediate in indicator \"\n            \"initialize initially inner inout input insert int \"\n            \"integer intersect interval into is isolation \"\n            \"iterate join key language large last lateral \"\n            \"leading left less level like limit local localtime \"\n            \"localtimestamp locator map match minute modifies \"\n            \"modify module month names national natural nchar \"\n            \"nclob new next no none not null numeric object of \"\n            \"off old on only open operation option or order \"\n            \"ordinality out outer output pad parameter \"\n            \"parameters partial path postfix precision prefix \"\n            \"preorder prepare preserve primary prior privileges \"\n            \"procedure public read reads real recursive ref \"\n            \"references referencing relative restrict result \"\n            \"return returns revoke right role rollback rollup \"\n            \"routine row rows savepoint schema scroll scope \"\n            \"search second section select sequence session \"\n            \"session_user set sets size smallint some| space \"\n            \"specific specifictype sql sqlexception sqlstate \"\n            \"sqlwarning start state statement static structure \"\n            \"system_user table temporary terminate than then \"\n            \"time timestamp timezone_hour timezone_minute to \"\n            \"trailing transaction translation treat trigger \"\n            \"true under union unique unknown unnest update usage \"\n            \"user using value values varchar variable varying \"\n            \"view when whenever where with without work write \"\n            \"year zone\";\n\n    if (set == 3)\n        return\n            \"param author since return see deprecated todo\";\n\n    if (set == 4)\n        return\n            \"acc~ept a~ppend archive log attribute bre~ak \"\n            \"bti~tle c~hange cl~ear col~umn comp~ute conn~ect \"\n            \"copy def~ine del desc~ribe disc~onnect e~dit \"\n            \"exec~ute exit get help ho~st i~nput l~ist passw~ord \"\n            \"pau~se pri~nt pro~mpt quit recover rem~ark \"\n            \"repf~ooter reph~eader r~un sav~e set sho~w shutdown \"\n            \"spo~ol sta~rt startup store timi~ng tti~tle \"\n            \"undef~ine var~iable whenever oserror whenever \"\n            \"sqlerror\";\n\n    if (set == 5)\n        return\n            \"dbms_output.disable dbms_output.enable dbms_output.get_line \"\n            \"dbms_output.get_lines dbms_output.new_line dbms_output.put \"\n            \"dbms_output.put_line\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerSQL::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case CommentLine:\n        return tr(\"Comment line\");\n\n    case CommentDoc:\n        return tr(\"JavaDoc style comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case DoubleQuotedString:\n        return tr(\"Double-quoted string\");\n\n    case SingleQuotedString:\n        return tr(\"Single-quoted string\");\n\n    case PlusKeyword:\n        return tr(\"SQL*Plus keyword\");\n\n    case PlusPrompt:\n        return tr(\"SQL*Plus prompt\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case PlusComment:\n        return tr(\"SQL*Plus comment\");\n\n    case CommentLineHash:\n        return tr(\"# comment line\");\n\n    case CommentDocKeyword:\n        return tr(\"JavaDoc keyword\");\n\n    case CommentDocKeywordError:\n        return tr(\"JavaDoc keyword error\");\n\n    case KeywordSet5:\n        return tr(\"User defined 1\");\n\n    case KeywordSet6:\n        return tr(\"User defined 2\");\n\n    case KeywordSet7:\n        return tr(\"User defined 3\");\n\n    case KeywordSet8:\n        return tr(\"User defined 4\");\n\n    case QuotedIdentifier:\n        return tr(\"Quoted identifier\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerSQL::defaultPaper(int style) const\n{\n    if (style == PlusPrompt)\n        return QColor(0xe0,0xff,0xe0);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerSQL::refreshProperties()\n{\n    setAtElseProp();\n    setCommentProp();\n    setCompactProp();\n    setOnlyBeginProp();\n    setBackticksIdentifierProp();\n    setNumbersignCommentProp();\n    setBackslashEscapesProp();\n    setAllowDottedWordProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerSQL::readProperties(QSettings &qs, const QString &prefix)\n{\n    int rc = true;\n\n    at_else = qs.value(prefix + \"atelse\", false).toBool();\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n    only_begin = qs.value(prefix + \"onlybegin\", false).toBool();\n    backticks_identifier = qs.value(prefix + \"backticksidentifier\", false).toBool();\n    numbersign_comment = qs.value(prefix + \"numbersigncomment\", false).toBool();\n    backslash_escapes = qs.value(prefix + \"backslashescapes\", false).toBool();\n    allow_dotted_word = qs.value(prefix + \"allowdottedword\", false).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerSQL::writeProperties(QSettings &qs, const QString &prefix) const\n{\n    int rc = true;\n\n    qs.value(prefix + \"atelse\", at_else);\n    qs.value(prefix + \"foldcomments\", fold_comments);\n    qs.value(prefix + \"foldcompact\", fold_compact);\n    qs.value(prefix + \"onlybegin\", only_begin);\n    qs.value(prefix + \"backticksidentifier\", backticks_identifier);\n    qs.value(prefix + \"numbersigncomment\", numbersign_comment);\n    qs.value(prefix + \"backslashescapes\", backslash_escapes);\n    qs.value(prefix + \"allowdottedword\", allow_dotted_word);\n\n    return rc;\n}\n\n\n// Set if ELSE blocks can be folded.\nvoid QsciLexerSQL::setFoldAtElse(bool fold)\n{\n    at_else = fold;\n\n    setAtElseProp();\n}\n\n\n// Set the \"fold.sql.at.else\" property.\nvoid QsciLexerSQL::setAtElseProp()\n{\n    emit propertyChanged(\"fold.sql.at.else\", (at_else ? \"1\" : \"0\"));\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerSQL::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerSQL::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\", (fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Set if folds are compact\nvoid QsciLexerSQL::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerSQL::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\", (fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Set if BEGIN blocks only can be folded.\nvoid QsciLexerSQL::setFoldOnlyBegin(bool fold)\n{\n    only_begin = fold;\n\n    setOnlyBeginProp();\n}\n\n\n// Set the \"fold.sql.only.begin\" property.\nvoid QsciLexerSQL::setOnlyBeginProp()\n{\n    emit propertyChanged(\"fold.sql.only.begin\", (only_begin ? \"1\" : \"0\"));\n}\n\n\n// Enable quoted identifiers.\nvoid QsciLexerSQL::setQuotedIdentifiers(bool enable)\n{\n    backticks_identifier = enable;\n\n    setBackticksIdentifierProp();\n}\n\n\n// Set the \"lexer.sql.backticks.identifier\" property.\nvoid QsciLexerSQL::setBackticksIdentifierProp()\n{\n    emit propertyChanged(\"lexer.sql.backticks.identifier\", (backticks_identifier ? \"1\" : \"0\"));\n}\n\n\n// Enable '#' as a comment character.\nvoid QsciLexerSQL::setHashComments(bool enable)\n{\n    numbersign_comment = enable;\n\n    setNumbersignCommentProp();\n}\n\n\n// Set the \"lexer.sql.numbersign.comment\" property.\nvoid QsciLexerSQL::setNumbersignCommentProp()\n{\n    emit propertyChanged(\"lexer.sql.numbersign.comment\", (numbersign_comment ? \"1\" : \"0\"));\n}\n\n\n// Enable/disable backslash escapes.\nvoid QsciLexerSQL::setBackslashEscapes(bool enable)\n{\n    backslash_escapes = enable;\n\n    setBackslashEscapesProp();\n}\n\n\n// Set the \"sql.backslash.escapes\" property.\nvoid QsciLexerSQL::setBackslashEscapesProp()\n{\n    emit propertyChanged(\"sql.backslash.escapes\", (backslash_escapes ? \"1\" : \"0\"));\n}\n\n\n// Enable dotted words.\nvoid QsciLexerSQL::setDottedWords(bool enable)\n{\n    allow_dotted_word = enable;\n\n    setAllowDottedWordProp();\n}\n\n\n// Set the \"lexer.sql.allow.dotted.word\" property.\nvoid QsciLexerSQL::setAllowDottedWordProp()\n{\n    emit propertyChanged(\"lexer.sql.allow.dotted.word\", (allow_dotted_word ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexertcl.cpp",
    "content": "// This module implements the QsciLexerTCL class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexertcl.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerTCL::QsciLexerTCL(QObject *parent)\n    : QsciLexer(parent),\n      fold_comments(false)\n{\n}\n\n\n// The dtor.\nQsciLexerTCL::~QsciLexerTCL()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerTCL::language() const\n{\n    return \"TCL\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerTCL::lexer() const\n{\n    return \"tcl\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerTCL::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerTCL::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Comment:\n    case CommentLine:\n    case CommentBox:\n        return QColor(0x00,0x7f,0x00);\n\n    case Number:\n        return QColor(0x00,0x7f,0x7f);\n\n    case QuotedKeyword:\n    case QuotedString:\n    case Modifier:\n        return QColor(0x7f,0x00,0x7f);\n\n    case Operator:\n        return QColor(0x00,0x00,0x00);\n\n    case Identifier:\n    case ExpandKeyword:\n    case TCLKeyword:\n    case TkKeyword:\n    case ITCLKeyword:\n    case TkCommand:\n    case KeywordSet6:\n    case KeywordSet7:\n    case KeywordSet8:\n    case KeywordSet9:\n        return QColor(0x00,0x00,0x7f);\n\n    case Substitution:\n    case SubstitutionBrace:\n        return QColor(0x7f,0x7f,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerTCL::defaultEolFill(int style) const\n{\n    switch (style)\n    {\n    case QuotedString:\n    case CommentBox:\n        return true;\n    }\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerTCL::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case CommentLine:\n    case CommentBox:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\", 9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\", 9);\n#endif\n        break;\n\n    case QuotedKeyword:\n    case Operator:\n    case ExpandKeyword:\n    case TCLKeyword:\n    case TkKeyword:\n    case ITCLKeyword:\n    case TkCommand:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case CommentBlock:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\", 8);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 11);\n#else\n        f = QFont(\"Serif\", 9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerTCL::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"after append array auto_execok auto_import auto_load \"\n            \"auto_load_index auto_qualify beep bgerror binary break case \"\n            \"catch cd clock close concat continue dde default echo else \"\n            \"elseif encoding eof error eval exec exit expr fblocked \"\n            \"fconfigure fcopy file fileevent flush for foreach format gets \"\n            \"glob global history http if incr info interp join lappend lindex \"\n            \"linsert list llength load loadTk lrange lreplace lsearch lset \"\n            \"lsort memory msgcat namespace open package pid pkg::create \"\n            \"pkg_mkIndex Platform-specific proc puts pwd re_syntax read \"\n            \"regexp registry regsub rename resource return scan seek set \"\n            \"socket source split string subst switch tclLog tclMacPkgSearch \"\n            \"tclPkgSetup tclPkgUnknown tell time trace unknown unset update \"\n            \"uplevel upvar variable vwait while\";\n\n    if (set == 2)\n        return\n            \"bell bind bindtags bitmap button canvas checkbutton clipboard \"\n            \"colors console cursors destroy entry event focus font frame grab \"\n            \"grid image Inter-client keysyms label labelframe listbox lower \"\n            \"menu menubutton message option options pack panedwindow photo \"\n            \"place radiobutton raise scale scrollbar selection send spinbox \"\n            \"text tk tk_chooseColor tk_chooseDirectory tk_dialog tk_focusNext \"\n            \"tk_getOpenFile tk_messageBox tk_optionMenu tk_popup \"\n            \"tk_setPalette tkerror tkvars tkwait toplevel winfo wish wm\";\n\n    if (set == 3)\n        return\n            \"@scope body class code common component configbody constructor \"\n            \"define destructor hull import inherit itcl itk itk_component \"\n            \"itk_initialize itk_interior itk_option iwidgets keep method \"\n            \"private protected public\";\n\n    if (set == 4)\n        return\n            \"tk_bisque tk_chooseColor tk_dialog tk_focusFollowsMouse \"\n            \"tk_focusNext tk_focusPrev tk_getOpenFile tk_getSaveFile \"\n            \"tk_messageBox tk_optionMenu tk_popup tk_setPalette tk_textCopy \"\n            \"tk_textCut tk_textPaste tkButtonAutoInvoke tkButtonDown \"\n            \"tkButtonEnter tkButtonInvoke tkButtonLeave tkButtonUp \"\n            \"tkCancelRepeat tkCheckRadioDown tkCheckRadioEnter \"\n            \"tkCheckRadioInvoke tkColorDialog tkColorDialog_BuildDialog \"\n            \"tkColorDialog_CancelCmd tkColorDialog_Config \"\n            \"tkColorDialog_CreateSelector tkColorDialog_DrawColorScale \"\n            \"tkColorDialog_EnterColorBar tkColorDialog_HandleRGB Entry \"\n            \"tkColorDialog_HandleSelEntry tkColorDialog_InitValues \"\n            \"tkColorDialog_LeaveColorBar tkColorDialog_MoveSelector \"\n            \"tkColorDialog_OkCmd tkColorDialog_RedrawColorBars \"\n            \"tkColorDialog_RedrawFinalColor tkColorDialog_ReleaseMouse \"\n            \"tkColorDialog_ResizeColorBars tkColorDialog_RgbToX \"\n            \"tkColorDialog_SetRGBValue tkColorDialog_StartMove \"\n            \"tkColorDialog_XToRgb tkConsoleAbout tkConsoleBind tkConsoleExit \"\n            \"tkConsoleHistory tkConsoleInit tkConsoleInsert tkConsoleInvoke \"\n            \"tkConsoleOutput tkConsolePrompt tkConsoleSource tkDarken \"\n            \"tkEntryAutoScan tkEntryBackspace tkEntryButton1 \"\n            \"tkEntryClosestGap tkEntryGetSelection tkEntryInsert \"\n            \"tkEntryKeySelect tkEntryMouseSelect tkEntryNextWord tkEntryPaste \"\n            \"tkEntryPreviousWord tkEntrySeeInsert tkEntrySetCursor \"\n            \"tkEntryTranspose tkEventMotifBindings tkFDGetFileTypes \"\n            \"tkFirstMenu tkFocusGroup_BindIn tkFocusGroup_BindOut \"\n            \"tkFocusGroup_Create tkFocusGroup_Destroy tkFocusGroup_In \"\n            \"tkFocusGroup_Out tkFocusOK tkGenerateMenuSelect tkIconList \"\n            \"tkIconList_Add tkIconList_Arrange tkIconList_AutoScan \"\n            \"tkIconList_Btn1 tkIconList_Config tkIconList_Create \"\n            \"tkIconList_CtrlBtn1 tkIconList_Curselection tkIconList_DeleteAll \"\n            \"tkIconList_Double1 tkIconList_DrawSelection tkIconList_FocusIn \"\n            \"tkIconList_FocusOut tkIconList_Get tkIconList_Goto \"\n            \"tkIconList_Index tkIconList_Invoke tkIconList_KeyPress \"\n            \"tkIconList_Leave1 tkIconList_LeftRight tkIconList_Motion1 \"\n            \"tkIconList_Reset tkIconList_ReturnKey tkIconList_See \"\n            \"tkIconList_Select tkIconList_Selection tkIconList_ShiftBtn1 \"\n            \"tkIconList_UpDown tkListbox tkListboxAutoScan \"\n            \"tkListboxBeginExtend tkListboxBeginSelect tkListboxBeginToggle \"\n            \"tkListboxCancel tkListboxDataExtend tkListboxExtendUpDown \"\n            \"tkListboxKeyAccel_Goto tkListboxKeyAccel_Key \"\n            \"tkListboxKeyAccel_Reset tkListboxKeyAccel_Set \"\n            \"tkListboxKeyAccel_Unset tkListboxMotion tkListboxSelectAll \"\n            \"tkListboxUpDown tkMbButtonUp tkMbEnter tkMbLeave tkMbMotion \"\n            \"tkMbPost tkMenuButtonDown tkMenuDownArrow tkMenuDup tkMenuEscape \"\n            \"tkMenuFind tkMenuFindName tkMenuFirstEntry tkMenuInvoke \"\n            \"tkMenuLeave tkMenuLeftArrow tkMenuMotion tkMenuNextEntry \"\n            \"tkMenuNextMenu tkMenuRightArrow tkMenuUnpost tkMenuUpArrow \"\n            \"tkMessageBox tkMotifFDialog tkMotifFDialog_ActivateDList \"\n            \"tkMotifFDialog_ActivateFEnt tkMotifFDialog_ActivateFList \"\n            \"tkMotifFDialog_ActivateSEnt tkMotifFDialog_BrowseDList \"\n            \"tkMotifFDialog_BrowseFList tkMotifFDialog_BuildUI \"\n            \"tkMotifFDialog_CancelCmd tkMotifFDialog_Config \"\n            \"tkMotifFDialog_Create tkMotifFDialog_FileTypes \"\n            \"tkMotifFDialog_FilterCmd tkMotifFDialog_InterpFilter \"\n            \"tkMotifFDialog_LoadFiles tkMotifFDialog_MakeSList \"\n            \"tkMotifFDialog_OkCmd tkMotifFDialog_SetFilter \"\n            \"tkMotifFDialog_SetListMode tkMotifFDialog_Update tkPostOverPoint \"\n            \"tkRecolorTree tkRestoreOldGrab tkSaveGrabInfo tkScaleActivate \"\n            \"tkScaleButton2Down tkScaleButtonDown tkScaleControlPress \"\n            \"tkScaleDrag tkScaleEndDrag tkScaleIncrement tkScreenChanged \"\n            \"tkScrollButton2Down tkScrollButtonDown tkScrollButtonDrag \"\n            \"tkScrollButtonUp tkScrollByPages tkScrollByUnits tkScrollDrag \"\n            \"tkScrollEndDrag tkScrollSelect tkScrollStartDrag \"\n            \"tkScrollTopBottom tkScrollToPos tkTabToWindow tkTearOffMenu \"\n            \"tkTextAutoScan tkTextButton1 tkTextClosestGap tkTextInsert \"\n            \"tkTextKeyExtend tkTextKeySelect tkTextNextPara tkTextNextPos \"\n            \"tkTextNextWord tkTextPaste tkTextPrevPara tkTextPrevPos \"\n            \"tkTextPrevWord tkTextResetAnchor tkTextScrollPages \"\n            \"tkTextSelectTo tkTextSetCursor tkTextTranspose tkTextUpDownLine \"\n            \"tkTraverseToMenu tkTraverseWithinMenu\";\n\n    if (set == 5)\n        return \"expand\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerTCL::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case CommentLine:\n        return tr(\"Comment line\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case QuotedKeyword:\n        return tr(\"Quoted keyword\");\n\n    case QuotedString:\n        return tr(\"Quoted string\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case Substitution:\n        return tr(\"Substitution\");\n\n    case SubstitutionBrace:\n        return tr(\"Brace substitution\");\n\n    case Modifier:\n        return tr(\"Modifier\");\n\n    case ExpandKeyword:\n        return tr(\"Expand keyword\");\n\n    case TCLKeyword:\n        return tr(\"TCL keyword\");\n\n    case TkKeyword:\n        return tr(\"Tk keyword\");\n\n    case ITCLKeyword:\n        return tr(\"iTCL keyword\");\n\n    case TkCommand:\n        return tr(\"Tk command\");\n\n    case KeywordSet6:\n        return tr(\"User defined 1\");\n\n    case KeywordSet7:\n        return tr(\"User defined 2\");\n\n    case KeywordSet8:\n        return tr(\"User defined 3\");\n\n    case KeywordSet9:\n        return tr(\"User defined 4\");\n\n    case CommentBox:\n        return tr(\"Comment box\");\n\n    case CommentBlock:\n        return tr(\"Comment block\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerTCL::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case Comment:\n        return QColor(0xf0,0xff,0xe0);\n\n    case QuotedKeyword:\n    case QuotedString:\n    case ITCLKeyword:\n        return QColor(0xff,0xf0,0xf0);\n\n    case Substitution:\n        return QColor(0xef,0xff,0xf0);\n\n    case ExpandKeyword:\n        return QColor(0xff,0xff,0x80);\n\n    case TkKeyword:\n        return QColor(0xe0,0xff,0xf0);\n\n    case TkCommand:\n        return QColor(0xff,0xd0,0xd0);\n\n    case CommentBox:\n    case CommentBlock:\n        return QColor(0xf0,0xff,0xf0);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerTCL::refreshProperties()\n{\n    setCommentProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerTCL::readProperties(QSettings &qs, const QString &prefix)\n{\n    int rc = true;\n\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerTCL::writeProperties(QSettings &qs, const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldcomments\", fold_comments);\n\n    return rc;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerTCL::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerTCL::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\", (fold_comments ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexertex.cpp",
    "content": "// This module implements the QsciLexerTeX class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexertex.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerTeX::QsciLexerTeX(QObject *parent)\n    : QsciLexer(parent),\n      fold_comments(false), fold_compact(true), process_comments(false),\n      process_if(true)\n{\n}\n\n\n// The dtor.\nQsciLexerTeX::~QsciLexerTeX()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerTeX::language() const\n{\n    return \"TeX\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerTeX::lexer() const\n{\n    return \"tex\";\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerTeX::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\\\\@\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerTeX::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x3f,0x3f,0x3f);\n\n    case Special:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Group:\n        return QColor(0x7f,0x00,0x00);\n\n    case Symbol:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Command:\n        return QColor(0x00,0x7f,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerTeX::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"above abovedisplayshortskip abovedisplayskip \"\n            \"abovewithdelims accent adjdemerits advance \"\n            \"afterassignment aftergroup atop atopwithdelims \"\n            \"badness baselineskip batchmode begingroup \"\n            \"belowdisplayshortskip belowdisplayskip binoppenalty \"\n            \"botmark box boxmaxdepth brokenpenalty catcode char \"\n            \"chardef cleaders closein closeout clubpenalty copy \"\n            \"count countdef cr crcr csname day deadcycles def \"\n            \"defaulthyphenchar defaultskewchar delcode delimiter \"\n            \"delimiterfactor delimeters delimitershortfall \"\n            \"delimeters dimen dimendef discretionary \"\n            \"displayindent displaylimits displaystyle \"\n            \"displaywidowpenalty displaywidth divide \"\n            \"doublehyphendemerits dp dump edef else \"\n            \"emergencystretch end endcsname endgroup endinput \"\n            \"endlinechar eqno errhelp errmessage \"\n            \"errorcontextlines errorstopmode escapechar everycr \"\n            \"everydisplay everyhbox everyjob everymath everypar \"\n            \"everyvbox exhyphenpenalty expandafter fam fi \"\n            \"finalhyphendemerits firstmark floatingpenalty font \"\n            \"fontdimen fontname futurelet gdef global group \"\n            \"globaldefs halign hangafter hangindent hbadness \"\n            \"hbox hfil horizontal hfill horizontal hfilneg hfuzz \"\n            \"hoffset holdinginserts hrule hsize hskip hss \"\n            \"horizontal ht hyphenation hyphenchar hyphenpenalty \"\n            \"hyphen if ifcase ifcat ifdim ifeof iffalse ifhbox \"\n            \"ifhmode ifinner ifmmode ifnum ifodd iftrue ifvbox \"\n            \"ifvmode ifvoid ifx ignorespaces immediate indent \"\n            \"input inputlineno input insert insertpenalties \"\n            \"interlinepenalty jobname kern language lastbox \"\n            \"lastkern lastpenalty lastskip lccode leaders left \"\n            \"lefthyphenmin leftskip leqno let limits linepenalty \"\n            \"line lineskip lineskiplimit long looseness lower \"\n            \"lowercase mag mark mathaccent mathbin mathchar \"\n            \"mathchardef mathchoice mathclose mathcode mathinner \"\n            \"mathop mathopen mathord mathpunct mathrel \"\n            \"mathsurround maxdeadcycles maxdepth meaning \"\n            \"medmuskip message mkern month moveleft moveright \"\n            \"mskip multiply muskip muskipdef newlinechar noalign \"\n            \"noboundary noexpand noindent nolimits nonscript \"\n            \"scriptscript nonstopmode nulldelimiterspace \"\n            \"nullfont number omit openin openout or outer output \"\n            \"outputpenalty over overfullrule overline \"\n            \"overwithdelims pagedepth pagefilllstretch \"\n            \"pagefillstretch pagefilstretch pagegoal pageshrink \"\n            \"pagestretch pagetotal par parfillskip parindent \"\n            \"parshape parskip patterns pausing penalty \"\n            \"postdisplaypenalty predisplaypenalty predisplaysize \"\n            \"pretolerance prevdepth prevgraf radical raise read \"\n            \"relax relpenalty right righthyphenmin rightskip \"\n            \"romannumeral scriptfont scriptscriptfont \"\n            \"scriptscriptstyle scriptspace scriptstyle \"\n            \"scrollmode setbox setlanguage sfcode shipout show \"\n            \"showbox showboxbreadth showboxdepth showlists \"\n            \"showthe skewchar skip skipdef spacefactor spaceskip \"\n            \"span special splitbotmark splitfirstmark \"\n            \"splitmaxdepth splittopskip string tabskip textfont \"\n            \"textstyle the thickmuskip thinmuskip time toks \"\n            \"toksdef tolerance topmark topskip tracingcommands \"\n            \"tracinglostchars tracingmacros tracingonline \"\n            \"tracingoutput tracingpages tracingparagraphs \"\n            \"tracingrestores tracingstats uccode uchyph \"\n            \"underline unhbox unhcopy unkern unpenalty unskip \"\n            \"unvbox unvcopy uppercase vadjust valign vbadness \"\n            \"vbox vcenter vfil vfill vfilneg vfuzz voffset vrule \"\n            \"vsize vskip vsplit vss vtop wd widowpenalty write \"\n            \"xdef xleaders xspaceskip year \"\n            \"TeX bgroup egroup endgraf space empty null newcount \"\n            \"newdimen newskip newmuskip newbox newtoks newhelp \"\n            \"newread newwrite newfam newlanguage newinsert newif \"\n            \"maxdimen magstephalf magstep frenchspacing \"\n            \"nonfrenchspacing normalbaselines obeylines \"\n            \"obeyspaces raggedr ight ttraggedright thinspace \"\n            \"negthinspace enspace enskip quad qquad smallskip \"\n            \"medskip bigskip removelastskip topglue vglue hglue \"\n            \"break nobreak allowbreak filbreak goodbreak \"\n            \"smallbreak medbreak bigbreak line leftline \"\n            \"rightline centerline rlap llap underbar strutbox \"\n            \"strut cases matrix pmatrix bordermatrix eqalign \"\n            \"displaylines eqalignno leqalignno pageno folio \"\n            \"tracingall showhyphens fmtname fmtversion hphantom \"\n            \"vphantom phantom smash\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerTeX::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Special:\n        return tr(\"Special\");\n\n    case Group:\n        return tr(\"Group\");\n\n    case Symbol:\n        return tr(\"Symbol\");\n\n    case Command:\n        return tr(\"Command\");\n\n    case Text:\n        return tr(\"Text\");\n    }\n\n    return QString();\n}\n\n\n// Refresh all properties.\nvoid QsciLexerTeX::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n    setProcessCommentsProp();\n    setAutoIfProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerTeX::readProperties(QSettings &qs, const QString &prefix)\n{\n    int rc = true;\n\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n    process_comments = qs.value(prefix + \"processcomments\", false).toBool();\n    process_if = qs.value(prefix + \"processif\", true).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerTeX::writeProperties(QSettings &qs, const QString &prefix) const\n{\n    int rc = true;\n\n    qs.value(prefix + \"foldcomments\", fold_comments);\n    qs.value(prefix + \"foldcompact\", fold_compact);\n    qs.value(prefix + \"processcomments\", process_comments);\n    qs.value(prefix + \"processif\", process_if);\n\n    return rc;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerTeX::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerTeX::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\", (fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Set if folds are compact.\nvoid QsciLexerTeX::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerTeX::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\", (fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Set if comments are processed\nvoid QsciLexerTeX::setProcessComments(bool enable)\n{\n    process_comments = enable;\n\n    setProcessCommentsProp();\n}\n\n\n// Set the \"lexer.tex.comment.process\" property.\nvoid QsciLexerTeX::setProcessCommentsProp()\n{\n    emit propertyChanged(\"lexer.tex.comment.process\", (process_comments ? \"1\" : \"0\"));\n}\n\n\n// Set if \\if<unknown> is processed\nvoid QsciLexerTeX::setProcessIf(bool enable)\n{\n    process_if = enable;\n\n    setAutoIfProp();\n}\n\n\n// Set the \"lexer.tex.auto.if\" property.\nvoid QsciLexerTeX::setAutoIfProp()\n{\n    emit propertyChanged(\"lexer.tex.auto.if\", (process_if ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerverilog.cpp",
    "content": "// This module implements the QsciLexerVerilog class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerverilog.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerVerilog::QsciLexerVerilog(QObject *parent)\n    : QsciLexer(parent),\n      fold_atelse(false), fold_comments(false), fold_compact(true),\n      fold_preproc(false), fold_atmodule(false)\n{\n}\n\n\n// The dtor.\nQsciLexerVerilog::~QsciLexerVerilog()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerVerilog::language() const\n{\n    return \"Verilog\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerVerilog::lexer() const\n{\n    return \"verilog\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerVerilog::braceStyle() const\n{\n    return Operator;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerVerilog::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"always and assign automatic begin buf bufif0 bufif1 case casex \"\n            \"casez cell cmos config deassign default defparam design disable \"\n            \"edge else end endcase endconfig endfunction endgenerate \"\n            \"endmodule endprimitiveendspecify endtable endtask event for \"\n            \"force forever fork function generate genvar highz0 highz1 if \"\n            \"ifnone incdir include initial inout input instance integer join \"\n            \"large liblist library localparam macromodule medium module nand \"\n            \"negedge nmos nor noshowcancelled not notif0 notif1 or output \"\n            \"parameter pmos posedge primitive pull0 pull1 pulldown pullup \"\n            \"pulsestyle_ondetect pulsestyle_onevent rcmos real realtime reg \"\n            \"release repeat rnmos rpmos rtran rtranif0 rtranif1 scalared \"\n            \"showcancelled signed small specify specparam strong0 strong1 \"\n            \"supply0 supply1 table task time tran tranif0 tranif1 tri tri0 \"\n            \"tri1 triand trior trireg unsigned use vectored wait wand weak0 \"\n            \"weak1 while wire wor xnor xor\";\n\n    if (set == 3)\n        return\n            \"$async$and$array $async$and$plane $async$nand$array \"\n            \"$async$nand$plane $async$nor$array $async$nor$plane \"\n            \"$async$or$array $async$or$plane $bitstoreal $countdrivers \"\n            \"$display $displayb $displayh $displayo $dist_chi_square \"\n            \"$dist_erlang $dist_exponential $dist_normal $dist_poisson \"\n            \"$dist_t $dist_uniform $dumpall $dumpfile $dumpflush $dumplimit \"\n            \"$dumpoff $dumpon $dumpportsall $dumpportsflush $dumpportslimit \"\n            \"$dumpportsoff $dumpportson $dumpvars $fclose $fdisplayh \"\n            \"$fdisplay $fdisplayf $fdisplayb $ferror $fflush $fgetc $fgets \"\n            \"$finish $fmonitorb $fmonitor $fmonitorf $fmonitorh $fopen \"\n            \"$fread $fscanf $fseek $fsscanf $fstrobe $fstrobebb $fstrobef \"\n            \"$fstrobeh $ftel $fullskew $fwriteb $fwritef $fwriteh $fwrite \"\n            \"$getpattern $history $hold $incsave $input $itor $key $list \"\n            \"$log $monitorb $monitorh $monitoroff $monitoron $monitor \"\n            \"$monitoro $nochange $nokey $nolog $period $printtimescale \"\n            \"$q_add $q_exam $q_full $q_initialize $q_remove $random \"\n            \"$readmemb $readmemh $readmemh $realtime $realtobits $recovery \"\n            \"$recrem $removal $reset_count $reset $reset_value $restart \"\n            \"$rewind $rtoi $save $scale $scope $sdf_annotate $setup \"\n            \"$setuphold $sformat $showscopes $showvariables $showvars \"\n            \"$signed $skew $sreadmemb $sreadmemh $stime $stop $strobeb \"\n            \"$strobe $strobeh $strobeo $swriteb $swriteh $swriteo $swrite \"\n            \"$sync$and$array $sync$and$plane $sync$nand$array \"\n            \"$sync$nand$plane $sync$nor$array $sync$nor$plane $sync$or$array \"\n            \"$sync$or$plane $test$plusargs $time $timeformat $timeskew \"\n            \"$ungetc $unsigned $value$plusargs $width $writeb $writeh $write \"\n            \"$writeo\";\n\n    return 0;\n}\n\n\n// Return the string of characters that comprise a word.\nconst char *QsciLexerVerilog::wordCharacters() const\n{\n    return \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerVerilog::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x80,0x80);\n\n    case Comment:\n    case CommentLine:\n        return QColor(0x00,0x7f,0x00);\n\n    case CommentBang:\n        return QColor(0x3f,0x7f,0x3f);\n\n    case Number:\n    case KeywordSet2:\n        return QColor(0x00,0x7f,0x7f);\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case String:\n        return QColor(0x7f,0x00,0x7f);\n\n    case SystemTask:\n    case UserKeywordSet:\n        return QColor(0x80,0x40,0x20);\n\n    case Preprocessor:\n        return QColor(0x7f,0x7f,0x00);\n\n    case Operator:\n        return QColor(0x00,0x70,0x70);\n\n    case UnclosedString:\n        return QColor(0x00,0x00,0x00);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerVerilog::defaultEolFill(int style) const\n{\n    if (style == CommentBang || style == UnclosedString)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerVerilog::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case CommentLine:\n    case CommentBang:\n    case UserKeywordSet:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    case Keyword:\n    case Operator:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerVerilog::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case CommentLine:\n        return tr(\"Line comment\");\n\n    case CommentBang:\n        return tr(\"Bang comment\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Keyword:\n        return tr(\"Primary keywords and identifiers\");\n\n    case String:\n        return tr(\"String\");\n\n    case KeywordSet2:\n        return tr(\"Secondary keywords and identifiers\");\n\n    case SystemTask:\n        return tr(\"System task\");\n\n    case Preprocessor:\n        return tr(\"Preprocessor block\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case UserKeywordSet:\n        return tr(\"User defined tasks and identifiers\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerVerilog::defaultPaper(int style) const\n{\n    if (style == CommentBang)\n        return QColor(0xe0,0xf0,0xff);\n\n    if (style == UnclosedString)\n        return QColor(0xe0,0xc0,0xe0);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerVerilog::refreshProperties()\n{\n    setAtElseProp();\n    setCommentProp();\n    setCompactProp();\n    setPreprocProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerVerilog::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    fold_atelse = qs.value(prefix + \"foldatelse\", false).toBool();\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n    fold_preproc = qs.value(prefix + \"foldpreprocessor\", false).toBool();\n    fold_atmodule = qs.value(prefix + \"foldverilogflags\", false).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerVerilog::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldatelse\", fold_atelse);\n    qs.setValue(prefix + \"foldcomments\", fold_comments);\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n    qs.setValue(prefix + \"foldpreprocessor\", fold_preproc);\n    qs.setValue(prefix + \"foldverilogflags\", fold_atmodule);\n\n    return rc;\n}\n\n\n// Return true if else can be folded.\nbool QsciLexerVerilog::foldAtElse() const\n{\n    return fold_atelse;\n}\n\n\n// Set if else can be folded.\nvoid QsciLexerVerilog::setFoldAtElse(bool fold)\n{\n    fold_atelse = fold;\n\n    setAtElseProp();\n}\n\n\n// Set the \"fold.at.else\" property.\nvoid QsciLexerVerilog::setAtElseProp()\n{\n    emit propertyChanged(\"fold.at.else\",(fold_atelse ? \"1\" : \"0\"));\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerVerilog::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerVerilog::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerVerilog::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerVerilog::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerVerilog::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerVerilog::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Return true if preprocessor blocks can be folded.\nbool QsciLexerVerilog::foldPreprocessor() const\n{\n    return fold_preproc;\n}\n\n\n// Set if preprocessor blocks can be folded.\nvoid QsciLexerVerilog::setFoldPreprocessor(bool fold)\n{\n    fold_preproc = fold;\n\n    setPreprocProp();\n}\n\n\n// Set the \"fold.preprocessor\" property.\nvoid QsciLexerVerilog::setPreprocProp()\n{\n    emit propertyChanged(\"fold.preprocessor\",(fold_preproc ? \"1\" : \"0\"));\n}\n\n\n// Return true if modules can be folded.\nbool QsciLexerVerilog::foldAtModule() const\n{\n    return fold_atmodule;\n}\n\n\n// Set if modules can be folded.\nvoid QsciLexerVerilog::setFoldAtModule(bool fold)\n{\n    fold_atmodule = fold;\n\n    setAtModuleProp();\n}\n\n\n// Set the \"fold.verilog.flags\" property.\nvoid QsciLexerVerilog::setAtModuleProp()\n{\n    emit propertyChanged(\"fold.verilog.flags\",(fold_atmodule ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexervhdl.cpp",
    "content": "// This module implements the QsciLexerVHDL class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexervhdl.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerVHDL::QsciLexerVHDL(QObject *parent)\n    : QsciLexer(parent),\n      fold_comments(true), fold_compact(true), fold_atelse(true),\n      fold_atbegin(true), fold_atparenth(true)\n{\n}\n\n\n// The dtor.\nQsciLexerVHDL::~QsciLexerVHDL()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerVHDL::language() const\n{\n    return \"VHDL\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerVHDL::lexer() const\n{\n    return \"vhdl\";\n}\n\n\n// Return the style used for braces.\nint QsciLexerVHDL::braceStyle() const\n{\n    return Attribute;\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerVHDL::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x80,0x00,0x80);\n\n    case Comment:\n        return QColor(0x00,0x7f,0x00);\n\n    case CommentLine:\n        return QColor(0x3f,0x7f,0x3f);\n\n    case Number:\n    case StandardOperator:\n        return QColor(0x00,0x7f,0x7f);\n\n    case String:\n        return QColor(0x7f,0x00,0x7f);\n\n    case UnclosedString:\n        return QColor(0x00,0x00,0x00);\n\n    case Keyword:\n        return QColor(0x00,0x00,0x7f);\n\n    case Attribute:\n        return QColor(0x80,0x40,0x20);\n\n    case StandardFunction:\n        return QColor(0x80,0x80,0x20);\n\n    case StandardPackage:\n        return QColor(0x20,0x80,0x20);\n\n    case StandardType:\n        return QColor(0x20,0x80,0x80);\n\n    case KeywordSet7:\n        return QColor(0x80,0x40,0x20);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerVHDL::defaultEolFill(int style) const\n{\n    if (style == UnclosedString)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerVHDL::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Comment:\n    case CommentLine:\n    case KeywordSet7:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerVHDL::keywords(int set) const\n{\n    if (set == 1)\n        return\n            \"access after alias all architecture array assert attribute begin \"\n            \"block body buffer bus case component configuration constant \"\n            \"disconnect downto else elsif end entity exit file for function \"\n            \"generate generic group guarded if impure in inertial inout is \"\n            \"label library linkage literal loop map new next null of on open \"\n            \"others out package port postponed procedure process pure range \"\n            \"record register reject report return select severity shared \"\n            \"signal subtype then to transport type unaffected units until use \"\n            \"variable wait when while with\";\n\n    if (set == 2)\n        return\n            \"abs and mod nand nor not or rem rol ror sla sll sra srl xnor xor\";\n\n    if (set == 3)\n        return\n            \"left right low high ascending image value pos val succ pred \"\n            \"leftof rightof base range reverse_range length delayed stable \"\n            \"quiet transaction event active last_event last_active last_value \"\n            \"driving driving_value simple_name path_name instance_name\";\n\n    if (set == 4)\n        return\n            \"now readline read writeline write endfile resolved to_bit \"\n            \"to_bitvector to_stdulogic to_stdlogicvector to_stdulogicvector \"\n            \"to_x01 to_x01z to_UX01 rising_edge falling_edge is_x shift_left \"\n            \"shift_right rotate_left rotate_right resize to_integer \"\n            \"to_unsigned to_signed std_match to_01\";\n\n    if (set == 5)\n        return\n            \"std ieee work standard textio std_logic_1164 std_logic_arith \"\n            \"std_logic_misc std_logic_signed std_logic_textio \"\n            \"std_logic_unsigned numeric_bit numeric_std math_complex \"\n            \"math_real vital_primitives vital_timing\";\n\n    if (set == 6)\n        return\n            \"boolean bit character severity_level integer real time \"\n            \"delay_length natural positive string bit_vector file_open_kind \"\n            \"file_open_status line text side width std_ulogic \"\n            \"std_ulogic_vector std_logic std_logic_vector X01 X01Z UX01 UX01Z \"\n            \"unsigned signed\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerVHDL::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case CommentLine:\n        return tr(\"Comment line\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case String:\n        return tr(\"String\");\n\n    case Operator:\n        return tr(\"Operator\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case UnclosedString:\n        return tr(\"Unclosed string\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case StandardOperator:\n        return tr(\"Standard operator\");\n\n    case Attribute:\n        return tr(\"Attribute\");\n\n    case StandardFunction:\n        return tr(\"Standard function\");\n\n    case StandardPackage:\n        return tr(\"Standard package\");\n\n    case StandardType:\n        return tr(\"Standard type\");\n\n    case KeywordSet7:\n        return tr(\"User defined\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerVHDL::defaultPaper(int style) const\n{\n    if (style == UnclosedString)\n        return QColor(0xe0,0xc0,0xe0);\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerVHDL::refreshProperties()\n{\n    setCommentProp();\n    setCompactProp();\n    setAtElseProp();\n    setAtBeginProp();\n    setAtParenthProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerVHDL::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    fold_comments = qs.value(prefix + \"foldcomments\", true).toBool();\n    fold_compact = qs.value(prefix + \"foldcompact\", true).toBool();\n    fold_atelse = qs.value(prefix + \"foldatelse\", true).toBool();\n    fold_atbegin = qs.value(prefix + \"foldatbegin\", true).toBool();\n    fold_atparenth = qs.value(prefix + \"foldatparenthesis\", true).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerVHDL::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldcomments\", fold_comments);\n    qs.setValue(prefix + \"foldcompact\", fold_compact);\n    qs.setValue(prefix + \"foldatelse\", fold_atelse);\n    qs.setValue(prefix + \"foldatbegin\", fold_atbegin);\n    qs.setValue(prefix + \"foldatparenthesis\", fold_atparenth);\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerVHDL::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerVHDL::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment\" property.\nvoid QsciLexerVHDL::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment\",(fold_comments ? \"1\" : \"0\"));\n}\n\n\n// Return true if folds are compact.\nbool QsciLexerVHDL::foldCompact() const\n{\n    return fold_compact;\n}\n\n\n// Set if folds are compact\nvoid QsciLexerVHDL::setFoldCompact(bool fold)\n{\n    fold_compact = fold;\n\n    setCompactProp();\n}\n\n\n// Set the \"fold.compact\" property.\nvoid QsciLexerVHDL::setCompactProp()\n{\n    emit propertyChanged(\"fold.compact\",(fold_compact ? \"1\" : \"0\"));\n}\n\n\n// Return true if else blocks can be folded.\nbool QsciLexerVHDL::foldAtElse() const\n{\n    return fold_atelse;\n}\n\n\n// Set if else blocks can be folded.\nvoid QsciLexerVHDL::setFoldAtElse(bool fold)\n{\n    fold_atelse = fold;\n\n    setAtElseProp();\n}\n\n\n// Set the \"fold.at.else\" property.\nvoid QsciLexerVHDL::setAtElseProp()\n{\n    emit propertyChanged(\"fold.at.else\",(fold_atelse ? \"1\" : \"0\"));\n}\n\n\n// Return true if begin blocks can be folded.\nbool QsciLexerVHDL::foldAtBegin() const\n{\n    return fold_atbegin;\n}\n\n\n// Set if begin blocks can be folded.\nvoid QsciLexerVHDL::setFoldAtBegin(bool fold)\n{\n    fold_atbegin = fold;\n\n    setAtBeginProp();\n}\n\n\n// Set the \"fold.at.Begin\" property.\nvoid QsciLexerVHDL::setAtBeginProp()\n{\n    emit propertyChanged(\"fold.at.Begin\",(fold_atelse ? \"1\" : \"0\"));\n}\n\n\n// Return true if blocks can be folded at a parenthesis.\nbool QsciLexerVHDL::foldAtParenthesis() const\n{\n    return fold_atparenth;\n}\n\n\n// Set if blocks can be folded at a parenthesis.\nvoid QsciLexerVHDL::setFoldAtParenthesis(bool fold)\n{\n    fold_atparenth = fold;\n\n    setAtParenthProp();\n}\n\n\n// Set the \"fold.at.Parenthese\" property.\nvoid QsciLexerVHDL::setAtParenthProp()\n{\n    emit propertyChanged(\"fold.at.Parenthese\",(fold_atparenth ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerxml.cpp",
    "content": "// This module implements the QsciLexerXML class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexerxml.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerXML::QsciLexerXML(QObject *parent)\n    : QsciLexerHTML(parent),\n      scripts(true)\n{\n}\n\n\n// The dtor.\nQsciLexerXML::~QsciLexerXML()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerXML::language() const\n{\n    return \"XML\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerXML::lexer() const\n{\n    return \"xml\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerXML::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x00,0x00,0x00);\n\n    case Tag:\n    case UnknownTag:\n    case XMLTagEnd:\n    case SGMLDefault:\n    case SGMLCommand:\n        return QColor(0x00,0x00,0x80);\n\n    case Attribute:\n    case UnknownAttribute:\n        return QColor(0x00,0x80,0x80);\n\n    case HTMLNumber:\n        return QColor(0x00,0x7f,0x7f);\n\n    case HTMLDoubleQuotedString:\n    case HTMLSingleQuotedString:\n        return QColor(0x7f,0x00,0x7f);\n\n    case OtherInTag:\n    case Entity:\n    case XMLStart:\n    case XMLEnd:\n        return QColor(0x80,0x00,0x80);\n\n    case HTMLComment:\n    case SGMLComment:\n        return QColor(0x80,0x80,0x00);\n\n    case CDATA:\n    case PHPStart:\n    case SGMLDoubleQuotedString:\n    case SGMLError:\n        return QColor(0x80,0x00,0x00);\n\n    case HTMLValue:\n        return QColor(0x60,0x80,0x60);\n\n    case SGMLParameter:\n        return QColor(0x00,0x66,0x00);\n\n    case SGMLSingleQuotedString:\n        return QColor(0x99,0x33,0x00);\n\n    case SGMLSpecial:\n        return QColor(0x33,0x66,0xff);\n\n    case SGMLEntity:\n        return QColor(0x33,0x33,0x33);\n\n    case SGMLBlockDefault:\n        return QColor(0x00,0x00,0x66);\n    }\n\n    return QsciLexerHTML::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerXML::defaultEolFill(int style) const\n{\n    if (style == CDATA)\n        return true;\n\n    return QsciLexerHTML::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerXML::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Default:\n    case Entity:\n    case CDATA:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Times New Roman\",11);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Times New Roman\", 12);\n#else\n        f = QFont(\"Bitstream Charter\",10);\n#endif\n        break;\n\n    case XMLStart:\n    case XMLEnd:\n    case SGMLCommand:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    default:\n        f = QsciLexerHTML::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerXML::keywords(int set) const\n{\n    if (set == 6)\n        return QsciLexerHTML::keywords(set);\n\n    return 0;\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerXML::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case CDATA:\n        return QColor(0xff,0xf0,0xf0);\n\n    case SGMLDefault:\n    case SGMLCommand:\n    case SGMLParameter:\n    case SGMLDoubleQuotedString:\n    case SGMLSingleQuotedString:\n    case SGMLSpecial:\n    case SGMLEntity:\n    case SGMLComment:\n        return QColor(0xef,0xef,0xff);\n\n    case SGMLError:\n        return QColor(0xff,0x66,0x66);\n\n    case SGMLBlockDefault:\n        return QColor(0xcc,0xcc,0xe0);\n    }\n\n    return QsciLexerHTML::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerXML::refreshProperties()\n{\n    setScriptsProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerXML::readProperties(QSettings &qs, const QString &prefix)\n{\n    int rc = QsciLexerHTML::readProperties(qs, prefix), num;\n\n    scripts = qs.value(prefix + \"scriptsstyled\", true).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerXML::writeProperties(QSettings &qs, const QString &prefix) const\n{\n    int rc = QsciLexerHTML::writeProperties(qs, prefix);\n\n    qs.setValue(prefix + \"scriptsstyled\", scripts);\n\n    return rc;\n}\n\n\n// Return true if scripts are styled.\nbool QsciLexerXML::scriptsStyled() const\n{\n    return scripts;\n}\n\n\n// Set if scripts are styled.\nvoid QsciLexerXML::setScriptsStyled(bool styled)\n{\n    scripts = styled;\n\n    setScriptsProp();\n}\n\n\n// Set the \"lexer.xml.allow.scripts\" property.\nvoid QsciLexerXML::setScriptsProp()\n{\n    emit propertyChanged(\"lexer.xml.allow.scripts\",(scripts ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexeryaml.cpp",
    "content": "// This module implements the QsciLexerYAML class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscilexeryaml.h\"\n\n#include <qcolor.h>\n#include <qfont.h>\n#include <qsettings.h>\n\n\n// The ctor.\nQsciLexerYAML::QsciLexerYAML(QObject *parent)\n    : QsciLexer(parent),\n      fold_comments(false)\n{\n}\n\n\n// The dtor.\nQsciLexerYAML::~QsciLexerYAML()\n{\n}\n\n\n// Returns the language name.\nconst char *QsciLexerYAML::language() const\n{\n    return \"YAML\";\n}\n\n\n// Returns the lexer name.\nconst char *QsciLexerYAML::lexer() const\n{\n    return \"yaml\";\n}\n\n\n// Returns the foreground colour of the text for a style.\nQColor QsciLexerYAML::defaultColor(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return QColor(0x00,0x00,0x00);\n\n    case Comment:\n        return QColor(0x00,0x88,0x00);\n\n    case Identifier:\n        return QColor(0x00,0x00,0x88);\n\n    case Keyword:\n        return QColor(0x88,0x00,0x88);\n\n    case Number:\n        return QColor(0x88,0x00,0x00);\n\n    case Reference:\n        return QColor(0x00,0x88,0x88);\n\n    case DocumentDelimiter:\n    case SyntaxErrorMarker:\n        return QColor(0xff,0xff,0xff);\n\n    case TextBlockMarker:\n        return QColor(0x33,0x33,0x66);\n    }\n\n    return QsciLexer::defaultColor(style);\n}\n\n\n// Returns the end-of-line fill for a style.\nbool QsciLexerYAML::defaultEolFill(int style) const\n{\n    if (style == DocumentDelimiter || style == SyntaxErrorMarker)\n        return true;\n\n    return QsciLexer::defaultEolFill(style);\n}\n\n\n// Returns the font of the text for a style.\nQFont QsciLexerYAML::defaultFont(int style) const\n{\n    QFont f;\n\n    switch (style)\n    {\n    case Default:\n    case TextBlockMarker:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Times New Roman\", 11);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Times New Roman\", 12);\n#else\n        f = QFont(\"Bitstream Charter\", 10);\n#endif\n        break;\n\n    case Identifier:\n        f = QsciLexer::defaultFont(style);\n        f.setBold(true);\n        break;\n\n    case DocumentDelimiter:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Comic Sans MS\",9);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Comic Sans MS\", 12);\n#else\n        f = QFont(\"Bitstream Vera Serif\",9);\n#endif\n        f.setBold(true);\n        break;\n\n    case SyntaxErrorMarker:\n#if defined(Q_OS_WIN)\n        f = QFont(\"Times New Roman\", 11);\n#elif defined(Q_OS_MAC)\n        f = QFont(\"Times New Roman\", 12);\n#else\n        f = QFont(\"Bitstream Charter\", 10);\n#endif\n        f.setBold(true);\n        f.setItalic(true);\n        break;\n\n    default:\n        f = QsciLexer::defaultFont(style);\n    }\n\n    return f;\n}\n\n\n// Returns the set of keywords.\nconst char *QsciLexerYAML::keywords(int set) const\n{\n    if (set == 1)\n        return \"true false yes no\";\n\n    return 0;\n}\n\n\n// Returns the user name of a style.\nQString QsciLexerYAML::description(int style) const\n{\n    switch (style)\n    {\n    case Default:\n        return tr(\"Default\");\n\n    case Comment:\n        return tr(\"Comment\");\n\n    case Identifier:\n        return tr(\"Identifier\");\n\n    case Keyword:\n        return tr(\"Keyword\");\n\n    case Number:\n        return tr(\"Number\");\n\n    case Reference:\n        return tr(\"Reference\");\n\n    case DocumentDelimiter:\n        return tr(\"Document delimiter\");\n\n    case TextBlockMarker:\n        return tr(\"Text block marker\");\n\n    case SyntaxErrorMarker:\n        return tr(\"Syntax error marker\");\n\n    case Operator:\n        return tr(\"Operator\");\n    }\n\n    return QString();\n}\n\n\n// Returns the background colour of the text for a style.\nQColor QsciLexerYAML::defaultPaper(int style) const\n{\n    switch (style)\n    {\n    case DocumentDelimiter:\n        return QColor(0x00,0x00,0x88);\n\n    case SyntaxErrorMarker:\n        return QColor(0xff,0x00,0x00);\n    }\n\n    return QsciLexer::defaultPaper(style);\n}\n\n\n// Refresh all properties.\nvoid QsciLexerYAML::refreshProperties()\n{\n    setCommentProp();\n}\n\n\n// Read properties from the settings.\nbool QsciLexerYAML::readProperties(QSettings &qs,const QString &prefix)\n{\n    int rc = true;\n\n    fold_comments = qs.value(prefix + \"foldcomments\", false).toBool();\n\n    return rc;\n}\n\n\n// Write properties to the settings.\nbool QsciLexerYAML::writeProperties(QSettings &qs,const QString &prefix) const\n{\n    int rc = true;\n\n    qs.setValue(prefix + \"foldcomments\", fold_comments);\n\n    return rc;\n}\n\n\n// Return true if comments can be folded.\nbool QsciLexerYAML::foldComments() const\n{\n    return fold_comments;\n}\n\n\n// Set if comments can be folded.\nvoid QsciLexerYAML::setFoldComments(bool fold)\n{\n    fold_comments = fold;\n\n    setCommentProp();\n}\n\n\n// Set the \"fold.comment.yaml\" property.\nvoid QsciLexerYAML::setCommentProp()\n{\n    emit propertyChanged(\"fold.comment.yaml\",(fold_comments ? \"1\" : \"0\"));\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscimacro.cpp",
    "content": "// This module implements the QsciMacro class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscimacro.h\"\n\n#include <qstringlist.h>\n\n#include \"Qsci/qsciscintilla.h\"\n\n\nstatic int fromHex(unsigned char ch);\n\n\n\n// The ctor.\nQsciMacro::QsciMacro(QsciScintilla *parent)\n    : QObject(parent), qsci(parent)\n{\n}\n\n\n// The ctor that initialises the macro.\nQsciMacro::QsciMacro(const QString &asc, QsciScintilla *parent)\n    : QObject(parent), qsci(parent)\n{\n    load(asc);\n}\n\n\n// The dtor.\nQsciMacro::~QsciMacro()\n{\n}\n\n\n// Clear the contents of the macro.\nvoid QsciMacro::clear()\n{\n    macro.clear();\n}\n\n\n// Read a macro from a string.\nbool QsciMacro::load(const QString &asc)\n{\n    bool ok = true;\n\n    macro.clear();\n\n    QStringList fields = asc.split(' ');\n\n    int f = 0;\n\n    while (f < fields.size())\n    {\n        Macro cmd;\n        unsigned len;\n\n        // Extract the 3 fixed fields.\n        if (f + 3 > fields.size())\n        {\n            ok = false;\n            break;\n        }\n\n        cmd.msg = fields[f++].toUInt(&ok);\n\n        if (!ok)\n            break;\n\n        cmd.wParam = fields[f++].toULong(&ok);\n\n        if (!ok)\n            break;\n\n        len = fields[f++].toUInt(&ok);\n\n        if (!ok)\n            break;\n\n        // Extract any text.\n        if (len)\n        {\n            if (f + 1 > fields.size())\n            {\n                ok = false;\n                break;\n            }\n\n            QByteArray ba = fields[f++].toLatin1();\n            const char *sp = ba.data();\n\n            if (!sp)\n            {\n                ok = false;\n                break;\n            }\n\n            // Because of historical bugs the length field is unreliable.\n            bool embedded_null = false;\n            unsigned char ch;\n\n            while ((ch = *sp++) != '\\0')\n            {\n                if (ch == '\"' || ch <= ' ' || ch >= 0x7f)\n                {\n                    ok = false;\n                    break;\n                }\n\n                if (ch == '\\\\')\n                {\n                    int b1, b2;\n\n                    if ((b1 = fromHex(*sp++)) < 0 ||\n                        (b2 = fromHex(*sp++)) < 0)\n                    {\n                        ok = false;\n                        break;\n                    }\n\n                    ch = (b1 << 4) + b2;\n                }\n\n                if (ch == '\\0')\n                {\n                    // Don't add it now as it may be the terminating '\\0'.\n                    embedded_null = true;\n                }\n                else\n                {\n                    if (embedded_null)\n                    {\n                        // Add the pending embedded '\\0'.\n                        cmd.text += '\\0';\n                        embedded_null = false;\n                    }\n\n                    cmd.text += ch;\n                }\n            }\n\n            if (!ok)\n                break;\n\n        }\n\n        macro.append(cmd);\n    }\n        \n    if (!ok)\n        macro.clear();\n\n    return ok;\n}\n\n\n// Write a macro to a string.\nQString QsciMacro::save() const\n{\n    QString ms;\n\n    QList<Macro>::const_iterator it;\n\n    for (it = macro.begin(); it != macro.end(); ++it)\n    {\n        if (!ms.isEmpty())\n            ms += ' ';\n\n        unsigned len = (*it).text.size();\n        QString m;\n\n        ms += m.sprintf(\"%u %lu %u\", (*it).msg, (*it).wParam, len);\n\n        if (len)\n        {\n            // In Qt v3, if the length is greater than zero then it also\n            // includes the '\\0', so we need to make sure that Qt v4 writes the\n            // '\\0'.  That the '\\0' is written at all is a bug because\n            // QCString::size() is used instead of QCString::length().  We\n            // don't fix this so as not to break old macros.  However this is\n            // still broken because we have already written the unadjusted\n            // length.  So, in summary, the length field should be interpreted\n            // as a zero/non-zero value, and the end of the data is either at\n            // the next space or the very end of the data.\n            ++len;\n\n            ms += ' ';\n\n            const char *cp = (*it).text.data();\n\n            while (len--)\n            {\n                unsigned char ch = *cp++;\n\n                if (ch == '\\\\' || ch == '\"' || ch <= ' ' || ch >= 0x7f)\n                {\n                    QString buf;\n\n                    ms += buf.sprintf(\"\\\\%02x\", ch);\n                }\n                else\n                    ms += ch;\n            }\n        }\n    }\n\n    return ms;\n}\n\n\n// Play the macro.\nvoid QsciMacro::play()\n{\n    if (!qsci)\n        return;\n\n    QList<Macro>::const_iterator it;\n\n    for (it = macro.begin(); it != macro.end(); ++it)\n        qsci->SendScintilla((*it).msg, (*it).wParam, (*it).text.data());\n}\n\n\n// Start recording.\nvoid QsciMacro::startRecording()\n{\n    if (!qsci)\n        return;\n\n    macro.clear();\n\n    connect(qsci, SIGNAL(SCN_MACRORECORD(unsigned int, unsigned long, void *)),\n            SLOT(record(unsigned int, unsigned long, void *)));\n\n    qsci->SendScintilla(QsciScintillaBase::SCI_STARTRECORD);\n}\n\n\n// End recording.\nvoid QsciMacro::endRecording()\n{\n    if (!qsci)\n        return;\n\n    qsci->SendScintilla(QsciScintillaBase::SCI_STOPRECORD);\n    qsci->disconnect(this);\n}\n\n\n// Record a command.\nvoid QsciMacro::record(unsigned int msg, unsigned long wParam, void *lParam)\n{\n    Macro m;\n\n    m.msg = msg;\n    m.wParam = wParam;\n\n    // Determine commands which need special handling of the parameters.\n    switch (msg)\n    {\n    case QsciScintillaBase::SCI_ADDTEXT:\n        m.text = QByteArray(reinterpret_cast<const char *>(lParam), wParam);\n        break;\n\n    case QsciScintillaBase::SCI_REPLACESEL:\n        if (!macro.isEmpty() && macro.last().msg == QsciScintillaBase::SCI_REPLACESEL)\n        {\n            // This is the command used for ordinary user input so it's a\n            // significant space reduction to append it to the previous\n            // command.\n\n            macro.last().text.append(reinterpret_cast<const char *>(lParam));\n            return;\n        }\n\n        /* Drop through. */\n\n    case QsciScintillaBase::SCI_INSERTTEXT:\n    case QsciScintillaBase::SCI_APPENDTEXT:\n    case QsciScintillaBase::SCI_SEARCHNEXT:\n    case QsciScintillaBase::SCI_SEARCHPREV:\n        m.text.append(reinterpret_cast<const char *>(lParam));\n        break;\n    }\n\n    macro.append(m);\n}\n\n\n// Return the given hex character as a binary.\nstatic int fromHex(unsigned char ch)\n{\n    if (ch >= '0' && ch <= '9')\n        return ch - '0';\n\n    if (ch >= 'a' && ch <= 'f')\n        return ch - 'a' + 10;\n\n    return -1;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscintilla.pro",
    "content": "# The project file for the QScintilla library.\n#\n# Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n# \n# This file is part of QScintilla.\n# \n# This file may be used under the terms of the GNU General Public\n# License versions 2.0 or 3.0 as published by the Free Software\n# Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n# included in the packaging of this file.  Alternatively you may (at\n# your option) use any later version of the GNU General Public\n# License if such license has been publicly approved by Riverbank\n# Computing Limited (or its successors, if any) and the KDE Free Qt\n# Foundation. In addition, as a special exception, Riverbank gives you\n# certain additional rights. These rights are described in the Riverbank\n# GPL Exception version 1.1, which can be found in the file\n# GPL_EXCEPTION.txt in this package.\n# \n# If you are unsure which license is appropriate for your use, please\n# contact the sales department at sales@riverbankcomputing.com.\n# \n# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n# This must be kept in sync with Python/configure.py, Python/configure-old.py,\n# example-Qt4Qt5/application.pro and designer-Qt4Qt5/designer.pro.\n!win32:VERSION = 11.3.0\n\nTEMPLATE = lib\nTARGET = qscintilla2\nCONFIG += qt warn_off release thread exceptions\nINCLUDEPATH += . ../include ../lexlib ../src\n\nDEFINES += QSCINTILLA_MAKE_DLL SCINTILLA_QT SCI_LEXER\ngreaterThan(QT_MAJOR_VERSION, 3) {\n    CONFIG(staticlib) {\n        DEFINES -= QSCINTILLA_MAKE_DLL\n    }\n}\n\ngreaterThan(QT_MAJOR_VERSION, 4) {\n\tQT += widgets printsupport\n\n    greaterThan(QT_MINOR_VERSION, 1) {\n\t    macx:QT += macextras\n    }\n\n    # Work around QTBUG-39300.\n    CONFIG -= android_install\n}\n\n# Comment this in if you want the internal Scintilla classes to be placed in a\n# Scintilla namespace rather than pollute the global namespace.\n#DEFINES += SCI_NAMESPACE\n\n# Handle both Qt v4 and v3.\ntarget.path = $$[QT_INSTALL_LIBS]\nisEmpty(target.path) {\n\ttarget.path = $(QTDIR)/lib\n}\n\nheader.path = $$[QT_INSTALL_HEADERS]\nheader.files = Qsci\nisEmpty(header.path) {\n\theader.path = $(QTDIR)/include/Qsci\n\theader.files = Qsci/qsci*.h\n}\n\ntrans.path = $$[QT_INSTALL_TRANSLATIONS]\ntrans.files = qscintilla_*.qm\nisEmpty(trans.path) {\n\ttrans.path = $(QTDIR)/translations\n}\n\nqsci.path = $$[QT_INSTALL_DATA]\nqsci.files = ../qsci\nisEmpty(qsci.path) {\n\tqsci.path = $(QTDIR)\n}\n\nINSTALLS += header trans qsci target\n\ngreaterThan(QT_MAJOR_VERSION, 3) {\n    features.path = $$[QT_INSTALL_DATA]/mkspecs/features\n    features.files = $$PWD/features/qscintilla2.prf\n    INSTALLS += features\n}\n\nHEADERS = \\\n\t./Qsci/qsciglobal.h \\\n\t./Qsci/qsciscintilla.h \\\n\t./Qsci/qsciscintillabase.h \\\n\t./Qsci/qsciabstractapis.h \\\n\t./Qsci/qsciapis.h \\\n\t./Qsci/qscicommand.h \\\n\t./Qsci/qscicommandset.h \\\n\t./Qsci/qscidocument.h \\\n\t./Qsci/qscilexer.h \\\n\t./Qsci/qscilexeravs.h \\\n\t./Qsci/qscilexerbash.h \\\n\t./Qsci/qscilexerbatch.h \\\n\t./Qsci/qscilexercmake.h \\\n\t./Qsci/qscilexercoffeescript.h \\\n\t./Qsci/qscilexercpp.h \\\n\t./Qsci/qscilexercsharp.h \\\n\t./Qsci/qscilexercss.h \\\n\t./Qsci/qscilexercustom.h \\\n\t./Qsci/qscilexerd.h \\\n\t./Qsci/qscilexerdiff.h \\\n\t./Qsci/qscilexerfortran.h \\\n\t./Qsci/qscilexerfortran77.h \\\n\t./Qsci/qscilexerhtml.h \\\n\t./Qsci/qscilexeridl.h \\\n\t./Qsci/qscilexerjava.h \\\n\t./Qsci/qscilexerjavascript.h \\\n\t./Qsci/qscilexerlua.h \\\n\t./Qsci/qscilexermakefile.h \\\n\t./Qsci/qscilexermatlab.h \\\n\t./Qsci/qscilexeroctave.h \\\n\t./Qsci/qscilexerpascal.h \\\n\t./Qsci/qscilexerperl.h \\\n\t./Qsci/qscilexerpostscript.h \\\n\t./Qsci/qscilexerpo.h \\\n\t./Qsci/qscilexerpov.h \\\n\t./Qsci/qscilexerproperties.h \\\n\t./Qsci/qscilexerpython.h \\\n\t./Qsci/qscilexerruby.h \\\n\t./Qsci/qscilexerspice.h \\\n\t./Qsci/qscilexersql.h \\\n\t./Qsci/qscilexertcl.h \\\n\t./Qsci/qscilexertex.h \\\n\t./Qsci/qscilexerverilog.h \\\n\t./Qsci/qscilexervhdl.h \\\n\t./Qsci/qscilexerxml.h \\\n\t./Qsci/qscilexeryaml.h \\\n\t./Qsci/qscimacro.h \\\n\t./Qsci/qsciprinter.h \\\n\t./Qsci/qscistyle.h \\\n\t./Qsci/qscistyledtext.h \\\n\tListBoxQt.h \\\n\tSciClasses.h \\\n\tSciNamespace.h \\\n\tScintillaQt.h \\\n\t../include/ILexer.h \\\n\t../include/Platform.h \\\n\t../include/SciLexer.h \\\n\t../include/Scintilla.h \\\n\t../include/ScintillaWidget.h \\\n\t../lexlib/Accessor.h \\\n\t../lexlib/CharacterCategory.h \\\n\t../lexlib/CharacterSet.h \\\n\t../lexlib/LexAccessor.h \\\n\t../lexlib/LexerBase.h \\\n\t../lexlib/LexerModule.h \\\n\t../lexlib/LexerNoExceptions.h \\\n\t../lexlib/LexerSimple.h \\\n\t../lexlib/OptionSet.h \\\n\t../lexlib/PropSetSimple.h \\\n\t../lexlib/StyleContext.h \\\n\t../lexlib/SubStyles.h \\\n\t../lexlib/WordList.h \\\n\t../src/AutoComplete.h \\\n\t../src/CallTip.h \\\n\t../src/CaseConvert.h \\\n\t../src/CaseFolder.h \\\n\t../src/Catalogue.h \\\n\t../src/CellBuffer.h \\\n\t../src/CharClassify.h \\\n\t../src/ContractionState.h \\\n\t../src/Decoration.h \\\n\t../src/Document.h \\\n\t../src/Editor.h \\\n\t../src/ExternalLexer.h \\\n\t../src/FontQuality.h \\\n\t../src/Indicator.h \\\n\t../src/KeyMap.h \\\n\t../src/LineMarker.h \\\n\t../src/Partitioning.h \\\n\t../src/PerLine.h \\\n\t../src/PositionCache.h \\\n\t../src/RESearch.h \\\n\t../src/RunStyles.h \\\n\t../src/ScintillaBase.h \\\n\t../src/Selection.h \\\n\t../src/SplitVector.h \\\n\t../src/Style.h \\\n\t../src/UnicodeFromUTF8.h \\\n\t../src/UniConversion.h \\\n\t../src/ViewStyle.h \\\n\t../src/XPM.h\n\nSOURCES = \\\n\tqsciscintilla.cpp \\\n\tqsciscintillabase.cpp \\\n\tqsciabstractapis.cpp \\\n\tqsciapis.cpp \\\n\tqscicommand.cpp \\\n\tqscicommandset.cpp \\\n\tqscidocument.cpp \\\n\tqscilexer.cpp \\\n\tqscilexeravs.cpp \\\n\tqscilexerbash.cpp \\\n\tqscilexerbatch.cpp \\\n\tqscilexercmake.cpp \\\n\tqscilexercoffeescript.cpp \\\n\tqscilexercpp.cpp \\\n\tqscilexercsharp.cpp \\\n\tqscilexercss.cpp \\\n\tqscilexercustom.cpp \\\n\tqscilexerd.cpp \\\n\tqscilexerdiff.cpp \\\n\tqscilexerfortran.cpp \\\n\tqscilexerfortran77.cpp \\\n\tqscilexerhtml.cpp \\\n\tqscilexeridl.cpp \\\n\tqscilexerjava.cpp \\\n\tqscilexerjavascript.cpp \\\n\tqscilexerlua.cpp \\\n\tqscilexermakefile.cpp \\\n\tqscilexermatlab.cpp \\\n\tqscilexeroctave.cpp \\\n\tqscilexerpascal.cpp \\\n\tqscilexerperl.cpp \\\n\tqscilexerpostscript.cpp \\\n\tqscilexerpo.cpp \\\n\tqscilexerpov.cpp \\\n\tqscilexerproperties.cpp \\\n\tqscilexerpython.cpp \\\n\tqscilexerruby.cpp \\\n\tqscilexerspice.cpp \\\n\tqscilexersql.cpp \\\n\tqscilexertcl.cpp \\\n\tqscilexertex.cpp \\\n\tqscilexerverilog.cpp \\\n\tqscilexervhdl.cpp \\\n\tqscilexerxml.cpp \\\n\tqscilexeryaml.cpp \\\n\tqscimacro.cpp \\\n\tqsciprinter.cpp \\\n\tqscistyle.cpp \\\n\tqscistyledtext.cpp \\\n    MacPasteboardMime.cpp \\\n    InputMethod.cpp \\\n\tSciClasses.cpp \\\n\tListBoxQt.cpp \\\n\tPlatQt.cpp \\\n\tScintillaQt.cpp \\\n\t../lexers/LexA68k.cpp \\\n\t../lexers/LexAbaqus.cpp \\\n\t../lexers/LexAda.cpp \\\n\t../lexers/LexAPDL.cpp \\\n\t../lexers/LexAsm.cpp \\\n\t../lexers/LexAsn1.cpp \\\n\t../lexers/LexASY.cpp \\\n\t../lexers/LexAU3.cpp \\\n\t../lexers/LexAVE.cpp \\\n\t../lexers/LexAVS.cpp \\\n\t../lexers/LexBaan.cpp \\\n\t../lexers/LexBash.cpp \\\n\t../lexers/LexBasic.cpp \\\n\t../lexers/LexBullant.cpp \\\n\t../lexers/LexCaml.cpp \\\n\t../lexers/LexCLW.cpp \\\n\t../lexers/LexCmake.cpp \\\n\t../lexers/LexCOBOL.cpp \\\n\t../lexers/LexCoffeeScript.cpp \\\n\t../lexers/LexConf.cpp \\\n\t../lexers/LexCPP.cpp \\\n\t../lexers/LexCrontab.cpp \\\n\t../lexers/LexCsound.cpp \\\n\t../lexers/LexCSS.cpp \\\n\t../lexers/LexD.cpp \\\n\t../lexers/LexECL.cpp \\\n\t../lexers/LexEiffel.cpp \\\n\t../lexers/LexErlang.cpp \\\n\t../lexers/LexEScript.cpp \\\n\t../lexers/LexFlagship.cpp \\\n\t../lexers/LexForth.cpp \\\n\t../lexers/LexFortran.cpp \\\n\t../lexers/LexGAP.cpp \\\n\t../lexers/LexGui4Cli.cpp \\\n\t../lexers/LexHaskell.cpp \\\n\t../lexers/LexHTML.cpp \\\n\t../lexers/LexInno.cpp \\\n\t../lexers/LexKix.cpp \\\n\t../lexers/LexKVIrc.cpp \\\n\t../lexers/LexLaTex.cpp \\\n\t../lexers/LexLisp.cpp \\\n\t../lexers/LexLout.cpp \\\n\t../lexers/LexLua.cpp \\\n\t../lexers/LexMagik.cpp \\\n\t../lexers/LexMarkdown.cpp \\\n\t../lexers/LexMatlab.cpp \\\n\t../lexers/LexMetapost.cpp \\\n\t../lexers/LexMMIXAL.cpp \\\n\t../lexers/LexModula.cpp \\\n\t../lexers/LexMPT.cpp \\\n\t../lexers/LexMSSQL.cpp \\\n\t../lexers/LexMySQL.cpp \\\n\t../lexers/LexNimrod.cpp \\\n\t../lexers/LexNsis.cpp \\\n\t../lexers/LexOpal.cpp \\\n\t../lexers/LexOScript.cpp \\\n\t../lexers/LexOthers.cpp \\\n\t../lexers/LexPascal.cpp \\\n\t../lexers/LexPB.cpp \\\n\t../lexers/LexPerl.cpp \\\n\t../lexers/LexPLM.cpp \\\n\t../lexers/LexPO.cpp \\\n\t../lexers/LexPOV.cpp \\\n\t../lexers/LexPowerPro.cpp \\\n\t../lexers/LexPowerShell.cpp \\\n\t../lexers/LexProgress.cpp \\\n\t../lexers/LexPS.cpp \\\n\t../lexers/LexPython.cpp \\\n\t../lexers/LexR.cpp \\\n\t../lexers/LexRebol.cpp \\\n\t../lexers/LexRuby.cpp \\\n\t../lexers/LexRust.cpp \\\n\t../lexers/LexScriptol.cpp \\\n\t../lexers/LexSmalltalk.cpp \\\n\t../lexers/LexSML.cpp \\\n\t../lexers/LexSorcus.cpp \\\n\t../lexers/LexSpecman.cpp \\\n\t../lexers/LexSpice.cpp \\\n\t../lexers/LexSQL.cpp \\\n\t../lexers/LexSTTXT.cpp \\\n\t../lexers/LexTACL.cpp \\\n\t../lexers/LexTADS3.cpp \\\n\t../lexers/LexTAL.cpp \\\n\t../lexers/LexTCL.cpp \\\n\t../lexers/LexTCMD.cpp \\\n\t../lexers/LexTeX.cpp \\\n\t../lexers/LexTxt2tags.cpp \\\n\t../lexers/LexVB.cpp \\\n\t../lexers/LexVerilog.cpp \\\n\t../lexers/LexVHDL.cpp \\\n\t../lexers/LexVisualProlog.cpp \\\n\t../lexers/LexYAML.cpp \\\n\t../lexlib/Accessor.cpp \\\n\t../lexlib/CharacterCategory.cpp \\\n\t../lexlib/CharacterSet.cpp \\\n\t../lexlib/LexerBase.cpp \\\n\t../lexlib/LexerModule.cpp \\\n\t../lexlib/LexerNoExceptions.cpp \\\n\t../lexlib/LexerSimple.cpp \\\n\t../lexlib/PropSetSimple.cpp \\\n\t../lexlib/StyleContext.cpp \\\n\t../lexlib/WordList.cpp \\\n\t../src/AutoComplete.cpp \\\n\t../src/CallTip.cpp \\\n\t../src/CaseConvert.cpp \\\n\t../src/CaseFolder.cpp \\\n\t../src/Catalogue.cpp \\\n\t../src/CellBuffer.cpp \\\n\t../src/CharClassify.cpp \\\n\t../src/ContractionState.cpp \\\n\t../src/Decoration.cpp \\\n\t../src/Document.cpp \\\n\t../src/Editor.cpp \\\n\t../src/ExternalLexer.cpp \\\n\t../src/Indicator.cpp \\\n    ../src/KeyMap.cpp \\\n\t../src/LineMarker.cpp \\\n\t../src/PerLine.cpp \\\n\t../src/PositionCache.cpp \\\n    ../src/RESearch.cpp \\\n\t../src/RunStyles.cpp \\\n    ../src/ScintillaBase.cpp \\\n    ../src/Selection.cpp \\\n\t../src/Style.cpp \\\n\t../src/UniConversion.cpp \\\n\t../src/ViewStyle.cpp \\\n\t../src/XPM.cpp\n\nTRANSLATIONS = \\\n\tqscintilla_cs.ts \\\n\tqscintilla_de.ts \\\n\tqscintilla_es.ts \\\n\tqscintilla_fr.ts \\\n\tqscintilla_pt_br.ts\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscintilla_cs.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"pt\">\n<context>\n    <name>QsciCommand</name>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"44\"/>\n        <source>Move down one line</source>\n        <translation>Posun o jednu řádku dolů</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"54\"/>\n        <source>Extend selection down one line</source>\n        <translation>Rozšířit výběr o jednu řádku dolů</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"71\"/>\n        <source>Scroll view down one line</source>\n        <translation>Rolovat pohled o jednu řádku dolů</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"64\"/>\n        <source>Extend rectangular selection down one line</source>\n        <translation>Rozšířit obdélníkový výběr o jednu řádku dolů</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"81\"/>\n        <source>Move up one line</source>\n        <translation>Posun o jednu řádku nahoru</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"91\"/>\n        <source>Extend selection up one line</source>\n        <translation>Rozšířit výběr o jednu řádku nahoru</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"108\"/>\n        <source>Scroll view up one line</source>\n        <translation>Rolovat pohled o jednu řádku nahoru</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"101\"/>\n        <source>Extend rectangular selection up one line</source>\n        <translation>Rozšířit obdélníkový výběr o jednu řádku nahoru</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"158\"/>\n        <source>Move up one paragraph</source>\n        <translation>Posun o jeden odstavec nahoru</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"164\"/>\n        <source>Extend selection up one paragraph</source>\n        <translation>Rozšířit výběr o jeden odstavec nahoru</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"145\"/>\n        <source>Move down one paragraph</source>\n        <translation>Posun o jeden odstavec dolů</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"118\"/>\n        <source>Scroll to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"128\"/>\n        <source>Scroll to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"138\"/>\n        <source>Scroll vertically to centre current line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"151\"/>\n        <source>Extend selection down one paragraph</source>\n        <translation>Rozšířit výběr o jeden odstavec dolů</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"175\"/>\n        <source>Move left one character</source>\n        <translation>Posun o jedno písmeno doleva</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"185\"/>\n        <source>Extend selection left one character</source>\n        <translation>Rozšířit výběr o jedno písmeno doleva</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"239\"/>\n        <source>Move left one word</source>\n        <translation>Posun o jedno slovo vlevo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"249\"/>\n        <source>Extend selection left one word</source>\n        <translation>Rozšířit výběr o jedno slovo doleva</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"196\"/>\n        <source>Extend rectangular selection left one character</source>\n        <translation>Rozšířit obdélníkový výběr o jedno písmeno doleva</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"207\"/>\n        <source>Move right one character</source>\n        <translation>Posun o jedno písmeno doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"217\"/>\n        <source>Extend selection right one character</source>\n        <translation>Rozšířit výběr o jedno písmeno doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"259\"/>\n        <source>Move right one word</source>\n        <translation>Posun o jedno slovo doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"265\"/>\n        <source>Extend selection right one word</source>\n        <translation>Rozšířit výběr o jedno slovo doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"228\"/>\n        <source>Extend rectangular selection right one character</source>\n        <translation>Rozšířit obdélníkový výběr o jedno písmeno doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"271\"/>\n        <source>Move to end of previous word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"277\"/>\n        <source>Extend selection to end of previous word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"288\"/>\n        <source>Move to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"298\"/>\n        <source>Extend selection to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"305\"/>\n        <source>Move left one word part</source>\n        <translation>Posun o část slova doleva</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"311\"/>\n        <source>Extend selection left one word part</source>\n        <translation>Rozšířit výběr o část slova doleva</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"318\"/>\n        <source>Move right one word part</source>\n        <translation>Posun o část slova doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"324\"/>\n        <source>Extend selection right one word part</source>\n        <translation>Rozšířit výběr o část slova doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"558\"/>\n        <source>Move up one page</source>\n        <translation>Posun na předchozí stranu</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"568\"/>\n        <source>Extend selection up one page</source>\n        <translation>Rozšířit výběr na předchozí stranu</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"578\"/>\n        <source>Extend rectangular selection up one page</source>\n        <translation>Rozšířit obdélníkový výběr na předchozí stranu</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"593\"/>\n        <source>Move down one page</source>\n        <translation>Posun na další stranu</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"607\"/>\n        <source>Extend selection down one page</source>\n        <translation>Rozšířit výběr na další stranu</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"621\"/>\n        <source>Extend rectangular selection down one page</source>\n        <translation>Rozšířit obdélníkový výběr na další stranu</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"658\"/>\n        <source>Delete current character</source>\n        <translation>Smazat aktuální znak</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"788\"/>\n        <source>Cut selection</source>\n        <translation>Vyjmout výběr</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"687\"/>\n        <source>Delete word to right</source>\n        <translation>Smazat slovo doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"335\"/>\n        <source>Move to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"345\"/>\n        <source>Extend selection to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"356\"/>\n        <source>Extend rectangular selection to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"367\"/>\n        <source>Move to start of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"377\"/>\n        <source>Extend selection to start of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"384\"/>\n        <source>Move to start of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"391\"/>\n        <source>Extend selection to start of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"402\"/>\n        <source>Move to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"413\"/>\n        <source>Extend selection to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"424\"/>\n        <source>Extend rectangular selection to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"431\"/>\n        <source>Move to first visible character of display in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"438\"/>\n        <source>Extend selection to first visible character in display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"449\"/>\n        <source>Move to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"459\"/>\n        <source>Extend selection to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"470\"/>\n        <source>Extend rectangular selection to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"481\"/>\n        <source>Move to end of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"491\"/>\n        <source>Extend selection to end of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"498\"/>\n        <source>Move to end of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"505\"/>\n        <source>Extend selection to end of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"516\"/>\n        <source>Move to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"526\"/>\n        <source>Extend selection to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"537\"/>\n        <source>Move to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"547\"/>\n        <source>Extend selection to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"628\"/>\n        <source>Stuttered move up one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"634\"/>\n        <source>Stuttered extend selection up one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"641\"/>\n        <source>Stuttered move down one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"647\"/>\n        <source>Stuttered extend selection down one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"674\"/>\n        <source>Delete previous character if not at start of line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"697\"/>\n        <source>Delete right to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"714\"/>\n        <source>Delete line to right</source>\n        <translation>Smazat řádku doprava</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"738\"/>\n        <source>Transpose current and previous lines</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"745\"/>\n        <source>Duplicate the current line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"751\"/>\n        <source>Select all</source>\n        <oldsource>Select document</oldsource>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"757\"/>\n        <source>Move selected lines up one line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"763\"/>\n        <source>Move selected lines down one line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"806\"/>\n        <source>Toggle insert/overtype</source>\n        <translation>Přepnout vkládání/přepisování</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"800\"/>\n        <source>Paste</source>\n        <translation>Vložit</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"794\"/>\n        <source>Copy selection</source>\n        <translation>Kopírovat výběr</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"812\"/>\n        <source>Insert newline</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"830\"/>\n        <source>De-indent one level</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"836\"/>\n        <source>Cancel</source>\n        <translation>Zrušit</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"668\"/>\n        <source>Delete previous character</source>\n        <translation>Smazat předchozí znak</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"681\"/>\n        <source>Delete word to left</source>\n        <translation>Smazat slovo doleva</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"704\"/>\n        <source>Delete line to left</source>\n        <translation>Smazat řádku doleva</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"842\"/>\n        <source>Undo last command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"852\"/>\n        <source>Redo last command</source>\n        <translation>Znovu použít poslední příkaz</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"824\"/>\n        <source>Indent one level</source>\n        <translation>Odsadit o jednu úroveň</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"858\"/>\n        <source>Zoom in</source>\n        <translation>Zvětšit</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"864\"/>\n        <source>Zoom out</source>\n        <translation>Zmenšit</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"818\"/>\n        <source>Formfeed</source>\n        <translation>Vysunout</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"726\"/>\n        <source>Cut current line</source>\n        <translation>Vyjmout aktuální řádku</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"720\"/>\n        <source>Delete current line</source>\n        <translation>Smazat aktuální řádku</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"732\"/>\n        <source>Copy current line</source>\n        <translation>Kopírovat aktuální řádku</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"776\"/>\n        <source>Convert selection to lower case</source>\n        <translation>Vybraný text převést na malá písmena</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"782\"/>\n        <source>Convert selection to upper case</source>\n        <translation>Vybraný text převést na velká písmena</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"770\"/>\n        <source>Duplicate selection</source>\n        <translation>Duplikovat výběr</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerAVS</name>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"280\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"283\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"286\"/>\n        <source>Nested block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"289\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"301\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"304\"/>\n        <source>Triple double-quoted string</source>\n        <translation type=\"unfinished\">String ve třech dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"307\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"310\"/>\n        <source>Filter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"313\"/>\n        <source>Plugin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"316\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"319\"/>\n        <source>Clip property</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"322\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBash</name>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"193\"/>\n        <source>Default</source>\n        <translation>Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"196\"/>\n        <source>Error</source>\n        <translation>Chyba</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"199\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"202\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"205\"/>\n        <source>Keyword</source>\n        <translation>Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"208\"/>\n        <source>Double-quoted string</source>\n        <translation>String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"211\"/>\n        <source>Single-quoted string</source>\n        <translation>String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"214\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"217\"/>\n        <source>Identifier</source>\n        <translation>Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"220\"/>\n        <source>Scalar</source>\n        <translation>Skalár</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"223\"/>\n        <source>Parameter expansion</source>\n        <translation>Rozklad parametru</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"226\"/>\n        <source>Backticks</source>\n        <translation>Zpětný chod</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"229\"/>\n        <source>Here document delimiter</source>\n        <translation>Zde je oddělovač dokumentu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"232\"/>\n        <source>Single-quoted here document</source>\n        <translation>Jednoduché uvozovky zde v dokumentu</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBatch</name>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"164\"/>\n        <source>Default</source>\n        <translation>Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"167\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation>Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"173\"/>\n        <source>Label</source>\n        <translation>Nadpis</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"176\"/>\n        <source>Hide command character</source>\n        <translation>Skrýt písmeno příkazu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"179\"/>\n        <source>External command</source>\n        <translation>Externí příkaz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"182\"/>\n        <source>Variable</source>\n        <translation>Proměnná</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"185\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCMake</name>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"181\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"184\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"187\"/>\n        <source>String</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"190\"/>\n        <source>Left quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"193\"/>\n        <source>Right quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"196\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"199\"/>\n        <source>Variable</source>\n        <translation type=\"unfinished\">Proměnná</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"202\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Nadpis</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"205\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"208\"/>\n        <source>WHILE block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"211\"/>\n        <source>FOREACH block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"214\"/>\n        <source>IF block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"217\"/>\n        <source>MACRO block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"220\"/>\n        <source>Variable within a string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"223\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCPP</name>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"340\"/>\n        <source>Default</source>\n        <translation>Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"343\"/>\n        <source>Inactive default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"346\"/>\n        <source>C comment</source>\n        <translation>C komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"349\"/>\n        <source>Inactive C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"352\"/>\n        <source>C++ comment</source>\n        <translation>C++ komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"355\"/>\n        <source>Inactive C++ comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"358\"/>\n        <source>JavaDoc style C comment</source>\n        <translation>JavaDoc styl C komentáře</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"361\"/>\n        <source>Inactive JavaDoc style C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"364\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"367\"/>\n        <source>Inactive number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"370\"/>\n        <source>Keyword</source>\n        <translation>Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"373\"/>\n        <source>Inactive keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"376\"/>\n        <source>Double-quoted string</source>\n        <translation>String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"379\"/>\n        <source>Inactive double-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"382\"/>\n        <source>Single-quoted string</source>\n        <translation>String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"385\"/>\n        <source>Inactive single-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"388\"/>\n        <source>IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"391\"/>\n        <source>Inactive IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"394\"/>\n        <source>Pre-processor block</source>\n        <translation>Pre-procesor blok</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"397\"/>\n        <source>Inactive pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"400\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"403\"/>\n        <source>Inactive operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"406\"/>\n        <source>Identifier</source>\n        <translation>Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"409\"/>\n        <source>Inactive identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"412\"/>\n        <source>Unclosed string</source>\n        <translation>Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"415\"/>\n        <source>Inactive unclosed string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"418\"/>\n        <source>C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"421\"/>\n        <source>Inactive C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"424\"/>\n        <source>JavaScript regular expression</source>\n        <translation type=\"unfinished\">JavaSript regulární výraz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"427\"/>\n        <source>Inactive JavaScript regular expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"430\"/>\n        <source>JavaDoc style C++ comment</source>\n        <translation>JavaDoc styl C++ komentáře</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"433\"/>\n        <source>Inactive JavaDoc style C++ comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"436\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Sekundární klíčová slova a identifikátory</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"439\"/>\n        <source>Inactive secondary keywords and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"442\"/>\n        <source>JavaDoc keyword</source>\n        <translation>JavaDoc klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"445\"/>\n        <source>Inactive JavaDoc keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"448\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>JavaDoc klíčové slovo chyby</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"451\"/>\n        <source>Inactive JavaDoc keyword error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"454\"/>\n        <source>Global classes and typedefs</source>\n        <translation>Globální třídy a definice typů</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"457\"/>\n        <source>Inactive global classes and typedefs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"460\"/>\n        <source>C++ raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"463\"/>\n        <source>Inactive C++ raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"466\"/>\n        <source>Vala triple-quoted verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"469\"/>\n        <source>Inactive Vala triple-quoted verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"472\"/>\n        <source>Pike hash-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"475\"/>\n        <source>Inactive Pike hash-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"478\"/>\n        <source>Pre-processor C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"481\"/>\n        <source>Inactive pre-processor C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"484\"/>\n        <source>JavaDoc style pre-processor comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"487\"/>\n        <source>Inactive JavaDoc style pre-processor comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSS</name>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"225\"/>\n        <source>Tag</source>\n        <translation>Tag</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"228\"/>\n        <source>Class selector</source>\n        <translation>Selektor třídy</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"231\"/>\n        <source>Pseudo-class</source>\n        <translation>Pseudotřída</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"234\"/>\n        <source>Unknown pseudo-class</source>\n        <translation>Nedefinovaná pseudotřída</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"237\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"240\"/>\n        <source>CSS1 property</source>\n        <translation>CSS1 vlastnost</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"243\"/>\n        <source>Unknown property</source>\n        <translation>Nedefinovaná vlastnost</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"246\"/>\n        <source>Value</source>\n        <translation>Hodnota</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"249\"/>\n        <source>ID selector</source>\n        <translation>ID selektor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"252\"/>\n        <source>Important</source>\n        <translation>Important</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"255\"/>\n        <source>@-rule</source>\n        <translation>@-pravidlo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"258\"/>\n        <source>Double-quoted string</source>\n        <translation>String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"261\"/>\n        <source>Single-quoted string</source>\n        <translation>String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"264\"/>\n        <source>CSS2 property</source>\n        <translation>CSS2 vlastnost</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"267\"/>\n        <source>Attribute</source>\n        <translation>Atribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"270\"/>\n        <source>CSS3 property</source>\n        <translation type=\"unfinished\">CSS2 vlastnost {3 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"273\"/>\n        <source>Pseudo-element</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"276\"/>\n        <source>Extended CSS property</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"279\"/>\n        <source>Extended pseudo-class</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"282\"/>\n        <source>Extended pseudo-element</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"285\"/>\n        <source>Media rule</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"288\"/>\n        <source>Variable</source>\n        <translation type=\"unfinished\">Proměnná</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSharp</name>\n    <message>\n        <location filename=\"qscilexercsharp.cpp\" line=\"95\"/>\n        <source>Verbatim string</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCoffeeScript</name>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"244\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"247\"/>\n        <source>C-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"250\"/>\n        <source>C++-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"253\"/>\n        <source>JavaDoc C-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"256\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"259\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"262\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"265\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"268\"/>\n        <source>IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"271\"/>\n        <source>Pre-processor block</source>\n        <translation type=\"unfinished\">Pre-procesor blok</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"274\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"277\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"280\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"283\"/>\n        <source>C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"286\"/>\n        <source>Regular expression</source>\n        <translation type=\"unfinished\">Regulární výraz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"289\"/>\n        <source>JavaDoc C++-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"292\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation type=\"unfinished\">Sekundární klíčová slova a identifikátory</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"295\"/>\n        <source>JavaDoc keyword</source>\n        <translation type=\"unfinished\">JavaDoc klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword error</source>\n        <translation type=\"unfinished\">JavaDoc klíčové slovo chyby</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"301\"/>\n        <source>Global classes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"304\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"307\"/>\n        <source>Block regular expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"310\"/>\n        <source>Block regular expression comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerD</name>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"259\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"262\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"265\"/>\n        <source>DDoc style block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"268\"/>\n        <source>Nesting comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"271\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"274\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"277\"/>\n        <source>Secondary keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"280\"/>\n        <source>Documentation keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"283\"/>\n        <source>Type definition</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"286\"/>\n        <source>String</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"289\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"292\"/>\n        <source>Character</source>\n        <translation type=\"unfinished\">Znak</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"301\"/>\n        <source>DDoc style line comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"304\"/>\n        <source>DDoc keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"307\"/>\n        <source>DDoc keyword error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"310\"/>\n        <source>Backquoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"313\"/>\n        <source>Raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"316\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Definováno uživatelem 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"319\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Definováno uživatelem 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"322\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Definováno uživatelem 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerDiff</name>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"92\"/>\n        <source>Default</source>\n        <translation>Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"95\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"98\"/>\n        <source>Command</source>\n        <translation>Příkaz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"101\"/>\n        <source>Header</source>\n        <translation>Hlavička</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"104\"/>\n        <source>Position</source>\n        <translation>Pozice</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"107\"/>\n        <source>Removed line</source>\n        <translation>Odebraná řádka</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"110\"/>\n        <source>Added line</source>\n        <translation>Přidaná řádka</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"113\"/>\n        <source>Changed line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerFortran77</name>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"176\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"179\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"182\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"185\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"188\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"191\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"194\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"197\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"200\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"203\"/>\n        <source>Intrinsic function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"206\"/>\n        <source>Extended function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"209\"/>\n        <source>Pre-processor block</source>\n        <translation type=\"unfinished\">Pre-procesor blok</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"212\"/>\n        <source>Dotted operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"215\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Nadpis</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"218\"/>\n        <source>Continuation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerHTML</name>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"553\"/>\n        <source>HTML default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"556\"/>\n        <source>Tag</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"559\"/>\n        <source>Unknown tag</source>\n        <translation>Nedefinovaný tag</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"562\"/>\n        <source>Attribute</source>\n        <translation>Atribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"565\"/>\n        <source>Unknown attribute</source>\n        <translation>Nedefinovaný atribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"568\"/>\n        <source>HTML number</source>\n        <translation>HTML číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"571\"/>\n        <source>HTML double-quoted string</source>\n        <translation>HTML string ve dojtých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"574\"/>\n        <source>HTML single-quoted string</source>\n        <translation>HTML string v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"577\"/>\n        <source>Other text in a tag</source>\n        <translation>Další text v tagu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"580\"/>\n        <source>HTML comment</source>\n        <translation>HTML komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"583\"/>\n        <source>Entity</source>\n        <translation>Entita</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"586\"/>\n        <source>End of a tag</source>\n        <translation>Konec tagu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"589\"/>\n        <source>Start of an XML fragment</source>\n        <translation>Začátek XML části</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"592\"/>\n        <source>End of an XML fragment</source>\n        <translation>Konec XML části</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"595\"/>\n        <source>Script tag</source>\n        <translation>Tag skriptu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"598\"/>\n        <source>Start of an ASP fragment with @</source>\n        <translation>Začátek ASP kódu s @</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"601\"/>\n        <source>Start of an ASP fragment</source>\n        <translation>Začátek ASP kódu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"604\"/>\n        <source>CDATA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"607\"/>\n        <source>Start of a PHP fragment</source>\n        <translation>Začátek PHP kódu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"610\"/>\n        <source>Unquoted HTML value</source>\n        <translation>HTML hodnota bez uvozovek</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"613\"/>\n        <source>ASP X-Code comment</source>\n        <translation>ASP X-Code komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"616\"/>\n        <source>SGML default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"619\"/>\n        <source>SGML command</source>\n        <translation>SGML příkaz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"622\"/>\n        <source>First parameter of an SGML command</source>\n        <translation>První parametr v SGML příkazu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"625\"/>\n        <source>SGML double-quoted string</source>\n        <translation>SGML string ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"628\"/>\n        <source>SGML single-quoted string</source>\n        <translation>SGML string v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"631\"/>\n        <source>SGML error</source>\n        <translation>SGML chyba</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"634\"/>\n        <source>SGML special entity</source>\n        <translation>SGML speciální entita</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"637\"/>\n        <source>SGML comment</source>\n        <translation>SGML komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"640\"/>\n        <source>First parameter comment of an SGML command</source>\n        <translation>Komentář prvního parametru SGML příkazu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"643\"/>\n        <source>SGML block default</source>\n        <translation>SGML defaultní blok</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"646\"/>\n        <source>Start of a JavaScript fragment</source>\n        <translation>Začátek JavaScript kódu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"649\"/>\n        <source>JavaScript default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"652\"/>\n        <source>JavaScript comment</source>\n        <translation>JavaScript komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"655\"/>\n        <source>JavaScript line comment</source>\n        <translation>JavaScript jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"658\"/>\n        <source>JavaDoc style JavaScript comment</source>\n        <translation>JavaDoc styl JavaScript komentáře</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"661\"/>\n        <source>JavaScript number</source>\n        <translation>JavaScript číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"664\"/>\n        <source>JavaScript word</source>\n        <translation>JavaSript slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"667\"/>\n        <source>JavaScript keyword</source>\n        <translation>JavaSript klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"670\"/>\n        <source>JavaScript double-quoted string</source>\n        <translation>JavaSript string ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"673\"/>\n        <source>JavaScript single-quoted string</source>\n        <translation>JavaSript string v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"676\"/>\n        <source>JavaScript symbol</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"679\"/>\n        <source>JavaScript unclosed string</source>\n        <translation>JavaSript neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"682\"/>\n        <source>JavaScript regular expression</source>\n        <translation>JavaSript regulární výraz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"685\"/>\n        <source>Start of an ASP JavaScript fragment</source>\n        <translation>Začátek ASP JavaScript kódu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"688\"/>\n        <source>ASP JavaScript default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"691\"/>\n        <source>ASP JavaScript comment</source>\n        <translation>ASP JavaScript komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"694\"/>\n        <source>ASP JavaScript line comment</source>\n        <translation>ASP JavaScript jednořádkový komenář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"697\"/>\n        <source>JavaDoc style ASP JavaScript comment</source>\n        <translation>JavaDoc styl ASP JavaScript komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"700\"/>\n        <source>ASP JavaScript number</source>\n        <translation>ASP JavaScript číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"703\"/>\n        <source>ASP JavaScript word</source>\n        <translation>ASP JavaScript slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"706\"/>\n        <source>ASP JavaScript keyword</source>\n        <translation>ASP JavaScript klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"709\"/>\n        <source>ASP JavaScript double-quoted string</source>\n        <translation>ASP JavaScript string ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"712\"/>\n        <source>ASP JavaScript single-quoted string</source>\n        <translation>ASP JavaScript v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"715\"/>\n        <source>ASP JavaScript symbol</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"718\"/>\n        <source>ASP JavaScript unclosed string</source>\n        <translation>ASP JavaScript neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"721\"/>\n        <source>ASP JavaScript regular expression</source>\n        <translation>ASP JavaScript regulární výraz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"724\"/>\n        <source>Start of a VBScript fragment</source>\n        <translation>Začátek VBScript kódu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"727\"/>\n        <source>VBScript default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"730\"/>\n        <source>VBScript comment</source>\n        <translation>VBScript komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"733\"/>\n        <source>VBScript number</source>\n        <translation>VBScript číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"736\"/>\n        <source>VBScript keyword</source>\n        <translation>VBScript klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"739\"/>\n        <source>VBScript string</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"742\"/>\n        <source>VBScript identifier</source>\n        <translation>VBScript identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"745\"/>\n        <source>VBScript unclosed string</source>\n        <translation>VBScript neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"748\"/>\n        <source>Start of an ASP VBScript fragment</source>\n        <translation>Začátek ASP VBScript kódu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"751\"/>\n        <source>ASP VBScript default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"754\"/>\n        <source>ASP VBScript comment</source>\n        <translation>ASP VBScript komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"757\"/>\n        <source>ASP VBScript number</source>\n        <translation>ASP VBScript číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"760\"/>\n        <source>ASP VBScript keyword</source>\n        <translation>ASP VBScript klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"763\"/>\n        <source>ASP VBScript string</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"766\"/>\n        <source>ASP VBScript identifier</source>\n        <translation>ASP VBScript identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"769\"/>\n        <source>ASP VBScript unclosed string</source>\n        <translation>ASP VBScript neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"772\"/>\n        <source>Start of a Python fragment</source>\n        <translation>Začátek Python kódu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"775\"/>\n        <source>Python default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"778\"/>\n        <source>Python comment</source>\n        <translation>Python komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"781\"/>\n        <source>Python number</source>\n        <translation>Python číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"784\"/>\n        <source>Python double-quoted string</source>\n        <translation>Python string ve dojtých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"787\"/>\n        <source>Python single-quoted string</source>\n        <translation>Python string v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"790\"/>\n        <source>Python keyword</source>\n        <translation>Python klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"793\"/>\n        <source>Python triple double-quoted string</source>\n        <translation>Python string ve třech dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"796\"/>\n        <source>Python triple single-quoted string</source>\n        <translation>Python ve třech jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"799\"/>\n        <source>Python class name</source>\n        <translation>Python jméno třídy</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"802\"/>\n        <source>Python function or method name</source>\n        <translation>Python jméno funkce nebo metody</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"805\"/>\n        <source>Python operator</source>\n        <translation>Python operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"808\"/>\n        <source>Python identifier</source>\n        <translation>Python identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"811\"/>\n        <source>Start of an ASP Python fragment</source>\n        <translation>Začátek ASP Python kódu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"814\"/>\n        <source>ASP Python default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"817\"/>\n        <source>ASP Python comment</source>\n        <translation>ASP Python komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"820\"/>\n        <source>ASP Python number</source>\n        <translation>ASP Python číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"823\"/>\n        <source>ASP Python double-quoted string</source>\n        <translation>ASP Python string ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"826\"/>\n        <source>ASP Python single-quoted string</source>\n        <translation>ASP Python v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"829\"/>\n        <source>ASP Python keyword</source>\n        <translation>ASP Python klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"832\"/>\n        <source>ASP Python triple double-quoted string</source>\n        <translation>ASP Python ve třech dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"835\"/>\n        <source>ASP Python triple single-quoted string</source>\n        <translation>ASP Python ve třech jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"838\"/>\n        <source>ASP Python class name</source>\n        <translation>ASP Python jméno třídy</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"841\"/>\n        <source>ASP Python function or method name</source>\n        <translation>ASP Python jméno funkce  nebo metody</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"844\"/>\n        <source>ASP Python operator</source>\n        <translation>ASP Python operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"847\"/>\n        <source>ASP Python identifier</source>\n        <translation>ASP Python identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"850\"/>\n        <source>PHP default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"853\"/>\n        <source>PHP double-quoted string</source>\n        <translation>PHP string ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"856\"/>\n        <source>PHP single-quoted string</source>\n        <translation>PHP v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"859\"/>\n        <source>PHP keyword</source>\n        <translation>PHP klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"862\"/>\n        <source>PHP number</source>\n        <translation>PHP číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"865\"/>\n        <source>PHP variable</source>\n        <translation>PHP proměnná</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"868\"/>\n        <source>PHP comment</source>\n        <translation>PHP komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"871\"/>\n        <source>PHP line comment</source>\n        <translation>PHP jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"874\"/>\n        <source>PHP double-quoted variable</source>\n        <translation>PHP proměnná ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"877\"/>\n        <source>PHP operator</source>\n        <translation>PHP operátor</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerIDL</name>\n    <message>\n        <location filename=\"qscilexeridl.cpp\" line=\"87\"/>\n        <source>UUID</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerJavaScript</name>\n    <message>\n        <location filename=\"qscilexerjavascript.cpp\" line=\"97\"/>\n        <source>Regular expression</source>\n        <translation>Regulární výraz</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerLua</name>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"218\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"221\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"224\"/>\n        <source>Line comment</source>\n        <translation>Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"227\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"230\"/>\n        <source>Keyword</source>\n        <translation>Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"233\"/>\n        <source>String</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"236\"/>\n        <source>Character</source>\n        <translation>Znak</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"239\"/>\n        <source>Literal string</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"242\"/>\n        <source>Preprocessor</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"245\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"248\"/>\n        <source>Identifier</source>\n        <translation>Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"251\"/>\n        <source>Unclosed string</source>\n        <translation>Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"254\"/>\n        <source>Basic functions</source>\n        <translation>Základní funkce</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"257\"/>\n        <source>String, table and maths functions</source>\n        <translation>String, tabulka a matematické funkce</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"260\"/>\n        <source>Coroutines, i/o and system facilities</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"263\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Definováno uživatelem 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"266\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Definováno uživatelem 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"269\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Definováno uživatelem 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"272\"/>\n        <source>User defined 4</source>\n        <translation type=\"unfinished\">Definováno uživatelem 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"275\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Nadpis</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMakefile</name>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"116\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"119\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"122\"/>\n        <source>Preprocessor</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"125\"/>\n        <source>Variable</source>\n        <translation>Proměnná</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"128\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"131\"/>\n        <source>Target</source>\n        <translation>Cíl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"134\"/>\n        <source>Error</source>\n        <translation>Chyba</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMatlab</name>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"123\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"126\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"129\"/>\n        <source>Command</source>\n        <translation type=\"unfinished\">Příkaz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"132\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"135\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"138\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"141\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"144\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"147\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">String ve dvojitých uvozovkách</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPO</name>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"90\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"93\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"96\"/>\n        <source>Message identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"99\"/>\n        <source>Message identifier text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"102\"/>\n        <source>Message string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"105\"/>\n        <source>Message string text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"108\"/>\n        <source>Message context</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"111\"/>\n        <source>Message context text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"114\"/>\n        <source>Fuzzy flag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"117\"/>\n        <source>Programmer comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"120\"/>\n        <source>Reference</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"123\"/>\n        <source>Flags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"126\"/>\n        <source>Message identifier text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"129\"/>\n        <source>Message string text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"132\"/>\n        <source>Message context text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPOV</name>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"267\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"270\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"273\"/>\n        <source>Comment line</source>\n        <translation>Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"276\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"279\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"282\"/>\n        <source>Identifier</source>\n        <translation>Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"285\"/>\n        <source>String</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"288\"/>\n        <source>Unclosed string</source>\n        <translation>Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"291\"/>\n        <source>Directive</source>\n        <translation>Direktiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"294\"/>\n        <source>Bad directive</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"297\"/>\n        <source>Objects, CSG and appearance</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"300\"/>\n        <source>Types, modifiers and items</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"303\"/>\n        <source>Predefined identifiers</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"306\"/>\n        <source>Predefined functions</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"309\"/>\n        <source>User defined 1</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"312\"/>\n        <source>User defined 2</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"315\"/>\n        <source>User defined 3</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPascal</name>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"246\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"258\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"267\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"273\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"276\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"285\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"249\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"252\"/>\n        <source>&apos;{ ... }&apos; style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"255\"/>\n        <source>&apos;(* ... *)&apos; style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"261\"/>\n        <source>&apos;{$ ... }&apos; style pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"264\"/>\n        <source>&apos;(*$ ... *)&apos; style pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"270\"/>\n        <source>Hexadecimal number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"279\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"282\"/>\n        <source>Character</source>\n        <translation type=\"unfinished\">Znak</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"288\"/>\n        <source>Inline asm</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPerl</name>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"318\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"321\"/>\n        <source>Error</source>\n        <translation>Chyba</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"324\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"327\"/>\n        <source>POD</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"330\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"333\"/>\n        <source>Keyword</source>\n        <translation>Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"336\"/>\n        <source>Double-quoted string</source>\n        <translation>String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"339\"/>\n        <source>Single-quoted string</source>\n        <translation>String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"342\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"345\"/>\n        <source>Identifier</source>\n        <translation>Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"348\"/>\n        <source>Scalar</source>\n        <translation>Skalár</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"351\"/>\n        <source>Array</source>\n        <translation>Pole</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"354\"/>\n        <source>Hash</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"357\"/>\n        <source>Symbol table</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"360\"/>\n        <source>Regular expression</source>\n        <translation>Regulární výraz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"363\"/>\n        <source>Substitution</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"366\"/>\n        <source>Backticks</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"369\"/>\n        <source>Data section</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"372\"/>\n        <source>Here document delimiter</source>\n        <translation>Zde je oddělovač dokumentu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"375\"/>\n        <source>Single-quoted here document</source>\n        <translation>Zde je dokument v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"378\"/>\n        <source>Double-quoted here document</source>\n        <translation>Zde je dokument ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"381\"/>\n        <source>Backtick here document</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"384\"/>\n        <source>Quoted string (q)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"387\"/>\n        <source>Quoted string (qq)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"390\"/>\n        <source>Quoted string (qx)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"393\"/>\n        <source>Quoted string (qr)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"396\"/>\n        <source>Quoted string (qw)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"399\"/>\n        <source>POD verbatim</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"402\"/>\n        <source>Subroutine prototype</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"405\"/>\n        <source>Format identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"408\"/>\n        <source>Format body</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"411\"/>\n        <source>Double-quoted string (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"414\"/>\n        <source>Translation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"417\"/>\n        <source>Regular expression (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"420\"/>\n        <source>Substitution (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"423\"/>\n        <source>Backticks (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"426\"/>\n        <source>Double-quoted here document (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"429\"/>\n        <source>Backtick here document (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"432\"/>\n        <source>Quoted string (qq, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"435\"/>\n        <source>Quoted string (qx, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"438\"/>\n        <source>Quoted string (qr, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPostScript</name>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"249\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"252\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"255\"/>\n        <source>DSC comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"258\"/>\n        <source>DSC comment value</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"261\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"264\"/>\n        <source>Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"267\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"270\"/>\n        <source>Literal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"273\"/>\n        <source>Immediately evaluated literal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"276\"/>\n        <source>Array parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"279\"/>\n        <source>Dictionary parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"282\"/>\n        <source>Procedure parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"285\"/>\n        <source>Text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"288\"/>\n        <source>Hexadecimal string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"291\"/>\n        <source>Base85 string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"294\"/>\n        <source>Bad string character</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerProperties</name>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"111\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"114\"/>\n        <source>Comment</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"117\"/>\n        <source>Section</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"120\"/>\n        <source>Assignment</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"123\"/>\n        <source>Default value</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"126\"/>\n        <source>Key</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPython</name>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"225\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"228\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"231\"/>\n        <source>Double-quoted string</source>\n        <translation>String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"234\"/>\n        <source>Single-quoted string</source>\n        <translation>String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"237\"/>\n        <source>Keyword</source>\n        <translation>Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"240\"/>\n        <source>Triple single-quoted string</source>\n        <translation>String ve třech jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"243\"/>\n        <source>Triple double-quoted string</source>\n        <translation>String ve třech dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"246\"/>\n        <source>Class name</source>\n        <translation>Jméno třídy</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"249\"/>\n        <source>Function or method name</source>\n        <translation>Jméno funkce nebo metody</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"252\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"255\"/>\n        <source>Identifier</source>\n        <translation>Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"258\"/>\n        <source>Comment block</source>\n        <translation>Blok komentáře</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"261\"/>\n        <source>Unclosed string</source>\n        <translation>Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"264\"/>\n        <source>Highlighted identifier</source>\n        <translation>Zvýrazněný identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"267\"/>\n        <source>Decorator</source>\n        <translation>Dekorátor</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerRuby</name>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"239\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"245\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"251\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"257\"/>\n        <source>Double-quoted string</source>\n        <translation>String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"260\"/>\n        <source>Single-quoted string</source>\n        <translation>String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"254\"/>\n        <source>Keyword</source>\n        <translation>Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"263\"/>\n        <source>Class name</source>\n        <translation>Jméno třídy</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"266\"/>\n        <source>Function or method name</source>\n        <translation>Jméno funkce nebo metody</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"269\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"272\"/>\n        <source>Identifier</source>\n        <translation>Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"242\"/>\n        <source>Error</source>\n        <translation>Chyba</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"248\"/>\n        <source>POD</source>\n        <translation>POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"275\"/>\n        <source>Regular expression</source>\n        <translation>Regulární výraz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"278\"/>\n        <source>Global</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"281\"/>\n        <source>Symbol</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"284\"/>\n        <source>Module name</source>\n        <translation>Jméno modulu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"287\"/>\n        <source>Instance variable</source>\n        <translation>Proměnná instance</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"290\"/>\n        <source>Class variable</source>\n        <translation>Proměnná třídy</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"293\"/>\n        <source>Backticks</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"296\"/>\n        <source>Data section</source>\n        <translation>Datová sekce</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"299\"/>\n        <source>Here document delimiter</source>\n        <translation>Zde je oddělovač dokumentu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"302\"/>\n        <source>Here document</source>\n        <translation>Zde je dokument</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"305\"/>\n        <source>%q string</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"308\"/>\n        <source>%Q string</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"311\"/>\n        <source>%x string</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"314\"/>\n        <source>%r string</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"317\"/>\n        <source>%w string</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"320\"/>\n        <source>Demoted keyword</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"323\"/>\n        <source>stdin</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"326\"/>\n        <source>stdout</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"329\"/>\n        <source>stderr</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSQL</name>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"259\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"268\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"271\"/>\n        <source>Keyword</source>\n        <translation>Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"277\"/>\n        <source>Single-quoted string</source>\n        <translation>String v jednoduchých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"286\"/>\n        <source>Operator</source>\n        <translation>Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"289\"/>\n        <source>Identifier</source>\n        <translation>Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"262\"/>\n        <source>Comment line</source>\n        <translation>Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"265\"/>\n        <source>JavaDoc style comment</source>\n        <translation>JavaDoc styl komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"274\"/>\n        <source>Double-quoted string</source>\n        <translation>String ve dvojitých uvozovkách</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"280\"/>\n        <source>SQL*Plus keyword</source>\n        <translation>SQL*Plus klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"283\"/>\n        <source>SQL*Plus prompt</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"292\"/>\n        <source>SQL*Plus comment</source>\n        <translation>SQL*Plus komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"295\"/>\n        <source># comment line</source>\n        <translation># jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword</source>\n        <translation>JavaDoc klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"301\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>JavaDoc klíčové slovo chyby</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"304\"/>\n        <source>User defined 1</source>\n        <translation>Definováno uživatelem 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"307\"/>\n        <source>User defined 2</source>\n        <translation>Definováno uživatelem 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"310\"/>\n        <source>User defined 3</source>\n        <translation>Definováno uživatelem 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"313\"/>\n        <source>User defined 4</source>\n        <translation>Definováno uživatelem 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"316\"/>\n        <source>Quoted identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSpice</name>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"156\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"159\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"162\"/>\n        <source>Command</source>\n        <translation type=\"unfinished\">Příkaz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"165\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"168\"/>\n        <source>Parameter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"171\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"174\"/>\n        <source>Delimiter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"177\"/>\n        <source>Value</source>\n        <translation type=\"unfinished\">Hodnota</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"180\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTCL</name>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"283\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"286\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"289\"/>\n        <source>Comment line</source>\n        <translation type=\"unfinished\">Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"295\"/>\n        <source>Quoted keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"298\"/>\n        <source>Quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"301\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"304\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"307\"/>\n        <source>Substitution</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"310\"/>\n        <source>Brace substitution</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"313\"/>\n        <source>Modifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"316\"/>\n        <source>Expand keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"319\"/>\n        <source>TCL keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"322\"/>\n        <source>Tk keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"325\"/>\n        <source>iTCL keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"328\"/>\n        <source>Tk command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"331\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Definováno uživatelem 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"334\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Definováno uživatelem 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"337\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Definováno uživatelem 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"340\"/>\n        <source>User defined 4</source>\n        <translation type=\"unfinished\">Definováno uživatelem 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"343\"/>\n        <source>Comment box</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"346\"/>\n        <source>Comment block</source>\n        <translation type=\"unfinished\">Blok komentáře</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTeX</name>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"177\"/>\n        <source>Default</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"180\"/>\n        <source>Special</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"183\"/>\n        <source>Group</source>\n        <translation>Skupina</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"186\"/>\n        <source>Symbol</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"189\"/>\n        <source>Command</source>\n        <translation>Příkaz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"192\"/>\n        <source>Text</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVHDL</name>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"197\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"200\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"203\"/>\n        <source>Comment line</source>\n        <translation type=\"unfinished\">Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"206\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"209\"/>\n        <source>String</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"212\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"215\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"218\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"221\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"224\"/>\n        <source>Standard operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"227\"/>\n        <source>Attribute</source>\n        <translation type=\"unfinished\">Atribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"230\"/>\n        <source>Standard function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"233\"/>\n        <source>Standard package</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"236\"/>\n        <source>Standard type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"239\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVerilog</name>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"209\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"212\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"215\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Jednořádkový komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"218\"/>\n        <source>Bang comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"221\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"224\"/>\n        <source>Primary keywords and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"227\"/>\n        <source>String</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"230\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation type=\"unfinished\">Sekundární klíčová slova a identifikátory</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"233\"/>\n        <source>System task</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"236\"/>\n        <source>Preprocessor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"239\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"242\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"245\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Neuzavřený string</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"248\"/>\n        <source>User defined tasks and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerYAML</name>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"161\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Default</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"164\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"167\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identifikátor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Klíčové slovo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"173\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"176\"/>\n        <source>Reference</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"179\"/>\n        <source>Document delimiter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"182\"/>\n        <source>Text block marker</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"185\"/>\n        <source>Syntax error marker</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"188\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operátor</translation>\n    </message>\n</context>\n<context>\n    <name>QsciScintilla</name>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4359\"/>\n        <source>&amp;Undo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4363\"/>\n        <source>&amp;Redo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4369\"/>\n        <source>Cu&amp;t</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4374\"/>\n        <source>&amp;Copy</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4380\"/>\n        <source>&amp;Paste</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4384\"/>\n        <source>Delete</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4391\"/>\n        <source>Select All</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscintilla_de.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.0\" language=\"de\">\n<context>\n    <name>QsciCommand</name>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"175\"/>\n        <source>Move left one character</source>\n        <translation>Ein Zeichen nach links</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"207\"/>\n        <source>Move right one character</source>\n        <translation>Ein Zeichen nach rechts</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"81\"/>\n        <source>Move up one line</source>\n        <translation>Eine Zeile nach oben</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"44\"/>\n        <source>Move down one line</source>\n        <translation>Eine Zeile nach unten</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"305\"/>\n        <source>Move left one word part</source>\n        <translation>Ein Wortteil nach links</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"318\"/>\n        <source>Move right one word part</source>\n        <translation>Ein Wortteil nach rechts</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"239\"/>\n        <source>Move left one word</source>\n        <translation>Ein Wort nach links</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"259\"/>\n        <source>Move right one word</source>\n        <translation>Ein Wort nach rechts</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"71\"/>\n        <source>Scroll view down one line</source>\n        <translation>Eine Zeile nach unten rollen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"108\"/>\n        <source>Scroll view up one line</source>\n        <translation>Eine Zeile nach oben rollen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"558\"/>\n        <source>Move up one page</source>\n        <translation>Eine Seite hoch</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"593\"/>\n        <source>Move down one page</source>\n        <translation>Eine Seite nach unten</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"824\"/>\n        <source>Indent one level</source>\n        <translation>Eine Ebene einrücken</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"185\"/>\n        <source>Extend selection left one character</source>\n        <translation>Auswahl um ein Zeichen nach links erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"217\"/>\n        <source>Extend selection right one character</source>\n        <translation>Auswahl um ein Zeichen nach rechts erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"91\"/>\n        <source>Extend selection up one line</source>\n        <translation>Auswahl um eine Zeile nach oben erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"54\"/>\n        <source>Extend selection down one line</source>\n        <translation>Auswahl um eine Zeile nach unten erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"311\"/>\n        <source>Extend selection left one word part</source>\n        <translation>Auswahl um einen Wortteil nach links erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"324\"/>\n        <source>Extend selection right one word part</source>\n        <translation>Auswahl um einen Wortteil nach rechts erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"249\"/>\n        <source>Extend selection left one word</source>\n        <translation>Auswahl um ein Wort nach links erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"265\"/>\n        <source>Extend selection right one word</source>\n        <translation>Auswahl um ein Wort nach rechts erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"568\"/>\n        <source>Extend selection up one page</source>\n        <translation>Auswahl um eine Seite nach oben erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"607\"/>\n        <source>Extend selection down one page</source>\n        <translation>Auswahl um eine Seite nach unten erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"668\"/>\n        <source>Delete previous character</source>\n        <translation>Zeichen links löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"658\"/>\n        <source>Delete current character</source>\n        <translation>Aktuelles Zeichen löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"681\"/>\n        <source>Delete word to left</source>\n        <translation>Wort links löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"687\"/>\n        <source>Delete word to right</source>\n        <translation>Wort rechts löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"704\"/>\n        <source>Delete line to left</source>\n        <translation>Zeile links löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"714\"/>\n        <source>Delete line to right</source>\n        <translation>Zeile rechts löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"720\"/>\n        <source>Delete current line</source>\n        <translation>Aktuelle Zeile löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"726\"/>\n        <source>Cut current line</source>\n        <translation>Aktuelle Zeile ausschneiden</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"788\"/>\n        <source>Cut selection</source>\n        <translation>Auswahl ausschneiden</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"794\"/>\n        <source>Copy selection</source>\n        <translation>Auswahl kopieren</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"800\"/>\n        <source>Paste</source>\n        <translation>Einfügen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"852\"/>\n        <source>Redo last command</source>\n        <translation>Letzten Befehl wiederholen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"836\"/>\n        <source>Cancel</source>\n        <translation>Abbrechen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"806\"/>\n        <source>Toggle insert/overtype</source>\n        <translation>Einfügen/Überschreiben umschalten</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"118\"/>\n        <source>Scroll to start of document</source>\n        <translation>Zum Dokumentenanfang rollen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"128\"/>\n        <source>Scroll to end of document</source>\n        <translation>Zum Dokumentenende rollen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"138\"/>\n        <source>Scroll vertically to centre current line</source>\n        <translation>Vertical rollen, um aktuelle Zeile zu zentrieren</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"271\"/>\n        <source>Move to end of previous word</source>\n        <translation>Zum Ende des vorigen Wortes springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"277\"/>\n        <source>Extend selection to end of previous word</source>\n        <translation>Auswahl bis zum Ende des vorigen Wortes erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"288\"/>\n        <source>Move to end of next word</source>\n        <translation>Zum Ende des nächsten Wortes springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"298\"/>\n        <source>Extend selection to end of next word</source>\n        <translation>Auswahl bis zum Ende des nächsten Wortes erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"335\"/>\n        <source>Move to start of document line</source>\n        <translation>Zum Beginn der Dokumentenzeile springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"345\"/>\n        <source>Extend selection to start of document line</source>\n        <translation>Auswahl zum Beginn der Dokumentenzeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"356\"/>\n        <source>Extend rectangular selection to start of document line</source>\n        <translation>Rechteckige Auswahl zum Beginn der Dokumentenzeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"367\"/>\n        <source>Move to start of display line</source>\n        <translation>Zum Beginn der Anzeigezeile springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"377\"/>\n        <source>Extend selection to start of display line</source>\n        <translation>Auswahl zum Beginn der Anzeigezeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"384\"/>\n        <source>Move to start of display or document line</source>\n        <translation>Zum Beginn der Dokumenten- oder Anzeigezeile springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"391\"/>\n        <source>Extend selection to start of display or document line</source>\n        <translation>Rechteckige Auswahl zum Beginn der Dokumenten- oder Anzeigezeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"402\"/>\n        <source>Move to first visible character in document line</source>\n        <translation>Zum ersten sichtbaren Zeichen der Dokumentzeile springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"413\"/>\n        <source>Extend selection to first visible character in document line</source>\n        <translation>Auswahl zum ersten sichtbaren Zeichen der Dokumentzeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"424\"/>\n        <source>Extend rectangular selection to first visible character in document line</source>\n        <translation>Rechteckige Auswahl zum ersten sichtbaren Zeichen der Dokumentzeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"431\"/>\n        <source>Move to first visible character of display in document line</source>\n        <translation>Zum ersten angezeigten Zeichen der Dokumentzeile springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"438\"/>\n        <source>Extend selection to first visible character in display or document line</source>\n        <translation>Auswahl zum ersten sichtbaren Zeichen der Dokument- oder Anzeigezeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"449\"/>\n        <source>Move to end of document line</source>\n        <translation>Zum Ende der Dokumentzeile springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"459\"/>\n        <source>Extend selection to end of document line</source>\n        <translation>Auswahl zum Ende der Dokumentenzeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"470\"/>\n        <source>Extend rectangular selection to end of document line</source>\n        <translation>Rechteckige Auswahl zum Ende der Dokumentenzeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"481\"/>\n        <source>Move to end of display line</source>\n        <translation>Zum Ende der Anzeigezeile springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"491\"/>\n        <source>Extend selection to end of display line</source>\n        <translation>Auswahl zum Ende der Anzeigezeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"498\"/>\n        <source>Move to end of display or document line</source>\n        <translation>Zum Ende der Dokumenten- oder Anzeigezeile springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"505\"/>\n        <source>Extend selection to end of display or document line</source>\n        <translation>Rechteckige Auswahl zum Ende der Dokumenten- oder Anzeigezeile erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"516\"/>\n        <source>Move to start of document</source>\n        <translation>Zum Dokumentenanfang springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"526\"/>\n        <source>Extend selection to start of document</source>\n        <translation>Auswahl zum Dokumentenanfang erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"537\"/>\n        <source>Move to end of document</source>\n        <translation>Zum Dokumentenende springen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"547\"/>\n        <source>Extend selection to end of document</source>\n        <translation>Auswahl zum Dokumentenende erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"628\"/>\n        <source>Stuttered move up one page</source>\n        <translation>&quot;Stotternd&quot; um eine Seite nach oben</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"634\"/>\n        <source>Stuttered extend selection up one page</source>\n        <translation>Auswahl &quot;stotternd&quot; um eine Seite nach oben erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"641\"/>\n        <source>Stuttered move down one page</source>\n        <translation>&quot;Stotternd&quot; um eine Seite nach unten</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"647\"/>\n        <source>Stuttered extend selection down one page</source>\n        <translation>Auswahl &quot;stotternd&quot; um eine Seite nach unten erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"674\"/>\n        <source>Delete previous character if not at start of line</source>\n        <translation>Zeichen links löschen, wenn nicht am Zeilenanfang</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"697\"/>\n        <source>Delete right to end of next word</source>\n        <translation>Rechts bis zum Ende des nächsten Wortes löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"738\"/>\n        <source>Transpose current and previous lines</source>\n        <translation>Aktuelle und vorherige Zeile tauschen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"745\"/>\n        <source>Duplicate the current line</source>\n        <translation>Aktuelle Zeile duplizieren</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"751\"/>\n        <source>Select all</source>\n        <oldsource>Select document</oldsource>\n        <translation>Alle auswählen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"757\"/>\n        <source>Move selected lines up one line</source>\n        <translation>Ausgewählte Zeilen um eine Zeile nach oben</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"763\"/>\n        <source>Move selected lines down one line</source>\n        <translation>Ausgewählte Zeilen um eine Zeile nach unten</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"776\"/>\n        <source>Convert selection to lower case</source>\n        <translation>Auswahl in Kleinbuchstaben umwandeln</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"782\"/>\n        <source>Convert selection to upper case</source>\n        <translation>Auswahl in Großbuchstaben umwandeln</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"812\"/>\n        <source>Insert newline</source>\n        <translation>Neue Zeile einfügen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"830\"/>\n        <source>De-indent one level</source>\n        <translation>Eine Ebene ausrücken</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"842\"/>\n        <source>Undo last command</source>\n        <translation>Letzten Befehl rückgängig machen</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"858\"/>\n        <source>Zoom in</source>\n        <translation>Vergrößern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"864\"/>\n        <source>Zoom out</source>\n        <translation>Verkleinern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"158\"/>\n        <source>Move up one paragraph</source>\n        <translation>Einen Absatz nach oben</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"145\"/>\n        <source>Move down one paragraph</source>\n        <translation>Einen Absatz nach unten</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"164\"/>\n        <source>Extend selection up one paragraph</source>\n        <translation>Auswahl um einen Absatz nach oben erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"151\"/>\n        <source>Extend selection down one paragraph</source>\n        <translation>Auswahl um einen Absatz nach unten erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"732\"/>\n        <source>Copy current line</source>\n        <translation>Aktuelle Zeile kopieren</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"64\"/>\n        <source>Extend rectangular selection down one line</source>\n        <translation>Rechteckige Auswahl um eine Zeile nach unten erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"101\"/>\n        <source>Extend rectangular selection up one line</source>\n        <translation>Rechteckige Auswahl um eine Zeile nach oben erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"196\"/>\n        <source>Extend rectangular selection left one character</source>\n        <translation>Rechteckige Auswahl um ein Zeichen nach links erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"228\"/>\n        <source>Extend rectangular selection right one character</source>\n        <translation>Rechteckige Auswahl um ein Zeichen nach rechts erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"578\"/>\n        <source>Extend rectangular selection up one page</source>\n        <translation>Rechteckige Auswahl um eine Seite nach oben erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"621\"/>\n        <source>Extend rectangular selection down one page</source>\n        <translation>Rechteckige Auswahl um eine Seite nach unten erweitern</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"818\"/>\n        <source>Formfeed</source>\n        <translation>Seitenumbruch</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"770\"/>\n        <source>Duplicate selection</source>\n        <translation>Auswahl duplizieren</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerAVS</name>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"280\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"283\"/>\n        <source>Block comment</source>\n        <translation>Blockkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"286\"/>\n        <source>Nested block comment</source>\n        <translation>Verschachtelter Blockkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"289\"/>\n        <source>Line comment</source>\n        <translation>Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"301\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"304\"/>\n        <source>Triple double-quoted string</source>\n        <translation>Zeichenkette in dreifachen Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"307\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"310\"/>\n        <source>Filter</source>\n        <translation>Filter</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"313\"/>\n        <source>Plugin</source>\n        <translation>Plugin</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"316\"/>\n        <source>Function</source>\n        <translation>Funktion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"319\"/>\n        <source>Clip property</source>\n        <translation>Clip Eigenschaft</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"322\"/>\n        <source>User defined</source>\n        <translation>Nutzer definiert</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBash</name>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"193\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"196\"/>\n        <source>Error</source>\n        <translation>Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"199\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"202\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"205\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"208\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"211\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"214\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"217\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"220\"/>\n        <source>Scalar</source>\n        <translation>Skalar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"223\"/>\n        <source>Parameter expansion</source>\n        <translation>Parametererweiterung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"226\"/>\n        <source>Backticks</source>\n        <translation>Backticks</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"229\"/>\n        <source>Here document delimiter</source>\n        <translation>Here Dokument-Begrenzer</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"232\"/>\n        <source>Single-quoted here document</source>\n        <translation>Here Dokument in Hochkommata</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBatch</name>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"164\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"167\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"173\"/>\n        <source>Label</source>\n        <translation>Marke</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"182\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"185\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"176\"/>\n        <source>Hide command character</source>\n        <translation>&quot;Befehl verbergen&quot; Zeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"179\"/>\n        <source>External command</source>\n        <translation>Externer Befehl</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCMake</name>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"181\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"184\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"187\"/>\n        <source>String</source>\n        <translation>Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"190\"/>\n        <source>Left quoted string</source>\n        <translation>Links quotierte Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"193\"/>\n        <source>Right quoted string</source>\n        <translation>Rechts quotierte Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"196\"/>\n        <source>Function</source>\n        <translation>Funktion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"199\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"202\"/>\n        <source>Label</source>\n        <translation>Marke</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"205\"/>\n        <source>User defined</source>\n        <translation>Nutzer definiert</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"208\"/>\n        <source>WHILE block</source>\n        <translation>WHILE Block</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"211\"/>\n        <source>FOREACH block</source>\n        <translation>FOREACH Block</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"214\"/>\n        <source>IF block</source>\n        <translation>IF Block</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"217\"/>\n        <source>MACRO block</source>\n        <translation>MACRO Block</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"220\"/>\n        <source>Variable within a string</source>\n        <translation>Variable in einer Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"223\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCPP</name>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"364\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"370\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"376\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"382\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"388\"/>\n        <source>IDL UUID</source>\n        <translation>IDL UUID</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"394\"/>\n        <source>Pre-processor block</source>\n        <translation>Präprozessorblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"400\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"406\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"412\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"340\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"343\"/>\n        <source>Inactive default</source>\n        <translation>Inaktiver Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"346\"/>\n        <source>C comment</source>\n        <translation>C Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"349\"/>\n        <source>Inactive C comment</source>\n        <translation>Inaktiver C Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"352\"/>\n        <source>C++ comment</source>\n        <translation>C++ Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"355\"/>\n        <source>Inactive C++ comment</source>\n        <translation>Inaktiver C++ Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"358\"/>\n        <source>JavaDoc style C comment</source>\n        <translation>JavaDoc C Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"361\"/>\n        <source>Inactive JavaDoc style C comment</source>\n        <translation>Inaktiver JavaDoc C Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"367\"/>\n        <source>Inactive number</source>\n        <translation>Inaktive Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"373\"/>\n        <source>Inactive keyword</source>\n        <translation>Inaktives Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"379\"/>\n        <source>Inactive double-quoted string</source>\n        <translation>Inaktive Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"385\"/>\n        <source>Inactive single-quoted string</source>\n        <translation>Inaktive Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"391\"/>\n        <source>Inactive IDL UUID</source>\n        <translation>Inaktive IDL UUID</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"397\"/>\n        <source>Inactive pre-processor block</source>\n        <translation>Inaktiver Präprozessorblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"403\"/>\n        <source>Inactive operator</source>\n        <translation>Inaktiver Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"409\"/>\n        <source>Inactive identifier</source>\n        <translation>Inaktiver Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"415\"/>\n        <source>Inactive unclosed string</source>\n        <translation>Inaktive unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"418\"/>\n        <source>C# verbatim string</source>\n        <translation>Uninterpretierte C# Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"421\"/>\n        <source>Inactive C# verbatim string</source>\n        <translation>Inaktive, Uninterpretierte C# Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"424\"/>\n        <source>JavaScript regular expression</source>\n        <translation>JavaScript Regulärer Ausdruck</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"427\"/>\n        <source>Inactive JavaScript regular expression</source>\n        <translation>JavaScript Inaktiver Regulärer Ausdruck</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"430\"/>\n        <source>JavaDoc style C++ comment</source>\n        <translation>JavaDoc C++ Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"433\"/>\n        <source>Inactive JavaDoc style C++ comment</source>\n        <translation>Inaktiver JavaDoc C++ Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"439\"/>\n        <source>Inactive secondary keywords and identifiers</source>\n        <translation>Inaktive sekundäre Schlusselwörter und Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"442\"/>\n        <source>JavaDoc keyword</source>\n        <translation>JavaDoc Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"445\"/>\n        <source>Inactive JavaDoc keyword</source>\n        <translation>Inaktives JavaDoc Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"448\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>JavaDoc Schlüsselwortfehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"457\"/>\n        <source>Inactive global classes and typedefs</source>\n        <translation>Inaktive globale Klassen und Typdefinitionen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"460\"/>\n        <source>C++ raw string</source>\n        <translation>Rohe C++ Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"463\"/>\n        <source>Inactive C++ raw string</source>\n        <translation>Inaktive rohe C++ Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"466\"/>\n        <source>Vala triple-quoted verbatim string</source>\n        <translation>Vala Zeichenkette in dreifachen Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"469\"/>\n        <source>Inactive Vala triple-quoted verbatim string</source>\n        <translation>Inaktive Vala Zeichenkette in dreifachen Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"472\"/>\n        <source>Pike hash-quoted string</source>\n        <translation>Pike Zeichenkette in &apos;#-Anführungszeichen&apos;</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"475\"/>\n        <source>Inactive Pike hash-quoted string</source>\n        <translation>Inaktive Pike Zeichenkette in &apos;#-Anführungszeichen&apos;</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"478\"/>\n        <source>Pre-processor C comment</source>\n        <translation>C Präprozessorkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"481\"/>\n        <source>Inactive pre-processor C comment</source>\n        <translation>Inaktiver C Präprozessorkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"484\"/>\n        <source>JavaDoc style pre-processor comment</source>\n        <translation>JavaDoc Präprozessorkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"487\"/>\n        <source>Inactive JavaDoc style pre-processor comment</source>\n        <translation>Inaktiver JavaDoc Präprozessorkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"436\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Sekundäre Schlusselwörter und Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"451\"/>\n        <source>Inactive JavaDoc keyword error</source>\n        <translation>Inaktiver JavaDoc Schlüsselwortfehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"454\"/>\n        <source>Global classes and typedefs</source>\n        <translation>Globale Klassen und Typdefinitionen</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSS</name>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"225\"/>\n        <source>Tag</source>\n        <translation>Tag</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"228\"/>\n        <source>Class selector</source>\n        <translation>Klassenselektor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"231\"/>\n        <source>Pseudo-class</source>\n        <translation>Pseudoklasse</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"234\"/>\n        <source>Unknown pseudo-class</source>\n        <translation>Unbekannte Pseudoklasse</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"237\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"240\"/>\n        <source>CSS1 property</source>\n        <translation>CSS1 Eigenschaft</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"243\"/>\n        <source>Unknown property</source>\n        <translation>Unbekannte Eigenschaft</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"246\"/>\n        <source>Value</source>\n        <translation>Wert</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"249\"/>\n        <source>ID selector</source>\n        <translation>ID-Selektor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"252\"/>\n        <source>Important</source>\n        <translation>Wichtig</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"255\"/>\n        <source>@-rule</source>\n        <translation>@-Regel</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"258\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"261\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"264\"/>\n        <source>CSS2 property</source>\n        <translation>CSS2 Eigenschaft</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"267\"/>\n        <source>Attribute</source>\n        <translation>Attribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"270\"/>\n        <source>CSS3 property</source>\n        <translation>CSS3 Eigenschaft</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"273\"/>\n        <source>Pseudo-element</source>\n        <translation>Pseudoelement</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"276\"/>\n        <source>Extended CSS property</source>\n        <translation>Erweiterte CSS Eigenschaft</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"279\"/>\n        <source>Extended pseudo-class</source>\n        <translation>Erweiterte Pseudoklasse</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"282\"/>\n        <source>Extended pseudo-element</source>\n        <translation>Erweitertes Pseudoelement</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"285\"/>\n        <source>Media rule</source>\n        <translation>Medienregel</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"288\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSharp</name>\n    <message>\n        <location filename=\"qscilexercsharp.cpp\" line=\"95\"/>\n        <source>Verbatim string</source>\n        <translation>Uninterpretierte Zeichenkette</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCoffeeScript</name>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"244\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"247\"/>\n        <source>C-style comment</source>\n        <translation>C Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"250\"/>\n        <source>C++-style comment</source>\n        <translation>C++ Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"253\"/>\n        <source>JavaDoc C-style comment</source>\n        <translation>JavaDoc C Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"256\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"259\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"262\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"265\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"268\"/>\n        <source>IDL UUID</source>\n        <translation>IDL UUID</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"271\"/>\n        <source>Pre-processor block</source>\n        <translation>Präprozessorblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"274\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"277\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"280\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"283\"/>\n        <source>C# verbatim string</source>\n        <translation>Uninterpretierte C# Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"286\"/>\n        <source>Regular expression</source>\n        <translation>Regulärer Ausdruck</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"289\"/>\n        <source>JavaDoc C++-style comment</source>\n        <translation>JavaDoc C++ Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"292\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Sekundäre Schlusselwörter und Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"295\"/>\n        <source>JavaDoc keyword</source>\n        <translation>JavaDoc Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>JavaDoc Schlüsselwortfehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"301\"/>\n        <source>Global classes</source>\n        <translation>Globale Klassen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"304\"/>\n        <source>Block comment</source>\n        <translation>Blockkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"307\"/>\n        <source>Block regular expression</source>\n        <translation>Regulärer Ausdrucksblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"310\"/>\n        <source>Block regular expression comment</source>\n        <translation>Regulärer Ausdrucksblockkommentar</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerD</name>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"259\"/>\n        <source>Block comment</source>\n        <translation>Blockkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"262\"/>\n        <source>Line comment</source>\n        <translation>Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"265\"/>\n        <source>DDoc style block comment</source>\n        <translation>DDoc Blockkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"268\"/>\n        <source>Nesting comment</source>\n        <translation>schachtelbarer Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"271\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"274\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"277\"/>\n        <source>Secondary keyword</source>\n        <translation>Sekundäres Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"280\"/>\n        <source>Documentation keyword</source>\n        <translation>Dokumentationsschlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"283\"/>\n        <source>Type definition</source>\n        <translation>Typdefinition</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"286\"/>\n        <source>String</source>\n        <translation>Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"289\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"292\"/>\n        <source>Character</source>\n        <translation>Zeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"301\"/>\n        <source>DDoc style line comment</source>\n        <translation>DDoc Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"304\"/>\n        <source>DDoc keyword</source>\n        <translation>DDoc Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"307\"/>\n        <source>DDoc keyword error</source>\n        <translation>DDoc Schlüsselwortfehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"310\"/>\n        <source>Backquoted string</source>\n        <translation>Zeichenkette in Rückwärtsstrichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"313\"/>\n        <source>Raw string</source>\n        <translation>Rohe Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"316\"/>\n        <source>User defined 1</source>\n        <translation>Nutzer definiert 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"319\"/>\n        <source>User defined 2</source>\n        <translation>Nutzer definiert 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"322\"/>\n        <source>User defined 3</source>\n        <translation>Nutzer definiert 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerDiff</name>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"92\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"95\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"98\"/>\n        <source>Command</source>\n        <translation>Befehl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"101\"/>\n        <source>Header</source>\n        <translation>Kopfzeilen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"104\"/>\n        <source>Position</source>\n        <translation>Position</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"107\"/>\n        <source>Removed line</source>\n        <translation>Entfernte Zeile</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"110\"/>\n        <source>Added line</source>\n        <translation>Hinzugefügte Zeile</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"113\"/>\n        <source>Changed line</source>\n        <translation>Geänderte Zeile</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerFortran77</name>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"176\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"179\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"182\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"185\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"188\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"191\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"194\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"197\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"200\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"203\"/>\n        <source>Intrinsic function</source>\n        <translation>Intrinsic-Funktion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"206\"/>\n        <source>Extended function</source>\n        <translation>Erweiterte Funktion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"209\"/>\n        <source>Pre-processor block</source>\n        <translation>Präprozessorblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"212\"/>\n        <source>Dotted operator</source>\n        <translation>Dotted Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"215\"/>\n        <source>Label</source>\n        <translation>Marke</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"218\"/>\n        <source>Continuation</source>\n        <translation>Fortsetzung</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerHTML</name>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"553\"/>\n        <source>HTML default</source>\n        <translation>HTML Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"556\"/>\n        <source>Tag</source>\n        <translation>Tag</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"559\"/>\n        <source>Unknown tag</source>\n        <translation>Unbekanntes Tag</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"562\"/>\n        <source>Attribute</source>\n        <translation>Attribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"565\"/>\n        <source>Unknown attribute</source>\n        <translation>Unbekanntes Attribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"568\"/>\n        <source>HTML number</source>\n        <translation>HTML Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"571\"/>\n        <source>HTML double-quoted string</source>\n        <translation>HTML Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"574\"/>\n        <source>HTML single-quoted string</source>\n        <translation>HTML Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"577\"/>\n        <source>Other text in a tag</source>\n        <translation>Anderer Text in einem Tag</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"580\"/>\n        <source>HTML comment</source>\n        <translation>HTML Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"583\"/>\n        <source>Entity</source>\n        <translation>Entität</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"586\"/>\n        <source>End of a tag</source>\n        <translation>Tagende</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"589\"/>\n        <source>Start of an XML fragment</source>\n        <translation>Beginn eines XML Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"592\"/>\n        <source>End of an XML fragment</source>\n        <translation>Ende eines XML Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"595\"/>\n        <source>Script tag</source>\n        <translation>Skript Tag</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"598\"/>\n        <source>Start of an ASP fragment with @</source>\n        <translation>Beginn eines ASP Fragmentes mit @</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"601\"/>\n        <source>Start of an ASP fragment</source>\n        <translation>Beginn eines ASP Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"604\"/>\n        <source>CDATA</source>\n        <translation>CDATA</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"607\"/>\n        <source>Start of a PHP fragment</source>\n        <translation>Beginn eines PHP Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"610\"/>\n        <source>Unquoted HTML value</source>\n        <translation>HTML Wert ohne Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"613\"/>\n        <source>ASP X-Code comment</source>\n        <translation>ASP X-Code Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"616\"/>\n        <source>SGML default</source>\n        <translation>SGML Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"619\"/>\n        <source>SGML command</source>\n        <translation>SGML Befehl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"622\"/>\n        <source>First parameter of an SGML command</source>\n        <translation>Erster Parameter eines SGML Befehls</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"625\"/>\n        <source>SGML double-quoted string</source>\n        <translation>SGML Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"628\"/>\n        <source>SGML single-quoted string</source>\n        <translation>SGML Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"631\"/>\n        <source>SGML error</source>\n        <translation>SGML Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"634\"/>\n        <source>SGML special entity</source>\n        <translation>SGML Spezielle Entität</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"637\"/>\n        <source>SGML comment</source>\n        <translation>SGML Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"640\"/>\n        <source>First parameter comment of an SGML command</source>\n        <translation>Kommentar des ersten Parameters eines SGML Befehls</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"643\"/>\n        <source>SGML block default</source>\n        <translation>SGML Standardblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"646\"/>\n        <source>Start of a JavaScript fragment</source>\n        <translation>Beginn eines JavaScript Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"649\"/>\n        <source>JavaScript default</source>\n        <translation>JavaScript Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"652\"/>\n        <source>JavaScript comment</source>\n        <translation>JavaScript Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"655\"/>\n        <source>JavaScript line comment</source>\n        <translation>JavaScript Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"658\"/>\n        <source>JavaDoc style JavaScript comment</source>\n        <translation>JavaDoc JavaScript Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"661\"/>\n        <source>JavaScript number</source>\n        <translation>JavaScript Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"664\"/>\n        <source>JavaScript word</source>\n        <translation>JavaScript Wort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"667\"/>\n        <source>JavaScript keyword</source>\n        <translation>JavaScript Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"670\"/>\n        <source>JavaScript double-quoted string</source>\n        <translation>JavaScript Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"673\"/>\n        <source>JavaScript single-quoted string</source>\n        <translation>JavaScript Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"676\"/>\n        <source>JavaScript symbol</source>\n        <translation>JavaScript Symbol</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"679\"/>\n        <source>JavaScript unclosed string</source>\n        <translation>JavaScript Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"682\"/>\n        <source>JavaScript regular expression</source>\n        <translation>JavaScript Regulärer Ausdruck</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"685\"/>\n        <source>Start of an ASP JavaScript fragment</source>\n        <translation>Beginn eines ASP JavaScript Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"688\"/>\n        <source>ASP JavaScript default</source>\n        <translation>ASP JavaScript Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"691\"/>\n        <source>ASP JavaScript comment</source>\n        <translation>ASP JavaScript Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"694\"/>\n        <source>ASP JavaScript line comment</source>\n        <translation>ASP JavaScript Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"697\"/>\n        <source>JavaDoc style ASP JavaScript comment</source>\n        <translation>JavaDoc ASP JavaScript Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"700\"/>\n        <source>ASP JavaScript number</source>\n        <translation>ASP JavaScript Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"703\"/>\n        <source>ASP JavaScript word</source>\n        <translation>ASP JavaScript Wort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"706\"/>\n        <source>ASP JavaScript keyword</source>\n        <translation>ASP JavaScript Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"709\"/>\n        <source>ASP JavaScript double-quoted string</source>\n        <translation>ASP JavaScript Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"712\"/>\n        <source>ASP JavaScript single-quoted string</source>\n        <translation>ASP JavaScript Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"715\"/>\n        <source>ASP JavaScript symbol</source>\n        <translation>ASP JavaScript Symbol</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"718\"/>\n        <source>ASP JavaScript unclosed string</source>\n        <translation>ASP JavaScript Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"721\"/>\n        <source>ASP JavaScript regular expression</source>\n        <translation>ASP JavaScript Regulärer Ausdruck</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"724\"/>\n        <source>Start of a VBScript fragment</source>\n        <translation>Beginn eines VBScript Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"727\"/>\n        <source>VBScript default</source>\n        <translation>VBScript Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"730\"/>\n        <source>VBScript comment</source>\n        <translation>VBScript Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"733\"/>\n        <source>VBScript number</source>\n        <translation>VBScript Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"736\"/>\n        <source>VBScript keyword</source>\n        <translation>VBScript Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"739\"/>\n        <source>VBScript string</source>\n        <translation>VBScript Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"742\"/>\n        <source>VBScript identifier</source>\n        <translation>VBScript Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"745\"/>\n        <source>VBScript unclosed string</source>\n        <translation>VBScript Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"748\"/>\n        <source>Start of an ASP VBScript fragment</source>\n        <translation>Beginn eines ASP VBScript Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"751\"/>\n        <source>ASP VBScript default</source>\n        <translation>ASP VBScript Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"754\"/>\n        <source>ASP VBScript comment</source>\n        <translation>ASP VBScript Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"757\"/>\n        <source>ASP VBScript number</source>\n        <translation>ASP VBScript Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"760\"/>\n        <source>ASP VBScript keyword</source>\n        <translation>ASP VBScript Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"763\"/>\n        <source>ASP VBScript string</source>\n        <translation>ASP VBScript Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"766\"/>\n        <source>ASP VBScript identifier</source>\n        <translation>ASP VBScript Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"769\"/>\n        <source>ASP VBScript unclosed string</source>\n        <translation>ASP VBScript Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"772\"/>\n        <source>Start of a Python fragment</source>\n        <translation>Beginn eines Python Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"775\"/>\n        <source>Python default</source>\n        <translation>Python Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"778\"/>\n        <source>Python comment</source>\n        <translation>Python Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"781\"/>\n        <source>Python number</source>\n        <translation>Python Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"784\"/>\n        <source>Python double-quoted string</source>\n        <translation>Python Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"787\"/>\n        <source>Python single-quoted string</source>\n        <translation>Python Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"790\"/>\n        <source>Python keyword</source>\n        <translation>Python Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"793\"/>\n        <source>Python triple double-quoted string</source>\n        <translation>Python Zeichenkette in dreifachen Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"796\"/>\n        <source>Python triple single-quoted string</source>\n        <translation>Python Zeichenkette in dreifachen Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"799\"/>\n        <source>Python class name</source>\n        <translation>Python Klassenname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"802\"/>\n        <source>Python function or method name</source>\n        <translation>Python Funktions- oder Methodenname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"805\"/>\n        <source>Python operator</source>\n        <translation>Python Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"808\"/>\n        <source>Python identifier</source>\n        <translation>Python Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"811\"/>\n        <source>Start of an ASP Python fragment</source>\n        <translation>Beginn eines ASP Python Fragmentes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"814\"/>\n        <source>ASP Python default</source>\n        <translation>ASP Python Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"817\"/>\n        <source>ASP Python comment</source>\n        <translation>ASP Python Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"820\"/>\n        <source>ASP Python number</source>\n        <translation>ASP Python Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"823\"/>\n        <source>ASP Python double-quoted string</source>\n        <translation>ASP Python Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"826\"/>\n        <source>ASP Python single-quoted string</source>\n        <translation>ASP Python Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"829\"/>\n        <source>ASP Python keyword</source>\n        <translation>ASP Python Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"832\"/>\n        <source>ASP Python triple double-quoted string</source>\n        <translation>ASP Python Zeichenkette in dreifachen Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"835\"/>\n        <source>ASP Python triple single-quoted string</source>\n        <translation>ASP Python Zeichenkette in dreifachen Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"838\"/>\n        <source>ASP Python class name</source>\n        <translation>ASP Python Klassenname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"841\"/>\n        <source>ASP Python function or method name</source>\n        <translation>ASP Python Funktions- oder Methodenname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"844\"/>\n        <source>ASP Python operator</source>\n        <translation>ASP Python Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"847\"/>\n        <source>ASP Python identifier</source>\n        <translation>ASP Python Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"850\"/>\n        <source>PHP default</source>\n        <translation>PHP Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"853\"/>\n        <source>PHP double-quoted string</source>\n        <translation>PHP Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"856\"/>\n        <source>PHP single-quoted string</source>\n        <translation>PHP Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"859\"/>\n        <source>PHP keyword</source>\n        <translation>PHP Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"862\"/>\n        <source>PHP number</source>\n        <translation>PHP Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"868\"/>\n        <source>PHP comment</source>\n        <translation>PHP Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"871\"/>\n        <source>PHP line comment</source>\n        <translation>PHP Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"874\"/>\n        <source>PHP double-quoted variable</source>\n        <translation>PHP Variable in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"877\"/>\n        <source>PHP operator</source>\n        <translation>PHP Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"865\"/>\n        <source>PHP variable</source>\n        <translation>PHP Variable</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerIDL</name>\n    <message>\n        <location filename=\"qscilexeridl.cpp\" line=\"87\"/>\n        <source>UUID</source>\n        <translation>UUID</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerJavaScript</name>\n    <message>\n        <location filename=\"qscilexerjavascript.cpp\" line=\"97\"/>\n        <source>Regular expression</source>\n        <translation>Regulärer Ausdruck</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerLua</name>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"218\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"221\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"224\"/>\n        <source>Line comment</source>\n        <translation>Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"227\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"230\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"233\"/>\n        <source>String</source>\n        <translation>Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"236\"/>\n        <source>Character</source>\n        <translation>Zeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"239\"/>\n        <source>Literal string</source>\n        <translation>Uninterpretierte Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"242\"/>\n        <source>Preprocessor</source>\n        <translation>Präprozessor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"245\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"248\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"251\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"254\"/>\n        <source>Basic functions</source>\n        <translation>Basisfunktionen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"257\"/>\n        <source>String, table and maths functions</source>\n        <translation>Zeichenketten-, Tabelle- und mathematische Funktionen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"260\"/>\n        <source>Coroutines, i/o and system facilities</source>\n        <translation>Koroutinen, I/O- und Systemfunktionen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"263\"/>\n        <source>User defined 1</source>\n        <translation>Nutzer definiert 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"266\"/>\n        <source>User defined 2</source>\n        <translation>Nutzer definiert 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"269\"/>\n        <source>User defined 3</source>\n        <translation>Nutzer definiert 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"272\"/>\n        <source>User defined 4</source>\n        <translation>Nutzer definiert 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"275\"/>\n        <source>Label</source>\n        <translation>Marke</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMakefile</name>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"116\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"119\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"122\"/>\n        <source>Preprocessor</source>\n        <translation>Präprozessor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"125\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"128\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"131\"/>\n        <source>Target</source>\n        <translation>Ziel</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"134\"/>\n        <source>Error</source>\n        <translation>Fehler</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMatlab</name>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"123\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"126\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"129\"/>\n        <source>Command</source>\n        <translation>Befehl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"132\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"135\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"138\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"141\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"144\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"147\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPO</name>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"90\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"93\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"96\"/>\n        <source>Message identifier</source>\n        <translation>Meldungsbezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"99\"/>\n        <source>Message identifier text</source>\n        <translation>Meldungsbezeichnertext</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"102\"/>\n        <source>Message string</source>\n        <translation>Meldungszeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"105\"/>\n        <source>Message string text</source>\n        <translation>Meldungszeichenkettentext</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"108\"/>\n        <source>Message context</source>\n        <translation>Meldungskontext</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"111\"/>\n        <source>Message context text</source>\n        <translation>Meldungskontexttext</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"114\"/>\n        <source>Fuzzy flag</source>\n        <translation>Unschrfmarkierung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"117\"/>\n        <source>Programmer comment</source>\n        <translation>Programmiererkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"120\"/>\n        <source>Reference</source>\n        <translation>Referenz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"123\"/>\n        <source>Flags</source>\n        <translation>Markierung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"126\"/>\n        <source>Message identifier text end-of-line</source>\n        <translation>Meldungsbezeichnertext Zeilenende</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"129\"/>\n        <source>Message string text end-of-line</source>\n        <translation>Meldungszeichenkettentext Zeilenende</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"132\"/>\n        <source>Message context text end-of-line</source>\n        <translation>Meldungskontexttext Zeilenende</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPOV</name>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"267\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"270\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"273\"/>\n        <source>Comment line</source>\n        <translation>Kommentarzeile</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"276\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"279\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"282\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"285\"/>\n        <source>String</source>\n        <translation>Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"288\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"291\"/>\n        <source>Directive</source>\n        <translation>Direktive</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"294\"/>\n        <source>Bad directive</source>\n        <translation>Ungültige Direktive</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"297\"/>\n        <source>Objects, CSG and appearance</source>\n        <translation>Objekte, CSG und Erscheinung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"300\"/>\n        <source>Types, modifiers and items</source>\n        <translation>Typen, Modifizierer und Items</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"303\"/>\n        <source>Predefined identifiers</source>\n        <translation>Vordefinierter Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"306\"/>\n        <source>Predefined functions</source>\n        <translation>Vordefinierte Funktion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"309\"/>\n        <source>User defined 1</source>\n        <translation>Nutzer definiert 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"312\"/>\n        <source>User defined 2</source>\n        <translation>Nutzer definiert 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"315\"/>\n        <source>User defined 3</source>\n        <translation>Nutzer definiert 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPascal</name>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"246\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"258\"/>\n        <source>Line comment</source>\n        <translation>Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"267\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"273\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"276\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"285\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"249\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"252\"/>\n        <source>&apos;{ ... }&apos; style comment</source>\n        <translation>&apos;{ ... }&apos; Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"255\"/>\n        <source>&apos;(* ... *)&apos; style comment</source>\n        <translation>&apos;(* ... *)&apos; Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"261\"/>\n        <source>&apos;{$ ... }&apos; style pre-processor block</source>\n        <translation>&apos;{$ ... }&apos; Präprozessorblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"264\"/>\n        <source>&apos;(*$ ... *)&apos; style pre-processor block</source>\n        <translation>&apos;(*$ ... *)&apos; Präprozessorblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"270\"/>\n        <source>Hexadecimal number</source>\n        <translation>Hexadezimale Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"279\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"282\"/>\n        <source>Character</source>\n        <translation>Zeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"288\"/>\n        <source>Inline asm</source>\n        <translation>Inline Assembler</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPerl</name>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"318\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"321\"/>\n        <source>Error</source>\n        <translation>Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"324\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"327\"/>\n        <source>POD</source>\n        <translation>POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"330\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"333\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"336\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"339\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"342\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"345\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"348\"/>\n        <source>Scalar</source>\n        <translation>Skalar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"351\"/>\n        <source>Array</source>\n        <translation>Feld</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"354\"/>\n        <source>Hash</source>\n        <translation>Hash</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"357\"/>\n        <source>Symbol table</source>\n        <translation>Symboltabelle</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"360\"/>\n        <source>Regular expression</source>\n        <translation>Regulärer Ausdruck</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"363\"/>\n        <source>Substitution</source>\n        <translation>Ersetzung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"366\"/>\n        <source>Backticks</source>\n        <translation>Backticks</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"369\"/>\n        <source>Data section</source>\n        <translation>Datensektion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"372\"/>\n        <source>Here document delimiter</source>\n        <translation>Here Dokument-Begrenzer</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"375\"/>\n        <source>Single-quoted here document</source>\n        <translation>Here Dokument in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"378\"/>\n        <source>Double-quoted here document</source>\n        <translation>Here Dokument in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"381\"/>\n        <source>Backtick here document</source>\n        <translation>Here Dokument in Backticks</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"384\"/>\n        <source>Quoted string (q)</source>\n        <translation>Zeichenkette (q)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"387\"/>\n        <source>Quoted string (qq)</source>\n        <translation>Zeichenkette (qq)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"390\"/>\n        <source>Quoted string (qx)</source>\n        <translation>Zeichenkette (qx)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"393\"/>\n        <source>Quoted string (qr)</source>\n        <translation>Zeichenkette (qr)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"396\"/>\n        <source>Quoted string (qw)</source>\n        <translation>Zeichenkette (qw)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"399\"/>\n        <source>POD verbatim</source>\n        <translation>POD wörtlich</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"402\"/>\n        <source>Subroutine prototype</source>\n        <translation>Subroutinen Prototyp</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"405\"/>\n        <source>Format identifier</source>\n        <translation>Formatidentifikator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"408\"/>\n        <source>Format body</source>\n        <translation>Formatzweig</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"411\"/>\n        <source>Double-quoted string (interpolated variable)</source>\n        <translation>Zeichenkette in Anführungszeichen (interpolierte Variable)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"414\"/>\n        <source>Translation</source>\n        <translation>Übersetzung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"417\"/>\n        <source>Regular expression (interpolated variable)</source>\n        <translation>Regulärer Ausdruck (interpolierte Variable)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"420\"/>\n        <source>Substitution (interpolated variable)</source>\n        <translation>Ersetzung (interpolierte Variable)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"423\"/>\n        <source>Backticks (interpolated variable)</source>\n        <translation>Backticks (interpolierte Variable)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"426\"/>\n        <source>Double-quoted here document (interpolated variable)</source>\n        <translation>Here Dokument in Anführungszeichen (interpolierte Variable)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"429\"/>\n        <source>Backtick here document (interpolated variable)</source>\n        <translation>Here Dokument in Backticks (interpolierte Variable)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"432\"/>\n        <source>Quoted string (qq, interpolated variable)</source>\n        <translation>Zeichenkette (qq, interpolierte Variable)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"435\"/>\n        <source>Quoted string (qx, interpolated variable)</source>\n        <translation>Zeichenkette (qx, interpolierte Variable)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"438\"/>\n        <source>Quoted string (qr, interpolated variable)</source>\n        <translation>Zeichenkette (qr, interpolierte Variable)</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPostScript</name>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"249\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"252\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"255\"/>\n        <source>DSC comment</source>\n        <translation>DSC Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"258\"/>\n        <source>DSC comment value</source>\n        <translation>DSC Kommentarwert</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"261\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"264\"/>\n        <source>Name</source>\n        <translation>Name</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"267\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"270\"/>\n        <source>Literal</source>\n        <translation>Literal</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"273\"/>\n        <source>Immediately evaluated literal</source>\n        <translation>Direkt ausgeführtes Literal</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"276\"/>\n        <source>Array parenthesis</source>\n        <translation>Feldklammern</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"279\"/>\n        <source>Dictionary parenthesis</source>\n        <translation>Dictionary-Klammern</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"282\"/>\n        <source>Procedure parenthesis</source>\n        <translation>Prozedurklammern</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"285\"/>\n        <source>Text</source>\n        <translation>Text</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"288\"/>\n        <source>Hexadecimal string</source>\n        <translation>Hexadezimale Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"291\"/>\n        <source>Base85 string</source>\n        <translation>Base85 Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"294\"/>\n        <source>Bad string character</source>\n        <translation>Ungültiges Zeichen für Zeichenkette</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerProperties</name>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"111\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"114\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"117\"/>\n        <source>Section</source>\n        <translation>Abschnitt</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"120\"/>\n        <source>Assignment</source>\n        <translation>Zuweisung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"123\"/>\n        <source>Default value</source>\n        <translation>Standardwert</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"126\"/>\n        <source>Key</source>\n        <translation>Schlüssel</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPython</name>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"225\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"228\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"231\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"234\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"237\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"240\"/>\n        <source>Triple single-quoted string</source>\n        <translation>Zeichenkette in dreifachen Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"243\"/>\n        <source>Triple double-quoted string</source>\n        <translation>Zeichenkette in dreifachen Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"246\"/>\n        <source>Class name</source>\n        <translation>Klassenname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"249\"/>\n        <source>Function or method name</source>\n        <translation>Funktions- oder Methodenname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"252\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"255\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"258\"/>\n        <source>Comment block</source>\n        <translation>Kommentarblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"261\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"264\"/>\n        <source>Highlighted identifier</source>\n        <translation>Hervorgehobener Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"267\"/>\n        <source>Decorator</source>\n        <translation>Dekorator</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerRuby</name>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"239\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"245\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"251\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"257\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"260\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"254\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"263\"/>\n        <source>Class name</source>\n        <translation>Klassenname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"266\"/>\n        <source>Function or method name</source>\n        <translation>Funktions- oder Methodenname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"269\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"272\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"242\"/>\n        <source>Error</source>\n        <translation>Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"248\"/>\n        <source>POD</source>\n        <translation>POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"275\"/>\n        <source>Regular expression</source>\n        <translation>Regulärer Ausdruck</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"278\"/>\n        <source>Global</source>\n        <translation>Global</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"281\"/>\n        <source>Symbol</source>\n        <translation>Symbol</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"284\"/>\n        <source>Module name</source>\n        <translation>Modulname</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"287\"/>\n        <source>Instance variable</source>\n        <translation>Instanzvariable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"290\"/>\n        <source>Class variable</source>\n        <translation>Klassenvariable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"293\"/>\n        <source>Backticks</source>\n        <translation>Backticks</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"296\"/>\n        <source>Data section</source>\n        <translation>Datensektion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"299\"/>\n        <source>Here document delimiter</source>\n        <translation>Here Dokument-Begrenzer</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"302\"/>\n        <source>Here document</source>\n        <translation>Here Dokument</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"305\"/>\n        <source>%q string</source>\n        <translation>%q Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"308\"/>\n        <source>%Q string</source>\n        <translation>%Q Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"311\"/>\n        <source>%x string</source>\n        <translation>%x Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"314\"/>\n        <source>%r string</source>\n        <translation>%r Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"317\"/>\n        <source>%w string</source>\n        <translation>%w Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"320\"/>\n        <source>Demoted keyword</source>\n        <translation>zurückgestuftes Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"323\"/>\n        <source>stdin</source>\n        <translation>Stdin</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"326\"/>\n        <source>stdout</source>\n        <translation>Stdout</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"329\"/>\n        <source>stderr</source>\n        <translation>Stderr</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSQL</name>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"259\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"268\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"271\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"277\"/>\n        <source>Single-quoted string</source>\n        <translation>Zeichenkette in Hochkommata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"286\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"289\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"262\"/>\n        <source>Comment line</source>\n        <translation>Kommentarzeile</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"265\"/>\n        <source>JavaDoc style comment</source>\n        <translation>JavaDoc Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"274\"/>\n        <source>Double-quoted string</source>\n        <translation>Zeichenkette in Anführungszeichen</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"280\"/>\n        <source>SQL*Plus keyword</source>\n        <translation>SQL*Plus Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"283\"/>\n        <source>SQL*Plus prompt</source>\n        <translation>SQL*Plus Eingabe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"292\"/>\n        <source>SQL*Plus comment</source>\n        <translation>SQL*Plus Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"295\"/>\n        <source># comment line</source>\n        <translation># Kommentarzeile</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword</source>\n        <translation>JavaDoc Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"301\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>JavaDoc Schlüsselwortfehler</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"304\"/>\n        <source>User defined 1</source>\n        <translation>Nutzer definiert 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"307\"/>\n        <source>User defined 2</source>\n        <translation>Nutzer definiert 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"310\"/>\n        <source>User defined 3</source>\n        <translation>Nutzer definiert 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"313\"/>\n        <source>User defined 4</source>\n        <translation>Nutzer definiert 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"316\"/>\n        <source>Quoted identifier</source>\n        <translation>Bezeichner in Anführungszeichen</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSpice</name>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"156\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"159\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"162\"/>\n        <source>Command</source>\n        <translation>Befehl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"165\"/>\n        <source>Function</source>\n        <translation>Funktion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"168\"/>\n        <source>Parameter</source>\n        <translation>Parameter</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"171\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"174\"/>\n        <source>Delimiter</source>\n        <translation>Delimiter</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"177\"/>\n        <source>Value</source>\n        <translation>Wert</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"180\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTCL</name>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"283\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"286\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"289\"/>\n        <source>Comment line</source>\n        <translation>Kommentarzeile</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"295\"/>\n        <source>Quoted keyword</source>\n        <translation>angeführtes Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"298\"/>\n        <source>Quoted string</source>\n        <translation>Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"301\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"304\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"307\"/>\n        <source>Substitution</source>\n        <translation>Ersetzung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"310\"/>\n        <source>Brace substitution</source>\n        <translation>Klammerersetzung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"313\"/>\n        <source>Modifier</source>\n        <translation>Modifizierer</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"316\"/>\n        <source>Expand keyword</source>\n        <translation>Erweiterungsschlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"319\"/>\n        <source>TCL keyword</source>\n        <translation>TCL Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"322\"/>\n        <source>Tk keyword</source>\n        <translation>Tk Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"325\"/>\n        <source>iTCL keyword</source>\n        <translation>iTCL Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"328\"/>\n        <source>Tk command</source>\n        <translation>Tk Befehl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"331\"/>\n        <source>User defined 1</source>\n        <translation>Nutzer definiert 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"334\"/>\n        <source>User defined 2</source>\n        <translation>Nutzer definiert 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"337\"/>\n        <source>User defined 3</source>\n        <translation>Nutzer definiert 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"340\"/>\n        <source>User defined 4</source>\n        <translation>Nutzer definiert 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"343\"/>\n        <source>Comment box</source>\n        <translation>Kommentarbox</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"346\"/>\n        <source>Comment block</source>\n        <translation>Kommentarblock</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTeX</name>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"177\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"180\"/>\n        <source>Special</source>\n        <translation>Spezial</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"183\"/>\n        <source>Group</source>\n        <translation>Gruppe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"186\"/>\n        <source>Symbol</source>\n        <translation>Symbol</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"189\"/>\n        <source>Command</source>\n        <translation>Befehl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"192\"/>\n        <source>Text</source>\n        <translation>Text</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVHDL</name>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"197\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"200\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"203\"/>\n        <source>Comment line</source>\n        <translation>Kommentarzeile</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"206\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"209\"/>\n        <source>String</source>\n        <translation>Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"212\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"215\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"218\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"221\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"224\"/>\n        <source>Standard operator</source>\n        <translation>Standardoperator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"227\"/>\n        <source>Attribute</source>\n        <translation>Attribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"230\"/>\n        <source>Standard function</source>\n        <translation>Standardfunktion</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"233\"/>\n        <source>Standard package</source>\n        <translation>Standardpaket</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"236\"/>\n        <source>Standard type</source>\n        <translation>Standardtyp</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"239\"/>\n        <source>User defined</source>\n        <translation>Nutzer definiert</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVerilog</name>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"209\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"212\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"215\"/>\n        <source>Line comment</source>\n        <translation>Zeilenkommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"218\"/>\n        <source>Bang comment</source>\n        <translation>Bang Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"221\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"224\"/>\n        <source>Primary keywords and identifiers</source>\n        <translation>Primäre Schlusselwörter und Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"227\"/>\n        <source>String</source>\n        <translation>Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"230\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Sekundäre Schlusselwörter und Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"233\"/>\n        <source>System task</source>\n        <translation>Systemtask</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"236\"/>\n        <source>Preprocessor block</source>\n        <translation>Präprozessorblock</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"239\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"242\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"245\"/>\n        <source>Unclosed string</source>\n        <translation>Unbeendete Zeichenkette</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"248\"/>\n        <source>User defined tasks and identifiers</source>\n        <translation>Nutzerdefinierte Tasks und Bezeichner</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerYAML</name>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"161\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"164\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"167\"/>\n        <source>Identifier</source>\n        <translation>Bezeichner</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation>Schlüsselwort</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"173\"/>\n        <source>Number</source>\n        <translation>Zahl</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"176\"/>\n        <source>Reference</source>\n        <translation>Referenz</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"179\"/>\n        <source>Document delimiter</source>\n        <translation>Dokumentbegrenzer</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"182\"/>\n        <source>Text block marker</source>\n        <translation>Textblock Markierung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"185\"/>\n        <source>Syntax error marker</source>\n        <translation>Syntaxfehler Markierung</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"188\"/>\n        <source>Operator</source>\n        <translation>Operator</translation>\n    </message>\n</context>\n<context>\n    <name>QsciScintilla</name>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4359\"/>\n        <source>&amp;Undo</source>\n        <translation>&amp;Rückgängig</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4363\"/>\n        <source>&amp;Redo</source>\n        <translation>Wieder&amp;herstellen</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4369\"/>\n        <source>Cu&amp;t</source>\n        <translation>&amp;Ausschneiden</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4374\"/>\n        <source>&amp;Copy</source>\n        <translation>&amp;Kopieren</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4380\"/>\n        <source>&amp;Paste</source>\n        <translation>Ein&amp;fügen</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4384\"/>\n        <source>Delete</source>\n        <translation>Löschen</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4391\"/>\n        <source>Select All</source>\n        <translation>Alle auswählen</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscintilla_es.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.0\" language=\"es\">\n<context>\n    <name>QsciCommand</name>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"44\"/>\n        <source>Move down one line</source>\n        <translation>Desplazar una línea hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"54\"/>\n        <source>Extend selection down one line</source>\n        <translation>Extender la selección una línea hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"71\"/>\n        <source>Scroll view down one line</source>\n        <translation>Desplazar la vista una línea hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"64\"/>\n        <source>Extend rectangular selection down one line</source>\n        <translation>Extender la selección rectangular una línea hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"81\"/>\n        <source>Move up one line</source>\n        <translation>Desplazar una línea hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"91\"/>\n        <source>Extend selection up one line</source>\n        <translation>Extender la selección una línea hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"108\"/>\n        <source>Scroll view up one line</source>\n        <translation>Desplazar la vista una línea hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"101\"/>\n        <source>Extend rectangular selection up one line</source>\n        <translation>Extender la selección rectangular una línea hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"158\"/>\n        <source>Move up one paragraph</source>\n        <translation>Desplazar un párrafo hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"164\"/>\n        <source>Extend selection up one paragraph</source>\n        <translation>Extender la selección un párrafo hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"145\"/>\n        <source>Move down one paragraph</source>\n        <translation>Desplazar un párrafo hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"118\"/>\n        <source>Scroll to start of document</source>\n        <translation>Desplazar al principio del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"128\"/>\n        <source>Scroll to end of document</source>\n        <translation>Desplazar al final del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"138\"/>\n        <source>Scroll vertically to centre current line</source>\n        <translation>Desplazar verticalmente al centro de la línea actual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"151\"/>\n        <source>Extend selection down one paragraph</source>\n        <translation>Extender la selección un párrafo hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"175\"/>\n        <source>Move left one character</source>\n        <translation>Mover un carácter hacia la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"185\"/>\n        <source>Extend selection left one character</source>\n        <translation>Extender la selección un carácter hacia la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"239\"/>\n        <source>Move left one word</source>\n        <translation>Mover una palabra hacia la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"249\"/>\n        <source>Extend selection left one word</source>\n        <translation>Extender la selección una palabra a la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"196\"/>\n        <source>Extend rectangular selection left one character</source>\n        <translation>Extender la selección rectangular un carácter hacia la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"207\"/>\n        <source>Move right one character</source>\n        <translation>Mover un carácter hacia la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"217\"/>\n        <source>Extend selection right one character</source>\n        <translation>Extender la selección un carácter hacia la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"259\"/>\n        <source>Move right one word</source>\n        <translation>Mover una palabra hacia la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"265\"/>\n        <source>Extend selection right one word</source>\n        <translation>Extender la selección una palabra a la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"228\"/>\n        <source>Extend rectangular selection right one character</source>\n        <translation>Extender la selección rectangular un carácter hacia la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"271\"/>\n        <source>Move to end of previous word</source>\n        <translation>Mover al final de palabra anterior</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"277\"/>\n        <source>Extend selection to end of previous word</source>\n        <translation>Extender selección al final de la palabra anterior</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"288\"/>\n        <source>Move to end of next word</source>\n        <translation>Mover al final de la palabra siguiente</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"298\"/>\n        <source>Extend selection to end of next word</source>\n        <translation>Extender la selección hasta el final de la palabra siguiente</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"305\"/>\n        <source>Move left one word part</source>\n        <translation>Mover parte de una palabra hacia la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"311\"/>\n        <source>Extend selection left one word part</source>\n        <translation>Extender la selección parte de una palabra a la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"318\"/>\n        <source>Move right one word part</source>\n        <translation>Mover parte de una palabra hacia la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"324\"/>\n        <source>Extend selection right one word part</source>\n        <translation>Extender la selección parte de una palabra a la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"558\"/>\n        <source>Move up one page</source>\n        <translation>Mover hacia arriba una página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"568\"/>\n        <source>Extend selection up one page</source>\n        <translation>Extender la selección hacia arriba una página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"578\"/>\n        <source>Extend rectangular selection up one page</source>\n        <translation>Extender la selección rectangular hacia arriba una página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"593\"/>\n        <source>Move down one page</source>\n        <translation>Mover hacia abajo una página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"607\"/>\n        <source>Extend selection down one page</source>\n        <translation>Extender la selección hacia abajo una página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"621\"/>\n        <source>Extend rectangular selection down one page</source>\n        <translation>Extender la selección rectangular una página hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"658\"/>\n        <source>Delete current character</source>\n        <translation>Borrar el carácter actual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"788\"/>\n        <source>Cut selection</source>\n        <translation>Cortar selección</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"687\"/>\n        <source>Delete word to right</source>\n        <translation>Borrar palabra hacia la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"335\"/>\n        <source>Move to start of document line</source>\n        <translation>Mover al principio de la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"345\"/>\n        <source>Extend selection to start of document line</source>\n        <translation>Extender selección al principio de la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"356\"/>\n        <source>Extend rectangular selection to start of document line</source>\n        <translation>Extender selección rectangular al principio de la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"367\"/>\n        <source>Move to start of display line</source>\n        <translation>Mover al principio de la línea visualizada</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"377\"/>\n        <source>Extend selection to start of display line</source>\n        <translation>Extender selección al principio de la línea visualizada</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"384\"/>\n        <source>Move to start of display or document line</source>\n        <translation>Mover al principio de la línea visualizada o del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"391\"/>\n        <source>Extend selection to start of display or document line</source>\n        <translation>Extender selección al principio de la línea visualizada o del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"402\"/>\n        <source>Move to first visible character in document line</source>\n        <translation>Mover al primer carácter visible en la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"413\"/>\n        <source>Extend selection to first visible character in document line</source>\n        <translation>Extender selección al primer carácter visible en la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"424\"/>\n        <source>Extend rectangular selection to first visible character in document line</source>\n        <translation>Extender selección rectangular al primer carácter visible en la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"431\"/>\n        <source>Move to first visible character of display in document line</source>\n        <translation>Extender selección al primer carácter visualizado en la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"438\"/>\n        <source>Extend selection to first visible character in display or document line</source>\n        <translation>Extender selección al primer carácter de línea visualizada o del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"449\"/>\n        <source>Move to end of document line</source>\n        <translation>Mover al final de la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"459\"/>\n        <source>Extend selection to end of document line</source>\n        <translation>Extender selección al final de la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"470\"/>\n        <source>Extend rectangular selection to end of document line</source>\n        <translation>Extender selección rectangular al final de la línea del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"481\"/>\n        <source>Move to end of display line</source>\n        <translation>Mover al final de la línea visualizada</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"491\"/>\n        <source>Extend selection to end of display line</source>\n        <translation>Extender selección al final de la línea visualizada</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"498\"/>\n        <source>Move to end of display or document line</source>\n        <translation>Mover al final de la línea visualizada o del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"505\"/>\n        <source>Extend selection to end of display or document line</source>\n        <translation>Extender selección al final de la línea visualizada o del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"516\"/>\n        <source>Move to start of document</source>\n        <translation>Mover al principio del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"526\"/>\n        <source>Extend selection to start of document</source>\n        <translation>Extender selección al principio del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"537\"/>\n        <source>Move to end of document</source>\n        <translation>Mover al final del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"547\"/>\n        <source>Extend selection to end of document</source>\n        <translation>Extender selección al final del documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"628\"/>\n        <source>Stuttered move up one page</source>\n        <translation>Mover progresivamente una página hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"634\"/>\n        <source>Stuttered extend selection up one page</source>\n        <translation>Extender progresivamente selección hacia arriba una página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"641\"/>\n        <source>Stuttered move down one page</source>\n        <translation>Mover progresivamente una página hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"647\"/>\n        <source>Stuttered extend selection down one page</source>\n        <translation>Extender progresivamente selección hacia abajo una página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"674\"/>\n        <source>Delete previous character if not at start of line</source>\n        <translation>Borrar carácter anterior si no está al principio de una línea</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"697\"/>\n        <source>Delete right to end of next word</source>\n        <translation>Borrar a la derecha hasta el final de la siguiente palabra</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"714\"/>\n        <source>Delete line to right</source>\n        <translation>Borrar línea hacia la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"738\"/>\n        <source>Transpose current and previous lines</source>\n        <translation>Transponer líneas actual y anterior</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"745\"/>\n        <source>Duplicate the current line</source>\n        <translation>Duplicar línea actual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"751\"/>\n        <source>Select all</source>\n        <oldsource>Select document</oldsource>\n        <translation>Seleccionar todo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"757\"/>\n        <source>Move selected lines up one line</source>\n        <translation>Mover las líneas seleccionadas una línea hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"763\"/>\n        <source>Move selected lines down one line</source>\n        <translation>Mover las líneas seleccionadas una línea hacia abajo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"806\"/>\n        <source>Toggle insert/overtype</source>\n        <translation>Conmutar insertar/sobreescribir</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"800\"/>\n        <source>Paste</source>\n        <translation>Pegar</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"794\"/>\n        <source>Copy selection</source>\n        <translation>Copiar selección</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"812\"/>\n        <source>Insert newline</source>\n        <translation>Insertar carácter de nueva línea</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"830\"/>\n        <source>De-indent one level</source>\n        <translation>Deshacer un nivel de indentado</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"836\"/>\n        <source>Cancel</source>\n        <translation>Cancelar</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"668\"/>\n        <source>Delete previous character</source>\n        <translation>Borrar carácter anterior</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"681\"/>\n        <source>Delete word to left</source>\n        <translation>Borrar palabra hacia la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"704\"/>\n        <source>Delete line to left</source>\n        <translation>Borrar línea hacia la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"842\"/>\n        <source>Undo last command</source>\n        <translation>Deshacer último comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"852\"/>\n        <source>Redo last command</source>\n        <translation>Rehacer último comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"824\"/>\n        <source>Indent one level</source>\n        <translation>Indentar un nivel</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"858\"/>\n        <source>Zoom in</source>\n        <translation>Aumentar zoom</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"864\"/>\n        <source>Zoom out</source>\n        <translation>Disminuir zoom</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"818\"/>\n        <source>Formfeed</source>\n        <translation>Carga de la página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"726\"/>\n        <source>Cut current line</source>\n        <translation>Cortar línea actual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"720\"/>\n        <source>Delete current line</source>\n        <translation>Borrar línea actual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"732\"/>\n        <source>Copy current line</source>\n        <translation>Copiar línea actual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"776\"/>\n        <source>Convert selection to lower case</source>\n        <translation>Convertir selección a minúsculas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"782\"/>\n        <source>Convert selection to upper case</source>\n        <translation>Convertir selección a mayúsculas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"770\"/>\n        <source>Duplicate selection</source>\n        <translation>Duplicar selección</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerAVS</name>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"280\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"283\"/>\n        <source>Block comment</source>\n        <translation>Comentario de bloque</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"286\"/>\n        <source>Nested block comment</source>\n        <translation>Comentario de bloque anidado</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"289\"/>\n        <source>Line comment</source>\n        <translation>Comentario de línea</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"301\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"304\"/>\n        <source>Triple double-quoted string</source>\n        <translation>Cadena con triple comilla doble</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"307\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"310\"/>\n        <source>Filter</source>\n        <translation>Filtro</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"313\"/>\n        <source>Plugin</source>\n        <translation>Plugin</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"316\"/>\n        <source>Function</source>\n        <translation>Función</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"319\"/>\n        <source>Clip property</source>\n        <translation>Propiedad de recorte</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"322\"/>\n        <source>User defined</source>\n        <translation>Definido por el usuario</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBash</name>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"193\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"196\"/>\n        <source>Error</source>\n        <translation>Error</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"199\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"202\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"205\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"208\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"211\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"214\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"217\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"220\"/>\n        <source>Scalar</source>\n        <translation>Escalar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"223\"/>\n        <source>Parameter expansion</source>\n        <translation>Expansión de parámetros</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"226\"/>\n        <source>Backticks</source>\n        <translation>Comilla inversa</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"229\"/>\n        <source>Here document delimiter</source>\n        <translation>Delimitador de documento integrado (here document)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"232\"/>\n        <source>Single-quoted here document</source>\n        <translation>Documento integrado (here document) con comilla simple</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBatch</name>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"164\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"167\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"173\"/>\n        <source>Label</source>\n        <translation>Etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"176\"/>\n        <source>Hide command character</source>\n        <translation>Ocultar caracteres de comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"179\"/>\n        <source>External command</source>\n        <translation>Comando externo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"182\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"185\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCMake</name>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"181\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"184\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"187\"/>\n        <source>String</source>\n        <translation>Cadena de caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"190\"/>\n        <source>Left quoted string</source>\n        <translation>Cadena con comillas a la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"193\"/>\n        <source>Right quoted string</source>\n        <translation>Cadena con comillas a la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"196\"/>\n        <source>Function</source>\n        <translation>Función</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"199\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"202\"/>\n        <source>Label</source>\n        <translation>Etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"205\"/>\n        <source>User defined</source>\n        <translation>Definido por el usuario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"208\"/>\n        <source>WHILE block</source>\n        <translation>Bloque WHILE</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"211\"/>\n        <source>FOREACH block</source>\n        <translation>Bloque FOREACH</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"214\"/>\n        <source>IF block</source>\n        <translation>Bloque IF</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"217\"/>\n        <source>MACRO block</source>\n        <translation>Bloque MACRO</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"220\"/>\n        <source>Variable within a string</source>\n        <translation>Variable en una cadena</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"223\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCPP</name>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"340\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"343\"/>\n        <source>Inactive default</source>\n        <translation>Por defecto inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"346\"/>\n        <source>C comment</source>\n        <translation>Comentario C</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"349\"/>\n        <source>Inactive C comment</source>\n        <translation>Comentario C inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"352\"/>\n        <source>C++ comment</source>\n        <translation>Comentario C++</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"355\"/>\n        <source>Inactive C++ comment</source>\n        <translation>Comentario C++ inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"358\"/>\n        <source>JavaDoc style C comment</source>\n        <translation>Comentario C de estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"361\"/>\n        <source>Inactive JavaDoc style C comment</source>\n        <translation>Comentario C estilo JavaDoc inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"364\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"367\"/>\n        <source>Inactive number</source>\n        <translation>Número inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"370\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"373\"/>\n        <source>Inactive keyword</source>\n        <translation>Palabra clave inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"376\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"379\"/>\n        <source>Inactive double-quoted string</source>\n        <translation>Cadena con doble comilla inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"382\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"385\"/>\n        <source>Inactive single-quoted string</source>\n        <translation>Cadena con comilla simple inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"388\"/>\n        <source>IDL UUID</source>\n        <translation>IDL UUID</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"391\"/>\n        <source>Inactive IDL UUID</source>\n        <translation>IDL UUID inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"394\"/>\n        <source>Pre-processor block</source>\n        <translation>Bloque de preprocesador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"397\"/>\n        <source>Inactive pre-processor block</source>\n        <translation>Bloque de preprocesador inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"400\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"403\"/>\n        <source>Inactive operator</source>\n        <translation>Operador inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"406\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"409\"/>\n        <source>Inactive identifier</source>\n        <translation>Identificador inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"412\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"415\"/>\n        <source>Inactive unclosed string</source>\n        <translation>Cadena sin cerrar inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"418\"/>\n        <source>C# verbatim string</source>\n        <translation>Cadena C# textual</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"421\"/>\n        <source>Inactive C# verbatim string</source>\n        <translation>Cadena C# textual inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"424\"/>\n        <source>JavaScript regular expression</source>\n        <translation>Expresión regular JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"427\"/>\n        <source>Inactive JavaScript regular expression</source>\n        <translation>Expresión regular JavaScript inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"430\"/>\n        <source>JavaDoc style C++ comment</source>\n        <translation>Comentario C++ de estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"433\"/>\n        <source>Inactive JavaDoc style C++ comment</source>\n        <translation>Comentario C++ estilo JavaDoc inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"436\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Identificadores y palabras clave secundarios</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"439\"/>\n        <source>Inactive secondary keywords and identifiers</source>\n        <translation>Identificadores y palabras clave secundarios inactivos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"442\"/>\n        <source>JavaDoc keyword</source>\n        <translation>Palabra clave de Javadoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"445\"/>\n        <source>Inactive JavaDoc keyword</source>\n        <translation>Palabra clave de JavaDoc inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"448\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>Error en palabra clave de Javadoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"451\"/>\n        <source>Inactive JavaDoc keyword error</source>\n        <translation>Error en palabra clave de Javadoc inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"454\"/>\n        <source>Global classes and typedefs</source>\n        <translation>Clases globales y typedefs</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"457\"/>\n        <source>Inactive global classes and typedefs</source>\n        <translation>Clases globales y typedefs inactivos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"460\"/>\n        <source>C++ raw string</source>\n        <translation>Cadena en bruto C++</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"463\"/>\n        <source>Inactive C++ raw string</source>\n        <translation>Cadena inactiva C++</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"466\"/>\n        <source>Vala triple-quoted verbatim string</source>\n        <translation>Cadena Vala con triple comilla textual</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"469\"/>\n        <source>Inactive Vala triple-quoted verbatim string</source>\n        <translation>Cadena Vala con triple comilla textual inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"472\"/>\n        <source>Pike hash-quoted string</source>\n        <translation>Cadena Pike con hash entrecomillado</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"475\"/>\n        <source>Inactive Pike hash-quoted string</source>\n        <translation>Cadena Pike con hash entrecomillado inactiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"478\"/>\n        <source>Pre-processor C comment</source>\n        <translation>Comentario C de preprocesador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"481\"/>\n        <source>Inactive pre-processor C comment</source>\n        <translation>Comentario C de preprocesador inactivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"484\"/>\n        <source>JavaDoc style pre-processor comment</source>\n        <translation>Comentario de preprocesador estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"487\"/>\n        <source>Inactive JavaDoc style pre-processor comment</source>\n        <translation>Comentario de preprocesador estilo JavaDoc inactivo</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSS</name>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"225\"/>\n        <source>Tag</source>\n        <translation>Etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"228\"/>\n        <source>Class selector</source>\n        <translation>Selector de clase</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"231\"/>\n        <source>Pseudo-class</source>\n        <translation>Pseudoclase</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"234\"/>\n        <source>Unknown pseudo-class</source>\n        <translation>Pseudoclase desconocida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"237\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"240\"/>\n        <source>CSS1 property</source>\n        <translation>Propiedad CSS1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"243\"/>\n        <source>Unknown property</source>\n        <translation>Propiedad desconocida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"246\"/>\n        <source>Value</source>\n        <translation>Valor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"249\"/>\n        <source>ID selector</source>\n        <translation>Selector de ID</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"252\"/>\n        <source>Important</source>\n        <translation>Importante</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"255\"/>\n        <source>@-rule</source>\n        <translation>Regla-@</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"258\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"261\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"264\"/>\n        <source>CSS2 property</source>\n        <translation>Propiedad CSS2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"267\"/>\n        <source>Attribute</source>\n        <translation>Atributo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"270\"/>\n        <source>CSS3 property</source>\n        <translation>Propiedad CSS3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"273\"/>\n        <source>Pseudo-element</source>\n        <translation>Pseudoelemento</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"276\"/>\n        <source>Extended CSS property</source>\n        <translation>Propiedad CSS extendida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"279\"/>\n        <source>Extended pseudo-class</source>\n        <translation>Pseudoclase extendida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"282\"/>\n        <source>Extended pseudo-element</source>\n        <translation>Pseudoelemento extendido</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"285\"/>\n        <source>Media rule</source>\n        <translation>Regla de &apos;@media&apos;</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"288\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSharp</name>\n    <message>\n        <location filename=\"qscilexercsharp.cpp\" line=\"95\"/>\n        <source>Verbatim string</source>\n        <translation>Cadena textual</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCoffeeScript</name>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"244\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"247\"/>\n        <source>C-style comment</source>\n        <translation>Comentario de estilo C</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"250\"/>\n        <source>C++-style comment</source>\n        <translation>Comentario de estilo C++</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"253\"/>\n        <source>JavaDoc C-style comment</source>\n        <translation>Comentario de estilo JavaDoc C</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"256\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"259\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"262\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"265\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comilla simple</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"268\"/>\n        <source>IDL UUID</source>\n        <translation>IDL UUID</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"271\"/>\n        <source>Pre-processor block</source>\n        <translation>Bloque de preprocesador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"274\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"277\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"280\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"283\"/>\n        <source>C# verbatim string</source>\n        <translation>Cadena C# textual</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"286\"/>\n        <source>Regular expression</source>\n        <translation>Expresión regular</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"289\"/>\n        <source>JavaDoc C++-style comment</source>\n        <translation>Comentario de estilo JavaDoc C++</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"292\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Identificadores y palabras clave secundarios</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"295\"/>\n        <source>JavaDoc keyword</source>\n        <translation>Palabra clave de JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>Error en palabra clave de JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"301\"/>\n        <source>Global classes</source>\n        <translation>Clases globales</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"304\"/>\n        <source>Block comment</source>\n        <translation>Comentario de bloque</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"307\"/>\n        <source>Block regular expression</source>\n        <translation>Expresión regular de bloque</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"310\"/>\n        <source>Block regular expression comment</source>\n        <translation>Comentario de expresión regular de bloque</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerD</name>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"259\"/>\n        <source>Block comment</source>\n        <translation>Comentario de bloque</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"262\"/>\n        <source>Line comment</source>\n        <translation>Comentario de línea</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"265\"/>\n        <source>DDoc style block comment</source>\n        <translation>Comentario de bloque estilo DDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"268\"/>\n        <source>Nesting comment</source>\n        <translation>Comentario anidado</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"271\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"274\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"277\"/>\n        <source>Secondary keyword</source>\n        <translation>Palabra clave secundaria</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"280\"/>\n        <source>Documentation keyword</source>\n        <translation>Palabra clave de documentación</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"283\"/>\n        <source>Type definition</source>\n        <translation>Definición de tipo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"286\"/>\n        <source>String</source>\n        <translation>Cadena de caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"289\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"292\"/>\n        <source>Character</source>\n        <translation>Carácter</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"301\"/>\n        <source>DDoc style line comment</source>\n        <translation>Comentario de línea estilo DDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"304\"/>\n        <source>DDoc keyword</source>\n        <translation>Palabra clave DDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"307\"/>\n        <source>DDoc keyword error</source>\n        <translation>Error en palabra clave DDOC</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"310\"/>\n        <source>Backquoted string</source>\n        <translation>Cadena con comillas hacia atrás</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"313\"/>\n        <source>Raw string</source>\n        <translation>Cadena en bruto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"316\"/>\n        <source>User defined 1</source>\n        <translation>Definido por el usuario 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"319\"/>\n        <source>User defined 2</source>\n        <translation>Definido por el usuario 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"322\"/>\n        <source>User defined 3</source>\n        <translation>Definido por el usuario 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerDiff</name>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"92\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"95\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"98\"/>\n        <source>Command</source>\n        <translation>Comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"101\"/>\n        <source>Header</source>\n        <translation>Encabezado</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"104\"/>\n        <source>Position</source>\n        <translation>Posición</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"107\"/>\n        <source>Removed line</source>\n        <translation>Línea eliminada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"110\"/>\n        <source>Added line</source>\n        <translation>Línea añadida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"113\"/>\n        <source>Changed line</source>\n        <translation>Línea modificada</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerFortran77</name>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"176\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"179\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"182\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"185\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"188\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"191\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"194\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"197\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"200\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"203\"/>\n        <source>Intrinsic function</source>\n        <translation>Función intrínseca</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"206\"/>\n        <source>Extended function</source>\n        <translation>Función extendida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"209\"/>\n        <source>Pre-processor block</source>\n        <translation>Bloque de preprocesador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"212\"/>\n        <source>Dotted operator</source>\n        <translation>Operador punteado</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"215\"/>\n        <source>Label</source>\n        <translation>Etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"218\"/>\n        <source>Continuation</source>\n        <translation>Continuación</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerHTML</name>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"553\"/>\n        <source>HTML default</source>\n        <translation>HTML por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"556\"/>\n        <source>Tag</source>\n        <translation>Etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"559\"/>\n        <source>Unknown tag</source>\n        <translation>Etiqueta desconocida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"562\"/>\n        <source>Attribute</source>\n        <translation>Atributo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"565\"/>\n        <source>Unknown attribute</source>\n        <translation>Atributo desconocido</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"568\"/>\n        <source>HTML number</source>\n        <translation>Número HTML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"571\"/>\n        <source>HTML double-quoted string</source>\n        <translation>Cadena HTML con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"574\"/>\n        <source>HTML single-quoted string</source>\n        <translation>Cadena HTML con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"577\"/>\n        <source>Other text in a tag</source>\n        <translation>Otro texto en una etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"580\"/>\n        <source>HTML comment</source>\n        <translation>Comentario HTML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"583\"/>\n        <source>Entity</source>\n        <translation>Entidad</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"586\"/>\n        <source>End of a tag</source>\n        <translation>Final de una etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"589\"/>\n        <source>Start of an XML fragment</source>\n        <translation>Inicio de un fragmento XML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"592\"/>\n        <source>End of an XML fragment</source>\n        <translation>Fin de un fragmento XML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"595\"/>\n        <source>Script tag</source>\n        <translation>Etiqueta de script</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"598\"/>\n        <source>Start of an ASP fragment with @</source>\n        <translation>Inicio de un fragmento ASP con @</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"601\"/>\n        <source>Start of an ASP fragment</source>\n        <translation>Inicio de un fragmento ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"604\"/>\n        <source>CDATA</source>\n        <translation>CDATA</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"607\"/>\n        <source>Start of a PHP fragment</source>\n        <translation>Inicio de un fragmento PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"610\"/>\n        <source>Unquoted HTML value</source>\n        <translation>Valor HTML sin comillas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"613\"/>\n        <source>ASP X-Code comment</source>\n        <translation>Comentario ASP X-Code</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"616\"/>\n        <source>SGML default</source>\n        <translation>SGML por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"619\"/>\n        <source>SGML command</source>\n        <translation>Comando SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"622\"/>\n        <source>First parameter of an SGML command</source>\n        <translation>Primer parametro de un comando SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"625\"/>\n        <source>SGML double-quoted string</source>\n        <translation>Cadena SGML con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"628\"/>\n        <source>SGML single-quoted string</source>\n        <translation>Cadena SGML con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"631\"/>\n        <source>SGML error</source>\n        <translation>Error SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"634\"/>\n        <source>SGML special entity</source>\n        <translation>Entidad SGML especial</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"637\"/>\n        <source>SGML comment</source>\n        <translation>Comentario SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"640\"/>\n        <source>First parameter comment of an SGML command</source>\n        <translation>Comentario de primer parametro de un comando SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"643\"/>\n        <source>SGML block default</source>\n        <translation>Bloque SGML por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"646\"/>\n        <source>Start of a JavaScript fragment</source>\n        <translation>Inicio de un fragmento JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"649\"/>\n        <source>JavaScript default</source>\n        <translation>JavaScript por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"652\"/>\n        <source>JavaScript comment</source>\n        <translation>Comentario JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"655\"/>\n        <source>JavaScript line comment</source>\n        <translation>Comentario de línea de JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"658\"/>\n        <source>JavaDoc style JavaScript comment</source>\n        <translation>Comentario JavaScript de estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"661\"/>\n        <source>JavaScript number</source>\n        <translation>Número JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"664\"/>\n        <source>JavaScript word</source>\n        <translation>Palabra JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"667\"/>\n        <source>JavaScript keyword</source>\n        <translation>Palabra clave JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"670\"/>\n        <source>JavaScript double-quoted string</source>\n        <translation>Cadena JavaScript con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"673\"/>\n        <source>JavaScript single-quoted string</source>\n        <translation>Cadena JavaScript con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"676\"/>\n        <source>JavaScript symbol</source>\n        <translation>Símbolo JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"679\"/>\n        <source>JavaScript unclosed string</source>\n        <translation>Cadena JavaScript sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"682\"/>\n        <source>JavaScript regular expression</source>\n        <translation>Expresión regular JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"685\"/>\n        <source>Start of an ASP JavaScript fragment</source>\n        <translation>Inicio de un fragmento de ASP JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"688\"/>\n        <source>ASP JavaScript default</source>\n        <translation>ASP JavaScript por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"691\"/>\n        <source>ASP JavaScript comment</source>\n        <translation>Comentario de ASP JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"694\"/>\n        <source>ASP JavaScript line comment</source>\n        <translation>Comentario de línea de ASP JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"697\"/>\n        <source>JavaDoc style ASP JavaScript comment</source>\n        <translation>Comentario ASP JavaScript de estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"700\"/>\n        <source>ASP JavaScript number</source>\n        <translation>Número ASP JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"703\"/>\n        <source>ASP JavaScript word</source>\n        <translation>Palabra ASP JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"706\"/>\n        <source>ASP JavaScript keyword</source>\n        <translation>Palabra clave ASP JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"709\"/>\n        <source>ASP JavaScript double-quoted string</source>\n        <translation>Cadena ASP JavaScript con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"712\"/>\n        <source>ASP JavaScript single-quoted string</source>\n        <translation>Cadena ASP JavaScript con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"715\"/>\n        <source>ASP JavaScript symbol</source>\n        <translation>Símbolo ASP JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"718\"/>\n        <source>ASP JavaScript unclosed string</source>\n        <translation>Cadena ASP JavaScript sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"721\"/>\n        <source>ASP JavaScript regular expression</source>\n        <translation>Expresión regular ASP JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"724\"/>\n        <source>Start of a VBScript fragment</source>\n        <translation>Inicio de un fragmento VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"727\"/>\n        <source>VBScript default</source>\n        <translation>VBScript por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"730\"/>\n        <source>VBScript comment</source>\n        <translation>Comentario VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"733\"/>\n        <source>VBScript number</source>\n        <translation>Número VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"736\"/>\n        <source>VBScript keyword</source>\n        <translation>Palabra clave VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"739\"/>\n        <source>VBScript string</source>\n        <translation>Cadena de caracteres VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"742\"/>\n        <source>VBScript identifier</source>\n        <translation>Identificador VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"745\"/>\n        <source>VBScript unclosed string</source>\n        <translation>Cadena VBScript sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"748\"/>\n        <source>Start of an ASP VBScript fragment</source>\n        <translation>Inicio de un fragmento de ASP VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"751\"/>\n        <source>ASP VBScript default</source>\n        <translation>ASP VBScript por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"754\"/>\n        <source>ASP VBScript comment</source>\n        <translation>Comentario de ASP VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"757\"/>\n        <source>ASP VBScript number</source>\n        <translation>Número ASP VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"760\"/>\n        <source>ASP VBScript keyword</source>\n        <translation>Palabra clave ASP VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"763\"/>\n        <source>ASP VBScript string</source>\n        <translation>Cadena de caracteres ASP VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"766\"/>\n        <source>ASP VBScript identifier</source>\n        <translation>Identificador ASP VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"769\"/>\n        <source>ASP VBScript unclosed string</source>\n        <translation>Cadena ASP VBScript sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"772\"/>\n        <source>Start of a Python fragment</source>\n        <translation>Inicio de un fragmento Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"775\"/>\n        <source>Python default</source>\n        <translation>Python por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"778\"/>\n        <source>Python comment</source>\n        <translation>Comentario Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"781\"/>\n        <source>Python number</source>\n        <translation>Número Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"784\"/>\n        <source>Python double-quoted string</source>\n        <translation>Cadena Python con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"787\"/>\n        <source>Python single-quoted string</source>\n        <translation>Cadena Python con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"790\"/>\n        <source>Python keyword</source>\n        <translation>Palabra clave de Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"793\"/>\n        <source>Python triple double-quoted string</source>\n        <translation>Cadena Python con triple comilla doble</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"796\"/>\n        <source>Python triple single-quoted string</source>\n        <translation>Cadena Python con triple comilla simple</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"799\"/>\n        <source>Python class name</source>\n        <translation>Nombre de clase Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"802\"/>\n        <source>Python function or method name</source>\n        <translation>Nombre de método o función Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"805\"/>\n        <source>Python operator</source>\n        <translation>Operador Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"808\"/>\n        <source>Python identifier</source>\n        <translation>Identificador Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"811\"/>\n        <source>Start of an ASP Python fragment</source>\n        <translation>Inicio de un fragmento ASP Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"814\"/>\n        <source>ASP Python default</source>\n        <translation>ASP Python por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"817\"/>\n        <source>ASP Python comment</source>\n        <translation>Comentario ASP Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"820\"/>\n        <source>ASP Python number</source>\n        <translation>Número ASP Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"823\"/>\n        <source>ASP Python double-quoted string</source>\n        <translation>Cadena ASP Python con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"826\"/>\n        <source>ASP Python single-quoted string</source>\n        <translation>Cadena ASP Python con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"829\"/>\n        <source>ASP Python keyword</source>\n        <translation>Palabra clave de ASP Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"832\"/>\n        <source>ASP Python triple double-quoted string</source>\n        <translation>Cadena ASP Python con triple comilla doble</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"835\"/>\n        <source>ASP Python triple single-quoted string</source>\n        <translation>Cadena ASP Python con triple comilla simple</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"838\"/>\n        <source>ASP Python class name</source>\n        <translation>Nombre de clase ASP Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"841\"/>\n        <source>ASP Python function or method name</source>\n        <translation>Nombre de método o función ASP Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"844\"/>\n        <source>ASP Python operator</source>\n        <translation>Operador ASP Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"847\"/>\n        <source>ASP Python identifier</source>\n        <translation>Identificador ASP Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"850\"/>\n        <source>PHP default</source>\n        <translation>PHP por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"853\"/>\n        <source>PHP double-quoted string</source>\n        <translation>Cadena PHP con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"856\"/>\n        <source>PHP single-quoted string</source>\n        <translation>Cadena PHP con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"859\"/>\n        <source>PHP keyword</source>\n        <translation>Palabra clave PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"862\"/>\n        <source>PHP number</source>\n        <translation>Número PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"865\"/>\n        <source>PHP variable</source>\n        <translation>Variable PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"868\"/>\n        <source>PHP comment</source>\n        <translation>Comentario PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"871\"/>\n        <source>PHP line comment</source>\n        <translation>Comentario de línea PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"874\"/>\n        <source>PHP double-quoted variable</source>\n        <translation>Variable PHP con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"877\"/>\n        <source>PHP operator</source>\n        <translation>Operador PHP</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerIDL</name>\n    <message>\n        <location filename=\"qscilexeridl.cpp\" line=\"87\"/>\n        <source>UUID</source>\n        <translation>UUID</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerJavaScript</name>\n    <message>\n        <location filename=\"qscilexerjavascript.cpp\" line=\"97\"/>\n        <source>Regular expression</source>\n        <translation>Expresión regular</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerLua</name>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"218\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"221\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"224\"/>\n        <source>Line comment</source>\n        <translation>Comentario de línea</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"227\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"230\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"233\"/>\n        <source>String</source>\n        <translation>Cadena de caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"236\"/>\n        <source>Character</source>\n        <translation>Carácter</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"239\"/>\n        <source>Literal string</source>\n        <translation>Cadena literal</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"242\"/>\n        <source>Preprocessor</source>\n        <translation>Preprocesador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"245\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"248\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"251\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"254\"/>\n        <source>Basic functions</source>\n        <translation>Funciones basicas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"257\"/>\n        <source>String, table and maths functions</source>\n        <translation>Funcines de cadena, tabla y matemáticas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"260\"/>\n        <source>Coroutines, i/o and system facilities</source>\n        <translation>Co-rutinas, e/s y funciones del sistema</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"263\"/>\n        <source>User defined 1</source>\n        <translation>Definido por el usuario 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"266\"/>\n        <source>User defined 2</source>\n        <translation>Definido por el usuario 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"269\"/>\n        <source>User defined 3</source>\n        <translation>Definido por el usuario 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"272\"/>\n        <source>User defined 4</source>\n        <translation>Definido por el usuario 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"275\"/>\n        <source>Label</source>\n        <translation>Etiqueta</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMakefile</name>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"116\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"119\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"122\"/>\n        <source>Preprocessor</source>\n        <translation>Preprocesador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"125\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"128\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"131\"/>\n        <source>Target</source>\n        <translation>Objetivo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"134\"/>\n        <source>Error</source>\n        <translation>Error</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMatlab</name>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"123\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"126\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"129\"/>\n        <source>Command</source>\n        <translation>Comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"132\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"135\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"138\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"141\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"144\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"147\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPO</name>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"90\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"93\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"96\"/>\n        <source>Message identifier</source>\n        <translation>Identificador de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"99\"/>\n        <source>Message identifier text</source>\n        <translation>Texto identificador de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"102\"/>\n        <source>Message string</source>\n        <translation>Cadena de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"105\"/>\n        <source>Message string text</source>\n        <translation>Texto de cadena de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"108\"/>\n        <source>Message context</source>\n        <translation>Contexto de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"111\"/>\n        <source>Message context text</source>\n        <translation>Texto de contexto de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"114\"/>\n        <source>Fuzzy flag</source>\n        <translation>Señalador difuso</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"117\"/>\n        <source>Programmer comment</source>\n        <translation>Comentario de programador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"120\"/>\n        <source>Reference</source>\n        <translation>Referencia</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"123\"/>\n        <source>Flags</source>\n        <translation>Señaladores</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"126\"/>\n        <source>Message identifier text end-of-line</source>\n        <translation>Fin de línea de texto identificador de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"129\"/>\n        <source>Message string text end-of-line</source>\n        <translation>Fin de línea de texto de cadena de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"132\"/>\n        <source>Message context text end-of-line</source>\n        <translation>Fin de línea de texto de contexto de mensaje</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPOV</name>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"267\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"270\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"273\"/>\n        <source>Comment line</source>\n        <translation>Línea de comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"276\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"279\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"282\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"285\"/>\n        <source>String</source>\n        <translation>Cadena de caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"288\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"291\"/>\n        <source>Directive</source>\n        <translation>Directiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"294\"/>\n        <source>Bad directive</source>\n        <translation>Mala directiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"297\"/>\n        <source>Objects, CSG and appearance</source>\n        <translation>Objetos, CSG y apariencia</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"300\"/>\n        <source>Types, modifiers and items</source>\n        <translation>Tipos, modificadores y elementos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"303\"/>\n        <source>Predefined identifiers</source>\n        <translation>Identificadores predefinidos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"306\"/>\n        <source>Predefined functions</source>\n        <translation>Funciones predefinidas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"309\"/>\n        <source>User defined 1</source>\n        <translation>Definido por el usuario 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"312\"/>\n        <source>User defined 2</source>\n        <translation>Definido por el usuario 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"315\"/>\n        <source>User defined 3</source>\n        <translation>Definido por el usuario 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPascal</name>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"246\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"258\"/>\n        <source>Line comment</source>\n        <translation>Comentario de línea</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"267\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"273\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"276\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"285\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"249\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"252\"/>\n        <source>&apos;{ ... }&apos; style comment</source>\n        <translation>Comentario de estilo &apos;{ ... }&apos; </translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"255\"/>\n        <source>&apos;(* ... *)&apos; style comment</source>\n        <translation>Comentario de estilo &apos;(* ... *)&apos;</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"261\"/>\n        <source>&apos;{$ ... }&apos; style pre-processor block</source>\n        <translation>Bloque de preprocesador de estilo &apos;{$ ... }&apos;</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"264\"/>\n        <source>&apos;(*$ ... *)&apos; style pre-processor block</source>\n        <translation>Bloque de preprocesador de estilo &apos;(*$ ... *)&apos;</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"270\"/>\n        <source>Hexadecimal number</source>\n        <translation>Número hexadecimal</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"279\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"282\"/>\n        <source>Character</source>\n        <translation>Carácter</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"288\"/>\n        <source>Inline asm</source>\n        <translation>asm inline </translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPerl</name>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"318\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"321\"/>\n        <source>Error</source>\n        <translation>Error</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"324\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"327\"/>\n        <source>POD</source>\n        <translation>POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"330\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"333\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"336\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"339\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"342\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"345\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"348\"/>\n        <source>Scalar</source>\n        <translation>Escalar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"351\"/>\n        <source>Array</source>\n        <translation>Array</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"354\"/>\n        <source>Hash</source>\n        <translation>Hash</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"357\"/>\n        <source>Symbol table</source>\n        <translation>Tabla de símbolos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"360\"/>\n        <source>Regular expression</source>\n        <translation>Expresión regular</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"363\"/>\n        <source>Substitution</source>\n        <translation>Sustitución</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"366\"/>\n        <source>Backticks</source>\n        <translation>Comilla inversa</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"369\"/>\n        <source>Data section</source>\n        <translation>Sección de datos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"372\"/>\n        <source>Here document delimiter</source>\n        <translation>Delimitador de documento integrado (here document)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"375\"/>\n        <source>Single-quoted here document</source>\n        <translation>Documento integrado (here document) con comilla simple</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"378\"/>\n        <source>Double-quoted here document</source>\n        <translation>Documento integrado (here document) con comilla doble</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"381\"/>\n        <source>Backtick here document</source>\n        <translation>Documento integrado (here document) con comilla inversa</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"384\"/>\n        <source>Quoted string (q)</source>\n        <translation>Cadena con comillas (q)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"387\"/>\n        <source>Quoted string (qq)</source>\n        <translation>Cadena con comillas (qq)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"390\"/>\n        <source>Quoted string (qx)</source>\n        <translation>Cadena con comillas (qx)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"393\"/>\n        <source>Quoted string (qr)</source>\n        <translation>Cadena con comillas (qr)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"396\"/>\n        <source>Quoted string (qw)</source>\n        <translation>Cadena con comillas (qw)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"399\"/>\n        <source>POD verbatim</source>\n        <translation>POD textual</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"402\"/>\n        <source>Subroutine prototype</source>\n        <translation>Prototipo de subrutina</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"405\"/>\n        <source>Format identifier</source>\n        <translation>Identificador de formato</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"408\"/>\n        <source>Format body</source>\n        <translation>Cuerpo de formato</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"411\"/>\n        <source>Double-quoted string (interpolated variable)</source>\n        <translation>Cadena con doble comilla (variable interpolada)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"414\"/>\n        <source>Translation</source>\n        <translation>Traducción</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"417\"/>\n        <source>Regular expression (interpolated variable)</source>\n        <translation>Expresión regular (variable interpolada)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"420\"/>\n        <source>Substitution (interpolated variable)</source>\n        <translation>Substitución (variable interpolada)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"423\"/>\n        <source>Backticks (interpolated variable)</source>\n        <translation>Comilla hacia atrás (variable interpolada)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"426\"/>\n        <source>Double-quoted here document (interpolated variable)</source>\n        <translation>Here document con comilla doble (variable interpolada)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"429\"/>\n        <source>Backtick here document (interpolated variable)</source>\n        <translation>Here document con comilla hacia atrás (variable interpolada)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"432\"/>\n        <source>Quoted string (qq, interpolated variable)</source>\n        <translation>Cadena entrecomillada (qq, variable interpolada)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"435\"/>\n        <source>Quoted string (qx, interpolated variable)</source>\n        <translation>Cadena entrecomillada (qx, variable interpolada)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"438\"/>\n        <source>Quoted string (qr, interpolated variable)</source>\n        <translation>Cadena entrecomillada (qr, variable interpolada)</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPostScript</name>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"249\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"252\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"255\"/>\n        <source>DSC comment</source>\n        <translation>Comentario DSC</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"258\"/>\n        <source>DSC comment value</source>\n        <translation>Valor de comentario DSC</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"261\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"264\"/>\n        <source>Name</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"267\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"270\"/>\n        <source>Literal</source>\n        <translation>Literal</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"273\"/>\n        <source>Immediately evaluated literal</source>\n        <translation>Literal de evaluación inmediata</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"276\"/>\n        <source>Array parenthesis</source>\n        <translation>Paréntesis de array</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"279\"/>\n        <source>Dictionary parenthesis</source>\n        <translation>Paréntesis de diccionario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"282\"/>\n        <source>Procedure parenthesis</source>\n        <translation>Paréntesis de procedimiento</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"285\"/>\n        <source>Text</source>\n        <translation>Texto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"288\"/>\n        <source>Hexadecimal string</source>\n        <translation>Cadena hexadecimal</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"291\"/>\n        <source>Base85 string</source>\n        <translation>Cadena Base85</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"294\"/>\n        <source>Bad string character</source>\n        <translation>Carácter de cadena mala</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerProperties</name>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"111\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"114\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"117\"/>\n        <source>Section</source>\n        <translation>Sección</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"120\"/>\n        <source>Assignment</source>\n        <translation>Asignación</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"123\"/>\n        <source>Default value</source>\n        <translation>Valor por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"126\"/>\n        <source>Key</source>\n        <translation>Clave</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPython</name>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"225\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"228\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"231\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"234\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"237\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"240\"/>\n        <source>Triple single-quoted string</source>\n        <translation>Cadena con triple comilla simple</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"243\"/>\n        <source>Triple double-quoted string</source>\n        <translation>Cadena con triple comilla doble</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"246\"/>\n        <source>Class name</source>\n        <translation>Nombre de clase</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"249\"/>\n        <source>Function or method name</source>\n        <translation>Nombre de método o función</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"252\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"255\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"258\"/>\n        <source>Comment block</source>\n        <translation>Bloque de comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"261\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"264\"/>\n        <source>Highlighted identifier</source>\n        <translation>Identificador resaltado</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"267\"/>\n        <source>Decorator</source>\n        <translation>Decorador</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerRuby</name>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"239\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"245\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"251\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"257\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"260\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"254\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"263\"/>\n        <source>Class name</source>\n        <translation>Nombre de clase</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"266\"/>\n        <source>Function or method name</source>\n        <translation>Nombre de método o función</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"269\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"272\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"242\"/>\n        <source>Error</source>\n        <translation>Error</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"248\"/>\n        <source>POD</source>\n        <translation>POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"275\"/>\n        <source>Regular expression</source>\n        <translation>Expresión regular</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"278\"/>\n        <source>Global</source>\n        <translation>Global</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"281\"/>\n        <source>Symbol</source>\n        <translation>Símbolo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"284\"/>\n        <source>Module name</source>\n        <translation>Nombre de módulo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"287\"/>\n        <source>Instance variable</source>\n        <translation>Variable de instancia</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"290\"/>\n        <source>Class variable</source>\n        <translation>Variable de clase</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"293\"/>\n        <source>Backticks</source>\n        <translation>Comilla inversa</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"296\"/>\n        <source>Data section</source>\n        <translation>Sección de datos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"299\"/>\n        <source>Here document delimiter</source>\n        <translation>Delimitador de documento integrado (here document)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"302\"/>\n        <source>Here document</source>\n        <translation>Documento integrado (here document)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"305\"/>\n        <source>%q string</source>\n        <translation>Cadena %q</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"308\"/>\n        <source>%Q string</source>\n        <translation>Cadena %Q</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"311\"/>\n        <source>%x string</source>\n        <translation>Cadena %x</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"314\"/>\n        <source>%r string</source>\n        <translation>Cadena %r</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"317\"/>\n        <source>%w string</source>\n        <translation>Cadena %w</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"320\"/>\n        <source>Demoted keyword</source>\n        <translation>Palabra clave degradada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"323\"/>\n        <source>stdin</source>\n        <translation>stdin</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"326\"/>\n        <source>stdout</source>\n        <translation>stdout</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"329\"/>\n        <source>stderr</source>\n        <translation>stderr</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSQL</name>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"259\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"268\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"271\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"277\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadena con comillas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"286\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"289\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"262\"/>\n        <source>Comment line</source>\n        <translation>Línea de comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"265\"/>\n        <source>JavaDoc style comment</source>\n        <translation>Comentario de estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"274\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadena con comillas dobles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"280\"/>\n        <source>SQL*Plus keyword</source>\n        <translation>Palabra clave SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"283\"/>\n        <source>SQL*Plus prompt</source>\n        <translation>Prompt SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"292\"/>\n        <source>SQL*Plus comment</source>\n        <translation>Comentario SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"295\"/>\n        <source># comment line</source>\n        <translation># línea de comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword</source>\n        <translation>Palabra clave de Javadoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"301\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>Error en palabra clave de Javadoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"304\"/>\n        <source>User defined 1</source>\n        <translation>Definido por el usuario 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"307\"/>\n        <source>User defined 2</source>\n        <translation>Definido por el usuario 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"310\"/>\n        <source>User defined 3</source>\n        <translation>Definido por el usuario 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"313\"/>\n        <source>User defined 4</source>\n        <translation>Definido por el usuario 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"316\"/>\n        <source>Quoted identifier</source>\n        <translation>Identificador entrecomillado</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSpice</name>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"156\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"159\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"162\"/>\n        <source>Command</source>\n        <translation>Comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"165\"/>\n        <source>Function</source>\n        <translation>Función</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"168\"/>\n        <source>Parameter</source>\n        <translation>Parámetro</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"171\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"174\"/>\n        <source>Delimiter</source>\n        <translation>Delimitador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"177\"/>\n        <source>Value</source>\n        <translation>Valor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"180\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTCL</name>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"283\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"286\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"289\"/>\n        <source>Comment line</source>\n        <translation>Línea de comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"295\"/>\n        <source>Quoted keyword</source>\n        <translation>Palabra clave entrecomillada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"298\"/>\n        <source>Quoted string</source>\n        <translation>Cadena entrecomillada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"301\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"304\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"307\"/>\n        <source>Substitution</source>\n        <translation>Sustitución</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"310\"/>\n        <source>Brace substitution</source>\n        <translation>Sustitución de corchetes</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"313\"/>\n        <source>Modifier</source>\n        <translation>Modificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"316\"/>\n        <source>Expand keyword</source>\n        <translation>Expandir palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"319\"/>\n        <source>TCL keyword</source>\n        <translation>Palabra clave TCL</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"322\"/>\n        <source>Tk keyword</source>\n        <translation>Palabra clave Tk</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"325\"/>\n        <source>iTCL keyword</source>\n        <translation>Palabra clave iTCL</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"328\"/>\n        <source>Tk command</source>\n        <translation>Comando Tk</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"331\"/>\n        <source>User defined 1</source>\n        <translation>Definido por el usuario 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"334\"/>\n        <source>User defined 2</source>\n        <translation>Definido por el usuario 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"337\"/>\n        <source>User defined 3</source>\n        <translation>Definido por el usuario 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"340\"/>\n        <source>User defined 4</source>\n        <translation>Definido por el usuario 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"343\"/>\n        <source>Comment box</source>\n        <translation>Caja de comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"346\"/>\n        <source>Comment block</source>\n        <translation>Bloque de comentario</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTeX</name>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"177\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"180\"/>\n        <source>Special</source>\n        <translation>Especial</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"183\"/>\n        <source>Group</source>\n        <translation>Grupo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"186\"/>\n        <source>Symbol</source>\n        <translation>Símbolo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"189\"/>\n        <source>Command</source>\n        <translation>Comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"192\"/>\n        <source>Text</source>\n        <translation>Texto</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVHDL</name>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"197\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"200\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"203\"/>\n        <source>Comment line</source>\n        <translation>Línea de comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"206\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"209\"/>\n        <source>String</source>\n        <translation>Cadena de caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"212\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"215\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"218\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"221\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"224\"/>\n        <source>Standard operator</source>\n        <translation>Operador estándar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"227\"/>\n        <source>Attribute</source>\n        <translation>Atributo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"230\"/>\n        <source>Standard function</source>\n        <translation>Función estándar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"233\"/>\n        <source>Standard package</source>\n        <translation>Paquete estándar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"236\"/>\n        <source>Standard type</source>\n        <translation>Tipo estándar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"239\"/>\n        <source>User defined</source>\n        <translation>Definido por el usuario</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVerilog</name>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"209\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"212\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"215\"/>\n        <source>Line comment</source>\n        <translation>Comentario de línea</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"218\"/>\n        <source>Bang comment</source>\n        <translation>Comentario&apos;Bang</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"221\"/>\n        <source>Number</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"224\"/>\n        <source>Primary keywords and identifiers</source>\n        <translation>Identificadores y palabras clave primarios</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"227\"/>\n        <source>String</source>\n        <translation>Cadena</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"230\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Palabras clave e identificadores secundarios</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"233\"/>\n        <source>System task</source>\n        <translation>Tarea de sistema</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"236\"/>\n        <source>Preprocessor block</source>\n        <translation>Bloque de preprocesador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"239\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"242\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"245\"/>\n        <source>Unclosed string</source>\n        <translation>Cadena sin cerrar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"248\"/>\n        <source>User defined tasks and identifiers</source>\n        <translation>Tareas definidas por el usuario e identificadores</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerYAML</name>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"161\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"164\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"167\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation>Palabra clave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"173\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"176\"/>\n        <source>Reference</source>\n        <translation>Referencia</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"179\"/>\n        <source>Document delimiter</source>\n        <translation>Delimitador de documento</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"182\"/>\n        <source>Text block marker</source>\n        <translation>Marcador de bloque de texto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"185\"/>\n        <source>Syntax error marker</source>\n        <translation>Marcador de error de sintaxis</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"188\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n</context>\n<context>\n    <name>QsciScintilla</name>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4359\"/>\n        <source>&amp;Undo</source>\n        <translation>&amp;Deshacer</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4363\"/>\n        <source>&amp;Redo</source>\n        <translation>&amp;Rehacer</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4369\"/>\n        <source>Cu&amp;t</source>\n        <translation>Cor&amp;tar</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4374\"/>\n        <source>&amp;Copy</source>\n        <translation>&amp;Copiar</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4380\"/>\n        <source>&amp;Paste</source>\n        <translation>&amp;Pegar</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4384\"/>\n        <source>Delete</source>\n        <translation>Borrar</translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4391\"/>\n        <source>Select All</source>\n        <translation>Seleccionar todo</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscintilla_fr.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\">\n<context>\n    <name>QsciCommand</name>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"44\"/>\n        <source>Move down one line</source>\n        <translation>Déplacement d&apos;une ligne vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"54\"/>\n        <source>Extend selection down one line</source>\n        <translation>Extension de la sélection d&apos;une ligne vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"71\"/>\n        <source>Scroll view down one line</source>\n        <translation>Decendre la vue d&apos;une ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"64\"/>\n        <source>Extend rectangular selection down one line</source>\n        <translation>Extension de la sélection rectangulaire d&apos;une ligne vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"81\"/>\n        <source>Move up one line</source>\n        <translation>Déplacement d&apos;une ligne vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"91\"/>\n        <source>Extend selection up one line</source>\n        <translation>Extension de la sélection d&apos;une ligne vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"108\"/>\n        <source>Scroll view up one line</source>\n        <translation>Remonter la vue d&apos;une ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"101\"/>\n        <source>Extend rectangular selection up one line</source>\n        <translation>Extension de la sélection rectangulaire d&apos;une ligne vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"158\"/>\n        <source>Move up one paragraph</source>\n        <translation>Déplacement d&apos;un paragraphe vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"164\"/>\n        <source>Extend selection up one paragraph</source>\n        <translation>Extension de la sélection d&apos;un paragraphe vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"145\"/>\n        <source>Move down one paragraph</source>\n        <translation>Déplacement d&apos;un paragraphe vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"118\"/>\n        <source>Scroll to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"128\"/>\n        <source>Scroll to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"138\"/>\n        <source>Scroll vertically to centre current line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"151\"/>\n        <source>Extend selection down one paragraph</source>\n        <translation>Extension de la sélection d&apos;un paragraphe vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"175\"/>\n        <source>Move left one character</source>\n        <translation>Déplacement d&apos;un caractère vers la gauche</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"185\"/>\n        <source>Extend selection left one character</source>\n        <translation>Extension de la sélection d&apos;un caractère vers la gauche</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"239\"/>\n        <source>Move left one word</source>\n        <translation>Déplacement d&apos;un mot vers la gauche</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"249\"/>\n        <source>Extend selection left one word</source>\n        <translation>Extension de la sélection d&apos;un mot vers la gauche</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"196\"/>\n        <source>Extend rectangular selection left one character</source>\n        <translation>Extension de la sélection rectangulaire d&apos;un caractère vers la gauche</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"207\"/>\n        <source>Move right one character</source>\n        <translation>Déplacement d&apos;un caractère vers la droite</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"217\"/>\n        <source>Extend selection right one character</source>\n        <translation>Extension de la sélection d&apos;un caractère vers la droite</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"259\"/>\n        <source>Move right one word</source>\n        <translation>Déplacement d&apos;un mot vers la droite</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"265\"/>\n        <source>Extend selection right one word</source>\n        <translation>Extension de la sélection d&apos;un mot vers la droite</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"228\"/>\n        <source>Extend rectangular selection right one character</source>\n        <translation>Extension de la sélection rectangulaire d&apos;un caractère vers la droite</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"271\"/>\n        <source>Move to end of previous word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"277\"/>\n        <source>Extend selection to end of previous word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"288\"/>\n        <source>Move to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"298\"/>\n        <source>Extend selection to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"305\"/>\n        <source>Move left one word part</source>\n        <translation>Déplacement d&apos;une part de mot vers la gauche</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"311\"/>\n        <source>Extend selection left one word part</source>\n        <translation>Extension de la sélection d&apos;une part de mot vers la gauche</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"318\"/>\n        <source>Move right one word part</source>\n        <translation>Déplacement d&apos;une part de mot vers la droite</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"324\"/>\n        <source>Extend selection right one word part</source>\n        <translation>Extension de la sélection d&apos;une part de mot vers la droite</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"558\"/>\n        <source>Move up one page</source>\n        <translation>Déplacement d&apos;une page vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"568\"/>\n        <source>Extend selection up one page</source>\n        <translation>Extension de la sélection d&apos;une page vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"578\"/>\n        <source>Extend rectangular selection up one page</source>\n        <translation>Extension de la sélection rectangulaire d&apos;une page vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"593\"/>\n        <source>Move down one page</source>\n        <translation>Déplacement d&apos;une page vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"607\"/>\n        <source>Extend selection down one page</source>\n        <translation>Extension de la sélection d&apos;une page vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"621\"/>\n        <source>Extend rectangular selection down one page</source>\n        <translation>Extension de la sélection rectangulaire d&apos;une page vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"658\"/>\n        <source>Delete current character</source>\n        <translation>Effacement du caractère courant</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"788\"/>\n        <source>Cut selection</source>\n        <translation>Couper la sélection</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"687\"/>\n        <source>Delete word to right</source>\n        <translation>Suppression du mot de droite</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"335\"/>\n        <source>Move to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"345\"/>\n        <source>Extend selection to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"356\"/>\n        <source>Extend rectangular selection to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"367\"/>\n        <source>Move to start of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"377\"/>\n        <source>Extend selection to start of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"384\"/>\n        <source>Move to start of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"391\"/>\n        <source>Extend selection to start of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"402\"/>\n        <source>Move to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"413\"/>\n        <source>Extend selection to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"424\"/>\n        <source>Extend rectangular selection to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"431\"/>\n        <source>Move to first visible character of display in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"438\"/>\n        <source>Extend selection to first visible character in display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"449\"/>\n        <source>Move to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"459\"/>\n        <source>Extend selection to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"470\"/>\n        <source>Extend rectangular selection to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"481\"/>\n        <source>Move to end of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"491\"/>\n        <source>Extend selection to end of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"498\"/>\n        <source>Move to end of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"505\"/>\n        <source>Extend selection to end of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"516\"/>\n        <source>Move to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"526\"/>\n        <source>Extend selection to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"537\"/>\n        <source>Move to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"547\"/>\n        <source>Extend selection to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"628\"/>\n        <source>Stuttered move up one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"634\"/>\n        <source>Stuttered extend selection up one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"641\"/>\n        <source>Stuttered move down one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"647\"/>\n        <source>Stuttered extend selection down one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"674\"/>\n        <source>Delete previous character if not at start of line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"697\"/>\n        <source>Delete right to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"714\"/>\n        <source>Delete line to right</source>\n        <translation>Suppression de la partie droite de la ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"738\"/>\n        <source>Transpose current and previous lines</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"745\"/>\n        <source>Duplicate the current line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"751\"/>\n        <source>Select all</source>\n        <oldsource>Select document</oldsource>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"757\"/>\n        <source>Move selected lines up one line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"763\"/>\n        <source>Move selected lines down one line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"806\"/>\n        <source>Toggle insert/overtype</source>\n        <translation>Basculement Insertion /Ecrasement</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"800\"/>\n        <source>Paste</source>\n        <translation>Coller</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"794\"/>\n        <source>Copy selection</source>\n        <translation>Copier la sélection</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"812\"/>\n        <source>Insert newline</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"830\"/>\n        <source>De-indent one level</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"836\"/>\n        <source>Cancel</source>\n        <translation>Annuler</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"668\"/>\n        <source>Delete previous character</source>\n        <translation>Suppression du dernier caractère</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"681\"/>\n        <source>Delete word to left</source>\n        <translation>Suppression du mot de gauche</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"704\"/>\n        <source>Delete line to left</source>\n        <translation>Effacer la partie gauche de la ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"842\"/>\n        <source>Undo last command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"852\"/>\n        <source>Redo last command</source>\n        <translation>Refaire la dernière commande</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"824\"/>\n        <source>Indent one level</source>\n        <translation>Indentation d&apos;un niveau</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"858\"/>\n        <source>Zoom in</source>\n        <translation>Zoom avant</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"864\"/>\n        <source>Zoom out</source>\n        <translation>Zoom arrière</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"818\"/>\n        <source>Formfeed</source>\n        <translation>Chargement de la page</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"726\"/>\n        <source>Cut current line</source>\n        <translation>Couper la ligne courante</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"720\"/>\n        <source>Delete current line</source>\n        <translation>Suppression de la ligne courante</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"732\"/>\n        <source>Copy current line</source>\n        <translation>Copier la ligne courante</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"776\"/>\n        <source>Convert selection to lower case</source>\n        <translation>Conversion de la ligne courante en minuscules</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"782\"/>\n        <source>Convert selection to upper case</source>\n        <translation>Conversion de la ligne courante en majuscules</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"770\"/>\n        <source>Duplicate selection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerAVS</name>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"280\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"283\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"286\"/>\n        <source>Nested block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"289\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Commentaire de ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"301\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"304\"/>\n        <source>Triple double-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères HTML (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"307\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"310\"/>\n        <source>Filter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"313\"/>\n        <source>Plugin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"316\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"319\"/>\n        <source>Clip property</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"322\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBash</name>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"193\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"196\"/>\n        <source>Error</source>\n        <translation>Erreur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"199\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"202\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"205\"/>\n        <source>Keyword</source>\n        <translation>Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"208\"/>\n        <source>Double-quoted string</source>\n        <translation>Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"211\"/>\n        <source>Single-quoted string</source>\n        <translation>Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"214\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"217\"/>\n        <source>Identifier</source>\n        <translation>Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"220\"/>\n        <source>Scalar</source>\n        <translation>Scalaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"223\"/>\n        <source>Parameter expansion</source>\n        <translation>Extension de paramètre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"226\"/>\n        <source>Backticks</source>\n        <translation>Quotes inverses</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"229\"/>\n        <source>Here document delimiter</source>\n        <translation>Délimiteur de texte intégré (cat &lt;&lt;EOF....EOF)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"232\"/>\n        <source>Single-quoted here document</source>\n        <translation>Document intégré guillemets simples</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBatch</name>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"164\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"167\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation>Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"173\"/>\n        <source>Label</source>\n        <translation>Titre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"176\"/>\n        <source>Hide command character</source>\n        <translation>Cacher le caratère de commande</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"179\"/>\n        <source>External command</source>\n        <translation>Commande externe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"182\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"185\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCMake</name>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"181\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"184\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"187\"/>\n        <source>String</source>\n        <translation type=\"unfinished\">Chaîne de caractères</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"190\"/>\n        <source>Left quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"193\"/>\n        <source>Right quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"196\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"199\"/>\n        <source>Variable</source>\n        <translation type=\"unfinished\">Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"202\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Titre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"205\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"208\"/>\n        <source>WHILE block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"211\"/>\n        <source>FOREACH block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"214\"/>\n        <source>IF block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"217\"/>\n        <source>MACRO block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"220\"/>\n        <source>Variable within a string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"223\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCPP</name>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"340\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"343\"/>\n        <source>Inactive default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"346\"/>\n        <source>C comment</source>\n        <translation>Commentaire C</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"349\"/>\n        <source>Inactive C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"352\"/>\n        <source>C++ comment</source>\n        <translation>Commentaire C++</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"355\"/>\n        <source>Inactive C++ comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"358\"/>\n        <source>JavaDoc style C comment</source>\n        <translation>Commentaire C de style JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"361\"/>\n        <source>Inactive JavaDoc style C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"364\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"367\"/>\n        <source>Inactive number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"370\"/>\n        <source>Keyword</source>\n        <translation>Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"373\"/>\n        <source>Inactive keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"376\"/>\n        <source>Double-quoted string</source>\n        <translation>Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"379\"/>\n        <source>Inactive double-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"382\"/>\n        <source>Single-quoted string</source>\n        <translation>Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"385\"/>\n        <source>Inactive single-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"388\"/>\n        <source>IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"391\"/>\n        <source>Inactive IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"394\"/>\n        <source>Pre-processor block</source>\n        <translation>Instructions de pré-processing</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"397\"/>\n        <source>Inactive pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"400\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"403\"/>\n        <source>Inactive operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"406\"/>\n        <source>Identifier</source>\n        <translation>Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"409\"/>\n        <source>Inactive identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"412\"/>\n        <source>Unclosed string</source>\n        <translation>Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"415\"/>\n        <source>Inactive unclosed string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"418\"/>\n        <source>C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"421\"/>\n        <source>Inactive C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"424\"/>\n        <source>JavaScript regular expression</source>\n        <translation type=\"unfinished\">Expression régulière JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"427\"/>\n        <source>Inactive JavaScript regular expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"430\"/>\n        <source>JavaDoc style C++ comment</source>\n        <translation>Commentaire C++ de style JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"433\"/>\n        <source>Inactive JavaDoc style C++ comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"436\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Seconds mots-clés et identificateurs</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"439\"/>\n        <source>Inactive secondary keywords and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"442\"/>\n        <source>JavaDoc keyword</source>\n        <translation>Mot-clé JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"445\"/>\n        <source>Inactive JavaDoc keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"448\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>Erreur de mot-clé JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"451\"/>\n        <source>Inactive JavaDoc keyword error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"454\"/>\n        <source>Global classes and typedefs</source>\n        <translation>Classes globales et définitions de types</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"457\"/>\n        <source>Inactive global classes and typedefs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"460\"/>\n        <source>C++ raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"463\"/>\n        <source>Inactive C++ raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"466\"/>\n        <source>Vala triple-quoted verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"469\"/>\n        <source>Inactive Vala triple-quoted verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"472\"/>\n        <source>Pike hash-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"475\"/>\n        <source>Inactive Pike hash-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"478\"/>\n        <source>Pre-processor C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"481\"/>\n        <source>Inactive pre-processor C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"484\"/>\n        <source>JavaDoc style pre-processor comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"487\"/>\n        <source>Inactive JavaDoc style pre-processor comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSS</name>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"225\"/>\n        <source>Tag</source>\n        <translation>Balise</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"228\"/>\n        <source>Class selector</source>\n        <translation>Classe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"231\"/>\n        <source>Pseudo-class</source>\n        <translation>Pseudo-classe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"234\"/>\n        <source>Unknown pseudo-class</source>\n        <translation>Peudo-classe inconnue</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"237\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"240\"/>\n        <source>CSS1 property</source>\n        <translation>Propriété CSS1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"243\"/>\n        <source>Unknown property</source>\n        <translation>Propriété inconnue</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"246\"/>\n        <source>Value</source>\n        <translation>Valeur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"249\"/>\n        <source>ID selector</source>\n        <translation>ID</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"252\"/>\n        <source>Important</source>\n        <translation>Important</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"255\"/>\n        <source>@-rule</source>\n        <translation>règle-@</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"258\"/>\n        <source>Double-quoted string</source>\n        <translation>Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"261\"/>\n        <source>Single-quoted string</source>\n        <translation>Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"264\"/>\n        <source>CSS2 property</source>\n        <translation>Propriété CSS2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"267\"/>\n        <source>Attribute</source>\n        <translation>Attribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"270\"/>\n        <source>CSS3 property</source>\n        <translation type=\"unfinished\">Propriété CSS2 {3 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"273\"/>\n        <source>Pseudo-element</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"276\"/>\n        <source>Extended CSS property</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"279\"/>\n        <source>Extended pseudo-class</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"282\"/>\n        <source>Extended pseudo-element</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"285\"/>\n        <source>Media rule</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"288\"/>\n        <source>Variable</source>\n        <translation type=\"unfinished\">Variable</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSharp</name>\n    <message>\n        <location filename=\"qscilexercsharp.cpp\" line=\"95\"/>\n        <source>Verbatim string</source>\n        <translation>Chaine verbatim</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCoffeeScript</name>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"244\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"247\"/>\n        <source>C-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"250\"/>\n        <source>C++-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"253\"/>\n        <source>JavaDoc C-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"256\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"259\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"262\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"265\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"268\"/>\n        <source>IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"271\"/>\n        <source>Pre-processor block</source>\n        <translation type=\"unfinished\">Instructions de pré-processing</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"274\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"277\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"280\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"283\"/>\n        <source>C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"286\"/>\n        <source>Regular expression</source>\n        <translation type=\"unfinished\">Expression régulière</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"289\"/>\n        <source>JavaDoc C++-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"292\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation type=\"unfinished\">Seconds mots-clés et identificateurs</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"295\"/>\n        <source>JavaDoc keyword</source>\n        <translation type=\"unfinished\">Mot-clé JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword error</source>\n        <translation type=\"unfinished\">Erreur de mot-clé JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"301\"/>\n        <source>Global classes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"304\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"307\"/>\n        <source>Block regular expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"310\"/>\n        <source>Block regular expression comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerD</name>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"259\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"262\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Commentaire de ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"265\"/>\n        <source>DDoc style block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"268\"/>\n        <source>Nesting comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"271\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"274\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"277\"/>\n        <source>Secondary keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"280\"/>\n        <source>Documentation keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"283\"/>\n        <source>Type definition</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"286\"/>\n        <source>String</source>\n        <translation type=\"unfinished\">Chaîne de caractères</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"289\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"292\"/>\n        <source>Character</source>\n        <translation type=\"unfinished\">Caractère</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"301\"/>\n        <source>DDoc style line comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"304\"/>\n        <source>DDoc keyword</source>\n        <translation type=\"unfinished\">Mot-clé JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"307\"/>\n        <source>DDoc keyword error</source>\n        <translation type=\"unfinished\">Erreur de mot-clé JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"310\"/>\n        <source>Backquoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"313\"/>\n        <source>Raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"316\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Définition utilisateur 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"319\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Définition utilisateur 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"322\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Définition utilisateur 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerDiff</name>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"92\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"95\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"98\"/>\n        <source>Command</source>\n        <translation>Commande</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"101\"/>\n        <source>Header</source>\n        <translation>En-tête</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"104\"/>\n        <source>Position</source>\n        <translation>Position</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"107\"/>\n        <source>Removed line</source>\n        <translation>Ligne supprimée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"110\"/>\n        <source>Added line</source>\n        <translation>Ligne ajoutée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"113\"/>\n        <source>Changed line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerFortran77</name>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"176\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"179\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"182\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"185\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"188\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"191\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"194\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"197\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"200\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"203\"/>\n        <source>Intrinsic function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"206\"/>\n        <source>Extended function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"209\"/>\n        <source>Pre-processor block</source>\n        <translation type=\"unfinished\">Instructions de pré-processing</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"212\"/>\n        <source>Dotted operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"215\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Titre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"218\"/>\n        <source>Continuation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerHTML</name>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"553\"/>\n        <source>HTML default</source>\n        <translation>HTML par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"556\"/>\n        <source>Tag</source>\n        <translation>Balise</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"559\"/>\n        <source>Unknown tag</source>\n        <translation>Balise inconnue</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"562\"/>\n        <source>Attribute</source>\n        <translation>Attribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"565\"/>\n        <source>Unknown attribute</source>\n        <translation>Attribut inconnu</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"568\"/>\n        <source>HTML number</source>\n        <translation>Nombre HTML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"571\"/>\n        <source>HTML double-quoted string</source>\n        <translation>Chaine de caractères HTML (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"574\"/>\n        <source>HTML single-quoted string</source>\n        <translation>Chaine de caractères HTML (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"577\"/>\n        <source>Other text in a tag</source>\n        <translation>Autre texte dans les balises</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"580\"/>\n        <source>HTML comment</source>\n        <translation>Commentaire HTML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"583\"/>\n        <source>Entity</source>\n        <translation>Entité</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"586\"/>\n        <source>End of a tag</source>\n        <translation>Balise fermante</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"589\"/>\n        <source>Start of an XML fragment</source>\n        <translation>Début de block XML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"592\"/>\n        <source>End of an XML fragment</source>\n        <translation>Fin de block XML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"595\"/>\n        <source>Script tag</source>\n        <translation>Balise de script</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"598\"/>\n        <source>Start of an ASP fragment with @</source>\n        <translation>Début de block ASP avec @</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"601\"/>\n        <source>Start of an ASP fragment</source>\n        <translation>Début de block ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"604\"/>\n        <source>CDATA</source>\n        <translation>CDATA</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"607\"/>\n        <source>Start of a PHP fragment</source>\n        <translation>Début de block PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"610\"/>\n        <source>Unquoted HTML value</source>\n        <translation>Valeur HTML sans guillemets</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"613\"/>\n        <source>ASP X-Code comment</source>\n        <translation>Commentaire X-Code ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"616\"/>\n        <source>SGML default</source>\n        <translation>SGML par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"619\"/>\n        <source>SGML command</source>\n        <translation>Commande SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"622\"/>\n        <source>First parameter of an SGML command</source>\n        <translation>Premier paramètre de commande SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"625\"/>\n        <source>SGML double-quoted string</source>\n        <translation>Chaine de caractères SGML (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"628\"/>\n        <source>SGML single-quoted string</source>\n        <translation>Chaine de caractères SGML (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"631\"/>\n        <source>SGML error</source>\n        <translation>Erreur SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"634\"/>\n        <source>SGML special entity</source>\n        <translation>Entité SGML spéciale</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"637\"/>\n        <source>SGML comment</source>\n        <translation>Commentaire SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"640\"/>\n        <source>First parameter comment of an SGML command</source>\n        <translation>Premier paramètre de commentaire de commande SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"643\"/>\n        <source>SGML block default</source>\n        <translation>Block SGML par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"646\"/>\n        <source>Start of a JavaScript fragment</source>\n        <translation>Début de block JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"649\"/>\n        <source>JavaScript default</source>\n        <translation>JavaScript par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"652\"/>\n        <source>JavaScript comment</source>\n        <translation>Commentaire JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"655\"/>\n        <source>JavaScript line comment</source>\n        <translation>Commentaire de ligne JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"658\"/>\n        <source>JavaDoc style JavaScript comment</source>\n        <translation>Commentaire JavaScript de style JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"661\"/>\n        <source>JavaScript number</source>\n        <translation>Nombre JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"664\"/>\n        <source>JavaScript word</source>\n        <translation>Mot JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"667\"/>\n        <source>JavaScript keyword</source>\n        <translation>Mot-clé JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"670\"/>\n        <source>JavaScript double-quoted string</source>\n        <translation>Chaine de caractères JavaScript (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"673\"/>\n        <source>JavaScript single-quoted string</source>\n        <translation>Chaine de caractères JavaScript (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"676\"/>\n        <source>JavaScript symbol</source>\n        <translation>Symbole JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"679\"/>\n        <source>JavaScript unclosed string</source>\n        <translation>Chaine de caractères JavaScript non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"682\"/>\n        <source>JavaScript regular expression</source>\n        <translation>Expression régulière JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"685\"/>\n        <source>Start of an ASP JavaScript fragment</source>\n        <translation>Début de block JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"688\"/>\n        <source>ASP JavaScript default</source>\n        <translation>JavaScript ASP par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"691\"/>\n        <source>ASP JavaScript comment</source>\n        <translation>Commentaire JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"694\"/>\n        <source>ASP JavaScript line comment</source>\n        <translation>Commentaire de ligne JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"697\"/>\n        <source>JavaDoc style ASP JavaScript comment</source>\n        <translation>Commentaire JavaScript ASP de style JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"700\"/>\n        <source>ASP JavaScript number</source>\n        <translation>Nombre JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"703\"/>\n        <source>ASP JavaScript word</source>\n        <translation>Mot JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"706\"/>\n        <source>ASP JavaScript keyword</source>\n        <translation>Mot-clé JavaScript ASP </translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"709\"/>\n        <source>ASP JavaScript double-quoted string</source>\n        <translation>Chaine de caractères JavaScript ASP (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"712\"/>\n        <source>ASP JavaScript single-quoted string</source>\n        <translation>Chaine de caractères JavaScript ASP (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"715\"/>\n        <source>ASP JavaScript symbol</source>\n        <translation>Symbole JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"718\"/>\n        <source>ASP JavaScript unclosed string</source>\n        <translation>Chaine de caractères JavaScript ASP non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"721\"/>\n        <source>ASP JavaScript regular expression</source>\n        <translation>Expression régulière JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"724\"/>\n        <source>Start of a VBScript fragment</source>\n        <translation>Début de block VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"727\"/>\n        <source>VBScript default</source>\n        <translation>VBScript par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"730\"/>\n        <source>VBScript comment</source>\n        <translation>Commentaire VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"733\"/>\n        <source>VBScript number</source>\n        <translation>Nombre VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"736\"/>\n        <source>VBScript keyword</source>\n        <translation>Mot-clé VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"739\"/>\n        <source>VBScript string</source>\n        <translation>Chaine de caractères VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"742\"/>\n        <source>VBScript identifier</source>\n        <translation>Identificateur VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"745\"/>\n        <source>VBScript unclosed string</source>\n        <translation>Chaine de caractères VBScript non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"748\"/>\n        <source>Start of an ASP VBScript fragment</source>\n        <translation>Début de block VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"751\"/>\n        <source>ASP VBScript default</source>\n        <translation>VBScript ASP par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"754\"/>\n        <source>ASP VBScript comment</source>\n        <translation>Commentaire VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"757\"/>\n        <source>ASP VBScript number</source>\n        <translation>Nombre VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"760\"/>\n        <source>ASP VBScript keyword</source>\n        <translation>Mot-clé VBScript ASP </translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"763\"/>\n        <source>ASP VBScript string</source>\n        <translation>Chaine de caractères VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"766\"/>\n        <source>ASP VBScript identifier</source>\n        <translation>Identificateur VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"769\"/>\n        <source>ASP VBScript unclosed string</source>\n        <translation>Chaine de caractères VBScript ASP non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"772\"/>\n        <source>Start of a Python fragment</source>\n        <translation>Début de block Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"775\"/>\n        <source>Python default</source>\n        <translation>Python par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"778\"/>\n        <source>Python comment</source>\n        <translation>Commentaire Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"781\"/>\n        <source>Python number</source>\n        <translation>Nombre Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"784\"/>\n        <source>Python double-quoted string</source>\n        <translation>Chaine de caractères Python (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"787\"/>\n        <source>Python single-quoted string</source>\n        <translation>Chaine de caractères Python (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"790\"/>\n        <source>Python keyword</source>\n        <translation>Mot-clé Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"793\"/>\n        <source>Python triple double-quoted string</source>\n        <translation>Chaine de caractères Python (triples guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"796\"/>\n        <source>Python triple single-quoted string</source>\n        <translation>Chaine de caractères Python (triples guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"799\"/>\n        <source>Python class name</source>\n        <translation>Nom de classe Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"802\"/>\n        <source>Python function or method name</source>\n        <translation>Méthode ou fonction Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"805\"/>\n        <source>Python operator</source>\n        <translation>Opérateur Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"808\"/>\n        <source>Python identifier</source>\n        <translation>Identificateur Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"811\"/>\n        <source>Start of an ASP Python fragment</source>\n        <translation>Début de block Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"814\"/>\n        <source>ASP Python default</source>\n        <translation>Python ASP par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"817\"/>\n        <source>ASP Python comment</source>\n        <translation>Commentaire Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"820\"/>\n        <source>ASP Python number</source>\n        <translation>Nombre Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"823\"/>\n        <source>ASP Python double-quoted string</source>\n        <translation>Chaine de caractères Python ASP (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"826\"/>\n        <source>ASP Python single-quoted string</source>\n        <translation>Chaine de caractères Python ASP (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"829\"/>\n        <source>ASP Python keyword</source>\n        <translation>Mot-clé Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"832\"/>\n        <source>ASP Python triple double-quoted string</source>\n        <translation>Chaine de caractères Python ASP (triples guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"835\"/>\n        <source>ASP Python triple single-quoted string</source>\n        <translation>Chaine de caractères Python ASP (triples guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"838\"/>\n        <source>ASP Python class name</source>\n        <translation>Nom de classe Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"841\"/>\n        <source>ASP Python function or method name</source>\n        <translation>Méthode ou fonction Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"844\"/>\n        <source>ASP Python operator</source>\n        <translation>Opérateur Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"847\"/>\n        <source>ASP Python identifier</source>\n        <translation>Identificateur Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"850\"/>\n        <source>PHP default</source>\n        <translation>PHP par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"853\"/>\n        <source>PHP double-quoted string</source>\n        <translation>Chaine de caractères PHP (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"856\"/>\n        <source>PHP single-quoted string</source>\n        <translation>Chaine de caractères PHP (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"859\"/>\n        <source>PHP keyword</source>\n        <translation>Mot-clé PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"862\"/>\n        <source>PHP number</source>\n        <translation>Nombre PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"865\"/>\n        <source>PHP variable</source>\n        <translation>Variable PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"868\"/>\n        <source>PHP comment</source>\n        <translation>Commentaire PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"871\"/>\n        <source>PHP line comment</source>\n        <translation>Commentaire de ligne PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"874\"/>\n        <source>PHP double-quoted variable</source>\n        <translation>Variable PHP (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"877\"/>\n        <source>PHP operator</source>\n        <translation>Opérateur PHP</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerIDL</name>\n    <message>\n        <location filename=\"qscilexeridl.cpp\" line=\"87\"/>\n        <source>UUID</source>\n        <translation>UUID</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerJavaScript</name>\n    <message>\n        <location filename=\"qscilexerjavascript.cpp\" line=\"97\"/>\n        <source>Regular expression</source>\n        <translation>Expression régulière</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerLua</name>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"218\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"221\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"224\"/>\n        <source>Line comment</source>\n        <translation>Commentaire de ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"227\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"230\"/>\n        <source>Keyword</source>\n        <translation>Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"233\"/>\n        <source>String</source>\n        <translation>Chaîne de caractères</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"236\"/>\n        <source>Character</source>\n        <translation>Caractère</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"239\"/>\n        <source>Literal string</source>\n        <translation>Chaîne littérale</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"242\"/>\n        <source>Preprocessor</source>\n        <translation>Préprocessing</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"245\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"248\"/>\n        <source>Identifier</source>\n        <translation>Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"251\"/>\n        <source>Unclosed string</source>\n        <translation>Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"254\"/>\n        <source>Basic functions</source>\n        <translation>Fonctions de base</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"257\"/>\n        <source>String, table and maths functions</source>\n        <translation>Fonctions sur les chaines, tables et fonctions math</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"260\"/>\n        <source>Coroutines, i/o and system facilities</source>\n        <translation>Coroutines, i/o et fonctions système</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"263\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Définition utilisateur 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"266\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Définition utilisateur 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"269\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Définition utilisateur 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"272\"/>\n        <source>User defined 4</source>\n        <translation type=\"unfinished\">Définition utilisateur 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"275\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Titre</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMakefile</name>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"116\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"119\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"122\"/>\n        <source>Preprocessor</source>\n        <translation>Préprocessing</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"125\"/>\n        <source>Variable</source>\n        <translation>Variable</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"128\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"131\"/>\n        <source>Target</source>\n        <translation>Cible</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"134\"/>\n        <source>Error</source>\n        <translation>Erreur</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMatlab</name>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"123\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"126\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"129\"/>\n        <source>Command</source>\n        <translation type=\"unfinished\">Commande</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"132\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"135\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"138\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"141\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"144\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"147\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères (guillemets doubles)</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPO</name>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"90\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"93\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"96\"/>\n        <source>Message identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"99\"/>\n        <source>Message identifier text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"102\"/>\n        <source>Message string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"105\"/>\n        <source>Message string text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"108\"/>\n        <source>Message context</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"111\"/>\n        <source>Message context text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"114\"/>\n        <source>Fuzzy flag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"117\"/>\n        <source>Programmer comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"120\"/>\n        <source>Reference</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"123\"/>\n        <source>Flags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"126\"/>\n        <source>Message identifier text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"129\"/>\n        <source>Message string text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"132\"/>\n        <source>Message context text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPOV</name>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"267\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"270\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"273\"/>\n        <source>Comment line</source>\n        <translation>Ligne commentée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"276\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"279\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"282\"/>\n        <source>Identifier</source>\n        <translation>Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"285\"/>\n        <source>String</source>\n        <translation>Chaîne de caractères</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"288\"/>\n        <source>Unclosed string</source>\n        <translation>Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"291\"/>\n        <source>Directive</source>\n        <translation>Directive</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"294\"/>\n        <source>Bad directive</source>\n        <translation>Mauvaise directive</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"297\"/>\n        <source>Objects, CSG and appearance</source>\n        <translation>Objets, CSG et apparence</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"300\"/>\n        <source>Types, modifiers and items</source>\n        <translation>Types, modifieurs et éléments</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"303\"/>\n        <source>Predefined identifiers</source>\n        <translation>Identifiants prédéfinis</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"306\"/>\n        <source>Predefined functions</source>\n        <translation>Fonctions prédéfinies</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"309\"/>\n        <source>User defined 1</source>\n        <translation>Définition utilisateur 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"312\"/>\n        <source>User defined 2</source>\n        <translation>Définition utilisateur 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"315\"/>\n        <source>User defined 3</source>\n        <translation>Définition utilisateur 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPascal</name>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"246\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"258\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Commentaire de ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"267\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"273\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"276\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"285\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"249\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"252\"/>\n        <source>&apos;{ ... }&apos; style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"255\"/>\n        <source>&apos;(* ... *)&apos; style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"261\"/>\n        <source>&apos;{$ ... }&apos; style pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"264\"/>\n        <source>&apos;(*$ ... *)&apos; style pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"270\"/>\n        <source>Hexadecimal number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"279\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"282\"/>\n        <source>Character</source>\n        <translation type=\"unfinished\">Caractère</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"288\"/>\n        <source>Inline asm</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPerl</name>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"318\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"321\"/>\n        <source>Error</source>\n        <translation>Erreur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"324\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"327\"/>\n        <source>POD</source>\n        <translation>POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"330\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"333\"/>\n        <source>Keyword</source>\n        <translation>Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"336\"/>\n        <source>Double-quoted string</source>\n        <translation>Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"339\"/>\n        <source>Single-quoted string</source>\n        <translation>Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"342\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"345\"/>\n        <source>Identifier</source>\n        <translation>Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"348\"/>\n        <source>Scalar</source>\n        <translation>Scalaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"351\"/>\n        <source>Array</source>\n        <translation>Tableau</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"354\"/>\n        <source>Hash</source>\n        <translation>Hashage</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"357\"/>\n        <source>Symbol table</source>\n        <translation>Table de symboles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"360\"/>\n        <source>Regular expression</source>\n        <translation>Expression régulière</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"363\"/>\n        <source>Substitution</source>\n        <translation>Substitution</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"366\"/>\n        <source>Backticks</source>\n        <translation>Quotes inverses</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"369\"/>\n        <source>Data section</source>\n        <translation>Section de données</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"372\"/>\n        <source>Here document delimiter</source>\n        <translation>Délimiteur de texte intégré (cat &lt;&lt;EOF....EOF)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"375\"/>\n        <source>Single-quoted here document</source>\n        <translation>Document intégré guillemets simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"378\"/>\n        <source>Double-quoted here document</source>\n        <translation>Document intégré guillemets doubles</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"381\"/>\n        <source>Backtick here document</source>\n        <translation>Document intégré quotes inverses</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"384\"/>\n        <source>Quoted string (q)</source>\n        <translation>Chaine quotée (q)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"387\"/>\n        <source>Quoted string (qq)</source>\n        <translation>Chaine quotée (qq)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"390\"/>\n        <source>Quoted string (qx)</source>\n        <translation>Chaine quotée (qx)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"393\"/>\n        <source>Quoted string (qr)</source>\n        <translation>Chaine quotée (qr)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"396\"/>\n        <source>Quoted string (qw)</source>\n        <translation>Chaine quotée (qw)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"399\"/>\n        <source>POD verbatim</source>\n        <translation>POD verbatim</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"402\"/>\n        <source>Subroutine prototype</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"405\"/>\n        <source>Format identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"408\"/>\n        <source>Format body</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"411\"/>\n        <source>Double-quoted string (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"414\"/>\n        <source>Translation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"417\"/>\n        <source>Regular expression (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"420\"/>\n        <source>Substitution (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"423\"/>\n        <source>Backticks (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"426\"/>\n        <source>Double-quoted here document (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"429\"/>\n        <source>Backtick here document (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"432\"/>\n        <source>Quoted string (qq, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"435\"/>\n        <source>Quoted string (qx, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"438\"/>\n        <source>Quoted string (qr, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPostScript</name>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"249\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"252\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"255\"/>\n        <source>DSC comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"258\"/>\n        <source>DSC comment value</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"261\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"264\"/>\n        <source>Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"267\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"270\"/>\n        <source>Literal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"273\"/>\n        <source>Immediately evaluated literal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"276\"/>\n        <source>Array parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"279\"/>\n        <source>Dictionary parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"282\"/>\n        <source>Procedure parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"285\"/>\n        <source>Text</source>\n        <translation type=\"unfinished\">Texte</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"288\"/>\n        <source>Hexadecimal string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"291\"/>\n        <source>Base85 string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"294\"/>\n        <source>Bad string character</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerProperties</name>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"111\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"114\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"117\"/>\n        <source>Section</source>\n        <translation>Section</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"120\"/>\n        <source>Assignment</source>\n        <translation>Affectation</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"123\"/>\n        <source>Default value</source>\n        <translation>Valeur par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"126\"/>\n        <source>Key</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPython</name>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"225\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"228\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"231\"/>\n        <source>Double-quoted string</source>\n        <translation>Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"234\"/>\n        <source>Single-quoted string</source>\n        <translation>Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"237\"/>\n        <source>Keyword</source>\n        <translation>Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"240\"/>\n        <source>Triple single-quoted string</source>\n        <translation>Chaine de caractères HTML (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"243\"/>\n        <source>Triple double-quoted string</source>\n        <translation>Chaine de caractères HTML (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"246\"/>\n        <source>Class name</source>\n        <translation>Nom de classe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"249\"/>\n        <source>Function or method name</source>\n        <translation>Nom de méthode ou de fonction</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"252\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"255\"/>\n        <source>Identifier</source>\n        <translation>Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"258\"/>\n        <source>Comment block</source>\n        <translation>Block de commentaires</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"261\"/>\n        <source>Unclosed string</source>\n        <translation>Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"264\"/>\n        <source>Highlighted identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"267\"/>\n        <source>Decorator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerRuby</name>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"239\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"245\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"251\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"257\"/>\n        <source>Double-quoted string</source>\n        <translation>Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"260\"/>\n        <source>Single-quoted string</source>\n        <translation>Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"254\"/>\n        <source>Keyword</source>\n        <translation>Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"263\"/>\n        <source>Class name</source>\n        <translation>Nom de classe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"266\"/>\n        <source>Function or method name</source>\n        <translation>Nom de méthode ou de fonction</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"269\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"272\"/>\n        <source>Identifier</source>\n        <translation>Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"242\"/>\n        <source>Error</source>\n        <translation type=\"unfinished\">Erreur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"248\"/>\n        <source>POD</source>\n        <translation type=\"unfinished\">POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"275\"/>\n        <source>Regular expression</source>\n        <translation type=\"unfinished\">Expression régulière</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"278\"/>\n        <source>Global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"281\"/>\n        <source>Symbol</source>\n        <translation type=\"unfinished\">Symbole</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"284\"/>\n        <source>Module name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"287\"/>\n        <source>Instance variable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"290\"/>\n        <source>Class variable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"293\"/>\n        <source>Backticks</source>\n        <translation type=\"unfinished\">Quotes inverses</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"296\"/>\n        <source>Data section</source>\n        <translation type=\"unfinished\">Section de données</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"299\"/>\n        <source>Here document delimiter</source>\n        <translation type=\"unfinished\">Délimiteur de texte intégré (cat &lt;&lt;EOF....EOF)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"302\"/>\n        <source>Here document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"305\"/>\n        <source>%q string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"308\"/>\n        <source>%Q string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"311\"/>\n        <source>%x string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"314\"/>\n        <source>%r string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"317\"/>\n        <source>%w string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"320\"/>\n        <source>Demoted keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"323\"/>\n        <source>stdin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"326\"/>\n        <source>stdout</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"329\"/>\n        <source>stderr</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSQL</name>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"259\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"268\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"271\"/>\n        <source>Keyword</source>\n        <translation>Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"277\"/>\n        <source>Single-quoted string</source>\n        <translation>Chaine de caractères (guillemets simples)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"286\"/>\n        <source>Operator</source>\n        <translation>Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"289\"/>\n        <source>Identifier</source>\n        <translation>Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"262\"/>\n        <source>Comment line</source>\n        <translation>Ligne commentée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"265\"/>\n        <source>JavaDoc style comment</source>\n        <translation>Commentaire style JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"274\"/>\n        <source>Double-quoted string</source>\n        <translation>Chaine de caractères (guillemets doubles)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"280\"/>\n        <source>SQL*Plus keyword</source>\n        <translation>Mot-clé SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"283\"/>\n        <source>SQL*Plus prompt</source>\n        <translation>Prompt SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"292\"/>\n        <source>SQL*Plus comment</source>\n        <translation>Commentaire SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"295\"/>\n        <source># comment line</source>\n        <translation># Ligne commentée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword</source>\n        <translation>Mot-clé JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"301\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>Erreur de mot-clé JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"304\"/>\n        <source>User defined 1</source>\n        <translation>Définition utilisateur 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"307\"/>\n        <source>User defined 2</source>\n        <translation>Définition utilisateur 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"310\"/>\n        <source>User defined 3</source>\n        <translation>Définition utilisateur 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"313\"/>\n        <source>User defined 4</source>\n        <translation>Définition utilisateur 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"316\"/>\n        <source>Quoted identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSpice</name>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"156\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"159\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"162\"/>\n        <source>Command</source>\n        <translation type=\"unfinished\">Commande</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"165\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"168\"/>\n        <source>Parameter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"171\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"174\"/>\n        <source>Delimiter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"177\"/>\n        <source>Value</source>\n        <translation type=\"unfinished\">Valeur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"180\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTCL</name>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"283\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"286\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"289\"/>\n        <source>Comment line</source>\n        <translation type=\"unfinished\">Ligne commentée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"295\"/>\n        <source>Quoted keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"298\"/>\n        <source>Quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"301\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"304\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"307\"/>\n        <source>Substitution</source>\n        <translation type=\"unfinished\">Substitution</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"310\"/>\n        <source>Brace substitution</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"313\"/>\n        <source>Modifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"316\"/>\n        <source>Expand keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"319\"/>\n        <source>TCL keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"322\"/>\n        <source>Tk keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"325\"/>\n        <source>iTCL keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"328\"/>\n        <source>Tk command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"331\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Définition utilisateur 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"334\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Définition utilisateur 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"337\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Définition utilisateur 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"340\"/>\n        <source>User defined 4</source>\n        <translation type=\"unfinished\">Définition utilisateur 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"343\"/>\n        <source>Comment box</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"346\"/>\n        <source>Comment block</source>\n        <translation type=\"unfinished\">Block de commentaires</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTeX</name>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"177\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"180\"/>\n        <source>Special</source>\n        <translation>Spécial</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"183\"/>\n        <source>Group</source>\n        <translation>Groupe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"186\"/>\n        <source>Symbol</source>\n        <translation>Symbole</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"189\"/>\n        <source>Command</source>\n        <translation>Commande</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"192\"/>\n        <source>Text</source>\n        <translation>Texte</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVHDL</name>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"197\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"200\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"203\"/>\n        <source>Comment line</source>\n        <translation type=\"unfinished\">Ligne commentée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"206\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"209\"/>\n        <source>String</source>\n        <translation type=\"unfinished\">Chaîne de caractères</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"212\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"215\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"218\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"221\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"224\"/>\n        <source>Standard operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"227\"/>\n        <source>Attribute</source>\n        <translation type=\"unfinished\">Attribut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"230\"/>\n        <source>Standard function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"233\"/>\n        <source>Standard package</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"236\"/>\n        <source>Standard type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"239\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVerilog</name>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"209\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"212\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"215\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Commentaire de ligne</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"218\"/>\n        <source>Bang comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"221\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"224\"/>\n        <source>Primary keywords and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"227\"/>\n        <source>String</source>\n        <translation type=\"unfinished\">Chaîne de caractères</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"230\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation type=\"unfinished\">Seconds mots-clés et identificateurs</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"233\"/>\n        <source>System task</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"236\"/>\n        <source>Preprocessor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"239\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"242\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"245\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Chaine de caractères non refermée</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"248\"/>\n        <source>User defined tasks and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerYAML</name>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"161\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"164\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"167\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificateur</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Mot-clé</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"173\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"176\"/>\n        <source>Reference</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"179\"/>\n        <source>Document delimiter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"182\"/>\n        <source>Text block marker</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"185\"/>\n        <source>Syntax error marker</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"188\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Opérateur</translation>\n    </message>\n</context>\n<context>\n    <name>QsciScintilla</name>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4359\"/>\n        <source>&amp;Undo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4363\"/>\n        <source>&amp;Redo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4369\"/>\n        <source>Cu&amp;t</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4374\"/>\n        <source>&amp;Copy</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4380\"/>\n        <source>&amp;Paste</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4384\"/>\n        <source>Delete</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4391\"/>\n        <source>Select All</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscintilla_pt_br.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\">\n<context>\n    <name>QsciCommand</name>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"44\"/>\n        <source>Move down one line</source>\n        <translation>Mover uma linha para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"54\"/>\n        <source>Extend selection down one line</source>\n        <translation>Extender a seleção uma linha para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"71\"/>\n        <source>Scroll view down one line</source>\n        <translation>Descer a visão uma linha para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"64\"/>\n        <source>Extend rectangular selection down one line</source>\n        <translation>Extender a seleção retangular uma linha para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"81\"/>\n        <source>Move up one line</source>\n        <translation>Mover uma linha para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"91\"/>\n        <source>Extend selection up one line</source>\n        <translation>Extender a seleção uma linha para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"108\"/>\n        <source>Scroll view up one line</source>\n        <translation>Subir a visão uma linha para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"101\"/>\n        <source>Extend rectangular selection up one line</source>\n        <translation>Extender a seleção retangular uma linha para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"158\"/>\n        <source>Move up one paragraph</source>\n        <translation>Mover um paragrafo para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"164\"/>\n        <source>Extend selection up one paragraph</source>\n        <translation>Extender a seleção um paragrafo para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"145\"/>\n        <source>Move down one paragraph</source>\n        <translation>Mover um paragrafo para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"118\"/>\n        <source>Scroll to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"128\"/>\n        <source>Scroll to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"138\"/>\n        <source>Scroll vertically to centre current line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"151\"/>\n        <source>Extend selection down one paragraph</source>\n        <translation>Extender a seleção  um paragrafo para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"175\"/>\n        <source>Move left one character</source>\n        <translation>Mover um caractere para a esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"185\"/>\n        <source>Extend selection left one character</source>\n        <translation>Extender a seleção um caractere para esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"239\"/>\n        <source>Move left one word</source>\n        <translation>Mover uma palavra para esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"249\"/>\n        <source>Extend selection left one word</source>\n        <translation>Extender a seleção uma palavra para esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"196\"/>\n        <source>Extend rectangular selection left one character</source>\n        <translation>Extender a seleção retangular um caractere para esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"207\"/>\n        <source>Move right one character</source>\n        <translation>Mover um caractere para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"217\"/>\n        <source>Extend selection right one character</source>\n        <translation>Extender a seleção um caractere para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"259\"/>\n        <source>Move right one word</source>\n        <translation>Mover uma palavra para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"265\"/>\n        <source>Extend selection right one word</source>\n        <translation>Extender a seleção uma palavra para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"228\"/>\n        <source>Extend rectangular selection right one character</source>\n        <translation>Extender a seleção retangular um caractere para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"271\"/>\n        <source>Move to end of previous word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"277\"/>\n        <source>Extend selection to end of previous word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"288\"/>\n        <source>Move to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"298\"/>\n        <source>Extend selection to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"305\"/>\n        <source>Move left one word part</source>\n        <translation>Mover uma parte da palavra para esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"311\"/>\n        <source>Extend selection left one word part</source>\n        <translation>Extender a seleção uma parte de palavra para esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"318\"/>\n        <source>Move right one word part</source>\n        <translation>Mover uma parte da palavra para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"324\"/>\n        <source>Extend selection right one word part</source>\n        <translation>Extender a seleção uma parte de palavra para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"558\"/>\n        <source>Move up one page</source>\n        <translation>Mover uma página para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"568\"/>\n        <source>Extend selection up one page</source>\n        <translation>Extender a seleção uma página para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"578\"/>\n        <source>Extend rectangular selection up one page</source>\n        <translation>Extender a seleção retangular uma página para cima</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"593\"/>\n        <source>Move down one page</source>\n        <translation>Mover uma página para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"607\"/>\n        <source>Extend selection down one page</source>\n        <translation>Extender a seleção uma página para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"621\"/>\n        <source>Extend rectangular selection down one page</source>\n        <translation>Extender a seleção retangular uma página para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"658\"/>\n        <source>Delete current character</source>\n        <translation>Excluir caractere atual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"788\"/>\n        <source>Cut selection</source>\n        <translation>Recortar seleção</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"687\"/>\n        <source>Delete word to right</source>\n        <translation>Excluir palavra para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"335\"/>\n        <source>Move to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"345\"/>\n        <source>Extend selection to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"356\"/>\n        <source>Extend rectangular selection to start of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"367\"/>\n        <source>Move to start of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"377\"/>\n        <source>Extend selection to start of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"384\"/>\n        <source>Move to start of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"391\"/>\n        <source>Extend selection to start of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"402\"/>\n        <source>Move to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"413\"/>\n        <source>Extend selection to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"424\"/>\n        <source>Extend rectangular selection to first visible character in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"431\"/>\n        <source>Move to first visible character of display in document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"438\"/>\n        <source>Extend selection to first visible character in display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"449\"/>\n        <source>Move to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"459\"/>\n        <source>Extend selection to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"470\"/>\n        <source>Extend rectangular selection to end of document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"481\"/>\n        <source>Move to end of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"491\"/>\n        <source>Extend selection to end of display line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"498\"/>\n        <source>Move to end of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"505\"/>\n        <source>Extend selection to end of display or document line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"516\"/>\n        <source>Move to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"526\"/>\n        <source>Extend selection to start of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"537\"/>\n        <source>Move to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"547\"/>\n        <source>Extend selection to end of document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"628\"/>\n        <source>Stuttered move up one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"634\"/>\n        <source>Stuttered extend selection up one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"641\"/>\n        <source>Stuttered move down one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"647\"/>\n        <source>Stuttered extend selection down one page</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"674\"/>\n        <source>Delete previous character if not at start of line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"697\"/>\n        <source>Delete right to end of next word</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"714\"/>\n        <source>Delete line to right</source>\n        <translation>Excluir linha para direita</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"738\"/>\n        <source>Transpose current and previous lines</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"745\"/>\n        <source>Duplicate the current line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"751\"/>\n        <source>Select all</source>\n        <oldsource>Select document</oldsource>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"757\"/>\n        <source>Move selected lines up one line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"763\"/>\n        <source>Move selected lines down one line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"806\"/>\n        <source>Toggle insert/overtype</source>\n        <translation>Alternar entre modo de inserir/sobreescrever</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"800\"/>\n        <source>Paste</source>\n        <translation>Copiar</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"794\"/>\n        <source>Copy selection</source>\n        <translation>Copiar seleção</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"812\"/>\n        <source>Insert newline</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"830\"/>\n        <source>De-indent one level</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"836\"/>\n        <source>Cancel</source>\n        <translation>Cancelar</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"668\"/>\n        <source>Delete previous character</source>\n        <translation>Excluir caractere anterior</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"681\"/>\n        <source>Delete word to left</source>\n        <translation>Excluir palavra a esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"704\"/>\n        <source>Delete line to left</source>\n        <translation>Excluir linha a esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"842\"/>\n        <source>Undo last command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"852\"/>\n        <source>Redo last command</source>\n        <translation>Refazer último comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"824\"/>\n        <source>Indent one level</source>\n        <translation>Indentar um nível</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"858\"/>\n        <source>Zoom in</source>\n        <translation>Aumentar zoom</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"864\"/>\n        <source>Zoom out</source>\n        <translation>Diminuir zoom</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"818\"/>\n        <source>Formfeed</source>\n        <translation>Alimentação da Página</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"726\"/>\n        <source>Cut current line</source>\n        <translation>Configurar linha atual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"720\"/>\n        <source>Delete current line</source>\n        <translation>Excluir linha atual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"732\"/>\n        <source>Copy current line</source>\n        <translation>Copiar linha atual</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"776\"/>\n        <source>Convert selection to lower case</source>\n        <translation>Converter a seleção para minúscula</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"782\"/>\n        <source>Convert selection to upper case</source>\n        <translation>Converter a seleção para maiúscula</translation>\n    </message>\n    <message>\n        <location filename=\"qscicommandset.cpp\" line=\"770\"/>\n        <source>Duplicate selection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerAVS</name>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"280\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"283\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"286\"/>\n        <source>Nested block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"289\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Comentar Linha</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"301\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"304\"/>\n        <source>Triple double-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por três aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"307\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"310\"/>\n        <source>Filter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"313\"/>\n        <source>Plugin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"316\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"319\"/>\n        <source>Clip property</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeravs.cpp\" line=\"322\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBash</name>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"193\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"196\"/>\n        <source>Error</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"199\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"202\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"205\"/>\n        <source>Keyword</source>\n        <translation>Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"208\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"211\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"214\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"217\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"220\"/>\n        <source>Scalar</source>\n        <translation>Escalar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"223\"/>\n        <source>Parameter expansion</source>\n        <translation>Parâmetro de Expansão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"226\"/>\n        <source>Backticks</source>\n        <translation>Aspas Invertidas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"229\"/>\n        <source>Here document delimiter</source>\n        <translation>Delimitador de &quot;here documents&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbash.cpp\" line=\"232\"/>\n        <source>Single-quoted here document</source>\n        <translation>&quot;here document&quot; envolvido por aspas simples</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerBatch</name>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"164\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"167\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation>Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"173\"/>\n        <source>Label</source>\n        <translation>Rótulo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"176\"/>\n        <source>Hide command character</source>\n        <translation>Esconder caractere de comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"179\"/>\n        <source>External command</source>\n        <translation>Comando externo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"182\"/>\n        <source>Variable</source>\n        <translation>Variável</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerbatch.cpp\" line=\"185\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCMake</name>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"181\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"184\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"187\"/>\n        <source>String</source>\n        <translation type=\"unfinished\">Cadeia de Caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"190\"/>\n        <source>Left quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"193\"/>\n        <source>Right quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"196\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"199\"/>\n        <source>Variable</source>\n        <translation type=\"unfinished\">Variável</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"202\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Rótulo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"205\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"208\"/>\n        <source>WHILE block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"211\"/>\n        <source>FOREACH block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"214\"/>\n        <source>IF block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"217\"/>\n        <source>MACRO block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"220\"/>\n        <source>Variable within a string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercmake.cpp\" line=\"223\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCPP</name>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"340\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"343\"/>\n        <source>Inactive default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"346\"/>\n        <source>C comment</source>\n        <translation>Comentário C</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"349\"/>\n        <source>Inactive C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"352\"/>\n        <source>C++ comment</source>\n        <translation>Comentário C++</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"355\"/>\n        <source>Inactive C++ comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"358\"/>\n        <source>JavaDoc style C comment</source>\n        <translation>Comentário JavaDoc estilo C</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"361\"/>\n        <source>Inactive JavaDoc style C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"364\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"367\"/>\n        <source>Inactive number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"370\"/>\n        <source>Keyword</source>\n        <translation>Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"373\"/>\n        <source>Inactive keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"376\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"379\"/>\n        <source>Inactive double-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"382\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"385\"/>\n        <source>Inactive single-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"388\"/>\n        <source>IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"391\"/>\n        <source>Inactive IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"394\"/>\n        <source>Pre-processor block</source>\n        <translation>Instruções de pré-processamento</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"397\"/>\n        <source>Inactive pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"400\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"403\"/>\n        <source>Inactive operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"406\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"409\"/>\n        <source>Inactive identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"412\"/>\n        <source>Unclosed string</source>\n        <translation>Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"415\"/>\n        <source>Inactive unclosed string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"418\"/>\n        <source>C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"421\"/>\n        <source>Inactive C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"424\"/>\n        <source>JavaScript regular expression</source>\n        <translation type=\"unfinished\">Expressão regular JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"427\"/>\n        <source>Inactive JavaScript regular expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"430\"/>\n        <source>JavaDoc style C++ comment</source>\n        <translation>Comentário JavaDoc estilo C++</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"433\"/>\n        <source>Inactive JavaDoc style C++ comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"436\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation>Identificadores e palavras chave secundárias</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"439\"/>\n        <source>Inactive secondary keywords and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"442\"/>\n        <source>JavaDoc keyword</source>\n        <translation>Palavra chave JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"445\"/>\n        <source>Inactive JavaDoc keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"448\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>Erro de palavra chave do JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"451\"/>\n        <source>Inactive JavaDoc keyword error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"454\"/>\n        <source>Global classes and typedefs</source>\n        <translation>Classes e definições de tipo globais</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"457\"/>\n        <source>Inactive global classes and typedefs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"460\"/>\n        <source>C++ raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"463\"/>\n        <source>Inactive C++ raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"466\"/>\n        <source>Vala triple-quoted verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"469\"/>\n        <source>Inactive Vala triple-quoted verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"472\"/>\n        <source>Pike hash-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"475\"/>\n        <source>Inactive Pike hash-quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"478\"/>\n        <source>Pre-processor C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"481\"/>\n        <source>Inactive pre-processor C comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"484\"/>\n        <source>JavaDoc style pre-processor comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercpp.cpp\" line=\"487\"/>\n        <source>Inactive JavaDoc style pre-processor comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSS</name>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"225\"/>\n        <source>Tag</source>\n        <translation>Marcador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"228\"/>\n        <source>Class selector</source>\n        <translation>Seletor de classe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"231\"/>\n        <source>Pseudo-class</source>\n        <translation>Pseudo-classe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"234\"/>\n        <source>Unknown pseudo-class</source>\n        <translation>Pseudo-classe desconhecida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"237\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"240\"/>\n        <source>CSS1 property</source>\n        <translation>Propriedade CSS1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"243\"/>\n        <source>Unknown property</source>\n        <translation>Propriedade desconhecida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"246\"/>\n        <source>Value</source>\n        <translation>Valor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"249\"/>\n        <source>ID selector</source>\n        <translation>Seletor de ID</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"252\"/>\n        <source>Important</source>\n        <translation>Importante</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"255\"/>\n        <source>@-rule</source>\n        <translation>regra-@</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"258\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"261\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"264\"/>\n        <source>CSS2 property</source>\n        <translation>Propriedade CSS2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"267\"/>\n        <source>Attribute</source>\n        <translation>Atributo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"270\"/>\n        <source>CSS3 property</source>\n        <translation type=\"unfinished\">Propriedade CSS2 {3 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"273\"/>\n        <source>Pseudo-element</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"276\"/>\n        <source>Extended CSS property</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"279\"/>\n        <source>Extended pseudo-class</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"282\"/>\n        <source>Extended pseudo-element</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"285\"/>\n        <source>Media rule</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercss.cpp\" line=\"288\"/>\n        <source>Variable</source>\n        <translation type=\"unfinished\">Variável</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCSharp</name>\n    <message>\n        <location filename=\"qscilexercsharp.cpp\" line=\"95\"/>\n        <source>Verbatim string</source>\n        <translation>Cadeia de caracteres no formato verbatim</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerCoffeeScript</name>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"244\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"247\"/>\n        <source>C-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"250\"/>\n        <source>C++-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"253\"/>\n        <source>JavaDoc C-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"256\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"259\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"262\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"265\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"268\"/>\n        <source>IDL UUID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"271\"/>\n        <source>Pre-processor block</source>\n        <translation type=\"unfinished\">Instruções de pré-processamento</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"274\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"277\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"280\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"283\"/>\n        <source>C# verbatim string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"286\"/>\n        <source>Regular expression</source>\n        <translation type=\"unfinished\">Expressão Regular</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"289\"/>\n        <source>JavaDoc C++-style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"292\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation type=\"unfinished\">Identificadores e palavras chave secundárias</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"295\"/>\n        <source>JavaDoc keyword</source>\n        <translation type=\"unfinished\">Palavra chave JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword error</source>\n        <translation type=\"unfinished\">Erro de palavra chave do JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"301\"/>\n        <source>Global classes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"304\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"307\"/>\n        <source>Block regular expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexercoffeescript.cpp\" line=\"310\"/>\n        <source>Block regular expression comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerD</name>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"259\"/>\n        <source>Block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"262\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Comentar Linha</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"265\"/>\n        <source>DDoc style block comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"268\"/>\n        <source>Nesting comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"271\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"274\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"277\"/>\n        <source>Secondary keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"280\"/>\n        <source>Documentation keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"283\"/>\n        <source>Type definition</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"286\"/>\n        <source>String</source>\n        <translation type=\"unfinished\">Cadeia de Caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"289\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"292\"/>\n        <source>Character</source>\n        <translation type=\"unfinished\">Caractere</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"295\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"298\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"301\"/>\n        <source>DDoc style line comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"304\"/>\n        <source>DDoc keyword</source>\n        <translation type=\"unfinished\">Palavra chave JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"307\"/>\n        <source>DDoc keyword error</source>\n        <translation type=\"unfinished\">Erro de palavra chave do JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"310\"/>\n        <source>Backquoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"313\"/>\n        <source>Raw string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"316\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Definição de usuário 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"319\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Definição de usuário 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerd.cpp\" line=\"322\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Definição de usuário 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerDiff</name>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"92\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"95\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"98\"/>\n        <source>Command</source>\n        <translation>Comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"101\"/>\n        <source>Header</source>\n        <translation>Cabeçalho</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"104\"/>\n        <source>Position</source>\n        <translation>Posição</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"107\"/>\n        <source>Removed line</source>\n        <translation>Linha Removida</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"110\"/>\n        <source>Added line</source>\n        <translation>Linha Adicionada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerdiff.cpp\" line=\"113\"/>\n        <source>Changed line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerFortran77</name>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"176\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"179\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"182\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"185\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"188\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"191\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"194\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"197\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"200\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"203\"/>\n        <source>Intrinsic function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"206\"/>\n        <source>Extended function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"209\"/>\n        <source>Pre-processor block</source>\n        <translation type=\"unfinished\">Instruções de pré-processamento</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"212\"/>\n        <source>Dotted operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"215\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Rótulo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerfortran77.cpp\" line=\"218\"/>\n        <source>Continuation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerHTML</name>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"553\"/>\n        <source>HTML default</source>\n        <translation>HTML por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"556\"/>\n        <source>Tag</source>\n        <translation>Marcador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"559\"/>\n        <source>Unknown tag</source>\n        <translation>Marcador desconhecido</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"562\"/>\n        <source>Attribute</source>\n        <translation>Atributo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"565\"/>\n        <source>Unknown attribute</source>\n        <translation>Atributo desconhecido</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"568\"/>\n        <source>HTML number</source>\n        <translation>Número HTML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"571\"/>\n        <source>HTML double-quoted string</source>\n        <translation>Cadeia de caracteres HTML envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"574\"/>\n        <source>HTML single-quoted string</source>\n        <translation>Cadeia de caracteres HTML envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"577\"/>\n        <source>Other text in a tag</source>\n        <translation>Outro texto em um marcador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"580\"/>\n        <source>HTML comment</source>\n        <translation>Comentário HTML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"583\"/>\n        <source>Entity</source>\n        <translation>Entidade</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"586\"/>\n        <source>End of a tag</source>\n        <translation>Final de um marcador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"589\"/>\n        <source>Start of an XML fragment</source>\n        <translation>Início de um bloco XML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"592\"/>\n        <source>End of an XML fragment</source>\n        <translation>Final de um bloco XML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"595\"/>\n        <source>Script tag</source>\n        <translation>Marcador de script</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"598\"/>\n        <source>Start of an ASP fragment with @</source>\n        <translation>Início de um bloco ASP com @</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"601\"/>\n        <source>Start of an ASP fragment</source>\n        <translation>Início de um bloco ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"604\"/>\n        <source>CDATA</source>\n        <translation>CDATA</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"607\"/>\n        <source>Start of a PHP fragment</source>\n        <translation>Início de um bloco PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"610\"/>\n        <source>Unquoted HTML value</source>\n        <translation>Valor HTML não envolvido por aspas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"613\"/>\n        <source>ASP X-Code comment</source>\n        <translation>Comentário ASP X-Code</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"616\"/>\n        <source>SGML default</source>\n        <translation>SGML por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"619\"/>\n        <source>SGML command</source>\n        <translation>Comando SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"622\"/>\n        <source>First parameter of an SGML command</source>\n        <translation>Primeiro parâmetro em um comando SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"625\"/>\n        <source>SGML double-quoted string</source>\n        <translation>Cadeia de caracteres SGML envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"628\"/>\n        <source>SGML single-quoted string</source>\n        <translation>Cadeia de caracteres SGML envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"631\"/>\n        <source>SGML error</source>\n        <translation>Erro SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"634\"/>\n        <source>SGML special entity</source>\n        <translation>Entidade especial SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"637\"/>\n        <source>SGML comment</source>\n        <translation>Comando SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"640\"/>\n        <source>First parameter comment of an SGML command</source>\n        <translation>Primeiro comentário de parâmetro de uma comando SGML</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"643\"/>\n        <source>SGML block default</source>\n        <translation>Bloco SGML por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"646\"/>\n        <source>Start of a JavaScript fragment</source>\n        <translation>Início de um bloco Javascript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"649\"/>\n        <source>JavaScript default</source>\n        <translation>JavaScript por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"652\"/>\n        <source>JavaScript comment</source>\n        <translation>Comentário JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"655\"/>\n        <source>JavaScript line comment</source>\n        <translation>Comentário de linha JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"658\"/>\n        <source>JavaDoc style JavaScript comment</source>\n        <translation>Comentário JavaScript no estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"661\"/>\n        <source>JavaScript number</source>\n        <translation>Número JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"664\"/>\n        <source>JavaScript word</source>\n        <translation>Palavra JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"667\"/>\n        <source>JavaScript keyword</source>\n        <translation>Palavra chave JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"670\"/>\n        <source>JavaScript double-quoted string</source>\n        <translation>Cadeia de caracteres JavaScript envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"673\"/>\n        <source>JavaScript single-quoted string</source>\n        <translation>Cadeia de caracteres JavaScript envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"676\"/>\n        <source>JavaScript symbol</source>\n        <translation>Símbolo JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"679\"/>\n        <source>JavaScript unclosed string</source>\n        <translation>Cadeia de caracteres JavaScript não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"682\"/>\n        <source>JavaScript regular expression</source>\n        <translation>Expressão regular JavaScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"685\"/>\n        <source>Start of an ASP JavaScript fragment</source>\n        <translation>Início de um bloco Javascript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"688\"/>\n        <source>ASP JavaScript default</source>\n        <translation>JavaScript ASP por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"691\"/>\n        <source>ASP JavaScript comment</source>\n        <translation>Comentário JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"694\"/>\n        <source>ASP JavaScript line comment</source>\n        <translation>Comentário de linha JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"697\"/>\n        <source>JavaDoc style ASP JavaScript comment</source>\n        <translation>Comentário JavaScript ASP no estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"700\"/>\n        <source>ASP JavaScript number</source>\n        <translation>Número JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"703\"/>\n        <source>ASP JavaScript word</source>\n        <translation>Palavra chave JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"706\"/>\n        <source>ASP JavaScript keyword</source>\n        <translation>Palavra chave JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"709\"/>\n        <source>ASP JavaScript double-quoted string</source>\n        <translation>Cadeia de caracteres JavaScript ASP envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"712\"/>\n        <source>ASP JavaScript single-quoted string</source>\n        <translation>Cadeia de caracteres JavaScript ASP envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"715\"/>\n        <source>ASP JavaScript symbol</source>\n        <translation>Símbolo JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"718\"/>\n        <source>ASP JavaScript unclosed string</source>\n        <translation>Cadeia de caracteres JavaScript ASP não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"721\"/>\n        <source>ASP JavaScript regular expression</source>\n        <translation>Expressão regular JavaScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"724\"/>\n        <source>Start of a VBScript fragment</source>\n        <translation>Início de um bloco VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"727\"/>\n        <source>VBScript default</source>\n        <translation>VBScript por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"730\"/>\n        <source>VBScript comment</source>\n        <translation>Comentário VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"733\"/>\n        <source>VBScript number</source>\n        <translation>Número VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"736\"/>\n        <source>VBScript keyword</source>\n        <translation>Palavra chave VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"739\"/>\n        <source>VBScript string</source>\n        <translation>Cadeia de caracteres VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"742\"/>\n        <source>VBScript identifier</source>\n        <translation>Identificador VBScript</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"745\"/>\n        <source>VBScript unclosed string</source>\n        <translation>Cadeia de caracteres VBScript não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"748\"/>\n        <source>Start of an ASP VBScript fragment</source>\n        <translation>Início de um bloco VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"751\"/>\n        <source>ASP VBScript default</source>\n        <translation>VBScript ASP por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"754\"/>\n        <source>ASP VBScript comment</source>\n        <translation>Comentário VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"757\"/>\n        <source>ASP VBScript number</source>\n        <translation>Número VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"760\"/>\n        <source>ASP VBScript keyword</source>\n        <translation>Palavra chave VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"763\"/>\n        <source>ASP VBScript string</source>\n        <translation>Cadeia de caracteres VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"766\"/>\n        <source>ASP VBScript identifier</source>\n        <translation>Identificador VBScript ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"769\"/>\n        <source>ASP VBScript unclosed string</source>\n        <translation>Cadeia de caracteres VBScript ASP não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"772\"/>\n        <source>Start of a Python fragment</source>\n        <translation>Início de um bloco Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"775\"/>\n        <source>Python default</source>\n        <translation>Python por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"778\"/>\n        <source>Python comment</source>\n        <translation>Comentário Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"781\"/>\n        <source>Python number</source>\n        <translation>Número Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"784\"/>\n        <source>Python double-quoted string</source>\n        <translation>Cadeia de caracteres Python envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"787\"/>\n        <source>Python single-quoted string</source>\n        <translation>Cadeia de caracteres Python envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"790\"/>\n        <source>Python keyword</source>\n        <translation>Palavra chave Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"793\"/>\n        <source>Python triple double-quoted string</source>\n        <translation>Cadeia de caracteres Python envolvida por aspas triplas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"796\"/>\n        <source>Python triple single-quoted string</source>\n        <translation>Cadeia de caracteres Python envolvida por aspas triplas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"799\"/>\n        <source>Python class name</source>\n        <translation>Nome de classe Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"802\"/>\n        <source>Python function or method name</source>\n        <translation>Nome de método ou função Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"805\"/>\n        <source>Python operator</source>\n        <translation>Operador Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"808\"/>\n        <source>Python identifier</source>\n        <translation>Identificador Python</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"811\"/>\n        <source>Start of an ASP Python fragment</source>\n        <translation>Início de um bloco Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"814\"/>\n        <source>ASP Python default</source>\n        <translation>Python ASP por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"817\"/>\n        <source>ASP Python comment</source>\n        <translation>Comentário Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"820\"/>\n        <source>ASP Python number</source>\n        <translation>Número Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"823\"/>\n        <source>ASP Python double-quoted string</source>\n        <translation>Cadeia de caracteres Python ASP envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"826\"/>\n        <source>ASP Python single-quoted string</source>\n        <translation>Cadeia de caracteres Python ASP envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"829\"/>\n        <source>ASP Python keyword</source>\n        <translation>Palavra chave Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"832\"/>\n        <source>ASP Python triple double-quoted string</source>\n        <translation>Cadeia de caracteres Python ASP envolvida por aspas triplas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"835\"/>\n        <source>ASP Python triple single-quoted string</source>\n        <translation>Cadeia de caracteres Python ASP envolvida por aspas triplas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"838\"/>\n        <source>ASP Python class name</source>\n        <translation>Nome de classe Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"841\"/>\n        <source>ASP Python function or method name</source>\n        <translation>Nome de método ou função Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"844\"/>\n        <source>ASP Python operator</source>\n        <translation>Operador Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"847\"/>\n        <source>ASP Python identifier</source>\n        <translation>Identificador Python ASP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"850\"/>\n        <source>PHP default</source>\n        <translation>PHP por padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"853\"/>\n        <source>PHP double-quoted string</source>\n        <translation>Cadeia de caracteres PHP envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"856\"/>\n        <source>PHP single-quoted string</source>\n        <translation>Cadeia de caracteres PHP envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"859\"/>\n        <source>PHP keyword</source>\n        <translation>Palavra chave PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"862\"/>\n        <source>PHP number</source>\n        <translation>Número PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"865\"/>\n        <source>PHP variable</source>\n        <translation>Variável PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"868\"/>\n        <source>PHP comment</source>\n        <translation>Comentário PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"871\"/>\n        <source>PHP line comment</source>\n        <translation>Comentário de linha PHP</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"874\"/>\n        <source>PHP double-quoted variable</source>\n        <translation>Variável PHP envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerhtml.cpp\" line=\"877\"/>\n        <source>PHP operator</source>\n        <translation>Operador PHP</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerIDL</name>\n    <message>\n        <location filename=\"qscilexeridl.cpp\" line=\"87\"/>\n        <source>UUID</source>\n        <translation>UUID</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerJavaScript</name>\n    <message>\n        <location filename=\"qscilexerjavascript.cpp\" line=\"97\"/>\n        <source>Regular expression</source>\n        <translation>Expressão Regular</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerLua</name>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"218\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"221\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"224\"/>\n        <source>Line comment</source>\n        <translation>Comentar Linha</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"227\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"230\"/>\n        <source>Keyword</source>\n        <translation>Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"233\"/>\n        <source>String</source>\n        <translation>Cadeia de Caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"236\"/>\n        <source>Character</source>\n        <translation>Caractere</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"239\"/>\n        <source>Literal string</source>\n        <translation>Cadeia de caracteres literal</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"242\"/>\n        <source>Preprocessor</source>\n        <translation>Preprocessador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"245\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"248\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"251\"/>\n        <source>Unclosed string</source>\n        <translation>Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"254\"/>\n        <source>Basic functions</source>\n        <translation>Funções básicas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"257\"/>\n        <source>String, table and maths functions</source>\n        <translation>Funções de cadeia de caracteres e de tabelas matemáticas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"260\"/>\n        <source>Coroutines, i/o and system facilities</source>\n        <translation>Funções auxiiares, e/s e funções de sistema</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"263\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Definição de usuário 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"266\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Definição de usuário 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"269\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Definição de usuário 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"272\"/>\n        <source>User defined 4</source>\n        <translation type=\"unfinished\">Definição de usuário 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerlua.cpp\" line=\"275\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\">Rótulo</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMakefile</name>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"116\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"119\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"122\"/>\n        <source>Preprocessor</source>\n        <translation>Preprocessador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"125\"/>\n        <source>Variable</source>\n        <translation>Variável</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"128\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"131\"/>\n        <source>Target</source>\n        <translation>Destino</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermakefile.cpp\" line=\"134\"/>\n        <source>Error</source>\n        <translation>Erro</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerMatlab</name>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"123\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"126\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"129\"/>\n        <source>Command</source>\n        <translation type=\"unfinished\">Comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"132\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"135\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"138\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"141\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"144\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexermatlab.cpp\" line=\"147\"/>\n        <source>Double-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPO</name>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"90\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"93\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"96\"/>\n        <source>Message identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"99\"/>\n        <source>Message identifier text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"102\"/>\n        <source>Message string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"105\"/>\n        <source>Message string text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"108\"/>\n        <source>Message context</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"111\"/>\n        <source>Message context text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"114\"/>\n        <source>Fuzzy flag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"117\"/>\n        <source>Programmer comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"120\"/>\n        <source>Reference</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"123\"/>\n        <source>Flags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"126\"/>\n        <source>Message identifier text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"129\"/>\n        <source>Message string text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpo.cpp\" line=\"132\"/>\n        <source>Message context text end-of-line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPOV</name>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"267\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"270\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"273\"/>\n        <source>Comment line</source>\n        <translation>Comentar Linha</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"276\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"279\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"282\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"285\"/>\n        <source>String</source>\n        <translation>Cadeia de Caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"288\"/>\n        <source>Unclosed string</source>\n        <translation>Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"291\"/>\n        <source>Directive</source>\n        <translation>Diretiva</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"294\"/>\n        <source>Bad directive</source>\n        <translation>Diretiva ruim</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"297\"/>\n        <source>Objects, CSG and appearance</source>\n        <translation>Objetos, CSG e aparência</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"300\"/>\n        <source>Types, modifiers and items</source>\n        <translation>Tipos, modificadores e itens</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"303\"/>\n        <source>Predefined identifiers</source>\n        <translation>Identificadores predefinidos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"306\"/>\n        <source>Predefined functions</source>\n        <translation>Funções predefinidas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"309\"/>\n        <source>User defined 1</source>\n        <translation>Definição de usuário 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"312\"/>\n        <source>User defined 2</source>\n        <translation>Definição de usuário 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpov.cpp\" line=\"315\"/>\n        <source>User defined 3</source>\n        <translation>Definição de usuário 3</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPascal</name>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"246\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"258\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Comentar Linha</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"267\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"273\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"276\"/>\n        <source>Single-quoted string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"285\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"249\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"252\"/>\n        <source>&apos;{ ... }&apos; style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"255\"/>\n        <source>&apos;(* ... *)&apos; style comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"261\"/>\n        <source>&apos;{$ ... }&apos; style pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"264\"/>\n        <source>&apos;(*$ ... *)&apos; style pre-processor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"270\"/>\n        <source>Hexadecimal number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"279\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"282\"/>\n        <source>Character</source>\n        <translation type=\"unfinished\">Caractere</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpascal.cpp\" line=\"288\"/>\n        <source>Inline asm</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPerl</name>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"318\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"321\"/>\n        <source>Error</source>\n        <translation>Erro</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"324\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"327\"/>\n        <source>POD</source>\n        <translation>POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"330\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"333\"/>\n        <source>Keyword</source>\n        <translation>Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"336\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"339\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"342\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"345\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"348\"/>\n        <source>Scalar</source>\n        <translation>Escalar</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"351\"/>\n        <source>Array</source>\n        <translation>Vetor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"354\"/>\n        <source>Hash</source>\n        <translation>Hash</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"357\"/>\n        <source>Symbol table</source>\n        <translation>Tabela de Símbolos</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"360\"/>\n        <source>Regular expression</source>\n        <translation>Expressão Regular</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"363\"/>\n        <source>Substitution</source>\n        <translation>Substituição</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"366\"/>\n        <source>Backticks</source>\n        <translation>Aspas Invertidas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"369\"/>\n        <source>Data section</source>\n        <translation>Seção de dados</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"372\"/>\n        <source>Here document delimiter</source>\n        <translation>Delimitador de documentos criados através de redicionadores (&gt;&gt; e &gt;)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"375\"/>\n        <source>Single-quoted here document</source>\n        <translation>&quot;here document&quot; envolvido por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"378\"/>\n        <source>Double-quoted here document</source>\n        <translation>&quot;here document&quot; envolvido por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"381\"/>\n        <source>Backtick here document</source>\n        <translation>&quot;here document&quot; envolvido por aspas invertidas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"384\"/>\n        <source>Quoted string (q)</source>\n        <translation>Cadeia de caracteres envolvida por aspas (q)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"387\"/>\n        <source>Quoted string (qq)</source>\n        <translation>Cadeia de caracteres envolvida por aspas (qq)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"390\"/>\n        <source>Quoted string (qx)</source>\n        <translation>Cadeia de caracteres envolvida por aspas (qx)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"393\"/>\n        <source>Quoted string (qr)</source>\n        <translation>Cadeia de caracteres envolvida por aspas (qr)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"396\"/>\n        <source>Quoted string (qw)</source>\n        <translation>Cadeia de caracteres envolvida por aspas (qw)</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"399\"/>\n        <source>POD verbatim</source>\n        <translation>POD em formato verbatim</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"402\"/>\n        <source>Subroutine prototype</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"405\"/>\n        <source>Format identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"408\"/>\n        <source>Format body</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"411\"/>\n        <source>Double-quoted string (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"414\"/>\n        <source>Translation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"417\"/>\n        <source>Regular expression (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"420\"/>\n        <source>Substitution (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"423\"/>\n        <source>Backticks (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"426\"/>\n        <source>Double-quoted here document (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"429\"/>\n        <source>Backtick here document (interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"432\"/>\n        <source>Quoted string (qq, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"435\"/>\n        <source>Quoted string (qx, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerperl.cpp\" line=\"438\"/>\n        <source>Quoted string (qr, interpolated variable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPostScript</name>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"249\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"252\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"255\"/>\n        <source>DSC comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"258\"/>\n        <source>DSC comment value</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"261\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"264\"/>\n        <source>Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"267\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"270\"/>\n        <source>Literal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"273\"/>\n        <source>Immediately evaluated literal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"276\"/>\n        <source>Array parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"279\"/>\n        <source>Dictionary parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"282\"/>\n        <source>Procedure parenthesis</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"285\"/>\n        <source>Text</source>\n        <translation type=\"unfinished\">Texto</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"288\"/>\n        <source>Hexadecimal string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"291\"/>\n        <source>Base85 string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpostscript.cpp\" line=\"294\"/>\n        <source>Bad string character</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerProperties</name>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"111\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"114\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"117\"/>\n        <source>Section</source>\n        <translation>Seção</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"120\"/>\n        <source>Assignment</source>\n        <translation>Atribuição</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"123\"/>\n        <source>Default value</source>\n        <translation>Valor Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerproperties.cpp\" line=\"126\"/>\n        <source>Key</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerPython</name>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"222\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"225\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"228\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"231\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"234\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"237\"/>\n        <source>Keyword</source>\n        <translation>Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"240\"/>\n        <source>Triple single-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por três aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"243\"/>\n        <source>Triple double-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por três aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"246\"/>\n        <source>Class name</source>\n        <translation>Nome da classe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"249\"/>\n        <source>Function or method name</source>\n        <translation>Nome da função ou método</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"252\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"255\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"258\"/>\n        <source>Comment block</source>\n        <translation>Bloco de comentários</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"261\"/>\n        <source>Unclosed string</source>\n        <translation>Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"264\"/>\n        <source>Highlighted identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerpython.cpp\" line=\"267\"/>\n        <source>Decorator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerRuby</name>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"239\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"245\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"251\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"257\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"260\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"254\"/>\n        <source>Keyword</source>\n        <translation>Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"263\"/>\n        <source>Class name</source>\n        <translation>Nome da classe</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"266\"/>\n        <source>Function or method name</source>\n        <translation>Nome da função ou método</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"269\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"272\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"242\"/>\n        <source>Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"248\"/>\n        <source>POD</source>\n        <translation type=\"unfinished\">POD</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"275\"/>\n        <source>Regular expression</source>\n        <translation type=\"unfinished\">Expressão Regular</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"278\"/>\n        <source>Global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"281\"/>\n        <source>Symbol</source>\n        <translation type=\"unfinished\">Símbolo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"284\"/>\n        <source>Module name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"287\"/>\n        <source>Instance variable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"290\"/>\n        <source>Class variable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"293\"/>\n        <source>Backticks</source>\n        <translation type=\"unfinished\">Aspas Invertidas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"296\"/>\n        <source>Data section</source>\n        <translation type=\"unfinished\">Seção de dados</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"299\"/>\n        <source>Here document delimiter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"302\"/>\n        <source>Here document</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"305\"/>\n        <source>%q string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"308\"/>\n        <source>%Q string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"311\"/>\n        <source>%x string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"314\"/>\n        <source>%r string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"317\"/>\n        <source>%w string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"320\"/>\n        <source>Demoted keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"323\"/>\n        <source>stdin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"326\"/>\n        <source>stdout</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerruby.cpp\" line=\"329\"/>\n        <source>stderr</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSQL</name>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"256\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"259\"/>\n        <source>Comment</source>\n        <translation>Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"268\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"271\"/>\n        <source>Keyword</source>\n        <translation>Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"277\"/>\n        <source>Single-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas simples</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"286\"/>\n        <source>Operator</source>\n        <translation>Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"289\"/>\n        <source>Identifier</source>\n        <translation>Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"262\"/>\n        <source>Comment line</source>\n        <translation>Comentário de Linha</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"265\"/>\n        <source>JavaDoc style comment</source>\n        <translation>Comentário estilo JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"274\"/>\n        <source>Double-quoted string</source>\n        <translation>Cadeia de caracteres envolvida por aspas duplas</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"280\"/>\n        <source>SQL*Plus keyword</source>\n        <translation>Palavra chave do SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"283\"/>\n        <source>SQL*Plus prompt</source>\n        <translation>Prompt do SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"292\"/>\n        <source>SQL*Plus comment</source>\n        <translation>Comentário do SQL*Plus</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"295\"/>\n        <source># comment line</source>\n        <translation>Comentário de linha usando #</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"298\"/>\n        <source>JavaDoc keyword</source>\n        <translation>Palavra chave JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"301\"/>\n        <source>JavaDoc keyword error</source>\n        <translation>Erro de palavra chave do JavaDoc</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"304\"/>\n        <source>User defined 1</source>\n        <translation>Definição de usuário 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"307\"/>\n        <source>User defined 2</source>\n        <translation>Definição de usuário 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"310\"/>\n        <source>User defined 3</source>\n        <translation>Definição de usuário 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"313\"/>\n        <source>User defined 4</source>\n        <translation>Definição de usuário 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexersql.cpp\" line=\"316\"/>\n        <source>Quoted identifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerSpice</name>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"156\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"159\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"162\"/>\n        <source>Command</source>\n        <translation type=\"unfinished\">Comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"165\"/>\n        <source>Function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"168\"/>\n        <source>Parameter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"171\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"174\"/>\n        <source>Delimiter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"177\"/>\n        <source>Value</source>\n        <translation type=\"unfinished\">Valor</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerspice.cpp\" line=\"180\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTCL</name>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"283\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"286\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"289\"/>\n        <source>Comment line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"292\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"295\"/>\n        <source>Quoted keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"298\"/>\n        <source>Quoted string</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"301\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"304\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"307\"/>\n        <source>Substitution</source>\n        <translation type=\"unfinished\">Substituição</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"310\"/>\n        <source>Brace substitution</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"313\"/>\n        <source>Modifier</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"316\"/>\n        <source>Expand keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"319\"/>\n        <source>TCL keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"322\"/>\n        <source>Tk keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"325\"/>\n        <source>iTCL keyword</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"328\"/>\n        <source>Tk command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"331\"/>\n        <source>User defined 1</source>\n        <translation type=\"unfinished\">Definição de usuário 1</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"334\"/>\n        <source>User defined 2</source>\n        <translation type=\"unfinished\">Definição de usuário 2</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"337\"/>\n        <source>User defined 3</source>\n        <translation type=\"unfinished\">Definição de usuário 3</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"340\"/>\n        <source>User defined 4</source>\n        <translation type=\"unfinished\">Definição de usuário 4</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"343\"/>\n        <source>Comment box</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertcl.cpp\" line=\"346\"/>\n        <source>Comment block</source>\n        <translation type=\"unfinished\">Bloco de comentários</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerTeX</name>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"177\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"180\"/>\n        <source>Special</source>\n        <translation>Especial</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"183\"/>\n        <source>Group</source>\n        <translation>Grupo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"186\"/>\n        <source>Symbol</source>\n        <translation>Símbolo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"189\"/>\n        <source>Command</source>\n        <translation>Comando</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexertex.cpp\" line=\"192\"/>\n        <source>Text</source>\n        <translation>Texto</translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVHDL</name>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"197\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"200\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"203\"/>\n        <source>Comment line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"206\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"209\"/>\n        <source>String</source>\n        <translation type=\"unfinished\">Cadeia de Caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"212\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"215\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"218\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"221\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"224\"/>\n        <source>Standard operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"227\"/>\n        <source>Attribute</source>\n        <translation type=\"unfinished\">Atributo</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"230\"/>\n        <source>Standard function</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"233\"/>\n        <source>Standard package</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"236\"/>\n        <source>Standard type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexervhdl.cpp\" line=\"239\"/>\n        <source>User defined</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerVerilog</name>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"209\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"212\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"215\"/>\n        <source>Line comment</source>\n        <translation type=\"unfinished\">Comentar Linha</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"218\"/>\n        <source>Bang comment</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"221\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"224\"/>\n        <source>Primary keywords and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"227\"/>\n        <source>String</source>\n        <translation type=\"unfinished\">Cadeia de Caracteres</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"230\"/>\n        <source>Secondary keywords and identifiers</source>\n        <translation type=\"unfinished\">Identificadores e palavras chave secundárias</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"233\"/>\n        <source>System task</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"236\"/>\n        <source>Preprocessor block</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"239\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"242\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"245\"/>\n        <source>Unclosed string</source>\n        <translation type=\"unfinished\">Cadeia de caracteres não fechada</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexerverilog.cpp\" line=\"248\"/>\n        <source>User defined tasks and identifiers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QsciLexerYAML</name>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"161\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\">Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"164\"/>\n        <source>Comment</source>\n        <translation type=\"unfinished\">Comentário</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"167\"/>\n        <source>Identifier</source>\n        <translation type=\"unfinished\">Identificador</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"170\"/>\n        <source>Keyword</source>\n        <translation type=\"unfinished\">Palavra Chave</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"173\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\">Número</translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"176\"/>\n        <source>Reference</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"179\"/>\n        <source>Document delimiter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"182\"/>\n        <source>Text block marker</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"185\"/>\n        <source>Syntax error marker</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qscilexeryaml.cpp\" line=\"188\"/>\n        <source>Operator</source>\n        <translation type=\"unfinished\">Operador</translation>\n    </message>\n</context>\n<context>\n    <name>QsciScintilla</name>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4359\"/>\n        <source>&amp;Undo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4363\"/>\n        <source>&amp;Redo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4369\"/>\n        <source>Cu&amp;t</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4374\"/>\n        <source>&amp;Copy</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4380\"/>\n        <source>&amp;Paste</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4384\"/>\n        <source>Delete</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"qsciscintilla.cpp\" line=\"4391\"/>\n        <source>Select All</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciprinter.cpp",
    "content": "// This module implements the QsciPrinter class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qsciprinter.h\"\n\n#if !defined(QT_NO_PRINTER)\n\n#include <qprinter.h>\n#include <qpainter.h>\n\n#include <qstack.h>\n\n#include \"Qsci/qsciscintillabase.h\"\n\n\n// The ctor.\nQsciPrinter::QsciPrinter(QPrinter::PrinterMode mode)\n    : QPrinter(mode), mag(0), wrap(QsciScintilla::WrapWord)\n{\n}\n\n\n// The dtor.\nQsciPrinter::~QsciPrinter()\n{\n}\n\n\n// Format the page before the document text is drawn.\nvoid QsciPrinter::formatPage(QPainter &, bool, QRect &, int)\n{\n}\n\n\n// Print a range of lines to a printer.\nint QsciPrinter::printRange(QsciScintillaBase *qsb, int from, int to)\n{\n    // Sanity check.\n    if (!qsb)\n        return false;\n\n    // Setup the printing area.\n    QRect def_area;\n\n    def_area.setX(0);\n    def_area.setY(0);\n\n    def_area.setWidth(width());\n    def_area.setHeight(height());\n\n    // Get the page range.\n    int pgFrom, pgTo;\n\n    pgFrom = fromPage();\n    pgTo = toPage();\n\n    // Find the position range.\n    long startPos, endPos;\n\n    endPos = qsb->SendScintilla(QsciScintillaBase::SCI_GETLENGTH);\n\n    startPos = (from > 0 ? qsb -> SendScintilla(QsciScintillaBase::SCI_POSITIONFROMLINE,from) : 0);\n\n    if (to >= 0)\n    {\n        long toPos = qsb -> SendScintilla(QsciScintillaBase::SCI_POSITIONFROMLINE,to + 1);\n\n        if (endPos > toPos)\n            endPos = toPos;\n    }\n\n    if (startPos >= endPos)\n        return false;\n\n    QPainter painter(this);\n    bool reverse = (pageOrder() == LastPageFirst);\n    bool needNewPage = false;\n\n    qsb -> SendScintilla(QsciScintillaBase::SCI_SETPRINTMAGNIFICATION,mag);\n    qsb -> SendScintilla(QsciScintillaBase::SCI_SETPRINTWRAPMODE,wrap);\n\n    for (int i = 1; i <= numCopies(); ++i)\n    {\n        // If we are printing in reverse page order then remember the start\n        // position of each page.\n        QStack<long> pageStarts;\n\n        int currPage = 1;\n        long pos = startPos;\n\n        while (pos < endPos)\n        {\n            // See if we have finished the requested page range.\n            if (pgTo > 0 && pgTo < currPage)\n                break;\n\n            // See if we are going to render this page, or just see how much\n            // would fit onto it.\n            bool render = false;\n\n            if (pgFrom == 0 || pgFrom <= currPage)\n            {\n                if (reverse)\n                    pageStarts.push(pos);\n                else\n                {\n                    render = true;\n\n                    if (needNewPage)\n                    {\n                        if (!newPage())\n                            return false;\n                    }\n                    else\n                        needNewPage = true;\n                }\n            }\n\n            QRect area = def_area;\n\n            formatPage(painter,render,area,currPage);\n            pos = qsb -> SendScintilla(QsciScintillaBase::SCI_FORMATRANGE,render,&painter,area,pos,endPos);\n\n            ++currPage;\n        }\n\n        // All done if we are printing in normal page order.\n        if (!reverse)\n            continue;\n\n        // Now go through each page on the stack and really print it.\n        while (!pageStarts.isEmpty())\n        {\n            --currPage;\n\n            long ePos = pos;\n            pos = pageStarts.pop();\n\n            if (needNewPage)\n            {\n                if (!newPage())\n                    return false;\n            }\n            else\n                needNewPage = true;\n\n            QRect area = def_area;\n\n            formatPage(painter,true,area,currPage);\n            qsb->SendScintilla(QsciScintillaBase::SCI_FORMATRANGE,true,&painter,area,pos,ePos);\n        }\n    }\n\n    return true;\n}\n\n\n// Set the print magnification in points.\nvoid QsciPrinter::setMagnification(int magnification)\n{\n    mag = magnification;\n}\n\n\n// Set the line wrap mode.\nvoid QsciPrinter::setWrapMode(QsciScintilla::WrapMode wmode)\n{\n    wrap = wmode;\n}\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp",
    "content": "// This module implements the \"official\" high-level API of the Qt port of\n// Scintilla.  It is modelled on QTextEdit - a method of the same name should\n// behave in the same way.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qsciscintilla.h\"\n\n#include <string.h>\n#include <qaction.h>\n#include <qapplication.h>\n#include <qcolor.h>\n#include <qevent.h>\n#include <qimage.h>\n#include <qiodevice.h>\n#include <qkeysequence.h>\n#include <qpoint.h>\n\n#include <qmenu.h>\n\n#include \"Qsci/qsciabstractapis.h\"\n#include \"Qsci/qscicommandset.h\"\n#include \"Qsci/qscilexer.h\"\n#include \"Qsci/qscistyle.h\"\n#include \"Qsci/qscistyledtext.h\"\n\n//---OPENCOR--- BEGIN\nstruct QsciScintilla::Lexer\n{\n    QPointer<QsciLexer> object;\n};\n\n#define lex (lexerStruct->object)\n//---OPENCOR--- END\n\n// Make sure these match the values in Scintilla.h.  We don't #include that\n// file because it just causes more clashes.\n#define KEYWORDSET_MAX  8\n#define MARKER_MAX      31\n\n// The list separators for auto-completion and user lists.\nconst char acSeparator = '\\x03';\nconst char userSeparator = '\\x04';\n\n// The default fold margin width.\nstatic const int defaultFoldMarginWidth = 14;\n\n// The default set of characters that make up a word.\nstatic const char *defaultWordChars = \"_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n\n\n// The ctor.\nQsciScintilla::QsciScintilla(QWidget *parent)\n    : QsciScintillaBase(parent),\n      allocatedMarkers(0), allocatedIndicators(7), oldPos(-1), selText(false),\n      fold(NoFoldStyle), foldmargin(2), autoInd(false),\n      braceMode(NoBraceMatch), acSource(AcsNone), acThresh(-1),\n      wchars(defaultWordChars), call_tips_position(CallTipsBelowText),\n      call_tips_style(CallTipsNoContext), maxCallTips(-1),\n      use_single(AcusNever), explicit_fillups(\"\"), fillups_enabled(false)\n//---OPENCOR--- BEGIN\n    , lexerStruct(new Lexer())\n//---OPENCOR--- END\n{\n    connect(this,SIGNAL(SCN_MODIFYATTEMPTRO()),\n             SIGNAL(modificationAttempted()));\n\n    connect(this,SIGNAL(SCN_MODIFIED(int,int,const char *,int,int,int,int,int,int,int)),\n             SLOT(handleModified(int,int,const char *,int,int,int,int,int,int,int)));\n    connect(this,SIGNAL(SCN_CALLTIPCLICK(int)),\n             SLOT(handleCallTipClick(int)));\n    connect(this,SIGNAL(SCN_CHARADDED(int)),\n             SLOT(handleCharAdded(int)));\n    connect(this,SIGNAL(SCN_INDICATORCLICK(int,int)),\n             SLOT(handleIndicatorClick(int,int)));\n    connect(this,SIGNAL(SCN_INDICATORRELEASE(int,int)),\n             SLOT(handleIndicatorRelease(int,int)));\n    connect(this,SIGNAL(SCN_MARGINCLICK(int,int,int)),\n             SLOT(handleMarginClick(int,int,int)));\n    connect(this,SIGNAL(SCN_SAVEPOINTREACHED()),\n             SLOT(handleSavePointReached()));\n    connect(this,SIGNAL(SCN_SAVEPOINTLEFT()),\n             SLOT(handleSavePointLeft()));\n    connect(this,SIGNAL(SCN_UPDATEUI(int)),\n             SLOT(handleUpdateUI(int)));\n    connect(this,SIGNAL(QSCN_SELCHANGED(bool)),\n             SLOT(handleSelectionChanged(bool)));\n    connect(this,SIGNAL(SCN_AUTOCSELECTION(const char *,int)),\n             SLOT(handleAutoCompletionSelection()));\n    connect(this,SIGNAL(SCN_USERLISTSELECTION(const char *,int)),\n             SLOT(handleUserListSelection(const char *,int)));\n\n    // Set the default font.\n    setFont(QApplication::font());\n\n    // Set the default fore and background colours.\n    QPalette pal = QApplication::palette();\n    setColor(pal.text().color());\n    setPaper(pal.base().color());\n    setSelectionForegroundColor(pal.highlightedText().color());\n    setSelectionBackgroundColor(pal.highlight().color());\n\n#if defined(Q_OS_WIN)\n    setEolMode(EolWindows);\n#else\n    // Note that EolMac is pre-OS/X.\n    setEolMode(EolUnix);\n#endif\n\n    // Capturing the mouse seems to cause problems on multi-head systems. Qt\n    // should do the right thing anyway.\n    SendScintilla(SCI_SETMOUSEDOWNCAPTURES, 0UL);\n\n    setMatchedBraceForegroundColor(Qt::blue);\n    setUnmatchedBraceForegroundColor(Qt::red);\n\n    setAnnotationDisplay(AnnotationStandard);\n    setLexer();\n\n    // Set the visible policy.  These are the same as SciTE's defaults\n    // which, presumably, are sensible.\n    SendScintilla(SCI_SETVISIBLEPOLICY, VISIBLE_STRICT | VISIBLE_SLOP, 4);\n\n    // The default behaviour is unexpected.\n    SendScintilla(SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR,\n            SC_CASEINSENSITIVEBEHAVIOUR_IGNORECASE);\n\n    // Create the standard command set.\n    stdCmds = new QsciCommandSet(this);\n\n    doc.display(this,0);\n}\n\n\n// The dtor.\nQsciScintilla::~QsciScintilla()\n{\n    // Detach any current lexer.\n    detachLexer();\n\n    doc.undisplay(this);\n    delete stdCmds;\n//---OPENCOR--- BEGIN\n    delete lexerStruct;\n//---OPENCOR--- END\n}\n\n\n// Return the current text colour.\nQColor QsciScintilla::color() const\n{\n    return nl_text_colour;\n}\n\n\n// Set the text colour.\nvoid QsciScintilla::setColor(const QColor &c)\n{\n    if (lex.isNull())\n    {\n        // Assume style 0 applies to everything so that we don't need to use\n        // SCI_STYLECLEARALL which clears everything.\n        SendScintilla(SCI_STYLESETFORE, 0, c);\n        nl_text_colour = c;\n    }\n}\n\n\n// Return the overwrite mode.\nbool QsciScintilla::overwriteMode() const\n{\n    return SendScintilla(SCI_GETOVERTYPE);\n}\n\n\n// Set the overwrite mode.\nvoid QsciScintilla::setOverwriteMode(bool overwrite)\n{\n    SendScintilla(SCI_SETOVERTYPE, overwrite);\n}\n\n\n// Return the current paper colour.\nQColor QsciScintilla::paper() const\n{\n    return nl_paper_colour;\n}\n\n\n// Set the paper colour.\nvoid QsciScintilla::setPaper(const QColor &c)\n{\n    if (lex.isNull())\n    {\n        // Assume style 0 applies to everything so that we don't need to use\n        // SCI_STYLECLEARALL which clears everything.  We still have to set the\n        // default style as well for the background without any text.\n        SendScintilla(SCI_STYLESETBACK, 0, c);\n        SendScintilla(SCI_STYLESETBACK, STYLE_DEFAULT, c);\n        nl_paper_colour = c;\n    }\n}\n\n\n// Set the default font.\nvoid QsciScintilla::setFont(const QFont &f)\n{\n    if (lex.isNull())\n    {\n        // Assume style 0 applies to everything so that we don't need to use\n        // SCI_STYLECLEARALL which clears everything.\n        setStylesFont(f, 0);\n        QWidget::setFont(f);\n    }\n}\n\n\n// Enable/disable auto-indent.\nvoid QsciScintilla::setAutoIndent(bool autoindent)\n{\n    autoInd = autoindent;\n}\n\n\n// Set the brace matching mode.\nvoid QsciScintilla::setBraceMatching(BraceMatch bm)\n{\n    braceMode = bm;\n}\n\n\n// Handle the addition of a character.\nvoid QsciScintilla::handleCharAdded(int ch)\n{\n    // Ignore if there is a selection.\n    long pos = SendScintilla(SCI_GETSELECTIONSTART);\n\n    if (pos != SendScintilla(SCI_GETSELECTIONEND) || pos == 0)\n        return;\n\n    // If auto-completion is already active then see if this character is a\n    // start character.  If it is then create a new list which will be a subset\n    // of the current one.  The case where it isn't a start character seems to\n    // be handled correctly elsewhere.\n    if (isListActive())\n    {\n        if (isStartChar(ch))\n        {\n            cancelList();\n            startAutoCompletion(acSource, false, use_single == AcusAlways);\n        }\n\n        return;\n    }\n\n    // Handle call tips.\n    if (call_tips_style != CallTipsNone && !lex.isNull() && strchr(\"(),\", ch) != NULL)\n        callTip();\n\n    // Handle auto-indentation.\n    if (autoInd)\n        if (lex.isNull() || (lex->autoIndentStyle() & AiMaintain))\n            maintainIndentation(ch, pos);\n        else\n            autoIndentation(ch, pos);\n\n    // See if we might want to start auto-completion.\n    if (!isCallTipActive() && acSource != AcsNone)\n        if (isStartChar(ch))\n            startAutoCompletion(acSource, false, use_single == AcusAlways);\n        else if (acThresh >= 1 && isWordCharacter(ch))\n            startAutoCompletion(acSource, true, use_single == AcusAlways);\n}\n\n\n// See if a call tip is active.\nbool QsciScintilla::isCallTipActive() const\n{\n    return SendScintilla(SCI_CALLTIPACTIVE);\n}\n\n\n// Handle a possible change to any current call tip.\nvoid QsciScintilla::callTip()\n{\n    QsciAbstractAPIs *apis = lex->apis();\n\n    if (!apis)\n        return;\n\n    int pos, commas = 0;\n    bool found = false;\n    char ch;\n\n    pos = SendScintilla(SCI_GETCURRENTPOS);\n\n    // Move backwards through the line looking for the start of the current\n    // call tip and working out which argument it is.\n    while ((ch = getCharacter(pos)) != '\\0')\n    {\n        if (ch == ',')\n            ++commas;\n        else if (ch == ')')\n        {\n            int depth = 1;\n\n            // Ignore everything back to the start of the corresponding\n            // parenthesis.\n            while ((ch = getCharacter(pos)) != '\\0')\n            {\n                if (ch == ')')\n                    ++depth;\n                else if (ch == '(' && --depth == 0)\n                    break;\n            }\n        }\n        else if (ch == '(')\n        {\n            found = true;\n            break;\n        }\n    }\n\n    // Cancel any existing call tip.\n    SendScintilla(SCI_CALLTIPCANCEL);\n\n    // Done if there is no new call tip to set.\n    if (!found)\n        return;\n\n    QStringList context = apiContext(pos, pos, ctPos);\n\n    if (context.isEmpty())\n        return;\n\n    // The last word is complete, not partial.\n    context << QString();\n\n    ct_cursor = 0;\n    ct_shifts.clear();\n    ct_entries = apis->callTips(context, commas, call_tips_style, ct_shifts);\n\n    int nr_entries = ct_entries.count();\n\n    if (nr_entries == 0)\n        return;\n\n    if (maxCallTips > 0 && maxCallTips < nr_entries)\n    {\n        ct_entries = ct_entries.mid(0, maxCallTips);\n        nr_entries = maxCallTips;\n    }\n\n    int shift;\n    QString ct;\n\n    int nr_shifts = ct_shifts.count();\n\n    if (maxCallTips < 0 && nr_entries > 1)\n    {\n        shift = (nr_shifts > 0 ? ct_shifts.first() : 0);\n        ct = ct_entries[0];\n        ct.prepend('\\002');\n    }\n    else\n    {\n        if (nr_shifts > nr_entries)\n            nr_shifts = nr_entries;\n\n        // Find the biggest shift.\n        shift = 0;\n\n        for (int i = 0; i < nr_shifts; ++i)\n        {\n            int sh = ct_shifts[i];\n\n            if (shift < sh)\n                shift = sh;\n        }\n\n        ct = ct_entries.join(\"\\n\");\n    }\n\n    QByteArray ct_ba = ct.toLatin1();\n    const char *cts = ct_ba.data();\n\n    SendScintilla(SCI_CALLTIPSHOW, adjustedCallTipPosition(shift), cts);\n\n    // Done if there is more than one call tip.\n    if (nr_entries > 1)\n        return;\n\n    // Highlight the current argument.\n    const char *astart;\n\n    if (commas == 0)\n        astart = strchr(cts, '(');\n    else\n        for (astart = strchr(cts, ','); astart && --commas > 0; astart = strchr(astart + 1, ','))\n            ;\n\n    if (!astart || !*++astart)\n        return;\n\n    // The end is at the next comma or unmatched closing parenthesis.\n    const char *aend;\n    int depth = 0;\n\n    for (aend = astart; *aend; ++aend)\n    {\n        char ch = *aend;\n\n        if (ch == ',' && depth == 0)\n            break;\n        else if (ch == '(')\n            ++depth;\n        else if (ch == ')')\n        {\n            if (depth == 0)\n                break;\n\n            --depth;\n        }\n    }\n\n    if (astart != aend)\n        SendScintilla(SCI_CALLTIPSETHLT, astart - cts, aend - cts);\n}\n\n\n// Handle a call tip click.\nvoid QsciScintilla::handleCallTipClick(int dir)\n{\n    int nr_entries = ct_entries.count();\n\n    // Move the cursor while bounds checking.\n    if (dir == 1)\n    {\n        if (ct_cursor - 1 < 0)\n            return;\n\n        --ct_cursor;\n    }\n    else if (dir == 2)\n    {\n        if (ct_cursor + 1 >= nr_entries)\n            return;\n\n        ++ct_cursor;\n    }\n    else\n        return;\n\n    int shift = (ct_shifts.count() > ct_cursor ? ct_shifts[ct_cursor] : 0);\n    QString ct = ct_entries[ct_cursor];\n\n    // Add the arrows.\n    if (ct_cursor < nr_entries - 1)\n        ct.prepend('\\002');\n\n    if (ct_cursor > 0)\n        ct.prepend('\\001');\n\n    SendScintilla(SCI_CALLTIPSHOW, adjustedCallTipPosition(shift), ct.toLatin1().data());\n}\n\n\n// Shift the position of the call tip (to take any context into account) but\n// don't go before the start of the line.\nint QsciScintilla::adjustedCallTipPosition(int ctshift) const\n{\n    int ct = ctPos;\n\n    if (ctshift)\n    {\n        int ctmin = SendScintilla(SCI_POSITIONFROMLINE, SendScintilla(SCI_LINEFROMPOSITION, ct));\n\n        if (ct - ctshift < ctmin)\n            ct = ctmin;\n    }\n\n    return ct;\n}\n\n\n// Return the list of words that make up the context preceding the given\n// position.  The list will only have more than one element if there is a lexer\n// set and it defines start strings.  If so, then the last element might be\n// empty if a start string has just been typed.  On return pos is at the start\n// of the context.\nQStringList QsciScintilla::apiContext(int pos, int &context_start,\n        int &last_word_start)\n{\n    enum {\n        Either,\n        Separator,\n        Word\n    };\n\n    QStringList words;\n    int good_pos = pos, expecting = Either;\n\n    last_word_start = -1;\n\n    while (pos > 0)\n    {\n        if (getSeparator(pos))\n        {\n            if (expecting == Either)\n                words.prepend(QString());\n            else if (expecting == Word)\n                break;\n\n            good_pos = pos;\n            expecting = Word;\n        }\n        else\n        {\n            QString word = getWord(pos);\n\n            if (word.isEmpty() || expecting == Separator)\n                break;\n\n            words.prepend(word);\n            good_pos = pos;\n            expecting = Separator;\n\n            // Return the position of the start of the last word if required.\n            if (last_word_start < 0)\n                last_word_start = pos;\n        }\n\n        // Strip any preceding spaces (mainly around operators).\n        char ch;\n\n        while ((ch = getCharacter(pos)) != '\\0')\n        {\n            // This is the same definition of space that Scintilla uses.\n            if (ch != ' ' && (ch < 0x09 || ch > 0x0d))\n            {\n                ++pos;\n                break;\n            }\n        }\n    }\n\n    // A valid sequence always starts with a word and so should be expecting a\n    // separator.\n    if (expecting != Separator)\n        words.clear();\n\n    context_start = good_pos;\n\n    return words;\n}\n\n\n// Try and get a lexer's word separator from the text before the current\n// position.  Return true if one was found and adjust the position accordingly.\nbool QsciScintilla::getSeparator(int &pos) const\n{\n    int opos = pos;\n\n    // Go through each separator.\n    for (int i = 0; i < wseps.count(); ++i)\n    {\n        const QString &ws = wseps[i];\n\n        // Work backwards.\n        uint l;\n\n        for (l = ws.length(); l; --l)\n        {\n            char ch = getCharacter(pos);\n\n            if (ch == '\\0' || ws.at(l - 1) != ch)\n                break;\n        }\n\n        if (!l)\n            return true;\n\n        // Reset for the next separator.\n        pos = opos;\n    }\n\n    return false;\n}\n\n\n// Try and get a word from the text before the current position.  Return the\n// word if one was found and adjust the position accordingly.\nQString QsciScintilla::getWord(int &pos) const\n{\n    QString word;\n    bool numeric = true;\n    char ch;\n\n    while ((ch = getCharacter(pos)) != '\\0')\n    {\n        if (!isWordCharacter(ch))\n        {\n            ++pos;\n            break;\n        }\n\n        if (ch < '0' || ch > '9')\n            numeric = false;\n\n        word.prepend(ch);\n    }\n\n    // We don't auto-complete numbers.\n    if (numeric)\n        word.truncate(0);\n\n    return word;\n}\n\n\n// Get the \"next\" character (ie. the one before the current position) in the\n// current line.  The character will be '\\0' if there are no more.\nchar QsciScintilla::getCharacter(int &pos) const\n{\n    if (pos <= 0)\n        return '\\0';\n\n    char ch = SendScintilla(SCI_GETCHARAT, --pos);\n\n    // Don't go past the end of the previous line.\n    if (ch == '\\n' || ch == '\\r')\n    {\n        ++pos;\n        return '\\0';\n    }\n\n    return ch;\n}\n\n\n// See if a character is an auto-completion start character, ie. the last\n// character of a word separator.\nbool QsciScintilla::isStartChar(char ch) const\n{\n    QString s = QChar(ch);\n\n    for (int i = 0; i < wseps.count(); ++i)\n        if (wseps[i].endsWith(s))\n            return true;\n\n    return false;\n}\n\n\n// Possibly start auto-completion.\nvoid QsciScintilla::startAutoCompletion(AutoCompletionSource acs,\n        bool checkThresh, bool choose_single)\n{\n    int start, ignore;\n    QStringList context = apiContext(SendScintilla(SCI_GETCURRENTPOS), start,\n            ignore);\n\n    if (context.isEmpty())\n        return;\n\n    // Get the last word's raw data and length.\n    ScintillaBytes s = textAsBytes(context.last());\n    const char *last_data = ScintillaBytesConstData(s);\n    int last_len = s.length();\n\n    if (checkThresh && last_len < acThresh)\n        return;\n\n    // Generate the string representing the valid words to select from.\n    QStringList wlist;\n\n    if ((acs == AcsAll || acs == AcsAPIs) && !lex.isNull())\n    {\n        QsciAbstractAPIs *apis = lex->apis();\n\n        if (apis)\n            apis->updateAutoCompletionList(context, wlist);\n    }\n\n    if (acs == AcsAll || acs == AcsDocument)\n    {\n        int sflags = SCFIND_WORDSTART;\n\n        if (!SendScintilla(SCI_AUTOCGETIGNORECASE))\n            sflags |= SCFIND_MATCHCASE;\n\n        SendScintilla(SCI_SETSEARCHFLAGS, sflags);\n\n        int pos = 0;\n        int dlen = SendScintilla(SCI_GETLENGTH);\n        int caret = SendScintilla(SCI_GETCURRENTPOS);\n        int clen = caret - start;\n        char *orig_context = new char[clen + 1];\n\n        SendScintilla(SCI_GETTEXTRANGE, start, caret, orig_context);\n\n        for (;;)\n        {\n            int fstart;\n\n            SendScintilla(SCI_SETTARGETSTART, pos);\n            SendScintilla(SCI_SETTARGETEND, dlen);\n\n            if ((fstart = SendScintilla(SCI_SEARCHINTARGET, clen, orig_context)) < 0)\n                break;\n\n            // Move past the root part.\n            pos = fstart + clen;\n\n            // Skip if this is the context we are auto-completing.\n            if (pos == caret)\n                continue;\n\n            // Get the rest of this word.\n            QString w = last_data;\n\n            while (pos < dlen)\n            {\n                char ch = SendScintilla(SCI_GETCHARAT, pos);\n\n                if (!isWordCharacter(ch))\n                    break;\n\n                w += ch;\n                ++pos;\n            }\n\n            // Add the word if it isn't already there.\n            if (!w.isEmpty())\n            {\n                bool keep;\n\n                // If there are APIs then check if the word is already present\n                // as an API word (i.e. with a trailing space).\n                if (acs == AcsAll)\n                {\n                    QString api_w = w;\n                    api_w.append(' ');\n\n                    keep = !wlist.contains(api_w);\n                }\n                else\n                {\n                    keep = true;\n                }\n\n                if (keep && !wlist.contains(w))\n                    wlist.append(w);\n            }\n        }\n\n        delete []orig_context;\n    }\n\n    if (wlist.isEmpty())\n        return;\n\n    wlist.sort();\n\n    SendScintilla(SCI_AUTOCSETCHOOSESINGLE, choose_single);\n    SendScintilla(SCI_AUTOCSETSEPARATOR, acSeparator);\n\n    ScintillaBytes wlist_s = textAsBytes(wlist.join(QChar(acSeparator)));\n    SendScintilla(SCI_AUTOCSHOW, last_len, ScintillaBytesConstData(wlist_s));\n}\n\n\n// Maintain the indentation of the previous line.\nvoid QsciScintilla::maintainIndentation(char ch, long pos)\n{\n    if (ch != '\\r' && ch != '\\n')\n        return;\n\n    int curr_line = SendScintilla(SCI_LINEFROMPOSITION, pos);\n\n    // Get the indentation of the preceding non-zero length line.\n    int ind = 0;\n\n    for (int line = curr_line - 1; line >= 0; --line)\n    {\n        if (SendScintilla(SCI_GETLINEENDPOSITION, line) >\n            SendScintilla(SCI_POSITIONFROMLINE, line))\n        {\n            ind = indentation(line);\n            break;\n        }\n    }\n\n    if (ind > 0)\n        autoIndentLine(pos, curr_line, ind);\n}\n\n\n// Implement auto-indentation.\nvoid QsciScintilla::autoIndentation(char ch, long pos)\n{\n    int curr_line = SendScintilla(SCI_LINEFROMPOSITION, pos);\n    int ind_width = indentWidth();\n    long curr_line_start = SendScintilla(SCI_POSITIONFROMLINE, curr_line);\n\n    const char *block_start = lex->blockStart();\n    bool start_single = (block_start && qstrlen(block_start) == 1);\n\n    const char *block_end = lex->blockEnd();\n    bool end_single = (block_end && qstrlen(block_end) == 1);\n\n    if (end_single && block_end[0] == ch)\n    {\n        if (!(lex->autoIndentStyle() & AiClosing) && rangeIsWhitespace(curr_line_start, pos - 1))\n            autoIndentLine(pos, curr_line, blockIndent(curr_line - 1) - ind_width);\n    }\n    else if (start_single && block_start[0] == ch)\n    {\n        // De-indent if we have already indented because the previous line was\n        // a start of block keyword.\n        if (!(lex->autoIndentStyle() & AiOpening) && curr_line > 0 && getIndentState(curr_line - 1) == isKeywordStart && rangeIsWhitespace(curr_line_start, pos - 1))\n            autoIndentLine(pos, curr_line, blockIndent(curr_line - 1) - ind_width);\n    }\n    else if (ch == '\\r' || ch == '\\n')\n    {\n        // Don't auto-indent the line (ie. preserve its existing indentation)\n        // if we have inserted a new line above by pressing return at the start\n        // of this line - in other words, if the previous line is empty.\n        long prev_line_length = SendScintilla(SCI_GETLINEENDPOSITION, curr_line - 1) - SendScintilla(SCI_POSITIONFROMLINE, curr_line - 1);\n\n        if (prev_line_length != 0)\n            autoIndentLine(pos, curr_line, blockIndent(curr_line - 1));\n    }\n}\n\n\n// Set the indentation for a line.\nvoid QsciScintilla::autoIndentLine(long pos, int line, int indent)\n{\n    if (indent < 0)\n        return;\n\n    long pos_before = SendScintilla(SCI_GETLINEINDENTPOSITION, line);\n    SendScintilla(SCI_SETLINEINDENTATION, line, indent);\n    long pos_after = SendScintilla(SCI_GETLINEINDENTPOSITION, line);\n    long new_pos = -1;\n\n    if (pos_after > pos_before)\n        new_pos = pos + (pos_after - pos_before);\n    else if (pos_after < pos_before && pos >= pos_after)\n        if (pos >= pos_before)\n            new_pos = pos + (pos_after - pos_before);\n        else\n            new_pos = pos_after;\n\n    if (new_pos >= 0)\n        SendScintilla(SCI_SETSEL, new_pos, new_pos);\n}\n\n\n// Return the indentation of the block defined by the given line (or something\n// significant before).\nint QsciScintilla::blockIndent(int line)\n{\n    if (line < 0)\n        return 0;\n\n    // Handle the trvial case.\n    if (!lex->blockStartKeyword() && !lex->blockStart() && !lex->blockEnd())\n        return indentation(line);\n\n    int line_limit = line - lex->blockLookback();\n\n    if (line_limit < 0)\n        line_limit = 0;\n\n    for (int l = line; l >= line_limit; --l)\n    {\n        IndentState istate = getIndentState(l);\n\n        if (istate != isNone)\n        {\n            int ind_width = indentWidth();\n            int ind = indentation(l);\n\n            if (istate == isBlockStart)\n            {\n                if (!(lex -> autoIndentStyle() & AiOpening))\n                    ind += ind_width;\n            }\n            else if (istate == isBlockEnd)\n            {\n                if (lex -> autoIndentStyle() & AiClosing)\n                    ind -= ind_width;\n\n                if (ind < 0)\n                    ind = 0;\n            }\n            else if (line == l)\n                ind += ind_width;\n\n            return ind;\n        }\n    }\n\n    return indentation(line);\n}\n\n\n// Return true if all characters starting at spos up to, but not including\n// epos, are spaces or tabs.\nbool QsciScintilla::rangeIsWhitespace(long spos, long epos)\n{\n    while (spos < epos)\n    {\n        char ch = SendScintilla(SCI_GETCHARAT, spos);\n\n        if (ch != ' ' && ch != '\\t')\n            return false;\n\n        ++spos;\n    }\n\n    return true;\n}\n\n\n// Returns the indentation state of a line.\nQsciScintilla::IndentState QsciScintilla::getIndentState(int line)\n{\n    IndentState istate;\n\n    // Get the styled text.\n    long spos = SendScintilla(SCI_POSITIONFROMLINE, line);\n    long epos = SendScintilla(SCI_POSITIONFROMLINE, line + 1);\n\n    char *text = new char[(epos - spos + 1) * 2];\n\n    SendScintilla(SCI_GETSTYLEDTEXT, spos, epos, text);\n\n    int style, bstart_off, bend_off;\n\n    // Block start/end takes precedence over keywords.\n    const char *bstart_words = lex->blockStart(&style);\n    bstart_off = findStyledWord(text, style, bstart_words);\n\n    const char *bend_words = lex->blockEnd(&style);\n    bend_off = findStyledWord(text, style, bend_words);\n\n    // If there is a block start but no block end characters then ignore it\n    // unless the block start is the last significant thing on the line, ie.\n    // assume Python-like blocking.\n    if (bstart_off >= 0 && !bend_words)\n        for (int i = bstart_off * 2; text[i] != '\\0'; i += 2)\n            if (!QChar(text[i]).isSpace())\n                return isNone;\n\n    if (bstart_off > bend_off)\n        istate = isBlockStart;\n    else if (bend_off > bstart_off)\n        istate = isBlockEnd;\n    else\n    {\n        const char *words = lex->blockStartKeyword(&style);\n\n        istate = (findStyledWord(text,style,words) >= 0) ? isKeywordStart : isNone;\n    }\n\n    delete[] text;\n\n    return istate;\n}\n\n\n// text is a pointer to some styled text (ie. a character byte followed by a\n// style byte).  style is a style number.  words is a space separated list of\n// words.  Returns the position in the text immediately after the last one of\n// the words with the style.  The reason we are after the last, and not the\n// first, occurance is that we are looking for words that start and end a block\n// where the latest one is the most significant.\nint QsciScintilla::findStyledWord(const char *text, int style,\n        const char *words)\n{\n    if (!words)\n        return -1;\n\n    // Find the range of text with the style we are looking for.\n    const char *stext;\n\n    for (stext = text; stext[1] != style; stext += 2)\n        if (stext[0] == '\\0')\n            return -1;\n\n    // Move to the last character.\n    const char *etext = stext;\n\n    while (etext[2] != '\\0')\n        etext += 2;\n\n    // Backtrack until we find the style.  There will be one.\n    while (etext[1] != style)\n        etext -= 2;\n\n    // Look for each word in turn.\n    while (words[0] != '\\0')\n    {\n        // Find the end of the word.\n        const char *eword = words;\n\n        while (eword[1] != ' ' && eword[1] != '\\0')\n            ++eword;\n\n        // Now search the text backwards.\n        const char *wp = eword;\n\n        for (const char *tp = etext; tp >= stext; tp -= 2)\n        {\n            if (tp[0] != wp[0] || tp[1] != style)\n            {\n                // Reset the search.\n                wp = eword;\n                continue;\n            }\n\n            // See if all the word has matched.\n            if (wp-- == words)\n                return ((tp - text) / 2) + (eword - words) + 1;\n        }\n\n        // Move to the start of the next word if there is one.\n        words = eword + 1;\n\n        if (words[0] == ' ')\n            ++words;\n    }\n\n    return -1;\n}\n\n\n// Return true if the code page is UTF8.\nbool QsciScintilla::isUtf8() const\n{\n    return (SendScintilla(SCI_GETCODEPAGE) == SC_CP_UTF8);\n}\n\n\n// Set the code page.\nvoid QsciScintilla::setUtf8(bool cp)\n{\n    SendScintilla(SCI_SETCODEPAGE, (cp ? SC_CP_UTF8 : 0));\n}\n\n\n// Return the end-of-line mode.\nQsciScintilla::EolMode QsciScintilla::eolMode() const\n{\n    return (EolMode)SendScintilla(SCI_GETEOLMODE);\n}\n\n\n// Set the end-of-line mode.\nvoid QsciScintilla::setEolMode(EolMode mode)\n{\n    SendScintilla(SCI_SETEOLMODE, mode);\n}\n\n\n// Convert the end-of-lines to a particular mode.\nvoid QsciScintilla::convertEols(EolMode mode)\n{\n    SendScintilla(SCI_CONVERTEOLS, mode);\n}\n\n\n// Return the edge colour.\nQColor QsciScintilla::edgeColor() const\n{\n    long res = SendScintilla(SCI_GETEDGECOLOUR);\n\n    return QColor((int)res, ((int)(res >> 8)) & 0x00ff, ((int)(res >> 16)) & 0x00ff);\n}\n\n\n// Set the edge colour.\nvoid QsciScintilla::setEdgeColor(const QColor &col)\n{\n    SendScintilla(SCI_SETEDGECOLOUR, col);\n}\n\n\n// Return the edge column.\nint QsciScintilla::edgeColumn() const\n{\n    return SendScintilla(SCI_GETEDGECOLUMN);\n}\n\n\n// Set the edge column.\nvoid QsciScintilla::setEdgeColumn(int colnr)\n{\n    SendScintilla(SCI_SETEDGECOLUMN, colnr);\n}\n\n\n// Return the edge mode.\nQsciScintilla::EdgeMode QsciScintilla::edgeMode() const\n{\n    return (EdgeMode)SendScintilla(SCI_GETEDGEMODE);\n}\n\n\n// Set the edge mode.\nvoid QsciScintilla::setEdgeMode(EdgeMode mode)\n{\n    SendScintilla(SCI_SETEDGEMODE, mode);\n}\n\n\n// Return the end-of-line visibility.\nbool QsciScintilla::eolVisibility() const\n{\n    return SendScintilla(SCI_GETVIEWEOL);\n}\n\n\n// Set the end-of-line visibility.\nvoid QsciScintilla::setEolVisibility(bool visible)\n{\n    SendScintilla(SCI_SETVIEWEOL, visible);\n}\n\n\n// Return the extra ascent.\nint QsciScintilla::extraAscent() const\n{\n    return SendScintilla(SCI_GETEXTRAASCENT);\n}\n\n\n// Set the extra ascent.\nvoid QsciScintilla::setExtraAscent(int extra)\n{\n    SendScintilla(SCI_SETEXTRAASCENT, extra);\n}\n\n\n// Return the extra descent.\nint QsciScintilla::extraDescent() const\n{\n    return SendScintilla(SCI_GETEXTRADESCENT);\n}\n\n\n// Set the extra descent.\nvoid QsciScintilla::setExtraDescent(int extra)\n{\n    SendScintilla(SCI_SETEXTRADESCENT, extra);\n}\n\n\n// Return the whitespace size.\nint QsciScintilla::whitespaceSize() const\n{\n    return SendScintilla(SCI_GETWHITESPACESIZE);\n}\n\n\n// Set the whitespace size.\nvoid QsciScintilla::setWhitespaceSize(int size)\n{\n    SendScintilla(SCI_SETWHITESPACESIZE, size);\n}\n\n\n// Set the whitespace background colour.\nvoid QsciScintilla::setWhitespaceBackgroundColor(const QColor &col)\n{\n    SendScintilla(SCI_SETWHITESPACEBACK, col.isValid(), col);\n}\n\n\n// Set the whitespace foreground colour.\nvoid QsciScintilla::setWhitespaceForegroundColor(const QColor &col)\n{\n    SendScintilla(SCI_SETWHITESPACEFORE, col.isValid(), col);\n}\n\n\n// Return the whitespace visibility.\nQsciScintilla::WhitespaceVisibility QsciScintilla::whitespaceVisibility() const\n{\n    return (WhitespaceVisibility)SendScintilla(SCI_GETVIEWWS);\n}\n\n\n// Set the whitespace visibility.\nvoid QsciScintilla::setWhitespaceVisibility(WhitespaceVisibility mode)\n{\n    SendScintilla(SCI_SETVIEWWS, mode);\n}\n\n\n// Return the line wrap mode.\nQsciScintilla::WrapMode QsciScintilla::wrapMode() const\n{\n    return (WrapMode)SendScintilla(SCI_GETWRAPMODE);\n}\n\n\n// Set the line wrap mode.\nvoid QsciScintilla::setWrapMode(WrapMode mode)\n{\n    SendScintilla(SCI_SETLAYOUTCACHE,\n            (mode == WrapNone ? SC_CACHE_CARET : SC_CACHE_DOCUMENT));\n    SendScintilla(SCI_SETWRAPMODE, mode);\n}\n\n\n// Return the line wrap indent mode.\nQsciScintilla::WrapIndentMode QsciScintilla::wrapIndentMode() const\n{\n    return (WrapIndentMode)SendScintilla(SCI_GETWRAPINDENTMODE);\n}\n\n\n// Set the line wrap indent mode.\nvoid QsciScintilla::setWrapIndentMode(WrapIndentMode mode)\n{\n    SendScintilla(SCI_SETWRAPINDENTMODE, mode);\n}\n\n\n// Set the line wrap visual flags.\nvoid QsciScintilla::setWrapVisualFlags(WrapVisualFlag endFlag,\n        WrapVisualFlag startFlag, int indent)\n{\n    int flags = SC_WRAPVISUALFLAG_NONE;\n    int loc = SC_WRAPVISUALFLAGLOC_DEFAULT;\n\n    switch (endFlag)\n    {\n    case WrapFlagByText:\n        flags |= SC_WRAPVISUALFLAG_END;\n        loc |= SC_WRAPVISUALFLAGLOC_END_BY_TEXT;\n        break;\n\n    case WrapFlagByBorder:\n        flags |= SC_WRAPVISUALFLAG_END;\n        break;\n\n    case WrapFlagInMargin:\n        flags |= SC_WRAPVISUALFLAG_MARGIN;\n        break;\n    }\n\n    switch (startFlag)\n    {\n    case WrapFlagByText:\n        flags |= SC_WRAPVISUALFLAG_START;\n        loc |= SC_WRAPVISUALFLAGLOC_START_BY_TEXT;\n        break;\n\n    case WrapFlagByBorder:\n        flags |= SC_WRAPVISUALFLAG_START;\n        break;\n\n    case WrapFlagInMargin:\n        flags |= SC_WRAPVISUALFLAG_MARGIN;\n        break;\n    }\n\n    SendScintilla(SCI_SETWRAPVISUALFLAGS, flags);\n    SendScintilla(SCI_SETWRAPVISUALFLAGSLOCATION, loc);\n    SendScintilla(SCI_SETWRAPSTARTINDENT, indent);\n}\n\n\n// Set the folding style.\nvoid QsciScintilla::setFolding(FoldStyle folding, int margin)\n{\n    fold = folding;\n    foldmargin = margin;\n\n    if (folding == NoFoldStyle)\n    {\n        SendScintilla(SCI_SETMARGINWIDTHN, margin, 0L);\n        return;\n    }\n\n    int mask = SendScintilla(SCI_GETMODEVENTMASK);\n    SendScintilla(SCI_SETMODEVENTMASK, mask | SC_MOD_CHANGEFOLD);\n\n    SendScintilla(SCI_SETFOLDFLAGS, SC_FOLDFLAG_LINEAFTER_CONTRACTED);\n\n    SendScintilla(SCI_SETMARGINTYPEN, margin, (long)SC_MARGIN_SYMBOL);\n    SendScintilla(SCI_SETMARGINMASKN, margin, SC_MASK_FOLDERS);\n    SendScintilla(SCI_SETMARGINSENSITIVEN, margin, 1);\n\n    // Set the marker symbols to use.\n    switch (folding)\n    {\n    case PlainFoldStyle:\n        setFoldMarker(SC_MARKNUM_FOLDEROPEN, SC_MARK_MINUS);\n        setFoldMarker(SC_MARKNUM_FOLDER, SC_MARK_PLUS);\n        setFoldMarker(SC_MARKNUM_FOLDERSUB);\n        setFoldMarker(SC_MARKNUM_FOLDERTAIL);\n        setFoldMarker(SC_MARKNUM_FOLDEREND);\n        setFoldMarker(SC_MARKNUM_FOLDEROPENMID);\n        setFoldMarker(SC_MARKNUM_FOLDERMIDTAIL);\n        break;\n\n    case CircledFoldStyle:\n        setFoldMarker(SC_MARKNUM_FOLDEROPEN, SC_MARK_CIRCLEMINUS);\n        setFoldMarker(SC_MARKNUM_FOLDER, SC_MARK_CIRCLEPLUS);\n        setFoldMarker(SC_MARKNUM_FOLDERSUB);\n        setFoldMarker(SC_MARKNUM_FOLDERTAIL);\n        setFoldMarker(SC_MARKNUM_FOLDEREND);\n        setFoldMarker(SC_MARKNUM_FOLDEROPENMID);\n        setFoldMarker(SC_MARKNUM_FOLDERMIDTAIL);\n        break;\n\n    case BoxedFoldStyle:\n        setFoldMarker(SC_MARKNUM_FOLDEROPEN, SC_MARK_BOXMINUS);\n        setFoldMarker(SC_MARKNUM_FOLDER, SC_MARK_BOXPLUS);\n        setFoldMarker(SC_MARKNUM_FOLDERSUB);\n        setFoldMarker(SC_MARKNUM_FOLDERTAIL);\n        setFoldMarker(SC_MARKNUM_FOLDEREND);\n        setFoldMarker(SC_MARKNUM_FOLDEROPENMID);\n        setFoldMarker(SC_MARKNUM_FOLDERMIDTAIL);\n        break;\n\n    case CircledTreeFoldStyle:\n        setFoldMarker(SC_MARKNUM_FOLDEROPEN, SC_MARK_CIRCLEMINUS);\n        setFoldMarker(SC_MARKNUM_FOLDER, SC_MARK_CIRCLEPLUS);\n        setFoldMarker(SC_MARKNUM_FOLDERSUB, SC_MARK_VLINE);\n        setFoldMarker(SC_MARKNUM_FOLDERTAIL, SC_MARK_LCORNERCURVE);\n        setFoldMarker(SC_MARKNUM_FOLDEREND, SC_MARK_CIRCLEPLUSCONNECTED);\n        setFoldMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_CIRCLEMINUSCONNECTED);\n        setFoldMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_TCORNERCURVE);\n        break;\n\n    case BoxedTreeFoldStyle:\n        setFoldMarker(SC_MARKNUM_FOLDEROPEN, SC_MARK_BOXMINUS);\n        setFoldMarker(SC_MARKNUM_FOLDER, SC_MARK_BOXPLUS);\n        setFoldMarker(SC_MARKNUM_FOLDERSUB, SC_MARK_VLINE);\n        setFoldMarker(SC_MARKNUM_FOLDERTAIL, SC_MARK_LCORNER);\n        setFoldMarker(SC_MARKNUM_FOLDEREND, SC_MARK_BOXPLUSCONNECTED);\n        setFoldMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_BOXMINUSCONNECTED);\n        setFoldMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_TCORNER);\n        break;\n    }\n\n    SendScintilla(SCI_SETMARGINWIDTHN, margin, defaultFoldMarginWidth);\n}\n\n\n// Clear all current folds.\nvoid QsciScintilla::clearFolds()\n{\n    recolor();\n\n    int maxLine = SendScintilla(SCI_GETLINECOUNT);\n\n    for (int line = 0; line < maxLine; line++)\n    {\n        int level = SendScintilla(SCI_GETFOLDLEVEL, line);\n\n        if (level & SC_FOLDLEVELHEADERFLAG)\n        {\n            SendScintilla(SCI_SETFOLDEXPANDED, line, 1);\n            foldExpand(line, true, false, 0, level);\n            line--;\n        }\n    }\n}\n\n\n// Set up a folder marker.\nvoid QsciScintilla::setFoldMarker(int marknr, int mark)\n{\n    SendScintilla(SCI_MARKERDEFINE, marknr, mark);\n\n    if (mark != SC_MARK_EMPTY)\n    {\n        SendScintilla(SCI_MARKERSETFORE, marknr, QColor(Qt::white));\n        SendScintilla(SCI_MARKERSETBACK, marknr, QColor(Qt::black));\n    }\n}\n\n\n// Handle a click in the fold margin.  This is mostly taken from SciTE.\nvoid QsciScintilla::foldClick(int lineClick, int bstate)\n{\n    bool shift = bstate & Qt::ShiftModifier;\n    bool ctrl = bstate & Qt::ControlModifier;\n\n    if (shift && ctrl)\n    {\n        foldAll();\n        return;\n    }\n\n    int levelClick = SendScintilla(SCI_GETFOLDLEVEL, lineClick);\n\n    if (levelClick & SC_FOLDLEVELHEADERFLAG)\n    {\n        if (shift)\n        {\n            // Ensure all children are visible.\n            SendScintilla(SCI_SETFOLDEXPANDED, lineClick, 1);\n            foldExpand(lineClick, true, true, 100, levelClick);\n        }\n        else if (ctrl)\n        {\n            if (SendScintilla(SCI_GETFOLDEXPANDED, lineClick))\n            {\n                // Contract this line and all its children.\n                SendScintilla(SCI_SETFOLDEXPANDED, lineClick, 0L);\n                foldExpand(lineClick, false, true, 0, levelClick);\n            }\n            else\n            {\n                // Expand this line and all its children.\n                SendScintilla(SCI_SETFOLDEXPANDED, lineClick, 1);\n                foldExpand(lineClick, true, true, 100, levelClick);\n            }\n        }\n        else\n        {\n            // Toggle this line.\n            SendScintilla(SCI_TOGGLEFOLD, lineClick);\n        }\n    }\n}\n\n\n// Do the hard work of hiding and showing lines.  This is mostly taken from\n// SciTE.\nvoid QsciScintilla::foldExpand(int &line, bool doExpand, bool force,\n        int visLevels, int level)\n{\n    int lineMaxSubord = SendScintilla(SCI_GETLASTCHILD, line,\n            level & SC_FOLDLEVELNUMBERMASK);\n\n    line++;\n\n    while (line <= lineMaxSubord)\n    {\n        if (force)\n        {\n            if (visLevels > 0)\n                SendScintilla(SCI_SHOWLINES, line, line);\n            else\n                SendScintilla(SCI_HIDELINES, line, line);\n        }\n        else if (doExpand)\n            SendScintilla(SCI_SHOWLINES, line, line);\n\n        int levelLine = level;\n\n        if (levelLine == -1)\n            levelLine = SendScintilla(SCI_GETFOLDLEVEL, line);\n\n        if (levelLine & SC_FOLDLEVELHEADERFLAG)\n        {\n            if (force)\n            {\n                if (visLevels > 1)\n                    SendScintilla(SCI_SETFOLDEXPANDED, line, 1);\n                else\n                    SendScintilla(SCI_SETFOLDEXPANDED, line, 0L);\n\n                foldExpand(line, doExpand, force, visLevels - 1);\n            }\n            else if (doExpand)\n            {\n                if (!SendScintilla(SCI_GETFOLDEXPANDED, line))\n                    SendScintilla(SCI_SETFOLDEXPANDED, line, 1);\n\n                foldExpand(line, true, force, visLevels - 1);\n            }\n            else\n                foldExpand(line, false, force, visLevels - 1);\n        }\n        else\n            line++;\n    }\n}\n\n\n// Fully expand (if there is any line currently folded) all text.  Otherwise,\n// fold all text.  This is mostly taken from SciTE.\nvoid QsciScintilla::foldAll(bool children)\n{\n    recolor();\n\n    int maxLine = SendScintilla(SCI_GETLINECOUNT);\n    bool expanding = true;\n\n    for (int lineSeek = 0; lineSeek < maxLine; lineSeek++)\n    {\n        if (SendScintilla(SCI_GETFOLDLEVEL,lineSeek) & SC_FOLDLEVELHEADERFLAG)\n        {\n            expanding = !SendScintilla(SCI_GETFOLDEXPANDED, lineSeek);\n            break;\n        }\n    }\n\n    for (int line = 0; line < maxLine; line++)\n    {\n        int level = SendScintilla(SCI_GETFOLDLEVEL, line);\n\n        if (!(level & SC_FOLDLEVELHEADERFLAG))\n            continue;\n\n        if (children ||\n            (SC_FOLDLEVELBASE == (level & SC_FOLDLEVELNUMBERMASK)))\n        {\n            if (expanding)\n            {\n                SendScintilla(SCI_SETFOLDEXPANDED, line, 1);\n                foldExpand(line, true, false, 0, level);\n                line--;\n            }\n            else\n            {\n                int lineMaxSubord = SendScintilla(SCI_GETLASTCHILD, line, -1);\n\n                SendScintilla(SCI_SETFOLDEXPANDED, line, 0L);\n\n                if (lineMaxSubord > line)\n                    SendScintilla(SCI_HIDELINES, line + 1, lineMaxSubord);\n            }\n        }\n    }\n}\n\n\n// Handle a fold change.  This is mostly taken from SciTE.\nvoid QsciScintilla::foldChanged(int line,int levelNow,int levelPrev)\n{\n    if (levelNow & SC_FOLDLEVELHEADERFLAG)\n    {\n        if (!(levelPrev & SC_FOLDLEVELHEADERFLAG))\n            SendScintilla(SCI_SETFOLDEXPANDED, line, 1);\n    }\n    else if (levelPrev & SC_FOLDLEVELHEADERFLAG)\n    {\n        if (!SendScintilla(SCI_GETFOLDEXPANDED, line))\n        {\n            // Removing the fold from one that has been contracted so should\n            // expand.  Otherwise lines are left invisible with no way to make\n            // them visible.\n            foldExpand(line, true, false, 0, levelPrev);\n        }\n    }\n}\n\n\n// Toggle the fold for a line if it contains a fold marker.\nvoid QsciScintilla::foldLine(int line)\n{\n    SendScintilla(SCI_TOGGLEFOLD, line);\n}\n\n\n// Return the list of folded lines.\nQList<int> QsciScintilla::contractedFolds() const\n{\n    QList<int> folds;\n    int linenr = 0, fold_line;\n\n    while ((fold_line = SendScintilla(SCI_CONTRACTEDFOLDNEXT, linenr)) >= 0)\n    {\n        folds.append(fold_line);\n        linenr = fold_line + 1;\n    }\n\n    return folds;\n}\n\n\n// Set the fold state from a list.\nvoid QsciScintilla::setContractedFolds(const QList<int> &folds)\n{\n    for (int i = 0; i < folds.count(); ++i)\n    {\n        int line = folds[i];\n        int last_line = SendScintilla(SCI_GETLASTCHILD, line, -1);\n\n        SendScintilla(SCI_SETFOLDEXPANDED, line, 0L);\n        SendScintilla(SCI_HIDELINES, line + 1, last_line);\n    }\n}\n\n\n// Handle the SCN_MODIFIED notification.\nvoid QsciScintilla::handleModified(int pos, int mtype, const char *text,\n        int len, int added, int line, int foldNow, int foldPrev, int token,\n        int annotationLinesAdded)\n{\n    if (mtype & SC_MOD_CHANGEFOLD)\n    {\n        if (fold)\n            foldChanged(line, foldNow, foldPrev);\n    }\n\n    if (mtype & (SC_MOD_INSERTTEXT | SC_MOD_DELETETEXT))\n    {\n        emit textChanged();\n\n        if (added != 0)\n            emit linesChanged();\n    }\n}\n\n\n// Zoom in a number of points.\nvoid QsciScintilla::zoomIn(int range)\n{\n    zoomTo(SendScintilla(SCI_GETZOOM) + range);\n}\n\n\n// Zoom in a single point.\nvoid QsciScintilla::zoomIn()\n{\n    SendScintilla(SCI_ZOOMIN);\n}\n\n\n// Zoom out a number of points.\nvoid QsciScintilla::zoomOut(int range)\n{\n    zoomTo(SendScintilla(SCI_GETZOOM) - range);\n}\n\n\n// Zoom out a single point.\nvoid QsciScintilla::zoomOut()\n{\n    SendScintilla(SCI_ZOOMOUT);\n}\n\n\n// Set the zoom to a number of points.\nvoid QsciScintilla::zoomTo(int size)\n{\n    if (size < -10)\n        size = -10;\n    else if (size > 20)\n        size = 20;\n\n    SendScintilla(SCI_SETZOOM, size);\n}\n\n\n// Find the first occurrence of a string.\nbool QsciScintilla::findFirst(const QString &expr, bool re, bool cs, bool wo,\n        bool wrap, bool forward, int line, int index, bool show, bool posix)\n{\n    if (expr.isEmpty())\n    {\n        findState.status = FindState::Idle;\n        return false;\n    }\n\n    findState.status = FindState::Finding;\n    findState.expr = expr;\n    findState.wrap = wrap;\n    findState.forward = forward;\n\n    findState.flags =\n        (cs ? SCFIND_MATCHCASE : 0) |\n        (wo ? SCFIND_WHOLEWORD : 0) |\n        (re ? SCFIND_REGEXP : 0) |\n        (posix ? SCFIND_POSIX : 0);\n\n    if (line < 0 || index < 0)\n        findState.startpos = SendScintilla(SCI_GETCURRENTPOS);\n    else\n        findState.startpos = positionFromLineIndex(line, index);\n\n    if (forward)\n        findState.endpos = SendScintilla(SCI_GETLENGTH);\n    else\n        findState.endpos = 0;\n\n    findState.show = show;\n\n    return doFind();\n}\n\n\n// Find the first occurrence of a string in the current selection.\nbool QsciScintilla::findFirstInSelection(const QString &expr, bool re, bool cs,\n        bool wo, bool forward, bool show, bool posix)\n{\n    if (expr.isEmpty())\n    {\n        findState.status = FindState::Idle;\n        return false;\n    }\n\n    findState.status = FindState::FindingInSelection;\n    findState.expr = expr;\n    findState.wrap = false;\n    findState.forward = forward;\n\n    findState.flags =\n        (cs ? SCFIND_MATCHCASE : 0) |\n        (wo ? SCFIND_WHOLEWORD : 0) |\n        (re ? SCFIND_REGEXP : 0) |\n        (posix ? SCFIND_POSIX : 0);\n\n    findState.startpos_orig = SendScintilla(SCI_GETSELECTIONSTART);\n    findState.endpos_orig = SendScintilla(SCI_GETSELECTIONEND);\n\n    if (forward)\n    {\n        findState.startpos = findState.startpos_orig;\n        findState.endpos = findState.endpos_orig;\n    }\n    else\n    {\n        findState.startpos = findState.endpos_orig;\n        findState.endpos = findState.startpos_orig;\n    }\n\n    findState.show = show;\n\n    return doFind();\n}\n\n\n// Find the next occurrence of a string.\nbool QsciScintilla::findNext()\n{\n    if (findState.status == FindState::Idle)\n        return false;\n\n    return doFind();\n}\n\n\n// Do the hard work of the find methods.\nbool QsciScintilla::doFind()\n{\n    SendScintilla(SCI_SETSEARCHFLAGS, findState.flags);\n\n    int pos = simpleFind();\n\n    // See if it was found.  If not and wraparound is wanted, try again.\n    if (pos == -1 && findState.wrap)\n    {\n        if (findState.forward)\n        {\n            findState.startpos = 0;\n            findState.endpos = SendScintilla(SCI_GETLENGTH);\n        }\n        else\n        {\n            findState.startpos = SendScintilla(SCI_GETLENGTH);\n            findState.endpos = 0;\n        }\n\n        pos = simpleFind();\n    }\n\n    if (pos == -1)\n    {\n        // Restore the original selection.\n        if (findState.status == FindState::FindingInSelection)\n            SendScintilla(SCI_SETSEL, findState.startpos_orig,\n                    findState.endpos_orig);\n\n        findState.status = FindState::Idle;\n        return false;\n    }\n\n    // It was found.\n    long targstart = SendScintilla(SCI_GETTARGETSTART);\n    long targend = SendScintilla(SCI_GETTARGETEND);\n\n    // Ensure the text found is visible if required.\n    if (findState.show)\n    {\n        int startLine = SendScintilla(SCI_LINEFROMPOSITION, targstart);\n        int endLine = SendScintilla(SCI_LINEFROMPOSITION, targend);\n\n        for (int i = startLine; i <= endLine; ++i)\n            SendScintilla(SCI_ENSUREVISIBLEENFORCEPOLICY, i);\n    }\n\n    // Now set the selection.\n    SendScintilla(SCI_SETSEL, targstart, targend);\n\n    // Finally adjust the start position so that we don't find the same one\n    // again.\n    if (findState.forward)\n        findState.startpos = targend;\n    else if ((findState.startpos = targstart - 1) < 0)\n        findState.startpos = 0;\n\n    return true;\n}\n\n\n// Do a simple find between the start and end positions.\nint QsciScintilla::simpleFind()\n{\n    if (findState.startpos == findState.endpos)\n        return -1;\n\n    SendScintilla(SCI_SETTARGETSTART, findState.startpos);\n    SendScintilla(SCI_SETTARGETEND, findState.endpos);\n\n    ScintillaBytes s = textAsBytes(findState.expr);\n\n    return SendScintilla(SCI_SEARCHINTARGET, s.length(),\n            ScintillaBytesConstData(s));\n}\n\n\n// Replace the text found with the previous find method.\nvoid QsciScintilla::replace(const QString &replaceStr)\n{\n    if (findState.status == FindState::Idle)\n        return;\n\n    long start = SendScintilla(SCI_GETSELECTIONSTART);\n    long orig_len = SendScintilla(SCI_GETSELECTIONEND) - start;\n\n    SendScintilla(SCI_TARGETFROMSELECTION);\n\n    int cmd = (findState.flags & SCFIND_REGEXP) ? SCI_REPLACETARGETRE : SCI_REPLACETARGET;\n\n    ScintillaBytes s = textAsBytes(replaceStr);\n    long len = SendScintilla(cmd, -1, ScintillaBytesConstData(s));\n\n    // Reset the selection.\n    SendScintilla(SCI_SETSELECTIONSTART, start);\n    SendScintilla(SCI_SETSELECTIONEND, start + len);\n\n    // Fix the original selection.\n    findState.endpos_orig += (len - orig_len);\n\n    if (findState.forward)\n        findState.startpos = start + len;\n}\n\n\n// Query the modified state.\nbool QsciScintilla::isModified() const\n{\n    return doc.isModified();\n}\n\n\n// Set the modified state.\nvoid QsciScintilla::setModified(bool m)\n{\n    if (!m)\n        SendScintilla(SCI_SETSAVEPOINT);\n}\n\n\n// Handle the SCN_INDICATORCLICK notification.\nvoid QsciScintilla::handleIndicatorClick(int pos, int modifiers)\n{\n    int state = mapModifiers(modifiers);\n    int line, index;\n\n    lineIndexFromPosition(pos, &line, &index);\n\n    emit indicatorClicked(line, index, Qt::KeyboardModifiers(state));\n}\n\n\n// Handle the SCN_INDICATORRELEASE notification.\nvoid QsciScintilla::handleIndicatorRelease(int pos, int modifiers)\n{\n    int state = mapModifiers(modifiers);\n    int line, index;\n\n    lineIndexFromPosition(pos, &line, &index);\n\n    emit indicatorReleased(line, index, Qt::KeyboardModifiers(state));\n}\n\n\n// Handle the SCN_MARGINCLICK notification.\nvoid QsciScintilla::handleMarginClick(int pos, int modifiers, int margin)\n{\n    int state = mapModifiers(modifiers);\n    int line = SendScintilla(SCI_LINEFROMPOSITION, pos);\n\n    if (fold && margin == foldmargin)\n        foldClick(line, state);\n    else\n        emit marginClicked(margin, line, Qt::KeyboardModifiers(state));\n}\n\n\n// Handle the SCN_SAVEPOINTREACHED notification.\nvoid QsciScintilla::handleSavePointReached()\n{\n    doc.setModified(false);\n    emit modificationChanged(false);\n}\n\n\n// Handle the SCN_SAVEPOINTLEFT notification.\nvoid QsciScintilla::handleSavePointLeft()\n{\n    doc.setModified(true);\n    emit modificationChanged(true);\n}\n\n\n// Handle the QSCN_SELCHANGED signal.\nvoid QsciScintilla::handleSelectionChanged(bool yes)\n{\n    selText = yes;\n\n    emit copyAvailable(yes);\n    emit selectionChanged();\n}\n\n\n// Get the current selection.\nvoid QsciScintilla::getSelection(int *lineFrom, int *indexFrom, int *lineTo,\n        int *indexTo) const\n{\n    if (selText)\n    {\n        lineIndexFromPosition(SendScintilla(SCI_GETSELECTIONSTART), lineFrom,\n                indexFrom);\n        lineIndexFromPosition(SendScintilla(SCI_GETSELECTIONEND), lineTo,\n                indexTo);\n    }\n    else\n        *lineFrom = *indexFrom = *lineTo = *indexTo = -1;\n}\n\n\n// Sets the current selection.\nvoid QsciScintilla::setSelection(int lineFrom, int indexFrom, int lineTo,\n        int indexTo)\n{\n    SendScintilla(SCI_SETSEL, positionFromLineIndex(lineFrom, indexFrom),\n            positionFromLineIndex(lineTo, indexTo));\n}\n\n\n// Set the background colour of selected text.\nvoid QsciScintilla::setSelectionBackgroundColor(const QColor &col)\n{\n    int alpha = col.alpha();\n    \n    if (alpha == 255)\n        alpha = SC_ALPHA_NOALPHA;\n\n    SendScintilla(SCI_SETSELBACK, 1, col);\n    SendScintilla(SCI_SETSELALPHA, alpha);\n}\n\n\n// Set the foreground colour of selected text.\nvoid QsciScintilla::setSelectionForegroundColor(const QColor &col)\n{\n    SendScintilla(SCI_SETSELFORE, 1, col);\n}\n\n\n// Reset the background colour of selected text to the default.\nvoid QsciScintilla::resetSelectionBackgroundColor()\n{\n    SendScintilla(SCI_SETSELALPHA, SC_ALPHA_NOALPHA);\n    SendScintilla(SCI_SETSELBACK, 0UL);\n}\n\n\n// Reset the foreground colour of selected text to the default.\nvoid QsciScintilla::resetSelectionForegroundColor()\n{\n    SendScintilla(SCI_SETSELFORE, 0UL);\n}\n\n\n// Set the fill to the end-of-line for the selection.\nvoid QsciScintilla::setSelectionToEol(bool filled)\n{\n    SendScintilla(SCI_SETSELEOLFILLED, filled);\n}\n\n\n// Return the fill to the end-of-line for the selection.\nbool QsciScintilla::selectionToEol() const\n{\n    return SendScintilla(SCI_GETSELEOLFILLED);\n}\n\n\n// Set the width of the caret.\nvoid QsciScintilla::setCaretWidth(int width)\n{\n    SendScintilla(SCI_SETCARETWIDTH, width);\n}\n\n\n// Set the foreground colour of the caret.\nvoid QsciScintilla::setCaretForegroundColor(const QColor &col)\n{\n    SendScintilla(SCI_SETCARETFORE, col);\n}\n\n\n// Set the background colour of the line containing the caret.\nvoid QsciScintilla::setCaretLineBackgroundColor(const QColor &col)\n{\n    int alpha = col.alpha();\n\n    if (alpha == 255)\n        alpha = SC_ALPHA_NOALPHA;\n\n    SendScintilla(SCI_SETCARETLINEBACK, col);\n    SendScintilla(SCI_SETCARETLINEBACKALPHA, alpha);\n}\n\n\n// Set the state of the background colour of the line containing the caret.\nvoid QsciScintilla::setCaretLineVisible(bool enable)\n{\n    SendScintilla(SCI_SETCARETLINEVISIBLE, enable);\n}\n\n\n// Set the background colour of a hotspot area.\nvoid QsciScintilla::setHotspotBackgroundColor(const QColor &col)\n{\n    SendScintilla(SCI_SETSELBACK, 1, col);\n}\n\n\n// Set the foreground colour of a hotspot area.\nvoid QsciScintilla::setHotspotForegroundColor(const QColor &col)\n{\n    SendScintilla(SCI_SETHOTSPOTACTIVEFORE, 1, col);\n}\n\n\n// Reset the background colour of a hotspot area to the default.\nvoid QsciScintilla::resetHotspotBackgroundColor()\n{\n    SendScintilla(SCI_SETSELBACK, 0UL);\n}\n\n\n// Reset the foreground colour of a hotspot area to the default.\nvoid QsciScintilla::resetHotspotForegroundColor()\n{\n    SendScintilla(SCI_SETHOTSPOTACTIVEFORE, 0UL);\n}\n\n\n// Set the underline of a hotspot area.\nvoid QsciScintilla::setHotspotUnderline(bool enable)\n{\n    SendScintilla(SCI_SETHOTSPOTACTIVEUNDERLINE, enable);\n}\n\n\n// Set the wrapping of a hotspot area.\nvoid QsciScintilla::setHotspotWrap(bool enable)\n{\n    SendScintilla(SCI_SETHOTSPOTSINGLELINE, !enable);\n}\n\n\n// Query the read-only state.\nbool QsciScintilla::isReadOnly() const\n{\n    return SendScintilla(SCI_GETREADONLY);\n}\n\n\n// Set the read-only state.\nvoid QsciScintilla::setReadOnly(bool ro)\n{\n    setAttribute(Qt::WA_InputMethodEnabled, !ro);\n    SendScintilla(SCI_SETREADONLY, ro);\n}\n\n\n// Append the given text.\nvoid QsciScintilla::append(const QString &text)\n{\n    bool ro = ensureRW();\n\n    ScintillaBytes s = textAsBytes(text);\n    SendScintilla(SCI_APPENDTEXT, s.length(), ScintillaBytesConstData(s));\n\n    SendScintilla(SCI_EMPTYUNDOBUFFER);\n\n    setReadOnly(ro);\n}\n\n\n// Insert the given text at the current position.\nvoid QsciScintilla::insert(const QString &text)\n{\n    insertAtPos(text, -1);\n}\n\n\n// Insert the given text at the given line and offset.\nvoid QsciScintilla::insertAt(const QString &text, int line, int index)\n{\n    insertAtPos(text, positionFromLineIndex(line, index));\n}\n\n\n// Insert the given text at the given position.\nvoid QsciScintilla::insertAtPos(const QString &text, int pos)\n{\n    bool ro = ensureRW();\n\n    SendScintilla(SCI_BEGINUNDOACTION);\n    SendScintilla(SCI_INSERTTEXT, pos,\n            ScintillaBytesConstData(textAsBytes(text)));\n    SendScintilla(SCI_ENDUNDOACTION);\n\n    setReadOnly(ro);\n}\n\n\n// Begin a sequence of undoable actions.\nvoid QsciScintilla::beginUndoAction()\n{\n    SendScintilla(SCI_BEGINUNDOACTION);\n}\n\n\n// End a sequence of undoable actions.\nvoid QsciScintilla::endUndoAction()\n{\n    SendScintilla(SCI_ENDUNDOACTION);\n}\n\n\n// Redo a sequence of actions.\nvoid QsciScintilla::redo()\n{\n    SendScintilla(SCI_REDO);\n}\n\n\n// Undo a sequence of actions.\nvoid QsciScintilla::undo()\n{\n    SendScintilla(SCI_UNDO);\n}\n\n\n// See if there is something to redo.\nbool QsciScintilla::isRedoAvailable() const\n{\n    return SendScintilla(SCI_CANREDO);\n}\n\n\n// See if there is something to undo.\nbool QsciScintilla::isUndoAvailable() const\n{\n    return SendScintilla(SCI_CANUNDO);\n}\n\n\n// Return the number of lines.\nint QsciScintilla::lines() const\n{\n    return SendScintilla(SCI_GETLINECOUNT);\n}\n\n\n// Return the line at a position.\nint QsciScintilla::lineAt(const QPoint &pos) const\n{\n    long chpos = SendScintilla(SCI_POSITIONFROMPOINTCLOSE, pos.x(), pos.y());\n\n    if (chpos < 0)\n        return -1;\n\n    return SendScintilla(SCI_LINEFROMPOSITION, chpos);\n}\n\n\n// Return the length of a line.\nint QsciScintilla::lineLength(int line) const\n{\n    if (line < 0 || line >= SendScintilla(SCI_GETLINECOUNT))\n        return -1;\n\n    return SendScintilla(SCI_LINELENGTH, line);\n}\n\n\n// Return the length of the current text.\nint QsciScintilla::length() const\n{\n    return SendScintilla(SCI_GETTEXTLENGTH);\n}\n\n\n// Remove any selected text.\nvoid QsciScintilla::removeSelectedText()\n{\n    SendScintilla(SCI_REPLACESEL, \"\");\n}\n\n\n// Replace any selected text.\nvoid QsciScintilla::replaceSelectedText(const QString &text)\n{\n    SendScintilla(SCI_REPLACESEL, ScintillaBytesConstData(textAsBytes(text)));\n}\n\n\n// Return the current selected text.\nQString QsciScintilla::selectedText() const\n{\n    if (!selText)\n        return QString();\n\n    char *buf = new char[SendScintilla(SCI_GETSELECTIONEND) - SendScintilla(SCI_GETSELECTIONSTART) + 1];\n\n    SendScintilla(SCI_GETSELTEXT, buf);\n\n    QString qs = bytesAsText(buf);\n    delete[] buf;\n\n    return qs;\n}\n\n\n// Return the current text.\nQString QsciScintilla::text() const\n{\n    int buflen = length() + 1;\n    char *buf = new char[buflen];\n\n    SendScintilla(SCI_GETTEXT, buflen, buf);\n\n    QString qs = bytesAsText(buf);\n    delete[] buf;\n\n    return qs;\n}\n\n\n// Return the text of a line.\nQString QsciScintilla::text(int line) const\n{\n    int line_len = lineLength(line);\n\n    if (line_len < 1)\n        return QString();\n\n    char *buf = new char[line_len + 1];\n\n    SendScintilla(SCI_GETLINE, line, buf);\n    buf[line_len] = '\\0';\n\n    QString qs = bytesAsText(buf);\n    delete[] buf;\n\n    return qs;\n}\n\n\n// Set the given text.\nvoid QsciScintilla::setText(const QString &text)\n{\n    bool ro = ensureRW();\n\n    SendScintilla(SCI_SETTEXT, ScintillaBytesConstData(textAsBytes(text)));\n    SendScintilla(SCI_EMPTYUNDOBUFFER);\n\n    setReadOnly(ro);\n}\n\n\n// Get the cursor position\nvoid QsciScintilla::getCursorPosition(int *line, int *index) const\n{\n    lineIndexFromPosition(SendScintilla(SCI_GETCURRENTPOS), line, index);\n}\n\n\n// Set the cursor position\nvoid QsciScintilla::setCursorPosition(int line, int index)\n{\n    SendScintilla(SCI_GOTOPOS, positionFromLineIndex(line, index));\n}\n\n\n// Ensure the cursor is visible.\nvoid QsciScintilla::ensureCursorVisible()\n{\n    SendScintilla(SCI_SCROLLCARET);\n}\n\n\n// Ensure a line is visible.\nvoid QsciScintilla::ensureLineVisible(int line)\n{\n    SendScintilla(SCI_ENSUREVISIBLEENFORCEPOLICY, line);\n}\n\n\n// Copy text to the clipboard.\nvoid QsciScintilla::copy()\n{\n    SendScintilla(SCI_COPY);\n}\n\n\n// Cut text to the clipboard.\nvoid QsciScintilla::cut()\n{\n    SendScintilla(SCI_CUT);\n}\n\n\n// Paste text from the clipboard.\nvoid QsciScintilla::paste()\n{\n    SendScintilla(SCI_PASTE);\n}\n\n\n// Select all text, or deselect any selected text.\nvoid QsciScintilla::selectAll(bool select)\n{\n    if (select)\n        SendScintilla(SCI_SELECTALL);\n    else\n        SendScintilla(SCI_SETANCHOR, SendScintilla(SCI_GETCURRENTPOS));\n}\n\n\n// Delete all text.\nvoid QsciScintilla::clear()\n{\n    bool ro = ensureRW();\n\n    SendScintilla(SCI_BEGINUNDOACTION);\n    SendScintilla(SCI_CLEARALL);\n    SendScintilla(SCI_ENDUNDOACTION);\n\n    setReadOnly(ro);\n}\n\n\n// Return the indentation of a line.\nint QsciScintilla::indentation(int line) const\n{\n    return SendScintilla(SCI_GETLINEINDENTATION, line);\n}\n\n\n// Set the indentation of a line.\nvoid QsciScintilla::setIndentation(int line, int indentation)\n{\n    SendScintilla(SCI_BEGINUNDOACTION);\n    SendScintilla(SCI_SETLINEINDENTATION, line, indentation);\n    SendScintilla(SCI_ENDUNDOACTION);\n}\n\n\n// Indent a line.\nvoid QsciScintilla::indent(int line)\n{\n    setIndentation(line, indentation(line) + indentWidth());\n}\n\n\n// Unindent a line.\nvoid QsciScintilla::unindent(int line)\n{\n    int newIndent = indentation(line) - indentWidth();\n\n    if (newIndent < 0)\n        newIndent = 0;\n\n    setIndentation(line, newIndent);\n}\n\n\n// Return the indentation of the current line.\nint QsciScintilla::currentIndent() const\n{\n    return indentation(SendScintilla(SCI_LINEFROMPOSITION,\n                SendScintilla(SCI_GETCURRENTPOS)));\n}\n\n\n// Return the current indentation width.\nint QsciScintilla::indentWidth() const\n{\n    int w = indentationWidth();\n\n    if (w == 0)\n        w = tabWidth();\n\n    return w;\n}\n\n\n// Return the state of indentation guides.\nbool QsciScintilla::indentationGuides() const\n{\n    return (SendScintilla(SCI_GETINDENTATIONGUIDES) != SC_IV_NONE);\n}\n\n\n// Enable and disable indentation guides.\nvoid QsciScintilla::setIndentationGuides(bool enable)\n{\n    int iv;\n\n    if (!enable)\n        iv = SC_IV_NONE;\n    else if (lex.isNull())\n        iv = SC_IV_REAL;\n    else\n        iv = lex->indentationGuideView();\n\n    SendScintilla(SCI_SETINDENTATIONGUIDES, iv);\n}\n\n\n// Set the background colour of indentation guides.\nvoid QsciScintilla::setIndentationGuidesBackgroundColor(const QColor &col)\n{\n    SendScintilla(SCI_STYLESETBACK, STYLE_INDENTGUIDE, col);\n}\n\n\n// Set the foreground colour of indentation guides.\nvoid QsciScintilla::setIndentationGuidesForegroundColor(const QColor &col)\n{\n    SendScintilla(SCI_STYLESETFORE, STYLE_INDENTGUIDE, col);\n}\n\n\n// Return the indentation width.\nint QsciScintilla::indentationWidth() const\n{\n    return SendScintilla(SCI_GETINDENT);\n}\n\n\n// Set the indentation width.\nvoid QsciScintilla::setIndentationWidth(int width)\n{\n    SendScintilla(SCI_SETINDENT, width);\n}\n\n\n// Return the tab width.\nint QsciScintilla::tabWidth() const\n{\n    return SendScintilla(SCI_GETTABWIDTH);\n}\n\n\n// Set the tab width.\nvoid QsciScintilla::setTabWidth(int width)\n{\n    SendScintilla(SCI_SETTABWIDTH, width);\n}\n\n\n// Return the effect of the backspace key.\nbool QsciScintilla::backspaceUnindents() const\n{\n    return SendScintilla(SCI_GETBACKSPACEUNINDENTS);\n}\n\n\n// Set the effect of the backspace key.\nvoid QsciScintilla::setBackspaceUnindents(bool unindents)\n{\n    SendScintilla(SCI_SETBACKSPACEUNINDENTS, unindents);\n}\n\n\n// Return the effect of the tab key.\nbool QsciScintilla::tabIndents() const\n{\n    return SendScintilla(SCI_GETTABINDENTS);\n}\n\n\n// Set the effect of the tab key.\nvoid QsciScintilla::setTabIndents(bool indents)\n{\n    SendScintilla(SCI_SETTABINDENTS, indents);\n}\n\n\n// Return the indentation use of tabs.\nbool QsciScintilla::indentationsUseTabs() const\n{\n    return SendScintilla(SCI_GETUSETABS);\n}\n\n\n// Set the indentation use of tabs.\nvoid QsciScintilla::setIndentationsUseTabs(bool tabs)\n{\n    SendScintilla(SCI_SETUSETABS, tabs);\n}\n\n\n// Return the margin options.\nint QsciScintilla::marginOptions() const\n{\n    return SendScintilla(SCI_GETMARGINOPTIONS);\n}\n\n\n// Set the margin options.\nvoid QsciScintilla::setMarginOptions(int options)\n{\n    SendScintilla(SCI_SETMARGINOPTIONS, options);\n}\n\n\n// Return the margin type.\nQsciScintilla::MarginType QsciScintilla::marginType(int margin) const\n{\n    return (MarginType)SendScintilla(SCI_GETMARGINTYPEN, margin);\n}\n\n\n// Set the margin type.\nvoid QsciScintilla::setMarginType(int margin, QsciScintilla::MarginType type)\n{\n    SendScintilla(SCI_SETMARGINTYPEN, margin, type);\n}\n\n\n// Clear margin text.\nvoid QsciScintilla::clearMarginText(int line)\n{\n    if (line < 0)\n        SendScintilla(SCI_MARGINSETTEXT, line, (const char *)0);\n    else\n        SendScintilla(SCI_MARGINTEXTCLEARALL);\n}\n\n\n// Annotate a line.\nvoid QsciScintilla::setMarginText(int line, const QString &text, int style)\n{\n    int style_offset = SendScintilla(SCI_MARGINGETSTYLEOFFSET);\n\n    SendScintilla(SCI_MARGINSETTEXT, line,\n            ScintillaBytesConstData(textAsBytes(text)));\n\n    SendScintilla(SCI_MARGINSETSTYLE, line, style - style_offset);\n}\n\n\n// Annotate a line.\nvoid QsciScintilla::setMarginText(int line, const QString &text, const QsciStyle &style)\n{\n    style.apply(this);\n\n    setMarginText(line, text, style.style());\n}\n\n\n// Annotate a line.\nvoid QsciScintilla::setMarginText(int line, const QsciStyledText &text)\n{\n    text.apply(this);\n\n    setMarginText(line, text.text(), text.style());\n}\n\n\n// Annotate a line.\nvoid QsciScintilla::setMarginText(int line, const QList<QsciStyledText> &text)\n{\n    char *styles;\n    ScintillaBytes styled_text = styleText(text, &styles,\n            SendScintilla(SCI_MARGINGETSTYLEOFFSET));\n\n    SendScintilla(SCI_MARGINSETTEXT, line,\n            ScintillaBytesConstData(styled_text));\n    SendScintilla(SCI_MARGINSETSTYLES, line, styles);\n\n    delete[] styles;\n}\n\n\n// Return the state of line numbers in a margin.\nbool QsciScintilla::marginLineNumbers(int margin) const\n{\n    return SendScintilla(SCI_GETMARGINTYPEN, margin);\n}\n\n\n// Enable and disable line numbers in a margin.\nvoid QsciScintilla::setMarginLineNumbers(int margin, bool lnrs)\n{\n    SendScintilla(SCI_SETMARGINTYPEN, margin,\n            lnrs ? SC_MARGIN_NUMBER : SC_MARGIN_SYMBOL);\n}\n\n\n// Return the marker mask of a margin.\nint QsciScintilla::marginMarkerMask(int margin) const\n{\n    return SendScintilla(SCI_GETMARGINMASKN, margin);\n}\n\n\n// Set the marker mask of a margin.\nvoid QsciScintilla::setMarginMarkerMask(int margin,int mask)\n{\n    SendScintilla(SCI_SETMARGINMASKN, margin, mask);\n}\n\n\n// Return the state of a margin's sensitivity.\nbool QsciScintilla::marginSensitivity(int margin) const\n{\n    return SendScintilla(SCI_GETMARGINSENSITIVEN, margin);\n}\n\n\n// Enable and disable a margin's sensitivity.\nvoid QsciScintilla::setMarginSensitivity(int margin,bool sens)\n{\n    SendScintilla(SCI_SETMARGINSENSITIVEN, margin, sens);\n}\n\n\n// Return the width of a margin.\nint QsciScintilla::marginWidth(int margin) const\n{\n    return SendScintilla(SCI_GETMARGINWIDTHN, margin);\n}\n\n\n// Set the width of a margin.\nvoid QsciScintilla::setMarginWidth(int margin, int width)\n{\n    SendScintilla(SCI_SETMARGINWIDTHN, margin, width);\n}\n\n\n// Set the width of a margin to the width of some text.\nvoid QsciScintilla::setMarginWidth(int margin, const QString &s)\n{\n    int width = SendScintilla(SCI_TEXTWIDTH, STYLE_LINENUMBER,\n            ScintillaBytesConstData(textAsBytes(s)));\n\n    setMarginWidth(margin, width);\n}\n\n\n// Set the background colour of all margins.\nvoid QsciScintilla::setMarginsBackgroundColor(const QColor &col)\n{\n    handleStylePaperChange(col, STYLE_LINENUMBER);\n}\n\n\n// Set the foreground colour of all margins.\nvoid QsciScintilla::setMarginsForegroundColor(const QColor &col)\n{\n    handleStyleColorChange(col, STYLE_LINENUMBER);\n}\n\n\n// Set the font of all margins.\nvoid QsciScintilla::setMarginsFont(const QFont &f)\n{\n    setStylesFont(f, STYLE_LINENUMBER);\n}\n\n\n// Define an indicator.\nint QsciScintilla::indicatorDefine(IndicatorStyle style, int indicatorNumber)\n{\n    checkIndicator(indicatorNumber);\n\n    if (indicatorNumber >= 0)\n        SendScintilla(SCI_INDICSETSTYLE, indicatorNumber, static_cast<long>(style));\n\n    return indicatorNumber;\n}\n\n\n// Return the state of an indicator being drawn under the text.\nbool QsciScintilla::indicatorDrawUnder(int indicatorNumber) const\n{\n    if (indicatorNumber < 0 || indicatorNumber >= INDIC_MAX)\n        return false;\n\n    return SendScintilla(SCI_INDICGETUNDER, indicatorNumber);\n}\n\n\n// Set the state of indicators being drawn under the text.\nvoid QsciScintilla::setIndicatorDrawUnder(bool under, int indicatorNumber)\n{\n    if (indicatorNumber <= INDIC_MAX)\n    {\n        // We ignore allocatedIndicators to allow any indicators defined\n        // elsewhere (e.g. in lexers) to be set.\n        if (indicatorNumber < 0)\n        {\n            for (int i = 0; i <= INDIC_MAX; ++i)\n                SendScintilla(SCI_INDICSETUNDER, i, under);\n        }\n        else\n        {\n            SendScintilla(SCI_INDICSETUNDER, indicatorNumber, under);\n        }\n    }\n}\n\n\n// Set the indicator foreground colour.\nvoid QsciScintilla::setIndicatorForegroundColor(const QColor &col, int indicatorNumber)\n{\n    if (indicatorNumber <= INDIC_MAX)\n    {\n        int alpha = col.alpha();\n\n        // We ignore allocatedIndicators to allow any indicators defined\n        // elsewhere (e.g. in lexers) to be set.\n        if (indicatorNumber < 0)\n        {\n            for (int i = 0; i <= INDIC_MAX; ++i)\n            {\n                SendScintilla(SCI_INDICSETFORE, i, col);\n                SendScintilla(SCI_INDICSETALPHA, i, alpha);\n            }\n        }\n        else\n        {\n            SendScintilla(SCI_INDICSETFORE, indicatorNumber, col);\n            SendScintilla(SCI_INDICSETALPHA, indicatorNumber, alpha);\n        }\n    }\n}\n\n\n// Set the indicator outline colour.\nvoid QsciScintilla::setIndicatorOutlineColor(const QColor &col, int indicatorNumber)\n{\n    if (indicatorNumber <= INDIC_MAX)\n    {\n        int alpha = col.alpha();\n\n        // We ignore allocatedIndicators to allow any indicators defined\n        // elsewhere (e.g. in lexers) to be set.\n        if (indicatorNumber < 0)\n        {\n            for (int i = 0; i <= INDIC_MAX; ++i)\n                SendScintilla(SCI_INDICSETOUTLINEALPHA, i, alpha);\n        }\n        else\n        {\n            SendScintilla(SCI_INDICSETOUTLINEALPHA, indicatorNumber, alpha);\n        }\n    }\n}\n\n\n// Fill a range with an indicator.\nvoid QsciScintilla::fillIndicatorRange(int lineFrom, int indexFrom,\n        int lineTo, int indexTo, int indicatorNumber)\n{\n    if (indicatorNumber <= INDIC_MAX)\n    {\n        int start = positionFromLineIndex(lineFrom, indexFrom);\n        int finish = positionFromLineIndex(lineTo, indexTo);\n\n        // We ignore allocatedIndicators to allow any indicators defined\n        // elsewhere (e.g. in lexers) to be set.\n        if (indicatorNumber < 0)\n        {\n            for (int i = 0; i <= INDIC_MAX; ++i)\n            {\n                SendScintilla(SCI_SETINDICATORCURRENT, i);\n                SendScintilla(SCI_INDICATORFILLRANGE, start, finish - start);\n            }\n        }\n        else\n        {\n            SendScintilla(SCI_SETINDICATORCURRENT, indicatorNumber);\n            SendScintilla(SCI_INDICATORFILLRANGE, start, finish - start);\n        }\n    }\n}\n\n\n// Clear a range with an indicator.\nvoid QsciScintilla::clearIndicatorRange(int lineFrom, int indexFrom,\n        int lineTo, int indexTo, int indicatorNumber)\n{\n    if (indicatorNumber <= INDIC_MAX)\n    {\n        int start = positionFromLineIndex(lineFrom, indexFrom);\n        int finish = positionFromLineIndex(lineTo, indexTo);\n\n        // We ignore allocatedIndicators to allow any indicators defined\n        // elsewhere (e.g. in lexers) to be set.\n        if (indicatorNumber < 0)\n        {\n            for (int i = 0; i <= INDIC_MAX; ++i)\n            {\n                SendScintilla(SCI_SETINDICATORCURRENT, i);\n                SendScintilla(SCI_INDICATORCLEARRANGE, start, finish - start);\n            }\n        }\n        else\n        {\n            SendScintilla(SCI_SETINDICATORCURRENT, indicatorNumber);\n            SendScintilla(SCI_INDICATORCLEARRANGE, start, finish - start);\n        }\n    }\n}\n\n\n// Define a marker based on a symbol.\nint QsciScintilla::markerDefine(MarkerSymbol sym, int markerNumber)\n{\n    checkMarker(markerNumber);\n\n    if (markerNumber >= 0)\n        SendScintilla(SCI_MARKERDEFINE, markerNumber, static_cast<long>(sym));\n\n    return markerNumber;\n}\n\n\n// Define a marker based on a character.\nint QsciScintilla::markerDefine(char ch, int markerNumber)\n{\n    checkMarker(markerNumber);\n\n    if (markerNumber >= 0)\n        SendScintilla(SCI_MARKERDEFINE, markerNumber,\n                static_cast<long>(SC_MARK_CHARACTER) + ch);\n\n    return markerNumber;\n}\n\n\n// Define a marker based on a QPixmap.\nint QsciScintilla::markerDefine(const QPixmap &pm, int markerNumber)\n{\n    checkMarker(markerNumber);\n\n    if (markerNumber >= 0)\n        SendScintilla(SCI_MARKERDEFINEPIXMAP, markerNumber, pm);\n\n    return markerNumber;\n}\n\n\n// Define a marker based on a QImage.\nint QsciScintilla::markerDefine(const QImage &im, int markerNumber)\n{\n    checkMarker(markerNumber);\n\n    if (markerNumber >= 0)\n    {\n        SendScintilla(SCI_RGBAIMAGESETHEIGHT, im.height());\n        SendScintilla(SCI_RGBAIMAGESETWIDTH, im.width());\n        SendScintilla(SCI_MARKERDEFINERGBAIMAGE, markerNumber, im);\n    }\n\n    return markerNumber;\n}\n\n\n// Add a marker to a line.\nint QsciScintilla::markerAdd(int linenr, int markerNumber)\n{\n    if (markerNumber < 0 || markerNumber > MARKER_MAX || (allocatedMarkers & (1 << markerNumber)) == 0)\n        return -1;\n\n    return SendScintilla(SCI_MARKERADD, linenr, markerNumber);\n}\n\n\n// Get the marker mask for a line.\nunsigned QsciScintilla::markersAtLine(int linenr) const\n{\n    return SendScintilla(SCI_MARKERGET, linenr);\n}\n\n\n// Delete a marker from a line.\nvoid QsciScintilla::markerDelete(int linenr, int markerNumber)\n{\n    if (markerNumber <= MARKER_MAX)\n    {\n        if (markerNumber < 0)\n        {\n            unsigned am = allocatedMarkers;\n\n            for (int m = 0; m <= MARKER_MAX; ++m)\n            {\n                if (am & 1)\n                    SendScintilla(SCI_MARKERDELETE, linenr, m);\n\n                am >>= 1;\n            }\n        }\n        else if (allocatedMarkers & (1 << markerNumber))\n            SendScintilla(SCI_MARKERDELETE, linenr, markerNumber);\n    }\n}\n\n\n// Delete a marker from the text.\nvoid QsciScintilla::markerDeleteAll(int markerNumber)\n{\n    if (markerNumber <= MARKER_MAX)\n    {\n        if (markerNumber < 0)\n            SendScintilla(SCI_MARKERDELETEALL, -1);\n        else if (allocatedMarkers & (1 << markerNumber))\n            SendScintilla(SCI_MARKERDELETEALL, markerNumber);\n    }\n}\n\n\n// Delete a marker handle from the text.\nvoid QsciScintilla::markerDeleteHandle(int mhandle)\n{\n    SendScintilla(SCI_MARKERDELETEHANDLE, mhandle);\n}\n\n\n// Return the line containing a marker instance.\nint QsciScintilla::markerLine(int mhandle) const\n{\n    return SendScintilla(SCI_MARKERLINEFROMHANDLE, mhandle);\n}\n\n\n// Search forwards for a marker.\nint QsciScintilla::markerFindNext(int linenr, unsigned mask) const\n{\n    return SendScintilla(SCI_MARKERNEXT, linenr, mask);\n}\n\n\n// Search backwards for a marker.\nint QsciScintilla::markerFindPrevious(int linenr, unsigned mask) const\n{\n    return SendScintilla(SCI_MARKERPREVIOUS, linenr, mask);\n}\n\n\n// Set the marker background colour.\nvoid QsciScintilla::setMarkerBackgroundColor(const QColor &col, int markerNumber)\n{\n    if (markerNumber <= MARKER_MAX)\n    {\n        int alpha = col.alpha();\n\n        // An opaque background would make the text invisible.\n        if (alpha == 255)\n            alpha = SC_ALPHA_NOALPHA;\n\n        if (markerNumber < 0)\n        {\n            unsigned am = allocatedMarkers;\n\n            for (int m = 0; m <= MARKER_MAX; ++m)\n            {\n                if (am & 1)\n                {\n                    SendScintilla(SCI_MARKERSETBACK, m, col);\n                    SendScintilla(SCI_MARKERSETALPHA, m, alpha);\n                }\n\n                am >>= 1;\n            }\n        }\n        else if (allocatedMarkers & (1 << markerNumber))\n        {\n            SendScintilla(SCI_MARKERSETBACK, markerNumber, col);\n            SendScintilla(SCI_MARKERSETALPHA, markerNumber, alpha);\n        }\n    }\n}\n\n\n// Set the marker foreground colour.\nvoid QsciScintilla::setMarkerForegroundColor(const QColor &col, int markerNumber)\n{\n    if (markerNumber <= MARKER_MAX)\n    {\n        if (markerNumber < 0)\n        {\n            unsigned am = allocatedMarkers;\n\n            for (int m = 0; m <= MARKER_MAX; ++m)\n            {\n                if (am & 1)\n                    SendScintilla(SCI_MARKERSETFORE, m, col);\n\n                am >>= 1;\n            }\n        }\n        else if (allocatedMarkers & (1 << markerNumber))\n        {\n            SendScintilla(SCI_MARKERSETFORE, markerNumber, col);\n        }\n    }\n}\n\n\n// Check a marker, allocating a marker number if necessary.\nvoid QsciScintilla::checkMarker(int &markerNumber)\n{\n    allocateId(markerNumber, allocatedMarkers, 0, MARKER_MAX);\n}\n\n\n// Check an indicator, allocating an indicator number if necessary.\nvoid QsciScintilla::checkIndicator(int &indicatorNumber)\n{\n    allocateId(indicatorNumber, allocatedIndicators, INDIC_CONTAINER,\n            INDIC_MAX);\n}\n\n\n// Make sure an identifier is valid and allocate it if necessary.\nvoid QsciScintilla::allocateId(int &id, unsigned &allocated, int min, int max)\n{\n    if (id >= 0)\n    {\n        // Note that we allow existing identifiers to be explicitly redefined.\n        if (id > max)\n            id = -1;\n    }\n    else\n    {\n        unsigned aids = allocated >> min;\n\n        // Find the smallest unallocated identifier.\n        for (id = min; id <= max; ++id)\n        {\n            if ((aids & 1) == 0)\n                break;\n\n            aids >>= 1;\n        }\n    }\n\n    // Allocate the identifier if it is valid.\n    if (id >= 0)\n        allocated |= (1 << id);\n}\n\n\n// Reset the fold margin colours.\nvoid QsciScintilla::resetFoldMarginColors()\n{\n    SendScintilla(SCI_SETFOLDMARGINHICOLOUR, 0, 0L);\n    SendScintilla(SCI_SETFOLDMARGINCOLOUR, 0, 0L);\n}\n\n\n// Set the fold margin colours.\nvoid QsciScintilla::setFoldMarginColors(const QColor &fore, const QColor &back)\n{\n    SendScintilla(SCI_SETFOLDMARGINHICOLOUR, 1, fore);\n    SendScintilla(SCI_SETFOLDMARGINCOLOUR, 1, back);\n}\n\n\n// Set the call tips background colour.\nvoid QsciScintilla::setCallTipsBackgroundColor(const QColor &col)\n{\n    SendScintilla(SCI_CALLTIPSETBACK, col);\n}\n\n\n// Set the call tips foreground colour.\nvoid QsciScintilla::setCallTipsForegroundColor(const QColor &col)\n{\n    SendScintilla(SCI_CALLTIPSETFORE, col);\n}\n\n\n// Set the call tips highlight colour.\nvoid QsciScintilla::setCallTipsHighlightColor(const QColor &col)\n{\n    SendScintilla(SCI_CALLTIPSETFOREHLT, col);\n}\n\n\n// Set the matched brace background colour.\nvoid QsciScintilla::setMatchedBraceBackgroundColor(const QColor &col)\n{\n    SendScintilla(SCI_STYLESETBACK, STYLE_BRACELIGHT, col);\n}\n\n\n// Set the matched brace foreground colour.\nvoid QsciScintilla::setMatchedBraceForegroundColor(const QColor &col)\n{\n    SendScintilla(SCI_STYLESETFORE, STYLE_BRACELIGHT, col);\n}\n\n\n// Set the matched brace indicator.\nvoid QsciScintilla::setMatchedBraceIndicator(int indicatorNumber)\n{\n    SendScintilla(SCI_BRACEHIGHLIGHTINDICATOR, 1, indicatorNumber);\n}\n\n\n// Reset the matched brace indicator.\nvoid QsciScintilla::resetMatchedBraceIndicator()\n{\n    SendScintilla(SCI_BRACEHIGHLIGHTINDICATOR, 0, 0L);\n}\n\n\n// Set the unmatched brace background colour.\nvoid QsciScintilla::setUnmatchedBraceBackgroundColor(const QColor &col)\n{\n    SendScintilla(SCI_STYLESETBACK, STYLE_BRACEBAD, col);\n}\n\n\n// Set the unmatched brace foreground colour.\nvoid QsciScintilla::setUnmatchedBraceForegroundColor(const QColor &col)\n{\n    SendScintilla(SCI_STYLESETFORE, STYLE_BRACEBAD, col);\n}\n\n\n// Set the unmatched brace indicator.\nvoid QsciScintilla::setUnmatchedBraceIndicator(int indicatorNumber)\n{\n    SendScintilla(SCI_BRACEBADLIGHTINDICATOR, 1, indicatorNumber);\n}\n\n\n// Reset the unmatched brace indicator.\nvoid QsciScintilla::resetUnmatchedBraceIndicator()\n{\n    SendScintilla(SCI_BRACEBADLIGHTINDICATOR, 0, 0L);\n}\n\n\n// Detach any lexer.\nvoid QsciScintilla::detachLexer()\n{\n    if (!lex.isNull())\n    {\n        lex->setEditor(0);\n        lex->disconnect(this);\n\n        SendScintilla(SCI_STYLERESETDEFAULT);\n        SendScintilla(SCI_STYLECLEARALL);\n        SendScintilla(SCI_CLEARDOCUMENTSTYLE);\n    }\n}\n\n\n// Set the lexer.\nvoid QsciScintilla::setLexer(QsciLexer *lexer)\n{\n    // Detach any current lexer.\n    detachLexer();\n\n    // Connect up the new lexer.\n    lex = lexer;\n\n    if (lex)\n    {\n        if (lex->lexer())\n            SendScintilla(SCI_SETLEXERLANGUAGE, lex->lexer());\n        else\n            SendScintilla(SCI_SETLEXER, lex->lexerId());\n\n        lex->setEditor(this);\n\n        connect(lex,SIGNAL(colorChanged(const QColor &, int)),\n                SLOT(handleStyleColorChange(const QColor &, int)));\n        connect(lex,SIGNAL(eolFillChanged(bool, int)),\n                SLOT(handleStyleEolFillChange(bool, int)));\n        connect(lex,SIGNAL(fontChanged(const QFont &, int)),\n                SLOT(handleStyleFontChange(const QFont &, int)));\n        connect(lex,SIGNAL(paperChanged(const QColor &, int)),\n                SLOT(handleStylePaperChange(const QColor &, int)));\n        connect(lex,SIGNAL(propertyChanged(const char *, const char *)),\n                SLOT(handlePropertyChange(const char *, const char *)));\n\n        SendScintilla(SCI_SETPROPERTY, \"fold\", \"1\");\n        SendScintilla(SCI_SETPROPERTY, \"fold.html\", \"1\");\n\n        // Set the keywords.  Scintilla allows for sets numbered 0 to\n        // KEYWORDSET_MAX (although the lexers only seem to exploit 0 to\n        // KEYWORDSET_MAX - 1).  We number from 1 in line with SciTE's property\n        // files.\n        for (int k = 0; k <= KEYWORDSET_MAX; ++k)\n        {\n            const char *kw = lex -> keywords(k + 1);\n\n            if (!kw)\n                kw = \"\";\n\n            SendScintilla(SCI_SETKEYWORDS, k, kw);\n        }\n\n        // Initialise each style.  Do the default first so its (possibly\n        // incorrect) font setting gets reset when style 0 is set.\n        setLexerStyle(STYLE_DEFAULT);\n\n        int nrStyles = 1 << SendScintilla(SCI_GETSTYLEBITS);\n\n        for (int s = 0; s < nrStyles; ++s)\n            if (!lex->description(s).isNull())\n                setLexerStyle(s);\n\n        // Initialise the properties.\n        lex->refreshProperties();\n\n        // Set the auto-completion fillups and word separators.\n        setAutoCompletionFillupsEnabled(fillups_enabled);\n        wseps = lex->autoCompletionWordSeparators();\n\n        wchars = lex->wordCharacters();\n\n        if (!wchars)\n            wchars = defaultWordChars;\n\n        SendScintilla(SCI_AUTOCSETIGNORECASE, !lex->caseSensitive());\n\n        recolor();\n    }\n    else\n    {\n        SendScintilla(SCI_SETLEXER, SCLEX_CONTAINER);\n\n        setColor(nl_text_colour);\n        setPaper(nl_paper_colour);\n\n        SendScintilla(SCI_AUTOCSETFILLUPS, \"\");\n        SendScintilla(SCI_AUTOCSETIGNORECASE, false);\n        wseps.clear();\n        wchars = defaultWordChars;\n    }\n}\n\n\n// Set a particular style of the current lexer.\nvoid QsciScintilla::setLexerStyle(int style)\n{\n    handleStyleColorChange(lex->color(style), style);\n    handleStyleEolFillChange(lex->eolFill(style), style);\n    handleStyleFontChange(lex->font(style), style);\n    handleStylePaperChange(lex->paper(style), style);\n}\n\n\n// Get the current lexer.\nQsciLexer *QsciScintilla::lexer() const\n{\n    return lex;\n}\n\n\n// Handle a change in lexer style foreground colour.\nvoid QsciScintilla::handleStyleColorChange(const QColor &c, int style)\n{\n    SendScintilla(SCI_STYLESETFORE, style, c);\n}\n\n\n// Handle a change in lexer style end-of-line fill.\nvoid QsciScintilla::handleStyleEolFillChange(bool eolfill, int style)\n{\n    SendScintilla(SCI_STYLESETEOLFILLED, style, eolfill);\n}\n\n\n// Handle a change in lexer style font.\nvoid QsciScintilla::handleStyleFontChange(const QFont &f, int style)\n{\n    setStylesFont(f, style);\n\n    if (style == lex->braceStyle())\n    {\n        setStylesFont(f, STYLE_BRACELIGHT);\n        setStylesFont(f, STYLE_BRACEBAD);\n    }\n}\n\n\n// Set the font for a style.\nvoid QsciScintilla::setStylesFont(const QFont &f, int style)\n{\n    SendScintilla(SCI_STYLESETFONT, style, f.family().toLatin1().data());\n    SendScintilla(SCI_STYLESETSIZEFRACTIONAL, style,\n            long(f.pointSizeF() * SC_FONT_SIZE_MULTIPLIER));\n\n    // Pass the Qt weight via the back door.\n    SendScintilla(SCI_STYLESETWEIGHT, style, -f.weight());\n\n    SendScintilla(SCI_STYLESETITALIC, style, f.italic());\n    SendScintilla(SCI_STYLESETUNDERLINE, style, f.underline());\n\n    // Tie the font settings of the default style to that of style 0 (the style\n    // conventionally used for whitespace by lexers).  This is needed so that\n    // fold marks, indentations, edge columns etc are set properly.\n    if (style == 0)\n        setStylesFont(f, STYLE_DEFAULT);\n}\n\n\n// Handle a change in lexer style background colour.\nvoid QsciScintilla::handleStylePaperChange(const QColor &c, int style)\n{\n    SendScintilla(SCI_STYLESETBACK, style, c);\n}\n\n\n// Handle a change in lexer property.\nvoid QsciScintilla::handlePropertyChange(const char *prop, const char *val)\n{\n    SendScintilla(SCI_SETPROPERTY, prop, val);\n}\n\n\n// Handle a change to the user visible user interface.\nvoid QsciScintilla::handleUpdateUI(int)\n{\n    int newPos = SendScintilla(SCI_GETCURRENTPOS);\n\n    if (newPos != oldPos)\n    {\n        oldPos = newPos;\n\n        int line = SendScintilla(SCI_LINEFROMPOSITION, newPos);\n        int col = SendScintilla(SCI_GETCOLUMN, newPos);\n\n        emit cursorPositionChanged(line, col);\n    }\n\n    if (braceMode != NoBraceMatch)\n        braceMatch();\n}\n\n\n// Handle brace matching.\nvoid QsciScintilla::braceMatch()\n{\n    long braceAtCaret, braceOpposite;\n\n    findMatchingBrace(braceAtCaret, braceOpposite, braceMode);\n\n    if (braceAtCaret >= 0 && braceOpposite < 0)\n    {\n        SendScintilla(SCI_BRACEBADLIGHT, braceAtCaret);\n        SendScintilla(SCI_SETHIGHLIGHTGUIDE, 0UL);\n    }\n    else\n    {\n        char chBrace = SendScintilla(SCI_GETCHARAT, braceAtCaret);\n\n        SendScintilla(SCI_BRACEHIGHLIGHT, braceAtCaret, braceOpposite);\n\n        long columnAtCaret = SendScintilla(SCI_GETCOLUMN, braceAtCaret);\n        long columnOpposite = SendScintilla(SCI_GETCOLUMN, braceOpposite);\n\n        if (chBrace == ':')\n        {\n            long lineStart = SendScintilla(SCI_LINEFROMPOSITION, braceAtCaret);\n            long indentPos = SendScintilla(SCI_GETLINEINDENTPOSITION,\n                    lineStart);\n            long indentPosNext = SendScintilla(SCI_GETLINEINDENTPOSITION,\n                    lineStart + 1);\n\n            columnAtCaret = SendScintilla(SCI_GETCOLUMN, indentPos);\n\n            long columnAtCaretNext = SendScintilla(SCI_GETCOLUMN,\n                    indentPosNext);\n            long indentSize = SendScintilla(SCI_GETINDENT);\n\n            if (columnAtCaretNext - indentSize > 1)\n                columnAtCaret = columnAtCaretNext - indentSize;\n\n            if (columnOpposite == 0)\n                columnOpposite = columnAtCaret;\n        }\n\n        long column = columnAtCaret;\n\n        if (column > columnOpposite)\n            column = columnOpposite;\n\n        SendScintilla(SCI_SETHIGHLIGHTGUIDE, column);\n    }\n}\n\n\n// Check if the character at a position is a brace.\nlong QsciScintilla::checkBrace(long pos, int brace_style, bool &colonMode)\n{\n    long brace_pos = -1;\n    char ch = SendScintilla(SCI_GETCHARAT, pos);\n\n    if (ch == ':')\n    {\n        // A bit of a hack, we should really use a virtual.\n        if (!lex.isNull() && qstrcmp(lex->lexer(), \"python\") == 0)\n        {\n            brace_pos = pos;\n            colonMode = true;\n        }\n    }\n    else if (ch && strchr(\"[](){}<>\", ch))\n    {\n        if (brace_style < 0)\n            brace_pos = pos;\n        else\n        {\n            int style = SendScintilla(SCI_GETSTYLEAT, pos) & 0x1f;\n\n            if (style == brace_style)\n                brace_pos = pos;\n        }\n    }\n\n    return brace_pos;\n}\n\n\n// Find a brace and it's match.  Return true if the current position is inside\n// a pair of braces.\nbool QsciScintilla::findMatchingBrace(long &brace, long &other,BraceMatch mode)\n{\n    bool colonMode = false;\n    int brace_style = (lex.isNull() ? -1 : lex->braceStyle());\n\n    brace = -1;\n    other = -1;\n\n    long caretPos = SendScintilla(SCI_GETCURRENTPOS);\n\n    if (caretPos > 0)\n        brace = checkBrace(caretPos - 1, brace_style, colonMode);\n\n    bool isInside = false;\n\n    if (brace < 0 && mode == SloppyBraceMatch)\n    {\n        brace = checkBrace(caretPos, brace_style, colonMode);\n\n        if (brace >= 0 && !colonMode)\n            isInside = true;\n    }\n\n    if (brace >= 0)\n    {\n        if (colonMode)\n        {\n            // Find the end of the Python indented block.\n            long lineStart = SendScintilla(SCI_LINEFROMPOSITION, brace);\n            long lineMaxSubord = SendScintilla(SCI_GETLASTCHILD, lineStart, -1);\n\n            other = SendScintilla(SCI_GETLINEENDPOSITION, lineMaxSubord);\n        }\n        else\n            other = SendScintilla(SCI_BRACEMATCH, brace);\n\n        if (other > brace)\n            isInside = !isInside;\n    }\n\n    return isInside;\n}\n\n\n// Move to the matching brace.\nvoid QsciScintilla::moveToMatchingBrace()\n{\n    gotoMatchingBrace(false);\n}\n\n\n// Select to the matching brace.\nvoid QsciScintilla::selectToMatchingBrace()\n{\n    gotoMatchingBrace(true);\n}\n\n\n// Move to the matching brace and optionally select the text.\nvoid QsciScintilla::gotoMatchingBrace(bool select)\n{\n    long braceAtCaret;\n    long braceOpposite;\n\n    bool isInside = findMatchingBrace(braceAtCaret, braceOpposite,\n            SloppyBraceMatch);\n\n    if (braceOpposite >= 0)\n    {\n        // Convert the character positions into caret positions based on\n        // whether the caret position was inside or outside the braces.\n        if (isInside)\n        {\n            if (braceOpposite > braceAtCaret)\n                braceAtCaret++;\n            else\n                braceOpposite++;\n        }\n        else\n        {\n            if (braceOpposite > braceAtCaret)\n                braceOpposite++;\n            else\n                braceAtCaret++;\n        }\n\n        ensureLineVisible(SendScintilla(SCI_LINEFROMPOSITION, braceOpposite));\n\n        if (select)\n            SendScintilla(SCI_SETSEL, braceAtCaret, braceOpposite);\n        else\n            SendScintilla(SCI_SETSEL, braceOpposite, braceOpposite);\n    }\n}\n\n\n// Return a position from a line number and an index within the line.\nint QsciScintilla::positionFromLineIndex(int line, int index) const\n{\n    int pos = SendScintilla(SCI_POSITIONFROMLINE, line);\n\n    // Allow for multi-byte characters.\n    for(int i = 0; i < index; i++)\n        pos = SendScintilla(SCI_POSITIONAFTER, pos);\n\n    return pos;\n}\n\n\n// Return a line number and an index within the line from a position.\nvoid QsciScintilla::lineIndexFromPosition(int position, int *line, int *index) const\n{\n    int lin = SendScintilla(SCI_LINEFROMPOSITION, position);\n    int linpos = SendScintilla(SCI_POSITIONFROMLINE, lin);\n    int indx = 0;\n\n    // Allow for multi-byte characters.\n    while (linpos < position)\n    {\n        int new_linpos = SendScintilla(SCI_POSITIONAFTER, linpos);\n\n        // If the position hasn't moved then we must be at the end of the text\n        // (which implies that the position passed was beyond the end of the\n        // text).\n        if (new_linpos == linpos)\n            break;\n\n        linpos = new_linpos;\n        ++indx;\n    }\n\n    *line = lin;\n    *index = indx;\n}\n\n\n// Set the source of the automatic auto-completion list.\nvoid QsciScintilla::setAutoCompletionSource(AutoCompletionSource source)\n{\n    acSource = source;\n}\n\n\n// Set the threshold for automatic auto-completion.\nvoid QsciScintilla::setAutoCompletionThreshold(int thresh)\n{\n    acThresh = thresh;\n}\n\n\n// Set the auto-completion word separators if there is no current lexer.\nvoid QsciScintilla::setAutoCompletionWordSeparators(const QStringList &separators)\n{\n    if (lex.isNull())\n        wseps = separators;\n}\n\n\n// Explicitly auto-complete from all sources.\nvoid QsciScintilla::autoCompleteFromAll()\n{\n    startAutoCompletion(AcsAll, false, use_single != AcusNever);\n}\n\n\n// Explicitly auto-complete from the APIs.\nvoid QsciScintilla::autoCompleteFromAPIs()\n{\n    startAutoCompletion(AcsAPIs, false, use_single != AcusNever);\n}\n\n\n// Explicitly auto-complete from the document.\nvoid QsciScintilla::autoCompleteFromDocument()\n{\n    startAutoCompletion(AcsDocument, false, use_single != AcusNever);\n}\n\n\n// Check if a character can be in a word.\nbool QsciScintilla::isWordCharacter(char ch) const\n{\n    return (strchr(wchars, ch) != NULL);\n}\n\n\n// Return the set of valid word characters.\nconst char *QsciScintilla::wordCharacters() const\n{\n    return wchars;\n}\n\n\n// Recolour the document.\nvoid QsciScintilla::recolor(int start, int end)\n{\n    SendScintilla(SCI_COLOURISE, start, end);\n}\n\n\n// Registered a QPixmap image.\nvoid QsciScintilla::registerImage(int id, const QPixmap &pm)\n{\n    SendScintilla(SCI_REGISTERIMAGE, id, pm);\n}\n\n\n// Registered a QImage image.\nvoid QsciScintilla::registerImage(int id, const QImage &im)\n{\n    SendScintilla(SCI_RGBAIMAGESETHEIGHT, im.height());\n    SendScintilla(SCI_RGBAIMAGESETWIDTH, im.width());\n    SendScintilla(SCI_REGISTERRGBAIMAGE, id, im);\n}\n\n\n// Clear all registered images.\nvoid QsciScintilla::clearRegisteredImages()\n{\n    SendScintilla(SCI_CLEARREGISTEREDIMAGES);\n}\n\n\n// Enable auto-completion fill-ups.\nvoid QsciScintilla::setAutoCompletionFillupsEnabled(bool enable)\n{\n    const char *fillups;\n\n    if (!enable)\n        fillups = \"\";\n    else if (!lex.isNull())\n        fillups = lex->autoCompletionFillups();\n    else\n        fillups = explicit_fillups.data();\n\n    SendScintilla(SCI_AUTOCSETFILLUPS, fillups);\n\n    fillups_enabled = enable;\n}\n\n\n// See if auto-completion fill-ups are enabled.\nbool QsciScintilla::autoCompletionFillupsEnabled() const\n{\n    return fillups_enabled;\n}\n\n\n// Set the fill-up characters for auto-completion if there is no current lexer.\nvoid QsciScintilla::setAutoCompletionFillups(const char *fillups)\n{\n    explicit_fillups = fillups;\n    setAutoCompletionFillupsEnabled(fillups_enabled);\n}\n\n\n// Set the case sensitivity for auto-completion.\nvoid QsciScintilla::setAutoCompletionCaseSensitivity(bool cs)\n{\n    SendScintilla(SCI_AUTOCSETIGNORECASE, !cs);\n}\n\n\n// Return the case sensitivity for auto-completion.\nbool QsciScintilla::autoCompletionCaseSensitivity() const\n{\n    return !SendScintilla(SCI_AUTOCGETIGNORECASE);\n}\n\n\n// Set the replace word mode for auto-completion.\nvoid QsciScintilla::setAutoCompletionReplaceWord(bool replace)\n{\n    SendScintilla(SCI_AUTOCSETDROPRESTOFWORD, replace);\n}\n\n\n// Return the replace word mode for auto-completion.\nbool QsciScintilla::autoCompletionReplaceWord() const\n{\n    return SendScintilla(SCI_AUTOCGETDROPRESTOFWORD);\n}\n\n\n// Set the single item mode for auto-completion.\nvoid QsciScintilla::setAutoCompletionUseSingle(AutoCompletionUseSingle single)\n{\n    use_single = single;\n}\n\n\n// Return the single item mode for auto-completion.\nQsciScintilla::AutoCompletionUseSingle QsciScintilla::autoCompletionUseSingle() const\n{\n    return use_single;\n}\n\n\n// Set the single item mode for auto-completion (deprecated).\nvoid QsciScintilla::setAutoCompletionShowSingle(bool single)\n{\n    use_single = (single ? AcusExplicit : AcusNever);\n}\n\n\n// Return the single item mode for auto-completion (deprecated).\nbool QsciScintilla::autoCompletionShowSingle() const\n{\n    return (use_single != AcusNever);\n}\n\n\n// Set current call tip position.\nvoid QsciScintilla::setCallTipsPosition(CallTipsPosition position)\n{\n    SendScintilla(SCI_CALLTIPSETPOSITION, (position == CallTipsAboveText));\n    call_tips_position = position;\n}\n\n\n// Set current call tip style.\nvoid QsciScintilla::setCallTipsStyle(CallTipsStyle style)\n{\n    call_tips_style = style;\n}\n\n\n// Set maximum number of call tips displayed.\nvoid QsciScintilla::setCallTipsVisible(int nr)\n{\n    maxCallTips = nr;\n}\n\n\n// Set the document to display.\nvoid QsciScintilla::setDocument(const QsciDocument &document)\n{\n    if (doc.pdoc != document.pdoc)\n    {\n        doc.undisplay(this);\n        doc.attach(document);\n        doc.display(this,&document);\n    }\n}\n\n\n// Ensure the document is read-write and return true if was was read-only.\nbool QsciScintilla::ensureRW()\n{\n    bool ro = isReadOnly();\n\n    if (ro)\n        setReadOnly(false);\n\n    return ro;\n}\n\n\n// Return the number of the first visible line.\nint QsciScintilla::firstVisibleLine() const\n{\n    return SendScintilla(SCI_GETFIRSTVISIBLELINE);\n}\n\n\n// Set the number of the first visible line.\nvoid QsciScintilla::setFirstVisibleLine(int linenr)\n{\n    SendScintilla(SCI_SETFIRSTVISIBLELINE, linenr);\n}\n\n\n// Return the height in pixels of the text in a particular line.\nint QsciScintilla::textHeight(int linenr) const\n{\n    return SendScintilla(SCI_TEXTHEIGHT, linenr);\n}\n\n\n// See if auto-completion or user list is active.\nbool QsciScintilla::isListActive() const\n{\n    return SendScintilla(SCI_AUTOCACTIVE);\n}\n\n\n// Cancel any current auto-completion or user list.\nvoid QsciScintilla::cancelList()\n{\n    SendScintilla(SCI_AUTOCCANCEL);\n}\n\n\n// Handle a selection from the auto-completion list.\nvoid QsciScintilla::handleAutoCompletionSelection()\n{\n    if (!lex.isNull())\n    {\n        QsciAbstractAPIs *apis = lex->apis();\n\n        if (apis)\n            apis->autoCompletionSelected(acSelection);\n    }\n}\n\n\n// Display a user list.\nvoid QsciScintilla::showUserList(int id, const QStringList &list)\n{\n    // Sanity check to make sure auto-completion doesn't get confused.\n    if (id <= 0)\n        return;\n\n    SendScintilla(SCI_AUTOCSETSEPARATOR, userSeparator);\n\n    ScintillaBytes s = textAsBytes(list.join(QChar(userSeparator)));\n    SendScintilla(SCI_USERLISTSHOW, id, ScintillaBytesConstData(s));\n}\n\n\n// Translate the SCN_USERLISTSELECTION notification into something more useful.\nvoid QsciScintilla::handleUserListSelection(const char *text, int id)\n{\n    emit userListActivated(id, QString(text));\n\n    // Make sure the editor hasn't been deactivated as a side effect.\n    activateWindow();\n}\n\n\n// Return the case sensitivity of any lexer.\nbool QsciScintilla::caseSensitive() const\n{\n    return lex.isNull() ? true : lex->caseSensitive();\n}\n\n\n// Return true if the current list is an auto-completion list rather than a\n// user list.\nbool QsciScintilla::isAutoCompletionList() const\n{\n    return (SendScintilla(SCI_AUTOCGETSEPARATOR) == acSeparator);\n}\n\n\n// Read the text from a QIODevice.\nbool QsciScintilla::read(QIODevice *io)\n{\n    const int min_size = 1024 * 8;\n\n    int buf_size = min_size;\n    char *buf = new char[buf_size];\n\n    int data_len = 0;\n    bool ok = true;\n\n    qint64 part;\n\n    // Read the whole lot in so we don't have to worry about character\n    // boundaries.\n    do\n    {\n        // Make sure there is a minimum amount of room.\n        if (buf_size - data_len < min_size)\n        {\n            buf_size *= 2;\n            char *new_buf = new char[buf_size * 2];\n\n            memcpy(new_buf, buf, data_len);\n            delete[] buf;\n            buf = new_buf;\n        }\n\n        part = io->read(buf + data_len, buf_size - data_len - 1);\n\n        data_len += part;\n    }\n    while (part > 0);\n\n    if (part < 0)\n        ok = false;\n    else\n    {\n        buf[data_len] = '\\0';\n\n        bool ro = ensureRW();\n\n        SendScintilla(SCI_SETTEXT, buf);\n        SendScintilla(SCI_EMPTYUNDOBUFFER);\n\n        setReadOnly(ro);\n    }\n\n    delete[] buf;\n\n    return ok;\n}\n\n\n// Write the text to a QIODevice.\nbool QsciScintilla::write(QIODevice *io) const\n{\n    const char *buf = reinterpret_cast<const char *>(SendScintillaPtrResult(SCI_GETCHARACTERPOINTER));\n\n    const char *bp = buf;\n    uint buflen = qstrlen(buf);\n\n    while (buflen > 0)\n    {\n        qint64 part = io->write(bp, buflen);\n\n        if (part < 0)\n            return false;\n\n        bp += part;\n        buflen -= part;\n    }\n\n    return true;\n}\n\n\n// Return the word at the given coordinates.\nQString QsciScintilla::wordAtLineIndex(int line, int index) const\n{\n    return wordAtPosition(positionFromLineIndex(line, index));\n}\n\n\n// Return the word at the given coordinates.\nQString QsciScintilla::wordAtPoint(const QPoint &point) const\n{\n    long close_pos = SendScintilla(SCI_POSITIONFROMPOINTCLOSE, point.x(),\n            point.y());\n\n    return wordAtPosition(close_pos);\n}\n\n\n// Return the word at the given position.\nQString QsciScintilla::wordAtPosition(int position) const\n{\n    if (position < 0)\n        return QString();\n\n    long start_pos = SendScintilla(SCI_WORDSTARTPOSITION, position, true);\n    long end_pos = SendScintilla(SCI_WORDENDPOSITION, position, true);\n    int word_len = end_pos - start_pos;\n\n    if (word_len <= 0)\n        return QString();\n\n    char *buf = new char[word_len + 1];\n    SendScintilla(SCI_GETTEXTRANGE, start_pos, end_pos, buf);\n    QString word = bytesAsText(buf);\n    delete[] buf;\n\n    return word;\n}\n\n\n// Return the display style for annotations.\nQsciScintilla::AnnotationDisplay QsciScintilla::annotationDisplay() const\n{\n    return (AnnotationDisplay)SendScintilla(SCI_ANNOTATIONGETVISIBLE);\n}\n\n\n// Set the display style for annotations.\nvoid QsciScintilla::setAnnotationDisplay(QsciScintilla::AnnotationDisplay display)\n{\n    SendScintilla(SCI_ANNOTATIONSETVISIBLE, display);\n    setScrollBars();\n}\n\n\n// Clear annotations.\nvoid QsciScintilla::clearAnnotations(int line)\n{\n    if (line >= 0)\n        SendScintilla(SCI_ANNOTATIONSETTEXT, line, (const char *)0);\n    else\n        SendScintilla(SCI_ANNOTATIONCLEARALL);\n\n    setScrollBars();\n}\n\n\n// Annotate a line.\nvoid QsciScintilla::annotate(int line, const QString &text, int style)\n{\n    int style_offset = SendScintilla(SCI_ANNOTATIONGETSTYLEOFFSET);\n\n    ScintillaBytes s = textAsBytes(text);\n\n    SendScintilla(SCI_ANNOTATIONSETTEXT, line, ScintillaBytesConstData(s));\n    SendScintilla(SCI_ANNOTATIONSETSTYLE, line, style - style_offset);\n\n    setScrollBars();\n}\n\n\n// Annotate a line.\nvoid QsciScintilla::annotate(int line, const QString &text, const QsciStyle &style)\n{\n    style.apply(this);\n\n    annotate(line, text, style.style());\n}\n\n\n// Annotate a line.\nvoid QsciScintilla::annotate(int line, const QsciStyledText &text)\n{\n    text.apply(this);\n\n    annotate(line, text.text(), text.style());\n}\n\n\n// Annotate a line.\nvoid QsciScintilla::annotate(int line, const QList<QsciStyledText> &text)\n{\n    char *styles;\n    ScintillaBytes styled_text = styleText(text, &styles,\n            SendScintilla(SCI_ANNOTATIONGETSTYLEOFFSET));\n\n    SendScintilla(SCI_ANNOTATIONSETTEXT, line,\n            ScintillaBytesConstData(styled_text));\n    SendScintilla(SCI_ANNOTATIONSETSTYLES, line, styles);\n\n    delete[] styles;\n}\n\n\n// Get the annotation for a line, if any.\nQString QsciScintilla::annotation(int line) const\n{\n    char *buf = new char[SendScintilla(SCI_ANNOTATIONGETTEXT, line, (const char *)0) + 1];\n\n    buf[SendScintilla(SCI_ANNOTATIONGETTEXT, line, buf)] = '\\0';\n\n    QString qs = bytesAsText(buf);\n    delete[] buf;\n\n    return qs;\n}\n\n\n// Convert a list of styled text to the low-level arrays.\nQsciScintillaBase::ScintillaBytes QsciScintilla::styleText(const QList<QsciStyledText> &styled_text, char **styles, int style_offset)\n{\n    QString text;\n    int i;\n\n    // Build the full text.\n    for (i = 0; i < styled_text.count(); ++i)\n    {\n        const QsciStyledText &st = styled_text[i];\n\n        st.apply(this);\n\n        text.append(st.text());\n    }\n\n    ScintillaBytes s = textAsBytes(text);\n\n    // There is a style byte for every byte.\n    char *sp = *styles = new char[s.length()];\n\n    for (i = 0; i < styled_text.count(); ++i)\n    {\n        const QsciStyledText &st = styled_text[i];\n        ScintillaBytes part = textAsBytes(st.text());\n        int part_length = part.length();\n\n        for (int c = 0; c < part_length; ++c)\n            *sp++ = (char)(st.style() - style_offset);\n    }\n\n    return s;\n}\n\n\n// Convert Scintilla modifiers to the Qt equivalent.\nint QsciScintilla::mapModifiers(int modifiers)\n{\n    int state = 0;\n\n    if (modifiers & SCMOD_SHIFT)\n        state |= Qt::ShiftModifier;\n\n    if (modifiers & SCMOD_CTRL)\n        state |= Qt::ControlModifier;\n\n    if (modifiers & SCMOD_ALT)\n        state |= Qt::AltModifier;\n\n    if (modifiers & (SCMOD_SUPER | SCMOD_META))\n        state |= Qt::MetaModifier;\n\n    return state;\n}\n\n\n// We no longer add features to the Qt3 version if it is a hassle.\n\n// Re-implemented to handle shortcut overrides.\nbool QsciScintilla::event(QEvent *e)\n{\n    if (e->type() == QEvent::ShortcutOverride && !isReadOnly())\n    {\n        QKeyEvent *ke = static_cast<QKeyEvent *>(e);\n\n        if (ke->key())\n        {\n            // We want ordinary characters.\n            if ((ke->modifiers() == Qt::NoModifier || ke->modifiers() == Qt::ShiftModifier || ke->modifiers() == Qt::KeypadModifier) && ke->key() < Qt::Key_Escape)\n            {\n                ke->accept();\n                return true;\n            }\n\n            // We want any key that is bound.\n            QsciCommand *cmd = stdCmds->boundTo(ke->key() | ke->modifiers());\n\n            if (cmd)\n            {\n                ke->accept();\n                return true;\n            }\n        }\n    }\n\n    return QsciScintillaBase::event(e);\n}\n\n\n// Re-implemented to handle chenges to the enabled state.\nvoid QsciScintilla::changeEvent(QEvent *e)\n{\n    QsciScintillaBase::changeEvent(e);\n\n    if (e->type() != QEvent::EnabledChange)\n        return;\n\n    if (isEnabled())\n        SendScintilla(SCI_SETCARETSTYLE, CARETSTYLE_LINE);\n    else\n        SendScintilla(SCI_SETCARETSTYLE, CARETSTYLE_INVISIBLE);\n\n    QColor fore = palette().color(QPalette::Disabled, QPalette::Text);\n    QColor back = palette().color(QPalette::Disabled, QPalette::Base);\n\n    if (lex.isNull())\n    {\n        if (isEnabled())\n        {\n            fore = nl_text_colour;\n            back = nl_paper_colour;\n        }\n\n        SendScintilla(SCI_STYLESETFORE, 0, fore);\n\n        // Assume style 0 applies to everything so that we don't need to use\n        // SCI_STYLECLEARALL which clears everything.  We still have to set the\n        // default style as well for the background without any text.\n        SendScintilla(SCI_STYLESETBACK, 0, back);\n        SendScintilla(SCI_STYLESETBACK, STYLE_DEFAULT, back);\n    }\n    else\n    {\n        setEnabledColors(STYLE_DEFAULT, fore, back);\n\n        int nrStyles = 1 << SendScintilla(SCI_GETSTYLEBITS);\n\n        for (int s = 0; s < nrStyles; ++s)\n            if (!lex->description(s).isNull())\n                setEnabledColors(s, fore, back);\n    }\n}\n\n\n// Set the foreground and background colours for a style.\nvoid QsciScintilla::setEnabledColors(int style, QColor &fore, QColor &back)\n{\n    if (isEnabled())\n    {\n        fore = lex->color(style);\n        back = lex->paper(style);\n    }\n\n    handleStyleColorChange(fore, style);\n    handleStylePaperChange(back, style);\n}\n\n\n// Re-implemented to implement a more Qt-like context menu.\nvoid QsciScintilla::contextMenuEvent(QContextMenuEvent *e)\n{\n    QMenu *menu = createStandardContextMenu();\n\n    if (menu)\n    {\n        menu->setAttribute(Qt::WA_DeleteOnClose);\n        menu->popup(e->globalPos());\n    }\n}\n\n\n// Create an instance of the standard context menu.\nQMenu *QsciScintilla::createStandardContextMenu()\n{\n    bool read_only = isReadOnly();\n    bool has_selection = hasSelectedText();\n    QMenu *menu = new QMenu(this);\n    QAction *action;\n\n    if (!read_only)\n    {\n        action = menu->addAction(tr(\"&Undo\"), this, SLOT(undo()));\n        set_shortcut(action, QsciCommand::Undo);\n        action->setEnabled(isUndoAvailable());\n\n        action = menu->addAction(tr(\"&Redo\"), this, SLOT(redo()));\n        set_shortcut(action, QsciCommand::Redo);\n        action->setEnabled(isRedoAvailable());\n\n        menu->addSeparator();\n\n        action = menu->addAction(tr(\"Cu&t\"), this, SLOT(cut()));\n        set_shortcut(action, QsciCommand::SelectionCut);\n        action->setEnabled(has_selection);\n    }\n\n    action = menu->addAction(tr(\"&Copy\"), this, SLOT(copy()));\n    set_shortcut(action, QsciCommand::SelectionCopy);\n    action->setEnabled(has_selection);\n\n    if (!read_only)\n    {\n        action = menu->addAction(tr(\"&Paste\"), this, SLOT(paste()));\n        set_shortcut(action, QsciCommand::Paste);\n        action->setEnabled(SendScintilla(SCI_CANPASTE));\n\n        action = menu->addAction(tr(\"Delete\"), this, SLOT(delete_selection()));\n        action->setEnabled(has_selection);\n    }\n\n    if (!menu->isEmpty())\n        menu->addSeparator();\n\n    action = menu->addAction(tr(\"Select All\"), this, SLOT(selectAll()));\n    set_shortcut(action, QsciCommand::SelectAll);\n    action->setEnabled(length() != 0);\n\n    return menu;\n}\n\n\n// Set the shortcut for an action using any current key binding.\nvoid QsciScintilla::set_shortcut(QAction *action, QsciCommand::Command cmd_id) const\n{\n    QsciCommand *cmd = stdCmds->find(cmd_id);\n\n    if (cmd && cmd->key())\n        action->setShortcut(QKeySequence(cmd->key()));\n}\n\n\n// Delete the current selection.\nvoid QsciScintilla::delete_selection()\n{\n    SendScintilla(SCI_CLEAR);\n}\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintillabase.cpp",
    "content": "// This module implements the \"official\" low-level API.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qsciscintillabase.h\"\n\n#include <qapplication.h>\n#include <qclipboard.h>\n#include <qcolor.h>\n#include <qscrollbar.h>\n#include <qtextcodec.h>\n\n#include <QContextMenuEvent>\n#include <QDragEnterEvent>\n#include <QDragMoveEvent>\n#include <QDropEvent>\n#include <QDragLeaveEvent>\n#include <QFocusEvent>\n#include <QKeyEvent>\n#include <QList>\n#include <QMimeData>\n#include <QMouseEvent>\n#include <QPaintEvent>\n#include <QStyle>\n\n#include \"ScintillaQt.h\"\n\n\n// The #defines in Scintilla.h and the enums in qsciscintillabase.h conflict\n// (because we want to use the same names) so we have to undefine those we use\n// in this file.\n#undef  SCI_SETCARETPERIOD\n#undef  SCK_DOWN\n#undef  SCK_UP\n#undef  SCK_LEFT\n#undef  SCK_RIGHT\n#undef  SCK_HOME\n#undef  SCK_END\n#undef  SCK_PRIOR\n#undef  SCK_NEXT\n#undef  SCK_DELETE\n#undef  SCK_INSERT\n#undef  SCK_ESCAPE\n#undef  SCK_BACK\n#undef  SCK_TAB\n#undef  SCK_RETURN\n#undef  SCK_ADD\n#undef  SCK_SUBTRACT\n#undef  SCK_DIVIDE\n#undef  SCK_WIN\n#undef  SCK_RWIN\n#undef  SCK_MENU\n\n\n// Remember if we have linked the lexers.\nstatic bool lexersLinked = false;\n\n// The list of instances.\nstatic QList<QsciScintillaBase *> poolList;\n\n// Mime support.\nstatic const QLatin1String mimeTextPlain(\"text/plain\");\nstatic const QLatin1String mimeRectangularWin(\"MSDEVColumnSelect\");\nstatic const QLatin1String mimeRectangular(\"text/x-qscintilla-rectangular\");\n\n#if (QT_VERSION >= 0x040200 && QT_VERSION < 0x050000 && defined(Q_OS_MAC)) || (QT_VERSION >= 0x050200 && defined(Q_OS_OSX))\nextern void initialiseRectangularPasteboardMime();\n#endif\n\n\n// The ctor.\nQsciScintillaBase::QsciScintillaBase(QWidget *parent)\n    : QAbstractScrollArea(parent), preeditPos(-1), preeditNrBytes(0)\n#if QT_VERSION >= 0x050000\n        , clickCausedFocus(false)\n#endif\n{\n    connect(verticalScrollBar(), SIGNAL(valueChanged(int)),\n            SLOT(handleVSb(int)));\n\n    connect(horizontalScrollBar(), SIGNAL(valueChanged(int)),\n            SLOT(handleHSb(int)));\n\n    setAcceptDrops(true);\n    setFocusPolicy(Qt::WheelFocus);\n    setAttribute(Qt::WA_KeyCompression);\n    setAttribute(Qt::WA_InputMethodEnabled);\n#if QT_VERSION >= 0x050100\n    setInputMethodHints(\n            Qt::ImhNoAutoUppercase|Qt::ImhNoPredictiveText|Qt::ImhMultiLine);\n#elif QT_VERSION >= 0x040600\n    setInputMethodHints(Qt::ImhNoAutoUppercase|Qt::ImhNoPredictiveText);\n#endif\n\n    viewport()->setBackgroundRole(QPalette::Base);\n    viewport()->setMouseTracking(true);\n    viewport()->setAttribute(Qt::WA_NoSystemBackground);\n\n    triple_click.setSingleShot(true);\n\n#if (QT_VERSION >= 0x040200 && QT_VERSION < 0x050000 && defined(Q_OS_MAC)) || (QT_VERSION >= 0x050200 && defined(Q_OS_OSX))\n    initialiseRectangularPasteboardMime();\n#endif\n\n    sci = new QsciScintillaQt(this);\n\n    SendScintilla(SCI_SETCARETPERIOD, QApplication::cursorFlashTime() / 2);\n\n    // Make sure the lexers are linked in.\n    if (!lexersLinked)\n    {\n        Scintilla_LinkLexers();\n        lexersLinked = true;\n    }\n\n    QClipboard *cb = QApplication::clipboard();\n\n    if (cb->supportsSelection())\n        connect(cb, SIGNAL(selectionChanged()), SLOT(handleSelection()));\n\n    // Add it to the pool.\n    poolList.append(this);\n}\n\n\n// The dtor.\nQsciScintillaBase::~QsciScintillaBase()\n{\n    // Remove it from the pool.\n    poolList.removeAt(poolList.indexOf(this));\n\n    delete sci;\n}\n\n\n// Return an instance from the pool.\nQsciScintillaBase *QsciScintillaBase::pool()\n{\n    return poolList.first();\n}\n\n\n// Tell Scintilla to update the scroll bars.  Scintilla should be doing this\n// itself.\nvoid QsciScintillaBase::setScrollBars()\n{\n    sci->SetScrollBars();\n}\n\n\n// Send a message to the real Scintilla widget using the low level Scintilla\n// API.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, unsigned long wParam,\n        long lParam) const\n{\n    return sci->WndProc(msg, wParam, lParam);\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, unsigned long wParam,\n        void *lParam) const\n{\n    return sci->WndProc(msg, wParam, reinterpret_cast<sptr_t>(lParam));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, unsigned long wParam,\n        const char *lParam) const\n{\n    return sci->WndProc(msg, wParam, reinterpret_cast<sptr_t>(lParam));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg,\n        const char *lParam) const\n{\n    return sci->WndProc(msg, static_cast<uptr_t>(0),\n            reinterpret_cast<sptr_t>(lParam));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, const char *wParam,\n        const char *lParam) const\n{\n    return sci->WndProc(msg, reinterpret_cast<uptr_t>(wParam),\n            reinterpret_cast<sptr_t>(lParam));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, long wParam) const\n{\n    return sci->WndProc(msg, static_cast<uptr_t>(wParam),\n            static_cast<sptr_t>(0));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, int wParam) const\n{\n    return sci->WndProc(msg, static_cast<uptr_t>(wParam),\n            static_cast<sptr_t>(0));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, long cpMin, long cpMax,\n        char *lpstrText) const\n{\n    QSCI_SCI_NAMESPACE(TextRange) tr;\n\n    tr.chrg.cpMin = cpMin;\n    tr.chrg.cpMax = cpMax;\n    tr.lpstrText = lpstrText;\n\n    return sci->WndProc(msg, static_cast<uptr_t>(0),\n            reinterpret_cast<sptr_t>(&tr));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, unsigned long wParam,\n        const QColor &col) const\n{\n    sptr_t lParam = (col.blue() << 16) | (col.green() << 8) | col.red();\n\n    return sci->WndProc(msg, wParam, lParam);\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, const QColor &col) const\n{\n    uptr_t wParam = (col.blue() << 16) | (col.green() << 8) | col.red();\n\n    return sci->WndProc(msg, wParam, static_cast<sptr_t>(0));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, unsigned long wParam,\n        QPainter *hdc, const QRect &rc, long cpMin, long cpMax) const\n{\n    QSCI_SCI_NAMESPACE(RangeToFormat) rf;\n\n    rf.hdc = rf.hdcTarget = reinterpret_cast<QSCI_SCI_NAMESPACE(SurfaceID)>(hdc);\n\n    rf.rc.left = rc.left();\n    rf.rc.top = rc.top();\n    rf.rc.right = rc.right() + 1;\n    rf.rc.bottom = rc.bottom() + 1;\n\n    rf.chrg.cpMin = cpMin;\n    rf.chrg.cpMax = cpMax;\n\n    return sci->WndProc(msg, wParam, reinterpret_cast<sptr_t>(&rf));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, unsigned long wParam,\n        const QPixmap &lParam) const\n{\n    return sci->WndProc(msg, wParam, reinterpret_cast<sptr_t>(&lParam));\n}\n\n\n// Overloaded message send.\nlong QsciScintillaBase::SendScintilla(unsigned int msg, unsigned long wParam,\n        const QImage &lParam) const\n{\n    return sci->WndProc(msg, wParam, reinterpret_cast<sptr_t>(&lParam));\n}\n\n\n// Send a message to the real Scintilla widget using the low level Scintilla\n// API that returns a pointer result.\nvoid *QsciScintillaBase::SendScintillaPtrResult(unsigned int msg) const\n{\n    return reinterpret_cast<void *>(sci->WndProc(msg, static_cast<uptr_t>(0),\n            static_cast<sptr_t>(0)));\n}\n\n\n// Handle the timer on behalf of the QsciScintillaQt instance.\nvoid QsciScintillaBase::handleTimer()\n{\n    sci->Tick();\n}\n\n\n// Re-implemented to handle the context menu.\nvoid QsciScintillaBase::contextMenuEvent(QContextMenuEvent *e)\n{\n    sci->ContextMenu(QSCI_SCI_NAMESPACE(Point)(e->globalX(), e->globalY()));\n}\n\n\n// Re-implemented to tell the widget it has the focus.\nvoid QsciScintillaBase::focusInEvent(QFocusEvent *e)\n{\n    sci->SetFocusState(true);\n\n#if QT_VERSION >= 0x050000\n    clickCausedFocus = (e->reason() == Qt::MouseFocusReason);\n#endif\n\n    QAbstractScrollArea::focusInEvent(e);\n}\n\n\n// Re-implemented to tell the widget it has lost the focus.\nvoid QsciScintillaBase::focusOutEvent(QFocusEvent *e)\n{\n    // Only tell Scintilla we have lost focus if the new active window isn't\n    // our auto-completion list.  This is probably only an issue on Linux and\n    // there are still problems because subsequent focus out events don't\n    // always seem to get generated (at least with Qt5).\n\n//    if (e->reason() == Qt::ActiveWindowFocusReason)\n    {\n        QWidget *aw = QApplication::activeWindow();\n\n        if (!aw || aw->parent() != this || !aw->inherits(\"QsciSciListBox\"))\n            sci->SetFocusState(false);\n    }\n\n    QAbstractScrollArea::focusOutEvent(e);\n}\n\n\n// Re-implemented to make sure tabs are passed to the editor.\nbool QsciScintillaBase::focusNextPrevChild(bool next)\n{\n    if (!sci->pdoc->IsReadOnly())\n        return false;\n\n    return QAbstractScrollArea::focusNextPrevChild(next);\n}\n\n\n// Handle the selection changing.\nvoid QsciScintillaBase::handleSelection()\n{\n    if (!QApplication::clipboard()->ownsSelection())\n        sci->UnclaimSelection();\n}\n\n\n// Handle key presses.\nvoid QsciScintillaBase::keyPressEvent(QKeyEvent *e)\n{\n    int modifiers = 0;\n\n    if (e->modifiers() & Qt::ShiftModifier)\n        modifiers |= SCMOD_SHIFT;\n\n    if (e->modifiers() & Qt::ControlModifier)\n        modifiers |= SCMOD_CTRL;\n\n    if (e->modifiers() & Qt::AltModifier)\n        modifiers |= SCMOD_ALT;\n\n    if (e->modifiers() & Qt::MetaModifier)\n        modifiers |= SCMOD_META;\n\n    int key = commandKey(e->key(), modifiers);\n\n    if (key)\n    {\n        bool consumed = false;\n\n        sci->KeyDownWithModifiers(key, modifiers, &consumed);\n\n        if (consumed)\n        {\n            e->accept();\n            return;\n        }\n    }\n\n    QString text = e->text();\n\n    if (!text.isEmpty() && text[0].isPrint())\n    {\n        ScintillaBytes bytes = textAsBytes(text);\n        sci->AddCharUTF(bytes.data(), bytes.length());\n        e->accept();\n    }\n    else\n    {\n        QAbstractScrollArea::keyPressEvent(e);\n    }\n}\n\n\n// Map a Qt key to a valid Scintilla command key, or 0 if none.\nint QsciScintillaBase::commandKey(int qt_key, int &modifiers)\n{\n    int key;\n\n    switch (qt_key)\n    {\n    case Qt::Key_Down:\n        key = SCK_DOWN;\n        break;\n\n    case Qt::Key_Up:\n        key = SCK_UP;\n        break;\n\n    case Qt::Key_Left:\n        key = SCK_LEFT;\n        break;\n\n    case Qt::Key_Right:\n        key = SCK_RIGHT;\n        break;\n\n    case Qt::Key_Home:\n        key = SCK_HOME;\n        break;\n\n    case Qt::Key_End:\n        key = SCK_END;\n        break;\n\n    case Qt::Key_PageUp:\n        key = SCK_PRIOR;\n        break;\n\n    case Qt::Key_PageDown:\n        key = SCK_NEXT;\n        break;\n\n    case Qt::Key_Delete:\n        key = SCK_DELETE;\n        break;\n\n    case Qt::Key_Insert:\n        key = SCK_INSERT;\n        break;\n\n    case Qt::Key_Escape:\n        key = SCK_ESCAPE;\n        break;\n\n    case Qt::Key_Backspace:\n        key = SCK_BACK;\n        break;\n\n    case Qt::Key_Tab:\n        key = SCK_TAB;\n        break;\n\n    case Qt::Key_Backtab:\n        // Scintilla assumes a backtab is shift-tab.\n        key = SCK_TAB;\n        modifiers |= SCMOD_SHIFT;\n        break;\n\n    case Qt::Key_Return:\n    case Qt::Key_Enter:\n        key = SCK_RETURN;\n        break;\n\n    case Qt::Key_Super_L:\n        key = SCK_WIN;\n        break;\n\n    case Qt::Key_Super_R:\n        key = SCK_RWIN;\n        break;\n\n    case Qt::Key_Menu:\n        key = SCK_MENU;\n        break;\n\n    default:\n        if ((key = qt_key) > 0x7f)\n            key = 0;\n    }\n\n    return key;\n}\n\n\n// Encode a QString as bytes.\nQsciScintillaBase::ScintillaBytes QsciScintillaBase::textAsBytes(const QString &text) const\n{\n    if (sci->IsUnicodeMode())\n        return text.toUtf8();\n\n    return text.toLatin1();\n}\n\n\n// Decode bytes as a QString.\nQString QsciScintillaBase::bytesAsText(const char *bytes) const\n{\n    if (sci->IsUnicodeMode())\n        return QString::fromUtf8(bytes);\n\n    return QString::fromLatin1(bytes);\n}\n\n\n// Handle a mouse button double click.\nvoid QsciScintillaBase::mouseDoubleClickEvent(QMouseEvent *e)\n{\n    if (e->button() != Qt::LeftButton)\n    {\n        e->ignore();\n        return;\n    }\n\n    setFocus();\n\n    // Make sure Scintilla will interpret this as a double-click.\n    unsigned clickTime = sci->lastClickTime + QSCI_SCI_NAMESPACE(Platform)::DoubleClickTime() - 1;\n\n    bool shift = e->modifiers() & Qt::ShiftModifier;\n    bool ctrl = e->modifiers() & Qt::ControlModifier;\n    bool alt = e->modifiers() & Qt::AltModifier;\n\n    sci->ButtonDown(QSCI_SCI_NAMESPACE(Point)(e->x(), e->y()), clickTime,\n            shift, ctrl, alt);\n\n    // Remember the current position and time in case it turns into a triple\n    // click.\n    triple_click_at = e->globalPos();\n    triple_click.start(QApplication::doubleClickInterval());\n}\n\n\n// Handle a mouse move.\nvoid QsciScintillaBase::mouseMoveEvent(QMouseEvent *e)\n{\n    sci->ButtonMove(QSCI_SCI_NAMESPACE(Point)(e->x(), e->y()));\n}\n\n\n// Handle a mouse button press.\nvoid QsciScintillaBase::mousePressEvent(QMouseEvent *e)\n{\n    setFocus();\n\n    QSCI_SCI_NAMESPACE(Point) pt(e->x(), e->y());\n\n    if (e->button() == Qt::LeftButton)\n    {\n        unsigned clickTime;\n\n        // It is a triple click if the timer is running and the mouse hasn't\n        // moved too much.\n        if (triple_click.isActive() && (e->globalPos() - triple_click_at).manhattanLength() < QApplication::startDragDistance())\n            clickTime = sci->lastClickTime + QSCI_SCI_NAMESPACE(Platform)::DoubleClickTime() - 1;\n        else\n            clickTime = sci->lastClickTime + QSCI_SCI_NAMESPACE(Platform)::DoubleClickTime() + 1;\n\n        triple_click.stop();\n\n        // Scintilla uses the Alt modifier to initiate rectangular selection.\n        // However the GTK port (under X11, not Windows) uses the Control\n        // modifier (by default, although it is configurable).  It does this\n        // because most X11 window managers hijack Alt-drag to move the window.\n        // We do the same, except that (for the moment at least) we don't allow\n        // the modifier to be configured.\n        bool shift = e->modifiers() & Qt::ShiftModifier;\n        bool ctrl = e->modifiers() & Qt::ControlModifier;\n#if defined(Q_OS_MAC) || defined(Q_OS_WIN)\n        bool alt = e->modifiers() & Qt::AltModifier;\n#else\n        bool alt = ctrl;\n#endif\n\n        sci->ButtonDown(pt, clickTime, shift, ctrl, alt);\n    }\n    else if (e->button() == Qt::MidButton)\n    {\n        QClipboard *cb = QApplication::clipboard();\n\n        if (cb->supportsSelection())\n        {\n            int pos = sci->PositionFromLocation(pt);\n\n            sci->sel.Clear();\n            sci->SetSelection(pos, pos);\n\n            sci->pasteFromClipboard(QClipboard::Selection);\n        }\n    }\n}\n\n\n// Handle a mouse button releases.\nvoid QsciScintillaBase::mouseReleaseEvent(QMouseEvent *e)\n{\n    if (e->button() != Qt::LeftButton)\n        return;\n\n    QSCI_SCI_NAMESPACE(Point) pt(e->x(), e->y());\n\n    if (sci->HaveMouseCapture())\n    {\n        bool ctrl = e->modifiers() & Qt::ControlModifier;\n\n        sci->ButtonUp(pt, 0, ctrl);\n    }\n\n#if QT_VERSION >= 0x050000\n    if (!sci->pdoc->IsReadOnly() && !sci->PointInSelMargin(pt) && qApp->autoSipEnabled())\n    {\n        QStyle::RequestSoftwareInputPanel rsip = QStyle::RequestSoftwareInputPanel(style()->styleHint(QStyle::SH_RequestSoftwareInputPanel));\n\n        if (!clickCausedFocus || rsip == QStyle::RSIP_OnMouseClick)\n            qApp->inputMethod()->show();\n    }\n\n    clickCausedFocus = false;\n#endif\n}\n\n\n// Handle paint events.\nvoid QsciScintillaBase::paintEvent(QPaintEvent *e)\n{\n    sci->paintEvent(e);\n}\n\n\n// Handle resize events.\nvoid QsciScintillaBase::resizeEvent(QResizeEvent *)\n{\n    sci->ChangeSize();\n}\n\n\n// Re-implemented to suppress the default behaviour as Scintilla works at a\n// more fundamental level.\nvoid QsciScintillaBase::scrollContentsBy(int, int)\n{\n}\n\n\n// Handle the vertical scrollbar.\nvoid QsciScintillaBase::handleVSb(int value)\n{\n    sci->ScrollTo(value);\n}\n\n\n// Handle the horizontal scrollbar.\nvoid QsciScintillaBase::handleHSb(int value)\n{\n    sci->HorizontalScrollTo(value);\n}\n\n\n// Handle drag enters.\nvoid QsciScintillaBase::dragEnterEvent(QDragEnterEvent *e)\n{\n    QsciScintillaBase::dragMoveEvent(e);\n}\n\n\n// Handle drag leaves.\nvoid QsciScintillaBase::dragLeaveEvent(QDragLeaveEvent *)\n{\n    sci->SetDragPosition(QSCI_SCI_NAMESPACE(SelectionPosition)());\n}\n\n\n// Handle drag moves.\nvoid QsciScintillaBase::dragMoveEvent(QDragMoveEvent *e)\n{\n    sci->SetDragPosition(\n            sci->SPositionFromLocation(\n                    QSCI_SCI_NAMESPACE(Point)(e->pos().x(), e->pos().y()),\n                    false, false, sci->UserVirtualSpace()));\n\n    acceptAction(e);\n}\n\n\n// Handle drops.\nvoid QsciScintillaBase::dropEvent(QDropEvent *e)\n{\n    bool moving;\n    int len;\n    const char *s;\n    bool rectangular;\n\n    acceptAction(e);\n\n    if (!e->isAccepted())\n        return;\n\n    moving = (e->dropAction() == Qt::MoveAction);\n\n    QByteArray text = fromMimeData(e->mimeData(), rectangular);\n    len = text.length();\n    s = text.data();\n\n    std::string dest = QSCI_SCI_NAMESPACE(Document)::TransformLineEnds(s, len,\n                sci->pdoc->eolMode);\n\n    sci->DropAt(sci->posDrop, dest.c_str(), dest.length(), moving,\n            rectangular);\n\n    sci->Redraw();\n}\n\n\nvoid QsciScintillaBase::acceptAction(QDropEvent *e)\n{\n    if (sci->pdoc->IsReadOnly() || !canInsertFromMimeData(e->mimeData()))\n        e->ignore();\n    else\n        e->acceptProposedAction();\n}\n\n\n\n// See if a MIME data object can be decoded.\nbool QsciScintillaBase::canInsertFromMimeData(const QMimeData *source) const\n{\n    return source->hasFormat(mimeTextPlain);\n}\n\n\n// Create text from a MIME data object.\nQByteArray QsciScintillaBase::fromMimeData(const QMimeData *source, bool &rectangular) const\n{\n    // See if it is rectangular.  We try all of the different formats that\n    // Scintilla supports in case we are working across different platforms.\n    if (source->hasFormat(mimeRectangularWin))\n        rectangular = true;\n    else if (source->hasFormat(mimeRectangular))\n        rectangular = true;\n    else\n        rectangular = false;\n\n    // Note that we don't support Scintilla's hack of adding a '\\0' as Qt\n    // strips it off under the covers when pasting from another process.\n    QString utf8 = source->text();\n    QByteArray text;\n\n    if (sci->IsUnicodeMode())\n        text = utf8.toUtf8();\n    else\n        text = utf8.toLatin1();\n\n    return text;\n}\n\n\n// Create a MIME data object for some text.\nQMimeData *QsciScintillaBase::toMimeData(const QByteArray &text, bool rectangular) const\n{\n    QMimeData *mime = new QMimeData;\n\n    QString utf8;\n\n    if (sci->IsUnicodeMode())\n        utf8 = QString::fromUtf8(text.constData(), text.size());\n    else\n        utf8 = QString::fromLatin1(text.constData(), text.size());\n\n    mime->setText(utf8);\n\n    if (rectangular)\n    {\n        // Use the platform specific \"standard\" for specifying a rectangular\n        // selection.\n#if defined(Q_OS_WIN)\n        mime->setData(mimeRectangularWin, QByteArray());\n#else\n        mime->setData(mimeRectangular, QByteArray());\n#endif\n    }\n\n    return mime;\n}\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscistyle.cpp",
    "content": "// This module implements the QsciStyle class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscistyle.h\"\n\n#include <qapplication.h>\n\n#include \"Qsci/qsciscintillabase.h\"\n\n\n// A ctor.\nQsciStyle::QsciStyle(int style)\n{\n    init(style);\n\n    QPalette pal = QApplication::palette();\n    setColor(pal.text().color());\n    setPaper(pal.base().color());\n\n    setFont(QApplication::font());\n    setEolFill(false);\n}\n\n\n// A ctor.\nQsciStyle::QsciStyle(int style, const QString &description,\n        const QColor &color, const QColor &paper, const QFont &font,\n        bool eolFill)\n{\n    init(style);\n\n    setDescription(description);\n\n    setColor(color);\n    setPaper(paper);\n\n    setFont(font);\n    setEolFill(eolFill);\n}\n\n\n// Initialisation common to all ctors.\nvoid QsciStyle::init(int style)\n{\n    // The next style number to allocate.  The initial values corresponds to\n    // the amount of space that Scintilla initially creates for styles.\n    static int next_style_nr = 63;\n\n    // See if a new style should be allocated.  Note that we allow styles to be\n    // passed in that are bigger than STYLE_MAX because the styles used for\n    // annotations are allowed to be.\n    if (style < 0)\n    {\n        // Note that we don't deal with the situation where the newly allocated\n        // style number has already been used explicitly.\n        if (next_style_nr > QsciScintillaBase::STYLE_LASTPREDEFINED)\n            style = next_style_nr--;\n    }\n\n    style_nr = style;\n\n    // Initialise the minor attributes.\n    setTextCase(QsciStyle::OriginalCase);\n    setVisible(true);\n    setChangeable(true);\n    setHotspot(false);\n}\n\n\n// Apply the style to a particular editor.\nvoid QsciStyle::apply(QsciScintillaBase *sci) const\n{\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETFORE, style_nr,\n            style_color);\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETBACK, style_nr,\n            style_paper);\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETFONT, style_nr,\n            style_font.family().toLatin1().data());\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETSIZEFRACTIONAL, style_nr,\n            long(style_font.pointSizeF() * QsciScintillaBase::SC_FONT_SIZE_MULTIPLIER));\n\n    // Pass the Qt weight via the back door.\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETWEIGHT, style_nr,\n            -style_font.weight());\n\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETITALIC, style_nr,\n            style_font.italic());\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETUNDERLINE, style_nr,\n            style_font.underline());\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETEOLFILLED, style_nr,\n            style_eol_fill);\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETCASE, style_nr,\n            (long)style_case);\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETVISIBLE, style_nr,\n            style_visible);\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETCHANGEABLE, style_nr,\n            style_changeable);\n    sci->SendScintilla(QsciScintillaBase::SCI_STYLESETHOTSPOT, style_nr,\n            style_hotspot);\n}\n\n\n// Set the color attribute.\nvoid QsciStyle::setColor(const QColor &color)\n{\n    style_color = color;\n}\n\n\n// Set the paper attribute.\nvoid QsciStyle::setPaper(const QColor &paper)\n{\n    style_paper = paper;\n}\n\n\n// Set the font attribute.\nvoid QsciStyle::setFont(const QFont &font)\n{\n    style_font = font;\n}\n\n\n// Set the eol fill attribute.\nvoid QsciStyle::setEolFill(bool eolFill)\n{\n    style_eol_fill = eolFill;\n}\n\n\n// Set the text case attribute.\nvoid QsciStyle::setTextCase(QsciStyle::TextCase text_case)\n{\n    style_case = text_case;\n}\n\n\n// Set the visible attribute.\nvoid QsciStyle::setVisible(bool visible)\n{\n    style_visible = visible;\n}\n\n\n// Set the changeable attribute.\nvoid QsciStyle::setChangeable(bool changeable)\n{\n    style_changeable = changeable;\n}\n\n\n// Set the hotspot attribute.\nvoid QsciStyle::setHotspot(bool hotspot)\n{\n    style_hotspot = hotspot;\n}\n\n\n// Refresh the style.  Note that since we had to add apply() then this can't do\n// anything useful so we leave it as a no-op.\nvoid QsciStyle::refresh()\n{\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscistyledtext.cpp",
    "content": "// This module implements the QsciStyledText class.\n//\n// Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>\n// \n// This file is part of QScintilla.\n// \n// This file may be used under the terms of the GNU General Public\n// License versions 2.0 or 3.0 as published by the Free Software\n// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3\n// included in the packaging of this file.  Alternatively you may (at\n// your option) use any later version of the GNU General Public\n// License if such license has been publicly approved by Riverbank\n// Computing Limited (or its successors, if any) and the KDE Free Qt\n// Foundation. In addition, as a special exception, Riverbank gives you\n// certain additional rights. These rights are described in the Riverbank\n// GPL Exception version 1.1, which can be found in the file\n// GPL_EXCEPTION.txt in this package.\n// \n// If you are unsure which license is appropriate for your use, please\n// contact the sales department at sales@riverbankcomputing.com.\n// \n// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n\n#include \"Qsci/qscistyledtext.h\"\n\n#include \"Qsci/qsciscintillabase.h\"\n#include \"Qsci/qscistyle.h\"\n\n\n// A ctor.\nQsciStyledText::QsciStyledText(const QString &text, int style)\n    : styled_text(text), style_nr(style), explicit_style(0)\n{\n}\n\n\n// A ctor.\nQsciStyledText::QsciStyledText(const QString &text, const QsciStyle &style)\n    : styled_text(text), style_nr(-1)\n{\n    explicit_style = new QsciStyle(style);\n}\n\n\n// Return the number of the style.\nint QsciStyledText::style() const\n{\n    return explicit_style ? explicit_style->style() : style_nr;\n}\n\n\n// Apply any explicit style to an editor.\nvoid QsciStyledText::apply(QsciScintillaBase *sci) const\n{\n    if (explicit_style)\n        explicit_style->apply(sci);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/README",
    "content": "All the documentation for QScintilla for Qt v4 and Qt v5 (including\ninstallation instructions) can be found in doc/html-Qt4Qt5/index.html.\n\nAll the documentation for QScintilla for Qt v3 (including installation\ninstructions) can be found in doc/html-Qt3/index.html.\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/designer-Qt3/designer.pro",
    "content": "# This is the qmake file for the QScintilla plugin for Qt Designer.\n\n\nTEMPLATE = lib\nTARGET = qscintillaplugin\nDESTDIR = $(QTDIR)/plugins/designer\n\nCONFIG += qt warn_on release plugin\n\nSOURCES += qscintillaplugin.cpp\n\nLIBS += -lqscintilla2\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/designer-Qt3/qscintillaplugin.cpp",
    "content": "// This implements the QScintilla plugin for Qt Designer.\n\n\n#include <qwidgetplugin.h>\n\n#include <Qsci/qsciscintilla.h>\n\n\nstatic const char *qscintilla_pixmap[] = {\n\t\"22 22 35 1\",\n\t\"m c #000000\",\n\t\"n c #000033\",\n\t\"p c #003300\",\n\t\"r c #003333\",\n\t\"v c #330000\",\n\t\"o c #330033\",\n\t\"l c #333300\",\n\t\"h c #333333\",\n\t\"c c #333366\",\n\t\"d c #336666\",\n\t\"u c #336699\",\n\t\"E c #3366cc\",\n\t\"k c #663333\",\n\t\"i c #663366\",\n\t\"b c #666666\",\n\t\"e c #666699\",\n\t\"A c #6666cc\",\n\t\"G c #669966\",\n\t\"f c #669999\",\n\t\"j c #6699cc\",\n\t\"y c #6699ff\",\n\t\"t c #996666\",\n\t\"a c #999999\",\n\t\"g c #9999cc\",\n\t\"s c #9999ff\",\n\t\"C c #99cc99\",\n\t\"x c #99cccc\",\n\t\"w c #99ccff\",\n\t\"F c #cc99ff\",\n\t\"q c #cccccc\",\n\t\"# c #ccccff\",\n\t\"B c #ccffcc\",\n\t\"z c #ccffff\",\n\t\"D c #ffffcc\",\n\t\". c none\",\n\t\"........#abcda........\",\n\t\"......abefghdidcf.....\",\n\t\".....cadhfaehjheck....\",\n\t\"....leh.m.ncbehjddo...\",\n\t\"...depn.hqhqhr#mccch..\",\n\t\"..bb.hcaeh.hqersjhjcd.\",\n\t\".tcm.uqn.hc.uvwxhuygha\",\n\t\".feh.n.hb.hhzemcwhmuAm\",\n\t\"Bgehghqqme.eo#wlnysbnj\",\n\t\"awhdAzn.engjepswhmuyuj\",\n\t\"bCh#m.de.jpqwbmcwemlcz\",\n\t\"hcb#xh.nd#qrbswfehwzbm\",\n\t\"bd#d.A#zor#qmgbzwgjgws\",\n\t\"ajbcuqhqzchwwbemewchmr\",\n\t\"Dcn#cwmhgwehgsxbmhEjAc\",\n\t\".uanauFrhbgeahAAbcbuhh\",\n\t\".bohdAegcccfbbebuucmhe\",\n\t\"..briuauAediddeclchhh.\",\n\t\"...hcbhjccdecbceccch..\",\n\t\"....nhcmeccdccephcp...\",\n\t\".....crbhchhhrhhck....\",\n\t\"......tcmdhohhcnG.....\"\n};\n\n\nclass QScintillaPlugin : public QWidgetPlugin\n{\npublic:\n\tQScintillaPlugin() {};\n\n\tQStringList keys() const;\n\tQWidget *create(const QString &classname, QWidget *parent = 0, const char *name = 0);\n\tQString group(const QString &) const;\n\tQIconSet iconSet(const QString &) const;\n\tQString includeFile(const QString &) const;\n\tQString toolTip(const QString &) const;\n\tQString whatsThis(const QString &) const;\n\tbool isContainer(const QString &) const;\n};\n\n\nQStringList QScintillaPlugin::keys() const\n{\n\tQStringList list;\n\n\tlist << \"QsciScintilla\";\n\n\treturn list;\n}\n\n\nQWidget *QScintillaPlugin::create(const QString &key, QWidget *parent, const char *name)\n{\n\tif (key == \"QsciScintilla\")\n\t\treturn new QsciScintilla(parent, name);\n\n\treturn 0;\n}\n\n\nQString QScintillaPlugin::group(const QString &feature) const\n{\n\tif (feature == \"QsciScintilla\")\n\t\treturn \"Input\";\n\n\treturn QString::null;\n}\n\n\nQIconSet QScintillaPlugin::iconSet(const QString &) const\n{\n\treturn QIconSet(QPixmap(qscintilla_pixmap));\n}\n\n\nQString QScintillaPlugin::includeFile(const QString &feature) const\n{\n\tif (feature == \"QsciScintilla\")\n\t\treturn \"qsciscintilla.h\";\n\n\treturn QString::null;\n}\n\n\nQString QScintillaPlugin::toolTip(const QString &feature) const\n{\n\tif (feature == \"QsciScintilla\")\n\t\treturn \"QScintilla Programmer's Editor\";\n\n\treturn QString::null;\n}\n\n\nQString QScintillaPlugin::whatsThis(const QString &feature) const\n{\n\tif (feature == \"QsciScintilla\")\n\t\treturn \"A port to Qt of the Scintilla programmer's editor\";\n\n\treturn QString::null;\n}\n\n\nbool QScintillaPlugin::isContainer(const QString &) const\n{\n\treturn FALSE;\n}\n\n\nQ_EXPORT_PLUGIN(QScintillaPlugin)\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/designer-Qt4Qt5/designer.pro",
    "content": "# This is the qmake file for the QScintilla plugin for Qt Designer.\n\n\nTEMPLATE = lib\nTARGET = qscintillaplugin\n\nCONFIG += release plugin qscintilla2\n\ngreaterThan(QT_MAJOR_VERSION, 4) {\n    QT += designer\n\n    # Work around QTBUG-39300.\n    CONFIG -= android_install\n} else {\n    CONFIG += designer\n}\n\nmacx {\n    QMAKE_POST_LINK = install_name_tool -change libqscintilla2.11.dylib $$[QT_INSTALL_LIBS]/libqscintilla2.11.dylib $(TARGET)\n}\n\nHEADERS = qscintillaplugin.h\nSOURCES = qscintillaplugin.cpp\n\ntarget.path = $$[QT_INSTALL_PLUGINS]/designer\nINSTALLS += target\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/designer-Qt4Qt5/qscintillaplugin.cpp",
    "content": "// This implements the QScintilla plugin for Qt Designer.\n\n\n#include \"qscintillaplugin.h\"\n\n#include <QtPlugin>\n\n#include <Qsci/qsciscintilla.h>\n\n\nstatic const char *qscintilla_pixmap[] = {\n    \"22 22 35 1\",\n    \"m c #000000\",\n    \"n c #000033\",\n    \"p c #003300\",\n    \"r c #003333\",\n    \"v c #330000\",\n    \"o c #330033\",\n    \"l c #333300\",\n    \"h c #333333\",\n    \"c c #333366\",\n    \"d c #336666\",\n    \"u c #336699\",\n    \"E c #3366cc\",\n    \"k c #663333\",\n    \"i c #663366\",\n    \"b c #666666\",\n    \"e c #666699\",\n    \"A c #6666cc\",\n    \"G c #669966\",\n    \"f c #669999\",\n    \"j c #6699cc\",\n    \"y c #6699ff\",\n    \"t c #996666\",\n    \"a c #999999\",\n    \"g c #9999cc\",\n    \"s c #9999ff\",\n    \"C c #99cc99\",\n    \"x c #99cccc\",\n    \"w c #99ccff\",\n    \"F c #cc99ff\",\n    \"q c #cccccc\",\n    \"# c #ccccff\",\n    \"B c #ccffcc\",\n    \"z c #ccffff\",\n    \"D c #ffffcc\",\n    \". c none\",\n    \"........#abcda........\",\n    \"......abefghdidcf.....\",\n    \".....cadhfaehjheck....\",\n    \"....leh.m.ncbehjddo...\",\n    \"...depn.hqhqhr#mccch..\",\n    \"..bb.hcaeh.hqersjhjcd.\",\n    \".tcm.uqn.hc.uvwxhuygha\",\n    \".feh.n.hb.hhzemcwhmuAm\",\n    \"Bgehghqqme.eo#wlnysbnj\",\n    \"awhdAzn.engjepswhmuyuj\",\n    \"bCh#m.de.jpqwbmcwemlcz\",\n    \"hcb#xh.nd#qrbswfehwzbm\",\n    \"bd#d.A#zor#qmgbzwgjgws\",\n    \"ajbcuqhqzchwwbemewchmr\",\n    \"Dcn#cwmhgwehgsxbmhEjAc\",\n    \".uanauFrhbgeahAAbcbuhh\",\n    \".bohdAegcccfbbebuucmhe\",\n    \"..briuauAediddeclchhh.\",\n    \"...hcbhjccdecbceccch..\",\n    \"....nhcmeccdccephcp...\",\n    \".....crbhchhhrhhck....\",\n    \"......tcmdhohhcnG.....\"\n};\n\n\nQScintillaPlugin::QScintillaPlugin(QObject *parent)\n    : QObject(parent), initialized(false)\n{\n}\n\n\nQScintillaPlugin::~QScintillaPlugin()\n{\n}\n\n\nvoid QScintillaPlugin::initialize(QDesignerFormEditorInterface * /* core */)\n{\n    initialized = true;\n}\n\n\nbool QScintillaPlugin::isInitialized() const\n{\n    return initialized;\n}\n\n\nQWidget *QScintillaPlugin::createWidget(QWidget *parent)\n{\n    return new QsciScintilla(parent);\n}\n\n\nQString QScintillaPlugin::name() const\n{\n    return \"QsciScintilla\";\n}\n\n\nQString QScintillaPlugin::group() const\n{\n    return \"Input Widgets\";\n}\n\n\nQIcon QScintillaPlugin::icon() const\n{\n    return QIcon(QPixmap(qscintilla_pixmap));\n}\n\n\nQString QScintillaPlugin::toolTip() const\n{\n    return \"QScintilla Programmer's Editor\";\n}\n\n\nQString QScintillaPlugin::whatsThis() const\n{\n    return \"A port to Qt of the Scintilla programmer's editor\";\n}\n\n\nbool QScintillaPlugin::isContainer() const\n{\n    return false;\n}\n\n\nQString QScintillaPlugin::domXml() const\n{\n    return \"<widget class=\\\"QsciScintilla\\\" name=\\\"textEdit\\\">\\n\"\n        \" <property name=\\\"geometry\\\">\\n\"\n        \"  <rect>\\n\"\n        \"   <x>0</x>\\n\"\n        \"   <y>0</y>\\n\"\n        \"   <width>400</width>\\n\"\n        \"   <height>200</height>\\n\"\n        \"  </rect>\\n\"\n        \" </property>\\n\"\n        \" <property name=\\\"toolTip\\\" >\\n\"\n        \"  <string></string>\\n\"\n        \" </property>\\n\"\n        \" <property name=\\\"whatsThis\\\" >\\n\"\n        \"  <string></string>\\n\"\n        \" </property>\\n\"\n        \"</widget>\\n\";\n}\n\n\nQString QScintillaPlugin::includeFile() const\n{\n    return \"Qsci/qsciscintilla.h\";\n}\n\n\n#if QT_VERSION < 0x050000\nQ_EXPORT_PLUGIN2(qscintillaplugin, QScintillaPlugin)\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/designer-Qt4Qt5/qscintillaplugin.h",
    "content": "// This defines the QScintilla plugin for Qt Designer.\n\n\n#ifndef _QSCINTILLAPLUGIN_H\n#define _QSCINTILLAPLUGIN_H\n\n#include <QDesignerCustomWidgetInterface>\n\n\nclass QScintillaPlugin : public QObject, public QDesignerCustomWidgetInterface\n{\n    Q_OBJECT\n#if QT_VERSION >= 0x050000\n    Q_PLUGIN_METADATA(IID \"org.qt-project.Qt.QDesignerCustomWidgetInterface\")\n#endif\n    Q_INTERFACES(QDesignerCustomWidgetInterface)\n\npublic:\n    QScintillaPlugin(QObject *parent = 0);\n    virtual ~QScintillaPlugin();\n\n    bool isContainer() const;\n    bool isInitialized() const;\n    QIcon icon() const;\n    QString domXml() const;\n    QString group() const;\n    QString includeFile() const;\n    QString name() const;\n    QString toolTip() const;\n    QString whatsThis() const;\n    QWidget *createWidget(QWidget *parent);\n    void initialize(QDesignerFormEditorInterface *core);\n\nprivate:\n    bool initialized;\n};\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/example-Qt3/application.cpp",
    "content": "/****************************************************************************\n** $Id: application.cpp,v 1.1 2004/09/18 17:31:23 phil Exp $\n**\n** Copyright (C) 1992-2002 Trolltech AS.  All rights reserved.\n**\n** This file is part of an example program for Qt.  This example\n** program may be used, distributed and modified without limitation.\n**\n*****************************************************************************/\n\n#include \"application.h\"\n\n#include <qimage.h>\n#include <qpixmap.h>\n#include <qtoolbar.h>\n#include <qtoolbutton.h>\n#include <qpopupmenu.h>\n#include <qmenubar.h>\n#include <qfile.h>\n#include <qfiledialog.h>\n#include <qstatusbar.h>\n#include <qmessagebox.h>\n#include <qprinter.h>\n#include <qapplication.h>\n#include <qaccel.h>\n#include <qtextstream.h>\n#include <qpainter.h>\n#include <qpaintdevicemetrics.h>\n#include <qwhatsthis.h>\n#include <qsimplerichtext.h>\n\n#include <Qsci/qsciscintilla.h>\n#include <Qsci/qsciprinter.h>\n\n#include \"filesave.xpm\"\n#include \"fileopen.xpm\"\n#include \"fileprint.xpm\"\n\nApplicationWindow::ApplicationWindow()\n    : QMainWindow( 0, \"example application main window\", WDestructiveClose | WGroupLeader )\n{\n    printer = new QsciPrinter( QPrinter::HighResolution );\n    QPixmap openIcon, saveIcon, printIcon;\n\n    QToolBar * fileTools = new QToolBar( this, \"file operations\" );\n    fileTools->setLabel( \"File Operations\" );\n\n    openIcon = QPixmap( fileopen );\n    QToolButton * fileOpen\n\t= new QToolButton( openIcon, \"Open File\", QString::null,\n\t\t\t   this, SLOT(choose()), fileTools, \"open file\" );\n\n    saveIcon = QPixmap( filesave );\n    QToolButton * fileSave\n\t= new QToolButton( saveIcon, \"Save File\", QString::null,\n\t\t\t   this, SLOT(save()), fileTools, \"save file\" );\n\n    printIcon = QPixmap( fileprint );\n    QToolButton * filePrint\n\t= new QToolButton( printIcon, \"Print File\", QString::null,\n\t\t\t   this, SLOT(print()), fileTools, \"print file\" );\n\n\n    (void)QWhatsThis::whatsThisButton( fileTools );\n\n    const char * fileOpenText = \"<p><img source=\\\"fileopen\\\"> \"\n\t         \"Click this button to open a <em>new file</em>.<br>\"\n                 \"You can also select the <b>Open</b> command \"\n                 \"from the <b>File</b> menu.</p>\";\n\n    QWhatsThis::add( fileOpen, fileOpenText );\n\n    QMimeSourceFactory::defaultFactory()->setPixmap( \"fileopen\", openIcon );\n\n    const char * fileSaveText = \"<p>Click this button to save the file you \"\n                 \"are editing. You will be prompted for a file name.\\n\"\n                 \"You can also select the <b>Save</b> command \"\n                 \"from the <b>File</b> menu.</p>\";\n\n    QWhatsThis::add( fileSave, fileSaveText );\n\n    const char * filePrintText = \"Click this button to print the file you \"\n                 \"are editing.\\n\"\n\t\t \"You can also select the Print command \"\n\t\t \"from the File menu.\";\n\n    QWhatsThis::add( filePrint, filePrintText );\n\n\n    QPopupMenu * file = new QPopupMenu( this );\n    menuBar()->insertItem( \"&File\", file );\n\n\n    file->insertItem( \"&New\", this, SLOT(newDoc()), CTRL+Key_N );\n\n    int id;\n    id = file->insertItem( openIcon, \"&Open...\",\n\t\t\t   this, SLOT(choose()), CTRL+Key_O );\n    file->setWhatsThis( id, fileOpenText );\n\n    id = file->insertItem( saveIcon, \"&Save\",\n\t\t\t   this, SLOT(save()), CTRL+Key_S );\n    file->setWhatsThis( id, fileSaveText );\n\n    id = file->insertItem( \"Save &As...\", this, SLOT(saveAs()) );\n    file->setWhatsThis( id, fileSaveText );\n\n    file->insertSeparator();\n\n    id = file->insertItem( printIcon, \"&Print...\",\n\t\t\t   this, SLOT(print()), CTRL+Key_P );\n    file->setWhatsThis( id, filePrintText );\n\n    file->insertSeparator();\n\n    file->insertItem( \"&Close\", this, SLOT(close()), CTRL+Key_W );\n\n    file->insertItem( \"&Quit\", qApp, SLOT( closeAllWindows() ), CTRL+Key_Q );\n\n    menuBar()->insertSeparator();\n\n    QPopupMenu * help = new QPopupMenu( this );\n    menuBar()->insertItem( \"&Help\", help );\n\n    help->insertItem( \"&About\", this, SLOT(about()), Key_F1 );\n    help->insertItem( \"About &Qt\", this, SLOT(aboutQt()) );\n    help->insertSeparator();\n    help->insertItem( \"What's &This\", this, SLOT(whatsThis()), SHIFT+Key_F1 );\n\n    e = new QsciScintilla( this, \"editor\" );\n    e->setFocus();\n    setCentralWidget( e );\n    statusBar()->message( \"Ready\", 2000 );\n\n    resize( 450, 600 );\n}\n\n\nApplicationWindow::~ApplicationWindow()\n{\n    delete printer;\n}\n\n\n\nvoid ApplicationWindow::newDoc()\n{\n    ApplicationWindow *ed = new ApplicationWindow;\n    ed->setCaption(\"QScintilla Example - Application\");\n    ed->show();\n}\n\nvoid ApplicationWindow::choose()\n{\n    QString fn = QFileDialog::getOpenFileName( QString::null, QString::null,\n\t\t\t\t\t       this);\n    if ( !fn.isEmpty() )\n\tload( fn );\n    else\n\tstatusBar()->message( \"Loading aborted\", 2000 );\n}\n\n\nvoid ApplicationWindow::load( const QString &fileName )\n{\n    QFile f( fileName );\n    if ( !f.open( IO_ReadOnly ) )\n\treturn;\n\n    QTextStream ts( &f );\n    e->setText( ts.read() );\n    e->setModified( FALSE );\n    setCaption( fileName );\n    statusBar()->message( \"Loaded document \" + fileName, 2000 );\n}\n\n\nvoid ApplicationWindow::save()\n{\n    if ( filename.isEmpty() ) {\n\tsaveAs();\n\treturn;\n    }\n\n    QString text = e->text();\n    QFile f( filename );\n    if ( !f.open( IO_WriteOnly ) ) {\n\tstatusBar()->message( QString(\"Could not write to %1\").arg(filename),\n\t\t\t      2000 );\n\treturn;\n    }\n\n    QTextStream t( &f );\n    t << text;\n    f.close();\n\n    e->setModified( FALSE );\n\n    setCaption( filename );\n\n    statusBar()->message( QString( \"File %1 saved\" ).arg( filename ), 2000 );\n}\n\n\nvoid ApplicationWindow::saveAs()\n{\n    QString fn = QFileDialog::getSaveFileName( QString::null, QString::null,\n\t\t\t\t\t       this );\n    if ( !fn.isEmpty() ) {\n\tfilename = fn;\n\tsave();\n    } else {\n\tstatusBar()->message( \"Saving aborted\", 2000 );\n    }\n}\n\n\nvoid ApplicationWindow::print()\n{\n    printer->setFullPage( TRUE );\n    if ( printer->setup(this) ) {\t\t// printer dialog\n\tstatusBar()->message( \"Printing...\" );\n\n\tif (printer->printRange( e ))\n\t    statusBar()->message( \"Printing completed\", 2000 );\n\telse\n\t    statusBar()->message( \"Error while printing\", 2000 );\n    } else {\n\tstatusBar()->message( \"Printing aborted\", 2000 );\n    }\n}\n\nvoid ApplicationWindow::closeEvent( QCloseEvent* ce )\n{\n    if ( !e->isModified() ) {\n\tce->accept();\n\treturn;\n    }\n\n    switch( QMessageBox::information( this, \"QScintilla Application Example\",\n\t\t\t\t      \"Do you want to save the changes\"\n\t\t\t\t      \" to the document?\",\n\t\t\t\t      \"Yes\", \"No\", \"Cancel\",\n\t\t\t\t      0, 1 ) ) {\n    case 0:\n\tsave();\n\tce->accept();\n\tbreak;\n    case 1:\n\tce->accept();\n\tbreak;\n    case 2:\n    default: // just for sanity\n\tce->ignore();\n\tbreak;\n    }\n}\n\n\nvoid ApplicationWindow::about()\n{\n    QMessageBox::about( this, \"QScintilla Application Example\",\n\t\t\t\"This example demonstrates a simple use of \"\n\t\t\t\"QsciScintilla and QsciPrinter.\");\n}\n\n\nvoid ApplicationWindow::aboutQt()\n{\n    QMessageBox::aboutQt( this, \"QScintilla Application Example\" );\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/example-Qt3/application.h",
    "content": "/****************************************************************************\n** $Id: application.h,v 1.1 2004/09/18 17:31:23 phil Exp $\n**\n** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.\n**\n** This file is part of an example program for Qt.  This example\n** program may be used, distributed and modified without limitation.\n**\n*****************************************************************************/\n\n#ifndef APPLICATION_H\n#define APPLICATION_H\n\n#include <qmainwindow.h>\n\nclass QsciScintilla;\nclass QsciPrinter;\n\nclass ApplicationWindow: public QMainWindow\n{\n    Q_OBJECT\n\npublic:\n    ApplicationWindow();\n    ~ApplicationWindow();\n\nprotected:\n    void closeEvent( QCloseEvent* );\n\nprivate slots:\n    void newDoc();\n    void choose();\n    void load( const QString &fileName );\n    void save();\n    void saveAs();\n    void print();\n\n    void about();\n    void aboutQt();\n\nprivate:\n    QsciPrinter *printer;\n    QsciScintilla *e;\n    QString filename;\n};\n\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/example-Qt3/application.pro",
    "content": "TEMPLATE\t= app\nTARGET\t\t= application\n\nCONFIG\t\t+= qt warn_on release\n\nLIBS\t\t+= -lqscintilla2\n\nHEADERS\t\t= application.h\nSOURCES\t\t= application.cpp \\\n\t\t  main.cpp\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/example-Qt3/fileopen.xpm",
    "content": "/* XPM */\nstatic const char *fileopen[] = {\n\"    16    13        5            1\",\n\". c #040404\",\n\"# c #808304\",\n\"a c None\",\n\"b c #f3f704\",\n\"c c #f3f7f3\",\n\"aaaaaaaaa...aaaa\",\n\"aaaaaaaa.aaa.a.a\",\n\"aaaaaaaaaaaaa..a\",\n\"a...aaaaaaaa...a\",\n\".bcb.......aaaaa\",\n\".cbcbcbcbc.aaaaa\",\n\".bcbcbcbcb.aaaaa\",\n\".cbcb...........\",\n\".bcb.#########.a\",\n\".cb.#########.aa\",\n\".b.#########.aaa\",\n\"..#########.aaaa\",\n\"...........aaaaa\"\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/example-Qt3/fileprint.xpm",
    "content": "/* XPM */\nstatic const char *fileprint[] = {\n\"    16    14        6            1\",\n\". c #000000\",\n\"# c #848284\",\n\"a c #c6c3c6\",\n\"b c #ffff00\",\n\"c c #ffffff\",\n\"d c None\",\n\"ddddd.........dd\",\n\"dddd.cccccccc.dd\",\n\"dddd.c.....c.ddd\",\n\"ddd.cccccccc.ddd\",\n\"ddd.c.....c....d\",\n\"dd.cccccccc.a.a.\",\n\"d..........a.a..\",\n\".aaaaaaaaaa.a.a.\",\n\".............aa.\",\n\".aaaaaa###aa.a.d\",\n\".aaaaaabbbaa...d\",\n\".............a.d\",\n\"d.aaaaaaaaa.a.dd\",\n\"dd...........ddd\"\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/example-Qt3/filesave.xpm",
    "content": "/* XPM */\nstatic const char *filesave[] = {\n\"    14    14        4            1\",\n\". c #040404\",\n\"# c #808304\",\n\"a c #bfc2bf\",\n\"b c None\",\n\"..............\",\n\".#.aaaaaaaa.a.\",\n\".#.aaaaaaaa...\",\n\".#.aaaaaaaa.#.\",\n\".#.aaaaaaaa.#.\",\n\".#.aaaaaaaa.#.\",\n\".#.aaaaaaaa.#.\",\n\".##........##.\",\n\".############.\",\n\".##.........#.\",\n\".##......aa.#.\",\n\".##......aa.#.\",\n\".##......aa.#.\",\n\"b.............\"\n};\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/example-Qt3/main.cpp",
    "content": "/****************************************************************************\n** $Id: main.cpp,v 1.1 2004/09/18 17:31:23 phil Exp $\n**\n** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.\n**\n** This file is part of an example program for Qt.  This example\n** program may be used, distributed and modified without limitation.\n**\n*****************************************************************************/\n\n#include <qapplication.h>\n#include \"application.h\"\n\nint main( int argc, char ** argv ) {\n    QApplication a( argc, argv );\n    ApplicationWindow *mw = new ApplicationWindow();\n    mw->setCaption( \"QScintilla Example - Application\" );\n    mw->show();\n    a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) );\n    return a.exec();\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/example-Qt4Qt5/application.pro",
    "content": "CONFIG      += release qscintilla2\n\nmacx {\n    QMAKE_POST_LINK = install_name_tool -change libqscintilla2.11.dylib $$[QT_INSTALL_LIBS]/libqscintilla2.11.dylib $(TARGET)\n}\n\nHEADERS      = mainwindow.h\nSOURCES      = main.cpp mainwindow.cpp\nRESOURCES    = application.qrc\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/example-Qt4Qt5/application.qrc",
    "content": "<!DOCTYPE RCC><RCC version=\"1.0\">\n<qresource>\n    <file>images/copy.png</file>\n    <file>images/cut.png</file>\n    <file>images/new.png</file>\n    <file>images/open.png</file>\n    <file>images/paste.png</file>\n    <file>images/save.png</file>\n</qresource>\n</RCC>\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/example-Qt4Qt5/main.cpp",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2004-2006 Trolltech ASA. All rights reserved.\n**\n** This file is part of the example classes of the Qt Toolkit.\n**\n** Licensees holding a valid Qt License Agreement may use this file in\n** accordance with the rights, responsibilities and obligations\n** contained therein.  Please consult your licensing agreement or\n** contact sales@trolltech.com if any conditions of this licensing\n** agreement are not clear to you.\n**\n** Further information about Qt licensing is available at:\n** http://www.trolltech.com/products/qt/licensing.html or by\n** contacting info@trolltech.com.\n**\n** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n**\n****************************************************************************/\n\n#include <QApplication>\n\n#include \"mainwindow.h\"\n\nint main(int argc, char *argv[])\n{\n    Q_INIT_RESOURCE(application);\n\n    QApplication app(argc, argv);\n    MainWindow mainWin;\n    mainWin.show();\n    return app.exec();\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/example-Qt4Qt5/mainwindow.cpp",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2004-2006 Trolltech ASA. All rights reserved.\n**\n** This file is part of the example classes of the Qt Toolkit.\n**\n** Licensees holding a valid Qt License Agreement may use this file in\n** accordance with the rights, responsibilities and obligations\n** contained therein.  Please consult your licensing agreement or\n** contact sales@trolltech.com if any conditions of this licensing\n** agreement are not clear to you.\n**\n** Further information about Qt licensing is available at:\n** http://www.trolltech.com/products/qt/licensing.html or by\n** contacting info@trolltech.com.\n**\n** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n**\n****************************************************************************/\n\n#include <QAction>\n#include <QApplication>\n#include <QCloseEvent>\n#include <QFile>\n#include <QFileInfo>\n#include <QFileDialog>\n#include <QIcon>\n#include <QMenu>\n#include <QMenuBar>\n#include <QMessageBox>\n#include <QPoint>\n#include <QSettings>\n#include <QSize>\n#include <QStatusBar>\n#include <QTextStream>\n#include <QToolBar>\n\n#include <Qsci/qsciscintilla.h>\n\n#include \"mainwindow.h\"\n\nMainWindow::MainWindow()\n{\n    textEdit = new QsciScintilla;\n    setCentralWidget(textEdit);\n\n    createActions();\n    createMenus();\n    createToolBars();\n    createStatusBar();\n\n    readSettings();\n\n    connect(textEdit, SIGNAL(textChanged()),\n            this, SLOT(documentWasModified()));\n\n    setCurrentFile(\"\");\n}\n\nvoid MainWindow::closeEvent(QCloseEvent *event)\n{\n    if (maybeSave()) {\n        writeSettings();\n        event->accept();\n    } else {\n        event->ignore();\n    }\n}\n\nvoid MainWindow::newFile()\n{\n    if (maybeSave()) {\n        textEdit->clear();\n        setCurrentFile(\"\");\n    }\n}\n\nvoid MainWindow::open()\n{\n    if (maybeSave()) {\n        QString fileName = QFileDialog::getOpenFileName(this);\n        if (!fileName.isEmpty())\n            loadFile(fileName);\n    }\n}\n\nbool MainWindow::save()\n{\n    if (curFile.isEmpty()) {\n        return saveAs();\n    } else {\n        return saveFile(curFile);\n    }\n}\n\nbool MainWindow::saveAs()\n{\n    QString fileName = QFileDialog::getSaveFileName(this);\n    if (fileName.isEmpty())\n        return false;\n\n    return saveFile(fileName);\n}\n\nvoid MainWindow::about()\n{\n   QMessageBox::about(this, tr(\"About Application\"),\n            tr(\"The <b>Application</b> example demonstrates how to \"\n               \"write modern GUI applications using Qt, with a menu bar, \"\n               \"toolbars, and a status bar.\"));\n}\n\nvoid MainWindow::documentWasModified()\n{\n    setWindowModified(textEdit->isModified());\n}\n\nvoid MainWindow::createActions()\n{\n    newAct = new QAction(QIcon(\":/images/new.png\"), tr(\"&New\"), this);\n    newAct->setShortcut(tr(\"Ctrl+N\"));\n    newAct->setStatusTip(tr(\"Create a new file\"));\n    connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));\n\n    openAct = new QAction(QIcon(\":/images/open.png\"), tr(\"&Open...\"), this);\n    openAct->setShortcut(tr(\"Ctrl+O\"));\n    openAct->setStatusTip(tr(\"Open an existing file\"));\n    connect(openAct, SIGNAL(triggered()), this, SLOT(open()));\n\n    saveAct = new QAction(QIcon(\":/images/save.png\"), tr(\"&Save\"), this);\n    saveAct->setShortcut(tr(\"Ctrl+S\"));\n    saveAct->setStatusTip(tr(\"Save the document to disk\"));\n    connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));\n\n    saveAsAct = new QAction(tr(\"Save &As...\"), this);\n    saveAsAct->setStatusTip(tr(\"Save the document under a new name\"));\n    connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs()));\n\n    exitAct = new QAction(tr(\"E&xit\"), this);\n    exitAct->setShortcut(tr(\"Ctrl+Q\"));\n    exitAct->setStatusTip(tr(\"Exit the application\"));\n    connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));\n\n    cutAct = new QAction(QIcon(\":/images/cut.png\"), tr(\"Cu&t\"), this);\n    cutAct->setShortcut(tr(\"Ctrl+X\"));\n    cutAct->setStatusTip(tr(\"Cut the current selection's contents to the \"\n                            \"clipboard\"));\n    connect(cutAct, SIGNAL(triggered()), textEdit, SLOT(cut()));\n\n    copyAct = new QAction(QIcon(\":/images/copy.png\"), tr(\"&Copy\"), this);\n    copyAct->setShortcut(tr(\"Ctrl+C\"));\n    copyAct->setStatusTip(tr(\"Copy the current selection's contents to the \"\n                             \"clipboard\"));\n    connect(copyAct, SIGNAL(triggered()), textEdit, SLOT(copy()));\n\n    pasteAct = new QAction(QIcon(\":/images/paste.png\"), tr(\"&Paste\"), this);\n    pasteAct->setShortcut(tr(\"Ctrl+V\"));\n    pasteAct->setStatusTip(tr(\"Paste the clipboard's contents into the current \"\n                              \"selection\"));\n    connect(pasteAct, SIGNAL(triggered()), textEdit, SLOT(paste()));\n\n    aboutAct = new QAction(tr(\"&About\"), this);\n    aboutAct->setStatusTip(tr(\"Show the application's About box\"));\n    connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));\n\n    aboutQtAct = new QAction(tr(\"About &Qt\"), this);\n    aboutQtAct->setStatusTip(tr(\"Show the Qt library's About box\"));\n    connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));\n\n    cutAct->setEnabled(false);\n    copyAct->setEnabled(false);\n    connect(textEdit, SIGNAL(copyAvailable(bool)),\n            cutAct, SLOT(setEnabled(bool)));\n    connect(textEdit, SIGNAL(copyAvailable(bool)),\n            copyAct, SLOT(setEnabled(bool)));\n}\n\nvoid MainWindow::createMenus()\n{\n    fileMenu = menuBar()->addMenu(tr(\"&File\"));\n    fileMenu->addAction(newAct);\n    fileMenu->addAction(openAct);\n    fileMenu->addAction(saveAct);\n    fileMenu->addAction(saveAsAct);\n    fileMenu->addSeparator();\n    fileMenu->addAction(exitAct);\n\n    editMenu = menuBar()->addMenu(tr(\"&Edit\"));\n    editMenu->addAction(cutAct);\n    editMenu->addAction(copyAct);\n    editMenu->addAction(pasteAct);\n\n    menuBar()->addSeparator();\n\n    helpMenu = menuBar()->addMenu(tr(\"&Help\"));\n    helpMenu->addAction(aboutAct);\n    helpMenu->addAction(aboutQtAct);\n}\n\nvoid MainWindow::createToolBars()\n{\n    fileToolBar = addToolBar(tr(\"File\"));\n    fileToolBar->addAction(newAct);\n    fileToolBar->addAction(openAct);\n    fileToolBar->addAction(saveAct);\n\n    editToolBar = addToolBar(tr(\"Edit\"));\n    editToolBar->addAction(cutAct);\n    editToolBar->addAction(copyAct);\n    editToolBar->addAction(pasteAct);\n}\n\nvoid MainWindow::createStatusBar()\n{\n    statusBar()->showMessage(tr(\"Ready\"));\n}\n\nvoid MainWindow::readSettings()\n{\n    QSettings settings(\"Trolltech\", \"Application Example\");\n    QPoint pos = settings.value(\"pos\", QPoint(200, 200)).toPoint();\n    QSize size = settings.value(\"size\", QSize(400, 400)).toSize();\n    resize(size);\n    move(pos);\n}\n\nvoid MainWindow::writeSettings()\n{\n    QSettings settings(\"Trolltech\", \"Application Example\");\n    settings.setValue(\"pos\", pos());\n    settings.setValue(\"size\", size());\n}\n\nbool MainWindow::maybeSave()\n{\n    if (textEdit->isModified()) {\n        int ret = QMessageBox::warning(this, tr(\"Application\"),\n                     tr(\"The document has been modified.\\n\"\n                        \"Do you want to save your changes?\"),\n                     QMessageBox::Yes | QMessageBox::Default,\n                     QMessageBox::No,\n                     QMessageBox::Cancel | QMessageBox::Escape);\n        if (ret == QMessageBox::Yes)\n            return save();\n        else if (ret == QMessageBox::Cancel)\n            return false;\n    }\n    return true;\n}\n\nvoid MainWindow::loadFile(const QString &fileName)\n{\n    QFile file(fileName);\n    if (!file.open(QFile::ReadOnly)) {\n        QMessageBox::warning(this, tr(\"Application\"),\n                             tr(\"Cannot read file %1:\\n%2.\")\n                             .arg(fileName)\n                             .arg(file.errorString()));\n        return;\n    }\n\n    QTextStream in(&file);\n    QApplication::setOverrideCursor(Qt::WaitCursor);\n    textEdit->setText(in.readAll());\n    QApplication::restoreOverrideCursor();\n\n    setCurrentFile(fileName);\n    statusBar()->showMessage(tr(\"File loaded\"), 2000);\n}\n\nbool MainWindow::saveFile(const QString &fileName)\n{\n    QFile file(fileName);\n    if (!file.open(QFile::WriteOnly)) {\n        QMessageBox::warning(this, tr(\"Application\"),\n                             tr(\"Cannot write file %1:\\n%2.\")\n                             .arg(fileName)\n                             .arg(file.errorString()));\n        return false;\n    }\n\n    QTextStream out(&file);\n    QApplication::setOverrideCursor(Qt::WaitCursor);\n    out << textEdit->text();\n    QApplication::restoreOverrideCursor();\n\n    setCurrentFile(fileName);\n    statusBar()->showMessage(tr(\"File saved\"), 2000);\n    return true;\n}\n\nvoid MainWindow::setCurrentFile(const QString &fileName)\n{\n    curFile = fileName;\n    textEdit->setModified(false);\n    setWindowModified(false);\n\n    QString shownName;\n    if (curFile.isEmpty())\n        shownName = \"untitled.txt\";\n    else\n        shownName = strippedName(curFile);\n\n    setWindowTitle(tr(\"%1[*] - %2\").arg(shownName).arg(tr(\"Application\")));\n}\n\nQString MainWindow::strippedName(const QString &fullFileName)\n{\n    return QFileInfo(fullFileName).fileName();\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/example-Qt4Qt5/mainwindow.h",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2004-2006 Trolltech ASA. All rights reserved.\n**\n** This file is part of the example classes of the Qt Toolkit.\n**\n** Licensees holding a valid Qt License Agreement may use this file in\n** accordance with the rights, responsibilities and obligations\n** contained therein.  Please consult your licensing agreement or\n** contact sales@trolltech.com if any conditions of this licensing\n** agreement are not clear to you.\n**\n** Further information about Qt licensing is available at:\n** http://www.trolltech.com/products/qt/licensing.html or by\n** contacting info@trolltech.com.\n**\n** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\n** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n**\n****************************************************************************/\n\n#ifndef MAINWINDOW_H\n#define MAINWINDOW_H\n\n#include <QMainWindow>\n\nclass QAction;\nclass QMenu;\nclass QsciScintilla;\n\nclass MainWindow : public QMainWindow\n{\n    Q_OBJECT\n\npublic:\n    MainWindow();\n\nprotected:\n    void closeEvent(QCloseEvent *event);\n\nprivate slots:\n    void newFile();\n    void open();\n    bool save();\n    bool saveAs();\n    void about();\n    void documentWasModified();\n\nprivate:\n    void createActions();\n    void createMenus();\n    void createToolBars();\n    void createStatusBar();\n    void readSettings();\n    void writeSettings();\n    bool maybeSave();\n    void loadFile(const QString &fileName);\n    bool saveFile(const QString &fileName);\n    void setCurrentFile(const QString &fileName);\n    QString strippedName(const QString &fullFileName);\n\n    QsciScintilla *textEdit;\n    QString curFile;\n\n    QMenu *fileMenu;\n    QMenu *editMenu;\n    QMenu *helpMenu;\n    QToolBar *fileToolBar;\n    QToolBar *editToolBar;\n    QAction *newAct;\n    QAction *openAct;\n    QAction *saveAct;\n    QAction *saveAsAct;\n    QAction *exitAct;\n    QAction *cutAct;\n    QAction *copyAct;\n    QAction *pasteAct;\n    QAction *aboutAct;\n    QAction *aboutQtAct;\n};\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/include/ILexer.h",
    "content": "// Scintilla source code edit control\n/** @file ILexer.h\n ** Interface between Scintilla and lexers.\n **/\n// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef ILEXER_H\n#define ILEXER_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n#ifdef _WIN32\n\t#define SCI_METHOD __stdcall\n#else\n\t#define SCI_METHOD\n#endif\n\nenum { dvOriginal=0, dvLineEnd=1 };\n\nclass IDocument {\npublic:\n\tvirtual int SCI_METHOD Version() const = 0;\n\tvirtual void SCI_METHOD SetErrorStatus(int status) = 0;\n\tvirtual int SCI_METHOD Length() const = 0;\n\tvirtual void SCI_METHOD GetCharRange(char *buffer, int position, int lengthRetrieve) const = 0;\n\tvirtual char SCI_METHOD StyleAt(int position) const = 0;\n\tvirtual int SCI_METHOD LineFromPosition(int position) const = 0;\n\tvirtual int SCI_METHOD LineStart(int line) const = 0;\n\tvirtual int SCI_METHOD GetLevel(int line) const = 0;\n\tvirtual int SCI_METHOD SetLevel(int line, int level) = 0;\n\tvirtual int SCI_METHOD GetLineState(int line) const = 0;\n\tvirtual int SCI_METHOD SetLineState(int line, int state) = 0;\n\tvirtual void SCI_METHOD StartStyling(int position, char mask) = 0;\n\tvirtual bool SCI_METHOD SetStyleFor(int length, char style) = 0;\n\tvirtual bool SCI_METHOD SetStyles(int length, const char *styles) = 0;\n\tvirtual void SCI_METHOD DecorationSetCurrentIndicator(int indicator) = 0;\n\tvirtual void SCI_METHOD DecorationFillRange(int position, int value, int fillLength) = 0;\n\tvirtual void SCI_METHOD ChangeLexerState(int start, int end) = 0;\n\tvirtual int SCI_METHOD CodePage() const = 0;\n\tvirtual bool SCI_METHOD IsDBCSLeadByte(char ch) const = 0;\n\tvirtual const char * SCI_METHOD BufferPointer() = 0;\n\tvirtual int SCI_METHOD GetLineIndentation(int line) = 0;\n};\n\nclass IDocumentWithLineEnd : public IDocument {\npublic:\n\tvirtual int SCI_METHOD LineEnd(int line) const = 0;\n\tvirtual int SCI_METHOD GetRelativePosition(int positionStart, int characterOffset) const = 0;\n\tvirtual int SCI_METHOD GetCharacterAndWidth(int position, int *pWidth) const = 0;\n};\n\nenum { lvOriginal=0, lvSubStyles=1 };\n\nclass ILexer {\npublic:\n\tvirtual int SCI_METHOD Version() const = 0;\n\tvirtual void SCI_METHOD Release() = 0;\n\tvirtual const char * SCI_METHOD PropertyNames() = 0;\n\tvirtual int SCI_METHOD PropertyType(const char *name) = 0;\n\tvirtual const char * SCI_METHOD DescribeProperty(const char *name) = 0;\n\tvirtual int SCI_METHOD PropertySet(const char *key, const char *val) = 0;\n\tvirtual const char * SCI_METHOD DescribeWordListSets() = 0;\n\tvirtual int SCI_METHOD WordListSet(int n, const char *wl) = 0;\n\tvirtual void SCI_METHOD Lex(unsigned int startPos, int lengthDoc, int initStyle, IDocument *pAccess) = 0;\n\tvirtual void SCI_METHOD Fold(unsigned int startPos, int lengthDoc, int initStyle, IDocument *pAccess) = 0;\n\tvirtual void * SCI_METHOD PrivateCall(int operation, void *pointer) = 0;\n};\n\nclass ILexerWithSubStyles : public ILexer {\npublic:\n\tvirtual int SCI_METHOD LineEndTypesSupported() = 0;\n\tvirtual int SCI_METHOD AllocateSubStyles(int styleBase, int numberStyles) = 0;\n\tvirtual int SCI_METHOD SubStylesStart(int styleBase) = 0;\n\tvirtual int SCI_METHOD SubStylesLength(int styleBase) = 0;\n\tvirtual int SCI_METHOD StyleFromSubStyle(int subStyle) = 0;\n\tvirtual int SCI_METHOD PrimaryStyleFromStyle(int style) = 0;\n\tvirtual void SCI_METHOD FreeSubStyles() = 0;\n\tvirtual void SCI_METHOD SetIdentifiers(int style, const char *identifiers) = 0;\n\tvirtual int SCI_METHOD DistanceToSecondaryStyles() = 0;\n\tvirtual const char * SCI_METHOD GetSubStyleBases() = 0;\n};\n\nclass ILoader {\npublic:\n\tvirtual int SCI_METHOD Release() = 0;\n\t// Returns a status code from SC_STATUS_*\n\tvirtual int SCI_METHOD AddData(char *data, int length) = 0;\n\tvirtual void * SCI_METHOD ConvertToDocument() = 0;\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/include/License.txt",
    "content": "License for Scintilla and SciTE\n\nCopyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n\nAll Rights Reserved \n\nPermission to use, copy, modify, and distribute this software and its \ndocumentation for any purpose and without fee is hereby granted, \nprovided that the above copyright notice appear in all copies and that \nboth that copyright notice and this permission notice appear in \nsupporting documentation. \n\nNEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS \nSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY \nAND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY \nSPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES \nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, \nWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER \nTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE \nOR PERFORMANCE OF THIS SOFTWARE. "
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/include/Platform.h",
    "content": "// Scintilla source code edit control\n/** @file Platform.h\n ** Interface to platform facilities. Also includes some basic utilities.\n ** Implemented in PlatGTK.cxx for GTK+/Linux, PlatWin.cxx for Windows, and PlatWX.cxx for wxWindows.\n **/\n// Copyright 1998-2009 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef PLATFORM_H\n#define PLATFORM_H\n\n// PLAT_GTK = GTK+ on Linux or Win32\n// PLAT_GTK_WIN32 is defined additionally when running PLAT_GTK under Win32\n// PLAT_WIN = Win32 API on Win32 OS\n// PLAT_WX is wxWindows on any supported platform\n// PLAT_TK = Tcl/TK on Linux or Win32\n\n#define PLAT_GTK 0\n#define PLAT_GTK_WIN32 0\n#define PLAT_GTK_MACOSX 0\n#define PLAT_MACOSX 0\n#define PLAT_WIN 0\n#define PLAT_WX  0\n#define PLAT_QT 0\n#define PLAT_FOX 0\n#define PLAT_CURSES 0\n#define PLAT_TK 0\n\n#if defined(FOX)\n#undef PLAT_FOX\n#define PLAT_FOX 1\n\n#elif defined(__WX__)\n#undef PLAT_WX\n#define PLAT_WX  1\n\n#elif defined(CURSES)\n#undef PLAT_CURSES\n#define PLAT_CURSES 1\n\n#elif defined(SCINTILLA_QT)\n#undef PLAT_QT\n#define PLAT_QT 1\n\n#include <Qsci/qsciglobal.h>\nQT_BEGIN_NAMESPACE\nclass QPainter;\nQT_END_NAMESPACE\n\n// This is needed to work around an HP-UX bug with Qt4.\n#include <qnamespace.h>\n\n#elif defined(TK)\n#undef PLAT_TK\n#define PLAT_TK 1\n\n#elif defined(GTK)\n#undef PLAT_GTK\n#define PLAT_GTK 1\n\n#if defined(__WIN32__) || defined(_MSC_VER)\n#undef PLAT_GTK_WIN32\n#define PLAT_GTK_WIN32 1\n#endif\n\n#if defined(__APPLE__)\n#undef PLAT_GTK_MACOSX\n#define PLAT_GTK_MACOSX 1\n#endif\n\n#elif defined(__APPLE__)\n\n#undef PLAT_MACOSX\n#define PLAT_MACOSX 1\n\n#else\n#undef PLAT_WIN\n#define PLAT_WIN 1\n\n#endif\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\ntypedef float XYPOSITION;\ntypedef double XYACCUMULATOR;\n//#define XYPOSITION int\n\n// Underlying the implementation of the platform classes are platform specific types.\n// Sometimes these need to be passed around by client code so they are defined here\n\ntypedef void *FontID;\ntypedef void *SurfaceID;\ntypedef void *WindowID;\ntypedef void *MenuID;\ntypedef void *TickerID;\ntypedef void *Function;\ntypedef void *IdlerID;\n\n/**\n * A geometric point class.\n * Point is exactly the same as the Win32 POINT and GTK+ GdkPoint so can be used interchangeably.\n */\nclass Point {\npublic:\n\tXYPOSITION x;\n\tXYPOSITION y;\n\n\texplicit Point(XYPOSITION x_=0, XYPOSITION y_=0) : x(x_), y(y_) {\n\t}\n\n\t// Other automatically defined methods (assignment, copy constructor, destructor) are fine\n\n\tstatic Point FromLong(long lpoint);\n};\n\n/**\n * A geometric rectangle class.\n * PRectangle is exactly the same as the Win32 RECT so can be used interchangeably.\n * PRectangles contain their top and left sides, but not their right and bottom sides.\n */\nclass PRectangle {\npublic:\n\tXYPOSITION left;\n\tXYPOSITION top;\n\tXYPOSITION right;\n\tXYPOSITION bottom;\n\n\tPRectangle(XYPOSITION left_=0, XYPOSITION top_=0, XYPOSITION right_=0, XYPOSITION bottom_ = 0) :\n\t\tleft(left_), top(top_), right(right_), bottom(bottom_) {\n\t}\n\n\t// Other automatically defined methods (assignment, copy constructor, destructor) are fine\n\n\tbool operator==(PRectangle &rc) const {\n\t\treturn (rc.left == left) && (rc.right == right) &&\n\t\t\t(rc.top == top) && (rc.bottom == bottom);\n\t}\n\tbool Contains(Point pt) const {\n\t\treturn (pt.x >= left) && (pt.x <= right) &&\n\t\t\t(pt.y >= top) && (pt.y <= bottom);\n\t}\n\tbool Contains(PRectangle rc) const {\n\t\treturn (rc.left >= left) && (rc.right <= right) &&\n\t\t\t(rc.top >= top) && (rc.bottom <= bottom);\n\t}\n\tbool Intersects(PRectangle other) const {\n\t\treturn (right > other.left) && (left < other.right) &&\n\t\t\t(bottom > other.top) && (top < other.bottom);\n\t}\n\tvoid Move(XYPOSITION xDelta, XYPOSITION yDelta) {\n\t\tleft += xDelta;\n\t\ttop += yDelta;\n\t\tright += xDelta;\n\t\tbottom += yDelta;\n\t}\n\tXYPOSITION Width() const { return right - left; }\n\tXYPOSITION Height() const { return bottom - top; }\n\tbool Empty() const {\n\t\treturn (Height() <= 0) || (Width() <= 0);\n\t}\n};\n\n/**\n * Holds a desired RGB colour.\n */\nclass ColourDesired {\n\tlong co;\npublic:\n\tColourDesired(long lcol=0) {\n\t\tco = lcol;\n\t}\n\n\tColourDesired(unsigned int red, unsigned int green, unsigned int blue) {\n\t\tSet(red, green, blue);\n\t}\n\n\tbool operator==(const ColourDesired &other) const {\n\t\treturn co == other.co;\n\t}\n\n\tvoid Set(long lcol) {\n\t\tco = lcol;\n\t}\n\n\tvoid Set(unsigned int red, unsigned int green, unsigned int blue) {\n\t\tco = red | (green << 8) | (blue << 16);\n\t}\n\n\tstatic inline unsigned int ValueOfHex(const char ch) {\n\t\tif (ch >= '0' && ch <= '9')\n\t\t\treturn ch - '0';\n\t\telse if (ch >= 'A' && ch <= 'F')\n\t\t\treturn ch - 'A' + 10;\n\t\telse if (ch >= 'a' && ch <= 'f')\n\t\t\treturn ch - 'a' + 10;\n\t\telse\n\t\t\treturn 0;\n\t}\n\n\tvoid Set(const char *val) {\n\t\tif (*val == '#') {\n\t\t\tval++;\n\t\t}\n\t\tunsigned int r = ValueOfHex(val[0]) * 16 + ValueOfHex(val[1]);\n\t\tunsigned int g = ValueOfHex(val[2]) * 16 + ValueOfHex(val[3]);\n\t\tunsigned int b = ValueOfHex(val[4]) * 16 + ValueOfHex(val[5]);\n\t\tSet(r, g, b);\n\t}\n\n\tlong AsLong() const {\n\t\treturn co;\n\t}\n\n\tunsigned int GetRed() const {\n\t\treturn co & 0xff;\n\t}\n\n\tunsigned int GetGreen() const {\n\t\treturn (co >> 8) & 0xff;\n\t}\n\n\tunsigned int GetBlue() const {\n\t\treturn (co >> 16) & 0xff;\n\t}\n};\n\n/**\n * Font management.\n */\n\nstruct FontParameters {\n\tconst char *faceName;\n\tfloat size;\n\tint weight;\n\tbool italic;\n\tint extraFontFlag;\n\tint technology;\n\tint characterSet;\n\n\tFontParameters(\n\t\tconst char *faceName_,\n\t\tfloat size_=10,\n\t\tint weight_=400,\n\t\tbool italic_=false,\n\t\tint extraFontFlag_=0,\n\t\tint technology_=0,\n\t\tint characterSet_=0) :\n\n\t\tfaceName(faceName_),\n\t\tsize(size_),\n\t\tweight(weight_),\n\t\titalic(italic_),\n\t\textraFontFlag(extraFontFlag_),\n\t\ttechnology(technology_),\n\t\tcharacterSet(characterSet_)\n\t{\n\t}\n\n};\n\nclass Font {\nprotected:\n\tFontID fid;\n#if PLAT_WX\n\tint ascent;\n#endif\n\t// Private so Font objects can not be copied\n\tFont(const Font &);\n\tFont &operator=(const Font &);\npublic:\n\tFont();\n\tvirtual ~Font();\n\n\tvirtual void Create(const FontParameters &fp);\n\tvirtual void Release();\n\n\tFontID GetID() { return fid; }\n\t// Alias another font - caller guarantees not to Release\n\tvoid SetID(FontID fid_) { fid = fid_; }\n#if PLAT_WX\n\tvoid SetAscent(int ascent_) { ascent = ascent_; }\n#endif\n\tfriend class Surface;\n\tfriend class SurfaceImpl;\n};\n\n/**\n * A surface abstracts a place to draw.\n */\n#if defined(PLAT_QT)\nclass XPM;\n#endif\nclass Surface {\nprivate:\n\t// Private so Surface objects can not be copied\n\tSurface(const Surface &) {}\n\tSurface &operator=(const Surface &) { return *this; }\npublic:\n\tSurface() {}\n\tvirtual ~Surface() {}\n\tstatic Surface *Allocate(int technology);\n\n\tvirtual void Init(WindowID wid)=0;\n\tvirtual void Init(SurfaceID sid, WindowID wid)=0;\n\tvirtual void InitPixMap(int width, int height, Surface *surface_, WindowID wid)=0;\n\n\tvirtual void Release()=0;\n\tvirtual bool Initialised()=0;\n\tvirtual void PenColour(ColourDesired fore)=0;\n\tvirtual int LogPixelsY()=0;\n\tvirtual int DeviceHeightFont(int points)=0;\n\tvirtual void MoveTo(int x_, int y_)=0;\n\tvirtual void LineTo(int x_, int y_)=0;\n\tvirtual void Polygon(Point *pts, int npts, ColourDesired fore, ColourDesired back)=0;\n\tvirtual void RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired back)=0;\n\tvirtual void FillRectangle(PRectangle rc, ColourDesired back)=0;\n\tvirtual void FillRectangle(PRectangle rc, Surface &surfacePattern)=0;\n\tvirtual void RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesired back)=0;\n\tvirtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill, int alphaFill,\n\t\tColourDesired outline, int alphaOutline, int flags)=0;\n\tvirtual void DrawRGBAImage(PRectangle rc, int width, int height, const unsigned char *pixelsImage) = 0;\n\tvirtual void Ellipse(PRectangle rc, ColourDesired fore, ColourDesired back)=0;\n\tvirtual void Copy(PRectangle rc, Point from, Surface &surfaceSource)=0;\n\n\tvirtual void DrawTextNoClip(PRectangle rc, Font &font_, XYPOSITION ybase, const char *s, int len, ColourDesired fore, ColourDesired back)=0;\n\tvirtual void DrawTextClipped(PRectangle rc, Font &font_, XYPOSITION ybase, const char *s, int len, ColourDesired fore, ColourDesired back)=0;\n\tvirtual void DrawTextTransparent(PRectangle rc, Font &font_, XYPOSITION ybase, const char *s, int len, ColourDesired fore)=0;\n\tvirtual void MeasureWidths(Font &font_, const char *s, int len, XYPOSITION *positions)=0;\n\tvirtual XYPOSITION WidthText(Font &font_, const char *s, int len)=0;\n\tvirtual XYPOSITION WidthChar(Font &font_, char ch)=0;\n\tvirtual XYPOSITION Ascent(Font &font_)=0;\n\tvirtual XYPOSITION Descent(Font &font_)=0;\n\tvirtual XYPOSITION InternalLeading(Font &font_)=0;\n\tvirtual XYPOSITION ExternalLeading(Font &font_)=0;\n\tvirtual XYPOSITION Height(Font &font_)=0;\n\tvirtual XYPOSITION AverageCharWidth(Font &font_)=0;\n\n\tvirtual void SetClip(PRectangle rc)=0;\n\tvirtual void FlushCachedState()=0;\n\n\tvirtual void SetUnicodeMode(bool unicodeMode_)=0;\n\tvirtual void SetDBCSMode(int codePage)=0;\n\n#if defined(PLAT_QT)\n    virtual void Init(QPainter *p)=0;\n    virtual void DrawXPM(PRectangle rc, const XPM *xpm)=0;\n#endif\n};\n\n/**\n * A simple callback action passing one piece of untyped user data.\n */\ntypedef void (*CallBackAction)(void*);\n\n/**\n * Class to hide the details of window manipulation.\n * Does not own the window which will normally have a longer life than this object.\n */\nclass Window {\nprotected:\n\tWindowID wid;\npublic:\n\tWindow() : wid(0), cursorLast(cursorInvalid) {\n\t}\n\tWindow(const Window &source) : wid(source.wid), cursorLast(cursorInvalid) {\n\t}\n\tvirtual ~Window();\n\tWindow &operator=(WindowID wid_) {\n\t\twid = wid_;\n\t\treturn *this;\n\t}\n\tWindowID GetID() const { return wid; }\n\tbool Created() const { return wid != 0; }\n\tvoid Destroy();\n\tbool HasFocus();\n\tPRectangle GetPosition();\n\tvoid SetPosition(PRectangle rc);\n\tvoid SetPositionRelative(PRectangle rc, Window relativeTo);\n\tPRectangle GetClientPosition();\n\tvoid Show(bool show=true);\n\tvoid InvalidateAll();\n\tvoid InvalidateRectangle(PRectangle rc);\n\tvirtual void SetFont(Font &font);\n\tenum Cursor { cursorInvalid, cursorText, cursorArrow, cursorUp, cursorWait, cursorHoriz, cursorVert, cursorReverseArrow, cursorHand };\n\tvoid SetCursor(Cursor curs);\n\tvoid SetTitle(const char *s);\n\tPRectangle GetMonitorRect(Point pt);\nprivate:\n\tCursor cursorLast;\n};\n\n/**\n * Listbox management.\n */\n\nclass ListBox : public Window {\npublic:\n\tListBox();\n\tvirtual ~ListBox();\n\tstatic ListBox *Allocate();\n\n\tvirtual void SetFont(Font &font)=0;\n\tvirtual void Create(Window &parent, int ctrlID, Point location, int lineHeight_, bool unicodeMode_, int technology_)=0;\n\tvirtual void SetAverageCharWidth(int width)=0;\n\tvirtual void SetVisibleRows(int rows)=0;\n\tvirtual int GetVisibleRows() const=0;\n\tvirtual PRectangle GetDesiredRect()=0;\n\tvirtual int CaretFromEdge()=0;\n\tvirtual void Clear()=0;\n\tvirtual void Append(char *s, int type = -1)=0;\n\tvirtual int Length()=0;\n\tvirtual void Select(int n)=0;\n\tvirtual int GetSelection()=0;\n\tvirtual int Find(const char *prefix)=0;\n\tvirtual void GetValue(int n, char *value, int len)=0;\n\tvirtual void RegisterImage(int type, const char *xpm_data)=0;\n\tvirtual void RegisterRGBAImage(int type, int width, int height, const unsigned char *pixelsImage) = 0;\n\tvirtual void ClearRegisteredImages()=0;\n\tvirtual void SetDoubleClickAction(CallBackAction, void *)=0;\n\tvirtual void SetList(const char* list, char separator, char typesep)=0;\n};\n\n/**\n * Menu management.\n */\nclass Menu {\n\tMenuID mid;\npublic:\n\tMenu();\n\tMenuID GetID() { return mid; }\n\tvoid CreatePopUp();\n\tvoid Destroy();\n\tvoid Show(Point pt, Window &w);\n};\n\nclass ElapsedTime {\n\tlong bigBit;\n\tlong littleBit;\npublic:\n\tElapsedTime();\n\tdouble Duration(bool reset=false);\n};\n\n/**\n * Dynamic Library (DLL/SO/...) loading\n */\nclass DynamicLibrary {\npublic:\n\tvirtual ~DynamicLibrary() {}\n\n\t/// @return Pointer to function \"name\", or NULL on failure.\n\tvirtual Function FindFunction(const char *name) = 0;\n\n\t/// @return true if the library was loaded successfully.\n\tvirtual bool IsValid() = 0;\n\n\t/// @return An instance of a DynamicLibrary subclass with \"modulePath\" loaded.\n\tstatic DynamicLibrary *Load(const char *modulePath);\n};\n\n/**\n * Platform class used to retrieve system wide parameters such as double click speed\n * and chrome colour. Not a creatable object, more of a module with several functions.\n */\nclass Platform {\n\t// Private so Platform objects can not be copied\n\tPlatform(const Platform &) {}\n\tPlatform &operator=(const Platform &) { return *this; }\npublic:\n\t// Should be private because no new Platforms are ever created\n\t// but gcc warns about this\n\tPlatform() {}\n\t~Platform() {}\n\tstatic ColourDesired Chrome();\n\tstatic ColourDesired ChromeHighlight();\n\tstatic const char *DefaultFont();\n\tstatic int DefaultFontSize();\n\tstatic unsigned int DoubleClickTime();\n\tstatic bool MouseButtonBounce();\n\tstatic void DebugDisplay(const char *s);\n\tstatic bool IsKeyDown(int key);\n\tstatic long SendScintilla(\n\t\tWindowID w, unsigned int msg, unsigned long wParam=0, long lParam=0);\n\tstatic long SendScintillaPointer(\n\t\tWindowID w, unsigned int msg, unsigned long wParam=0, void *lParam=0);\n\tstatic bool IsDBCSLeadByte(int codePage, char ch);\n\tstatic int DBCSCharLength(int codePage, const char *s);\n\tstatic int DBCSCharMaxLength();\n\n\t// These are utility functions not really tied to a platform\n\tstatic int Minimum(int a, int b);\n\tstatic int Maximum(int a, int b);\n\t// Next three assume 16 bit shorts and 32 bit longs\n\tstatic long LongFromTwoShorts(short a,short b) {\n\t\treturn (a) | ((b) << 16);\n\t}\n\tstatic short HighShortFromLong(long x) {\n\t\treturn static_cast<short>(x >> 16);\n\t}\n\tstatic short LowShortFromLong(long x) {\n\t\treturn static_cast<short>(x & 0xffff);\n\t}\n\tstatic void DebugPrintf(const char *format, ...);\n\tstatic bool ShowAssertionPopUps(bool assertionPopUps_);\n\tstatic void Assert(const char *c, const char *file, int line);\n\tstatic int Clamp(int val, int minVal, int maxVal);\n};\n\n#ifdef  NDEBUG\n#define PLATFORM_ASSERT(c) ((void)0)\n#else\n#ifdef SCI_NAMESPACE\n#define PLATFORM_ASSERT(c) ((c) ? (void)(0) : Scintilla::Platform::Assert(#c, __FILE__, __LINE__))\n#else\n#define PLATFORM_ASSERT(c) ((c) ? (void)(0) : Platform::Assert(#c, __FILE__, __LINE__))\n#endif\n#endif\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n// Shut up annoying Visual C++ warnings:\n#ifdef _MSC_VER\n#pragma warning(disable: 4244 4309 4514 4710)\n#endif\n\n#if defined(__GNUC__) && defined(SCINTILLA_QT)\n#pragma GCC diagnostic ignored \"-Wmissing-field-initializers\"\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/include/SciLexer.h",
    "content": "/* Scintilla source code edit control */\n/** @file SciLexer.h\n ** Interface to the added lexer functions in the SciLexer version of the edit control.\n **/\n/* Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\n * The License.txt file describes the conditions under which this software may be distributed. */\n\n/* Most of this file is automatically generated from the Scintilla.iface interface definition\n * file which contains any comments about the definitions. HFacer.py does the generation. */\n\n#ifndef SCILEXER_H\n#define SCILEXER_H\n\n/* SciLexer features - not in standard Scintilla */\n\n/* ++Autogenerated -- start of section automatically generated from Scintilla.iface */\n#define SCLEX_CONTAINER 0\n#define SCLEX_NULL 1\n#define SCLEX_PYTHON 2\n#define SCLEX_CPP 3\n#define SCLEX_HTML 4\n#define SCLEX_XML 5\n#define SCLEX_PERL 6\n#define SCLEX_SQL 7\n#define SCLEX_VB 8\n#define SCLEX_PROPERTIES 9\n#define SCLEX_ERRORLIST 10\n#define SCLEX_MAKEFILE 11\n#define SCLEX_BATCH 12\n#define SCLEX_XCODE 13\n#define SCLEX_LATEX 14\n#define SCLEX_LUA 15\n#define SCLEX_DIFF 16\n#define SCLEX_CONF 17\n#define SCLEX_PASCAL 18\n#define SCLEX_AVE 19\n#define SCLEX_ADA 20\n#define SCLEX_LISP 21\n#define SCLEX_RUBY 22\n#define SCLEX_EIFFEL 23\n#define SCLEX_EIFFELKW 24\n#define SCLEX_TCL 25\n#define SCLEX_NNCRONTAB 26\n#define SCLEX_BULLANT 27\n#define SCLEX_VBSCRIPT 28\n#define SCLEX_BAAN 31\n#define SCLEX_MATLAB 32\n#define SCLEX_SCRIPTOL 33\n#define SCLEX_ASM 34\n#define SCLEX_CPPNOCASE 35\n#define SCLEX_FORTRAN 36\n#define SCLEX_F77 37\n#define SCLEX_CSS 38\n#define SCLEX_POV 39\n#define SCLEX_LOUT 40\n#define SCLEX_ESCRIPT 41\n#define SCLEX_PS 42\n#define SCLEX_NSIS 43\n#define SCLEX_MMIXAL 44\n#define SCLEX_CLW 45\n#define SCLEX_CLWNOCASE 46\n#define SCLEX_LOT 47\n#define SCLEX_YAML 48\n#define SCLEX_TEX 49\n#define SCLEX_METAPOST 50\n#define SCLEX_POWERBASIC 51\n#define SCLEX_FORTH 52\n#define SCLEX_ERLANG 53\n#define SCLEX_OCTAVE 54\n#define SCLEX_MSSQL 55\n#define SCLEX_VERILOG 56\n#define SCLEX_KIX 57\n#define SCLEX_GUI4CLI 58\n#define SCLEX_SPECMAN 59\n#define SCLEX_AU3 60\n#define SCLEX_APDL 61\n#define SCLEX_BASH 62\n#define SCLEX_ASN1 63\n#define SCLEX_VHDL 64\n#define SCLEX_CAML 65\n#define SCLEX_BLITZBASIC 66\n#define SCLEX_PUREBASIC 67\n#define SCLEX_HASKELL 68\n#define SCLEX_PHPSCRIPT 69\n#define SCLEX_TADS3 70\n#define SCLEX_REBOL 71\n#define SCLEX_SMALLTALK 72\n#define SCLEX_FLAGSHIP 73\n#define SCLEX_CSOUND 74\n#define SCLEX_FREEBASIC 75\n#define SCLEX_INNOSETUP 76\n#define SCLEX_OPAL 77\n#define SCLEX_SPICE 78\n#define SCLEX_D 79\n#define SCLEX_CMAKE 80\n#define SCLEX_GAP 81\n#define SCLEX_PLM 82\n#define SCLEX_PROGRESS 83\n#define SCLEX_ABAQUS 84\n#define SCLEX_ASYMPTOTE 85\n#define SCLEX_R 86\n#define SCLEX_MAGIK 87\n#define SCLEX_POWERSHELL 88\n#define SCLEX_MYSQL 89\n#define SCLEX_PO 90\n#define SCLEX_TAL 91\n#define SCLEX_COBOL 92\n#define SCLEX_TACL 93\n#define SCLEX_SORCUS 94\n#define SCLEX_POWERPRO 95\n#define SCLEX_NIMROD 96\n#define SCLEX_SML 97\n#define SCLEX_MARKDOWN 98\n#define SCLEX_TXT2TAGS 99\n#define SCLEX_A68K 100\n#define SCLEX_MODULA 101\n#define SCLEX_COFFEESCRIPT 102\n#define SCLEX_TCMD 103\n#define SCLEX_AVS 104\n#define SCLEX_ECL 105\n#define SCLEX_OSCRIPT 106\n#define SCLEX_VISUALPROLOG 107\n#define SCLEX_LITERATEHASKELL 108\n#define SCLEX_STTXT 109\n#define SCLEX_KVIRC 110\n#define SCLEX_RUST 111\n#define SCLEX_AUTOMATIC 1000\n#define SCE_P_DEFAULT 0\n#define SCE_P_COMMENTLINE 1\n#define SCE_P_NUMBER 2\n#define SCE_P_STRING 3\n#define SCE_P_CHARACTER 4\n#define SCE_P_WORD 5\n#define SCE_P_TRIPLE 6\n#define SCE_P_TRIPLEDOUBLE 7\n#define SCE_P_CLASSNAME 8\n#define SCE_P_DEFNAME 9\n#define SCE_P_OPERATOR 10\n#define SCE_P_IDENTIFIER 11\n#define SCE_P_COMMENTBLOCK 12\n#define SCE_P_STRINGEOL 13\n#define SCE_P_WORD2 14\n#define SCE_P_DECORATOR 15\n#define SCE_C_DEFAULT 0\n#define SCE_C_COMMENT 1\n#define SCE_C_COMMENTLINE 2\n#define SCE_C_COMMENTDOC 3\n#define SCE_C_NUMBER 4\n#define SCE_C_WORD 5\n#define SCE_C_STRING 6\n#define SCE_C_CHARACTER 7\n#define SCE_C_UUID 8\n#define SCE_C_PREPROCESSOR 9\n#define SCE_C_OPERATOR 10\n#define SCE_C_IDENTIFIER 11\n#define SCE_C_STRINGEOL 12\n#define SCE_C_VERBATIM 13\n#define SCE_C_REGEX 14\n#define SCE_C_COMMENTLINEDOC 15\n#define SCE_C_WORD2 16\n#define SCE_C_COMMENTDOCKEYWORD 17\n#define SCE_C_COMMENTDOCKEYWORDERROR 18\n#define SCE_C_GLOBALCLASS 19\n#define SCE_C_STRINGRAW 20\n#define SCE_C_TRIPLEVERBATIM 21\n#define SCE_C_HASHQUOTEDSTRING 22\n#define SCE_C_PREPROCESSORCOMMENT 23\n#define SCE_C_PREPROCESSORCOMMENTDOC 24\n#define SCE_D_DEFAULT 0\n#define SCE_D_COMMENT 1\n#define SCE_D_COMMENTLINE 2\n#define SCE_D_COMMENTDOC 3\n#define SCE_D_COMMENTNESTED 4\n#define SCE_D_NUMBER 5\n#define SCE_D_WORD 6\n#define SCE_D_WORD2 7\n#define SCE_D_WORD3 8\n#define SCE_D_TYPEDEF 9\n#define SCE_D_STRING 10\n#define SCE_D_STRINGEOL 11\n#define SCE_D_CHARACTER 12\n#define SCE_D_OPERATOR 13\n#define SCE_D_IDENTIFIER 14\n#define SCE_D_COMMENTLINEDOC 15\n#define SCE_D_COMMENTDOCKEYWORD 16\n#define SCE_D_COMMENTDOCKEYWORDERROR 17\n#define SCE_D_STRINGB 18\n#define SCE_D_STRINGR 19\n#define SCE_D_WORD5 20\n#define SCE_D_WORD6 21\n#define SCE_D_WORD7 22\n#define SCE_TCL_DEFAULT 0\n#define SCE_TCL_COMMENT 1\n#define SCE_TCL_COMMENTLINE 2\n#define SCE_TCL_NUMBER 3\n#define SCE_TCL_WORD_IN_QUOTE 4\n#define SCE_TCL_IN_QUOTE 5\n#define SCE_TCL_OPERATOR 6\n#define SCE_TCL_IDENTIFIER 7\n#define SCE_TCL_SUBSTITUTION 8\n#define SCE_TCL_SUB_BRACE 9\n#define SCE_TCL_MODIFIER 10\n#define SCE_TCL_EXPAND 11\n#define SCE_TCL_WORD 12\n#define SCE_TCL_WORD2 13\n#define SCE_TCL_WORD3 14\n#define SCE_TCL_WORD4 15\n#define SCE_TCL_WORD5 16\n#define SCE_TCL_WORD6 17\n#define SCE_TCL_WORD7 18\n#define SCE_TCL_WORD8 19\n#define SCE_TCL_COMMENT_BOX 20\n#define SCE_TCL_BLOCK_COMMENT 21\n#define SCE_H_DEFAULT 0\n#define SCE_H_TAG 1\n#define SCE_H_TAGUNKNOWN 2\n#define SCE_H_ATTRIBUTE 3\n#define SCE_H_ATTRIBUTEUNKNOWN 4\n#define SCE_H_NUMBER 5\n#define SCE_H_DOUBLESTRING 6\n#define SCE_H_SINGLESTRING 7\n#define SCE_H_OTHER 8\n#define SCE_H_COMMENT 9\n#define SCE_H_ENTITY 10\n#define SCE_H_TAGEND 11\n#define SCE_H_XMLSTART 12\n#define SCE_H_XMLEND 13\n#define SCE_H_SCRIPT 14\n#define SCE_H_ASP 15\n#define SCE_H_ASPAT 16\n#define SCE_H_CDATA 17\n#define SCE_H_QUESTION 18\n#define SCE_H_VALUE 19\n#define SCE_H_XCCOMMENT 20\n#define SCE_H_SGML_DEFAULT 21\n#define SCE_H_SGML_COMMAND 22\n#define SCE_H_SGML_1ST_PARAM 23\n#define SCE_H_SGML_DOUBLESTRING 24\n#define SCE_H_SGML_SIMPLESTRING 25\n#define SCE_H_SGML_ERROR 26\n#define SCE_H_SGML_SPECIAL 27\n#define SCE_H_SGML_ENTITY 28\n#define SCE_H_SGML_COMMENT 29\n#define SCE_H_SGML_1ST_PARAM_COMMENT 30\n#define SCE_H_SGML_BLOCK_DEFAULT 31\n#define SCE_HJ_START 40\n#define SCE_HJ_DEFAULT 41\n#define SCE_HJ_COMMENT 42\n#define SCE_HJ_COMMENTLINE 43\n#define SCE_HJ_COMMENTDOC 44\n#define SCE_HJ_NUMBER 45\n#define SCE_HJ_WORD 46\n#define SCE_HJ_KEYWORD 47\n#define SCE_HJ_DOUBLESTRING 48\n#define SCE_HJ_SINGLESTRING 49\n#define SCE_HJ_SYMBOLS 50\n#define SCE_HJ_STRINGEOL 51\n#define SCE_HJ_REGEX 52\n#define SCE_HJA_START 55\n#define SCE_HJA_DEFAULT 56\n#define SCE_HJA_COMMENT 57\n#define SCE_HJA_COMMENTLINE 58\n#define SCE_HJA_COMMENTDOC 59\n#define SCE_HJA_NUMBER 60\n#define SCE_HJA_WORD 61\n#define SCE_HJA_KEYWORD 62\n#define SCE_HJA_DOUBLESTRING 63\n#define SCE_HJA_SINGLESTRING 64\n#define SCE_HJA_SYMBOLS 65\n#define SCE_HJA_STRINGEOL 66\n#define SCE_HJA_REGEX 67\n#define SCE_HB_START 70\n#define SCE_HB_DEFAULT 71\n#define SCE_HB_COMMENTLINE 72\n#define SCE_HB_NUMBER 73\n#define SCE_HB_WORD 74\n#define SCE_HB_STRING 75\n#define SCE_HB_IDENTIFIER 76\n#define SCE_HB_STRINGEOL 77\n#define SCE_HBA_START 80\n#define SCE_HBA_DEFAULT 81\n#define SCE_HBA_COMMENTLINE 82\n#define SCE_HBA_NUMBER 83\n#define SCE_HBA_WORD 84\n#define SCE_HBA_STRING 85\n#define SCE_HBA_IDENTIFIER 86\n#define SCE_HBA_STRINGEOL 87\n#define SCE_HP_START 90\n#define SCE_HP_DEFAULT 91\n#define SCE_HP_COMMENTLINE 92\n#define SCE_HP_NUMBER 93\n#define SCE_HP_STRING 94\n#define SCE_HP_CHARACTER 95\n#define SCE_HP_WORD 96\n#define SCE_HP_TRIPLE 97\n#define SCE_HP_TRIPLEDOUBLE 98\n#define SCE_HP_CLASSNAME 99\n#define SCE_HP_DEFNAME 100\n#define SCE_HP_OPERATOR 101\n#define SCE_HP_IDENTIFIER 102\n#define SCE_HPHP_COMPLEX_VARIABLE 104\n#define SCE_HPA_START 105\n#define SCE_HPA_DEFAULT 106\n#define SCE_HPA_COMMENTLINE 107\n#define SCE_HPA_NUMBER 108\n#define SCE_HPA_STRING 109\n#define SCE_HPA_CHARACTER 110\n#define SCE_HPA_WORD 111\n#define SCE_HPA_TRIPLE 112\n#define SCE_HPA_TRIPLEDOUBLE 113\n#define SCE_HPA_CLASSNAME 114\n#define SCE_HPA_DEFNAME 115\n#define SCE_HPA_OPERATOR 116\n#define SCE_HPA_IDENTIFIER 117\n#define SCE_HPHP_DEFAULT 118\n#define SCE_HPHP_HSTRING 119\n#define SCE_HPHP_SIMPLESTRING 120\n#define SCE_HPHP_WORD 121\n#define SCE_HPHP_NUMBER 122\n#define SCE_HPHP_VARIABLE 123\n#define SCE_HPHP_COMMENT 124\n#define SCE_HPHP_COMMENTLINE 125\n#define SCE_HPHP_HSTRING_VARIABLE 126\n#define SCE_HPHP_OPERATOR 127\n#define SCE_PL_DEFAULT 0\n#define SCE_PL_ERROR 1\n#define SCE_PL_COMMENTLINE 2\n#define SCE_PL_POD 3\n#define SCE_PL_NUMBER 4\n#define SCE_PL_WORD 5\n#define SCE_PL_STRING 6\n#define SCE_PL_CHARACTER 7\n#define SCE_PL_PUNCTUATION 8\n#define SCE_PL_PREPROCESSOR 9\n#define SCE_PL_OPERATOR 10\n#define SCE_PL_IDENTIFIER 11\n#define SCE_PL_SCALAR 12\n#define SCE_PL_ARRAY 13\n#define SCE_PL_HASH 14\n#define SCE_PL_SYMBOLTABLE 15\n#define SCE_PL_VARIABLE_INDEXER 16\n#define SCE_PL_REGEX 17\n#define SCE_PL_REGSUBST 18\n#define SCE_PL_LONGQUOTE 19\n#define SCE_PL_BACKTICKS 20\n#define SCE_PL_DATASECTION 21\n#define SCE_PL_HERE_DELIM 22\n#define SCE_PL_HERE_Q 23\n#define SCE_PL_HERE_QQ 24\n#define SCE_PL_HERE_QX 25\n#define SCE_PL_STRING_Q 26\n#define SCE_PL_STRING_QQ 27\n#define SCE_PL_STRING_QX 28\n#define SCE_PL_STRING_QR 29\n#define SCE_PL_STRING_QW 30\n#define SCE_PL_POD_VERB 31\n#define SCE_PL_SUB_PROTOTYPE 40\n#define SCE_PL_FORMAT_IDENT 41\n#define SCE_PL_FORMAT 42\n#define SCE_PL_STRING_VAR 43\n#define SCE_PL_XLAT 44\n#define SCE_PL_REGEX_VAR 54\n#define SCE_PL_REGSUBST_VAR 55\n#define SCE_PL_BACKTICKS_VAR 57\n#define SCE_PL_HERE_QQ_VAR 61\n#define SCE_PL_HERE_QX_VAR 62\n#define SCE_PL_STRING_QQ_VAR 64\n#define SCE_PL_STRING_QX_VAR 65\n#define SCE_PL_STRING_QR_VAR 66\n#define SCE_RB_DEFAULT 0\n#define SCE_RB_ERROR 1\n#define SCE_RB_COMMENTLINE 2\n#define SCE_RB_POD 3\n#define SCE_RB_NUMBER 4\n#define SCE_RB_WORD 5\n#define SCE_RB_STRING 6\n#define SCE_RB_CHARACTER 7\n#define SCE_RB_CLASSNAME 8\n#define SCE_RB_DEFNAME 9\n#define SCE_RB_OPERATOR 10\n#define SCE_RB_IDENTIFIER 11\n#define SCE_RB_REGEX 12\n#define SCE_RB_GLOBAL 13\n#define SCE_RB_SYMBOL 14\n#define SCE_RB_MODULE_NAME 15\n#define SCE_RB_INSTANCE_VAR 16\n#define SCE_RB_CLASS_VAR 17\n#define SCE_RB_BACKTICKS 18\n#define SCE_RB_DATASECTION 19\n#define SCE_RB_HERE_DELIM 20\n#define SCE_RB_HERE_Q 21\n#define SCE_RB_HERE_QQ 22\n#define SCE_RB_HERE_QX 23\n#define SCE_RB_STRING_Q 24\n#define SCE_RB_STRING_QQ 25\n#define SCE_RB_STRING_QX 26\n#define SCE_RB_STRING_QR 27\n#define SCE_RB_STRING_QW 28\n#define SCE_RB_WORD_DEMOTED 29\n#define SCE_RB_STDIN 30\n#define SCE_RB_STDOUT 31\n#define SCE_RB_STDERR 40\n#define SCE_RB_UPPER_BOUND 41\n#define SCE_B_DEFAULT 0\n#define SCE_B_COMMENT 1\n#define SCE_B_NUMBER 2\n#define SCE_B_KEYWORD 3\n#define SCE_B_STRING 4\n#define SCE_B_PREPROCESSOR 5\n#define SCE_B_OPERATOR 6\n#define SCE_B_IDENTIFIER 7\n#define SCE_B_DATE 8\n#define SCE_B_STRINGEOL 9\n#define SCE_B_KEYWORD2 10\n#define SCE_B_KEYWORD3 11\n#define SCE_B_KEYWORD4 12\n#define SCE_B_CONSTANT 13\n#define SCE_B_ASM 14\n#define SCE_B_LABEL 15\n#define SCE_B_ERROR 16\n#define SCE_B_HEXNUMBER 17\n#define SCE_B_BINNUMBER 18\n#define SCE_PROPS_DEFAULT 0\n#define SCE_PROPS_COMMENT 1\n#define SCE_PROPS_SECTION 2\n#define SCE_PROPS_ASSIGNMENT 3\n#define SCE_PROPS_DEFVAL 4\n#define SCE_PROPS_KEY 5\n#define SCE_L_DEFAULT 0\n#define SCE_L_COMMAND 1\n#define SCE_L_TAG 2\n#define SCE_L_MATH 3\n#define SCE_L_COMMENT 4\n#define SCE_L_TAG2 5\n#define SCE_L_MATH2 6\n#define SCE_L_COMMENT2 7\n#define SCE_L_VERBATIM 8\n#define SCE_L_SHORTCMD 9\n#define SCE_L_SPECIAL 10\n#define SCE_L_CMDOPT 11\n#define SCE_L_ERROR 12\n#define SCE_LUA_DEFAULT 0\n#define SCE_LUA_COMMENT 1\n#define SCE_LUA_COMMENTLINE 2\n#define SCE_LUA_COMMENTDOC 3\n#define SCE_LUA_NUMBER 4\n#define SCE_LUA_WORD 5\n#define SCE_LUA_STRING 6\n#define SCE_LUA_CHARACTER 7\n#define SCE_LUA_LITERALSTRING 8\n#define SCE_LUA_PREPROCESSOR 9\n#define SCE_LUA_OPERATOR 10\n#define SCE_LUA_IDENTIFIER 11\n#define SCE_LUA_STRINGEOL 12\n#define SCE_LUA_WORD2 13\n#define SCE_LUA_WORD3 14\n#define SCE_LUA_WORD4 15\n#define SCE_LUA_WORD5 16\n#define SCE_LUA_WORD6 17\n#define SCE_LUA_WORD7 18\n#define SCE_LUA_WORD8 19\n#define SCE_LUA_LABEL 20\n#define SCE_ERR_DEFAULT 0\n#define SCE_ERR_PYTHON 1\n#define SCE_ERR_GCC 2\n#define SCE_ERR_MS 3\n#define SCE_ERR_CMD 4\n#define SCE_ERR_BORLAND 5\n#define SCE_ERR_PERL 6\n#define SCE_ERR_NET 7\n#define SCE_ERR_LUA 8\n#define SCE_ERR_CTAG 9\n#define SCE_ERR_DIFF_CHANGED 10\n#define SCE_ERR_DIFF_ADDITION 11\n#define SCE_ERR_DIFF_DELETION 12\n#define SCE_ERR_DIFF_MESSAGE 13\n#define SCE_ERR_PHP 14\n#define SCE_ERR_ELF 15\n#define SCE_ERR_IFC 16\n#define SCE_ERR_IFORT 17\n#define SCE_ERR_ABSF 18\n#define SCE_ERR_TIDY 19\n#define SCE_ERR_JAVA_STACK 20\n#define SCE_ERR_VALUE 21\n#define SCE_ERR_GCC_INCLUDED_FROM 22\n#define SCE_BAT_DEFAULT 0\n#define SCE_BAT_COMMENT 1\n#define SCE_BAT_WORD 2\n#define SCE_BAT_LABEL 3\n#define SCE_BAT_HIDE 4\n#define SCE_BAT_COMMAND 5\n#define SCE_BAT_IDENTIFIER 6\n#define SCE_BAT_OPERATOR 7\n#define SCE_TCMD_DEFAULT 0\n#define SCE_TCMD_COMMENT 1\n#define SCE_TCMD_WORD 2\n#define SCE_TCMD_LABEL 3\n#define SCE_TCMD_HIDE 4\n#define SCE_TCMD_COMMAND 5\n#define SCE_TCMD_IDENTIFIER 6\n#define SCE_TCMD_OPERATOR 7\n#define SCE_TCMD_ENVIRONMENT 8\n#define SCE_TCMD_EXPANSION 9\n#define SCE_TCMD_CLABEL 10\n#define SCE_MAKE_DEFAULT 0\n#define SCE_MAKE_COMMENT 1\n#define SCE_MAKE_PREPROCESSOR 2\n#define SCE_MAKE_IDENTIFIER 3\n#define SCE_MAKE_OPERATOR 4\n#define SCE_MAKE_TARGET 5\n#define SCE_MAKE_IDEOL 9\n#define SCE_DIFF_DEFAULT 0\n#define SCE_DIFF_COMMENT 1\n#define SCE_DIFF_COMMAND 2\n#define SCE_DIFF_HEADER 3\n#define SCE_DIFF_POSITION 4\n#define SCE_DIFF_DELETED 5\n#define SCE_DIFF_ADDED 6\n#define SCE_DIFF_CHANGED 7\n#define SCE_CONF_DEFAULT 0\n#define SCE_CONF_COMMENT 1\n#define SCE_CONF_NUMBER 2\n#define SCE_CONF_IDENTIFIER 3\n#define SCE_CONF_EXTENSION 4\n#define SCE_CONF_PARAMETER 5\n#define SCE_CONF_STRING 6\n#define SCE_CONF_OPERATOR 7\n#define SCE_CONF_IP 8\n#define SCE_CONF_DIRECTIVE 9\n#define SCE_AVE_DEFAULT 0\n#define SCE_AVE_COMMENT 1\n#define SCE_AVE_NUMBER 2\n#define SCE_AVE_WORD 3\n#define SCE_AVE_STRING 6\n#define SCE_AVE_ENUM 7\n#define SCE_AVE_STRINGEOL 8\n#define SCE_AVE_IDENTIFIER 9\n#define SCE_AVE_OPERATOR 10\n#define SCE_AVE_WORD1 11\n#define SCE_AVE_WORD2 12\n#define SCE_AVE_WORD3 13\n#define SCE_AVE_WORD4 14\n#define SCE_AVE_WORD5 15\n#define SCE_AVE_WORD6 16\n#define SCE_ADA_DEFAULT 0\n#define SCE_ADA_WORD 1\n#define SCE_ADA_IDENTIFIER 2\n#define SCE_ADA_NUMBER 3\n#define SCE_ADA_DELIMITER 4\n#define SCE_ADA_CHARACTER 5\n#define SCE_ADA_CHARACTEREOL 6\n#define SCE_ADA_STRING 7\n#define SCE_ADA_STRINGEOL 8\n#define SCE_ADA_LABEL 9\n#define SCE_ADA_COMMENTLINE 10\n#define SCE_ADA_ILLEGAL 11\n#define SCE_BAAN_DEFAULT 0\n#define SCE_BAAN_COMMENT 1\n#define SCE_BAAN_COMMENTDOC 2\n#define SCE_BAAN_NUMBER 3\n#define SCE_BAAN_WORD 4\n#define SCE_BAAN_STRING 5\n#define SCE_BAAN_PREPROCESSOR 6\n#define SCE_BAAN_OPERATOR 7\n#define SCE_BAAN_IDENTIFIER 8\n#define SCE_BAAN_STRINGEOL 9\n#define SCE_BAAN_WORD2 10\n#define SCE_LISP_DEFAULT 0\n#define SCE_LISP_COMMENT 1\n#define SCE_LISP_NUMBER 2\n#define SCE_LISP_KEYWORD 3\n#define SCE_LISP_KEYWORD_KW 4\n#define SCE_LISP_SYMBOL 5\n#define SCE_LISP_STRING 6\n#define SCE_LISP_STRINGEOL 8\n#define SCE_LISP_IDENTIFIER 9\n#define SCE_LISP_OPERATOR 10\n#define SCE_LISP_SPECIAL 11\n#define SCE_LISP_MULTI_COMMENT 12\n#define SCE_EIFFEL_DEFAULT 0\n#define SCE_EIFFEL_COMMENTLINE 1\n#define SCE_EIFFEL_NUMBER 2\n#define SCE_EIFFEL_WORD 3\n#define SCE_EIFFEL_STRING 4\n#define SCE_EIFFEL_CHARACTER 5\n#define SCE_EIFFEL_OPERATOR 6\n#define SCE_EIFFEL_IDENTIFIER 7\n#define SCE_EIFFEL_STRINGEOL 8\n#define SCE_NNCRONTAB_DEFAULT 0\n#define SCE_NNCRONTAB_COMMENT 1\n#define SCE_NNCRONTAB_TASK 2\n#define SCE_NNCRONTAB_SECTION 3\n#define SCE_NNCRONTAB_KEYWORD 4\n#define SCE_NNCRONTAB_MODIFIER 5\n#define SCE_NNCRONTAB_ASTERISK 6\n#define SCE_NNCRONTAB_NUMBER 7\n#define SCE_NNCRONTAB_STRING 8\n#define SCE_NNCRONTAB_ENVIRONMENT 9\n#define SCE_NNCRONTAB_IDENTIFIER 10\n#define SCE_FORTH_DEFAULT 0\n#define SCE_FORTH_COMMENT 1\n#define SCE_FORTH_COMMENT_ML 2\n#define SCE_FORTH_IDENTIFIER 3\n#define SCE_FORTH_CONTROL 4\n#define SCE_FORTH_KEYWORD 5\n#define SCE_FORTH_DEFWORD 6\n#define SCE_FORTH_PREWORD1 7\n#define SCE_FORTH_PREWORD2 8\n#define SCE_FORTH_NUMBER 9\n#define SCE_FORTH_STRING 10\n#define SCE_FORTH_LOCALE 11\n#define SCE_MATLAB_DEFAULT 0\n#define SCE_MATLAB_COMMENT 1\n#define SCE_MATLAB_COMMAND 2\n#define SCE_MATLAB_NUMBER 3\n#define SCE_MATLAB_KEYWORD 4\n#define SCE_MATLAB_STRING 5\n#define SCE_MATLAB_OPERATOR 6\n#define SCE_MATLAB_IDENTIFIER 7\n#define SCE_MATLAB_DOUBLEQUOTESTRING 8\n#define SCE_SCRIPTOL_DEFAULT 0\n#define SCE_SCRIPTOL_WHITE 1\n#define SCE_SCRIPTOL_COMMENTLINE 2\n#define SCE_SCRIPTOL_PERSISTENT 3\n#define SCE_SCRIPTOL_CSTYLE 4\n#define SCE_SCRIPTOL_COMMENTBLOCK 5\n#define SCE_SCRIPTOL_NUMBER 6\n#define SCE_SCRIPTOL_STRING 7\n#define SCE_SCRIPTOL_CHARACTER 8\n#define SCE_SCRIPTOL_STRINGEOL 9\n#define SCE_SCRIPTOL_KEYWORD 10\n#define SCE_SCRIPTOL_OPERATOR 11\n#define SCE_SCRIPTOL_IDENTIFIER 12\n#define SCE_SCRIPTOL_TRIPLE 13\n#define SCE_SCRIPTOL_CLASSNAME 14\n#define SCE_SCRIPTOL_PREPROCESSOR 15\n#define SCE_ASM_DEFAULT 0\n#define SCE_ASM_COMMENT 1\n#define SCE_ASM_NUMBER 2\n#define SCE_ASM_STRING 3\n#define SCE_ASM_OPERATOR 4\n#define SCE_ASM_IDENTIFIER 5\n#define SCE_ASM_CPUINSTRUCTION 6\n#define SCE_ASM_MATHINSTRUCTION 7\n#define SCE_ASM_REGISTER 8\n#define SCE_ASM_DIRECTIVE 9\n#define SCE_ASM_DIRECTIVEOPERAND 10\n#define SCE_ASM_COMMENTBLOCK 11\n#define SCE_ASM_CHARACTER 12\n#define SCE_ASM_STRINGEOL 13\n#define SCE_ASM_EXTINSTRUCTION 14\n#define SCE_ASM_COMMENTDIRECTIVE 15\n#define SCE_F_DEFAULT 0\n#define SCE_F_COMMENT 1\n#define SCE_F_NUMBER 2\n#define SCE_F_STRING1 3\n#define SCE_F_STRING2 4\n#define SCE_F_STRINGEOL 5\n#define SCE_F_OPERATOR 6\n#define SCE_F_IDENTIFIER 7\n#define SCE_F_WORD 8\n#define SCE_F_WORD2 9\n#define SCE_F_WORD3 10\n#define SCE_F_PREPROCESSOR 11\n#define SCE_F_OPERATOR2 12\n#define SCE_F_LABEL 13\n#define SCE_F_CONTINUATION 14\n#define SCE_CSS_DEFAULT 0\n#define SCE_CSS_TAG 1\n#define SCE_CSS_CLASS 2\n#define SCE_CSS_PSEUDOCLASS 3\n#define SCE_CSS_UNKNOWN_PSEUDOCLASS 4\n#define SCE_CSS_OPERATOR 5\n#define SCE_CSS_IDENTIFIER 6\n#define SCE_CSS_UNKNOWN_IDENTIFIER 7\n#define SCE_CSS_VALUE 8\n#define SCE_CSS_COMMENT 9\n#define SCE_CSS_ID 10\n#define SCE_CSS_IMPORTANT 11\n#define SCE_CSS_DIRECTIVE 12\n#define SCE_CSS_DOUBLESTRING 13\n#define SCE_CSS_SINGLESTRING 14\n#define SCE_CSS_IDENTIFIER2 15\n#define SCE_CSS_ATTRIBUTE 16\n#define SCE_CSS_IDENTIFIER3 17\n#define SCE_CSS_PSEUDOELEMENT 18\n#define SCE_CSS_EXTENDED_IDENTIFIER 19\n#define SCE_CSS_EXTENDED_PSEUDOCLASS 20\n#define SCE_CSS_EXTENDED_PSEUDOELEMENT 21\n#define SCE_CSS_MEDIA 22\n#define SCE_CSS_VARIABLE 23\n#define SCE_POV_DEFAULT 0\n#define SCE_POV_COMMENT 1\n#define SCE_POV_COMMENTLINE 2\n#define SCE_POV_NUMBER 3\n#define SCE_POV_OPERATOR 4\n#define SCE_POV_IDENTIFIER 5\n#define SCE_POV_STRING 6\n#define SCE_POV_STRINGEOL 7\n#define SCE_POV_DIRECTIVE 8\n#define SCE_POV_BADDIRECTIVE 9\n#define SCE_POV_WORD2 10\n#define SCE_POV_WORD3 11\n#define SCE_POV_WORD4 12\n#define SCE_POV_WORD5 13\n#define SCE_POV_WORD6 14\n#define SCE_POV_WORD7 15\n#define SCE_POV_WORD8 16\n#define SCE_LOUT_DEFAULT 0\n#define SCE_LOUT_COMMENT 1\n#define SCE_LOUT_NUMBER 2\n#define SCE_LOUT_WORD 3\n#define SCE_LOUT_WORD2 4\n#define SCE_LOUT_WORD3 5\n#define SCE_LOUT_WORD4 6\n#define SCE_LOUT_STRING 7\n#define SCE_LOUT_OPERATOR 8\n#define SCE_LOUT_IDENTIFIER 9\n#define SCE_LOUT_STRINGEOL 10\n#define SCE_ESCRIPT_DEFAULT 0\n#define SCE_ESCRIPT_COMMENT 1\n#define SCE_ESCRIPT_COMMENTLINE 2\n#define SCE_ESCRIPT_COMMENTDOC 3\n#define SCE_ESCRIPT_NUMBER 4\n#define SCE_ESCRIPT_WORD 5\n#define SCE_ESCRIPT_STRING 6\n#define SCE_ESCRIPT_OPERATOR 7\n#define SCE_ESCRIPT_IDENTIFIER 8\n#define SCE_ESCRIPT_BRACE 9\n#define SCE_ESCRIPT_WORD2 10\n#define SCE_ESCRIPT_WORD3 11\n#define SCE_PS_DEFAULT 0\n#define SCE_PS_COMMENT 1\n#define SCE_PS_DSC_COMMENT 2\n#define SCE_PS_DSC_VALUE 3\n#define SCE_PS_NUMBER 4\n#define SCE_PS_NAME 5\n#define SCE_PS_KEYWORD 6\n#define SCE_PS_LITERAL 7\n#define SCE_PS_IMMEVAL 8\n#define SCE_PS_PAREN_ARRAY 9\n#define SCE_PS_PAREN_DICT 10\n#define SCE_PS_PAREN_PROC 11\n#define SCE_PS_TEXT 12\n#define SCE_PS_HEXSTRING 13\n#define SCE_PS_BASE85STRING 14\n#define SCE_PS_BADSTRINGCHAR 15\n#define SCE_NSIS_DEFAULT 0\n#define SCE_NSIS_COMMENT 1\n#define SCE_NSIS_STRINGDQ 2\n#define SCE_NSIS_STRINGLQ 3\n#define SCE_NSIS_STRINGRQ 4\n#define SCE_NSIS_FUNCTION 5\n#define SCE_NSIS_VARIABLE 6\n#define SCE_NSIS_LABEL 7\n#define SCE_NSIS_USERDEFINED 8\n#define SCE_NSIS_SECTIONDEF 9\n#define SCE_NSIS_SUBSECTIONDEF 10\n#define SCE_NSIS_IFDEFINEDEF 11\n#define SCE_NSIS_MACRODEF 12\n#define SCE_NSIS_STRINGVAR 13\n#define SCE_NSIS_NUMBER 14\n#define SCE_NSIS_SECTIONGROUP 15\n#define SCE_NSIS_PAGEEX 16\n#define SCE_NSIS_FUNCTIONDEF 17\n#define SCE_NSIS_COMMENTBOX 18\n#define SCE_MMIXAL_LEADWS 0\n#define SCE_MMIXAL_COMMENT 1\n#define SCE_MMIXAL_LABEL 2\n#define SCE_MMIXAL_OPCODE 3\n#define SCE_MMIXAL_OPCODE_PRE 4\n#define SCE_MMIXAL_OPCODE_VALID 5\n#define SCE_MMIXAL_OPCODE_UNKNOWN 6\n#define SCE_MMIXAL_OPCODE_POST 7\n#define SCE_MMIXAL_OPERANDS 8\n#define SCE_MMIXAL_NUMBER 9\n#define SCE_MMIXAL_REF 10\n#define SCE_MMIXAL_CHAR 11\n#define SCE_MMIXAL_STRING 12\n#define SCE_MMIXAL_REGISTER 13\n#define SCE_MMIXAL_HEX 14\n#define SCE_MMIXAL_OPERATOR 15\n#define SCE_MMIXAL_SYMBOL 16\n#define SCE_MMIXAL_INCLUDE 17\n#define SCE_CLW_DEFAULT 0\n#define SCE_CLW_LABEL 1\n#define SCE_CLW_COMMENT 2\n#define SCE_CLW_STRING 3\n#define SCE_CLW_USER_IDENTIFIER 4\n#define SCE_CLW_INTEGER_CONSTANT 5\n#define SCE_CLW_REAL_CONSTANT 6\n#define SCE_CLW_PICTURE_STRING 7\n#define SCE_CLW_KEYWORD 8\n#define SCE_CLW_COMPILER_DIRECTIVE 9\n#define SCE_CLW_RUNTIME_EXPRESSIONS 10\n#define SCE_CLW_BUILTIN_PROCEDURES_FUNCTION 11\n#define SCE_CLW_STRUCTURE_DATA_TYPE 12\n#define SCE_CLW_ATTRIBUTE 13\n#define SCE_CLW_STANDARD_EQUATE 14\n#define SCE_CLW_ERROR 15\n#define SCE_CLW_DEPRECATED 16\n#define SCE_LOT_DEFAULT 0\n#define SCE_LOT_HEADER 1\n#define SCE_LOT_BREAK 2\n#define SCE_LOT_SET 3\n#define SCE_LOT_PASS 4\n#define SCE_LOT_FAIL 5\n#define SCE_LOT_ABORT 6\n#define SCE_YAML_DEFAULT 0\n#define SCE_YAML_COMMENT 1\n#define SCE_YAML_IDENTIFIER 2\n#define SCE_YAML_KEYWORD 3\n#define SCE_YAML_NUMBER 4\n#define SCE_YAML_REFERENCE 5\n#define SCE_YAML_DOCUMENT 6\n#define SCE_YAML_TEXT 7\n#define SCE_YAML_ERROR 8\n#define SCE_YAML_OPERATOR 9\n#define SCE_TEX_DEFAULT 0\n#define SCE_TEX_SPECIAL 1\n#define SCE_TEX_GROUP 2\n#define SCE_TEX_SYMBOL 3\n#define SCE_TEX_COMMAND 4\n#define SCE_TEX_TEXT 5\n#define SCE_METAPOST_DEFAULT 0\n#define SCE_METAPOST_SPECIAL 1\n#define SCE_METAPOST_GROUP 2\n#define SCE_METAPOST_SYMBOL 3\n#define SCE_METAPOST_COMMAND 4\n#define SCE_METAPOST_TEXT 5\n#define SCE_METAPOST_EXTRA 6\n#define SCE_ERLANG_DEFAULT 0\n#define SCE_ERLANG_COMMENT 1\n#define SCE_ERLANG_VARIABLE 2\n#define SCE_ERLANG_NUMBER 3\n#define SCE_ERLANG_KEYWORD 4\n#define SCE_ERLANG_STRING 5\n#define SCE_ERLANG_OPERATOR 6\n#define SCE_ERLANG_ATOM 7\n#define SCE_ERLANG_FUNCTION_NAME 8\n#define SCE_ERLANG_CHARACTER 9\n#define SCE_ERLANG_MACRO 10\n#define SCE_ERLANG_RECORD 11\n#define SCE_ERLANG_PREPROC 12\n#define SCE_ERLANG_NODE_NAME 13\n#define SCE_ERLANG_COMMENT_FUNCTION 14\n#define SCE_ERLANG_COMMENT_MODULE 15\n#define SCE_ERLANG_COMMENT_DOC 16\n#define SCE_ERLANG_COMMENT_DOC_MACRO 17\n#define SCE_ERLANG_ATOM_QUOTED 18\n#define SCE_ERLANG_MACRO_QUOTED 19\n#define SCE_ERLANG_RECORD_QUOTED 20\n#define SCE_ERLANG_NODE_NAME_QUOTED 21\n#define SCE_ERLANG_BIFS 22\n#define SCE_ERLANG_MODULES 23\n#define SCE_ERLANG_MODULES_ATT 24\n#define SCE_ERLANG_UNKNOWN 31\n#define SCE_MSSQL_DEFAULT 0\n#define SCE_MSSQL_COMMENT 1\n#define SCE_MSSQL_LINE_COMMENT 2\n#define SCE_MSSQL_NUMBER 3\n#define SCE_MSSQL_STRING 4\n#define SCE_MSSQL_OPERATOR 5\n#define SCE_MSSQL_IDENTIFIER 6\n#define SCE_MSSQL_VARIABLE 7\n#define SCE_MSSQL_COLUMN_NAME 8\n#define SCE_MSSQL_STATEMENT 9\n#define SCE_MSSQL_DATATYPE 10\n#define SCE_MSSQL_SYSTABLE 11\n#define SCE_MSSQL_GLOBAL_VARIABLE 12\n#define SCE_MSSQL_FUNCTION 13\n#define SCE_MSSQL_STORED_PROCEDURE 14\n#define SCE_MSSQL_DEFAULT_PREF_DATATYPE 15\n#define SCE_MSSQL_COLUMN_NAME_2 16\n#define SCE_V_DEFAULT 0\n#define SCE_V_COMMENT 1\n#define SCE_V_COMMENTLINE 2\n#define SCE_V_COMMENTLINEBANG 3\n#define SCE_V_NUMBER 4\n#define SCE_V_WORD 5\n#define SCE_V_STRING 6\n#define SCE_V_WORD2 7\n#define SCE_V_WORD3 8\n#define SCE_V_PREPROCESSOR 9\n#define SCE_V_OPERATOR 10\n#define SCE_V_IDENTIFIER 11\n#define SCE_V_STRINGEOL 12\n#define SCE_V_USER 19\n#define SCE_KIX_DEFAULT 0\n#define SCE_KIX_COMMENT 1\n#define SCE_KIX_STRING1 2\n#define SCE_KIX_STRING2 3\n#define SCE_KIX_NUMBER 4\n#define SCE_KIX_VAR 5\n#define SCE_KIX_MACRO 6\n#define SCE_KIX_KEYWORD 7\n#define SCE_KIX_FUNCTIONS 8\n#define SCE_KIX_OPERATOR 9\n#define SCE_KIX_IDENTIFIER 31\n#define SCE_GC_DEFAULT 0\n#define SCE_GC_COMMENTLINE 1\n#define SCE_GC_COMMENTBLOCK 2\n#define SCE_GC_GLOBAL 3\n#define SCE_GC_EVENT 4\n#define SCE_GC_ATTRIBUTE 5\n#define SCE_GC_CONTROL 6\n#define SCE_GC_COMMAND 7\n#define SCE_GC_STRING 8\n#define SCE_GC_OPERATOR 9\n#define SCE_SN_DEFAULT 0\n#define SCE_SN_CODE 1\n#define SCE_SN_COMMENTLINE 2\n#define SCE_SN_COMMENTLINEBANG 3\n#define SCE_SN_NUMBER 4\n#define SCE_SN_WORD 5\n#define SCE_SN_STRING 6\n#define SCE_SN_WORD2 7\n#define SCE_SN_WORD3 8\n#define SCE_SN_PREPROCESSOR 9\n#define SCE_SN_OPERATOR 10\n#define SCE_SN_IDENTIFIER 11\n#define SCE_SN_STRINGEOL 12\n#define SCE_SN_REGEXTAG 13\n#define SCE_SN_SIGNAL 14\n#define SCE_SN_USER 19\n#define SCE_AU3_DEFAULT 0\n#define SCE_AU3_COMMENT 1\n#define SCE_AU3_COMMENTBLOCK 2\n#define SCE_AU3_NUMBER 3\n#define SCE_AU3_FUNCTION 4\n#define SCE_AU3_KEYWORD 5\n#define SCE_AU3_MACRO 6\n#define SCE_AU3_STRING 7\n#define SCE_AU3_OPERATOR 8\n#define SCE_AU3_VARIABLE 9\n#define SCE_AU3_SENT 10\n#define SCE_AU3_PREPROCESSOR 11\n#define SCE_AU3_SPECIAL 12\n#define SCE_AU3_EXPAND 13\n#define SCE_AU3_COMOBJ 14\n#define SCE_AU3_UDF 15\n#define SCE_APDL_DEFAULT 0\n#define SCE_APDL_COMMENT 1\n#define SCE_APDL_COMMENTBLOCK 2\n#define SCE_APDL_NUMBER 3\n#define SCE_APDL_STRING 4\n#define SCE_APDL_OPERATOR 5\n#define SCE_APDL_WORD 6\n#define SCE_APDL_PROCESSOR 7\n#define SCE_APDL_COMMAND 8\n#define SCE_APDL_SLASHCOMMAND 9\n#define SCE_APDL_STARCOMMAND 10\n#define SCE_APDL_ARGUMENT 11\n#define SCE_APDL_FUNCTION 12\n#define SCE_SH_DEFAULT 0\n#define SCE_SH_ERROR 1\n#define SCE_SH_COMMENTLINE 2\n#define SCE_SH_NUMBER 3\n#define SCE_SH_WORD 4\n#define SCE_SH_STRING 5\n#define SCE_SH_CHARACTER 6\n#define SCE_SH_OPERATOR 7\n#define SCE_SH_IDENTIFIER 8\n#define SCE_SH_SCALAR 9\n#define SCE_SH_PARAM 10\n#define SCE_SH_BACKTICKS 11\n#define SCE_SH_HERE_DELIM 12\n#define SCE_SH_HERE_Q 13\n#define SCE_ASN1_DEFAULT 0\n#define SCE_ASN1_COMMENT 1\n#define SCE_ASN1_IDENTIFIER 2\n#define SCE_ASN1_STRING 3\n#define SCE_ASN1_OID 4\n#define SCE_ASN1_SCALAR 5\n#define SCE_ASN1_KEYWORD 6\n#define SCE_ASN1_ATTRIBUTE 7\n#define SCE_ASN1_DESCRIPTOR 8\n#define SCE_ASN1_TYPE 9\n#define SCE_ASN1_OPERATOR 10\n#define SCE_VHDL_DEFAULT 0\n#define SCE_VHDL_COMMENT 1\n#define SCE_VHDL_COMMENTLINEBANG 2\n#define SCE_VHDL_NUMBER 3\n#define SCE_VHDL_STRING 4\n#define SCE_VHDL_OPERATOR 5\n#define SCE_VHDL_IDENTIFIER 6\n#define SCE_VHDL_STRINGEOL 7\n#define SCE_VHDL_KEYWORD 8\n#define SCE_VHDL_STDOPERATOR 9\n#define SCE_VHDL_ATTRIBUTE 10\n#define SCE_VHDL_STDFUNCTION 11\n#define SCE_VHDL_STDPACKAGE 12\n#define SCE_VHDL_STDTYPE 13\n#define SCE_VHDL_USERWORD 14\n#define SCE_CAML_DEFAULT 0\n#define SCE_CAML_IDENTIFIER 1\n#define SCE_CAML_TAGNAME 2\n#define SCE_CAML_KEYWORD 3\n#define SCE_CAML_KEYWORD2 4\n#define SCE_CAML_KEYWORD3 5\n#define SCE_CAML_LINENUM 6\n#define SCE_CAML_OPERATOR 7\n#define SCE_CAML_NUMBER 8\n#define SCE_CAML_CHAR 9\n#define SCE_CAML_WHITE 10\n#define SCE_CAML_STRING 11\n#define SCE_CAML_COMMENT 12\n#define SCE_CAML_COMMENT1 13\n#define SCE_CAML_COMMENT2 14\n#define SCE_CAML_COMMENT3 15\n#define SCE_HA_DEFAULT 0\n#define SCE_HA_IDENTIFIER 1\n#define SCE_HA_KEYWORD 2\n#define SCE_HA_NUMBER 3\n#define SCE_HA_STRING 4\n#define SCE_HA_CHARACTER 5\n#define SCE_HA_CLASS 6\n#define SCE_HA_MODULE 7\n#define SCE_HA_CAPITAL 8\n#define SCE_HA_DATA 9\n#define SCE_HA_IMPORT 10\n#define SCE_HA_OPERATOR 11\n#define SCE_HA_INSTANCE 12\n#define SCE_HA_COMMENTLINE 13\n#define SCE_HA_COMMENTBLOCK 14\n#define SCE_HA_COMMENTBLOCK2 15\n#define SCE_HA_COMMENTBLOCK3 16\n#define SCE_HA_PRAGMA 17\n#define SCE_HA_PREPROCESSOR 18\n#define SCE_HA_STRINGEOL 19\n#define SCE_HA_RESERVED_OPERATOR 20\n#define SCE_HA_LITERATE_COMMENT 21\n#define SCE_HA_LITERATE_CODEDELIM 22\n#define SCE_T3_DEFAULT 0\n#define SCE_T3_X_DEFAULT 1\n#define SCE_T3_PREPROCESSOR 2\n#define SCE_T3_BLOCK_COMMENT 3\n#define SCE_T3_LINE_COMMENT 4\n#define SCE_T3_OPERATOR 5\n#define SCE_T3_KEYWORD 6\n#define SCE_T3_NUMBER 7\n#define SCE_T3_IDENTIFIER 8\n#define SCE_T3_S_STRING 9\n#define SCE_T3_D_STRING 10\n#define SCE_T3_X_STRING 11\n#define SCE_T3_LIB_DIRECTIVE 12\n#define SCE_T3_MSG_PARAM 13\n#define SCE_T3_HTML_TAG 14\n#define SCE_T3_HTML_DEFAULT 15\n#define SCE_T3_HTML_STRING 16\n#define SCE_T3_USER1 17\n#define SCE_T3_USER2 18\n#define SCE_T3_USER3 19\n#define SCE_T3_BRACE 20\n#define SCE_REBOL_DEFAULT 0\n#define SCE_REBOL_COMMENTLINE 1\n#define SCE_REBOL_COMMENTBLOCK 2\n#define SCE_REBOL_PREFACE 3\n#define SCE_REBOL_OPERATOR 4\n#define SCE_REBOL_CHARACTER 5\n#define SCE_REBOL_QUOTEDSTRING 6\n#define SCE_REBOL_BRACEDSTRING 7\n#define SCE_REBOL_NUMBER 8\n#define SCE_REBOL_PAIR 9\n#define SCE_REBOL_TUPLE 10\n#define SCE_REBOL_BINARY 11\n#define SCE_REBOL_MONEY 12\n#define SCE_REBOL_ISSUE 13\n#define SCE_REBOL_TAG 14\n#define SCE_REBOL_FILE 15\n#define SCE_REBOL_EMAIL 16\n#define SCE_REBOL_URL 17\n#define SCE_REBOL_DATE 18\n#define SCE_REBOL_TIME 19\n#define SCE_REBOL_IDENTIFIER 20\n#define SCE_REBOL_WORD 21\n#define SCE_REBOL_WORD2 22\n#define SCE_REBOL_WORD3 23\n#define SCE_REBOL_WORD4 24\n#define SCE_REBOL_WORD5 25\n#define SCE_REBOL_WORD6 26\n#define SCE_REBOL_WORD7 27\n#define SCE_REBOL_WORD8 28\n#define SCE_SQL_DEFAULT 0\n#define SCE_SQL_COMMENT 1\n#define SCE_SQL_COMMENTLINE 2\n#define SCE_SQL_COMMENTDOC 3\n#define SCE_SQL_NUMBER 4\n#define SCE_SQL_WORD 5\n#define SCE_SQL_STRING 6\n#define SCE_SQL_CHARACTER 7\n#define SCE_SQL_SQLPLUS 8\n#define SCE_SQL_SQLPLUS_PROMPT 9\n#define SCE_SQL_OPERATOR 10\n#define SCE_SQL_IDENTIFIER 11\n#define SCE_SQL_SQLPLUS_COMMENT 13\n#define SCE_SQL_COMMENTLINEDOC 15\n#define SCE_SQL_WORD2 16\n#define SCE_SQL_COMMENTDOCKEYWORD 17\n#define SCE_SQL_COMMENTDOCKEYWORDERROR 18\n#define SCE_SQL_USER1 19\n#define SCE_SQL_USER2 20\n#define SCE_SQL_USER3 21\n#define SCE_SQL_USER4 22\n#define SCE_SQL_QUOTEDIDENTIFIER 23\n#define SCE_ST_DEFAULT 0\n#define SCE_ST_STRING 1\n#define SCE_ST_NUMBER 2\n#define SCE_ST_COMMENT 3\n#define SCE_ST_SYMBOL 4\n#define SCE_ST_BINARY 5\n#define SCE_ST_BOOL 6\n#define SCE_ST_SELF 7\n#define SCE_ST_SUPER 8\n#define SCE_ST_NIL 9\n#define SCE_ST_GLOBAL 10\n#define SCE_ST_RETURN 11\n#define SCE_ST_SPECIAL 12\n#define SCE_ST_KWSEND 13\n#define SCE_ST_ASSIGN 14\n#define SCE_ST_CHARACTER 15\n#define SCE_ST_SPEC_SEL 16\n#define SCE_FS_DEFAULT 0\n#define SCE_FS_COMMENT 1\n#define SCE_FS_COMMENTLINE 2\n#define SCE_FS_COMMENTDOC 3\n#define SCE_FS_COMMENTLINEDOC 4\n#define SCE_FS_COMMENTDOCKEYWORD 5\n#define SCE_FS_COMMENTDOCKEYWORDERROR 6\n#define SCE_FS_KEYWORD 7\n#define SCE_FS_KEYWORD2 8\n#define SCE_FS_KEYWORD3 9\n#define SCE_FS_KEYWORD4 10\n#define SCE_FS_NUMBER 11\n#define SCE_FS_STRING 12\n#define SCE_FS_PREPROCESSOR 13\n#define SCE_FS_OPERATOR 14\n#define SCE_FS_IDENTIFIER 15\n#define SCE_FS_DATE 16\n#define SCE_FS_STRINGEOL 17\n#define SCE_FS_CONSTANT 18\n#define SCE_FS_WORDOPERATOR 19\n#define SCE_FS_DISABLEDCODE 20\n#define SCE_FS_DEFAULT_C 21\n#define SCE_FS_COMMENTDOC_C 22\n#define SCE_FS_COMMENTLINEDOC_C 23\n#define SCE_FS_KEYWORD_C 24\n#define SCE_FS_KEYWORD2_C 25\n#define SCE_FS_NUMBER_C 26\n#define SCE_FS_STRING_C 27\n#define SCE_FS_PREPROCESSOR_C 28\n#define SCE_FS_OPERATOR_C 29\n#define SCE_FS_IDENTIFIER_C 30\n#define SCE_FS_STRINGEOL_C 31\n#define SCE_CSOUND_DEFAULT 0\n#define SCE_CSOUND_COMMENT 1\n#define SCE_CSOUND_NUMBER 2\n#define SCE_CSOUND_OPERATOR 3\n#define SCE_CSOUND_INSTR 4\n#define SCE_CSOUND_IDENTIFIER 5\n#define SCE_CSOUND_OPCODE 6\n#define SCE_CSOUND_HEADERSTMT 7\n#define SCE_CSOUND_USERKEYWORD 8\n#define SCE_CSOUND_COMMENTBLOCK 9\n#define SCE_CSOUND_PARAM 10\n#define SCE_CSOUND_ARATE_VAR 11\n#define SCE_CSOUND_KRATE_VAR 12\n#define SCE_CSOUND_IRATE_VAR 13\n#define SCE_CSOUND_GLOBAL_VAR 14\n#define SCE_CSOUND_STRINGEOL 15\n#define SCE_INNO_DEFAULT 0\n#define SCE_INNO_COMMENT 1\n#define SCE_INNO_KEYWORD 2\n#define SCE_INNO_PARAMETER 3\n#define SCE_INNO_SECTION 4\n#define SCE_INNO_PREPROC 5\n#define SCE_INNO_INLINE_EXPANSION 6\n#define SCE_INNO_COMMENT_PASCAL 7\n#define SCE_INNO_KEYWORD_PASCAL 8\n#define SCE_INNO_KEYWORD_USER 9\n#define SCE_INNO_STRING_DOUBLE 10\n#define SCE_INNO_STRING_SINGLE 11\n#define SCE_INNO_IDENTIFIER 12\n#define SCE_OPAL_SPACE 0\n#define SCE_OPAL_COMMENT_BLOCK 1\n#define SCE_OPAL_COMMENT_LINE 2\n#define SCE_OPAL_INTEGER 3\n#define SCE_OPAL_KEYWORD 4\n#define SCE_OPAL_SORT 5\n#define SCE_OPAL_STRING 6\n#define SCE_OPAL_PAR 7\n#define SCE_OPAL_BOOL_CONST 8\n#define SCE_OPAL_DEFAULT 32\n#define SCE_SPICE_DEFAULT 0\n#define SCE_SPICE_IDENTIFIER 1\n#define SCE_SPICE_KEYWORD 2\n#define SCE_SPICE_KEYWORD2 3\n#define SCE_SPICE_KEYWORD3 4\n#define SCE_SPICE_NUMBER 5\n#define SCE_SPICE_DELIMITER 6\n#define SCE_SPICE_VALUE 7\n#define SCE_SPICE_COMMENTLINE 8\n#define SCE_CMAKE_DEFAULT 0\n#define SCE_CMAKE_COMMENT 1\n#define SCE_CMAKE_STRINGDQ 2\n#define SCE_CMAKE_STRINGLQ 3\n#define SCE_CMAKE_STRINGRQ 4\n#define SCE_CMAKE_COMMANDS 5\n#define SCE_CMAKE_PARAMETERS 6\n#define SCE_CMAKE_VARIABLE 7\n#define SCE_CMAKE_USERDEFINED 8\n#define SCE_CMAKE_WHILEDEF 9\n#define SCE_CMAKE_FOREACHDEF 10\n#define SCE_CMAKE_IFDEFINEDEF 11\n#define SCE_CMAKE_MACRODEF 12\n#define SCE_CMAKE_STRINGVAR 13\n#define SCE_CMAKE_NUMBER 14\n#define SCE_GAP_DEFAULT 0\n#define SCE_GAP_IDENTIFIER 1\n#define SCE_GAP_KEYWORD 2\n#define SCE_GAP_KEYWORD2 3\n#define SCE_GAP_KEYWORD3 4\n#define SCE_GAP_KEYWORD4 5\n#define SCE_GAP_STRING 6\n#define SCE_GAP_CHAR 7\n#define SCE_GAP_OPERATOR 8\n#define SCE_GAP_COMMENT 9\n#define SCE_GAP_NUMBER 10\n#define SCE_GAP_STRINGEOL 11\n#define SCE_PLM_DEFAULT 0\n#define SCE_PLM_COMMENT 1\n#define SCE_PLM_STRING 2\n#define SCE_PLM_NUMBER 3\n#define SCE_PLM_IDENTIFIER 4\n#define SCE_PLM_OPERATOR 5\n#define SCE_PLM_CONTROL 6\n#define SCE_PLM_KEYWORD 7\n#define SCE_4GL_DEFAULT 0\n#define SCE_4GL_NUMBER 1\n#define SCE_4GL_WORD 2\n#define SCE_4GL_STRING 3\n#define SCE_4GL_CHARACTER 4\n#define SCE_4GL_PREPROCESSOR 5\n#define SCE_4GL_OPERATOR 6\n#define SCE_4GL_IDENTIFIER 7\n#define SCE_4GL_BLOCK 8\n#define SCE_4GL_END 9\n#define SCE_4GL_COMMENT1 10\n#define SCE_4GL_COMMENT2 11\n#define SCE_4GL_COMMENT3 12\n#define SCE_4GL_COMMENT4 13\n#define SCE_4GL_COMMENT5 14\n#define SCE_4GL_COMMENT6 15\n#define SCE_4GL_DEFAULT_ 16\n#define SCE_4GL_NUMBER_ 17\n#define SCE_4GL_WORD_ 18\n#define SCE_4GL_STRING_ 19\n#define SCE_4GL_CHARACTER_ 20\n#define SCE_4GL_PREPROCESSOR_ 21\n#define SCE_4GL_OPERATOR_ 22\n#define SCE_4GL_IDENTIFIER_ 23\n#define SCE_4GL_BLOCK_ 24\n#define SCE_4GL_END_ 25\n#define SCE_4GL_COMMENT1_ 26\n#define SCE_4GL_COMMENT2_ 27\n#define SCE_4GL_COMMENT3_ 28\n#define SCE_4GL_COMMENT4_ 29\n#define SCE_4GL_COMMENT5_ 30\n#define SCE_4GL_COMMENT6_ 31\n#define SCE_ABAQUS_DEFAULT 0\n#define SCE_ABAQUS_COMMENT 1\n#define SCE_ABAQUS_COMMENTBLOCK 2\n#define SCE_ABAQUS_NUMBER 3\n#define SCE_ABAQUS_STRING 4\n#define SCE_ABAQUS_OPERATOR 5\n#define SCE_ABAQUS_WORD 6\n#define SCE_ABAQUS_PROCESSOR 7\n#define SCE_ABAQUS_COMMAND 8\n#define SCE_ABAQUS_SLASHCOMMAND 9\n#define SCE_ABAQUS_STARCOMMAND 10\n#define SCE_ABAQUS_ARGUMENT 11\n#define SCE_ABAQUS_FUNCTION 12\n#define SCE_ASY_DEFAULT 0\n#define SCE_ASY_COMMENT 1\n#define SCE_ASY_COMMENTLINE 2\n#define SCE_ASY_NUMBER 3\n#define SCE_ASY_WORD 4\n#define SCE_ASY_STRING 5\n#define SCE_ASY_CHARACTER 6\n#define SCE_ASY_OPERATOR 7\n#define SCE_ASY_IDENTIFIER 8\n#define SCE_ASY_STRINGEOL 9\n#define SCE_ASY_COMMENTLINEDOC 10\n#define SCE_ASY_WORD2 11\n#define SCE_R_DEFAULT 0\n#define SCE_R_COMMENT 1\n#define SCE_R_KWORD 2\n#define SCE_R_BASEKWORD 3\n#define SCE_R_OTHERKWORD 4\n#define SCE_R_NUMBER 5\n#define SCE_R_STRING 6\n#define SCE_R_STRING2 7\n#define SCE_R_OPERATOR 8\n#define SCE_R_IDENTIFIER 9\n#define SCE_R_INFIX 10\n#define SCE_R_INFIXEOL 11\n#define SCE_MAGIK_DEFAULT 0\n#define SCE_MAGIK_COMMENT 1\n#define SCE_MAGIK_HYPER_COMMENT 16\n#define SCE_MAGIK_STRING 2\n#define SCE_MAGIK_CHARACTER 3\n#define SCE_MAGIK_NUMBER 4\n#define SCE_MAGIK_IDENTIFIER 5\n#define SCE_MAGIK_OPERATOR 6\n#define SCE_MAGIK_FLOW 7\n#define SCE_MAGIK_CONTAINER 8\n#define SCE_MAGIK_BRACKET_BLOCK 9\n#define SCE_MAGIK_BRACE_BLOCK 10\n#define SCE_MAGIK_SQBRACKET_BLOCK 11\n#define SCE_MAGIK_UNKNOWN_KEYWORD 12\n#define SCE_MAGIK_KEYWORD 13\n#define SCE_MAGIK_PRAGMA 14\n#define SCE_MAGIK_SYMBOL 15\n#define SCE_POWERSHELL_DEFAULT 0\n#define SCE_POWERSHELL_COMMENT 1\n#define SCE_POWERSHELL_STRING 2\n#define SCE_POWERSHELL_CHARACTER 3\n#define SCE_POWERSHELL_NUMBER 4\n#define SCE_POWERSHELL_VARIABLE 5\n#define SCE_POWERSHELL_OPERATOR 6\n#define SCE_POWERSHELL_IDENTIFIER 7\n#define SCE_POWERSHELL_KEYWORD 8\n#define SCE_POWERSHELL_CMDLET 9\n#define SCE_POWERSHELL_ALIAS 10\n#define SCE_POWERSHELL_FUNCTION 11\n#define SCE_POWERSHELL_USER1 12\n#define SCE_POWERSHELL_COMMENTSTREAM 13\n#define SCE_POWERSHELL_HERE_STRING 14\n#define SCE_POWERSHELL_HERE_CHARACTER 15\n#define SCE_POWERSHELL_COMMENTDOCKEYWORD 16\n#define SCE_MYSQL_DEFAULT 0\n#define SCE_MYSQL_COMMENT 1\n#define SCE_MYSQL_COMMENTLINE 2\n#define SCE_MYSQL_VARIABLE 3\n#define SCE_MYSQL_SYSTEMVARIABLE 4\n#define SCE_MYSQL_KNOWNSYSTEMVARIABLE 5\n#define SCE_MYSQL_NUMBER 6\n#define SCE_MYSQL_MAJORKEYWORD 7\n#define SCE_MYSQL_KEYWORD 8\n#define SCE_MYSQL_DATABASEOBJECT 9\n#define SCE_MYSQL_PROCEDUREKEYWORD 10\n#define SCE_MYSQL_STRING 11\n#define SCE_MYSQL_SQSTRING 12\n#define SCE_MYSQL_DQSTRING 13\n#define SCE_MYSQL_OPERATOR 14\n#define SCE_MYSQL_FUNCTION 15\n#define SCE_MYSQL_IDENTIFIER 16\n#define SCE_MYSQL_QUOTEDIDENTIFIER 17\n#define SCE_MYSQL_USER1 18\n#define SCE_MYSQL_USER2 19\n#define SCE_MYSQL_USER3 20\n#define SCE_MYSQL_HIDDENCOMMAND 21\n#define SCE_MYSQL_PLACEHOLDER 22\n#define SCE_PO_DEFAULT 0\n#define SCE_PO_COMMENT 1\n#define SCE_PO_MSGID 2\n#define SCE_PO_MSGID_TEXT 3\n#define SCE_PO_MSGSTR 4\n#define SCE_PO_MSGSTR_TEXT 5\n#define SCE_PO_MSGCTXT 6\n#define SCE_PO_MSGCTXT_TEXT 7\n#define SCE_PO_FUZZY 8\n#define SCE_PO_PROGRAMMER_COMMENT 9\n#define SCE_PO_REFERENCE 10\n#define SCE_PO_FLAGS 11\n#define SCE_PO_MSGID_TEXT_EOL 12\n#define SCE_PO_MSGSTR_TEXT_EOL 13\n#define SCE_PO_MSGCTXT_TEXT_EOL 14\n#define SCE_PO_ERROR 15\n#define SCE_PAS_DEFAULT 0\n#define SCE_PAS_IDENTIFIER 1\n#define SCE_PAS_COMMENT 2\n#define SCE_PAS_COMMENT2 3\n#define SCE_PAS_COMMENTLINE 4\n#define SCE_PAS_PREPROCESSOR 5\n#define SCE_PAS_PREPROCESSOR2 6\n#define SCE_PAS_NUMBER 7\n#define SCE_PAS_HEXNUMBER 8\n#define SCE_PAS_WORD 9\n#define SCE_PAS_STRING 10\n#define SCE_PAS_STRINGEOL 11\n#define SCE_PAS_CHARACTER 12\n#define SCE_PAS_OPERATOR 13\n#define SCE_PAS_ASM 14\n#define SCE_SORCUS_DEFAULT 0\n#define SCE_SORCUS_COMMAND 1\n#define SCE_SORCUS_PARAMETER 2\n#define SCE_SORCUS_COMMENTLINE 3\n#define SCE_SORCUS_STRING 4\n#define SCE_SORCUS_STRINGEOL 5\n#define SCE_SORCUS_IDENTIFIER 6\n#define SCE_SORCUS_OPERATOR 7\n#define SCE_SORCUS_NUMBER 8\n#define SCE_SORCUS_CONSTANT 9\n#define SCE_POWERPRO_DEFAULT 0\n#define SCE_POWERPRO_COMMENTBLOCK 1\n#define SCE_POWERPRO_COMMENTLINE 2\n#define SCE_POWERPRO_NUMBER 3\n#define SCE_POWERPRO_WORD 4\n#define SCE_POWERPRO_WORD2 5\n#define SCE_POWERPRO_WORD3 6\n#define SCE_POWERPRO_WORD4 7\n#define SCE_POWERPRO_DOUBLEQUOTEDSTRING 8\n#define SCE_POWERPRO_SINGLEQUOTEDSTRING 9\n#define SCE_POWERPRO_LINECONTINUE 10\n#define SCE_POWERPRO_OPERATOR 11\n#define SCE_POWERPRO_IDENTIFIER 12\n#define SCE_POWERPRO_STRINGEOL 13\n#define SCE_POWERPRO_VERBATIM 14\n#define SCE_POWERPRO_ALTQUOTE 15\n#define SCE_POWERPRO_FUNCTION 16\n#define SCE_SML_DEFAULT 0\n#define SCE_SML_IDENTIFIER 1\n#define SCE_SML_TAGNAME 2\n#define SCE_SML_KEYWORD 3\n#define SCE_SML_KEYWORD2 4\n#define SCE_SML_KEYWORD3 5\n#define SCE_SML_LINENUM 6\n#define SCE_SML_OPERATOR 7\n#define SCE_SML_NUMBER 8\n#define SCE_SML_CHAR 9\n#define SCE_SML_STRING 11\n#define SCE_SML_COMMENT 12\n#define SCE_SML_COMMENT1 13\n#define SCE_SML_COMMENT2 14\n#define SCE_SML_COMMENT3 15\n#define SCE_MARKDOWN_DEFAULT 0\n#define SCE_MARKDOWN_LINE_BEGIN 1\n#define SCE_MARKDOWN_STRONG1 2\n#define SCE_MARKDOWN_STRONG2 3\n#define SCE_MARKDOWN_EM1 4\n#define SCE_MARKDOWN_EM2 5\n#define SCE_MARKDOWN_HEADER1 6\n#define SCE_MARKDOWN_HEADER2 7\n#define SCE_MARKDOWN_HEADER3 8\n#define SCE_MARKDOWN_HEADER4 9\n#define SCE_MARKDOWN_HEADER5 10\n#define SCE_MARKDOWN_HEADER6 11\n#define SCE_MARKDOWN_PRECHAR 12\n#define SCE_MARKDOWN_ULIST_ITEM 13\n#define SCE_MARKDOWN_OLIST_ITEM 14\n#define SCE_MARKDOWN_BLOCKQUOTE 15\n#define SCE_MARKDOWN_STRIKEOUT 16\n#define SCE_MARKDOWN_HRULE 17\n#define SCE_MARKDOWN_LINK 18\n#define SCE_MARKDOWN_CODE 19\n#define SCE_MARKDOWN_CODE2 20\n#define SCE_MARKDOWN_CODEBK 21\n#define SCE_TXT2TAGS_DEFAULT 0\n#define SCE_TXT2TAGS_LINE_BEGIN 1\n#define SCE_TXT2TAGS_STRONG1 2\n#define SCE_TXT2TAGS_STRONG2 3\n#define SCE_TXT2TAGS_EM1 4\n#define SCE_TXT2TAGS_EM2 5\n#define SCE_TXT2TAGS_HEADER1 6\n#define SCE_TXT2TAGS_HEADER2 7\n#define SCE_TXT2TAGS_HEADER3 8\n#define SCE_TXT2TAGS_HEADER4 9\n#define SCE_TXT2TAGS_HEADER5 10\n#define SCE_TXT2TAGS_HEADER6 11\n#define SCE_TXT2TAGS_PRECHAR 12\n#define SCE_TXT2TAGS_ULIST_ITEM 13\n#define SCE_TXT2TAGS_OLIST_ITEM 14\n#define SCE_TXT2TAGS_BLOCKQUOTE 15\n#define SCE_TXT2TAGS_STRIKEOUT 16\n#define SCE_TXT2TAGS_HRULE 17\n#define SCE_TXT2TAGS_LINK 18\n#define SCE_TXT2TAGS_CODE 19\n#define SCE_TXT2TAGS_CODE2 20\n#define SCE_TXT2TAGS_CODEBK 21\n#define SCE_TXT2TAGS_COMMENT 22\n#define SCE_TXT2TAGS_OPTION 23\n#define SCE_TXT2TAGS_PREPROC 24\n#define SCE_TXT2TAGS_POSTPROC 25\n#define SCE_A68K_DEFAULT 0\n#define SCE_A68K_COMMENT 1\n#define SCE_A68K_NUMBER_DEC 2\n#define SCE_A68K_NUMBER_BIN 3\n#define SCE_A68K_NUMBER_HEX 4\n#define SCE_A68K_STRING1 5\n#define SCE_A68K_OPERATOR 6\n#define SCE_A68K_CPUINSTRUCTION 7\n#define SCE_A68K_EXTINSTRUCTION 8\n#define SCE_A68K_REGISTER 9\n#define SCE_A68K_DIRECTIVE 10\n#define SCE_A68K_MACRO_ARG 11\n#define SCE_A68K_LABEL 12\n#define SCE_A68K_STRING2 13\n#define SCE_A68K_IDENTIFIER 14\n#define SCE_A68K_MACRO_DECLARATION 15\n#define SCE_A68K_COMMENT_WORD 16\n#define SCE_A68K_COMMENT_SPECIAL 17\n#define SCE_A68K_COMMENT_DOXYGEN 18\n#define SCE_MODULA_DEFAULT 0\n#define SCE_MODULA_COMMENT 1\n#define SCE_MODULA_DOXYCOMM 2\n#define SCE_MODULA_DOXYKEY 3\n#define SCE_MODULA_KEYWORD 4\n#define SCE_MODULA_RESERVED 5\n#define SCE_MODULA_NUMBER 6\n#define SCE_MODULA_BASENUM 7\n#define SCE_MODULA_FLOAT 8\n#define SCE_MODULA_STRING 9\n#define SCE_MODULA_STRSPEC 10\n#define SCE_MODULA_CHAR 11\n#define SCE_MODULA_CHARSPEC 12\n#define SCE_MODULA_PROC 13\n#define SCE_MODULA_PRAGMA 14\n#define SCE_MODULA_PRGKEY 15\n#define SCE_MODULA_OPERATOR 16\n#define SCE_MODULA_BADSTR 17\n#define SCE_COFFEESCRIPT_DEFAULT 0\n#define SCE_COFFEESCRIPT_COMMENT 1\n#define SCE_COFFEESCRIPT_COMMENTLINE 2\n#define SCE_COFFEESCRIPT_COMMENTDOC 3\n#define SCE_COFFEESCRIPT_NUMBER 4\n#define SCE_COFFEESCRIPT_WORD 5\n#define SCE_COFFEESCRIPT_STRING 6\n#define SCE_COFFEESCRIPT_CHARACTER 7\n#define SCE_COFFEESCRIPT_UUID 8\n#define SCE_COFFEESCRIPT_PREPROCESSOR 9\n#define SCE_COFFEESCRIPT_OPERATOR 10\n#define SCE_COFFEESCRIPT_IDENTIFIER 11\n#define SCE_COFFEESCRIPT_STRINGEOL 12\n#define SCE_COFFEESCRIPT_VERBATIM 13\n#define SCE_COFFEESCRIPT_REGEX 14\n#define SCE_COFFEESCRIPT_COMMENTLINEDOC 15\n#define SCE_COFFEESCRIPT_WORD2 16\n#define SCE_COFFEESCRIPT_COMMENTDOCKEYWORD 17\n#define SCE_COFFEESCRIPT_COMMENTDOCKEYWORDERROR 18\n#define SCE_COFFEESCRIPT_GLOBALCLASS 19\n#define SCE_COFFEESCRIPT_STRINGRAW 20\n#define SCE_COFFEESCRIPT_TRIPLEVERBATIM 21\n#define SCE_COFFEESCRIPT_HASHQUOTEDSTRING 22\n#define SCE_COFFEESCRIPT_COMMENTBLOCK 22\n#define SCE_COFFEESCRIPT_VERBOSE_REGEX 23\n#define SCE_COFFEESCRIPT_VERBOSE_REGEX_COMMENT 24\n#define SCE_AVS_DEFAULT 0\n#define SCE_AVS_COMMENTBLOCK 1\n#define SCE_AVS_COMMENTBLOCKN 2\n#define SCE_AVS_COMMENTLINE 3\n#define SCE_AVS_NUMBER 4\n#define SCE_AVS_OPERATOR 5\n#define SCE_AVS_IDENTIFIER 6\n#define SCE_AVS_STRING 7\n#define SCE_AVS_TRIPLESTRING 8\n#define SCE_AVS_KEYWORD 9\n#define SCE_AVS_FILTER 10\n#define SCE_AVS_PLUGIN 11\n#define SCE_AVS_FUNCTION 12\n#define SCE_AVS_CLIPPROP 13\n#define SCE_AVS_USERDFN 14\n#define SCE_ECL_DEFAULT 0\n#define SCE_ECL_COMMENT 1\n#define SCE_ECL_COMMENTLINE 2\n#define SCE_ECL_NUMBER 3\n#define SCE_ECL_STRING 4\n#define SCE_ECL_WORD0 5\n#define SCE_ECL_OPERATOR 6\n#define SCE_ECL_CHARACTER 7\n#define SCE_ECL_UUID 8\n#define SCE_ECL_PREPROCESSOR 9\n#define SCE_ECL_UNKNOWN 10\n#define SCE_ECL_IDENTIFIER 11\n#define SCE_ECL_STRINGEOL 12\n#define SCE_ECL_VERBATIM 13\n#define SCE_ECL_REGEX 14\n#define SCE_ECL_COMMENTLINEDOC 15\n#define SCE_ECL_WORD1 16\n#define SCE_ECL_COMMENTDOCKEYWORD 17\n#define SCE_ECL_COMMENTDOCKEYWORDERROR 18\n#define SCE_ECL_WORD2 19\n#define SCE_ECL_WORD3 20\n#define SCE_ECL_WORD4 21\n#define SCE_ECL_WORD5 22\n#define SCE_ECL_COMMENTDOC 23\n#define SCE_ECL_ADDED 24\n#define SCE_ECL_DELETED 25\n#define SCE_ECL_CHANGED 26\n#define SCE_ECL_MOVED 27\n#define SCE_OSCRIPT_DEFAULT 0\n#define SCE_OSCRIPT_LINE_COMMENT 1\n#define SCE_OSCRIPT_BLOCK_COMMENT 2\n#define SCE_OSCRIPT_DOC_COMMENT 3\n#define SCE_OSCRIPT_PREPROCESSOR 4\n#define SCE_OSCRIPT_NUMBER 5\n#define SCE_OSCRIPT_SINGLEQUOTE_STRING 6\n#define SCE_OSCRIPT_DOUBLEQUOTE_STRING 7\n#define SCE_OSCRIPT_CONSTANT 8\n#define SCE_OSCRIPT_IDENTIFIER 9\n#define SCE_OSCRIPT_GLOBAL 10\n#define SCE_OSCRIPT_KEYWORD 11\n#define SCE_OSCRIPT_OPERATOR 12\n#define SCE_OSCRIPT_LABEL 13\n#define SCE_OSCRIPT_TYPE 14\n#define SCE_OSCRIPT_FUNCTION 15\n#define SCE_OSCRIPT_OBJECT 16\n#define SCE_OSCRIPT_PROPERTY 17\n#define SCE_OSCRIPT_METHOD 18\n#define SCE_VISUALPROLOG_DEFAULT 0\n#define SCE_VISUALPROLOG_KEY_MAJOR 1\n#define SCE_VISUALPROLOG_KEY_MINOR 2\n#define SCE_VISUALPROLOG_KEY_DIRECTIVE 3\n#define SCE_VISUALPROLOG_COMMENT_BLOCK 4\n#define SCE_VISUALPROLOG_COMMENT_LINE 5\n#define SCE_VISUALPROLOG_COMMENT_KEY 6\n#define SCE_VISUALPROLOG_COMMENT_KEY_ERROR 7\n#define SCE_VISUALPROLOG_IDENTIFIER 8\n#define SCE_VISUALPROLOG_VARIABLE 9\n#define SCE_VISUALPROLOG_ANONYMOUS 10\n#define SCE_VISUALPROLOG_NUMBER 11\n#define SCE_VISUALPROLOG_OPERATOR 12\n#define SCE_VISUALPROLOG_CHARACTER 13\n#define SCE_VISUALPROLOG_CHARACTER_TOO_MANY 14\n#define SCE_VISUALPROLOG_CHARACTER_ESCAPE_ERROR 15\n#define SCE_VISUALPROLOG_STRING 16\n#define SCE_VISUALPROLOG_STRING_ESCAPE 17\n#define SCE_VISUALPROLOG_STRING_ESCAPE_ERROR 18\n#define SCE_VISUALPROLOG_STRING_EOL_OPEN 19\n#define SCE_VISUALPROLOG_STRING_VERBATIM 20\n#define SCE_VISUALPROLOG_STRING_VERBATIM_SPECIAL 21\n#define SCE_VISUALPROLOG_STRING_VERBATIM_EOL 22\n#define SCE_STTXT_DEFAULT 0\n#define SCE_STTXT_COMMENT 1\n#define SCE_STTXT_COMMENTLINE 2\n#define SCE_STTXT_KEYWORD 3\n#define SCE_STTXT_TYPE 4\n#define SCE_STTXT_FUNCTION 5\n#define SCE_STTXT_FB 6\n#define SCE_STTXT_NUMBER 7\n#define SCE_STTXT_HEXNUMBER 8\n#define SCE_STTXT_PRAGMA 9\n#define SCE_STTXT_OPERATOR 10\n#define SCE_STTXT_CHARACTER 11\n#define SCE_STTXT_STRING1 12\n#define SCE_STTXT_STRING2 13\n#define SCE_STTXT_STRINGEOL 14\n#define SCE_STTXT_IDENTIFIER 15\n#define SCE_STTXT_DATETIME 16\n#define SCE_STTXT_VARS 17\n#define SCE_STTXT_PRAGMAS 18\n#define SCE_KVIRC_DEFAULT 0\n#define SCE_KVIRC_COMMENT 1\n#define SCE_KVIRC_COMMENTBLOCK 2\n#define SCE_KVIRC_STRING 3\n#define SCE_KVIRC_WORD 4\n#define SCE_KVIRC_KEYWORD 5\n#define SCE_KVIRC_FUNCTION_KEYWORD 6\n#define SCE_KVIRC_FUNCTION 7\n#define SCE_KVIRC_VARIABLE 8\n#define SCE_KVIRC_NUMBER 9\n#define SCE_KVIRC_OPERATOR 10\n#define SCE_KVIRC_STRING_FUNCTION 11\n#define SCE_KVIRC_STRING_VARIABLE 12\n#define SCE_RUST_DEFAULT 0\n#define SCE_RUST_COMMENTBLOCK 1\n#define SCE_RUST_COMMENTLINE 2\n#define SCE_RUST_COMMENTBLOCKDOC 3\n#define SCE_RUST_COMMENTLINEDOC 4\n#define SCE_RUST_NUMBER 5\n#define SCE_RUST_WORD 6\n#define SCE_RUST_WORD2 7\n#define SCE_RUST_WORD3 8\n#define SCE_RUST_WORD4 9\n#define SCE_RUST_WORD5 10\n#define SCE_RUST_WORD6 11\n#define SCE_RUST_WORD7 12\n#define SCE_RUST_STRING 13\n#define SCE_RUST_STRINGR 14\n#define SCE_RUST_CHARACTER 15\n#define SCE_RUST_OPERATOR 16\n#define SCE_RUST_IDENTIFIER 17\n#define SCE_RUST_LIFETIME 18\n#define SCE_RUST_MACRO 19\n#define SCE_RUST_LEXERROR 20\n/* --Autogenerated -- end of section automatically generated from Scintilla.iface */\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/include/Scintilla.h",
    "content": "/* Scintilla source code edit control */\n/** @file Scintilla.h\n ** Interface to the edit control.\n **/\n/* Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n * The License.txt file describes the conditions under which this software may be distributed. */\n\n/* Most of this file is automatically generated from the Scintilla.iface interface definition\n * file which contains any comments about the definitions. HFacer.py does the generation. */\n\n#ifndef SCINTILLA_H\n#define SCINTILLA_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if defined(_WIN32)\n/* Return false on failure: */\nint Scintilla_RegisterClasses(void *hInstance);\nint Scintilla_ReleaseResources();\n#endif\nint Scintilla_LinkLexers();\n\n#ifdef __cplusplus\n}\n#endif\n\n/* Here should be placed typedefs for uptr_t, an unsigned integer type large enough to\n * hold a pointer and sptr_t, a signed integer large enough to hold a pointer.\n * May need to be changed for 64 bit platforms. */\n#if defined(_WIN32)\n#include <basetsd.h>\n#endif\n#ifdef MAXULONG_PTR\ntypedef ULONG_PTR uptr_t;\ntypedef LONG_PTR sptr_t;\n#else\ntypedef unsigned long uptr_t;\ntypedef long sptr_t;\n#endif\n\ntypedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, sptr_t lParam);\n\n/* ++Autogenerated -- start of section automatically generated from Scintilla.iface */\n#define INVALID_POSITION -1\n#define SCI_START 2000\n#define SCI_OPTIONAL_START 3000\n#define SCI_LEXER_START 4000\n#define SCI_ADDTEXT 2001\n#define SCI_ADDSTYLEDTEXT 2002\n#define SCI_INSERTTEXT 2003\n#define SCI_CLEARALL 2004\n#define SCI_DELETERANGE 2645\n#define SCI_CLEARDOCUMENTSTYLE 2005\n#define SCI_GETLENGTH 2006\n#define SCI_GETCHARAT 2007\n#define SCI_GETCURRENTPOS 2008\n#define SCI_GETANCHOR 2009\n#define SCI_GETSTYLEAT 2010\n#define SCI_REDO 2011\n#define SCI_SETUNDOCOLLECTION 2012\n#define SCI_SELECTALL 2013\n#define SCI_SETSAVEPOINT 2014\n#define SCI_GETSTYLEDTEXT 2015\n#define SCI_CANREDO 2016\n#define SCI_MARKERLINEFROMHANDLE 2017\n#define SCI_MARKERDELETEHANDLE 2018\n#define SCI_GETUNDOCOLLECTION 2019\n#define SCWS_INVISIBLE 0\n#define SCWS_VISIBLEALWAYS 1\n#define SCWS_VISIBLEAFTERINDENT 2\n#define SCI_GETVIEWWS 2020\n#define SCI_SETVIEWWS 2021\n#define SCI_POSITIONFROMPOINT 2022\n#define SCI_POSITIONFROMPOINTCLOSE 2023\n#define SCI_GOTOLINE 2024\n#define SCI_GOTOPOS 2025\n#define SCI_SETANCHOR 2026\n#define SCI_GETCURLINE 2027\n#define SCI_GETENDSTYLED 2028\n#define SC_EOL_CRLF 0\n#define SC_EOL_CR 1\n#define SC_EOL_LF 2\n#define SCI_CONVERTEOLS 2029\n#define SCI_GETEOLMODE 2030\n#define SCI_SETEOLMODE 2031\n#define SCI_STARTSTYLING 2032\n#define SCI_SETSTYLING 2033\n#define SCI_GETBUFFEREDDRAW 2034\n#define SCI_SETBUFFEREDDRAW 2035\n#define SCI_SETTABWIDTH 2036\n#define SCI_GETTABWIDTH 2121\n#define SC_CP_UTF8 65001\n#define SCI_SETCODEPAGE 2037\n#define MARKER_MAX 31\n#define SC_MARK_CIRCLE 0\n#define SC_MARK_ROUNDRECT 1\n#define SC_MARK_ARROW 2\n#define SC_MARK_SMALLRECT 3\n#define SC_MARK_SHORTARROW 4\n#define SC_MARK_EMPTY 5\n#define SC_MARK_ARROWDOWN 6\n#define SC_MARK_MINUS 7\n#define SC_MARK_PLUS 8\n#define SC_MARK_VLINE 9\n#define SC_MARK_LCORNER 10\n#define SC_MARK_TCORNER 11\n#define SC_MARK_BOXPLUS 12\n#define SC_MARK_BOXPLUSCONNECTED 13\n#define SC_MARK_BOXMINUS 14\n#define SC_MARK_BOXMINUSCONNECTED 15\n#define SC_MARK_LCORNERCURVE 16\n#define SC_MARK_TCORNERCURVE 17\n#define SC_MARK_CIRCLEPLUS 18\n#define SC_MARK_CIRCLEPLUSCONNECTED 19\n#define SC_MARK_CIRCLEMINUS 20\n#define SC_MARK_CIRCLEMINUSCONNECTED 21\n#define SC_MARK_BACKGROUND 22\n#define SC_MARK_DOTDOTDOT 23\n#define SC_MARK_ARROWS 24\n#define SC_MARK_PIXMAP 25\n#define SC_MARK_FULLRECT 26\n#define SC_MARK_LEFTRECT 27\n#define SC_MARK_AVAILABLE 28\n#define SC_MARK_UNDERLINE 29\n#define SC_MARK_RGBAIMAGE 30\n#define SC_MARK_CHARACTER 10000\n#define SC_MARKNUM_FOLDEREND 25\n#define SC_MARKNUM_FOLDEROPENMID 26\n#define SC_MARKNUM_FOLDERMIDTAIL 27\n#define SC_MARKNUM_FOLDERTAIL 28\n#define SC_MARKNUM_FOLDERSUB 29\n#define SC_MARKNUM_FOLDER 30\n#define SC_MARKNUM_FOLDEROPEN 31\n#define SC_MASK_FOLDERS 0xFE000000\n#define SCI_MARKERDEFINE 2040\n#define SCI_MARKERSETFORE 2041\n#define SCI_MARKERSETBACK 2042\n#define SCI_MARKERSETBACKSELECTED 2292\n#define SCI_MARKERENABLEHIGHLIGHT 2293\n#define SCI_MARKERADD 2043\n#define SCI_MARKERDELETE 2044\n#define SCI_MARKERDELETEALL 2045\n#define SCI_MARKERGET 2046\n#define SCI_MARKERNEXT 2047\n#define SCI_MARKERPREVIOUS 2048\n#define SCI_MARKERDEFINEPIXMAP 2049\n#define SCI_MARKERADDSET 2466\n#define SCI_MARKERSETALPHA 2476\n#define SC_MAX_MARGIN 4\n#define SC_MARGIN_SYMBOL 0\n#define SC_MARGIN_NUMBER 1\n#define SC_MARGIN_BACK 2\n#define SC_MARGIN_FORE 3\n#define SC_MARGIN_TEXT 4\n#define SC_MARGIN_RTEXT 5\n#define SCI_SETMARGINTYPEN 2240\n#define SCI_GETMARGINTYPEN 2241\n#define SCI_SETMARGINWIDTHN 2242\n#define SCI_GETMARGINWIDTHN 2243\n#define SCI_SETMARGINMASKN 2244\n#define SCI_GETMARGINMASKN 2245\n#define SCI_SETMARGINSENSITIVEN 2246\n#define SCI_GETMARGINSENSITIVEN 2247\n#define SCI_SETMARGINCURSORN 2248\n#define SCI_GETMARGINCURSORN 2249\n#define STYLE_DEFAULT 32\n#define STYLE_LINENUMBER 33\n#define STYLE_BRACELIGHT 34\n#define STYLE_BRACEBAD 35\n#define STYLE_CONTROLCHAR 36\n#define STYLE_INDENTGUIDE 37\n#define STYLE_CALLTIP 38\n#define STYLE_LASTPREDEFINED 39\n#define STYLE_MAX 255\n#define SC_CHARSET_ANSI 0\n#define SC_CHARSET_DEFAULT 1\n#define SC_CHARSET_BALTIC 186\n#define SC_CHARSET_CHINESEBIG5 136\n#define SC_CHARSET_EASTEUROPE 238\n#define SC_CHARSET_GB2312 134\n#define SC_CHARSET_GREEK 161\n#define SC_CHARSET_HANGUL 129\n#define SC_CHARSET_MAC 77\n#define SC_CHARSET_OEM 255\n#define SC_CHARSET_RUSSIAN 204\n#define SC_CHARSET_CYRILLIC 1251\n#define SC_CHARSET_SHIFTJIS 128\n#define SC_CHARSET_SYMBOL 2\n#define SC_CHARSET_TURKISH 162\n#define SC_CHARSET_JOHAB 130\n#define SC_CHARSET_HEBREW 177\n#define SC_CHARSET_ARABIC 178\n#define SC_CHARSET_VIETNAMESE 163\n#define SC_CHARSET_THAI 222\n#define SC_CHARSET_8859_15 1000\n#define SCI_STYLECLEARALL 2050\n#define SCI_STYLESETFORE 2051\n#define SCI_STYLESETBACK 2052\n#define SCI_STYLESETBOLD 2053\n#define SCI_STYLESETITALIC 2054\n#define SCI_STYLESETSIZE 2055\n#define SCI_STYLESETFONT 2056\n#define SCI_STYLESETEOLFILLED 2057\n#define SCI_STYLERESETDEFAULT 2058\n#define SCI_STYLESETUNDERLINE 2059\n#define SC_CASE_MIXED 0\n#define SC_CASE_UPPER 1\n#define SC_CASE_LOWER 2\n#define SCI_STYLEGETFORE 2481\n#define SCI_STYLEGETBACK 2482\n#define SCI_STYLEGETBOLD 2483\n#define SCI_STYLEGETITALIC 2484\n#define SCI_STYLEGETSIZE 2485\n#define SCI_STYLEGETFONT 2486\n#define SCI_STYLEGETEOLFILLED 2487\n#define SCI_STYLEGETUNDERLINE 2488\n#define SCI_STYLEGETCASE 2489\n#define SCI_STYLEGETCHARACTERSET 2490\n#define SCI_STYLEGETVISIBLE 2491\n#define SCI_STYLEGETCHANGEABLE 2492\n#define SCI_STYLEGETHOTSPOT 2493\n#define SCI_STYLESETCASE 2060\n#define SC_FONT_SIZE_MULTIPLIER 100\n#define SCI_STYLESETSIZEFRACTIONAL 2061\n#define SCI_STYLEGETSIZEFRACTIONAL 2062\n#define SC_WEIGHT_NORMAL 400\n#define SC_WEIGHT_SEMIBOLD 600\n#define SC_WEIGHT_BOLD 700\n#define SCI_STYLESETWEIGHT 2063\n#define SCI_STYLEGETWEIGHT 2064\n#define SCI_STYLESETCHARACTERSET 2066\n#define SCI_STYLESETHOTSPOT 2409\n#define SCI_SETSELFORE 2067\n#define SCI_SETSELBACK 2068\n#define SCI_GETSELALPHA 2477\n#define SCI_SETSELALPHA 2478\n#define SCI_GETSELEOLFILLED 2479\n#define SCI_SETSELEOLFILLED 2480\n#define SCI_SETCARETFORE 2069\n#define SCI_ASSIGNCMDKEY 2070\n#define SCI_CLEARCMDKEY 2071\n#define SCI_CLEARALLCMDKEYS 2072\n#define SCI_SETSTYLINGEX 2073\n#define SCI_STYLESETVISIBLE 2074\n#define SCI_GETCARETPERIOD 2075\n#define SCI_SETCARETPERIOD 2076\n#define SCI_SETWORDCHARS 2077\n#define SCI_GETWORDCHARS 2646\n#define SCI_BEGINUNDOACTION 2078\n#define SCI_ENDUNDOACTION 2079\n#define INDIC_PLAIN 0\n#define INDIC_SQUIGGLE 1\n#define INDIC_TT 2\n#define INDIC_DIAGONAL 3\n#define INDIC_STRIKE 4\n#define INDIC_HIDDEN 5\n#define INDIC_BOX 6\n#define INDIC_ROUNDBOX 7\n#define INDIC_STRAIGHTBOX 8\n#define INDIC_DASH 9\n#define INDIC_DOTS 10\n#define INDIC_SQUIGGLELOW 11\n#define INDIC_DOTBOX 12\n#define INDIC_SQUIGGLEPIXMAP 13\n#define INDIC_COMPOSITIONTHICK 14\n#define INDIC_MAX 31\n#define INDIC_CONTAINER 8\n#define INDIC0_MASK 0x20\n#define INDIC1_MASK 0x40\n#define INDIC2_MASK 0x80\n#define INDICS_MASK 0xE0\n#define SCI_INDICSETSTYLE 2080\n#define SCI_INDICGETSTYLE 2081\n#define SCI_INDICSETFORE 2082\n#define SCI_INDICGETFORE 2083\n#define SCI_INDICSETUNDER 2510\n#define SCI_INDICGETUNDER 2511\n#define SCI_SETWHITESPACEFORE 2084\n#define SCI_SETWHITESPACEBACK 2085\n#define SCI_SETWHITESPACESIZE 2086\n#define SCI_GETWHITESPACESIZE 2087\n#define SCI_SETSTYLEBITS 2090\n#define SCI_GETSTYLEBITS 2091\n#define SCI_SETLINESTATE 2092\n#define SCI_GETLINESTATE 2093\n#define SCI_GETMAXLINESTATE 2094\n#define SCI_GETCARETLINEVISIBLE 2095\n#define SCI_SETCARETLINEVISIBLE 2096\n#define SCI_GETCARETLINEBACK 2097\n#define SCI_SETCARETLINEBACK 2098\n#define SCI_STYLESETCHANGEABLE 2099\n#define SCI_AUTOCSHOW 2100\n#define SCI_AUTOCCANCEL 2101\n#define SCI_AUTOCACTIVE 2102\n#define SCI_AUTOCPOSSTART 2103\n#define SCI_AUTOCCOMPLETE 2104\n#define SCI_AUTOCSTOPS 2105\n#define SCI_AUTOCSETSEPARATOR 2106\n#define SCI_AUTOCGETSEPARATOR 2107\n#define SCI_AUTOCSELECT 2108\n#define SCI_AUTOCSETCANCELATSTART 2110\n#define SCI_AUTOCGETCANCELATSTART 2111\n#define SCI_AUTOCSETFILLUPS 2112\n#define SCI_AUTOCSETCHOOSESINGLE 2113\n#define SCI_AUTOCGETCHOOSESINGLE 2114\n#define SCI_AUTOCSETIGNORECASE 2115\n#define SCI_AUTOCGETIGNORECASE 2116\n#define SCI_USERLISTSHOW 2117\n#define SCI_AUTOCSETAUTOHIDE 2118\n#define SCI_AUTOCGETAUTOHIDE 2119\n#define SCI_AUTOCSETDROPRESTOFWORD 2270\n#define SCI_AUTOCGETDROPRESTOFWORD 2271\n#define SCI_REGISTERIMAGE 2405\n#define SCI_CLEARREGISTEREDIMAGES 2408\n#define SCI_AUTOCGETTYPESEPARATOR 2285\n#define SCI_AUTOCSETTYPESEPARATOR 2286\n#define SCI_AUTOCSETMAXWIDTH 2208\n#define SCI_AUTOCGETMAXWIDTH 2209\n#define SCI_AUTOCSETMAXHEIGHT 2210\n#define SCI_AUTOCGETMAXHEIGHT 2211\n#define SCI_SETINDENT 2122\n#define SCI_GETINDENT 2123\n#define SCI_SETUSETABS 2124\n#define SCI_GETUSETABS 2125\n#define SCI_SETLINEINDENTATION 2126\n#define SCI_GETLINEINDENTATION 2127\n#define SCI_GETLINEINDENTPOSITION 2128\n#define SCI_GETCOLUMN 2129\n#define SCI_COUNTCHARACTERS 2633\n#define SCI_SETHSCROLLBAR 2130\n#define SCI_GETHSCROLLBAR 2131\n#define SC_IV_NONE 0\n#define SC_IV_REAL 1\n#define SC_IV_LOOKFORWARD 2\n#define SC_IV_LOOKBOTH 3\n#define SCI_SETINDENTATIONGUIDES 2132\n#define SCI_GETINDENTATIONGUIDES 2133\n#define SCI_SETHIGHLIGHTGUIDE 2134\n#define SCI_GETHIGHLIGHTGUIDE 2135\n#define SCI_GETLINEENDPOSITION 2136\n#define SCI_GETCODEPAGE 2137\n#define SCI_GETCARETFORE 2138\n#define SCI_GETREADONLY 2140\n#define SCI_SETCURRENTPOS 2141\n#define SCI_SETSELECTIONSTART 2142\n#define SCI_GETSELECTIONSTART 2143\n#define SCI_SETSELECTIONEND 2144\n#define SCI_GETSELECTIONEND 2145\n#define SCI_SETEMPTYSELECTION 2556\n#define SCI_SETPRINTMAGNIFICATION 2146\n#define SCI_GETPRINTMAGNIFICATION 2147\n#define SC_PRINT_NORMAL 0\n#define SC_PRINT_INVERTLIGHT 1\n#define SC_PRINT_BLACKONWHITE 2\n#define SC_PRINT_COLOURONWHITE 3\n#define SC_PRINT_COLOURONWHITEDEFAULTBG 4\n#define SCI_SETPRINTCOLOURMODE 2148\n#define SCI_GETPRINTCOLOURMODE 2149\n#define SCFIND_WHOLEWORD 2\n#define SCFIND_MATCHCASE 4\n#define SCFIND_WORDSTART 0x00100000\n#define SCFIND_REGEXP 0x00200000\n#define SCFIND_POSIX 0x00400000\n#define SCI_FINDTEXT 2150\n#define SCI_FORMATRANGE 2151\n#define SCI_GETFIRSTVISIBLELINE 2152\n#define SCI_GETLINE 2153\n#define SCI_GETLINECOUNT 2154\n#define SCI_SETMARGINLEFT 2155\n#define SCI_GETMARGINLEFT 2156\n#define SCI_SETMARGINRIGHT 2157\n#define SCI_GETMARGINRIGHT 2158\n#define SCI_GETMODIFY 2159\n#define SCI_SETSEL 2160\n#define SCI_GETSELTEXT 2161\n#define SCI_GETTEXTRANGE 2162\n#define SCI_HIDESELECTION 2163\n#define SCI_POINTXFROMPOSITION 2164\n#define SCI_POINTYFROMPOSITION 2165\n#define SCI_LINEFROMPOSITION 2166\n#define SCI_POSITIONFROMLINE 2167\n#define SCI_LINESCROLL 2168\n#define SCI_SCROLLCARET 2169\n#define SCI_SCROLLRANGE 2569\n#define SCI_REPLACESEL 2170\n#define SCI_SETREADONLY 2171\n#define SCI_NULL 2172\n#define SCI_CANPASTE 2173\n#define SCI_CANUNDO 2174\n#define SCI_EMPTYUNDOBUFFER 2175\n#define SCI_UNDO 2176\n#define SCI_CUT 2177\n#define SCI_COPY 2178\n#define SCI_PASTE 2179\n#define SCI_CLEAR 2180\n#define SCI_SETTEXT 2181\n#define SCI_GETTEXT 2182\n#define SCI_GETTEXTLENGTH 2183\n#define SCI_GETDIRECTFUNCTION 2184\n#define SCI_GETDIRECTPOINTER 2185\n#define SCI_SETOVERTYPE 2186\n#define SCI_GETOVERTYPE 2187\n#define SCI_SETCARETWIDTH 2188\n#define SCI_GETCARETWIDTH 2189\n#define SCI_SETTARGETSTART 2190\n#define SCI_GETTARGETSTART 2191\n#define SCI_SETTARGETEND 2192\n#define SCI_GETTARGETEND 2193\n#define SCI_REPLACETARGET 2194\n#define SCI_REPLACETARGETRE 2195\n#define SCI_SEARCHINTARGET 2197\n#define SCI_SETSEARCHFLAGS 2198\n#define SCI_GETSEARCHFLAGS 2199\n#define SCI_CALLTIPSHOW 2200\n#define SCI_CALLTIPCANCEL 2201\n#define SCI_CALLTIPACTIVE 2202\n#define SCI_CALLTIPPOSSTART 2203\n#define SCI_CALLTIPSETHLT 2204\n#define SCI_CALLTIPSETBACK 2205\n#define SCI_CALLTIPSETFORE 2206\n#define SCI_CALLTIPSETFOREHLT 2207\n#define SCI_CALLTIPUSESTYLE 2212\n#define SCI_CALLTIPSETPOSITION 2213\n#define SCI_VISIBLEFROMDOCLINE 2220\n#define SCI_DOCLINEFROMVISIBLE 2221\n#define SCI_WRAPCOUNT 2235\n#define SC_FOLDLEVELBASE 0x400\n#define SC_FOLDLEVELWHITEFLAG 0x1000\n#define SC_FOLDLEVELHEADERFLAG 0x2000\n#define SC_FOLDLEVELNUMBERMASK 0x0FFF\n#define SCI_SETFOLDLEVEL 2222\n#define SCI_GETFOLDLEVEL 2223\n#define SCI_GETLASTCHILD 2224\n#define SCI_GETFOLDPARENT 2225\n#define SCI_SHOWLINES 2226\n#define SCI_HIDELINES 2227\n#define SCI_GETLINEVISIBLE 2228\n#define SCI_GETALLLINESVISIBLE 2236\n#define SCI_SETFOLDEXPANDED 2229\n#define SCI_GETFOLDEXPANDED 2230\n#define SCI_TOGGLEFOLD 2231\n#define SC_FOLDACTION_CONTRACT 0\n#define SC_FOLDACTION_EXPAND 1\n#define SC_FOLDACTION_TOGGLE 2\n#define SCI_FOLDLINE 2237\n#define SCI_FOLDCHILDREN 2238\n#define SCI_EXPANDCHILDREN 2239\n#define SCI_FOLDALL 2662\n#define SCI_ENSUREVISIBLE 2232\n#define SC_AUTOMATICFOLD_SHOW 0x0001\n#define SC_AUTOMATICFOLD_CLICK 0x0002\n#define SC_AUTOMATICFOLD_CHANGE 0x0004\n#define SCI_SETAUTOMATICFOLD 2663\n#define SCI_GETAUTOMATICFOLD 2664\n#define SC_FOLDFLAG_LINEBEFORE_EXPANDED 0x0002\n#define SC_FOLDFLAG_LINEBEFORE_CONTRACTED 0x0004\n#define SC_FOLDFLAG_LINEAFTER_EXPANDED 0x0008\n#define SC_FOLDFLAG_LINEAFTER_CONTRACTED 0x0010\n#define SC_FOLDFLAG_LEVELNUMBERS 0x0040\n#define SCI_SETFOLDFLAGS 2233\n#define SCI_ENSUREVISIBLEENFORCEPOLICY 2234\n#define SCI_SETTABINDENTS 2260\n#define SCI_GETTABINDENTS 2261\n#define SCI_SETBACKSPACEUNINDENTS 2262\n#define SCI_GETBACKSPACEUNINDENTS 2263\n#define SC_TIME_FOREVER 10000000\n#define SCI_SETMOUSEDWELLTIME 2264\n#define SCI_GETMOUSEDWELLTIME 2265\n#define SCI_WORDSTARTPOSITION 2266\n#define SCI_WORDENDPOSITION 2267\n#define SC_WRAP_NONE 0\n#define SC_WRAP_WORD 1\n#define SC_WRAP_CHAR 2\n#define SCI_SETWRAPMODE 2268\n#define SCI_GETWRAPMODE 2269\n#define SC_WRAPVISUALFLAG_NONE 0x0000\n#define SC_WRAPVISUALFLAG_END 0x0001\n#define SC_WRAPVISUALFLAG_START 0x0002\n#define SC_WRAPVISUALFLAG_MARGIN 0x0004\n#define SCI_SETWRAPVISUALFLAGS 2460\n#define SCI_GETWRAPVISUALFLAGS 2461\n#define SC_WRAPVISUALFLAGLOC_DEFAULT 0x0000\n#define SC_WRAPVISUALFLAGLOC_END_BY_TEXT 0x0001\n#define SC_WRAPVISUALFLAGLOC_START_BY_TEXT 0x0002\n#define SCI_SETWRAPVISUALFLAGSLOCATION 2462\n#define SCI_GETWRAPVISUALFLAGSLOCATION 2463\n#define SCI_SETWRAPSTARTINDENT 2464\n#define SCI_GETWRAPSTARTINDENT 2465\n#define SC_WRAPINDENT_FIXED 0\n#define SC_WRAPINDENT_SAME 1\n#define SC_WRAPINDENT_INDENT 2\n#define SCI_SETWRAPINDENTMODE 2472\n#define SCI_GETWRAPINDENTMODE 2473\n#define SC_CACHE_NONE 0\n#define SC_CACHE_CARET 1\n#define SC_CACHE_PAGE 2\n#define SC_CACHE_DOCUMENT 3\n#define SCI_SETLAYOUTCACHE 2272\n#define SCI_GETLAYOUTCACHE 2273\n#define SCI_SETSCROLLWIDTH 2274\n#define SCI_GETSCROLLWIDTH 2275\n#define SCI_SETSCROLLWIDTHTRACKING 2516\n#define SCI_GETSCROLLWIDTHTRACKING 2517\n#define SCI_TEXTWIDTH 2276\n#define SCI_SETENDATLASTLINE 2277\n#define SCI_GETENDATLASTLINE 2278\n#define SCI_TEXTHEIGHT 2279\n#define SCI_SETVSCROLLBAR 2280\n#define SCI_GETVSCROLLBAR 2281\n#define SCI_APPENDTEXT 2282\n#define SCI_GETTWOPHASEDRAW 2283\n#define SCI_SETTWOPHASEDRAW 2284\n#define SC_EFF_QUALITY_MASK 0xF\n#define SC_EFF_QUALITY_DEFAULT 0\n#define SC_EFF_QUALITY_NON_ANTIALIASED 1\n#define SC_EFF_QUALITY_ANTIALIASED 2\n#define SC_EFF_QUALITY_LCD_OPTIMIZED 3\n#define SCI_SETFONTQUALITY 2611\n#define SCI_GETFONTQUALITY 2612\n#define SCI_SETFIRSTVISIBLELINE 2613\n#define SC_MULTIPASTE_ONCE 0\n#define SC_MULTIPASTE_EACH 1\n#define SCI_SETMULTIPASTE 2614\n#define SCI_GETMULTIPASTE 2615\n#define SCI_GETTAG 2616\n#define SCI_TARGETFROMSELECTION 2287\n#define SCI_LINESJOIN 2288\n#define SCI_LINESSPLIT 2289\n#define SCI_SETFOLDMARGINCOLOUR 2290\n#define SCI_SETFOLDMARGINHICOLOUR 2291\n#define SCI_LINEDOWN 2300\n#define SCI_LINEDOWNEXTEND 2301\n#define SCI_LINEUP 2302\n#define SCI_LINEUPEXTEND 2303\n#define SCI_CHARLEFT 2304\n#define SCI_CHARLEFTEXTEND 2305\n#define SCI_CHARRIGHT 2306\n#define SCI_CHARRIGHTEXTEND 2307\n#define SCI_WORDLEFT 2308\n#define SCI_WORDLEFTEXTEND 2309\n#define SCI_WORDRIGHT 2310\n#define SCI_WORDRIGHTEXTEND 2311\n#define SCI_HOME 2312\n#define SCI_HOMEEXTEND 2313\n#define SCI_LINEEND 2314\n#define SCI_LINEENDEXTEND 2315\n#define SCI_DOCUMENTSTART 2316\n#define SCI_DOCUMENTSTARTEXTEND 2317\n#define SCI_DOCUMENTEND 2318\n#define SCI_DOCUMENTENDEXTEND 2319\n#define SCI_PAGEUP 2320\n#define SCI_PAGEUPEXTEND 2321\n#define SCI_PAGEDOWN 2322\n#define SCI_PAGEDOWNEXTEND 2323\n#define SCI_EDITTOGGLEOVERTYPE 2324\n#define SCI_CANCEL 2325\n#define SCI_DELETEBACK 2326\n#define SCI_TAB 2327\n#define SCI_BACKTAB 2328\n#define SCI_NEWLINE 2329\n#define SCI_FORMFEED 2330\n#define SCI_VCHOME 2331\n#define SCI_VCHOMEEXTEND 2332\n#define SCI_ZOOMIN 2333\n#define SCI_ZOOMOUT 2334\n#define SCI_DELWORDLEFT 2335\n#define SCI_DELWORDRIGHT 2336\n#define SCI_DELWORDRIGHTEND 2518\n#define SCI_LINECUT 2337\n#define SCI_LINEDELETE 2338\n#define SCI_LINETRANSPOSE 2339\n#define SCI_LINEDUPLICATE 2404\n#define SCI_LOWERCASE 2340\n#define SCI_UPPERCASE 2341\n#define SCI_LINESCROLLDOWN 2342\n#define SCI_LINESCROLLUP 2343\n#define SCI_DELETEBACKNOTLINE 2344\n#define SCI_HOMEDISPLAY 2345\n#define SCI_HOMEDISPLAYEXTEND 2346\n#define SCI_LINEENDDISPLAY 2347\n#define SCI_LINEENDDISPLAYEXTEND 2348\n#define SCI_HOMEWRAP 2349\n#define SCI_HOMEWRAPEXTEND 2450\n#define SCI_LINEENDWRAP 2451\n#define SCI_LINEENDWRAPEXTEND 2452\n#define SCI_VCHOMEWRAP 2453\n#define SCI_VCHOMEWRAPEXTEND 2454\n#define SCI_LINECOPY 2455\n#define SCI_MOVECARETINSIDEVIEW 2401\n#define SCI_LINELENGTH 2350\n#define SCI_BRACEHIGHLIGHT 2351\n#define SCI_BRACEHIGHLIGHTINDICATOR 2498\n#define SCI_BRACEBADLIGHT 2352\n#define SCI_BRACEBADLIGHTINDICATOR 2499\n#define SCI_BRACEMATCH 2353\n#define SCI_GETVIEWEOL 2355\n#define SCI_SETVIEWEOL 2356\n#define SCI_GETDOCPOINTER 2357\n#define SCI_SETDOCPOINTER 2358\n#define SCI_SETMODEVENTMASK 2359\n#define EDGE_NONE 0\n#define EDGE_LINE 1\n#define EDGE_BACKGROUND 2\n#define SCI_GETEDGECOLUMN 2360\n#define SCI_SETEDGECOLUMN 2361\n#define SCI_GETEDGEMODE 2362\n#define SCI_SETEDGEMODE 2363\n#define SCI_GETEDGECOLOUR 2364\n#define SCI_SETEDGECOLOUR 2365\n#define SCI_SEARCHANCHOR 2366\n#define SCI_SEARCHNEXT 2367\n#define SCI_SEARCHPREV 2368\n#define SCI_LINESONSCREEN 2370\n#define SCI_USEPOPUP 2371\n#define SCI_SELECTIONISRECTANGLE 2372\n#define SCI_SETZOOM 2373\n#define SCI_GETZOOM 2374\n#define SCI_CREATEDOCUMENT 2375\n#define SCI_ADDREFDOCUMENT 2376\n#define SCI_RELEASEDOCUMENT 2377\n#define SCI_GETMODEVENTMASK 2378\n#define SCI_SETFOCUS 2380\n#define SCI_GETFOCUS 2381\n#define SC_STATUS_OK 0\n#define SC_STATUS_FAILURE 1\n#define SC_STATUS_BADALLOC 2\n#define SCI_SETSTATUS 2382\n#define SCI_GETSTATUS 2383\n#define SCI_SETMOUSEDOWNCAPTURES 2384\n#define SCI_GETMOUSEDOWNCAPTURES 2385\n#define SC_CURSORNORMAL -1\n#define SC_CURSORARROW 2\n#define SC_CURSORWAIT 4\n#define SC_CURSORREVERSEARROW 7\n#define SCI_SETCURSOR 2386\n#define SCI_GETCURSOR 2387\n#define SCI_SETCONTROLCHARSYMBOL 2388\n#define SCI_GETCONTROLCHARSYMBOL 2389\n#define SCI_WORDPARTLEFT 2390\n#define SCI_WORDPARTLEFTEXTEND 2391\n#define SCI_WORDPARTRIGHT 2392\n#define SCI_WORDPARTRIGHTEXTEND 2393\n#define VISIBLE_SLOP 0x01\n#define VISIBLE_STRICT 0x04\n#define SCI_SETVISIBLEPOLICY 2394\n#define SCI_DELLINELEFT 2395\n#define SCI_DELLINERIGHT 2396\n#define SCI_SETXOFFSET 2397\n#define SCI_GETXOFFSET 2398\n#define SCI_CHOOSECARETX 2399\n#define SCI_GRABFOCUS 2400\n#define CARET_SLOP 0x01\n#define CARET_STRICT 0x04\n#define CARET_JUMPS 0x10\n#define CARET_EVEN 0x08\n#define SCI_SETXCARETPOLICY 2402\n#define SCI_SETYCARETPOLICY 2403\n#define SCI_SETPRINTWRAPMODE 2406\n#define SCI_GETPRINTWRAPMODE 2407\n#define SCI_SETHOTSPOTACTIVEFORE 2410\n#define SCI_GETHOTSPOTACTIVEFORE 2494\n#define SCI_SETHOTSPOTACTIVEBACK 2411\n#define SCI_GETHOTSPOTACTIVEBACK 2495\n#define SCI_SETHOTSPOTACTIVEUNDERLINE 2412\n#define SCI_GETHOTSPOTACTIVEUNDERLINE 2496\n#define SCI_SETHOTSPOTSINGLELINE 2421\n#define SCI_GETHOTSPOTSINGLELINE 2497\n#define SCI_PARADOWN 2413\n#define SCI_PARADOWNEXTEND 2414\n#define SCI_PARAUP 2415\n#define SCI_PARAUPEXTEND 2416\n#define SCI_POSITIONBEFORE 2417\n#define SCI_POSITIONAFTER 2418\n#define SCI_POSITIONRELATIVE 2670\n#define SCI_COPYRANGE 2419\n#define SCI_COPYTEXT 2420\n#define SC_SEL_STREAM 0\n#define SC_SEL_RECTANGLE 1\n#define SC_SEL_LINES 2\n#define SC_SEL_THIN 3\n#define SCI_SETSELECTIONMODE 2422\n#define SCI_GETSELECTIONMODE 2423\n#define SCI_GETLINESELSTARTPOSITION 2424\n#define SCI_GETLINESELENDPOSITION 2425\n#define SCI_LINEDOWNRECTEXTEND 2426\n#define SCI_LINEUPRECTEXTEND 2427\n#define SCI_CHARLEFTRECTEXTEND 2428\n#define SCI_CHARRIGHTRECTEXTEND 2429\n#define SCI_HOMERECTEXTEND 2430\n#define SCI_VCHOMERECTEXTEND 2431\n#define SCI_LINEENDRECTEXTEND 2432\n#define SCI_PAGEUPRECTEXTEND 2433\n#define SCI_PAGEDOWNRECTEXTEND 2434\n#define SCI_STUTTEREDPAGEUP 2435\n#define SCI_STUTTEREDPAGEUPEXTEND 2436\n#define SCI_STUTTEREDPAGEDOWN 2437\n#define SCI_STUTTEREDPAGEDOWNEXTEND 2438\n#define SCI_WORDLEFTEND 2439\n#define SCI_WORDLEFTENDEXTEND 2440\n#define SCI_WORDRIGHTEND 2441\n#define SCI_WORDRIGHTENDEXTEND 2442\n#define SCI_SETWHITESPACECHARS 2443\n#define SCI_GETWHITESPACECHARS 2647\n#define SCI_SETPUNCTUATIONCHARS 2648\n#define SCI_GETPUNCTUATIONCHARS 2649\n#define SCI_SETCHARSDEFAULT 2444\n#define SCI_AUTOCGETCURRENT 2445\n#define SCI_AUTOCGETCURRENTTEXT 2610\n#define SC_CASEINSENSITIVEBEHAVIOUR_RESPECTCASE 0\n#define SC_CASEINSENSITIVEBEHAVIOUR_IGNORECASE 1\n#define SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR 2634\n#define SCI_AUTOCGETCASEINSENSITIVEBEHAVIOUR 2635\n#define SC_ORDER_PRESORTED 0\n#define SC_ORDER_PERFORMSORT 1\n#define SC_ORDER_CUSTOM 2\n#define SCI_AUTOCSETORDER 2660\n#define SCI_AUTOCGETORDER 2661\n#define SCI_ALLOCATE 2446\n#define SCI_TARGETASUTF8 2447\n#define SCI_SETLENGTHFORENCODE 2448\n#define SCI_ENCODEDFROMUTF8 2449\n#define SCI_FINDCOLUMN 2456\n#define SCI_GETCARETSTICKY 2457\n#define SCI_SETCARETSTICKY 2458\n#define SC_CARETSTICKY_OFF 0\n#define SC_CARETSTICKY_ON 1\n#define SC_CARETSTICKY_WHITESPACE 2\n#define SCI_TOGGLECARETSTICKY 2459\n#define SCI_SETPASTECONVERTENDINGS 2467\n#define SCI_GETPASTECONVERTENDINGS 2468\n#define SCI_SELECTIONDUPLICATE 2469\n#define SC_ALPHA_TRANSPARENT 0\n#define SC_ALPHA_OPAQUE 255\n#define SC_ALPHA_NOALPHA 256\n#define SCI_SETCARETLINEBACKALPHA 2470\n#define SCI_GETCARETLINEBACKALPHA 2471\n#define CARETSTYLE_INVISIBLE 0\n#define CARETSTYLE_LINE 1\n#define CARETSTYLE_BLOCK 2\n#define SCI_SETCARETSTYLE 2512\n#define SCI_GETCARETSTYLE 2513\n#define SCI_SETINDICATORCURRENT 2500\n#define SCI_GETINDICATORCURRENT 2501\n#define SCI_SETINDICATORVALUE 2502\n#define SCI_GETINDICATORVALUE 2503\n#define SCI_INDICATORFILLRANGE 2504\n#define SCI_INDICATORCLEARRANGE 2505\n#define SCI_INDICATORALLONFOR 2506\n#define SCI_INDICATORVALUEAT 2507\n#define SCI_INDICATORSTART 2508\n#define SCI_INDICATOREND 2509\n#define SCI_SETPOSITIONCACHE 2514\n#define SCI_GETPOSITIONCACHE 2515\n#define SCI_COPYALLOWLINE 2519\n#define SCI_GETCHARACTERPOINTER 2520\n#define SCI_GETRANGEPOINTER 2643\n#define SCI_GETGAPPOSITION 2644\n#define SCI_SETKEYSUNICODE 2521\n#define SCI_GETKEYSUNICODE 2522\n#define SCI_INDICSETALPHA 2523\n#define SCI_INDICGETALPHA 2524\n#define SCI_INDICSETOUTLINEALPHA 2558\n#define SCI_INDICGETOUTLINEALPHA 2559\n#define SCI_SETEXTRAASCENT 2525\n#define SCI_GETEXTRAASCENT 2526\n#define SCI_SETEXTRADESCENT 2527\n#define SCI_GETEXTRADESCENT 2528\n#define SCI_MARKERSYMBOLDEFINED 2529\n#define SCI_MARGINSETTEXT 2530\n#define SCI_MARGINGETTEXT 2531\n#define SCI_MARGINSETSTYLE 2532\n#define SCI_MARGINGETSTYLE 2533\n#define SCI_MARGINSETSTYLES 2534\n#define SCI_MARGINGETSTYLES 2535\n#define SCI_MARGINTEXTCLEARALL 2536\n#define SCI_MARGINSETSTYLEOFFSET 2537\n#define SCI_MARGINGETSTYLEOFFSET 2538\n#define SC_MARGINOPTION_NONE 0\n#define SC_MARGINOPTION_SUBLINESELECT 1\n#define SCI_SETMARGINOPTIONS 2539\n#define SCI_GETMARGINOPTIONS 2557\n#define SCI_ANNOTATIONSETTEXT 2540\n#define SCI_ANNOTATIONGETTEXT 2541\n#define SCI_ANNOTATIONSETSTYLE 2542\n#define SCI_ANNOTATIONGETSTYLE 2543\n#define SCI_ANNOTATIONSETSTYLES 2544\n#define SCI_ANNOTATIONGETSTYLES 2545\n#define SCI_ANNOTATIONGETLINES 2546\n#define SCI_ANNOTATIONCLEARALL 2547\n#define ANNOTATION_HIDDEN 0\n#define ANNOTATION_STANDARD 1\n#define ANNOTATION_BOXED 2\n#define SCI_ANNOTATIONSETVISIBLE 2548\n#define SCI_ANNOTATIONGETVISIBLE 2549\n#define SCI_ANNOTATIONSETSTYLEOFFSET 2550\n#define SCI_ANNOTATIONGETSTYLEOFFSET 2551\n#define SCI_RELEASEALLEXTENDEDSTYLES 2552\n#define SCI_ALLOCATEEXTENDEDSTYLES 2553\n#define UNDO_MAY_COALESCE 1\n#define SCI_ADDUNDOACTION 2560\n#define SCI_CHARPOSITIONFROMPOINT 2561\n#define SCI_CHARPOSITIONFROMPOINTCLOSE 2562\n#define SCI_SETMOUSESELECTIONRECTANGULARSWITCH 2668\n#define SCI_GETMOUSESELECTIONRECTANGULARSWITCH 2669\n#define SCI_SETMULTIPLESELECTION 2563\n#define SCI_GETMULTIPLESELECTION 2564\n#define SCI_SETADDITIONALSELECTIONTYPING 2565\n#define SCI_GETADDITIONALSELECTIONTYPING 2566\n#define SCI_SETADDITIONALCARETSBLINK 2567\n#define SCI_GETADDITIONALCARETSBLINK 2568\n#define SCI_SETADDITIONALCARETSVISIBLE 2608\n#define SCI_GETADDITIONALCARETSVISIBLE 2609\n#define SCI_GETSELECTIONS 2570\n#define SCI_GETSELECTIONEMPTY 2650\n#define SCI_CLEARSELECTIONS 2571\n#define SCI_SETSELECTION 2572\n#define SCI_ADDSELECTION 2573\n#define SCI_SETMAINSELECTION 2574\n#define SCI_GETMAINSELECTION 2575\n#define SCI_SETSELECTIONNCARET 2576\n#define SCI_GETSELECTIONNCARET 2577\n#define SCI_SETSELECTIONNANCHOR 2578\n#define SCI_GETSELECTIONNANCHOR 2579\n#define SCI_SETSELECTIONNCARETVIRTUALSPACE 2580\n#define SCI_GETSELECTIONNCARETVIRTUALSPACE 2581\n#define SCI_SETSELECTIONNANCHORVIRTUALSPACE 2582\n#define SCI_GETSELECTIONNANCHORVIRTUALSPACE 2583\n#define SCI_SETSELECTIONNSTART 2584\n#define SCI_GETSELECTIONNSTART 2585\n#define SCI_SETSELECTIONNEND 2586\n#define SCI_GETSELECTIONNEND 2587\n#define SCI_SETRECTANGULARSELECTIONCARET 2588\n#define SCI_GETRECTANGULARSELECTIONCARET 2589\n#define SCI_SETRECTANGULARSELECTIONANCHOR 2590\n#define SCI_GETRECTANGULARSELECTIONANCHOR 2591\n#define SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE 2592\n#define SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE 2593\n#define SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE 2594\n#define SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE 2595\n#define SCVS_NONE 0\n#define SCVS_RECTANGULARSELECTION 1\n#define SCVS_USERACCESSIBLE 2\n#define SCI_SETVIRTUALSPACEOPTIONS 2596\n#define SCI_GETVIRTUALSPACEOPTIONS 2597\n#define SCI_SETRECTANGULARSELECTIONMODIFIER 2598\n#define SCI_GETRECTANGULARSELECTIONMODIFIER 2599\n#define SCI_SETADDITIONALSELFORE 2600\n#define SCI_SETADDITIONALSELBACK 2601\n#define SCI_SETADDITIONALSELALPHA 2602\n#define SCI_GETADDITIONALSELALPHA 2603\n#define SCI_SETADDITIONALCARETFORE 2604\n#define SCI_GETADDITIONALCARETFORE 2605\n#define SCI_ROTATESELECTION 2606\n#define SCI_SWAPMAINANCHORCARET 2607\n#define SCI_CHANGELEXERSTATE 2617\n#define SCI_CONTRACTEDFOLDNEXT 2618\n#define SCI_VERTICALCENTRECARET 2619\n#define SCI_MOVESELECTEDLINESUP 2620\n#define SCI_MOVESELECTEDLINESDOWN 2621\n#define SCI_SETIDENTIFIER 2622\n#define SCI_GETIDENTIFIER 2623\n#define SCI_RGBAIMAGESETWIDTH 2624\n#define SCI_RGBAIMAGESETHEIGHT 2625\n#define SCI_RGBAIMAGESETSCALE 2651\n#define SCI_MARKERDEFINERGBAIMAGE 2626\n#define SCI_REGISTERRGBAIMAGE 2627\n#define SCI_SCROLLTOSTART 2628\n#define SCI_SCROLLTOEND 2629\n#define SC_TECHNOLOGY_DEFAULT 0\n#define SC_TECHNOLOGY_DIRECTWRITE 1\n#define SCI_SETTECHNOLOGY 2630\n#define SCI_GETTECHNOLOGY 2631\n#define SCI_CREATELOADER 2632\n#define SCI_FINDINDICATORSHOW 2640\n#define SCI_FINDINDICATORFLASH 2641\n#define SCI_FINDINDICATORHIDE 2642\n#define SCI_VCHOMEDISPLAY 2652\n#define SCI_VCHOMEDISPLAYEXTEND 2653\n#define SCI_GETCARETLINEVISIBLEALWAYS 2654\n#define SCI_SETCARETLINEVISIBLEALWAYS 2655\n#define SCI_SETREPRESENTATION 2665\n#define SCI_GETREPRESENTATION 2666\n#define SCI_CLEARREPRESENTATION 2667\n#define SCI_STARTRECORD 3001\n#define SCI_STOPRECORD 3002\n#define SCI_SETLEXER 4001\n#define SCI_GETLEXER 4002\n#define SCI_COLOURISE 4003\n#define SCI_SETPROPERTY 4004\n#define KEYWORDSET_MAX 8\n#define SCI_SETKEYWORDS 4005\n#define SCI_SETLEXERLANGUAGE 4006\n#define SCI_LOADLEXERLIBRARY 4007\n#define SCI_GETPROPERTY 4008\n#define SCI_GETPROPERTYEXPANDED 4009\n#define SCI_GETPROPERTYINT 4010\n#define SCI_GETSTYLEBITSNEEDED 4011\n#define SCI_GETLEXERLANGUAGE 4012\n#define SCI_PRIVATELEXERCALL 4013\n#define SCI_PROPERTYNAMES 4014\n#define SC_TYPE_BOOLEAN 0\n#define SC_TYPE_INTEGER 1\n#define SC_TYPE_STRING 2\n#define SCI_PROPERTYTYPE 4015\n#define SCI_DESCRIBEPROPERTY 4016\n#define SCI_DESCRIBEKEYWORDSETS 4017\n#define SC_MOD_INSERTTEXT 0x1\n#define SC_MOD_DELETETEXT 0x2\n#define SC_MOD_CHANGESTYLE 0x4\n#define SC_MOD_CHANGEFOLD 0x8\n#define SC_PERFORMED_USER 0x10\n#define SC_PERFORMED_UNDO 0x20\n#define SC_PERFORMED_REDO 0x40\n#define SC_MULTISTEPUNDOREDO 0x80\n#define SC_LASTSTEPINUNDOREDO 0x100\n#define SC_MOD_CHANGEMARKER 0x200\n#define SC_MOD_BEFOREINSERT 0x400\n#define SC_MOD_BEFOREDELETE 0x800\n#define SC_MULTILINEUNDOREDO 0x1000\n#define SC_STARTACTION 0x2000\n#define SC_MOD_CHANGEINDICATOR 0x4000\n#define SC_MOD_CHANGELINESTATE 0x8000\n#define SC_MOD_CHANGEMARGIN 0x10000\n#define SC_MOD_CHANGEANNOTATION 0x20000\n#define SC_MOD_CONTAINER 0x40000\n#define SC_MOD_LEXERSTATE 0x80000\n#define SC_MODEVENTMASKALL 0xFFFFF\n#define SC_UPDATE_CONTENT 0x1\n#define SC_UPDATE_SELECTION 0x2\n#define SC_UPDATE_V_SCROLL 0x4\n#define SC_UPDATE_H_SCROLL 0x8\n#define SCEN_CHANGE 768\n#define SCEN_SETFOCUS 512\n#define SCEN_KILLFOCUS 256\n#define SCK_DOWN 300\n#define SCK_UP 301\n#define SCK_LEFT 302\n#define SCK_RIGHT 303\n#define SCK_HOME 304\n#define SCK_END 305\n#define SCK_PRIOR 306\n#define SCK_NEXT 307\n#define SCK_DELETE 308\n#define SCK_INSERT 309\n#define SCK_ESCAPE 7\n#define SCK_BACK 8\n#define SCK_TAB 9\n#define SCK_RETURN 13\n#define SCK_ADD 310\n#define SCK_SUBTRACT 311\n#define SCK_DIVIDE 312\n#define SCK_WIN 313\n#define SCK_RWIN 314\n#define SCK_MENU 315\n#define SCMOD_NORM 0\n#define SCMOD_SHIFT 1\n#define SCMOD_CTRL 2\n#define SCMOD_ALT 4\n#define SCMOD_SUPER 8\n#define SCMOD_META 16\n#define SCN_STYLENEEDED 2000\n#define SCN_CHARADDED 2001\n#define SCN_SAVEPOINTREACHED 2002\n#define SCN_SAVEPOINTLEFT 2003\n#define SCN_MODIFYATTEMPTRO 2004\n#define SCN_KEY 2005\n#define SCN_DOUBLECLICK 2006\n#define SCN_UPDATEUI 2007\n#define SCN_MODIFIED 2008\n#define SCN_MACRORECORD 2009\n#define SCN_MARGINCLICK 2010\n#define SCN_NEEDSHOWN 2011\n#define SCN_PAINTED 2013\n#define SCN_USERLISTSELECTION 2014\n#define SCN_URIDROPPED 2015\n#define SCN_DWELLSTART 2016\n#define SCN_DWELLEND 2017\n#define SCN_ZOOM 2018\n#define SCN_HOTSPOTCLICK 2019\n#define SCN_HOTSPOTDOUBLECLICK 2020\n#define SCN_CALLTIPCLICK 2021\n#define SCN_AUTOCSELECTION 2022\n#define SCN_INDICATORCLICK 2023\n#define SCN_INDICATORRELEASE 2024\n#define SCN_AUTOCCANCELLED 2025\n#define SCN_AUTOCCHARDELETED 2026\n#define SCN_HOTSPOTRELEASECLICK 2027\n#define SCN_FOCUSIN 2028\n#define SCN_FOCUSOUT 2029\n#ifndef SCI_DISABLE_PROVISIONAL\n#define SC_LINE_END_TYPE_DEFAULT 0\n#define SC_LINE_END_TYPE_UNICODE 1\n#define SCI_SETLINEENDTYPESALLOWED 2656\n#define SCI_GETLINEENDTYPESALLOWED 2657\n#define SCI_GETLINEENDTYPESACTIVE 2658\n#define SCI_GETLINEENDTYPESSUPPORTED 4018\n#define SCI_ALLOCATESUBSTYLES 4020\n#define SCI_GETSUBSTYLESSTART 4021\n#define SCI_GETSUBSTYLESLENGTH 4022\n#define SCI_GETSTYLEFROMSUBSTYLE 4027\n#define SCI_GETPRIMARYSTYLEFROMSTYLE 4028\n#define SCI_FREESUBSTYLES 4023\n#define SCI_SETIDENTIFIERS 4024\n#define SCI_DISTANCETOSECONDARYSTYLES 4025\n#define SCI_GETSUBSTYLEBASES 4026\n#endif\n/* --Autogenerated -- end of section automatically generated from Scintilla.iface */\n\n/* These structures are defined to be exactly the same shape as the Win32\n * CHARRANGE, TEXTRANGE, FINDTEXTEX, FORMATRANGE, and NMHDR structs.\n * So older code that treats Scintilla as a RichEdit will work. */\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nstruct Sci_CharacterRange {\n\tlong cpMin;\n\tlong cpMax;\n};\n\nstruct Sci_TextRange {\n\tstruct Sci_CharacterRange chrg;\n\tchar *lpstrText;\n};\n\nstruct Sci_TextToFind {\n\tstruct Sci_CharacterRange chrg;\n\tchar *lpstrText;\n\tstruct Sci_CharacterRange chrgText;\n};\n\n#define CharacterRange Sci_CharacterRange\n#define TextRange Sci_TextRange\n#define TextToFind Sci_TextToFind\n\ntypedef void *Sci_SurfaceID;\n\nstruct Sci_Rectangle {\n\tint left;\n\tint top;\n\tint right;\n\tint bottom;\n};\n\n/* This structure is used in printing and requires some of the graphics types\n * from Platform.h.  Not needed by most client code. */\n\nstruct Sci_RangeToFormat {\n\tSci_SurfaceID hdc;\n\tSci_SurfaceID hdcTarget;\n\tstruct Sci_Rectangle rc;\n\tstruct Sci_Rectangle rcPage;\n\tstruct Sci_CharacterRange chrg;\n};\n\n#define RangeToFormat Sci_RangeToFormat\n\nstruct Sci_NotifyHeader {\n\t/* Compatible with Windows NMHDR.\n\t * hwndFrom is really an environment specific window handle or pointer\n\t * but most clients of Scintilla.h do not have this type visible. */\n\tvoid *hwndFrom;\n\tuptr_t idFrom;\n\tunsigned int code;\n};\n\n#define NotifyHeader Sci_NotifyHeader\n\nstruct SCNotification {\n\tstruct Sci_NotifyHeader nmhdr;\n\tint position;\n\t/* SCN_STYLENEEDED, SCN_DOUBLECLICK, SCN_MODIFIED, SCN_MARGINCLICK, */\n\t/* SCN_NEEDSHOWN, SCN_DWELLSTART, SCN_DWELLEND, SCN_CALLTIPCLICK, */\n\t/* SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK, SCN_HOTSPOTRELEASECLICK, */\n\t/* SCN_INDICATORCLICK, SCN_INDICATORRELEASE, */\n\t/* SCN_USERLISTSELECTION, SCN_AUTOCSELECTION */\n\n\tint ch;\t\t/* SCN_CHARADDED, SCN_KEY */\n\tint modifiers;\n\t/* SCN_KEY, SCN_DOUBLECLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK, */\n\t/* SCN_HOTSPOTRELEASECLICK, SCN_INDICATORCLICK, SCN_INDICATORRELEASE, */\n\n\tint modificationType;\t/* SCN_MODIFIED */\n\tconst char *text;\n\t/* SCN_MODIFIED, SCN_USERLISTSELECTION, SCN_AUTOCSELECTION, SCN_URIDROPPED */\n\n\tint length;\t\t/* SCN_MODIFIED */\n\tint linesAdded;\t/* SCN_MODIFIED */\n\tint message;\t/* SCN_MACRORECORD */\n\tuptr_t wParam;\t/* SCN_MACRORECORD */\n\tsptr_t lParam;\t/* SCN_MACRORECORD */\n\tint line;\t\t/* SCN_MODIFIED */\n\tint foldLevelNow;\t/* SCN_MODIFIED */\n\tint foldLevelPrev;\t/* SCN_MODIFIED */\n\tint margin;\t\t/* SCN_MARGINCLICK */\n\tint listType;\t/* SCN_USERLISTSELECTION */\n\tint x;\t\t\t/* SCN_DWELLSTART, SCN_DWELLEND */\n\tint y;\t\t/* SCN_DWELLSTART, SCN_DWELLEND */\n\tint token;\t\t/* SCN_MODIFIED with SC_MOD_CONTAINER */\n\tint annotationLinesAdded;\t/* SCN_MODIFIED with SC_MOD_CHANGEANNOTATION */\n\tint updated;\t/* SCN_UPDATEUI */\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#ifdef INCLUDE_DEPRECATED_FEATURES\n\n#define SC_CP_DBCS 1\n#define SCI_SETUSEPALETTE 2039\n#define SCI_GETUSEPALETTE 2139\n\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/include/Scintilla.iface",
    "content": "## First line may be used for shbang\n\n## This file defines the interface to Scintilla\n\n## Copyright 2000-2003 by Neil Hodgson <neilh@scintilla.org>\n## The License.txt file describes the conditions under which this software may be distributed.\n\n## A line starting with ## is a pure comment and should be stripped by readers.\n## A line starting with #! is for future shbang use\n## A line starting with # followed by a space is a documentation comment and refers\n## to the next feature definition.\n\n## Each feature is defined by a line starting with fun, get, set, val or evt.\n##     cat -> start a category\n##     fun -> a function\n##     get -> a property get function\n##     set -> a property set function\n##     val -> definition of a constant\n##     evt -> an event\n##     enu -> associate an enumeration with a set of vals with a prefix\n##     lex -> associate a lexer with the lexical classes it produces\n##\n## All other feature names should be ignored. They may be defined in the future.\n## A property may have a set function, a get function or both. Each will have\n## \"Get\" or \"Set\" in their names and the corresponding name will have the obvious switch.\n## A property may be subscripted, in which case the first parameter is the subscript.\n## fun, get, and set features have a strict syntax:\n## <featureType><ws><returnType><ws><name>[=<number](<param>,<param>)\n## where <ws> stands for white space.\n## param may be empty (null value) or is <paramType><ws><paramName>[=<value>]\n## Additional white space is allowed between elements.\n## The syntax for evt is <featureType><ws><returnType><ws><name>[=<number]([<param>[,<param>]*])\n## Feature names that contain an underscore are defined by Windows, so in these\n## cases, using the Windows definition is preferred where available.\n## The feature numbers are stable so features will not be renumbered.\n## Features may be removed but they will go through a period of deprecation\n## before removal which is signalled by moving them into the Deprecated category.\n##\n## enu has the syntax enu<ws><enumeration>=<prefix>[<ws><prefix>]* where all the val\n## features in this file starting with a given <prefix> are considered part of the\n## enumeration.\n##\n## lex has the syntax lex<ws><name>=<lexerVal><ws><prefix>[<ws><prefix>]*\n## where name is a reasonably capitalised (Python, XML) identifier or UI name,\n## lexerVal is the val used to specify the lexer, and the list of prefixes is similar\n## to enu. The name may not be the same as that used within the lexer so the lexerVal\n## should be used to tie these entities together.\n\n## Types:\n##     void\n##     int\n##     bool -> integer, 1=true, 0=false\n##     position -> integer position in a document\n##     colour -> colour integer containing red, green and blue bytes.\n##     string -> pointer to const character\n##     stringresult -> pointer to character, NULL-> return size of result\n##     cells -> pointer to array of cells, each cell containing a style byte and character byte\n##     textrange -> range of a min and a max position with an output string\n##     findtext -> searchrange, text -> foundposition\n##     keymod -> integer containing key in low half and modifiers in high half\n##     formatrange\n## Types no longer used:\n##     findtextex -> searchrange\n##     charrange -> range of a min and a max position\n##     charrangeresult -> like charrange, but output param\n##     countedstring\n##     point -> x,y\n##     pointresult  -> like point, but output param\n##     rectangle -> left,top,right,bottom\n## Client code should ignore definitions containing types it does not understand, except\n## for possibly #defining the constants\n\n## Line numbers and positions start at 0.\n## String arguments may contain NUL ('\\0') characters where the calls provide a length\n## argument and retrieve NUL characters. All retrieved strings except for those retrieved\n## by GetLine also have a NUL appended but client code should calculate the size that\n## will be returned rather than relying upon the NUL whenever possible. Allow for the\n## extra NUL character when allocating buffers. The size to allocate for a stringresult\n## can be determined by calling with a NULL (0) pointer.\n\ncat Basics\n\n################################################\n## For Scintilla.h\nval INVALID_POSITION=-1\n# Define start of Scintilla messages to be greater than all Windows edit (EM_*) messages\n# as many EM_ messages can be used although that use is deprecated.\nval SCI_START=2000\nval SCI_OPTIONAL_START=3000\nval SCI_LEXER_START=4000\n\n# Add text to the document at current position.\nfun void AddText=2001(int length, string text)\n\n# Add array of cells to document.\nfun void AddStyledText=2002(int length, cells c)\n\n# Insert string at a position.\nfun void InsertText=2003(position pos, string text)\n\n# Delete all text in the document.\nfun void ClearAll=2004(,)\n\n# Delete a range of text in the document.\nfun void DeleteRange=2645(position pos, int deleteLength)\n\n# Set all style bytes to 0, remove all folding information.\nfun void ClearDocumentStyle=2005(,)\n\n# Returns the number of bytes in the document.\nget int GetLength=2006(,)\n\n# Returns the character byte at the position.\nget int GetCharAt=2007(position pos,)\n\n# Returns the position of the caret.\nget position GetCurrentPos=2008(,)\n\n# Returns the position of the opposite end of the selection to the caret.\nget position GetAnchor=2009(,)\n\n# Returns the style byte at the position.\nget int GetStyleAt=2010(position pos,)\n\n# Redoes the next action on the undo history.\nfun void Redo=2011(,)\n\n# Choose between collecting actions into the undo\n# history and discarding them.\nset void SetUndoCollection=2012(bool collectUndo,)\n\n# Select all the text in the document.\nfun void SelectAll=2013(,)\n\n# Remember the current position in the undo history as the position\n# at which the document was saved.\nfun void SetSavePoint=2014(,)\n\n# Retrieve a buffer of cells.\n# Returns the number of bytes in the buffer not including terminating NULs.\nfun int GetStyledText=2015(, textrange tr)\n\n# Are there any redoable actions in the undo history?\nfun bool CanRedo=2016(,)\n\n# Retrieve the line number at which a particular marker is located.\nfun int MarkerLineFromHandle=2017(int handle,)\n\n# Delete a marker.\nfun void MarkerDeleteHandle=2018(int handle,)\n\n# Is undo history being collected?\nget bool GetUndoCollection=2019(,)\n\nenu WhiteSpace=SCWS_\nval SCWS_INVISIBLE=0\nval SCWS_VISIBLEALWAYS=1\nval SCWS_VISIBLEAFTERINDENT=2\n\n# Are white space characters currently visible?\n# Returns one of SCWS_* constants.\nget int GetViewWS=2020(,)\n\n# Make white space characters invisible, always visible or visible outside indentation.\nset void SetViewWS=2021(int viewWS,)\n\n# Find the position from a point within the window.\nfun position PositionFromPoint=2022(int x, int y)\n\n# Find the position from a point within the window but return\n# INVALID_POSITION if not close to text.\nfun position PositionFromPointClose=2023(int x, int y)\n\n# Set caret to start of a line and ensure it is visible.\nfun void GotoLine=2024(int line,)\n\n# Set caret to a position and ensure it is visible.\nfun void GotoPos=2025(position pos,)\n\n# Set the selection anchor to a position. The anchor is the opposite\n# end of the selection from the caret.\nset void SetAnchor=2026(position posAnchor,)\n\n# Retrieve the text of the line containing the caret.\n# Returns the index of the caret on the line.\nfun int GetCurLine=2027(int length, stringresult text)\n\n# Retrieve the position of the last correctly styled character.\nget position GetEndStyled=2028(,)\n\nenu EndOfLine=SC_EOL_\nval SC_EOL_CRLF=0\nval SC_EOL_CR=1\nval SC_EOL_LF=2\n\n# Convert all line endings in the document to one mode.\nfun void ConvertEOLs=2029(int eolMode,)\n\n# Retrieve the current end of line mode - one of CRLF, CR, or LF.\nget int GetEOLMode=2030(,)\n\n# Set the current end of line mode.\nset void SetEOLMode=2031(int eolMode,)\n\n# Set the current styling position to pos and the styling mask to mask.\n# The styling mask can be used to protect some bits in each styling byte from modification.\nfun void StartStyling=2032(position pos, int mask)\n\n# Change style from current styling position for length characters to a style\n# and move the current styling position to after this newly styled segment.\nfun void SetStyling=2033(int length, int style)\n\n# Is drawing done first into a buffer or direct to the screen?\nget bool GetBufferedDraw=2034(,)\n\n# If drawing is buffered then each line of text is drawn into a bitmap buffer\n# before drawing it to the screen to avoid flicker.\nset void SetBufferedDraw=2035(bool buffered,)\n\n# Change the visible size of a tab to be a multiple of the width of a space character.\nset void SetTabWidth=2036(int tabWidth,)\n\n# Retrieve the visible size of a tab.\nget int GetTabWidth=2121(,)\n\n# The SC_CP_UTF8 value can be used to enter Unicode mode.\n# This is the same value as CP_UTF8 in Windows\nval SC_CP_UTF8=65001\n\n# Set the code page used to interpret the bytes of the document as characters.\n# The SC_CP_UTF8 value can be used to enter Unicode mode.\nset void SetCodePage=2037(int codePage,)\n\nenu MarkerSymbol=SC_MARK_\nval MARKER_MAX=31\nval SC_MARK_CIRCLE=0\nval SC_MARK_ROUNDRECT=1\nval SC_MARK_ARROW=2\nval SC_MARK_SMALLRECT=3\nval SC_MARK_SHORTARROW=4\nval SC_MARK_EMPTY=5\nval SC_MARK_ARROWDOWN=6\nval SC_MARK_MINUS=7\nval SC_MARK_PLUS=8\n\n# Shapes used for outlining column.\nval SC_MARK_VLINE=9\nval SC_MARK_LCORNER=10\nval SC_MARK_TCORNER=11\nval SC_MARK_BOXPLUS=12\nval SC_MARK_BOXPLUSCONNECTED=13\nval SC_MARK_BOXMINUS=14\nval SC_MARK_BOXMINUSCONNECTED=15\nval SC_MARK_LCORNERCURVE=16\nval SC_MARK_TCORNERCURVE=17\nval SC_MARK_CIRCLEPLUS=18\nval SC_MARK_CIRCLEPLUSCONNECTED=19\nval SC_MARK_CIRCLEMINUS=20\nval SC_MARK_CIRCLEMINUSCONNECTED=21\n\n# Invisible mark that only sets the line background colour.\nval SC_MARK_BACKGROUND=22\nval SC_MARK_DOTDOTDOT=23\nval SC_MARK_ARROWS=24\nval SC_MARK_PIXMAP=25\nval SC_MARK_FULLRECT=26\nval SC_MARK_LEFTRECT=27\nval SC_MARK_AVAILABLE=28\nval SC_MARK_UNDERLINE=29\nval SC_MARK_RGBAIMAGE=30\n\nval SC_MARK_CHARACTER=10000\n\nenu MarkerOutline=SC_MARKNUM_\n# Markers used for outlining column.\nval SC_MARKNUM_FOLDEREND=25\nval SC_MARKNUM_FOLDEROPENMID=26\nval SC_MARKNUM_FOLDERMIDTAIL=27\nval SC_MARKNUM_FOLDERTAIL=28\nval SC_MARKNUM_FOLDERSUB=29\nval SC_MARKNUM_FOLDER=30\nval SC_MARKNUM_FOLDEROPEN=31\n\nval SC_MASK_FOLDERS=0xFE000000\n\n# Set the symbol used for a particular marker number.\nfun void MarkerDefine=2040(int markerNumber, int markerSymbol)\n\n# Set the foreground colour used for a particular marker number.\nset void MarkerSetFore=2041(int markerNumber, colour fore)\n\n# Set the background colour used for a particular marker number.\nset void MarkerSetBack=2042(int markerNumber, colour back)\n\n# Set the background colour used for a particular marker number when its folding block is selected.\nset void MarkerSetBackSelected=2292(int markerNumber, colour back)\n\n# Enable/disable highlight for current folding bloc (smallest one that contains the caret)\nfun void MarkerEnableHighlight=2293(bool enabled,)\n\n# Add a marker to a line, returning an ID which can be used to find or delete the marker.\nfun int MarkerAdd=2043(int line, int markerNumber)\n\n# Delete a marker from a line.\nfun void MarkerDelete=2044(int line, int markerNumber)\n\n# Delete all markers with a particular number from all lines.\nfun void MarkerDeleteAll=2045(int markerNumber,)\n\n# Get a bit mask of all the markers set on a line.\nfun int MarkerGet=2046(int line,)\n\n# Find the next line at or after lineStart that includes a marker in mask.\n# Return -1 when no more lines.\nfun int MarkerNext=2047(int lineStart, int markerMask)\n\n# Find the previous line before lineStart that includes a marker in mask.\nfun int MarkerPrevious=2048(int lineStart, int markerMask)\n\n# Define a marker from a pixmap.\nfun void MarkerDefinePixmap=2049(int markerNumber, string pixmap)\n\n# Add a set of markers to a line.\nfun void MarkerAddSet=2466(int line, int set)\n\n# Set the alpha used for a marker that is drawn in the text area, not the margin.\nset void MarkerSetAlpha=2476(int markerNumber, int alpha)\n\nval SC_MAX_MARGIN=4\n\nenu MarginType=SC_MARGIN_\nval SC_MARGIN_SYMBOL=0\nval SC_MARGIN_NUMBER=1\nval SC_MARGIN_BACK=2\nval SC_MARGIN_FORE=3\nval SC_MARGIN_TEXT=4\nval SC_MARGIN_RTEXT=5\n\n# Set a margin to be either numeric or symbolic.\nset void SetMarginTypeN=2240(int margin, int marginType)\n\n# Retrieve the type of a margin.\nget int GetMarginTypeN=2241(int margin,)\n\n# Set the width of a margin to a width expressed in pixels.\nset void SetMarginWidthN=2242(int margin, int pixelWidth)\n\n# Retrieve the width of a margin in pixels.\nget int GetMarginWidthN=2243(int margin,)\n\n# Set a mask that determines which markers are displayed in a margin.\nset void SetMarginMaskN=2244(int margin, int mask)\n\n# Retrieve the marker mask of a margin.\nget int GetMarginMaskN=2245(int margin,)\n\n# Make a margin sensitive or insensitive to mouse clicks.\nset void SetMarginSensitiveN=2246(int margin, bool sensitive)\n\n# Retrieve the mouse click sensitivity of a margin.\nget bool GetMarginSensitiveN=2247(int margin,)\n\n# Set the cursor shown when the mouse is inside a margin.\nset void SetMarginCursorN=2248(int margin, int cursor)\n\n# Retrieve the cursor shown in a margin.\nget int GetMarginCursorN=2249(int margin,)\n\n# Styles in range 32..38 are predefined for parts of the UI and are not used as normal styles.\n# Style 39 is for future use.\nenu StylesCommon=STYLE_\nval STYLE_DEFAULT=32\nval STYLE_LINENUMBER=33\nval STYLE_BRACELIGHT=34\nval STYLE_BRACEBAD=35\nval STYLE_CONTROLCHAR=36\nval STYLE_INDENTGUIDE=37\nval STYLE_CALLTIP=38\nval STYLE_LASTPREDEFINED=39\nval STYLE_MAX=255\n\n# Character set identifiers are used in StyleSetCharacterSet.\n# The values are the same as the Windows *_CHARSET values.\nenu CharacterSet=SC_CHARSET_\nval SC_CHARSET_ANSI=0\nval SC_CHARSET_DEFAULT=1\nval SC_CHARSET_BALTIC=186\nval SC_CHARSET_CHINESEBIG5=136\nval SC_CHARSET_EASTEUROPE=238\nval SC_CHARSET_GB2312=134\nval SC_CHARSET_GREEK=161\nval SC_CHARSET_HANGUL=129\nval SC_CHARSET_MAC=77\nval SC_CHARSET_OEM=255\nval SC_CHARSET_RUSSIAN=204\nval SC_CHARSET_CYRILLIC=1251\nval SC_CHARSET_SHIFTJIS=128\nval SC_CHARSET_SYMBOL=2\nval SC_CHARSET_TURKISH=162\nval SC_CHARSET_JOHAB=130\nval SC_CHARSET_HEBREW=177\nval SC_CHARSET_ARABIC=178\nval SC_CHARSET_VIETNAMESE=163\nval SC_CHARSET_THAI=222\nval SC_CHARSET_8859_15=1000\n\n# Clear all the styles and make equivalent to the global default style.\nfun void StyleClearAll=2050(,)\n\n# Set the foreground colour of a style.\nset void StyleSetFore=2051(int style, colour fore)\n\n# Set the background colour of a style.\nset void StyleSetBack=2052(int style, colour back)\n\n# Set a style to be bold or not.\nset void StyleSetBold=2053(int style, bool bold)\n\n# Set a style to be italic or not.\nset void StyleSetItalic=2054(int style, bool italic)\n\n# Set the size of characters of a style.\nset void StyleSetSize=2055(int style, int sizePoints)\n\n# Set the font of a style.\nset void StyleSetFont=2056(int style, string fontName)\n\n# Set a style to have its end of line filled or not.\nset void StyleSetEOLFilled=2057(int style, bool filled)\n\n# Reset the default style to its state at startup\nfun void StyleResetDefault=2058(,)\n\n# Set a style to be underlined or not.\nset void StyleSetUnderline=2059(int style, bool underline)\n\nenu CaseVisible=SC_CASE_\nval SC_CASE_MIXED=0\nval SC_CASE_UPPER=1\nval SC_CASE_LOWER=2\n\n# Get the foreground colour of a style.\nget colour StyleGetFore=2481(int style,)\n\n# Get the background colour of a style.\nget colour StyleGetBack=2482(int style,)\n\n# Get is a style bold or not.\nget bool StyleGetBold=2483(int style,)\n\n# Get is a style italic or not.\nget bool StyleGetItalic=2484(int style,)\n\n# Get the size of characters of a style.\nget int StyleGetSize=2485(int style,)\n\n# Get the font of a style.\n# Returns the length of the fontName\nget int StyleGetFont=2486(int style, stringresult fontName)\n\n# Get is a style to have its end of line filled or not.\nget bool StyleGetEOLFilled=2487(int style,)\n\n# Get is a style underlined or not.\nget bool StyleGetUnderline=2488(int style,)\n\n# Get is a style mixed case, or to force upper or lower case.\nget int StyleGetCase=2489(int style,)\n\n# Get the character get of the font in a style.\nget int StyleGetCharacterSet=2490(int style,)\n\n# Get is a style visible or not.\nget bool StyleGetVisible=2491(int style,)\n\n# Get is a style changeable or not (read only).\n# Experimental feature, currently buggy.\nget bool StyleGetChangeable=2492(int style,)\n\n# Get is a style a hotspot or not.\nget bool StyleGetHotSpot=2493(int style,)\n\n# Set a style to be mixed case, or to force upper or lower case.\nset void StyleSetCase=2060(int style, int caseForce)\n\nval SC_FONT_SIZE_MULTIPLIER=100\n\n# Set the size of characters of a style. Size is in points multiplied by 100.\nset void StyleSetSizeFractional=2061(int style, int caseForce)\n\n# Get the size of characters of a style in points multiplied by 100\nget int StyleGetSizeFractional=2062(int style,)\n\nenu FontWeight=SC_WEIGHT_\nval SC_WEIGHT_NORMAL=400\nval SC_WEIGHT_SEMIBOLD=600\nval SC_WEIGHT_BOLD=700\n\n# Set the weight of characters of a style.\nset void StyleSetWeight=2063(int style, int weight)\n\n# Get the weight of characters of a style.\nget int StyleGetWeight=2064(int style,)\n\n# Set the character set of the font in a style.\nset void StyleSetCharacterSet=2066(int style, int characterSet)\n\n# Set a style to be a hotspot or not.\nset void StyleSetHotSpot=2409(int style, bool hotspot)\n\n# Set the foreground colour of the main and additional selections and whether to use this setting.\nfun void SetSelFore=2067(bool useSetting, colour fore)\n\n# Set the background colour of the main and additional selections and whether to use this setting.\nfun void SetSelBack=2068(bool useSetting, colour back)\n\n# Get the alpha of the selection.\nget int GetSelAlpha=2477(,)\n\n# Set the alpha of the selection.\nset void SetSelAlpha=2478(int alpha,)\n\n# Is the selection end of line filled?\nget bool GetSelEOLFilled=2479(,)\n\n# Set the selection to have its end of line filled or not.\nset void SetSelEOLFilled=2480(bool filled,)\n\n# Set the foreground colour of the caret.\nset void SetCaretFore=2069(colour fore,)\n\n# When key+modifier combination km is pressed perform msg.\nfun void AssignCmdKey=2070(keymod km, int msg)\n\n# When key+modifier combination km is pressed do nothing.\nfun void ClearCmdKey=2071(keymod km,)\n\n# Drop all key mappings.\nfun void ClearAllCmdKeys=2072(,)\n\n# Set the styles for a segment of the document.\nfun void SetStylingEx=2073(int length, string styles)\n\n# Set a style to be visible or not.\nset void StyleSetVisible=2074(int style, bool visible)\n\n# Get the time in milliseconds that the caret is on and off.\nget int GetCaretPeriod=2075(,)\n\n# Get the time in milliseconds that the caret is on and off. 0 = steady on.\nset void SetCaretPeriod=2076(int periodMilliseconds,)\n\n# Set the set of characters making up words for when moving or selecting by word.\n# First sets defaults like SetCharsDefault.\nset void SetWordChars=2077(, string characters)\n\n# Get the set of characters making up words for when moving or selecting by word.\n# Retuns the number of characters\nget int GetWordChars=2646(, stringresult characters)\n\n# Start a sequence of actions that is undone and redone as a unit.\n# May be nested.\nfun void BeginUndoAction=2078(,)\n\n# End a sequence of actions that is undone and redone as a unit.\nfun void EndUndoAction=2079(,)\n\n# Indicator style enumeration and some constants\nenu IndicatorStyle=INDIC_\nval INDIC_PLAIN=0\nval INDIC_SQUIGGLE=1\nval INDIC_TT=2\nval INDIC_DIAGONAL=3\nval INDIC_STRIKE=4\nval INDIC_HIDDEN=5\nval INDIC_BOX=6\nval INDIC_ROUNDBOX=7\nval INDIC_STRAIGHTBOX=8\nval INDIC_DASH=9\nval INDIC_DOTS=10\nval INDIC_SQUIGGLELOW=11\nval INDIC_DOTBOX=12\nval INDIC_SQUIGGLEPIXMAP=13\nval INDIC_COMPOSITIONTHICK=14\nval INDIC_MAX=31\nval INDIC_CONTAINER=8\nval INDIC0_MASK=0x20\nval INDIC1_MASK=0x40\nval INDIC2_MASK=0x80\nval INDICS_MASK=0xE0\n\n# Set an indicator to plain, squiggle or TT.\nset void IndicSetStyle=2080(int indic, int style)\n\n# Retrieve the style of an indicator.\nget int IndicGetStyle=2081(int indic,)\n\n# Set the foreground colour of an indicator.\nset void IndicSetFore=2082(int indic, colour fore)\n\n# Retrieve the foreground colour of an indicator.\nget colour IndicGetFore=2083(int indic,)\n\n# Set an indicator to draw under text or over(default).\nset void IndicSetUnder=2510(int indic, bool under)\n\n# Retrieve whether indicator drawn under or over text.\nget bool IndicGetUnder=2511(int indic,)\n\n# Set the foreground colour of all whitespace and whether to use this setting.\nfun void SetWhitespaceFore=2084(bool useSetting, colour fore)\n\n# Set the background colour of all whitespace and whether to use this setting.\nfun void SetWhitespaceBack=2085(bool useSetting, colour back)\n\n# Set the size of the dots used to mark space characters.\nset void SetWhitespaceSize=2086(int size,)\n\n# Get the size of the dots used to mark space characters.\nget int GetWhitespaceSize=2087(,)\n\n# Divide each styling byte into lexical class bits (default: 5) and indicator\n# bits (default: 3). If a lexer requires more than 32 lexical states, then this\n# is used to expand the possible states.\nset void SetStyleBits=2090(int bits,)\n\n# Retrieve number of bits in style bytes used to hold the lexical state.\nget int GetStyleBits=2091(,)\n\n# Used to hold extra styling information for each line.\nset void SetLineState=2092(int line, int state)\n\n# Retrieve the extra styling information for a line.\nget int GetLineState=2093(int line,)\n\n# Retrieve the last line number that has line state.\nget int GetMaxLineState=2094(,)\n\n# Is the background of the line containing the caret in a different colour?\nget bool GetCaretLineVisible=2095(,)\n\n# Display the background of the line containing the caret in a different colour.\nset void SetCaretLineVisible=2096(bool show,)\n\n# Get the colour of the background of the line containing the caret.\nget colour GetCaretLineBack=2097(,)\n\n# Set the colour of the background of the line containing the caret.\nset void SetCaretLineBack=2098(colour back,)\n\n# Set a style to be changeable or not (read only).\n# Experimental feature, currently buggy.\nset void StyleSetChangeable=2099(int style, bool changeable)\n\n# Display a auto-completion list.\n# The lenEntered parameter indicates how many characters before\n# the caret should be used to provide context.\nfun void AutoCShow=2100(int lenEntered, string itemList)\n\n# Remove the auto-completion list from the screen.\nfun void AutoCCancel=2101(,)\n\n# Is there an auto-completion list visible?\nfun bool AutoCActive=2102(,)\n\n# Retrieve the position of the caret when the auto-completion list was displayed.\nfun position AutoCPosStart=2103(,)\n\n# User has selected an item so remove the list and insert the selection.\nfun void AutoCComplete=2104(,)\n\n# Define a set of character that when typed cancel the auto-completion list.\nfun void AutoCStops=2105(, string characterSet)\n\n# Change the separator character in the string setting up an auto-completion list.\n# Default is space but can be changed if items contain space.\nset void AutoCSetSeparator=2106(int separatorCharacter,)\n\n# Retrieve the auto-completion list separator character.\nget int AutoCGetSeparator=2107(,)\n\n# Select the item in the auto-completion list that starts with a string.\nfun void AutoCSelect=2108(, string text)\n\n# Should the auto-completion list be cancelled if the user backspaces to a\n# position before where the box was created.\nset void AutoCSetCancelAtStart=2110(bool cancel,)\n\n# Retrieve whether auto-completion cancelled by backspacing before start.\nget bool AutoCGetCancelAtStart=2111(,)\n\n# Define a set of characters that when typed will cause the autocompletion to\n# choose the selected item.\nset void AutoCSetFillUps=2112(, string characterSet)\n\n# Should a single item auto-completion list automatically choose the item.\nset void AutoCSetChooseSingle=2113(bool chooseSingle,)\n\n# Retrieve whether a single item auto-completion list automatically choose the item.\nget bool AutoCGetChooseSingle=2114(,)\n\n# Set whether case is significant when performing auto-completion searches.\nset void AutoCSetIgnoreCase=2115(bool ignoreCase,)\n\n# Retrieve state of ignore case flag.\nget bool AutoCGetIgnoreCase=2116(,)\n\n# Display a list of strings and send notification when user chooses one.\nfun void UserListShow=2117(int listType, string itemList)\n\n# Set whether or not autocompletion is hidden automatically when nothing matches.\nset void AutoCSetAutoHide=2118(bool autoHide,)\n\n# Retrieve whether or not autocompletion is hidden automatically when nothing matches.\nget bool AutoCGetAutoHide=2119(,)\n\n# Set whether or not autocompletion deletes any word characters\n# after the inserted text upon completion.\nset void AutoCSetDropRestOfWord=2270(bool dropRestOfWord,)\n\n# Retrieve whether or not autocompletion deletes any word characters\n# after the inserted text upon completion.\nget bool AutoCGetDropRestOfWord=2271(,)\n\n# Register an XPM image for use in autocompletion lists.\nfun void RegisterImage=2405(int type, string xpmData)\n\n# Clear all the registered XPM images.\nfun void ClearRegisteredImages=2408(,)\n\n# Retrieve the auto-completion list type-separator character.\nget int AutoCGetTypeSeparator=2285(,)\n\n# Change the type-separator character in the string setting up an auto-completion list.\n# Default is '?' but can be changed if items contain '?'.\nset void AutoCSetTypeSeparator=2286(int separatorCharacter,)\n\n# Set the maximum width, in characters, of auto-completion and user lists.\n# Set to 0 to autosize to fit longest item, which is the default.\nset void AutoCSetMaxWidth=2208(int characterCount,)\n\n# Get the maximum width, in characters, of auto-completion and user lists.\nget int AutoCGetMaxWidth=2209(,)\n\n# Set the maximum height, in rows, of auto-completion and user lists.\n# The default is 5 rows.\nset void AutoCSetMaxHeight=2210(int rowCount,)\n\n# Set the maximum height, in rows, of auto-completion and user lists.\nget int AutoCGetMaxHeight=2211(,)\n\n# Set the number of spaces used for one level of indentation.\nset void SetIndent=2122(int indentSize,)\n\n# Retrieve indentation size.\nget int GetIndent=2123(,)\n\n# Indentation will only use space characters if useTabs is false, otherwise\n# it will use a combination of tabs and spaces.\nset void SetUseTabs=2124(bool useTabs,)\n\n# Retrieve whether tabs will be used in indentation.\nget bool GetUseTabs=2125(,)\n\n# Change the indentation of a line to a number of columns.\nset void SetLineIndentation=2126(int line, int indentSize)\n\n# Retrieve the number of columns that a line is indented.\nget int GetLineIndentation=2127(int line,)\n\n# Retrieve the position before the first non indentation character on a line.\nget position GetLineIndentPosition=2128(int line,)\n\n# Retrieve the column number of a position, taking tab width into account.\nget int GetColumn=2129(position pos,)\n\n# Count characters between two positions.\nfun int CountCharacters=2633(int startPos, int endPos)\n\n# Show or hide the horizontal scroll bar.\nset void SetHScrollBar=2130(bool show,)\n# Is the horizontal scroll bar visible?\nget bool GetHScrollBar=2131(,)\n\nenu IndentView=SC_IV_\nval SC_IV_NONE=0\nval SC_IV_REAL=1\nval SC_IV_LOOKFORWARD=2\nval SC_IV_LOOKBOTH=3\n\n# Show or hide indentation guides.\nset void SetIndentationGuides=2132(int indentView,)\n\n# Are the indentation guides visible?\nget int GetIndentationGuides=2133(,)\n\n# Set the highlighted indentation guide column.\n# 0 = no highlighted guide.\nset void SetHighlightGuide=2134(int column,)\n\n# Get the highlighted indentation guide column.\nget int GetHighlightGuide=2135(,)\n\n# Get the position after the last visible characters on a line.\nget position GetLineEndPosition=2136(int line,)\n\n# Get the code page used to interpret the bytes of the document as characters.\nget int GetCodePage=2137(,)\n\n# Get the foreground colour of the caret.\nget colour GetCaretFore=2138(,)\n\n# In read-only mode?\nget bool GetReadOnly=2140(,)\n\n# Sets the position of the caret.\nset void SetCurrentPos=2141(position pos,)\n\n# Sets the position that starts the selection - this becomes the anchor.\nset void SetSelectionStart=2142(position pos,)\n\n# Returns the position at the start of the selection.\nget position GetSelectionStart=2143(,)\n\n# Sets the position that ends the selection - this becomes the currentPosition.\nset void SetSelectionEnd=2144(position pos,)\n\n# Returns the position at the end of the selection.\nget position GetSelectionEnd=2145(,)\n\n# Set caret to a position, while removing any existing selection.\nfun void SetEmptySelection=2556(position pos,)\n\n# Sets the print magnification added to the point size of each style for printing.\nset void SetPrintMagnification=2146(int magnification,)\n\n# Returns the print magnification.\nget int GetPrintMagnification=2147(,)\n\nenu PrintOption=SC_PRINT_\n# PrintColourMode - use same colours as screen.\nval SC_PRINT_NORMAL=0\n# PrintColourMode - invert the light value of each style for printing.\nval SC_PRINT_INVERTLIGHT=1\n# PrintColourMode - force black text on white background for printing.\nval SC_PRINT_BLACKONWHITE=2\n# PrintColourMode - text stays coloured, but all background is forced to be white for printing.\nval SC_PRINT_COLOURONWHITE=3\n# PrintColourMode - only the default-background is forced to be white for printing.\nval SC_PRINT_COLOURONWHITEDEFAULTBG=4\n\n# Modify colours when printing for clearer printed text.\nset void SetPrintColourMode=2148(int mode,)\n\n# Returns the print colour mode.\nget int GetPrintColourMode=2149(,)\n\nenu FindOption=SCFIND_\nval SCFIND_WHOLEWORD=2\nval SCFIND_MATCHCASE=4\nval SCFIND_WORDSTART=0x00100000\nval SCFIND_REGEXP=0x00200000\nval SCFIND_POSIX=0x00400000\n\n# Find some text in the document.\nfun position FindText=2150(int flags, findtext ft)\n\n# On Windows, will draw the document into a display context such as a printer.\nfun position FormatRange=2151(bool draw, formatrange fr)\n\n# Retrieve the display line at the top of the display.\nget int GetFirstVisibleLine=2152(,)\n\n# Retrieve the contents of a line.\n# Returns the length of the line.\nfun int GetLine=2153(int line, stringresult text)\n\n# Returns the number of lines in the document. There is always at least one.\nget int GetLineCount=2154(,)\n\n# Sets the size in pixels of the left margin.\nset void SetMarginLeft=2155(, int pixelWidth)\n\n# Returns the size in pixels of the left margin.\nget int GetMarginLeft=2156(,)\n\n# Sets the size in pixels of the right margin.\nset void SetMarginRight=2157(, int pixelWidth)\n\n# Returns the size in pixels of the right margin.\nget int GetMarginRight=2158(,)\n\n# Is the document different from when it was last saved?\nget bool GetModify=2159(,)\n\n# Select a range of text.\nfun void SetSel=2160(position start, position end)\n\n# Retrieve the selected text.\n# Return the length of the text.\nfun int GetSelText=2161(, stringresult text)\n\n# Retrieve a range of text.\n# Return the length of the text.\nfun int GetTextRange=2162(, textrange tr)\n\n# Draw the selection in normal style or with selection highlighted.\nfun void HideSelection=2163(bool normal,)\n\n# Retrieve the x value of the point in the window where a position is displayed.\nfun int PointXFromPosition=2164(, position pos)\n\n# Retrieve the y value of the point in the window where a position is displayed.\nfun int PointYFromPosition=2165(, position pos)\n\n# Retrieve the line containing a position.\nfun int LineFromPosition=2166(position pos,)\n\n# Retrieve the position at the start of a line.\nfun position PositionFromLine=2167(int line,)\n\n# Scroll horizontally and vertically.\nfun void LineScroll=2168(int columns, int lines)\n\n# Ensure the caret is visible.\nfun void ScrollCaret=2169(,)\n\n# Scroll the argument positions and the range between them into view giving\n# priority to the primary position then the secondary position.\n# This may be used to make a search match visible.\nfun void ScrollRange=2569(position secondary, position primary)\n\n# Replace the selected text with the argument text.\nfun void ReplaceSel=2170(, string text)\n\n# Set to read only or read write.\nset void SetReadOnly=2171(bool readOnly,)\n\n# Null operation.\nfun void Null=2172(,)\n\n# Will a paste succeed?\nfun bool CanPaste=2173(,)\n\n# Are there any undoable actions in the undo history?\nfun bool CanUndo=2174(,)\n\n# Delete the undo history.\nfun void EmptyUndoBuffer=2175(,)\n\n# Undo one action in the undo history.\nfun void Undo=2176(,)\n\n# Cut the selection to the clipboard.\nfun void Cut=2177(,)\n\n# Copy the selection to the clipboard.\nfun void Copy=2178(,)\n\n# Paste the contents of the clipboard into the document replacing the selection.\nfun void Paste=2179(,)\n\n# Clear the selection.\nfun void Clear=2180(,)\n\n# Replace the contents of the document with the argument text.\nfun void SetText=2181(, string text)\n\n# Retrieve all the text in the document.\n# Returns number of characters retrieved.\nfun int GetText=2182(int length, stringresult text)\n\n# Retrieve the number of characters in the document.\nget int GetTextLength=2183(,)\n\n# Retrieve a pointer to a function that processes messages for this Scintilla.\nget int GetDirectFunction=2184(,)\n\n# Retrieve a pointer value to use as the first argument when calling\n# the function returned by GetDirectFunction.\nget int GetDirectPointer=2185(,)\n\n# Set to overtype (true) or insert mode.\nset void SetOvertype=2186(bool overtype,)\n\n# Returns true if overtype mode is active otherwise false is returned.\nget bool GetOvertype=2187(,)\n\n# Set the width of the insert mode caret.\nset void SetCaretWidth=2188(int pixelWidth,)\n\n# Returns the width of the insert mode caret.\nget int GetCaretWidth=2189(,)\n\n# Sets the position that starts the target which is used for updating the\n# document without affecting the scroll position.\nset void SetTargetStart=2190(position pos,)\n\n# Get the position that starts the target.\nget position GetTargetStart=2191(,)\n\n# Sets the position that ends the target which is used for updating the\n# document without affecting the scroll position.\nset void SetTargetEnd=2192(position pos,)\n\n# Get the position that ends the target.\nget position GetTargetEnd=2193(,)\n\n# Replace the target text with the argument text.\n# Text is counted so it can contain NULs.\n# Returns the length of the replacement text.\nfun int ReplaceTarget=2194(int length, string text)\n\n# Replace the target text with the argument text after \\d processing.\n# Text is counted so it can contain NULs.\n# Looks for \\d where d is between 1 and 9 and replaces these with the strings\n# matched in the last search operation which were surrounded by \\( and \\).\n# Returns the length of the replacement text including any change\n# caused by processing the \\d patterns.\nfun int ReplaceTargetRE=2195(int length, string text)\n\n# Search for a counted string in the target and set the target to the found\n# range. Text is counted so it can contain NULs.\n# Returns length of range or -1 for failure in which case target is not moved.\nfun int SearchInTarget=2197(int length, string text)\n\n# Set the search flags used by SearchInTarget.\nset void SetSearchFlags=2198(int flags,)\n\n# Get the search flags used by SearchInTarget.\nget int GetSearchFlags=2199(,)\n\n# Show a call tip containing a definition near position pos.\nfun void CallTipShow=2200(position pos, string definition)\n\n# Remove the call tip from the screen.\nfun void CallTipCancel=2201(,)\n\n# Is there an active call tip?\nfun bool CallTipActive=2202(,)\n\n# Retrieve the position where the caret was before displaying the call tip.\nfun position CallTipPosStart=2203(,)\n\n# Highlight a segment of the definition.\nfun void CallTipSetHlt=2204(int start, int end)\n\n# Set the background colour for the call tip.\nset void CallTipSetBack=2205(colour back,)\n\n# Set the foreground colour for the call tip.\nset void CallTipSetFore=2206(colour fore,)\n\n# Set the foreground colour for the highlighted part of the call tip.\nset void CallTipSetForeHlt=2207(colour fore,)\n\n# Enable use of STYLE_CALLTIP and set call tip tab size in pixels.\nset void CallTipUseStyle=2212(int tabSize,)\n\n# Set position of calltip, above or below text.\nset void CallTipSetPosition=2213(bool above,)\n\n# Find the display line of a document line taking hidden lines into account.\nfun int VisibleFromDocLine=2220(int line,)\n\n# Find the document line of a display line taking hidden lines into account.\nfun int DocLineFromVisible=2221(int lineDisplay,)\n\n# The number of display lines needed to wrap a document line\nfun int WrapCount=2235(int line,)\n\nenu FoldLevel=SC_FOLDLEVEL\nval SC_FOLDLEVELBASE=0x400\nval SC_FOLDLEVELWHITEFLAG=0x1000\nval SC_FOLDLEVELHEADERFLAG=0x2000\nval SC_FOLDLEVELNUMBERMASK=0x0FFF\n\n# Set the fold level of a line.\n# This encodes an integer level along with flags indicating whether the\n# line is a header and whether it is effectively white space.\nset void SetFoldLevel=2222(int line, int level)\n\n# Retrieve the fold level of a line.\nget int GetFoldLevel=2223(int line,)\n\n# Find the last child line of a header line.\nget int GetLastChild=2224(int line, int level)\n\n# Find the parent line of a child line.\nget int GetFoldParent=2225(int line,)\n\n# Make a range of lines visible.\nfun void ShowLines=2226(int lineStart, int lineEnd)\n\n# Make a range of lines invisible.\nfun void HideLines=2227(int lineStart, int lineEnd)\n\n# Is a line visible?\nget bool GetLineVisible=2228(int line,)\n\n# Are all lines visible?\nget bool GetAllLinesVisible=2236(,)\n\n# Show the children of a header line.\nset void SetFoldExpanded=2229(int line, bool expanded)\n\n# Is a header line expanded?\nget bool GetFoldExpanded=2230(int line,)\n\n# Switch a header line between expanded and contracted.\nfun void ToggleFold=2231(int line,)\n\nenu FoldAction=SC_FOLDACTION\nval SC_FOLDACTION_CONTRACT=0\nval SC_FOLDACTION_EXPAND=1\nval SC_FOLDACTION_TOGGLE=2\n\n# Expand or contract a fold header.\nfun void FoldLine=2237(int line, int action)\n\n# Expand or contract a fold header and its children.\nfun void FoldChildren=2238(int line, int action)\n\n# Expand a fold header and all children. Use the level argument instead of the line's current level.\nfun void ExpandChildren=2239(int line, int level)\n\n# Expand or contract all fold headers.\nfun void FoldAll=2662(int action,)\n\n# Ensure a particular line is visible by expanding any header line hiding it.\nfun void EnsureVisible=2232(int line,)\n\nenu AutomaticFold=SC_AUTOMATICFOLD_\nval SC_AUTOMATICFOLD_SHOW=0x0001\nval SC_AUTOMATICFOLD_CLICK=0x0002\nval SC_AUTOMATICFOLD_CHANGE=0x0004\n\n# Set automatic folding behaviours.\nset void SetAutomaticFold=2663(int automaticFold,)\n\n# Get automatic folding behaviours.\nget int GetAutomaticFold=2664(,)\n\nenu FoldFlag=SC_FOLDFLAG_\nval SC_FOLDFLAG_LINEBEFORE_EXPANDED=0x0002\nval SC_FOLDFLAG_LINEBEFORE_CONTRACTED=0x0004\nval SC_FOLDFLAG_LINEAFTER_EXPANDED=0x0008\nval SC_FOLDFLAG_LINEAFTER_CONTRACTED=0x0010\nval SC_FOLDFLAG_LEVELNUMBERS=0x0040\n\n# Set some style options for folding.\nset void SetFoldFlags=2233(int flags,)\n\n# Ensure a particular line is visible by expanding any header line hiding it.\n# Use the currently set visibility policy to determine which range to display.\nfun void EnsureVisibleEnforcePolicy=2234(int line,)\n\n# Sets whether a tab pressed when caret is within indentation indents.\nset void SetTabIndents=2260(bool tabIndents,)\n\n# Does a tab pressed when caret is within indentation indent?\nget bool GetTabIndents=2261(,)\n\n# Sets whether a backspace pressed when caret is within indentation unindents.\nset void SetBackSpaceUnIndents=2262(bool bsUnIndents,)\n\n# Does a backspace pressed when caret is within indentation unindent?\nget bool GetBackSpaceUnIndents=2263(,)\n\nval SC_TIME_FOREVER=10000000\n\n# Sets the time the mouse must sit still to generate a mouse dwell event.\nset void SetMouseDwellTime=2264(int periodMilliseconds,)\n\n# Retrieve the time the mouse must sit still to generate a mouse dwell event.\nget int GetMouseDwellTime=2265(,)\n\n# Get position of start of word.\nfun int WordStartPosition=2266(position pos, bool onlyWordCharacters)\n\n# Get position of end of word.\nfun int WordEndPosition=2267(position pos, bool onlyWordCharacters)\n\nenu Wrap=SC_WRAP_\nval SC_WRAP_NONE=0\nval SC_WRAP_WORD=1\nval SC_WRAP_CHAR=2\n\n# Sets whether text is word wrapped.\nset void SetWrapMode=2268(int mode,)\n\n# Retrieve whether text is word wrapped.\nget int GetWrapMode=2269(,)\n\nenu WrapVisualFlag=SC_WRAPVISUALFLAG_\nval SC_WRAPVISUALFLAG_NONE=0x0000\nval SC_WRAPVISUALFLAG_END=0x0001\nval SC_WRAPVISUALFLAG_START=0x0002\nval SC_WRAPVISUALFLAG_MARGIN=0x0004\n\n# Set the display mode of visual flags for wrapped lines.\nset void SetWrapVisualFlags=2460(int wrapVisualFlags,)\n\n# Retrive the display mode of visual flags for wrapped lines.\nget int GetWrapVisualFlags=2461(,)\n\nenu WrapVisualLocation=SC_WRAPVISUALFLAGLOC_\nval SC_WRAPVISUALFLAGLOC_DEFAULT=0x0000\nval SC_WRAPVISUALFLAGLOC_END_BY_TEXT=0x0001\nval SC_WRAPVISUALFLAGLOC_START_BY_TEXT=0x0002\n\n# Set the location of visual flags for wrapped lines.\nset void SetWrapVisualFlagsLocation=2462(int wrapVisualFlagsLocation,)\n\n# Retrive the location of visual flags for wrapped lines.\nget int GetWrapVisualFlagsLocation=2463(,)\n\n# Set the start indent for wrapped lines.\nset void SetWrapStartIndent=2464(int indent,)\n\n# Retrive the start indent for wrapped lines.\nget int GetWrapStartIndent=2465(,)\n\nenu WrapIndentMode=SC_WRAPINDENT_\nval SC_WRAPINDENT_FIXED=0\nval SC_WRAPINDENT_SAME=1\nval SC_WRAPINDENT_INDENT=2\n\n# Sets how wrapped sublines are placed. Default is fixed.\nset void SetWrapIndentMode=2472(int mode,)\n\n# Retrieve how wrapped sublines are placed. Default is fixed.\nget int GetWrapIndentMode=2473(,)\n\nenu LineCache=SC_CACHE_\nval SC_CACHE_NONE=0\nval SC_CACHE_CARET=1\nval SC_CACHE_PAGE=2\nval SC_CACHE_DOCUMENT=3\n\n# Sets the degree of caching of layout information.\nset void SetLayoutCache=2272(int mode,)\n\n# Retrieve the degree of caching of layout information.\nget int GetLayoutCache=2273(,)\n\n# Sets the document width assumed for scrolling.\nset void SetScrollWidth=2274(int pixelWidth,)\n\n# Retrieve the document width assumed for scrolling.\nget int GetScrollWidth=2275(,)\n\n# Sets whether the maximum width line displayed is used to set scroll width.\nset void SetScrollWidthTracking=2516(bool tracking,)\n\n# Retrieve whether the scroll width tracks wide lines.\nget bool GetScrollWidthTracking=2517(,)\n\n# Measure the pixel width of some text in a particular style.\n# NUL terminated text argument.\n# Does not handle tab or control characters.\nfun int TextWidth=2276(int style, string text)\n\n# Sets the scroll range so that maximum scroll position has\n# the last line at the bottom of the view (default).\n# Setting this to false allows scrolling one page below the last line.\nset void SetEndAtLastLine=2277(bool endAtLastLine,)\n\n# Retrieve whether the maximum scroll position has the last\n# line at the bottom of the view.\nget bool GetEndAtLastLine=2278(,)\n\n# Retrieve the height of a particular line of text in pixels.\nfun int TextHeight=2279(int line,)\n\n# Show or hide the vertical scroll bar.\nset void SetVScrollBar=2280(bool show,)\n\n# Is the vertical scroll bar visible?\nget bool GetVScrollBar=2281(,)\n\n# Append a string to the end of the document without changing the selection.\nfun void AppendText=2282(int length, string text)\n\n# Is drawing done in two phases with backgrounds drawn before faoregrounds?\nget bool GetTwoPhaseDraw=2283(,)\n\n# In twoPhaseDraw mode, drawing is performed in two phases, first the background\n# and then the foreground. This avoids chopping off characters that overlap the next run.\nset void SetTwoPhaseDraw=2284(bool twoPhase,)\n\n# Control font anti-aliasing.\n\nenu FontQuality=SC_EFF_\nval SC_EFF_QUALITY_MASK=0xF\nval SC_EFF_QUALITY_DEFAULT=0\nval SC_EFF_QUALITY_NON_ANTIALIASED=1\nval SC_EFF_QUALITY_ANTIALIASED=2\nval SC_EFF_QUALITY_LCD_OPTIMIZED=3\n\n# Choose the quality level for text from the FontQuality enumeration.\nset void SetFontQuality=2611(int fontQuality,)\n\n# Retrieve the quality level for text.\nget int GetFontQuality=2612(,)\n\n# Scroll so that a display line is at the top of the display.\nset void SetFirstVisibleLine=2613(int lineDisplay,)\n\nenu MultiPaste=SC_MULTIPASTE_\nval SC_MULTIPASTE_ONCE=0\nval SC_MULTIPASTE_EACH=1\n\n# Change the effect of pasting when there are multiple selections.\nset void SetMultiPaste=2614(int multiPaste,)\n\n# Retrieve the effect of pasting when there are multiple selections..\nget int GetMultiPaste=2615(,)\n\n# Retrieve the value of a tag from a regular expression search.\nget int GetTag=2616(int tagNumber, stringresult tagValue)\n\n# Make the target range start and end be the same as the selection range start and end.\nfun void TargetFromSelection=2287(,)\n\n# Join the lines in the target.\nfun void LinesJoin=2288(,)\n\n# Split the lines in the target into lines that are less wide than pixelWidth\n# where possible.\nfun void LinesSplit=2289(int pixelWidth,)\n\n# Set the colours used as a chequerboard pattern in the fold margin\nfun void SetFoldMarginColour=2290(bool useSetting, colour back)\nfun void SetFoldMarginHiColour=2291(bool useSetting, colour fore)\n\n## New messages go here\n\n## Start of key messages\n# Move caret down one line.\nfun void LineDown=2300(,)\n\n# Move caret down one line extending selection to new caret position.\nfun void LineDownExtend=2301(,)\n\n# Move caret up one line.\nfun void LineUp=2302(,)\n\n# Move caret up one line extending selection to new caret position.\nfun void LineUpExtend=2303(,)\n\n# Move caret left one character.\nfun void CharLeft=2304(,)\n\n# Move caret left one character extending selection to new caret position.\nfun void CharLeftExtend=2305(,)\n\n# Move caret right one character.\nfun void CharRight=2306(,)\n\n# Move caret right one character extending selection to new caret position.\nfun void CharRightExtend=2307(,)\n\n# Move caret left one word.\nfun void WordLeft=2308(,)\n\n# Move caret left one word extending selection to new caret position.\nfun void WordLeftExtend=2309(,)\n\n# Move caret right one word.\nfun void WordRight=2310(,)\n\n# Move caret right one word extending selection to new caret position.\nfun void WordRightExtend=2311(,)\n\n# Move caret to first position on line.\nfun void Home=2312(,)\n\n# Move caret to first position on line extending selection to new caret position.\nfun void HomeExtend=2313(,)\n\n# Move caret to last position on line.\nfun void LineEnd=2314(,)\n\n# Move caret to last position on line extending selection to new caret position.\nfun void LineEndExtend=2315(,)\n\n# Move caret to first position in document.\nfun void DocumentStart=2316(,)\n\n# Move caret to first position in document extending selection to new caret position.\nfun void DocumentStartExtend=2317(,)\n\n# Move caret to last position in document.\nfun void DocumentEnd=2318(,)\n\n# Move caret to last position in document extending selection to new caret position.\nfun void DocumentEndExtend=2319(,)\n\n# Move caret one page up.\nfun void PageUp=2320(,)\n\n# Move caret one page up extending selection to new caret position.\nfun void PageUpExtend=2321(,)\n\n# Move caret one page down.\nfun void PageDown=2322(,)\n\n# Move caret one page down extending selection to new caret position.\nfun void PageDownExtend=2323(,)\n\n# Switch from insert to overtype mode or the reverse.\nfun void EditToggleOvertype=2324(,)\n\n# Cancel any modes such as call tip or auto-completion list display.\nfun void Cancel=2325(,)\n\n# Delete the selection or if no selection, the character before the caret.\nfun void DeleteBack=2326(,)\n\n# If selection is empty or all on one line replace the selection with a tab character.\n# If more than one line selected, indent the lines.\nfun void Tab=2327(,)\n\n# Dedent the selected lines.\nfun void BackTab=2328(,)\n\n# Insert a new line, may use a CRLF, CR or LF depending on EOL mode.\nfun void NewLine=2329(,)\n\n# Insert a Form Feed character.\nfun void FormFeed=2330(,)\n\n# Move caret to before first visible character on line.\n# If already there move to first character on line.\nfun void VCHome=2331(,)\n\n# Like VCHome but extending selection to new caret position.\nfun void VCHomeExtend=2332(,)\n\n# Magnify the displayed text by increasing the sizes by 1 point.\nfun void ZoomIn=2333(,)\n\n# Make the displayed text smaller by decreasing the sizes by 1 point.\nfun void ZoomOut=2334(,)\n\n# Delete the word to the left of the caret.\nfun void DelWordLeft=2335(,)\n\n# Delete the word to the right of the caret.\nfun void DelWordRight=2336(,)\n\n# Delete the word to the right of the caret, but not the trailing non-word characters.\nfun void DelWordRightEnd=2518(,)\n\n# Cut the line containing the caret.\nfun void LineCut=2337(,)\n\n# Delete the line containing the caret.\nfun void LineDelete=2338(,)\n\n# Switch the current line with the previous.\nfun void LineTranspose=2339(,)\n\n# Duplicate the current line.\nfun void LineDuplicate=2404(,)\n\n# Transform the selection to lower case.\nfun void LowerCase=2340(,)\n\n# Transform the selection to upper case.\nfun void UpperCase=2341(,)\n\n# Scroll the document down, keeping the caret visible.\nfun void LineScrollDown=2342(,)\n\n# Scroll the document up, keeping the caret visible.\nfun void LineScrollUp=2343(,)\n\n# Delete the selection or if no selection, the character before the caret.\n# Will not delete the character before at the start of a line.\nfun void DeleteBackNotLine=2344(,)\n\n# Move caret to first position on display line.\nfun void HomeDisplay=2345(,)\n\n# Move caret to first position on display line extending selection to\n# new caret position.\nfun void HomeDisplayExtend=2346(,)\n\n# Move caret to last position on display line.\nfun void LineEndDisplay=2347(,)\n\n# Move caret to last position on display line extending selection to new\n# caret position.\nfun void LineEndDisplayExtend=2348(,)\n\n# These are like their namesakes Home(Extend)?, LineEnd(Extend)?, VCHome(Extend)?\n# except they behave differently when word-wrap is enabled:\n# They go first to the start / end of the display line, like (Home|LineEnd)Display\n# The difference is that, the cursor is already at the point, it goes on to the start\n# or end of the document line, as appropriate for (Home|LineEnd|VCHome)(Extend)?.\n\nfun void HomeWrap=2349(,)\nfun void HomeWrapExtend=2450(,)\nfun void LineEndWrap=2451(,)\nfun void LineEndWrapExtend=2452(,)\nfun void VCHomeWrap=2453(,)\nfun void VCHomeWrapExtend=2454(,)\n\n# Copy the line containing the caret.\nfun void LineCopy=2455(,)\n\n# Move the caret inside current view if it's not there already.\nfun void MoveCaretInsideView=2401(,)\n\n# How many characters are on a line, including end of line characters?\nfun int LineLength=2350(int line,)\n\n# Highlight the characters at two positions.\nfun void BraceHighlight=2351(position pos1, position pos2)\n\n# Use specified indicator to highlight matching braces instead of changing their style.\nfun void BraceHighlightIndicator=2498(bool useBraceHighlightIndicator, int indicator)\n\n# Highlight the character at a position indicating there is no matching brace.\nfun void BraceBadLight=2352(position pos,)\n\n# Use specified indicator to highlight non matching brace instead of changing its style.\nfun void BraceBadLightIndicator=2499(bool useBraceBadLightIndicator, int indicator)\n\n# Find the position of a matching brace or INVALID_POSITION if no match.\nfun position BraceMatch=2353(position pos,)\n\n# Are the end of line characters visible?\nget bool GetViewEOL=2355(,)\n\n# Make the end of line characters visible or invisible.\nset void SetViewEOL=2356(bool visible,)\n\n# Retrieve a pointer to the document object.\nget int GetDocPointer=2357(,)\n\n# Change the document object used.\nset void SetDocPointer=2358(, int pointer)\n\n# Set which document modification events are sent to the container.\nset void SetModEventMask=2359(int mask,)\n\nenu EdgeVisualStyle=EDGE_\nval EDGE_NONE=0\nval EDGE_LINE=1\nval EDGE_BACKGROUND=2\n\n# Retrieve the column number which text should be kept within.\nget int GetEdgeColumn=2360(,)\n\n# Set the column number of the edge.\n# If text goes past the edge then it is highlighted.\nset void SetEdgeColumn=2361(int column,)\n\n# Retrieve the edge highlight mode.\nget int GetEdgeMode=2362(,)\n\n# The edge may be displayed by a line (EDGE_LINE) or by highlighting text that\n# goes beyond it (EDGE_BACKGROUND) or not displayed at all (EDGE_NONE).\nset void SetEdgeMode=2363(int mode,)\n\n# Retrieve the colour used in edge indication.\nget colour GetEdgeColour=2364(,)\n\n# Change the colour used in edge indication.\nset void SetEdgeColour=2365(colour edgeColour,)\n\n# Sets the current caret position to be the search anchor.\nfun void SearchAnchor=2366(,)\n\n# Find some text starting at the search anchor.\n# Does not ensure the selection is visible.\nfun int SearchNext=2367(int flags, string text)\n\n# Find some text starting at the search anchor and moving backwards.\n# Does not ensure the selection is visible.\nfun int SearchPrev=2368(int flags, string text)\n\n# Retrieves the number of lines completely visible.\nget int LinesOnScreen=2370(,)\n\n# Set whether a pop up menu is displayed automatically when the user presses\n# the wrong mouse button.\nfun void UsePopUp=2371(bool allowPopUp,)\n\n# Is the selection rectangular? The alternative is the more common stream selection.\nget bool SelectionIsRectangle=2372(,)\n\n# Set the zoom level. This number of points is added to the size of all fonts.\n# It may be positive to magnify or negative to reduce.\nset void SetZoom=2373(int zoom,)\n# Retrieve the zoom level.\nget int GetZoom=2374(,)\n\n# Create a new document object.\n# Starts with reference count of 1 and not selected into editor.\nfun int CreateDocument=2375(,)\n# Extend life of document.\nfun void AddRefDocument=2376(, int doc)\n# Release a reference to the document, deleting document if it fades to black.\nfun void ReleaseDocument=2377(, int doc)\n\n# Get which document modification events are sent to the container.\nget int GetModEventMask=2378(,)\n\n# Change internal focus flag.\nset void SetFocus=2380(bool focus,)\n# Get internal focus flag.\nget bool GetFocus=2381(,)\n\nenu Status=SC_STATUS_\nval SC_STATUS_OK=0\nval SC_STATUS_FAILURE=1\nval SC_STATUS_BADALLOC=2\n\n# Change error status - 0 = OK.\nset void SetStatus=2382(int statusCode,)\n# Get error status.\nget int GetStatus=2383(,)\n\n# Set whether the mouse is captured when its button is pressed.\nset void SetMouseDownCaptures=2384(bool captures,)\n# Get whether mouse gets captured.\nget bool GetMouseDownCaptures=2385(,)\n\nenu CursorShape=SC_CURSOR\nval SC_CURSORNORMAL=-1\nval SC_CURSORARROW=2\nval SC_CURSORWAIT=4\nval SC_CURSORREVERSEARROW=7\n# Sets the cursor to one of the SC_CURSOR* values.\nset void SetCursor=2386(int cursorType,)\n# Get cursor type.\nget int GetCursor=2387(,)\n\n# Change the way control characters are displayed:\n# If symbol is < 32, keep the drawn way, else, use the given character.\nset void SetControlCharSymbol=2388(int symbol,)\n# Get the way control characters are displayed.\nget int GetControlCharSymbol=2389(,)\n\n# Move to the previous change in capitalisation.\nfun void WordPartLeft=2390(,)\n# Move to the previous change in capitalisation extending selection\n# to new caret position.\nfun void WordPartLeftExtend=2391(,)\n# Move to the change next in capitalisation.\nfun void WordPartRight=2392(,)\n# Move to the next change in capitalisation extending selection\n# to new caret position.\nfun void WordPartRightExtend=2393(,)\n\n# Constants for use with SetVisiblePolicy, similar to SetCaretPolicy.\nval VISIBLE_SLOP=0x01\nval VISIBLE_STRICT=0x04\n# Set the way the display area is determined when a particular line\n# is to be moved to by Find, FindNext, GotoLine, etc.\nfun void SetVisiblePolicy=2394(int visiblePolicy, int visibleSlop)\n\n# Delete back from the current position to the start of the line.\nfun void DelLineLeft=2395(,)\n\n# Delete forwards from the current position to the end of the line.\nfun void DelLineRight=2396(,)\n\n# Get and Set the xOffset (ie, horizontal scroll position).\nset void SetXOffset=2397(int newOffset,)\nget int GetXOffset=2398(,)\n\n# Set the last x chosen value to be the caret x position.\nfun void ChooseCaretX=2399(,)\n\n# Set the focus to this Scintilla widget.\nfun void GrabFocus=2400(,)\n\nenu CaretPolicy=CARET_\n# Caret policy, used by SetXCaretPolicy and SetYCaretPolicy.\n# If CARET_SLOP is set, we can define a slop value: caretSlop.\n# This value defines an unwanted zone (UZ) where the caret is... unwanted.\n# This zone is defined as a number of pixels near the vertical margins,\n# and as a number of lines near the horizontal margins.\n# By keeping the caret away from the edges, it is seen within its context,\n# so it is likely that the identifier that the caret is on can be completely seen,\n# and that the current line is seen with some of the lines following it which are\n# often dependent on that line.\nval CARET_SLOP=0x01\n# If CARET_STRICT is set, the policy is enforced... strictly.\n# The caret is centred on the display if slop is not set,\n# and cannot go in the UZ if slop is set.\nval CARET_STRICT=0x04\n# If CARET_JUMPS is set, the display is moved more energetically\n# so the caret can move in the same direction longer before the policy is applied again.\nval CARET_JUMPS=0x10\n# If CARET_EVEN is not set, instead of having symmetrical UZs,\n# the left and bottom UZs are extended up to right and top UZs respectively.\n# This way, we favour the displaying of useful information: the begining of lines,\n# where most code reside, and the lines after the caret, eg. the body of a function.\nval CARET_EVEN=0x08\n\n# Set the way the caret is kept visible when going sideways.\n# The exclusion zone is given in pixels.\nfun void SetXCaretPolicy=2402(int caretPolicy, int caretSlop)\n\n# Set the way the line the caret is on is kept visible.\n# The exclusion zone is given in lines.\nfun void SetYCaretPolicy=2403(int caretPolicy, int caretSlop)\n\n# Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE).\nset void SetPrintWrapMode=2406(int mode,)\n\n# Is printing line wrapped?\nget int GetPrintWrapMode=2407(,)\n\n# Set a fore colour for active hotspots.\nset void SetHotspotActiveFore=2410(bool useSetting, colour fore)\n\n# Get the fore colour for active hotspots.\nget colour GetHotspotActiveFore=2494(,)\n\n# Set a back colour for active hotspots.\nset void SetHotspotActiveBack=2411(bool useSetting, colour back)\n\n# Get the back colour for active hotspots.\nget colour GetHotspotActiveBack=2495(,)\n\n# Enable / Disable underlining active hotspots.\nset void SetHotspotActiveUnderline=2412(bool underline,)\n\n# Get whether underlining for active hotspots.\nget bool GetHotspotActiveUnderline=2496(,)\n\n# Limit hotspots to single line so hotspots on two lines don't merge.\nset void SetHotspotSingleLine=2421(bool singleLine,)\n\n# Get the HotspotSingleLine property\nget bool GetHotspotSingleLine=2497(,)\n\n# Move caret between paragraphs (delimited by empty lines).\nfun void ParaDown=2413(,)\nfun void ParaDownExtend=2414(,)\nfun void ParaUp=2415(,)\nfun void ParaUpExtend=2416(,)\n\n# Given a valid document position, return the previous position taking code\n# page into account. Returns 0 if passed 0.\nfun position PositionBefore=2417(position pos,)\n\n# Given a valid document position, return the next position taking code\n# page into account. Maximum value returned is the last position in the document.\nfun position PositionAfter=2418(position pos,)\n\n# Given a valid document position, return a position that differs in a number\n# of characters. Returned value is always between 0 and last position in document.\nfun position PositionRelative=2670(position pos, int relative)\n\n# Copy a range of text to the clipboard. Positions are clipped into the document.\nfun void CopyRange=2419(position start, position end)\n\n# Copy argument text to the clipboard.\nfun void CopyText=2420(int length, string text)\n\nenu SelectionMode=SC_SEL_\nval SC_SEL_STREAM=0\nval SC_SEL_RECTANGLE=1\nval SC_SEL_LINES=2\nval SC_SEL_THIN=3\n\n# Set the selection mode to stream (SC_SEL_STREAM) or rectangular (SC_SEL_RECTANGLE/SC_SEL_THIN) or\n# by lines (SC_SEL_LINES).\nset void SetSelectionMode=2422(int mode,)\n\n# Get the mode of the current selection.\nget int GetSelectionMode=2423(,)\n\n# Retrieve the position of the start of the selection at the given line (INVALID_POSITION if no selection on this line).\nfun position GetLineSelStartPosition=2424(int line,)\n\n# Retrieve the position of the end of the selection at the given line (INVALID_POSITION if no selection on this line).\nfun position GetLineSelEndPosition=2425(int line,)\n\n## RectExtended rectangular selection moves\n# Move caret down one line, extending rectangular selection to new caret position.\nfun void LineDownRectExtend=2426(,)\n\n# Move caret up one line, extending rectangular selection to new caret position.\nfun void LineUpRectExtend=2427(,)\n\n# Move caret left one character, extending rectangular selection to new caret position.\nfun void CharLeftRectExtend=2428(,)\n\n# Move caret right one character, extending rectangular selection to new caret position.\nfun void CharRightRectExtend=2429(,)\n\n# Move caret to first position on line, extending rectangular selection to new caret position.\nfun void HomeRectExtend=2430(,)\n\n# Move caret to before first visible character on line.\n# If already there move to first character on line.\n# In either case, extend rectangular selection to new caret position.\nfun void VCHomeRectExtend=2431(,)\n\n# Move caret to last position on line, extending rectangular selection to new caret position.\nfun void LineEndRectExtend=2432(,)\n\n# Move caret one page up, extending rectangular selection to new caret position.\nfun void PageUpRectExtend=2433(,)\n\n# Move caret one page down, extending rectangular selection to new caret position.\nfun void PageDownRectExtend=2434(,)\n\n\n# Move caret to top of page, or one page up if already at top of page.\nfun void StutteredPageUp=2435(,)\n\n# Move caret to top of page, or one page up if already at top of page, extending selection to new caret position.\nfun void StutteredPageUpExtend=2436(,)\n\n# Move caret to bottom of page, or one page down if already at bottom of page.\nfun void StutteredPageDown=2437(,)\n\n# Move caret to bottom of page, or one page down if already at bottom of page, extending selection to new caret position.\nfun void StutteredPageDownExtend=2438(,)\n\n\n# Move caret left one word, position cursor at end of word.\nfun void WordLeftEnd=2439(,)\n\n# Move caret left one word, position cursor at end of word, extending selection to new caret position.\nfun void WordLeftEndExtend=2440(,)\n\n# Move caret right one word, position cursor at end of word.\nfun void WordRightEnd=2441(,)\n\n# Move caret right one word, position cursor at end of word, extending selection to new caret position.\nfun void WordRightEndExtend=2442(,)\n\n# Set the set of characters making up whitespace for when moving or selecting by word.\n# Should be called after SetWordChars.\nset void SetWhitespaceChars=2443(, string characters)\n\n# Get the set of characters making up whitespace for when moving or selecting by word.\nget int GetWhitespaceChars=2647(, stringresult characters)\n\n# Set the set of characters making up punctuation characters\n# Should be called after SetWordChars.\nset void SetPunctuationChars=2648(, string characters)\n\n# Get the set of characters making up punctuation characters\nget int GetPunctuationChars=2649(, stringresult characters)\n\n# Reset the set of characters for whitespace and word characters to the defaults.\nfun void SetCharsDefault=2444(,)\n\n# Get currently selected item position in the auto-completion list\nget int AutoCGetCurrent=2445(,)\n\n# Get currently selected item text in the auto-completion list\n# Returns the length of the item text\nget int AutoCGetCurrentText=2610(, stringresult s)\n\nenu CaseInsensitiveBehaviour=SC_CASEINSENSITIVEBEHAVIOUR_\nval SC_CASEINSENSITIVEBEHAVIOUR_RESPECTCASE=0\nval SC_CASEINSENSITIVEBEHAVIOUR_IGNORECASE=1\n\n# Set auto-completion case insensitive behaviour to either prefer case-sensitive matches or have no preference.\nset void AutoCSetCaseInsensitiveBehaviour=2634(int behaviour,)\n\n# Get auto-completion case insensitive behaviour.\nget int AutoCGetCaseInsensitiveBehaviour=2635(,)\n\nenu Ordering=SC_ORDER_\nval SC_ORDER_PRESORTED=0\nval SC_ORDER_PERFORMSORT=1\nval SC_ORDER_CUSTOM=2\n\n# Set the way autocompletion lists are ordered.\nset void AutoCSetOrder=2660(int order,)\n\n# Get the way autocompletion lists are ordered.\nget int AutoCGetOrder=2661(,)\n\n# Enlarge the document to a particular size of text bytes.\nfun void Allocate=2446(int bytes,)\n\n# Returns the target converted to UTF8.\n# Return the length in bytes.\nfun int TargetAsUTF8=2447(, stringresult s)\n\n# Set the length of the utf8 argument for calling EncodedFromUTF8.\n# Set to -1 and the string will be measured to the first nul.\nfun void SetLengthForEncode=2448(int bytes,)\n\n# Translates a UTF8 string into the document encoding.\n# Return the length of the result in bytes.\n# On error return 0.\nfun int EncodedFromUTF8=2449(string utf8, stringresult encoded)\n\n# Find the position of a column on a line taking into account tabs and\n# multi-byte characters. If beyond end of line, return line end position.\nfun int FindColumn=2456(int line, int column)\n\n# Can the caret preferred x position only be changed by explicit movement commands?\nget int GetCaretSticky=2457(,)\n\n# Stop the caret preferred x position changing when the user types.\nset void SetCaretSticky=2458(int useCaretStickyBehaviour,)\n\nenu CaretSticky=SC_CARETSTICKY_\nval SC_CARETSTICKY_OFF=0\nval SC_CARETSTICKY_ON=1\nval SC_CARETSTICKY_WHITESPACE=2\n\n# Switch between sticky and non-sticky: meant to be bound to a key.\nfun void ToggleCaretSticky=2459(,)\n\n# Enable/Disable convert-on-paste for line endings\nset void SetPasteConvertEndings=2467(bool convert,)\n\n# Get convert-on-paste setting\nget bool GetPasteConvertEndings=2468(,)\n\n# Duplicate the selection. If selection empty duplicate the line containing the caret.\nfun void SelectionDuplicate=2469(,)\n\nval SC_ALPHA_TRANSPARENT=0\nval SC_ALPHA_OPAQUE=255\nval SC_ALPHA_NOALPHA=256\n\n# Set background alpha of the caret line.\nset void SetCaretLineBackAlpha=2470(int alpha,)\n\n# Get the background alpha of the caret line.\nget int GetCaretLineBackAlpha=2471(,)\n\nenu CaretStyle=CARETSTYLE_\nval CARETSTYLE_INVISIBLE=0\nval CARETSTYLE_LINE=1\nval CARETSTYLE_BLOCK=2\n\n# Set the style of the caret to be drawn.\nset void SetCaretStyle=2512(int caretStyle,)\n\n# Returns the current style of the caret.\nget int GetCaretStyle=2513(,)\n\n# Set the indicator used for IndicatorFillRange and IndicatorClearRange\nset void SetIndicatorCurrent=2500(int indicator,)\n\n# Get the current indicator\nget int GetIndicatorCurrent=2501(,)\n\n# Set the value used for IndicatorFillRange\nset void SetIndicatorValue=2502(int value,)\n\n# Get the current indicator value\nget int GetIndicatorValue=2503(,)\n\n# Turn a indicator on over a range.\nfun void IndicatorFillRange=2504(int position, int fillLength)\n\n# Turn a indicator off over a range.\nfun void IndicatorClearRange=2505(int position, int clearLength)\n\n# Are any indicators present at position?\nfun int IndicatorAllOnFor=2506(int position,)\n\n# What value does a particular indicator have at at a position?\nfun int IndicatorValueAt=2507(int indicator, int position)\n\n# Where does a particular indicator start?\nfun int IndicatorStart=2508(int indicator, int position)\n\n# Where does a particular indicator end?\nfun int IndicatorEnd=2509(int indicator, int position)\n\n# Set number of entries in position cache\nset void SetPositionCache=2514(int size,)\n\n# How many entries are allocated to the position cache?\nget int GetPositionCache=2515(,)\n\n# Copy the selection, if selection empty copy the line with the caret\nfun void CopyAllowLine=2519(,)\n\n# Compact the document buffer and return a read-only pointer to the\n# characters in the document.\nget int GetCharacterPointer=2520(,)\n\n# Return a read-only pointer to a range of characters in the document.\n# May move the gap so that the range is contiguous, but will only move up\n# to rangeLength bytes.\nget int GetRangePointer=2643(int position, int rangeLength)\n\n# Return a position which, to avoid performance costs, should not be within\n# the range of a call to GetRangePointer.\nget position GetGapPosition=2644(,)\n\n# Always interpret keyboard input as Unicode\nset void SetKeysUnicode=2521(bool keysUnicode,)\n\n# Are keys always interpreted as Unicode?\nget bool GetKeysUnicode=2522(,)\n\n# Set the alpha fill colour of the given indicator.\nset void IndicSetAlpha=2523(int indicator, int alpha)\n\n# Get the alpha fill colour of the given indicator.\nget int IndicGetAlpha=2524(int indicator,)\n\n# Set the alpha outline colour of the given indicator.\nset void IndicSetOutlineAlpha=2558(int indicator, int alpha)\n\n# Get the alpha outline colour of the given indicator.\nget int IndicGetOutlineAlpha=2559(int indicator,)\n\n# Set extra ascent for each line\nset void SetExtraAscent=2525(int extraAscent,)\n\n# Get extra ascent for each line\nget int GetExtraAscent=2526(,)\n\n# Set extra descent for each line\nset void SetExtraDescent=2527(int extraDescent,)\n\n# Get extra descent for each line\nget int GetExtraDescent=2528(,)\n\n# Which symbol was defined for markerNumber with MarkerDefine\nfun int MarkerSymbolDefined=2529(int markerNumber,)\n\n# Set the text in the text margin for a line\nset void MarginSetText=2530(int line, string text)\n\n# Get the text in the text margin for a line\nget int MarginGetText=2531(int line, stringresult text)\n\n# Set the style number for the text margin for a line\nset void MarginSetStyle=2532(int line, int style)\n\n# Get the style number for the text margin for a line\nget int MarginGetStyle=2533(int line,)\n\n# Set the style in the text margin for a line\nset void MarginSetStyles=2534(int line, string styles)\n\n# Get the styles in the text margin for a line\nget int MarginGetStyles=2535(int line, stringresult styles)\n\n# Clear the margin text on all lines\nfun void MarginTextClearAll=2536(,)\n\n# Get the start of the range of style numbers used for margin text\nset void MarginSetStyleOffset=2537(int style,)\n\n# Get the start of the range of style numbers used for margin text\nget int MarginGetStyleOffset=2538(,)\n\nenu MarginOption=SC_MARGINOPTION_\nval SC_MARGINOPTION_NONE=0\nval SC_MARGINOPTION_SUBLINESELECT=1\n\n# Set the margin options.\nset void SetMarginOptions=2539(int marginOptions,)\n\n# Get the margin options.\nget int GetMarginOptions=2557(,)\n\n# Set the annotation text for a line\nset void AnnotationSetText=2540(int line, string text)\n\n# Get the annotation text for a line\nget int AnnotationGetText=2541(int line, stringresult text)\n\n# Set the style number for the annotations for a line\nset void AnnotationSetStyle=2542(int line, int style)\n\n# Get the style number for the annotations for a line\nget int AnnotationGetStyle=2543(int line,)\n\n# Set the annotation styles for a line\nset void AnnotationSetStyles=2544(int line, string styles)\n\n# Get the annotation styles for a line\nget int AnnotationGetStyles=2545(int line, stringresult styles)\n\n# Get the number of annotation lines for a line\nget int AnnotationGetLines=2546(int line,)\n\n# Clear the annotations from all lines\nfun void AnnotationClearAll=2547(,)\n\nenu AnnotationVisible=ANNOTATION_\nval ANNOTATION_HIDDEN=0\nval ANNOTATION_STANDARD=1\nval ANNOTATION_BOXED=2\n\n# Set the visibility for the annotations for a view\nset void AnnotationSetVisible=2548(int visible,)\n\n# Get the visibility for the annotations for a view\nget int AnnotationGetVisible=2549(,)\n\n# Get the start of the range of style numbers used for annotations\nset void AnnotationSetStyleOffset=2550(int style,)\n\n# Get the start of the range of style numbers used for annotations\nget int AnnotationGetStyleOffset=2551(,)\n\n# Release all extended (>255) style numbers\nfun void ReleaseAllExtendedStyles=2552(,)\n\n# Allocate some extended (>255) style numbers and return the start of the range\nfun int AllocateExtendedStyles=2553(int numberStyles,)\n\nval UNDO_MAY_COALESCE=1\n\n# Add a container action to the undo stack\nfun void AddUndoAction=2560(int token, int flags)\n\n# Find the position of a character from a point within the window.\nfun position CharPositionFromPoint=2561(int x, int y)\n\n# Find the position of a character from a point within the window.\n# Return INVALID_POSITION if not close to text.\nfun position CharPositionFromPointClose=2562(int x, int y)\n\n# Set whether switching to rectangular mode while selecting with the mouse is allowed.\nset void SetMouseSelectionRectangularSwitch=2668(bool mouseSelectionRectangularSwitch,)\n\n# Whether switching to rectangular mode while selecting with the mouse is allowed.\nget bool GetMouseSelectionRectangularSwitch=2669(,)\n\n# Set whether multiple selections can be made\nset void SetMultipleSelection=2563(bool multipleSelection,)\n\n# Whether multiple selections can be made\nget bool GetMultipleSelection=2564(,)\n\n# Set whether typing can be performed into multiple selections\nset void SetAdditionalSelectionTyping=2565(bool additionalSelectionTyping,)\n\n# Whether typing can be performed into multiple selections\nget bool GetAdditionalSelectionTyping=2566(,)\n\n# Set whether additional carets will blink\nset void SetAdditionalCaretsBlink=2567(bool additionalCaretsBlink,)\n\n# Whether additional carets will blink\nget bool GetAdditionalCaretsBlink=2568(,)\n\n# Set whether additional carets are visible\nset void SetAdditionalCaretsVisible=2608(bool additionalCaretsBlink,)\n\n# Whether additional carets are visible\nget bool GetAdditionalCaretsVisible=2609(,)\n\n# How many selections are there?\nget int GetSelections=2570(,)\n\n# Is every selected range empty?\nget bool GetSelectionEmpty=2650(,)\n\n# Clear selections to a single empty stream selection\nfun void ClearSelections=2571(,)\n\n# Set a simple selection\nfun int SetSelection=2572(int caret, int anchor)\n\n# Add a selection\nfun int AddSelection=2573(int caret, int anchor)\n\n# Set the main selection\nset void SetMainSelection=2574(int selection,)\n\n# Which selection is the main selection\nget int GetMainSelection=2575(,)\n\nset void SetSelectionNCaret=2576(int selection, position pos)\nget position GetSelectionNCaret=2577(int selection,)\nset void SetSelectionNAnchor=2578(int selection, position posAnchor)\nget position GetSelectionNAnchor=2579(int selection,)\nset void SetSelectionNCaretVirtualSpace=2580(int selection, int space)\nget int GetSelectionNCaretVirtualSpace=2581(int selection,)\nset void SetSelectionNAnchorVirtualSpace=2582(int selection, int space)\nget int GetSelectionNAnchorVirtualSpace=2583(int selection,)\n\n# Sets the position that starts the selection - this becomes the anchor.\nset void SetSelectionNStart=2584(int selection, position pos)\n\n# Returns the position at the start of the selection.\nget position GetSelectionNStart=2585(int selection,)\n\n# Sets the position that ends the selection - this becomes the currentPosition.\nset void SetSelectionNEnd=2586(int selection, position pos)\n\n# Returns the position at the end of the selection.\nget position GetSelectionNEnd=2587(int selection,)\n\nset void SetRectangularSelectionCaret=2588(position pos,)\nget position GetRectangularSelectionCaret=2589(,)\nset void SetRectangularSelectionAnchor=2590(position posAnchor,)\nget position GetRectangularSelectionAnchor=2591(,)\nset void SetRectangularSelectionCaretVirtualSpace=2592(int space,)\nget int GetRectangularSelectionCaretVirtualSpace=2593(,)\nset void SetRectangularSelectionAnchorVirtualSpace=2594(int space,)\nget int GetRectangularSelectionAnchorVirtualSpace=2595(,)\n\nenu VirtualSpace=SCVS_\nval SCVS_NONE=0\nval SCVS_RECTANGULARSELECTION=1\nval SCVS_USERACCESSIBLE=2\n\nset void SetVirtualSpaceOptions=2596(int virtualSpaceOptions,)\nget int GetVirtualSpaceOptions=2597(,)\n\n# On GTK+, allow selecting the modifier key to use for mouse-based\n# rectangular selection. Often the window manager requires Alt+Mouse Drag\n# for moving windows.\n# Valid values are SCMOD_CTRL(default), SCMOD_ALT, or SCMOD_SUPER.\n\nset void SetRectangularSelectionModifier=2598(int modifier,)\n\n# Get the modifier key used for rectangular selection.\nget int GetRectangularSelectionModifier=2599(,)\n\n# Set the foreground colour of additional selections.\n# Must have previously called SetSelFore with non-zero first argument for this to have an effect.\nset void SetAdditionalSelFore=2600(colour fore,)\n\n# Set the background colour of additional selections.\n# Must have previously called SetSelBack with non-zero first argument for this to have an effect.\nset void SetAdditionalSelBack=2601(colour back,)\n\n# Set the alpha of the selection.\nset void SetAdditionalSelAlpha=2602(int alpha,)\n\n# Get the alpha of the selection.\nget int GetAdditionalSelAlpha=2603(,)\n\n# Set the foreground colour of additional carets.\nset void SetAdditionalCaretFore=2604(colour fore,)\n\n# Get the foreground colour of additional carets.\nget colour GetAdditionalCaretFore=2605(,)\n\n# Set the main selection to the next selection.\nfun void RotateSelection=2606(,)\n\n# Swap that caret and anchor of the main selection.\nfun void SwapMainAnchorCaret=2607(,)\n\n# Indicate that the internal state of a lexer has changed over a range and therefore\n# there may be a need to redraw.\nfun int ChangeLexerState=2617(position start, position end)\n\n# Find the next line at or after lineStart that is a contracted fold header line.\n# Return -1 when no more lines.\nfun int ContractedFoldNext=2618(int lineStart,)\n\n# Centre current line in window.\nfun void VerticalCentreCaret=2619(,)\n\n# Move the selected lines up one line, shifting the line above after the selection\nfun void MoveSelectedLinesUp=2620(,)\n\n# Move the selected lines down one line, shifting the line below before the selection\nfun void MoveSelectedLinesDown=2621(,)\n\n# Set the identifier reported as idFrom in notification messages.\nset void SetIdentifier=2622(int identifier,)\n\n# Get the identifier.\nget int GetIdentifier=2623(,)\n\n# Set the width for future RGBA image data.\nset void RGBAImageSetWidth=2624(int width,)\n\n# Set the height for future RGBA image data.\nset void RGBAImageSetHeight=2625(int height,)\n\n# Set the scale factor in percent for future RGBA image data.\nset void RGBAImageSetScale=2651(int scalePercent,)\n\n# Define a marker from RGBA data.\n# It has the width and height from RGBAImageSetWidth/Height\nfun void MarkerDefineRGBAImage=2626(int markerNumber, string pixels)\n\n# Register an RGBA image for use in autocompletion lists.\n# It has the width and height from RGBAImageSetWidth/Height\nfun void RegisterRGBAImage=2627(int type, string pixels)\n\n# Scroll to start of document.\nfun void ScrollToStart=2628(,)\n\n# Scroll to end of document.\nfun void ScrollToEnd=2629(,)\n\nval SC_TECHNOLOGY_DEFAULT=0\nval SC_TECHNOLOGY_DIRECTWRITE=1\n\n# Set the technology used.\nset void SetTechnology=2630(int technology,)\n\n# Get the tech.\nget int GetTechnology=2631(,)\n\n# Create an ILoader*.\nfun int CreateLoader=2632(int bytes,)\n\n# On OS X, show a find indicator.\nfun void FindIndicatorShow=2640(position start, position end)\n\n# On OS X, flash a find indicator, then fade out.\nfun void FindIndicatorFlash=2641(position start, position end)\n\n# On OS X, hide the find indicator.\nfun void FindIndicatorHide=2642(,)\n\n# Move caret to before first visible character on display line.\n# If already there move to first character on display line.\nfun void VCHomeDisplay=2652(,)\n\n# Like VCHomeDisplay but extending selection to new caret position.\nfun void VCHomeDisplayExtend=2653(,)\n\n# Is the caret line always visible?\nget bool GetCaretLineVisibleAlways=2654(,)\n\n# Sets the caret line to always visible.\nset void SetCaretLineVisibleAlways=2655(bool alwaysVisible,)\n\n# Set the way a character is drawn.\nset void SetRepresentation=2665(string encodedCharacter, string representation)\n\n# Set the way a character is drawn.\nget int GetRepresentation=2666(string encodedCharacter, stringresult representation)\n\n# Remove a character representation.\nfun void ClearRepresentation=2667(string encodedCharacter,)\n\n# Start notifying the container of all key presses and commands.\nfun void StartRecord=3001(,)\n\n# Stop notifying the container of all key presses and commands.\nfun void StopRecord=3002(,)\n\n# Set the lexing language of the document.\nset void SetLexer=4001(int lexer,)\n\n# Retrieve the lexing language of the document.\nget int GetLexer=4002(,)\n\n# Colourise a segment of the document using the current lexing language.\nfun void Colourise=4003(position start, position end)\n\n# Set up a value that may be used by a lexer for some optional feature.\nset void SetProperty=4004(string key, string value)\n\n# Maximum value of keywordSet parameter of SetKeyWords.\nval KEYWORDSET_MAX=8\n\n# Set up the key words used by the lexer.\nset void SetKeyWords=4005(int keywordSet, string keyWords)\n\n# Set the lexing language of the document based on string name.\nset void SetLexerLanguage=4006(, string language)\n\n# Load a lexer library (dll / so).\nfun void LoadLexerLibrary=4007(, string path)\n\n# Retrieve a \"property\" value previously set with SetProperty.\nget int GetProperty=4008(string key, stringresult buf)\n\n# Retrieve a \"property\" value previously set with SetProperty,\n# with \"$()\" variable replacement on returned buffer.\nget int GetPropertyExpanded=4009(string key, stringresult buf)\n\n# Retrieve a \"property\" value previously set with SetProperty,\n# interpreted as an int AFTER any \"$()\" variable replacement.\nget int GetPropertyInt=4010(string key,)\n\n# Retrieve the number of bits the current lexer needs for styling.\nget int GetStyleBitsNeeded=4011(,)\n\n# Retrieve the name of the lexer.\n# Return the length of the text.\nget int GetLexerLanguage=4012(, stringresult text)\n\n# For private communication between an application and a known lexer.\nfun int PrivateLexerCall=4013(int operation, int pointer)\n\n# Retrieve a '\\n' separated list of properties understood by the current lexer.\nfun int PropertyNames=4014(, stringresult names)\n\nenu TypeProperty=SC_TYPE_\nval SC_TYPE_BOOLEAN=0\nval SC_TYPE_INTEGER=1\nval SC_TYPE_STRING=2\n\n# Retrieve the type of a property.\nfun int PropertyType=4015(string name,)\n\n# Describe a property.\nfun int DescribeProperty=4016(string name, stringresult description)\n\n# Retrieve a '\\n' separated list of descriptions of the keyword sets understood by the current lexer.\nfun int DescribeKeyWordSets=4017(, stringresult descriptions)\n\n# Notifications\n# Type of modification and the action which caused the modification.\n# These are defined as a bit mask to make it easy to specify which notifications are wanted.\n# One bit is set from each of SC_MOD_* and SC_PERFORMED_*.\nenu ModificationFlags=SC_MOD_ SC_PERFORMED_ SC_MULTISTEPUNDOREDO SC_LASTSTEPINUNDOREDO SC_MULTILINEUNDOREDO SC_STARTACTION SC_MODEVENTMASKALL\nval SC_MOD_INSERTTEXT=0x1\nval SC_MOD_DELETETEXT=0x2\nval SC_MOD_CHANGESTYLE=0x4\nval SC_MOD_CHANGEFOLD=0x8\nval SC_PERFORMED_USER=0x10\nval SC_PERFORMED_UNDO=0x20\nval SC_PERFORMED_REDO=0x40\nval SC_MULTISTEPUNDOREDO=0x80\nval SC_LASTSTEPINUNDOREDO=0x100\nval SC_MOD_CHANGEMARKER=0x200\nval SC_MOD_BEFOREINSERT=0x400\nval SC_MOD_BEFOREDELETE=0x800\nval SC_MULTILINEUNDOREDO=0x1000\nval SC_STARTACTION=0x2000\nval SC_MOD_CHANGEINDICATOR=0x4000\nval SC_MOD_CHANGELINESTATE=0x8000\nval SC_MOD_CHANGEMARGIN=0x10000\nval SC_MOD_CHANGEANNOTATION=0x20000\nval SC_MOD_CONTAINER=0x40000\nval SC_MOD_LEXERSTATE=0x80000\nval SC_MODEVENTMASKALL=0xFFFFF\n\nenu Update=SC_UPDATE_\nval SC_UPDATE_CONTENT=0x1\nval SC_UPDATE_SELECTION=0x2\nval SC_UPDATE_V_SCROLL=0x4\nval SC_UPDATE_H_SCROLL=0x8\n\n# For compatibility, these go through the COMMAND notification rather than NOTIFY\n# and should have had exactly the same values as the EN_* constants.\n# Unfortunately the SETFOCUS and KILLFOCUS are flipped over from EN_*\n# As clients depend on these constants, this will not be changed.\nval SCEN_CHANGE=768\nval SCEN_SETFOCUS=512\nval SCEN_KILLFOCUS=256\n\n# Symbolic key codes and modifier flags.\n# ASCII and other printable characters below 256.\n# Extended keys above 300.\n\nenu Keys=SCK_\nval SCK_DOWN=300\nval SCK_UP=301\nval SCK_LEFT=302\nval SCK_RIGHT=303\nval SCK_HOME=304\nval SCK_END=305\nval SCK_PRIOR=306\nval SCK_NEXT=307\nval SCK_DELETE=308\nval SCK_INSERT=309\nval SCK_ESCAPE=7\nval SCK_BACK=8\nval SCK_TAB=9\nval SCK_RETURN=13\nval SCK_ADD=310\nval SCK_SUBTRACT=311\nval SCK_DIVIDE=312\nval SCK_WIN=313\nval SCK_RWIN=314\nval SCK_MENU=315\n\nenu KeyMod=SCMOD_\nval SCMOD_NORM=0\nval SCMOD_SHIFT=1\nval SCMOD_CTRL=2\nval SCMOD_ALT=4\nval SCMOD_SUPER=8\nval SCMOD_META=16\n\n################################################\n# For SciLexer.h\nenu Lexer=SCLEX_\nval SCLEX_CONTAINER=0\nval SCLEX_NULL=1\nval SCLEX_PYTHON=2\nval SCLEX_CPP=3\nval SCLEX_HTML=4\nval SCLEX_XML=5\nval SCLEX_PERL=6\nval SCLEX_SQL=7\nval SCLEX_VB=8\nval SCLEX_PROPERTIES=9\nval SCLEX_ERRORLIST=10\nval SCLEX_MAKEFILE=11\nval SCLEX_BATCH=12\nval SCLEX_XCODE=13\nval SCLEX_LATEX=14\nval SCLEX_LUA=15\nval SCLEX_DIFF=16\nval SCLEX_CONF=17\nval SCLEX_PASCAL=18\nval SCLEX_AVE=19\nval SCLEX_ADA=20\nval SCLEX_LISP=21\nval SCLEX_RUBY=22\nval SCLEX_EIFFEL=23\nval SCLEX_EIFFELKW=24\nval SCLEX_TCL=25\nval SCLEX_NNCRONTAB=26\nval SCLEX_BULLANT=27\nval SCLEX_VBSCRIPT=28\nval SCLEX_BAAN=31\nval SCLEX_MATLAB=32\nval SCLEX_SCRIPTOL=33\nval SCLEX_ASM=34\nval SCLEX_CPPNOCASE=35\nval SCLEX_FORTRAN=36\nval SCLEX_F77=37\nval SCLEX_CSS=38\nval SCLEX_POV=39\nval SCLEX_LOUT=40\nval SCLEX_ESCRIPT=41\nval SCLEX_PS=42\nval SCLEX_NSIS=43\nval SCLEX_MMIXAL=44\nval SCLEX_CLW=45\nval SCLEX_CLWNOCASE=46\nval SCLEX_LOT=47\nval SCLEX_YAML=48\nval SCLEX_TEX=49\nval SCLEX_METAPOST=50\nval SCLEX_POWERBASIC=51\nval SCLEX_FORTH=52\nval SCLEX_ERLANG=53\nval SCLEX_OCTAVE=54\nval SCLEX_MSSQL=55\nval SCLEX_VERILOG=56\nval SCLEX_KIX=57\nval SCLEX_GUI4CLI=58\nval SCLEX_SPECMAN=59\nval SCLEX_AU3=60\nval SCLEX_APDL=61\nval SCLEX_BASH=62\nval SCLEX_ASN1=63\nval SCLEX_VHDL=64\nval SCLEX_CAML=65\nval SCLEX_BLITZBASIC=66\nval SCLEX_PUREBASIC=67\nval SCLEX_HASKELL=68\nval SCLEX_PHPSCRIPT=69\nval SCLEX_TADS3=70\nval SCLEX_REBOL=71\nval SCLEX_SMALLTALK=72\nval SCLEX_FLAGSHIP=73\nval SCLEX_CSOUND=74\nval SCLEX_FREEBASIC=75\nval SCLEX_INNOSETUP=76\nval SCLEX_OPAL=77\nval SCLEX_SPICE=78\nval SCLEX_D=79\nval SCLEX_CMAKE=80\nval SCLEX_GAP=81\nval SCLEX_PLM=82\nval SCLEX_PROGRESS=83\nval SCLEX_ABAQUS=84\nval SCLEX_ASYMPTOTE=85\nval SCLEX_R=86\nval SCLEX_MAGIK=87\nval SCLEX_POWERSHELL=88\nval SCLEX_MYSQL=89\nval SCLEX_PO=90\nval SCLEX_TAL=91\nval SCLEX_COBOL=92\nval SCLEX_TACL=93\nval SCLEX_SORCUS=94\nval SCLEX_POWERPRO=95\nval SCLEX_NIMROD=96\nval SCLEX_SML=97\nval SCLEX_MARKDOWN=98\nval SCLEX_TXT2TAGS=99\nval SCLEX_A68K=100\nval SCLEX_MODULA=101\nval SCLEX_COFFEESCRIPT=102\nval SCLEX_TCMD=103\nval SCLEX_AVS=104\nval SCLEX_ECL=105\nval SCLEX_OSCRIPT=106\nval SCLEX_VISUALPROLOG=107\nval SCLEX_LITERATEHASKELL=108\nval SCLEX_STTXT=109\nval SCLEX_KVIRC=110\nval SCLEX_RUST=111\n\n# When a lexer specifies its language as SCLEX_AUTOMATIC it receives a\n# value assigned in sequence from SCLEX_AUTOMATIC+1.\nval SCLEX_AUTOMATIC=1000\n# Lexical states for SCLEX_PYTHON\nlex Python=SCLEX_PYTHON SCE_P_\nlex Nimrod=SCLEX_NIMROD SCE_P_\nval SCE_P_DEFAULT=0\nval SCE_P_COMMENTLINE=1\nval SCE_P_NUMBER=2\nval SCE_P_STRING=3\nval SCE_P_CHARACTER=4\nval SCE_P_WORD=5\nval SCE_P_TRIPLE=6\nval SCE_P_TRIPLEDOUBLE=7\nval SCE_P_CLASSNAME=8\nval SCE_P_DEFNAME=9\nval SCE_P_OPERATOR=10\nval SCE_P_IDENTIFIER=11\nval SCE_P_COMMENTBLOCK=12\nval SCE_P_STRINGEOL=13\nval SCE_P_WORD2=14\nval SCE_P_DECORATOR=15\n# Lexical states for SCLEX_CPP\nlex Cpp=SCLEX_CPP SCE_C_\nlex BullAnt=SCLEX_BULLANT SCE_C_\nval SCE_C_DEFAULT=0\nval SCE_C_COMMENT=1\nval SCE_C_COMMENTLINE=2\nval SCE_C_COMMENTDOC=3\nval SCE_C_NUMBER=4\nval SCE_C_WORD=5\nval SCE_C_STRING=6\nval SCE_C_CHARACTER=7\nval SCE_C_UUID=8\nval SCE_C_PREPROCESSOR=9\nval SCE_C_OPERATOR=10\nval SCE_C_IDENTIFIER=11\nval SCE_C_STRINGEOL=12\nval SCE_C_VERBATIM=13\nval SCE_C_REGEX=14\nval SCE_C_COMMENTLINEDOC=15\nval SCE_C_WORD2=16\nval SCE_C_COMMENTDOCKEYWORD=17\nval SCE_C_COMMENTDOCKEYWORDERROR=18\nval SCE_C_GLOBALCLASS=19\nval SCE_C_STRINGRAW=20\nval SCE_C_TRIPLEVERBATIM=21\nval SCE_C_HASHQUOTEDSTRING=22\nval SCE_C_PREPROCESSORCOMMENT=23\nval SCE_C_PREPROCESSORCOMMENTDOC=24\n# Lexical states for SCLEX_D\nlex D=SCLEX_D SCE_D_\nval SCE_D_DEFAULT=0\nval SCE_D_COMMENT=1\nval SCE_D_COMMENTLINE=2\nval SCE_D_COMMENTDOC=3\nval SCE_D_COMMENTNESTED=4\nval SCE_D_NUMBER=5\nval SCE_D_WORD=6\nval SCE_D_WORD2=7\nval SCE_D_WORD3=8\nval SCE_D_TYPEDEF=9\nval SCE_D_STRING=10\nval SCE_D_STRINGEOL=11\nval SCE_D_CHARACTER=12\nval SCE_D_OPERATOR=13\nval SCE_D_IDENTIFIER=14\nval SCE_D_COMMENTLINEDOC=15\nval SCE_D_COMMENTDOCKEYWORD=16\nval SCE_D_COMMENTDOCKEYWORDERROR=17\nval SCE_D_STRINGB=18\nval SCE_D_STRINGR=19\nval SCE_D_WORD5=20\nval SCE_D_WORD6=21\nval SCE_D_WORD7=22\n# Lexical states for SCLEX_TCL\nlex TCL=SCLEX_TCL SCE_TCL_\nval SCE_TCL_DEFAULT=0\nval SCE_TCL_COMMENT=1\nval SCE_TCL_COMMENTLINE=2\nval SCE_TCL_NUMBER=3\nval SCE_TCL_WORD_IN_QUOTE=4\nval SCE_TCL_IN_QUOTE=5\nval SCE_TCL_OPERATOR=6\nval SCE_TCL_IDENTIFIER=7\nval SCE_TCL_SUBSTITUTION=8\nval SCE_TCL_SUB_BRACE=9\nval SCE_TCL_MODIFIER=10\nval SCE_TCL_EXPAND=11\nval SCE_TCL_WORD=12\nval SCE_TCL_WORD2=13\nval SCE_TCL_WORD3=14\nval SCE_TCL_WORD4=15\nval SCE_TCL_WORD5=16\nval SCE_TCL_WORD6=17\nval SCE_TCL_WORD7=18\nval SCE_TCL_WORD8=19\nval SCE_TCL_COMMENT_BOX=20\nval SCE_TCL_BLOCK_COMMENT=21\n# Lexical states for SCLEX_HTML, SCLEX_XML\nlex HTML=SCLEX_HTML SCE_H_ SCE_HJ_ SCE_HJA_ SCE_HB_ SCE_HBA_ SCE_HP_ SCE_HPHP_ SCE_HPA_\nlex XML=SCLEX_XML SCE_H_ SCE_HJ_ SCE_HJA_ SCE_HB_ SCE_HBA_ SCE_HP_ SCE_HPHP_ SCE_HPA_\nlex ASP=SCLEX_ASP SCE_H_ SCE_HJ_ SCE_HJA_ SCE_HB_ SCE_HBA_ SCE_HP_ SCE_HPHP_ SCE_HPA_\nlex PHP=SCLEX_PHP SCE_H_ SCE_HJ_ SCE_HJA_ SCE_HB_ SCE_HBA_ SCE_HP_ SCE_HPHP_ SCE_HPA_\nval SCE_H_DEFAULT=0\nval SCE_H_TAG=1\nval SCE_H_TAGUNKNOWN=2\nval SCE_H_ATTRIBUTE=3\nval SCE_H_ATTRIBUTEUNKNOWN=4\nval SCE_H_NUMBER=5\nval SCE_H_DOUBLESTRING=6\nval SCE_H_SINGLESTRING=7\nval SCE_H_OTHER=8\nval SCE_H_COMMENT=9\nval SCE_H_ENTITY=10\n# XML and ASP\nval SCE_H_TAGEND=11\nval SCE_H_XMLSTART=12\nval SCE_H_XMLEND=13\nval SCE_H_SCRIPT=14\nval SCE_H_ASP=15\nval SCE_H_ASPAT=16\nval SCE_H_CDATA=17\nval SCE_H_QUESTION=18\n# More HTML\nval SCE_H_VALUE=19\n# X-Code\nval SCE_H_XCCOMMENT=20\n# SGML\nval SCE_H_SGML_DEFAULT=21\nval SCE_H_SGML_COMMAND=22\nval SCE_H_SGML_1ST_PARAM=23\nval SCE_H_SGML_DOUBLESTRING=24\nval SCE_H_SGML_SIMPLESTRING=25\nval SCE_H_SGML_ERROR=26\nval SCE_H_SGML_SPECIAL=27\nval SCE_H_SGML_ENTITY=28\nval SCE_H_SGML_COMMENT=29\nval SCE_H_SGML_1ST_PARAM_COMMENT=30\nval SCE_H_SGML_BLOCK_DEFAULT=31\n# Embedded Javascript\nval SCE_HJ_START=40\nval SCE_HJ_DEFAULT=41\nval SCE_HJ_COMMENT=42\nval SCE_HJ_COMMENTLINE=43\nval SCE_HJ_COMMENTDOC=44\nval SCE_HJ_NUMBER=45\nval SCE_HJ_WORD=46\nval SCE_HJ_KEYWORD=47\nval SCE_HJ_DOUBLESTRING=48\nval SCE_HJ_SINGLESTRING=49\nval SCE_HJ_SYMBOLS=50\nval SCE_HJ_STRINGEOL=51\nval SCE_HJ_REGEX=52\n# ASP Javascript\nval SCE_HJA_START=55\nval SCE_HJA_DEFAULT=56\nval SCE_HJA_COMMENT=57\nval SCE_HJA_COMMENTLINE=58\nval SCE_HJA_COMMENTDOC=59\nval SCE_HJA_NUMBER=60\nval SCE_HJA_WORD=61\nval SCE_HJA_KEYWORD=62\nval SCE_HJA_DOUBLESTRING=63\nval SCE_HJA_SINGLESTRING=64\nval SCE_HJA_SYMBOLS=65\nval SCE_HJA_STRINGEOL=66\nval SCE_HJA_REGEX=67\n# Embedded VBScript\nval SCE_HB_START=70\nval SCE_HB_DEFAULT=71\nval SCE_HB_COMMENTLINE=72\nval SCE_HB_NUMBER=73\nval SCE_HB_WORD=74\nval SCE_HB_STRING=75\nval SCE_HB_IDENTIFIER=76\nval SCE_HB_STRINGEOL=77\n# ASP VBScript\nval SCE_HBA_START=80\nval SCE_HBA_DEFAULT=81\nval SCE_HBA_COMMENTLINE=82\nval SCE_HBA_NUMBER=83\nval SCE_HBA_WORD=84\nval SCE_HBA_STRING=85\nval SCE_HBA_IDENTIFIER=86\nval SCE_HBA_STRINGEOL=87\n# Embedded Python\nval SCE_HP_START=90\nval SCE_HP_DEFAULT=91\nval SCE_HP_COMMENTLINE=92\nval SCE_HP_NUMBER=93\nval SCE_HP_STRING=94\nval SCE_HP_CHARACTER=95\nval SCE_HP_WORD=96\nval SCE_HP_TRIPLE=97\nval SCE_HP_TRIPLEDOUBLE=98\nval SCE_HP_CLASSNAME=99\nval SCE_HP_DEFNAME=100\nval SCE_HP_OPERATOR=101\nval SCE_HP_IDENTIFIER=102\n# PHP\nval SCE_HPHP_COMPLEX_VARIABLE=104\n# ASP Python\nval SCE_HPA_START=105\nval SCE_HPA_DEFAULT=106\nval SCE_HPA_COMMENTLINE=107\nval SCE_HPA_NUMBER=108\nval SCE_HPA_STRING=109\nval SCE_HPA_CHARACTER=110\nval SCE_HPA_WORD=111\nval SCE_HPA_TRIPLE=112\nval SCE_HPA_TRIPLEDOUBLE=113\nval SCE_HPA_CLASSNAME=114\nval SCE_HPA_DEFNAME=115\nval SCE_HPA_OPERATOR=116\nval SCE_HPA_IDENTIFIER=117\n# PHP\nval SCE_HPHP_DEFAULT=118\nval SCE_HPHP_HSTRING=119\nval SCE_HPHP_SIMPLESTRING=120\nval SCE_HPHP_WORD=121\nval SCE_HPHP_NUMBER=122\nval SCE_HPHP_VARIABLE=123\nval SCE_HPHP_COMMENT=124\nval SCE_HPHP_COMMENTLINE=125\nval SCE_HPHP_HSTRING_VARIABLE=126\nval SCE_HPHP_OPERATOR=127\n# Lexical states for SCLEX_PERL\nlex Perl=SCLEX_PERL SCE_PL_\nval SCE_PL_DEFAULT=0\nval SCE_PL_ERROR=1\nval SCE_PL_COMMENTLINE=2\nval SCE_PL_POD=3\nval SCE_PL_NUMBER=4\nval SCE_PL_WORD=5\nval SCE_PL_STRING=6\nval SCE_PL_CHARACTER=7\nval SCE_PL_PUNCTUATION=8\nval SCE_PL_PREPROCESSOR=9\nval SCE_PL_OPERATOR=10\nval SCE_PL_IDENTIFIER=11\nval SCE_PL_SCALAR=12\nval SCE_PL_ARRAY=13\nval SCE_PL_HASH=14\nval SCE_PL_SYMBOLTABLE=15\nval SCE_PL_VARIABLE_INDEXER=16\nval SCE_PL_REGEX=17\nval SCE_PL_REGSUBST=18\nval SCE_PL_LONGQUOTE=19\nval SCE_PL_BACKTICKS=20\nval SCE_PL_DATASECTION=21\nval SCE_PL_HERE_DELIM=22\nval SCE_PL_HERE_Q=23\nval SCE_PL_HERE_QQ=24\nval SCE_PL_HERE_QX=25\nval SCE_PL_STRING_Q=26\nval SCE_PL_STRING_QQ=27\nval SCE_PL_STRING_QX=28\nval SCE_PL_STRING_QR=29\nval SCE_PL_STRING_QW=30\nval SCE_PL_POD_VERB=31\nval SCE_PL_SUB_PROTOTYPE=40\nval SCE_PL_FORMAT_IDENT=41\nval SCE_PL_FORMAT=42\nval SCE_PL_STRING_VAR=43\nval SCE_PL_XLAT=44\nval SCE_PL_REGEX_VAR=54\nval SCE_PL_REGSUBST_VAR=55\nval SCE_PL_BACKTICKS_VAR=57\nval SCE_PL_HERE_QQ_VAR=61\nval SCE_PL_HERE_QX_VAR=62\nval SCE_PL_STRING_QQ_VAR=64\nval SCE_PL_STRING_QX_VAR=65\nval SCE_PL_STRING_QR_VAR=66\n# Lexical states for SCLEX_RUBY\nlex Ruby=SCLEX_RUBY SCE_RB_\nval SCE_RB_DEFAULT=0\nval SCE_RB_ERROR=1\nval SCE_RB_COMMENTLINE=2\nval SCE_RB_POD=3\nval SCE_RB_NUMBER=4\nval SCE_RB_WORD=5\nval SCE_RB_STRING=6\nval SCE_RB_CHARACTER=7\nval SCE_RB_CLASSNAME=8\nval SCE_RB_DEFNAME=9\nval SCE_RB_OPERATOR=10\nval SCE_RB_IDENTIFIER=11\nval SCE_RB_REGEX=12\nval SCE_RB_GLOBAL=13\nval SCE_RB_SYMBOL=14\nval SCE_RB_MODULE_NAME=15\nval SCE_RB_INSTANCE_VAR=16\nval SCE_RB_CLASS_VAR=17\nval SCE_RB_BACKTICKS=18\nval SCE_RB_DATASECTION=19\nval SCE_RB_HERE_DELIM=20\nval SCE_RB_HERE_Q=21\nval SCE_RB_HERE_QQ=22\nval SCE_RB_HERE_QX=23\nval SCE_RB_STRING_Q=24\nval SCE_RB_STRING_QQ=25\nval SCE_RB_STRING_QX=26\nval SCE_RB_STRING_QR=27\nval SCE_RB_STRING_QW=28\nval SCE_RB_WORD_DEMOTED=29\nval SCE_RB_STDIN=30\nval SCE_RB_STDOUT=31\nval SCE_RB_STDERR=40\nval SCE_RB_UPPER_BOUND=41\n# Lexical states for SCLEX_VB, SCLEX_VBSCRIPT, SCLEX_POWERBASIC\nlex VB=SCLEX_VB SCE_B_\nlex VBScript=SCLEX_VBSCRIPT SCE_B_\nlex PowerBasic=SCLEX_POWERBASIC SCE_B_\nval SCE_B_DEFAULT=0\nval SCE_B_COMMENT=1\nval SCE_B_NUMBER=2\nval SCE_B_KEYWORD=3\nval SCE_B_STRING=4\nval SCE_B_PREPROCESSOR=5\nval SCE_B_OPERATOR=6\nval SCE_B_IDENTIFIER=7\nval SCE_B_DATE=8\nval SCE_B_STRINGEOL=9\nval SCE_B_KEYWORD2=10\nval SCE_B_KEYWORD3=11\nval SCE_B_KEYWORD4=12\nval SCE_B_CONSTANT=13\nval SCE_B_ASM=14\nval SCE_B_LABEL=15\nval SCE_B_ERROR=16\nval SCE_B_HEXNUMBER=17\nval SCE_B_BINNUMBER=18\n# Lexical states for SCLEX_PROPERTIES\nlex Properties=SCLEX_PROPERTIES SCE_PROPS_\nval SCE_PROPS_DEFAULT=0\nval SCE_PROPS_COMMENT=1\nval SCE_PROPS_SECTION=2\nval SCE_PROPS_ASSIGNMENT=3\nval SCE_PROPS_DEFVAL=4\nval SCE_PROPS_KEY=5\n# Lexical states for SCLEX_LATEX\nlex LaTeX=SCLEX_LATEX SCE_L_\nval SCE_L_DEFAULT=0\nval SCE_L_COMMAND=1\nval SCE_L_TAG=2\nval SCE_L_MATH=3\nval SCE_L_COMMENT=4\nval SCE_L_TAG2=5\nval SCE_L_MATH2=6\nval SCE_L_COMMENT2=7\nval SCE_L_VERBATIM=8\nval SCE_L_SHORTCMD=9\nval SCE_L_SPECIAL=10\nval SCE_L_CMDOPT=11\nval SCE_L_ERROR=12\n# Lexical states for SCLEX_LUA\nlex Lua=SCLEX_LUA SCE_LUA_\nval SCE_LUA_DEFAULT=0\nval SCE_LUA_COMMENT=1\nval SCE_LUA_COMMENTLINE=2\nval SCE_LUA_COMMENTDOC=3\nval SCE_LUA_NUMBER=4\nval SCE_LUA_WORD=5\nval SCE_LUA_STRING=6\nval SCE_LUA_CHARACTER=7\nval SCE_LUA_LITERALSTRING=8\nval SCE_LUA_PREPROCESSOR=9\nval SCE_LUA_OPERATOR=10\nval SCE_LUA_IDENTIFIER=11\nval SCE_LUA_STRINGEOL=12\nval SCE_LUA_WORD2=13\nval SCE_LUA_WORD3=14\nval SCE_LUA_WORD4=15\nval SCE_LUA_WORD5=16\nval SCE_LUA_WORD6=17\nval SCE_LUA_WORD7=18\nval SCE_LUA_WORD8=19\nval SCE_LUA_LABEL=20\n# Lexical states for SCLEX_ERRORLIST\nlex ErrorList=SCLEX_ERRORLIST SCE_ERR_\nval SCE_ERR_DEFAULT=0\nval SCE_ERR_PYTHON=1\nval SCE_ERR_GCC=2\nval SCE_ERR_MS=3\nval SCE_ERR_CMD=4\nval SCE_ERR_BORLAND=5\nval SCE_ERR_PERL=6\nval SCE_ERR_NET=7\nval SCE_ERR_LUA=8\nval SCE_ERR_CTAG=9\nval SCE_ERR_DIFF_CHANGED=10\nval SCE_ERR_DIFF_ADDITION=11\nval SCE_ERR_DIFF_DELETION=12\nval SCE_ERR_DIFF_MESSAGE=13\nval SCE_ERR_PHP=14\nval SCE_ERR_ELF=15\nval SCE_ERR_IFC=16\nval SCE_ERR_IFORT=17\nval SCE_ERR_ABSF=18\nval SCE_ERR_TIDY=19\nval SCE_ERR_JAVA_STACK=20\nval SCE_ERR_VALUE=21\nval SCE_ERR_GCC_INCLUDED_FROM=22\n# Lexical states for SCLEX_BATCH\nlex Batch=SCLEX_BATCH SCE_BAT_\nval SCE_BAT_DEFAULT=0\nval SCE_BAT_COMMENT=1\nval SCE_BAT_WORD=2\nval SCE_BAT_LABEL=3\nval SCE_BAT_HIDE=4\nval SCE_BAT_COMMAND=5\nval SCE_BAT_IDENTIFIER=6\nval SCE_BAT_OPERATOR=7\n# Lexical states for SCLEX_TCMD\nlex TCMD=SCLEX_TCMD SCE_TCMD_\nval SCE_TCMD_DEFAULT=0\nval SCE_TCMD_COMMENT=1\nval SCE_TCMD_WORD=2\nval SCE_TCMD_LABEL=3\nval SCE_TCMD_HIDE=4\nval SCE_TCMD_COMMAND=5\nval SCE_TCMD_IDENTIFIER=6\nval SCE_TCMD_OPERATOR=7\nval SCE_TCMD_ENVIRONMENT=8\nval SCE_TCMD_EXPANSION=9\nval SCE_TCMD_CLABEL=10\n# Lexical states for SCLEX_MAKEFILE\nlex MakeFile=SCLEX_MAKEFILE SCE_MAKE_\nval SCE_MAKE_DEFAULT=0\nval SCE_MAKE_COMMENT=1\nval SCE_MAKE_PREPROCESSOR=2\nval SCE_MAKE_IDENTIFIER=3\nval SCE_MAKE_OPERATOR=4\nval SCE_MAKE_TARGET=5\nval SCE_MAKE_IDEOL=9\n# Lexical states for SCLEX_DIFF\nlex Diff=SCLEX_DIFF SCE_DIFF_\nval SCE_DIFF_DEFAULT=0\nval SCE_DIFF_COMMENT=1\nval SCE_DIFF_COMMAND=2\nval SCE_DIFF_HEADER=3\nval SCE_DIFF_POSITION=4\nval SCE_DIFF_DELETED=5\nval SCE_DIFF_ADDED=6\nval SCE_DIFF_CHANGED=7\n# Lexical states for SCLEX_CONF (Apache Configuration Files Lexer)\nlex Conf=SCLEX_CONF SCE_CONF_\nval SCE_CONF_DEFAULT=0\nval SCE_CONF_COMMENT=1\nval SCE_CONF_NUMBER=2\nval SCE_CONF_IDENTIFIER=3\nval SCE_CONF_EXTENSION=4\nval SCE_CONF_PARAMETER=5\nval SCE_CONF_STRING=6\nval SCE_CONF_OPERATOR=7\nval SCE_CONF_IP=8\nval SCE_CONF_DIRECTIVE=9\n# Lexical states for SCLEX_AVE, Avenue\nlex Avenue=SCLEX_AVE SCE_AVE_\nval SCE_AVE_DEFAULT=0\nval SCE_AVE_COMMENT=1\nval SCE_AVE_NUMBER=2\nval SCE_AVE_WORD=3\nval SCE_AVE_STRING=6\nval SCE_AVE_ENUM=7\nval SCE_AVE_STRINGEOL=8\nval SCE_AVE_IDENTIFIER=9\nval SCE_AVE_OPERATOR=10\nval SCE_AVE_WORD1=11\nval SCE_AVE_WORD2=12\nval SCE_AVE_WORD3=13\nval SCE_AVE_WORD4=14\nval SCE_AVE_WORD5=15\nval SCE_AVE_WORD6=16\n# Lexical states for SCLEX_ADA\nlex Ada=SCLEX_ADA SCE_ADA_\nval SCE_ADA_DEFAULT=0\nval SCE_ADA_WORD=1\nval SCE_ADA_IDENTIFIER=2\nval SCE_ADA_NUMBER=3\nval SCE_ADA_DELIMITER=4\nval SCE_ADA_CHARACTER=5\nval SCE_ADA_CHARACTEREOL=6\nval SCE_ADA_STRING=7\nval SCE_ADA_STRINGEOL=8\nval SCE_ADA_LABEL=9\nval SCE_ADA_COMMENTLINE=10\nval SCE_ADA_ILLEGAL=11\n# Lexical states for SCLEX_BAAN\nlex Baan=SCLEX_BAAN SCE_BAAN_\nval SCE_BAAN_DEFAULT=0\nval SCE_BAAN_COMMENT=1\nval SCE_BAAN_COMMENTDOC=2\nval SCE_BAAN_NUMBER=3\nval SCE_BAAN_WORD=4\nval SCE_BAAN_STRING=5\nval SCE_BAAN_PREPROCESSOR=6\nval SCE_BAAN_OPERATOR=7\nval SCE_BAAN_IDENTIFIER=8\nval SCE_BAAN_STRINGEOL=9\nval SCE_BAAN_WORD2=10\n# Lexical states for SCLEX_LISP\nlex Lisp=SCLEX_LISP SCE_LISP_\nval SCE_LISP_DEFAULT=0\nval SCE_LISP_COMMENT=1\nval SCE_LISP_NUMBER=2\nval SCE_LISP_KEYWORD=3\nval SCE_LISP_KEYWORD_KW=4\nval SCE_LISP_SYMBOL=5\nval SCE_LISP_STRING=6\nval SCE_LISP_STRINGEOL=8\nval SCE_LISP_IDENTIFIER=9\nval SCE_LISP_OPERATOR=10\nval SCE_LISP_SPECIAL=11\nval SCE_LISP_MULTI_COMMENT=12\n# Lexical states for SCLEX_EIFFEL and SCLEX_EIFFELKW\nlex Eiffel=SCLEX_EIFFEL SCE_EIFFEL_\nlex EiffelKW=SCLEX_EIFFELKW SCE_EIFFEL_\nval SCE_EIFFEL_DEFAULT=0\nval SCE_EIFFEL_COMMENTLINE=1\nval SCE_EIFFEL_NUMBER=2\nval SCE_EIFFEL_WORD=3\nval SCE_EIFFEL_STRING=4\nval SCE_EIFFEL_CHARACTER=5\nval SCE_EIFFEL_OPERATOR=6\nval SCE_EIFFEL_IDENTIFIER=7\nval SCE_EIFFEL_STRINGEOL=8\n# Lexical states for SCLEX_NNCRONTAB (nnCron crontab Lexer)\nlex NNCronTab=SCLEX_NNCRONTAB SCE_NNCRONTAB_\nval SCE_NNCRONTAB_DEFAULT=0\nval SCE_NNCRONTAB_COMMENT=1\nval SCE_NNCRONTAB_TASK=2\nval SCE_NNCRONTAB_SECTION=3\nval SCE_NNCRONTAB_KEYWORD=4\nval SCE_NNCRONTAB_MODIFIER=5\nval SCE_NNCRONTAB_ASTERISK=6\nval SCE_NNCRONTAB_NUMBER=7\nval SCE_NNCRONTAB_STRING=8\nval SCE_NNCRONTAB_ENVIRONMENT=9\nval SCE_NNCRONTAB_IDENTIFIER=10\n# Lexical states for SCLEX_FORTH (Forth Lexer)\nlex Forth=SCLEX_FORTH SCE_FORTH_\nval SCE_FORTH_DEFAULT=0\nval SCE_FORTH_COMMENT=1\nval SCE_FORTH_COMMENT_ML=2\nval SCE_FORTH_IDENTIFIER=3\nval SCE_FORTH_CONTROL=4\nval SCE_FORTH_KEYWORD=5\nval SCE_FORTH_DEFWORD=6\nval SCE_FORTH_PREWORD1=7\nval SCE_FORTH_PREWORD2=8\nval SCE_FORTH_NUMBER=9\nval SCE_FORTH_STRING=10\nval SCE_FORTH_LOCALE=11\n# Lexical states for SCLEX_MATLAB\nlex MatLab=SCLEX_MATLAB SCE_MATLAB_\nval SCE_MATLAB_DEFAULT=0\nval SCE_MATLAB_COMMENT=1\nval SCE_MATLAB_COMMAND=2\nval SCE_MATLAB_NUMBER=3\nval SCE_MATLAB_KEYWORD=4\n# single quoted string\nval SCE_MATLAB_STRING=5\nval SCE_MATLAB_OPERATOR=6\nval SCE_MATLAB_IDENTIFIER=7\nval SCE_MATLAB_DOUBLEQUOTESTRING=8\n# Lexical states for SCLEX_SCRIPTOL\nlex Sol=SCLEX_SCRIPTOL SCE_SCRIPTOL_\nval SCE_SCRIPTOL_DEFAULT=0\nval SCE_SCRIPTOL_WHITE=1\nval SCE_SCRIPTOL_COMMENTLINE=2\nval SCE_SCRIPTOL_PERSISTENT=3\nval SCE_SCRIPTOL_CSTYLE=4\nval SCE_SCRIPTOL_COMMENTBLOCK=5\nval SCE_SCRIPTOL_NUMBER=6\nval SCE_SCRIPTOL_STRING=7\nval SCE_SCRIPTOL_CHARACTER=8\nval SCE_SCRIPTOL_STRINGEOL=9\nval SCE_SCRIPTOL_KEYWORD=10\nval SCE_SCRIPTOL_OPERATOR=11\nval SCE_SCRIPTOL_IDENTIFIER=12\nval SCE_SCRIPTOL_TRIPLE=13\nval SCE_SCRIPTOL_CLASSNAME=14\nval SCE_SCRIPTOL_PREPROCESSOR=15\n# Lexical states for SCLEX_ASM\nlex Asm=SCLEX_ASM SCE_ASM_\nval SCE_ASM_DEFAULT=0\nval SCE_ASM_COMMENT=1\nval SCE_ASM_NUMBER=2\nval SCE_ASM_STRING=3\nval SCE_ASM_OPERATOR=4\nval SCE_ASM_IDENTIFIER=5\nval SCE_ASM_CPUINSTRUCTION=6\nval SCE_ASM_MATHINSTRUCTION=7\nval SCE_ASM_REGISTER=8\nval SCE_ASM_DIRECTIVE=9\nval SCE_ASM_DIRECTIVEOPERAND=10\nval SCE_ASM_COMMENTBLOCK=11\nval SCE_ASM_CHARACTER=12\nval SCE_ASM_STRINGEOL=13\nval SCE_ASM_EXTINSTRUCTION=14\nval SCE_ASM_COMMENTDIRECTIVE=15\n# Lexical states for SCLEX_FORTRAN\nlex Fortran=SCLEX_FORTRAN SCE_F_\nlex F77=SCLEX_F77 SCE_F_\nval SCE_F_DEFAULT=0\nval SCE_F_COMMENT=1\nval SCE_F_NUMBER=2\nval SCE_F_STRING1=3\nval SCE_F_STRING2=4\nval SCE_F_STRINGEOL=5\nval SCE_F_OPERATOR=6\nval SCE_F_IDENTIFIER=7\nval SCE_F_WORD=8\nval SCE_F_WORD2=9\nval SCE_F_WORD3=10\nval SCE_F_PREPROCESSOR=11\nval SCE_F_OPERATOR2=12\nval SCE_F_LABEL=13\nval SCE_F_CONTINUATION=14\n# Lexical states for SCLEX_CSS\nlex CSS=SCLEX_CSS SCE_CSS_\nval SCE_CSS_DEFAULT=0\nval SCE_CSS_TAG=1\nval SCE_CSS_CLASS=2\nval SCE_CSS_PSEUDOCLASS=3\nval SCE_CSS_UNKNOWN_PSEUDOCLASS=4\nval SCE_CSS_OPERATOR=5\nval SCE_CSS_IDENTIFIER=6\nval SCE_CSS_UNKNOWN_IDENTIFIER=7\nval SCE_CSS_VALUE=8\nval SCE_CSS_COMMENT=9\nval SCE_CSS_ID=10\nval SCE_CSS_IMPORTANT=11\nval SCE_CSS_DIRECTIVE=12\nval SCE_CSS_DOUBLESTRING=13\nval SCE_CSS_SINGLESTRING=14\nval SCE_CSS_IDENTIFIER2=15\nval SCE_CSS_ATTRIBUTE=16\nval SCE_CSS_IDENTIFIER3=17\nval SCE_CSS_PSEUDOELEMENT=18\nval SCE_CSS_EXTENDED_IDENTIFIER=19\nval SCE_CSS_EXTENDED_PSEUDOCLASS=20\nval SCE_CSS_EXTENDED_PSEUDOELEMENT=21\nval SCE_CSS_MEDIA=22\nval SCE_CSS_VARIABLE=23\n# Lexical states for SCLEX_POV\nlex POV=SCLEX_POV SCE_POV_\nval SCE_POV_DEFAULT=0\nval SCE_POV_COMMENT=1\nval SCE_POV_COMMENTLINE=2\nval SCE_POV_NUMBER=3\nval SCE_POV_OPERATOR=4\nval SCE_POV_IDENTIFIER=5\nval SCE_POV_STRING=6\nval SCE_POV_STRINGEOL=7\nval SCE_POV_DIRECTIVE=8\nval SCE_POV_BADDIRECTIVE=9\nval SCE_POV_WORD2=10\nval SCE_POV_WORD3=11\nval SCE_POV_WORD4=12\nval SCE_POV_WORD5=13\nval SCE_POV_WORD6=14\nval SCE_POV_WORD7=15\nval SCE_POV_WORD8=16\n# Lexical states for SCLEX_LOUT\nlex LOUT=SCLEX_LOUT SCE_LOUT_\nval SCE_LOUT_DEFAULT=0\nval SCE_LOUT_COMMENT=1\nval SCE_LOUT_NUMBER=2\nval SCE_LOUT_WORD=3\nval SCE_LOUT_WORD2=4\nval SCE_LOUT_WORD3=5\nval SCE_LOUT_WORD4=6\nval SCE_LOUT_STRING=7\nval SCE_LOUT_OPERATOR=8\nval SCE_LOUT_IDENTIFIER=9\nval SCE_LOUT_STRINGEOL=10\n# Lexical states for SCLEX_ESCRIPT\nlex ESCRIPT=SCLEX_ESCRIPT SCE_ESCRIPT_\nval SCE_ESCRIPT_DEFAULT=0\nval SCE_ESCRIPT_COMMENT=1\nval SCE_ESCRIPT_COMMENTLINE=2\nval SCE_ESCRIPT_COMMENTDOC=3\nval SCE_ESCRIPT_NUMBER=4\nval SCE_ESCRIPT_WORD=5\nval SCE_ESCRIPT_STRING=6\nval SCE_ESCRIPT_OPERATOR=7\nval SCE_ESCRIPT_IDENTIFIER=8\nval SCE_ESCRIPT_BRACE=9\nval SCE_ESCRIPT_WORD2=10\nval SCE_ESCRIPT_WORD3=11\n# Lexical states for SCLEX_PS\nlex PS=SCLEX_PS SCE_PS_\nval SCE_PS_DEFAULT=0\nval SCE_PS_COMMENT=1\nval SCE_PS_DSC_COMMENT=2\nval SCE_PS_DSC_VALUE=3\nval SCE_PS_NUMBER=4\nval SCE_PS_NAME=5\nval SCE_PS_KEYWORD=6\nval SCE_PS_LITERAL=7\nval SCE_PS_IMMEVAL=8\nval SCE_PS_PAREN_ARRAY=9\nval SCE_PS_PAREN_DICT=10\nval SCE_PS_PAREN_PROC=11\nval SCE_PS_TEXT=12\nval SCE_PS_HEXSTRING=13\nval SCE_PS_BASE85STRING=14\nval SCE_PS_BADSTRINGCHAR=15\n# Lexical states for SCLEX_NSIS\nlex NSIS=SCLEX_NSIS SCE_NSIS_\nval SCE_NSIS_DEFAULT=0\nval SCE_NSIS_COMMENT=1\nval SCE_NSIS_STRINGDQ=2\nval SCE_NSIS_STRINGLQ=3\nval SCE_NSIS_STRINGRQ=4\nval SCE_NSIS_FUNCTION=5\nval SCE_NSIS_VARIABLE=6\nval SCE_NSIS_LABEL=7\nval SCE_NSIS_USERDEFINED=8\nval SCE_NSIS_SECTIONDEF=9\nval SCE_NSIS_SUBSECTIONDEF=10\nval SCE_NSIS_IFDEFINEDEF=11\nval SCE_NSIS_MACRODEF=12\nval SCE_NSIS_STRINGVAR=13\nval SCE_NSIS_NUMBER=14\nval SCE_NSIS_SECTIONGROUP=15\nval SCE_NSIS_PAGEEX=16\nval SCE_NSIS_FUNCTIONDEF=17\nval SCE_NSIS_COMMENTBOX=18\n# Lexical states for SCLEX_MMIXAL\nlex MMIXAL=SCLEX_MMIXAL SCE_MMIXAL_\nval SCE_MMIXAL_LEADWS=0\nval SCE_MMIXAL_COMMENT=1\nval SCE_MMIXAL_LABEL=2\nval SCE_MMIXAL_OPCODE=3\nval SCE_MMIXAL_OPCODE_PRE=4\nval SCE_MMIXAL_OPCODE_VALID=5\nval SCE_MMIXAL_OPCODE_UNKNOWN=6\nval SCE_MMIXAL_OPCODE_POST=7\nval SCE_MMIXAL_OPERANDS=8\nval SCE_MMIXAL_NUMBER=9\nval SCE_MMIXAL_REF=10\nval SCE_MMIXAL_CHAR=11\nval SCE_MMIXAL_STRING=12\nval SCE_MMIXAL_REGISTER=13\nval SCE_MMIXAL_HEX=14\nval SCE_MMIXAL_OPERATOR=15\nval SCE_MMIXAL_SYMBOL=16\nval SCE_MMIXAL_INCLUDE=17\n# Lexical states for SCLEX_CLW\nlex Clarion=SCLEX_CLW SCE_CLW_\nval SCE_CLW_DEFAULT=0\nval SCE_CLW_LABEL=1\nval SCE_CLW_COMMENT=2\nval SCE_CLW_STRING=3\nval SCE_CLW_USER_IDENTIFIER=4\nval SCE_CLW_INTEGER_CONSTANT=5\nval SCE_CLW_REAL_CONSTANT=6\nval SCE_CLW_PICTURE_STRING=7\nval SCE_CLW_KEYWORD=8\nval SCE_CLW_COMPILER_DIRECTIVE=9\nval SCE_CLW_RUNTIME_EXPRESSIONS=10\nval SCE_CLW_BUILTIN_PROCEDURES_FUNCTION=11\nval SCE_CLW_STRUCTURE_DATA_TYPE=12\nval SCE_CLW_ATTRIBUTE=13\nval SCE_CLW_STANDARD_EQUATE=14\nval SCE_CLW_ERROR=15\nval SCE_CLW_DEPRECATED=16\n# Lexical states for SCLEX_LOT\nlex LOT=SCLEX_LOT SCE_LOT_\nval SCE_LOT_DEFAULT=0\nval SCE_LOT_HEADER=1\nval SCE_LOT_BREAK=2\nval SCE_LOT_SET=3\nval SCE_LOT_PASS=4\nval SCE_LOT_FAIL=5\nval SCE_LOT_ABORT=6\n# Lexical states for SCLEX_YAML\nlex YAML=SCLEX_YAML SCE_YAML_\nval SCE_YAML_DEFAULT=0\nval SCE_YAML_COMMENT=1\nval SCE_YAML_IDENTIFIER=2\nval SCE_YAML_KEYWORD=3\nval SCE_YAML_NUMBER=4\nval SCE_YAML_REFERENCE=5\nval SCE_YAML_DOCUMENT=6\nval SCE_YAML_TEXT=7\nval SCE_YAML_ERROR=8\nval SCE_YAML_OPERATOR=9\n# Lexical states for SCLEX_TEX\nlex TeX=SCLEX_TEX SCE_TEX_\nval SCE_TEX_DEFAULT=0\nval SCE_TEX_SPECIAL=1\nval SCE_TEX_GROUP=2\nval SCE_TEX_SYMBOL=3\nval SCE_TEX_COMMAND=4\nval SCE_TEX_TEXT=5\nlex Metapost=SCLEX_METAPOST SCE_METAPOST_\nval SCE_METAPOST_DEFAULT=0\nval SCE_METAPOST_SPECIAL=1\nval SCE_METAPOST_GROUP=2\nval SCE_METAPOST_SYMBOL=3\nval SCE_METAPOST_COMMAND=4\nval SCE_METAPOST_TEXT=5\nval SCE_METAPOST_EXTRA=6\n# Lexical states for SCLEX_ERLANG\nlex Erlang=SCLEX_ERLANG SCE_ERLANG_\nval SCE_ERLANG_DEFAULT=0\nval SCE_ERLANG_COMMENT=1\nval SCE_ERLANG_VARIABLE=2\nval SCE_ERLANG_NUMBER=3\nval SCE_ERLANG_KEYWORD=4\nval SCE_ERLANG_STRING=5\nval SCE_ERLANG_OPERATOR=6\nval SCE_ERLANG_ATOM=7\nval SCE_ERLANG_FUNCTION_NAME=8\nval SCE_ERLANG_CHARACTER=9\nval SCE_ERLANG_MACRO=10\nval SCE_ERLANG_RECORD=11\nval SCE_ERLANG_PREPROC=12\nval SCE_ERLANG_NODE_NAME=13\nval SCE_ERLANG_COMMENT_FUNCTION=14\nval SCE_ERLANG_COMMENT_MODULE=15\nval SCE_ERLANG_COMMENT_DOC=16\nval SCE_ERLANG_COMMENT_DOC_MACRO=17\nval SCE_ERLANG_ATOM_QUOTED=18\nval SCE_ERLANG_MACRO_QUOTED=19\nval SCE_ERLANG_RECORD_QUOTED=20\nval SCE_ERLANG_NODE_NAME_QUOTED=21\nval SCE_ERLANG_BIFS=22\nval SCE_ERLANG_MODULES=23\nval SCE_ERLANG_MODULES_ATT=24\nval SCE_ERLANG_UNKNOWN=31\n# Lexical states for SCLEX_OCTAVE are identical to MatLab\nlex Octave=SCLEX_OCTAVE SCE_MATLAB_\n# Lexical states for SCLEX_MSSQL\nlex MSSQL=SCLEX_MSSQL SCE_MSSQL_\nval SCE_MSSQL_DEFAULT=0\nval SCE_MSSQL_COMMENT=1\nval SCE_MSSQL_LINE_COMMENT=2\nval SCE_MSSQL_NUMBER=3\nval SCE_MSSQL_STRING=4\nval SCE_MSSQL_OPERATOR=5\nval SCE_MSSQL_IDENTIFIER=6\nval SCE_MSSQL_VARIABLE=7\nval SCE_MSSQL_COLUMN_NAME=8\nval SCE_MSSQL_STATEMENT=9\nval SCE_MSSQL_DATATYPE=10\nval SCE_MSSQL_SYSTABLE=11\nval SCE_MSSQL_GLOBAL_VARIABLE=12\nval SCE_MSSQL_FUNCTION=13\nval SCE_MSSQL_STORED_PROCEDURE=14\nval SCE_MSSQL_DEFAULT_PREF_DATATYPE=15\nval SCE_MSSQL_COLUMN_NAME_2=16\n# Lexical states for SCLEX_VERILOG\nlex Verilog=SCLEX_VERILOG SCE_V_\nval SCE_V_DEFAULT=0\nval SCE_V_COMMENT=1\nval SCE_V_COMMENTLINE=2\nval SCE_V_COMMENTLINEBANG=3\nval SCE_V_NUMBER=4\nval SCE_V_WORD=5\nval SCE_V_STRING=6\nval SCE_V_WORD2=7\nval SCE_V_WORD3=8\nval SCE_V_PREPROCESSOR=9\nval SCE_V_OPERATOR=10\nval SCE_V_IDENTIFIER=11\nval SCE_V_STRINGEOL=12\nval SCE_V_USER=19\n# Lexical states for SCLEX_KIX\nlex Kix=SCLEX_KIX SCE_KIX_\nval SCE_KIX_DEFAULT=0\nval SCE_KIX_COMMENT=1\nval SCE_KIX_STRING1=2\nval SCE_KIX_STRING2=3\nval SCE_KIX_NUMBER=4\nval SCE_KIX_VAR=5\nval SCE_KIX_MACRO=6\nval SCE_KIX_KEYWORD=7\nval SCE_KIX_FUNCTIONS=8\nval SCE_KIX_OPERATOR=9\nval SCE_KIX_IDENTIFIER=31\n# Lexical states for SCLEX_GUI4CLI\nlex Gui4Cli=SCLEX_GUI4CLI SCE_GC_\nval SCE_GC_DEFAULT=0\nval SCE_GC_COMMENTLINE=1\nval SCE_GC_COMMENTBLOCK=2\nval SCE_GC_GLOBAL=3\nval SCE_GC_EVENT=4\nval SCE_GC_ATTRIBUTE=5\nval SCE_GC_CONTROL=6\nval SCE_GC_COMMAND=7\nval SCE_GC_STRING=8\nval SCE_GC_OPERATOR=9\n# Lexical states for SCLEX_SPECMAN\nlex Specman=SCLEX_SPECMAN SCE_SN_\nval SCE_SN_DEFAULT=0\nval SCE_SN_CODE=1\nval SCE_SN_COMMENTLINE=2\nval SCE_SN_COMMENTLINEBANG=3\nval SCE_SN_NUMBER=4\nval SCE_SN_WORD=5\nval SCE_SN_STRING=6\nval SCE_SN_WORD2=7\nval SCE_SN_WORD3=8\nval SCE_SN_PREPROCESSOR=9\nval SCE_SN_OPERATOR=10\nval SCE_SN_IDENTIFIER=11\nval SCE_SN_STRINGEOL=12\nval SCE_SN_REGEXTAG=13\nval SCE_SN_SIGNAL=14\nval SCE_SN_USER=19\n# Lexical states for SCLEX_AU3\nlex Au3=SCLEX_AU3 SCE_AU3_\nval SCE_AU3_DEFAULT=0\nval SCE_AU3_COMMENT=1\nval SCE_AU3_COMMENTBLOCK=2\nval SCE_AU3_NUMBER=3\nval SCE_AU3_FUNCTION=4\nval SCE_AU3_KEYWORD=5\nval SCE_AU3_MACRO=6\nval SCE_AU3_STRING=7\nval SCE_AU3_OPERATOR=8\nval SCE_AU3_VARIABLE=9\nval SCE_AU3_SENT=10\nval SCE_AU3_PREPROCESSOR=11\nval SCE_AU3_SPECIAL=12\nval SCE_AU3_EXPAND=13\nval SCE_AU3_COMOBJ=14\nval SCE_AU3_UDF=15\n# Lexical states for SCLEX_APDL\nlex APDL=SCLEX_APDL SCE_APDL_\nval SCE_APDL_DEFAULT=0\nval SCE_APDL_COMMENT=1\nval SCE_APDL_COMMENTBLOCK=2\nval SCE_APDL_NUMBER=3\nval SCE_APDL_STRING=4\nval SCE_APDL_OPERATOR=5\nval SCE_APDL_WORD=6\nval SCE_APDL_PROCESSOR=7\nval SCE_APDL_COMMAND=8\nval SCE_APDL_SLASHCOMMAND=9\nval SCE_APDL_STARCOMMAND=10\nval SCE_APDL_ARGUMENT=11\nval SCE_APDL_FUNCTION=12\n# Lexical states for SCLEX_BASH\nlex Bash=SCLEX_BASH SCE_SH_\nval SCE_SH_DEFAULT=0\nval SCE_SH_ERROR=1\nval SCE_SH_COMMENTLINE=2\nval SCE_SH_NUMBER=3\nval SCE_SH_WORD=4\nval SCE_SH_STRING=5\nval SCE_SH_CHARACTER=6\nval SCE_SH_OPERATOR=7\nval SCE_SH_IDENTIFIER=8\nval SCE_SH_SCALAR=9\nval SCE_SH_PARAM=10\nval SCE_SH_BACKTICKS=11\nval SCE_SH_HERE_DELIM=12\nval SCE_SH_HERE_Q=13\n# Lexical states for SCLEX_ASN1\nlex Asn1=SCLEX_ASN1 SCE_ASN1_\nval SCE_ASN1_DEFAULT=0\nval SCE_ASN1_COMMENT=1\nval SCE_ASN1_IDENTIFIER=2\nval SCE_ASN1_STRING=3\nval SCE_ASN1_OID=4\nval SCE_ASN1_SCALAR=5\nval SCE_ASN1_KEYWORD=6\nval SCE_ASN1_ATTRIBUTE=7\nval SCE_ASN1_DESCRIPTOR=8\nval SCE_ASN1_TYPE=9\nval SCE_ASN1_OPERATOR=10\n# Lexical states for SCLEX_VHDL\nlex VHDL=SCLEX_VHDL SCE_VHDL_\nval SCE_VHDL_DEFAULT=0\nval SCE_VHDL_COMMENT=1\nval SCE_VHDL_COMMENTLINEBANG=2\nval SCE_VHDL_NUMBER=3\nval SCE_VHDL_STRING=4\nval SCE_VHDL_OPERATOR=5\nval SCE_VHDL_IDENTIFIER=6\nval SCE_VHDL_STRINGEOL=7\nval SCE_VHDL_KEYWORD=8\nval SCE_VHDL_STDOPERATOR=9\nval SCE_VHDL_ATTRIBUTE=10\nval SCE_VHDL_STDFUNCTION=11\nval SCE_VHDL_STDPACKAGE=12\nval SCE_VHDL_STDTYPE=13\nval SCE_VHDL_USERWORD=14\n# Lexical states for SCLEX_CAML\nlex Caml=SCLEX_CAML SCE_CAML_\nval SCE_CAML_DEFAULT=0\nval SCE_CAML_IDENTIFIER=1\nval SCE_CAML_TAGNAME=2\nval SCE_CAML_KEYWORD=3\nval SCE_CAML_KEYWORD2=4\nval SCE_CAML_KEYWORD3=5\nval SCE_CAML_LINENUM=6\nval SCE_CAML_OPERATOR=7\nval SCE_CAML_NUMBER=8\nval SCE_CAML_CHAR=9\nval SCE_CAML_WHITE=10\nval SCE_CAML_STRING=11\nval SCE_CAML_COMMENT=12\nval SCE_CAML_COMMENT1=13\nval SCE_CAML_COMMENT2=14\nval SCE_CAML_COMMENT3=15\n# Lexical states for SCLEX_HASKELL\nlex Haskell=SCLEX_HASKELL SCE_HA_\nval SCE_HA_DEFAULT=0\nval SCE_HA_IDENTIFIER=1\nval SCE_HA_KEYWORD=2\nval SCE_HA_NUMBER=3\nval SCE_HA_STRING=4\nval SCE_HA_CHARACTER=5\nval SCE_HA_CLASS=6\nval SCE_HA_MODULE=7\nval SCE_HA_CAPITAL=8\nval SCE_HA_DATA=9\nval SCE_HA_IMPORT=10\nval SCE_HA_OPERATOR=11\nval SCE_HA_INSTANCE=12\nval SCE_HA_COMMENTLINE=13\nval SCE_HA_COMMENTBLOCK=14\nval SCE_HA_COMMENTBLOCK2=15\nval SCE_HA_COMMENTBLOCK3=16\nval SCE_HA_PRAGMA=17\nval SCE_HA_PREPROCESSOR=18\nval SCE_HA_STRINGEOL=19\nval SCE_HA_RESERVED_OPERATOR=20\nval SCE_HA_LITERATE_COMMENT=21\nval SCE_HA_LITERATE_CODEDELIM=22\n# Lexical states of SCLEX_TADS3\nlex TADS3=SCLEX_TADS3 SCE_T3_\nval SCE_T3_DEFAULT=0\nval SCE_T3_X_DEFAULT=1\nval SCE_T3_PREPROCESSOR=2\nval SCE_T3_BLOCK_COMMENT=3\nval SCE_T3_LINE_COMMENT=4\nval SCE_T3_OPERATOR=5\nval SCE_T3_KEYWORD=6\nval SCE_T3_NUMBER=7\nval SCE_T3_IDENTIFIER=8\nval SCE_T3_S_STRING=9\nval SCE_T3_D_STRING=10\nval SCE_T3_X_STRING=11\nval SCE_T3_LIB_DIRECTIVE=12\nval SCE_T3_MSG_PARAM=13\nval SCE_T3_HTML_TAG=14\nval SCE_T3_HTML_DEFAULT=15\nval SCE_T3_HTML_STRING=16\nval SCE_T3_USER1=17\nval SCE_T3_USER2=18\nval SCE_T3_USER3=19\nval SCE_T3_BRACE=20\n# Lexical states for SCLEX_REBOL\nlex Rebol=SCLEX_REBOL SCE_REBOL_\nval SCE_REBOL_DEFAULT=0\nval SCE_REBOL_COMMENTLINE=1\nval SCE_REBOL_COMMENTBLOCK=2\nval SCE_REBOL_PREFACE=3\nval SCE_REBOL_OPERATOR=4\nval SCE_REBOL_CHARACTER=5\nval SCE_REBOL_QUOTEDSTRING=6\nval SCE_REBOL_BRACEDSTRING=7\nval SCE_REBOL_NUMBER=8\nval SCE_REBOL_PAIR=9\nval SCE_REBOL_TUPLE=10\nval SCE_REBOL_BINARY=11\nval SCE_REBOL_MONEY=12\nval SCE_REBOL_ISSUE=13\nval SCE_REBOL_TAG=14\nval SCE_REBOL_FILE=15\nval SCE_REBOL_EMAIL=16\nval SCE_REBOL_URL=17\nval SCE_REBOL_DATE=18\nval SCE_REBOL_TIME=19\nval SCE_REBOL_IDENTIFIER=20\nval SCE_REBOL_WORD=21\nval SCE_REBOL_WORD2=22\nval SCE_REBOL_WORD3=23\nval SCE_REBOL_WORD4=24\nval SCE_REBOL_WORD5=25\nval SCE_REBOL_WORD6=26\nval SCE_REBOL_WORD7=27\nval SCE_REBOL_WORD8=28\n# Lexical states for SCLEX_SQL\nlex SQL=SCLEX_SQL SCE_SQL_\nval SCE_SQL_DEFAULT=0\nval SCE_SQL_COMMENT=1\nval SCE_SQL_COMMENTLINE=2\nval SCE_SQL_COMMENTDOC=3\nval SCE_SQL_NUMBER=4\nval SCE_SQL_WORD=5\nval SCE_SQL_STRING=6\nval SCE_SQL_CHARACTER=7\nval SCE_SQL_SQLPLUS=8\nval SCE_SQL_SQLPLUS_PROMPT=9\nval SCE_SQL_OPERATOR=10\nval SCE_SQL_IDENTIFIER=11\nval SCE_SQL_SQLPLUS_COMMENT=13\nval SCE_SQL_COMMENTLINEDOC=15\nval SCE_SQL_WORD2=16\nval SCE_SQL_COMMENTDOCKEYWORD=17\nval SCE_SQL_COMMENTDOCKEYWORDERROR=18\nval SCE_SQL_USER1=19\nval SCE_SQL_USER2=20\nval SCE_SQL_USER3=21\nval SCE_SQL_USER4=22\nval SCE_SQL_QUOTEDIDENTIFIER=23\n# Lexical states for SCLEX_SMALLTALK\nlex Smalltalk=SCLEX_SMALLTALK SCE_ST_\nval SCE_ST_DEFAULT=0\nval SCE_ST_STRING=1\nval SCE_ST_NUMBER=2\nval SCE_ST_COMMENT=3\nval SCE_ST_SYMBOL=4\nval SCE_ST_BINARY=5\nval SCE_ST_BOOL=6\nval SCE_ST_SELF=7\nval SCE_ST_SUPER=8\nval SCE_ST_NIL=9\nval SCE_ST_GLOBAL=10\nval SCE_ST_RETURN=11\nval SCE_ST_SPECIAL=12\nval SCE_ST_KWSEND=13\nval SCE_ST_ASSIGN=14\nval SCE_ST_CHARACTER=15\nval SCE_ST_SPEC_SEL=16\n# Lexical states for SCLEX_FLAGSHIP (clipper)\nlex FlagShip=SCLEX_FLAGSHIP SCE_FS_\nval SCE_FS_DEFAULT=0\nval SCE_FS_COMMENT=1\nval SCE_FS_COMMENTLINE=2\nval SCE_FS_COMMENTDOC=3\nval SCE_FS_COMMENTLINEDOC=4\nval SCE_FS_COMMENTDOCKEYWORD=5\nval SCE_FS_COMMENTDOCKEYWORDERROR=6\nval SCE_FS_KEYWORD=7\nval SCE_FS_KEYWORD2=8\nval SCE_FS_KEYWORD3=9\nval SCE_FS_KEYWORD4=10\nval SCE_FS_NUMBER=11\nval SCE_FS_STRING=12\nval SCE_FS_PREPROCESSOR=13\nval SCE_FS_OPERATOR=14\nval SCE_FS_IDENTIFIER=15\nval SCE_FS_DATE=16\nval SCE_FS_STRINGEOL=17\nval SCE_FS_CONSTANT=18\nval SCE_FS_WORDOPERATOR=19\nval SCE_FS_DISABLEDCODE=20\nval SCE_FS_DEFAULT_C=21\nval SCE_FS_COMMENTDOC_C=22\nval SCE_FS_COMMENTLINEDOC_C=23\nval SCE_FS_KEYWORD_C=24\nval SCE_FS_KEYWORD2_C=25\nval SCE_FS_NUMBER_C=26\nval SCE_FS_STRING_C=27\nval SCE_FS_PREPROCESSOR_C=28\nval SCE_FS_OPERATOR_C=29\nval SCE_FS_IDENTIFIER_C=30\nval SCE_FS_STRINGEOL_C=31\n# Lexical states for SCLEX_CSOUND\nlex Csound=SCLEX_CSOUND SCE_CSOUND_\nval SCE_CSOUND_DEFAULT=0\nval SCE_CSOUND_COMMENT=1\nval SCE_CSOUND_NUMBER=2\nval SCE_CSOUND_OPERATOR=3\nval SCE_CSOUND_INSTR=4\nval SCE_CSOUND_IDENTIFIER=5\nval SCE_CSOUND_OPCODE=6\nval SCE_CSOUND_HEADERSTMT=7\nval SCE_CSOUND_USERKEYWORD=8\nval SCE_CSOUND_COMMENTBLOCK=9\nval SCE_CSOUND_PARAM=10\nval SCE_CSOUND_ARATE_VAR=11\nval SCE_CSOUND_KRATE_VAR=12\nval SCE_CSOUND_IRATE_VAR=13\nval SCE_CSOUND_GLOBAL_VAR=14\nval SCE_CSOUND_STRINGEOL=15\n# Lexical states for SCLEX_INNOSETUP\nlex Inno=SCLEX_INNOSETUP SCE_INNO_\nval SCE_INNO_DEFAULT=0\nval SCE_INNO_COMMENT=1\nval SCE_INNO_KEYWORD=2\nval SCE_INNO_PARAMETER=3\nval SCE_INNO_SECTION=4\nval SCE_INNO_PREPROC=5\nval SCE_INNO_INLINE_EXPANSION=6\nval SCE_INNO_COMMENT_PASCAL=7\nval SCE_INNO_KEYWORD_PASCAL=8\nval SCE_INNO_KEYWORD_USER=9\nval SCE_INNO_STRING_DOUBLE=10\nval SCE_INNO_STRING_SINGLE=11\nval SCE_INNO_IDENTIFIER=12\n# Lexical states for SCLEX_OPAL\nlex Opal=SCLEX_OPAL SCE_OPAL_\nval SCE_OPAL_SPACE=0\nval SCE_OPAL_COMMENT_BLOCK=1\nval SCE_OPAL_COMMENT_LINE=2\nval SCE_OPAL_INTEGER=3\nval SCE_OPAL_KEYWORD=4\nval SCE_OPAL_SORT=5\nval SCE_OPAL_STRING=6\nval SCE_OPAL_PAR=7\nval SCE_OPAL_BOOL_CONST=8\nval SCE_OPAL_DEFAULT=32\n# Lexical states for SCLEX_SPICE\nlex Spice=SCLEX_SPICE SCE_SPICE_\nval SCE_SPICE_DEFAULT=0\nval SCE_SPICE_IDENTIFIER=1\nval SCE_SPICE_KEYWORD=2\nval SCE_SPICE_KEYWORD2=3\nval SCE_SPICE_KEYWORD3=4\nval SCE_SPICE_NUMBER=5\nval SCE_SPICE_DELIMITER=6\nval SCE_SPICE_VALUE=7\nval SCE_SPICE_COMMENTLINE=8\n# Lexical states for SCLEX_CMAKE\nlex CMAKE=SCLEX_CMAKE SCE_CMAKE_\nval SCE_CMAKE_DEFAULT=0\nval SCE_CMAKE_COMMENT=1\nval SCE_CMAKE_STRINGDQ=2\nval SCE_CMAKE_STRINGLQ=3\nval SCE_CMAKE_STRINGRQ=4\nval SCE_CMAKE_COMMANDS=5\nval SCE_CMAKE_PARAMETERS=6\nval SCE_CMAKE_VARIABLE=7\nval SCE_CMAKE_USERDEFINED=8\nval SCE_CMAKE_WHILEDEF=9\nval SCE_CMAKE_FOREACHDEF=10\nval SCE_CMAKE_IFDEFINEDEF=11\nval SCE_CMAKE_MACRODEF=12\nval SCE_CMAKE_STRINGVAR=13\nval SCE_CMAKE_NUMBER=14\n# Lexical states for SCLEX_GAP\nlex Gap=SCLEX_GAP SCE_GAP_\nval SCE_GAP_DEFAULT=0\nval SCE_GAP_IDENTIFIER=1\nval SCE_GAP_KEYWORD=2\nval SCE_GAP_KEYWORD2=3\nval SCE_GAP_KEYWORD3=4\nval SCE_GAP_KEYWORD4=5\nval SCE_GAP_STRING=6\nval SCE_GAP_CHAR=7\nval SCE_GAP_OPERATOR=8\nval SCE_GAP_COMMENT=9\nval SCE_GAP_NUMBER=10\nval SCE_GAP_STRINGEOL=11\n# Lexical state for SCLEX_PLM\nlex PLM=SCLEX_PLM SCE_PLM_\nval SCE_PLM_DEFAULT=0\nval SCE_PLM_COMMENT=1\nval SCE_PLM_STRING=2\nval SCE_PLM_NUMBER=3\nval SCE_PLM_IDENTIFIER=4\nval SCE_PLM_OPERATOR=5\nval SCE_PLM_CONTROL=6\nval SCE_PLM_KEYWORD=7\n# Lexical state for SCLEX_PROGRESS\nlex Progress=SCLEX_PROGRESS SCE_4GL_\nval SCE_4GL_DEFAULT=0\nval SCE_4GL_NUMBER=1\nval SCE_4GL_WORD=2\nval SCE_4GL_STRING=3\nval SCE_4GL_CHARACTER=4\nval SCE_4GL_PREPROCESSOR=5\nval SCE_4GL_OPERATOR=6\nval SCE_4GL_IDENTIFIER=7\nval SCE_4GL_BLOCK=8\nval SCE_4GL_END=9\nval SCE_4GL_COMMENT1=10\nval SCE_4GL_COMMENT2=11\nval SCE_4GL_COMMENT3=12\nval SCE_4GL_COMMENT4=13\nval SCE_4GL_COMMENT5=14\nval SCE_4GL_COMMENT6=15\nval SCE_4GL_DEFAULT_=16\nval SCE_4GL_NUMBER_=17\nval SCE_4GL_WORD_=18\nval SCE_4GL_STRING_=19\nval SCE_4GL_CHARACTER_=20\nval SCE_4GL_PREPROCESSOR_=21\nval SCE_4GL_OPERATOR_=22\nval SCE_4GL_IDENTIFIER_=23\nval SCE_4GL_BLOCK_=24\nval SCE_4GL_END_=25\nval SCE_4GL_COMMENT1_=26\nval SCE_4GL_COMMENT2_=27\nval SCE_4GL_COMMENT3_=28\nval SCE_4GL_COMMENT4_=29\nval SCE_4GL_COMMENT5_=30\nval SCE_4GL_COMMENT6_=31\n# Lexical states for SCLEX_ABAQUS\nlex ABAQUS=SCLEX_ABAQUS SCE_ABAQUS_\nval SCE_ABAQUS_DEFAULT=0\nval SCE_ABAQUS_COMMENT=1\nval SCE_ABAQUS_COMMENTBLOCK=2\nval SCE_ABAQUS_NUMBER=3\nval SCE_ABAQUS_STRING=4\nval SCE_ABAQUS_OPERATOR=5\nval SCE_ABAQUS_WORD=6\nval SCE_ABAQUS_PROCESSOR=7\nval SCE_ABAQUS_COMMAND=8\nval SCE_ABAQUS_SLASHCOMMAND=9\nval SCE_ABAQUS_STARCOMMAND=10\nval SCE_ABAQUS_ARGUMENT=11\nval SCE_ABAQUS_FUNCTION=12\n# Lexical states for SCLEX_ASYMPTOTE\nlex Asymptote=SCLEX_ASYMPTOTE SCE_ASY_\nval SCE_ASY_DEFAULT=0\nval SCE_ASY_COMMENT=1\nval SCE_ASY_COMMENTLINE=2\nval SCE_ASY_NUMBER=3\nval SCE_ASY_WORD=4\nval SCE_ASY_STRING=5\nval SCE_ASY_CHARACTER=6\nval SCE_ASY_OPERATOR=7\nval SCE_ASY_IDENTIFIER=8\nval SCE_ASY_STRINGEOL=9\nval SCE_ASY_COMMENTLINEDOC=10\nval SCE_ASY_WORD2=11\n# Lexical states for SCLEX_R\nlex R=SCLEX_R SCE_R_\nval SCE_R_DEFAULT=0\nval SCE_R_COMMENT=1\nval SCE_R_KWORD=2\nval SCE_R_BASEKWORD=3\nval SCE_R_OTHERKWORD=4\nval SCE_R_NUMBER=5\nval SCE_R_STRING=6\nval SCE_R_STRING2=7\nval SCE_R_OPERATOR=8\nval SCE_R_IDENTIFIER=9\nval SCE_R_INFIX=10\nval SCE_R_INFIXEOL=11\n# Lexical state for SCLEX_MAGIKSF\nlex MagikSF=SCLEX_MAGIKSF SCE_MAGIK_\nval SCE_MAGIK_DEFAULT=0\nval SCE_MAGIK_COMMENT=1\nval SCE_MAGIK_HYPER_COMMENT=16\nval SCE_MAGIK_STRING=2\nval SCE_MAGIK_CHARACTER=3\nval SCE_MAGIK_NUMBER=4\nval SCE_MAGIK_IDENTIFIER=5\nval SCE_MAGIK_OPERATOR=6\nval SCE_MAGIK_FLOW=7\nval SCE_MAGIK_CONTAINER=8\nval SCE_MAGIK_BRACKET_BLOCK=9\nval SCE_MAGIK_BRACE_BLOCK=10\nval SCE_MAGIK_SQBRACKET_BLOCK=11\nval SCE_MAGIK_UNKNOWN_KEYWORD=12\nval SCE_MAGIK_KEYWORD=13\nval SCE_MAGIK_PRAGMA=14\nval SCE_MAGIK_SYMBOL=15\n# Lexical state for SCLEX_POWERSHELL\nlex PowerShell=SCLEX_POWERSHELL SCE_POWERSHELL_\nval SCE_POWERSHELL_DEFAULT=0\nval SCE_POWERSHELL_COMMENT=1\nval SCE_POWERSHELL_STRING=2\nval SCE_POWERSHELL_CHARACTER=3\nval SCE_POWERSHELL_NUMBER=4\nval SCE_POWERSHELL_VARIABLE=5\nval SCE_POWERSHELL_OPERATOR=6\nval SCE_POWERSHELL_IDENTIFIER=7\nval SCE_POWERSHELL_KEYWORD=8\nval SCE_POWERSHELL_CMDLET=9\nval SCE_POWERSHELL_ALIAS=10\nval SCE_POWERSHELL_FUNCTION=11\nval SCE_POWERSHELL_USER1=12\nval SCE_POWERSHELL_COMMENTSTREAM=13\nval SCE_POWERSHELL_HERE_STRING=14\nval SCE_POWERSHELL_HERE_CHARACTER=15\nval SCE_POWERSHELL_COMMENTDOCKEYWORD=16\n# Lexical state for SCLEX_MYSQL\nlex MySQL=SCLEX_MYSQL SCE_MYSQL_\nval SCE_MYSQL_DEFAULT=0\nval SCE_MYSQL_COMMENT=1\nval SCE_MYSQL_COMMENTLINE=2\nval SCE_MYSQL_VARIABLE=3\nval SCE_MYSQL_SYSTEMVARIABLE=4\nval SCE_MYSQL_KNOWNSYSTEMVARIABLE=5\nval SCE_MYSQL_NUMBER=6\nval SCE_MYSQL_MAJORKEYWORD=7\nval SCE_MYSQL_KEYWORD=8\nval SCE_MYSQL_DATABASEOBJECT=9\nval SCE_MYSQL_PROCEDUREKEYWORD=10\nval SCE_MYSQL_STRING=11\nval SCE_MYSQL_SQSTRING=12\nval SCE_MYSQL_DQSTRING=13\nval SCE_MYSQL_OPERATOR=14\nval SCE_MYSQL_FUNCTION=15\nval SCE_MYSQL_IDENTIFIER=16\nval SCE_MYSQL_QUOTEDIDENTIFIER=17\nval SCE_MYSQL_USER1=18\nval SCE_MYSQL_USER2=19\nval SCE_MYSQL_USER3=20\nval SCE_MYSQL_HIDDENCOMMAND=21\nval SCE_MYSQL_PLACEHOLDER=22\n# Lexical state for SCLEX_PO\nlex Po=SCLEX_PO SCE_PO_\nval SCE_PO_DEFAULT=0\nval SCE_PO_COMMENT=1\nval SCE_PO_MSGID=2\nval SCE_PO_MSGID_TEXT=3\nval SCE_PO_MSGSTR=4\nval SCE_PO_MSGSTR_TEXT=5\nval SCE_PO_MSGCTXT=6\nval SCE_PO_MSGCTXT_TEXT=7\nval SCE_PO_FUZZY=8\nval SCE_PO_PROGRAMMER_COMMENT=9\nval SCE_PO_REFERENCE=10\nval SCE_PO_FLAGS=11\nval SCE_PO_MSGID_TEXT_EOL=12\nval SCE_PO_MSGSTR_TEXT_EOL=13\nval SCE_PO_MSGCTXT_TEXT_EOL=14\nval SCE_PO_ERROR=15\n# Lexical states for SCLEX_PASCAL\nlex Pascal=SCLEX_PASCAL SCE_PAS_\nval SCE_PAS_DEFAULT=0\nval SCE_PAS_IDENTIFIER=1\nval SCE_PAS_COMMENT=2\nval SCE_PAS_COMMENT2=3\nval SCE_PAS_COMMENTLINE=4\nval SCE_PAS_PREPROCESSOR=5\nval SCE_PAS_PREPROCESSOR2=6\nval SCE_PAS_NUMBER=7\nval SCE_PAS_HEXNUMBER=8\nval SCE_PAS_WORD=9\nval SCE_PAS_STRING=10\nval SCE_PAS_STRINGEOL=11\nval SCE_PAS_CHARACTER=12\nval SCE_PAS_OPERATOR=13\nval SCE_PAS_ASM=14\n# Lexical state for SCLEX_SORCUS\nlex SORCUS=SCLEX_SORCUS SCE_SORCUS_\nval SCE_SORCUS_DEFAULT=0\nval SCE_SORCUS_COMMAND=1\nval SCE_SORCUS_PARAMETER=2\nval SCE_SORCUS_COMMENTLINE=3\nval SCE_SORCUS_STRING=4\nval SCE_SORCUS_STRINGEOL=5\nval SCE_SORCUS_IDENTIFIER=6\nval SCE_SORCUS_OPERATOR=7\nval SCE_SORCUS_NUMBER=8\nval SCE_SORCUS_CONSTANT=9\n# Lexical state for SCLEX_POWERPRO\nlex PowerPro=SCLEX_POWERPRO SCE_POWERPRO_\nval SCE_POWERPRO_DEFAULT=0\nval SCE_POWERPRO_COMMENTBLOCK=1\nval SCE_POWERPRO_COMMENTLINE=2\nval SCE_POWERPRO_NUMBER=3\nval SCE_POWERPRO_WORD=4\nval SCE_POWERPRO_WORD2=5\nval SCE_POWERPRO_WORD3=6\nval SCE_POWERPRO_WORD4=7\nval SCE_POWERPRO_DOUBLEQUOTEDSTRING=8\nval SCE_POWERPRO_SINGLEQUOTEDSTRING=9\nval SCE_POWERPRO_LINECONTINUE=10\nval SCE_POWERPRO_OPERATOR=11\nval SCE_POWERPRO_IDENTIFIER=12\nval SCE_POWERPRO_STRINGEOL=13\nval SCE_POWERPRO_VERBATIM=14\nval SCE_POWERPRO_ALTQUOTE=15\nval SCE_POWERPRO_FUNCTION=16\n# Lexical states for SCLEX_SML\nlex SML=SCLEX_SML SCE_SML_\nval SCE_SML_DEFAULT=0\nval SCE_SML_IDENTIFIER=1\nval SCE_SML_TAGNAME=2\nval SCE_SML_KEYWORD=3\nval SCE_SML_KEYWORD2=4\nval SCE_SML_KEYWORD3=5\nval SCE_SML_LINENUM=6\nval SCE_SML_OPERATOR=7\nval SCE_SML_NUMBER=8\nval SCE_SML_CHAR=9\nval SCE_SML_STRING=11\nval SCE_SML_COMMENT=12\nval SCE_SML_COMMENT1=13\nval SCE_SML_COMMENT2=14\nval SCE_SML_COMMENT3=15\n# Lexical state for SCLEX_MARKDOWN\nlex Markdown=SCLEX_MARKDOWN SCE_MARKDOWN_\nval SCE_MARKDOWN_DEFAULT=0\nval SCE_MARKDOWN_LINE_BEGIN=1\nval SCE_MARKDOWN_STRONG1=2\nval SCE_MARKDOWN_STRONG2=3\nval SCE_MARKDOWN_EM1=4\nval SCE_MARKDOWN_EM2=5\nval SCE_MARKDOWN_HEADER1=6\nval SCE_MARKDOWN_HEADER2=7\nval SCE_MARKDOWN_HEADER3=8\nval SCE_MARKDOWN_HEADER4=9\nval SCE_MARKDOWN_HEADER5=10\nval SCE_MARKDOWN_HEADER6=11\nval SCE_MARKDOWN_PRECHAR=12\nval SCE_MARKDOWN_ULIST_ITEM=13\nval SCE_MARKDOWN_OLIST_ITEM=14\nval SCE_MARKDOWN_BLOCKQUOTE=15\nval SCE_MARKDOWN_STRIKEOUT=16\nval SCE_MARKDOWN_HRULE=17\nval SCE_MARKDOWN_LINK=18\nval SCE_MARKDOWN_CODE=19\nval SCE_MARKDOWN_CODE2=20\nval SCE_MARKDOWN_CODEBK=21\n# Lexical state for SCLEX_TXT2TAGS\nlex Txt2tags=SCLEX_TXT2TAGS SCE_TXT2TAGS_\nval SCE_TXT2TAGS_DEFAULT=0\nval SCE_TXT2TAGS_LINE_BEGIN=1\nval SCE_TXT2TAGS_STRONG1=2\nval SCE_TXT2TAGS_STRONG2=3\nval SCE_TXT2TAGS_EM1=4\nval SCE_TXT2TAGS_EM2=5\nval SCE_TXT2TAGS_HEADER1=6\nval SCE_TXT2TAGS_HEADER2=7\nval SCE_TXT2TAGS_HEADER3=8\nval SCE_TXT2TAGS_HEADER4=9\nval SCE_TXT2TAGS_HEADER5=10\nval SCE_TXT2TAGS_HEADER6=11\nval SCE_TXT2TAGS_PRECHAR=12\nval SCE_TXT2TAGS_ULIST_ITEM=13\nval SCE_TXT2TAGS_OLIST_ITEM=14\nval SCE_TXT2TAGS_BLOCKQUOTE=15\nval SCE_TXT2TAGS_STRIKEOUT=16\nval SCE_TXT2TAGS_HRULE=17\nval SCE_TXT2TAGS_LINK=18\nval SCE_TXT2TAGS_CODE=19\nval SCE_TXT2TAGS_CODE2=20\nval SCE_TXT2TAGS_CODEBK=21\nval SCE_TXT2TAGS_COMMENT=22\nval SCE_TXT2TAGS_OPTION=23\nval SCE_TXT2TAGS_PREPROC=24\nval SCE_TXT2TAGS_POSTPROC=25\n# Lexical states for SCLEX_A68K\nlex A68k=SCLEX_A68K SCE_A68K_\nval SCE_A68K_DEFAULT=0\nval SCE_A68K_COMMENT=1\nval SCE_A68K_NUMBER_DEC=2\nval SCE_A68K_NUMBER_BIN=3\nval SCE_A68K_NUMBER_HEX=4\nval SCE_A68K_STRING1=5\nval SCE_A68K_OPERATOR=6\nval SCE_A68K_CPUINSTRUCTION=7\nval SCE_A68K_EXTINSTRUCTION=8\nval SCE_A68K_REGISTER=9\nval SCE_A68K_DIRECTIVE=10\nval SCE_A68K_MACRO_ARG=11\nval SCE_A68K_LABEL=12\nval SCE_A68K_STRING2=13\nval SCE_A68K_IDENTIFIER=14\nval SCE_A68K_MACRO_DECLARATION=15\nval SCE_A68K_COMMENT_WORD=16\nval SCE_A68K_COMMENT_SPECIAL=17\nval SCE_A68K_COMMENT_DOXYGEN=18\n# Lexical states for SCLEX_MODULA\nlex Modula=SCLEX_MODULA SCE_MODULA_\nval SCE_MODULA_DEFAULT=0\nval SCE_MODULA_COMMENT=1\nval SCE_MODULA_DOXYCOMM=2\nval SCE_MODULA_DOXYKEY=3\nval SCE_MODULA_KEYWORD=4\nval SCE_MODULA_RESERVED=5\nval SCE_MODULA_NUMBER=6\nval SCE_MODULA_BASENUM=7\nval SCE_MODULA_FLOAT=8\nval SCE_MODULA_STRING=9\nval SCE_MODULA_STRSPEC=10\nval SCE_MODULA_CHAR=11\nval SCE_MODULA_CHARSPEC=12\nval SCE_MODULA_PROC=13\nval SCE_MODULA_PRAGMA=14\nval SCE_MODULA_PRGKEY=15\nval SCE_MODULA_OPERATOR=16\nval SCE_MODULA_BADSTR=17\n# Lexical states for SCLEX_COFFEESCRIPT\nlex CoffeeScript=SCLEX_COFFEESCRIPT SCE_COFFEESCRIPT_\nval SCE_COFFEESCRIPT_DEFAULT=0\nval SCE_COFFEESCRIPT_COMMENT=1\nval SCE_COFFEESCRIPT_COMMENTLINE=2\nval SCE_COFFEESCRIPT_COMMENTDOC=3\nval SCE_COFFEESCRIPT_NUMBER=4\nval SCE_COFFEESCRIPT_WORD=5\nval SCE_COFFEESCRIPT_STRING=6\nval SCE_COFFEESCRIPT_CHARACTER=7\nval SCE_COFFEESCRIPT_UUID=8\nval SCE_COFFEESCRIPT_PREPROCESSOR=9\nval SCE_COFFEESCRIPT_OPERATOR=10\nval SCE_COFFEESCRIPT_IDENTIFIER=11\nval SCE_COFFEESCRIPT_STRINGEOL=12\nval SCE_COFFEESCRIPT_VERBATIM=13\nval SCE_COFFEESCRIPT_REGEX=14\nval SCE_COFFEESCRIPT_COMMENTLINEDOC=15\nval SCE_COFFEESCRIPT_WORD2=16\nval SCE_COFFEESCRIPT_COMMENTDOCKEYWORD=17\nval SCE_COFFEESCRIPT_COMMENTDOCKEYWORDERROR=18\nval SCE_COFFEESCRIPT_GLOBALCLASS=19\nval SCE_COFFEESCRIPT_STRINGRAW=20\nval SCE_COFFEESCRIPT_TRIPLEVERBATIM=21\nval SCE_COFFEESCRIPT_HASHQUOTEDSTRING=22\nval SCE_COFFEESCRIPT_COMMENTBLOCK=22\nval SCE_COFFEESCRIPT_VERBOSE_REGEX=23\nval SCE_COFFEESCRIPT_VERBOSE_REGEX_COMMENT=24\n# Lexical states for SCLEX_AVS\nlex AVS=SCLEX_AVS SCE_AVS_\nval SCE_AVS_DEFAULT=0\nval SCE_AVS_COMMENTBLOCK=1\nval SCE_AVS_COMMENTBLOCKN=2\nval SCE_AVS_COMMENTLINE=3\nval SCE_AVS_NUMBER=4\nval SCE_AVS_OPERATOR=5\nval SCE_AVS_IDENTIFIER=6\nval SCE_AVS_STRING=7\nval SCE_AVS_TRIPLESTRING=8\nval SCE_AVS_KEYWORD=9\nval SCE_AVS_FILTER=10\nval SCE_AVS_PLUGIN=11\nval SCE_AVS_FUNCTION=12\nval SCE_AVS_CLIPPROP=13\nval SCE_AVS_USERDFN=14\n# Lexical states for SCLEX_ECL\nlex ECL=SCLEX_ECL SCE_ECL_\nval SCE_ECL_DEFAULT=0\nval SCE_ECL_COMMENT=1\nval SCE_ECL_COMMENTLINE=2\nval SCE_ECL_NUMBER=3\nval SCE_ECL_STRING=4\nval SCE_ECL_WORD0=5\nval SCE_ECL_OPERATOR=6\nval SCE_ECL_CHARACTER=7\nval SCE_ECL_UUID=8\nval SCE_ECL_PREPROCESSOR=9\nval SCE_ECL_UNKNOWN=10\nval SCE_ECL_IDENTIFIER=11\nval SCE_ECL_STRINGEOL=12\nval SCE_ECL_VERBATIM=13\nval SCE_ECL_REGEX=14\nval SCE_ECL_COMMENTLINEDOC=15\nval SCE_ECL_WORD1=16\nval SCE_ECL_COMMENTDOCKEYWORD=17\nval SCE_ECL_COMMENTDOCKEYWORDERROR=18\nval SCE_ECL_WORD2=19\nval SCE_ECL_WORD3=20\nval SCE_ECL_WORD4=21\nval SCE_ECL_WORD5=22\nval SCE_ECL_COMMENTDOC=23\nval SCE_ECL_ADDED=24\nval SCE_ECL_DELETED=25\nval SCE_ECL_CHANGED=26\nval SCE_ECL_MOVED=27\n# Lexical states for SCLEX_OSCRIPT\nlex OScript=SCLEX_OSCRIPT SCE_OSCRIPT_\nval SCE_OSCRIPT_DEFAULT=0\nval SCE_OSCRIPT_LINE_COMMENT=1\nval SCE_OSCRIPT_BLOCK_COMMENT=2\nval SCE_OSCRIPT_DOC_COMMENT=3\nval SCE_OSCRIPT_PREPROCESSOR=4\nval SCE_OSCRIPT_NUMBER=5\nval SCE_OSCRIPT_SINGLEQUOTE_STRING=6\nval SCE_OSCRIPT_DOUBLEQUOTE_STRING=7\nval SCE_OSCRIPT_CONSTANT=8\nval SCE_OSCRIPT_IDENTIFIER=9\nval SCE_OSCRIPT_GLOBAL=10\nval SCE_OSCRIPT_KEYWORD=11\nval SCE_OSCRIPT_OPERATOR=12\nval SCE_OSCRIPT_LABEL=13\nval SCE_OSCRIPT_TYPE=14\nval SCE_OSCRIPT_FUNCTION=15\nval SCE_OSCRIPT_OBJECT=16\nval SCE_OSCRIPT_PROPERTY=17\nval SCE_OSCRIPT_METHOD=18\n# Lexical states for SCLEX_VISUALPROLOG\nlex VisualProlog=SCLEX_VISUALPROLOG SCE_VISUALPROLOG_\nval SCE_VISUALPROLOG_DEFAULT=0\nval SCE_VISUALPROLOG_KEY_MAJOR=1\nval SCE_VISUALPROLOG_KEY_MINOR=2\nval SCE_VISUALPROLOG_KEY_DIRECTIVE=3\nval SCE_VISUALPROLOG_COMMENT_BLOCK=4\nval SCE_VISUALPROLOG_COMMENT_LINE=5\nval SCE_VISUALPROLOG_COMMENT_KEY=6\nval SCE_VISUALPROLOG_COMMENT_KEY_ERROR=7\nval SCE_VISUALPROLOG_IDENTIFIER=8\nval SCE_VISUALPROLOG_VARIABLE=9\nval SCE_VISUALPROLOG_ANONYMOUS=10\nval SCE_VISUALPROLOG_NUMBER=11\nval SCE_VISUALPROLOG_OPERATOR=12\nval SCE_VISUALPROLOG_CHARACTER=13\nval SCE_VISUALPROLOG_CHARACTER_TOO_MANY=14\nval SCE_VISUALPROLOG_CHARACTER_ESCAPE_ERROR=15\nval SCE_VISUALPROLOG_STRING=16\nval SCE_VISUALPROLOG_STRING_ESCAPE=17\nval SCE_VISUALPROLOG_STRING_ESCAPE_ERROR=18\nval SCE_VISUALPROLOG_STRING_EOL_OPEN=19\nval SCE_VISUALPROLOG_STRING_VERBATIM=20\nval SCE_VISUALPROLOG_STRING_VERBATIM_SPECIAL=21\nval SCE_VISUALPROLOG_STRING_VERBATIM_EOL=22\n# Lexical states for SCLEX_STTXT\nlex StructuredText=SCLEX_STTXT SCE_STTXT_\nval SCE_STTXT_DEFAULT=0\nval SCE_STTXT_COMMENT=1\nval SCE_STTXT_COMMENTLINE=2\nval SCE_STTXT_KEYWORD=3\nval SCE_STTXT_TYPE=4\nval SCE_STTXT_FUNCTION=5\nval SCE_STTXT_FB=6\nval SCE_STTXT_NUMBER=7\nval SCE_STTXT_HEXNUMBER=8\nval SCE_STTXT_PRAGMA=9\nval SCE_STTXT_OPERATOR=10\nval SCE_STTXT_CHARACTER=11\nval SCE_STTXT_STRING1=12\nval SCE_STTXT_STRING2=13\nval SCE_STTXT_STRINGEOL=14\nval SCE_STTXT_IDENTIFIER=15\nval SCE_STTXT_DATETIME=16\nval SCE_STTXT_VARS=17\nval SCE_STTXT_PRAGMAS=18\n# Lexical states for SCLEX_KVIRC\nlex KVIrc=SCLEX_KVIRC SCLEX_KVIRC_\nval SCE_KVIRC_DEFAULT=0\nval SCE_KVIRC_COMMENT=1\nval SCE_KVIRC_COMMENTBLOCK=2\nval SCE_KVIRC_STRING=3\nval SCE_KVIRC_WORD=4\nval SCE_KVIRC_KEYWORD=5\nval SCE_KVIRC_FUNCTION_KEYWORD=6\nval SCE_KVIRC_FUNCTION=7\nval SCE_KVIRC_VARIABLE=8\nval SCE_KVIRC_NUMBER=9\nval SCE_KVIRC_OPERATOR=10\nval SCE_KVIRC_STRING_FUNCTION=11\nval SCE_KVIRC_STRING_VARIABLE=12\n# Lexical states for SCLEX_RUST\nlex Rust=SCLEX_RUST SCE_RUST_\nval SCE_RUST_DEFAULT=0\nval SCE_RUST_COMMENTBLOCK=1\nval SCE_RUST_COMMENTLINE=2\nval SCE_RUST_COMMENTBLOCKDOC=3\nval SCE_RUST_COMMENTLINEDOC=4\nval SCE_RUST_NUMBER=5\nval SCE_RUST_WORD=6\nval SCE_RUST_WORD2=7\nval SCE_RUST_WORD3=8\nval SCE_RUST_WORD4=9\nval SCE_RUST_WORD5=10\nval SCE_RUST_WORD6=11\nval SCE_RUST_WORD7=12\nval SCE_RUST_STRING=13\nval SCE_RUST_STRINGR=14\nval SCE_RUST_CHARACTER=15\nval SCE_RUST_OPERATOR=16\nval SCE_RUST_IDENTIFIER=17\nval SCE_RUST_LIFETIME=18\nval SCE_RUST_MACRO=19\nval SCE_RUST_LEXERROR=20\n\n# Events\n\nevt void StyleNeeded=2000(int position)\nevt void CharAdded=2001(int ch)\nevt void SavePointReached=2002(void)\nevt void SavePointLeft=2003(void)\nevt void ModifyAttemptRO=2004(void)\n# GTK+ Specific to work around focus and accelerator problems:\nevt void Key=2005(int ch, int modifiers)\nevt void DoubleClick=2006(int modifiers, int position, int line)\nevt void UpdateUI=2007(int updated)\nevt void Modified=2008(int position, int modificationType, string text, int length, int linesAdded, int line, int foldLevelNow, int foldLevelPrev, int token, int annotationLinesAdded)\nevt void MacroRecord=2009(int message, int wParam, int lParam)\nevt void MarginClick=2010(int modifiers, int position, int margin)\nevt void NeedShown=2011(int position, int length)\nevt void Painted=2013(void)\nevt void UserListSelection=2014(int listType, string text, int position)\nevt void URIDropped=2015(string text)\nevt void DwellStart=2016(int position, int x, int y)\nevt void DwellEnd=2017(int position, int x, int y)\nevt void Zoom=2018(void)\nevt void HotSpotClick=2019(int modifiers, int position)\nevt void HotSpotDoubleClick=2020(int modifiers, int position)\nevt void CallTipClick=2021(int position)\nevt void AutoCSelection=2022(string text, int position)\nevt void IndicatorClick=2023(int modifiers, int position)\nevt void IndicatorRelease=2024(int modifiers, int position)\nevt void AutoCCancelled=2025(void)\nevt void AutoCCharDeleted=2026(void)\nevt void HotSpotReleaseClick=2027(int modifiers, int position)\nevt void FocusIn=2028(void)\nevt void FocusOut=2029(void)\n\ncat Provisional\n\n# Line end types which may be used in addition to LF, CR, and CRLF\n# SC_LINE_END_TYPE_UNICODE includes U+2028 Line Separator,\n# U+2029 Paragraph Separator, and U+0085 Next Line\nenu LineEndType=SC_LINE_END_TYPE_\nval SC_LINE_END_TYPE_DEFAULT=0\nval SC_LINE_END_TYPE_UNICODE=1\n\n# Set the line end types that the application wants to use. May not be used if incompatible with lexer or encoding.\nset void SetLineEndTypesAllowed=2656(int lineEndBitSet,)\n\n# Get the line end types currently allowed.\nget int GetLineEndTypesAllowed=2657(,)\n\n# Get the line end types currently recognised. May be a subset of the allowed types due to lexer limitation.\nget int GetLineEndTypesActive=2658(,)\n\n# Bit set of LineEndType enumertion for which line ends beyond the standard\n# LF, CR, and CRLF are supported by the lexer.\nget int GetLineEndTypesSupported=4018(,)\n\n# Allocate a set of sub styles for a particular base style, returning start of range\nfun int AllocateSubStyles=4020(int styleBase, int numberStyles)\n\n# The starting style number for the sub styles associated with a base style\nget int GetSubStylesStart=4021(int styleBase,)\n\n# The number of sub styles associated with a base style\nget int GetSubStylesLength=4022(int styleBase,)\n\n# For a sub style, return the base style, else return the argument.\nget int GetStyleFromSubStyle=4027(int subStyle,)\n\n# For a secondary style, return the primary style, else return the argument.\nget int GetPrimaryStyleFromStyle=4028(int style,)\n\n# Free allocated sub styles\nfun void FreeSubStyles=4023(,)\n\n# Set the identifiers that are shown in a particular style\nset void SetIdentifiers=4024(int style, string identifiers)\n\n# Where styles are duplicated by a feature such as active/inactive code\n# return the distance between the two types.\nget int DistanceToSecondaryStyles=4025(,)\n\n# Get the set of base styles that can be extended with sub styles\nget int GetSubStyleBases=4026(, stringresult styles)\n\ncat Deprecated\n\n# Deprecated in 2.21\n# The SC_CP_DBCS value can be used to indicate a DBCS mode for GTK+.\nval SC_CP_DBCS=1\n\n# Deprecated in 2.30\n\n# In palette mode?\nget bool GetUsePalette=2139(,)\n\n# In palette mode, Scintilla uses the environment's palette calls to display\n# more colours. This may lead to ugly displays.\nset void SetUsePalette=2039(bool usePalette,)\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/include/ScintillaWidget.h",
    "content": "/* Scintilla source code edit control */\n/** @file ScintillaWidget.h\n ** Definition of Scintilla widget for GTK+.\n ** Only needed by GTK+ code but is harmless on other platforms.\n **/\n/* Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n * The License.txt file describes the conditions under which this software may be distributed. */\n\n#ifndef SCINTILLAWIDGET_H\n#define SCINTILLAWIDGET_H\n\n#if defined(GTK)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define SCINTILLA(obj)          G_TYPE_CHECK_INSTANCE_CAST (obj, scintilla_get_type (), ScintillaObject)\n#define SCINTILLA_CLASS(klass)  G_TYPE_CHECK_CLASS_CAST (klass, scintilla_get_type (), ScintillaClass)\n#define IS_SCINTILLA(obj)       G_TYPE_CHECK_INSTANCE_TYPE (obj, scintilla_get_type ())\n\ntypedef struct _ScintillaObject ScintillaObject;\ntypedef struct _ScintillaClass  ScintillaClass;\n\nstruct _ScintillaObject {\n\tGtkContainer cont;\n\tvoid *pscin;\n};\n\nstruct _ScintillaClass {\n\tGtkContainerClass parent_class;\n\n\tvoid (* command) (ScintillaObject *ttt);\n\tvoid (* notify) (ScintillaObject *ttt);\n};\n\nGType\t\tscintilla_get_type\t(void);\nGtkWidget*\tscintilla_new\t\t(void);\nvoid\t\tscintilla_set_id\t(ScintillaObject *sci, uptr_t id);\nsptr_t\t\tscintilla_send_message\t(ScintillaObject *sci,unsigned int iMessage, uptr_t wParam, sptr_t lParam);\nvoid\t\tscintilla_release_resources(void);\n\n#define SCINTILLA_NOTIFY \"sci-notify\"\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexA68k.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexA68k.cxx\n ** Lexer for Assembler, just for the MASM syntax\n ** Written by Martial Demolins AKA Folco\n **/\n// Copyright 2010 Martial Demolins <mdemolins(a)gmail.com>\n// The License.txt file describes the conditions under which this software\n// may be distributed.\n\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n\n// Return values for GetOperatorType\n#define NO_OPERATOR     0\n#define OPERATOR_1CHAR  1\n#define OPERATOR_2CHAR  2\n\n\n/**\n *  IsIdentifierStart\n *\n *  Return true if the given char is a valid identifier first char\n */\n\nstatic inline bool IsIdentifierStart (const int ch)\n{\n    return (isalpha(ch) || (ch == '_') || (ch == '\\\\'));\n}\n\n\n/**\n *  IsIdentifierChar\n *\n *  Return true if the given char is a valid identifier char\n */\n\nstatic inline bool IsIdentifierChar (const int ch)\n{\n    return (isalnum(ch) || (ch == '_') || (ch == '@') || (ch == ':') || (ch == '.'));\n}\n\n\n/**\n *  GetOperatorType\n *\n *  Return:\n *  NO_OPERATOR     if char is not an operator\n *  OPERATOR_1CHAR  if the operator is one char long\n *  OPERATOR_2CHAR  if the operator is two chars long\n */\n\nstatic inline int GetOperatorType (const int ch1, const int ch2)\n{\n    int OpType = NO_OPERATOR;\n\n    if ((ch1 == '+') || (ch1 == '-') || (ch1 == '*') || (ch1 == '/') || (ch1 == '#') ||\n        (ch1 == '(') || (ch1 == ')') || (ch1 == '~') || (ch1 == '&') || (ch1 == '|') || (ch1 == ','))\n        OpType = OPERATOR_1CHAR;\n\n    else if ((ch1 == ch2) && (ch1 == '<' || ch1 == '>'))\n        OpType = OPERATOR_2CHAR;\n\n    return OpType;\n}\n\n\n/**\n *  IsBin\n *\n *  Return true if the given char is 0 or 1\n */\n\nstatic inline bool IsBin (const int ch)\n{\n    return (ch == '0') || (ch == '1');\n}\n\n\n/**\n *  IsDoxygenChar\n *\n *  Return true if the char may be part of a Doxygen keyword\n */\n\nstatic inline bool IsDoxygenChar (const int ch)\n{\n    return isalpha(ch) || (ch == '$') || (ch == '[') || (ch == ']') || (ch == '{') || (ch == '}');\n}\n\n\n/**\n *  ColouriseA68kDoc\n *\n *  Main function, which colourises a 68k source\n */\n\nstatic void ColouriseA68kDoc (unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler)\n{\n    // Used to buffer a string, to be able to compare it using built-in functions \n    char Buffer[100]; \n \n \n    // Used to know the length of an operator \n    int OpType; \n \n\n    // Get references to keywords lists\n    WordList &cpuInstruction = *keywordlists[0];\n    WordList &registers = *keywordlists[1];\n    WordList &directive = *keywordlists[2];\n    WordList &extInstruction = *keywordlists[3];\n    WordList &alert          = *keywordlists[4]; \n    WordList &doxygenKeyword = *keywordlists[5];\n\n\n    // Instanciate a context for our source\n    StyleContext sc(startPos, length, initStyle, styler);\n\n\n    /************************************************************\n    *\n    *   Parse the source \n    *\n    ************************************************************/\n\n    for ( ; sc.More(); sc.Forward())\n    {\n        /************************************************************ \n        * \n        *   A style always terminates at the end of a line, even for \n        *   comments (no multi-lines comments) \n        * \n        ************************************************************/ \n        if (sc.atLineStart) { \n            sc.SetState(SCE_A68K_DEFAULT);\n        } \n\n\n        /************************************************************\n        *\n        *   If we are not in \"default style\", check if the style continues \n        *   In this case, we just have to loop \n        *\n        ************************************************************/\n\n        if (sc.state != SCE_A68K_DEFAULT)\n        {\n            if (   ((sc.state == SCE_A68K_NUMBER_DEC)        && isdigit(sc.ch))                      // Decimal number \n                || ((sc.state == SCE_A68K_NUMBER_BIN) && IsBin(sc.ch))                                      // Binary number\n                || ((sc.state == SCE_A68K_NUMBER_HEX) && isxdigit(sc.ch))                                   // Hexa number\n                || ((sc.state == SCE_A68K_MACRO_ARG)         && isdigit(sc.ch))                      // Macro argument \n                || ((sc.state == SCE_A68K_STRING1)    && (sc.ch != '\\''))                                   // String single-quoted\n                || ((sc.state == SCE_A68K_STRING2)    && (sc.ch != '\\\"'))                                   // String double-quoted\n                || ((sc.state == SCE_A68K_MACRO_DECLARATION) && IsIdentifierChar(sc.ch))             // Macro declaration (or global label, we don't know at this point) \n                || ((sc.state == SCE_A68K_IDENTIFIER)        && IsIdentifierChar(sc.ch))             // Identifier \n                || ((sc.state == SCE_A68K_LABEL)             && IsIdentifierChar(sc.ch))             // Label (local) \n                || ((sc.state == SCE_A68K_COMMENT_DOXYGEN)   && IsDoxygenChar(sc.ch))                // Doxygen keyword \n                || ((sc.state == SCE_A68K_COMMENT_SPECIAL)   && isalpha(sc.ch))                      // Alert \n                || ((sc.state == SCE_A68K_COMMENT)           && !isalpha(sc.ch) && (sc.ch != '\\\\'))) // Normal comment \n            {\n                continue;\n            }\n\n        /************************************************************ \n        * \n        *   Check if current state terminates \n        * \n        ************************************************************/ \n\n            // Strings: include terminal ' or \" in the current string by skipping it \n            if ((sc.state == SCE_A68K_STRING1) || (sc.state == SCE_A68K_STRING2)) { \n                sc.Forward(); \n                }\n \n \n            // If a macro declaration was terminated with ':', it was a label \n            else if ((sc.state == SCE_A68K_MACRO_DECLARATION) && (sc.chPrev == ':')) { \n                sc.ChangeState(SCE_A68K_LABEL); \n            }\n\n \n            // If it wasn't a Doxygen keyword, change it to normal comment \n            else if (sc.state == SCE_A68K_COMMENT_DOXYGEN) { \n                sc.GetCurrent(Buffer, sizeof(Buffer));\n                if (!doxygenKeyword.InList(Buffer)) { \n                    sc.ChangeState(SCE_A68K_COMMENT);\n                }\n                sc.SetState(SCE_A68K_COMMENT);\n                continue;\n            }\n\n \n            // If it wasn't an Alert, change it to normal comment \n            else if (sc.state == SCE_A68K_COMMENT_SPECIAL) { \n                sc.GetCurrent(Buffer, sizeof(Buffer)); \n                if (!alert.InList(Buffer)) { \n                    sc.ChangeState(SCE_A68K_COMMENT);\n                }\n                // Reset style to normal comment, or to Doxygen keyword if it begins with '\\'  \n                if (sc.ch == '\\\\') { \n                    sc.SetState(SCE_A68K_COMMENT_DOXYGEN); \n                } \n                else { \n                sc.SetState(SCE_A68K_COMMENT);\n                } \n                continue;\n            }\n\n \n            // If we are in a comment, it's a Doxygen keyword or an Alert \n            else if (sc.state == SCE_A68K_COMMENT) { \n                if (sc.ch == '\\\\') { \n                    sc.SetState(SCE_A68K_COMMENT_DOXYGEN); \n                } \n                else { \n                    sc.SetState(SCE_A68K_COMMENT_SPECIAL); \n                } \n                continue; \n            }\n\n \n            // Check if we are at the end of an identifier\n            // In this case, colourise it if was a keyword.\n            else if ((sc.state == SCE_A68K_IDENTIFIER) && !IsIdentifierChar(sc.ch)) { \n                sc.GetCurrentLowered(Buffer, sizeof(Buffer));                           // Buffer the string of the current context\n                if (cpuInstruction.InList(Buffer)) {                                    // And check if it belongs to a keyword list\n                    sc.ChangeState(SCE_A68K_CPUINSTRUCTION);\n                }\n                else if (extInstruction.InList(Buffer)) {\n                    sc.ChangeState(SCE_A68K_EXTINSTRUCTION);\n                }\n                else if (registers.InList(Buffer)) {\n                    sc.ChangeState(SCE_A68K_REGISTER);\n                }\n                else if (directive.InList(Buffer)) {\n                    sc.ChangeState(SCE_A68K_DIRECTIVE);\n                }\n            }\n\n            // All special contexts are now handled.Come back to default style\n            sc.SetState(SCE_A68K_DEFAULT);\n        }\n\n\n        /************************************************************\n        *\n        *   Check if we must enter a new state\n        *\n        ************************************************************/\n\n        // Something which begins at the beginning of a line, and with  \n        // - '\\' + an identifier start char, or \n        // - '\\\\@' + an identifier start char \n        // is a local label (second case is used for macro local labels). We set it already as a label, it can't be a macro/equ declaration \n        if (sc.atLineStart && (sc.ch < 0x80) && IsIdentifierStart(sc.chNext) && (sc.ch == '\\\\')) { \n            sc.SetState(SCE_A68K_LABEL); \n        } \n \n        if (sc.atLineStart && (sc.ch < 0x80) && (sc.ch == '\\\\') && (sc.chNext == '\\\\')) { \n            sc.Forward(2); \n            if ((sc.ch == '@') && IsIdentifierStart(sc.chNext)) { \n                sc.ChangeState(SCE_A68K_LABEL); \n                sc.SetState(SCE_A68K_LABEL); \n            } \n        } \n         \n        // Label and macro identifiers start at the beginning of a line\n        // We set both as a macro id, but if it wasn't one (':' at the end), \n        // it will be changed as a label. \n        if (sc.atLineStart && (sc.ch < 0x80) && IsIdentifierStart(sc.ch)) {\n            sc.SetState(SCE_A68K_MACRO_DECLARATION); \n        }\n        else if ((sc.ch < 0x80) && (sc.ch == ';')) {                            // Default: alert in a comment. If it doesn't match \n            sc.SetState(SCE_A68K_COMMENT);                                      // with an alert, it will be toggle to a normal comment \n        }\n        else if ((sc.ch < 0x80) && isdigit(sc.ch)) {                            // Decimal numbers haven't prefix\n            sc.SetState(SCE_A68K_NUMBER_DEC);\n        }\n        else if ((sc.ch < 0x80) && (sc.ch == '%')) {                            // Binary numbers are prefixed with '%'\n            sc.SetState(SCE_A68K_NUMBER_BIN);\n        }\n        else if ((sc.ch < 0x80) && (sc.ch == '$')) {                            // Hexadecimal numbers are prefixed with '$'\n            sc.SetState(SCE_A68K_NUMBER_HEX);\n        }\n        else if ((sc.ch < 0x80) && (sc.ch == '\\'')) {                           // String (single-quoted)\n            sc.SetState(SCE_A68K_STRING1);\n        }\n        else if ((sc.ch < 0x80) && (sc.ch == '\\\"')) {                           // String (double-quoted)\n            sc.SetState(SCE_A68K_STRING2);\n        }\n        else if ((sc.ch < 0x80) && (sc.ch == '\\\\') && (isdigit(sc.chNext))) {   // Replacement symbols in macro are prefixed with '\\' \n            sc.SetState(SCE_A68K_MACRO_ARG);\n        }\n        else if ((sc.ch < 0x80) && IsIdentifierStart(sc.ch)) {                  // An identifier: constant, label, etc...\n            sc.SetState(SCE_A68K_IDENTIFIER);\n        }\n        else {\n            if (sc.ch < 0x80) {\n                OpType = GetOperatorType(sc.ch, sc.chNext);                     // Check if current char is an operator\n                if (OpType != NO_OPERATOR) {\n                    sc.SetState(SCE_A68K_OPERATOR);\n                    if (OpType == OPERATOR_2CHAR) {                             // Check if the operator is 2 bytes long\n                        sc.ForwardSetState(SCE_A68K_OPERATOR);                  // (>> or <<)\n                    }\n                }\n            }\n        }\n    }                                                                           // End of for()\n    sc.Complete();\n}\n\n\n// Names of the keyword lists\n\nstatic const char * const a68kWordListDesc[] =\n{\n    \"CPU instructions\",\n    \"Registers\",\n    \"Directives\",\n    \"Extended instructions\",\n    \"Comment special words\",\n    \"Doxygen keywords\",\n    0\n};\n\nLexerModule lmA68k(SCLEX_A68K, ColouriseA68kDoc, \"a68k\", 0, a68kWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexAPDL.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexAPDL.cxx\n ** Lexer for APDL. Based on the lexer for Assembler by The Black Horus.\n ** By Hadar Raz.\n **/\n// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (ch < 0x80 && (isalnum(ch) || ch == '_'));\n}\n\nstatic inline bool IsAnOperator(char ch) {\n\t// '.' left out as it is used to make up numbers\n\tif (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||\n\t\tch == '(' || ch == ')' || ch == '=' || ch == '^' ||\n\t\tch == '[' || ch == ']' || ch == '<' || ch == '&' ||\n\t\tch == '>' || ch == ',' || ch == '|' || ch == '~' ||\n\t\tch == '$' || ch == ':' || ch == '%')\n\t\treturn true;\n\treturn false;\n}\n\nstatic void ColouriseAPDLDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                            Accessor &styler) {\n\n\tint stringStart = ' ';\n\n\tWordList &processors = *keywordlists[0];\n\tWordList &commands = *keywordlists[1];\n\tWordList &slashcommands = *keywordlists[2];\n\tWordList &starcommands = *keywordlists[3];\n\tWordList &arguments = *keywordlists[4];\n\tWordList &functions = *keywordlists[5];\n\n\t// Do not leak onto next line\n\tinitStyle = SCE_APDL_DEFAULT;\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\t\t// Determine if the current state should terminate.\n\t\tif (sc.state == SCE_APDL_NUMBER) {\n\t\t\tif (!(IsADigit(sc.ch) || sc.ch == '.' || (sc.ch == 'e' || sc.ch == 'E') ||\n\t\t\t\t((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E')))) {\n\t\t\t\tsc.SetState(SCE_APDL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_APDL_COMMENT) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_APDL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_APDL_COMMENTBLOCK) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tif (sc.ch == '\\r') {\n\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tsc.ForwardSetState(SCE_APDL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_APDL_STRING) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_APDL_DEFAULT);\n\t\t\t} else if ((sc.ch == '\\'' && stringStart == '\\'') || (sc.ch == '\\\"' && stringStart == '\\\"')) {\n\t\t\t\tsc.ForwardSetState(SCE_APDL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_APDL_WORD) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\tif (processors.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_APDL_PROCESSOR);\n\t\t\t\t} else if (slashcommands.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_APDL_SLASHCOMMAND);\n\t\t\t\t} else if (starcommands.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_APDL_STARCOMMAND);\n\t\t\t\t} else if (commands.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_APDL_COMMAND);\n\t\t\t\t} else if (arguments.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_APDL_ARGUMENT);\n\t\t\t\t} else if (functions.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_APDL_FUNCTION);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_APDL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_APDL_OPERATOR) {\n\t\t\tif (!IsAnOperator(static_cast<char>(sc.ch))) {\n\t\t\t    sc.SetState(SCE_APDL_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_APDL_DEFAULT) {\n\t\t\tif (sc.ch == '!' && sc.chNext == '!') {\n\t\t\t\tsc.SetState(SCE_APDL_COMMENTBLOCK);\n\t\t\t} else if (sc.ch == '!') {\n\t\t\t\tsc.SetState(SCE_APDL_COMMENT);\n\t\t\t} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_APDL_NUMBER);\n\t\t\t} else if (sc.ch == '\\'' || sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_APDL_STRING);\n\t\t\t\tstringStart = sc.ch;\n\t\t\t} else if (IsAWordChar(sc.ch) || ((sc.ch == '*' || sc.ch == '/') && !isgraph(sc.chPrev))) {\n\t\t\t\tsc.SetState(SCE_APDL_WORD);\n\t\t\t} else if (IsAnOperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_APDL_OPERATOR);\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n}\n\n//------------------------------------------------------------------------------\n// 06-27-07 Sergio Lucato\n// - Included code folding for Ansys APDL lexer\n// - Copyied from LexBasic.cxx and modified for APDL\n//------------------------------------------------------------------------------\n\n/* Bits:\n * 1  - whitespace\n * 2  - operator\n * 4  - identifier\n * 8  - decimal digit\n * 16 - hex digit\n * 32 - bin digit\n */\nstatic int character_classification[128] =\n{\n    0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0,  1,  0,  0,\n    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n    1,  2,  0,  2,  2,  2,  2,  2,  2,  2,  6,  2,  2,  2,  10, 6,\n    60, 60, 28, 28, 28, 28, 28, 28, 28, 28, 2,  2,  2,  2,  2,  2,\n    2,  20, 20, 20, 20, 20, 20, 4,  4,  4,  4,  4,  4,  4,  4,  4,\n    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  2,  2,  2,  2,  4,\n    2,  20, 20, 20, 20, 20, 20, 4,  4,  4,  4,  4,  4,  4,  4,  4,\n    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  2,  2,  2,  2,  0\n};\n\nstatic bool IsSpace(int c) {\n\treturn c < 128 && (character_classification[c] & 1);\n}\n\nstatic bool IsIdentifier(int c) {\n\treturn c < 128 && (character_classification[c] & 4);\n}\n\nstatic int LowerCase(int c)\n{\n\tif (c >= 'A' && c <= 'Z')\n\t\treturn 'a' + c - 'A';\n\treturn c;\n}\n\nstatic int CheckAPDLFoldPoint(char const *token, int &level) {\n\tif (!strcmp(token, \"*if\") ||\n\t\t!strcmp(token, \"*do\") ||\n\t\t!strcmp(token, \"*dowhile\") ) {\n\t\tlevel |= SC_FOLDLEVELHEADERFLAG;\n\t\treturn 1;\n\t}\n\tif (!strcmp(token, \"*endif\") ||\n\t\t!strcmp(token, \"*enddo\") ) {\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n\nstatic void FoldAPDLDoc(unsigned int startPos, int length, int,\n\tWordList *[], Accessor &styler) {\n\n\tint line = styler.GetLine(startPos);\n\tint level = styler.LevelAt(line);\n\tint go = 0, done = 0;\n\tint endPos = startPos + length;\n\tchar word[256];\n\tint wordlen = 0;\n\tint i;\n    bool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\t// Scan for tokens at the start of the line (they may include\n\t// whitespace, for tokens like \"End Function\"\n\tfor (i = startPos; i < endPos; i++) {\n\t\tint c = styler.SafeGetCharAt(i);\n\t\tif (!done && !go) {\n\t\t\tif (wordlen) { // are we scanning a token already?\n\t\t\t\tword[wordlen] = static_cast<char>(LowerCase(c));\n\t\t\t\tif (!IsIdentifier(c)) { // done with token\n\t\t\t\t\tword[wordlen] = '\\0';\n\t\t\t\t\tgo = CheckAPDLFoldPoint(word, level);\n\t\t\t\t\tif (!go) {\n\t\t\t\t\t\t// Treat any whitespace as single blank, for\n\t\t\t\t\t\t// things like \"End   Function\".\n\t\t\t\t\t\tif (IsSpace(c) && IsIdentifier(word[wordlen - 1])) {\n\t\t\t\t\t\t\tword[wordlen] = ' ';\n\t\t\t\t\t\t\tif (wordlen < 255)\n\t\t\t\t\t\t\t\twordlen++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse // done with this line\n\t\t\t\t\t\t\tdone = 1;\n\t\t\t\t\t}\n\t\t\t\t} else if (wordlen < 255) {\n\t\t\t\t\twordlen++;\n\t\t\t\t}\n\t\t\t} else { // start scanning at first non-whitespace character\n\t\t\t\tif (!IsSpace(c)) {\n\t\t\t\t\tif (IsIdentifier(c)) {\n\t\t\t\t\t\tword[0] = static_cast<char>(LowerCase(c));\n\t\t\t\t\t\twordlen = 1;\n\t\t\t\t\t} else // done with this line\n\t\t\t\t\t\tdone = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (c == '\\n') { // line end\n\t\t\tif (!done && wordlen == 0 && foldCompact) // line was only space\n\t\t\t\tlevel |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (level != styler.LevelAt(line))\n\t\t\t\tstyler.SetLevel(line, level);\n\t\t\tlevel += go;\n\t\t\tline++;\n\t\t\t// reset state\n\t\t\twordlen = 0;\n\t\t\tlevel &= ~SC_FOLDLEVELHEADERFLAG;\n\t\t\tlevel &= ~SC_FOLDLEVELWHITEFLAG;\n\t\t\tgo = 0;\n\t\t\tdone = 0;\n\t\t}\n\t}\n}\n\nstatic const char * const apdlWordListDesc[] = {\n    \"processors\",\n    \"commands\",\n    \"slashommands\",\n    \"starcommands\",\n    \"arguments\",\n    \"functions\",\n    0\n};\n\nLexerModule lmAPDL(SCLEX_APDL, ColouriseAPDLDoc, \"apdl\", FoldAPDLDoc, apdlWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexASY.cpp",
    "content": "// Scintilla source code edit control\n//Author: instanton (email: soft_share<at>126<dot>com)\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic void ColouriseAsyDoc(unsigned int startPos, int length, int initStyle,\n\t\tWordList *keywordlists[], Accessor &styler) {\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\n\tCharacterSet setWordStart(CharacterSet::setAlpha, \"_\", 0x80, true);\n\tCharacterSet setWord(CharacterSet::setAlphaNum, \"._\", 0x80, true);\n\n\tint visibleChars = 0;\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\tif (sc.atLineStart) {\n\t\t\tif (sc.state == SCE_ASY_STRING) {\n\t\t\t\tsc.SetState(SCE_ASY_STRING);\n\t\t\t}\n\t\t\tvisibleChars = 0;\n\t\t}\n\n\t\tif (sc.ch == '\\\\') {\n\t\t\tif (sc.chNext == '\\n' || sc.chNext == '\\r') {\n\t\t\t\tsc.Forward();\n\t\t\t\tif (sc.ch == '\\r' && sc.chNext == '\\n') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n//\t\t\t\tcontinuationLine = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Determine if the current state should terminate.\n\t\tswitch (sc.state) {\n\t\t\tcase SCE_ASY_OPERATOR:\n\t\t\t\tsc.SetState(SCE_ASY_DEFAULT);\n\t\t\t\tbreak;\n\t\t\tcase SCE_ASY_NUMBER:\n\t\t\t\tif (!setWord.Contains(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_ASY_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ASY_IDENTIFIER:\n\t\t\t\tif (!setWord.Contains(sc.ch) || (sc.ch == '.')) {\n\t\t\t\t\tchar s[1000];\n\t\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_ASY_WORD);\n\t\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_ASY_WORD2);\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(SCE_ASY_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ASY_COMMENT:\n\t\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_ASY_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ASY_COMMENTLINE:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_ASY_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ASY_STRING:\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.ChangeState(SCE_ASY_STRINGEOL);\n\t\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\t\tsc.ForwardSetState(SCE_ASY_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ASY_CHARACTER:\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.ChangeState(SCE_ASY_STRINGEOL);\n\t\t\t\t} else \tif (sc.ch == '\\\\') {\n\t\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\t\tsc.ForwardSetState(SCE_ASY_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_ASY_DEFAULT) {\n\t\t\tif (setWordStart.Contains(sc.ch) || (sc.ch == '@')) {\n\t\t\t\tsc.SetState(SCE_ASY_IDENTIFIER);\n\t\t\t} else if (sc.Match('/', '*')) {\n\t\t\t\tsc.SetState(SCE_ASY_COMMENT);\n\t\t\t\tsc.Forward();\t//\n\t\t\t} else if (sc.Match('/', '/')) {\n\t\t\t\tsc.SetState(SCE_ASY_COMMENTLINE);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_ASY_STRING);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_ASY_CHARACTER);\n\t\t\t} else if (sc.ch == '#' && visibleChars == 0) {\n\t\t\t\tdo {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} while ((sc.ch == ' ' || sc.ch == '\\t') && sc.More());\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.SetState(SCE_ASY_DEFAULT);\n\t\t\t\t}\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_ASY_OPERATOR);\n\t\t\t}\n\t\t}\n\n\t}\n\tsc.Complete();\n}\n\nstatic bool IsAsyCommentStyle(int style) {\n\treturn style == SCE_ASY_COMMENT;\n}\n\n\nstatic inline bool isASYidentifier(int ch) {\n\treturn\n      ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) ;\n}\n\nstatic int ParseASYWord(unsigned int pos, Accessor &styler, char *word)\n{\n  int length=0;\n  char ch=styler.SafeGetCharAt(pos);\n  *word=0;\n\n  while(isASYidentifier(ch) && length<100){\n          word[length]=ch;\n          length++;\n          ch=styler.SafeGetCharAt(pos+length);\n  }\n  word[length]=0;\n  return length;\n}\n\nstatic bool IsASYDrawingLine(int line, Accessor &styler) {\n\tint pos = styler.LineStart(line);\n\tint eol_pos = styler.LineStart(line + 1) - 1;\n\n\tint startpos = pos;\n\tchar buffer[100]=\"\";\n\n\twhile (startpos<eol_pos){\n\t\tchar ch = styler[startpos];\n\t\tParseASYWord(startpos,styler,buffer);\n\t\tbool drawcommands = strncmp(buffer,\"draw\",4)==0||\n\t\t\tstrncmp(buffer,\"pair\",4)==0||strncmp(buffer,\"label\",5)==0;\n\t\tif (!drawcommands && ch!=' ') return false;\n\t\telse if (drawcommands) return true;\n\t\tstartpos++;\n\t}\n\treturn false;\n}\n\nstatic void FoldAsyDoc(unsigned int startPos, int length, int initStyle,\n\t\t\t\t\t   WordList *[], Accessor &styler) {\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tbool foldAtElse = styler.GetPropertyInt(\"fold.at.else\", 0) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelCurrent = SC_FOLDLEVELBASE;\n\tif (lineCurrent > 0)\n\t\tlevelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n\tint levelMinCurrent = levelCurrent;\n\tint levelNext = levelCurrent;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (foldComment && IsAsyCommentStyle(style)) {\n\t\t\tif (!IsAsyCommentStyle(stylePrev) && (stylePrev != SCE_ASY_COMMENTLINEDOC)) {\n\t\t\t\tlevelNext++;\n\t\t\t} else if (!IsAsyCommentStyle(styleNext) && (styleNext != SCE_ASY_COMMENTLINEDOC) && !atEOL) {\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\t\tif (style == SCE_ASY_OPERATOR) {\n\t\t\tif (ch == '{') {\n\t\t\t\tif (levelMinCurrent > levelNext) {\n\t\t\t\t\tlevelMinCurrent = levelNext;\n\t\t\t\t}\n\t\t\t\tlevelNext++;\n\t\t\t} else if (ch == '}') {\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\n\t\tif (atEOL && IsASYDrawingLine(lineCurrent, styler)){\n\t\t\tif (lineCurrent==0 && IsASYDrawingLine(lineCurrent + 1, styler))\n\t\t\t\tlevelNext++;\n\t\t\telse if (lineCurrent!=0 && !IsASYDrawingLine(lineCurrent - 1, styler)\n\t\t\t\t&& IsASYDrawingLine(lineCurrent + 1, styler)\n\t\t\t\t)\n\t\t\t\tlevelNext++;\n\t\t\telse if (lineCurrent!=0 && IsASYDrawingLine(lineCurrent - 1, styler) &&\n\t\t\t\t!IsASYDrawingLine(lineCurrent+1, styler))\n\t\t\t\tlevelNext--;\n\t\t}\n\n\t\tif (atEOL) {\n\t\t\tint levelUse = levelCurrent;\n\t\t\tif (foldAtElse) {\n\t\t\t\tlevelUse = levelMinCurrent;\n\t\t\t}\n\t\t\tint lev = levelUse | levelNext << 16;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (levelUse < levelNext)\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelCurrent = levelNext;\n\t\t\tlevelMinCurrent = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!IsASpace(ch))\n\t\t\tvisibleChars++;\n\t}\n}\n\nstatic const char * const asyWordLists[] = {\n            \"Primary keywords and identifiers\",\n            \"Secondary keywords and identifiers\",\n            0,\n        };\n\nLexerModule lmASY(SCLEX_ASYMPTOTE, ColouriseAsyDoc, \"asy\", FoldAsyDoc, asyWordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexAU3.cpp",
    "content": "// Scintilla source code edit control\n// @file LexAU3.cxx\n// Lexer for AutoIt3  http://www.hiddensoft.com/autoit3\n// by Jos van der Zande, jvdzande@yahoo.com\n//\n// Changes:\n// March 28, 2004 - Added the standard Folding code\n// April 21, 2004 - Added Preprosessor Table + Syntax Highlighting\n//                  Fixed Number highlighting\n//                  Changed default isoperator to IsAOperator to have a better match to AutoIt3\n//                  Fixed \"#comments_start\" -> \"#comments-start\"\n//                  Fixed \"#comments_end\" -> \"#comments-end\"\n//                  Fixed Sendkeys in Strings when not terminated with }\n//                  Added support for Sendkey strings that have second parameter e.g. {UP 5} or {a down}\n// April 26, 2004 - Fixed # pre-processor statement inside of comment block would invalidly change the color.\n//                  Added logic for #include <xyz.au3> to treat the <> as string\n//                  Added underscore to IsAOperator.\n// May 17, 2004   - Changed the folding logic from indent to keyword folding.\n//                  Added Folding logic for blocks of single-commentlines or commentblock.\n//                        triggered by: fold.comment=1\n//                  Added Folding logic for preprocessor blocks triggered by fold.preprocessor=1\n//                  Added Special for #region - #endregion syntax highlight and folding.\n// May 30, 2004   - Fixed issue with continuation lines on If statements.\n// June 5, 2004   - Added comma to Operators for better readability.\n//                  Added fold.compact support set with fold.compact=1\n//                  Changed folding inside of #cs-#ce. Default is no keyword folding inside comment blocks when fold.comment=1\n//                        it will now only happen when fold.comment=2.\n// Sep 5, 2004    - Added logic to handle colourizing words on the last line.\n//                        Typed Characters now show as \"default\" till they match any table.\n// Oct 10, 2004   - Added logic to show Comments in \"Special\" directives.\n// Nov  1, 2004   - Added better testing for Numbers supporting x and e notation.\n// Nov 28, 2004   - Added logic to handle continuation lines for syntax highlighting.\n// Jan 10, 2005   - Added Abbreviations Keyword used for expansion\n// Mar 24, 2005   - Updated Abbreviations Keywords to fix when followed by Operator.\n// Apr 18, 2005   - Updated #CE/#Comment-End logic to take a linecomment \";\" into account\n//                - Added folding support for With...EndWith\n//                - Added support for a DOT in variable names\n//                - Fixed Underscore in CommentBlock\n// May 23, 2005   - Fixed the SentKey lexing in case of a missing }\n// Aug 11, 2005   - Fixed possible bug with s_save length > 100.\n// Aug 23, 2005   - Added Switch/endswitch support to the folding logic.\n// Sep 27, 2005   - Fixed the SentKey lexing logic in case of multiple sentkeys.\n// Mar 12, 2006   - Fixed issue with <> coloring as String in stead of Operator in rare occasions.\n// Apr  8, 2006   - Added support for AutoIt3 Standard UDF library (SCE_AU3_UDF)\n// Mar  9, 2007   - Fixed bug with + following a String getting the wrong Color.\n// Jun 20, 2007   - Fixed Commentblock issue when LF's are used as EOL.\n// Jul 26, 2007   - Fixed #endregion undetected bug.\n//\n// Copyright for Scintilla: 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n// Scintilla source code edit control\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsTypeCharacter(const int ch)\n{\n    return ch == '$';\n}\nstatic inline bool IsAWordChar(const int ch)\n{\n    return (ch < 0x80) && (isalnum(ch) || ch == '_');\n}\n\nstatic inline bool IsAWordStart(const int ch)\n{\n    return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '@' || ch == '#' || ch == '$' || ch == '.');\n}\n\nstatic inline bool IsAOperator(char ch) {\n\tif (IsASCII(ch) && isalnum(ch))\n\t\treturn false;\n\tif (ch == '+' || ch == '-' || ch == '*' || ch == '/' ||\n\t    ch == '&' || ch == '^' || ch == '=' || ch == '<' || ch == '>' ||\n\t    ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == ',' )\n\t\treturn true;\n\treturn false;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// GetSendKey() filters the portion before and after a/multiple space(s)\n// and return the first portion to be looked-up in the table\n// also check if the second portion is valid... (up,down.on.off,toggle or a number)\n///////////////////////////////////////////////////////////////////////////////\n\nstatic int GetSendKey(const char *szLine, char *szKey)\n{\n\tint\t\tnFlag\t= 0;\n\tint\t\tnStartFound\t= 0;\n\tint\t\tnKeyPos\t= 0;\n\tint\t\tnSpecPos= 0;\n\tint\t\tnSpecNum= 1;\n\tint\t\tnPos\t= 0;\n\tchar\tcTemp;\n\tchar\tszSpecial[100];\n\n\t// split the portion of the sendkey in the part before and after the spaces\n\twhile ( ( (cTemp = szLine[nPos]) != '\\0'))\n\t{\n\t\t// skip leading Ctrl/Shift/Alt state\n\t\tif (cTemp == '{') {\n\t\t\tnStartFound = 1;\n\t\t}\n\t\t//\n\t\tif (nStartFound == 1) {\n\t\t\tif ((cTemp == ' ') && (nFlag == 0) ) // get the stuff till first space\n\t\t\t{\n\t\t\t\tnFlag = 1;\n\t\t\t\t// Add } to the end of the first bit for table lookup later.\n\t\t\t\tszKey[nKeyPos++] = '}';\n\t\t\t}\n\t\t\telse if (cTemp == ' ')\n\t\t\t{\n\t\t\t\t// skip other spaces\n\t\t\t}\n\t\t\telse if (nFlag == 0)\n\t\t\t{\n\t\t\t\t// save first portion into var till space or } is hit\n\t\t\t\tszKey[nKeyPos++] = cTemp;\n\t\t\t}\n\t\t\telse if ((nFlag == 1) && (cTemp != '}'))\n\t\t\t{\n\t\t\t\t// Save second portion into var...\n\t\t\t\tszSpecial[nSpecPos++] = cTemp;\n\t\t\t\t// check if Second portion is all numbers for repeat fuction\n\t\t\t\tif (isdigit(cTemp) == false) {nSpecNum = 0;}\n\t\t\t}\n\t\t}\n\t\tnPos++;\t\t\t\t\t\t\t\t\t// skip to next char\n\n\t} // End While\n\n\n\t// Check if the second portion is either a number or one of these keywords\n\tszKey[nKeyPos] = '\\0';\n\tszSpecial[nSpecPos] = '\\0';\n\tif (strcmp(szSpecial,\"down\")== 0    || strcmp(szSpecial,\"up\")== 0  ||\n\t\tstrcmp(szSpecial,\"on\")== 0      || strcmp(szSpecial,\"off\")== 0 ||\n\t\tstrcmp(szSpecial,\"toggle\")== 0  || nSpecNum == 1 )\n\t{\n\t\tnFlag = 0;\n\t}\n\telse\n\t{\n\t\tnFlag = 1;\n\t}\n\treturn nFlag;  // 1 is bad, 0 is good\n\n} // GetSendKey()\n\n//\n// Routine to check the last \"none comment\" character on a line to see if its a continuation\n//\nstatic bool IsContinuationLine(unsigned int szLine, Accessor &styler)\n{\n\tint nsPos = styler.LineStart(szLine);\n\tint nePos = styler.LineStart(szLine+1) - 2;\n\t//int stylech = styler.StyleAt(nsPos);\n\twhile (nsPos < nePos)\n\t{\n\t\t//stylech = styler.StyleAt(nePos);\n\t\tint stylech = styler.StyleAt(nsPos);\n\t\tif (!(stylech == SCE_AU3_COMMENT)) {\n\t\t\tchar ch = styler.SafeGetCharAt(nePos);\n\t\t\tif (!isspacechar(ch)) {\n\t\t\t\tif (ch == '_')\n\t\t\t\t\treturn true;\n\t\t\t\telse\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tnePos--; // skip to next char\n\t} // End While\n\treturn false;\n} // IsContinuationLine()\n\n//\n// syntax highlighting logic\nstatic void ColouriseAU3Doc(unsigned int startPos,\n\t\t\t\t\t\t\tint length, int initStyle,\n\t\t\t\t\t\t\tWordList *keywordlists[],\n\t\t\t\t\t\t\tAccessor &styler) {\n\n    WordList &keywords = *keywordlists[0];\n    WordList &keywords2 = *keywordlists[1];\n    WordList &keywords3 = *keywordlists[2];\n    WordList &keywords4 = *keywordlists[3];\n    WordList &keywords5 = *keywordlists[4];\n    WordList &keywords6 = *keywordlists[5];\n    WordList &keywords7 = *keywordlists[6];\n    WordList &keywords8 = *keywordlists[7];\n\t// find the first previous line without continuation character at the end\n\tint lineCurrent = styler.GetLine(startPos);\n\tint s_startPos = startPos;\n\t// When not inside a Block comment: find First line without _\n\tif (!(initStyle==SCE_AU3_COMMENTBLOCK)) {\n\t\twhile ((lineCurrent > 0 && IsContinuationLine(lineCurrent,styler)) ||\n\t\t\t   (lineCurrent > 1 && IsContinuationLine(lineCurrent-1,styler))) {\n\t\t\tlineCurrent--;\n\t\t\tstartPos = styler.LineStart(lineCurrent); // get start position\n\t\t\tinitStyle =  0;                           // reset the start style to 0\n\t\t}\n\t}\n\t// Set the new length to include it from the start and set the start position\n\tlength = length + s_startPos - startPos;      // correct the total length to process\n    styler.StartAt(startPos);\n\n    StyleContext sc(startPos, length, initStyle, styler);\n\tchar si;     // string indicator \"=1 '=2\n\tchar ni;     // Numeric indicator error=9 normal=0 normal+dec=1 hex=2 Enot=3\n\tchar ci;     // comment indicator 0=not linecomment(;)\n\tchar s_save[100] = \"\";\n\tsi=0;\n\tni=0;\n\tci=0;\n\t//$$$\n    for (; sc.More(); sc.Forward()) {\n\t\tchar s[100];\n\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t// **********************************************\n\t\t// save the total current word for eof processing\n\t\tif (IsAWordChar(sc.ch) || sc.ch == '}')\n\t\t{\n\t\t\tstrcpy(s_save,s);\n\t\t\tint tp = static_cast<int>(strlen(s_save));\n\t\t\tif (tp < 99) {\n\t\t\t\ts_save[tp] = static_cast<char>(tolower(sc.ch));\n\t\t\t\ts_save[tp+1] = '\\0';\n\t\t\t}\n\t\t}\n\t\t// **********************************************\n\t\t//\n\t\tswitch (sc.state)\n        {\n            case SCE_AU3_COMMENTBLOCK:\n            {\n\t\t\t\t//Reset at line end\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tci=0;\n\t\t\t\t\tif (strcmp(s, \"#ce\")== 0 || strcmp(s, \"#comments-end\")== 0) {\n\t\t\t\t\t\tif (sc.atLineEnd)\n\t\t\t\t\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tsc.SetState(SCE_AU3_COMMENTBLOCK);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t//skip rest of line when a ; is encountered\n\t\t\t\tif (sc.chPrev == ';') {\n\t\t\t\t\tci=2;\n\t\t\t\t\tsc.SetState(SCE_AU3_COMMENTBLOCK);\n\t\t\t\t}\n\t\t\t\t// skip rest of the line\n\t\t\t\tif (ci==2)\n\t\t\t\t\tbreak;\n\t\t\t\t// check when first character is detected on the line\n\t\t\t\tif (ci==0) {\n\t\t\t\t\tif (IsAWordStart(static_cast<char>(sc.ch)) || IsAOperator(static_cast<char>(sc.ch))) {\n\t\t\t\t\t\tci=1;\n\t\t\t\t\t\tsc.SetState(SCE_AU3_COMMENTBLOCK);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!(IsAWordChar(sc.ch) || (sc.ch == '-' && strcmp(s, \"#comments\") == 0))) {\n\t\t\t\t\tif ((strcmp(s, \"#ce\")== 0 || strcmp(s, \"#comments-end\")== 0))\n\t\t\t\t\t\t\tsc.SetState(SCE_AU3_COMMENT);  // set to comment line for the rest of the line\n\t\t\t\t\telse\n\t\t\t\t\t\tci=2;  // line doesn't begin with #CE so skip the rest of the line\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n            case SCE_AU3_COMMENT:\n            {\n                if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);}\n                break;\n            }\n            case SCE_AU3_OPERATOR:\n            {\n                // check if its a COMobject\n\t\t\t\tif (sc.chPrev == '.' && IsAWordChar(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_AU3_COMOBJ);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t\t\t}\n                break;\n            }\n            case SCE_AU3_SPECIAL:\n            {\n                if (sc.ch == ';') {sc.SetState(SCE_AU3_COMMENT);}\n\t\t\t\tif (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);}\n                break;\n            }\n            case SCE_AU3_KEYWORD:\n            {\n                if (!(IsAWordChar(sc.ch) || (sc.ch == '-' && (strcmp(s, \"#comments\") == 0 || strcmp(s, \"#include\") == 0))))\n                {\n                    if (!IsTypeCharacter(sc.ch))\n                    {\n\t\t\t\t\t\tif (strcmp(s, \"#cs\")== 0 || strcmp(s, \"#comments-start\")== 0 )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsc.ChangeState(SCE_AU3_COMMENTBLOCK);\n\t\t\t\t\t\t\tsc.SetState(SCE_AU3_COMMENTBLOCK);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (keywords.InList(s)) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_AU3_KEYWORD);\n\t\t\t\t\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (keywords2.InList(s)) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_AU3_FUNCTION);\n\t\t\t\t\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (keywords3.InList(s)) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_AU3_MACRO);\n\t\t\t\t\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (keywords5.InList(s)) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_AU3_PREPROCESSOR);\n\t\t\t\t\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t\t\t\t\t\tif (strcmp(s, \"#include\")== 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsi = 3;   // use to determine string start for #inlude <>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (keywords6.InList(s)) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_AU3_SPECIAL);\n\t\t\t\t\t\t\tsc.SetState(SCE_AU3_SPECIAL);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ((keywords7.InList(s)) && (!IsAOperator(static_cast<char>(sc.ch)))) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_AU3_EXPAND);\n\t\t\t\t\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (keywords8.InList(s)) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_AU3_UDF);\n\t\t\t\t\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (strcmp(s, \"_\") == 0) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_AU3_OPERATOR);\n\t\t\t\t\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (!IsAWordChar(sc.ch)) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_AU3_DEFAULT);\n\t\t\t\t\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n                if (sc.atLineEnd) {\n\t\t\t\t\tsc.SetState(SCE_AU3_DEFAULT);}\n                break;\n            }\n\t\t\tcase SCE_AU3_NUMBER:\n            {\n\t\t\t\t// Numeric indicator error=9 normal=0 normal+dec=1 hex=2 E-not=3\n\t\t\t\t//\n\t\t\t\t// test for Hex notation\n\t\t\t\tif (strcmp(s, \"0\") == 0 && (sc.ch == 'x' || sc.ch == 'X') && ni == 0)\n\t\t\t\t{\n\t\t\t\t\tni = 2;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// test for E notation\n\t\t\t\tif (IsADigit(sc.chPrev) && (sc.ch == 'e' || sc.ch == 'E') && ni <= 1)\n\t\t\t\t{\n\t\t\t\t\tni = 3;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t//  Allow Hex characters inside hex numeric strings\n\t\t\t\tif ((ni == 2) &&\n\t\t\t\t\t(sc.ch == 'a' || sc.ch == 'b' || sc.ch == 'c' || sc.ch == 'd' || sc.ch == 'e' || sc.ch == 'f' ||\n\t\t\t\t\t sc.ch == 'A' || sc.ch == 'B' || sc.ch == 'C' || sc.ch == 'D' || sc.ch == 'E' || sc.ch == 'F' ))\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// test for 1 dec point only\n\t\t\t\tif (sc.ch == '.')\n\t\t\t\t{\n\t\t\t\t\tif (ni==0)\n\t\t\t\t\t{\n\t\t\t\t\t\tni=1;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tni=9;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// end of numeric string ?\n\t\t\t\tif (!(IsADigit(sc.ch)))\n\t\t\t\t{\n\t\t\t\t\tif (ni==9)\n\t\t\t\t\t{\n\t\t\t\t\t\tsc.ChangeState(SCE_AU3_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SCE_AU3_VARIABLE:\n\t\t\t{\n\t\t\t\t// Check if its a COMObject\n\t\t\t\tif (sc.ch == '.' && !IsADigit(sc.chNext)) {\n\t\t\t\t\tsc.SetState(SCE_AU3_OPERATOR);\n\t\t\t\t}\n\t\t\t\telse if (!IsAWordChar(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n            }\n\t\t\tcase SCE_AU3_COMOBJ:\n\t\t\t{\n\t\t\t\tif (!(IsAWordChar(sc.ch))) {\n\t\t\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n            }\n            case SCE_AU3_STRING:\n            {\n\t\t\t\t// check for \" to end a double qouted string or\n\t\t\t\t// check for ' to end a single qouted string\n\t            if ((si == 1 && sc.ch == '\\\"') || (si == 2 && sc.ch == '\\'') || (si == 3 && sc.ch == '>'))\n\t\t\t\t{\n\t\t\t\t\tsc.ForwardSetState(SCE_AU3_DEFAULT);\n\t\t\t\t\tsi=0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n                if (sc.atLineEnd)\n\t\t\t\t{\n\t\t\t\t\tsi=0;\n\t\t\t\t\t// at line end and not found a continuation char then reset to default\n\t\t\t\t\tint lineCurrent = styler.GetLine(sc.currentPos);\n\t\t\t\t\tif (!IsContinuationLine(lineCurrent,styler))\n\t\t\t\t\t{\n\t\t\t\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// find Sendkeys in a STRING\n\t\t\t\tif (sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' ) {\n\t\t\t\t\tsc.SetState(SCE_AU3_SENT);}\n\t\t\t\tbreak;\n            }\n\n            case SCE_AU3_SENT:\n            {\n\t\t\t\t// Send key string ended\n\t\t\t\tif (sc.chPrev == '}' && sc.ch != '}')\n\t\t\t\t{\n\t\t\t\t\t// set color to SENDKEY when valid sendkey .. else set back to regular string\n\t\t\t\t\tchar sk[100];\n\t\t\t\t\t// split {111 222} and return {111} and check if 222 is valid.\n\t\t\t\t\t// if return code = 1 then invalid 222 so must be string\n\t\t\t\t\tif (GetSendKey(s,sk))\n\t\t\t\t\t{\n\t\t\t\t\t\tsc.ChangeState(SCE_AU3_STRING);\n\t\t\t\t\t}\n\t\t\t\t\t// if single char between {?} then its ok as sendkey for a single character\n\t\t\t\t\telse if (strlen(sk) == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\tsc.ChangeState(SCE_AU3_SENT);\n\t\t\t\t\t}\n\t\t\t\t\t// if sendkey {111} is in table then ok as sendkey\n\t\t\t\t\telse if (keywords4.InList(sk))\n\t\t\t\t\t{\n\t\t\t\t\t\tsc.ChangeState(SCE_AU3_SENT);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tsc.ChangeState(SCE_AU3_STRING);\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(SCE_AU3_STRING);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// check if the start is a valid SendKey start\n\t\t\t\t\tint\t\tnPos\t= 0;\n\t\t\t\t\tint\t\tnState\t= 1;\n\t\t\t\t\tchar\tcTemp;\n\t\t\t\t\twhile (!(nState == 2) && ((cTemp = s[nPos]) != '\\0'))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (cTemp == '{' && nState == 1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnState = 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (nState == 1 && !(cTemp == '+' || cTemp == '!' || cTemp == '^' || cTemp == '#' ))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnState = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnPos++;\n\t\t\t\t\t}\n\t\t\t\t\t//Verify characters infront of { ... if not assume  regular string\n\t\t\t\t\tif (nState == 1 && (!(sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' ))) {\n\t\t\t\t\t\tsc.ChangeState(SCE_AU3_STRING);\n\t\t\t\t\t\tsc.SetState(SCE_AU3_STRING);\n\t\t\t\t\t}\n\t\t\t\t\t// If invalid character found then assume its a regular string\n\t\t\t\t\tif (nState == 0) {\n\t\t\t\t\t\tsc.ChangeState(SCE_AU3_STRING);\n\t\t\t\t\t\tsc.SetState(SCE_AU3_STRING);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// check if next portion is again a sendkey\n\t\t\t\tif (sc.atLineEnd)\n\t\t\t\t{\n\t\t\t\t\tsc.ChangeState(SCE_AU3_STRING);\n\t\t\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t\t\t\tsi = 0;  // reset string indicator\n\t\t\t\t}\n\t\t\t\t//* check in next characters following a sentkey are again a sent key\n\t\t\t\t// Need this test incase of 2 sentkeys like {F1}{ENTER} but not detect {{}\n\t\t\t\tif (sc.state == SCE_AU3_STRING && (sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' )) {\n\t\t\t\t\tsc.SetState(SCE_AU3_SENT);}\n\t\t\t\t// check to see if the string ended...\n\t\t\t\t// Sendkey string isn't complete but the string ended....\n\t\t\t\tif ((si == 1 && sc.ch == '\\\"') || (si == 2 && sc.ch == '\\''))\n\t\t\t\t{\n\t\t\t\t\tsc.ChangeState(SCE_AU3_STRING);\n\t\t\t\t\tsc.ForwardSetState(SCE_AU3_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n            }\n        }  //switch (sc.state)\n\n        // Determine if a new state should be entered:\n\n\t\tif (sc.state == SCE_AU3_DEFAULT)\n        {\n            if (sc.ch == ';') {sc.SetState(SCE_AU3_COMMENT);}\n            else if (sc.ch == '#') {sc.SetState(SCE_AU3_KEYWORD);}\n            else if (sc.ch == '$') {sc.SetState(SCE_AU3_VARIABLE);}\n            else if (sc.ch == '.' && !IsADigit(sc.chNext)) {sc.SetState(SCE_AU3_OPERATOR);}\n            else if (sc.ch == '@') {sc.SetState(SCE_AU3_KEYWORD);}\n            //else if (sc.ch == '_') {sc.SetState(SCE_AU3_KEYWORD);}\n            else if (sc.ch == '<' && si==3) {sc.SetState(SCE_AU3_STRING);}  // string after #include\n            else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_AU3_STRING);\n\t\t\t\tsi = 1;\t}\n            else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_AU3_STRING);\n\t\t\t\tsi = 2;\t}\n            else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext)))\n\t\t\t{\n\t\t\t\tsc.SetState(SCE_AU3_NUMBER);\n\t\t\t\tni = 0;\n\t\t\t}\n            else if (IsAWordStart(sc.ch)) {sc.SetState(SCE_AU3_KEYWORD);}\n            else if (IsAOperator(static_cast<char>(sc.ch))) {sc.SetState(SCE_AU3_OPERATOR);}\n\t\t\telse if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);}\n        }\n    }      //for (; sc.More(); sc.Forward())\n\n\t//*************************************\n\t// Colourize the last word correctly\n\t//*************************************\n\tif (sc.state == SCE_AU3_KEYWORD)\n\t\t{\n\t\tif (strcmp(s_save, \"#cs\")== 0 || strcmp(s_save, \"#comments-start\")== 0 )\n\t\t{\n\t\t\tsc.ChangeState(SCE_AU3_COMMENTBLOCK);\n\t\t\tsc.SetState(SCE_AU3_COMMENTBLOCK);\n\t\t}\n\t\telse if (keywords.InList(s_save)) {\n\t\t\tsc.ChangeState(SCE_AU3_KEYWORD);\n\t\t\tsc.SetState(SCE_AU3_KEYWORD);\n\t\t}\n\t\telse if (keywords2.InList(s_save)) {\n\t\t\tsc.ChangeState(SCE_AU3_FUNCTION);\n\t\t\tsc.SetState(SCE_AU3_FUNCTION);\n\t\t}\n\t\telse if (keywords3.InList(s_save)) {\n\t\t\tsc.ChangeState(SCE_AU3_MACRO);\n\t\t\tsc.SetState(SCE_AU3_MACRO);\n\t\t}\n\t\telse if (keywords5.InList(s_save)) {\n\t\t\tsc.ChangeState(SCE_AU3_PREPROCESSOR);\n\t\t\tsc.SetState(SCE_AU3_PREPROCESSOR);\n\t\t}\n\t\telse if (keywords6.InList(s_save)) {\n\t\t\tsc.ChangeState(SCE_AU3_SPECIAL);\n\t\t\tsc.SetState(SCE_AU3_SPECIAL);\n\t\t}\n\t\telse if (keywords7.InList(s_save) && sc.atLineEnd) {\n\t\t\tsc.ChangeState(SCE_AU3_EXPAND);\n\t\t\tsc.SetState(SCE_AU3_EXPAND);\n\t\t}\n\t\telse if (keywords8.InList(s_save)) {\n\t\t\tsc.ChangeState(SCE_AU3_UDF);\n\t\t\tsc.SetState(SCE_AU3_UDF);\n\t\t}\n\t\telse {\n\t\t\tsc.ChangeState(SCE_AU3_DEFAULT);\n\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t}\n\t}\n\tif (sc.state == SCE_AU3_SENT)\n    {\n\t\t// Send key string ended\n\t\tif (sc.chPrev == '}' && sc.ch != '}')\n\t\t{\n\t\t\t// set color to SENDKEY when valid sendkey .. else set back to regular string\n\t\t\tchar sk[100];\n\t\t\t// split {111 222} and return {111} and check if 222 is valid.\n\t\t\t// if return code = 1 then invalid 222 so must be string\n\t\t\tif (GetSendKey(s_save,sk))\n\t\t\t{\n\t\t\t\tsc.ChangeState(SCE_AU3_STRING);\n\t\t\t}\n\t\t\t// if single char between {?} then its ok as sendkey for a single character\n\t\t\telse if (strlen(sk) == 3)\n\t\t\t{\n\t\t\t\tsc.ChangeState(SCE_AU3_SENT);\n\t\t\t}\n\t\t\t// if sendkey {111} is in table then ok as sendkey\n\t\t\telse if (keywords4.InList(sk))\n\t\t\t{\n\t\t\t\tsc.ChangeState(SCE_AU3_SENT);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsc.ChangeState(SCE_AU3_STRING);\n\t\t\t}\n\t\t\tsc.SetState(SCE_AU3_STRING);\n\t\t}\n\t\t// check if next portion is again a sendkey\n\t\tif (sc.atLineEnd)\n\t\t{\n\t\t\tsc.ChangeState(SCE_AU3_STRING);\n\t\t\tsc.SetState(SCE_AU3_DEFAULT);\n\t\t}\n    }\n\t//*************************************\n\tsc.Complete();\n}\n\n//\nstatic bool IsStreamCommentStyle(int style) {\n\treturn style == SCE_AU3_COMMENT || style == SCE_AU3_COMMENTBLOCK;\n}\n\n//\n// Routine to find first none space on the current line and return its Style\n// needed for comment lines not starting on pos 1\nstatic int GetStyleFirstWord(unsigned int szLine, Accessor &styler)\n{\n\tint nsPos = styler.LineStart(szLine);\n\tint nePos = styler.LineStart(szLine+1) - 1;\n\twhile (isspacechar(styler.SafeGetCharAt(nsPos)) && nsPos < nePos)\n\t{\n\t\tnsPos++; // skip to next char\n\n\t} // End While\n\treturn styler.StyleAt(nsPos);\n\n} // GetStyleFirstWord()\n\n\n//\nstatic void FoldAU3Doc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)\n{\n\tint endPos = startPos + length;\n\t// get settings from the config files for folding comments and preprocessor lines\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldInComment = styler.GetPropertyInt(\"fold.comment\") == 2;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tbool foldpreprocessor = styler.GetPropertyInt(\"fold.preprocessor\") != 0;\n\t// Backtrack to previous line in case need to fix its fold status\n\tint lineCurrent = styler.GetLine(startPos);\n\tif (startPos > 0) {\n\t\tif (lineCurrent > 0) {\n\t\t\tlineCurrent--;\n\t\t\tstartPos = styler.LineStart(lineCurrent);\n\t\t}\n\t}\n\t// vars for style of previous/current/next lines\n\tint style = GetStyleFirstWord(lineCurrent,styler);\n\tint stylePrev = 0;\n\t// find the first previous line without continuation character at the end\n\twhile ((lineCurrent > 0 && IsContinuationLine(lineCurrent,styler)) ||\n\t       (lineCurrent > 1 && IsContinuationLine(lineCurrent-1,styler))) {\n\t\tlineCurrent--;\n\t\tstartPos = styler.LineStart(lineCurrent);\n\t}\n\tif (lineCurrent > 0) {\n\t\tstylePrev = GetStyleFirstWord(lineCurrent-1,styler);\n\t}\n\t// vars for getting first word to check for keywords\n\tbool FirstWordStart = false;\n\tbool FirstWordEnd = false;\n\tchar szKeyword[11]=\"\";\n\tint\t szKeywordlen = 0;\n\tchar szThen[5]=\"\";\n\tint\t szThenlen = 0;\n\tbool ThenFoundLast = false;\n\t// var for indentlevel\n\tint levelCurrent = SC_FOLDLEVELBASE;\n\tif (lineCurrent > 0)\n\t\tlevelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n\tint levelNext = levelCurrent;\n\t//\n\tint\tvisibleChars = 0;\n\tchar chNext = styler.SafeGetCharAt(startPos);\n\tchar chPrev = ' ';\n\t//\n\tfor (int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tif (IsAWordChar(ch)) {\n\t\t\tvisibleChars++;\n\t\t}\n\t\t// get the syle for the current character neede to check in comment\n\t\tint stylech = styler.StyleAt(i);\n\t\t// get first word for the line for indent check max 9 characters\n\t\tif (FirstWordStart && (!(FirstWordEnd))) {\n\t\t\tif (!IsAWordChar(ch)) {\n\t\t\t\tFirstWordEnd = true;\n\t\t\t\tszKeyword[szKeywordlen] = '\\0';\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (szKeywordlen < 10) {\n\t\t\t\tszKeyword[szKeywordlen++] = static_cast<char>(tolower(ch));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// start the capture of the first word\n\t\tif (!(FirstWordStart)) {\n\t\t\tif (IsAWordChar(ch) || IsAWordStart(ch) || ch == ';') {\n\t\t\t\tFirstWordStart = true;\n\t\t\t\tszKeyword[szKeywordlen++] = static_cast<char>(tolower(ch));\n\t\t\t}\n\t\t}\n\t\t// only process this logic when not in comment section\n\t\tif (!(stylech == SCE_AU3_COMMENT)) {\n\t\t\tif (ThenFoundLast) {\n\t\t\t\tif (IsAWordChar(ch)) {\n\t\t\t\t\tThenFoundLast = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// find out if the word \"then\" is the last on a \"if\" line\n\t\t\tif (FirstWordEnd && strcmp(szKeyword,\"if\") == 0) {\n\t\t\t\tif (szThenlen == 4) {\n\t\t\t\t\tszThen[0] = szThen[1];\n\t\t\t\t\tszThen[1] = szThen[2];\n\t\t\t\t\tszThen[2] = szThen[3];\n\t\t\t\t\tszThen[3] = static_cast<char>(tolower(ch));\n\t\t\t\t\tif (strcmp(szThen,\"then\") == 0 ) {\n\t\t\t\t\t\tThenFoundLast = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tszThen[szThenlen++] = static_cast<char>(tolower(ch));\n\t\t\t\t\tif (szThenlen == 5) {\n\t\t\t\t\t\tszThen[4] = '\\0';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// End of Line found so process the information\n\t\tif ((ch == '\\r' && chNext != '\\n') || (ch == '\\n') || (i == endPos)) {\n\t\t\t// **************************\n\t\t\t// Folding logic for Keywords\n\t\t\t// **************************\n\t\t\t// if a keyword is found on the current line and the line doesn't end with _ (continuation)\n\t\t\t//    and we are not inside a commentblock.\n\t\t\tif (szKeywordlen > 0 && (!(chPrev == '_')) &&\n\t\t\t\t((!(IsStreamCommentStyle(style)) || foldInComment)) ) {\n\t\t\t\tszKeyword[szKeywordlen] = '\\0';\n\t\t\t\t// only fold \"if\" last keyword is \"then\"  (else its a one line if)\n\t\t\t\tif (strcmp(szKeyword,\"if\") == 0  && ThenFoundLast) {\n\t\t\t\t\t\tlevelNext++;\n\t\t\t\t}\n\t\t\t\t// create new fold for these words\n\t\t\t\tif (strcmp(szKeyword,\"do\") == 0   || strcmp(szKeyword,\"for\") == 0 ||\n\t\t\t\t\tstrcmp(szKeyword,\"func\") == 0 || strcmp(szKeyword,\"while\") == 0||\n\t\t\t\t\tstrcmp(szKeyword,\"with\") == 0 || strcmp(szKeyword,\"#region\") == 0 ) {\n\t\t\t\t\t\tlevelNext++;\n\t\t\t\t}\n\t\t\t\t// create double Fold for select&switch because Case will subtract one of the current level\n\t\t\t\tif (strcmp(szKeyword,\"select\") == 0 || strcmp(szKeyword,\"switch\") == 0) {\n\t\t\t\t\t\tlevelNext++;\n\t\t\t\t\t\tlevelNext++;\n\t\t\t\t}\n\t\t\t\t// end the fold for these words before the current line\n\t\t\t\tif (strcmp(szKeyword,\"endfunc\") == 0 || strcmp(szKeyword,\"endif\") == 0 ||\n\t\t\t\t\tstrcmp(szKeyword,\"next\") == 0    || strcmp(szKeyword,\"until\") == 0 ||\n\t\t\t\t\tstrcmp(szKeyword,\"endwith\") == 0 ||strcmp(szKeyword,\"wend\") == 0){\n\t\t\t\t\t\tlevelNext--;\n\t\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\t\t\t\t// end the fold for these words before the current line and Start new fold\n\t\t\t\tif (strcmp(szKeyword,\"case\") == 0      || strcmp(szKeyword,\"else\") == 0 ||\n\t\t\t\t\tstrcmp(szKeyword,\"elseif\") == 0 ) {\n\t\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\t\t\t\t// end the double fold for this word before the current line\n\t\t\t\tif (strcmp(szKeyword,\"endselect\") == 0 || strcmp(szKeyword,\"endswitch\") == 0 ) {\n\t\t\t\t\t\tlevelNext--;\n\t\t\t\t\t\tlevelNext--;\n\t\t\t\t\t\tlevelCurrent--;\n\t\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\t\t\t\t// end the fold for these words on the current line\n\t\t\t\tif (strcmp(szKeyword,\"#endregion\") == 0 ) {\n\t\t\t\t\t\tlevelNext--;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Preprocessor and Comment folding\n\t\t\tint styleNext = GetStyleFirstWord(lineCurrent + 1,styler);\n\t\t\t// *************************************\n\t\t\t// Folding logic for preprocessor blocks\n\t\t\t// *************************************\n\t\t\t// process preprosessor line\n\t\t\tif (foldpreprocessor && style == SCE_AU3_PREPROCESSOR) {\n\t\t\t\tif (!(stylePrev == SCE_AU3_PREPROCESSOR) && (styleNext == SCE_AU3_PREPROCESSOR)) {\n\t\t\t\t    levelNext++;\n\t\t\t\t}\n\t\t\t\t// fold till the last line for normal comment lines\n\t\t\t\telse if (stylePrev == SCE_AU3_PREPROCESSOR && !(styleNext == SCE_AU3_PREPROCESSOR)) {\n\t\t\t\t\tlevelNext--;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// *********************************\n\t\t\t// Folding logic for Comment blocks\n\t\t\t// *********************************\n\t\t\tif (foldComment && IsStreamCommentStyle(style)) {\n\t\t\t\t// Start of a comment block\n\t\t\t\tif (!(stylePrev==style) && IsStreamCommentStyle(styleNext) && styleNext==style) {\n\t\t\t\t    levelNext++;\n\t\t\t\t}\n\t\t\t\t// fold till the last line for normal comment lines\n\t\t\t\telse if (IsStreamCommentStyle(stylePrev)\n\t\t\t\t\t\t&& !(styleNext == SCE_AU3_COMMENT)\n\t\t\t\t\t\t&& stylePrev == SCE_AU3_COMMENT\n\t\t\t\t\t\t&& style == SCE_AU3_COMMENT) {\n\t\t\t\t\tlevelNext--;\n\t\t\t\t}\n\t\t\t\t// fold till the one but last line for Blockcomment lines\n\t\t\t\telse if (IsStreamCommentStyle(stylePrev)\n\t\t\t\t\t\t&& !(styleNext == SCE_AU3_COMMENTBLOCK)\n\t\t\t\t\t\t&& style == SCE_AU3_COMMENTBLOCK) {\n\t\t\t\t\tlevelNext--;\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\t\t\t}\n\t\t\tint levelUse = levelCurrent;\n\t\t\tint lev = levelUse | levelNext << 16;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (levelUse < levelNext) {\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t}\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\t// reset values for the next line\n\t\t\tlineCurrent++;\n\t\t\tstylePrev = style;\n\t\t\tstyle = styleNext;\n\t\t\tlevelCurrent = levelNext;\n\t\t\tvisibleChars = 0;\n\t\t\t// if the last character is an Underscore then don't reset since the line continues on the next line.\n\t\t\tif (!(chPrev == '_')) {\n\t\t\t\tszKeywordlen = 0;\n\t\t\t\tszThenlen = 0;\n\t\t\t\tFirstWordStart = false;\n\t\t\t\tFirstWordEnd = false;\n\t\t\t\tThenFoundLast = false;\n\t\t\t}\n\t\t}\n\t\t// save the last processed character\n\t\tif (!isspacechar(ch)) {\n\t\t\tchPrev = ch;\n\t\t\tvisibleChars++;\n\t\t}\n\t}\n}\n\n\n//\n\nstatic const char * const AU3WordLists[] = {\n    \"#autoit keywords\",\n    \"#autoit functions\",\n    \"#autoit macros\",\n    \"#autoit Sent keys\",\n    \"#autoit Pre-processors\",\n    \"#autoit Special\",\n    \"#autoit Expand\",\n    \"#autoit UDF\",\n    0\n};\nLexerModule lmAU3(SCLEX_AU3, ColouriseAU3Doc, \"au3\", FoldAU3Doc , AU3WordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexAVE.cpp",
    "content": "// SciTE - Scintilla based Text Editor\n/** @file LexAVE.cxx\n ** Lexer for Avenue.\n **\n  ** Written by Alexey Yutkin <yutkin@geol.msu.ru>.\n **/\n// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');\n}\nstatic inline bool IsEnumChar(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch)|| ch == '_');\n}\nstatic inline bool IsANumberChar(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '.' );\n}\n\ninline bool IsAWordStart(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_');\n}\n\ninline bool isAveOperator(char ch) {\n\tif (IsASCII(ch) && isalnum(ch))\n\t\treturn false;\n\t// '.' left out as it is used to make up numbers\n\tif (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||\n\t\tch == '(' || ch == ')' || ch == '=' ||\n\t\tch == '{' || ch == '}' ||\n\t\tch == '[' || ch == ']' || ch == ';' ||\n\t\tch == '<' || ch == '>' || ch == ',' ||\n\t\tch == '.'  )\n\t\treturn true;\n\treturn false;\n}\n\nstatic void ColouriseAveDoc(\n\tunsigned int startPos,\n\tint length,\n\tint initStyle,\n\tWordList *keywordlists[],\n\tAccessor &styler) {\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\tWordList &keywords4 = *keywordlists[3];\n\tWordList &keywords5 = *keywordlists[4];\n\tWordList &keywords6 = *keywordlists[5];\n\n\t// Do not leak onto next line\n\tif (initStyle == SCE_AVE_STRINGEOL) {\n\t\tinitStyle = SCE_AVE_DEFAULT;\n\t}\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\t\tif (sc.atLineEnd) {\n\t\t\t// Update the line state, so it can be seen by next line\n\t\t\tint currentLine = styler.GetLine(sc.currentPos);\n\t\t\tstyler.SetLineState(currentLine, 0);\n\t\t}\n\t\tif (sc.atLineStart && (sc.state == SCE_AVE_STRING)) {\n\t\t\t// Prevent SCE_AVE_STRINGEOL from leaking back to previous line\n\t\t\tsc.SetState(SCE_AVE_STRING);\n\t\t}\n\n\n\t\t// Determine if the current state should terminate.\n\t\tif (sc.state == SCE_AVE_OPERATOR) {\n\t\t\tsc.SetState(SCE_AVE_DEFAULT);\n\t\t} else if (sc.state == SCE_AVE_NUMBER) {\n\t\t\tif (!IsANumberChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_AVE_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_AVE_ENUM) {\n\t\t\tif (!IsEnumChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_AVE_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_AVE_IDENTIFIER) {\n\t\t\tif (!IsAWordChar(sc.ch) || (sc.ch == '.')) {\n\t\t\t\tchar s[100];\n\t\t\t\t//sc.GetCurrent(s, sizeof(s));\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_AVE_WORD);\n\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_AVE_WORD2);\n\t\t\t\t} else if (keywords3.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_AVE_WORD3);\n\t\t\t\t} else if (keywords4.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_AVE_WORD4);\n\t\t\t\t} else if (keywords5.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_AVE_WORD5);\n\t\t\t\t} else if (keywords6.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_AVE_WORD6);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_AVE_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_AVE_COMMENT) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_AVE_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_AVE_STRING) {\n\t\t\t if (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_AVE_DEFAULT);\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.ChangeState(SCE_AVE_STRINGEOL);\n\t\t\t\tsc.ForwardSetState(SCE_AVE_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_AVE_DEFAULT) {\n\t\t\tif (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_AVE_NUMBER);\n\t\t\t} else if (IsAWordStart(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_AVE_IDENTIFIER);\n\t\t\t} else if (sc.Match('\\\"')) {\n\t\t\t\tsc.SetState(SCE_AVE_STRING);\n\t\t\t} else if (sc.Match('\\'')) {\n\t\t\t\tsc.SetState(SCE_AVE_COMMENT);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (isAveOperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_AVE_OPERATOR);\n\t\t\t} else if (sc.Match('#')) {\n\t\t\t\tsc.SetState(SCE_AVE_ENUM);\n\t\t\t\tsc.Forward();\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n}\n\nstatic void FoldAveDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[],\n                       Accessor &styler) {\n\tunsigned int lengthDoc = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = static_cast<char>(tolower(styler[startPos]));\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tint styleNext = styler.StyleAt(startPos);\n\tchar s[10] = \"\";\n\n\tfor (unsigned int i = startPos; i < lengthDoc; i++) {\n\t\tchar ch = static_cast<char>(tolower(chNext));\n\t\tchNext = static_cast<char>(tolower(styler.SafeGetCharAt(i + 1)));\n\t\tint style = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (style == SCE_AVE_WORD) {\n\t\t\tif (ch == 't' || ch == 'f' || ch == 'w' || ch == 'e') {\n\t\t\t\tfor (unsigned int j = 0; j < 6; j++) {\n\t\t\t\t\tif (!iswordchar(styler[i + j])) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\ts[j] = static_cast<char>(tolower(styler[i + j]));\n\t\t\t\t\ts[j + 1] = '\\0';\n\t\t\t\t}\n\n\t\t\t\tif ((strcmp(s, \"then\") == 0) || (strcmp(s, \"for\") == 0) || (strcmp(s, \"while\") == 0)) {\n\t\t\t\t\tlevelCurrent++;\n\t\t\t\t}\n\t\t\t\tif ((strcmp(s, \"end\") == 0) || (strcmp(s, \"elseif\") == 0)) {\n\t\t\t\t\t// Normally \"elseif\" and \"then\" will be on the same line and will cancel\n\t\t\t\t\t// each other out.  // As implemented, this does not support fold.at.else.\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (style == SCE_AVE_OPERATOR) {\n\t\t\tif (ch == '{' || ch == '(') {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (ch == '}' || ch == ')') {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact) {\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\t}\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0)) {\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t}\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch)) {\n\t\t\tvisibleChars++;\n\t\t}\n\t}\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nLexerModule lmAVE(SCLEX_AVE, ColouriseAveDoc, \"ave\", FoldAveDoc);\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexAVS.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexAVS.cxx\n ** Lexer for AviSynth.\n **/\n// Copyright 2012 by Bruno Barbieri <brunorex@gmail.com>\n// Heavily based on LexPOV by Neil Hodgson\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_');\n}\n\nstatic inline bool IsAWordStart(int ch) {\n\treturn isalpha(ch) || (ch != ' ' && ch != '\\n' && ch != '(' && ch != '.' && ch != ',');\n}\n\nstatic inline bool IsANumberChar(int ch) {\n\t// Not exactly following number definition (several dots are seen as OK, etc.)\n\t// but probably enough in most cases.\n\treturn (ch < 0x80) &&\n\t\t\t(isdigit(ch) || ch == '.' || ch == '-' || ch == '+');\n}\n\nstatic void ColouriseAvsDoc(\n\tunsigned int startPos,\n\tint length,\n\tint initStyle,\n\tWordList *keywordlists[],\n\tAccessor &styler) {\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &filters = *keywordlists[1];\n\tWordList &plugins = *keywordlists[2];\n\tWordList &functions = *keywordlists[3];\n\tWordList &clipProperties = *keywordlists[4];\n\tWordList &userDefined = *keywordlists[5];\n\n\tint currentLine = styler.GetLine(startPos);\n\t// Initialize the block comment nesting level, if we are inside such a comment.\n\tint blockCommentLevel = 0;\n\tif (initStyle == SCE_AVS_COMMENTBLOCK || initStyle == SCE_AVS_COMMENTBLOCKN) {\n\t\tblockCommentLevel = styler.GetLineState(currentLine - 1);\n\t}\n\n\t// Do not leak onto next line\n\tif (initStyle == SCE_AVS_COMMENTLINE) {\n\t\tinitStyle = SCE_AVS_DEFAULT;\n\t}\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\t\tif (sc.atLineEnd) {\n\t\t\t// Update the line state, so it can be seen by next line\n\t\t\tcurrentLine = styler.GetLine(sc.currentPos);\n\t\t\tif (sc.state == SCE_AVS_COMMENTBLOCK || sc.state == SCE_AVS_COMMENTBLOCKN) {\n\t\t\t\t// Inside a block comment, we set the line state\n\t\t\t\tstyler.SetLineState(currentLine, blockCommentLevel);\n\t\t\t} else {\n\t\t\t\t// Reset the line state\n\t\t\t\tstyler.SetLineState(currentLine, 0);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Determine if the current state should terminate.\n\t\tif (sc.state == SCE_AVS_OPERATOR) {\n\t\t\tsc.SetState(SCE_AVS_DEFAULT);\n\t\t} else if (sc.state == SCE_AVS_NUMBER) {\n\t\t\t// We stop the number definition on non-numerical non-dot non-sign char\n\t\t\tif (!IsANumberChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_AVS_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_AVS_IDENTIFIER) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\n\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_AVS_KEYWORD);\n\t\t\t\t} else if (filters.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_AVS_FILTER);\n\t\t\t\t} else if (plugins.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_AVS_PLUGIN);\n\t\t\t\t} else if (functions.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_AVS_FUNCTION);\n\t\t\t\t} else if (clipProperties.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_AVS_CLIPPROP);\n\t\t\t\t} else if (userDefined.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_AVS_USERDFN);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_AVS_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_AVS_COMMENTBLOCK) {\n\t\t\tif (sc.Match('/', '*')) {\n\t\t\t\tblockCommentLevel++;\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.Match('*', '/') && blockCommentLevel > 0) {\n\t\t\t\tblockCommentLevel--;\n\t\t\t\tsc.Forward();\n\t\t\t\tif (blockCommentLevel == 0) {\n\t\t\t\t\tsc.ForwardSetState(SCE_AVS_DEFAULT);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (sc.state == SCE_AVS_COMMENTBLOCKN) {\n\t\t\tif (sc.Match('[', '*')) {\n\t\t\t\tblockCommentLevel++;\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.Match('*', ']') && blockCommentLevel > 0) {\n\t\t\t\tblockCommentLevel--;\n\t\t\t\tsc.Forward();\n\t\t\t\tif (blockCommentLevel == 0) {\n\t\t\t\t\tsc.ForwardSetState(SCE_AVS_DEFAULT);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (sc.state == SCE_AVS_COMMENTLINE) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.ForwardSetState(SCE_AVS_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_AVS_STRING) {\n\t\t\tif (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_AVS_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_AVS_TRIPLESTRING) {\n\t\t\tif (sc.Match(\"\\\"\\\"\\\"\")) {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.ForwardSetState(SCE_AVS_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_AVS_DEFAULT) {\n\t\t\tif (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_AVS_NUMBER);\n\t\t\t} else \tif (IsADigit(sc.ch) || (sc.ch == ',' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.SetState(SCE_AVS_NUMBER);\n\t\t\t} else if (sc.Match('/', '*')) {\n\t\t\t\tblockCommentLevel = 1;\n\t\t\t\tsc.SetState(SCE_AVS_COMMENTBLOCK);\n\t\t\t\tsc.Forward();\t// Eat the * so it isn't used for the end of the comment\n\t\t\t} else if (sc.Match('[', '*')) {\n\t\t\t\tblockCommentLevel = 1;\n\t\t\t\tsc.SetState(SCE_AVS_COMMENTBLOCKN);\n\t\t\t\tsc.Forward();\t// Eat the * so it isn't used for the end of the comment\n\t\t\t} else if (sc.ch == '#') {\n\t\t\t\tsc.SetState(SCE_AVS_COMMENTLINE);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tif (sc.Match(\"\\\"\\\"\\\"\")) {\n\t\t\t\t\tsc.SetState(SCE_AVS_TRIPLESTRING);\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_AVS_STRING);\n\t\t\t\t}\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_AVS_OPERATOR);\n\t\t\t} else if (IsAWordStart(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_AVS_IDENTIFIER);\n\t\t\t}\n\t\t}\n\t}\n\n\t// End of file: complete any pending changeState\n\tif (sc.state == SCE_AVS_IDENTIFIER) {\n\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\tchar s[100];\n\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\n\t\t\tif (keywords.InList(s)) {\n\t\t\t\tsc.ChangeState(SCE_AVS_KEYWORD);\n\t\t\t} else if (filters.InList(s)) {\n\t\t\t\tsc.ChangeState(SCE_AVS_FILTER);\n\t\t\t} else if (plugins.InList(s)) {\n\t\t\t\tsc.ChangeState(SCE_AVS_PLUGIN);\n\t\t\t} else if (functions.InList(s)) {\n\t\t\t\tsc.ChangeState(SCE_AVS_FUNCTION);\n\t\t\t} else if (clipProperties.InList(s)) {\n\t\t\t\tsc.ChangeState(SCE_AVS_CLIPPROP);\n\t\t\t} else if (userDefined.InList(s)) {\n\t\t\t\tsc.ChangeState(SCE_AVS_USERDFN);\n\t\t\t}\n\t\t\tsc.SetState(SCE_AVS_DEFAULT);\n\t\t}\n\t}\n\n\tsc.Complete();\n}\n\nstatic void FoldAvsDoc(\n\tunsigned int startPos,\n\tint length,\n\tint initStyle,\n\tWordList *[],\n\tAccessor &styler) {\n\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (foldComment && style == SCE_AVS_COMMENTBLOCK) {\n\t\t\tif (stylePrev != SCE_AVS_COMMENTBLOCK) {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if ((styleNext != SCE_AVS_COMMENTBLOCK) && !atEOL) {\n\t\t\t\t// Comments don't end at end of line and the next character may be unstyled.\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\n\t\tif (foldComment && style == SCE_AVS_COMMENTBLOCKN) {\n\t\t\tif (stylePrev != SCE_AVS_COMMENTBLOCKN) {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if ((styleNext != SCE_AVS_COMMENTBLOCKN) && !atEOL) {\n\t\t\t\t// Comments don't end at end of line and the next character may be unstyled.\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\n\t\tif (style == SCE_AVS_OPERATOR) {\n\t\t\tif (ch == '{') {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (ch == '}') {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nstatic const char * const avsWordLists[] = {\n\t\"Keywords\",\n\t\"Filters\",\n\t\"Plugins\",\n\t\"Functions\",\n\t\"Clip properties\",\n\t\"User defined functions\",\n\t0,\n};\n\nLexerModule lmAVS(SCLEX_AVS, ColouriseAvsDoc, \"avs\", FoldAvsDoc, avsWordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexAbaqus.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexABAQUS.cxx\n ** Lexer for ABAQUS. Based on the lexer for APDL by Hadar Raz.\n ** By Sergio Lucato.\n ** Sort of completely rewritten by Gertjan Kloosterman\n **/\n// The License.txt file describes the conditions under which this software may be distributed.\n\n// Code folding copyied and modified from LexBasic.cxx\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (ch < 0x80 && (isalnum(ch) || (ch == '_')));\n}\n\nstatic inline bool IsAKeywordChar(const int ch) {\n\treturn (ch < 0x80 && (isalnum(ch) || (ch == '_') || (ch == ' ')));\n}\n\nstatic inline bool IsASetChar(const int ch) {\n\treturn (ch < 0x80 && (isalnum(ch) || (ch == '_') || (ch == '.') || (ch == '-')));\n}\n\nstatic inline bool IsAnOperator(char ch) {\n\t// '.' left out as it is used to make up numbers\n\tif (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||\n\t\tch == '(' || ch == ')' || ch == '=' || ch == '^' ||\n\t\tch == '[' || ch == ']' || ch == '<' || ch == '&' ||\n\t\tch == '>' || ch == ',' || ch == '|' || ch == '~' ||\n\t\tch == '$' || ch == ':' || ch == '%')\n\t\treturn true;\n\treturn false;\n}\n\nstatic void ColouriseABAQUSDoc(unsigned int startPos, int length, int initStyle, WordList*[] /* *keywordlists[] */,\n                            Accessor &styler) {\n\tenum localState { KW_LINE_KW, KW_LINE_COMMA, KW_LINE_PAR, KW_LINE_EQ, KW_LINE_VAL, \\\n\t\t\t\t\t  DAT_LINE_VAL, DAT_LINE_COMMA,\\\n\t\t\t\t\t  COMMENT_LINE,\\\n\t\t\t\t\t  ST_ERROR, LINE_END } state ;\n\n\t// Do not leak onto next line\n\tstate = LINE_END ;\n\tinitStyle = SCE_ABAQUS_DEFAULT;\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\t// Things are actually quite simple\n\t// we have commentlines\n\t// keywordlines and datalines\n\t// On a data line there will only be colouring of numbers\n\t// a keyword line is constructed as\n\t// *word,[ paramname[=paramvalue]]*\n\t// if the line ends with a , the keyword line continues onto the new line\n\n\tfor (; sc.More(); sc.Forward()) {\n\t\tswitch ( state ) {\n        case KW_LINE_KW :\n            if ( sc.atLineEnd ) {\n                // finished the line in keyword state, switch to LINE_END\n                sc.SetState(SCE_ABAQUS_DEFAULT) ;\n                state = LINE_END ;\n            } else if ( IsAKeywordChar(sc.ch) ) {\n                // nothing changes\n                state = KW_LINE_KW ;\n            } else if ( sc.ch == ',' ) {\n                // Well well we say a comma, arguments *MUST* follow\n                sc.SetState(SCE_ABAQUS_OPERATOR) ;\n                state = KW_LINE_COMMA ;\n            } else {\n                // Flag an error\n                sc.SetState(SCE_ABAQUS_PROCESSOR) ;\n                state = ST_ERROR ;\n            }\n            // Done with processing\n            break ;\n        case KW_LINE_COMMA :\n            // acomma on a keywordline was seen\n            if ( IsAKeywordChar(sc.ch)) {\n                sc.SetState(SCE_ABAQUS_ARGUMENT) ;\n                state = KW_LINE_PAR ;\n            } else if ( sc.atLineEnd || (sc.ch == ',') ) {\n                // we remain in keyword mode\n                state = KW_LINE_COMMA ;\n            } else if ( sc.ch == ' ' ) {\n                sc.SetState(SCE_ABAQUS_DEFAULT) ;\n                state = KW_LINE_COMMA ;\n            } else {\n                // Anything else constitutes an error\n                sc.SetState(SCE_ABAQUS_PROCESSOR) ;\n                state = ST_ERROR ;\n            }\n            break ;\n        case KW_LINE_PAR :\n            if ( sc.atLineEnd ) {\n                sc.SetState(SCE_ABAQUS_DEFAULT) ;\n                state = LINE_END ;\n            } else if ( IsAKeywordChar(sc.ch) || (sc.ch == '-') ) {\n                // remain in this state\n                state = KW_LINE_PAR ;\n            } else if ( sc.ch == ',' ) {\n                sc.SetState(SCE_ABAQUS_OPERATOR) ;\n                state = KW_LINE_COMMA ;\n            } else if ( sc.ch == '=' ) {\n                sc.SetState(SCE_ABAQUS_OPERATOR) ;\n                state = KW_LINE_EQ ;\n            } else {\n                // Anything else constitutes an error\n                sc.SetState(SCE_ABAQUS_PROCESSOR) ;\n                state = ST_ERROR ;\n            }\n            break ;\n        case KW_LINE_EQ :\n            if ( sc.ch == ' ' ) {\n                sc.SetState(SCE_ABAQUS_DEFAULT) ;\n                // remain in this state\n                state = KW_LINE_EQ ;\n            } else if ( IsADigit(sc.ch) || (sc.ch == '-') || (sc.ch == '.' && IsADigit(sc.chNext)) ) {\n                sc.SetState(SCE_ABAQUS_NUMBER) ;\n                state = KW_LINE_VAL ;\n            } else if ( IsAKeywordChar(sc.ch) ) {\n                sc.SetState(SCE_ABAQUS_DEFAULT) ;\n                state = KW_LINE_VAL ;\n            } else if ( (sc.ch == '\\'') || (sc.ch == '\\\"') ) {\n                sc.SetState(SCE_ABAQUS_STRING) ;\n                state = KW_LINE_VAL ;\n            } else {\n                sc.SetState(SCE_ABAQUS_PROCESSOR) ;\n                state = ST_ERROR ;\n            }\n            break ;\n        case KW_LINE_VAL :\n            if ( sc.atLineEnd ) {\n                sc.SetState(SCE_ABAQUS_DEFAULT) ;\n                state = LINE_END ;\n            } else if ( IsASetChar(sc.ch) && (sc.state == SCE_ABAQUS_DEFAULT) ) {\n                // nothing changes\n                state = KW_LINE_VAL ;\n            } else if (( (IsADigit(sc.ch) || sc.ch == '.' || (sc.ch == 'e' || sc.ch == 'E') ||\n                    ((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E')))) &&\n                    (sc.state == SCE_ABAQUS_NUMBER)) {\n                // remain in number mode\n                state = KW_LINE_VAL ;\n            } else if (sc.state == SCE_ABAQUS_STRING) {\n                // accept everything until a closing quote\n                if ( sc.ch == '\\'' || sc.ch == '\\\"' ) {\n                    sc.SetState(SCE_ABAQUS_DEFAULT) ;\n                    state = KW_LINE_VAL ;\n                }\n            } else if ( sc.ch == ',' ) {\n                sc.SetState(SCE_ABAQUS_OPERATOR) ;\n                state = KW_LINE_COMMA ;\n            } else {\n                // anything else is an error\n                sc.SetState(SCE_ABAQUS_PROCESSOR) ;\n                state = ST_ERROR ;\n            }\n            break ;\n        case DAT_LINE_VAL :\n            if ( sc.atLineEnd ) {\n                sc.SetState(SCE_ABAQUS_DEFAULT) ;\n                state = LINE_END ;\n            } else if ( IsASetChar(sc.ch) && (sc.state == SCE_ABAQUS_DEFAULT) ) {\n                // nothing changes\n                state = DAT_LINE_VAL ;\n            } else if (( (IsADigit(sc.ch) || sc.ch == '.' || (sc.ch == 'e' || sc.ch == 'E') ||\n                    ((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E')))) &&\n                    (sc.state == SCE_ABAQUS_NUMBER)) {\n                // remain in number mode\n                state = DAT_LINE_VAL ;\n            } else if (sc.state == SCE_ABAQUS_STRING) {\n                // accept everything until a closing quote\n                if ( sc.ch == '\\'' || sc.ch == '\\\"' ) {\n                    sc.SetState(SCE_ABAQUS_DEFAULT) ;\n                    state = DAT_LINE_VAL ;\n                }\n            } else if ( sc.ch == ',' ) {\n                sc.SetState(SCE_ABAQUS_OPERATOR) ;\n                state = DAT_LINE_COMMA ;\n            } else {\n                // anything else is an error\n                sc.SetState(SCE_ABAQUS_PROCESSOR) ;\n                state = ST_ERROR ;\n            }\n            break ;\n        case DAT_LINE_COMMA :\n            // a comma on a data line was seen\n            if ( sc.atLineEnd ) {\n                sc.SetState(SCE_ABAQUS_DEFAULT) ;\n                state = LINE_END ;\n            } else if ( sc.ch == ' ' ) {\n                sc.SetState(SCE_ABAQUS_DEFAULT) ;\n                state = DAT_LINE_COMMA ;\n            } else if (sc.ch == ',')  {\n                sc.SetState(SCE_ABAQUS_OPERATOR) ;\n                state = DAT_LINE_COMMA ;\n            } else if ( IsADigit(sc.ch) || (sc.ch == '-')|| (sc.ch == '.' && IsADigit(sc.chNext)) ) {\n                sc.SetState(SCE_ABAQUS_NUMBER) ;\n                state = DAT_LINE_VAL ;\n            } else if ( IsAKeywordChar(sc.ch) ) {\n                sc.SetState(SCE_ABAQUS_DEFAULT) ;\n                state = DAT_LINE_VAL ;\n            } else if ( (sc.ch == '\\'') || (sc.ch == '\\\"') ) {\n                sc.SetState(SCE_ABAQUS_STRING) ;\n                state = DAT_LINE_VAL ;\n            } else {\n                sc.SetState(SCE_ABAQUS_PROCESSOR) ;\n                state = ST_ERROR ;\n            }\n            break ;\n        case COMMENT_LINE :\n            if ( sc.atLineEnd ) {\n                sc.SetState(SCE_ABAQUS_DEFAULT) ;\n                state = LINE_END ;\n            }\n            break ;\n        case ST_ERROR :\n            if ( sc.atLineEnd ) {\n                sc.SetState(SCE_ABAQUS_DEFAULT) ;\n                state = LINE_END ;\n            }\n            break ;\n        case LINE_END :\n            if ( sc.atLineEnd || sc.ch == ' ' ) {\n                // nothing changes\n                state = LINE_END ;\n            } else if ( sc.ch == '*' ) {\n                if ( sc.chNext == '*' ) {\n                    state = COMMENT_LINE ;\n                    sc.SetState(SCE_ABAQUS_COMMENT) ;\n                } else {\n                    state = KW_LINE_KW ;\n                    sc.SetState(SCE_ABAQUS_STARCOMMAND) ;\n                }\n            } else {\n                // it must be a data line, things are as if we are in DAT_LINE_COMMA\n                if ( sc.ch == ',' ) {\n                    sc.SetState(SCE_ABAQUS_OPERATOR) ;\n                    state = DAT_LINE_COMMA ;\n                } else if ( IsADigit(sc.ch) || (sc.ch == '-')|| (sc.ch == '.' && IsADigit(sc.chNext)) ) {\n                    sc.SetState(SCE_ABAQUS_NUMBER) ;\n                    state = DAT_LINE_VAL ;\n                } else if ( IsAKeywordChar(sc.ch) ) {\n                    sc.SetState(SCE_ABAQUS_DEFAULT) ;\n                    state = DAT_LINE_VAL ;\n                } else if ( (sc.ch == '\\'') || (sc.ch == '\\\"') ) {\n                    sc.SetState(SCE_ABAQUS_STRING) ;\n                    state = DAT_LINE_VAL ;\n                } else {\n                    sc.SetState(SCE_ABAQUS_PROCESSOR) ;\n                    state = ST_ERROR ;\n                }\n            }\n            break ;\n\t\t  }\n   }\n   sc.Complete();\n}\n\n//------------------------------------------------------------------------------\n// This copyied and modified from LexBasic.cxx\n//------------------------------------------------------------------------------\n\n/* Bits:\n * 1  - whitespace\n * 2  - operator\n * 4  - identifier\n * 8  - decimal digit\n * 16 - hex digit\n * 32 - bin digit\n */\nstatic int character_classification[128] =\n{\n    0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0,  1,  0,  0,\n    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n    1,  2,  0,  2,  2,  2,  2,  2,  2,  2,  6,  2,  2,  2,  10, 6,\n    60, 60, 28, 28, 28, 28, 28, 28, 28, 28, 2,  2,  2,  2,  2,  2,\n    2,  20, 20, 20, 20, 20, 20, 4,  4,  4,  4,  4,  4,  4,  4,  4,\n    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  2,  2,  2,  2,  4,\n    2,  20, 20, 20, 20, 20, 20, 4,  4,  4,  4,  4,  4,  4,  4,  4,\n    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  2,  2,  2,  2,  0\n};\n\nstatic bool IsSpace(int c) {\n\treturn c < 128 && (character_classification[c] & 1);\n}\n\nstatic bool IsIdentifier(int c) {\n\treturn c < 128 && (character_classification[c] & 4);\n}\n\nstatic int LowerCase(int c)\n{\n\tif (c >= 'A' && c <= 'Z')\n\t\treturn 'a' + c - 'A';\n\treturn c;\n}\n\nstatic int LineEnd(int line, Accessor &styler)\n{\n    const int docLines = styler.GetLine(styler.Length() - 1);  // Available last line\n    int eol_pos ;\n    // if the line is the last line, the eol_pos is styler.Length()\n    // eol will contain a new line, or a virtual new line\n    if ( docLines == line )\n        eol_pos = styler.Length() ;\n    else\n        eol_pos = styler.LineStart(line + 1) - 1;\n    return eol_pos ;\n}\n\nstatic int LineStart(int line, Accessor &styler)\n{\n    return styler.LineStart(line) ;\n}\n\n// LineType\n//\n// bits determines the line type\n// 1  : data line\n// 2  : only whitespace\n// 3  : data line with only whitespace\n// 4  : keyword line\n// 5  : block open keyword line\n// 6  : block close keyword line\n// 7  : keyword line in error\n// 8  : comment line\nstatic int LineType(int line, Accessor &styler) {\n    int pos = LineStart(line, styler) ;\n    int eol_pos = LineEnd(line, styler) ;\n\n    int c ;\n    char ch = ' ';\n\n    int i = pos ;\n    while ( i < eol_pos ) {\n        c = styler.SafeGetCharAt(i);\n        ch = static_cast<char>(LowerCase(c));\n        // We can say something as soon as no whitespace\n        // was encountered\n        if ( !IsSpace(c) )\n            break ;\n        i++ ;\n    }\n\n    if ( i >= eol_pos ) {\n        // This is a whitespace line, currently\n        // classifies as data line\n        return 3 ;\n    }\n\n    if ( ch != '*' ) {\n        // This is a data line\n        return 1 ;\n    }\n\n    if ( i == eol_pos - 1 ) {\n        // Only a single *, error but make keyword line\n        return 4+3 ;\n    }\n\n    // This means we can have a second character\n    // if that is also a * this means a comment\n    // otherwise it is a keyword.\n    c = styler.SafeGetCharAt(i+1);\n    ch = static_cast<char>(LowerCase(c));\n    if ( ch == '*' ) {\n        return 8 ;\n    }\n\n    // At this point we know this is a keyword line\n    // the character at position i is a *\n    // it is not a comment line\n    char word[256] ;\n    int  wlen = 0;\n\n    word[wlen] = '*' ;\n\twlen++ ;\n\n    i++ ;\n    while ( (i < eol_pos) && (wlen < 255) ) {\n        c = styler.SafeGetCharAt(i);\n        ch = static_cast<char>(LowerCase(c));\n\n        if ( (!IsSpace(c)) && (!IsIdentifier(c)) )\n            break ;\n\n        if ( IsIdentifier(c) ) {\n            word[wlen] = ch ;\n\t\t\twlen++ ;\n\t\t}\n\n        i++ ;\n    }\n\n    word[wlen] = 0 ;\n\n    // Make a comparison\n\tif ( !strcmp(word, \"*step\") ||\n         !strcmp(word, \"*part\") ||\n         !strcmp(word, \"*instance\") ||\n         !strcmp(word, \"*assembly\")) {\n       return 4+1 ;\n    }\n\n\tif ( !strcmp(word, \"*endstep\") ||\n         !strcmp(word, \"*endpart\") ||\n         !strcmp(word, \"*endinstance\") ||\n         !strcmp(word, \"*endassembly\")) {\n       return 4+2 ;\n    }\n\n    return 4 ;\n}\n\nstatic void SafeSetLevel(int line, int level, Accessor &styler)\n{\n    if ( line < 0 )\n        return ;\n\n    int mask = ((~SC_FOLDLEVELHEADERFLAG) | (~SC_FOLDLEVELWHITEFLAG));\n\n    if ( (level & mask) < 0 )\n        return ;\n\n    if ( styler.LevelAt(line) != level )\n        styler.SetLevel(line, level) ;\n}\n\nstatic void FoldABAQUSDoc(unsigned int startPos, int length, int,\nWordList *[], Accessor &styler) {\n    int startLine = styler.GetLine(startPos) ;\n    int endLine   = styler.GetLine(startPos+length-1) ;\n\n    // bool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n    // We want to deal with all the cases\n    // To know the correct indentlevel, we need to look back to the\n    // previous command line indentation level\n\t// order of formatting keyline datalines commentlines\n    int beginData    = -1 ;\n    int beginComment = -1 ;\n    int prvKeyLine   = startLine ;\n    int prvKeyLineTp =  0 ;\n\n    // Scan until we find the previous keyword line\n    // this will give us the level reference that we need\n    while ( prvKeyLine > 0 ) {\n        prvKeyLine-- ;\n        prvKeyLineTp = LineType(prvKeyLine, styler) ;\n        if ( prvKeyLineTp & 4 )\n            break ;\n    }\n\n    // Determine the base line level of all lines following\n    // the previous keyword\n    // new keyword lines are placed on this level\n    //if ( prvKeyLineTp & 4 ) {\n    int level = styler.LevelAt(prvKeyLine) & ~SC_FOLDLEVELHEADERFLAG ;\n    //}\n\n    // uncomment line below if weird behaviour continues\n    prvKeyLine = -1 ;\n\n    // Now start scanning over the lines.\n    for ( int line = startLine; line <= endLine; line++ ) {\n        int lineType = LineType(line, styler) ;\n\n        // Check for comment line\n        if ( lineType == 8 ) {\n            if ( beginComment < 0 ) {\n                beginComment = line ;\n\t\t\t}\n        }\n\n        // Check for data line\n        if ( (lineType == 1) || (lineType == 3) ) {\n            if ( beginData < 0 ) {\n                if ( beginComment >= 0 ) {\n                    beginData = beginComment ;\n                } else {\n                    beginData = line ;\n                }\n            }\n\t\t\tbeginComment = -1 ;\n\t\t}\n\n        // Check for keywordline.\n        // As soon as a keyword line is encountered, we can set the\n        // levels of everything from the previous keyword line to this one\n        if ( lineType & 4 ) {\n            // this is a keyword, we can now place the previous keyword\n            // all its data lines and the remainder\n\n            // Write comments and data line\n            if ( beginComment < 0 ) {\n                beginComment = line ;\n\t\t\t}\n\n            if ( beginData < 0 ) {\n                beginData = beginComment ;\n\t\t\t\tif ( prvKeyLineTp != 5 )\n\t\t\t\t\tSafeSetLevel(prvKeyLine, level, styler) ;\n\t\t\t\telse\n\t\t\t\t\tSafeSetLevel(prvKeyLine, level | SC_FOLDLEVELHEADERFLAG, styler) ;\n            } else {\n                SafeSetLevel(prvKeyLine, level | SC_FOLDLEVELHEADERFLAG, styler) ;\n            }\n\n            int datLevel = level + 1 ;\n\t\t\tif ( !(prvKeyLineTp & 4) ) {\n\t\t\t\tdatLevel = level ;\n\t\t\t}\n\n            for ( int ll = beginData; ll < beginComment; ll++ )\n                SafeSetLevel(ll, datLevel, styler) ;\n\n            // The keyword we just found is going to be written at another level\n            // if we have a type 5 and type 6\n            if ( prvKeyLineTp == 5 ) {\n                level += 1 ;\n\t\t\t}\n\n            if ( prvKeyLineTp == 6 ) {\n                level -= 1 ;\n\t\t\t\tif ( level < 0 ) {\n\t\t\t\t\tlevel = 0 ;\n\t\t\t\t}\n            }\n\n            for ( int lll = beginComment; lll < line; lll++ )\n                SafeSetLevel(lll, level, styler) ;\n\n            // wrap and reset\n            beginComment = -1 ;\n            beginData    = -1 ;\n            prvKeyLine   = line ;\n            prvKeyLineTp = lineType ;\n        }\n\n    }\n\n    if ( beginComment < 0 ) {\n        beginComment = endLine + 1 ;\n    } else {\n        // We need to find out whether this comment block is followed by\n        // a data line or a keyword line\n        const int docLines = styler.GetLine(styler.Length() - 1);\n\n        for ( int line = endLine + 1; line <= docLines; line++ ) {\n            int lineType = LineType(line, styler) ;\n\n            if ( lineType != 8 ) {\n\t\t\t\tif ( !(lineType & 4) )  {\n\t\t\t\t\tbeginComment = endLine + 1 ;\n\t\t\t\t}\n                break ;\n\t\t\t}\n        }\n    }\n\n    if ( beginData < 0 ) {\n        beginData = beginComment ;\n\t\tif ( prvKeyLineTp != 5 )\n\t\t\tSafeSetLevel(prvKeyLine, level, styler) ;\n\t\telse\n\t\t\tSafeSetLevel(prvKeyLine, level | SC_FOLDLEVELHEADERFLAG, styler) ;\n    } else {\n        SafeSetLevel(prvKeyLine, level | SC_FOLDLEVELHEADERFLAG, styler) ;\n    }\n\n    int datLevel = level + 1 ;\n\tif ( !(prvKeyLineTp & 4) ) {\n\t\tdatLevel = level ;\n\t}\n\n    for ( int ll = beginData; ll < beginComment; ll++ )\n        SafeSetLevel(ll, datLevel, styler) ;\n\n\tif ( prvKeyLineTp == 5 ) {\n\t\tlevel += 1 ;\n\t}\n\n\tif ( prvKeyLineTp == 6 ) {\n\t\tlevel -= 1 ;\n\t}\n\tfor ( int m = beginComment; m <= endLine; m++ )\n        SafeSetLevel(m, level, styler) ;\n}\n\nstatic const char * const abaqusWordListDesc[] = {\n    \"processors\",\n    \"commands\",\n    \"slashommands\",\n    \"starcommands\",\n    \"arguments\",\n    \"functions\",\n    0\n};\n\nLexerModule lmAbaqus(SCLEX_ABAQUS, ColouriseABAQUSDoc, \"abaqus\", FoldABAQUSDoc, abaqusWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexAda.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexAda.cxx\n ** Lexer for Ada 95\n **/\n// Copyright 2002 by Sergey Koshcheyev <sergey.k@seznam.cz>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include <string>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n/*\n * Interface\n */\n\nstatic void ColouriseDocument(\n    unsigned int startPos,\n    int length,\n    int initStyle,\n    WordList *keywordlists[],\n    Accessor &styler);\n\nstatic const char * const adaWordListDesc[] = {\n\t\"Keywords\",\n\t0\n};\n\nLexerModule lmAda(SCLEX_ADA, ColouriseDocument, \"ada\", NULL, adaWordListDesc);\n\n/*\n * Implementation\n */\n\n// Functions that have apostropheStartsAttribute as a parameter set it according to whether\n// an apostrophe encountered after processing the current token will start an attribute or\n// a character literal.\nstatic void ColouriseCharacter(StyleContext& sc, bool& apostropheStartsAttribute);\nstatic void ColouriseComment(StyleContext& sc, bool& apostropheStartsAttribute);\nstatic void ColouriseContext(StyleContext& sc, char chEnd, int stateEOL);\nstatic void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute);\nstatic void ColouriseLabel(StyleContext& sc, WordList& keywords, bool& apostropheStartsAttribute);\nstatic void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute);\nstatic void ColouriseString(StyleContext& sc, bool& apostropheStartsAttribute);\nstatic void ColouriseWhiteSpace(StyleContext& sc, bool& apostropheStartsAttribute);\nstatic void ColouriseWord(StyleContext& sc, WordList& keywords, bool& apostropheStartsAttribute);\n\nstatic inline bool IsDelimiterCharacter(int ch);\nstatic inline bool IsSeparatorOrDelimiterCharacter(int ch);\nstatic bool IsValidIdentifier(const std::string& identifier);\nstatic bool IsValidNumber(const std::string& number);\nstatic inline bool IsWordStartCharacter(int ch);\nstatic inline bool IsWordCharacter(int ch);\n\nstatic void ColouriseCharacter(StyleContext& sc, bool& apostropheStartsAttribute) {\n\tapostropheStartsAttribute = true;\n\n\tsc.SetState(SCE_ADA_CHARACTER);\n\n\t// Skip the apostrophe and one more character (so that '' is shown as non-terminated and '''\n\t// is handled correctly)\n\tsc.Forward();\n\tsc.Forward();\n\n\tColouriseContext(sc, '\\'', SCE_ADA_CHARACTEREOL);\n}\n\nstatic void ColouriseContext(StyleContext& sc, char chEnd, int stateEOL) {\n\twhile (!sc.atLineEnd && !sc.Match(chEnd)) {\n\t\tsc.Forward();\n\t}\n\n\tif (!sc.atLineEnd) {\n\t\tsc.ForwardSetState(SCE_ADA_DEFAULT);\n\t} else {\n\t\tsc.ChangeState(stateEOL);\n\t}\n}\n\nstatic void ColouriseComment(StyleContext& sc, bool& /*apostropheStartsAttribute*/) {\n\t// Apostrophe meaning is not changed, but the parameter is present for uniformity\n\n\tsc.SetState(SCE_ADA_COMMENTLINE);\n\n\twhile (!sc.atLineEnd) {\n\t\tsc.Forward();\n\t}\n}\n\nstatic void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute) {\n\tapostropheStartsAttribute = sc.Match (')');\n\tsc.SetState(SCE_ADA_DELIMITER);\n\tsc.ForwardSetState(SCE_ADA_DEFAULT);\n}\n\nstatic void ColouriseLabel(StyleContext& sc, WordList& keywords, bool& apostropheStartsAttribute) {\n\tapostropheStartsAttribute = false;\n\n\tsc.SetState(SCE_ADA_LABEL);\n\n\t// Skip \"<<\"\n\tsc.Forward();\n\tsc.Forward();\n\n\tstd::string identifier;\n\n\twhile (!sc.atLineEnd && !IsSeparatorOrDelimiterCharacter(sc.ch)) {\n\t\tidentifier += static_cast<char>(tolower(sc.ch));\n\t\tsc.Forward();\n\t}\n\n\t// Skip \">>\"\n\tif (sc.Match('>', '>')) {\n\t\tsc.Forward();\n\t\tsc.Forward();\n\t} else {\n\t\tsc.ChangeState(SCE_ADA_ILLEGAL);\n\t}\n\n\t// If the name is an invalid identifier or a keyword, then make it invalid label\n\tif (!IsValidIdentifier(identifier) || keywords.InList(identifier.c_str())) {\n\t\tsc.ChangeState(SCE_ADA_ILLEGAL);\n\t}\n\n\tsc.SetState(SCE_ADA_DEFAULT);\n\n}\n\nstatic void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute) {\n\tapostropheStartsAttribute = true;\n\n\tstd::string number;\n\tsc.SetState(SCE_ADA_NUMBER);\n\n\t// Get all characters up to a delimiter or a separator, including points, but excluding\n\t// double points (ranges).\n\twhile (!IsSeparatorOrDelimiterCharacter(sc.ch) || (sc.ch == '.' && sc.chNext != '.')) {\n\t\tnumber += static_cast<char>(sc.ch);\n\t\tsc.Forward();\n\t}\n\n\t// Special case: exponent with sign\n\tif ((sc.chPrev == 'e' || sc.chPrev == 'E') &&\n\t        (sc.ch == '+' || sc.ch == '-')) {\n\t\tnumber += static_cast<char>(sc.ch);\n\t\tsc.Forward ();\n\n\t\twhile (!IsSeparatorOrDelimiterCharacter(sc.ch)) {\n\t\t\tnumber += static_cast<char>(sc.ch);\n\t\t\tsc.Forward();\n\t\t}\n\t}\n\n\tif (!IsValidNumber(number)) {\n\t\tsc.ChangeState(SCE_ADA_ILLEGAL);\n\t}\n\n\tsc.SetState(SCE_ADA_DEFAULT);\n}\n\nstatic void ColouriseString(StyleContext& sc, bool& apostropheStartsAttribute) {\n\tapostropheStartsAttribute = true;\n\n\tsc.SetState(SCE_ADA_STRING);\n\tsc.Forward();\n\n\tColouriseContext(sc, '\"', SCE_ADA_STRINGEOL);\n}\n\nstatic void ColouriseWhiteSpace(StyleContext& sc, bool& /*apostropheStartsAttribute*/) {\n\t// Apostrophe meaning is not changed, but the parameter is present for uniformity\n\tsc.SetState(SCE_ADA_DEFAULT);\n\tsc.ForwardSetState(SCE_ADA_DEFAULT);\n}\n\nstatic void ColouriseWord(StyleContext& sc, WordList& keywords, bool& apostropheStartsAttribute) {\n\tapostropheStartsAttribute = true;\n\tsc.SetState(SCE_ADA_IDENTIFIER);\n\n\tstd::string word;\n\n\twhile (!sc.atLineEnd && !IsSeparatorOrDelimiterCharacter(sc.ch)) {\n\t\tword += static_cast<char>(tolower(sc.ch));\n\t\tsc.Forward();\n\t}\n\n\tif (!IsValidIdentifier(word)) {\n\t\tsc.ChangeState(SCE_ADA_ILLEGAL);\n\n\t} else if (keywords.InList(word.c_str())) {\n\t\tsc.ChangeState(SCE_ADA_WORD);\n\n\t\tif (word != \"all\") {\n\t\t\tapostropheStartsAttribute = false;\n\t\t}\n\t}\n\n\tsc.SetState(SCE_ADA_DEFAULT);\n}\n\n//\n// ColouriseDocument\n//\n\nstatic void ColouriseDocument(\n    unsigned int startPos,\n    int length,\n    int initStyle,\n    WordList *keywordlists[],\n    Accessor &styler) {\n\tWordList &keywords = *keywordlists[0];\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tint lineCurrent = styler.GetLine(startPos);\n\tbool apostropheStartsAttribute = (styler.GetLineState(lineCurrent) & 1) != 0;\n\n\twhile (sc.More()) {\n\t\tif (sc.atLineEnd) {\n\t\t\t// Go to the next line\n\t\t\tsc.Forward();\n\t\t\tlineCurrent++;\n\n\t\t\t// Remember the line state for future incremental lexing\n\t\t\tstyler.SetLineState(lineCurrent, apostropheStartsAttribute);\n\n\t\t\t// Don't continue any styles on the next line\n\t\t\tsc.SetState(SCE_ADA_DEFAULT);\n\t\t}\n\n\t\t// Comments\n\t\tif (sc.Match('-', '-')) {\n\t\t\tColouriseComment(sc, apostropheStartsAttribute);\n\n\t\t// Strings\n\t\t} else if (sc.Match('\"')) {\n\t\t\tColouriseString(sc, apostropheStartsAttribute);\n\n\t\t// Characters\n\t\t} else if (sc.Match('\\'') && !apostropheStartsAttribute) {\n\t\t\tColouriseCharacter(sc, apostropheStartsAttribute);\n\n\t\t// Labels\n\t\t} else if (sc.Match('<', '<')) {\n\t\t\tColouriseLabel(sc, keywords, apostropheStartsAttribute);\n\n\t\t// Whitespace\n\t\t} else if (IsASpace(sc.ch)) {\n\t\t\tColouriseWhiteSpace(sc, apostropheStartsAttribute);\n\n\t\t// Delimiters\n\t\t} else if (IsDelimiterCharacter(sc.ch)) {\n\t\t\tColouriseDelimiter(sc, apostropheStartsAttribute);\n\n\t\t// Numbers\n\t\t} else if (IsADigit(sc.ch) || sc.ch == '#') {\n\t\t\tColouriseNumber(sc, apostropheStartsAttribute);\n\n\t\t// Keywords or identifiers\n\t\t} else {\n\t\t\tColouriseWord(sc, keywords, apostropheStartsAttribute);\n\t\t}\n\t}\n\n\tsc.Complete();\n}\n\nstatic inline bool IsDelimiterCharacter(int ch) {\n\tswitch (ch) {\n\tcase '&':\n\tcase '\\'':\n\tcase '(':\n\tcase ')':\n\tcase '*':\n\tcase '+':\n\tcase ',':\n\tcase '-':\n\tcase '.':\n\tcase '/':\n\tcase ':':\n\tcase ';':\n\tcase '<':\n\tcase '=':\n\tcase '>':\n\tcase '|':\n\t\treturn true;\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nstatic inline bool IsSeparatorOrDelimiterCharacter(int ch) {\n\treturn IsASpace(ch) || IsDelimiterCharacter(ch);\n}\n\nstatic bool IsValidIdentifier(const std::string& identifier) {\n\t// First character can't be '_', so initialize the flag to true\n\tbool lastWasUnderscore = true;\n\n\tsize_t length = identifier.length();\n\n\t// Zero-length identifiers are not valid (these can occur inside labels)\n\tif (length == 0) {\n\t\treturn false;\n\t}\n\n\t// Check for valid character at the start\n\tif (!IsWordStartCharacter(identifier[0])) {\n\t\treturn false;\n\t}\n\n\t// Check for only valid characters and no double underscores\n\tfor (size_t i = 0; i < length; i++) {\n\t\tif (!IsWordCharacter(identifier[i]) ||\n\t\t        (identifier[i] == '_' && lastWasUnderscore)) {\n\t\t\treturn false;\n\t\t}\n\t\tlastWasUnderscore = identifier[i] == '_';\n\t}\n\n\t// Check for underscore at the end\n\tif (lastWasUnderscore == true) {\n\t\treturn false;\n\t}\n\n\t// All checks passed\n\treturn true;\n}\n\nstatic bool IsValidNumber(const std::string& number) {\n\tsize_t hashPos = number.find(\"#\");\n\tbool seenDot = false;\n\n\tsize_t i = 0;\n\tsize_t length = number.length();\n\n\tif (length == 0)\n\t\treturn false; // Just in case\n\n\t// Decimal number\n\tif (hashPos == std::string::npos) {\n\t\tbool canBeSpecial = false;\n\n\t\tfor (; i < length; i++) {\n\t\t\tif (number[i] == '_') {\n\t\t\t\tif (!canBeSpecial) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tcanBeSpecial = false;\n\t\t\t} else if (number[i] == '.') {\n\t\t\t\tif (!canBeSpecial || seenDot) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tcanBeSpecial = false;\n\t\t\t\tseenDot = true;\n\t\t\t} else if (IsADigit(number[i])) {\n\t\t\t\tcanBeSpecial = true;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!canBeSpecial)\n\t\t\treturn false;\n\t} else {\n\t\t// Based number\n\t\tbool canBeSpecial = false;\n\t\tint base = 0;\n\n\t\t// Parse base\n\t\tfor (; i < length; i++) {\n\t\t\tint ch = number[i];\n\t\t\tif (ch == '_') {\n\t\t\t\tif (!canBeSpecial)\n\t\t\t\t\treturn false;\n\t\t\t\tcanBeSpecial = false;\n\t\t\t} else if (IsADigit(ch)) {\n\t\t\t\tbase = base * 10 + (ch - '0');\n\t\t\t\tif (base > 16)\n\t\t\t\t\treturn false;\n\t\t\t\tcanBeSpecial = true;\n\t\t\t} else if (ch == '#' && canBeSpecial) {\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif (base < 2)\n\t\t\treturn false;\n\t\tif (i == length)\n\t\t\treturn false;\n\n\t\ti++; // Skip over '#'\n\n\t\t// Parse number\n\t\tcanBeSpecial = false;\n\n\t\tfor (; i < length; i++) {\n\t\t\tint ch = tolower(number[i]);\n\n\t\t\tif (ch == '_') {\n\t\t\t\tif (!canBeSpecial) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tcanBeSpecial = false;\n\n\t\t\t} else if (ch == '.') {\n\t\t\t\tif (!canBeSpecial || seenDot) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tcanBeSpecial = false;\n\t\t\t\tseenDot = true;\n\n\t\t\t} else if (IsADigit(ch)) {\n\t\t\t\tif (ch - '0' >= base) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tcanBeSpecial = true;\n\n\t\t\t} else if (ch >= 'a' && ch <= 'f') {\n\t\t\t\tif (ch - 'a' + 10 >= base) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tcanBeSpecial = true;\n\n\t\t\t} else if (ch == '#' && canBeSpecial) {\n\t\t\t\tbreak;\n\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif (i == length) {\n\t\t\treturn false;\n\t\t}\n\n\t\ti++;\n\t}\n\n\t// Exponent (optional)\n\tif (i < length) {\n\t\tif (number[i] != 'e' && number[i] != 'E')\n\t\t\treturn false;\n\n\t\ti++; // Move past 'E'\n\n\t\tif (i == length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (number[i] == '+')\n\t\t\ti++;\n\t\telse if (number[i] == '-') {\n\t\t\tif (seenDot) {\n\t\t\t\ti++;\n\t\t\t} else {\n\t\t\t\treturn false; // Integer literals should not have negative exponents\n\t\t\t}\n\t\t}\n\n\t\tif (i == length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tbool canBeSpecial = false;\n\n\t\tfor (; i < length; i++) {\n\t\t\tif (number[i] == '_') {\n\t\t\t\tif (!canBeSpecial) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tcanBeSpecial = false;\n\t\t\t} else if (IsADigit(number[i])) {\n\t\t\t\tcanBeSpecial = true;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif (!canBeSpecial)\n\t\t\treturn false;\n\t}\n\n\t// if i == length, number was parsed successfully.\n\treturn i == length;\n}\n\nstatic inline bool IsWordCharacter(int ch) {\n\treturn IsWordStartCharacter(ch) || IsADigit(ch);\n}\n\nstatic inline bool IsWordStartCharacter(int ch) {\n\treturn (IsASCII(ch) && isalpha(ch)) || ch == '_';\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexAsm.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexAsm.cxx\n ** Lexer for Assembler, just for the MASM syntax\n ** Written by The Black Horus\n ** Enhancements and NASM stuff by Kein-Hong Man, 2003-10\n ** SCE_ASM_COMMENTBLOCK and SCE_ASM_CHARACTER are for future GNU as colouring\n ** Converted to lexer object and added further folding features/properties by \"Udo Lechner\" <dlchnr(at)gmx(dot)net>\n **/\n// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include <string>\n#include <map>\n#include <set>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n#include \"OptionSet.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '.' ||\n\t\tch == '_' || ch == '?');\n}\n\nstatic inline bool IsAWordStart(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.' ||\n\t\tch == '%' || ch == '@' || ch == '$' || ch == '?');\n}\n\nstatic inline bool IsAsmOperator(const int ch) {\n\tif ((ch < 0x80) && (isalnum(ch)))\n\t\treturn false;\n\t// '.' left out as it is used to make up numbers\n\tif (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||\n\t\tch == '(' || ch == ')' || ch == '=' || ch == '^' ||\n\t\tch == '[' || ch == ']' || ch == '<' || ch == '&' ||\n\t\tch == '>' || ch == ',' || ch == '|' || ch == '~' ||\n\t\tch == '%' || ch == ':')\n\t\treturn true;\n\treturn false;\n}\n\nstatic bool IsStreamCommentStyle(int style) {\n\treturn style == SCE_ASM_COMMENTDIRECTIVE || style == SCE_ASM_COMMENTBLOCK;\n}\n\nstatic inline int LowerCase(int c) {\n\tif (c >= 'A' && c <= 'Z')\n\t\treturn 'a' + c - 'A';\n\treturn c;\n}\n\n// An individual named option for use in an OptionSet\n\n// Options used for LexerAsm\nstruct OptionsAsm {\n\tstd::string delimiter;\n\tbool fold;\n\tbool foldSyntaxBased;\n\tbool foldCommentMultiline;\n\tbool foldCommentExplicit;\n\tstd::string foldExplicitStart;\n\tstd::string foldExplicitEnd;\n\tbool foldExplicitAnywhere;\n\tbool foldCompact;\n\tOptionsAsm() {\n\t\tdelimiter = \"\";\n\t\tfold = false;\n\t\tfoldSyntaxBased = true;\n\t\tfoldCommentMultiline = false;\n\t\tfoldCommentExplicit = false;\n\t\tfoldExplicitStart = \"\";\n\t\tfoldExplicitEnd   = \"\";\n\t\tfoldExplicitAnywhere = false;\n\t\tfoldCompact = true;\n\t}\n};\n\nstatic const char * const asmWordListDesc[] = {\n\t\"CPU instructions\",\n\t\"FPU instructions\",\n\t\"Registers\",\n\t\"Directives\",\n\t\"Directive operands\",\n\t\"Extended instructions\",\n\t\"Directives4Foldstart\",\n\t\"Directives4Foldend\",\n\t0\n};\n\nstruct OptionSetAsm : public OptionSet<OptionsAsm> {\n\tOptionSetAsm() {\n\t\tDefineProperty(\"lexer.asm.comment.delimiter\", &OptionsAsm::delimiter,\n\t\t\t\"Character used for COMMENT directive's delimiter, replacing the standard \\\"~\\\".\");\n\n\t\tDefineProperty(\"fold\", &OptionsAsm::fold);\n\n\t\tDefineProperty(\"fold.asm.syntax.based\", &OptionsAsm::foldSyntaxBased,\n\t\t\t\"Set this property to 0 to disable syntax based folding.\");\n\n\t\tDefineProperty(\"fold.asm.comment.multiline\", &OptionsAsm::foldCommentMultiline,\n\t\t\t\"Set this property to 1 to enable folding multi-line comments.\");\n\n\t\tDefineProperty(\"fold.asm.comment.explicit\", &OptionsAsm::foldCommentExplicit,\n\t\t\t\"This option enables folding explicit fold points when using the Asm lexer. \"\n\t\t\t\"Explicit fold points allows adding extra folding by placing a ;{ comment at the start and a ;} \"\n\t\t\t\"at the end of a section that should fold.\");\n\n\t\tDefineProperty(\"fold.asm.explicit.start\", &OptionsAsm::foldExplicitStart,\n\t\t\t\"The string to use for explicit fold start points, replacing the standard ;{.\");\n\n\t\tDefineProperty(\"fold.asm.explicit.end\", &OptionsAsm::foldExplicitEnd,\n\t\t\t\"The string to use for explicit fold end points, replacing the standard ;}.\");\n\n\t\tDefineProperty(\"fold.asm.explicit.anywhere\", &OptionsAsm::foldExplicitAnywhere,\n\t\t\t\"Set this property to 1 to enable explicit fold points anywhere, not just in line comments.\");\n\n\t\tDefineProperty(\"fold.compact\", &OptionsAsm::foldCompact);\n\n\t\tDefineWordListSets(asmWordListDesc);\n\t}\n};\n\nclass LexerAsm : public ILexer {\n\tWordList cpuInstruction;\n\tWordList mathInstruction;\n\tWordList registers;\n\tWordList directive;\n\tWordList directiveOperand;\n\tWordList extInstruction;\n\tWordList directives4foldstart;\n\tWordList directives4foldend;\n\tOptionsAsm options;\n\tOptionSetAsm osAsm;\npublic:\n\tLexerAsm() {\n\t}\n\tvirtual ~LexerAsm() {\n\t}\n\tvoid SCI_METHOD Release() {\n\t\tdelete this;\n\t}\n\tint SCI_METHOD Version() const {\n\t\treturn lvOriginal;\n\t}\n\tconst char * SCI_METHOD PropertyNames() {\n\t\treturn osAsm.PropertyNames();\n\t}\n\tint SCI_METHOD PropertyType(const char *name) {\n\t\treturn osAsm.PropertyType(name);\n\t}\n\tconst char * SCI_METHOD DescribeProperty(const char *name) {\n\t\treturn osAsm.DescribeProperty(name);\n\t}\n\tint SCI_METHOD PropertySet(const char *key, const char *val);\n\tconst char * SCI_METHOD DescribeWordListSets() {\n\t\treturn osAsm.DescribeWordListSets();\n\t}\n\tint SCI_METHOD WordListSet(int n, const char *wl);\n\tvoid SCI_METHOD Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n\tvoid SCI_METHOD Fold(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n\n\tvoid * SCI_METHOD PrivateCall(int, void *) {\n\t\treturn 0;\n\t}\n\n\tstatic ILexer *LexerFactoryAsm() {\n\t\treturn new LexerAsm();\n\t}\n};\n\nint SCI_METHOD LexerAsm::PropertySet(const char *key, const char *val) {\n\tif (osAsm.PropertySet(&options, key, val)) {\n\t\treturn 0;\n\t}\n\treturn -1;\n}\n\nint SCI_METHOD LexerAsm::WordListSet(int n, const char *wl) {\n\tWordList *wordListN = 0;\n\tswitch (n) {\n\tcase 0:\n\t\twordListN = &cpuInstruction;\n\t\tbreak;\n\tcase 1:\n\t\twordListN = &mathInstruction;\n\t\tbreak;\n\tcase 2:\n\t\twordListN = &registers;\n\t\tbreak;\n\tcase 3:\n\t\twordListN = &directive;\n\t\tbreak;\n\tcase 4:\n\t\twordListN = &directiveOperand;\n\t\tbreak;\n\tcase 5:\n\t\twordListN = &extInstruction;\n\t\tbreak;\n\tcase 6:\n\t\twordListN = &directives4foldstart;\n\t\tbreak;\n\tcase 7:\n\t\twordListN = &directives4foldend;\n\t\tbreak;\n\t}\n\tint firstModification = -1;\n\tif (wordListN) {\n\t\tWordList wlNew;\n\t\twlNew.Set(wl);\n\t\tif (*wordListN != wlNew) {\n\t\t\twordListN->Set(wl);\n\t\t\tfirstModification = 0;\n\t\t}\n\t}\n\treturn firstModification;\n}\n\nvoid SCI_METHOD LexerAsm::Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n\tLexAccessor styler(pAccess);\n\n\t// Do not leak onto next line\n\tif (initStyle == SCE_ASM_STRINGEOL)\n\t\tinitStyle = SCE_ASM_DEFAULT;\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward())\n\t{\n\n\t\t// Prevent SCE_ASM_STRINGEOL from leaking back to previous line\n\t\tif (sc.atLineStart && (sc.state == SCE_ASM_STRING)) {\n\t\t\tsc.SetState(SCE_ASM_STRING);\n\t\t} else if (sc.atLineStart && (sc.state == SCE_ASM_CHARACTER)) {\n\t\t\tsc.SetState(SCE_ASM_CHARACTER);\n\t\t}\n\n\t\t// Handle line continuation generically.\n\t\tif (sc.ch == '\\\\') {\n\t\t\tif (sc.chNext == '\\n' || sc.chNext == '\\r') {\n\t\t\t\tsc.Forward();\n\t\t\t\tif (sc.ch == '\\r' && sc.chNext == '\\n') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Determine if the current state should terminate.\n\t\tif (sc.state == SCE_ASM_OPERATOR) {\n\t\t\tif (!IsAsmOperator(sc.ch)) {\n\t\t\t    sc.SetState(SCE_ASM_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_ASM_NUMBER) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_ASM_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_ASM_IDENTIFIER) {\n\t\t\tif (!IsAWordChar(sc.ch) ) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\tbool IsDirective = false;\n\n\t\t\t\tif (cpuInstruction.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_ASM_CPUINSTRUCTION);\n\t\t\t\t} else if (mathInstruction.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_ASM_MATHINSTRUCTION);\n\t\t\t\t} else if (registers.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_ASM_REGISTER);\n\t\t\t\t}  else if (directive.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_ASM_DIRECTIVE);\n\t\t\t\t\tIsDirective = true;\n\t\t\t\t} else if (directiveOperand.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_ASM_DIRECTIVEOPERAND);\n\t\t\t\t} else if (extInstruction.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_ASM_EXTINSTRUCTION);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_ASM_DEFAULT);\n\t\t\t\tif (IsDirective && !strcmp(s, \"comment\")) {\n\t\t\t\t\tchar delimiter = options.delimiter.empty() ? '~' : options.delimiter.c_str()[0];\n\t\t\t\t\twhile (IsASpaceOrTab(sc.ch) && !sc.atLineEnd) {\n\t\t\t\t\t\tsc.ForwardSetState(SCE_ASM_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t\tif (sc.ch == delimiter) {\n\t\t\t\t\t\tsc.SetState(SCE_ASM_COMMENTDIRECTIVE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (sc.state == SCE_ASM_COMMENTDIRECTIVE) {\n\t\t\tchar delimiter = options.delimiter.empty() ? '~' : options.delimiter.c_str()[0];\n\t\t\tif (sc.ch == delimiter) {\n\t\t\t\twhile (!sc.atLineEnd) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_ASM_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_ASM_COMMENT ) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_ASM_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_ASM_STRING) {\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_ASM_DEFAULT);\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.ChangeState(SCE_ASM_STRINGEOL);\n\t\t\t\tsc.ForwardSetState(SCE_ASM_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_ASM_CHARACTER) {\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.ForwardSetState(SCE_ASM_DEFAULT);\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.ChangeState(SCE_ASM_STRINGEOL);\n\t\t\t\tsc.ForwardSetState(SCE_ASM_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_ASM_DEFAULT) {\n\t\t\tif (sc.ch == ';'){\n\t\t\t\tsc.SetState(SCE_ASM_COMMENT);\n\t\t\t} else if (IsASCII(sc.ch) && (isdigit(sc.ch) || (sc.ch == '.' && IsASCII(sc.chNext) && isdigit(sc.chNext)))) {\n\t\t\t\tsc.SetState(SCE_ASM_NUMBER);\n\t\t\t} else if (IsAWordStart(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_ASM_IDENTIFIER);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_ASM_STRING);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_ASM_CHARACTER);\n\t\t\t} else if (IsAsmOperator(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_ASM_OPERATOR);\n\t\t\t}\n\t\t}\n\n\t}\n\tsc.Complete();\n}\n\n// Store both the current line's fold level and the next lines in the\n// level store to make it easy to pick up with each increment\n// and to make it possible to fiddle the current level for \"else\".\n\nvoid SCI_METHOD LexerAsm::Fold(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n\n\tif (!options.fold)\n\t\treturn;\n\n\tLexAccessor styler(pAccess);\n\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelCurrent = SC_FOLDLEVELBASE;\n\tif (lineCurrent > 0)\n\t\tlevelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n\tint levelNext = levelCurrent;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tchar word[100];\n\tint wordlen = 0;\n\tconst bool userDefinedFoldMarkers = !options.foldExplicitStart.empty() && !options.foldExplicitEnd.empty();\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (options.foldCommentMultiline && IsStreamCommentStyle(style)) {\n\t\t\tif (!IsStreamCommentStyle(stylePrev)) {\n\t\t\t\tlevelNext++;\n\t\t\t} else if (!IsStreamCommentStyle(styleNext) && !atEOL) {\n\t\t\t\t// Comments don't end at end of line and the next character may be unstyled.\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\t\tif (options.foldCommentExplicit && ((style == SCE_ASM_COMMENT) || options.foldExplicitAnywhere)) {\n\t\t\tif (userDefinedFoldMarkers) {\n\t\t\t\tif (styler.Match(i, options.foldExplicitStart.c_str())) {\n \t\t\t\t\tlevelNext++;\n\t\t\t\t} else if (styler.Match(i, options.foldExplicitEnd.c_str())) {\n \t\t\t\t\tlevelNext--;\n \t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (ch == ';') {\n\t\t\t\t\tif (chNext == '{') {\n\t\t\t\t\t\tlevelNext++;\n\t\t\t\t\t} else if (chNext == '}') {\n\t\t\t\t\t\tlevelNext--;\n\t\t\t\t\t}\n\t\t\t\t}\n \t\t\t}\n \t\t}\n\t\tif (options.foldSyntaxBased && (style == SCE_ASM_DIRECTIVE)) {\n\t\t\tword[wordlen++] = static_cast<char>(LowerCase(ch));\n\t\t\tif (wordlen == 100) {                   // prevent overflow\n\t\t\t\tword[0] = '\\0';\n\t\t\t\twordlen = 1;\n\t\t\t}\n\t\t\tif (styleNext != SCE_ASM_DIRECTIVE) {   // reading directive ready\n\t\t\t\tword[wordlen] = '\\0';\n\t\t\t\twordlen = 0;\n\t\t\t\tif (directives4foldstart.InList(word)) {\n\t\t\t\t\tlevelNext++;\n\t\t\t\t} else if (directives4foldend.InList(word)){\n\t\t\t\t\tlevelNext--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!IsASpace(ch))\n\t\t\tvisibleChars++;\n\t\tif (atEOL || (i == endPos-1)) {\n\t\t\tint levelUse = levelCurrent;\n\t\t\tint lev = levelUse | levelNext << 16;\n\t\t\tif (visibleChars == 0 && options.foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (levelUse < levelNext)\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelCurrent = levelNext;\n\t\t\tif (atEOL && (i == static_cast<unsigned int>(styler.Length()-1))) {\n\t\t\t\t// There is an empty line at end of file so give it same level and empty\n\t\t\t\tstyler.SetLevel(lineCurrent, (levelCurrent | levelCurrent << 16) | SC_FOLDLEVELWHITEFLAG);\n\t\t\t}\n\t\t\tvisibleChars = 0;\n\t\t}\n\t}\n}\n\nLexerModule lmAsm(SCLEX_ASM, LexerAsm::LexerFactoryAsm, \"asm\", asmWordListDesc);\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexAsn1.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexAsn1.cxx\n ** Lexer for ASN.1\n **/\n// Copyright 2004 by Herr Pfarrer rpfarrer <at> yahoo <dot> de\n// Last Updated: 20/07/2004\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n// Some char test functions\nstatic bool isAsn1Number(int ch)\n{\n\treturn (ch >= '0' && ch <= '9');\n}\n\nstatic bool isAsn1Letter(int ch)\n{\n\treturn (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');\n}\n\nstatic bool isAsn1Char(int ch)\n{\n\treturn (ch == '-' ) || isAsn1Number(ch) || isAsn1Letter (ch);\n}\n\n//\n//\tFunction determining the color of a given code portion\n//\tBased on a \"state\"\n//\nstatic void ColouriseAsn1Doc(unsigned int startPos, int length, int initStyle, WordList *keywordLists[], Accessor &styler)\n{\n\t// The keywords\n\tWordList &Keywords = *keywordLists[0];\n\tWordList &Attributes = *keywordLists[1];\n\tWordList &Descriptors = *keywordLists[2];\n\tWordList &Types = *keywordLists[3];\n\n\t// Parse the whole buffer character by character using StyleContext\n\tStyleContext sc(startPos, length, initStyle, styler);\n\tfor (; sc.More(); sc.Forward())\n\t{\n\t\t// The state engine\n\t\tswitch (sc.state)\n\t\t{\n\t\tcase SCE_ASN1_DEFAULT:\t\t// Plain characters\nasn1_default:\n\t\t\tif (sc.ch == '-' && sc.chNext == '-')\n\t\t\t\t// A comment begins here\n\t\t\t\tsc.SetState(SCE_ASN1_COMMENT);\n\t\t\telse if (sc.ch == '\"')\n\t\t\t\t// A string begins here\n\t\t\t\tsc.SetState(SCE_ASN1_STRING);\n\t\t\telse if (isAsn1Number (sc.ch))\n\t\t\t\t// A number starts here (identifier should start with a letter in ASN.1)\n\t\t\t\tsc.SetState(SCE_ASN1_SCALAR);\n\t\t\telse if (isAsn1Char (sc.ch))\n\t\t\t\t// An identifier starts here (identifier always start with a letter)\n\t\t\t\tsc.SetState(SCE_ASN1_IDENTIFIER);\n\t\t\telse if (sc.ch == ':')\n\t\t\t\t// A ::= operator starts here\n\t\t\t\tsc.SetState(SCE_ASN1_OPERATOR);\n\t\t\tbreak;\n\t\tcase SCE_ASN1_COMMENT:\t\t// A comment\n\t\t\tif (sc.ch == '\\r' || sc.ch == '\\n')\n\t\t\t\t// A comment ends here\n\t\t\t\tsc.SetState(SCE_ASN1_DEFAULT);\n\t\t\tbreak;\n\t\tcase SCE_ASN1_IDENTIFIER:\t// An identifier (keyword, attribute, descriptor or type)\n\t\t\tif (!isAsn1Char (sc.ch))\n\t\t\t{\n\t\t\t\t// The end of identifier is here: we can look for it in lists by now and change its state\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\tif (Keywords.InList(s))\n\t\t\t\t\t// It's a keyword, change its state\n\t\t\t\t\tsc.ChangeState(SCE_ASN1_KEYWORD);\n\t\t\t\telse if (Attributes.InList(s))\n\t\t\t\t\t// It's an attribute, change its state\n\t\t\t\t\tsc.ChangeState(SCE_ASN1_ATTRIBUTE);\n\t\t\t\telse if (Descriptors.InList(s))\n\t\t\t\t\t// It's a descriptor, change its state\n\t\t\t\t\tsc.ChangeState(SCE_ASN1_DESCRIPTOR);\n\t\t\t\telse if (Types.InList(s))\n\t\t\t\t\t// It's a type, change its state\n\t\t\t\t\tsc.ChangeState(SCE_ASN1_TYPE);\n\n\t\t\t\t// Set to default now\n\t\t\t\tsc.SetState(SCE_ASN1_DEFAULT);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_ASN1_STRING:\t\t// A string delimited by \"\"\n\t\t\tif (sc.ch == '\"')\n\t\t\t{\n\t\t\t\t// A string ends here\n\t\t\t\tsc.ForwardSetState(SCE_ASN1_DEFAULT);\n\n\t\t\t\t// To correctly manage a char sticking to the string quote\n\t\t\t\tgoto asn1_default;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_ASN1_SCALAR:\t\t// A plain number\n\t\t\tif (!isAsn1Number (sc.ch))\n\t\t\t\t// A number ends here\n\t\t\t\tsc.SetState(SCE_ASN1_DEFAULT);\n\t\t\tbreak;\n\t\tcase SCE_ASN1_OPERATOR:\t\t// The affectation operator ::= and wath follows (eg: ::= { org 6 } OID or ::= 12 trap)\n\t\t\tif (sc.ch == '{')\n\t\t\t{\n\t\t\t\t// An OID definition starts here: enter the sub loop\n\t\t\t\tfor (; sc.More(); sc.Forward())\n\t\t\t\t{\n\t\t\t\t\tif (isAsn1Number (sc.ch) && (!isAsn1Char (sc.chPrev) || isAsn1Number (sc.chPrev)))\n\t\t\t\t\t\t// The OID number is highlighted\n\t\t\t\t\t\tsc.SetState(SCE_ASN1_OID);\n\t\t\t\t\telse if (isAsn1Char (sc.ch))\n\t\t\t\t\t\t// The OID parent identifier is plain\n\t\t\t\t\t\tsc.SetState(SCE_ASN1_IDENTIFIER);\n\t\t\t\t\telse\n\t\t\t\t\t\tsc.SetState(SCE_ASN1_DEFAULT);\n\n\t\t\t\t\tif (sc.ch == '}')\n\t\t\t\t\t\t// Here ends the OID and the operator sub loop: go back to main loop\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (isAsn1Number (sc.ch))\n\t\t\t{\n\t\t\t\t// A trap number definition starts here: enter the sub loop\n\t\t\t\tfor (; sc.More(); sc.Forward())\n\t\t\t\t{\n\t\t\t\t\tif (isAsn1Number (sc.ch))\n\t\t\t\t\t\t// The trap number is highlighted\n\t\t\t\t\t\tsc.SetState(SCE_ASN1_OID);\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// The number ends here: go back to main loop\n\t\t\t\t\t\tsc.SetState(SCE_ASN1_DEFAULT);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (sc.ch != ':' && sc.ch != '=' && sc.ch != ' ')\n\t\t\t\t// The operator doesn't imply an OID definition nor a trap, back to main loop\n\t\t\t\tgoto asn1_default; // To be sure to handle actually the state change\n\t\t\tbreak;\n\t\t}\n\t}\n\tsc.Complete();\n}\n\nstatic void FoldAsn1Doc(unsigned int, int, int, WordList *[], Accessor &styler)\n{\n\t// No folding enabled, no reason to continue...\n\tif( styler.GetPropertyInt(\"fold\") == 0 )\n\t\treturn;\n\n\t// No folding implemented: doesn't make sense for ASN.1\n}\n\nstatic const char * const asn1WordLists[] = {\n\t\"Keywords\",\n\t\"Attributes\",\n\t\"Descriptors\",\n\t\"Types\",\n\t0, };\n\n\nLexerModule lmAsn1(SCLEX_ASN1, ColouriseAsn1Doc, \"asn1\", FoldAsn1Doc, asn1WordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexBaan.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexBaan.cxx\n ** Lexer for Baan.\n ** Based heavily on LexCPP.cxx\n **/\n// Copyright 2001- by Vamsi Potluru <vamsi@who.net> & Praveen Ambekar <ambekarpraveen@yahoo.com>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(const int  ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch == '$' || ch == ':');\n}\n\nstatic inline bool IsAWordStart(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_');\n}\n\nstatic void ColouriseBaanDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                            Accessor &styler) {\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tbool stylingWithinPreprocessor = styler.GetPropertyInt(\"styling.within.preprocessor\") != 0;\n\n\tif (initStyle == SCE_BAAN_STRINGEOL)\t// Does not leak onto next line\n\t\tinitStyle = SCE_BAAN_DEFAULT;\n\n\tint visibleChars = 0;\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\tif (sc.state == SCE_BAAN_OPERATOR) {\n\t\t\tsc.SetState(SCE_BAAN_DEFAULT);\n\t\t} else if (sc.state == SCE_BAAN_NUMBER) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_BAAN_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_BAAN_IDENTIFIER) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_BAAN_WORD);\n\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_BAAN_WORD2);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_BAAN_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_BAAN_PREPROCESSOR) {\n\t\t\tif (stylingWithinPreprocessor) {\n\t\t\t\tif (IsASpace(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_BAAN_DEFAULT);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (sc.atLineEnd && (sc.chNext != '^')) {\n\t\t\t\t\tsc.SetState(SCE_BAAN_DEFAULT);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (sc.state == SCE_BAAN_COMMENT) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_BAAN_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_BAAN_COMMENTDOC) {\n\t\t\tif (sc.MatchIgnoreCase(\"enddllusage\")) {\n\t\t\t\tfor (unsigned int i = 0; i < 10; i++){\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tsc.ForwardSetState(SCE_BAAN_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_BAAN_STRING) {\n\t\t\tif (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_BAAN_DEFAULT);\n\t\t\t} else if ((sc.atLineEnd) && (sc.chNext != '^')) {\n\t\t\t\tsc.ChangeState(SCE_BAAN_STRINGEOL);\n\t\t\t\tsc.ForwardSetState(SCE_C_DEFAULT);\n\t\t\t\tvisibleChars = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (sc.state == SCE_BAAN_DEFAULT) {\n\t\t\tif (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_BAAN_NUMBER);\n\t\t\t} else if (sc.MatchIgnoreCase(\"dllusage\")){\n\t\t\t\t\tsc.SetState(SCE_BAAN_COMMENTDOC);\n\t\t\t\t\tdo {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t} while ((!sc.atLineEnd) && sc.More());\n\t\t\t} else if (IsAWordStart(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_BAAN_IDENTIFIER);\n\t\t\t} else if (sc.Match('|')){\n\t\t\t\t\tsc.SetState(SCE_BAAN_COMMENT);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_BAAN_STRING);\n\t\t\t} else if (sc.ch == '#' && visibleChars == 0) {\n\t\t\t\t// Preprocessor commands are alone on their line\n\t\t\t\tsc.SetState(SCE_BAAN_PREPROCESSOR);\n\t\t\t\t// Skip whitespace between # and preprocessor word\n\t\t\t\tdo {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} while (IsASpace(sc.ch) && sc.More());\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_BAAN_OPERATOR);\n\t\t\t}\n\t\t}\n\t\tif (sc.atLineEnd) {\n\t\t\t// Reset states to begining of colourise so no surprises\n\t\t\t// if different sets of lines lexed.\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!IsASpace(sc.ch)) {\n\t\t\tvisibleChars++;\n\t\t}\n\t}\n\tsc.Complete();\n}\n\nstatic void FoldBaanDoc(unsigned int startPos, int length, int initStyle, WordList *[],\n                            Accessor &styler) {\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (foldComment &&\n\t\t\t(style == SCE_BAAN_COMMENT || style == SCE_BAAN_COMMENTDOC)) {\n\t\t\tif (style != stylePrev) {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if ((style != styleNext) && !atEOL) {\n\t\t\t\t// Comments don't end at end of line and the next character may be unstyled.\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\t\tif (style == SCE_BAAN_OPERATOR) {\n\t\t\tif (ch == '{') {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (ch == '}') {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nLexerModule lmBaan(SCLEX_BAAN, ColouriseBaanDoc, \"baan\", FoldBaanDoc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexBash.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexBash.cxx\n ** Lexer for Bash.\n **/\n// Copyright 2004-2012 by Neil Hodgson <neilh@scintilla.org>\n// Adapted from LexPerl by Kein-Hong Man 2004\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n#define HERE_DELIM_MAX\t\t\t256\n\n// define this if you want 'invalid octals' to be marked as errors\n// usually, this is not a good idea, permissive lexing is better\n#undef PEDANTIC_OCTAL\n\n#define BASH_BASE_ERROR\t\t\t65\n#define BASH_BASE_DECIMAL\t\t66\n#define BASH_BASE_HEX\t\t\t67\n#ifdef PEDANTIC_OCTAL\n#define BASH_BASE_OCTAL\t\t\t68\n#define\tBASH_BASE_OCTAL_ERROR\t69\n#endif\n\n// state constants for parts of a bash command segment\n#define\tBASH_CMD_BODY\t\t\t0\n#define BASH_CMD_START\t\t\t1\n#define BASH_CMD_WORD\t\t\t2\n#define BASH_CMD_TEST\t\t\t3\n#define BASH_CMD_ARITH\t\t\t4\n#define BASH_CMD_DELIM\t\t\t5\n\n// state constants for nested delimiter pairs, used by\n// SCE_SH_STRING and SCE_SH_BACKTICKS processing\n#define BASH_DELIM_LITERAL\t\t0\n#define BASH_DELIM_STRING\t\t1\n#define BASH_DELIM_CSTRING\t\t2\n#define BASH_DELIM_LSTRING\t\t3\n#define BASH_DELIM_COMMAND\t\t4\n#define BASH_DELIM_BACKTICK\t\t5\n\n#define BASH_DELIM_STACK_MAX\t7\n\nstatic inline int translateBashDigit(int ch) {\n\tif (ch >= '0' && ch <= '9') {\n\t\treturn ch - '0';\n\t} else if (ch >= 'a' && ch <= 'z') {\n\t\treturn ch - 'a' + 10;\n\t} else if (ch >= 'A' && ch <= 'Z') {\n\t\treturn ch - 'A' + 36;\n\t} else if (ch == '@') {\n\t\treturn 62;\n\t} else if (ch == '_') {\n\t\treturn 63;\n\t}\n\treturn BASH_BASE_ERROR;\n}\n\nstatic inline int getBashNumberBase(char *s) {\n\tint i = 0;\n\tint base = 0;\n\twhile (*s) {\n\t\tbase = base * 10 + (*s++ - '0');\n\t\ti++;\n\t}\n\tif (base > 64 || i > 2) {\n\t\treturn BASH_BASE_ERROR;\n\t}\n\treturn base;\n}\n\nstatic int opposite(int ch) {\n\tif (ch == '(') return ')';\n\tif (ch == '[') return ']';\n\tif (ch == '{') return '}';\n\tif (ch == '<') return '>';\n\treturn ch;\n}\n\nstatic void ColouriseBashDoc(unsigned int startPos, int length, int initStyle,\n\t\t\t\t\t\t\t WordList *keywordlists[], Accessor &styler) {\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList cmdDelimiter, bashStruct, bashStruct_in;\n\tcmdDelimiter.Set(\"| || |& & && ; ;; ( ) { }\");\n\tbashStruct.Set(\"if elif fi while until else then do done esac eval\");\n\tbashStruct_in.Set(\"for case select\");\n\n\tCharacterSet setWordStart(CharacterSet::setAlpha, \"_\");\n\t// note that [+-] are often parts of identifiers in shell scripts\n\tCharacterSet setWord(CharacterSet::setAlphaNum, \"._+-\");\n\tCharacterSet setBashOperator(CharacterSet::setNone, \"^&%()-+=|{}[]:;>,*/<?!.~@\");\n\tCharacterSet setSingleCharOp(CharacterSet::setNone, \"rwxoRWXOezsfdlpSbctugkTBMACahGLNn\");\n\tCharacterSet setParam(CharacterSet::setAlphaNum, \"$_\");\n\tCharacterSet setHereDoc(CharacterSet::setAlpha, \"_\\\\-+!\");\n\tCharacterSet setHereDoc2(CharacterSet::setAlphaNum, \"_-+!\");\n\tCharacterSet setLeftShift(CharacterSet::setDigits, \"=$\");\n\n\tclass HereDocCls {\t// Class to manage HERE document elements\n\tpublic:\n\t\tint State;\t\t// 0: '<<' encountered\n\t\t// 1: collect the delimiter\n\t\t// 2: here doc text (lines after the delimiter)\n\t\tint Quote;\t\t// the char after '<<'\n\t\tbool Quoted;\t\t// true if Quote in ('\\'','\"','`')\n\t\tbool Indent;\t\t// indented delimiter (for <<-)\n\t\tint DelimiterLength;\t// strlen(Delimiter)\n\t\tchar *Delimiter;\t// the Delimiter, 256: sizeof PL_tokenbuf\n\t\tHereDocCls() {\n\t\t\tState = 0;\n\t\t\tQuote = 0;\n\t\t\tQuoted = false;\n\t\t\tIndent = 0;\n\t\t\tDelimiterLength = 0;\n\t\t\tDelimiter = new char[HERE_DELIM_MAX];\n\t\t\tDelimiter[0] = '\\0';\n\t\t}\n\t\tvoid Append(int ch) {\n\t\t\tDelimiter[DelimiterLength++] = static_cast<char>(ch);\n\t\t\tDelimiter[DelimiterLength] = '\\0';\n\t\t}\n\t\t~HereDocCls() {\n\t\t\tdelete []Delimiter;\n\t\t}\n\t};\n\tHereDocCls HereDoc;\n\n\tclass QuoteCls {\t// Class to manage quote pairs (simplified vs LexPerl)\n\t\tpublic:\n\t\tint Count;\n\t\tint Up, Down;\n\t\tQuoteCls() {\n\t\t\tCount = 0;\n\t\t\tUp    = '\\0';\n\t\t\tDown  = '\\0';\n\t\t}\n\t\tvoid Open(int u) {\n\t\t\tCount++;\n\t\t\tUp    = u;\n\t\t\tDown  = opposite(Up);\n\t\t}\n\t\tvoid Start(int u) {\n\t\t\tCount = 0;\n\t\t\tOpen(u);\n\t\t}\n\t};\n\tQuoteCls Quote;\n\n\tclass QuoteStackCls {\t// Class to manage quote pairs that nest\n\t\tpublic:\n\t\tint Count;\n\t\tint Up, Down;\n\t\tint Style;\n\t\tint Depth;\t\t\t// levels pushed\n\t\tint *CountStack;\n\t\tint *UpStack;\n\t\tint *StyleStack;\n\t\tQuoteStackCls() {\n\t\t\tCount = 0;\n\t\t\tUp    = '\\0';\n\t\t\tDown  = '\\0';\n\t\t\tStyle = 0;\n\t\t\tDepth = 0;\n\t\t\tCountStack = new int[BASH_DELIM_STACK_MAX];\n\t\t\tUpStack    = new int[BASH_DELIM_STACK_MAX];\n\t\t\tStyleStack = new int[BASH_DELIM_STACK_MAX];\n\t\t}\n\t\tvoid Start(int u, int s) {\n\t\t\tCount = 1;\n\t\t\tUp    = u;\n\t\t\tDown  = opposite(Up);\n\t\t\tStyle = s;\n\t\t}\n\t\tvoid Push(int u, int s) {\n\t\t\tif (Depth >= BASH_DELIM_STACK_MAX)\n\t\t\t\treturn;\n\t\t\tCountStack[Depth] = Count;\n\t\t\tUpStack   [Depth] = Up;\n\t\t\tStyleStack[Depth] = Style;\n\t\t\tDepth++;\n\t\t\tCount = 1;\n\t\t\tUp    = u;\n\t\t\tDown  = opposite(Up);\n\t\t\tStyle = s;\n\t\t}\n\t\tvoid Pop(void) {\n\t\t\tif (Depth <= 0)\n\t\t\t\treturn;\n\t\t\tDepth--;\n\t\t\tCount = CountStack[Depth];\n\t\t\tUp    = UpStack   [Depth];\n\t\t\tStyle = StyleStack[Depth];\n\t\t\tDown  = opposite(Up);\n\t\t}\n\t\t~QuoteStackCls() {\n\t\t\tdelete []CountStack;\n\t\t\tdelete []UpStack;\n\t\t\tdelete []StyleStack;\n\t\t}\n\t};\n\tQuoteStackCls QuoteStack;\n\n\tint numBase = 0;\n\tint digit;\n\tunsigned int endPos = startPos + length;\n\tint cmdState = BASH_CMD_START;\n\tint testExprType = 0;\n\n\t// Always backtracks to the start of a line that is not a continuation\n\t// of the previous line (i.e. start of a bash command segment)\n\tint ln = styler.GetLine(startPos);\n\tif (ln > 0 && startPos == static_cast<unsigned int>(styler.LineStart(ln)))\n\t\tln--;\n\tfor (;;) {\n\t\tstartPos = styler.LineStart(ln);\n\t\tif (ln == 0 || styler.GetLineState(ln) == BASH_CMD_START)\n\t\t\tbreak;\n\t\tln--;\n\t}\n\tinitStyle = SCE_SH_DEFAULT;\n\n\tStyleContext sc(startPos, endPos - startPos, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\t// handle line continuation, updates per-line stored state\n\t\tif (sc.atLineStart) {\n\t\t\tln = styler.GetLine(sc.currentPos);\n\t\t\tif (sc.state == SCE_SH_STRING\n\t\t\t || sc.state == SCE_SH_BACKTICKS\n\t\t\t || sc.state == SCE_SH_CHARACTER\n\t\t\t || sc.state == SCE_SH_HERE_Q\n\t\t\t || sc.state == SCE_SH_COMMENTLINE\n\t\t\t || sc.state == SCE_SH_PARAM) {\n\t\t\t\t// force backtrack while retaining cmdState\n\t\t\t\tstyler.SetLineState(ln, BASH_CMD_BODY);\n\t\t\t} else {\n\t\t\t\tif (ln > 0) {\n\t\t\t\t\tif ((sc.GetRelative(-3) == '\\\\' && sc.GetRelative(-2) == '\\r' && sc.chPrev == '\\n')\n\t\t\t\t\t || sc.GetRelative(-2) == '\\\\') {\t// handle '\\' line continuation\n\t\t\t\t\t\t// retain last line's state\n\t\t\t\t\t} else\n\t\t\t\t\t\tcmdState = BASH_CMD_START;\n\t\t\t\t}\n\t\t\t\tstyler.SetLineState(ln, cmdState);\n\t\t\t}\n\t\t}\n\n\t\t// controls change of cmdState at the end of a non-whitespace element\n\t\t// states BODY|TEST|ARITH persist until the end of a command segment\n\t\t// state WORD persist, but ends with 'in' or 'do' construct keywords\n\t\tint cmdStateNew = BASH_CMD_BODY;\n\t\tif (cmdState == BASH_CMD_TEST || cmdState == BASH_CMD_ARITH || cmdState == BASH_CMD_WORD)\n\t\t\tcmdStateNew = cmdState;\n\t\tint stylePrev = sc.state;\n\n\t\t// Determine if the current state should terminate.\n\t\tswitch (sc.state) {\n\t\t\tcase SCE_SH_OPERATOR:\n\t\t\t\tsc.SetState(SCE_SH_DEFAULT);\n\t\t\t\tif (cmdState == BASH_CMD_DELIM)\t\t// if command delimiter, start new command\n\t\t\t\t\tcmdStateNew = BASH_CMD_START;\n\t\t\t\telse if (sc.chPrev == '\\\\')\t\t\t// propagate command state if line continued\n\t\t\t\t\tcmdStateNew = cmdState;\n\t\t\t\tbreak;\n\t\t\tcase SCE_SH_WORD:\n\t\t\t\t// \".\" never used in Bash variable names but used in file names\n\t\t\t\tif (!setWord.Contains(sc.ch)) {\n\t\t\t\t\tchar s[500];\n\t\t\t\t\tchar s2[10];\n\t\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\t\t// allow keywords ending in a whitespace or command delimiter\n\t\t\t\t\ts2[0] = static_cast<char>(sc.ch);\n\t\t\t\t\ts2[1] = '\\0';\n\t\t\t\t\tbool keywordEnds = IsASpace(sc.ch) || cmdDelimiter.InList(s2);\n\t\t\t\t\t// 'in' or 'do' may be construct keywords\n\t\t\t\t\tif (cmdState == BASH_CMD_WORD) {\n\t\t\t\t\t\tif (strcmp(s, \"in\") == 0 && keywordEnds)\n\t\t\t\t\t\t\tcmdStateNew = BASH_CMD_BODY;\n\t\t\t\t\t\telse if (strcmp(s, \"do\") == 0 && keywordEnds)\n\t\t\t\t\t\t\tcmdStateNew = BASH_CMD_START;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tsc.ChangeState(SCE_SH_IDENTIFIER);\n\t\t\t\t\t\tsc.SetState(SCE_SH_DEFAULT);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// a 'test' keyword starts a test expression\n\t\t\t\t\tif (strcmp(s, \"test\") == 0) {\n\t\t\t\t\t\tif (cmdState == BASH_CMD_START && keywordEnds) {\n\t\t\t\t\t\t\tcmdStateNew = BASH_CMD_TEST;\n\t\t\t\t\t\t\ttestExprType = 0;\n\t\t\t\t\t\t} else\n\t\t\t\t\t\t\tsc.ChangeState(SCE_SH_IDENTIFIER);\n\t\t\t\t\t}\n\t\t\t\t\t// detect bash construct keywords\n\t\t\t\t\telse if (bashStruct.InList(s)) {\n\t\t\t\t\t\tif (cmdState == BASH_CMD_START && keywordEnds)\n\t\t\t\t\t\t\tcmdStateNew = BASH_CMD_START;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tsc.ChangeState(SCE_SH_IDENTIFIER);\n\t\t\t\t\t}\n\t\t\t\t\t// 'for'|'case'|'select' needs 'in'|'do' to be highlighted later\n\t\t\t\t\telse if (bashStruct_in.InList(s)) {\n\t\t\t\t\t\tif (cmdState == BASH_CMD_START && keywordEnds)\n\t\t\t\t\t\t\tcmdStateNew = BASH_CMD_WORD;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tsc.ChangeState(SCE_SH_IDENTIFIER);\n\t\t\t\t\t}\n\t\t\t\t\t// disambiguate option items and file test operators\n\t\t\t\t\telse if (s[0] == '-') {\n\t\t\t\t\t\tif (cmdState != BASH_CMD_TEST)\n\t\t\t\t\t\t\tsc.ChangeState(SCE_SH_IDENTIFIER);\n\t\t\t\t\t}\n\t\t\t\t\t// disambiguate keywords and identifiers\n\t\t\t\t\telse if (cmdState != BASH_CMD_START\n\t\t\t\t\t\t  || !(keywords.InList(s) && keywordEnds)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_SH_IDENTIFIER);\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(SCE_SH_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_SH_IDENTIFIER:\n\t\t\t\tif (sc.chPrev == '\\\\') {\t// for escaped chars\n\t\t\t\t\tsc.ForwardSetState(SCE_SH_DEFAULT);\n\t\t\t\t} else if (!setWord.Contains(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_SH_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_SH_NUMBER:\n\t\t\t\tdigit = translateBashDigit(sc.ch);\n\t\t\t\tif (numBase == BASH_BASE_DECIMAL) {\n\t\t\t\t\tif (sc.ch == '#') {\n\t\t\t\t\t\tchar s[10];\n\t\t\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\t\t\tnumBase = getBashNumberBase(s);\n\t\t\t\t\t\tif (numBase != BASH_BASE_ERROR)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (IsADigit(sc.ch))\n\t\t\t\t\t\tbreak;\n\t\t\t\t} else if (numBase == BASH_BASE_HEX) {\n\t\t\t\t\tif (IsADigit(sc.ch, 16))\n\t\t\t\t\t\tbreak;\n#ifdef PEDANTIC_OCTAL\n\t\t\t\t} else if (numBase == BASH_BASE_OCTAL ||\n\t\t\t\t\t\t   numBase == BASH_BASE_OCTAL_ERROR) {\n\t\t\t\t\tif (digit <= 7)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tif (digit <= 9) {\n\t\t\t\t\t\tnumBase = BASH_BASE_OCTAL_ERROR;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n#endif\n\t\t\t\t} else if (numBase == BASH_BASE_ERROR) {\n\t\t\t\t\tif (digit <= 9)\n\t\t\t\t\t\tbreak;\n\t\t\t\t} else {\t// DD#DDDD number style handling\n\t\t\t\t\tif (digit != BASH_BASE_ERROR) {\n\t\t\t\t\t\tif (numBase <= 36) {\n\t\t\t\t\t\t\t// case-insensitive if base<=36\n\t\t\t\t\t\t\tif (digit >= 36) digit -= 26;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (digit < numBase)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tif (digit <= 9) {\n\t\t\t\t\t\t\tnumBase = BASH_BASE_ERROR;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// fallthrough when number is at an end or error\n\t\t\t\tif (numBase == BASH_BASE_ERROR\n#ifdef PEDANTIC_OCTAL\n\t\t\t\t\t|| numBase == BASH_BASE_OCTAL_ERROR\n#endif\n\t\t\t\t) {\n\t\t\t\t\tsc.ChangeState(SCE_SH_ERROR);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_SH_DEFAULT);\n\t\t\t\tbreak;\n\t\t\tcase SCE_SH_COMMENTLINE:\n\t\t\t\tif (sc.atLineEnd && sc.chPrev != '\\\\') {\n\t\t\t\t\tsc.SetState(SCE_SH_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_SH_HERE_DELIM:\n\t\t\t\t// From Bash info:\n\t\t\t\t// ---------------\n\t\t\t\t// Specifier format is: <<[-]WORD\n\t\t\t\t// Optional '-' is for removal of leading tabs from here-doc.\n\t\t\t\t// Whitespace acceptable after <<[-] operator\n\t\t\t\t//\n\t\t\t\tif (HereDoc.State == 0) { // '<<' encountered\n\t\t\t\t\tHereDoc.Quote = sc.chNext;\n\t\t\t\t\tHereDoc.Quoted = false;\n\t\t\t\t\tHereDoc.DelimiterLength = 0;\n\t\t\t\t\tHereDoc.Delimiter[HereDoc.DelimiterLength] = '\\0';\n\t\t\t\t\tif (sc.chNext == '\\'' || sc.chNext == '\\\"') {\t// a quoted here-doc delimiter (' or \")\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\tHereDoc.Quoted = true;\n\t\t\t\t\t\tHereDoc.State = 1;\n\t\t\t\t\t} else if (!HereDoc.Indent && sc.chNext == '-') {\t// <<- indent case\n\t\t\t\t\t\tHereDoc.Indent = true;\n\t\t\t\t\t} else if (setHereDoc.Contains(sc.chNext)) {\n\t\t\t\t\t\t// an unquoted here-doc delimiter, no special handling\n\t\t\t\t\t\t// TODO check what exactly bash considers part of the delim\n\t\t\t\t\t\tHereDoc.State = 1;\n\t\t\t\t\t} else if (sc.chNext == '<') {\t// HERE string <<<\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\tsc.ForwardSetState(SCE_SH_DEFAULT);\n\t\t\t\t\t} else if (IsASpace(sc.chNext)) {\n\t\t\t\t\t\t// eat whitespace\n\t\t\t\t\t} else if (setLeftShift.Contains(sc.chNext)) {\n\t\t\t\t\t\t// left shift << or <<= operator cases\n\t\t\t\t\t\tsc.ChangeState(SCE_SH_OPERATOR);\n\t\t\t\t\t\tsc.ForwardSetState(SCE_SH_DEFAULT);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// symbols terminates; deprecated zero-length delimiter\n\t\t\t\t\t\tHereDoc.State = 1;\n\t\t\t\t\t}\n\t\t\t\t} else if (HereDoc.State == 1) { // collect the delimiter\n\t\t\t\t\t// * if single quoted, there's no escape\n\t\t\t\t\t// * if double quoted, there are \\\\ and \\\" escapes\n\t\t\t\t\tif ((HereDoc.Quote == '\\'' && sc.ch != HereDoc.Quote) ||\n\t\t\t\t\t    (HereDoc.Quoted && sc.ch != HereDoc.Quote && sc.ch != '\\\\') ||\n\t\t\t\t\t    (HereDoc.Quote != '\\'' && sc.chPrev == '\\\\') ||\n\t\t\t\t\t    (setHereDoc2.Contains(sc.ch))) {\n\t\t\t\t\t\tHereDoc.Append(sc.ch);\n\t\t\t\t\t} else if (HereDoc.Quoted && sc.ch == HereDoc.Quote) {\t// closing quote => end of delimiter\n\t\t\t\t\t\tsc.ForwardSetState(SCE_SH_DEFAULT);\n\t\t\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\t\t\tif (HereDoc.Quoted && sc.chNext != HereDoc.Quote && sc.chNext != '\\\\') {\n\t\t\t\t\t\t\t// in quoted prefixes only \\ and the quote eat the escape\n\t\t\t\t\t\t\tHereDoc.Append(sc.ch);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// skip escape prefix\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (!HereDoc.Quoted) {\n\t\t\t\t\t\tsc.SetState(SCE_SH_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t\tif (HereDoc.DelimiterLength >= HERE_DELIM_MAX - 1) {\t// force blowup\n\t\t\t\t\t\tsc.SetState(SCE_SH_ERROR);\n\t\t\t\t\t\tHereDoc.State = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_SH_HERE_Q:\n\t\t\t\t// HereDoc.State == 2\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_SH_HERE_Q);\n\t\t\t\t\tint prefixws = 0;\n\t\t\t\t\twhile (IsASpace(sc.ch) && !sc.atLineEnd) {\t// whitespace prefix\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\tprefixws++;\n\t\t\t\t\t}\n\t\t\t\t\tif (prefixws > 0)\n\t\t\t\t\t\tsc.SetState(SCE_SH_HERE_Q);\n\t\t\t\t\twhile (!sc.atLineEnd) {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t\tchar s[HERE_DELIM_MAX];\n\t\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\t\tif (sc.LengthCurrent() == 0) {  // '' or \"\" delimiters\n\t\t\t\t\t\tif (prefixws == 0 && HereDoc.Quoted && HereDoc.DelimiterLength == 0)\n\t\t\t\t\t\t\tsc.SetState(SCE_SH_DEFAULT);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (s[strlen(s) - 1] == '\\r')\n\t\t\t\t\t\ts[strlen(s) - 1] = '\\0';\n\t\t\t\t\tif (strcmp(HereDoc.Delimiter, s) == 0) {\n\t\t\t\t\t\tif ((prefixws == 0) ||\t// indentation rule\n\t\t\t\t\t\t\t(prefixws > 0 && HereDoc.Indent)) {\n\t\t\t\t\t\t\tsc.SetState(SCE_SH_DEFAULT);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_SH_SCALAR:\t// variable names\n\t\t\t\tif (!setParam.Contains(sc.ch)) {\n\t\t\t\t\tif (sc.LengthCurrent() == 1) {\n\t\t\t\t\t\t// Special variable: $(, $_ etc.\n\t\t\t\t\t\tsc.ForwardSetState(SCE_SH_DEFAULT);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.SetState(SCE_SH_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_SH_STRING:\t// delimited styles, can nest\n\t\t\tcase SCE_SH_BACKTICKS:\n\t\t\t\tif (sc.ch == '\\\\' && QuoteStack.Up != '\\\\') {\n\t\t\t\t\tif (QuoteStack.Style != BASH_DELIM_LITERAL)\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t} else if (sc.ch == QuoteStack.Down) {\n\t\t\t\t\tQuoteStack.Count--;\n\t\t\t\t\tif (QuoteStack.Count == 0) {\n\t\t\t\t\t\tif (QuoteStack.Depth > 0) {\n\t\t\t\t\t\t\tQuoteStack.Pop();\n\t\t\t\t\t\t} else\n\t\t\t\t\t\t\tsc.ForwardSetState(SCE_SH_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == QuoteStack.Up) {\n\t\t\t\t\tQuoteStack.Count++;\n\t\t\t\t} else {\n\t\t\t\t\tif (QuoteStack.Style == BASH_DELIM_STRING ||\n\t\t\t\t\t\tQuoteStack.Style == BASH_DELIM_LSTRING\n\t\t\t\t\t) {\t// do nesting for \"string\", $\"locale-string\"\n\t\t\t\t\t\tif (sc.ch == '`') {\n\t\t\t\t\t\t\tQuoteStack.Push(sc.ch, BASH_DELIM_BACKTICK);\n\t\t\t\t\t\t} else if (sc.ch == '$' && sc.chNext == '(') {\n\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\t\tQuoteStack.Push(sc.ch, BASH_DELIM_COMMAND);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (QuoteStack.Style == BASH_DELIM_COMMAND ||\n\t\t\t\t\t\t\t   QuoteStack.Style == BASH_DELIM_BACKTICK\n\t\t\t\t\t) {\t// do nesting for $(command), `command`\n\t\t\t\t\t\tif (sc.ch == '\\'') {\n\t\t\t\t\t\t\tQuoteStack.Push(sc.ch, BASH_DELIM_LITERAL);\n\t\t\t\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\t\t\t\tQuoteStack.Push(sc.ch, BASH_DELIM_STRING);\n\t\t\t\t\t\t} else if (sc.ch == '`') {\n\t\t\t\t\t\t\tQuoteStack.Push(sc.ch, BASH_DELIM_BACKTICK);\n\t\t\t\t\t\t} else if (sc.ch == '$') {\n\t\t\t\t\t\t\tif (sc.chNext == '\\'') {\n\t\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\t\t\tQuoteStack.Push(sc.ch, BASH_DELIM_CSTRING);\n\t\t\t\t\t\t\t} else if (sc.chNext == '\\\"') {\n\t\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\t\t\tQuoteStack.Push(sc.ch, BASH_DELIM_LSTRING);\n\t\t\t\t\t\t\t} else if (sc.chNext == '(') {\n\t\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\t\t\tQuoteStack.Push(sc.ch, BASH_DELIM_COMMAND);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_SH_PARAM: // ${parameter}\n\t\t\t\tif (sc.ch == '\\\\' && Quote.Up != '\\\\') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} else if (sc.ch == Quote.Down) {\n\t\t\t\t\tQuote.Count--;\n\t\t\t\t\tif (Quote.Count == 0) {\n\t\t\t\t\t\tsc.ForwardSetState(SCE_SH_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == Quote.Up) {\n\t\t\t\t\tQuote.Count++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_SH_CHARACTER: // singly-quoted strings\n\t\t\t\tif (sc.ch == Quote.Down) {\n\t\t\t\t\tQuote.Count--;\n\t\t\t\t\tif (Quote.Count == 0) {\n\t\t\t\t\t\tsc.ForwardSetState(SCE_SH_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Must check end of HereDoc state 1 before default state is handled\n\t\tif (HereDoc.State == 1 && sc.atLineEnd) {\n\t\t\t// Begin of here-doc (the line after the here-doc delimiter):\n\t\t\t// Lexically, the here-doc starts from the next line after the >>, but the\n\t\t\t// first line of here-doc seem to follow the style of the last EOL sequence\n\t\t\tHereDoc.State = 2;\n\t\t\tif (HereDoc.Quoted) {\n\t\t\t\tif (sc.state == SCE_SH_HERE_DELIM) {\n\t\t\t\t\t// Missing quote at end of string! We are stricter than bash.\n\t\t\t\t\t// Colour here-doc anyway while marking this bit as an error.\n\t\t\t\t\tsc.ChangeState(SCE_SH_ERROR);\n\t\t\t\t}\n\t\t\t\t// HereDoc.Quote always == '\\''\n\t\t\t\tsc.SetState(SCE_SH_HERE_Q);\n\t\t\t} else if (HereDoc.DelimiterLength == 0) {\n\t\t\t\t// no delimiter, illegal (but '' and \"\" are legal)\n\t\t\t\tsc.ChangeState(SCE_SH_ERROR);\n\t\t\t\tsc.SetState(SCE_SH_DEFAULT);\n\t\t\t} else {\n\t\t\t\tsc.SetState(SCE_SH_HERE_Q);\n\t\t\t}\n\t\t}\n\n\t\t// update cmdState about the current command segment\n\t\tif (stylePrev != SCE_SH_DEFAULT && sc.state == SCE_SH_DEFAULT) {\n\t\t\tcmdState = cmdStateNew;\n\t\t}\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_SH_DEFAULT) {\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\t// Bash can escape any non-newline as a literal\n\t\t\t\tsc.SetState(SCE_SH_IDENTIFIER);\n\t\t\t\tif (sc.chNext == '\\r' || sc.chNext == '\\n')\n\t\t\t\t\tsc.SetState(SCE_SH_OPERATOR);\n\t\t\t} else if (IsADigit(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_SH_NUMBER);\n\t\t\t\tnumBase = BASH_BASE_DECIMAL;\n\t\t\t\tif (sc.ch == '0') {\t// hex,octal\n\t\t\t\t\tif (sc.chNext == 'x' || sc.chNext == 'X') {\n\t\t\t\t\t\tnumBase = BASH_BASE_HEX;\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t} else if (IsADigit(sc.chNext)) {\n#ifdef PEDANTIC_OCTAL\n\t\t\t\t\t\tnumBase = BASH_BASE_OCTAL;\n#else\n\t\t\t\t\t\tnumBase = BASH_BASE_HEX;\n#endif\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (setWordStart.Contains(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_SH_WORD);\n\t\t\t} else if (sc.ch == '#') {\n\t\t\t\tsc.SetState(SCE_SH_COMMENTLINE);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_SH_STRING);\n\t\t\t\tQuoteStack.Start(sc.ch, BASH_DELIM_STRING);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_SH_CHARACTER);\n\t\t\t\tQuote.Start(sc.ch);\n\t\t\t} else if (sc.ch == '`') {\n\t\t\t\tsc.SetState(SCE_SH_BACKTICKS);\n\t\t\t\tQuoteStack.Start(sc.ch, BASH_DELIM_BACKTICK);\n\t\t\t} else if (sc.ch == '$') {\n\t\t\t\tif (sc.Match(\"$((\")) {\n\t\t\t\t\tsc.SetState(SCE_SH_OPERATOR);\t// handle '((' later\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_SH_SCALAR);\n\t\t\t\tsc.Forward();\n\t\t\t\tif (sc.ch == '{') {\n\t\t\t\t\tsc.ChangeState(SCE_SH_PARAM);\n\t\t\t\t\tQuote.Start(sc.ch);\n\t\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\t\tsc.ChangeState(SCE_SH_STRING);\n\t\t\t\t\tQuoteStack.Start(sc.ch, BASH_DELIM_CSTRING);\n\t\t\t\t} else if (sc.ch == '\"') {\n\t\t\t\t\tsc.ChangeState(SCE_SH_STRING);\n\t\t\t\t\tQuoteStack.Start(sc.ch, BASH_DELIM_LSTRING);\n\t\t\t\t} else if (sc.ch == '(') {\n\t\t\t\t\tsc.ChangeState(SCE_SH_BACKTICKS);\n\t\t\t\t\tQuoteStack.Start(sc.ch, BASH_DELIM_COMMAND);\n\t\t\t\t} else if (sc.ch == '`') {\t// $` seen in a configure script, valid?\n\t\t\t\t\tsc.ChangeState(SCE_SH_BACKTICKS);\n\t\t\t\t\tQuoteStack.Start(sc.ch, BASH_DELIM_BACKTICK);\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\t// scalar has no delimiter pair\n\t\t\t\t}\n\t\t\t} else if (sc.Match('<', '<')) {\n\t\t\t\tsc.SetState(SCE_SH_HERE_DELIM);\n\t\t\t\tHereDoc.State = 0;\n\t\t\t\tHereDoc.Indent = false;\n\t\t\t} else if (sc.ch == '-'\t&&\t// one-char file test operators\n\t\t\t\t\t   setSingleCharOp.Contains(sc.chNext) &&\n\t\t\t\t\t   !setWord.Contains(sc.GetRelative(2)) &&\n\t\t\t\t\t   IsASpace(sc.chPrev)) {\n\t\t\t\tsc.SetState(SCE_SH_WORD);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (setBashOperator.Contains(sc.ch)) {\n\t\t\t\tchar s[10];\n\t\t\t\tbool isCmdDelim = false;\n\t\t\t\tsc.SetState(SCE_SH_OPERATOR);\n\t\t\t\t// handle opening delimiters for test/arithmetic expressions - ((,[[,[\n\t\t\t\tif (cmdState == BASH_CMD_START\n\t\t\t\t || cmdState == BASH_CMD_BODY) {\n\t\t\t\t\tif (sc.Match('(', '(')) {\n\t\t\t\t\t\tcmdState = BASH_CMD_ARITH;\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t} else if (sc.Match('[', '[') && IsASpace(sc.GetRelative(2))) {\n\t\t\t\t\t\tcmdState = BASH_CMD_TEST;\n\t\t\t\t\t\ttestExprType = 1;\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t} else if (sc.ch == '[' && IsASpace(sc.chNext)) {\n\t\t\t\t\t\tcmdState = BASH_CMD_TEST;\n\t\t\t\t\t\ttestExprType = 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// special state -- for ((x;y;z)) in ... looping\n\t\t\t\tif (cmdState == BASH_CMD_WORD && sc.Match('(', '(')) {\n\t\t\t\t\tcmdState = BASH_CMD_ARITH;\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// handle command delimiters in command START|BODY|WORD state, also TEST if 'test'\n\t\t\t\tif (cmdState == BASH_CMD_START\n\t\t\t\t || cmdState == BASH_CMD_BODY\n\t\t\t\t || cmdState == BASH_CMD_WORD\n\t\t\t\t || (cmdState == BASH_CMD_TEST && testExprType == 0)) {\n\t\t\t\t\ts[0] = static_cast<char>(sc.ch);\n\t\t\t\t\tif (setBashOperator.Contains(sc.chNext)) {\n\t\t\t\t\t\ts[1] = static_cast<char>(sc.chNext);\n\t\t\t\t\t\ts[2] = '\\0';\n\t\t\t\t\t\tisCmdDelim = cmdDelimiter.InList(s);\n\t\t\t\t\t\tif (isCmdDelim)\n\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t\tif (!isCmdDelim) {\n\t\t\t\t\t\ts[1] = '\\0';\n\t\t\t\t\t\tisCmdDelim = cmdDelimiter.InList(s);\n\t\t\t\t\t}\n\t\t\t\t\tif (isCmdDelim) {\n\t\t\t\t\t\tcmdState = BASH_CMD_DELIM;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// handle closing delimiters for test/arithmetic expressions - )),]],]\n\t\t\t\tif (cmdState == BASH_CMD_ARITH && sc.Match(')', ')')) {\n\t\t\t\t\tcmdState = BASH_CMD_BODY;\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} else if (cmdState == BASH_CMD_TEST && IsASpace(sc.chPrev)) {\n\t\t\t\t\tif (sc.Match(']', ']') && testExprType == 1) {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\tcmdState = BASH_CMD_BODY;\n\t\t\t\t\t} else if (sc.ch == ']' && testExprType == 2) {\n\t\t\t\t\t\tcmdState = BASH_CMD_BODY;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}// sc.state\n\t}\n\tsc.Complete();\n\tif (sc.state == SCE_SH_HERE_Q) {\n\t\tstyler.ChangeLexerState(sc.currentPos, styler.Length());\n\t}\n\tsc.Complete();\n}\n\nstatic bool IsCommentLine(int line, Accessor &styler) {\n\tint pos = styler.LineStart(line);\n\tint eol_pos = styler.LineStart(line + 1) - 1;\n\tfor (int i = pos; i < eol_pos; i++) {\n\t\tchar ch = styler[i];\n\t\tif (ch == '#')\n\t\t\treturn true;\n\t\telse if (ch != ' ' && ch != '\\t')\n\t\t\treturn false;\n\t}\n\treturn false;\n}\n\nstatic void FoldBashDoc(unsigned int startPos, int length, int, WordList *[],\n\t\t\t\t\t\tAccessor &styler) {\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\t// Comment folding\n\t\tif (foldComment && atEOL && IsCommentLine(lineCurrent, styler))\n\t\t{\n\t\t\tif (!IsCommentLine(lineCurrent - 1, styler)\n\t\t\t\t&& IsCommentLine(lineCurrent + 1, styler))\n\t\t\t\tlevelCurrent++;\n\t\t\telse if (IsCommentLine(lineCurrent - 1, styler)\n\t\t\t\t\t && !IsCommentLine(lineCurrent + 1, styler))\n\t\t\t\tlevelCurrent--;\n\t\t}\n\t\tif (style == SCE_SH_OPERATOR) {\n\t\t\tif (ch == '{') {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (ch == '}') {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\t\t// Here Document folding\n\t\tif (style == SCE_SH_HERE_DELIM) {\n\t\t\tif (ch == '<' && chNext == '<') {\n\t\t\t\tlevelCurrent++;\n\t\t\t}\n\t\t} else if (style == SCE_SH_HERE_Q && styler.StyleAt(i+1) == SCE_SH_DEFAULT) {\n\t\t\tlevelCurrent--;\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nstatic const char * const bashWordListDesc[] = {\n\t\"Keywords\",\n\t0\n};\n\nLexerModule lmBash(SCLEX_BASH, ColouriseBashDoc, \"bash\", FoldBashDoc, bashWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexBasic.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexBasic.cxx\n ** Lexer for BlitzBasic and PureBasic.\n ** Converted to lexer object and added further folding features/properties by \"Udo Lechner\" <dlchnr(at)gmx(dot)net>\n **/\n// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n// This tries to be a unified Lexer/Folder for all the BlitzBasic/BlitzMax/PurBasic basics\n// and derivatives. Once they diverge enough, might want to split it into multiple\n// lexers for more code clearity.\n//\n// Mail me (elias <at> users <dot> sf <dot> net) for any bugs.\n\n// Folding only works for simple things like functions or types.\n\n// You may want to have a look at my ctags lexer as well, if you additionally to coloring\n// and folding need to extract things like label tags in your editor.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include <string>\n#include <map>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n#include \"OptionSet.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n/* Bits:\n * 1  - whitespace\n * 2  - operator\n * 4  - identifier\n * 8  - decimal digit\n * 16 - hex digit\n * 32 - bin digit\n */\nstatic int character_classification[128] =\n{\n    0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0,  1,  0,  0,\n    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n    1,  2,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  10, 2,\n    60, 60, 28, 28, 28, 28, 28, 28, 28, 28, 2,  2,  2,  2,  2,  2,\n    2,  20, 20, 20, 20, 20, 20, 4,  4,  4,  4,  4,  4,  4,  4,  4,\n    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  2,  2,  2,  2,  4,\n    2,  20, 20, 20, 20, 20, 20, 4,  4,  4,  4,  4,  4,  4,  4,  4,\n    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  2,  2,  2,  2,  0\n};\n\nstatic bool IsSpace(int c) {\n\treturn c < 128 && (character_classification[c] & 1);\n}\n\nstatic bool IsOperator(int c) {\n\treturn c < 128 && (character_classification[c] & 2);\n}\n\nstatic bool IsIdentifier(int c) {\n\treturn c < 128 && (character_classification[c] & 4);\n}\n\nstatic bool IsDigit(int c) {\n\treturn c < 128 && (character_classification[c] & 8);\n}\n\nstatic bool IsHexDigit(int c) {\n\treturn c < 128 && (character_classification[c] & 16);\n}\n\nstatic bool IsBinDigit(int c) {\n\treturn c < 128 && (character_classification[c] & 32);\n}\n\nstatic int LowerCase(int c)\n{\n\tif (c >= 'A' && c <= 'Z')\n\t\treturn 'a' + c - 'A';\n\treturn c;\n}\n\nstatic int CheckBlitzFoldPoint(char const *token, int &level) {\n\tif (!strcmp(token, \"function\") ||\n\t\t!strcmp(token, \"type\")) {\n\t\tlevel |= SC_FOLDLEVELHEADERFLAG;\n\t\treturn 1;\n\t}\n\tif (!strcmp(token, \"end function\") ||\n\t\t!strcmp(token, \"end type\")) {\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n\nstatic int CheckPureFoldPoint(char const *token, int &level) {\n\tif (!strcmp(token, \"procedure\") ||\n\t\t!strcmp(token, \"enumeration\") ||\n\t\t!strcmp(token, \"interface\") ||\n\t\t!strcmp(token, \"structure\")) {\n\t\tlevel |= SC_FOLDLEVELHEADERFLAG;\n\t\treturn 1;\n\t}\n\tif (!strcmp(token, \"endprocedure\") ||\n\t\t!strcmp(token, \"endenumeration\") ||\n\t\t!strcmp(token, \"endinterface\") ||\n\t\t!strcmp(token, \"endstructure\")) {\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n\nstatic int CheckFreeFoldPoint(char const *token, int &level) {\n\tif (!strcmp(token, \"function\") ||\n\t\t!strcmp(token, \"sub\") ||\n\t\t!strcmp(token, \"type\")) {\n\t\tlevel |= SC_FOLDLEVELHEADERFLAG;\n\t\treturn 1;\n\t}\n\tif (!strcmp(token, \"end function\") ||\n\t\t!strcmp(token, \"end sub\") ||\n\t\t!strcmp(token, \"end type\")) {\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n\n// An individual named option for use in an OptionSet\n\n// Options used for LexerBasic\nstruct OptionsBasic {\n\tbool fold;\n\tbool foldSyntaxBased;\n\tbool foldCommentExplicit;\n\tstd::string foldExplicitStart;\n\tstd::string foldExplicitEnd;\n\tbool foldExplicitAnywhere;\n\tbool foldCompact;\n\tOptionsBasic() {\n\t\tfold = false;\n\t\tfoldSyntaxBased = true;\n\t\tfoldCommentExplicit = false;\n\t\tfoldExplicitStart = \"\";\n\t\tfoldExplicitEnd   = \"\";\n\t\tfoldExplicitAnywhere = false;\n\t\tfoldCompact = true;\n\t}\n};\n\nstatic const char * const blitzbasicWordListDesc[] = {\n\t\"BlitzBasic Keywords\",\n\t\"user1\",\n\t\"user2\",\n\t\"user3\",\n\t0\n};\n\nstatic const char * const purebasicWordListDesc[] = {\n\t\"PureBasic Keywords\",\n\t\"PureBasic PreProcessor Keywords\",\n\t\"user defined 1\",\n\t\"user defined 2\",\n\t0\n};\n\nstatic const char * const freebasicWordListDesc[] = {\n\t\"FreeBasic Keywords\",\n\t\"FreeBasic PreProcessor Keywords\",\n\t\"user defined 1\",\n\t\"user defined 2\",\n\t0\n};\n\nstruct OptionSetBasic : public OptionSet<OptionsBasic> {\n\tOptionSetBasic(const char * const wordListDescriptions[]) {\n\t\tDefineProperty(\"fold\", &OptionsBasic::fold);\n\n\t\tDefineProperty(\"fold.basic.syntax.based\", &OptionsBasic::foldSyntaxBased,\n\t\t\t\"Set this property to 0 to disable syntax based folding.\");\n\n\t\tDefineProperty(\"fold.basic.comment.explicit\", &OptionsBasic::foldCommentExplicit,\n\t\t\t\"This option enables folding explicit fold points when using the Basic lexer. \"\n\t\t\t\"Explicit fold points allows adding extra folding by placing a ;{ (BB/PB) or '{ (FB) comment at the start \"\n\t\t\t\"and a ;} (BB/PB) or '} (FB) at the end of a section that should be folded.\");\n\n\t\tDefineProperty(\"fold.basic.explicit.start\", &OptionsBasic::foldExplicitStart,\n\t\t\t\"The string to use for explicit fold start points, replacing the standard ;{ (BB/PB) or '{ (FB).\");\n\n\t\tDefineProperty(\"fold.basic.explicit.end\", &OptionsBasic::foldExplicitEnd,\n\t\t\t\"The string to use for explicit fold end points, replacing the standard ;} (BB/PB) or '} (FB).\");\n\n\t\tDefineProperty(\"fold.basic.explicit.anywhere\", &OptionsBasic::foldExplicitAnywhere,\n\t\t\t\"Set this property to 1 to enable explicit fold points anywhere, not just in line comments.\");\n\n\t\tDefineProperty(\"fold.compact\", &OptionsBasic::foldCompact);\n\n\t\tDefineWordListSets(wordListDescriptions);\n\t}\n};\n\nclass LexerBasic : public ILexer {\n\tchar comment_char;\n\tint (*CheckFoldPoint)(char const *, int &);\n\tWordList keywordlists[4];\n\tOptionsBasic options;\n\tOptionSetBasic osBasic;\npublic:\n\tLexerBasic(char comment_char_, int (*CheckFoldPoint_)(char const *, int &), const char * const wordListDescriptions[]) :\n\t           comment_char(comment_char_),\n\t           CheckFoldPoint(CheckFoldPoint_),\n\t           osBasic(wordListDescriptions) {\n\t}\n\tvirtual ~LexerBasic() {\n\t}\n\tvoid SCI_METHOD Release() {\n\t\tdelete this;\n\t}\n\tint SCI_METHOD Version() const {\n\t\treturn lvOriginal;\n\t}\n\tconst char * SCI_METHOD PropertyNames() {\n\t\treturn osBasic.PropertyNames();\n\t}\n\tint SCI_METHOD PropertyType(const char *name) {\n\t\treturn osBasic.PropertyType(name);\n\t}\n\tconst char * SCI_METHOD DescribeProperty(const char *name) {\n\t\treturn osBasic.DescribeProperty(name);\n\t}\n\tint SCI_METHOD PropertySet(const char *key, const char *val);\n\tconst char * SCI_METHOD DescribeWordListSets() {\n\t\treturn osBasic.DescribeWordListSets();\n\t}\n\tint SCI_METHOD WordListSet(int n, const char *wl);\n\tvoid SCI_METHOD Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n\tvoid SCI_METHOD Fold(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n\n\tvoid * SCI_METHOD PrivateCall(int, void *) {\n\t\treturn 0;\n\t}\n\tstatic ILexer *LexerFactoryBlitzBasic() {\n\t\treturn new LexerBasic(';', CheckBlitzFoldPoint, blitzbasicWordListDesc);\n\t}\n\tstatic ILexer *LexerFactoryPureBasic() {\n\t\treturn new LexerBasic(';', CheckPureFoldPoint, purebasicWordListDesc);\n\t}\n\tstatic ILexer *LexerFactoryFreeBasic() {\n\t\treturn new LexerBasic('\\'', CheckFreeFoldPoint, freebasicWordListDesc );\n\t}\n};\n\nint SCI_METHOD LexerBasic::PropertySet(const char *key, const char *val) {\n\tif (osBasic.PropertySet(&options, key, val)) {\n\t\treturn 0;\n\t}\n\treturn -1;\n}\n\nint SCI_METHOD LexerBasic::WordListSet(int n, const char *wl) {\n\tWordList *wordListN = 0;\n\tswitch (n) {\n\tcase 0:\n\t\twordListN = &keywordlists[0];\n\t\tbreak;\n\tcase 1:\n\t\twordListN = &keywordlists[1];\n\t\tbreak;\n\tcase 2:\n\t\twordListN = &keywordlists[2];\n\t\tbreak;\n\tcase 3:\n\t\twordListN = &keywordlists[3];\n\t\tbreak;\n\t}\n\tint firstModification = -1;\n\tif (wordListN) {\n\t\tWordList wlNew;\n\t\twlNew.Set(wl);\n\t\tif (*wordListN != wlNew) {\n\t\t\twordListN->Set(wl);\n\t\t\tfirstModification = 0;\n\t\t}\n\t}\n\treturn firstModification;\n}\n\nvoid SCI_METHOD LexerBasic::Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n\tLexAccessor styler(pAccess);\n\n\tbool wasfirst = true, isfirst = true; // true if first token in a line\n\tstyler.StartAt(startPos);\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\t// Can't use sc.More() here else we miss the last character\n\tfor (; ; sc.Forward()) {\n\t\tif (sc.state == SCE_B_IDENTIFIER) {\n\t\t\tif (!IsIdentifier(sc.ch)) {\n\t\t\t\t// Labels\n\t\t\t\tif (wasfirst && sc.Match(':')) {\n\t\t\t\t\tsc.ChangeState(SCE_B_LABEL);\n\t\t\t\t\tsc.ForwardSetState(SCE_B_DEFAULT);\n\t\t\t\t} else {\n\t\t\t\t\tchar s[100];\n\t\t\t\t\tint kstates[4] = {\n\t\t\t\t\t\tSCE_B_KEYWORD,\n\t\t\t\t\t\tSCE_B_KEYWORD2,\n\t\t\t\t\t\tSCE_B_KEYWORD3,\n\t\t\t\t\t\tSCE_B_KEYWORD4,\n\t\t\t\t\t};\n\t\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\t\tfor (int i = 0; i < 4; i++) {\n\t\t\t\t\t\tif (keywordlists[i].InList(s)) {\n\t\t\t\t\t\t\tsc.ChangeState(kstates[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Types, must set them as operator else they will be\n\t\t\t\t\t// matched as number/constant\n\t\t\t\t\tif (sc.Match('.') || sc.Match('$') || sc.Match('%') ||\n\t\t\t\t\t\tsc.Match('#')) {\n\t\t\t\t\t\tsc.SetState(SCE_B_OPERATOR);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.SetState(SCE_B_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (sc.state == SCE_B_OPERATOR) {\n\t\t\tif (!IsOperator(sc.ch) || sc.Match('#'))\n\t\t\t\tsc.SetState(SCE_B_DEFAULT);\n\t\t} else if (sc.state == SCE_B_LABEL) {\n\t\t\tif (!IsIdentifier(sc.ch))\n\t\t\t\tsc.SetState(SCE_B_DEFAULT);\n\t\t} else if (sc.state == SCE_B_CONSTANT) {\n\t\t\tif (!IsIdentifier(sc.ch))\n\t\t\t\tsc.SetState(SCE_B_DEFAULT);\n\t\t} else if (sc.state == SCE_B_NUMBER) {\n\t\t\tif (!IsDigit(sc.ch))\n\t\t\t\tsc.SetState(SCE_B_DEFAULT);\n\t\t} else if (sc.state == SCE_B_HEXNUMBER) {\n\t\t\tif (!IsHexDigit(sc.ch))\n\t\t\t\tsc.SetState(SCE_B_DEFAULT);\n\t\t} else if (sc.state == SCE_B_BINNUMBER) {\n\t\t\tif (!IsBinDigit(sc.ch))\n\t\t\t\tsc.SetState(SCE_B_DEFAULT);\n\t\t} else if (sc.state == SCE_B_STRING) {\n\t\t\tif (sc.ch == '\"') {\n\t\t\t\tsc.ForwardSetState(SCE_B_DEFAULT);\n\t\t\t}\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.ChangeState(SCE_B_ERROR);\n\t\t\t\tsc.SetState(SCE_B_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_B_COMMENT || sc.state == SCE_B_PREPROCESSOR) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_B_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\tif (sc.atLineStart)\n\t\t\tisfirst = true;\n\n\t\tif (sc.state == SCE_B_DEFAULT || sc.state == SCE_B_ERROR) {\n\t\t\tif (isfirst && sc.Match('.')) {\n\t\t\t\tsc.SetState(SCE_B_LABEL);\n\t\t\t} else if (isfirst && sc.Match('#')) {\n\t\t\t\twasfirst = isfirst;\n\t\t\t\tsc.SetState(SCE_B_IDENTIFIER);\n\t\t\t} else if (sc.Match(comment_char)) {\n\t\t\t\t// Hack to make deprecated QBASIC '$Include show\n\t\t\t\t// up in freebasic with SCE_B_PREPROCESSOR.\n\t\t\t\tif (comment_char == '\\'' && sc.Match(comment_char, '$'))\n\t\t\t\t\tsc.SetState(SCE_B_PREPROCESSOR);\n\t\t\t\telse\n\t\t\t\t\tsc.SetState(SCE_B_COMMENT);\n\t\t\t} else if (sc.Match('\"')) {\n\t\t\t\tsc.SetState(SCE_B_STRING);\n\t\t\t} else if (IsDigit(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_B_NUMBER);\n\t\t\t} else if (sc.Match('$')) {\n\t\t\t\tsc.SetState(SCE_B_HEXNUMBER);\n\t\t\t} else if (sc.Match('%')) {\n\t\t\t\tsc.SetState(SCE_B_BINNUMBER);\n\t\t\t} else if (sc.Match('#')) {\n\t\t\t\tsc.SetState(SCE_B_CONSTANT);\n\t\t\t} else if (IsOperator(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_B_OPERATOR);\n\t\t\t} else if (IsIdentifier(sc.ch)) {\n\t\t\t\twasfirst = isfirst;\n\t\t\t\tsc.SetState(SCE_B_IDENTIFIER);\n\t\t\t} else if (!IsSpace(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_B_ERROR);\n\t\t\t}\n\t\t}\n\n\t\tif (!IsSpace(sc.ch))\n\t\t\tisfirst = false;\n\n\t\tif (!sc.More())\n\t\t\tbreak;\n\t}\n\tsc.Complete();\n}\n\n\nvoid SCI_METHOD LexerBasic::Fold(unsigned int startPos, int length, int /* initStyle */, IDocument *pAccess) {\n\n\tif (!options.fold)\n\t\treturn;\n\n\tLexAccessor styler(pAccess);\n\n\tint line = styler.GetLine(startPos);\n\tint level = styler.LevelAt(line);\n\tint go = 0, done = 0;\n\tint endPos = startPos + length;\n\tchar word[256];\n\tint wordlen = 0;\n\tconst bool userDefinedFoldMarkers = !options.foldExplicitStart.empty() && !options.foldExplicitEnd.empty();\n\tint cNext = styler[startPos];\n\n\t// Scan for tokens at the start of the line (they may include\n\t// whitespace, for tokens like \"End Function\"\n\tfor (int i = startPos; i < endPos; i++) {\n\t\tint c = cNext;\n\t\tcNext = styler.SafeGetCharAt(i + 1);\n\t\tbool atEOL = (c == '\\r' && cNext != '\\n') || (c == '\\n');\n\t\tif (options.foldSyntaxBased && !done && !go) {\n\t\t\tif (wordlen) { // are we scanning a token already?\n\t\t\t\tword[wordlen] = static_cast<char>(LowerCase(c));\n\t\t\t\tif (!IsIdentifier(c)) { // done with token\n\t\t\t\t\tword[wordlen] = '\\0';\n\t\t\t\t\tgo = CheckFoldPoint(word, level);\n\t\t\t\t\tif (!go) {\n\t\t\t\t\t\t// Treat any whitespace as single blank, for\n\t\t\t\t\t\t// things like \"End   Function\".\n\t\t\t\t\t\tif (IsSpace(c) && IsIdentifier(word[wordlen - 1])) {\n\t\t\t\t\t\t\tword[wordlen] = ' ';\n\t\t\t\t\t\t\tif (wordlen < 255)\n\t\t\t\t\t\t\t\twordlen++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse // done with this line\n\t\t\t\t\t\t\tdone = 1;\n\t\t\t\t\t}\n\t\t\t\t} else if (wordlen < 255) {\n\t\t\t\t\twordlen++;\n\t\t\t\t}\n\t\t\t} else { // start scanning at first non-whitespace character\n\t\t\t\tif (!IsSpace(c)) {\n\t\t\t\t\tif (IsIdentifier(c)) {\n\t\t\t\t\t\tword[0] = static_cast<char>(LowerCase(c));\n\t\t\t\t\t\twordlen = 1;\n\t\t\t\t\t} else // done with this line\n\t\t\t\t\t\tdone = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (options.foldCommentExplicit && ((styler.StyleAt(i) == SCE_B_COMMENT) || options.foldExplicitAnywhere)) {\n\t\t\tif (userDefinedFoldMarkers) {\n\t\t\t\tif (styler.Match(i, options.foldExplicitStart.c_str())) {\n \t\t\t\t\tlevel |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t\t\tgo = 1;\n\t\t\t\t} else if (styler.Match(i, options.foldExplicitEnd.c_str())) {\n \t\t\t\t\tgo = -1;\n \t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (c == comment_char) {\n\t\t\t\t\tif (cNext == '{') {\n\t\t\t\t\t\tlevel |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t\t\t\tgo = 1;\n\t\t\t\t\t} else if (cNext == '}') {\n\t\t\t\t\t\tgo = -1;\n\t\t\t\t\t}\n\t\t\t\t}\n \t\t\t}\n \t\t}\n\t\tif (atEOL) { // line end\n\t\t\tif (!done && wordlen == 0 && options.foldCompact) // line was only space\n\t\t\t\tlevel |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (level != styler.LevelAt(line))\n\t\t\t\tstyler.SetLevel(line, level);\n\t\t\tlevel += go;\n\t\t\tline++;\n\t\t\t// reset state\n\t\t\twordlen = 0;\n\t\t\tlevel &= ~SC_FOLDLEVELHEADERFLAG;\n\t\t\tlevel &= ~SC_FOLDLEVELWHITEFLAG;\n\t\t\tgo = 0;\n\t\t\tdone = 0;\n\t\t}\n\t}\n}\n\nLexerModule lmBlitzBasic(SCLEX_BLITZBASIC, LexerBasic::LexerFactoryBlitzBasic, \"blitzbasic\", blitzbasicWordListDesc);\n\nLexerModule lmPureBasic(SCLEX_PUREBASIC, LexerBasic::LexerFactoryPureBasic, \"purebasic\", purebasicWordListDesc);\n\nLexerModule lmFreeBasic(SCLEX_FREEBASIC, LexerBasic::LexerFactoryFreeBasic, \"freebasic\", freebasicWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexBullant.cpp",
    "content": "// SciTE - Scintilla based Text Editor\n// LexBullant.cxx - lexer for Bullant\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic int classifyWordBullant(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {\n\tchar s[100];\n\ts[0] = '\\0';\n\tfor (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {\n\t\ts[i] = static_cast<char>(tolower(styler[start + i]));\n\t\ts[i + 1] = '\\0';\n\t}\n\tint lev= 0;\n\tchar chAttr = SCE_C_IDENTIFIER;\n\tif (isdigit(s[0]) || (s[0] == '.')){\n\t\tchAttr = SCE_C_NUMBER;\n\t}\n\telse {\n\t\tif (keywords.InList(s)) {\n\t\t\tchAttr = SCE_C_WORD;\n\t\t\tif (strcmp(s, \"end\") == 0)\n\t\t\t\tlev = -1;\n\t\t\telse if (strcmp(s, \"method\") == 0 ||\n\t\t\t\tstrcmp(s, \"case\") == 0 ||\n\t\t\t\tstrcmp(s, \"class\") == 0 ||\n\t\t\t\tstrcmp(s, \"debug\") == 0 ||\n\t\t\t\tstrcmp(s, \"test\") == 0 ||\n\t\t\t\tstrcmp(s, \"if\") == 0 ||\n\t\t\t\tstrcmp(s, \"lock\") == 0 ||\n\t\t\t\tstrcmp(s, \"transaction\") == 0 ||\n\t\t\t\tstrcmp(s, \"trap\") == 0 ||\n\t\t\t\tstrcmp(s, \"until\") == 0 ||\n\t\t\t\tstrcmp(s, \"while\") == 0)\n\t\t\t\tlev = 1;\n\t\t}\n\t}\n\tstyler.ColourTo(end, chAttr);\n\treturn lev;\n}\n\nstatic void ColouriseBullantDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n\tAccessor &styler) {\n\tWordList &keywords = *keywordlists[0];\n\n\tstyler.StartAt(startPos);\n\n\tbool fold = styler.GetPropertyInt(\"fold\") != 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\n\tint state = initStyle;\n\tif (state == SCE_C_STRINGEOL)\t// Does not leak onto next line\n\t\tstate = SCE_C_DEFAULT;\n\tchar chPrev = ' ';\n\tchar chNext = styler[startPos];\n\tunsigned int lengthDoc = startPos + length;\n\tint visibleChars = 0;\n\tstyler.StartSegment(startPos);\n\tint endFoundThisLine = 0;\n\tfor (unsigned int i = startPos; i < lengthDoc; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\n\t\tif ((ch == '\\r' && chNext != '\\n') || (ch == '\\n')) {\n\t\t\t// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)\n\t\t\t// Avoid triggering two times on Dos/Win\n\t\t\t// End of line\n\t\t\tendFoundThisLine = 0;\n\t\t\tif (state == SCE_C_STRINGEOL) {\n\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t}\n\t\t\tif (fold) {\n\t\t\t\tint lev = levelPrev;\n\t\t\t\tif (visibleChars == 0)\n\t\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t\tlineCurrent++;\n\t\t\t\tlevelPrev = levelCurrent;\n\t\t\t}\n\t\t\tvisibleChars = 0;\n\n/*\t\t\tint indentBlock = GetLineIndentation(lineCurrent);\n\t\t\tif (blockChange==1){\n\t\t\t\tlineCurrent++;\n\t\t\t\tint pos=SetLineIndentation(lineCurrent, indentBlock + indentSize);\n\t\t\t} else if (blockChange==-1) {\n\t\t\t\tindentBlock -= indentSize;\n\t\t\t\tif (indentBlock < 0)\n\t\t\t\t\tindentBlock = 0;\n\t\t\t\tSetLineIndentation(lineCurrent, indentBlock);\n\t\t\t\tlineCurrent++;\n\t\t\t}\n\t\t\tblockChange=0;\n*/\t\t}\n\t\tif (!(IsASCII(ch) && isspace(ch)))\n\t\t\tvisibleChars++;\n\n\t\tif (styler.IsLeadByte(ch)) {\n\t\t\tchNext = styler.SafeGetCharAt(i + 2);\n\t\t\tchPrev = ' ';\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state == SCE_C_DEFAULT) {\n\t\t\tif (iswordstart(ch)) {\n\t\t\t\tstyler.ColourTo(i-1, state);\n\t\t\t\t\tstate = SCE_C_IDENTIFIER;\n\t\t\t} else if (ch == '@' && chNext == 'o') {\n\t\t\t\tif ((styler.SafeGetCharAt(i+2) =='f') && (styler.SafeGetCharAt(i+3) == 'f')) {\n\t\t\t\t\tstyler.ColourTo(i-1, state);\n\t\t\t\t\tstate = SCE_C_COMMENT;\n\t\t\t\t}\n\t\t\t} else if (ch == '#') {\n\t\t\t\tstyler.ColourTo(i-1, state);\n\t\t\t\tstate = SCE_C_COMMENTLINE;\n\t\t\t} else if (ch == '\\\"') {\n\t\t\t\tstyler.ColourTo(i-1, state);\n\t\t\t\tstate = SCE_C_STRING;\n\t\t\t} else if (ch == '\\'') {\n\t\t\t\tstyler.ColourTo(i-1, state);\n\t\t\t\tstate = SCE_C_CHARACTER;\n\t\t\t} else if (isoperator(ch)) {\n\t\t\t\tstyler.ColourTo(i-1, state);\n\t\t\t\tstyler.ColourTo(i, SCE_C_OPERATOR);\n\t\t\t}\n\t\t} else if (state == SCE_C_IDENTIFIER) {\n\t\t\tif (!iswordchar(ch)) {\n\t\t\t\tint levelChange = classifyWordBullant(styler.GetStartSegment(), i - 1, keywords, styler);\n\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\tif (ch == '#') {\n\t\t\t\t\tstate = SCE_C_COMMENTLINE;\n\t\t\t\t} else if (ch == '\\\"') {\n\t\t\t\t\tstate = SCE_C_STRING;\n\t\t\t\t} else if (ch == '\\'') {\n\t\t\t\t\tstate = SCE_C_CHARACTER;\n\t\t\t\t} else if (isoperator(ch)) {\n\t\t\t\t\tstyler.ColourTo(i, SCE_C_OPERATOR);\n\t\t\t\t}\n\t\t\t\tif (endFoundThisLine == 0)\n\t\t\t\t\tlevelCurrent+=levelChange;\n\t\t\t\tif (levelChange == -1)\n\t\t\t\t\tendFoundThisLine=1;\n\t\t\t}\n\t\t} else if (state == SCE_C_COMMENT) {\n\t\t\tif (ch == '@' && chNext == 'o') {\n\t\t\t\tif (styler.SafeGetCharAt(i+2) == 'n') {\n\t\t\t\t\tstyler.ColourTo(i+2, state);\n\t\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t\t\ti+=2;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (state == SCE_C_COMMENTLINE) {\n\t\t\tif (ch == '\\r' || ch == '\\n') {\n\t\t\t\tendFoundThisLine = 0;\n\t\t\t\tstyler.ColourTo(i-1, state);\n\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t}\n\t\t} else if (state == SCE_C_STRING) {\n\t\t\tif (ch == '\\\\') {\n\t\t\t\tif (chNext == '\\\"' || chNext == '\\'' || chNext == '\\\\') {\n\t\t\t\t\ti++;\n\t\t\t\t\tch = chNext;\n\t\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\t}\n\t\t\t} else if (ch == '\\\"') {\n\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t} else if (chNext == '\\r' || chNext == '\\n') {\n\t\t\t\tendFoundThisLine = 0;\n\t\t\t\tstyler.ColourTo(i-1, SCE_C_STRINGEOL);\n\t\t\t\tstate = SCE_C_STRINGEOL;\n\t\t\t}\n\t\t} else if (state == SCE_C_CHARACTER) {\n\t\t\tif ((ch == '\\r' || ch == '\\n') && (chPrev != '\\\\')) {\n\t\t\t\tendFoundThisLine = 0;\n\t\t\t\tstyler.ColourTo(i-1, SCE_C_STRINGEOL);\n\t\t\t\tstate = SCE_C_STRINGEOL;\n\t\t\t} else if (ch == '\\\\') {\n\t\t\t\tif (chNext == '\\\"' || chNext == '\\'' || chNext == '\\\\') {\n\t\t\t\t\ti++;\n\t\t\t\t\tch = chNext;\n\t\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\t}\n\t\t\t} else if (ch == '\\'') {\n\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t}\n\t\t}\n\t\tchPrev = ch;\n\t}\n\tstyler.ColourTo(lengthDoc - 1, state);\n\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tif (fold) {\n\t\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\t\t//styler.SetLevel(lineCurrent, levelCurrent | flagsNext);\n\t\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n\n\t}\n}\n\nstatic const char * const bullantWordListDesc[] = {\n\t\"Keywords\",\n\t0\n};\n\nLexerModule lmBullant(SCLEX_BULLANT, ColouriseBullantDoc, \"bullant\", 0, bullantWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexCLW.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexClw.cxx\n ** Lexer for Clarion.\n ** 2004/12/17 Updated Lexer\n **/\n// Copyright 2003-2004 by Ron Schofield <ron@schofieldcomputer.com>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n// Is an end of line character\ninline bool IsEOL(const int ch) {\n\n\treturn(ch == '\\n');\n}\n\n// Convert character to uppercase\nstatic char CharacterUpper(char chChar) {\n\n\tif (chChar < 'a' || chChar > 'z') {\n\t\treturn(chChar);\n\t}\n\telse {\n\t\treturn(static_cast<char>(chChar - 'a' + 'A'));\n\t}\n}\n\n// Convert string to uppercase\nstatic void StringUpper(char *szString) {\n\n\twhile (*szString) {\n\t\t*szString = CharacterUpper(*szString);\n\t\tszString++;\n\t}\n}\n\n// Is a label start character\ninline bool IsALabelStart(const int iChar) {\n\n\treturn(isalpha(iChar) || iChar == '_');\n}\n\n// Is a label character\ninline bool IsALabelCharacter(const int iChar) {\n\n\treturn(isalnum(iChar) || iChar == '_' || iChar == ':');\n}\n\n// Is the character is a ! and the the next character is not a !\ninline bool IsACommentStart(const int iChar) {\n\n\treturn(iChar == '!');\n}\n\n// Is the character a Clarion hex character (ABCDEF)\ninline bool IsAHexCharacter(const int iChar, bool bCaseSensitive) {\n\n\t// Case insensitive.\n\tif (!bCaseSensitive) {\n\t\tif (strchr(\"ABCDEFabcdef\", iChar) != NULL) {\n\t\t\treturn(true);\n\t\t}\n\t}\n\t// Case sensitive\n\telse {\n\t\tif (strchr(\"ABCDEF\", iChar) != NULL) {\n\t\t\treturn(true);\n\t\t}\n\t}\n\treturn(false);\n}\n\n// Is the character a Clarion base character (B=Binary, O=Octal, H=Hex)\ninline bool IsANumericBaseCharacter(const int iChar, bool bCaseSensitive) {\n\n\t// Case insensitive.\n\tif (!bCaseSensitive) {\n\t\t// If character is a numeric base character\n\t\tif (strchr(\"BOHboh\", iChar) != NULL) {\n\t\t\treturn(true);\n\t\t}\n\t}\n\t// Case sensitive\n\telse {\n\t\t// If character is a numeric base character\n\t\tif (strchr(\"BOH\", iChar) != NULL) {\n\t\t\treturn(true);\n\t\t}\n\t}\n\treturn(false);\n}\n\n// Set the correct numeric constant state\ninline bool SetNumericConstantState(StyleContext &scDoc) {\n\n\tint iPoints = 0;\t\t\t// Point counter\n\tchar cNumericString[512];\t// Numeric string buffer\n\n\t// Buffer the current numberic string\n\tscDoc.GetCurrent(cNumericString, sizeof(cNumericString));\n\t// Loop through the string until end of string (NULL termination)\n\tfor (int iIndex = 0; cNumericString[iIndex] != '\\0'; iIndex++) {\n\t\t// Depending on the character\n\t\tswitch (cNumericString[iIndex]) {\n\t\t\t// Is a . (point)\n\t\t\tcase '.' :\n\t\t\t\t// Increment point counter\n\t\t\t\tiPoints++;\n\t\t\t\tbreak;\n\t\t\tdefault :\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t// If points found (can be more than one for improper formatted number\n\tif (iPoints > 0) {\n\t\treturn(true);\n\t}\n\t// Else no points found\n\telse {\n\t\treturn(false);\n\t}\n}\n\n// Get the next word in uppercase from the current position (keyword lookahead)\ninline bool GetNextWordUpper(Accessor &styler, unsigned int uiStartPos, int iLength, char *cWord) {\n\n\tunsigned int iIndex = 0;\t\t// Buffer Index\n\n\t// Loop through the remaining string from the current position\n\tfor (int iOffset = uiStartPos; iOffset < iLength; iOffset++) {\n\t\t// Get the character from the buffer using the offset\n\t\tchar cCharacter = styler[iOffset];\n\t\tif (IsEOL(cCharacter)) {\n\t\t\tbreak;\n\t\t}\n\t\t// If the character is alphabet character\n\t\tif (isalpha(cCharacter)) {\n\t\t\t// Add UPPERCASE character to the word buffer\n\t\t\tcWord[iIndex++] = CharacterUpper(cCharacter);\n\t\t}\n\t}\n\t// Add null termination\n\tcWord[iIndex] = '\\0';\n\t// If no word was found\n\tif (iIndex == 0) {\n\t\t// Return failure\n\t\treturn(false);\n\t}\n\t// Else word was found\n\telse {\n\t\t// Return success\n\t\treturn(true);\n\t}\n}\n\n// Clarion Language Colouring Procedure\nstatic void ColouriseClarionDoc(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler, bool bCaseSensitive) {\n\n\tint iParenthesesLevel = 0;\t\t// Parenthese Level\n\tint iColumn1Label = false;\t\t// Label starts in Column 1\n\n\tWordList &wlClarionKeywords = *wlKeywords[0];\t\t\t// Clarion Keywords\n\tWordList &wlCompilerDirectives = *wlKeywords[1];\t\t// Compiler Directives\n\tWordList &wlRuntimeExpressions = *wlKeywords[2];\t\t// Runtime Expressions\n\tWordList &wlBuiltInProcsFuncs = *wlKeywords[3];\t\t\t// Builtin Procedures and Functions\n\tWordList &wlStructsDataTypes = *wlKeywords[4];\t\t\t// Structures and Data Types\n\tWordList &wlAttributes = *wlKeywords[5];\t\t\t\t// Procedure Attributes\n\tWordList &wlStandardEquates = *wlKeywords[6];\t\t\t// Standard Equates\n\tWordList &wlLabelReservedWords = *wlKeywords[7];\t\t// Clarion Reserved Keywords (Labels)\n\tWordList &wlProcLabelReservedWords = *wlKeywords[8];\t// Clarion Reserved Keywords (Procedure Labels)\n\n\tconst char wlProcReservedKeywordList[] =\n\t\"PROCEDURE FUNCTION\";\n\tWordList wlProcReservedKeywords;\n\twlProcReservedKeywords.Set(wlProcReservedKeywordList);\n\n\tconst char wlCompilerKeywordList[] =\n\t\"COMPILE OMIT\";\n\tWordList wlCompilerKeywords;\n\twlCompilerKeywords.Set(wlCompilerKeywordList);\n\n\tconst char wlLegacyStatementsList[] =\n\t\"BOF EOF FUNCTION POINTER SHARE\";\n\tWordList wlLegacyStatements;\n\twlLegacyStatements.Set(wlLegacyStatementsList);\n\n\tStyleContext scDoc(uiStartPos, iLength, iInitStyle, accStyler);\n\n\t// lex source code\n    for (; scDoc.More(); scDoc.Forward())\n\t{\n\t\t//\n\t\t// Determine if the current state should terminate.\n\t\t//\n\n\t\t// Label State Handling\n\t\tif (scDoc.state == SCE_CLW_LABEL) {\n\t\t\t// If the character is not a valid label\n\t\t\tif (!IsALabelCharacter(scDoc.ch)) {\n\t\t\t\t// If the character is a . (dot syntax)\n\t\t\t\tif (scDoc.ch == '.') {\n\t\t\t\t\t// Turn off column 1 label flag as label now cannot be reserved work\n\t\t\t\t\tiColumn1Label = false;\n\t\t\t\t\t// Uncolour the . (dot) to default state, move forward one character,\n\t\t\t\t\t// and change back to the label state.\n\t\t\t\t\tscDoc.SetState(SCE_CLW_DEFAULT);\n\t\t\t\t\tscDoc.Forward();\n\t\t\t\t\tscDoc.SetState(SCE_CLW_LABEL);\n\t\t\t\t}\n\t\t\t\t// Else check label\n\t\t\t\telse {\n\t\t\t\t\tchar cLabel[512];\t\t// Label buffer\n\t\t\t\t\t// Buffer the current label string\n\t\t\t\t\tscDoc.GetCurrent(cLabel,sizeof(cLabel));\n\t\t\t\t\t// If case insensitive, convert string to UPPERCASE to match passed keywords.\n\t\t\t\t\tif (!bCaseSensitive) {\n\t\t\t\t\t\tStringUpper(cLabel);\n\t\t\t\t\t}\n\t\t\t\t\t// Else if UPPERCASE label string is in the Clarion compiler keyword list\n\t\t\t\t\tif (wlCompilerKeywords.InList(cLabel) && iColumn1Label){\n\t\t\t\t\t\t// change the label to error state\n\t\t\t\t\t\tscDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE);\n\t\t\t\t\t}\n\t\t\t\t\t// Else if UPPERCASE label string is in the Clarion reserved keyword list\n\t\t\t\t\telse if (wlLabelReservedWords.InList(cLabel) && iColumn1Label){\n\t\t\t\t\t\t// change the label to error state\n\t\t\t\t\t\tscDoc.ChangeState(SCE_CLW_ERROR);\n\t\t\t\t\t}\n\t\t\t\t\t// Else if UPPERCASE label string is\n\t\t\t\t\telse if (wlProcLabelReservedWords.InList(cLabel) && iColumn1Label) {\n\t\t\t\t\t\tchar cWord[512];\t// Word buffer\n\t\t\t\t\t\t// Get the next word from the current position\n\t\t\t\t\t\tif (GetNextWordUpper(accStyler,scDoc.currentPos,uiStartPos+iLength,cWord)) {\n\t\t\t\t\t\t\t// If the next word is a procedure reserved word\n\t\t\t\t\t\t\tif (wlProcReservedKeywords.InList(cWord)) {\n\t\t\t\t\t\t\t\t// Change the label to error state\n\t\t\t\t\t\t\t\tscDoc.ChangeState(SCE_CLW_ERROR);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Else if label string is in the compiler directive keyword list\n\t\t\t\t\telse if (wlCompilerDirectives.InList(cLabel)) {\n\t\t\t\t\t\t// change the state to compiler directive state\n\t\t\t\t\t\tscDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE);\n\t\t\t\t\t}\n\t\t\t\t\t// Terminate the label state and set to default state\n\t\t\t\t\tscDoc.SetState(SCE_CLW_DEFAULT);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Keyword State Handling\n\t\telse if (scDoc.state == SCE_CLW_KEYWORD) {\n\t\t\t// If character is : (colon)\n\t\t\tif (scDoc.ch == ':') {\n\t\t\t\tchar cEquate[512];\t\t// Equate buffer\n\t\t\t\t// Move forward to include : (colon) in buffer\n\t\t\t\tscDoc.Forward();\n\t\t\t\t// Buffer the equate string\n\t\t\t\tscDoc.GetCurrent(cEquate,sizeof(cEquate));\n\t\t\t\t// If case insensitive, convert string to UPPERCASE to match passed keywords.\n\t\t\t\tif (!bCaseSensitive) {\n\t\t\t\t\tStringUpper(cEquate);\n\t\t\t\t}\n\t\t\t\t// If statement string is in the equate list\n\t\t\t\tif (wlStandardEquates.InList(cEquate)) {\n\t\t\t\t\t// Change to equate state\n\t\t\t\t\tscDoc.ChangeState(SCE_CLW_STANDARD_EQUATE);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If the character is not a valid label character\n\t\t\telse if (!IsALabelCharacter(scDoc.ch)) {\n\t\t\t\tchar cStatement[512];\t\t// Statement buffer\n\t\t\t\t// Buffer the statement string\n\t\t\t\tscDoc.GetCurrent(cStatement,sizeof(cStatement));\n\t\t\t\t// If case insensitive, convert string to UPPERCASE to match passed keywords.\n\t\t\t\tif (!bCaseSensitive) {\n\t\t\t\t\tStringUpper(cStatement);\n\t\t\t\t}\n\t\t\t\t// If statement string is in the Clarion keyword list\n\t\t\t\tif (wlClarionKeywords.InList(cStatement)) {\n\t\t\t\t\t// Change the statement string to the Clarion keyword state\n\t\t\t\t\tscDoc.ChangeState(SCE_CLW_KEYWORD);\n\t\t\t\t}\n\t\t\t\t// Else if statement string is in the compiler directive keyword list\n\t\t\t\telse if (wlCompilerDirectives.InList(cStatement)) {\n\t\t\t\t\t// Change the statement string to the compiler directive state\n\t\t\t\t\tscDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE);\n\t\t\t\t}\n\t\t\t\t// Else if statement string is in the runtime expressions keyword list\n\t\t\t\telse if (wlRuntimeExpressions.InList(cStatement)) {\n\t\t\t\t\t// Change the statement string to the runtime expressions state\n\t\t\t\t\tscDoc.ChangeState(SCE_CLW_RUNTIME_EXPRESSIONS);\n\t\t\t\t}\n\t\t\t\t// Else if statement string is in the builtin procedures and functions keyword list\n\t\t\t\telse if (wlBuiltInProcsFuncs.InList(cStatement)) {\n\t\t\t\t\t// Change the statement string to the builtin procedures and functions state\n\t\t\t\t\tscDoc.ChangeState(SCE_CLW_BUILTIN_PROCEDURES_FUNCTION);\n\t\t\t\t}\n\t\t\t\t// Else if statement string is in the tructures and data types keyword list\n\t\t\t\telse if (wlStructsDataTypes.InList(cStatement)) {\n\t\t\t\t\t// Change the statement string to the structures and data types state\n\t\t\t\t\tscDoc.ChangeState(SCE_CLW_STRUCTURE_DATA_TYPE);\n\t\t\t\t}\n\t\t\t\t// Else if statement string is in the procedure attribute keyword list\n\t\t\t\telse if (wlAttributes.InList(cStatement)) {\n\t\t\t\t\t// Change the statement string to the procedure attribute state\n\t\t\t\t\tscDoc.ChangeState(SCE_CLW_ATTRIBUTE);\n\t\t\t\t}\n\t\t\t\t// Else if statement string is in the standard equate keyword list\n\t\t\t\telse if (wlStandardEquates.InList(cStatement)) {\n\t\t\t\t\t// Change the statement string to the standard equate state\n\t\t\t\t\tscDoc.ChangeState(SCE_CLW_STANDARD_EQUATE);\n\t\t\t\t}\n\t\t\t\t// Else if statement string is in the deprecated or legacy keyword list\n\t\t\t\telse if (wlLegacyStatements.InList(cStatement)) {\n\t\t\t\t\t// Change the statement string to the standard equate state\n\t\t\t\t\tscDoc.ChangeState(SCE_CLW_DEPRECATED);\n\t\t\t\t}\n\t\t\t\t// Else the statement string doesn't match any work list\n\t\t\t\telse {\n\t\t\t\t\t// Change the statement string to the default state\n\t\t\t\t\tscDoc.ChangeState(SCE_CLW_DEFAULT);\n\t\t\t\t}\n\t\t\t\t// Terminate the keyword state and set to default state\n\t\t\t\tscDoc.SetState(SCE_CLW_DEFAULT);\n\t\t\t}\n\t\t}\n\t\t// String State Handling\n\t\telse if (scDoc.state == SCE_CLW_STRING) {\n\t\t\t// If the character is an ' (single quote)\n\t\t\tif (scDoc.ch == '\\'') {\n\t\t\t\t// Set the state to default and move forward colouring\n\t\t\t\t// the ' (single quote) as default state\n\t\t\t\t// terminating the string state\n\t\t\t\tscDoc.SetState(SCE_CLW_DEFAULT);\n\t\t\t\tscDoc.Forward();\n\t\t\t}\n\t\t\t// If the next character is an ' (single quote)\n\t\t\tif (scDoc.chNext == '\\'') {\n\t\t\t\t// Move forward one character and set to default state\n\t\t\t\t// colouring the next ' (single quote) as default state\n\t\t\t\t// terminating the string state\n\t\t\t\tscDoc.ForwardSetState(SCE_CLW_DEFAULT);\n\t\t\t\tscDoc.Forward();\n\t\t\t}\n\t\t}\n\t\t// Picture String State Handling\n\t\telse if (scDoc.state == SCE_CLW_PICTURE_STRING) {\n\t\t\t// If the character is an ( (open parenthese)\n\t\t\tif (scDoc.ch == '(') {\n\t\t\t\t// Increment the parenthese level\n\t\t\t\tiParenthesesLevel++;\n\t\t\t}\n\t\t\t// Else if the character is a ) (close parenthese)\n\t\t\telse if (scDoc.ch == ')') {\n\t\t\t\t// If the parenthese level is set to zero\n\t\t\t\t// parentheses matched\n\t\t\t\tif (!iParenthesesLevel) {\n\t\t\t\t\tscDoc.SetState(SCE_CLW_DEFAULT);\n\t\t\t\t}\n\t\t\t\t// Else parenthese level is greater than zero\n\t\t\t\t// still looking for matching parentheses\n\t\t\t\telse {\n\t\t\t\t\t// Decrement the parenthese level\n\t\t\t\t\tiParenthesesLevel--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Standard Equate State Handling\n\t\telse if (scDoc.state == SCE_CLW_STANDARD_EQUATE) {\n\t\t\tif (!isalnum(scDoc.ch)) {\n\t\t\t\tscDoc.SetState(SCE_CLW_DEFAULT);\n\t\t\t}\n\t\t}\n\t\t// Integer Constant State Handling\n\t\telse if (scDoc.state == SCE_CLW_INTEGER_CONSTANT) {\n\t\t\t// If the character is not a digit (0-9)\n\t\t\t// or character is not a hexidecimal character (A-F)\n\t\t\t// or character is not a . (point)\n\t\t\t// or character is not a numberic base character (B,O,H)\n\t\t\tif (!(isdigit(scDoc.ch)\n\t\t\t|| IsAHexCharacter(scDoc.ch, bCaseSensitive)\n\t\t\t|| scDoc.ch == '.'\n\t\t\t|| IsANumericBaseCharacter(scDoc.ch, bCaseSensitive))) {\n\t\t\t\t// If the number was a real\n\t\t\t\tif (SetNumericConstantState(scDoc)) {\n\t\t\t\t\t// Colour the matched string to the real constant state\n\t\t\t\t\tscDoc.ChangeState(SCE_CLW_REAL_CONSTANT);\n\t\t\t\t}\n\t\t\t\t// Else the number was an integer\n\t\t\t\telse {\n\t\t\t\t\t// Colour the matched string to an integer constant state\n\t\t\t\t\tscDoc.ChangeState(SCE_CLW_INTEGER_CONSTANT);\n\t\t\t\t}\n\t\t\t\t// Terminate the integer constant state and set to default state\n\t\t\t\tscDoc.SetState(SCE_CLW_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t//\n\t\t// Determine if a new state should be entered.\n\t\t//\n\n\t\t// Beginning of Line Handling\n\t\tif (scDoc.atLineStart) {\n\t\t\t// Reset the column 1 label flag\n\t\t\tiColumn1Label = false;\n\t\t\t// If column 1 character is a label start character\n\t\t\tif (IsALabelStart(scDoc.ch)) {\n\t\t\t\t// Label character is found in column 1\n\t\t\t\t// so set column 1 label flag and clear last column 1 label\n\t\t\t\tiColumn1Label = true;\n\t\t\t\t// Set the state to label\n\t\t\t\tscDoc.SetState(SCE_CLW_LABEL);\n\t\t\t}\n\t\t\t// else if character is a space or tab\n\t\t\telse if (IsASpace(scDoc.ch)){\n\t\t\t\t// Set to default state\n\t\t\t\tscDoc.SetState(SCE_CLW_DEFAULT);\n\t\t\t}\n\t\t\t// else if comment start (!) or is an * (asterisk)\n\t\t\telse if (IsACommentStart(scDoc.ch) || scDoc.ch == '*' ) {\n\t\t\t\t// then set the state to comment.\n\t\t\t\tscDoc.SetState(SCE_CLW_COMMENT);\n\t\t\t}\n\t\t\t// else the character is a ? (question mark)\n\t\t\telse if (scDoc.ch == '?') {\n\t\t\t\t// Change to the compiler directive state, move forward,\n\t\t\t\t// colouring the ? (question mark), change back to default state.\n\t\t\t\tscDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE);\n\t\t\t\tscDoc.Forward();\n\t\t\t\tscDoc.SetState(SCE_CLW_DEFAULT);\n\t\t\t}\n\t\t\t// else an invalid character in column 1\n\t\t\telse {\n\t\t\t\t// Set to error state\n\t\t\t\tscDoc.SetState(SCE_CLW_ERROR);\n\t\t\t}\n\t\t}\n\t\t// End of Line Handling\n\t\telse if (scDoc.atLineEnd) {\n\t\t\t// Reset to the default state at the end of each line.\n\t\t\tscDoc.SetState(SCE_CLW_DEFAULT);\n\t\t}\n\t\t// Default Handling\n\t\telse {\n\t\t\t// If in default state\n\t\t\tif (scDoc.state == SCE_CLW_DEFAULT) {\n\t\t\t\t// If is a letter could be a possible statement\n\t\t\t\tif (isalpha(scDoc.ch)) {\n\t\t\t\t\t// Set the state to Clarion Keyword and verify later\n\t\t\t\t\tscDoc.SetState(SCE_CLW_KEYWORD);\n\t\t\t\t}\n\t\t\t\t// else is a number\n\t\t\t\telse if (isdigit(scDoc.ch)) {\n\t\t\t\t\t// Set the state to Integer Constant and verify later\n\t\t\t\t\tscDoc.SetState(SCE_CLW_INTEGER_CONSTANT);\n\t\t\t\t}\n\t\t\t\t// else if the start of a comment or a | (line continuation)\n\t\t\t\telse if (IsACommentStart(scDoc.ch) || scDoc.ch == '|') {\n\t\t\t\t\t// then set the state to comment.\n\t\t\t\t\tscDoc.SetState(SCE_CLW_COMMENT);\n\t\t\t\t}\n\t\t\t\t// else if the character is a ' (single quote)\n\t\t\t\telse if (scDoc.ch == '\\'') {\n\t\t\t\t\t// If the character is also a ' (single quote)\n\t\t\t\t\t// Embedded Apostrophe\n\t\t\t\t\tif (scDoc.chNext == '\\'') {\n\t\t\t\t\t\t// Move forward colouring it as default state\n\t\t\t\t\t\tscDoc.ForwardSetState(SCE_CLW_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// move to the next character and then set the state to comment.\n\t\t\t\t\t\tscDoc.ForwardSetState(SCE_CLW_STRING);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// else the character is an @ (ampersand)\n\t\t\t\telse if (scDoc.ch == '@') {\n\t\t\t\t\t// Case insensitive.\n\t\t\t\t\tif (!bCaseSensitive) {\n\t\t\t\t\t\t// If character is a valid picture token character\n\t\t\t\t\t\tif (strchr(\"DEKNPSTdeknpst\", scDoc.chNext) != NULL) {\n\t\t\t\t\t\t\t// Set to the picture string state\n\t\t\t\t\t\t\tscDoc.SetState(SCE_CLW_PICTURE_STRING);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Case sensitive\n\t\t\t\t\telse {\n\t\t\t\t\t\t// If character is a valid picture token character\n\t\t\t\t\t\tif (strchr(\"DEKNPST\", scDoc.chNext) != NULL) {\n\t\t\t\t\t\t\t// Set the picture string state\n\t\t\t\t\t\t\tscDoc.SetState(SCE_CLW_PICTURE_STRING);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// lexing complete\n\tscDoc.Complete();\n}\n\n// Clarion Language Case Sensitive Colouring Procedure\nstatic void ColouriseClarionDocSensitive(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) {\n\n\tColouriseClarionDoc(uiStartPos, iLength, iInitStyle, wlKeywords, accStyler, true);\n}\n\n// Clarion Language Case Insensitive Colouring Procedure\nstatic void ColouriseClarionDocInsensitive(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) {\n\n\tColouriseClarionDoc(uiStartPos, iLength, iInitStyle, wlKeywords, accStyler, false);\n}\n\n// Fill Buffer\n\nstatic void FillBuffer(unsigned int uiStart, unsigned int uiEnd, Accessor &accStyler, char *szBuffer, unsigned int uiLength) {\n\n\tunsigned int uiPos = 0;\n\n\twhile ((uiPos < uiEnd - uiStart + 1) && (uiPos < uiLength-1)) {\n\t\tszBuffer[uiPos] = static_cast<char>(toupper(accStyler[uiStart + uiPos]));\n\t\tuiPos++;\n\t}\n\tszBuffer[uiPos] = '\\0';\n}\n\n// Classify Clarion Fold Point\n\nstatic int ClassifyClarionFoldPoint(int iLevel, const char* szString) {\n\n\tif (!(isdigit(szString[0]) || (szString[0] == '.'))) {\n\t\tif (strcmp(szString, \"PROCEDURE\") == 0) {\n\t//\t\tiLevel = SC_FOLDLEVELBASE + 1;\n\t\t}\n\t\telse if (strcmp(szString, \"MAP\") == 0 ||\n\t\t\tstrcmp(szString,\"ACCEPT\") == 0 ||\n\t\t\tstrcmp(szString,\"BEGIN\") == 0 ||\n\t\t\tstrcmp(szString,\"CASE\") == 0 ||\n\t\t\tstrcmp(szString,\"EXECUTE\") == 0 ||\n\t\t\tstrcmp(szString,\"IF\") == 0 ||\n\t\t\tstrcmp(szString,\"ITEMIZE\") == 0 ||\n\t\t\tstrcmp(szString,\"INTERFACE\") == 0 ||\n\t\t\tstrcmp(szString,\"JOIN\") == 0 ||\n\t\t\tstrcmp(szString,\"LOOP\") == 0 ||\n\t\t\tstrcmp(szString,\"MODULE\") == 0 ||\n\t\t\tstrcmp(szString,\"RECORD\") == 0) {\n\t\t\tiLevel++;\n\t\t}\n\t\telse if (strcmp(szString, \"APPLICATION\") == 0 ||\n\t\t\tstrcmp(szString, \"CLASS\") == 0 ||\n\t\t\tstrcmp(szString, \"DETAIL\") == 0 ||\n\t\t\tstrcmp(szString, \"FILE\") == 0 ||\n\t\t\tstrcmp(szString, \"FOOTER\") == 0 ||\n\t\t\tstrcmp(szString, \"FORM\") == 0 ||\n\t\t\tstrcmp(szString, \"GROUP\") == 0 ||\n\t\t\tstrcmp(szString, \"HEADER\") == 0 ||\n\t\t\tstrcmp(szString, \"INTERFACE\") == 0 ||\n\t\t\tstrcmp(szString, \"MENU\") == 0 ||\n\t\t\tstrcmp(szString, \"MENUBAR\") == 0 ||\n\t\t\tstrcmp(szString, \"OLE\") == 0 ||\n\t\t\tstrcmp(szString, \"OPTION\") == 0 ||\n\t\t\tstrcmp(szString, \"QUEUE\") == 0 ||\n\t\t\tstrcmp(szString, \"REPORT\") == 0 ||\n\t\t\tstrcmp(szString, \"SHEET\") == 0 ||\n\t\t\tstrcmp(szString, \"TAB\") == 0 ||\n\t\t\tstrcmp(szString, \"TOOLBAR\") == 0 ||\n\t\t\tstrcmp(szString, \"VIEW\") == 0 ||\n\t\t\tstrcmp(szString, \"WINDOW\") == 0) {\n\t\t\tiLevel++;\n\t\t}\n\t\telse if (strcmp(szString, \"END\") == 0 ||\n\t\t\tstrcmp(szString, \"UNTIL\") == 0 ||\n\t\t\tstrcmp(szString, \"WHILE\") == 0) {\n\t\t\tiLevel--;\n\t\t}\n\t}\n\treturn(iLevel);\n}\n\n// Clarion Language Folding Procedure\nstatic void FoldClarionDoc(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *[], Accessor &accStyler) {\n\n\tunsigned int uiEndPos = uiStartPos + iLength;\n\tint iLineCurrent = accStyler.GetLine(uiStartPos);\n\tint iLevelPrev = accStyler.LevelAt(iLineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint iLevelCurrent = iLevelPrev;\n\tchar chNext = accStyler[uiStartPos];\n\tint iStyle = iInitStyle;\n\tint iStyleNext = accStyler.StyleAt(uiStartPos);\n\tint iVisibleChars = 0;\n\tint iLastStart = 0;\n\n\tfor (unsigned int uiPos = uiStartPos; uiPos < uiEndPos; uiPos++) {\n\n\t\tchar chChar = chNext;\n\t\tchNext = accStyler.SafeGetCharAt(uiPos + 1);\n\t\tint iStylePrev = iStyle;\n\t\tiStyle = iStyleNext;\n\t\tiStyleNext = accStyler.StyleAt(uiPos + 1);\n\t\tbool bEOL = (chChar == '\\r' && chNext != '\\n') || (chChar == '\\n');\n\n\t\tif (iStylePrev == SCE_CLW_DEFAULT) {\n\t\t\tif (iStyle == SCE_CLW_KEYWORD || iStyle == SCE_CLW_STRUCTURE_DATA_TYPE) {\n\t\t\t\t// Store last word start point.\n\t\t\t\tiLastStart = uiPos;\n\t\t\t}\n\t\t}\n\n\t\tif (iStylePrev == SCE_CLW_KEYWORD || iStylePrev == SCE_CLW_STRUCTURE_DATA_TYPE) {\n\t\t\tif(iswordchar(chChar) && !iswordchar(chNext)) {\n\t\t\t\tchar chBuffer[100];\n\t\t\t\tFillBuffer(iLastStart, uiPos, accStyler, chBuffer, sizeof(chBuffer));\n\t\t\t\tiLevelCurrent = ClassifyClarionFoldPoint(iLevelCurrent,chBuffer);\n\t\t\t//\tif ((iLevelCurrent == SC_FOLDLEVELBASE + 1) && iLineCurrent > 1) {\n\t\t\t//\t\taccStyler.SetLevel(iLineCurrent-1,SC_FOLDLEVELBASE);\n\t\t\t//\t\tiLevelPrev = SC_FOLDLEVELBASE;\n\t\t\t//\t}\n\t\t\t}\n\t\t}\n\n\t\tif (bEOL) {\n\t\t\tint iLevel = iLevelPrev;\n\t\t\tif ((iLevelCurrent > iLevelPrev) && (iVisibleChars > 0))\n\t\t\t\tiLevel |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (iLevel != accStyler.LevelAt(iLineCurrent)) {\n\t\t\t\taccStyler.SetLevel(iLineCurrent,iLevel);\n\t\t\t}\n\t\t\tiLineCurrent++;\n\t\t\tiLevelPrev = iLevelCurrent;\n\t\t\tiVisibleChars = 0;\n\t\t}\n\n\t\tif (!isspacechar(chChar))\n\t\t\tiVisibleChars++;\n\t}\n\n\t// Fill in the real level of the next line, keeping the current flags\n\t// as they will be filled in later.\n\tint iFlagsNext = accStyler.LevelAt(iLineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\taccStyler.SetLevel(iLineCurrent, iLevelPrev | iFlagsNext);\n}\n\n// Word List Descriptions\nstatic const char * const rgWordListDescriptions[] = {\n\t\"Clarion Keywords\",\n\t\"Compiler Directives\",\n\t\"Built-in Procedures and Functions\",\n\t\"Runtime Expressions\",\n\t\"Structure and Data Types\",\n\t\"Attributes\",\n\t\"Standard Equates\",\n\t\"Reserved Words (Labels)\",\n\t\"Reserved Words (Procedure Labels)\",\n\t0,\n};\n\n// Case Sensitive Clarion Language Lexer\nLexerModule lmClw(SCLEX_CLW, ColouriseClarionDocSensitive, \"clarion\", FoldClarionDoc, rgWordListDescriptions);\n\n// Case Insensitive Clarion Language Lexer\nLexerModule lmClwNoCase(SCLEX_CLWNOCASE, ColouriseClarionDocInsensitive, \"clarionnocase\", FoldClarionDoc, rgWordListDescriptions);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexCOBOL.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexCOBOL.cxx\n ** Lexer for COBOL\n ** Based on LexPascal.cxx\n ** Written by Laurent le Tynevez\n ** Updated by Simon Steele <s.steele@pnotepad.org> September 2002\n ** Updated by Mathias Rauen <scite@madshi.net> May 2003 (Delphi adjustments)\n ** Updated by Rod Falck, Aug 2006 Converted to COBOL\n **/\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n#define IN_DIVISION 0x01\n#define IN_DECLARATIVES 0x02\n#define IN_SECTION 0x04\n#define IN_PARAGRAPH 0x08\n#define IN_FLAGS 0xF\n#define NOT_HEADER 0x10\n\ninline bool isCOBOLoperator(char ch)\n    {\n    return isoperator(ch);\n    }\n\ninline bool isCOBOLwordchar(char ch)\n    {\n    return IsASCII(ch) && (isalnum(ch) || ch == '-');\n\n    }\n\ninline bool isCOBOLwordstart(char ch)\n    {\n    return IsASCII(ch) && isalnum(ch);\n    }\n\nstatic int CountBits(int nBits)\n\t{\n\tint count = 0;\n\tfor (int i = 0; i < 32; ++i)\n\t\t{\n\t\tcount += nBits & 1;\n\t\tnBits >>= 1;\n\t\t}\n\treturn count;\n\t}\n\nstatic void getRange(unsigned int start,\n        unsigned int end,\n        Accessor &styler,\n        char *s,\n        unsigned int len) {\n    unsigned int i = 0;\n    while ((i < end - start + 1) && (i < len-1)) {\n        s[i] = static_cast<char>(tolower(styler[start + i]));\n        i++;\n    }\n    s[i] = '\\0';\n}\n\nstatic void ColourTo(Accessor &styler, unsigned int end, unsigned int attr) {\n    styler.ColourTo(end, attr);\n}\n\n\nstatic int classifyWordCOBOL(unsigned int start, unsigned int end, /*WordList &keywords*/WordList *keywordlists[], Accessor &styler, int nContainment, bool *bAarea) {\n    int ret = 0;\n\n    WordList& a_keywords = *keywordlists[0];\n    WordList& b_keywords = *keywordlists[1];\n    WordList& c_keywords = *keywordlists[2];\n\n    char s[100];\n    s[0] = '\\0';\n    s[1] = '\\0';\n    getRange(start, end, styler, s, sizeof(s));\n\n    char chAttr = SCE_C_IDENTIFIER;\n    if (isdigit(s[0]) || (s[0] == '.') || (s[0] == 'v')) {\n        chAttr = SCE_C_NUMBER;\n\t\tchar *p = s + 1;\n\t\twhile (*p) {\n\t\t\tif ((!isdigit(*p) && (*p) != 'v') && isCOBOLwordchar(*p)) {\n\t\t\t\tchAttr = SCE_C_IDENTIFIER;\n\t\t\t    break;\n\t\t\t}\n\t\t\t++p;\n\t\t}\n    }\n    else {\n        if (a_keywords.InList(s)) {\n            chAttr = SCE_C_WORD;\n        }\n        else if (b_keywords.InList(s)) {\n            chAttr = SCE_C_WORD2;\n        }\n        else if (c_keywords.InList(s)) {\n            chAttr = SCE_C_UUID;\n        }\n    }\n    if (*bAarea) {\n        if (strcmp(s, \"division\") == 0) {\n            ret = IN_DIVISION;\n\t\t\t// we've determined the containment, anything else is just ignored for those purposes\n\t\t\t*bAarea = false;\n\t\t} else if (strcmp(s, \"declaratives\") == 0) {\n            ret = IN_DIVISION | IN_DECLARATIVES;\n\t\t\tif (nContainment & IN_DECLARATIVES)\n\t\t\t\tret |= NOT_HEADER | IN_SECTION;\n\t\t\t// we've determined the containment, anything else is just ignored for those purposes\n\t\t\t*bAarea = false;\n\t\t} else if (strcmp(s, \"section\") == 0) {\n            ret = (nContainment &~ IN_PARAGRAPH) | IN_SECTION;\n\t\t\t// we've determined the containment, anything else is just ignored for those purposes\n\t\t\t*bAarea = false;\n\t\t} else if (strcmp(s, \"end\") == 0 && (nContainment & IN_DECLARATIVES)) {\n            ret = IN_DIVISION | IN_DECLARATIVES | IN_SECTION | NOT_HEADER;\n\t\t} else {\n\t\t\tret = nContainment | IN_PARAGRAPH;\n        }\n    }\n    ColourTo(styler, end, chAttr);\n    return ret;\n}\n\nstatic void ColouriseCOBOLDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n    Accessor &styler) {\n\n    styler.StartAt(startPos);\n\n    int state = initStyle;\n    if (state == SCE_C_CHARACTER)   // Does not leak onto next line\n        state = SCE_C_DEFAULT;\n    char chPrev = ' ';\n    char chNext = styler[startPos];\n    unsigned int lengthDoc = startPos + length;\n\n    int nContainment;\n\n    int currentLine = styler.GetLine(startPos);\n    if (currentLine > 0) {\n        styler.SetLineState(currentLine, styler.GetLineState(currentLine-1));\n        nContainment = styler.GetLineState(currentLine);\n\t\tnContainment &= ~NOT_HEADER;\n    } else {\n        styler.SetLineState(currentLine, 0);\n        nContainment = 0;\n    }\n\n    styler.StartSegment(startPos);\n    bool bNewLine = true;\n    bool bAarea = !isspacechar(chNext);\n\tint column = 0;\n    for (unsigned int i = startPos; i < lengthDoc; i++) {\n        char ch = chNext;\n\n        chNext = styler.SafeGetCharAt(i + 1);\n\n\t\t++column;\n\n        if (bNewLine) {\n\t\t\tcolumn = 0;\n        }\n\t\tif (column <= 1 && !bAarea) {\n\t\t\tbAarea = !isspacechar(ch);\n\t\t\t}\n        bool bSetNewLine = false;\n        if ((ch == '\\r' && chNext != '\\n') || (ch == '\\n')) {\n            // Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)\n            // Avoid triggering two times on Dos/Win\n            // End of line\n            if (state == SCE_C_CHARACTER) {\n                ColourTo(styler, i, state);\n                state = SCE_C_DEFAULT;\n            }\n            styler.SetLineState(currentLine, nContainment);\n            currentLine++;\n            bSetNewLine = true;\n\t\t\tif (nContainment & NOT_HEADER)\n\t\t\t\tnContainment &= ~(NOT_HEADER | IN_DECLARATIVES | IN_SECTION);\n        }\n\n        if (styler.IsLeadByte(ch)) {\n            chNext = styler.SafeGetCharAt(i + 2);\n            chPrev = ' ';\n            i += 1;\n            continue;\n        }\n\n        if (state == SCE_C_DEFAULT) {\n            if (isCOBOLwordstart(ch) || (ch == '$' && IsASCII(chNext) && isalpha(chNext))) {\n                ColourTo(styler, i-1, state);\n                state = SCE_C_IDENTIFIER;\n            } else if (column == 6 && ch == '*') {\n            // Cobol comment line: asterisk in column 7.\n                ColourTo(styler, i-1, state);\n                state = SCE_C_COMMENTLINE;\n            } else if (ch == '*' && chNext == '>') {\n            // Cobol inline comment: asterisk, followed by greater than.\n                ColourTo(styler, i-1, state);\n                state = SCE_C_COMMENTLINE;\n            } else if (column == 0 && ch == '*' && chNext != '*') {\n                ColourTo(styler, i-1, state);\n                state = SCE_C_COMMENTLINE;\n            } else if (column == 0 && ch == '/' && chNext != '*') {\n                ColourTo(styler, i-1, state);\n                state = SCE_C_COMMENTLINE;\n            } else if (column == 0 && ch == '*' && chNext == '*') {\n                ColourTo(styler, i-1, state);\n                state = SCE_C_COMMENTDOC;\n            } else if (column == 0 && ch == '/' && chNext == '*') {\n                ColourTo(styler, i-1, state);\n                state = SCE_C_COMMENTDOC;\n            } else if (ch == '\"') {\n                ColourTo(styler, i-1, state);\n                state = SCE_C_STRING;\n            } else if (ch == '\\'') {\n                ColourTo(styler, i-1, state);\n                state = SCE_C_CHARACTER;\n            } else if (ch == '?' && column == 0) {\n                ColourTo(styler, i-1, state);\n                state = SCE_C_PREPROCESSOR;\n            } else if (isCOBOLoperator(ch)) {\n                ColourTo(styler, i-1, state);\n                ColourTo(styler, i, SCE_C_OPERATOR);\n            }\n        } else if (state == SCE_C_IDENTIFIER) {\n            if (!isCOBOLwordchar(ch)) {\n                int lStateChange = classifyWordCOBOL(styler.GetStartSegment(), i - 1, keywordlists, styler, nContainment, &bAarea);\n\n                if(lStateChange != 0) {\n                    styler.SetLineState(currentLine, lStateChange);\n                    nContainment = lStateChange;\n                }\n\n                state = SCE_C_DEFAULT;\n                chNext = styler.SafeGetCharAt(i + 1);\n                if (ch == '\"') {\n                    state = SCE_C_STRING;\n                } else if (ch == '\\'') {\n                    state = SCE_C_CHARACTER;\n                } else if (isCOBOLoperator(ch)) {\n                    ColourTo(styler, i, SCE_C_OPERATOR);\n                }\n            }\n        } else {\n            if (state == SCE_C_PREPROCESSOR) {\n                if ((ch == '\\r' || ch == '\\n') && !(chPrev == '\\\\' || chPrev == '\\r')) {\n                    ColourTo(styler, i-1, state);\n                    state = SCE_C_DEFAULT;\n                }\n            } else if (state == SCE_C_COMMENT) {\n                if (ch == '\\r' || ch == '\\n') {\n                    ColourTo(styler, i, state);\n                    state = SCE_C_DEFAULT;\n                }\n            } else if (state == SCE_C_COMMENTDOC) {\n                if (ch == '\\r' || ch == '\\n') {\n                    if (((i > styler.GetStartSegment() + 2) || (\n                        (initStyle == SCE_C_COMMENTDOC) &&\n                        (styler.GetStartSegment() == static_cast<unsigned int>(startPos))))) {\n                            ColourTo(styler, i, state);\n                            state = SCE_C_DEFAULT;\n                    }\n                }\n            } else if (state == SCE_C_COMMENTLINE) {\n                if (ch == '\\r' || ch == '\\n') {\n                    ColourTo(styler, i-1, state);\n                    state = SCE_C_DEFAULT;\n                }\n            } else if (state == SCE_C_STRING) {\n                if (ch == '\"') {\n                    ColourTo(styler, i, state);\n                    state = SCE_C_DEFAULT;\n                }\n            } else if (state == SCE_C_CHARACTER) {\n                if (ch == '\\'') {\n                    ColourTo(styler, i, state);\n                    state = SCE_C_DEFAULT;\n                }\n            }\n        }\n        chPrev = ch;\n        bNewLine = bSetNewLine;\n\t\tif (bNewLine)\n\t\t\t{\n\t\t\tbAarea = false;\n\t\t\t}\n    }\n    ColourTo(styler, lengthDoc - 1, state);\n}\n\nstatic void FoldCOBOLDoc(unsigned int startPos, int length, int, WordList *[],\n                            Accessor &styler) {\n    bool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n    unsigned int endPos = startPos + length;\n    int visibleChars = 0;\n    int lineCurrent = styler.GetLine(startPos);\n    int levelPrev = lineCurrent > 0 ? styler.LevelAt(lineCurrent - 1) & SC_FOLDLEVELNUMBERMASK : 0xFFF;\n    char chNext = styler[startPos];\n\n    bool bNewLine = true;\n    bool bAarea = !isspacechar(chNext);\n\tint column = 0;\n\tbool bComment = false;\n    for (unsigned int i = startPos; i < endPos; i++) {\n        char ch = chNext;\n        chNext = styler.SafeGetCharAt(i + 1);\n\t\t++column;\n\n        if (bNewLine) {\n\t\t\tcolumn = 0;\n\t\t\tbComment = (ch == '*' || ch == '/' || ch == '?');\n        }\n\t\tif (column <= 1 && !bAarea) {\n\t\t\tbAarea = !isspacechar(ch);\n\t\t\t}\n        bool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n        if (atEOL) {\n\t\t\tint nContainment = styler.GetLineState(lineCurrent);\n            int lev = CountBits(nContainment & IN_FLAGS) | SC_FOLDLEVELBASE;\n\t\t\tif (bAarea && !bComment)\n\t\t\t\t--lev;\n            if (visibleChars == 0 && foldCompact)\n                lev |= SC_FOLDLEVELWHITEFLAG;\n            if ((bAarea) && (visibleChars > 0) && !(nContainment & NOT_HEADER) && !bComment)\n                lev |= SC_FOLDLEVELHEADERFLAG;\n            if (lev != styler.LevelAt(lineCurrent)) {\n                styler.SetLevel(lineCurrent, lev);\n            }\n\t\t\tif ((lev & SC_FOLDLEVELNUMBERMASK) <= (levelPrev & SC_FOLDLEVELNUMBERMASK)) {\n\t\t\t\t// this level is at the same level or less than the previous line\n\t\t\t\t// therefore these is nothing for the previous header to collapse, so remove the header\n\t\t\t\tstyler.SetLevel(lineCurrent - 1, levelPrev & ~SC_FOLDLEVELHEADERFLAG);\n\t\t\t}\n            levelPrev = lev;\n            visibleChars = 0;\n\t\t\tbAarea = false;\n            bNewLine = true;\n            lineCurrent++;\n        } else {\n            bNewLine = false;\n        }\n\n\n        if (!isspacechar(ch))\n            visibleChars++;\n    }\n\n    // Fill in the real level of the next line, keeping the current flags as they will be filled in later\n    int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n    styler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nstatic const char * const COBOLWordListDesc[] = {\n    \"A Keywords\",\n    \"B Keywords\",\n    \"Extended Keywords\",\n    0\n};\n\nLexerModule lmCOBOL(SCLEX_COBOL, ColouriseCOBOLDoc, \"COBOL\", FoldCOBOLDoc, COBOLWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexCPP.cxx\n ** Lexer for C++, C, Java, and JavaScript.\n ** Further folding features and configuration properties added by \"Udo Lechner\" <dlchnr(at)gmx(dot)net>\n **/\n// Copyright 1998-2005 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#include <string>\n#include <vector>\n#include <map>\n#include <algorithm>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n#include \"OptionSet.h\"\n#include \"SparseState.h\"\n#include \"SubStyles.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic bool IsSpaceEquiv(int state) {\n\treturn (state <= SCE_C_COMMENTDOC) ||\n\t\t// including SCE_C_DEFAULT, SCE_C_COMMENT, SCE_C_COMMENTLINE\n\t\t(state == SCE_C_COMMENTLINEDOC) || (state == SCE_C_COMMENTDOCKEYWORD) ||\n\t\t(state == SCE_C_COMMENTDOCKEYWORDERROR);\n}\n\n// Preconditions: sc.currentPos points to a character after '+' or '-'.\n// The test for pos reaching 0 should be redundant,\n// and is in only for safety measures.\n// Limitation: this code will give the incorrect answer for code like\n// a = b+++/ptn/...\n// Putting a space between the '++' post-inc operator and the '+' binary op\n// fixes this, and is highly recommended for readability anyway.\nstatic bool FollowsPostfixOperator(StyleContext &sc, LexAccessor &styler) {\n\tint pos = (int) sc.currentPos;\n\twhile (--pos > 0) {\n\t\tchar ch = styler[pos];\n\t\tif (ch == '+' || ch == '-') {\n\t\t\treturn styler[pos - 1] == ch;\n\t\t}\n\t}\n\treturn false;\n}\n\nstatic bool followsReturnKeyword(StyleContext &sc, LexAccessor &styler) {\n\t// Don't look at styles, so no need to flush.\n\tint pos = (int) sc.currentPos;\n\tint currentLine = styler.GetLine(pos);\n\tint lineStartPos = styler.LineStart(currentLine);\n\twhile (--pos > lineStartPos) {\n\t\tchar ch = styler.SafeGetCharAt(pos);\n\t\tif (ch != ' ' && ch != '\\t') {\n\t\t\tbreak;\n\t\t}\n\t}\n\tconst char *retBack = \"nruter\";\n\tconst char *s = retBack;\n\twhile (*s\n\t\t&& pos >= lineStartPos\n\t\t&& styler.SafeGetCharAt(pos) == *s) {\n\t\ts++;\n\t\tpos--;\n\t}\n\treturn !*s;\n}\n\nstatic std::string GetRestOfLine(LexAccessor &styler, int start, bool allowSpace) {\n\tstd::string restOfLine;\n\tint i =0;\n\tchar ch = styler.SafeGetCharAt(start, '\\n');\n\tint endLine = styler.LineEnd(styler.GetLine(start));\n\twhile (((start+i) < endLine) && (ch != '\\r')) {\n\t\tchar chNext = styler.SafeGetCharAt(start + i + 1, '\\n');\n\t\tif (ch == '/' && (chNext == '/' || chNext == '*'))\n\t\t\tbreak;\n\t\tif (allowSpace || (ch != ' '))\n\t\t\trestOfLine += ch;\n\t\ti++;\n\t\tch = chNext;\n\t}\n\treturn restOfLine;\n}\n\nstatic bool IsStreamCommentStyle(int style) {\n\treturn style == SCE_C_COMMENT ||\n\t\tstyle == SCE_C_COMMENTDOC ||\n\t\tstyle == SCE_C_COMMENTDOCKEYWORD ||\n\t\tstyle == SCE_C_COMMENTDOCKEYWORDERROR;\n}\n\nstatic std::vector<std::string> Tokenize(const std::string &s) {\n\t// Break into space separated tokens\n\tstd::string word;\n\tstd::vector<std::string> tokens;\n\tfor (const char *cp = s.c_str(); *cp; cp++) {\n\t\tif ((*cp == ' ') || (*cp == '\\t')) {\n\t\t\tif (!word.empty()) {\n\t\t\t\ttokens.push_back(word);\n\t\t\t\tword = \"\";\n\t\t\t}\n\t\t} else {\n\t\t\tword += *cp;\n\t\t}\n\t}\n\tif (!word.empty()) {\n\t\ttokens.push_back(word);\n\t}\n\treturn tokens;\n}\n\nstruct PPDefinition {\n\tint line;\n\tstd::string key;\n\tstd::string value;\n\tbool isUndef;\n\tPPDefinition(int line_, const std::string &key_, const std::string &value_, bool isUndef_ = false) :\n\t\tline(line_), key(key_), value(value_), isUndef(isUndef_) {\n\t}\n};\n\nclass LinePPState {\n\tint state;\n\tint ifTaken;\n\tint level;\n\tbool ValidLevel() const {\n\t\treturn level >= 0 && level < 32;\n\t}\n\tint maskLevel() const {\n\t\treturn 1 << level;\n\t}\npublic:\n\tLinePPState() : state(0), ifTaken(0), level(-1) {\n\t}\n\tbool IsInactive() const {\n\t\treturn state != 0;\n\t}\n\tbool CurrentIfTaken() const {\n\t\treturn (ifTaken & maskLevel()) != 0;\n\t}\n\tvoid StartSection(bool on) {\n\t\tlevel++;\n\t\tif (ValidLevel()) {\n\t\t\tif (on) {\n\t\t\t\tstate &= ~maskLevel();\n\t\t\t\tifTaken |= maskLevel();\n\t\t\t} else {\n\t\t\t\tstate |= maskLevel();\n\t\t\t\tifTaken &= ~maskLevel();\n\t\t\t}\n\t\t}\n\t}\n\tvoid EndSection() {\n\t\tif (ValidLevel()) {\n\t\t\tstate &= ~maskLevel();\n\t\t\tifTaken &= ~maskLevel();\n\t\t}\n\t\tlevel--;\n\t}\n\tvoid InvertCurrentLevel() {\n\t\tif (ValidLevel()) {\n\t\t\tstate ^= maskLevel();\n\t\t\tifTaken |= maskLevel();\n\t\t}\n\t}\n};\n\n// Hold the preprocessor state for each line seen.\n// Currently one entry per line but could become sparse with just one entry per preprocessor line.\nclass PPStates {\n\tstd::vector<LinePPState> vlls;\npublic:\n\tLinePPState ForLine(int line) const {\n\t\tif ((line > 0) && (vlls.size() > static_cast<size_t>(line))) {\n\t\t\treturn vlls[line];\n\t\t} else {\n\t\t\treturn LinePPState();\n\t\t}\n\t}\n\tvoid Add(int line, LinePPState lls) {\n\t\tvlls.resize(line+1);\n\t\tvlls[line] = lls;\n\t}\n};\n\n// An individual named option for use in an OptionSet\n\n// Options used for LexerCPP\nstruct OptionsCPP {\n\tbool stylingWithinPreprocessor;\n\tbool identifiersAllowDollars;\n\tbool trackPreprocessor;\n\tbool updatePreprocessor;\n\tbool triplequotedStrings;\n\tbool hashquotedStrings;\n\tbool fold;\n\tbool foldSyntaxBased;\n\tbool foldComment;\n\tbool foldCommentMultiline;\n\tbool foldCommentExplicit;\n\tstd::string foldExplicitStart;\n\tstd::string foldExplicitEnd;\n\tbool foldExplicitAnywhere;\n\tbool foldPreprocessor;\n\tbool foldCompact;\n\tbool foldAtElse;\n\tOptionsCPP() {\n\t\tstylingWithinPreprocessor = false;\n\t\tidentifiersAllowDollars = true;\n\t\ttrackPreprocessor = true;\n\t\tupdatePreprocessor = true;\n\t\ttriplequotedStrings = false;\n\t\thashquotedStrings = false;\n\t\tfold = false;\n\t\tfoldSyntaxBased = true;\n\t\tfoldComment = false;\n\t\tfoldCommentMultiline = true;\n\t\tfoldCommentExplicit = true;\n\t\tfoldExplicitStart = \"\";\n\t\tfoldExplicitEnd = \"\";\n\t\tfoldExplicitAnywhere = false;\n\t\tfoldPreprocessor = false;\n\t\tfoldCompact = false;\n\t\tfoldAtElse = false;\n\t}\n};\n\nstatic const char *const cppWordLists[] = {\n            \"Primary keywords and identifiers\",\n            \"Secondary keywords and identifiers\",\n            \"Documentation comment keywords\",\n            \"Global classes and typedefs\",\n            \"Preprocessor definitions\",\n            0,\n};\n\nstruct OptionSetCPP : public OptionSet<OptionsCPP> {\n\tOptionSetCPP() {\n\t\tDefineProperty(\"styling.within.preprocessor\", &OptionsCPP::stylingWithinPreprocessor,\n\t\t\t\"For C++ code, determines whether all preprocessor code is styled in the \"\n\t\t\t\"preprocessor style (0, the default) or only from the initial # to the end \"\n\t\t\t\"of the command word(1).\");\n\n\t\tDefineProperty(\"lexer.cpp.allow.dollars\", &OptionsCPP::identifiersAllowDollars,\n\t\t\t\"Set to 0 to disallow the '$' character in identifiers with the cpp lexer.\");\n\n\t\tDefineProperty(\"lexer.cpp.track.preprocessor\", &OptionsCPP::trackPreprocessor,\n\t\t\t\"Set to 1 to interpret #if/#else/#endif to grey out code that is not active.\");\n\n\t\tDefineProperty(\"lexer.cpp.update.preprocessor\", &OptionsCPP::updatePreprocessor,\n\t\t\t\"Set to 1 to update preprocessor definitions when #define found.\");\n\n\t\tDefineProperty(\"lexer.cpp.triplequoted.strings\", &OptionsCPP::triplequotedStrings,\n\t\t\t\"Set to 1 to enable highlighting of triple-quoted strings.\");\n\n\t\tDefineProperty(\"lexer.cpp.hashquoted.strings\", &OptionsCPP::hashquotedStrings,\n\t\t\t\"Set to 1 to enable highlighting of hash-quoted strings.\");\n\n\t\tDefineProperty(\"fold\", &OptionsCPP::fold);\n\n\t\tDefineProperty(\"fold.cpp.syntax.based\", &OptionsCPP::foldSyntaxBased,\n\t\t\t\"Set this property to 0 to disable syntax based folding.\");\n\n\t\tDefineProperty(\"fold.comment\", &OptionsCPP::foldComment,\n\t\t\t\"This option enables folding multi-line comments and explicit fold points when using the C++ lexer. \"\n\t\t\t\"Explicit fold points allows adding extra folding by placing a //{ comment at the start and a //} \"\n\t\t\t\"at the end of a section that should fold.\");\n\n\t\tDefineProperty(\"fold.cpp.comment.multiline\", &OptionsCPP::foldCommentMultiline,\n\t\t\t\"Set this property to 0 to disable folding multi-line comments when fold.comment=1.\");\n\n\t\tDefineProperty(\"fold.cpp.comment.explicit\", &OptionsCPP::foldCommentExplicit,\n\t\t\t\"Set this property to 0 to disable folding explicit fold points when fold.comment=1.\");\n\n\t\tDefineProperty(\"fold.cpp.explicit.start\", &OptionsCPP::foldExplicitStart,\n\t\t\t\"The string to use for explicit fold start points, replacing the standard //{.\");\n\n\t\tDefineProperty(\"fold.cpp.explicit.end\", &OptionsCPP::foldExplicitEnd,\n\t\t\t\"The string to use for explicit fold end points, replacing the standard //}.\");\n\n\t\tDefineProperty(\"fold.cpp.explicit.anywhere\", &OptionsCPP::foldExplicitAnywhere,\n\t\t\t\"Set this property to 1 to enable explicit fold points anywhere, not just in line comments.\");\n\n\t\tDefineProperty(\"fold.preprocessor\", &OptionsCPP::foldPreprocessor,\n\t\t\t\"This option enables folding preprocessor directives when using the C++ lexer. \"\n\t\t\t\"Includes C#'s explicit #region and #endregion folding directives.\");\n\n\t\tDefineProperty(\"fold.compact\", &OptionsCPP::foldCompact);\n\n\t\tDefineProperty(\"fold.at.else\", &OptionsCPP::foldAtElse,\n\t\t\t\"This option enables C++ folding on a \\\"} else {\\\" line of an if statement.\");\n\n\t\tDefineWordListSets(cppWordLists);\n\t}\n};\n\nstatic const char styleSubable[] = {SCE_C_IDENTIFIER, SCE_C_COMMENTDOCKEYWORD, 0};\n\nclass LexerCPP : public ILexerWithSubStyles {\n\tbool caseSensitive;\n\tCharacterSet setWord;\n\tCharacterSet setNegationOp;\n\tCharacterSet setArithmethicOp;\n\tCharacterSet setRelOp;\n\tCharacterSet setLogicalOp;\n\tPPStates vlls;\n\tstd::vector<PPDefinition> ppDefineHistory;\n\tWordList keywords;\n\tWordList keywords2;\n\tWordList keywords3;\n\tWordList keywords4;\n\tWordList ppDefinitions;\n\tstd::map<std::string, std::string> preprocessorDefinitionsStart;\n\tOptionsCPP options;\n\tOptionSetCPP osCPP;\n\tSparseState<std::string> rawStringTerminators;\n\tenum { activeFlag = 0x40 };\n\tenum { ssIdentifier, ssDocKeyword };\n\tSubStyles subStyles;\npublic:\n\tLexerCPP(bool caseSensitive_) :\n\t\tcaseSensitive(caseSensitive_),\n\t\tsetWord(CharacterSet::setAlphaNum, \"._\", 0x80, true),\n\t\tsetNegationOp(CharacterSet::setNone, \"!\"),\n\t\tsetArithmethicOp(CharacterSet::setNone, \"+-/*%\"),\n\t\tsetRelOp(CharacterSet::setNone, \"=!<>\"),\n\t\tsetLogicalOp(CharacterSet::setNone, \"|&\"),\n\t\tsubStyles(styleSubable, 0x80, 0x40, activeFlag) {\n\t}\n\tvirtual ~LexerCPP() {\n\t}\n\tvoid SCI_METHOD Release() {\n\t\tdelete this;\n\t}\n\tint SCI_METHOD Version() const {\n\t\treturn lvSubStyles;\n\t}\n\tconst char * SCI_METHOD PropertyNames() {\n\t\treturn osCPP.PropertyNames();\n\t}\n\tint SCI_METHOD PropertyType(const char *name) {\n\t\treturn osCPP.PropertyType(name);\n\t}\n\tconst char * SCI_METHOD DescribeProperty(const char *name) {\n\t\treturn osCPP.DescribeProperty(name);\n\t}\n\tint SCI_METHOD PropertySet(const char *key, const char *val);\n\tconst char * SCI_METHOD DescribeWordListSets() {\n\t\treturn osCPP.DescribeWordListSets();\n\t}\n\tint SCI_METHOD WordListSet(int n, const char *wl);\n\tvoid SCI_METHOD Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n\tvoid SCI_METHOD Fold(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n\n\tvoid * SCI_METHOD PrivateCall(int, void *) {\n\t\treturn 0;\n\t}\n\n\tint SCI_METHOD LineEndTypesSupported() {\n\t\treturn SC_LINE_END_TYPE_UNICODE;\n\t};\n\n\tint SCI_METHOD AllocateSubStyles(int styleBase, int numberStyles) {\n\t\treturn subStyles.Allocate(styleBase, numberStyles);\n\t}\n\tint SCI_METHOD SubStylesStart(int styleBase) {\n\t\treturn subStyles.Start(styleBase);\n\t}\n\tint SCI_METHOD SubStylesLength(int styleBase) {\n\t\treturn subStyles.Length(styleBase);\n\t}\n\tint SCI_METHOD StyleFromSubStyle(int subStyle) {\n\t\tint styleBase = subStyles.BaseStyle(MaskActive(subStyle));\n\t\tint active = subStyle & activeFlag;\n\t\treturn styleBase | active;\n\t}\n\tint SCI_METHOD PrimaryStyleFromStyle(int style) {\n\t\treturn MaskActive(style);\n \t}\n\tvoid SCI_METHOD FreeSubStyles() {\n\t\tsubStyles.Free();\n\t}\n\tvoid SCI_METHOD SetIdentifiers(int style, const char *identifiers) {\n\t\tsubStyles.SetIdentifiers(style, identifiers);\n\t}\n\tint SCI_METHOD DistanceToSecondaryStyles() {\n\t\treturn activeFlag;\n\t}\n\tconst char * SCI_METHOD GetSubStyleBases() {\n\t\treturn styleSubable;\n\t}\n\n\tstatic ILexer *LexerFactoryCPP() {\n\t\treturn new LexerCPP(true);\n\t}\n\tstatic ILexer *LexerFactoryCPPInsensitive() {\n\t\treturn new LexerCPP(false);\n\t}\n\tstatic int MaskActive(int style) {\n\t\treturn style & ~activeFlag;\n\t}\n\tvoid EvaluateTokens(std::vector<std::string> &tokens);\n\tbool EvaluateExpression(const std::string &expr, const std::map<std::string, std::string> &preprocessorDefinitions);\n};\n\nint SCI_METHOD LexerCPP::PropertySet(const char *key, const char *val) {\n\tif (osCPP.PropertySet(&options, key, val)) {\n\t\tif (strcmp(key, \"lexer.cpp.allow.dollars\") == 0) {\n\t\t\tsetWord = CharacterSet(CharacterSet::setAlphaNum, \"._\", 0x80, true);\n\t\t\tif (options.identifiersAllowDollars) {\n\t\t\t\tsetWord.Add('$');\n\t\t\t}\n\t\t}\n\t\treturn 0;\n\t}\n\treturn -1;\n}\n\nint SCI_METHOD LexerCPP::WordListSet(int n, const char *wl) {\n\tWordList *wordListN = 0;\n\tswitch (n) {\n\tcase 0:\n\t\twordListN = &keywords;\n\t\tbreak;\n\tcase 1:\n\t\twordListN = &keywords2;\n\t\tbreak;\n\tcase 2:\n\t\twordListN = &keywords3;\n\t\tbreak;\n\tcase 3:\n\t\twordListN = &keywords4;\n\t\tbreak;\n\tcase 4:\n\t\twordListN = &ppDefinitions;\n\t\tbreak;\n\t}\n\tint firstModification = -1;\n\tif (wordListN) {\n\t\tWordList wlNew;\n\t\twlNew.Set(wl);\n\t\tif (*wordListN != wlNew) {\n\t\t\twordListN->Set(wl);\n\t\t\tfirstModification = 0;\n\t\t\tif (n == 4) {\n\t\t\t\t// Rebuild preprocessorDefinitions\n\t\t\t\tpreprocessorDefinitionsStart.clear();\n\t\t\t\tfor (int nDefinition = 0; nDefinition < ppDefinitions.Length(); nDefinition++) {\n\t\t\t\t\tconst char *cpDefinition = ppDefinitions.WordAt(nDefinition);\n\t\t\t\t\tconst char *cpEquals = strchr(cpDefinition, '=');\n\t\t\t\t\tif (cpEquals) {\n\t\t\t\t\t\tstd::string name(cpDefinition, cpEquals - cpDefinition);\n\t\t\t\t\t\tstd::string val(cpEquals+1);\n\t\t\t\t\t\tpreprocessorDefinitionsStart[name] = val;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstd::string name(cpDefinition);\n\t\t\t\t\t\tstd::string val(\"1\");\n\t\t\t\t\t\tpreprocessorDefinitionsStart[name] = val;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn firstModification;\n}\n\n// Functor used to truncate history\nstruct After {\n\tint line;\n\tAfter(int line_) : line(line_) {}\n\tbool operator()(PPDefinition &p) const {\n\t\treturn p.line > line;\n\t}\n};\n\nvoid SCI_METHOD LexerCPP::Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n\tLexAccessor styler(pAccess);\n\n\tCharacterSet setOKBeforeRE(CharacterSet::setNone, \"([{=,:;!%^&*|?~+-\");\n\tCharacterSet setCouldBePostOp(CharacterSet::setNone, \"+-\");\n\n\tCharacterSet setDoxygen(CharacterSet::setAlpha, \"$@\\\\&<>#{}[]\");\n\n\tCharacterSet setWordStart(CharacterSet::setAlpha, \"_\", 0x80, true);\n\n\tCharacterSet setInvalidRawFirst(CharacterSet::setNone, \" )\\\\\\t\\v\\f\\n\");\n\n\tif (options.identifiersAllowDollars) {\n\t\tsetWordStart.Add('$');\n\t}\n\n\tint chPrevNonWhite = ' ';\n\tint visibleChars = 0;\n\tbool lastWordWasUUID = false;\n\tint styleBeforeDCKeyword = SCE_C_DEFAULT;\n\tbool continuationLine = false;\n\tbool isIncludePreprocessor = false;\n\tbool isStringInPreprocessor = false;\n\tbool inRERange = false;\n\n\tint lineCurrent = styler.GetLine(startPos);\n\tif ((MaskActive(initStyle) == SCE_C_PREPROCESSOR) ||\n      (MaskActive(initStyle) == SCE_C_COMMENTLINE) ||\n      (MaskActive(initStyle) == SCE_C_COMMENTLINEDOC)) {\n\t\t// Set continuationLine if last character of previous line is '\\'\n\t\tif (lineCurrent > 0) {\n\t\t\tint endLinePrevious = styler.LineEnd(lineCurrent - 1);\n\t\t\tif (endLinePrevious > 0) {\n\t\t\t\tcontinuationLine = styler.SafeGetCharAt(endLinePrevious-1) == '\\\\';\n\t\t\t}\n\t\t}\n\t}\n\n\t// look back to set chPrevNonWhite properly for better regex colouring\n\tif (startPos > 0) {\n\t\tint back = startPos;\n\t\twhile (--back && IsSpaceEquiv(MaskActive(styler.StyleAt(back))))\n\t\t\t;\n\t\tif (MaskActive(styler.StyleAt(back)) == SCE_C_OPERATOR) {\n\t\t\tchPrevNonWhite = styler.SafeGetCharAt(back);\n\t\t}\n\t}\n\n\tStyleContext sc(startPos, length, initStyle, styler, static_cast<char>(0xff));\n\tLinePPState preproc = vlls.ForLine(lineCurrent);\n\n\tbool definitionsChanged = false;\n\n\t// Truncate ppDefineHistory before current line\n\n\tif (!options.updatePreprocessor)\n\t\tppDefineHistory.clear();\n\n\tstd::vector<PPDefinition>::iterator itInvalid = std::find_if(ppDefineHistory.begin(), ppDefineHistory.end(), After(lineCurrent-1));\n\tif (itInvalid != ppDefineHistory.end()) {\n\t\tppDefineHistory.erase(itInvalid, ppDefineHistory.end());\n\t\tdefinitionsChanged = true;\n\t}\n\n\tstd::map<std::string, std::string> preprocessorDefinitions = preprocessorDefinitionsStart;\n\tfor (std::vector<PPDefinition>::iterator itDef = ppDefineHistory.begin(); itDef != ppDefineHistory.end(); ++itDef) {\n\t\tif (itDef->isUndef)\n\t\t\tpreprocessorDefinitions.erase(itDef->key);\n\t\telse\n\t\t\tpreprocessorDefinitions[itDef->key] = itDef->value;\n\t}\n\n\tstd::string rawStringTerminator = rawStringTerminators.ValueAt(lineCurrent-1);\n\tSparseState<std::string> rawSTNew(lineCurrent);\n\n\tint activitySet = preproc.IsInactive() ? activeFlag : 0;\n\n\tconst WordClassifier &classifierIdentifiers = subStyles.Classifier(SCE_C_IDENTIFIER);\n\tconst WordClassifier &classifierDocKeyWords = subStyles.Classifier(SCE_C_COMMENTDOCKEYWORD);\n\n\tint lineEndNext = styler.LineEnd(lineCurrent);\n\n\tfor (; sc.More();) {\n\n\t\tif (sc.atLineStart) {\n\t\t\t// Using MaskActive() is not needed in the following statement.\n\t\t\t// Inside inactive preprocessor declaration, state will be reset anyway at the end of this block.\n\t\t\tif ((sc.state == SCE_C_STRING) || (sc.state == SCE_C_CHARACTER)) {\n\t\t\t\t// Prevent SCE_C_STRINGEOL from leaking back to previous line which\n\t\t\t\t// ends with a line continuation by locking in the state upto this position.\n\t\t\t\tsc.SetState(sc.state);\n\t\t\t}\n\t\t\tif ((MaskActive(sc.state) == SCE_C_PREPROCESSOR) && (!continuationLine)) {\n\t\t\t\tsc.SetState(SCE_C_DEFAULT|activitySet);\n\t\t\t}\n\t\t\t// Reset states to begining of colourise so no surprises\n\t\t\t// if different sets of lines lexed.\n\t\t\tvisibleChars = 0;\n\t\t\tlastWordWasUUID = false;\n\t\t\tisIncludePreprocessor = false;\n\t\t\tinRERange = false;\n\t\t\tif (preproc.IsInactive()) {\n\t\t\t\tactivitySet = activeFlag;\n\t\t\t\tsc.SetState(sc.state | activitySet);\n\t\t\t}\n\t\t}\n\n\t\tif (sc.atLineEnd) {\n\t\t\tlineCurrent++;\n\t\t\tlineEndNext = styler.LineEnd(lineCurrent);\n\t\t\tvlls.Add(lineCurrent, preproc);\n\t\t\tif (rawStringTerminator != \"\") {\n\t\t\t\trawSTNew.Set(lineCurrent-1, rawStringTerminator);\n\t\t\t}\n\t\t}\n\n\t\t// Handle line continuation generically.\n\t\tif (sc.ch == '\\\\') {\n\t\t\tif (static_cast<int>((sc.currentPos+1)) >= lineEndNext) {\n\t\t\t\tlineCurrent++;\n\t\t\t\tlineEndNext = styler.LineEnd(lineCurrent);\n\t\t\t\tvlls.Add(lineCurrent, preproc);\n\t\t\t\tsc.Forward();\n\t\t\t\tif (sc.ch == '\\r' && sc.chNext == '\\n') {\n\t\t\t\t\t// Even in UTF-8, \\r and \\n are separate\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tcontinuationLine = true;\n\t\t\t\tsc.Forward();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tconst bool atLineEndBeforeSwitch = sc.atLineEnd;\n\n\t\t// Determine if the current state should terminate.\n\t\tswitch (MaskActive(sc.state)) {\n\t\t\tcase SCE_C_OPERATOR:\n\t\t\t\tsc.SetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_NUMBER:\n\t\t\t\t// We accept almost anything because of hex. and number suffixes\n\t\t\t\tif (!(setWord.Contains(sc.ch)\n\t\t\t\t   || ((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E' ||\n\t\t\t\t                                          sc.chPrev == 'p' || sc.chPrev == 'P')))) {\n\t\t\t\t\tsc.SetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_IDENTIFIER:\n\t\t\t\tif (sc.atLineStart || sc.atLineEnd || !setWord.Contains(sc.ch) || (sc.ch == '.')) {\n\t\t\t\t\tchar s[1000];\n\t\t\t\t\tif (caseSensitive) {\n\t\t\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\t\t}\n\t\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\t\tlastWordWasUUID = strcmp(s, \"uuid\") == 0;\n\t\t\t\t\t\tsc.ChangeState(SCE_C_WORD|activitySet);\n\t\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_C_WORD2|activitySet);\n\t\t\t\t\t} else if (keywords4.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_C_GLOBALCLASS|activitySet);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tint subStyle = classifierIdentifiers.ValueFor(s);\n\t\t\t\t\t\tif (subStyle >= 0) {\n\t\t\t\t\t\t\tsc.ChangeState(subStyle|activitySet);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst bool literalString = sc.ch == '\\\"';\n\t\t\t\t\tif (literalString || sc.ch == '\\'') {\n\t\t\t\t\t\tsize_t lenS = strlen(s);\n\t\t\t\t\t\tconst bool raw = literalString && sc.chPrev == 'R' && !setInvalidRawFirst.Contains(sc.chNext);\n\t\t\t\t\t\tif (raw)\n\t\t\t\t\t\t\ts[lenS--] = '\\0';\n\t\t\t\t\t\tbool valid =\n\t\t\t\t\t\t\t(lenS == 0) ||\n\t\t\t\t\t\t\t((lenS == 1) && ((s[0] == 'L') || (s[0] == 'u') || (s[0] == 'U'))) ||\n\t\t\t\t\t\t\t((lenS == 2) && literalString && (s[0] == 'u') && (s[1] == '8'));\n\t\t\t\t\t\tif (valid) {\n\t\t\t\t\t\t\tif (literalString)\n\t\t\t\t\t\t\t\tsc.ChangeState((raw ? SCE_C_STRINGRAW : SCE_C_STRING)|activitySet);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tsc.ChangeState(SCE_C_CHARACTER|activitySet);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_PREPROCESSOR:\n\t\t\t\tif (options.stylingWithinPreprocessor) {\n\t\t\t\t\tif (IsASpace(sc.ch)) {\n\t\t\t\t\t\tsc.SetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t\t}\n\t\t\t\t} else if (isStringInPreprocessor && (sc.Match('>') || sc.Match('\\\"'))) {\n\t\t\t\t\tisStringInPreprocessor = false;\n\t\t\t\t} else if (!isStringInPreprocessor) {\n\t\t\t\t\tif ((isIncludePreprocessor && sc.Match('<')) || sc.Match('\\\"')) {\n\t\t\t\t\t\tisStringInPreprocessor = true;\n\t\t\t\t\t} else if (sc.Match('/', '*')) {\n\t\t\t\t\t\tif (sc.Match(\"/**\") || sc.Match(\"/*!\")) {\n\t\t\t\t\t\t\tsc.SetState(SCE_C_PREPROCESSORCOMMENTDOC|activitySet);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.SetState(SCE_C_PREPROCESSORCOMMENT|activitySet);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsc.Forward();\t// Eat the *\n\t\t\t\t\t} else if (sc.Match('/', '/')) {\n\t\t\t\t\t\tsc.SetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_PREPROCESSORCOMMENT:\n\t\t\tcase SCE_C_PREPROCESSORCOMMENTDOC:\n\t\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_C_PREPROCESSOR|activitySet);\n\t\t\t\t\tcontinue;\t// Without advancing in case of '\\'.\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_COMMENT:\n\t\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_COMMENTDOC:\n\t\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t} else if (sc.ch == '@' || sc.ch == '\\\\') { // JavaDoc and Doxygen support\n\t\t\t\t\t// Verify that we have the conditions to mark a comment-doc-keyword\n\t\t\t\t\tif ((IsASpace(sc.chPrev) || sc.chPrev == '*') && (!IsASpace(sc.chNext))) {\n\t\t\t\t\t\tstyleBeforeDCKeyword = SCE_C_COMMENTDOC;\n\t\t\t\t\t\tsc.SetState(SCE_C_COMMENTDOCKEYWORD|activitySet);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_COMMENTLINE:\n\t\t\t\tif (sc.atLineStart && !continuationLine) {\n\t\t\t\t\tsc.SetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_COMMENTLINEDOC:\n\t\t\t\tif (sc.atLineStart && !continuationLine) {\n\t\t\t\t\tsc.SetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t} else if (sc.ch == '@' || sc.ch == '\\\\') { // JavaDoc and Doxygen support\n\t\t\t\t\t// Verify that we have the conditions to mark a comment-doc-keyword\n\t\t\t\t\tif ((IsASpace(sc.chPrev) || sc.chPrev == '/' || sc.chPrev == '!') && (!IsASpace(sc.chNext))) {\n\t\t\t\t\t\tstyleBeforeDCKeyword = SCE_C_COMMENTLINEDOC;\n\t\t\t\t\t\tsc.SetState(SCE_C_COMMENTDOCKEYWORD|activitySet);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_COMMENTDOCKEYWORD:\n\t\t\t\tif ((styleBeforeDCKeyword == SCE_C_COMMENTDOC) && sc.Match('*', '/')) {\n\t\t\t\t\tsc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR);\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t} else if (!setDoxygen.Contains(sc.ch)) {\n\t\t\t\t\tchar s[100];\n\t\t\t\t\tif (caseSensitive) {\n\t\t\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\t\t}\n\t\t\t\t\tif (!IsASpace(sc.ch)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR|activitySet);\n\t\t\t\t\t} else if (!keywords3.InList(s + 1)) {\n\t\t\t\t\t\tint subStyleCDKW = classifierDocKeyWords.ValueFor(s+1);\n\t\t\t\t\t\tif (subStyleCDKW >= 0) {\n\t\t\t\t\t\t\tsc.ChangeState(subStyleCDKW|activitySet);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR|activitySet);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(styleBeforeDCKeyword|activitySet);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_STRING:\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.ChangeState(SCE_C_STRINGEOL|activitySet);\n\t\t\t\t} else if (isIncludePreprocessor) {\n\t\t\t\t\tif (sc.ch == '>') {\n\t\t\t\t\t\tsc.ForwardSetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t\t\tisIncludePreprocessor = false;\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\t\tsc.ForwardSetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_HASHQUOTEDSTRING:\n\t\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\t\tsc.ForwardSetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_STRINGRAW:\n\t\t\t\tif (sc.Match(rawStringTerminator.c_str())) {\n\t\t\t\t\tfor (size_t termPos=rawStringTerminator.size(); termPos; termPos--)\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.SetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t\trawStringTerminator = \"\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_CHARACTER:\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.ChangeState(SCE_C_STRINGEOL|activitySet);\n\t\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\t\tsc.ForwardSetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_REGEX:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t} else if (! inRERange && sc.ch == '/') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\twhile ((sc.ch < 0x80) && islower(sc.ch))\n\t\t\t\t\t\tsc.Forward();    // gobble regex flags\n\t\t\t\t\tsc.SetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t} else if (sc.ch == '\\\\' && (static_cast<int>(sc.currentPos+1) < lineEndNext)) {\n\t\t\t\t\t// Gobble up the escaped character\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} else if (sc.ch == '[') {\n\t\t\t\t\tinRERange = true;\n\t\t\t\t} else if (sc.ch == ']') {\n\t\t\t\t\tinRERange = false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_STRINGEOL:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_VERBATIM:\n\t\t\t\tif (sc.ch == '\\\"') {\n\t\t\t\t\tif (sc.chNext == '\\\"') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.ForwardSetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_TRIPLEVERBATIM:\n\t\t\t\tif (sc.Match(\"\\\"\\\"\\\"\")) {\n\t\t\t\t\twhile (sc.Match('\"')) {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_C_UUID:\n\t\t\t\tif (sc.atLineEnd || sc.ch == ')') {\n\t\t\t\t\tsc.SetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t}\n\t\t}\n\n\t\tif (sc.atLineEnd && !atLineEndBeforeSwitch) {\n\t\t\t// State exit processing consumed characters up to end of line.\n\t\t\tlineCurrent++;\n\t\t\tlineEndNext = styler.LineEnd(lineCurrent);\n\t\t\tvlls.Add(lineCurrent, preproc);\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (MaskActive(sc.state) == SCE_C_DEFAULT) {\n\t\t\tif (sc.Match('@', '\\\"')) {\n\t\t\t\tsc.SetState(SCE_C_VERBATIM|activitySet);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (options.triplequotedStrings && sc.Match(\"\\\"\\\"\\\"\")) {\n\t\t\t\tsc.SetState(SCE_C_TRIPLEVERBATIM|activitySet);\n\t\t\t\tsc.Forward(2);\n\t\t\t} else if (options.hashquotedStrings && sc.Match('#', '\\\"')) {\n\t\t\t\tsc.SetState(SCE_C_HASHQUOTEDSTRING|activitySet);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tif (lastWordWasUUID) {\n\t\t\t\t\tsc.SetState(SCE_C_UUID|activitySet);\n\t\t\t\t\tlastWordWasUUID = false;\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_C_NUMBER|activitySet);\n\t\t\t\t}\n\t\t\t} else if (!sc.atLineEnd && (setWordStart.Contains(sc.ch) || (sc.ch == '@'))) {\n\t\t\t\tif (lastWordWasUUID) {\n\t\t\t\t\tsc.SetState(SCE_C_UUID|activitySet);\n\t\t\t\t\tlastWordWasUUID = false;\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_C_IDENTIFIER|activitySet);\n\t\t\t\t}\n\t\t\t} else if (sc.Match('/', '*')) {\n\t\t\t\tif (sc.Match(\"/**\") || sc.Match(\"/*!\")) {\t// Support of Qt/Doxygen doc. style\n\t\t\t\t\tsc.SetState(SCE_C_COMMENTDOC|activitySet);\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_C_COMMENT|activitySet);\n\t\t\t\t}\n\t\t\t\tsc.Forward();\t// Eat the * so it isn't used for the end of the comment\n\t\t\t} else if (sc.Match('/', '/')) {\n\t\t\t\tif ((sc.Match(\"///\") && !sc.Match(\"////\")) || sc.Match(\"//!\"))\n\t\t\t\t\t// Support of Qt/Doxygen doc. style\n\t\t\t\t\tsc.SetState(SCE_C_COMMENTLINEDOC|activitySet);\n\t\t\t\telse\n\t\t\t\t\tsc.SetState(SCE_C_COMMENTLINE|activitySet);\n\t\t\t} else if (sc.ch == '/'\n\t\t\t\t   && (setOKBeforeRE.Contains(chPrevNonWhite)\n\t\t\t\t       || followsReturnKeyword(sc, styler))\n\t\t\t\t   && (!setCouldBePostOp.Contains(chPrevNonWhite)\n\t\t\t\t       || !FollowsPostfixOperator(sc, styler))) {\n\t\t\t\tsc.SetState(SCE_C_REGEX|activitySet);\t// JavaScript's RegEx\n\t\t\t\tinRERange = false;\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tif (sc.chPrev == 'R') {\n\t\t\t\t\tstyler.Flush();\n\t\t\t\t\tif (MaskActive(styler.StyleAt(sc.currentPos - 1)) == SCE_C_STRINGRAW) {\n\t\t\t\t\t\tsc.SetState(SCE_C_STRINGRAW|activitySet);\n\t\t\t\t\t\trawStringTerminator = \")\";\n\t\t\t\t\t\tfor (int termPos = sc.currentPos + 1;; termPos++) {\n\t\t\t\t\t\t\tchar chTerminator = styler.SafeGetCharAt(termPos, '(');\n\t\t\t\t\t\t\tif (chTerminator == '(')\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\trawStringTerminator += chTerminator;\n\t\t\t\t\t\t}\n\t\t\t\t\t\trawStringTerminator += '\\\"';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.SetState(SCE_C_STRING|activitySet);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_C_STRING|activitySet);\n\t\t\t\t}\n\t\t\t\tisIncludePreprocessor = false;\t// ensure that '>' won't end the string\n\t\t\t} else if (isIncludePreprocessor && sc.ch == '<') {\n\t\t\t\tsc.SetState(SCE_C_STRING|activitySet);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_C_CHARACTER|activitySet);\n\t\t\t} else if (sc.ch == '#' && visibleChars == 0) {\n\t\t\t\t// Preprocessor commands are alone on their line\n\t\t\t\tsc.SetState(SCE_C_PREPROCESSOR|activitySet);\n\t\t\t\t// Skip whitespace between # and preprocessor word\n\t\t\t\tdo {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} while ((sc.ch == ' ' || sc.ch == '\\t') && sc.More());\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.SetState(SCE_C_DEFAULT|activitySet);\n\t\t\t\t} else if (sc.Match(\"include\")) {\n\t\t\t\t\tisIncludePreprocessor = true;\n\t\t\t\t} else {\n\t\t\t\t\tif (options.trackPreprocessor) {\n\t\t\t\t\t\tif (sc.Match(\"ifdef\") || sc.Match(\"ifndef\")) {\n\t\t\t\t\t\t\tbool isIfDef = sc.Match(\"ifdef\");\n\t\t\t\t\t\t\tint i = isIfDef ? 5 : 6;\n\t\t\t\t\t\t\tstd::string restOfLine = GetRestOfLine(styler, sc.currentPos + i + 1, false);\n\t\t\t\t\t\t\tbool foundDef = preprocessorDefinitions.find(restOfLine) != preprocessorDefinitions.end();\n\t\t\t\t\t\t\tpreproc.StartSection(isIfDef == foundDef);\n\t\t\t\t\t\t} else if (sc.Match(\"if\")) {\n\t\t\t\t\t\t\tstd::string restOfLine = GetRestOfLine(styler, sc.currentPos + 2, true);\n\t\t\t\t\t\t\tbool ifGood = EvaluateExpression(restOfLine, preprocessorDefinitions);\n\t\t\t\t\t\t\tpreproc.StartSection(ifGood);\n\t\t\t\t\t\t} else if (sc.Match(\"else\")) {\n\t\t\t\t\t\t\tif (!preproc.CurrentIfTaken()) {\n\t\t\t\t\t\t\t\tpreproc.InvertCurrentLevel();\n\t\t\t\t\t\t\t\tactivitySet = preproc.IsInactive() ? activeFlag : 0;\n\t\t\t\t\t\t\t\tif (!activitySet)\n\t\t\t\t\t\t\t\t\tsc.ChangeState(SCE_C_PREPROCESSOR|activitySet);\n\t\t\t\t\t\t\t} else if (!preproc.IsInactive()) {\n\t\t\t\t\t\t\t\tpreproc.InvertCurrentLevel();\n\t\t\t\t\t\t\t\tactivitySet = preproc.IsInactive() ? activeFlag : 0;\n\t\t\t\t\t\t\t\tif (!activitySet)\n\t\t\t\t\t\t\t\t\tsc.ChangeState(SCE_C_PREPROCESSOR|activitySet);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (sc.Match(\"elif\")) {\n\t\t\t\t\t\t\t// Ensure only one chosen out of #if .. #elif .. #elif .. #else .. #endif\n\t\t\t\t\t\t\tif (!preproc.CurrentIfTaken()) {\n\t\t\t\t\t\t\t\t// Similar to #if\n\t\t\t\t\t\t\t\tstd::string restOfLine = GetRestOfLine(styler, sc.currentPos + 2, true);\n\t\t\t\t\t\t\t\tbool ifGood = EvaluateExpression(restOfLine, preprocessorDefinitions);\n\t\t\t\t\t\t\t\tif (ifGood) {\n\t\t\t\t\t\t\t\t\tpreproc.InvertCurrentLevel();\n\t\t\t\t\t\t\t\t\tactivitySet = preproc.IsInactive() ? activeFlag : 0;\n\t\t\t\t\t\t\t\t\tif (!activitySet)\n\t\t\t\t\t\t\t\t\t\tsc.ChangeState(SCE_C_PREPROCESSOR|activitySet);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (!preproc.IsInactive()) {\n\t\t\t\t\t\t\t\tpreproc.InvertCurrentLevel();\n\t\t\t\t\t\t\t\tactivitySet = preproc.IsInactive() ? activeFlag : 0;\n\t\t\t\t\t\t\t\tif (!activitySet)\n\t\t\t\t\t\t\t\t\tsc.ChangeState(SCE_C_PREPROCESSOR|activitySet);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (sc.Match(\"endif\")) {\n\t\t\t\t\t\t\tpreproc.EndSection();\n\t\t\t\t\t\t\tactivitySet = preproc.IsInactive() ? activeFlag : 0;\n\t\t\t\t\t\t\tsc.ChangeState(SCE_C_PREPROCESSOR|activitySet);\n\t\t\t\t\t\t} else if (sc.Match(\"define\")) {\n\t\t\t\t\t\t\tif (options.updatePreprocessor && !preproc.IsInactive()) {\n\t\t\t\t\t\t\t\tstd::string restOfLine = GetRestOfLine(styler, sc.currentPos + 6, true);\n\t\t\t\t\t\t\t\tif (restOfLine.find(\")\") == std::string::npos) {\t// Don't handle macros with arguments\n\t\t\t\t\t\t\t\t\tstd::vector<std::string> tokens = Tokenize(restOfLine);\n\t\t\t\t\t\t\t\t\tstd::string key;\n\t\t\t\t\t\t\t\t\tstd::string value(\"1\");\n\t\t\t\t\t\t\t\t\tif (tokens.size() >= 1) {\n\t\t\t\t\t\t\t\t\t\tkey = tokens[0];\n\t\t\t\t\t\t\t\t\t\tif (tokens.size() >= 2) {\n\t\t\t\t\t\t\t\t\t\t\tvalue = tokens[1];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tpreprocessorDefinitions[key] = value;\n\t\t\t\t\t\t\t\t\t\tppDefineHistory.push_back(PPDefinition(lineCurrent, key, value));\n\t\t\t\t\t\t\t\t\t\tdefinitionsChanged = true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (sc.Match(\"undef\")) {\n\t\t\t\t\t\t\tif (options.updatePreprocessor && !preproc.IsInactive()) {\n\t\t\t\t\t\t\t\tstd::string restOfLine = GetRestOfLine(styler, sc.currentPos + 5, true);\n\t\t\t\t\t\t\t\tstd::vector<std::string> tokens = Tokenize(restOfLine);\n\t\t\t\t\t\t\t\tstd::string key;\n\t\t\t\t\t\t\t\tif (tokens.size() >= 1) {\n\t\t\t\t\t\t\t\t\tkey = tokens[0];\n\t\t\t\t\t\t\t\t\tpreprocessorDefinitions.erase(key);\n\t\t\t\t\t\t\t\t\tppDefineHistory.push_back(PPDefinition(lineCurrent, key, \"\", true));\n\t\t\t\t\t\t\t\t\tdefinitionsChanged = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (isoperator(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_C_OPERATOR|activitySet);\n\t\t\t}\n\t\t}\n\n\t\tif (!IsASpace(sc.ch) && !IsSpaceEquiv(MaskActive(sc.state))) {\n\t\t\tchPrevNonWhite = sc.ch;\n\t\t\tvisibleChars++;\n\t\t}\n\t\tcontinuationLine = false;\n\t\tsc.Forward();\n\t}\n\tconst bool rawStringsChanged = rawStringTerminators.Merge(rawSTNew, lineCurrent);\n\tif (definitionsChanged || rawStringsChanged)\n\t\tstyler.ChangeLexerState(startPos, startPos + length);\n\tsc.Complete();\n}\n\n// Store both the current line's fold level and the next lines in the\n// level store to make it easy to pick up with each increment\n// and to make it possible to fiddle the current level for \"} else {\".\n\nvoid SCI_METHOD LexerCPP::Fold(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n\n\tif (!options.fold)\n\t\treturn;\n\n\tLexAccessor styler(pAccess);\n\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tbool inLineComment = false;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelCurrent = SC_FOLDLEVELBASE;\n\tif (lineCurrent > 0)\n\t\tlevelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n\tunsigned int lineStartNext = styler.LineStart(lineCurrent+1);\n\tint levelMinCurrent = levelCurrent;\n\tint levelNext = levelCurrent;\n\tchar chNext = styler[startPos];\n\tint styleNext = MaskActive(styler.StyleAt(startPos));\n\tint style = MaskActive(initStyle);\n\tconst bool userDefinedFoldMarkers = !options.foldExplicitStart.empty() && !options.foldExplicitEnd.empty();\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = MaskActive(styler.StyleAt(i + 1));\n\t\tbool atEOL = i == (lineStartNext-1);\n\t\tif ((style == SCE_C_COMMENTLINE) || (style == SCE_C_COMMENTLINEDOC))\n\t\t\tinLineComment = true;\n\t\tif (options.foldComment && options.foldCommentMultiline && IsStreamCommentStyle(style) && !inLineComment) {\n\t\t\tif (!IsStreamCommentStyle(stylePrev)) {\n\t\t\t\tlevelNext++;\n\t\t\t} else if (!IsStreamCommentStyle(styleNext) && !atEOL) {\n\t\t\t\t// Comments don't end at end of line and the next character may be unstyled.\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\t\tif (options.foldComment && options.foldCommentExplicit && ((style == SCE_C_COMMENTLINE) || options.foldExplicitAnywhere)) {\n\t\t\tif (userDefinedFoldMarkers) {\n\t\t\t\tif (styler.Match(i, options.foldExplicitStart.c_str())) {\n\t\t\t\t\tlevelNext++;\n\t\t\t\t} else if (styler.Match(i, options.foldExplicitEnd.c_str())) {\n\t\t\t\t\tlevelNext--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ((ch == '/') && (chNext == '/')) {\n\t\t\t\t\tchar chNext2 = styler.SafeGetCharAt(i + 2);\n\t\t\t\t\tif (chNext2 == '{') {\n\t\t\t\t\t\tlevelNext++;\n\t\t\t\t\t} else if (chNext2 == '}') {\n\t\t\t\t\t\tlevelNext--;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (options.foldPreprocessor && (style == SCE_C_PREPROCESSOR)) {\n\t\t\tif (ch == '#') {\n\t\t\t\tunsigned int j = i + 1;\n\t\t\t\twhile ((j < endPos) && IsASpaceOrTab(styler.SafeGetCharAt(j))) {\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t\tif (styler.Match(j, \"region\") || styler.Match(j, \"if\")) {\n\t\t\t\t\tlevelNext++;\n\t\t\t\t} else if (styler.Match(j, \"end\")) {\n\t\t\t\t\tlevelNext--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (options.foldSyntaxBased && (style == SCE_C_OPERATOR)) {\n\t\t\tif (ch == '{') {\n\t\t\t\t// Measure the minimum before a '{' to allow\n\t\t\t\t// folding on \"} else {\"\n\t\t\t\tif (levelMinCurrent > levelNext) {\n\t\t\t\t\tlevelMinCurrent = levelNext;\n\t\t\t\t}\n\t\t\t\tlevelNext++;\n\t\t\t} else if (ch == '}') {\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\t\tif (!IsASpace(ch))\n\t\t\tvisibleChars++;\n\t\tif (atEOL || (i == endPos-1)) {\n\t\t\tint levelUse = levelCurrent;\n\t\t\tif (options.foldSyntaxBased && options.foldAtElse) {\n\t\t\t\tlevelUse = levelMinCurrent;\n\t\t\t}\n\t\t\tint lev = levelUse | levelNext << 16;\n\t\t\tif (visibleChars == 0 && options.foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (levelUse < levelNext)\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlineStartNext = styler.LineStart(lineCurrent+1);\n\t\t\tlevelCurrent = levelNext;\n\t\t\tlevelMinCurrent = levelCurrent;\n\t\t\tif (atEOL && (i == static_cast<unsigned int>(styler.Length()-1))) {\n\t\t\t\t// There is an empty line at end of file so give it same level and empty\n\t\t\t\tstyler.SetLevel(lineCurrent, (levelCurrent | levelCurrent << 16) | SC_FOLDLEVELWHITEFLAG);\n\t\t\t}\n\t\t\tvisibleChars = 0;\n\t\t\tinLineComment = false;\n\t\t}\n\t}\n}\n\nvoid LexerCPP::EvaluateTokens(std::vector<std::string> &tokens) {\n\n\t// Evaluate defined() statements to either 0 or 1\n\tfor (size_t i=0; (i+2)<tokens.size();) {\n\t\tif ((tokens[i] == \"defined\") && (tokens[i+1] == \"(\")) {\n\t\t\tconst char *val = \"0\";\n\t\t\tif (tokens[i+2] == \")\") {\n\t\t\t\t// defined()\n\t\t\t\ttokens.erase(tokens.begin() + i + 1, tokens.begin() + i + 3);\n\t\t\t} else if (((i+3)<tokens.size()) && (tokens[i+3] == \")\")) {\n\t\t\t\t// defined(<int>)\n\t\t\t\ttokens.erase(tokens.begin() + i + 1, tokens.begin() + i + 4);\n\t\t\t\tval = \"1\";\n\t\t\t}\n\t\t\ttokens[i] = val;\n\t\t} else {\n\t\t\ti++;\n\t\t}\n\t}\n\n\t// Find bracketed subexpressions and recurse on them\n\tstd::vector<std::string>::iterator itBracket = std::find(tokens.begin(), tokens.end(), \"(\");\n\tstd::vector<std::string>::iterator itEndBracket = std::find(tokens.begin(), tokens.end(), \")\");\n\twhile ((itBracket != tokens.end()) && (itEndBracket != tokens.end()) && (itEndBracket > itBracket)) {\n\t\tstd::vector<std::string> inBracket(itBracket + 1, itEndBracket);\n\t\tEvaluateTokens(inBracket);\n\n\t\t// The insertion is done before the removal because there were failures with the opposite approach\n\t\ttokens.insert(itBracket, inBracket.begin(), inBracket.end());\n\t\titBracket = std::find(tokens.begin(), tokens.end(), \"(\");\n\t\titEndBracket = std::find(tokens.begin(), tokens.end(), \")\");\n\t\ttokens.erase(itBracket, itEndBracket + 1);\n\n\t\titBracket = std::find(tokens.begin(), tokens.end(), \"(\");\n\t\titEndBracket = std::find(tokens.begin(), tokens.end(), \")\");\n\t}\n\n\t// Evaluate logical negations\n\tfor (size_t j=0; (j+1)<tokens.size();) {\n\t\tif (setNegationOp.Contains(tokens[j][0])) {\n\t\t\tint isTrue = atoi(tokens[j+1].c_str());\n\t\t\tif (tokens[j] == \"!\")\n\t\t\t\tisTrue = !isTrue;\n\t\t\tstd::vector<std::string>::iterator itInsert =\n\t\t\t\ttokens.erase(tokens.begin() + j, tokens.begin() + j + 2);\n\t\t\ttokens.insert(itInsert, isTrue ? \"1\" : \"0\");\n\t\t} else {\n\t\t\tj++;\n\t\t}\n\t}\n\n\t// Evaluate expressions in precedence order\n\tenum precedence { precArithmetic, precRelative, precLogical };\n\tfor (int prec=precArithmetic; prec <= precLogical; prec++) {\n\t\t// Looking at 3 tokens at a time so end at 2 before end\n\t\tfor (size_t k=0; (k+2)<tokens.size();) {\n\t\t\tchar chOp = tokens[k+1][0];\n\t\t\tif (\n\t\t\t\t((prec==precArithmetic) && setArithmethicOp.Contains(chOp)) ||\n\t\t\t\t((prec==precRelative) && setRelOp.Contains(chOp)) ||\n\t\t\t\t((prec==precLogical) && setLogicalOp.Contains(chOp))\n\t\t\t\t) {\n\t\t\t\tint valA = atoi(tokens[k].c_str());\n\t\t\t\tint valB = atoi(tokens[k+2].c_str());\n\t\t\t\tint result = 0;\n\t\t\t\tif (tokens[k+1] == \"+\")\n\t\t\t\t\tresult = valA + valB;\n\t\t\t\telse if (tokens[k+1] == \"-\")\n\t\t\t\t\tresult = valA - valB;\n\t\t\t\telse if (tokens[k+1] == \"*\")\n\t\t\t\t\tresult = valA * valB;\n\t\t\t\telse if (tokens[k+1] == \"/\")\n\t\t\t\t\tresult = valA / (valB ? valB : 1);\n\t\t\t\telse if (tokens[k+1] == \"%\")\n\t\t\t\t\tresult = valA % (valB ? valB : 1);\n\t\t\t\telse if (tokens[k+1] == \"<\")\n\t\t\t\t\tresult = valA < valB;\n\t\t\t\telse if (tokens[k+1] == \"<=\")\n\t\t\t\t\tresult = valA <= valB;\n\t\t\t\telse if (tokens[k+1] == \">\")\n\t\t\t\t\tresult = valA > valB;\n\t\t\t\telse if (tokens[k+1] == \">=\")\n\t\t\t\t\tresult = valA >= valB;\n\t\t\t\telse if (tokens[k+1] == \"==\")\n\t\t\t\t\tresult = valA == valB;\n\t\t\t\telse if (tokens[k+1] == \"!=\")\n\t\t\t\t\tresult = valA != valB;\n\t\t\t\telse if (tokens[k+1] == \"||\")\n\t\t\t\t\tresult = valA || valB;\n\t\t\t\telse if (tokens[k+1] == \"&&\")\n\t\t\t\t\tresult = valA && valB;\n\t\t\t\tchar sResult[30];\n\t\t\t\tsprintf(sResult, \"%d\", result);\n\t\t\t\tstd::vector<std::string>::iterator itInsert =\n\t\t\t\t\ttokens.erase(tokens.begin() + k, tokens.begin() + k + 3);\n\t\t\t\ttokens.insert(itInsert, sResult);\n\t\t\t} else {\n\t\t\t\tk++;\n\t\t\t}\n\t\t}\n\t}\n}\n\nbool LexerCPP::EvaluateExpression(const std::string &expr, const std::map<std::string, std::string> &preprocessorDefinitions) {\n\t// Break into tokens, replacing with definitions\n\tstd::string word;\n\tstd::vector<std::string> tokens;\n\tconst char *cp = expr.c_str();\n\tfor (;;) {\n\t\tif (setWord.Contains(static_cast<unsigned char>(*cp))) {\n\t\t\tword += *cp;\n\t\t} else {\n\t\t\tstd::map<std::string, std::string>::const_iterator it = preprocessorDefinitions.find(word);\n\t\t\tif (it != preprocessorDefinitions.end()) {\n\t\t\t\ttokens.push_back(it->second);\n\t\t\t} else if (!word.empty() && ((word[0] >= '0' && word[0] <= '9') || (word == \"defined\"))) {\n\t\t\t\ttokens.push_back(word);\n\t\t\t}\n\t\t\tword = \"\";\n\t\t\tif (!*cp) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ((*cp != ' ') && (*cp != '\\t')) {\n\t\t\t\tstd::string op(cp, 1);\n\t\t\t\tif (setRelOp.Contains(static_cast<unsigned char>(*cp))) {\n\t\t\t\t\tif (setRelOp.Contains(static_cast<unsigned char>(cp[1]))) {\n\t\t\t\t\t\top += cp[1];\n\t\t\t\t\t\tcp++;\n\t\t\t\t\t}\n\t\t\t\t} else if (setLogicalOp.Contains(static_cast<unsigned char>(*cp))) {\n\t\t\t\t\tif (setLogicalOp.Contains(static_cast<unsigned char>(cp[1]))) {\n\t\t\t\t\t\top += cp[1];\n\t\t\t\t\t\tcp++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttokens.push_back(op);\n\t\t\t}\n\t\t}\n\t\tcp++;\n\t}\n\n\tEvaluateTokens(tokens);\n\n\t// \"0\" or \"\" -> false else true\n\tbool isFalse = tokens.empty() ||\n\t\t((tokens.size() == 1) && ((tokens[0] == \"\") || tokens[0] == \"0\"));\n\treturn !isFalse;\n}\n\nLexerModule lmCPP(SCLEX_CPP, LexerCPP::LexerFactoryCPP, \"cpp\", cppWordLists);\nLexerModule lmCPPNoCase(SCLEX_CPPNOCASE, LexerCPP::LexerFactoryCPPInsensitive, \"cppnocase\", cppWordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexCSS.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexCSS.cxx\n ** Lexer for Cascading Style Sheets\n ** Written by Jakub Vrna\n ** Improved by Philippe Lhoste (CSS2)\n ** Improved by Ross McKay (SCSS mode; see http://sass-lang.com/ )\n **/\n// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n// TODO: handle SCSS nested properties like font: { weight: bold; size: 1em; }\n// TODO: handle SCSS interpolation: #{}\n// TODO: add features for Less if somebody feels like contributing; http://lesscss.org/\n// TODO: refactor this monster so that the next poor slob can read it!\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n\nstatic inline bool IsAWordChar(const unsigned int ch) {\n\t/* FIXME:\n\t * The CSS spec allows \"ISO 10646 characters U+00A1 and higher\" to be treated as word chars.\n\t * Unfortunately, we are only getting string bytes here, and not full unicode characters. We cannot guarantee\n\t * that our byte is between U+0080 - U+00A0 (to return false), so we have to allow all characters U+0080 and higher\n\t */\n\treturn ch >= 0x80 || isalnum(ch) || ch == '-' || ch == '_';\n}\n\ninline bool IsCssOperator(const int ch) {\n\tif (!((ch < 0x80) && isalnum(ch)) &&\n\t\t(ch == '{' || ch == '}' || ch == ':' || ch == ',' || ch == ';' ||\n\t\t ch == '.' || ch == '#' || ch == '!' || ch == '@' ||\n\t\t /* CSS2 */\n\t\t ch == '*' || ch == '>' || ch == '+' || ch == '=' || ch == '~' || ch == '|' ||\n\t\t ch == '[' || ch == ']' || ch == '(' || ch == ')')) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n// look behind (from start of document to our start position) to determine current nesting level\ninline int NestingLevelLookBehind(unsigned int startPos, Accessor &styler) {\n\tint ch;\n\tint nestingLevel = 0;\n\n\tfor (unsigned int i = 0; i < startPos; i++) {\n\t\tch = styler.SafeGetCharAt(i);\n\t\tif (ch == '{')\n\t\t\tnestingLevel++;\n\t\telse if (ch == '}')\n\t\t\tnestingLevel--;\n\t}\n\n\treturn nestingLevel;\n}\n\nstatic void ColouriseCssDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) {\n\tWordList &css1Props = *keywordlists[0];\n\tWordList &pseudoClasses = *keywordlists[1];\n\tWordList &css2Props = *keywordlists[2];\n\tWordList &css3Props = *keywordlists[3];\n\tWordList &pseudoElements = *keywordlists[4];\n\tWordList &exProps = *keywordlists[5];\n\tWordList &exPseudoClasses = *keywordlists[6];\n\tWordList &exPseudoElements = *keywordlists[7];\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tint lastState = -1; // before operator\n\tint lastStateC = -1; // before comment\n\tint lastStateS = -1; // before single-quoted/double-quoted string\n\tint lastStateVar = -1; // before variable (SCSS)\n\tint lastStateVal = -1; // before value (SCSS)\n\tint op = ' '; // last operator\n\tint opPrev = ' '; // last operator\n\tbool insideParentheses = false; // true if currently in a CSS url() or similar construct\n\n\t// property lexer.css.scss.language\n\t//\tSet to 1 for Sassy CSS (.scss)\n\tbool isScssDocument = styler.GetPropertyInt(\"lexer.css.scss.language\") != 0;\n\n\t// property lexer.css.less.language\n\t// Set to 1 for Less CSS (.less)\n\tbool isLessDocument = styler.GetPropertyInt(\"lexer.css.less.language\") != 0;\n\n\t// property lexer.css.hss.language\n\t// Set to 1 for HSS (.hss)\n\tbool isHssDocument = styler.GetPropertyInt(\"lexer.css.hss.language\") != 0;\n\n\t// SCSS/LESS/HSS have the concept of variable\n\tbool hasVariables = isScssDocument || isLessDocument || isHssDocument;\n\tchar varPrefix = 0;\n\tif (hasVariables)\n\t\tvarPrefix = isLessDocument ? '@' : '$';\n\n\t// SCSS/LESS/HSS support single-line comments\n\ttypedef enum _CommentModes { eCommentBlock = 0, eCommentLine = 1} CommentMode;\n\tCommentMode comment_mode = eCommentBlock;\n\tbool hasSingleLineComments = isScssDocument || isLessDocument || isHssDocument;\n\n\t// must keep track of nesting level in document types that support it (SCSS/LESS/HSS)\n\tbool hasNesting = false;\n\tint nestingLevel = 0;\n\tif (isScssDocument || isLessDocument || isHssDocument) {\n\t\thasNesting = true;\n\t\tnestingLevel = NestingLevelLookBehind(startPos, styler);\n\t}\n\n\t// \"the loop\"\n\tfor (; sc.More(); sc.Forward()) {\n\t\tif (sc.state == SCE_CSS_COMMENT && ((comment_mode == eCommentBlock && sc.Match('*', '/')) || (comment_mode == eCommentLine && sc.atLineEnd))) {\n\t\t\tif (lastStateC == -1) {\n\t\t\t\t// backtrack to get last state:\n\t\t\t\t// comments are like whitespace, so we must return to the previous state\n\t\t\t\tunsigned int i = startPos;\n\t\t\t\tfor (; i > 0; i--) {\n\t\t\t\t\tif ((lastStateC = styler.StyleAt(i-1)) != SCE_CSS_COMMENT) {\n\t\t\t\t\t\tif (lastStateC == SCE_CSS_OPERATOR) {\n\t\t\t\t\t\t\top = styler.SafeGetCharAt(i-1);\n\t\t\t\t\t\t\topPrev = styler.SafeGetCharAt(i-2);\n\t\t\t\t\t\t\twhile (--i) {\n\t\t\t\t\t\t\t\tlastState = styler.StyleAt(i-1);\n\t\t\t\t\t\t\t\tif (lastState != SCE_CSS_OPERATOR && lastState != SCE_CSS_COMMENT)\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (i == 0)\n\t\t\t\t\t\t\t\tlastState = SCE_CSS_DEFAULT;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (i == 0)\n\t\t\t\t\tlastStateC = SCE_CSS_DEFAULT;\n\t\t\t}\n\t\t\tif (comment_mode == eCommentBlock) {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.ForwardSetState(lastStateC);\n\t\t\t} else /* eCommentLine */ {\n\t\t\t\tsc.SetState(lastStateC);\n\t\t\t}\n\t\t}\n\n\t\tif (sc.state == SCE_CSS_COMMENT)\n\t\t\tcontinue;\n\n\t\tif (sc.state == SCE_CSS_DOUBLESTRING || sc.state == SCE_CSS_SINGLESTRING) {\n\t\t\tif (sc.ch != (sc.state == SCE_CSS_DOUBLESTRING ? '\\\"' : '\\''))\n\t\t\t\tcontinue;\n\t\t\tunsigned int i = sc.currentPos;\n\t\t\twhile (i && styler[i-1] == '\\\\')\n\t\t\t\ti--;\n\t\t\tif ((sc.currentPos - i) % 2 == 1)\n\t\t\t\tcontinue;\n\t\t\tsc.ForwardSetState(lastStateS);\n\t\t}\n\n\t\tif (sc.state == SCE_CSS_OPERATOR) {\n\t\t\tif (op == ' ') {\n\t\t\t\tunsigned int i = startPos;\n\t\t\t\top = styler.SafeGetCharAt(i-1);\n\t\t\t\topPrev = styler.SafeGetCharAt(i-2);\n\t\t\t\twhile (--i) {\n\t\t\t\t\tlastState = styler.StyleAt(i-1);\n\t\t\t\t\tif (lastState != SCE_CSS_OPERATOR && lastState != SCE_CSS_COMMENT)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tswitch (op) {\n\t\t\tcase '@':\n\t\t\t\tif (lastState == SCE_CSS_DEFAULT || hasNesting)\n\t\t\t\t\tsc.SetState(SCE_CSS_DIRECTIVE);\n\t\t\t\tbreak;\n\t\t\tcase '>':\n\t\t\tcase '+':\n\t\t\t\tif (lastState == SCE_CSS_TAG || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID ||\n\t\t\t\t\tlastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS)\n\t\t\t\t\tsc.SetState(SCE_CSS_DEFAULT);\n\t\t\t\tbreak;\n\t\t\tcase '[':\n\t\t\t\tif (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID ||\n\t\t\t\t\tlastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS)\n\t\t\t\t\tsc.SetState(SCE_CSS_ATTRIBUTE);\n\t\t\t\tbreak;\n\t\t\tcase ']':\n\t\t\t\tif (lastState == SCE_CSS_ATTRIBUTE)\n\t\t\t\t\tsc.SetState(SCE_CSS_TAG);\n\t\t\t\tbreak;\n\t\t\tcase '{':\n\t\t\t\tnestingLevel++;\n\t\t\t\tswitch (lastState) {\n\t\t\t\tcase SCE_CSS_MEDIA:\n\t\t\t\t\tsc.SetState(SCE_CSS_DEFAULT);\n\t\t\t\t\tbreak;\n\t\t\t\tcase SCE_CSS_TAG:\n\t\t\t\tcase SCE_CSS_DIRECTIVE:\n\t\t\t\t\tsc.SetState(SCE_CSS_IDENTIFIER);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '}':\n\t\t\t\tif (--nestingLevel < 0)\n\t\t\t\t\tnestingLevel = 0;\n\t\t\t\tswitch (lastState) {\n\t\t\t\tcase SCE_CSS_DEFAULT:\n\t\t\t\tcase SCE_CSS_VALUE:\n\t\t\t\tcase SCE_CSS_IMPORTANT:\n\t\t\t\tcase SCE_CSS_IDENTIFIER:\n\t\t\t\tcase SCE_CSS_IDENTIFIER2:\n\t\t\t\tcase SCE_CSS_IDENTIFIER3:\n\t\t\t\t\tif (hasNesting)\n\t\t\t\t\t\tsc.SetState(nestingLevel > 0 ? SCE_CSS_IDENTIFIER : SCE_CSS_DEFAULT);\n\t\t\t\t\telse\n\t\t\t\t\t\tsc.SetState(SCE_CSS_DEFAULT);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '(':\n\t\t\t\tif (lastState == SCE_CSS_PSEUDOCLASS)\n\t\t\t\t\tsc.SetState(SCE_CSS_TAG);\n\t\t\t\telse if (lastState == SCE_CSS_EXTENDED_PSEUDOCLASS)\n\t\t\t\t\tsc.SetState(SCE_CSS_EXTENDED_PSEUDOCLASS);\n\t\t\t\tbreak;\n\t\t\tcase ')':\n\t\t\t\tif (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID ||\n\t\t\t\t\tlastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS ||\n\t\t\t\t\tlastState == SCE_CSS_PSEUDOELEMENT || lastState == SCE_CSS_EXTENDED_PSEUDOELEMENT)\n\t\t\t\t\tsc.SetState(SCE_CSS_TAG);\n\t\t\t\tbreak;\n\t\t\tcase ':':\n\t\t\t\tswitch (lastState) {\n\t\t\t\tcase SCE_CSS_TAG:\n\t\t\t\tcase SCE_CSS_DEFAULT:\n\t\t\t\tcase SCE_CSS_CLASS:\n\t\t\t\tcase SCE_CSS_ID:\n\t\t\t\tcase SCE_CSS_PSEUDOCLASS:\n\t\t\t\tcase SCE_CSS_EXTENDED_PSEUDOCLASS:\n\t\t\t\tcase SCE_CSS_UNKNOWN_PSEUDOCLASS:\n\t\t\t\tcase SCE_CSS_PSEUDOELEMENT:\n\t\t\t\tcase SCE_CSS_EXTENDED_PSEUDOELEMENT:\n\t\t\t\t\tsc.SetState(SCE_CSS_PSEUDOCLASS);\n\t\t\t\t\tbreak;\n\t\t\t\tcase SCE_CSS_IDENTIFIER:\n\t\t\t\tcase SCE_CSS_IDENTIFIER2:\n\t\t\t\tcase SCE_CSS_IDENTIFIER3:\n\t\t\t\tcase SCE_CSS_EXTENDED_IDENTIFIER:\n\t\t\t\tcase SCE_CSS_UNKNOWN_IDENTIFIER:\n\t\t\t\tcase SCE_CSS_VARIABLE:\n\t\t\t\t\tsc.SetState(SCE_CSS_VALUE);\n\t\t\t\t\tlastStateVal = lastState;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '.':\n\t\t\t\tif (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID ||\n\t\t\t\t\tlastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS)\n\t\t\t\t\tsc.SetState(SCE_CSS_CLASS);\n\t\t\t\tbreak;\n\t\t\tcase '#':\n\t\t\t\tif (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID ||\n\t\t\t\t\tlastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS)\n\t\t\t\t\tsc.SetState(SCE_CSS_ID);\n\t\t\t\tbreak;\n\t\t\tcase ',':\n\t\t\tcase '|':\n\t\t\tcase '~':\n\t\t\t\tif (lastState == SCE_CSS_TAG)\n\t\t\t\t\tsc.SetState(SCE_CSS_DEFAULT);\n\t\t\t\tbreak;\n\t\t\tcase ';':\n\t\t\t\tswitch (lastState) {\n\t\t\t\tcase SCE_CSS_DIRECTIVE:\n\t\t\t\t\tif (hasNesting) {\n\t\t\t\t\t\tsc.SetState(nestingLevel > 0 ? SCE_CSS_IDENTIFIER : SCE_CSS_DEFAULT);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.SetState(SCE_CSS_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase SCE_CSS_VALUE:\n\t\t\t\tcase SCE_CSS_IMPORTANT:\n\t\t\t\t\t// data URLs can have semicolons; simplistically check for wrapping parentheses and move along\n\t\t\t\t\tif (insideParentheses) {\n\t\t\t\t\t\tsc.SetState(lastState);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (lastStateVal == SCE_CSS_VARIABLE) {\n\t\t\t\t\t\t\tsc.SetState(SCE_CSS_DEFAULT);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.SetState(SCE_CSS_IDENTIFIER);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase SCE_CSS_VARIABLE:\n\t\t\t\t\tif (lastStateVar == SCE_CSS_VALUE) {\n\t\t\t\t\t\t// data URLs can have semicolons; simplistically check for wrapping parentheses and move along\n\t\t\t\t\t\tif (insideParentheses) {\n\t\t\t\t\t\t\tsc.SetState(SCE_CSS_VALUE);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.SetState(SCE_CSS_IDENTIFIER);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.SetState(SCE_CSS_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '!':\n\t\t\t\tif (lastState == SCE_CSS_VALUE)\n\t\t\t\t\tsc.SetState(SCE_CSS_IMPORTANT);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (sc.ch == '*' && sc.state == SCE_CSS_DEFAULT) {\n\t\t\tsc.SetState(SCE_CSS_TAG);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// check for inside parentheses (whether part of an \"operator\" or not)\n\t\tif (sc.ch == '(')\n\t\t\tinsideParentheses = true;\n\t\telse if (sc.ch == ')')\n\t\t\tinsideParentheses = false;\n\n\t\t// SCSS special modes\n\t\tif (hasVariables) {\n\t\t\t// variable name\n\t\t\tif (sc.ch == varPrefix) {\n\t\t\t\tswitch (sc.state) {\n\t\t\t\tcase SCE_CSS_DEFAULT:\n\t\t\t\t\tif (isLessDocument) // give priority to pseudo elements\n\t\t\t\t\t\tbreak;\n\t\t\t\tcase SCE_CSS_VALUE:\n\t\t\t\t\tlastStateVar = sc.state;\n\t\t\t\t\tsc.SetState(SCE_CSS_VARIABLE);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (sc.state == SCE_CSS_VARIABLE) {\n\t\t\t\tif (IsAWordChar(sc.ch)) {\n\t\t\t\t\t// still looking at the variable name\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (lastStateVar == SCE_CSS_VALUE) {\n\t\t\t\t\t// not looking at the variable name any more, and it was part of a value\n\t\t\t\t\tsc.SetState(SCE_CSS_VALUE);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// nested rule parent selector\n\t\t\tif (sc.ch == '&') {\n\t\t\t\tswitch (sc.state) {\n\t\t\t\tcase SCE_CSS_DEFAULT:\n\t\t\t\tcase SCE_CSS_IDENTIFIER:\n\t\t\t\t\tsc.SetState(SCE_CSS_TAG);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// nesting rules that apply to SCSS and Less\n\t\tif (hasNesting) {\n\t\t\t// check for nested rule selector\n\t\t\tif (sc.state == SCE_CSS_IDENTIFIER && (IsAWordChar(sc.ch) || sc.ch == ':' || sc.ch == '.' || sc.ch == '#')) {\n\t\t\t\t// look ahead to see whether { comes before next ; and }\n\t\t\t\tunsigned int endPos = startPos + length;\n\t\t\t\tint ch;\n\n\t\t\t\tfor (unsigned int i = sc.currentPos; i < endPos; i++) {\n\t\t\t\t\tch = styler.SafeGetCharAt(i);\n\t\t\t\t\tif (ch == ';' || ch == '}')\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tif (ch == '{') {\n\t\t\t\t\t\tsc.SetState(SCE_CSS_DEFAULT);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif (IsAWordChar(sc.ch)) {\n\t\t\tif (sc.state == SCE_CSS_DEFAULT)\n\t\t\t\tsc.SetState(SCE_CSS_TAG);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (IsAWordChar(sc.chPrev) && (\n\t\t\tsc.state == SCE_CSS_IDENTIFIER || sc.state == SCE_CSS_IDENTIFIER2 ||\n\t\t\tsc.state == SCE_CSS_IDENTIFIER3 || sc.state == SCE_CSS_EXTENDED_IDENTIFIER ||\n\t\t\tsc.state == SCE_CSS_UNKNOWN_IDENTIFIER ||\n\t\t\tsc.state == SCE_CSS_PSEUDOCLASS || sc.state == SCE_CSS_PSEUDOELEMENT ||\n\t\t\tsc.state == SCE_CSS_EXTENDED_PSEUDOCLASS || sc.state == SCE_CSS_EXTENDED_PSEUDOELEMENT ||\n\t\t\tsc.state == SCE_CSS_UNKNOWN_PSEUDOCLASS ||\n\t\t\tsc.state == SCE_CSS_IMPORTANT ||\n\t\t\tsc.state == SCE_CSS_DIRECTIVE\n\t\t)) {\n\t\t\tchar s[100];\n\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\tchar *s2 = s;\n\t\t\twhile (*s2 && !IsAWordChar(*s2))\n\t\t\t\ts2++;\n\t\t\tswitch (sc.state) {\n\t\t\tcase SCE_CSS_IDENTIFIER:\n\t\t\tcase SCE_CSS_IDENTIFIER2:\n\t\t\tcase SCE_CSS_IDENTIFIER3:\n\t\t\tcase SCE_CSS_EXTENDED_IDENTIFIER:\n\t\t\tcase SCE_CSS_UNKNOWN_IDENTIFIER:\n\t\t\t\tif (css1Props.InList(s2))\n\t\t\t\t\tsc.ChangeState(SCE_CSS_IDENTIFIER);\n\t\t\t\telse if (css2Props.InList(s2))\n\t\t\t\t\tsc.ChangeState(SCE_CSS_IDENTIFIER2);\n\t\t\t\telse if (css3Props.InList(s2))\n\t\t\t\t\tsc.ChangeState(SCE_CSS_IDENTIFIER3);\n\t\t\t\telse if (exProps.InList(s2))\n\t\t\t\t\tsc.ChangeState(SCE_CSS_EXTENDED_IDENTIFIER);\n\t\t\t\telse\n\t\t\t\t\tsc.ChangeState(SCE_CSS_UNKNOWN_IDENTIFIER);\n\t\t\t\tbreak;\n\t\t\tcase SCE_CSS_PSEUDOCLASS:\n\t\t\tcase SCE_CSS_PSEUDOELEMENT:\n\t\t\tcase SCE_CSS_EXTENDED_PSEUDOCLASS:\n\t\t\tcase SCE_CSS_EXTENDED_PSEUDOELEMENT:\n\t\t\tcase SCE_CSS_UNKNOWN_PSEUDOCLASS:\n\t\t\t\tif (op == ':' && opPrev != ':' && pseudoClasses.InList(s2))\n\t\t\t\t\tsc.ChangeState(SCE_CSS_PSEUDOCLASS);\n\t\t\t\telse if (opPrev == ':' && pseudoElements.InList(s2))\n\t\t\t\t\tsc.ChangeState(SCE_CSS_PSEUDOELEMENT);\n\t\t\t\telse if ((op == ':' || (op == '(' && lastState == SCE_CSS_EXTENDED_PSEUDOCLASS)) && opPrev != ':' && exPseudoClasses.InList(s2))\n\t\t\t\t\tsc.ChangeState(SCE_CSS_EXTENDED_PSEUDOCLASS);\n\t\t\t\telse if (opPrev == ':' && exPseudoElements.InList(s2))\n\t\t\t\t\tsc.ChangeState(SCE_CSS_EXTENDED_PSEUDOELEMENT);\n\t\t\t\telse\n\t\t\t\t\tsc.ChangeState(SCE_CSS_UNKNOWN_PSEUDOCLASS);\n\t\t\t\tbreak;\n\t\t\tcase SCE_CSS_IMPORTANT:\n\t\t\t\tif (strcmp(s2, \"important\") != 0)\n\t\t\t\t\tsc.ChangeState(SCE_CSS_VALUE);\n\t\t\t\tbreak;\n\t\t\tcase SCE_CSS_DIRECTIVE:\n\t\t\t\tif (op == '@' && strcmp(s2, \"media\") == 0)\n\t\t\t\t\tsc.ChangeState(SCE_CSS_MEDIA);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (sc.ch != '.' && sc.ch != ':' && sc.ch != '#' && (\n\t\t\tsc.state == SCE_CSS_CLASS || sc.state == SCE_CSS_ID ||\n\t\t\t(sc.ch != '(' && sc.ch != ')' && ( /* This line of the condition makes it possible to extend pseudo-classes with parentheses */\n\t\t\t\tsc.state == SCE_CSS_PSEUDOCLASS || sc.state == SCE_CSS_PSEUDOELEMENT ||\n\t\t\t\tsc.state == SCE_CSS_EXTENDED_PSEUDOCLASS || sc.state == SCE_CSS_EXTENDED_PSEUDOELEMENT ||\n\t\t\t\tsc.state == SCE_CSS_UNKNOWN_PSEUDOCLASS\n\t\t\t))\n\t\t))\n\t\t\tsc.SetState(SCE_CSS_TAG);\n\n\t\tif (sc.Match('/', '*')) {\n\t\t\tlastStateC = sc.state;\n\t\t\tcomment_mode = eCommentBlock;\n\t\t\tsc.SetState(SCE_CSS_COMMENT);\n\t\t\tsc.Forward();\n\t\t} else if (hasSingleLineComments && sc.Match('/', '/') && !insideParentheses) {\n\t\t\t// note that we've had to treat ([...]// as the start of a URL not a comment, e.g. url(http://example.com), url(//example.com)\n\t\t\tlastStateC = sc.state;\n\t\t\tcomment_mode = eCommentLine;\n\t\t\tsc.SetState(SCE_CSS_COMMENT);\n\t\t\tsc.Forward();\n\t\t} else if ((sc.state == SCE_CSS_VALUE || sc.state == SCE_CSS_ATTRIBUTE)\n\t\t\t&& (sc.ch == '\\\"' || sc.ch == '\\'')) {\n\t\t\tlastStateS = sc.state;\n\t\t\tsc.SetState((sc.ch == '\\\"' ? SCE_CSS_DOUBLESTRING : SCE_CSS_SINGLESTRING));\n\t\t} else if (IsCssOperator(sc.ch)\n\t\t\t&& (sc.state != SCE_CSS_ATTRIBUTE || sc.ch == ']')\n\t\t\t&& (sc.state != SCE_CSS_VALUE || sc.ch == ';' || sc.ch == '}' || sc.ch == '!')\n\t\t\t&& ((sc.state != SCE_CSS_DIRECTIVE && sc.state != SCE_CSS_MEDIA) || sc.ch == ';' || sc.ch == '{')\n\t\t) {\n\t\t\tif (sc.state != SCE_CSS_OPERATOR)\n\t\t\t\tlastState = sc.state;\n\t\t\tsc.SetState(SCE_CSS_OPERATOR);\n\t\t\top = sc.ch;\n\t\t\topPrev = sc.chPrev;\n\t\t}\n\t}\n\n\tsc.Complete();\n}\n\nstatic void FoldCSSDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tbool inComment = (styler.StyleAt(startPos-1) == SCE_CSS_COMMENT);\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styler.StyleAt(i);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (foldComment) {\n\t\t\tif (!inComment && (style == SCE_CSS_COMMENT))\n\t\t\t\tlevelCurrent++;\n\t\t\telse if (inComment && (style != SCE_CSS_COMMENT))\n\t\t\t\tlevelCurrent--;\n\t\t\tinComment = (style == SCE_CSS_COMMENT);\n\t\t}\n\t\tif (style == SCE_CSS_OPERATOR) {\n\t\t\tif (ch == '{') {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (ch == '}') {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nstatic const char * const cssWordListDesc[] = {\n\t\"CSS1 Properties\",\n\t\"Pseudo-classes\",\n\t\"CSS2 Properties\",\n\t\"CSS3 Properties\",\n\t\"Pseudo-elements\",\n\t\"Browser-Specific CSS Properties\",\n\t\"Browser-Specific Pseudo-classes\",\n\t\"Browser-Specific Pseudo-elements\",\n\t0\n};\n\nLexerModule lmCss(SCLEX_CSS, ColouriseCssDoc, \"css\", FoldCSSDoc, cssWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexCaml.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexCaml.cxx\n ** Lexer for Objective Caml.\n **/\n// Copyright 2005-2009 by Robert Roessler <robertr@rftp.com>\n// The License.txt file describes the conditions under which this software may be distributed.\n/*\tRelease History\n\t20050204 Initial release.\n\t20050205 Quick compiler standards/\"cleanliness\" adjustment.\n\t20050206 Added cast for IsLeadByte().\n\t20050209 Changes to \"external\" build support.\n\t20050306 Fix for 1st-char-in-doc \"corner\" case.\n\t20050502 Fix for [harmless] one-past-the-end coloring.\n\t20050515 Refined numeric token recognition logic.\n\t20051125 Added 2nd \"optional\" keywords class.\n\t20051129 Support \"magic\" (read-only) comments for RCaml.\n\t20051204 Swtich to using StyleContext infrastructure.\n\t20090629 Add full Standard ML '97 support.\n*/\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"PropSetSimple.h\"\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n//\tSince the Microsoft __iscsym[f] funcs are not ANSI...\ninline int  iscaml(int c) {return isalnum(c) || c == '_';}\ninline int iscamlf(int c) {return isalpha(c) || c == '_';}\n\nstatic const int baseT[24] = {\n\t0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\t/* A - L */\n\t0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0,16\t/* M - X */\n};\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n#ifdef BUILD_AS_EXTERNAL_LEXER\n/*\n\t(actually seems to work!)\n*/\n#include <string>\n#include \"WindowAccessor.h\"\n#include \"ExternalLexer.h\"\n\n#undef EXT_LEXER_DECL\n#define EXT_LEXER_DECL __declspec( dllexport ) __stdcall\n\n#if PLAT_WIN\n#include <windows.h>\n#endif\n\nstatic void ColouriseCamlDoc(\n\tunsigned int startPos, int length,\n\tint initStyle,\n\tWordList *keywordlists[],\n\tAccessor &styler);\n\nstatic void FoldCamlDoc(\n\tunsigned int startPos, int length,\n\tint initStyle,\n\tWordList *keywordlists[],\n\tAccessor &styler);\n\nstatic void InternalLexOrFold(int lexOrFold, unsigned int startPos, int length,\n\tint initStyle, char *words[], WindowID window, char *props);\n\nstatic const char* LexerName = \"caml\";\n\n#ifdef TRACE\nvoid Platform::DebugPrintf(const char *format, ...) {\n\tchar buffer[2000];\n\tva_list pArguments;\n\tva_start(pArguments, format);\n\tvsprintf(buffer,format,pArguments);\n\tva_end(pArguments);\n\tPlatform::DebugDisplay(buffer);\n}\n#else\nvoid Platform::DebugPrintf(const char *, ...) {\n}\n#endif\n\nbool Platform::IsDBCSLeadByte(int codePage, char ch) {\n\treturn ::IsDBCSLeadByteEx(codePage, ch) != 0;\n}\n\nlong Platform::SendScintilla(WindowID w, unsigned int msg, unsigned long wParam, long lParam) {\n\treturn ::SendMessage(reinterpret_cast<HWND>(w), msg, wParam, lParam);\n}\n\nlong Platform::SendScintillaPointer(WindowID w, unsigned int msg, unsigned long wParam, void *lParam) {\n\treturn ::SendMessage(reinterpret_cast<HWND>(w), msg, wParam,\n\t\treinterpret_cast<LPARAM>(lParam));\n}\n\nvoid EXT_LEXER_DECL Fold(unsigned int lexer, unsigned int startPos, int length,\n\tint initStyle, char *words[], WindowID window, char *props)\n{\n\t// below useless evaluation(s) to supress \"not used\" warnings\n\tlexer;\n\t// build expected data structures and do the Fold\n\tInternalLexOrFold(1, startPos, length, initStyle, words, window, props);\n\n}\n\nint EXT_LEXER_DECL GetLexerCount()\n{\n\treturn 1;\t// just us [Objective] Caml lexers here!\n}\n\nvoid EXT_LEXER_DECL GetLexerName(unsigned int Index, char *name, int buflength)\n{\n\t// below useless evaluation(s) to supress \"not used\" warnings\n\tIndex;\n\t// return as much of our lexer name as will fit (what's up with Index?)\n\tif (buflength > 0) {\n\t\tbuflength--;\n\t\tint n = strlen(LexerName);\n\t\tif (n > buflength)\n\t\t\tn = buflength;\n\t\tmemcpy(name, LexerName, n), name[n] = '\\0';\n\t}\n}\n\nvoid EXT_LEXER_DECL Lex(unsigned int lexer, unsigned int startPos, int length,\n\tint initStyle, char *words[], WindowID window, char *props)\n{\n\t// below useless evaluation(s) to supress \"not used\" warnings\n\tlexer;\n\t// build expected data structures and do the Lex\n\tInternalLexOrFold(0, startPos, length, initStyle, words, window, props);\n}\n\nstatic void InternalLexOrFold(int foldOrLex, unsigned int startPos, int length,\n\tint initStyle, char *words[], WindowID window, char *props)\n{\n\t// create and initialize a WindowAccessor (including contained PropSet)\n\tPropSetSimple ps;\n\tps.SetMultiple(props);\n\tWindowAccessor wa(window, ps);\n\t// create and initialize WordList(s)\n\tint nWL = 0;\n\tfor (; words[nWL]; nWL++) ;\t// count # of WordList PTRs needed\n\tWordList** wl = new WordList* [nWL + 1];// alloc WordList PTRs\n\tint i = 0;\n\tfor (; i < nWL; i++) {\n\t\twl[i] = new WordList();\t// (works or THROWS bad_alloc EXCEPTION)\n\t\twl[i]->Set(words[i]);\n\t}\n\twl[i] = 0;\n\t// call our \"internal\" folder/lexer (... then do Flush!)\n\tif (foldOrLex)\n\t\tFoldCamlDoc(startPos, length, initStyle, wl, wa);\n\telse\n\t\tColouriseCamlDoc(startPos, length, initStyle, wl, wa);\n\twa.Flush();\n\t// clean up before leaving\n\tfor (i = nWL - 1; i >= 0; i--)\n\t\tdelete wl[i];\n\tdelete [] wl;\n}\n\nstatic\n#endif\t/* BUILD_AS_EXTERNAL_LEXER */\n\nvoid ColouriseCamlDoc(\n\tunsigned int startPos, int length,\n\tint initStyle,\n\tWordList *keywordlists[],\n\tAccessor &styler)\n{\n\t// initialize styler\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tint chBase = 0, chToken = 0, chLit = 0;\n\tWordList& keywords  = *keywordlists[0];\n\tWordList& keywords2 = *keywordlists[1];\n\tWordList& keywords3 = *keywordlists[2];\n\tconst bool isSML = keywords.InList(\"andalso\");\n\tconst int useMagic = styler.GetPropertyInt(\"lexer.caml.magic\", 0);\n\n\t// set up [initial] state info (terminating states that shouldn't \"bleed\")\n\tconst int state_ = sc.state & 0x0f;\n\tif (state_ <= SCE_CAML_CHAR\n\t\t|| (isSML && state_ == SCE_CAML_STRING))\n\t\tsc.state = SCE_CAML_DEFAULT;\n\tint nesting = (state_ >= SCE_CAML_COMMENT)? (state_ - SCE_CAML_COMMENT): 0;\n\n\t// foreach char in range...\n\twhile (sc.More()) {\n\t\t// set up [per-char] state info\n\t\tint state2 = -1;\t\t\t\t// (ASSUME no state change)\n\t\tint chColor = sc.currentPos - 1;// (ASSUME standard coloring range)\n\t\tbool advance = true;\t\t\t// (ASSUME scanner \"eats\" 1 char)\n\n\t\t// step state machine\n\t\tswitch (sc.state & 0x0f) {\n\t\tcase SCE_CAML_DEFAULT:\n\t\t\tchToken = sc.currentPos;\t// save [possible] token start (JIC)\n\t\t\t// it's wide open; what do we have?\n\t\t\tif (iscamlf(sc.ch))\n\t\t\t\tstate2 = SCE_CAML_IDENTIFIER;\n\t\t\telse if (!isSML && sc.Match('`') && iscamlf(sc.chNext))\n\t\t\t\tstate2 = SCE_CAML_TAGNAME;\n\t\t\telse if (!isSML && sc.Match('#') && isdigit(sc.chNext))\n\t\t\t\tstate2 = SCE_CAML_LINENUM;\n\t\t\telse if (isdigit(sc.ch)) {\n\t\t\t\t// it's a number, assume base 10\n\t\t\t\tstate2 = SCE_CAML_NUMBER, chBase = 10;\n\t\t\t\tif (sc.Match('0')) {\n\t\t\t\t\t// there MAY be a base specified...\n\t\t\t\t\tconst char* baseC = \"bBoOxX\";\n\t\t\t\t\tif (isSML) {\n\t\t\t\t\t\tif (sc.chNext == 'w')\n\t\t\t\t\t\t\tsc.Forward();\t// (consume SML \"word\" indicator)\n\t\t\t\t\t\tbaseC = \"x\";\n\t\t\t\t\t}\n\t\t\t\t\t// ... change to specified base AS REQUIRED\n\t\t\t\t\tif (strchr(baseC, sc.chNext))\n\t\t\t\t\t\tchBase = baseT[tolower(sc.chNext) - 'a'], sc.Forward();\n\t\t\t\t}\n\t\t\t} else if (!isSML && sc.Match('\\''))\t// (Caml char literal?)\n\t\t\t\tstate2 = SCE_CAML_CHAR, chLit = 0;\n\t\t\telse if (isSML && sc.Match('#', '\"'))\t// (SML char literal?)\n\t\t\t\tstate2 = SCE_CAML_CHAR, sc.Forward();\n\t\t\telse if (sc.Match('\"'))\n\t\t\t\tstate2 = SCE_CAML_STRING;\n\t\t\telse if (sc.Match('(', '*'))\n\t\t\t\tstate2 = SCE_CAML_COMMENT, sc.Forward(), sc.ch = ' '; // (*)...\n\t\t\telse if (strchr(\"!?~\"\t\t\t/* Caml \"prefix-symbol\" */\n\t\t\t\t\t\"=<>@^|&+-*/$%\"\t\t\t/* Caml \"infix-symbol\" */\n\t\t\t\t\t\"()[]{};,:.#\", sc.ch)\t// Caml \"bracket\" or ;,:.#\n\t\t\t\t\t\t\t\t\t\t\t// SML \"extra\" ident chars\n\t\t\t\t|| (isSML && (sc.Match('\\\\') || sc.Match('`'))))\n\t\t\t\tstate2 = SCE_CAML_OPERATOR;\n\t\t\tbreak;\n\n\t\tcase SCE_CAML_IDENTIFIER:\n\t\t\t// [try to] interpret as [additional] identifier char\n\t\t\tif (!(iscaml(sc.ch) || sc.Match('\\''))) {\n\t\t\t\tconst int n = sc.currentPos - chToken;\n\t\t\t\tif (n < 24) {\n\t\t\t\t\t// length is believable as keyword, [re-]construct token\n\t\t\t\t\tchar t[24];\n\t\t\t\t\tfor (int i = -n; i < 0; i++)\n\t\t\t\t\t\tt[n + i] = static_cast<char>(sc.GetRelative(i));\n\t\t\t\t\tt[n] = '\\0';\n\t\t\t\t\t// special-case \"_\" token as KEYWORD\n\t\t\t\t\tif ((n == 1 && sc.chPrev == '_') || keywords.InList(t))\n\t\t\t\t\t\tsc.ChangeState(SCE_CAML_KEYWORD);\n\t\t\t\t\telse if (keywords2.InList(t))\n\t\t\t\t\t\tsc.ChangeState(SCE_CAML_KEYWORD2);\n\t\t\t\t\telse if (keywords3.InList(t))\n\t\t\t\t\t\tsc.ChangeState(SCE_CAML_KEYWORD3);\n\t\t\t\t}\n\t\t\t\tstate2 = SCE_CAML_DEFAULT, advance = false;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase SCE_CAML_TAGNAME:\n\t\t\t// [try to] interpret as [additional] tagname char\n\t\t\tif (!(iscaml(sc.ch) || sc.Match('\\'')))\n\t\t\t\tstate2 = SCE_CAML_DEFAULT, advance = false;\n\t\t\tbreak;\n\n\t\t/*case SCE_CAML_KEYWORD:\n\t\tcase SCE_CAML_KEYWORD2:\n\t\tcase SCE_CAML_KEYWORD3:\n\t\t\t// [try to] interpret as [additional] keyword char\n\t\t\tif (!iscaml(ch))\n\t\t\t\tstate2 = SCE_CAML_DEFAULT, advance = false;\n\t\t\tbreak;*/\n\n\t\tcase SCE_CAML_LINENUM:\n\t\t\t// [try to] interpret as [additional] linenum directive char\n\t\t\tif (!isdigit(sc.ch))\n\t\t\t\tstate2 = SCE_CAML_DEFAULT, advance = false;\n\t\t\tbreak;\n\n\t\tcase SCE_CAML_OPERATOR: {\n\t\t\t// [try to] interpret as [additional] operator char\n\t\t\tconst char* o = 0;\n\t\t\tif (iscaml(sc.ch) || isspace(sc.ch)\t\t\t// ident or whitespace\n\t\t\t\t|| (o = strchr(\")]};,\\'\\\"#\", sc.ch),o)\t// \"termination\" chars\n\t\t\t\t|| (!isSML && sc.Match('`'))\t\t\t// Caml extra term char\n\t\t\t\t|| (!strchr(\"!$%&*+-./:<=>?@^|~\", sc.ch)// \"operator\" chars\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// SML extra ident chars\n\t\t\t\t\t&& !(isSML && (sc.Match('\\\\') || sc.Match('`'))))) {\n\t\t\t\t// check for INCLUSIVE termination\n\t\t\t\tif (o && strchr(\")]};,\", sc.ch)) {\n\t\t\t\t\tif ((sc.Match(')') && sc.chPrev == '(')\n\t\t\t\t\t\t|| (sc.Match(']') && sc.chPrev == '['))\n\t\t\t\t\t\t// special-case \"()\" and \"[]\" tokens as KEYWORDS\n\t\t\t\t\t\tsc.ChangeState(SCE_CAML_KEYWORD);\n\t\t\t\t\tchColor++;\n\t\t\t\t} else\n\t\t\t\t\tadvance = false;\n\t\t\t\tstate2 = SCE_CAML_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase SCE_CAML_NUMBER:\n\t\t\t// [try to] interpret as [additional] numeric literal char\n\t\t\tif ((!isSML && sc.Match('_')) || IsADigit(sc.ch, chBase))\n\t\t\t\tbreak;\n\t\t\t// how about an integer suffix?\n\t\t\tif (!isSML && (sc.Match('l') || sc.Match('L') || sc.Match('n'))\n\t\t\t\t&& (sc.chPrev == '_' || IsADigit(sc.chPrev, chBase)))\n\t\t\t\tbreak;\n\t\t\t// or a floating-point literal?\n\t\t\tif (chBase == 10) {\n\t\t\t\t// with a decimal point?\n\t\t\t\tif (sc.Match('.')\n\t\t\t\t\t&& ((!isSML && sc.chPrev == '_')\n\t\t\t\t\t\t|| IsADigit(sc.chPrev, chBase)))\n\t\t\t\t\tbreak;\n\t\t\t\t// with an exponent? (I)\n\t\t\t\tif ((sc.Match('e') || sc.Match('E'))\n\t\t\t\t\t&& ((!isSML && (sc.chPrev == '.' || sc.chPrev == '_'))\n\t\t\t\t\t\t|| IsADigit(sc.chPrev, chBase)))\n\t\t\t\t\tbreak;\n\t\t\t\t// with an exponent? (II)\n\t\t\t\tif (((!isSML && (sc.Match('+') || sc.Match('-')))\n\t\t\t\t\t\t|| (isSML && sc.Match('~')))\n\t\t\t\t\t&& (sc.chPrev == 'e' || sc.chPrev == 'E'))\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// it looks like we have run out of number\n\t\t\tstate2 = SCE_CAML_DEFAULT, advance = false;\n\t\t\tbreak;\n\n\t\tcase SCE_CAML_CHAR:\n\t\t\tif (!isSML) {\n\t\t\t\t// [try to] interpret as [additional] char literal char\n\t\t\t\tif (sc.Match('\\\\')) {\n\t\t\t\t\tchLit = 1;\t// (definitely IS a char literal)\n\t\t\t\t\tif (sc.chPrev == '\\\\')\n\t\t\t\t\t\tsc.ch = ' ';\t// (...\\\\')\n\t\t\t\t// should we be terminating - one way or another?\n\t\t\t\t} else if ((sc.Match('\\'') && sc.chPrev != '\\\\')\n\t\t\t\t\t|| sc.atLineEnd) {\n\t\t\t\t\tstate2 = SCE_CAML_DEFAULT;\n\t\t\t\t\tif (sc.Match('\\''))\n\t\t\t\t\t\tchColor++;\n\t\t\t\t\telse\n\t\t\t\t\t\tsc.ChangeState(SCE_CAML_IDENTIFIER);\n\t\t\t\t// ... maybe a char literal, maybe not\n\t\t\t\t} else if (chLit < 1 && sc.currentPos - chToken >= 2)\n\t\t\t\t\tsc.ChangeState(SCE_CAML_IDENTIFIER), advance = false;\n\t\t\t\tbreak;\n\t\t\t}/* else\n\t\t\t\t// fall through for SML char literal (handle like string) */\n\n\t\tcase SCE_CAML_STRING:\n\t\t\t// [try to] interpret as [additional] [SML char/] string literal char\n\t\t\tif (isSML && sc.Match('\\\\') && sc.chPrev != '\\\\' && isspace(sc.chNext))\n\t\t\t\tstate2 = SCE_CAML_WHITE;\n\t\t\telse if (sc.Match('\\\\') && sc.chPrev == '\\\\')\n\t\t\t\tsc.ch = ' ';\t// (...\\\\\")\n\t\t\t// should we be terminating - one way or another?\n\t\t\telse if ((sc.Match('\"') && sc.chPrev != '\\\\')\n\t\t\t\t|| (isSML && sc.atLineEnd)) {\n\t\t\t\tstate2 = SCE_CAML_DEFAULT;\n\t\t\t\tif (sc.Match('\"'))\n\t\t\t\t\tchColor++;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase SCE_CAML_WHITE:\n\t\t\t// [try to] interpret as [additional] SML embedded whitespace char\n\t\t\tif (sc.Match('\\\\')) {\n\t\t\t\t// style this puppy NOW...\n\t\t\t\tstate2 = SCE_CAML_STRING, sc.ch = ' ' /* (...\\\") */, chColor++,\n\t\t\t\t\tstyler.ColourTo(chColor, SCE_CAML_WHITE), styler.Flush();\n\t\t\t\t// ... then backtrack to determine original SML literal type\n\t\t\t\tint p = chColor - 2;\n\t\t\t\tfor (; p >= 0 && styler.StyleAt(p) == SCE_CAML_WHITE; p--) ;\n\t\t\t\tif (p >= 0)\n\t\t\t\t\tstate2 = static_cast<int>(styler.StyleAt(p));\n\t\t\t\t// take care of state change NOW\n\t\t\t\tsc.ChangeState(state2), state2 = -1;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase SCE_CAML_COMMENT:\n\t\tcase SCE_CAML_COMMENT1:\n\t\tcase SCE_CAML_COMMENT2:\n\t\tcase SCE_CAML_COMMENT3:\n\t\t\t// we're IN a comment - does this start a NESTED comment?\n\t\t\tif (sc.Match('(', '*'))\n\t\t\t\tstate2 = sc.state + 1, chToken = sc.currentPos,\n\t\t\t\t\tsc.Forward(), sc.ch = ' ' /* (*)... */, nesting++;\n\t\t\t// [try to] interpret as [additional] comment char\n\t\t\telse if (sc.Match(')') && sc.chPrev == '*') {\n\t\t\t\tif (nesting)\n\t\t\t\t\tstate2 = (sc.state & 0x0f) - 1, chToken = 0, nesting--;\n\t\t\t\telse\n\t\t\t\t\tstate2 = SCE_CAML_DEFAULT;\n\t\t\t\tchColor++;\n\t\t\t// enable \"magic\" (read-only) comment AS REQUIRED\n\t\t\t} else if (useMagic && sc.currentPos - chToken == 4\n\t\t\t\t&& sc.Match('c') && sc.chPrev == 'r' && sc.GetRelative(-2) == '@')\n\t\t\t\tsc.state |= 0x10;\t// (switch to read-only comment style)\n\t\t\tbreak;\n\t\t}\n\n\t\t// handle state change and char coloring AS REQUIRED\n\t\tif (state2 >= 0)\n\t\t\tstyler.ColourTo(chColor, sc.state), sc.ChangeState(state2);\n\t\t// move to next char UNLESS re-scanning current char\n\t\tif (advance)\n\t\t\tsc.Forward();\n\t}\n\n\t// do any required terminal char coloring (JIC)\n\tsc.Complete();\n}\n\n#ifdef BUILD_AS_EXTERNAL_LEXER\nstatic\n#endif\t/* BUILD_AS_EXTERNAL_LEXER */\nvoid FoldCamlDoc(\n\tunsigned int, int,\n\tint,\n\tWordList *[],\n\tAccessor &)\n{\n}\n\nstatic const char * const camlWordListDesc[] = {\n\t\"Keywords\",\t\t// primary Objective Caml keywords\n\t\"Keywords2\",\t// \"optional\" keywords (typically from Pervasives)\n\t\"Keywords3\",\t// \"optional\" keywords (typically typenames)\n\t0\n};\n\n#ifndef BUILD_AS_EXTERNAL_LEXER\nLexerModule lmCaml(SCLEX_CAML, ColouriseCamlDoc, \"caml\", FoldCamlDoc, camlWordListDesc);\n#endif\t/* BUILD_AS_EXTERNAL_LEXER */\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexCmake.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexCmake.cxx\n ** Lexer for Cmake\n **/\n// Copyright 2007 by Cristian Adam <cristian [dot] adam [at] gmx [dot] net>\n// based on the NSIS lexer\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic bool isCmakeNumber(char ch)\n{\n    return(ch >= '0' && ch <= '9');\n}\n\nstatic bool isCmakeChar(char ch)\n{\n    return(ch == '.' ) || (ch == '_' ) || isCmakeNumber(ch) || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');\n}\n\nstatic bool isCmakeLetter(char ch)\n{\n    return(ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');\n}\n\nstatic bool CmakeNextLineHasElse(unsigned int start, unsigned int end, Accessor &styler)\n{\n    int nNextLine = -1;\n    for ( unsigned int i = start; i < end; i++ ) {\n        char cNext = styler.SafeGetCharAt( i );\n        if ( cNext == '\\n' ) {\n            nNextLine = i+1;\n            break;\n        }\n    }\n\n    if ( nNextLine == -1 ) // We never foudn the next line...\n        return false;\n\n    for ( unsigned int firstChar = nNextLine; firstChar < end; firstChar++ ) {\n        char cNext = styler.SafeGetCharAt( firstChar );\n        if ( cNext == ' ' )\n            continue;\n        if ( cNext == '\\t' )\n            continue;\n        if ( styler.Match(firstChar, \"ELSE\")  || styler.Match(firstChar, \"else\"))\n            return true;\n        break;\n    }\n\n    return false;\n}\n\nstatic int calculateFoldCmake(unsigned int start, unsigned int end, int foldlevel, Accessor &styler, bool bElse)\n{\n    // If the word is too long, it is not what we are looking for\n    if ( end - start > 20 )\n        return foldlevel;\n\n    int newFoldlevel = foldlevel;\n\n    char s[20]; // The key word we are looking for has atmost 13 characters\n    for (unsigned int i = 0; i < end - start + 1 && i < 19; i++) {\n        s[i] = static_cast<char>( styler[ start + i ] );\n        s[i + 1] = '\\0';\n    }\n\n    if ( CompareCaseInsensitive(s, \"IF\") == 0 || CompareCaseInsensitive(s, \"WHILE\") == 0\n         || CompareCaseInsensitive(s, \"MACRO\") == 0 || CompareCaseInsensitive(s, \"FOREACH\") == 0\n         || CompareCaseInsensitive(s, \"ELSEIF\") == 0 )\n        newFoldlevel++;\n    else if ( CompareCaseInsensitive(s, \"ENDIF\") == 0 || CompareCaseInsensitive(s, \"ENDWHILE\") == 0\n              || CompareCaseInsensitive(s, \"ENDMACRO\") == 0 || CompareCaseInsensitive(s, \"ENDFOREACH\") == 0)\n        newFoldlevel--;\n    else if ( bElse && CompareCaseInsensitive(s, \"ELSEIF\") == 0 )\n        newFoldlevel++;\n    else if ( bElse && CompareCaseInsensitive(s, \"ELSE\") == 0 )\n        newFoldlevel++;\n\n    return newFoldlevel;\n}\n\nstatic int classifyWordCmake(unsigned int start, unsigned int end, WordList *keywordLists[], Accessor &styler )\n{\n    char word[100] = {0};\n    char lowercaseWord[100] = {0};\n\n    WordList &Commands = *keywordLists[0];\n    WordList &Parameters = *keywordLists[1];\n    WordList &UserDefined = *keywordLists[2];\n\n    for (unsigned int i = 0; i < end - start + 1 && i < 99; i++) {\n        word[i] = static_cast<char>( styler[ start + i ] );\n        lowercaseWord[i] = static_cast<char>(tolower(word[i]));\n    }\n\n    // Check for special words...\n    if ( CompareCaseInsensitive(word, \"MACRO\") == 0 || CompareCaseInsensitive(word, \"ENDMACRO\") == 0 )\n        return SCE_CMAKE_MACRODEF;\n\n    if ( CompareCaseInsensitive(word, \"IF\") == 0 ||  CompareCaseInsensitive(word, \"ENDIF\") == 0 )\n        return SCE_CMAKE_IFDEFINEDEF;\n\n    if ( CompareCaseInsensitive(word, \"ELSEIF\") == 0  || CompareCaseInsensitive(word, \"ELSE\") == 0 )\n        return SCE_CMAKE_IFDEFINEDEF;\n\n    if ( CompareCaseInsensitive(word, \"WHILE\") == 0 || CompareCaseInsensitive(word, \"ENDWHILE\") == 0)\n        return SCE_CMAKE_WHILEDEF;\n\n    if ( CompareCaseInsensitive(word, \"FOREACH\") == 0 || CompareCaseInsensitive(word, \"ENDFOREACH\") == 0)\n        return SCE_CMAKE_FOREACHDEF;\n\n    if ( Commands.InList(lowercaseWord) )\n        return SCE_CMAKE_COMMANDS;\n\n    if ( Parameters.InList(word) )\n        return SCE_CMAKE_PARAMETERS;\n\n\n    if ( UserDefined.InList(word) )\n        return SCE_CMAKE_USERDEFINED;\n\n    if ( strlen(word) > 3 ) {\n        if ( word[1] == '{' && word[strlen(word)-1] == '}' )\n            return SCE_CMAKE_VARIABLE;\n    }\n\n    // To check for numbers\n    if ( isCmakeNumber( word[0] ) ) {\n        bool bHasSimpleCmakeNumber = true;\n        for (unsigned int j = 1; j < end - start + 1 && j < 99; j++) {\n            if ( !isCmakeNumber( word[j] ) ) {\n                bHasSimpleCmakeNumber = false;\n                break;\n            }\n        }\n\n        if ( bHasSimpleCmakeNumber )\n            return SCE_CMAKE_NUMBER;\n    }\n\n    return SCE_CMAKE_DEFAULT;\n}\n\nstatic void ColouriseCmakeDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler)\n{\n    int state = SCE_CMAKE_DEFAULT;\n    if ( startPos > 0 )\n        state = styler.StyleAt(startPos-1); // Use the style from the previous line, usually default, but could be commentbox\n\n    styler.StartAt( startPos );\n    styler.GetLine( startPos );\n\n    unsigned int nLengthDoc = startPos + length;\n    styler.StartSegment( startPos );\n\n    char cCurrChar;\n    bool bVarInString = false;\n    bool bClassicVarInString = false;\n\n    unsigned int i;\n    for ( i = startPos; i < nLengthDoc; i++ ) {\n        cCurrChar = styler.SafeGetCharAt( i );\n        char cNextChar = styler.SafeGetCharAt(i+1);\n\n        switch (state) {\n        case SCE_CMAKE_DEFAULT:\n            if ( cCurrChar == '#' ) { // we have a comment line\n                styler.ColourTo(i-1, state );\n                state = SCE_CMAKE_COMMENT;\n                break;\n            }\n            if ( cCurrChar == '\"' ) {\n                styler.ColourTo(i-1, state );\n                state = SCE_CMAKE_STRINGDQ;\n                bVarInString = false;\n                bClassicVarInString = false;\n                break;\n            }\n            if ( cCurrChar == '\\'' ) {\n                styler.ColourTo(i-1, state );\n                state = SCE_CMAKE_STRINGRQ;\n                bVarInString = false;\n                bClassicVarInString = false;\n                break;\n            }\n            if ( cCurrChar == '`' ) {\n                styler.ColourTo(i-1, state );\n                state = SCE_CMAKE_STRINGLQ;\n                bVarInString = false;\n                bClassicVarInString = false;\n                break;\n            }\n\n            // CMake Variable\n            if ( cCurrChar == '$' || isCmakeChar(cCurrChar)) {\n                styler.ColourTo(i-1,state);\n                state = SCE_CMAKE_VARIABLE;\n\n                // If it is a number, we must check and set style here first...\n                if ( isCmakeNumber(cCurrChar) && (cNextChar == '\\t' || cNextChar == ' ' || cNextChar == '\\r' || cNextChar == '\\n' ) )\n                    styler.ColourTo( i, SCE_CMAKE_NUMBER);\n\n                break;\n            }\n\n            break;\n        case SCE_CMAKE_COMMENT:\n            if ( cNextChar == '\\n' || cNextChar == '\\r' ) {\n                // Special case:\n                if ( cCurrChar == '\\\\' ) {\n                    styler.ColourTo(i-2,state);\n                    styler.ColourTo(i,SCE_CMAKE_DEFAULT);\n                }\n                else {\n                    styler.ColourTo(i,state);\n                    state = SCE_CMAKE_DEFAULT;\n                }\n            }\n            break;\n        case SCE_CMAKE_STRINGDQ:\n        case SCE_CMAKE_STRINGLQ:\n        case SCE_CMAKE_STRINGRQ:\n\n            if ( styler.SafeGetCharAt(i-1) == '\\\\' && styler.SafeGetCharAt(i-2) == '$' )\n                break; // Ignore the next character, even if it is a quote of some sort\n\n            if ( cCurrChar == '\"' && state == SCE_CMAKE_STRINGDQ ) {\n                styler.ColourTo(i,state);\n                state = SCE_CMAKE_DEFAULT;\n                break;\n            }\n\n            if ( cCurrChar == '`' && state == SCE_CMAKE_STRINGLQ ) {\n                styler.ColourTo(i,state);\n                state = SCE_CMAKE_DEFAULT;\n                break;\n            }\n\n            if ( cCurrChar == '\\'' && state == SCE_CMAKE_STRINGRQ ) {\n                styler.ColourTo(i,state);\n                state = SCE_CMAKE_DEFAULT;\n                break;\n            }\n\n            if ( cNextChar == '\\r' || cNextChar == '\\n' ) {\n                int nCurLine = styler.GetLine(i+1);\n                int nBack = i;\n                // We need to check if the previous line has a \\ in it...\n                bool bNextLine = false;\n\n                while ( nBack > 0 ) {\n                    if ( styler.GetLine(nBack) != nCurLine )\n                        break;\n\n                    char cTemp = styler.SafeGetCharAt(nBack, 'a'); // Letter 'a' is safe here\n\n                    if ( cTemp == '\\\\' ) {\n                        bNextLine = true;\n                        break;\n                    }\n                    if ( cTemp != '\\r' && cTemp != '\\n' && cTemp != '\\t' && cTemp != ' ' )\n                        break;\n\n                    nBack--;\n                }\n\n                if ( bNextLine ) {\n                    styler.ColourTo(i+1,state);\n                }\n                if ( bNextLine == false ) {\n                    styler.ColourTo(i,state);\n                    state = SCE_CMAKE_DEFAULT;\n                }\n            }\n            break;\n\n        case SCE_CMAKE_VARIABLE:\n\n            // CMake Variable:\n            if ( cCurrChar == '$' )\n                state = SCE_CMAKE_DEFAULT;\n            else if ( cCurrChar == '\\\\' && (cNextChar == 'n' || cNextChar == 'r' || cNextChar == 't' ) )\n                state = SCE_CMAKE_DEFAULT;\n            else if ( (isCmakeChar(cCurrChar) && !isCmakeChar( cNextChar) && cNextChar != '}') || cCurrChar == '}' ) {\n                state = classifyWordCmake( styler.GetStartSegment(), i, keywordLists, styler );\n                styler.ColourTo( i, state);\n                state = SCE_CMAKE_DEFAULT;\n            }\n            else if ( !isCmakeChar( cCurrChar ) && cCurrChar != '{' && cCurrChar != '}' ) {\n                if ( classifyWordCmake( styler.GetStartSegment(), i-1, keywordLists, styler) == SCE_CMAKE_NUMBER )\n                    styler.ColourTo( i-1, SCE_CMAKE_NUMBER );\n\n                state = SCE_CMAKE_DEFAULT;\n\n                if ( cCurrChar == '\"' ) {\n                    state = SCE_CMAKE_STRINGDQ;\n                    bVarInString = false;\n                    bClassicVarInString = false;\n                }\n                else if ( cCurrChar == '`' ) {\n                    state = SCE_CMAKE_STRINGLQ;\n                    bVarInString = false;\n                    bClassicVarInString = false;\n                }\n                else if ( cCurrChar == '\\'' ) {\n                    state = SCE_CMAKE_STRINGRQ;\n                    bVarInString = false;\n                    bClassicVarInString = false;\n                }\n                else if ( cCurrChar == '#' ) {\n                    state = SCE_CMAKE_COMMENT;\n                }\n            }\n            break;\n        }\n\n        if ( state == SCE_CMAKE_COMMENT) {\n            styler.ColourTo(i,state);\n        }\n        else if ( state == SCE_CMAKE_STRINGDQ || state == SCE_CMAKE_STRINGLQ || state == SCE_CMAKE_STRINGRQ ) {\n            bool bIngoreNextDollarSign = false;\n\n            if ( bVarInString && cCurrChar == '$' ) {\n                bVarInString = false;\n                bIngoreNextDollarSign = true;\n            }\n            else if ( bVarInString && cCurrChar == '\\\\' && (cNextChar == 'n' || cNextChar == 'r' || cNextChar == 't' || cNextChar == '\"' || cNextChar == '`' || cNextChar == '\\'' ) ) {\n                styler.ColourTo( i+1, SCE_CMAKE_STRINGVAR);\n                bVarInString = false;\n                bIngoreNextDollarSign = false;\n            }\n\n            else if ( bVarInString && !isCmakeChar(cNextChar) ) {\n                int nWordState = classifyWordCmake( styler.GetStartSegment(), i, keywordLists, styler);\n                if ( nWordState == SCE_CMAKE_VARIABLE )\n                    styler.ColourTo( i, SCE_CMAKE_STRINGVAR);\n                bVarInString = false;\n            }\n            // Covers \"${TEST}...\"\n            else if ( bClassicVarInString && cNextChar == '}' ) {\n                styler.ColourTo( i+1, SCE_CMAKE_STRINGVAR);\n                bClassicVarInString = false;\n            }\n\n            // Start of var in string\n            if ( !bIngoreNextDollarSign && cCurrChar == '$' && cNextChar == '{' ) {\n                styler.ColourTo( i-1, state);\n                bClassicVarInString = true;\n                bVarInString = false;\n            }\n            else if ( !bIngoreNextDollarSign && cCurrChar == '$' ) {\n                styler.ColourTo( i-1, state);\n                bVarInString = true;\n                bClassicVarInString = false;\n            }\n        }\n    }\n\n    // Colourise remaining document\n    styler.ColourTo(nLengthDoc-1,state);\n}\n\nstatic void FoldCmakeDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)\n{\n    // No folding enabled, no reason to continue...\n    if ( styler.GetPropertyInt(\"fold\") == 0 )\n        return;\n\n    bool foldAtElse = styler.GetPropertyInt(\"fold.at.else\", 0) == 1;\n\n    int lineCurrent = styler.GetLine(startPos);\n    unsigned int safeStartPos = styler.LineStart( lineCurrent );\n\n    bool bArg1 = true;\n    int nWordStart = -1;\n\n    int levelCurrent = SC_FOLDLEVELBASE;\n    if (lineCurrent > 0)\n        levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n    int levelNext = levelCurrent;\n\n    for (unsigned int i = safeStartPos; i < startPos + length; i++) {\n        char chCurr = styler.SafeGetCharAt(i);\n\n        if ( bArg1 ) {\n            if ( nWordStart == -1 && (isCmakeLetter(chCurr)) ) {\n                nWordStart = i;\n            }\n            else if ( isCmakeLetter(chCurr) == false && nWordStart > -1 ) {\n                int newLevel = calculateFoldCmake( nWordStart, i-1, levelNext, styler, foldAtElse);\n\n                if ( newLevel == levelNext ) {\n                    if ( foldAtElse ) {\n                        if ( CmakeNextLineHasElse(i, startPos + length, styler) )\n                            levelNext--;\n                    }\n                }\n                else\n                    levelNext = newLevel;\n                bArg1 = false;\n            }\n        }\n\n        if ( chCurr == '\\n' ) {\n            if ( bArg1 && foldAtElse) {\n                if ( CmakeNextLineHasElse(i, startPos + length, styler) )\n                    levelNext--;\n            }\n\n            // If we are on a new line...\n            int levelUse = levelCurrent;\n            int lev = levelUse | levelNext << 16;\n            if (levelUse < levelNext )\n                lev |= SC_FOLDLEVELHEADERFLAG;\n            if (lev != styler.LevelAt(lineCurrent))\n                styler.SetLevel(lineCurrent, lev);\n\n            lineCurrent++;\n            levelCurrent = levelNext;\n            bArg1 = true; // New line, lets look at first argument again\n            nWordStart = -1;\n        }\n    }\n\n    int levelUse = levelCurrent;\n    int lev = levelUse | levelNext << 16;\n    if (levelUse < levelNext)\n        lev |= SC_FOLDLEVELHEADERFLAG;\n    if (lev != styler.LevelAt(lineCurrent))\n        styler.SetLevel(lineCurrent, lev);\n}\n\nstatic const char * const cmakeWordLists[] = {\n    \"Commands\",\n    \"Parameters\",\n    \"UserDefined\",\n    0,\n    0,};\n\nLexerModule lmCmake(SCLEX_CMAKE, ColouriseCmakeDoc, \"cmake\", FoldCmakeDoc, cmakeWordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexCoffeeScript.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexCoffeeScript.cxx\n ** Lexer for CoffeeScript.\n **/\n// Copyright 1998-2011 by Neil Hodgson <neilh@scintilla.org>\n// Based on the Scintilla C++ Lexer\n// Written by Eric Promislow <ericp@activestate.com> in 2011 for the Komodo IDE\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"Platform.h\"\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic bool IsSpaceEquiv(int state) {\n\treturn (state <= SCE_COFFEESCRIPT_COMMENTDOC\n\t    // including SCE_COFFEESCRIPT_DEFAULT, SCE_COFFEESCRIPT_COMMENT, SCE_COFFEESCRIPT_COMMENTLINE\n\t    || state == SCE_COFFEESCRIPT_COMMENTLINEDOC\n\t    || state == SCE_COFFEESCRIPT_COMMENTDOCKEYWORD\n\t    || state == SCE_COFFEESCRIPT_COMMENTDOCKEYWORDERROR\n\t    || state == SCE_COFFEESCRIPT_COMMENTBLOCK\n\t    || state == SCE_COFFEESCRIPT_VERBOSE_REGEX\n\t    || state == SCE_COFFEESCRIPT_VERBOSE_REGEX_COMMENT\n\t    || state == SCE_COFFEESCRIPT_WORD\n\t    || state == SCE_COFFEESCRIPT_REGEX);\n}\n\n// Preconditions: sc.currentPos points to a character after '+' or '-'.\n// The test for pos reaching 0 should be redundant,\n// and is in only for safety measures.\n// Limitation: this code will give the incorrect answer for code like\n// a = b+++/ptn/...\n// Putting a space between the '++' post-inc operator and the '+' binary op\n// fixes this, and is highly recommended for readability anyway.\nstatic bool FollowsPostfixOperator(StyleContext &sc, Accessor &styler) {\n\tint pos = (int) sc.currentPos;\n\twhile (--pos > 0) {\n\t\tchar ch = styler[pos];\n\t\tif (ch == '+' || ch == '-') {\n\t\t\treturn styler[pos - 1] == ch;\n\t\t}\n\t}\n\treturn false;\n}\n\nstatic bool followsReturnKeyword(StyleContext &sc, Accessor &styler) {\n    // Don't look at styles, so no need to flush.\n\tint pos = (int) sc.currentPos;\n\tint currentLine = styler.GetLine(pos);\n\tint lineStartPos = styler.LineStart(currentLine);\n\tchar ch;\n\twhile (--pos > lineStartPos) {\n\t\tch = styler.SafeGetCharAt(pos);\n\t\tif (ch != ' ' && ch != '\\t') {\n\t\t\tbreak;\n\t\t}\n\t}\n\tconst char *retBack = \"nruter\";\n\tconst char *s = retBack;\n\twhile (*s\n\t       && pos >= lineStartPos\n\t       && styler.SafeGetCharAt(pos) == *s) {\n\t\ts++;\n\t\tpos--;\n\t}\n\treturn !*s;\n}\n\nstatic void ColouriseCoffeeScriptDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                            Accessor &styler) {\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\tWordList &keywords4 = *keywordlists[3];\n\n\t// property styling.within.preprocessor\n\t//\tFor C++ code, determines whether all preprocessor code is styled in the preprocessor style (0, the default)\n\t//\tor only from the initial # to the end of the command word(1).\n\tbool stylingWithinPreprocessor = styler.GetPropertyInt(\"styling.within.preprocessor\") != 0;\n\n\tCharacterSet setOKBeforeRE(CharacterSet::setNone, \"([{=,:;!%^&*|?~+-\");\n\tCharacterSet setCouldBePostOp(CharacterSet::setNone, \"+-\");\n\n\tCharacterSet setDoxygen(CharacterSet::setAlpha, \"$@\\\\&<>#{}[]\");\n\n\tCharacterSet setWordStart(CharacterSet::setAlpha, \"_\", 0x80, true);\n\tCharacterSet setWord(CharacterSet::setAlphaNum, \"._\", 0x80, true);\n\n\t// property lexer.cpp.allow.dollars\n\t//\tSet to 0 to disallow the '$' character in identifiers with the cpp lexer.\n\tif (styler.GetPropertyInt(\"lexer.cpp.allow.dollars\", 1) != 0) {\n\t\tsetWordStart.Add('$');\n\t\tsetWord.Add('$');\n\t}\n\n\tint chPrevNonWhite = ' ';\n\tint visibleChars = 0;\n\tbool lastWordWasUUID = false;\n\tint styleBeforeDCKeyword = SCE_COFFEESCRIPT_DEFAULT;\n\tbool continuationLine = false;\n\tbool isIncludePreprocessor = false;\n\n\tif (initStyle == SCE_COFFEESCRIPT_PREPROCESSOR) {\n\t\t// Set continuationLine if last character of previous line is '\\'\n\t\tint lineCurrent = styler.GetLine(startPos);\n\t\tif (lineCurrent > 0) {\n\t\t\tint chBack = styler.SafeGetCharAt(startPos-1, 0);\n\t\t\tint chBack2 = styler.SafeGetCharAt(startPos-2, 0);\n\t\t\tint lineEndChar = '!';\n\t\t\tif (chBack2 == '\\r' && chBack == '\\n') {\n\t\t\t\tlineEndChar = styler.SafeGetCharAt(startPos-3, 0);\n\t\t\t} else if (chBack == '\\n' || chBack == '\\r') {\n\t\t\t\tlineEndChar = chBack2;\n\t\t\t}\n\t\t\tcontinuationLine = lineEndChar == '\\\\';\n\t\t}\n\t}\n\n\t// look back to set chPrevNonWhite properly for better regex colouring\n\tint endPos = startPos + length;\n        if (startPos > 0 && IsSpaceEquiv(initStyle)) {\n\t\tunsigned int back = startPos;\n\t\tstyler.Flush();\n\t\twhile (back > 0 && IsSpaceEquiv(styler.StyleAt(--back)))\n\t\t\t;\n\t\tif (styler.StyleAt(back) == SCE_COFFEESCRIPT_OPERATOR) {\n\t\t\tchPrevNonWhite = styler.SafeGetCharAt(back);\n\t\t}\n\t\tif (startPos != back) {\n\t\t\tinitStyle = styler.StyleAt(back);\n\t\t\tif (IsSpaceEquiv(initStyle)) {\n\t\t\t\tinitStyle = SCE_COFFEESCRIPT_DEFAULT;\n\t\t\t}\n\t\t}\n\t\tstartPos = back;\n\t}\n\n\tStyleContext sc(startPos, endPos - startPos, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\tif (sc.atLineStart) {\n\t\t\t// Reset states to begining of colourise so no surprises\n\t\t\t// if different sets of lines lexed.\n\t\t\tvisibleChars = 0;\n\t\t\tlastWordWasUUID = false;\n\t\t\tisIncludePreprocessor = false;\n\t\t}\n\n\t\t// Handle line continuation generically.\n\t\tif (sc.ch == '\\\\') {\n\t\t\tif (sc.chNext == '\\n' || sc.chNext == '\\r') {\n\t\t\t\tsc.Forward();\n\t\t\t\tif (sc.ch == '\\r' && sc.chNext == '\\n') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tcontinuationLine = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Determine if the current state should terminate.\n\t\tswitch (sc.state) {\n\t\t\tcase SCE_COFFEESCRIPT_OPERATOR:\n\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_NUMBER:\n\t\t\t\t// We accept almost anything because of hex. and number suffixes\n\t\t\t\tif (!setWord.Contains(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_IDENTIFIER:\n\t\t\t\tif (!setWord.Contains(sc.ch) || (sc.ch == '.') || (sc.ch == '$')) {\n\t\t\t\t\tchar s[1000];\n\t\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\t\tlastWordWasUUID = strcmp(s, \"uuid\") == 0;\n\t\t\t\t\t\tsc.ChangeState(SCE_COFFEESCRIPT_WORD);\n\t\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_COFFEESCRIPT_WORD2);\n\t\t\t\t\t} else if (keywords4.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_COFFEESCRIPT_GLOBALCLASS);\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_PREPROCESSOR:\n\t\t\t\tif (sc.atLineStart && !continuationLine) {\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t} else if (stylingWithinPreprocessor) {\n\t\t\t\t\tif (IsASpace(sc.ch)) {\n\t\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (sc.Match('/', '*') || sc.Match('/', '/')) {\n\t\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_COMMENT:\n\t\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_COMMENTDOC:\n\t\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t} else if (sc.ch == '@' || sc.ch == '\\\\') { // JavaDoc and Doxygen support\n\t\t\t\t\t// Verify that we have the conditions to mark a comment-doc-keyword\n\t\t\t\t\tif ((IsASpace(sc.chPrev) || sc.chPrev == '*') && (!IsASpace(sc.chNext))) {\n\t\t\t\t\t\tstyleBeforeDCKeyword = SCE_COFFEESCRIPT_COMMENTDOC;\n\t\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_COMMENTDOCKEYWORD);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_COMMENTLINE:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_COMMENTLINEDOC:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t} else if (sc.ch == '@' || sc.ch == '\\\\') { // JavaDoc and Doxygen support\n\t\t\t\t\t// Verify that we have the conditions to mark a comment-doc-keyword\n\t\t\t\t\tif ((IsASpace(sc.chPrev) || sc.chPrev == '/' || sc.chPrev == '!') && (!IsASpace(sc.chNext))) {\n\t\t\t\t\t\tstyleBeforeDCKeyword = SCE_COFFEESCRIPT_COMMENTLINEDOC;\n\t\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_COMMENTDOCKEYWORD);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_COMMENTDOCKEYWORD:\n\t\t\t\tif ((styleBeforeDCKeyword == SCE_COFFEESCRIPT_COMMENTDOC) && sc.Match('*', '/')) {\n\t\t\t\t\tsc.ChangeState(SCE_COFFEESCRIPT_COMMENTDOCKEYWORDERROR);\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t} else if (!setDoxygen.Contains(sc.ch)) {\n\t\t\t\t\tchar s[100];\n\t\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\t\tif (!IsASpace(sc.ch) || !keywords3.InList(s + 1)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_COFFEESCRIPT_COMMENTDOCKEYWORDERROR);\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(styleBeforeDCKeyword);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_STRING:\n\t\t\t\tif (isIncludePreprocessor) {\n\t\t\t\t\tif (sc.ch == '>') {\n\t\t\t\t\t\tsc.ForwardSetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t\t\tisIncludePreprocessor = false;\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\t\tsc.ForwardSetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_CHARACTER:\n\t\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\t\tsc.ForwardSetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_REGEX:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t} else if (sc.ch == '/') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\twhile ((sc.ch < 0x80) && islower(sc.ch))\n\t\t\t\t\t\tsc.Forward();    // gobble regex flags\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\t\t// Gobble up the quoted character\n\t\t\t\t\tif (sc.chNext == '\\\\' || sc.chNext == '/') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_STRINGEOL:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_VERBATIM:\n\t\t\t\tif (sc.ch == '\\\"') {\n\t\t\t\t\tif (sc.chNext == '\\\"') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.ForwardSetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_UUID:\n\t\t\t\tif (sc.ch == '\\r' || sc.ch == '\\n' || sc.ch == ')') {\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_COMMENTBLOCK:\n\t\t\t\tif (sc.Match(\"###\")) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_VERBOSE_REGEX:\n\t\t\t\tif (sc.Match(\"///\")) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_COFFEESCRIPT_DEFAULT);\n\t\t\t\t} else if (sc.Match('#')) {\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_VERBOSE_REGEX_COMMENT);\n\t\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_COFFEESCRIPT_VERBOSE_REGEX_COMMENT:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_VERBOSE_REGEX);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_COFFEESCRIPT_DEFAULT) {\n\t\t\tif (sc.Match('@', '\\\"')) {\n\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_VERBATIM);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tif (lastWordWasUUID) {\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_UUID);\n\t\t\t\t\tlastWordWasUUID = false;\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_NUMBER);\n\t\t\t\t}\n\t\t\t} else if (setWordStart.Contains(sc.ch) || (sc.ch == '@') || (sc.ch == '$')) {\n\t\t\t\tif (lastWordWasUUID) {\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_UUID);\n\t\t\t\t\tlastWordWasUUID = false;\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_IDENTIFIER);\n\t\t\t\t}\n\t\t\t} else if (sc.Match('/', '*')) {\n\t\t\t\tif (sc.Match(\"/**\") || sc.Match(\"/*!\")) {\t// Support of Qt/Doxygen doc. style\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_COMMENTDOC);\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_COMMENT);\n\t\t\t\t}\n\t\t\t\tsc.Forward();\t// Eat the * so it isn't used for the end of the comment\n\t\t\t} else if (sc.Match(\"///\")) {\n\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_VERBOSE_REGEX);\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.ch == '/'\n\t\t\t\t   && (setOKBeforeRE.Contains(chPrevNonWhite)\n\t\t\t\t       || followsReturnKeyword(sc, styler))\n\t\t\t\t   && (!setCouldBePostOp.Contains(chPrevNonWhite)\n\t\t\t\t       || !FollowsPostfixOperator(sc, styler))) {\n\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_REGEX);\t// JavaScript's RegEx\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_STRING);\n\t\t\t\tisIncludePreprocessor = false;\t// ensure that '>' won't end the string\n\t\t\t} else if (isIncludePreprocessor && sc.ch == '<') {\n\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_STRING);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_CHARACTER);\n\t\t\t} else if (sc.ch == '#') {\n\t\t\t\tif (sc.Match(\"###\")) {\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_COMMENTBLOCK);\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_COMMENTLINE);\n\t\t\t\t}\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_COFFEESCRIPT_OPERATOR);\n\t\t\t}\n\t\t}\n\n\t\tif (!IsASpace(sc.ch) && !IsSpaceEquiv(sc.state)) {\n\t\t\tchPrevNonWhite = sc.ch;\n\t\t\tvisibleChars++;\n\t\t}\n\t\tcontinuationLine = false;\n\t}\n\tsc.Complete();\n}\n\nstatic bool IsCommentLine(int line, Accessor &styler) {\n\tint pos = styler.LineStart(line);\n\tint eol_pos = styler.LineStart(line + 1) - 1;\n\tfor (int i = pos; i < eol_pos; i++) {\n\t\tchar ch = styler[i];\n\t\tif (ch == '#')\n\t\t\treturn true;\n        else if (ch == '/'\n                 && i < eol_pos - 1\n                 && styler[i + 1] == '*')\n\t\t\treturn true;\n\t\telse if (ch != ' ' && ch != '\\t')\n\t\t\treturn false;\n\t}\n\treturn false;\n}\n\nstatic void FoldCoffeeScriptDoc(unsigned int startPos, int length, int,\n\t\t\t\tWordList *[], Accessor &styler) {\n\t// A simplified version of FoldPyDoc\n\tconst int maxPos = startPos + length;\n\tconst int maxLines = styler.GetLine(maxPos - 1);             // Requested last line\n\tconst int docLines = styler.GetLine(styler.Length() - 1);  // Available last line\n\n\t// property fold.coffeescript.comment\n\tconst bool foldComment = styler.GetPropertyInt(\"fold.coffeescript.comment\") != 0;\n\n\tconst bool foldCompact = styler.GetPropertyInt(\"fold.compact\") != 0;\n\n\t// Backtrack to previous non-blank line so we can determine indent level\n\t// for any white space lines\n\t// and so we can fix any preceding fold level (which is why we go back\n\t// at least one line in all cases)\n\tint spaceFlags = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);\n\twhile (lineCurrent > 0) {\n\t\tlineCurrent--;\n\t\tindentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);\n\t\tif (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)\n\t\t    && !IsCommentLine(lineCurrent, styler))\n\t\t\tbreak;\n\t}\n\tint indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;\n\n\t// Set up initial loop state\n\tint prevComment = 0;\n\tif (lineCurrent >= 1)\n\t\tprevComment = foldComment && IsCommentLine(lineCurrent - 1, styler);\n\n\t// Process all characters to end of requested range\n\t// or comment that hangs over the end of the range.  Cap processing in all cases\n\t// to end of document (in case of comment at end).\n\twhile ((lineCurrent <= docLines) && ((lineCurrent <= maxLines) || prevComment)) {\n\n\t\t// Gather info\n\t\tint lev = indentCurrent;\n\t\tint lineNext = lineCurrent + 1;\n\t\tint indentNext = indentCurrent;\n\t\tif (lineNext <= docLines) {\n\t\t\t// Information about next line is only available if not at end of document\n\t\t\tindentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);\n\t\t}\n\t\tconst int comment = foldComment && IsCommentLine(lineCurrent, styler);\n\t\tconst int comment_start = (comment && !prevComment && (lineNext <= docLines) &&\n\t\t                           IsCommentLine(lineNext, styler) && (lev > SC_FOLDLEVELBASE));\n\t\tconst int comment_continue = (comment && prevComment);\n\t\tif (!comment)\n\t\t\tindentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;\n\t\tif (indentNext & SC_FOLDLEVELWHITEFLAG)\n\t\t\tindentNext = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel;\n\n\t\tif (comment_start) {\n\t\t\t// Place fold point at start of a block of comments\n\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t} else if (comment_continue) {\n\t\t\t// Add level to rest of lines in the block\n\t\t\tlev = lev + 1;\n\t\t}\n\n\t\t// Skip past any blank lines for next indent level info; we skip also\n\t\t// comments (all comments, not just those starting in column 0)\n\t\t// which effectively folds them into surrounding code rather\n\t\t// than screwing up folding.\n\n\t\twhile ((lineNext < docLines) &&\n\t\t        ((indentNext & SC_FOLDLEVELWHITEFLAG) ||\n\t\t         (lineNext <= docLines && IsCommentLine(lineNext, styler)))) {\n\n\t\t\tlineNext++;\n\t\t\tindentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);\n\t\t}\n\n\t\tconst int levelAfterComments = indentNext & SC_FOLDLEVELNUMBERMASK;\n\t\tconst int levelBeforeComments = Platform::Maximum(indentCurrentLevel,levelAfterComments);\n\n\t\t// Now set all the indent levels on the lines we skipped\n\t\t// Do this from end to start.  Once we encounter one line\n\t\t// which is indented more than the line after the end of\n\t\t// the comment-block, use the level of the block before\n\n\t\tint skipLine = lineNext;\n\t\tint skipLevel = levelAfterComments;\n\n\t\twhile (--skipLine > lineCurrent) {\n\t\t\tint skipLineIndent = styler.IndentAmount(skipLine, &spaceFlags, NULL);\n\n\t\t\tif (foldCompact) {\n\t\t\t\tif ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > levelAfterComments)\n\t\t\t\t\tskipLevel = levelBeforeComments;\n\n\t\t\t\tint whiteFlag = skipLineIndent & SC_FOLDLEVELWHITEFLAG;\n\n\t\t\t\tstyler.SetLevel(skipLine, skipLevel | whiteFlag);\n\t\t\t} else {\n\t\t\t\tif ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > levelAfterComments &&\n\t\t\t\t\t!(skipLineIndent & SC_FOLDLEVELWHITEFLAG) &&\n\t\t\t\t\t!IsCommentLine(skipLine, styler))\n\t\t\t\t\tskipLevel = levelBeforeComments;\n\n\t\t\t\tstyler.SetLevel(skipLine, skipLevel);\n\t\t\t}\n\t\t}\n\n\t\t// Set fold header on non-comment line\n\t\tif (!comment && !(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {\n\t\t\tif ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t}\n\n\t\t// Keep track of block comment state of previous line\n\t\tprevComment = comment_start || comment_continue;\n\n\t\t// Set fold level for this line and move to next line\n\t\tstyler.SetLevel(lineCurrent, lev);\n\t\tindentCurrent = indentNext;\n\t\tlineCurrent = lineNext;\n\t}\n}\n\nstatic const char *const csWordLists[] = {\n            \"Keywords\",\n            0,\n};\n\nLexerModule lmCoffeeScript(SCLEX_COFFEESCRIPT, ColouriseCoffeeScriptDoc, \"coffeescript\", FoldCoffeeScriptDoc, csWordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexConf.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexConf.cxx\n ** Lexer for Apache Configuration Files.\n **\n ** First working version contributed by Ahmad Zawawi <ahmad.zawawi@gmail.com> on October 28, 2000.\n ** i created this lexer because i needed something pretty when dealing\n ** when Apache Configuration files...\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic void ColouriseConfDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler)\n{\n\tint state = SCE_CONF_DEFAULT;\n\tchar chNext = styler[startPos];\n\tint lengthDoc = startPos + length;\n\t// create a buffer large enough to take the largest chunk...\n\tchar *buffer = new char[length+1];\n\tint bufferCount = 0;\n\n\t// this assumes that we have 2 keyword list in conf.properties\n\tWordList &directives = *keywordLists[0];\n\tWordList &params = *keywordLists[1];\n\n\t// go through all provided text segment\n\t// using the hand-written state machine shown below\n\tstyler.StartAt(startPos);\n\tstyler.StartSegment(startPos);\n\tfor (int i = startPos; i < lengthDoc; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\n\t\tif (styler.IsLeadByte(ch)) {\n\t\t\tchNext = styler.SafeGetCharAt(i + 2);\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tswitch(state) {\n\t\t\tcase SCE_CONF_DEFAULT:\n\t\t\t\tif( ch == '\\n' || ch == '\\r' || ch == '\\t' || ch == ' ') {\n\t\t\t\t\t// whitespace is simply ignored here...\n\t\t\t\t\tstyler.ColourTo(i,SCE_CONF_DEFAULT);\n\t\t\t\t\tbreak;\n\t\t\t\t} else if( ch == '#' ) {\n\t\t\t\t\t// signals the start of a comment...\n\t\t\t\t\tstate = SCE_CONF_COMMENT;\n\t\t\t\t\tstyler.ColourTo(i,SCE_CONF_COMMENT);\n\t\t\t\t} else if( ch == '.' /*|| ch == '/'*/) {\n\t\t\t\t\t// signals the start of a file...\n\t\t\t\t\tstate = SCE_CONF_EXTENSION;\n\t\t\t\t\tstyler.ColourTo(i,SCE_CONF_EXTENSION);\n\t\t\t\t} else if( ch == '\"') {\n\t\t\t\t\tstate = SCE_CONF_STRING;\n\t\t\t\t\tstyler.ColourTo(i,SCE_CONF_STRING);\n\t\t\t\t} else if( IsASCII(ch) && ispunct(ch) ) {\n\t\t\t\t\t// signals an operator...\n\t\t\t\t\t// no state jump necessary for this\n\t\t\t\t\t// simple case...\n\t\t\t\t\tstyler.ColourTo(i,SCE_CONF_OPERATOR);\n\t\t\t\t} else if( IsASCII(ch) && isalpha(ch) ) {\n\t\t\t\t\t// signals the start of an identifier\n\t\t\t\t\tbufferCount = 0;\n\t\t\t\t\tbuffer[bufferCount++] = static_cast<char>(tolower(ch));\n\t\t\t\t\tstate = SCE_CONF_IDENTIFIER;\n\t\t\t\t} else if( IsASCII(ch) && isdigit(ch) ) {\n\t\t\t\t\t// signals the start of a number\n\t\t\t\t\tbufferCount = 0;\n\t\t\t\t\tbuffer[bufferCount++] = ch;\n\t\t\t\t\t//styler.ColourTo(i,SCE_CONF_NUMBER);\n\t\t\t\t\tstate = SCE_CONF_NUMBER;\n\t\t\t\t} else {\n\t\t\t\t\t// style it the default style..\n\t\t\t\t\tstyler.ColourTo(i,SCE_CONF_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_CONF_COMMENT:\n\t\t\t\t// if we find a newline here,\n\t\t\t\t// we simply go to default state\n\t\t\t\t// else continue to work on it...\n\t\t\t\tif( ch == '\\n' || ch == '\\r' ) {\n\t\t\t\t\tstate = SCE_CONF_DEFAULT;\n\t\t\t\t} else {\n\t\t\t\t\tstyler.ColourTo(i,SCE_CONF_COMMENT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_CONF_EXTENSION:\n\t\t\t\t// if we find a non-alphanumeric char,\n\t\t\t\t// we simply go to default state\n\t\t\t\t// else we're still dealing with an extension...\n\t\t\t\tif( (IsASCII(ch) && isalnum(ch)) || (ch == '_') ||\n\t\t\t\t\t(ch == '-') || (ch == '$') ||\n\t\t\t\t\t(ch == '/') || (ch == '.') || (ch == '*') )\n\t\t\t\t{\n\t\t\t\t\tstyler.ColourTo(i,SCE_CONF_EXTENSION);\n\t\t\t\t} else {\n\t\t\t\t\tstate = SCE_CONF_DEFAULT;\n\t\t\t\t\tchNext = styler[i--];\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_CONF_STRING:\n\t\t\t\t// if we find the end of a string char, we simply go to default state\n\t\t\t\t// else we're still dealing with an string...\n\t\t\t\tif( (ch == '\"' && styler.SafeGetCharAt(i-1)!='\\\\') || (ch == '\\n') || (ch == '\\r') ) {\n\t\t\t\t\tstate = SCE_CONF_DEFAULT;\n\t\t\t\t}\n\t\t\t\tstyler.ColourTo(i,SCE_CONF_STRING);\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_CONF_IDENTIFIER:\n\t\t\t\t// stay  in CONF_IDENTIFIER state until we find a non-alphanumeric\n\t\t\t\tif( (IsASCII(ch) && isalnum(ch)) || (ch == '_') || (ch == '-') || (ch == '/') || (ch == '$') || (ch == '.') || (ch == '*')) {\n\t\t\t\t\tbuffer[bufferCount++] = static_cast<char>(tolower(ch));\n\t\t\t\t} else {\n\t\t\t\t\tstate = SCE_CONF_DEFAULT;\n\t\t\t\t\tbuffer[bufferCount] = '\\0';\n\n\t\t\t\t\t// check if the buffer contains a keyword, and highlight it if it is a keyword...\n\t\t\t\t\tif(directives.InList(buffer)) {\n\t\t\t\t\t\tstyler.ColourTo(i-1,SCE_CONF_DIRECTIVE );\n\t\t\t\t\t} else if(params.InList(buffer)) {\n\t\t\t\t\t\tstyler.ColourTo(i-1,SCE_CONF_PARAMETER );\n\t\t\t\t\t} else if(strchr(buffer,'/') || strchr(buffer,'.')) {\n\t\t\t\t\t\tstyler.ColourTo(i-1,SCE_CONF_EXTENSION);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstyler.ColourTo(i-1,SCE_CONF_DEFAULT);\n\t\t\t\t\t}\n\n\t\t\t\t\t// push back the faulty character\n\t\t\t\t\tchNext = styler[i--];\n\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_CONF_NUMBER:\n\t\t\t\t// stay  in CONF_NUMBER state until we find a non-numeric\n\t\t\t\tif( (IsASCII(ch) && isdigit(ch)) || ch == '.') {\n\t\t\t\t\tbuffer[bufferCount++] = ch;\n\t\t\t\t} else {\n\t\t\t\t\tstate = SCE_CONF_DEFAULT;\n\t\t\t\t\tbuffer[bufferCount] = '\\0';\n\n\t\t\t\t\t// Colourize here...\n\t\t\t\t\tif( strchr(buffer,'.') ) {\n\t\t\t\t\t\t// it is an IP address...\n\t\t\t\t\t\tstyler.ColourTo(i-1,SCE_CONF_IP);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// normal number\n\t\t\t\t\t\tstyler.ColourTo(i-1,SCE_CONF_NUMBER);\n\t\t\t\t\t}\n\n\t\t\t\t\t// push back a character\n\t\t\t\t\tchNext = styler[i--];\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t}\n\t}\n\tdelete []buffer;\n}\n\nstatic const char * const confWordListDesc[] = {\n\t\"Directives\",\n\t\"Parameters\",\n\t0\n};\n\nLexerModule lmConf(SCLEX_CONF, ColouriseConfDoc, \"conf\", 0, confWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexCrontab.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexCrontab.cxx\n ** Lexer to use with extended crontab files used by a powerful\n ** Windows scheduler/event monitor/automation manager nnCron.\n ** (http://nemtsev.eserv.ru/)\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic void ColouriseNncrontabDoc(unsigned int startPos, int length, int, WordList\n*keywordLists[], Accessor &styler)\n{\n\tint state = SCE_NNCRONTAB_DEFAULT;\n\tchar chNext = styler[startPos];\n\tint lengthDoc = startPos + length;\n\t// create a buffer large enough to take the largest chunk...\n\tchar *buffer = new char[length+1];\n\tint bufferCount = 0;\n\t// used when highliting environment variables inside quoted string:\n\tbool insideString = false;\n\n\t// this assumes that we have 3 keyword list in conf.properties\n\tWordList &section = *keywordLists[0];\n\tWordList &keyword = *keywordLists[1];\n\tWordList &modifier = *keywordLists[2];\n\n\t// go through all provided text segment\n\t// using the hand-written state machine shown below\n\tstyler.StartAt(startPos);\n\tstyler.StartSegment(startPos);\n\tfor (int i = startPos; i < lengthDoc; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\n\t\tif (styler.IsLeadByte(ch)) {\n\t\t\tchNext = styler.SafeGetCharAt(i + 2);\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tswitch(state) {\n\t\t\tcase SCE_NNCRONTAB_DEFAULT:\n\t\t\t\tif( ch == '\\n' || ch == '\\r' || ch == '\\t' || ch == ' ') {\n\t\t\t\t\t// whitespace is simply ignored here...\n\t\t\t\t\tstyler.ColourTo(i,SCE_NNCRONTAB_DEFAULT);\n\t\t\t\t\tbreak;\n\t\t\t\t} else if( ch == '#' && styler.SafeGetCharAt(i+1) == '(') {\n\t\t\t\t\t// signals the start of a task...\n\t\t\t\t\tstate = SCE_NNCRONTAB_TASK;\n\t\t\t\t\tstyler.ColourTo(i,SCE_NNCRONTAB_TASK);\n\t\t\t\t}\n\t\t\t\t  else if( ch == '\\\\' && (styler.SafeGetCharAt(i+1) == ' ' ||\n\t\t\t\t\t\t\t\t\t\t styler.SafeGetCharAt(i+1) == '\\t')) {\n\t\t\t\t\t// signals the start of an extended comment...\n\t\t\t\t\tstate = SCE_NNCRONTAB_COMMENT;\n\t\t\t\t\tstyler.ColourTo(i,SCE_NNCRONTAB_COMMENT);\n\t\t\t\t} else if( ch == '#' ) {\n\t\t\t\t\t// signals the start of a plain comment...\n\t\t\t\t\tstate = SCE_NNCRONTAB_COMMENT;\n\t\t\t\t\tstyler.ColourTo(i,SCE_NNCRONTAB_COMMENT);\n\t\t\t\t} else if( ch == ')' && styler.SafeGetCharAt(i+1) == '#') {\n\t\t\t\t\t// signals the end of a task...\n\t\t\t\t\tstate = SCE_NNCRONTAB_TASK;\n\t\t\t\t\tstyler.ColourTo(i,SCE_NNCRONTAB_TASK);\n\t\t\t\t} else if( ch == '\"') {\n\t\t\t\t\tstate = SCE_NNCRONTAB_STRING;\n\t\t\t\t\tstyler.ColourTo(i,SCE_NNCRONTAB_STRING);\n\t\t\t\t} else if( ch == '%') {\n\t\t\t\t\t// signals environment variables\n\t\t\t\t\tstate = SCE_NNCRONTAB_ENVIRONMENT;\n\t\t\t\t\tstyler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT);\n\t\t\t\t} else if( ch == '<' && styler.SafeGetCharAt(i+1) == '%') {\n\t\t\t\t\t// signals environment variables\n\t\t\t\t\tstate = SCE_NNCRONTAB_ENVIRONMENT;\n\t\t\t\t\tstyler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT);\n\t\t\t\t} else if( ch == '*' ) {\n\t\t\t\t\t// signals an asterisk\n\t\t\t\t\t// no state jump necessary for this simple case...\n\t\t\t\t\tstyler.ColourTo(i,SCE_NNCRONTAB_ASTERISK);\n\t\t\t\t} else if( (IsASCII(ch) && isalpha(ch)) || ch == '<' ) {\n\t\t\t\t\t// signals the start of an identifier\n\t\t\t\t\tbufferCount = 0;\n\t\t\t\t\tbuffer[bufferCount++] = ch;\n\t\t\t\t\tstate = SCE_NNCRONTAB_IDENTIFIER;\n\t\t\t\t} else if( IsASCII(ch) && isdigit(ch) ) {\n\t\t\t\t\t// signals the start of a number\n\t\t\t\t\tbufferCount = 0;\n\t\t\t\t\tbuffer[bufferCount++] = ch;\n\t\t\t\t\tstate = SCE_NNCRONTAB_NUMBER;\n\t\t\t\t} else {\n\t\t\t\t\t// style it the default style..\n\t\t\t\t\tstyler.ColourTo(i,SCE_NNCRONTAB_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_NNCRONTAB_COMMENT:\n\t\t\t\t// if we find a newline here,\n\t\t\t\t// we simply go to default state\n\t\t\t\t// else continue to work on it...\n\t\t\t\tif( ch == '\\n' || ch == '\\r' ) {\n\t\t\t\t\tstate = SCE_NNCRONTAB_DEFAULT;\n\t\t\t\t} else {\n\t\t\t\t\tstyler.ColourTo(i,SCE_NNCRONTAB_COMMENT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_NNCRONTAB_TASK:\n\t\t\t\t// if we find a newline here,\n\t\t\t\t// we simply go to default state\n\t\t\t\t// else continue to work on it...\n\t\t\t\tif( ch == '\\n' || ch == '\\r' ) {\n\t\t\t\t\tstate = SCE_NNCRONTAB_DEFAULT;\n\t\t\t\t} else {\n\t\t\t\t\tstyler.ColourTo(i,SCE_NNCRONTAB_TASK);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_NNCRONTAB_STRING:\n\t\t\t\tif( ch == '%' ) {\n\t\t\t\t\tstate = SCE_NNCRONTAB_ENVIRONMENT;\n\t\t\t\t\tinsideString = true;\n\t\t\t\t\tstyler.ColourTo(i-1,SCE_NNCRONTAB_STRING);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// if we find the end of a string char, we simply go to default state\n\t\t\t\t// else we're still dealing with an string...\n\t\t\t\tif( (ch == '\"' && styler.SafeGetCharAt(i-1)!='\\\\') ||\n\t\t\t\t\t(ch == '\\n') || (ch == '\\r') ) {\n\t\t\t\t\tstate = SCE_NNCRONTAB_DEFAULT;\n\t\t\t\t}\n\t\t\t\tstyler.ColourTo(i,SCE_NNCRONTAB_STRING);\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_NNCRONTAB_ENVIRONMENT:\n\t\t\t\t// if we find the end of a string char, we simply go to default state\n\t\t\t\t// else we're still dealing with an string...\n\t\t\t\tif( ch == '%' && insideString ) {\n\t\t\t\t\tstate = SCE_NNCRONTAB_STRING;\n\t\t\t\t\tinsideString = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif( (ch == '%' && styler.SafeGetCharAt(i-1)!='\\\\')\n\t\t\t\t\t|| (ch == '\\n') || (ch == '\\r') || (ch == '>') ) {\n\t\t\t\t\tstate = SCE_NNCRONTAB_DEFAULT;\n\t\t\t\t\tstyler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tstyler.ColourTo(i+1,SCE_NNCRONTAB_ENVIRONMENT);\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_NNCRONTAB_IDENTIFIER:\n\t\t\t\t// stay  in CONF_IDENTIFIER state until we find a non-alphanumeric\n\t\t\t\tif( (IsASCII(ch) && isalnum(ch)) || (ch == '_') || (ch == '-') || (ch == '/') ||\n\t\t\t\t\t(ch == '$') || (ch == '.') || (ch == '<') || (ch == '>') ||\n\t\t\t\t\t(ch == '@') ) {\n\t\t\t\t\tbuffer[bufferCount++] = ch;\n\t\t\t\t} else {\n\t\t\t\t\tstate = SCE_NNCRONTAB_DEFAULT;\n\t\t\t\t\tbuffer[bufferCount] = '\\0';\n\n\t\t\t\t\t// check if the buffer contains a keyword,\n\t\t\t\t\t// and highlight it if it is a keyword...\n\t\t\t\t\tif(section.InList(buffer)) {\n\t\t\t\t\t\tstyler.ColourTo(i,SCE_NNCRONTAB_SECTION );\n\t\t\t\t\t} else if(keyword.InList(buffer)) {\n\t\t\t\t\t\tstyler.ColourTo(i-1,SCE_NNCRONTAB_KEYWORD );\n\t\t\t\t\t} // else if(strchr(buffer,'/') || strchr(buffer,'.')) {\n\t\t\t\t\t//\tstyler.ColourTo(i-1,SCE_NNCRONTAB_EXTENSION);\n\t\t\t\t\t// }\n\t\t\t\t\t  else if(modifier.InList(buffer)) {\n\t\t\t\t\t\tstyler.ColourTo(i-1,SCE_NNCRONTAB_MODIFIER );\n\t\t\t\t\t  }\telse {\n\t\t\t\t\t\tstyler.ColourTo(i-1,SCE_NNCRONTAB_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t\t// push back the faulty character\n\t\t\t\t\tchNext = styler[i--];\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_NNCRONTAB_NUMBER:\n\t\t\t\t// stay  in CONF_NUMBER state until we find a non-numeric\n\t\t\t\tif( IsASCII(ch) && isdigit(ch) /* || ch == '.' */ ) {\n\t\t\t\t\tbuffer[bufferCount++] = ch;\n\t\t\t\t} else {\n\t\t\t\t\tstate = SCE_NNCRONTAB_DEFAULT;\n\t\t\t\t\tbuffer[bufferCount] = '\\0';\n\t\t\t\t\t// Colourize here... (normal number)\n\t\t\t\t\tstyler.ColourTo(i-1,SCE_NNCRONTAB_NUMBER);\n\t\t\t\t\t// push back a character\n\t\t\t\t\tchNext = styler[i--];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tdelete []buffer;\n}\n\nstatic const char * const cronWordListDesc[] = {\n\t\"Section keywords and Forth words\",\n\t\"nnCrontab keywords\",\n\t\"Modifiers\",\n\t0\n};\n\nLexerModule lmNncrontab(SCLEX_NNCRONTAB, ColouriseNncrontabDoc, \"nncrontab\", 0, cronWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexCsound.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexCsound.cxx\n ** Lexer for Csound (Orchestra & Score)\n ** Written by Georg Ritter - <ritterfuture A T gmail D O T com>\n **/\n// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '.' ||\n\t\tch == '_' || ch == '?');\n}\n\nstatic inline bool IsAWordStart(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.' ||\n\t\tch == '%' || ch == '@' || ch == '$' || ch == '?');\n}\n\nstatic inline bool IsCsoundOperator(char ch) {\n\tif (IsASCII(ch) && isalnum(ch))\n\t\treturn false;\n\t// '.' left out as it is used to make up numbers\n\tif (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||\n\t\tch == '(' || ch == ')' || ch == '=' || ch == '^' ||\n\t\tch == '[' || ch == ']' || ch == '<' || ch == '&' ||\n\t\tch == '>' || ch == ',' || ch == '|' || ch == '~' ||\n\t\tch == '%' || ch == ':')\n\t\treturn true;\n\treturn false;\n}\n\nstatic void ColouriseCsoundDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n\t\t\t\tAccessor &styler) {\n\n\tWordList &opcode = *keywordlists[0];\n\tWordList &headerStmt = *keywordlists[1];\n\tWordList &otherKeyword = *keywordlists[2];\n\n\t// Do not leak onto next line\n\tif (initStyle == SCE_CSOUND_STRINGEOL)\n\t\tinitStyle = SCE_CSOUND_DEFAULT;\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward())\n\t{\n\t\t// Handle line continuation generically.\n\t\tif (sc.ch == '\\\\') {\n\t\t\tif (sc.chNext == '\\n' || sc.chNext == '\\r') {\n\t\t\t\tsc.Forward();\n\t\t\t\tif (sc.ch == '\\r' && sc.chNext == '\\n') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Determine if the current state should terminate.\n\t\tif (sc.state == SCE_CSOUND_OPERATOR) {\n\t\t\tif (!IsCsoundOperator(static_cast<char>(sc.ch))) {\n\t\t\t    sc.SetState(SCE_CSOUND_DEFAULT);\n\t\t\t}\n\t\t}else if (sc.state == SCE_CSOUND_NUMBER) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_CSOUND_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_CSOUND_IDENTIFIER) {\n\t\t\tif (!IsAWordChar(sc.ch) ) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\n\t\t\t\tif (opcode.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_CSOUND_OPCODE);\n\t\t\t\t} else if (headerStmt.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_CSOUND_HEADERSTMT);\n\t\t\t\t} else if (otherKeyword.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_CSOUND_USERKEYWORD);\n\t\t\t\t} else if (s[0] == 'p') {\n\t\t\t\t\tsc.ChangeState(SCE_CSOUND_PARAM);\n\t\t\t\t} else if (s[0] == 'a') {\n\t\t\t\t\tsc.ChangeState(SCE_CSOUND_ARATE_VAR);\n\t\t\t\t} else if (s[0] == 'k') {\n\t\t\t\t\tsc.ChangeState(SCE_CSOUND_KRATE_VAR);\n\t\t\t\t} else if (s[0] == 'i') { // covers both i-rate variables and i-statements\n\t\t\t\t\tsc.ChangeState(SCE_CSOUND_IRATE_VAR);\n\t\t\t\t} else if (s[0] == 'g') {\n\t\t\t\t\tsc.ChangeState(SCE_CSOUND_GLOBAL_VAR);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_CSOUND_DEFAULT);\n\t\t\t}\n\t\t}\n\t\telse if (sc.state == SCE_CSOUND_COMMENT ) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_CSOUND_DEFAULT);\n\t\t\t}\n\t\t}\n\t\telse if ((sc.state == SCE_CSOUND_ARATE_VAR) ||\n\t\t\t(sc.state == SCE_CSOUND_KRATE_VAR) ||\n\t\t(sc.state == SCE_CSOUND_IRATE_VAR)) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_CSOUND_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_CSOUND_DEFAULT) {\n\t\t\tif (sc.ch == ';'){\n\t\t\t\tsc.SetState(SCE_CSOUND_COMMENT);\n\t\t\t} else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_CSOUND_NUMBER);\n\t\t\t} else if (IsAWordStart(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_CSOUND_IDENTIFIER);\n\t\t\t} else if (IsCsoundOperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_CSOUND_OPERATOR);\n\t\t\t} else if (sc.ch == 'p') {\n\t\t\t\tsc.SetState(SCE_CSOUND_PARAM);\n\t\t\t} else if (sc.ch == 'a') {\n\t\t\t\tsc.SetState(SCE_CSOUND_ARATE_VAR);\n\t\t\t} else if (sc.ch == 'k') {\n\t\t\t\tsc.SetState(SCE_CSOUND_KRATE_VAR);\n\t\t\t} else if (sc.ch == 'i') { // covers both i-rate variables and i-statements\n\t\t\t\tsc.SetState(SCE_CSOUND_IRATE_VAR);\n\t\t\t} else if (sc.ch == 'g') {\n\t\t\t\tsc.SetState(SCE_CSOUND_GLOBAL_VAR);\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n}\n\nstatic void FoldCsoundInstruments(unsigned int startPos, int length, int /* initStyle */, WordList *[],\n\t\tAccessor &styler) {\n\tunsigned int lengthDoc = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tint stylePrev = 0;\n\tint styleNext = styler.StyleAt(startPos);\n\tfor (unsigned int i = startPos; i < lengthDoc; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif ((stylePrev != SCE_CSOUND_OPCODE) && (style == SCE_CSOUND_OPCODE)) {\n\t\t\tchar s[20];\n\t\t\tunsigned int j = 0;\n\t\t\twhile ((j < (sizeof(s) - 1)) && (iswordchar(styler[i + j]))) {\n\t\t\t\ts[j] = styler[i + j];\n\t\t\t\tj++;\n\t\t\t}\n\t\t\ts[j] = '\\0';\n\n\t\t\tif (strcmp(s, \"instr\") == 0)\n\t\t\t\tlevelCurrent++;\n\t\t\tif (strcmp(s, \"endin\") == 0)\n\t\t\t\tlevelCurrent--;\n\t\t}\n\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t\tstylePrev = style;\n\t}\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\n\nstatic const char * const csoundWordListDesc[] = {\n\t\"Opcodes\",\n\t\"Header Statements\",\n\t\"User keywords\",\n\t0\n};\n\nLexerModule lmCsound(SCLEX_CSOUND, ColouriseCsoundDoc, \"csound\", FoldCsoundInstruments, csoundWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexD.cpp",
    "content": "/** @file LexD.cxx\n ** Lexer for D.\n **\n ** Copyright (c) 2006 by Waldemar Augustyn <waldemar@wdmsys.com>\n ** Converted to lexer object and added further folding features/properties by \"Udo Lechner\" <dlchnr(at)gmx(dot)net>\n **/\n// Copyright 1998-2005 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include <string>\n#include <map>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n#include \"OptionSet.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n/* Nested comments require keeping the value of the nesting level for every\n   position in the document.  But since scintilla always styles line by line,\n   we only need to store one value per line. The non-negative number indicates\n   nesting level at the end of the line.\n*/\n\n// Underscore, letter, digit and universal alphas from C99 Appendix D.\n\nstatic bool IsWordStart(int ch) {\n\treturn (IsASCII(ch) && (isalpha(ch) || ch == '_')) || !IsASCII(ch);\n}\n\nstatic bool IsWord(int ch) {\n\treturn (IsASCII(ch) && (isalnum(ch) || ch == '_')) || !IsASCII(ch);\n}\n\nstatic bool IsDoxygen(int ch) {\n\tif (IsASCII(ch) && islower(ch))\n\t\treturn true;\n\tif (ch == '$' || ch == '@' || ch == '\\\\' ||\n\t\tch == '&' || ch == '#' || ch == '<' || ch == '>' ||\n\t\tch == '{' || ch == '}' || ch == '[' || ch == ']')\n\t\treturn true;\n\treturn false;\n}\n\nstatic bool IsStringSuffix(int ch) {\n\treturn ch == 'c' || ch == 'w' || ch == 'd';\n}\n\nstatic bool IsStreamCommentStyle(int style) {\n\treturn style == SCE_D_COMMENT ||\n\t\tstyle == SCE_D_COMMENTDOC ||\n\t\tstyle == SCE_D_COMMENTDOCKEYWORD ||\n\t\tstyle == SCE_D_COMMENTDOCKEYWORDERROR;\n}\n\n// An individual named option for use in an OptionSet\n\n// Options used for LexerD\nstruct OptionsD {\n\tbool fold;\n\tbool foldSyntaxBased;\n\tbool foldComment;\n\tbool foldCommentMultiline;\n\tbool foldCommentExplicit;\n\tstd::string foldExplicitStart;\n\tstd::string foldExplicitEnd;\n\tbool foldExplicitAnywhere;\n\tbool foldCompact;\n\tint  foldAtElseInt;\n\tbool foldAtElse;\n\tOptionsD() {\n\t\tfold = false;\n\t\tfoldSyntaxBased = true;\n\t\tfoldComment = false;\n\t\tfoldCommentMultiline = true;\n\t\tfoldCommentExplicit = true;\n\t\tfoldExplicitStart = \"\";\n\t\tfoldExplicitEnd   = \"\";\n\t\tfoldExplicitAnywhere = false;\n\t\tfoldCompact = true;\n\t\tfoldAtElseInt = -1;\n\t\tfoldAtElse = false;\n\t}\n};\n\nstatic const char * const dWordLists[] = {\n\t\t\t\"Primary keywords and identifiers\",\n\t\t\t\"Secondary keywords and identifiers\",\n\t\t\t\"Documentation comment keywords\",\n\t\t\t\"Type definitions and aliases\",\n\t\t\t\"Keywords 5\",\n\t\t\t\"Keywords 6\",\n\t\t\t\"Keywords 7\",\n\t\t\t0,\n\t\t};\n\nstruct OptionSetD : public OptionSet<OptionsD> {\n\tOptionSetD() {\n\t\tDefineProperty(\"fold\", &OptionsD::fold);\n\n\t\tDefineProperty(\"fold.d.syntax.based\", &OptionsD::foldSyntaxBased,\n\t\t\t\"Set this property to 0 to disable syntax based folding.\");\n\n\t\tDefineProperty(\"fold.comment\", &OptionsD::foldComment);\n\n\t\tDefineProperty(\"fold.d.comment.multiline\", &OptionsD::foldCommentMultiline,\n\t\t\t\"Set this property to 0 to disable folding multi-line comments when fold.comment=1.\");\n\n\t\tDefineProperty(\"fold.d.comment.explicit\", &OptionsD::foldCommentExplicit,\n\t\t\t\"Set this property to 0 to disable folding explicit fold points when fold.comment=1.\");\n\n\t\tDefineProperty(\"fold.d.explicit.start\", &OptionsD::foldExplicitStart,\n\t\t\t\"The string to use for explicit fold start points, replacing the standard //{.\");\n\n\t\tDefineProperty(\"fold.d.explicit.end\", &OptionsD::foldExplicitEnd,\n\t\t\t\"The string to use for explicit fold end points, replacing the standard //}.\");\n\n\t\tDefineProperty(\"fold.d.explicit.anywhere\", &OptionsD::foldExplicitAnywhere,\n\t\t\t\"Set this property to 1 to enable explicit fold points anywhere, not just in line comments.\");\n\n\t\tDefineProperty(\"fold.compact\", &OptionsD::foldCompact);\n\n\t\tDefineProperty(\"lexer.d.fold.at.else\", &OptionsD::foldAtElseInt,\n\t\t\t\"This option enables D folding on a \\\"} else {\\\" line of an if statement.\");\n\n\t\tDefineProperty(\"fold.at.else\", &OptionsD::foldAtElse);\n\n\t\tDefineWordListSets(dWordLists);\n\t}\n};\n\nclass LexerD : public ILexer {\n\tbool caseSensitive;\n\tWordList keywords;\n\tWordList keywords2;\n\tWordList keywords3;\n\tWordList keywords4;\n\tWordList keywords5;\n\tWordList keywords6;\n\tWordList keywords7;\n\tOptionsD options;\n\tOptionSetD osD;\npublic:\n\tLexerD(bool caseSensitive_) :\n\t\tcaseSensitive(caseSensitive_) {\n\t}\n\tvirtual ~LexerD() {\n\t}\n\tvoid SCI_METHOD Release() {\n\t\tdelete this;\n\t}\n\tint SCI_METHOD Version() const {\n\t\treturn lvOriginal;\n\t}\n\tconst char * SCI_METHOD PropertyNames() {\n\t\treturn osD.PropertyNames();\n\t}\n\tint SCI_METHOD PropertyType(const char *name) {\n\t\treturn osD.PropertyType(name);\n\t}\n\tconst char * SCI_METHOD DescribeProperty(const char *name) {\n\t\treturn osD.DescribeProperty(name);\n\t}\n\tint SCI_METHOD PropertySet(const char *key, const char *val);\n\tconst char * SCI_METHOD DescribeWordListSets() {\n\t\treturn osD.DescribeWordListSets();\n\t}\n\tint SCI_METHOD WordListSet(int n, const char *wl);\n\tvoid SCI_METHOD Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n\tvoid SCI_METHOD Fold(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n\n\tvoid * SCI_METHOD PrivateCall(int, void *) {\n\t\treturn 0;\n\t}\n\n\tstatic ILexer *LexerFactoryD() {\n\t\treturn new LexerD(true);\n\t}\n\tstatic ILexer *LexerFactoryDInsensitive() {\n\t\treturn new LexerD(false);\n\t}\n};\n\nint SCI_METHOD LexerD::PropertySet(const char *key, const char *val) {\n\tif (osD.PropertySet(&options, key, val)) {\n\t\treturn 0;\n\t}\n\treturn -1;\n}\n\nint SCI_METHOD LexerD::WordListSet(int n, const char *wl) {\n\tWordList *wordListN = 0;\n\tswitch (n) {\n\tcase 0:\n\t\twordListN = &keywords;\n\t\tbreak;\n\tcase 1:\n\t\twordListN = &keywords2;\n\t\tbreak;\n\tcase 2:\n\t\twordListN = &keywords3;\n\t\tbreak;\n\tcase 3:\n\t\twordListN = &keywords4;\n\t\tbreak;\n\tcase 4:\n\t\twordListN = &keywords5;\n\t\tbreak;\n\tcase 5:\n\t\twordListN = &keywords6;\n\t\tbreak;\n\tcase 6:\n\t\twordListN = &keywords7;\n\t\tbreak;\n\t}\n\tint firstModification = -1;\n\tif (wordListN) {\n\t\tWordList wlNew;\n\t\twlNew.Set(wl);\n\t\tif (*wordListN != wlNew) {\n\t\t\twordListN->Set(wl);\n\t\t\tfirstModification = 0;\n\t\t}\n\t}\n\treturn firstModification;\n}\n\nvoid SCI_METHOD LexerD::Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n\tLexAccessor styler(pAccess);\n\n\tint styleBeforeDCKeyword = SCE_D_DEFAULT;\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tint curLine = styler.GetLine(startPos);\n\tint curNcLevel = curLine > 0? styler.GetLineState(curLine-1): 0;\n\tbool numFloat = false; // Float literals have '+' and '-' signs\n\tbool numHex = false;\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\tif (sc.atLineStart) {\n\t\t\tcurLine = styler.GetLine(sc.currentPos);\n\t\t\tstyler.SetLineState(curLine, curNcLevel);\n\t\t}\n\n\t\t// Determine if the current state should terminate.\n\t\tswitch (sc.state) {\n\t\t\tcase SCE_D_OPERATOR:\n\t\t\t\tsc.SetState(SCE_D_DEFAULT);\n\t\t\t\tbreak;\n\t\t\tcase SCE_D_NUMBER:\n\t\t\t\t// We accept almost anything because of hex. and number suffixes\n\t\t\t\tif (IsASCII(sc.ch) && (isalnum(sc.ch) || sc.ch == '_')) {\n\t\t\t\t\tcontinue;\n\t\t\t\t} else if (sc.ch == '.' && sc.chNext != '.' && !numFloat) {\n\t\t\t\t\t// Don't parse 0..2 as number.\n\t\t\t\t\tnumFloat=true;\n\t\t\t\t\tcontinue;\n\t\t\t\t} else if ( ( sc.ch == '-' || sc.ch == '+' ) && (\t\t/*sign and*/\n\t\t\t\t\t( !numHex && ( sc.chPrev == 'e' || sc.chPrev == 'E' ) ) || /*decimal or*/\n\t\t\t\t\t( sc.chPrev == 'p' || sc.chPrev == 'P' ) ) ) {\t\t/*hex*/\n\t\t\t\t\t// Parse exponent sign in float literals: 2e+10 0x2e+10\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_D_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_D_IDENTIFIER:\n\t\t\t\tif (!IsWord(sc.ch)) {\n\t\t\t\t\tchar s[1000];\n\t\t\t\t\tif (caseSensitive) {\n\t\t\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\t\t}\n\t\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_D_WORD);\n\t\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_D_WORD2);\n\t\t\t\t\t} else if (keywords4.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_D_TYPEDEF);\n\t\t\t\t\t} else if (keywords5.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_D_WORD5);\n\t\t\t\t\t} else if (keywords6.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_D_WORD6);\n\t\t\t\t\t} else if (keywords7.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_D_WORD7);\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(SCE_D_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_D_COMMENT:\n\t\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_D_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_D_COMMENTDOC:\n\t\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_D_DEFAULT);\n\t\t\t\t} else if (sc.ch == '@' || sc.ch == '\\\\') { // JavaDoc and Doxygen support\n\t\t\t\t\t// Verify that we have the conditions to mark a comment-doc-keyword\n\t\t\t\t\tif ((IsASpace(sc.chPrev) || sc.chPrev == '*') && (!IsASpace(sc.chNext))) {\n\t\t\t\t\t\tstyleBeforeDCKeyword = SCE_D_COMMENTDOC;\n\t\t\t\t\t\tsc.SetState(SCE_D_COMMENTDOCKEYWORD);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_D_COMMENTLINE:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_D_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_D_COMMENTLINEDOC:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_D_DEFAULT);\n\t\t\t\t} else if (sc.ch == '@' || sc.ch == '\\\\') { // JavaDoc and Doxygen support\n\t\t\t\t\t// Verify that we have the conditions to mark a comment-doc-keyword\n\t\t\t\t\tif ((IsASpace(sc.chPrev) || sc.chPrev == '/' || sc.chPrev == '!') && (!IsASpace(sc.chNext))) {\n\t\t\t\t\t\tstyleBeforeDCKeyword = SCE_D_COMMENTLINEDOC;\n\t\t\t\t\t\tsc.SetState(SCE_D_COMMENTDOCKEYWORD);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_D_COMMENTDOCKEYWORD:\n\t\t\t\tif ((styleBeforeDCKeyword == SCE_D_COMMENTDOC) && sc.Match('*', '/')) {\n\t\t\t\t\tsc.ChangeState(SCE_D_COMMENTDOCKEYWORDERROR);\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_D_DEFAULT);\n\t\t\t\t} else if (!IsDoxygen(sc.ch)) {\n\t\t\t\t\tchar s[100];\n\t\t\t\t\tif (caseSensitive) {\n\t\t\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\t\t}\n\t\t\t\t\tif (!IsASpace(sc.ch) || !keywords3.InList(s + 1)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_D_COMMENTDOCKEYWORDERROR);\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(styleBeforeDCKeyword);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_D_COMMENTNESTED:\n\t\t\t\tif (sc.Match('+', '/')) {\n\t\t\t\t\tif (curNcLevel > 0)\n\t\t\t\t\t\tcurNcLevel -= 1;\n\t\t\t\t\tcurLine = styler.GetLine(sc.currentPos);\n\t\t\t\t\tstyler.SetLineState(curLine, curNcLevel);\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tif (curNcLevel == 0) {\n\t\t\t\t\t\tsc.ForwardSetState(SCE_D_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.Match('/','+')) {\n\t\t\t\t\tcurNcLevel += 1;\n\t\t\t\t\tcurLine = styler.GetLine(sc.currentPos);\n\t\t\t\t\tstyler.SetLineState(curLine, curNcLevel);\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_D_STRING:\n\t\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\t\tif (sc.chNext == '\"' || sc.chNext == '\\\\') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\"') {\n\t\t\t\t\tif(IsStringSuffix(sc.chNext))\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_D_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_D_CHARACTER:\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.ChangeState(SCE_D_STRINGEOL);\n\t\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\t\tif (sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\t\t// Char has no suffixes\n\t\t\t\t\tsc.ForwardSetState(SCE_D_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_D_STRINGEOL:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_D_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_D_STRINGB:\n\t\t\t\tif (sc.ch == '`') {\n\t\t\t\t\tif(IsStringSuffix(sc.chNext))\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_D_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_D_STRINGR:\n\t\t\t\tif (sc.ch == '\"') {\n\t\t\t\t\tif(IsStringSuffix(sc.chNext))\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_D_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_D_DEFAULT) {\n\t\t\tif (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_D_NUMBER);\n\t\t\t\tnumFloat = sc.ch == '.';\n\t\t\t\t// Remember hex literal\n\t\t\t\tnumHex = sc.ch == '0' && ( sc.chNext == 'x' || sc.chNext == 'X' );\n\t\t\t} else if ( (sc.ch == 'r' || sc.ch == 'x' || sc.ch == 'q')\n\t\t\t\t&& sc.chNext == '\"' ) {\n\t\t\t\t// Limited support for hex and delimited strings: parse as r\"\"\n\t\t\t\tsc.SetState(SCE_D_STRINGR);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (IsWordStart(sc.ch) || sc.ch == '$') {\n\t\t\t\tsc.SetState(SCE_D_IDENTIFIER);\n\t\t\t} else if (sc.Match('/','+')) {\n\t\t\t\tcurNcLevel += 1;\n\t\t\t\tcurLine = styler.GetLine(sc.currentPos);\n\t\t\t\tstyler.SetLineState(curLine, curNcLevel);\n\t\t\t\tsc.SetState(SCE_D_COMMENTNESTED);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.Match('/', '*')) {\n\t\t\t\tif (sc.Match(\"/**\") || sc.Match(\"/*!\")) {   // Support of Qt/Doxygen doc. style\n\t\t\t\t\tsc.SetState(SCE_D_COMMENTDOC);\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_D_COMMENT);\n\t\t\t\t}\n\t\t\t\tsc.Forward();   // Eat the * so it isn't used for the end of the comment\n\t\t\t} else if (sc.Match('/', '/')) {\n\t\t\t\tif ((sc.Match(\"///\") && !sc.Match(\"////\")) || sc.Match(\"//!\"))\n\t\t\t\t\t// Support of Qt/Doxygen doc. style\n\t\t\t\t\tsc.SetState(SCE_D_COMMENTLINEDOC);\n\t\t\t\telse\n\t\t\t\t\tsc.SetState(SCE_D_COMMENTLINE);\n\t\t\t} else if (sc.ch == '\"') {\n\t\t\t\tsc.SetState(SCE_D_STRING);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_D_CHARACTER);\n\t\t\t} else if (sc.ch == '`') {\n\t\t\t\tsc.SetState(SCE_D_STRINGB);\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_D_OPERATOR);\n\t\t\t\tif (sc.ch == '.' && sc.chNext == '.') sc.Forward(); // Range operator\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n}\n\n// Store both the current line's fold level and the next lines in the\n// level store to make it easy to pick up with each increment\n// and to make it possible to fiddle the current level for \"} else {\".\n\nvoid SCI_METHOD LexerD::Fold(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n\n\tif (!options.fold)\n\t\treturn;\n\n\tLexAccessor styler(pAccess);\n\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelCurrent = SC_FOLDLEVELBASE;\n\tif (lineCurrent > 0)\n\t\tlevelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n\tint levelMinCurrent = levelCurrent;\n\tint levelNext = levelCurrent;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tbool foldAtElse = options.foldAtElseInt >= 0 ? options.foldAtElseInt != 0 : options.foldAtElse;\n\tconst bool userDefinedFoldMarkers = !options.foldExplicitStart.empty() && !options.foldExplicitEnd.empty();\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (options.foldComment && options.foldCommentMultiline && IsStreamCommentStyle(style)) {\n\t\t\tif (!IsStreamCommentStyle(stylePrev)) {\n\t\t\t\tlevelNext++;\n\t\t\t} else if (!IsStreamCommentStyle(styleNext) && !atEOL) {\n\t\t\t\t// Comments don't end at end of line and the next character may be unstyled.\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\t\tif (options.foldComment && options.foldCommentExplicit && ((style == SCE_D_COMMENTLINE) || options.foldExplicitAnywhere)) {\n\t\t\tif (userDefinedFoldMarkers) {\n\t\t\t\tif (styler.Match(i, options.foldExplicitStart.c_str())) {\n \t\t\t\t\tlevelNext++;\n\t\t\t\t} else if (styler.Match(i, options.foldExplicitEnd.c_str())) {\n \t\t\t\t\tlevelNext--;\n \t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ((ch == '/') && (chNext == '/')) {\n\t\t\t\t\tchar chNext2 = styler.SafeGetCharAt(i + 2);\n\t\t\t\t\tif (chNext2 == '{') {\n\t\t\t\t\t\tlevelNext++;\n\t\t\t\t\t} else if (chNext2 == '}') {\n\t\t\t\t\t\tlevelNext--;\n\t\t\t\t\t}\n\t\t\t\t}\n \t\t\t}\n \t\t}\n\t\tif (options.foldSyntaxBased && (style == SCE_D_OPERATOR)) {\n\t\t\tif (ch == '{') {\n\t\t\t\t// Measure the minimum before a '{' to allow\n\t\t\t\t// folding on \"} else {\"\n\t\t\t\tif (levelMinCurrent > levelNext) {\n\t\t\t\t\tlevelMinCurrent = levelNext;\n\t\t\t\t}\n\t\t\t\tlevelNext++;\n\t\t\t} else if (ch == '}') {\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\t\tif (atEOL || (i == endPos-1)) {\n\t\t\tif (options.foldComment && options.foldCommentMultiline) {  // Handle nested comments\n\t\t\t\tint nc;\n\t\t\t\tnc =  styler.GetLineState(lineCurrent);\n\t\t\t\tnc -= lineCurrent>0? styler.GetLineState(lineCurrent-1): 0;\n\t\t\t\tlevelNext += nc;\n\t\t\t}\n\t\t\tint levelUse = levelCurrent;\n\t\t\tif (options.foldSyntaxBased && foldAtElse) {\n\t\t\t\tlevelUse = levelMinCurrent;\n\t\t\t}\n\t\t\tint lev = levelUse | levelNext << 16;\n\t\t\tif (visibleChars == 0 && options.foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (levelUse < levelNext)\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelCurrent = levelNext;\n\t\t\tlevelMinCurrent = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!IsASpace(ch))\n\t\t\tvisibleChars++;\n\t}\n}\n\nLexerModule lmD(SCLEX_D, LexerD::LexerFactoryD, \"d\", dWordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexECL.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexECL.cxx\n ** Lexer for ECL.\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#ifdef _MSC_VER\n#pragma warning(disable: 4786)\n#endif\n#ifdef __BORLANDC__\n// Borland C++ displays warnings in vector header without this\n#pragma option -w-ccc -w-rch\n#endif\n\n#include <string>\n#include <vector>\n#include <map>\n#include <algorithm>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"PropSetSimple.h\"\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n#include \"OptionSet.h\"\n\n#define SET_LOWER \"abcdefghijklmnopqrstuvwxyz\"\n#define SET_UPPER \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n#define SET_DIGITS \"0123456789\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic bool IsSpaceEquiv(int state) {\n\tswitch (state) {\n\tcase SCE_ECL_DEFAULT:\n\tcase SCE_ECL_COMMENT:\n\tcase SCE_ECL_COMMENTLINE:\n\tcase SCE_ECL_COMMENTLINEDOC:\n\tcase SCE_ECL_COMMENTDOCKEYWORD:\n\tcase SCE_ECL_COMMENTDOCKEYWORDERROR:\n\tcase SCE_ECL_COMMENTDOC:\n\t\treturn true;\n\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nstatic void ColouriseEclDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                            Accessor &styler) {\n\tWordList &keywords0 = *keywordlists[0];\n\tWordList &keywords1 = *keywordlists[1];\n\tWordList &keywords2 = *keywordlists[2];\n\tWordList &keywords3 = *keywordlists[3]; //Value Types\n\tWordList &keywords4 = *keywordlists[4];\n\tWordList &keywords5 = *keywordlists[5];\n\tWordList &keywords6 = *keywordlists[6];\t//Javadoc Tags\n\tWordList cplusplus;\n\tcplusplus.Set(\"beginc endc\");\n\n\tbool stylingWithinPreprocessor = false;\n\n\tCharacterSet setOKBeforeRE(CharacterSet::setNone, \"(=,\");\n\tCharacterSet setDoxygen(CharacterSet::setLower, \"$@\\\\&<>#{}[]\");\n\tCharacterSet setWordStart(CharacterSet::setAlpha, \"_\", 0x80, true);\n\tCharacterSet setWord(CharacterSet::setAlphaNum, \"._\", 0x80, true);\n\tCharacterSet setQualified(CharacterSet::setNone, \"uUxX\");\n\n\tint chPrevNonWhite = ' ';\n\tint visibleChars = 0;\n\tbool lastWordWasUUID = false;\n\tint styleBeforeDCKeyword = SCE_ECL_DEFAULT;\n\tbool continuationLine = false;\n\n\tif (initStyle == SCE_ECL_PREPROCESSOR) {\n\t\t// Set continuationLine if last character of previous line is '\\'\n\t\tint lineCurrent = styler.GetLine(startPos);\n\t\tif (lineCurrent > 0) {\n\t\t\tint chBack = styler.SafeGetCharAt(startPos-1, 0);\n\t\t\tint chBack2 = styler.SafeGetCharAt(startPos-2, 0);\n\t\t\tint lineEndChar = '!';\n\t\t\tif (chBack2 == '\\r' && chBack == '\\n') {\n\t\t\t\tlineEndChar = styler.SafeGetCharAt(startPos-3, 0);\n\t\t\t} else if (chBack == '\\n' || chBack == '\\r') {\n\t\t\t\tlineEndChar = chBack2;\n\t\t\t}\n\t\t\tcontinuationLine = lineEndChar == '\\\\';\n\t\t}\n\t}\n\n\t// look back to set chPrevNonWhite properly for better regex colouring\n\tif (startPos > 0) {\n\t\tint back = startPos;\n\t\twhile (--back && IsSpaceEquiv(styler.StyleAt(back)))\n\t\t\t;\n\t\tif (styler.StyleAt(back) == SCE_ECL_OPERATOR) {\n\t\t\tchPrevNonWhite = styler.SafeGetCharAt(back);\n\t\t}\n\t}\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\t\tif (sc.atLineStart) {\n\t\t\tif (sc.state == SCE_ECL_STRING) {\n\t\t\t\t// Prevent SCE_ECL_STRINGEOL from leaking back to previous line which\n\t\t\t\t// ends with a line continuation by locking in the state upto this position.\n\t\t\t\tsc.SetState(SCE_ECL_STRING);\n\t\t\t}\n\t\t\t// Reset states to begining of colourise so no surprises\n\t\t\t// if different sets of lines lexed.\n\t\t\tvisibleChars = 0;\n\t\t\tlastWordWasUUID = false;\n\t\t}\n\n\t\t// Handle line continuation generically.\n\t\tif (sc.ch == '\\\\') {\n\t\t\tif (sc.chNext == '\\n' || sc.chNext == '\\r') {\n\t\t\t\tsc.Forward();\n\t\t\t\tif (sc.ch == '\\r' && sc.chNext == '\\n') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tcontinuationLine = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Determine if the current state should terminate.\n\t\tswitch (sc.state) {\n\t\t\tcase SCE_ECL_ADDED:\n\t\t\tcase SCE_ECL_DELETED:\n\t\t\tcase SCE_ECL_CHANGED:\n\t\t\tcase SCE_ECL_MOVED:\n\t\t\tif (sc.atLineStart)\n\t\t\t\t\tsc.SetState(SCE_ECL_DEFAULT);\n\t\t\t\tbreak;\n\t\t\tcase SCE_ECL_OPERATOR:\n\t\t\t\tsc.SetState(SCE_ECL_DEFAULT);\n\t\t\t\tbreak;\n\t\t\tcase SCE_ECL_NUMBER:\n\t\t\t\t// We accept almost anything because of hex. and number suffixes\n\t\t\t\tif (!setWord.Contains(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_ECL_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ECL_IDENTIFIER:\n\t\t\t\tif (!setWord.Contains(sc.ch) || (sc.ch == '.')) {\n\t\t\t\t\tchar s[1000];\n\t\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\t\tif (keywords0.InList(s)) {\n\t\t\t\t\t\tlastWordWasUUID = strcmp(s, \"uuid\") == 0;\n\t\t\t\t\t\tsc.ChangeState(SCE_ECL_WORD0);\n\t\t\t\t\t} else if (keywords1.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_ECL_WORD1);\n\t\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_ECL_WORD2);\n\t\t\t\t\t} else if (keywords4.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_ECL_WORD4);\n\t\t\t\t\t} else if (keywords5.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_ECL_WORD5);\n\t\t\t\t\t}\n\t\t\t\t\telse\t//Data types are of from KEYWORD## \n\t\t\t\t\t{\n\t\t\t\t\t\tint i = static_cast<int>(strlen(s)) - 1;\n\t\t\t\t\t\twhile(i >= 0 && (isdigit(s[i]) || s[i] == '_'))\n\t\t\t\t\t\t\t--i;\n\n\t\t\t\t\t\tchar s2[1000];\n\t\t\t\t\t\tstrncpy(s2, s, i + 1);\n\t\t\t\t\t\ts2[i + 1] = 0;\n\t\t\t\t\t\tif (keywords3.InList(s2)) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_ECL_WORD3);\n\t\t\t\t\t\t} \n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(SCE_ECL_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ECL_PREPROCESSOR:\n\t\t\t\tif (sc.atLineStart && !continuationLine) {\n\t\t\t\t\tsc.SetState(SCE_ECL_DEFAULT);\n\t\t\t\t} else if (stylingWithinPreprocessor) {\n\t\t\t\t\tif (IsASpace(sc.ch)) {\n\t\t\t\t\t\tsc.SetState(SCE_ECL_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (sc.Match('/', '*') || sc.Match('/', '/')) {\n\t\t\t\t\t\tsc.SetState(SCE_ECL_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ECL_COMMENT:\n\t\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_ECL_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ECL_COMMENTDOC:\n\t\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_ECL_DEFAULT);\n\t\t\t\t} else if (sc.ch == '@' || sc.ch == '\\\\') { // JavaDoc and Doxygen support\n\t\t\t\t\t// Verify that we have the conditions to mark a comment-doc-keyword\n\t\t\t\t\tif ((IsASpace(sc.chPrev) || sc.chPrev == '*') && (!IsASpace(sc.chNext))) {\n\t\t\t\t\t\tstyleBeforeDCKeyword = SCE_ECL_COMMENTDOC;\n\t\t\t\t\t\tsc.SetState(SCE_ECL_COMMENTDOCKEYWORD);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ECL_COMMENTLINE:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_ECL_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ECL_COMMENTLINEDOC:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_ECL_DEFAULT);\n\t\t\t\t} else if (sc.ch == '@' || sc.ch == '\\\\') { // JavaDoc and Doxygen support\n\t\t\t\t\t// Verify that we have the conditions to mark a comment-doc-keyword\n\t\t\t\t\tif ((IsASpace(sc.chPrev) || sc.chPrev == '/' || sc.chPrev == '!') && (!IsASpace(sc.chNext))) {\n\t\t\t\t\t\tstyleBeforeDCKeyword = SCE_ECL_COMMENTLINEDOC;\n\t\t\t\t\t\tsc.SetState(SCE_ECL_COMMENTDOCKEYWORD);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ECL_COMMENTDOCKEYWORD:\n\t\t\t\tif ((styleBeforeDCKeyword == SCE_ECL_COMMENTDOC) && sc.Match('*', '/')) {\n\t\t\t\t\tsc.ChangeState(SCE_ECL_COMMENTDOCKEYWORDERROR);\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_ECL_DEFAULT);\n\t\t\t\t} else if (!setDoxygen.Contains(sc.ch)) {\n\t\t\t\t\tchar s[1000];\n\t\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\t\tif (!IsASpace(sc.ch) || !keywords6.InList(s+1)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_ECL_COMMENTDOCKEYWORDERROR);\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(styleBeforeDCKeyword);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ECL_STRING:\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.ChangeState(SCE_ECL_STRINGEOL);\n\t\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\t\tsc.ForwardSetState(SCE_ECL_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ECL_CHARACTER:\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.ChangeState(SCE_ECL_STRINGEOL);\n\t\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\t\tsc.ForwardSetState(SCE_ECL_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ECL_REGEX:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_ECL_DEFAULT);\n\t\t\t\t} else if (sc.ch == '/') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\twhile ((sc.ch < 0x80) && islower(sc.ch))\n\t\t\t\t\t\tsc.Forward();    // gobble regex flags\n\t\t\t\t\tsc.SetState(SCE_ECL_DEFAULT);\n\t\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\t\t// Gobble up the quoted character\n\t\t\t\t\tif (sc.chNext == '\\\\' || sc.chNext == '/') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ECL_STRINGEOL:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_ECL_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ECL_VERBATIM:\n\t\t\t\tif (sc.ch == '\\\"') {\n\t\t\t\t\tif (sc.chNext == '\\\"') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.ForwardSetState(SCE_ECL_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_ECL_UUID:\n\t\t\t\tif (sc.ch == '\\r' || sc.ch == '\\n' || sc.ch == ')') {\n\t\t\t\t\tsc.SetState(SCE_ECL_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tint lineCurrent = styler.GetLine(sc.currentPos);\n\t\tint lineState = styler.GetLineState(lineCurrent);\n\t\tif (sc.state == SCE_ECL_DEFAULT) {\n\t\t\tif (lineState) {\n\t\t\t\tsc.SetState(lineState);\n\t\t\t}\n\t\t\telse if (sc.Match('@', '\\\"')) {\n\t\t\t\tsc.SetState(SCE_ECL_VERBATIM);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (setQualified.Contains(sc.ch) && sc.chNext == '\\'') {\n\t\t\t\tsc.SetState(SCE_ECL_CHARACTER);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tif (lastWordWasUUID) {\n\t\t\t\t\tsc.SetState(SCE_ECL_UUID);\n\t\t\t\t\tlastWordWasUUID = false;\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_ECL_NUMBER);\n\t\t\t\t}\n\t\t\t} else if (setWordStart.Contains(sc.ch) || (sc.ch == '@')) {\n\t\t\t\tif (lastWordWasUUID) {\n\t\t\t\t\tsc.SetState(SCE_ECL_UUID);\n\t\t\t\t\tlastWordWasUUID = false;\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_ECL_IDENTIFIER);\n\t\t\t\t}\n\t\t\t} else if (sc.Match('/', '*')) {\n\t\t\t\tif (sc.Match(\"/**\") || sc.Match(\"/*!\")) {\t// Support of Qt/Doxygen doc. style\n\t\t\t\t\tsc.SetState(SCE_ECL_COMMENTDOC);\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_ECL_COMMENT);\n\t\t\t\t}\n\t\t\t\tsc.Forward();\t// Eat the * so it isn't used for the end of the comment\n\t\t\t} else if (sc.Match('/', '/')) {\n\t\t\t\tif ((sc.Match(\"///\") && !sc.Match(\"////\")) || sc.Match(\"//!\"))\n\t\t\t\t\t// Support of Qt/Doxygen doc. style\n\t\t\t\t\tsc.SetState(SCE_ECL_COMMENTLINEDOC);\n\t\t\t\telse\n\t\t\t\t\tsc.SetState(SCE_ECL_COMMENTLINE);\n\t\t\t} else if (sc.ch == '/' && setOKBeforeRE.Contains(chPrevNonWhite)) {\n\t\t\t\tsc.SetState(SCE_ECL_REGEX);\t// JavaScript's RegEx\n//\t\t\t} else if (sc.ch == '\\\"') {\n//\t\t\t\tsc.SetState(SCE_ECL_STRING);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_ECL_CHARACTER);\n\t\t\t} else if (sc.ch == '#' && visibleChars == 0) {\n\t\t\t\t// Preprocessor commands are alone on their line\n\t\t\t\tsc.SetState(SCE_ECL_PREPROCESSOR);\n\t\t\t\t// Skip whitespace between # and preprocessor word\n\t\t\t\tdo {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} while ((sc.ch == ' ' || sc.ch == '\\t') && sc.More());\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.SetState(SCE_ECL_DEFAULT);\n\t\t\t\t}\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_ECL_OPERATOR);\n\t\t\t}\n\t\t}\n\n\t\tif (!IsASpace(sc.ch) && !IsSpaceEquiv(sc.state)) {\n\t\t\tchPrevNonWhite = sc.ch;\n\t\t\tvisibleChars++;\n\t\t}\n\t\tcontinuationLine = false;\n\t}\n\tsc.Complete();\n\n}\n\nstatic bool IsStreamCommentStyle(int style) {\n\treturn style == SCE_ECL_COMMENT ||\n\t\tstyle == SCE_ECL_COMMENTDOC ||\n\t\tstyle == SCE_ECL_COMMENTDOCKEYWORD ||\n\t\tstyle == SCE_ECL_COMMENTDOCKEYWORDERROR;\n}\n\nbool MatchNoCase(Accessor & styler, unsigned int & pos, const char *s) {\n\tint i=0;\n\tfor (; *s; i++) {\n\t\tchar compare_char = tolower(*s);\n\t\tchar styler_char = tolower(styler.SafeGetCharAt(pos+i));\n\t\tif (compare_char != styler_char) \n\t\t\treturn false;\n\t\ts++;\n\t}\n\tpos+=i-1;\n\treturn true;\n}\n\n\n// Store both the current line's fold level and the next lines in the\n// level store to make it easy to pick up with each increment\n// and to make it possible to fiddle the current level for \"} else {\".\nstatic void FoldEclDoc(unsigned int startPos, int length, int initStyle, \n\t\t\t\t\t   WordList *[], Accessor &styler) {\n\tbool foldComment = true;\n\tbool foldPreprocessor = true;\n\tbool foldCompact = true;\n\tbool foldAtElse = true;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelCurrent = SC_FOLDLEVELBASE;\n\tif (lineCurrent > 0)\n\t\tlevelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n\tint levelMinCurrent = levelCurrent;\n\tint levelNext = levelCurrent;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (foldComment && IsStreamCommentStyle(style)) {\n\t\t\tif (!IsStreamCommentStyle(stylePrev) && (stylePrev != SCE_ECL_COMMENTLINEDOC)) {\n\t\t\t\tlevelNext++;\n\t\t\t} else if (!IsStreamCommentStyle(styleNext) && (styleNext != SCE_ECL_COMMENTLINEDOC) && !atEOL) {\n\t\t\t\t// Comments don't end at end of line and the next character may be unstyled.\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\t\tif (foldComment && (style == SCE_ECL_COMMENTLINE)) {\n\t\t\tif ((ch == '/') && (chNext == '/')) {\n\t\t\t\tchar chNext2 = styler.SafeGetCharAt(i + 2);\n\t\t\t\tif (chNext2 == '{') {\n\t\t\t\t\tlevelNext++;\n\t\t\t\t} else if (chNext2 == '}') {\n\t\t\t\t\tlevelNext--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (foldPreprocessor && (style == SCE_ECL_PREPROCESSOR)) {\n\t\t\tif (ch == '#') {\n\t\t\t\tunsigned int j = i + 1;\n\t\t\t\twhile ((j < endPos) && IsASpaceOrTab(styler.SafeGetCharAt(j))) {\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t\tif (MatchNoCase(styler, j, \"region\") || MatchNoCase(styler, j, \"if\")) {\n\t\t\t\t\tlevelNext++;\n\t\t\t\t} else if (MatchNoCase(styler, j, \"endregion\") || MatchNoCase(styler, j, \"end\")) {\n\t\t\t\t\tlevelNext--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (style == SCE_ECL_OPERATOR) {\n\t\t\tif (ch == '{') {\n\t\t\t\t// Measure the minimum before a '{' to allow\n\t\t\t\t// folding on \"} else {\"\n\t\t\t\tif (levelMinCurrent > levelNext) {\n\t\t\t\t\tlevelMinCurrent = levelNext;\n\t\t\t\t}\n\t\t\t\tlevelNext++;\n\t\t\t} else if (ch == '}') {\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\t\tif (style == SCE_ECL_WORD2) {\n\t\t\tif (MatchNoCase(styler, i, \"record\") || MatchNoCase(styler, i, \"transform\") || MatchNoCase(styler, i, \"type\") || MatchNoCase(styler, i, \"function\") || \n\t\t\t\tMatchNoCase(styler, i, \"module\") || MatchNoCase(styler, i, \"service\") || MatchNoCase(styler, i, \"interface\") || MatchNoCase(styler, i, \"ifblock\") ||\n\t\t\t\tMatchNoCase(styler, i, \"macro\") || MatchNoCase(styler, i, \"beginc++\")) {\n\t\t\t\tlevelNext++;\n\t\t\t} else if (MatchNoCase(styler, i, \"endmacro\") || MatchNoCase(styler, i, \"endc++\") || MatchNoCase(styler, i, \"end\")) {\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\t\tif (atEOL || (i == endPos-1)) {\n\t\t\tint levelUse = levelCurrent;\n\t\t\tif (foldAtElse) {\n\t\t\t\tlevelUse = levelMinCurrent;\n\t\t\t}\n\t\t\tint lev = levelUse | levelNext << 16;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (levelUse < levelNext)\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelCurrent = levelNext;\n\t\t\tlevelMinCurrent = levelCurrent;\n\t\t\tif (atEOL && (i == static_cast<unsigned int>(styler.Length()-1))) {\n\t\t\t\t// There is an empty line at end of file so give it same level and empty\n\t\t\t\tstyler.SetLevel(lineCurrent, (levelCurrent | levelCurrent << 16) | SC_FOLDLEVELWHITEFLAG);\n\t\t\t}\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!IsASpace(ch))\n\t\t\tvisibleChars++;\n\t}\n}\n\nstatic const char * const EclWordListDesc[] = {\n\t\"Keywords\",\n\t0\n};\n\nLexerModule lmECL(\n   SCLEX_ECL,\n   ColouriseEclDoc,\n   \"ecl\",\n   FoldEclDoc,\n   EclWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexEScript.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexESCRIPT.cxx\n ** Lexer for ESCRIPT\n **/\n// Copyright 2003 by Patrizio Bekerle (patrizio@bekerle.com)\n\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');\n}\n\nstatic inline bool IsAWordStart(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_');\n}\n\n\n\nstatic void ColouriseESCRIPTDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                            Accessor &styler) {\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\n\t// Do not leak onto next line\n\t/*if (initStyle == SCE_ESCRIPT_STRINGEOL)\n\t\tinitStyle = SCE_ESCRIPT_DEFAULT;*/\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tbool caseSensitive = styler.GetPropertyInt(\"escript.case.sensitive\", 0) != 0;\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\t/*if (sc.atLineStart && (sc.state == SCE_ESCRIPT_STRING)) {\n\t\t\t// Prevent SCE_ESCRIPT_STRINGEOL from leaking back to previous line\n\t\t\tsc.SetState(SCE_ESCRIPT_STRING);\n\t\t}*/\n\n\t\t// Handle line continuation generically.\n\t\tif (sc.ch == '\\\\') {\n\t\t\tif (sc.chNext == '\\n' || sc.chNext == '\\r') {\n\t\t\t\tsc.Forward();\n\t\t\t\tif (sc.ch == '\\r' && sc.chNext == '\\n') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Determine if the current state should terminate.\n\t\tif (sc.state == SCE_ESCRIPT_OPERATOR || sc.state == SCE_ESCRIPT_BRACE) {\n\t\t\tsc.SetState(SCE_ESCRIPT_DEFAULT);\n\t\t} else if (sc.state == SCE_ESCRIPT_NUMBER) {\n\t\t\tif (!IsADigit(sc.ch) || sc.ch != '.') {\n\t\t\t\tsc.SetState(SCE_ESCRIPT_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_ESCRIPT_IDENTIFIER) {\n\t\t\tif (!IsAWordChar(sc.ch) || (sc.ch == '.')) {\n\t\t\t\tchar s[100];\n\t\t\t\tif (caseSensitive) {\n\t\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\t} else {\n\t\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\t}\n\n//\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\n                                if (keywords.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_ESCRIPT_WORD);\n\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_ESCRIPT_WORD2);\n\t\t\t\t} else if (keywords3.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_ESCRIPT_WORD3);\n                                        // sc.state = SCE_ESCRIPT_IDENTIFIER;\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_ESCRIPT_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_ESCRIPT_COMMENT) {\n\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.ForwardSetState(SCE_ESCRIPT_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_ESCRIPT_COMMENTDOC) {\n\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.ForwardSetState(SCE_ESCRIPT_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_ESCRIPT_COMMENTLINE) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_ESCRIPT_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_ESCRIPT_STRING) {\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\\\') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_ESCRIPT_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_ESCRIPT_DEFAULT) {\n\t\t\tif (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_ESCRIPT_NUMBER);\n\t\t\t} else if (IsAWordStart(sc.ch) || (sc.ch == '#')) {\n\t\t\t\tsc.SetState(SCE_ESCRIPT_IDENTIFIER);\n\t\t\t} else if (sc.Match('/', '*')) {\n\t\t\t\tsc.SetState(SCE_ESCRIPT_COMMENT);\n\t\t\t\tsc.Forward();\t// Eat the * so it isn't used for the end of the comment\n\t\t\t} else if (sc.Match('/', '/')) {\n\t\t\t\tsc.SetState(SCE_ESCRIPT_COMMENTLINE);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_ESCRIPT_STRING);\n\t\t\t\t//} else if (isoperator(static_cast<char>(sc.ch))) {\n\t\t\t} else if (sc.ch == '+' || sc.ch == '-' || sc.ch == '*' || sc.ch == '/' || sc.ch == '=' || sc.ch == '<' || sc.ch == '>' || sc.ch == '&' || sc.ch == '|' || sc.ch == '!' || sc.ch == '?' || sc.ch == ':') {\n\t\t\t\tsc.SetState(SCE_ESCRIPT_OPERATOR);\n\t\t\t} else if (sc.ch == '{' || sc.ch == '}') {\n\t\t\t\tsc.SetState(SCE_ESCRIPT_BRACE);\n\t\t\t}\n\t\t}\n\n\t}\n\tsc.Complete();\n}\n\n\nstatic int classifyFoldPointESCRIPT(const char* s, const char* prevWord) {\n\tint lev = 0;\n\tif (strcmp(prevWord, \"end\") == 0) return lev;\n\tif ((strcmp(prevWord, \"else\") == 0 && strcmp(s, \"if\") == 0) || strcmp(s, \"elseif\") == 0)\n\t\treturn -1;\n\n        if (strcmp(s, \"for\") == 0 || strcmp(s, \"foreach\") == 0\n\t    || strcmp(s, \"program\") == 0 || strcmp(s, \"function\") == 0\n\t    || strcmp(s, \"while\") == 0 || strcmp(s, \"case\") == 0\n\t    || strcmp(s, \"if\") == 0 ) {\n\t\tlev = 1;\n\t} else if ( strcmp(s, \"endfor\") == 0 || strcmp(s, \"endforeach\") == 0\n\t    || strcmp(s, \"endprogram\") == 0 || strcmp(s, \"endfunction\") == 0\n\t    || strcmp(s, \"endwhile\") == 0 || strcmp(s, \"endcase\") == 0\n\t    || strcmp(s, \"endif\") == 0 ) {\n\t\tlev = -1;\n\t}\n\n\treturn lev;\n}\n\n\nstatic bool IsStreamCommentStyle(int style) {\n\treturn style == SCE_ESCRIPT_COMMENT ||\n\t       style == SCE_ESCRIPT_COMMENTDOC ||\n\t       style == SCE_ESCRIPT_COMMENTLINE;\n}\n\nstatic void FoldESCRIPTDoc(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) {\n\t//~ bool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\t// Do not know how to fold the comment at the moment.\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n        bool foldComment = true;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\n\tint lastStart = 0;\n\tchar prevWord[32] = \"\";\n\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\n\n\t\tif (foldComment && IsStreamCommentStyle(style)) {\n\t\t\tif (!IsStreamCommentStyle(stylePrev)) {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (!IsStreamCommentStyle(styleNext) && !atEOL) {\n\t\t\t\t// Comments don't end at end of line and the next character may be unstyled.\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\n\t\tif (foldComment && (style == SCE_ESCRIPT_COMMENTLINE)) {\n\t\t\tif ((ch == '/') && (chNext == '/')) {\n\t\t\t\tchar chNext2 = styler.SafeGetCharAt(i + 2);\n\t\t\t\tif (chNext2 == '{') {\n\t\t\t\t\tlevelCurrent++;\n\t\t\t\t} else if (chNext2 == '}') {\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (stylePrev == SCE_ESCRIPT_DEFAULT && style == SCE_ESCRIPT_WORD3)\n\t\t{\n\t\t\t// Store last word start point.\n\t\t\tlastStart = i;\n\t\t}\n\n\t\tif (style == SCE_ESCRIPT_WORD3) {\n\t\t\tif(iswordchar(ch) && !iswordchar(chNext)) {\n\t\t\t\tchar s[32];\n\t\t\t\tunsigned int j;\n\t\t\t\tfor(j = 0; ( j < 31 ) && ( j < i-lastStart+1 ); j++) {\n\t\t\t\t\ts[j] = static_cast<char>(tolower(styler[lastStart + j]));\n\t\t\t\t}\n\t\t\t\ts[j] = '\\0';\n\t\t\t\tlevelCurrent += classifyFoldPointESCRIPT(s, prevWord);\n\t\t\t\tstrcpy(prevWord, s);\n\t\t\t}\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t\tstrcpy(prevWord, \"\");\n\t\t}\n\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\n\n\nstatic const char * const ESCRIPTWordLists[] = {\n\t\"Primary keywords and identifiers\",\n\t\"Intrinsic functions\",\n\t\"Extended and user defined functions\",\n\t0,\n};\n\nLexerModule lmESCRIPT(SCLEX_ESCRIPT, ColouriseESCRIPTDoc, \"escript\", FoldESCRIPTDoc, ESCRIPTWordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexEiffel.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexEiffel.cxx\n ** Lexer for Eiffel.\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool isEiffelOperator(unsigned int ch) {\n\t// '.' left out as it is used to make up numbers\n\treturn ch == '*' || ch == '/' || ch == '\\\\' || ch == '-' || ch == '+' ||\n\t        ch == '(' || ch == ')' || ch == '=' ||\n\t        ch == '{' || ch == '}' || ch == '~' ||\n\t        ch == '[' || ch == ']' || ch == ';' ||\n\t        ch == '<' || ch == '>' || ch == ',' ||\n\t        ch == '.' || ch == '^' || ch == '%' || ch == ':' ||\n\t\tch == '!' || ch == '@' || ch == '?';\n}\n\nstatic inline bool IsAWordChar(unsigned int  ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_');\n}\n\nstatic inline bool IsAWordStart(unsigned int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_');\n}\n\nstatic void ColouriseEiffelDoc(unsigned int startPos,\n                            int length,\n                            int initStyle,\n                            WordList *keywordlists[],\n                            Accessor &styler) {\n\n\tWordList &keywords = *keywordlists[0];\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\tif (sc.state == SCE_EIFFEL_STRINGEOL) {\n\t\t\tif (sc.ch != '\\r' && sc.ch != '\\n') {\n\t\t\t\tsc.SetState(SCE_EIFFEL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_EIFFEL_OPERATOR) {\n\t\t\tsc.SetState(SCE_EIFFEL_DEFAULT);\n\t\t} else if (sc.state == SCE_EIFFEL_WORD) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\tif (!keywords.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_EIFFEL_IDENTIFIER);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_EIFFEL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_EIFFEL_NUMBER) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_EIFFEL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_EIFFEL_COMMENTLINE) {\n\t\t\tif (sc.ch == '\\r' || sc.ch == '\\n') {\n\t\t\t\tsc.SetState(SCE_EIFFEL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_EIFFEL_STRING) {\n\t\t\tif (sc.ch == '%') {\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.SetState(SCE_EIFFEL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_EIFFEL_CHARACTER) {\n\t\t\tif (sc.ch == '\\r' || sc.ch == '\\n') {\n\t\t\t\tsc.SetState(SCE_EIFFEL_STRINGEOL);\n\t\t\t} else if (sc.ch == '%') {\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.SetState(SCE_EIFFEL_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\tif (sc.state == SCE_EIFFEL_DEFAULT) {\n\t\t\tif (sc.ch == '-' && sc.chNext == '-') {\n\t\t\t\tsc.SetState(SCE_EIFFEL_COMMENTLINE);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_EIFFEL_STRING);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_EIFFEL_CHARACTER);\n\t\t\t} else if (IsADigit(sc.ch) || (sc.ch == '.')) {\n\t\t\t\tsc.SetState(SCE_EIFFEL_NUMBER);\n\t\t\t} else if (IsAWordStart(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_EIFFEL_WORD);\n\t\t\t} else if (isEiffelOperator(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_EIFFEL_OPERATOR);\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n}\n\nstatic bool IsEiffelComment(Accessor &styler, int pos, int len) {\n\treturn len>1 && styler[pos]=='-' && styler[pos+1]=='-';\n}\n\nstatic void FoldEiffelDocIndent(unsigned int startPos, int length, int,\n\t\t\t\t\t\t   WordList *[], Accessor &styler) {\n\tint lengthDoc = startPos + length;\n\n\t// Backtrack to previous line in case need to fix its fold status\n\tint lineCurrent = styler.GetLine(startPos);\n\tif (startPos > 0) {\n\t\tif (lineCurrent > 0) {\n\t\t\tlineCurrent--;\n\t\t\tstartPos = styler.LineStart(lineCurrent);\n\t\t}\n\t}\n\tint spaceFlags = 0;\n\tint indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsEiffelComment);\n\tchar chNext = styler[startPos];\n\tfor (int i = startPos; i < lengthDoc; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\n\t\tif ((ch == '\\r' && chNext != '\\n') || (ch == '\\n') || (i == lengthDoc)) {\n\t\t\tint lev = indentCurrent;\n\t\t\tint indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsEiffelComment);\n\t\t\tif (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {\n\t\t\t\t// Only non whitespace lines can be headers\n\t\t\t\tif ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {\n\t\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t\t} else if (indentNext & SC_FOLDLEVELWHITEFLAG) {\n\t\t\t\t\t// Line after is blank so check the next - maybe should continue further?\n\t\t\t\t\tint spaceFlags2 = 0;\n\t\t\t\t\tint indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsEiffelComment);\n\t\t\t\t\tif ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {\n\t\t\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tindentCurrent = indentNext;\n\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\tlineCurrent++;\n\t\t}\n\t}\n}\n\nstatic void FoldEiffelDocKeyWords(unsigned int startPos, int length, int /* initStyle */, WordList *[],\n                       Accessor &styler) {\n\tunsigned int lengthDoc = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tint stylePrev = 0;\n\tint styleNext = styler.StyleAt(startPos);\n\t// lastDeferred should be determined by looking back to last keyword in case\n\t// the \"deferred\" is on a line before \"class\"\n\tbool lastDeferred = false;\n\tfor (unsigned int i = startPos; i < lengthDoc; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif ((stylePrev != SCE_EIFFEL_WORD) && (style == SCE_EIFFEL_WORD)) {\n\t\t\tchar s[20];\n\t\t\tunsigned int j = 0;\n\t\t\twhile ((j < (sizeof(s) - 1)) && (iswordchar(styler[i + j]))) {\n\t\t\t\ts[j] = styler[i + j];\n\t\t\t\tj++;\n\t\t\t}\n\t\t\ts[j] = '\\0';\n\n\t\t\tif (\n\t\t\t\t(strcmp(s, \"check\") == 0) ||\n\t\t\t\t(strcmp(s, \"debug\") == 0) ||\n\t\t\t\t(strcmp(s, \"deferred\") == 0) ||\n\t\t\t\t(strcmp(s, \"do\") == 0) ||\n\t\t\t\t(strcmp(s, \"from\") == 0) ||\n\t\t\t\t(strcmp(s, \"if\") == 0) ||\n\t\t\t\t(strcmp(s, \"inspect\") == 0) ||\n\t\t\t\t(strcmp(s, \"once\") == 0)\n\t\t\t)\n\t\t\t\tlevelCurrent++;\n\t\t\tif (!lastDeferred && (strcmp(s, \"class\") == 0))\n\t\t\t\tlevelCurrent++;\n\t\t\tif (strcmp(s, \"end\") == 0)\n\t\t\t\tlevelCurrent--;\n\t\t\tlastDeferred = strcmp(s, \"deferred\") == 0;\n\t\t}\n\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t\tstylePrev = style;\n\t}\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nstatic const char * const eiffelWordListDesc[] = {\n\t\"Keywords\",\n\t0\n};\n\nLexerModule lmEiffel(SCLEX_EIFFEL, ColouriseEiffelDoc, \"eiffel\", FoldEiffelDocIndent, eiffelWordListDesc);\nLexerModule lmEiffelkw(SCLEX_EIFFELKW, ColouriseEiffelDoc, \"eiffelkw\", FoldEiffelDocKeyWords, eiffelWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexErlang.cpp",
    "content": "// Scintilla source code edit control\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n/** @file LexErlang.cxx\n ** Lexer for Erlang.\n ** Enhanced by Etienne 'Lenain' Girondel (lenaing@gmail.com)\n ** Originally wrote by Peter-Henry Mander,\n ** based on Matlab lexer by Jos Fonseca.\n **/\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic int is_radix(int radix, int ch) {\n\tint digit;\n\n\tif (36 < radix || 2 > radix)\n\t\treturn 0;\n\n\tif (isdigit(ch)) {\n\t\tdigit = ch - '0';\n\t} else if (isalnum(ch)) {\n\t\tdigit = toupper(ch) - 'A' + 10;\n\t} else {\n\t\treturn 0;\n\t}\n\n\treturn (digit < radix);\n}\n\ntypedef enum {\n\tSTATE_NULL,\n\tCOMMENT,\n\tCOMMENT_FUNCTION,\n\tCOMMENT_MODULE,\n\tCOMMENT_DOC,\n\tCOMMENT_DOC_MACRO,\n\tATOM_UNQUOTED,\n\tATOM_QUOTED,\n\tNODE_NAME_UNQUOTED,\n\tNODE_NAME_QUOTED,\n\tMACRO_START,\n\tMACRO_UNQUOTED,\n\tMACRO_QUOTED,\n\tRECORD_START,\n\tRECORD_UNQUOTED,\n\tRECORD_QUOTED,\n\tNUMERAL_START,\n\tNUMERAL_BASE_VALUE,\n\tNUMERAL_FLOAT,\n\tNUMERAL_EXPONENT,\n\tPREPROCESSOR\n} atom_parse_state_t;\n\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (ch < 0x80) && (ch != ' ') && (isalnum(ch) || ch == '_');\n}\n\nstatic void ColouriseErlangDoc(unsigned int startPos, int length, int initStyle,\n\t\t\t\t\t\t\t\tWordList *keywordlists[], Accessor &styler) {\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\tWordList &reservedWords = *keywordlists[0];\n\tWordList &erlangBIFs = *keywordlists[1];\n\tWordList &erlangPreproc = *keywordlists[2];\n\tWordList &erlangModulesAtt = *keywordlists[3];\n\tWordList &erlangDoc = *keywordlists[4];\n\tWordList &erlangDocMacro = *keywordlists[5];\n\tint radix_digits = 0;\n\tint exponent_digits = 0;\n\tatom_parse_state_t parse_state = STATE_NULL;\n\tatom_parse_state_t old_parse_state = STATE_NULL;\n\tbool to_late_to_comment = false;\n\tchar cur[100];\n\tint old_style = SCE_ERLANG_DEFAULT;\n\n\tstyler.StartAt(startPos);\n\n\tfor (; sc.More(); sc.Forward()) {\n\t\tint style = SCE_ERLANG_DEFAULT;\n\t\tif (STATE_NULL != parse_state) {\n\n\t\t\tswitch (parse_state) {\n\n\t\t\t\tcase STATE_NULL : sc.SetState(SCE_ERLANG_DEFAULT); break;\n\n\t\t\t/* COMMENTS ------------------------------------------------------*/\n\t\t\t\tcase COMMENT : {\n\t\t\t\t\tif (sc.ch != '%') {\n\t\t\t\t\t\tto_late_to_comment = true;\n\t\t\t\t\t} else if (!to_late_to_comment && sc.ch == '%') {\n\t\t\t\t\t\t// Switch to comment level 2 (Function)\n\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_COMMENT_FUNCTION);\n\t\t\t\t\t\told_style = SCE_ERLANG_COMMENT_FUNCTION;\n\t\t\t\t\t\tparse_state = COMMENT_FUNCTION;\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// V--- Falling through!\n\t\t\t\tcase COMMENT_FUNCTION : {\n\t\t\t\t\tif (sc.ch != '%') {\n\t\t\t\t\t\tto_late_to_comment = true;\n\t\t\t\t\t} else if (!to_late_to_comment && sc.ch == '%') {\n\t\t\t\t\t\t// Switch to comment level 3 (Module)\n\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_COMMENT_MODULE);\n\t\t\t\t\t\told_style = SCE_ERLANG_COMMENT_MODULE;\n\t\t\t\t\t\tparse_state = COMMENT_MODULE;\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// V--- Falling through!\n\t\t\t\tcase COMMENT_MODULE : {\n\t\t\t\t\tif (parse_state != COMMENT) {\n\t\t\t\t\t\t// Search for comment documentation\n\t\t\t\t\t\tif (sc.chNext == '@') {\n\t\t\t\t\t\t\told_parse_state = parse_state;\n\t\t\t\t\t\t\tparse_state = ('{' == sc.ch)\n\t\t\t\t\t\t\t\t\t\t\t? COMMENT_DOC_MACRO\n\t\t\t\t\t\t\t\t\t\t\t: COMMENT_DOC;\n\t\t\t\t\t\t\tsc.ForwardSetState(sc.state);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// All comments types fall here.\n\t\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\t\tto_late_to_comment = false;\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t\tcase COMMENT_DOC :\n\t\t\t\t// V--- Falling through!\n\t\t\t\tcase COMMENT_DOC_MACRO : {\n\n\t\t\t\t\tif (!isalnum(sc.ch)) {\n\t\t\t\t\t\t// Try to match documentation comment\n\t\t\t\t\t\tsc.GetCurrent(cur, sizeof(cur));\n\n\t\t\t\t\t\tif (parse_state == COMMENT_DOC_MACRO\n\t\t\t\t\t\t\t&& erlangDocMacro.InList(cur)) {\n\t\t\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_COMMENT_DOC_MACRO);\n\t\t\t\t\t\t\t\twhile (sc.ch != '}' && !sc.atLineEnd)\n\t\t\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\t} else if (erlangDoc.InList(cur)) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_COMMENT_DOC);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.ChangeState(old_style);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Switch back to old state\n\t\t\t\t\t\tsc.SetState(old_style);\n\t\t\t\t\t\tparse_state = old_parse_state;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\t\tto_late_to_comment = false;\n\t\t\t\t\t\tsc.ChangeState(old_style);\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t/* -------------------------------------------------------------- */\n\t\t\t/* Atoms ---------------------------------------------------------*/\n\t\t\t\tcase ATOM_UNQUOTED : {\n\t\t\t\t\tif ('@' == sc.ch){\n\t\t\t\t\t\tparse_state = NODE_NAME_UNQUOTED;\n\t\t\t\t\t} else if (sc.ch == ':') {\n\t\t\t\t\t\t// Searching for module name\n\t\t\t\t\t\tif (sc.chNext == ' ') {\n\t\t\t\t\t\t\t// error\n\t\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_UNKNOWN);\n\t\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\t\tif (isalnum(sc.ch))  {\n\t\t\t\t\t\t\t\tsc.GetCurrent(cur, sizeof(cur));\n\t\t\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_MODULES);\n\t\t\t\t\t\t\t\tsc.SetState(SCE_ERLANG_MODULES);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (!IsAWordChar(sc.ch)) {\n\n\t\t\t\t\t\tsc.GetCurrent(cur, sizeof(cur));\n\t\t\t\t\t\tif (reservedWords.InList(cur)) {\n\t\t\t\t\t\t\tstyle = SCE_ERLANG_KEYWORD;\n\t\t\t\t\t\t} else if (erlangBIFs.InList(cur)\n\t\t\t\t\t\t\t\t\t&& strcmp(cur,\"erlang:\")){\n\t\t\t\t\t\t\tstyle = SCE_ERLANG_BIFS;\n\t\t\t\t\t\t} else if (sc.ch == '(' || '/' == sc.ch){\n\t\t\t\t\t\t\tstyle = SCE_ERLANG_FUNCTION_NAME;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstyle = SCE_ERLANG_ATOM;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc.ChangeState(style);\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t}\n\n\t\t\t\t} break;\n\n\t\t\t\tcase ATOM_QUOTED : {\n\t\t\t\t\tif ( '@' == sc.ch ){\n\t\t\t\t\t\tparse_state = NODE_NAME_QUOTED;\n\t\t\t\t\t} else if ('\\'' == sc.ch && '\\\\' != sc.chPrev) {\n\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_ATOM);\n\t\t\t\t\t\tsc.ForwardSetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t/* -------------------------------------------------------------- */\n\t\t\t/* Node names ----------------------------------------------------*/\n\t\t\t\tcase NODE_NAME_UNQUOTED : {\n\t\t\t\t\tif ('@' == sc.ch) {\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t} else if (!IsAWordChar(sc.ch)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_NODE_NAME);\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t\tcase NODE_NAME_QUOTED : {\n\t\t\t\t\tif ('@' == sc.ch) {\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t} else if ('\\'' == sc.ch && '\\\\' != sc.chPrev) {\n\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_NODE_NAME_QUOTED);\n\t\t\t\t\t\tsc.ForwardSetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t/* -------------------------------------------------------------- */\n\t\t\t/* Records -------------------------------------------------------*/\n\t\t\t\tcase RECORD_START : {\n\t\t\t\t\tif ('\\'' == sc.ch) {\n\t\t\t\t\t\tparse_state = RECORD_QUOTED;\n\t\t\t\t\t} else if (isalpha(sc.ch) && islower(sc.ch)) {\n\t\t\t\t\t\tparse_state = RECORD_UNQUOTED;\n\t\t\t\t\t} else { // error\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t\tcase RECORD_UNQUOTED : {\n\t\t\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_RECORD);\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t\tcase RECORD_QUOTED : {\n\t\t\t\t\tif ('\\'' == sc.ch && '\\\\' != sc.chPrev) {\n\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_RECORD_QUOTED);\n\t\t\t\t\t\tsc.ForwardSetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t/* -------------------------------------------------------------- */\n\t\t\t/* Macros --------------------------------------------------------*/\n\t\t\t\tcase MACRO_START : {\n\t\t\t\t\tif ('\\'' == sc.ch) {\n\t\t\t\t\t\tparse_state = MACRO_QUOTED;\n\t\t\t\t\t} else if (isalpha(sc.ch)) {\n\t\t\t\t\t\tparse_state = MACRO_UNQUOTED;\n\t\t\t\t\t} else { // error\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t\tcase MACRO_UNQUOTED : {\n\t\t\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_MACRO);\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t\tcase MACRO_QUOTED : {\n\t\t\t\t\tif ('\\'' == sc.ch && '\\\\' != sc.chPrev) {\n\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_MACRO_QUOTED);\n\t\t\t\t\t\tsc.ForwardSetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t/* -------------------------------------------------------------- */\n\t\t\t/* Numerics ------------------------------------------------------*/\n\t\t\t/* Simple integer */\n\t\t\t\tcase NUMERAL_START : {\n\t\t\t\t\tif (isdigit(sc.ch)) {\n\t\t\t\t\t\tradix_digits *= 10;\n\t\t\t\t\t\tradix_digits += sc.ch - '0'; // Assuming ASCII here!\n\t\t\t\t\t} else if ('#' == sc.ch) {\n\t\t\t\t\t\tif (2 > radix_digits || 36 < radix_digits) {\n\t\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tparse_state = NUMERAL_BASE_VALUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ('.' == sc.ch && isdigit(sc.chNext)) {\n\t\t\t\t\t\tradix_digits = 0;\n\t\t\t\t\t\tparse_state = NUMERAL_FLOAT;\n\t\t\t\t\t} else if ('e' == sc.ch || 'E' == sc.ch) {\n\t\t\t\t\t\texponent_digits = 0;\n\t\t\t\t\t\tparse_state = NUMERAL_EXPONENT;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tradix_digits = 0;\n\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_NUMBER);\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t/* Integer in other base than 10 (x#yyy) */\n\t\t\t\tcase NUMERAL_BASE_VALUE : {\n\t\t\t\t\tif (!is_radix(radix_digits,sc.ch)) {\n\t\t\t\t\t\tradix_digits = 0;\n\n\t\t\t\t\t\tif (!isalnum(sc.ch))\n\t\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_NUMBER);\n\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t/* Float (x.yyy) */\n\t\t\t\tcase NUMERAL_FLOAT : {\n\t\t\t\t\tif ('e' == sc.ch || 'E' == sc.ch) {\n\t\t\t\t\t\texponent_digits = 0;\n\t\t\t\t\t\tparse_state = NUMERAL_EXPONENT;\n\t\t\t\t\t} else if (!isdigit(sc.ch)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_NUMBER);\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t/* Exponent, either integer or float (xEyy, x.yyEzzz) */\n\t\t\t\tcase NUMERAL_EXPONENT : {\n\t\t\t\t\tif (('-' == sc.ch || '+' == sc.ch)\n\t\t\t\t\t\t\t&& (isdigit(sc.chNext))) {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t} else if (!isdigit(sc.ch)) {\n\t\t\t\t\t\tif (0 < exponent_digits)\n\t\t\t\t\t\t\tsc.ChangeState(SCE_ERLANG_NUMBER);\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t++exponent_digits;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t/* -------------------------------------------------------------- */\n\t\t\t/* Preprocessor --------------------------------------------------*/\n\t\t\t\tcase PREPROCESSOR : {\n\t\t\t\t\tif (!IsAWordChar(sc.ch)) {\n\n\t\t\t\t\t\tsc.GetCurrent(cur, sizeof(cur));\n\t\t\t\t\t\tif (erlangPreproc.InList(cur)) {\n\t\t\t\t\t\t\tstyle = SCE_ERLANG_PREPROC;\n\t\t\t\t\t\t} else if (erlangModulesAtt.InList(cur)) {\n\t\t\t\t\t\t\tstyle = SCE_ERLANG_MODULES_ATT;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc.ChangeState(style);\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\tparse_state = STATE_NULL;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t}\n\n\t\t} /* End of : STATE_NULL != parse_state */\n\t\telse\n\t\t{\n\t\t\tswitch (sc.state) {\n\t\t\t\tcase SCE_ERLANG_VARIABLE : {\n\t\t\t\t\tif (!IsAWordChar(sc.ch))\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t} break;\n\t\t\t\tcase SCE_ERLANG_STRING : {\n\t\t\t\t\t if (sc.ch == '\\\"' && sc.chPrev != '\\\\')\n\t\t\t\t\t\tsc.ForwardSetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t} break;\n\t\t\t\tcase SCE_ERLANG_COMMENT : {\n\t\t\t\t\t if (sc.atLineEnd)\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t} break;\n\t\t\t\tcase SCE_ERLANG_CHARACTER : {\n\t\t\t\t\tif (sc.chPrev == '\\\\') {\n\t\t\t\t\t\tsc.ForwardSetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t} else if (sc.ch != '\\\\') {\n\t\t\t\t\t\tsc.ForwardSetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase SCE_ERLANG_OPERATOR : {\n\t\t\t\t\tif (sc.chPrev == '.') {\n\t\t\t\t\t\tif (sc.ch == '*' || sc.ch == '/' || sc.ch == '\\\\'\n\t\t\t\t\t\t\t|| sc.ch == '^') {\n\t\t\t\t\t\t\tsc.ForwardSetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\t\t\t\tsc.ForwardSetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t}\n\t\t}\n\n\t\tif (sc.state == SCE_ERLANG_DEFAULT) {\n\t\t\tbool no_new_state = false;\n\n\t\t\tswitch (sc.ch) {\n\t\t\t\tcase '\\\"' : sc.SetState(SCE_ERLANG_STRING); break;\n\t\t\t\tcase '$' : sc.SetState(SCE_ERLANG_CHARACTER); break;\n\t\t\t\tcase '%' : {\n\t\t\t\t\tparse_state = COMMENT;\n\t\t\t\t\tsc.SetState(SCE_ERLANG_COMMENT);\n\t\t\t\t} break;\n\t\t\t\tcase '#' : {\n\t\t\t\t\tparse_state = RECORD_START;\n\t\t\t\t\tsc.SetState(SCE_ERLANG_UNKNOWN);\n\t\t\t\t} break;\n\t\t\t\tcase '?' : {\n\t\t\t\t\tparse_state = MACRO_START;\n\t\t\t\t\tsc.SetState(SCE_ERLANG_UNKNOWN);\n\t\t\t\t} break;\n\t\t\t\tcase '\\'' : {\n\t\t\t\t\tparse_state = ATOM_QUOTED;\n\t\t\t\t\tsc.SetState(SCE_ERLANG_UNKNOWN);\n\t\t\t\t} break;\n\t\t\t\tcase '+' :\n\t\t\t\tcase '-' : {\n\t\t\t\t\tif (IsADigit(sc.chNext)) {\n\t\t\t\t\t\tparse_state = NUMERAL_START;\n\t\t\t\t\t\tradix_digits = 0;\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_UNKNOWN);\n\t\t\t\t\t} else if (sc.ch != '+') {\n\t\t\t\t\t\tparse_state = PREPROCESSOR;\n\t\t\t\t\t\tsc.SetState(SCE_ERLANG_UNKNOWN);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tdefault : no_new_state = true;\n\t\t\t}\n\n\t\t\tif (no_new_state) {\n\t\t\t\tif (isdigit(sc.ch)) {\n\t\t\t\t\tparse_state = NUMERAL_START;\n\t\t\t\t\tradix_digits = sc.ch - '0';\n\t\t\t\t\tsc.SetState(SCE_ERLANG_UNKNOWN);\n\t\t\t\t} else if (isupper(sc.ch) || '_' == sc.ch) {\n\t\t\t\t\tsc.SetState(SCE_ERLANG_VARIABLE);\n\t\t\t\t} else if (isalpha(sc.ch)) {\n\t\t\t\t\tparse_state = ATOM_UNQUOTED;\n\t\t\t\t\tsc.SetState(SCE_ERLANG_UNKNOWN);\n\t\t\t\t} else if (isoperator(static_cast<char>(sc.ch))\n\t\t\t\t\t\t\t|| sc.ch == '\\\\') {\n\t\t\t\t\tsc.SetState(SCE_ERLANG_OPERATOR);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\tsc.Complete();\n}\n\nstatic int ClassifyErlangFoldPoint(\n\tAccessor &styler,\n\tint styleNext,\n\tint keyword_start\n) {\n\tint lev = 0;\n\tif (styler.Match(keyword_start,\"case\")\n\t\t|| (\n\t\t\tstyler.Match(keyword_start,\"fun\")\n\t\t\t&& (SCE_ERLANG_FUNCTION_NAME != styleNext)\n\t\t\t)\n\t\t|| styler.Match(keyword_start,\"if\")\n\t\t|| styler.Match(keyword_start,\"query\")\n\t\t|| styler.Match(keyword_start,\"receive\")\n\t) {\n\t\t++lev;\n\t} else if (styler.Match(keyword_start,\"end\")) {\n\t\t--lev;\n\t}\n\n\treturn lev;\n}\n\nstatic void FoldErlangDoc(\n\tunsigned int startPos, int length, int initStyle,\n\tWordList** /*keywordlists*/, Accessor &styler\n) {\n\tunsigned int endPos = startPos + length;\n\tint currentLine = styler.GetLine(startPos);\n\tint lev;\n\tint previousLevel = styler.LevelAt(currentLine) & SC_FOLDLEVELNUMBERMASK;\n\tint currentLevel = previousLevel;\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tint stylePrev;\n\tint keyword_start = 0;\n\tchar ch;\n\tchar chNext = styler.SafeGetCharAt(startPos);\n\tbool atEOL;\n\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\n\t\t// Get styles\n\t\tstylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tatEOL = ((ch == '\\r') && (chNext != '\\n')) || (ch == '\\n');\n\n\t\tif (stylePrev != SCE_ERLANG_KEYWORD\n\t\t\t&& style == SCE_ERLANG_KEYWORD) {\n\t\t\tkeyword_start = i;\n\t\t}\n\n\t\t// Fold on keywords\n\t\tif (stylePrev == SCE_ERLANG_KEYWORD\n\t\t\t&& style != SCE_ERLANG_KEYWORD\n\t\t\t&& style != SCE_ERLANG_ATOM\n\t\t) {\n\t\t\tcurrentLevel += ClassifyErlangFoldPoint(styler,\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyleNext,\n\t\t\t\t\t\t\t\t\t\t\t\t\tkeyword_start);\n\t\t}\n\n\t\t// Fold on comments\n\t\tif (style == SCE_ERLANG_COMMENT\n\t\t\t|| style == SCE_ERLANG_COMMENT_MODULE\n\t\t\t|| style == SCE_ERLANG_COMMENT_FUNCTION) {\n\n\t\t\tif (ch == '%' && chNext == '{') {\n\t\t\t\tcurrentLevel++;\n\t\t\t} else if (ch == '%' && chNext == '}') {\n\t\t\t\tcurrentLevel--;\n\t\t\t}\n\t\t}\n\n\t\t// Fold on braces\n\t\tif (style == SCE_ERLANG_OPERATOR) {\n\t\t\tif (ch == '{' || ch == '(' || ch == '[') {\n\t\t\t\tcurrentLevel++;\n\t\t\t} else if (ch == '}' || ch == ')' || ch == ']') {\n\t\t\t\tcurrentLevel--;\n\t\t\t}\n\t\t}\n\n\n\t\tif (atEOL) {\n\t\t\tlev = previousLevel;\n\n\t\t\tif (currentLevel > previousLevel)\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\n\t\t\tif (lev != styler.LevelAt(currentLine))\n\t\t\t\tstyler.SetLevel(currentLine, lev);\n\n\t\t\tcurrentLine++;\n\t\t\tpreviousLevel = currentLevel;\n\t\t}\n\n\t}\n\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tstyler.SetLevel(currentLine,\n\t\t\t\t\tpreviousLevel\n\t\t\t\t\t| (styler.LevelAt(currentLine) & ~SC_FOLDLEVELNUMBERMASK));\n}\n\nstatic const char * const erlangWordListDesc[] = {\n\t\"Erlang Reserved words\",\n\t\"Erlang BIFs\",\n\t\"Erlang Preprocessor\",\n\t\"Erlang Module Attributes\",\n\t\"Erlang Documentation\",\n\t\"Erlang Documentation Macro\",\n\t0\n};\n\nLexerModule lmErlang(\n\tSCLEX_ERLANG,\n\tColouriseErlangDoc,\n\t\"erlang\",\n\tFoldErlangDoc,\n\terlangWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexFlagship.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexFlagShip.cxx\n ** Lexer for Harbour and FlagShip.\n ** (Syntactically compatible to other xBase dialects, like Clipper, dBase, Clip, FoxPro etc.)\n **/\n// Copyright 2005 by Randy Butler\n// Copyright 2010 by Xavi <jarabal/at/gmail.com> (Harbour)\n// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n// Extended to accept accented characters\nstatic inline bool IsAWordChar(int ch)\n{\n\treturn ch >= 0x80 ||\n\t\t\t\t(isalnum(ch) || ch == '_');\n}\n\nstatic void ColouriseFlagShipDoc(unsigned int startPos, int length, int initStyle,\n                                 WordList *keywordlists[], Accessor &styler)\n{\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\tWordList &keywords4 = *keywordlists[3];\n\tWordList &keywords5 = *keywordlists[4];\n\n\t// property lexer.flagship.styling.within.preprocessor\n\t//\tFor Harbour code, determines whether all preprocessor code is styled in the preprocessor style (0) or only from the\n\t//\tinitial # to the end of the command word(1, the default). It also determines how to present text, dump, and disabled code.\n\tbool stylingWithinPreprocessor = styler.GetPropertyInt(\"lexer.flagship.styling.within.preprocessor\", 1) != 0;\n\n\tCharacterSet setDoxygen(CharacterSet::setAlpha, \"$@\\\\&<>#{}[]\");\n\n\tint visibleChars = 0;\n\tint closeStringChar = 0;\n\tint styleBeforeDCKeyword = SCE_FS_DEFAULT;\n\tbool bEnableCode = initStyle < SCE_FS_DISABLEDCODE;\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\t// Determine if the current state should terminate.\n\t\tswitch (sc.state) {\n\t\t\tcase SCE_FS_OPERATOR:\n\t\t\tcase SCE_FS_OPERATOR_C:\n\t\t\tcase SCE_FS_WORDOPERATOR:\n\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C);\n\t\t\t\tbreak;\n\t\t\tcase SCE_FS_IDENTIFIER:\n\t\t\tcase SCE_FS_IDENTIFIER_C:\n\t\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\t\tchar s[64];\n\t\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(bEnableCode ? SCE_FS_KEYWORD : SCE_FS_KEYWORD_C);\n\t\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(bEnableCode ? SCE_FS_KEYWORD2 : SCE_FS_KEYWORD2_C);\n\t\t\t\t\t} else if (bEnableCode && keywords3.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_FS_KEYWORD3);\n\t\t\t\t\t} else if (bEnableCode && keywords4.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_FS_KEYWORD4);\n\t\t\t\t\t}// Else, it is really an identifier...\n\t\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_FS_NUMBER:\n\t\t\t\tif (!IsAWordChar(sc.ch) && !(sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\t\tsc.SetState(SCE_FS_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_FS_NUMBER_C:\n\t\t\t\tif (!IsAWordChar(sc.ch) && sc.ch != '.') {\n\t\t\t\t\tsc.SetState(SCE_FS_DEFAULT_C);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_FS_CONSTANT:\n\t\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_FS_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_FS_STRING:\n\t\t\tcase SCE_FS_STRING_C:\n\t\t\t\tif (sc.ch == closeStringChar) {\n\t\t\t\t\tsc.ForwardSetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C);\n\t\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\t\tsc.ChangeState(bEnableCode ? SCE_FS_STRINGEOL : SCE_FS_STRINGEOL_C);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_FS_STRINGEOL:\n\t\t\tcase SCE_FS_STRINGEOL_C:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_FS_COMMENTDOC:\n\t\t\tcase SCE_FS_COMMENTDOC_C:\n\t\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C);\n\t\t\t\t} else if (sc.ch == '@' || sc.ch == '\\\\') { // JavaDoc and Doxygen support\n\t\t\t\t\t// Verify that we have the conditions to mark a comment-doc-keyword\n\t\t\t\t\tif ((IsASpace(sc.chPrev) || sc.chPrev == '*') && (!IsASpace(sc.chNext))) {\n\t\t\t\t\t\tstyleBeforeDCKeyword = bEnableCode ? SCE_FS_COMMENTDOC : SCE_FS_COMMENTDOC_C;\n\t\t\t\t\t\tsc.SetState(SCE_FS_COMMENTDOCKEYWORD);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_FS_COMMENT:\n\t\t\tcase SCE_FS_COMMENTLINE:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_FS_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_FS_COMMENTLINEDOC:\n\t\t\tcase SCE_FS_COMMENTLINEDOC_C:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C);\n\t\t\t\t} else if (sc.ch == '@' || sc.ch == '\\\\') { // JavaDoc and Doxygen support\n\t\t\t\t\t// Verify that we have the conditions to mark a comment-doc-keyword\n\t\t\t\t\tif ((IsASpace(sc.chPrev) || sc.chPrev == '/' || sc.chPrev == '!') && (!IsASpace(sc.chNext))) {\n\t\t\t\t\t\tstyleBeforeDCKeyword = bEnableCode ? SCE_FS_COMMENTLINEDOC : SCE_FS_COMMENTLINEDOC_C;\n\t\t\t\t\t\tsc.SetState(SCE_FS_COMMENTDOCKEYWORD);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_FS_COMMENTDOCKEYWORD:\n\t\t\t\tif ((styleBeforeDCKeyword == SCE_FS_COMMENTDOC || styleBeforeDCKeyword == SCE_FS_COMMENTDOC_C) &&\n\t\t\t\t\t\tsc.Match('*', '/')) {\n\t\t\t\t\tsc.ChangeState(SCE_FS_COMMENTDOCKEYWORDERROR);\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C);\n\t\t\t\t} else if (!setDoxygen.Contains(sc.ch)) {\n\t\t\t\t\tchar s[64];\n\t\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\t\tif (!IsASpace(sc.ch) || !keywords5.InList(s + 1)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_FS_COMMENTDOCKEYWORDERROR);\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(styleBeforeDCKeyword);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_FS_PREPROCESSOR:\n\t\t\tcase SCE_FS_PREPROCESSOR_C:\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tif (!(sc.chPrev == ';' || sc.GetRelative(-2) == ';')) {\n\t\t\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C);\n\t\t\t\t\t}\n\t\t\t\t} else if (stylingWithinPreprocessor) {\n\t\t\t\t\tif (IsASpaceOrTab(sc.ch)) {\n\t\t\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C);\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.Match('/', '*') || sc.Match('/', '/') || sc.Match('&', '&')) {\n\t\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_FS_DISABLEDCODE:\n\t\t\t\tif (sc.ch == '#' && visibleChars == 0) {\n\t\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_PREPROCESSOR : SCE_FS_PREPROCESSOR_C);\n\t\t\t\t\tdo {\t// Skip whitespace between # and preprocessor word\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t} while (IsASpaceOrTab(sc.ch) && sc.More());\n\t\t\t\t\tif (sc.MatchIgnoreCase(\"pragma\")) {\n\t\t\t\t\t\tsc.Forward(6);\n\t\t\t\t\t\tdo {\t// Skip more whitespace until keyword\n\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\t} while (IsASpaceOrTab(sc.ch) && sc.More());\n\t\t\t\t\t\tif (sc.MatchIgnoreCase(\"enddump\") || sc.MatchIgnoreCase(\"__endtext\")) {\n\t\t\t\t\t\t\tbEnableCode = true;\n\t\t\t\t\t\t\tsc.SetState(SCE_FS_DISABLEDCODE);\n\t\t\t\t\t\t\tsc.Forward(sc.ch == '_' ? 8 : 6);\n\t\t\t\t\t\t\tsc.ForwardSetState(SCE_FS_DEFAULT);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_FS_DISABLEDCODE);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.ChangeState(SCE_FS_DISABLEDCODE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_FS_DATE:\n\t\t\t\tif (sc.ch == '}') {\n\t\t\t\t\tsc.ForwardSetState(SCE_FS_DEFAULT);\n\t\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\t\tsc.ChangeState(SCE_FS_STRINGEOL);\n\t\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_FS_DEFAULT || sc.state == SCE_FS_DEFAULT_C) {\n\t\t\tif (bEnableCode &&\n\t\t\t\t\t(sc.MatchIgnoreCase(\".and.\") || sc.MatchIgnoreCase(\".not.\"))) {\n\t\t\t\tsc.SetState(SCE_FS_WORDOPERATOR);\n\t\t\t\tsc.Forward(4);\n\t\t\t} else if (bEnableCode && sc.MatchIgnoreCase(\".or.\")) {\n\t\t\t\tsc.SetState(SCE_FS_WORDOPERATOR);\n\t\t\t\tsc.Forward(3);\n\t\t\t} else if (bEnableCode &&\n\t\t\t\t\t(sc.MatchIgnoreCase(\".t.\") || sc.MatchIgnoreCase(\".f.\") ||\n\t\t\t\t\t(!IsAWordChar(sc.GetRelative(3)) && sc.MatchIgnoreCase(\"nil\")))) {\n\t\t\t\tsc.SetState(SCE_FS_CONSTANT);\n\t\t\t\tsc.Forward(2);\n\t\t\t} else if (sc.Match('/', '*')) {\n\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_COMMENTDOC : SCE_FS_COMMENTDOC_C);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (bEnableCode && sc.Match('&', '&')) {\n\t\t\t\tsc.SetState(SCE_FS_COMMENTLINE);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.Match('/', '/')) {\n\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_COMMENTLINEDOC : SCE_FS_COMMENTLINEDOC_C);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (bEnableCode && sc.ch == '*' && visibleChars == 0) {\n\t\t\t\tsc.SetState(SCE_FS_COMMENT);\n\t\t\t} else if (sc.ch == '\\\"' || sc.ch == '\\'') {\n\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_STRING : SCE_FS_STRING_C);\n\t\t\t\tcloseStringChar = sc.ch;\n\t\t\t} else if (closeStringChar == '>' && sc.ch == '<') {\n\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_STRING : SCE_FS_STRING_C);\n\t\t\t} else if (sc.ch == '#' && visibleChars == 0) {\n\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_PREPROCESSOR : SCE_FS_PREPROCESSOR_C);\n\t\t\t\tdo {\t// Skip whitespace between # and preprocessor word\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} while (IsASpaceOrTab(sc.ch) && sc.More());\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C);\n\t\t\t\t} else if (sc.MatchIgnoreCase(\"include\")) {\n\t\t\t\t\tif (stylingWithinPreprocessor) {\n\t\t\t\t\t\tcloseStringChar = '>';\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.MatchIgnoreCase(\"pragma\")) {\n\t\t\t\t\tsc.Forward(6);\n\t\t\t\t\tdo {\t// Skip more whitespace until keyword\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t} while (IsASpaceOrTab(sc.ch) && sc.More());\n\t\t\t\t\tif (sc.MatchIgnoreCase(\"begindump\") || sc.MatchIgnoreCase(\"__cstream\")) {\n\t\t\t\t\t\tbEnableCode = false;\n\t\t\t\t\t\tif (stylingWithinPreprocessor) {\n\t\t\t\t\t\t\tsc.SetState(SCE_FS_DISABLEDCODE);\n\t\t\t\t\t\t\tsc.Forward(8);\n\t\t\t\t\t\t\tsc.ForwardSetState(SCE_FS_DEFAULT_C);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.SetState(SCE_FS_DISABLEDCODE);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (sc.MatchIgnoreCase(\"enddump\") || sc.MatchIgnoreCase(\"__endtext\")) {\n\t\t\t\t\t\tbEnableCode = true;\n\t\t\t\t\t\tsc.SetState(SCE_FS_DISABLEDCODE);\n\t\t\t\t\t\tsc.Forward(sc.ch == '_' ? 8 : 6);\n\t\t\t\t\t\tsc.ForwardSetState(SCE_FS_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (bEnableCode && sc.ch == '{') {\n\t\t\t\tint p = 0;\n\t\t\t\tint chSeek;\n\t\t\t\tunsigned int endPos(startPos + length);\n\t\t\t\tdo {\t// Skip whitespace\n\t\t\t\t\tchSeek = sc.GetRelative(++p);\n\t\t\t\t} while (IsASpaceOrTab(chSeek) && (sc.currentPos + p < endPos));\n\t\t\t\tif (chSeek == '^') {\n\t\t\t\t\tsc.SetState(SCE_FS_DATE);\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_FS_OPERATOR);\n\t\t\t\t}\n\t\t\t} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_NUMBER : SCE_FS_NUMBER_C);\n\t\t\t} else if (IsAWordChar(sc.ch)) {\n\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_IDENTIFIER : SCE_FS_IDENTIFIER_C);\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch)) || (bEnableCode && sc.ch == '@')) {\n\t\t\t\tsc.SetState(bEnableCode ? SCE_FS_OPERATOR : SCE_FS_OPERATOR_C);\n\t\t\t}\n\t\t}\n\n\t\tif (sc.atLineEnd) {\n\t\t\tvisibleChars = 0;\n\t\t\tcloseStringChar = 0;\n\t\t}\n\t\tif (!IsASpace(sc.ch)) {\n\t\t\tvisibleChars++;\n\t\t}\n\t}\n\tsc.Complete();\n}\n\nstatic void FoldFlagShipDoc(unsigned int startPos, int length, int,\n\t\t\t\t\t\t\t\t\tWordList *[], Accessor &styler)\n{\n\n\tint endPos = startPos + length;\n\n\t// Backtrack to previous line in case need to fix its fold status\n\tint lineCurrent = styler.GetLine(startPos);\n\tif (startPos > 0 && lineCurrent > 0) {\n\t\t\tlineCurrent--;\n\t\t\tstartPos = styler.LineStart(lineCurrent);\n\t}\n\tint spaceFlags = 0;\n\tint indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags);\n\tchar chNext = styler[startPos];\n\tfor (int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\n\t\tif ((ch == '\\r' && chNext != '\\n') || (ch == '\\n') || (i == endPos-1)) {\n\t\t\tint lev = indentCurrent;\n\t\t\tint indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags);\n\t\t\tif (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {\n\t\t\t\tif ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {\n\t\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t\t} else if (indentNext & SC_FOLDLEVELWHITEFLAG) {\n\t\t\t\t\tint spaceFlags2 = 0;\n\t\t\t\t\tint indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2);\n\t\t\t\t\tif ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {\n\t\t\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tindentCurrent = indentNext;\n\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\tlineCurrent++;\n\t\t}\n\t}\n}\n\nstatic const char * const FSWordListDesc[] = {\n\t\"Keywords Commands\",\n\t\"Std Library Functions\",\n\t\"Procedure, return, exit\",\n\t\"Class (oop)\",\n\t\"Doxygen keywords\",\n\t0\n};\n\nLexerModule lmFlagShip(SCLEX_FLAGSHIP, ColouriseFlagShipDoc, \"flagship\", FoldFlagShipDoc, FSWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexForth.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexForth.cxx\n ** Lexer for FORTH\n **/\n// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '.' ||\n\t\tch == '_' || ch == '?' || ch == '\"' || ch == '@' ||\n\t\tch == '!' || ch == '[' || ch == ']' || ch == '/' ||\n\t\tch == '+' || ch == '-' || ch == '*' || ch == '<' ||\n\t\tch == '>' || ch == '=' || ch == ';' || ch == '(' ||\n\t\tch == ')' );\n}\n\nstatic inline bool IsAWordStart(int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.');\n}\n\nstatic inline bool IsANumChar(int ch) {\n\treturn (ch < 0x80) && (isxdigit(ch) || ch == '.' || ch == 'e' || ch == 'E' );\n}\n\nstatic inline bool IsASpaceChar(int ch) {\n\treturn (ch < 0x80) && isspace(ch);\n}\n\nstatic void ColouriseForthDoc(unsigned int startPos, int length, int initStyle, WordList *keywordLists[],\n                            Accessor &styler) {\n\n    WordList &control = *keywordLists[0];\n    WordList &keyword = *keywordLists[1];\n    WordList &defword = *keywordLists[2];\n    WordList &preword1 = *keywordLists[3];\n    WordList &preword2 = *keywordLists[4];\n    WordList &strings = *keywordLists[5];\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward())\n\t{\n\t\t// Determine if the current state should terminate.\n\t\tif (sc.state == SCE_FORTH_COMMENT) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_FORTH_DEFAULT);\n\t\t\t}\n\t\t}else if (sc.state == SCE_FORTH_COMMENT_ML) {\n\t\t\tif (sc.ch == ')') {\n\t\t\t\tsc.ForwardSetState(SCE_FORTH_DEFAULT);\n\t\t\t}\n\t\t}else if (sc.state == SCE_FORTH_IDENTIFIER || sc.state == SCE_FORTH_NUMBER) {\n\t\t\t// handle numbers here too, because what we thought was a number might\n\t\t\t// turn out to be a keyword e.g. 2DUP\n\t\t\tif (IsASpaceChar(sc.ch) ) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\tint newState = sc.state == SCE_FORTH_NUMBER ? SCE_FORTH_NUMBER : SCE_FORTH_DEFAULT;\n\t\t\t\tif (control.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_FORTH_CONTROL);\n\t\t\t\t} else if (keyword.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_FORTH_KEYWORD);\n\t\t\t\t} else if (defword.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_FORTH_DEFWORD);\n\t\t\t\t}  else if (preword1.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_FORTH_PREWORD1);\n\t\t\t\t} else if (preword2.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_FORTH_PREWORD2);\n\t\t\t\t} else if (strings.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_FORTH_STRING);\n\t\t\t\t\tnewState = SCE_FORTH_STRING;\n\t\t\t\t}\n\t\t\t\tsc.SetState(newState);\n\t\t\t}\n\t\t\tif (sc.state == SCE_FORTH_NUMBER) {\n\t\t\t\tif (IsASpaceChar(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_FORTH_DEFAULT);\n\t\t\t\t} else if (!IsANumChar(sc.ch)) {\n\t\t\t\t\tsc.ChangeState(SCE_FORTH_IDENTIFIER);\n\t\t\t\t}\n\t\t\t}\n\t\t}else if (sc.state == SCE_FORTH_STRING) {\n\t\t\tif (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_FORTH_DEFAULT);\n\t\t\t}\n\t\t}else if (sc.state == SCE_FORTH_LOCALE) {\n\t\t\tif (sc.ch == '}') {\n\t\t\t\tsc.ForwardSetState(SCE_FORTH_DEFAULT);\n\t\t\t}\n\t\t}else if (sc.state == SCE_FORTH_DEFWORD) {\n\t\t\tif (IsASpaceChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_FORTH_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_FORTH_DEFAULT) {\n\t\t\tif (sc.ch == '\\\\'){\n\t\t\t\tsc.SetState(SCE_FORTH_COMMENT);\n\t\t\t} else if (sc.ch == '(' &&\n\t\t\t\t\t(sc.atLineStart || IsASpaceChar(sc.chPrev)) &&\n\t\t\t\t\t(sc.atLineEnd   || IsASpaceChar(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_FORTH_COMMENT_ML);\n\t\t\t} else if (\t(sc.ch == '$' && (IsASCII(sc.chNext) && isxdigit(sc.chNext))) ) {\n\t\t\t\t// number starting with $ is a hex number\n\t\t\t\tsc.SetState(SCE_FORTH_NUMBER);\n\t\t\t\twhile(sc.More() && IsASCII(sc.chNext) && isxdigit(sc.chNext))\n\t\t\t\t\tsc.Forward();\n\t\t\t} else if ( (sc.ch == '%' && (IsASCII(sc.chNext) && (sc.chNext == '0' || sc.chNext == '1'))) ) {\n\t\t\t\t// number starting with % is binary\n\t\t\t\tsc.SetState(SCE_FORTH_NUMBER);\n\t\t\t\twhile(sc.More() && IsASCII(sc.chNext) && (sc.chNext == '0' || sc.chNext == '1'))\n\t\t\t\t\tsc.Forward();\n\t\t\t} else if (\tIsASCII(sc.ch) &&\n\t\t\t\t\t\t(isxdigit(sc.ch) || ((sc.ch == '.' || sc.ch == '-') && IsASCII(sc.chNext) && isxdigit(sc.chNext)) )\n\t\t\t\t\t){\n\t\t\t\tsc.SetState(SCE_FORTH_NUMBER);\n\t\t\t} else if (IsAWordStart(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_FORTH_IDENTIFIER);\n\t\t\t} else if (sc.ch == '{') {\n\t\t\t\tsc.SetState(SCE_FORTH_LOCALE);\n\t\t\t} else if (sc.ch == ':' && IsASCII(sc.chNext) && isspace(sc.chNext)) {\n\t\t\t\t// highlight word definitions e.g.  : GCD ( n n -- n ) ..... ;\n\t\t\t\t//                                  ^ ^^^\n\t\t\t\tsc.SetState(SCE_FORTH_DEFWORD);\n\t\t\t\twhile(sc.More() && IsASCII(sc.chNext) && isspace(sc.chNext))\n\t\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.ch == ';' &&\n\t\t\t\t\t(sc.atLineStart || IsASpaceChar(sc.chPrev)) &&\n\t\t\t\t\t(sc.atLineEnd   || IsASpaceChar(sc.chNext))\t) {\n\t\t\t\t// mark the ';' that ends a word\n\t\t\t\tsc.SetState(SCE_FORTH_DEFWORD);\n\t\t\t\tsc.ForwardSetState(SCE_FORTH_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t}\n\tsc.Complete();\n}\n\nstatic void FoldForthDoc(unsigned int, int, int, WordList *[],\n\t\t\t\t\t\tAccessor &) {\n}\n\nstatic const char * const forthWordLists[] = {\n\t\t\t\"control keywords\",\n\t\t\t\"keywords\",\n\t\t\t\"definition words\",\n\t\t\t\"prewords with one argument\",\n\t\t\t\"prewords with two arguments\",\n\t\t\t\"string definition keywords\",\n\t\t\t0,\n\t\t};\n\nLexerModule lmForth(SCLEX_FORTH, ColouriseForthDoc, \"forth\", FoldForthDoc, forthWordLists);\n\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexFortran.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexFortran.cxx\n ** Lexer for Fortran.\n ** Writen by Chuan-jian Shen, Last changed Sep. 2003\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n/***************************************/\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n/***************************************/\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n/***************************************/\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n/***********************************************/\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '%');\n}\n/**********************************************/\nstatic inline bool IsAWordStart(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch));\n}\n/***************************************/\ninline bool IsABlank(unsigned int ch) {\n    return (ch == ' ') || (ch == 0x09) || (ch == 0x0b) ;\n}\n/***************************************/\ninline bool IsALineEnd(char ch) {\n    return ((ch == '\\n') || (ch == '\\r')) ;\n}\n/***************************************/\nunsigned int GetContinuedPos(unsigned int pos, Accessor &styler) {\n\twhile (!IsALineEnd(styler.SafeGetCharAt(pos++))) continue;\n\tif (styler.SafeGetCharAt(pos) == '\\n') pos++;\n\twhile (IsABlank(styler.SafeGetCharAt(pos++))) continue;\n\tchar chCur = styler.SafeGetCharAt(pos);\n\tif (chCur == '&') {\n\t\twhile (IsABlank(styler.SafeGetCharAt(++pos))) continue;\n\t\treturn pos;\n\t} else {\n\t\treturn pos;\n\t}\n}\n/***************************************/\nstatic void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle,\n\t\t\tWordList *keywordlists[], Accessor &styler, bool isFixFormat) {\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\t/***************************************/\n\tint posLineStart = 0, numNonBlank = 0, prevState = 0;\n\tint endPos = startPos + length;\n\t/***************************************/\n\t// backtrack to the nearest keyword\n\twhile ((startPos > 1) && (styler.StyleAt(startPos) != SCE_F_WORD)) {\n\t\tstartPos--;\n\t}\n\tstartPos = styler.LineStart(styler.GetLine(startPos));\n\tinitStyle = styler.StyleAt(startPos - 1);\n\tStyleContext sc(startPos, endPos-startPos, initStyle, styler);\n\t/***************************************/\n\tfor (; sc.More(); sc.Forward()) {\n\t\t// remember the start position of the line\n\t\tif (sc.atLineStart) {\n\t\t\tposLineStart = sc.currentPos;\n\t\t\tnumNonBlank = 0;\n\t\t\tsc.SetState(SCE_F_DEFAULT);\n\t\t}\n\t\tif (!IsASpaceOrTab(sc.ch)) numNonBlank ++;\n\t\t/***********************************************/\n\t\t// Handle the fix format generically\n\t\tint toLineStart = sc.currentPos - posLineStart;\n\t\tif (isFixFormat && (toLineStart < 6 || toLineStart >= 72)) {\n\t\t\tif ((toLineStart == 0 && (tolower(sc.ch) == 'c' || sc.ch == '*')) || sc.ch == '!') {\n                if (sc.MatchIgnoreCase(\"cdec$\") || sc.MatchIgnoreCase(\"*dec$\") || sc.MatchIgnoreCase(\"!dec$\") ||\n                    sc.MatchIgnoreCase(\"cdir$\") || sc.MatchIgnoreCase(\"*dir$\") || sc.MatchIgnoreCase(\"!dir$\") ||\n                    sc.MatchIgnoreCase(\"cms$\")  || sc.MatchIgnoreCase(\"*ms$\")  || sc.MatchIgnoreCase(\"!ms$\")  ||\n                    sc.chNext == '$') {\n                    sc.SetState(SCE_F_PREPROCESSOR);\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_F_COMMENT);\n\t\t\t\t}\n\n\t\t\t\twhile (!sc.atLineEnd && sc.More()) sc.Forward(); // Until line end\n\t\t\t} else if (toLineStart >= 72) {\n\t\t\t\tsc.SetState(SCE_F_COMMENT);\n\t\t\t\twhile (!sc.atLineEnd && sc.More()) sc.Forward(); // Until line end\n\t\t\t} else if (toLineStart < 5) {\n\t\t\t\tif (IsADigit(sc.ch))\n\t\t\t\t\tsc.SetState(SCE_F_LABEL);\n\t\t\t\telse\n\t\t\t\t\tsc.SetState(SCE_F_DEFAULT);\n\t\t\t} else if (toLineStart == 5) {\n\t\t\t\t//if (!IsASpace(sc.ch) && sc.ch != '0') {\n\t\t\t\tif (sc.ch != '\\r' && sc.ch != '\\n') {\n\t\t\t\t\tsc.SetState(SCE_F_CONTINUATION);\n                    if (!IsASpace(sc.ch) && sc.ch != '0')\n                        sc.ForwardSetState(prevState);\n\t\t\t\t} else\n\t\t\t\t\tsc.SetState(SCE_F_DEFAULT);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\t/***************************************/\n\t\t// Hanndle preprocessor directives\n\t\tif (sc.ch == '#' && numNonBlank == 1)\n\t\t{\n            sc.SetState(SCE_F_PREPROCESSOR);\n            while (!sc.atLineEnd && sc.More())\n                sc.Forward(); // Until line end\n\t\t}\n\t\t/***************************************/\n\t\t// Handle line continuation generically.\n\t\tif (!isFixFormat && sc.ch == '&' && sc.state != SCE_F_COMMENT) {\n\t\t\tchar chTemp = ' ';\n\t\t\tint j = 1;\n\t\t\twhile (IsABlank(chTemp) && j<132) {\n\t\t\t\tchTemp = static_cast<char>(sc.GetRelative(j));\n\t\t\t\tj++;\n\t\t\t}\n\t\t\tif (chTemp == '!') {\n\t\t\t\tsc.SetState(SCE_F_CONTINUATION);\n\t\t\t\tif (sc.chNext == '!') sc.ForwardSetState(SCE_F_COMMENT);\n\t\t\t} else if (chTemp == '\\r' || chTemp == '\\n') {\n\t\t\t\tint currentState = sc.state;\n\t\t\t\tsc.SetState(SCE_F_CONTINUATION);\n\t\t\t\tsc.ForwardSetState(SCE_F_DEFAULT);\n\t\t\t\twhile (IsASpace(sc.ch) && sc.More()) sc.Forward();\n\t\t\t\tif (sc.ch == '&') {\n\t\t\t\t\tsc.SetState(SCE_F_CONTINUATION);\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tsc.SetState(currentState);\n\t\t\t}\n\t\t}\n\t\t/***************************************/\n\t\t// Determine if the current state should terminate.\n\t\tif (sc.state == SCE_F_OPERATOR) {\n\t\t\tsc.SetState(SCE_F_DEFAULT);\n\t\t} else if (sc.state == SCE_F_NUMBER) {\n\t\t\tif (!(IsAWordChar(sc.ch) || sc.ch=='\\'' || sc.ch=='\\\"' || sc.ch=='.')) {\n\t\t\t\tsc.SetState(SCE_F_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_F_IDENTIFIER) {\n\t\t\tif (!IsAWordChar(sc.ch) || (sc.ch == '%')) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_F_WORD);\n\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_F_WORD2);\n\t\t\t\t} else if (keywords3.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_F_WORD3);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_F_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_F_COMMENT || sc.state == SCE_F_PREPROCESSOR) {\n\t\t\tif (sc.ch == '\\r' || sc.ch == '\\n') {\n\t\t\t\tsc.SetState(SCE_F_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_F_STRING1) {\n\t\t\tprevState = sc.state;\n\t\t\tif (sc.ch == '\\'') {\n\t\t\t\tif (sc.chNext == '\\'') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} else {\n\t\t\t\t\tsc.ForwardSetState(SCE_F_DEFAULT);\n\t\t\t\t\tprevState = SCE_F_DEFAULT;\n\t\t\t\t}\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.ChangeState(SCE_F_STRINGEOL);\n\t\t\t\tsc.ForwardSetState(SCE_F_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_F_STRING2) {\n\t\t\tprevState = sc.state;\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.ChangeState(SCE_F_STRINGEOL);\n\t\t\t\tsc.ForwardSetState(SCE_F_DEFAULT);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tif (sc.chNext == '\\\"') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} else {\n\t\t\t\t\tsc.ForwardSetState(SCE_F_DEFAULT);\n\t\t\t\t\tprevState = SCE_F_DEFAULT;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (sc.state == SCE_F_OPERATOR2) {\n\t\t\tif (sc.ch == '.') {\n\t\t\t\tsc.ForwardSetState(SCE_F_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_F_CONTINUATION) {\n\t\t\tsc.SetState(SCE_F_DEFAULT);\n\t\t} else if (sc.state == SCE_F_LABEL) {\n\t\t\tif (!IsADigit(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_F_DEFAULT);\n\t\t\t} else {\n\t\t\t\tif (isFixFormat && sc.currentPos-posLineStart > 4)\n\t\t\t\t\tsc.SetState(SCE_F_DEFAULT);\n\t\t\t\telse if (numNonBlank > 5)\n\t\t\t\t\tsc.SetState(SCE_F_DEFAULT);\n\t\t\t}\n\t\t}\n\t\t/***************************************/\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_F_DEFAULT) {\n\t\t\tif (sc.ch == '!') {\n                if (sc.MatchIgnoreCase(\"!dec$\") || sc.MatchIgnoreCase(\"!dir$\") ||\n                    sc.MatchIgnoreCase(\"!ms$\") || sc.chNext == '$') {\n\t\t\t\t\tsc.SetState(SCE_F_PREPROCESSOR);\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_F_COMMENT);\n\t\t\t\t}\n\t\t\t} else if ((!isFixFormat) && IsADigit(sc.ch) && numNonBlank == 1) {\n\t\t\t\tsc.SetState(SCE_F_LABEL);\n\t\t\t} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_F_NUMBER);\n\t\t\t} else if ((tolower(sc.ch) == 'b' || tolower(sc.ch) == 'o' ||\n\t\t\t\t\t    tolower(sc.ch) == 'z') && (sc.chNext == '\\\"' || sc.chNext == '\\'')) {\n\t\t\t\tsc.SetState(SCE_F_NUMBER);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.ch == '.' && isalpha(sc.chNext)) {\n\t\t\t\tsc.SetState(SCE_F_OPERATOR2);\n\t\t\t} else if (IsAWordStart(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_F_IDENTIFIER);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_F_STRING2);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_F_STRING1);\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_F_OPERATOR);\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n}\n/***************************************/\n// To determine the folding level depending on keywords\nstatic int classifyFoldPointFortran(const char* s, const char* prevWord, const char chNextNonBlank) {\n\tint lev = 0;\n\tif ((strcmp(prevWord, \"else\") == 0 && strcmp(s, \"if\") == 0) || strcmp(s, \"elseif\") == 0)\n\t\treturn -1;\n\tif (strcmp(s, \"associate\") == 0 || strcmp(s, \"block\") == 0\n\t    || strcmp(s, \"blockdata\") == 0 || strcmp(s, \"select\") == 0\n\t    || strcmp(s, \"do\") == 0 || strcmp(s, \"enum\") ==0\n\t    || strcmp(s, \"function\") == 0 || strcmp(s, \"interface\") == 0\n\t\t|| strcmp(s, \"module\") == 0 || strcmp(s, \"program\") == 0\n\t\t|| strcmp(s, \"subroutine\") == 0 || strcmp(s, \"then\") == 0\n\t\t|| (strcmp(s, \"type\") == 0 && chNextNonBlank != '(')\n        || strcmp(s, \"critical\") == 0){\n\t\t\tif (strcmp(prevWord, \"end\") == 0)\n\t\t\t\tlev = 0;\n\t\t\telse\n\t\t\t\tlev = 1;\n\t} else if ((strcmp(s, \"end\") == 0 && chNextNonBlank != '=')\n\t\t|| strcmp(s, \"endassociate\") == 0 || strcmp(s, \"endblock\") == 0\n\t\t|| strcmp(s, \"endblockdata\") == 0 || strcmp(s, \"endselect\") == 0\n\t\t|| strcmp(s, \"enddo\") == 0 || strcmp(s, \"endenum\") ==0\n\t\t|| strcmp(s, \"endif\") == 0 || strcmp(s, \"endforall\") == 0\n\t\t|| strcmp(s, \"endfunction\") == 0 || strcmp(s, \"endinterface\") == 0\n\t\t|| strcmp(s, \"endmodule\") == 0 || strcmp(s, \"endprogram\") == 0\n\t\t|| strcmp(s, \"endsubroutine\") == 0 || strcmp(s, \"endtype\") == 0\n\t\t|| strcmp(s, \"endwhere\") == 0 || strcmp(s, \"endcritical\") == 0\n\t\t|| (strcmp(s, \"procedure\") == 0 && strcmp(prevWord, \"module\") == 0) ) { // Take care of the \"module procedure\" statement\n\t\t\tlev = -1;\n\t} else if (strcmp(prevWord, \"end\") == 0 && strcmp(s, \"if\") == 0){ // end if\n\t\t\tlev = 0;\n\t} else if (strcmp(prevWord, \"type\") == 0 && strcmp(s, \"is\") == 0){ // type is\n                        lev = -1;\n        }\n\treturn lev;\n}\n// Folding the code\nstatic void FoldFortranDoc(unsigned int startPos, int length, int initStyle,\n\t\t\t\t\t\t   Accessor &styler, bool isFixFormat) {\n\t//\n\t// bool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\t// Do not know how to fold the comment at the moment.\n\t//\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tchar chNextNonBlank;\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\t/***************************************/\n\tint lastStart = 0;\n\tchar prevWord[32] = \"\";\n\tchar Label[6] = \"\";\n\t// Variables for do label folding.\n\tstatic int doLabels[100];\n\tstatic int posLabel=-1;\n\t/***************************************/\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tchNextNonBlank = chNext;\n\t\tunsigned int j=i+1;\n\t\twhile(IsABlank(chNextNonBlank) && j<endPos) {\n\t\t\tj ++ ;\n\t\t\tchNextNonBlank = styler.SafeGetCharAt(j);\n\t\t}\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\t//\n\t\tif (((isFixFormat && stylePrev == SCE_F_CONTINUATION) || stylePrev == SCE_F_DEFAULT || stylePrev == SCE_F_OPERATOR) && (style == SCE_F_WORD || style == SCE_F_LABEL)) {\n\t\t\t// Store last word and label start point.\n\t\t\tlastStart = i;\n\t\t}\n\t\t/***************************************/\n\t\tif (style == SCE_F_WORD) {\n\t\t\tif(iswordchar(ch) && !iswordchar(chNext)) {\n\t\t\t\tchar s[32];\n\t\t\t\tunsigned int k;\n\t\t\t\tfor(k=0; (k<31 ) && (k<i-lastStart+1 ); k++) {\n\t\t\t\t\ts[k] = static_cast<char>(tolower(styler[lastStart+k]));\n\t\t\t\t}\n\t\t\t\ts[k] = '\\0';\n\t\t\t\t// Handle the forall and where statement and structure.\n\t\t\t\tif (strcmp(s, \"forall\") == 0 || strcmp(s, \"where\") == 0) {\n\t\t\t\t\tif (strcmp(prevWord, \"end\") != 0) {\n\t\t\t\t\t\tj = i + 1;\n\t\t\t\t\t\tchar chBrace = '(', chSeek = ')', ch1 = styler.SafeGetCharAt(j);\n\t\t\t\t\t\t// Find the position of the first (\n\t\t\t\t\t\twhile (ch1 != chBrace && j<endPos) {\n\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t\tch1 = styler.SafeGetCharAt(j);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchar styBrace = styler.StyleAt(j);\n\t\t\t\t\t\tint depth = 1;\n\t\t\t\t\t\tchar chAtPos;\n\t\t\t\t\t\tchar styAtPos;\n\t\t\t\t\t\twhile (j<endPos) {\n\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t\tchAtPos = styler.SafeGetCharAt(j);\n\t\t\t\t\t\t\tstyAtPos = styler.StyleAt(j);\n\t\t\t\t\t\t\tif (styAtPos == styBrace) {\n\t\t\t\t\t\t\t\tif (chAtPos == chBrace) depth++;\n\t\t\t\t\t\t\t\tif (chAtPos == chSeek) depth--;\n\t\t\t\t\t\t\t\tif (depth == 0) break;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\twhile (j<endPos) {\n\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t\tchAtPos = styler.SafeGetCharAt(j);\n\t\t\t\t\t\t\tstyAtPos = styler.StyleAt(j);\n\t\t\t\t\t\t\tif (styAtPos == SCE_F_COMMENT || IsABlank(chAtPos)) continue;\n\t\t\t\t\t\t\tif (isFixFormat) {\n\t\t\t\t\t\t\t\tif (!IsALineEnd(chAtPos)) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tif (lineCurrent < styler.GetLine(styler.Length()-1)) {\n\t\t\t\t\t\t\t\t\t\tj = styler.LineStart(lineCurrent+1);\n\t\t\t\t\t\t\t\t\t\tif (styler.StyleAt(j+5) == SCE_F_CONTINUATION) {\n\t\t\t\t\t\t\t\t\t\t\tj += 5;\n\t\t\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tlevelCurrent++;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (chAtPos == '&' && styler.StyleAt(j) == SCE_F_CONTINUATION) {\n\t\t\t\t\t\t\t\t\tj = GetContinuedPos(j+1, styler);\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t} else if (IsALineEnd(chAtPos)) {\n\t\t\t\t\t\t\t\t\tlevelCurrent ++;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlevelCurrent += classifyFoldPointFortran(s, prevWord, chNextNonBlank);\n\t\t\t\t\t// Store the do Labels into array\n\t\t\t\t\tif (strcmp(s, \"do\") == 0 && IsADigit(chNextNonBlank)) {\n\t\t\t\t\t\tunsigned int k = 0;\n\t\t\t\t\t\tfor (i=j; (i<j+5 && i<endPos); i++) {\n\t\t\t\t\t\t\tch = styler.SafeGetCharAt(i);\n\t\t\t\t\t\t\tif (IsADigit(ch))\n\t\t\t\t\t\t\t\tLabel[k++] = ch;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tLabel[k] = '\\0';\n\t\t\t\t\t\tposLabel ++;\n\t\t\t\t\t\tdoLabels[posLabel] = atoi(Label);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstrcpy(prevWord, s);\n\t\t\t}\n\t\t} else if (style == SCE_F_LABEL) {\n\t\t\tif(IsADigit(ch) && !IsADigit(chNext)) {\n\t\t\t\tfor(j = 0; ( j < 5 ) && ( j < i-lastStart+1 ); j++) {\n\t\t\t\t\tch = styler.SafeGetCharAt(lastStart + j);\n\t\t\t\t\tif (IsADigit(ch) && styler.StyleAt(lastStart+j) == SCE_F_LABEL)\n\t\t\t\t\t\tLabel[j] = ch;\n\t\t\t\t\telse\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tLabel[j] = '\\0';\n\t\t\t\twhile (doLabels[posLabel] == atoi(Label) && posLabel > -1) {\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\t\tposLabel--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t\tstrcpy(prevWord, \"\");\n\t\t}\n\t\t/***************************************/\n\t\tif (!isspacechar(ch)) visibleChars++;\n\t}\n\t/***************************************/\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n/***************************************/\nstatic const char * const FortranWordLists[] = {\n\t\"Primary keywords and identifiers\",\n\t\"Intrinsic functions\",\n\t\"Extended and user defined functions\",\n\t0,\n};\n/***************************************/\nstatic void ColouriseFortranDocFreeFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                            Accessor &styler) {\n\tColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, false);\n}\n/***************************************/\nstatic void ColouriseFortranDocFixFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                            Accessor &styler) {\n\tColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, true);\n}\n/***************************************/\nstatic void FoldFortranDocFreeFormat(unsigned int startPos, int length, int initStyle,\n\t\tWordList *[], Accessor &styler) {\n\tFoldFortranDoc(startPos, length, initStyle,styler, false);\n}\n/***************************************/\nstatic void FoldFortranDocFixFormat(unsigned int startPos, int length, int initStyle,\n\t\tWordList *[], Accessor &styler) {\n\tFoldFortranDoc(startPos, length, initStyle,styler, true);\n}\n/***************************************/\nLexerModule lmFortran(SCLEX_FORTRAN, ColouriseFortranDocFreeFormat, \"fortran\", FoldFortranDocFreeFormat, FortranWordLists);\nLexerModule lmF77(SCLEX_F77, ColouriseFortranDocFixFormat, \"f77\", FoldFortranDocFixFormat, FortranWordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexGAP.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexGAP.cxx\n ** Lexer for the GAP language. (The GAP System for Computational Discrete Algebra)\n ** http://www.gap-system.org\n **/\n// Copyright 2007 by Istvan Szollosi ( szteven <at> gmail <dot> com )\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsGAPOperator(char ch) {\n\tif (IsASCII(ch) && isalnum(ch)) return false;\n\tif (ch == '+' || ch == '-' || ch == '*' || ch == '/' ||\n\t\tch == '^' || ch == ',' || ch == '!' || ch == '.' ||\n\t\tch == '=' || ch == '<' || ch == '>' || ch == '(' ||\n\t\tch == ')' || ch == ';' || ch == '[' || ch == ']' ||\n\t\tch == '{' || ch == '}' || ch == ':' )\n\t\treturn true;\n\treturn false;\n}\n\nstatic void GetRange(unsigned int start, unsigned int end, Accessor &styler, char *s, unsigned int len) {\n\tunsigned int i = 0;\n\twhile ((i < end - start + 1) && (i < len-1)) {\n\t\ts[i] = static_cast<char>(styler[start + i]);\n\t\ti++;\n\t}\n\ts[i] = '\\0';\n}\n\nstatic void ColouriseGAPDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) {\n\n\tWordList &keywords1 = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\tWordList &keywords4 = *keywordlists[3];\n\n\t// Do not leak onto next line\n\tif (initStyle == SCE_GAP_STRINGEOL) initStyle = SCE_GAP_DEFAULT;\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\t// Prevent SCE_GAP_STRINGEOL from leaking back to previous line\n\t\tif ( sc.atLineStart ) {\n\t\t\tif (sc.state == SCE_GAP_STRING) sc.SetState(SCE_GAP_STRING);\n\t\t\tif (sc.state == SCE_GAP_CHAR) sc.SetState(SCE_GAP_CHAR);\n\t\t}\n\n\t\t// Handle line continuation generically\n\t\tif (sc.ch == '\\\\' ) {\n\t\t\tif (sc.chNext == '\\n' || sc.chNext == '\\r') {\n\t\t\t\tsc.Forward();\n\t\t\t\tif (sc.ch == '\\r' && sc.chNext == '\\n') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Determine if the current state should terminate\n\t\tswitch (sc.state) {\n\t\t\tcase SCE_GAP_OPERATOR :\n\t\t\t\tsc.SetState(SCE_GAP_DEFAULT);\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_GAP_NUMBER :\n\t\t\t\tif (!IsADigit(sc.ch)) {\n\t\t\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\t\t\tif (!sc.atLineEnd) {\n\t\t\t\t\t\t\tif (!IsADigit(sc.chNext)) {\n\t\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\t\t\tsc.ChangeState(SCE_GAP_IDENTIFIER);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (isalpha(sc.ch) || sc.ch == '_') {\n\t\t\t\t\t\tsc.ChangeState(SCE_GAP_IDENTIFIER);\n\t\t\t\t\t}\n\t\t\t\t\telse sc.SetState(SCE_GAP_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_GAP_IDENTIFIER :\n\t\t\t\tif (!(iswordstart(static_cast<char>(sc.ch)) || sc.ch == '$')) {\n\t\t\t\t\tif (sc.ch == '\\\\') sc.Forward();\n\t\t\t\t\telse {\n\t\t\t\t\t\tchar s[1000];\n\t\t\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\t\t\tif (keywords1.InList(s)) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_GAP_KEYWORD);\n\t\t\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_GAP_KEYWORD2);\n\t\t\t\t\t\t} else if (keywords3.InList(s)) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_GAP_KEYWORD3);\n\t\t\t\t\t\t} else if (keywords4.InList(s)) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_GAP_KEYWORD4);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsc.SetState(SCE_GAP_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_GAP_COMMENT :\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.SetState(SCE_GAP_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_GAP_STRING:\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.ChangeState(SCE_GAP_STRINGEOL);\n\t\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\t\tsc.ForwardSetState(SCE_GAP_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_GAP_CHAR:\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.ChangeState(SCE_GAP_STRINGEOL);\n\t\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\t\tsc.ForwardSetState(SCE_GAP_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_GAP_STRINGEOL:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_GAP_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Determine if a new state should be entered\n\t\tif (sc.state == SCE_GAP_DEFAULT) {\n\t\t\tif (IsGAPOperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_GAP_OPERATOR);\n\t\t\t}\n\t\t\telse if (IsADigit(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_GAP_NUMBER);\n\t\t\t} else if (isalpha(sc.ch) || sc.ch == '_' || sc.ch == '\\\\' || sc.ch == '$' || sc.ch == '~') {\n\t\t\t\tsc.SetState(SCE_GAP_IDENTIFIER);\n\t\t\t\tif (sc.ch == '\\\\') sc.Forward();\n\t\t\t} else if (sc.ch == '#') {\n\t\t\t\tsc.SetState(SCE_GAP_COMMENT);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_GAP_STRING);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_GAP_CHAR);\n\t\t\t}\n\t\t}\n\n\t}\n\tsc.Complete();\n}\n\nstatic int ClassifyFoldPointGAP(const char* s) {\n\tint level = 0;\n\tif (strcmp(s, \"function\") == 0 ||\n\t\tstrcmp(s, \"do\") == 0 ||\n\t\tstrcmp(s, \"if\") == 0 ||\n\t\tstrcmp(s, \"repeat\") == 0 ) {\n\t\tlevel = 1;\n\t} else if (strcmp(s, \"end\") == 0 ||\n\t\t\tstrcmp(s, \"od\") == 0 ||\n\t\t\tstrcmp(s, \"fi\") == 0 ||\n\t\t\tstrcmp(s, \"until\") == 0 ) {\n\t\tlevel = -1;\n\t}\n\treturn level;\n}\n\nstatic void FoldGAPDoc( unsigned int startPos, int length, int initStyle,   WordList** , Accessor &styler) {\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\n\tint lastStart = 0;\n\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\n\t\tif (stylePrev != SCE_GAP_KEYWORD && style == SCE_GAP_KEYWORD) {\n\t\t\t// Store last word start point.\n\t\t\tlastStart = i;\n\t\t}\n\n\t\tif (stylePrev == SCE_GAP_KEYWORD) {\n\t\t\tif(iswordchar(ch) && !iswordchar(chNext)) {\n\t\t\t\tchar s[100];\n\t\t\t\tGetRange(lastStart, i, styler, s, sizeof(s));\n\t\t\t\tlevelCurrent += ClassifyFoldPointGAP(s);\n\t\t\t}\n\t\t}\n\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nstatic const char * const GAPWordListDesc[] = {\n\t\"Keywords 1\",\n\t\"Keywords 2\",\n\t\"Keywords 3 (unused)\",\n\t\"Keywords 4 (unused)\",\n\t0\n};\n\nLexerModule lmGAP(\n   SCLEX_GAP,\n   ColouriseGAPDoc,\n   \"gap\",\n   FoldGAPDoc,\n   GAPWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexGui4Cli.cpp",
    "content": "// Scintilla source code edit control\n// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\n/*\nThis is the Lexer for Gui4Cli, included in SciLexer.dll\n- by d. Keletsekis, 2/10/2003\n\nTo add to SciLexer.dll:\n1. Add the values below to INCLUDE\\Scintilla.iface\n2. Run the scripts/HFacer.py script\n3. Run the scripts/LexGen.py script\n\nval SCE_GC_DEFAULT=0\nval SCE_GC_COMMENTLINE=1\nval SCE_GC_COMMENTBLOCK=2\nval SCE_GC_GLOBAL=3\nval SCE_GC_EVENT=4\nval SCE_GC_ATTRIBUTE=5\nval SCE_GC_CONTROL=6\nval SCE_GC_COMMAND=7\nval SCE_GC_STRING=8\nval SCE_GC_OPERATOR=9\n*/\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n#define debug Platform::DebugPrintf\n\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch =='\\\\');\n}\n\nstatic inline bool IsAWordStart(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.');\n}\n\ninline bool isGCOperator(int ch)\n{\tif (isalnum(ch))\n\t\treturn false;\n\t// '.' left out as it is used to make up numbers\n\tif (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||\n\t\t ch == '(' || ch == ')' || ch == '=' || ch == '%' ||\n\t\t ch == '[' || ch == ']' || ch == '<' || ch == '>' ||\n\t\t ch == ',' || ch == ';' || ch == ':')\n\t\treturn true;\n\treturn false;\n}\n\n#define isSpace(x)\t\t((x)==' ' || (x)=='\\t')\n#define isNL(x)\t\t\t((x)=='\\n' || (x)=='\\r')\n#define isSpaceOrNL(x)  (isSpace(x) || isNL(x))\n#define BUFFSIZE 500\n#define isFoldPoint(x)  ((styler.LevelAt(x) & SC_FOLDLEVELNUMBERMASK) == 1024)\n\nstatic void colorFirstWord(WordList *keywordlists[], Accessor &styler,\n\t\t\t\t\t\t\t\t\tStyleContext *sc, char *buff, int length, int)\n{\n\tint c = 0;\n\twhile (sc->More() && isSpaceOrNL(sc->ch))\n\t{\tsc->Forward();\n\t}\n\tstyler.ColourTo(sc->currentPos - 1, sc->state);\n\n\tif (!IsAWordChar(sc->ch)) // comment, marker, etc..\n\t\treturn;\n\n\twhile (sc->More() && !isSpaceOrNL(sc->ch) && (c < length-1) && !isGCOperator(sc->ch))\n\t{\tbuff[c] = static_cast<char>(sc->ch);\n\t\t++c; sc->Forward();\n\t}\n\tbuff[c] = '\\0';\n\tchar *p = buff;\n\twhile (*p)\t// capitalize..\n\t{\tif (islower(*p)) *p = static_cast<char>(toupper(*p));\n\t\t++p;\n\t}\n\n\tWordList &kGlobal\t\t= *keywordlists[0];\t// keyword lists set by the user\n\tWordList &kEvent\t\t= *keywordlists[1];\n\tWordList &kAttribute\t= *keywordlists[2];\n\tWordList &kControl\t= *keywordlists[3];\n\tWordList &kCommand\t= *keywordlists[4];\n\n\tint state = 0;\n\t// int level = styler.LevelAt(line) & SC_FOLDLEVELNUMBERMASK;\n\t// debug (\"line = %d, level = %d\", line, level);\n\n\tif\t     (kGlobal.InList(buff))\t\tstate = SCE_GC_GLOBAL;\n\telse if (kAttribute.InList(buff))\tstate = SCE_GC_ATTRIBUTE;\n\telse if (kControl.InList(buff))\t\tstate = SCE_GC_CONTROL;\n\telse if (kCommand.InList(buff))\t\tstate = SCE_GC_COMMAND;\n\telse if (kEvent.InList(buff))\t\t\tstate = SCE_GC_EVENT;\n\n\tif (state)\n\t{\tsc->ChangeState(state);\n\t\tstyler.ColourTo(sc->currentPos - 1, sc->state);\n\t\tsc->ChangeState(SCE_GC_DEFAULT);\n\t}\n\telse\n\t{\tsc->ChangeState(SCE_GC_DEFAULT);\n\t\tstyler.ColourTo(sc->currentPos - 1, sc->state);\n\t}\n}\n\n// Main colorizing function called by Scintilla\nstatic void\nColouriseGui4CliDoc(unsigned int startPos, int length, int initStyle,\n                    WordList *keywordlists[], Accessor &styler)\n{\n\tstyler.StartAt(startPos);\n\n\tint quotestart = 0, oldstate, currentline = styler.GetLine(startPos);\n\tstyler.StartSegment(startPos);\n\tbool noforward;\n\tchar buff[BUFFSIZE+1];\t// buffer for command name\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\tbuff[0] = '\\0'; // cbuff = 0;\n\n\tif (sc.state != SCE_GC_COMMENTBLOCK) // colorize 1st word..\n\t\tcolorFirstWord(keywordlists, styler, &sc, buff, BUFFSIZE, currentline);\n\n\twhile (sc.More())\n\t{\tnoforward = 0;\n\n\t\tswitch (sc.ch)\n\t\t{\n\t\t\tcase '/':\n\t\t\t\tif (sc.state == SCE_GC_COMMENTBLOCK || sc.state == SCE_GC_STRING)\n\t\t\t\t\tbreak;\n\t\t\t\tif (sc.chNext == '/')\t// line comment\n\t\t\t\t{\tsc.SetState (SCE_GC_COMMENTLINE);\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tstyler.ColourTo(sc.currentPos, sc.state);\n\t\t\t\t}\n\t\t\t\telse if (sc.chNext == '*')\t// block comment\n\t\t\t\t{\tsc.SetState(SCE_GC_COMMENTBLOCK);\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tstyler.ColourTo(sc.currentPos, sc.state);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tstyler.ColourTo(sc.currentPos, sc.state);\n\t\t\t\tbreak;\n\n\t\t\tcase '*':\t// end of comment block, or operator..\n\t\t\t\tif (sc.state == SCE_GC_STRING)\n\t\t\t\t\tbreak;\n\t\t\t\tif (sc.state == SCE_GC_COMMENTBLOCK && sc.chNext == '/')\n\t\t\t\t{\tsc.Forward();\n\t\t\t\t\tstyler.ColourTo(sc.currentPos, sc.state);\n\t\t\t\t\tsc.ChangeState (SCE_GC_DEFAULT);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tstyler.ColourTo(sc.currentPos, sc.state);\n\t\t\t\tbreak;\n\n\t\t\tcase '\\'':\tcase '\\\"': // strings..\n\t\t\t\tif (sc.state == SCE_GC_COMMENTBLOCK || sc.state == SCE_GC_COMMENTLINE)\n\t\t\t\t\tbreak;\n\t\t\t\tif (sc.state == SCE_GC_STRING)\n\t\t\t\t{\tif (sc.ch == quotestart)\t// match same quote char..\n\t\t\t\t\t{\tstyler.ColourTo(sc.currentPos, sc.state);\n\t\t\t\t\t\tsc.ChangeState(SCE_GC_DEFAULT);\n\t\t\t\t\t\tquotestart = 0;\n\t\t\t\t}\t}\n\t\t\t\telse\n\t\t\t\t{\tstyler.ColourTo(sc.currentPos - 1, sc.state);\n\t\t\t\t\tsc.ChangeState(SCE_GC_STRING);\n\t\t\t\t\tquotestart = sc.ch;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase ';':\t// end of commandline character\n\t\t\t\tif (sc.state != SCE_GC_COMMENTBLOCK && sc.state != SCE_GC_COMMENTLINE &&\n\t\t\t\t\t sc.state != SCE_GC_STRING)\n\t\t\t\t{\n\t\t\t\t\tstyler.ColourTo(sc.currentPos - 1, sc.state);\n\t\t\t\t\tstyler.ColourTo(sc.currentPos, SCE_GC_OPERATOR);\n\t\t\t\t\tsc.ChangeState(SCE_GC_DEFAULT);\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tcolorFirstWord(keywordlists, styler, &sc, buff, BUFFSIZE, currentline);\n\t\t\t\t\tnoforward = 1; // don't move forward - already positioned at next char..\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase '+': case '-': case '=':\tcase '!':\t// operators..\n\t\t\tcase '<': case '>': case '&': case '|': case '$':\n\t\t\t\tif (sc.state != SCE_GC_COMMENTBLOCK && sc.state != SCE_GC_COMMENTLINE &&\n\t\t\t\t\t sc.state != SCE_GC_STRING)\n\t\t\t\t{\n\t\t\t\t\tstyler.ColourTo(sc.currentPos - 1, sc.state);\n\t\t\t\t\tstyler.ColourTo(sc.currentPos, SCE_GC_OPERATOR);\n\t\t\t\t\tsc.ChangeState(SCE_GC_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase '\\\\':\t// escape - same as operator, but also mark in strings..\n\t\t\t\tif (sc.state != SCE_GC_COMMENTBLOCK && sc.state != SCE_GC_COMMENTLINE)\n\t\t\t\t{\n\t\t\t\t\toldstate = sc.state;\n\t\t\t\t\tstyler.ColourTo(sc.currentPos - 1, sc.state);\n\t\t\t\t\tsc.Forward(); // mark also the next char..\n\t\t\t\t\tstyler.ColourTo(sc.currentPos, SCE_GC_OPERATOR);\n\t\t\t\t\tsc.ChangeState(oldstate);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase '\\n': case '\\r':\n\t\t\t\t++currentline;\n\t\t\t\tif (sc.state == SCE_GC_COMMENTLINE)\n\t\t\t\t{\tstyler.ColourTo(sc.currentPos, sc.state);\n\t\t\t\t\tsc.ChangeState (SCE_GC_DEFAULT);\n\t\t\t\t}\n\t\t\t\telse if (sc.state != SCE_GC_COMMENTBLOCK)\n\t\t\t\t{\tcolorFirstWord(keywordlists, styler, &sc, buff, BUFFSIZE, currentline);\n\t\t\t\t\tnoforward = 1; // don't move forward - already positioned at next char..\n\t\t\t\t}\n\t\t\t\tbreak;\n\n//\t\t\tcase ' ': case '\\t':\n//\t\t\tdefault :\n\t\t}\n\n\t\tif (!noforward) sc.Forward();\n\n\t}\n\tsc.Complete();\n}\n\n// Main folding function called by Scintilla - (based on props (.ini) files function)\nstatic void FoldGui4Cli(unsigned int startPos, int length, int,\n\t\t\t\t\t\t\t\tWordList *[], Accessor &styler)\n{\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tbool headerPoint = false;\n\n\tfor (unsigned int i = startPos; i < endPos; i++)\n\t{\n\t\tchar ch = chNext;\n\t\tchNext = styler[i+1];\n\n\t\tint style = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\n\t\tif (style == SCE_GC_EVENT || style == SCE_GC_GLOBAL)\n\t\t{\theaderPoint = true; // fold at events and globals\n\t\t}\n\n\t\tif (atEOL)\n\t\t{\tint lev = SC_FOLDLEVELBASE+1;\n\n\t\t\tif (headerPoint)\n\t\t\t\tlev = SC_FOLDLEVELBASE;\n\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\n\t\t\tif (headerPoint)\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) // set level, if not already correct\n\t\t\t{\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\n\t\t\tlineCurrent++;\t\t// re-initialize our flags\n\t\t\tvisibleChars = 0;\n\t\t\theaderPoint = false;\n\t\t}\n\n\t\tif (!(isspacechar(ch))) // || (style == SCE_GC_COMMENTLINE) || (style != SCE_GC_COMMENTBLOCK)))\n\t\t\tvisibleChars++;\n\t}\n\n\tint lev = headerPoint ? SC_FOLDLEVELBASE : SC_FOLDLEVELBASE+1;\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, lev | flagsNext);\n}\n\n// I have no idea what these are for.. probably accessible by some message.\nstatic const char * const gui4cliWordListDesc[] = {\n\t\"Globals\", \"Events\", \"Attributes\", \"Control\", \"Commands\",\n\t0\n};\n\n// Declare language & pass our function pointers to Scintilla\nLexerModule lmGui4Cli(SCLEX_GUI4CLI, ColouriseGui4CliDoc, \"gui4cli\", FoldGui4Cli, gui4cliWordListDesc);\n\n#undef debug\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexHTML.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexHTML.cxx\n ** Lexer for HTML.\n **/\n// Copyright 1998-2005 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n#define SCE_HA_JS (SCE_HJA_START - SCE_HJ_START)\n#define SCE_HA_VBS (SCE_HBA_START - SCE_HB_START)\n#define SCE_HA_PYTHON (SCE_HPA_START - SCE_HP_START)\n\nenum script_type { eScriptNone = 0, eScriptJS, eScriptVBS, eScriptPython, eScriptPHP, eScriptXML, eScriptSGML, eScriptSGMLblock, eScriptComment };\nenum script_mode { eHtml = 0, eNonHtmlScript, eNonHtmlPreProc, eNonHtmlScriptPreProc };\n\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');\n}\n\nstatic inline bool IsAWordStart(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_');\n}\n\ninline bool IsOperator(int ch) {\n\tif (IsASCII(ch) && isalnum(ch))\n\t\treturn false;\n\t// '.' left out as it is used to make up numbers\n\tif (ch == '%' || ch == '^' || ch == '&' || ch == '*' ||\n\t        ch == '(' || ch == ')' || ch == '-' || ch == '+' ||\n\t        ch == '=' || ch == '|' || ch == '{' || ch == '}' ||\n\t        ch == '[' || ch == ']' || ch == ':' || ch == ';' ||\n\t        ch == '<' || ch == '>' || ch == ',' || ch == '/' ||\n\t        ch == '?' || ch == '!' || ch == '.' || ch == '~')\n\t\treturn true;\n\treturn false;\n}\n\nstatic void GetTextSegment(Accessor &styler, unsigned int start, unsigned int end, char *s, size_t len) {\n\tunsigned int i = 0;\n\tfor (; (i < end - start + 1) && (i < len-1); i++) {\n\t\ts[i] = static_cast<char>(MakeLowerCase(styler[start + i]));\n\t}\n\ts[i] = '\\0';\n}\n\nstatic const char *GetNextWord(Accessor &styler, unsigned int start, char *s, size_t sLen) {\n\n\tunsigned int i = 0;\n\tfor (; i < sLen-1; i++) {\n\t\tchar ch = static_cast<char>(styler.SafeGetCharAt(start + i));\n\t\tif ((i == 0) && !IsAWordStart(ch))\n\t\t\tbreak;\n\t\tif ((i > 0) && !IsAWordChar(ch))\n\t\t\tbreak;\n\t\ts[i] = ch;\n\t}\n\ts[i] = '\\0';\n\n\treturn s;\n}\n\nstatic script_type segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigned int end, script_type prevValue) {\n\tchar s[100];\n\tGetTextSegment(styler, start, end, s, sizeof(s));\n\t//Platform::DebugPrintf(\"Scripting indicator [%s]\\n\", s);\n\tif (strstr(s, \"src\"))\t// External script\n\t\treturn eScriptNone;\n\tif (strstr(s, \"vbs\"))\n\t\treturn eScriptVBS;\n\tif (strstr(s, \"pyth\"))\n\t\treturn eScriptPython;\n\tif (strstr(s, \"javas\"))\n\t\treturn eScriptJS;\n\tif (strstr(s, \"jscr\"))\n\t\treturn eScriptJS;\n\tif (strstr(s, \"php\"))\n\t\treturn eScriptPHP;\n\tif (strstr(s, \"xml\")) {\n\t\tconst char *xml = strstr(s, \"xml\");\n\t\tfor (const char *t=s; t<xml; t++) {\n\t\t\tif (!IsASpace(*t)) {\n\t\t\t\treturn prevValue;\n\t\t\t}\n\t\t}\n\t\treturn eScriptXML;\n\t}\n\n\treturn prevValue;\n}\n\nstatic int PrintScriptingIndicatorOffset(Accessor &styler, unsigned int start, unsigned int end) {\n\tint iResult = 0;\n\tchar s[100];\n\tGetTextSegment(styler, start, end, s, sizeof(s));\n\tif (0 == strncmp(s, \"php\", 3)) {\n\t\tiResult = 3;\n\t}\n\n\treturn iResult;\n}\n\nstatic script_type ScriptOfState(int state) {\n\tif ((state >= SCE_HP_START) && (state <= SCE_HP_IDENTIFIER)) {\n\t\treturn eScriptPython;\n\t} else if ((state >= SCE_HB_START) && (state <= SCE_HB_STRINGEOL)) {\n\t\treturn eScriptVBS;\n\t} else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_REGEX)) {\n\t\treturn eScriptJS;\n\t} else if ((state >= SCE_HPHP_DEFAULT) && (state <= SCE_HPHP_COMMENTLINE)) {\n\t\treturn eScriptPHP;\n\t} else if ((state >= SCE_H_SGML_DEFAULT) && (state < SCE_H_SGML_BLOCK_DEFAULT)) {\n\t\treturn eScriptSGML;\n\t} else if (state == SCE_H_SGML_BLOCK_DEFAULT) {\n\t\treturn eScriptSGMLblock;\n\t} else {\n\t\treturn eScriptNone;\n\t}\n}\n\nstatic int statePrintForState(int state, script_mode inScriptType) {\n\tint StateToPrint = state;\n\n\tif (state >= SCE_HJ_START) {\n\t\tif ((state >= SCE_HP_START) && (state <= SCE_HP_IDENTIFIER)) {\n\t\t\tStateToPrint = state + ((inScriptType == eNonHtmlScript) ? 0 : SCE_HA_PYTHON);\n\t\t} else if ((state >= SCE_HB_START) && (state <= SCE_HB_STRINGEOL)) {\n\t\t\tStateToPrint = state + ((inScriptType == eNonHtmlScript) ? 0 : SCE_HA_VBS);\n\t\t} else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_REGEX)) {\n\t\t\tStateToPrint = state + ((inScriptType == eNonHtmlScript) ? 0 : SCE_HA_JS);\n\t\t}\n\t}\n\n\treturn StateToPrint;\n}\n\nstatic int stateForPrintState(int StateToPrint) {\n\tint state;\n\n\tif ((StateToPrint >= SCE_HPA_START) && (StateToPrint <= SCE_HPA_IDENTIFIER)) {\n\t\tstate = StateToPrint - SCE_HA_PYTHON;\n\t} else if ((StateToPrint >= SCE_HBA_START) && (StateToPrint <= SCE_HBA_STRINGEOL)) {\n\t\tstate = StateToPrint - SCE_HA_VBS;\n\t} else if ((StateToPrint >= SCE_HJA_START) && (StateToPrint <= SCE_HJA_REGEX)) {\n\t\tstate = StateToPrint - SCE_HA_JS;\n\t} else {\n\t\tstate = StateToPrint;\n\t}\n\n\treturn state;\n}\n\nstatic inline bool IsNumber(unsigned int start, Accessor &styler) {\n\treturn IsADigit(styler[start]) || (styler[start] == '.') ||\n\t       (styler[start] == '-') || (styler[start] == '#');\n}\n\nstatic inline bool isStringState(int state) {\n\tbool bResult;\n\n\tswitch (state) {\n\tcase SCE_HJ_DOUBLESTRING:\n\tcase SCE_HJ_SINGLESTRING:\n\tcase SCE_HJA_DOUBLESTRING:\n\tcase SCE_HJA_SINGLESTRING:\n\tcase SCE_HB_STRING:\n\tcase SCE_HBA_STRING:\n\tcase SCE_HP_STRING:\n\tcase SCE_HP_CHARACTER:\n\tcase SCE_HP_TRIPLE:\n\tcase SCE_HP_TRIPLEDOUBLE:\n\tcase SCE_HPA_STRING:\n\tcase SCE_HPA_CHARACTER:\n\tcase SCE_HPA_TRIPLE:\n\tcase SCE_HPA_TRIPLEDOUBLE:\n\tcase SCE_HPHP_HSTRING:\n\tcase SCE_HPHP_SIMPLESTRING:\n\tcase SCE_HPHP_HSTRING_VARIABLE:\n\tcase SCE_HPHP_COMPLEX_VARIABLE:\n\t\tbResult = true;\n\t\tbreak;\n\tdefault :\n\t\tbResult = false;\n\t\tbreak;\n\t}\n\treturn bResult;\n}\n\nstatic inline bool stateAllowsTermination(int state) {\n\tbool allowTermination = !isStringState(state);\n\tif (allowTermination) {\n\t\tswitch (state) {\n\t\tcase SCE_HB_COMMENTLINE:\n\t\tcase SCE_HPHP_COMMENT:\n\t\tcase SCE_HP_COMMENTLINE:\n\t\tcase SCE_HPA_COMMENTLINE:\n\t\t\tallowTermination = false;\n\t\t}\n\t}\n\treturn allowTermination;\n}\n\n// not really well done, since it's only comments that should lex the %> and <%\nstatic inline bool isCommentASPState(int state) {\n\tbool bResult;\n\n\tswitch (state) {\n\tcase SCE_HJ_COMMENT:\n\tcase SCE_HJ_COMMENTLINE:\n\tcase SCE_HJ_COMMENTDOC:\n\tcase SCE_HB_COMMENTLINE:\n\tcase SCE_HP_COMMENTLINE:\n\tcase SCE_HPHP_COMMENT:\n\tcase SCE_HPHP_COMMENTLINE:\n\t\tbResult = true;\n\t\tbreak;\n\tdefault :\n\t\tbResult = false;\n\t\tbreak;\n\t}\n\treturn bResult;\n}\n\nstatic void classifyAttribHTML(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {\n\tbool wordIsNumber = IsNumber(start, styler);\n\tchar chAttr = SCE_H_ATTRIBUTEUNKNOWN;\n\tif (wordIsNumber) {\n\t\tchAttr = SCE_H_NUMBER;\n\t} else {\n\t\tchar s[100];\n\t\tGetTextSegment(styler, start, end, s, sizeof(s));\n\t\tif (keywords.InList(s))\n\t\t\tchAttr = SCE_H_ATTRIBUTE;\n\t}\n\tif ((chAttr == SCE_H_ATTRIBUTEUNKNOWN) && !keywords)\n\t\t// No keywords -> all are known\n\t\tchAttr = SCE_H_ATTRIBUTE;\n\tstyler.ColourTo(end, chAttr);\n}\n\nstatic int classifyTagHTML(unsigned int start, unsigned int end,\n                           WordList &keywords, Accessor &styler, bool &tagDontFold,\n\t\t\t   bool caseSensitive, bool isXml, bool allowScripts) {\n\tchar withSpace[30 + 2] = \" \";\n\tconst char *s = withSpace + 1;\n\t// Copy after the '<'\n\tunsigned int i = 1;\n\tfor (unsigned int cPos = start; cPos <= end && i < 30; cPos++) {\n\t\tchar ch = styler[cPos];\n\t\tif ((ch != '<') && (ch != '/')) {\n\t\t\twithSpace[i++] = caseSensitive ? ch : static_cast<char>(MakeLowerCase(ch));\n\t\t}\n\t}\n\n\t//The following is only a quick hack, to see if this whole thing would work\n\t//we first need the tagname with a trailing space...\n\twithSpace[i] = ' ';\n\twithSpace[i+1] = '\\0';\n\n\t// if the current language is XML, I can fold any tag\n\t// if the current language is HTML, I don't want to fold certain tags (input, meta, etc.)\n\t//...to find it in the list of no-container-tags\n\ttagDontFold = (!isXml) && (NULL != strstr(\" area base basefont br col command embed frame hr img input isindex keygen link meta param source track wbr \", withSpace));\n\n\t//now we can remove the trailing space\n\twithSpace[i] = '\\0';\n\n\t// No keywords -> all are known\n\tchar chAttr = SCE_H_TAGUNKNOWN;\n\tif (s[0] == '!') {\n\t\tchAttr = SCE_H_SGML_DEFAULT;\n\t} else if (!keywords || keywords.InList(s)) {\n\t\tchAttr = SCE_H_TAG;\n\t}\n\tstyler.ColourTo(end, chAttr);\n\tif (chAttr == SCE_H_TAG) {\n\t\tif (allowScripts && 0 == strcmp(s, \"script\")) {\n\t\t\t// check to see if this is a self-closing tag by sniffing ahead\n\t\t\tbool isSelfClose = false;\n\t\t\tfor (unsigned int cPos = end; cPos <= end + 200; cPos++) {\n\t\t\t\tchar ch = styler.SafeGetCharAt(cPos, '\\0');\n\t\t\t\tif (ch == '\\0' || ch == '>')\n\t\t\t\t\tbreak;\n\t\t\t\telse if (ch == '/' && styler.SafeGetCharAt(cPos + 1, '\\0') == '>') {\n\t\t\t\t\tisSelfClose = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// do not enter a script state if the tag self-closed\n\t\t\tif (!isSelfClose)\n\t\t\t\tchAttr = SCE_H_SCRIPT;\n\t\t} else if (!isXml && 0 == strcmp(s, \"comment\")) {\n\t\t\tchAttr = SCE_H_COMMENT;\n\t\t}\n\t}\n\treturn chAttr;\n}\n\nstatic void classifyWordHTJS(unsigned int start, unsigned int end,\n                             WordList &keywords, Accessor &styler, script_mode inScriptType) {\n\tchar s[30 + 1];\n\tunsigned int i = 0;\n\tfor (; i < end - start + 1 && i < 30; i++) {\n\t\ts[i] = styler[start + i];\n\t}\n\ts[i] = '\\0';\n\n\tchar chAttr = SCE_HJ_WORD;\n\tbool wordIsNumber = IsADigit(s[0]) || ((s[0] == '.') && IsADigit(s[1]));\n\tif (wordIsNumber) {\n\t\tchAttr = SCE_HJ_NUMBER;\n\t} else if (keywords.InList(s)) {\n\t\tchAttr = SCE_HJ_KEYWORD;\n\t}\n\tstyler.ColourTo(end, statePrintForState(chAttr, inScriptType));\n}\n\nstatic int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, script_mode inScriptType) {\n\tchar chAttr = SCE_HB_IDENTIFIER;\n\tbool wordIsNumber = IsADigit(styler[start]) || (styler[start] == '.');\n\tif (wordIsNumber)\n\t\tchAttr = SCE_HB_NUMBER;\n\telse {\n\t\tchar s[100];\n\t\tGetTextSegment(styler, start, end, s, sizeof(s));\n\t\tif (keywords.InList(s)) {\n\t\t\tchAttr = SCE_HB_WORD;\n\t\t\tif (strcmp(s, \"rem\") == 0)\n\t\t\t\tchAttr = SCE_HB_COMMENTLINE;\n\t\t}\n\t}\n\tstyler.ColourTo(end, statePrintForState(chAttr, inScriptType));\n\tif (chAttr == SCE_HB_COMMENTLINE)\n\t\treturn SCE_HB_COMMENTLINE;\n\telse\n\t\treturn SCE_HB_DEFAULT;\n}\n\nstatic void classifyWordHTPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord, script_mode inScriptType, bool isMako) {\n\tbool wordIsNumber = IsADigit(styler[start]);\n\tchar s[30 + 1];\n\tunsigned int i = 0;\n\tfor (; i < end - start + 1 && i < 30; i++) {\n\t\ts[i] = styler[start + i];\n\t}\n\ts[i] = '\\0';\n\tchar chAttr = SCE_HP_IDENTIFIER;\n\tif (0 == strcmp(prevWord, \"class\"))\n\t\tchAttr = SCE_HP_CLASSNAME;\n\telse if (0 == strcmp(prevWord, \"def\"))\n\t\tchAttr = SCE_HP_DEFNAME;\n\telse if (wordIsNumber)\n\t\tchAttr = SCE_HP_NUMBER;\n\telse if (keywords.InList(s))\n\t\tchAttr = SCE_HP_WORD;\n\telse if (isMako && 0 == strcmp(s, \"block\"))\n\t\tchAttr = SCE_HP_WORD;\n\tstyler.ColourTo(end, statePrintForState(chAttr, inScriptType));\n\tstrcpy(prevWord, s);\n}\n\n// Update the word colour to default or keyword\n// Called when in a PHP word\nstatic void classifyWordHTPHP(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {\n\tchar chAttr = SCE_HPHP_DEFAULT;\n\tbool wordIsNumber = IsADigit(styler[start]) || (styler[start] == '.' && start+1 <= end && IsADigit(styler[start+1]));\n\tif (wordIsNumber)\n\t\tchAttr = SCE_HPHP_NUMBER;\n\telse {\n\t\tchar s[100];\n\t\tGetTextSegment(styler, start, end, s, sizeof(s));\n\t\tif (keywords.InList(s))\n\t\t\tchAttr = SCE_HPHP_WORD;\n\t}\n\tstyler.ColourTo(end, chAttr);\n}\n\nstatic bool isWordHSGML(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {\n\tchar s[30 + 1];\n\tunsigned int i = 0;\n\tfor (; i < end - start + 1 && i < 30; i++) {\n\t\ts[i] = styler[start + i];\n\t}\n\ts[i] = '\\0';\n\treturn keywords.InList(s);\n}\n\nstatic bool isWordCdata(unsigned int start, unsigned int end, Accessor &styler) {\n\tchar s[30 + 1];\n\tunsigned int i = 0;\n\tfor (; i < end - start + 1 && i < 30; i++) {\n\t\ts[i] = styler[start + i];\n\t}\n\ts[i] = '\\0';\n\treturn (0 == strcmp(s, \"[CDATA[\"));\n}\n\n// Return the first state to reach when entering a scripting language\nstatic int StateForScript(script_type scriptLanguage) {\n\tint Result;\n\tswitch (scriptLanguage) {\n\tcase eScriptVBS:\n\t\tResult = SCE_HB_START;\n\t\tbreak;\n\tcase eScriptPython:\n\t\tResult = SCE_HP_START;\n\t\tbreak;\n\tcase eScriptPHP:\n\t\tResult = SCE_HPHP_DEFAULT;\n\t\tbreak;\n\tcase eScriptXML:\n\t\tResult = SCE_H_TAGUNKNOWN;\n\t\tbreak;\n\tcase eScriptSGML:\n\t\tResult = SCE_H_SGML_DEFAULT;\n\t\tbreak;\n\tcase eScriptComment:\n\t\tResult = SCE_H_COMMENT;\n\t\tbreak;\n\tdefault :\n\t\tResult = SCE_HJ_START;\n\t\tbreak;\n\t}\n\treturn Result;\n}\n\nstatic inline bool issgmlwordchar(int ch) {\n\treturn !IsASCII(ch) ||\n\t\t(isalnum(ch) || ch == '.' || ch == '_' || ch == ':' || ch == '!' || ch == '#' || ch == '[');\n}\n\nstatic inline bool IsPhpWordStart(int ch) {\n\treturn (IsASCII(ch) && (isalpha(ch) || (ch == '_'))) || (ch >= 0x7f);\n}\n\nstatic inline bool IsPhpWordChar(int ch) {\n\treturn IsADigit(ch) || IsPhpWordStart(ch);\n}\n\nstatic bool InTagState(int state) {\n\treturn state == SCE_H_TAG || state == SCE_H_TAGUNKNOWN ||\n\t       state == SCE_H_SCRIPT ||\n\t       state == SCE_H_ATTRIBUTE || state == SCE_H_ATTRIBUTEUNKNOWN ||\n\t       state == SCE_H_NUMBER || state == SCE_H_OTHER ||\n\t       state == SCE_H_DOUBLESTRING || state == SCE_H_SINGLESTRING;\n}\n\nstatic bool IsCommentState(const int state) {\n\treturn state == SCE_H_COMMENT || state == SCE_H_SGML_COMMENT;\n}\n\nstatic bool IsScriptCommentState(const int state) {\n\treturn state == SCE_HJ_COMMENT || state == SCE_HJ_COMMENTLINE || state == SCE_HJA_COMMENT ||\n\t\t   state == SCE_HJA_COMMENTLINE || state == SCE_HB_COMMENTLINE || state == SCE_HBA_COMMENTLINE;\n}\n\nstatic bool isLineEnd(int ch) {\n\treturn ch == '\\r' || ch == '\\n';\n}\n\nstatic bool isMakoBlockEnd(const int ch, const int chNext, const char *blockType) {\n\tif (strlen(blockType) == 0) {\n\t\treturn ((ch == '%') && (chNext == '>'));\n\t} else if ((0 == strcmp(blockType, \"inherit\")) ||\n\t\t\t   (0 == strcmp(blockType, \"namespace\")) ||\n\t\t\t   (0 == strcmp(blockType, \"include\")) ||\n\t\t\t   (0 == strcmp(blockType, \"page\"))) {\n\t\treturn ((ch == '/') && (chNext == '>'));\n\t} else if (0 == strcmp(blockType, \"%\")) {\n\t\tif (ch == '/' && isLineEnd(chNext))\n\t\t\treturn 1;\n\t\telse\n\t\t    return isLineEnd(ch);\n\t} else if (0 == strcmp(blockType, \"{\")) {\n\t\treturn ch == '}';\n\t} else {\n\t\treturn (ch == '>');\n\t}\n}\n\nstatic bool isDjangoBlockEnd(const int ch, const int chNext, const char *blockType) {\n\tif (strlen(blockType) == 0) {\n\t\treturn 0;\n\t} else if (0 == strcmp(blockType, \"%\")) {\n\t\treturn ((ch == '%') && (chNext == '}'));\n\t} else if (0 == strcmp(blockType, \"{\")) {\n\t\treturn ((ch == '}') && (chNext == '}'));\n\t} else {\n\t\treturn 0;\n\t}\n}\n\nstatic bool isPHPStringState(int state) {\n\treturn\n\t    (state == SCE_HPHP_HSTRING) ||\n\t    (state == SCE_HPHP_SIMPLESTRING) ||\n\t    (state == SCE_HPHP_HSTRING_VARIABLE) ||\n\t    (state == SCE_HPHP_COMPLEX_VARIABLE);\n}\n\nstatic int FindPhpStringDelimiter(char *phpStringDelimiter, const int phpStringDelimiterSize, int i, const int lengthDoc, Accessor &styler, bool &isSimpleString) {\n\tint j;\n\tconst int beginning = i - 1;\n\tbool isValidSimpleString = false;\n\n\twhile (i < lengthDoc && (styler[i] == ' ' || styler[i] == '\\t'))\n\t\ti++;\n\n\tchar ch = styler.SafeGetCharAt(i);\n\tconst char chNext = styler.SafeGetCharAt(i + 1);\n\tif (!IsPhpWordStart(ch)) {\n\t\tif (ch == '\\'' && IsPhpWordStart(chNext)) {\n\t\t\ti++;\n\t\t\tch = chNext;\n\t\t\tisSimpleString = true;\n\t\t} else {\n\t\t\tphpStringDelimiter[0] = '\\0';\n\t\t\treturn beginning;\n\t\t}\n\t}\n\tphpStringDelimiter[0] = ch;\n\ti++;\n\n\tfor (j = i; j < lengthDoc && !isLineEnd(styler[j]); j++) {\n\t\tif (!IsPhpWordChar(styler[j])) {\n\t\t\tif (isSimpleString && (styler[j] == '\\'') && isLineEnd(styler.SafeGetCharAt(j + 1))) {\n\t\t\t\tisValidSimpleString = true;\n\t\t\t\tj++;\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tphpStringDelimiter[0] = '\\0';\n\t\t\t\treturn beginning;\n\t\t\t}\n\t\t}\n\t\tif (j - i < phpStringDelimiterSize - 2)\n\t\t\tphpStringDelimiter[j-i+1] = styler[j];\n\t\telse\n\t\t\ti++;\n\t}\n\tif (isSimpleString && !isValidSimpleString) {\n\t\tphpStringDelimiter[0] = '\\0';\n\t\treturn beginning;\n\t}\n\tphpStringDelimiter[j-i+1 - (isSimpleString ? 1 : 0)] = '\\0';\n\treturn j - 1;\n}\n\nstatic void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                                  Accessor &styler, bool isXml) {\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\tWordList &keywords4 = *keywordlists[3];\n\tWordList &keywords5 = *keywordlists[4];\n\tWordList &keywords6 = *keywordlists[5]; // SGML (DTD) keywords\n\n\t// Lexer for HTML requires more lexical states (8 bits worth) than most lexers\n\tstyler.StartAt(startPos, static_cast<char>(STYLE_MAX));\n\tchar prevWord[200];\n\tprevWord[0] = '\\0';\n\tchar phpStringDelimiter[200]; // PHP is not limited in length, we are\n\tphpStringDelimiter[0] = '\\0';\n\tint StateToPrint = initStyle;\n\tint state = stateForPrintState(StateToPrint);\n\tchar makoBlockType[200];\n\tmakoBlockType[0] = '\\0';\n\tint makoComment = 0;\n\tchar djangoBlockType[2];\n\tdjangoBlockType[0] = '\\0';\n\n\t// If inside a tag, it may be a script tag, so reread from the start of line starting tag to ensure any language tags are seen\n\tif (InTagState(state)) {\n\t\twhile ((startPos > 0) && (InTagState(styler.StyleAt(startPos - 1)))) {\n\t\t\tint backLineStart = styler.LineStart(styler.GetLine(startPos-1));\n\t\t\tlength += startPos - backLineStart;\n\t\t\tstartPos = backLineStart;\n\t\t}\n\t\tstate = SCE_H_DEFAULT;\n\t}\n\t// String can be heredoc, must find a delimiter first. Reread from beginning of line containing the string, to get the correct lineState\n\tif (isPHPStringState(state)) {\n\t\twhile (startPos > 0 && (isPHPStringState(state) || !isLineEnd(styler[startPos - 1]))) {\n\t\t\tstartPos--;\n\t\t\tlength++;\n\t\t\tstate = styler.StyleAt(startPos);\n\t\t}\n\t\tif (startPos == 0)\n\t\t\tstate = SCE_H_DEFAULT;\n\t}\n\tstyler.StartAt(startPos, static_cast<char>(STYLE_MAX));\n\n\tint lineCurrent = styler.GetLine(startPos);\n\tint lineState;\n\tif (lineCurrent > 0) {\n\t\tlineState = styler.GetLineState(lineCurrent-1);\n\t} else {\n\t\t// Default client and ASP scripting language is JavaScript\n\t\tlineState = eScriptJS << 8;\n\n\t\t// property asp.default.language\n\t\t//\tScript in ASP code is initially assumed to be in JavaScript.\n\t\t//\tTo change this to VBScript set asp.default.language to 2. Python is 3.\n\t\tlineState |= styler.GetPropertyInt(\"asp.default.language\", eScriptJS) << 4;\n\t}\n\tscript_mode inScriptType = script_mode((lineState >> 0) & 0x03); // 2 bits of scripting mode\n\tbool tagOpened = (lineState >> 2) & 0x01; // 1 bit to know if we are in an opened tag\n\tbool tagClosing = (lineState >> 3) & 0x01; // 1 bit to know if we are in a closing tag\n\tbool tagDontFold = false; //some HTML tags should not be folded\n\tscript_type aspScript = script_type((lineState >> 4) & 0x0F); // 4 bits of script name\n\tscript_type clientScript = script_type((lineState >> 8) & 0x0F); // 4 bits of script name\n\tint beforePreProc = (lineState >> 12) & 0xFF; // 8 bits of state\n\n\tscript_type scriptLanguage = ScriptOfState(state);\n\t// If eNonHtmlScript coincides with SCE_H_COMMENT, assume eScriptComment\n\tif (inScriptType == eNonHtmlScript && state == SCE_H_COMMENT) {\n\t\tscriptLanguage = eScriptComment;\n\t}\n\tscript_type beforeLanguage = ScriptOfState(beforePreProc);\n\n\t// property fold.html\n\t//\tFolding is turned on or off for HTML and XML files with this option.\n\t//\tThe fold option must also be on for folding to occur.\n\tconst bool foldHTML = styler.GetPropertyInt(\"fold.html\", 0) != 0;\n\n\tconst bool fold = foldHTML && styler.GetPropertyInt(\"fold\", 0);\n\n\t// property fold.html.preprocessor\n\t//\tFolding is turned on or off for scripts embedded in HTML files with this option.\n\t//\tThe default is on.\n\tconst bool foldHTMLPreprocessor = foldHTML && styler.GetPropertyInt(\"fold.html.preprocessor\", 1);\n\n\tconst bool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\n\t// property fold.hypertext.comment\n\t//\tAllow folding for comments in scripts embedded in HTML.\n\t//\tThe default is off.\n\tconst bool foldComment = fold && styler.GetPropertyInt(\"fold.hypertext.comment\", 0) != 0;\n\n\t// property fold.hypertext.heredoc\n\t//\tAllow folding for heredocs in scripts embedded in HTML.\n\t//\tThe default is off.\n\tconst bool foldHeredoc = fold && styler.GetPropertyInt(\"fold.hypertext.heredoc\", 0) != 0;\n\n\t// property html.tags.case.sensitive\n\t//\tFor XML and HTML, setting this property to 1 will make tags match in a case\n\t//\tsensitive way which is the expected behaviour for XML and XHTML.\n\tconst bool caseSensitive = styler.GetPropertyInt(\"html.tags.case.sensitive\", 0) != 0;\n\n\t// property lexer.xml.allow.scripts\n\t//\tSet to 0 to disable scripts in XML.\n\tconst bool allowScripts = styler.GetPropertyInt(\"lexer.xml.allow.scripts\", 1) != 0;\n\n\t// property lexer.html.mako\n\t//\tSet to 1 to enable the mako template language.\n\tconst bool isMako = styler.GetPropertyInt(\"lexer.html.mako\", 0) != 0;\n\n\t// property lexer.html.django\n\t//\tSet to 1 to enable the django template language.\n\tconst bool isDjango = styler.GetPropertyInt(\"lexer.html.django\", 0) != 0;\n\n\tconst CharacterSet setHTMLWord(CharacterSet::setAlphaNum, \".-_:!#\", 0x80, true);\n\tconst CharacterSet setTagContinue(CharacterSet::setAlphaNum, \".-_:!#[\", 0x80, true);\n\tconst CharacterSet setAttributeContinue(CharacterSet::setAlphaNum, \".-_:!#/\", 0x80, true);\n\t// TODO: also handle + and - (except if they're part of ++ or --) and return keywords\n\tconst CharacterSet setOKBeforeJSRE(CharacterSet::setNone, \"([{=,:;!%^&*|?~\");\n\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tint visibleChars = 0;\n\tint lineStartVisibleChars = 0;\n\n\tint chPrev = ' ';\n\tint ch = ' ';\n\tint chPrevNonWhite = ' ';\n\t// look back to set chPrevNonWhite properly for better regex colouring\n\tif (scriptLanguage == eScriptJS && startPos > 0) {\n\t\tint back = startPos;\n\t\tint style = 0;\n\t\twhile (--back) {\n\t\t\tstyle = styler.StyleAt(back);\n\t\t\tif (style < SCE_HJ_DEFAULT || style > SCE_HJ_COMMENTDOC)\n\t\t\t\t// includes SCE_HJ_COMMENT & SCE_HJ_COMMENTLINE\n\t\t\t\tbreak;\n\t\t}\n\t\tif (style == SCE_HJ_SYMBOLS) {\n\t\t\tchPrevNonWhite = static_cast<unsigned char>(styler.SafeGetCharAt(back));\n\t\t}\n\t}\n\n\tstyler.StartSegment(startPos);\n\tconst int lengthDoc = startPos + length;\n\tfor (int i = startPos; i < lengthDoc; i++) {\n\t\tconst int chPrev2 = chPrev;\n\t\tchPrev = ch;\n\t\tif (!IsASpace(ch) && state != SCE_HJ_COMMENT &&\n\t\t\tstate != SCE_HJ_COMMENTLINE && state != SCE_HJ_COMMENTDOC)\n\t\t\tchPrevNonWhite = ch;\n\t\tch = static_cast<unsigned char>(styler[i]);\n\t\tint chNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\n\t\tconst int chNext2 = static_cast<unsigned char>(styler.SafeGetCharAt(i + 2));\n\n\t\t// Handle DBCS codepages\n\t\tif (styler.IsLeadByte(static_cast<char>(ch))) {\n\t\t\tchPrev = ' ';\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ((!IsASpace(ch) || !foldCompact) && fold)\n\t\t\tvisibleChars++;\n\t\tif (!IsASpace(ch))\n\t\t\tlineStartVisibleChars++;\n\n\t\t// decide what is the current state to print (depending of the script tag)\n\t\tStateToPrint = statePrintForState(state, inScriptType);\n\n\t\t// handle script folding\n\t\tif (fold) {\n\t\t\tswitch (scriptLanguage) {\n\t\t\tcase eScriptJS:\n\t\t\tcase eScriptPHP:\n\t\t\t\t//not currently supported\t\t\t\tcase eScriptVBS:\n\n\t\t\t\tif ((state != SCE_HPHP_COMMENT) && (state != SCE_HPHP_COMMENTLINE) && (state != SCE_HJ_COMMENT) && (state != SCE_HJ_COMMENTLINE) && (state != SCE_HJ_COMMENTDOC) && (!isStringState(state))) {\n\t\t\t\t//Platform::DebugPrintf(\"state=%d, StateToPrint=%d, initStyle=%d\\n\", state, StateToPrint, initStyle);\n\t\t\t\t//if ((state == SCE_HPHP_OPERATOR) || (state == SCE_HPHP_DEFAULT) || (state == SCE_HJ_SYMBOLS) || (state == SCE_HJ_START) || (state == SCE_HJ_DEFAULT)) {\n\t\t\t\t\tif (ch == '#') {\n\t\t\t\t\t\tint j = i + 1;\n\t\t\t\t\t\twhile ((j < lengthDoc) && IsASpaceOrTab(styler.SafeGetCharAt(j))) {\n\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (styler.Match(j, \"region\") || styler.Match(j, \"if\")) {\n\t\t\t\t\t\t\tlevelCurrent++;\n\t\t\t\t\t\t} else if (styler.Match(j, \"end\")) {\n\t\t\t\t\t\t\tlevelCurrent--;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ((ch == '{') || (ch == '}') || (foldComment && (ch == '/') && (chNext == '*'))) {\n\t\t\t\t\t\tlevelCurrent += (((ch == '{') || (ch == '/')) ? 1 : -1);\n\t\t\t\t\t}\n\t\t\t\t} else if (((state == SCE_HPHP_COMMENT) || (state == SCE_HJ_COMMENT)) && foldComment && (ch == '*') && (chNext == '/')) {\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase eScriptPython:\n\t\t\t\tif (state != SCE_HP_COMMENTLINE && !isMako) {\n\t\t\t\t\tif ((ch == ':') && ((chNext == '\\n') || (chNext == '\\r' && chNext2 == '\\n'))) {\n\t\t\t\t\t\tlevelCurrent++;\n\t\t\t\t\t} else if ((ch == '\\n') && !((chNext == '\\r') && (chNext2 == '\\n')) && (chNext != '\\n')) {\n\t\t\t\t\t\t// check if the number of tabs is lower than the level\n\t\t\t\t\t\tint Findlevel = (levelCurrent & ~SC_FOLDLEVELBASE) * 8;\n\t\t\t\t\t\tfor (int j = 0; Findlevel > 0; j++) {\n\t\t\t\t\t\t\tchar chTmp = styler.SafeGetCharAt(i + j + 1);\n\t\t\t\t\t\t\tif (chTmp == '\\t') {\n\t\t\t\t\t\t\t\tFindlevel -= 8;\n\t\t\t\t\t\t\t} else if (chTmp == ' ') {\n\t\t\t\t\t\t\t\tFindlevel--;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (Findlevel > 0) {\n\t\t\t\t\t\t\tlevelCurrent -= Findlevel / 8;\n\t\t\t\t\t\t\tif (Findlevel % 8)\n\t\t\t\t\t\t\t\tlevelCurrent--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ((ch == '\\r' && chNext != '\\n') || (ch == '\\n')) {\n\t\t\t// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)\n\t\t\t// Avoid triggering two times on Dos/Win\n\t\t\t// New line -> record any line state onto /next/ line\n\t\t\tif (fold) {\n\t\t\t\tint lev = levelPrev;\n\t\t\t\tif (visibleChars == 0)\n\t\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t\tvisibleChars = 0;\n\t\t\t\tlevelPrev = levelCurrent;\n\t\t\t}\n\t\t\tstyler.SetLineState(lineCurrent,\n\t\t\t                    ((inScriptType & 0x03) << 0) |\n\t\t\t                    ((tagOpened & 0x01) << 2) |\n\t\t\t                    ((tagClosing & 0x01) << 3) |\n\t\t\t                    ((aspScript & 0x0F) << 4) |\n\t\t\t                    ((clientScript & 0x0F) << 8) |\n\t\t\t                    ((beforePreProc & 0xFF) << 12));\n\t\t\tlineCurrent++;\n\t\t\tlineStartVisibleChars = 0;\n\t\t}\n\n\t\t// handle start of Mako comment line\n\t\tif (isMako && ch == '#' && chNext == '#') {\n\t\t\tmakoComment = 1;\n\t\t}\n\t\t\n\t\t// handle end of Mako comment line\n\t\telse if (isMako && makoComment && (ch == '\\r' || ch == '\\n')) {\n\t\t\tmakoComment = 0;\n\t\t\tstyler.ColourTo(i, SCE_HP_COMMENTLINE);\n\t\t\tstate = SCE_HP_DEFAULT;\n\t\t}\n\t\t\n\t\t// Allow falling through to mako handling code if newline is going to end a block\n\t\tif (((ch == '\\r' && chNext != '\\n') || (ch == '\\n')) &&\n\t\t\t(!isMako || (0 != strcmp(makoBlockType, \"%\")))) {\n\t\t}\n\n\t\t// generic end of script processing\n\t\telse if ((inScriptType == eNonHtmlScript) && (ch == '<') && (chNext == '/')) {\n\t\t\t// Check if it's the end of the script tag (or any other HTML tag)\n\t\t\tswitch (state) {\n\t\t\t\t// in these cases, you can embed HTML tags (to confirm !!!!!!!!!!!!!!!!!!!!!!)\n\t\t\tcase SCE_H_DOUBLESTRING:\n\t\t\tcase SCE_H_SINGLESTRING:\n\t\t\tcase SCE_HJ_COMMENT:\n\t\t\tcase SCE_HJ_COMMENTDOC:\n\t\t\t//case SCE_HJ_COMMENTLINE: // removed as this is a common thing done to hide\n\t\t\t// the end of script marker from some JS interpreters.\n\t\t\tcase SCE_HB_COMMENTLINE:\n\t\t\tcase SCE_HBA_COMMENTLINE:\n\t\t\tcase SCE_HJ_DOUBLESTRING:\n\t\t\tcase SCE_HJ_SINGLESTRING:\n\t\t\tcase SCE_HJ_REGEX:\n\t\t\tcase SCE_HB_STRING:\n\t\t\tcase SCE_HBA_STRING:\n\t\t\tcase SCE_HP_STRING:\n\t\t\tcase SCE_HP_TRIPLE:\n\t\t\tcase SCE_HP_TRIPLEDOUBLE:\n\t\t\tcase SCE_HPHP_HSTRING:\n\t\t\tcase SCE_HPHP_SIMPLESTRING:\n\t\t\tcase SCE_HPHP_COMMENT:\n\t\t\tcase SCE_HPHP_COMMENTLINE:\n\t\t\t\tbreak;\n\t\t\tdefault :\n\t\t\t\t// check if the closing tag is a script tag\n\t\t\t\tif (const char *tag =\n\t\t\t\t\t\tstate == SCE_HJ_COMMENTLINE || isXml ? \"script\" :\n\t\t\t\t\t\tstate == SCE_H_COMMENT ? \"comment\" : 0) {\n\t\t\t\t\tint j = i + 2;\n\t\t\t\t\tint chr;\n\t\t\t\t\tdo {\n\t\t\t\t\t\tchr = static_cast<int>(*tag++);\n\t\t\t\t\t} while (chr != 0 && chr == MakeLowerCase(styler.SafeGetCharAt(j++)));\n\t\t\t\t\tif (chr != 0) break;\n\t\t\t\t}\n\t\t\t\t// closing tag of the script (it's a closing HTML tag anyway)\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_H_TAGUNKNOWN;\n\t\t\t\tinScriptType = eHtml;\n\t\t\t\tscriptLanguage = eScriptNone;\n\t\t\t\tclientScript = eScriptJS;\n\t\t\t\ti += 2;\n\t\t\t\tvisibleChars += 2;\n\t\t\t\ttagClosing = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t/////////////////////////////////////\n\t\t// handle the start of PHP pre-processor = Non-HTML\n\t\telse if ((state != SCE_H_ASPAT) &&\n\t\t         !isPHPStringState(state) &&\n\t\t         (state != SCE_HPHP_COMMENT) &&\n\t\t         (state != SCE_HPHP_COMMENTLINE) &&\n\t\t         (ch == '<') &&\n\t\t         (chNext == '?') &&\n\t\t\t\t !IsScriptCommentState(state)) {\n \t\t\tbeforeLanguage = scriptLanguage;\n\t\t\tscriptLanguage = segIsScriptingIndicator(styler, i + 2, i + 6, isXml ? eScriptXML : eScriptPHP);\n\t\t\tif ((scriptLanguage != eScriptPHP) && (isStringState(state) || (state==SCE_H_COMMENT))) continue;\n\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\tbeforePreProc = state;\n\t\t\ti++;\n\t\t\tvisibleChars++;\n\t\t\ti += PrintScriptingIndicatorOffset(styler, styler.GetStartSegment() + 2, i + 6);\n\t\t\tif (scriptLanguage == eScriptXML)\n\t\t\t\tstyler.ColourTo(i, SCE_H_XMLSTART);\n\t\t\telse\n\t\t\t\tstyler.ColourTo(i, SCE_H_QUESTION);\n\t\t\tstate = StateForScript(scriptLanguage);\n\t\t\tif (inScriptType == eNonHtmlScript)\n\t\t\t\tinScriptType = eNonHtmlScriptPreProc;\n\t\t\telse\n\t\t\t\tinScriptType = eNonHtmlPreProc;\n\t\t\t// Fold whole script, but not if the XML first tag (all XML-like tags in this case)\n\t\t\tif (foldHTMLPreprocessor && (scriptLanguage != eScriptXML)) {\n\t\t\t\tlevelCurrent++;\n\t\t\t}\n\t\t\t// should be better\n\t\t\tch = static_cast<unsigned char>(styler.SafeGetCharAt(i));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// handle the start Mako template Python code\n\t\telse if (isMako && scriptLanguage == eScriptNone && ((ch == '<' && chNext == '%') ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t (lineStartVisibleChars == 1 && ch == '%') ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t (lineStartVisibleChars == 1 && ch == '/' && chNext == '%') ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t (ch == '$' && chNext == '{') ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t (ch == '<' && chNext == '/' && chNext2 == '%'))) {\n\t\t\tif (ch == '%' || ch == '/')\n\t\t\t\tstrcpy(makoBlockType, \"%\");\n\t\t\telse if (ch == '$')\n\t\t\t\tstrcpy(makoBlockType, \"{\");\n\t\t\telse if (chNext == '/')\n\t\t\t\tGetNextWord(styler, i+3, makoBlockType, sizeof(makoBlockType));\n\t\t\telse\n\t\t\t\tGetNextWord(styler, i+2, makoBlockType, sizeof(makoBlockType));\n\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\tbeforePreProc = state;\n\t\t\tif (inScriptType == eNonHtmlScript)\n\t\t\t\tinScriptType = eNonHtmlScriptPreProc;\n\t\t\telse\n\t\t\t\tinScriptType = eNonHtmlPreProc;\n\n\t\t\tif (chNext == '/') {\n\t\t\t\ti += 2;\n\t\t\t\tvisibleChars += 2;\n\t\t\t} else if (ch != '%') {\n\t\t\t\ti++;\n\t\t\t\tvisibleChars++;\n\t\t\t}\n\t\t\tstate = SCE_HP_START;\n\t\t\tscriptLanguage = eScriptPython;\n\t\t\tstyler.ColourTo(i, SCE_H_ASP);\n\n\t\t\tif (ch != '%' && ch != '$' && ch != '/') {\n\t\t\t\ti += static_cast<int>(strlen(makoBlockType));\n\t\t\t\tvisibleChars += static_cast<int>(strlen(makoBlockType));\n\t\t\t\tif (keywords4.InList(makoBlockType))\n\t\t\t\t\tstyler.ColourTo(i, SCE_HP_WORD);\n\t\t\t\telse\n\t\t\t\t\tstyler.ColourTo(i, SCE_H_TAGUNKNOWN);\n\t\t\t}\n\n\t\t\tch = static_cast<unsigned char>(styler.SafeGetCharAt(i));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// handle the start/end of Django comment\n\t\telse if (isDjango && state != SCE_H_COMMENT && (ch == '{' && chNext == '#')) {\n\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\tbeforePreProc = state;\n\t\t\tbeforeLanguage = scriptLanguage;\n\t\t\tif (inScriptType == eNonHtmlScript)\n\t\t\t\tinScriptType = eNonHtmlScriptPreProc;\n\t\t\telse\n\t\t\t\tinScriptType = eNonHtmlPreProc;\n\t\t\ti += 1;\n\t\t\tvisibleChars += 1;\n\t\t\tscriptLanguage = eScriptComment;\n\t\t\tstate = SCE_H_COMMENT;\n\t\t\tstyler.ColourTo(i, SCE_H_ASP);\n\t\t\tch = static_cast<unsigned char>(styler.SafeGetCharAt(i));\n\t\t\tcontinue;\n\t\t} else if (isDjango && state == SCE_H_COMMENT && (ch == '#' && chNext == '}')) {\n\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\ti += 1;\n\t\t\tvisibleChars += 1;\n\t\t\tstyler.ColourTo(i, SCE_H_ASP);\n\t\t\tstate = beforePreProc;\n\t\t\tif (inScriptType == eNonHtmlScriptPreProc)\n\t\t\t\tinScriptType = eNonHtmlScript;\n\t\t\telse\n\t\t\t\tinScriptType = eHtml;\n\t\t\tscriptLanguage = beforeLanguage;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// handle the start Django template code\n\t\telse if (isDjango && scriptLanguage != eScriptPython && (ch == '{' && (chNext == '%' ||  chNext == '{'))) {\n\t\t\tif (chNext == '%')\n\t\t\t\tstrcpy(djangoBlockType, \"%\");\n\t\t\telse\n\t\t\t\tstrcpy(djangoBlockType, \"{\");\n\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\tbeforePreProc = state;\n\t\t\tif (inScriptType == eNonHtmlScript)\n\t\t\t\tinScriptType = eNonHtmlScriptPreProc;\n\t\t\telse\n\t\t\t\tinScriptType = eNonHtmlPreProc;\n\n\t\t\ti += 1;\n\t\t\tvisibleChars += 1;\n\t\t\tstate = SCE_HP_START;\n\t\t\tbeforeLanguage = scriptLanguage;\n\t\t\tscriptLanguage = eScriptPython;\n\t\t\tstyler.ColourTo(i, SCE_H_ASP);\n\n\t\t\tch = static_cast<unsigned char>(styler.SafeGetCharAt(i));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// handle the start of ASP pre-processor = Non-HTML\n\t\telse if (!isMako && !isDjango && !isCommentASPState(state) && (ch == '<') && (chNext == '%') && !isPHPStringState(state)) {\n\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\tbeforePreProc = state;\n\t\t\tif (inScriptType == eNonHtmlScript)\n\t\t\t\tinScriptType = eNonHtmlScriptPreProc;\n\t\t\telse\n\t\t\t\tinScriptType = eNonHtmlPreProc;\n\n\t\t\tif (chNext2 == '@') {\n\t\t\t\ti += 2; // place as if it was the second next char treated\n\t\t\t\tvisibleChars += 2;\n\t\t\t\tstate = SCE_H_ASPAT;\n\t\t\t} else if ((chNext2 == '-') && (styler.SafeGetCharAt(i + 3) == '-')) {\n\t\t\t\tstyler.ColourTo(i + 3, SCE_H_ASP);\n\t\t\t\tstate = SCE_H_XCCOMMENT;\n\t\t\t\tscriptLanguage = eScriptVBS;\n\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tif (chNext2 == '=') {\n\t\t\t\t\ti += 2; // place as if it was the second next char treated\n\t\t\t\t\tvisibleChars += 2;\n\t\t\t\t} else {\n\t\t\t\t\ti++; // place as if it was the next char treated\n\t\t\t\t\tvisibleChars++;\n\t\t\t\t}\n\n\t\t\t\tstate = StateForScript(aspScript);\n\t\t\t}\n\t\t\tscriptLanguage = eScriptVBS;\n\t\t\tstyler.ColourTo(i, SCE_H_ASP);\n\t\t\t// fold whole script\n\t\t\tif (foldHTMLPreprocessor)\n\t\t\t\tlevelCurrent++;\n\t\t\t// should be better\n\t\t\tch = static_cast<unsigned char>(styler.SafeGetCharAt(i));\n\t\t\tcontinue;\n\t\t}\n\n\t\t/////////////////////////////////////\n\t\t// handle the start of SGML language (DTD)\n\t\telse if (((scriptLanguage == eScriptNone) || (scriptLanguage == eScriptXML)) &&\n\t\t\t\t (chPrev == '<') &&\n\t\t\t\t (ch == '!') &&\n\t\t\t\t (StateToPrint != SCE_H_CDATA) &&\n\t\t\t\t (!IsCommentState(StateToPrint)) &&\n\t\t\t\t (!IsScriptCommentState(StateToPrint))) {\n\t\t\tbeforePreProc = state;\n\t\t\tstyler.ColourTo(i - 2, StateToPrint);\n\t\t\tif ((chNext == '-') && (chNext2 == '-')) {\n\t\t\t\tstate = SCE_H_COMMENT; // wait for a pending command\n\t\t\t\tstyler.ColourTo(i + 2, SCE_H_COMMENT);\n\t\t\t\ti += 2; // follow styling after the --\n\t\t\t} else if (isWordCdata(i + 1, i + 7, styler)) {\n\t\t\t\tstate = SCE_H_CDATA;\n\t\t\t} else {\n\t\t\t\tstyler.ColourTo(i, SCE_H_SGML_DEFAULT); // <! is default\n\t\t\t\tscriptLanguage = eScriptSGML;\n\t\t\t\tstate = SCE_H_SGML_COMMAND; // wait for a pending command\n\t\t\t}\n\t\t\t// fold whole tag (-- when closing the tag)\n\t\t\tif (foldHTMLPreprocessor || state == SCE_H_COMMENT || state == SCE_H_CDATA)\n\t\t\t\tlevelCurrent++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// handle the end of Mako Python code\n\t\telse if (isMako &&\n\t\t\t     ((inScriptType == eNonHtmlPreProc) || (inScriptType == eNonHtmlScriptPreProc)) &&\n\t\t\t\t (scriptLanguage != eScriptNone) && stateAllowsTermination(state) &&\n\t\t\t\t isMakoBlockEnd(ch, chNext, makoBlockType)) {\n\t\t\tif (state == SCE_H_ASPAT) {\n\t\t\t\taspScript = segIsScriptingIndicator(styler,\n\t\t\t\t                                    styler.GetStartSegment(), i - 1, aspScript);\n\t\t\t}\n\t\t\tif (state == SCE_HP_WORD) {\n\t\t\t\tclassifyWordHTPy(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord, inScriptType, isMako);\n\t\t\t} else {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t}\n\t\t\tif (0 != strcmp(makoBlockType, \"%\") && (0 != strcmp(makoBlockType, \"{\")) && ch != '>') {\n\t\t\t\ti++;\n\t\t\t\tvisibleChars++;\n\t\t    }\n\t\t\telse if (0 == strcmp(makoBlockType, \"%\") && ch == '/') {\n\t\t\t\ti++;\n\t\t\t\tvisibleChars++;\n\t\t\t}\n\t\t\tif (0 != strcmp(makoBlockType, \"%\") || ch == '/') {\n\t\t\t\tstyler.ColourTo(i, SCE_H_ASP);\n\t\t\t}\n\t\t\tstate = beforePreProc;\n\t\t\tif (inScriptType == eNonHtmlScriptPreProc)\n\t\t\t\tinScriptType = eNonHtmlScript;\n\t\t\telse\n\t\t\t\tinScriptType = eHtml;\n\t\t\tscriptLanguage = eScriptNone;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// handle the end of Django template code\n\t\telse if (isDjango &&\n\t\t\t     ((inScriptType == eNonHtmlPreProc) || (inScriptType == eNonHtmlScriptPreProc)) &&\n\t\t\t\t (scriptLanguage != eScriptNone) && stateAllowsTermination(state) &&\n\t\t\t\t isDjangoBlockEnd(ch, chNext, djangoBlockType)) {\n\t\t\tif (state == SCE_H_ASPAT) {\n\t\t\t\taspScript = segIsScriptingIndicator(styler,\n\t\t\t\t                                    styler.GetStartSegment(), i - 1, aspScript);\n\t\t\t}\n\t\t\tif (state == SCE_HP_WORD) {\n\t\t\t\tclassifyWordHTPy(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord, inScriptType, isMako);\n\t\t\t} else {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t}\n\t\t\ti += 1;\n\t\t\tvisibleChars += 1;\n\t\t\tstyler.ColourTo(i, SCE_H_ASP);\n\t\t\tstate = beforePreProc;\n\t\t\tif (inScriptType == eNonHtmlScriptPreProc)\n\t\t\t\tinScriptType = eNonHtmlScript;\n\t\t\telse\n\t\t\t\tinScriptType = eHtml;\n\t\t\tscriptLanguage = beforeLanguage;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// handle the end of a pre-processor = Non-HTML\n\t\telse if ((!isMako && !isDjango && ((inScriptType == eNonHtmlPreProc) || (inScriptType == eNonHtmlScriptPreProc)) &&\n\t\t\t\t  (((scriptLanguage != eScriptNone) && stateAllowsTermination(state))) &&\n\t\t\t\t  (((ch == '%') || (ch == '?')) && (chNext == '>'))) ||\n\t\t         ((scriptLanguage == eScriptSGML) && (ch == '>') && (state != SCE_H_SGML_COMMENT))) {\n\t\t\tif (state == SCE_H_ASPAT) {\n\t\t\t\taspScript = segIsScriptingIndicator(styler,\n\t\t\t\t                                    styler.GetStartSegment(), i - 1, aspScript);\n\t\t\t}\n\t\t\t// Bounce out of any ASP mode\n\t\t\tswitch (state) {\n\t\t\tcase SCE_HJ_WORD:\n\t\t\t\tclassifyWordHTJS(styler.GetStartSegment(), i - 1, keywords2, styler, inScriptType);\n\t\t\t\tbreak;\n\t\t\tcase SCE_HB_WORD:\n\t\t\t\tclassifyWordHTVB(styler.GetStartSegment(), i - 1, keywords3, styler, inScriptType);\n\t\t\t\tbreak;\n\t\t\tcase SCE_HP_WORD:\n\t\t\t\tclassifyWordHTPy(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord, inScriptType, isMako);\n\t\t\t\tbreak;\n\t\t\tcase SCE_HPHP_WORD:\n\t\t\t\tclassifyWordHTPHP(styler.GetStartSegment(), i - 1, keywords5, styler);\n\t\t\t\tbreak;\n\t\t\tcase SCE_H_XCCOMMENT:\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tbreak;\n\t\t\tdefault :\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (scriptLanguage != eScriptSGML) {\n\t\t\t\ti++;\n\t\t\t\tvisibleChars++;\n\t\t\t}\n\t\t\tif (ch == '%')\n\t\t\t\tstyler.ColourTo(i, SCE_H_ASP);\n\t\t\telse if (scriptLanguage == eScriptXML)\n\t\t\t\tstyler.ColourTo(i, SCE_H_XMLEND);\n\t\t\telse if (scriptLanguage == eScriptSGML)\n\t\t\t\tstyler.ColourTo(i, SCE_H_SGML_DEFAULT);\n\t\t\telse\n\t\t\t\tstyler.ColourTo(i, SCE_H_QUESTION);\n\t\t\tstate = beforePreProc;\n\t\t\tif (inScriptType == eNonHtmlScriptPreProc)\n\t\t\t\tinScriptType = eNonHtmlScript;\n\t\t\telse\n\t\t\t\tinScriptType = eHtml;\n\t\t\t// Unfold all scripting languages, except for XML tag\n\t\t\tif (foldHTMLPreprocessor && (scriptLanguage != eScriptXML)) {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t\tscriptLanguage = beforeLanguage;\n\t\t\tcontinue;\n\t\t}\n\t\t/////////////////////////////////////\n\n\t\tswitch (state) {\n\t\tcase SCE_H_DEFAULT:\n\t\t\tif (ch == '<') {\n\t\t\t\t// in HTML, fold on tag open and unfold on tag close\n\t\t\t\ttagOpened = true;\n\t\t\t\ttagClosing = (chNext == '/');\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tif (chNext != '!')\n\t\t\t\t\tstate = SCE_H_TAGUNKNOWN;\n\t\t\t} else if (ch == '&') {\n\t\t\t\tstyler.ColourTo(i - 1, SCE_H_DEFAULT);\n\t\t\t\tstate = SCE_H_ENTITY;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_SGML_DEFAULT:\n\t\tcase SCE_H_SGML_BLOCK_DEFAULT:\n//\t\t\tif (scriptLanguage == eScriptSGMLblock)\n//\t\t\t\tStateToPrint = SCE_H_SGML_BLOCK_DEFAULT;\n\n\t\t\tif (ch == '\\\"') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_H_SGML_DOUBLESTRING;\n\t\t\t} else if (ch == '\\'') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_H_SGML_SIMPLESTRING;\n\t\t\t} else if ((ch == '-') && (chPrev == '-')) {\n\t\t\t\tif (static_cast<int>(styler.GetStartSegment()) <= (i - 2)) {\n\t\t\t\t\tstyler.ColourTo(i - 2, StateToPrint);\n\t\t\t\t}\n\t\t\t\tstate = SCE_H_SGML_COMMENT;\n\t\t\t} else if (IsASCII(ch) && isalpha(ch) && (chPrev == '%')) {\n\t\t\t\tstyler.ColourTo(i - 2, StateToPrint);\n\t\t\t\tstate = SCE_H_SGML_ENTITY;\n\t\t\t} else if (ch == '#') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_H_SGML_SPECIAL;\n\t\t\t} else if (ch == '[') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tscriptLanguage = eScriptSGMLblock;\n\t\t\t\tstate = SCE_H_SGML_BLOCK_DEFAULT;\n\t\t\t} else if (ch == ']') {\n\t\t\t\tif (scriptLanguage == eScriptSGMLblock) {\n\t\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\t\tscriptLanguage = eScriptSGML;\n\t\t\t\t} else {\n\t\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\t\tstyler.ColourTo(i, SCE_H_SGML_ERROR);\n\t\t\t\t}\n\t\t\t\tstate = SCE_H_SGML_DEFAULT;\n\t\t\t} else if (scriptLanguage == eScriptSGMLblock) {\n\t\t\t\tif ((ch == '!') && (chPrev == '<')) {\n\t\t\t\t\tstyler.ColourTo(i - 2, StateToPrint);\n\t\t\t\t\tstyler.ColourTo(i, SCE_H_SGML_DEFAULT);\n\t\t\t\t\tstate = SCE_H_SGML_COMMAND;\n\t\t\t\t} else if (ch == '>') {\n\t\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\t\tstyler.ColourTo(i, SCE_H_SGML_DEFAULT);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_SGML_COMMAND:\n\t\t\tif ((ch == '-') && (chPrev == '-')) {\n\t\t\t\tstyler.ColourTo(i - 2, StateToPrint);\n\t\t\t\tstate = SCE_H_SGML_COMMENT;\n\t\t\t} else if (!issgmlwordchar(ch)) {\n\t\t\t\tif (isWordHSGML(styler.GetStartSegment(), i - 1, keywords6, styler)) {\n\t\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\t\tstate = SCE_H_SGML_1ST_PARAM;\n\t\t\t\t} else {\n\t\t\t\t\tstate = SCE_H_SGML_ERROR;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_SGML_1ST_PARAM:\n\t\t\t// wait for the beginning of the word\n\t\t\tif ((ch == '-') && (chPrev == '-')) {\n\t\t\t\tif (scriptLanguage == eScriptSGMLblock) {\n\t\t\t\t\tstyler.ColourTo(i - 2, SCE_H_SGML_BLOCK_DEFAULT);\n\t\t\t\t} else {\n\t\t\t\t\tstyler.ColourTo(i - 2, SCE_H_SGML_DEFAULT);\n\t\t\t\t}\n\t\t\t\tstate = SCE_H_SGML_1ST_PARAM_COMMENT;\n\t\t\t} else if (issgmlwordchar(ch)) {\n\t\t\t\tif (scriptLanguage == eScriptSGMLblock) {\n\t\t\t\t\tstyler.ColourTo(i - 1, SCE_H_SGML_BLOCK_DEFAULT);\n\t\t\t\t} else {\n\t\t\t\t\tstyler.ColourTo(i - 1, SCE_H_SGML_DEFAULT);\n\t\t\t\t}\n\t\t\t\t// find the length of the word\n\t\t\t\tint size = 1;\n\t\t\t\twhile (setHTMLWord.Contains(static_cast<unsigned char>(styler.SafeGetCharAt(i + size))))\n\t\t\t\t\tsize++;\n\t\t\t\tstyler.ColourTo(i + size - 1, StateToPrint);\n\t\t\t\ti += size - 1;\n\t\t\t\tvisibleChars += size - 1;\n\t\t\t\tch = static_cast<unsigned char>(styler.SafeGetCharAt(i));\n\t\t\t\tif (scriptLanguage == eScriptSGMLblock) {\n\t\t\t\t\tstate = SCE_H_SGML_BLOCK_DEFAULT;\n\t\t\t\t} else {\n\t\t\t\t\tstate = SCE_H_SGML_DEFAULT;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_SGML_ERROR:\n\t\t\tif ((ch == '-') && (chPrev == '-')) {\n\t\t\t\tstyler.ColourTo(i - 2, StateToPrint);\n\t\t\t\tstate = SCE_H_SGML_COMMENT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_SGML_DOUBLESTRING:\n\t\t\tif (ch == '\\\"') {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_H_SGML_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_SGML_SIMPLESTRING:\n\t\t\tif (ch == '\\'') {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_H_SGML_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_SGML_COMMENT:\n\t\t\tif ((ch == '-') && (chPrev == '-')) {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_H_SGML_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_CDATA:\n\t\t\tif ((chPrev2 == ']') && (chPrev == ']') && (ch == '>')) {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_H_DEFAULT;\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_COMMENT:\n\t\t\tif ((scriptLanguage != eScriptComment) && (chPrev2 == '-') && (chPrev == '-') && (ch == '>')) {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_H_DEFAULT;\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_SGML_1ST_PARAM_COMMENT:\n\t\t\tif ((ch == '-') && (chPrev == '-')) {\n\t\t\t\tstyler.ColourTo(i, SCE_H_SGML_COMMENT);\n\t\t\t\tstate = SCE_H_SGML_1ST_PARAM;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_SGML_SPECIAL:\n\t\t\tif (!(IsASCII(ch) && isupper(ch))) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tif (isalnum(ch)) {\n\t\t\t\t\tstate = SCE_H_SGML_ERROR;\n\t\t\t\t} else {\n\t\t\t\t\tstate = SCE_H_SGML_DEFAULT;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_SGML_ENTITY:\n\t\t\tif (ch == ';') {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_H_SGML_DEFAULT;\n\t\t\t} else if (!(IsASCII(ch) && isalnum(ch)) && ch != '-' && ch != '.') {\n\t\t\t\tstyler.ColourTo(i, SCE_H_SGML_ERROR);\n\t\t\t\tstate = SCE_H_SGML_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_ENTITY:\n\t\t\tif (ch == ';') {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_H_DEFAULT;\n\t\t\t}\n\t\t\tif (ch != '#' && !(IsASCII(ch) && isalnum(ch))\t// Should check that '#' follows '&', but it is unlikely anyway...\n\t\t\t\t&& ch != '.' && ch != '-' && ch != '_' && ch != ':') { // valid in XML\n\t\t\t\tif (!IsASCII(ch))\t// Possibly start of a multibyte character so don't allow this byte to be in entity style\n\t\t\t\t\tstyler.ColourTo(i-1, SCE_H_TAGUNKNOWN);\n\t\t\t\telse\n\t\t\t\t\tstyler.ColourTo(i, SCE_H_TAGUNKNOWN);\n\t\t\t\tstate = SCE_H_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_TAGUNKNOWN:\n\t\t\tif (!setTagContinue.Contains(ch) && !((ch == '/') && (chPrev == '<'))) {\n\t\t\t\tint eClass = classifyTagHTML(styler.GetStartSegment(),\n\t\t\t\t\ti - 1, keywords, styler, tagDontFold, caseSensitive, isXml, allowScripts);\n\t\t\t\tif (eClass == SCE_H_SCRIPT || eClass == SCE_H_COMMENT) {\n\t\t\t\t\tif (!tagClosing) {\n\t\t\t\t\t\tinScriptType = eNonHtmlScript;\n\t\t\t\t\t\tscriptLanguage = eClass == SCE_H_SCRIPT ? clientScript : eScriptComment;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tscriptLanguage = eScriptNone;\n\t\t\t\t\t}\n\t\t\t\t\teClass = SCE_H_TAG;\n\t\t\t\t}\n\t\t\t\tif (ch == '>') {\n\t\t\t\t\tstyler.ColourTo(i, eClass);\n\t\t\t\t\tif (inScriptType == eNonHtmlScript) {\n\t\t\t\t\t\tstate = StateForScript(scriptLanguage);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstate = SCE_H_DEFAULT;\n\t\t\t\t\t}\n\t\t\t\t\ttagOpened = false;\n\t\t\t\t\tif (!tagDontFold) {\n\t\t\t\t\t\tif (tagClosing) {\n\t\t\t\t\t\t\tlevelCurrent--;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlevelCurrent++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttagClosing = false;\n\t\t\t\t} else if (ch == '/' && chNext == '>') {\n\t\t\t\t\tif (eClass == SCE_H_TAGUNKNOWN) {\n\t\t\t\t\t\tstyler.ColourTo(i + 1, SCE_H_TAGUNKNOWN);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\t\t\tstyler.ColourTo(i + 1, SCE_H_TAGEND);\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t\tch = chNext;\n\t\t\t\t\tstate = SCE_H_DEFAULT;\n\t\t\t\t\ttagOpened = false;\n\t\t\t\t} else {\n\t\t\t\t\tif (eClass != SCE_H_TAGUNKNOWN) {\n\t\t\t\t\t\tif (eClass == SCE_H_SGML_DEFAULT) {\n\t\t\t\t\t\t\tstate = SCE_H_SGML_DEFAULT;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstate = SCE_H_OTHER;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_ATTRIBUTE:\n\t\t\tif (!setAttributeContinue.Contains(ch)) {\n\t\t\t\tif (inScriptType == eNonHtmlScript) {\n\t\t\t\t\tint scriptLanguagePrev = scriptLanguage;\n\t\t\t\t\tclientScript = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, scriptLanguage);\n\t\t\t\t\tscriptLanguage = clientScript;\n\t\t\t\t\tif ((scriptLanguagePrev != scriptLanguage) && (scriptLanguage == eScriptNone))\n\t\t\t\t\t\tinScriptType = eHtml;\n\t\t\t\t}\n\t\t\t\tclassifyAttribHTML(styler.GetStartSegment(), i - 1, keywords, styler);\n\t\t\t\tif (ch == '>') {\n\t\t\t\t\tstyler.ColourTo(i, SCE_H_TAG);\n\t\t\t\t\tif (inScriptType == eNonHtmlScript) {\n\t\t\t\t\t\tstate = StateForScript(scriptLanguage);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstate = SCE_H_DEFAULT;\n\t\t\t\t\t}\n\t\t\t\t\ttagOpened = false;\n\t\t\t\t\tif (!tagDontFold) {\n\t\t\t\t\t\tif (tagClosing) {\n\t\t\t\t\t\t\tlevelCurrent--;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlevelCurrent++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttagClosing = false;\n\t\t\t\t} else if (ch == '=') {\n\t\t\t\t\tstyler.ColourTo(i, SCE_H_OTHER);\n\t\t\t\t\tstate = SCE_H_VALUE;\n\t\t\t\t} else {\n\t\t\t\t\tstate = SCE_H_OTHER;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_OTHER:\n\t\t\tif (ch == '>') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstyler.ColourTo(i, SCE_H_TAG);\n\t\t\t\tif (inScriptType == eNonHtmlScript) {\n\t\t\t\t\tstate = StateForScript(scriptLanguage);\n\t\t\t\t} else {\n\t\t\t\t\tstate = SCE_H_DEFAULT;\n\t\t\t\t}\n\t\t\t\ttagOpened = false;\n\t\t\t\tif (!tagDontFold) {\n\t\t\t\t\tif (tagClosing) {\n\t\t\t\t\t\tlevelCurrent--;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlevelCurrent++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttagClosing = false;\n\t\t\t} else if (ch == '\\\"') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_H_DOUBLESTRING;\n\t\t\t} else if (ch == '\\'') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_H_SINGLESTRING;\n\t\t\t} else if (ch == '=') {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_H_VALUE;\n\t\t\t} else if (ch == '/' && chNext == '>') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstyler.ColourTo(i + 1, SCE_H_TAGEND);\n\t\t\t\ti++;\n\t\t\t\tch = chNext;\n\t\t\t\tstate = SCE_H_DEFAULT;\n\t\t\t\ttagOpened = false;\n\t\t\t} else if (ch == '?' && chNext == '>') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstyler.ColourTo(i + 1, SCE_H_XMLEND);\n\t\t\t\ti++;\n\t\t\t\tch = chNext;\n\t\t\t\tstate = SCE_H_DEFAULT;\n\t\t\t} else if (setHTMLWord.Contains(ch)) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_H_ATTRIBUTE;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_DOUBLESTRING:\n\t\t\tif (ch == '\\\"') {\n\t\t\t\tif (inScriptType == eNonHtmlScript) {\n\t\t\t\t\tscriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i, scriptLanguage);\n\t\t\t\t}\n\t\t\t\tstyler.ColourTo(i, SCE_H_DOUBLESTRING);\n\t\t\t\tstate = SCE_H_OTHER;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_SINGLESTRING:\n\t\t\tif (ch == '\\'') {\n\t\t\t\tif (inScriptType == eNonHtmlScript) {\n\t\t\t\t\tscriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i, scriptLanguage);\n\t\t\t\t}\n\t\t\t\tstyler.ColourTo(i, SCE_H_SINGLESTRING);\n\t\t\t\tstate = SCE_H_OTHER;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_H_VALUE:\n\t\t\tif (!setHTMLWord.Contains(ch)) {\n\t\t\t\tif (ch == '\\\"' && chPrev == '=') {\n\t\t\t\t\t// Should really test for being first character\n\t\t\t\t\tstate = SCE_H_DOUBLESTRING;\n\t\t\t\t} else if (ch == '\\'' && chPrev == '=') {\n\t\t\t\t\tstate = SCE_H_SINGLESTRING;\n\t\t\t\t} else {\n\t\t\t\t\tif (IsNumber(styler.GetStartSegment(), styler)) {\n\t\t\t\t\t\tstyler.ColourTo(i - 1, SCE_H_NUMBER);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\t\t}\n\t\t\t\t\tif (ch == '>') {\n\t\t\t\t\t\tstyler.ColourTo(i, SCE_H_TAG);\n\t\t\t\t\t\tif (inScriptType == eNonHtmlScript) {\n\t\t\t\t\t\t\tstate = StateForScript(scriptLanguage);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstate = SCE_H_DEFAULT;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttagOpened = false;\n\t\t\t\t\t\tif (!tagDontFold) {\n\t\t\t\t\t\t\tif (tagClosing) {\n\t\t\t\t\t\t\t\tlevelCurrent--;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tlevelCurrent++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttagClosing = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstate = SCE_H_OTHER;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HJ_DEFAULT:\n\t\tcase SCE_HJ_START:\n\t\tcase SCE_HJ_SYMBOLS:\n\t\t\tif (IsAWordStart(ch)) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HJ_WORD;\n\t\t\t} else if (ch == '/' && chNext == '*') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tif (chNext2 == '*')\n\t\t\t\t\tstate = SCE_HJ_COMMENTDOC;\n\t\t\t\telse\n\t\t\t\t\tstate = SCE_HJ_COMMENT;\n\t\t\t\tif (chNext2 == '/') {\n\t\t\t\t\t// Eat the * so it isn't used for the end of the comment\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t} else if (ch == '/' && chNext == '/') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HJ_COMMENTLINE;\n\t\t\t} else if (ch == '/' && setOKBeforeJSRE.Contains(chPrevNonWhite)) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HJ_REGEX;\n\t\t\t} else if (ch == '\\\"') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HJ_DOUBLESTRING;\n\t\t\t} else if (ch == '\\'') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HJ_SINGLESTRING;\n\t\t\t} else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') &&\n\t\t\t           styler.SafeGetCharAt(i + 3) == '-') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HJ_COMMENTLINE;\n\t\t\t} else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HJ_COMMENTLINE;\n\t\t\t\ti += 2;\n\t\t\t} else if (IsOperator(ch)) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstyler.ColourTo(i, statePrintForState(SCE_HJ_SYMBOLS, inScriptType));\n\t\t\t\tstate = SCE_HJ_DEFAULT;\n\t\t\t} else if ((ch == ' ') || (ch == '\\t')) {\n\t\t\t\tif (state == SCE_HJ_START) {\n\t\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\t\tstate = SCE_HJ_DEFAULT;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HJ_WORD:\n\t\t\tif (!IsAWordChar(ch)) {\n\t\t\t\tclassifyWordHTJS(styler.GetStartSegment(), i - 1, keywords2, styler, inScriptType);\n\t\t\t\t//styler.ColourTo(i - 1, eHTJSKeyword);\n\t\t\t\tstate = SCE_HJ_DEFAULT;\n\t\t\t\tif (ch == '/' && chNext == '*') {\n\t\t\t\t\tif (chNext2 == '*')\n\t\t\t\t\t\tstate = SCE_HJ_COMMENTDOC;\n\t\t\t\t\telse\n\t\t\t\t\t\tstate = SCE_HJ_COMMENT;\n\t\t\t\t} else if (ch == '/' && chNext == '/') {\n\t\t\t\t\tstate = SCE_HJ_COMMENTLINE;\n\t\t\t\t} else if (ch == '\\\"') {\n\t\t\t\t\tstate = SCE_HJ_DOUBLESTRING;\n\t\t\t\t} else if (ch == '\\'') {\n\t\t\t\t\tstate = SCE_HJ_SINGLESTRING;\n\t\t\t\t} else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) {\n\t\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\t\tstate = SCE_HJ_COMMENTLINE;\n\t\t\t\t\ti += 2;\n\t\t\t\t} else if (IsOperator(ch)) {\n\t\t\t\t\tstyler.ColourTo(i, statePrintForState(SCE_HJ_SYMBOLS, inScriptType));\n\t\t\t\t\tstate = SCE_HJ_DEFAULT;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HJ_COMMENT:\n\t\tcase SCE_HJ_COMMENTDOC:\n\t\t\tif (ch == '/' && chPrev == '*') {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_HJ_DEFAULT;\n\t\t\t\tch = ' ';\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HJ_COMMENTLINE:\n\t\t\tif (ch == '\\r' || ch == '\\n') {\n\t\t\t\tstyler.ColourTo(i - 1, statePrintForState(SCE_HJ_COMMENTLINE, inScriptType));\n\t\t\t\tstate = SCE_HJ_DEFAULT;\n\t\t\t\tch = ' ';\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HJ_DOUBLESTRING:\n\t\t\tif (ch == '\\\\') {\n\t\t\t\tif (chNext == '\\\"' || chNext == '\\'' || chNext == '\\\\') {\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t} else if (ch == '\\\"') {\n\t\t\t\tstyler.ColourTo(i, statePrintForState(SCE_HJ_DOUBLESTRING, inScriptType));\n\t\t\t\tstate = SCE_HJ_DEFAULT;\n\t\t\t} else if ((inScriptType == eNonHtmlScript) && (ch == '-') && (chNext == '-') && (chNext2 == '>')) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HJ_COMMENTLINE;\n\t\t\t\ti += 2;\n\t\t\t} else if (isLineEnd(ch)) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HJ_STRINGEOL;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HJ_SINGLESTRING:\n\t\t\tif (ch == '\\\\') {\n\t\t\t\tif (chNext == '\\\"' || chNext == '\\'' || chNext == '\\\\') {\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t} else if (ch == '\\'') {\n\t\t\t\tstyler.ColourTo(i, statePrintForState(SCE_HJ_SINGLESTRING, inScriptType));\n\t\t\t\tstate = SCE_HJ_DEFAULT;\n\t\t\t} else if ((inScriptType == eNonHtmlScript) && (ch == '-') && (chNext == '-') && (chNext2 == '>')) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HJ_COMMENTLINE;\n\t\t\t\ti += 2;\n\t\t\t} else if (isLineEnd(ch)) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tif (chPrev != '\\\\' && (chPrev2 != '\\\\' || chPrev != '\\r' || ch != '\\n')) {\n\t\t\t\t\tstate = SCE_HJ_STRINGEOL;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HJ_STRINGEOL:\n\t\t\tif (!isLineEnd(ch)) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HJ_DEFAULT;\n\t\t\t} else if (!isLineEnd(chNext)) {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_HJ_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HJ_REGEX:\n\t\t\tif (ch == '\\r' || ch == '\\n' || ch == '/') {\n\t\t\t\tif (ch == '/') {\n\t\t\t\t\twhile (IsASCII(chNext) && islower(chNext)) {   // gobble regex flags\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tch = chNext;\n\t\t\t\t\t\tchNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_HJ_DEFAULT;\n\t\t\t} else if (ch == '\\\\') {\n\t\t\t\t// Gobble up the quoted character\n\t\t\t\tif (chNext == '\\\\' || chNext == '/') {\n\t\t\t\t\ti++;\n\t\t\t\t\tch = chNext;\n\t\t\t\t\tchNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HB_DEFAULT:\n\t\tcase SCE_HB_START:\n\t\t\tif (IsAWordStart(ch)) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HB_WORD;\n\t\t\t} else if (ch == '\\'') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HB_COMMENTLINE;\n\t\t\t} else if (ch == '\\\"') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HB_STRING;\n\t\t\t} else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') &&\n\t\t\t           styler.SafeGetCharAt(i + 3) == '-') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HB_COMMENTLINE;\n\t\t\t} else if (IsOperator(ch)) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstyler.ColourTo(i, statePrintForState(SCE_HB_DEFAULT, inScriptType));\n\t\t\t\tstate = SCE_HB_DEFAULT;\n\t\t\t} else if ((ch == ' ') || (ch == '\\t')) {\n\t\t\t\tif (state == SCE_HB_START) {\n\t\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\t\tstate = SCE_HB_DEFAULT;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HB_WORD:\n\t\t\tif (!IsAWordChar(ch)) {\n\t\t\t\tstate = classifyWordHTVB(styler.GetStartSegment(), i - 1, keywords3, styler, inScriptType);\n\t\t\t\tif (state == SCE_HB_DEFAULT) {\n\t\t\t\t\tif (ch == '\\\"') {\n\t\t\t\t\t\tstate = SCE_HB_STRING;\n\t\t\t\t\t} else if (ch == '\\'') {\n\t\t\t\t\t\tstate = SCE_HB_COMMENTLINE;\n\t\t\t\t\t} else if (IsOperator(ch)) {\n\t\t\t\t\t\tstyler.ColourTo(i, statePrintForState(SCE_HB_DEFAULT, inScriptType));\n\t\t\t\t\t\tstate = SCE_HB_DEFAULT;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HB_STRING:\n\t\t\tif (ch == '\\\"') {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_HB_DEFAULT;\n\t\t\t} else if (ch == '\\r' || ch == '\\n') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HB_STRINGEOL;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HB_COMMENTLINE:\n\t\t\tif (ch == '\\r' || ch == '\\n') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HB_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HB_STRINGEOL:\n\t\t\tif (!isLineEnd(ch)) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HB_DEFAULT;\n\t\t\t} else if (!isLineEnd(chNext)) {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_HB_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HP_DEFAULT:\n\t\tcase SCE_HP_START:\n\t\t\tif (IsAWordStart(ch)) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HP_WORD;\n\t\t\t} else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') &&\n\t\t\t           styler.SafeGetCharAt(i + 3) == '-') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HP_COMMENTLINE;\n\t\t\t} else if (ch == '#') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HP_COMMENTLINE;\n\t\t\t} else if (ch == '\\\"') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tif (chNext == '\\\"' && chNext2 == '\\\"') {\n\t\t\t\t\ti += 2;\n\t\t\t\t\tstate = SCE_HP_TRIPLEDOUBLE;\n\t\t\t\t\tch = ' ';\n\t\t\t\t\tchPrev = ' ';\n\t\t\t\t\tchNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\n\t\t\t\t} else {\n\t\t\t\t\t//\t\t\t\t\tstate = statePrintForState(SCE_HP_STRING,inScriptType);\n\t\t\t\t\tstate = SCE_HP_STRING;\n\t\t\t\t}\n\t\t\t} else if (ch == '\\'') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tif (chNext == '\\'' && chNext2 == '\\'') {\n\t\t\t\t\ti += 2;\n\t\t\t\t\tstate = SCE_HP_TRIPLE;\n\t\t\t\t\tch = ' ';\n\t\t\t\t\tchPrev = ' ';\n\t\t\t\t\tchNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\n\t\t\t\t} else {\n\t\t\t\t\tstate = SCE_HP_CHARACTER;\n\t\t\t\t}\n\t\t\t} else if (IsOperator(ch)) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstyler.ColourTo(i, statePrintForState(SCE_HP_OPERATOR, inScriptType));\n\t\t\t} else if ((ch == ' ') || (ch == '\\t')) {\n\t\t\t\tif (state == SCE_HP_START) {\n\t\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\t\tstate = SCE_HP_DEFAULT;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HP_WORD:\n\t\t\tif (!IsAWordChar(ch)) {\n\t\t\t\tclassifyWordHTPy(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord, inScriptType, isMako);\n\t\t\t\tstate = SCE_HP_DEFAULT;\n\t\t\t\tif (ch == '#') {\n\t\t\t\t\tstate = SCE_HP_COMMENTLINE;\n\t\t\t\t} else if (ch == '\\\"') {\n\t\t\t\t\tif (chNext == '\\\"' && chNext2 == '\\\"') {\n\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\tstate = SCE_HP_TRIPLEDOUBLE;\n\t\t\t\t\t\tch = ' ';\n\t\t\t\t\t\tchPrev = ' ';\n\t\t\t\t\t\tchNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstate = SCE_HP_STRING;\n\t\t\t\t\t}\n\t\t\t\t} else if (ch == '\\'') {\n\t\t\t\t\tif (chNext == '\\'' && chNext2 == '\\'') {\n\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\tstate = SCE_HP_TRIPLE;\n\t\t\t\t\t\tch = ' ';\n\t\t\t\t\t\tchPrev = ' ';\n\t\t\t\t\t\tchNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstate = SCE_HP_CHARACTER;\n\t\t\t\t\t}\n\t\t\t\t} else if (IsOperator(ch)) {\n\t\t\t\t\tstyler.ColourTo(i, statePrintForState(SCE_HP_OPERATOR, inScriptType));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HP_COMMENTLINE:\n\t\t\tif (ch == '\\r' || ch == '\\n') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HP_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HP_STRING:\n\t\t\tif (ch == '\\\\') {\n\t\t\t\tif (chNext == '\\\"' || chNext == '\\'' || chNext == '\\\\') {\n\t\t\t\t\ti++;\n\t\t\t\t\tch = chNext;\n\t\t\t\t\tchNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\n\t\t\t\t}\n\t\t\t} else if (ch == '\\\"') {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_HP_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HP_CHARACTER:\n\t\t\tif (ch == '\\\\') {\n\t\t\t\tif (chNext == '\\\"' || chNext == '\\'' || chNext == '\\\\') {\n\t\t\t\t\ti++;\n\t\t\t\t\tch = chNext;\n\t\t\t\t\tchNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\n\t\t\t\t}\n\t\t\t} else if (ch == '\\'') {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_HP_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HP_TRIPLE:\n\t\t\tif (ch == '\\'' && chPrev == '\\'' && chPrev2 == '\\'') {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_HP_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HP_TRIPLEDOUBLE:\n\t\t\tif (ch == '\\\"' && chPrev == '\\\"' && chPrev2 == '\\\"') {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_HP_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\t\t///////////// start - PHP state handling\n\t\tcase SCE_HPHP_WORD:\n\t\t\tif (!IsAWordChar(ch)) {\n\t\t\t\tclassifyWordHTPHP(styler.GetStartSegment(), i - 1, keywords5, styler);\n\t\t\t\tif (ch == '/' && chNext == '*') {\n\t\t\t\t\ti++;\n\t\t\t\t\tstate = SCE_HPHP_COMMENT;\n\t\t\t\t} else if (ch == '/' && chNext == '/') {\n\t\t\t\t\ti++;\n\t\t\t\t\tstate = SCE_HPHP_COMMENTLINE;\n\t\t\t\t} else if (ch == '#') {\n\t\t\t\t\tstate = SCE_HPHP_COMMENTLINE;\n\t\t\t\t} else if (ch == '\\\"') {\n\t\t\t\t\tstate = SCE_HPHP_HSTRING;\n\t\t\t\t\tstrcpy(phpStringDelimiter, \"\\\"\");\n\t\t\t\t} else if (styler.Match(i, \"<<<\")) {\n\t\t\t\t\tbool isSimpleString = false;\n\t\t\t\t\ti = FindPhpStringDelimiter(phpStringDelimiter, sizeof(phpStringDelimiter), i + 3, lengthDoc, styler, isSimpleString);\n\t\t\t\t\tif (strlen(phpStringDelimiter)) {\n\t\t\t\t\t\tstate = (isSimpleString ? SCE_HPHP_SIMPLESTRING : SCE_HPHP_HSTRING);\n\t\t\t\t\t\tif (foldHeredoc) levelCurrent++;\n\t\t\t\t\t}\n\t\t\t\t} else if (ch == '\\'') {\n\t\t\t\t\tstate = SCE_HPHP_SIMPLESTRING;\n\t\t\t\t\tstrcpy(phpStringDelimiter, \"\\'\");\n\t\t\t\t} else if (ch == '$' && IsPhpWordStart(chNext)) {\n\t\t\t\t\tstate = SCE_HPHP_VARIABLE;\n\t\t\t\t} else if (IsOperator(ch)) {\n\t\t\t\t\tstate = SCE_HPHP_OPERATOR;\n\t\t\t\t} else {\n\t\t\t\t\tstate = SCE_HPHP_DEFAULT;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HPHP_NUMBER:\n\t\t\t// recognize bases 8,10 or 16 integers OR floating-point numbers\n\t\t\tif (!IsADigit(ch)\n\t\t\t\t&& strchr(\".xXabcdefABCDEF\", ch) == NULL\n\t\t\t\t&& ((ch != '-' && ch != '+') || (chPrev != 'e' && chPrev != 'E'))) {\n\t\t\t\tstyler.ColourTo(i - 1, SCE_HPHP_NUMBER);\n\t\t\t\tif (IsOperator(ch))\n\t\t\t\t\tstate = SCE_HPHP_OPERATOR;\n\t\t\t\telse\n\t\t\t\t\tstate = SCE_HPHP_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HPHP_VARIABLE:\n\t\t\tif (!IsPhpWordChar(chNext)) {\n\t\t\t\tstyler.ColourTo(i, SCE_HPHP_VARIABLE);\n\t\t\t\tstate = SCE_HPHP_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HPHP_COMMENT:\n\t\t\tif (ch == '/' && chPrev == '*') {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_HPHP_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HPHP_COMMENTLINE:\n\t\t\tif (ch == '\\r' || ch == '\\n') {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HPHP_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HPHP_HSTRING:\n\t\t\tif (ch == '\\\\' && (phpStringDelimiter[0] == '\\\"' || chNext == '$' || chNext == '{')) {\n\t\t\t\t// skip the next char\n\t\t\t\ti++;\n\t\t\t} else if (((ch == '{' && chNext == '$') || (ch == '$' && chNext == '{'))\n\t\t\t\t&& IsPhpWordStart(chNext2)) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HPHP_COMPLEX_VARIABLE;\n\t\t\t} else if (ch == '$' && IsPhpWordStart(chNext)) {\n\t\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\t\tstate = SCE_HPHP_HSTRING_VARIABLE;\n\t\t\t} else if (styler.Match(i, phpStringDelimiter)) {\n\t\t\t\tif (phpStringDelimiter[0] == '\\\"') {\n\t\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\t\tstate = SCE_HPHP_DEFAULT;\n\t\t\t\t} else if (isLineEnd(chPrev)) {\n\t\t\t\t\tconst int psdLength = static_cast<int>(strlen(phpStringDelimiter));\n\t\t\t\t\tconst char chAfterPsd = styler.SafeGetCharAt(i + psdLength);\n\t\t\t\t\tconst char chAfterPsd2 = styler.SafeGetCharAt(i + psdLength + 1);\n\t\t\t\t\tif (isLineEnd(chAfterPsd) ||\n\t\t\t\t\t\t(chAfterPsd == ';' && isLineEnd(chAfterPsd2))) {\n\t\t\t\t\t\t\ti += (((i + psdLength) < lengthDoc) ? psdLength : lengthDoc) - 1;\n\t\t\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\t\t\tstate = SCE_HPHP_DEFAULT;\n\t\t\t\t\t\tif (foldHeredoc) levelCurrent--;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HPHP_SIMPLESTRING:\n\t\t\tif (phpStringDelimiter[0] == '\\'') {\n\t\t\t\tif (ch == '\\\\') {\n\t\t\t\t\t// skip the next char\n\t\t\t\t\ti++;\n\t\t\t\t} else if (ch == '\\'') {\n\t\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\t\tstate = SCE_HPHP_DEFAULT;\n\t\t\t\t}\n\t\t\t} else if (isLineEnd(chPrev) && styler.Match(i, phpStringDelimiter)) {\n\t\t\t\tconst int psdLength = static_cast<int>(strlen(phpStringDelimiter));\n\t\t\t\tconst char chAfterPsd = styler.SafeGetCharAt(i + psdLength);\n\t\t\t\tconst char chAfterPsd2 = styler.SafeGetCharAt(i + psdLength + 1);\n\t\t\t\tif (isLineEnd(chAfterPsd) ||\n\t\t\t\t(chAfterPsd == ';' && isLineEnd(chAfterPsd2))) {\n\t\t\t\t\ti += (((i + psdLength) < lengthDoc) ? psdLength : lengthDoc) - 1;\n\t\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\t\tstate = SCE_HPHP_DEFAULT;\n\t\t\t\t\tif (foldHeredoc) levelCurrent--;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HPHP_HSTRING_VARIABLE:\n\t\t\tif (!IsPhpWordChar(chNext)) {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_HPHP_HSTRING;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HPHP_COMPLEX_VARIABLE:\n\t\t\tif (ch == '}') {\n\t\t\t\tstyler.ColourTo(i, StateToPrint);\n\t\t\t\tstate = SCE_HPHP_HSTRING;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_HPHP_OPERATOR:\n\t\tcase SCE_HPHP_DEFAULT:\n\t\t\tstyler.ColourTo(i - 1, StateToPrint);\n\t\t\tif (IsADigit(ch) || (ch == '.' && IsADigit(chNext))) {\n\t\t\t\tstate = SCE_HPHP_NUMBER;\n\t\t\t} else if (IsAWordStart(ch)) {\n\t\t\t\tstate = SCE_HPHP_WORD;\n\t\t\t} else if (ch == '/' && chNext == '*') {\n\t\t\t\ti++;\n\t\t\t\tstate = SCE_HPHP_COMMENT;\n\t\t\t} else if (ch == '/' && chNext == '/') {\n\t\t\t\ti++;\n\t\t\t\tstate = SCE_HPHP_COMMENTLINE;\n\t\t\t} else if (ch == '#') {\n\t\t\t\tstate = SCE_HPHP_COMMENTLINE;\n\t\t\t} else if (ch == '\\\"') {\n\t\t\t\tstate = SCE_HPHP_HSTRING;\n\t\t\t\tstrcpy(phpStringDelimiter, \"\\\"\");\n\t\t\t} else if (styler.Match(i, \"<<<\")) {\n\t\t\t\tbool isSimpleString = false;\n\t\t\t\ti = FindPhpStringDelimiter(phpStringDelimiter, sizeof(phpStringDelimiter), i + 3, lengthDoc, styler, isSimpleString);\n\t\t\t\tif (strlen(phpStringDelimiter)) {\n\t\t\t\t\tstate = (isSimpleString ? SCE_HPHP_SIMPLESTRING : SCE_HPHP_HSTRING);\n\t\t\t\t\tif (foldHeredoc) levelCurrent++;\n\t\t\t\t}\n\t\t\t} else if (ch == '\\'') {\n\t\t\t\tstate = SCE_HPHP_SIMPLESTRING;\n\t\t\t\tstrcpy(phpStringDelimiter, \"\\'\");\n\t\t\t} else if (ch == '$' && IsPhpWordStart(chNext)) {\n\t\t\t\tstate = SCE_HPHP_VARIABLE;\n\t\t\t} else if (IsOperator(ch)) {\n\t\t\t\tstate = SCE_HPHP_OPERATOR;\n\t\t\t} else if ((state == SCE_HPHP_OPERATOR) && (IsASpace(ch))) {\n\t\t\t\tstate = SCE_HPHP_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\t\t///////////// end - PHP state handling\n\t\t}\n\n\t\t// Some of the above terminated their lexeme but since the same character starts\n\t\t// the same class again, only reenter if non empty segment.\n\n\t\tbool nonEmptySegment = i >= static_cast<int>(styler.GetStartSegment());\n\t\tif (state == SCE_HB_DEFAULT) {    // One of the above succeeded\n\t\t\tif ((ch == '\\\"') && (nonEmptySegment)) {\n\t\t\t\tstate = SCE_HB_STRING;\n\t\t\t} else if (ch == '\\'') {\n\t\t\t\tstate = SCE_HB_COMMENTLINE;\n\t\t\t} else if (IsAWordStart(ch)) {\n\t\t\t\tstate = SCE_HB_WORD;\n\t\t\t} else if (IsOperator(ch)) {\n\t\t\t\tstyler.ColourTo(i, SCE_HB_DEFAULT);\n\t\t\t}\n\t\t} else if (state == SCE_HBA_DEFAULT) {    // One of the above succeeded\n\t\t\tif ((ch == '\\\"') && (nonEmptySegment)) {\n\t\t\t\tstate = SCE_HBA_STRING;\n\t\t\t} else if (ch == '\\'') {\n\t\t\t\tstate = SCE_HBA_COMMENTLINE;\n\t\t\t} else if (IsAWordStart(ch)) {\n\t\t\t\tstate = SCE_HBA_WORD;\n\t\t\t} else if (IsOperator(ch)) {\n\t\t\t\tstyler.ColourTo(i, SCE_HBA_DEFAULT);\n\t\t\t}\n\t\t} else if (state == SCE_HJ_DEFAULT) {    // One of the above succeeded\n\t\t\tif (ch == '/' && chNext == '*') {\n\t\t\t\tif (styler.SafeGetCharAt(i + 2) == '*')\n\t\t\t\t\tstate = SCE_HJ_COMMENTDOC;\n\t\t\t\telse\n\t\t\t\t\tstate = SCE_HJ_COMMENT;\n\t\t\t} else if (ch == '/' && chNext == '/') {\n\t\t\t\tstate = SCE_HJ_COMMENTLINE;\n\t\t\t} else if ((ch == '\\\"') && (nonEmptySegment)) {\n\t\t\t\tstate = SCE_HJ_DOUBLESTRING;\n\t\t\t} else if ((ch == '\\'') && (nonEmptySegment)) {\n\t\t\t\tstate = SCE_HJ_SINGLESTRING;\n\t\t\t} else if (IsAWordStart(ch)) {\n\t\t\t\tstate = SCE_HJ_WORD;\n\t\t\t} else if (IsOperator(ch)) {\n\t\t\t\tstyler.ColourTo(i, statePrintForState(SCE_HJ_SYMBOLS, inScriptType));\n\t\t\t}\n\t\t}\n\t}\n\n\tswitch (state) {\n\tcase SCE_HJ_WORD:\n\t\tclassifyWordHTJS(styler.GetStartSegment(), lengthDoc - 1, keywords2, styler, inScriptType);\n\t\tbreak;\n\tcase SCE_HB_WORD:\n\t\tclassifyWordHTVB(styler.GetStartSegment(), lengthDoc - 1, keywords3, styler, inScriptType);\n\t\tbreak;\n\tcase SCE_HP_WORD:\n\t\tclassifyWordHTPy(styler.GetStartSegment(), lengthDoc - 1, keywords4, styler, prevWord, inScriptType, isMako);\n\t\tbreak;\n\tcase SCE_HPHP_WORD:\n\t\tclassifyWordHTPHP(styler.GetStartSegment(), lengthDoc - 1, keywords5, styler);\n\t\tbreak;\n\tdefault:\n\t\tStateToPrint = statePrintForState(state, inScriptType);\n\t\tif (static_cast<int>(styler.GetStartSegment()) < lengthDoc)\n\t\t\tstyler.ColourTo(lengthDoc - 1, StateToPrint);\n\t\tbreak;\n\t}\n\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tif (fold) {\n\t\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\t\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n\t}\n}\n\nstatic void ColouriseXMLDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                                  Accessor &styler) {\n\t// Passing in true because we're lexing XML\n\tColouriseHyperTextDoc(startPos, length, initStyle, keywordlists, styler, true);\n}\n\nstatic void ColouriseHTMLDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                                  Accessor &styler) {\n\t// Passing in false because we're notlexing XML\n\tColouriseHyperTextDoc(startPos, length, initStyle, keywordlists, styler, false);\n}\n\nstatic void ColourisePHPScriptDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n        Accessor &styler) {\n\tif (startPos == 0)\n\t\tinitStyle = SCE_HPHP_DEFAULT;\n\tColouriseHTMLDoc(startPos, length, initStyle, keywordlists, styler);\n}\n\nstatic const char * const htmlWordListDesc[] = {\n\t\"HTML elements and attributes\",\n\t\"JavaScript keywords\",\n\t\"VBScript keywords\",\n\t\"Python keywords\",\n\t\"PHP keywords\",\n\t\"SGML and DTD keywords\",\n\t0,\n};\n\nstatic const char * const phpscriptWordListDesc[] = {\n\t\"\", //Unused\n\t\"\", //Unused\n\t\"\", //Unused\n\t\"\", //Unused\n\t\"PHP keywords\",\n\t\"\", //Unused\n\t0,\n};\n\nLexerModule lmHTML(SCLEX_HTML, ColouriseHTMLDoc, \"hypertext\", 0, htmlWordListDesc, 8);\nLexerModule lmXML(SCLEX_XML, ColouriseXMLDoc, \"xml\", 0, htmlWordListDesc, 8);\nLexerModule lmPHPSCRIPT(SCLEX_PHPSCRIPT, ColourisePHPScriptDoc, \"phpscript\", 0, phpscriptWordListDesc, 8);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexHaskell.cpp",
    "content": "/******************************************************************\n *    LexHaskell.cxx\n *\n *    A haskell lexer for the scintilla code control.\n *    Some stuff \"lended\" from LexPython.cxx and LexCPP.cxx.\n *    External lexer stuff inspired from the caml external lexer.\n *    Folder copied from Python's.\n *\n *    Written by Tobias Engvall - tumm at dtek dot chalmers dot se\n *\n *    Several bug fixes by Krasimir Angelov - kr.angelov at gmail.com\n *\n *    Improved by kudah <kudahkukarek@gmail.com>\n *\n *    TODO:\n *    * A proper lexical folder to fold group declarations, comments, pragmas,\n *      #ifdefs, explicit layout, lists, tuples, quasi-quotes, splces, etc, etc,\n *      etc.\n *\n *****************************************************************/\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include <string>\n#include <map>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"PropSetSimple.h\"\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n#include \"OptionSet.h\"\n#include \"CharacterCategory.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n// See https://github.com/ghc/ghc/blob/master/compiler/parser/Lexer.x#L1682\n// Note, letter modifiers are prohibited.\n\nstatic int u_iswupper (int ch) {\n   CharacterCategory c = CategoriseCharacter(ch);\n   return c == ccLu || c == ccLt;\n}\n\nstatic int u_iswalpha (int ch) {\n   CharacterCategory c = CategoriseCharacter(ch);\n   return c == ccLl || c == ccLu || c == ccLt || c == ccLo;\n}\n\nstatic int u_iswalnum (int ch) {\n   CharacterCategory c = CategoriseCharacter(ch);\n   return c == ccLl || c == ccLu || c == ccLt || c == ccLo\n       || c == ccNd || c == ccNo;\n}\n\nstatic int u_IsHaskellSymbol(int ch) {\n   CharacterCategory c = CategoriseCharacter(ch);\n   return c == ccPc || c == ccPd || c == ccPo\n       || c == ccSm || c == ccSc || c == ccSk || c == ccSo;\n}\n\nstatic inline bool IsHaskellLetter(const int ch) {\n   if (IsASCII(ch)) {\n      return (ch >= 'a' && ch <= 'z')\n          || (ch >= 'A' && ch <= 'Z');\n   } else {\n      return u_iswalpha(ch) != 0;\n   }\n}\n\nstatic inline bool IsHaskellAlphaNumeric(const int ch) {\n   if (IsASCII(ch)) {\n      return IsAlphaNumeric(ch);\n   } else {\n      return u_iswalnum(ch) != 0;\n   }\n}\n\nstatic inline bool IsHaskellUpperCase(const int ch) {\n   if (IsASCII(ch)) {\n      return ch >= 'A' && ch <= 'Z';\n   } else {\n      return u_iswupper(ch) != 0;\n   }\n}\n\nstatic inline bool IsAnHaskellOperatorChar(const int ch) {\n   if (IsASCII(ch)) {\n      return\n         (  ch == '!' || ch == '#' || ch == '$' || ch == '%'\n         || ch == '&' || ch == '*' || ch == '+' || ch == '-'\n         || ch == '.' || ch == '/' || ch == ':' || ch == '<'\n         || ch == '=' || ch == '>' || ch == '?' || ch == '@'\n         || ch == '^' || ch == '|' || ch == '~' || ch == '\\\\');\n   } else {\n      return u_IsHaskellSymbol(ch) != 0;\n   }\n}\n\nstatic inline bool IsAHaskellWordStart(const int ch) {\n   return IsHaskellLetter(ch) || ch == '_';\n}\n\nstatic inline bool IsAHaskellWordChar(const int ch) {\n   return (  IsHaskellAlphaNumeric(ch)\n          || ch == '_'\n          || ch == '\\'');\n}\n\nstatic inline bool IsCommentBlockStyle(int style) {\n   return (style >= SCE_HA_COMMENTBLOCK && style <= SCE_HA_COMMENTBLOCK3);\n}\n\nstatic inline bool IsCommentStyle(int style) {\n   return (style >= SCE_HA_COMMENTLINE && style <= SCE_HA_COMMENTBLOCK3)\n       || ( style == SCE_HA_LITERATE_COMMENT\n         || style == SCE_HA_LITERATE_CODEDELIM);\n}\n\n// styles which do not belong to Haskell, but to external tools\nstatic inline bool IsExternalStyle(int style) {\n   return ( style == SCE_HA_PREPROCESSOR\n         || style == SCE_HA_LITERATE_COMMENT\n         || style == SCE_HA_LITERATE_CODEDELIM);\n}\n\nstatic inline int CommentBlockStyleFromNestLevel(const unsigned int nestLevel) {\n   return SCE_HA_COMMENTBLOCK + (nestLevel % 3);\n}\n\n// Mangled version of lexlib/Accessor.cxx IndentAmount.\n// Modified to treat comment blocks as whitespace\n// plus special case for commentline/preprocessor.\nstatic int HaskellIndentAmount(Accessor &styler, const int line) {\n\n   // Determines the indentation level of the current line\n   // Comment blocks are treated as whitespace\n\n   int pos = styler.LineStart(line);\n   int eol_pos = styler.LineStart(line + 1) - 1;\n\n   char ch = styler[pos];\n   int style = styler.StyleAt(pos);\n\n   int indent = 0;\n   bool inPrevPrefix = line > 0;\n\n   int posPrev = inPrevPrefix ? styler.LineStart(line-1) : 0;\n\n   while ((  ch == ' ' || ch == '\\t'\n          || IsCommentBlockStyle(style)\n          || style == SCE_HA_LITERATE_CODEDELIM)\n         && (pos < eol_pos)) {\n      if (inPrevPrefix) {\n         char chPrev = styler[posPrev++];\n         if (chPrev != ' ' && chPrev != '\\t') {\n            inPrevPrefix = false;\n         }\n      }\n      if (ch == '\\t') {\n         indent = (indent / 8 + 1) * 8;\n      } else { // Space or comment block\n         indent++;\n      }\n      pos++;\n      ch = styler[pos];\n      style = styler.StyleAt(pos);\n   }\n\n   indent += SC_FOLDLEVELBASE;\n   // if completely empty line or the start of a comment or preprocessor...\n   if (  styler.LineStart(line) == styler.Length()\n      || ch == ' '\n      || ch == '\\t'\n      || ch == '\\n'\n      || ch == '\\r'\n      || IsCommentStyle(style)\n      || style == SCE_HA_PREPROCESSOR)\n      return indent | SC_FOLDLEVELWHITEFLAG;\n   else\n      return indent;\n}\n\nstruct OptionsHaskell {\n   bool magicHash;\n   bool allowQuotes;\n   bool implicitParams;\n   bool highlightSafe;\n   bool cpp;\n   bool stylingWithinPreprocessor;\n   bool fold;\n   bool foldComment;\n   bool foldCompact;\n   bool foldImports;\n   OptionsHaskell() {\n      magicHash = true;       // Widespread use, enabled by default.\n      allowQuotes = true;     // Widespread use, enabled by default.\n      implicitParams = false; // Fell out of favor, seldom used, disabled.\n      highlightSafe = true;   // Moderately used, doesn't hurt to enable.\n      cpp = true;             // Widespread use, enabled by default;\n      stylingWithinPreprocessor = false;\n      fold = false;\n      foldComment = false;\n      foldCompact = false;\n      foldImports = false;\n   }\n};\n\nstatic const char * const haskellWordListDesc[] = {\n   \"Keywords\",\n   \"FFI\",\n   \"Reserved operators\",\n   0\n};\n\nstruct OptionSetHaskell : public OptionSet<OptionsHaskell> {\n   OptionSetHaskell() {\n      DefineProperty(\"lexer.haskell.allow.hash\", &OptionsHaskell::magicHash,\n         \"Set to 0 to disallow the '#' character at the end of identifiers and \"\n         \"literals with the haskell lexer \"\n         \"(GHC -XMagicHash extension)\");\n\n      DefineProperty(\"lexer.haskell.allow.quotes\", &OptionsHaskell::allowQuotes,\n         \"Set to 0 to disable highlighting of Template Haskell name quotations \"\n         \"and promoted constructors \"\n         \"(GHC -XTemplateHaskell and -XDataKinds extensions)\");\n\n      DefineProperty(\"lexer.haskell.allow.questionmark\", &OptionsHaskell::implicitParams,\n         \"Set to 1 to allow the '?' character at the start of identifiers \"\n         \"with the haskell lexer \"\n         \"(GHC & Hugs -XImplicitParams extension)\");\n\n      DefineProperty(\"lexer.haskell.import.safe\", &OptionsHaskell::highlightSafe,\n         \"Set to 0 to disallow \\\"safe\\\" keyword in imports \"\n         \"(GHC -XSafe, -XTrustworthy, -XUnsafe extensions)\");\n\n      DefineProperty(\"lexer.haskell.cpp\", &OptionsHaskell::cpp,\n         \"Set to 0 to disable C-preprocessor highlighting \"\n         \"(-XCPP extension)\");\n\n      DefineProperty(\"styling.within.preprocessor\", &OptionsHaskell::stylingWithinPreprocessor,\n         \"For Haskell code, determines whether all preprocessor code is styled in the \"\n         \"preprocessor style (0, the default) or only from the initial # to the end \"\n         \"of the command word(1).\"\n         );\n\n      DefineProperty(\"fold\", &OptionsHaskell::fold);\n\n      DefineProperty(\"fold.comment\", &OptionsHaskell::foldComment);\n\n      DefineProperty(\"fold.compact\", &OptionsHaskell::foldCompact);\n\n      DefineProperty(\"fold.haskell.imports\", &OptionsHaskell::foldImports,\n         \"Set to 1 to enable folding of import declarations\");\n\n      DefineWordListSets(haskellWordListDesc);\n   }\n};\n\nclass LexerHaskell : public ILexer {\n   bool literate;\n   int firstImportLine;\n   int firstImportIndent;\n   WordList keywords;\n   WordList ffi;\n   WordList reserved_operators;\n   OptionsHaskell options;\n   OptionSetHaskell osHaskell;\n\n   enum HashCount {\n       oneHash\n      ,twoHashes\n      ,unlimitedHashes\n   };\n\n   enum KeywordMode {\n       HA_MODE_DEFAULT = 0\n      ,HA_MODE_IMPORT1 = 1 // after \"import\", before \"qualified\" or \"safe\" or package name or module name.\n      ,HA_MODE_IMPORT2 = 2 // after module name, before \"as\" or \"hiding\".\n      ,HA_MODE_IMPORT3 = 3 // after \"as\", before \"hiding\"\n      ,HA_MODE_MODULE  = 4 // after \"module\", before module name.\n      ,HA_MODE_FFI     = 5 // after \"foreign\", before FFI keywords\n      ,HA_MODE_TYPE    = 6 // after \"type\" or \"data\", before \"family\"\n   };\n\n   enum LiterateMode {\n       LITERATE_BIRD  = 0 // if '>' is the first character on the line,\n                          //   color '>' as a codedelim and the rest of\n                          //   the line as code.\n                          // else if \"\\begin{code}\" is the only word on the\n                          //    line except whitespace, switch to LITERATE_BLOCK\n                          // otherwise color the line as a literate comment.\n      ,LITERATE_BLOCK = 1 // if the string \"\\end{code}\" is encountered at column\n                          //   0 ignoring all later characters, color the line\n                          //   as a codedelim and switch to LITERATE_BIRD\n                          // otherwise color the line as code.\n   };\n\n   struct HaskellLineInfo {\n      unsigned int nestLevel; // 22 bits ought to be enough for anybody\n      unsigned int nonexternalStyle; // 5 bits, widen if number of styles goes\n                                     // beyond 31.\n      bool pragma;\n      LiterateMode lmode;\n      KeywordMode mode;\n\n      HaskellLineInfo(int state) :\n         nestLevel (state >> 10)\n       , nonexternalStyle ((state >> 5) & 0x1F)\n       , pragma ((state >> 4) & 0x1)\n       , lmode (static_cast<LiterateMode>((state >> 3) & 0x1))\n       , mode (static_cast<KeywordMode>(state & 0x7))\n         {}\n\n      int ToLineState() {\n         return\n              (nestLevel << 10)\n            | (nonexternalStyle << 5)\n            | (pragma << 4)\n            | (lmode << 3)\n            | mode;\n      }\n   };\n\n   inline void skipMagicHash(StyleContext &sc, const HashCount hashes) const {\n      if (options.magicHash && sc.ch == '#') {\n         sc.Forward();\n         if (hashes == twoHashes && sc.ch == '#') {\n            sc.Forward();\n         } else if (hashes == unlimitedHashes) {\n            while (sc.ch == '#') {\n               sc.Forward();\n            }\n         }\n      }\n   }\n\n   bool LineContainsImport(const int line, Accessor &styler) const {\n      if (options.foldImports) {\n         int currentPos = styler.LineStart(line);\n         int style = styler.StyleAt(currentPos);\n\n         int eol_pos = styler.LineStart(line + 1) - 1;\n\n         while (currentPos < eol_pos) {\n            int ch = styler[currentPos];\n            style = styler.StyleAt(currentPos);\n\n            if (ch == ' ' || ch == '\\t'\n             || IsCommentBlockStyle(style)\n             || style == SCE_HA_LITERATE_CODEDELIM) {\n               currentPos++;\n            } else {\n               break;\n            }\n         }\n\n         return (style == SCE_HA_KEYWORD\n              && styler.Match(currentPos, \"import\"));\n      } else {\n         return false;\n      }\n   }\n\n   inline int IndentAmountWithOffset(Accessor &styler, const int line) const {\n      const int indent = HaskellIndentAmount(styler, line);\n      const int indentLevel = indent & SC_FOLDLEVELNUMBERMASK;\n      return indentLevel <= ((firstImportIndent - 1) + SC_FOLDLEVELBASE)\n               ? indent\n               : (indentLevel + firstImportIndent) | (indent & ~SC_FOLDLEVELNUMBERMASK);\n   }\n\n   inline int IndentLevelRemoveIndentOffset(const int indentLevel) const {\n      return indentLevel <= ((firstImportIndent - 1) + SC_FOLDLEVELBASE)\n            ? indentLevel\n            : indentLevel - firstImportIndent;\n   }\n\npublic:\n   LexerHaskell(bool literate_)\n      : literate(literate_)\n      , firstImportLine(-1)\n      , firstImportIndent(0)\n      {}\n   virtual ~LexerHaskell() {}\n\n   void SCI_METHOD Release() {\n      delete this;\n   }\n\n   int SCI_METHOD Version() const {\n      return lvOriginal;\n   }\n\n   const char * SCI_METHOD PropertyNames() {\n      return osHaskell.PropertyNames();\n   }\n\n   int SCI_METHOD PropertyType(const char *name) {\n      return osHaskell.PropertyType(name);\n   }\n\n   const char * SCI_METHOD DescribeProperty(const char *name) {\n      return osHaskell.DescribeProperty(name);\n   }\n\n   int SCI_METHOD PropertySet(const char *key, const char *val);\n\n   const char * SCI_METHOD DescribeWordListSets() {\n      return osHaskell.DescribeWordListSets();\n   }\n\n   int SCI_METHOD WordListSet(int n, const char *wl);\n\n   void SCI_METHOD Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n\n   void SCI_METHOD Fold(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n\n   void * SCI_METHOD PrivateCall(int, void *) {\n      return 0;\n   }\n\n   static ILexer *LexerFactoryHaskell() {\n      return new LexerHaskell(false);\n   }\n\n   static ILexer *LexerFactoryLiterateHaskell() {\n      return new LexerHaskell(true);\n   }\n};\n\nint SCI_METHOD LexerHaskell::PropertySet(const char *key, const char *val) {\n   if (osHaskell.PropertySet(&options, key, val)) {\n      return 0;\n   }\n   return -1;\n}\n\nint SCI_METHOD LexerHaskell::WordListSet(int n, const char *wl) {\n   WordList *wordListN = 0;\n   switch (n) {\n   case 0:\n      wordListN = &keywords;\n      break;\n   case 1:\n      wordListN = &ffi;\n      break;\n   case 2:\n      wordListN = &reserved_operators;\n      break;\n   }\n   int firstModification = -1;\n   if (wordListN) {\n      WordList wlNew;\n      wlNew.Set(wl);\n      if (*wordListN != wlNew) {\n         wordListN->Set(wl);\n         firstModification = 0;\n      }\n   }\n   return firstModification;\n}\n\nvoid SCI_METHOD LexerHaskell::Lex(unsigned int startPos, int length, int initStyle\n                                 ,IDocument *pAccess) {\n   LexAccessor styler(pAccess);\n\n   int lineCurrent = styler.GetLine(startPos);\n\n   HaskellLineInfo hs = HaskellLineInfo(lineCurrent ? styler.GetLineState(lineCurrent-1) : 0);\n\n   // Do not leak onto next line\n   if (initStyle == SCE_HA_STRINGEOL)\n      initStyle = SCE_HA_DEFAULT;\n   else if (initStyle == SCE_HA_LITERATE_CODEDELIM)\n      initStyle = hs.nonexternalStyle;\n\n   StyleContext sc(startPos, length, initStyle, styler);\n\n   int base = 10;\n   bool dot = false;\n\n   bool inDashes = false;\n   bool alreadyInTheMiddleOfOperator = false;\n\n   assert(!(IsCommentBlockStyle(initStyle) && hs.nestLevel == 0));\n\n   while (sc.More()) {\n      // Check for state end\n\n      if (!IsExternalStyle(sc.state)) {\n         hs.nonexternalStyle = sc.state;\n      }\n\n      // For lexer to work, states should unconditionally forward at least one\n      // character.\n      // If they don't, they should still check if they are at line end and\n      // forward if so.\n      // If a state forwards more than one character, it should check every time\n      // that it is not a line end and cease forwarding otherwise.\n      if (sc.atLineEnd) {\n         // Remember the line state for future incremental lexing\n         styler.SetLineState(lineCurrent, hs.ToLineState());\n         lineCurrent++;\n      }\n\n      // Handle line continuation generically.\n      if (sc.ch == '\\\\' && (sc.chNext == '\\n' || sc.chNext == '\\r')\n         && (  sc.state == SCE_HA_STRING\n            || sc.state == SCE_HA_PREPROCESSOR)) {\n         // Remember the line state for future incremental lexing\n         styler.SetLineState(lineCurrent, hs.ToLineState());\n         lineCurrent++;\n\n         sc.Forward();\n         if (sc.ch == '\\r' && sc.chNext == '\\n') {\n            sc.Forward();\n         }\n         sc.Forward();\n\n         continue;\n      }\n\n      if (sc.atLineStart) {\n\n         if (sc.state == SCE_HA_STRING || sc.state == SCE_HA_CHARACTER) {\n            // Prevent SCE_HA_STRINGEOL from leaking back to previous line\n            sc.SetState(sc.state);\n         }\n\n         if (literate && hs.lmode == LITERATE_BIRD) {\n            if (!IsExternalStyle(sc.state)) {\n               sc.SetState(SCE_HA_LITERATE_COMMENT);\n            }\n         }\n      }\n\n      // External\n         // Literate\n      if (  literate && hs.lmode == LITERATE_BIRD && sc.atLineStart\n         && sc.ch == '>') {\n            sc.SetState(SCE_HA_LITERATE_CODEDELIM);\n            sc.ForwardSetState(hs.nonexternalStyle);\n      }\n      else if (literate && hs.lmode == LITERATE_BIRD && sc.atLineStart\n            && (  sc.ch == ' ' || sc.ch == '\\t'\n               || sc.Match(\"\\\\begin{code}\"))) {\n         sc.SetState(sc.state);\n\n         while ((sc.ch == ' ' || sc.ch == '\\t') && sc.More())\n            sc.Forward();\n\n         if (sc.Match(\"\\\\begin{code}\")) {\n            sc.Forward(static_cast<int>(strlen(\"\\\\begin{code}\")));\n\n            bool correct = true;\n\n            while (!sc.atLineEnd && sc.More()) {\n               if (sc.ch != ' ' && sc.ch != '\\t') {\n                  correct = false;\n               }\n               sc.Forward();\n            }\n\n            if (correct) {\n               sc.ChangeState(SCE_HA_LITERATE_CODEDELIM); // color the line end\n               hs.lmode = LITERATE_BLOCK;\n            }\n         }\n      }\n      else if (literate && hs.lmode == LITERATE_BLOCK && sc.atLineStart\n            && sc.Match(\"\\\\end{code}\")) {\n         sc.SetState(SCE_HA_LITERATE_CODEDELIM);\n\n         sc.Forward(static_cast<int>(strlen(\"\\\\end{code}\")));\n\n         while (!sc.atLineEnd && sc.More()) {\n            sc.Forward();\n         }\n\n         sc.SetState(SCE_HA_LITERATE_COMMENT);\n         hs.lmode = LITERATE_BIRD;\n      }\n         // Preprocessor\n      else if (sc.atLineStart && sc.ch == '#' && options.cpp\n            && (!options.stylingWithinPreprocessor || sc.state == SCE_HA_DEFAULT)) {\n         sc.SetState(SCE_HA_PREPROCESSOR);\n         sc.Forward();\n      }\n            // Literate\n      else if (sc.state == SCE_HA_LITERATE_COMMENT) {\n         sc.Forward();\n      }\n      else if (sc.state == SCE_HA_LITERATE_CODEDELIM) {\n         sc.ForwardSetState(hs.nonexternalStyle);\n      }\n            // Preprocessor\n      else if (sc.state == SCE_HA_PREPROCESSOR) {\n         if (sc.atLineEnd) {\n            sc.SetState(options.stylingWithinPreprocessor\n                        ? SCE_HA_DEFAULT\n                        : hs.nonexternalStyle);\n            sc.Forward(); // prevent double counting a line\n         } else if (options.stylingWithinPreprocessor && !IsHaskellLetter(sc.ch)) {\n            sc.SetState(SCE_HA_DEFAULT);\n         } else {\n            sc.Forward();\n         }\n      }\n      // Haskell\n         // Operator\n      else if (sc.state == SCE_HA_OPERATOR) {\n         int style = SCE_HA_OPERATOR;\n\n         if ( sc.ch == ':'\n            && !alreadyInTheMiddleOfOperator\n            // except \"::\"\n            && !( sc.chNext == ':'\n               && !IsAnHaskellOperatorChar(sc.GetRelative(2)))) {\n            style = SCE_HA_CAPITAL;\n         }\n\n         alreadyInTheMiddleOfOperator = false;\n\n         while (IsAnHaskellOperatorChar(sc.ch))\n               sc.Forward();\n\n         char s[100];\n         sc.GetCurrent(s, sizeof(s));\n\n         if (reserved_operators.InList(s))\n            style = SCE_HA_RESERVED_OPERATOR;\n\n         sc.ChangeState(style);\n         sc.SetState(SCE_HA_DEFAULT);\n      }\n         // String\n      else if (sc.state == SCE_HA_STRING) {\n         if (sc.atLineEnd) {\n            sc.ChangeState(SCE_HA_STRINGEOL);\n            sc.ForwardSetState(SCE_HA_DEFAULT);\n         } else if (sc.ch == '\\\"') {\n            sc.Forward();\n            skipMagicHash(sc, oneHash);\n            sc.SetState(SCE_HA_DEFAULT);\n         } else if (sc.ch == '\\\\') {\n            sc.Forward(2);\n         } else {\n            sc.Forward();\n         }\n      }\n         // Char\n      else if (sc.state == SCE_HA_CHARACTER) {\n         if (sc.atLineEnd) {\n            sc.ChangeState(SCE_HA_STRINGEOL);\n            sc.ForwardSetState(SCE_HA_DEFAULT);\n         } else if (sc.ch == '\\'') {\n            sc.Forward();\n            skipMagicHash(sc, oneHash);\n            sc.SetState(SCE_HA_DEFAULT);\n         } else if (sc.ch == '\\\\') {\n            sc.Forward(2);\n         } else {\n            sc.Forward();\n         }\n      }\n         // Number\n      else if (sc.state == SCE_HA_NUMBER) {\n         if (sc.atLineEnd) {\n            sc.SetState(SCE_HA_DEFAULT);\n            sc.Forward(); // prevent double counting a line\n         } else if (IsADigit(sc.ch, base)) {\n            sc.Forward();\n         } else if (sc.ch=='.' && dot && IsADigit(sc.chNext, base)) {\n            sc.Forward(2);\n            dot = false;\n         } else if ((base == 10) &&\n                    (sc.ch == 'e' || sc.ch == 'E') &&\n                    (IsADigit(sc.chNext) || sc.chNext == '+' || sc.chNext == '-')) {\n            sc.Forward();\n            if (sc.ch == '+' || sc.ch == '-')\n                sc.Forward();\n         } else {\n            skipMagicHash(sc, twoHashes);\n            sc.SetState(SCE_HA_DEFAULT);\n         }\n      }\n         // Keyword or Identifier\n      else if (sc.state == SCE_HA_IDENTIFIER) {\n         int style = IsHaskellUpperCase(sc.ch) ? SCE_HA_CAPITAL : SCE_HA_IDENTIFIER;\n\n         assert(IsAHaskellWordStart(sc.ch));\n\n         sc.Forward();\n\n         while (sc.More()) {\n            if (IsAHaskellWordChar(sc.ch)) {\n               sc.Forward();\n            } else if (sc.ch == '.' && style == SCE_HA_CAPITAL) {\n               if (IsHaskellUpperCase(sc.chNext)) {\n                  sc.Forward();\n                  style = SCE_HA_CAPITAL;\n               } else if (IsAHaskellWordStart(sc.chNext)) {\n                  sc.Forward();\n                  style = SCE_HA_IDENTIFIER;\n               } else if (IsAnHaskellOperatorChar(sc.chNext)) {\n                  sc.Forward();\n                  style = sc.ch == ':' ? SCE_HA_CAPITAL : SCE_HA_OPERATOR;\n                  while (IsAnHaskellOperatorChar(sc.ch))\n                     sc.Forward();\n                  break;\n               } else {\n                  break;\n               }\n            } else {\n               break;\n            }\n         }\n\n         skipMagicHash(sc, unlimitedHashes);\n\n         char s[100];\n         sc.GetCurrent(s, sizeof(s));\n\n         KeywordMode new_mode = HA_MODE_DEFAULT;\n\n         if (keywords.InList(s)) {\n            style = SCE_HA_KEYWORD;\n         } else if (style == SCE_HA_CAPITAL) {\n            if (hs.mode == HA_MODE_IMPORT1 || hs.mode == HA_MODE_IMPORT3) {\n               style    = SCE_HA_MODULE;\n               new_mode = HA_MODE_IMPORT2;\n            } else if (hs.mode == HA_MODE_MODULE) {\n               style = SCE_HA_MODULE;\n            }\n         } else if (hs.mode == HA_MODE_IMPORT1 &&\n                    strcmp(s,\"qualified\") == 0) {\n             style    = SCE_HA_KEYWORD;\n             new_mode = HA_MODE_IMPORT1;\n         } else if (options.highlightSafe &&\n                    hs.mode == HA_MODE_IMPORT1 &&\n                    strcmp(s,\"safe\") == 0) {\n             style    = SCE_HA_KEYWORD;\n             new_mode = HA_MODE_IMPORT1;\n         } else if (hs.mode == HA_MODE_IMPORT2) {\n             if (strcmp(s,\"as\") == 0) {\n                style    = SCE_HA_KEYWORD;\n                new_mode = HA_MODE_IMPORT3;\n            } else if (strcmp(s,\"hiding\") == 0) {\n                style     = SCE_HA_KEYWORD;\n            }\n         } else if (hs.mode == HA_MODE_TYPE) {\n            if (strcmp(s,\"family\") == 0)\n               style    = SCE_HA_KEYWORD;\n         }\n\n         if (hs.mode == HA_MODE_FFI) {\n            if (ffi.InList(s)) {\n               style = SCE_HA_KEYWORD;\n               new_mode = HA_MODE_FFI;\n            }\n         }\n\n         sc.ChangeState(style);\n         sc.SetState(SCE_HA_DEFAULT);\n\n         if (strcmp(s,\"import\") == 0 && hs.mode != HA_MODE_FFI)\n            new_mode = HA_MODE_IMPORT1;\n         else if (strcmp(s,\"module\") == 0)\n            new_mode = HA_MODE_MODULE;\n         else if (strcmp(s,\"foreign\") == 0)\n            new_mode = HA_MODE_FFI;\n         else if (strcmp(s,\"type\") == 0\n               || strcmp(s,\"data\") == 0)\n            new_mode = HA_MODE_TYPE;\n\n         hs.mode = new_mode;\n      }\n\n         // Comments\n            // Oneliner\n      else if (sc.state == SCE_HA_COMMENTLINE) {\n         if (sc.atLineEnd) {\n            sc.SetState(hs.pragma ? SCE_HA_PRAGMA : SCE_HA_DEFAULT);\n            sc.Forward(); // prevent double counting a line\n         } else if (inDashes && sc.ch != '-' && !hs.pragma) {\n            inDashes = false;\n            if (IsAnHaskellOperatorChar(sc.ch)) {\n               alreadyInTheMiddleOfOperator = true;\n               sc.ChangeState(SCE_HA_OPERATOR);\n            }\n         } else {\n            sc.Forward();\n         }\n      }\n            // Nested\n      else if (IsCommentBlockStyle(sc.state)) {\n         if (sc.Match('{','-')) {\n            sc.SetState(CommentBlockStyleFromNestLevel(hs.nestLevel));\n            sc.Forward(2);\n            hs.nestLevel++;\n         } else if (sc.Match('-','}')) {\n            sc.Forward(2);\n            assert(hs.nestLevel > 0);\n            if (hs.nestLevel > 0)\n               hs.nestLevel--;\n            sc.SetState(\n               hs.nestLevel == 0\n                  ? (hs.pragma ? SCE_HA_PRAGMA : SCE_HA_DEFAULT)\n                  : CommentBlockStyleFromNestLevel(hs.nestLevel - 1));\n         } else {\n            sc.Forward();\n         }\n      }\n            // Pragma\n      else if (sc.state == SCE_HA_PRAGMA) {\n         if (sc.Match(\"#-}\")) {\n            hs.pragma = false;\n            sc.Forward(3);\n            sc.SetState(SCE_HA_DEFAULT);\n         } else if (sc.Match('-','-')) {\n            sc.SetState(SCE_HA_COMMENTLINE);\n            sc.Forward(2);\n            inDashes = false;\n         } else if (sc.Match('{','-')) {\n            sc.SetState(CommentBlockStyleFromNestLevel(hs.nestLevel));\n            sc.Forward(2);\n            hs.nestLevel = 1;\n         } else {\n            sc.Forward();\n         }\n      }\n            // New state?\n      else if (sc.state == SCE_HA_DEFAULT) {\n         // Digit\n         if (IsADigit(sc.ch)) {\n            hs.mode = HA_MODE_DEFAULT;\n\n            sc.SetState(SCE_HA_NUMBER);\n            if (sc.ch == '0' && (sc.chNext == 'X' || sc.chNext == 'x')) {\n               // Match anything starting with \"0x\" or \"0X\", too\n               sc.Forward(2);\n               base = 16;\n               dot = false;\n            } else if (sc.ch == '0' && (sc.chNext == 'O' || sc.chNext == 'o')) {\n               // Match anything starting with \"0o\" or \"0O\", too\n               sc.Forward(2);\n               base = 8;\n               dot = false;\n            } else {\n               sc.Forward();\n               base = 10;\n               dot = true;\n            }\n         }\n         // Pragma\n         else if (sc.Match(\"{-#\")) {\n            hs.pragma = true;\n            sc.SetState(SCE_HA_PRAGMA);\n            sc.Forward(3);\n         }\n         // Comment line\n         else if (sc.Match('-','-')) {\n            sc.SetState(SCE_HA_COMMENTLINE);\n            sc.Forward(2);\n            inDashes = true;\n         }\n         // Comment block\n         else if (sc.Match('{','-')) {\n            sc.SetState(CommentBlockStyleFromNestLevel(hs.nestLevel));\n            sc.Forward(2);\n            hs.nestLevel = 1;\n         }\n         // String\n         else if (sc.ch == '\\\"') {\n            sc.SetState(SCE_HA_STRING);\n            sc.Forward();\n         }\n         // Character or quoted name or promoted term\n         else if (sc.ch == '\\'') {\n            hs.mode = HA_MODE_DEFAULT;\n\n            sc.SetState(SCE_HA_CHARACTER);\n            sc.Forward();\n\n            if (options.allowQuotes) {\n               // Quoted type ''T\n               if (sc.ch=='\\'' && IsAHaskellWordStart(sc.chNext)) {\n                  sc.Forward();\n                  sc.ChangeState(SCE_HA_IDENTIFIER);\n               } else if (sc.chNext != '\\'') {\n                  // Quoted name 'n or promoted constructor 'N\n                  if (IsAHaskellWordStart(sc.ch)) {\n                     sc.ChangeState(SCE_HA_IDENTIFIER);\n                  // Promoted constructor operator ':~>\n                  } else if (sc.ch == ':') {\n                     alreadyInTheMiddleOfOperator = false;\n                     sc.ChangeState(SCE_HA_OPERATOR);\n                  // Promoted list or tuple '[T]\n                  } else if (sc.ch == '[' || sc.ch== '(') {\n                     sc.ChangeState(SCE_HA_OPERATOR);\n                     sc.ForwardSetState(SCE_HA_DEFAULT);\n                  }\n               }\n            }\n         }\n         // Operator starting with '?' or an implicit parameter\n         else if (sc.ch == '?') {\n            hs.mode = HA_MODE_DEFAULT;\n\n            alreadyInTheMiddleOfOperator = false;\n            sc.SetState(SCE_HA_OPERATOR);\n\n            if (  options.implicitParams\n               && IsAHaskellWordStart(sc.chNext)\n               && !IsHaskellUpperCase(sc.chNext)) {\n               sc.Forward();\n               sc.ChangeState(SCE_HA_IDENTIFIER);\n            }\n         }\n         // Operator\n         else if (IsAnHaskellOperatorChar(sc.ch)) {\n            hs.mode = HA_MODE_DEFAULT;\n\n            sc.SetState(SCE_HA_OPERATOR);\n         }\n         // Braces and punctuation\n         else if (sc.ch == ',' || sc.ch == ';'\n               || sc.ch == '(' || sc.ch == ')'\n               || sc.ch == '[' || sc.ch == ']'\n               || sc.ch == '{' || sc.ch == '}') {\n            sc.SetState(SCE_HA_OPERATOR);\n            sc.ForwardSetState(SCE_HA_DEFAULT);\n         }\n         // Keyword or Identifier\n         else if (IsAHaskellWordStart(sc.ch)) {\n            sc.SetState(SCE_HA_IDENTIFIER);\n         // Something we don't care about\n         } else {\n            sc.Forward();\n         }\n      }\n            // This branch should never be reached.\n      else {\n         assert(false);\n         sc.Forward();\n      }\n   }\n   sc.Complete();\n}\n\nvoid SCI_METHOD LexerHaskell::Fold(unsigned int startPos, int length, int // initStyle\n                                  ,IDocument *pAccess) {\n   if (!options.fold)\n      return;\n\n   Accessor styler(pAccess, NULL);\n\n   int lineCurrent = styler.GetLine(startPos);\n\n   if (lineCurrent <= firstImportLine) {\n      firstImportLine = -1; // readjust first import position\n      firstImportIndent = 0;\n   }\n\n   const int maxPos = startPos + length;\n   const int maxLines =\n      maxPos == styler.Length()\n         ? styler.GetLine(maxPos)\n         : styler.GetLine(maxPos - 1);  // Requested last line\n   const int docLines = styler.GetLine(styler.Length()); // Available last line\n\n   // Backtrack to previous non-blank line so we can determine indent level\n   // for any white space lines\n   // and so we can fix any preceding fold level (which is why we go back\n   // at least one line in all cases)\n   bool importHere = LineContainsImport(lineCurrent, styler);\n   int indentCurrent = IndentAmountWithOffset(styler, lineCurrent);\n\n   while (lineCurrent > 0) {\n      lineCurrent--;\n      importHere = LineContainsImport(lineCurrent, styler);\n      indentCurrent = IndentAmountWithOffset(styler, lineCurrent);\n      if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG))\n         break;\n   }\n\n   int indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;\n\n   if (importHere) {\n      indentCurrentLevel = IndentLevelRemoveIndentOffset(indentCurrentLevel);\n      if (firstImportLine == -1) {\n         firstImportLine = lineCurrent;\n         firstImportIndent = (1 + indentCurrentLevel) - SC_FOLDLEVELBASE;\n      }\n      if (firstImportLine != lineCurrent) {\n         indentCurrentLevel++;\n      }\n   }\n\n   indentCurrent = indentCurrentLevel | (indentCurrent & ~SC_FOLDLEVELNUMBERMASK);\n\n   // Process all characters to end of requested range\n   //that hangs over the end of the range.  Cap processing in all cases\n   // to end of document.\n   while (lineCurrent <= docLines && lineCurrent <= maxLines) {\n\n      // Gather info\n      int lineNext = lineCurrent + 1;\n      importHere = false;\n      int indentNext = indentCurrent;\n\n      if (lineNext <= docLines) {\n         // Information about next line is only available if not at end of document\n         importHere = LineContainsImport(lineNext, styler);\n         indentNext = IndentAmountWithOffset(styler, lineNext);\n      }\n      if (indentNext & SC_FOLDLEVELWHITEFLAG)\n         indentNext = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel;\n\n      // Skip past any blank lines for next indent level info; we skip also\n      // comments (all comments, not just those starting in column 0)\n      // which effectively folds them into surrounding code rather\n      // than screwing up folding.\n\n      while (lineNext < docLines && (indentNext & SC_FOLDLEVELWHITEFLAG)) {\n         lineNext++;\n         importHere = LineContainsImport(lineNext, styler);\n         indentNext = IndentAmountWithOffset(styler, lineNext);\n      }\n\n      int indentNextLevel = indentNext & SC_FOLDLEVELNUMBERMASK;\n\n      if (importHere) {\n         indentNextLevel = IndentLevelRemoveIndentOffset(indentNextLevel);\n         if (firstImportLine == -1) {\n            firstImportLine = lineNext;\n            firstImportIndent = (1 + indentNextLevel) - SC_FOLDLEVELBASE;\n         }\n         if (firstImportLine != lineNext) {\n            indentNextLevel++;\n         }\n      }\n\n      indentNext = indentNextLevel | (indentNext & ~SC_FOLDLEVELNUMBERMASK);\n\n      const int levelBeforeComments = Maximum(indentCurrentLevel,indentNextLevel);\n\n      // Now set all the indent levels on the lines we skipped\n      // Do this from end to start.  Once we encounter one line\n      // which is indented more than the line after the end of\n      // the comment-block, use the level of the block before\n\n      int skipLine = lineNext;\n      int skipLevel = indentNextLevel;\n\n      while (--skipLine > lineCurrent) {\n         int skipLineIndent = IndentAmountWithOffset(styler, skipLine);\n\n         if (options.foldCompact) {\n            if ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > indentNextLevel) {\n               skipLevel = levelBeforeComments;\n            }\n\n            int whiteFlag = skipLineIndent & SC_FOLDLEVELWHITEFLAG;\n\n            styler.SetLevel(skipLine, skipLevel | whiteFlag);\n         } else {\n            if (  (skipLineIndent & SC_FOLDLEVELNUMBERMASK) > indentNextLevel\n               && !(skipLineIndent & SC_FOLDLEVELWHITEFLAG)) {\n               skipLevel = levelBeforeComments;\n            }\n\n            styler.SetLevel(skipLine, skipLevel);\n         }\n      }\n\n      int lev = indentCurrent;\n\n      if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {\n         if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))\n            lev |= SC_FOLDLEVELHEADERFLAG;\n      }\n\n      // Set fold level for this line and move to next line\n      styler.SetLevel(lineCurrent, options.foldCompact ? lev : lev & ~SC_FOLDLEVELWHITEFLAG);\n\n      indentCurrent = indentNext;\n      indentCurrentLevel = indentNextLevel;\n      lineCurrent = lineNext;\n   }\n\n   // NOTE: Cannot set level of last line here because indentCurrent doesn't have\n   // header flag set; the loop above is crafted to take care of this case!\n   //styler.SetLevel(lineCurrent, indentCurrent);\n}\n\nLexerModule lmHaskell(SCLEX_HASKELL, LexerHaskell::LexerFactoryHaskell, \"haskell\", haskellWordListDesc);\nLexerModule lmLiterateHaskell(SCLEX_LITERATEHASKELL, LexerHaskell::LexerFactoryLiterateHaskell, \"literatehaskell\", haskellWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexInno.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexInno.cxx\n ** Lexer for Inno Setup scripts.\n **/\n// Written by Friedrich Vedder <fvedd@t-online.de>, using code from LexOthers.cxx.\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic void ColouriseInnoDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) {\n\tint state = SCE_INNO_DEFAULT;\n\tchar chPrev;\n\tchar ch = 0;\n\tchar chNext = styler[startPos];\n\tint lengthDoc = startPos + length;\n\tchar *buffer = new char[length];\n\tint bufferCount = 0;\n\tbool isBOL, isEOL, isWS, isBOLWS = 0;\n\tbool isCStyleComment = false;\n\n\tWordList &sectionKeywords = *keywordLists[0];\n\tWordList &standardKeywords = *keywordLists[1];\n\tWordList &parameterKeywords = *keywordLists[2];\n\tWordList &preprocessorKeywords = *keywordLists[3];\n\tWordList &pascalKeywords = *keywordLists[4];\n\tWordList &userKeywords = *keywordLists[5];\n\n\tint curLine = styler.GetLine(startPos);\n\tint curLineState = curLine > 0 ? styler.GetLineState(curLine - 1) : 0;\n\tbool isCode = (curLineState == 1);\n\n\t// Go through all provided text segment\n\t// using the hand-written state machine shown below\n\tstyler.StartAt(startPos);\n\tstyler.StartSegment(startPos);\n\tfor (int i = startPos; i < lengthDoc; i++) {\n\t\tchPrev = ch;\n\t\tch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\n\t\tif (styler.IsLeadByte(ch)) {\n\t\t\tchNext = styler.SafeGetCharAt(i + 2);\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tisBOL = (chPrev == 0) || (chPrev == '\\n') || (chPrev == '\\r' && ch != '\\n');\n\t\tisBOLWS = (isBOL) ? 1 : (isBOLWS && (chPrev == ' ' || chPrev == '\\t'));\n\t\tisEOL = (ch == '\\n' || ch == '\\r');\n\t\tisWS = (ch == ' ' || ch == '\\t');\n\n\t\tif ((ch == '\\r' && chNext != '\\n') || (ch == '\\n')) {\n\t\t\t// Remember the line state for future incremental lexing\n\t\t\tcurLine = styler.GetLine(i);\n\t\t\tstyler.SetLineState(curLine, (isCode ? 1 : 0));\n\t\t}\n\n\t\tswitch(state) {\n\t\t\tcase SCE_INNO_DEFAULT:\n\t\t\t\tif (!isCode && ch == ';' && isBOLWS) {\n\t\t\t\t\t// Start of a comment\n\t\t\t\t\tstate = SCE_INNO_COMMENT;\n\t\t\t\t} else if (ch == '[' && isBOLWS) {\n\t\t\t\t\t// Start of a section name\n\t\t\t\t\tbufferCount = 0;\n\t\t\t\t\tstate = SCE_INNO_SECTION;\n\t\t\t\t} else if (ch == '#' && isBOLWS) {\n\t\t\t\t\t// Start of a preprocessor directive\n\t\t\t\t\tstate = SCE_INNO_PREPROC;\n\t\t\t\t} else if (!isCode && ch == '{' && chNext != '{' && chPrev != '{') {\n\t\t\t\t\t// Start of an inline expansion\n\t\t\t\t\tstate = SCE_INNO_INLINE_EXPANSION;\n\t\t\t\t} else if (isCode && (ch == '{' || (ch == '(' && chNext == '*'))) {\n\t\t\t\t\t// Start of a Pascal comment\n\t\t\t\t\tstate = SCE_INNO_COMMENT_PASCAL;\n\t\t\t\t\tisCStyleComment = false;\n\t\t\t\t} else if (isCode && ch == '/' && chNext == '/') {\n\t\t\t\t\t// Apparently, C-style comments are legal, too\n\t\t\t\t\tstate = SCE_INNO_COMMENT_PASCAL;\n\t\t\t\t\tisCStyleComment = true;\n\t\t\t\t} else if (ch == '\"') {\n\t\t\t\t\t// Start of a double-quote string\n\t\t\t\t\tstate = SCE_INNO_STRING_DOUBLE;\n\t\t\t\t} else if (ch == '\\'') {\n\t\t\t\t\t// Start of a single-quote string\n\t\t\t\t\tstate = SCE_INNO_STRING_SINGLE;\n\t\t\t\t} else if (IsASCII(ch) && (isalpha(ch) || (ch == '_'))) {\n\t\t\t\t\t// Start of an identifier\n\t\t\t\t\tbufferCount = 0;\n\t\t\t\t\tbuffer[bufferCount++] = static_cast<char>(tolower(ch));\n\t\t\t\t\tstate = SCE_INNO_IDENTIFIER;\n\t\t\t\t} else {\n\t\t\t\t\t// Style it the default style\n\t\t\t\t\tstyler.ColourTo(i,SCE_INNO_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_INNO_COMMENT:\n\t\t\t\tif (isEOL) {\n\t\t\t\t\tstate = SCE_INNO_DEFAULT;\n\t\t\t\t\tstyler.ColourTo(i,SCE_INNO_COMMENT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_INNO_IDENTIFIER:\n\t\t\t\tif (IsASCII(ch) && (isalnum(ch) || (ch == '_'))) {\n\t\t\t\t\tbuffer[bufferCount++] = static_cast<char>(tolower(ch));\n\t\t\t\t} else {\n\t\t\t\t\tstate = SCE_INNO_DEFAULT;\n\t\t\t\t\tbuffer[bufferCount] = '\\0';\n\n\t\t\t\t\t// Check if the buffer contains a keyword\n\t\t\t\t\tif (!isCode && standardKeywords.InList(buffer)) {\n\t\t\t\t\t\tstyler.ColourTo(i-1,SCE_INNO_KEYWORD);\n\t\t\t\t\t} else if (!isCode && parameterKeywords.InList(buffer)) {\n\t\t\t\t\t\tstyler.ColourTo(i-1,SCE_INNO_PARAMETER);\n\t\t\t\t\t} else if (isCode && pascalKeywords.InList(buffer)) {\n\t\t\t\t\t\tstyler.ColourTo(i-1,SCE_INNO_KEYWORD_PASCAL);\n\t\t\t\t\t} else if (!isCode && userKeywords.InList(buffer)) {\n\t\t\t\t\t\tstyler.ColourTo(i-1,SCE_INNO_KEYWORD_USER);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstyler.ColourTo(i-1,SCE_INNO_DEFAULT);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Push back the faulty character\n\t\t\t\t\tchNext = styler[i--];\n\t\t\t\t\tch = chPrev;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_INNO_SECTION:\n\t\t\t\tif (ch == ']') {\n\t\t\t\t\tstate = SCE_INNO_DEFAULT;\n\t\t\t\t\tbuffer[bufferCount] = '\\0';\n\n\t\t\t\t\t// Check if the buffer contains a section name\n\t\t\t\t\tif (sectionKeywords.InList(buffer)) {\n\t\t\t\t\t\tstyler.ColourTo(i,SCE_INNO_SECTION);\n\t\t\t\t\t\tisCode = !CompareCaseInsensitive(buffer, \"code\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstyler.ColourTo(i,SCE_INNO_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t} else if (IsASCII(ch) && (isalnum(ch) || (ch == '_'))) {\n\t\t\t\t\tbuffer[bufferCount++] = static_cast<char>(tolower(ch));\n\t\t\t\t} else {\n\t\t\t\t\tstate = SCE_INNO_DEFAULT;\n\t\t\t\t\tstyler.ColourTo(i,SCE_INNO_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_INNO_PREPROC:\n\t\t\t\tif (isWS || isEOL) {\n\t\t\t\t\tif (IsASCII(chPrev) && isalpha(chPrev)) {\n\t\t\t\t\t\tstate = SCE_INNO_DEFAULT;\n\t\t\t\t\t\tbuffer[bufferCount] = '\\0';\n\n\t\t\t\t\t\t// Check if the buffer contains a preprocessor directive\n\t\t\t\t\t\tif (preprocessorKeywords.InList(buffer)) {\n\t\t\t\t\t\t\tstyler.ColourTo(i-1,SCE_INNO_PREPROC);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstyler.ColourTo(i-1,SCE_INNO_DEFAULT);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Push back the faulty character\n\t\t\t\t\t\tchNext = styler[i--];\n\t\t\t\t\t\tch = chPrev;\n\t\t\t\t\t}\n\t\t\t\t} else if (IsASCII(ch) && isalpha(ch)) {\n\t\t\t\t\tif (chPrev == '#' || chPrev == ' ' || chPrev == '\\t')\n\t\t\t\t\t\tbufferCount = 0;\n\t\t\t\t\tbuffer[bufferCount++] = static_cast<char>(tolower(ch));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_INNO_STRING_DOUBLE:\n\t\t\t\tif (ch == '\"' || isEOL) {\n\t\t\t\t\tstate = SCE_INNO_DEFAULT;\n\t\t\t\t\tstyler.ColourTo(i,SCE_INNO_STRING_DOUBLE);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_INNO_STRING_SINGLE:\n\t\t\t\tif (ch == '\\'' || isEOL) {\n\t\t\t\t\tstate = SCE_INNO_DEFAULT;\n\t\t\t\t\tstyler.ColourTo(i,SCE_INNO_STRING_SINGLE);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_INNO_INLINE_EXPANSION:\n\t\t\t\tif (ch == '}') {\n\t\t\t\t\tstate = SCE_INNO_DEFAULT;\n\t\t\t\t\tstyler.ColourTo(i,SCE_INNO_INLINE_EXPANSION);\n\t\t\t\t} else if (isEOL) {\n\t\t\t\t\tstate = SCE_INNO_DEFAULT;\n\t\t\t\t\tstyler.ColourTo(i,SCE_INNO_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_INNO_COMMENT_PASCAL:\n\t\t\t\tif (isCStyleComment) {\n\t\t\t\t\tif (isEOL) {\n\t\t\t\t\t\tstate = SCE_INNO_DEFAULT;\n\t\t\t\t\t\tstyler.ColourTo(i,SCE_INNO_COMMENT_PASCAL);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (ch == '}' || (ch == ')' && chPrev == '*')) {\n\t\t\t\t\t\tstate = SCE_INNO_DEFAULT;\n\t\t\t\t\t\tstyler.ColourTo(i,SCE_INNO_COMMENT_PASCAL);\n\t\t\t\t\t} else if (isEOL) {\n\t\t\t\t\t\tstate = SCE_INNO_DEFAULT;\n\t\t\t\t\t\tstyler.ColourTo(i,SCE_INNO_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t}\n\t}\n\tdelete []buffer;\n}\n\nstatic const char * const innoWordListDesc[] = {\n\t\"Sections\",\n\t\"Keywords\",\n\t\"Parameters\",\n\t\"Preprocessor directives\",\n\t\"Pascal keywords\",\n\t\"User defined keywords\",\n\t0\n};\n\nstatic void FoldInnoDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {\n\tunsigned int endPos = startPos + length;\n\tchar chNext = styler[startPos];\n\n\tint lineCurrent = styler.GetLine(startPos);\n\n\tbool sectionFlag = false;\n\tint levelPrev = lineCurrent > 0 ? styler.LevelAt(lineCurrent - 1) : SC_FOLDLEVELBASE;\n\tint level;\n\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler[i+1];\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tint style = styler.StyleAt(i);\n\n\t\tif (style == SCE_INNO_SECTION)\n\t\t\tsectionFlag = true;\n\n\t\tif (atEOL || i == endPos - 1) {\n\t\t\tif (sectionFlag) {\n\t\t\t\tlevel = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;\n\t\t\t\tif (level == levelPrev)\n\t\t\t\t\tstyler.SetLevel(lineCurrent - 1, levelPrev & ~SC_FOLDLEVELHEADERFLAG);\n\t\t\t} else {\n\t\t\t\tlevel = levelPrev & SC_FOLDLEVELNUMBERMASK;\n\t\t\t\tif (levelPrev & SC_FOLDLEVELHEADERFLAG)\n\t\t\t\t\tlevel++;\n\t\t\t}\n\n\t\t\tstyler.SetLevel(lineCurrent, level);\n\n\t\t\tlevelPrev = level;\n\t\t\tlineCurrent++;\n\t\t\tsectionFlag = false;\n\t\t}\n\t}\n}\n\nLexerModule lmInno(SCLEX_INNOSETUP, ColouriseInnoDoc, \"inno\", FoldInnoDoc, innoWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexKVIrc.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexKVIrc.cxx\n ** Lexer for KVIrc script.\n **/\n// Copyright 2013 by OmegaPhil <OmegaPhil+scintilla@gmail.com>, based in\n// part from LexPython Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\n// and LexCmake Copyright 2007 by Cristian Adam <cristian [dot] adam [at] gmx [dot] net>\n\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n\n/* KVIrc Script syntactic rules: http://www.kvirc.net/doc/doc_syntactic_rules.html */\n\n/* Utility functions */\nstatic inline bool IsAWordChar(int ch) {\n\n    /* Keyword list includes modules, i.e. words including '.', and\n     * alias namespaces include ':' */\n    return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.'\n            || ch == ':');\n}\nstatic inline bool IsAWordStart(int ch) {\n\n    /* Functions (start with '$') are treated separately to keywords */\n    return (ch < 0x80) && (isalnum(ch) || ch == '_' );\n}\n\n/* Interface function called by Scintilla to request some text to be\n syntax highlighted */\nstatic void ColouriseKVIrcDoc(unsigned int startPos, int length,\n                              int initStyle, WordList *keywordlists[],\n                              Accessor &styler)\n{\n    /* Fetching style context */\n    StyleContext sc(startPos, length, initStyle, styler);\n\n    /* Accessing keywords and function-marking keywords */\n    WordList &keywords = *keywordlists[0];\n    WordList &functionKeywords = *keywordlists[1];\n\n    /* Looping for all characters - only automatically moving forward\n     * when asked for (transitions leaving strings and keywords do this\n     * already) */\n    bool next = true;\n    for( ; sc.More(); next ? sc.Forward() : (void)0 )\n    {\n        /* Resetting next */\n        next = true;\n\n        /* Dealing with different states */\n        switch (sc.state)\n        {\n            case SCE_KVIRC_DEFAULT:\n\n                /* Detecting single-line comments\n                 * Unfortunately KVIrc script allows raw '#<channel\n                 * name>' to be used, and appending # to an array returns\n                 * its length...\n                 * Going for a compromise where single line comments not\n                 * starting on a newline are allowed in all cases except\n                 * when they are preceeded with an opening bracket or comma\n                 * (this will probably be the most common style a valid\n                 * string-less channel name will be used with), with the\n                 * array length case included\n                 */\n                if (\n                    (sc.ch == '#' && sc.atLineStart) ||\n                    (sc.ch == '#' && (\n                        sc.chPrev != '(' && sc.chPrev != ',' &&\n                        sc.chPrev != ']')\n                    )\n                )\n                {\n                    sc.SetState(SCE_KVIRC_COMMENT);\n                    break;\n                }\n\n                /* Detecting multi-line comments */\n                if (sc.Match('/', '*'))\n                {\n                    sc.SetState(SCE_KVIRC_COMMENTBLOCK);\n                    break;\n                }\n\n                /* Detecting strings */\n                if (sc.ch == '\"')\n                {\n                    sc.SetState(SCE_KVIRC_STRING);\n                    break;\n                }\n\n                /* Detecting functions */\n                if (sc.ch == '$')\n                {\n                    sc.SetState(SCE_KVIRC_FUNCTION);\n                    break;\n                }\n\n                /* Detecting variables */\n                if (sc.ch == '%')\n                {\n                    sc.SetState(SCE_KVIRC_VARIABLE);\n                    break;\n                }\n\n                /* Detecting numbers - isdigit is unsafe as it does not\n                 * validate, use CharacterSet.h functions */\n                if (IsADigit(sc.ch))\n                {\n                    sc.SetState(SCE_KVIRC_NUMBER);\n                    break;\n                }\n\n                /* Detecting words */\n                if (IsAWordStart(sc.ch) && IsAWordChar(sc.chNext))\n                {\n                    sc.SetState(SCE_KVIRC_WORD);\n                    sc.Forward();\n                    break;\n                }\n\n                /* Detecting operators */\n                if (isoperator(sc.ch))\n                {\n                    sc.SetState(SCE_KVIRC_OPERATOR);\n                    break;\n                }\n\n                break;\n\n            case SCE_KVIRC_COMMENT:\n\n                /* Breaking out of single line comment when a newline\n                 * is introduced */\n                if (sc.ch == '\\r' || sc.ch == '\\n')\n                {\n                    sc.SetState(SCE_KVIRC_DEFAULT);\n                    break;\n                }\n\n                break;\n\n            case SCE_KVIRC_COMMENTBLOCK:\n\n                /* Detecting end of multi-line comment */\n                if (sc.Match('*', '/'))\n                {\n                    // Moving the current position forward two characters\n                    // so that '*/' is included in the comment\n                    sc.Forward(2);\n                    sc.SetState(SCE_KVIRC_DEFAULT);\n\n                    /* Comment has been exited and the current position\n                     * moved forward, yet the new current character\n                     * has yet to be defined - loop without moving\n                     * forward again */\n                    next = false;\n                    break;\n                }\n\n                break;\n\n            case SCE_KVIRC_STRING:\n\n                /* Detecting end of string - closing speechmarks */\n                if (sc.ch == '\"')\n                {\n                    /* Allowing escaped speechmarks to pass */\n                    if (sc.chPrev == '\\\\')\n                        break;\n\n                    /* Moving the current position forward to capture the\n                     * terminating speechmarks, and ending string */\n                    sc.ForwardSetState(SCE_KVIRC_DEFAULT);\n\n                    /* String has been exited and the current position\n                     * moved forward, yet the new current character\n                     * has yet to be defined - loop without moving\n                     * forward again */\n                    next = false;\n                    break;\n                }\n\n                /* Functions and variables are now highlighted in strings\n                 * Detecting functions */\n                if (sc.ch == '$')\n                {\n                    /* Allowing escaped functions to pass */\n                    if (sc.chPrev == '\\\\')\n                        break;\n\n                    sc.SetState(SCE_KVIRC_STRING_FUNCTION);\n                    break;\n                }\n\n                /* Detecting variables */\n                if (sc.ch == '%')\n                {\n                    /* Allowing escaped variables to pass */\n                    if (sc.chPrev == '\\\\')\n                        break;\n\n                    sc.SetState(SCE_KVIRC_STRING_VARIABLE);\n                    break;\n                }\n\n                /* Breaking out of a string when a newline is introduced */\n                if (sc.ch == '\\r' || sc.ch == '\\n')\n                {\n                    /* Allowing escaped newlines */\n                    if (sc.chPrev == '\\\\')\n                        break;\n\n                    sc.SetState(SCE_KVIRC_DEFAULT);\n                    break;\n                }\n\n                break;\n\n            case SCE_KVIRC_FUNCTION:\n            case SCE_KVIRC_VARIABLE:\n\n                /* Detecting the end of a function/variable (word) */\n                if (!IsAWordChar(sc.ch))\n                {\n                    sc.SetState(SCE_KVIRC_DEFAULT);\n\n                    /* Word has been exited yet the current character\n                     * has yet to be defined - loop without moving\n                     * forward again */\n                    next = false;\n                    break;\n                }\n\n                break;\n\n            case SCE_KVIRC_STRING_FUNCTION:\n            case SCE_KVIRC_STRING_VARIABLE:\n\n                /* A function or variable in a string\n                 * Detecting the end of a function/variable (word) */\n                if (!IsAWordChar(sc.ch))\n                {\n                    sc.SetState(SCE_KVIRC_STRING);\n\n                    /* Word has been exited yet the current character\n                     * has yet to be defined - loop without moving\n                     * forward again */\n                    next = false;\n                    break;\n                }\n\n                break;\n\n            case SCE_KVIRC_NUMBER:\n\n                /* Detecting the end of a number */\n                if (!IsADigit(sc.ch))\n                {\n                    sc.SetState(SCE_KVIRC_DEFAULT);\n\n                    /* Number has been exited yet the current character\n                     * has yet to be defined - loop without moving\n                     * forward */\n                    next = false;\n                    break;\n                }\n\n                break;\n\n            case SCE_KVIRC_OPERATOR:\n\n                /* Because '%' is an operator but is also the marker for\n                 * a variable, I need to always treat operators as single\n                 * character strings and therefore redo their detection\n                 * after every character */\n                sc.SetState(SCE_KVIRC_DEFAULT);\n\n                /* Operator has been exited yet the current character\n                 * has yet to be defined - loop without moving\n                 * forward */\n                next = false;\n                break;\n\n            case SCE_KVIRC_WORD:\n\n                /* Detecting the end of a word */\n                if (!IsAWordChar(sc.ch))\n                {\n                    /* Checking if the word was actually a keyword -\n                     * fetching the current word, NULL-terminated like\n                     * the keyword list */\n                    char s[100];\n                    int wordLen = sc.currentPos - styler.GetStartSegment();\n                    if (wordLen > 99)\n                        wordLen = 99;  /* Include '\\0' in buffer */\n                    int i;\n                    for( i = 0; i < wordLen; ++i )\n                    {\n                        s[i] = styler.SafeGetCharAt( styler.GetStartSegment() + i );\n                    }\n                    s[wordLen] = '\\0';\n\n                    /* Actually detecting keywords and fixing the state */\n                    if (keywords.InList(s))\n                    {\n                        /* The SetState call actually commits the\n                         * previous keyword state */\n                        sc.ChangeState(SCE_KVIRC_KEYWORD);\n                    }\n                    else if (functionKeywords.InList(s))\n                    {\n                        // Detecting function keywords and fixing the state\n                        sc.ChangeState(SCE_KVIRC_FUNCTION_KEYWORD);\n                    }\n\n                    /* Transitioning to default and committing the previous\n                     * word state */\n                    sc.SetState(SCE_KVIRC_DEFAULT);\n\n                    /* Word has been exited yet the current character\n                     * has yet to be defined - loop without moving\n                     * forward again */\n                    next = false;\n                    break;\n                }\n\n                break;\n        }\n    }\n\n    /* Indicating processing is complete */\n    sc.Complete();\n}\n\nstatic void FoldKVIrcDoc(unsigned int startPos, int length, int /*initStyle - unused*/,\n                      WordList *[], Accessor &styler)\n{\n    /* Based on CMake's folder */\n    \n    /* Exiting if folding isnt enabled */\n    if ( styler.GetPropertyInt(\"fold\") == 0 )\n        return;\n\n    /* Obtaining current line number*/\n    int currentLine = styler.GetLine(startPos);\n\n    /* Obtaining starting character - indentation is done on a line basis,\n     * not character */\n    unsigned int safeStartPos = styler.LineStart( currentLine );\n\n    /* Initialising current level - this is defined as indentation level\n     * in the low 12 bits, with flag bits in the upper four bits.\n     * It looks like two indentation states are maintained in the returned\n     * 32bit value - 'nextLevel' in the most-significant bits, 'currentLevel'\n     * in the least-significant bits. Since the next level is the most\n     * up to date, this must refer to the current state of indentation.\n     * So the code bitshifts the old current level out of existence to\n     * get at the actual current state of indentation\n     * Based on the LexerCPP.cxx line 958 comment */\n    int currentLevel = SC_FOLDLEVELBASE;\n    if (currentLine > 0)\n        currentLevel = styler.LevelAt(currentLine - 1) >> 16;\n    int nextLevel = currentLevel;\n\n    // Looping for characters in range\n    for (unsigned int i = safeStartPos; i < startPos + length; ++i)\n    {\n        /* Folding occurs after syntax highlighting, meaning Scintilla\n         * already knows where the comments are\n         * Fetching the current state */\n        int state = styler.StyleAt(i) & 31;\n\n        switch( styler.SafeGetCharAt(i) )\n        {\n            case '{':\n\n                /* Indenting only when the braces are not contained in\n                 * a comment */\n                if (state != SCE_KVIRC_COMMENT &&\n                    state != SCE_KVIRC_COMMENTBLOCK)\n                    ++nextLevel;\n                break;\n\n            case '}':\n\n                /* Outdenting only when the braces are not contained in\n                 * a comment */\n                if (state != SCE_KVIRC_COMMENT &&\n                    state != SCE_KVIRC_COMMENTBLOCK)\n                    --nextLevel;\n                break;\n\n            case '\\n':\n            case '\\r':\n\n                /* Preparing indentation information to return - combining\n                 * current and next level data */\n                int lev = currentLevel | nextLevel << 16;\n\n                /* If the next level increases the indent level, mark the\n                 * current line as a fold point - current level data is\n                 * in the least significant bits */\n                if (nextLevel > currentLevel )\n                    lev |= SC_FOLDLEVELHEADERFLAG;\n\n                /* Updating indentation level if needed */\n                if (lev != styler.LevelAt(currentLine))\n                    styler.SetLevel(currentLine, lev);\n\n                /* Updating variables */\n                ++currentLine;\n                currentLevel = nextLevel;\n\n                /* Dealing with problematic Windows newlines -\n                 * incrementing to avoid the extra newline breaking the\n                 * fold point */\n                if (styler.SafeGetCharAt(i) == '\\r' &&\n                    styler.SafeGetCharAt(i + 1) == '\\n')\n                    ++i;\n                break;\n        }\n    }\n\n    /* At this point the data has ended, so presumably the end of the line?\n     * Preparing indentation information to return - combining current\n     * and next level data */\n    int lev = currentLevel | nextLevel << 16;\n\n    /* If the next level increases the indent level, mark the current\n     * line as a fold point - current level data is in the least\n     * significant bits */\n    if (nextLevel > currentLevel )\n        lev |= SC_FOLDLEVELHEADERFLAG;\n\n    /* Updating indentation level if needed */\n    if (lev != styler.LevelAt(currentLine))\n        styler.SetLevel(currentLine, lev);\n}\n\n/* Registering wordlists */\nstatic const char *const kvircWordListDesc[] = {\n\t\"primary\",\n\t\"function_keywords\",\n\t0\n};\n\n\n/* Registering functions and wordlists */\nLexerModule lmKVIrc(SCLEX_KVIRC, ColouriseKVIrcDoc, \"kvirc\", FoldKVIrcDoc,\n                    kvircWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexKix.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexKix.cxx\n ** Lexer for KIX-Scripts.\n **/\n// Copyright 2004 by Manfred Becker <manfred@becker-trdf.de>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n// Extended to accept accented characters\nstatic inline bool IsAWordChar(int ch) {\n\treturn ch >= 0x80 || isalnum(ch) || ch == '_';\n}\n\nstatic inline bool IsOperator(const int ch) {\n\treturn (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '&' || ch == '|' || ch == '<' || ch == '>' || ch == '=');\n}\n\nstatic void ColouriseKixDoc(unsigned int startPos, int length, int initStyle,\n                           WordList *keywordlists[], Accessor &styler) {\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n//\tWordList &keywords4 = *keywordlists[3];\n\n\tstyler.StartAt(startPos);\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\tif (sc.state == SCE_KIX_COMMENT) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_KIX_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_KIX_STRING1) {\n\t\t\t// This is a doubles quotes string\n\t\t\tif (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_KIX_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_KIX_STRING2) {\n\t\t\t// This is a single quote string\n\t\t\tif (sc.ch == '\\'') {\n\t\t\t\tsc.ForwardSetState(SCE_KIX_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_KIX_NUMBER) {\n\t\t\tif (!IsADigit(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_KIX_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_KIX_VAR) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_KIX_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_KIX_MACRO) {\n\t\t\tif (!IsAWordChar(sc.ch) && !IsADigit(sc.ch)) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\n\t\t\t\tif (!keywords3.InList(&s[1])) {\n\t\t\t\t\tsc.ChangeState(SCE_KIX_DEFAULT);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_KIX_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_KIX_OPERATOR) {\n\t\t\tif (!IsOperator(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_KIX_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_KIX_IDENTIFIER) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\n\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_KIX_KEYWORD);\n\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_KIX_FUNCTIONS);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_KIX_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_KIX_DEFAULT) {\n\t\t\tif (sc.ch == ';') {\n\t\t\t\tsc.SetState(SCE_KIX_COMMENT);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_KIX_STRING1);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_KIX_STRING2);\n\t\t\t} else if (sc.ch == '$') {\n\t\t\t\tsc.SetState(SCE_KIX_VAR);\n\t\t\t} else if (sc.ch == '@') {\n\t\t\t\tsc.SetState(SCE_KIX_MACRO);\n\t\t\t} else if (IsADigit(sc.ch) || ((sc.ch == '.' || sc.ch == '&') && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_KIX_NUMBER);\n\t\t\t} else if (IsOperator(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_KIX_OPERATOR);\n\t\t\t} else if (IsAWordChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_KIX_IDENTIFIER);\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n}\n\n\nLexerModule lmKix(SCLEX_KIX, ColouriseKixDoc, \"kix\");\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexLaTeX.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexLaTeX.cxx\n ** Lexer for LaTeX2e.\n  **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n// Modified by G. HU in 2013. Added folding, syntax highting inside math environments, and changed some minor behaviors.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n#include <vector>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"PropSetSimple.h\"\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n#include \"LexerBase.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nusing namespace std;\n\nstruct latexFoldSave {\n\tlatexFoldSave() : structLev(0) {\n\t\tfor (int i = 0; i < 8; ++i) openBegins[i] = 0;\n\t}\n\tlatexFoldSave(const latexFoldSave &save) : structLev(save.structLev) {\n\t\tfor (int i = 0; i < 8; ++i) openBegins[i] = save.openBegins[i];\n\t}\n\tint openBegins[8];\n\tint structLev;\n};\n\nclass LexerLaTeX : public LexerBase {\nprivate:\n\tvector<int> modes;\n\tvoid setMode(int line, int mode) {\n\t\tif (line >= static_cast<int>(modes.size())) modes.resize(line + 1, 0);\n\t\tmodes[line] = mode;\n\t}\n\tint getMode(int line) {\n\t\tif (line >= 0 && line < static_cast<int>(modes.size())) return modes[line];\n\t\treturn 0;\n\t}\n\tvoid truncModes(int numLines) {\n\t\tif (static_cast<int>(modes.size()) > numLines * 2 + 256)\n\t\t\tmodes.resize(numLines + 128);\n\t}\n\t\n\tvector<latexFoldSave> saves;\n\tvoid setSave(int line, const latexFoldSave &save) {\n\t\tif (line >= static_cast<int>(saves.size())) saves.resize(line + 1);\n\t\tsaves[line] = save;\n\t}\n\tvoid getSave(int line, latexFoldSave &save) {\n\t\tif (line >= 0 && line < static_cast<int>(saves.size())) save = saves[line];\n\t\telse {\n\t\t\tsave.structLev = 0;\n\t\t\tfor (int i = 0; i < 8; ++i) save.openBegins[i] = 0;\n\t\t}\n\t}\n\tvoid truncSaves(int numLines) {\n\t\tif (static_cast<int>(saves.size()) > numLines * 2 + 256)\n\t\t\tsaves.resize(numLines + 128);\n\t}\npublic:\n\tstatic ILexer *LexerFactoryLaTeX() {\n\t\treturn new LexerLaTeX();\n\t}\n\tvoid SCI_METHOD Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n\tvoid SCI_METHOD Fold(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n};\n\nstatic bool latexIsSpecial(int ch) {\n\treturn (ch == '#') || (ch == '$') || (ch == '%') || (ch == '&') || (ch == '_') ||\n\t\t   (ch == '{') || (ch == '}') || (ch == ' ');\n}\n\nstatic bool latexIsBlank(int ch) {\n\treturn (ch == ' ') || (ch == '\\t');\n}\n\nstatic bool latexIsBlankAndNL(int ch) {\n\treturn (ch == ' ') || (ch == '\\t') || (ch == '\\r') || (ch == '\\n');\n}\n\nstatic bool latexIsLetter(int ch) {\n\treturn IsASCII(ch) && isalpha(ch);\n}\n\nstatic bool latexIsTagValid(int &i, int l, Accessor &styler) {\n\twhile (i < l) {\n\t\tif (styler.SafeGetCharAt(i) == '{') {\n\t\t\twhile (i < l) {\n\t\t\t\ti++;\n\t\t\t\tif (styler.SafeGetCharAt(i) == '}') {\n\t\t\t\t\treturn true;\n\t\t\t\t}\telse if (!latexIsLetter(styler.SafeGetCharAt(i)) &&\n                   styler.SafeGetCharAt(i)!='*') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (!latexIsBlank(styler.SafeGetCharAt(i))) {\n\t\t\treturn false;\n\t\t}\n\t\ti++;\n\t}\n\treturn false;\n}\n\nstatic bool latexNextNotBlankIs(int i, Accessor &styler, char needle) {\n  char ch;\n\twhile (i < styler.Length()) {\n    ch = styler.SafeGetCharAt(i);\n\t\tif (!latexIsBlankAndNL(ch) && ch != '*') {\n      if (ch == needle)\n        return true;\n      else\n        return false;\n\t\t}\n\t\ti++;\n\t}\n\treturn false;\n}\n\nstatic bool latexLastWordIs(int start, Accessor &styler, const char *needle) {\n\tunsigned int i = 0;\n\tunsigned int l = static_cast<unsigned int>(strlen(needle));\n\tint ini = start-l+1;\n\tchar s[32];\n\n\twhile (i < l && i < 31) {\n\t\ts[i] = styler.SafeGetCharAt(ini + i);\n\t\ti++;\n\t}\n\ts[i] = '\\0';\n\n\treturn (strcmp(s, needle) == 0);\n}\n\nstatic bool latexLastWordIsMathEnv(int pos, Accessor &styler) {\n\tint i, j;\n\tchar s[32];\n\tconst char *mathEnvs[] = { \"align\", \"alignat\", \"flalign\", \"gather\",\n\t\t\"multiline\", \"displaymath\", \"eqnarray\", \"equation\" };\n\tif (styler.SafeGetCharAt(pos) != '}') return false;\n\tfor (i = pos - 1; i >= 0; --i) {\n\t\tif (styler.SafeGetCharAt(i) == '{') break;\n\t\tif (pos - i >= 20) return false;\n\t}\n\tif (i < 0 || i == pos - 1) return false;\n\t++i;\n\tfor (j = 0; i + j < pos; ++j)\n\t\ts[j] = styler.SafeGetCharAt(i + j);\n\ts[j] = '\\0';\n\tif (j == 0) return false;\n\tif (s[j - 1] == '*') s[--j] = '\\0';\n\tfor (i = 0; i < static_cast<int>(sizeof(mathEnvs) / sizeof(const char *)); ++i)\n\t\tif (strcmp(s, mathEnvs[i]) == 0) return true;\n\treturn false;\n}\n\nstatic inline void latexStateReset(int &mode, int &state) {\n\tswitch (mode) {\n\tcase 1:     state = SCE_L_MATH; break;\n\tcase 2:     state = SCE_L_MATH2; break;\n\tdefault:    state = SCE_L_DEFAULT; break;\n\t}\n}\n\n// There are cases not handled correctly, like $abcd\\textrm{what is $x+y$}z+w$.\n// But I think it's already good enough.\nvoid SCI_METHOD LexerLaTeX::Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n\t// startPos is assumed to be the first character of a line\n\tAccessor styler(pAccess, &props);\n\tstyler.StartAt(startPos);\n\tint mode = getMode(styler.GetLine(startPos) - 1);\n\tint state = initStyle;\n\tif (state == SCE_L_ERROR || state == SCE_L_SHORTCMD || state == SCE_L_SPECIAL)   // should not happen\n\t\tlatexStateReset(mode, state);\n\t\n\tchar chNext = styler.SafeGetCharAt(startPos);\n\tchar chVerbatimDelim = '\\0';\n\tstyler.StartSegment(startPos);\n\tint lengthDoc = startPos + length;\n\n\tfor (int i = startPos; i < lengthDoc; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\n\t\tif (styler.IsLeadByte(ch)) {\n\t\t\ti++;\n\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tif (ch == '\\r' || ch == '\\n')\n\t\t\tsetMode(styler.GetLine(i), mode);\n\n\t\tswitch (state) {\n\t\tcase SCE_L_DEFAULT :\n\t\t\tswitch (ch) {\n\t\t\tcase '\\\\' :\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tif (latexIsLetter(chNext)) {\n\t\t\t\t\tstate = SCE_L_COMMAND;\n\t\t\t\t} else if (latexIsSpecial(chNext)) {\n\t\t\t\t\tstyler.ColourTo(i + 1, SCE_L_SPECIAL);\n\t\t\t\t\ti++;\n\t\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\t} else if (chNext == '\\r' || chNext == '\\n') {\n\t\t\t\t\tstyler.ColourTo(i, SCE_L_ERROR);\n\t\t\t\t} else if (IsASCII(chNext)) {\n\t\t\t\t\tstyler.ColourTo(i + 1, SCE_L_SHORTCMD);\n\t\t\t\t\tif (chNext == '(') {\n\t\t\t\t\t\tmode = 1;\n\t\t\t\t\t\tstate = SCE_L_MATH;\n\t\t\t\t\t} else if (chNext == '[') {\n\t\t\t\t\t\tmode = 2;\n\t\t\t\t\t\tstate = SCE_L_MATH2;\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '$' :\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tif (chNext == '$') {\n\t\t\t\t\tstyler.ColourTo(i + 1, SCE_L_SHORTCMD);\n\t\t\t\t\tmode = 2;\n\t\t\t\t\tstate = SCE_L_MATH2;\n\t\t\t\t\ti++;\n\t\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\t} else {\n\t\t\t\t\tstyler.ColourTo(i, SCE_L_SHORTCMD);\n\t\t\t\t\tmode = 1;\n\t\t\t\t\tstate = SCE_L_MATH;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '%' :\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_L_COMMENT;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\t\n\t\t// These 3 will never be reached.\n\t\tcase SCE_L_ERROR:\n\t\tcase SCE_L_SPECIAL:\n\t\tcase SCE_L_SHORTCMD:\n\t\t\tbreak;\n\t\tcase SCE_L_COMMAND :\n\t\t\tif (!latexIsLetter(chNext)) {\n\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\tif (latexNextNotBlankIs(i + 1, styler, '[' )) {\n\t\t\t\t\tstate = SCE_L_CMDOPT;\n\t\t\t\t} else if (latexLastWordIs(i, styler, \"\\\\begin\")) {\n\t\t\t\t\tstate = SCE_L_TAG;\n\t\t\t\t} else if (latexLastWordIs(i, styler, \"\\\\end\")) {\n\t\t\t\t\tstate = SCE_L_TAG2;\n\t\t\t\t} else if (latexLastWordIs(i, styler, \"\\\\verb\") && chNext != '*' && chNext != ' ') {\n\t\t\t\t\tchVerbatimDelim = chNext;\n\t\t\t\t\tstate = SCE_L_VERBATIM;\n\t\t\t\t} else {\n\t\t\t\t\tlatexStateReset(mode, state);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_L_CMDOPT :\n\t\t\tif (ch == ']') {\n\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\tlatexStateReset(mode, state);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_L_TAG :\n\t\t\tif (latexIsTagValid(i, lengthDoc, styler)) {\n\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\tlatexStateReset(mode, state);\n\t\t\t\tif (latexLastWordIs(i, styler, \"{verbatim}\")) {\n\t\t\t\t\tstate = SCE_L_VERBATIM;\n\t\t\t\t} else if (latexLastWordIs(i, styler, \"{comment}\")) {\n\t\t\t\t\tstate = SCE_L_COMMENT2;\n\t\t\t\t} else if (latexLastWordIs(i, styler, \"{math}\") && mode == 0) {\n\t\t\t\t\tmode = 1;\n\t\t\t\t\tstate = SCE_L_MATH;\n\t\t\t\t} else if (latexLastWordIsMathEnv(i, styler) && mode == 0) {\n\t\t\t\t\tmode = 2;\n\t\t\t\t\tstate = SCE_L_MATH2;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tstyler.ColourTo(i, SCE_L_ERROR);\n\t\t\t\tlatexStateReset(mode, state);\n\t\t\t\tch = styler.SafeGetCharAt(i);\n\t\t\t\tif (ch == '\\r' || ch == '\\n') setMode(styler.GetLine(i), mode);\n\t\t\t}\n\t\t\tchNext = styler.SafeGetCharAt(i+1);\n\t\t\tbreak;\n\t\tcase SCE_L_TAG2 :\n\t\t\tif (latexIsTagValid(i, lengthDoc, styler)) {\n\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\tlatexStateReset(mode, state);\n\t\t\t} else {\n\t\t\t\tstyler.ColourTo(i, SCE_L_ERROR);\n\t\t\t\tlatexStateReset(mode, state);\n\t\t\t\tch = styler.SafeGetCharAt(i);\n\t\t\t\tif (ch == '\\r' || ch == '\\n') setMode(styler.GetLine(i), mode);\n\t\t\t}\n\t\t\tchNext = styler.SafeGetCharAt(i+1);\n\t\t\tbreak;\n\t\tcase SCE_L_MATH :\n\t\t\tswitch (ch) {\n\t\t\tcase '\\\\' :\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tif (latexIsLetter(chNext)) {\n\t\t\t\t\tint match = i + 3;\n\t\t\t\t\tif (latexLastWordIs(match, styler, \"\\\\end\")) {\n\t\t\t\t\t\tmatch++;\n\t\t\t\t\t\tif (latexIsTagValid(match, lengthDoc, styler)) {\n\t\t\t\t\t\t\tif (latexLastWordIs(match, styler, \"{math}\"))\n\t\t\t\t\t\t\t\tmode = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstate = SCE_L_COMMAND;\n\t\t\t\t} else if (latexIsSpecial(chNext)) {\n\t\t\t\t\tstyler.ColourTo(i + 1, SCE_L_SPECIAL);\n\t\t\t\t\ti++;\n\t\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\t} else if (chNext == '\\r' || chNext == '\\n') {\n\t\t\t\t\tstyler.ColourTo(i, SCE_L_ERROR);\n\t\t\t\t} else if (IsASCII(chNext)) {\n\t\t\t\t\tif (chNext == ')') {\n\t\t\t\t\t\tmode = 0;\n\t\t\t\t\t\tstate = SCE_L_DEFAULT;\n\t\t\t\t\t}\n\t\t\t\t\tstyler.ColourTo(i + 1, SCE_L_SHORTCMD);\n\t\t\t\t\ti++;\n\t\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '$' :\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstyler.ColourTo(i, SCE_L_SHORTCMD);\n\t\t\t\tmode = 0;\n\t\t\t\tstate = SCE_L_DEFAULT;\n\t\t\t\tbreak;\n\t\t\tcase '%' :\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_L_COMMENT;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_L_MATH2 :\n\t\t\tswitch (ch) {\n\t\t\tcase '\\\\' :\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tif (latexIsLetter(chNext)) {\n\t\t\t\t\tint match = i + 3;\n\t\t\t\t\tif (latexLastWordIs(match, styler, \"\\\\end\")) {\n\t\t\t\t\t\tmatch++;\n\t\t\t\t\t\tif (latexIsTagValid(match, lengthDoc, styler)) {\n\t\t\t\t\t\t\tif (latexLastWordIsMathEnv(match, styler))\n\t\t\t\t\t\t\t\tmode = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstate = SCE_L_COMMAND;\n\t\t\t\t} else if (latexIsSpecial(chNext)) {\n\t\t\t\t\tstyler.ColourTo(i + 1, SCE_L_SPECIAL);\n\t\t\t\t\ti++;\n\t\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\t} else if (chNext == '\\r' || chNext == '\\n') {\n\t\t\t\t\tstyler.ColourTo(i, SCE_L_ERROR);\n\t\t\t\t} else if (IsASCII(chNext)) {\n\t\t\t\t\tif (chNext == ']') {\n\t\t\t\t\t\tmode = 0;\n\t\t\t\t\t\tstate = SCE_L_DEFAULT;\n\t\t\t\t\t}\n\t\t\t\t\tstyler.ColourTo(i + 1, SCE_L_SHORTCMD);\n\t\t\t\t\ti++;\n\t\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '$' :\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tif (chNext == '$') {\n\t\t\t\t\tstyler.ColourTo(i + 1, SCE_L_SHORTCMD);\n\t\t\t\t\ti++;\n\t\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\t\tmode = 0;\n\t\t\t\t\tstate = SCE_L_DEFAULT;\n\t\t\t\t} else { // This may not be an error, e.g. \\begin{equation}\\text{$a$}\\end{equation}\t\n\t\t\t\t\tstyler.ColourTo(i, SCE_L_SHORTCMD);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '%' :\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_L_COMMENT;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_L_COMMENT :\n\t\t\tif (ch == '\\r' || ch == '\\n') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tlatexStateReset(mode, state);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_L_COMMENT2 :\n\t\t\tif (ch == '\\\\') {\n\t\t\t\tint match = i + 3;\n\t\t\t\tif (latexLastWordIs(match, styler, \"\\\\end\")) {\n\t\t\t\t\tmatch++;\n\t\t\t\t\tif (latexIsTagValid(match, lengthDoc, styler)) {\n\t\t\t\t\t\tif (latexLastWordIs(match, styler, \"{comment}\")) {\n\t\t\t\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\t\t\t\tstate = SCE_L_COMMAND;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_L_VERBATIM :\n\t\t\tif (ch == '\\\\') {\n\t\t\t\tint match = i + 3;\n\t\t\t\tif (latexLastWordIs(match, styler, \"\\\\end\")) {\n\t\t\t\t\tmatch++;\n\t\t\t\t\tif (latexIsTagValid(match, lengthDoc, styler)) {\n\t\t\t\t\t\tif (latexLastWordIs(match, styler, \"{verbatim}\")) {\n\t\t\t\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\t\t\t\tstate = SCE_L_COMMAND;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (chNext == chVerbatimDelim) {\n\t\t\t\tstyler.ColourTo(i + 1, state);\n\t\t\t\tlatexStateReset(mode, state);\n\t\t\t\tchVerbatimDelim = '\\0';\n\t\t\t\ti++;\n\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t} else if (chVerbatimDelim != '\\0' && (ch == '\\n' || ch == '\\r')) {\n\t\t\t\tstyler.ColourTo(i, SCE_L_ERROR);\n\t\t\t\tlatexStateReset(mode, state);\n\t\t\t\tchVerbatimDelim = '\\0';\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (lengthDoc == styler.Length()) truncModes(styler.GetLine(lengthDoc - 1));\n\tstyler.ColourTo(lengthDoc - 1, state);\n\tstyler.Flush();\n}\n\nstatic int latexFoldSaveToInt(const latexFoldSave &save) {\n\tint sum = 0;\n\tfor (int i = 0; i <= save.structLev; ++i)\n\t\tsum += save.openBegins[i];\n\treturn ((sum + save.structLev + SC_FOLDLEVELBASE) & SC_FOLDLEVELNUMBERMASK);\n}\n\n// Change folding state while processing a line\n// Return the level before the first relevant command\nvoid SCI_METHOD LexerLaTeX::Fold(unsigned int startPos, int length, int, IDocument *pAccess) {\n\tconst char *structWords[7] = {\"part\", \"chapter\", \"section\", \"subsection\",\n\t\t\"subsubsection\", \"paragraph\", \"subparagraph\"};\n\tAccessor styler(pAccess, &props);\n\tunsigned int endPos = startPos + length;\n\tint curLine = styler.GetLine(startPos);\n\tlatexFoldSave save;\n\tgetSave(curLine - 1, save);\n\tdo {\n\t\tchar ch, buf[16];\n\t\tint i, j, lev = -1;\n\t\tbool needFold = false;\n\t\tfor (i = static_cast<int>(startPos); i < static_cast<int>(endPos); ++i) {\n\t\t\tch = styler.SafeGetCharAt(i);\n\t\t\tif (ch == '\\r' || ch == '\\n') break;\n\t\t\tif (ch != '\\\\' || styler.StyleAt(i) != SCE_L_COMMAND) continue;\n\t\t\tfor (j = 0; j < 15 && i + 1 < static_cast<int>(endPos); ++j, ++i) {\n\t\t\t\tbuf[j] = styler.SafeGetCharAt(i + 1);\n\t\t\t\tif (!latexIsLetter(buf[j])) break;\n\t\t\t}\n\t\t\tbuf[j] = '\\0';\n\t\t\tif (strcmp(buf, \"begin\") == 0) {\n\t\t\t\tif (lev < 0) lev = latexFoldSaveToInt(save);\n\t\t\t\t++save.openBegins[save.structLev];\n\t\t\t\tneedFold = true;\n\t\t\t}\n\t\t\telse if (strcmp(buf, \"end\") == 0) {\n\t\t\t\twhile (save.structLev > 0 && save.openBegins[save.structLev] == 0)\n\t\t\t\t\t--save.structLev;\n\t\t\t\tif (lev < 0) lev = latexFoldSaveToInt(save);\n\t\t\t\tif (save.openBegins[save.structLev] > 0) --save.openBegins[save.structLev];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor (j = 0; j < 7; ++j)\n\t\t\t\t\tif (strcmp(buf, structWords[j]) == 0) break;\n\t\t\t\tif (j >= 7) continue;\n\t\t\t\tsave.structLev = j;   // level before the command\n\t\t\t\tfor (j = save.structLev + 1; j < 8; ++j) {\n\t\t\t\t\tsave.openBegins[save.structLev] += save.openBegins[j];\n\t\t\t\t\tsave.openBegins[j] = 0;\n\t\t\t\t}\n\t\t\t\tif (lev < 0) lev = latexFoldSaveToInt(save);\n\t\t\t\t++save.structLev;   // level after the command\n\t\t\t\tneedFold = true;\n\t\t\t}\n\t\t}\n\t\tif (lev < 0) lev = latexFoldSaveToInt(save);\n\t\tif (needFold) lev |= SC_FOLDLEVELHEADERFLAG;\n\t\tstyler.SetLevel(curLine, lev);\n\t\tsetSave(curLine, save);\n\t\t++curLine;\n\t\tstartPos = styler.LineStart(curLine);\n\t\tif (static_cast<int>(startPos) == styler.Length()) {\n\t\t\tlev = latexFoldSaveToInt(save);\n\t\t\tstyler.SetLevel(curLine, lev);\n\t\t\tsetSave(curLine, save);\n\t\t\ttruncSaves(curLine);\n\t\t}\n\t} while (startPos < endPos);\n\tstyler.Flush();\n}\n\nstatic const char *const emptyWordListDesc[] = {\n\t0\n};\n\nLexerModule lmLatex(SCLEX_LATEX, LexerLaTeX::LexerFactoryLaTeX, \"latex\", emptyWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexLisp.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexLisp.cxx\n ** Lexer for Lisp.\n ** Written by Alexey Yutkin.\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n#define SCE_LISP_CHARACTER 29\n#define SCE_LISP_MACRO 30\n#define SCE_LISP_MACRO_DISPATCH 31\n\nstatic inline bool isLispoperator(char ch) {\n\tif (IsASCII(ch) && isalnum(ch))\n\t\treturn false;\n\tif (ch == '\\'' || ch == '`' || ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == '{' || ch == '}')\n\t\treturn true;\n\treturn false;\n}\n\nstatic inline bool isLispwordstart(char ch) {\n\treturn IsASCII(ch) && ch != ';'  && !isspacechar(ch) && !isLispoperator(ch) &&\n\t\tch != '\\n' && ch != '\\r' &&  ch != '\\\"';\n}\n\n\nstatic void classifyWordLisp(unsigned int start, unsigned int end, WordList &keywords, WordList &keywords_kw, Accessor &styler) {\n\tassert(end >= start);\n\tchar s[100];\n\tunsigned int i;\n\tbool digit_flag = true;\n\tfor (i = 0; (i < end - start + 1) && (i < 99); i++) {\n\t\ts[i] = styler[start + i];\n\t\ts[i + 1] = '\\0';\n\t\tif (!isdigit(s[i]) && (s[i] != '.')) digit_flag = false;\n\t}\n\tchar chAttr = SCE_LISP_IDENTIFIER;\n\n\tif(digit_flag) chAttr = SCE_LISP_NUMBER;\n\telse {\n\t\tif (keywords.InList(s)) {\n\t\t\tchAttr = SCE_LISP_KEYWORD;\n\t\t} else if (keywords_kw.InList(s)) {\n\t\t\tchAttr = SCE_LISP_KEYWORD_KW;\n\t\t} else if ((s[0] == '*' && s[i-1] == '*') ||\n\t\t\t   (s[0] == '+' && s[i-1] == '+')) {\n\t\t\tchAttr = SCE_LISP_SPECIAL;\n\t\t}\n\t}\n\tstyler.ColourTo(end, chAttr);\n\treturn;\n}\n\n\nstatic void ColouriseLispDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                            Accessor &styler) {\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords_kw = *keywordlists[1];\n\n\tstyler.StartAt(startPos);\n\n\tint state = initStyle, radix = -1;\n\tchar chNext = styler[startPos];\n\tunsigned int lengthDoc = startPos + length;\n\tstyler.StartSegment(startPos);\n\tfor (unsigned int i = startPos; i < lengthDoc; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\n\t\tif (styler.IsLeadByte(ch)) {\n\t\t\tchNext = styler.SafeGetCharAt(i + 2);\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state == SCE_LISP_DEFAULT) {\n\t\t\tif (ch == '#') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tradix = -1;\n\t\t\t\tstate = SCE_LISP_MACRO_DISPATCH;\n\t\t\t} else if (ch == ':' && isLispwordstart(chNext)) {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_LISP_SYMBOL;\n\t\t\t} else if (isLispwordstart(ch)) {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_LISP_IDENTIFIER;\n\t\t\t}\n\t\t\telse if (ch == ';') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_LISP_COMMENT;\n\t\t\t}\n\t\t\telse if (isLispoperator(ch) || ch=='\\'') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstyler.ColourTo(i, SCE_LISP_OPERATOR);\n\t\t\t\tif (ch=='\\'' && isLispwordstart(chNext)) {\n\t\t\t\t\tstate = SCE_LISP_SYMBOL;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ch == '\\\"') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_LISP_STRING;\n\t\t\t}\n\t\t} else if (state == SCE_LISP_IDENTIFIER || state == SCE_LISP_SYMBOL) {\n\t\t\tif (!isLispwordstart(ch)) {\n\t\t\t\tif (state == SCE_LISP_IDENTIFIER) {\n\t\t\t\t\tclassifyWordLisp(styler.GetStartSegment(), i - 1, keywords, keywords_kw, styler);\n\t\t\t\t} else {\n\t\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\t}\n\t\t\t\tstate = SCE_LISP_DEFAULT;\n\t\t\t} /*else*/\n\t\t\tif (isLispoperator(ch) || ch=='\\'') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstyler.ColourTo(i, SCE_LISP_OPERATOR);\n\t\t\t\tif (ch=='\\'' && isLispwordstart(chNext)) {\n\t\t\t\t\tstate = SCE_LISP_SYMBOL;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (state == SCE_LISP_MACRO_DISPATCH) {\n\t\t\tif (!(IsASCII(ch) && isdigit(ch))) {\n\t\t\t\tif (ch != 'r' && ch != 'R' && (i - styler.GetStartSegment()) > 1) {\n\t\t\t\t\tstate = SCE_LISP_DEFAULT;\n\t\t\t\t} else {\n\t\t\t\t\tswitch (ch) {\n\t\t\t\t\t\tcase '|': state = SCE_LISP_MULTI_COMMENT; break;\n\t\t\t\t\t\tcase 'o':\n\t\t\t\t\t\tcase 'O': radix = 8; state = SCE_LISP_MACRO; break;\n\t\t\t\t\t\tcase 'x':\n\t\t\t\t\t\tcase 'X': radix = 16; state = SCE_LISP_MACRO; break;\n\t\t\t\t\t\tcase 'b':\n\t\t\t\t\t\tcase 'B': radix = 2; state = SCE_LISP_MACRO; break;\n\t\t\t\t\t\tcase '\\\\': state = SCE_LISP_CHARACTER; break;\n\t\t\t\t\t\tcase ':':\n\t\t\t\t\t\tcase '-':\n\t\t\t\t\t\tcase '+': state = SCE_LISP_MACRO; break;\n\t\t\t\t\t\tcase '\\'': if (isLispwordstart(chNext)) {\n\t\t\t\t\t\t\t\t   state = SCE_LISP_SPECIAL;\n\t\t\t\t\t\t\t   } else {\n\t\t\t\t\t\t\t\t   styler.ColourTo(i - 1, SCE_LISP_DEFAULT);\n\t\t\t\t\t\t\t\t   styler.ColourTo(i, SCE_LISP_OPERATOR);\n\t\t\t\t\t\t\t\t   state = SCE_LISP_DEFAULT;\n\t\t\t\t\t\t\t   }\n\t\t\t\t\t\t\t   break;\n\t\t\t\t\t\tdefault: if (isLispoperator(ch)) {\n\t\t\t\t\t\t\t\t styler.ColourTo(i - 1, SCE_LISP_DEFAULT);\n\t\t\t\t\t\t\t\t styler.ColourTo(i, SCE_LISP_OPERATOR);\n\t\t\t\t\t\t\t }\n\t\t\t\t\t\t\t state = SCE_LISP_DEFAULT;\n\t\t\t\t\t\t\t break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (state == SCE_LISP_MACRO) {\n\t\t\tif (isLispwordstart(ch) && (radix == -1 || IsADigit(ch, radix))) {\n\t\t\t\tstate = SCE_LISP_SPECIAL;\n\t\t\t} else {\n\t\t\t\tstate = SCE_LISP_DEFAULT;\n\t\t\t}\n\t\t} else if (state == SCE_LISP_CHARACTER) {\n\t\t\tif (isLispoperator(ch)) {\n\t\t\t\tstyler.ColourTo(i, SCE_LISP_SPECIAL);\n\t\t\t\tstate = SCE_LISP_DEFAULT;\n\t\t\t} else if (isLispwordstart(ch)) {\n\t\t\t\tstyler.ColourTo(i, SCE_LISP_SPECIAL);\n\t\t\t\tstate = SCE_LISP_SPECIAL;\n\t\t\t} else {\n\t\t\t\tstate = SCE_LISP_DEFAULT;\n\t\t\t}\n\t\t} else if (state == SCE_LISP_SPECIAL) {\n\t\t\tif (!isLispwordstart(ch) || (radix != -1 && !IsADigit(ch, radix))) {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_LISP_DEFAULT;\n\t\t\t}\n\t\t\tif (isLispoperator(ch) || ch=='\\'') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstyler.ColourTo(i, SCE_LISP_OPERATOR);\n\t\t\t\tif (ch=='\\'' && isLispwordstart(chNext)) {\n\t\t\t\t\tstate = SCE_LISP_SYMBOL;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (state == SCE_LISP_COMMENT) {\n\t\t\t\tif (atEOL) {\n\t\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\t\tstate = SCE_LISP_DEFAULT;\n\t\t\t\t}\n\t\t\t} else if (state == SCE_LISP_MULTI_COMMENT) {\n\t\t\t\tif (ch == '|' && chNext == '#') {\n\t\t\t\t\ti++;\n\t\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\t\tstate = SCE_LISP_DEFAULT;\n\t\t\t\t}\n\t\t\t} else if (state == SCE_LISP_STRING) {\n\t\t\t\tif (ch == '\\\\') {\n\t\t\t\t\tif (chNext == '\\\"' || chNext == '\\'' || chNext == '\\\\') {\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\t\t}\n\t\t\t\t} else if (ch == '\\\"') {\n\t\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\t\tstate = SCE_LISP_DEFAULT;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\tstyler.ColourTo(lengthDoc - 1, state);\n}\n\nstatic void FoldLispDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[],\n                            Accessor &styler) {\n\tunsigned int lengthDoc = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tfor (unsigned int i = startPos; i < lengthDoc; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (style == SCE_LISP_OPERATOR) {\n\t\t\tif (ch == '(' || ch == '[' || ch == '{') {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (ch == ')' || ch == ']' || ch == '}') {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nstatic const char * const lispWordListDesc[] = {\n\t\"Functions and special operators\",\n\t\"Keywords\",\n\t0\n};\n\nLexerModule lmLISP(SCLEX_LISP, ColouriseLispDoc, \"lisp\", FoldLispDoc, lispWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexLout.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexLout.cxx\n ** Lexer for the Basser Lout (>= version 3) typesetting language\n **/\n// Copyright 2003 by Kein-Hong Man <mkh@pl.jaring.my>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (ch < 0x80) && (isalpha(ch) || ch == '@' || ch == '_');\n}\n\nstatic inline bool IsAnOther(const int ch) {\n\treturn (ch < 0x80) && (ch == '{' || ch == '}' ||\n\tch == '!' || ch == '$' || ch == '%' || ch == '&' || ch == '\\'' ||\n\tch == '(' || ch == ')' || ch == '*' || ch == '+' || ch == ',' ||\n\tch == '-' || ch == '.' || ch == '/' || ch == ':' || ch == ';' ||\n\tch == '<' || ch == '=' || ch == '>' || ch == '?' || ch == '[' ||\n\tch == ']' || ch == '^' || ch == '`' || ch == '|' || ch == '~');\n}\n\nstatic void ColouriseLoutDoc(unsigned int startPos, int length, int initStyle,\n\t\t\t     WordList *keywordlists[], Accessor &styler) {\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\n\tint visibleChars = 0;\n\tint firstWordInLine = 0;\n\tint leadingAtSign = 0;\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\tif (sc.atLineStart && (sc.state == SCE_LOUT_STRING)) {\n\t\t\t// Prevent SCE_LOUT_STRINGEOL from leaking back to previous line\n\t\t\tsc.SetState(SCE_LOUT_STRING);\n\t\t}\n\n\t\t// Determine if the current state should terminate.\n\t\tif (sc.state == SCE_LOUT_COMMENT) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_LOUT_DEFAULT);\n\t\t\t\tvisibleChars = 0;\n\t\t\t}\n\t\t} else if (sc.state == SCE_LOUT_NUMBER) {\n\t\t\tif (!IsADigit(sc.ch) && sc.ch != '.') {\n\t\t\t\tsc.SetState(SCE_LOUT_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_LOUT_STRING) {\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\\\') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_LOUT_DEFAULT);\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.ChangeState(SCE_LOUT_STRINGEOL);\n\t\t\t\tsc.ForwardSetState(SCE_LOUT_DEFAULT);\n\t\t\t\tvisibleChars = 0;\n\t\t\t}\n\t\t} else if (sc.state == SCE_LOUT_IDENTIFIER) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\n\t\t\t\tif (leadingAtSign) {\n\t\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_LOUT_WORD);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.ChangeState(SCE_LOUT_WORD4);\n\t\t\t\t\t}\n\t\t\t\t} else if (firstWordInLine && keywords3.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_LOUT_WORD3);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_LOUT_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_LOUT_OPERATOR) {\n\t\t\tif (!IsAnOther(sc.ch)) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\n\t\t\t\tif (keywords2.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_LOUT_WORD2);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_LOUT_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_LOUT_DEFAULT) {\n\t\t\tif (sc.ch == '#') {\n\t\t\t\tsc.SetState(SCE_LOUT_COMMENT);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_LOUT_STRING);\n\t\t\t} else if (IsADigit(sc.ch) ||\n\t\t\t\t  (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_LOUT_NUMBER);\n\t\t\t} else if (IsAWordChar(sc.ch)) {\n\t\t\t\tfirstWordInLine = (visibleChars == 0);\n\t\t\t\tleadingAtSign = (sc.ch == '@');\n\t\t\t\tsc.SetState(SCE_LOUT_IDENTIFIER);\n\t\t\t} else if (IsAnOther(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_LOUT_OPERATOR);\n\t\t\t}\n\t\t}\n\n\t\tif (sc.atLineEnd) {\n\t\t\t// Reset states to begining of colourise so no surprises\n\t\t\t// if different sets of lines lexed.\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!IsASpace(sc.ch)) {\n\t\t\tvisibleChars++;\n\t\t}\n\t}\n\tsc.Complete();\n}\n\nstatic void FoldLoutDoc(unsigned int startPos, int length, int, WordList *[],\n                        Accessor &styler) {\n\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tint styleNext = styler.StyleAt(startPos);\n\tchar s[10] = \"\";\n\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\n\t\tif (style == SCE_LOUT_WORD) {\n\t\t\tif (ch == '@') {\n\t\t\t\tfor (unsigned int j = 0; j < 8; j++) {\n\t\t\t\t\tif (!IsAWordChar(styler[i + j])) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\ts[j] = styler[i + j];\n\t\t\t\t\ts[j + 1] = '\\0';\n\t\t\t\t}\n\t\t\t\tif (strcmp(s, \"@Begin\") == 0) {\n\t\t\t\t\tlevelCurrent++;\n\t\t\t\t} else if (strcmp(s, \"@End\") == 0) {\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (style == SCE_LOUT_OPERATOR) {\n\t\t\tif (ch == '{') {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (ch == '}') {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact) {\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\t}\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0)) {\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t}\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nstatic const char * const loutWordLists[] = {\n            \"Predefined identifiers\",\n            \"Predefined delimiters\",\n            \"Predefined keywords\",\n            0,\n        };\n\nLexerModule lmLout(SCLEX_LOUT, ColouriseLoutDoc, \"lout\", FoldLoutDoc, loutWordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexLua.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexLua.cxx\n ** Lexer for Lua language.\n **\n ** Written by Paul Winwood.\n ** Folder by Alexey Yutkin.\n ** Modified by Marcos E. Wurzius & Philippe Lhoste\n **/\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n// Test for [=[ ... ]=] delimiters, returns 0 if it's only a [ or ],\n// return 1 for [[ or ]], returns >=2 for [=[ or ]=] and so on.\n// The maximum number of '=' characters allowed is 254.\nstatic int LongDelimCheck(StyleContext &sc) {\n\tint sep = 1;\n\twhile (sc.GetRelative(sep) == '=' && sep < 0xFF)\n\t\tsep++;\n\tif (sc.GetRelative(sep) == sc.ch)\n\t\treturn sep;\n\treturn 0;\n}\n\nstatic void ColouriseLuaDoc(\n\tunsigned int startPos,\n\tint length,\n\tint initStyle,\n\tWordList *keywordlists[],\n\tAccessor &styler) {\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\tWordList &keywords4 = *keywordlists[3];\n\tWordList &keywords5 = *keywordlists[4];\n\tWordList &keywords6 = *keywordlists[5];\n\tWordList &keywords7 = *keywordlists[6];\n\tWordList &keywords8 = *keywordlists[7];\n\n\t// Accepts accented characters\n\tCharacterSet setWordStart(CharacterSet::setAlpha, \"_\", 0x80, true);\n\tCharacterSet setWord(CharacterSet::setAlphaNum, \"_\", 0x80, true);\n\t// Not exactly following number definition (several dots are seen as OK, etc.)\n\t// but probably enough in most cases. [pP] is for hex floats.\n\tCharacterSet setNumber(CharacterSet::setDigits, \".-+abcdefpABCDEFP\");\n\tCharacterSet setExponent(CharacterSet::setNone, \"eEpP\");\n\tCharacterSet setLuaOperator(CharacterSet::setNone, \"*/-+()={}~[];<>,.^%:#\");\n\tCharacterSet setEscapeSkip(CharacterSet::setNone, \"\\\"'\\\\\");\n\n\tint currentLine = styler.GetLine(startPos);\n\t// Initialize long string [[ ... ]] or block comment --[[ ... ]] nesting level,\n\t// if we are inside such a string. Block comment was introduced in Lua 5.0,\n\t// blocks with separators [=[ ... ]=] in Lua 5.1.\n\t// Continuation of a string (\\z whitespace escaping) is controlled by stringWs.\n\tint nestLevel = 0;\n\tint sepCount = 0;\n\tint stringWs = 0;\n\tif (initStyle == SCE_LUA_LITERALSTRING || initStyle == SCE_LUA_COMMENT ||\n\t\tinitStyle == SCE_LUA_STRING || initStyle == SCE_LUA_CHARACTER) {\n\t\tint lineState = styler.GetLineState(currentLine - 1);\n\t\tnestLevel = lineState >> 9;\n\t\tsepCount = lineState & 0xFF;\n\t\tstringWs = lineState & 0x100;\n\t}\n\n\t// Do not leak onto next line\n\tif (initStyle == SCE_LUA_STRINGEOL || initStyle == SCE_LUA_COMMENTLINE || initStyle == SCE_LUA_PREPROCESSOR) {\n\t\tinitStyle = SCE_LUA_DEFAULT;\n\t}\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\tif (startPos == 0 && sc.ch == '#') {\n\t\t// shbang line: # is a comment only if first char of the script\n\t\tsc.SetState(SCE_LUA_COMMENTLINE);\n\t}\n\tfor (; sc.More(); sc.Forward()) {\n\t\tif (sc.atLineEnd) {\n\t\t\t// Update the line state, so it can be seen by next line\n\t\t\tcurrentLine = styler.GetLine(sc.currentPos);\n\t\t\tswitch (sc.state) {\n\t\t\tcase SCE_LUA_LITERALSTRING:\n\t\t\tcase SCE_LUA_COMMENT:\n\t\t\tcase SCE_LUA_STRING:\n\t\t\tcase SCE_LUA_CHARACTER:\n\t\t\t\t// Inside a literal string, block comment or string, we set the line state\n\t\t\t\tstyler.SetLineState(currentLine, (nestLevel << 9) | stringWs | sepCount);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Reset the line state\n\t\t\t\tstyler.SetLineState(currentLine, 0);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (sc.atLineStart && (sc.state == SCE_LUA_STRING)) {\n\t\t\t// Prevent SCE_LUA_STRINGEOL from leaking back to previous line\n\t\t\tsc.SetState(SCE_LUA_STRING);\n\t\t}\n\n\t\t// Handle string line continuation\n\t\tif ((sc.state == SCE_LUA_STRING || sc.state == SCE_LUA_CHARACTER) &&\n\t\t\t\tsc.ch == '\\\\') {\n\t\t\tif (sc.chNext == '\\n' || sc.chNext == '\\r') {\n\t\t\t\tsc.Forward();\n\t\t\t\tif (sc.ch == '\\r' && sc.chNext == '\\n') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Determine if the current state should terminate.\n\t\tif (sc.state == SCE_LUA_OPERATOR) {\n\t\t\tif (sc.ch == ':' && sc.chPrev == ':') {\t// :: <label> :: forward scan\n\t\t\t\tsc.Forward();\n\t\t\t\tint ln = 0;\n\t\t\t\twhile (IsASpaceOrTab(sc.GetRelative(ln)))\t// skip over spaces/tabs\n\t\t\t\t\tln++;\n\t\t\t\tint ws1 = ln;\n\t\t\t\tif (setWordStart.Contains(sc.GetRelative(ln))) {\n\t\t\t\t\tint c, i = 0;\n\t\t\t\t\tchar s[100];\n\t\t\t\t\twhile (setWord.Contains(c = sc.GetRelative(ln))) {\t// get potential label\n\t\t\t\t\t\tif (i < 90)\n\t\t\t\t\t\t\ts[i++] = c;\n\t\t\t\t\t\tln++;\n\t\t\t\t\t}\n\t\t\t\t\ts[i] = '\\0'; int lbl = ln;\n\t\t\t\t\tif (!keywords.InList(s)) {\n\t\t\t\t\t\twhile (IsASpaceOrTab(sc.GetRelative(ln)))\t// skip over spaces/tabs\n\t\t\t\t\t\t\tln++;\n\t\t\t\t\t\tint ws2 = ln - lbl;\n\t\t\t\t\t\tif (sc.GetRelative(ln) == ':' && sc.GetRelative(ln + 1) == ':') {\n\t\t\t\t\t\t\t// final :: found, complete valid label construct\n\t\t\t\t\t\t\tsc.ChangeState(SCE_LUA_LABEL);\n\t\t\t\t\t\t\tif (ws1) {\n\t\t\t\t\t\t\t\tsc.SetState(SCE_LUA_DEFAULT);\n\t\t\t\t\t\t\t\tsc.ForwardBytes(ws1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsc.SetState(SCE_LUA_LABEL);\n\t\t\t\t\t\t\tsc.ForwardBytes(lbl - ws1);\n\t\t\t\t\t\t\tif (ws2) {\n\t\t\t\t\t\t\t\tsc.SetState(SCE_LUA_DEFAULT);\n\t\t\t\t\t\t\t\tsc.ForwardBytes(ws2);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsc.SetState(SCE_LUA_LABEL);\n\t\t\t\t\t\t\tsc.ForwardBytes(2);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tsc.SetState(SCE_LUA_DEFAULT);\n\t\t} else if (sc.state == SCE_LUA_NUMBER) {\n\t\t\t// We stop the number definition on non-numerical non-dot non-eEpP non-sign non-hexdigit char\n\t\t\tif (!setNumber.Contains(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_LUA_DEFAULT);\n\t\t\t} else if (sc.ch == '-' || sc.ch == '+') {\n\t\t\t\tif (!setExponent.Contains(sc.chPrev))\n\t\t\t\t\tsc.SetState(SCE_LUA_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_LUA_IDENTIFIER) {\n\t\t\tif (!(setWord.Contains(sc.ch) || sc.ch == '.') || sc.Match('.', '.')) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_LUA_WORD);\n\t\t\t\t\tif (strcmp(s, \"goto\") == 0) {\t// goto <label> forward scan\n\t\t\t\t\t\tsc.SetState(SCE_LUA_DEFAULT);\n\t\t\t\t\t\twhile (IsASpaceOrTab(sc.ch) && !sc.atLineEnd)\n\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\tif (setWordStart.Contains(sc.ch)) {\n\t\t\t\t\t\t\tsc.SetState(SCE_LUA_LABEL);\n\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\t\twhile (setWord.Contains(sc.ch))\n\t\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\t\t\t\tif (keywords.InList(s))\n\t\t\t\t\t\t\t\tsc.ChangeState(SCE_LUA_WORD);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsc.SetState(SCE_LUA_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_LUA_WORD2);\n\t\t\t\t} else if (keywords3.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_LUA_WORD3);\n\t\t\t\t} else if (keywords4.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_LUA_WORD4);\n\t\t\t\t} else if (keywords5.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_LUA_WORD5);\n\t\t\t\t} else if (keywords6.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_LUA_WORD6);\n\t\t\t\t} else if (keywords7.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_LUA_WORD7);\n\t\t\t\t} else if (keywords8.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_LUA_WORD8);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_LUA_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_LUA_COMMENTLINE || sc.state == SCE_LUA_PREPROCESSOR) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.ForwardSetState(SCE_LUA_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_LUA_STRING) {\n\t\t\tif (stringWs) {\n\t\t\t\tif (!IsASpace(sc.ch))\n\t\t\t\t\tstringWs = 0;\n\t\t\t}\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\tif (setEscapeSkip.Contains(sc.chNext)) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} else if (sc.chNext == 'z') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tstringWs = 0x100;\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_LUA_DEFAULT);\n\t\t\t} else if (stringWs == 0 && sc.atLineEnd) {\n\t\t\t\tsc.ChangeState(SCE_LUA_STRINGEOL);\n\t\t\t\tsc.ForwardSetState(SCE_LUA_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_LUA_CHARACTER) {\n\t\t\tif (stringWs) {\n\t\t\t\tif (!IsASpace(sc.ch))\n\t\t\t\t\tstringWs = 0;\n\t\t\t}\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\tif (setEscapeSkip.Contains(sc.chNext)) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} else if (sc.chNext == 'z') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tstringWs = 0x100;\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.ForwardSetState(SCE_LUA_DEFAULT);\n\t\t\t} else if (stringWs == 0 && sc.atLineEnd) {\n\t\t\t\tsc.ChangeState(SCE_LUA_STRINGEOL);\n\t\t\t\tsc.ForwardSetState(SCE_LUA_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_LUA_LITERALSTRING || sc.state == SCE_LUA_COMMENT) {\n\t\t\tif (sc.ch == '[') {\n\t\t\t\tint sep = LongDelimCheck(sc);\n\t\t\t\tif (sep == 1 && sepCount == 1) {    // [[-only allowed to nest\n\t\t\t\t\tnestLevel++;\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (sc.ch == ']') {\n\t\t\t\tint sep = LongDelimCheck(sc);\n\t\t\t\tif (sep == 1 && sepCount == 1) {    // un-nest with ]]-only\n\t\t\t\t\tnestLevel--;\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tif (nestLevel == 0) {\n\t\t\t\t\t\tsc.ForwardSetState(SCE_LUA_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t} else if (sep > 1 && sep == sepCount) {   // ]=]-style delim\n\t\t\t\t\tsc.Forward(sep);\n\t\t\t\t\tsc.ForwardSetState(SCE_LUA_DEFAULT);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_LUA_DEFAULT) {\n\t\t\tif (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_LUA_NUMBER);\n\t\t\t\tif (sc.ch == '0' && toupper(sc.chNext) == 'X') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (setWordStart.Contains(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_LUA_IDENTIFIER);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_LUA_STRING);\n\t\t\t\tstringWs = 0;\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_LUA_CHARACTER);\n\t\t\t\tstringWs = 0;\n\t\t\t} else if (sc.ch == '[') {\n\t\t\t\tsepCount = LongDelimCheck(sc);\n\t\t\t\tif (sepCount == 0) {\n\t\t\t\t\tsc.SetState(SCE_LUA_OPERATOR);\n\t\t\t\t} else {\n\t\t\t\t\tnestLevel = 1;\n\t\t\t\t\tsc.SetState(SCE_LUA_LITERALSTRING);\n\t\t\t\t\tsc.Forward(sepCount);\n\t\t\t\t}\n\t\t\t} else if (sc.Match('-', '-')) {\n\t\t\t\tsc.SetState(SCE_LUA_COMMENTLINE);\n\t\t\t\tif (sc.Match(\"--[\")) {\n\t\t\t\t\tsc.Forward(2);\n\t\t\t\t\tsepCount = LongDelimCheck(sc);\n\t\t\t\t\tif (sepCount > 0) {\n\t\t\t\t\t\tnestLevel = 1;\n\t\t\t\t\t\tsc.ChangeState(SCE_LUA_COMMENT);\n\t\t\t\t\t\tsc.Forward(sepCount);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (sc.atLineStart && sc.Match('$')) {\n\t\t\t\tsc.SetState(SCE_LUA_PREPROCESSOR);\t// Obsolete since Lua 4.0, but still in old code\n\t\t\t} else if (setLuaOperator.Contains(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_LUA_OPERATOR);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (setWord.Contains(sc.chPrev) || sc.chPrev == '.') {\n\t\tchar s[100];\n\t\tsc.GetCurrent(s, sizeof(s));\n\t\tif (keywords.InList(s)) {\n\t\t\tsc.ChangeState(SCE_LUA_WORD);\n\t\t} else if (keywords2.InList(s)) {\n\t\t\tsc.ChangeState(SCE_LUA_WORD2);\n\t\t} else if (keywords3.InList(s)) {\n\t\t\tsc.ChangeState(SCE_LUA_WORD3);\n\t\t} else if (keywords4.InList(s)) {\n\t\t\tsc.ChangeState(SCE_LUA_WORD4);\n\t\t} else if (keywords5.InList(s)) {\n\t\t\tsc.ChangeState(SCE_LUA_WORD5);\n\t\t} else if (keywords6.InList(s)) {\n\t\t\tsc.ChangeState(SCE_LUA_WORD6);\n\t\t} else if (keywords7.InList(s)) {\n\t\t\tsc.ChangeState(SCE_LUA_WORD7);\n\t\t} else if (keywords8.InList(s)) {\n\t\t\tsc.ChangeState(SCE_LUA_WORD8);\n\t\t}\n\t}\n\n\tsc.Complete();\n}\n\nstatic void FoldLuaDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[],\n                       Accessor &styler) {\n\tunsigned int lengthDoc = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tint styleNext = styler.StyleAt(startPos);\n\n\tfor (unsigned int i = startPos; i < lengthDoc; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (style == SCE_LUA_WORD) {\n\t\t\tif (ch == 'i' || ch == 'd' || ch == 'f' || ch == 'e' || ch == 'r' || ch == 'u') {\n\t\t\t\tchar s[10] = \"\";\n\t\t\t\tfor (unsigned int j = 0; j < 8; j++) {\n\t\t\t\t\tif (!iswordchar(styler[i + j])) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\ts[j] = styler[i + j];\n\t\t\t\t\ts[j + 1] = '\\0';\n\t\t\t\t}\n\n\t\t\t\tif ((strcmp(s, \"if\") == 0) || (strcmp(s, \"do\") == 0) || (strcmp(s, \"function\") == 0) || (strcmp(s, \"repeat\") == 0)) {\n\t\t\t\t\tlevelCurrent++;\n\t\t\t\t}\n\t\t\t\tif ((strcmp(s, \"end\") == 0) || (strcmp(s, \"elseif\") == 0) || (strcmp(s, \"until\") == 0)) {\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (style == SCE_LUA_OPERATOR) {\n\t\t\tif (ch == '{' || ch == '(') {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (ch == '}' || ch == ')') {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t} else if (style == SCE_LUA_LITERALSTRING || style == SCE_LUA_COMMENT) {\n\t\t\tif (ch == '[') {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (ch == ']') {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact) {\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\t}\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0)) {\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t}\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch)) {\n\t\t\tvisibleChars++;\n\t\t}\n\t}\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nstatic const char * const luaWordListDesc[] = {\n\t\"Keywords\",\n\t\"Basic functions\",\n\t\"String, (table) & math functions\",\n\t\"(coroutines), I/O & system facilities\",\n\t\"user1\",\n\t\"user2\",\n\t\"user3\",\n\t\"user4\",\n\t0\n};\n\nLexerModule lmLua(SCLEX_LUA, ColouriseLuaDoc, \"lua\", FoldLuaDoc, luaWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexMMIXAL.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexMMIXAL.cxx\n ** Lexer for MMIX Assembler Language.\n ** Written by Christoph Hsler <christoph.hoesler@student.uni-tuebingen.de>\n ** For information about MMIX visit http://www-cs-faculty.stanford.edu/~knuth/mmix.html\n **/\n// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == ':' || ch == '_');\n}\n\ninline bool isMMIXALOperator(char ch) {\n\tif (IsASCII(ch) && isalnum(ch))\n\t\treturn false;\n\tif (ch == '+' || ch == '-' || ch == '|' || ch == '^' ||\n\t\tch == '*' || ch == '/' ||\n\t\tch == '%' || ch == '<' || ch == '>' || ch == '&' ||\n\t\tch == '~' || ch == '$' ||\n\t\tch == ',' || ch == '(' || ch == ')' ||\n\t\tch == '[' || ch == ']')\n\t\treturn true;\n\treturn false;\n}\n\nstatic void ColouriseMMIXALDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                            Accessor &styler) {\n\n\tWordList &opcodes = *keywordlists[0];\n\tWordList &special_register = *keywordlists[1];\n\tWordList &predef_symbols = *keywordlists[2];\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward())\n\t{\n\t\t// No EOL continuation\n\t\tif (sc.atLineStart) {\n\t\t\tif (sc.ch ==  '@' && sc.chNext == 'i') {\n\t\t\t\tsc.SetState(SCE_MMIXAL_INCLUDE);\n\t\t\t} else {\n\t\t\t\tsc.SetState(SCE_MMIXAL_LEADWS);\n\t\t\t}\n\t\t}\n\n\t\t// Check if first non whitespace character in line is alphanumeric\n\t\tif (sc.state == SCE_MMIXAL_LEADWS && !isspace(sc.ch)) {\t// LEADWS\n\t\t\tif(!IsAWordChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_MMIXAL_COMMENT);\n\t\t\t} else {\n\t\t\t\tif(sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_MMIXAL_LABEL);\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_MMIXAL_OPCODE_PRE);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Determine if the current state should terminate.\n\t\tif (sc.state == SCE_MMIXAL_OPERATOR) {\t\t\t// OPERATOR\n\t\t\tsc.SetState(SCE_MMIXAL_OPERANDS);\n\t\t} else if (sc.state == SCE_MMIXAL_NUMBER) {\t\t// NUMBER\n\t\t\tif (!isdigit(sc.ch)) {\n\t\t\t\tif (IsAWordChar(sc.ch)) {\n\t\t\t\t\tchar s[100];\n\t\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\t\tsc.ChangeState(SCE_MMIXAL_REF);\n\t\t\t\t\tsc.SetState(SCE_MMIXAL_REF);\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_MMIXAL_OPERANDS);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (sc.state == SCE_MMIXAL_LABEL) {\t\t\t// LABEL\n\t\t\tif (!IsAWordChar(sc.ch) ) {\n\t\t\t\tsc.SetState(SCE_MMIXAL_OPCODE_PRE);\n\t\t\t}\n\t\t} else if (sc.state == SCE_MMIXAL_REF) {\t\t\t// REF\n\t\t\tif (!IsAWordChar(sc.ch) ) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\tif (*s == ':') {\t// ignore base prefix for match\n\t\t\t\t\tfor (size_t i = 0; i != sizeof(s); ++i) {\n\t\t\t\t\t\t*(s+i) = *(s+i+1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (special_register.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_MMIXAL_REGISTER);\n\t\t\t\t} else if (predef_symbols.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_MMIXAL_SYMBOL);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_MMIXAL_OPERANDS);\n\t\t\t}\n\t\t} else if (sc.state == SCE_MMIXAL_OPCODE_PRE) {\t// OPCODE_PRE\n\t\t\t\tif (!isspace(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_MMIXAL_OPCODE);\n\t\t\t\t}\n\t\t} else if (sc.state == SCE_MMIXAL_OPCODE) {\t\t// OPCODE\n\t\t\tif (!IsAWordChar(sc.ch) ) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\tif (opcodes.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_MMIXAL_OPCODE_VALID);\n\t\t\t\t} else {\n\t\t\t\t\tsc.ChangeState(SCE_MMIXAL_OPCODE_UNKNOWN);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_MMIXAL_OPCODE_POST);\n\t\t\t}\n\t\t} else if (sc.state == SCE_MMIXAL_STRING) {\t\t// STRING\n\t\t\tif (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_MMIXAL_OPERANDS);\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.ForwardSetState(SCE_MMIXAL_OPERANDS);\n\t\t\t}\n\t\t} else if (sc.state == SCE_MMIXAL_CHAR) {\t\t\t// CHAR\n\t\t\tif (sc.ch == '\\'') {\n\t\t\t\tsc.ForwardSetState(SCE_MMIXAL_OPERANDS);\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.ForwardSetState(SCE_MMIXAL_OPERANDS);\n\t\t\t}\n\t\t} else if (sc.state == SCE_MMIXAL_REGISTER) {\t\t// REGISTER\n\t\t\tif (!isdigit(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_MMIXAL_OPERANDS);\n\t\t\t}\n\t\t} else if (sc.state == SCE_MMIXAL_HEX) {\t\t\t// HEX\n\t\t\tif (!isxdigit(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_MMIXAL_OPERANDS);\n\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_MMIXAL_OPCODE_POST ||\t\t// OPCODE_POST\n\t\t\tsc.state == SCE_MMIXAL_OPERANDS) {\t\t\t// OPERANDS\n\t\t\tif (sc.state == SCE_MMIXAL_OPERANDS && isspace(sc.ch)) {\n\t\t\t\tif (!sc.atLineEnd) {\n\t\t\t\t\tsc.SetState(SCE_MMIXAL_COMMENT);\n\t\t\t\t}\n\t\t\t} else if (isdigit(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_MMIXAL_NUMBER);\n\t\t\t} else if (IsAWordChar(sc.ch) || sc.Match('@')) {\n\t\t\t\tsc.SetState(SCE_MMIXAL_REF);\n\t\t\t} else if (sc.Match('\\\"')) {\n\t\t\t\tsc.SetState(SCE_MMIXAL_STRING);\n\t\t\t} else if (sc.Match('\\'')) {\n\t\t\t\tsc.SetState(SCE_MMIXAL_CHAR);\n\t\t\t} else if (sc.Match('$')) {\n\t\t\t\tsc.SetState(SCE_MMIXAL_REGISTER);\n\t\t\t} else if (sc.Match('#')) {\n\t\t\t\tsc.SetState(SCE_MMIXAL_HEX);\n\t\t\t} else if (isMMIXALOperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_MMIXAL_OPERATOR);\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n}\n\nstatic const char * const MMIXALWordListDesc[] = {\n\t\"Operation Codes\",\n\t\"Special Register\",\n\t\"Predefined Symbols\",\n\t0\n};\n\nLexerModule lmMMIXAL(SCLEX_MMIXAL, ColouriseMMIXALDoc, \"mmixal\", 0, MMIXALWordListDesc);\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexMPT.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexMPT.cxx\n ** Lexer for MPT specific files. Based on LexOthers.cxx\n ** LOT = the text log file created by the MPT application while running a test program\n ** Other MPT specific files to be added later.\n **/\n// Copyright 2003 by Marius Gheorghe <mgheorghe@cabletest.com>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include <string>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic int GetLotLineState(std::string &line) {\n\tif (line.length()) {\n\t\t// Most of the time the first non-blank character in line determines that line's type\n\t\t// Now finds the first non-blank character\n\t\tunsigned i; // Declares counter here to make it persistent after the for loop\n\t\tfor (i = 0; i < line.length(); ++i) {\n\t\t\tif (!(IsASCII(line[i]) && isspace(line[i])))\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Checks if it was a blank line\n\t\tif (i == line.length())\n\t\t\treturn SCE_LOT_DEFAULT;\n\n\t\tswitch (line[i]) {\n\t\tcase '*': // Fail measurement\n\t\t\treturn SCE_LOT_FAIL;\n\n\t\tcase '+': // Header\n\t\tcase '|': // Header\n\t\t\treturn SCE_LOT_HEADER;\n\n\t\tcase ':': // Set test limits\n\t\t\treturn SCE_LOT_SET;\n\n\t\tcase '-': // Section break\n\t\t\treturn SCE_LOT_BREAK;\n\n\t\tdefault:  // Any other line\n\t\t\t// Checks for message at the end of lot file\n\t\t\tif (line.find(\"PASSED\") != std::string::npos) {\n\t\t\t\treturn SCE_LOT_PASS;\n\t\t\t}\n\t\t\telse if (line.find(\"FAILED\") != std::string::npos) {\n\t\t\t\treturn SCE_LOT_FAIL;\n\t\t\t}\n\t\t\telse if (line.find(\"ABORTED\") != std::string::npos) {\n\t\t\t\treturn SCE_LOT_ABORT;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn i ? SCE_LOT_PASS : SCE_LOT_DEFAULT;\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\treturn SCE_LOT_DEFAULT;\n\t}\n}\n\nstatic void ColourizeLotDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {\n\tstyler.StartAt(startPos);\n\tstyler.StartSegment(startPos);\n\tbool atLineStart = true;// Arms the 'at line start' flag\n\tchar chNext = styler.SafeGetCharAt(startPos);\n\tstd::string line(\"\");\n\tline.reserve(256);\t// Lot lines are less than 256 chars long most of the time. This should avoid reallocations\n\n\t// Styles LOT document\n\tunsigned int i;\t\t\t// Declared here because it's used after the for loop\n\tfor (i = startPos; i < startPos + length; ++i) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tline += ch;\n\t\tatLineStart = false;\n\n\t\t// LOT files are only used on the Win32 platform, thus EOL == CR+LF\n\t\t// Searches for the end of line\n\t\tif (ch == '\\r' && chNext == '\\n') {\n\t\t\tline += chNext; // Gets the '\\n'\n\t\t\t++i; // Advances past the '\\n'\n\t\t\tchNext = styler.SafeGetCharAt(i + 1); // Gets character of next line\n\t\t\tstyler.ColourTo(i, GetLotLineState(line));\n\t\t\tline = \"\";\n\t\t\tatLineStart = true; // Arms flag for next line\n\t\t}\n\t}\n\n\t// Last line may not have a line ending\n\tif (!atLineStart) {\n\t\tstyler.ColourTo(i - 1, GetLotLineState(line));\n\t}\n}\n\n// Folds an MPT LOT file: the blocks that can be folded are:\n// sections (headed by a set line)\n// passes (contiguous pass results within a section)\n// fails (contiguous fail results within a section)\nstatic void FoldLotDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 0) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\n\tchar chNext = styler.SafeGetCharAt(startPos);\n\tint style = SCE_LOT_DEFAULT;\n\tint styleNext = styler.StyleAt(startPos);\n\tint lev = SC_FOLDLEVELBASE;\n\n\t// Gets style of previous line if not at the beginning of the document\n\tif (startPos > 1)\n\t\tstyle = styler.StyleAt(startPos - 2);\n\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\n\t\tif (ch == '\\r' && chNext == '\\n') {\n\t\t\t// TO DO:\n\t\t\t// Should really get the state of the previous line from the styler\n\t\t\tint stylePrev = style;\n\t\t\tstyle = styleNext;\n\t\t\tstyleNext = styler.StyleAt(i + 2);\n\n\t\t\tswitch (style) {\n/*\n\t\t\tcase SCE_LOT_SET:\n\t\t\t\tlev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;\n\t\t\t\tbreak;\n*/\n\t\t\tcase SCE_LOT_FAIL:\n/*\n\t\t\t\tif (stylePrev != SCE_LOT_FAIL)\n\t\t\t\t\tlev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;\n\t\t\t\telse\n\t\t\t\t\tlev = SC_FOLDLEVELBASE + 1;\n*/\n\t\t\t\tlev = SC_FOLDLEVELBASE;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tif (lineCurrent == 0 || stylePrev == SCE_LOT_FAIL)\n\t\t\t\t\tlev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;\n\t\t\t\telse\n\t\t\t\t\tlev = SC_FOLDLEVELBASE + 1;\n\n\t\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (lev != styler.LevelAt(lineCurrent))\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\n\t\t\tlineCurrent++;\n\t\t\tvisibleChars = 0;\n\t\t}\n\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, lev | flagsNext);\n}\n\nstatic const char * const emptyWordListDesc[] = {\n\t0\n};\n\nLexerModule lmLot(SCLEX_LOT, ColourizeLotDoc, \"lot\", FoldLotDoc, emptyWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexMSSQL.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexMSSQL.cxx\n ** Lexer for MSSQL.\n **/\n// By Filip Yaghob <fyaghob@gmail.com>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n#define KW_MSSQL_STATEMENTS         0\n#define KW_MSSQL_DATA_TYPES         1\n#define KW_MSSQL_SYSTEM_TABLES      2\n#define KW_MSSQL_GLOBAL_VARIABLES   3\n#define KW_MSSQL_FUNCTIONS          4\n#define KW_MSSQL_STORED_PROCEDURES  5\n#define KW_MSSQL_OPERATORS          6\n\nstatic char classifyWordSQL(unsigned int start,\n                            unsigned int end,\n                            WordList *keywordlists[],\n                            Accessor &styler,\n                            unsigned int actualState,\n\t\t\t\t\t\t\tunsigned int prevState) {\n\tchar s[256];\n\tbool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');\n\n\tWordList &kwStatements          = *keywordlists[KW_MSSQL_STATEMENTS];\n    WordList &kwDataTypes           = *keywordlists[KW_MSSQL_DATA_TYPES];\n    WordList &kwSystemTables        = *keywordlists[KW_MSSQL_SYSTEM_TABLES];\n    WordList &kwGlobalVariables     = *keywordlists[KW_MSSQL_GLOBAL_VARIABLES];\n    WordList &kwFunctions           = *keywordlists[KW_MSSQL_FUNCTIONS];\n    WordList &kwStoredProcedures    = *keywordlists[KW_MSSQL_STORED_PROCEDURES];\n    WordList &kwOperators           = *keywordlists[KW_MSSQL_OPERATORS];\n\n\tfor (unsigned int i = 0; i < end - start + 1 && i < 128; i++) {\n\t\ts[i] = static_cast<char>(tolower(styler[start + i]));\n\t\ts[i + 1] = '\\0';\n\t}\n\tchar chAttr = SCE_MSSQL_IDENTIFIER;\n\n\tif (actualState == SCE_MSSQL_GLOBAL_VARIABLE) {\n\n        if (kwGlobalVariables.InList(&s[2]))\n            chAttr = SCE_MSSQL_GLOBAL_VARIABLE;\n\n\t} else if (wordIsNumber) {\n\t\tchAttr = SCE_MSSQL_NUMBER;\n\n\t} else if (prevState == SCE_MSSQL_DEFAULT_PREF_DATATYPE) {\n\t\t// Look first in datatypes\n        if (kwDataTypes.InList(s))\n            chAttr = SCE_MSSQL_DATATYPE;\n\t\telse if (kwOperators.InList(s))\n\t\t\tchAttr = SCE_MSSQL_OPERATOR;\n\t\telse if (kwStatements.InList(s))\n\t\t\tchAttr = SCE_MSSQL_STATEMENT;\n\t\telse if (kwSystemTables.InList(s))\n\t\t\tchAttr = SCE_MSSQL_SYSTABLE;\n\t\telse if (kwFunctions.InList(s))\n            chAttr = SCE_MSSQL_FUNCTION;\n\t\telse if (kwStoredProcedures.InList(s))\n\t\t\tchAttr = SCE_MSSQL_STORED_PROCEDURE;\n\n\t} else {\n\t\tif (kwOperators.InList(s))\n\t\t\tchAttr = SCE_MSSQL_OPERATOR;\n\t\telse if (kwStatements.InList(s))\n\t\t\tchAttr = SCE_MSSQL_STATEMENT;\n\t\telse if (kwSystemTables.InList(s))\n\t\t\tchAttr = SCE_MSSQL_SYSTABLE;\n\t\telse if (kwFunctions.InList(s))\n\t\t\tchAttr = SCE_MSSQL_FUNCTION;\n\t\telse if (kwStoredProcedures.InList(s))\n\t\t\tchAttr = SCE_MSSQL_STORED_PROCEDURE;\n\t\telse if (kwDataTypes.InList(s))\n\t\t\tchAttr = SCE_MSSQL_DATATYPE;\n\t}\n\n\tstyler.ColourTo(end, chAttr);\n\n\treturn chAttr;\n}\n\nstatic void ColouriseMSSQLDoc(unsigned int startPos, int length,\n                              int initStyle, WordList *keywordlists[], Accessor &styler) {\n\n\n\tstyler.StartAt(startPos);\n\n\tbool fold = styler.GetPropertyInt(\"fold\") != 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint spaceFlags = 0;\n\n\tint state = initStyle;\n\tint prevState = initStyle;\n\tchar chPrev = ' ';\n\tchar chNext = styler[startPos];\n\tstyler.StartSegment(startPos);\n\tunsigned int lengthDoc = startPos + length;\n\tfor (unsigned int i = startPos; i < lengthDoc; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\n\t\tif ((ch == '\\r' && chNext != '\\n') || (ch == '\\n')) {\n\t\t\tint indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags);\n\t\t\tint lev = indentCurrent;\n\t\t\tif (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {\n\t\t\t\t// Only non whitespace lines can be headers\n\t\t\t\tint indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags);\n\t\t\t\tif (indentCurrent < (indentNext & ~SC_FOLDLEVELWHITEFLAG)) {\n\t\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (fold) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t}\n\n\t\tif (styler.IsLeadByte(ch)) {\n\t\t\tchNext = styler.SafeGetCharAt(i + 2);\n\t\t\tchPrev = ' ';\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// When the last char isn't part of the state (have to deal with it too)...\n\t\tif ( (state == SCE_MSSQL_IDENTIFIER) ||\n                    (state == SCE_MSSQL_STORED_PROCEDURE) ||\n                    (state == SCE_MSSQL_DATATYPE) ||\n                    //~ (state == SCE_MSSQL_COLUMN_NAME) ||\n                    (state == SCE_MSSQL_FUNCTION) ||\n                    //~ (state == SCE_MSSQL_GLOBAL_VARIABLE) ||\n                    (state == SCE_MSSQL_VARIABLE)) {\n\t\t\tif (!iswordchar(ch)) {\n\t\t\t\tint stateTmp;\n\n                if ((state == SCE_MSSQL_VARIABLE) || (state == SCE_MSSQL_COLUMN_NAME)) {\n                    styler.ColourTo(i - 1, state);\n\t\t\t\t\tstateTmp = state;\n                } else\n                    stateTmp = classifyWordSQL(styler.GetStartSegment(), i - 1, keywordlists, styler, state, prevState);\n\n\t\t\t\tprevState = state;\n\n\t\t\t\tif (stateTmp == SCE_MSSQL_IDENTIFIER || stateTmp == SCE_MSSQL_VARIABLE)\n\t\t\t\t\tstate = SCE_MSSQL_DEFAULT_PREF_DATATYPE;\n\t\t\t\telse\n\t\t\t\t\tstate = SCE_MSSQL_DEFAULT;\n\t\t\t}\n\t\t} else if (state == SCE_MSSQL_LINE_COMMENT) {\n\t\t\tif (ch == '\\r' || ch == '\\n') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tprevState = state;\n\t\t\t\tstate = SCE_MSSQL_DEFAULT;\n\t\t\t}\n\t\t} else if (state == SCE_MSSQL_GLOBAL_VARIABLE) {\n\t\t\tif ((ch != '@') && !iswordchar(ch)) {\n\t\t\t\tclassifyWordSQL(styler.GetStartSegment(), i - 1, keywordlists, styler, state, prevState);\n\t\t\t\tprevState = state;\n\t\t\t\tstate = SCE_MSSQL_DEFAULT;\n\t\t\t}\n\t\t}\n\n\t\t// If is the default or one of the above succeeded\n\t\tif (state == SCE_MSSQL_DEFAULT || state == SCE_MSSQL_DEFAULT_PREF_DATATYPE) {\n\t\t\tif (iswordstart(ch)) {\n\t\t\t\tstyler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);\n\t\t\t\tprevState = state;\n\t\t\t\tstate = SCE_MSSQL_IDENTIFIER;\n\t\t\t} else if (ch == '/' && chNext == '*') {\n\t\t\t\tstyler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);\n\t\t\t\tprevState = state;\n\t\t\t\tstate = SCE_MSSQL_COMMENT;\n\t\t\t} else if (ch == '-' && chNext == '-') {\n\t\t\t\tstyler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);\n\t\t\t\tprevState = state;\n\t\t\t\tstate = SCE_MSSQL_LINE_COMMENT;\n\t\t\t} else if (ch == '\\'') {\n\t\t\t\tstyler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);\n\t\t\t\tprevState = state;\n\t\t\t\tstate = SCE_MSSQL_STRING;\n\t\t\t} else if (ch == '\"') {\n\t\t\t\tstyler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);\n\t\t\t\tprevState = state;\n\t\t\t\tstate = SCE_MSSQL_COLUMN_NAME;\n\t\t\t} else if (ch == '[') {\n\t\t\t\tstyler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);\n\t\t\t\tprevState = state;\n\t\t\t\tstate = SCE_MSSQL_COLUMN_NAME_2;\n\t\t\t} else if (isoperator(ch)) {\n\t\t\t\tstyler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);\n\t\t\t\tstyler.ColourTo(i, SCE_MSSQL_OPERATOR);\n                //~ style = SCE_MSSQL_DEFAULT;\n\t\t\t\tprevState = state;\n\t\t\t\tstate = SCE_MSSQL_DEFAULT;\n\t\t\t} else if (ch == '@') {\n                styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT);\n\t\t\t\tprevState = state;\n                if (chNext == '@') {\n                    state = SCE_MSSQL_GLOBAL_VARIABLE;\n//                    i += 2;\n                } else\n                    state = SCE_MSSQL_VARIABLE;\n            }\n\n\n\t\t// When the last char is part of the state...\n\t\t} else if (state == SCE_MSSQL_COMMENT) {\n\t\t\t\tif (ch == '/' && chPrev == '*') {\n\t\t\t\t\tif (((i > (styler.GetStartSegment() + 2)) || ((initStyle == SCE_MSSQL_COMMENT) &&\n\t\t\t\t\t    (styler.GetStartSegment() == startPos)))) {\n\t\t\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\t\t\t//~ state = SCE_MSSQL_COMMENT;\n\t\t\t\t\tprevState = state;\n                        state = SCE_MSSQL_DEFAULT;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (state == SCE_MSSQL_STRING) {\n\t\t\t\tif (ch == '\\'') {\n\t\t\t\t\tif ( chNext == '\\'' ) {\n\t\t\t\t\t\ti++;\n\t\t\t\t\tch = chNext;\n\t\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\t\tprevState = state;\n\t\t\t\t\t\tstate = SCE_MSSQL_DEFAULT;\n\t\t\t\t\t//i++;\n\t\t\t\t\t}\n\t\t\t\t//ch = chNext;\n\t\t\t\t//chNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\t}\n\t\t\t} else if (state == SCE_MSSQL_COLUMN_NAME) {\n\t\t\t\tif (ch == '\"') {\n\t\t\t\t\tif (chNext == '\"') {\n\t\t\t\t\t\ti++;\n\t\t\t\t\tch = chNext;\n\t\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\t} else {\n                    styler.ColourTo(i, state);\n\t\t\t\t\tprevState = state;\n\t\t\t\t\tstate = SCE_MSSQL_DEFAULT_PREF_DATATYPE;\n\t\t\t\t\t//i++;\n                }\n                }\n\t\t} else if (state == SCE_MSSQL_COLUMN_NAME_2) {\n\t\t\tif (ch == ']') {\n                styler.ColourTo(i, state);\n\t\t\t\tprevState = state;\n                state = SCE_MSSQL_DEFAULT_PREF_DATATYPE;\n                //i++;\n\t\t\t}\n\t\t}\n\n\t\tchPrev = ch;\n\t}\n\tstyler.ColourTo(lengthDoc - 1, state);\n}\n\nstatic void FoldMSSQLDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tbool inComment = (styler.StyleAt(startPos-1) == SCE_MSSQL_COMMENT);\n    char s[10] = \"\";\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styler.StyleAt(i);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n        // Comment folding\n\t\tif (foldComment) {\n\t\t\tif (!inComment && (style == SCE_MSSQL_COMMENT))\n\t\t\t\tlevelCurrent++;\n\t\t\telse if (inComment && (style != SCE_MSSQL_COMMENT))\n\t\t\t\tlevelCurrent--;\n\t\t\tinComment = (style == SCE_MSSQL_COMMENT);\n\t\t}\n        if (style == SCE_MSSQL_STATEMENT) {\n            // Folding between begin or case and end\n            if (ch == 'b' || ch == 'B' || ch == 'c' || ch == 'C' || ch == 'e' || ch == 'E') {\n                for (unsigned int j = 0; j < 5; j++) {\n\t\t\t\t\tif (!iswordchar(styler[i + j])) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\ts[j] = static_cast<char>(tolower(styler[i + j]));\n\t\t\t\t\ts[j + 1] = '\\0';\n                }\n\t\t\t\tif ((strcmp(s, \"begin\") == 0) || (strcmp(s, \"case\") == 0)) {\n\t\t\t\t\tlevelCurrent++;\n\t\t\t\t}\n\t\t\t\tif (strcmp(s, \"end\") == 0) {\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n            }\n        }\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nstatic const char * const sqlWordListDesc[] = {\n\t\"Statements\",\n    \"Data Types\",\n    \"System tables\",\n    \"Global variables\",\n    \"Functions\",\n    \"System Stored Procedures\",\n    \"Operators\",\n\t0,\n};\n\nLexerModule lmMSSQL(SCLEX_MSSQL, ColouriseMSSQLDoc, \"mssql\", FoldMSSQLDoc, sqlWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexMagik.cpp",
    "content": "// Scintilla source code edit control\n/**\n * @file LexMagik.cxx\n * Lexer for GE(r) Smallworld(tm) MagikSF\n */\n// Copyright 1998-2005 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n/**\n * Is it a core character (C isalpha(), exclamation and question mark)\n *\n * \\param  ch The character\n * \\return True if ch is a character, False otherwise\n */\nstatic inline bool IsAlphaCore(int ch) {\n    return (isalpha(ch) || ch == '!' || ch == '?');\n}\n\n/**\n * Is it a character (IsAlphaCore() and underscore)\n *\n * \\param  ch The character\n * \\return True if ch is a character, False otherwise\n */\nstatic inline bool IsAlpha(int ch) {\n    return (IsAlphaCore(ch) || ch == '_');\n}\n\n/**\n * Is it a symbolic character (IsAlpha() and colon)\n *\n * \\param  ch The character\n * \\return True if ch is a character, False otherwise\n */\nstatic inline bool IsAlphaSym(int ch) {\n    return (IsAlpha(ch) || ch == ':');\n}\n\n/**\n * Is it a numerical character (IsAlpha() and 0 - 9)\n *\n * \\param  ch The character\n * \\return True if ch is a character, False otherwise\n */\nstatic inline bool IsAlNum(int ch) {\n    return ((ch >= '0' && ch <= '9') || IsAlpha(ch));\n}\n\n/**\n * Is it a symbolic numerical character (IsAlNum() and colon)\n *\n * \\param  ch The character\n * \\return True if ch is a character, False otherwise\n */\nstatic inline bool IsAlNumSym(int ch) {\n    return (IsAlNum(ch) || ch == ':');\n}\n\n/**\n * The lexer function\n *\n * \\param  startPos Where to start scanning\n * \\param  length Where to scan to\n * \\param  initStyle The style at the initial point, not used in this folder\n * \\param  keywordslists The keywordslists, currently, number 5 is used\n * \\param  styler The styler\n */\nstatic void ColouriseMagikDoc(unsigned int startPos, int length, int initStyle,\n                           WordList *keywordlists[], Accessor &styler) {\n    styler.StartAt(startPos);\n\n    WordList &keywords = *keywordlists[0];\n    WordList &pragmatics = *keywordlists[1];\n    WordList &containers = *keywordlists[2];\n    WordList &flow = *keywordlists[3];\n    WordList &characters = *keywordlists[4];\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\n\tfor (; sc.More(); sc.Forward()) {\n\n    repeat:\n\n        if(sc.ch == '#') {\n            if (sc.chNext == '#') sc.SetState(SCE_MAGIK_HYPER_COMMENT);\n            else sc.SetState(SCE_MAGIK_COMMENT);\n            for(; sc.More() && !(sc.atLineEnd); sc.Forward());\n            sc.SetState(SCE_MAGIK_DEFAULT);\n            goto repeat;\n        }\n\n        if(sc.ch == '\"') {\n            sc.SetState(SCE_MAGIK_STRING);\n\n            if(sc.More())\n            {\n                sc.Forward();\n                for(; sc.More() && sc.ch != '\"'; sc.Forward());\n            }\n\n            sc.ForwardSetState(SCE_MAGIK_DEFAULT);\n            goto repeat;\n        }\n\n\t    // The default state\n\t    if(sc.state == SCE_MAGIK_DEFAULT) {\n\n\t        // A certain keyword has been detected\n\t        if (sc.ch == '_' && (\n                    sc.currentPos == 0 || !IsAlNum(sc.chPrev))) {\n\t            char keyword[50];\n\t            memset(keyword, '\\0', 50);\n\n\t            for(\n                    int scanPosition = 0;\n                    scanPosition < 50;\n                    scanPosition++) {\n\t                char keywordChar = static_cast<char>(\n                        tolower(styler.SafeGetCharAt(\n                            scanPosition +\n                                static_cast<int>(sc.currentPos+1), ' ')));\n                    if(IsAlpha(keywordChar)) {\n                        keyword[scanPosition] = keywordChar;\n                    } else {\n                        break;\n                    }\n\t            }\n\n                // It is a pragma\n\t            if(pragmatics.InList(keyword)) {\n\t                sc.SetState(SCE_MAGIK_PRAGMA);\n\t            }\n\n\t            // it is a normal keyword like _local, _self, etc.\n\t            else if(keywords.InList(keyword)) {\n\t                sc.SetState(SCE_MAGIK_KEYWORD);\n\t            }\n\n                // It is a container keyword, such as _method, _proc, etc.\n\t            else if(containers.InList(keyword)) {\n\t                sc.SetState(SCE_MAGIK_CONTAINER);\n\t            }\n\n\t            // It is a flow keyword, such as _for, _if, _try, etc.\n\t            else if(flow.InList(keyword)) {\n\t                sc.SetState(SCE_MAGIK_FLOW);\n\t            }\n\n\t            // Interpret as unknown keyword\n\t            else {\n\t                sc.SetState(SCE_MAGIK_UNKNOWN_KEYWORD);\n\t            }\n\t        }\n\n            // Symbolic expression\n\t        else if(sc.ch == ':' && !IsAlNum(sc.chPrev)) {\n\t            sc.SetState(SCE_MAGIK_SYMBOL);\n\t            bool firstTrip = true;\n\t            for(sc.Forward(); sc.More(); sc.Forward()) {\n\t                if(firstTrip && IsAlphaSym(sc.ch));\n\t                else if(!firstTrip && IsAlNumSym(sc.ch));\n\t                else if(sc.ch == '|') {\n\t                    for(sc.Forward();\n                            sc.More() && sc.ch != '|';\n                            sc.Forward());\n\t                }\n\t                else break;\n\n\t                firstTrip = false;\n\t            }\n\t            sc.SetState(SCE_MAGIK_DEFAULT);\n\t            goto repeat;\n\t        }\n\n            // Identifier (label) expression\n\t        else if(sc.ch == '@') {\n\t            sc.SetState(SCE_MAGIK_IDENTIFIER);\n\t            bool firstTrip = true;\n\t            for(sc.Forward(); sc.More(); sc.Forward()) {\n\t                if(firstTrip && IsAlphaCore(sc.ch)) {\n\t                    firstTrip = false;\n\t                }\n\t                else if(!firstTrip && IsAlpha(sc.ch));\n\t                else break;\n\t            }\n\t            sc.SetState(SCE_MAGIK_DEFAULT);\n\t            goto repeat;\n\t        }\n\n\t        // Start of a character\n            else if(sc.ch == '%') {\n                sc.SetState(SCE_MAGIK_CHARACTER);\n                sc.Forward();\n                char keyword[50];\n\t            memset(keyword, '\\0', 50);\n\n\t            for(\n                    int scanPosition = 0;\n                    scanPosition < 50;\n                    scanPosition++) {\n\t                char keywordChar = static_cast<char>(\n                        tolower(styler.SafeGetCharAt(\n                            scanPosition +\n                                static_cast<int>(sc.currentPos), ' ')));\n                    if(IsAlpha(keywordChar)) {\n                        keyword[scanPosition] = keywordChar;\n                    } else {\n                        break;\n                    }\n\t            }\n\n\t            if(characters.InList(keyword)) {\n\t                sc.Forward(static_cast<int>(strlen(keyword)));\n\t            } else {\n\t                sc.Forward();\n\t            }\n\n                sc.SetState(SCE_MAGIK_DEFAULT);\n                goto repeat;\n            }\n\n            // Operators\n\t        else if(\n                sc.ch == '>' ||\n                sc.ch == '<' ||\n                sc.ch == '.' ||\n                sc.ch == ',' ||\n                sc.ch == '+' ||\n                sc.ch == '-' ||\n                sc.ch == '/' ||\n                sc.ch == '*' ||\n                sc.ch == '~' ||\n                sc.ch == '$' ||\n                sc.ch == '=') {\n                sc.SetState(SCE_MAGIK_OPERATOR);\n            }\n\n            // Braces\n            else if(sc.ch == '(' || sc.ch == ')') {\n                sc.SetState(SCE_MAGIK_BRACE_BLOCK);\n            }\n\n            // Brackets\n            else if(sc.ch == '{' || sc.ch == '}') {\n                sc.SetState(SCE_MAGIK_BRACKET_BLOCK);\n            }\n\n            // Square Brackets\n            else if(sc.ch == '[' || sc.ch == ']') {\n                sc.SetState(SCE_MAGIK_SQBRACKET_BLOCK);\n            }\n\n\n\t    }\n\n\t    // It is an operator\n\t    else if(\n            sc.state == SCE_MAGIK_OPERATOR ||\n            sc.state == SCE_MAGIK_BRACE_BLOCK ||\n            sc.state == SCE_MAGIK_BRACKET_BLOCK ||\n            sc.state == SCE_MAGIK_SQBRACKET_BLOCK) {\n\t        sc.SetState(SCE_MAGIK_DEFAULT);\n\t        goto repeat;\n\t    }\n\n\t    // It is the pragma state\n\t    else if(sc.state == SCE_MAGIK_PRAGMA) {\n\t        if(!IsAlpha(sc.ch)) {\n\t            sc.SetState(SCE_MAGIK_DEFAULT);\n                goto repeat;\n\t        }\n\t    }\n\n\t    // It is the keyword state\n\t    else if(\n            sc.state == SCE_MAGIK_KEYWORD ||\n            sc.state == SCE_MAGIK_CONTAINER ||\n            sc.state == SCE_MAGIK_FLOW ||\n            sc.state == SCE_MAGIK_UNKNOWN_KEYWORD) {\n\t        if(!IsAlpha(sc.ch)) {\n\t            sc.SetState(SCE_MAGIK_DEFAULT);\n\t            goto repeat;\n\t        }\n\t    }\n\t}\n\n\tsc.Complete();\n}\n\n/**\n * The word list description\n */\nstatic const char * const magikWordListDesc[] = {\n    \"Accessors (local, global, self, super, thisthread)\",\n    \"Pragmatic (pragma, private)\",\n    \"Containers (method, block, proc)\",\n    \"Flow (if, then, elif, else)\",\n    \"Characters (space, tab, newline, return)\",\n    \"Fold Containers (method, proc, block, if, loop)\",\n    0};\n\n/**\n * This function detects keywords which are able to have a body. Note that it\n * uses the Fold Containers word description, not the containers description. It\n * only works when the style at that particular position is set on Containers\n * or Flow (number 3 or 4).\n *\n * \\param  keywordslist The list of keywords that are scanned, they should only\n *         contain the start keywords, not the end keywords\n * \\param  The actual keyword\n * \\return 1 if it is a folding start-keyword, -1 if it is a folding end-keyword\n *         0 otherwise\n */\nstatic inline int IsFoldingContainer(WordList &keywordslist, char * keyword) {\n    if(\n        strlen(keyword) > 3 &&\n        keyword[0] == 'e' && keyword[1] == 'n' && keyword[2] == 'd') {\n        if (keywordslist.InList(keyword + 3)) {\n            return -1;\n        }\n\n    } else {\n        if(keywordslist.InList(keyword)) {\n            return 1;\n        }\n    }\n\n    return 0;\n}\n\n/**\n * The folding function\n *\n * \\param  startPos Where to start scanning\n * \\param  length Where to scan to\n * \\param  keywordslists The keywordslists, currently, number 5 is used\n * \\param  styler The styler\n */\nstatic void FoldMagikDoc(unsigned int startPos, int length, int,\n    WordList *keywordslists[], Accessor &styler) {\n\n    bool compact = styler.GetPropertyInt(\"fold.compact\") != 0;\n\n    WordList &foldingElements = *keywordslists[5];\n    int endPos = startPos + length;\n    int line = styler.GetLine(startPos);\n    int level = styler.LevelAt(line) & SC_FOLDLEVELNUMBERMASK;\n    int flags = styler.LevelAt(line) & ~SC_FOLDLEVELNUMBERMASK;\n\n    for(\n        int currentPos = startPos;\n        currentPos < endPos;\n        currentPos++) {\n            char currentState = styler.StyleAt(currentPos);\n            char c = styler.SafeGetCharAt(currentPos, ' ');\n            int prevLine = styler.GetLine(currentPos - 1);\n            line = styler.GetLine(currentPos);\n\n            // Default situation\n            if(prevLine < line) {\n                styler.SetLevel(line, (level|flags) & ~SC_FOLDLEVELHEADERFLAG);\n                flags = styler.LevelAt(line) & ~SC_FOLDLEVELNUMBERMASK;\n            }\n\n            if(\n                (\n                    currentState == SCE_MAGIK_CONTAINER ||\n                    currentState == SCE_MAGIK_FLOW\n                ) &&\n                c == '_') {\n\n                char keyword[50];\n                memset(keyword, '\\0', 50);\n\n                for(\n                    int scanPosition = 0;\n                    scanPosition < 50;\n                    scanPosition++) {\n                    char keywordChar = static_cast<char>(\n                        tolower(styler.SafeGetCharAt(\n                            scanPosition +\n                                currentPos + 1, ' ')));\n                    if(IsAlpha(keywordChar)) {\n                        keyword[scanPosition] = keywordChar;\n                    } else {\n                        break;\n                    }\n                }\n\n                if(IsFoldingContainer(foldingElements, keyword) > 0) {\n                    styler.SetLevel(\n                        line,\n                        styler.LevelAt(line) | SC_FOLDLEVELHEADERFLAG);\n                    level++;\n                } else if(IsFoldingContainer(foldingElements, keyword) < 0) {\n                    styler.SetLevel(line, styler.LevelAt(line));\n                    level--;\n                }\n            }\n\n            if(\n                compact && (\n                    currentState == SCE_MAGIK_BRACE_BLOCK ||\n                    currentState == SCE_MAGIK_BRACKET_BLOCK ||\n                    currentState == SCE_MAGIK_SQBRACKET_BLOCK)) {\n                if(c == '{' || c == '[' || c == '(') {\n                    styler.SetLevel(\n                        line,\n                        styler.LevelAt(line) | SC_FOLDLEVELHEADERFLAG);\n                    level++;\n                } else if(c == '}' || c == ']' || c == ')') {\n                    styler.SetLevel(line, styler.LevelAt(line));\n                    level--;\n                }\n            }\n        }\n\n}\n\n/**\n * Injecting the module\n */\nLexerModule lmMagikSF(\n    SCLEX_MAGIK, ColouriseMagikDoc, \"magiksf\", FoldMagikDoc, magikWordListDesc);\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexMarkdown.cpp",
    "content": "/******************************************************************\n *  LexMarkdown.cxx\n *\n *  A simple Markdown lexer for scintilla.\n *\n *  Includes highlighting for some extra features from the\n *  Pandoc implementation; strikeout, using '#.' as a default\n *  ordered list item marker, and delimited code blocks.\n *\n *  Limitations:\n *\n *  Standard indented code blocks are not highlighted at all,\n *  as it would conflict with other indentation schemes. Use\n *  delimited code blocks for blanket highlighting of an\n *  entire code block.  Embedded HTML is not highlighted either.\n *  Blanket HTML highlighting has issues, because some Markdown\n *  implementations allow Markdown markup inside of the HTML. Also,\n *  there is a following blank line issue that can't be ignored,\n *  explained in the next paragraph. Embedded HTML and code\n *  blocks would be better supported with language specific\n *  highlighting.\n *\n *  The highlighting aims to accurately reflect correct syntax,\n *  but a few restrictions are relaxed. Delimited code blocks are\n *  highlighted, even if the line following the code block is not blank.\n *  Requiring a blank line after a block, breaks the highlighting\n *  in certain cases, because of the way Scintilla ends up calling\n *  the lexer.\n *\n *  Written by Jon Strait - jstrait@moonloop.net\n *\n *  The License.txt file describes the conditions under which this\n *  software may be distributed.\n *\n *****************************************************************/\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsNewline(const int ch) {\n    return (ch == '\\n' || ch == '\\r');\n}\n\n// True if can follow ch down to the end with possibly trailing whitespace\nstatic bool FollowToLineEnd(const int ch, const int state, const unsigned int endPos, StyleContext &sc) {\n    unsigned int i = 0;\n    while (sc.GetRelative(++i) == ch)\n        ;\n    // Skip over whitespace\n    while (IsASpaceOrTab(sc.GetRelative(i)) && sc.currentPos + i < endPos)\n        ++i;\n    if (IsNewline(sc.GetRelative(i)) || sc.currentPos + i == endPos) {\n        sc.Forward(i);\n        sc.ChangeState(state);\n        sc.SetState(SCE_MARKDOWN_LINE_BEGIN);\n        return true;\n    }\n    else return false;\n}\n\n// Set the state on text section from current to length characters,\n// then set the rest until the newline to default, except for any characters matching token\nstatic void SetStateAndZoom(const int state, const int length, const int token, StyleContext &sc) {\n    sc.SetState(state);\n    sc.Forward(length);\n    sc.SetState(SCE_MARKDOWN_DEFAULT);\n    sc.Forward();\n    bool started = false;\n    while (sc.More() && !IsNewline(sc.ch)) {\n        if (sc.ch == token && !started) {\n            sc.SetState(state);\n            started = true;\n        }\n        else if (sc.ch != token) {\n            sc.SetState(SCE_MARKDOWN_DEFAULT);\n            started = false;\n        }\n        sc.Forward();\n    }\n    sc.SetState(SCE_MARKDOWN_LINE_BEGIN);\n}\n\n// Does the previous line have more than spaces and tabs?\nstatic bool HasPrevLineContent(StyleContext &sc) {\n    int i = 0;\n    // Go back to the previous newline\n    while ((--i + (int)sc.currentPos) >= 0 && !IsNewline(sc.GetRelative(i)))\n        ;\n    while ((--i + (int)sc.currentPos) >= 0) {\n        if (IsNewline(sc.GetRelative(i)))\n            break;\n        if (!IsASpaceOrTab(sc.GetRelative(i)))\n            return true;\n    }\n    return false;\n}\n\nstatic bool AtTermStart(StyleContext &sc) {\n    return sc.currentPos == 0 || isspacechar(sc.chPrev);\n}\n\nstatic bool IsValidHrule(const unsigned int endPos, StyleContext &sc) {\n    int c, count = 1;\n    unsigned int i = 0;\n    while (++i) {\n        c = sc.GetRelative(i);\n        if (c == sc.ch)\n            ++count;\n        // hit a terminating character\n        else if (!IsASpaceOrTab(c) || sc.currentPos + i == endPos) {\n            // Are we a valid HRULE\n            if ((IsNewline(c) || sc.currentPos + i == endPos) &&\n                    count >= 3 && !HasPrevLineContent(sc)) {\n                sc.SetState(SCE_MARKDOWN_HRULE);\n                sc.Forward(i);\n                sc.SetState(SCE_MARKDOWN_LINE_BEGIN);\n                return true;\n            }\n            else {\n                sc.SetState(SCE_MARKDOWN_DEFAULT);\n\t\treturn false;\n            }\n        }\n    }\n    return false;\n}\n\nstatic void ColorizeMarkdownDoc(unsigned int startPos, int length, int initStyle,\n                               WordList **, Accessor &styler) {\n    unsigned int endPos = startPos + length;\n    int precharCount = 0;\n    // Don't advance on a new loop iteration and retry at the same position.\n    // Useful in the corner case of having to start at the beginning file position\n    // in the default state.\n    bool freezeCursor = false;\n\n    StyleContext sc(startPos, length, initStyle, styler);\n\n    while (sc.More()) {\n        // Skip past escaped characters\n        if (sc.ch == '\\\\') {\n            sc.Forward();\n            continue;\n        }\n\n        // A blockquotes resets the line semantics\n        if (sc.state == SCE_MARKDOWN_BLOCKQUOTE)\n            sc.SetState(SCE_MARKDOWN_LINE_BEGIN);\n\n        // Conditional state-based actions\n        if (sc.state == SCE_MARKDOWN_CODE2) {\n            if (sc.Match(\"``\") && sc.GetRelative(-2) != ' ') {\n                sc.Forward(2);\n                sc.SetState(SCE_MARKDOWN_DEFAULT);\n            }\n        }\n        else if (sc.state == SCE_MARKDOWN_CODE) {\n            if (sc.ch == '`' && sc.chPrev != ' ')\n                sc.ForwardSetState(SCE_MARKDOWN_DEFAULT);\n        }\n        /* De-activated because it gets in the way of other valid indentation\n         * schemes, for example multiple paragraphs inside a list item.\n        // Code block\n        else if (sc.state == SCE_MARKDOWN_CODEBK) {\n            bool d = true;\n            if (IsNewline(sc.ch)) {\n                if (sc.chNext != '\\t') {\n                    for (int c = 1; c < 5; ++c) {\n                        if (sc.GetRelative(c) != ' ')\n                            d = false;\n                    }\n                }\n            }\n            else if (sc.atLineStart) {\n                if (sc.ch != '\\t' ) {\n                    for (int i = 0; i < 4; ++i) {\n                        if (sc.GetRelative(i) != ' ')\n                            d = false;\n                    }\n                }\n            }\n            if (!d)\n                sc.SetState(SCE_MARKDOWN_LINE_BEGIN);\n        }\n        */\n        // Strong\n        else if (sc.state == SCE_MARKDOWN_STRONG1) {\n            if (sc.Match(\"**\") && sc.chPrev != ' ') {\n                sc.Forward(2);\n                sc.SetState(SCE_MARKDOWN_DEFAULT);\n            }\n        }\n        else if (sc.state == SCE_MARKDOWN_STRONG2) {\n            if (sc.Match(\"__\") && sc.chPrev != ' ') {\n                sc.Forward(2);\n                sc.SetState(SCE_MARKDOWN_DEFAULT);\n            }\n        }\n        // Emphasis\n        else if (sc.state == SCE_MARKDOWN_EM1) {\n            if (sc.ch == '*' && sc.chPrev != ' ')\n                sc.ForwardSetState(SCE_MARKDOWN_DEFAULT);\n        }\n        else if (sc.state == SCE_MARKDOWN_EM2) {\n            if (sc.ch == '_' && sc.chPrev != ' ')\n                sc.ForwardSetState(SCE_MARKDOWN_DEFAULT);\n        }\n        else if (sc.state == SCE_MARKDOWN_CODEBK) {\n            if (sc.atLineStart && sc.Match(\"~~~\")) {\n                int i = 1;\n                while (!IsNewline(sc.GetRelative(i)) && sc.currentPos + i < endPos)\n                    i++;\n                sc.Forward(i);\n                sc.SetState(SCE_MARKDOWN_DEFAULT);\n            }\n        }\n        else if (sc.state == SCE_MARKDOWN_STRIKEOUT) {\n            if (sc.Match(\"~~\") && sc.chPrev != ' ') {\n                sc.Forward(2);\n                sc.SetState(SCE_MARKDOWN_DEFAULT);\n            }\n        }\n        else if (sc.state == SCE_MARKDOWN_LINE_BEGIN) {\n            // Header\n            if (sc.Match(\"######\"))\n                SetStateAndZoom(SCE_MARKDOWN_HEADER6, 6, '#', sc);\n            else if (sc.Match(\"#####\"))\n                SetStateAndZoom(SCE_MARKDOWN_HEADER5, 5, '#', sc);\n            else if (sc.Match(\"####\"))\n                SetStateAndZoom(SCE_MARKDOWN_HEADER4, 4, '#', sc);\n            else if (sc.Match(\"###\"))\n                SetStateAndZoom(SCE_MARKDOWN_HEADER3, 3, '#', sc);\n            else if (sc.Match(\"##\"))\n                SetStateAndZoom(SCE_MARKDOWN_HEADER2, 2, '#', sc);\n            else if (sc.Match(\"#\")) {\n                // Catch the special case of an unordered list\n                if (sc.chNext == '.' && IsASpaceOrTab(sc.GetRelative(2))) {\n                    precharCount = 0;\n                    sc.SetState(SCE_MARKDOWN_PRECHAR);\n                }\n                else\n                    SetStateAndZoom(SCE_MARKDOWN_HEADER1, 1, '#', sc);\n            }\n            // Code block\n            else if (sc.Match(\"~~~\")) {\n                if (!HasPrevLineContent(sc))\n                    sc.SetState(SCE_MARKDOWN_CODEBK);\n                else\n                    sc.SetState(SCE_MARKDOWN_DEFAULT);\n            }\n            else if (sc.ch == '=') {\n                if (HasPrevLineContent(sc) && FollowToLineEnd('=', SCE_MARKDOWN_HEADER1, endPos, sc))\n                    ;\n                else\n                    sc.SetState(SCE_MARKDOWN_DEFAULT);\n            }\n            else if (sc.ch == '-') {\n                if (HasPrevLineContent(sc) && FollowToLineEnd('-', SCE_MARKDOWN_HEADER2, endPos, sc))\n                    ;\n                else {\n                    precharCount = 0;\n                    sc.SetState(SCE_MARKDOWN_PRECHAR);\n                }\n            }\n            else if (IsNewline(sc.ch))\n                sc.SetState(SCE_MARKDOWN_LINE_BEGIN);\n            else {\n                precharCount = 0;\n                sc.SetState(SCE_MARKDOWN_PRECHAR);\n            }\n        }\n\n        // The header lasts until the newline\n        else if (sc.state == SCE_MARKDOWN_HEADER1 || sc.state == SCE_MARKDOWN_HEADER2 ||\n                sc.state == SCE_MARKDOWN_HEADER3 || sc.state == SCE_MARKDOWN_HEADER4 ||\n                sc.state == SCE_MARKDOWN_HEADER5 || sc.state == SCE_MARKDOWN_HEADER6) {\n            if (IsNewline(sc.ch))\n                sc.SetState(SCE_MARKDOWN_LINE_BEGIN);\n        }\n\n        // New state only within the initial whitespace\n        if (sc.state == SCE_MARKDOWN_PRECHAR) {\n            // Blockquote\n            if (sc.ch == '>' && precharCount < 5)\n                sc.SetState(SCE_MARKDOWN_BLOCKQUOTE);\n            /*\n            // Begin of code block\n            else if (!HasPrevLineContent(sc) && (sc.chPrev == '\\t' || precharCount >= 4))\n                sc.SetState(SCE_MARKDOWN_CODEBK);\n            */\n            // HRule - Total of three or more hyphens, asterisks, or underscores\n            // on a line by themselves\n            else if ((sc.ch == '-' || sc.ch == '*' || sc.ch == '_') && IsValidHrule(endPos, sc))\n                ;\n            // Unordered list\n            else if ((sc.ch == '-' || sc.ch == '*' || sc.ch == '+') && IsASpaceOrTab(sc.chNext)) {\n                sc.SetState(SCE_MARKDOWN_ULIST_ITEM);\n                sc.ForwardSetState(SCE_MARKDOWN_DEFAULT);\n            }\n            // Ordered list\n            else if (IsADigit(sc.ch)) {\n                int digitCount = 0;\n                while (IsADigit(sc.GetRelative(++digitCount)))\n                    ;\n                if (sc.GetRelative(digitCount) == '.' &&\n                        IsASpaceOrTab(sc.GetRelative(digitCount + 1))) {\n                    sc.SetState(SCE_MARKDOWN_OLIST_ITEM);\n                    sc.Forward(digitCount + 1);\n                    sc.SetState(SCE_MARKDOWN_DEFAULT);\n                }\n            }\n            // Alternate Ordered list\n            else if (sc.ch == '#' && sc.chNext == '.' && IsASpaceOrTab(sc.GetRelative(2))) {\n                sc.SetState(SCE_MARKDOWN_OLIST_ITEM);\n                sc.Forward(2);\n                sc.SetState(SCE_MARKDOWN_DEFAULT);\n            }\n            else if (sc.ch != ' ' || precharCount > 2)\n                sc.SetState(SCE_MARKDOWN_DEFAULT);\n            else\n                ++precharCount;\n        }\n\n        // New state anywhere in doc\n        if (sc.state == SCE_MARKDOWN_DEFAULT) {\n            if (sc.atLineStart && sc.ch == '#') {\n                sc.SetState(SCE_MARKDOWN_LINE_BEGIN);\n                freezeCursor = true;\n            }\n            // Links and Images\n            if (sc.Match(\"![\") || sc.ch == '[') {\n                int i = 0, j = 0, k = 0;\n                int len = endPos - sc.currentPos;\n                while (i < len && (sc.GetRelative(++i) != ']' || sc.GetRelative(i - 1) == '\\\\'))\n                    ;\n                if (sc.GetRelative(i) == ']') {\n                    j = i;\n                    if (sc.GetRelative(++i) == '(') {\n                        while (i < len && (sc.GetRelative(++i) != ')' || sc.GetRelative(i - 1) == '\\\\'))\n                            ;\n                        if (sc.GetRelative(i) == ')')\n                            k = i;\n                    }\n                    else if (sc.GetRelative(i) == '[' || sc.GetRelative(++i) == '[') {\n                        while (i < len && (sc.GetRelative(++i) != ']' || sc.GetRelative(i - 1) == '\\\\'))\n                            ;\n                        if (sc.GetRelative(i) == ']')\n                            k = i;\n                    }\n                }\n                // At least a link text\n                if (j) {\n                    sc.SetState(SCE_MARKDOWN_LINK);\n                    sc.Forward(j);\n                    // Also has a URL or reference portion\n                    if (k)\n                        sc.Forward(k - j);\n                    sc.ForwardSetState(SCE_MARKDOWN_DEFAULT);\n                }\n            }\n            // Code - also a special case for alternate inside spacing\n            if (sc.Match(\"``\") && sc.GetRelative(3) != ' ' && AtTermStart(sc)) {\n                sc.SetState(SCE_MARKDOWN_CODE2);\n                sc.Forward();\n            }\n            else if (sc.ch == '`' && sc.chNext != ' ' && AtTermStart(sc)) {\n                sc.SetState(SCE_MARKDOWN_CODE);\n            }\n            // Strong\n            else if (sc.Match(\"**\") && sc.GetRelative(2) != ' ' && AtTermStart(sc)) {\n                sc.SetState(SCE_MARKDOWN_STRONG1);\n                sc.Forward();\n           }\n            else if (sc.Match(\"__\") && sc.GetRelative(2) != ' ' && AtTermStart(sc)) {\n                sc.SetState(SCE_MARKDOWN_STRONG2);\n                sc.Forward();\n            }\n            // Emphasis\n            else if (sc.ch == '*' && sc.chNext != ' ' && AtTermStart(sc)) {\n                sc.SetState(SCE_MARKDOWN_EM1);\n            }\n            else if (sc.ch == '_' && sc.chNext != ' ' && AtTermStart(sc)) {\n                sc.SetState(SCE_MARKDOWN_EM2);\n            }\n            // Strikeout\n            else if (sc.Match(\"~~\") && sc.GetRelative(2) != ' ' && AtTermStart(sc)) {\n                sc.SetState(SCE_MARKDOWN_STRIKEOUT);\n                sc.Forward();\n            }\n            // Beginning of line\n            else if (IsNewline(sc.ch)) {\n                sc.SetState(SCE_MARKDOWN_LINE_BEGIN);\n            }\n        }\n        // Advance if not holding back the cursor for this iteration.\n        if (!freezeCursor)\n            sc.Forward();\n        freezeCursor = false;\n    }\n    sc.Complete();\n}\n\nLexerModule lmMarkdown(SCLEX_MARKDOWN, ColorizeMarkdownDoc, \"markdown\");\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexMatlab.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexMatlab.cxx\n ** Lexer for Matlab.\n ** Written by Jos Fonseca\n **\n ** Changes by Christoph Dalitz 2003/12/04:\n **   - added support for Octave\n **   - Strings can now be included both in single or double quotes\n **\n ** Changes by John Donoghue 2012/04/02\n **   - added block comment (and nested block comments)\n **   - added ... displayed as a comment\n **   - removed unused IsAWord functions\n **   - added some comments\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic bool IsMatlabCommentChar(int c) {\n\treturn (c == '%') ;\n}\n\nstatic bool IsOctaveCommentChar(int c) {\n\treturn (c == '%' || c == '#') ;\n}\n\nstatic bool IsMatlabComment(Accessor &styler, int pos, int len) {\n\treturn len > 0 && IsMatlabCommentChar(styler[pos]) ;\n}\n\nstatic bool IsOctaveComment(Accessor &styler, int pos, int len) {\n\treturn len > 0 && IsOctaveCommentChar(styler[pos]) ;\n}\n\nstatic void ColouriseMatlabOctaveDoc(\n            unsigned int startPos, int length, int initStyle,\n            WordList *keywordlists[], Accessor &styler,\n            bool (*IsCommentChar)(int)) {\n\n\tWordList &keywords = *keywordlists[0];\n\n\tstyler.StartAt(startPos);\n\n\t// boolean for when the ' is allowed to be transpose vs the start/end \n\t// of a string\n\tbool transpose = false;\n\n\t// approximate position of first non space character in a line\n\tint nonSpaceColumn = -1;\n\t// approximate column position of the current character in a line\n\tint column = 0;\n\n        // use the line state of each line to store the block comment depth\n\tint curLine = styler.GetLine(startPos);\n        int commentDepth = curLine > 0 ? styler.GetLineState(curLine-1) : 0;\n\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward(), column++) {\n\n               \tif(sc.atLineStart) {\n\t\t\t// set the line state to the current commentDepth \n\t\t\tcurLine = styler.GetLine(sc.currentPos);\n                        styler.SetLineState(curLine, commentDepth);\n\n\t\t\t// reset the column to 0, nonSpace to -1 (not set)\n\t\t\tcolumn = 0;\n\t\t\tnonSpaceColumn = -1; \n\t\t}\n\n\t\t// save the column position of first non space character in a line\n\t\tif((nonSpaceColumn == -1) && (! IsASpace(sc.ch)))\n\t\t{\n\t\t\tnonSpaceColumn = column;\n\t\t}\n\n\t\t// check for end of states\n\t\tif (sc.state == SCE_MATLAB_OPERATOR) {\n\t\t\tif (sc.chPrev == '.') {\n\t\t\t\tif (sc.ch == '*' || sc.ch == '/' || sc.ch == '\\\\' || sc.ch == '^') {\n\t\t\t\t\tsc.ForwardSetState(SCE_MATLAB_DEFAULT);\n\t\t\t\t\ttranspose = false;\n\t\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\t\tsc.ForwardSetState(SCE_MATLAB_DEFAULT);\n\t\t\t\t\ttranspose = true;\n                                } else if(sc.ch == '.' && sc.chNext == '.') {\n                                        // we werent an operator, but a '...' \n                                        sc.ChangeState(SCE_MATLAB_COMMENT);\n                                        transpose = false;\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_MATLAB_DEFAULT);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsc.SetState(SCE_MATLAB_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_MATLAB_KEYWORD) {\n\t\t\tif (!isalnum(sc.ch) && sc.ch != '_') {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\tsc.SetState(SCE_MATLAB_DEFAULT);\n\t\t\t\t\ttranspose = false;\n\t\t\t\t} else {\n\t\t\t\t\tsc.ChangeState(SCE_MATLAB_IDENTIFIER);\n\t\t\t\t\tsc.SetState(SCE_MATLAB_DEFAULT);\n\t\t\t\t\ttranspose = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (sc.state == SCE_MATLAB_NUMBER) {\n\t\t\tif (!isdigit(sc.ch) && sc.ch != '.'\n\t\t\t        && !(sc.ch == 'e' || sc.ch == 'E')\n\t\t\t        && !((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E'))) {\n\t\t\t\tsc.SetState(SCE_MATLAB_DEFAULT);\n\t\t\t\ttranspose = true;\n\t\t\t}\n\t\t} else if (sc.state == SCE_MATLAB_STRING) {\n\t\t\tif (sc.ch == '\\'') {\n\t\t\t\tif (sc.chNext == '\\'') {\n \t\t\t\t\tsc.Forward();\n\t\t\t\t} else {\n\t\t\t\t\tsc.ForwardSetState(SCE_MATLAB_DEFAULT);\n \t\t\t\t}\n\t\t\t}\n\t\t} else if (sc.state == SCE_MATLAB_DOUBLEQUOTESTRING) {\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_MATLAB_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_MATLAB_COMMAND) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_MATLAB_DEFAULT);\n\t\t\t\ttranspose = false;\n\t\t\t}\n\t\t} else if (sc.state == SCE_MATLAB_COMMENT) {\n\t\t\t// end or start of a nested a block comment?\n\t\t\tif( IsCommentChar(sc.ch) && sc.chNext == '}' && nonSpaceColumn == column) {\n                           \tif(commentDepth > 0) commentDepth --;\n \n\t\t\t\tcurLine = styler.GetLine(sc.currentPos);\n\t\t\t\tstyler.SetLineState(curLine, commentDepth);\n\t\t\t\tsc.Forward();\n\n\t\t\t\tif (commentDepth == 0) {\n\t\t\t\t\tsc.ForwardSetState(SCE_D_DEFAULT);\n\t\t\t\t\ttranspose = false;\n\t\t\t\t}\n                        }\n                        else if( IsCommentChar(sc.ch) && sc.chNext == '{' && nonSpaceColumn == column)\n                        {\n \t\t\t\tcommentDepth ++;\n\n\t\t\t\tcurLine = styler.GetLine(sc.currentPos);\n\t\t\t\tstyler.SetLineState(curLine, commentDepth);\n\t\t\t\tsc.Forward();\n\t\t\t\ttranspose = false;\n\n                        } else if(commentDepth == 0) {\n\t\t\t\t// single line comment\n\t\t\t\tif (sc.atLineEnd || sc.ch == '\\r' || sc.ch == '\\n') {\n\t\t\t\t\tsc.SetState(SCE_MATLAB_DEFAULT);\n\t\t\t\t\ttranspose = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// check start of a new state\n\t\tif (sc.state == SCE_MATLAB_DEFAULT) {\n\t\t\tif (IsCommentChar(sc.ch)) {\n\t\t\t\t// ncrement depth if we are a block comment\n\t\t\t\tif(sc.chNext == '{' && nonSpaceColumn == column)\n\t\t\t\t\tcommentDepth ++;\n\t\t\t\tcurLine = styler.GetLine(sc.currentPos);\n\t\t\t\tstyler.SetLineState(curLine, commentDepth);\n\t\t\t\tsc.SetState(SCE_MATLAB_COMMENT);\n\t\t\t} else if (sc.ch == '!' && sc.chNext != '=' ) {\n\t\t\t\tsc.SetState(SCE_MATLAB_COMMAND);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tif (transpose) {\n\t\t\t\t\tsc.SetState(SCE_MATLAB_OPERATOR);\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_MATLAB_STRING);\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '\"') {\n\t\t\t\tsc.SetState(SCE_MATLAB_DOUBLEQUOTESTRING);\n\t\t\t} else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_MATLAB_NUMBER);\n\t\t\t} else if (isalpha(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_MATLAB_KEYWORD);\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch)) || sc.ch == '@' || sc.ch == '\\\\') {\n\t\t\t\tif (sc.ch == ')' || sc.ch == ']') {\n\t\t\t\t\ttranspose = true;\n\t\t\t\t} else {\n\t\t\t\t\ttranspose = false;\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_MATLAB_OPERATOR);\n\t\t\t} else {\n\t\t\t\ttranspose = false;\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n}\n\nstatic void ColouriseMatlabDoc(unsigned int startPos, int length, int initStyle,\n                               WordList *keywordlists[], Accessor &styler) {\n\tColouriseMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsMatlabCommentChar);\n}\n\nstatic void ColouriseOctaveDoc(unsigned int startPos, int length, int initStyle,\n                               WordList *keywordlists[], Accessor &styler) {\n\tColouriseMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsOctaveCommentChar);\n}\n\nstatic void FoldMatlabOctaveDoc(unsigned int startPos, int length, int,\n                                WordList *[], Accessor &styler,\n                                bool (*IsComment)(Accessor&, int, int)) {\n\n\tint endPos = startPos + length;\n\n\t// Backtrack to previous line in case need to fix its fold status\n\tint lineCurrent = styler.GetLine(startPos);\n\tif (startPos > 0) {\n\t\tif (lineCurrent > 0) {\n\t\t\tlineCurrent--;\n\t\t\tstartPos = styler.LineStart(lineCurrent);\n\t\t}\n\t}\n\tint spaceFlags = 0;\n\tint indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsComment);\n\tchar chNext = styler[startPos];\n\tfor (int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\n\t\tif ((ch == '\\r' && chNext != '\\n') || (ch == '\\n') || (i == endPos)) {\n\t\t\tint lev = indentCurrent;\n\t\t\tint indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsComment);\n\t\t\tif (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {\n\t\t\t\t// Only non whitespace lines can be headers\n\t\t\t\tif ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {\n\t\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t\t} else if (indentNext & SC_FOLDLEVELWHITEFLAG) {\n\t\t\t\t\t// Line after is blank so check the next - maybe should continue further?\n\t\t\t\t\tint spaceFlags2 = 0;\n\t\t\t\t\tint indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsComment);\n\t\t\t\t\tif ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {\n\t\t\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tindentCurrent = indentNext;\n\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\tlineCurrent++;\n\t\t}\n\t}\n}\n\nstatic void FoldMatlabDoc(unsigned int startPos, int length, int initStyle,\n                          WordList *keywordlists[], Accessor &styler) {\n\tFoldMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsMatlabComment);\n}\n\nstatic void FoldOctaveDoc(unsigned int startPos, int length, int initStyle,\n                          WordList *keywordlists[], Accessor &styler) {\n\tFoldMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsOctaveComment);\n}\n\nstatic const char * const matlabWordListDesc[] = {\n\t\"Keywords\",\n\t0\n};\n\nstatic const char * const octaveWordListDesc[] = {\n\t\"Keywords\",\n\t0\n};\n\nLexerModule lmMatlab(SCLEX_MATLAB, ColouriseMatlabDoc, \"matlab\", FoldMatlabDoc, matlabWordListDesc);\n\nLexerModule lmOctave(SCLEX_OCTAVE, ColouriseOctaveDoc, \"octave\", FoldOctaveDoc, octaveWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexMetapost.cpp",
    "content": "// Scintilla source code edit control\n\n// File: LexMetapost.cxx - general context conformant metapost coloring scheme\n// Author: Hans Hagen - PRAGMA ADE - Hasselt NL - www.pragma-ade.com\n// Version: September 28, 2003\n// Modified by instanton: July 10, 2007\n// Folding based on keywordlists[]\n\n// Copyright: 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n// This lexer is derived from the one written for the texwork environment (1999++) which in\n// turn is inspired on texedit (1991++) which finds its roots in wdt (1986).\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n// val SCE_METAPOST_DEFAULT = 0\n// val SCE_METAPOST_SPECIAL = 1\n// val SCE_METAPOST_GROUP = 2\n// val SCE_METAPOST_SYMBOL = 3\n// val SCE_METAPOST_COMMAND = 4\n// val SCE_METAPOST_TEXT = 5\n\n// Definitions in SciTEGlobal.properties:\n//\n// Metapost Highlighting\n//\n// # Default\n// style.metapost.0=fore:#7F7F00\n// # Special\n// style.metapost.1=fore:#007F7F\n// # Group\n// style.metapost.2=fore:#880000\n// # Symbol\n// style.metapost.3=fore:#7F7F00\n// # Command\n// style.metapost.4=fore:#008800\n// # Text\n// style.metapost.5=fore:#000000\n\n// lexer.tex.comment.process=0\n\n// Auxiliary functions:\n\nstatic inline bool endOfLine(Accessor &styler, unsigned int i) {\n\treturn\n      (styler[i] == '\\n') || ((styler[i] == '\\r') && (styler.SafeGetCharAt(i + 1) != '\\n')) ;\n}\n\nstatic inline bool isMETAPOSTcomment(int ch) {\n\treturn\n      (ch == '%') ;\n}\n\nstatic inline bool isMETAPOSTone(int ch) {\n\treturn\n      (ch == '[') || (ch == ']') || (ch == '(') || (ch == ')') ||\n      (ch == ':') || (ch == '=') || (ch == '<') || (ch == '>') ||\n      (ch == '{') || (ch == '}') || (ch == '\\'') || (ch == '\\\"') ;\n}\n\nstatic inline bool isMETAPOSTtwo(int ch) {\n\treturn\n      (ch == ';') || (ch == '$') || (ch == '@') || (ch == '#');\n}\n\nstatic inline bool isMETAPOSTthree(int ch) {\n\treturn\n      (ch == '.') || (ch == '-') || (ch == '+') || (ch == '/') ||\n      (ch == '*') || (ch == ',') || (ch == '|') || (ch == '`') ||\n      (ch == '!') || (ch == '?') || (ch == '^') || (ch == '&') ||\n      (ch == '%') ;\n}\n\nstatic inline bool isMETAPOSTidentifier(int ch) {\n\treturn\n      ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) ||\n      (ch == '_') ;\n}\n\nstatic inline bool isMETAPOSTnumber(int ch) {\n\treturn\n      (ch >= '0') && (ch <= '9') ;\n}\n\nstatic inline bool isMETAPOSTstring(int ch) {\n\treturn\n      (ch == '\\\"') ;\n}\n\nstatic inline bool isMETAPOSTcolon(int ch) {\n\treturn\n\t\t(ch == ':') ;\n}\n\nstatic inline bool isMETAPOSTequal(int ch) {\n\treturn\n\t\t(ch == '=') ;\n}\n\nstatic int CheckMETAPOSTInterface(\n    unsigned int startPos,\n    int length,\n    Accessor &styler,\n\tint defaultInterface) {\n\n    char lineBuffer[1024] ;\n\tunsigned int linePos = 0 ;\n\n\t// some day we can make something lexer.metapost.mapping=(none,0)(metapost,1)(mp,1)(metafun,2)...\n\n    if (styler.SafeGetCharAt(0) == '%') {\n        for (unsigned int i = 0; i < startPos + length; i++) {\n            lineBuffer[linePos++] = styler.SafeGetCharAt(i) ;\n            if (endOfLine(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {\n                lineBuffer[linePos] = '\\0';\n\t\t\t\tif (strstr(lineBuffer, \"interface=none\")) {\n                    return 0 ;\n\t\t\t\t} else if (strstr(lineBuffer, \"interface=metapost\") || strstr(lineBuffer, \"interface=mp\")) {\n                    return 1 ;\n\t\t\t\t} else if (strstr(lineBuffer, \"interface=metafun\")) {\n                    return 2 ;\n\t\t\t\t} else if (styler.SafeGetCharAt(1) == 'D' && strstr(lineBuffer, \"%D \\\\module\")) {\n\t\t\t\t\t// better would be to limit the search to just one line\n\t\t\t\t\treturn 2 ;\n                } else {\n                    return defaultInterface ;\n                }\n            }\n\t\t}\n    }\n\n    return defaultInterface ;\n}\n\nstatic void ColouriseMETAPOSTDoc(\n    unsigned int startPos,\n    int length,\n    int,\n    WordList *keywordlists[],\n    Accessor &styler) {\n\n\tstyler.StartAt(startPos) ;\n\tstyler.StartSegment(startPos) ;\n\n\tbool processComment   = styler.GetPropertyInt(\"lexer.metapost.comment.process\",   0) == 1 ;\n    int  defaultInterface = styler.GetPropertyInt(\"lexer.metapost.interface.default\", 1) ;\n\n\tint currentInterface = CheckMETAPOSTInterface(startPos,length,styler,defaultInterface) ;\n\n\t// 0  no keyword highlighting\n\t// 1  metapost keyword hightlighting\n\t// 2+ metafun keyword hightlighting\n\n\tint extraInterface = 0 ;\n\n\tif (currentInterface != 0) {\n\t\textraInterface = currentInterface ;\n\t}\n\n\tWordList &keywords  = *keywordlists[0] ;\n\tWordList &keywords2 = *keywordlists[extraInterface-1] ;\n\n\tStyleContext sc(startPos, length, SCE_METAPOST_TEXT, styler) ;\n\n\tchar key[100] ;\n\n    bool inTeX     = false ;\n\tbool inComment = false ;\n\tbool inString  = false ;\n\tbool inClause  = false ;\n\n\tbool going = sc.More() ; // needed because of a fuzzy end of file state\n\n\tfor (; going; sc.Forward()) {\n\n\t\tif (! sc.More()) { going = false ; } // we need to go one behind the end of text\n\n\t\tif (inClause) {\n\t\t\tsc.SetState(SCE_METAPOST_TEXT) ;\n\t\t\tinClause = false ;\n\t\t}\n\n\t\tif (inComment) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_METAPOST_TEXT) ;\n\t\t\t\tinTeX = false ;\n\t\t\t\tinComment = false ;\n\t\t\t\tinClause = false ;\n\t\t\t\tinString = false ; // not correct but we want to stimulate one-lines\n\t\t\t}\n\t\t} else if (inString) {\n\t\t\tif (isMETAPOSTstring(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_METAPOST_SPECIAL) ;\n\t\t\t\tsc.ForwardSetState(SCE_METAPOST_TEXT) ;\n\t\t\t\tinString = false ;\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_METAPOST_TEXT) ;\n\t\t\t\tinTeX = false ;\n\t\t\t\tinComment = false ;\n\t\t\t\tinClause = false ;\n\t\t\t\tinString = false ; // not correct but we want to stimulate one-lines\n\t\t\t}\n\t\t} else {\n\t\t\tif ((! isMETAPOSTidentifier(sc.ch)) && (sc.LengthCurrent() > 0)) {\n\t\t\t\tif (sc.state == SCE_METAPOST_COMMAND) {\n\t\t\t\t\tsc.GetCurrent(key, sizeof(key)) ;\n\t\t\t\t\tif ((strcmp(key,\"btex\") == 0) || (strcmp(key,\"verbatimtex\") == 0)) {\n    \t\t\t\t\tsc.ChangeState(SCE_METAPOST_GROUP) ;\n\t\t\t\t\t\tinTeX = true ;\n\t\t\t\t\t} else if (inTeX) {\n\t\t\t\t\t\tif (strcmp(key,\"etex\") == 0) {\n\t    \t\t\t\t\tsc.ChangeState(SCE_METAPOST_GROUP) ;\n\t\t\t\t\t\t\tinTeX = false ;\n\t\t\t\t\t\t} else {\n\t    \t\t\t\t\tsc.ChangeState(SCE_METAPOST_TEXT) ;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (keywords && keywords.InList(key)) {\n    \t\t\t\t\t\tsc.ChangeState(SCE_METAPOST_COMMAND) ;\n\t\t\t\t\t\t} else if (keywords2 && keywords2.InList(key)) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_METAPOST_EXTRA) ;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_METAPOST_TEXT) ;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isMETAPOSTcomment(sc.ch)) {\n\t\t\t\tif (! inTeX) {\n\t\t\t\t\tsc.SetState(SCE_METAPOST_SYMBOL) ;\n\t\t\t\t\tsc.ForwardSetState(SCE_METAPOST_DEFAULT) ;\n\t\t\t\t\tinComment = ! processComment ;\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_METAPOST_TEXT) ;\n\t\t\t\t}\n\t\t\t} else if (isMETAPOSTstring(sc.ch)) {\n\t\t\t\tif (! inTeX) {\n\t\t\t\t\tsc.SetState(SCE_METAPOST_SPECIAL) ;\n\t\t\t\t\tif (! isMETAPOSTstring(sc.chNext)) {\n\t\t\t\t\t\tsc.ForwardSetState(SCE_METAPOST_TEXT) ;\n\t\t\t\t\t}\n\t\t\t\t\tinString = true ;\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_METAPOST_TEXT) ;\n\t\t\t\t}\n\t\t\t} else if (isMETAPOSTcolon(sc.ch)) {\n\t\t\t\tif (! inTeX) {\n\t\t\t\t\tif (! isMETAPOSTequal(sc.chNext)) {\n\t\t\t\t\t\tsc.SetState(SCE_METAPOST_COMMAND) ;\n\t\t\t\t\t\tinClause = true ;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.SetState(SCE_METAPOST_SPECIAL) ;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_METAPOST_TEXT) ;\n\t\t\t\t}\n\t\t\t} else if (isMETAPOSTone(sc.ch)) {\n\t\t\t\tif (! inTeX) {\n\t\t\t\t\tsc.SetState(SCE_METAPOST_SPECIAL) ;\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_METAPOST_TEXT) ;\n\t\t\t\t}\n\t\t\t} else if (isMETAPOSTtwo(sc.ch)) {\n\t\t\t\tif (! inTeX) {\n\t\t\t\t\tsc.SetState(SCE_METAPOST_GROUP) ;\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_METAPOST_TEXT) ;\n\t\t\t\t}\n\t\t\t} else if (isMETAPOSTthree(sc.ch)) {\n\t\t\t\tif (! inTeX) {\n\t\t\t\t\tsc.SetState(SCE_METAPOST_SYMBOL) ;\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_METAPOST_TEXT) ;\n\t\t\t\t}\n\t\t\t} else if (isMETAPOSTidentifier(sc.ch)) {\n\t\t\t\tif (sc.state != SCE_METAPOST_COMMAND) {\n\t\t\t\t\tsc.SetState(SCE_METAPOST_TEXT) ;\n\t\t\t\t\tsc.ChangeState(SCE_METAPOST_COMMAND) ;\n\t\t\t\t}\n\t\t\t} else if (isMETAPOSTnumber(sc.ch)) {\n\t\t\t\t// rather redundant since for the moment we don't handle numbers\n\t\t\t\tsc.SetState(SCE_METAPOST_TEXT) ;\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_METAPOST_TEXT) ;\n\t\t\t\tinTeX = false ;\n\t\t\t\tinComment = false ;\n\t\t\t\tinClause = false ;\n\t\t\t\tinString = false ;\n\t\t\t} else {\n\t\t\t\tsc.SetState(SCE_METAPOST_TEXT) ;\n\t\t\t}\n\t\t}\n\n\t}\n\n\tsc.Complete();\n\n}\n\n// Hooks info the system:\n\nstatic const char * const metapostWordListDesc[] = {\n\t\"MetaPost\",\n\t\"MetaFun\",\n\t0\n} ;\n\nstatic int classifyFoldPointMetapost(const char* s,WordList *keywordlists[]) {\n\tWordList& keywordsStart=*keywordlists[3];\n\tWordList& keywordsStop1=*keywordlists[4];\n\n\tif (keywordsStart.InList(s)) {return 1;}\n\telse if (keywordsStop1.InList(s)) {return -1;}\n\treturn 0;\n\n}\n\nstatic int ParseMetapostWord(unsigned int pos, Accessor &styler, char *word)\n{\n  int length=0;\n  char ch=styler.SafeGetCharAt(pos);\n  *word=0;\n\n  while(isMETAPOSTidentifier(ch) && isalpha(ch) && length<100){\n          word[length]=ch;\n          length++;\n          ch=styler.SafeGetCharAt(pos+length);\n  }\n  word[length]=0;\n  return length;\n}\n\nstatic void FoldMetapostDoc(unsigned int startPos, int length, int, WordList *keywordlists[], Accessor &styler)\n{\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tunsigned int endPos = startPos+length;\n\tint visibleChars=0;\n\tint lineCurrent=styler.GetLine(startPos);\n\tint levelPrev=styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent=levelPrev;\n\tchar chNext=styler[startPos];\n\n\tchar buffer[100]=\"\";\n\n\tfor (unsigned int i=startPos; i < endPos; i++) {\n\t\tchar ch=chNext;\n\t\tchNext=styler.SafeGetCharAt(i+1);\n\t\tchar chPrev=styler.SafeGetCharAt(i-1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\n\t\tif(i==0 || chPrev == '\\r' || chPrev=='\\n'|| chPrev==' '|| chPrev=='(' || chPrev=='$')\n\t\t{\n            ParseMetapostWord(i, styler, buffer);\n\t\t\tlevelCurrent += classifyFoldPointMetapost(buffer,keywordlists);\n\t\t}\n\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n\n}\n\n\nLexerModule lmMETAPOST(SCLEX_METAPOST, ColouriseMETAPOSTDoc, \"metapost\", FoldMetapostDoc, metapostWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexModula.cpp",
    "content": "//\t-*- coding: utf-8 -*-\n//\tScintilla source code edit control\n/**\n *\t@file LexModula.cxx\n *\t@author Dariusz \"DKnoto\" Knociński\n *\t@date 2011/02/03\n *\t@brief Lexer for Modula-2/3 documents.\n */\n//\tThe License.txt file describes the conditions under which this software may\n//\tbe distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"PropSetSimple.h\"\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n#ifdef DEBUG_LEX_MODULA\n#define DEBUG_STATE( p, c )\\\n\t\tfprintf( stderr, \"Unknown state: currentPos = %d, char = '%c'\\n\", p, c );\n#else\n#define DEBUG_STATE( p, c )\n#endif\n\nstatic inline bool IsDigitOfBase( unsigned ch, unsigned base ) {\n\tif( ch < '0' || ch > 'f' ) return false;\n\tif( base <= 10 ) {\n\t\tif( ch >= ( '0' + base ) ) return false;\n\t} else {\n\t\tif( ch > '9' ) {\n\t\t\tunsigned nb = base - 10;\n\t\t\tif( ( ch < 'A' ) || ( ch >= ( 'A' + nb ) ) ) {\n\t\t\t\tif( ( ch < 'a' ) || ( ch >= ( 'a' + nb ) ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\nstatic inline unsigned IsOperator( StyleContext & sc, WordList & op ) {\n\tint i;\n\tchar s[3];\n\n\ts[0] = sc.ch;\n\ts[1] = sc.chNext;\n\ts[2] = 0;\n\tfor( i = 0; i < op.Length(); i++ ) {\n\t\tif( ( strlen( op.WordAt(i) ) == 2 ) &&\n\t\t\t( s[0] == op.WordAt(i)[0] && s[1] == op.WordAt(i)[1] ) ) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\ts[1] = 0;\n\tfor( i = 0; i < op.Length(); i++ ) {\n\t\tif( ( strlen( op.WordAt(i) ) == 1 ) &&\n\t\t\t( s[0] == op.WordAt(i)[0] ) ) {\n\t\t\treturn 1;\n\t\t}\n\t}\n\treturn 0;\n}\n\nstatic inline bool IsEOL( Accessor &styler, unsigned curPos ) {\n\tunsigned ch = styler.SafeGetCharAt( curPos );\n\tif( ( ch == '\\r' && styler.SafeGetCharAt( curPos + 1 ) == '\\n' ) ||\n\t\t( ch == '\\n' ) ) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nstatic inline bool checkStatement(\n\tAccessor &styler,\n\tint &curPos,\n\tconst char *stt, bool spaceAfter = true ) {\n\tint len = static_cast<int>(strlen( stt ));\n\tint i;\n\tfor( i = 0; i < len; i++ ) {\n\t\tif( styler.SafeGetCharAt( curPos + i ) != stt[i] ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tif( spaceAfter ) {\n\t\tif( ! isspace( styler.SafeGetCharAt( curPos + i ) ) ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tcurPos += ( len - 1 );\n\treturn true;\n}\n\nstatic inline bool checkEndSemicolon(\n\tAccessor &styler,\n\tint &curPos, int endPos )\n{\n\tconst char *stt = \"END\";\n\tint len = static_cast<int>(strlen( stt ));\n\tint i;\n\tfor( i = 0; i < len; i++ ) {\n\t\tif( styler.SafeGetCharAt( curPos + i ) != stt[i] ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\twhile( isspace( styler.SafeGetCharAt( curPos + i ) ) ) {\n\t\ti++;\n\t\tif( ( curPos + i ) >= endPos ) return false;\n\t}\n\tif( styler.SafeGetCharAt( curPos + i ) != ';' ) {\n\t\treturn false;\n\t}\n\tcurPos += ( i - 1 );\n\treturn true;\n}\n\nstatic inline bool checkKeyIdentOper(\n\n\tAccessor &styler,\n\tint &curPos, int endPos,\n\tconst char *stt, const char etk ) {\n\tint newPos = curPos;\n\tif( ! checkStatement( styler, newPos, stt ) )\n\t\treturn false;\n\tnewPos++;\n\tif( newPos >= endPos )\n\t\treturn false;\n\tif( ! isspace( styler.SafeGetCharAt( newPos ) ) )\n\t\treturn false;\n\tnewPos++;\n\tif( newPos >= endPos )\n\t\treturn false;\n\twhile( isspace( styler.SafeGetCharAt( newPos ) ) ) {\n\t\tnewPos++;\n\t\tif( newPos >= endPos )\n\t\t\treturn false;\n\t}\n\tif( ! isalpha( styler.SafeGetCharAt( newPos ) ) )\n\t\treturn false;\n\tnewPos++;\n\tif( newPos >= endPos )\n\t\treturn false;\n\tchar ch;\n\tch = styler.SafeGetCharAt( newPos );\n\twhile( isalpha( ch ) || isdigit( ch ) || ch == '_' ) {\n\t\tnewPos++;\n\t\tif( newPos >= endPos ) return false;\n\t\tch = styler.SafeGetCharAt( newPos );\n\t}\n\twhile( isspace( styler.SafeGetCharAt( newPos ) ) ) {\n\t\tnewPos++;\n\t\tif( newPos >= endPos ) return false;\n\t}\n\tif( styler.SafeGetCharAt( newPos ) != etk )\n\t\treturn false;\n\tcurPos = newPos;\n\treturn true;\n}\n\nstatic void FoldModulaDoc( unsigned int startPos,\n\t\t\t\t\t\t int length,\n\t\t\t\t\t\t int , WordList *[],\n\t\t\t\t\t\t Accessor &styler)\n{\n\tint curLine = styler.GetLine(startPos);\n\tint curLevel = SC_FOLDLEVELBASE;\n\tint endPos = startPos + length;\n\tif( curLine > 0 )\n\t\tcurLevel = styler.LevelAt( curLine - 1 ) >> 16;\n\tint curPos = startPos;\n\tint style = styler.StyleAt( curPos );\n\tint visChars = 0;\n\tint nextLevel = curLevel;\n\n\twhile( curPos < endPos ) {\n\t\tif( ! isspace( styler.SafeGetCharAt( curPos ) ) ) visChars++;\n\n\t\tswitch( style ) {\n\t\tcase SCE_MODULA_COMMENT:\n\t\t\tif( checkStatement( styler, curPos, \"(*\" ) )\n\t\t\t\tnextLevel++;\n\t\t\telse\n\t\t\tif( checkStatement( styler, curPos, \"*)\" ) )\n\t\t\t\tnextLevel--;\n\t\t\tbreak;\n\n\t\tcase SCE_MODULA_DOXYCOMM:\n\t\t\tif( checkStatement( styler, curPos, \"(**\", false ) )\n\t\t\t\tnextLevel++;\n\t\t\telse\n\t\t\tif( checkStatement( styler, curPos, \"*)\" ) )\n\t\t\t\tnextLevel--;\n\t\t\tbreak;\n\n\t\tcase SCE_MODULA_KEYWORD:\n\t\t\tif( checkStatement( styler, curPos, \"IF\" ) )\n\t\t\t\tnextLevel++;\n\t\t\telse\n\t\t\tif( checkStatement( styler, curPos, \"BEGIN\" ) )\n\t\t\t\tnextLevel++;\n\t\t\telse\n\t\t\tif( checkStatement( styler, curPos, \"TRY\" ) )\n\t\t\t\tnextLevel++;\n\t\t\telse\n\t\t\tif( checkStatement( styler, curPos, \"LOOP\" ) )\n\t\t\t\tnextLevel++;\n\t\t\telse\n\t\t\tif( checkStatement( styler, curPos, \"FOR\" ) )\n\t\t\t\tnextLevel++;\n\t\t\telse\n\t\t\tif( checkStatement( styler, curPos, \"WHILE\" ) )\n\t\t\t\tnextLevel++;\n\t\t\telse\n\t\t\tif( checkStatement( styler, curPos, \"REPEAT\" ) )\n\t\t\t\tnextLevel++;\n\t\t\telse\n\t\t\tif( checkStatement( styler, curPos, \"UNTIL\" ) )\n\t\t\t\tnextLevel--;\n\t\t\telse\n\t\t\tif( checkStatement( styler, curPos, \"WITH\" ) )\n\t\t\t\tnextLevel++;\n\t\t\telse\n\t\t\tif( checkStatement( styler, curPos, \"CASE\" ) )\n\t\t\t\tnextLevel++;\n\t\t\telse\n\t\t\tif( checkStatement( styler, curPos, \"TYPECASE\" ) )\n\t\t\t\tnextLevel++;\n\t\t\telse\n\t\t\tif( checkStatement( styler, curPos, \"LOCK\" ) )\n\t\t\t\tnextLevel++;\n\t\t\telse\n\t\t\tif( checkKeyIdentOper( styler, curPos, endPos, \"PROCEDURE\", '(' ) )\n\t\t\t\tnextLevel++;\n\t\t\telse\n\t\t\tif( checkKeyIdentOper( styler, curPos, endPos, \"END\", ';' ) ) {\n\t\t\t\tint cln = curLine;\n\t\t\t\tint clv_old = curLevel;\n\t\t\t\tint pos;\n\t\t\t\tchar ch;\n\t\t\t\tint clv_new;\n\t\t\t\twhile( cln > 0 ) {\n\t\t\t\t\tclv_new = styler.LevelAt( cln - 1 ) >> 16;\n\t\t\t\t\tif( clv_new < clv_old ) {\n\t\t\t\t\t\tnextLevel--;\n\t\t\t\t\t\tpos = styler.LineStart( cln );\n\t\t\t\t\t\twhile( ( ch = styler.SafeGetCharAt( pos ) ) != '\\n' ) {\n\t\t\t\t\t\t\tif( ch == 'P' ) {\n\t\t\t\t\t\t\t\tif( styler.StyleAt(pos) == SCE_MODULA_KEYWORD )\t{\n\t\t\t\t\t\t\t\t\tif( checkKeyIdentOper( styler, pos, endPos,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"PROCEDURE\", '(' ) ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpos++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclv_old = clv_new;\n\t\t\t\t\t}\n\t\t\t\t\tcln--;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\tif( checkKeyIdentOper( styler, curPos, endPos, \"END\", '.' ) )\n\t\t\t\tnextLevel--;\n\t\t\telse\n\t\t\tif( checkEndSemicolon( styler, curPos, endPos ) )\n\t\t\t\tnextLevel--;\n\t\t\telse {\n\t\t\t\twhile( styler.StyleAt( curPos + 1 ) == SCE_MODULA_KEYWORD )\n\t\t\t\t\tcurPos++;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\tif( IsEOL( styler, curPos ) || ( curPos == endPos - 1 ) ) {\n\t\t\tint efectiveLevel = curLevel | nextLevel << 16;\n\t\t\tif( visChars == 0 )\n\t\t\t\tefectiveLevel |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif( curLevel < nextLevel )\n\t\t\t\tefectiveLevel |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif( efectiveLevel != styler.LevelAt(curLine) ) {\n\t\t\t\tstyler.SetLevel(curLine, efectiveLevel );\n\t\t\t}\n\t\t\tcurLine++;\n\t\t\tcurLevel = nextLevel;\n\t\t\tif( IsEOL( styler, curPos ) && ( curPos == endPos - 1 ) ) {\n\t\t\t\tstyler.SetLevel( curLine, ( curLevel | curLevel << 16)\n\t\t\t\t\t\t\t\t| SC_FOLDLEVELWHITEFLAG);\n\t\t\t}\n\t\t\tvisChars = 0;\n\t\t}\n\t\tcurPos++;\n\t\tstyle = styler.StyleAt( curPos );\n\t}\n}\n\nstatic inline bool skipWhiteSpaces( StyleContext & sc ) {\n\twhile( isspace( sc.ch ) ) {\n\t\tsc.SetState( SCE_MODULA_DEFAULT );\n\t\tif( sc.More() )\n\t\t\tsc.Forward();\n\t\telse\n\t\t\treturn false;\n\t}\n\treturn true;\n}\n\nstatic void ColouriseModulaDoc(\tunsigned int startPos,\n\t\t\t\t\t\t\t\t\tint length,\n\t\t\t\t\t\t\t\t\tint initStyle,\n\t\t\t\t\t\t\t\t\tWordList *wl[],\n\t\t\t\t\t\t\t\t\tAccessor &styler ) {\n\tWordList& keyWords\t\t= *wl[0];\n\tWordList& reservedWords\t= *wl[1];\n\tWordList& operators \t= *wl[2];\n\tWordList& pragmaWords \t= *wl[3];\n\tWordList& escapeCodes\t= *wl[4];\n\tWordList& doxyKeys\t\t= *wl[5];\n\n\tconst int BUFLEN = 128;\n\n\tchar\tbuf[BUFLEN];\n\tint\t\ti, kl;\n\n\tint  charPos = 0;\n\n\tStyleContext sc( startPos, length, initStyle, styler );\n\n\twhile( sc.More() ) \t{\n\t\tswitch( sc.state )\t{\n\t\tcase SCE_MODULA_DEFAULT:\n\t\t\tif( ! skipWhiteSpaces( sc ) ) break;\n\n\t\t\tif( sc.ch == '(' && sc.chNext == '*' ) {\n\t\t\t\tif( sc.GetRelative(2) == '*' ) {\n\t\t\t\t\tsc.SetState( SCE_MODULA_DOXYCOMM );\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState( SCE_MODULA_COMMENT );\n\t\t\t\t}\n\t\t\t\tsc.Forward();\n\t\t\t}\n\t\t\telse\n\t\t\tif( isalpha( sc.ch ) ) {\n\t\t\t\tif( isupper( sc.ch ) && isupper( sc.chNext ) ) {\n\t\t\t\t\tfor( i = 0; i < BUFLEN - 1; i++ ) {\n\t\t\t\t\t\tbuf[i] = sc.GetRelative(i);\n\t\t\t\t\t\tif( !isalpha( buf[i] ) && !(buf[i] == '_') )\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tkl = i;\n\t\t\t\t\tbuf[kl] = 0;\n\n\t\t\t\t\tif( keyWords.InList( buf ) ) {\n\t\t\t\t\t\tsc.SetState( SCE_MODULA_KEYWORD );\n\t\t\t\t\t\tsc.Forward( kl );\n\t\t\t\t\t\tsc.SetState( SCE_MODULA_DEFAULT );\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\tif( reservedWords.InList( buf ) ) {\n\t\t\t\t\t\tsc.SetState( SCE_MODULA_RESERVED );\n\t\t\t\t\t\tsc.Forward( kl );\n\t\t\t\t\t\tsc.SetState( SCE_MODULA_DEFAULT );\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t/** check procedure identifier */\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor( i = 0; i < BUFLEN - 1; i++ ) {\n\t\t\t\t\t\tbuf[i] = sc.GetRelative(i);\n\t\t\t\t\t\tif( !isalpha( buf[i] ) &&\n\t\t\t\t\t\t\t!isdigit( buf[i] ) &&\n\t\t\t\t\t\t\t!(buf[i] == '_') )\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tkl = i;\n\t\t\t\t\tbuf[kl] = 0;\n\n\t\t\t\t\tsc.SetState( SCE_MODULA_DEFAULT );\n\t\t\t\t\tsc.Forward( kl );\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\tif( isdigit( sc.ch ) ) {\n\t\t\t\tsc.SetState( SCE_MODULA_NUMBER );\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse\n\t\t\tif( sc.ch == '\\\"' ) {\n\t\t\t\tsc.SetState( SCE_MODULA_STRING );\n\t\t\t}\n\t\t\telse\n\t\t\tif( sc.ch == '\\'' ) {\n\t\t\t\tcharPos = sc.currentPos;\n\t\t\t\tsc.SetState( SCE_MODULA_CHAR );\n\t\t\t}\n\t\t\telse\n\t\t\tif( sc.ch == '<' && sc.chNext == '*' ) {\n\t\t\t\tsc.SetState( SCE_MODULA_PRAGMA );\n\t\t\t\tsc.Forward();\n\t\t\t} else {\n\t\t\t\tunsigned len = IsOperator( sc, operators );\n\t\t\t\tif( len > 0 ) {\n\t\t\t\t\tsc.SetState( SCE_MODULA_OPERATOR );\n\t\t\t\t\tsc.Forward( len );\n\t\t\t\t\tsc.SetState( SCE_MODULA_DEFAULT );\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\tDEBUG_STATE( sc.currentPos, sc.ch );\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase SCE_MODULA_COMMENT:\n\t\t\tif( sc.ch == '*' && sc.chNext == ')' ) {\n\t\t\t\tsc.Forward( 2 );\n\t\t\t\tsc.SetState( SCE_MODULA_DEFAULT );\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase SCE_MODULA_DOXYCOMM:\n\t\t\tswitch( sc.ch ) {\n\t\t\tcase '*':\n\t\t\t\tif( sc.chNext == ')' ) {\n\t\t\t\t\tsc.Forward( 2 );\n\t\t\t\t\tsc.SetState( SCE_MODULA_DEFAULT );\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase '@':\n\t\t\t\tif( islower( sc.chNext ) ) {\n\t\t\t\t\tfor( i = 0; i < BUFLEN - 1; i++ ) {\n\t\t\t\t\t\tbuf[i] = sc.GetRelative(i+1);\n\t\t\t\t\t\tif( isspace( buf[i] ) ) break;\n\t\t\t\t\t}\n\t\t\t\t\tbuf[i] = 0;\n\t\t\t\t\tkl = i;\n\n\t\t\t\t\tif( doxyKeys.InList( buf ) ) {\n\t\t\t\t\t\tsc.SetState( SCE_MODULA_DOXYKEY );\n\t\t\t\t\t\tsc.Forward( kl + 1 );\n\t\t\t\t\t\tsc.SetState( SCE_MODULA_DOXYCOMM );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase SCE_MODULA_NUMBER:\n\t\t\t{\n\t\t\t\tbuf[0] = sc.ch;\n\t\t\t\tfor( i = 1; i < BUFLEN - 1; i++ ) {\n\t\t\t\t\tbuf[i] = sc.GetRelative(i);\n\t\t\t\t\tif( ! isdigit( buf[i] ) )\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tkl = i;\n\t\t\t\tbuf[kl] = 0;\n\n\t\t\t\tswitch( sc.GetRelative(kl) ) {\n\t\t\t\tcase '_':\n\t\t\t\t\t{\n\t\t\t\t\t\tint base = atoi( buf );\n\t\t\t\t\t\tif( base < 2 || base > 16 ) {\n\t\t\t\t\t\t\tsc.SetState( SCE_MODULA_BADSTR );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tint imax;\n\n\t\t\t\t\t\t\tkl++;\n\t\t\t\t\t\t\tfor( i = 0; i < BUFLEN - 1; i++ ) {\n\t\t\t\t\t\t\t\tbuf[i] = sc.GetRelative(kl+i);\n\t\t\t\t\t\t\t\tif( ! IsDigitOfBase( buf[i], 16 ) ) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\timax = i;\n\t\t\t\t\t\t\tfor( i = 0; i < imax; i++ ) {\n\t\t\t\t\t\t\t\tif( ! IsDigitOfBase( buf[i], base ) ) {\n\t\t\t\t\t\t\t\t\tsc.SetState( SCE_MODULA_BADSTR );\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tkl += imax;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsc.SetState( SCE_MODULA_BASENUM );\n\t\t\t\t\t\tfor( i = 0; i < kl; i++ ) {\n\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsc.SetState( SCE_MODULA_DEFAULT );\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase '.':\n\t\t\t\t\tif( sc.GetRelative(kl+1) == '.' ) {\n\t\t\t\t\t\tkl--;\n\t\t\t\t\t\tfor( i = 0; i < kl; i++ ) {\n\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\tsc.SetState( SCE_MODULA_DEFAULT );\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbool doNext = false;\n\n\t\t\t\t\t\tkl++;\n\n\t\t\t\t\t\tbuf[0] = sc.GetRelative(kl);\n\t\t\t\t\t\tif( isdigit( buf[0] ) ) {\n\t\t\t\t\t\t\tfor( i = 0;; i++ ) {\n\t\t\t\t\t\t\t\tif( !isdigit(sc.GetRelative(kl+i)) )\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tkl += i;\n\t\t\t\t\t\t\tbuf[0] = sc.GetRelative(kl);\n\n\t\t\t\t\t\t\tswitch( buf[0] )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase 'E':\n\t\t\t\t\t\t\tcase 'e':\n\t\t\t\t\t\t\tcase 'D':\n\t\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\tcase 'X':\n\t\t\t\t\t\t\tcase 'x':\n\t\t\t\t\t\t\t\tkl++;\n\t\t\t\t\t\t\t\tbuf[0] = sc.GetRelative(kl);\n\t\t\t\t\t\t\t\tif( buf[0] == '-' || buf[0] == '+' ) {\n\t\t\t\t\t\t\t\t\tkl++;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbuf[0] = sc.GetRelative(kl);\n\t\t\t\t\t\t\t\tif( isdigit( buf[0] ) ) {\n\t\t\t\t\t\t\t\t\tfor( i = 0;; i++ ) {\n\t\t\t\t\t\t\t\t\t\tif( !isdigit(sc.GetRelative(kl+i)) ) {\n\t\t\t\t\t\t\t\t\t\t\tbuf[0] = sc.GetRelative(kl+i);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tkl += i;\n\t\t\t\t\t\t\t\t\tdoNext = true;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tsc.SetState( SCE_MODULA_BADSTR );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tdoNext = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.SetState( SCE_MODULA_BADSTR );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif( doNext ) {\n\t\t\t\t\t\t\tif( ! isspace( buf[0] ) &&\n\t\t\t\t\t\t\t\tbuf[0] != ')' &&\n\t\t\t\t\t\t\t\tbuf[0] != '>' &&\n\t\t\t\t\t\t\t\tbuf[0] != '<' &&\n\t\t\t\t\t\t\t\tbuf[0] != '=' &&\n\t\t\t\t\t\t\t\tbuf[0] != '#' &&\n\t\t\t\t\t\t\t\tbuf[0] != '+' &&\n\t\t\t\t\t\t\t\tbuf[0] != '-' &&\n\t\t\t\t\t\t\t\tbuf[0] != '*' &&\n\t\t\t\t\t\t\t\tbuf[0] != '/' &&\n\t\t\t\t\t\t\t\tbuf[0] != ',' &&\n\t\t\t\t\t\t\t\tbuf[0] != ';'\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tsc.SetState( SCE_MODULA_BADSTR );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tkl--;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState( SCE_MODULA_FLOAT );\n\t\t\t\t\tfor( i = 0; i < kl; i++ ) {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState( SCE_MODULA_DEFAULT );\n\t\t\t\t\tcontinue;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tfor( i = 0; i < kl; i++ ) {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tsc.SetState( SCE_MODULA_DEFAULT );\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase SCE_MODULA_STRING:\n\t\t\tif( sc.ch == '\\\"' ) {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.SetState( SCE_MODULA_DEFAULT );\n\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tif( sc.ch == '\\\\' ) {\n\t\t\t\t\ti = 1;\n\t\t\t\t\tif( IsDigitOfBase( sc.chNext, 8 ) ) {\n\t\t\t\t\t\tfor( i = 1; i < BUFLEN - 1; i++ ) {\n\t\t\t\t\t\t\tif( ! IsDigitOfBase(sc.GetRelative(i+1), 8 ) )\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif( i == 3 ) {\n\t\t\t\t\t\t\tsc.SetState( SCE_MODULA_STRSPEC );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.SetState( SCE_MODULA_BADSTR );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbuf[0] = sc.chNext;\n\t\t\t\t\t\tbuf[1] = 0;\n\n\t\t\t\t\t\tif( escapeCodes.InList( buf ) ) {\n\t\t\t\t\t\t\tsc.SetState( SCE_MODULA_STRSPEC );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.SetState( SCE_MODULA_BADSTR );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsc.Forward(i+1);\n\t\t\t\t\tsc.SetState( SCE_MODULA_STRING );\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase SCE_MODULA_CHAR:\n\t\t\tif( sc.ch == '\\'' ) {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.SetState( SCE_MODULA_DEFAULT );\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse\n\t\t\tif( ( sc.currentPos - charPos ) == 1 ) {\n\t\t\t\tif( sc.ch == '\\\\' ) {\n\t\t\t\t\ti = 1;\n\t\t\t\t\tif( IsDigitOfBase( sc.chNext, 8 ) ) {\n\t\t\t\t\t\tfor( i = 1; i < BUFLEN - 1; i++ ) {\n\t\t\t\t\t\t\tif( ! IsDigitOfBase(sc.GetRelative(i+1), 8 ) )\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif( i == 3 ) {\n\t\t\t\t\t\t\tsc.SetState( SCE_MODULA_CHARSPEC );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.SetState( SCE_MODULA_BADSTR );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbuf[0] = sc.chNext;\n\t\t\t\t\t\tbuf[1] = 0;\n\n\t\t\t\t\t\tif( escapeCodes.InList( buf ) ) {\n\t\t\t\t\t\t\tsc.SetState( SCE_MODULA_CHARSPEC );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.SetState( SCE_MODULA_BADSTR );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsc.Forward(i+1);\n\t\t\t\t\tsc.SetState( SCE_MODULA_CHAR );\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsc.SetState( SCE_MODULA_BADSTR );\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.SetState( SCE_MODULA_CHAR );\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase SCE_MODULA_PRAGMA:\n\t\t\tif( sc.ch == '*' && sc.chNext == '>' ) {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.SetState( SCE_MODULA_DEFAULT );\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse\n\t\t\tif( isupper( sc.ch ) && isupper( sc.chNext ) ) {\n\t\t\t\tbuf[0] = sc.ch;\n\t\t\t\tbuf[1] = sc.chNext;\n\t\t\t\tfor( i = 2; i < BUFLEN - 1; i++ ) {\n\t\t\t\t\tbuf[i] = sc.GetRelative(i);\n\t\t\t\t\tif( !isupper( buf[i] ) )\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tkl = i;\n\t\t\t\tbuf[kl] = 0;\n\t\t\t\tif( pragmaWords.InList( buf ) ) {\n\t\t\t\t\tsc.SetState( SCE_MODULA_PRGKEY );\n\t\t\t\t\tsc.Forward( kl );\n\t\t\t\t\tsc.SetState( SCE_MODULA_PRAGMA );\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tsc.Forward();\n\t}\n\tsc.Complete();\n}\n\nstatic const char *const modulaWordListDesc[] =\n{\n\t\"Keywords\",\n\t\"ReservedKeywords\",\n\t\"Operators\",\n\t\"PragmaKeyswords\",\n\t\"EscapeCodes\",\n\t\"DoxygeneKeywords\",\n\t0\n};\n\nLexerModule lmModula( SCLEX_MODULA, ColouriseModulaDoc, \"modula\", FoldModulaDoc,\n\t\t\t\t\t  modulaWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexMySQL.cpp",
    "content": "/**\n * Scintilla source code edit control\n * @file LexMySQL.cxx\n * Lexer for MySQL\n *\n * Improved by Mike Lischke <mike.lischke@oracle.com>\n * Adopted from LexSQL.cxx by Anders Karlsson <anders@mysql.com>\n * Original work by Neil Hodgson <neilh@scintilla.org>\n * Copyright 1998-2005 by Neil Hodgson <neilh@scintilla.org>\n * The License.txt file describes the conditions under which this software may be distributed.\n */\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_');\n}\n\nstatic inline bool IsAWordStart(int ch) {\n\treturn (ch < 0x80) && (isalpha(ch) || ch == '_');\n}\n\nstatic inline bool IsADoxygenChar(int ch) {\n\treturn (islower(ch) || ch == '$' || ch == '@' ||\n\t        ch == '\\\\' || ch == '&' || ch == '<' ||\n\t        ch == '>' || ch == '#' || ch == '{' ||\n\t        ch == '}' || ch == '[' || ch == ']');\n}\n\nstatic inline bool IsANumberChar(int ch) {\n\t// Not exactly following number definition (several dots are seen as OK, etc.)\n\t// but probably enough in most cases.\n\treturn (ch < 0x80) &&\n\t        (isdigit(ch) || toupper(ch) == 'E' ||\n             ch == '.' || ch == '-' || ch == '+');\n}\n\n//--------------------------------------------------------------------------------------------------\n\n/**\n * Check if the current content context represent a keyword and set the context state if so.\n */\nstatic void CheckForKeyword(StyleContext& sc, WordList* keywordlists[], int activeState)\n{\n  int length = sc.LengthCurrent() + 1; // +1 for the next char\n  char* s = new char[length];\n  sc.GetCurrentLowered(s, length);\n  if (keywordlists[0]->InList(s))\n    sc.ChangeState(SCE_MYSQL_MAJORKEYWORD | activeState);\n  else\n    if (keywordlists[1]->InList(s))\n      sc.ChangeState(SCE_MYSQL_KEYWORD | activeState);\n    else\n      if (keywordlists[2]->InList(s))\n        sc.ChangeState(SCE_MYSQL_DATABASEOBJECT | activeState);\n      else\n        if (keywordlists[3]->InList(s))\n          sc.ChangeState(SCE_MYSQL_FUNCTION | activeState);\n        else\n          if (keywordlists[5]->InList(s))\n            sc.ChangeState(SCE_MYSQL_PROCEDUREKEYWORD | activeState);\n          else\n            if (keywordlists[6]->InList(s))\n              sc.ChangeState(SCE_MYSQL_USER1 | activeState);\n            else\n              if (keywordlists[7]->InList(s))\n                sc.ChangeState(SCE_MYSQL_USER2 | activeState);\n              else\n                if (keywordlists[8]->InList(s))\n                  sc.ChangeState(SCE_MYSQL_USER3 | activeState);\n  delete [] s;\n}\n\n//--------------------------------------------------------------------------------------------------\n\n#define HIDDENCOMMAND_STATE 0x40 // Offset for states within a hidden command.\n#define MASKACTIVE(style) (style & ~HIDDENCOMMAND_STATE)\n\nstatic void SetDefaultState(StyleContext& sc, int activeState)\n{\n  if (activeState == 0)\n    sc.SetState(SCE_MYSQL_DEFAULT);\n  else\n    sc.SetState(SCE_MYSQL_HIDDENCOMMAND);\n}\n\nstatic void ForwardDefaultState(StyleContext& sc, int activeState)\n{\n  if (activeState == 0)\n    sc.ForwardSetState(SCE_MYSQL_DEFAULT);\n  else\n    sc.ForwardSetState(SCE_MYSQL_HIDDENCOMMAND);\n}\n\nstatic void ColouriseMySQLDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                            Accessor &styler)\n{\n\tStyleContext sc(startPos, length, initStyle, styler, 127);\n  int activeState = (initStyle == SCE_MYSQL_HIDDENCOMMAND) ? HIDDENCOMMAND_STATE : initStyle & HIDDENCOMMAND_STATE;\n\n\tfor (; sc.More(); sc.Forward())\n  {\n\t\t// Determine if the current state should terminate.\n\t\tswitch (MASKACTIVE(sc.state))\n    {\n      case SCE_MYSQL_OPERATOR:\n        SetDefaultState(sc, activeState);\n        break;\n      case SCE_MYSQL_NUMBER:\n        // We stop the number definition on non-numerical non-dot non-eE non-sign char.\n        if (!IsANumberChar(sc.ch))\n          SetDefaultState(sc, activeState);\n        break;\n      case SCE_MYSQL_IDENTIFIER:\n        // Switch from identifier to keyword state and open a new state for the new char.\n        if (!IsAWordChar(sc.ch))\n        {\n          CheckForKeyword(sc, keywordlists, activeState);\n\n          // Additional check for function keywords needed.\n          // A function name must be followed by an opening parenthesis.\n          if (MASKACTIVE(sc.state) == SCE_MYSQL_FUNCTION && sc.ch != '(')\n          {\n            if (activeState > 0)\n              sc.ChangeState(SCE_MYSQL_HIDDENCOMMAND);\n            else\n              sc.ChangeState(SCE_MYSQL_DEFAULT);\n          }\n\n          SetDefaultState(sc, activeState);\n        }\n        break;\n      case SCE_MYSQL_VARIABLE:\n        if (!IsAWordChar(sc.ch))\n          SetDefaultState(sc, activeState);\n        break;\n      case SCE_MYSQL_SYSTEMVARIABLE:\n        if (!IsAWordChar(sc.ch))\n        {\n          int length = sc.LengthCurrent() + 1;\n          char* s = new char[length];\n          sc.GetCurrentLowered(s, length);\n\n          // Check for known system variables here.\n          if (keywordlists[4]->InList(&s[2]))\n            sc.ChangeState(SCE_MYSQL_KNOWNSYSTEMVARIABLE | activeState);\n          delete [] s;\n\n          SetDefaultState(sc, activeState);\n        }\n        break;\n      case SCE_MYSQL_QUOTEDIDENTIFIER:\n        if (sc.ch == '`')\n        {\n          if (sc.chNext == '`')\n            sc.Forward();\t// Ignore it\n          else\n            ForwardDefaultState(sc, activeState);\n\t\t\t\t}\n  \t\t\tbreak;\n      case SCE_MYSQL_COMMENT:\n        if (sc.Match('*', '/'))\n        {\n          sc.Forward();\n          ForwardDefaultState(sc, activeState);\n        }\n        break;\n      case SCE_MYSQL_COMMENTLINE:\n        if (sc.atLineStart)\n          SetDefaultState(sc, activeState);\n        break;\n      case SCE_MYSQL_SQSTRING:\n        if (sc.ch == '\\\\')\n          sc.Forward(); // Escape sequence\n        else\n          if (sc.ch == '\\'')\n          {\n            // End of single quoted string reached?\n            if (sc.chNext == '\\'')\n              sc.Forward();\n            else\n              ForwardDefaultState(sc, activeState);\n          }\n        break;\n      case SCE_MYSQL_DQSTRING:\n        if (sc.ch == '\\\\')\n          sc.Forward(); // Escape sequence\n        else\n          if (sc.ch == '\\\"')\n          {\n            // End of single quoted string reached?\n            if (sc.chNext == '\\\"')\n              sc.Forward();\n            else\n              ForwardDefaultState(sc, activeState);\n          }\n        break;\n      case SCE_MYSQL_PLACEHOLDER:\n        if (sc.Match('}', '>'))\n        {\n          sc.Forward();\n          ForwardDefaultState(sc, activeState);\n        }\n        break;\n    }\n\n    if (sc.state == SCE_MYSQL_HIDDENCOMMAND && sc.Match('*', '/'))\n    {\n      activeState = 0;\n      sc.Forward();\n      ForwardDefaultState(sc, activeState);\n    }\n\n    // Determine if a new state should be entered.\n    if (sc.state == SCE_MYSQL_DEFAULT || sc.state == SCE_MYSQL_HIDDENCOMMAND)\n    {\n      switch (sc.ch)\n      {\n        case '@':\n          if (sc.chNext == '@')\n          {\n            sc.SetState(SCE_MYSQL_SYSTEMVARIABLE | activeState);\n            sc.Forward(2); // Skip past @@.\n          }\n          else\n            if (IsAWordStart(sc.ch))\n            {\n              sc.SetState(SCE_MYSQL_VARIABLE | activeState);\n              sc.Forward(); // Skip past @.\n            }\n            else\n              sc.SetState(SCE_MYSQL_OPERATOR | activeState);\n          break;\n        case '`':\n          sc.SetState(SCE_MYSQL_QUOTEDIDENTIFIER | activeState);\n          break;\n        case '#':\n          sc.SetState(SCE_MYSQL_COMMENTLINE | activeState);\n          break;\n        case '\\'':\n          sc.SetState(SCE_MYSQL_SQSTRING | activeState);\n          break;\n        case '\\\"':\n          sc.SetState(SCE_MYSQL_DQSTRING | activeState);\n          break;\n        default:\n          if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext)))\n            sc.SetState(SCE_MYSQL_NUMBER | activeState);\n          else\n            if (IsAWordStart(sc.ch))\n              sc.SetState(SCE_MYSQL_IDENTIFIER | activeState);\n            else\n              if (sc.Match('/', '*'))\n              {\n                sc.SetState(SCE_MYSQL_COMMENT | activeState);\n\n                // Skip comment introducer and check for hidden command.\n                sc.Forward(2);\n                if (sc.ch == '!')\n                {\n                  activeState = HIDDENCOMMAND_STATE;\n                  sc.ChangeState(SCE_MYSQL_HIDDENCOMMAND);\n                }\n              }\n              else if (sc.Match('<', '{'))\n              {\n                sc.SetState(SCE_MYSQL_PLACEHOLDER | activeState);\n              }\n              else\n                if (sc.Match(\"--\"))\n                {\n                  // Special MySQL single line comment.\n                  sc.SetState(SCE_MYSQL_COMMENTLINE | activeState);\n                  sc.Forward(2);\n\n                  // Check the third character too. It must be a space or EOL.\n                  if (sc.ch != ' ' && sc.ch != '\\n' && sc.ch != '\\r')\n                    sc.ChangeState(SCE_MYSQL_OPERATOR | activeState);\n                }\n                else\n                  if (isoperator(static_cast<char>(sc.ch)))\n                    sc.SetState(SCE_MYSQL_OPERATOR | activeState);\n      }\n    }\n  }\n\n  // Do a final check for keywords if we currently have an identifier, to highlight them\n  // also at the end of a line.\n  if (sc.state == SCE_MYSQL_IDENTIFIER)\n  {\n    CheckForKeyword(sc, keywordlists, activeState);\n\n    // Additional check for function keywords needed.\n    // A function name must be followed by an opening parenthesis.\n    if (sc.state == SCE_MYSQL_FUNCTION && sc.ch != '(')\n      SetDefaultState(sc, activeState);\n  }\n\n  sc.Complete();\n}\n\n//--------------------------------------------------------------------------------------------------\n\n/**\n * Helper function to determine if we have a foldable comment currently.\n */\nstatic bool IsStreamCommentStyle(int style)\n{\n\treturn MASKACTIVE(style) == SCE_MYSQL_COMMENT;\n}\n\n//--------------------------------------------------------------------------------------------------\n\n/**\n * Code copied from StyleContext and modified to work here. Should go into Accessor as a\n * companion to Match()...\n */\nbool MatchIgnoreCase(Accessor &styler, int currentPos, const char *s)\n{\n  for (int n = 0; *s; n++)\n  {\n    if (*s != tolower(styler.SafeGetCharAt(currentPos + n)))\n      return false;\n    s++;\n  }\n  return true;\n}\n\n//--------------------------------------------------------------------------------------------------\n\n// Store both the current line's fold level and the next lines in the\n// level store to make it easy to pick up with each increment.\nstatic void FoldMySQLDoc(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler)\n{\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tbool foldOnlyBegin = styler.GetPropertyInt(\"fold.sql.only.begin\", 0) != 0;\n\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelCurrent = SC_FOLDLEVELBASE;\n\tif (lineCurrent > 0)\n\t\tlevelCurrent = styler.LevelAt(lineCurrent - 1) >> 16;\n\tint levelNext = levelCurrent;\n\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n  int activeState = (style == SCE_MYSQL_HIDDENCOMMAND) ? HIDDENCOMMAND_STATE : style & HIDDENCOMMAND_STATE;\n\t\n  bool endPending = false;\n\tbool whenPending = false;\n\tbool elseIfPending = false;\n\n  char nextChar = styler.SafeGetCharAt(startPos);\n  for (unsigned int i = startPos; length > 0; i++, length--)\n  {\n\t\tint stylePrev = style;\n    int lastActiveState = activeState;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n    activeState = (style == SCE_MYSQL_HIDDENCOMMAND) ? HIDDENCOMMAND_STATE : style & HIDDENCOMMAND_STATE;\n    \n    char currentChar = nextChar;\n    nextChar = styler.SafeGetCharAt(i + 1);\n\t\tbool atEOL = (currentChar == '\\r' && nextChar != '\\n') || (currentChar == '\\n');\n\t\n    switch (MASKACTIVE(style))\n    {\n      case SCE_MYSQL_COMMENT:\n        if (foldComment)\n        {\n          // Multiline comment style /* .. */ just started or is still in progress.\n          if (IsStreamCommentStyle(style) && !IsStreamCommentStyle(stylePrev))\n            levelNext++;\n        }\n        break;\n      case SCE_MYSQL_COMMENTLINE:\n        if (foldComment)\n        { \n          // Not really a standard, but we add support for single line comments\n          // with special curly braces syntax as foldable comments too.\n          // MySQL needs -- comments to be followed by space or control char\n          if (styler.Match(i, \"--\"))\n          {\n            char chNext2 = styler.SafeGetCharAt(i + 2);\n            char chNext3 = styler.SafeGetCharAt(i + 3);\n            if (chNext2 == '{' || chNext3 == '{')\n              levelNext++;\n            else\n              if (chNext2 == '}' || chNext3 == '}')\n                levelNext--;\n          }\n        }\n        break;\n      case SCE_MYSQL_HIDDENCOMMAND:\n        /*\n        if (endPending)\n        {\n          // A conditional command is not a white space so it should end the current block\n          // before opening a new one.\n          endPending = false;\n          levelNext--;\n          if (levelNext < SC_FOLDLEVELBASE)\n            levelNext = SC_FOLDLEVELBASE;\n        }\n        }*/\n        if (activeState != lastActiveState)\n          levelNext++;\n        break;\n      case SCE_MYSQL_OPERATOR:\n        if (endPending)\n        {\n          endPending = false;\n          levelNext--;\n          if (levelNext < SC_FOLDLEVELBASE)\n            levelNext = SC_FOLDLEVELBASE;\n        }\n        if (currentChar == '(')\n          levelNext++;\n        else\n          if (currentChar == ')')\n          {\n            levelNext--;\n            if (levelNext < SC_FOLDLEVELBASE)\n              levelNext = SC_FOLDLEVELBASE;\n          }\n        break;\n      case SCE_MYSQL_MAJORKEYWORD:\n      case SCE_MYSQL_KEYWORD:\n      case SCE_MYSQL_FUNCTION:\n      case SCE_MYSQL_PROCEDUREKEYWORD:\n        // Reserved and other keywords.\n        if (style != stylePrev)\n        {\n          // END decreases the folding level, regardless which keyword follows.\n          bool endFound = MatchIgnoreCase(styler, i, \"end\");\n          if (endPending)\n          {\n            levelNext--;\n            if (levelNext < SC_FOLDLEVELBASE)\n              levelNext = SC_FOLDLEVELBASE;\n          }\n          else\n            if (!endFound)\n            {\n              if (MatchIgnoreCase(styler, i, \"begin\"))\n                levelNext++;\n              else\n              {\n                if (!foldOnlyBegin)\n                {\n                  bool whileFound = MatchIgnoreCase(styler, i, \"while\");\n                  bool loopFound = MatchIgnoreCase(styler, i, \"loop\");\n                  bool repeatFound = MatchIgnoreCase(styler, i, \"repeat\");\n                  bool caseFound = MatchIgnoreCase(styler, i, \"case\");\n\n                  if (whileFound || loopFound || repeatFound || caseFound)\n                    levelNext++;\n                  else\n                  {\n                    // IF alone does not increase the fold level as it is also used in non-block'ed\n                    // code like DROP PROCEDURE blah IF EXISTS.\n                    // Instead THEN opens the new level (if not part of an ELSEIF or WHEN (case) branch).\n                    if (MatchIgnoreCase(styler, i, \"then\"))\n                    {\n                      if (!elseIfPending && !whenPending)\n                        levelNext++;\n                      else\n                      {\n                        elseIfPending = false;\n                        whenPending = false;\n                      }\n                    }\n                    else\n                    {\n                      // Neither of if/then/while/loop/repeat/case, so check for\n                      // sub parts of IF and CASE.\n                      if (MatchIgnoreCase(styler, i, \"elseif\"))\n                        elseIfPending = true;\n                      if (MatchIgnoreCase(styler, i, \"when\"))\n                        whenPending = true;\n                    }\n                  }\n                }\n              }\n            }\n          \n          // Keep the current end state for the next round.\n          endPending = endFound;\n        }\n        break;\n        \n      default:\n        if (!isspacechar(currentChar) && endPending)\n        {\n          // END followed by a non-whitespace character (not covered by other cases like identifiers)\n          // also should end a folding block. Typical case: END followed by self defined delimiter.\n          levelNext--;\n          if (levelNext < SC_FOLDLEVELBASE)\n            levelNext = SC_FOLDLEVELBASE;\n        }\n        break;\n    }\n\n    // Go up one level if we just ended a multi line comment.\n    if (IsStreamCommentStyle(stylePrev) && !IsStreamCommentStyle(style))\n    {\n      levelNext--;\n      if (levelNext < SC_FOLDLEVELBASE)\n        levelNext = SC_FOLDLEVELBASE;\n    }\n\n    if (activeState == 0 && lastActiveState != 0)\n    {\n      // Decrease fold level when we left a hidden command.\n      levelNext--;\n      if (levelNext < SC_FOLDLEVELBASE)\n        levelNext = SC_FOLDLEVELBASE;\n    }\n\n    if (atEOL)\n    {\n      // Apply the new folding level to this line.\n      // Leave pending states as they are otherwise a line break will de-sync\n      // code folding and valid syntax.\n      int levelUse = levelCurrent;\n      int lev = levelUse | levelNext << 16;\n      if (visibleChars == 0 && foldCompact)\n        lev |= SC_FOLDLEVELWHITEFLAG;\n      if (levelUse < levelNext)\n        lev |= SC_FOLDLEVELHEADERFLAG;\n      if (lev != styler.LevelAt(lineCurrent))\n        styler.SetLevel(lineCurrent, lev);\n      \n      lineCurrent++;\n      levelCurrent = levelNext;\n      visibleChars = 0;\n    }\n\n\t\tif (!isspacechar(currentChar))\n      visibleChars++;\n  }\n}\n\n//--------------------------------------------------------------------------------------------------\n\nstatic const char * const mysqlWordListDesc[] = {\n\t\"Major Keywords\",\n\t\"Keywords\",\n\t\"Database Objects\",\n\t\"Functions\",\n\t\"System Variables\",\n\t\"Procedure keywords\",\n\t\"User Keywords 1\",\n\t\"User Keywords 2\",\n\t\"User Keywords 3\",\n\t0\n};\n\nLexerModule lmMySQL(SCLEX_MYSQL, ColouriseMySQLDoc, \"mysql\", FoldMySQLDoc, mysqlWordListDesc, 7);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexNimrod.cpp",
    "content": "// Scintilla source code edit control\n// Nimrod lexer\n// (c) 2009 Andreas Rumpf\n/** @file LexNimrod.cxx\n ** Lexer for Nimrod.\n **/\n// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(int ch) {\n\treturn (ch >= 0x80) || isalnum(ch) || ch == '_';\n}\n\nstatic int tillEndOfTripleQuote(Accessor &styler, int pos, int max) {\n  /* search for \"\"\" */\n  for (;;) {\n    if (styler.SafeGetCharAt(pos, '\\0') == '\\0') return pos;\n    if (pos >= max) return pos;\n    if (styler.Match(pos, \"\\\"\\\"\\\"\")) {\n      return pos + 2;\n    }\n    pos++;\n  }\n}\n\n#define CR 13 /* use both because Scite allows changing the line ending */\n#define LF 10\n\nstatic bool inline isNewLine(int ch) {\n  return ch == CR || ch == LF;\n}\n\nstatic int scanString(Accessor &styler, int pos, int max, bool rawMode) {\n  for (;;) {\n    if (pos >= max) return pos;\n    char ch = styler.SafeGetCharAt(pos, '\\0');\n    if (ch == CR || ch == LF || ch == '\\0') return pos;\n    if (ch == '\"') return pos;\n    if (ch == '\\\\' && !rawMode) {\n      pos += 2;\n    } else {\n      pos++;\n    }\n  }\n}\n\nstatic int scanChar(Accessor &styler, int pos, int max) {\n  for (;;) {\n    if (pos >= max) return pos;\n    char ch = styler.SafeGetCharAt(pos, '\\0');\n    if (ch == CR || ch == LF || ch == '\\0') return pos;\n    if (ch == '\\'' && !isalnum(styler.SafeGetCharAt(pos+1, '\\0')) )\n      return pos;\n    if (ch == '\\\\') {\n      pos += 2;\n    } else {\n      pos++;\n    }\n  }\n}\n\nstatic int scanIdent(Accessor &styler, int pos, WordList &keywords) {\n  char buf[100]; /* copy to lowercase and ignore underscores */\n  int i = 0;\n\n  for (;;) {\n    char ch = styler.SafeGetCharAt(pos, '\\0');\n    if (!IsAWordChar(ch)) break;\n    if (ch != '_' && i < ((int)sizeof(buf))-1) {\n      buf[i] = static_cast<char>(tolower(ch));\n      i++;\n    }\n    pos++;\n  }\n  buf[i] = '\\0';\n  /* look for keyword */\n  if (keywords.InList(buf)) {\n    styler.ColourTo(pos-1, SCE_P_WORD);\n  } else {\n    styler.ColourTo(pos-1, SCE_P_IDENTIFIER);\n  }\n  return pos;\n}\n\nstatic int scanNumber(Accessor &styler, int pos) {\n  char ch, ch2;\n  ch = styler.SafeGetCharAt(pos, '\\0');\n  ch2 = styler.SafeGetCharAt(pos+1, '\\0');\n  if (ch == '0' && (ch2 == 'b' || ch2 == 'B')) {\n    /* binary number: */\n    pos += 2;\n    for (;;) {\n      ch = styler.SafeGetCharAt(pos, '\\0');\n      if (ch == '_' || (ch >= '0' && ch <= '1')) ++pos;\n      else break;\n    }\n  } else if (ch == '0' &&\n            (ch2 == 'o' || ch2 == 'O' || ch2 == 'c' || ch2 == 'C')) {\n    /* octal number: */\n    pos += 2;\n    for (;;) {\n      ch = styler.SafeGetCharAt(pos, '\\0');\n      if (ch == '_' || (ch >= '0' && ch <= '7')) ++pos;\n      else break;\n    }\n  } else if (ch == '0' && (ch2 == 'x' || ch2 == 'X')) {\n    /* hexadecimal number: */\n    pos += 2;\n    for (;;) {\n      ch = styler.SafeGetCharAt(pos, '\\0');\n      if (ch == '_' || (ch >= '0' && ch <= '9')\n          || (ch >= 'a' && ch <= 'f')\n          || (ch >= 'A' && ch <= 'F')) ++pos;\n      else break;\n    }\n  } else {\n    // skip decimal part:\n    for (;;) {\n      ch = styler.SafeGetCharAt(pos, '\\0');\n      if (ch == '_' || (ch >= '0' && ch <= '9')) ++pos;\n      else break;\n    }\n    ch2 = styler.SafeGetCharAt(pos+1, '\\0');\n    if (ch == '.' && ch2 >= '0' && ch2 <= '9') {\n      ++pos; // skip '.'\n      for (;;) {\n        ch = styler.SafeGetCharAt(pos, '\\0');\n        if (ch == '_' || (ch >= '0' && ch <= '9')) ++pos;\n        else break;\n      }\n    }\n    if (ch == 'e' || ch == 'E') {\n      ++pos;\n      ch = styler.SafeGetCharAt(pos, '\\0');\n      if (ch == '-' || ch == '+') ++pos;\n      for (;;) {\n        ch = styler.SafeGetCharAt(pos, '\\0');\n        if (ch == '_' || (ch >= '0' && ch <= '9')) ++pos;\n        else break;\n      }\n    }\n  }\n  if (ch == '\\'') {\n    /* a type suffix: */\n    pos++;\n    for (;;) {\n      ch = styler.SafeGetCharAt(pos);\n      if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z')\n         || (ch >= 'a' && ch <= 'z') || ch == '_') ++pos;\n      else break;\n    }\n  }\n  styler.ColourTo(pos-1, SCE_P_NUMBER);\n  return pos;\n}\n\n/* rewritten from scratch, because I couldn't get rid of the bugs...\n   (A character based approach sucks!)\n*/\nstatic void ColouriseNimrodDoc(unsigned int startPos, int length, int initStyle,\n                                WordList *keywordlists[], Accessor &styler) {\n  int pos = startPos;\n  int max = startPos + length;\n  char ch;\n  WordList &keywords = *keywordlists[0];\n\n  styler.StartAt(startPos);\n  styler.StartSegment(startPos);\n\n  switch (initStyle) {\n    /* check where we are: */\n    case SCE_P_TRIPLEDOUBLE:\n      pos = tillEndOfTripleQuote(styler, pos, max);\n      styler.ColourTo(pos, SCE_P_TRIPLEDOUBLE);\n      pos++;\n    break;\n    default: /* nothing to do: */\n    break;\n  }\n  while (pos < max) {\n    ch = styler.SafeGetCharAt(pos, '\\0');\n    switch (ch) {\n      case '\\0': return;\n      case '#': {\n        bool doccomment = (styler.SafeGetCharAt(pos+1) == '#');\n        while (pos < max && !isNewLine(styler.SafeGetCharAt(pos, LF))) pos++;\n        if (doccomment)\n          styler.ColourTo(pos, SCE_C_COMMENTLINEDOC);\n        else\n          styler.ColourTo(pos, SCE_P_COMMENTLINE);\n      } break;\n      case 'r': case 'R': {\n        if (styler.SafeGetCharAt(pos+1) == '\"') {\n          pos = scanString(styler, pos+2, max, true);\n          styler.ColourTo(pos, SCE_P_STRING);\n          pos++;\n        } else {\n          pos = scanIdent(styler, pos, keywords);\n        }\n      } break;\n      case '\"':\n        if (styler.Match(pos+1, \"\\\"\\\"\")) {\n          pos = tillEndOfTripleQuote(styler, pos+3, max);\n          styler.ColourTo(pos, SCE_P_TRIPLEDOUBLE);\n        } else {\n          pos = scanString(styler, pos+1, max, false);\n          styler.ColourTo(pos, SCE_P_STRING);\n        }\n        pos++;\n      break;\n      case '\\'':\n        pos = scanChar(styler, pos+1, max);\n        styler.ColourTo(pos, SCE_P_CHARACTER);\n        pos++;\n      break;\n      default: // identifers, numbers, operators, whitespace\n        if (ch >= '0' && ch <= '9') {\n          pos = scanNumber(styler, pos);\n        } else if (IsAWordChar(ch)) {\n          pos = scanIdent(styler, pos, keywords);\n        } else if (ch == '`') {\n          pos++;\n          while (pos < max) {\n            ch = styler.SafeGetCharAt(pos, LF);\n            if (ch == '`') {\n              ++pos;\n              break;\n            }\n            if (ch == CR || ch == LF) break;\n            ++pos;\n          }\n          styler.ColourTo(pos, SCE_P_IDENTIFIER);\n        } else if (strchr(\"()[]{}:=;-\\\\/&%$!+<>|^?,.*~@\", ch)) {\n          styler.ColourTo(pos, SCE_P_OPERATOR);\n          pos++;\n        } else {\n          styler.ColourTo(pos, SCE_P_DEFAULT);\n          pos++;\n        }\n      break;\n    }\n  }\n}\n\nstatic bool IsCommentLine(int line, Accessor &styler) {\n\tint pos = styler.LineStart(line);\n\tint eol_pos = styler.LineStart(line + 1) - 1;\n\tfor (int i = pos; i < eol_pos; i++) {\n\t\tchar ch = styler[i];\n\t\tif (ch == '#')\n\t\t\treturn true;\n\t\telse if (ch != ' ' && ch != '\\t')\n\t\t\treturn false;\n\t}\n\treturn false;\n}\n\nstatic bool IsQuoteLine(int line, Accessor &styler) {\n\tint style = styler.StyleAt(styler.LineStart(line)) & 31;\n\treturn ((style == SCE_P_TRIPLE) || (style == SCE_P_TRIPLEDOUBLE));\n}\n\n\nstatic void FoldNimrodDoc(unsigned int startPos, int length,\n                          int /*initStyle - unused*/,\n                          WordList *[], Accessor &styler) {\n\tconst int maxPos = startPos + length;\n\tconst int maxLines = styler.GetLine(maxPos - 1); // Requested last line\n\tconst int docLines = styler.GetLine(styler.Length() - 1); // Available last line\n\tconst bool foldComment = styler.GetPropertyInt(\"fold.comment.nimrod\") != 0;\n\tconst bool foldQuotes = styler.GetPropertyInt(\"fold.quotes.nimrod\") != 0;\n\n\t// Backtrack to previous non-blank line so we can determine indent level\n\t// for any white space lines (needed esp. within triple quoted strings)\n\t// and so we can fix any preceding fold level (which is why we go back\n\t// at least one line in all cases)\n\tint spaceFlags = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);\n\twhile (lineCurrent > 0) {\n\t\tlineCurrent--;\n\t\tindentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);\n\t\tif (!(indentCurrent & SC_FOLDLEVELWHITEFLAG) &&\n\t\t        (!IsCommentLine(lineCurrent, styler)) &&\n\t\t        (!IsQuoteLine(lineCurrent, styler)))\n\t\t\tbreak;\n\t}\n\tint indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;\n\n\t// Set up initial loop state\n\tstartPos = styler.LineStart(lineCurrent);\n\tint prev_state = SCE_P_DEFAULT & 31;\n\tif (lineCurrent >= 1)\n\t\tprev_state = styler.StyleAt(startPos - 1) & 31;\n\tint prevQuote = foldQuotes && ((prev_state == SCE_P_TRIPLE) ||\n\t                               (prev_state == SCE_P_TRIPLEDOUBLE));\n\tint prevComment = 0;\n\tif (lineCurrent >= 1)\n\t\tprevComment = foldComment && IsCommentLine(lineCurrent - 1, styler);\n\n\t// Process all characters to end of requested range or end of any triple quote\n\t// or comment that hangs over the end of the range.  Cap processing in all cases\n\t// to end of document (in case of unclosed quote or comment at end).\n\twhile ((lineCurrent <= docLines) && ((lineCurrent <= maxLines) ||\n\t                                      prevQuote || prevComment)) {\n\n\t\t// Gather info\n\t\tint lev = indentCurrent;\n\t\tint lineNext = lineCurrent + 1;\n\t\tint indentNext = indentCurrent;\n\t\tint quote = false;\n\t\tif (lineNext <= docLines) {\n\t\t\t// Information about next line is only available if not at end of document\n\t\t\tindentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);\n\t\t\tint style = styler.StyleAt(styler.LineStart(lineNext)) & 31;\n\t\t\tquote = foldQuotes && ((style == SCE_P_TRIPLE) || (style == SCE_P_TRIPLEDOUBLE));\n\t\t}\n\t\tconst int quote_start = (quote && !prevQuote);\n\t\tconst int quote_continue = (quote && prevQuote);\n\t\tconst int comment = foldComment && IsCommentLine(lineCurrent, styler);\n\t\tconst int comment_start = (comment && !prevComment && (lineNext <= docLines) &&\n\t\t                           IsCommentLine(lineNext, styler) &&\n\t\t                           (lev > SC_FOLDLEVELBASE));\n\t\tconst int comment_continue = (comment && prevComment);\n\t\tif ((!quote || !prevQuote) && !comment)\n\t\t\tindentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;\n\t\tif (quote)\n\t\t\tindentNext = indentCurrentLevel;\n\t\tif (indentNext & SC_FOLDLEVELWHITEFLAG)\n\t\t\tindentNext = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel;\n\n\t\tif (quote_start) {\n\t\t\t// Place fold point at start of triple quoted string\n\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t} else if (quote_continue || prevQuote) {\n\t\t\t// Add level to rest of lines in the string\n\t\t\tlev = lev + 1;\n\t\t} else if (comment_start) {\n\t\t\t// Place fold point at start of a block of comments\n\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t} else if (comment_continue) {\n\t\t\t// Add level to rest of lines in the block\n\t\t\tlev = lev + 1;\n\t\t}\n\n\t\t// Skip past any blank lines for next indent level info; we skip also\n\t\t// comments (all comments, not just those starting in column 0)\n\t\t// which effectively folds them into surrounding code rather\n\t\t// than screwing up folding.\n\n\t\twhile (!quote &&\n\t\t        (lineNext < docLines) &&\n\t\t        ((indentNext & SC_FOLDLEVELWHITEFLAG) ||\n\t\t         (lineNext <= docLines && IsCommentLine(lineNext, styler)))) {\n\n\t\t\tlineNext++;\n\t\t\tindentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);\n\t\t}\n\n\t\tconst int levelAfterComments = indentNext & SC_FOLDLEVELNUMBERMASK;\n\t\tconst int levelBeforeComments =\n\t\t    Maximum(indentCurrentLevel,levelAfterComments);\n\n\t\t// Now set all the indent levels on the lines we skipped\n\t\t// Do this from end to start.  Once we encounter one line\n\t\t// which is indented more than the line after the end of\n\t\t// the comment-block, use the level of the block before\n\n\t\tint skipLine = lineNext;\n\t\tint skipLevel = levelAfterComments;\n\n\t\twhile (--skipLine > lineCurrent) {\n\t\t\tint skipLineIndent = styler.IndentAmount(skipLine, &spaceFlags, NULL);\n\n\t\t\tif ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > levelAfterComments)\n\t\t\t\tskipLevel = levelBeforeComments;\n\n\t\t\tint whiteFlag = skipLineIndent & SC_FOLDLEVELWHITEFLAG;\n\n\t\t\tstyler.SetLevel(skipLine, skipLevel | whiteFlag);\n\t\t}\n\n\t\t// Set fold header on non-quote/non-comment line\n\t\tif (!quote && !comment && !(indentCurrent & SC_FOLDLEVELWHITEFLAG) ) {\n\t\t\tif ((indentCurrent & SC_FOLDLEVELNUMBERMASK) <\n\t\t\t     (indentNext & SC_FOLDLEVELNUMBERMASK))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t}\n\n\t\t// Keep track of triple quote and block comment state of previous line\n\t\tprevQuote = quote;\n\t\tprevComment = comment_start || comment_continue;\n\n\t\t// Set fold level for this line and move to next line\n\t\tstyler.SetLevel(lineCurrent, lev);\n\t\tindentCurrent = indentNext;\n\t\tlineCurrent = lineNext;\n\t}\n\n\t// NOTE: Cannot set level of last line here because indentCurrent doesn't have\n\t// header flag set; the loop above is crafted to take care of this case!\n\t//styler.SetLevel(lineCurrent, indentCurrent);\n}\n\nstatic const char * const nimrodWordListDesc[] = {\n\t\"Keywords\",\n\t0\n};\n\nLexerModule lmNimrod(SCLEX_NIMROD, ColouriseNimrodDoc, \"nimrod\", FoldNimrodDoc,\n\t\t\t\t     nimrodWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexNsis.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexNsis.cxx\n ** Lexer for NSIS\n **/\n// Copyright 2003 - 2005 by Angelo Mandato <angelo [at] spaceblue [dot] com>\n// Last Updated: 03/13/2005\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n/*\n// located in SciLexer.h\n#define SCLEX_NSIS 43\n\n#define SCE_NSIS_DEFAULT 0\n#define SCE_NSIS_COMMENT 1\n#define SCE_NSIS_STRINGDQ 2\n#define SCE_NSIS_STRINGLQ 3\n#define SCE_NSIS_STRINGRQ 4\n#define SCE_NSIS_FUNCTION 5\n#define SCE_NSIS_VARIABLE 6\n#define SCE_NSIS_LABEL 7\n#define SCE_NSIS_USERDEFINED 8\n#define SCE_NSIS_SECTIONDEF 9\n#define SCE_NSIS_SUBSECTIONDEF 10\n#define SCE_NSIS_IFDEFINEDEF 11\n#define SCE_NSIS_MACRODEF 12\n#define SCE_NSIS_STRINGVAR 13\n#define SCE_NSIS_NUMBER 14\n// ADDED for Scintilla v1.63\n#define SCE_NSIS_SECTIONGROUP 15\n#define SCE_NSIS_PAGEEX 16\n#define SCE_NSIS_FUNCTIONDEF 17\n#define SCE_NSIS_COMMENTBOX 18\n*/\n\nstatic bool isNsisNumber(char ch)\n{\n  return (ch >= '0' && ch <= '9');\n}\n\nstatic bool isNsisChar(char ch)\n{\n  return (ch == '.' ) || (ch == '_' ) || isNsisNumber(ch) || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');\n}\n\nstatic bool isNsisLetter(char ch)\n{\n  return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');\n}\n\nstatic bool NsisNextLineHasElse(unsigned int start, unsigned int end, Accessor &styler)\n{\n  int nNextLine = -1;\n  for( unsigned int i = start; i < end; i++ )\n  {\n    char cNext = styler.SafeGetCharAt( i );\n    if( cNext == '\\n' )\n    {\n      nNextLine = i+1;\n      break;\n    }\n  }\n\n  if( nNextLine == -1 ) // We never found the next line...\n    return false;\n\n  for( unsigned int firstChar = nNextLine; firstChar < end; firstChar++ )\n  {\n    char cNext = styler.SafeGetCharAt( firstChar );\n    if( cNext == ' ' )\n      continue;\n    if( cNext == '\\t' )\n      continue;\n    if( cNext == '!' )\n    {\n      if( styler.Match(firstChar, \"!else\") )\n        return true;\n    }\n    break;\n  }\n\n  return false;\n}\n\nstatic int NsisCmp( const char *s1, const char *s2, bool bIgnoreCase )\n{\n  if( bIgnoreCase )\n     return CompareCaseInsensitive( s1, s2);\n\n  return strcmp( s1, s2 );\n}\n\nstatic int calculateFoldNsis(unsigned int start, unsigned int end, int foldlevel, Accessor &styler, bool bElse, bool foldUtilityCmd )\n{\n  int style = styler.StyleAt(end);\n\n  // If the word is too long, it is not what we are looking for\n  if( end - start > 20 )\n    return foldlevel;\n\n  if( foldUtilityCmd )\n  {\n    // Check the style at this point, if it is not valid, then return zero\n    if( style != SCE_NSIS_FUNCTIONDEF && style != SCE_NSIS_SECTIONDEF &&\n        style != SCE_NSIS_SUBSECTIONDEF && style != SCE_NSIS_IFDEFINEDEF &&\n        style != SCE_NSIS_MACRODEF && style != SCE_NSIS_SECTIONGROUP &&\n        style != SCE_NSIS_PAGEEX )\n          return foldlevel;\n  }\n  else\n  {\n    if( style != SCE_NSIS_FUNCTIONDEF && style != SCE_NSIS_SECTIONDEF &&\n        style != SCE_NSIS_SUBSECTIONDEF && style != SCE_NSIS_SECTIONGROUP &&\n        style != SCE_NSIS_PAGEEX )\n          return foldlevel;\n  }\n\n  int newFoldlevel = foldlevel;\n  bool bIgnoreCase = false;\n  if( styler.GetPropertyInt(\"nsis.ignorecase\") == 1 )\n    bIgnoreCase = true;\n\n  char s[20]; // The key word we are looking for has atmost 13 characters\n  s[0] = '\\0';\n  for (unsigned int i = 0; i < end - start + 1 && i < 19; i++)\n\t{\n\t\ts[i] = static_cast<char>( styler[ start + i ] );\n\t\ts[i + 1] = '\\0';\n\t}\n\n  if( s[0] == '!' )\n  {\n    if( NsisCmp(s, \"!ifndef\", bIgnoreCase) == 0 || NsisCmp(s, \"!ifdef\", bIgnoreCase ) == 0 || NsisCmp(s, \"!ifmacrodef\", bIgnoreCase ) == 0 || NsisCmp(s, \"!ifmacrondef\", bIgnoreCase ) == 0 || NsisCmp(s, \"!if\", bIgnoreCase ) == 0 || NsisCmp(s, \"!macro\", bIgnoreCase ) == 0 )\n      newFoldlevel++;\n    else if( NsisCmp(s, \"!endif\", bIgnoreCase) == 0 || NsisCmp(s, \"!macroend\", bIgnoreCase ) == 0 )\n      newFoldlevel--;\n    else if( bElse && NsisCmp(s, \"!else\", bIgnoreCase) == 0 )\n      newFoldlevel++;\n  }\n  else\n  {\n    if( NsisCmp(s, \"Section\", bIgnoreCase ) == 0 || NsisCmp(s, \"SectionGroup\", bIgnoreCase ) == 0 || NsisCmp(s, \"Function\", bIgnoreCase) == 0 || NsisCmp(s, \"SubSection\", bIgnoreCase ) == 0 || NsisCmp(s, \"PageEx\", bIgnoreCase ) == 0 )\n      newFoldlevel++;\n    else if( NsisCmp(s, \"SectionGroupEnd\", bIgnoreCase ) == 0 || NsisCmp(s, \"SubSectionEnd\", bIgnoreCase ) == 0 || NsisCmp(s, \"FunctionEnd\", bIgnoreCase) == 0 || NsisCmp(s, \"SectionEnd\", bIgnoreCase ) == 0 || NsisCmp(s, \"PageExEnd\", bIgnoreCase ) == 0 )\n      newFoldlevel--;\n  }\n\n  return newFoldlevel;\n}\n\nstatic int classifyWordNsis(unsigned int start, unsigned int end, WordList *keywordLists[], Accessor &styler )\n{\n  bool bIgnoreCase = false;\n  if( styler.GetPropertyInt(\"nsis.ignorecase\") == 1 )\n    bIgnoreCase = true;\n\n  bool bUserVars = false;\n  if( styler.GetPropertyInt(\"nsis.uservars\") == 1 )\n    bUserVars = true;\n\n\tchar s[100];\n\ts[0] = '\\0';\n\ts[1] = '\\0';\n\n\tWordList &Functions = *keywordLists[0];\n\tWordList &Variables = *keywordLists[1];\n\tWordList &Lables = *keywordLists[2];\n\tWordList &UserDefined = *keywordLists[3];\n\n\tfor (unsigned int i = 0; i < end - start + 1 && i < 99; i++)\n\t{\n    if( bIgnoreCase )\n      s[i] = static_cast<char>( tolower(styler[ start + i ] ) );\n    else\n\t\t  s[i] = static_cast<char>( styler[ start + i ] );\n\t\ts[i + 1] = '\\0';\n\t}\n\n\t// Check for special words...\n\tif( NsisCmp(s, \"!macro\", bIgnoreCase ) == 0 || NsisCmp(s, \"!macroend\", bIgnoreCase) == 0 ) // Covers !macro and !macroend\n\t\treturn SCE_NSIS_MACRODEF;\n\n\tif( NsisCmp(s, \"!ifdef\", bIgnoreCase ) == 0 ||  NsisCmp(s, \"!ifndef\", bIgnoreCase) == 0 ||  NsisCmp(s, \"!endif\", bIgnoreCase) == 0 ) // Covers !ifdef, !ifndef and !endif\n\t\treturn SCE_NSIS_IFDEFINEDEF;\n\n\tif( NsisCmp(s, \"!if\", bIgnoreCase ) == 0 || NsisCmp(s, \"!else\", bIgnoreCase )  == 0 ) // Covers !if and else\n\t\treturn SCE_NSIS_IFDEFINEDEF;\n\n\tif (NsisCmp(s, \"!ifmacrodef\", bIgnoreCase ) == 0 || NsisCmp(s, \"!ifmacrondef\", bIgnoreCase )  == 0 ) // Covers !ifmacrodef and !ifnmacrodef\n\t\treturn SCE_NSIS_IFDEFINEDEF;\n\n  if( NsisCmp(s, \"SectionGroup\", bIgnoreCase) == 0 || NsisCmp(s, \"SectionGroupEnd\", bIgnoreCase) == 0 ) // Covers SectionGroup and SectionGroupEnd\n    return SCE_NSIS_SECTIONGROUP;\n\n\tif( NsisCmp(s, \"Section\", bIgnoreCase ) == 0 || NsisCmp(s, \"SectionEnd\", bIgnoreCase) == 0 ) // Covers Section and SectionEnd\n\t\treturn SCE_NSIS_SECTIONDEF;\n\n\tif( NsisCmp(s, \"SubSection\", bIgnoreCase) == 0 || NsisCmp(s, \"SubSectionEnd\", bIgnoreCase) == 0 ) // Covers SubSection and SubSectionEnd\n\t\treturn SCE_NSIS_SUBSECTIONDEF;\n\n  if( NsisCmp(s, \"PageEx\", bIgnoreCase) == 0 || NsisCmp(s, \"PageExEnd\", bIgnoreCase) == 0 ) // Covers PageEx and PageExEnd\n    return SCE_NSIS_PAGEEX;\n\n\tif( NsisCmp(s, \"Function\", bIgnoreCase) == 0 || NsisCmp(s, \"FunctionEnd\", bIgnoreCase) == 0 ) // Covers Function and FunctionEnd\n\t\treturn SCE_NSIS_FUNCTIONDEF;\n\n\tif ( Functions.InList(s) )\n\t\treturn SCE_NSIS_FUNCTION;\n\n\tif ( Variables.InList(s) )\n\t\treturn SCE_NSIS_VARIABLE;\n\n\tif ( Lables.InList(s) )\n\t\treturn SCE_NSIS_LABEL;\n\n\tif( UserDefined.InList(s) )\n\t\treturn SCE_NSIS_USERDEFINED;\n\n\tif( strlen(s) > 3 )\n\t{\n\t\tif( s[1] == '{' && s[strlen(s)-1] == '}' )\n\t\t\treturn SCE_NSIS_VARIABLE;\n\t}\n\n  // See if the variable is a user defined variable\n  if( s[0] == '$' && bUserVars )\n  {\n    bool bHasSimpleNsisChars = true;\n    for (unsigned int j = 1; j < end - start + 1 && j < 99; j++)\n\t  {\n      if( !isNsisChar( s[j] ) )\n      {\n        bHasSimpleNsisChars = false;\n        break;\n      }\n\t  }\n\n    if( bHasSimpleNsisChars )\n      return SCE_NSIS_VARIABLE;\n  }\n\n  // To check for numbers\n  if( isNsisNumber( s[0] ) )\n  {\n    bool bHasSimpleNsisNumber = true;\n    for (unsigned int j = 1; j < end - start + 1 && j < 99; j++)\n\t  {\n      if( !isNsisNumber( s[j] ) )\n      {\n        bHasSimpleNsisNumber = false;\n        break;\n      }\n\t  }\n\n    if( bHasSimpleNsisNumber )\n      return SCE_NSIS_NUMBER;\n  }\n\n\treturn SCE_NSIS_DEFAULT;\n}\n\nstatic void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler)\n{\n\tint state = SCE_NSIS_DEFAULT;\n  if( startPos > 0 )\n    state = styler.StyleAt(startPos-1); // Use the style from the previous line, usually default, but could be commentbox\n\n\tstyler.StartAt( startPos );\n\tstyler.GetLine( startPos );\n\n\tunsigned int nLengthDoc = startPos + length;\n\tstyler.StartSegment( startPos );\n\n\tchar cCurrChar;\n\tbool bVarInString = false;\n  bool bClassicVarInString = false;\n\n\tunsigned int i;\n\tfor( i = startPos; i < nLengthDoc; i++ )\n\t{\n\t\tcCurrChar = styler.SafeGetCharAt( i );\n\t\tchar cNextChar = styler.SafeGetCharAt(i+1);\n\n\t\tswitch(state)\n\t\t{\n\t\t\tcase SCE_NSIS_DEFAULT:\n\t\t\t\tif( cCurrChar == ';' || cCurrChar == '#' ) // we have a comment line\n\t\t\t\t{\n\t\t\t\t\tstyler.ColourTo(i-1, state );\n\t\t\t\t\tstate = SCE_NSIS_COMMENT;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif( cCurrChar == '\"' )\n\t\t\t\t{\n\t\t\t\t\tstyler.ColourTo(i-1, state );\n\t\t\t\t\tstate = SCE_NSIS_STRINGDQ;\n\t\t\t\t\tbVarInString = false;\n          bClassicVarInString = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif( cCurrChar == '\\'' )\n\t\t\t\t{\n\t\t\t\t\tstyler.ColourTo(i-1, state );\n\t\t\t\t\tstate = SCE_NSIS_STRINGRQ;\n\t\t\t\t\tbVarInString = false;\n          bClassicVarInString = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif( cCurrChar == '`' )\n\t\t\t\t{\n\t\t\t\t\tstyler.ColourTo(i-1, state );\n\t\t\t\t\tstate = SCE_NSIS_STRINGLQ;\n\t\t\t\t\tbVarInString = false;\n          bClassicVarInString = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// NSIS KeyWord,Function, Variable, UserDefined:\n\t\t\t\tif( cCurrChar == '$' || isNsisChar(cCurrChar) || cCurrChar == '!' )\n\t\t\t\t{\n\t\t\t\t\tstyler.ColourTo(i-1,state);\n\t\t\t\t  state = SCE_NSIS_FUNCTION;\n\n          // If it is a number, we must check and set style here first...\n          if( isNsisNumber(cCurrChar) && (cNextChar == '\\t' || cNextChar == ' ' || cNextChar == '\\r' || cNextChar == '\\n' ) )\n              styler.ColourTo( i, SCE_NSIS_NUMBER);\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n        if( cCurrChar == '/' && cNextChar == '*' )\n        {\n          styler.ColourTo(i-1,state);\n          state = SCE_NSIS_COMMENTBOX;\n          break;\n        }\n\n\t\t\t\tbreak;\n\t\t\tcase SCE_NSIS_COMMENT:\n\t\t\t\tif( cNextChar == '\\n' || cNextChar == '\\r' )\n        {\n          // Special case:\n          if( cCurrChar == '\\\\' )\n          {\n            styler.ColourTo(i-2,state);\n            styler.ColourTo(i,SCE_NSIS_DEFAULT);\n          }\n          else\n          {\n\t\t\t\t    styler.ColourTo(i,state);\n            state = SCE_NSIS_DEFAULT;\n          }\n        }\n\t\t\t\tbreak;\n\t\t\tcase SCE_NSIS_STRINGDQ:\n      case SCE_NSIS_STRINGLQ:\n      case SCE_NSIS_STRINGRQ:\n\n        if( styler.SafeGetCharAt(i-1) == '\\\\' && styler.SafeGetCharAt(i-2) == '$' )\n          break; // Ignore the next character, even if it is a quote of some sort\n\n        if( cCurrChar == '\"' && state == SCE_NSIS_STRINGDQ )\n\t\t\t\t{\n\t\t\t\t\tstyler.ColourTo(i,state);\n\t\t\t\t  state = SCE_NSIS_DEFAULT;\n          break;\n\t\t\t\t}\n\n        if( cCurrChar == '`' && state == SCE_NSIS_STRINGLQ )\n        {\n\t\t\t\t\tstyler.ColourTo(i,state);\n\t\t\t\t  state = SCE_NSIS_DEFAULT;\n          break;\n\t\t\t\t}\n\n        if( cCurrChar == '\\'' && state == SCE_NSIS_STRINGRQ )\n\t\t\t\t{\n\t\t\t\t\tstyler.ColourTo(i,state);\n\t\t\t\t  state = SCE_NSIS_DEFAULT;\n          break;\n\t\t\t\t}\n\n        if( cNextChar == '\\r' || cNextChar == '\\n' )\n        {\n          int nCurLine = styler.GetLine(i+1);\n          int nBack = i;\n          // We need to check if the previous line has a \\ in it...\n          bool bNextLine = false;\n\n          while( nBack > 0 )\n          {\n            if( styler.GetLine(nBack) != nCurLine )\n              break;\n\n            char cTemp = styler.SafeGetCharAt(nBack, 'a'); // Letter 'a' is safe here\n\n            if( cTemp == '\\\\' )\n            {\n              bNextLine = true;\n              break;\n            }\n            if( cTemp != '\\r' && cTemp != '\\n' && cTemp != '\\t' && cTemp != ' ' )\n              break;\n\n            nBack--;\n          }\n\n          if( bNextLine )\n          {\n            styler.ColourTo(i+1,state);\n          }\n          if( bNextLine == false )\n          {\n            styler.ColourTo(i,state);\n\t\t\t\t    state = SCE_NSIS_DEFAULT;\n          }\n        }\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_NSIS_FUNCTION:\n\n\t\t\t\t// NSIS KeyWord:\n        if( cCurrChar == '$' )\n          state = SCE_NSIS_DEFAULT;\n        else if( cCurrChar == '\\\\' && (cNextChar == 'n' || cNextChar == 'r' || cNextChar == 't' ) )\n          state = SCE_NSIS_DEFAULT;\n\t\t\t\telse if( (isNsisChar(cCurrChar) && !isNsisChar( cNextChar) && cNextChar != '}') || cCurrChar == '}' )\n\t\t\t\t{\n\t\t\t\t\tstate = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler );\n\t\t\t\t\tstyler.ColourTo( i, state);\n\t\t\t\t\tstate = SCE_NSIS_DEFAULT;\n\t\t\t\t}\n\t\t\t\telse if( !isNsisChar( cCurrChar ) && cCurrChar != '{' && cCurrChar != '}' )\n\t\t\t\t{\n          if( classifyWordNsis( styler.GetStartSegment(), i-1, keywordLists, styler) == SCE_NSIS_NUMBER )\n             styler.ColourTo( i-1, SCE_NSIS_NUMBER );\n\n\t\t\t\t\tstate = SCE_NSIS_DEFAULT;\n\n\t\t\t\t\tif( cCurrChar == '\"' )\n\t\t\t\t\t{\n\t\t\t\t\t\tstate = SCE_NSIS_STRINGDQ;\n\t\t\t\t\t\tbVarInString = false;\n            bClassicVarInString = false;\n\t\t\t\t\t}\n\t\t\t\t\telse if( cCurrChar == '`' )\n\t\t\t\t\t{\n\t\t\t\t\t\tstate = SCE_NSIS_STRINGLQ;\n\t\t\t\t\t\tbVarInString = false;\n            bClassicVarInString = false;\n\t\t\t\t\t}\n\t\t\t\t\telse if( cCurrChar == '\\'' )\n\t\t\t\t\t{\n\t\t\t\t\t\tstate = SCE_NSIS_STRINGRQ;\n\t\t\t\t\t\tbVarInString = false;\n            bClassicVarInString = false;\n\t\t\t\t\t}\n\t\t\t\t\telse if( cCurrChar == '#' || cCurrChar == ';' )\n          {\n\t\t\t\t\t\tstate = SCE_NSIS_COMMENT;\n          }\n\t\t\t\t}\n\t\t\t\tbreak;\n      case SCE_NSIS_COMMENTBOX:\n\n        if( styler.SafeGetCharAt(i-1) == '*' && cCurrChar == '/' )\n        {\n          styler.ColourTo(i,state);\n          state = SCE_NSIS_DEFAULT;\n        }\n        break;\n\t\t}\n\n\t\tif( state == SCE_NSIS_COMMENT || state == SCE_NSIS_COMMENTBOX )\n\t\t{\n\t\t\tstyler.ColourTo(i,state);\n\t\t}\n\t\telse if( state == SCE_NSIS_STRINGDQ || state == SCE_NSIS_STRINGLQ || state == SCE_NSIS_STRINGRQ )\n\t\t{\n      bool bIngoreNextDollarSign = false;\n      bool bUserVars = false;\n      if( styler.GetPropertyInt(\"nsis.uservars\") == 1 )\n        bUserVars = true;\n\n      if( bVarInString && cCurrChar == '$' )\n      {\n        bVarInString = false;\n        bIngoreNextDollarSign = true;\n      }\n      else if( bVarInString && cCurrChar == '\\\\' && (cNextChar == 'n' || cNextChar == 'r' || cNextChar == 't' || cNextChar == '\"' || cNextChar == '`' || cNextChar == '\\'' ) )\n      {\n        styler.ColourTo( i+1, SCE_NSIS_STRINGVAR);\n        bVarInString = false;\n        bIngoreNextDollarSign = false;\n      }\n\n      // Covers \"$INSTDIR and user vars like $MYVAR\"\n      else if( bVarInString && !isNsisChar(cNextChar) )\n      {\n        int nWordState = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler);\n\t\t\t\tif( nWordState == SCE_NSIS_VARIABLE )\n\t\t\t\t\tstyler.ColourTo( i, SCE_NSIS_STRINGVAR);\n        else if( bUserVars )\n          styler.ColourTo( i, SCE_NSIS_STRINGVAR);\n        bVarInString = false;\n      }\n      // Covers \"${TEST}...\"\n      else if( bClassicVarInString && cNextChar == '}' )\n      {\n        styler.ColourTo( i+1, SCE_NSIS_STRINGVAR);\n\t\t\t\tbClassicVarInString = false;\n      }\n\n      // Start of var in string\n\t\t\tif( !bIngoreNextDollarSign && cCurrChar == '$' && cNextChar == '{' )\n\t\t\t{\n\t\t\t\tstyler.ColourTo( i-1, state);\n\t\t\t\tbClassicVarInString = true;\n        bVarInString = false;\n\t\t\t}\n      else if( !bIngoreNextDollarSign && cCurrChar == '$' )\n      {\n        styler.ColourTo( i-1, state);\n        bVarInString = true;\n        bClassicVarInString = false;\n      }\n\t\t}\n\t}\n\n  // Colourise remaining document\n\tstyler.ColourTo(nLengthDoc-1,state);\n}\n\nstatic void FoldNsisDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)\n{\n\t// No folding enabled, no reason to continue...\n\tif( styler.GetPropertyInt(\"fold\") == 0 )\n\t\treturn;\n\n  bool foldAtElse = styler.GetPropertyInt(\"fold.at.else\", 0) == 1;\n  bool foldUtilityCmd = styler.GetPropertyInt(\"nsis.foldutilcmd\", 1) == 1;\n  bool blockComment = false;\n\n  int lineCurrent = styler.GetLine(startPos);\n  unsigned int safeStartPos = styler.LineStart( lineCurrent );\n\n  bool bArg1 = true;\n  int nWordStart = -1;\n\n  int levelCurrent = SC_FOLDLEVELBASE;\n\tif (lineCurrent > 0)\n\t\tlevelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n\tint levelNext = levelCurrent;\n  int style = styler.StyleAt(safeStartPos);\n  if( style == SCE_NSIS_COMMENTBOX )\n  {\n    if( styler.SafeGetCharAt(safeStartPos) == '/' && styler.SafeGetCharAt(safeStartPos+1) == '*' )\n      levelNext++;\n    blockComment = true;\n  }\n\n  for (unsigned int i = safeStartPos; i < startPos + length; i++)\n\t{\n    char chCurr = styler.SafeGetCharAt(i);\n    style = styler.StyleAt(i);\n    if( blockComment && style != SCE_NSIS_COMMENTBOX )\n    {\n      levelNext--;\n      blockComment = false;\n    }\n    else if( !blockComment && style == SCE_NSIS_COMMENTBOX )\n    {\n      levelNext++;\n      blockComment = true;\n    }\n\n    if( bArg1 && !blockComment)\n    {\n      if( nWordStart == -1 && (isNsisLetter(chCurr) || chCurr == '!') )\n      {\n        nWordStart = i;\n      }\n      else if( isNsisLetter(chCurr) == false && nWordStart > -1 )\n      {\n        int newLevel = calculateFoldNsis( nWordStart, i-1, levelNext, styler, foldAtElse, foldUtilityCmd );\n\n        if( newLevel == levelNext )\n        {\n          if( foldAtElse && foldUtilityCmd )\n          {\n            if( NsisNextLineHasElse(i, startPos + length, styler) )\n              levelNext--;\n          }\n        }\n        else\n          levelNext = newLevel;\n        bArg1 = false;\n      }\n    }\n\n    if( chCurr == '\\n' )\n    {\n      if( bArg1 && foldAtElse && foldUtilityCmd && !blockComment )\n      {\n        if( NsisNextLineHasElse(i, startPos + length, styler) )\n          levelNext--;\n      }\n\n      // If we are on a new line...\n      int levelUse = levelCurrent;\n\t\t\tint lev = levelUse | levelNext << 16;\n      if (levelUse < levelNext )\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent))\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\n\t\t\tlineCurrent++;\n\t\t\tlevelCurrent = levelNext;\n      bArg1 = true; // New line, lets look at first argument again\n      nWordStart = -1;\n    }\n  }\n\n\tint levelUse = levelCurrent;\n\tint lev = levelUse | levelNext << 16;\n\tif (levelUse < levelNext)\n\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\tif (lev != styler.LevelAt(lineCurrent))\n\t\tstyler.SetLevel(lineCurrent, lev);\n}\n\nstatic const char * const nsisWordLists[] = {\n\t\"Functions\",\n\t\"Variables\",\n\t\"Lables\",\n\t\"UserDefined\",\n\t0, };\n\n\nLexerModule lmNsis(SCLEX_NSIS, ColouriseNsisDoc, \"nsis\", FoldNsisDoc, nsisWordLists);\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexOScript.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexOScript.cxx\n ** Lexer for OScript sources; ocx files and/or OSpace dumps.\n ** OScript is a programming language used to develop applications for the\n ** Livelink server platform.\n **/\n// Written by Ferdinand Prantl <prantlf@gmail.com>, inspired by the code from\n// LexVB.cxx and LexPascal.cxx. The License.txt file describes the conditions\n// under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n// -----------------------------------------\n// Functions classifying a single character.\n\n// This function is generic and should be probably moved to CharSet.h where\n// IsAlphaNumeric the others reside.\ninline bool IsAlpha(int ch) {\n\treturn (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');\n}\n\nstatic inline bool IsIdentifierChar(int ch) {\n\t// Identifiers cannot contain non-ASCII letters; a word with non-English\n\t// language-specific characters cannot be an identifier.\n\treturn IsAlphaNumeric(ch) || ch == '_';\n}\n\nstatic inline bool IsIdentifierStart(int ch) {\n\t// Identifiers cannot contain non-ASCII letters; a word with non-English\n\t// language-specific characters cannot be an identifier.\n\treturn IsAlpha(ch) || ch == '_';\n}\n\nstatic inline bool IsNumberChar(int ch, int chNext) {\n\t// Numeric constructs are not checked for lexical correctness. They are\n\t// expected to look like +1.23-E9 but actually any bunch of the following\n\t// characters will be styled as number.\n\t// KNOWN PROBLEM: if you put + or - operators immediately after a number\n\t// and the next operand starts with the letter E, the operator will not be\n\t// recognized and it will be styled together with the preceding number.\n\t// This should not occur; at least not often. The coding style recommends\n\t// putting spaces around operators.\n\treturn IsADigit(ch) || toupper(ch) == 'E' || ch == '.' ||\n\t\t   ((ch == '-' || ch == '+') && toupper(chNext) == 'E');\n}\n\n// This function checks for the start or a natural number without any symbols\n// or operators as a prefix; the IsPrefixedNumberStart should be called\n// immediately after this one to cover all possible numeric constructs.\nstatic inline bool IsNaturalNumberStart(int ch) {\n\treturn IsADigit(ch) != 0;\n}\n\nstatic inline bool IsPrefixedNumberStart(int ch, int chNext) {\n\t// KNOWN PROBLEM: if you put + or - operators immediately before a number\n\t// the operator will not be recognized and it will be styled together with\n\t// the succeeding number. This should not occur; at least not often. The\n\t// coding style recommends putting spaces around operators.\n\treturn (ch == '.' || ch == '-' || ch == '+') && IsADigit(chNext);\n}\n\nstatic inline bool IsOperator(int ch) {\n\treturn strchr(\"%^&*()-+={}[]:;<>,/?!.~|\\\\\", ch) != NULL;\n}\n\n// ---------------------------------------------------------------\n// Functions classifying a token currently processed in the lexer.\n\n// Checks if the current line starts with the preprocessor directive used\n// usually to introduce documentation comments: #ifdef DOC. This method is\n// supposed to be called if the line has been recognized as a preprocessor\n// directive already.\nstatic bool IsDocCommentStart(StyleContext &sc) {\n\t// Check the line back to its start only if the end looks promising.\n\tif (sc.LengthCurrent() == 10 && !IsAlphaNumeric(sc.ch)) {\n\t\tchar s[11];\n\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\treturn strcmp(s, \"#ifdef doc\") == 0;\n\t}\n\treturn false;\n}\n\n// Checks if the current line starts with the preprocessor directive that\n// is complementary to the #ifdef DOC start: #endif. This method is supposed\n// to be called if the current state point to the documentation comment.\n// QUESTIONAL ASSUMPTION: The complete #endif directive is not checked; just\n// the starting #e. However, there is no other preprocessor directive with\n// the same starting letter and thus this optimization should always work.\nstatic bool IsDocCommentEnd(StyleContext &sc) {\n\treturn sc.ch == '#' && sc.chNext == 'e';\n}\n\nclass IdentifierClassifier {\n\tWordList &keywords;  // Passed from keywords property.\n\tWordList &constants; // Passed from keywords2 property.\n\tWordList &operators; // Passed from keywords3 property.\n\tWordList &types;     // Passed from keywords4 property.\n\tWordList &functions; // Passed from keywords5 property.\n\tWordList &objects;   // Passed from keywords6 property.\n\n\tIdentifierClassifier(IdentifierClassifier const&);\n\tIdentifierClassifier& operator=(IdentifierClassifier const&);\n\npublic:\n\tIdentifierClassifier(WordList *keywordlists[]) :\n\t\tkeywords(*keywordlists[0]), constants(*keywordlists[1]),\n\t\toperators(*keywordlists[2]), types(*keywordlists[3]),\n\t\tfunctions(*keywordlists[4]), objects(*keywordlists[5])\n\t{}\n\n\tvoid ClassifyIdentifier(StyleContext &sc) {\n\t\t// Opening parenthesis following an identifier makes it a possible\n\t\t// function call.\n\t\t// KNOWN PROBLEM: If some whitespace is inserted between the\n\t\t// identifier and the parenthesis they will not be able to be\n\t\t// recognized as a function call. This should not occur; at\n\t\t// least not often. Such coding style would be weird.\n\t\tif (sc.Match('(')) {\n\t\t\tchar s[100];\n\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t// Before an opening brace can be control statements and\n\t\t\t// operators too; function call is the last option.\n\t\t\tif (keywords.InList(s)) {\n\t\t\t\tsc.ChangeState(SCE_OSCRIPT_KEYWORD);\n\t\t\t} else if (operators.InList(s)) {\n\t\t\t\tsc.ChangeState(SCE_OSCRIPT_OPERATOR);\n\t\t\t} else if (functions.InList(s)) {\n\t\t\t\tsc.ChangeState(SCE_OSCRIPT_FUNCTION);\n\t\t\t} else {\n\t\t\t\tsc.ChangeState(SCE_OSCRIPT_METHOD);\n\t\t\t}\n\t\t\tsc.SetState(SCE_OSCRIPT_OPERATOR);\n\t\t} else {\n\t\t\tchar s[100];\n\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t// A dot following an identifier means an access to an object\n\t\t\t// member. The related object identifier can be special.\n\t\t\t// KNOWN PROBLEM: If there is whitespace between the identifier\n\t\t\t// and the following dot, the identifier will not be recognized\n\t\t\t// as an object in an object member access. If it is one of the\n\t\t\t// listed static objects it will not be styled.\n\t\t\tif (sc.Match('.') && objects.InList(s)) {\n\t\t\t\tsc.ChangeState(SCE_OSCRIPT_OBJECT);\n\t\t\t\tsc.SetState(SCE_OSCRIPT_OPERATOR);\n\t\t\t} else {\n\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_OSCRIPT_KEYWORD);\n\t\t\t\t} else if (constants.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_OSCRIPT_CONSTANT);\n\t\t\t\t} else if (operators.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_OSCRIPT_OPERATOR);\n\t\t\t\t} else if (types.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_OSCRIPT_TYPE);\n\t\t\t\t} else if (functions.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_OSCRIPT_FUNCTION);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_OSCRIPT_DEFAULT);\n\t\t\t}\n\t\t}\n\t}\n};\n\n// ------------------------------------------------\n// Function colourising an excerpt of OScript code.\n\nstatic void ColouriseOScriptDoc(unsigned int startPos, int length,\n\t\t\t\t\t\t\t\tint initStyle, WordList *keywordlists[],\n\t\t\t\t\t\t\t\tAccessor &styler) {\n\t// I wonder how whole-line styles ended by EOLN can escape the resetting\n\t// code in the loop below and overflow to the next line. Let us make sure\n\t// that a new line does not start with them carried from the previous one.\n\t// NOTE: An overflowing string is intentionally not checked; it reminds\n\t// the developer that the string must be ended on the same line.\n\tif (initStyle == SCE_OSCRIPT_LINE_COMMENT ||\n\t\t\tinitStyle == SCE_OSCRIPT_PREPROCESSOR) {\n\t\tinitStyle = SCE_OSCRIPT_DEFAULT;\n\t}\n\n\tstyler.StartAt(startPos);\n\tStyleContext sc(startPos, length, initStyle, styler);\n\tIdentifierClassifier identifierClassifier(keywordlists);\n\n\t// It starts with true at the beginning of a line and changes to false as\n\t// soon as the first non-whitespace character has been processed.\n\tbool isFirstToken = true;\n\t// It starts with true at the beginning of a line and changes to false as\n\t// soon as the first identifier on the line is passed by.\n\tbool isFirstIdentifier = true; \n\t// It becomes false when #ifdef DOC (the preprocessor directive often\n\t// used to start a documentation comment) is encountered and remain false\n\t// until the end of the documentation block is not detected. This is done\n\t// by checking for the complementary #endif preprocessor directive.\n\tbool endDocComment = false; \n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\tif (sc.atLineStart) {\n\t\t\tisFirstToken = true;\n\t\t\tisFirstIdentifier = true;\n\t\t// Detect the current state is neither whitespace nor identifier. It\n\t\t// means that no next identifier can be the first token on the line.\n\t\t} else if (isFirstIdentifier && sc.state != SCE_OSCRIPT_DEFAULT &&\n\t\t\t\t   sc.state != SCE_OSCRIPT_IDENTIFIER) {\n\t\t\tisFirstIdentifier = false;\n\t\t}\n\n\t\t// Check if the current state should be changed.\n\t\tif (sc.state == SCE_OSCRIPT_OPERATOR) {\n\t\t\t// Multiple-symbol operators are marked by single characters.\n\t\t\tsc.SetState(SCE_OSCRIPT_DEFAULT);\n\t\t} else if (sc.state == SCE_OSCRIPT_IDENTIFIER) {\n\t\t\tif (!IsIdentifierChar(sc.ch)) {\n\t\t\t\t// Colon after an identifier makes it a label if it is the\n\t\t\t\t// first token on the line.\n\t\t\t\t// KNOWN PROBLEM: If some whitespace is inserted between the\n\t\t\t\t// identifier and the colon they will not be recognized as a\n\t\t\t\t// label. This should not occur; at least not often. It would\n\t\t\t\t// make the code structure less legible and examples in the\n\t\t\t\t// Livelink documentation do not show it.\n\t\t\t\tif (sc.Match(':') && isFirstIdentifier) {\n\t\t\t\t\tsc.ChangeState(SCE_OSCRIPT_LABEL);\n\t\t\t\t\tsc.ForwardSetState(SCE_OSCRIPT_DEFAULT);\n\t\t\t\t} else {\n\t\t\t\t\tidentifierClassifier.ClassifyIdentifier(sc);\n\t\t\t\t}\n\t\t\t\t// Avoid a sequence of two words be mistaken for a label. A\n\t\t\t\t// switch case would be an example.\n\t\t\t\tisFirstIdentifier = false;\n\t\t\t}\n\t\t} else if (sc.state == SCE_OSCRIPT_GLOBAL) {\n\t\t\tif (!IsIdentifierChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_OSCRIPT_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_OSCRIPT_PROPERTY) {\n\t\t\tif (!IsIdentifierChar(sc.ch)) {\n\t\t\t\t// Any member access introduced by the dot operator is\n\t\t\t\t// initially marked as a property access. If an opening\n\t\t\t\t// parenthesis is detected later it is changed to method call.\n\t\t\t\t// KNOWN PROBLEM: The same as at the function call recognition\n\t\t\t\t// for SCE_OSCRIPT_IDENTIFIER above.\n\t\t\t\tif (sc.Match('(')) {\n\t\t\t\t\tsc.ChangeState(SCE_OSCRIPT_METHOD);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_OSCRIPT_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_OSCRIPT_NUMBER) {\n\t\t\tif (!IsNumberChar(sc.ch, sc.chNext)) {\n\t\t\t\tsc.SetState(SCE_OSCRIPT_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_OSCRIPT_SINGLEQUOTE_STRING) {\n\t\t\tif (sc.ch == '\\'') {\n\t\t\t\t// Two consequential apostrophes convert to a single one.\n\t\t\t\tif (sc.chNext == '\\'') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} else {\n\t\t\t\t\tsc.ForwardSetState(SCE_OSCRIPT_DEFAULT);\n\t\t\t\t}\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.ForwardSetState(SCE_OSCRIPT_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_OSCRIPT_DOUBLEQUOTE_STRING) {\n\t\t\tif (sc.ch == '\\\"') {\n\t\t\t\t// Two consequential quotation marks convert to a single one.\n\t\t\t\tif (sc.chNext == '\\\"') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} else {\n\t\t\t\t\tsc.ForwardSetState(SCE_OSCRIPT_DEFAULT);\n\t\t\t\t}\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.ForwardSetState(SCE_OSCRIPT_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_OSCRIPT_BLOCK_COMMENT) {\n\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.ForwardSetState(SCE_OSCRIPT_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_OSCRIPT_LINE_COMMENT) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.ForwardSetState(SCE_OSCRIPT_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_OSCRIPT_PREPROCESSOR) {\n\t\t\tif (IsDocCommentStart(sc)) {\n\t\t\t\tsc.ChangeState(SCE_OSCRIPT_DOC_COMMENT);\n\t\t\t\tendDocComment = false;\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.ForwardSetState(SCE_OSCRIPT_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_OSCRIPT_DOC_COMMENT) {\n\t\t\t// KNOWN PROBLEM: The first line detected that would close a\n\t\t\t// conditional preprocessor block (#endif) the documentation\n\t\t\t// comment block will end. (Nested #if-#endif blocks are not\n\t\t\t// supported. Hopefully it will not occur often that a line\n\t\t\t// within the text block would stat with #endif.\n\t\t\tif (isFirstToken && IsDocCommentEnd(sc)) {\n\t\t\t\tendDocComment = true;\n\t\t\t} else if (sc.atLineEnd && endDocComment) {\n\t\t\t\tsc.ForwardSetState(SCE_OSCRIPT_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t// Check what state starts with the current character.\n\t\tif (sc.state == SCE_OSCRIPT_DEFAULT) {\n\t\t\tif (sc.Match('\\'')) {\n\t\t\t\tsc.SetState(SCE_OSCRIPT_SINGLEQUOTE_STRING);\n\t\t\t} else if (sc.Match('\\\"')) {\n\t\t\t\tsc.SetState(SCE_OSCRIPT_DOUBLEQUOTE_STRING);\n\t\t\t} else if (sc.Match('/', '/')) {\n\t\t\t\tsc.SetState(SCE_OSCRIPT_LINE_COMMENT);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.Match('/', '*')) {\n\t\t\t\tsc.SetState(SCE_OSCRIPT_BLOCK_COMMENT);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (isFirstToken && sc.Match('#')) {\n\t\t\t\tsc.SetState(SCE_OSCRIPT_PREPROCESSOR);\n\t\t\t} else if (sc.Match('$')) {\n\t\t\t\t// Both process-global ($xxx) and thread-global ($$xxx)\n\t\t\t\t// variables are handled as one global.\n\t\t\t\tsc.SetState(SCE_OSCRIPT_GLOBAL);\n\t\t\t} else if (IsNaturalNumberStart(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_OSCRIPT_NUMBER);\n\t\t\t} else if (IsPrefixedNumberStart(sc.ch, sc.chNext)) {\n\t\t\t\tsc.SetState(SCE_OSCRIPT_NUMBER);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.Match('.') && IsIdentifierStart(sc.chNext)) {\n\t\t\t\t// Every object member access is marked as a property access\n\t\t\t\t// initially. The decision between property and method is made\n\t\t\t\t// after parsing the identifier and looking what comes then.\n\t\t\t\t// KNOWN PROBLEM: If there is whitespace between the following\n\t\t\t\t// identifier and the dot, the dot will not be recognized\n\t\t\t\t// as a member accessing operator. In turn, the identifier\n\t\t\t\t// will not be recognizable as a property or a method too.\n\t\t\t\tsc.SetState(SCE_OSCRIPT_OPERATOR);\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.SetState(SCE_OSCRIPT_PROPERTY);\n\t\t\t} else if (IsIdentifierStart(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_OSCRIPT_IDENTIFIER);\n\t\t\t} else if (IsOperator(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_OSCRIPT_OPERATOR);\n\t\t\t}\n\t\t}\n\n\t\tif (isFirstToken && !IsASpaceOrTab(sc.ch)) {\n\t\t\tisFirstToken = false;\n\t\t}\n\t}\n\n\tsc.Complete();\n}\n\n// ------------------------------------------\n// Functions supporting OScript code folding.\n\nstatic inline bool IsBlockComment(int style) {\n\treturn style == SCE_OSCRIPT_BLOCK_COMMENT;\n}\n\nstatic bool IsLineComment(int line, Accessor &styler) {\n\tint pos = styler.LineStart(line);\n\tint eolPos = styler.LineStart(line + 1) - 1;\n\tfor (int i = pos; i < eolPos; i++) {\n\t\tchar ch = styler[i];\n\t\tchar chNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styler.StyleAt(i);\n\t\tif (ch == '/' && chNext == '/' && style == SCE_OSCRIPT_LINE_COMMENT) {\n\t\t\treturn true;\n\t\t} else if (!IsASpaceOrTab(ch)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn false;\n}\n\nstatic inline bool IsPreprocessor(int style) {\n\treturn style == SCE_OSCRIPT_PREPROCESSOR ||\n\t\t   style == SCE_OSCRIPT_DOC_COMMENT;\n}\n\nstatic void GetRangeLowered(unsigned int start, unsigned int end,\n\t\t\t\t\t\t\tAccessor &styler, char *s, unsigned int len) {\n\tunsigned int i = 0;\n\twhile (i < end - start + 1 && i < len - 1) {\n\t\ts[i] = static_cast<char>(tolower(styler[start + i]));\n\t\ti++;\n\t}\n\ts[i] = '\\0';\n}\n\nstatic void GetForwardWordLowered(unsigned int start, Accessor &styler,\n\t\t\t\t\t\t\t\t  char *s, unsigned int len) {\n\tunsigned int i = 0;\n\twhile (i < len - 1 && IsAlpha(styler.SafeGetCharAt(start + i))) {\n\t\ts[i] = static_cast<char>(tolower(styler.SafeGetCharAt(start + i)));\n\t\ti++;\n\t}\n\ts[i] = '\\0';\n}\n\nstatic void UpdatePreprocessorFoldLevel(int &levelCurrent,\n\t\tunsigned int startPos, Accessor &styler) {\n\tchar s[7]; // Size of the longest possible keyword + null.\n\tGetForwardWordLowered(startPos, styler, s, sizeof(s));\n\n\tif (strcmp(s, \"ifdef\") == 0 ||\n\t\tstrcmp(s, \"ifndef\") == 0) {\n\t\tlevelCurrent++;\n\t} else if (strcmp(s, \"endif\") == 0) {\n\t\tlevelCurrent--;\n\t\tif (levelCurrent < SC_FOLDLEVELBASE) {\n\t\t\tlevelCurrent = SC_FOLDLEVELBASE;\n\t\t}\n\t}\n}\n\nstatic void UpdateKeywordFoldLevel(int &levelCurrent, unsigned int lastStart,\n\t\tunsigned int currentPos, Accessor &styler) {\n\tchar s[9];\n\tGetRangeLowered(lastStart, currentPos, styler, s, sizeof(s));\n\n\tif (strcmp(s, \"if\") == 0 || strcmp(s, \"for\") == 0 ||\n\t\tstrcmp(s, \"switch\") == 0 || strcmp(s, \"function\") == 0 ||\n\t\tstrcmp(s, \"while\") == 0 || strcmp(s, \"repeat\") == 0) {\n\t\tlevelCurrent++;\n\t} else if (strcmp(s, \"end\") == 0 || strcmp(s, \"until\") == 0) {\n\t\tlevelCurrent--;\n\t\tif (levelCurrent < SC_FOLDLEVELBASE) {\n\t\t\tlevelCurrent = SC_FOLDLEVELBASE;\n\t\t}\n\t}\n}\n\n// ------------------------------\n// Function folding OScript code.\n\nstatic void FoldOScriptDoc(unsigned int startPos, int length, int initStyle,\n\t\t\t\t\t\t   WordList *[], Accessor &styler) {\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldPreprocessor = styler.GetPropertyInt(\"fold.preprocessor\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tint endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tint lastStart = 0;\n\n\tfor (int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atLineEnd = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\n\t\tif (foldComment && IsBlockComment(style)) {\n\t\t\tif (!IsBlockComment(stylePrev)) {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (!IsBlockComment(styleNext) && !atLineEnd) {\n\t\t\t\t// Comments do not end at end of line and the next character\n\t\t\t\t// may not be styled.\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\t\tif (foldComment && atLineEnd && IsLineComment(lineCurrent, styler)) {\n\t\t\tif (!IsLineComment(lineCurrent - 1, styler) &&\n\t\t\t\tIsLineComment(lineCurrent + 1, styler))\n\t\t\t\tlevelCurrent++;\n\t\t\telse if (IsLineComment(lineCurrent - 1, styler) &&\n\t\t\t\t\t !IsLineComment(lineCurrent+1, styler))\n\t\t\t\tlevelCurrent--;\n\t\t}\n\t\tif (foldPreprocessor) {\n\t\t\tif (ch == '#' && IsPreprocessor(style)) {\n\t\t\t\tUpdatePreprocessorFoldLevel(levelCurrent, i + 1, styler);\n\t\t\t}\n\t\t}\n\n\t\tif (stylePrev != SCE_OSCRIPT_KEYWORD && style == SCE_OSCRIPT_KEYWORD) {\n\t\t\tlastStart = i;\n\t\t}\n\t\tif (stylePrev == SCE_OSCRIPT_KEYWORD) {\n\t\t\tif(IsIdentifierChar(ch) && !IsIdentifierChar(chNext)) {\n\t\t\t\tUpdateKeywordFoldLevel(levelCurrent, lastStart, i, styler);\n\t\t\t}\n\t\t}\n\n\t\tif (!IsASpace(ch))\n\t\t\tvisibleChars++;\n\n\t\tif (atLineEnd) {\n\t\t\tint level = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlevel |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlevel |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (level != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, level);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t}\n\n\t// If we did not reach EOLN in the previous loop, store the line level and\n\t// whitespace information. The rest will be filled in later.\n\tint lev = levelPrev;\n\tif (visibleChars == 0 && foldCompact)\n\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\tstyler.SetLevel(lineCurrent, lev);\n}\n\n// --------------------------------------------\n// Declaration of the OScript lexer descriptor.\n\nstatic const char * const oscriptWordListDesc[] = {\n\t\"Keywords and reserved words\",\n\t\"Literal constants\",\n\t\"Literal operators\",\n\t\"Built-in value and reference types\",\n\t\"Built-in global functions\",\n\t\"Built-in static objects\",\n\t0\n};\n\nLexerModule lmOScript(SCLEX_OSCRIPT, ColouriseOScriptDoc, \"oscript\", FoldOScriptDoc, oscriptWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexOpal.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexOpal.cxx\n ** Lexer for OPAL (functional language similar to Haskell)\n ** Written by Sebastian Pipping <webmaster@hartwork.org>\n **/\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\ninline static void getRange( unsigned int start, unsigned int end, Accessor & styler, char * s, unsigned int len )\n{\n\tunsigned int i = 0;\n\twhile( ( i < end - start + 1 ) && ( i < len - 1 ) )\n\t{\n\t\ts[i] = static_cast<char>( styler[ start + i ] );\n\t\ti++;\n\t}\n\ts[ i ] = '\\0';\n}\n\ninline bool HandleString( unsigned int & cur, unsigned int one_too_much, Accessor & styler )\n{\n\tchar ch;\n\n\t// Wait for string to close\n\tbool even_backslash_count = true; // Without gaps in between\n\tcur++; // Skip initial quote\n\tfor( ; ; )\n\t{\n\t\tif( cur >= one_too_much )\n\t\t{\n\t\t\tstyler.ColourTo( cur - 1, SCE_OPAL_STRING );\n\t\t\treturn false; // STOP\n\t\t}\n\n\t\tch = styler.SafeGetCharAt( cur );\n\t\tif( ( ch == '\\015' ) || ( ch == '\\012' ) ) // Deny multi-line strings\n\t\t{\n\t\t\tstyler.ColourTo( cur - 1, SCE_OPAL_STRING );\n\t\t\tstyler.StartSegment( cur );\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( even_backslash_count )\n\t\t\t{\n\t\t\t\tif( ch == '\"' )\n\t\t\t\t{\n\t\t\t\t\tstyler.ColourTo( cur, SCE_OPAL_STRING );\n\t\t\t\t\tcur++;\n\t\t\t\t\tif( cur >= one_too_much )\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false; // STOP\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tstyler.StartSegment( cur );\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( ch == '\\\\' )\n\t\t\t\t{\n\t\t\t\t\teven_backslash_count = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\teven_backslash_count = true;\n\t\t\t}\n\t\t}\n\n\t\tcur++;\n\t}\n}\n\ninline bool HandleCommentBlock( unsigned int & cur, unsigned int one_too_much, Accessor & styler, bool could_fail )\n{\n\tchar ch;\n\n\tif( could_fail )\n\t{\n\t\tcur++;\n\t\tif( cur >= one_too_much )\n\t\t{\n\t\t\tstyler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );\n\t\t\treturn false; // STOP\n\t\t}\n\n\t\tch = styler.SafeGetCharAt( cur );\n\t\tif( ch != '*' )\n\t\t{\n\t\t\tstyler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );\n\t\t\tstyler.StartSegment( cur );\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// Wait for comment close\n\tcur++;\n\tbool star_found = false;\n\tfor( ; ; )\n\t{\n\t\tif( cur >= one_too_much )\n\t\t{\n\t\t\tstyler.ColourTo( cur - 1, SCE_OPAL_COMMENT_BLOCK );\n\t\t\treturn false; // STOP\n\t\t}\n\n\t\tch = styler.SafeGetCharAt( cur );\n\t\tif( star_found )\n\t\t{\n\t\t\tif( ch == '/' )\n\t\t\t{\n\t\t\t\tstyler.ColourTo( cur, SCE_OPAL_COMMENT_BLOCK );\n\t\t\t\tcur++;\n\t\t\t\tif( cur >= one_too_much )\n\t\t\t\t{\n\t\t\t\t\treturn false; // STOP\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstyler.StartSegment( cur );\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( ch != '*' )\n\t\t\t{\n\t\t\t\tstar_found = false;\n\t\t\t}\n\t\t}\n\t\telse if( ch == '*' )\n\t\t{\n\t\t\tstar_found = true;\n\t\t}\n\t\tcur++;\n\t}\n}\n\ninline bool HandleCommentLine( unsigned int & cur, unsigned int one_too_much, Accessor & styler, bool could_fail )\n{\n\tchar ch;\n\n\tif( could_fail )\n\t{\n\t\tcur++;\n\t\tif( cur >= one_too_much )\n\t\t{\n\t\t\tstyler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );\n\t\t\treturn false; // STOP\n\t\t}\n\n\t\tch = styler.SafeGetCharAt( cur );\n\t\tif( ch != '-' )\n\t\t{\n\t\t\tstyler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );\n\t\t\tstyler.StartSegment( cur );\n\t\t\treturn true;\n\t\t}\n\n\t\tcur++;\n\t\tif( cur >= one_too_much )\n\t\t{\n\t\t\tstyler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );\n\t\t\treturn false; // STOP\n\t\t}\n\n\t\tch = styler.SafeGetCharAt( cur );\n\t\tif( ( ch != ' ' ) && ( ch != '\\t' ) )\n\t\t{\n\t\t\tstyler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );\n\t\t\tstyler.StartSegment( cur );\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// Wait for end of line\n\tbool fifteen_found = false;\n\n\tfor( ; ; )\n\t{\n\t\tcur++;\n\n\t\tif( cur >= one_too_much )\n\t\t{\n\t\t\tstyler.ColourTo( cur - 1, SCE_OPAL_COMMENT_LINE );\n\t\t\treturn false; // STOP\n\t\t}\n\n\t\tch = styler.SafeGetCharAt( cur );\n\t\tif( fifteen_found )\n\t\t{\n/*\n\t\t\tif( ch == '\\012' )\n\t\t\t{\n\t\t\t\t// One newline on Windows (015, 012)\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// One newline on MAC (015) and another char\n\t\t\t}\n*/\n\t\t\tcur--;\n\t\t\tstyler.ColourTo( cur - 1, SCE_OPAL_COMMENT_LINE );\n\t\t\tstyler.StartSegment( cur );\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( ch == '\\015' )\n\t\t\t{\n\t\t\t\tfifteen_found = true;\n\t\t\t}\n\t\t\telse if( ch == '\\012' )\n\t\t\t{\n\t\t\t\t// One newline on Linux (012)\n\t\t\t\tstyler.ColourTo( cur - 1, SCE_OPAL_COMMENT_LINE );\n\t\t\t\tstyler.StartSegment( cur );\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n}\n\ninline bool HandlePar( unsigned int & cur, Accessor & styler )\n{\n\tstyler.ColourTo( cur, SCE_OPAL_PAR );\n\n\tcur++;\n\n\tstyler.StartSegment( cur );\n\treturn true;\n}\n\ninline bool HandleSpace( unsigned int & cur, unsigned int one_too_much, Accessor & styler )\n{\n\tchar ch;\n\n\tcur++;\n\tfor( ; ; )\n\t{\n\t\tif( cur >= one_too_much )\n\t\t{\n\t\t\tstyler.ColourTo( cur - 1, SCE_OPAL_SPACE );\n\t\t\treturn false;\n\t\t}\n\n\t\tch = styler.SafeGetCharAt( cur );\n\t\tswitch( ch )\n\t\t{\n\t\tcase ' ':\n\t\tcase '\\t':\n\t\tcase '\\015':\n\t\tcase '\\012':\n\t\t\tcur++;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tstyler.ColourTo( cur - 1, SCE_OPAL_SPACE );\n\t\t\tstyler.StartSegment( cur );\n\t\t\treturn true;\n\t\t}\n\t}\n}\n\ninline bool HandleInteger( unsigned int & cur, unsigned int one_too_much, Accessor & styler )\n{\n\tchar ch;\n\n\tfor( ; ; )\n\t{\n\t\tcur++;\n\t\tif( cur >= one_too_much )\n\t\t{\n\t\t\tstyler.ColourTo( cur - 1, SCE_OPAL_INTEGER );\n\t\t\treturn false; // STOP\n\t\t}\n\n\t\tch = styler.SafeGetCharAt( cur );\n\t\tif( !( IsASCII( ch ) && isdigit( ch ) ) )\n\t\t{\n\t\t\tstyler.ColourTo( cur - 1, SCE_OPAL_INTEGER );\n\t\t\tstyler.StartSegment( cur );\n\t\t\treturn true;\n\t\t}\n\t}\n}\n\ninline bool HandleWord( unsigned int & cur, unsigned int one_too_much, Accessor & styler, WordList * keywordlists[] )\n{\n\tchar ch;\n\tconst unsigned int beg = cur;\n\n\tcur++;\n\tfor( ; ; )\n\t{\n\t\tch = styler.SafeGetCharAt( cur );\n\t\tif( ( ch != '_' ) && ( ch != '-' ) &&\n\t\t\t!( IsASCII( ch ) && ( islower( ch ) || isupper( ch ) || isdigit( ch ) ) ) ) break;\n\n\t\tcur++;\n\t\tif( cur >= one_too_much )\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst int ide_len = cur - beg + 1;\n\tchar * ide = new char[ ide_len ];\n\tgetRange( beg, cur, styler, ide, ide_len );\n\n\tWordList & keywords    = *keywordlists[ 0 ];\n\tWordList & classwords  = *keywordlists[ 1 ];\n\n\tif( keywords.InList( ide ) ) // Keyword\n\t{\n\t\tdelete [] ide;\n\n\t\tstyler.ColourTo( cur - 1, SCE_OPAL_KEYWORD );\n\t\tif( cur >= one_too_much )\n\t\t{\n\t\t\treturn false; // STOP\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstyler.StartSegment( cur );\n\t\t\treturn true;\n\t\t}\n\t}\n\telse if( classwords.InList( ide ) ) // Sort\n\t{\n\t\tdelete [] ide;\n\n\t\tstyler.ColourTo( cur - 1, SCE_OPAL_SORT );\n\t\tif( cur >= one_too_much )\n\t\t{\n\t\t\treturn false; // STOP\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstyler.StartSegment( cur );\n\t\t\treturn true;\n\t\t}\n\t}\n\telse if( !strcmp( ide, \"true\" ) || !strcmp( ide, \"false\" ) ) // Bool const\n\t{\n\t\tdelete [] ide;\n\n\t\tstyler.ColourTo( cur - 1, SCE_OPAL_BOOL_CONST );\n\t\tif( cur >= one_too_much )\n\t\t{\n\t\t\treturn false; // STOP\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstyler.StartSegment( cur );\n\t\t\treturn true;\n\t\t}\n\t}\n\telse // Unknown keyword\n\t{\n\t\tdelete [] ide;\n\n\t\tstyler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );\n\t\tif( cur >= one_too_much )\n\t\t{\n\t\t\treturn false; // STOP\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstyler.StartSegment( cur );\n\t\t\treturn true;\n\t\t}\n\t}\n\n}\n\ninline bool HandleSkip( unsigned int & cur, unsigned int one_too_much, Accessor & styler )\n{\n\tcur++;\n\tstyler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );\n\tif( cur >= one_too_much )\n\t{\n\t\treturn false; // STOP\n\t}\n\telse\n\t{\n\t\tstyler.StartSegment( cur );\n\t\treturn true;\n\t}\n}\n\nstatic void ColouriseOpalDoc( unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor & styler )\n{\n\tstyler.StartAt( startPos );\n\tstyler.StartSegment( startPos );\n\n\tunsigned int & cur = startPos;\n\tconst unsigned int one_too_much = startPos + length;\n\n\tint state = initStyle;\n\n\tfor( ; ; )\n\t{\n\t\tswitch( state )\n\t\t{\n\t\tcase SCE_OPAL_KEYWORD:\n\t\tcase SCE_OPAL_SORT:\n\t\t\tif( !HandleWord( cur, one_too_much, styler, keywordlists ) ) return;\n\t\t\tstate = SCE_OPAL_DEFAULT;\n\t\t\tbreak;\n\n\t\tcase SCE_OPAL_INTEGER:\n\t\t\tif( !HandleInteger( cur, one_too_much, styler ) ) return;\n\t\t\tstate = SCE_OPAL_DEFAULT;\n\t\t\tbreak;\n\n\t\tcase SCE_OPAL_COMMENT_BLOCK:\n\t\t\tif( !HandleCommentBlock( cur, one_too_much, styler, false ) ) return;\n\t\t\tstate = SCE_OPAL_DEFAULT;\n\t\t\tbreak;\n\n\t\tcase SCE_OPAL_COMMENT_LINE:\n\t\t\tif( !HandleCommentLine( cur, one_too_much, styler, false ) ) return;\n\t\t\tstate = SCE_OPAL_DEFAULT;\n\t\t\tbreak;\n\n\t\tcase SCE_OPAL_STRING:\n\t\t\tif( !HandleString( cur, one_too_much, styler ) ) return;\n\t\t\tstate = SCE_OPAL_DEFAULT;\n\t\t\tbreak;\n\n\t\tdefault: // SCE_OPAL_DEFAULT:\n\t\t\t{\n\t\t\t\tchar ch = styler.SafeGetCharAt( cur );\n\n\t\t\t\tswitch( ch )\n\t\t\t\t{\n\t\t\t\t// String\n\t\t\t\tcase '\"':\n\t\t\t\t\tif( !HandleString( cur, one_too_much, styler ) ) return;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// Comment block\n\t\t\t\tcase '/':\n\t\t\t\t\tif( !HandleCommentBlock( cur, one_too_much, styler, true ) ) return;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// Comment line\n\t\t\t\tcase '-':\n\t\t\t\t\tif( !HandleCommentLine( cur, one_too_much, styler, true ) ) return;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// Par\n\t\t\t\tcase '(':\n\t\t\t\tcase ')':\n\t\t\t\tcase '[':\n\t\t\t\tcase ']':\n\t\t\t\tcase '{':\n\t\t\t\tcase '}':\n\t\t\t\t\tif( !HandlePar( cur, styler ) ) return;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// Whitespace\n\t\t\t\tcase ' ':\n\t\t\t\tcase '\\t':\n\t\t\t\tcase '\\015':\n\t\t\t\tcase '\\012':\n\t\t\t\t\tif( !HandleSpace( cur, one_too_much, styler ) ) return;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t{\n\t\t\t\t\t\t// Integer\n\t\t\t\t\t\tif( IsASCII( ch ) && isdigit( ch ) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif( !HandleInteger( cur, one_too_much, styler ) ) return;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Keyword\n\t\t\t\t\t\telse if( IsASCII( ch ) && ( islower( ch ) || isupper( ch ) ) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif( !HandleWord( cur, one_too_much, styler, keywordlists ) ) return;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Skip\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif( !HandleSkip( cur, one_too_much, styler ) ) return;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatic const char * const opalWordListDesc[] = {\n\t\"Keywords\",\n\t\"Sorts\",\n\t0\n};\n\nLexerModule lmOpal(SCLEX_OPAL, ColouriseOpalDoc, \"opal\", NULL, opalWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexOthers.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexOthers.cxx\n ** Lexers for batch files, diff results, properties files, make files and error lists.\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic bool strstart(const char *haystack, const char *needle) {\n\treturn strncmp(haystack, needle, strlen(needle)) == 0;\n}\n\nstatic bool Is0To9(char ch) {\n\treturn (ch >= '0') && (ch <= '9');\n}\n\nstatic bool Is1To9(char ch) {\n\treturn (ch >= '1') && (ch <= '9');\n}\n\nstatic bool IsAlphabetic(int ch) {\n\treturn IsASCII(ch) && isalpha(ch);\n}\n\nstatic inline bool AtEOL(Accessor &styler, unsigned int i) {\n\treturn (styler[i] == '\\n') ||\n\t       ((styler[i] == '\\r') && (styler.SafeGetCharAt(i + 1) != '\\n'));\n}\n\n// Tests for BATCH Operators\nstatic bool IsBOperator(char ch) {\n\treturn (ch == '=') || (ch == '+') || (ch == '>') || (ch == '<') ||\n\t\t(ch == '|') || (ch == '?') || (ch == '*');\n}\n\n// Tests for BATCH Separators\nstatic bool IsBSeparator(char ch) {\n\treturn (ch == '\\\\') || (ch == '.') || (ch == ';') ||\n\t\t(ch == '\\\"') || (ch == '\\'') || (ch == '/');\n}\n\nstatic void ColouriseBatchLine(\n    char *lineBuffer,\n    unsigned int lengthLine,\n    unsigned int startLine,\n    unsigned int endPos,\n    WordList *keywordlists[],\n    Accessor &styler) {\n\n\tunsigned int offset = 0;\t// Line Buffer Offset\n\tunsigned int cmdLoc;\t\t// External Command / Program Location\n\tchar wordBuffer[81];\t\t// Word Buffer - large to catch long paths\n\tunsigned int wbl;\t\t// Word Buffer Length\n\tunsigned int wbo;\t\t// Word Buffer Offset - also Special Keyword Buffer Length\n\tWordList &keywords = *keywordlists[0];      // Internal Commands\n\tWordList &keywords2 = *keywordlists[1];     // External Commands (optional)\n\n\t// CHOICE, ECHO, GOTO, PROMPT and SET have Default Text that may contain Regular Keywords\n\t//   Toggling Regular Keyword Checking off improves readability\n\t// Other Regular Keywords and External Commands / Programs might also benefit from toggling\n\t//   Need a more robust algorithm to properly toggle Regular Keyword Checking\n\tbool continueProcessing = true;\t// Used to toggle Regular Keyword Checking\n\t// Special Keywords are those that allow certain characters without whitespace after the command\n\t// Examples are: cd. cd\\ md. rd. dir| dir> echo: echo. path=\n\t// Special Keyword Buffer used to determine if the first n characters is a Keyword\n\tchar sKeywordBuffer[10];\t// Special Keyword Buffer\n\tbool sKeywordFound;\t\t// Exit Special Keyword for-loop if found\n\n\t// Skip initial spaces\n\twhile ((offset < lengthLine) && (isspacechar(lineBuffer[offset]))) {\n\t\toffset++;\n\t}\n\t// Colorize Default Text\n\tstyler.ColourTo(startLine + offset - 1, SCE_BAT_DEFAULT);\n\t// Set External Command / Program Location\n\tcmdLoc = offset;\n\n\t// Check for Fake Label (Comment) or Real Label - return if found\n\tif (lineBuffer[offset] == ':') {\n\t\tif (lineBuffer[offset + 1] == ':') {\n\t\t\t// Colorize Fake Label (Comment) - :: is similar to REM, see http://content.techweb.com/winmag/columns/explorer/2000/21.htm\n\t\t\tstyler.ColourTo(endPos, SCE_BAT_COMMENT);\n\t\t} else {\n\t\t\t// Colorize Real Label\n\t\t\tstyler.ColourTo(endPos, SCE_BAT_LABEL);\n\t\t}\n\t\treturn;\n\t// Check for Drive Change (Drive Change is internal command) - return if found\n\t} else if ((IsAlphabetic(lineBuffer[offset])) &&\n\t\t(lineBuffer[offset + 1] == ':') &&\n\t\t((isspacechar(lineBuffer[offset + 2])) ||\n\t\t(((lineBuffer[offset + 2] == '\\\\')) &&\n\t\t(isspacechar(lineBuffer[offset + 3]))))) {\n\t\t// Colorize Regular Keyword\n\t\tstyler.ColourTo(endPos, SCE_BAT_WORD);\n\t\treturn;\n\t}\n\n\t// Check for Hide Command (@ECHO OFF/ON)\n\tif (lineBuffer[offset] == '@') {\n\t\tstyler.ColourTo(startLine + offset, SCE_BAT_HIDE);\n\t\toffset++;\n\t}\n\t// Skip next spaces\n\twhile ((offset < lengthLine) && (isspacechar(lineBuffer[offset]))) {\n\t\toffset++;\n\t}\n\n\t// Read remainder of line word-at-a-time or remainder-of-word-at-a-time\n\twhile (offset < lengthLine) {\n\t\tif (offset > startLine) {\n\t\t\t// Colorize Default Text\n\t\t\tstyler.ColourTo(startLine + offset - 1, SCE_BAT_DEFAULT);\n\t\t}\n\t\t// Copy word from Line Buffer into Word Buffer\n\t\twbl = 0;\n\t\tfor (; offset < lengthLine && wbl < 80 &&\n\t\t        !isspacechar(lineBuffer[offset]); wbl++, offset++) {\n\t\t\twordBuffer[wbl] = static_cast<char>(tolower(lineBuffer[offset]));\n\t\t}\n\t\twordBuffer[wbl] = '\\0';\n\t\twbo = 0;\n\n\t\t// Check for Comment - return if found\n\t\tif (CompareCaseInsensitive(wordBuffer, \"rem\") == 0) {\n\t\t\tstyler.ColourTo(endPos, SCE_BAT_COMMENT);\n\t\t\treturn;\n\t\t}\n\t\t// Check for Separator\n\t\tif (IsBSeparator(wordBuffer[0])) {\n\t\t\t// Check for External Command / Program\n\t\t\tif ((cmdLoc == offset - wbl) &&\n\t\t\t\t((wordBuffer[0] == ':') ||\n\t\t\t\t(wordBuffer[0] == '\\\\') ||\n\t\t\t\t(wordBuffer[0] == '.'))) {\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - 1);\n\t\t\t\t// Colorize External Command / Program\n\t\t\t\tif (!keywords2) {\n\t\t\t\t\tstyler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);\n\t\t\t\t} else if (keywords2.InList(wordBuffer)) {\n\t\t\t\t\tstyler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);\n\t\t\t\t} else {\n\t\t\t\t\tstyler.ColourTo(startLine + offset - 1, SCE_BAT_DEFAULT);\n\t\t\t\t}\n\t\t\t\t// Reset External Command / Program Location\n\t\t\t\tcmdLoc = offset;\n\t\t\t} else {\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - 1);\n\t\t\t\t// Colorize Default Text\n\t\t\t\tstyler.ColourTo(startLine + offset - 1, SCE_BAT_DEFAULT);\n\t\t\t}\n\t\t// Check for Regular Keyword in list\n\t\t} else if ((keywords.InList(wordBuffer)) &&\n\t\t\t(continueProcessing)) {\n\t\t\t// ECHO, GOTO, PROMPT and SET require no further Regular Keyword Checking\n\t\t\tif ((CompareCaseInsensitive(wordBuffer, \"echo\") == 0) ||\n\t\t\t\t(CompareCaseInsensitive(wordBuffer, \"goto\") == 0) ||\n\t\t\t\t(CompareCaseInsensitive(wordBuffer, \"prompt\") == 0) ||\n\t\t\t\t(CompareCaseInsensitive(wordBuffer, \"set\") == 0)) {\n\t\t\t\tcontinueProcessing = false;\n\t\t\t}\n\t\t\t// Identify External Command / Program Location for ERRORLEVEL, and EXIST\n\t\t\tif ((CompareCaseInsensitive(wordBuffer, \"errorlevel\") == 0) ||\n\t\t\t\t(CompareCaseInsensitive(wordBuffer, \"exist\") == 0)) {\n\t\t\t\t// Reset External Command / Program Location\n\t\t\t\tcmdLoc = offset;\n\t\t\t\t// Skip next spaces\n\t\t\t\twhile ((cmdLoc < lengthLine) &&\n\t\t\t\t\t(isspacechar(lineBuffer[cmdLoc]))) {\n\t\t\t\t\tcmdLoc++;\n\t\t\t\t}\n\t\t\t\t// Skip comparison\n\t\t\t\twhile ((cmdLoc < lengthLine) &&\n\t\t\t\t\t(!isspacechar(lineBuffer[cmdLoc]))) {\n\t\t\t\t\tcmdLoc++;\n\t\t\t\t}\n\t\t\t\t// Skip next spaces\n\t\t\t\twhile ((cmdLoc < lengthLine) &&\n\t\t\t\t\t(isspacechar(lineBuffer[cmdLoc]))) {\n\t\t\t\t\tcmdLoc++;\n\t\t\t\t}\n\t\t\t// Identify External Command / Program Location for CALL, DO, LOADHIGH and LH\n\t\t\t} else if ((CompareCaseInsensitive(wordBuffer, \"call\") == 0) ||\n\t\t\t\t(CompareCaseInsensitive(wordBuffer, \"do\") == 0) ||\n\t\t\t\t(CompareCaseInsensitive(wordBuffer, \"loadhigh\") == 0) ||\n\t\t\t\t(CompareCaseInsensitive(wordBuffer, \"lh\") == 0)) {\n\t\t\t\t// Reset External Command / Program Location\n\t\t\t\tcmdLoc = offset;\n\t\t\t\t// Skip next spaces\n\t\t\t\twhile ((cmdLoc < lengthLine) &&\n\t\t\t\t\t(isspacechar(lineBuffer[cmdLoc]))) {\n\t\t\t\t\tcmdLoc++;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Colorize Regular keyword\n\t\t\tstyler.ColourTo(startLine + offset - 1, SCE_BAT_WORD);\n\t\t\t// No need to Reset Offset\n\t\t// Check for Special Keyword in list, External Command / Program, or Default Text\n\t\t} else if ((wordBuffer[0] != '%') &&\n\t\t\t\t   (wordBuffer[0] != '!') &&\n\t\t\t(!IsBOperator(wordBuffer[0])) &&\n\t\t\t(continueProcessing)) {\n\t\t\t// Check for Special Keyword\n\t\t\t//     Affected Commands are in Length range 2-6\n\t\t\t//     Good that ERRORLEVEL, EXIST, CALL, DO, LOADHIGH, and LH are unaffected\n\t\t\tsKeywordFound = false;\n\t\t\tfor (unsigned int keywordLength = 2; keywordLength < wbl && keywordLength < 7 && !sKeywordFound; keywordLength++) {\n\t\t\t\twbo = 0;\n\t\t\t\t// Copy Keyword Length from Word Buffer into Special Keyword Buffer\n\t\t\t\tfor (; wbo < keywordLength; wbo++) {\n\t\t\t\t\tsKeywordBuffer[wbo] = static_cast<char>(wordBuffer[wbo]);\n\t\t\t\t}\n\t\t\t\tsKeywordBuffer[wbo] = '\\0';\n\t\t\t\t// Check for Special Keyword in list\n\t\t\t\tif ((keywords.InList(sKeywordBuffer)) &&\n\t\t\t\t\t((IsBOperator(wordBuffer[wbo])) ||\n\t\t\t\t\t(IsBSeparator(wordBuffer[wbo])))) {\n\t\t\t\t\tsKeywordFound = true;\n\t\t\t\t\t// ECHO requires no further Regular Keyword Checking\n\t\t\t\t\tif (CompareCaseInsensitive(sKeywordBuffer, \"echo\") == 0) {\n\t\t\t\t\t\tcontinueProcessing = false;\n\t\t\t\t\t}\n\t\t\t\t\t// Colorize Special Keyword as Regular Keyword\n\t\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_WORD);\n\t\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\t\toffset -= (wbl - wbo);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Check for External Command / Program or Default Text\n\t\t\tif (!sKeywordFound) {\n\t\t\t\twbo = 0;\n\t\t\t\t// Check for External Command / Program\n\t\t\t\tif (cmdLoc == offset - wbl) {\n\t\t\t\t\t// Read up to %, Operator or Separator\n\t\t\t\t\twhile ((wbo < wbl) &&\n\t\t\t\t\t\t(wordBuffer[wbo] != '%') &&\n\t\t\t\t\t\t(wordBuffer[wbo] != '!') &&\n\t\t\t\t\t\t(!IsBOperator(wordBuffer[wbo])) &&\n\t\t\t\t\t\t(!IsBSeparator(wordBuffer[wbo]))) {\n\t\t\t\t\t\twbo++;\n\t\t\t\t\t}\n\t\t\t\t\t// Reset External Command / Program Location\n\t\t\t\t\tcmdLoc = offset - (wbl - wbo);\n\t\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\t\toffset -= (wbl - wbo);\n\t\t\t\t\t// CHOICE requires no further Regular Keyword Checking\n\t\t\t\t\tif (CompareCaseInsensitive(wordBuffer, \"choice\") == 0) {\n\t\t\t\t\t\tcontinueProcessing = false;\n\t\t\t\t\t}\n\t\t\t\t\t// Check for START (and its switches) - What follows is External Command \\ Program\n\t\t\t\t\tif (CompareCaseInsensitive(wordBuffer, \"start\") == 0) {\n\t\t\t\t\t\t// Reset External Command / Program Location\n\t\t\t\t\t\tcmdLoc = offset;\n\t\t\t\t\t\t// Skip next spaces\n\t\t\t\t\t\twhile ((cmdLoc < lengthLine) &&\n\t\t\t\t\t\t\t(isspacechar(lineBuffer[cmdLoc]))) {\n\t\t\t\t\t\t\tcmdLoc++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Reset External Command / Program Location if command switch detected\n\t\t\t\t\t\tif (lineBuffer[cmdLoc] == '/') {\n\t\t\t\t\t\t\t// Skip command switch\n\t\t\t\t\t\t\twhile ((cmdLoc < lengthLine) &&\n\t\t\t\t\t\t\t\t(!isspacechar(lineBuffer[cmdLoc]))) {\n\t\t\t\t\t\t\t\tcmdLoc++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Skip next spaces\n\t\t\t\t\t\t\twhile ((cmdLoc < lengthLine) &&\n\t\t\t\t\t\t\t\t(isspacechar(lineBuffer[cmdLoc]))) {\n\t\t\t\t\t\t\t\tcmdLoc++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Colorize External Command / Program\n\t\t\t\t\tif (!keywords2) {\n\t\t\t\t\t\tstyler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);\n\t\t\t\t\t} else if (keywords2.InList(wordBuffer)) {\n\t\t\t\t\t\tstyler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstyler.ColourTo(startLine + offset - 1, SCE_BAT_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t\t// No need to Reset Offset\n\t\t\t\t// Check for Default Text\n\t\t\t\t} else {\n\t\t\t\t\t// Read up to %, Operator or Separator\n\t\t\t\t\twhile ((wbo < wbl) &&\n\t\t\t\t\t\t(wordBuffer[wbo] != '%') &&\n\t\t\t\t\t\t(wordBuffer[wbo] != '!') &&\n\t\t\t\t\t\t(!IsBOperator(wordBuffer[wbo])) &&\n\t\t\t\t\t\t(!IsBSeparator(wordBuffer[wbo]))) {\n\t\t\t\t\t\twbo++;\n\t\t\t\t\t}\n\t\t\t\t\t// Colorize Default Text\n\t\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_DEFAULT);\n\t\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\t\toffset -= (wbl - wbo);\n\t\t\t\t}\n\t\t\t}\n\t\t// Check for Argument  (%n), Environment Variable (%x...%) or Local Variable (%%a)\n\t\t} else if (wordBuffer[0] == '%') {\n\t\t\t// Colorize Default Text\n\t\t\tstyler.ColourTo(startLine + offset - 1 - wbl, SCE_BAT_DEFAULT);\n\t\t\twbo++;\n\t\t\t// Search to end of word for second % (can be a long path)\n\t\t\twhile ((wbo < wbl) &&\n\t\t\t\t(wordBuffer[wbo] != '%') &&\n\t\t\t\t(!IsBOperator(wordBuffer[wbo])) &&\n\t\t\t\t(!IsBSeparator(wordBuffer[wbo]))) {\n\t\t\t\twbo++;\n\t\t\t}\n\t\t\t// Check for Argument (%n) or (%*)\n\t\t\tif (((Is0To9(wordBuffer[1])) || (wordBuffer[1] == '*')) &&\n\t\t\t\t(wordBuffer[wbo] != '%')) {\n\t\t\t\t// Check for External Command / Program\n\t\t\t\tif (cmdLoc == offset - wbl) {\n\t\t\t\t\tcmdLoc = offset - (wbl - 2);\n\t\t\t\t}\n\t\t\t\t// Colorize Argument\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - 2), SCE_BAT_IDENTIFIER);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - 2);\n\t\t\t// Check for Expanded Argument (%~...) / Variable (%%~...)\n\t\t\t} else if (((wbl > 1) && (wordBuffer[1] == '~')) ||\n\t\t\t\t((wbl > 2) && (wordBuffer[1] == '%') && (wordBuffer[2] == '~'))) {\n\t\t\t\t// Check for External Command / Program\n\t\t\t\tif (cmdLoc == offset - wbl) {\n\t\t\t\t\tcmdLoc = offset - (wbl - wbo);\n\t\t\t\t}\n\t\t\t\t// Colorize Expanded Argument / Variable\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_IDENTIFIER);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - wbo);\n\t\t\t// Check for Environment Variable (%x...%)\n\t\t\t} else if ((wordBuffer[1] != '%') &&\n\t\t\t\t(wordBuffer[wbo] == '%')) {\n\t\t\t\twbo++;\n\t\t\t\t// Check for External Command / Program\n\t\t\t\tif (cmdLoc == offset - wbl) {\n\t\t\t\t\tcmdLoc = offset - (wbl - wbo);\n\t\t\t\t}\n\t\t\t\t// Colorize Environment Variable\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_IDENTIFIER);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - wbo);\n\t\t\t// Check for Local Variable (%%a)\n\t\t\t} else if (\n\t\t\t\t(wbl > 2) &&\n\t\t\t\t(wordBuffer[1] == '%') &&\n\t\t\t\t(wordBuffer[2] != '%') &&\n\t\t\t\t(!IsBOperator(wordBuffer[2])) &&\n\t\t\t\t(!IsBSeparator(wordBuffer[2]))) {\n\t\t\t\t// Check for External Command / Program\n\t\t\t\tif (cmdLoc == offset - wbl) {\n\t\t\t\t\tcmdLoc = offset - (wbl - 3);\n\t\t\t\t}\n\t\t\t\t// Colorize Local Variable\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - 3), SCE_BAT_IDENTIFIER);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - 3);\n\t\t\t}\n\t\t// Check for Environment Variable (!x...!)\n\t\t} else if (wordBuffer[0] == '!') {\n\t\t\t// Colorize Default Text\n\t\t\tstyler.ColourTo(startLine + offset - 1 - wbl, SCE_BAT_DEFAULT);\n\t\t\twbo++;\n\t\t\t// Search to end of word for second ! (can be a long path)\n\t\t\twhile ((wbo < wbl) &&\n\t\t\t\t(wordBuffer[wbo] != '!') &&\n\t\t\t\t(!IsBOperator(wordBuffer[wbo])) &&\n\t\t\t\t(!IsBSeparator(wordBuffer[wbo]))) {\n\t\t\t\twbo++;\n\t\t\t}\n\t\t\tif (wordBuffer[wbo] == '!') {\n\t\t\t\twbo++;\n\t\t\t\t// Check for External Command / Program\n\t\t\t\tif (cmdLoc == offset - wbl) {\n\t\t\t\t\tcmdLoc = offset - (wbl - wbo);\n\t\t\t\t}\n\t\t\t\t// Colorize Environment Variable\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_IDENTIFIER);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - wbo);\n\t\t\t}\n\t\t// Check for Operator\n\t\t} else if (IsBOperator(wordBuffer[0])) {\n\t\t\t// Colorize Default Text\n\t\t\tstyler.ColourTo(startLine + offset - 1 - wbl, SCE_BAT_DEFAULT);\n\t\t\t// Check for Comparison Operator\n\t\t\tif ((wordBuffer[0] == '=') && (wordBuffer[1] == '=')) {\n\t\t\t\t// Identify External Command / Program Location for IF\n\t\t\t\tcmdLoc = offset;\n\t\t\t\t// Skip next spaces\n\t\t\t\twhile ((cmdLoc < lengthLine) &&\n\t\t\t\t\t(isspacechar(lineBuffer[cmdLoc]))) {\n\t\t\t\t\tcmdLoc++;\n\t\t\t\t}\n\t\t\t\t// Colorize Comparison Operator\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - 2), SCE_BAT_OPERATOR);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - 2);\n\t\t\t// Check for Pipe Operator\n\t\t\t} else if (wordBuffer[0] == '|') {\n\t\t\t\t// Reset External Command / Program Location\n\t\t\t\tcmdLoc = offset - wbl + 1;\n\t\t\t\t// Skip next spaces\n\t\t\t\twhile ((cmdLoc < lengthLine) &&\n\t\t\t\t\t(isspacechar(lineBuffer[cmdLoc]))) {\n\t\t\t\t\tcmdLoc++;\n\t\t\t\t}\n\t\t\t\t// Colorize Pipe Operator\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - 1), SCE_BAT_OPERATOR);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - 1);\n\t\t\t// Check for Other Operator\n\t\t\t} else {\n\t\t\t\t// Check for > Operator\n\t\t\t\tif (wordBuffer[0] == '>') {\n\t\t\t\t\t// Turn Keyword and External Command / Program checking back on\n\t\t\t\t\tcontinueProcessing = true;\n\t\t\t\t}\n\t\t\t\t// Colorize Other Operator\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - 1), SCE_BAT_OPERATOR);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - 1);\n\t\t\t}\n\t\t// Check for Default Text\n\t\t} else {\n\t\t\t// Read up to %, Operator or Separator\n\t\t\twhile ((wbo < wbl) &&\n\t\t\t\t(wordBuffer[wbo] != '%') &&\n\t\t\t\t(wordBuffer[wbo] != '!') &&\n\t\t\t\t(!IsBOperator(wordBuffer[wbo])) &&\n\t\t\t\t(!IsBSeparator(wordBuffer[wbo]))) {\n\t\t\t\twbo++;\n\t\t\t}\n\t\t\t// Colorize Default Text\n\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_DEFAULT);\n\t\t\t// Reset Offset to re-process remainder of word\n\t\t\toffset -= (wbl - wbo);\n\t\t}\n\t\t// Skip next spaces - nothing happens if Offset was Reset\n\t\twhile ((offset < lengthLine) && (isspacechar(lineBuffer[offset]))) {\n\t\t\toffset++;\n\t\t}\n\t}\n\t// Colorize Default Text for remainder of line - currently not lexed\n\tstyler.ColourTo(endPos, SCE_BAT_DEFAULT);\n}\n\nstatic void ColouriseBatchDoc(\n    unsigned int startPos,\n    int length,\n    int /*initStyle*/,\n    WordList *keywordlists[],\n    Accessor &styler) {\n\n\tchar lineBuffer[1024];\n\n\tstyler.StartAt(startPos);\n\tstyler.StartSegment(startPos);\n\tunsigned int linePos = 0;\n\tunsigned int startLine = startPos;\n\tfor (unsigned int i = startPos; i < startPos + length; i++) {\n\t\tlineBuffer[linePos++] = styler[i];\n\t\tif (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {\n\t\t\t// End of line (or of line buffer) met, colourise it\n\t\t\tlineBuffer[linePos] = '\\0';\n\t\t\tColouriseBatchLine(lineBuffer, linePos, startLine, i, keywordlists, styler);\n\t\t\tlinePos = 0;\n\t\t\tstartLine = i + 1;\n\t\t}\n\t}\n\tif (linePos > 0) {\t// Last line does not have ending characters\n\t\tlineBuffer[linePos] = '\\0';\n\t\tColouriseBatchLine(lineBuffer, linePos, startLine, startPos + length - 1,\n\t\t                   keywordlists, styler);\n\t}\n}\n\n#define DIFF_BUFFER_START_SIZE 16\n// Note that ColouriseDiffLine analyzes only the first DIFF_BUFFER_START_SIZE\n// characters of each line to classify the line.\n\nstatic void ColouriseDiffLine(char *lineBuffer, int endLine, Accessor &styler) {\n\t// It is needed to remember the current state to recognize starting\n\t// comment lines before the first \"diff \" or \"--- \". If a real\n\t// difference starts then each line starting with ' ' is a whitespace\n\t// otherwise it is considered a comment (Only in..., Binary file...)\n\tif (0 == strncmp(lineBuffer, \"diff \", 5)) {\n\t\tstyler.ColourTo(endLine, SCE_DIFF_COMMAND);\n\t} else if (0 == strncmp(lineBuffer, \"Index: \", 7)) {  // For subversion's diff\n\t\tstyler.ColourTo(endLine, SCE_DIFF_COMMAND);\n\t} else if (0 == strncmp(lineBuffer, \"---\", 3) && lineBuffer[3] != '-') {\n\t\t// In a context diff, --- appears in both the header and the position markers\n\t\tif (lineBuffer[3] == ' ' && atoi(lineBuffer + 4) && !strchr(lineBuffer, '/'))\n\t\t\tstyler.ColourTo(endLine, SCE_DIFF_POSITION);\n\t\telse if (lineBuffer[3] == '\\r' || lineBuffer[3] == '\\n')\n\t\t\tstyler.ColourTo(endLine, SCE_DIFF_POSITION);\n\t\telse\n\t\t\tstyler.ColourTo(endLine, SCE_DIFF_HEADER);\n\t} else if (0 == strncmp(lineBuffer, \"+++ \", 4)) {\n\t\t// I don't know of any diff where \"+++ \" is a position marker, but for\n\t\t// consistency, do the same as with \"--- \" and \"*** \".\n\t\tif (atoi(lineBuffer+4) && !strchr(lineBuffer, '/'))\n\t\t\tstyler.ColourTo(endLine, SCE_DIFF_POSITION);\n\t\telse\n\t\t\tstyler.ColourTo(endLine, SCE_DIFF_HEADER);\n\t} else if (0 == strncmp(lineBuffer, \"====\", 4)) {  // For p4's diff\n\t\tstyler.ColourTo(endLine, SCE_DIFF_HEADER);\n\t} else if (0 == strncmp(lineBuffer, \"***\", 3)) {\n\t\t// In a context diff, *** appears in both the header and the position markers.\n\t\t// Also ******** is a chunk header, but here it's treated as part of the\n\t\t// position marker since there is no separate style for a chunk header.\n\t\tif (lineBuffer[3] == ' ' && atoi(lineBuffer+4) && !strchr(lineBuffer, '/'))\n\t\t\tstyler.ColourTo(endLine, SCE_DIFF_POSITION);\n\t\telse if (lineBuffer[3] == '*')\n\t\t\tstyler.ColourTo(endLine, SCE_DIFF_POSITION);\n\t\telse\n\t\t\tstyler.ColourTo(endLine, SCE_DIFF_HEADER);\n\t} else if (0 == strncmp(lineBuffer, \"? \", 2)) {    // For difflib\n\t\tstyler.ColourTo(endLine, SCE_DIFF_HEADER);\n\t} else if (lineBuffer[0] == '@') {\n\t\tstyler.ColourTo(endLine, SCE_DIFF_POSITION);\n\t} else if (lineBuffer[0] >= '0' && lineBuffer[0] <= '9') {\n\t\tstyler.ColourTo(endLine, SCE_DIFF_POSITION);\n\t} else if (lineBuffer[0] == '-' || lineBuffer[0] == '<') {\n\t\tstyler.ColourTo(endLine, SCE_DIFF_DELETED);\n\t} else if (lineBuffer[0] == '+' || lineBuffer[0] == '>') {\n\t\tstyler.ColourTo(endLine, SCE_DIFF_ADDED);\n\t} else if (lineBuffer[0] == '!') {\n\t\tstyler.ColourTo(endLine, SCE_DIFF_CHANGED);\n\t} else if (lineBuffer[0] != ' ') {\n\t\tstyler.ColourTo(endLine, SCE_DIFF_COMMENT);\n\t} else {\n\t\tstyler.ColourTo(endLine, SCE_DIFF_DEFAULT);\n\t}\n}\n\nstatic void ColouriseDiffDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {\n\tchar lineBuffer[DIFF_BUFFER_START_SIZE] = \"\";\n\tstyler.StartAt(startPos);\n\tstyler.StartSegment(startPos);\n\tunsigned int linePos = 0;\n\tfor (unsigned int i = startPos; i < startPos + length; i++) {\n\t\tif (AtEOL(styler, i)) {\n\t\t\tif (linePos < DIFF_BUFFER_START_SIZE) {\n\t\t\t\tlineBuffer[linePos] = 0;\n\t\t\t}\n\t\t\tColouriseDiffLine(lineBuffer, i, styler);\n\t\t\tlinePos = 0;\n\t\t} else if (linePos < DIFF_BUFFER_START_SIZE - 1) {\n\t\t\tlineBuffer[linePos++] = styler[i];\n\t\t} else if (linePos == DIFF_BUFFER_START_SIZE - 1) {\n\t\t\tlineBuffer[linePos++] = 0;\n\t\t}\n\t}\n\tif (linePos > 0) {\t// Last line does not have ending characters\n\t\tif (linePos < DIFF_BUFFER_START_SIZE) {\n\t\t\tlineBuffer[linePos] = 0;\n\t\t}\n\t\tColouriseDiffLine(lineBuffer, startPos + length - 1, styler);\n\t}\n}\n\nstatic void FoldDiffDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {\n\tint curLine = styler.GetLine(startPos);\n\tint curLineStart = styler.LineStart(curLine);\n\tint prevLevel = curLine > 0 ? styler.LevelAt(curLine - 1) : SC_FOLDLEVELBASE;\n\tint nextLevel;\n\n\tdo {\n\t\tint lineType = styler.StyleAt(curLineStart);\n\t\tif (lineType == SCE_DIFF_COMMAND)\n\t\t\tnextLevel = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;\n\t\telse if (lineType == SCE_DIFF_HEADER)\n\t\t\tnextLevel = (SC_FOLDLEVELBASE + 1) | SC_FOLDLEVELHEADERFLAG;\n\t\telse if (lineType == SCE_DIFF_POSITION && styler[curLineStart] != '-')\n\t\t\tnextLevel = (SC_FOLDLEVELBASE + 2) | SC_FOLDLEVELHEADERFLAG;\n\t\telse if (prevLevel & SC_FOLDLEVELHEADERFLAG)\n\t\t\tnextLevel = (prevLevel & SC_FOLDLEVELNUMBERMASK) + 1;\n\t\telse\n\t\t\tnextLevel = prevLevel;\n\n\t\tif ((nextLevel & SC_FOLDLEVELHEADERFLAG) && (nextLevel == prevLevel))\n\t\t\tstyler.SetLevel(curLine-1, prevLevel & ~SC_FOLDLEVELHEADERFLAG);\n\n\t\tstyler.SetLevel(curLine, nextLevel);\n\t\tprevLevel = nextLevel;\n\n\t\tcurLineStart = styler.LineStart(++curLine);\n\t} while (static_cast<int>(startPos) + length > curLineStart);\n}\n\nstatic inline bool isassignchar(unsigned char ch) {\n\treturn (ch == '=') || (ch == ':');\n}\n\nstatic void ColourisePropsLine(\n    char *lineBuffer,\n    unsigned int lengthLine,\n    unsigned int startLine,\n    unsigned int endPos,\n    Accessor &styler,\n    bool allowInitialSpaces) {\n\n\tunsigned int i = 0;\n\tif (allowInitialSpaces) {\n\t\twhile ((i < lengthLine) && isspacechar(lineBuffer[i]))\t// Skip initial spaces\n\t\t\ti++;\n\t} else {\n\t\tif (isspacechar(lineBuffer[i])) // don't allow initial spaces\n\t\t\ti = lengthLine;\n\t}\n\n\tif (i < lengthLine) {\n\t\tif (lineBuffer[i] == '#' || lineBuffer[i] == '!' || lineBuffer[i] == ';') {\n\t\t\tstyler.ColourTo(endPos, SCE_PROPS_COMMENT);\n\t\t} else if (lineBuffer[i] == '[') {\n\t\t\tstyler.ColourTo(endPos, SCE_PROPS_SECTION);\n\t\t} else if (lineBuffer[i] == '@') {\n\t\t\tstyler.ColourTo(startLine + i, SCE_PROPS_DEFVAL);\n\t\t\tif (isassignchar(lineBuffer[i++]))\n\t\t\t\tstyler.ColourTo(startLine + i, SCE_PROPS_ASSIGNMENT);\n\t\t\tstyler.ColourTo(endPos, SCE_PROPS_DEFAULT);\n\t\t} else {\n\t\t\t// Search for the '=' character\n\t\t\twhile ((i < lengthLine) && !isassignchar(lineBuffer[i]))\n\t\t\t\ti++;\n\t\t\tif ((i < lengthLine) && isassignchar(lineBuffer[i])) {\n\t\t\t\tstyler.ColourTo(startLine + i - 1, SCE_PROPS_KEY);\n\t\t\t\tstyler.ColourTo(startLine + i, SCE_PROPS_ASSIGNMENT);\n\t\t\t\tstyler.ColourTo(endPos, SCE_PROPS_DEFAULT);\n\t\t\t} else {\n\t\t\t\tstyler.ColourTo(endPos, SCE_PROPS_DEFAULT);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tstyler.ColourTo(endPos, SCE_PROPS_DEFAULT);\n\t}\n}\n\nstatic void ColourisePropsDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {\n\tchar lineBuffer[1024];\n\tstyler.StartAt(startPos);\n\tstyler.StartSegment(startPos);\n\tunsigned int linePos = 0;\n\tunsigned int startLine = startPos;\n\n\t// property lexer.props.allow.initial.spaces\n\t//\tFor properties files, set to 0 to style all lines that start with whitespace in the default style.\n\t//\tThis is not suitable for SciTE .properties files which use indentation for flow control but\n\t//\tcan be used for RFC2822 text where indentation is used for continuation lines.\n\tbool allowInitialSpaces = styler.GetPropertyInt(\"lexer.props.allow.initial.spaces\", 1) != 0;\n\n\tfor (unsigned int i = startPos; i < startPos + length; i++) {\n\t\tlineBuffer[linePos++] = styler[i];\n\t\tif (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {\n\t\t\t// End of line (or of line buffer) met, colourise it\n\t\t\tlineBuffer[linePos] = '\\0';\n\t\t\tColourisePropsLine(lineBuffer, linePos, startLine, i, styler, allowInitialSpaces);\n\t\t\tlinePos = 0;\n\t\t\tstartLine = i + 1;\n\t\t}\n\t}\n\tif (linePos > 0) {\t// Last line does not have ending characters\n\t\tColourisePropsLine(lineBuffer, linePos, startLine, startPos + length - 1, styler, allowInitialSpaces);\n\t}\n}\n\n// adaption by ksc, using the \"} else {\" trick of 1.53\n// 030721\nstatic void FoldPropsDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tbool headerPoint = false;\n\tint lev;\n\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler[i+1];\n\n\t\tint style = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\n\t\tif (style == SCE_PROPS_SECTION) {\n\t\t\theaderPoint = true;\n\t\t}\n\n\t\tif (atEOL) {\n\t\t\tlev = SC_FOLDLEVELBASE;\n\n\t\t\tif (lineCurrent > 0) {\n\t\t\t\tint levelPrevious = styler.LevelAt(lineCurrent - 1);\n\n\t\t\t\tif (levelPrevious & SC_FOLDLEVELHEADERFLAG) {\n\t\t\t\t\tlev = SC_FOLDLEVELBASE + 1;\n\t\t\t\t} else {\n\t\t\t\t\tlev = levelPrevious & SC_FOLDLEVELNUMBERMASK;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (headerPoint) {\n\t\t\t\tlev = SC_FOLDLEVELBASE;\n\t\t\t}\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\n\t\t\tif (headerPoint) {\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t}\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\n\t\t\tlineCurrent++;\n\t\t\tvisibleChars = 0;\n\t\t\theaderPoint = false;\n\t\t}\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\n\tif (lineCurrent > 0) {\n\t\tint levelPrevious = styler.LevelAt(lineCurrent - 1);\n\t\tif (levelPrevious & SC_FOLDLEVELHEADERFLAG) {\n\t\t\tlev = SC_FOLDLEVELBASE + 1;\n\t\t} else {\n\t\t\tlev = levelPrevious & SC_FOLDLEVELNUMBERMASK;\n\t\t}\n\t} else {\n\t\tlev = SC_FOLDLEVELBASE;\n\t}\n\tint flagsNext = styler.LevelAt(lineCurrent);\n\tstyler.SetLevel(lineCurrent, lev | (flagsNext & ~SC_FOLDLEVELNUMBERMASK));\n}\n\nstatic void ColouriseMakeLine(\n    char *lineBuffer,\n    unsigned int lengthLine,\n    unsigned int startLine,\n    unsigned int endPos,\n    Accessor &styler) {\n\n\tunsigned int i = 0;\n\tint lastNonSpace = -1;\n\tunsigned int state = SCE_MAKE_DEFAULT;\n\tbool bSpecial = false;\n\n\t// check for a tab character in column 0 indicating a command\n\tbool bCommand = false;\n\tif ((lengthLine > 0) && (lineBuffer[0] == '\\t'))\n\t\tbCommand = true;\n\n\t// Skip initial spaces\n\twhile ((i < lengthLine) && isspacechar(lineBuffer[i])) {\n\t\ti++;\n\t}\n\tif (i < lengthLine) {\n\t\tif (lineBuffer[i] == '#') {\t// Comment\n\t\t\tstyler.ColourTo(endPos, SCE_MAKE_COMMENT);\n\t\t\treturn;\n\t\t}\n\t\tif (lineBuffer[i] == '!') {\t// Special directive\n\t\t\tstyler.ColourTo(endPos, SCE_MAKE_PREPROCESSOR);\n\t\t\treturn;\n\t\t}\n\t}\n\tint varCount = 0;\n\twhile (i < lengthLine) {\n\t\tif (((i + 1) < lengthLine) && (lineBuffer[i] == '$' && lineBuffer[i + 1] == '(')) {\n\t\t\tstyler.ColourTo(startLine + i - 1, state);\n\t\t\tstate = SCE_MAKE_IDENTIFIER;\n\t\t\tvarCount++;\n\t\t} else if (state == SCE_MAKE_IDENTIFIER && lineBuffer[i] == ')') {\n\t\t\tif (--varCount == 0) {\n\t\t\t\tstyler.ColourTo(startLine + i, state);\n\t\t\t\tstate = SCE_MAKE_DEFAULT;\n\t\t\t}\n\t\t}\n\n\t\t// skip identifier and target styling if this is a command line\n\t\tif (!bSpecial && !bCommand) {\n\t\t\tif (lineBuffer[i] == ':') {\n\t\t\t\tif (((i + 1) < lengthLine) && (lineBuffer[i + 1] == '=')) {\n\t\t\t\t\t// it's a ':=', so style as an identifier\n\t\t\t\t\tif (lastNonSpace >= 0)\n\t\t\t\t\t\tstyler.ColourTo(startLine + lastNonSpace, SCE_MAKE_IDENTIFIER);\n\t\t\t\t\tstyler.ColourTo(startLine + i - 1, SCE_MAKE_DEFAULT);\n\t\t\t\t\tstyler.ColourTo(startLine + i + 1, SCE_MAKE_OPERATOR);\n\t\t\t\t} else {\n\t\t\t\t\t// We should check that no colouring was made since the beginning of the line,\n\t\t\t\t\t// to avoid colouring stuff like /OUT:file\n\t\t\t\t\tif (lastNonSpace >= 0)\n\t\t\t\t\t\tstyler.ColourTo(startLine + lastNonSpace, SCE_MAKE_TARGET);\n\t\t\t\t\tstyler.ColourTo(startLine + i - 1, SCE_MAKE_DEFAULT);\n\t\t\t\t\tstyler.ColourTo(startLine + i, SCE_MAKE_OPERATOR);\n\t\t\t\t}\n\t\t\t\tbSpecial = true;\t// Only react to the first ':' of the line\n\t\t\t\tstate = SCE_MAKE_DEFAULT;\n\t\t\t} else if (lineBuffer[i] == '=') {\n\t\t\t\tif (lastNonSpace >= 0)\n\t\t\t\t\tstyler.ColourTo(startLine + lastNonSpace, SCE_MAKE_IDENTIFIER);\n\t\t\t\tstyler.ColourTo(startLine + i - 1, SCE_MAKE_DEFAULT);\n\t\t\t\tstyler.ColourTo(startLine + i, SCE_MAKE_OPERATOR);\n\t\t\t\tbSpecial = true;\t// Only react to the first '=' of the line\n\t\t\t\tstate = SCE_MAKE_DEFAULT;\n\t\t\t}\n\t\t}\n\t\tif (!isspacechar(lineBuffer[i])) {\n\t\t\tlastNonSpace = i;\n\t\t}\n\t\ti++;\n\t}\n\tif (state == SCE_MAKE_IDENTIFIER) {\n\t\tstyler.ColourTo(endPos, SCE_MAKE_IDEOL);\t// Error, variable reference not ended\n\t} else {\n\t\tstyler.ColourTo(endPos, SCE_MAKE_DEFAULT);\n\t}\n}\n\nstatic void ColouriseMakeDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {\n\tchar lineBuffer[1024];\n\tstyler.StartAt(startPos);\n\tstyler.StartSegment(startPos);\n\tunsigned int linePos = 0;\n\tunsigned int startLine = startPos;\n\tfor (unsigned int i = startPos; i < startPos + length; i++) {\n\t\tlineBuffer[linePos++] = styler[i];\n\t\tif (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {\n\t\t\t// End of line (or of line buffer) met, colourise it\n\t\t\tlineBuffer[linePos] = '\\0';\n\t\t\tColouriseMakeLine(lineBuffer, linePos, startLine, i, styler);\n\t\t\tlinePos = 0;\n\t\t\tstartLine = i + 1;\n\t\t}\n\t}\n\tif (linePos > 0) {\t// Last line does not have ending characters\n\t\tColouriseMakeLine(lineBuffer, linePos, startLine, startPos + length - 1, styler);\n\t}\n}\n\nstatic int RecogniseErrorListLine(const char *lineBuffer, unsigned int lengthLine, int &startValue) {\n\tif (lineBuffer[0] == '>') {\n\t\t// Command or return status\n\t\treturn SCE_ERR_CMD;\n\t} else if (lineBuffer[0] == '<') {\n\t\t// Diff removal.\n\t\treturn SCE_ERR_DIFF_DELETION;\n\t} else if (lineBuffer[0] == '!') {\n\t\treturn SCE_ERR_DIFF_CHANGED;\n\t} else if (lineBuffer[0] == '+') {\n\t\tif (strstart(lineBuffer, \"+++ \")) {\n\t\t\treturn SCE_ERR_DIFF_MESSAGE;\n\t\t} else {\n\t\t\treturn SCE_ERR_DIFF_ADDITION;\n\t\t}\n\t} else if (lineBuffer[0] == '-') {\n\t\tif (strstart(lineBuffer, \"--- \")) {\n\t\t\treturn SCE_ERR_DIFF_MESSAGE;\n\t\t} else {\n\t\t\treturn SCE_ERR_DIFF_DELETION;\n\t\t}\n\t} else if (strstart(lineBuffer, \"cf90-\")) {\n\t\t// Absoft Pro Fortran 90/95 v8.2 error and/or warning message\n\t\treturn SCE_ERR_ABSF;\n\t} else if (strstart(lineBuffer, \"fortcom:\")) {\n\t\t// Intel Fortran Compiler v8.0 error/warning message\n\t\treturn SCE_ERR_IFORT;\n\t} else if (strstr(lineBuffer, \"File \\\"\") && strstr(lineBuffer, \", line \")) {\n\t\treturn SCE_ERR_PYTHON;\n\t} else if (strstr(lineBuffer, \" in \") && strstr(lineBuffer, \" on line \")) {\n\t\treturn SCE_ERR_PHP;\n\t} else if ((strstart(lineBuffer, \"Error \") ||\n\t            strstart(lineBuffer, \"Warning \")) &&\n\t           strstr(lineBuffer, \" at (\") &&\n\t           strstr(lineBuffer, \") : \") &&\n\t           (strstr(lineBuffer, \" at (\") < strstr(lineBuffer, \") : \"))) {\n\t\t// Intel Fortran Compiler error/warning message\n\t\treturn SCE_ERR_IFC;\n\t} else if (strstart(lineBuffer, \"Error \")) {\n\t\t// Borland error message\n\t\treturn SCE_ERR_BORLAND;\n\t} else if (strstart(lineBuffer, \"Warning \")) {\n\t\t// Borland warning message\n\t\treturn SCE_ERR_BORLAND;\n\t} else if (strstr(lineBuffer, \"at line \") &&\n\t        (strstr(lineBuffer, \"at line \") < (lineBuffer + lengthLine)) &&\n\t           strstr(lineBuffer, \"file \") &&\n\t           (strstr(lineBuffer, \"file \") < (lineBuffer + lengthLine))) {\n\t\t// Lua 4 error message\n\t\treturn SCE_ERR_LUA;\n\t} else if (strstr(lineBuffer, \" at \") &&\n\t        (strstr(lineBuffer, \" at \") < (lineBuffer + lengthLine)) &&\n\t           strstr(lineBuffer, \" line \") &&\n\t           (strstr(lineBuffer, \" line \") < (lineBuffer + lengthLine)) &&\n\t        (strstr(lineBuffer, \" at \") + 4 < (strstr(lineBuffer, \" line \")))) {\n\t\t// perl error message:\n\t\t// <message> at <file> line <line>\n\t\treturn SCE_ERR_PERL;\n\t} else if ((memcmp(lineBuffer, \"   at \", 6) == 0) &&\n\t           strstr(lineBuffer, \":line \")) {\n\t\t// A .NET traceback\n\t\treturn SCE_ERR_NET;\n\t} else if (strstart(lineBuffer, \"Line \") &&\n\t           strstr(lineBuffer, \", file \")) {\n\t\t// Essential Lahey Fortran error message\n\t\treturn SCE_ERR_ELF;\n\t} else if (strstart(lineBuffer, \"line \") &&\n\t           strstr(lineBuffer, \" column \")) {\n\t\t// HTML tidy style: line 42 column 1\n\t\treturn SCE_ERR_TIDY;\n\t} else if (strstart(lineBuffer, \"\\tat \") &&\n\t           strstr(lineBuffer, \"(\") &&\n\t           strstr(lineBuffer, \".java:\")) {\n\t\t// Java stack back trace\n\t\treturn SCE_ERR_JAVA_STACK;\n\t} else if (strstart(lineBuffer, \"In file included from \") ||\n\t           strstart(lineBuffer, \"                 from \")) {\n\t\t// GCC showing include path to following error\n\t\treturn SCE_ERR_GCC_INCLUDED_FROM;\n\t} else {\n\t\t// Look for one of the following formats:\n\t\t// GCC: <filename>:<line>:<message>\n\t\t// Microsoft: <filename>(<line>) :<message>\n\t\t// Common: <filename>(<line>): warning|error|note|remark|catastrophic|fatal\n\t\t// Common: <filename>(<line>) warning|error|note|remark|catastrophic|fatal\n\t\t// Microsoft: <filename>(<line>,<column>)<message>\n\t\t// CTags: <identifier>\\t<filename>\\t<message>\n\t\t// Lua 5 traceback: \\t<filename>:<line>:<message>\n\t\t// Lua 5.1: <exe>: <filename>:<line>:<message>\n\t\tbool initialTab = (lineBuffer[0] == '\\t');\n\t\tbool initialColonPart = false;\n\t\tbool canBeCtags = !initialTab;\t// For ctags must have an identifier with no spaces then a tab\n\t\tenum { stInitial,\n\t\t\tstGccStart, stGccDigit, stGccColumn, stGcc,\n\t\t\tstMsStart, stMsDigit, stMsBracket, stMsVc, stMsDigitComma, stMsDotNet,\n\t\t\tstCtagsStart, stCtagsFile, stCtagsStartString, stCtagsStringDollar, stCtags,\n\t\t\tstUnrecognized\n\t\t} state = stInitial;\n\t\tfor (unsigned int i = 0; i < lengthLine; i++) {\n\t\t\tchar ch = lineBuffer[i];\n\t\t\tchar chNext = ' ';\n\t\t\tif ((i + 1) < lengthLine)\n\t\t\t\tchNext = lineBuffer[i + 1];\n\t\t\tif (state == stInitial) {\n\t\t\t\tif (ch == ':') {\n\t\t\t\t\t// May be GCC, or might be Lua 5 (Lua traceback same but with tab prefix)\n\t\t\t\t\tif ((chNext != '\\\\') && (chNext != '/') && (chNext != ' ')) {\n\t\t\t\t\t\t// This check is not completely accurate as may be on\n\t\t\t\t\t\t// GTK+ with a file name that includes ':'.\n\t\t\t\t\t\tstate = stGccStart;\n\t\t\t\t\t} else if (chNext == ' ') { // indicates a Lua 5.1 error message\n\t\t\t\t\t\tinitialColonPart = true;\n\t\t\t\t\t}\n\t\t\t\t} else if ((ch == '(') && Is1To9(chNext) && (!initialTab)) {\n\t\t\t\t\t// May be Microsoft\n\t\t\t\t\t// Check against '0' often removes phone numbers\n\t\t\t\t\tstate = stMsStart;\n\t\t\t\t} else if ((ch == '\\t') && canBeCtags) {\n\t\t\t\t\t// May be CTags\n\t\t\t\t\tstate = stCtagsStart;\n\t\t\t\t} else if (ch == ' ') {\n\t\t\t\t\tcanBeCtags = false;\n\t\t\t\t}\n\t\t\t} else if (state == stGccStart) {\t// <filename>:\n\t\t\t\tstate = Is1To9(ch) ? stGccDigit : stUnrecognized;\n\t\t\t} else if (state == stGccDigit) {\t// <filename>:<line>\n\t\t\t\tif (ch == ':') {\n\t\t\t\t\tstate = stGccColumn;\t// :9.*: is GCC\n\t\t\t\t\tstartValue = i + 1;\n\t\t\t\t} else if (!Is0To9(ch)) {\n\t\t\t\t\tstate = stUnrecognized;\n\t\t\t\t}\n\t\t\t} else if (state == stGccColumn) {\t// <filename>:<line>:<column>\n\t\t\t\tif (!Is0To9(ch)) {\n\t\t\t\t\tstate = stGcc;\n\t\t\t\t\tif (ch == ':')\n\t\t\t\t\t\tstartValue = i + 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if (state == stMsStart) {\t// <filename>(\n\t\t\t\tstate = Is0To9(ch) ? stMsDigit : stUnrecognized;\n\t\t\t} else if (state == stMsDigit) {\t// <filename>(<line>\n\t\t\t\tif (ch == ',') {\n\t\t\t\t\tstate = stMsDigitComma;\n\t\t\t\t} else if (ch == ')') {\n\t\t\t\t\tstate = stMsBracket;\n\t\t\t\t} else if ((ch != ' ') && !Is0To9(ch)) {\n\t\t\t\t\tstate = stUnrecognized;\n\t\t\t\t}\n\t\t\t} else if (state == stMsBracket) {\t// <filename>(<line>)\n\t\t\t\tif ((ch == ' ') && (chNext == ':')) {\n\t\t\t\t\tstate = stMsVc;\n\t\t\t\t} else if ((ch == ':' && chNext == ' ') || (ch == ' ')) {\n\t\t\t\t\t// Possibly Delphi.. don't test against chNext as it's one of the strings below.\n\t\t\t\t\tchar word[512];\n\t\t\t\t\tunsigned int j, chPos;\n\t\t\t\t\tunsigned numstep;\n\t\t\t\t\tchPos = 0;\n\t\t\t\t\tif (ch == ' ')\n\t\t\t\t\t\tnumstep = 1; // ch was ' ', handle as if it's a delphi errorline, only add 1 to i.\n\t\t\t\t\telse\n\t\t\t\t\t\tnumstep = 2; // otherwise add 2.\n\t\t\t\t\tfor (j = i + numstep; j < lengthLine && IsAlphabetic(lineBuffer[j]) && chPos < sizeof(word) - 1; j++)\n\t\t\t\t\t\tword[chPos++] = lineBuffer[j];\n\t\t\t\t\tword[chPos] = 0;\n\t\t\t\t\tif (!CompareCaseInsensitive(word, \"error\") || !CompareCaseInsensitive(word, \"warning\") ||\n\t\t\t\t\t\t!CompareCaseInsensitive(word, \"fatal\") || !CompareCaseInsensitive(word, \"catastrophic\") ||\n\t\t\t\t\t\t!CompareCaseInsensitive(word, \"note\") || !CompareCaseInsensitive(word, \"remark\")) {\n\t\t\t\t\t\tstate = stMsVc;\n\t\t\t\t\t} else\n\t\t\t\t\t\tstate = stUnrecognized;\n\t\t\t\t} else {\n\t\t\t\t\tstate = stUnrecognized;\n\t\t\t\t}\n\t\t\t} else if (state == stMsDigitComma) {\t// <filename>(<line>,\n\t\t\t\tif (ch == ')') {\n\t\t\t\t\tstate = stMsDotNet;\n\t\t\t\t\tbreak;\n\t\t\t\t} else if ((ch != ' ') && !Is0To9(ch)) {\n\t\t\t\t\tstate = stUnrecognized;\n\t\t\t\t}\n\t\t\t} else if (state == stCtagsStart) {\n\t\t\t\tif (ch == '\\t') {\n\t\t\t\t\tstate = stCtagsFile;\n\t\t\t\t}\n\t\t\t} else if (state == stCtagsFile) {\n\t\t\t\tif ((lineBuffer[i - 1] == '\\t') &&\n\t\t\t\t        ((ch == '/' && chNext == '^') || Is0To9(ch))) {\n\t\t\t\t\tstate = stCtags;\n\t\t\t\t\tbreak;\n\t\t\t\t} else if ((ch == '/') && (chNext == '^')) {\n\t\t\t\t\tstate = stCtagsStartString;\n\t\t\t\t}\n\t\t\t} else if ((state == stCtagsStartString) && ((lineBuffer[i] == '$') && (lineBuffer[i + 1] == '/'))) {\n\t\t\t\tstate = stCtagsStringDollar;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (state == stGcc) {\n\t\t\treturn initialColonPart ? SCE_ERR_LUA : SCE_ERR_GCC;\n\t\t} else if ((state == stMsVc) || (state == stMsDotNet)) {\n\t\t\treturn SCE_ERR_MS;\n\t\t} else if ((state == stCtagsStringDollar) || (state == stCtags)) {\n\t\t\treturn SCE_ERR_CTAG;\n\t\t} else {\n\t\t\treturn SCE_ERR_DEFAULT;\n\t\t}\n\t}\n}\n\nstatic void ColouriseErrorListLine(\n    char *lineBuffer,\n    unsigned int lengthLine,\n    unsigned int endPos,\n    Accessor &styler,\n\tbool valueSeparate) {\n\tint startValue = -1;\n\tint style = RecogniseErrorListLine(lineBuffer, lengthLine, startValue);\n\tif (valueSeparate && (startValue >= 0)) {\n\t\tstyler.ColourTo(endPos - (lengthLine - startValue), style);\n\t\tstyler.ColourTo(endPos, SCE_ERR_VALUE);\n\t} else {\n\t\tstyler.ColourTo(endPos, style);\n\t}\n}\n\nstatic void ColouriseErrorListDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {\n\tchar lineBuffer[10000];\n\tstyler.StartAt(startPos);\n\tstyler.StartSegment(startPos);\n\tunsigned int linePos = 0;\n\n\t// property lexer.errorlist.value.separate\n\t//\tFor lines in the output pane that are matches from Find in Files or GCC-style\n\t//\tdiagnostics, style the path and line number separately from the rest of the\n\t//\tline with style 21 used for the rest of the line.\n\t//\tThis allows matched text to be more easily distinguished from its location.\n\tbool valueSeparate = styler.GetPropertyInt(\"lexer.errorlist.value.separate\", 0) != 0;\n\tfor (unsigned int i = startPos; i < startPos + length; i++) {\n\t\tlineBuffer[linePos++] = styler[i];\n\t\tif (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {\n\t\t\t// End of line (or of line buffer) met, colourise it\n\t\t\tlineBuffer[linePos] = '\\0';\n\t\t\tColouriseErrorListLine(lineBuffer, linePos, i, styler, valueSeparate);\n\t\t\tlinePos = 0;\n\t\t}\n\t}\n\tif (linePos > 0) {\t// Last line does not have ending characters\n\t\tColouriseErrorListLine(lineBuffer, linePos, startPos + length - 1, styler, valueSeparate);\n\t}\n}\n\nstatic const char *const batchWordListDesc[] = {\n\t\"Internal Commands\",\n\t\"External Commands\",\n\t0\n};\n\nstatic const char *const emptyWordListDesc[] = {\n\t0\n};\n\nstatic void ColouriseNullDoc(unsigned int startPos, int length, int, WordList *[],\n                            Accessor &styler) {\n\t// Null language means all style bytes are 0 so just mark the end - no need to fill in.\n\tif (length > 0) {\n\t\tstyler.StartAt(startPos + length - 1);\n\t\tstyler.StartSegment(startPos + length - 1);\n\t\tstyler.ColourTo(startPos + length - 1, 0);\n\t}\n}\n\nLexerModule lmBatch(SCLEX_BATCH, ColouriseBatchDoc, \"batch\", 0, batchWordListDesc);\nLexerModule lmDiff(SCLEX_DIFF, ColouriseDiffDoc, \"diff\", FoldDiffDoc, emptyWordListDesc);\nLexerModule lmProps(SCLEX_PROPERTIES, ColourisePropsDoc, \"props\", FoldPropsDoc, emptyWordListDesc);\nLexerModule lmMake(SCLEX_MAKEFILE, ColouriseMakeDoc, \"makefile\", 0, emptyWordListDesc);\nLexerModule lmErrorList(SCLEX_ERRORLIST, ColouriseErrorListDoc, \"errorlist\", 0, emptyWordListDesc);\nLexerModule lmNull(SCLEX_NULL, ColouriseNullDoc, \"null\");\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexPB.cpp",
    "content": "// Scintilla source code edit control\n// @file LexPB.cxx\n// Lexer for PowerBasic by Roland Walter, roland@rowalt.de (for PowerBasic see www.powerbasic.com)\n//\n// Changes:\n// 17.10.2003: Toggling of subs/functions now until next sub/function - this gives better results\n// 29.10.2003: 1. Bug: Toggling didn't work for subs/functions added in editor\n//             2. Own colors for PB constants and Inline Assembler SCE_B_CONSTANT and SCE_B_ASM\n//             3. Several smaller syntax coloring improvements and speed optimizations\n// 12.07.2004: 1. Toggling for macros added\n//             2. Further folding speed optimitations (for people dealing with very large listings)\n//\n// Necessary changes for the PB lexer in Scintilla project:\n//  - In SciLexer.h and Scintilla.iface:\n//\n//    #define SCLEX_POWERBASIC 51       //ID for PowerBasic lexer\n//    (...)\n//    #define SCE_B_DEFAULT 0           //in both VB and PB lexer\n//    #define SCE_B_COMMENT 1           //in both VB and PB lexer\n//    #define SCE_B_NUMBER 2            //in both VB and PB lexer\n//    #define SCE_B_KEYWORD 3           //in both VB and PB lexer\n//    #define SCE_B_STRING 4            //in both VB and PB lexer\n//    #define SCE_B_PREPROCESSOR 5      //VB lexer only, not in PB lexer\n//    #define SCE_B_OPERATOR 6          //in both VB and PB lexer\n//    #define SCE_B_IDENTIFIER 7        //in both VB and PB lexer\n//    #define SCE_B_DATE 8              //VB lexer only, not in PB lexer\n//    #define SCE_B_CONSTANT 13         //PB lexer only, not in VB lexer\n//    #define SCE_B_ASM 14              //PB lexer only, not in VB lexer\n\n//  - Statement added to KeyWords.cxx:      'LINK_LEXER(lmPB);'\n//  - Statement added to scintilla_vc6.mak: '$(DIR_O)\\LexPB.obj: ...\\src\\LexPB.cxx $(LEX_HEADERS)'\n//\n// Copyright for Scintilla: 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsTypeCharacter(const int ch)\n{\n    return ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$' || ch == '?';\n}\n\nstatic inline bool IsAWordChar(const int ch)\n{\n    return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');\n}\n\nstatic inline bool IsAWordStart(const int ch)\n{\n    return (ch < 0x80) && (isalnum(ch) || ch == '_');\n}\n\nbool MatchUpperCase(Accessor &styler, int pos, const char *s)   //Same as styler.Match() but uppercase comparison (a-z,A-Z and space only)\n{\n    char ch;\n    for (int i=0; *s; i++)\n    {\n        ch=styler.SafeGetCharAt(pos+i);\n        if (ch > 0x60) ch -= '\\x20';\n        if (*s != ch) return false;\n        s++;\n    }\n    return true;\n}\n\nstatic void ColourisePBDoc(unsigned int startPos, int length, int initStyle,WordList *keywordlists[],Accessor &styler) {\n\n    WordList &keywords = *keywordlists[0];\n\n    styler.StartAt(startPos);\n\n    StyleContext sc(startPos, length, initStyle, styler);\n\n    for (; sc.More(); sc.Forward()) {\n        switch (sc.state)\n        {\n            case SCE_B_OPERATOR:\n            {\n                sc.SetState(SCE_B_DEFAULT);\n                break;\n            }\n            case SCE_B_KEYWORD:\n            {\n                if (!IsAWordChar(sc.ch))\n                {\n                    if (!IsTypeCharacter(sc.ch))\n                    {\n                        char s[100];\n                        sc.GetCurrentLowered(s, sizeof(s));\n                        if (keywords.InList(s))\n                        {\n                            if (strcmp(s, \"rem\") == 0)\n                            {\n                                sc.ChangeState(SCE_B_COMMENT);\n                                if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}\n                            }\n                            else if (strcmp(s, \"asm\") == 0)\n                            {\n                                sc.ChangeState(SCE_B_ASM);\n                                if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}\n                            }\n                            else\n                            {\n                                sc.SetState(SCE_B_DEFAULT);\n                            }\n                        }\n                        else\n                        {\n                            sc.ChangeState(SCE_B_IDENTIFIER);\n                            sc.SetState(SCE_B_DEFAULT);\n                        }\n                    }\n                }\n                break;\n            }\n            case SCE_B_NUMBER:\n            {\n                if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_B_DEFAULT);}\n                break;\n            }\n            case SCE_B_STRING:\n            {\n                if (sc.ch == '\\\"'){sc.ForwardSetState(SCE_B_DEFAULT);}\n                break;\n            }\n            case SCE_B_CONSTANT:\n            {\n                if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_B_DEFAULT);}\n                break;\n            }\n            case SCE_B_COMMENT:\n            {\n                if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}\n                break;\n            }\n            case SCE_B_ASM:\n            {\n                if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}\n                break;\n            }\n        }  //switch (sc.state)\n\n        // Determine if a new state should be entered:\n        if (sc.state == SCE_B_DEFAULT)\n        {\n            if (sc.ch == '\\'') {sc.SetState(SCE_B_COMMENT);}\n            else if (sc.ch == '\\\"') {sc.SetState(SCE_B_STRING);}\n            else if (sc.ch == '&' && tolower(sc.chNext) == 'h') {sc.SetState(SCE_B_NUMBER);}\n            else if (sc.ch == '&' && tolower(sc.chNext) == 'b') {sc.SetState(SCE_B_NUMBER);}\n            else if (sc.ch == '&' && tolower(sc.chNext) == 'o') {sc.SetState(SCE_B_NUMBER);}\n            else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {sc.SetState(SCE_B_NUMBER);}\n            else if (IsAWordStart(sc.ch)) {sc.SetState(SCE_B_KEYWORD);}\n            else if (sc.ch == '%') {sc.SetState(SCE_B_CONSTANT);}\n            else if (sc.ch == '$') {sc.SetState(SCE_B_CONSTANT);}\n            else if (sc.ch == '#') {sc.SetState(SCE_B_KEYWORD);}\n            else if (sc.ch == '!') {sc.SetState(SCE_B_ASM);}\n            else if (isoperator(static_cast<char>(sc.ch)) || (sc.ch == '\\\\')) {sc.SetState(SCE_B_OPERATOR);}\n        }\n    }      //for (; sc.More(); sc.Forward())\n    sc.Complete();\n}\n\n//The folding routine for PowerBasic toggles SUBs and FUNCTIONs only. This was exactly what I wanted,\n//nothing more. I had worked with this kind of toggling for several years when I used the great good old\n//GFA Basic which is dead now. After testing the feature of toggling FOR-NEXT loops, WHILE-WEND loops\n//and so on too I found this is more disturbing then helping (for me). So if You think in another way\n//you can (or must) write Your own toggling routine ;-)\nstatic void FoldPBDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)\n{\n    // No folding enabled, no reason to continue...\n    if( styler.GetPropertyInt(\"fold\") == 0 )\n        return;\n\n    unsigned int endPos = startPos + length;\n    int lineCurrent = styler.GetLine(startPos);\n    int levelCurrent = SC_FOLDLEVELBASE;\n    if (lineCurrent > 0)\n        levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n    int levelNext = levelCurrent;\n    char chNext = styler[startPos];\n\n    bool fNewLine=true;\n    bool fMightBeMultiLineMacro=false;\n    bool fBeginOfCommentFound=false;\n    for (unsigned int i = startPos; i < endPos; i++)\n    {\n        char ch = chNext;\n        chNext = styler.SafeGetCharAt(i + 1);\n\n        if (fNewLine)            //Begin of a new line (The Sub/Function/Macro keywords may occur at begin of line only)\n        {\n            fNewLine=false;\n            fBeginOfCommentFound=false;\n            switch (ch)\n            {\n            case ' ':      //Most lines start with space - so check this first, the code is the same as for 'default:'\n            case '\\t':     //Handle tab too\n                {\n                    int levelUse = levelCurrent;\n                    int lev = levelUse | levelNext << 16;\n                    styler.SetLevel(lineCurrent, lev);\n                    break;\n                }\n            case 'F':\n            case 'f':\n                {\n\t\t\t\t\tswitch (chNext)\n\t\t\t\t\t{\n                    case 'U':\n                    case 'u':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif( MatchUpperCase(styler,i,\"FUNCTION\") )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstyler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);\n\t\t\t\t\t\t\t\tlevelNext=SC_FOLDLEVELBASE+1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n                break;\n                }\n            case 'S':\n            case 's':\n                {\n\t\t\t\t\tswitch (chNext)\n\t\t\t\t\t{\n                    case 'U':\n                    case 'u':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif( MatchUpperCase(styler,i,\"SUB\") )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstyler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);\n\t\t\t\t\t\t\t\tlevelNext=SC_FOLDLEVELBASE+1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n                    case 'T':\n                    case 't':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif( MatchUpperCase(styler,i,\"STATIC FUNCTION\") )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstyler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);\n\t\t\t\t\t\t\t\tlevelNext=SC_FOLDLEVELBASE+1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if( MatchUpperCase(styler,i,\"STATIC SUB\") )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstyler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);\n\t\t\t\t\t\t\t\tlevelNext=SC_FOLDLEVELBASE+1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n                break;\n                }\n            case 'C':\n            case 'c':\n                {\n\t\t\t\t\tswitch (chNext)\n\t\t\t\t\t{\n                    case 'A':\n                    case 'a':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif( MatchUpperCase(styler,i,\"CALLBACK FUNCTION\") )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstyler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);\n\t\t\t\t\t\t\t\tlevelNext=SC_FOLDLEVELBASE+1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n                break;\n                }\n            case 'M':\n            case 'm':\n                {\n\t\t\t\t\tswitch (chNext)\n\t\t\t\t\t{\n                    case 'A':\n                    case 'a':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif( MatchUpperCase(styler,i,\"MACRO\") )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfMightBeMultiLineMacro=true;  //Set folder level at end of line, we have to check for single line macro\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n                break;\n                }\n            default:\n                {\n                    int levelUse = levelCurrent;\n                    int lev = levelUse | levelNext << 16;\n                    styler.SetLevel(lineCurrent, lev);\n                    break;\n                }\n            }  //switch (ch)\n        }  //if( fNewLine )\n\n        switch (ch)\n        {\n            case '=':                              //To test single line macros\n            {\n                if (fBeginOfCommentFound==false)\n                    fMightBeMultiLineMacro=false;  //The found macro is a single line macro only;\n                break;\n            }\n            case '\\'':                             //A comment starts\n            {\n                fBeginOfCommentFound=true;\n                break;\n            }\n            case '\\n':\n            {\n                if (fMightBeMultiLineMacro)        //The current line is the begin of a multi line macro\n                {\n                    fMightBeMultiLineMacro=false;\n                    styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);\n                    levelNext=SC_FOLDLEVELBASE+1;\n                }\n                lineCurrent++;\n                levelCurrent = levelNext;\n                fNewLine=true;\n                break;\n            }\n            case '\\r':\n            {\n                if (chNext != '\\n')\n                {\n                    lineCurrent++;\n                    levelCurrent = levelNext;\n                    fNewLine=true;\n                }\n                break;\n            }\n        }  //switch (ch)\n    }  //for (unsigned int i = startPos; i < endPos; i++)\n}\n\nstatic const char * const pbWordListDesc[] = {\n    \"Keywords\",\n    0\n};\n\nLexerModule lmPB(SCLEX_POWERBASIC, ColourisePBDoc, \"powerbasic\", FoldPBDoc, pbWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexPLM.cpp",
    "content": "// Copyright (c) 1990-2007, Scientific Toolworks, Inc.\n// Author: Jason Haslam\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic void GetRange(unsigned int start,\n                     unsigned int end,\n                     Accessor &styler,\n                     char *s,\n                     unsigned int len) {\n\tunsigned int i = 0;\n\twhile ((i < end - start + 1) && (i < len-1)) {\n\t\ts[i] = static_cast<char>(tolower(styler[start + i]));\n\t\ti++;\n\t}\n\ts[i] = '\\0';\n}\n\nstatic void ColourisePlmDoc(unsigned int startPos,\n                            int length,\n                            int initStyle,\n                            WordList *keywordlists[],\n                            Accessor &styler)\n{\n\tunsigned int endPos = startPos + length;\n\tint state = initStyle;\n\n\tstyler.StartAt(startPos);\n\tstyler.StartSegment(startPos);\n\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = styler.SafeGetCharAt(i);\n\t\tchar chNext = styler.SafeGetCharAt(i + 1);\n\n\t\tif (state == SCE_PLM_DEFAULT) {\n\t\t\tif (ch == '/' && chNext == '*') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_PLM_COMMENT;\n\t\t\t} else if (ch == '\\'') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_PLM_STRING;\n\t\t\t} else if (isdigit(ch)) {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_PLM_NUMBER;\n\t\t\t} else if (isalpha(ch)) {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_PLM_IDENTIFIER;\n\t\t\t} else if (ch == '+' || ch == '-' || ch == '*' || ch == '/' ||\n\t\t\t           ch == '=' || ch == '<' || ch == '>' || ch == ':') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_PLM_OPERATOR;\n\t\t\t} else if (ch == '$') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_PLM_CONTROL;\n\t\t\t}\n\t\t} else if (state == SCE_PLM_COMMENT) {\n\t\t\tif (ch == '*' && chNext == '/') {\n\t\t\t\ti++;\n\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\tstate = SCE_PLM_DEFAULT;\n\t\t\t}\n\t\t} else if (state == SCE_PLM_STRING) {\n\t\t\tif (ch == '\\'') {\n\t\t\t\tif (chNext == '\\'') {\n\t\t\t\t\ti++;\n\t\t\t\t} else {\n\t\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\t\tstate = SCE_PLM_DEFAULT;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (state == SCE_PLM_NUMBER) {\n\t\t\tif (!isdigit(ch) && !isalpha(ch) && ch != '$') {\n\t\t\t\ti--;\n\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\tstate = SCE_PLM_DEFAULT;\n\t\t\t}\n\t\t} else if (state == SCE_PLM_IDENTIFIER) {\n\t\t\tif (!isdigit(ch) && !isalpha(ch) && ch != '$') {\n\t\t\t\t// Get the entire identifier.\n\t\t\t\tchar word[1024];\n\t\t\t\tint segmentStart = styler.GetStartSegment();\n\t\t\t\tGetRange(segmentStart, i - 1, styler, word, sizeof(word));\n\n\t\t\t\ti--;\n\t\t\t\tif (keywordlists[0]->InList(word))\n\t\t\t\t\tstyler.ColourTo(i, SCE_PLM_KEYWORD);\n\t\t\t\telse\n\t\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\tstate = SCE_PLM_DEFAULT;\n\t\t\t}\n\t\t} else if (state == SCE_PLM_OPERATOR) {\n\t\t\tif (ch != '=' && ch != '>') {\n\t\t\t\ti--;\n\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\tstate = SCE_PLM_DEFAULT;\n\t\t\t}\n\t\t} else if (state == SCE_PLM_CONTROL) {\n\t\t\tif (ch == '\\r' || ch == '\\n') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_PLM_DEFAULT;\n\t\t\t}\n\t\t}\n\t}\n\tstyler.ColourTo(endPos - 1, state);\n}\n\nstatic void FoldPlmDoc(unsigned int startPos,\n                       int length,\n                       int initStyle,\n                       WordList *[],\n                       Accessor &styler)\n{\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tint startKeyword = 0;\n\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\n\t\tif (stylePrev != SCE_PLM_KEYWORD && style == SCE_PLM_KEYWORD)\n\t\t\tstartKeyword = i;\n\n\t\tif (style == SCE_PLM_KEYWORD && styleNext != SCE_PLM_KEYWORD) {\n\t\t\tchar word[1024];\n\t\t\tGetRange(startKeyword, i, styler, word, sizeof(word));\n\n\t\t\tif (strcmp(word, \"procedure\") == 0 || strcmp(word, \"do\") == 0)\n\t\t\t\tlevelCurrent++;\n\t\t\telse if (strcmp(word, \"end\") == 0)\n\t\t\t\tlevelCurrent--;\n\t\t}\n\n\t\tif (foldComment) {\n\t\t\tif (stylePrev != SCE_PLM_COMMENT && style == SCE_PLM_COMMENT)\n\t\t\t\tlevelCurrent++;\n\t\t\telse if (stylePrev == SCE_PLM_COMMENT && style != SCE_PLM_COMMENT)\n\t\t\t\tlevelCurrent--;\n\t\t}\n\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nstatic const char *const plmWordListDesc[] = {\n\t\"Keywords\",\n\t0\n};\n\nLexerModule lmPLM(SCLEX_PLM, ColourisePlmDoc, \"PL/M\", FoldPlmDoc, plmWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexPO.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexPO.cxx\n ** Lexer for GetText Translation (PO) files.\n **/\n// Copyright 2012 by Colomban Wendling <ban@herbesfolles.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n// see https://www.gnu.org/software/gettext/manual/gettext.html#PO-Files for the syntax reference\n// some details are taken from the GNU msgfmt behavior (like that indent is allows in front of lines)\n\n// TODO:\n// * add keywords for flags (fuzzy, c-format, ...)\n// * highlight formats inside c-format strings (%s, %d, etc.)\n// * style for previous untranslated string? (\"#|\" comment)\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic void ColourisePODoc(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) {\n\tStyleContext sc(startPos, length, initStyle, styler);\n\tbool escaped = false;\n\tint curLine = styler.GetLine(startPos);\n\t// the line state holds the last state on or before the line that isn't the default style\n\tint curLineState = curLine > 0 ? styler.GetLineState(curLine - 1) : SCE_PO_DEFAULT;\n\t\n\tfor (; sc.More(); sc.Forward()) {\n\t\t// whether we should leave a state\n\t\tswitch (sc.state) {\n\t\t\tcase SCE_PO_COMMENT:\n\t\t\tcase SCE_PO_PROGRAMMER_COMMENT:\n\t\t\tcase SCE_PO_REFERENCE:\n\t\t\tcase SCE_PO_FLAGS:\n\t\t\tcase SCE_PO_FUZZY:\n\t\t\t\tif (sc.atLineEnd)\n\t\t\t\t\tsc.SetState(SCE_PO_DEFAULT);\n\t\t\t\telse if (sc.state == SCE_PO_FLAGS && sc.Match(\"fuzzy\"))\n\t\t\t\t\t// here we behave like the previous parser, but this should probably be highlighted\n\t\t\t\t\t// on its own like a keyword rather than changing the whole flags style\n\t\t\t\t\tsc.ChangeState(SCE_PO_FUZZY);\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase SCE_PO_MSGCTXT:\n\t\t\tcase SCE_PO_MSGID:\n\t\t\tcase SCE_PO_MSGSTR:\n\t\t\t\tif (isspacechar(sc.ch))\n\t\t\t\t\tsc.SetState(SCE_PO_DEFAULT);\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase SCE_PO_ERROR:\n\t\t\t\tif (sc.atLineEnd)\n\t\t\t\t\tsc.SetState(SCE_PO_DEFAULT);\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase SCE_PO_MSGCTXT_TEXT:\n\t\t\tcase SCE_PO_MSGID_TEXT:\n\t\t\tcase SCE_PO_MSGSTR_TEXT:\n\t\t\t\tif (sc.atLineEnd) { // invalid inside a string\n\t\t\t\t\tif (sc.state == SCE_PO_MSGCTXT_TEXT)\n\t\t\t\t\t\tsc.ChangeState(SCE_PO_MSGCTXT_TEXT_EOL);\n\t\t\t\t\telse if (sc.state == SCE_PO_MSGID_TEXT)\n\t\t\t\t\t\tsc.ChangeState(SCE_PO_MSGID_TEXT_EOL);\n\t\t\t\t\telse if (sc.state == SCE_PO_MSGSTR_TEXT)\n\t\t\t\t\t\tsc.ChangeState(SCE_PO_MSGSTR_TEXT_EOL);\n\t\t\t\t\tsc.SetState(SCE_PO_DEFAULT);\n\t\t\t\t\tescaped = false;\n\t\t\t\t} else {\n\t\t\t\t\tif (escaped)\n\t\t\t\t\t\tescaped = false;\n\t\t\t\t\telse if (sc.ch == '\\\\')\n\t\t\t\t\t\tescaped = true;\n\t\t\t\t\telse if (sc.ch == '\"')\n\t\t\t\t\t\tsc.ForwardSetState(SCE_PO_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\t// whether we should enter a new state\n\t\tif (sc.state == SCE_PO_DEFAULT) {\n\t\t\t// forward to the first non-white character on the line\n\t\t\tbool atLineStart = sc.atLineStart;\n\t\t\tif (atLineStart) {\n\t\t\t\t// reset line state if it is set to comment state so empty lines don't get\n\t\t\t\t// comment line state, and the folding code folds comments separately,\n\t\t\t\t// and anyway the styling don't use line state for comments\n\t\t\t\tif (curLineState == SCE_PO_COMMENT)\n\t\t\t\t\tcurLineState = SCE_PO_DEFAULT;\n\t\t\t\t\n\t\t\t\twhile (sc.More() && ! sc.atLineEnd && isspacechar(sc.ch))\n\t\t\t\t\tsc.Forward();\n\t\t\t}\n\t\t\t\n\t\t\tif (atLineStart && sc.ch == '#') {\n\t\t\t\tif (sc.chNext == '.')\n\t\t\t\t\tsc.SetState(SCE_PO_PROGRAMMER_COMMENT);\n\t\t\t\telse if (sc.chNext == ':')\n\t\t\t\t\tsc.SetState(SCE_PO_REFERENCE);\n\t\t\t\telse if (sc.chNext == ',')\n\t\t\t\t\tsc.SetState(SCE_PO_FLAGS);\n\t\t\t\telse\n\t\t\t\t\tsc.SetState(SCE_PO_COMMENT);\n\t\t\t} else if (atLineStart && sc.Match(\"msgid\")) { // includes msgid_plural\n\t\t\t\tsc.SetState(SCE_PO_MSGID);\n\t\t\t} else if (atLineStart && sc.Match(\"msgstr\")) { // includes [] suffixes\n\t\t\t\tsc.SetState(SCE_PO_MSGSTR);\n\t\t\t} else if (atLineStart && sc.Match(\"msgctxt\")) {\n\t\t\t\tsc.SetState(SCE_PO_MSGCTXT);\n\t\t\t} else if (sc.ch == '\"') {\n\t\t\t\tif (curLineState == SCE_PO_MSGCTXT || curLineState == SCE_PO_MSGCTXT_TEXT)\n\t\t\t\t\tsc.SetState(SCE_PO_MSGCTXT_TEXT);\n\t\t\t\telse if (curLineState == SCE_PO_MSGID || curLineState == SCE_PO_MSGID_TEXT)\n\t\t\t\t\tsc.SetState(SCE_PO_MSGID_TEXT);\n\t\t\t\telse if (curLineState == SCE_PO_MSGSTR || curLineState == SCE_PO_MSGSTR_TEXT)\n\t\t\t\t\tsc.SetState(SCE_PO_MSGSTR_TEXT);\n\t\t\t\telse\n\t\t\t\t\tsc.SetState(SCE_PO_ERROR);\n\t\t\t} else if (! isspacechar(sc.ch))\n\t\t\t\tsc.SetState(SCE_PO_ERROR);\n\t\t\t\n\t\t\tif (sc.state != SCE_PO_DEFAULT)\n\t\t\t\tcurLineState = sc.state;\n\t\t}\n\t\t\n\t\tif (sc.atLineEnd) {\n\t\t\t// Update the line state, so it can be seen by next line\n\t\t\tcurLine = styler.GetLine(sc.currentPos);\n\t\t\tstyler.SetLineState(curLine, curLineState);\n\t\t}\n\t}\n\tsc.Complete();\n}\n\nstatic int FindNextNonEmptyLineState(unsigned int startPos, Accessor &styler) {\n\tunsigned int length = styler.Length();\n\tfor (unsigned int i = startPos; i < length; i++) {\n\t\tif (! isspacechar(styler[i])) {\n\t\t\treturn styler.GetLineState(styler.GetLine(i));\n\t\t}\n\t}\n\treturn 0;\n}\n\nstatic void FoldPODoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {\n\tif (! styler.GetPropertyInt(\"fold\"))\n\t\treturn;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\") != 0;\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\t\n\tunsigned int endPos = startPos + length;\n\tint curLine = styler.GetLine(startPos);\n\tint lineState = styler.GetLineState(curLine);\n\tint nextLineState;\n\tint level = styler.LevelAt(curLine) & SC_FOLDLEVELNUMBERMASK;\n\tint nextLevel;\n\tint visible = 0;\n\tint chNext = styler[startPos];\n\t\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tint ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i+1);\n\t\t\n\t\tif (! isspacechar(ch)) {\n\t\t\tvisible++;\n\t\t} else if ((ch == '\\r' && chNext != '\\n') || ch == '\\n' || i+1 >= endPos) {\n\t\t\tint lvl = level;\n\t\t\tint nextLine = curLine + 1;\n\t\t\t\n\t\t\tnextLineState = styler.GetLineState(nextLine);\n\t\t\tif ((lineState != SCE_PO_COMMENT || foldComment) &&\n\t\t\t\t\tnextLineState == lineState &&\n\t\t\t\t\tFindNextNonEmptyLineState(i, styler) == lineState)\n\t\t\t\tnextLevel = SC_FOLDLEVELBASE + 1;\n\t\t\telse\n\t\t\t\tnextLevel = SC_FOLDLEVELBASE;\n\t\t\t\n\t\t\tif (nextLevel > level)\n\t\t\t\tlvl |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (visible == 0 && foldCompact)\n\t\t\t\tlvl |= SC_FOLDLEVELWHITEFLAG;\n\t\t\t\n\t\t\tstyler.SetLevel(curLine, lvl);\n\t\t\t\n\t\t\tlineState = nextLineState;\n\t\t\tcurLine = nextLine;\n\t\t\tlevel = nextLevel;\n\t\t\tvisible = 0;\n\t\t}\n\t}\n}\n\nstatic const char *const poWordListDesc[] = {\n\t0\n};\n\nLexerModule lmPO(SCLEX_PO, ColourisePODoc, \"po\", FoldPODoc, poWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexPOV.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexPOV.cxx\n ** Lexer for POV-Ray SDL (Persistance of Vision Raytracer, Scene Description Language).\n ** Written by Philippe Lhoste but this is mostly a derivative of LexCPP...\n **/\n// Copyright 1998-2005 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n// Some points that distinguish from a simple C lexer:\n// Identifiers start only by a character.\n// No line continuation character.\n// Strings are limited to 256 characters.\n// Directives are similar to preprocessor commands,\n// but we match directive keywords and colorize incorrect ones.\n// Block comments can be nested (code stolen from my code in LexLua).\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(int ch) {\n\treturn ch < 0x80 && (isalnum(ch) || ch == '_');\n}\n\nstatic inline bool IsAWordStart(int ch) {\n\treturn ch < 0x80 && isalpha(ch);\n}\n\nstatic inline bool IsANumberChar(int ch) {\n\t// Not exactly following number definition (several dots are seen as OK, etc.)\n\t// but probably enough in most cases.\n\treturn (ch < 0x80) &&\n\t        (isdigit(ch) || toupper(ch) == 'E' ||\n             ch == '.' || ch == '-' || ch == '+');\n}\n\nstatic void ColourisePovDoc(\n\tunsigned int startPos,\n\tint length,\n\tint initStyle,\n\tWordList *keywordlists[],\n    Accessor &styler) {\n\n\tWordList &keywords1 = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\tWordList &keywords4 = *keywordlists[3];\n\tWordList &keywords5 = *keywordlists[4];\n\tWordList &keywords6 = *keywordlists[5];\n\tWordList &keywords7 = *keywordlists[6];\n\tWordList &keywords8 = *keywordlists[7];\n\n\tint currentLine = styler.GetLine(startPos);\n\t// Initialize the block comment /* */ nesting level, if we are inside such a comment.\n\tint blockCommentLevel = 0;\n\tif (initStyle == SCE_POV_COMMENT) {\n\t\tblockCommentLevel = styler.GetLineState(currentLine - 1);\n\t}\n\n\t// Do not leak onto next line\n\tif (initStyle == SCE_POV_STRINGEOL || initStyle == SCE_POV_COMMENTLINE) {\n\t\tinitStyle = SCE_POV_DEFAULT;\n\t}\n\n\tshort stringLen = 0;\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\t\tif (sc.atLineEnd) {\n\t\t\t// Update the line state, so it can be seen by next line\n\t\t\tcurrentLine = styler.GetLine(sc.currentPos);\n\t\t\tif (sc.state == SCE_POV_COMMENT) {\n\t\t\t\t// Inside a block comment, we set the line state\n\t\t\t\tstyler.SetLineState(currentLine, blockCommentLevel);\n\t\t\t} else {\n\t\t\t\t// Reset the line state\n\t\t\t\tstyler.SetLineState(currentLine, 0);\n\t\t\t}\n\t\t}\n\n\t\tif (sc.atLineStart && (sc.state == SCE_POV_STRING)) {\n\t\t\t// Prevent SCE_POV_STRINGEOL from leaking back to previous line\n\t\t\tsc.SetState(SCE_POV_STRING);\n\t\t}\n\n\t\t// Determine if the current state should terminate.\n\t\tif (sc.state == SCE_POV_OPERATOR) {\n\t\t\tsc.SetState(SCE_POV_DEFAULT);\n\t\t} else if (sc.state == SCE_POV_NUMBER) {\n\t\t\t// We stop the number definition on non-numerical non-dot non-eE non-sign char\n\t\t\tif (!IsANumberChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_POV_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_POV_IDENTIFIER) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\tif (keywords2.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_POV_WORD2);\n\t\t\t\t} else if (keywords3.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_POV_WORD3);\n\t\t\t\t} else if (keywords4.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_POV_WORD4);\n\t\t\t\t} else if (keywords5.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_POV_WORD5);\n\t\t\t\t} else if (keywords6.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_POV_WORD6);\n\t\t\t\t} else if (keywords7.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_POV_WORD7);\n\t\t\t\t} else if (keywords8.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_POV_WORD8);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_POV_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_POV_DIRECTIVE) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tchar s[100];\n\t\t\t\tchar *p;\n\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\tp = s;\n\t\t\t\t// Skip # and whitespace between # and directive word\n\t\t\t\tdo {\n\t\t\t\t\tp++;\n\t\t\t\t} while ((*p == ' ' || *p == '\\t') && *p != '\\0');\n\t\t\t\tif (!keywords1.InList(p)) {\n\t\t\t\t\tsc.ChangeState(SCE_POV_BADDIRECTIVE);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_POV_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_POV_COMMENT) {\n\t\t\tif (sc.Match('/', '*')) {\n\t\t\t\tblockCommentLevel++;\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.Match('*', '/') && blockCommentLevel > 0) {\n\t\t\t\tblockCommentLevel--;\n\t\t\t\tsc.Forward();\n\t\t\t\tif (blockCommentLevel == 0) {\n\t\t\t\t\tsc.ForwardSetState(SCE_POV_DEFAULT);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (sc.state == SCE_POV_COMMENTLINE) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.ForwardSetState(SCE_POV_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_POV_STRING) {\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\tstringLen++;\n\t\t\t\tif (strchr(\"abfnrtuv0'\\\"\", sc.chNext)) {\n\t\t\t\t\t// Compound characters are counted as one.\n\t\t\t\t\t// Note: for Unicode chars \\u, we shouldn't count the next 4 digits...\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_POV_DEFAULT);\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.ChangeState(SCE_POV_STRINGEOL);\n\t\t\t\tsc.ForwardSetState(SCE_POV_DEFAULT);\n\t\t\t} else {\n\t\t\t\tstringLen++;\n\t\t\t}\n\t\t\tif (stringLen > 256) {\n\t\t\t\t// Strings are limited to 256 chars\n\t\t\t\tsc.SetState(SCE_POV_STRINGEOL);\n\t\t\t}\n\t\t} else if (sc.state == SCE_POV_STRINGEOL) {\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\\\') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_C_DEFAULT);\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.ForwardSetState(SCE_POV_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_POV_DEFAULT) {\n\t\t\tif (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_POV_NUMBER);\n\t\t\t} else if (IsAWordStart(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_POV_IDENTIFIER);\n\t\t\t} else if (sc.Match('/', '*')) {\n\t\t\t\tblockCommentLevel = 1;\n\t\t\t\tsc.SetState(SCE_POV_COMMENT);\n\t\t\t\tsc.Forward();\t// Eat the * so it isn't used for the end of the comment\n\t\t\t} else if (sc.Match('/', '/')) {\n\t\t\t\tsc.SetState(SCE_POV_COMMENTLINE);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_POV_STRING);\n\t\t\t\tstringLen = 0;\n\t\t\t} else if (sc.ch == '#') {\n\t\t\t\tsc.SetState(SCE_POV_DIRECTIVE);\n\t\t\t\t// Skip whitespace between # and directive word\n\t\t\t\tdo {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} while ((sc.ch == ' ' || sc.ch == '\\t') && sc.More());\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.SetState(SCE_POV_DEFAULT);\n\t\t\t\t}\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_POV_OPERATOR);\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n}\n\nstatic void FoldPovDoc(\n\tunsigned int startPos,\n\tint length,\n\tint initStyle,\n\tWordList *[],\n\tAccessor &styler) {\n\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldDirective = styler.GetPropertyInt(\"fold.directive\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (foldComment && (style == SCE_POV_COMMENT)) {\n\t\t\tif (stylePrev != SCE_POV_COMMENT) {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if ((styleNext != SCE_POV_COMMENT) && !atEOL) {\n\t\t\t\t// Comments don't end at end of line and the next character may be unstyled.\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\t\tif (foldComment && (style == SCE_POV_COMMENTLINE)) {\n\t\t\tif ((ch == '/') && (chNext == '/')) {\n\t\t\t\tchar chNext2 = styler.SafeGetCharAt(i + 2);\n\t\t\t\tif (chNext2 == '{') {\n\t\t\t\t\tlevelCurrent++;\n\t\t\t\t} else if (chNext2 == '}') {\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (foldDirective && (style == SCE_POV_DIRECTIVE)) {\n\t\t\tif (ch == '#') {\n\t\t\t\tunsigned int j=i+1;\n\t\t\t\twhile ((j<endPos) && IsASpaceOrTab(styler.SafeGetCharAt(j))) {\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (style == SCE_POV_OPERATOR) {\n\t\t\tif (ch == '{') {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (ch == '}') {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nstatic const char * const povWordLists[] = {\n\t\"Language directives\",\n\t\"Objects & CSG & Appearance\",\n\t\"Types & Modifiers & Items\",\n\t\"Predefined Identifiers\",\n\t\"Predefined Functions\",\n\t\"User defined 1\",\n\t\"User defined 2\",\n\t\"User defined 3\",\n\t0,\n};\n\nLexerModule lmPOV(SCLEX_POV, ColourisePovDoc, \"pov\", FoldPovDoc, povWordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexPS.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexPS.cxx\n ** Lexer for PostScript\n **\n ** Written by Nigel Hathaway <nigel@bprj.co.uk>.\n ** The License.txt file describes the conditions under which this software may be distributed.\n **/\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsASelfDelimitingChar(const int ch) {\n    return (ch == '[' || ch == ']' || ch == '{' || ch == '}' ||\n            ch == '/' || ch == '<' || ch == '>' ||\n            ch == '(' || ch == ')' || ch == '%');\n}\n\nstatic inline bool IsAWhitespaceChar(const int ch) {\n    return (ch == ' '  || ch == '\\t' || ch == '\\r' ||\n            ch == '\\n' || ch == '\\f' || ch == '\\0');\n}\n\nstatic bool IsABaseNDigit(const int ch, const int base) {\n    int maxdig = '9';\n    int letterext = -1;\n\n    if (base <= 10)\n        maxdig = '0' + base - 1;\n    else\n        letterext = base - 11;\n\n    return ((ch >= '0' && ch <= maxdig) ||\n            (ch >= 'A' && ch <= ('A' + letterext)) ||\n            (ch >= 'a' && ch <= ('a' + letterext)));\n}\n\nstatic inline bool IsABase85Char(const int ch) {\n    return ((ch >= '!' && ch <= 'u') || ch == 'z');\n}\n\nstatic void ColourisePSDoc(\n    unsigned int startPos,\n    int length,\n    int initStyle,\n    WordList *keywordlists[],\n    Accessor &styler) {\n\n    WordList &keywords1 = *keywordlists[0];\n    WordList &keywords2 = *keywordlists[1];\n    WordList &keywords3 = *keywordlists[2];\n    WordList &keywords4 = *keywordlists[3];\n    WordList &keywords5 = *keywordlists[4];\n\n    StyleContext sc(startPos, length, initStyle, styler);\n\n    bool tokenizing = styler.GetPropertyInt(\"ps.tokenize\") != 0;\n    int pslevel = styler.GetPropertyInt(\"ps.level\", 3);\n    int lineCurrent = styler.GetLine(startPos);\n    int nestTextCurrent = 0;\n    if (lineCurrent > 0 && initStyle == SCE_PS_TEXT)\n        nestTextCurrent = styler.GetLineState(lineCurrent - 1);\n    int numRadix = 0;\n    bool numHasPoint = false;\n    bool numHasExponent = false;\n    bool numHasSign = false;\n\n    // Clear out existing tokenization\n    if (tokenizing && length > 0) {\n        styler.StartAt(startPos, static_cast<char>(INDIC2_MASK));\n        styler.ColourTo(startPos + length-1, 0);\n        styler.Flush();\n        styler.StartAt(startPos);\n        styler.StartSegment(startPos);\n    }\n\n    for (; sc.More(); sc.Forward()) {\n        if (sc.atLineStart)\n            lineCurrent = styler.GetLine(sc.currentPos);\n\n        // Determine if the current state should terminate.\n        if (sc.state == SCE_PS_COMMENT || sc.state == SCE_PS_DSC_VALUE) {\n            if (sc.atLineEnd) {\n                sc.SetState(SCE_C_DEFAULT);\n            }\n        } else if (sc.state == SCE_PS_DSC_COMMENT) {\n            if (sc.ch == ':') {\n                sc.Forward();\n                if (!sc.atLineEnd)\n                    sc.SetState(SCE_PS_DSC_VALUE);\n                else\n                    sc.SetState(SCE_C_DEFAULT);\n            } else if (sc.atLineEnd) {\n                sc.SetState(SCE_C_DEFAULT);\n            } else if (IsAWhitespaceChar(sc.ch) && sc.ch != '\\r') {\n                sc.ChangeState(SCE_PS_COMMENT);\n            }\n        } else if (sc.state == SCE_PS_NUMBER) {\n            if (IsASelfDelimitingChar(sc.ch) || IsAWhitespaceChar(sc.ch)) {\n                if ((sc.chPrev == '+' || sc.chPrev == '-' ||\n                     sc.chPrev == 'E' || sc.chPrev == 'e') && numRadix == 0)\n                    sc.ChangeState(SCE_PS_NAME);\n                sc.SetState(SCE_C_DEFAULT);\n            } else if (sc.ch == '#') {\n                if (numHasPoint || numHasExponent || numHasSign || numRadix != 0) {\n                    sc.ChangeState(SCE_PS_NAME);\n                } else {\n                    char szradix[5];\n                    sc.GetCurrent(szradix, 4);\n                    numRadix = atoi(szradix);\n                    if (numRadix < 2 || numRadix > 36)\n                        sc.ChangeState(SCE_PS_NAME);\n                }\n            } else if ((sc.ch == 'E' || sc.ch == 'e') && numRadix == 0) {\n                if (numHasExponent) {\n                    sc.ChangeState(SCE_PS_NAME);\n                } else {\n                    numHasExponent = true;\n                    if (sc.chNext == '+' || sc.chNext == '-')\n                        sc.Forward();\n                }\n            } else if (sc.ch == '.') {\n                if (numHasPoint || numHasExponent || numRadix != 0) {\n                    sc.ChangeState(SCE_PS_NAME);\n                } else {\n                    numHasPoint = true;\n                }\n            } else if (numRadix == 0) {\n                if (!IsABaseNDigit(sc.ch, 10))\n                    sc.ChangeState(SCE_PS_NAME);\n            } else {\n                if (!IsABaseNDigit(sc.ch, numRadix))\n                    sc.ChangeState(SCE_PS_NAME);\n            }\n        } else if (sc.state == SCE_PS_NAME || sc.state == SCE_PS_KEYWORD) {\n            if (IsASelfDelimitingChar(sc.ch) || IsAWhitespaceChar(sc.ch)) {\n                char s[100];\n                sc.GetCurrent(s, sizeof(s));\n                if ((pslevel >= 1 && keywords1.InList(s)) ||\n                    (pslevel >= 2 && keywords2.InList(s)) ||\n                    (pslevel >= 3 && keywords3.InList(s)) ||\n                    keywords4.InList(s) || keywords5.InList(s)) {\n                    sc.ChangeState(SCE_PS_KEYWORD);\n                }\n                sc.SetState(SCE_C_DEFAULT);\n            }\n        } else if (sc.state == SCE_PS_LITERAL || sc.state == SCE_PS_IMMEVAL) {\n            if (IsASelfDelimitingChar(sc.ch) || IsAWhitespaceChar(sc.ch))\n                sc.SetState(SCE_C_DEFAULT);\n        } else if (sc.state == SCE_PS_PAREN_ARRAY || sc.state == SCE_PS_PAREN_DICT ||\n                   sc.state == SCE_PS_PAREN_PROC) {\n            sc.SetState(SCE_C_DEFAULT);\n        } else if (sc.state == SCE_PS_TEXT) {\n            if (sc.ch == '(') {\n                nestTextCurrent++;\n            } else if (sc.ch == ')') {\n                if (--nestTextCurrent == 0)\n                   sc.ForwardSetState(SCE_PS_DEFAULT);\n            } else if (sc.ch == '\\\\') {\n                sc.Forward();\n            }\n        } else if (sc.state == SCE_PS_HEXSTRING) {\n            if (sc.ch == '>') {\n                sc.ForwardSetState(SCE_PS_DEFAULT);\n            } else if (!IsABaseNDigit(sc.ch, 16) && !IsAWhitespaceChar(sc.ch)) {\n                sc.SetState(SCE_PS_HEXSTRING);\n                styler.ColourTo(sc.currentPos, SCE_PS_BADSTRINGCHAR);\n            }\n        } else if (sc.state == SCE_PS_BASE85STRING) {\n            if (sc.Match('~', '>')) {\n                sc.Forward();\n                sc.ForwardSetState(SCE_PS_DEFAULT);\n            } else if (!IsABase85Char(sc.ch) && !IsAWhitespaceChar(sc.ch)) {\n                sc.SetState(SCE_PS_BASE85STRING);\n                styler.ColourTo(sc.currentPos, SCE_PS_BADSTRINGCHAR);\n            }\n        }\n\n        // Determine if a new state should be entered.\n        if (sc.state == SCE_C_DEFAULT) {\n            unsigned int tokenpos = sc.currentPos;\n\n            if (sc.ch == '[' || sc.ch == ']') {\n                sc.SetState(SCE_PS_PAREN_ARRAY);\n            } else if (sc.ch == '{' || sc.ch == '}') {\n                sc.SetState(SCE_PS_PAREN_PROC);\n            } else if (sc.ch == '/') {\n                if (sc.chNext == '/') {\n                    sc.SetState(SCE_PS_IMMEVAL);\n                    sc.Forward();\n                } else {\n                    sc.SetState(SCE_PS_LITERAL);\n                }\n            } else if (sc.ch == '<') {\n                if (sc.chNext == '<') {\n                    sc.SetState(SCE_PS_PAREN_DICT);\n                    sc.Forward();\n                } else if (sc.chNext == '~') {\n                    sc.SetState(SCE_PS_BASE85STRING);\n                    sc.Forward();\n                } else {\n                    sc.SetState(SCE_PS_HEXSTRING);\n                }\n            } else if (sc.ch == '>' && sc.chNext == '>') {\n                    sc.SetState(SCE_PS_PAREN_DICT);\n                    sc.Forward();\n            } else if (sc.ch == '>' || sc.ch == ')') {\n                sc.SetState(SCE_C_DEFAULT);\n                styler.ColourTo(sc.currentPos, SCE_PS_BADSTRINGCHAR);\n            } else if (sc.ch == '(') {\n                sc.SetState(SCE_PS_TEXT);\n                nestTextCurrent = 1;\n            } else if (sc.ch == '%') {\n                if (sc.chNext == '%' && sc.atLineStart) {\n                    sc.SetState(SCE_PS_DSC_COMMENT);\n                    sc.Forward();\n                    if (sc.chNext == '+') {\n                        sc.Forward();\n                        sc.ForwardSetState(SCE_PS_DSC_VALUE);\n                    }\n                } else {\n                    sc.SetState(SCE_PS_COMMENT);\n                }\n            } else if ((sc.ch == '+' || sc.ch == '-' || sc.ch == '.') &&\n                       IsABaseNDigit(sc.chNext, 10)) {\n                sc.SetState(SCE_PS_NUMBER);\n                numRadix = 0;\n                numHasPoint = (sc.ch == '.');\n                numHasExponent = false;\n                numHasSign = (sc.ch == '+' || sc.ch == '-');\n            } else if ((sc.ch == '+' || sc.ch == '-') && sc.chNext == '.' &&\n                       IsABaseNDigit(sc.GetRelative(2), 10)) {\n                sc.SetState(SCE_PS_NUMBER);\n                numRadix = 0;\n                numHasPoint = false;\n                numHasExponent = false;\n                numHasSign = true;\n            } else if (IsABaseNDigit(sc.ch, 10)) {\n                sc.SetState(SCE_PS_NUMBER);\n                numRadix = 0;\n                numHasPoint = false;\n                numHasExponent = false;\n                numHasSign = false;\n            } else if (!IsAWhitespaceChar(sc.ch)) {\n                sc.SetState(SCE_PS_NAME);\n            }\n\n            // Mark the start of tokens\n            if (tokenizing && sc.state != SCE_C_DEFAULT && sc.state != SCE_PS_COMMENT &&\n                sc.state != SCE_PS_DSC_COMMENT && sc.state != SCE_PS_DSC_VALUE) {\n                styler.Flush();\n                styler.StartAt(tokenpos, static_cast<char>(INDIC2_MASK));\n                styler.ColourTo(tokenpos, INDIC2_MASK);\n                styler.Flush();\n                styler.StartAt(tokenpos);\n                styler.StartSegment(tokenpos);\n            }\n        }\n\n        if (sc.atLineEnd)\n            styler.SetLineState(lineCurrent, nestTextCurrent);\n    }\n\n    sc.Complete();\n}\n\nstatic void FoldPSDoc(unsigned int startPos, int length, int, WordList *[],\n                       Accessor &styler) {\n    bool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n    bool foldAtElse = styler.GetPropertyInt(\"fold.at.else\", 0) != 0;\n    unsigned int endPos = startPos + length;\n    int visibleChars = 0;\n    int lineCurrent = styler.GetLine(startPos);\n    int levelCurrent = SC_FOLDLEVELBASE;\n    if (lineCurrent > 0)\n        levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n    int levelMinCurrent = levelCurrent;\n    int levelNext = levelCurrent;\n    char chNext = styler[startPos];\n    int styleNext = styler.StyleAt(startPos);\n    int style;\n    for (unsigned int i = startPos; i < endPos; i++) {\n        char ch = chNext;\n        chNext = styler.SafeGetCharAt(i + 1);\n        style = styleNext;\n        styleNext = styler.StyleAt(i + 1);\n        bool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');  //mac??\n        if ((style & 31) == SCE_PS_PAREN_PROC) {\n            if (ch == '{') {\n                // Measure the minimum before a '{' to allow\n                // folding on \"} {\"\n                if (levelMinCurrent > levelNext) {\n                    levelMinCurrent = levelNext;\n                }\n                levelNext++;\n            } else if (ch == '}') {\n                levelNext--;\n            }\n        }\n        if (atEOL) {\n            int levelUse = levelCurrent;\n            if (foldAtElse) {\n                levelUse = levelMinCurrent;\n            }\n            int lev = levelUse | levelNext << 16;\n            if (visibleChars == 0 && foldCompact)\n                lev |= SC_FOLDLEVELWHITEFLAG;\n            if (levelUse < levelNext)\n                lev |= SC_FOLDLEVELHEADERFLAG;\n            if (lev != styler.LevelAt(lineCurrent)) {\n                styler.SetLevel(lineCurrent, lev);\n            }\n            lineCurrent++;\n            levelCurrent = levelNext;\n            levelMinCurrent = levelCurrent;\n            visibleChars = 0;\n        }\n        if (!isspacechar(ch))\n            visibleChars++;\n    }\n}\n\nstatic const char * const psWordListDesc[] = {\n    \"PS Level 1 operators\",\n    \"PS Level 2 operators\",\n    \"PS Level 3 operators\",\n    \"RIP-specific operators\",\n    \"User-defined operators\",\n    0\n};\n\nLexerModule lmPS(SCLEX_PS, ColourisePSDoc, \"ps\", FoldPSDoc, psWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexPascal.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexPascal.cxx\n ** Lexer for Pascal.\n ** Written by Laurent le Tynevez\n ** Updated by Simon Steele <s.steele@pnotepad.org> September 2002\n ** Updated by Mathias Rauen <scite@madshi.net> May 2003 (Delphi adjustments)\n ** Completely rewritten by Marko Njezic <sf@maxempire.com> October 2008\n **/\n\n/*\n\nA few words about features of the new completely rewritten LexPascal...\n\nGenerally speaking LexPascal tries to support all available Delphi features (up\nto Delphi XE4 at this time).\n\n~ HIGHLIGHTING:\n\nIf you enable \"lexer.pascal.smart.highlighting\" property, some keywords will\nonly be highlighted in appropriate context. As implemented those are keywords\nrelated to property and DLL exports declarations (similar to how Delphi IDE\nworks).\n\nFor example, keywords \"read\" and \"write\" will only be highlighted if they are in\nproperty declaration:\n\nproperty MyProperty: boolean read FMyProperty write FMyProperty;\n\n~ FOLDING:\n\nFolding is supported in the following cases:\n\n- Folding of stream-like comments\n- Folding of groups of consecutive line comments\n- Folding of preprocessor blocks (the following preprocessor blocks are\nsupported: IF / IFEND; IFDEF, IFNDEF, IFOPT / ENDIF and REGION / ENDREGION\nblocks), including nesting of preprocessor blocks up to 255 levels\n- Folding of code blocks on appropriate keywords (the following code blocks are\nsupported: \"begin, asm, record, try, case / end\" blocks, class & object\ndeclarations and interface declarations)\n\nRemarks:\n\n- Folding of code blocks tries to handle all special cases in which folding\nshould not occur. As implemented those are:\n\n1. Structure \"record case / end\" (there's only one \"end\" statement and \"case\" is\nignored as fold point)\n2. Forward class declarations (\"type TMyClass = class;\") and object method\ndeclarations (\"TNotifyEvent = procedure(Sender: TObject) of object;\") are\nignored as fold points\n3. Simplified complete class declarations (\"type TMyClass = class(TObject);\")\nare ignored as fold points\n4. Every other situation when class keyword doesn't actually start class\ndeclaration (\"class procedure\", \"class function\", \"class of\", \"class var\",\n\"class property\" and \"class operator\")\n5. Forward (disp)interface declarations (\"type IMyInterface = interface;\") are\nignored as fold points\n\n- Folding of code blocks inside preprocessor blocks is disabled (any comments\ninside them will be folded fine) because there is no guarantee that complete\ncode block will be contained inside folded preprocessor block in which case\nfolded code block could end prematurely at the end of preprocessor block if\nthere is no closing statement inside. This was done in order to properly process\ndocument that may contain something like this:\n\ntype\n{$IFDEF UNICODE}\n  TMyClass = class(UnicodeAncestor)\n{$ELSE}\n  TMyClass = class(AnsiAncestor)\n{$ENDIF}\n  private\n  ...\n  public\n  ...\n  published\n  ...\nend;\n\nIf class declarations were folded, then the second class declaration would end\nat \"$ENDIF\" statement, first class statement would end at \"end;\" statement and\npreprocessor \"$IFDEF\" block would go all the way to the end of document.\nHowever, having in mind all this, if you want to enable folding of code blocks\ninside preprocessor blocks, you can disable folding of preprocessor blocks by\nchanging \"fold.preprocessor\" property, in which case everything inside them\nwould be folded.\n\n~ KEYWORDS:\n\nThe list of keywords that can be used in pascal.properties file (up to Delphi\nXE4):\n\n- Keywords: absolute abstract and array as asm assembler automated begin case\ncdecl class const constructor delayed deprecated destructor dispid dispinterface\ndiv do downto dynamic else end except experimental export exports external far\nfile final finalization finally for forward function goto helper if\nimplementation in inherited initialization inline interface is label library\nmessage mod near nil not object of on operator or out overload override packed\npascal platform private procedure program property protected public published\nraise record reference register reintroduce repeat resourcestring safecall\nsealed set shl shr static stdcall strict string then threadvar to try type unit\nunsafe until uses var varargs virtual while winapi with xor\n\n- Keywords related to the \"smart highlithing\" feature: add default implements\nindex name nodefault read readonly remove stored write writeonly\n\n- Keywords related to Delphi packages (in addition to all above): package\ncontains requires\n\n*/\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic void GetRangeLowered(unsigned int start,\n\t\tunsigned int end,\n\t\tAccessor &styler,\n\t\tchar *s,\n\t\tunsigned int len) {\n\tunsigned int i = 0;\n\twhile ((i < end - start + 1) && (i < len-1)) {\n\t\ts[i] = static_cast<char>(tolower(styler[start + i]));\n\t\ti++;\n\t}\n\ts[i] = '\\0';\n}\n\nstatic void GetForwardRangeLowered(unsigned int start,\n\t\tCharacterSet &charSet,\n\t\tAccessor &styler,\n\t\tchar *s,\n\t\tunsigned int len) {\n\tunsigned int i = 0;\n\twhile ((i < len-1) && charSet.Contains(styler.SafeGetCharAt(start + i))) {\n\t\ts[i] = static_cast<char>(tolower(styler.SafeGetCharAt(start + i)));\n\t\ti++;\n\t}\n\ts[i] = '\\0';\n\n}\n\nenum {\n\tstateInAsm = 0x1000,\n\tstateInProperty = 0x2000,\n\tstateInExport = 0x4000,\n\tstateFoldInPreprocessor = 0x0100,\n\tstateFoldInRecord = 0x0200,\n\tstateFoldInPreprocessorLevelMask = 0x00FF,\n\tstateFoldMaskAll = 0x0FFF\n};\n\nstatic void ClassifyPascalWord(WordList *keywordlists[], StyleContext &sc, int &curLineState, bool bSmartHighlighting) {\n\tWordList& keywords = *keywordlists[0];\n\n\tchar s[100];\n\tsc.GetCurrentLowered(s, sizeof(s));\n\tif (keywords.InList(s)) {\n\t\tif (curLineState & stateInAsm) {\n\t\t\tif (strcmp(s, \"end\") == 0 && sc.GetRelative(-4) != '@') {\n\t\t\t\tcurLineState &= ~stateInAsm;\n\t\t\t\tsc.ChangeState(SCE_PAS_WORD);\n\t\t\t} else {\n\t\t\t\tsc.ChangeState(SCE_PAS_ASM);\n\t\t\t}\n\t\t} else {\n\t\t\tbool ignoreKeyword = false;\n\t\t\tif (strcmp(s, \"asm\") == 0) {\n\t\t\t\tcurLineState |= stateInAsm;\n\t\t\t} else if (bSmartHighlighting) {\n\t\t\t\tif (strcmp(s, \"property\") == 0) {\n\t\t\t\t\tcurLineState |= stateInProperty;\n\t\t\t\t} else if (strcmp(s, \"exports\") == 0) {\n\t\t\t\t\tcurLineState |= stateInExport;\n\t\t\t\t} else if (!(curLineState & (stateInProperty | stateInExport)) && strcmp(s, \"index\") == 0) {\n\t\t\t\t\tignoreKeyword = true;\n\t\t\t\t} else if (!(curLineState & stateInExport) && strcmp(s, \"name\") == 0) {\n\t\t\t\t\tignoreKeyword = true;\n\t\t\t\t} else if (!(curLineState & stateInProperty) &&\n\t\t\t\t\t(strcmp(s, \"read\") == 0 || strcmp(s, \"write\") == 0 ||\n\t\t\t\t\t strcmp(s, \"default\") == 0 || strcmp(s, \"nodefault\") == 0 ||\n\t\t\t\t\t strcmp(s, \"stored\") == 0 || strcmp(s, \"implements\") == 0 ||\n\t\t\t\t\t strcmp(s, \"readonly\") == 0 || strcmp(s, \"writeonly\") == 0 ||\n\t\t\t\t\t strcmp(s, \"add\") == 0 || strcmp(s, \"remove\") == 0)) {\n\t\t\t\t\tignoreKeyword = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!ignoreKeyword) {\n\t\t\t\tsc.ChangeState(SCE_PAS_WORD);\n\t\t\t}\n\t\t}\n\t} else if (curLineState & stateInAsm) {\n\t\tsc.ChangeState(SCE_PAS_ASM);\n\t}\n\tsc.SetState(SCE_PAS_DEFAULT);\n}\n\nstatic void ColourisePascalDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n\t\tAccessor &styler) {\n\tbool bSmartHighlighting = styler.GetPropertyInt(\"lexer.pascal.smart.highlighting\", 1) != 0;\n\n\tCharacterSet setWordStart(CharacterSet::setAlpha, \"_\", 0x80, true);\n\tCharacterSet setWord(CharacterSet::setAlphaNum, \"_\", 0x80, true);\n\tCharacterSet setNumber(CharacterSet::setDigits, \".-+eE\");\n\tCharacterSet setHexNumber(CharacterSet::setDigits, \"abcdefABCDEF\");\n\tCharacterSet setOperator(CharacterSet::setNone, \"#$&'()*+,-./:;<=>@[]^{}\");\n\n\tint curLine = styler.GetLine(startPos);\n\tint curLineState = curLine > 0 ? styler.GetLineState(curLine - 1) : 0;\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\t\tif (sc.atLineEnd) {\n\t\t\t// Update the line state, so it can be seen by next line\n\t\t\tcurLine = styler.GetLine(sc.currentPos);\n\t\t\tstyler.SetLineState(curLine, curLineState);\n\t\t}\n\n\t\t// Determine if the current state should terminate.\n\t\tswitch (sc.state) {\n\t\t\tcase SCE_PAS_NUMBER:\n\t\t\t\tif (!setNumber.Contains(sc.ch) || (sc.ch == '.' && sc.chNext == '.')) {\n\t\t\t\t\tsc.SetState(SCE_PAS_DEFAULT);\n\t\t\t\t} else if (sc.ch == '-' || sc.ch == '+') {\n\t\t\t\t\tif (sc.chPrev != 'E' && sc.chPrev != 'e') {\n\t\t\t\t\t\tsc.SetState(SCE_PAS_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_PAS_IDENTIFIER:\n\t\t\t\tif (!setWord.Contains(sc.ch)) {\n\t\t\t\t\tClassifyPascalWord(keywordlists, sc, curLineState, bSmartHighlighting);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_PAS_HEXNUMBER:\n\t\t\t\tif (!setHexNumber.Contains(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_PAS_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_PAS_COMMENT:\n\t\t\tcase SCE_PAS_PREPROCESSOR:\n\t\t\t\tif (sc.ch == '}') {\n\t\t\t\t\tsc.ForwardSetState(SCE_PAS_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_PAS_COMMENT2:\n\t\t\tcase SCE_PAS_PREPROCESSOR2:\n\t\t\t\tif (sc.Match('*', ')')) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_PAS_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_PAS_COMMENTLINE:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_PAS_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_PAS_STRING:\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.ChangeState(SCE_PAS_STRINGEOL);\n\t\t\t\t} else if (sc.ch == '\\'' && sc.chNext == '\\'') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\t\tsc.ForwardSetState(SCE_PAS_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_PAS_STRINGEOL:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_PAS_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_PAS_CHARACTER:\n\t\t\t\tif (!setHexNumber.Contains(sc.ch) && sc.ch != '$') {\n\t\t\t\t\tsc.SetState(SCE_PAS_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_PAS_OPERATOR:\n\t\t\t\tif (bSmartHighlighting && sc.chPrev == ';') {\n\t\t\t\t\tcurLineState &= ~(stateInProperty | stateInExport);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_PAS_DEFAULT);\n\t\t\t\tbreak;\n\t\t\tcase SCE_PAS_ASM:\n\t\t\t\tsc.SetState(SCE_PAS_DEFAULT);\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_PAS_DEFAULT) {\n\t\t\tif (IsADigit(sc.ch) && !(curLineState & stateInAsm)) {\n\t\t\t\tsc.SetState(SCE_PAS_NUMBER);\n\t\t\t} else if (setWordStart.Contains(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_PAS_IDENTIFIER);\n\t\t\t} else if (sc.ch == '$' && !(curLineState & stateInAsm)) {\n\t\t\t\tsc.SetState(SCE_PAS_HEXNUMBER);\n\t\t\t} else if (sc.Match('{', '$')) {\n\t\t\t\tsc.SetState(SCE_PAS_PREPROCESSOR);\n\t\t\t} else if (sc.ch == '{') {\n\t\t\t\tsc.SetState(SCE_PAS_COMMENT);\n\t\t\t} else if (sc.Match(\"(*$\")) {\n\t\t\t\tsc.SetState(SCE_PAS_PREPROCESSOR2);\n\t\t\t} else if (sc.Match('(', '*')) {\n\t\t\t\tsc.SetState(SCE_PAS_COMMENT2);\n\t\t\t\tsc.Forward();\t// Eat the * so it isn't used for the end of the comment\n\t\t\t} else if (sc.Match('/', '/')) {\n\t\t\t\tsc.SetState(SCE_PAS_COMMENTLINE);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_PAS_STRING);\n\t\t\t} else if (sc.ch == '#') {\n\t\t\t\tsc.SetState(SCE_PAS_CHARACTER);\n\t\t\t} else if (setOperator.Contains(sc.ch) && !(curLineState & stateInAsm)) {\n\t\t\t\tsc.SetState(SCE_PAS_OPERATOR);\n\t\t\t} else if (curLineState & stateInAsm) {\n\t\t\t\tsc.SetState(SCE_PAS_ASM);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (sc.state == SCE_PAS_IDENTIFIER && setWord.Contains(sc.chPrev)) {\n\t\tClassifyPascalWord(keywordlists, sc, curLineState, bSmartHighlighting);\n\t}\n\n\tsc.Complete();\n}\n\nstatic bool IsStreamCommentStyle(int style) {\n\treturn style == SCE_PAS_COMMENT || style == SCE_PAS_COMMENT2;\n}\n\nstatic bool IsCommentLine(int line, Accessor &styler) {\n\tint pos = styler.LineStart(line);\n\tint eolPos = styler.LineStart(line + 1) - 1;\n\tfor (int i = pos; i < eolPos; i++) {\n\t\tchar ch = styler[i];\n\t\tchar chNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styler.StyleAt(i);\n\t\tif (ch == '/' && chNext == '/' && style == SCE_PAS_COMMENTLINE) {\n\t\t\treturn true;\n\t\t} else if (!IsASpaceOrTab(ch)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn false;\n}\n\nstatic unsigned int GetFoldInPreprocessorLevelFlag(int lineFoldStateCurrent) {\n\treturn lineFoldStateCurrent & stateFoldInPreprocessorLevelMask;\n}\n\nstatic void SetFoldInPreprocessorLevelFlag(int &lineFoldStateCurrent, unsigned int nestLevel) {\n\tlineFoldStateCurrent &= ~stateFoldInPreprocessorLevelMask;\n\tlineFoldStateCurrent |= nestLevel & stateFoldInPreprocessorLevelMask;\n}\n\nstatic void ClassifyPascalPreprocessorFoldPoint(int &levelCurrent, int &lineFoldStateCurrent,\n\t\tunsigned int startPos, Accessor &styler) {\n\tCharacterSet setWord(CharacterSet::setAlpha);\n\n\tchar s[11];\t// Size of the longest possible keyword + one additional character + null\n\tGetForwardRangeLowered(startPos, setWord, styler, s, sizeof(s));\n\n\tunsigned int nestLevel = GetFoldInPreprocessorLevelFlag(lineFoldStateCurrent);\n\n\tif (strcmp(s, \"if\") == 0 ||\n\t\tstrcmp(s, \"ifdef\") == 0 ||\n\t\tstrcmp(s, \"ifndef\") == 0 ||\n\t\tstrcmp(s, \"ifopt\") == 0 ||\n\t\tstrcmp(s, \"region\") == 0) {\n\t\tnestLevel++;\n\t\tSetFoldInPreprocessorLevelFlag(lineFoldStateCurrent, nestLevel);\n\t\tlineFoldStateCurrent |= stateFoldInPreprocessor;\n\t\tlevelCurrent++;\n\t} else if (strcmp(s, \"endif\") == 0 ||\n\t\tstrcmp(s, \"ifend\") == 0 ||\n\t\tstrcmp(s, \"endregion\") == 0) {\n\t\tnestLevel--;\n\t\tSetFoldInPreprocessorLevelFlag(lineFoldStateCurrent, nestLevel);\n\t\tif (nestLevel == 0) {\n\t\t\tlineFoldStateCurrent &= ~stateFoldInPreprocessor;\n\t\t}\n\t\tlevelCurrent--;\n\t\tif (levelCurrent < SC_FOLDLEVELBASE) {\n\t\t\tlevelCurrent = SC_FOLDLEVELBASE;\n\t\t}\n\t}\n}\n\nstatic unsigned int SkipWhiteSpace(unsigned int currentPos, unsigned int endPos,\n\t\tAccessor &styler, bool includeChars = false) {\n\tCharacterSet setWord(CharacterSet::setAlphaNum, \"_\");\n\tunsigned int j = currentPos + 1;\n\tchar ch = styler.SafeGetCharAt(j);\n\twhile ((j < endPos) && (IsASpaceOrTab(ch) || ch == '\\r' || ch == '\\n' ||\n\t\tIsStreamCommentStyle(styler.StyleAt(j)) || (includeChars && setWord.Contains(ch)))) {\n\t\tj++;\n\t\tch = styler.SafeGetCharAt(j);\n\t}\n\treturn j;\n}\n\nstatic void ClassifyPascalWordFoldPoint(int &levelCurrent, int &lineFoldStateCurrent,\n\t\tint startPos, unsigned int endPos,\n\t\tunsigned int lastStart, unsigned int currentPos, Accessor &styler) {\n\tchar s[100];\n\tGetRangeLowered(lastStart, currentPos, styler, s, sizeof(s));\n\n\tif (strcmp(s, \"record\") == 0) {\n\t\tlineFoldStateCurrent |= stateFoldInRecord;\n\t\tlevelCurrent++;\n\t} else if (strcmp(s, \"begin\") == 0 ||\n\t\tstrcmp(s, \"asm\") == 0 ||\n\t\tstrcmp(s, \"try\") == 0 ||\n\t\t(strcmp(s, \"case\") == 0 && !(lineFoldStateCurrent & stateFoldInRecord))) {\n\t\tlevelCurrent++;\n\t} else if (strcmp(s, \"class\") == 0 || strcmp(s, \"object\") == 0) {\n\t\t// \"class\" & \"object\" keywords require special handling...\n\t\tbool ignoreKeyword = false;\n\t\tunsigned int j = SkipWhiteSpace(currentPos, endPos, styler);\n\t\tif (j < endPos) {\n\t\t\tCharacterSet setWordStart(CharacterSet::setAlpha, \"_\");\n\t\t\tCharacterSet setWord(CharacterSet::setAlphaNum, \"_\");\n\n\t\t\tif (styler.SafeGetCharAt(j) == ';') {\n\t\t\t\t// Handle forward class declarations (\"type TMyClass = class;\")\n\t\t\t\t// and object method declarations (\"TNotifyEvent = procedure(Sender: TObject) of object;\")\n\t\t\t\tignoreKeyword = true;\n\t\t\t} else if (strcmp(s, \"class\") == 0) {\n\t\t\t\t// \"class\" keyword has a few more special cases...\n\t\t\t\tif (styler.SafeGetCharAt(j) == '(') {\n\t\t\t\t\t// Handle simplified complete class declarations (\"type TMyClass = class(TObject);\")\n\t\t\t\t\tj = SkipWhiteSpace(j, endPos, styler, true);\n\t\t\t\t\tif (j < endPos && styler.SafeGetCharAt(j) == ')') {\n\t\t\t\t\t\tj = SkipWhiteSpace(j, endPos, styler);\n\t\t\t\t\t\tif (j < endPos && styler.SafeGetCharAt(j) == ';') {\n\t\t\t\t\t\t\tignoreKeyword = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (setWordStart.Contains(styler.SafeGetCharAt(j))) {\n\t\t\t\t\tchar s2[11];\t// Size of the longest possible keyword + one additional character + null\n\t\t\t\t\tGetForwardRangeLowered(j, setWord, styler, s2, sizeof(s2));\n\n\t\t\t\t\tif (strcmp(s2, \"procedure\") == 0 ||\n\t\t\t\t\t\tstrcmp(s2, \"function\") == 0 ||\n\t\t\t\t\t\tstrcmp(s2, \"of\") == 0 ||\n\t\t\t\t\t\tstrcmp(s2, \"var\") == 0 ||\n\t\t\t\t\t\tstrcmp(s2, \"property\") == 0 ||\n\t\t\t\t\t\tstrcmp(s2, \"operator\") == 0) {\n\t\t\t\t\t\tignoreKeyword = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!ignoreKeyword) {\n\t\t\tlevelCurrent++;\n\t\t}\n\t} else if (strcmp(s, \"interface\") == 0) {\n\t\t// \"interface\" keyword requires special handling...\n\t\tbool ignoreKeyword = true;\n\t\tint j = lastStart - 1;\n\t\tchar ch = styler.SafeGetCharAt(j);\n\t\twhile ((j >= startPos) && (IsASpaceOrTab(ch) || ch == '\\r' || ch == '\\n' ||\n\t\t\tIsStreamCommentStyle(styler.StyleAt(j)))) {\n\t\t\tj--;\n\t\t\tch = styler.SafeGetCharAt(j);\n\t\t}\n\t\tif (j >= startPos && styler.SafeGetCharAt(j) == '=') {\n\t\t\tignoreKeyword = false;\n\t\t}\n\t\tif (!ignoreKeyword) {\n\t\t\tunsigned int k = SkipWhiteSpace(currentPos, endPos, styler);\n\t\t\tif (k < endPos && styler.SafeGetCharAt(k) == ';') {\n\t\t\t\t// Handle forward interface declarations (\"type IMyInterface = interface;\")\n\t\t\t\tignoreKeyword = true;\n\t\t\t}\n\t\t}\n\t\tif (!ignoreKeyword) {\n\t\t\tlevelCurrent++;\n\t\t}\n\t} else if (strcmp(s, \"dispinterface\") == 0) {\n\t\t// \"dispinterface\" keyword requires special handling...\n\t\tbool ignoreKeyword = false;\n\t\tunsigned int j = SkipWhiteSpace(currentPos, endPos, styler);\n\t\tif (j < endPos && styler.SafeGetCharAt(j) == ';') {\n\t\t\t// Handle forward dispinterface declarations (\"type IMyInterface = dispinterface;\")\n\t\t\tignoreKeyword = true;\n\t\t}\n\t\tif (!ignoreKeyword) {\n\t\t\tlevelCurrent++;\n\t\t}\n\t} else if (strcmp(s, \"end\") == 0) {\n\t\tlineFoldStateCurrent &= ~stateFoldInRecord;\n\t\tlevelCurrent--;\n\t\tif (levelCurrent < SC_FOLDLEVELBASE) {\n\t\t\tlevelCurrent = SC_FOLDLEVELBASE;\n\t\t}\n\t}\n}\n\nstatic void FoldPascalDoc(unsigned int startPos, int length, int initStyle, WordList *[],\n\t\tAccessor &styler) {\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldPreprocessor = styler.GetPropertyInt(\"fold.preprocessor\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tint lineFoldStateCurrent = lineCurrent > 0 ? styler.GetLineState(lineCurrent - 1) & stateFoldMaskAll : 0;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\n\tint lastStart = 0;\n\tCharacterSet setWord(CharacterSet::setAlphaNum, \"_\", 0x80, true);\n\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\n\t\tif (foldComment && IsStreamCommentStyle(style)) {\n\t\t\tif (!IsStreamCommentStyle(stylePrev)) {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (!IsStreamCommentStyle(styleNext) && !atEOL) {\n\t\t\t\t// Comments don't end at end of line and the next character may be unstyled.\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\t\tif (foldComment && atEOL && IsCommentLine(lineCurrent, styler))\n\t\t{\n\t\t\tif (!IsCommentLine(lineCurrent - 1, styler)\n\t\t\t    && IsCommentLine(lineCurrent + 1, styler))\n\t\t\t\tlevelCurrent++;\n\t\t\telse if (IsCommentLine(lineCurrent - 1, styler)\n\t\t\t         && !IsCommentLine(lineCurrent+1, styler))\n\t\t\t\tlevelCurrent--;\n\t\t}\n\t\tif (foldPreprocessor) {\n\t\t\tif (style == SCE_PAS_PREPROCESSOR && ch == '{' && chNext == '$') {\n\t\t\t\tClassifyPascalPreprocessorFoldPoint(levelCurrent, lineFoldStateCurrent, i + 2, styler);\n\t\t\t} else if (style == SCE_PAS_PREPROCESSOR2 && ch == '(' && chNext == '*'\n\t\t\t           && styler.SafeGetCharAt(i + 2) == '$') {\n\t\t\t\tClassifyPascalPreprocessorFoldPoint(levelCurrent, lineFoldStateCurrent, i + 3, styler);\n\t\t\t}\n\t\t}\n\n\t\tif (stylePrev != SCE_PAS_WORD && style == SCE_PAS_WORD)\n\t\t{\n\t\t\t// Store last word start point.\n\t\t\tlastStart = i;\n\t\t}\n\t\tif (stylePrev == SCE_PAS_WORD && !(lineFoldStateCurrent & stateFoldInPreprocessor)) {\n\t\t\tif(setWord.Contains(ch) && !setWord.Contains(chNext)) {\n\t\t\t\tClassifyPascalWordFoldPoint(levelCurrent, lineFoldStateCurrent, startPos, endPos, lastStart, i, styler);\n\t\t\t}\n\t\t}\n\n\t\tif (!IsASpace(ch))\n\t\t\tvisibleChars++;\n\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tint newLineState = (styler.GetLineState(lineCurrent) & ~stateFoldMaskAll) | lineFoldStateCurrent;\n\t\t\tstyler.SetLineState(lineCurrent, newLineState);\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t}\n\n\t// If we didn't reach the EOL in previous loop, store line level and whitespace information.\n\t// The rest will be filled in later...\n\tint lev = levelPrev;\n\tif (visibleChars == 0 && foldCompact)\n\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\tstyler.SetLevel(lineCurrent, lev);\n}\n\nstatic const char * const pascalWordListDesc[] = {\n\t\"Keywords\",\n\t0\n};\n\nLexerModule lmPascal(SCLEX_PASCAL, ColourisePascalDoc, \"pascal\", FoldPascalDoc, pascalWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexPerl.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexPerl.cxx\n ** Lexer for Perl.\n ** Converted to lexer object by \"Udo Lechner\" <dlchnr(at)gmx(dot)net>\n **/\n// Copyright 1998-2008 by Neil Hodgson <neilh@scintilla.org>\n// Lexical analysis fixes by Kein-Hong Man <mkh@pl.jaring.my>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include <string>\n#include <map>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n#include \"OptionSet.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n// Info for HERE document handling from perldata.pod (reformatted):\n// ----------------------------------------------------------------\n// A line-oriented form of quoting is based on the shell ``here-doc'' syntax.\n// Following a << you specify a string to terminate the quoted material, and\n// all lines following the current line down to the terminating string are\n// the value of the item.\n// * The terminating string may be either an identifier (a word), or some\n//   quoted text.\n// * If quoted, the type of quotes you use determines the treatment of the\n//   text, just as in regular quoting.\n// * An unquoted identifier works like double quotes.\n// * There must be no space between the << and the identifier.\n//   (If you put a space it will be treated as a null identifier,\n//    which is valid, and matches the first empty line.)\n//   (This is deprecated, -w warns of this syntax)\n// * The terminating string must appear by itself (unquoted and\n//   with no surrounding whitespace) on the terminating line.\n\n#define HERE_DELIM_MAX 256\t\t// maximum length of HERE doc delimiter\n\n#define PERLNUM_BINARY\t\t1\t// order is significant: 1-4 cannot have a dot\n#define PERLNUM_HEX\t\t\t2\n#define PERLNUM_OCTAL\t\t3\n#define PERLNUM_FLOAT_EXP\t4\t// exponent part only\n#define PERLNUM_DECIMAL\t\t5\t// 1-5 are numbers; 6-7 are strings\n#define PERLNUM_VECTOR\t\t6\n#define PERLNUM_V_VECTOR\t7\n#define PERLNUM_BAD\t\t\t8\n\n#define BACK_NONE\t\t0\t// lookback state for bareword disambiguation:\n#define BACK_OPERATOR\t1\t// whitespace/comments are insignificant\n#define BACK_KEYWORD\t2\t// operators/keywords are needed for disambiguation\n\n// all interpolated styles are different from their parent styles by a constant difference\n// we also assume SCE_PL_STRING_VAR is the interpolated style with the smallest value\n#define\tINTERPOLATE_SHIFT\t(SCE_PL_STRING_VAR - SCE_PL_STRING)\n\nstatic bool isPerlKeyword(unsigned int start, unsigned int end, WordList &keywords, LexAccessor &styler) {\n\t// old-style keyword matcher; needed because GetCurrent() needs\n\t// current segment to be committed, but we may abandon early...\n\tchar s[100];\n\tunsigned int i, len = end - start;\n\tif (len > 30) { len = 30; }\n\tfor (i = 0; i < len; i++, start++) s[i] = styler[start];\n\ts[i] = '\\0';\n\treturn keywords.InList(s);\n}\n\nstatic int disambiguateBareword(LexAccessor &styler, unsigned int bk, unsigned int fw,\n        int backFlag, unsigned int backPos, unsigned int endPos) {\n\t// identifiers are recognized by Perl as barewords under some\n\t// conditions, the following attempts to do the disambiguation\n\t// by looking backward and forward; result in 2 LSB\n\tint result = 0;\n\tbool moreback = false;\t\t// true if passed newline/comments\n\tbool brace = false;\t\t\t// true if opening brace found\n\t// if BACK_NONE, neither operator nor keyword, so skip test\n\tif (backFlag == BACK_NONE)\n\t\treturn result;\n\t// first look backwards past whitespace/comments to set EOL flag\n\t// (some disambiguation patterns must be on a single line)\n\tif (backPos <= static_cast<unsigned int>(styler.LineStart(styler.GetLine(bk))))\n\t\tmoreback = true;\n\t// look backwards at last significant lexed item for disambiguation\n\tbk = backPos - 1;\n\tint ch = static_cast<unsigned char>(styler.SafeGetCharAt(bk));\n\tif (ch == '{' && !moreback) {\n\t\t// {bareword: possible variable spec\n\t\tbrace = true;\n\t} else if ((ch == '&' && styler.SafeGetCharAt(bk - 1) != '&')\n\t        // &bareword: subroutine call\n\t        || styler.Match(bk - 1, \"->\")\n\t        // ->bareword: part of variable spec\n\t        || styler.Match(bk - 2, \"sub\")) {\n\t\t// sub bareword: subroutine declaration\n\t\t// (implied BACK_KEYWORD, no keywords end in 'sub'!)\n\t\tresult |= 1;\n\t}\n\t// next, scan forward after word past tab/spaces only;\n\t// if ch isn't one of '[{(,' we can skip the test\n\tif ((ch == '{' || ch == '(' || ch == '['|| ch == ',')\n\t        && fw < endPos) {\n\t\twhile (ch = static_cast<unsigned char>(styler.SafeGetCharAt(fw)),\n\t\t        IsASpaceOrTab(ch) && fw < endPos) {\n\t\t\tfw++;\n\t\t}\n\t\tif ((ch == '}' && brace)\n\t\t        // {bareword}: variable spec\n\t\t        || styler.Match(fw, \"=>\")) {\n\t\t\t// [{(, bareword=>: hash literal\n\t\t\tresult |= 2;\n\t\t}\n\t}\n\treturn result;\n}\n\nstatic void skipWhitespaceComment(LexAccessor &styler, unsigned int &p) {\n\t// when backtracking, we need to skip whitespace and comments\n\tint style;\n\twhile ((p > 0) && (style = styler.StyleAt(p),\n\t        style == SCE_PL_DEFAULT || style == SCE_PL_COMMENTLINE))\n\t\tp--;\n}\n\nstatic int styleBeforeBracePair(LexAccessor &styler, unsigned int bk) {\n\t// backtrack to find open '{' corresponding to a '}', balanced\n\t// return significant style to be tested for '/' disambiguation\n\tint braceCount = 1;\n\tif (bk == 0)\n\t\treturn SCE_PL_DEFAULT;\n\twhile (--bk > 0) {\n\t\tif (styler.StyleAt(bk) == SCE_PL_OPERATOR) {\n\t\t\tint bkch = static_cast<unsigned char>(styler.SafeGetCharAt(bk));\n\t\t\tif (bkch == ';') {\t// early out\n\t\t\t\tbreak;\n\t\t\t} else if (bkch == '}') {\n\t\t\t\tbraceCount++;\n\t\t\t} else if (bkch == '{') {\n\t\t\t\tif (--braceCount == 0) break;\n\t\t\t}\n\t\t}\n\t}\n\tif (bk > 0 && braceCount == 0) {\n\t\t// balanced { found, bk > 0, skip more whitespace/comments\n\t\tbk--;\n\t\tskipWhitespaceComment(styler, bk);\n\t\treturn styler.StyleAt(bk);\n\t}\n\treturn SCE_PL_DEFAULT;\n}\n\nstatic int styleCheckIdentifier(LexAccessor &styler, unsigned int bk) {\n\t// backtrack to classify sub-styles of identifier under test\n\t// return sub-style to be tested for '/' disambiguation\n\tif (styler.SafeGetCharAt(bk) == '>')\t// inputsymbol, like <foo>\n\t\treturn 1;\n\t// backtrack to check for possible \"->\" or \"::\" before identifier\n\twhile (bk > 0 && styler.StyleAt(bk) == SCE_PL_IDENTIFIER) {\n\t\tbk--;\n\t}\n\twhile (bk > 0) {\n\t\tint bkstyle = styler.StyleAt(bk);\n\t\tif (bkstyle == SCE_PL_DEFAULT\n\t\t        || bkstyle == SCE_PL_COMMENTLINE) {\n\t\t\t// skip whitespace, comments\n\t\t} else if (bkstyle == SCE_PL_OPERATOR) {\n\t\t\t// test for \"->\" and \"::\"\n\t\t\tif (styler.Match(bk - 1, \"->\") || styler.Match(bk - 1, \"::\"))\n\t\t\t\treturn 2;\n\t\t} else\n\t\t\treturn 3;\t// bare identifier\n\t\tbk--;\n\t}\n\treturn 0;\n}\n\nstatic int podLineScan(LexAccessor &styler, unsigned int &pos, unsigned int endPos) {\n\t// forward scan the current line to classify line for POD style\n\tint state = -1;\n\twhile (pos < endPos) {\n\t\tint ch = static_cast<unsigned char>(styler.SafeGetCharAt(pos));\n\t\tif (ch == '\\n' || ch == '\\r') {\n\t\t\tif (ch == '\\r' && styler.SafeGetCharAt(pos + 1) == '\\n') pos++;\n\t\t\tbreak;\n\t\t}\n\t\tif (IsASpaceOrTab(ch)) {\t// whitespace, take note\n\t\t\tif (state == -1)\n\t\t\t\tstate = SCE_PL_DEFAULT;\n\t\t} else if (state == SCE_PL_DEFAULT) {\t// verbatim POD line\n\t\t\tstate = SCE_PL_POD_VERB;\n\t\t} else if (state != SCE_PL_POD_VERB) {\t// regular POD line\n\t\t\tstate = SCE_PL_POD;\n\t\t}\n\t\tpos++;\n\t}\n\tif (state == -1)\n\t\tstate = SCE_PL_DEFAULT;\n\treturn state;\n}\n\nstatic bool styleCheckSubPrototype(LexAccessor &styler, unsigned int bk) {\n\t// backtrack to identify if we're starting a subroutine prototype\n\t// we also need to ignore whitespace/comments:\n\t// 'sub' [whitespace|comment] <identifier> [whitespace|comment]\n\tstyler.Flush();\n\tskipWhitespaceComment(styler, bk);\n\tif (bk == 0 || styler.StyleAt(bk) != SCE_PL_IDENTIFIER)\t// check identifier\n\t\treturn false;\n\twhile (bk > 0 && (styler.StyleAt(bk) == SCE_PL_IDENTIFIER)) {\n\t\tbk--;\n\t}\n\tskipWhitespaceComment(styler, bk);\n\tif (bk < 2 || styler.StyleAt(bk) != SCE_PL_WORD\t// check \"sub\" keyword\n\t        || !styler.Match(bk - 2, \"sub\"))\t// assume suffix is unique!\n\t\treturn false;\n\treturn true;\n}\n\nstatic int actualNumStyle(int numberStyle) {\n\tif (numberStyle == PERLNUM_VECTOR || numberStyle == PERLNUM_V_VECTOR) {\n\t\treturn SCE_PL_STRING;\n\t} else if (numberStyle == PERLNUM_BAD) {\n\t\treturn SCE_PL_ERROR;\n\t}\n\treturn SCE_PL_NUMBER;\n}\n\nstatic int opposite(int ch) {\n\tif (ch == '(') return ')';\n\tif (ch == '[') return ']';\n\tif (ch == '{') return '}';\n\tif (ch == '<') return '>';\n\treturn ch;\n}\n\nstatic bool IsCommentLine(int line, LexAccessor &styler) {\n\tint pos = styler.LineStart(line);\n\tint eol_pos = styler.LineStart(line + 1) - 1;\n\tfor (int i = pos; i < eol_pos; i++) {\n\t\tchar ch = styler[i];\n\t\tint style = styler.StyleAt(i);\n\t\tif (ch == '#' && style == SCE_PL_COMMENTLINE)\n\t\t\treturn true;\n\t\telse if (!IsASpaceOrTab(ch))\n\t\t\treturn false;\n\t}\n\treturn false;\n}\n\nstatic bool IsPackageLine(int line, LexAccessor &styler) {\n\tint pos = styler.LineStart(line);\n\tint style = styler.StyleAt(pos);\n\tif (style == SCE_PL_WORD && styler.Match(pos, \"package\")) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nstatic int PodHeadingLevel(int pos, LexAccessor &styler) {\n\tint lvl = static_cast<unsigned char>(styler.SafeGetCharAt(pos + 5));\n\tif (lvl >= '1' && lvl <= '4') {\n\t\treturn lvl - '0';\n\t}\n\treturn 0;\n}\n\n// An individual named option for use in an OptionSet\n\n// Options used for LexerPerl\nstruct OptionsPerl {\n\tbool fold;\n\tbool foldComment;\n\tbool foldCompact;\n\t// Custom folding of POD and packages\n\tbool foldPOD;            // fold.perl.pod\n\t// Enable folding Pod blocks when using the Perl lexer.\n\tbool foldPackage;        // fold.perl.package\n\t// Enable folding packages when using the Perl lexer.\n\n\tbool foldCommentExplicit;\n\n\tbool foldAtElse;\n\n\tOptionsPerl() {\n\t\tfold = false;\n\t\tfoldComment = false;\n\t\tfoldCompact = true;\n\t\tfoldPOD = true;\n\t\tfoldPackage = true;\n\t\tfoldCommentExplicit = true;\n\t\tfoldAtElse = false;\n\t}\n};\n\nstatic const char *const perlWordListDesc[] = {\n\t\"Keywords\",\n\t0\n};\n\nstruct OptionSetPerl : public OptionSet<OptionsPerl> {\n\tOptionSetPerl() {\n\t\tDefineProperty(\"fold\", &OptionsPerl::fold);\n\n\t\tDefineProperty(\"fold.comment\", &OptionsPerl::foldComment);\n\n\t\tDefineProperty(\"fold.compact\", &OptionsPerl::foldCompact);\n\n\t\tDefineProperty(\"fold.perl.pod\", &OptionsPerl::foldPOD,\n\t\t        \"Set to 0 to disable folding Pod blocks when using the Perl lexer.\");\n\n\t\tDefineProperty(\"fold.perl.package\", &OptionsPerl::foldPackage,\n\t\t        \"Set to 0 to disable folding packages when using the Perl lexer.\");\n\n\t\tDefineProperty(\"fold.perl.comment.explicit\", &OptionsPerl::foldCommentExplicit,\n\t\t        \"Set to 0 to disable explicit folding.\");\n\n\t\tDefineProperty(\"fold.perl.at.else\", &OptionsPerl::foldAtElse,\n\t\t               \"This option enables Perl folding on a \\\"} else {\\\" line of an if statement.\");\n\n\t\tDefineWordListSets(perlWordListDesc);\n\t}\n};\n\nclass LexerPerl : public ILexer {\n\tCharacterSet setWordStart;\n\tCharacterSet setWord;\n\tCharacterSet setSpecialVar;\n\tCharacterSet setControlVar;\n\tWordList keywords;\n\tOptionsPerl options;\n\tOptionSetPerl osPerl;\npublic:\n\tLexerPerl() :\n\t\tsetWordStart(CharacterSet::setAlpha, \"_\", 0x80, true),\n\t\tsetWord(CharacterSet::setAlphaNum, \"_\", 0x80, true),\n\t\tsetSpecialVar(CharacterSet::setNone, \"\\\"$;<>&`'+,./\\\\%:=~!?@[]\"),\n\t\tsetControlVar(CharacterSet::setNone, \"ACDEFHILMNOPRSTVWX\") {\n\t}\n\tvirtual ~LexerPerl() {\n\t}\n\tvoid SCI_METHOD Release() {\n\t\tdelete this;\n\t}\n\tint SCI_METHOD Version() const {\n\t\treturn lvOriginal;\n\t}\n\tconst char *SCI_METHOD PropertyNames() {\n\t\treturn osPerl.PropertyNames();\n\t}\n\tint SCI_METHOD PropertyType(const char *name) {\n\t\treturn osPerl.PropertyType(name);\n\t}\n\tconst char *SCI_METHOD DescribeProperty(const char *name) {\n\t\treturn osPerl.DescribeProperty(name);\n\t}\n\tint SCI_METHOD PropertySet(const char *key, const char *val);\n\tconst char *SCI_METHOD DescribeWordListSets() {\n\t\treturn osPerl.DescribeWordListSets();\n\t}\n\tint SCI_METHOD WordListSet(int n, const char *wl);\n\tvoid SCI_METHOD Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n\tvoid SCI_METHOD Fold(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n\n\tvoid *SCI_METHOD PrivateCall(int, void *) {\n\t\treturn 0;\n\t}\n\n\tstatic ILexer *LexerFactoryPerl() {\n\t\treturn new LexerPerl();\n\t}\n\tint InputSymbolScan(StyleContext &sc);\n\tvoid InterpolateSegment(StyleContext &sc, int maxSeg, bool isPattern=false);\n};\n\nint SCI_METHOD LexerPerl::PropertySet(const char *key, const char *val) {\n\tif (osPerl.PropertySet(&options, key, val)) {\n\t\treturn 0;\n\t}\n\treturn -1;\n}\n\nint SCI_METHOD LexerPerl::WordListSet(int n, const char *wl) {\n\tWordList *wordListN = 0;\n\tswitch (n) {\n\tcase 0:\n\t\twordListN = &keywords;\n\t\tbreak;\n\t}\n\tint firstModification = -1;\n\tif (wordListN) {\n\t\tWordList wlNew;\n\t\twlNew.Set(wl);\n\t\tif (*wordListN != wlNew) {\n\t\t\twordListN->Set(wl);\n\t\t\tfirstModification = 0;\n\t\t}\n\t}\n\treturn firstModification;\n}\n\nint LexerPerl::InputSymbolScan(StyleContext &sc) {\n\t// forward scan for matching > on same line; file handles\n\tint c, sLen = 0;\n\twhile ((c = sc.GetRelativeCharacter(++sLen)) != 0) {\n\t\tif (c == '\\r' || c == '\\n') {\n\t\t\treturn 0;\n\t\t} else if (c == '>') {\n\t\t\tif (sc.Match(\"<=>\"))\t// '<=>' case\n\t\t\t\treturn 0;\n\t\t\treturn sLen;\n\t\t}\n\t}\n\treturn 0;\n}\n\nvoid LexerPerl::InterpolateSegment(StyleContext &sc, int maxSeg, bool isPattern) {\n\t// interpolate a segment (with no active backslashes or delimiters within)\n\t// switch in or out of an interpolation style or continue current style\n\t// commit variable patterns if found, trim segment, repeat until done\n\twhile (maxSeg > 0) {\n\t\tbool isVar = false;\n\t\tint sLen = 0;\n\t\tif ((maxSeg > 1) && (sc.ch == '$' || sc.ch == '@')) {\n\t\t\t// $#[$]*word [$@][$]*word (where word or {word} is always present)\n\t\t\tbool braces = false;\n\t\t\tsLen = 1;\n\t\t\tif (sc.ch == '$' && sc.chNext == '#') {\t// starts with $#\n\t\t\t\tsLen++;\n\t\t\t}\n\t\t\twhile ((maxSeg > sLen) && (sc.GetRelativeCharacter(sLen) == '$'))\t// >0 $ dereference within\n\t\t\t\tsLen++;\n\t\t\tif ((maxSeg > sLen) && (sc.GetRelativeCharacter(sLen) == '{')) {\t// { start for {word}\n\t\t\t\tsLen++;\n\t\t\t\tbraces = true;\n\t\t\t}\n\t\t\tif (maxSeg > sLen) {\n\t\t\t\tint c = sc.GetRelativeCharacter(sLen);\n\t\t\t\tif (setWordStart.Contains(c)) {\t// word (various)\n\t\t\t\t\tsLen++;\n\t\t\t\t\tisVar = true;\n\t\t\t\t\twhile (maxSeg > sLen) {\n\t\t\t\t\t\tif (!setWord.Contains(sc.GetRelativeCharacter(sLen)))\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tsLen++;\n\t\t\t\t\t}\n\t\t\t\t} else if (braces && IsADigit(c) && (sLen == 2)) {\t// digit for ${digit}\n\t\t\t\t\tsLen++;\n\t\t\t\t\tisVar = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (braces) {\n\t\t\t\tif ((maxSeg > sLen) && (sc.GetRelativeCharacter(sLen) == '}')) {\t// } end for {word}\n\t\t\t\t\tsLen++;\n\t\t\t\t} else\n\t\t\t\t\tisVar = false;\n\t\t\t}\n\t\t}\n\t\tif (!isVar && (maxSeg > 1)) {\t// $- or @-specific variable patterns\n\t\t\tint c = sc.chNext;\n\t\t\tif (sc.ch == '$') {\n\t\t\t\tsLen = 1;\n\t\t\t\tif (IsADigit(c)) {\t// $[0-9] and slurp trailing digits\n\t\t\t\t\tsLen++;\n\t\t\t\t\tisVar = true;\n\t\t\t\t\twhile ((maxSeg > sLen) && IsADigit(sc.GetRelativeCharacter(sLen)))\n\t\t\t\t\t\tsLen++;\n\t\t\t\t} else if (setSpecialVar.Contains(c)) {\t// $ special variables\n\t\t\t\t\tsLen++;\n\t\t\t\t\tisVar = true;\n\t\t\t\t} else if (!isPattern && ((c == '(') || (c == ')') || (c == '|'))) {\t// $ additional\n\t\t\t\t\tsLen++;\n\t\t\t\t\tisVar = true;\n\t\t\t\t} else if (c == '^') {\t// $^A control-char style\n\t\t\t\t\tsLen++;\n\t\t\t\t\tif ((maxSeg > sLen) && setControlVar.Contains(sc.GetRelativeCharacter(sLen))) {\n\t\t\t\t\t\tsLen++;\n\t\t\t\t\t\tisVar = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '@') {\n\t\t\t\tsLen = 1;\n\t\t\t\tif (!isPattern && ((c == '+') || (c == '-'))) {\t// @ specials non-pattern\n\t\t\t\t\tsLen++;\n\t\t\t\t\tisVar = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (isVar) {\t// commit as interpolated variable or normal character\n\t\t\tif (sc.state < SCE_PL_STRING_VAR)\n\t\t\t\tsc.SetState(sc.state + INTERPOLATE_SHIFT);\n\t\t\tsc.Forward(sLen);\n\t\t\tmaxSeg -= sLen;\n\t\t} else {\n\t\t\tif (sc.state >= SCE_PL_STRING_VAR)\n\t\t\t\tsc.SetState(sc.state - INTERPOLATE_SHIFT);\n\t\t\tsc.Forward();\n\t\t\tmaxSeg--;\n\t\t}\n\t}\n\tif (sc.state >= SCE_PL_STRING_VAR)\n\t\tsc.SetState(sc.state - INTERPOLATE_SHIFT);\n}\n\nvoid SCI_METHOD LexerPerl::Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n\tLexAccessor styler(pAccess);\n\n\t// keywords that forces /PATTERN/ at all times; should track vim's behaviour\n\tWordList reWords;\n\treWords.Set(\"elsif if split while\");\n\n\t// charset classes\n\tCharacterSet setSingleCharOp(CharacterSet::setNone, \"rwxoRWXOezsfdlpSbctugkTBMAC\");\n\t// lexing of \"%*</\" operators is non-trivial; these are missing in the set below\n\tCharacterSet setPerlOperator(CharacterSet::setNone, \"^&\\\\()-+=|{}[]:;>,?!.~\");\n\tCharacterSet setQDelim(CharacterSet::setNone, \"qrwx\");\n\tCharacterSet setModifiers(CharacterSet::setAlpha);\n\tCharacterSet setPreferRE(CharacterSet::setNone, \"*/<%\");\n\t// setArray and setHash also accepts chars for special vars like $_,\n\t// which are then truncated when the next char does not match setVar\n\tCharacterSet setVar(CharacterSet::setAlphaNum, \"#$_'\", 0x80, true);\n\tCharacterSet setArray(CharacterSet::setAlpha, \"#$_+-\", 0x80, true);\n\tCharacterSet setHash(CharacterSet::setAlpha, \"#$_!^+-\", 0x80, true);\n\tCharacterSet &setPOD = setModifiers;\n\tCharacterSet setNonHereDoc(CharacterSet::setDigits, \"=$@\");\n\tCharacterSet setHereDocDelim(CharacterSet::setAlphaNum, \"_\");\n\tCharacterSet setSubPrototype(CharacterSet::setNone, \"\\\\[$@%&*+];\");\n\t// for format identifiers\n\tCharacterSet setFormatStart(CharacterSet::setAlpha, \"_=\");\n\tCharacterSet &setFormat = setHereDocDelim;\n\n\t// Lexer for perl often has to backtrack to start of current style to determine\n\t// which characters are being used as quotes, how deeply nested is the\n\t// start position and what the termination string is for HERE documents.\n\n\tclass HereDocCls {\t// Class to manage HERE doc sequence\n\tpublic:\n\t\tint State;\n\t\t// 0: '<<' encountered\n\t\t// 1: collect the delimiter\n\t\t// 2: here doc text (lines after the delimiter)\n\t\tint Quote;\t\t// the char after '<<'\n\t\tbool Quoted;\t\t// true if Quote in ('\\'','\"','`')\n\t\tint DelimiterLength;\t// strlen(Delimiter)\n\t\tchar *Delimiter;\t// the Delimiter, 256: sizeof PL_tokenbuf\n\t\tHereDocCls() {\n\t\t\tState = 0;\n\t\t\tQuote = 0;\n\t\t\tQuoted = false;\n\t\t\tDelimiterLength = 0;\n\t\t\tDelimiter = new char[HERE_DELIM_MAX];\n\t\t\tDelimiter[0] = '\\0';\n\t\t}\n\t\tvoid Append(int ch) {\n\t\t\tDelimiter[DelimiterLength++] = static_cast<char>(ch);\n\t\t\tDelimiter[DelimiterLength] = '\\0';\n\t\t}\n\t\t~HereDocCls() {\n\t\t\tdelete []Delimiter;\n\t\t}\n\t};\n\tHereDocCls HereDoc;\t\t// TODO: FIFO for stacked here-docs\n\n\tclass QuoteCls {\t// Class to manage quote pairs\n\tpublic:\n\t\tint Rep;\n\t\tint Count;\n\t\tint Up, Down;\n\t\tQuoteCls() {\n\t\t\tNew(1);\n\t\t}\n\t\tvoid New(int r = 1) {\n\t\t\tRep   = r;\n\t\t\tCount = 0;\n\t\t\tUp    = '\\0';\n\t\t\tDown  = '\\0';\n\t\t}\n\t\tvoid Open(int u) {\n\t\t\tCount++;\n\t\t\tUp    = u;\n\t\t\tDown  = opposite(Up);\n\t\t}\n\t};\n\tQuoteCls Quote;\n\n\t// additional state for number lexing\n\tint numState = PERLNUM_DECIMAL;\n\tint dotCount = 0;\n\n\tunsigned int endPos = startPos + length;\n\n\t// Backtrack to beginning of style if required...\n\t// If in a long distance lexical state, backtrack to find quote characters.\n\t// Includes strings (may be multi-line), numbers (additional state), format\n\t// bodies, as well as POD sections.\n\tif (initStyle == SCE_PL_HERE_Q\n\t    || initStyle == SCE_PL_HERE_QQ\n\t    || initStyle == SCE_PL_HERE_QX\n\t    || initStyle == SCE_PL_FORMAT\n\t    || initStyle == SCE_PL_HERE_QQ_VAR\n\t    || initStyle == SCE_PL_HERE_QX_VAR\n\t   ) {\n\t\t// backtrack through multiple styles to reach the delimiter start\n\t\tint delim = (initStyle == SCE_PL_FORMAT) ? SCE_PL_FORMAT_IDENT:SCE_PL_HERE_DELIM;\n\t\twhile ((startPos > 1) && (styler.StyleAt(startPos) != delim)) {\n\t\t\tstartPos--;\n\t\t}\n\t\tstartPos = styler.LineStart(styler.GetLine(startPos));\n\t\tinitStyle = styler.StyleAt(startPos - 1);\n\t}\n\tif (initStyle == SCE_PL_STRING\n\t    || initStyle == SCE_PL_STRING_QQ\n\t    || initStyle == SCE_PL_BACKTICKS\n\t    || initStyle == SCE_PL_STRING_QX\n\t    || initStyle == SCE_PL_REGEX\n\t    || initStyle == SCE_PL_STRING_QR\n\t    || initStyle == SCE_PL_REGSUBST\n\t    || initStyle == SCE_PL_STRING_VAR\n\t    || initStyle == SCE_PL_STRING_QQ_VAR\n\t    || initStyle == SCE_PL_BACKTICKS_VAR\n\t    || initStyle == SCE_PL_STRING_QX_VAR\n\t    || initStyle == SCE_PL_REGEX_VAR\n\t    || initStyle == SCE_PL_STRING_QR_VAR\n\t    || initStyle == SCE_PL_REGSUBST_VAR\n\t   ) {\n\t\t// for interpolation, must backtrack through a mix of two different styles\n\t\tint otherStyle = (initStyle >= SCE_PL_STRING_VAR) ?\n\t\t\tinitStyle - INTERPOLATE_SHIFT : initStyle + INTERPOLATE_SHIFT;\n\t\twhile (startPos > 1) {\n\t\t\tint st = styler.StyleAt(startPos - 1);\n\t\t\tif ((st != initStyle) && (st != otherStyle))\n\t\t\t\tbreak;\n\t\t\tstartPos--;\n\t\t}\n\t\tinitStyle = SCE_PL_DEFAULT;\n\t} else if (initStyle == SCE_PL_STRING_Q\n\t        || initStyle == SCE_PL_STRING_QW\n\t        || initStyle == SCE_PL_XLAT\n\t        || initStyle == SCE_PL_CHARACTER\n\t        || initStyle == SCE_PL_NUMBER\n\t        || initStyle == SCE_PL_IDENTIFIER\n\t        || initStyle == SCE_PL_ERROR\n\t        || initStyle == SCE_PL_SUB_PROTOTYPE\n\t   ) {\n\t\twhile ((startPos > 1) && (styler.StyleAt(startPos - 1) == initStyle)) {\n\t\t\tstartPos--;\n\t\t}\n\t\tinitStyle = SCE_PL_DEFAULT;\n\t} else if (initStyle == SCE_PL_POD\n\t        || initStyle == SCE_PL_POD_VERB\n\t          ) {\n\t\t// POD backtracking finds preceeding blank lines and goes back past them\n\t\tint ln = styler.GetLine(startPos);\n\t\tif (ln > 0) {\n\t\t\tinitStyle = styler.StyleAt(styler.LineStart(--ln));\n\t\t\tif (initStyle == SCE_PL_POD || initStyle == SCE_PL_POD_VERB) {\n\t\t\t\twhile (ln > 0 && styler.GetLineState(ln) == SCE_PL_DEFAULT)\n\t\t\t\t\tln--;\n\t\t\t}\n\t\t\tstartPos = styler.LineStart(++ln);\n\t\t\tinitStyle = styler.StyleAt(startPos - 1);\n\t\t} else {\n\t\t\tstartPos = 0;\n\t\t\tinitStyle = SCE_PL_DEFAULT;\n\t\t}\n\t}\n\n\t// backFlag, backPos are additional state to aid identifier corner cases.\n\t// Look backwards past whitespace and comments in order to detect either\n\t// operator or keyword. Later updated as we go along.\n\tint backFlag = BACK_NONE;\n\tunsigned int backPos = startPos;\n\tif (backPos > 0) {\n\t\tbackPos--;\n\t\tskipWhitespaceComment(styler, backPos);\n\t\tif (styler.StyleAt(backPos) == SCE_PL_OPERATOR)\n\t\t\tbackFlag = BACK_OPERATOR;\n\t\telse if (styler.StyleAt(backPos) == SCE_PL_WORD)\n\t\t\tbackFlag = BACK_KEYWORD;\n\t\tbackPos++;\n\t}\n\n\tStyleContext sc(startPos, endPos - startPos, initStyle, styler, static_cast<char>(STYLE_MAX));\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\t// Determine if the current state should terminate.\n\t\tswitch (sc.state) {\n\t\tcase SCE_PL_OPERATOR:\n\t\t\tsc.SetState(SCE_PL_DEFAULT);\n\t\t\tbackFlag = BACK_OPERATOR;\n\t\t\tbackPos = sc.currentPos;\n\t\t\tbreak;\n\t\tcase SCE_PL_IDENTIFIER:\t\t// identifier, bareword, inputsymbol\n\t\t\tif ((!setWord.Contains(sc.ch) && sc.ch != '\\'')\n\t\t\t        || sc.Match('.', '.')\n\t\t\t        || sc.chPrev == '>') {\t// end of inputsymbol\n\t\t\t\tsc.SetState(SCE_PL_DEFAULT);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_PL_WORD:\t\t// keyword, plus special cases\n\t\t\tif (!setWord.Contains(sc.ch)) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\tif ((strcmp(s, \"__DATA__\") == 0) || (strcmp(s, \"__END__\") == 0)) {\n\t\t\t\t\tsc.ChangeState(SCE_PL_DATASECTION);\n\t\t\t\t} else {\n\t\t\t\t\tif ((strcmp(s, \"format\") == 0)) {\n\t\t\t\t\t\tsc.SetState(SCE_PL_FORMAT_IDENT);\n\t\t\t\t\t\tHereDoc.State = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.SetState(SCE_PL_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t\tbackFlag = BACK_KEYWORD;\n\t\t\t\t\tbackPos = sc.currentPos;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_PL_SCALAR:\n\t\tcase SCE_PL_ARRAY:\n\t\tcase SCE_PL_HASH:\n\t\tcase SCE_PL_SYMBOLTABLE:\n\t\t\tif (sc.Match(':', ':')) {\t// skip ::\n\t\t\t\tsc.Forward();\n\t\t\t} else if (!setVar.Contains(sc.ch)) {\n\t\t\t\tif (sc.LengthCurrent() == 1) {\n\t\t\t\t\t// Special variable: $(, $_ etc.\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_PL_DEFAULT);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_PL_NUMBER:\n\t\t\t// if no early break, number style is terminated at \"(go through)\"\n\t\t\tif (sc.ch == '.') {\n\t\t\t\tif (sc.chNext == '.') {\n\t\t\t\t\t// double dot is always an operator (go through)\n\t\t\t\t} else if (numState <= PERLNUM_FLOAT_EXP) {\n\t\t\t\t\t// non-decimal number or float exponent, consume next dot\n\t\t\t\t\tsc.SetState(SCE_PL_OPERATOR);\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\t// decimal or vectors allows dots\n\t\t\t\t\tdotCount++;\n\t\t\t\t\tif (numState == PERLNUM_DECIMAL) {\n\t\t\t\t\t\tif (dotCount <= 1)\t// number with one dot in it\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tif (IsADigit(sc.chNext)) {\t// really a vector\n\t\t\t\t\t\t\tnumState = PERLNUM_VECTOR;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// number then dot (go through)\n\t\t\t\t\t} else if (IsADigit(sc.chNext))\t// vectors\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t// vector then dot (go through)\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '_') {\n\t\t\t\t// permissive underscoring for number and vector literals\n\t\t\t\tbreak;\n\t\t\t} else if (numState == PERLNUM_DECIMAL) {\n\t\t\t\tif (sc.ch == 'E' || sc.ch == 'e') {\t// exponent, sign\n\t\t\t\t\tnumState = PERLNUM_FLOAT_EXP;\n\t\t\t\t\tif (sc.chNext == '+' || sc.chNext == '-') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (IsADigit(sc.ch))\n\t\t\t\t\tbreak;\n\t\t\t\t// number then word (go through)\n\t\t\t} else if (numState == PERLNUM_HEX) {\n\t\t\t\tif (IsADigit(sc.ch, 16))\n\t\t\t\t\tbreak;\n\t\t\t} else if (numState == PERLNUM_VECTOR || numState == PERLNUM_V_VECTOR) {\n\t\t\t\tif (IsADigit(sc.ch))\t// vector\n\t\t\t\t\tbreak;\n\t\t\t\tif (setWord.Contains(sc.ch) && dotCount == 0) {\t// change to word\n\t\t\t\t\tsc.ChangeState(SCE_PL_IDENTIFIER);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// vector then word (go through)\n\t\t\t} else if (IsADigit(sc.ch)) {\n\t\t\t\tif (numState == PERLNUM_FLOAT_EXP) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (numState == PERLNUM_OCTAL) {\n\t\t\t\t\tif (sc.ch <= '7') break;\n\t\t\t\t} else if (numState == PERLNUM_BINARY) {\n\t\t\t\t\tif (sc.ch <= '1') break;\n\t\t\t\t}\n\t\t\t\t// mark invalid octal, binary numbers (go through)\n\t\t\t\tnumState = PERLNUM_BAD;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// complete current number or vector\n\t\t\tsc.ChangeState(actualNumStyle(numState));\n\t\t\tsc.SetState(SCE_PL_DEFAULT);\n\t\t\tbreak;\n\t\tcase SCE_PL_COMMENTLINE:\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_PL_DEFAULT);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_PL_HERE_DELIM:\n\t\t\tif (HereDoc.State == 0) { // '<<' encountered\n\t\t\t\tint delim_ch = sc.chNext;\n\t\t\t\tint ws_skip = 0;\n\t\t\t\tHereDoc.State = 1;\t// pre-init HERE doc class\n\t\t\t\tHereDoc.Quote = sc.chNext;\n\t\t\t\tHereDoc.Quoted = false;\n\t\t\t\tHereDoc.DelimiterLength = 0;\n\t\t\t\tHereDoc.Delimiter[HereDoc.DelimiterLength] = '\\0';\n\t\t\t\tif (IsASpaceOrTab(delim_ch)) {\n\t\t\t\t\t// skip whitespace; legal only for quoted delimiters\n\t\t\t\t\tunsigned int i = sc.currentPos + 1;\n\t\t\t\t\twhile ((i < endPos) && IsASpaceOrTab(delim_ch)) {\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tdelim_ch = static_cast<unsigned char>(styler.SafeGetCharAt(i));\n\t\t\t\t\t}\n\t\t\t\t\tws_skip = i - sc.currentPos - 1;\n\t\t\t\t}\n\t\t\t\tif (delim_ch == '\\'' || delim_ch == '\"' || delim_ch == '`') {\n\t\t\t\t\t// a quoted here-doc delimiter; skip any whitespace\n\t\t\t\t\tsc.Forward(ws_skip + 1);\n\t\t\t\t\tHereDoc.Quote = delim_ch;\n\t\t\t\t\tHereDoc.Quoted = true;\n\t\t\t\t} else if ((ws_skip == 0 && setNonHereDoc.Contains(sc.chNext))\n\t\t\t\t        || ws_skip > 0) {\n\t\t\t\t\t// left shift << or <<= operator cases\n\t\t\t\t\t// restore position if operator\n\t\t\t\t\tsc.ChangeState(SCE_PL_OPERATOR);\n\t\t\t\t\tsc.ForwardSetState(SCE_PL_DEFAULT);\n\t\t\t\t\tbackFlag = BACK_OPERATOR;\n\t\t\t\t\tbackPos = sc.currentPos;\n\t\t\t\t\tHereDoc.State = 0;\n\t\t\t\t} else {\n\t\t\t\t\t// specially handle initial '\\' for identifier\n\t\t\t\t\tif (ws_skip == 0 && HereDoc.Quote == '\\\\')\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t// an unquoted here-doc delimiter, no special handling\n\t\t\t\t\t// (cannot be prefixed by spaces/tabs), or\n\t\t\t\t\t// symbols terminates; deprecated zero-length delimiter\n\t\t\t\t}\n\t\t\t} else if (HereDoc.State == 1) { // collect the delimiter\n\t\t\t\tbackFlag = BACK_NONE;\n\t\t\t\tif (HereDoc.Quoted) { // a quoted here-doc delimiter\n\t\t\t\t\tif (sc.ch == HereDoc.Quote) { // closing quote => end of delimiter\n\t\t\t\t\t\tsc.ForwardSetState(SCE_PL_DEFAULT);\n\t\t\t\t\t} else if (!sc.atLineEnd) {\n\t\t\t\t\t\tif (sc.Match('\\\\', static_cast<char>(HereDoc.Quote))) { // escaped quote\n\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (sc.ch != '\\r') {\t// skip CR if CRLF\n\t\t\t\t\t\t\tint i = 0;\t\t\t// else append char, possibly an extended char\n\t\t\t\t\t\t\twhile (i < sc.width) {\n\t\t\t\t\t\t\t\tHereDoc.Append(static_cast<unsigned char>(styler.SafeGetCharAt(sc.currentPos + i)));\n\t\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else { // an unquoted here-doc delimiter, no extended charsets\n\t\t\t\t\tif (setHereDocDelim.Contains(sc.ch)) {\n\t\t\t\t\t\tHereDoc.Append(sc.ch);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.SetState(SCE_PL_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (HereDoc.DelimiterLength >= HERE_DELIM_MAX - 1) {\n\t\t\t\t\tsc.SetState(SCE_PL_ERROR);\n\t\t\t\t\tHereDoc.State = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_PL_HERE_Q:\n\t\tcase SCE_PL_HERE_QQ:\n\t\tcase SCE_PL_HERE_QX:\n\t\t\t// also implies HereDoc.State == 2\n\t\t\tsc.Complete();\n\t\t\tif (HereDoc.DelimiterLength == 0 || sc.Match(HereDoc.Delimiter)) {\n\t\t\t\tint c = sc.GetRelative(HereDoc.DelimiterLength);\n\t\t\t\tif (c == '\\r' || c == '\\n') {\t// peek first, do not consume match\n\t\t\t\t\tsc.ForwardBytes(HereDoc.DelimiterLength);\n\t\t\t\t\tsc.SetState(SCE_PL_DEFAULT);\n\t\t\t\t\tbackFlag = BACK_NONE;\n\t\t\t\t\tHereDoc.State = 0;\n\t\t\t\t\tif (!sc.atLineEnd)\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (sc.state == SCE_PL_HERE_Q) {\t// \\EOF and 'EOF' non-interpolated\n\t\t\t\twhile (!sc.atLineEnd)\n\t\t\t\t\tsc.Forward();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\twhile (!sc.atLineEnd) {\t\t// \"EOF\" and `EOF` interpolated\n\t\t\t\tint c, sLen = 0, endType = 0;\n\t\t\t\twhile ((c = sc.GetRelativeCharacter(sLen)) != 0) {\n\t\t\t\t\t// scan to break string into segments\n\t\t\t\t\tif (c == '\\\\') {\n\t\t\t\t\t\tendType = 1; break;\n\t\t\t\t\t} else if (c == '\\r' || c == '\\n') {\n\t\t\t\t\t\tendType = 2; break;\n\t\t\t\t\t}\n\t\t\t\t\tsLen++;\n\t\t\t\t}\n\t\t\t\tif (sLen > 0)\t// process non-empty segments\n\t\t\t\t\tInterpolateSegment(sc, sLen);\n\t\t\t\tif (endType == 1) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\t// \\ at end-of-line does not appear to have any effect, skip\n\t\t\t\t\tif (sc.ch != '\\r' && sc.ch != '\\n')\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t} else if (endType == 2) {\n\t\t\t\t\tif (!sc.atLineEnd)\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_PL_POD:\n\t\tcase SCE_PL_POD_VERB: {\n\t\t\t\tunsigned int fw = sc.currentPos;\n\t\t\t\tint ln = styler.GetLine(fw);\n\t\t\t\tif (sc.atLineStart && sc.Match(\"=cut\")) {\t// end of POD\n\t\t\t\t\tsc.SetState(SCE_PL_POD);\n\t\t\t\t\tsc.Forward(4);\n\t\t\t\t\tsc.SetState(SCE_PL_DEFAULT);\n\t\t\t\t\tstyler.SetLineState(ln, SCE_PL_POD);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tint pod = podLineScan(styler, fw, endPos);\t// classify POD line\n\t\t\t\tstyler.SetLineState(ln, pod);\n\t\t\t\tif (pod == SCE_PL_DEFAULT) {\n\t\t\t\t\tif (sc.state == SCE_PL_POD_VERB) {\n\t\t\t\t\t\tunsigned int fw2 = fw;\n\t\t\t\t\t\twhile (fw2 < (endPos - 1) && pod == SCE_PL_DEFAULT) {\n\t\t\t\t\t\t\tfw = fw2++;\t// penultimate line (last blank line)\n\t\t\t\t\t\t\tpod = podLineScan(styler, fw2, endPos);\n\t\t\t\t\t\t\tstyler.SetLineState(styler.GetLine(fw2), pod);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (pod == SCE_PL_POD) {\t// truncate verbatim POD early\n\t\t\t\t\t\t\tsc.SetState(SCE_PL_POD);\n\t\t\t\t\t\t} else\n\t\t\t\t\t\t\tfw = fw2;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (pod == SCE_PL_POD_VERB\t// still part of current paragraph\n\t\t\t\t\t        && (styler.GetLineState(ln - 1) == SCE_PL_POD)) {\n\t\t\t\t\t\tpod = SCE_PL_POD;\n\t\t\t\t\t\tstyler.SetLineState(ln, pod);\n\t\t\t\t\t} else if (pod == SCE_PL_POD\n\t\t\t\t\t        && (styler.GetLineState(ln - 1) == SCE_PL_POD_VERB)) {\n\t\t\t\t\t\tpod = SCE_PL_POD_VERB;\n\t\t\t\t\t\tstyler.SetLineState(ln, pod);\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(pod);\n\t\t\t\t}\n\t\t\t\tsc.ForwardBytes(fw - sc.currentPos);\t// commit style\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_PL_REGEX:\n\t\tcase SCE_PL_STRING_QR:\n\t\t\tif (Quote.Rep <= 0) {\n\t\t\t\tif (!setModifiers.Contains(sc.ch))\n\t\t\t\t\tsc.SetState(SCE_PL_DEFAULT);\n\t\t\t} else if (!Quote.Up && !IsASpace(sc.ch)) {\n\t\t\t\tQuote.Open(sc.ch);\n\t\t\t} else {\n\t\t\t\tint c, sLen = 0, endType = 0;\n\t\t\t\twhile ((c = sc.GetRelativeCharacter(sLen)) != 0) {\n\t\t\t\t\t// scan to break string into segments\n\t\t\t\t\tif (IsASpace(c)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (c == '\\\\' && Quote.Up != '\\\\') {\n\t\t\t\t\t\tendType = 1; break;\n\t\t\t\t\t} else if (c == Quote.Down) {\n\t\t\t\t\t\tQuote.Count--;\n\t\t\t\t\t\tif (Quote.Count == 0) {\n\t\t\t\t\t\t\tQuote.Rep--;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (c == Quote.Up)\n\t\t\t\t\t\tQuote.Count++;\n\t\t\t\t\tsLen++;\n\t\t\t\t}\n\t\t\t\tif (sLen > 0) {\t// process non-empty segments\n\t\t\t\t\tif (Quote.Up != '\\'') {\n\t\t\t\t\t\tInterpolateSegment(sc, sLen, true);\n\t\t\t\t\t} else\t\t// non-interpolated path\n\t\t\t\t\t\tsc.Forward(sLen);\n\t\t\t\t}\n\t\t\t\tif (endType == 1)\n\t\t\t\t\tsc.Forward();\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_PL_REGSUBST:\n\t\tcase SCE_PL_XLAT:\n\t\t\tif (Quote.Rep <= 0) {\n\t\t\t\tif (!setModifiers.Contains(sc.ch))\n\t\t\t\t\tsc.SetState(SCE_PL_DEFAULT);\n\t\t\t} else if (!Quote.Up && !IsASpace(sc.ch)) {\n\t\t\t\tQuote.Open(sc.ch);\n\t\t\t} else {\n\t\t\t\tint c, sLen = 0, endType = 0;\n\t\t\t\tbool isPattern = (Quote.Rep == 2);\n\t\t\t\twhile ((c = sc.GetRelativeCharacter(sLen)) != 0) {\n\t\t\t\t\t// scan to break string into segments\n\t\t\t\t\tif (c == '\\\\' && Quote.Up != '\\\\') {\n\t\t\t\t\t\tendType = 2; break;\n\t\t\t\t\t} else if (Quote.Count == 0 && Quote.Rep == 1) {\n\t\t\t\t\t\t// We matched something like s(...) or tr{...}, Perl 5.10\n\t\t\t\t\t\t// appears to allow almost any character for use as the\n\t\t\t\t\t\t// next delimiters. Whitespace and comments are accepted in\n\t\t\t\t\t\t// between, but we'll limit to whitespace here.\n\t\t\t\t\t\t// For '#', if no whitespace in between, it's a delimiter.\n\t\t\t\t\t\tif (IsASpace(c)) {\n\t\t\t\t\t\t\t// Keep going\n\t\t\t\t\t\t} else if (c == '#' && IsASpaceOrTab(sc.GetRelativeCharacter(sLen - 1))) {\n\t\t\t\t\t\t\tendType = 3;\n\t\t\t\t\t\t} else\n\t\t\t\t\t\t\tQuote.Open(c);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (c == Quote.Down) {\n\t\t\t\t\t\tQuote.Count--;\n\t\t\t\t\t\tif (Quote.Count == 0) {\n\t\t\t\t\t\t\tQuote.Rep--;\n\t\t\t\t\t\t\tendType = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (Quote.Up == Quote.Down)\n\t\t\t\t\t\t\tQuote.Count++;\n\t\t\t\t\t\tif (endType == 1)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (c == Quote.Up) {\n\t\t\t\t\t\tQuote.Count++;\n\t\t\t\t\t} else if (IsASpace(c))\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tsLen++;\n\t\t\t\t}\n\t\t\t\tif (sLen > 0) {\t// process non-empty segments\n\t\t\t\t\tif (sc.state == SCE_PL_REGSUBST && Quote.Up != '\\'') {\n\t\t\t\t\t\tInterpolateSegment(sc, sLen, isPattern);\n\t\t\t\t\t} else\t\t// non-interpolated path\n\t\t\t\t\t\tsc.Forward(sLen);\n\t\t\t\t}\n\t\t\t\tif (endType == 2) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} else if (endType == 3)\n\t\t\t\t\tsc.SetState(SCE_PL_DEFAULT);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_PL_STRING_Q:\n\t\tcase SCE_PL_STRING_QQ:\n\t\tcase SCE_PL_STRING_QX:\n\t\tcase SCE_PL_STRING_QW:\n\t\tcase SCE_PL_STRING:\n\t\tcase SCE_PL_CHARACTER:\n\t\tcase SCE_PL_BACKTICKS:\n\t\t\tif (!Quote.Down && !IsASpace(sc.ch)) {\n\t\t\t\tQuote.Open(sc.ch);\n\t\t\t} else {\n\t\t\t\tint c, sLen = 0, endType = 0;\n\t\t\t\twhile ((c = sc.GetRelativeCharacter(sLen)) != 0) {\n\t\t\t\t\t// scan to break string into segments\n\t\t\t\t\tif (IsASpace(c)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (c == '\\\\' && Quote.Up != '\\\\') {\n\t\t\t\t\t\tendType = 2; break;\n\t\t\t\t\t} else if (c == Quote.Down) {\n\t\t\t\t\t\tQuote.Count--;\n\t\t\t\t\t\tif (Quote.Count == 0) {\n\t\t\t\t\t\t\tendType = 3; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (c == Quote.Up)\n\t\t\t\t\t\tQuote.Count++;\n\t\t\t\t\tsLen++;\n\t\t\t\t}\n\t\t\t\tif (sLen > 0) {\t// process non-empty segments\n\t\t\t\t\tswitch (sc.state) {\n\t\t\t\t\tcase SCE_PL_STRING:\n\t\t\t\t\tcase SCE_PL_STRING_QQ:\n\t\t\t\t\tcase SCE_PL_BACKTICKS:\n\t\t\t\t\t\tInterpolateSegment(sc, sLen);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SCE_PL_STRING_QX:\n\t\t\t\t\t\tif (Quote.Up != '\\'') {\n\t\t\t\t\t\t\tInterpolateSegment(sc, sLen);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// (continued for ' delim)\n\t\t\t\t\tdefault:\t// non-interpolated path\n\t\t\t\t\t\tsc.Forward(sLen);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (endType == 2) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} else if (endType == 3)\n\t\t\t\t\tsc.ForwardSetState(SCE_PL_DEFAULT);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_PL_SUB_PROTOTYPE: {\n\t\t\t\tint i = 0;\n\t\t\t\t// forward scan; must all be valid proto characters\n\t\t\t\twhile (setSubPrototype.Contains(sc.GetRelative(i)))\n\t\t\t\t\ti++;\n\t\t\t\tif (sc.GetRelative(i) == ')') {\t// valid sub prototype\n\t\t\t\t\tsc.ForwardBytes(i);\n\t\t\t\t\tsc.ForwardSetState(SCE_PL_DEFAULT);\n\t\t\t\t} else {\n\t\t\t\t\t// abandon prototype, restart from '('\n\t\t\t\t\tsc.ChangeState(SCE_PL_OPERATOR);\n\t\t\t\t\tsc.SetState(SCE_PL_DEFAULT);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_PL_FORMAT: {\n\t\t\t\tsc.Complete();\n\t\t\t\tif (sc.Match('.')) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tif (sc.atLineEnd || ((sc.ch == '\\r' && sc.chNext == '\\n')))\n\t\t\t\t\t\tsc.SetState(SCE_PL_DEFAULT);\n\t\t\t\t}\n\t\t\t\twhile (!sc.atLineEnd)\n\t\t\t\t\tsc.Forward();\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_PL_ERROR:\n\t\t\tbreak;\n\t\t}\n\t\t// Needed for specific continuation styles (one follows the other)\n\t\tswitch (sc.state) {\n\t\t\t// continued from SCE_PL_WORD\n\t\tcase SCE_PL_FORMAT_IDENT:\n\t\t\t// occupies HereDoc state 3 to avoid clashing with HERE docs\n\t\t\tif (IsASpaceOrTab(sc.ch)) {\t\t// skip whitespace\n\t\t\t\tsc.ChangeState(SCE_PL_DEFAULT);\n\t\t\t\twhile (IsASpaceOrTab(sc.ch) && !sc.atLineEnd)\n\t\t\t\t\tsc.Forward();\n\t\t\t\tsc.SetState(SCE_PL_FORMAT_IDENT);\n\t\t\t}\n\t\t\tif (setFormatStart.Contains(sc.ch)) {\t// identifier or '='\n\t\t\t\tif (sc.ch != '=') {\n\t\t\t\t\tdo {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t} while (setFormat.Contains(sc.ch));\n\t\t\t\t}\n\t\t\t\twhile (IsASpaceOrTab(sc.ch) && !sc.atLineEnd)\n\t\t\t\t\tsc.Forward();\n\t\t\t\tif (sc.ch == '=') {\n\t\t\t\t\tsc.ForwardSetState(SCE_PL_DEFAULT);\n\t\t\t\t\tHereDoc.State = 3;\n\t\t\t\t} else {\n\t\t\t\t\t// invalid indentifier; inexact fallback, but hey\n\t\t\t\t\tsc.ChangeState(SCE_PL_IDENTIFIER);\n\t\t\t\t\tsc.SetState(SCE_PL_DEFAULT);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsc.ChangeState(SCE_PL_DEFAULT);\t// invalid indentifier\n\t\t\t}\n\t\t\tbackFlag = BACK_NONE;\n\t\t\tbreak;\n\t\t}\n\n\t\t// Must check end of HereDoc states here before default state is handled\n\t\tif (HereDoc.State == 1 && sc.atLineEnd) {\n\t\t\t// Begin of here-doc (the line after the here-doc delimiter):\n\t\t\t// Lexically, the here-doc starts from the next line after the >>, but the\n\t\t\t// first line of here-doc seem to follow the style of the last EOL sequence\n\t\t\tint st_new = SCE_PL_HERE_QQ;\n\t\t\tHereDoc.State = 2;\n\t\t\tif (HereDoc.Quoted) {\n\t\t\t\tif (sc.state == SCE_PL_HERE_DELIM) {\n\t\t\t\t\t// Missing quote at end of string! We are stricter than perl.\n\t\t\t\t\t// Colour here-doc anyway while marking this bit as an error.\n\t\t\t\t\tsc.ChangeState(SCE_PL_ERROR);\n\t\t\t\t}\n\t\t\t\tswitch (HereDoc.Quote) {\n\t\t\t\tcase '\\'':\n\t\t\t\t\tst_new = SCE_PL_HERE_Q ;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '\"' :\n\t\t\t\t\tst_new = SCE_PL_HERE_QQ;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '`' :\n\t\t\t\t\tst_new = SCE_PL_HERE_QX;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (HereDoc.Quote == '\\\\')\n\t\t\t\t\tst_new = SCE_PL_HERE_Q;\n\t\t\t}\n\t\t\tsc.SetState(st_new);\n\t\t}\n\t\tif (HereDoc.State == 3 && sc.atLineEnd) {\n\t\t\t// Start of format body.\n\t\t\tHereDoc.State = 0;\n\t\t\tsc.SetState(SCE_PL_FORMAT);\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_PL_DEFAULT) {\n\t\t\tif (IsADigit(sc.ch) ||\n\t\t\t        (IsADigit(sc.chNext) && (sc.ch == '.' || sc.ch == 'v'))) {\n\t\t\t\tsc.SetState(SCE_PL_NUMBER);\n\t\t\t\tbackFlag = BACK_NONE;\n\t\t\t\tnumState = PERLNUM_DECIMAL;\n\t\t\t\tdotCount = 0;\n\t\t\t\tif (sc.ch == '0') {\t\t// hex,bin,octal\n\t\t\t\t\tif (sc.chNext == 'x' || sc.chNext == 'X') {\n\t\t\t\t\t\tnumState = PERLNUM_HEX;\n\t\t\t\t\t} else if (sc.chNext == 'b' || sc.chNext == 'B') {\n\t\t\t\t\t\tnumState = PERLNUM_BINARY;\n\t\t\t\t\t} else if (IsADigit(sc.chNext)) {\n\t\t\t\t\t\tnumState = PERLNUM_OCTAL;\n\t\t\t\t\t}\n\t\t\t\t\tif (numState != PERLNUM_DECIMAL) {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == 'v') {\t\t// vector\n\t\t\t\t\tnumState = PERLNUM_V_VECTOR;\n\t\t\t\t}\n\t\t\t} else if (setWord.Contains(sc.ch)) {\n\t\t\t\t// if immediately prefixed by '::', always a bareword\n\t\t\t\tsc.SetState(SCE_PL_WORD);\n\t\t\t\tif (sc.chPrev == ':' && sc.GetRelative(-2) == ':') {\n\t\t\t\t\tsc.ChangeState(SCE_PL_IDENTIFIER);\n\t\t\t\t}\n\t\t\t\tunsigned int bk = sc.currentPos;\n\t\t\t\tunsigned int fw = sc.currentPos + 1;\n\t\t\t\t// first check for possible quote-like delimiter\n\t\t\t\tif (sc.ch == 's' && !setWord.Contains(sc.chNext)) {\n\t\t\t\t\tsc.ChangeState(SCE_PL_REGSUBST);\n\t\t\t\t\tQuote.New(2);\n\t\t\t\t} else if (sc.ch == 'm' && !setWord.Contains(sc.chNext)) {\n\t\t\t\t\tsc.ChangeState(SCE_PL_REGEX);\n\t\t\t\t\tQuote.New();\n\t\t\t\t} else if (sc.ch == 'q' && !setWord.Contains(sc.chNext)) {\n\t\t\t\t\tsc.ChangeState(SCE_PL_STRING_Q);\n\t\t\t\t\tQuote.New();\n\t\t\t\t} else if (sc.ch == 'y' && !setWord.Contains(sc.chNext)) {\n\t\t\t\t\tsc.ChangeState(SCE_PL_XLAT);\n\t\t\t\t\tQuote.New(2);\n\t\t\t\t} else if (sc.Match('t', 'r') && !setWord.Contains(sc.GetRelative(2))) {\n\t\t\t\t\tsc.ChangeState(SCE_PL_XLAT);\n\t\t\t\t\tQuote.New(2);\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tfw++;\n\t\t\t\t} else if (sc.ch == 'q' && setQDelim.Contains(sc.chNext)\n\t\t\t\t        && !setWord.Contains(sc.GetRelative(2))) {\n\t\t\t\t\tif (sc.chNext == 'q') sc.ChangeState(SCE_PL_STRING_QQ);\n\t\t\t\t\telse if (sc.chNext == 'x') sc.ChangeState(SCE_PL_STRING_QX);\n\t\t\t\t\telse if (sc.chNext == 'r') sc.ChangeState(SCE_PL_STRING_QR);\n\t\t\t\t\telse sc.ChangeState(SCE_PL_STRING_QW);\t// sc.chNext == 'w'\n\t\t\t\t\tQuote.New();\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tfw++;\n\t\t\t\t} else if (sc.ch == 'x' && (sc.chNext == '=' ||\t// repetition\n\t\t\t\t        !setWord.Contains(sc.chNext) ||\n\t\t\t\t        (IsADigit(sc.chPrev) && IsADigit(sc.chNext)))) {\n\t\t\t\t\tsc.ChangeState(SCE_PL_OPERATOR);\n\t\t\t\t}\n\t\t\t\t// if potentially a keyword, scan forward and grab word, then check\n\t\t\t\t// if it's really one; if yes, disambiguation test is performed\n\t\t\t\t// otherwise it is always a bareword and we skip a lot of scanning\n\t\t\t\tif (sc.state == SCE_PL_WORD) {\n\t\t\t\t\twhile (setWord.Contains(static_cast<unsigned char>(styler.SafeGetCharAt(fw))))\n\t\t\t\t\t\tfw++;\n\t\t\t\t\tif (!isPerlKeyword(styler.GetStartSegment(), fw, keywords, styler)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_PL_IDENTIFIER);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// if already SCE_PL_IDENTIFIER, then no ambiguity, skip this\n\t\t\t\t// for quote-like delimiters/keywords, attempt to disambiguate\n\t\t\t\t// to select for bareword, change state -> SCE_PL_IDENTIFIER\n\t\t\t\tif (sc.state != SCE_PL_IDENTIFIER && bk > 0) {\n\t\t\t\t\tif (disambiguateBareword(styler, bk, fw, backFlag, backPos, endPos))\n\t\t\t\t\t\tsc.ChangeState(SCE_PL_IDENTIFIER);\n\t\t\t\t}\n\t\t\t\tbackFlag = BACK_NONE;\n\t\t\t} else if (sc.ch == '#') {\n\t\t\t\tsc.SetState(SCE_PL_COMMENTLINE);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_PL_STRING);\n\t\t\t\tQuote.New();\n\t\t\t\tQuote.Open(sc.ch);\n\t\t\t\tbackFlag = BACK_NONE;\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tif (sc.chPrev == '&' && setWordStart.Contains(sc.chNext)) {\n\t\t\t\t\t// Archaic call\n\t\t\t\t\tsc.SetState(SCE_PL_IDENTIFIER);\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_PL_CHARACTER);\n\t\t\t\t\tQuote.New();\n\t\t\t\t\tQuote.Open(sc.ch);\n\t\t\t\t}\n\t\t\t\tbackFlag = BACK_NONE;\n\t\t\t} else if (sc.ch == '`') {\n\t\t\t\tsc.SetState(SCE_PL_BACKTICKS);\n\t\t\t\tQuote.New();\n\t\t\t\tQuote.Open(sc.ch);\n\t\t\t\tbackFlag = BACK_NONE;\n\t\t\t} else if (sc.ch == '$') {\n\t\t\t\tsc.SetState(SCE_PL_SCALAR);\n\t\t\t\tif (sc.chNext == '{') {\n\t\t\t\t\tsc.ForwardSetState(SCE_PL_OPERATOR);\n\t\t\t\t} else if (IsASpace(sc.chNext)) {\n\t\t\t\t\tsc.ForwardSetState(SCE_PL_DEFAULT);\n\t\t\t\t} else {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tif (sc.Match('`', '`') || sc.Match(':', ':')) {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbackFlag = BACK_NONE;\n\t\t\t} else if (sc.ch == '@') {\n\t\t\t\tsc.SetState(SCE_PL_ARRAY);\n\t\t\t\tif (setArray.Contains(sc.chNext)) {\n\t\t\t\t\t// no special treatment\n\t\t\t\t} else if (sc.chNext == ':' && sc.GetRelative(2) == ':') {\n\t\t\t\t\tsc.ForwardBytes(2);\n\t\t\t\t} else if (sc.chNext == '{' || sc.chNext == '[') {\n\t\t\t\t\tsc.ForwardSetState(SCE_PL_OPERATOR);\n\t\t\t\t} else {\n\t\t\t\t\tsc.ChangeState(SCE_PL_OPERATOR);\n\t\t\t\t}\n\t\t\t\tbackFlag = BACK_NONE;\n\t\t\t} else if (setPreferRE.Contains(sc.ch)) {\n\t\t\t\t// Explicit backward peeking to set a consistent preferRE for\n\t\t\t\t// any slash found, so no longer need to track preferRE state.\n\t\t\t\t// Find first previous significant lexed element and interpret.\n\t\t\t\t// A few symbols shares this code for disambiguation.\n\t\t\t\tbool preferRE = false;\n\t\t\t\tbool isHereDoc = sc.Match('<', '<');\n\t\t\t\tbool hereDocSpace = false;\t\t// for: SCALAR [whitespace] '<<'\n\t\t\t\tunsigned int bk = (sc.currentPos > 0) ? sc.currentPos - 1: 0;\n\t\t\t\tsc.Complete();\n\t\t\t\tstyler.Flush();\n\t\t\t\tif (styler.StyleAt(bk) == SCE_PL_DEFAULT)\n\t\t\t\t\thereDocSpace = true;\n\t\t\t\tskipWhitespaceComment(styler, bk);\n\t\t\t\tif (bk == 0) {\n\t\t\t\t\t// avoid backward scanning breakage\n\t\t\t\t\tpreferRE = true;\n\t\t\t\t} else {\n\t\t\t\t\tint bkstyle = styler.StyleAt(bk);\n\t\t\t\t\tint bkch = static_cast<unsigned char>(styler.SafeGetCharAt(bk));\n\t\t\t\t\tswitch (bkstyle) {\n\t\t\t\t\tcase SCE_PL_OPERATOR:\n\t\t\t\t\t\tpreferRE = true;\n\t\t\t\t\t\tif (bkch == ')' || bkch == ']') {\n\t\t\t\t\t\t\tpreferRE = false;\n\t\t\t\t\t\t} else if (bkch == '}') {\n\t\t\t\t\t\t\t// backtrack by counting balanced brace pairs\n\t\t\t\t\t\t\t// needed to test for variables like ${}, @{} etc.\n\t\t\t\t\t\t\tbkstyle = styleBeforeBracePair(styler, bk);\n\t\t\t\t\t\t\tif (bkstyle == SCE_PL_SCALAR\n\t\t\t\t\t\t\t        || bkstyle == SCE_PL_ARRAY\n\t\t\t\t\t\t\t        || bkstyle == SCE_PL_HASH\n\t\t\t\t\t\t\t        || bkstyle == SCE_PL_SYMBOLTABLE\n\t\t\t\t\t\t\t        || bkstyle == SCE_PL_OPERATOR) {\n\t\t\t\t\t\t\t\tpreferRE = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (bkch == '+' || bkch == '-') {\n\t\t\t\t\t\t\tif (bkch == static_cast<unsigned char>(styler.SafeGetCharAt(bk - 1))\n\t\t\t\t\t\t\t        && bkch != static_cast<unsigned char>(styler.SafeGetCharAt(bk - 2)))\n\t\t\t\t\t\t\t\t// exceptions for operators: unary suffixes ++, --\n\t\t\t\t\t\t\t\tpreferRE = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SCE_PL_IDENTIFIER:\n\t\t\t\t\t\tpreferRE = true;\n\t\t\t\t\t\tbkstyle = styleCheckIdentifier(styler, bk);\n\t\t\t\t\t\tif ((bkstyle == 1) || (bkstyle == 2)) {\n\t\t\t\t\t\t\t// inputsymbol or var with \"->\" or \"::\" before identifier\n\t\t\t\t\t\t\tpreferRE = false;\n\t\t\t\t\t\t} else if (bkstyle == 3) {\n\t\t\t\t\t\t\t// bare identifier, test cases follows:\n\t\t\t\t\t\t\tif (sc.ch == '/') {\n\t\t\t\t\t\t\t\t// if '/', /PATTERN/ unless digit/space immediately after '/'\n\t\t\t\t\t\t\t\t// if '//', always expect defined-or operator to follow identifier\n\t\t\t\t\t\t\t\tif (IsASpace(sc.chNext) || IsADigit(sc.chNext) || sc.chNext == '/')\n\t\t\t\t\t\t\t\t\tpreferRE = false;\n\t\t\t\t\t\t\t} else if (sc.ch == '*' || sc.ch == '%') {\n\t\t\t\t\t\t\t\tif (IsASpace(sc.chNext) || IsADigit(sc.chNext) || sc.Match('*', '*'))\n\t\t\t\t\t\t\t\t\tpreferRE = false;\n\t\t\t\t\t\t\t} else if (sc.ch == '<') {\n\t\t\t\t\t\t\t\tif (IsASpace(sc.chNext) || sc.chNext == '=')\n\t\t\t\t\t\t\t\t\tpreferRE = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SCE_PL_SCALAR:\t\t// for $var<< case:\n\t\t\t\t\t\tif (isHereDoc && hereDocSpace)\t// if SCALAR whitespace '<<', *always* a HERE doc\n\t\t\t\t\t\t\tpreferRE = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SCE_PL_WORD:\n\t\t\t\t\t\tpreferRE = true;\n\t\t\t\t\t\t// for HERE docs, always true\n\t\t\t\t\t\tif (sc.ch == '/') {\n\t\t\t\t\t\t\t// adopt heuristics similar to vim-style rules:\n\t\t\t\t\t\t\t// keywords always forced as /PATTERN/: split, if, elsif, while\n\t\t\t\t\t\t\t// everything else /PATTERN/ unless digit/space immediately after '/'\n\t\t\t\t\t\t\t// for '//', defined-or favoured unless special keywords\n\t\t\t\t\t\t\tunsigned int bkend = bk + 1;\n\t\t\t\t\t\t\twhile (bk > 0 && styler.StyleAt(bk - 1) == SCE_PL_WORD) {\n\t\t\t\t\t\t\t\tbk--;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (isPerlKeyword(bk, bkend, reWords, styler))\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tif (IsASpace(sc.chNext) || IsADigit(sc.chNext) || sc.chNext == '/')\n\t\t\t\t\t\t\t\tpreferRE = false;\n\t\t\t\t\t\t} else if (sc.ch == '*' || sc.ch == '%') {\n\t\t\t\t\t\t\tif (IsASpace(sc.chNext) || IsADigit(sc.chNext) || sc.Match('*', '*'))\n\t\t\t\t\t\t\t\tpreferRE = false;\n\t\t\t\t\t\t} else if (sc.ch == '<') {\n\t\t\t\t\t\t\tif (IsASpace(sc.chNext) || sc.chNext == '=')\n\t\t\t\t\t\t\t\tpreferRE = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t// other styles uses the default, preferRE=false\n\t\t\t\t\tcase SCE_PL_POD:\n\t\t\t\t\tcase SCE_PL_HERE_Q:\n\t\t\t\t\tcase SCE_PL_HERE_QQ:\n\t\t\t\t\tcase SCE_PL_HERE_QX:\n\t\t\t\t\t\tpreferRE = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbackFlag = BACK_NONE;\n\t\t\t\tif (isHereDoc) {\t// handle '<<', HERE doc\n\t\t\t\t\tif (preferRE) {\n\t\t\t\t\t\tsc.SetState(SCE_PL_HERE_DELIM);\n\t\t\t\t\t\tHereDoc.State = 0;\n\t\t\t\t\t} else {\t\t// << operator\n\t\t\t\t\t\tsc.SetState(SCE_PL_OPERATOR);\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '*') {\t// handle '*', typeglob\n\t\t\t\t\tif (preferRE) {\n\t\t\t\t\t\tsc.SetState(SCE_PL_SYMBOLTABLE);\n\t\t\t\t\t\tif (sc.chNext == ':' && sc.GetRelative(2) == ':') {\n\t\t\t\t\t\t\tsc.ForwardBytes(2);\n\t\t\t\t\t\t} else if (sc.chNext == '{') {\n\t\t\t\t\t\t\tsc.ForwardSetState(SCE_PL_OPERATOR);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.SetState(SCE_PL_OPERATOR);\n\t\t\t\t\t\tif (sc.chNext == '*') \t// exponentiation\n\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '%') {\t// handle '%', hash\n\t\t\t\t\tif (preferRE) {\n\t\t\t\t\t\tsc.SetState(SCE_PL_HASH);\n\t\t\t\t\t\tif (setHash.Contains(sc.chNext)) {\n\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\t} else if (sc.chNext == ':' && sc.GetRelative(2) == ':') {\n\t\t\t\t\t\t\tsc.ForwardBytes(2);\n\t\t\t\t\t\t} else if (sc.chNext == '{') {\n\t\t\t\t\t\t\tsc.ForwardSetState(SCE_PL_OPERATOR);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_PL_OPERATOR);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.SetState(SCE_PL_OPERATOR);\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '<') {\t// handle '<', inputsymbol\n\t\t\t\t\tif (preferRE) {\n\t\t\t\t\t\t// forward scan\n\t\t\t\t\t\tint i = InputSymbolScan(sc);\n\t\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\t\tsc.SetState(SCE_PL_IDENTIFIER);\n\t\t\t\t\t\t\tsc.Forward(i);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.SetState(SCE_PL_OPERATOR);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.SetState(SCE_PL_OPERATOR);\n\t\t\t\t\t}\n\t\t\t\t} else {\t\t\t// handle '/', regexp\n\t\t\t\t\tif (preferRE) {\n\t\t\t\t\t\tsc.SetState(SCE_PL_REGEX);\n\t\t\t\t\t\tQuote.New();\n\t\t\t\t\t\tQuote.Open(sc.ch);\n\t\t\t\t\t} else {\t\t// / and // operators\n\t\t\t\t\t\tsc.SetState(SCE_PL_OPERATOR);\n\t\t\t\t\t\tif (sc.chNext == '/') {\n\t\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '='\t\t// POD\n\t\t\t        && setPOD.Contains(sc.chNext)\n\t\t\t        && sc.atLineStart) {\n\t\t\t\tsc.SetState(SCE_PL_POD);\n\t\t\t\tbackFlag = BACK_NONE;\n\t\t\t} else if (sc.ch == '-' && setWordStart.Contains(sc.chNext)) {\t// extended '-' cases\n\t\t\t\tunsigned int bk = sc.currentPos;\n\t\t\t\tunsigned int fw = 2;\n\t\t\t\tif (setSingleCharOp.Contains(sc.chNext) &&\t// file test operators\n\t\t\t\t        !setWord.Contains(sc.GetRelative(2))) {\n\t\t\t\t\tsc.SetState(SCE_PL_WORD);\n\t\t\t\t} else {\n\t\t\t\t\t// nominally a minus and bareword; find extent of bareword\n\t\t\t\t\twhile (setWord.Contains(sc.GetRelative(fw)))\n\t\t\t\t\t\tfw++;\n\t\t\t\t\tsc.SetState(SCE_PL_OPERATOR);\n\t\t\t\t}\n\t\t\t\t// force to bareword for hash key => or {variable literal} cases\n\t\t\t\tif (disambiguateBareword(styler, bk, bk + fw, backFlag, backPos, endPos) & 2) {\n\t\t\t\t\tsc.ChangeState(SCE_PL_IDENTIFIER);\n\t\t\t\t}\n\t\t\t\tbackFlag = BACK_NONE;\n\t\t\t} else if (sc.ch == '(' && sc.currentPos > 0) {\t// '(' or subroutine prototype\n\t\t\t\tsc.Complete();\n\t\t\t\tif (styleCheckSubPrototype(styler, sc.currentPos - 1)) {\n\t\t\t\t\tsc.SetState(SCE_PL_SUB_PROTOTYPE);\n\t\t\t\t\tbackFlag = BACK_NONE;\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_PL_OPERATOR);\n\t\t\t\t}\n\t\t\t} else if (setPerlOperator.Contains(sc.ch)) {\t// operators\n\t\t\t\tsc.SetState(SCE_PL_OPERATOR);\n\t\t\t\tif (sc.Match('.', '.')) {\t// .. and ...\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tif (sc.chNext == '.') sc.Forward();\n\t\t\t\t}\n\t\t\t} else if (sc.ch == 4 || sc.ch == 26) {\t\t// ^D and ^Z ends valid perl source\n\t\t\t\tsc.SetState(SCE_PL_DATASECTION);\n\t\t\t} else {\n\t\t\t\t// keep colouring defaults\n\t\t\t\tsc.Complete();\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n\tif (sc.state == SCE_PL_HERE_Q\n\t        || sc.state == SCE_PL_HERE_QQ\n\t        || sc.state == SCE_PL_HERE_QX\n\t        || sc.state == SCE_PL_FORMAT) {\n\t\tstyler.ChangeLexerState(sc.currentPos, styler.Length());\n\t}\n\tsc.Complete();\n}\n\n#define PERL_HEADFOLD_SHIFT\t\t4\n#define PERL_HEADFOLD_MASK\t\t0xF0\n\nvoid SCI_METHOD LexerPerl::Fold(unsigned int startPos, int length, int /* initStyle */, IDocument *pAccess) {\n\n\tif (!options.fold)\n\t\treturn;\n\n\tLexAccessor styler(pAccess);\n\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\n\t// Backtrack to previous line in case need to fix its fold status\n\tif (startPos > 0) {\n\t\tif (lineCurrent > 0) {\n\t\t\tlineCurrent--;\n\t\t\tstartPos = styler.LineStart(lineCurrent);\n\t\t}\n\t}\n\n\tint levelPrev = SC_FOLDLEVELBASE;\n\tif (lineCurrent > 0)\n\t\tlevelPrev = styler.LevelAt(lineCurrent - 1) >> 16;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tchar chPrev = styler.SafeGetCharAt(startPos - 1);\n\tint styleNext = styler.StyleAt(startPos);\n\t// Used at end of line to determine if the line was a package definition\n\tbool isPackageLine = false;\n\tint podHeading = 0;\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tint stylePrevCh = (i) ? styler.StyleAt(i - 1):SCE_PL_DEFAULT;\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tbool atLineStart = ((chPrev == '\\r') || (chPrev == '\\n')) || i == 0;\n\t\t// Comment folding\n\t\tif (options.foldComment && atEOL && IsCommentLine(lineCurrent, styler)) {\n\t\t\tif (!IsCommentLine(lineCurrent - 1, styler)\n\t\t\t        && IsCommentLine(lineCurrent + 1, styler))\n\t\t\t\tlevelCurrent++;\n\t\t\telse if (IsCommentLine(lineCurrent - 1, styler)\n\t\t\t        && !IsCommentLine(lineCurrent + 1, styler))\n\t\t\t\tlevelCurrent--;\n\t\t}\n\t\t// {} [] block folding\n\t\tif (style == SCE_PL_OPERATOR) {\n\t\t\tif (ch == '{') {\n\t\t\t\tif (options.foldAtElse && levelCurrent < levelPrev)\n\t\t\t\t\t--levelPrev;\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (ch == '}') {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t\tif (ch == '[') {\n\t\t\t\tif (options.foldAtElse && levelCurrent < levelPrev)\n\t\t\t\t\t--levelPrev;\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (ch == ']') {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\t\t// POD folding\n\t\tif (options.foldPOD && atLineStart) {\n\t\t\tif (style == SCE_PL_POD) {\n\t\t\t\tif (stylePrevCh != SCE_PL_POD && stylePrevCh != SCE_PL_POD_VERB)\n\t\t\t\t\tlevelCurrent++;\n\t\t\t\telse if (styler.Match(i, \"=cut\"))\n\t\t\t\t\tlevelCurrent = (levelCurrent & ~PERL_HEADFOLD_MASK) - 1;\n\t\t\t\telse if (styler.Match(i, \"=head\"))\n\t\t\t\t\tpodHeading = PodHeadingLevel(i, styler);\n\t\t\t} else if (style == SCE_PL_DATASECTION) {\n\t\t\t\tif (ch == '=' && IsASCII(chNext) && isalpha(chNext) && levelCurrent == SC_FOLDLEVELBASE)\n\t\t\t\t\tlevelCurrent++;\n\t\t\t\telse if (styler.Match(i, \"=cut\") && levelCurrent > SC_FOLDLEVELBASE)\n\t\t\t\t\tlevelCurrent = (levelCurrent & ~PERL_HEADFOLD_MASK) - 1;\n\t\t\t\telse if (styler.Match(i, \"=head\"))\n\t\t\t\t\tpodHeading = PodHeadingLevel(i, styler);\n\t\t\t\t// if package used or unclosed brace, level > SC_FOLDLEVELBASE!\n\t\t\t\t// reset needed as level test is vs. SC_FOLDLEVELBASE\n\t\t\t\telse if (stylePrevCh != SCE_PL_DATASECTION)\n\t\t\t\t\tlevelCurrent = SC_FOLDLEVELBASE;\n\t\t\t}\n\t\t}\n\t\t// package folding\n\t\tif (options.foldPackage && atLineStart) {\n\t\t\tif (IsPackageLine(lineCurrent, styler)\n\t\t\t        && !IsPackageLine(lineCurrent + 1, styler))\n\t\t\t\tisPackageLine = true;\n\t\t}\n\n\t\t//heredoc folding\n\t\tswitch (style) {\n\t\tcase SCE_PL_HERE_QQ :\n\t\tcase SCE_PL_HERE_Q :\n\t\tcase SCE_PL_HERE_QX :\n\t\t\tswitch (stylePrevCh) {\n\t\t\tcase SCE_PL_HERE_QQ :\n\t\t\tcase SCE_PL_HERE_Q :\n\t\t\tcase SCE_PL_HERE_QX :\n\t\t\t\t//do nothing;\n\t\t\t\tbreak;\n\t\t\tdefault :\n\t\t\t\tlevelCurrent++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tswitch (stylePrevCh) {\n\t\t\tcase SCE_PL_HERE_QQ :\n\t\t\tcase SCE_PL_HERE_Q :\n\t\t\tcase SCE_PL_HERE_QX :\n\t\t\t\tlevelCurrent--;\n\t\t\t\tbreak;\n\t\t\tdefault :\n\t\t\t\t//do nothing;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t//explicit folding\n\t\tif (options.foldCommentExplicit && style == SCE_PL_COMMENTLINE && ch == '#') {\n\t\t\tif (chNext == '{') {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (levelCurrent > SC_FOLDLEVELBASE  && chNext == '}') {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\t// POD headings occupy bits 7-4, leaving some breathing room for\n\t\t\t// non-standard practice -- POD sections stuck in blocks, etc.\n\t\t\tif (podHeading > 0) {\n\t\t\t\tlevelCurrent = (lev & ~PERL_HEADFOLD_MASK) | (podHeading << PERL_HEADFOLD_SHIFT);\n\t\t\t\tlev = levelCurrent - 1;\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t\tpodHeading = 0;\n\t\t\t}\n\t\t\t// Check if line was a package declaration\n\t\t\t// because packages need \"special\" treatment\n\t\t\tif (isPackageLine) {\n\t\t\t\tlev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;\n\t\t\t\tlevelCurrent = SC_FOLDLEVELBASE + 1;\n\t\t\t\tisPackageLine = false;\n\t\t\t}\n\t\t\tlev |= levelCurrent << 16;\n\t\t\tif (visibleChars == 0 && options.foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t\tchPrev = ch;\n\t}\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nLexerModule lmPerl(SCLEX_PERL, LexerPerl::LexerFactoryPerl, \"perl\", perlWordListDesc, 8);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexPowerPro.cpp",
    "content": "// Scintilla source code edit control\n// @file LexPowerPro.cxx\n// PowerPro utility, written by Bruce Switzer, is available from http://powerpro.webeddie.com\n// PowerPro lexer is written by Christopher Bean (cbean@cb-software.net)\n//\n// Lexer code heavily borrowed from:\n//\tLexAU3.cxx by Jos van der Zande\n//\tLexCPP.cxx by Neil Hodgson\n//\tLexVB.cxx by Neil Hodgson\n//\n// Changes:\n// \t2008-10-25 - Initial release\n//\t2008-10-26 - Changed how <name> is hilighted in  'function <name>' so that\n//\t\t\t\t local isFunction = \"\" and local functions = \"\" don't get falsely highlighted\n//\t2008-12-14 - Added bounds checking for szFirstWord and szDo\n//\t\t\t   - Replaced SetOfCharacters with CharacterSet\n//\t\t\t   - Made sure that CharacterSet::Contains is passed only positive values\n//\t\t\t   - Made sure that the return value of Accessor::SafeGetCharAt is positive before\n//\t\t\t\t passing to functions that require positive values like isspacechar()\n//\t\t\t   - Removed unused visibleChars processing from ColourisePowerProDoc()\n//\t\t\t   - Fixed bug with folding logic where line continuations didn't end where\n//\t\t\t\t they were supposed to\n//\t\t\t   - Moved all helper functions to the top of the file\n//\t2010-06-03 - Added onlySpaces variable to allow the @function and ;comment styles to be indented\n//\t\t\t   - Modified HasFunction function to be a bit more robust\n//\t\t\t   - Renamed HasFunction function to IsFunction\n//\t\t\t   - Cleanup\n// Copyright 1998-2005 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <string.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsStreamCommentStyle(int style) {\n\treturn style == SCE_POWERPRO_COMMENTBLOCK;\n}\n\nstatic inline bool IsLineEndChar(unsigned char ch) {\n\treturn \tch == 0x0a \t\t//LF\n\t\t\t|| ch == 0x0c\t//FF\n\t\t\t|| ch == 0x0d;\t//CR\n}\n\nstatic bool IsContinuationLine(unsigned int szLine, Accessor &styler)\n{\n\tint startPos = styler.LineStart(szLine);\n\tint endPos = styler.LineStart(szLine + 1) - 2;\n\twhile (startPos < endPos)\n\t{\n\t\tchar stylech = styler.StyleAt(startPos);\n\t\tif (!(stylech == SCE_POWERPRO_COMMENTBLOCK)) {\n\t\t\tchar ch = styler.SafeGetCharAt(endPos);\n\t\t\tchar chPrev = styler.SafeGetCharAt(endPos - 1);\n\t\t\tchar chPrevPrev = styler.SafeGetCharAt(endPos - 2);\n\t\t\tif (ch > 0 && chPrev > 0 && chPrevPrev > 0 && !isspacechar(ch) && !isspacechar(chPrev) && !isspacechar(chPrevPrev) )\n\t\t\t\treturn (chPrevPrev == ';' && chPrev == ';' && ch == '+');\n\t\t\t}\n\t\tendPos--; // skip to next char\n\t}\n\treturn false;\n}\n\n// Routine to find first none space on the current line and return its Style\n// needed for comment lines not starting on pos 1\nstatic int GetStyleFirstWord(int szLine, Accessor &styler)\n{\n\tint startPos = styler.LineStart(szLine);\n\tint endPos = styler.LineStart(szLine + 1) - 1;\n\tchar ch = styler.SafeGetCharAt(startPos);\n\n\twhile (ch > 0 && isspacechar(ch) && startPos < endPos)\n\t{\n\t\tstartPos++; // skip to next char\n\t\tch = styler.SafeGetCharAt(startPos);\n\t}\n\treturn styler.StyleAt(startPos);\n}\n\n//returns true if there is a function to highlight\n//used to highlight <name> in 'function <name>'\n//note:\n//\t\tsample line (without quotes): \"\\tfunction asdf()\n//\t\tcurrentPos will be the position of 'a'\nstatic bool IsFunction(Accessor &styler, unsigned int currentPos) {\n\n\tconst char function[10] = \"function \"; //10 includes \\0\n\tunsigned int numberOfCharacters = sizeof(function) - 1;\n\tunsigned int position = currentPos - numberOfCharacters;\n\n\t//compare each character with the letters in the function array\n\t//return false if ALL don't match\n\tfor (unsigned int i = 0; i < numberOfCharacters; i++) {\n\t\tchar c = styler.SafeGetCharAt(position++);\n\t\tif (c != function[i])\n\t\t\treturn false;\n\t}\n\n\t//make sure that there are only spaces (or tabs) between the beginning\n\t//of the line and the function declaration\n\tposition = currentPos - numberOfCharacters - 1; \t\t//-1 to move to char before 'function'\n\tfor (unsigned int j = 0; j < 16; j++) {\t\t\t\t\t//check up to 16 preceeding characters\n\t\tchar c = styler.SafeGetCharAt(position--, '\\0');\t//if can't read char, return NUL (past beginning of document)\n\t\tif (c <= 0)\t//reached beginning of document\n\t\t\treturn true;\n\t\tif (c > 0 && IsLineEndChar(c))\n\t\t\treturn true;\n\t\telse if (c > 0 && !IsASpaceOrTab(c))\n\t\t\treturn false;\n\t}\n\n\t//fall-through\n\treturn false;\n}\n\nstatic void ColourisePowerProDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                            Accessor &styler, bool caseSensitive) {\n\n\tWordList &keywords  = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\tWordList &keywords4 = *keywordlists[3];\n\n\t//define the character sets\n\tCharacterSet setWordStart(CharacterSet::setAlpha, \"_@\", 0x80, true);\n\tCharacterSet setWord(CharacterSet::setAlphaNum, \"._\", 0x80, true);\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\tchar s_save[100]; //for last line highlighting\n\n\t//are there only spaces between the first letter of the line and the beginning of the line\n\tbool onlySpaces = true;\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\t// save the total current word for eof processing\n\t\tchar s[100];\n\t\tsc.GetCurrentLowered(s, sizeof(s));\n\n\t\tif ((sc.ch > 0) && setWord.Contains(sc.ch))\n\t\t{\n\t\t\tstrcpy(s_save,s);\n\t\t\tint tp = static_cast<int>(strlen(s_save));\n\t\t\tif (tp < 99) {\n\t\t\t\ts_save[tp] = static_cast<char>(tolower(sc.ch));\n\t\t\t\ts_save[tp+1] = '\\0';\n\t\t\t}\n\t\t}\n\n\t\tif (sc.atLineStart) {\n\t\t\tif (sc.state == SCE_POWERPRO_DOUBLEQUOTEDSTRING) {\n\t\t\t\t// Prevent SCE_POWERPRO_STRINGEOL from leaking back to previous line which\n\t\t\t\t// ends with a line continuation by locking in the state upto this position.\n\t\t\t\tsc.SetState(SCE_POWERPRO_DOUBLEQUOTEDSTRING);\n\t\t\t}\n\t\t}\n\n\t\t// Determine if the current state should terminate.\n\t\tswitch (sc.state) {\n\t\t\tcase SCE_POWERPRO_OPERATOR:\n\t\t\t\tsc.SetState(SCE_POWERPRO_DEFAULT);\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_POWERPRO_NUMBER:\n\n\t\t\t\tif (!IsADigit(sc.ch))\n\t\t\t\t\tsc.SetState(SCE_POWERPRO_DEFAULT);\n\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_POWERPRO_IDENTIFIER:\n\t\t\t\t//if ((sc.ch > 0) && !setWord.Contains(sc.ch) || (sc.ch == '.')) { // use this line if don't want to match keywords with . in them. ie: win.debug will match both win and debug so win debug will also be colorized\n\t\t\t\tif ((sc.ch > 0) && !setWord.Contains(sc.ch)){  // || (sc.ch == '.')) { // use this line if you want to match keywords with a . ie: win.debug will only match win.debug neither win nor debug will be colorized separately\n\t\t\t\t\tchar s[1000];\n\t\t\t\t\tif (caseSensitive) {\n\t\t\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_POWERPRO_WORD);\n\t\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_POWERPRO_WORD2);\n\t\t\t\t\t} else if (keywords3.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_POWERPRO_WORD3);\n\t\t\t\t\t} else if (keywords4.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_POWERPRO_WORD4);\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(SCE_POWERPRO_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_POWERPRO_LINECONTINUE:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_POWERPRO_DEFAULT);\n\t\t\t\t} else if (sc.Match('/', '*') || sc.Match('/', '/')) {\n\t\t\t\t\tsc.SetState(SCE_POWERPRO_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_POWERPRO_COMMENTBLOCK:\n\t\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_POWERPRO_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_POWERPRO_COMMENTLINE:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_POWERPRO_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_POWERPRO_DOUBLEQUOTEDSTRING:\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.ChangeState(SCE_POWERPRO_STRINGEOL);\n\t\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\t\tsc.ForwardSetState(SCE_POWERPRO_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_POWERPRO_SINGLEQUOTEDSTRING:\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.ChangeState(SCE_POWERPRO_STRINGEOL);\n\t\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\t\tsc.ForwardSetState(SCE_POWERPRO_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_POWERPRO_STRINGEOL:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_POWERPRO_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_POWERPRO_VERBATIM:\n\t\t\t\tif (sc.ch == '\\\"') {\n\t\t\t\t\tif (sc.chNext == '\\\"') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.ForwardSetState(SCE_POWERPRO_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_POWERPRO_ALTQUOTE:\n\t\t\t\tif (sc.ch == '#') {\n\t\t\t\t\tif (sc.chNext == '#') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.ForwardSetState(SCE_POWERPRO_DEFAULT);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SCE_POWERPRO_FUNCTION:\n\t\t\t\tif (isspacechar(sc.ch) || sc.ch == '(') {\n\t\t\t\t\tsc.SetState(SCE_POWERPRO_DEFAULT);\n\t\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_POWERPRO_DEFAULT) {\n\t\t\tif (sc.Match('?', '\\\"')) {\n\t\t\t\tsc.SetState(SCE_POWERPRO_VERBATIM);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_POWERPRO_NUMBER);\n\t\t\t}else if (sc.Match('?','#')) {\n\t\t\t\tif (sc.ch == '?' && sc.chNext == '#') {\n\t\t\t\t\tsc.SetState(SCE_POWERPRO_ALTQUOTE);\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (IsFunction(styler, sc.currentPos)) {\t//highlight <name> in 'function <name>'\n\t\t\t\tsc.SetState(SCE_POWERPRO_FUNCTION);\n\t\t\t} else if (onlySpaces && sc.ch == '@') { \t\t//alternate function definition [label]\n\t\t\t\tsc.SetState(SCE_POWERPRO_FUNCTION);\n\t\t\t} else if ((sc.ch > 0) && (setWordStart.Contains(sc.ch) || (sc.ch == '?'))) {\n\t\t\t\tsc.SetState(SCE_POWERPRO_IDENTIFIER);\n\t\t\t} else if (sc.Match(\";;+\")) {\n\t\t\t\tsc.SetState(SCE_POWERPRO_LINECONTINUE);\n\t\t\t} else if (sc.Match('/', '*')) {\n\t\t\t\tsc.SetState(SCE_POWERPRO_COMMENTBLOCK);\n\t\t\t\tsc.Forward();\t// Eat the * so it isn't used for the end of the comment\n\t\t\t} else if (sc.Match('/', '/')) {\n\t\t\t\tsc.SetState(SCE_POWERPRO_COMMENTLINE);\n\t\t\t} else if (onlySpaces && sc.ch == ';') {\t\t//legacy comment that can only have blank space in front of it\n\t\t\t\tsc.SetState(SCE_POWERPRO_COMMENTLINE);\n\t\t\t} else if (sc.Match(\";;\")) {\n\t\t\t\tsc.SetState(SCE_POWERPRO_COMMENTLINE);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_POWERPRO_DOUBLEQUOTEDSTRING);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_POWERPRO_SINGLEQUOTEDSTRING);\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_POWERPRO_OPERATOR);\n\t\t\t}\n\t\t}\n\n\t\t//maintain a record of whether or not all the preceding characters on\n\t\t//a line are space characters\n\t\tif (onlySpaces && !IsASpaceOrTab(sc.ch))\n\t\t\tonlySpaces = false;\n\n\t\t//reset when starting a new line\n\t\tif (sc.atLineEnd)\n\t\t\tonlySpaces = true;\n\t}\n\n\t//*************************************\n\t// Colourize the last word correctly\n\t//*************************************\n\tif (sc.state == SCE_POWERPRO_IDENTIFIER)\n\t{\n\t\tif (keywords.InList(s_save)) {\n\t\t\tsc.ChangeState(SCE_POWERPRO_WORD);\n\t\t\tsc.SetState(SCE_POWERPRO_DEFAULT);\n\t\t}\n\t\telse if (keywords2.InList(s_save)) {\n\t\t\tsc.ChangeState(SCE_POWERPRO_WORD2);\n\t\t\tsc.SetState(SCE_POWERPRO_DEFAULT);\n\t\t}\n\t\telse if (keywords3.InList(s_save)) {\n\t\t\tsc.ChangeState(SCE_POWERPRO_WORD3);\n\t\t\tsc.SetState(SCE_POWERPRO_DEFAULT);\n\t\t}\n\t\telse if (keywords4.InList(s_save)) {\n\t\t\tsc.ChangeState(SCE_POWERPRO_WORD4);\n\t\t\tsc.SetState(SCE_POWERPRO_DEFAULT);\n\t\t}\n\t\telse {\n\t\t\tsc.SetState(SCE_POWERPRO_DEFAULT);\n\t\t}\n\t}\n\tsc.Complete();\n}\n\nstatic void FoldPowerProDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)\n{\n\t//define the character sets\n\tCharacterSet setWordStart(CharacterSet::setAlpha, \"_@\", 0x80, true);\n\tCharacterSet setWord(CharacterSet::setAlphaNum, \"._\", 0x80, true);\n\n\t//used to tell if we're recursively folding the whole document, or just a small piece (ie: if statement or 1 function)\n\tbool isFoldingAll = true;\n\n\tint endPos = startPos + length;\n\tint lastLine = styler.GetLine(styler.Length()); //used to help fold the last line correctly\n\n\t// get settings from the config files for folding comments and preprocessor lines\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldInComment = styler.GetPropertyInt(\"fold.comment\") == 2;\n\tbool foldCompact = true;\n\n\t// Backtrack to previous line in case need to fix its fold status\n\tint lineCurrent = styler.GetLine(startPos);\n\tif (startPos > 0) {\n\t\tisFoldingAll = false;\n\t\tif (lineCurrent > 0) {\n\t\t\tlineCurrent--;\n\t\t\tstartPos = styler.LineStart(lineCurrent);\n\t\t}\n\t}\n\t// vars for style of previous/current/next lines\n\tint style = GetStyleFirstWord(lineCurrent,styler);\n\tint stylePrev = 0;\n\n\t// find the first previous line without continuation character at the end\n\twhile ((lineCurrent > 0 && IsContinuationLine(lineCurrent, styler))\n\t       || (lineCurrent > 1 && IsContinuationLine(lineCurrent - 1, styler))) {\n\t\tlineCurrent--;\n\t\tstartPos = styler.LineStart(lineCurrent);\n\t}\n\n\tif (lineCurrent > 0) {\n\t\tstylePrev = GetStyleFirstWord(lineCurrent-1,styler);\n\t}\n\n\t// vars for getting first word to check for keywords\n\tbool isFirstWordStarted = false;\n\tbool isFirstWordEnded = false;\n\n\tconst unsigned int FIRST_WORD_MAX_LEN = 10;\n\tchar szFirstWord[FIRST_WORD_MAX_LEN] = \"\";\n\tunsigned int firstWordLen = 0;\n\n\tchar szDo[3]=\"\";\n\tint\t szDolen = 0;\n\tbool isDoLastWord = false;\n\n\t// var for indentlevel\n\tint levelCurrent = SC_FOLDLEVELBASE;\n\tif (lineCurrent > 0)\n\t\tlevelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n\tint levelNext = levelCurrent;\n\n\tint\tvisibleChars = 0;\n\tint functionCount = 0;\n\n\tchar chNext = styler.SafeGetCharAt(startPos);\n\tchar chPrev = '\\0';\n\tchar chPrevPrev = '\\0';\n\tchar chPrevPrevPrev = '\\0';\n\n\tfor (int i = startPos; i < endPos; i++) {\n\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\n\t\tif ((ch > 0) && setWord.Contains(ch))\n\t\t\tvisibleChars++;\n\n\t\t// get the syle for the current character neede to check in comment\n\t\tint stylech = styler.StyleAt(i);\n\n\t\t// start the capture of the first word\n\t\tif (!isFirstWordStarted && (ch > 0)) {\n\t\t\tif (setWord.Contains(ch) || setWordStart.Contains(ch) || ch == ';' || ch == '/') {\n\t\t\t\tisFirstWordStarted = true;\n\t\t\t\tif (firstWordLen < FIRST_WORD_MAX_LEN - 1) {\n\t\t\t\t\tszFirstWord[firstWordLen++] = static_cast<char>(tolower(ch));\n\t\t\t\t\tszFirstWord[firstWordLen] = '\\0';\n\t\t\t\t}\n\t\t\t}\n\t\t} // continue capture of the first word on the line\n\t\telse if (isFirstWordStarted && !isFirstWordEnded && (ch > 0)) {\n\t\t\tif (!setWord.Contains(ch)) {\n\t\t\t\tisFirstWordEnded = true;\n\t\t\t}\n\t\t\telse if (firstWordLen < (FIRST_WORD_MAX_LEN - 1)) {\n\t\t\t\tszFirstWord[firstWordLen++] = static_cast<char>(tolower(ch));\n\t\t\t\tszFirstWord[firstWordLen] = '\\0';\n\t\t\t}\n\t\t}\n\n\t\tif (stylech != SCE_POWERPRO_COMMENTLINE) {\n\n\t\t\t//reset isDoLastWord if we find a character(ignoring spaces) after 'do'\n\t\t\tif (isDoLastWord && (ch > 0) && setWord.Contains(ch))\n\t\t\t\tisDoLastWord = false;\n\n\t\t\t// --find out if the word \"do\" is the last on a \"if\" line--\n\t\t\t// collect each letter and put it into a buffer 2 chars long\n\t\t\t// if we end up with \"do\" in the buffer when we reach the end of\n\t\t\t// the line, \"do\" was the last word on the line\n\t\t\tif ((ch > 0) && isFirstWordEnded && strcmp(szFirstWord, \"if\") == 0) {\n\t\t\t\tif (szDolen == 2) {\n\t\t\t\t\tszDo[0] = szDo[1];\n\t\t\t\t\tszDo[1] = static_cast<char>(tolower(ch));\n\t\t\t\t\tszDo[2] = '\\0';\n\n\t\t\t\t\tif (strcmp(szDo, \"do\") == 0)\n\t\t\t\t\t\tisDoLastWord = true;\n\n\t\t\t\t} else if (szDolen < 2) {\n\t\t\t\t\tszDo[szDolen++] = static_cast<char>(tolower(ch));\n\t\t\t\t\tszDo[szDolen] = '\\0';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// End of Line found so process the information\n\t\t if ((ch == '\\r' && chNext != '\\n') // \\r\\n\n\t\t\t|| ch == '\\n' \t\t\t\t\t// \\n\n\t\t\t|| i == endPos) {\t\t\t\t// end of selection\n\n\t\t\t// **************************\n\t\t\t// Folding logic for Keywords\n\t\t\t// **************************\n\n\t\t\t// if a keyword is found on the current line and the line doesn't end with ;;+ (continuation)\n\t\t\t//    and we are not inside a commentblock.\n\t\t\tif (firstWordLen > 0\n\t\t\t\t&& chPrev != '+' && chPrevPrev != ';' && chPrevPrevPrev !=';'\n\t\t\t\t&& (!IsStreamCommentStyle(style) || foldInComment) ) {\n\n\t\t\t\t// only fold \"if\" last keyword is \"then\"  (else its a one line if)\n\t\t\t\tif (strcmp(szFirstWord, \"if\") == 0  && isDoLastWord)\n\t\t\t\t\t\tlevelNext++;\n\n\t\t\t\t// create new fold for these words\n\t\t\t\tif (strcmp(szFirstWord, \"for\") == 0)\n\t\t\t\t\tlevelNext++;\n\n\t\t\t\t//handle folding for functions/labels\n\t\t\t\t//Note: Functions and labels don't have an explicit end like [end function]\n\t\t\t\t//\t1. functions/labels end at the start of another function\n\t\t\t\t//\t2. functions/labels end at the end of the file\n\t\t\t\tif ((strcmp(szFirstWord, \"function\") == 0) || (firstWordLen > 0 && szFirstWord[0] == '@')) {\n\t\t\t\t\tif (isFoldingAll) { //if we're folding the whole document (recursivly by lua script)\n\n\t\t\t\t\t\tif (functionCount > 0) {\n\t\t\t\t\t\t\tlevelCurrent--;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlevelNext++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfunctionCount++;\n\n\t\t\t\t\t} else { //if just folding a small piece (by clicking on the minus sign next to the word)\n\t\t\t\t\t\tlevelCurrent--;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// end the fold for these words before the current line\n\t\t\t\tif (strcmp(szFirstWord, \"endif\") == 0 || strcmp(szFirstWord, \"endfor\") == 0) {\n\t\t\t\t\t\tlevelNext--;\n\t\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\n\t\t\t\t// end the fold for these words before the current line and Start new fold\n\t\t\t\tif (strcmp(szFirstWord, \"else\") == 0 || strcmp(szFirstWord, \"elseif\") == 0 )\n\t\t\t\t\t\tlevelCurrent--;\n\n\t\t\t}\n\t\t\t// Preprocessor and Comment folding\n\t\t\tint styleNext = GetStyleFirstWord(lineCurrent + 1,styler);\n\n\t\t\t// *********************************\n\t\t\t// Folding logic for Comment blocks\n\t\t\t// *********************************\n\t\t\tif (foldComment && IsStreamCommentStyle(style)) {\n\n\t\t\t\t// Start of a comment block\n\t\t\t\tif (stylePrev != style && IsStreamCommentStyle(styleNext) && styleNext == style) {\n\t\t\t\t    levelNext++;\n\t\t\t\t} // fold till the last line for normal comment lines\n\t\t\t\telse if (IsStreamCommentStyle(stylePrev)\n\t\t\t\t\t\t&& styleNext != SCE_POWERPRO_COMMENTLINE\n\t\t\t\t\t\t&& stylePrev == SCE_POWERPRO_COMMENTLINE\n\t\t\t\t\t\t&& style == SCE_POWERPRO_COMMENTLINE) {\n\t\t\t\t\tlevelNext--;\n\t\t\t\t} // fold till the one but last line for Blockcomment lines\n\t\t\t\telse if (IsStreamCommentStyle(stylePrev)\n\t\t\t\t\t\t&& styleNext != SCE_POWERPRO_COMMENTBLOCK\n\t\t\t\t\t\t&& style == SCE_POWERPRO_COMMENTBLOCK) {\n\t\t\t\t\tlevelNext--;\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tint levelUse = levelCurrent;\n\t\t\tint lev = levelUse | levelNext << 16;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (levelUse < levelNext)\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent))\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\n\t\t\t// reset values for the next line\n\t\t\tlineCurrent++;\n\t\t\tstylePrev = style;\n\t\t\tstyle = styleNext;\n\t\t\tlevelCurrent = levelNext;\n\t\t\tvisibleChars = 0;\n\n\t\t\t// if the last characters are ;;+ then don't reset since the line continues on the next line.\n\t\t\tif (chPrev != '+' && chPrevPrev != ';' && chPrevPrevPrev != ';') {\n\t\t\t\tfirstWordLen = 0;\n\t\t\t\tszDolen = 0;\n\t\t\t\tisFirstWordStarted = false;\n\t\t\t\tisFirstWordEnded = false;\n\t\t\t\tisDoLastWord = false;\n\n\t\t\t\t//blank out first word\n\t\t\t\tfor (unsigned int i = 0; i < FIRST_WORD_MAX_LEN; i++)\n\t\t\t\t\tszFirstWord[i] = '\\0';\n\t\t\t}\n\t\t}\n\n\t\t// save the last processed characters\n\t\tif ((ch > 0) && !isspacechar(ch)) {\n\t\t\tchPrevPrevPrev = chPrevPrev;\n\t\t\tchPrevPrev = chPrev;\n\t\t\tchPrev = ch;\n\t\t}\n\t}\n\n\t//close folds on the last line - without this a 'phantom'\n\t//fold can appear when an open fold is on the last line\n\t//this can occur because functions and labels don't have an explicit end\n\tif (lineCurrent >= lastLine) {\n\t\tint lev = 0;\n\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\tstyler.SetLevel(lineCurrent, lev);\n\t}\n\n}\n\nstatic const char * const powerProWordLists[] = {\n            \"Keyword list 1\",\n            \"Keyword list 2\",\n            \"Keyword list 3\",\n            \"Keyword list 4\",\n            0,\n        };\n\nstatic void ColourisePowerProDocWrapper(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                                       Accessor &styler) {\n\tColourisePowerProDoc(startPos, length, initStyle, keywordlists, styler, false);\n}\n\nLexerModule lmPowerPro(SCLEX_POWERPRO, ColourisePowerProDocWrapper, \"powerpro\", FoldPowerProDoc, powerProWordLists);\n\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexPowerShell.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexPowerShell.cxx\n ** Lexer for PowerShell scripts.\n **/\n// Copyright 2008 by Tim Gerundt <tim@gerundt.de>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n// Extended to accept accented characters\nstatic inline bool IsAWordChar(int ch) {\n\treturn ch >= 0x80 || isalnum(ch) || ch == '-' || ch == '_';\n}\n\nstatic void ColourisePowerShellDoc(unsigned int startPos, int length, int initStyle,\n                           WordList *keywordlists[], Accessor &styler) {\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\tWordList &keywords4 = *keywordlists[3];\n\tWordList &keywords5 = *keywordlists[4];\n\tWordList &keywords6 = *keywordlists[5];\n\n\tstyler.StartAt(startPos);\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\tif (sc.state == SCE_POWERSHELL_COMMENT) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_POWERSHELL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_POWERSHELL_COMMENTSTREAM) {\n\t\t\tif(sc.atLineStart) {\n\t\t\t\twhile(IsASpaceOrTab(sc.ch)) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tif (sc.ch == '.' && IsAWordChar(sc.chNext)) {\n\t\t\t\t\tsc.SetState(SCE_POWERSHELL_COMMENTDOCKEYWORD);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (sc.ch == '>' && sc.chPrev == '#') {\n\t\t\t\tsc.ForwardSetState(SCE_POWERSHELL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_POWERSHELL_COMMENTDOCKEYWORD) {\n\t\t\tif(!IsAWordChar(sc.ch)) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\tif (!keywords6.InList(s + 1)) {\n\t\t\t\t\tsc.ChangeState(SCE_POWERSHELL_COMMENTSTREAM);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_POWERSHELL_COMMENTSTREAM);\n\t\t\t}\n\t\t} else if (sc.state == SCE_POWERSHELL_STRING) {\n\t\t\t// This is a doubles quotes string\n\t\t\tif (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_POWERSHELL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_POWERSHELL_CHARACTER) {\n\t\t\t// This is a single quote string\n\t\t\tif (sc.ch == '\\'') {\n\t\t\t\tsc.ForwardSetState(SCE_POWERSHELL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_POWERSHELL_HERE_STRING) {\n\t\t\t// This is a doubles quotes here-string\n\t\t\tif (sc.atLineStart && sc.ch == '\\\"' && sc.chNext == '@') {\n\t\t\t\tsc.Forward(2);\n\t\t\t\tsc.SetState(SCE_POWERSHELL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_POWERSHELL_HERE_CHARACTER) {\n\t\t\t// This is a single quote here-string\n\t\t\tif (sc.atLineStart && sc.ch == '\\'' && sc.chNext == '@') {\n\t\t\t\tsc.Forward(2);\n\t\t\t\tsc.SetState(SCE_POWERSHELL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_POWERSHELL_NUMBER) {\n\t\t\tif (!IsADigit(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_POWERSHELL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_POWERSHELL_VARIABLE) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_POWERSHELL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_POWERSHELL_OPERATOR) {\n\t\t\tif (!isoperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_POWERSHELL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_POWERSHELL_IDENTIFIER) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\n\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_POWERSHELL_KEYWORD);\n\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_POWERSHELL_CMDLET);\n\t\t\t\t} else if (keywords3.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_POWERSHELL_ALIAS);\n\t\t\t\t} else if (keywords4.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_POWERSHELL_FUNCTION);\n\t\t\t\t} else if (keywords5.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_POWERSHELL_USER1);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_POWERSHELL_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_POWERSHELL_DEFAULT) {\n\t\t\tif (sc.ch == '#') {\n\t\t\t\tsc.SetState(SCE_POWERSHELL_COMMENT);\n\t\t\t} else if (sc.ch == '<' && sc.chNext == '#') {\n\t\t\t\tsc.SetState(SCE_POWERSHELL_COMMENTSTREAM);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_POWERSHELL_STRING);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_POWERSHELL_CHARACTER);\n\t\t\t} else if (sc.ch == '@' && sc.chNext == '\\\"') {\n\t\t\t\tsc.SetState(SCE_POWERSHELL_HERE_STRING);\n\t\t\t} else if (sc.ch == '@' && sc.chNext == '\\'') {\n\t\t\t\tsc.SetState(SCE_POWERSHELL_HERE_CHARACTER);\n\t\t\t} else if (sc.ch == '$') {\n\t\t\t\tsc.SetState(SCE_POWERSHELL_VARIABLE);\n\t\t\t} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_POWERSHELL_NUMBER);\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_POWERSHELL_OPERATOR);\n\t\t\t} else if (IsAWordChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_POWERSHELL_IDENTIFIER);\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n}\n\n// Store both the current line's fold level and the next lines in the\n// level store to make it easy to pick up with each increment\n// and to make it possible to fiddle the current level for \"} else {\".\nstatic void FoldPowerShellDoc(unsigned int startPos, int length, int initStyle,\n                           WordList *[], Accessor &styler) {\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tbool foldAtElse = styler.GetPropertyInt(\"fold.at.else\", 0) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelCurrent = SC_FOLDLEVELBASE;\n\tif (lineCurrent > 0)\n\t\tlevelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n\tint levelMinCurrent = levelCurrent;\n\tint levelNext = levelCurrent;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (style == SCE_POWERSHELL_OPERATOR) {\n\t\t\tif (ch == '{') {\n\t\t\t\t// Measure the minimum before a '{' to allow\n\t\t\t\t// folding on \"} else {\"\n\t\t\t\tif (levelMinCurrent > levelNext) {\n\t\t\t\t\tlevelMinCurrent = levelNext;\n\t\t\t\t}\n\t\t\t\tlevelNext++;\n\t\t\t} else if (ch == '}') {\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t} else if (foldComment && style == SCE_POWERSHELL_COMMENTSTREAM) {\n\t\t\tif (stylePrev != SCE_POWERSHELL_COMMENTSTREAM && stylePrev != SCE_POWERSHELL_COMMENTDOCKEYWORD) {\n\t\t\t\tlevelNext++;\n\t\t\t} else if (styleNext != SCE_POWERSHELL_COMMENTSTREAM && styleNext != SCE_POWERSHELL_COMMENTDOCKEYWORD) {\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t} else if (foldComment && style == SCE_POWERSHELL_COMMENT) {\n\t\t\tif (ch == '#') {\n\t\t\t\tunsigned int j = i + 1;\n\t\t\t\twhile ((j < endPos) && IsASpaceOrTab(styler.SafeGetCharAt(j))) {\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t\tif (styler.Match(j, \"region\")) {\n\t\t\t\t\tlevelNext++;\n\t\t\t\t} else if (styler.Match(j, \"endregion\")) {\n\t\t\t\t\tlevelNext--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!IsASpace(ch))\n\t\t\tvisibleChars++;\n\t\tif (atEOL || (i == endPos-1)) {\n\t\t\tint levelUse = levelCurrent;\n\t\t\tif (foldAtElse) {\n\t\t\t\tlevelUse = levelMinCurrent;\n\t\t\t}\n\t\t\tint lev = levelUse | levelNext << 16;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (levelUse < levelNext)\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelCurrent = levelNext;\n\t\t\tlevelMinCurrent = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t}\n}\n\nstatic const char * const powershellWordLists[] = {\n\t\"Commands\",\n\t\"Cmdlets\",\n\t\"Aliases\",\n\t\"Functions\",\n\t\"User1\",\n\t\"DocComment\",\n\t0\n};\n\nLexerModule lmPowerShell(SCLEX_POWERSHELL, ColourisePowerShellDoc, \"powershell\", FoldPowerShellDoc, powershellWordLists);\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexProgress.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexProgress.cxx\n **  Lexer for Progress 4GL.\n ** Based on LexCPP.cxx of Neil Hodgson <neilh@scintilla.org>\n  **/\n// Copyright 2006-2007 by Yuval Papish <Yuval@YuvCom.com>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n/** TODO:\nWebSpeed support in html lexer\nSupport \"end triggers\" expression of the triggers phrase\nSupport more than 6 comments levels\n**/\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_');\n}\n\nstatic inline bool IsAWordStart(int ch) {\n\treturn (ch < 0x80) && (isalpha(ch) || ch == '_');\n}\n\nenum SentenceStart { SetSentenceStart = 0xf, ResetSentenceStart = 0x10}; // true -> bit = 0\n\nstatic void Colourise4glDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                            Accessor &styler) {\n\n    WordList &keywords1 = *keywordlists[0];   // regular keywords\n    WordList &keywords2 = *keywordlists[1];   // block opening keywords, only when SentenceStart\n    WordList &keywords3 = *keywordlists[2];   // block opening keywords\n    //WordList &keywords4 = *keywordlists[3]; // preprocessor keywords. Not implemented\n\n\n\tint visibleChars = 0;\n\tint mask;\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\tif (sc.atLineStart) {\n\t\t\t// Reset states to begining of colourise so no surprises\n\t\t\t// if different sets of lines lexed.\n\t\t\tvisibleChars = 0;\n\t\t}\n\n\t\t// Handle line continuation generically.\n\t\tif ((sc.state & 0xf) < SCE_4GL_COMMENT1) {\n\t\tif (sc.ch == '~') {\n\t\t\tif (sc.chNext > ' ') {\n\t\t\t\t// skip special char after ~\n\t\t\t\tsc.Forward();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Skip whitespace between ~ and EOL\n\t\t\t\twhile (sc.More() && (sc.chNext == ' ' || sc.chNext == '\\t') ) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tif (sc.chNext == '\\n' || sc.chNext == '\\r') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tif (sc.ch == '\\r' && sc.chNext == '\\n') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t}\n\t\t// Determine if a new state should be terminated.\n\t\tmask = sc.state & 0x10;\n\t\tswitch (sc.state & 0xf) {\n\t\t\tcase SCE_4GL_OPERATOR:\n\t\t\t\tsc.SetState(SCE_4GL_DEFAULT | mask);\n\t\t\t\tbreak;\n\t\t\tcase SCE_4GL_NUMBER:\n\t\t\t\tif (!(IsADigit(sc.ch))) {\n\t\t\t\t\tsc.SetState(SCE_4GL_DEFAULT | mask);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_4GL_IDENTIFIER:\n\t\t\t\tif (!IsAWordChar(sc.ch) && sc.ch != '-') {\n\t\t\t\t\tchar s[1000];\n\t\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\t\tif ((((sc.state & 0x10) == 0) && keywords2.InList(s)) || keywords3.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_4GL_BLOCK | ResetSentenceStart);\n\t\t\t\t\t}\n\t\t\t\t\telse if (keywords1.InList(s)) {\n\t\t\t\t\t\tif ((s[0] == 'e' && s[1] =='n' && s[2] == 'd' && !isalnum(s[3]) && s[3] != '-') ||\n\t\t\t\t\t\t\t(s[0] == 'f' && s[1] =='o' && s[2] == 'r' && s[3] == 'w' && s[4] =='a' && s[5] == 'r' && s[6] == 'd'&& !isalnum(s[7]))) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_4GL_END | ResetSentenceStart);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if\t((s[0] == 'e' && s[1] =='l' && s[2] == 's' && s[3] == 'e') ||\n\t\t\t\t\t\t\t\t (s[0] == 't' && s[1] =='h' && s[2] == 'e' && s[3] == 'n')) {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_4GL_WORD & SetSentenceStart);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_4GL_WORD | ResetSentenceStart);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsc.SetState(SCE_4GL_DEFAULT | (sc.state & 0x10));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_4GL_PREPROCESSOR:\n\t\t\t\tif (sc.atLineStart) {\n\t\t\t\t\tsc.SetState(SCE_4GL_DEFAULT & SetSentenceStart);\n\t\t\t\t}\n\t\t\t\t/* code removed to allow comments inside preprocessor\n\t\t\t\t\telse if (sc.ch == '*' && sc.chNext == '/') {\n\t\t\t\t\tsc.ForwardSetState(SCE_4GL_DEFAULT | sentenceStartState); } */\n\t\t\t\tbreak;\n\t\t\tcase SCE_4GL_STRING:\n\t\t\t\tif (sc.ch == '\\\"') {\n\t\t\t\t\tsc.ForwardSetState(SCE_4GL_DEFAULT | mask);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SCE_4GL_CHARACTER:\n\t\t\t\tif (sc.ch == '\\'') {\n\t\t\t\t\tsc.ForwardSetState(SCE_4GL_DEFAULT | mask);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif ((sc.state & 0xf) >= SCE_4GL_COMMENT1) {\n\t\t\t\t\tif (sc.ch == '*' && sc.chNext == '/') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\tif ((sc.state & 0xf) == SCE_4GL_COMMENT1) {\n\t\t\t\t\t\t\tsc.ForwardSetState(SCE_4GL_DEFAULT | mask);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tsc.SetState((sc.state & 0x1f) - 1);\n\t\t\t\t\t} else if (sc.ch == '/' && sc.chNext == '*') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t\tsc.SetState((sc.state & 0x1f) + 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tmask = sc.state & 0x10;\n\t\tif ((sc.state & 0xf) == SCE_4GL_DEFAULT) {\n\t\t\tif (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_4GL_NUMBER | ResetSentenceStart);\n\t\t\t} else if (IsAWordStart(sc.ch) || (sc.ch == '@')) {\n\t\t\t\tsc.SetState(SCE_4GL_IDENTIFIER | mask);\n\t\t\t} else if (sc.ch == '/' && sc.chNext == '*') {\n\t\t\t\tsc.SetState(SCE_4GL_COMMENT1 | mask);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_4GL_STRING | ResetSentenceStart);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_4GL_CHARACTER | ResetSentenceStart);\n\t\t\t} else if (sc.ch == '&' && visibleChars == 0 && ((sc.state & 0x10) == 0)) {\n\t\t\t\tsc.SetState(SCE_4GL_PREPROCESSOR | ResetSentenceStart);\n\t\t\t\t// Skip whitespace between & and preprocessor word\n\t\t\t\tdo {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} while ((sc.ch == ' ' || sc.ch == '\\t') && sc.More());\n\t\t\t// Handle syntactical line termination\n\t\t\t} else if ((sc.ch == '.' || sc.ch == ':' || sc.ch == '}') && (sc.chNext == ' ' || sc.chNext == '\\t' || sc.chNext == '\\n' || sc.chNext == '\\r')) {\n\t\t\t\tsc.SetState(sc.state & SetSentenceStart);\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch))) {\n\t\t/* \tThis code allows highlight of handles. Alas, it would cause the phrase \"last-event:function\"\n\t\t\tto be recognized as a BlockBegin */\n\n\t\t\t\tif (sc.ch == ':')\n\t\t\t\t\tsc.SetState(SCE_4GL_OPERATOR & SetSentenceStart);\n\t\t\t\t/* else */\n\t\t\t\t\tsc.SetState(SCE_4GL_OPERATOR | ResetSentenceStart);\n\t\t\t}\n\t\t}\n\n\t\tif (!IsASpace(sc.ch)) {\n\t\t\tvisibleChars++;\n\t\t}\n\t}\n\tsc.Complete();\n}\n\nstatic bool IsStreamCommentStyle(int style) {\n\treturn (style & 0xf) >= SCE_4GL_COMMENT1 ;\n}\n\n// Store both the current line's fold level and the next lines in the\n// level store to make it easy to pick up with each increment\n// and to make it possible to fiddle the current level for \"} else {\".\nstatic void FoldNoBox4glDoc(unsigned int startPos, int length, int initStyle,\n                            Accessor &styler) {\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tbool foldAtElse = styler.GetPropertyInt(\"fold.at.else\", 0) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelCurrent = SC_FOLDLEVELBASE;\n\tif (lineCurrent > 0)\n\t\tlevelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n\tint levelMinCurrent = levelCurrent;\n\tint levelNext = levelCurrent;\n\tchar chNext = static_cast<char>(tolower(styler[startPos]));\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = static_cast<char>(tolower(styler.SafeGetCharAt(i + 1)));\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (foldComment && IsStreamCommentStyle(style)) {\n\t\t\tif (!IsStreamCommentStyle(stylePrev)) {\n\t\t\t\tlevelNext++;\n\t\t\t} else if (!IsStreamCommentStyle(styleNext)) { // && !atEOL) {\n\t\t\t\t// Comments don't end at end of line and the next character may be unstyled.\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\t\telse if ((style & 0xf) == SCE_4GL_BLOCK && !isalnum(chNext)) {\n\t\t\tlevelNext++;\n\t\t}\n\t\telse if ((style & 0xf) == SCE_4GL_END  && (ch == 'e' || ch == 'f')) {\n\t\t\tlevelNext--;\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint levelUse = levelCurrent;\n\t\t\tif (foldAtElse) {\n\t\t\t\tlevelUse = levelMinCurrent;\n\t\t\t}\n\t\t\tint lev = levelUse | levelNext << 16;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (levelUse < levelNext)\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelCurrent = levelNext;\n\t\t\tlevelMinCurrent = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n}\n\nstatic void Fold4glDoc(unsigned int startPos, int length, int initStyle, WordList *[],\n                       Accessor &styler) {\n\tFoldNoBox4glDoc(startPos, length, initStyle, styler);\n}\n\nstatic const char * const FglWordLists[] = {\n            \"Primary keywords and identifiers\",\n            \"Secondary keywords and identifiers\",\n            \"Documentation comment keywords\",\n            \"Unused\",\n            \"Global classes and typedefs\",\n            0,\n        };\n\nLexerModule lmProgress(SCLEX_PROGRESS, Colourise4glDoc, \"progress\", Fold4glDoc, FglWordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexPython.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexPython.cxx\n ** Lexer for Python.\n **/\n// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n/* kwCDef, kwCTypeName only used for Cython */\nenum kwType { kwOther, kwClass, kwDef, kwImport, kwCDef, kwCTypeName, kwCPDef };\n\nstatic const int indicatorWhitespace = 1;\n\nstatic bool IsPyComment(Accessor &styler, int pos, int len) {\n\treturn len > 0 && styler[pos] == '#';\n}\n\nenum literalsAllowed { litNone=0, litU=1, litB=2};\n\nstatic bool IsPyStringTypeChar(int ch, literalsAllowed allowed) {\n\treturn\n\t\t((allowed & litB) && (ch == 'b' || ch == 'B')) ||\n\t\t((allowed & litU) && (ch == 'u' || ch == 'U'));\n}\n\nstatic bool IsPyStringStart(int ch, int chNext, int chNext2, literalsAllowed allowed) {\n\tif (ch == '\\'' || ch == '\"')\n\t\treturn true;\n\tif (IsPyStringTypeChar(ch, allowed)) {\n\t\tif (chNext == '\"' || chNext == '\\'')\n\t\t\treturn true;\n\t\tif ((chNext == 'r' || chNext == 'R') && (chNext2 == '\"' || chNext2 == '\\''))\n\t\t\treturn true;\n\t}\n\tif ((ch == 'r' || ch == 'R') && (chNext == '\"' || chNext == '\\''))\n\t\treturn true;\n\n\treturn false;\n}\n\n/* Return the state to use for the string starting at i; *nextIndex will be set to the first index following the quote(s) */\nstatic int GetPyStringState(Accessor &styler, int i, unsigned int *nextIndex, literalsAllowed allowed) {\n\tchar ch = styler.SafeGetCharAt(i);\n\tchar chNext = styler.SafeGetCharAt(i + 1);\n\n\t// Advance beyond r, u, or ur prefix (or r, b, or br in Python 3.0), but bail if there are any unexpected chars\n\tif (ch == 'r' || ch == 'R') {\n\t\ti++;\n\t\tch = styler.SafeGetCharAt(i);\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t} else if (IsPyStringTypeChar(ch, allowed)) {\n\t\tif (chNext == 'r' || chNext == 'R')\n\t\t\ti += 2;\n\t\telse\n\t\t\ti += 1;\n\t\tch = styler.SafeGetCharAt(i);\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t}\n\n\tif (ch != '\"' && ch != '\\'') {\n\t\t*nextIndex = i + 1;\n\t\treturn SCE_P_DEFAULT;\n\t}\n\n\tif (ch == chNext && ch == styler.SafeGetCharAt(i + 2)) {\n\t\t*nextIndex = i + 3;\n\n\t\tif (ch == '\"')\n\t\t\treturn SCE_P_TRIPLEDOUBLE;\n\t\telse\n\t\t\treturn SCE_P_TRIPLE;\n\t} else {\n\t\t*nextIndex = i + 1;\n\n\t\tif (ch == '\"')\n\t\t\treturn SCE_P_STRING;\n\t\telse\n\t\t\treturn SCE_P_CHARACTER;\n\t}\n}\n\nstatic inline bool IsAWordChar(int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');\n}\n\nstatic inline bool IsAWordStart(int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_');\n}\n\nstatic void ColourisePyDoc(unsigned int startPos, int length, int initStyle,\n        WordList *keywordlists[], Accessor &styler) {\n\n\tint endPos = startPos + length;\n\n\t// Backtrack to previous line in case need to fix its tab whinging\n\tint lineCurrent = styler.GetLine(startPos);\n\tif (startPos > 0) {\n\t\tif (lineCurrent > 0) {\n\t\t\tlineCurrent--;\n\t\t\t// Look for backslash-continued lines\n\t\t\twhile (lineCurrent > 0) {\n\t\t\t\tint eolPos = styler.LineStart(lineCurrent) - 1;\n\t\t\t\tint eolStyle = styler.StyleAt(eolPos);\n\t\t\t\tif (eolStyle == SCE_P_STRING\n\t\t\t\t    || eolStyle == SCE_P_CHARACTER\n\t\t\t\t    || eolStyle == SCE_P_STRINGEOL) {\n\t\t\t\t\tlineCurrent -= 1;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstartPos = styler.LineStart(lineCurrent);\n\t\t}\n\t\tinitStyle = startPos == 0 ? SCE_P_DEFAULT : styler.StyleAt(startPos - 1);\n\t}\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\n\t// property tab.timmy.whinge.level\n\t//\tFor Python code, checks whether indenting is consistent.\n\t//\tThe default, 0 turns off indentation checking,\n\t//\t1 checks whether each line is potentially inconsistent with the previous line,\n\t//\t2 checks whether any space characters occur before a tab character in the indentation,\n\t//\t3 checks whether any spaces are in the indentation, and\n\t//\t4 checks for any tab characters in the indentation.\n\t//\t1 is a good level to use.\n\tconst int whingeLevel = styler.GetPropertyInt(\"tab.timmy.whinge.level\");\n\n\t// property lexer.python.literals.binary\n\t//\tSet to 0 to not recognise Python 3 binary and octal literals: 0b1011 0o712.\n\tbool base2or8Literals = styler.GetPropertyInt(\"lexer.python.literals.binary\", 1) != 0;\n\n\t// property lexer.python.strings.u\n\t//\tSet to 0 to not recognise Python Unicode literals u\"x\" as used before Python 3.\n\tliteralsAllowed allowedLiterals = (styler.GetPropertyInt(\"lexer.python.strings.u\", 1)) ? litU : litNone;\n\n\t// property lexer.python.strings.b\n\t//\tSet to 0 to not recognise Python 3 bytes literals b\"x\".\n\tif (styler.GetPropertyInt(\"lexer.python.strings.b\", 1))\n\t\tallowedLiterals = static_cast<literalsAllowed>(allowedLiterals | litB);\n\n\t// property lexer.python.strings.over.newline\n\t//      Set to 1 to allow strings to span newline characters.\n\tbool stringsOverNewline = styler.GetPropertyInt(\"lexer.python.strings.over.newline\") != 0;\n\n\t// property lexer.python.keywords2.no.sub.identifiers\n\t//\tWhen enabled, it will not style keywords2 items that are used as a sub-identifier.\n\t//      Example: when set, will not highlight \"foo.open\" when \"open\" is a keywords2 item.\n\tconst bool keywords2NoSubIdentifiers = styler.GetPropertyInt(\"lexer.python.keywords2.no.sub.identifiers\") != 0;\n\n\tinitStyle = initStyle & 31;\n\tif (initStyle == SCE_P_STRINGEOL) {\n\t\tinitStyle = SCE_P_DEFAULT;\n\t}\n\n\tkwType kwLast = kwOther;\n\tint spaceFlags = 0;\n\tstyler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);\n\tbool base_n_number = false;\n\n\tStyleContext sc(startPos, endPos - startPos, initStyle, styler);\n\n\tbool indentGood = true;\n\tint startIndicator = sc.currentPos;\n\tbool inContinuedString = false;\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\tif (sc.atLineStart) {\n\t\t\tstyler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);\n\t\t\tindentGood = true;\n\t\t\tif (whingeLevel == 1) {\n\t\t\t\tindentGood = (spaceFlags & wsInconsistent) == 0;\n\t\t\t} else if (whingeLevel == 2) {\n\t\t\t\tindentGood = (spaceFlags & wsSpaceTab) == 0;\n\t\t\t} else if (whingeLevel == 3) {\n\t\t\t\tindentGood = (spaceFlags & wsSpace) == 0;\n\t\t\t} else if (whingeLevel == 4) {\n\t\t\t\tindentGood = (spaceFlags & wsTab) == 0;\n\t\t\t}\n\t\t\tif (!indentGood) {\n\t\t\t\tstyler.IndicatorFill(startIndicator, sc.currentPos, indicatorWhitespace, 0);\n\t\t\t\tstartIndicator = sc.currentPos;\n\t\t\t}\n\t\t}\n\n\t\tif (sc.atLineEnd) {\n\t\t\tif ((sc.state == SCE_P_DEFAULT) ||\n\t\t\t        (sc.state == SCE_P_TRIPLE) ||\n\t\t\t        (sc.state == SCE_P_TRIPLEDOUBLE)) {\n\t\t\t\t// Perform colourisation of white space and triple quoted strings at end of each line to allow\n\t\t\t\t// tab marking to work inside white space and triple quoted strings\n\t\t\t\tsc.SetState(sc.state);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tif ((sc.state == SCE_P_STRING) || (sc.state == SCE_P_CHARACTER)) {\n\t\t\t\tif (inContinuedString || stringsOverNewline) {\n\t\t\t\t\tinContinuedString = false;\n\t\t\t\t} else {\n\t\t\t\t\tsc.ChangeState(SCE_P_STRINGEOL);\n\t\t\t\t\tsc.ForwardSetState(SCE_P_DEFAULT);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!sc.More())\n\t\t\t\tbreak;\n\t\t}\n\n\t\tbool needEOLCheck = false;\n\n\t\t// Check for a state end\n\t\tif (sc.state == SCE_P_OPERATOR) {\n\t\t\tkwLast = kwOther;\n\t\t\tsc.SetState(SCE_P_DEFAULT);\n\t\t} else if (sc.state == SCE_P_NUMBER) {\n\t\t\tif (!IsAWordChar(sc.ch) &&\n\t\t\t        !(!base_n_number && ((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E')))) {\n\t\t\t\tsc.SetState(SCE_P_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_P_IDENTIFIER) {\n\t\t\tif ((sc.ch == '.') || (!IsAWordChar(sc.ch))) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\tint style = SCE_P_IDENTIFIER;\n\t\t\t\tif ((kwLast == kwImport) && (strcmp(s, \"as\") == 0)) {\n\t\t\t\t\tstyle = SCE_P_WORD;\n\t\t\t\t} else if (keywords.InList(s)) {\n\t\t\t\t\tstyle = SCE_P_WORD;\n\t\t\t\t} else if (kwLast == kwClass) {\n\t\t\t\t\tstyle = SCE_P_CLASSNAME;\n\t\t\t\t} else if (kwLast == kwDef) {\n\t\t\t\t\tstyle = SCE_P_DEFNAME;\n\t\t\t\t} else if (kwLast == kwCDef || kwLast == kwCPDef) {\n\t\t\t\t\tint pos = sc.currentPos;\n\t\t\t\t\tunsigned char ch = styler.SafeGetCharAt(pos, '\\0');\n\t\t\t\t\twhile (ch != '\\0') {\n\t\t\t\t\t\tif (ch == '(') {\n\t\t\t\t\t\t\tstyle = SCE_P_DEFNAME;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t} else if (ch == ':') {\n\t\t\t\t\t\t\tstyle = SCE_P_CLASSNAME;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t} else if (ch == ' ' || ch == '\\t' || ch == '\\n' || ch == '\\r') {\n\t\t\t\t\t\t\tpos++;\n\t\t\t\t\t\t\tch = styler.SafeGetCharAt(pos, '\\0');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\tif (keywords2NoSubIdentifiers) {\n\t\t\t\t\t\t// We don't want to highlight keywords2\n\t\t\t\t\t\t// that are used as a sub-identifier,\n\t\t\t\t\t\t// i.e. not open in \"foo.open\".\n\t\t\t\t\t\tint pos = styler.GetStartSegment() - 1;\n\t\t\t\t\t\tif (pos < 0 || (styler.SafeGetCharAt(pos, '\\0') != '.'))\n\t\t\t\t\t\t\tstyle = SCE_P_WORD2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstyle = SCE_P_WORD2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsc.ChangeState(style);\n\t\t\t\tsc.SetState(SCE_P_DEFAULT);\n\t\t\t\tif (style == SCE_P_WORD) {\n\t\t\t\t\tif (0 == strcmp(s, \"class\"))\n\t\t\t\t\t\tkwLast = kwClass;\n\t\t\t\t\telse if (0 == strcmp(s, \"def\"))\n\t\t\t\t\t\tkwLast = kwDef;\n\t\t\t\t\telse if (0 == strcmp(s, \"import\"))\n\t\t\t\t\t\tkwLast = kwImport;\n\t\t\t\t\telse if (0 == strcmp(s, \"cdef\"))\n\t\t\t\t\t\tkwLast = kwCDef;\n\t\t\t\t\telse if (0 == strcmp(s, \"cpdef\"))\n\t\t\t\t\t\tkwLast = kwCPDef;\n\t\t\t\t\telse if (0 == strcmp(s, \"cimport\"))\n\t\t\t\t\t\tkwLast = kwImport;\n\t\t\t\t\telse if (kwLast != kwCDef && kwLast != kwCPDef)\n\t\t\t\t\t\tkwLast = kwOther;\n\t\t\t\t} else if (kwLast != kwCDef && kwLast != kwCPDef) {\n\t\t\t\t\tkwLast = kwOther;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if ((sc.state == SCE_P_COMMENTLINE) || (sc.state == SCE_P_COMMENTBLOCK)) {\n\t\t\tif (sc.ch == '\\r' || sc.ch == '\\n') {\n\t\t\t\tsc.SetState(SCE_P_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_P_DECORATOR) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_P_DEFAULT);\n\t\t\t}\n\t\t} else if ((sc.state == SCE_P_STRING) || (sc.state == SCE_P_CHARACTER)) {\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\tif ((sc.chNext == '\\r') && (sc.GetRelative(2) == '\\n')) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tif (sc.chNext == '\\n' || sc.chNext == '\\r') {\n\t\t\t\t\tinContinuedString = true;\n\t\t\t\t} else {\n\t\t\t\t\t// Don't roll over the newline.\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if ((sc.state == SCE_P_STRING) && (sc.ch == '\\\"')) {\n\t\t\t\tsc.ForwardSetState(SCE_P_DEFAULT);\n\t\t\t\tneedEOLCheck = true;\n\t\t\t} else if ((sc.state == SCE_P_CHARACTER) && (sc.ch == '\\'')) {\n\t\t\t\tsc.ForwardSetState(SCE_P_DEFAULT);\n\t\t\t\tneedEOLCheck = true;\n\t\t\t}\n\t\t} else if (sc.state == SCE_P_TRIPLE) {\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.Match(\"\\'\\'\\'\")) {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.ForwardSetState(SCE_P_DEFAULT);\n\t\t\t\tneedEOLCheck = true;\n\t\t\t}\n\t\t} else if (sc.state == SCE_P_TRIPLEDOUBLE) {\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.Match(\"\\\"\\\"\\\"\")) {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.ForwardSetState(SCE_P_DEFAULT);\n\t\t\t\tneedEOLCheck = true;\n\t\t\t}\n\t\t}\n\n\t\tif (!indentGood && !IsASpaceOrTab(sc.ch)) {\n\t\t\tstyler.IndicatorFill(startIndicator, sc.currentPos, indicatorWhitespace, 1);\n\t\t\tstartIndicator = sc.currentPos;\n\t\t\tindentGood = true;\n\t\t}\n\n\t\t// One cdef or cpdef line, clear kwLast only at end of line\n\t\tif ((kwLast == kwCDef || kwLast == kwCPDef) && sc.atLineEnd) {\n\t\t\tkwLast = kwOther;\n\t\t}\n\n\t\t// State exit code may have moved on to end of line\n\t\tif (needEOLCheck && sc.atLineEnd) {\n\t\t\tlineCurrent++;\n\t\t\tstyler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);\n\t\t\tif (!sc.More())\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Check for a new state starting character\n\t\tif (sc.state == SCE_P_DEFAULT) {\n\t\t\tif (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tif (sc.ch == '0' && (sc.chNext == 'x' || sc.chNext == 'X')) {\n\t\t\t\t\tbase_n_number = true;\n\t\t\t\t\tsc.SetState(SCE_P_NUMBER);\n\t\t\t\t} else if (sc.ch == '0' &&\n\t\t\t\t\t(sc.chNext == 'o' || sc.chNext == 'O' || sc.chNext == 'b' || sc.chNext == 'B')) {\n\t\t\t\t\tif (base2or8Literals) {\n\t\t\t\t\t\tbase_n_number = true;\n\t\t\t\t\t\tsc.SetState(SCE_P_NUMBER);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.SetState(SCE_P_NUMBER);\n\t\t\t\t\t\tsc.ForwardSetState(SCE_P_IDENTIFIER);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tbase_n_number = false;\n\t\t\t\t\tsc.SetState(SCE_P_NUMBER);\n\t\t\t\t}\n\t\t\t} else if ((IsASCII(sc.ch) && isoperator(static_cast<char>(sc.ch))) || sc.ch == '`') {\n\t\t\t\tsc.SetState(SCE_P_OPERATOR);\n\t\t\t} else if (sc.ch == '#') {\n\t\t\t\tsc.SetState(sc.chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE);\n\t\t\t} else if (sc.ch == '@') {\n\t\t\t\tsc.SetState(SCE_P_DECORATOR);\n\t\t\t} else if (IsPyStringStart(sc.ch, sc.chNext, sc.GetRelative(2), allowedLiterals)) {\n\t\t\t\tunsigned int nextIndex = 0;\n\t\t\t\tsc.SetState(GetPyStringState(styler, sc.currentPos, &nextIndex, allowedLiterals));\n\t\t\t\twhile (nextIndex > (sc.currentPos + 1) && sc.More()) {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (IsAWordStart(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_P_IDENTIFIER);\n\t\t\t}\n\t\t}\n\t}\n\tstyler.IndicatorFill(startIndicator, sc.currentPos, indicatorWhitespace, 0);\n\tsc.Complete();\n}\n\nstatic bool IsCommentLine(int line, Accessor &styler) {\n\tint pos = styler.LineStart(line);\n\tint eol_pos = styler.LineStart(line + 1) - 1;\n\tfor (int i = pos; i < eol_pos; i++) {\n\t\tchar ch = styler[i];\n\t\tif (ch == '#')\n\t\t\treturn true;\n\t\telse if (ch != ' ' && ch != '\\t')\n\t\t\treturn false;\n\t}\n\treturn false;\n}\n\nstatic bool IsQuoteLine(int line, Accessor &styler) {\n\tint style = styler.StyleAt(styler.LineStart(line)) & 31;\n\treturn ((style == SCE_P_TRIPLE) || (style == SCE_P_TRIPLEDOUBLE));\n}\n\n\nstatic void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unused*/,\n                      WordList *[], Accessor &styler) {\n\tconst int maxPos = startPos + length;\n\tconst int maxLines = (maxPos == styler.Length()) ? styler.GetLine(maxPos) : styler.GetLine(maxPos - 1);\t// Requested last line\n\tconst int docLines = styler.GetLine(styler.Length());\t// Available last line\n\n\t// property fold.quotes.python\n\t//\tThis option enables folding multi-line quoted strings when using the Python lexer.\n\tconst bool foldQuotes = styler.GetPropertyInt(\"fold.quotes.python\") != 0;\n\n\tconst bool foldCompact = styler.GetPropertyInt(\"fold.compact\") != 0;\n\n\t// Backtrack to previous non-blank line so we can determine indent level\n\t// for any white space lines (needed esp. within triple quoted strings)\n\t// and so we can fix any preceding fold level (which is why we go back\n\t// at least one line in all cases)\n\tint spaceFlags = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);\n\twhile (lineCurrent > 0) {\n\t\tlineCurrent--;\n\t\tindentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);\n\t\tif (!(indentCurrent & SC_FOLDLEVELWHITEFLAG) &&\n\t\t        (!IsCommentLine(lineCurrent, styler)) &&\n\t\t        (!IsQuoteLine(lineCurrent, styler)))\n\t\t\tbreak;\n\t}\n\tint indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;\n\n\t// Set up initial loop state\n\tstartPos = styler.LineStart(lineCurrent);\n\tint prev_state = SCE_P_DEFAULT & 31;\n\tif (lineCurrent >= 1)\n\t\tprev_state = styler.StyleAt(startPos - 1) & 31;\n\tint prevQuote = foldQuotes && ((prev_state == SCE_P_TRIPLE) || (prev_state == SCE_P_TRIPLEDOUBLE));\n\n\t// Process all characters to end of requested range or end of any triple quote\n\t//that hangs over the end of the range.  Cap processing in all cases\n\t// to end of document (in case of unclosed quote at end).\n\twhile ((lineCurrent <= docLines) && ((lineCurrent <= maxLines) || prevQuote)) {\n\n\t\t// Gather info\n\t\tint lev = indentCurrent;\n\t\tint lineNext = lineCurrent + 1;\n\t\tint indentNext = indentCurrent;\n\t\tint quote = false;\n\t\tif (lineNext <= docLines) {\n\t\t\t// Information about next line is only available if not at end of document\n\t\t\tindentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);\n\t\t\tint lookAtPos = (styler.LineStart(lineNext) == styler.Length()) ? styler.Length() - 1 : styler.LineStart(lineNext);\n\t\t\tint style = styler.StyleAt(lookAtPos) & 31;\n\t\t\tquote = foldQuotes && ((style == SCE_P_TRIPLE) || (style == SCE_P_TRIPLEDOUBLE));\n\t\t}\n\t\tconst int quote_start = (quote && !prevQuote);\n\t\tconst int quote_continue = (quote && prevQuote);\n\t\tif (!quote || !prevQuote)\n\t\t\tindentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;\n\t\tif (quote)\n\t\t\tindentNext = indentCurrentLevel;\n\t\tif (indentNext & SC_FOLDLEVELWHITEFLAG)\n\t\t\tindentNext = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel;\n\n\t\tif (quote_start) {\n\t\t\t// Place fold point at start of triple quoted string\n\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t} else if (quote_continue || prevQuote) {\n\t\t\t// Add level to rest of lines in the string\n\t\t\tlev = lev + 1;\n\t\t}\n\n\t\t// Skip past any blank lines for next indent level info; we skip also\n\t\t// comments (all comments, not just those starting in column 0)\n\t\t// which effectively folds them into surrounding code rather\n\t\t// than screwing up folding.\n\n\t\twhile (!quote &&\n\t\t        (lineNext < docLines) &&\n\t\t        ((indentNext & SC_FOLDLEVELWHITEFLAG) ||\n\t\t         (lineNext <= docLines && IsCommentLine(lineNext, styler)))) {\n\n\t\t\tlineNext++;\n\t\t\tindentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);\n\t\t}\n\n\t\tconst int levelAfterComments = indentNext & SC_FOLDLEVELNUMBERMASK;\n\t\tconst int levelBeforeComments = Maximum(indentCurrentLevel,levelAfterComments);\n\n\t\t// Now set all the indent levels on the lines we skipped\n\t\t// Do this from end to start.  Once we encounter one line\n\t\t// which is indented more than the line after the end of\n\t\t// the comment-block, use the level of the block before\n\n\t\tint skipLine = lineNext;\n\t\tint skipLevel = levelAfterComments;\n\n\t\twhile (--skipLine > lineCurrent) {\n\t\t\tint skipLineIndent = styler.IndentAmount(skipLine, &spaceFlags, NULL);\n\n\t\t\tif (foldCompact) {\n\t\t\t\tif ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > levelAfterComments)\n\t\t\t\t\tskipLevel = levelBeforeComments;\n\n\t\t\t\tint whiteFlag = skipLineIndent & SC_FOLDLEVELWHITEFLAG;\n\n\t\t\t\tstyler.SetLevel(skipLine, skipLevel | whiteFlag);\n\t\t\t} else {\n\t\t\t\tif ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > levelAfterComments &&\n\t\t\t\t\t!(skipLineIndent & SC_FOLDLEVELWHITEFLAG) &&\n\t\t\t\t\t!IsCommentLine(skipLine, styler))\n\t\t\t\t\tskipLevel = levelBeforeComments;\n\n\t\t\t\tstyler.SetLevel(skipLine, skipLevel);\n\t\t\t}\n\t\t}\n\n\t\t// Set fold header on non-quote line\n\t\tif (!quote && !(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {\n\t\t\tif ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t}\n\n\t\t// Keep track of triple quote state of previous line\n\t\tprevQuote = quote;\n\n\t\t// Set fold level for this line and move to next line\n\t\tstyler.SetLevel(lineCurrent, foldCompact ? lev : lev & ~SC_FOLDLEVELWHITEFLAG);\n\t\tindentCurrent = indentNext;\n\t\tlineCurrent = lineNext;\n\t}\n\n\t// NOTE: Cannot set level of last line here because indentCurrent doesn't have\n\t// header flag set; the loop above is crafted to take care of this case!\n\t//styler.SetLevel(lineCurrent, indentCurrent);\n}\n\nstatic const char *const pythonWordListDesc[] = {\n\t\"Keywords\",\n\t\"Highlighted identifiers\",\n\t0\n};\n\nLexerModule lmPython(SCLEX_PYTHON, ColourisePyDoc, \"python\", FoldPyDoc,\n\t\t\t\t\t pythonWordListDesc);\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexR.cpp",
    "content": "// Scintilla source code edit control\n/** @file Lexr.cxx\n ** Lexer for R, S, SPlus Statistics Program (Heavily derived from CPP Lexer).\n **\n **/\n// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');\n}\n\nstatic inline bool IsAWordStart(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_');\n}\n\nstatic inline bool IsAnOperator(const int ch) {\n\tif (IsASCII(ch) && isalnum(ch))\n\t\treturn false;\n\t// '.' left out as it is used to make up numbers\n\tif (ch == '-' || ch == '+' || ch == '!' || ch == '~' ||\n\t        ch == '?' || ch == ':' || ch == '*' || ch == '/' ||\n\t        ch == '^' || ch == '<' || ch == '>' || ch == '=' ||\n\t        ch == '&' || ch == '|' || ch == '$' || ch == '(' ||\n\t        ch == ')' || ch == '}' || ch == '{' || ch == '[' ||\n\t\tch == ']')\n\t\treturn true;\n\treturn false;\n}\n\nstatic void ColouriseRDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                            Accessor &styler) {\n\n\tWordList &keywords   = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\n\n\t// Do not leak onto next line\n\tif (initStyle == SCE_R_INFIXEOL)\n\t\tinitStyle = SCE_R_DEFAULT;\n\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\tif (sc.atLineStart && (sc.state == SCE_R_STRING)) {\n\t\t\t// Prevent SCE_R_STRINGEOL from leaking back to previous line\n\t\t\tsc.SetState(SCE_R_STRING);\n\t\t}\n\n\t\t// Determine if the current state should terminate.\n\t\tif (sc.state == SCE_R_OPERATOR) {\n\t\t\tsc.SetState(SCE_R_DEFAULT);\n\t\t} else if (sc.state == SCE_R_NUMBER) {\n\t\t\tif (!IsADigit(sc.ch) && !(sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_R_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_R_IDENTIFIER) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_R_KWORD);\n\t\t\t\t} else if  (keywords2.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_R_BASEKWORD);\n\t\t\t\t} else if  (keywords3.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_R_OTHERKWORD);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_R_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_R_COMMENT) {\n\t\t\tif (sc.ch == '\\r' || sc.ch == '\\n') {\n\t\t\t\tsc.SetState(SCE_R_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_R_STRING) {\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_R_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_R_INFIX) {\n\t\t\tif (sc.ch == '%') {\n\t\t\t\tsc.ForwardSetState(SCE_R_DEFAULT);\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.ChangeState(SCE_R_INFIXEOL);\n\t\t\t\tsc.ForwardSetState(SCE_R_DEFAULT);\n\t\t\t}\n\t\t}else if (sc.state == SCE_R_STRING2) {\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.ForwardSetState(SCE_R_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_R_DEFAULT) {\n\t\t\tif (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_R_NUMBER);\n\t\t\t} else if (IsAWordStart(sc.ch) ) {\n\t\t\t\tsc.SetState(SCE_R_IDENTIFIER);\n\t\t\t} else if (sc.Match('#')) {\n\t\t\t\t\tsc.SetState(SCE_R_COMMENT);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_R_STRING);\n\t\t\t} else if (sc.ch == '%') {\n\t\t\t\tsc.SetState(SCE_R_INFIX);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_R_STRING2);\n\t\t\t} else if (IsAnOperator(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_R_OPERATOR);\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n}\n\n// Store both the current line's fold level and the next lines in the\n// level store to make it easy to pick up with each increment\n// and to make it possible to fiddle the current level for \"} else {\".\nstatic void FoldRDoc(unsigned int startPos, int length, int, WordList *[],\n                       Accessor &styler) {\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tbool foldAtElse = styler.GetPropertyInt(\"fold.at.else\", 0) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelCurrent = SC_FOLDLEVELBASE;\n\tif (lineCurrent > 0)\n\t\tlevelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n\tint levelMinCurrent = levelCurrent;\n\tint levelNext = levelCurrent;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (style == SCE_R_OPERATOR) {\n\t\t\tif (ch == '{') {\n\t\t\t\t// Measure the minimum before a '{' to allow\n\t\t\t\t// folding on \"} else {\"\n\t\t\t\tif (levelMinCurrent > levelNext) {\n\t\t\t\t\tlevelMinCurrent = levelNext;\n\t\t\t\t}\n\t\t\t\tlevelNext++;\n\t\t\t} else if (ch == '}') {\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint levelUse = levelCurrent;\n\t\t\tif (foldAtElse) {\n\t\t\t\tlevelUse = levelMinCurrent;\n\t\t\t}\n\t\t\tint lev = levelUse | levelNext << 16;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (levelUse < levelNext)\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelCurrent = levelNext;\n\t\t\tlevelMinCurrent = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n}\n\n\nstatic const char * const RWordLists[] = {\n            \"Language Keywords\",\n            \"Base / Default package function\",\n            \"Other Package Functions\",\n            \"Unused\",\n            \"Unused\",\n            0,\n        };\n\n\n\nLexerModule lmR(SCLEX_R, ColouriseRDoc, \"r\", FoldRDoc, RWordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexRebol.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexRebol.cxx\n ** Lexer for REBOL.\n ** Written by Pascal Hurni, inspired from LexLua by Paul Winwood & Marcos E. Wurzius & Philippe Lhoste\n **\n ** History:\n **\t\t2005-04-07\tFirst release.\n **\t\t2005-04-10\tClosing parens and brackets go now in default style\n **\t\t\t\t\tString and comment nesting should be more safe\n **/\n// Copyright 2005 by Pascal Hurni <pascal_hurni@fastmail.fm>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (isalnum(ch) || ch == '?' || ch == '!' || ch == '.' || ch == '\\'' || ch == '+' || ch == '-' || ch == '*' || ch == '&' || ch == '|' || ch == '=' || ch == '_' || ch == '~');\n}\n\nstatic inline bool IsAWordStart(const int ch, const int ch2) {\n\treturn ((ch == '+' || ch == '-' || ch == '.') && !isdigit(ch2)) ||\n\t\t(isalpha(ch) || ch == '?' || ch == '!' || ch == '\\'' || ch == '*' || ch == '&' || ch == '|' || ch == '=' || ch == '_' || ch == '~');\n}\n\nstatic inline bool IsAnOperator(const int ch, const int ch2, const int ch3) {\n\t// One char operators\n\tif (IsASpaceOrTab(ch2)) {\n\t\treturn ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '<' || ch == '>' || ch == '=' || ch == '?';\n\t}\n\n\t// Two char operators\n\tif (IsASpaceOrTab(ch3)) {\n\t\treturn (ch == '*' && ch2 == '*') ||\n\t\t\t   (ch == '/' && ch2 == '/') ||\n\t\t\t   (ch == '<' && (ch2 == '=' || ch2 == '>')) ||\n\t\t\t   (ch == '>' && ch2 == '=') ||\n\t\t\t   (ch == '=' && (ch2 == '=' || ch2 == '?')) ||\n\t\t\t   (ch == '?' && ch2 == '?');\n\t}\n\n\treturn false;\n}\n\nstatic inline bool IsBinaryStart(const int ch, const int ch2, const int ch3, const int ch4) {\n\treturn (ch == '#' && ch2 == '{') ||\n\t\t   (IsADigit(ch) && ch2 == '#' && ch3 == '{' ) ||\n\t\t   (IsADigit(ch) && IsADigit(ch2) && ch3 == '#' && ch4 == '{' );\n}\n\n\nstatic void ColouriseRebolDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) {\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\tWordList &keywords4 = *keywordlists[3];\n\tWordList &keywords5 = *keywordlists[4];\n\tWordList &keywords6 = *keywordlists[5];\n\tWordList &keywords7 = *keywordlists[6];\n\tWordList &keywords8 = *keywordlists[7];\n\n\tint currentLine = styler.GetLine(startPos);\n\t// Initialize the braced string {.. { ... } ..} nesting level, if we are inside such a string.\n\tint stringLevel = 0;\n\tif (initStyle == SCE_REBOL_BRACEDSTRING || initStyle == SCE_REBOL_COMMENTBLOCK) {\n\t\tstringLevel = styler.GetLineState(currentLine - 1);\n\t}\n\n\tbool blockComment = initStyle == SCE_REBOL_COMMENTBLOCK;\n\tint dotCount = 0;\n\n\t// Do not leak onto next line\n\tif (initStyle == SCE_REBOL_COMMENTLINE) {\n\t\tinitStyle = SCE_REBOL_DEFAULT;\n\t}\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\tif (startPos == 0) {\n\t\tsc.SetState(SCE_REBOL_PREFACE);\n\t}\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\t//--- What to do at line end ?\n\t\tif (sc.atLineEnd) {\n\t\t\t// Can be either inside a {} string or simply at eol\n\t\t\tif (sc.state != SCE_REBOL_BRACEDSTRING && sc.state != SCE_REBOL_COMMENTBLOCK &&\n\t\t\t\tsc.state != SCE_REBOL_BINARY && sc.state != SCE_REBOL_PREFACE)\n\t\t\t\tsc.SetState(SCE_REBOL_DEFAULT);\n\n\t\t\t// Update the line state, so it can be seen by next line\n\t\t\tcurrentLine = styler.GetLine(sc.currentPos);\n\t\t\tswitch (sc.state) {\n\t\t\tcase SCE_REBOL_BRACEDSTRING:\n\t\t\tcase SCE_REBOL_COMMENTBLOCK:\n\t\t\t\t// Inside a braced string, we set the line state\n\t\t\t\tstyler.SetLineState(currentLine, stringLevel);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Reset the line state\n\t\t\t\tstyler.SetLineState(currentLine, 0);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// continue with next char\n\t\t\tcontinue;\n\t\t}\n\n\t\t//--- What to do on white-space ?\n\t\tif (IsASpaceOrTab(sc.ch))\n\t\t{\n\t\t\t// Return to default if any of these states\n\t\t\tif (sc.state == SCE_REBOL_OPERATOR || sc.state == SCE_REBOL_CHARACTER ||\n\t\t\t\tsc.state == SCE_REBOL_NUMBER || sc.state == SCE_REBOL_PAIR ||\n\t\t\t\tsc.state == SCE_REBOL_TUPLE || sc.state == SCE_REBOL_FILE ||\n\t\t\t\tsc.state == SCE_REBOL_DATE || sc.state == SCE_REBOL_TIME ||\n\t\t\t\tsc.state == SCE_REBOL_MONEY || sc.state == SCE_REBOL_ISSUE ||\n\t\t\t\tsc.state == SCE_REBOL_URL || sc.state == SCE_REBOL_EMAIL) {\n\t\t\t\tsc.SetState(SCE_REBOL_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t//--- Specialize state ?\n\t\t// URL, Email look like identifier\n\t\tif (sc.state == SCE_REBOL_IDENTIFIER)\n\t\t{\n\t\t\tif (sc.ch == ':' && !IsASpace(sc.chNext)) {\n\t\t\t\tsc.ChangeState(SCE_REBOL_URL);\n\t\t\t} else if (sc.ch == '@') {\n\t\t\t\tsc.ChangeState(SCE_REBOL_EMAIL);\n\t\t\t} else if (sc.ch == '$') {\n\t\t\t\tsc.ChangeState(SCE_REBOL_MONEY);\n\t\t\t}\n\t\t}\n\t\t// Words look like identifiers\n\t\tif (sc.state == SCE_REBOL_IDENTIFIER || (sc.state >= SCE_REBOL_WORD && sc.state <= SCE_REBOL_WORD8)) {\n\t\t\t// Keywords ?\n\t\t\tif (!IsAWordChar(sc.ch) || sc.Match('/')) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\tblockComment = strcmp(s, \"comment\") == 0;\n\t\t\t\tif (keywords8.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_REBOL_WORD8);\n\t\t\t\t} else if (keywords7.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_REBOL_WORD7);\n\t\t\t\t} else if (keywords6.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_REBOL_WORD6);\n\t\t\t\t} else if (keywords5.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_REBOL_WORD5);\n\t\t\t\t} else if (keywords4.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_REBOL_WORD4);\n\t\t\t\t} else if (keywords3.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_REBOL_WORD3);\n\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_REBOL_WORD2);\n\t\t\t\t} else if (keywords.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_REBOL_WORD);\n\t\t\t\t}\n\t\t\t\t// Keep same style if there are refinements\n\t\t\t\tif (!sc.Match('/')) {\n\t\t\t\t\tsc.SetState(SCE_REBOL_DEFAULT);\n\t\t\t\t}\n\t\t\t}\n\t\t// special numbers\n\t\t} else if (sc.state == SCE_REBOL_NUMBER) {\n\t\t\tswitch (sc.ch) {\n\t\t\tcase 'x':\tsc.ChangeState(SCE_REBOL_PAIR);\n\t\t\t\t\t\tbreak;\n\t\t\tcase ':':\tsc.ChangeState(SCE_REBOL_TIME);\n\t\t\t\t\t\tbreak;\n\t\t\tcase '-':\n\t\t\tcase '/':\tsc.ChangeState(SCE_REBOL_DATE);\n\t\t\t\t\t\tbreak;\n\t\t\tcase '.':\tif (++dotCount >= 2) sc.ChangeState(SCE_REBOL_TUPLE);\n\t\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//--- Determine if the current state should terminate\n\t\tif (sc.state == SCE_REBOL_QUOTEDSTRING || sc.state == SCE_REBOL_CHARACTER) {\n\t\t\tif (sc.ch == '^' && sc.chNext == '\\\"') {\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_REBOL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_REBOL_BRACEDSTRING || sc.state == SCE_REBOL_COMMENTBLOCK) {\n\t\t\tif (sc.ch == '}') {\n\t\t\t\tif (--stringLevel == 0) {\n\t\t\t\t\tsc.ForwardSetState(SCE_REBOL_DEFAULT);\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '{') {\n\t\t\t\tstringLevel++;\n\t\t\t}\n\t\t} else if (sc.state == SCE_REBOL_BINARY) {\n\t\t\tif (sc.ch == '}') {\n\t\t\t\tsc.ForwardSetState(SCE_REBOL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_REBOL_TAG) {\n\t\t\tif (sc.ch == '>') {\n\t\t\t\tsc.ForwardSetState(SCE_REBOL_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_REBOL_PREFACE) {\n\t\t\tif (sc.MatchIgnoreCase(\"rebol\"))\n\t\t\t{\n\t\t\t\tint i;\n\t\t\t\tfor (i=5; IsASpaceOrTab(styler.SafeGetCharAt(sc.currentPos+i, 0)); i++);\n\t\t\t\tif (sc.GetRelative(i) == '[')\n\t\t\t\t\tsc.SetState(SCE_REBOL_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t//--- Parens and bracket changes to default style when the current is a number\n\t\tif (sc.state == SCE_REBOL_NUMBER || sc.state == SCE_REBOL_PAIR || sc.state == SCE_REBOL_TUPLE ||\n\t\t\tsc.state == SCE_REBOL_MONEY || sc.state == SCE_REBOL_ISSUE || sc.state == SCE_REBOL_EMAIL ||\n\t\t\tsc.state == SCE_REBOL_URL || sc.state == SCE_REBOL_DATE || sc.state == SCE_REBOL_TIME) {\n\t\t\tif (sc.ch == '(' || sc.ch == '[' || sc.ch == ')' || sc.ch == ']') {\n\t\t\t\tsc.SetState(SCE_REBOL_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t//--- Determine if a new state should be entered.\n\t\tif (sc.state == SCE_REBOL_DEFAULT) {\n\t\t\tif (IsAnOperator(sc.ch, sc.chNext, sc.GetRelative(2))) {\n\t\t\t\tsc.SetState(SCE_REBOL_OPERATOR);\n\t\t\t} else if (IsBinaryStart(sc.ch, sc.chNext, sc.GetRelative(2), sc.GetRelative(3))) {\n\t\t\t\tsc.SetState(SCE_REBOL_BINARY);\n\t\t\t} else if (IsAWordStart(sc.ch, sc.chNext)) {\n\t\t\t\tsc.SetState(SCE_REBOL_IDENTIFIER);\n\t\t\t} else if (IsADigit(sc.ch) || sc.ch == '+' || sc.ch == '-' || /*Decimal*/ sc.ch == '.' || sc.ch == ',') {\n\t\t\t\tdotCount = 0;\n\t\t\t\tsc.SetState(SCE_REBOL_NUMBER);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_REBOL_QUOTEDSTRING);\n\t\t\t} else if (sc.ch == '{') {\n\t\t\t\tsc.SetState(blockComment ? SCE_REBOL_COMMENTBLOCK : SCE_REBOL_BRACEDSTRING);\n\t\t\t\t++stringLevel;\n\t\t\t} else if (sc.ch == ';') {\n\t\t\t\tsc.SetState(SCE_REBOL_COMMENTLINE);\n\t\t\t} else if (sc.ch == '$') {\n\t\t\t\tsc.SetState(SCE_REBOL_MONEY);\n\t\t\t} else if (sc.ch == '%') {\n\t\t\t\tsc.SetState(SCE_REBOL_FILE);\n\t\t\t} else if (sc.ch == '<') {\n\t\t\t\tsc.SetState(SCE_REBOL_TAG);\n\t\t\t} else if (sc.ch == '#' && sc.chNext == '\"') {\n\t\t\t\tsc.SetState(SCE_REBOL_CHARACTER);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.ch == '#' && sc.chNext != '\"' && sc.chNext != '{' ) {\n\t\t\t\tsc.SetState(SCE_REBOL_ISSUE);\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n}\n\n\nstatic void FoldRebolDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[],\n                            Accessor &styler) {\n\tunsigned int lengthDoc = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tfor (unsigned int i = startPos; i < lengthDoc; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (style == SCE_REBOL_DEFAULT) {\n\t\t\tif (ch == '[') {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (ch == ']') {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nstatic const char * const rebolWordListDesc[] = {\n\t\"Keywords\",\n\t0\n};\n\nLexerModule lmREBOL(SCLEX_REBOL, ColouriseRebolDoc, \"rebol\", FoldRebolDoc, rebolWordListDesc);\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexRuby.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexRuby.cxx\n ** Lexer for Ruby.\n **/\n// Copyright 2001- by Clemens Wyss <wys@helbling.ch>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n//XXX Identical to Perl, put in common area\nstatic inline bool isEOLChar(char ch) {\n\treturn (ch == '\\r') || (ch == '\\n');\n}\n\n#define isSafeASCII(ch) ((unsigned int)(ch) <= 127)\n// This one's redundant, but makes for more readable code\n#define isHighBitChar(ch) ((unsigned int)(ch) > 127)\n\nstatic inline bool isSafeAlpha(char ch) {\n    return (isSafeASCII(ch) && isalpha(ch)) || ch == '_';\n}\n\nstatic inline bool isSafeAlnum(char ch) {\n    return (isSafeASCII(ch) && isalnum(ch)) || ch == '_';\n}\n\nstatic inline bool isSafeAlnumOrHigh(char ch) {\n    return isHighBitChar(ch) || isalnum(ch) || ch == '_';\n}\n\nstatic inline bool isSafeDigit(char ch) {\n    return isSafeASCII(ch) && isdigit(ch);\n}\n\nstatic inline bool isSafeWordcharOrHigh(char ch) {\n    // Error: scintilla's KeyWords.h includes '.' as a word-char\n    // we want to separate things that can take methods from the\n    // methods.\n    return isHighBitChar(ch) || isalnum(ch) || ch == '_';\n}\n\nstatic bool inline iswhitespace(char ch) {\n\treturn ch == ' ' || ch == '\\t';\n}\n\n#define MAX_KEYWORD_LENGTH 200\n\n#define STYLE_MASK 63\n#define actual_style(style) (style & STYLE_MASK)\n\nstatic bool followsDot(unsigned int pos, Accessor &styler) {\n    styler.Flush();\n    for (; pos >= 1; --pos) {\n        int style = actual_style(styler.StyleAt(pos));\n        char ch;\n        switch (style) {\n            case SCE_RB_DEFAULT:\n                ch = styler[pos];\n                if (ch == ' ' || ch == '\\t') {\n                    //continue\n                } else {\n                    return false;\n                }\n                break;\n\n            case SCE_RB_OPERATOR:\n                return styler[pos] == '.';\n\n            default:\n                return false;\n        }\n    }\n    return false;\n}\n\n// Forward declarations\nstatic bool keywordIsAmbiguous(const char *prevWord);\nstatic bool keywordDoStartsLoop(int pos,\n                                Accessor &styler);\nstatic bool keywordIsModifier(const char *word,\n                              int pos,\n                              Accessor &styler);\n\nstatic int ClassifyWordRb(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) {\n\tchar s[MAX_KEYWORD_LENGTH];\n    unsigned int i, j;\n\tunsigned int lim = end - start + 1; // num chars to copy\n\tif (lim >= MAX_KEYWORD_LENGTH) {\n\t\tlim = MAX_KEYWORD_LENGTH - 1;\n\t}\n\tfor (i = start, j = 0; j < lim; i++, j++) {\n\t\ts[j] = styler[i];\n\t}\n    s[j] = '\\0';\n\tint chAttr;\n\tif (0 == strcmp(prevWord, \"class\"))\n\t\tchAttr = SCE_RB_CLASSNAME;\n\telse if (0 == strcmp(prevWord, \"module\"))\n\t\tchAttr = SCE_RB_MODULE_NAME;\n\telse if (0 == strcmp(prevWord, \"def\"))\n\t\tchAttr = SCE_RB_DEFNAME;\n    else if (keywords.InList(s) && ((start == 0) || !followsDot(start - 1, styler))) {\n        if (keywordIsAmbiguous(s)\n            && keywordIsModifier(s, start, styler)) {\n\n            // Demoted keywords are colored as keywords,\n            // but do not affect changes in indentation.\n            //\n            // Consider the word 'if':\n            // 1. <<if test ...>> : normal\n            // 2. <<stmt if test>> : demoted\n            // 3. <<lhs = if ...>> : normal: start a new indent level\n            // 4. <<obj.if = 10>> : color as identifer, since it follows '.'\n\n            chAttr = SCE_RB_WORD_DEMOTED;\n        } else {\n            chAttr = SCE_RB_WORD;\n        }\n\t} else\n        chAttr = SCE_RB_IDENTIFIER;\n\tstyler.ColourTo(end, chAttr);\n\tif (chAttr == SCE_RB_WORD) {\n\t\tstrcpy(prevWord, s);\n\t} else {\n\t\tprevWord[0] = 0;\n\t}\n    return chAttr;\n}\n\n\n//XXX Identical to Perl, put in common area\nstatic bool isMatch(Accessor &styler, int lengthDoc, int pos, const char *val) {\n\tif ((pos + static_cast<int>(strlen(val))) >= lengthDoc) {\n\t\treturn false;\n\t}\n\twhile (*val) {\n\t\tif (*val != styler[pos++]) {\n\t\t\treturn false;\n\t\t}\n\t\tval++;\n\t}\n\treturn true;\n}\n\n// Do Ruby better -- find the end of the line, work back,\n// and then check for leading white space\n\n// Precondition: the here-doc target can be indented\nstatic bool lookingAtHereDocDelim(Accessor\t   &styler,\n                                  int \t\t\tpos,\n                                  int \t\t\tlengthDoc,\n                                  const char   *HereDocDelim)\n{\n    if (!isMatch(styler, lengthDoc, pos, HereDocDelim)) {\n        return false;\n    }\n    while (--pos > 0) {\n        char ch = styler[pos];\n        if (isEOLChar(ch)) {\n            return true;\n        } else if (ch != ' ' && ch != '\\t') {\n            return false;\n        }\n    }\n    return false;\n}\n\n//XXX Identical to Perl, put in common area\nstatic char opposite(char ch) {\n\tif (ch == '(')\n\t\treturn ')';\n\tif (ch == '[')\n\t\treturn ']';\n\tif (ch == '{')\n\t\treturn '}';\n\tif (ch == '<')\n\t\treturn '>';\n\treturn ch;\n}\n\n// Null transitions when we see we've reached the end\n// and need to relex the curr char.\n\nstatic void redo_char(int &i, char &ch, char &chNext, char &chNext2,\n                      int &state) {\n    i--;\n    chNext2 = chNext;\n    chNext = ch;\n    state = SCE_RB_DEFAULT;\n}\n\nstatic void advance_char(int &i, char &ch, char &chNext, char &chNext2) {\n    i++;\n    ch = chNext;\n    chNext = chNext2;\n}\n\n// precondition: startPos points to one after the EOL char\nstatic bool currLineContainsHereDelims(int& startPos,\n                                       Accessor &styler) {\n    if (startPos <= 1)\n        return false;\n\n    int pos;\n    for (pos = startPos - 1; pos > 0; pos--) {\n        char ch = styler.SafeGetCharAt(pos);\n        if (isEOLChar(ch)) {\n            // Leave the pointers where they are -- there are no\n            // here doc delims on the current line, even if\n            // the EOL isn't default style\n\n            return false;\n        } else {\n            styler.Flush();\n            if (actual_style(styler.StyleAt(pos)) == SCE_RB_HERE_DELIM) {\n                break;\n            }\n        }\n    }\n    if (pos == 0) {\n        return false;\n    }\n    // Update the pointers so we don't have to re-analyze the string\n    startPos = pos;\n    return true;\n}\n\n// This class is used by the enter and exit methods, so it needs\n// to be hoisted out of the function.\n\nclass QuoteCls {\n    public:\n    int  Count;\n    char Up;\n    char Down;\n    QuoteCls() {\n        New();\n    }\n    void New() {\n        Count = 0;\n        Up    = '\\0';\n        Down  = '\\0';\n    }\n    void Open(char u) {\n        Count++;\n        Up    = u;\n        Down  = opposite(Up);\n    }\n    QuoteCls(const QuoteCls& q) {\n        // copy constructor -- use this for copying in\n        Count = q.Count;\n        Up    = q.Up;\n        Down  = q.Down;\n    }\n    QuoteCls& operator=(const QuoteCls& q) { // assignment constructor\n        if (this != &q) {\n            Count = q.Count;\n            Up    = q.Up;\n            Down  = q.Down;\n        }\n\t\treturn *this;\n    }\n\n};\n\n\nstatic void enterInnerExpression(int  *p_inner_string_types,\n                                 int  *p_inner_expn_brace_counts,\n                                 QuoteCls *p_inner_quotes,\n                                 int&  inner_string_count,\n                                 int&  state,\n                                 int&  brace_counts,\n                                 QuoteCls curr_quote\n                                 ) {\n    p_inner_string_types[inner_string_count] = state;\n    state = SCE_RB_DEFAULT;\n    p_inner_expn_brace_counts[inner_string_count] = brace_counts;\n    brace_counts = 0;\n    p_inner_quotes[inner_string_count] = curr_quote;\n    ++inner_string_count;\n}\n\nstatic void exitInnerExpression(int *p_inner_string_types,\n                                 int *p_inner_expn_brace_counts,\n                                 QuoteCls *p_inner_quotes,\n                                 int& inner_string_count,\n                                 int& state,\n                                 int&  brace_counts,\n                                 QuoteCls& curr_quote\n                                ) {\n    --inner_string_count;\n    state = p_inner_string_types[inner_string_count];\n    brace_counts = p_inner_expn_brace_counts[inner_string_count];\n    curr_quote = p_inner_quotes[inner_string_count];\n}\n\nstatic bool isEmptyLine(int pos,\n                        Accessor &styler) {\n\tint spaceFlags = 0;\n\tint lineCurrent = styler.GetLine(pos);\n\tint indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);\n    return (indentCurrent & SC_FOLDLEVELWHITEFLAG) != 0;\n}\n\nstatic bool RE_CanFollowKeyword(const char *keyword) {\n    if (!strcmp(keyword, \"and\")\n        || !strcmp(keyword, \"begin\")\n        || !strcmp(keyword, \"break\")\n        || !strcmp(keyword, \"case\")\n        || !strcmp(keyword, \"do\")\n        || !strcmp(keyword, \"else\")\n        || !strcmp(keyword, \"elsif\")\n        || !strcmp(keyword, \"if\")\n        || !strcmp(keyword, \"next\")\n        || !strcmp(keyword, \"return\")\n        || !strcmp(keyword, \"when\")\n        || !strcmp(keyword, \"unless\")\n        || !strcmp(keyword, \"until\")\n        || !strcmp(keyword, \"not\")\n        || !strcmp(keyword, \"or\")) {\n        return true;\n    }\n    return false;\n}\n\n// Look at chars up to but not including endPos\n// Don't look at styles in case we're looking forward\n\nstatic int skipWhitespace(int startPos,\n                           int endPos,\n                           Accessor &styler) {\n    for (int i = startPos; i < endPos; i++) {\n        if (!iswhitespace(styler[i])) {\n            return i;\n        }\n    }\n    return endPos;\n}\n\n// This routine looks for false positives like\n// undef foo, <<\n// There aren't too many.\n//\n// iPrev points to the start of <<\n\nstatic bool sureThisIsHeredoc(int iPrev,\n                              Accessor &styler,\n                              char *prevWord) {\n\n    // Not so fast, since Ruby's so dynamic.  Check the context\n    // to make sure we're OK.\n    int prevStyle;\n    int lineStart = styler.GetLine(iPrev);\n    int lineStartPosn = styler.LineStart(lineStart);\n    styler.Flush();\n\n    // Find the first word after some whitespace\n    int firstWordPosn = skipWhitespace(lineStartPosn, iPrev, styler);\n    if (firstWordPosn >= iPrev) {\n        // Have something like {^     <<}\n\t\t//XXX Look at the first previous non-comment non-white line\n\t\t// to establish the context.  Not too likely though.\n        return true;\n    } else {\n        switch (prevStyle = styler.StyleAt(firstWordPosn)) {\n        case SCE_RB_WORD:\n        case SCE_RB_WORD_DEMOTED:\n        case SCE_RB_IDENTIFIER:\n            break;\n        default:\n            return true;\n        }\n    }\n    int firstWordEndPosn = firstWordPosn;\n    char *dst = prevWord;\n    for (;;) {\n        if (firstWordEndPosn >= iPrev ||\n            styler.StyleAt(firstWordEndPosn) != prevStyle) {\n            *dst = 0;\n            break;\n        }\n        *dst++ = styler[firstWordEndPosn];\n        firstWordEndPosn += 1;\n    }\n    //XXX Write a style-aware thing to regex scintilla buffer objects\n    if (!strcmp(prevWord, \"undef\")\n        || !strcmp(prevWord, \"def\")\n        || !strcmp(prevWord, \"alias\")) {\n        // These keywords are what we were looking for\n        return false;\n    }\n    return true;\n}\n\n// Routine that saves us from allocating a buffer for the here-doc target\n// targetEndPos points one past the end of the current target\nstatic bool haveTargetMatch(int currPos,\n                            int lengthDoc,\n                            int targetStartPos,\n                            int targetEndPos,\n                            Accessor &styler) {\n    if (lengthDoc - currPos < targetEndPos - targetStartPos) {\n        return false;\n    }\n    int i, j;\n    for (i = targetStartPos, j = currPos;\n         i < targetEndPos && j < lengthDoc;\n         i++, j++) {\n        if (styler[i] != styler[j]) {\n            return false;\n        }\n    }\n    return true;\n}\n\n// We need a check because the form\n// [identifier] <<[target]\n// is ambiguous.  The Ruby lexer/parser resolves it by\n// looking to see if [identifier] names a variable or a\n// function.  If it's the first, it's the start of a here-doc.\n// If it's a var, it's an operator.  This lexer doesn't\n// maintain a symbol table, so it looks ahead to see what's\n// going on, in cases where we have\n// ^[white-space]*[identifier([.|::]identifier)*][white-space]*<<[target]\n//\n// If there's no occurrence of [target] on a line, assume we don't.\n\n// return true == yes, we have no heredocs\n\nstatic bool sureThisIsNotHeredoc(int lt2StartPos,\n                                 Accessor &styler) {\n    int prevStyle;\n     // Use full document, not just part we're styling\n    int lengthDoc = styler.Length();\n    int lineStart = styler.GetLine(lt2StartPos);\n    int lineStartPosn = styler.LineStart(lineStart);\n    styler.Flush();\n    const bool definitely_not_a_here_doc = true;\n    const bool looks_like_a_here_doc = false;\n\n    // Find the first word after some whitespace\n    int firstWordPosn = skipWhitespace(lineStartPosn, lt2StartPos, styler);\n    if (firstWordPosn >= lt2StartPos) {\n        return definitely_not_a_here_doc;\n    }\n    prevStyle = styler.StyleAt(firstWordPosn);\n    // If we have '<<' following a keyword, it's not a heredoc\n    if (prevStyle != SCE_RB_IDENTIFIER\n        && prevStyle != SCE_RB_INSTANCE_VAR\n        && prevStyle != SCE_RB_CLASS_VAR) {\n        return definitely_not_a_here_doc;\n    }\n    int newStyle = prevStyle;\n    // Some compilers incorrectly warn about uninit newStyle\n    for (firstWordPosn += 1; firstWordPosn <= lt2StartPos; firstWordPosn += 1) {\n        // Inner loop looks at the name\n        for (; firstWordPosn <= lt2StartPos; firstWordPosn += 1) {\n            newStyle = styler.StyleAt(firstWordPosn);\n            if (newStyle != prevStyle) {\n                break;\n            }\n        }\n        // Do we have '::' or '.'?\n        if (firstWordPosn < lt2StartPos && newStyle == SCE_RB_OPERATOR) {\n            char ch = styler[firstWordPosn];\n            if (ch == '.') {\n                // yes\n            } else if (ch == ':') {\n                if (styler.StyleAt(++firstWordPosn) != SCE_RB_OPERATOR) {\n                    return definitely_not_a_here_doc;\n                } else if (styler[firstWordPosn] != ':') {\n                    return definitely_not_a_here_doc;\n                }\n            } else {\n                break;\n            }\n        } else {\n            break;\n        }\n        // on second and next passes, only identifiers may appear since\n        // class and instance variable are private\n        prevStyle = SCE_RB_IDENTIFIER;\n    }\n    // Skip next batch of white-space\n    firstWordPosn = skipWhitespace(firstWordPosn, lt2StartPos, styler);\n    if (firstWordPosn != lt2StartPos) {\n        // Have [[^ws[identifier]ws[*something_else*]ws<<\n        return definitely_not_a_here_doc;\n    }\n    // OK, now 'j' will point to the current spot moving ahead\n\tint j = firstWordPosn + 1;\n    if (styler.StyleAt(j) != SCE_RB_OPERATOR || styler[j] != '<') {\n        // This shouldn't happen\n        return definitely_not_a_here_doc;\n    }\n    int nextLineStartPosn = styler.LineStart(lineStart + 1);\n    if (nextLineStartPosn >= lengthDoc) {\n        return definitely_not_a_here_doc;\n    }\n    j = skipWhitespace(j + 1, nextLineStartPosn, styler);\n    if (j >= lengthDoc) {\n        return definitely_not_a_here_doc;\n    }\n    bool allow_indent;\n    int target_start, target_end;\n    // From this point on no more styling, since we're looking ahead\n    if (styler[j] == '-') {\n        allow_indent = true;\n        j++;\n    } else {\n        allow_indent = false;\n    }\n\n    // Allow for quoted targets.\n    char target_quote = 0;\n    switch (styler[j]) {\n    case '\\'':\n    case '\"':\n    case '`':\n        target_quote = styler[j];\n        j += 1;\n    }\n\n    if (isSafeAlnum(styler[j])) {\n        // Init target_end because some compilers think it won't\n        // be initialized by the time it's used\n        target_start = target_end = j;\n        j++;\n    } else {\n        return definitely_not_a_here_doc;\n    }\n    for (; j < lengthDoc; j++) {\n        if (!isSafeAlnum(styler[j])) {\n            if (target_quote && styler[j] != target_quote) {\n                // unquoted end\n                return definitely_not_a_here_doc;\n            }\n\n            // And for now make sure that it's a newline\n            // don't handle arbitrary expressions yet\n\n            target_end = j;\n\t\t\tif (target_quote) {\n\t\t\t\t// Now we can move to the character after the string delimiter.\n\t\t\t\tj += 1;\n\t\t\t}\n            j = skipWhitespace(j, lengthDoc, styler);\n            if (j >= lengthDoc) {\n                return definitely_not_a_here_doc;\n            } else {\n                char ch = styler[j];\n                if (ch == '#' || isEOLChar(ch)) {\n                    // This is OK, so break and continue;\n                    break;\n                } else {\n                    return definitely_not_a_here_doc;\n                }\n            }\n        }\n    }\n\n    // Just look at the start of each line\n    int last_line = styler.GetLine(lengthDoc - 1);\n    // But don't go too far\n    if (last_line > lineStart + 50) {\n        last_line = lineStart + 50;\n    }\n    for (int line_num = lineStart + 1; line_num <= last_line; line_num++) {\n        if (allow_indent) {\n            j = skipWhitespace(styler.LineStart(line_num), lengthDoc, styler);\n        } else {\n            j = styler.LineStart(line_num);\n        }\n        // target_end is one past the end\n        if (haveTargetMatch(j, lengthDoc, target_start, target_end, styler)) {\n            // We got it\n            return looks_like_a_here_doc;\n        }\n    }\n    return definitely_not_a_here_doc;\n}\n\n//todo: if we aren't looking at a stdio character,\n// move to the start of the first line that is not in a\n// multi-line construct\n\nstatic void synchronizeDocStart(unsigned int& startPos,\n                                int &length,\n                                int &initStyle,\n                                Accessor &styler,\n                                bool skipWhiteSpace=false) {\n\n    styler.Flush();\n    int style = actual_style(styler.StyleAt(startPos));\n    switch (style) {\n        case SCE_RB_STDIN:\n        case SCE_RB_STDOUT:\n        case SCE_RB_STDERR:\n            // Don't do anything else with these.\n            return;\n    }\n\n    int pos = startPos;\n    // Quick way to characterize each line\n    int lineStart;\n    for (lineStart = styler.GetLine(pos); lineStart > 0; lineStart--) {\n        // Now look at the style before the previous line's EOL\n        pos = styler.LineStart(lineStart) - 1;\n        if (pos <= 10) {\n            lineStart = 0;\n            break;\n        }\n        char ch = styler.SafeGetCharAt(pos);\n        char chPrev = styler.SafeGetCharAt(pos - 1);\n        if (ch == '\\n' && chPrev == '\\r') {\n            pos--;\n        }\n        if (styler.SafeGetCharAt(pos - 1) == '\\\\') {\n            // Continuation line -- keep going\n        } else if (actual_style(styler.StyleAt(pos)) != SCE_RB_DEFAULT) {\n            // Part of multi-line construct -- keep going\n        } else if (currLineContainsHereDelims(pos, styler)) {\n            // Keep going, with pos and length now pointing\n            // at the end of the here-doc delimiter\n        } else if (skipWhiteSpace && isEmptyLine(pos, styler)) {\n            // Keep going\n        } else {\n            break;\n        }\n    }\n    pos = styler.LineStart(lineStart);\n    length += (startPos - pos);\n    startPos = pos;\n    initStyle = SCE_RB_DEFAULT;\n}\n\nstatic void ColouriseRbDoc(unsigned int startPos, int length, int initStyle,\n\t\t\t\t\t\t   WordList *keywordlists[], Accessor &styler) {\n\n\t// Lexer for Ruby often has to backtrack to start of current style to determine\n\t// which characters are being used as quotes, how deeply nested is the\n\t// start position and what the termination string is for here documents\n\n\tWordList &keywords = *keywordlists[0];\n\n\tclass HereDocCls {\n\tpublic:\n\t\tint State;\n        // States\n        // 0: '<<' encountered\n\t\t// 1: collect the delimiter\n        // 1b: text between the end of the delimiter and the EOL\n\t\t// 2: here doc text (lines after the delimiter)\n\t\tchar Quote;\t\t// the char after '<<'\n\t\tbool Quoted;\t\t// true if Quote in ('\\'','\"','`')\n\t\tint DelimiterLength;\t// strlen(Delimiter)\n\t\tchar Delimiter[256];\t// the Delimiter, limit of 256: from Perl\n        bool CanBeIndented;\n\t\tHereDocCls() {\n\t\t\tState = 0;\n\t\t\tDelimiterLength = 0;\n\t\t\tDelimiter[0] = '\\0';\n            CanBeIndented = false;\n\t\t}\n\t};\n\tHereDocCls HereDoc;\n\n\tQuoteCls Quote;\n\n    int numDots = 0;  // For numbers --\n                      // Don't start lexing in the middle of a num\n\n    synchronizeDocStart(startPos, length, initStyle, styler, // ref args\n                        false);\n\n\tbool preferRE = true;\n    int state = initStyle;\n\tint lengthDoc = startPos + length;\n\n\tchar prevWord[MAX_KEYWORD_LENGTH + 1]; // 1 byte for zero\n\tprevWord[0] = '\\0';\n\tif (length == 0)\n\t\treturn;\n\n\tchar chPrev = styler.SafeGetCharAt(startPos - 1);\n\tchar chNext = styler.SafeGetCharAt(startPos);\n\tbool is_real_number = true;   // Differentiate between constants and ?-sequences.\n\t// Ruby uses a different mask because bad indentation is marked by oring with 32\n\tstyler.StartAt(startPos, 127);\n\tstyler.StartSegment(startPos);\n\n    static int q_states[] = {SCE_RB_STRING_Q,\n                             SCE_RB_STRING_QQ,\n                             SCE_RB_STRING_QR,\n                             SCE_RB_STRING_QW,\n                             SCE_RB_STRING_QW,\n                             SCE_RB_STRING_QX};\n    static const char* q_chars = \"qQrwWx\";\n\n    // In most cases a value of 2 should be ample for the code in the\n    // Ruby library, and the code the user is likely to enter.\n    // For example,\n    // fu_output_message \"mkdir #{options[:mode] ? ('-m %03o ' % options[:mode]) : ''}#{list.join ' '}\"\n    //     if options[:verbose]\n    // from fileutils.rb nests to a level of 2\n    // If the user actually hits a 6th occurrence of '#{' in a double-quoted\n    // string (including regex'es, %Q, %<sym>, %w, and other strings\n    // that interpolate), it will stay as a string.  The problem with this\n    // is that quotes might flip, a 7th '#{' will look like a comment,\n    // and code-folding might be wrong.\n\n    // If anyone runs into this problem, I recommend raising this\n    // value slightly higher to replacing the fixed array with a linked\n    // list.  Keep in mind this code will be called everytime the lexer\n    // is invoked.\n\n#define INNER_STRINGS_MAX_COUNT 5\n    // These vars track our instances of \"...#{,,,%Q<..#{,,,}...>,,,}...\"\n    int inner_string_types[INNER_STRINGS_MAX_COUNT];\n    // Track # braces when we push a new #{ thing\n    int inner_expn_brace_counts[INNER_STRINGS_MAX_COUNT];\n    QuoteCls inner_quotes[INNER_STRINGS_MAX_COUNT];\n    int inner_string_count = 0;\n    int brace_counts = 0;   // Number of #{ ... } things within an expression\n\n    int i;\n\tfor (i = 0; i < INNER_STRINGS_MAX_COUNT; i++) {\n        inner_string_types[i] = 0;\n        inner_expn_brace_counts[i] = 0;\n    }\n\tfor (i = startPos; i < lengthDoc; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tchar chNext2 = styler.SafeGetCharAt(i + 2);\n\n        if (styler.IsLeadByte(ch)) {\n\t\t\tchNext = chNext2;\n\t\t\tchPrev = ' ';\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\n        // skip on DOS/Windows\n        //No, don't, because some things will get tagged on,\n        // so we won't recognize keywords, for example\n#if 0\n\t\tif (ch == '\\r' && chNext == '\\n') {\n\t    \tcontinue;\n        }\n#endif\n\n        if (HereDoc.State == 1 && isEOLChar(ch)) {\n\t\t\t// Begin of here-doc (the line after the here-doc delimiter):\n\t\t\tHereDoc.State = 2;\n\t\t\tstyler.ColourTo(i-1, state);\n            // Don't check for a missing quote, just jump into\n            // the here-doc state\n            state = SCE_RB_HERE_Q;\n        }\n\n        // Regular transitions\n\t\tif (state == SCE_RB_DEFAULT) {\n            if (isSafeDigit(ch)) {\n            \tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_RB_NUMBER;\n                is_real_number = true;\n                numDots = 0;\n            } else if (isHighBitChar(ch) || iswordstart(ch)) {\n            \tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_RB_WORD;\n\t\t\t} else if (ch == '#') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_RB_COMMENTLINE;\n\t\t\t} else if (ch == '=') {\n\t\t\t\t// =begin indicates the start of a comment (doc) block\n                if ((i == 0 || isEOLChar(chPrev))\n                    && chNext == 'b'\n                    && styler.SafeGetCharAt(i + 2) == 'e'\n                    && styler.SafeGetCharAt(i + 3) == 'g'\n                    && styler.SafeGetCharAt(i + 4) == 'i'\n                    && styler.SafeGetCharAt(i + 5) == 'n'\n                    && !isSafeWordcharOrHigh(styler.SafeGetCharAt(i + 6))) {\n                    styler.ColourTo(i - 1, state);\n                    state = SCE_RB_POD;\n\t\t\t\t} else {\n\t\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\t\tstyler.ColourTo(i, SCE_RB_OPERATOR);\n\t\t\t\t\tpreferRE = true;\n\t\t\t\t}\n\t\t\t} else if (ch == '\"') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_RB_STRING;\n\t\t\t\tQuote.New();\n\t\t\t\tQuote.Open(ch);\n\t\t\t} else if (ch == '\\'') {\n                styler.ColourTo(i - 1, state);\n                state = SCE_RB_CHARACTER;\n                Quote.New();\n                Quote.Open(ch);\n\t\t\t} else if (ch == '`') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_RB_BACKTICKS;\n\t\t\t\tQuote.New();\n\t\t\t\tQuote.Open(ch);\n\t\t\t} else if (ch == '@') {\n                // Instance or class var\n\t\t\t\tstyler.ColourTo(i - 1, state);\n                if (chNext == '@') {\n                    state = SCE_RB_CLASS_VAR;\n                    advance_char(i, ch, chNext, chNext2); // pass by ref\n                } else {\n                    state = SCE_RB_INSTANCE_VAR;\n                }\n\t\t\t} else if (ch == '$') {\n                // Check for a builtin global\n\t\t\t\tstyler.ColourTo(i - 1, state);\n                // Recognize it bit by bit\n                state = SCE_RB_GLOBAL;\n            } else if (ch == '/' && preferRE) {\n                // Ambigous operator\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstate = SCE_RB_REGEX;\n                Quote.New();\n                Quote.Open(ch);\n\t\t\t} else if (ch == '<' && chNext == '<' && chNext2 != '=') {\n\n                // Recognise the '<<' symbol - either a here document or a binary op\n\t\t\t\tstyler.ColourTo(i - 1, state);\n                i++;\n                chNext = chNext2;\n\t\t\t\tstyler.ColourTo(i, SCE_RB_OPERATOR);\n\n                if (! (strchr(\"\\\"\\'`_-\", chNext2) || isSafeAlpha(chNext2))) {\n                    // It's definitely not a here-doc,\n                    // based on Ruby's lexer/parser in the\n                    // heredoc_identifier routine.\n                    // Nothing else to do.\n                } else if (preferRE) {\n                    if (sureThisIsHeredoc(i - 1, styler, prevWord)) {\n                        state = SCE_RB_HERE_DELIM;\n                        HereDoc.State = 0;\n                    }\n                    // else leave it in default state\n                } else {\n                    if (sureThisIsNotHeredoc(i - 1, styler)) {\n                        // leave state as default\n                        // We don't have all the heuristics Perl has for indications\n                        // of a here-doc, because '<<' is overloadable and used\n                        // for so many other classes.\n                    } else {\n                        state = SCE_RB_HERE_DELIM;\n                        HereDoc.State = 0;\n                    }\n                }\n                preferRE = (state != SCE_RB_HERE_DELIM);\n            } else if (ch == ':') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n                if (chNext == ':') {\n                    // Mark \"::\" as an operator, not symbol start\n                    styler.ColourTo(i + 1, SCE_RB_OPERATOR);\n                    advance_char(i, ch, chNext, chNext2); // pass by ref\n                    state = SCE_RB_DEFAULT;\n\t\t\t\t\tpreferRE = false;\n                } else if (isSafeWordcharOrHigh(chNext)) {\n\t\t\t\t\tstate = SCE_RB_SYMBOL;\n                } else if (strchr(\"[*!~+-*/%=<>&^|\", chNext)) {\n                    // Do the operator analysis in-line, looking ahead\n                    // Based on the table in pickaxe 2nd ed., page 339\n                    bool doColoring = true;\n                    switch (chNext) {\n                    case '[':\n                        if (chNext2 == ']' ) {\n                            char ch_tmp = styler.SafeGetCharAt(i + 3);\n                            if (ch_tmp == '=') {\n                                i += 3;\n                                ch = ch_tmp;\n                                chNext = styler.SafeGetCharAt(i + 1);\n                            } else {\n                                i += 2;\n                                ch = chNext2;\n                                chNext = ch_tmp;\n                            }\n                        } else {\n                            doColoring = false;\n                        }\n                        break;\n\n                    case '*':\n                        if (chNext2 == '*') {\n                            i += 2;\n                            ch = chNext2;\n                            chNext = styler.SafeGetCharAt(i + 1);\n                        } else {\n                            advance_char(i, ch, chNext, chNext2);\n                        }\n                        break;\n\n                    case '!':\n                        if (chNext2 == '=' || chNext2 == '~') {\n                            i += 2;\n                            ch = chNext2;\n                            chNext = styler.SafeGetCharAt(i + 1);\n                        } else {\n                            advance_char(i, ch, chNext, chNext2);\n                        }\n                        break;\n\n                    case '<':\n                        if (chNext2 == '<') {\n                            i += 2;\n                            ch = chNext2;\n                            chNext = styler.SafeGetCharAt(i + 1);\n                        } else if (chNext2 == '=') {\n                            char ch_tmp = styler.SafeGetCharAt(i + 3);\n                            if (ch_tmp == '>') {  // <=> operator\n                                i += 3;\n                                ch = ch_tmp;\n                                chNext = styler.SafeGetCharAt(i + 1);\n                            } else {\n                                i += 2;\n                                ch = chNext2;\n                                chNext = ch_tmp;\n                            }\n                        } else {\n                            advance_char(i, ch, chNext, chNext2);\n                        }\n                        break;\n\n                    default:\n                        // Simple one-character operators\n                        advance_char(i, ch, chNext, chNext2);\n                        break;\n                    }\n                    if (doColoring) {\n                        styler.ColourTo(i, SCE_RB_SYMBOL);\n                        state = SCE_RB_DEFAULT;\n                    }\n\t\t\t\t} else if (!preferRE) {\n\t\t\t\t\t// Don't color symbol strings (yet)\n\t\t\t\t\t// Just color the \":\" and color rest as string\n\t\t\t\t\tstyler.ColourTo(i, SCE_RB_SYMBOL);\n\t\t\t\t\tstate = SCE_RB_DEFAULT;\n                } else {\n                    styler.ColourTo(i, SCE_RB_OPERATOR);\n                    state = SCE_RB_DEFAULT;\n                    preferRE = true;\n                }\n            } else if (ch == '%') {\n                styler.ColourTo(i - 1, state);\n                bool have_string = false;\n                if (strchr(q_chars, chNext) && !isSafeWordcharOrHigh(chNext2)) {\n                    Quote.New();\n                    const char *hit = strchr(q_chars, chNext);\n                    if (hit != NULL) {\n                        state = q_states[hit - q_chars];\n                        Quote.Open(chNext2);\n                        i += 2;\n                        ch = chNext2;\n\t\t\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n                        have_string = true;\n                    }\n                } else if (preferRE && !isSafeWordcharOrHigh(chNext)) {\n                    // Ruby doesn't allow high bit chars here,\n                    // but the editor host might\n                    Quote.New();\n                    state = SCE_RB_STRING_QQ;\n                    Quote.Open(chNext);\n                    advance_char(i, ch, chNext, chNext2); // pass by ref\n                    have_string = true;\n                } else if (!isSafeWordcharOrHigh(chNext) && !iswhitespace(chNext) && !isEOLChar(chNext)) {\n                    // Ruby doesn't allow high bit chars here,\n                    // but the editor host might\n                    Quote.New();\n                    state = SCE_RB_STRING_QQ;\n                    Quote.Open(chNext);\n                    advance_char(i, ch, chNext, chNext2); // pass by ref\n                    have_string = true;\n                }\n                if (!have_string) {\n                    styler.ColourTo(i, SCE_RB_OPERATOR);\n                    // stay in default\n                    preferRE = true;\n                }\n            } else if (ch == '?') {\n                styler.ColourTo(i - 1, state);\n                if (iswhitespace(chNext) || chNext == '\\n' || chNext == '\\r') {\n                    styler.ColourTo(i, SCE_RB_OPERATOR);\n                } else {\n                    // It's the start of a character code escape sequence\n                    // Color it as a number.\n                    state = SCE_RB_NUMBER;\n                    is_real_number = false;\n                }\n            } else if (isoperator(ch) || ch == '.') {\n\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\tstyler.ColourTo(i, SCE_RB_OPERATOR);\n                // If we're ending an expression or block,\n                // assume it ends an object, and the ambivalent\n                // constructs are binary operators\n                //\n                // So if we don't have one of these chars,\n                // we aren't ending an object exp'n, and ops\n                // like : << / are unary operators.\n\n                if (ch == '{') {\n                    ++brace_counts;\n                    preferRE = true;\n                } else if (ch == '}' && --brace_counts < 0\n                           && inner_string_count > 0) {\n                    styler.ColourTo(i, SCE_RB_OPERATOR);\n                    exitInnerExpression(inner_string_types,\n                                        inner_expn_brace_counts,\n                                        inner_quotes,\n                                        inner_string_count,\n                                        state, brace_counts, Quote);\n                } else {\n                    preferRE = (strchr(\")}].\", ch) == NULL);\n                }\n                // Stay in default state\n            } else if (isEOLChar(ch)) {\n                // Make sure it's a true line-end, with no backslash\n                if ((ch == '\\r' || (ch == '\\n' && chPrev != '\\r'))\n                    && chPrev != '\\\\') {\n                    // Assume we've hit the end of the statement.\n                    preferRE = true;\n                }\n            }\n        } else if (state == SCE_RB_WORD) {\n            if (ch == '.' || !isSafeWordcharOrHigh(ch)) {\n                // Words include x? in all contexts,\n                // and <letters>= after either 'def' or a dot\n                // Move along until a complete word is on our left\n\n                // Default accessor treats '.' as word-chars,\n                // but we don't for now.\n\n                if (ch == '='\n                    && isSafeWordcharOrHigh(chPrev)\n                    && (chNext == '('\n                        || strchr(\" \\t\\n\\r\", chNext) != NULL)\n                    && (!strcmp(prevWord, \"def\")\n                        || followsDot(styler.GetStartSegment(), styler))) {\n                    // <name>= is a name only when being def'd -- Get it the next time\n                    // This means that <name>=<name> is always lexed as\n                    // <name>, (op, =), <name>\n                } else if ((ch == '?' || ch == '!')\n                           && isSafeWordcharOrHigh(chPrev)\n                           && !isSafeWordcharOrHigh(chNext)) {\n                    // <name>? is a name -- Get it the next time\n                    // But <name>?<name> is always lexed as\n                    // <name>, (op, ?), <name>\n                    // Same with <name>! to indicate a method that\n                    // modifies its target\n                } else if (isEOLChar(ch)\n                           && isMatch(styler, lengthDoc, i - 7, \"__END__\")) {\n                    styler.ColourTo(i, SCE_RB_DATASECTION);\n                    state = SCE_RB_DATASECTION;\n                    // No need to handle this state -- we'll just move to the end\n                    preferRE = false;\n                } else {\n\t\t\t\t\tint wordStartPos = styler.GetStartSegment();\n                    int word_style = ClassifyWordRb(wordStartPos, i - 1, keywords, styler, prevWord);\n                    switch (word_style) {\n                        case SCE_RB_WORD:\n                            preferRE = RE_CanFollowKeyword(prevWord);\n\t\t\t\t\t\t\tbreak;\n\n                        case SCE_RB_WORD_DEMOTED:\n                            preferRE = true;\n\t\t\t\t\t\t\tbreak;\n\n                        case SCE_RB_IDENTIFIER:\n                            if (isMatch(styler, lengthDoc, wordStartPos, \"print\")) {\n                                preferRE = true;\n                            } else if (isEOLChar(ch)) {\n                                preferRE = true;\n                            } else {\n                                preferRE = false;\n                            }\n\t\t\t\t\t\t\tbreak;\n                        default:\n                            preferRE = false;\n                    }\n                    if (ch == '.') {\n                        // We might be redefining an operator-method\n                        preferRE = false;\n                    }\n                    // And if it's the first\n                    redo_char(i, ch, chNext, chNext2, state); // pass by ref\n                }\n            }\n        } else if (state == SCE_RB_NUMBER) {\n            if (!is_real_number) {\n                if (ch != '\\\\') {\n                    styler.ColourTo(i, state);\n                    state = SCE_RB_DEFAULT;\n                    preferRE = false;\n                } else if (strchr(\"\\\\ntrfvaebs\", chNext)) {\n                    // Terminal escape sequence -- handle it next time\n                    // Nothing more to do this time through the loop\n                } else if (chNext == 'C' || chNext == 'M') {\n                    if (chNext2 != '-') {\n                        // \\C or \\M ends the sequence -- handle it next time\n                    } else {\n                        // Move from abc?\\C-x\n                        //               ^\n                        // to\n                        //                 ^\n                        i += 2;\n                        ch = chNext2;\n                        chNext = styler.SafeGetCharAt(i + 1);\n                    }\n                } else if (chNext == 'c') {\n                    // Stay here, \\c is a combining sequence\n                    advance_char(i, ch, chNext, chNext2); // pass by ref\n                } else {\n                    // ?\\x, including ?\\\\ is final.\n                    styler.ColourTo(i + 1, state);\n                    state = SCE_RB_DEFAULT;\n                    preferRE = false;\n                    advance_char(i, ch, chNext, chNext2);\n                }\n            } else if (isSafeAlnumOrHigh(ch) || ch == '_') {\n                // Keep going\n            } else if (ch == '.' && chNext == '.') {\n                ++numDots;\n                styler.ColourTo(i - 1, state);\n                redo_char(i, ch, chNext, chNext2, state); // pass by ref\n            } else if (ch == '.' && ++numDots == 1) {\n                // Keep going\n            } else {\n                styler.ColourTo(i - 1, state);\n                redo_char(i, ch, chNext, chNext2, state); // pass by ref\n                preferRE = false;\n            }\n        } else if (state == SCE_RB_COMMENTLINE) {\n\t\t\tif (isEOLChar(ch)) {\n                styler.ColourTo(i - 1, state);\n                state = SCE_RB_DEFAULT;\n                // Use whatever setting we had going into the comment\n            }\n        } else if (state == SCE_RB_HERE_DELIM) {\n            // See the comment for SCE_RB_HERE_DELIM in LexPerl.cxx\n            // Slightly different: if we find an immediate '-',\n            // the target can appear indented.\n\n\t\t\tif (HereDoc.State == 0) { // '<<' encountered\n\t\t\t\tHereDoc.State = 1;\n                HereDoc.DelimiterLength = 0;\n                if (ch == '-') {\n                    HereDoc.CanBeIndented = true;\n                    advance_char(i, ch, chNext, chNext2); // pass by ref\n                } else {\n                    HereDoc.CanBeIndented = false;\n                }\n                if (isEOLChar(ch)) {\n                    // Bail out of doing a here doc if there's no target\n                    state = SCE_RB_DEFAULT;\n                    preferRE = false;\n                } else {\n                    HereDoc.Quote = ch;\n\n                    if (ch == '\\'' || ch == '\"' || ch == '`') {\n                        HereDoc.Quoted = true;\n                        HereDoc.Delimiter[0] = '\\0';\n                    } else {\n                        HereDoc.Quoted = false;\n                        HereDoc.Delimiter[0] = ch;\n                        HereDoc.Delimiter[1] = '\\0';\n                        HereDoc.DelimiterLength = 1;\n                    }\n                }\n\t\t\t} else if (HereDoc.State == 1) { // collect the delimiter\n                if (isEOLChar(ch)) {\n                    // End the quote now, and go back for more\n                    styler.ColourTo(i - 1, state);\n                    state = SCE_RB_DEFAULT;\n                    i--;\n                    chNext = ch;\n                    preferRE = false;\n                } else if (HereDoc.Quoted) {\n\t\t\t\t\tif (ch == HereDoc.Quote) { // closing quote => end of delimiter\n\t\t\t\t\t\tstyler.ColourTo(i, state);\n\t\t\t\t\t\tstate = SCE_RB_DEFAULT;\n                        preferRE = false;\n                    } else {\n\t\t\t\t\t\tif (ch == '\\\\' && !isEOLChar(chNext)) {\n                            advance_char(i, ch, chNext, chNext2);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tHereDoc.Delimiter[HereDoc.DelimiterLength++] = ch;\n\t\t\t\t\t\tHereDoc.Delimiter[HereDoc.DelimiterLength] = '\\0';\n                    }\n                } else { // an unquoted here-doc delimiter\n\t\t\t\t\tif (isSafeAlnumOrHigh(ch) || ch == '_') {\n\t\t\t\t\t\tHereDoc.Delimiter[HereDoc.DelimiterLength++] = ch;\n\t\t\t\t\t\tHereDoc.Delimiter[HereDoc.DelimiterLength] = '\\0';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstyler.ColourTo(i - 1, state);\n                        redo_char(i, ch, chNext, chNext2, state);\n                        preferRE = false;\n\t\t\t\t\t}\n                }\n\t\t\t\tif (HereDoc.DelimiterLength >= static_cast<int>(sizeof(HereDoc.Delimiter)) - 1) {\n\t\t\t\t\tstyler.ColourTo(i - 1, state);\n\t\t\t\t\tstate = SCE_RB_ERROR;\n                    preferRE = false;\n\t\t\t\t}\n            }\n        } else if (state == SCE_RB_HERE_Q) {\n            // Not needed: HereDoc.State == 2\n            // Indentable here docs: look backwards\n            // Non-indentable: look forwards, like in Perl\n            //\n            // Why: so we can quickly resolve things like <<-\" abc\"\n\n            if (!HereDoc.CanBeIndented) {\n                if (isEOLChar(chPrev)\n                    && isMatch(styler, lengthDoc, i, HereDoc.Delimiter)) {\n                    styler.ColourTo(i - 1, state);\n                    i += HereDoc.DelimiterLength - 1;\n                    chNext = styler.SafeGetCharAt(i + 1);\n                    if (isEOLChar(chNext)) {\n                        styler.ColourTo(i, SCE_RB_HERE_DELIM);\n                        state = SCE_RB_DEFAULT;\n                        HereDoc.State = 0;\n                        preferRE = false;\n                    }\n                    // Otherwise we skipped through the here doc faster.\n                }\n            } else if (isEOLChar(chNext)\n                       && lookingAtHereDocDelim(styler,\n                                                i - HereDoc.DelimiterLength + 1,\n                                                lengthDoc,\n                                                HereDoc.Delimiter)) {\n                styler.ColourTo(i - 1 - HereDoc.DelimiterLength, state);\n                styler.ColourTo(i, SCE_RB_HERE_DELIM);\n                state = SCE_RB_DEFAULT;\n                preferRE = false;\n                HereDoc.State = 0;\n            }\n        } else if (state == SCE_RB_CLASS_VAR\n                   || state == SCE_RB_INSTANCE_VAR\n                   || state == SCE_RB_SYMBOL) {\n            if (!isSafeWordcharOrHigh(ch)) {\n                styler.ColourTo(i - 1, state);\n                redo_char(i, ch, chNext, chNext2, state); // pass by ref\n                preferRE = false;\n            }\n        } else if (state == SCE_RB_GLOBAL) {\n            if (!isSafeWordcharOrHigh(ch)) {\n                // handle special globals here as well\n                if (chPrev == '$') {\n                    if (ch == '-') {\n                        // Include the next char, like $-a\n                        advance_char(i, ch, chNext, chNext2);\n                    }\n                    styler.ColourTo(i, state);\n                    state = SCE_RB_DEFAULT;\n                } else {\n                    styler.ColourTo(i - 1, state);\n                    redo_char(i, ch, chNext, chNext2, state); // pass by ref\n                }\n                preferRE = false;\n            }\n        } else if (state == SCE_RB_POD) {\n            // PODs end with ^=end\\s, -- any whitespace can follow =end\n            if (strchr(\" \\t\\n\\r\", ch) != NULL\n                && i > 5\n                && isEOLChar(styler[i - 5])\n                && isMatch(styler, lengthDoc, i - 4, \"=end\")) {\n                styler.ColourTo(i - 1, state);\n                state = SCE_RB_DEFAULT;\n                preferRE = false;\n            }\n        } else if (state == SCE_RB_REGEX || state == SCE_RB_STRING_QR) {\n            if (ch == '\\\\' && Quote.Up != '\\\\') {\n                // Skip one\n                advance_char(i, ch, chNext, chNext2);\n            } else if (ch == Quote.Down) {\n                Quote.Count--;\n                if (Quote.Count == 0) {\n                    // Include the options\n                    while (isSafeAlpha(chNext)) {\n                        i++;\n\t\t\t\t\t\tch = chNext;\n                        chNext = styler.SafeGetCharAt(i + 1);\n                    }\n                    styler.ColourTo(i, state);\n                    state = SCE_RB_DEFAULT;\n                    preferRE = false;\n                }\n            } else if (ch == Quote.Up) {\n                // Only if close quoter != open quoter\n                Quote.Count++;\n\n            } else if (ch == '#' ) {\n                if (chNext == '{'\n                    && inner_string_count < INNER_STRINGS_MAX_COUNT) {\n                    // process #{ ... }\n                    styler.ColourTo(i - 1, state);\n                    styler.ColourTo(i + 1, SCE_RB_OPERATOR);\n                    enterInnerExpression(inner_string_types,\n                                         inner_expn_brace_counts,\n                                         inner_quotes,\n                                         inner_string_count,\n                                         state,\n                                         brace_counts,\n                                         Quote);\n                    preferRE = true;\n                    // Skip one\n                    advance_char(i, ch, chNext, chNext2);\n                } else {\n                    //todo: distinguish comments from pound chars\n                    // for now, handle as comment\n                    styler.ColourTo(i - 1, state);\n                    bool inEscape = false;\n                    while (++i < lengthDoc) {\n                        ch = styler.SafeGetCharAt(i);\n                        if (ch == '\\\\') {\n                            inEscape = true;\n                        } else if (isEOLChar(ch)) {\n                            // Comment inside a regex\n                            styler.ColourTo(i - 1, SCE_RB_COMMENTLINE);\n                            break;\n                        } else if (inEscape) {\n                            inEscape = false;  // don't look at char\n                        } else if (ch == Quote.Down) {\n                            // Have the regular handler deal with this\n                            // to get trailing modifiers.\n                            i--;\n                            ch = styler[i];\n                            break;\n                        }\n                    }\n                    chNext = styler.SafeGetCharAt(i + 1);\n                }\n            }\n        // Quotes of all kinds...\n        } else if (state == SCE_RB_STRING_Q || state == SCE_RB_STRING_QQ ||\n                   state == SCE_RB_STRING_QX || state == SCE_RB_STRING_QW ||\n                   state == SCE_RB_STRING || state == SCE_RB_CHARACTER ||\n                   state == SCE_RB_BACKTICKS) {\n            if (!Quote.Down && !isspacechar(ch)) {\n                Quote.Open(ch);\n            } else if (ch == '\\\\' && Quote.Up != '\\\\') {\n                //Riddle me this: Is it safe to skip *every* escaped char?\n                advance_char(i, ch, chNext, chNext2);\n            } else if (ch == Quote.Down) {\n                Quote.Count--;\n                if (Quote.Count == 0) {\n                    styler.ColourTo(i, state);\n                    state = SCE_RB_DEFAULT;\n                    preferRE = false;\n                }\n            } else if (ch == Quote.Up) {\n                Quote.Count++;\n            } else if (ch == '#' && chNext == '{'\n                       && inner_string_count < INNER_STRINGS_MAX_COUNT\n                       && state != SCE_RB_CHARACTER\n                       && state != SCE_RB_STRING_Q) {\n                // process #{ ... }\n                styler.ColourTo(i - 1, state);\n                styler.ColourTo(i + 1, SCE_RB_OPERATOR);\n                enterInnerExpression(inner_string_types,\n                                     inner_expn_brace_counts,\n                                     inner_quotes,\n                                     inner_string_count,\n                                     state,\n                                     brace_counts,\n                                     Quote);\n                preferRE = true;\n                // Skip one\n                advance_char(i, ch, chNext, chNext2);\n            }\n        }\n\n        if (state == SCE_RB_ERROR) {\n            break;\n        }\n        chPrev = ch;\n    }\n    if (state == SCE_RB_WORD) {\n        // We've ended on a word, possibly at EOF, and need to\n        // classify it.\n        (void) ClassifyWordRb(styler.GetStartSegment(), lengthDoc - 1, keywords, styler, prevWord);\n    } else {\n        styler.ColourTo(lengthDoc - 1, state);\n    }\n}\n\n// Helper functions for folding, disambiguation keywords\n// Assert that there are no high-bit chars\n\nstatic void getPrevWord(int pos,\n                        char *prevWord,\n                        Accessor &styler,\n                        int word_state)\n{\n    int i;\n    styler.Flush();\n    for (i = pos - 1; i > 0; i--) {\n        if (actual_style(styler.StyleAt(i)) != word_state) {\n            i++;\n            break;\n        }\n    }\n    if (i < pos - MAX_KEYWORD_LENGTH) // overflow\n        i = pos - MAX_KEYWORD_LENGTH;\n    char *dst = prevWord;\n    for (; i <= pos; i++) {\n        *dst++ = styler[i];\n    }\n\t*dst = 0;\n}\n\nstatic bool keywordIsAmbiguous(const char *prevWord)\n{\n    // Order from most likely used to least likely\n    // Lots of ways to do a loop in Ruby besides 'while/until'\n    if (!strcmp(prevWord, \"if\")\n        || !strcmp(prevWord, \"do\")\n        || !strcmp(prevWord, \"while\")\n        || !strcmp(prevWord, \"unless\")\n        || !strcmp(prevWord, \"until\")\n        || !strcmp(prevWord, \"for\")) {\n        return true;\n    } else {\n        return false;\n    }\n}\n\n// Demote keywords in the following conditions:\n// if, while, unless, until modify a statement\n// do after a while or until, as a noise word (like then after if)\n\nstatic bool keywordIsModifier(const char *word,\n                              int pos,\n                              Accessor &styler)\n{\n    if (word[0] == 'd' && word[1] == 'o' && !word[2]) {\n        return keywordDoStartsLoop(pos, styler);\n    }\n    char ch, chPrev, chPrev2;\n    int style = SCE_RB_DEFAULT;\n\tint lineStart = styler.GetLine(pos);\n    int lineStartPosn = styler.LineStart(lineStart);\n    // We want to step backwards until we don't care about the current\n    // position. But first move lineStartPosn back behind any\n    // continuations immediately above word.\n    while (lineStartPosn > 0) {\n        ch = styler[lineStartPosn-1];\n        if (ch == '\\n' || ch == '\\r') {\n            chPrev  = styler.SafeGetCharAt(lineStartPosn-2);\n            chPrev2 = styler.SafeGetCharAt(lineStartPosn-3);\n            lineStart = styler.GetLine(lineStartPosn-1);\n            // If we find a continuation line, include it in our analysis.\n            if (chPrev == '\\\\') {\n                lineStartPosn = styler.LineStart(lineStart);\n            } else if (ch == '\\n' && chPrev == '\\r' && chPrev2 == '\\\\') {\n                lineStartPosn = styler.LineStart(lineStart);\n            } else {\n                break;\n            }\n        } else {\n          break;\n        }\n    }\n\n    styler.Flush();\n    while (--pos >= lineStartPosn) {\n        style = actual_style(styler.StyleAt(pos));\n\t\tif (style == SCE_RB_DEFAULT) {\n\t\t\tif (iswhitespace(ch = styler[pos])) {\n\t\t\t\t//continue\n\t\t\t} else if (ch == '\\r' || ch == '\\n') {\n\t\t\t\t// Scintilla's LineStart() and GetLine() routines aren't\n\t\t\t\t// platform-independent, so if we have text prepared with\n\t\t\t\t// a different system we can't rely on it.\n\n                // Also, lineStartPosn may have been moved to more than one\n                // line above word's line while pushing past continuations.\n                chPrev = styler.SafeGetCharAt(pos - 1);\n                chPrev2 = styler.SafeGetCharAt(pos - 2);\n                if (chPrev == '\\\\') {\n                    pos-=1;  // gloss over the \"\\\\\"\n                    //continue\n                } else if (ch == '\\n' && chPrev == '\\r' && chPrev2 == '\\\\') {\n                    pos-=2;  // gloss over the \"\\\\\\r\"\n                    //continue\n                } else {\n\t\t\t\t    return false;\n                }\n\t\t\t}\n\t\t} else {\n            break;\n\t\t}\n    }\n    if (pos < lineStartPosn) {\n        return false;\n    }\n    // First things where the action is unambiguous\n    switch (style) {\n        case SCE_RB_DEFAULT:\n        case SCE_RB_COMMENTLINE:\n        case SCE_RB_POD:\n        case SCE_RB_CLASSNAME:\n        case SCE_RB_DEFNAME:\n        case SCE_RB_MODULE_NAME:\n            return false;\n        case SCE_RB_OPERATOR:\n            break;\n        case SCE_RB_WORD:\n            // Watch out for uses of 'else if'\n            //XXX: Make a list of other keywords where 'if' isn't a modifier\n            //     and can appear legitimately\n            // Formulate this to avoid warnings from most compilers\n            if (strcmp(word, \"if\") == 0) {\n                char prevWord[MAX_KEYWORD_LENGTH + 1];\n                getPrevWord(pos, prevWord, styler, SCE_RB_WORD);\n                return strcmp(prevWord, \"else\") != 0;\n            }\n            return true;\n        default:\n            return true;\n    }\n    // Assume that if the keyword follows an operator,\n    // usually it's a block assignment, like\n    // a << if x then y else z\n\n    ch = styler[pos];\n    switch (ch) {\n        case ')':\n        case ']':\n        case '}':\n            return true;\n        default:\n            return false;\n    }\n}\n\n#define WHILE_BACKWARDS \"elihw\"\n#define UNTIL_BACKWARDS \"litnu\"\n#define FOR_BACKWARDS \"rof\"\n\n// Nothing fancy -- look to see if we follow a while/until somewhere\n// on the current line\n\nstatic bool keywordDoStartsLoop(int pos,\n                                Accessor &styler)\n{\n    char ch;\n    int style;\n\tint lineStart = styler.GetLine(pos);\n    int lineStartPosn = styler.LineStart(lineStart);\n    styler.Flush();\n    while (--pos >= lineStartPosn) {\n        style = actual_style(styler.StyleAt(pos));\n\t\tif (style == SCE_RB_DEFAULT) {\n\t\t\tif ((ch = styler[pos]) == '\\r' || ch == '\\n') {\n\t\t\t\t// Scintilla's LineStart() and GetLine() routines aren't\n\t\t\t\t// platform-independent, so if we have text prepared with\n\t\t\t\t// a different system we can't rely on it.\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (style == SCE_RB_WORD) {\n            // Check for while or until, but write the word in backwards\n            char prevWord[MAX_KEYWORD_LENGTH + 1]; // 1 byte for zero\n            char *dst = prevWord;\n            int wordLen = 0;\n            int start_word;\n            for (start_word = pos;\n                 start_word >= lineStartPosn && actual_style(styler.StyleAt(start_word)) == SCE_RB_WORD;\n                 start_word--) {\n                if (++wordLen < MAX_KEYWORD_LENGTH) {\n                    *dst++ = styler[start_word];\n                }\n            }\n            *dst = 0;\n            // Did we see our keyword?\n            if (!strcmp(prevWord, WHILE_BACKWARDS)\n                || !strcmp(prevWord, UNTIL_BACKWARDS)\n                || !strcmp(prevWord, FOR_BACKWARDS)) {\n                return true;\n            }\n            // We can move pos to the beginning of the keyword, and then\n            // accept another decrement, as we can never have two contiguous\n            // keywords:\n            // word1 word2\n            //           ^\n            //        <-  move to start_word\n            //      ^\n            //      <- loop decrement\n            //     ^  # pointing to end of word1 is fine\n            pos = start_word;\n        }\n    }\n    return false;\n}\n\n/*\n *  Folding Ruby\n *\n *  The language is quite complex to analyze without a full parse.\n *  For example, this line shouldn't affect fold level:\n *\n *   print \"hello\" if feeling_friendly?\n *\n *  Neither should this:\n *\n *   print \"hello\" \\\n *      if feeling_friendly?\n *\n *\n *  But this should:\n *\n *   if feeling_friendly?  #++\n *     print \"hello\" \\\n *     print \"goodbye\"\n *   end                   #--\n *\n *  So we cheat, by actually looking at the existing indentation\n *  levels for each line, and just echoing it back.  Like Python.\n *  Then if we get better at it, we'll take braces into consideration,\n *  which always affect folding levels.\n\n *  How the keywords should work:\n *  No effect:\n *  __FILE__ __LINE__ BEGIN END alias and\n *  defined? false in nil not or self super then\n *  true undef\n\n *  Always increment:\n *  begin  class def do for module when {\n *\n *  Always decrement:\n *  end }\n *\n *  Increment if these start a statement\n *  if unless until while -- do nothing if they're modifiers\n\n *  These end a block if there's no modifier, but don't bother\n *  break next redo retry return yield\n *\n *  These temporarily de-indent, but re-indent\n *  case else elsif ensure rescue\n *\n *  This means that the folder reflects indentation rather\n *  than setting it.  The language-service updates indentation\n *  when users type return and finishes entering de-denters.\n *\n *  Later offer to fold POD, here-docs, strings, and blocks of comments\n */\n\nstatic void FoldRbDoc(unsigned int startPos, int length, int initStyle,\n                      WordList *[], Accessor &styler) {\n\tconst bool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\n    synchronizeDocStart(startPos, length, initStyle, styler, // ref args\n                        false);\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = startPos == 0 ? 0 : (styler.LevelAt(lineCurrent)\n                                         & SC_FOLDLEVELNUMBERMASK\n                                         & ~SC_FOLDLEVELBASE);\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint stylePrev = startPos <= 1 ? SCE_RB_DEFAULT : styler.StyleAt(startPos - 1);\n    bool buffer_ends_with_eol = false;\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n        if (style == SCE_RB_COMMENTLINE) {\n            if (foldComment && stylePrev != SCE_RB_COMMENTLINE) {\n                if (chNext == '{') {\n\t\t\t\t\tlevelCurrent++;\n\t\t\t\t} else if (chNext == '}' && levelCurrent > 0) {\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n            }\n        } else if (style == SCE_RB_OPERATOR) {\n\t\t\tif (strchr(\"[{(\", ch)) {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (strchr(\")}]\", ch)) {\n                // Don't decrement below 0\n                if (levelCurrent > 0)\n                    levelCurrent--;\n\t\t\t}\n        } else if (style == SCE_RB_WORD && styleNext != SCE_RB_WORD) {\n            // Look at the keyword on the left and decide what to do\n            char prevWord[MAX_KEYWORD_LENGTH + 1]; // 1 byte for zero\n            prevWord[0] = 0;\n            getPrevWord(i, prevWord, styler, SCE_RB_WORD);\n            if (!strcmp(prevWord, \"end\")) {\n                // Don't decrement below 0\n                if (levelCurrent > 0)\n                    levelCurrent--;\n            } else if (   !strcmp(prevWord, \"if\")\n                       || !strcmp(prevWord, \"def\")\n                       || !strcmp(prevWord, \"class\")\n                       || !strcmp(prevWord, \"module\")\n                       || !strcmp(prevWord, \"begin\")\n                       || !strcmp(prevWord, \"case\")\n                       || !strcmp(prevWord, \"do\")\n                       || !strcmp(prevWord, \"while\")\n                       || !strcmp(prevWord, \"unless\")\n                       || !strcmp(prevWord, \"until\")\n                       || !strcmp(prevWord, \"for\")\n                          ) {\n\t\t\t\tlevelCurrent++;\n            }\n\t\t} else if (style == SCE_RB_HERE_DELIM) {\n\t\t\tif (styler.SafeGetCharAt(i-2) == '<' && styler.SafeGetCharAt(i-1) == '<') {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (styleNext == SCE_RB_DEFAULT) {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n            styler.SetLevel(lineCurrent, lev|SC_FOLDLEVELBASE);\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n            buffer_ends_with_eol = true;\n\t\t} else if (!isspacechar(ch)) {\n\t\t\tvisibleChars++;\n            buffer_ends_with_eol = false;\n        }\n\t\tstylePrev = style;\n    }\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n    if (!buffer_ends_with_eol) {\n        lineCurrent++;\n        int new_lev = levelCurrent;\n        if (visibleChars == 0 && foldCompact)\n            new_lev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tnew_lev |= SC_FOLDLEVELHEADERFLAG;\n            levelCurrent = new_lev;\n    }\n\tstyler.SetLevel(lineCurrent, levelCurrent|SC_FOLDLEVELBASE);\n}\n\nstatic const char * const rubyWordListDesc[] = {\n\t\"Keywords\",\n\t0\n};\n\nLexerModule lmRuby(SCLEX_RUBY, ColouriseRbDoc, \"ruby\", FoldRbDoc, rubyWordListDesc, 6);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexRust.cpp",
    "content": "/** @file LexRust.cxx\n ** Lexer for Rust.\n **\n ** Copyright (c) 2013 by SiegeLord <slabode@aim.com>\n ** Converted to lexer object and added further folding features/properties by \"Udo Lechner\" <dlchnr(at)gmx(dot)net>\n **/\n// Copyright 1998-2005 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include <string>\n#include <map>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n#include \"OptionSet.h\"\n#include \"PropSetSimple.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic bool IsStreamCommentStyle(int style) {\n\treturn style == SCE_RUST_COMMENTBLOCK ||\n\t\t   style == SCE_RUST_COMMENTBLOCKDOC;\n}\n\n// Options used for LexerRust\nstruct OptionsRust {\n\tbool fold;\n\tbool foldSyntaxBased;\n\tbool foldComment;\n\tbool foldCommentMultiline;\n\tbool foldCommentExplicit;\n\tstd::string foldExplicitStart;\n\tstd::string foldExplicitEnd;\n\tbool foldExplicitAnywhere;\n\tbool foldCompact;\n\tint  foldAtElseInt;\n\tbool foldAtElse;\n\tOptionsRust() {\n\t\tfold = false;\n\t\tfoldSyntaxBased = true;\n\t\tfoldComment = false;\n\t\tfoldCommentMultiline = true;\n\t\tfoldCommentExplicit = true;\n\t\tfoldExplicitStart = \"\";\n\t\tfoldExplicitEnd   = \"\";\n\t\tfoldExplicitAnywhere = false;\n\t\tfoldCompact = true;\n\t\tfoldAtElseInt = -1;\n\t\tfoldAtElse = false;\n\t}\n};\n\nstatic const char * const rustWordLists[] = {\n\t\t\t\"Primary keywords and identifiers\",\n\t\t\t\"Built in types\",\n\t\t\t\"Other keywords\",\n\t\t\t\"Keywords 4\",\n\t\t\t\"Keywords 5\",\n\t\t\t\"Keywords 6\",\n\t\t\t\"Keywords 7\",\n\t\t\t0,\n\t\t};\n\nstruct OptionSetRust : public OptionSet<OptionsRust> {\n\tOptionSetRust() {\n\t\tDefineProperty(\"fold\", &OptionsRust::fold);\n\n\t\tDefineProperty(\"fold.comment\", &OptionsRust::foldComment);\n\n\t\tDefineProperty(\"fold.compact\", &OptionsRust::foldCompact);\n\n\t\tDefineProperty(\"fold.at.else\", &OptionsRust::foldAtElse);\n\n\t\tDefineProperty(\"fold.rust.syntax.based\", &OptionsRust::foldSyntaxBased,\n\t\t\t\"Set this property to 0 to disable syntax based folding.\");\n\n\t\tDefineProperty(\"fold.rust.comment.multiline\", &OptionsRust::foldCommentMultiline,\n\t\t\t\"Set this property to 0 to disable folding multi-line comments when fold.comment=1.\");\n\n\t\tDefineProperty(\"fold.rust.comment.explicit\", &OptionsRust::foldCommentExplicit,\n\t\t\t\"Set this property to 0 to disable folding explicit fold points when fold.comment=1.\");\n\n\t\tDefineProperty(\"fold.rust.explicit.start\", &OptionsRust::foldExplicitStart,\n\t\t\t\"The string to use for explicit fold start points, replacing the standard //{.\");\n\n\t\tDefineProperty(\"fold.rust.explicit.end\", &OptionsRust::foldExplicitEnd,\n\t\t\t\"The string to use for explicit fold end points, replacing the standard //}.\");\n\n\t\tDefineProperty(\"fold.rust.explicit.anywhere\", &OptionsRust::foldExplicitAnywhere,\n\t\t\t\"Set this property to 1 to enable explicit fold points anywhere, not just in line comments.\");\n\n\t\tDefineProperty(\"lexer.rust.fold.at.else\", &OptionsRust::foldAtElseInt,\n\t\t\t\"This option enables Rust folding on a \\\"} else {\\\" line of an if statement.\");\n\n\t\tDefineWordListSets(rustWordLists);\n\t}\n};\n\nclass LexerRust : public ILexer {\n\tWordList keywords[7];\n\tOptionsRust options;\n\tOptionSetRust osRust;\npublic:\n\tvirtual ~LexerRust() {\n\t}\n\tvoid SCI_METHOD Release() {\n\t\tdelete this;\n\t}\n\tint SCI_METHOD Version() const {\n\t\treturn lvOriginal;\n\t}\n\tconst char * SCI_METHOD PropertyNames() {\n\t\treturn osRust.PropertyNames();\n\t}\n\tint SCI_METHOD PropertyType(const char *name) {\n\t\treturn osRust.PropertyType(name);\n\t}\n\tconst char * SCI_METHOD DescribeProperty(const char *name) {\n\t\treturn osRust.DescribeProperty(name);\n\t}\n\tint SCI_METHOD PropertySet(const char *key, const char *val);\n\tconst char * SCI_METHOD DescribeWordListSets() {\n\t\treturn osRust.DescribeWordListSets();\n\t}\n\tint SCI_METHOD WordListSet(int n, const char *wl);\n\tvoid SCI_METHOD Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n\tvoid SCI_METHOD Fold(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n\tvoid * SCI_METHOD PrivateCall(int, void *) {\n\t\treturn 0;\n\t}\n\tstatic ILexer *LexerFactoryRust() {\n\t\treturn new LexerRust();\n\t}\n};\n\nint SCI_METHOD LexerRust::PropertySet(const char *key, const char *val) {\n\tif (osRust.PropertySet(&options, key, val)) {\n\t\treturn 0;\n\t}\n\treturn -1;\n}\n\nint SCI_METHOD LexerRust::WordListSet(int n, const char *wl) {\n\tint firstModification = -1;\n\tif (n < 7) {\n\t\tWordList *wordListN = &keywords[n];\n\t\tWordList wlNew;\n\t\twlNew.Set(wl);\n\t\tif (*wordListN != wlNew) {\n\t\t\twordListN->Set(wl);\n\t\t\tfirstModification = 0;\n\t\t}\n\t}\n\treturn firstModification;\n}\n\nstatic bool IsWhitespace(int c) {\n    return c == ' ' || c == '\\t' || c == '\\r' || c == '\\n';\n}\n\n/* This isn't quite right for Unicode identifiers */\nstatic bool IsIdentifierStart(int ch) {\n\treturn (IsASCII(ch) && (isalpha(ch) || ch == '_')) || !IsASCII(ch);\n}\n\n/* This isn't quite right for Unicode identifiers */\nstatic bool IsIdentifierContinue(int ch) {\n\treturn (IsASCII(ch) && (isalnum(ch) || ch == '_')) || !IsASCII(ch);\n}\n\nstatic void ScanWhitespace(Accessor& styler, int& pos, int max) {\n\twhile (IsWhitespace(styler.SafeGetCharAt(pos, '\\0')) && pos < max) {\n\t\tif (pos == styler.LineEnd(styler.GetLine(pos)))\n\t\t\tstyler.SetLineState(styler.GetLine(pos), 0);\n\t\tpos++;\n\t}\n\tstyler.ColourTo(pos-1, SCE_RUST_DEFAULT);\n}\n\nstatic void GrabString(char* s, Accessor& styler, int start, int len) {\n\tfor (int ii = 0; ii < len; ii++)\n\t\ts[ii] = styler[ii + start];\n\ts[len] = '\\0';\n}\n\nstatic void ScanIdentifier(Accessor& styler, int& pos, WordList *keywords) {\n\tint start = pos;\n\twhile (IsIdentifierContinue(styler.SafeGetCharAt(pos, '\\0')))\n\t\tpos++;\n\n\tif (styler.SafeGetCharAt(pos, '\\0') == '!') {\n\t\tpos++;\n\t\tstyler.ColourTo(pos - 1, SCE_RUST_MACRO);\n\t} else {\n\t\tchar s[1024];\n\t\tint len = pos - start;\n\t\tlen = len > 1024 ? 1024 : len;\n\t\tGrabString(s, styler, start, len);\n\t\tbool keyword = false;\n\t\tfor (int ii = 0; ii < 7; ii++) {\n\t\t\tif (keywords[ii].InList(s)) {\n\t\t\t\tstyler.ColourTo(pos - 1, SCE_RUST_WORD + ii);\n\t\t\t\tkeyword = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!keyword) {\n\t\t\tstyler.ColourTo(pos - 1, SCE_RUST_IDENTIFIER);\n\t\t}\n\t}\n}\n\nstatic void ScanDigits(Accessor& styler, int& pos, int base) {\n\tfor (;;) {\n\t\tint c = styler.SafeGetCharAt(pos, '\\0');\n\t\tif (IsADigit(c, base) || c == '_')\n\t\t\tpos++;\n\t\telse\n\t\t\tbreak;\n\t}\n}\n\nstatic bool ScanExponent(Accessor& styler, int& pos) {\n\tint c = styler.SafeGetCharAt(pos, '\\0');\n\tif (c == 'e' || c == 'E') {\n\t\tpos++;\n\t\tc = styler.SafeGetCharAt(pos, '\\0');\n\t\tif (c == '-' || c == '+')\n\t\t\tpos++;\n\t\tint old_pos = pos;\n\t\tScanDigits(styler, pos, 10);\n\t\tif (old_pos == pos)\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\nstatic void ScanNumber(Accessor& styler, int& pos) {\n\tint base = 10;\n\tint c = styler.SafeGetCharAt(pos, '\\0');\n\tint n = styler.SafeGetCharAt(pos + 1, '\\0');\n\tbool error = false;\n\tif (c == '0' && n == 'x') {\n        pos += 2;\n        base = 16;\n    } else if (c == '0' && n == 'b') {\n        pos += 2;\n        base = 2;\n    }\n    int old_pos = pos;\n    ScanDigits(styler, pos, base);\n    c = styler.SafeGetCharAt(pos, '\\0');\n    if (c == 'u' || c == 'i') {\n\t\tpos++;\n\t\tc = styler.SafeGetCharAt(pos, '\\0');\n\t\tint n = styler.SafeGetCharAt(pos + 1, '\\0');\n\t\tif (c == '8') {\n\t\t\tpos++;\n\t\t} else if (c == '1' && n == '6') {\n\t\t\tpos += 2;\n\t\t} else if (c == '3' && n == '2') {\n\t\t\tpos += 2;\n\t\t} else if (c == '6' && n == '4') {\n\t\t\tpos += 2;\n\t\t}\n\t} else if (c == '.') {\n\t\terror = base != 10;\n\t\tpos++;\n\t\tScanDigits(styler, pos, 10);\n\t\terror |= !ScanExponent(styler, pos);\n\t\tc = styler.SafeGetCharAt(pos, '\\0');\n\t\tif (c == 'f') {\n\t\t\tpos++;\n\t\t\tc = styler.SafeGetCharAt(pos, '\\0');\n\t\t\tint n = styler.SafeGetCharAt(pos + 1, '\\0');\n\t\t\tif (c == '3' && n == '2') {\n\t\t\t\tpos += 2;\n\t\t\t} else if (c == '6' && n == '4') {\n\t\t\t\tpos += 2;\n\t\t\t} else {\n\t\t\t\terror = true;\n\t\t\t}\n\t\t}\n\t}\n\tif (old_pos == pos) {\n\t\terror = true;\n\t}\n\tif (error)\n\t\tstyler.ColourTo(pos - 1, SCE_RUST_LEXERROR);\n\telse\n\t\tstyler.ColourTo(pos - 1, SCE_RUST_NUMBER);\n}\n\nstatic bool IsOneCharOperator(int c) {\n\treturn c == ';' || c == ',' || c == '(' || c == ')'\n\t    || c == '{' || c == '}' || c == '[' || c == ']'\n\t    || c == '@' || c == '#' || c == '~' || c == '+'\n\t    || c == '*' || c == '/' || c == '^' || c == '%'\n\t    || c == '.' || c == ':' || c == '!' || c == '<'\n\t    || c == '>' || c == '=' || c == '-' || c == '&'\n\t    || c == '|' || c == '$';\n}\n\nstatic bool IsTwoCharOperator(int c, int n) {\n\treturn (c == '.' && n == '.') || (c == ':' && n == ':')\n\t    || (c == '!' && n == '=') || (c == '<' && n == '<')\n\t    || (c == '<' && n == '=') || (c == '>' && n == '>')\n\t    || (c == '>' && n == '=') || (c == '=' && n == '=')\n\t    || (c == '=' && n == '>') || (c == '-' && n == '>')\n\t    || (c == '&' && n == '&') || (c == '|' && n == '|')\n\t    || (c == '-' && n == '=') || (c == '&' && n == '=')\n\t    || (c == '|' && n == '=') || (c == '+' && n == '=')\n\t    || (c == '*' && n == '=') || (c == '/' && n == '=')\n\t    || (c == '^' && n == '=') || (c == '%' && n == '=');\n}\n\nstatic bool IsThreeCharOperator(int c, int n, int n2) {\n\treturn (c == '<' && n == '<' && n2 == '=')\n\t    || (c == '>' && n == '>' && n2 == '=');\n}\n\nstatic bool IsValidCharacterEscape(int c) {\n\treturn c == 'n'  || c == 'r' || c == 't' || c == '\\\\'\n\t    || c == '\\'' || c == '\"' || c == '0';\n}\n\nstatic bool IsValidStringEscape(int c) {\n\treturn IsValidCharacterEscape(c) || c == '\\n';\n}\n\nstatic bool ScanNumericEscape(Accessor &styler, int& pos, int num_digits, bool stop_asap) {\n\tfor (;;) {\n\t\tint c = styler.SafeGetCharAt(pos, '\\0');\n\t\tif (!IsADigit(c, 16))\n\t\t\tbreak;\n\t\tnum_digits--;\n\t\tpos++;\n\t\tif (num_digits == 0 && stop_asap)\n\t\t\treturn true;\n\t}\n\tif (num_digits == 0) {\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n}\n\n/* This is overly permissive for character literals in order to accept UTF-8 encoded\n * character literals. */\nstatic void ScanCharacterLiteralOrLifetime(Accessor &styler, int& pos) {\n\tpos++;\n\tint c = styler.SafeGetCharAt(pos, '\\0');\n\tint n = styler.SafeGetCharAt(pos + 1, '\\0');\n\tbool done = false;\n\tbool valid_lifetime = IsIdentifierStart(c);\n\tbool valid_char = true;\n\tbool first = true;\n\twhile (!done) {\n\t\tswitch (c) {\n\t\t\tcase '\\\\':\n\t\t\t\tdone = true;\n\t\t\t\tif (IsValidCharacterEscape(n)) {\n\t\t\t\t\tpos += 2;\n\t\t\t\t} else if (n == 'x') {\n\t\t\t\t\tpos += 2;\n\t\t\t\t\tvalid_char = ScanNumericEscape(styler, pos, 2, false);\n\t\t\t\t} else if (n == 'u') {\n\t\t\t\t\tpos += 2;\n\t\t\t\t\tvalid_char = ScanNumericEscape(styler, pos, 4, false);\n\t\t\t\t} else if (n == 'U') {\n\t\t\t\t\tpos += 2;\n\t\t\t\t\tvalid_char = ScanNumericEscape(styler, pos, 8, false);\n\t\t\t\t} else {\n\t\t\t\t\tvalid_char = false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '\\'':\n\t\t\t\tvalid_char = !first;\n\t\t\t\tdone = true;\n\t\t\t\tbreak;\n\t\t\tcase '\\t':\n\t\t\tcase '\\n':\n\t\t\tcase '\\r':\n\t\t\tcase '\\0':\n\t\t\t\tvalid_char = false;\n\t\t\t\tdone = true;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (!IsIdentifierContinue(c) && !first) {\n\t\t\t\t\tdone = true;\n\t\t\t\t} else {\n\t\t\t\t\tpos++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\tc = styler.SafeGetCharAt(pos, '\\0');\n\t\tn = styler.SafeGetCharAt(pos + 1, '\\0');\n\n\t\tfirst = false;\n\t}\n\tif (styler.SafeGetCharAt(pos, '\\0') == '\\'') {\n\t\tvalid_lifetime = false;\n\t} else {\n\t\tvalid_char = false;\n\t}\n\tif (valid_lifetime) {\n\t\tstyler.ColourTo(pos - 1, SCE_RUST_LIFETIME);\n\t} else if (valid_char) {\n\t\tpos++;\n\t\tstyler.ColourTo(pos - 1, SCE_RUST_CHARACTER);\n\t} else {\n\t\tstyler.ColourTo(pos - 1, SCE_RUST_LEXERROR);\n\t}\n}\n\nenum CommentState {\n\tUnknownComment,\n\tDocComment,\n\tNotDocComment\n};\n\n/*\n * The rule for block-doc comments is as follows (use x for asterisk)... /xx and /x! start doc comments\n * unless the entire comment is x's.\n */\nstatic void ResumeBlockComment(Accessor &styler, int& pos, int max, CommentState state) {\n\tint c = styler.SafeGetCharAt(pos, '\\0');\n\tbool maybe_doc_comment = false;\n\tbool any_non_asterisk = false;\n\tif (c == '*' || c == '!') {\n\t\tmaybe_doc_comment = true;\n\t}\n\tfor (;;) {\n\t\tif (pos == styler.LineEnd(styler.GetLine(pos)))\n\t\t\tstyler.SetLineState(styler.GetLine(pos), 0);\n\t\tif (c == '*') {\n\t\t\tint n = styler.SafeGetCharAt(pos + 1, '\\0');\n\t\t\tif (n == '/') {\n\t\t\t\tpos += 2;\n\t\t\t\tif (state == DocComment || (state == UnknownComment && maybe_doc_comment && any_non_asterisk))\n\t\t\t\t\tstyler.ColourTo(pos - 1, SCE_RUST_COMMENTBLOCKDOC);\n\t\t\t\telse\n\t\t\t\t\tstyler.ColourTo(pos - 1, SCE_RUST_COMMENTBLOCK);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\tany_non_asterisk = true;\n\t\t}\n\t\tif (c == '\\0' || pos >= max) {\n\t\t\tif (state == DocComment || (state == UnknownComment && maybe_doc_comment))\n\t\t\t\tstyler.ColourTo(pos - 1, SCE_RUST_COMMENTBLOCKDOC);\n\t\t\telse\n\t\t\t\tstyler.ColourTo(pos - 1, SCE_RUST_COMMENTBLOCK);\n\t\t\tbreak;\n\t\t}\n\t\tpos++;\n\t\tc = styler.SafeGetCharAt(pos, '\\0');\n\t}\n}\n\n/*\n * The rule for line-doc comments is as follows... /// and //! start doc comments\n * unless the comment is composed entirely of /'s followed by whitespace. That is:\n * // - comment\n * /// - doc-comment\n * //// - comment\n * ////a - doc-comment\n */\nstatic void ResumeLineComment(Accessor &styler, int& pos, int max, CommentState state) {\n\tbool maybe_doc_comment = false;\n\tint num_leading_slashes = 0;\n\tint c = styler.SafeGetCharAt(pos, '\\0');\n\tif (c == '/') {\n\t\tnum_leading_slashes = 1;\n\t\twhile (pos < max) {\n\t\t\tpos++;\n\t\t\tc = styler.SafeGetCharAt(pos, '\\0');\n\t\t\tif (c == '/') {\n\t\t\t\tnum_leading_slashes++;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else if (c == '!') {\n\t\tmaybe_doc_comment = true;\n\t}\n\n\tbool non_white_space = false;\n\twhile (pos < max && c != '\\n' && c != '\\0') {\n\t\tif (!IsWhitespace(c))\n\t\t\tnon_white_space = true;\n\t\tif (pos == styler.LineEnd(styler.GetLine(pos)))\n\t\t\tstyler.SetLineState(styler.GetLine(pos), 0);\n\t\tpos++;\n\t\tc = styler.SafeGetCharAt(pos, '\\0');\n\t}\n\n\tmaybe_doc_comment |= num_leading_slashes == 1 || (num_leading_slashes > 1 && non_white_space);\n\n\tif (state == DocComment || (state == UnknownComment && maybe_doc_comment))\n\t\tstyler.ColourTo(pos - 1, SCE_RUST_COMMENTLINEDOC);\n\telse\n\t\tstyler.ColourTo(pos - 1, SCE_RUST_COMMENTLINE);\n}\n\nstatic void ScanComments(Accessor &styler, int& pos, int max) {\n\tpos++;\n\tint c = styler.SafeGetCharAt(pos, '\\0');\n\tpos++;\n\tif (c == '/')\n\t\tResumeLineComment(styler, pos, max, UnknownComment);\n\telse if (c == '*')\n\t\tResumeBlockComment(styler, pos, max, UnknownComment);\n}\n\nstatic void ResumeString(Accessor &styler, int& pos, int max) {\n\tint c = styler.SafeGetCharAt(pos, '\\0');\n\tbool error = false;\n\twhile (c != '\"' && !error) {\n\t\tif (c == '\\0' || pos >= max) {\n\t\t\terror = true;\n\t\t\tbreak;\n\t\t}\n\t\tif (pos == styler.LineEnd(styler.GetLine(pos)))\n\t\t\tstyler.SetLineState(styler.GetLine(pos), 0);\n\t\tif (c == '\\\\') {\n\t\t\tint n = styler.SafeGetCharAt(pos + 1, '\\0');\n\t\t\tif (IsValidStringEscape(n)) {\n\t\t\t\tpos += 2;\n\t\t\t} else if (n == 'x') {\n\t\t\t\tpos += 2;\n\t\t\t\terror = !ScanNumericEscape(styler, pos, 2, true);\n\t\t\t} else if (n == 'u') {\n\t\t\t\tpos += 2;\n\t\t\t\terror = !ScanNumericEscape(styler, pos, 4, true);\n\t\t\t} else if (n == 'U') {\n\t\t\t\tpos += 2;\n\t\t\t\terror = !ScanNumericEscape(styler, pos, 8, true);\n\t\t\t} else {\n\t\t\t\tpos += 1;\n\t\t\t\terror = true;\n\t\t\t}\n\t\t} else {\n\t\t\tpos++;\n\t\t}\n\t\tc = styler.SafeGetCharAt(pos, '\\0');\n\t}\n\tif (!error)\n\t\tpos++;\n\tstyler.ColourTo(pos - 1, SCE_RUST_STRING);\n}\n\nstatic void ResumeRawString(Accessor &styler, int& pos, int max, int num_hashes) {\n\tfor (;;) {\n\t\tint c = styler.SafeGetCharAt(pos, '\\0');\n\t\tif (c == '\"') {\n\t\t\tpos++;\n\t\t\tint trailing_num_hashes = 0;\n\t\t\twhile (styler.SafeGetCharAt(pos, '\\0') == '#' && trailing_num_hashes < num_hashes) {\n\t\t\t\ttrailing_num_hashes++;\n\t\t\t\tpos++;\n\t\t\t}\n\t\t\tif (trailing_num_hashes == num_hashes) {\n\t\t\t\tstyler.SetLineState(styler.GetLine(pos), 0);\n\t\t\t\tstyler.ColourTo(pos - 1, SCE_RUST_STRINGR);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else if (c == '\\0' || pos >= max) {\n\t\t\tstyler.ColourTo(pos - 1, SCE_RUST_STRINGR);\n\t\t\tbreak;\n\t\t}\n\t\tif (pos == styler.LineEnd(styler.GetLine(pos)))\n\t\t\tstyler.SetLineState(styler.GetLine(pos), num_hashes);\n\t\tpos++;\n\t}\n}\n\nstatic void ScanRawString(Accessor &styler, int& pos, int max) {\n\tpos++;\n\tint num_hashes = 0;\n\twhile (styler.SafeGetCharAt(pos, '\\0') == '#') {\n\t\tnum_hashes++;\n\t\tpos++;\n\t}\n\tif (styler.SafeGetCharAt(pos, '\\0') != '\"') {\n\t\tstyler.ColourTo(pos - 1, SCE_RUST_LEXERROR);\n\t} else {\n\t\tpos++;\n\t\tResumeRawString(styler, pos, max, num_hashes);\n\t}\n}\n\nvoid SCI_METHOD LexerRust::Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n\tPropSetSimple props;\n\tAccessor styler(pAccess, &props);\n\tint pos = startPos;\n\tint max = pos + length;\n\n\tstyler.StartAt(pos);\n\tstyler.StartSegment(pos);\n\n\tif (initStyle == SCE_RUST_COMMENTBLOCK || initStyle == SCE_RUST_COMMENTBLOCKDOC) {\n\t\tResumeBlockComment(styler, pos, max, initStyle == SCE_RUST_COMMENTBLOCKDOC ? DocComment : NotDocComment);\n\t} else if (initStyle == SCE_RUST_COMMENTLINE || initStyle == SCE_RUST_COMMENTLINEDOC) {\n\t\tResumeLineComment(styler, pos, max, initStyle == SCE_RUST_COMMENTLINEDOC ? DocComment : NotDocComment);\n\t} else if (initStyle == SCE_RUST_STRING) {\n\t\tResumeString(styler, pos, max);\n\t} else if (initStyle == SCE_RUST_STRINGR) {\n\t\tResumeRawString(styler, pos, max, styler.GetLineState(styler.GetLine(pos) - 1));\n\t}\n\n\twhile (pos < max) {\n\t\tint c = styler.SafeGetCharAt(pos, '\\0');\n\t\tint n = styler.SafeGetCharAt(pos + 1, '\\0');\n\t\tint n2 = styler.SafeGetCharAt(pos + 2, '\\0');\n\n\t\tif (pos == 0 && c == '#' && n == '!') {\n\t\t\tpos += 2;\n\t\t\tResumeLineComment(styler, pos, max, NotDocComment);\n\t\t} else if (IsWhitespace(c)) {\n\t\t\tScanWhitespace(styler, pos, max);\n\t\t} else if (c == '/' && (n == '/' || n == '*')) {\n\t\t\tScanComments(styler, pos, max);\n\t\t} else if (c == 'r' && (n == '#' || n == '\"')) {\n\t\t\tScanRawString(styler, pos, max);\n\t\t} else if (IsIdentifierStart(c)) {\n\t\t\tScanIdentifier(styler, pos, keywords);\n\t\t} else if (IsADigit(c)) {\n\t\t\tScanNumber(styler, pos);\n\t\t} else if (IsThreeCharOperator(c, n, n2)) {\n\t\t\tpos += 3;\n\t\t\tstyler.ColourTo(pos - 1, SCE_RUST_OPERATOR);\n\t\t} else if (IsTwoCharOperator(c, n)) {\n\t\t\tpos += 2;\n\t\t\tstyler.ColourTo(pos - 1, SCE_RUST_OPERATOR);\n\t\t} else if (IsOneCharOperator(c)) {\n\t\t\tpos++;\n\t\t\tstyler.ColourTo(pos - 1, SCE_RUST_OPERATOR);\n\t\t} else if (c == '\\'') {\n\t\t\tScanCharacterLiteralOrLifetime(styler, pos);\n\t\t} else if (c == '\"') {\n\t\t\tpos++;\n\t\t\tResumeString(styler, pos, max);\n\t\t} else {\n\t\t\tpos++;\n\t\t\tstyler.ColourTo(pos - 1, SCE_RUST_LEXERROR);\n\t\t}\n\t}\n\tstyler.ColourTo(pos - 1, SCE_RUST_DEFAULT);\n\tstyler.Flush();\n}\n\nvoid SCI_METHOD LexerRust::Fold(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n\n\tif (!options.fold)\n\t\treturn;\n\n\tLexAccessor styler(pAccess);\n\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tbool inLineComment = false;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelCurrent = SC_FOLDLEVELBASE;\n\tif (lineCurrent > 0)\n\t\tlevelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n\tunsigned int lineStartNext = styler.LineStart(lineCurrent+1);\n\tint levelMinCurrent = levelCurrent;\n\tint levelNext = levelCurrent;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tconst bool userDefinedFoldMarkers = !options.foldExplicitStart.empty() && !options.foldExplicitEnd.empty();\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = i == (lineStartNext-1);\n\t\tif ((style == SCE_RUST_COMMENTLINE) || (style == SCE_RUST_COMMENTLINEDOC))\n\t\t\tinLineComment = true;\n\t\tif (options.foldComment && options.foldCommentMultiline && IsStreamCommentStyle(style) && !inLineComment) {\n\t\t\tif (!IsStreamCommentStyle(stylePrev)) {\n\t\t\t\tlevelNext++;\n\t\t\t} else if (!IsStreamCommentStyle(styleNext) && !atEOL) {\n\t\t\t\t// Comments don't end at end of line and the next character may be unstyled.\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\t\tif (options.foldComment && options.foldCommentExplicit && ((style == SCE_RUST_COMMENTLINE) || options.foldExplicitAnywhere)) {\n\t\t\tif (userDefinedFoldMarkers) {\n\t\t\t\tif (styler.Match(i, options.foldExplicitStart.c_str())) {\n\t\t\t\t\tlevelNext++;\n\t\t\t\t} else if (styler.Match(i, options.foldExplicitEnd.c_str())) {\n\t\t\t\t\tlevelNext--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ((ch == '/') && (chNext == '/')) {\n\t\t\t\t\tchar chNext2 = styler.SafeGetCharAt(i + 2);\n\t\t\t\t\tif (chNext2 == '{') {\n\t\t\t\t\t\tlevelNext++;\n\t\t\t\t\t} else if (chNext2 == '}') {\n\t\t\t\t\t\tlevelNext--;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (options.foldSyntaxBased && (style == SCE_RUST_OPERATOR)) {\n\t\t\tif (ch == '{') {\n\t\t\t\t// Measure the minimum before a '{' to allow\n\t\t\t\t// folding on \"} else {\"\n\t\t\t\tif (levelMinCurrent > levelNext) {\n\t\t\t\t\tlevelMinCurrent = levelNext;\n\t\t\t\t}\n\t\t\t\tlevelNext++;\n\t\t\t} else if (ch == '}') {\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\t\tif (!IsASpace(ch))\n\t\t\tvisibleChars++;\n\t\tif (atEOL || (i == endPos-1)) {\n\t\t\tint levelUse = levelCurrent;\n\t\t\tif (options.foldSyntaxBased && options.foldAtElse) {\n\t\t\t\tlevelUse = levelMinCurrent;\n\t\t\t}\n\t\t\tint lev = levelUse | levelNext << 16;\n\t\t\tif (visibleChars == 0 && options.foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (levelUse < levelNext)\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlineStartNext = styler.LineStart(lineCurrent+1);\n\t\t\tlevelCurrent = levelNext;\n\t\t\tlevelMinCurrent = levelCurrent;\n\t\t\tif (atEOL && (i == static_cast<unsigned int>(styler.Length()-1))) {\n\t\t\t\t// There is an empty line at end of file so give it same level and empty\n\t\t\t\tstyler.SetLevel(lineCurrent, (levelCurrent | levelCurrent << 16) | SC_FOLDLEVELWHITEFLAG);\n\t\t\t}\n\t\t\tvisibleChars = 0;\n\t\t\tinLineComment = false;\n\t\t}\n\t}\n}\n\nLexerModule lmRust(SCLEX_RUST, LexerRust::LexerFactoryRust, \"rust\", rustWordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexSML.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexSML.cxx\n ** Lexer for SML.\n **/\n// Copyright 2009 by James Moffatt and Yuzhou Xin\n// Modified from LexCaml.cxx by Robert Roessler <robertr@rftp.com> Copyright 2005\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\ninline int  issml(int c) {return isalnum(c) || c == '_';}\ninline int issmlf(int c) {return isalpha(c) || c == '_';}\ninline int issmld(int c) {return isdigit(c) || c == '_';}\n\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nvoid ColouriseSMLDoc(\n\tunsigned int startPos, int length,\n\tint initStyle,\n\tWordList *keywordlists[],\n\tAccessor &styler)\n{\n\tStyleContext sc(startPos, length, initStyle, styler);\n\tint nesting = 0;\n\tif (sc.state < SCE_SML_STRING)\n\t\tsc.state = SCE_SML_DEFAULT;\n\tif (sc.state >= SCE_SML_COMMENT)\n\t\tnesting = (sc.state & 0x0f) - SCE_SML_COMMENT;\n\n\tint chBase = 0, chToken = 0, chLit = 0;\n\tWordList& keywords  = *keywordlists[0];\n\tWordList& keywords2 = *keywordlists[1];\n\tWordList& keywords3 = *keywordlists[2];\n\tconst int useMagic = styler.GetPropertyInt(\"lexer.caml.magic\", 0);\n\n\twhile (sc.More()) {\n\t\tint state2 = -1;\n\t\tint chColor = sc.currentPos - 1;\n\t\tbool advance = true;\n\n\t\tswitch (sc.state & 0x0f) {\n\t\tcase SCE_SML_DEFAULT:\n\t\t\tchToken = sc.currentPos;\n\t\t\tif (issmlf(sc.ch))\n\t\t\t\tstate2 = SCE_SML_IDENTIFIER;\n\t\t\telse if (sc.Match('`') && issmlf(sc.chNext))\n\t\t\t\tstate2 = SCE_SML_TAGNAME;\n\t\t\telse if (sc.Match('#')&&isdigit(sc.chNext))\n\t\t\t\t\tstate2 = SCE_SML_LINENUM;\n\t\t\telse if (sc.Match('#','\\\"')){\n\t\t\t\t\tstate2 = SCE_SML_CHAR,chLit = 0;\n\t\t\t\t\tsc.Forward();\n\n\t\t\t\t}\n\t\t\telse if (isdigit(sc.ch)) {\n\t\t\t\tstate2 = SCE_SML_NUMBER, chBase = 10;\n\t\t\t\tif (sc.Match('0') && strchr(\"xX\", sc.chNext))\n\t\t\t\t\tchBase = 16, sc.Forward();}\n\t\t\telse if (sc.Match('\\\"')&&sc.chPrev!='#')\n\t\t\t\tstate2 = SCE_SML_STRING;\n\t\t\telse if (sc.Match('(', '*')){\n\t\t\t\tstate2 = SCE_SML_COMMENT,\n\t\t\t\t\tsc.ch = ' ',\n\t\t\t\t\tsc.Forward();}\n\t\t\telse if (strchr(\"!~\"\n\t\t\t\t\t\"=<>@^+-*/\"\n\t\t\t\t\t\"()[];,:.#\", sc.ch))\n\t\t\t\tstate2 = SCE_SML_OPERATOR;\n\t\t\tbreak;\n\n\t\tcase SCE_SML_IDENTIFIER:\n\t\t\tif (!(issml(sc.ch) || sc.Match('\\''))) {\n\t\t\t\tconst int n = sc.currentPos - chToken;\n\t\t\t\tif (n < 24) {\n\t\t\t\t\tchar t[24];\n\t\t\t\t\tfor (int i = -n; i < 0; i++)\n\t\t\t\t\t\tt[n + i] = static_cast<char>(sc.GetRelative(i));\n\t\t\t\t\tt[n] = '\\0';\n\t\t\t\t\tif ((n == 1 && sc.chPrev == '_') || keywords.InList(t))\n\t\t\t\t\t\tsc.ChangeState(SCE_SML_KEYWORD);\n\t\t\t\t\telse if (keywords2.InList(t))\n\t\t\t\t\t\tsc.ChangeState(SCE_SML_KEYWORD2);\n\t\t\t\t\telse if (keywords3.InList(t))\n\t\t\t\t\t\tsc.ChangeState(SCE_SML_KEYWORD3);\n\t\t\t\t}\n\t\t\t\tstate2 = SCE_SML_DEFAULT, advance = false;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase SCE_SML_TAGNAME:\n\t\t\tif (!(issml(sc.ch) || sc.Match('\\'')))\n\t\t\t\tstate2 = SCE_SML_DEFAULT, advance = false;\n\t\t\tbreak;\n\n\t\tcase SCE_SML_LINENUM:\n\t\t\tif (!isdigit(sc.ch))\n\t\t\t\tstate2 = SCE_SML_DEFAULT, advance = false;\n\t\t\tbreak;\n\n\t\tcase SCE_SML_OPERATOR: {\n\t\t\tconst char* o = 0;\n\t\t\tif (issml(sc.ch) || isspace(sc.ch)\n\t\t\t\t|| (o = strchr(\")]};,\\'\\\"`#\", sc.ch),o)\n\t\t\t\t|| !strchr(\"!$%&*+-./:<=>?@^|~\", sc.ch)) {\n\t\t\t\tif (o && strchr(\")]};,\", sc.ch)) {\n\t\t\t\t\tif ((sc.Match(')') && sc.chPrev == '(')\n\t\t\t\t\t\t|| (sc.Match(']') && sc.chPrev == '['))\n\t\t\t\t\t\tsc.ChangeState(SCE_SML_KEYWORD);\n\t\t\t\t\tchColor++;\n\t\t\t\t} else\n\t\t\t\t\tadvance = false;\n\t\t\t\tstate2 = SCE_SML_DEFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase SCE_SML_NUMBER:\n\t\t\tif (issmld(sc.ch) || IsADigit(sc.ch, chBase))\n\t\t\t\tbreak;\n\t\t\tif ((sc.Match('l') || sc.Match('L') || sc.Match('n'))\n\t\t\t\t&& (issmld(sc.chPrev) || IsADigit(sc.chPrev, chBase)))\n\t\t\t\tbreak;\n\t\t\tif (chBase == 10) {\n\t\t\t\tif (sc.Match('.') && issmld(sc.chPrev))\n\t\t\t\t\tbreak;\n\t\t\t\tif ((sc.Match('e') || sc.Match('E'))\n\t\t\t\t\t&& (issmld(sc.chPrev) || sc.chPrev == '.'))\n\t\t\t\t\tbreak;\n\t\t\t\tif ((sc.Match('+') || sc.Match('-'))\n\t\t\t\t\t&& (sc.chPrev == 'e' || sc.chPrev == 'E'))\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tstate2 = SCE_SML_DEFAULT, advance = false;\n\t\t\tbreak;\n\n\t\tcase SCE_SML_CHAR:\n\t\t\tif (sc.Match('\\\\')) {\n\t\t\t\tchLit = 1;\n\t\t\t\tif (sc.chPrev == '\\\\')\n\t\t\t\t\tsc.ch = ' ';\n\t\t\t} else if ((sc.Match('\\\"') && sc.chPrev != '\\\\') || sc.atLineEnd) {\n\t\t\t\tstate2 = SCE_SML_DEFAULT;\n\t\t\t\tchLit = 1;\n\t\t\t\tif (sc.Match('\\\"'))\n\t\t\t\t\tchColor++;\n\t\t\t\telse\n\t\t\t\t\tsc.ChangeState(SCE_SML_IDENTIFIER);\n\t\t\t} else if (chLit < 1 && sc.currentPos - chToken >= 3)\n\t\t\t\tsc.ChangeState(SCE_SML_IDENTIFIER), advance = false;\n\t\t\tbreak;\n\n\t\tcase SCE_SML_STRING:\n\t\t\tif (sc.Match('\\\\') && sc.chPrev == '\\\\')\n\t\t\t\tsc.ch = ' ';\n\t\t\telse if (sc.Match('\\\"') && sc.chPrev != '\\\\')\n\t\t\t\tstate2 = SCE_SML_DEFAULT, chColor++;\n\t\t\tbreak;\n\n\t\tcase SCE_SML_COMMENT:\n\t\tcase SCE_SML_COMMENT1:\n\t\tcase SCE_SML_COMMENT2:\n\t\tcase SCE_SML_COMMENT3:\n\t\t\tif (sc.Match('(', '*'))\n\t\t\t\tstate2 = sc.state + 1, chToken = sc.currentPos,\n\t\t\t\t\tsc.ch = ' ',\n\t\t\t\t\tsc.Forward(), nesting++;\n\t\t\telse if (sc.Match(')') && sc.chPrev == '*') {\n\t\t\t\tif (nesting)\n\t\t\t\t\tstate2 = (sc.state & 0x0f) - 1, chToken = 0, nesting--;\n\t\t\t\telse\n\t\t\t\t\tstate2 = SCE_SML_DEFAULT;\n\t\t\t\tchColor++;\n\t\t\t} else if (useMagic && sc.currentPos - chToken == 4\n\t\t\t\t&& sc.Match('c') && sc.chPrev == 'r' && sc.GetRelative(-2) == '@')\n\t\t\t\tsc.state |= 0x10;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (state2 >= 0)\n\t\t\tstyler.ColourTo(chColor, sc.state), sc.ChangeState(state2);\n\t\tif (advance)\n\t\t\tsc.Forward();\n\t}\n\n\tsc.Complete();\n}\n\nvoid FoldSMLDoc(\n\tunsigned int, int,\n\tint,\n\tWordList *[],\n\tAccessor &)\n{\n}\n\nstatic const char * const SMLWordListDesc[] = {\n\t\"Keywords\",\n\t\"Keywords2\",\n\t\"Keywords3\",\n\t0\n};\n\nLexerModule lmSML(SCLEX_SML, ColouriseSMLDoc, \"SML\", FoldSMLDoc, SMLWordListDesc);\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexSQL.cpp",
    "content": "//-*- coding: utf-8 -*-\n// Scintilla source code edit control\n/** @file LexSQL.cxx\n ** Lexer for SQL, including PL/SQL and SQL*Plus.\n ** Improved by Jérôme LAFORGE <jerome.laforge_AT_gmail_DOT_com> from 2010 to 2012.\n **/\n// Copyright 1998-2012 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include <string>\n#include <vector>\n#include <map>\n#include <algorithm>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n#include \"OptionSet.h\"\n#include \"SparseState.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(int ch, bool sqlAllowDottedWord) {\n\tif (!sqlAllowDottedWord)\n\t\treturn (ch < 0x80) && (isalnum(ch) || ch == '_');\n\telse\n\t\treturn (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.');\n}\n\nstatic inline bool IsAWordStart(int ch) {\n\treturn (ch < 0x80) && (isalpha(ch) || ch == '_');\n}\n\nstatic inline bool IsADoxygenChar(int ch) {\n\treturn (islower(ch) || ch == '$' || ch == '@' ||\n\t        ch == '\\\\' || ch == '&' || ch == '<' ||\n\t        ch == '>' || ch == '#' || ch == '{' ||\n\t        ch == '}' || ch == '[' || ch == ']');\n}\n\nstatic inline bool IsANumberChar(int ch) {\n\t// Not exactly following number definition (several dots are seen as OK, etc.)\n\t// but probably enough in most cases.\n\treturn (ch < 0x80) &&\n\t       (isdigit(ch) || toupper(ch) == 'E' ||\n\t        ch == '.' || ch == '-' || ch == '+');\n}\n\ntypedef unsigned int sql_state_t;\n\nclass SQLStates {\npublic :\n\tvoid Set(int lineNumber, unsigned short int sqlStatesLine) {\n\t\tsqlStatement.Set(lineNumber, sqlStatesLine);\n\t}\n\n\tsql_state_t IgnoreWhen (sql_state_t sqlStatesLine, bool enable) {\n\t\tif (enable)\n\t\t\tsqlStatesLine |= MASK_IGNORE_WHEN;\n\t\telse\n\t\t\tsqlStatesLine &= ~MASK_IGNORE_WHEN;\n\n\t\treturn sqlStatesLine;\n\t}\n\n\tsql_state_t IntoCondition (sql_state_t sqlStatesLine, bool enable) {\n\t\tif (enable)\n\t\t\tsqlStatesLine |= MASK_INTO_CONDITION;\n\t\telse\n\t\t\tsqlStatesLine &= ~MASK_INTO_CONDITION;\n\n\t\treturn sqlStatesLine;\n\t}\n\n\tsql_state_t IntoExceptionBlock (sql_state_t sqlStatesLine, bool enable) {\n\t\tif (enable)\n\t\t\tsqlStatesLine |= MASK_INTO_EXCEPTION;\n\t\telse\n\t\t\tsqlStatesLine &= ~MASK_INTO_EXCEPTION;\n\n\t\treturn sqlStatesLine;\n\t}\n\n\tsql_state_t IntoDeclareBlock (sql_state_t sqlStatesLine, bool enable) {\n\t\tif (enable)\n\t\t\tsqlStatesLine |= MASK_INTO_DECLARE;\n\t\telse\n\t\t\tsqlStatesLine &= ~MASK_INTO_DECLARE;\n\n\t\treturn sqlStatesLine;\n\t}\n\n\tsql_state_t IntoMergeStatement (sql_state_t sqlStatesLine, bool enable) {\n\t\tif (enable)\n\t\t\tsqlStatesLine |= MASK_MERGE_STATEMENT;\n\t\telse\n\t\t\tsqlStatesLine &= ~MASK_MERGE_STATEMENT;\n\n\t\treturn sqlStatesLine;\n\t}\n\n\tsql_state_t CaseMergeWithoutWhenFound (sql_state_t sqlStatesLine, bool found) {\n\t\tif (found)\n\t\t\tsqlStatesLine |= MASK_CASE_MERGE_WITHOUT_WHEN_FOUND;\n\t\telse\n\t\t\tsqlStatesLine &= ~MASK_CASE_MERGE_WITHOUT_WHEN_FOUND;\n\n\t\treturn sqlStatesLine;\n\t}\n\tsql_state_t IntoSelectStatementOrAssignment (sql_state_t sqlStatesLine, bool found) {\n\t\tif (found)\n\t\t\tsqlStatesLine |= MASK_INTO_SELECT_STATEMENT_OR_ASSIGNEMENT;\n\t\telse\n\t\t\tsqlStatesLine &= ~MASK_INTO_SELECT_STATEMENT_OR_ASSIGNEMENT;\n\t\treturn sqlStatesLine;\n\t}\n\n\tsql_state_t BeginCaseBlock (sql_state_t sqlStatesLine) {\n\t\tif ((sqlStatesLine & MASK_NESTED_CASES) < MASK_NESTED_CASES) {\n\t\t\tsqlStatesLine++;\n\t\t}\n\t\treturn sqlStatesLine;\n\t}\n\n\tsql_state_t EndCaseBlock (sql_state_t sqlStatesLine) {\n\t\tif ((sqlStatesLine & MASK_NESTED_CASES) > 0) {\n\t\t\tsqlStatesLine--;\n\t\t}\n\t\treturn sqlStatesLine;\n\t}\n\n\tsql_state_t IntoCreateStatement (sql_state_t sqlStatesLine, bool enable) {\n\t\tif (enable)\n\t\t\tsqlStatesLine |= MASK_INTO_CREATE;\n\t\telse\n\t\t\tsqlStatesLine &= ~MASK_INTO_CREATE;\n\n\t\treturn sqlStatesLine;\n\t}\n\n\tsql_state_t IntoCreateViewStatement (sql_state_t sqlStatesLine, bool enable) {\n\t\tif (enable)\n\t\t\tsqlStatesLine |= MASK_INTO_CREATE_VIEW;\n\t\telse\n\t\t\tsqlStatesLine &= ~MASK_INTO_CREATE_VIEW;\n\n\t\treturn sqlStatesLine;\n\t}\n\n\tsql_state_t IntoCreateViewAsStatement (sql_state_t sqlStatesLine, bool enable) {\n\t\tif (enable)\n\t\t\tsqlStatesLine |= MASK_INTO_CREATE_VIEW_AS_STATEMENT;\n\t\telse\n\t\t\tsqlStatesLine &= ~MASK_INTO_CREATE_VIEW_AS_STATEMENT;\n\n\t\treturn sqlStatesLine;\n\t}\n\n\tbool IsIgnoreWhen (sql_state_t sqlStatesLine) {\n\t\treturn (sqlStatesLine & MASK_IGNORE_WHEN) != 0;\n\t}\n\n\tbool IsIntoCondition (sql_state_t sqlStatesLine) {\n\t\treturn (sqlStatesLine & MASK_INTO_CONDITION) != 0;\n\t}\n\n\tbool IsIntoCaseBlock (sql_state_t sqlStatesLine) {\n\t\treturn (sqlStatesLine & MASK_NESTED_CASES) != 0;\n\t}\n\n\tbool IsIntoExceptionBlock (sql_state_t sqlStatesLine) {\n\t\treturn (sqlStatesLine & MASK_INTO_EXCEPTION) != 0;\n\t}\n\tbool IsIntoSelectStatementOrAssignment (sql_state_t sqlStatesLine) {\n\t\treturn (sqlStatesLine & MASK_INTO_SELECT_STATEMENT_OR_ASSIGNEMENT) != 0;\n\t}\n\tbool IsCaseMergeWithoutWhenFound (sql_state_t sqlStatesLine) {\n\t\treturn (sqlStatesLine & MASK_CASE_MERGE_WITHOUT_WHEN_FOUND) != 0;\n\t}\n\n\tbool IsIntoDeclareBlock (sql_state_t sqlStatesLine) {\n\t\treturn (sqlStatesLine & MASK_INTO_DECLARE) != 0;\n\t}\n\n\tbool IsIntoMergeStatement (sql_state_t sqlStatesLine) {\n\t\treturn (sqlStatesLine & MASK_MERGE_STATEMENT) != 0;\n\t}\n\n\tbool IsIntoCreateStatement (sql_state_t sqlStatesLine) {\n\t\treturn (sqlStatesLine & MASK_INTO_CREATE) != 0;\n\t}\n\n\tbool IsIntoCreateViewStatement (sql_state_t sqlStatesLine) {\n\t\treturn (sqlStatesLine & MASK_INTO_CREATE_VIEW) != 0;\n\t}\n\n\tbool IsIntoCreateViewAsStatement (sql_state_t sqlStatesLine) {\n\t\treturn (sqlStatesLine & MASK_INTO_CREATE_VIEW_AS_STATEMENT) != 0;\n\t}\n\n\tsql_state_t ForLine(int lineNumber) {\n\t\treturn sqlStatement.ValueAt(lineNumber);\n\t}\n\n\tSQLStates() {}\n\nprivate :\n\tSparseState <sql_state_t> sqlStatement;\n\tenum {\n\t\tMASK_NESTED_CASES                         = 0x0001FF,\n\t\tMASK_INTO_SELECT_STATEMENT_OR_ASSIGNEMENT = 0x000200,\n\t\tMASK_CASE_MERGE_WITHOUT_WHEN_FOUND        = 0x000400,\n\t\tMASK_MERGE_STATEMENT                      = 0x000800,\n\t\tMASK_INTO_DECLARE                         = 0x001000,\n\t\tMASK_INTO_EXCEPTION                       = 0x002000,\n\t\tMASK_INTO_CONDITION                       = 0x004000,\n\t\tMASK_IGNORE_WHEN                          = 0x008000,\n\t\tMASK_INTO_CREATE                          = 0x010000,\n\t\tMASK_INTO_CREATE_VIEW                     = 0x020000,\n\t\tMASK_INTO_CREATE_VIEW_AS_STATEMENT        = 0x040000\n\t};\n};\n\n// Options used for LexerSQL\nstruct OptionsSQL {\n\tbool fold;\n\tbool foldAtElse;\n\tbool foldComment;\n\tbool foldCompact;\n\tbool foldOnlyBegin;\n\tbool sqlBackticksIdentifier;\n\tbool sqlNumbersignComment;\n\tbool sqlBackslashEscapes;\n\tbool sqlAllowDottedWord;\n\tOptionsSQL() {\n\t\tfold = false;\n\t\tfoldAtElse = false;\n\t\tfoldComment = false;\n\t\tfoldCompact = false;\n\t\tfoldOnlyBegin = false;\n\t\tsqlBackticksIdentifier = false;\n\t\tsqlNumbersignComment = false;\n\t\tsqlBackslashEscapes = false;\n\t\tsqlAllowDottedWord = false;\n\t}\n};\n\nstatic const char * const sqlWordListDesc[] = {\n\t\"Keywords\",\n\t\"Database Objects\",\n\t\"PLDoc\",\n\t\"SQL*Plus\",\n\t\"User Keywords 1\",\n\t\"User Keywords 2\",\n\t\"User Keywords 3\",\n\t\"User Keywords 4\",\n\t0\n};\n\nstruct OptionSetSQL : public OptionSet<OptionsSQL> {\n\tOptionSetSQL() {\n\t\tDefineProperty(\"fold\", &OptionsSQL::fold);\n\n\t\tDefineProperty(\"fold.sql.at.else\", &OptionsSQL::foldAtElse,\n\t\t               \"This option enables SQL folding on a \\\"ELSE\\\" and \\\"ELSIF\\\" line of an IF statement.\");\n\n\t\tDefineProperty(\"fold.comment\", &OptionsSQL::foldComment);\n\n\t\tDefineProperty(\"fold.compact\", &OptionsSQL::foldCompact);\n\n\t\tDefineProperty(\"fold.sql.only.begin\", &OptionsSQL::foldOnlyBegin);\n\n\t\tDefineProperty(\"lexer.sql.backticks.identifier\", &OptionsSQL::sqlBackticksIdentifier);\n\n\t\tDefineProperty(\"lexer.sql.numbersign.comment\", &OptionsSQL::sqlNumbersignComment,\n\t\t               \"If \\\"lexer.sql.numbersign.comment\\\" property is set to 0 a line beginning with '#' will not be a comment.\");\n\n\t\tDefineProperty(\"sql.backslash.escapes\", &OptionsSQL::sqlBackslashEscapes,\n\t\t               \"Enables backslash as an escape character in SQL.\");\n\n\t\tDefineProperty(\"lexer.sql.allow.dotted.word\", &OptionsSQL::sqlAllowDottedWord,\n\t\t               \"Set to 1 to colourise recognized words with dots \"\n\t\t               \"(recommended for Oracle PL/SQL objects).\");\n\n\t\tDefineWordListSets(sqlWordListDesc);\n\t}\n};\n\nclass LexerSQL : public ILexer {\npublic :\n\tLexerSQL() {}\n\n\tvirtual ~LexerSQL() {}\n\n\tint SCI_METHOD Version () const {\n\t\treturn lvOriginal;\n\t}\n\n\tvoid SCI_METHOD Release() {\n\t\tdelete this;\n\t}\n\n\tconst char * SCI_METHOD PropertyNames() {\n\t\treturn osSQL.PropertyNames();\n\t}\n\n\tint SCI_METHOD PropertyType(const char *name) {\n\t\treturn osSQL.PropertyType(name);\n\t}\n\n\tconst char * SCI_METHOD DescribeProperty(const char *name) {\n\t\treturn osSQL.DescribeProperty(name);\n\t}\n\n\tint SCI_METHOD PropertySet(const char *key, const char *val) {\n\t\tif (osSQL.PropertySet(&options, key, val)) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn -1;\n\t}\n\n\tconst char * SCI_METHOD DescribeWordListSets() {\n\t\treturn osSQL.DescribeWordListSets();\n\t}\n\n\tint SCI_METHOD WordListSet(int n, const char *wl);\n\tvoid SCI_METHOD Lex (unsigned int startPos, int lengthDoc, int initStyle, IDocument *pAccess);\n\tvoid SCI_METHOD Fold(unsigned int startPos, int lengthDoc, int initStyle, IDocument *pAccess);\n\n\tvoid * SCI_METHOD PrivateCall(int, void *) {\n\t\treturn 0;\n\t}\n\n\tstatic ILexer *LexerFactorySQL() {\n\t\treturn new LexerSQL();\n\t}\nprivate:\n\tbool IsStreamCommentStyle(int style) {\n\t\treturn style == SCE_SQL_COMMENT ||\n\t\t       style == SCE_SQL_COMMENTDOC ||\n\t\t       style == SCE_SQL_COMMENTDOCKEYWORD ||\n\t\t       style == SCE_SQL_COMMENTDOCKEYWORDERROR;\n\t}\n\n\tbool IsCommentStyle (int style) {\n\t\tswitch (style) {\n\t\tcase SCE_SQL_COMMENT :\n\t\tcase SCE_SQL_COMMENTDOC :\n\t\tcase SCE_SQL_COMMENTLINE :\n\t\tcase SCE_SQL_COMMENTLINEDOC :\n\t\tcase SCE_SQL_COMMENTDOCKEYWORD :\n\t\tcase SCE_SQL_COMMENTDOCKEYWORDERROR :\n\t\t\treturn true;\n\t\tdefault :\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tbool IsCommentLine (int line, LexAccessor &styler) {\n\t\tint pos = styler.LineStart(line);\n\t\tint eol_pos = styler.LineStart(line + 1) - 1;\n\t\tfor (int i = pos; i + 1 < eol_pos; i++) {\n\t\t\tint style = styler.StyleAt(i);\n\t\t\t// MySQL needs -- comments to be followed by space or control char\n\t\t\tif (style == SCE_SQL_COMMENTLINE && styler.Match(i, \"--\"))\n\t\t\t\treturn true;\n\t\t\telse if (!IsASpaceOrTab(styler[i]))\n\t\t\t\treturn false;\n\t\t}\n\t\treturn false;\n\t}\n\n\tOptionsSQL options;\n\tOptionSetSQL osSQL;\n\tSQLStates sqlStates;\n\n\tWordList keywords1;\n\tWordList keywords2;\n\tWordList kw_pldoc;\n\tWordList kw_sqlplus;\n\tWordList kw_user1;\n\tWordList kw_user2;\n\tWordList kw_user3;\n\tWordList kw_user4;\n};\n\nint SCI_METHOD LexerSQL::WordListSet(int n, const char *wl) {\n\tWordList *wordListN = 0;\n\tswitch (n) {\n\tcase 0:\n\t\twordListN = &keywords1;\n\t\tbreak;\n\tcase 1:\n\t\twordListN = &keywords2;\n\t\tbreak;\n\tcase 2:\n\t\twordListN = &kw_pldoc;\n\t\tbreak;\n\tcase 3:\n\t\twordListN = &kw_sqlplus;\n\t\tbreak;\n\tcase 4:\n\t\twordListN = &kw_user1;\n\t\tbreak;\n\tcase 5:\n\t\twordListN = &kw_user2;\n\t\tbreak;\n\tcase 6:\n\t\twordListN = &kw_user3;\n\t\tbreak;\n\tcase 7:\n\t\twordListN = &kw_user4;\n\t}\n\tint firstModification = -1;\n\tif (wordListN) {\n\t\tWordList wlNew;\n\t\twlNew.Set(wl);\n\t\tif (*wordListN != wlNew) {\n\t\t\twordListN->Set(wl);\n\t\t\tfirstModification = 0;\n\t\t}\n\t}\n\treturn firstModification;\n}\n\nvoid SCI_METHOD LexerSQL::Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n\tLexAccessor styler(pAccess);\n\tStyleContext sc(startPos, length, initStyle, styler);\n\tint styleBeforeDCKeyword = SCE_SQL_DEFAULT;\n\tint offset = 0;\n\tfor (; sc.More(); sc.Forward(), offset++) {\n\t\t// Determine if the current state should terminate.\n\t\tswitch (sc.state) {\n\t\tcase SCE_SQL_OPERATOR:\n\t\t\tsc.SetState(SCE_SQL_DEFAULT);\n\t\t\tbreak;\n\t\tcase SCE_SQL_NUMBER:\n\t\t\t// We stop the number definition on non-numerical non-dot non-eE non-sign char\n\t\t\tif (!IsANumberChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_SQL_DEFAULT);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_SQL_IDENTIFIER:\n\t\t\tif (!IsAWordChar(sc.ch, options.sqlAllowDottedWord)) {\n\t\t\t\tint nextState = SCE_SQL_DEFAULT;\n\t\t\t\tchar s[1000];\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\tif (keywords1.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_SQL_WORD);\n\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_SQL_WORD2);\n\t\t\t\t} else if (kw_sqlplus.InListAbbreviated(s, '~')) {\n\t\t\t\t\tsc.ChangeState(SCE_SQL_SQLPLUS);\n\t\t\t\t\tif (strncmp(s, \"rem\", 3) == 0) {\n\t\t\t\t\t\tnextState = SCE_SQL_SQLPLUS_COMMENT;\n\t\t\t\t\t} else if (strncmp(s, \"pro\", 3) == 0) {\n\t\t\t\t\t\tnextState = SCE_SQL_SQLPLUS_PROMPT;\n\t\t\t\t\t}\n\t\t\t\t} else if (kw_user1.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_SQL_USER1);\n\t\t\t\t} else if (kw_user2.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_SQL_USER2);\n\t\t\t\t} else if (kw_user3.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_SQL_USER3);\n\t\t\t\t} else if (kw_user4.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_SQL_USER4);\n\t\t\t\t}\n\t\t\t\tsc.SetState(nextState);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_SQL_QUOTEDIDENTIFIER:\n\t\t\tif (sc.ch == 0x60) {\n\t\t\t\tif (sc.chNext == 0x60) {\n\t\t\t\t\tsc.Forward();\t// Ignore it\n\t\t\t\t} else {\n\t\t\t\t\tsc.ForwardSetState(SCE_SQL_DEFAULT);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_SQL_COMMENT:\n\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.ForwardSetState(SCE_SQL_DEFAULT);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_SQL_COMMENTDOC:\n\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.ForwardSetState(SCE_SQL_DEFAULT);\n\t\t\t} else if (sc.ch == '@' || sc.ch == '\\\\') { // Doxygen support\n\t\t\t\t// Verify that we have the conditions to mark a comment-doc-keyword\n\t\t\t\tif ((IsASpace(sc.chPrev) || sc.chPrev == '*') && (!IsASpace(sc.chNext))) {\n\t\t\t\t\tstyleBeforeDCKeyword = SCE_SQL_COMMENTDOC;\n\t\t\t\t\tsc.SetState(SCE_SQL_COMMENTDOCKEYWORD);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_SQL_COMMENTLINE:\n\t\tcase SCE_SQL_COMMENTLINEDOC:\n\t\tcase SCE_SQL_SQLPLUS_COMMENT:\n\t\tcase SCE_SQL_SQLPLUS_PROMPT:\n\t\t\tif (sc.atLineStart) {\n\t\t\t\tsc.SetState(SCE_SQL_DEFAULT);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_SQL_COMMENTDOCKEYWORD:\n\t\t\tif ((styleBeforeDCKeyword == SCE_SQL_COMMENTDOC) && sc.Match('*', '/')) {\n\t\t\t\tsc.ChangeState(SCE_SQL_COMMENTDOCKEYWORDERROR);\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.ForwardSetState(SCE_SQL_DEFAULT);\n\t\t\t} else if (!IsADoxygenChar(sc.ch)) {\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\tif (!isspace(sc.ch) || !kw_pldoc.InList(s + 1)) {\n\t\t\t\t\tsc.ChangeState(SCE_SQL_COMMENTDOCKEYWORDERROR);\n\t\t\t\t}\n\t\t\t\tsc.SetState(styleBeforeDCKeyword);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_SQL_CHARACTER:\n\t\t\tif (options.sqlBackslashEscapes && sc.ch == '\\\\') {\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tif (sc.chNext == '\\\"') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} else {\n\t\t\t\t\tsc.ForwardSetState(SCE_SQL_DEFAULT);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SCE_SQL_STRING:\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\t// Escape sequence\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tif (sc.chNext == '\\\"') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} else {\n\t\t\t\t\tsc.ForwardSetState(SCE_SQL_DEFAULT);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_SQL_DEFAULT) {\n\t\t\tif (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_SQL_NUMBER);\n\t\t\t} else if (IsAWordStart(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_SQL_IDENTIFIER);\n\t\t\t} else if (sc.ch == 0x60 && options.sqlBackticksIdentifier) {\n\t\t\t\tsc.SetState(SCE_SQL_QUOTEDIDENTIFIER);\n\t\t\t} else if (sc.Match('/', '*')) {\n\t\t\t\tif (sc.Match(\"/**\") || sc.Match(\"/*!\")) {\t// Support of Doxygen doc. style\n\t\t\t\t\tsc.SetState(SCE_SQL_COMMENTDOC);\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_SQL_COMMENT);\n\t\t\t\t}\n\t\t\t\tsc.Forward();\t// Eat the * so it isn't used for the end of the comment\n\t\t\t} else if (sc.Match('-', '-')) {\n\t\t\t\t// MySQL requires a space or control char after --\n\t\t\t\t// http://dev.mysql.com/doc/mysql/en/ansi-diff-comments.html\n\t\t\t\t// Perhaps we should enforce that with proper property:\n\t\t\t\t//~ \t\t\t} else if (sc.Match(\"-- \")) {\n\t\t\t\tsc.SetState(SCE_SQL_COMMENTLINE);\n\t\t\t} else if (sc.ch == '#' && options.sqlNumbersignComment) {\n\t\t\t\tsc.SetState(SCE_SQL_COMMENTLINEDOC);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_SQL_CHARACTER);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_SQL_STRING);\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch))) {\n\t\t\t\tsc.SetState(SCE_SQL_OPERATOR);\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n}\n\nvoid SCI_METHOD LexerSQL::Fold(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n\tif (!options.fold)\n\t\treturn;\n\tLexAccessor styler(pAccess);\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelCurrent = SC_FOLDLEVELBASE;\n\n\tif (lineCurrent > 0) {\n\t\t// Backtrack to previous line in case need to fix its fold status for folding block of single-line comments (i.e. '--').\n\t\tint lastNLPos = -1;\n\t\t// And keep going back until we find an operator ';' followed\n\t\t// by white-space and/or comments. This will improve folding.\n\t\twhile (--startPos > 0) {\n\t\t\tchar ch = styler[startPos];\n\t\t\tif (ch == '\\n' || (ch == '\\r' && styler[startPos + 1] != '\\n')) {\n\t\t\t\tlastNLPos = startPos;\n\t\t\t} else if (ch == ';' &&\n\t\t\t\t   styler.StyleAt(startPos) == SCE_SQL_OPERATOR) {\n\t\t\t\tbool isAllClear = true;\n\t\t\t\tfor (int tempPos = startPos + 1;\n\t\t\t\t     tempPos < lastNLPos;\n\t\t\t\t     ++tempPos) {\n\t\t\t\t\tint tempStyle = styler.StyleAt(tempPos);\n\t\t\t\t\tif (!IsCommentStyle(tempStyle)\n\t\t\t\t\t    && tempStyle != SCE_SQL_DEFAULT) {\n\t\t\t\t\t\tisAllClear = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isAllClear) {\n\t\t\t\t\tstartPos = lastNLPos + 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlineCurrent = styler.GetLine(startPos);\n\t\tif (lineCurrent > 0)\n\t\t\tlevelCurrent = styler.LevelAt(lineCurrent - 1) >> 16;\n\t}\n\t// And because folding ends at ';', keep going until we find one\n\t// Otherwise if create ... view ... as is split over multiple\n\t// lines the folding won't always update immediately.\n\tunsigned int docLength = styler.Length();\n\tfor (; endPos < docLength; ++endPos) {\n\t\tif (styler.SafeGetCharAt(endPos) == ';') {\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tint levelNext = levelCurrent;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tbool endFound = false;\n\tbool isUnfoldingIgnored = false;\n\t// this statementFound flag avoids to fold when the statement is on only one line by ignoring ELSE or ELSIF\n\t// eg. \"IF condition1 THEN ... ELSIF condition2 THEN ... ELSE ... END IF;\"\n\tbool statementFound = false;\n\tsql_state_t sqlStatesCurrentLine = 0;\n\tif (!options.foldOnlyBegin) {\n\t\tsqlStatesCurrentLine = sqlStates.ForLine(lineCurrent);\n\t}\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (atEOL || (!IsCommentStyle(style) && ch == ';')) {\n\t\t\tif (endFound) {\n\t\t\t\t//Maybe this is the end of \"EXCEPTION\" BLOCK (eg. \"BEGIN ... EXCEPTION ... END;\")\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoExceptionBlock(sqlStatesCurrentLine, false);\n\t\t\t}\n\t\t\t// set endFound and isUnfoldingIgnored to false if EOL is reached or ';' is found\n\t\t\tendFound = false;\n\t\t\tisUnfoldingIgnored = false;\n\t\t}\n\t\tif ((!IsCommentStyle(style) && ch == ';')) {\n\t\t\tif (sqlStates.IsIntoMergeStatement(sqlStatesCurrentLine)) {\n\t\t\t\t// This is the end of \"MERGE\" statement.\n\t\t\t\tif (!sqlStates.IsCaseMergeWithoutWhenFound(sqlStatesCurrentLine))\n\t\t\t\t\tlevelNext--;\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoMergeStatement(sqlStatesCurrentLine, false);\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t\tif (sqlStates.IsIntoSelectStatementOrAssignment(sqlStatesCurrentLine))\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoSelectStatementOrAssignment(sqlStatesCurrentLine, false);\n\t\t\tif (sqlStates.IsIntoCreateStatement(sqlStatesCurrentLine)) {\n\t\t\t\tif (sqlStates.IsIntoCreateViewStatement(sqlStatesCurrentLine)) {\n\t\t\t\t\tif (sqlStates.IsIntoCreateViewAsStatement(sqlStatesCurrentLine)) {\n\t\t\t\t\t\tlevelNext--;\n\t\t\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoCreateViewAsStatement(sqlStatesCurrentLine, false);\n\t\t\t\t\t}\n\t\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoCreateViewStatement(sqlStatesCurrentLine, false);\n\t\t\t\t}\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoCreateStatement(sqlStatesCurrentLine, false);\n\t\t\t}\n\t\t}\n\t\tif (ch == ':' && chNext == '=' && !IsCommentStyle(style))\n\t\t\tsqlStatesCurrentLine = sqlStates.IntoSelectStatementOrAssignment(sqlStatesCurrentLine, true);\n\n\t\tif (options.foldComment && IsStreamCommentStyle(style)) {\n\t\t\tif (!IsStreamCommentStyle(stylePrev)) {\n\t\t\t\tlevelNext++;\n\t\t\t} else if (!IsStreamCommentStyle(styleNext) && !atEOL) {\n\t\t\t\t// Comments don't end at end of line and the next character may be unstyled.\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\t\tif (options.foldComment && (style == SCE_SQL_COMMENTLINE)) {\n\t\t\t// MySQL needs -- comments to be followed by space or control char\n\t\t\tif ((ch == '-') && (chNext == '-')) {\n\t\t\t\tchar chNext2 = styler.SafeGetCharAt(i + 2);\n\t\t\t\tchar chNext3 = styler.SafeGetCharAt(i + 3);\n\t\t\t\tif (chNext2 == '{' || chNext3 == '{') {\n\t\t\t\t\tlevelNext++;\n\t\t\t\t} else if (chNext2 == '}' || chNext3 == '}') {\n\t\t\t\t\tlevelNext--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Fold block of single-line comments (i.e. '--').\n\t\tif (options.foldComment && atEOL && IsCommentLine(lineCurrent, styler)) {\n\t\t\tif (!IsCommentLine(lineCurrent - 1, styler) && IsCommentLine(lineCurrent + 1, styler))\n\t\t\t\tlevelNext++;\n\t\t\telse if (IsCommentLine(lineCurrent - 1, styler) && !IsCommentLine(lineCurrent + 1, styler))\n\t\t\t\tlevelNext--;\n\t\t}\n\t\tif (style == SCE_SQL_OPERATOR) {\n\t\t\tif (ch == '(') {\n\t\t\t\tif (levelCurrent > levelNext)\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\tlevelNext++;\n\t\t\t} else if (ch == ')') {\n\t\t\t\tlevelNext--;\n\t\t\t} else if ((!options.foldOnlyBegin) && ch == ';') {\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IgnoreWhen(sqlStatesCurrentLine, false);\n\t\t\t}\n\t\t}\n\t\t// If new keyword (cannot trigger on elseif or nullif, does less tests)\n\t\tif (style == SCE_SQL_WORD && stylePrev != SCE_SQL_WORD) {\n\t\t\tconst int MAX_KW_LEN = 9;\t// Maximum length of folding keywords\n\t\t\tchar s[MAX_KW_LEN + 2];\n\t\t\tunsigned int j = 0;\n\t\t\tfor (; j < MAX_KW_LEN + 1; j++) {\n\t\t\t\tif (!iswordchar(styler[i + j])) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\ts[j] = static_cast<char>(tolower(styler[i + j]));\n\t\t\t}\n\t\t\tif (j == MAX_KW_LEN + 1) {\n\t\t\t\t// Keyword too long, don't test it\n\t\t\t\ts[0] = '\\0';\n\t\t\t} else {\n\t\t\t\ts[j] = '\\0';\n\t\t\t}\n\t\t\tif (!options.foldOnlyBegin &&\n\t\t\t        strcmp(s, \"select\") == 0) {\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoSelectStatementOrAssignment(sqlStatesCurrentLine, true);\n\t\t\t} else if (strcmp(s, \"if\") == 0) {\n\t\t\t\tif (endFound) {\n\t\t\t\t\tendFound = false;\n\t\t\t\t\tif (options.foldOnlyBegin && !isUnfoldingIgnored) {\n\t\t\t\t\t\t// this end isn't for begin block, but for if block (\"end if;\")\n\t\t\t\t\t\t// so ignore previous \"end\" by increment levelNext.\n\t\t\t\t\t\tlevelNext++;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!options.foldOnlyBegin)\n\t\t\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoCondition(sqlStatesCurrentLine, true);\n\t\t\t\t\tif (levelCurrent > levelNext) {\n\t\t\t\t\t\t// doesn't include this line into the folding block\n\t\t\t\t\t\t// because doesn't hide IF (eg \"END; IF\")\n\t\t\t\t\t\tlevelCurrent = levelNext;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (!options.foldOnlyBegin &&\n\t\t\t           strcmp(s, \"then\") == 0 &&\n\t\t\t           sqlStates.IsIntoCondition(sqlStatesCurrentLine)) {\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoCondition(sqlStatesCurrentLine, false);\n\t\t\t\tif (!options.foldOnlyBegin) {\n\t\t\t\t\tif (levelCurrent > levelNext) {\n\t\t\t\t\t\tlevelCurrent = levelNext;\n\t\t\t\t\t}\n\t\t\t\t\tif (!statementFound)\n\t\t\t\t\t\tlevelNext++;\n\n\t\t\t\t\tstatementFound = true;\n\t\t\t\t} else if (levelCurrent > levelNext) {\n\t\t\t\t\t// doesn't include this line into the folding block\n\t\t\t\t\t// because doesn't hide LOOP or CASE (eg \"END; LOOP\" or \"END; CASE\")\n\t\t\t\t\tlevelCurrent = levelNext;\n\t\t\t\t}\n\t\t\t} else if (strcmp(s, \"loop\") == 0 ||\n\t\t\t           strcmp(s, \"case\") == 0) {\n\t\t\t\tif (endFound) {\n\t\t\t\t\tendFound = false;\n\t\t\t\t\tif (options.foldOnlyBegin && !isUnfoldingIgnored) {\n\t\t\t\t\t\t// this end isn't for begin block, but for loop block (\"end loop;\") or case block (\"end case;\")\n\t\t\t\t\t\t// so ignore previous \"end\" by increment levelNext.\n\t\t\t\t\t\tlevelNext++;\n\t\t\t\t\t}\n\t\t\t\t\tif ((!options.foldOnlyBegin) && strcmp(s, \"case\") == 0) {\n\t\t\t\t\t\tsqlStatesCurrentLine = sqlStates.EndCaseBlock(sqlStatesCurrentLine);\n\t\t\t\t\t\tif (!sqlStates.IsCaseMergeWithoutWhenFound(sqlStatesCurrentLine))\n\t\t\t\t\t\t\tlevelNext--; //again for the \"end case;\" and block when\n\t\t\t\t\t}\n\t\t\t\t} else if (!options.foldOnlyBegin) {\n\t\t\t\t\tif (strcmp(s, \"case\") == 0) {\n\t\t\t\t\t\tsqlStatesCurrentLine = sqlStates.BeginCaseBlock(sqlStatesCurrentLine);\n\t\t\t\t\t\tsqlStatesCurrentLine = sqlStates.CaseMergeWithoutWhenFound(sqlStatesCurrentLine, true);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (levelCurrent > levelNext)\n\t\t\t\t\t\tlevelCurrent = levelNext;\n\n\t\t\t\t\tif (!statementFound)\n\t\t\t\t\t\tlevelNext++;\n\n\t\t\t\t\tstatementFound = true;\n\t\t\t\t} else if (levelCurrent > levelNext) {\n\t\t\t\t\t// doesn't include this line into the folding block\n\t\t\t\t\t// because doesn't hide LOOP or CASE (eg \"END; LOOP\" or \"END; CASE\")\n\t\t\t\t\tlevelCurrent = levelNext;\n\t\t\t\t}\n\t\t\t} else if ((!options.foldOnlyBegin) && (\n\t\t\t               // folding for ELSE and ELSIF block only if foldAtElse is set\n\t\t\t               // and IF or CASE aren't on only one line with ELSE or ELSIF (with flag statementFound)\n\t\t\t               options.foldAtElse && !statementFound) && strcmp(s, \"elsif\") == 0) {\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoCondition(sqlStatesCurrentLine, true);\n\t\t\t\tlevelCurrent--;\n\t\t\t\tlevelNext--;\n\t\t\t} else if ((!options.foldOnlyBegin) && (\n\t\t\t               // folding for ELSE and ELSIF block only if foldAtElse is set\n\t\t\t               // and IF or CASE aren't on only one line with ELSE or ELSIF (with flag statementFound)\n\t\t\t               options.foldAtElse && !statementFound) && strcmp(s, \"else\") == 0) {\n\t\t\t\t// prevent also ELSE is on the same line (eg. \"ELSE ... END IF;\")\n\t\t\t\tstatementFound = true;\n\t\t\t\tif (sqlStates.IsIntoCaseBlock(sqlStatesCurrentLine) && sqlStates.IsCaseMergeWithoutWhenFound(sqlStatesCurrentLine)) {\n\t\t\t\t\tsqlStatesCurrentLine = sqlStates.CaseMergeWithoutWhenFound(sqlStatesCurrentLine, false);\n\t\t\t\t\tlevelNext++;\n\t\t\t\t} else {\n\t\t\t\t\t// we are in same case \"} ELSE {\" in C language\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\t\t\t} else if (strcmp(s, \"begin\") == 0) {\n\t\t\t\tlevelNext++;\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoDeclareBlock(sqlStatesCurrentLine, false);\n\t\t\t} else if ((strcmp(s, \"end\") == 0) ||\n\t\t\t           // SQL Anywhere permits IF ... ELSE ... ENDIF\n\t\t\t           // will only be active if \"endif\" appears in the\n\t\t\t           // keyword list.\n\t\t\t           (strcmp(s, \"endif\") == 0)) {\n\t\t\t\tendFound = true;\n\t\t\t\tlevelNext--;\n\t\t\t\tif (sqlStates.IsIntoSelectStatementOrAssignment(sqlStatesCurrentLine) && !sqlStates.IsCaseMergeWithoutWhenFound(sqlStatesCurrentLine))\n\t\t\t\t\tlevelNext--;\n\t\t\t\tif (levelNext < SC_FOLDLEVELBASE) {\n\t\t\t\t\tlevelNext = SC_FOLDLEVELBASE;\n\t\t\t\t\tisUnfoldingIgnored = true;\n\t\t\t\t}\n\t\t\t} else if ((!options.foldOnlyBegin) &&\n\t\t\t           strcmp(s, \"when\") == 0 &&\n\t\t\t           !sqlStates.IsIgnoreWhen(sqlStatesCurrentLine) &&\n\t\t\t           !sqlStates.IsIntoExceptionBlock(sqlStatesCurrentLine) && (\n\t\t\t               sqlStates.IsIntoCaseBlock(sqlStatesCurrentLine) ||\n\t\t\t               sqlStates.IsIntoMergeStatement(sqlStatesCurrentLine)\n\t\t\t               )\n\t\t\t           ) {\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoCondition(sqlStatesCurrentLine, true);\n\n\t\t\t\t// Don't foldind when CASE and WHEN are on the same line (with flag statementFound) (eg. \"CASE selector WHEN expression1 THEN sequence_of_statements1;\\n\")\n\t\t\t\t// and same way for MERGE statement.\n\t\t\t\tif (!statementFound) {\n\t\t\t\t\tif (!sqlStates.IsCaseMergeWithoutWhenFound(sqlStatesCurrentLine)) {\n\t\t\t\t\t\tlevelCurrent--;\n\t\t\t\t\t\tlevelNext--;\n\t\t\t\t\t}\n\t\t\t\t\tsqlStatesCurrentLine = sqlStates.CaseMergeWithoutWhenFound(sqlStatesCurrentLine, false);\n\t\t\t\t}\n\t\t\t} else if ((!options.foldOnlyBegin) && strcmp(s, \"exit\") == 0) {\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IgnoreWhen(sqlStatesCurrentLine, true);\n\t\t\t} else if ((!options.foldOnlyBegin) && !sqlStates.IsIntoDeclareBlock(sqlStatesCurrentLine) && strcmp(s, \"exception\") == 0) {\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoExceptionBlock(sqlStatesCurrentLine, true);\n\t\t\t} else if ((!options.foldOnlyBegin) &&\n\t\t\t           (strcmp(s, \"declare\") == 0 ||\n\t\t\t            strcmp(s, \"function\") == 0 ||\n\t\t\t            strcmp(s, \"procedure\") == 0 ||\n\t\t\t            strcmp(s, \"package\") == 0)) {\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoDeclareBlock(sqlStatesCurrentLine, true);\n\t\t\t} else if ((!options.foldOnlyBegin) &&\n\t\t\t           strcmp(s, \"merge\") == 0) {\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoMergeStatement(sqlStatesCurrentLine, true);\n\t\t\t\tsqlStatesCurrentLine = sqlStates.CaseMergeWithoutWhenFound(sqlStatesCurrentLine, true);\n\t\t\t\tlevelNext++;\n\t\t\t\tstatementFound = true;\n\t\t\t} else if ((!options.foldOnlyBegin) &&\n\t\t\t\t   strcmp(s, \"create\") == 0) {\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoCreateStatement(sqlStatesCurrentLine, true);\n\t\t\t} else if ((!options.foldOnlyBegin) &&\n\t\t\t\t   strcmp(s, \"view\") == 0 &&\n\t\t\t\t   sqlStates.IsIntoCreateStatement(sqlStatesCurrentLine)) {\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoCreateViewStatement(sqlStatesCurrentLine, true);\n\t\t\t} else if ((!options.foldOnlyBegin) &&\n\t\t\t\t   strcmp(s, \"as\") == 0 &&\n\t\t\t\t   sqlStates.IsIntoCreateViewStatement(sqlStatesCurrentLine) &&\n\t\t\t\t   ! sqlStates.IsIntoCreateViewAsStatement(sqlStatesCurrentLine)) {\n\t\t\t\tsqlStatesCurrentLine = sqlStates.IntoCreateViewAsStatement(sqlStatesCurrentLine, true);\n\t\t\t\tlevelNext++;\n\t\t\t}\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint levelUse = levelCurrent;\n\t\t\tint lev = levelUse | levelNext << 16;\n\t\t\tif (visibleChars == 0 && options.foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (levelUse < levelNext)\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelCurrent = levelNext;\n\t\t\tvisibleChars = 0;\n\t\t\tstatementFound = false;\n\t\t\tif (!options.foldOnlyBegin)\n\t\t\t\tsqlStates.Set(lineCurrent, sqlStatesCurrentLine);\n\t\t}\n\t\tif (!isspacechar(ch)) {\n\t\t\tvisibleChars++;\n\t\t}\n\t}\n}\n\nLexerModule lmSQL(SCLEX_SQL, LexerSQL::LexerFactorySQL, \"sql\", sqlWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexSTTXT.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexSTTXT.cxx\n ** Lexer for Structured Text language.\n ** Written by Pavel Bulochkin\n **/\n// The License.txt file describes the conditions under which this software may be distributed.\n\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic void ClassifySTTXTWord(WordList *keywordlists[], StyleContext &sc)\n{\n\tchar s[256] = { 0 };\n\tsc.GetCurrentLowered(s, sizeof(s));\n\n \tif ((*keywordlists[0]).InList(s)) {\n \t\tsc.ChangeState(SCE_STTXT_KEYWORD);\n \t}\n\n\telse if ((*keywordlists[1]).InList(s)) {\n\t\tsc.ChangeState(SCE_STTXT_TYPE);\n\t}\n\n\telse if ((*keywordlists[2]).InList(s)) {\n\t\tsc.ChangeState(SCE_STTXT_FUNCTION);\n\t}\n\n\telse if ((*keywordlists[3]).InList(s)) {\n\t\tsc.ChangeState(SCE_STTXT_FB);\n\t}\n\n\telse if ((*keywordlists[4]).InList(s)) {\n\t\tsc.ChangeState(SCE_STTXT_VARS);\n\t}\n\n\telse if ((*keywordlists[5]).InList(s)) {\n\t\tsc.ChangeState(SCE_STTXT_PRAGMAS);\n\t}\n\n\tsc.SetState(SCE_STTXT_DEFAULT);\n}\n\nstatic void ColouriseSTTXTDoc (unsigned int startPos, int length, int initStyle,\n\t\t\t\t\t\t\t  WordList *keywordlists[], Accessor &styler)\n{\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tCharacterSet setWord(CharacterSet::setAlphaNum, \"_\", 0x80, true);\n\tCharacterSet setWordStart(CharacterSet::setAlpha, \"_\", 0x80, true);\n\tCharacterSet setNumber(CharacterSet::setDigits, \"_.eE\");\n\tCharacterSet setHexNumber(CharacterSet::setDigits, \"_abcdefABCDEF\");\n\tCharacterSet setOperator(CharacterSet::setNone,\",.+-*/:;<=>[]()%&\");\n\tCharacterSet setDataTime(CharacterSet::setDigits,\"_.-:dmshDMSH\");\n\n \tfor ( ; sc.More() ; sc.Forward())\n \t{\n\t\tif(sc.atLineStart && sc.state != SCE_STTXT_COMMENT)\n\t\t\tsc.SetState(SCE_STTXT_DEFAULT);\n\n\t\tswitch(sc.state)\n\t\t{\n\t\t\tcase SCE_STTXT_NUMBER: {\n\t\t\t\tif(!setNumber.Contains(sc.ch))\n\t\t\t\t\tsc.SetState(SCE_STTXT_DEFAULT);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SCE_STTXT_HEXNUMBER: {\n\t\t\t\tif (setHexNumber.Contains(sc.ch))\n\t\t\t\t\tcontinue;\n\t\t\t\telse if(setDataTime.Contains(sc.ch))\n\t\t\t\t\tsc.ChangeState(SCE_STTXT_DATETIME);\n\t\t\t\telse if(setWord.Contains(sc.ch))\n\t\t\t\t\tsc.ChangeState(SCE_STTXT_DEFAULT);\n\t\t\t\telse\n\t\t\t\t\tsc.SetState(SCE_STTXT_DEFAULT);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SCE_STTXT_DATETIME: {\n\t\t\t\tif (setDataTime.Contains(sc.ch))\n\t\t\t\t\tcontinue;\n\t\t\t\telse if(setWord.Contains(sc.ch))\n\t\t\t\t\tsc.ChangeState(SCE_STTXT_DEFAULT);\n\t\t\t\telse\n\t\t\t\t\tsc.SetState(SCE_STTXT_DEFAULT);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SCE_STTXT_OPERATOR: {\n\t\t\t\tsc.SetState(SCE_STTXT_DEFAULT);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SCE_STTXT_PRAGMA: {\n\t\t\t\tif (sc.ch == '}')\n\t\t\t\t\tsc.ForwardSetState(SCE_STTXT_DEFAULT);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SCE_STTXT_COMMENTLINE: {\n\t\t\t\tif (sc.atLineStart)\n\t\t\t\t\tsc.SetState(SCE_STTXT_DEFAULT);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SCE_STTXT_COMMENT: {\n\t\t\t\tif(sc.Match('*',')'))\n\t\t\t\t{\n\t\t\t\t\tsc.Forward();\n\t\t\t\t\tsc.ForwardSetState(SCE_STTXT_DEFAULT);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SCE_STTXT_STRING1: {\n\t\t\t\tif(sc.atLineEnd)\n\t\t\t\t\tsc.SetState(SCE_STTXT_STRINGEOL);\n\t\t\t\telse if(sc.ch == '\\'' && sc.chPrev != '$')\n\t\t\t\t\tsc.ForwardSetState(SCE_STTXT_DEFAULT);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SCE_STTXT_STRING2: {\n\t\t\t\tif (sc.atLineEnd)\n\t\t\t\t\tsc.SetState(SCE_STTXT_STRINGEOL);\n\t\t\t\telse if(sc.ch == '\\\"' && sc.chPrev != '$')\n\t\t\t\t\tsc.ForwardSetState(SCE_STTXT_DEFAULT);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SCE_STTXT_STRINGEOL: {\n\t\t\t\tif(sc.atLineStart)\n\t\t\t\t\tsc.SetState(SCE_STTXT_DEFAULT);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SCE_STTXT_CHARACTER: {\n\t\t\t\tif(setHexNumber.Contains(sc.ch))\n\t\t\t\t\tsc.SetState(SCE_STTXT_HEXNUMBER);\n\t\t\t\telse if(setDataTime.Contains(sc.ch))\n\t\t\t\t\tsc.SetState(SCE_STTXT_DATETIME);\n\t\t\t\telse sc.SetState(SCE_STTXT_DEFAULT);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SCE_STTXT_IDENTIFIER: {\n\t\t\t\tif(!setWord.Contains(sc.ch))\n\t\t\t\t\tClassifySTTXTWord(keywordlists, sc);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(sc.state == SCE_STTXT_DEFAULT)\n\t\t{\n\t\t\tif(IsADigit(sc.ch))\n\t\t\t\tsc.SetState(SCE_STTXT_NUMBER);\n\t\t\telse if (setWordStart.Contains(sc.ch))\n\t\t\t\tsc.SetState(SCE_STTXT_IDENTIFIER);\n\t\t\telse if (sc.Match('/', '/'))\n\t\t\t\tsc.SetState(SCE_STTXT_COMMENTLINE);\n\t\t\telse if(sc.Match('(', '*'))\n\t\t\t\tsc.SetState(SCE_STTXT_COMMENT);\n\t\t\telse if (sc.ch == '{')\n\t\t\t\tsc.SetState(SCE_STTXT_PRAGMA);\n\t\t\telse if (sc.ch == '\\'')\n\t\t\t\tsc.SetState(SCE_STTXT_STRING1);\n\t\t\telse if (sc.ch == '\\\"')\n\t\t\t\tsc.SetState(SCE_STTXT_STRING2);\n\t\t\telse if(sc.ch == '#')\n\t\t\t\tsc.SetState(SCE_STTXT_CHARACTER);\n\t\t\telse if (setOperator.Contains(sc.ch))\n\t\t\t\tsc.SetState(SCE_STTXT_OPERATOR);\n\t\t}\n \t}\n\n\tif (sc.state == SCE_STTXT_IDENTIFIER && setWord.Contains(sc.chPrev))\n\t\tClassifySTTXTWord(keywordlists, sc);\n\n\tsc.Complete();\n}\n\nstatic const char * const STTXTWordListDesc[] = {\n\t\"Keywords\",\n\t\"Types\",\n\t\"Functions\",\n\t\"FB\",\n\t\"Local_Var\",\n\t\"Local_Pragma\",\n\t0\n};\n\nstatic bool IsCommentLine(int line, Accessor &styler, bool type)\n{\n\tint pos = styler.LineStart(line);\n\tint eolPos = styler.LineStart(line + 1) - 1;\n\n\tfor (int i = pos; i < eolPos; i++)\n\t{\n\t\tchar ch = styler[i];\n\t\tchar chNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styler.StyleAt(i);\n\n\t\tif(type) {\n\t\t\t if (ch == '/' && chNext == '/' && style == SCE_STTXT_COMMENTLINE)\n\t\t\t\treturn true;\n\t\t}\n\t\telse if (ch == '(' && chNext == '*' && style == SCE_STTXT_COMMENT)\n\t\t\tbreak;\n\n\t\tif (!IsASpaceOrTab(ch))\n\t\t\treturn false;\n\t}\n\n\tfor (int i = eolPos-2; i>pos; i--)\n\t{\n\t\tchar ch = styler[i];\n\t\tchar chPrev = styler.SafeGetCharAt(i-1);\n\t\tint style = styler.StyleAt(i);\n\n\t\tif(ch == ')' && chPrev == '*' && style == SCE_STTXT_COMMENT)\n\t\t\treturn true;\n\t\tif(!IsASpaceOrTab(ch))\n\t\t\treturn false;\n\t}\n\n\treturn false;\n}\n\nstatic bool IsPragmaLine(int line, Accessor &styler)\n{\n\tint pos = styler.LineStart(line);\n\tint eolPos = styler.LineStart(line+1) - 1;\n\n\tfor (int i = pos ; i < eolPos ; i++)\n\t{\n\t\tchar ch = styler[i];\n\t\tint style = styler.StyleAt(i);\n\n\t\tif(ch == '{' && style == SCE_STTXT_PRAGMA)\n\t\t\treturn true;\n\t\telse if (!IsASpaceOrTab(ch))\n\t\t\treturn false;\n\t}\n\treturn false;\n}\n\nstatic void GetRangeUpper(unsigned int start,unsigned int end,Accessor &styler,char *s,unsigned int len)\n{\n\tunsigned int i = 0;\n\twhile ((i < end - start + 1) && (i < len-1)) {\n\t\ts[i] = static_cast<char>(toupper(styler[start + i]));\n\t\ti++;\n\t}\n\ts[i] = '\\0';\n}\n\nstatic void ClassifySTTXTWordFoldPoint(int &levelCurrent,unsigned int lastStart,\n\t\t\t\t\t\t\t\t\t unsigned int currentPos, Accessor &styler)\n{\n\tchar s[256];\n\tGetRangeUpper(lastStart, currentPos, styler, s, sizeof(s));\n\n\t// See Table C.2 - Keywords\n\tif (!strcmp(s, \"ACTION\") ||\n\t\t!strcmp(s, \"CASE\") ||\n\t\t!strcmp(s, \"CONFIGURATION\") ||\n\t\t!strcmp(s, \"FOR\") ||\n\t\t!strcmp(s, \"FUNCTION\") ||\n\t\t!strcmp(s, \"FUNCTION_BLOCK\") ||\n\t\t!strcmp(s, \"IF\") ||\n\t\t!strcmp(s, \"INITIAL_STEP\") ||\n\t\t!strcmp(s, \"REPEAT\") ||\n\t\t!strcmp(s, \"RESOURCE\") ||\n\t\t!strcmp(s, \"STEP\") ||\n\t\t!strcmp(s, \"STRUCT\") ||\n\t\t!strcmp(s, \"TRANSITION\") ||\n\t\t!strcmp(s, \"TYPE\") ||\n\t\t!strcmp(s, \"VAR\") ||\n\t\t!strcmp(s, \"VAR_INPUT\") ||\n\t\t!strcmp(s, \"VAR_OUTPUT\") ||\n\t\t!strcmp(s, \"VAR_IN_OUT\") ||\n\t\t!strcmp(s, \"VAR_TEMP\") ||\n\t\t!strcmp(s, \"VAR_EXTERNAL\") ||\n\t\t!strcmp(s, \"VAR_ACCESS\") ||\n\t\t!strcmp(s, \"VAR_CONFIG\") ||\n\t\t!strcmp(s, \"VAR_GLOBAL\") ||\n\t\t!strcmp(s, \"WHILE\"))\n\t{\n\t\tlevelCurrent++;\n\t}\n\telse if (!strcmp(s, \"END_ACTION\") ||\n\t\t!strcmp(s, \"END_CASE\") ||\n\t\t!strcmp(s, \"END_CONFIGURATION\") ||\n\t\t!strcmp(s, \"END_FOR\") ||\n\t\t!strcmp(s, \"END_FUNCTION\") ||\n\t\t!strcmp(s, \"END_FUNCTION_BLOCK\") ||\n\t\t!strcmp(s, \"END_IF\") ||\n\t\t!strcmp(s, \"END_REPEAT\") ||\n\t\t!strcmp(s, \"END_RESOURCE\") ||\n\t\t!strcmp(s, \"END_STEP\") ||\n\t\t!strcmp(s, \"END_STRUCT\") ||\n\t\t!strcmp(s, \"END_TRANSITION\") ||\n\t\t!strcmp(s, \"END_TYPE\") ||\n\t\t!strcmp(s, \"END_VAR\") ||\n\t\t!strcmp(s, \"END_WHILE\"))\n\t{\n\t\tlevelCurrent--;\n\t\tif (levelCurrent < SC_FOLDLEVELBASE) {\n\t\t\tlevelCurrent = SC_FOLDLEVELBASE;\n\t\t}\n\t}\n}\n\nstatic void FoldSTTXTDoc(unsigned int startPos, int length, int initStyle, WordList *[],Accessor &styler)\n{\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldPreprocessor = styler.GetPropertyInt(\"fold.preprocessor\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tint lastStart = 0;\n\n\tCharacterSet setWord(CharacterSet::setAlphaNum, \"_\", 0x80, true);\n\n\tfor (unsigned int i = startPos; i < endPos; i++)\n\t{\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\n\t\tif (foldComment && style == SCE_STTXT_COMMENT) {\n\t\t\tif(stylePrev != SCE_STTXT_COMMENT)\n\t\t\t\tlevelCurrent++;\n\t\t\telse if(styleNext != SCE_STTXT_COMMENT && !atEOL)\n\t\t\t\tlevelCurrent--;\n\t\t}\n\t\tif ( foldComment && atEOL && ( IsCommentLine(lineCurrent, styler,false)\n\t\t\t|| IsCommentLine(lineCurrent,styler,true))) {\n \t\t\tif(!IsCommentLine(lineCurrent-1, styler,true) && IsCommentLine(lineCurrent+1, styler,true))\n\t\t\t\tlevelCurrent++;\n\t\t\tif (IsCommentLine(lineCurrent-1, styler,true) && !IsCommentLine(lineCurrent+1, styler,true))\n\t\t\t\tlevelCurrent--;\n\t\t\tif (!IsCommentLine(lineCurrent-1, styler,false) && IsCommentLine(lineCurrent+1, styler,false))\n\t\t\t\tlevelCurrent++;\n\t\t\tif (IsCommentLine(lineCurrent-1, styler,false) && !IsCommentLine(lineCurrent+1, styler,false))\n\t\t\t\tlevelCurrent--;\n\t\t}\n\t\tif(foldPreprocessor && atEOL && IsPragmaLine(lineCurrent, styler)) {\n\t\t\tif(!IsPragmaLine(lineCurrent-1, styler) && IsPragmaLine(lineCurrent+1, styler ))\n\t\t\t\tlevelCurrent++;\n\t\t\telse if(IsPragmaLine(lineCurrent-1, styler) && !IsPragmaLine(lineCurrent+1, styler))\n\t\t\t\tlevelCurrent--;\n\t\t}\n\t\tif (stylePrev != SCE_STTXT_KEYWORD && style == SCE_STTXT_KEYWORD) {\n\t\t\t\tlastStart = i;\n\t\t}\n\t\tif(stylePrev == SCE_STTXT_KEYWORD) {\n\t\t\tif(setWord.Contains(ch) && !setWord.Contains(chNext))\n\t\t\t\tClassifySTTXTWordFoldPoint(levelCurrent,lastStart, i, styler);\n\t\t}\n\t\tif (!IsASpace(ch)) {\n\t\t\tvisibleChars++;\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent))\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\n\t\t// If we didn't reach the EOL in previous loop, store line level and whitespace information.\n\t\t// The rest will be filled in later...\n\t\tint lev = levelPrev;\n\t\tif (visibleChars == 0 && foldCompact)\n\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\tstyler.SetLevel(lineCurrent, lev);\n\t}\n}\n\nLexerModule lmSTTXT(SCLEX_STTXT, ColouriseSTTXTDoc, \"fcST\", FoldSTTXTDoc, STTXTWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexScriptol.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexScriptol.cxx\n ** Lexer for Scriptol.\n **/\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic void ClassifyWordSol(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord)\n{\n    char s[100] = \"\";\n    bool wordIsNumber = isdigit(styler[start]) != 0;\n    for (unsigned int i = 0; i < end - start + 1 && i < 30; i++)\n     {\n           s[i] = styler[start + i];\n           s[i + 1] = '\\0';\n     }\n    char chAttr = SCE_SCRIPTOL_IDENTIFIER;\n    if (0 == strcmp(prevWord, \"class\"))       chAttr = SCE_SCRIPTOL_CLASSNAME;\n    else if (wordIsNumber)                    chAttr = SCE_SCRIPTOL_NUMBER;\n    else if (keywords.InList(s))              chAttr = SCE_SCRIPTOL_KEYWORD;\n    else for (unsigned int i = 0; i < end - start + 1; i++)  // test dotted idents\n    {\n        if (styler[start + i] == '.')\n        {\n            styler.ColourTo(start + i - 1, chAttr);\n            styler.ColourTo(start + i, SCE_SCRIPTOL_OPERATOR);\n        }\n    }\n    styler.ColourTo(end, chAttr);\n    strcpy(prevWord, s);\n}\n\nstatic bool IsSolComment(Accessor &styler, int pos, int len)\n{\n   if(len > 0)\n   {\n     char c = styler[pos];\n     if(c == '`') return true;\n     if(len > 1)\n     {\n        if(c == '/')\n        {\n          c = styler[pos + 1];\n          if(c == '/') return true;\n          if(c == '*') return true;\n        }\n     }\n   }\n   return false;\n}\n\nstatic bool IsSolStringStart(char ch)\n{\n    if (ch == '\\'' || ch == '\"')  return true;\n    return false;\n}\n\nstatic bool IsSolWordStart(char ch)\n{\n    return (iswordchar(ch) && !IsSolStringStart(ch));\n}\n\n\nstatic int GetSolStringState(Accessor &styler, int i, int *nextIndex)\n{\n\tchar ch = styler.SafeGetCharAt(i);\n\tchar chNext = styler.SafeGetCharAt(i + 1);\n\n        if (ch != '\\\"' && ch != '\\'')\n        {\n            *nextIndex = i + 1;\n            return SCE_SCRIPTOL_DEFAULT;\n\t}\n        // ch is either single or double quotes in string\n        // code below seem non-sense but is here for future extensions\n\tif (ch == chNext && ch == styler.SafeGetCharAt(i + 2))\n        {\n          *nextIndex = i + 3;\n          if(ch == '\\\"') return SCE_SCRIPTOL_TRIPLE;\n          if(ch == '\\'') return SCE_SCRIPTOL_TRIPLE;\n          return SCE_SCRIPTOL_STRING;\n\t}\n        else\n        {\n          *nextIndex = i + 1;\n          if (ch == '\"') return SCE_SCRIPTOL_STRING;\n          else           return SCE_SCRIPTOL_STRING;\n\t}\n}\n\n\nstatic void ColouriseSolDoc(unsigned int startPos, int length, int initStyle,\n                            WordList *keywordlists[], Accessor &styler)\n {\n\n\tint lengthDoc = startPos + length;\n        char stringType = '\\\"';\n\n\tif (startPos > 0)\n        {\n            int lineCurrent = styler.GetLine(startPos);\n            if (lineCurrent > 0)\n            {\n              startPos = styler.LineStart(lineCurrent-1);\n              if (startPos == 0) initStyle = SCE_SCRIPTOL_DEFAULT;\n              else               initStyle = styler.StyleAt(startPos-1);\n            }\n\t}\n\n\tstyler.StartAt(startPos, 127);\n\n\tWordList &keywords = *keywordlists[0];\n\n\tint whingeLevel = styler.GetPropertyInt(\"tab.timmy.whinge.level\");\n\tchar prevWord[200];\n\tprevWord[0] = '\\0';\n        if (length == 0)  return;\n\n\tint state = initStyle & 31;\n\n\tint nextIndex = 0;\n        char chPrev  = ' ';\n        char chPrev2 = ' ';\n        char chNext  = styler[startPos];\n\tstyler.StartSegment(startPos);\n\tbool atStartLine = true;\n\tint spaceFlags = 0;\n\tfor (int i = startPos; i < lengthDoc; i++)\n        {\n\n         if (atStartLine)\n         {\n         char chBad = static_cast<char>(64);\n         char chGood = static_cast<char>(0);\n         char chFlags = chGood;\n\n         if (whingeLevel == 1)\n         {\n             chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood;\n         }\n         else if (whingeLevel == 2)\n         {\n             chFlags = (spaceFlags & wsSpaceTab) ? chBad : chGood;\n         }\n         else if (whingeLevel == 3)\n         {\n             chFlags = (spaceFlags & wsSpace) ? chBad : chGood;\n         }\n         else if (whingeLevel == 4)\n         {\n              chFlags = (spaceFlags & wsTab) ? chBad : chGood;\n         }\n         styler.SetFlags(chFlags, static_cast<char>(state));\n         atStartLine = false;\n       }\n\n       char ch = chNext;\n       chNext = styler.SafeGetCharAt(i + 1);\n\n       if ((ch == '\\r' && chNext != '\\n') || (ch == '\\n') || (i == lengthDoc))\n       {\n          if ((state == SCE_SCRIPTOL_DEFAULT) ||\n              (state == SCE_SCRIPTOL_TRIPLE) ||\n              (state == SCE_SCRIPTOL_COMMENTBLOCK))\n          {\n              styler.ColourTo(i, state);\n          }\n          atStartLine = true;\n        }\n\n        if (styler.IsLeadByte(ch))\n         {\n             chNext = styler.SafeGetCharAt(i + 2);\n             chPrev  = ' ';\n             chPrev2 = ' ';\n             i += 1;\n             continue;\n         }\n\n        if (state == SCE_SCRIPTOL_STRINGEOL)\n         {\n             if (ch != '\\r' && ch != '\\n')\n             {\n                    styler.ColourTo(i - 1, state);\n                    state = SCE_SCRIPTOL_DEFAULT;\n             }\n         }\n\n        if (state == SCE_SCRIPTOL_DEFAULT)\n         {\n            if (IsSolWordStart(ch))\n            {\n                 styler.ColourTo(i - 1, state);\n                 state = SCE_SCRIPTOL_KEYWORD;\n            }\n            else if (ch == '`')\n            {\n                styler.ColourTo(i - 1, state);\n                state = SCE_SCRIPTOL_COMMENTLINE;\n            }\n            else if (ch == '/')\n            {\n                styler.ColourTo(i - 1, state);\n                if(chNext == '/') state = SCE_SCRIPTOL_CSTYLE;\n                if(chNext == '*') state = SCE_SCRIPTOL_COMMENTBLOCK;\n            }\n\n            else if (IsSolStringStart(ch))\n            {\n               styler.ColourTo(i - 1, state);\n               state = GetSolStringState(styler, i, &nextIndex);\n               if(state == SCE_SCRIPTOL_STRING)\n               {\n                 stringType = ch;\n               }\n               if (nextIndex != i + 1)\n               {\n                   i = nextIndex - 1;\n                   ch = ' ';\n                   chPrev = ' ';\n                   chNext = styler.SafeGetCharAt(i + 1);\n               }\n           }\n            else if (isoperator(ch))\n            {\n                 styler.ColourTo(i - 1, state);\n                 styler.ColourTo(i, SCE_SCRIPTOL_OPERATOR);\n            }\n          }\n          else if (state == SCE_SCRIPTOL_KEYWORD)\n          {\n              if (!iswordchar(ch))\n              {\n                 ClassifyWordSol(styler.GetStartSegment(), i - 1, keywords, styler, prevWord);\n                 state = SCE_SCRIPTOL_DEFAULT;\n                 if (ch == '`')\n                 {\n                     state = chNext == '`' ? SCE_SCRIPTOL_PERSISTENT : SCE_SCRIPTOL_COMMENTLINE;\n                 }\n                 else if (IsSolStringStart(ch))\n                 {\n                    styler.ColourTo(i - 1, state);\n                    state = GetSolStringState(styler, i, &nextIndex);\n                    if (nextIndex != i + 1)\n                    {\n                       i = nextIndex - 1;\n                       ch = ' ';\n                       chPrev = ' ';\n                       chNext = styler.SafeGetCharAt(i + 1);\n                     }\n                 }\n                 else if (isoperator(ch))\n                 {\n                     styler.ColourTo(i, SCE_SCRIPTOL_OPERATOR);\n                 }\n             }\n          }\n          else\n          {\n            if (state == SCE_SCRIPTOL_COMMENTLINE ||\n                state == SCE_SCRIPTOL_PERSISTENT ||\n                state == SCE_SCRIPTOL_CSTYLE)\n            {\n                 if (ch == '\\r' || ch == '\\n')\n                 {\n                     styler.ColourTo(i - 1, state);\n                     state = SCE_SCRIPTOL_DEFAULT;\n                 }\n            }\n            else if(state == SCE_SCRIPTOL_COMMENTBLOCK)\n            {\n              if(chPrev == '*' && ch == '/')\n              {\n                styler.ColourTo(i, state);\n                state = SCE_SCRIPTOL_DEFAULT;\n              }\n            }\n            else if ((state == SCE_SCRIPTOL_STRING) ||\n                     (state == SCE_SCRIPTOL_CHARACTER))\n            {\n               if ((ch == '\\r' || ch == '\\n') && (chPrev != '\\\\'))\n                {\n                    styler.ColourTo(i - 1, state);\n                    state = SCE_SCRIPTOL_STRINGEOL;\n                }\n                else if (ch == '\\\\')\n                {\n                   if (chNext == '\\\"' || chNext == '\\'' || chNext == '\\\\')\n                   {\n                        i++;\n                        ch = chNext;\n                        chNext = styler.SafeGetCharAt(i + 1);\n                   }\n                 }\n                else if ((ch == '\\\"') || (ch == '\\''))\n                {\n                    // must match the entered quote type\n                    if(ch == stringType)\n                    {\n                      styler.ColourTo(i, state);\n                      state = SCE_SCRIPTOL_DEFAULT;\n                    }\n                 }\n             }\n             else if (state == SCE_SCRIPTOL_TRIPLE)\n             {\n                if ((ch == '\\'' && chPrev == '\\'' && chPrev2 == '\\'') ||\n                    (ch == '\\\"' && chPrev == '\\\"' && chPrev2 == '\\\"'))\n                 {\n                    styler.ColourTo(i, state);\n                    state = SCE_SCRIPTOL_DEFAULT;\n                 }\n             }\n\n           }\n          chPrev2 = chPrev;\n          chPrev = ch;\n\t}\n        if (state == SCE_SCRIPTOL_KEYWORD)\n        {\n            ClassifyWordSol(styler.GetStartSegment(),\n                 lengthDoc-1, keywords, styler, prevWord);\n\t}\n        else\n        {\n            styler.ColourTo(lengthDoc-1, state);\n\t}\n}\n\nstatic void FoldSolDoc(unsigned int startPos, int length, int initStyle,\n\t\t\t\t\t\t   WordList *[], Accessor &styler)\n {\n\tint lengthDoc = startPos + length;\n\n\tint lineCurrent = styler.GetLine(startPos);\n\tif (startPos > 0)\n        {\n          if (lineCurrent > 0)\n          {\n               lineCurrent--;\n               startPos = styler.LineStart(lineCurrent);\n               if (startPos == 0)\n                    initStyle = SCE_SCRIPTOL_DEFAULT;\n               else\n                    initStyle = styler.StyleAt(startPos-1);\n           }\n\t}\n\tint state = initStyle & 31;\n\tint spaceFlags = 0;\n        int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsSolComment);\n        if (state == SCE_SCRIPTOL_TRIPLE)\n             indentCurrent |= SC_FOLDLEVELWHITEFLAG;\n\tchar chNext = styler[startPos];\n\tfor (int i = startPos; i < lengthDoc; i++)\n         {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styler.StyleAt(i) & 31;\n\n\t\tif ((ch == '\\r' && chNext != '\\n') || (ch == '\\n') || (i == lengthDoc))\n                {\n                   int lev = indentCurrent;\n                   int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsSolComment);\n                   if (style == SCE_SCRIPTOL_TRIPLE)\n                        indentNext |= SC_FOLDLEVELWHITEFLAG;\n                   if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG))\n                    {\n                        // Only non whitespace lines can be headers\n                        if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))\n                        {\n                              lev |= SC_FOLDLEVELHEADERFLAG;\n                        }\n                        else if (indentNext & SC_FOLDLEVELWHITEFLAG)\n                        {\n                             // Line after is blank so check the next - maybe should continue further?\n                             int spaceFlags2 = 0;\n                             int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsSolComment);\n                             if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK))\n                             {\n                                   lev |= SC_FOLDLEVELHEADERFLAG;\n                              }\n                        }\n                    }\n                   indentCurrent = indentNext;\n                   styler.SetLevel(lineCurrent, lev);\n                   lineCurrent++;\n\t\t}\n\t}\n}\n\nLexerModule lmScriptol(SCLEX_SCRIPTOL, ColouriseSolDoc, \"scriptol\", FoldSolDoc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexSmalltalk.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexSmalltalk.cxx\n ** Lexer for Smalltalk language.\n ** Written by Sergey Philippov, sphilippov-at-gmail-dot-com\n **/\n// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n/*\n| lexTable classificationBlock charClasses |\ncharClasses := #(#DecDigit #Letter #Special #Upper #BinSel).\nlexTable := ByteArray new: 128.\nclassificationBlock := [ :charClass :chars |\n    | flag |\n    flag := 1 bitShift: (charClasses indexOf: charClass) - 1.\n    chars do: [ :char | lexTable at: char codePoint + 1 put: ((lexTable at: char codePoint + 1) bitOr: flag)]].\n\nclassificationBlock\n    value: #DecDigit value: '0123456789';\n    value: #Letter value: '_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n    value: #Special value: '()[]{};.^:';\n    value: #BinSel value: '~@%&*-+=|\\/,<>?!';\n    value: #Upper value: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.\n\n((String new: 500) streamContents: [ :stream |\n    stream crLf; nextPutAll: 'static int ClassificationTable[256] = {'.\n    lexTable keysAndValuesDo: [ :index :value |\n        ((index - 1) rem: 16) == 0 ifTrue: [\n            stream crLf; tab]\n        ifFalse: [\n            stream space].\n        stream print: value.\n        index ~= 256 ifTrue: [\n            stream nextPut: $,]].\n    stream crLf; nextPutAll: '};'; crLf.\n\n    charClasses keysAndValuesDo: [ :index :name |\n        stream\n            crLf;\n            nextPutAll: (\n                ('static inline bool is<1s>(int ch) {return (ch > 0) && (ch %< 0x80) && ((ClassificationTable[ch] & <2p>) != 0);}')\n                    expandMacrosWith: name with: (1 bitShift: (index - 1)))\n    ]]) edit\n*/\n\n// autogenerated {{{{\n\nstatic int ClassificationTable[256] = {\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 16, 0, 0, 0, 16, 16, 0, 4, 4, 16, 16, 16, 16, 4, 16,\n    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 16, 16, 16, 16,\n    16, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 16, 4, 4, 2,\n    0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 16, 4, 16, 0,\n};\n\nstatic inline bool isDecDigit(int ch) {return (ch > 0) && (ch < 0x80) && ((ClassificationTable[ch] & 1) != 0);}\nstatic inline bool isLetter(int ch) {return (ch > 0) && (ch < 0x80) && ((ClassificationTable[ch] & 2) != 0);}\nstatic inline bool isSpecial(int ch) {return (ch > 0) && (ch < 0x80) && ((ClassificationTable[ch] & 4) != 0);}\nstatic inline bool isUpper(int ch) {return (ch > 0) && (ch < 0x80) && ((ClassificationTable[ch] & 8) != 0);}\nstatic inline bool isBinSel(int ch) {return (ch > 0) && (ch < 0x80) && ((ClassificationTable[ch] & 16) != 0);}\n// autogenerated }}}}\n\nstatic inline bool isAlphaNumeric(int ch) {\n    return isDecDigit(ch) || isLetter(ch);\n}\n\nstatic inline bool isDigitOfRadix(int ch, int radix)\n{\n    if (isDecDigit(ch))\n        return (ch - '0') < radix;\n    else if (!isUpper(ch))\n        return false;\n    else\n        return (ch - 'A' + 10) < radix;\n}\n\nstatic inline void skipComment(StyleContext& sc)\n{\n    while (sc.More() && sc.ch != '\\\"')\n        sc.Forward();\n}\n\nstatic inline void skipString(StyleContext& sc)\n{\n    while (sc.More()) {\n        if (sc.ch == '\\'') {\n            if (sc.chNext != '\\'')\n                return;\n            sc.Forward();\n        }\n        sc.Forward();\n    }\n}\n\nstatic void handleHash(StyleContext& sc)\n{\n    if (isSpecial(sc.chNext)) {\n        sc.SetState(SCE_ST_SPECIAL);\n        return;\n    }\n\n    sc.SetState(SCE_ST_SYMBOL);\n    sc.Forward();\n    if (sc.ch == '\\'') {\n        sc.Forward();\n        skipString(sc);\n    }\n    else {\n        if (isLetter(sc.ch)) {\n            while (isAlphaNumeric(sc.chNext) || sc.chNext == ':')\n                sc.Forward();\n        }\n        else if (isBinSel(sc.ch)) {\n            while (isBinSel(sc.chNext))\n                sc.Forward();\n        }\n    }\n}\n\nstatic inline void handleSpecial(StyleContext& sc)\n{\n    if (sc.ch == ':' && sc.chNext == '=') {\n        sc.SetState(SCE_ST_ASSIGN);\n        sc.Forward();\n    }\n    else {\n        if (sc.ch == '^')\n            sc.SetState(SCE_ST_RETURN);\n        else\n            sc.SetState(SCE_ST_SPECIAL);\n    }\n}\n\nstatic inline void skipInt(StyleContext& sc, int radix)\n{\n    while (isDigitOfRadix(sc.chNext, radix))\n        sc.Forward();\n}\n\nstatic void handleNumeric(StyleContext& sc)\n{\n    char num[256];\n    int nl;\n    int radix;\n\n    sc.SetState(SCE_ST_NUMBER);\n    num[0] = static_cast<char>(sc.ch);\n    nl = 1;\n    while (isDecDigit(sc.chNext)) {\n        num[nl++] = static_cast<char>(sc.chNext);\n        sc.Forward();\n        if (nl+1 == sizeof(num)/sizeof(num[0])) // overrun check\n            break;\n    }\n    if (sc.chNext == 'r') {\n        num[nl] = 0;\n        if (num[0] == '-')\n            radix = atoi(num + 1);\n        else\n            radix = atoi(num);\n        sc.Forward();\n        if (sc.chNext == '-')\n            sc.Forward();\n        skipInt(sc, radix);\n    }\n    else\n        radix = 10;\n    if (sc.chNext != '.' || !isDigitOfRadix(sc.GetRelative(2), radix))\n        return;\n    sc.Forward();\n    skipInt(sc, radix);\n    if (sc.chNext == 's') {\n        // ScaledDecimal\n        sc.Forward();\n        while (isDecDigit(sc.chNext))\n            sc.Forward();\n        return;\n    }\n    else if (sc.chNext != 'e' && sc.chNext != 'd' && sc.chNext != 'q')\n        return;\n    sc.Forward();\n    if (sc.chNext == '+' || sc.chNext == '-')\n        sc.Forward();\n    skipInt(sc, radix);\n}\n\nstatic inline void handleBinSel(StyleContext& sc)\n{\n    sc.SetState(SCE_ST_BINARY);\n    while (isBinSel(sc.chNext))\n        sc.Forward();\n}\n\nstatic void handleLetter(StyleContext& sc, WordList* specialSelectorList)\n{\n    char ident[256];\n    int il;\n    int state;\n    bool doubleColonPresent;\n\n    sc.SetState(SCE_ST_DEFAULT);\n\n    ident[0] = static_cast<char>(sc.ch);\n    il = 1;\n    while (isAlphaNumeric(sc.chNext)) {\n        ident[il++] = static_cast<char>(sc.chNext);\n        sc.Forward();\n        if (il+2 == sizeof(ident)/sizeof(ident[0])) // overrun check\n            break;\n    }\n\n    if (sc.chNext == ':') {\n        doubleColonPresent = true;\n        ident[il++] = ':';\n        sc.Forward();\n    }\n    else\n        doubleColonPresent = false;\n    ident[il] = 0;\n\n    if (specialSelectorList->InList(ident))\n            state = SCE_ST_SPEC_SEL;\n    else if (doubleColonPresent)\n            state = SCE_ST_KWSEND;\n    else if (isUpper(ident[0]))\n        state = SCE_ST_GLOBAL;\n    else {\n        if (!strcmp(ident, \"self\"))\n            state = SCE_ST_SELF;\n        else if (!strcmp(ident, \"super\"))\n            state = SCE_ST_SUPER;\n        else if (!strcmp(ident, \"nil\"))\n            state = SCE_ST_NIL;\n        else if (!strcmp(ident, \"true\") || !strcmp(ident, \"false\"))\n            state = SCE_ST_BOOL;\n        else\n            state = SCE_ST_DEFAULT;\n    }\n\n    sc.ChangeState(state);\n}\n\nstatic void colorizeSmalltalkDoc(unsigned int startPos, int length, int initStyle, WordList *wordLists[], Accessor &styler)\n{\n    StyleContext sc(startPos, length, initStyle, styler);\n\n    if (initStyle == SCE_ST_COMMENT) {\n        skipComment(sc);\n        if (sc.More())\n            sc.Forward();\n    }\n    else if (initStyle == SCE_ST_STRING) {\n        skipString(sc);\n        if (sc.More())\n            sc.Forward();\n    }\n\n    for (; sc.More(); sc.Forward()) {\n        int ch;\n\n        ch = sc.ch;\n        if (ch == '\\\"') {\n            sc.SetState(SCE_ST_COMMENT);\n            sc.Forward();\n            skipComment(sc);\n        }\n        else if (ch == '\\'') {\n            sc.SetState(SCE_ST_STRING);\n            sc.Forward();\n            skipString(sc);\n        }\n        else if (ch == '#')\n            handleHash(sc);\n        else if (ch == '$') {\n            sc.SetState(SCE_ST_CHARACTER);\n            sc.Forward();\n        }\n        else if (isSpecial(ch))\n            handleSpecial(sc);\n        else if (isDecDigit(ch))\n            handleNumeric(sc);\n        else if (isLetter(ch))\n            handleLetter(sc, wordLists[0]);\n        else if (isBinSel(ch)) {\n            if (ch == '-' && isDecDigit(sc.chNext))\n                handleNumeric(sc);\n            else\n                handleBinSel(sc);\n        }\n        else\n            sc.SetState(SCE_ST_DEFAULT);\n    }\n    sc.Complete();\n}\n\nstatic const char* const smalltalkWordListDesc[] = {\n    \"Special selectors\",\n    0\n};\n\nLexerModule lmSmalltalk(SCLEX_SMALLTALK, colorizeSmalltalkDoc, \"smalltalk\", NULL, smalltalkWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexSorcus.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexSorcus.cxx\n** Lexer for SORCUS installation files\n** Written by Eugen Bitter and Christoph Baumann at SORCUS Computer, Heidelberg Germany\n** Based on the ASM Lexer by The Black Horus\n**/\n\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n\n//each character a..z and A..Z + '_' can be part of a keyword\n//additionally numbers that follow 'M' can be contained in a keyword\nstatic inline bool IsSWordStart(const int ch, const int prev_ch)\n{\n    if (isalpha(ch) || (ch == '_') || ((isdigit(ch)) && (prev_ch == 'M')))\n        return true;\n\n    return false;\n}\n\n\n//only digits that are not preceded by 'M' count as a number\nstatic inline bool IsSorcusNumber(const int ch, const int prev_ch)\n{\n    if ((isdigit(ch)) && (prev_ch != 'M'))\n        return true;\n\n    return false;\n}\n\n\n//only = is a valid operator\nstatic inline bool IsSorcusOperator(const int ch)\n{\n    if (ch == '=')\n        return true;\n\n    return false;\n}\n\n\nstatic void ColouriseSorcusDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                               Accessor &styler)\n{\n\n    WordList &Command = *keywordlists[0];\n    WordList &Parameter = *keywordlists[1];\n    WordList &Constant = *keywordlists[2];\n\n    // Do not leak onto next line\n    if (initStyle == SCE_SORCUS_STRINGEOL)\n        initStyle = SCE_SORCUS_DEFAULT;\n\n    StyleContext sc(startPos, length, initStyle, styler);\n\n    for (; sc.More(); sc.Forward())\n    {\n\n        // Prevent SCE_SORCUS_STRINGEOL from leaking back to previous line\n        if (sc.atLineStart && (sc.state == SCE_SORCUS_STRING))\n        {\n            sc.SetState(SCE_SORCUS_STRING);\n        }\n\n        // Determine if the current state should terminate.\n        if (sc.state == SCE_SORCUS_OPERATOR)\n        {\n            if (!IsSorcusOperator(sc.ch))\n            {\n                sc.SetState(SCE_SORCUS_DEFAULT);\n            }\n        }\n        else if(sc.state == SCE_SORCUS_NUMBER)\n        {\n            if(!IsSorcusNumber(sc.ch, sc.chPrev))\n            {\n                sc.SetState(SCE_SORCUS_DEFAULT);\n            }\n        }\n        else if (sc.state == SCE_SORCUS_IDENTIFIER)\n        {\n            if (!IsSWordStart(sc.ch, sc.chPrev))\n            {\n                char s[100];\n\n                sc.GetCurrent(s, sizeof(s));\n\n                if (Command.InList(s))\n                {\n                    sc.ChangeState(SCE_SORCUS_COMMAND);\n                }\n                else if (Parameter.InList(s))\n                {\n                    sc.ChangeState(SCE_SORCUS_PARAMETER);\n                }\n                else if (Constant.InList(s))\n                {\n                    sc.ChangeState(SCE_SORCUS_CONSTANT);\n                }\n\n                sc.SetState(SCE_SORCUS_DEFAULT);\n            }\n        }\n        else if (sc.state == SCE_SORCUS_COMMENTLINE )\n        {\n            if (sc.atLineEnd)\n            {\n                sc.SetState(SCE_SORCUS_DEFAULT);\n            }\n        }\n        else if (sc.state == SCE_SORCUS_STRING)\n        {\n            if (sc.ch == '\\\"')\n            {\n                sc.ForwardSetState(SCE_SORCUS_DEFAULT);\n            }\n            else if (sc.atLineEnd)\n            {\n                sc.ChangeState(SCE_SORCUS_STRINGEOL);\n                sc.ForwardSetState(SCE_SORCUS_DEFAULT);\n            }\n        }\n\n        // Determine if a new state should be entered.\n        if (sc.state == SCE_SORCUS_DEFAULT)\n        {\n            if ((sc.ch == ';') || (sc.ch == '\\''))\n            {\n                sc.SetState(SCE_SORCUS_COMMENTLINE);\n            }\n            else if (IsSWordStart(sc.ch, sc.chPrev))\n            {\n                sc.SetState(SCE_SORCUS_IDENTIFIER);\n            }\n            else if (sc.ch == '\\\"')\n            {\n                sc.SetState(SCE_SORCUS_STRING);\n            }\n            else if (IsSorcusOperator(sc.ch))\n            {\n                sc.SetState(SCE_SORCUS_OPERATOR);\n            }\n            else if (IsSorcusNumber(sc.ch, sc.chPrev))\n            {\n                sc.SetState(SCE_SORCUS_NUMBER);\n            }\n        }\n\n    }\n    sc.Complete();\n}\n\n\nstatic const char* const SorcusWordListDesc[] = {\"Command\",\"Parameter\", \"Constant\", 0};\n\nLexerModule lmSorc(SCLEX_SORCUS, ColouriseSorcusDoc, \"sorcins\", 0, SorcusWordListDesc);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexSpecman.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexSpecman.cxx\n ** Lexer for Specman E language.\n ** Written by Avi Yegudin, based on C++ lexer by Neil Hodgson\n **/\n// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch == '\\'');\n}\n\nstatic inline bool IsANumberChar(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '\\'');\n}\n\nstatic inline bool IsAWordStart(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '`');\n}\n\nstatic void ColouriseSpecmanDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                            Accessor &styler, bool caseSensitive) {\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\tWordList &keywords4 = *keywordlists[3];\n\n\t// Do not leak onto next line\n\tif (initStyle == SCE_SN_STRINGEOL)\n\t\tinitStyle = SCE_SN_CODE;\n\n\tint visibleChars = 0;\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\tif (sc.atLineStart && (sc.state == SCE_SN_STRING)) {\n\t\t\t// Prevent SCE_SN_STRINGEOL from leaking back to previous line\n\t\t\tsc.SetState(SCE_SN_STRING);\n\t\t}\n\n\t\t// Handle line continuation generically.\n\t\tif (sc.ch == '\\\\') {\n\t\t\tif (sc.chNext == '\\n' || sc.chNext == '\\r') {\n\t\t\t\tsc.Forward();\n\t\t\t\tif (sc.ch == '\\r' && sc.chNext == '\\n') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Determine if the current state should terminate.\n\t\tif (sc.state == SCE_SN_OPERATOR) {\n\t\t\tsc.SetState(SCE_SN_CODE);\n\t\t} else if (sc.state == SCE_SN_NUMBER) {\n\t\t\tif (!IsANumberChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_SN_CODE);\n\t\t\t}\n\t\t} else if (sc.state == SCE_SN_IDENTIFIER) {\n\t\t\tif (!IsAWordChar(sc.ch) || (sc.ch == '.')) {\n\t\t\t\tchar s[100];\n\t\t\t\tif (caseSensitive) {\n\t\t\t\t\tsc.GetCurrent(s, sizeof(s));\n\t\t\t\t} else {\n\t\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\t}\n\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_SN_WORD);\n\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_SN_WORD2);\n\t\t\t\t} else if (keywords3.InList(s)) {\n                                        sc.ChangeState(SCE_SN_WORD3);\n\t\t\t\t} else if (keywords4.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_SN_USER);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_SN_CODE);\n\t\t\t}\n\t\t} else if (sc.state == SCE_SN_PREPROCESSOR) {\n                        if (IsASpace(sc.ch)) {\n                                sc.SetState(SCE_SN_CODE);\n                        }\n\t\t} else if (sc.state == SCE_SN_DEFAULT) {\n\t\t\tif (sc.Match('<', '\\'')) {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.ForwardSetState(SCE_SN_CODE);\n\t\t\t}\n\t\t} else if (sc.state == SCE_SN_COMMENTLINE || sc.state == SCE_SN_COMMENTLINEBANG) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_SN_CODE);\n\t\t\t\tvisibleChars = 0;\n\t\t\t}\n\t\t} else if (sc.state == SCE_SN_STRING) {\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_SN_CODE);\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.ChangeState(SCE_SN_STRINGEOL);\n\t\t\t\tsc.ForwardSetState(SCE_SN_CODE);\n\t\t\t\tvisibleChars = 0;\n\t\t\t}\n\t\t} else if (sc.state == SCE_SN_SIGNAL) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.ChangeState(SCE_SN_STRINGEOL);\n\t\t\t\tsc.ForwardSetState(SCE_SN_CODE);\n\t\t\t\tvisibleChars = 0;\n\t\t\t} else if (sc.ch == '\\\\') {\n\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.ForwardSetState(SCE_SN_CODE);\n\t\t\t}\n\t\t} else if (sc.state == SCE_SN_REGEXTAG) {\n\t\t\tif (!IsADigit(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_SN_CODE);\n\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_SN_CODE) {\n\t\t\tif (sc.ch == '$' && IsADigit(sc.chNext)) {\n\t\t\t\tsc.SetState(SCE_SN_REGEXTAG);\n                                sc.Forward();\n\t\t\t} else if (IsADigit(sc.ch)) {\n                                sc.SetState(SCE_SN_NUMBER);\n\t\t\t} else if (IsAWordStart(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_SN_IDENTIFIER);\n\t\t\t} else if (sc.Match('\\'', '>')) {\n                                sc.SetState(SCE_SN_DEFAULT);\n\t\t\t\tsc.Forward();\t// Eat the * so it isn't used for the end of the comment\n\t\t\t} else if (sc.Match('/', '/')) {\n\t\t\t\tif (sc.Match(\"//!\"))\t// Nice to have a different comment style\n\t\t\t\t\tsc.SetState(SCE_SN_COMMENTLINEBANG);\n\t\t\t\telse\n\t\t\t\t\tsc.SetState(SCE_SN_COMMENTLINE);\n\t\t\t} else if (sc.Match('-', '-')) {\n\t\t\t\tif (sc.Match(\"--!\"))\t// Nice to have a different comment style\n\t\t\t\t\tsc.SetState(SCE_SN_COMMENTLINEBANG);\n\t\t\t\telse\n\t\t\t\t\tsc.SetState(SCE_SN_COMMENTLINE);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_SN_STRING);\n\t\t\t} else if (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_SN_SIGNAL);\n\t\t\t} else if (sc.ch == '#' && visibleChars == 0) {\n\t\t\t\t// Preprocessor commands are alone on their line\n\t\t\t\tsc.SetState(SCE_SN_PREPROCESSOR);\n\t\t\t\t// Skip whitespace between # and preprocessor word\n\t\t\t\tdo {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} while ((sc.ch == ' ' || sc.ch == '\\t') && sc.More());\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.SetState(SCE_SN_CODE);\n\t\t\t\t}\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch)) || sc.ch == '@') {\n\t\t\t\tsc.SetState(SCE_SN_OPERATOR);\n\t\t\t}\n\t\t}\n\n\t\tif (sc.atLineEnd) {\n\t\t\t// Reset states to begining of colourise so no surprises\n\t\t\t// if different sets of lines lexed.\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!IsASpace(sc.ch)) {\n\t\t\tvisibleChars++;\n\t\t}\n\t}\n\tsc.Complete();\n}\n\n// Store both the current line's fold level and the next lines in the\n// level store to make it easy to pick up with each increment\n// and to make it possible to fiddle the current level for \"} else {\".\nstatic void FoldNoBoxSpecmanDoc(unsigned int startPos, int length, int,\n                            Accessor &styler) {\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tbool foldAtElse = styler.GetPropertyInt(\"fold.at.else\", 0) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelCurrent = SC_FOLDLEVELBASE;\n\tif (lineCurrent > 0)\n\t\tlevelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n\tint levelMinCurrent = levelCurrent;\n\tint levelNext = levelCurrent;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style;\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t//int stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (foldComment && (style == SCE_SN_COMMENTLINE)) {\n\t\t\tif (((ch == '/') && (chNext == '/')) ||\n                            ((ch == '-') && (chNext == '-'))) {\n\t\t\t\tchar chNext2 = styler.SafeGetCharAt(i + 2);\n\t\t\t\tif (chNext2 == '{') {\n\t\t\t\t\tlevelNext++;\n\t\t\t\t} else if (chNext2 == '}') {\n\t\t\t\t\tlevelNext--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (style == SCE_SN_OPERATOR) {\n\t\t\tif (ch == '{') {\n\t\t\t\t// Measure the minimum before a '{' to allow\n\t\t\t\t// folding on \"} else {\"\n\t\t\t\tif (levelMinCurrent > levelNext) {\n\t\t\t\t\tlevelMinCurrent = levelNext;\n\t\t\t\t}\n\t\t\t\tlevelNext++;\n\t\t\t} else if (ch == '}') {\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint levelUse = levelCurrent;\n\t\t\tif (foldAtElse) {\n\t\t\t\tlevelUse = levelMinCurrent;\n\t\t\t}\n\t\t\tint lev = levelUse | levelNext << 16;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (levelUse < levelNext)\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelCurrent = levelNext;\n\t\t\tlevelMinCurrent = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n}\n\nstatic void FoldSpecmanDoc(unsigned int startPos, int length, int initStyle, WordList *[],\n                       Accessor &styler) {\n\tFoldNoBoxSpecmanDoc(startPos, length, initStyle, styler);\n}\n\nstatic const char * const specmanWordLists[] = {\n            \"Primary keywords and identifiers\",\n            \"Secondary keywords and identifiers\",\n            \"Sequence keywords and identifiers\",\n            \"User defined keywords and identifiers\",\n            \"Unused\",\n            0,\n        };\n\nstatic void ColouriseSpecmanDocSensitive(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                                     Accessor &styler) {\n\tColouriseSpecmanDoc(startPos, length, initStyle, keywordlists, styler, true);\n}\n\n\nLexerModule lmSpecman(SCLEX_SPECMAN, ColouriseSpecmanDocSensitive, \"specman\", FoldSpecmanDoc, specmanWordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexSpice.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexSpice.cxx\n ** Lexer for Spice\n **/\n// Copyright 2006 by Fabien Proriol\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include <string>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n/*\n * Interface\n */\n\nstatic void ColouriseDocument(\n    unsigned int startPos,\n    int length,\n    int initStyle,\n    WordList *keywordlists[],\n    Accessor &styler);\n\nstatic const char * const spiceWordListDesc[] = {\n    \"Keywords\",        // SPICE command\n    \"Keywords2\",    // SPICE functions\n    \"Keywords3\",    // SPICE params\n    0\n};\n\nLexerModule lmSpice(SCLEX_SPICE, ColouriseDocument, \"spice\", NULL, spiceWordListDesc);\n\n/*\n * Implementation\n */\n\nstatic void ColouriseComment(StyleContext& sc, bool& apostropheStartsAttribute);\nstatic void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute);\nstatic void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute);\nstatic void ColouriseWhiteSpace(StyleContext& sc, bool& apostropheStartsAttribute);\nstatic void ColouriseWord(StyleContext& sc, WordList& keywords, WordList& keywords2, WordList& keywords3, bool& apostropheStartsAttribute);\n\nstatic inline bool IsDelimiterCharacter(int ch);\nstatic inline bool IsSeparatorOrDelimiterCharacter(int ch);\n\nstatic void ColouriseComment(StyleContext& sc, bool&) {\n    sc.SetState(SCE_SPICE_COMMENTLINE);\n    while (!sc.atLineEnd) {\n        sc.Forward();\n    }\n}\n\nstatic void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute) {\n    apostropheStartsAttribute = sc.Match (')');\n    sc.SetState(SCE_SPICE_DELIMITER);\n    sc.ForwardSetState(SCE_SPICE_DEFAULT);\n}\n\nstatic void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute) {\n    apostropheStartsAttribute = true;\n    std::string number;\n    sc.SetState(SCE_SPICE_NUMBER);\n    // Get all characters up to a delimiter or a separator, including points, but excluding\n    // double points (ranges).\n    while (!IsSeparatorOrDelimiterCharacter(sc.ch) || (sc.ch == '.' && sc.chNext != '.')) {\n        number += static_cast<char>(sc.ch);\n        sc.Forward();\n    }\n    // Special case: exponent with sign\n    if ((sc.chPrev == 'e' || sc.chPrev == 'E') &&\n            (sc.ch == '+' || sc.ch == '-')) {\n        number += static_cast<char>(sc.ch);\n        sc.Forward ();\n        while (!IsSeparatorOrDelimiterCharacter(sc.ch)) {\n            number += static_cast<char>(sc.ch);\n            sc.Forward();\n        }\n    }\n    sc.SetState(SCE_SPICE_DEFAULT);\n}\n\nstatic void ColouriseWhiteSpace(StyleContext& sc, bool& ) {\n    sc.SetState(SCE_SPICE_DEFAULT);\n    sc.ForwardSetState(SCE_SPICE_DEFAULT);\n}\n\nstatic void ColouriseWord(StyleContext& sc, WordList& keywords, WordList& keywords2, WordList& keywords3, bool& apostropheStartsAttribute) {\n    apostropheStartsAttribute = true;\n    sc.SetState(SCE_SPICE_IDENTIFIER);\n    std::string word;\n    while (!sc.atLineEnd && !IsSeparatorOrDelimiterCharacter(sc.ch)) {\n        word += static_cast<char>(tolower(sc.ch));\n        sc.Forward();\n    }\n    if (keywords.InList(word.c_str())) {\n        sc.ChangeState(SCE_SPICE_KEYWORD);\n        if (word != \"all\") {\n            apostropheStartsAttribute = false;\n        }\n    }\n    else if (keywords2.InList(word.c_str())) {\n        sc.ChangeState(SCE_SPICE_KEYWORD2);\n        if (word != \"all\") {\n            apostropheStartsAttribute = false;\n        }\n    }\n    else if (keywords3.InList(word.c_str())) {\n        sc.ChangeState(SCE_SPICE_KEYWORD3);\n        if (word != \"all\") {\n            apostropheStartsAttribute = false;\n        }\n    }\n    sc.SetState(SCE_SPICE_DEFAULT);\n}\n\n//\n// ColouriseDocument\n//\nstatic void ColouriseDocument(\n    unsigned int startPos,\n    int length,\n    int initStyle,\n    WordList *keywordlists[],\n    Accessor &styler) {\n    WordList &keywords = *keywordlists[0];\n    WordList &keywords2 = *keywordlists[1];\n    WordList &keywords3 = *keywordlists[2];\n    StyleContext sc(startPos, length, initStyle, styler);\n    int lineCurrent = styler.GetLine(startPos);\n    bool apostropheStartsAttribute = (styler.GetLineState(lineCurrent) & 1) != 0;\n    while (sc.More()) {\n        if (sc.atLineEnd) {\n            // Go to the next line\n            sc.Forward();\n            lineCurrent++;\n            // Remember the line state for future incremental lexing\n            styler.SetLineState(lineCurrent, apostropheStartsAttribute);\n            // Don't continue any styles on the next line\n            sc.SetState(SCE_SPICE_DEFAULT);\n        }\n        // Comments\n        if ((sc.Match('*') && sc.atLineStart) || sc.Match('*','~')) {\n            ColouriseComment(sc, apostropheStartsAttribute);\n        // Whitespace\n        } else if (IsASpace(sc.ch)) {\n            ColouriseWhiteSpace(sc, apostropheStartsAttribute);\n        // Delimiters\n        } else if (IsDelimiterCharacter(sc.ch)) {\n            ColouriseDelimiter(sc, apostropheStartsAttribute);\n        // Numbers\n        } else if (IsADigit(sc.ch) || sc.ch == '#') {\n            ColouriseNumber(sc, apostropheStartsAttribute);\n        // Keywords or identifiers\n        } else {\n            ColouriseWord(sc, keywords, keywords2, keywords3, apostropheStartsAttribute);\n        }\n    }\n    sc.Complete();\n}\n\nstatic inline bool IsDelimiterCharacter(int ch) {\n    switch (ch) {\n    case '&':\n    case '\\'':\n    case '(':\n    case ')':\n    case '*':\n    case '+':\n    case ',':\n    case '-':\n    case '.':\n    case '/':\n    case ':':\n    case ';':\n    case '<':\n    case '=':\n    case '>':\n    case '|':\n        return true;\n    default:\n        return false;\n    }\n}\n\nstatic inline bool IsSeparatorOrDelimiterCharacter(int ch) {\n    return IsASpace(ch) || IsDelimiterCharacter(ch);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexTACL.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexTAL.cxx\n ** Lexer for TAL\n ** Based on LexPascal.cxx\n ** Written by Laurent le Tynevez\n ** Updated by Simon Steele <s.steele@pnotepad.org> September 2002\n ** Updated by Mathias Rauen <scite@madshi.net> May 2003 (Delphi adjustments)\n ** Updated by Rod Falck, Aug 2006 Converted to TACL\n **/\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\ninline bool isTACLoperator(char ch)\n\t{\n\treturn ch == '\\'' || isoperator(ch);\n\t}\n\ninline bool isTACLwordchar(char ch)\n\t{\n\treturn ch == '#' || ch == '^' || ch == '|' || ch == '_' || iswordchar(ch);\n\t}\n\ninline bool isTACLwordstart(char ch)\n\t{\n\treturn ch == '#' || ch == '|' || ch == '_' || iswordstart(ch);\n\t}\n\nstatic void getRange(unsigned int start,\n\t\tunsigned int end,\n\t\tAccessor &styler,\n\t\tchar *s,\n\t\tunsigned int len) {\n\tunsigned int i = 0;\n\twhile ((i < end - start + 1) && (i < len-1)) {\n\t\ts[i] = static_cast<char>(tolower(styler[start + i]));\n\t\ti++;\n\t}\n\ts[i] = '\\0';\n}\n\nstatic bool IsStreamCommentStyle(int style) {\n\treturn style == SCE_C_COMMENT ||\n\t\tstyle == SCE_C_COMMENTDOC ||\n\t\tstyle == SCE_C_COMMENTDOCKEYWORD ||\n\t\tstyle == SCE_C_COMMENTDOCKEYWORDERROR;\n}\n\nstatic void ColourTo(Accessor &styler, unsigned int end, unsigned int attr, bool bInAsm) {\n\tif ((bInAsm) && (attr == SCE_C_OPERATOR || attr == SCE_C_NUMBER || attr == SCE_C_DEFAULT || attr == SCE_C_WORD || attr == SCE_C_IDENTIFIER)) {\n\t\tstyler.ColourTo(end, SCE_C_REGEX);\n\t} else\n\t\tstyler.ColourTo(end, attr);\n}\n\n// returns 1 if the item starts a class definition, and -1 if the word is \"end\", and 2 if the word is \"asm\"\nstatic int classifyWordTACL(unsigned int start, unsigned int end, /*WordList &keywords*/WordList *keywordlists[], Accessor &styler, bool bInAsm) {\n\tint ret = 0;\n\n\tWordList& keywords = *keywordlists[0];\n\tWordList& builtins = *keywordlists[1];\n\tWordList& commands = *keywordlists[2];\n\n\tchar s[100];\n\tgetRange(start, end, styler, s, sizeof(s));\n\n\tchar chAttr = SCE_C_IDENTIFIER;\n\tif (isdigit(s[0]) || (s[0] == '.')) {\n\t\tchAttr = SCE_C_NUMBER;\n\t}\n\telse {\n\t\tif (s[0] == '#' || keywords.InList(s)) {\n\t\t\tchAttr = SCE_C_WORD;\n\n\t\t\tif (strcmp(s, \"asm\") == 0) {\n\t\t\t\tret = 2;\n\t\t\t}\n\t\t\telse if (strcmp(s, \"end\") == 0) {\n\t\t\t\tret = -1;\n\t\t\t}\n\t\t}\n\t\telse if (s[0] == '|' || builtins.InList(s)) {\n\t\t\tchAttr = SCE_C_WORD2;\n\t\t}\n\t\telse if (commands.InList(s)) {\n\t\t\tchAttr = SCE_C_UUID;\n\t\t}\n\t\telse if (strcmp(s, \"comment\") == 0) {\n\t\t\tchAttr = SCE_C_COMMENTLINE;\n\t\t\tret = 3;\n\t\t}\n\t}\n\tColourTo(styler, end, chAttr, (bInAsm && ret != -1));\n\treturn ret;\n}\n\nstatic int classifyFoldPointTACL(const char* s) {\n\tint lev = 0;\n\tif (s[0] == '[')\n\t\tlev=1;\n\telse if (s[0] == ']')\n\t\tlev=-1;\n\treturn lev;\n}\n\nstatic void ColouriseTACLDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n\tAccessor &styler) {\n\n\tstyler.StartAt(startPos);\n\n\tint state = initStyle;\n\tif (state == SCE_C_CHARACTER)\t// Does not leak onto next line\n\t\tstate = SCE_C_DEFAULT;\n\tchar chPrev = ' ';\n\tchar chNext = styler[startPos];\n\tunsigned int lengthDoc = startPos + length;\n\n\tbool bInClassDefinition;\n\n\tint currentLine = styler.GetLine(startPos);\n\tif (currentLine > 0) {\n\t\tstyler.SetLineState(currentLine, styler.GetLineState(currentLine-1));\n\t\tbInClassDefinition = (styler.GetLineState(currentLine) == 1);\n\t} else {\n\t\tstyler.SetLineState(currentLine, 0);\n\t\tbInClassDefinition = false;\n\t}\n\n\tbool bInAsm = (state == SCE_C_REGEX);\n\tif (bInAsm)\n\t\tstate = SCE_C_DEFAULT;\n\n\tstyler.StartSegment(startPos);\n\tint visibleChars = 0;\n\tunsigned int i;\n\tfor (i = startPos; i < lengthDoc; i++) {\n\t\tchar ch = chNext;\n\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\n\t\tif ((ch == '\\r' && chNext != '\\n') || (ch == '\\n')) {\n\t\t\t// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)\n\t\t\t// Avoid triggering two times on Dos/Win\n\t\t\t// End of line\n\t\t\tif (state == SCE_C_CHARACTER) {\n\t\t\t\tColourTo(styler, i, state, bInAsm);\n\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t}\n\t\t\tvisibleChars = 0;\n\t\t\tcurrentLine++;\n\t\t\tstyler.SetLineState(currentLine, (bInClassDefinition ? 1 : 0));\n\t\t}\n\n\t\tif (styler.IsLeadByte(ch)) {\n\t\t\tchNext = styler.SafeGetCharAt(i + 2);\n\t\t\tchPrev = ' ';\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state == SCE_C_DEFAULT) {\n\t\t\tif (isTACLwordstart(ch)) {\n\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\tstate = SCE_C_IDENTIFIER;\n\t\t\t} else if (ch == '{') {\n\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\tstate = SCE_C_COMMENT;\n\t\t\t} else if (ch == '{' && chNext == '*') {\n\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\tstate = SCE_C_COMMENTDOC;\n\t\t\t} else if (ch == '=' && chNext == '=') {\n\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\tstate = SCE_C_COMMENTLINE;\n\t\t\t} else if (ch == '\"') {\n\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\tstate = SCE_C_STRING;\n\t\t\t} else if (ch == '?' && visibleChars == 0) {\n\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\tstate = SCE_C_PREPROCESSOR;\n\t\t\t} else if (isTACLoperator(ch)) {\n\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\tColourTo(styler, i, SCE_C_OPERATOR, bInAsm);\n\t\t\t}\n\t\t} else if (state == SCE_C_IDENTIFIER) {\n\t\t\tif (!isTACLwordchar(ch)) {\n\t\t\t\tint lStateChange = classifyWordTACL(styler.GetStartSegment(), i - 1, keywordlists, styler, bInAsm);\n\n\t\t\t\tif(lStateChange == 1) {\n\t\t\t\t\tstyler.SetLineState(currentLine, 1);\n\t\t\t\t\tbInClassDefinition = true;\n\t\t\t\t} else if(lStateChange == 2) {\n\t\t\t\t\tbInAsm = true;\n\t\t\t\t} else if(lStateChange == -1) {\n\t\t\t\t\tstyler.SetLineState(currentLine, 0);\n\t\t\t\t\tbInClassDefinition = false;\n\t\t\t\t\tbInAsm = false;\n\t\t\t\t}\n\n\t\t\t\tif (lStateChange == 3) {\n\t\t\t\t\t state = SCE_C_COMMENTLINE;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\t\tif (ch == '{') {\n\t\t\t\t\t\tstate = SCE_C_COMMENT;\n\t\t\t\t\t} else if (ch == '{' && chNext == '*') {\n\t\t\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\t\t\tstate = SCE_C_COMMENTDOC;\n\t\t\t\t\t} else if (ch == '=' && chNext == '=') {\n\t\t\t\t\t\tstate = SCE_C_COMMENTLINE;\n\t\t\t\t\t} else if (ch == '\"') {\n\t\t\t\t\t\tstate = SCE_C_STRING;\n\t\t\t\t\t} else if (isTACLoperator(ch)) {\n\t\t\t\t\t\tColourTo(styler, i, SCE_C_OPERATOR, bInAsm);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (state == SCE_C_PREPROCESSOR) {\n\t\t\t\tif ((ch == '\\r' || ch == '\\n') && !(chPrev == '\\\\' || chPrev == '\\r')) {\n\t\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t\t}\n\t\t\t} else if (state == SCE_C_COMMENT) {\n\t\t\t\tif (ch == '}' || (ch == '\\r' || ch == '\\n') ) {\n\t\t\t\t\tColourTo(styler, i, state, bInAsm);\n\t\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t\t}\n\t\t\t} else if (state == SCE_C_COMMENTDOC) {\n\t\t\t\tif (ch == '}' || (ch == '\\r' || ch == '\\n')) {\n\t\t\t\t\tif (((i > styler.GetStartSegment() + 2) || (\n\t\t\t\t\t\t(initStyle == SCE_C_COMMENTDOC) &&\n\t\t\t\t\t\t(styler.GetStartSegment() == static_cast<unsigned int>(startPos))))) {\n\t\t\t\t\t\t\tColourTo(styler, i, state, bInAsm);\n\t\t\t\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (state == SCE_C_COMMENTLINE) {\n\t\t\t\tif (ch == '\\r' || ch == '\\n') {\n\t\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t\t}\n\t\t\t} else if (state == SCE_C_STRING) {\n\t\t\t\tif (ch == '\"' || ch == '\\r' || ch == '\\n') {\n\t\t\t\t\tColourTo(styler, i, state, bInAsm);\n\t\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n        if (!isspacechar(ch))\n            visibleChars++;\n\t\tchPrev = ch;\n\t}\n\n\t// Process to end of document\n\tif (state == SCE_C_IDENTIFIER) {\n\t\tclassifyWordTACL(styler.GetStartSegment(), i - 1, keywordlists, styler, bInAsm);\n\t\t}\n\telse\n\t\tColourTo(styler, lengthDoc - 1, state, bInAsm);\n}\n\nstatic void FoldTACLDoc(unsigned int startPos, int length, int initStyle, WordList *[],\n                            Accessor &styler) {\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldPreprocessor = styler.GetPropertyInt(\"fold.preprocessor\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tbool section = false;\n\n\tint lastStart = 0;\n\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\n\t\tif (stylePrev == SCE_C_DEFAULT && (style == SCE_C_WORD || style == SCE_C_PREPROCESSOR))\n\t\t{\n\t\t\t// Store last word start point.\n\t\t\tlastStart = i;\n\t\t}\n\n\t\tif (stylePrev == SCE_C_WORD || stylePrev == SCE_C_PREPROCESSOR) {\n\t\t\tif(isTACLwordchar(ch) && !isTACLwordchar(chNext)) {\n\t\t\t\tchar s[100];\n\t\t\t\tgetRange(lastStart, i, styler, s, sizeof(s));\n\t\t\t\tif (stylePrev == SCE_C_PREPROCESSOR && strcmp(s, \"?section\") == 0)\n\t\t\t\t\t{\n\t\t\t\t\tsection = true;\n\t\t\t\t\tlevelCurrent = 1;\n\t\t\t\t\tlevelPrev = 0;\n\t\t\t\t\t}\n\t\t\t\telse if (stylePrev == SCE_C_WORD)\n\t\t\t\t\tlevelCurrent += classifyFoldPointTACL(s);\n\t\t\t}\n\t\t}\n\n\t\tif (style == SCE_C_OPERATOR) {\n\t\t\tif (ch == '[') {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (ch == ']') {\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\t\tif (foldComment && (style == SCE_C_COMMENTLINE)) {\n\t\t\tif ((ch == '/') && (chNext == '/')) {\n\t\t\t\tchar chNext2 = styler.SafeGetCharAt(i + 2);\n\t\t\t\tif (chNext2 == '{') {\n\t\t\t\t\tlevelCurrent++;\n\t\t\t\t} else if (chNext2 == '}') {\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (foldPreprocessor && (style == SCE_C_PREPROCESSOR)) {\n\t\t\tif (ch == '{' && chNext == '$') {\n\t\t\t\tunsigned int j=i+2; // skip {$\n\t\t\t\twhile ((j<endPos) && IsASpaceOrTab(styler.SafeGetCharAt(j))) {\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t\tif (styler.Match(j, \"region\") || styler.Match(j, \"if\")) {\n\t\t\t\t\tlevelCurrent++;\n\t\t\t\t} else if (styler.Match(j, \"end\")) {\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (foldComment && IsStreamCommentStyle(style)) {\n\t\t\tif (!IsStreamCommentStyle(stylePrev)) {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (!IsStreamCommentStyle(styleNext) && !atEOL) {\n\t\t\t\t// Comments don't end at end of line and the next character may be unstyled.\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev | SC_FOLDLEVELBASE;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev || section) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t\tsection = false;\n\t\t}\n\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nstatic const char * const TACLWordListDesc[] = {\n\t\"Builtins\",\n\t\"Labels\",\n\t\"Commands\",\n\t0\n};\n\nLexerModule lmTACL(SCLEX_TACL, ColouriseTACLDoc, \"TACL\", FoldTACLDoc, TACLWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexTADS3.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexTADS3.cxx\n ** Lexer for TADS3.\n **/\n// Copyright 1998-2006 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n/*\n * TADS3 is a language designed by Michael J. Roberts for the writing of text\n * based games.  TADS comes from Text Adventure Development System.  It has good\n * support for the processing and outputting of formatted text and much of a\n * TADS program listing consists of strings.\n *\n * TADS has two types of strings, those enclosed in single quotes (') and those\n * enclosed in double quotes (\").  These strings have different symantics and\n * can be given different highlighting if desired.\n *\n * There can be embedded within both types of strings html tags\n * ( <tag key=value> ), library directives ( <.directive> ), and message\n * parameters ( {The doctor's/his} ).\n *\n * Double quoted strings can also contain interpolated expressions\n * ( << rug.moved ? ' and a hole in the floor. ' : nil >> ).  These expressions\n * may themselves contain single or double quoted strings, although the double\n * quoted strings may not contain interpolated expressions.\n *\n * These embedded constructs influence the output and formatting and are an\n * important part of a program and require highlighting.\n *\n * LINKS\n * http://www.tads.org/\n */\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic const int T3_SINGLE_QUOTE = 1;\nstatic const int T3_INT_EXPRESSION = 2;\nstatic const int T3_INT_EXPRESSION_IN_TAG = 4;\nstatic const int T3_HTML_SQUOTE = 8;\n\nstatic inline bool IsEOL(const int ch, const int chNext) {\n        return (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n}\n\n/*\n *   Test the current character to see if it's the START of an EOL sequence;\n *   if so, skip ahead to the last character of the sequence and return true,\n *   and if not just return false.  There are a few places where we want to\n *   check to see if a newline sequence occurs at a particular point, but\n *   where a caller expects a subroutine to stop only upon reaching the END\n *   of a newline sequence (in particular, CR-LF on Windows).  That's why\n *   IsEOL() above only returns true on CR if the CR isn't followed by an LF\n *   - it doesn't want to admit that there's a newline until reaching the END\n *   of the sequence.  We meet both needs by saying that there's a newline\n *   when we see the CR in a CR-LF, but skipping the CR before returning so\n *   that the caller's caller will see that we've stopped at the LF.\n */\nstatic inline bool IsEOLSkip(StyleContext &sc)\n{\n    /* test for CR-LF */\n    if (sc.ch == '\\r' && sc.chNext == '\\n')\n    {\n        /* got CR-LF - skip the CR and indicate that we're at a newline */\n        sc.Forward();\n        return true;\n    }\n\n    /*\n     *   in other cases, we have at most a 1-character newline, so do the\n     *   normal IsEOL test\n     */\n    return IsEOL(sc.ch, sc.chNext);\n}\n\nstatic inline bool IsATADS3Operator(const int ch) {\n        return ch == '=' || ch == '{' || ch == '}' || ch == '(' || ch == ')'\n                || ch == '[' || ch == ']' || ch == ',' || ch == ':' || ch == ';'\n                || ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '%'\n                || ch == '?' || ch == '!' || ch == '<' || ch == '>' || ch == '|'\n                || ch == '@' || ch == '&' || ch == '~';\n}\n\nstatic inline bool IsAWordChar(const int ch) {\n        return isalnum(ch) || ch == '_';\n}\n\nstatic inline bool IsAWordStart(const int ch) {\n        return isalpha(ch) || ch == '_';\n}\n\nstatic inline bool IsAHexDigit(const int ch) {\n        int lch = tolower(ch);\n        return isdigit(lch) || lch == 'a' || lch == 'b' || lch == 'c'\n                || lch == 'd' || lch == 'e' || lch == 'f';\n}\n\nstatic inline bool IsAnHTMLChar(int ch) {\n        return isalnum(ch) || ch == '-' || ch == '_' || ch == '.';\n}\n\nstatic inline bool IsADirectiveChar(int ch) {\n        return isalnum(ch) || isspace(ch) || ch == '-' || ch == '/';\n}\n\nstatic inline bool IsANumberStart(StyleContext &sc) {\n        return isdigit(sc.ch)\n                || (!isdigit(sc.chPrev) && sc.ch == '.' && isdigit(sc.chNext));\n}\n\ninline static void ColouriseTADS3Operator(StyleContext &sc) {\n        int initState = sc.state;\n        int c = sc.ch;\n        sc.SetState(c == '{' || c == '}' ? SCE_T3_BRACE : SCE_T3_OPERATOR);\n        sc.ForwardSetState(initState);\n}\n\nstatic void ColouriseTADSHTMLString(StyleContext &sc, int &lineState) {\n        int endState = sc.state;\n        int chQuote = sc.ch;\n        int chString = (lineState & T3_SINGLE_QUOTE) ? '\\'' : '\"';\n        if (endState == SCE_T3_HTML_STRING) {\n                if (lineState&T3_SINGLE_QUOTE) {\n                        endState = SCE_T3_S_STRING;\n                        chString = '\\'';\n                } else if (lineState&T3_INT_EXPRESSION) {\n                        endState = SCE_T3_X_STRING;\n                        chString = '\"';\n                } else {\n                        endState = SCE_T3_HTML_DEFAULT;\n                        chString = '\"';\n                }\n                chQuote = (lineState & T3_HTML_SQUOTE) ? '\\'' : '\"';\n        } else {\n                sc.SetState(SCE_T3_HTML_STRING);\n                sc.Forward();\n        }\n        if (chQuote == '\"')\n                lineState &= ~T3_HTML_SQUOTE;\n        else\n                lineState |= T3_HTML_SQUOTE;\n\n        while (sc.More()) {\n                if (IsEOL(sc.ch, sc.chNext)) {\n                        return;\n                }\n                if (sc.ch == chQuote) {\n                        sc.ForwardSetState(endState);\n                        return;\n                }\n                if (sc.Match('\\\\', static_cast<char>(chQuote))) {\n                        sc.Forward(2);\n                        sc.SetState(endState);\n                        return;\n                }\n                if (sc.ch == chString) {\n                        sc.SetState(SCE_T3_DEFAULT);\n                        return;\n                }\n\n                if (sc.Match('<', '<')) {\n                        lineState |= T3_INT_EXPRESSION | T3_INT_EXPRESSION_IN_TAG;\n                        sc.SetState(SCE_T3_X_DEFAULT);\n                        sc.Forward(2);\n                        return;\n                }\n\n                if (sc.Match('\\\\', static_cast<char>(chQuote))\n                        || sc.Match('\\\\', static_cast<char>(chString))\n                        || sc.Match('\\\\', '\\\\')) {\n                        sc.Forward(2);\n                } else {\n                        sc.Forward();\n                }\n        }\n}\n\nstatic void ColouriseTADS3HTMLTagStart(StyleContext &sc) {\n        sc.SetState(SCE_T3_HTML_TAG);\n        sc.Forward();\n        if (sc.ch == '/') {\n                sc.Forward();\n        }\n        while (IsAnHTMLChar(sc.ch)) {\n                sc.Forward();\n        }\n}\n\nstatic void ColouriseTADS3HTMLTag(StyleContext &sc, int &lineState) {\n        int endState = sc.state;\n        int chQuote = '\"';\n        int chString = '\\'';\n        switch (endState) {\n                case SCE_T3_S_STRING:\n                        ColouriseTADS3HTMLTagStart(sc);\n                        sc.SetState(SCE_T3_HTML_DEFAULT);\n                        chQuote = '\\'';\n                        chString = '\"';\n                        break;\n                case SCE_T3_D_STRING:\n                case SCE_T3_X_STRING:\n                        ColouriseTADS3HTMLTagStart(sc);\n                        sc.SetState(SCE_T3_HTML_DEFAULT);\n                        break;\n                case SCE_T3_HTML_DEFAULT:\n                        if (lineState&T3_SINGLE_QUOTE) {\n                                endState = SCE_T3_S_STRING;\n                                chQuote = '\\'';\n                                chString = '\"';\n                        } else if (lineState&T3_INT_EXPRESSION) {\n                                endState = SCE_T3_X_STRING;\n                        } else {\n                                endState = SCE_T3_D_STRING;\n                        }\n                        break;\n        }\n\n        while (sc.More()) {\n                if (IsEOL(sc.ch, sc.chNext)) {\n                        return;\n                }\n                if (sc.Match('/', '>')) {\n                        sc.SetState(SCE_T3_HTML_TAG);\n                        sc.Forward(2);\n                        sc.SetState(endState);\n                        return;\n                }\n                if (sc.ch == '>') {\n                        sc.SetState(SCE_T3_HTML_TAG);\n                        sc.ForwardSetState(endState);\n                        return;\n                }\n                if (sc.ch == chQuote) {\n                        sc.SetState(endState);\n                        return;\n                }\n                if (sc.Match('\\\\', static_cast<char>(chQuote))) {\n                        sc.Forward();\n                        ColouriseTADSHTMLString(sc, lineState);\n                        if (sc.state == SCE_T3_X_DEFAULT)\n                            break;\n                } else if (sc.ch == chString) {\n                        ColouriseTADSHTMLString(sc, lineState);\n                } else if (sc.ch == '=') {\n                        ColouriseTADS3Operator(sc);\n                } else {\n                        sc.Forward();\n                }\n        }\n}\n\nstatic void ColouriseTADS3Keyword(StyleContext &sc,\n                                                        WordList *keywordlists[],       unsigned int endPos) {\n        char s[250];\n        WordList &keywords = *keywordlists[0];\n        WordList &userwords1 = *keywordlists[1];\n        WordList &userwords2 = *keywordlists[2];\n        WordList &userwords3 = *keywordlists[3];\n        int initState = sc.state;\n        sc.SetState(SCE_T3_IDENTIFIER);\n        while (sc.More() && (IsAWordChar(sc.ch))) {\n                sc.Forward();\n        }\n        sc.GetCurrent(s, sizeof(s));\n        if ( strcmp(s, \"is\") == 0 || strcmp(s, \"not\") == 0) {\n                // have to find if \"in\" is next\n                int n = 1;\n                while (n + sc.currentPos < endPos && IsASpaceOrTab(sc.GetRelative(n)))\n                        n++;\n                if (sc.GetRelative(n) == 'i' && sc.GetRelative(n+1) == 'n') {\n                        sc.Forward(n+2);\n                        sc.ChangeState(SCE_T3_KEYWORD);\n                }\n        } else if (keywords.InList(s)) {\n                sc.ChangeState(SCE_T3_KEYWORD);\n        } else if (userwords3.InList(s)) {\n                sc.ChangeState(SCE_T3_USER3);\n        } else if (userwords2.InList(s)) {\n                sc.ChangeState(SCE_T3_USER2);\n        } else if (userwords1.InList(s)) {\n                sc.ChangeState(SCE_T3_USER1);\n        }\n        sc.SetState(initState);\n}\n\nstatic void ColouriseTADS3MsgParam(StyleContext &sc, int &lineState) {\n        int endState = sc.state;\n        int chQuote = '\"';\n        switch (endState) {\n                case SCE_T3_S_STRING:\n                        sc.SetState(SCE_T3_MSG_PARAM);\n                        sc.Forward();\n                        chQuote = '\\'';\n                        break;\n                case SCE_T3_D_STRING:\n                case SCE_T3_X_STRING:\n                        sc.SetState(SCE_T3_MSG_PARAM);\n                        sc.Forward();\n                        break;\n                case SCE_T3_MSG_PARAM:\n                        if (lineState&T3_SINGLE_QUOTE) {\n                                endState = SCE_T3_S_STRING;\n                                chQuote = '\\'';\n                        } else if (lineState&T3_INT_EXPRESSION) {\n                                endState = SCE_T3_X_STRING;\n                        } else {\n                                endState = SCE_T3_D_STRING;\n                        }\n                        break;\n        }\n        while (sc.More() && sc.ch != '}' && sc.ch != chQuote) {\n                if (IsEOL(sc.ch, sc.chNext)) {\n                        return;\n                }\n                if (sc.ch == '\\\\') {\n                        sc.Forward();\n                }\n                sc.Forward();\n        }\n        if (sc.ch == chQuote) {\n                sc.SetState(endState);\n        } else {\n                sc.ForwardSetState(endState);\n        }\n}\n\nstatic void ColouriseTADS3LibDirective(StyleContext &sc, int &lineState) {\n        int initState = sc.state;\n        int chQuote = '\"';\n        switch (initState) {\n                case SCE_T3_S_STRING:\n                        sc.SetState(SCE_T3_LIB_DIRECTIVE);\n                        sc.Forward(2);\n                        chQuote = '\\'';\n                        break;\n                case SCE_T3_D_STRING:\n                        sc.SetState(SCE_T3_LIB_DIRECTIVE);\n                        sc.Forward(2);\n                        break;\n                case SCE_T3_LIB_DIRECTIVE:\n                        if (lineState&T3_SINGLE_QUOTE) {\n                                initState = SCE_T3_S_STRING;\n                                chQuote = '\\'';\n                        } else {\n                                initState = SCE_T3_D_STRING;\n                        }\n                        break;\n        }\n        while (sc.More() && IsADirectiveChar(sc.ch)) {\n                if (IsEOL(sc.ch, sc.chNext)) {\n                        return;\n                }\n                sc.Forward();\n        };\n        if (sc.ch == '>' || !sc.More()) {\n                sc.ForwardSetState(initState);\n        } else if (sc.ch == chQuote) {\n                sc.SetState(initState);\n        } else {\n                sc.ChangeState(initState);\n                sc.Forward();\n        }\n}\n\nstatic void ColouriseTADS3String(StyleContext &sc, int &lineState) {\n        int chQuote = sc.ch;\n        int endState = sc.state;\n        switch (sc.state) {\n                case SCE_T3_DEFAULT:\n                case SCE_T3_X_DEFAULT:\n                        if (chQuote == '\"') {\n                                if (sc.state == SCE_T3_DEFAULT) {\n                                        sc.SetState(SCE_T3_D_STRING);\n                                } else {\n                                        sc.SetState(SCE_T3_X_STRING);\n                                }\n                                lineState &= ~T3_SINGLE_QUOTE;\n                        } else {\n                                sc.SetState(SCE_T3_S_STRING);\n                                lineState |= T3_SINGLE_QUOTE;\n                        }\n                        sc.Forward();\n                        break;\n                case SCE_T3_S_STRING:\n                        chQuote = '\\'';\n                        endState = lineState&T3_INT_EXPRESSION ?\n                                SCE_T3_X_DEFAULT : SCE_T3_DEFAULT;\n                        break;\n                case SCE_T3_D_STRING:\n                        chQuote = '\"';\n                        endState = SCE_T3_DEFAULT;\n                        break;\n                case SCE_T3_X_STRING:\n                        chQuote = '\"';\n                        endState = SCE_T3_X_DEFAULT;\n                        break;\n        }\n        while (sc.More()) {\n                if (IsEOL(sc.ch, sc.chNext)) {\n                        return;\n                }\n                if (sc.ch == chQuote) {\n                        sc.ForwardSetState(endState);\n                        return;\n                }\n                if (sc.state == SCE_T3_D_STRING && sc.Match('<', '<')) {\n                        lineState |= T3_INT_EXPRESSION;\n                        sc.SetState(SCE_T3_X_DEFAULT);\n                        sc.Forward(2);\n                        return;\n                }\n                if (sc.Match('\\\\', static_cast<char>(chQuote))\n                    || sc.Match('\\\\', '\\\\')) {\n                        sc.Forward(2);\n                } else if (sc.ch == '{') {\n                        ColouriseTADS3MsgParam(sc, lineState);\n                } else if (sc.Match('<', '.')) {\n                        ColouriseTADS3LibDirective(sc, lineState);\n                } else if (sc.ch == '<') {\n                        ColouriseTADS3HTMLTag(sc, lineState);\n                        if (sc.state == SCE_T3_X_DEFAULT)\n                                return;\n                } else {\n                        sc.Forward();\n                }\n        }\n}\n\nstatic void ColouriseTADS3Comment(StyleContext &sc, int endState) {\n        sc.SetState(SCE_T3_BLOCK_COMMENT);\n        while (sc.More()) {\n                if (IsEOL(sc.ch, sc.chNext)) {\n                        return;\n                }\n                if (sc.Match('*', '/')) {\n                        sc.Forward(2);\n                        sc.SetState(endState);\n                        return;\n                }\n                sc.Forward();\n        }\n}\n\nstatic void ColouriseToEndOfLine(StyleContext &sc, int initState, int endState) {\n        sc.SetState(initState);\n        while (sc.More()) {\n                if (sc.ch == '\\\\') {\n                        sc.Forward();\n                        if (IsEOLSkip(sc)) {\n                                        return;\n                        }\n                }\n                if (IsEOL(sc.ch, sc.chNext)) {\n                        sc.SetState(endState);\n                        return;\n                }\n                sc.Forward();\n        }\n}\n\nstatic void ColouriseTADS3Number(StyleContext &sc) {\n        int endState = sc.state;\n        bool inHexNumber = false;\n        bool seenE = false;\n        bool seenDot = sc.ch == '.';\n        sc.SetState(SCE_T3_NUMBER);\n        if (sc.More()) {\n                sc.Forward();\n        }\n        if (sc.chPrev == '0' && tolower(sc.ch) == 'x') {\n                inHexNumber = true;\n                sc.Forward();\n        }\n        while (sc.More()) {\n                if (inHexNumber) {\n                        if (!IsAHexDigit(sc.ch)) {\n                                break;\n                        }\n                } else if (!isdigit(sc.ch)) {\n                        if (!seenE && tolower(sc.ch) == 'e') {\n                                seenE = true;\n                                seenDot = true;\n                                if (sc.chNext == '+' || sc.chNext == '-') {\n                                        sc.Forward();\n                                }\n                        } else if (!seenDot && sc.ch == '.') {\n                                seenDot = true;\n                        } else {\n                                break;\n                        }\n                }\n                sc.Forward();\n        }\n        sc.SetState(endState);\n}\n\nstatic void ColouriseTADS3Doc(unsigned int startPos, int length, int initStyle,\n                                                           WordList *keywordlists[], Accessor &styler) {\n        int visibleChars = 0;\n        int bracketLevel = 0;\n        int lineState = 0;\n        unsigned int endPos = startPos + length;\n        int lineCurrent = styler.GetLine(startPos);\n        if (lineCurrent > 0) {\n                lineState = styler.GetLineState(lineCurrent-1);\n        }\n        StyleContext sc(startPos, length, initStyle, styler);\n\n        while (sc.More()) {\n\n                if (IsEOL(sc.ch, sc.chNext)) {\n                        styler.SetLineState(lineCurrent, lineState);\n                        lineCurrent++;\n                        visibleChars = 0;\n                        sc.Forward();\n                        if (sc.ch == '\\n') {\n                                sc.Forward();\n                        }\n                }\n\n                switch(sc.state) {\n                        case SCE_T3_PREPROCESSOR:\n                        case SCE_T3_LINE_COMMENT:\n                                ColouriseToEndOfLine(sc, sc.state, lineState&T3_INT_EXPRESSION ?\n                                        SCE_T3_X_DEFAULT : SCE_T3_DEFAULT);\n                                break;\n                        case SCE_T3_S_STRING:\n                        case SCE_T3_D_STRING:\n                        case SCE_T3_X_STRING:\n                                ColouriseTADS3String(sc, lineState);\n                                visibleChars++;\n                                break;\n                        case SCE_T3_MSG_PARAM:\n                                ColouriseTADS3MsgParam(sc, lineState);\n                                break;\n                        case SCE_T3_LIB_DIRECTIVE:\n                                ColouriseTADS3LibDirective(sc, lineState);\n                                break;\n                        case SCE_T3_HTML_DEFAULT:\n                                ColouriseTADS3HTMLTag(sc, lineState);\n                                break;\n                        case SCE_T3_HTML_STRING:\n                                ColouriseTADSHTMLString(sc, lineState);\n                                break;\n                        case SCE_T3_BLOCK_COMMENT:\n                                ColouriseTADS3Comment(sc, lineState&T3_INT_EXPRESSION ?\n                                        SCE_T3_X_DEFAULT : SCE_T3_DEFAULT);\n                                break;\n                        case SCE_T3_DEFAULT:\n                        case SCE_T3_X_DEFAULT:\n                                if (IsASpaceOrTab(sc.ch)) {\n                                        sc.Forward();\n                                } else if (sc.ch == '#' && visibleChars == 0) {\n                                        ColouriseToEndOfLine(sc, SCE_T3_PREPROCESSOR, sc.state);\n                                } else if (sc.Match('/', '*')) {\n                                        ColouriseTADS3Comment(sc, sc.state);\n                                        visibleChars++;\n                                } else if (sc.Match('/', '/')) {\n                                        ColouriseToEndOfLine(sc, SCE_T3_LINE_COMMENT, sc.state);\n                                } else if (sc.ch == '\"') {\n                                        bracketLevel = 0;\n                                        ColouriseTADS3String(sc, lineState);\n                                        visibleChars++;\n                                } else if (sc.ch == '\\'') {\n                                        ColouriseTADS3String(sc, lineState);\n                                        visibleChars++;\n                                } else if (sc.state == SCE_T3_X_DEFAULT && bracketLevel == 0\n                                                   && sc.Match('>', '>')) {\n                                        sc.Forward(2);\n                                        sc.SetState(SCE_T3_D_STRING);\n                                        if (lineState & T3_INT_EXPRESSION_IN_TAG)\n                                                sc.SetState(SCE_T3_HTML_STRING);\n                                        lineState &= ~(T3_SINGLE_QUOTE|T3_INT_EXPRESSION\n                                                       |T3_INT_EXPRESSION_IN_TAG);\n                                } else if (IsATADS3Operator(sc.ch)) {\n                                        if (sc.state == SCE_T3_X_DEFAULT) {\n                                                if (sc.ch == '(') {\n                                                        bracketLevel++;\n                                                } else if (sc.ch == ')' && bracketLevel > 0) {\n                                                        bracketLevel--;\n                                                }\n                                        }\n                                        ColouriseTADS3Operator(sc);\n                                        visibleChars++;\n                                } else if (IsANumberStart(sc)) {\n                                        ColouriseTADS3Number(sc);\n                                        visibleChars++;\n                                } else if (IsAWordStart(sc.ch)) {\n                                        ColouriseTADS3Keyword(sc, keywordlists, endPos);\n                                        visibleChars++;\n                                } else if (sc.Match(\"...\")) {\n                                        sc.SetState(SCE_T3_IDENTIFIER);\n                                        sc.Forward(3);\n                                        sc.SetState(SCE_T3_DEFAULT);\n                                } else {\n                                        sc.Forward();\n                                        visibleChars++;\n                                }\n                                break;\n                        default:\n                                sc.SetState(SCE_T3_DEFAULT);\n                                sc.Forward();\n                }\n        }\n        sc.Complete();\n}\n\n/*\n TADS3 has two styles of top level block (TLB). Eg\n\n // default style\n silverKey : Key 'small silver key' 'small silver key'\n        \"A small key glints in the sunlight. \"\n ;\n\n and\n\n silverKey : Key {\n        'small silver key'\n        'small silver key'\n        \"A small key glints in the sunlight. \"\n }\n\n Some constructs mandate one or the other, but usually the author has may choose\n either.\n\n T3_SEENSTART is used to indicate that a braceless TLB has been (potentially)\n seen and is also used to match the closing ';' of the default style.\n\n T3_EXPECTINGIDENTIFIER and T3_EXPECTINGPUNCTUATION are used to keep track of\n what characters may be seen without incrementing the block level.  The general\n pattern is identifier <punc> identifier, acceptable punctuation characters\n are ':', ',', '(' and ')'.  No attempt is made to ensure that punctuation\n characters are syntactically correct, eg parentheses match. A ')' always\n signifies the start of a block.  We just need to check if it is followed by a\n '{', in which case we let the brace handling code handle the folding level.\n\n expectingIdentifier == false && expectingIdentifier == false\n Before the start of a TLB.\n\n expectingIdentifier == true && expectingIdentifier == true\n Currently in an identifier.  Will accept identifier or punctuation.\n\n expectingIdentifier == true && expectingIdentifier == false\n Just seen a punctuation character & now waiting for an identifier to start.\n\n expectingIdentifier == false && expectingIdentifier == truee\n We were in an identifier and have seen space.  Now waiting to see a punctuation\n character\n\n Space, comments & preprocessor directives are always acceptable and are\n equivalent.\n*/\n\nstatic const int T3_SEENSTART = 1 << 12;\nstatic const int T3_EXPECTINGIDENTIFIER = 1 << 13;\nstatic const int T3_EXPECTINGPUNCTUATION = 1 << 14;\n\nstatic inline bool IsStringTransition(int s1, int s2) {\n        return s1 != s2\n                && (s1 == SCE_T3_S_STRING || s1 == SCE_T3_X_STRING\n                        || (s1 == SCE_T3_D_STRING && s2 != SCE_T3_X_DEFAULT))\n                && s2 != SCE_T3_LIB_DIRECTIVE\n                && s2 != SCE_T3_MSG_PARAM\n                && s2 != SCE_T3_HTML_TAG\n                && s2 != SCE_T3_HTML_STRING;\n}\n\nstatic inline bool IsATADS3Punctuation(const int ch) {\n        return ch == ':' || ch == ',' || ch == '(' || ch == ')';\n}\n\nstatic inline bool IsAnIdentifier(const int style) {\n        return style == SCE_T3_IDENTIFIER\n                || style == SCE_T3_USER1\n                || style == SCE_T3_USER2\n                || style == SCE_T3_USER3;\n}\n\nstatic inline bool IsAnOperator(const int style) {\n    return style == SCE_T3_OPERATOR || style == SCE_T3_BRACE;\n}\n\nstatic inline bool IsSpaceEquivalent(const int ch, const int style) {\n        return isspace(ch)\n                || style == SCE_T3_BLOCK_COMMENT\n                || style == SCE_T3_LINE_COMMENT\n                || style == SCE_T3_PREPROCESSOR;\n}\n\nstatic char peekAhead(unsigned int startPos, unsigned int endPos,\n                                          Accessor &styler) {\n        for (unsigned int i = startPos; i < endPos; i++) {\n                int style = styler.StyleAt(i);\n                char ch = styler[i];\n                if (!IsSpaceEquivalent(ch, style)) {\n                        if (IsAnIdentifier(style)) {\n                                return 'a';\n                        }\n                        if (IsATADS3Punctuation(ch)) {\n                                return ':';\n                        }\n                        if (ch == '{') {\n                                return '{';\n                        }\n                        return '*';\n                }\n        }\n        return ' ';\n}\n\nstatic void FoldTADS3Doc(unsigned int startPos, int length, int initStyle,\n                            WordList *[], Accessor &styler) {\n        unsigned int endPos = startPos + length;\n        int lineCurrent = styler.GetLine(startPos);\n        int levelCurrent = SC_FOLDLEVELBASE;\n        if (lineCurrent > 0)\n                levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n        int seenStart = levelCurrent & T3_SEENSTART;\n        int expectingIdentifier = levelCurrent & T3_EXPECTINGIDENTIFIER;\n        int expectingPunctuation = levelCurrent & T3_EXPECTINGPUNCTUATION;\n        levelCurrent &= SC_FOLDLEVELNUMBERMASK;\n        int levelMinCurrent = levelCurrent;\n        int levelNext = levelCurrent;\n        char chNext = styler[startPos];\n        int styleNext = styler.StyleAt(startPos);\n        int style = initStyle;\n        char ch = chNext;\n        int stylePrev = style;\n        bool redo = false;\n        for (unsigned int i = startPos; i < endPos; i++) {\n                if (redo) {\n                        redo = false;\n                        i--;\n                } else {\n                        ch = chNext;\n                        chNext = styler.SafeGetCharAt(i + 1);\n                        stylePrev = style;\n                        style = styleNext;\n                        styleNext = styler.StyleAt(i + 1);\n                }\n                bool atEOL = IsEOL(ch, chNext);\n\n                if (levelNext == SC_FOLDLEVELBASE) {\n                        if (IsSpaceEquivalent(ch, style)) {\n                                if (expectingPunctuation) {\n                                        expectingIdentifier = 0;\n                                }\n                                if (style == SCE_T3_BLOCK_COMMENT) {\n                                        levelNext++;\n                                }\n                        } else if (ch == '{') {\n                                levelNext++;\n                                seenStart = 0;\n                        } else if (ch == '\\'' || ch == '\"' || ch == '[') {\n                                levelNext++;\n                                if (seenStart) {\n                                        redo = true;\n                                }\n                        } else if (ch == ';') {\n                                seenStart = 0;\n                                expectingIdentifier = 0;\n                                expectingPunctuation = 0;\n                        } else if (expectingIdentifier && expectingPunctuation) {\n                                if (IsATADS3Punctuation(ch)) {\n                                        if (ch == ')' && peekAhead(i+1, endPos, styler) != '{') {\n                                                levelNext++;\n                                        } else {\n                                                expectingPunctuation = 0;\n                                        }\n                                } else if (!IsAnIdentifier(style)) {\n                                        levelNext++;\n                                }\n                        } else if (expectingIdentifier && !expectingPunctuation) {\n                                if (!IsAnIdentifier(style)) {\n                                        levelNext++;\n                                } else {\n                                        expectingPunctuation = T3_EXPECTINGPUNCTUATION;\n                                }\n                        } else if (!expectingIdentifier && expectingPunctuation) {\n                                if (!IsATADS3Punctuation(ch)) {\n                                        levelNext++;\n                                } else {\n                                        if (ch == ')' && peekAhead(i+1, endPos, styler) != '{') {\n                                                levelNext++;\n                                        } else {\n                                                expectingIdentifier = T3_EXPECTINGIDENTIFIER;\n                                                expectingPunctuation = 0;\n                                        }\n                                }\n                        } else if (!expectingIdentifier && !expectingPunctuation) {\n                                if (IsAnIdentifier(style)) {\n                                        seenStart = T3_SEENSTART;\n                                        expectingIdentifier = T3_EXPECTINGIDENTIFIER;\n                                        expectingPunctuation = T3_EXPECTINGPUNCTUATION;\n                                }\n                        }\n\n                        if (levelNext != SC_FOLDLEVELBASE && style != SCE_T3_BLOCK_COMMENT) {\n                                expectingIdentifier = 0;\n                                expectingPunctuation = 0;\n                        }\n\n                } else if (levelNext == SC_FOLDLEVELBASE+1 && seenStart\n                                   && ch == ';' && IsAnOperator(style)) {\n                        levelNext--;\n                        seenStart = 0;\n                } else if (style == SCE_T3_BLOCK_COMMENT) {\n                        if (stylePrev != SCE_T3_BLOCK_COMMENT) {\n                                levelNext++;\n                        } else if (styleNext != SCE_T3_BLOCK_COMMENT && !atEOL) {\n                                // Comments don't end at end of line and the next character may be unstyled.\n                                levelNext--;\n                        }\n                } else if (ch == '\\'' || ch == '\"') {\n                        if (IsStringTransition(style, stylePrev)) {\n                                if (levelMinCurrent > levelNext) {\n                                        levelMinCurrent = levelNext;\n                                }\n                                levelNext++;\n                        } else if (IsStringTransition(style, styleNext)) {\n                                levelNext--;\n                        }\n                } else if (IsAnOperator(style)) {\n                        if (ch == '{' || ch == '[') {\n                                // Measure the minimum before a '{' to allow\n                                // folding on \"} else {\"\n                                if (levelMinCurrent > levelNext) {\n                                        levelMinCurrent = levelNext;\n                                }\n                                levelNext++;\n                        } else if (ch == '}' || ch == ']') {\n                                levelNext--;\n                        }\n                }\n\n                if (atEOL) {\n                        if (seenStart && levelNext == SC_FOLDLEVELBASE) {\n                                switch (peekAhead(i+1, endPos, styler)) {\n                                        case ' ':\n                                        case '{':\n                                                break;\n                                        case '*':\n                                                levelNext++;\n                                                break;\n                                        case 'a':\n                                                if (expectingPunctuation) {\n                                                        levelNext++;\n                                                }\n                                                break;\n                                        case ':':\n                                                if (expectingIdentifier) {\n                                                        levelNext++;\n                                                }\n                                                break;\n                                }\n                                if (levelNext != SC_FOLDLEVELBASE) {\n                                        expectingIdentifier = 0;\n                                        expectingPunctuation = 0;\n                                }\n                        }\n                        int lev = levelMinCurrent | (levelNext | expectingIdentifier\n                                | expectingPunctuation | seenStart) << 16;\n                        if (levelMinCurrent < levelNext)\n                                lev |= SC_FOLDLEVELHEADERFLAG;\n                        if (lev != styler.LevelAt(lineCurrent)) {\n                                styler.SetLevel(lineCurrent, lev);\n                        }\n                        lineCurrent++;\n                        levelCurrent = levelNext;\n                        levelMinCurrent = levelCurrent;\n                }\n        }\n}\n\nstatic const char * const tads3WordList[] = {\n        \"TADS3 Keywords\",\n        \"User defined 1\",\n        \"User defined 2\",\n        \"User defined 3\",\n        0\n};\n\nLexerModule lmTADS3(SCLEX_TADS3, ColouriseTADS3Doc, \"tads3\", FoldTADS3Doc, tads3WordList);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexTAL.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexTAL.cxx\n ** Lexer for TAL\n ** Based on LexPascal.cxx\n ** Written by Laurent le Tynevez\n ** Updated by Simon Steele <s.steele@pnotepad.org> September 2002\n ** Updated by Mathias Rauen <scite@madshi.net> May 2003 (Delphi adjustments)\n ** Updated by Rod Falck, Aug 2006 Converted to TAL\n **/\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\ninline bool isTALoperator(char ch)\n\t{\n\treturn ch == '\\'' || ch == '@' || ch == '#' || isoperator(ch);\n\t}\n\ninline bool isTALwordchar(char ch)\n\t{\n\treturn ch == '$' || ch == '^' || iswordchar(ch);\n\t}\n\ninline bool isTALwordstart(char ch)\n\t{\n\treturn ch == '$' || ch == '^' || iswordstart(ch);\n\t}\n\nstatic void getRange(unsigned int start,\n\t\tunsigned int end,\n\t\tAccessor &styler,\n\t\tchar *s,\n\t\tunsigned int len) {\n\tunsigned int i = 0;\n\twhile ((i < end - start + 1) && (i < len-1)) {\n\t\ts[i] = static_cast<char>(tolower(styler[start + i]));\n\t\ti++;\n\t}\n\ts[i] = '\\0';\n}\n\nstatic bool IsStreamCommentStyle(int style) {\n\treturn style == SCE_C_COMMENT ||\n\t\tstyle == SCE_C_COMMENTDOC ||\n\t\tstyle == SCE_C_COMMENTDOCKEYWORD ||\n\t\tstyle == SCE_C_COMMENTDOCKEYWORDERROR;\n}\n\nstatic void ColourTo(Accessor &styler, unsigned int end, unsigned int attr, bool bInAsm) {\n\tif ((bInAsm) && (attr == SCE_C_OPERATOR || attr == SCE_C_NUMBER || attr == SCE_C_DEFAULT || attr == SCE_C_WORD || attr == SCE_C_IDENTIFIER)) {\n\t\tstyler.ColourTo(end, SCE_C_REGEX);\n\t} else\n\t\tstyler.ColourTo(end, attr);\n}\n\n// returns 1 if the item starts a class definition, and -1 if the word is \"end\", and 2 if the word is \"asm\"\nstatic int classifyWordTAL(unsigned int start, unsigned int end, /*WordList &keywords*/WordList *keywordlists[], Accessor &styler, bool bInAsm) {\n\tint ret = 0;\n\n\tWordList& keywords = *keywordlists[0];\n\tWordList& builtins = *keywordlists[1];\n\tWordList& nonreserved_keywords = *keywordlists[2];\n\n\tchar s[100];\n\tgetRange(start, end, styler, s, sizeof(s));\n\n\tchar chAttr = SCE_C_IDENTIFIER;\n\tif (isdigit(s[0]) || (s[0] == '.')) {\n\t\tchAttr = SCE_C_NUMBER;\n\t}\n\telse {\n\t\tif (keywords.InList(s)) {\n\t\t\tchAttr = SCE_C_WORD;\n\n\t\t\tif (strcmp(s, \"asm\") == 0) {\n\t\t\t\tret = 2;\n\t\t\t}\n\t\t\telse if (strcmp(s, \"end\") == 0) {\n\t\t\t\tret = -1;\n\t\t\t}\n\t\t}\n\t\telse if (s[0] == '$' || builtins.InList(s)) {\n\t\t\tchAttr = SCE_C_WORD2;\n\t\t}\n\t\telse if (nonreserved_keywords.InList(s)) {\n\t\t\tchAttr = SCE_C_UUID;\n\t\t}\n\t}\n\tColourTo(styler, end, chAttr, (bInAsm && ret != -1));\n\treturn ret;\n}\n\nstatic int classifyFoldPointTAL(const char* s) {\n\tint lev = 0;\n\tif (!(isdigit(s[0]) || (s[0] == '.'))) {\n\t\tif (strcmp(s, \"begin\") == 0 ||\n\t\t\tstrcmp(s, \"block\") == 0) {\n\t\t\tlev=1;\n\t\t} else if (strcmp(s, \"end\") == 0) {\n\t\t\tlev=-1;\n\t\t}\n\t}\n\treturn lev;\n}\n\nstatic void ColouriseTALDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n\tAccessor &styler) {\n\n\tstyler.StartAt(startPos);\n\n\tint state = initStyle;\n\tif (state == SCE_C_CHARACTER)\t// Does not leak onto next line\n\t\tstate = SCE_C_DEFAULT;\n\tchar chPrev = ' ';\n\tchar chNext = styler[startPos];\n\tunsigned int lengthDoc = startPos + length;\n\n\tbool bInClassDefinition;\n\n\tint currentLine = styler.GetLine(startPos);\n\tif (currentLine > 0) {\n\t\tstyler.SetLineState(currentLine, styler.GetLineState(currentLine-1));\n\t\tbInClassDefinition = (styler.GetLineState(currentLine) == 1);\n\t} else {\n\t\tstyler.SetLineState(currentLine, 0);\n\t\tbInClassDefinition = false;\n\t}\n\n\tbool bInAsm = (state == SCE_C_REGEX);\n\tif (bInAsm)\n\t\tstate = SCE_C_DEFAULT;\n\n\tstyler.StartSegment(startPos);\n\tint visibleChars = 0;\n\tfor (unsigned int i = startPos; i < lengthDoc; i++) {\n\t\tchar ch = chNext;\n\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\n\t\tif ((ch == '\\r' && chNext != '\\n') || (ch == '\\n')) {\n\t\t\t// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)\n\t\t\t// Avoid triggering two times on Dos/Win\n\t\t\t// End of line\n\t\t\tif (state == SCE_C_CHARACTER) {\n\t\t\t\tColourTo(styler, i, state, bInAsm);\n\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t}\n\t\t\tvisibleChars = 0;\n\t\t\tcurrentLine++;\n\t\t\tstyler.SetLineState(currentLine, (bInClassDefinition ? 1 : 0));\n\t\t}\n\n\t\tif (styler.IsLeadByte(ch)) {\n\t\t\tchNext = styler.SafeGetCharAt(i + 2);\n\t\t\tchPrev = ' ';\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state == SCE_C_DEFAULT) {\n\t\t\tif (isTALwordstart(ch)) {\n\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\tstate = SCE_C_IDENTIFIER;\n\t\t\t} else if (ch == '!' && chNext != '*') {\n\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\tstate = SCE_C_COMMENT;\n\t\t\t} else if (ch == '!' && chNext == '*') {\n\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\tstate = SCE_C_COMMENTDOC;\n\t\t\t} else if (ch == '-' && chNext == '-') {\n\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\tstate = SCE_C_COMMENTLINE;\n\t\t\t} else if (ch == '\"') {\n\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\tstate = SCE_C_STRING;\n\t\t\t} else if (ch == '?' && visibleChars == 0) {\n\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\tstate = SCE_C_PREPROCESSOR;\n\t\t\t} else if (isTALoperator(ch)) {\n\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\tColourTo(styler, i, SCE_C_OPERATOR, bInAsm);\n\t\t\t}\n\t\t} else if (state == SCE_C_IDENTIFIER) {\n\t\t\tif (!isTALwordchar(ch)) {\n\t\t\t\tint lStateChange = classifyWordTAL(styler.GetStartSegment(), i - 1, keywordlists, styler, bInAsm);\n\n\t\t\t\tif(lStateChange == 1) {\n\t\t\t\t\tstyler.SetLineState(currentLine, 1);\n\t\t\t\t\tbInClassDefinition = true;\n\t\t\t\t} else if(lStateChange == 2) {\n\t\t\t\t\tbInAsm = true;\n\t\t\t\t} else if(lStateChange == -1) {\n\t\t\t\t\tstyler.SetLineState(currentLine, 0);\n\t\t\t\t\tbInClassDefinition = false;\n\t\t\t\t\tbInAsm = false;\n\t\t\t\t}\n\n\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\t\t\tif (ch == '!' && chNext != '*') {\n\t\t\t\t\tstate = SCE_C_COMMENT;\n\t\t\t\t} else if (ch == '!' && chNext == '*') {\n\t\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\t\tstate = SCE_C_COMMENTDOC;\n\t\t\t\t} else if (ch == '-' && chNext == '-') {\n\t\t\t\t\tstate = SCE_C_COMMENTLINE;\n\t\t\t\t} else if (ch == '\"') {\n\t\t\t\t\tstate = SCE_C_STRING;\n\t\t\t\t} else if (isTALoperator(ch)) {\n\t\t\t\t\tColourTo(styler, i, SCE_C_OPERATOR, bInAsm);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (state == SCE_C_PREPROCESSOR) {\n\t\t\t\tif ((ch == '\\r' || ch == '\\n') && !(chPrev == '\\\\' || chPrev == '\\r')) {\n\t\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t\t}\n\t\t\t} else if (state == SCE_C_COMMENT) {\n\t\t\t\tif (ch == '!' || (ch == '\\r' || ch == '\\n') ) {\n\t\t\t\t\tColourTo(styler, i, state, bInAsm);\n\t\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t\t}\n\t\t\t} else if (state == SCE_C_COMMENTDOC) {\n\t\t\t\tif (ch == '!' || (ch == '\\r' || ch == '\\n')) {\n\t\t\t\t\tif (((i > styler.GetStartSegment() + 2) || (\n\t\t\t\t\t\t(initStyle == SCE_C_COMMENTDOC) &&\n\t\t\t\t\t\t(styler.GetStartSegment() == static_cast<unsigned int>(startPos))))) {\n\t\t\t\t\t\t\tColourTo(styler, i, state, bInAsm);\n\t\t\t\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (state == SCE_C_COMMENTLINE) {\n\t\t\t\tif (ch == '\\r' || ch == '\\n') {\n\t\t\t\t\tColourTo(styler, i-1, state, bInAsm);\n\t\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t\t}\n\t\t\t} else if (state == SCE_C_STRING) {\n\t\t\t\tif (ch == '\"') {\n\t\t\t\t\tColourTo(styler, i, state, bInAsm);\n\t\t\t\t\tstate = SCE_C_DEFAULT;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n        if (!isspacechar(ch))\n            visibleChars++;\n\t\tchPrev = ch;\n\t}\n\tColourTo(styler, lengthDoc - 1, state, bInAsm);\n}\n\nstatic void FoldTALDoc(unsigned int startPos, int length, int initStyle, WordList *[],\n                            Accessor &styler) {\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldPreprocessor = styler.GetPropertyInt(\"fold.preprocessor\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent = levelPrev;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tbool was_end = false;\n\tbool section = false;\n\n\tint lastStart = 0;\n\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\n\t\tif (stylePrev == SCE_C_DEFAULT && (style == SCE_C_WORD || style == SCE_C_UUID || style == SCE_C_PREPROCESSOR))\n\t\t{\n\t\t\t// Store last word start point.\n\t\t\tlastStart = i;\n\t\t}\n\n\t\tif (stylePrev == SCE_C_WORD || style == SCE_C_UUID || stylePrev == SCE_C_PREPROCESSOR) {\n\t\t\tif(isTALwordchar(ch) && !isTALwordchar(chNext)) {\n\t\t\t\tchar s[100];\n\t\t\t\tgetRange(lastStart, i, styler, s, sizeof(s));\n\t\t\t\tif (stylePrev == SCE_C_PREPROCESSOR && strcmp(s, \"?section\") == 0)\n\t\t\t\t\t{\n\t\t\t\t\tsection = true;\n\t\t\t\t\tlevelCurrent = 1;\n\t\t\t\t\tlevelPrev = 0;\n\t\t\t\t\t}\n\t\t\t\telse if (stylePrev == SCE_C_WORD || stylePrev == SCE_C_UUID)\n\t\t\t\t\t{\n\t\t\t\t\tif (strcmp(s, \"block\") == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t// block keyword is ignored immediately after end keyword\n\t\t\t\t\t\tif (!was_end)\n\t\t\t\t\t\t\tlevelCurrent++;\n\t\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tlevelCurrent += classifyFoldPointTAL(s);\n\t\t\t\t\tif (strcmp(s, \"end\") == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\twas_end = true;\n\t\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\twas_end = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (foldComment && (style == SCE_C_COMMENTLINE)) {\n\t\t\tif ((ch == '/') && (chNext == '/')) {\n\t\t\t\tchar chNext2 = styler.SafeGetCharAt(i + 2);\n\t\t\t\tif (chNext2 == '{') {\n\t\t\t\t\tlevelCurrent++;\n\t\t\t\t} else if (chNext2 == '}') {\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (foldPreprocessor && (style == SCE_C_PREPROCESSOR)) {\n\t\t\tif (ch == '{' && chNext == '$') {\n\t\t\t\tunsigned int j=i+2; // skip {$\n\t\t\t\twhile ((j<endPos) && IsASpaceOrTab(styler.SafeGetCharAt(j))) {\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t\tif (styler.Match(j, \"region\") || styler.Match(j, \"if\")) {\n\t\t\t\t\tlevelCurrent++;\n\t\t\t\t} else if (styler.Match(j, \"end\")) {\n\t\t\t\t\tlevelCurrent--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (foldComment && IsStreamCommentStyle(style)) {\n\t\t\tif (!IsStreamCommentStyle(stylePrev)) {\n\t\t\t\tlevelCurrent++;\n\t\t\t} else if (!IsStreamCommentStyle(styleNext) && !atEOL) {\n\t\t\t\t// Comments don't end at end of line and the next character may be unstyled.\n\t\t\t\tlevelCurrent--;\n\t\t\t}\n\t\t}\n\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev | SC_FOLDLEVELBASE;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev || section) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t\tsection = false;\n\t\t}\n\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\nstatic const char * const TALWordListDesc[] = {\n\t\"Keywords\",\n\t\"Builtins\",\n\t0\n};\n\nLexerModule lmTAL(SCLEX_TAL, ColouriseTALDoc, \"TAL\", FoldTALDoc, TALWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexTCL.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexTCL.cxx\n ** Lexer for TCL language.\n **/\n// Copyright 1998-2001 by Andre Arpin <arpin@kingston.net>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n// Extended to accept accented characters\nstatic inline bool IsAWordChar(int ch) {\n\treturn ch >= 0x80 ||\n        (isalnum(ch) || ch == '_' || ch ==':' || ch=='.'); // : name space separator\n}\n\nstatic inline bool IsAWordStart(int ch) {\n\treturn ch >= 0x80 || (ch ==':' || isalpha(ch) || ch == '_');\n}\n\nstatic inline bool IsANumberChar(int ch) {\n\t// Not exactly following number definition (several dots are seen as OK, etc.)\n\t// but probably enough in most cases.\n\treturn (ch < 0x80) &&\n\t       (IsADigit(ch, 0x10) || toupper(ch) == 'E' ||\n\t        ch == '.' || ch == '-' || ch == '+');\n}\n\nstatic void ColouriseTCLDoc(unsigned int startPos, int length, int , WordList *keywordlists[], Accessor &styler) {\n#define  isComment(s) (s==SCE_TCL_COMMENT || s==SCE_TCL_COMMENTLINE || s==SCE_TCL_COMMENT_BOX || s==SCE_TCL_BLOCK_COMMENT)\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool commentLevel = false;\n    bool subBrace = false; // substitution begin with a brace ${.....}\n\tenum tLineState {LS_DEFAULT, LS_OPEN_COMMENT, LS_OPEN_DOUBLE_QUOTE, LS_COMMENT_BOX, LS_MASK_STATE = 0xf,\n        LS_COMMAND_EXPECTED = 16, LS_BRACE_ONLY = 32 } lineState = LS_DEFAULT;\n\tbool prevSlash = false;\n\tint currentLevel = 0;\n    bool expected = 0;\n    bool subParen = 0;\n\n\tint currentLine = styler.GetLine(startPos);\n    if (currentLine > 0)\n        currentLine--;\n\tlength += startPos - styler.LineStart(currentLine);\n\t// make sure lines overlap\n\tstartPos = styler.LineStart(currentLine);\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\tWordList &keywords4 = *keywordlists[3];\n\tWordList &keywords5 = *keywordlists[4];\n\tWordList &keywords6 = *keywordlists[5];\n\tWordList &keywords7 = *keywordlists[6];\n    WordList &keywords8 = *keywordlists[7];\n    WordList &keywords9 = *keywordlists[8];\n\n\tif (currentLine > 0) {\n        int ls = styler.GetLineState(currentLine - 1);\n\t\tlineState = tLineState(ls & LS_MASK_STATE);\n\t\texpected = LS_COMMAND_EXPECTED == tLineState(ls & LS_COMMAND_EXPECTED);\n        subBrace = LS_BRACE_ONLY == tLineState(ls & LS_BRACE_ONLY);\n\t\tcurrentLevel = styler.LevelAt(currentLine - 1) >> 17;\n\t\tcommentLevel = (styler.LevelAt(currentLine - 1) >> 16) & 1;\n\t} else\n\t\tstyler.SetLevel(0, SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG);\n\tbool visibleChars = false;\n\n\tint previousLevel = currentLevel;\n    StyleContext sc(startPos, length, SCE_TCL_DEFAULT, styler);\n\tfor (; ; sc.Forward()) {\nnext:\n        if (sc.ch=='\\r' && sc.chNext == '\\n') // only ignore \\r on PC process on the mac\n            continue;\n        bool atEnd = !sc.More();  // make sure we coloured the last word\n        if (lineState != LS_DEFAULT) {\n            sc.SetState(SCE_TCL_DEFAULT);\n            if (lineState == LS_OPEN_COMMENT)\n                sc.SetState(SCE_TCL_COMMENTLINE);\n            else if (lineState == LS_OPEN_DOUBLE_QUOTE)\n                sc.SetState(SCE_TCL_IN_QUOTE);\n            else if (lineState == LS_COMMENT_BOX && (sc.ch == '#' || (sc.ch == ' ' && sc.chNext=='#')))\n                sc.SetState(SCE_TCL_COMMENT_BOX);\n            lineState = LS_DEFAULT;\n        }\n        if (subBrace) { // ${ overrides every thing even \\ except }\n            if (sc.ch == '}') {\n                subBrace = false;\n                sc.SetState(SCE_TCL_OPERATOR);\n                sc.ForwardSetState(SCE_TCL_DEFAULT);\n                goto next;\n            }\n            else\n                sc.SetState(SCE_TCL_SUB_BRACE);\n            if (!sc.atLineEnd)\n                continue;\n        } else if (sc.state == SCE_TCL_DEFAULT || sc.state ==SCE_TCL_OPERATOR) {\n            expected &= isspacechar(static_cast<unsigned char>(sc.ch)) || IsAWordStart(sc.ch) || sc.ch =='#';\n        } else if (sc.state == SCE_TCL_SUBSTITUTION) {\n            switch(sc.ch) {\n            case '(':\n                subParen=true;\n                sc.SetState(SCE_TCL_OPERATOR);\n                sc.ForwardSetState(SCE_TCL_SUBSTITUTION);\n                continue;\n            case ')':\n                sc.SetState(SCE_TCL_OPERATOR);\n                subParen=false;\n                continue;\n            case '$':\n                continue;\n            case ',':\n                sc.SetState(SCE_TCL_OPERATOR);\n                if (subParen)\n                    sc.ForwardSetState(SCE_TCL_SUBSTITUTION);\n                continue;\n            default :\n                // maybe spaces should be allowed ???\n                if (!IsAWordChar(sc.ch)) { // probably the code is wrong\n                    sc.SetState(SCE_TCL_DEFAULT);\n                    subParen = 0;\n                }\n                break;\n            }\n        } else if (isComment(sc.state)) {\n        } else if (!IsAWordChar(sc.ch)) {\n            if ((sc.state == SCE_TCL_IDENTIFIER && expected) ||  sc.state == SCE_TCL_MODIFIER) {\n                char w[100];\n                char *s=w;\n                sc.GetCurrent(w, sizeof(w));\n                if (w[strlen(w)-1]=='\\r')\n                    w[strlen(w)-1]=0;\n                while(*s == ':') // ignore leading : like in ::set a 10\n                    ++s;\n                bool quote = sc.state == SCE_TCL_IN_QUOTE;\n                if (commentLevel  || expected) {\n                    if (keywords.InList(s)) {\n                        sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD);\n                    } else if (keywords2.InList(s)) {\n                        sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD2);\n                    } else if (keywords3.InList(s)) {\n                        sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD3);\n                    } else if (keywords4.InList(s)) {\n                        sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD4);\n                    } else if (sc.GetRelative(-static_cast<int>(strlen(s))-1) == '{' &&\n                        keywords5.InList(s) && sc.ch == '}') { // {keyword} exactly no spaces\n                            sc.ChangeState(SCE_TCL_EXPAND);\n                    }\n                    if (keywords6.InList(s)) {\n                        sc.ChangeState(SCE_TCL_WORD5);\n                    } else if (keywords7.InList(s)) {\n                        sc.ChangeState(SCE_TCL_WORD6);\n                    } else if (keywords8.InList(s)) {\n                        sc.ChangeState(SCE_TCL_WORD7);\n                    } else if (keywords9.InList(s)) {\n                        sc.ChangeState(SCE_TCL_WORD8);\n                    }\n                }\n                expected = false;\n                sc.SetState(quote ? SCE_TCL_IN_QUOTE : SCE_TCL_DEFAULT);\n            } else if (sc.state == SCE_TCL_MODIFIER || sc.state == SCE_TCL_IDENTIFIER) {\n                sc.SetState(SCE_TCL_DEFAULT);\n            }\n        }\n\t\tif (atEnd)\n\t\t\tbreak;\n        if (sc.atLineEnd) {\n            lineState = LS_DEFAULT;\n\t\t\tcurrentLine = styler.GetLine(sc.currentPos);\n\t\t\tif (foldComment && sc.state!=SCE_TCL_COMMENT && isComment(sc.state)) {\n\t\t\t\tif (currentLevel == 0) {\n\t\t\t\t\t++currentLevel;\n\t\t\t\t\tcommentLevel = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (visibleChars && commentLevel) {\n\t\t\t\t\t--currentLevel;\n\t\t\t\t\t--previousLevel;\n\t\t\t\t\tcommentLevel = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tint flag = 0;\n\t\t\tif (!visibleChars)\n\t\t\t\tflag = SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (currentLevel > previousLevel)\n\t\t\t\tflag = SC_FOLDLEVELHEADERFLAG;\n\t\t\tstyler.SetLevel(currentLine, flag + previousLevel + SC_FOLDLEVELBASE + (currentLevel << 17) + (commentLevel << 16));\n\n\t\t\t// Update the line state, so it can be seen by next line\n\t\t\tif (sc.state == SCE_TCL_IN_QUOTE)\n\t\t\t\tlineState = LS_OPEN_DOUBLE_QUOTE;\n\t\t\telse {\n\t\t\t     if (prevSlash) {\n\t\t\t\t    if (isComment(sc.state))\n\t\t\t\t\t    lineState = LS_OPEN_COMMENT;\n                } else if (sc.state == SCE_TCL_COMMENT_BOX)\n                    lineState = LS_COMMENT_BOX;\n\t\t\t}\n            styler.SetLineState(currentLine,\n                (subBrace ? LS_BRACE_ONLY : 0) |\n                (expected ? LS_COMMAND_EXPECTED : 0)  | lineState);\n            if (lineState == LS_COMMENT_BOX)\n                sc.ForwardSetState(SCE_TCL_COMMENT_BOX);\n            else if (lineState == LS_OPEN_DOUBLE_QUOTE)\n                sc.ForwardSetState(SCE_TCL_IN_QUOTE);\n            else\n                sc.ForwardSetState(SCE_TCL_DEFAULT);\n\t\t\tprevSlash = false;\n\t\t\tpreviousLevel = currentLevel;\n\t\t\tgoto next;\n\t\t}\n\n\t\tif (prevSlash) {\n            prevSlash = false;\n            if (sc.ch == '#' && IsANumberChar(sc.chNext))\n                sc.ForwardSetState(SCE_TCL_NUMBER);\n            continue;\n\t\t}\n        prevSlash = sc.ch == '\\\\';\n        if (isComment(sc.state))\n            continue;\n\t\tif (sc.atLineStart) {\n\t\t\tvisibleChars = false;\n\t\t\tif (sc.state!=SCE_TCL_IN_QUOTE && !isComment(sc.state))\n            {\n\t\t\t\tsc.SetState(SCE_TCL_DEFAULT);\n                expected = IsAWordStart(sc.ch)|| isspacechar(static_cast<unsigned char>(sc.ch));\n            }\n\t\t}\n\n\t\tswitch (sc.state) {\n\t\tcase SCE_TCL_NUMBER:\n\t\t\tif (!IsANumberChar(sc.ch))\n\t\t\t\tsc.SetState(SCE_TCL_DEFAULT);\n\t\t\tbreak;\n\t\tcase SCE_TCL_IN_QUOTE:\n\t\t\tif (sc.ch == '\"') {\n\t\t\t\tsc.ForwardSetState(SCE_TCL_DEFAULT);\n\t\t\t\tvisibleChars = true; // necessary if a \" is the first and only character on a line\n\t\t\t\tgoto next;\n\t\t\t} else if (sc.ch == '[' || sc.ch == ']' || sc.ch == '$') {\n\t\t\t\tsc.SetState(SCE_TCL_OPERATOR);\n                expected = sc.ch == '[';\n                sc.ForwardSetState(SCE_TCL_IN_QUOTE);\n\t\t\t\tgoto next;\n\t\t\t}\n            continue;\n        case SCE_TCL_OPERATOR:\n\t\t\tsc.SetState(SCE_TCL_DEFAULT);\n\t\t\tbreak;\n\t\t}\n\n\t\tif (sc.ch == '#') {\n\t\t\tif (visibleChars) {\n                if (sc.state != SCE_TCL_IN_QUOTE && expected)\n\t\t\t\t\tsc.SetState(SCE_TCL_COMMENT);\n\t\t\t} else {\n                sc.SetState(SCE_TCL_COMMENTLINE);\n                if (sc.chNext == '~')\n                    sc.SetState(SCE_TCL_BLOCK_COMMENT);\n                if (sc.atLineStart && (sc.chNext == '#' || sc.chNext == '-'))\n                        sc.SetState(SCE_TCL_COMMENT_BOX);\n            }\n        }\n\n\t\tif (!isspacechar(static_cast<unsigned char>(sc.ch))) {\n\t\t\tvisibleChars = true;\n\t\t}\n\n\t\tif (sc.ch == '\\\\') {\n\t\t\tprevSlash = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_TCL_DEFAULT) {\n            if (IsAWordStart(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_TCL_IDENTIFIER);\n\t\t\t} else if (IsADigit(sc.ch) && !IsAWordChar(sc.chPrev)) {\n\t\t\t\tsc.SetState(SCE_TCL_NUMBER);\n\t\t\t} else {\n\t\t\t\tswitch (sc.ch) {\n\t\t\t\tcase '\\\"':\n\t\t\t\t\tsc.SetState(SCE_TCL_IN_QUOTE);\n\t\t\t\t\tbreak;\n\t\t\t\tcase '{':\n\t\t\t\t\tsc.SetState(SCE_TCL_OPERATOR);\n\t\t\t\t\texpected = true;\n\t\t\t\t\t++currentLevel;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '}':\n\t\t\t\t\tsc.SetState(SCE_TCL_OPERATOR);\n\t\t\t\t\texpected = true;\n\t\t\t\t\t--currentLevel;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '[':\n                    expected = true;\n\t\t\t\tcase ']':\n\t\t\t\tcase '(':\n\t\t\t\tcase ')':\n\t\t\t\t\tsc.SetState(SCE_TCL_OPERATOR);\n\t\t\t\t\tbreak;\n\t\t\t\tcase ';':\n                    expected = true;\n\t\t\t\t\tbreak;\n                case '$':\n                    subParen = 0;\n                    if (sc.chNext != '{') {\n                        sc.SetState(SCE_TCL_SUBSTITUTION);\n                    }\n                    else {\n                        sc.SetState(SCE_TCL_OPERATOR);  // $\n                        sc.Forward();  // {\n                        sc.ForwardSetState(SCE_TCL_SUB_BRACE);\n                        subBrace = true;\n                    }\n                    break;\n                case '#':\n                    if ((isspacechar(static_cast<unsigned char>(sc.chPrev))||\n                            isoperator(static_cast<char>(sc.chPrev))) && IsADigit(sc.chNext,0x10))\n                        sc.SetState(SCE_TCL_NUMBER);\n                    break;\n                case '-':\n                    sc.SetState(IsADigit(sc.chNext)? SCE_TCL_NUMBER: SCE_TCL_MODIFIER);\n                    break;\n                default:\n                    if (isoperator(static_cast<char>(sc.ch))) {\n                        sc.SetState(SCE_TCL_OPERATOR);\n                    }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n}\n\nstatic const char * const tclWordListDesc[] = {\n            \"TCL Keywords\",\n            \"TK Keywords\",\n            \"iTCL Keywords\",\n            \"tkCommands\",\n            \"expand\"\n            \"user1\",\n            \"user2\",\n            \"user3\",\n            \"user4\",\n            0\n        };\n\n// this code supports folding in the colourizer\nLexerModule lmTCL(SCLEX_TCL, ColouriseTCLDoc, \"tcl\", 0, tclWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexTCMD.cpp",
    "content": "// Scintilla\\ source code edit control\n/** @file LexTCMD.cxx\n ** Lexer for Take Command / TCC batch scripts (.bat, .btm, .cmd).\n **/\n// Written by Rex Conn (rconn [at] jpsoft [dot] com)\n// based on the CMD lexer\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n\nstatic bool IsAlphabetic(int ch) {\n\treturn IsASCII(ch) && isalpha(ch);\n}\n\nstatic inline bool AtEOL(Accessor &styler, unsigned int i) {\n\treturn (styler[i] == '\\n') || ((styler[i] == '\\r') && (styler.SafeGetCharAt(i + 1) != '\\n'));\n}\n\n// Tests for BATCH Operators\nstatic bool IsBOperator(char ch) {\n\treturn (ch == '=') || (ch == '+') || (ch == '>') || (ch == '<') || (ch == '|') || (ch == '&') || (ch == '!') || (ch == '?') || (ch == '*') || (ch == '(') || (ch == ')');\n}\n\n// Tests for BATCH Separators\nstatic bool IsBSeparator(char ch) {\n\treturn (ch == '\\\\') || (ch == '.') || (ch == ';') || (ch == ' ') || (ch == '\\t') || (ch == '[') || (ch == ']') || (ch == '\\\"') || (ch == '\\'') || (ch == '/');\n}\n\n// Tests for Environment Variable symbol\nstatic inline bool IsEnvironmentVar(char ch) {\n\treturn isalpha(ch) || isdigit(ch) || (ch == '_') || (ch == '$');\n}\n\n// Find length of CMD FOR variable with modifier (%~...) or return 0\nstatic unsigned int GetBatchVarLen( char *wordBuffer )\n{\n\tint nLength = 0;\n\tif ( wordBuffer[0] == '%' ) {\n\t\t\n\t\tif ( wordBuffer[1] == '~' )\n\t\t\tnLength = 2;\n\t\telse if (( wordBuffer[1] == '%' ) && ( wordBuffer[2] == '~' ))\n\t\t\tnLength++;\n\t\telse\n\t\t\treturn 0;\n\n\t\tfor ( ; ( wordBuffer[nLength] ); nLength++ ) {\n\n\t\t\tswitch ( toupper(wordBuffer[nLength]) ) {\n\t\t\tcase 'A':\n\t\t\t\t// file attributes\n\t\t\tcase 'D':\n\t\t\t\t// drive letter only\n\t\t\tcase 'F':\n\t\t\t\t// fully qualified path name\n\t\t\tcase 'N':\n\t\t\t\t// filename only\n\t\t\tcase 'P':\n\t\t\t\t// path only\n\t\t\tcase 'S':\n\t\t\t\t// short name\n\t\t\tcase 'T':\n\t\t\t\t// date / time of file\n\t\t\tcase 'X':\n\t\t\t\t// file extension only\n\t\t\tcase 'Z':\n\t\t\t\t// file size\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn nLength;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nLength;\n}\n\n\nstatic void ColouriseTCMDLine( char *lineBuffer, unsigned int lengthLine, unsigned int startLine, unsigned int endPos, WordList *keywordlists[], Accessor &styler)\n{\n\tunsigned int offset = 0;\t// Line Buffer Offset\n\tchar wordBuffer[260];\t\t// Word Buffer - large to catch long paths\n\tunsigned int wbl;\t\t\t// Word Buffer Length\n\tunsigned int wbo;\t\t\t// Word Buffer Offset - also Special Keyword Buffer Length\n\tWordList &keywords = *keywordlists[0];      // Internal Commands\n//\tWordList &keywords2 = *keywordlists[1];     // Aliases (optional)\n\tbool isDelayedExpansion = 1;\t\t\t\t// !var!\n\n\tbool continueProcessing = true;\t// Used to toggle Regular Keyword Checking\n\t// Special Keywords are those that allow certain characters without whitespace after the command\n\t// Examples are: cd. cd\\ echo: echo. path=\n\tbool inString = false; // Used for processing while \"\"\n\t// Special Keyword Buffer used to determine if the first n characters is a Keyword\n\tchar sKeywordBuffer[260];\t// Special Keyword Buffer\n\tbool sKeywordFound;\t\t// Exit Special Keyword for-loop if found\n\n\t// Skip leading whitespace\n\twhile ((offset < lengthLine) && (isspacechar(lineBuffer[offset]))) {\n\t\toffset++;\n\t}\n\t// Colorize Default Text\n\tstyler.ColourTo(startLine + offset - 1, SCE_TCMD_DEFAULT);\n\n\tif ( offset >= lengthLine )\n\t\treturn;\n\n\t// Check for Fake Label (Comment) or Real Label - return if found\n\tif (lineBuffer[offset] == ':') {\n\t\tif (lineBuffer[offset + 1] == ':') {\n\t\t\t// Colorize Fake Label (Comment) - :: is the same as REM\n\t\t\tstyler.ColourTo(endPos, SCE_TCMD_COMMENT);\n\t\t} else {\n\t\t\t// Colorize Real Label\n\t\t\tstyler.ColourTo(endPos, SCE_TCMD_LABEL);\n\t\t}\n\t\treturn;\n\n\t// Check for Comment - return if found\n\t} else if (( CompareNCaseInsensitive(lineBuffer+offset, \"rem\", 3) == 0 ) && (( lineBuffer[offset+3] == 0 ) || ( isspace(lineBuffer[offset+3] )))) {\n\t\t\tstyler.ColourTo(endPos, SCE_TCMD_COMMENT);\n\t\t\treturn;\n\n\t// Check for Drive Change (Drive Change is internal command) - return if found\n\t} else if ((IsAlphabetic(lineBuffer[offset])) &&\n\t\t(lineBuffer[offset + 1] == ':') &&\n\t\t((isspacechar(lineBuffer[offset + 2])) ||\n\t\t(((lineBuffer[offset + 2] == '\\\\')) &&\n\t\t(isspacechar(lineBuffer[offset + 3]))))) {\n\t\t// Colorize Regular Keyword\n\t\tstyler.ColourTo(endPos, SCE_TCMD_WORD);\n\t\treturn;\n\t}\n\n\t// Check for Hide Command (@ECHO OFF/ON)\n\tif (lineBuffer[offset] == '@') {\n\t\tstyler.ColourTo(startLine + offset, SCE_TCMD_HIDE);\n\t\toffset++;\n\t}\n\t// Skip whitespace\n\twhile ((offset < lengthLine) && (isspacechar(lineBuffer[offset]))) {\n\t\toffset++;\n\t}\n\n\t// Read remainder of line word-at-a-time or remainder-of-word-at-a-time\n\twhile (offset < lengthLine) {\n\t\tif (offset > startLine) {\n\t\t\t// Colorize Default Text\n\t\t\tstyler.ColourTo(startLine + offset - 1, SCE_TCMD_DEFAULT);\n\t\t}\n\t\t// Copy word from Line Buffer into Word Buffer\n\t\twbl = 0;\n\t\tfor (; offset < lengthLine && ( wbl < 260 ) && !isspacechar(lineBuffer[offset]); wbl++, offset++) {\n\t\t\twordBuffer[wbl] = static_cast<char>(tolower(lineBuffer[offset]));\n\t\t}\n\t\twordBuffer[wbl] = '\\0';\n\t\twbo = 0;\n\n\t\t// Check for Separator\n\t\tif (IsBSeparator(wordBuffer[0])) {\n\n\t\t\t// Reset Offset to re-process remainder of word\n\t\t\toffset -= (wbl - 1);\n\t\t\t// Colorize Default Text\n\t\t\tstyler.ColourTo(startLine + offset - 1, SCE_BAT_DEFAULT);\n\n\t\t\tif (wordBuffer[0] == '\"')\n\t\t\t\tinString = !inString;\n\n\t\t// Check for Regular expression\n\t\t} else if (( wordBuffer[0] == ':' ) && ( wordBuffer[1] == ':' ) && (continueProcessing)) {\n\n\t\t\t// Colorize Regular exoressuin\n\t\t\tstyler.ColourTo(startLine + offset - 1, SCE_TCMD_DEFAULT);\n\t\t\t// No need to Reset Offset\n\n\t\t// Check for Labels in text (... :label)\n\t\t} else if (wordBuffer[0] == ':' && isspacechar(lineBuffer[offset - wbl - 1])) {\n\t\t\t// Colorize Default Text\n\t\t\tstyler.ColourTo(startLine + offset - 1 - wbl, SCE_TCMD_DEFAULT);\n\t\t\t// Colorize Label\n\t\t\tstyler.ColourTo(startLine + offset - 1, SCE_TCMD_CLABEL);\n\t\t\t// No need to Reset Offset\n\t\t// Check for delayed expansion Variable (!x...!)\n\t\t} else if (isDelayedExpansion && wordBuffer[0] == '!') {\n\t\t\t// Colorize Default Text\n\t\t\tstyler.ColourTo(startLine + offset - 1 - wbl, SCE_TCMD_DEFAULT);\n\t\t\twbo++;\n\t\t\t// Search to end of word for second !\n\t\t\twhile ((wbo < wbl) && (wordBuffer[wbo] != '!') && (!IsBOperator(wordBuffer[wbo])) && (!IsBSeparator(wordBuffer[wbo]))) {\n\t\t\t\twbo++;\n\t\t\t}\n\t\t\tif (wordBuffer[wbo] == '!') {\n\t\t\t\twbo++;\n\t\t\t\t// Colorize Environment Variable\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_TCMD_EXPANSION);\n\t\t\t} else {\n\t\t\t\twbo = 1;\n\t\t\t\t// Colorize Symbol\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - 1), SCE_TCMD_DEFAULT);\n\t\t\t}\n\n\t\t\t// Reset Offset to re-process remainder of word\n\t\t\toffset -= (wbl - wbo);\n\n\t\t// Check for Regular Keyword in list\n\t\t} else if ((keywords.InList(wordBuffer)) &&\t(!inString) && (continueProcessing)) {\n\n\t\t\t// ECHO, PATH, and PROMPT require no further Regular Keyword Checking\n\t\t\tif ((CompareCaseInsensitive(wordBuffer, \"echo\") == 0) ||\n\t\t\t  (CompareCaseInsensitive(sKeywordBuffer, \"echos\") == 0) ||\n\t\t\t  (CompareCaseInsensitive(sKeywordBuffer, \"echoerr\") == 0) ||\n\t\t\t  (CompareCaseInsensitive(sKeywordBuffer, \"echoserr\") == 0) ||\n\t\t\t  (CompareCaseInsensitive(wordBuffer, \"path\") == 0) ||\n\t\t\t  (CompareCaseInsensitive(wordBuffer, \"prompt\") == 0)) {\n\t\t\t\tcontinueProcessing = false;\n\t\t\t}\n\n\t\t\t// Colorize Regular keyword\n\t\t\tstyler.ColourTo(startLine + offset - 1, SCE_TCMD_WORD);\n\t\t\t// No need to Reset Offset\n\n\t\t} else if ((wordBuffer[0] != '%') && (wordBuffer[0] != '!') && (!IsBOperator(wordBuffer[0])) &&\t(!inString) && (continueProcessing)) {\n\n\t\t\t// a few commands accept \"illegal\" syntax -- cd\\, echo., etc.\n\t\t\tsscanf( wordBuffer, \"%[^.<>|&=\\\\/]\", sKeywordBuffer );\n\t\t\tsKeywordFound = false;\n\n\t\t\tif ((CompareCaseInsensitive(sKeywordBuffer, \"echo\") == 0) ||\n\t\t\t  (CompareCaseInsensitive(sKeywordBuffer, \"echos\") == 0) ||\n\t\t\t  (CompareCaseInsensitive(sKeywordBuffer, \"echoerr\") == 0) ||\n\t\t\t  (CompareCaseInsensitive(sKeywordBuffer, \"echoserr\") == 0) || \n\t\t\t  (CompareCaseInsensitive(sKeywordBuffer, \"cd\") == 0) ||\n\t\t\t  (CompareCaseInsensitive(sKeywordBuffer, \"path\") == 0) ||\n\t\t\t  (CompareCaseInsensitive(sKeywordBuffer, \"prompt\") == 0)) {\n\n\t\t\t\t// no further Regular Keyword Checking\n\t\t\t\tcontinueProcessing = false;\n\t\t\t\tsKeywordFound = true;\n\t\t\t\twbo = (unsigned int)strlen( sKeywordBuffer );\n\n\t\t\t\t// Colorize Special Keyword as Regular Keyword\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_TCMD_WORD);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - wbo);\n\t\t\t}\n\n\t\t\t// Check for Default Text\n\t\t\tif (!sKeywordFound) {\n\t\t\t\twbo = 0;\n\t\t\t\t// Read up to %, Operator or Separator\n\t\t\t\twhile ((wbo < wbl) && (wordBuffer[wbo] != '%') && (!isDelayedExpansion || wordBuffer[wbo] != '!') && (!IsBOperator(wordBuffer[wbo])) &&\t(!IsBSeparator(wordBuffer[wbo]))) {\n\t\t\t\t\twbo++;\n\t\t\t\t}\n\t\t\t\t// Colorize Default Text\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_TCMD_DEFAULT);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - wbo);\n\t\t\t}\n\n\t\t// Check for Argument  (%n), Environment Variable (%x...%) or Local Variable (%%a)\n\t\t} else if (wordBuffer[0] == '%') {\n\t\t\tunsigned int varlen;\n\t\t\tunsigned int n = 1;\n\t\t\t// Colorize Default Text\n\t\t\tstyler.ColourTo(startLine + offset - 1 - wbl, SCE_TCMD_DEFAULT);\n\t\t\twbo++;\n\n\t\t\t// check for %[nn] syntax\n\t\t\tif ( wordBuffer[1] == '[' ) {\n\t\t\t\tn++;\n\t\t\t\twhile ((n < wbl) && (wordBuffer[n] != ']')) {\n\t\t\t\t\tn++;\n\t\t\t\t}\n\t\t\t\tif ( wordBuffer[n] == ']' )\n\t\t\t\t\tn++;\n\t\t\t\tgoto ColorizeArg;\n\t\t\t}\n\n\t\t\t// Search to end of word for second % or to the first terminator (can be a long path)\n\t\t\twhile ((wbo < wbl) && (wordBuffer[wbo] != '%') && (!IsBOperator(wordBuffer[wbo])) && (!IsBSeparator(wordBuffer[wbo]))) {\n\t\t\t\twbo++;\n\t\t\t}\n\n\t\t\t// Check for Argument (%n) or (%*)\n\t\t\tif (((isdigit(wordBuffer[1])) || (wordBuffer[1] == '*')) && (wordBuffer[wbo] != '%')) {\n\t\t\t\twhile (( wordBuffer[n] ) && ( strchr( \"%0123456789*#$\", wordBuffer[n] ) != NULL ))\n\t\t\t\t\tn++;\nColorizeArg:\n\t\t\t\t// Colorize Argument\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - n), SCE_TCMD_IDENTIFIER);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - n);\n\n\t\t\t// Check for Variable with modifiers (%~...)\n\t\t\t} else if ((varlen = GetBatchVarLen(wordBuffer)) != 0) {\n\n\t\t\t\t// Colorize Variable\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - varlen), SCE_TCMD_IDENTIFIER);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - varlen);\n\n\t\t\t// Check for Environment Variable (%x...%)\n\t\t\t} else if (( wordBuffer[1] ) && ( wordBuffer[1] != '%')) {\n\t\t\t\tif ( wordBuffer[wbo] == '%' )\n\t\t\t\t\twbo++;\n\n\t\t\t\t// Colorize Environment Variable\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_TCMD_ENVIRONMENT);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - wbo);\n\n\t\t\t// Check for Local Variable (%%a)\n\t\t\t} else if (\t(wbl > 2) && (wordBuffer[1] == '%') && (wordBuffer[2] != '%') && (!IsBOperator(wordBuffer[2])) && (!IsBSeparator(wordBuffer[2]))) {\n\n\t\t\t\tn = 2;\n\t\t\t\twhile (( wordBuffer[n] ) && (!IsBOperator(wordBuffer[n])) && (!IsBSeparator(wordBuffer[n])))\n\t\t\t\t\tn++;\n\n\t\t\t\t// Colorize Local Variable\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - n), SCE_TCMD_IDENTIFIER);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - n);\n\n\t\t\t// Check for %%\n\t\t\t} else if ((wbl > 1) && (wordBuffer[1] == '%')) {\n\n\t\t\t\t// Colorize Symbols\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - 2), SCE_TCMD_DEFAULT);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - 2);\n\t\t\t} else {\n\n\t\t\t\t// Colorize Symbol\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - 1), SCE_TCMD_DEFAULT);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - 1);\n\t\t\t}\n\n\t\t// Check for Operator\n\t\t} else if (IsBOperator(wordBuffer[0])) {\n\t\t\t// Colorize Default Text\n\t\t\tstyler.ColourTo(startLine + offset - 1 - wbl, SCE_TCMD_DEFAULT);\n\n\t\t\t// Check for Pipe, compound, or conditional Operator\n\t\t\tif ((wordBuffer[0] == '|') || (wordBuffer[0] == '&')) {\n\n\t\t\t\t// Colorize Pipe Operator\n\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - 1), SCE_TCMD_OPERATOR);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - 1);\n\t\t\t\tcontinueProcessing = true;\n\n\t\t\t// Check for Other Operator\n\t\t\t} else {\n\t\t\t\t// Check for > Operator\n\t\t\t\tif ((wordBuffer[0] == '>') || (wordBuffer[0] == '<')) {\n\t\t\t\t\t// Turn Keyword and External Command / Program checking back on\n\t\t\t\t\tcontinueProcessing = true;\n\t\t\t\t}\n\t\t\t\t// Colorize Other Operator\n\t\t\t\tif (!inString || !(wordBuffer[0] == '(' || wordBuffer[0] == ')'))\n\t\t\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - 1), SCE_TCMD_OPERATOR);\n\t\t\t\t// Reset Offset to re-process remainder of word\n\t\t\t\toffset -= (wbl - 1);\n\t\t\t}\n\n\t\t// Check for Default Text\n\t\t} else {\n\t\t\t// Read up to %, Operator or Separator\n\t\t\twhile ((wbo < wbl) && (wordBuffer[wbo] != '%') && (!isDelayedExpansion || wordBuffer[wbo] != '!') && (!IsBOperator(wordBuffer[wbo])) &&\t(!IsBSeparator(wordBuffer[wbo]))) {\n\t\t\t\twbo++;\n\t\t\t}\n\t\t\t// Colorize Default Text\n\t\t\tstyler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_TCMD_DEFAULT);\n\t\t\t// Reset Offset to re-process remainder of word\n\t\t\toffset -= (wbl - wbo);\n\t\t}\n\n\t\t// Skip whitespace - nothing happens if Offset was Reset\n\t\twhile ((offset < lengthLine) && (isspacechar(lineBuffer[offset]))) {\n\t\t\toffset++;\n\t\t}\n\t}\n\t// Colorize Default Text for remainder of line - currently not lexed\n\tstyler.ColourTo(endPos, SCE_TCMD_DEFAULT);\n}\n\nstatic void ColouriseTCMDDoc( unsigned int startPos, int length, int /*initStyle*/, WordList *keywordlists[], Accessor &styler )\n{\n\tchar lineBuffer[16384];\n\n\tstyler.StartAt(startPos);\n\tstyler.StartSegment(startPos);\n\tunsigned int linePos = 0;\n\tunsigned int startLine = startPos;\n\tfor (unsigned int i = startPos; i < startPos + length; i++) {\n\t\tlineBuffer[linePos++] = styler[i];\n\t\tif (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {\n\t\t\t// End of line (or of line buffer) met, colourise it\n\t\t\tlineBuffer[linePos] = '\\0';\n\t\t\tColouriseTCMDLine(lineBuffer, linePos, startLine, i, keywordlists, styler);\n\t\t\tlinePos = 0;\n\t\t\tstartLine = i + 1;\n\t\t}\n\t}\n\tif (linePos > 0) {\t// Last line does not have ending characters\n\t\tlineBuffer[linePos] = '\\0';\n\t\tColouriseTCMDLine(lineBuffer, linePos, startLine, startPos + length - 1, keywordlists, styler);\n\t}\n}\n\n// Convert string to upper case\nstatic void StrUpr(char *s) {\n\twhile (*s) {\n\t\t*s = MakeUpperCase(*s);\n\t\ts++;\n\t}\n}\n\n// Folding support (for DO, IFF, SWITCH, TEXT, and command groups)\nstatic void FoldTCMDDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)\n{\n\tint line = styler.GetLine(startPos);\n\tint level = styler.LevelAt(line);\n\tint levelIndent = 0;\n\tunsigned int endPos = startPos + length;\n\tchar s[16] = \"\";\n\n    char chPrev = styler.SafeGetCharAt(startPos - 1);\n\n\t// Scan for ( and )\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\n\t\tint c = styler.SafeGetCharAt(i, '\\n');\n\t\tint style = styler.StyleAt(i);\n        bool bLineStart = ((chPrev == '\\r') || (chPrev == '\\n')) || i == 0;\n\n\t\tif (style == SCE_TCMD_OPERATOR) {\n\t\t\t// CheckFoldPoint\n\t\t\tif (c == '(') {\n\t\t\t\tlevelIndent += 1;\n\t\t\t} else if (c == ')') {\n\t\t\t\tlevelIndent -= 1;\n\t\t\t}\n\t\t}\n\n        if (( bLineStart ) && ( style == SCE_TCMD_WORD )) {\n            for (unsigned int j = 0; j < 10; j++) {\n                if (!iswordchar(styler[i + j])) {\n                    break;\n                }\n                s[j] = styler[i + j];\n                s[j + 1] = '\\0';\n            }\n\n\t\t\tStrUpr( s );\n            if ((strcmp(s, \"DO\") == 0) || (strcmp(s, \"IFF\") == 0) || (strcmp(s, \"SWITCH\") == 0) || (strcmp(s, \"TEXT\") == 0)) {\n                levelIndent++;\n            } else if ((strcmp(s, \"ENDDO\") == 0) || (strcmp(s, \"ENDIFF\") == 0) || (strcmp(s, \"ENDSWITCH\") == 0) || (strcmp(s, \"ENDTEXT\") == 0)) {\n                levelIndent--;\n            }\n        }\n\n\t\tif (c == '\\n') { // line end\n\t\t\t\tif (levelIndent > 0) {\n\t\t\t\t\t\tlevel |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t\t}\n\t\t\t\tif (level != styler.LevelAt(line))\n\t\t\t\t\t\tstyler.SetLevel(line, level);\n\t\t\t\tlevel += levelIndent;\n\t\t\t\tif ((level & SC_FOLDLEVELNUMBERMASK) < SC_FOLDLEVELBASE)\n\t\t\t\t\t\tlevel = SC_FOLDLEVELBASE;\n\t\t\t\tline++;\n\t\t\t\t// reset state\n\t\t\t\tlevelIndent = 0;\n\t\t\t\tlevel &= ~SC_FOLDLEVELHEADERFLAG;\n\t\t\t\tlevel &= ~SC_FOLDLEVELWHITEFLAG;\n\t\t}\n\n\t\tchPrev = c;\n\t}\n}\n\nstatic const char *const tcmdWordListDesc[] = {\n\t\"Internal Commands\",\n\t\"Aliases\",\n\t0\n};\n\nLexerModule lmTCMD(SCLEX_TCMD, ColouriseTCMDDoc, \"tcmd\", FoldTCMDDoc, tcmdWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexTeX.cpp",
    "content": "// Scintilla source code edit control\n\n// File: LexTeX.cxx - general context conformant tex coloring scheme\n// Author: Hans Hagen - PRAGMA ADE - Hasselt NL - www.pragma-ade.com\n// Version: September 28, 2003\n\n// Copyright: 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n// This lexer is derived from the one written for the texwork environment (1999++) which in\n// turn is inspired on texedit (1991++) which finds its roots in wdt (1986).\n\n// If you run into strange boundary cases, just tell me and I'll look into it.\n\n\n// TeX Folding code added by instanton (soft_share@126.com) with borrowed code from VisualTeX source by Alex Romanenko.\n// Version: June 22, 2007\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n// val SCE_TEX_DEFAULT = 0\n// val SCE_TEX_SPECIAL = 1\n// val SCE_TEX_GROUP   = 2\n// val SCE_TEX_SYMBOL  = 3\n// val SCE_TEX_COMMAND = 4\n// val SCE_TEX_TEXT    = 5\n\n// Definitions in SciTEGlobal.properties:\n//\n// TeX Highlighting\n//\n// # Default\n// style.tex.0=fore:#7F7F00\n// # Special\n// style.tex.1=fore:#007F7F\n// # Group\n// style.tex.2=fore:#880000\n// # Symbol\n// style.tex.3=fore:#7F7F00\n// # Command\n// style.tex.4=fore:#008800\n// # Text\n// style.tex.5=fore:#000000\n\n// lexer.tex.interface.default=0\n// lexer.tex.comment.process=0\n\n// todo: lexer.tex.auto.if\n\n// Auxiliary functions:\n\nstatic inline bool endOfLine(Accessor &styler, unsigned int i) {\n\treturn\n      (styler[i] == '\\n') || ((styler[i] == '\\r') && (styler.SafeGetCharAt(i + 1) != '\\n')) ;\n}\n\nstatic inline bool isTeXzero(int ch) {\n\treturn\n      (ch == '%') ;\n}\n\nstatic inline bool isTeXone(int ch) {\n\treturn\n      (ch == '[') || (ch == ']') || (ch == '=') || (ch == '#') ||\n      (ch == '(') || (ch == ')') || (ch == '<') || (ch == '>') ||\n      (ch == '\"') ;\n}\n\nstatic inline bool isTeXtwo(int ch) {\n\treturn\n      (ch == '{') || (ch == '}') || (ch == '$') ;\n}\n\nstatic inline bool isTeXthree(int ch) {\n\treturn\n      (ch == '~') || (ch == '^') || (ch == '_') || (ch == '&') ||\n      (ch == '-') || (ch == '+') || (ch == '\\\"') || (ch == '`') ||\n      (ch == '/') || (ch == '|') || (ch == '%') ;\n}\n\nstatic inline bool isTeXfour(int ch) {\n\treturn\n      (ch == '\\\\') ;\n}\n\nstatic inline bool isTeXfive(int ch) {\n\treturn\n      ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) ||\n      (ch == '@') || (ch == '!') || (ch == '?') ;\n}\n\nstatic inline bool isTeXsix(int ch) {\n\treturn\n      (ch == ' ') ;\n}\n\nstatic inline bool isTeXseven(int ch) {\n\treturn\n      (ch == '^') ;\n}\n\n// Interface determination\n\nstatic int CheckTeXInterface(\n    unsigned int startPos,\n    int length,\n    Accessor &styler,\n\tint defaultInterface) {\n\n    char lineBuffer[1024] ;\n\tunsigned int linePos = 0 ;\n\n    // some day we can make something lexer.tex.mapping=(all,0)(nl,1)(en,2)...\n\n    if (styler.SafeGetCharAt(0) == '%') {\n        for (unsigned int i = 0; i < startPos + length; i++) {\n            lineBuffer[linePos++] = styler.SafeGetCharAt(i) ;\n            if (endOfLine(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {\n                lineBuffer[linePos] = '\\0';\n                if (strstr(lineBuffer, \"interface=all\")) {\n                    return 0 ;\n\t\t\t\t} else if (strstr(lineBuffer, \"interface=tex\")) {\n                    return 1 ;\n                } else if (strstr(lineBuffer, \"interface=nl\")) {\n                    return 2 ;\n                } else if (strstr(lineBuffer, \"interface=en\")) {\n                    return 3 ;\n                } else if (strstr(lineBuffer, \"interface=de\")) {\n                    return 4 ;\n                } else if (strstr(lineBuffer, \"interface=cz\")) {\n                    return 5 ;\n                } else if (strstr(lineBuffer, \"interface=it\")) {\n                    return 6 ;\n                } else if (strstr(lineBuffer, \"interface=ro\")) {\n                    return 7 ;\n                } else if (strstr(lineBuffer, \"interface=latex\")) {\n\t\t\t\t\t// we will move latex cum suis up to 91+ when more keyword lists are supported\n                    return 8 ;\n\t\t\t\t} else if (styler.SafeGetCharAt(1) == 'D' && strstr(lineBuffer, \"%D \\\\module\")) {\n\t\t\t\t\t// better would be to limit the search to just one line\n\t\t\t\t\treturn 3 ;\n                } else {\n                    return defaultInterface ;\n                }\n            }\n\t\t}\n    }\n\n    return defaultInterface ;\n}\n\nstatic void ColouriseTeXDoc(\n    unsigned int startPos,\n    int length,\n    int,\n    WordList *keywordlists[],\n    Accessor &styler) {\n\n\tstyler.StartAt(startPos) ;\n\tstyler.StartSegment(startPos) ;\n\n\tbool processComment   = styler.GetPropertyInt(\"lexer.tex.comment.process\",   0) == 1 ;\n\tbool useKeywords      = styler.GetPropertyInt(\"lexer.tex.use.keywords\",      1) == 1 ;\n\tbool autoIf           = styler.GetPropertyInt(\"lexer.tex.auto.if\",           1) == 1 ;\n\tint  defaultInterface = styler.GetPropertyInt(\"lexer.tex.interface.default\", 1) ;\n\n\tchar key[100] ;\n\tint  k ;\n\tbool newifDone = false ;\n\tbool inComment = false ;\n\n\tint currentInterface = CheckTeXInterface(startPos,length,styler,defaultInterface) ;\n\n    if (currentInterface == 0) {\n        useKeywords = false ;\n        currentInterface = 1 ;\n    }\n\n    WordList &keywords = *keywordlists[currentInterface-1] ;\n\n\tStyleContext sc(startPos, length, SCE_TEX_TEXT, styler);\n\n\tbool going = sc.More() ; // needed because of a fuzzy end of file state\n\n\tfor (; going; sc.Forward()) {\n\n\t\tif (! sc.More()) { going = false ; } // we need to go one behind the end of text\n\n\t\tif (inComment) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tsc.SetState(SCE_TEX_TEXT) ;\n\t\t\t\tnewifDone = false ;\n\t\t\t\tinComment = false ;\n\t\t\t}\n\t\t} else {\n\t\t\tif (! isTeXfive(sc.ch)) {\n\t\t\t\tif (sc.state == SCE_TEX_COMMAND) {\n\t\t\t\t\tif (sc.LengthCurrent() == 1) { // \\<noncstoken>\n\t\t\t\t\t\tif (isTeXseven(sc.ch) && isTeXseven(sc.chNext)) {\n\t\t\t\t\t\t\tsc.Forward(2) ; // \\^^ and \\^^<token>\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsc.ForwardSetState(SCE_TEX_TEXT) ;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsc.GetCurrent(key, sizeof(key)-1) ;\n\t\t\t\t\t\tk = static_cast<int>(strlen(key)) ;\n\t\t\t\t\t\tmemmove(key,key+1,k) ; // shift left over escape token\n\t\t\t\t\t\tkey[k] = '\\0' ;\n\t\t\t\t\t\tk-- ;\n\t\t\t\t\t\tif (! keywords || ! useKeywords) {\n\t\t\t\t\t\t\tsc.SetState(SCE_TEX_COMMAND) ;\n\t\t\t\t\t\t\tnewifDone = false ;\n\t\t\t\t\t\t} else if (k == 1) { //\\<cstoken>\n\t\t\t\t\t\t\tsc.SetState(SCE_TEX_COMMAND) ;\n\t\t\t\t\t\t\tnewifDone = false ;\n\t\t\t\t\t\t} else if (keywords.InList(key)) {\n    \t\t\t\t\t\tsc.SetState(SCE_TEX_COMMAND) ;\n\t\t\t\t\t\t\tnewifDone = autoIf && (strcmp(key,\"newif\") == 0) ;\n\t\t\t\t\t\t} else if (autoIf && ! newifDone && (key[0] == 'i') && (key[1] == 'f') && keywords.InList(\"if\")) {\n\t    \t\t\t\t\tsc.SetState(SCE_TEX_COMMAND) ;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsc.ChangeState(SCE_TEX_TEXT) ;\n\t\t\t\t\t\t\tsc.SetState(SCE_TEX_TEXT) ;\n\t\t\t\t\t\t\tnewifDone = false ;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isTeXzero(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_TEX_SYMBOL);\n\n\t\t\t\t\tif (!endOfLine(styler,sc.currentPos + 1))\n\t\t\t\t\t\tsc.ForwardSetState(SCE_TEX_DEFAULT) ;\n\n\t\t\t\t\tinComment = ! processComment ;\n\t\t\t\t\tnewifDone = false ;\n\t\t\t\t} else if (isTeXseven(sc.ch) && isTeXseven(sc.chNext)) {\n\t\t\t\t\tsc.SetState(SCE_TEX_TEXT) ;\n\t\t\t\t\tsc.ForwardSetState(SCE_TEX_TEXT) ;\n\t\t\t\t} else if (isTeXone(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_TEX_SPECIAL) ;\n\t\t\t\t\tnewifDone = false ;\n\t\t\t\t} else if (isTeXtwo(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_TEX_GROUP) ;\n\t\t\t\t\tnewifDone = false ;\n\t\t\t\t} else if (isTeXthree(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_TEX_SYMBOL) ;\n\t\t\t\t\tnewifDone = false ;\n\t\t\t\t} else if (isTeXfour(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_TEX_COMMAND) ;\n\t\t\t\t} else if (isTeXsix(sc.ch)) {\n\t\t\t\t\tsc.SetState(SCE_TEX_TEXT) ;\n\t\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\t\tsc.SetState(SCE_TEX_TEXT) ;\n\t\t\t\t\tnewifDone = false ;\n\t\t\t\t\tinComment = false ;\n\t\t\t\t} else {\n\t\t\t\t\tsc.SetState(SCE_TEX_TEXT) ;\n\t\t\t\t}\n\t\t\t} else if (sc.state != SCE_TEX_COMMAND) {\n\t\t\t\tsc.SetState(SCE_TEX_TEXT) ;\n\t\t\t}\n\t\t}\n\t}\n\tsc.ChangeState(SCE_TEX_TEXT) ;\n\tsc.Complete();\n\n}\n\n\nstatic inline bool isNumber(int ch) {\n\treturn\n      (ch == '0') || (ch == '1') || (ch == '2') ||\n      (ch == '3') || (ch == '4') || (ch == '5') ||\n      (ch == '6') || (ch == '7') || (ch == '8') || (ch == '9');\n}\n\nstatic inline bool isWordChar(int ch) {\n\treturn ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z'));\n}\n\nstatic int ParseTeXCommand(unsigned int pos, Accessor &styler, char *command)\n{\n  int length=0;\n  char ch=styler.SafeGetCharAt(pos+1);\n\n  if(ch==',' || ch==':' || ch==';' || ch=='%'){\n      command[0]=ch;\n      command[1]=0;\n\t  return 1;\n  }\n\n  // find end\n     while(isWordChar(ch) && !isNumber(ch) && ch!='_' && ch!='.' && length<100){\n          command[length]=ch;\n          length++;\n          ch=styler.SafeGetCharAt(pos+length+1);\n     }\n\n  command[length]='\\0';\n  if(!length) return 0;\n  return length+1;\n}\n\nstatic int classifyFoldPointTeXPaired(const char* s) {\n\tint lev=0;\n\tif (!(isdigit(s[0]) || (s[0] == '.'))){\n\t\tif (strcmp(s, \"begin\")==0||strcmp(s,\"FoldStart\")==0||\n\t\t\tstrcmp(s,\"abstract\")==0||strcmp(s,\"unprotect\")==0||\n\t\t\tstrcmp(s,\"title\")==0||strncmp(s,\"start\",5)==0||strncmp(s,\"Start\",5)==0||\n\t\t\tstrcmp(s,\"documentclass\")==0||strncmp(s,\"if\",2)==0\n\t\t\t)\n\t\t\tlev=1;\n\t\tif (strcmp(s, \"end\")==0||strcmp(s,\"FoldStop\")==0||\n\t\t\tstrcmp(s,\"maketitle\")==0||strcmp(s,\"protect\")==0||\n\t\t\tstrncmp(s,\"stop\",4)==0||strncmp(s,\"Stop\",4)==0||\n\t\t\tstrcmp(s,\"fi\")==0\n\t\t\t)\n\t\tlev=-1;\n\t}\n\treturn lev;\n}\n\nstatic int classifyFoldPointTeXUnpaired(const char* s) {\n\tint lev=0;\n\tif (!(isdigit(s[0]) || (s[0] == '.'))){\n\t\tif (strcmp(s,\"part\")==0||\n\t\t\tstrcmp(s,\"chapter\")==0||\n\t\t\tstrcmp(s,\"section\")==0||\n\t\t\tstrcmp(s,\"subsection\")==0||\n\t\t\tstrcmp(s,\"subsubsection\")==0||\n\t\t\tstrcmp(s,\"CJKfamily\")==0||\n\t\t\tstrcmp(s,\"appendix\")==0||\n\t\t\tstrcmp(s,\"Topic\")==0||strcmp(s,\"topic\")==0||\n\t\t\tstrcmp(s,\"subject\")==0||strcmp(s,\"subsubject\")==0||\n\t\t\tstrcmp(s,\"def\")==0||strcmp(s,\"gdef\")==0||strcmp(s,\"edef\")==0||\n\t\t\tstrcmp(s,\"xdef\")==0||strcmp(s,\"framed\")==0||\n\t\t\tstrcmp(s,\"frame\")==0||\n\t\t\tstrcmp(s,\"foilhead\")==0||strcmp(s,\"overlays\")==0||strcmp(s,\"slide\")==0\n\t\t\t){\n\t\t\t    lev=1;\n\t\t\t}\n\t}\n\treturn lev;\n}\n\nstatic bool IsTeXCommentLine(int line, Accessor &styler) {\n\tint pos = styler.LineStart(line);\n\tint eol_pos = styler.LineStart(line + 1) - 1;\n\n\tint startpos = pos;\n\n\twhile (startpos<eol_pos){\n\t\tchar ch = styler[startpos];\n\t\tif (ch!='%' && ch!=' ') return false;\n\t\telse if (ch=='%') return true;\n\t\tstartpos++;\n\t}\n\n\treturn false;\n}\n\n// FoldTeXDoc: borrowed from VisualTeX with modifications\n\nstatic void FoldTexDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)\n{\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tunsigned int endPos = startPos+length;\n\tint visibleChars=0;\n\tint lineCurrent=styler.GetLine(startPos);\n\tint levelPrev=styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\n\tint levelCurrent=levelPrev;\n\tchar chNext=styler[startPos];\n\tchar buffer[100]=\"\";\n\n\tfor (unsigned int i=startPos; i < endPos; i++) {\n\t\tchar ch=chNext;\n\t\tchNext=styler.SafeGetCharAt(i+1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\n        if(ch=='\\\\') {\n            ParseTeXCommand(i, styler, buffer);\n\t\t\tlevelCurrent += classifyFoldPointTeXPaired(buffer)+classifyFoldPointTeXUnpaired(buffer);\n\t\t}\n\n\t\tif (levelCurrent > SC_FOLDLEVELBASE && ((ch == '\\r' || ch=='\\n') && (chNext == '\\\\'))) {\n            ParseTeXCommand(i+1, styler, buffer);\n\t\t\tlevelCurrent -= classifyFoldPointTeXUnpaired(buffer);\n\t\t}\n\n\tchar chNext2;\n\tchar chNext3;\n\tchar chNext4;\n\tchar chNext5;\n\tchNext2=styler.SafeGetCharAt(i+2);\n\tchNext3=styler.SafeGetCharAt(i+3);\n\tchNext4=styler.SafeGetCharAt(i+4);\n\tchNext5=styler.SafeGetCharAt(i+5);\n\n\tbool atEOfold = (ch == '%') &&\n\t\t\t(chNext == '%') && (chNext2=='}') &&\n\t\t\t\t(chNext3=='}')&& (chNext4=='-')&& (chNext5=='-');\n\n\tbool atBOfold = (ch == '%') &&\n\t\t\t(chNext == '%') && (chNext2=='-') &&\n\t\t\t\t(chNext3=='-')&& (chNext4=='{')&& (chNext5=='{');\n\n\tif(atBOfold){\n\t\tlevelCurrent+=1;\n\t}\n\n\tif(atEOfold){\n\t\tlevelCurrent-=1;\n\t}\n\n\tif(ch=='\\\\' && chNext=='['){\n\t\tlevelCurrent+=1;\n\t}\n\n\tif(ch=='\\\\' && chNext==']'){\n\t\tlevelCurrent-=1;\n\t}\n\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\n\tif (foldComment && atEOL && IsTeXCommentLine(lineCurrent, styler))\n        {\n            if (lineCurrent==0 && IsTeXCommentLine(lineCurrent + 1, styler)\n\t\t\t\t)\n                levelCurrent++;\n            else if (lineCurrent!=0 && !IsTeXCommentLine(lineCurrent - 1, styler)\n               && IsTeXCommentLine(lineCurrent + 1, styler)\n\t\t\t\t)\n                levelCurrent++;\n            else if (lineCurrent!=0 && IsTeXCommentLine(lineCurrent - 1, styler) &&\n                     !IsTeXCommentLine(lineCurrent+1, styler))\n                levelCurrent--;\n        }\n\n//---------------------------------------------------------------------------------------------\n\n\t\tif (atEOL) {\n\t\t\tint lev = levelPrev;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif ((levelCurrent > levelPrev) && (visibleChars > 0))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelPrev = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n\n\t// Fill in the real level of the next line, keeping the current flags as they will be filled in later\n\tint flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\n\tstyler.SetLevel(lineCurrent, levelPrev | flagsNext);\n}\n\n\n\n\nstatic const char * const texWordListDesc[] = {\n    \"TeX, eTeX, pdfTeX, Omega\",\n    \"ConTeXt Dutch\",\n    \"ConTeXt English\",\n    \"ConTeXt German\",\n    \"ConTeXt Czech\",\n    \"ConTeXt Italian\",\n    \"ConTeXt Romanian\",\n\t0,\n} ;\n\nLexerModule lmTeX(SCLEX_TEX,   ColouriseTeXDoc, \"tex\", FoldTexDoc, texWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexTxt2tags.cpp",
    "content": "/******************************************************************\n *  LexTxt2tags.cxx\n *\n *  A simple Txt2tags lexer for scintilla.\n *\n *\n *  Adapted by Eric Forgeot\n *  Based on the LexMarkdown.cxx by Jon Strait - jstrait@moonloop.net\n *\n *  What could be improved:\n *   - Verbatim lines could be like for raw lines : when there is no space between the ``` and the following text, the first letter should be colored so the user would understand there must be a space for a valid tag.\n *   - marks such as bold, italic, strikeout, underline should begin to be highlighted only when they are closed and valid.\n *   - verbatim and raw area should be highlighted too.\n *\n *  The License.txt file describes the conditions under which this\n *  software may be distributed.\n *\n *****************************************************************/\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n\n\nstatic inline bool IsNewline(const int ch) {\n    return (ch == '\\n' || ch == '\\r');\n}\n\n// True if can follow ch down to the end with possibly trailing whitespace\nstatic bool FollowToLineEnd(const int ch, const int state, const unsigned int endPos, StyleContext &sc) {\n    unsigned int i = 0;\n    while (sc.GetRelative(++i) == ch)\n        ;\n    // Skip over whitespace\n    while (IsASpaceOrTab(sc.GetRelative(i)) && sc.currentPos + i < endPos)\n        ++i;\n    if (IsNewline(sc.GetRelative(i)) || sc.currentPos + i == endPos) {\n        sc.Forward(i);\n        sc.ChangeState(state);\n        sc.SetState(SCE_TXT2TAGS_LINE_BEGIN);\n        return true;\n    }\n    else return false;\n}\n\n// Does the previous line have more than spaces and tabs?\nstatic bool HasPrevLineContent(StyleContext &sc) {\n    int i = 0;\n    // Go back to the previous newline\n    while ((--i + sc.currentPos) && !IsNewline(sc.GetRelative(i)))\n        ;\n    while (--i + sc.currentPos) {\n        if (IsNewline(sc.GetRelative(i)))\n            break;\n        if (!IsASpaceOrTab(sc.GetRelative(i)))\n            return true;\n    }\n    return false;\n}\n\n// Separator line\nstatic bool IsValidHrule(const unsigned int endPos, StyleContext &sc) {\n    int c, count = 1;\n    unsigned int i = 0;\n    while (++i) {\n        c = sc.GetRelative(i);\n        if (c == sc.ch)\n            ++count;\n        // hit a terminating character\n        else if (!IsASpaceOrTab(c) || sc.currentPos + i == endPos) {\n            // Are we a valid HRULE\n            if ((IsNewline(c) || sc.currentPos + i == endPos) &&\n                    count >= 20 && !HasPrevLineContent(sc)) {\n                sc.SetState(SCE_TXT2TAGS_HRULE);\n                sc.Forward(i);\n                sc.SetState(SCE_TXT2TAGS_LINE_BEGIN);\n                return true;\n            }\n            else {\n                sc.SetState(SCE_TXT2TAGS_DEFAULT);\n\t\treturn false;\n            }\n        }\n    }\n    return false;\n}\n\nstatic void ColorizeTxt2tagsDoc(unsigned int startPos, int length, int initStyle,\n                               WordList **, Accessor &styler) {\n    unsigned int endPos = startPos + length;\n    int precharCount = 0;\n    // Don't advance on a new loop iteration and retry at the same position.\n    // Useful in the corner case of having to start at the beginning file position\n    // in the default state.\n    bool freezeCursor = false;\n\n    StyleContext sc(startPos, length, initStyle, styler);\n\n    while (sc.More()) {\n        // Skip past escaped characters\n        if (sc.ch == '\\\\') {\n            sc.Forward();\n            continue;\n        }\n\n        // A blockquotes resets the line semantics\n        if (sc.state == SCE_TXT2TAGS_BLOCKQUOTE){\n            sc.Forward(2);\n            sc.SetState(SCE_TXT2TAGS_LINE_BEGIN);\n        }\n        // An option colors the whole line\n        if (sc.state == SCE_TXT2TAGS_OPTION){\n            FollowToLineEnd('%', SCE_TXT2TAGS_OPTION, endPos, sc);\n        }\n        if (sc.state == SCE_TXT2TAGS_POSTPROC){\n            FollowToLineEnd('%', SCE_TXT2TAGS_POSTPROC, endPos, sc);\n        }\n        if (sc.state == SCE_TXT2TAGS_PREPROC){\n            FollowToLineEnd('%', SCE_TXT2TAGS_PREPROC, endPos, sc);\n        }\n        // A comment colors the whole line\n        if (sc.state == SCE_TXT2TAGS_COMMENT){\n            FollowToLineEnd('%', SCE_TXT2TAGS_COMMENT, endPos, sc);\n        }\n        // Conditional state-based actions\n        if (sc.state == SCE_TXT2TAGS_CODE2) {\n        if (IsNewline(sc.ch))\n                sc.SetState(SCE_TXT2TAGS_LINE_BEGIN);\n            if (sc.Match(\"``\") && sc.GetRelative(-2) != ' ') {\n                sc.Forward(2);\n                sc.SetState(SCE_TXT2TAGS_DEFAULT);\n            }\n        }\n        // Table\n        else if (sc.state == SCE_TXT2TAGS_CODE) {\n        if (IsNewline(sc.ch))\n                sc.SetState(SCE_TXT2TAGS_LINE_BEGIN);\n            if (sc.ch == '|' && sc.chPrev != ' ')\n                sc.ForwardSetState(SCE_TXT2TAGS_DEFAULT);\n        }\n        // Strong\n        else if (sc.state == SCE_TXT2TAGS_STRONG1) {\n        if (IsNewline(sc.ch))\n                sc.SetState(SCE_TXT2TAGS_LINE_BEGIN);\n            if (sc.Match(\"**\") && sc.chPrev != ' ') {\n                sc.Forward(2);\n                sc.SetState(SCE_TXT2TAGS_DEFAULT);\n            }\n        }\n        // Emphasis\n        else if (sc.state == SCE_TXT2TAGS_EM1) {\n        if (IsNewline(sc.ch))\n                sc.SetState(SCE_TXT2TAGS_LINE_BEGIN);\n            if (sc.Match(\"//\") && sc.chPrev != ' ') {\n                sc.Forward(2);\n                sc.ForwardSetState(SCE_TXT2TAGS_DEFAULT);\n           }\n        }\n        // Underline\n        else if (sc.state == SCE_TXT2TAGS_EM2) {\n        if (IsNewline(sc.ch))\n                sc.SetState(SCE_TXT2TAGS_LINE_BEGIN);\n            if (sc.Match(\"__\") && sc.chPrev != ' ') {\n                sc.Forward(2);\n                sc.ForwardSetState(SCE_TXT2TAGS_DEFAULT);\n           }\n        }\n        // codeblock\n        else if (sc.state == SCE_TXT2TAGS_CODEBK) {\n                if (IsNewline(sc.ch))\n                sc.SetState(SCE_TXT2TAGS_LINE_BEGIN);\n            if (sc.atLineStart && sc.Match(\"```\")) {\n                int i = 1;\n                while (!IsNewline(sc.GetRelative(i)) && sc.currentPos + i < endPos)\n                    i++;\n                sc.Forward(i);\n                sc.SetState(SCE_TXT2TAGS_DEFAULT);\n            }\n        }\n        // strikeout\n        else if (sc.state == SCE_TXT2TAGS_STRIKEOUT) {\n        if (IsNewline(sc.ch))\n                sc.SetState(SCE_TXT2TAGS_LINE_BEGIN);\n            if (sc.Match(\"--\") && sc.chPrev != ' ') {\n                sc.Forward(2);\n                sc.SetState(SCE_TXT2TAGS_DEFAULT);\n            }\n        }\n        // Headers\n        else if (sc.state == SCE_TXT2TAGS_LINE_BEGIN) {\n            if (sc.Match(\"======\"))\n                {\n                sc.SetState(SCE_TXT2TAGS_HEADER6);\n                sc.Forward();\n                }\n            else if (sc.Match(\"=====\"))\n                {\n                sc.SetState(SCE_TXT2TAGS_HEADER5);\n                sc.Forward();\n                }\n            else if (sc.Match(\"====\"))\n                {\n                sc.SetState(SCE_TXT2TAGS_HEADER4);\n                sc.Forward();\n                }\n            else if (sc.Match(\"===\"))\n                {\n                sc.SetState(SCE_TXT2TAGS_HEADER3);\n                sc.Forward();\n                }\n                //SetStateAndZoom(SCE_TXT2TAGS_HEADER3, 3, '=', sc);\n            else if (sc.Match(\"==\")) {\n                sc.SetState(SCE_TXT2TAGS_HEADER2);\n                sc.Forward();\n                }\n                //SetStateAndZoom(SCE_TXT2TAGS_HEADER2, 2, '=', sc);\n            else if (sc.Match(\"=\")) {\n                // Catch the special case of an unordered list\n                if (sc.chNext == '.' && IsASpaceOrTab(sc.GetRelative(2))) {\n                    precharCount = 0;\n                    sc.SetState(SCE_TXT2TAGS_PRECHAR);\n                }\n                else\n                    {\n                    sc.SetState(SCE_TXT2TAGS_HEADER1);\n                    sc.Forward();\n                    }\n                    //SetStateAndZoom(SCE_TXT2TAGS_HEADER1, 1, '=', sc);\n            }\n\n            // Numbered title\n            else if (sc.Match(\"++++++\"))\n                {\n                sc.SetState(SCE_TXT2TAGS_HEADER6);\n                sc.Forward();\n                }\n            else if (sc.Match(\"+++++\"))\n                {\n                sc.SetState(SCE_TXT2TAGS_HEADER5);\n                sc.Forward();\n                }\n            else if (sc.Match(\"++++\"))\n                {\n                sc.SetState(SCE_TXT2TAGS_HEADER4);\n                sc.Forward();\n                }\n            else if (sc.Match(\"+++\"))\n                {\n                sc.SetState(SCE_TXT2TAGS_HEADER3);\n                sc.Forward();\n                }\n                //SetStateAndZoom(SCE_TXT2TAGS_HEADER3, 3, '+', sc);\n            else if (sc.Match(\"++\")) {\n                sc.SetState(SCE_TXT2TAGS_HEADER2);\n                sc.Forward();\n                }\n                //SetStateAndZoom(SCE_TXT2TAGS_HEADER2, 2, '+', sc);\n            else if (sc.Match(\"+\")) {\n                // Catch the special case of an unordered list\n                if (sc.chNext == ' ' && IsASpaceOrTab(sc.GetRelative(1))) {\n                 //    if (IsNewline(sc.ch)) {\n                     \t//precharCount = 0;\n                //\t\tsc.SetState(SCE_TXT2TAGS_LINE_BEGIN);\n                \t\t//sc.SetState(SCE_TXT2TAGS_PRECHAR);\n\t\t\t\t//\t}\n                //    else {\n                //    precharCount = 0;\n                    sc.SetState(SCE_TXT2TAGS_OLIST_ITEM);\n                    sc.Forward(2);\n                    sc.SetState(SCE_TXT2TAGS_DEFAULT);\n               //     sc.SetState(SCE_TXT2TAGS_PRECHAR);\n\t\t\t\t//\t}\n                }\n                else\n                    {\n                    sc.SetState(SCE_TXT2TAGS_HEADER1);\n                    sc.Forward();\n                    }\n            }\n\n\n            // Codeblock\n            else if (sc.Match(\"```\")) {\n                if (!HasPrevLineContent(sc))\n              //  if (!FollowToLineEnd(sc))\n                    sc.SetState(SCE_TXT2TAGS_CODEBK);\n                else\n                    sc.SetState(SCE_TXT2TAGS_DEFAULT);\n            }\n\n            // Preproc\n            else if (sc.Match(\"%!preproc\")) {\n                sc.SetState(SCE_TXT2TAGS_PREPROC);\n            }\n            // Postproc\n            else if (sc.Match(\"%!postproc\")) {\n                sc.SetState(SCE_TXT2TAGS_POSTPROC);\n            }\n            // Option\n            else if (sc.Match(\"%!\")) {\n                sc.SetState(SCE_TXT2TAGS_OPTION);\n            }\n\n             // Comment\n            else if (sc.ch == '%') {\n                sc.SetState(SCE_TXT2TAGS_COMMENT);\n            }\n            // list\n            else if (sc.ch == '-') {\n                    precharCount = 0;\n                    sc.SetState(SCE_TXT2TAGS_PRECHAR);\n            }\n            // def list\n            else if (sc.ch == ':') {\n                    precharCount = 0;\n                   sc.SetState(SCE_TXT2TAGS_OLIST_ITEM);\n                   sc.Forward(1);\n                   sc.SetState(SCE_TXT2TAGS_PRECHAR);\n            }\n            else if (IsNewline(sc.ch))\n                sc.SetState(SCE_TXT2TAGS_LINE_BEGIN);\n            else {\n                precharCount = 0;\n                sc.SetState(SCE_TXT2TAGS_PRECHAR);\n            }\n        }\n\n        // The header lasts until the newline\n        else if (sc.state == SCE_TXT2TAGS_HEADER1 || sc.state == SCE_TXT2TAGS_HEADER2 ||\n                sc.state == SCE_TXT2TAGS_HEADER3 || sc.state == SCE_TXT2TAGS_HEADER4 ||\n                sc.state == SCE_TXT2TAGS_HEADER5 || sc.state == SCE_TXT2TAGS_HEADER6) {\n            if (IsNewline(sc.ch))\n                sc.SetState(SCE_TXT2TAGS_LINE_BEGIN);\n        }\n\n        // New state only within the initial whitespace\n        if (sc.state == SCE_TXT2TAGS_PRECHAR) {\n            // Blockquote\n            if (sc.Match(\"\\\"\\\"\\\"\") && precharCount < 5){\n\n                sc.SetState(SCE_TXT2TAGS_BLOCKQUOTE);\n                sc.Forward(1);\n                }\n            /*\n            // Begin of code block\n            else if (!HasPrevLineContent(sc) && (sc.chPrev == '\\t' || precharCount >= 4))\n                sc.SetState(SCE_TXT2TAGS_CODEBK);\n            */\n            // HRule - Total of 20 or more hyphens, asterisks, or underscores\n            // on a line by themselves\n            else if ((sc.ch == '-' ) && IsValidHrule(endPos, sc))\n                ;\n            // Unordered list\n            else if ((sc.ch == '-') && IsASpaceOrTab(sc.chNext)) {\n                sc.SetState(SCE_TXT2TAGS_ULIST_ITEM);\n                sc.ForwardSetState(SCE_TXT2TAGS_DEFAULT);\n            }\n            // Ordered list\n            else if (IsADigit(sc.ch)) {\n                int digitCount = 0;\n                while (IsADigit(sc.GetRelative(++digitCount)))\n                    ;\n                if (sc.GetRelative(digitCount) == '.' &&\n                        IsASpaceOrTab(sc.GetRelative(digitCount + 1))) {\n                    sc.SetState(SCE_TXT2TAGS_OLIST_ITEM);\n                    sc.Forward(digitCount + 1);\n                    sc.SetState(SCE_TXT2TAGS_DEFAULT);\n                }\n            }\n            // Alternate Ordered list\n            else if (sc.ch == '+' && sc.chNext == ' ' && IsASpaceOrTab(sc.GetRelative(2))) {\n            //    sc.SetState(SCE_TXT2TAGS_OLIST_ITEM);\n            //    sc.Forward(2);\n             //   sc.SetState(SCE_TXT2TAGS_DEFAULT);\n            }\n            else if (sc.ch != ' ' || precharCount > 2)\n                sc.SetState(SCE_TXT2TAGS_DEFAULT);\n            else\n                ++precharCount;\n        }\n\n        // New state anywhere in doc\n        if (sc.state == SCE_TXT2TAGS_DEFAULT) {\n         //   if (sc.atLineStart && sc.ch == '#') {\n         //       sc.SetState(SCE_TXT2TAGS_LINE_BEGIN);\n         //       freezeCursor = true;\n         //   }\n            // Links and Images\n            if (sc.Match(\"![\") || sc.ch == '[') {\n                int i = 0, j = 0, k = 0;\n                int len = endPos - sc.currentPos;\n                while (i < len && (sc.GetRelative(++i) != ']' || sc.GetRelative(i - 1) == '\\\\'))\n                    ;\n                if (sc.GetRelative(i) == ']') {\n                    j = i;\n                    if (sc.GetRelative(++i) == '(') {\n                        while (i < len && (sc.GetRelative(++i) != '(' || sc.GetRelative(i - 1) == '\\\\'))\n                            ;\n                        if (sc.GetRelative(i) == '(')\n                            k = i;\n                    }\n\n                    else if (sc.GetRelative(i) == '[' || sc.GetRelative(++i) == '[') {\n                        while (i < len && (sc.GetRelative(++i) != ']' || sc.GetRelative(i - 1) == '\\\\'))\n                            ;\n                        if (sc.GetRelative(i) == ']')\n                            k = i;\n                    }\n                }\n                // At least a link text\n                if (j) {\n                    sc.SetState(SCE_TXT2TAGS_LINK);\n                    sc.Forward(j);\n                    // Also has a URL or reference portion\n                    if (k)\n                        sc.Forward(k - j);\n                    sc.ForwardSetState(SCE_TXT2TAGS_DEFAULT);\n                }\n            }\n            // Code - also a special case for alternate inside spacing\n            if (sc.Match(\"``\") && sc.GetRelative(3) != ' ') {\n                sc.SetState(SCE_TXT2TAGS_CODE2);\n                sc.Forward();\n            }\n            else if (sc.ch == '|' && sc.GetRelative(3) != ' ') {\n                sc.SetState(SCE_TXT2TAGS_CODE);\n            }\n            // Strong\n            else if (sc.Match(\"**\") && sc.GetRelative(2) != ' ') {\n                sc.SetState(SCE_TXT2TAGS_STRONG1);\n                sc.Forward();\n           }\n            // Emphasis\n            else if (sc.Match(\"//\") && sc.GetRelative(2) != ' ') {\n                sc.SetState(SCE_TXT2TAGS_EM1);\n                sc.Forward();\n            }\n            else if (sc.Match(\"__\") && sc.GetRelative(2) != ' ') {\n                sc.SetState(SCE_TXT2TAGS_EM2);\n                sc.Forward();\n            }\n            // Strikeout\n            else if (sc.Match(\"--\") && sc.GetRelative(2) != ' ') {\n                sc.SetState(SCE_TXT2TAGS_STRIKEOUT);\n                sc.Forward();\n            }\n\n            // Beginning of line\n            else if (IsNewline(sc.ch))\n                sc.SetState(SCE_TXT2TAGS_LINE_BEGIN);\n        }\n        // Advance if not holding back the cursor for this iteration.\n        if (!freezeCursor)\n            sc.Forward();\n        freezeCursor = false;\n    }\n    sc.Complete();\n}\n\nLexerModule lmTxt2tags(SCLEX_TXT2TAGS, ColorizeTxt2tagsDoc, \"txt2tags\");\n\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexVB.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexVB.cxx\n ** Lexer for Visual Basic and VBScript.\n **/\n// Copyright 1998-2005 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n// Internal state, highlighted as number\n#define SCE_B_FILENUMBER SCE_B_DEFAULT+100\n\n\nstatic bool IsVBComment(Accessor &styler, int pos, int len) {\n\treturn len > 0 && styler[pos] == '\\'';\n}\n\nstatic inline bool IsTypeCharacter(int ch) {\n\treturn ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$';\n}\n\n// Extended to accept accented characters\nstatic inline bool IsAWordChar(int ch) {\n\treturn ch >= 0x80 ||\n\t       (isalnum(ch) || ch == '.' || ch == '_');\n}\n\nstatic inline bool IsAWordStart(int ch) {\n\treturn ch >= 0x80 ||\n\t       (isalpha(ch) || ch == '_');\n}\n\nstatic inline bool IsANumberChar(int ch) {\n\t// Not exactly following number definition (several dots are seen as OK, etc.)\n\t// but probably enough in most cases.\n\treturn (ch < 0x80) &&\n\t        (isdigit(ch) || toupper(ch) == 'E' ||\n             ch == '.' || ch == '-' || ch == '+');\n}\n\nstatic void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,\n                           WordList *keywordlists[], Accessor &styler, bool vbScriptSyntax) {\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\tWordList &keywords4 = *keywordlists[3];\n\n\tstyler.StartAt(startPos);\n\n\tint visibleChars = 0;\n\tint fileNbDigits = 0;\n\n\t// Do not leak onto next line\n\tif (initStyle == SCE_B_STRINGEOL || initStyle == SCE_B_COMMENT || initStyle == SCE_B_PREPROCESSOR) {\n\t\tinitStyle = SCE_B_DEFAULT;\n\t}\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\tif (sc.state == SCE_B_OPERATOR) {\n\t\t\tsc.SetState(SCE_B_DEFAULT);\n\t\t} else if (sc.state == SCE_B_IDENTIFIER) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\t// In Basic (except VBScript), a variable name or a function name\n\t\t\t\t// can end with a special character indicating the type of the value\n\t\t\t\t// held or returned.\n\t\t\t\tbool skipType = false;\n\t\t\t\tif (!vbScriptSyntax && IsTypeCharacter(sc.ch)) {\n\t\t\t\t\tsc.Forward();\t// Skip it\n\t\t\t\t\tskipType = true;\n\t\t\t\t}\n\t\t\t\tif (sc.ch == ']') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tchar s[100];\n\t\t\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\t\t\tif (skipType) {\n\t\t\t\t\ts[strlen(s) - 1] = '\\0';\n\t\t\t\t}\n\t\t\t\tif (strcmp(s, \"rem\") == 0) {\n\t\t\t\t\tsc.ChangeState(SCE_B_COMMENT);\n\t\t\t\t} else {\n\t\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_B_KEYWORD);\n\t\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_B_KEYWORD2);\n\t\t\t\t\t} else if (keywords3.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_B_KEYWORD3);\n\t\t\t\t\t} else if (keywords4.InList(s)) {\n\t\t\t\t\t\tsc.ChangeState(SCE_B_KEYWORD4);\n\t\t\t\t\t}\t// Else, it is really an identifier...\n\t\t\t\t\tsc.SetState(SCE_B_DEFAULT);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (sc.state == SCE_B_NUMBER) {\n\t\t\t// We stop the number definition on non-numerical non-dot non-eE non-sign char\n\t\t\t// Also accepts A-F for hex. numbers\n\t\t\tif (!IsANumberChar(sc.ch) && !(tolower(sc.ch) >= 'a' && tolower(sc.ch) <= 'f')) {\n\t\t\t\tsc.SetState(SCE_B_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_B_STRING) {\n\t\t\t// VB doubles quotes to preserve them, so just end this string\n\t\t\t// state now as a following quote will start again\n\t\t\tif (sc.ch == '\\\"') {\n\t\t\t\tif (sc.chNext == '\\\"') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} else {\n\t\t\t\t\tif (tolower(sc.chNext) == 'c') {\n\t\t\t\t\t\tsc.Forward();\n\t\t\t\t\t}\n\t\t\t\t\tsc.ForwardSetState(SCE_B_DEFAULT);\n\t\t\t\t}\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tvisibleChars = 0;\n\t\t\t\tsc.ChangeState(SCE_B_STRINGEOL);\n\t\t\t\tsc.ForwardSetState(SCE_B_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_B_COMMENT) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tvisibleChars = 0;\n\t\t\t\tsc.ForwardSetState(SCE_B_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_B_PREPROCESSOR) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tvisibleChars = 0;\n\t\t\t\tsc.ForwardSetState(SCE_B_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_B_FILENUMBER) {\n\t\t\tif (IsADigit(sc.ch)) {\n\t\t\t\tfileNbDigits++;\n\t\t\t\tif (fileNbDigits > 3) {\n\t\t\t\t\tsc.ChangeState(SCE_B_DATE);\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '\\r' || sc.ch == '\\n' || sc.ch == ',') {\n\t\t\t\t// Regular uses: Close #1; Put #1, ...; Get #1, ... etc.\n\t\t\t\t// Too bad if date is format #27, Oct, 2003# or something like that...\n\t\t\t\t// Use regular number state\n\t\t\t\tsc.ChangeState(SCE_B_NUMBER);\n\t\t\t\tsc.SetState(SCE_B_DEFAULT);\n\t\t\t} else if (sc.ch == '#') {\n\t\t\t\tsc.ChangeState(SCE_B_DATE);\n\t\t\t\tsc.ForwardSetState(SCE_B_DEFAULT);\n\t\t\t} else {\n\t\t\t\tsc.ChangeState(SCE_B_DATE);\n\t\t\t}\n\t\t\tif (sc.state != SCE_B_FILENUMBER) {\n\t\t\t\tfileNbDigits = 0;\n\t\t\t}\n\t\t} else if (sc.state == SCE_B_DATE) {\n\t\t\tif (sc.atLineEnd) {\n\t\t\t\tvisibleChars = 0;\n\t\t\t\tsc.ChangeState(SCE_B_STRINGEOL);\n\t\t\t\tsc.ForwardSetState(SCE_B_DEFAULT);\n\t\t\t} else if (sc.ch == '#') {\n\t\t\t\tsc.ForwardSetState(SCE_B_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\tif (sc.state == SCE_B_DEFAULT) {\n\t\t\tif (sc.ch == '\\'') {\n\t\t\t\tsc.SetState(SCE_B_COMMENT);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_B_STRING);\n\t\t\t} else if (sc.ch == '#' && visibleChars == 0) {\n\t\t\t\t// Preprocessor commands are alone on their line\n\t\t\t\tsc.SetState(SCE_B_PREPROCESSOR);\n\t\t\t} else if (sc.ch == '#') {\n\t\t\t\t// It can be a date literal, ending with #, or a file number, from 1 to 511\n\t\t\t\t// The date literal depends on the locale, so anything can go between #'s.\n\t\t\t\t// Can be #January 1, 1993# or #1 Jan 93# or #05/11/2003#, etc.\n\t\t\t\t// So we set the FILENUMBER state, and switch to DATE if it isn't a file number\n\t\t\t\tsc.SetState(SCE_B_FILENUMBER);\n\t\t\t} else if (sc.ch == '&' && tolower(sc.chNext) == 'h') {\n\t\t\t\t// Hexadecimal number\n\t\t\t\tsc.SetState(SCE_B_NUMBER);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (sc.ch == '&' && tolower(sc.chNext) == 'o') {\n\t\t\t\t// Octal number\n\t\t\t\tsc.SetState(SCE_B_NUMBER);\n\t\t\t\tsc.Forward();\n\t\t\t} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_B_NUMBER);\n\t\t\t} else if (IsAWordStart(sc.ch) || (sc.ch == '[')) {\n\t\t\t\tsc.SetState(SCE_B_IDENTIFIER);\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch)) || (sc.ch == '\\\\')) {\t// Integer division\n\t\t\t\tsc.SetState(SCE_B_OPERATOR);\n\t\t\t}\n\t\t}\n\n\t\tif (sc.atLineEnd) {\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!IsASpace(sc.ch)) {\n\t\t\tvisibleChars++;\n\t\t}\n\t}\n\n\tif (sc.state == SCE_B_IDENTIFIER && !IsAWordChar(sc.ch)) {\n\t\t// In Basic (except VBScript), a variable name or a function name\n\t\t// can end with a special character indicating the type of the value\n\t\t// held or returned.\n\t\tbool skipType = false;\n\t\tif (!vbScriptSyntax && IsTypeCharacter(sc.ch)) {\n\t\t\tsc.Forward();\t// Skip it\n\t\t\tskipType = true;\n\t\t}\n\t\tif (sc.ch == ']') {\n\t\t\tsc.Forward();\n\t\t}\n\t\tchar s[100];\n\t\tsc.GetCurrentLowered(s, sizeof(s));\n\t\tif (skipType) {\n\t\t\ts[strlen(s) - 1] = '\\0';\n\t\t}\n\t\tif (strcmp(s, \"rem\") == 0) {\n\t\t\tsc.ChangeState(SCE_B_COMMENT);\n\t\t} else {\n\t\t\tif (keywords.InList(s)) {\n\t\t\t\tsc.ChangeState(SCE_B_KEYWORD);\n\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\tsc.ChangeState(SCE_B_KEYWORD2);\n\t\t\t} else if (keywords3.InList(s)) {\n\t\t\t\tsc.ChangeState(SCE_B_KEYWORD3);\n\t\t\t} else if (keywords4.InList(s)) {\n\t\t\t\tsc.ChangeState(SCE_B_KEYWORD4);\n\t\t\t}\t// Else, it is really an identifier...\n\t\t\tsc.SetState(SCE_B_DEFAULT);\n\t\t}\n\t}\n\n\tsc.Complete();\n}\n\nstatic void FoldVBDoc(unsigned int startPos, int length, int,\n\t\t\t\t\t\t   WordList *[], Accessor &styler) {\n\tint endPos = startPos + length;\n\n\t// Backtrack to previous line in case need to fix its fold status\n\tint lineCurrent = styler.GetLine(startPos);\n\tif (startPos > 0) {\n\t\tif (lineCurrent > 0) {\n\t\t\tlineCurrent--;\n\t\t\tstartPos = styler.LineStart(lineCurrent);\n\t\t}\n\t}\n\tint spaceFlags = 0;\n\tint indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsVBComment);\n\tchar chNext = styler[startPos];\n\tfor (int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\n\t\tif ((ch == '\\r' && chNext != '\\n') || (ch == '\\n') || (i == endPos)) {\n\t\t\tint lev = indentCurrent;\n\t\t\tint indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsVBComment);\n\t\t\tif (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {\n\t\t\t\t// Only non whitespace lines can be headers\n\t\t\t\tif ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {\n\t\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t\t} else if (indentNext & SC_FOLDLEVELWHITEFLAG) {\n\t\t\t\t\t// Line after is blank so check the next - maybe should continue further?\n\t\t\t\t\tint spaceFlags2 = 0;\n\t\t\t\t\tint indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsVBComment);\n\t\t\t\t\tif ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {\n\t\t\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tindentCurrent = indentNext;\n\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\tlineCurrent++;\n\t\t}\n\t}\n}\n\nstatic void ColouriseVBNetDoc(unsigned int startPos, int length, int initStyle,\n                           WordList *keywordlists[], Accessor &styler) {\n\tColouriseVBDoc(startPos, length, initStyle, keywordlists, styler, false);\n}\n\nstatic void ColouriseVBScriptDoc(unsigned int startPos, int length, int initStyle,\n                           WordList *keywordlists[], Accessor &styler) {\n\tColouriseVBDoc(startPos, length, initStyle, keywordlists, styler, true);\n}\n\nstatic const char * const vbWordListDesc[] = {\n\t\"Keywords\",\n\t\"user1\",\n\t\"user2\",\n\t\"user3\",\n\t0\n};\n\nLexerModule lmVB(SCLEX_VB, ColouriseVBNetDoc, \"vb\", FoldVBDoc, vbWordListDesc);\nLexerModule lmVBScript(SCLEX_VBSCRIPT, ColouriseVBScriptDoc, \"vbscript\", FoldVBDoc, vbWordListDesc);\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexVHDL.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexVHDL.cxx\n ** Lexer for VHDL\n ** Written by Phil Reid,\n ** Based on:\n **  - The Verilog Lexer by Avi Yegudin\n **  - The Fortran Lexer by Chuan-jian Shen\n **  - The C++ lexer by Neil Hodgson\n **/\n// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic void ColouriseVHDLDoc(\n  unsigned int startPos,\n  int length,\n  int initStyle,\n  WordList *keywordlists[],\n  Accessor &styler);\n\n\n/***************************************/\nstatic inline bool IsAWordChar(const int ch) {\n  return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' );\n}\n\n/***************************************/\nstatic inline bool IsAWordStart(const int ch) {\n  return (ch < 0x80) && (isalnum(ch) || ch == '_');\n}\n\n/***************************************/\ninline bool IsABlank(unsigned int ch) {\n    return (ch == ' ') || (ch == 0x09) || (ch == 0x0b) ;\n}\n\n/***************************************/\nstatic void ColouriseVHDLDoc(\n  unsigned int startPos,\n  int length,\n  int initStyle,\n  WordList *keywordlists[],\n  Accessor &styler)\n{\n  WordList &Keywords   = *keywordlists[0];\n  WordList &Operators  = *keywordlists[1];\n  WordList &Attributes = *keywordlists[2];\n  WordList &Functions  = *keywordlists[3];\n  WordList &Packages   = *keywordlists[4];\n  WordList &Types      = *keywordlists[5];\n  WordList &User       = *keywordlists[6];\n\n  StyleContext sc(startPos, length, initStyle, styler);\n\n  for (; sc.More(); sc.Forward())\n  {\n\n    // Determine if the current state should terminate.\n    if (sc.state == SCE_VHDL_OPERATOR) {\n      sc.SetState(SCE_VHDL_DEFAULT);\n    } else if (sc.state == SCE_VHDL_NUMBER) {\n      if (!IsAWordChar(sc.ch) && (sc.ch != '#')) {\n        sc.SetState(SCE_VHDL_DEFAULT);\n      }\n    } else if (sc.state == SCE_VHDL_IDENTIFIER) {\n      if (!IsAWordChar(sc.ch) || (sc.ch == '.')) {\n        char s[100];\n        sc.GetCurrentLowered(s, sizeof(s));\n        if (Keywords.InList(s)) {\n          sc.ChangeState(SCE_VHDL_KEYWORD);\n        } else if (Operators.InList(s)) {\n          sc.ChangeState(SCE_VHDL_STDOPERATOR);\n        } else if (Attributes.InList(s)) {\n          sc.ChangeState(SCE_VHDL_ATTRIBUTE);\n        } else if (Functions.InList(s)) {\n          sc.ChangeState(SCE_VHDL_STDFUNCTION);\n        } else if (Packages.InList(s)) {\n          sc.ChangeState(SCE_VHDL_STDPACKAGE);\n        } else if (Types.InList(s)) {\n          sc.ChangeState(SCE_VHDL_STDTYPE);\n        } else if (User.InList(s)) {\n          sc.ChangeState(SCE_VHDL_USERWORD);\n        }\n        sc.SetState(SCE_VHDL_DEFAULT);\n      }\n    } else if (sc.state == SCE_VHDL_COMMENT || sc.state == SCE_VHDL_COMMENTLINEBANG) {\n      if (sc.atLineEnd) {\n        sc.SetState(SCE_VHDL_DEFAULT);\n      }\n    } else if (sc.state == SCE_VHDL_STRING) {\n      if (sc.ch == '\\\\') {\n        if (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n          sc.Forward();\n        }\n      } else if (sc.ch == '\\\"') {\n        sc.ForwardSetState(SCE_VHDL_DEFAULT);\n      } else if (sc.atLineEnd) {\n        sc.ChangeState(SCE_VHDL_STRINGEOL);\n        sc.ForwardSetState(SCE_VHDL_DEFAULT);\n      }\n    }\n\n    // Determine if a new state should be entered.\n    if (sc.state == SCE_VHDL_DEFAULT) {\n      if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n        sc.SetState(SCE_VHDL_NUMBER);\n      } else if (IsAWordStart(sc.ch)) {\n        sc.SetState(SCE_VHDL_IDENTIFIER);\n      } else if (sc.Match('-', '-')) {\n        if (sc.Match(\"--!\"))  // Nice to have a different comment style\n          sc.SetState(SCE_VHDL_COMMENTLINEBANG);\n        else\n          sc.SetState(SCE_VHDL_COMMENT);\n      } else if (sc.ch == '\\\"') {\n        sc.SetState(SCE_VHDL_STRING);\n      } else if (isoperator(static_cast<char>(sc.ch))) {\n        sc.SetState(SCE_VHDL_OPERATOR);\n      }\n    }\n  }\n  sc.Complete();\n}\n//=============================================================================\nstatic bool IsCommentLine(int line, Accessor &styler) {\n\tint pos = styler.LineStart(line);\n\tint eol_pos = styler.LineStart(line + 1) - 1;\n\tfor (int i = pos; i < eol_pos; i++) {\n\t\tchar ch = styler[i];\n\t\tchar chNext = styler[i+1];\n\t\tif ((ch == '-') && (chNext == '-'))\n\t\t\treturn true;\n\t\telse if (ch != ' ' && ch != '\\t')\n\t\t\treturn false;\n\t}\n\treturn false;\n}\n\n//=============================================================================\n// Folding the code\nstatic void FoldNoBoxVHDLDoc(\n  unsigned int startPos,\n  int length,\n  int,\n  Accessor &styler)\n{\n  // Decided it would be smarter to have the lexer have all keywords included. Therefore I\n  // don't check if the style for the keywords that I use to adjust the levels.\n  char words[] =\n    \"architecture begin case component else elsif end entity generate loop package process record then \"\n    \"procedure function when\";\n  WordList keywords;\n  keywords.Set(words);\n\n  bool foldComment      = styler.GetPropertyInt(\"fold.comment\", 1) != 0;\n  bool foldCompact      = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n  bool foldAtElse       = styler.GetPropertyInt(\"fold.at.else\", 1) != 0;\n  bool foldAtBegin      = styler.GetPropertyInt(\"fold.at.Begin\", 1) != 0;\n  bool foldAtParenthese = styler.GetPropertyInt(\"fold.at.Parenthese\", 1) != 0;\n  //bool foldAtWhen       = styler.GetPropertyInt(\"fold.at.When\", 1) != 0;  //< fold at when in case statements\n\n  int  visibleChars     = 0;\n  unsigned int endPos   = startPos + length;\n\n  int lineCurrent       = styler.GetLine(startPos);\n  int levelCurrent      = SC_FOLDLEVELBASE;\n  if(lineCurrent > 0)\n    levelCurrent        = styler.LevelAt(lineCurrent-1) >> 16;\n  //int levelMinCurrent   = levelCurrent;\n  int levelMinCurrentElse = levelCurrent;   //< Used for folding at 'else'\n  int levelMinCurrentBegin = levelCurrent;  //< Used for folding at 'begin'\n  int levelNext         = levelCurrent;\n\n  /***************************************/\n  int lastStart         = 0;\n  char prevWord[32]     = \"\";\n\n  /***************************************/\n  // Find prev word\n  // The logic for going up or down a level depends on a the previous keyword\n  // This code could be cleaned up.\n  int end = 0;\n  unsigned int j;\n  for(j = startPos; j>0; j--)\n  {\n    char ch       = styler.SafeGetCharAt(j);\n    char chPrev   = styler.SafeGetCharAt(j-1);\n    int style     = styler.StyleAt(j);\n    int stylePrev = styler.StyleAt(j-1);\n    if ((stylePrev != SCE_VHDL_COMMENT) && (stylePrev != SCE_VHDL_STRING))\n    {\n      if(IsAWordChar(chPrev) && !IsAWordChar(ch))\n      {\n        end = j-1;\n      }\n    }\n    if ((style != SCE_VHDL_COMMENT) && (style != SCE_VHDL_STRING))\n    {\n      if(!IsAWordChar(chPrev) && IsAWordStart(ch) && (end != 0))\n      {\n        char s[32];\n        unsigned int k;\n        for(k=0; (k<31 ) && (k<end-j+1 ); k++) {\n          s[k] = static_cast<char>(tolower(styler[j+k]));\n        }\n        s[k] = '\\0';\n\n        if(keywords.InList(s)) {\n          strcpy(prevWord, s);\n          break;\n        }\n      }\n    }\n  }\n  for(j=j+static_cast<unsigned int>(strlen(prevWord)); j<endPos; j++)\n  {\n    char ch       = styler.SafeGetCharAt(j);\n    int style     = styler.StyleAt(j);\n    if ((style != SCE_VHDL_COMMENT) && (style != SCE_VHDL_STRING))\n    {\n      if((ch == ';') && (strcmp(prevWord, \"end\") == 0))\n      {\n        strcpy(prevWord, \";\");\n      }\n    }\n  }\n\n  char  chNext          = styler[startPos];\n  char  chPrev          = '\\0';\n  char  chNextNonBlank;\n  int   styleNext       = styler.StyleAt(startPos);\n  //Platform::DebugPrintf(\"Line[%04d] Prev[%20s] ************************* Level[%x]\\n\", lineCurrent+1, prevWord, levelCurrent);\n\n  /***************************************/\n  for (unsigned int i = startPos; i < endPos; i++)\n  {\n    char ch         = chNext;\n    chNext          = styler.SafeGetCharAt(i + 1);\n    chPrev          = styler.SafeGetCharAt(i - 1);\n    chNextNonBlank  = chNext;\n    unsigned int j  = i+1;\n    while(IsABlank(chNextNonBlank) && j<endPos)\n    {\n      j ++ ;\n      chNextNonBlank = styler.SafeGetCharAt(j);\n    }\n    int style           = styleNext;\n    styleNext       = styler.StyleAt(i + 1);\n    bool atEOL      = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\n\t\tif (foldComment && atEOL && IsCommentLine(lineCurrent, styler))\n    {\n      if(!IsCommentLine(lineCurrent-1, styler) && IsCommentLine(lineCurrent+1, styler))\n      {\n        levelNext++;\n      }\n      else if(IsCommentLine(lineCurrent-1, styler) && !IsCommentLine(lineCurrent+1, styler))\n      {\n        levelNext--;\n      }\n    }\n\n    if ((style == SCE_VHDL_OPERATOR) && foldAtParenthese)\n    {\n      if(ch == '(') {\n        levelNext++;\n      } else if (ch == ')') {\n        levelNext--;\n      }\n    }\n\n    if ((style != SCE_VHDL_COMMENT) && (style != SCE_VHDL_STRING))\n    {\n      if((ch == ';') && (strcmp(prevWord, \"end\") == 0))\n      {\n        strcpy(prevWord, \";\");\n      }\n\n      if(!IsAWordChar(chPrev) && IsAWordStart(ch))\n      {\n        lastStart = i;\n      }\n\n      if(iswordchar(ch) && !iswordchar(chNext)) {\n        char s[32];\n        unsigned int k;\n        for(k=0; (k<31 ) && (k<i-lastStart+1 ); k++) {\n          s[k] = static_cast<char>(tolower(styler[lastStart+k]));\n        }\n        s[k] = '\\0';\n\n        if(keywords.InList(s))\n        {\n          if (\n            strcmp(s, \"architecture\") == 0  ||\n            strcmp(s, \"case\") == 0          ||\n            strcmp(s, \"component\") == 0     ||\n            strcmp(s, \"entity\") == 0        ||\n            strcmp(s, \"generate\") == 0      ||\n            strcmp(s, \"loop\") == 0          ||\n            strcmp(s, \"package\") ==0        ||\n            strcmp(s, \"process\") == 0       ||\n            strcmp(s, \"record\") == 0        ||\n            strcmp(s, \"then\") == 0)\n          {\n            if (strcmp(prevWord, \"end\") != 0)\n            {\n              if (levelMinCurrentElse > levelNext) {\n                levelMinCurrentElse = levelNext;\n              }\n              levelNext++;\n            }\n          } else if (\n            strcmp(s, \"procedure\") == 0     ||\n            strcmp(s, \"function\") == 0)\n          {\n            if (strcmp(prevWord, \"end\") != 0) // check for \"end procedure\" etc.\n            { // This code checks to see if the procedure / function is a definition within a \"package\"\n              // rather than the actual code in the body.\n              int BracketLevel = 0;\n              for(int j=i+1; j<styler.Length(); j++)\n              {\n                int LocalStyle = styler.StyleAt(j);\n                char LocalCh = styler.SafeGetCharAt(j);\n                if(LocalCh == '(') BracketLevel++;\n                if(LocalCh == ')') BracketLevel--;\n                if(\n                  (BracketLevel == 0) &&\n                  (LocalStyle != SCE_VHDL_COMMENT) &&\n                  (LocalStyle != SCE_VHDL_STRING) &&\n                  !iswordchar(styler.SafeGetCharAt(j-1)) &&\n                  styler.Match(j, \"is\") &&\n                  !iswordchar(styler.SafeGetCharAt(j+2)))\n                {\n                  if (levelMinCurrentElse > levelNext) {\n                    levelMinCurrentElse = levelNext;\n                  }\n                  levelNext++;\n                  break;\n                }\n                if((BracketLevel == 0) && (LocalCh == ';'))\n                {\n                  break;\n                }\n              }\n            }\n\n          } else if (strcmp(s, \"end\") == 0) {\n            levelNext--;\n          }  else if(strcmp(s, \"elsif\") == 0) { // elsif is followed by then so folding occurs correctly\n            levelNext--;\n          } else if (strcmp(s, \"else\") == 0) {\n            if(strcmp(prevWord, \"when\") != 0)  // ignore a <= x when y else z;\n            {\n              levelMinCurrentElse = levelNext - 1;  // VHDL else is all on its own so just dec. the min level\n            }\n          } else if(\n            ((strcmp(s, \"begin\") == 0) && (strcmp(prevWord, \"architecture\") == 0)) ||\n            ((strcmp(s, \"begin\") == 0) && (strcmp(prevWord, \"function\") == 0)) ||\n            ((strcmp(s, \"begin\") == 0) && (strcmp(prevWord, \"procedure\") == 0)))\n          {\n            levelMinCurrentBegin = levelNext - 1;\n          }\n          //Platform::DebugPrintf(\"Line[%04d] Prev[%20s] Cur[%20s] Level[%x]\\n\", lineCurrent+1, prevWord, s, levelCurrent);\n          strcpy(prevWord, s);\n        }\n      }\n    }\n    if (atEOL) {\n      int levelUse = levelCurrent;\n\n      if (foldAtElse && (levelMinCurrentElse < levelUse)) {\n        levelUse = levelMinCurrentElse;\n      }\n      if (foldAtBegin && (levelMinCurrentBegin < levelUse)) {\n        levelUse = levelMinCurrentBegin;\n      }\n      int lev = levelUse | levelNext << 16;\n      if (visibleChars == 0 && foldCompact)\n        lev |= SC_FOLDLEVELWHITEFLAG;\n\n      if (levelUse < levelNext)\n        lev |= SC_FOLDLEVELHEADERFLAG;\n      if (lev != styler.LevelAt(lineCurrent)) {\n        styler.SetLevel(lineCurrent, lev);\n      }\n      //Platform::DebugPrintf(\"Line[%04d] ---------------------------------------------------- Level[%x]\\n\", lineCurrent+1, levelCurrent);\n      lineCurrent++;\n      levelCurrent = levelNext;\n      //levelMinCurrent = levelCurrent;\n      levelMinCurrentElse = levelCurrent;\n      levelMinCurrentBegin = levelCurrent;\n      visibleChars = 0;\n    }\n    /***************************************/\n    if (!isspacechar(ch)) visibleChars++;\n  }\n\n  /***************************************/\n//  Platform::DebugPrintf(\"Line[%04d] ---------------------------------------------------- Level[%x]\\n\", lineCurrent+1, levelCurrent);\n}\n\n//=============================================================================\nstatic void FoldVHDLDoc(unsigned int startPos, int length, int initStyle, WordList *[],\n                       Accessor &styler) {\n  FoldNoBoxVHDLDoc(startPos, length, initStyle, styler);\n}\n\n//=============================================================================\nstatic const char * const VHDLWordLists[] = {\n            \"Keywords\",\n            \"Operators\",\n            \"Attributes\",\n            \"Standard Functions\",\n            \"Standard Packages\",\n            \"Standard Types\",\n            \"User Words\",\n            0,\n        };\n\n\nLexerModule lmVHDL(SCLEX_VHDL, ColouriseVHDLDoc, \"vhdl\", FoldVHDLDoc, VHDLWordLists);\n\n\n// Keyword:\n//    access after alias all architecture array assert attribute begin block body buffer bus case component\n//    configuration constant disconnect downto else elsif end entity exit file for function generate generic\n//    group guarded if impure in inertial inout is label library linkage literal loop map new next null of\n//    on open others out package port postponed procedure process pure range record register reject report\n//    return select severity shared signal subtype then to transport type unaffected units until use variable\n//    wait when while with\n//\n// Operators:\n//    abs and mod nand nor not or rem rol ror sla sll sra srl xnor xor\n//\n// Attributes:\n//    left right low high ascending image value pos val succ pred leftof rightof base range reverse_range\n//    length delayed stable quiet transaction event active last_event last_active last_value driving\n//    driving_value simple_name path_name instance_name\n//\n// Std Functions:\n//    now readline read writeline write endfile resolved to_bit to_bitvector to_stdulogic to_stdlogicvector\n//    to_stdulogicvector to_x01 to_x01z to_UX01 rising_edge falling_edge is_x shift_left shift_right rotate_left\n//    rotate_right resize to_integer to_unsigned to_signed std_match to_01\n//\n// Std Packages:\n//    std ieee work standard textio std_logic_1164 std_logic_arith std_logic_misc std_logic_signed\n//    std_logic_textio std_logic_unsigned numeric_bit numeric_std math_complex math_real vital_primitives\n//    vital_timing\n//\n// Std Types:\n//    boolean bit character severity_level integer real time delay_length natural positive string bit_vector\n//    file_open_kind file_open_status line text side width std_ulogic std_ulogic_vector std_logic\n//    std_logic_vector X01 X01Z UX01 UX01Z unsigned signed\n//\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexVerilog.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexVerilog.cxx\n ** Lexer for Verilog.\n ** Written by Avi Yegudin, based on C++ lexer by Neil Hodgson\n **/\n// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsAWordChar(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch == '\\''|| ch == '$');\n}\n\nstatic inline bool IsAWordStart(const int ch) {\n\treturn (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '$');\n}\n\nstatic void ColouriseVerilogDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\n                            Accessor &styler) {\n\n\tWordList &keywords = *keywordlists[0];\n\tWordList &keywords2 = *keywordlists[1];\n\tWordList &keywords3 = *keywordlists[2];\n\tWordList &keywords4 = *keywordlists[3];\n\n\t// Do not leak onto next line\n\tif (initStyle == SCE_V_STRINGEOL)\n\t\tinitStyle = SCE_V_DEFAULT;\n\n\tStyleContext sc(startPos, length, initStyle, styler);\n\n\tfor (; sc.More(); sc.Forward()) {\n\n\t\tif (sc.atLineStart && (sc.state == SCE_V_STRING)) {\n\t\t\t// Prevent SCE_V_STRINGEOL from leaking back to previous line\n\t\t\tsc.SetState(SCE_V_STRING);\n\t\t}\n\n\t\t// Handle line continuation generically.\n\t\tif (sc.ch == '\\\\') {\n\t\t\tif (sc.chNext == '\\n' || sc.chNext == '\\r') {\n\t\t\t\tsc.Forward();\n\t\t\t\tif (sc.ch == '\\r' && sc.chNext == '\\n') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Determine if the current state should terminate.\n\t\tif (sc.state == SCE_V_OPERATOR) {\n\t\t\tsc.SetState(SCE_V_DEFAULT);\n\t\t} else if (sc.state == SCE_V_NUMBER) {\n\t\t\tif (!IsAWordChar(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_V_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_V_IDENTIFIER) {\n\t\t\tif (!IsAWordChar(sc.ch) || (sc.ch == '.')) {\n\t\t\t\tchar s[100];\n                                sc.GetCurrent(s, sizeof(s));\n\t\t\t\tif (keywords.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_V_WORD);\n\t\t\t\t} else if (keywords2.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_V_WORD2);\n\t\t\t\t} else if (keywords3.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_V_WORD3);\n                                } else if (keywords4.InList(s)) {\n\t\t\t\t\tsc.ChangeState(SCE_V_USER);\n\t\t\t\t}\n\t\t\t\tsc.SetState(SCE_V_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_V_PREPROCESSOR) {\n                        if (!IsAWordChar(sc.ch)) {\n                                sc.SetState(SCE_V_DEFAULT);\n                        }\n\t\t} else if (sc.state == SCE_V_COMMENT) {\n\t\t\tif (sc.Match('*', '/')) {\n\t\t\t\tsc.Forward();\n\t\t\t\tsc.ForwardSetState(SCE_V_DEFAULT);\n\t\t\t}\n\t\t} else if (sc.state == SCE_V_COMMENTLINE || sc.state == SCE_V_COMMENTLINEBANG) {\n\t\t\tif (sc.atLineStart) {\n\t\t\t\tsc.SetState(SCE_V_DEFAULT);\n\t\t\t}\n                } else if (sc.state == SCE_V_STRING) {\n\t\t\tif (sc.ch == '\\\\') {\n\t\t\t\tif (sc.chNext == '\\\"' || sc.chNext == '\\'' || sc.chNext == '\\\\') {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t}\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.ForwardSetState(SCE_V_DEFAULT);\n\t\t\t} else if (sc.atLineEnd) {\n\t\t\t\tsc.ChangeState(SCE_V_STRINGEOL);\n\t\t\t\tsc.ForwardSetState(SCE_V_DEFAULT);\n\t\t\t}\n\t\t}\n\n\t\t// Determine if a new state should be entered.\n\t\tif (sc.state == SCE_V_DEFAULT) {\n\t\t\tif (IsADigit(sc.ch) || (sc.ch == '\\'') || (sc.ch == '.' && IsADigit(sc.chNext))) {\n\t\t\t\tsc.SetState(SCE_V_NUMBER);\n\t\t\t} else if (IsAWordStart(sc.ch)) {\n\t\t\t\tsc.SetState(SCE_V_IDENTIFIER);\n\t\t\t} else if (sc.Match('/', '*')) {\n                                sc.SetState(SCE_V_COMMENT);\n\t\t\t\tsc.Forward();\t// Eat the * so it isn't used for the end of the comment\n\t\t\t} else if (sc.Match('/', '/')) {\n\t\t\t\tif (sc.Match(\"//!\"))\t// Nice to have a different comment style\n\t\t\t\t\tsc.SetState(SCE_V_COMMENTLINEBANG);\n\t\t\t\telse\n\t\t\t\t\tsc.SetState(SCE_V_COMMENTLINE);\n\t\t\t} else if (sc.ch == '\\\"') {\n\t\t\t\tsc.SetState(SCE_V_STRING);\n\t\t\t} else if (sc.ch == '`') {\n\t\t\t\tsc.SetState(SCE_V_PREPROCESSOR);\n\t\t\t\t// Skip whitespace between ` and preprocessor word\n\t\t\t\tdo {\n\t\t\t\t\tsc.Forward();\n\t\t\t\t} while ((sc.ch == ' ' || sc.ch == '\\t') && sc.More());\n\t\t\t\tif (sc.atLineEnd) {\n\t\t\t\t\tsc.SetState(SCE_V_DEFAULT);\n\t\t\t\t}\n\t\t\t} else if (isoperator(static_cast<char>(sc.ch)) || sc.ch == '@' || sc.ch == '#') {\n\t\t\t\tsc.SetState(SCE_V_OPERATOR);\n\t\t\t}\n\t\t}\n\t}\n\tsc.Complete();\n}\n\nstatic bool IsStreamCommentStyle(int style) {\n\treturn style == SCE_V_COMMENT;\n}\n\nstatic bool IsCommentLine(int line, Accessor &styler) {\n\tint pos = styler.LineStart(line);\n\tint eolPos = styler.LineStart(line + 1) - 1;\n\tfor (int i = pos; i < eolPos; i++) {\n\t\tchar ch = styler[i];\n\t\tchar chNext = styler.SafeGetCharAt(i + 1);\n\t\tint style = styler.StyleAt(i);\n\t\tif (ch == '/' && chNext == '/' &&\n\t\t   (style == SCE_V_COMMENTLINE || style == SCE_V_COMMENTLINEBANG)) {\n\t\t\treturn true;\n\t\t} else if (!IsASpaceOrTab(ch)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn false;\n}\n// Store both the current line's fold level and the next lines in the\n// level store to make it easy to pick up with each increment\n// and to make it possible to fiddle the current level for \"} else {\".\nstatic void FoldNoBoxVerilogDoc(unsigned int startPos, int length, int initStyle,\n                            Accessor &styler) {\n\tbool foldComment = styler.GetPropertyInt(\"fold.comment\") != 0;\n\tbool foldPreprocessor = styler.GetPropertyInt(\"fold.preprocessor\") != 0;\n\tbool foldCompact = styler.GetPropertyInt(\"fold.compact\", 1) != 0;\n\tbool foldAtElse = styler.GetPropertyInt(\"fold.at.else\", 0) != 0;\n        // Verilog specific folding options:\n        // fold_at_module -\n        //      Generally used methodology in verilog code is\n        //      one module per file, so folding at module definition is useless.\n        // fold_at_brace/parenthese -\n        //      Folding of long port lists can be convenient.\n\tbool foldAtModule = styler.GetPropertyInt(\"fold.verilog.flags\", 0) != 0;\n\tbool foldAtBrace  = 1;\n\tbool foldAtParenthese  = 1;\n\n\tunsigned int endPos = startPos + length;\n\tint visibleChars = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint levelCurrent = SC_FOLDLEVELBASE;\n\tif (lineCurrent > 0)\n\t\tlevelCurrent = styler.LevelAt(lineCurrent-1) >> 16;\n\tint levelMinCurrent = levelCurrent;\n\tint levelNext = levelCurrent;\n\tchar chNext = styler[startPos];\n\tint styleNext = styler.StyleAt(startPos);\n\tint style = initStyle;\n\tfor (unsigned int i = startPos; i < endPos; i++) {\n\t\tchar ch = chNext;\n\t\tchNext = styler.SafeGetCharAt(i + 1);\n\t\tint stylePrev = style;\n\t\tstyle = styleNext;\n\t\tstyleNext = styler.StyleAt(i + 1);\n\t\tbool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n\t\tif (foldComment && IsStreamCommentStyle(style)) {\n\t\t\tif (!IsStreamCommentStyle(stylePrev)) {\n\t\t\t\tlevelNext++;\n\t\t\t} else if (!IsStreamCommentStyle(styleNext) && !atEOL) {\n\t\t\t\t// Comments don't end at end of line and the next character may be unstyled.\n\t\t\t\tlevelNext--;\n\t\t\t}\n\t\t}\n\t\tif (foldComment && atEOL && IsCommentLine(lineCurrent, styler))\n\t\t{\n\t\t\tif (!IsCommentLine(lineCurrent - 1, styler)\n\t\t\t    && IsCommentLine(lineCurrent + 1, styler))\n\t\t\t\tlevelNext++;\n\t\t\telse if (IsCommentLine(lineCurrent - 1, styler)\n\t\t\t         && !IsCommentLine(lineCurrent+1, styler))\n\t\t\t\tlevelNext--;\n\t\t}\n\t\tif (foldComment && (style == SCE_V_COMMENTLINE)) {\n\t\t\tif ((ch == '/') && (chNext == '/')) {\n\t\t\t\tchar chNext2 = styler.SafeGetCharAt(i + 2);\n\t\t\t\tif (chNext2 == '{') {\n\t\t\t\t\tlevelNext++;\n\t\t\t\t} else if (chNext2 == '}') {\n\t\t\t\t\tlevelNext--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (foldPreprocessor && (style == SCE_V_PREPROCESSOR)) {\n\t\t\tif (ch == '`') {\n\t\t\t\tunsigned int j = i + 1;\n\t\t\t\twhile ((j < endPos) && IsASpaceOrTab(styler.SafeGetCharAt(j))) {\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t\tif (styler.Match(j, \"if\")) {\n\t\t\t\t\tlevelNext++;\n\t\t\t\t} else if (styler.Match(j, \"end\")) {\n\t\t\t\t\tlevelNext--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n                if (style == SCE_V_OPERATOR) {\n                    if (foldAtParenthese) {\n\t\t\tif (ch == '(') {\n\t\t\t\tlevelNext++;\n\t\t\t} else if (ch == ')') {\n\t\t\t\tlevelNext--;\n\t\t\t}\n                    }\n\t\t}\n                if (style == SCE_V_OPERATOR) {\n                    if (foldAtBrace) {\n\t\t\tif (ch == '{') {\n\t\t\t\tlevelNext++;\n\t\t\t} else if (ch == '}') {\n\t\t\t\tlevelNext--;\n\t\t\t}\n                    }\n\t\t}\n                if (style == SCE_V_WORD && stylePrev != SCE_V_WORD) {\n                        unsigned int j = i;\n                        if (styler.Match(j, \"case\") ||\n                            styler.Match(j, \"casex\") ||\n                            styler.Match(j, \"casez\") ||\n                            styler.Match(j, \"class\") ||\n                            styler.Match(j, \"function\") ||\n                            styler.Match(j, \"generate\") ||\n                            styler.Match(j, \"covergroup\") ||\n                            styler.Match(j, \"package\") ||\n                            styler.Match(j, \"primitive\") ||\n                            styler.Match(j, \"program\") ||\n                            styler.Match(j, \"sequence\") ||\n                            styler.Match(j, \"specify\") ||\n                            styler.Match(j, \"table\") ||\n                            styler.Match(j, \"task\") ||\n                            styler.Match(j, \"fork\") ||\n                            (styler.Match(j, \"module\") && foldAtModule) ||\n                            styler.Match(j, \"begin\")) {\n                                levelNext++;\n                        } else if (styler.Match(j, \"endcase\") ||\n                                   styler.Match(j, \"endclass\") ||\n                                   styler.Match(j, \"endfunction\") ||\n                                   styler.Match(j, \"endgenerate\") ||\n                                   styler.Match(j, \"endgroup\") ||\n                                   styler.Match(j, \"endpackage\") ||\n                                   styler.Match(j, \"endprimitive\") ||\n                                   styler.Match(j, \"endprogram\") ||\n                                   styler.Match(j, \"endsequence\") ||\n                                   styler.Match(j, \"endspecify\") ||\n                                   styler.Match(j, \"endtable\") ||\n                                   styler.Match(j, \"endtask\") ||\n                                   styler.Match(j, \"join\") ||\n                                   styler.Match(j, \"join_any\") ||\n                                   styler.Match(j, \"join_none\") ||\n                                   (styler.Match(j, \"endmodule\") && foldAtModule) ||\n                                   (styler.Match(j, \"end\") && !IsAWordChar(styler.SafeGetCharAt(j+3)))) {\n                                levelNext--;\n                        }\n\t\t}\n\t\tif (atEOL) {\n\t\t\tint levelUse = levelCurrent;\n\t\t\tif (foldAtElse) {\n\t\t\t\tlevelUse = levelMinCurrent;\n\t\t\t}\n\t\t\tint lev = levelUse | levelNext << 16;\n\t\t\tif (visibleChars == 0 && foldCompact)\n\t\t\t\tlev |= SC_FOLDLEVELWHITEFLAG;\n\t\t\tif (levelUse < levelNext)\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (lev != styler.LevelAt(lineCurrent)) {\n\t\t\t\tstyler.SetLevel(lineCurrent, lev);\n\t\t\t}\n\t\t\tlineCurrent++;\n\t\t\tlevelCurrent = levelNext;\n\t\t\tlevelMinCurrent = levelCurrent;\n\t\t\tvisibleChars = 0;\n\t\t}\n\t\tif (!isspacechar(ch))\n\t\t\tvisibleChars++;\n\t}\n}\n\nstatic void FoldVerilogDoc(unsigned int startPos, int length, int initStyle, WordList *[],\n                       Accessor &styler) {\n\tFoldNoBoxVerilogDoc(startPos, length, initStyle, styler);\n}\n\nstatic const char * const verilogWordLists[] = {\n            \"Primary keywords and identifiers\",\n            \"Secondary keywords and identifiers\",\n            \"System Tasks\",\n            \"User defined tasks and identifiers\",\n            \"Unused\",\n            0,\n        };\n\n\nLexerModule lmVerilog(SCLEX_VERILOG, ColouriseVerilogDoc, \"verilog\", FoldVerilogDoc, verilogWordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexVisualProlog.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexVisualProlog.cxx\n** Lexer for Visual Prolog.\n**/\n// Author Thomas Linder Puls, Prolog Development Denter A/S, http://www.visual-prolog.com\n// Based on Lexer for C++, C, Java, and JavaScript.\n// Copyright 1998-2005 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n// The line state contains:\n// In SCE_VISUALPROLOG_STRING_VERBATIM_EOL (i.e. multiline string literal): The closingQuote.\n// else (for SCE_VISUALPROLOG_COMMENT_BLOCK): The comment nesting level\n\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#ifdef _MSC_VER\n#pragma warning(disable: 4786)\n#endif\n\n#include <string>\n#include <vector>\n#include <map>\n#include <algorithm>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"CharacterCategory.h\"\n#include \"LexerModule.h\"\n#include \"OptionSet.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n// Options used for LexerVisualProlog\nstruct OptionsVisualProlog {\n    OptionsVisualProlog() {\n    }\n};\n\nstatic const char *const visualPrologWordLists[] = {\n    \"Major keywords (class, predicates, ...)\",\n    \"Minor keywords (if, then, try, ...)\",\n    \"Directive keywords without the '#' (include, requires, ...)\",\n    \"Documentation keywords without the '@' (short, detail, ...)\",\n    0,\n};\n\nstruct OptionSetVisualProlog : public OptionSet<OptionsVisualProlog> {\n    OptionSetVisualProlog() {\n        DefineWordListSets(visualPrologWordLists);\n    }\n};\n\nclass LexerVisualProlog : public ILexer {\n    WordList majorKeywords;\n    WordList minorKeywords;\n    WordList directiveKeywords;\n    WordList docKeywords;\n    OptionsVisualProlog options;\n    OptionSetVisualProlog osVisualProlog;\npublic:\n    LexerVisualProlog() {\n    }\n    virtual ~LexerVisualProlog() {\n    }\n    void SCI_METHOD Release() {\n        delete this;\n    }\n    int SCI_METHOD Version() const {\n        return lvOriginal;\n    }\n    const char * SCI_METHOD PropertyNames() {\n        return osVisualProlog.PropertyNames();\n    }\n    int SCI_METHOD PropertyType(const char *name) {\n        return osVisualProlog.PropertyType(name);\n    }\n    const char * SCI_METHOD DescribeProperty(const char *name) {\n        return osVisualProlog.DescribeProperty(name);\n    }\n    int SCI_METHOD PropertySet(const char *key, const char *val);\n    const char * SCI_METHOD DescribeWordListSets() {\n        return osVisualProlog.DescribeWordListSets();\n    }\n    int SCI_METHOD WordListSet(int n, const char *wl);\n    void SCI_METHOD Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n    void SCI_METHOD Fold(unsigned int startPos, int length, int initStyle, IDocument *pAccess);\n\n    void * SCI_METHOD PrivateCall(int, void *) {\n        return 0;\n    }\n\n    static ILexer *LexerFactoryVisualProlog() {\n        return new LexerVisualProlog();\n    }\n};\n\nint SCI_METHOD LexerVisualProlog::PropertySet(const char *key, const char *val) {\n    if (osVisualProlog.PropertySet(&options, key, val)) {\n        return 0;\n    }\n    return -1;\n}\n\nint SCI_METHOD LexerVisualProlog::WordListSet(int n, const char *wl) {\n    WordList *wordListN = 0;\n    switch (n) {\n    case 0:\n        wordListN = &majorKeywords;\n        break;\n    case 1:\n        wordListN = &minorKeywords;\n        break;\n    case 2:\n        wordListN = &directiveKeywords;\n        break;\n    case 3:\n        wordListN = &docKeywords;\n        break;\n    }\n    int firstModification = -1;\n    if (wordListN) {\n        WordList wlNew;\n        wlNew.Set(wl);\n        if (*wordListN != wlNew) {\n            wordListN->Set(wl);\n            firstModification = 0;\n        }\n    }\n    return firstModification;\n}\n\n// Functor used to truncate history\nstruct After {\n    int line;\n    After(int line_) : line(line_) {}\n};\n\nstatic bool isLowerLetter(int ch){\n    return ccLl == CategoriseCharacter(ch);\n}\n\nstatic bool isUpperLetter(int ch){\n    return ccLu == CategoriseCharacter(ch);\n}\n\nstatic bool isAlphaNum(int ch){\n    CharacterCategory cc = CategoriseCharacter(ch);\n    return (ccLu == cc || ccLl == cc || ccLt == cc || ccLm == cc || ccLo == cc || ccNd == cc || ccNl == cc || ccNo == cc);\n}\n\nstatic bool isIdChar(int ch){\n    return ('_') == ch || isAlphaNum(ch);\n}\n\nstatic bool isOpenStringVerbatim(int next, int &closingQuote){\n    switch (next) {\n    case L'<':\n        closingQuote = L'>';\n        return true;\n    case L'>':\n        closingQuote = L'<';\n        return true;\n    case L'(':\n        closingQuote = L')';\n        return true;\n    case L')':\n        closingQuote = L'(';\n        return true;\n    case L'[':\n        closingQuote = L']';\n        return true;\n    case L']':\n        closingQuote = L'[';\n        return true;\n    case L'{':\n        closingQuote = L'}';\n        return true;\n    case L'}':\n        closingQuote = L'{';\n        return true;\n    case L'_':\n    case L'.':\n    case L',':\n    case L';':\n        return false;\n    default:\n        if (isAlphaNum(next)) {\n            return false;\n        } else {\n            closingQuote = next;\n            return true;\n        }\n    }\n}\n\n// Look ahead to see which colour \"end\" should have (takes colour after the following keyword)\nstatic void endLookAhead(char s[], LexAccessor &styler, int start) {\n    char ch = styler.SafeGetCharAt(start, '\\n');\n    while (' ' == ch) {\n        start++;\n        ch = styler.SafeGetCharAt(start, '\\n');\n    }\n    int i = 0;\n    while (i < 100 && isLowerLetter(ch)){\n        s[i] = ch;\n        i++;\n        ch = styler.SafeGetCharAt(start + i, '\\n');\n    }\n    s[i] = '\\0';\n}\n\nstatic void forwardEscapeLiteral(StyleContext &sc, int EscapeState) {\n    sc.Forward();\n    if (sc.Match('\"') || sc.Match('\\'') || sc.Match('\\\\') || sc.Match('n') || sc.Match('l') || sc.Match('r') || sc.Match('t')) {\n        sc.ChangeState(EscapeState);\n    } else if (sc.Match('u')) {\n        if (IsADigit(sc.chNext, 16)) {\n            sc.Forward();\n            if (IsADigit(sc.chNext, 16)) {\n                sc.Forward();\n                if (IsADigit(sc.chNext, 16)) {\n                    sc.Forward();\n                    if (IsADigit(sc.chNext, 16)) {\n                        sc.Forward();\n                        sc.ChangeState(EscapeState);\n                    }\n                }\n            }\n        }\n    }\n}\n\nvoid SCI_METHOD LexerVisualProlog::Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n    LexAccessor styler(pAccess);\n    CharacterSet setDoxygen(CharacterSet::setAlpha, \"\");\n    CharacterSet setNumber(CharacterSet::setNone, \"+-.0123456789abcdefABCDEFxoXO\");\n\n    StyleContext sc(startPos, length, initStyle, styler, 0x7f);\n\n    int styleBeforeDocKeyword = SCE_VISUALPROLOG_DEFAULT;\n    int currentLine = styler.GetLine(startPos);\n\n    int closingQuote = '\"';\n    int nestLevel = 0;\n    if (currentLine >= 1)\n    {\n        nestLevel = styler.GetLineState(currentLine - 1);\n        closingQuote = nestLevel;\n    }\n\n    // Truncate ppDefineHistory before current line\n\n    for (; sc.More(); sc.Forward()) {\n\n        // Determine if the current state should terminate.\n        switch (sc.state) {\n        case SCE_VISUALPROLOG_OPERATOR:\n            sc.SetState(SCE_VISUALPROLOG_DEFAULT);\n            break;\n        case SCE_VISUALPROLOG_NUMBER:\n            // We accept almost anything because of hex. and number suffixes\n            if (!(setNumber.Contains(sc.ch))) {\n                sc.SetState(SCE_VISUALPROLOG_DEFAULT);\n            }\n            break;\n        case SCE_VISUALPROLOG_IDENTIFIER:\n            if (!isIdChar(sc.ch)) {\n                char s[1000];\n                sc.GetCurrent(s, sizeof(s));\n                if (0 == strcmp(s, \"end\")) {\n                    endLookAhead(s, styler, sc.currentPos);\n                }\n                if (majorKeywords.InList(s)) {\n                    sc.ChangeState(SCE_VISUALPROLOG_KEY_MAJOR);\n                } else if (minorKeywords.InList(s)) {\n                    sc.ChangeState(SCE_VISUALPROLOG_KEY_MINOR);\n                }\n                sc.SetState(SCE_VISUALPROLOG_DEFAULT);\n            }\n            break;\n        case SCE_VISUALPROLOG_VARIABLE:\n        case SCE_VISUALPROLOG_ANONYMOUS:\n            if (!isIdChar(sc.ch)) {\n                sc.SetState(SCE_VISUALPROLOG_DEFAULT);\n            }\n            break;\n        case SCE_VISUALPROLOG_KEY_DIRECTIVE:\n            if (!isLowerLetter(sc.ch)) {\n                char s[1000];\n                sc.GetCurrent(s, sizeof(s));\n                if (!directiveKeywords.InList(s+1)) {\n                    sc.ChangeState(SCE_VISUALPROLOG_IDENTIFIER);\n                }\n                sc.SetState(SCE_VISUALPROLOG_DEFAULT);\n            }\n            break;\n        case SCE_VISUALPROLOG_COMMENT_BLOCK:\n            if (sc.Match('*', '/')) {\n                sc.Forward();\n                nestLevel--;\n                int nextState = (nestLevel == 0) ? SCE_VISUALPROLOG_DEFAULT : SCE_VISUALPROLOG_COMMENT_BLOCK;\n                sc.ForwardSetState(nextState);\n            } else if (sc.Match('/', '*')) {\n                sc.Forward();\n                nestLevel++;\n            } else if (sc.Match('@')) {\n                styleBeforeDocKeyword = sc.state;\n                sc.SetState(SCE_VISUALPROLOG_COMMENT_KEY_ERROR);\n            }\n            break;\n        case SCE_VISUALPROLOG_COMMENT_LINE:\n            if (sc.atLineEnd) {\n                int nextState = (nestLevel == 0) ? SCE_VISUALPROLOG_DEFAULT : SCE_VISUALPROLOG_COMMENT_BLOCK;\n                sc.SetState(nextState);\n            } else if (sc.Match('@')) {\n                styleBeforeDocKeyword = sc.state;\n                sc.SetState(SCE_VISUALPROLOG_COMMENT_KEY_ERROR);\n            }\n            break;\n        case SCE_VISUALPROLOG_COMMENT_KEY_ERROR:\n            if (!setDoxygen.Contains(sc.ch) || sc.atLineEnd) {\n                char s[1000];\n                sc.GetCurrent(s, sizeof(s));\n                if (docKeywords.InList(s+1)) {\n                    sc.ChangeState(SCE_VISUALPROLOG_COMMENT_KEY);\n                }\n                if (SCE_VISUALPROLOG_COMMENT_LINE == styleBeforeDocKeyword && sc.atLineEnd) {\n                    // end line comment\n                    int nextState = (nestLevel == 0) ? SCE_VISUALPROLOG_DEFAULT : SCE_VISUALPROLOG_COMMENT_BLOCK;\n                    sc.SetState(nextState);\n                } else {\n                    sc.SetState(styleBeforeDocKeyword);\n                    if (SCE_VISUALPROLOG_COMMENT_BLOCK == styleBeforeDocKeyword && sc.Match('*', '/')) {\n                        // we have consumed the '*' if it comes immediately after the docKeyword\n                        sc.Forward();\n                        sc.Forward();\n                        nestLevel--;\n                        if (0 == nestLevel) {\n                            sc.SetState(SCE_VISUALPROLOG_DEFAULT);\n                        }\n                    }\n                }\n            }\n            break;\n        case SCE_VISUALPROLOG_STRING_ESCAPE:\n        case SCE_VISUALPROLOG_STRING_ESCAPE_ERROR:\n            // return to SCE_VISUALPROLOG_STRING and treat as such (fall-through)\n            sc.SetState(SCE_VISUALPROLOG_STRING);\n        case SCE_VISUALPROLOG_STRING:\n            if (sc.atLineEnd) {\n                sc.SetState(SCE_VISUALPROLOG_STRING_EOL_OPEN);\n            } else if (sc.Match(closingQuote)) {\n                sc.ForwardSetState(SCE_VISUALPROLOG_DEFAULT);\n            } else if (sc.Match('\\\\')) {\n                sc.SetState(SCE_VISUALPROLOG_STRING_ESCAPE_ERROR);\n                forwardEscapeLiteral(sc, SCE_VISUALPROLOG_STRING_ESCAPE);\n            }\n            break;\n        case SCE_VISUALPROLOG_STRING_EOL_OPEN:\n            if (sc.atLineStart) {\n                sc.SetState(SCE_VISUALPROLOG_DEFAULT);\n            }\n            break;\n        case SCE_VISUALPROLOG_STRING_VERBATIM_SPECIAL:\n        case SCE_VISUALPROLOG_STRING_VERBATIM_EOL:\n            // return to SCE_VISUALPROLOG_STRING_VERBATIM and treat as such (fall-through)\n            sc.SetState(SCE_VISUALPROLOG_STRING_VERBATIM);\n        case SCE_VISUALPROLOG_STRING_VERBATIM:\n            if (sc.atLineEnd) {\n                sc.SetState(SCE_VISUALPROLOG_STRING_VERBATIM_EOL);\n            } else if (sc.Match(closingQuote)) {\n                if (closingQuote == sc.chNext) {\n                    sc.SetState(SCE_VISUALPROLOG_STRING_VERBATIM_SPECIAL);\n                    sc.Forward();\n                } else {\n                    sc.ForwardSetState(SCE_VISUALPROLOG_DEFAULT);\n                }\n            }\n            break;\n        }\n\n        if (sc.atLineEnd) {\n            // Update the line state, so it can be seen by next line\n            int lineState = 0;\n            if (SCE_VISUALPROLOG_STRING_VERBATIM_EOL == sc.state) { \n                lineState = closingQuote;\n            } else if (SCE_VISUALPROLOG_COMMENT_BLOCK == sc.state) {\n                lineState = nestLevel;\n            }\n            styler.SetLineState(currentLine, lineState);\n            currentLine++;\n        }\n\n        // Determine if a new state should be entered.\n        if (sc.state == SCE_VISUALPROLOG_DEFAULT) {\n            if (sc.Match('@') && isOpenStringVerbatim(sc.chNext, closingQuote)) {\n                sc.SetState(SCE_VISUALPROLOG_STRING_VERBATIM);\n                sc.Forward();\n            } else if (IsADigit(sc.ch) || (sc.Match('.') && IsADigit(sc.chNext))) {\n                sc.SetState(SCE_VISUALPROLOG_NUMBER);\n            } else if (isLowerLetter(sc.ch)) {\n                sc.SetState(SCE_VISUALPROLOG_IDENTIFIER);\n            } else if (isUpperLetter(sc.ch)) {\n                sc.SetState(SCE_VISUALPROLOG_VARIABLE);\n            } else if (sc.Match('_')) {\n                sc.SetState(SCE_VISUALPROLOG_ANONYMOUS);\n            } else if (sc.Match('/', '*')) {\n                sc.SetState(SCE_VISUALPROLOG_COMMENT_BLOCK);\n                nestLevel = 1;\n                sc.Forward();\t// Eat the * so it isn't used for the end of the comment\n            } else if (sc.Match('%')) {\n                sc.SetState(SCE_VISUALPROLOG_COMMENT_LINE);\n            } else if (sc.Match('\\'')) {\n                closingQuote = '\\'';\n                sc.SetState(SCE_VISUALPROLOG_STRING);\n            } else if (sc.Match('\"')) {\n                closingQuote = '\"';\n                sc.SetState(SCE_VISUALPROLOG_STRING);\n            } else if (sc.Match('#')) {\n                sc.SetState(SCE_VISUALPROLOG_KEY_DIRECTIVE);\n            } else if (isoperator(static_cast<char>(sc.ch)) || sc.Match('\\\\')) {\n                sc.SetState(SCE_VISUALPROLOG_OPERATOR);\n            }\n        }\n\n    }\n    sc.Complete();\n    styler.Flush();\n}\n\n// Store both the current line's fold level and the next lines in the\n// level store to make it easy to pick up with each increment\n// and to make it possible to fiddle the current level for \"} else {\".\n\nvoid SCI_METHOD LexerVisualProlog::Fold(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n\n    LexAccessor styler(pAccess);\n\n    unsigned int endPos = startPos + length;\n    int visibleChars = 0;\n    int currentLine = styler.GetLine(startPos);\n    int levelCurrent = SC_FOLDLEVELBASE;\n    if (currentLine > 0)\n        levelCurrent = styler.LevelAt(currentLine-1) >> 16;\n    int levelMinCurrent = levelCurrent;\n    int levelNext = levelCurrent;\n    char chNext = styler[startPos];\n    int styleNext = styler.StyleAt(startPos);\n    int style = initStyle;\n    for (unsigned int i = startPos; i < endPos; i++) {\n        char ch = chNext;\n        chNext = styler.SafeGetCharAt(i + 1);\n        style = styleNext;\n        styleNext = styler.StyleAt(i + 1);\n        bool atEOL = (ch == '\\r' && chNext != '\\n') || (ch == '\\n');\n        if (style == SCE_VISUALPROLOG_OPERATOR) {\n            if (ch == '{') {\n                // Measure the minimum before a '{' to allow\n                // folding on \"} else {\"\n                if (levelMinCurrent > levelNext) {\n                    levelMinCurrent = levelNext;\n                }\n                levelNext++;\n            } else if (ch == '}') {\n                levelNext--;\n            }\n        }\n        if (!IsASpace(ch))\n            visibleChars++;\n        if (atEOL || (i == endPos-1)) {\n            int levelUse = levelCurrent;\n            int lev = levelUse | levelNext << 16;\n            if (levelUse < levelNext)\n                lev |= SC_FOLDLEVELHEADERFLAG;\n            if (lev != styler.LevelAt(currentLine)) {\n                styler.SetLevel(currentLine, lev);\n            }\n            currentLine++;\n            levelCurrent = levelNext;\n            levelMinCurrent = levelCurrent;\n            if (atEOL && (i == static_cast<unsigned int>(styler.Length()-1))) {\n                // There is an empty line at end of file so give it same level and empty\n                styler.SetLevel(currentLine, (levelCurrent | levelCurrent << 16) | SC_FOLDLEVELWHITEFLAG);\n            }\n            visibleChars = 0;\n        }\n    }\n}\n\nLexerModule lmVisualProlog(SCLEX_VISUALPROLOG, LexerVisualProlog::LexerFactoryVisualProlog, \"visualprolog\", visualPrologWordLists);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/LexYAML.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexYAML.cxx\n ** Lexer for YAML.\n **/\n// Copyright 2003- by Sean O'Dell <sean@celsoft.com>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <ctype.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n#include \"CharacterSet.h\"\n#include \"LexerModule.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic const char * const yamlWordListDesc[] = {\n\t\"Keywords\",\n\t0\n};\n\nstatic inline bool AtEOL(Accessor &styler, unsigned int i) {\n\treturn (styler[i] == '\\n') ||\n\t\t((styler[i] == '\\r') && (styler.SafeGetCharAt(i + 1) != '\\n'));\n}\n\nstatic unsigned int SpaceCount(char* lineBuffer) {\n\tif (lineBuffer == NULL)\n\t\treturn 0;\n\n\tchar* headBuffer = lineBuffer;\n\n\twhile (*headBuffer == ' ')\n\t\theadBuffer++;\n\n\treturn headBuffer - lineBuffer;\n}\n\n#define YAML_STATE_BITSIZE 16\n#define YAML_STATE_MASK\t\t\t(0xFFFF0000)\n#define YAML_STATE_DOCUMENT\t\t(1 << YAML_STATE_BITSIZE)\n#define YAML_STATE_VALUE\t\t\t(2 << YAML_STATE_BITSIZE)\n#define YAML_STATE_COMMENT\t\t(3 << YAML_STATE_BITSIZE)\n#define YAML_STATE_TEXT_PARENT\t(4 << YAML_STATE_BITSIZE)\n#define YAML_STATE_TEXT\t\t\t(5 << YAML_STATE_BITSIZE)\n\nstatic void ColouriseYAMLLine(\n\tchar *lineBuffer,\n\tunsigned int currentLine,\n\tunsigned int lengthLine,\n\tunsigned int startLine,\n\tunsigned int endPos,\n\tWordList &keywords,\n\tAccessor &styler) {\n\n\tunsigned int i = 0;\n\tbool bInQuotes = false;\n\tunsigned int indentAmount = SpaceCount(lineBuffer);\n\n\tif (currentLine > 0) {\n\t\tint parentLineState = styler.GetLineState(currentLine - 1);\n\n\t\tif ((parentLineState&YAML_STATE_MASK) == YAML_STATE_TEXT || (parentLineState&YAML_STATE_MASK) == YAML_STATE_TEXT_PARENT) {\n\t\t\tunsigned int parentIndentAmount = parentLineState&(~YAML_STATE_MASK);\n\t\t\tif (indentAmount > parentIndentAmount) {\n\t\t\t\tstyler.SetLineState(currentLine, YAML_STATE_TEXT | parentIndentAmount);\n\t\t\t\tstyler.ColourTo(endPos, SCE_YAML_TEXT);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tstyler.SetLineState(currentLine, 0);\n\tif (strncmp(lineBuffer, \"---\", 3) == 0) {\t// Document marker\n\t\tstyler.SetLineState(currentLine, YAML_STATE_DOCUMENT);\n\t\tstyler.ColourTo(endPos, SCE_YAML_DOCUMENT);\n\t\treturn;\n\t}\n\t// Skip initial spaces\n\twhile ((i < lengthLine) && lineBuffer[i] == ' ') { // YAML always uses space, never TABS or anything else\n\t\ti++;\n\t}\n\tif (lineBuffer[i] == '\\t') { // if we skipped all spaces, and we are NOT inside a text block, this is wrong\n\t\tstyler.ColourTo(endPos, SCE_YAML_ERROR);\n\t\treturn;\n\t}\n\tif (lineBuffer[i] == '#') {\t// Comment\n\t\tstyler.SetLineState(currentLine, YAML_STATE_COMMENT);\n\t\tstyler.ColourTo(endPos, SCE_YAML_COMMENT);\n\t\treturn;\n\t}\n\twhile (i < lengthLine) {\n\t\tif (lineBuffer[i] == '\\'' || lineBuffer[i] == '\\\"') {\n\t\t\tbInQuotes = !bInQuotes;\n\t\t} else if (lineBuffer[i] == ':' && !bInQuotes) {\n\t\t\tstyler.ColourTo(startLine + i - 1, SCE_YAML_IDENTIFIER);\n\t\t\tstyler.ColourTo(startLine + i, SCE_YAML_OPERATOR);\n\t\t\t// Non-folding scalar\n\t\t\ti++;\n\t\t\twhile ((i < lengthLine) && isspacechar(lineBuffer[i]))\n\t\t\t\ti++;\n\t\t\tunsigned int endValue = lengthLine - 1;\n\t\t\twhile ((endValue >= i) && isspacechar(lineBuffer[endValue]))\n\t\t\t\tendValue--;\n\t\t\tlineBuffer[endValue + 1] = '\\0';\n\t\t\tif (lineBuffer[i] == '|' || lineBuffer[i] == '>') {\n\t\t\t\ti++;\n\t\t\t\tif (lineBuffer[i] == '+' || lineBuffer[i] == '-')\n\t\t\t\t\ti++;\n\t\t\t\twhile ((i < lengthLine) && isspacechar(lineBuffer[i]))\n\t\t\t\t\ti++;\n\t\t\t\tif (lineBuffer[i] == '\\0') {\n\t\t\t\t\tstyler.SetLineState(currentLine, YAML_STATE_TEXT_PARENT | indentAmount);\n\t\t\t\t\tstyler.ColourTo(endPos, SCE_YAML_DEFAULT);\n\t\t\t\t\treturn;\n\t\t\t\t} else if (lineBuffer[i] == '#') {\n\t\t\t\t\tstyler.SetLineState(currentLine, YAML_STATE_TEXT_PARENT | indentAmount);\n\t\t\t\t\tstyler.ColourTo(startLine + i - 1, SCE_YAML_DEFAULT);\n\t\t\t\t\tstyler.ColourTo(endPos, SCE_YAML_COMMENT);\n\t\t\t\t\treturn;\n\t\t\t\t} else {\n\t\t\t\t\tstyler.ColourTo(endPos, SCE_YAML_ERROR);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else if (lineBuffer[i] == '#') {\n\t\t\t\tstyler.ColourTo(startLine + i - 1, SCE_YAML_DEFAULT);\n\t\t\t\tstyler.ColourTo(endPos, SCE_YAML_COMMENT);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstyler.SetLineState(currentLine, YAML_STATE_VALUE);\n\t\t\tif (lineBuffer[i] == '&' || lineBuffer[i] == '*') {\n\t\t\t\tstyler.ColourTo(endPos, SCE_YAML_REFERENCE);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keywords.InList(&lineBuffer[i])) { // Convertible value (true/false, etc.)\n\t\t\t\tstyler.ColourTo(endPos, SCE_YAML_KEYWORD);\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tunsigned int i2 = i;\n\t\t\t\twhile ((i < lengthLine) && lineBuffer[i]) {\n\t\t\t\t\tif (!(IsASCII(lineBuffer[i]) && isdigit(lineBuffer[i])) && lineBuffer[i] != '-' && lineBuffer[i] != '.' && lineBuffer[i] != ',') {\n\t\t\t\t\t\tstyler.ColourTo(endPos, SCE_YAML_DEFAULT);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\tif (i > i2) {\n\t\t\t\t\tstyler.ColourTo(endPos, SCE_YAML_NUMBER);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak; // shouldn't get here, but just in case, the rest of the line is coloured the default\n\t\t}\n\t\ti++;\n\t}\n\tstyler.ColourTo(endPos, SCE_YAML_DEFAULT);\n}\n\nstatic void ColouriseYAMLDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) {\n\tchar lineBuffer[1024] = \"\";\n\tstyler.StartAt(startPos);\n\tstyler.StartSegment(startPos);\n\tunsigned int linePos = 0;\n\tunsigned int startLine = startPos;\n\tunsigned int endPos = startPos + length;\n\tunsigned int maxPos = styler.Length();\n\tunsigned int lineCurrent = styler.GetLine(startPos);\n\n\tfor (unsigned int i = startPos; i < maxPos && i < endPos; i++) {\n\t\tlineBuffer[linePos++] = styler[i];\n\t\tif (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {\n\t\t\t// End of line (or of line buffer) met, colourise it\n\t\t\tlineBuffer[linePos] = '\\0';\n\t\t\tColouriseYAMLLine(lineBuffer, lineCurrent, linePos, startLine, i, *keywordLists[0], styler);\n\t\t\tlinePos = 0;\n\t\t\tstartLine = i + 1;\n\t\t\tlineCurrent++;\n\t\t}\n\t}\n\tif (linePos > 0) {\t// Last line does not have ending characters\n\t\tColouriseYAMLLine(lineBuffer, lineCurrent, linePos, startLine, startPos + length - 1, *keywordLists[0], styler);\n\t}\n}\n\nstatic bool IsCommentLine(int line, Accessor &styler) {\n\tint pos = styler.LineStart(line);\n\tif (styler[pos] == '#')\n\t\treturn true;\n\treturn false;\n}\n\nstatic void FoldYAMLDoc(unsigned int startPos, int length, int /*initStyle - unused*/,\n                      WordList *[], Accessor &styler) {\n\tconst int maxPos = startPos + length;\n\tconst int maxLines = styler.GetLine(maxPos - 1);             // Requested last line\n\tconst int docLines = styler.GetLine(styler.Length() - 1);  // Available last line\n\tconst bool foldComment = styler.GetPropertyInt(\"fold.comment.yaml\") != 0;\n\n\t// Backtrack to previous non-blank line so we can determine indent level\n\t// for any white space lines\n\t// and so we can fix any preceding fold level (which is why we go back\n\t// at least one line in all cases)\n\tint spaceFlags = 0;\n\tint lineCurrent = styler.GetLine(startPos);\n\tint indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);\n\twhile (lineCurrent > 0) {\n\t\tlineCurrent--;\n\t\tindentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);\n\t\tif (!(indentCurrent & SC_FOLDLEVELWHITEFLAG) &&\n\t\t        (!IsCommentLine(lineCurrent, styler)))\n\t\t\tbreak;\n\t}\n\tint indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;\n\n\t// Set up initial loop state\n\tint prevComment = 0;\n\tif (lineCurrent >= 1)\n\t\tprevComment = foldComment && IsCommentLine(lineCurrent - 1, styler);\n\n\t// Process all characters to end of requested range\n\t// or comment that hangs over the end of the range.  Cap processing in all cases\n\t// to end of document (in case of unclosed comment at end).\n\twhile ((lineCurrent <= docLines) && ((lineCurrent <= maxLines) || prevComment)) {\n\n\t\t// Gather info\n\t\tint lev = indentCurrent;\n\t\tint lineNext = lineCurrent + 1;\n\t\tint indentNext = indentCurrent;\n\t\tif (lineNext <= docLines) {\n\t\t\t// Information about next line is only available if not at end of document\n\t\t\tindentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);\n\t}\n\t\tconst int comment = foldComment && IsCommentLine(lineCurrent, styler);\n\t\tconst int comment_start = (comment && !prevComment && (lineNext <= docLines) &&\n\t\t                           IsCommentLine(lineNext, styler) && (lev > SC_FOLDLEVELBASE));\n\t\tconst int comment_continue = (comment && prevComment);\n\t\tif (!comment)\n\t\t\tindentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;\n\t\tif (indentNext & SC_FOLDLEVELWHITEFLAG)\n\t\t\tindentNext = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel;\n\n\t\tif (comment_start) {\n\t\t\t// Place fold point at start of a block of comments\n\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t} else if (comment_continue) {\n\t\t\t// Add level to rest of lines in the block\n\t\t\tlev = lev + 1;\n\t\t}\n\n\t\t// Skip past any blank lines for next indent level info; we skip also\n\t\t// comments (all comments, not just those starting in column 0)\n\t\t// which effectively folds them into surrounding code rather\n\t\t// than screwing up folding.\n\n\t\twhile ((lineNext < docLines) &&\n\t\t        ((indentNext & SC_FOLDLEVELWHITEFLAG) ||\n\t\t         (lineNext <= docLines && IsCommentLine(lineNext, styler)))) {\n\n\t\t\tlineNext++;\n\t\t\tindentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);\n\t\t}\n\n\t\tconst int levelAfterComments = indentNext & SC_FOLDLEVELNUMBERMASK;\n\t\tconst int levelBeforeComments = Maximum(indentCurrentLevel,levelAfterComments);\n\n\t\t// Now set all the indent levels on the lines we skipped\n\t\t// Do this from end to start.  Once we encounter one line\n\t\t// which is indented more than the line after the end of\n\t\t// the comment-block, use the level of the block before\n\n\t\tint skipLine = lineNext;\n\t\tint skipLevel = levelAfterComments;\n\n\t\twhile (--skipLine > lineCurrent) {\n\t\t\tint skipLineIndent = styler.IndentAmount(skipLine, &spaceFlags, NULL);\n\n\t\t\tif ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > levelAfterComments)\n\t\t\t\tskipLevel = levelBeforeComments;\n\n\t\t\tint whiteFlag = skipLineIndent & SC_FOLDLEVELWHITEFLAG;\n\n\t\t\tstyler.SetLevel(skipLine, skipLevel | whiteFlag);\n\t\t}\n\n\t\t// Set fold header on non-comment line\n\t\tif (!comment && !(indentCurrent & SC_FOLDLEVELWHITEFLAG) ) {\n\t\t\tif ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))\n\t\t\t\tlev |= SC_FOLDLEVELHEADERFLAG;\n\t\t}\n\n\t\t// Keep track of block comment state of previous line\n\t\tprevComment = comment_start || comment_continue;\n\n\t\t// Set fold level for this line and move to next line\n\t\tstyler.SetLevel(lineCurrent, lev);\n\t\tindentCurrent = indentNext;\n\t\tlineCurrent = lineNext;\n\t}\n\n\t// NOTE: Cannot set level of last line here because indentCurrent doesn't have\n\t// header flag set; the loop above is crafted to take care of this case!\n\t//styler.SetLevel(lineCurrent, indentCurrent);\n}\n\nLexerModule lmYAML(SCLEX_YAML, ColouriseYAMLDoc, \"yaml\", FoldYAMLDoc, yamlWordListDesc);\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexers/License.txt",
    "content": "License for Scintilla and SciTE\n\nCopyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n\nAll Rights Reserved \n\nPermission to use, copy, modify, and distribute this software and its \ndocumentation for any purpose and without fee is hereby granted, \nprovided that the above copyright notice appear in all copies and that \nboth that copyright notice and this permission notice appear in \nsupporting documentation. \n\nNEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS \nSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY \nAND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY \nSPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES \nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, \nWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER \nTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE \nOR PERFORMANCE OF THIS SOFTWARE. "
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/Accessor.cpp",
    "content": "// Scintilla source code edit control\n/** @file KeyWords.cxx\n ** Colourise for particular languages.\n **/\n// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"PropSetSimple.h\"\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nAccessor::Accessor(IDocument *pAccess_, PropSetSimple *pprops_) : LexAccessor(pAccess_), pprops(pprops_) {\n}\n\nint Accessor::GetPropertyInt(const char *key, int defaultValue) const {\n\treturn pprops->GetInt(key, defaultValue);\n}\n\nint Accessor::IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader) {\n\tint end = Length();\n\tint spaceFlags = 0;\n\n\t// Determines the indentation level of the current line and also checks for consistent\n\t// indentation compared to the previous line.\n\t// Indentation is judged consistent when the indentation whitespace of each line lines\n\t// the same or the indentation of one line is a prefix of the other.\n\n\tint pos = LineStart(line);\n\tchar ch = (*this)[pos];\n\tint indent = 0;\n\tbool inPrevPrefix = line > 0;\n\tint posPrev = inPrevPrefix ? LineStart(line-1) : 0;\n\twhile ((ch == ' ' || ch == '\\t') && (pos < end)) {\n\t\tif (inPrevPrefix) {\n\t\t\tchar chPrev = (*this)[posPrev++];\n\t\t\tif (chPrev == ' ' || chPrev == '\\t') {\n\t\t\t\tif (chPrev != ch)\n\t\t\t\t\tspaceFlags |= wsInconsistent;\n\t\t\t} else {\n\t\t\t\tinPrevPrefix = false;\n\t\t\t}\n\t\t}\n\t\tif (ch == ' ') {\n\t\t\tspaceFlags |= wsSpace;\n\t\t\tindent++;\n\t\t} else {\t// Tab\n\t\t\tspaceFlags |= wsTab;\n\t\t\tif (spaceFlags & wsSpace)\n\t\t\t\tspaceFlags |= wsSpaceTab;\n\t\t\tindent = (indent / 8 + 1) * 8;\n\t\t}\n\t\tch = (*this)[++pos];\n\t}\n\n\t*flags = spaceFlags;\n\tindent += SC_FOLDLEVELBASE;\n\t// if completely empty line or the start of a comment...\n\tif ((LineStart(line) == Length()) || (ch == ' ' || ch == '\\t' || ch == '\\n' || ch == '\\r') ||\n\t\t\t(pfnIsCommentLeader && (*pfnIsCommentLeader)(*this, pos, end-pos)))\n\t\treturn indent | SC_FOLDLEVELWHITEFLAG;\n\telse\n\t\treturn indent;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/Accessor.h",
    "content": "// Scintilla source code edit control\n/** @file Accessor.h\n ** Interfaces between Scintilla and lexers.\n **/\n// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef ACCESSOR_H\n#define ACCESSOR_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nenum { wsSpace = 1, wsTab = 2, wsSpaceTab = 4, wsInconsistent=8};\n\nclass Accessor;\nclass WordList;\nclass PropSetSimple;\n\ntypedef bool (*PFNIsCommentLeader)(Accessor &styler, int pos, int len);\n\nclass Accessor : public LexAccessor {\npublic:\n\tPropSetSimple *pprops;\n\tAccessor(IDocument *pAccess_, PropSetSimple *pprops_);\n\tint GetPropertyInt(const char *, int defaultValue=0) const;\n\tint IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0);\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/CharacterCategory.cpp",
    "content": "// Scintilla source code edit control\n/** @file CharacterCategory.cxx\n ** Returns the Unicode general category of a character.\n ** Table automatically regenerated by scripts/GenerateCharacterCategory.py\n ** Should only be rarely regenerated for new versions of Unicode.\n **/\n// Copyright 2013 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <algorithm>\n\n#include \"CharacterCategory.h\"\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nnamespace {\n\t// Use an unnamed namespace to protect the declarations from name conflicts\n\nconst int catRanges[] = {\n//++Autogenerated -- start of section automatically generated\n// Created with Python 3.3.0,  Unicode 6.1.0\n25,\n1046,\n1073,\n1171,\n1201,\n1293,\n1326,\n1361,\n1394,\n1425,\n1452,\n1489,\n1544,\n1873,\n1938,\n2033,\n2080,\n2925,\n2961,\n2990,\n3028,\n3051,\n3092,\n3105,\n3949,\n3986,\n4014,\n4050,\n4089,\n5142,\n5169,\n5203,\n5333,\n5361,\n5396,\n5429,\n5444,\n5487,\n5522,\n5562,\n5589,\n5620,\n5653,\n5682,\n5706,\n5780,\n5793,\n5841,\n5908,\n5930,\n5956,\n6000,\n6026,\n6129,\n6144,\n6898,\n6912,\n7137,\n7922,\n7937,\n8192,\n8225,\n8256,\n8289,\n8320,\n8353,\n8384,\n8417,\n8448,\n8481,\n8512,\n8545,\n8576,\n8609,\n8640,\n8673,\n8704,\n8737,\n8768,\n8801,\n8832,\n8865,\n8896,\n8929,\n8960,\n8993,\n9024,\n9057,\n9088,\n9121,\n9152,\n9185,\n9216,\n9249,\n9280,\n9313,\n9344,\n9377,\n9408,\n9441,\n9472,\n9505,\n9536,\n9569,\n9600,\n9633,\n9664,\n9697,\n9728,\n9761,\n9792,\n9825,\n9856,\n9889,\n9920,\n9953,\n10016,\n10049,\n10080,\n10113,\n10144,\n10177,\n10208,\n10241,\n10272,\n10305,\n10336,\n10369,\n10400,\n10433,\n10464,\n10497,\n10560,\n10593,\n10624,\n10657,\n10688,\n10721,\n10752,\n10785,\n10816,\n10849,\n10880,\n10913,\n10944,\n10977,\n11008,\n11041,\n11072,\n11105,\n11136,\n11169,\n11200,\n11233,\n11264,\n11297,\n11328,\n11361,\n11392,\n11425,\n11456,\n11489,\n11520,\n11553,\n11584,\n11617,\n11648,\n11681,\n11712,\n11745,\n11776,\n11809,\n11840,\n11873,\n11904,\n11937,\n11968,\n12001,\n12032,\n12097,\n12128,\n12161,\n12192,\n12225,\n12320,\n12385,\n12416,\n12449,\n12480,\n12545,\n12576,\n12673,\n12736,\n12865,\n12896,\n12961,\n12992,\n13089,\n13184,\n13249,\n13280,\n13345,\n13376,\n13409,\n13440,\n13473,\n13504,\n13569,\n13600,\n13633,\n13696,\n13729,\n13760,\n13825,\n13856,\n13953,\n13984,\n14017,\n14048,\n14113,\n14180,\n14208,\n14241,\n14340,\n14464,\n14498,\n14529,\n14560,\n14594,\n14625,\n14656,\n14690,\n14721,\n14752,\n14785,\n14816,\n14849,\n14880,\n14913,\n14944,\n14977,\n15008,\n15041,\n15072,\n15105,\n15136,\n15169,\n15200,\n15233,\n15296,\n15329,\n15360,\n15393,\n15424,\n15457,\n15488,\n15521,\n15552,\n15585,\n15616,\n15649,\n15680,\n15713,\n15744,\n15777,\n15808,\n15841,\n15904,\n15938,\n15969,\n16000,\n16033,\n16064,\n16161,\n16192,\n16225,\n16256,\n16289,\n16320,\n16353,\n16384,\n16417,\n16448,\n16481,\n16512,\n16545,\n16576,\n16609,\n16640,\n16673,\n16704,\n16737,\n16768,\n16801,\n16832,\n16865,\n16896,\n16929,\n16960,\n16993,\n17024,\n17057,\n17088,\n17121,\n17152,\n17185,\n17216,\n17249,\n17280,\n17313,\n17344,\n17377,\n17408,\n17441,\n17472,\n17505,\n17536,\n17569,\n17600,\n17633,\n17664,\n17697,\n17728,\n17761,\n17792,\n17825,\n17856,\n17889,\n17920,\n17953,\n17984,\n18017,\n18240,\n18305,\n18336,\n18401,\n18464,\n18497,\n18528,\n18657,\n18688,\n18721,\n18752,\n18785,\n18816,\n18849,\n18880,\n18913,\n21124,\n21153,\n22019,\n22612,\n22723,\n23124,\n23555,\n23732,\n23939,\n23988,\n24003,\n24052,\n24581,\n28160,\n28193,\n28224,\n28257,\n28291,\n28340,\n28352,\n28385,\n28445,\n28483,\n28513,\n28625,\n28669,\n28820,\n28864,\n28913,\n28928,\n29053,\n29056,\n29117,\n29120,\n29185,\n29216,\n29789,\n29792,\n30081,\n31200,\n31233,\n31296,\n31393,\n31488,\n31521,\n31552,\n31585,\n31616,\n31649,\n31680,\n31713,\n31744,\n31777,\n31808,\n31841,\n31872,\n31905,\n31936,\n31969,\n32000,\n32033,\n32064,\n32097,\n32128,\n32161,\n32192,\n32225,\n32384,\n32417,\n32466,\n32480,\n32513,\n32544,\n32609,\n32672,\n34305,\n35840,\n35873,\n35904,\n35937,\n35968,\n36001,\n36032,\n36065,\n36096,\n36129,\n36160,\n36193,\n36224,\n36257,\n36288,\n36321,\n36352,\n36385,\n36416,\n36449,\n36480,\n36513,\n36544,\n36577,\n36608,\n36641,\n36672,\n36705,\n36736,\n36769,\n36800,\n36833,\n36864,\n36897,\n36949,\n36965,\n37127,\n37184,\n37217,\n37248,\n37281,\n37312,\n37345,\n37376,\n37409,\n37440,\n37473,\n37504,\n37537,\n37568,\n37601,\n37632,\n37665,\n37696,\n37729,\n37760,\n37793,\n37824,\n37857,\n37888,\n37921,\n37952,\n37985,\n38016,\n38049,\n38080,\n38113,\n38144,\n38177,\n38208,\n38241,\n38272,\n38305,\n38336,\n38369,\n38400,\n38433,\n38464,\n38497,\n38528,\n38561,\n38592,\n38625,\n38656,\n38689,\n38720,\n38753,\n38784,\n38817,\n38848,\n38881,\n38912,\n38977,\n39008,\n39041,\n39072,\n39105,\n39136,\n39169,\n39200,\n39233,\n39264,\n39297,\n39328,\n39361,\n39424,\n39457,\n39488,\n39521,\n39552,\n39585,\n39616,\n39649,\n39680,\n39713,\n39744,\n39777,\n39808,\n39841,\n39872,\n39905,\n39936,\n39969,\n40000,\n40033,\n40064,\n40097,\n40128,\n40161,\n40192,\n40225,\n40256,\n40289,\n40320,\n40353,\n40384,\n40417,\n40448,\n40481,\n40512,\n40545,\n40576,\n40609,\n40640,\n40673,\n40704,\n40737,\n40768,\n40801,\n40832,\n40865,\n40896,\n40929,\n40960,\n40993,\n41024,\n41057,\n41088,\n41121,\n41152,\n41185,\n41216,\n41249,\n41280,\n41313,\n41344,\n41377,\n41408,\n41441,\n41472,\n41505,\n41536,\n41569,\n41600,\n41633,\n41664,\n41697,\n41728,\n41761,\n41792,\n41825,\n41856,\n41889,\n41920,\n41953,\n41984,\n42017,\n42048,\n42081,\n42112,\n42145,\n42176,\n42209,\n42269,\n42528,\n43773,\n43811,\n43857,\n44061,\n44065,\n45341,\n45361,\n45388,\n45437,\n45555,\n45597,\n45605,\n47052,\n47077,\n47121,\n47141,\n47217,\n47237,\n47313,\n47333,\n47389,\n47620,\n48509,\n48644,\n48753,\n48829,\n49178,\n49341,\n49362,\n49457,\n49523,\n49553,\n49621,\n49669,\n50033,\n50077,\n50129,\n50180,\n51203,\n51236,\n51557,\n52232,\n52561,\n52676,\n52741,\n52772,\n55953,\n55972,\n56005,\n56250,\n56277,\n56293,\n56483,\n56549,\n56629,\n56645,\n56772,\n56840,\n57156,\n57269,\n57316,\n57361,\n57821,\n57850,\n57860,\n57893,\n57924,\n58885,\n59773,\n59812,\n62661,\n63012,\n63069,\n63496,\n63812,\n64869,\n65155,\n65237,\n65265,\n65347,\n65405,\n65540,\n66245,\n66371,\n66405,\n66691,\n66725,\n66819,\n66853,\n67037,\n67089,\n67581,\n67588,\n68389,\n68509,\n68561,\n68605,\n70660,\n70717,\n70724,\n71101,\n72837,\n73725,\n73733,\n73830,\n73860,\n75589,\n75622,\n75653,\n75684,\n75718,\n75813,\n76070,\n76197,\n76230,\n76292,\n76325,\n76548,\n76869,\n76945,\n77000,\n77329,\n77347,\n77380,\n77597,\n77604,\n77853,\n77861,\n77894,\n77981,\n77988,\n78269,\n78308,\n78397,\n78436,\n79165,\n79172,\n79421,\n79428,\n79485,\n79556,\n79709,\n79749,\n79780,\n79814,\n79909,\n80061,\n80102,\n80189,\n80230,\n80293,\n80324,\n80381,\n80614,\n80669,\n80772,\n80861,\n80868,\n80965,\n81053,\n81096,\n81412,\n81491,\n81546,\n81749,\n81779,\n81821,\n81957,\n82022,\n82077,\n82084,\n82301,\n82404,\n82493,\n82532,\n83261,\n83268,\n83517,\n83524,\n83613,\n83620,\n83709,\n83716,\n83805,\n83845,\n83901,\n83910,\n84005,\n84093,\n84197,\n84285,\n84325,\n84445,\n84517,\n84573,\n84772,\n84925,\n84932,\n84989,\n85192,\n85509,\n85572,\n85669,\n85725,\n86053,\n86118,\n86173,\n86180,\n86493,\n86500,\n86621,\n86628,\n87357,\n87364,\n87613,\n87620,\n87709,\n87716,\n87901,\n87941,\n87972,\n88006,\n88101,\n88285,\n88293,\n88358,\n88413,\n88422,\n88485,\n88541,\n88580,\n88637,\n89092,\n89157,\n89245,\n89288,\n89617,\n89651,\n89693,\n90149,\n90182,\n90269,\n90276,\n90557,\n90596,\n90685,\n90724,\n91453,\n91460,\n91709,\n91716,\n91805,\n91812,\n91997,\n92037,\n92068,\n92102,\n92133,\n92166,\n92197,\n92349,\n92390,\n92477,\n92518,\n92581,\n92637,\n92869,\n92902,\n92957,\n93060,\n93149,\n93156,\n93253,\n93341,\n93384,\n93717,\n93732,\n93770,\n93981,\n94277,\n94308,\n94365,\n94372,\n94589,\n94660,\n94781,\n94788,\n94941,\n95012,\n95101,\n95108,\n95165,\n95172,\n95261,\n95332,\n95421,\n95492,\n95613,\n95684,\n96093,\n96198,\n96261,\n96294,\n96381,\n96454,\n96573,\n96582,\n96677,\n96733,\n96772,\n96829,\n96998,\n97053,\n97480,\n97802,\n97909,\n98099,\n98133,\n98173,\n98342,\n98461,\n98468,\n98749,\n98756,\n98877,\n98884,\n99645,\n99652,\n99997,\n100004,\n100189,\n100260,\n100293,\n100390,\n100541,\n100549,\n100669,\n100677,\n100829,\n101029,\n101117,\n101124,\n101213,\n101380,\n101445,\n101533,\n101576,\n101917,\n102154,\n102389,\n102429,\n102470,\n102557,\n102564,\n102845,\n102852,\n102973,\n102980,\n103741,\n103748,\n104093,\n104100,\n104285,\n104325,\n104356,\n104390,\n104421,\n104454,\n104637,\n104645,\n104678,\n104765,\n104774,\n104837,\n104925,\n105126,\n105213,\n105412,\n105469,\n105476,\n105541,\n105629,\n105672,\n106013,\n106020,\n106109,\n106566,\n106653,\n106660,\n106941,\n106948,\n107069,\n107076,\n108413,\n108452,\n108486,\n108581,\n108733,\n108742,\n108861,\n108870,\n108965,\n108996,\n109053,\n109286,\n109341,\n109572,\n109637,\n109725,\n109768,\n110090,\n110301,\n110389,\n110404,\n110621,\n110662,\n110749,\n110756,\n111357,\n111428,\n112221,\n112228,\n112541,\n112548,\n112605,\n112644,\n112893,\n112965,\n113021,\n113126,\n113221,\n113341,\n113349,\n113405,\n113414,\n113693,\n114246,\n114321,\n114365,\n114724,\n116261,\n116292,\n116357,\n116605,\n116723,\n116740,\n116931,\n116965,\n117233,\n117256,\n117585,\n117661,\n118820,\n118909,\n118916,\n118973,\n119012,\n119101,\n119108,\n119165,\n119204,\n119261,\n119428,\n119581,\n119588,\n119837,\n119844,\n119965,\n119972,\n120029,\n120036,\n120093,\n120132,\n120221,\n120228,\n120357,\n120388,\n120453,\n120669,\n120677,\n120740,\n120797,\n120836,\n121021,\n121027,\n121085,\n121093,\n121309,\n121352,\n121693,\n121732,\n121885,\n122884,\n122933,\n123025,\n123509,\n123537,\n123573,\n123653,\n123733,\n123912,\n124234,\n124565,\n124581,\n124629,\n124645,\n124693,\n124709,\n124749,\n124782,\n124813,\n124846,\n124870,\n124932,\n125213,\n125220,\n126397,\n126501,\n126950,\n126981,\n127153,\n127173,\n127236,\n127397,\n127773,\n127781,\n128957,\n128981,\n129221,\n129269,\n129469,\n129493,\n129553,\n129717,\n129841,\n129917,\n131076,\n132454,\n132517,\n132646,\n132677,\n132870,\n132901,\n132966,\n133029,\n133092,\n133128,\n133457,\n133636,\n133830,\n133893,\n133956,\n134085,\n134180,\n134214,\n134308,\n134374,\n134596,\n134693,\n134820,\n135237,\n135270,\n135333,\n135398,\n135589,\n135620,\n135654,\n135688,\n136006,\n136101,\n136149,\n136192,\n137437,\n137440,\n137501,\n137632,\n137693,\n137732,\n139121,\n139139,\n139172,\n149821,\n149828,\n149981,\n150020,\n150269,\n150276,\n150333,\n150340,\n150493,\n150532,\n151869,\n151876,\n152029,\n152068,\n153149,\n153156,\n153309,\n153348,\n153597,\n153604,\n153661,\n153668,\n153821,\n153860,\n154365,\n154372,\n156221,\n156228,\n156381,\n156420,\n158589,\n158629,\n158737,\n159018,\n159677,\n159748,\n160277,\n160605,\n160772,\n163517,\n163852,\n163876,\n183729,\n183780,\n184342,\n184356,\n185197,\n185230,\n185277,\n185348,\n187761,\n187849,\n187965,\n188420,\n188861,\n188868,\n188997,\n189117,\n189444,\n190021,\n190129,\n190205,\n190468,\n191045,\n191133,\n191492,\n191933,\n191940,\n192061,\n192069,\n192157,\n192516,\n194181,\n194246,\n194277,\n194502,\n194757,\n194790,\n194853,\n195217,\n195299,\n195345,\n195443,\n195460,\n195493,\n195549,\n195592,\n195933,\n196106,\n196445,\n196625,\n196812,\n196849,\n196965,\n197078,\n197117,\n197128,\n197469,\n197636,\n198755,\n198788,\n200477,\n200708,\n202021,\n202052,\n202109,\n202244,\n204509,\n204804,\n205757,\n205829,\n205926,\n206053,\n206118,\n206237,\n206342,\n206405,\n206438,\n206629,\n206749,\n206869,\n206909,\n206993,\n207048,\n207364,\n208349,\n208388,\n208573,\n208900,\n210333,\n210438,\n210980,\n211206,\n211293,\n211464,\n211786,\n211837,\n211925,\n212996,\n213733,\n213798,\n213917,\n213969,\n214020,\n215718,\n215749,\n215782,\n215813,\n216061,\n216069,\n216102,\n216133,\n216166,\n216229,\n216486,\n216677,\n217021,\n217061,\n217096,\n217437,\n217608,\n217949,\n218129,\n218339,\n218385,\n218589,\n221189,\n221318,\n221348,\n222853,\n222886,\n222917,\n223078,\n223109,\n223142,\n223301,\n223334,\n223396,\n223645,\n223752,\n224081,\n224309,\n224613,\n224917,\n225213,\n225285,\n225350,\n225380,\n226342,\n226373,\n226502,\n226565,\n226630,\n226661,\n226694,\n226756,\n226824,\n227140,\n228549,\n228582,\n228613,\n228678,\n228773,\n228806,\n228837,\n228934,\n229021,\n229265,\n229380,\n230534,\n230789,\n231046,\n231109,\n231197,\n231281,\n231432,\n231773,\n231844,\n231944,\n232260,\n233219,\n233425,\n233501,\n235537,\n235805,\n236037,\n236145,\n236165,\n236582,\n236613,\n236836,\n236965,\n236996,\n237126,\n237189,\n237220,\n237309,\n237569,\n238979,\n240993,\n241411,\n241441,\n242531,\n243717,\n244989,\n245637,\n245760,\n245793,\n245824,\n245857,\n245888,\n245921,\n245952,\n245985,\n246016,\n246049,\n246080,\n246113,\n246144,\n246177,\n246208,\n246241,\n246272,\n246305,\n246336,\n246369,\n246400,\n246433,\n246464,\n246497,\n246528,\n246561,\n246592,\n246625,\n246656,\n246689,\n246720,\n246753,\n246784,\n246817,\n246848,\n246881,\n246912,\n246945,\n246976,\n247009,\n247040,\n247073,\n247104,\n247137,\n247168,\n247201,\n247232,\n247265,\n247296,\n247329,\n247360,\n247393,\n247424,\n247457,\n247488,\n247521,\n247552,\n247585,\n247616,\n247649,\n247680,\n247713,\n247744,\n247777,\n247808,\n247841,\n247872,\n247905,\n247936,\n247969,\n248000,\n248033,\n248064,\n248097,\n248128,\n248161,\n248192,\n248225,\n248256,\n248289,\n248320,\n248353,\n248384,\n248417,\n248448,\n248481,\n248512,\n248545,\n248576,\n248609,\n248640,\n248673,\n248704,\n248737,\n248768,\n248801,\n248832,\n248865,\n248896,\n248929,\n248960,\n248993,\n249024,\n249057,\n249088,\n249121,\n249152,\n249185,\n249216,\n249249,\n249280,\n249313,\n249344,\n249377,\n249408,\n249441,\n249472,\n249505,\n249536,\n249569,\n249600,\n249633,\n249664,\n249697,\n249728,\n249761,\n249792,\n249825,\n249856,\n249889,\n249920,\n249953,\n249984,\n250017,\n250048,\n250081,\n250112,\n250145,\n250176,\n250209,\n250240,\n250273,\n250304,\n250337,\n250368,\n250401,\n250432,\n250465,\n250496,\n250529,\n250816,\n250849,\n250880,\n250913,\n250944,\n250977,\n251008,\n251041,\n251072,\n251105,\n251136,\n251169,\n251200,\n251233,\n251264,\n251297,\n251328,\n251361,\n251392,\n251425,\n251456,\n251489,\n251520,\n251553,\n251584,\n251617,\n251648,\n251681,\n251712,\n251745,\n251776,\n251809,\n251840,\n251873,\n251904,\n251937,\n251968,\n252001,\n252032,\n252065,\n252096,\n252129,\n252160,\n252193,\n252224,\n252257,\n252288,\n252321,\n252352,\n252385,\n252416,\n252449,\n252480,\n252513,\n252544,\n252577,\n252608,\n252641,\n252672,\n252705,\n252736,\n252769,\n252800,\n252833,\n252864,\n252897,\n252928,\n252961,\n252992,\n253025,\n253056,\n253089,\n253120,\n253153,\n253184,\n253217,\n253248,\n253281,\n253312,\n253345,\n253376,\n253409,\n253440,\n253473,\n253504,\n253537,\n253568,\n253601,\n253632,\n253665,\n253696,\n253729,\n253760,\n253793,\n253824,\n253857,\n253888,\n253921,\n254208,\n254465,\n254685,\n254720,\n254941,\n254977,\n255232,\n255489,\n255744,\n256001,\n256221,\n256256,\n256477,\n256513,\n256797,\n256800,\n256861,\n256864,\n256925,\n256928,\n256989,\n256992,\n257025,\n257280,\n257537,\n258013,\n258049,\n258306,\n258561,\n258818,\n259073,\n259330,\n259585,\n259773,\n259777,\n259840,\n259970,\n260020,\n260033,\n260084,\n260161,\n260285,\n260289,\n260352,\n260482,\n260532,\n260609,\n260765,\n260801,\n260864,\n261021,\n261044,\n261121,\n261376,\n261556,\n261661,\n261697,\n261821,\n261825,\n261888,\n262018,\n262068,\n262141,\n262166,\n262522,\n262668,\n262865,\n262927,\n262960,\n262989,\n263023,\n263088,\n263117,\n263151,\n263185,\n263447,\n263480,\n263514,\n263670,\n263697,\n263983,\n264016,\n264049,\n264171,\n264241,\n264338,\n264365,\n264398,\n264433,\n264786,\n264817,\n264843,\n264881,\n265206,\n265242,\n265405,\n265562,\n265738,\n265763,\n265821,\n265866,\n266066,\n266157,\n266190,\n266211,\n266250,\n266578,\n266669,\n266702,\n266749,\n266755,\n267197,\n267283,\n268125,\n268805,\n269223,\n269349,\n269383,\n269477,\n269885,\n270357,\n270400,\n270453,\n270560,\n270613,\n270657,\n270688,\n270785,\n270848,\n270945,\n270997,\n271008,\n271061,\n271122,\n271136,\n271317,\n271488,\n271541,\n271552,\n271605,\n271616,\n271669,\n271680,\n271829,\n271841,\n271872,\n272001,\n272036,\n272161,\n272213,\n272257,\n272320,\n272402,\n272544,\n272577,\n272725,\n272754,\n272789,\n272833,\n272885,\n272906,\n273417,\n274528,\n274561,\n274601,\n274730,\n274781,\n274962,\n275125,\n275282,\n275349,\n275474,\n275509,\n275570,\n275605,\n275666,\n275701,\n275922,\n275957,\n276946,\n277013,\n277074,\n277109,\n277138,\n277173,\n278162,\n286741,\n286994,\n287125,\n287762,\n287829,\n288045,\n288078,\n288117,\n290706,\n290741,\n291698,\n292501,\n293778,\n293973,\n294557,\n294933,\n296189,\n296981,\n297341,\n297994,\n299925,\n302410,\n303125,\n308978,\n309013,\n309298,\n309333,\n311058,\n311317,\n314866,\n314901,\n319517,\n319541,\n322829,\n322862,\n322893,\n322926,\n322957,\n322990,\n323021,\n323054,\n323085,\n323118,\n323149,\n323182,\n323213,\n323246,\n323274,\n324245,\n325650,\n325805,\n325838,\n325874,\n326861,\n326894,\n326925,\n326958,\n326989,\n327022,\n327053,\n327086,\n327117,\n327150,\n327186,\n327701,\n335890,\n340077,\n340110,\n340141,\n340174,\n340205,\n340238,\n340269,\n340302,\n340333,\n340366,\n340397,\n340430,\n340461,\n340494,\n340525,\n340558,\n340589,\n340622,\n340653,\n340686,\n340717,\n340750,\n340786,\n342797,\n342830,\n342861,\n342894,\n342930,\n343949,\n343982,\n344018,\n352277,\n353810,\n354485,\n354546,\n354749,\n354837,\n355165,\n360448,\n361981,\n361985,\n363517,\n363520,\n363553,\n363584,\n363681,\n363744,\n363777,\n363808,\n363841,\n363872,\n363905,\n363936,\n364065,\n364096,\n364129,\n364192,\n364225,\n364419,\n364480,\n364577,\n364608,\n364641,\n364672,\n364705,\n364736,\n364769,\n364800,\n364833,\n364864,\n364897,\n364928,\n364961,\n364992,\n365025,\n365056,\n365089,\n365120,\n365153,\n365184,\n365217,\n365248,\n365281,\n365312,\n365345,\n365376,\n365409,\n365440,\n365473,\n365504,\n365537,\n365568,\n365601,\n365632,\n365665,\n365696,\n365729,\n365760,\n365793,\n365824,\n365857,\n365888,\n365921,\n365952,\n365985,\n366016,\n366049,\n366080,\n366113,\n366144,\n366177,\n366208,\n366241,\n366272,\n366305,\n366336,\n366369,\n366400,\n366433,\n366464,\n366497,\n366528,\n366561,\n366592,\n366625,\n366656,\n366689,\n366720,\n366753,\n366784,\n366817,\n366848,\n366881,\n366912,\n366945,\n366976,\n367009,\n367040,\n367073,\n367104,\n367137,\n367168,\n367201,\n367232,\n367265,\n367296,\n367329,\n367360,\n367393,\n367424,\n367457,\n367488,\n367521,\n367552,\n367585,\n367616,\n367649,\n367680,\n367713,\n367797,\n367968,\n368001,\n368032,\n368065,\n368101,\n368192,\n368225,\n368285,\n368433,\n368554,\n368593,\n368641,\n369885,\n369889,\n369949,\n370081,\n370141,\n370180,\n371997,\n372195,\n372241,\n372285,\n372709,\n372740,\n373501,\n373764,\n374013,\n374020,\n374269,\n374276,\n374525,\n374532,\n374781,\n374788,\n375037,\n375044,\n375293,\n375300,\n375549,\n375556,\n375805,\n375813,\n376849,\n376911,\n376944,\n376975,\n377008,\n377041,\n377135,\n377168,\n377201,\n377231,\n377264,\n377297,\n377580,\n377617,\n377676,\n377713,\n377743,\n377776,\n377809,\n377871,\n377904,\n377933,\n377966,\n377997,\n378030,\n378061,\n378094,\n378125,\n378158,\n378193,\n378339,\n378385,\n378700,\n378781,\n380949,\n381789,\n381813,\n384669,\n385045,\n391901,\n392725,\n393117,\n393238,\n393265,\n393365,\n393379,\n393412,\n393449,\n393485,\n393518,\n393549,\n393582,\n393613,\n393646,\n393677,\n393710,\n393741,\n393774,\n393813,\n393869,\n393902,\n393933,\n393966,\n393997,\n394030,\n394061,\n394094,\n394124,\n394157,\n394190,\n394261,\n394281,\n394565,\n394694,\n394764,\n394787,\n394965,\n395017,\n395107,\n395140,\n395185,\n395221,\n395293,\n395300,\n398077,\n398117,\n398196,\n398243,\n398308,\n398348,\n398372,\n401265,\n401283,\n401380,\n401437,\n401572,\n402909,\n402980,\n406013,\n406037,\n406090,\n406229,\n406532,\n407421,\n407573,\n408733,\n409092,\n409621,\n410621,\n410634,\n410965,\n411914,\n412181,\n412202,\n412693,\n413706,\n414037,\n415274,\n415765,\n417789,\n417813,\n425988,\n636637,\n636949,\n638980,\n1309117,\n1310724,\n1311395,\n1311428,\n1348029,\n1348117,\n1349885,\n1350148,\n1351427,\n1351633,\n1351684,\n1360259,\n1360305,\n1360388,\n1360904,\n1361220,\n1361309,\n1361920,\n1361953,\n1361984,\n1362017,\n1362048,\n1362081,\n1362112,\n1362145,\n1362176,\n1362209,\n1362240,\n1362273,\n1362304,\n1362337,\n1362368,\n1362401,\n1362432,\n1362465,\n1362496,\n1362529,\n1362560,\n1362593,\n1362624,\n1362657,\n1362688,\n1362721,\n1362752,\n1362785,\n1362816,\n1362849,\n1362880,\n1362913,\n1362944,\n1362977,\n1363008,\n1363041,\n1363072,\n1363105,\n1363136,\n1363169,\n1363200,\n1363233,\n1363264,\n1363297,\n1363328,\n1363361,\n1363396,\n1363429,\n1363463,\n1363569,\n1363589,\n1363921,\n1363939,\n1363968,\n1364001,\n1364032,\n1364065,\n1364096,\n1364129,\n1364160,\n1364193,\n1364224,\n1364257,\n1364288,\n1364321,\n1364352,\n1364385,\n1364416,\n1364449,\n1364480,\n1364513,\n1364544,\n1364577,\n1364608,\n1364641,\n1364672,\n1364705,\n1364765,\n1364965,\n1364996,\n1367241,\n1367557,\n1367633,\n1367837,\n1368084,\n1368803,\n1369108,\n1369152,\n1369185,\n1369216,\n1369249,\n1369280,\n1369313,\n1369344,\n1369377,\n1369408,\n1369441,\n1369472,\n1369505,\n1369536,\n1369569,\n1369664,\n1369697,\n1369728,\n1369761,\n1369792,\n1369825,\n1369856,\n1369889,\n1369920,\n1369953,\n1369984,\n1370017,\n1370048,\n1370081,\n1370112,\n1370145,\n1370176,\n1370209,\n1370240,\n1370273,\n1370304,\n1370337,\n1370368,\n1370401,\n1370432,\n1370465,\n1370496,\n1370529,\n1370560,\n1370593,\n1370624,\n1370657,\n1370688,\n1370721,\n1370752,\n1370785,\n1370816,\n1370849,\n1370880,\n1370913,\n1370944,\n1370977,\n1371008,\n1371041,\n1371072,\n1371105,\n1371136,\n1371169,\n1371200,\n1371233,\n1371264,\n1371297,\n1371328,\n1371361,\n1371392,\n1371425,\n1371456,\n1371489,\n1371520,\n1371553,\n1371584,\n1371617,\n1371651,\n1371681,\n1371936,\n1371969,\n1372000,\n1372033,\n1372064,\n1372129,\n1372160,\n1372193,\n1372224,\n1372257,\n1372288,\n1372321,\n1372352,\n1372385,\n1372419,\n1372468,\n1372512,\n1372545,\n1372576,\n1372609,\n1372669,\n1372672,\n1372705,\n1372736,\n1372769,\n1372829,\n1373184,\n1373217,\n1373248,\n1373281,\n1373312,\n1373345,\n1373376,\n1373409,\n1373440,\n1373473,\n1373504,\n1373565,\n1376003,\n1376065,\n1376100,\n1376325,\n1376356,\n1376453,\n1376484,\n1376613,\n1376644,\n1377382,\n1377445,\n1377510,\n1377557,\n1377693,\n1377802,\n1378005,\n1378067,\n1378101,\n1378141,\n1378308,\n1379985,\n1380125,\n1380358,\n1380420,\n1382022,\n1382533,\n1382589,\n1382865,\n1382920,\n1383261,\n1383429,\n1384004,\n1384209,\n1384292,\n1384349,\n1384456,\n1384772,\n1385669,\n1385937,\n1385988,\n1386725,\n1387078,\n1387165,\n1387505,\n1387524,\n1388477,\n1388549,\n1388646,\n1388676,\n1390181,\n1390214,\n1390277,\n1390406,\n1390469,\n1390502,\n1390641,\n1391069,\n1391075,\n1391112,\n1391453,\n1391569,\n1391645,\n1392644,\n1393957,\n1394150,\n1394213,\n1394278,\n1394341,\n1394429,\n1394692,\n1394789,\n1394820,\n1395077,\n1395110,\n1395165,\n1395208,\n1395549,\n1395601,\n1395716,\n1396227,\n1396260,\n1396469,\n1396548,\n1396582,\n1396637,\n1396740,\n1398277,\n1398308,\n1398341,\n1398436,\n1398501,\n1398564,\n1398725,\n1398788,\n1398821,\n1398852,\n1398909,\n1399652,\n1399715,\n1399761,\n1399812,\n1400166,\n1400197,\n1400262,\n1400337,\n1400388,\n1400419,\n1400486,\n1400517,\n1400573,\n1400868,\n1401085,\n1401124,\n1401341,\n1401380,\n1401597,\n1401860,\n1402109,\n1402116,\n1402365,\n1406980,\n1408102,\n1408165,\n1408198,\n1408261,\n1408294,\n1408369,\n1408390,\n1408421,\n1408477,\n1408520,\n1408861,\n1409028,\n1766557,\n1766916,\n1767677,\n1767780,\n1769373,\n1769499,\n1835036,\n2039812,\n2051549,\n2051588,\n2055005,\n2056193,\n2056445,\n2056801,\n2056989,\n2057124,\n2057157,\n2057188,\n2057522,\n2057540,\n2057981,\n2057988,\n2058173,\n2058180,\n2058237,\n2058244,\n2058333,\n2058340,\n2058429,\n2058436,\n2061908,\n2062429,\n2062948,\n2074573,\n2074606,\n2074653,\n2075140,\n2077213,\n2077252,\n2079005,\n2080260,\n2080659,\n2080693,\n2080733,\n2080773,\n2081297,\n2081517,\n2081550,\n2081585,\n2081629,\n2081797,\n2082045,\n2082321,\n2082348,\n2082411,\n2082477,\n2082510,\n2082541,\n2082574,\n2082605,\n2082638,\n2082669,\n2082702,\n2082733,\n2082766,\n2082797,\n2082830,\n2082861,\n2082894,\n2082925,\n2082958,\n2082993,\n2083053,\n2083086,\n2083121,\n2083243,\n2083345,\n2083453,\n2083473,\n2083596,\n2083629,\n2083662,\n2083693,\n2083726,\n2083757,\n2083790,\n2083825,\n2083922,\n2083948,\n2083986,\n2084093,\n2084113,\n2084147,\n2084177,\n2084253,\n2084356,\n2084541,\n2084548,\n2088893,\n2088954,\n2088989,\n2089009,\n2089107,\n2089137,\n2089229,\n2089262,\n2089297,\n2089330,\n2089361,\n2089388,\n2089425,\n2089480,\n2089809,\n2089874,\n2089969,\n2090016,\n2090861,\n2090897,\n2090926,\n2090964,\n2090987,\n2091028,\n2091041,\n2091885,\n2091922,\n2091950,\n2091986,\n2092013,\n2092046,\n2092081,\n2092109,\n2092142,\n2092177,\n2092228,\n2092547,\n2092580,\n2094019,\n2094084,\n2095101,\n2095172,\n2095389,\n2095428,\n2095645,\n2095684,\n2095901,\n2095940,\n2096061,\n2096147,\n2096210,\n2096244,\n2096277,\n2096307,\n2096381,\n2096405,\n2096434,\n2096565,\n2096637,\n2096954,\n2097045,\n2097117,\n2097156,\n2097565,\n2097572,\n2098429,\n2098436,\n2099069,\n2099076,\n2099165,\n2099172,\n2099677,\n2099716,\n2100189,\n2101252,\n2105213,\n2105361,\n2105469,\n2105578,\n2107037,\n2107125,\n2107401,\n2109098,\n2109237,\n2109770,\n2109821,\n2109973,\n2110365,\n2112021,\n2113445,\n2113501,\n2117636,\n2118589,\n2118660,\n2120253,\n2121732,\n2122749,\n2122762,\n2122909,\n2123268,\n2123817,\n2123844,\n2124105,\n2124157,\n2125828,\n2126813,\n2126833,\n2126852,\n2128029,\n2128132,\n2128401,\n2128425,\n2128605,\n2129920,\n2131201,\n2132484,\n2135005,\n2135048,\n2135389,\n2162692,\n2162909,\n2162948,\n2163005,\n2163012,\n2164445,\n2164452,\n2164541,\n2164612,\n2164669,\n2164708,\n2165469,\n2165489,\n2165514,\n2165789,\n2170884,\n2171594,\n2171805,\n2171889,\n2171908,\n2172765,\n2172913,\n2172957,\n2174980,\n2176797,\n2176964,\n2177053,\n2179076,\n2179109,\n2179229,\n2179237,\n2179325,\n2179461,\n2179588,\n2179741,\n2179748,\n2179869,\n2179876,\n2180765,\n2180869,\n2180989,\n2181093,\n2181130,\n2181405,\n2181649,\n2181949,\n2182148,\n2183082,\n2183153,\n2183197,\n2187268,\n2189021,\n2189105,\n2189316,\n2190045,\n2190090,\n2190340,\n2190973,\n2191114,\n2191389,\n2195460,\n2197821,\n2214922,\n2215933,\n2228230,\n2228261,\n2228294,\n2228324,\n2230021,\n2230513,\n2230749,\n2230858,\n2231496,\n2231837,\n2232325,\n2232390,\n2232420,\n2233862,\n2233957,\n2234086,\n2234149,\n2234225,\n2234298,\n2234321,\n2234461,\n2234884,\n2235709,\n2235912,\n2236253,\n2236421,\n2236516,\n2237669,\n2237830,\n2237861,\n2238141,\n2238152,\n2238481,\n2238621,\n2240517,\n2240582,\n2240612,\n2242150,\n2242245,\n2242534,\n2242596,\n2242737,\n2242877,\n2243080,\n2243421,\n2281476,\n2282853,\n2282886,\n2282917,\n2282950,\n2283013,\n2283206,\n2283237,\n2283293,\n2283528,\n2283869,\n2359300,\n2387453,\n2392073,\n2395261,\n2395665,\n2395805,\n2490372,\n2524669,\n2949124,\n2967357,\n3006468,\n3008701,\n3009028,\n3009062,\n3010557,\n3011045,\n3011171,\n3011613,\n3538948,\n3539037,\n3801109,\n3808989,\n3809301,\n3810557,\n3810613,\n3812518,\n3812581,\n3812693,\n3812774,\n3812986,\n3813221,\n3813493,\n3813541,\n3813781,\n3814725,\n3814869,\n3816413,\n3817493,\n3819589,\n3819701,\n3819741,\n3825685,\n3828477,\n3828746,\n3829341,\n3833856,\n3834689,\n3835520,\n3836353,\n3836605,\n3836609,\n3837184,\n3838017,\n3838848,\n3838909,\n3838912,\n3839005,\n3839040,\n3839101,\n3839136,\n3839229,\n3839264,\n3839421,\n3839424,\n3839681,\n3839837,\n3839841,\n3839901,\n3839905,\n3840157,\n3840161,\n3840512,\n3841345,\n3842176,\n3842269,\n3842272,\n3842429,\n3842464,\n3842749,\n3842752,\n3843005,\n3843009,\n3843840,\n3843933,\n3843936,\n3844093,\n3844096,\n3844285,\n3844288,\n3844349,\n3844416,\n3844669,\n3844673,\n3845504,\n3846337,\n3847168,\n3848001,\n3848832,\n3849665,\n3850496,\n3851329,\n3852160,\n3852993,\n3853824,\n3854657,\n3855581,\n3855616,\n3856434,\n3856449,\n3857266,\n3857281,\n3857472,\n3858290,\n3858305,\n3859122,\n3859137,\n3859328,\n3860146,\n3860161,\n3860978,\n3860993,\n3861184,\n3862002,\n3862017,\n3862834,\n3862849,\n3863040,\n3863858,\n3863873,\n3864690,\n3864705,\n3864896,\n3864929,\n3864989,\n3865032,\n3866653,\n4046852,\n4047005,\n4047012,\n4047901,\n4047908,\n4047997,\n4048004,\n4048061,\n4048100,\n4048157,\n4048164,\n4048509,\n4048516,\n4048669,\n4048676,\n4048733,\n4048740,\n4048797,\n4048964,\n4049021,\n4049124,\n4049181,\n4049188,\n4049245,\n4049252,\n4049309,\n4049316,\n4049437,\n4049444,\n4049533,\n4049540,\n4049597,\n4049636,\n4049693,\n4049700,\n4049757,\n4049764,\n4049821,\n4049828,\n4049885,\n4049892,\n4049949,\n4049956,\n4050045,\n4050052,\n4050109,\n4050148,\n4050301,\n4050308,\n4050557,\n4050564,\n4050717,\n4050724,\n4050877,\n4050884,\n4050941,\n4050948,\n4051293,\n4051300,\n4051869,\n4052004,\n4052125,\n4052132,\n4052317,\n4052324,\n4052893,\n4054546,\n4054621,\n4063253,\n4064669,\n4064789,\n4067997,\n4068373,\n4068861,\n4068917,\n4069373,\n4069429,\n4069917,\n4069941,\n4070429,\n4071434,\n4071805,\n4071957,\n4072957,\n4072981,\n4074909,\n4075029,\n4076413,\n4078805,\n4079741,\n4080149,\n4081533,\n4081685,\n4081981,\n4082197,\n4082269,\n4087829,\n4088893,\n4089365,\n4089565,\n4089589,\n4091837,\n4091925,\n4092573,\n4092949,\n4094141,\n4094165,\n4094333,\n4094997,\n4095549,\n4096021,\n4098045,\n4098069,\n4098109,\n4098133,\n4103965,\n4103989,\n4104125,\n4104213,\n4106205,\n4106261,\n4106397,\n4106773,\n4107549,\n4112245,\n4114493,\n4114613,\n4114973,\n4116501,\n4118749,\n4120597,\n4124317,\n4194308,\n5561085,\n5562372,\n5695165,\n5695492,\n5702621,\n6225924,\n6243293,\n29360186,\n29360221,\n29361178,\n29364253,\n29368325,\n29376029,\n31457308,\n33554397,\n33554460,\n35651549,\n//--Autogenerated -- end of section automatically generated\n};\n\nconst int maxUnicode = 0x10ffff;\nconst int maskCategory = 0x1F;\nconst int nRanges = sizeof(catRanges) / sizeof(catRanges[0]);\n\n}\n\n// Each element in catRanges is the start of a range of Unicode characters in\n// one general category.\n// The value is comprised of a 21-bit character value shifted 5 bits and a 5 bit\n// category matching the CharacterCategory enumeration.\n// Initial version has 3249 entries and adds about 13K to the executable.\n// The array is in ascending order so can be searched using binary search.\n// Therefore the average call takes log2(3249) = 12 comparisons.\n// For speed, it may be an useful to make a linear table for the common values,\n// possibly for 0..0xff for most Western European text or 0..0xfff for most\n// alphabetic languages.\n\nCharacterCategory CategoriseCharacter(int character) {\n\tif (character < 0 || character > maxUnicode)\n\t\treturn ccCn;\n\tconst int baseValue = character * (maskCategory+1) + maskCategory;\n\tconst int *placeAfter = std::lower_bound(catRanges, catRanges+nRanges, baseValue);\n\treturn static_cast<CharacterCategory>(*(placeAfter-1) & maskCategory);\n}\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/CharacterCategory.h",
    "content": "// Scintilla source code edit control\n/** @file CharacterCategory.h\n ** Returns the Unicode general category of a character.\n **/\n// Copyright 2013 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef CHARACTERCATEGORY_H\n#define CHARACTERCATEGORY_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nenum CharacterCategory {\n\tccLu, ccLl, ccLt, ccLm, ccLo,\n\tccMn, ccMc, ccMe,\n\tccNd, ccNl, ccNo,\n\tccPc, ccPd, ccPs, ccPe, ccPi, ccPf, ccPo,\n\tccSm, ccSc, ccSk, ccSo,\n\tccZs, ccZl, ccZp,\n\tccCc, ccCf, ccCs, ccCo, ccCn\n};\n\nCharacterCategory CategoriseCharacter(int character);\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/CharacterSet.cpp",
    "content": "// Scintilla source code edit control\n/** @file CharacterSet.cxx\n ** Simple case functions for ASCII.\n ** Lexer infrastructure.\n **/\n// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <assert.h>\n\n#include \"CharacterSet.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nint CompareCaseInsensitive(const char *a, const char *b) {\n\twhile (*a && *b) {\n\t\tif (*a != *b) {\n\t\t\tchar upperA = MakeUpperCase(*a);\n\t\t\tchar upperB = MakeUpperCase(*b);\n\t\t\tif (upperA != upperB)\n\t\t\t\treturn upperA - upperB;\n\t\t}\n\t\ta++;\n\t\tb++;\n\t}\n\t// Either *a or *b is nul\n\treturn *a - *b;\n}\n\nint CompareNCaseInsensitive(const char *a, const char *b, size_t len) {\n\twhile (*a && *b && len) {\n\t\tif (*a != *b) {\n\t\t\tchar upperA = MakeUpperCase(*a);\n\t\t\tchar upperB = MakeUpperCase(*b);\n\t\t\tif (upperA != upperB)\n\t\t\t\treturn upperA - upperB;\n\t\t}\n\t\ta++;\n\t\tb++;\n\t\tlen--;\n\t}\n\tif (len == 0)\n\t\treturn 0;\n\telse\n\t\t// Either *a or *b is nul\n\t\treturn *a - *b;\n}\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/CharacterSet.h",
    "content": "// Scintilla source code edit control\n/** @file CharacterSet.h\n ** Encapsulates a set of characters. Used to test if a character is within a set.\n **/\n// Copyright 2007 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef CHARACTERSET_H\n#define CHARACTERSET_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nclass CharacterSet {\n\tint size;\n\tbool valueAfter;\n\tbool *bset;\npublic:\n\tenum setBase {\n\t\tsetNone=0,\n\t\tsetLower=1,\n\t\tsetUpper=2,\n\t\tsetDigits=4,\n\t\tsetAlpha=setLower|setUpper,\n\t\tsetAlphaNum=setAlpha|setDigits\n\t};\n\tCharacterSet(setBase base=setNone, const char *initialSet=\"\", int size_=0x80, bool valueAfter_=false) {\n\t\tsize = size_;\n\t\tvalueAfter = valueAfter_;\n\t\tbset = new bool[size];\n\t\tfor (int i=0; i < size; i++) {\n\t\t\tbset[i] = false;\n\t\t}\n\t\tAddString(initialSet);\n\t\tif (base & setLower)\n\t\t\tAddString(\"abcdefghijklmnopqrstuvwxyz\");\n\t\tif (base & setUpper)\n\t\t\tAddString(\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\");\n\t\tif (base & setDigits)\n\t\t\tAddString(\"0123456789\");\n\t}\n\tCharacterSet(const CharacterSet &other) {\n\t\tsize = other.size;\n\t\tvalueAfter = other.valueAfter;\n\t\tbset = new bool[size];\n\t\tfor (int i=0; i < size; i++) {\n\t\t\tbset[i] = other.bset[i];\n\t\t}\n\t}\n\t~CharacterSet() {\n\t\tdelete []bset;\n\t\tbset = 0;\n\t\tsize = 0;\n\t}\n\tCharacterSet &operator=(const CharacterSet &other) {\n\t\tif (this != &other) {\n\t\t\tbool *bsetNew = new bool[other.size];\n\t\t\tfor (int i=0; i < other.size; i++) {\n\t\t\t\tbsetNew[i] = other.bset[i];\n\t\t\t}\n\t\t\tdelete []bset;\n\t\t\tsize = other.size;\n\t\t\tvalueAfter = other.valueAfter;\n\t\t\tbset = bsetNew;\n\t\t}\n\t\treturn *this;\n\t}\n\tvoid Add(int val) {\n\t\tassert(val >= 0);\n\t\tassert(val < size);\n\t\tbset[val] = true;\n\t}\n\tvoid AddString(const char *setToAdd) {\n\t\tfor (const char *cp=setToAdd; *cp; cp++) {\n\t\t\tint val = static_cast<unsigned char>(*cp);\n\t\t\tassert(val >= 0);\n\t\t\tassert(val < size);\n\t\t\tbset[val] = true;\n\t\t}\n\t}\n\tbool Contains(int val) const {\n        // val being -ve is valid (or there is a sign extension bug elsewhere.\n\t\t//assert(val >= 0);\n\t\tif (val < 0) return false;\n\t\treturn (val < size) ? bset[val] : valueAfter;\n\t}\n};\n\n// Functions for classifying characters\n\ninline bool IsASpace(int ch) {\n    return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));\n}\n\ninline bool IsASpaceOrTab(int ch) {\n\treturn (ch == ' ') || (ch == '\\t');\n}\n\ninline bool IsADigit(int ch) {\n\treturn (ch >= '0') && (ch <= '9');\n}\n\ninline bool IsADigit(int ch, int base) {\n\tif (base <= 10) {\n\t\treturn (ch >= '0') && (ch < '0' + base);\n\t} else {\n\t\treturn ((ch >= '0') && (ch <= '9')) ||\n\t\t       ((ch >= 'A') && (ch < 'A' + base - 10)) ||\n\t\t       ((ch >= 'a') && (ch < 'a' + base - 10));\n\t}\n}\n\ninline bool IsASCII(int ch) {\n\treturn (ch >= 0) && (ch < 0x80);\n}\n\ninline bool IsLowerCase(int ch) {\n\treturn (ch >= 'a') && (ch <= 'z');\n}\n\ninline bool IsUpperCase(int ch) {\n\treturn (ch >= 'A') && (ch <= 'Z');\n}\n\ninline bool IsAlphaNumeric(int ch) {\n\treturn\n\t\t((ch >= '0') && (ch <= '9')) ||\n\t\t((ch >= 'a') && (ch <= 'z')) ||\n\t\t((ch >= 'A') && (ch <= 'Z'));\n}\n\n/**\n * Check if a character is a space.\n * This is ASCII specific but is safe with chars >= 0x80.\n */\ninline bool isspacechar(int ch) {\n    return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));\n}\n\ninline bool iswordchar(int ch) {\n\treturn IsAlphaNumeric(ch) || ch == '.' || ch == '_';\n}\n\ninline bool iswordstart(int ch) {\n\treturn IsAlphaNumeric(ch) || ch == '_';\n}\n\ninline bool isoperator(int ch) {\n\tif (IsAlphaNumeric(ch))\n\t\treturn false;\n\tif (ch == '%' || ch == '^' || ch == '&' || ch == '*' ||\n\t        ch == '(' || ch == ')' || ch == '-' || ch == '+' ||\n\t        ch == '=' || ch == '|' || ch == '{' || ch == '}' ||\n\t        ch == '[' || ch == ']' || ch == ':' || ch == ';' ||\n\t        ch == '<' || ch == '>' || ch == ',' || ch == '/' ||\n\t        ch == '?' || ch == '!' || ch == '.' || ch == '~')\n\t\treturn true;\n\treturn false;\n}\n\n// Simple case functions for ASCII.\n\ninline char MakeUpperCase(char ch) {\n\tif (ch < 'a' || ch > 'z')\n\t\treturn ch;\n\telse\n\t\treturn static_cast<char>(ch - 'a' + 'A');\n}\n\nint CompareCaseInsensitive(const char *a, const char *b);\nint CompareNCaseInsensitive(const char *a, const char *b, size_t len);\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/LexAccessor.h",
    "content": "// Scintilla source code edit control\n/** @file LexAccessor.h\n ** Interfaces between Scintilla and lexers.\n **/\n// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef LEXACCESSOR_H\n#define LEXACCESSOR_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nenum EncodingType { enc8bit, encUnicode, encDBCS };\n\nclass LexAccessor {\nprivate:\n\tIDocument *pAccess;\n\tenum {extremePosition=0x7FFFFFFF};\n\t/** @a bufferSize is a trade off between time taken to copy the characters\n\t * and retrieval overhead.\n\t * @a slopSize positions the buffer before the desired position\n\t * in case there is some backtracking. */\n\tenum {bufferSize=4000, slopSize=bufferSize/8};\n\tchar buf[bufferSize+1];\n\tint startPos;\n\tint endPos;\n\tint codePage;\n\tenum EncodingType encodingType;\n\tint lenDoc;\n\tint mask;\n\tchar styleBuf[bufferSize];\n\tint validLen;\n\tchar chFlags;\n\tchar chWhile;\n\tunsigned int startSeg;\n\tint startPosStyling;\n\tint documentVersion;\n\n\tvoid Fill(int position) {\n\t\tstartPos = position - slopSize;\n\t\tif (startPos + bufferSize > lenDoc)\n\t\t\tstartPos = lenDoc - bufferSize;\n\t\tif (startPos < 0)\n\t\t\tstartPos = 0;\n\t\tendPos = startPos + bufferSize;\n\t\tif (endPos > lenDoc)\n\t\t\tendPos = lenDoc;\n\n\t\tpAccess->GetCharRange(buf, startPos, endPos-startPos);\n\t\tbuf[endPos-startPos] = '\\0';\n\t}\n\npublic:\n\tLexAccessor(IDocument *pAccess_) :\n\t\tpAccess(pAccess_), startPos(extremePosition), endPos(0),\n\t\tcodePage(pAccess->CodePage()), \n\t\tencodingType(enc8bit),\n\t\tlenDoc(pAccess->Length()),\n\t\tmask(127), validLen(0), chFlags(0), chWhile(0),\n\t\tstartSeg(0), startPosStyling(0), \n\t\tdocumentVersion(pAccess->Version()) {\n\t\tswitch (codePage) {\n\t\tcase 65001:\n\t\t\tencodingType = encUnicode;\n\t\t\tbreak;\n\t\tcase 932:\n\t\tcase 936:\n\t\tcase 949:\n\t\tcase 950:\n\t\tcase 1361:\n\t\t\tencodingType = encDBCS;\n\t\t}\n\t}\n\tchar operator[](int position) {\n\t\tif (position < startPos || position >= endPos) {\n\t\t\tFill(position);\n\t\t}\n\t\treturn buf[position - startPos];\n\t}\n\tIDocumentWithLineEnd *MultiByteAccess() const {\n\t\tif (documentVersion >= dvLineEnd) {\n\t\t\treturn static_cast<IDocumentWithLineEnd *>(pAccess);\n\t\t}\n\t\treturn 0;\n\t}\n\t/** Safe version of operator[], returning a defined value for invalid position. */\n\tchar SafeGetCharAt(int position, char chDefault=' ') {\n\t\tif (position < startPos || position >= endPos) {\n\t\t\tFill(position);\n\t\t\tif (position < startPos || position >= endPos) {\n\t\t\t\t// Position is outside range of document\n\t\t\t\treturn chDefault;\n\t\t\t}\n\t\t}\n\t\treturn buf[position - startPos];\n\t}\n\tbool IsLeadByte(char ch) const {\n\t\treturn pAccess->IsDBCSLeadByte(ch);\n\t}\n\tEncodingType Encoding() const {\n\t\treturn encodingType;\n\t}\n\tbool Match(int pos, const char *s) {\n\t\tfor (int i=0; *s; i++) {\n\t\t\tif (*s != SafeGetCharAt(pos+i))\n\t\t\t\treturn false;\n\t\t\ts++;\n\t\t}\n\t\treturn true;\n\t}\n\tchar StyleAt(int position) const {\n\t\treturn static_cast<char>(pAccess->StyleAt(position) & mask);\n\t}\n\tint GetLine(int position) const {\n\t\treturn pAccess->LineFromPosition(position);\n\t}\n\tint LineStart(int line) const {\n\t\treturn pAccess->LineStart(line);\n\t}\n\tint LineEnd(int line) {\n\t\tif (documentVersion >= dvLineEnd) {\n\t\t\treturn (static_cast<IDocumentWithLineEnd *>(pAccess))->LineEnd(line);\n\t\t} else {\n\t\t\t// Old interface means only '\\r', '\\n' and '\\r\\n' line ends.\n\t\t\tint startNext = pAccess->LineStart(line+1);\n\t\t\tchar chLineEnd = SafeGetCharAt(startNext-1);\n\t\t\tif (chLineEnd == '\\n' && (SafeGetCharAt(startNext-2)  == '\\r'))\n\t\t\t\treturn startNext - 2;\n\t\t\telse\n\t\t\t\treturn startNext - 1;\n\t\t}\n\t}\n\tint LevelAt(int line) const {\n\t\treturn pAccess->GetLevel(line);\n\t}\n\tint Length() const {\n\t\treturn lenDoc;\n\t}\n\tvoid Flush() {\n\t\tstartPos = extremePosition;\n\t\tif (validLen > 0) {\n\t\t\tpAccess->SetStyles(validLen, styleBuf);\n\t\t\tstartPosStyling += validLen;\n\t\t\tvalidLen = 0;\n\t\t}\n\t}\n\tint GetLineState(int line) const {\n\t\treturn pAccess->GetLineState(line);\n\t}\n\tint SetLineState(int line, int state) {\n\t\treturn pAccess->SetLineState(line, state);\n\t}\n\t// Style setting\n\tvoid StartAt(unsigned int start, char chMask=31) {\n\t\t// Store the mask specified for use with StyleAt.\n\t\tmask = chMask;\n\t\tpAccess->StartStyling(start, chMask);\n\t\tstartPosStyling = start;\n\t}\n\tvoid SetFlags(char chFlags_, char chWhile_) {\n\t\tchFlags = chFlags_;\n\t\tchWhile = chWhile_;\n\t}\n\tunsigned int GetStartSegment() const {\n\t\treturn startSeg;\n\t}\n\tvoid StartSegment(unsigned int pos) {\n\t\tstartSeg = pos;\n\t}\n\tvoid ColourTo(unsigned int pos, int chAttr) {\n\t\t// Only perform styling if non empty range\n\t\tif (pos != startSeg - 1) {\n\t\t\tassert(pos >= startSeg);\n\t\t\tif (pos < startSeg) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (validLen + (pos - startSeg + 1) >= bufferSize)\n\t\t\t\tFlush();\n\t\t\tif (validLen + (pos - startSeg + 1) >= bufferSize) {\n\t\t\t\t// Too big for buffer so send directly\n\t\t\t\tpAccess->SetStyleFor(pos - startSeg + 1, static_cast<char>(chAttr));\n\t\t\t} else {\n\t\t\t\tif (chAttr != chWhile)\n\t\t\t\t\tchFlags = 0;\n\t\t\t\tchAttr = static_cast<char>(chAttr | chFlags);\n\t\t\t\tfor (unsigned int i = startSeg; i <= pos; i++) {\n\t\t\t\t\tassert((startPosStyling + validLen) < Length());\n\t\t\t\t\tstyleBuf[validLen++] = static_cast<char>(chAttr);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tstartSeg = pos+1;\n\t}\n\tvoid SetLevel(int line, int level) {\n\t\tpAccess->SetLevel(line, level);\n\t}\n\tvoid IndicatorFill(int start, int end, int indicator, int value) {\n\t\tpAccess->DecorationSetCurrentIndicator(indicator);\n\t\tpAccess->DecorationFillRange(start, value, end - start);\n\t}\n\n\tvoid ChangeLexerState(int start, int end) {\n\t\tpAccess->ChangeLexerState(start, end);\n\t}\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/LexerBase.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexerBase.cxx\n ** A simple lexer with no state.\n **/\n// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"PropSetSimple.h\"\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"LexerModule.h\"\n#include \"LexerBase.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nLexerBase::LexerBase() {\n\tfor (int wl = 0; wl < numWordLists; wl++)\n\t\tkeyWordLists[wl] = new WordList;\n\tkeyWordLists[numWordLists] = 0;\n}\n\nLexerBase::~LexerBase() {\n\tfor (int wl = 0; wl < numWordLists; wl++) {\n\t\tdelete keyWordLists[wl];\n\t\tkeyWordLists[wl] = 0;\n\t}\n\tkeyWordLists[numWordLists] = 0;\n}\n\nvoid SCI_METHOD LexerBase::Release() {\n\tdelete this;\n}\n\nint SCI_METHOD LexerBase::Version() const {\n\treturn lvOriginal;\n}\n\nconst char * SCI_METHOD LexerBase::PropertyNames() {\n\treturn \"\";\n}\n\nint SCI_METHOD LexerBase::PropertyType(const char *) {\n\treturn SC_TYPE_BOOLEAN;\n}\n\nconst char * SCI_METHOD LexerBase::DescribeProperty(const char *) {\n\treturn \"\";\n}\n\nint SCI_METHOD LexerBase::PropertySet(const char *key, const char *val) {\n\tconst char *valOld = props.Get(key);\n\tif (strcmp(val, valOld) != 0) {\n\t\tprops.Set(key, val);\n\t\treturn 0;\n\t} else {\n\t\treturn -1;\n\t}\n}\n\nconst char * SCI_METHOD LexerBase::DescribeWordListSets() {\n\treturn \"\";\n}\n\nint SCI_METHOD LexerBase::WordListSet(int n, const char *wl) {\n\tif (n < numWordLists) {\n\t\tWordList wlNew;\n\t\twlNew.Set(wl);\n\t\tif (*keyWordLists[n] != wlNew) {\n\t\t\tkeyWordLists[n]->Set(wl);\n\t\t\treturn 0;\n\t\t}\n\t}\n\treturn -1;\n}\n\nvoid * SCI_METHOD LexerBase::PrivateCall(int, void *) {\n\treturn 0;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/LexerBase.h",
    "content": "// Scintilla source code edit control\n/** @file LexerBase.h\n ** A simple lexer with no state.\n **/\n// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef LEXERBASE_H\n#define LEXERBASE_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n// A simple lexer with no state\nclass LexerBase : public ILexer {\nprotected:\n\tPropSetSimple props;\n\tenum {numWordLists=KEYWORDSET_MAX+1};\n\tWordList *keyWordLists[numWordLists+1];\npublic:\n\tLexerBase();\n\tvirtual ~LexerBase();\n\tvoid SCI_METHOD Release();\n\tint SCI_METHOD Version() const;\n\tconst char * SCI_METHOD PropertyNames();\n\tint SCI_METHOD PropertyType(const char *name);\n\tconst char * SCI_METHOD DescribeProperty(const char *name);\n\tint SCI_METHOD PropertySet(const char *key, const char *val);\n\tconst char * SCI_METHOD DescribeWordListSets();\n\tint SCI_METHOD WordListSet(int n, const char *wl);\n\tvoid SCI_METHOD Lex(unsigned int startPos, int lengthDoc, int initStyle, IDocument *pAccess) = 0;\n\tvoid SCI_METHOD Fold(unsigned int startPos, int lengthDoc, int initStyle, IDocument *pAccess) = 0;\n\tvoid * SCI_METHOD PrivateCall(int operation, void *pointer);\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/LexerModule.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexerModule.cxx\n ** Colourise for particular languages.\n **/\n// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#include <string>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"PropSetSimple.h\"\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"LexerModule.h\"\n#include \"LexerBase.h\"\n#include \"LexerSimple.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nLexerModule::LexerModule(int language_,\n\tLexerFunction fnLexer_,\n\tconst char *languageName_,\n\tLexerFunction fnFolder_,\n        const char *const wordListDescriptions_[],\n\tint styleBits_) :\n\tlanguage(language_),\n\tfnLexer(fnLexer_),\n\tfnFolder(fnFolder_),\n\tfnFactory(0),\n\twordListDescriptions(wordListDescriptions_),\n\tstyleBits(styleBits_),\n\tlanguageName(languageName_) {\n}\n\nLexerModule::LexerModule(int language_,\n\tLexerFactoryFunction fnFactory_,\n\tconst char *languageName_,\n\tconst char * const wordListDescriptions_[],\n\tint styleBits_) :\n\tlanguage(language_),\n\tfnLexer(0),\n\tfnFolder(0),\n\tfnFactory(fnFactory_),\n\twordListDescriptions(wordListDescriptions_),\n\tstyleBits(styleBits_),\n\tlanguageName(languageName_) {\n}\n\nint LexerModule::GetNumWordLists() const {\n\tif (wordListDescriptions == NULL) {\n\t\treturn -1;\n\t} else {\n\t\tint numWordLists = 0;\n\n\t\twhile (wordListDescriptions[numWordLists]) {\n\t\t\t++numWordLists;\n\t\t}\n\n\t\treturn numWordLists;\n\t}\n}\n\nconst char *LexerModule::GetWordListDescription(int index) const {\n\tassert(index < GetNumWordLists());\n\tif (!wordListDescriptions || (index >= GetNumWordLists())) {\n\t\treturn \"\";\n\t} else {\n\t\treturn wordListDescriptions[index];\n \t}\n}\n\nint LexerModule::GetStyleBitsNeeded() const {\n\treturn styleBits;\n}\n\nILexer *LexerModule::Create() const {\n\tif (fnFactory)\n\t\treturn fnFactory();\n\telse\n\t\treturn new LexerSimple(this);\n}\n\nvoid LexerModule::Lex(unsigned int startPos, int lengthDoc, int initStyle,\n\t  WordList *keywordlists[], Accessor &styler) const {\n\tif (fnLexer)\n\t\tfnLexer(startPos, lengthDoc, initStyle, keywordlists, styler);\n}\n\nvoid LexerModule::Fold(unsigned int startPos, int lengthDoc, int initStyle,\n\t  WordList *keywordlists[], Accessor &styler) const {\n\tif (fnFolder) {\n\t\tint lineCurrent = styler.GetLine(startPos);\n\t\t// Move back one line in case deletion wrecked current line fold state\n\t\tif (lineCurrent > 0) {\n\t\t\tlineCurrent--;\n\t\t\tint newStartPos = styler.LineStart(lineCurrent);\n\t\t\tlengthDoc += startPos - newStartPos;\n\t\t\tstartPos = newStartPos;\n\t\t\tinitStyle = 0;\n\t\t\tif (startPos > 0) {\n\t\t\t\tinitStyle = styler.StyleAt(startPos - 1);\n\t\t\t}\n\t\t}\n\t\tfnFolder(startPos, lengthDoc, initStyle, keywordlists, styler);\n\t}\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/LexerModule.h",
    "content": "// Scintilla source code edit control\n/** @file LexerModule.h\n ** Colourise for particular languages.\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef LEXERMODULE_H\n#define LEXERMODULE_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nclass Accessor;\nclass WordList;\n\ntypedef void (*LexerFunction)(unsigned int startPos, int lengthDoc, int initStyle,\n                  WordList *keywordlists[], Accessor &styler);\ntypedef ILexer *(*LexerFactoryFunction)();\n\n/**\n * A LexerModule is responsible for lexing and folding a particular language.\n * The class maintains a list of LexerModules which can be searched to find a\n * module appropriate to a particular language.\n */\nclass LexerModule {\nprotected:\n\tint language;\n\tLexerFunction fnLexer;\n\tLexerFunction fnFolder;\n\tLexerFactoryFunction fnFactory;\n\tconst char * const * wordListDescriptions;\n\tint styleBits;\n\npublic:\n\tconst char *languageName;\n\tLexerModule(int language_,\n\t\tLexerFunction fnLexer_,\n\t\tconst char *languageName_=0,\n\t\tLexerFunction fnFolder_=0,\n\t\tconst char * const wordListDescriptions_[] = NULL,\n\t\tint styleBits_=5);\n\tLexerModule(int language_,\n\t\tLexerFactoryFunction fnFactory_,\n\t\tconst char *languageName_,\n\t\tconst char * const wordListDescriptions_[] = NULL,\n\t\tint styleBits_=8);\n\tvirtual ~LexerModule() {\n\t}\n\tint GetLanguage() const { return language; }\n\n\t// -1 is returned if no WordList information is available\n\tint GetNumWordLists() const;\n\tconst char *GetWordListDescription(int index) const;\n\n\tint GetStyleBitsNeeded() const;\n\n\tILexer *Create() const;\n\n\tvirtual void Lex(unsigned int startPos, int length, int initStyle,\n                  WordList *keywordlists[], Accessor &styler) const;\n\tvirtual void Fold(unsigned int startPos, int length, int initStyle,\n                  WordList *keywordlists[], Accessor &styler) const;\n\n\tfriend class Catalogue;\n};\n\ninline int Maximum(int a, int b) {\n\treturn (a > b) ? a : b;\n}\n\n// Shut up annoying Visual C++ warnings:\n#ifdef _MSC_VER\n#pragma warning(disable: 4244 4309 4514 4710)\n#endif\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/LexerNoExceptions.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexerNoExceptions.cxx\n ** A simple lexer with no state which does not throw exceptions so can be used in an external lexer.\n **/\n// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"PropSetSimple.h\"\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"LexerModule.h\"\n#include \"LexerBase.h\"\n#include \"LexerNoExceptions.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nint SCI_METHOD LexerNoExceptions::PropertySet(const char *key, const char *val) {\n\ttry {\n\t\treturn LexerBase::PropertySet(key, val);\n\t} catch (...) {\n\t\t// Should not throw into caller as may be compiled with different compiler or options\n\t}\n\treturn -1;\n}\n\nint SCI_METHOD LexerNoExceptions::WordListSet(int n, const char *wl) {\n\ttry {\n\t\treturn LexerBase::WordListSet(n, wl);\n\t} catch (...) {\n\t\t// Should not throw into caller as may be compiled with different compiler or options\n\t}\n\treturn -1;\n}\n\nvoid SCI_METHOD LexerNoExceptions::Lex(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n\ttry {\n\t\tAccessor astyler(pAccess, &props);\n\t\tLexer(startPos, length, initStyle, pAccess, astyler);\n\t\tastyler.Flush();\n\t} catch (...) {\n\t\t// Should not throw into caller as may be compiled with different compiler or options\n\t\tpAccess->SetErrorStatus(SC_STATUS_FAILURE);\n\t}\n}\nvoid SCI_METHOD LexerNoExceptions::Fold(unsigned int startPos, int length, int initStyle, IDocument *pAccess) {\n\ttry {\n\t\tAccessor astyler(pAccess, &props);\n\t\tFolder(startPos, length, initStyle, pAccess, astyler);\n\t\tastyler.Flush();\n\t} catch (...) {\n\t\t// Should not throw into caller as may be compiled with different compiler or options\n\t\tpAccess->SetErrorStatus(SC_STATUS_FAILURE);\n\t}\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/LexerNoExceptions.h",
    "content": "// Scintilla source code edit control\n/** @file LexerNoExceptions.h\n ** A simple lexer with no state.\n **/\n// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef LEXERNOEXCEPTIONS_H\n#define LEXERNOEXCEPTIONS_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n// A simple lexer with no state\nclass LexerNoExceptions : public LexerBase {\npublic:\n\t// TODO Also need to prevent exceptions in constructor and destructor\n\tint SCI_METHOD PropertySet(const char *key, const char *val);\n\tint SCI_METHOD WordListSet(int n, const char *wl);\n\tvoid SCI_METHOD Lex(unsigned int startPos, int lengthDoc, int initStyle, IDocument *pAccess);\n\tvoid SCI_METHOD Fold(unsigned int startPos, int lengthDoc, int initStyle, IDocument *);\n\n\tvirtual void Lexer(unsigned int startPos, int length, int initStyle, IDocument *pAccess, Accessor &styler) = 0;\n\tvirtual void Folder(unsigned int startPos, int length, int initStyle, IDocument *pAccess, Accessor &styler) = 0;\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/LexerSimple.cpp",
    "content": "// Scintilla source code edit control\n/** @file LexerSimple.cxx\n ** A simple lexer with no state.\n **/\n// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#include <string>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"PropSetSimple.h\"\n#include \"WordList.h\"\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"LexerModule.h\"\n#include \"LexerBase.h\"\n#include \"LexerSimple.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nLexerSimple::LexerSimple(const LexerModule *module_) : module(module_) {\n\tfor (int wl = 0; wl < module->GetNumWordLists(); wl++) {\n\t\tif (!wordLists.empty())\n\t\t\twordLists += \"\\n\";\n\t\twordLists += module->GetWordListDescription(wl);\n\t}\n}\n\nconst char * SCI_METHOD LexerSimple::DescribeWordListSets() {\n\treturn wordLists.c_str();\n}\n\nvoid SCI_METHOD LexerSimple::Lex(unsigned int startPos, int lengthDoc, int initStyle, IDocument *pAccess) {\n\tAccessor astyler(pAccess, &props);\n\tmodule->Lex(startPos, lengthDoc, initStyle, keyWordLists, astyler);\n\tastyler.Flush();\n}\n\nvoid SCI_METHOD LexerSimple::Fold(unsigned int startPos, int lengthDoc, int initStyle, IDocument *pAccess) {\n\tif (props.GetInt(\"fold\")) {\n\t\tAccessor astyler(pAccess, &props);\n\t\tmodule->Fold(startPos, lengthDoc, initStyle, keyWordLists, astyler);\n\t\tastyler.Flush();\n\t}\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/LexerSimple.h",
    "content": "// Scintilla source code edit control\n/** @file LexerSimple.h\n ** A simple lexer with no state.\n **/\n// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef LEXERSIMPLE_H\n#define LEXERSIMPLE_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n// A simple lexer with no state\nclass LexerSimple : public LexerBase {\n\tconst LexerModule *module;\n\tstd::string wordLists;\npublic:\n\tLexerSimple(const LexerModule *module_);\n\tconst char * SCI_METHOD DescribeWordListSets();\n\tvoid SCI_METHOD Lex(unsigned int startPos, int lengthDoc, int initStyle, IDocument *pAccess);\n\tvoid SCI_METHOD Fold(unsigned int startPos, int lengthDoc, int initStyle, IDocument *pAccess);\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/License.txt",
    "content": "License for Scintilla and SciTE\n\nCopyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n\nAll Rights Reserved \n\nPermission to use, copy, modify, and distribute this software and its \ndocumentation for any purpose and without fee is hereby granted, \nprovided that the above copyright notice appear in all copies and that \nboth that copyright notice and this permission notice appear in \nsupporting documentation. \n\nNEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS \nSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY \nAND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY \nSPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES \nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, \nWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER \nTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE \nOR PERFORMANCE OF THIS SOFTWARE. "
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/OptionSet.h",
    "content": "// Scintilla source code edit control\n/** @file OptionSet.h\n ** Manage descriptive information about an options struct for a lexer.\n ** Hold the names, positions, and descriptions of boolean, integer and string options and\n ** allow setting options and retrieving metadata about the options.\n **/\n// Copyright 2010 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef OPTIONSET_H\n#define OPTIONSET_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\ntemplate <typename T>\nclass OptionSet {\n\ttypedef T Target;\n\ttypedef bool T::*plcob;\n\ttypedef int T::*plcoi;\n\ttypedef std::string T::*plcos;\n\tstruct Option {\n\t\tint opType;\n\t\tunion {\n\t\t\tplcob pb;\n\t\t\tplcoi pi;\n\t\t\tplcos ps;\n\t\t};\n\t\tstd::string description;\n\t\tOption() :\n\t\t\topType(SC_TYPE_BOOLEAN), pb(0), description(\"\") {\n\t\t}\n\t\tOption(plcob pb_, std::string description_=\"\") :\n\t\t\topType(SC_TYPE_BOOLEAN), pb(pb_), description(description_) {\n\t\t}\n\t\tOption(plcoi pi_, std::string description_) :\n\t\t\topType(SC_TYPE_INTEGER), pi(pi_), description(description_) {\n\t\t}\n\t\tOption(plcos ps_, std::string description_) :\n\t\t\topType(SC_TYPE_STRING), ps(ps_), description(description_) {\n\t\t}\n\t\tbool Set(T *base, const char *val) const {\n\t\t\tswitch (opType) {\n\t\t\tcase SC_TYPE_BOOLEAN: {\n\t\t\t\t\tbool option = atoi(val) != 0;\n\t\t\t\t\tif ((*base).*pb != option) {\n\t\t\t\t\t\t(*base).*pb = option;\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\tcase SC_TYPE_INTEGER: {\n\t\t\t\t\tint option = atoi(val);\n\t\t\t\t\tif ((*base).*pi != option) {\n\t\t\t\t\t\t(*base).*pi = option;\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\tcase SC_TYPE_STRING: {\n\t\t\t\t\tif ((*base).*ps != val) {\n\t\t\t\t\t\t(*base).*ps = val;\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t};\n\ttypedef std::map<std::string, Option> OptionMap;\n\tOptionMap nameToDef;\n\tstd::string names;\n\tstd::string wordLists;\n\n\tvoid AppendName(const char *name) {\n\t\tif (!names.empty())\n\t\t\tnames += \"\\n\";\n\t\tnames += name;\n\t}\npublic:\n\tvirtual ~OptionSet() {\n\t}\n\tvoid DefineProperty(const char *name, plcob pb, std::string description=\"\") {\n\t\tnameToDef[name] = Option(pb, description);\n\t\tAppendName(name);\n\t}\n\tvoid DefineProperty(const char *name, plcoi pi, std::string description=\"\") {\n\t\tnameToDef[name] = Option(pi, description);\n\t\tAppendName(name);\n\t}\n\tvoid DefineProperty(const char *name, plcos ps, std::string description=\"\") {\n\t\tnameToDef[name] = Option(ps, description);\n\t\tAppendName(name);\n\t}\n\tconst char *PropertyNames() const {\n\t\treturn names.c_str();\n\t}\n\tint PropertyType(const char *name) {\n\t\ttypename OptionMap::iterator it = nameToDef.find(name);\n\t\tif (it != nameToDef.end()) {\n\t\t\treturn it->second.opType;\n\t\t}\n\t\treturn SC_TYPE_BOOLEAN;\n\t}\n\tconst char *DescribeProperty(const char *name) {\n\t\ttypename OptionMap::iterator it = nameToDef.find(name);\n\t\tif (it != nameToDef.end()) {\n\t\t\treturn it->second.description.c_str();\n\t\t}\n\t\treturn \"\";\n\t}\n\n\tbool PropertySet(T *base, const char *name, const char *val) {\n\t\ttypename OptionMap::iterator it = nameToDef.find(name);\n\t\tif (it != nameToDef.end()) {\n\t\t\treturn it->second.Set(base, val);\n\t\t}\n\t\treturn false;\n\t}\n\n\tvoid DefineWordListSets(const char * const wordListDescriptions[]) {\n\t\tif (wordListDescriptions) {\n\t\t\tfor (size_t wl = 0; wordListDescriptions[wl]; wl++) {\n\t\t\t\tif (!wordLists.empty())\n\t\t\t\t\twordLists += \"\\n\";\n\t\t\t\twordLists += wordListDescriptions[wl];\n\t\t\t}\n\t\t}\n\t}\n\n\tconst char *DescribeWordListSets() const {\n\t\treturn wordLists.c_str();\n\t}\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/PropSetSimple.cpp",
    "content": "// SciTE - Scintilla based Text Editor\n/** @file PropSetSimple.cxx\n ** A Java style properties file module.\n **/\n// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n// Maintain a dictionary of properties\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n\n#ifdef _MSC_VER\n// Visual C++ doesn't like unreachable code in its own headers.\n#pragma warning(disable: 4018 4100 4245 4511 4512 4663 4702)\n#endif\n\n#include <string>\n#include <map>\n\n#include \"PropSetSimple.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\ntypedef std::map<std::string, std::string> mapss;\n\nPropSetSimple::PropSetSimple() {\n\tmapss *props = new mapss;\n\timpl = static_cast<void *>(props);\n}\n\nPropSetSimple::~PropSetSimple() {\n\tmapss *props = static_cast<mapss *>(impl);\n\tdelete props;\n\timpl = 0;\n}\n\nvoid PropSetSimple::Set(const char *key, const char *val, int lenKey, int lenVal) {\n\tmapss *props = static_cast<mapss *>(impl);\n\tif (!*key)\t// Empty keys are not supported\n\t\treturn;\n\tif (lenKey == -1)\n\t\tlenKey = static_cast<int>(strlen(key));\n\tif (lenVal == -1)\n\t\tlenVal = static_cast<int>(strlen(val));\n\t(*props)[std::string(key, lenKey)] = std::string(val, lenVal);\n}\n\nstatic bool IsASpaceCharacter(unsigned int ch) {\n    return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));\n}\n\nvoid PropSetSimple::Set(const char *keyVal) {\n\twhile (IsASpaceCharacter(*keyVal))\n\t\tkeyVal++;\n\tconst char *endVal = keyVal;\n\twhile (*endVal && (*endVal != '\\n'))\n\t\tendVal++;\n\tconst char *eqAt = strchr(keyVal, '=');\n\tif (eqAt) {\n\t\tSet(keyVal, eqAt + 1, static_cast<int>(eqAt-keyVal), \n\t\t\tstatic_cast<int>(endVal - eqAt - 1));\n\t} else if (*keyVal) {\t// No '=' so assume '=1'\n\t\tSet(keyVal, \"1\", static_cast<int>(endVal-keyVal), 1);\n\t}\n}\n\nvoid PropSetSimple::SetMultiple(const char *s) {\n\tconst char *eol = strchr(s, '\\n');\n\twhile (eol) {\n\t\tSet(s);\n\t\ts = eol + 1;\n\t\teol = strchr(s, '\\n');\n\t}\n\tSet(s);\n}\n\nconst char *PropSetSimple::Get(const char *key) const {\n\tmapss *props = static_cast<mapss *>(impl);\n\tmapss::const_iterator keyPos = props->find(std::string(key));\n\tif (keyPos != props->end()) {\n\t\treturn keyPos->second.c_str();\n\t} else {\n\t\treturn \"\";\n\t}\n}\n\n// There is some inconsistency between GetExpanded(\"foo\") and Expand(\"$(foo)\").\n// A solution is to keep a stack of variables that have been expanded, so that\n// recursive expansions can be skipped.  For now I'll just use the C++ stack\n// for that, through a recursive function and a simple chain of pointers.\n\nstruct VarChain {\n\tVarChain(const char *var_=NULL, const VarChain *link_=NULL): var(var_), link(link_) {}\n\n\tbool contains(const char *testVar) const {\n\t\treturn (var && (0 == strcmp(var, testVar)))\n\t\t\t|| (link && link->contains(testVar));\n\t}\n\n\tconst char *var;\n\tconst VarChain *link;\n};\n\nstatic int ExpandAllInPlace(const PropSetSimple &props, std::string &withVars, int maxExpands, const VarChain &blankVars) {\n\tsize_t varStart = withVars.find(\"$(\");\n\twhile ((varStart != std::string::npos) && (maxExpands > 0)) {\n\t\tsize_t varEnd = withVars.find(\")\", varStart+2);\n\t\tif (varEnd == std::string::npos) {\n\t\t\tbreak;\n\t\t}\n\n\t\t// For consistency, when we see '$(ab$(cde))', expand the inner variable first,\n\t\t// regardless whether there is actually a degenerate variable named 'ab$(cde'.\n\t\tsize_t innerVarStart = withVars.find(\"$(\", varStart+2);\n\t\twhile ((innerVarStart != std::string::npos) && (innerVarStart > varStart) && (innerVarStart < varEnd)) {\n\t\t\tvarStart = innerVarStart;\n\t\t\tinnerVarStart = withVars.find(\"$(\", varStart+2);\n\t\t}\n\n\t\tstd::string var(withVars.c_str(), varStart + 2, varEnd - varStart - 2);\n\t\tstd::string val = props.Get(var.c_str());\n\n\t\tif (blankVars.contains(var.c_str())) {\n\t\t\tval = \"\"; // treat blankVar as an empty string (e.g. to block self-reference)\n\t\t}\n\n\t\tif (--maxExpands >= 0) {\n\t\t\tmaxExpands = ExpandAllInPlace(props, val, maxExpands, VarChain(var.c_str(), &blankVars));\n\t\t}\n\n\t\twithVars.erase(varStart, varEnd-varStart+1);\n\t\twithVars.insert(varStart, val.c_str(), val.length());\n\n\t\tvarStart = withVars.find(\"$(\");\n\t}\n\n\treturn maxExpands;\n}\n\nint PropSetSimple::GetExpanded(const char *key, char *result) const {\n\tstd::string val = Get(key);\n\tExpandAllInPlace(*this, val, 100, VarChain(key));\n\tconst int n = static_cast<int>(val.size());\n\tif (result) {\n\t\tstrcpy(result, val.c_str());\n\t}\n\treturn n;\t// Not including NUL\n}\n\nint PropSetSimple::GetInt(const char *key, int defaultValue) const {\n\tstd::string val = Get(key);\n\tExpandAllInPlace(*this, val, 100, VarChain(key));\n\tif (!val.empty()) {\n\t\treturn atoi(val.c_str());\n\t}\n\treturn defaultValue;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/PropSetSimple.h",
    "content": "// Scintilla source code edit control\n/** @file PropSetSimple.h\n ** A basic string to string map.\n **/\n// Copyright 1998-2009 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef PROPSETSIMPLE_H\n#define PROPSETSIMPLE_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nclass PropSetSimple {\n\tvoid *impl;\n\tvoid Set(const char *keyVal);\npublic:\n\tPropSetSimple();\n\tvirtual ~PropSetSimple();\n\tvoid Set(const char *key, const char *val, int lenKey=-1, int lenVal=-1);\n\tvoid SetMultiple(const char *);\n\tconst char *Get(const char *key) const;\n\tint GetExpanded(const char *key, char *result) const;\n\tint GetInt(const char *key, int defaultValue=0) const;\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/SparseState.h",
    "content": "// Scintilla source code edit control\n/** @file SparseState.h\n ** Hold lexer state that may change rarely.\n ** This is often per-line state such as whether a particular type of section has been entered.\n ** A state continues until it is changed.\n **/\n// Copyright 2011 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef SPARSESTATE_H\n#define SPARSESTATE_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\ntemplate <typename T>\nclass SparseState {\n\tstruct State {\n\t\tint position;\n\t\tT value;\n\t\tState(int position_, T value_) : position(position_), value(value_) {\n\t\t}\n\t\tinline bool operator<(const State &other) const {\n\t\t\treturn position < other.position;\n\t\t}\n\t\tinline bool operator==(const State &other) const {\n\t\t\treturn (position == other.position) && (value == other.value);\n\t\t}\n\t};\n\tint positionFirst;\n\ttypedef std::vector<State> stateVector;\n\tstateVector states;\n\n\ttypename stateVector::iterator Find(int position) {\n\t\tState searchValue(position, T());\n\t\treturn std::lower_bound(states.begin(), states.end(), searchValue);\n\t}\n\npublic:\n\tSparseState(int positionFirst_=-1) {\n\t\tpositionFirst = positionFirst_;\n\t}\n\tvoid Set(int position, T value) {\n\t\tDelete(position);\n\t\tif (states.empty() || (value != states[states.size()-1].value)) {\n\t\t\tstates.push_back(State(position, value));\n\t\t}\n\t}\n\tT ValueAt(int position) {\n\t\tif (states.empty())\n\t\t\treturn T();\n\t\tif (position < states[0].position)\n\t\t\treturn T();\n\t\ttypename stateVector::iterator low = Find(position);\n\t\tif (low == states.end()) {\n\t\t\treturn states[states.size()-1].value;\n\t\t} else {\n\t\t\tif (low->position > position) {\n\t\t\t\t--low;\n\t\t\t}\n\t\t\treturn low->value;\n\t\t}\n\t}\n\tbool Delete(int position) {\n\t\ttypename stateVector::iterator low = Find(position);\n\t\tif (low != states.end()) {\n\t\t\tstates.erase(low, states.end());\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tsize_t size() const {\n\t\treturn states.size();\n\t}\n\n\t// Returns true if Merge caused a significant change\n\tbool Merge(const SparseState<T> &other, int ignoreAfter) {\n\t\t// Changes caused beyond ignoreAfter are not significant\n\t\tDelete(ignoreAfter+1);\n\n\t\tbool different = true;\n\t\tbool changed = false;\n\t\ttypename stateVector::iterator low = Find(other.positionFirst);\n\t\tif (static_cast<size_t>(states.end() - low) == other.states.size()) {\n\t\t\t// Same number in other as after positionFirst in this\n\t\t\tdifferent = !std::equal(low, states.end(), other.states.begin());\n\t\t}\n\t\tif (different) {\n\t\t\tif (low != states.end()) {\n\t\t\t\tstates.erase(low, states.end());\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t\ttypename stateVector::const_iterator startOther = other.states.begin();\n\t\t\tif (!states.empty() && !other.states.empty() && states.back().value == startOther->value)\n\t\t\t\t++startOther;\n\t\t\tif (startOther != other.states.end()) {\n\t\t\t\tstates.insert(states.end(), startOther, other.states.end());\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\t\treturn changed;\n\t}\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/StyleContext.cpp",
    "content": "// Scintilla source code edit control\n/** @file StyleContext.cxx\n ** Lexer infrastructure.\n **/\n// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>\n// This file is in the public domain.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <assert.h>\n\n#include \"ILexer.h\"\n\n#include \"LexAccessor.h\"\n#include \"Accessor.h\"\n#include \"StyleContext.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic void getRange(unsigned int start,\n\t\tunsigned int end,\n\t\tLexAccessor &styler,\n\t\tchar *s,\n\t\tunsigned int len) {\n\tunsigned int i = 0;\n\twhile ((i < end - start + 1) && (i < len-1)) {\n\t\ts[i] = styler[start + i];\n\t\ti++;\n\t}\n\ts[i] = '\\0';\n}\n\nvoid StyleContext::GetCurrent(char *s, unsigned int len) {\n\tgetRange(styler.GetStartSegment(), currentPos - 1, styler, s, len);\n}\n\nstatic void getRangeLowered(unsigned int start,\n\t\tunsigned int end,\n\t\tLexAccessor &styler,\n\t\tchar *s,\n\t\tunsigned int len) {\n\tunsigned int i = 0;\n\twhile ((i < end - start + 1) && (i < len-1)) {\n\t\ts[i] = static_cast<char>(tolower(styler[start + i]));\n\t\ti++;\n\t}\n\ts[i] = '\\0';\n}\n\nvoid StyleContext::GetCurrentLowered(char *s, unsigned int len) {\n\tgetRangeLowered(styler.GetStartSegment(), currentPos - 1, styler, s, len);\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/StyleContext.h",
    "content": "// Scintilla source code edit control\n/** @file StyleContext.h\n ** Lexer infrastructure.\n **/\n// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>\n// This file is in the public domain.\n\n#ifndef STYLECONTEXT_H\n#define STYLECONTEXT_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nstatic inline int MakeLowerCase(int ch) {\n\tif (ch < 'A' || ch > 'Z')\n\t\treturn ch;\n\telse\n\t\treturn ch - 'A' + 'a';\n}\n\n// All languages handled so far can treat all characters >= 0x80 as one class\n// which just continues the current token or starts an identifier if in default.\n// DBCS treated specially as the second character can be < 0x80 and hence\n// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80\nclass StyleContext {\n\tLexAccessor &styler;\n\tIDocumentWithLineEnd *multiByteAccess;\n\tunsigned int endPos;\n\tunsigned int lengthDocument;\n\t\n\t// Used for optimizing GetRelativeCharacter\n\tunsigned int posRelative;\n\tunsigned int currentPosLastRelative;\n\tint offsetRelative;\n\n\tStyleContext &operator=(const StyleContext &);\n\n\tvoid GetNextChar() {\n\t\tif (multiByteAccess) {\n\t\t\tchNext = multiByteAccess->GetCharacterAndWidth(currentPos+width, &widthNext);\n\t\t} else {\n\t\t\tchNext = static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+width, 0));\n\t\t\twidthNext = 1;\n\t\t}\n\t\t// End of line determined from line end position, allowing CR, LF, \n\t\t// CRLF and Unicode line ends as set by document.\n\t\tif (currentLine < lineDocEnd)\n\t\t\tatLineEnd = static_cast<int>(currentPos) >= (lineStartNext-1);\n\t\telse // Last line\n\t\t\tatLineEnd = static_cast<int>(currentPos) >= lineStartNext;\n\t}\n\npublic:\n\tunsigned int currentPos;\n\tint currentLine;\n\tint lineDocEnd;\n\tint lineStartNext;\n\tbool atLineStart;\n\tbool atLineEnd;\n\tint state;\n\tint chPrev;\n\tint ch;\n\tint width;\n\tint chNext;\n\tint widthNext;\n\n\tStyleContext(unsigned int startPos, unsigned int length,\n                        int initStyle, LexAccessor &styler_, char chMask=31) :\n\t\tstyler(styler_),\n\t\tmultiByteAccess(0),\n\t\tendPos(startPos + length),\n\t\tposRelative(0),\n\t\tcurrentPosLastRelative(0x7FFFFFFF),\n\t\toffsetRelative(0),\n\t\tcurrentPos(startPos),\n\t\tcurrentLine(-1),\n\t\tlineStartNext(-1),\n\t\tatLineEnd(false),\n\t\tstate(initStyle & chMask), // Mask off all bits which aren't in the chMask.\n\t\tchPrev(0),\n\t\tch(0),\n\t\twidth(0),\n\t\tchNext(0),\n\t\twidthNext(1) {\n\t\tif (styler.Encoding() != enc8bit) {\n\t\t\tmultiByteAccess = styler.MultiByteAccess();\n\t\t}\n\t\tstyler.StartAt(startPos, chMask);\n\t\tstyler.StartSegment(startPos);\n\t\tcurrentLine = styler.GetLine(startPos);\n\t\tlineStartNext = styler.LineStart(currentLine+1);\n\t\tlengthDocument = static_cast<unsigned int>(styler.Length());\n\t\tif (endPos == lengthDocument)\n\t\t\tendPos++;\n\t\tlineDocEnd = styler.GetLine(lengthDocument);\n\t\tatLineStart = static_cast<unsigned int>(styler.LineStart(currentLine)) == startPos;\n\n\t\t// Variable width is now 0 so GetNextChar gets the char at currentPos into chNext/widthNext\n\t\twidth = 0;\n\t\tGetNextChar();\n\t\tch = chNext;\n\t\twidth = widthNext;\n\n\t\tGetNextChar();\n\t}\n\tvoid Complete() {\n\t\tstyler.ColourTo(currentPos - ((currentPos > lengthDocument) ? 2 : 1), state);\n\t\tstyler.Flush();\n\t}\n\tbool More() const {\n\t\treturn currentPos < endPos;\n\t}\n\tvoid Forward() {\n\t\tif (currentPos < endPos) {\n\t\t\tatLineStart = atLineEnd;\n\t\t\tif (atLineStart) {\n\t\t\t\tcurrentLine++;\n\t\t\t\tlineStartNext = styler.LineStart(currentLine+1);\n\t\t\t}\n\t\t\tchPrev = ch;\n\t\t\tcurrentPos += width;\n\t\t\tch = chNext;\n\t\t\twidth = widthNext;\n\t\t\tGetNextChar();\n\t\t} else {\n\t\t\tatLineStart = false;\n\t\t\tchPrev = ' ';\n\t\t\tch = ' ';\n\t\t\tchNext = ' ';\n\t\t\tatLineEnd = true;\n\t\t}\n\t}\n\tvoid Forward(int nb) {\n\t\tfor (int i = 0; i < nb; i++) {\n\t\t\tForward();\n\t\t}\n\t}\n\tvoid ForwardBytes(int nb) {\n\t\tsize_t forwardPos = currentPos + nb;\n\t\twhile (forwardPos > currentPos) {\n\t\t\tForward();\n\t\t}\n\t}\n\tvoid ChangeState(int state_) {\n\t\tstate = state_;\n\t}\n\tvoid SetState(int state_) {\n\t\tstyler.ColourTo(currentPos - ((currentPos > lengthDocument) ? 2 : 1), state);\n\t\tstate = state_;\n\t}\n\tvoid ForwardSetState(int state_) {\n\t\tForward();\n\t\tstyler.ColourTo(currentPos - ((currentPos > lengthDocument) ? 2 : 1), state);\n\t\tstate = state_;\n\t}\n\tint LengthCurrent() const {\n\t\treturn currentPos - styler.GetStartSegment();\n\t}\n\tint GetRelative(int n) {\n\t\treturn static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+n, 0));\n\t}\n\tint GetRelativeCharacter(int n) {\n\t\tif (n == 0)\n\t\t\treturn ch;\n\t\tif (multiByteAccess) {\n\t\t\tif ((currentPosLastRelative != currentPos) ||\n\t\t\t\t((n > 0) && ((offsetRelative < 0) || (n < offsetRelative))) ||\n\t\t\t\t((n < 0) && ((offsetRelative > 0) || (n > offsetRelative)))) {\n\t\t\t\tposRelative = currentPos;\n\t\t\t\toffsetRelative = 0;\n\t\t\t}\n\t\t\tint diffRelative = n - offsetRelative;\n\t\t\tint posNew = multiByteAccess->GetRelativePosition(posRelative, diffRelative);\n\t\t\tint chReturn = multiByteAccess->GetCharacterAndWidth(posNew, 0);\n\t\t\tposRelative = posNew;\n\t\t\tcurrentPosLastRelative = currentPos;\n\t\t\toffsetRelative = n;\n\t\t\treturn chReturn;\n\t\t} else {\n\t\t\t// fast version for single byte encodings\n\t\t\treturn static_cast<unsigned char>(styler.SafeGetCharAt(currentPos + n, 0));\n\t\t}\n\t}\n\tbool Match(char ch0) const {\n\t\treturn ch == static_cast<unsigned char>(ch0);\n\t}\n\tbool Match(char ch0, char ch1) const {\n\t\treturn (ch == static_cast<unsigned char>(ch0)) && (chNext == static_cast<unsigned char>(ch1));\n\t}\n\tbool Match(const char *s) {\n\t\tif (ch != static_cast<unsigned char>(*s))\n\t\t\treturn false;\n\t\ts++;\n\t\tif (!*s)\n\t\t\treturn true;\n\t\tif (chNext != static_cast<unsigned char>(*s))\n\t\t\treturn false;\n\t\ts++;\n\t\tfor (int n=2; *s; n++) {\n\t\t\tif (*s != styler.SafeGetCharAt(currentPos+n, 0))\n\t\t\t\treturn false;\n\t\t\ts++;\n\t\t}\n\t\treturn true;\n\t}\n\tbool MatchIgnoreCase(const char *s) {\n\t\tif (MakeLowerCase(ch) != static_cast<unsigned char>(*s))\n\t\t\treturn false;\n\t\ts++;\n\t\tif (MakeLowerCase(chNext) != static_cast<unsigned char>(*s))\n\t\t\treturn false;\n\t\ts++;\n\t\tfor (int n=2; *s; n++) {\n\t\t\tif (static_cast<unsigned char>(*s) !=\n\t\t\t\tMakeLowerCase(static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+n, 0))))\n\t\t\t\treturn false;\n\t\t\ts++;\n\t\t}\n\t\treturn true;\n\t}\n\t// Non-inline\n\tvoid GetCurrent(char *s, unsigned int len);\n\tvoid GetCurrentLowered(char *s, unsigned int len);\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/SubStyles.h",
    "content": "// Scintilla source code edit control\n/** @file SubStyles.h\n ** Manage substyles for a lexer.\n **/\n// Copyright 2012 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef SUBSTYLES_H\n#define SUBSTYLES_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nclass WordClassifier {\n\tint baseStyle;\n\tint firstStyle;\n\tint lenStyles;\n\tstd::map<std::string, int> wordToStyle;\n\npublic:\n\n\tWordClassifier(int baseStyle_) : baseStyle(baseStyle_), firstStyle(0), lenStyles(0) {\n\t}\n\n\tvoid Allocate(int firstStyle_, int lenStyles_) {\n\t\tfirstStyle = firstStyle_;\n\t\tlenStyles = lenStyles_;\n\t\twordToStyle.clear();\n\t}\n\n\tint Base() const {\n\t\treturn baseStyle;\n\t}\n\n\tint Start() const {\n\t\treturn firstStyle;\n\t}\n\n\tint Length() const {\n\t\treturn lenStyles;\n\t}\n\n\tvoid Clear() {\n\t\tfirstStyle = 0;\n\t\tlenStyles = 0;\n\t\twordToStyle.clear();\n\t}\n\n\tint ValueFor(const std::string &s) const {\n\t\tstd::map<std::string, int>::const_iterator it = wordToStyle.find(s);\n\t\tif (it != wordToStyle.end())\n\t\t\treturn it->second;\n\t\telse\n\t\t\treturn -1;\n\t}\n\n\tbool IncludesStyle(int style) const {\n\t\treturn (style >= firstStyle) && (style < (firstStyle + lenStyles));\n\t}\n\n\tvoid SetIdentifiers(int style, const char *identifiers) {\n\t\twhile (*identifiers) {\n\t\t\tconst char *cpSpace = identifiers;\n\t\t\twhile (*cpSpace && !(*cpSpace == ' ' || *cpSpace == '\\t' || *cpSpace == '\\r' || *cpSpace == '\\n'))\n\t\t\t\tcpSpace++;\n\t\t\tif (cpSpace > identifiers) {\n\t\t\t\tstd::string word(identifiers, cpSpace - identifiers);\n\t\t\t\twordToStyle[word] = style;\n\t\t\t}\n\t\t\tidentifiers = cpSpace;\n\t\t\tif (*identifiers)\n\t\t\t\tidentifiers++;\n\t\t}\n\t}\n};\n\nclass SubStyles {\n\tint classifications;\n\tconst char *baseStyles;\n\tint styleFirst;\n\tint stylesAvailable;\n\tint secondaryDistance;\n\tint allocated;\n\tstd::vector<WordClassifier> classifiers;\n\n\tint BlockFromBaseStyle(int baseStyle) const {\n\t\tfor (int b=0; b < classifications; b++) {\n\t\t\tif (baseStyle == baseStyles[b])\n\t\t\t\treturn b;\n\t\t}\n\t\treturn -1;\n\t}\n\n\tint BlockFromStyle(int style) const {\n\t\tint b = 0;\n\t\tfor (std::vector<WordClassifier>::const_iterator it=classifiers.begin(); it != classifiers.end(); ++it) {\n\t\t\tif (it->IncludesStyle(style))\n\t\t\t\treturn b;\n\t\t\tb++;\n\t\t}\n\t\treturn -1;\n\t}\n\npublic:\n\n\tSubStyles(const char *baseStyles_, int styleFirst_, int stylesAvailable_, int secondaryDistance_) :\n\t\tclassifications(0),\n\t\tbaseStyles(baseStyles_),\n\t\tstyleFirst(styleFirst_),\n\t\tstylesAvailable(stylesAvailable_),\n\t\tsecondaryDistance(secondaryDistance_),\n\t\tallocated(0) {\n\t\twhile (baseStyles[classifications]) {\n\t\t\tclassifiers.push_back(WordClassifier(baseStyles[classifications]));\n\t\t\tclassifications++;\n\t\t}\n\t}\n\n\tint Allocate(int styleBase, int numberStyles) {\n\t\tint block = BlockFromBaseStyle(styleBase);\n\t\tif (block >= 0) {\n\t\t\tif ((allocated + numberStyles) > stylesAvailable)\n\t\t\t\treturn -1;\n\t\t\tint startBlock = styleFirst + allocated;\n\t\t\tallocated += numberStyles;\n\t\t\tclassifiers[block].Allocate(startBlock, numberStyles);\n\t\t\treturn startBlock;\n\t\t} else {\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\tint Start(int styleBase) {\n\t\tint block = BlockFromBaseStyle(styleBase);\n\t\treturn (block >= 0) ? classifiers[block].Start() : -1;\n\t}\n\n\tint Length(int styleBase) {\n\t\tint block = BlockFromBaseStyle(styleBase);\n\t\treturn (block >= 0) ? classifiers[block].Length() : 0;\n\t}\n\n\tint BaseStyle(int subStyle) const {\n\t\tint block = BlockFromStyle(subStyle);\n\t\tif (block >= 0)\n\t\t\treturn classifiers[block].Base();\n\t\telse\n\t\t\treturn subStyle;\n\t}\n\n\tint DistanceToSecondaryStyles() const {\n\t\treturn secondaryDistance;\n\t}\n\n\tvoid SetIdentifiers(int style, const char *identifiers) {\n\t\tint block = BlockFromStyle(style);\n\t\tif (block >= 0)\n\t\t\tclassifiers[block].SetIdentifiers(style, identifiers);\n\t}\n\n\tvoid Free() {\n\t\tallocated = 0;\n\t\tfor (std::vector<WordClassifier>::iterator it=classifiers.begin(); it != classifiers.end(); ++it)\n\t\t\tit->Clear();\n\t}\n\n\tconst WordClassifier &Classifier(int baseStyle) const {\n\t\treturn classifiers[BlockFromBaseStyle(baseStyle)];\n\t}\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/WordList.cpp",
    "content": "// Scintilla source code edit control\n/** @file KeyWords.cxx\n ** Colourise for particular languages.\n **/\n// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <stdarg.h>\n\n#include <algorithm>\n\n#include \"WordList.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n/**\n * Creates an array that points into each word in the string and puts \\0 terminators\n * after each word.\n */\nstatic char **ArrayFromWordList(char *wordlist, int *len, bool onlyLineEnds = false) {\n\tint prev = '\\n';\n\tint words = 0;\n\t// For rapid determination of whether a character is a separator, build\n\t// a look up table.\n\tbool wordSeparator[256];\n\tfor (int i=0; i<256; i++) {\n\t\twordSeparator[i] = false;\n\t}\n\twordSeparator[static_cast<unsigned int>('\\r')] = true;\n\twordSeparator[static_cast<unsigned int>('\\n')] = true;\n\tif (!onlyLineEnds) {\n\t\twordSeparator[static_cast<unsigned int>(' ')] = true;\n\t\twordSeparator[static_cast<unsigned int>('\\t')] = true;\n\t}\n\tfor (int j = 0; wordlist[j]; j++) {\n\t\tint curr = static_cast<unsigned char>(wordlist[j]);\n\t\tif (!wordSeparator[curr] && wordSeparator[prev])\n\t\t\twords++;\n\t\tprev = curr;\n\t}\n\tchar **keywords = new char *[words + 1];\n\tint wordsStore = 0;\n\tconst size_t slen = strlen(wordlist);\n\tif (words) {\n\t\tprev = '\\0';\n\t\tfor (size_t k = 0; k < slen; k++) {\n\t\t\tif (!wordSeparator[static_cast<unsigned char>(wordlist[k])]) {\n\t\t\t\tif (!prev) {\n\t\t\t\t\tkeywords[wordsStore] = &wordlist[k];\n\t\t\t\t\twordsStore++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twordlist[k] = '\\0';\n\t\t\t}\n\t\t\tprev = wordlist[k];\n\t\t}\n\t}\n\tkeywords[wordsStore] = &wordlist[slen];\n\t*len = wordsStore;\n\treturn keywords;\n}\n\nWordList::WordList(bool onlyLineEnds_) :\n\twords(0), list(0), len(0), onlyLineEnds(onlyLineEnds_) {\n}\n\nWordList::~WordList() { \n\tClear();\n}\n\nWordList::operator bool() const {\n\treturn len ? true : false;\n}\n\nbool WordList::operator!=(const WordList &other) const {\n\tif (len != other.len)\n\t\treturn true;\n\tfor (int i=0; i<len; i++) {\n\t\tif (strcmp(words[i], other.words[i]) != 0)\n\t\t\treturn true;\n\t}\n\treturn false;\n}\n\nint WordList::Length() const {\n\treturn len;\n}\n\nvoid WordList::Clear() {\n\tif (words) {\n\t\tdelete []list;\n\t\tdelete []words;\n\t}\n\twords = 0;\n\tlist = 0;\n\tlen = 0;\n}\n\n#ifdef _MSC_VER\n\nstatic bool cmpWords(const char *a, const char *b) {\n\treturn strcmp(a, b) < 0;\n}\n\n#else\n\nstatic int cmpWords(const void *a, const void *b) {\n\treturn strcmp(*static_cast<const char * const *>(a), *static_cast<const char * const *>(b));\n}\n\nstatic void SortWordList(char **words, unsigned int len) {\n\tqsort(reinterpret_cast<void *>(words), len, sizeof(*words), cmpWords);\n}\n\n#endif\n\nvoid WordList::Set(const char *s) {\n\tClear();\n\tlist = new char[strlen(s) + 1];\n\tstrcpy(list, s);\n\twords = ArrayFromWordList(list, &len, onlyLineEnds);\n#ifdef _MSC_VER\n\tstd::sort(words, words + len, cmpWords);\n#else\n\tSortWordList(words, len);\n#endif\n\tfor (unsigned int k = 0; k < (sizeof(starts) / sizeof(starts[0])); k++)\n\t\tstarts[k] = -1;\n\tfor (int l = len - 1; l >= 0; l--) {\n\t\tunsigned char indexChar = words[l][0];\n\t\tstarts[indexChar] = l;\n\t}\n}\n\n/** Check whether a string is in the list.\n * List elements are either exact matches or prefixes.\n * Prefix elements start with '^' and match all strings that start with the rest of the element\n * so '^GTK_' matches 'GTK_X', 'GTK_MAJOR_VERSION', and 'GTK_'.\n */\nbool WordList::InList(const char *s) const {\n\tif (0 == words)\n\t\treturn false;\n\tunsigned char firstChar = s[0];\n\tint j = starts[firstChar];\n\tif (j >= 0) {\n\t\twhile (static_cast<unsigned char>(words[j][0]) == firstChar) {\n\t\t\tif (s[1] == words[j][1]) {\n\t\t\t\tconst char *a = words[j] + 1;\n\t\t\t\tconst char *b = s + 1;\n\t\t\t\twhile (*a && *a == *b) {\n\t\t\t\t\ta++;\n\t\t\t\t\tb++;\n\t\t\t\t}\n\t\t\t\tif (!*a && !*b)\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t\tj++;\n\t\t}\n\t}\n\tj = starts[static_cast<unsigned int>('^')];\n\tif (j >= 0) {\n\t\twhile (words[j][0] == '^') {\n\t\t\tconst char *a = words[j] + 1;\n\t\t\tconst char *b = s;\n\t\t\twhile (*a && *a == *b) {\n\t\t\t\ta++;\n\t\t\t\tb++;\n\t\t\t}\n\t\t\tif (!*a)\n\t\t\t\treturn true;\n\t\t\tj++;\n\t\t}\n\t}\n\treturn false;\n}\n\n/** similar to InList, but word s can be a substring of keyword.\n * eg. the keyword define is defined as def~ine. This means the word must start\n * with def to be a keyword, but also defi, defin and define are valid.\n * The marker is ~ in this case.\n */\nbool WordList::InListAbbreviated(const char *s, const char marker) const {\n\tif (0 == words)\n\t\treturn false;\n\tunsigned char firstChar = s[0];\n\tint j = starts[firstChar];\n\tif (j >= 0) {\n\t\twhile (static_cast<unsigned char>(words[j][0]) == firstChar) {\n\t\t\tbool isSubword = false;\n\t\t\tint start = 1;\n\t\t\tif (words[j][1] == marker) {\n\t\t\t\tisSubword = true;\n\t\t\t\tstart++;\n\t\t\t}\n\t\t\tif (s[1] == words[j][start]) {\n\t\t\t\tconst char *a = words[j] + start;\n\t\t\t\tconst char *b = s + 1;\n\t\t\t\twhile (*a && *a == *b) {\n\t\t\t\t\ta++;\n\t\t\t\t\tif (*a == marker) {\n\t\t\t\t\t\tisSubword = true;\n\t\t\t\t\t\ta++;\n\t\t\t\t\t}\n\t\t\t\t\tb++;\n\t\t\t\t}\n\t\t\t\tif ((!*a || isSubword) && !*b)\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t\tj++;\n\t\t}\n\t}\n\tj = starts[static_cast<unsigned int>('^')];\n\tif (j >= 0) {\n\t\twhile (words[j][0] == '^') {\n\t\t\tconst char *a = words[j] + 1;\n\t\t\tconst char *b = s;\n\t\t\twhile (*a && *a == *b) {\n\t\t\t\ta++;\n\t\t\t\tb++;\n\t\t\t}\n\t\t\tif (!*a)\n\t\t\t\treturn true;\n\t\t\tj++;\n\t\t}\n\t}\n\treturn false;\n}\n\nconst char *WordList::WordAt(int n) const {\n\treturn words[n];\n}\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/lexlib/WordList.h",
    "content": "// Scintilla source code edit control\n/** @file WordList.h\n ** Hold a list of words.\n **/\n// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef WORDLIST_H\n#define WORDLIST_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n/**\n */\nclass WordList {\n\t// Each word contains at least one character - a empty word acts as sentinel at the end.\n\tchar **words;\n\tchar *list;\n\tint len;\n\tbool onlyLineEnds;\t///< Delimited by any white space or only line ends\n\tint starts[256];\npublic:\n\tWordList(bool onlyLineEnds_ = false);\n\t~WordList();\n\toperator bool() const;\n\tbool operator!=(const WordList &other) const;\n\tint Length() const;\n\tvoid Clear();\n\tvoid Set(const char *s);\n\tbool InList(const char *s) const;\n\tbool InListAbbreviated(const char *s, const char marker) const;\n\tconst char *WordAt(int n) const;\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/qsci/api/python/Python-2.4.api",
    "content": "ArithmeticError(??)\nAssertionError(??)\nAttributeError(??)\nBaseHTTPServer.BaseHTTPRequestHandler(??)\nBaseHTTPServer.DEFAULT_ERROR_MESSAGE\nBaseHTTPServer.HTTPServer(??)\nBaseHTTPServer.SocketServer\nBaseHTTPServer.mimetools\nBaseHTTPServer.socket\nBaseHTTPServer.sys\nBaseHTTPServer.test(??)\nBaseHTTPServer.time\nBastion.Bastion(??)\nBastion.BastionClass(??)\nBastion.MethodType\nCGIHTTPServer.BaseHTTPServer\nCGIHTTPServer.CGIHTTPRequestHandler(??)\nCGIHTTPServer.SimpleHTTPServer\nCGIHTTPServer.executable(??)\nCGIHTTPServer.nobody\nCGIHTTPServer.nobody_uid(??)\nCGIHTTPServer.os\nCGIHTTPServer.select\nCGIHTTPServer.sys\nCGIHTTPServer.test(??)\nCGIHTTPServer.urllib\nConfigParser.ConfigParser(??)\nConfigParser.DEFAULTSECT\nConfigParser.DuplicateSectionError(??)\nConfigParser.Error(??)\nConfigParser.InterpolationDepthError(??)\nConfigParser.InterpolationError(??)\nConfigParser.InterpolationMissingOptionError(??)\nConfigParser.InterpolationSyntaxError(??)\nConfigParser.MAX_INTERPOLATION_DEPTH\nConfigParser.MissingSectionHeaderError(??)\nConfigParser.NoOptionError(??)\nConfigParser.NoSectionError(??)\nConfigParser.ParsingError(??)\nConfigParser.RawConfigParser(??)\nConfigParser.SafeConfigParser(??)\nConfigParser.re\nCookie.BaseCookie\nCookie.Cookie\nCookie.CookieError(??)\nCookie.Morsel\nCookie.SerialCookie\nCookie.SimpleCookie\nCookie.SmartCookie\nCookie.dumps(obj, protocol=0) -- Return a string containing an object in pickle format.\nCookie.loads(string) -- Load a pickle from the given string\nCookie.re\nCookie.string\nCookie.warnings\nDeprecationWarning(??)\nDocXMLRPCServer.CGIXMLRPCRequestHandler(??)\nDocXMLRPCServer.DocCGIXMLRPCRequestHandler(??)\nDocXMLRPCServer.DocXMLRPCRequestHandler(??)\nDocXMLRPCServer.DocXMLRPCServer(??)\nDocXMLRPCServer.ServerHTMLDoc(??)\nDocXMLRPCServer.SimpleXMLRPCRequestHandler(??)\nDocXMLRPCServer.SimpleXMLRPCServer(??)\nDocXMLRPCServer.XMLRPCDocGenerator(??)\nDocXMLRPCServer.inspect\nDocXMLRPCServer.pydoc\nDocXMLRPCServer.re\nDocXMLRPCServer.resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d\nDocXMLRPCServer.sys\nDocXMLRPCServer.types\nEOFError(??)\nEllipsis\nEnvironmentError(??)\nException(??)\nFalse\nFloatingPointError(??)\nFutureWarning(??)\nHTMLParser.HTMLParseError(??)\nHTMLParser.HTMLParser(??)\nHTMLParser.attrfind\nHTMLParser.charref\nHTMLParser.commentclose\nHTMLParser.endendtag\nHTMLParser.endtagfind\nHTMLParser.entityref\nHTMLParser.incomplete\nHTMLParser.interesting_cdata\nHTMLParser.interesting_normal\nHTMLParser.locatestarttagend\nHTMLParser.markupbase\nHTMLParser.piclose\nHTMLParser.re\nHTMLParser.starttagopen\nHTMLParser.tagfind\nIOError(??)\nImportError(??)\nIndentationError(??)\nIndexError(??)\nKeyError(??)\nKeyboardInterrupt(??)\nLookupError(??)\nMemoryError(??)\nMimeWriter.MimeWriter(??)\nMimeWriter.mimetools\nNameError(??)\nNone\nNotImplemented\nNotImplementedError(??)\nOSError(??)\nOverflowError(??)\nOverflowWarning(??)\nPendingDeprecationWarning(??)\nQueue.Empty(??)\nQueue.Full(??)\nQueue.Queue(??)\nQueue.deque(iterable) --> deque object\nReferenceError(??)\nRuntimeError(??)\nRuntimeWarning(??)\nSimpleHTTPServer.BaseHTTPServer\nSimpleHTTPServer.SimpleHTTPRequestHandler(??)\nSimpleHTTPServer.StringIO(??)\nSimpleHTTPServer.cgi\nSimpleHTTPServer.mimetypes\nSimpleHTTPServer.os\nSimpleHTTPServer.posixpath\nSimpleHTTPServer.shutil\nSimpleHTTPServer.test(??)\nSimpleHTTPServer.urllib\nSimpleHTTPServer.urlparse\nSimpleXMLRPCServer.BaseHTTPServer\nSimpleXMLRPCServer.CGIXMLRPCRequestHandler(??)\nSimpleXMLRPCServer.Fault(??)\nSimpleXMLRPCServer.SimpleXMLRPCDispatcher(??)\nSimpleXMLRPCServer.SimpleXMLRPCRequestHandler(??)\nSimpleXMLRPCServer.SimpleXMLRPCServer(??)\nSimpleXMLRPCServer.SocketServer\nSimpleXMLRPCServer.list_public_methods(??)\nSimpleXMLRPCServer.os\nSimpleXMLRPCServer.remove_duplicates([2,2,2,1,3,3]) => [3,1,2]\nSimpleXMLRPCServer.resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d\nSimpleXMLRPCServer.sys\nSimpleXMLRPCServer.xmlrpclib\nSocketServer.BaseRequestHandler(??)\nSocketServer.BaseServer(??)\nSocketServer.DatagramRequestHandler(??)\nSocketServer.ForkingMixIn(??)\nSocketServer.ForkingTCPServer(??)\nSocketServer.ForkingUDPServer(??)\nSocketServer.StreamRequestHandler(??)\nSocketServer.TCPServer(??)\nSocketServer.ThreadingMixIn(??)\nSocketServer.ThreadingTCPServer(??)\nSocketServer.ThreadingUDPServer(??)\nSocketServer.ThreadingUnixDatagramServer(??)\nSocketServer.ThreadingUnixStreamServer(??)\nSocketServer.UDPServer(??)\nSocketServer.UnixDatagramServer(??)\nSocketServer.UnixStreamServer(??)\nSocketServer.os\nSocketServer.socket\nSocketServer.sys\nStandardError(??)\nStopIteration(??)\nStringIO.EINVAL\nStringIO.StringIO(??)\nStringIO.test(??)\nSyntaxError(??)\nSyntaxWarning(??)\nSystemError(??)\nSystemExit(??)\nTabError(??)\nTrue\nTypeError(??)\nUnboundLocalError(??)\nUnicodeDecodeError(??)\nUnicodeEncodeError(??)\nUnicodeError(??)\nUnicodeTranslateError(??)\nUserDict.DictMixin(??)\nUserDict.IterableUserDict(??)\nUserDict.UserDict(??)\nUserList.UserList(??)\nUserString.MutableString(??)\nUserString.StringTypes\nUserString.UserString(??)\nUserString.sys\nUserWarning(??)\nValueError(??)\nWarning(??)\nZeroDivisionError(??)\nabs(number) -> number\naifc.Aifc_read(??)\naifc.Aifc_write(??)\naifc.Chunk(??)\naifc.Error(??)\naifc.open(??)\naifc.openfp(??)\naifc.struct\nanydbm.error\nanydbm.open(??)\napply(object[, args[, kwargs]]) -> value\narray.ArrayType\narray.array(typecode [, initializer]) -> array\nasynchat.async_chat(??)\nasynchat.asyncore\nasynchat.deque(iterable) --> deque object\nasynchat.fifo(??)\nasynchat.find_prefix_at_end(??)\nasynchat.simple_producer(??)\nasynchat.socket\nasyncore.EALREADY\nasyncore.ECONNRESET\nasyncore.EINPROGRESS\nasyncore.EINTR\nasyncore.EISCONN\nasyncore.ENOTCONN\nasyncore.ESHUTDOWN\nasyncore.EWOULDBLOCK\nasyncore.ExitNow(??)\nasyncore.close_all(??)\nasyncore.compact_traceback(??)\nasyncore.dispatcher(??)\nasyncore.dispatcher_with_send(??)\nasyncore.errorcode\nasyncore.exceptions\nasyncore.fcntl\nasyncore.file_dispatcher(??)\nasyncore.file_wrapper(??)\nasyncore.loop(??)\nasyncore.os\nasyncore.poll(??)\nasyncore.poll2(??)\nasyncore.poll3(??)\nasyncore.read(??)\nasyncore.readwrite(??)\nasyncore.select\nasyncore.socket\nasyncore.socket_map\nasyncore.sys\nasyncore.time\nasyncore.write(??)\natexit.register(??)\natexit.sys\naudiodev.AudioDev(??)\naudiodev.Play_Audio_sgi(??)\naudiodev.Play_Audio_sun(??)\naudiodev.error(??)\naudiodev.test(??)\naudioop.add\naudioop.adpcm2lin\naudioop.avg\naudioop.avgpp\naudioop.bias\naudioop.cross\naudioop.error(??)\naudioop.findfactor\naudioop.findfit\naudioop.findmax\naudioop.getsample\naudioop.lin2adpcm\naudioop.lin2lin\naudioop.lin2ulaw\naudioop.max\naudioop.maxpp\naudioop.minmax\naudioop.mul\naudioop.ratecv\naudioop.reverse\naudioop.rms\naudioop.tomono\naudioop.tostereo\naudioop.ulaw2lin\nbase64.EMPTYSTRING\nbase64.MAXBINSIZE\nbase64.MAXLINESIZE\nbase64.b16decode(??)\nbase64.b16encode(??)\nbase64.b32decode(??)\nbase64.b32encode(??)\nbase64.b64decode(??)\nbase64.b64encode(??)\nbase64.binascii\nbase64.decode(??)\nbase64.decodestring(??)\nbase64.encode(??)\nbase64.encodestring(??)\nbase64.k\nbase64.re\nbase64.standard_b64decode(??)\nbase64.standard_b64encode(??)\nbase64.struct\nbase64.test(??)\nbase64.test1(??)\nbase64.urlsafe_b64decode(??)\nbase64.urlsafe_b64encode(??)\nbase64.v\nbasestring\nbdb.Bdb(??)\nbdb.BdbQuit(??)\nbdb.Breakpoint(??)\nbdb.Tdb(??)\nbdb.bar(??)\nbdb.checkfuncname(??)\nbdb.effective(??)\nbdb.foo(??)\nbdb.os\nbdb.set_trace(??)\nbdb.sys\nbdb.test(??)\nbdb.types\nbinascii.Error(??)\nbinascii.Incomplete(??)\nbinascii.a2b_base64\nbinascii.a2b_hex(hexstr) -> s; Binary data of hexadecimal representation.\nbinascii.a2b_hqx\nbinascii.a2b_qp\nbinascii.a2b_uu\nbinascii.b2a_base64\nbinascii.b2a_hex(data) -> s; Hexadecimal representation of binary data.\nbinascii.b2a_hqx\nbinascii.b2a_qp(data, quotetabs=0, istext=1, header=0) -> s;\nbinascii.b2a_uu\nbinascii.crc32\nbinascii.crc_hqx\nbinascii.hexlify\nbinascii.rlecode_hqx\nbinascii.rledecode_hqx\nbinascii.unhexlify\nbinhex.BinHex(??)\nbinhex.Error(??)\nbinhex.FInfo(??)\nbinhex.HexBin(??)\nbinhex.LINELEN\nbinhex.REASONABLY_LARGE\nbinhex.RUNCHAR\nbinhex.binascii\nbinhex.binhex(??)\nbinhex.getfileinfo(??)\nbinhex.hexbin(??)\nbinhex.openrsrc(??)\nbinhex.os\nbinhex.struct\nbinhex.sys\nbisect.bisect\nbisect.bisect_left(a, x[, lo[, hi]]) -> index\nbisect.bisect_right(a, x[, lo[, hi]]) -> index\nbisect.insort\nbisect.insort_left(a, x[, lo[, hi]])\nbisect.insort_right(a, x[, lo[, hi]])\nbool(x) -> bool\nbsddb.UserDict\nbsddb.btopen(??)\nbsddb.db\nbsddb.db.DB\nbsddb.db.DBAccessError(??)\nbsddb.db.DBAgainError(??)\nbsddb.db.DBBusyError(??)\nbsddb.db.DBCursorClosedError(??)\nbsddb.db.DBEnv\nbsddb.db.DBError(??)\nbsddb.db.DBFileExistsError(??)\nbsddb.db.DBInvalidArgError(??)\nbsddb.db.DBKeyEmptyError(??)\nbsddb.db.DBKeyExistError(??)\nbsddb.db.DBLockDeadlockError(??)\nbsddb.db.DBLockNotGrantedError(??)\nbsddb.db.DBNoMemoryError(??)\nbsddb.db.DBNoServerError(??)\nbsddb.db.DBNoServerHomeError(??)\nbsddb.db.DBNoServerIDError(??)\nbsddb.db.DBNoSpaceError(??)\nbsddb.db.DBNoSuchFileError(??)\nbsddb.db.DBNotFoundError(??)\nbsddb.db.DBOldVersionError(??)\nbsddb.db.DBPageNotFoundError(??)\nbsddb.db.DBPermissionsError(??)\nbsddb.db.DBRunRecoveryError(??)\nbsddb.db.DBSecondaryBadError(??)\nbsddb.db.DBVerifyBadError(??)\nbsddb.db.DB_AFTER\nbsddb.db.DB_AGGRESSIVE\nbsddb.db.DB_APPEND\nbsddb.db.DB_ARCH_ABS\nbsddb.db.DB_ARCH_DATA\nbsddb.db.DB_ARCH_LOG\nbsddb.db.DB_AUTO_COMMIT\nbsddb.db.DB_BEFORE\nbsddb.db.DB_BTREE\nbsddb.db.DB_CACHED_COUNTS\nbsddb.db.DB_CDB_ALLDB\nbsddb.db.DB_CHECKPOINT\nbsddb.db.DB_CHKSUM\nbsddb.db.DB_CONSUME\nbsddb.db.DB_CONSUME_WAIT\nbsddb.db.DB_CREATE\nbsddb.db.DB_CURRENT\nbsddb.db.DB_DIRECT_DB\nbsddb.db.DB_DIRECT_LOG\nbsddb.db.DB_DIRTY_READ\nbsddb.db.DB_DONOTINDEX\nbsddb.db.DB_DUP\nbsddb.db.DB_DUPSORT\nbsddb.db.DB_ENCRYPT\nbsddb.db.DB_ENCRYPT_AES\nbsddb.db.DB_EXCL\nbsddb.db.DB_EXTENT\nbsddb.db.DB_FAST_STAT\nbsddb.db.DB_FCNTL_LOCKING\nbsddb.db.DB_FIRST\nbsddb.db.DB_FLUSH\nbsddb.db.DB_FORCE\nbsddb.db.DB_GET_BOTH\nbsddb.db.DB_GET_RECNO\nbsddb.db.DB_HASH\nbsddb.db.DB_INCOMPLETE\nbsddb.db.DB_INIT_CDB\nbsddb.db.DB_INIT_LOCK\nbsddb.db.DB_INIT_LOG\nbsddb.db.DB_INIT_MPOOL\nbsddb.db.DB_INIT_REP\nbsddb.db.DB_INIT_TXN\nbsddb.db.DB_JOINENV\nbsddb.db.DB_JOIN_ITEM\nbsddb.db.DB_JOIN_NOSORT\nbsddb.db.DB_KEYEMPTY\nbsddb.db.DB_KEYEXIST\nbsddb.db.DB_KEYFIRST\nbsddb.db.DB_KEYLAST\nbsddb.db.DB_LAST\nbsddb.db.DB_LOCKDOWN\nbsddb.db.DB_LOCK_CONFLICT\nbsddb.db.DB_LOCK_DEADLOCK\nbsddb.db.DB_LOCK_DEFAULT\nbsddb.db.DB_LOCK_DIRTY\nbsddb.db.DB_LOCK_DUMP\nbsddb.db.DB_LOCK_GET\nbsddb.db.DB_LOCK_INHERIT\nbsddb.db.DB_LOCK_IREAD\nbsddb.db.DB_LOCK_IWR\nbsddb.db.DB_LOCK_IWRITE\nbsddb.db.DB_LOCK_MAXLOCKS\nbsddb.db.DB_LOCK_MINLOCKS\nbsddb.db.DB_LOCK_MINWRITE\nbsddb.db.DB_LOCK_NG\nbsddb.db.DB_LOCK_NORUN\nbsddb.db.DB_LOCK_NOTGRANTED\nbsddb.db.DB_LOCK_NOWAIT\nbsddb.db.DB_LOCK_OLDEST\nbsddb.db.DB_LOCK_PUT\nbsddb.db.DB_LOCK_PUT_ALL\nbsddb.db.DB_LOCK_PUT_OBJ\nbsddb.db.DB_LOCK_RANDOM\nbsddb.db.DB_LOCK_READ\nbsddb.db.DB_LOCK_RECORD\nbsddb.db.DB_LOCK_SWITCH\nbsddb.db.DB_LOCK_UPGRADE\nbsddb.db.DB_LOCK_UPGRADE_WRITE\nbsddb.db.DB_LOCK_WAIT\nbsddb.db.DB_LOCK_WRITE\nbsddb.db.DB_LOCK_WWRITE\nbsddb.db.DB_LOCK_YOUNGEST\nbsddb.db.DB_LOG_AUTOREMOVE\nbsddb.db.DB_LSTAT_ABORTED\nbsddb.db.DB_LSTAT_ERR\nbsddb.db.DB_LSTAT_FREE\nbsddb.db.DB_LSTAT_HELD\nbsddb.db.DB_LSTAT_PENDING\nbsddb.db.DB_LSTAT_WAITING\nbsddb.db.DB_MAX_PAGES\nbsddb.db.DB_MAX_RECORDS\nbsddb.db.DB_MULTIPLE\nbsddb.db.DB_MULTIPLE_KEY\nbsddb.db.DB_NEXT\nbsddb.db.DB_NEXT_DUP\nbsddb.db.DB_NEXT_NODUP\nbsddb.db.DB_NODUPDATA\nbsddb.db.DB_NOLOCKING\nbsddb.db.DB_NOMMAP\nbsddb.db.DB_NOORDERCHK\nbsddb.db.DB_NOOVERWRITE\nbsddb.db.DB_NOPANIC\nbsddb.db.DB_NOSERVER\nbsddb.db.DB_NOSERVER_HOME\nbsddb.db.DB_NOSERVER_ID\nbsddb.db.DB_NOSYNC\nbsddb.db.DB_NOTFOUND\nbsddb.db.DB_ODDFILESIZE\nbsddb.db.DB_OLD_VERSION\nbsddb.db.DB_OPFLAGS_MASK\nbsddb.db.DB_ORDERCHKONLY\nbsddb.db.DB_PAGE_NOTFOUND\nbsddb.db.DB_PANIC_ENVIRONMENT\nbsddb.db.DB_POSITION\nbsddb.db.DB_PREV\nbsddb.db.DB_PREV_NODUP\nbsddb.db.DB_PRIVATE\nbsddb.db.DB_PR_PAGE\nbsddb.db.DB_PR_RECOVERYTEST\nbsddb.db.DB_QUEUE\nbsddb.db.DB_RDONLY\nbsddb.db.DB_RDWRMASTER\nbsddb.db.DB_RECNO\nbsddb.db.DB_RECNUM\nbsddb.db.DB_RECORDCOUNT\nbsddb.db.DB_RECOVER\nbsddb.db.DB_RECOVER_FATAL\nbsddb.db.DB_REGION_INIT\nbsddb.db.DB_RENUMBER\nbsddb.db.DB_REVSPLITOFF\nbsddb.db.DB_RMW\nbsddb.db.DB_RPCCLIENT\nbsddb.db.DB_RUNRECOVERY\nbsddb.db.DB_SALVAGE\nbsddb.db.DB_SECONDARY_BAD\nbsddb.db.DB_SET\nbsddb.db.DB_SET_LOCK_TIMEOUT\nbsddb.db.DB_SET_RANGE\nbsddb.db.DB_SET_RECNO\nbsddb.db.DB_SET_TXN_TIMEOUT\nbsddb.db.DB_SNAPSHOT\nbsddb.db.DB_STAT_CLEAR\nbsddb.db.DB_SYSTEM_MEM\nbsddb.db.DB_THREAD\nbsddb.db.DB_TIME_NOTGRANTED\nbsddb.db.DB_TRUNCATE\nbsddb.db.DB_TXN_NOSYNC\nbsddb.db.DB_TXN_NOT_DURABLE\nbsddb.db.DB_TXN_NOWAIT\nbsddb.db.DB_TXN_SYNC\nbsddb.db.DB_TXN_WRITE_NOSYNC\nbsddb.db.DB_UNKNOWN\nbsddb.db.DB_UPGRADE\nbsddb.db.DB_USE_ENVIRON\nbsddb.db.DB_USE_ENVIRON_ROOT\nbsddb.db.DB_VERIFY\nbsddb.db.DB_VERIFY_BAD\nbsddb.db.DB_VERSION_MAJOR\nbsddb.db.DB_VERSION_MINOR\nbsddb.db.DB_VERSION_PATCH\nbsddb.db.DB_VERSION_STRING\nbsddb.db.DB_WRITECURSOR\nbsddb.db.DB_XA_CREATE\nbsddb.db.DB_YIELDCPU\nbsddb.db.EACCES\nbsddb.db.EAGAIN\nbsddb.db.EBUSY\nbsddb.db.EEXIST\nbsddb.db.EINVAL\nbsddb.db.ENOENT\nbsddb.db.ENOMEM\nbsddb.db.ENOSPC\nbsddb.db.EPERM\nbsddb.db.cvsid\nbsddb.db.version\nbsddb.dbobj\nbsddb.dbobj.DB(??)\nbsddb.dbobj.DBEnv(??)\nbsddb.dbobj.DictMixin(??)\nbsddb.dbobj.db\nbsddb.dbrecio\nbsddb.dbrecio.DBRecIO(??)\nbsddb.dbrecio.errno\nbsddb.dbrecio.string\nbsddb.dbshelve\nbsddb.dbshelve.DBShelf(??)\nbsddb.dbshelve.DBShelfCursor(??)\nbsddb.dbshelve.DictMixin(??)\nbsddb.dbshelve.cPickle\nbsddb.dbshelve.db\nbsddb.dbshelve.open(??)\nbsddb.dbtables\nbsddb.dbtables.Cond(??)\nbsddb.dbtables.DB\nbsddb.dbtables.DBAccessError(??)\nbsddb.dbtables.DBAgainError(??)\nbsddb.dbtables.DBBusyError(??)\nbsddb.dbtables.DBCursorClosedError(??)\nbsddb.dbtables.DBEnv\nbsddb.dbtables.DBError(??)\nbsddb.dbtables.DBFileExistsError(??)\nbsddb.dbtables.DBInvalidArgError(??)\nbsddb.dbtables.DBKeyEmptyError(??)\nbsddb.dbtables.DBKeyExistError(??)\nbsddb.dbtables.DBLockDeadlockError(??)\nbsddb.dbtables.DBLockNotGrantedError(??)\nbsddb.dbtables.DBNoMemoryError(??)\nbsddb.dbtables.DBNoServerError(??)\nbsddb.dbtables.DBNoServerHomeError(??)\nbsddb.dbtables.DBNoServerIDError(??)\nbsddb.dbtables.DBNoSpaceError(??)\nbsddb.dbtables.DBNoSuchFileError(??)\nbsddb.dbtables.DBNotFoundError(??)\nbsddb.dbtables.DBOldVersionError(??)\nbsddb.dbtables.DBPageNotFoundError(??)\nbsddb.dbtables.DBPermissionsError(??)\nbsddb.dbtables.DBRunRecoveryError(??)\nbsddb.dbtables.DBSecondaryBadError(??)\nbsddb.dbtables.DBVerifyBadError(??)\nbsddb.dbtables.DB_AFTER\nbsddb.dbtables.DB_AGGRESSIVE\nbsddb.dbtables.DB_APPEND\nbsddb.dbtables.DB_ARCH_ABS\nbsddb.dbtables.DB_ARCH_DATA\nbsddb.dbtables.DB_ARCH_LOG\nbsddb.dbtables.DB_AUTO_COMMIT\nbsddb.dbtables.DB_BEFORE\nbsddb.dbtables.DB_BTREE\nbsddb.dbtables.DB_CACHED_COUNTS\nbsddb.dbtables.DB_CDB_ALLDB\nbsddb.dbtables.DB_CHECKPOINT\nbsddb.dbtables.DB_CHKSUM\nbsddb.dbtables.DB_CONSUME\nbsddb.dbtables.DB_CONSUME_WAIT\nbsddb.dbtables.DB_CREATE\nbsddb.dbtables.DB_CURRENT\nbsddb.dbtables.DB_DIRECT_DB\nbsddb.dbtables.DB_DIRECT_LOG\nbsddb.dbtables.DB_DIRTY_READ\nbsddb.dbtables.DB_DONOTINDEX\nbsddb.dbtables.DB_DUP\nbsddb.dbtables.DB_DUPSORT\nbsddb.dbtables.DB_ENCRYPT\nbsddb.dbtables.DB_ENCRYPT_AES\nbsddb.dbtables.DB_EXCL\nbsddb.dbtables.DB_EXTENT\nbsddb.dbtables.DB_FAST_STAT\nbsddb.dbtables.DB_FCNTL_LOCKING\nbsddb.dbtables.DB_FIRST\nbsddb.dbtables.DB_FLUSH\nbsddb.dbtables.DB_FORCE\nbsddb.dbtables.DB_GET_BOTH\nbsddb.dbtables.DB_GET_RECNO\nbsddb.dbtables.DB_HASH\nbsddb.dbtables.DB_INCOMPLETE\nbsddb.dbtables.DB_INIT_CDB\nbsddb.dbtables.DB_INIT_LOCK\nbsddb.dbtables.DB_INIT_LOG\nbsddb.dbtables.DB_INIT_MPOOL\nbsddb.dbtables.DB_INIT_REP\nbsddb.dbtables.DB_INIT_TXN\nbsddb.dbtables.DB_JOINENV\nbsddb.dbtables.DB_JOIN_ITEM\nbsddb.dbtables.DB_JOIN_NOSORT\nbsddb.dbtables.DB_KEYEMPTY\nbsddb.dbtables.DB_KEYEXIST\nbsddb.dbtables.DB_KEYFIRST\nbsddb.dbtables.DB_KEYLAST\nbsddb.dbtables.DB_LAST\nbsddb.dbtables.DB_LOCKDOWN\nbsddb.dbtables.DB_LOCK_CONFLICT\nbsddb.dbtables.DB_LOCK_DEADLOCK\nbsddb.dbtables.DB_LOCK_DEFAULT\nbsddb.dbtables.DB_LOCK_DIRTY\nbsddb.dbtables.DB_LOCK_DUMP\nbsddb.dbtables.DB_LOCK_GET\nbsddb.dbtables.DB_LOCK_INHERIT\nbsddb.dbtables.DB_LOCK_IREAD\nbsddb.dbtables.DB_LOCK_IWR\nbsddb.dbtables.DB_LOCK_IWRITE\nbsddb.dbtables.DB_LOCK_MAXLOCKS\nbsddb.dbtables.DB_LOCK_MINLOCKS\nbsddb.dbtables.DB_LOCK_MINWRITE\nbsddb.dbtables.DB_LOCK_NG\nbsddb.dbtables.DB_LOCK_NORUN\nbsddb.dbtables.DB_LOCK_NOTGRANTED\nbsddb.dbtables.DB_LOCK_NOWAIT\nbsddb.dbtables.DB_LOCK_OLDEST\nbsddb.dbtables.DB_LOCK_PUT\nbsddb.dbtables.DB_LOCK_PUT_ALL\nbsddb.dbtables.DB_LOCK_PUT_OBJ\nbsddb.dbtables.DB_LOCK_RANDOM\nbsddb.dbtables.DB_LOCK_READ\nbsddb.dbtables.DB_LOCK_RECORD\nbsddb.dbtables.DB_LOCK_SWITCH\nbsddb.dbtables.DB_LOCK_UPGRADE\nbsddb.dbtables.DB_LOCK_UPGRADE_WRITE\nbsddb.dbtables.DB_LOCK_WAIT\nbsddb.dbtables.DB_LOCK_WRITE\nbsddb.dbtables.DB_LOCK_WWRITE\nbsddb.dbtables.DB_LOCK_YOUNGEST\nbsddb.dbtables.DB_LOG_AUTOREMOVE\nbsddb.dbtables.DB_LSTAT_ABORTED\nbsddb.dbtables.DB_LSTAT_ERR\nbsddb.dbtables.DB_LSTAT_FREE\nbsddb.dbtables.DB_LSTAT_HELD\nbsddb.dbtables.DB_LSTAT_PENDING\nbsddb.dbtables.DB_LSTAT_WAITING\nbsddb.dbtables.DB_MAX_PAGES\nbsddb.dbtables.DB_MAX_RECORDS\nbsddb.dbtables.DB_MULTIPLE\nbsddb.dbtables.DB_MULTIPLE_KEY\nbsddb.dbtables.DB_NEXT\nbsddb.dbtables.DB_NEXT_DUP\nbsddb.dbtables.DB_NEXT_NODUP\nbsddb.dbtables.DB_NODUPDATA\nbsddb.dbtables.DB_NOLOCKING\nbsddb.dbtables.DB_NOMMAP\nbsddb.dbtables.DB_NOORDERCHK\nbsddb.dbtables.DB_NOOVERWRITE\nbsddb.dbtables.DB_NOPANIC\nbsddb.dbtables.DB_NOSERVER\nbsddb.dbtables.DB_NOSERVER_HOME\nbsddb.dbtables.DB_NOSERVER_ID\nbsddb.dbtables.DB_NOSYNC\nbsddb.dbtables.DB_NOTFOUND\nbsddb.dbtables.DB_ODDFILESIZE\nbsddb.dbtables.DB_OLD_VERSION\nbsddb.dbtables.DB_OPFLAGS_MASK\nbsddb.dbtables.DB_ORDERCHKONLY\nbsddb.dbtables.DB_PAGE_NOTFOUND\nbsddb.dbtables.DB_PANIC_ENVIRONMENT\nbsddb.dbtables.DB_POSITION\nbsddb.dbtables.DB_PREV\nbsddb.dbtables.DB_PREV_NODUP\nbsddb.dbtables.DB_PRIVATE\nbsddb.dbtables.DB_PR_PAGE\nbsddb.dbtables.DB_PR_RECOVERYTEST\nbsddb.dbtables.DB_QUEUE\nbsddb.dbtables.DB_RDONLY\nbsddb.dbtables.DB_RDWRMASTER\nbsddb.dbtables.DB_RECNO\nbsddb.dbtables.DB_RECNUM\nbsddb.dbtables.DB_RECORDCOUNT\nbsddb.dbtables.DB_RECOVER\nbsddb.dbtables.DB_RECOVER_FATAL\nbsddb.dbtables.DB_REGION_INIT\nbsddb.dbtables.DB_RENUMBER\nbsddb.dbtables.DB_REVSPLITOFF\nbsddb.dbtables.DB_RMW\nbsddb.dbtables.DB_RPCCLIENT\nbsddb.dbtables.DB_RUNRECOVERY\nbsddb.dbtables.DB_SALVAGE\nbsddb.dbtables.DB_SECONDARY_BAD\nbsddb.dbtables.DB_SET\nbsddb.dbtables.DB_SET_LOCK_TIMEOUT\nbsddb.dbtables.DB_SET_RANGE\nbsddb.dbtables.DB_SET_RECNO\nbsddb.dbtables.DB_SET_TXN_TIMEOUT\nbsddb.dbtables.DB_SNAPSHOT\nbsddb.dbtables.DB_STAT_CLEAR\nbsddb.dbtables.DB_SYSTEM_MEM\nbsddb.dbtables.DB_THREAD\nbsddb.dbtables.DB_TIME_NOTGRANTED\nbsddb.dbtables.DB_TRUNCATE\nbsddb.dbtables.DB_TXN_NOSYNC\nbsddb.dbtables.DB_TXN_NOT_DURABLE\nbsddb.dbtables.DB_TXN_NOWAIT\nbsddb.dbtables.DB_TXN_SYNC\nbsddb.dbtables.DB_TXN_WRITE_NOSYNC\nbsddb.dbtables.DB_UNKNOWN\nbsddb.dbtables.DB_UPGRADE\nbsddb.dbtables.DB_USE_ENVIRON\nbsddb.dbtables.DB_USE_ENVIRON_ROOT\nbsddb.dbtables.DB_VERIFY\nbsddb.dbtables.DB_VERIFY_BAD\nbsddb.dbtables.DB_VERSION_MAJOR\nbsddb.dbtables.DB_VERSION_MINOR\nbsddb.dbtables.DB_VERSION_PATCH\nbsddb.dbtables.DB_VERSION_STRING\nbsddb.dbtables.DB_WRITECURSOR\nbsddb.dbtables.DB_XA_CREATE\nbsddb.dbtables.DB_YIELDCPU\nbsddb.dbtables.EACCES\nbsddb.dbtables.EAGAIN\nbsddb.dbtables.EBUSY\nbsddb.dbtables.EEXIST\nbsddb.dbtables.EINVAL\nbsddb.dbtables.ENOENT\nbsddb.dbtables.ENOMEM\nbsddb.dbtables.ENOSPC\nbsddb.dbtables.EPERM\nbsddb.dbtables.ExactCond(??)\nbsddb.dbtables.LikeCond(??)\nbsddb.dbtables.ListType\nbsddb.dbtables.PostfixCond(??)\nbsddb.dbtables.PrefixCond(??)\nbsddb.dbtables.StringType\nbsddb.dbtables.TableAlreadyExists(??)\nbsddb.dbtables.TableDBError(??)\nbsddb.dbtables.bsdTableDB(??)\nbsddb.dbtables.contains_metastrings(??)\nbsddb.dbtables.copy\nbsddb.dbtables.cvsid\nbsddb.dbtables.pickle\nbsddb.dbtables.random\nbsddb.dbtables.re\nbsddb.dbtables.sys\nbsddb.dbtables.version\nbsddb.dbtables.xdrlib\nbsddb.dbutils\nbsddb.dbutils.DeadlockWrap(function, *_args, **_kwargs) - automatically retries\nbsddb.dbutils.db\nbsddb.error(??)\nbsddb.hashopen(??)\nbsddb.os\nbsddb.ref\nbsddb.rnopen(??)\nbsddb.sys\nbuffer(object [, offset[, size]])\nbz2.BZ2Compressor([compresslevel=9]) -> compressor object\nbz2.BZ2Decompressor() -> decompressor object\nbz2.BZ2File(name [, mode='r', buffering=0, compresslevel=9]) -> file object\nbz2.compress(data [, compresslevel=9]) -> string\nbz2.decompress(data) -> decompressed data\ncPickle.BadPickleGet(??)\ncPickle.HIGHEST_PROTOCOL\ncPickle.PickleError(??)\ncPickle.Pickler(file, protocol=0) -- Create a pickler.\ncPickle.PicklingError(??)\ncPickle.UnpickleableError(??)\ncPickle.Unpickler(file) -- Create an unpickler.\ncPickle.UnpicklingError(??)\ncPickle.compatible_formats\ncPickle.dump(obj, file, protocol=0) -- Write an object in pickle format to the given file.\ncPickle.dumps(obj, protocol=0) -- Return a string containing an object in pickle format.\ncPickle.format_version\ncPickle.load(file) -- Load a pickle from the given file\ncPickle.loads(string) -- Load a pickle from the given string\ncStringIO.InputType\ncStringIO.OutputType\ncStringIO.StringIO([s]) -- Return a StringIO-like stream for reading or writing\ncStringIO.cStringIO_CAPI\ncalendar.EPOCH\ncalendar.FRIDAY\ncalendar.February\ncalendar.January\ncalendar.MONDAY\ncalendar.SATURDAY\ncalendar.SUNDAY\ncalendar.THURSDAY\ncalendar.TUESDAY\ncalendar.WEDNESDAY\ncalendar.calendar(??)\ncalendar.datetime\ncalendar.day_abbr\ncalendar.day_name\ncalendar.error(??)\ncalendar.firstweekday(??)\ncalendar.format3c(??)\ncalendar.format3cstring(??)\ncalendar.isleap(??)\ncalendar.leapdays(??)\ncalendar.mdays\ncalendar.month(??)\ncalendar.month_abbr\ncalendar.month_name\ncalendar.monthcalendar(??)\ncalendar.monthrange(??)\ncalendar.prcal(??)\ncalendar.prmonth(??)\ncalendar.prweek(??)\ncalendar.setfirstweekday(??)\ncalendar.timegm(??)\ncalendar.week(??)\ncalendar.weekday(??)\ncalendar.weekheader(??)\ncallable(object) -> bool\ncgi.FieldStorage(??)\ncgi.FormContent(??)\ncgi.FormContentDict(??)\ncgi.InterpFormContentDict(??)\ncgi.MiniFieldStorage(??)\ncgi.StringIO(??)\ncgi.SvFormContentDict(??)\ncgi.UserDict\ncgi.dolog(??)\ncgi.escape(??)\ncgi.initlog(??)\ncgi.log(??)\ncgi.logfile\ncgi.logfp\ncgi.maxlen\ncgi.mimetools\ncgi.nolog(??)\ncgi.os\ncgi.parse(??)\ncgi.parse_header(??)\ncgi.parse_multipart(??)\ncgi.parse_qs(??)\ncgi.parse_qsl(??)\ncgi.print_arguments(??)\ncgi.print_directory(??)\ncgi.print_environ(??)\ncgi.print_environ_usage(??)\ncgi.print_exception(??)\ncgi.print_form(??)\ncgi.rfc822\ncgi.sys\ncgi.test(??)\ncgi.urllib\ncgi.valid_boundary(??)\ncgitb.Hook(??)\ncgitb.enable(??)\ncgitb.grey(??)\ncgitb.handler\ncgitb.html(??)\ncgitb.lookup(??)\ncgitb.reset(??)\ncgitb.scanvars(??)\ncgitb.small(??)\ncgitb.strong(??)\ncgitb.sys\ncgitb.text(??)\nchr(i) -> character\nchunk.Chunk(??)\nclassmethod(function) -> method\ncmath.acos(x)\ncmath.acosh(x)\ncmath.asin(x)\ncmath.asinh(x)\ncmath.atan(x)\ncmath.atanh(x)\ncmath.cos(x)\ncmath.cosh(x)\ncmath.e\ncmath.exp(x)\ncmath.log(x[, base]) -> the logarithm of x to the given base.\ncmath.log10(x)\ncmath.pi\ncmath.sin(x)\ncmath.sinh(x)\ncmath.sqrt(x)\ncmath.tan(x)\ncmath.tanh(x)\ncmd.Cmd(??)\ncmd.IDENTCHARS\ncmd.PROMPT\ncmd.string\ncmp(x, y) -> integer\ncode.CommandCompiler(??)\ncode.InteractiveConsole(??)\ncode.InteractiveInterpreter(??)\ncode.compile_command(??)\ncode.interact(??)\ncode.softspace(??)\ncode.sys\ncode.traceback\ncodecs.BOM\ncodecs.BOM32_BE\ncodecs.BOM32_LE\ncodecs.BOM64_BE\ncodecs.BOM64_LE\ncodecs.BOM_BE\ncodecs.BOM_LE\ncodecs.BOM_UTF16\ncodecs.BOM_UTF16_BE\ncodecs.BOM_UTF16_LE\ncodecs.BOM_UTF32\ncodecs.BOM_UTF32_BE\ncodecs.BOM_UTF32_LE\ncodecs.BOM_UTF8\ncodecs.Codec(??)\ncodecs.EncodedFile(??)\ncodecs.StreamReader(??)\ncodecs.StreamReaderWriter(??)\ncodecs.StreamRecoder(??)\ncodecs.StreamWriter(??)\ncodecs.ascii_decode\ncodecs.ascii_encode\ncodecs.backslashreplace_errors\ncodecs.charbuffer_encode\ncodecs.charmap_decode\ncodecs.charmap_encode\ncodecs.decode(obj, [encoding[,errors]]) -> object\ncodecs.encode(obj, [encoding[,errors]]) -> object\ncodecs.escape_decode\ncodecs.escape_encode\ncodecs.getdecoder(??)\ncodecs.getencoder(??)\ncodecs.getreader(??)\ncodecs.getwriter(??)\ncodecs.ignore_errors\ncodecs.latin_1_decode\ncodecs.latin_1_encode\ncodecs.lookup(encoding) -> (encoder, decoder, stream_reader, stream_writer)\ncodecs.lookup_error(errors) -> handler\ncodecs.make_encoding_map(??)\ncodecs.make_identity_dict(rng) -> dict\ncodecs.open(??)\ncodecs.raw_unicode_escape_decode\ncodecs.raw_unicode_escape_encode\ncodecs.readbuffer_encode\ncodecs.register(search_function)\ncodecs.register_error(errors, handler)\ncodecs.replace_errors\ncodecs.strict_errors\ncodecs.sys\ncodecs.unicode_escape_decode\ncodecs.unicode_escape_encode\ncodecs.unicode_internal_decode\ncodecs.unicode_internal_encode\ncodecs.utf_16_be_decode\ncodecs.utf_16_be_encode\ncodecs.utf_16_decode\ncodecs.utf_16_encode\ncodecs.utf_16_ex_decode\ncodecs.utf_16_le_decode\ncodecs.utf_16_le_encode\ncodecs.utf_7_decode\ncodecs.utf_7_encode\ncodecs.utf_8_decode\ncodecs.utf_8_encode\ncodecs.xmlcharrefreplace_errors\ncodeop.CommandCompiler(??)\ncodeop.Compile(??)\ncodeop.PyCF_DONT_IMPLY_DEDENT\ncodeop.compile_command(??)\ncodeop.fname\ncoerce(x, y) -> (x1, y1)\ncollections.deque(iterable) --> deque object\ncolorsys.ONE_SIXTH\ncolorsys.ONE_THIRD\ncolorsys.TWO_THIRD\ncolorsys.hls_to_rgb(??)\ncolorsys.hsv_to_rgb(??)\ncolorsys.rgb_to_hls(??)\ncolorsys.rgb_to_hsv(??)\ncolorsys.rgb_to_yiq(??)\ncolorsys.yiq_to_rgb(??)\ncommands.getoutput(??)\ncommands.getstatus(??)\ncommands.getstatusoutput(??)\ncommands.mk2arg(??)\ncommands.mkarg(??)\ncompile(source, filename, mode[, flags[, dont_inherit]]) -> code object\ncompileall.compile_dir(??)\ncompileall.compile_path(??)\ncompileall.main(??)\ncompileall.os\ncompileall.py_compile\ncompileall.sys\ncompiler.ast\ncompiler.ast.Add(??)\ncompiler.ast.And(??)\ncompiler.ast.AssAttr(??)\ncompiler.ast.AssList(??)\ncompiler.ast.AssName(??)\ncompiler.ast.AssTuple(??)\ncompiler.ast.Assert(??)\ncompiler.ast.Assign(??)\ncompiler.ast.AugAssign(??)\ncompiler.ast.Backquote(??)\ncompiler.ast.Bitand(??)\ncompiler.ast.Bitor(??)\ncompiler.ast.Bitxor(??)\ncompiler.ast.Break(??)\ncompiler.ast.CO_VARARGS\ncompiler.ast.CO_VARKEYWORDS\ncompiler.ast.CallFunc(??)\ncompiler.ast.Class(??)\ncompiler.ast.Compare(??)\ncompiler.ast.Const(??)\ncompiler.ast.Continue(??)\ncompiler.ast.Decorators(??)\ncompiler.ast.Dict(??)\ncompiler.ast.Discard(??)\ncompiler.ast.Div(??)\ncompiler.ast.Ellipsis(??)\ncompiler.ast.EmptyNode(??)\ncompiler.ast.Exec(??)\ncompiler.ast.Expression(??)\ncompiler.ast.FloorDiv(??)\ncompiler.ast.For(??)\ncompiler.ast.From(??)\ncompiler.ast.Function(??)\ncompiler.ast.GenExpr(??)\ncompiler.ast.GenExprFor(??)\ncompiler.ast.GenExprIf(??)\ncompiler.ast.GenExprInner(??)\ncompiler.ast.Getattr(??)\ncompiler.ast.Global(??)\ncompiler.ast.If(??)\ncompiler.ast.Import(??)\ncompiler.ast.Invert(??)\ncompiler.ast.Keyword(??)\ncompiler.ast.Lambda(??)\ncompiler.ast.LeftShift(??)\ncompiler.ast.List(??)\ncompiler.ast.ListComp(??)\ncompiler.ast.ListCompFor(??)\ncompiler.ast.ListCompIf(??)\ncompiler.ast.Mod(??)\ncompiler.ast.Module(??)\ncompiler.ast.Mul(??)\ncompiler.ast.Name(??)\ncompiler.ast.Node(??)\ncompiler.ast.Not(??)\ncompiler.ast.Or(??)\ncompiler.ast.Pass(??)\ncompiler.ast.Power(??)\ncompiler.ast.Print(??)\ncompiler.ast.Printnl(??)\ncompiler.ast.Raise(??)\ncompiler.ast.Return(??)\ncompiler.ast.RightShift(??)\ncompiler.ast.Slice(??)\ncompiler.ast.Sliceobj(??)\ncompiler.ast.Stmt(??)\ncompiler.ast.Sub(??)\ncompiler.ast.Subscript(??)\ncompiler.ast.TryExcept(??)\ncompiler.ast.TryFinally(??)\ncompiler.ast.Tuple(??)\ncompiler.ast.UnaryAdd(??)\ncompiler.ast.UnarySub(??)\ncompiler.ast.While(??)\ncompiler.ast.Yield(??)\ncompiler.ast.flatten(??)\ncompiler.ast.flatten_nodes(??)\ncompiler.ast.name\ncompiler.ast.nodes\ncompiler.ast.obj(??)\ncompiler.compile(??)\ncompiler.compileFile(??)\ncompiler.consts\ncompiler.consts.CO_FUTURE_DIVISION\ncompiler.consts.CO_GENERATOR\ncompiler.consts.CO_GENERATOR_ALLOWED\ncompiler.consts.CO_NESTED\ncompiler.consts.CO_NEWLOCALS\ncompiler.consts.CO_OPTIMIZED\ncompiler.consts.CO_VARARGS\ncompiler.consts.CO_VARKEYWORDS\ncompiler.consts.OP_APPLY\ncompiler.consts.OP_ASSIGN\ncompiler.consts.OP_DELETE\ncompiler.consts.SC_CELL\ncompiler.consts.SC_FREE\ncompiler.consts.SC_GLOBAL\ncompiler.consts.SC_LOCAL\ncompiler.consts.SC_UNKNOWN\ncompiler.future\ncompiler.future.BadFutureParser(??)\ncompiler.future.FutureParser(??)\ncompiler.future.ast\ncompiler.future.find_futures(??)\ncompiler.future.is_future(??)\ncompiler.future.walk(??)\ncompiler.misc\ncompiler.misc.MANGLE_LEN\ncompiler.misc.Set(??)\ncompiler.misc.Stack(??)\ncompiler.misc.flatten(??)\ncompiler.misc.mangle(??)\ncompiler.misc.set_filename(??)\ncompiler.misc.types\ncompiler.parse(??)\ncompiler.parseFile(??)\ncompiler.pyassem\ncompiler.pyassem.Block(??)\ncompiler.pyassem.CONV\ncompiler.pyassem.CO_NEWLOCALS\ncompiler.pyassem.CO_OPTIMIZED\ncompiler.pyassem.CO_VARARGS\ncompiler.pyassem.CO_VARKEYWORDS\ncompiler.pyassem.DONE\ncompiler.pyassem.FLAT\ncompiler.pyassem.FlowGraph(??)\ncompiler.pyassem.LineAddrTable(??)\ncompiler.pyassem.PyFlowGraph(??)\ncompiler.pyassem.RAW\ncompiler.pyassem.StackDepthTracker(??)\ncompiler.pyassem.TupleArg(??)\ncompiler.pyassem.dfs_postorder(??)\ncompiler.pyassem.dis\ncompiler.pyassem.findDepth\ncompiler.pyassem.getArgCount(??)\ncompiler.pyassem.isJump(??)\ncompiler.pyassem.misc\ncompiler.pyassem.new\ncompiler.pyassem.sys\ncompiler.pyassem.twobyte(??)\ncompiler.pyassem.types\ncompiler.pycodegen\ncompiler.pycodegen.AbstractClassCode(??)\ncompiler.pycodegen.AbstractCompileMode(??)\ncompiler.pycodegen.AbstractFunctionCode(??)\ncompiler.pycodegen.AugGetattr(??)\ncompiler.pycodegen.AugName(??)\ncompiler.pycodegen.AugSlice(??)\ncompiler.pycodegen.AugSubscript(??)\ncompiler.pycodegen.CO_FUTURE_DIVISION\ncompiler.pycodegen.CO_GENERATOR\ncompiler.pycodegen.CO_GENERATOR_ALLOWED\ncompiler.pycodegen.CO_NESTED\ncompiler.pycodegen.CO_NEWLOCALS\ncompiler.pycodegen.CO_VARARGS\ncompiler.pycodegen.CO_VARKEYWORDS\ncompiler.pycodegen.ClassCodeGenerator(??)\ncompiler.pycodegen.CodeGenerator(??)\ncompiler.pycodegen.Delegator(??)\ncompiler.pycodegen.END_FINALLY\ncompiler.pycodegen.EXCEPT\ncompiler.pycodegen.Expression(??)\ncompiler.pycodegen.ExpressionCodeGenerator(??)\ncompiler.pycodegen.FunctionCodeGenerator(??)\ncompiler.pycodegen.GenExprCodeGenerator(??)\ncompiler.pycodegen.Interactive(??)\ncompiler.pycodegen.InteractiveCodeGenerator(??)\ncompiler.pycodegen.LOOP\ncompiler.pycodegen.LocalNameFinder(??)\ncompiler.pycodegen.Module(??)\ncompiler.pycodegen.ModuleCodeGenerator(??)\ncompiler.pycodegen.NestedScopeMixin(??)\ncompiler.pycodegen.OpFinder(??)\ncompiler.pycodegen.SC_CELL\ncompiler.pycodegen.SC_FREE\ncompiler.pycodegen.SC_GLOBAL\ncompiler.pycodegen.SC_LOCAL\ncompiler.pycodegen.StringIO([s]) -- Return a StringIO-like stream for reading or writing\ncompiler.pycodegen.TRY_FINALLY\ncompiler.pycodegen.TupleArg(??)\ncompiler.pycodegen.VERSION\ncompiler.pycodegen.ast\ncompiler.pycodegen.callfunc_opcode_info\ncompiler.pycodegen.compile(??)\ncompiler.pycodegen.compileFile(??)\ncompiler.pycodegen.findOp(??)\ncompiler.pycodegen.future\ncompiler.pycodegen.generateArgList(??)\ncompiler.pycodegen.imp\ncompiler.pycodegen.is_constant_false(??)\ncompiler.pycodegen.marshal\ncompiler.pycodegen.misc\ncompiler.pycodegen.os\ncompiler.pycodegen.parse(??)\ncompiler.pycodegen.pyassem\ncompiler.pycodegen.struct\ncompiler.pycodegen.symbols\ncompiler.pycodegen.syntax\ncompiler.pycodegen.sys\ncompiler.pycodegen.types\ncompiler.pycodegen.walk(??)\ncompiler.pycodegen.wrap_aug(??)\ncompiler.pycodegen.wrapper\ncompiler.symbols\ncompiler.symbols.ClassScope(??)\ncompiler.symbols.FunctionScope(??)\ncompiler.symbols.GenExprScope(??)\ncompiler.symbols.LambdaScope(??)\ncompiler.symbols.MANGLE_LEN\ncompiler.symbols.ModuleScope(??)\ncompiler.symbols.SC_CELL\ncompiler.symbols.SC_FREE\ncompiler.symbols.SC_GLOBAL\ncompiler.symbols.SC_LOCAL\ncompiler.symbols.SC_UNKNOWN\ncompiler.symbols.Scope(??)\ncompiler.symbols.SymbolVisitor(??)\ncompiler.symbols.ast\ncompiler.symbols.list_eq(??)\ncompiler.symbols.mangle(??)\ncompiler.symbols.sort(??)\ncompiler.symbols.sys\ncompiler.symbols.types\ncompiler.syntax\ncompiler.syntax.SyntaxErrorChecker(??)\ncompiler.syntax.ast\ncompiler.syntax.check(??)\ncompiler.syntax.walk(??)\ncompiler.transformer\ncompiler.transformer.Add(??)\ncompiler.transformer.And(??)\ncompiler.transformer.AssAttr(??)\ncompiler.transformer.AssList(??)\ncompiler.transformer.AssName(??)\ncompiler.transformer.AssTuple(??)\ncompiler.transformer.Assert(??)\ncompiler.transformer.Assign(??)\ncompiler.transformer.AugAssign(??)\ncompiler.transformer.Backquote(??)\ncompiler.transformer.Bitand(??)\ncompiler.transformer.Bitor(??)\ncompiler.transformer.Bitxor(??)\ncompiler.transformer.Break(??)\ncompiler.transformer.CO_VARARGS\ncompiler.transformer.CO_VARKEYWORDS\ncompiler.transformer.CallFunc(??)\ncompiler.transformer.Class(??)\ncompiler.transformer.Compare(??)\ncompiler.transformer.Const(??)\ncompiler.transformer.Continue(??)\ncompiler.transformer.Decorators(??)\ncompiler.transformer.Dict(??)\ncompiler.transformer.Discard(??)\ncompiler.transformer.Div(??)\ncompiler.transformer.Ellipsis(??)\ncompiler.transformer.EmptyNode(??)\ncompiler.transformer.Exec(??)\ncompiler.transformer.Expression(??)\ncompiler.transformer.FloorDiv(??)\ncompiler.transformer.For(??)\ncompiler.transformer.From(??)\ncompiler.transformer.Function(??)\ncompiler.transformer.GenExpr(??)\ncompiler.transformer.GenExprFor(??)\ncompiler.transformer.GenExprIf(??)\ncompiler.transformer.GenExprInner(??)\ncompiler.transformer.Getattr(??)\ncompiler.transformer.Global(??)\ncompiler.transformer.If(??)\ncompiler.transformer.Import(??)\ncompiler.transformer.Invert(??)\ncompiler.transformer.Keyword(??)\ncompiler.transformer.Lambda(??)\ncompiler.transformer.LeftShift(??)\ncompiler.transformer.List(??)\ncompiler.transformer.ListComp(??)\ncompiler.transformer.ListCompFor(??)\ncompiler.transformer.ListCompIf(??)\ncompiler.transformer.Mod(??)\ncompiler.transformer.Module(??)\ncompiler.transformer.Mul(??)\ncompiler.transformer.Name(??)\ncompiler.transformer.Node(??)\ncompiler.transformer.Not(??)\ncompiler.transformer.OP_APPLY\ncompiler.transformer.OP_ASSIGN\ncompiler.transformer.OP_DELETE\ncompiler.transformer.Or(??)\ncompiler.transformer.Pass(??)\ncompiler.transformer.Power(??)\ncompiler.transformer.Print(??)\ncompiler.transformer.Printnl(??)\ncompiler.transformer.Raise(??)\ncompiler.transformer.Return(??)\ncompiler.transformer.RightShift(??)\ncompiler.transformer.Slice(??)\ncompiler.transformer.Sliceobj(??)\ncompiler.transformer.Stmt(??)\ncompiler.transformer.Sub(??)\ncompiler.transformer.Subscript(??)\ncompiler.transformer.Transformer(??)\ncompiler.transformer.TryExcept(??)\ncompiler.transformer.TryFinally(??)\ncompiler.transformer.Tuple(??)\ncompiler.transformer.UnaryAdd(??)\ncompiler.transformer.UnarySub(??)\ncompiler.transformer.WalkerError(??)\ncompiler.transformer.While(??)\ncompiler.transformer.Yield(??)\ncompiler.transformer.asList(??)\ncompiler.transformer.debug_tree(??)\ncompiler.transformer.extractLineNo(??)\ncompiler.transformer.flatten(??)\ncompiler.transformer.flatten_nodes(??)\ncompiler.transformer.k\ncompiler.transformer.name\ncompiler.transformer.nodes\ncompiler.transformer.obj(??)\ncompiler.transformer.parse(??)\ncompiler.transformer.parseFile(??)\ncompiler.transformer.parser\ncompiler.transformer.symbol\ncompiler.transformer.sys\ncompiler.transformer.token\ncompiler.transformer.types\ncompiler.transformer.v\ncompiler.visitor\ncompiler.visitor.ASTVisitor(??)\ncompiler.visitor.ExampleASTVisitor(??)\ncompiler.visitor.ast\ncompiler.visitor.dumpNode(??)\ncompiler.visitor.walk(??)\ncompiler.walk(??)\ncomplex(real[, imag]) -> complex number\ncookielib.Absent(??)\ncookielib.Cookie(??)\ncookielib.CookieJar(??)\ncookielib.CookiePolicy(??)\ncookielib.DAYS\ncookielib.DEFAULT_HTTP_PORT\ncookielib.DefaultCookiePolicy(??)\ncookielib.EPOCH_YEAR\ncookielib.ESCAPED_CHAR_RE\ncookielib.FileCookieJar(??)\ncookielib.HEADER_ESCAPE_RE\ncookielib.HEADER_JOIN_ESCAPE_RE\ncookielib.HEADER_QUOTED_VALUE_RE\ncookielib.HEADER_TOKEN_RE\ncookielib.HEADER_VALUE_RE\ncookielib.HTTP_PATH_SAFE\ncookielib.IPV4_RE\ncookielib.ISO_DATE_RE\ncookielib.LOOSE_HTTP_DATE_RE\ncookielib.LWPCookieJar(??)\ncookielib.LoadError(??)\ncookielib.MISSING_FILENAME_TEXT\ncookielib.MONTHS\ncookielib.MONTHS_LOWER\ncookielib.MozillaCookieJar(??)\ncookielib.STRICT_DATE_RE\ncookielib.StringTypes\ncookielib.TIMEZONE_RE\ncookielib.UTC_ZONES\ncookielib.WEEKDAY_RE\ncookielib.copy\ncookielib.cut_port_re\ncookielib.debug\ncookielib.deepvalues(??)\ncookielib.domain_match(??)\ncookielib.eff_request_host(??)\ncookielib.escape_path(??)\ncookielib.http2time(??)\ncookielib.httplib\ncookielib.is_HDN(??)\ncookielib.is_third_party(??)\ncookielib.iso2time(??)\ncookielib.join_header_words(??)\ncookielib.liberal_is_HDN(??)\ncookielib.logging\ncookielib.lwp_cookie_str(??)\ncookielib.month\ncookielib.offset_from_tz_string(??)\ncookielib.parse_ns_headers(??)\ncookielib.re\ncookielib.reach(??)\ncookielib.request_host(??)\ncookielib.request_path(??)\ncookielib.request_port(??)\ncookielib.reraise_unmasked_exceptions(??)\ncookielib.split_header_words(??)\ncookielib.sys\ncookielib.time\ncookielib.time2isoz(??)\ncookielib.time2netscape(??)\ncookielib.timegm(??)\ncookielib.unmatched(??)\ncookielib.uppercase_escaped_char(??)\ncookielib.urllib\ncookielib.urlparse\ncookielib.user_domain_match(??)\ncookielib.vals_sorted_by_key(??)\ncopy.Error(??)\ncopy.PyStringMap\ncopy.copy(??)\ncopy.deepcopy(??)\ncopy.dispatch_table\ncopy.error(??)\ncopy.inspect\ncopy.name\ncopy.t\ncopy_reg.add_extension(??)\ncopy_reg.clear_extension_cache(??)\ncopy_reg.constructor(??)\ncopy_reg.dispatch_table\ncopy_reg.pickle(??)\ncopy_reg.pickle_complex(??)\ncopy_reg.remove_extension(??)\ncopyright\ncredits\ncrypt.crypt(word, salt) -> string\ncsv.Dialect(??)\ncsv.DictReader(??)\ncsv.DictWriter(??)\ncsv.Error(??)\ncsv.QUOTE_ALL\ncsv.QUOTE_MINIMAL\ncsv.QUOTE_NONE\ncsv.QUOTE_NONNUMERIC\ncsv.Sniffer(??)\ncsv.StringIO([s]) -- Return a StringIO-like stream for reading or writing\ncsv.excel(??)\ncsv.excel_tab(??)\ncsv.get_dialect\ncsv.list_dialects\ncsv.re\ncsv.reader\ncsv.register_dialect\ncsv.unregister_dialect\ncsv.writer\ncurses.ALL_MOUSE_EVENTS\ncurses.A_ALTCHARSET\ncurses.A_ATTRIBUTES\ncurses.A_BLINK\ncurses.A_BOLD\ncurses.A_CHARTEXT\ncurses.A_COLOR\ncurses.A_DIM\ncurses.A_HORIZONTAL\ncurses.A_INVIS\ncurses.A_LEFT\ncurses.A_LOW\ncurses.A_NORMAL\ncurses.A_PROTECT\ncurses.A_REVERSE\ncurses.A_RIGHT\ncurses.A_STANDOUT\ncurses.A_TOP\ncurses.A_UNDERLINE\ncurses.A_VERTICAL\ncurses.BUTTON1_CLICKED\ncurses.BUTTON1_DOUBLE_CLICKED\ncurses.BUTTON1_PRESSED\ncurses.BUTTON1_RELEASED\ncurses.BUTTON1_TRIPLE_CLICKED\ncurses.BUTTON2_CLICKED\ncurses.BUTTON2_DOUBLE_CLICKED\ncurses.BUTTON2_PRESSED\ncurses.BUTTON2_RELEASED\ncurses.BUTTON2_TRIPLE_CLICKED\ncurses.BUTTON3_CLICKED\ncurses.BUTTON3_DOUBLE_CLICKED\ncurses.BUTTON3_PRESSED\ncurses.BUTTON3_RELEASED\ncurses.BUTTON3_TRIPLE_CLICKED\ncurses.BUTTON4_CLICKED\ncurses.BUTTON4_DOUBLE_CLICKED\ncurses.BUTTON4_PRESSED\ncurses.BUTTON4_RELEASED\ncurses.BUTTON4_TRIPLE_CLICKED\ncurses.BUTTON_ALT\ncurses.BUTTON_CTRL\ncurses.BUTTON_SHIFT\ncurses.COLOR_BLACK\ncurses.COLOR_BLUE\ncurses.COLOR_CYAN\ncurses.COLOR_GREEN\ncurses.COLOR_MAGENTA\ncurses.COLOR_RED\ncurses.COLOR_WHITE\ncurses.COLOR_YELLOW\ncurses.ERR\ncurses.KEY_A1\ncurses.KEY_A3\ncurses.KEY_B2\ncurses.KEY_BACKSPACE\ncurses.KEY_BEG\ncurses.KEY_BREAK\ncurses.KEY_BTAB\ncurses.KEY_C1\ncurses.KEY_C3\ncurses.KEY_CANCEL\ncurses.KEY_CATAB\ncurses.KEY_CLEAR\ncurses.KEY_CLOSE\ncurses.KEY_COMMAND\ncurses.KEY_COPY\ncurses.KEY_CREATE\ncurses.KEY_CTAB\ncurses.KEY_DC\ncurses.KEY_DL\ncurses.KEY_DOWN\ncurses.KEY_EIC\ncurses.KEY_END\ncurses.KEY_ENTER\ncurses.KEY_EOL\ncurses.KEY_EOS\ncurses.KEY_EXIT\ncurses.KEY_F0\ncurses.KEY_F1\ncurses.KEY_F10\ncurses.KEY_F11\ncurses.KEY_F12\ncurses.KEY_F13\ncurses.KEY_F14\ncurses.KEY_F15\ncurses.KEY_F16\ncurses.KEY_F17\ncurses.KEY_F18\ncurses.KEY_F19\ncurses.KEY_F2\ncurses.KEY_F20\ncurses.KEY_F21\ncurses.KEY_F22\ncurses.KEY_F23\ncurses.KEY_F24\ncurses.KEY_F25\ncurses.KEY_F26\ncurses.KEY_F27\ncurses.KEY_F28\ncurses.KEY_F29\ncurses.KEY_F3\ncurses.KEY_F30\ncurses.KEY_F31\ncurses.KEY_F32\ncurses.KEY_F33\ncurses.KEY_F34\ncurses.KEY_F35\ncurses.KEY_F36\ncurses.KEY_F37\ncurses.KEY_F38\ncurses.KEY_F39\ncurses.KEY_F4\ncurses.KEY_F40\ncurses.KEY_F41\ncurses.KEY_F42\ncurses.KEY_F43\ncurses.KEY_F44\ncurses.KEY_F45\ncurses.KEY_F46\ncurses.KEY_F47\ncurses.KEY_F48\ncurses.KEY_F49\ncurses.KEY_F5\ncurses.KEY_F50\ncurses.KEY_F51\ncurses.KEY_F52\ncurses.KEY_F53\ncurses.KEY_F54\ncurses.KEY_F55\ncurses.KEY_F56\ncurses.KEY_F57\ncurses.KEY_F58\ncurses.KEY_F59\ncurses.KEY_F6\ncurses.KEY_F60\ncurses.KEY_F61\ncurses.KEY_F62\ncurses.KEY_F63\ncurses.KEY_F7\ncurses.KEY_F8\ncurses.KEY_F9\ncurses.KEY_FIND\ncurses.KEY_HELP\ncurses.KEY_HOME\ncurses.KEY_IC\ncurses.KEY_IL\ncurses.KEY_LEFT\ncurses.KEY_LL\ncurses.KEY_MARK\ncurses.KEY_MAX\ncurses.KEY_MESSAGE\ncurses.KEY_MIN\ncurses.KEY_MOUSE\ncurses.KEY_MOVE\ncurses.KEY_NEXT\ncurses.KEY_NPAGE\ncurses.KEY_OPEN\ncurses.KEY_OPTIONS\ncurses.KEY_PPAGE\ncurses.KEY_PREVIOUS\ncurses.KEY_PRINT\ncurses.KEY_REDO\ncurses.KEY_REFERENCE\ncurses.KEY_REFRESH\ncurses.KEY_REPLACE\ncurses.KEY_RESET\ncurses.KEY_RESIZE\ncurses.KEY_RESTART\ncurses.KEY_RESUME\ncurses.KEY_RIGHT\ncurses.KEY_SAVE\ncurses.KEY_SBEG\ncurses.KEY_SCANCEL\ncurses.KEY_SCOMMAND\ncurses.KEY_SCOPY\ncurses.KEY_SCREATE\ncurses.KEY_SDC\ncurses.KEY_SDL\ncurses.KEY_SELECT\ncurses.KEY_SEND\ncurses.KEY_SEOL\ncurses.KEY_SEXIT\ncurses.KEY_SF\ncurses.KEY_SFIND\ncurses.KEY_SHELP\ncurses.KEY_SHOME\ncurses.KEY_SIC\ncurses.KEY_SLEFT\ncurses.KEY_SMESSAGE\ncurses.KEY_SMOVE\ncurses.KEY_SNEXT\ncurses.KEY_SOPTIONS\ncurses.KEY_SPREVIOUS\ncurses.KEY_SPRINT\ncurses.KEY_SR\ncurses.KEY_SREDO\ncurses.KEY_SREPLACE\ncurses.KEY_SRESET\ncurses.KEY_SRIGHT\ncurses.KEY_SRSUME\ncurses.KEY_SSAVE\ncurses.KEY_SSUSPEND\ncurses.KEY_STAB\ncurses.KEY_SUNDO\ncurses.KEY_SUSPEND\ncurses.KEY_UNDO\ncurses.KEY_UP\ncurses.OK\ncurses.REPORT_MOUSE_POSITION\ncurses.ascii\ncurses.ascii.ACK\ncurses.ascii.BEL\ncurses.ascii.BS\ncurses.ascii.CAN\ncurses.ascii.CR\ncurses.ascii.DC1\ncurses.ascii.DC2\ncurses.ascii.DC3\ncurses.ascii.DC4\ncurses.ascii.DEL\ncurses.ascii.DLE\ncurses.ascii.EM\ncurses.ascii.ENQ\ncurses.ascii.EOT\ncurses.ascii.ESC\ncurses.ascii.ETB\ncurses.ascii.ETX\ncurses.ascii.FF\ncurses.ascii.FS\ncurses.ascii.GS\ncurses.ascii.HT\ncurses.ascii.LF\ncurses.ascii.NAK\ncurses.ascii.NL\ncurses.ascii.NUL\ncurses.ascii.RS\ncurses.ascii.SI\ncurses.ascii.SO\ncurses.ascii.SOH\ncurses.ascii.SP\ncurses.ascii.STX\ncurses.ascii.SUB\ncurses.ascii.SYN\ncurses.ascii.TAB\ncurses.ascii.US\ncurses.ascii.VT\ncurses.ascii.alt(??)\ncurses.ascii.ascii(??)\ncurses.ascii.controlnames\ncurses.ascii.ctrl(??)\ncurses.ascii.isalnum(??)\ncurses.ascii.isalpha(??)\ncurses.ascii.isascii(??)\ncurses.ascii.isblank(??)\ncurses.ascii.iscntrl(??)\ncurses.ascii.isctrl(??)\ncurses.ascii.isdigit(??)\ncurses.ascii.isgraph(??)\ncurses.ascii.islower(??)\ncurses.ascii.ismeta(??)\ncurses.ascii.isprint(??)\ncurses.ascii.ispunct(??)\ncurses.ascii.isspace(??)\ncurses.ascii.isupper(??)\ncurses.ascii.isxdigit(??)\ncurses.ascii.unctrl(??)\ncurses.baudrate\ncurses.beep\ncurses.can_change_color\ncurses.cbreak\ncurses.color_content\ncurses.color_pair\ncurses.curs_set\ncurses.def_prog_mode\ncurses.def_shell_mode\ncurses.delay_output\ncurses.doupdate\ncurses.echo\ncurses.endwin\ncurses.erasechar\ncurses.error(??)\ncurses.filter\ncurses.flash\ncurses.flushinp\ncurses.getmouse\ncurses.getsyx\ncurses.getwin\ncurses.halfdelay\ncurses.has_colors\ncurses.has_ic\ncurses.has_il\ncurses.has_key\ncurses.has_key.has_key(??)\ncurses.init_color\ncurses.init_pair\ncurses.initscr(??)\ncurses.intrflush\ncurses.isendwin\ncurses.keyname\ncurses.killchar\ncurses.longname\ncurses.meta\ncurses.mouseinterval\ncurses.mousemask\ncurses.napms\ncurses.newpad\ncurses.newwin\ncurses.nl\ncurses.nocbreak\ncurses.noecho\ncurses.nonl\ncurses.noqiflush\ncurses.noraw\ncurses.pair_content\ncurses.pair_number\ncurses.panel\ncurses.panel.bottom_panel\ncurses.panel.error(??)\ncurses.panel.new_panel\ncurses.panel.top_panel\ncurses.panel.update_panels\ncurses.panel.version\ncurses.putp\ncurses.qiflush\ncurses.raw\ncurses.reset_prog_mode\ncurses.reset_shell_mode\ncurses.resetty\ncurses.savetty\ncurses.setsyx\ncurses.setupterm\ncurses.start_color(??)\ncurses.termattrs\ncurses.termname\ncurses.textpad\ncurses.textpad.Textbox(??)\ncurses.textpad.ascii\ncurses.textpad.curses\ncurses.textpad.rectangle(??)\ncurses.tigetflag\ncurses.tigetnum\ncurses.tigetstr\ncurses.tparm\ncurses.typeahead\ncurses.unctrl\ncurses.ungetch\ncurses.ungetmouse\ncurses.use_default_colors\ncurses.use_env\ncurses.version\ncurses.wrapper(??)\ncurses.wrapper.func_closure\ncurses.wrapper.func_code\ncurses.wrapper.func_defaults\ncurses.wrapper.func_dict\ncurses.wrapper.func_doc\ncurses.wrapper.func_globals\ncurses.wrapper.func_name\ndatetime.MAXYEAR\ndatetime.MINYEAR\ndatetime.date(year, month, day) --> date object\ndatetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\ndatetime.datetime_CAPI\ndatetime.time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\ndatetime.timedelta\ndatetime.tzinfo\ndbhash.bsddb\ndbhash.error(??)\ndbhash.open(??)\ndbhash.sys\ndecimal.ALWAYS_ROUND\ndecimal.BasicContext\ndecimal.Clamped(??)\ndecimal.Context\ndecimal.ConversionSyntax(??)\ndecimal.Decimal\ndecimal.DecimalException(??)\ndecimal.DefaultContext\ndecimal.DivisionByZero(??)\ndecimal.DivisionImpossible(??)\ndecimal.DivisionUndefined(??)\ndecimal.ExtendedContext\ndecimal.Inexact(??)\ndecimal.Inf\ndecimal.Infsign\ndecimal.InvalidContext(??)\ndecimal.InvalidOperation(??)\ndecimal.NEVER_ROUND\ndecimal.NaN\ndecimal.Overflow(??)\ndecimal.ROUND_CEILING\ndecimal.ROUND_DOWN\ndecimal.ROUND_FLOOR\ndecimal.ROUND_HALF_DOWN\ndecimal.ROUND_HALF_EVEN\ndecimal.ROUND_HALF_UP\ndecimal.ROUND_UP\ndecimal.Rounded(??)\ndecimal.Subnormal(??)\ndecimal.Underflow(??)\ndecimal.getcontext(??)\ndecimal.negInf\ndecimal.setcontext(??)\ndelattr(object, name)\ndict() -> new empty dictionary.\ndifflib.Differ(??)\ndifflib.HtmlDiff\ndifflib.IS_CHARACTER_JUNK(??)\ndifflib.IS_LINE_JUNK(??)\ndifflib.SequenceMatcher(??)\ndifflib.context_diff(??)\ndifflib.get_close_matches(??)\ndifflib.heapq\ndifflib.ndiff(??)\ndifflib.restore(??)\ndifflib.unified_diff(??)\ndir([object]) -> list of strings\ndircache.annotate(??)\ndircache.cache\ndircache.listdir(??)\ndircache.opendir(??)\ndircache.os\ndircache.reset(??)\ndis.EXTENDED_ARG\ndis.HAVE_ARGUMENT\ndis.cmp_op\ndis.dis(??)\ndis.disassemble(??)\ndis.disassemble_string(??)\ndis.disco(??)\ndis.distb(??)\ndis.findlabels(??)\ndis.findlinestarts(??)\ndis.hascompare\ndis.hasconst\ndis.hasfree\ndis.hasjabs\ndis.hasjrel\ndis.haslocal\ndis.hasname\ndis.opmap\ndis.opname\ndis.sys\ndis.types\ndivmod(x, y) -> (div, mod)\ndoctest.BLANKLINE_MARKER\ndoctest.COMPARISON_FLAGS\ndoctest.DONT_ACCEPT_BLANKLINE\ndoctest.DONT_ACCEPT_TRUE_FOR_1\ndoctest.DebugRunner(??)\ndoctest.DocFileCase\ndoctest.DocFileSuite(??)\ndoctest.DocFileTest(??)\ndoctest.DocTest(??)\ndoctest.DocTestCase\ndoctest.DocTestFailure(??)\ndoctest.DocTestFinder(??)\ndoctest.DocTestParser(??)\ndoctest.DocTestRunner(??)\ndoctest.DocTestSuite(??)\ndoctest.ELLIPSIS\ndoctest.ELLIPSIS_MARKER\ndoctest.Example(??)\ndoctest.IGNORE_EXCEPTION_DETAIL\ndoctest.NORMALIZE_WHITESPACE\ndoctest.OPTIONFLAGS_BY_NAME\ndoctest.OutputChecker(??)\ndoctest.REPORTING_FLAGS\ndoctest.REPORT_CDIFF\ndoctest.REPORT_NDIFF\ndoctest.REPORT_ONLY_FIRST_FAILURE\ndoctest.REPORT_UDIFF\ndoctest.StringIO(??)\ndoctest.Tester(??)\ndoctest.UnexpectedException(??)\ndoctest.debug(??)\ndoctest.debug_script(??)\ndoctest.debug_src(??)\ndoctest.difflib\ndoctest.inspect\ndoctest.is_private(??)\ndoctest.linecache\ndoctest.master\ndoctest.os\ndoctest.pdb\ndoctest.re\ndoctest.register_optionflag(??)\ndoctest.run_docstring_examples(??)\ndoctest.script_from_examples(??)\ndoctest.set_unittest_reportflags(??)\ndoctest.sys\ndoctest.tempfile\ndoctest.testfile(??)\ndoctest.testmod(??)\ndoctest.testsource(??)\ndoctest.traceback\ndoctest.types\ndoctest.unittest\ndoctest.warnings\ndumbdbm.UserDict\ndumbdbm.error(??)\ndumbdbm.open(??)\ndummy_thread.LockType\ndummy_thread.allocate_lock(??)\ndummy_thread.error(??)\ndummy_thread.exit(??)\ndummy_thread.get_ident(??)\ndummy_thread.interrupt_main(??)\ndummy_thread.start_new_thread(??)\ndummy_threading.BoundedSemaphore(??)\ndummy_threading.Condition(??)\ndummy_threading.Event(??)\ndummy_threading.Lock(??)\ndummy_threading.RLock(??)\ndummy_threading.Semaphore(??)\ndummy_threading.Thread\ndummy_threading.Timer(??)\ndummy_threading.activeCount(??)\ndummy_threading.currentThread(??)\ndummy_threading.enumerate(??)\ndummy_threading.local\ndummy_threading.setprofile(??)\ndummy_threading.settrace(??)\ndummy_threading.threading\nemail.Charset\nemail.Charset.ALIASES\nemail.Charset.BASE64\nemail.Charset.CHARSETS\nemail.Charset.CODEC_MAP\nemail.Charset.Charset(??)\nemail.Charset.DEFAULT_CHARSET\nemail.Charset.MISC_LEN\nemail.Charset.QP\nemail.Charset.SHORTEST\nemail.Charset.add_alias(??)\nemail.Charset.add_charset(??)\nemail.Charset.add_codec(??)\nemail.Charset.email\nemail.Charset.encode_7or8bit(??)\nemail.Encoders\nemail.Encoders.base64\nemail.Encoders.encode_7or8bit(??)\nemail.Encoders.encode_base64(??)\nemail.Encoders.encode_noop(??)\nemail.Encoders.encode_quopri(??)\nemail.Errors\nemail.Errors.BoundaryError(??)\nemail.Errors.FirstHeaderLineIsContinuationDefect(??)\nemail.Errors.HeaderParseError(??)\nemail.Errors.MalformedHeaderDefect(??)\nemail.Errors.MessageDefect(??)\nemail.Errors.MessageError(??)\nemail.Errors.MessageParseError(??)\nemail.Errors.MisplacedEnvelopeHeaderDefect(??)\nemail.Errors.MultipartConversionError(??)\nemail.Errors.MultipartInvariantViolationDefect(??)\nemail.Errors.NoBoundaryInMultipartDefect(??)\nemail.Errors.StartBoundaryNotFoundDefect(??)\nemail.FeedParser\nemail.FeedParser.BufferedSubFile\nemail.FeedParser.EMPTYSTRING\nemail.FeedParser.Errors\nemail.FeedParser.FeedParser(??)\nemail.FeedParser.Message\nemail.FeedParser.NL\nemail.FeedParser.NLCRE\nemail.FeedParser.NLCRE_bol\nemail.FeedParser.NLCRE_crack\nemail.FeedParser.NLCRE_eol\nemail.FeedParser.NeedMoreData\nemail.FeedParser.headerRE\nemail.FeedParser.re\nemail.Generator.DecodedGenerator(??)\nemail.Generator.Generator(??)\nemail.Generator.Header(??)\nemail.Generator.NL\nemail.Generator.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.Generator.UNDERSCORE\nemail.Generator.fcre\nemail.Generator.random\nemail.Generator.re\nemail.Generator.sys\nemail.Generator.time\nemail.Generator.warnings\nemail.Header\nemail.Header.Charset(??)\nemail.Header.Header(??)\nemail.Header.HeaderParseError(??)\nemail.Header.MAXLINELEN\nemail.Header.NL\nemail.Header.SPACE\nemail.Header.SPACE8\nemail.Header.UEMPTYSTRING\nemail.Header.USASCII\nemail.Header.USPACE\nemail.Header.UTF8\nemail.Header.binascii\nemail.Header.decode_header(??)\nemail.Header.ecre\nemail.Header.email\nemail.Header.fcre\nemail.Header.make_header(??)\nemail.Header.re\nemail.Iterators\nemail.Iterators.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.Iterators.body_line_iterator(??)\nemail.Iterators.sys\nemail.Iterators.typed_subpart_iterator(??)\nemail.Iterators.walk(??)\nemail.MIMEAudio\nemail.MIMEAudio.Encoders\nemail.MIMEAudio.Errors\nemail.MIMEAudio.MIMEAudio(??)\nemail.MIMEAudio.MIMENonMultipart(??)\nemail.MIMEAudio.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.MIMEAudio.sndhdr\nemail.MIMEBase\nemail.MIMEBase.MIMEBase(??)\nemail.MIMEBase.Message\nemail.MIMEImage\nemail.MIMEImage.Encoders\nemail.MIMEImage.Errors\nemail.MIMEImage.MIMEImage(??)\nemail.MIMEImage.MIMENonMultipart(??)\nemail.MIMEImage.imghdr\nemail.MIMEMessage.MIMEMessage(??)\nemail.MIMEMessage.MIMENonMultipart(??)\nemail.MIMEMessage.Message\nemail.MIMEMultipart\nemail.MIMEMultipart.MIMEBase\nemail.MIMEMultipart.MIMEMultipart(??)\nemail.MIMENonMultipart\nemail.MIMENonMultipart.Errors\nemail.MIMENonMultipart.MIMEBase\nemail.MIMENonMultipart.MIMENonMultipart(??)\nemail.MIMEText\nemail.MIMEText.MIMENonMultipart(??)\nemail.MIMEText.MIMEText(??)\nemail.MIMEText.encode_7or8bit(??)\nemail.Message\nemail.Message.Charset\nemail.Message.Errors\nemail.Message.Message(??)\nemail.Message.SEMISPACE\nemail.Message.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.Message.Utils\nemail.Message.binascii\nemail.Message.paramre\nemail.Message.re\nemail.Message.tspecials\nemail.Message.uu\nemail.Message.warnings\nemail.Parser\nemail.Parser.FeedParser(??)\nemail.Parser.HeaderParser(??)\nemail.Parser.Message(??)\nemail.Parser.Parser(??)\nemail.Parser.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.Parser.warnings\nemail.Utils\nemail.Utils.COMMASPACE\nemail.Utils.CRLF\nemail.Utils.EMPTYSTRING\nemail.Utils.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.Utils.UEMPTYSTRING\nemail.Utils.base64\nemail.Utils.collapse_rfc2231_value(??)\nemail.Utils.decode_params(??)\nemail.Utils.decode_rfc2231(??)\nemail.Utils.ecre\nemail.Utils.encode_rfc2231(??)\nemail.Utils.escapesre\nemail.Utils.fix_eols(??)\nemail.Utils.formataddr(??)\nemail.Utils.formatdate(??)\nemail.Utils.getaddresses(??)\nemail.Utils.make_msgid(??)\nemail.Utils.mktime_tz(??)\nemail.Utils.os\nemail.Utils.parseaddr(??)\nemail.Utils.parsedate(??)\nemail.Utils.parsedate_tz(??)\nemail.Utils.quote(??)\nemail.Utils.random\nemail.Utils.re\nemail.Utils.rfc2231_continuation\nemail.Utils.socket\nemail.Utils.specialsre\nemail.Utils.time\nemail.Utils.unquote(??)\nemail.Utils.warnings\nemail.base64MIME\nemail.base64MIME.CRLF\nemail.base64MIME.EMPTYSTRING\nemail.base64MIME.MISC_LEN\nemail.base64MIME.NL\nemail.base64MIME.a2b_base64\nemail.base64MIME.b2a_base64\nemail.base64MIME.base64_len(??)\nemail.base64MIME.body_decode(??)\nemail.base64MIME.body_encode(??)\nemail.base64MIME.decode(??)\nemail.base64MIME.decodestring(??)\nemail.base64MIME.encode(??)\nemail.base64MIME.encodestring(??)\nemail.base64MIME.fix_eols(??)\nemail.base64MIME.header_encode(??)\nemail.base64MIME.re\nemail.message_from_file(??)\nemail.message_from_string(??)\nemail.quopriMIME\nemail.quopriMIME.CRLF\nemail.quopriMIME.MISC_LEN\nemail.quopriMIME.NL\nemail.quopriMIME.body_decode(??)\nemail.quopriMIME.body_encode(??)\nemail.quopriMIME.body_quopri_check(??)\nemail.quopriMIME.body_quopri_len(??)\nemail.quopriMIME.bqre\nemail.quopriMIME.decode(??)\nemail.quopriMIME.decodestring(??)\nemail.quopriMIME.encode(??)\nemail.quopriMIME.encodestring(??)\nemail.quopriMIME.fix_eols(??)\nemail.quopriMIME.header_decode(??)\nemail.quopriMIME.header_encode(??)\nemail.quopriMIME.header_quopri_check(??)\nemail.quopriMIME.header_quopri_len(??)\nemail.quopriMIME.hexdigits\nemail.quopriMIME.hqre\nemail.quopriMIME.quote(??)\nemail.quopriMIME.re\nemail.quopriMIME.unquote(??)\nenumerate(iterable) -> iterator for index, value of iterable\nerrno.E2BIG\nerrno.EACCES\nerrno.EADDRINUSE\nerrno.EADDRNOTAVAIL\nerrno.EADV\nerrno.EAFNOSUPPORT\nerrno.EAGAIN\nerrno.EALREADY\nerrno.EBADE\nerrno.EBADF\nerrno.EBADFD\nerrno.EBADMSG\nerrno.EBADR\nerrno.EBADRQC\nerrno.EBADSLT\nerrno.EBFONT\nerrno.EBUSY\nerrno.ECHILD\nerrno.ECHRNG\nerrno.ECOMM\nerrno.ECONNABORTED\nerrno.ECONNREFUSED\nerrno.ECONNRESET\nerrno.EDEADLK\nerrno.EDEADLOCK\nerrno.EDESTADDRREQ\nerrno.EDOM\nerrno.EDOTDOT\nerrno.EDQUOT\nerrno.EEXIST\nerrno.EFAULT\nerrno.EFBIG\nerrno.EHOSTDOWN\nerrno.EHOSTUNREACH\nerrno.EIDRM\nerrno.EILSEQ\nerrno.EINPROGRESS\nerrno.EINTR\nerrno.EINVAL\nerrno.EIO\nerrno.EISCONN\nerrno.EISDIR\nerrno.EISNAM\nerrno.EL2HLT\nerrno.EL2NSYNC\nerrno.EL3HLT\nerrno.EL3RST\nerrno.ELIBACC\nerrno.ELIBBAD\nerrno.ELIBEXEC\nerrno.ELIBMAX\nerrno.ELIBSCN\nerrno.ELNRNG\nerrno.ELOOP\nerrno.EMFILE\nerrno.EMLINK\nerrno.EMSGSIZE\nerrno.EMULTIHOP\nerrno.ENAMETOOLONG\nerrno.ENAVAIL\nerrno.ENETDOWN\nerrno.ENETRESET\nerrno.ENETUNREACH\nerrno.ENFILE\nerrno.ENOANO\nerrno.ENOBUFS\nerrno.ENOCSI\nerrno.ENODATA\nerrno.ENODEV\nerrno.ENOENT\nerrno.ENOEXEC\nerrno.ENOLCK\nerrno.ENOLINK\nerrno.ENOMEM\nerrno.ENOMSG\nerrno.ENONET\nerrno.ENOPKG\nerrno.ENOPROTOOPT\nerrno.ENOSPC\nerrno.ENOSR\nerrno.ENOSTR\nerrno.ENOSYS\nerrno.ENOTBLK\nerrno.ENOTCONN\nerrno.ENOTDIR\nerrno.ENOTEMPTY\nerrno.ENOTNAM\nerrno.ENOTSOCK\nerrno.ENOTTY\nerrno.ENOTUNIQ\nerrno.ENXIO\nerrno.EOPNOTSUPP\nerrno.EOVERFLOW\nerrno.EPERM\nerrno.EPFNOSUPPORT\nerrno.EPIPE\nerrno.EPROTO\nerrno.EPROTONOSUPPORT\nerrno.EPROTOTYPE\nerrno.ERANGE\nerrno.EREMCHG\nerrno.EREMOTE\nerrno.EREMOTEIO\nerrno.ERESTART\nerrno.EROFS\nerrno.ESHUTDOWN\nerrno.ESOCKTNOSUPPORT\nerrno.ESPIPE\nerrno.ESRCH\nerrno.ESRMNT\nerrno.ESTALE\nerrno.ESTRPIPE\nerrno.ETIME\nerrno.ETIMEDOUT\nerrno.ETOOMANYREFS\nerrno.ETXTBSY\nerrno.EUCLEAN\nerrno.EUNATCH\nerrno.EUSERS\nerrno.EWOULDBLOCK\nerrno.EXDEV\nerrno.EXFULL\nerrno.errorcode\neval(source[, globals[, locals]]) -> value\nexceptions.ArithmeticError(??)\nexceptions.AssertionError(??)\nexceptions.AttributeError(??)\nexceptions.DeprecationWarning(??)\nexceptions.EOFError(??)\nexceptions.EnvironmentError(??)\nexceptions.Exception(??)\nexceptions.FloatingPointError(??)\nexceptions.FutureWarning(??)\nexceptions.IOError(??)\nexceptions.ImportError(??)\nexceptions.IndentationError(??)\nexceptions.IndexError(??)\nexceptions.KeyError(??)\nexceptions.KeyboardInterrupt(??)\nexceptions.LookupError(??)\nexceptions.MemoryError(??)\nexceptions.NameError(??)\nexceptions.NotImplementedError(??)\nexceptions.OSError(??)\nexceptions.OverflowError(??)\nexceptions.OverflowWarning(??)\nexceptions.PendingDeprecationWarning(??)\nexceptions.ReferenceError(??)\nexceptions.RuntimeError(??)\nexceptions.RuntimeWarning(??)\nexceptions.StandardError(??)\nexceptions.StopIteration(??)\nexceptions.SyntaxError(??)\nexceptions.SyntaxWarning(??)\nexceptions.SystemError(??)\nexceptions.SystemExit(??)\nexceptions.TabError(??)\nexceptions.TypeError(??)\nexceptions.UnboundLocalError(??)\nexceptions.UnicodeDecodeError(??)\nexceptions.UnicodeEncodeError(??)\nexceptions.UnicodeError(??)\nexceptions.UnicodeTranslateError(??)\nexceptions.UserWarning(??)\nexceptions.ValueError(??)\nexceptions.Warning(??)\nexceptions.ZeroDivisionError(??)\nexecfile(filename[, globals[, locals]])\nexit\nfcntl.DN_ACCESS\nfcntl.DN_ATTRIB\nfcntl.DN_CREATE\nfcntl.DN_DELETE\nfcntl.DN_MODIFY\nfcntl.DN_MULTISHOT\nfcntl.DN_RENAME\nfcntl.FD_CLOEXEC\nfcntl.F_DUPFD\nfcntl.F_EXLCK\nfcntl.F_GETFD\nfcntl.F_GETFL\nfcntl.F_GETLEASE\nfcntl.F_GETLK\nfcntl.F_GETLK64\nfcntl.F_GETOWN\nfcntl.F_GETSIG\nfcntl.F_NOTIFY\nfcntl.F_RDLCK\nfcntl.F_SETFD\nfcntl.F_SETFL\nfcntl.F_SETLEASE\nfcntl.F_SETLK\nfcntl.F_SETLK64\nfcntl.F_SETLKW\nfcntl.F_SETLKW64\nfcntl.F_SETOWN\nfcntl.F_SETSIG\nfcntl.F_SHLCK\nfcntl.F_UNLCK\nfcntl.F_WRLCK\nfcntl.I_ATMARK\nfcntl.I_CANPUT\nfcntl.I_CKBAND\nfcntl.I_FDINSERT\nfcntl.I_FIND\nfcntl.I_FLUSH\nfcntl.I_FLUSHBAND\nfcntl.I_GETBAND\nfcntl.I_GETCLTIME\nfcntl.I_GETSIG\nfcntl.I_GRDOPT\nfcntl.I_GWROPT\nfcntl.I_LINK\nfcntl.I_LIST\nfcntl.I_LOOK\nfcntl.I_NREAD\nfcntl.I_PEEK\nfcntl.I_PLINK\nfcntl.I_POP\nfcntl.I_PUNLINK\nfcntl.I_PUSH\nfcntl.I_RECVFD\nfcntl.I_SENDFD\nfcntl.I_SETCLTIME\nfcntl.I_SETSIG\nfcntl.I_SRDOPT\nfcntl.I_STR\nfcntl.I_SWROPT\nfcntl.I_UNLINK\nfcntl.LOCK_EX\nfcntl.LOCK_MAND\nfcntl.LOCK_NB\nfcntl.LOCK_READ\nfcntl.LOCK_RW\nfcntl.LOCK_SH\nfcntl.LOCK_UN\nfcntl.LOCK_WRITE\nfcntl.fcntl(fd, opt, [arg])\nfcntl.flock(fd, operation)\nfcntl.ioctl(fd, opt[, arg[, mutate_flag]])\nfcntl.lockf (fd, operation, length=0, start=0, whence=0)\nfile(name[, mode[, buffering]]) -> file object\nfilecmp.BUFSIZE\nfilecmp.cmp(??)\nfilecmp.cmpfiles(??)\nfilecmp.demo(??)\nfilecmp.dircmp(??)\nfilecmp.ifilter(function or None, sequence) --> ifilter object\nfilecmp.ifilterfalse(function or None, sequence) --> ifilterfalse object\nfilecmp.imap(func, *iterables) --> imap object\nfilecmp.izip(iter1 [,iter2 [...]]) --> izip object\nfilecmp.os\nfilecmp.stat\nfilecmp.warnings\nfileinput.DEFAULT_BUFSIZE\nfileinput.FileInput(??)\nfileinput.close(??)\nfileinput.filelineno(??)\nfileinput.filename(??)\nfileinput.input([files[, inplace[, backup]]])\nfileinput.isfirstline(??)\nfileinput.isstdin(??)\nfileinput.lineno(??)\nfileinput.nextfile(??)\nfileinput.os\nfileinput.sys\nfilter(function or None, sequence) -> list, tuple, or string\nfloat(x) -> floating point number\nfnmatch.filter(??)\nfnmatch.fnmatch(??)\nfnmatch.fnmatchcase(??)\nfnmatch.re\nfnmatch.translate(??)\nformatter.AS_IS\nformatter.AbstractFormatter(??)\nformatter.AbstractWriter(??)\nformatter.DumbWriter(??)\nformatter.NullFormatter(??)\nformatter.NullWriter(??)\nformatter.sys\nformatter.test(??)\nfpformat.NotANumber(??)\nfpformat.decoder\nfpformat.extract(??)\nfpformat.fix(??)\nfpformat.re\nfpformat.roundfrac(??)\nfpformat.sci(??)\nfpformat.test(??)\nfpformat.unexpo(??)\nfrozenset(iterable) --> frozenset object\nftplib.CRLF\nftplib.Error(??)\nftplib.FTP(??)\nftplib.FTP_PORT\nftplib.MSG_OOB\nftplib.Netrc(??)\nftplib.all_errors\nftplib.error_perm(??)\nftplib.error_proto(??)\nftplib.error_reply(??)\nftplib.error_temp(??)\nftplib.ftpcp(??)\nftplib.os\nftplib.parse150(??)\nftplib.parse227(??)\nftplib.parse229(??)\nftplib.parse257(??)\nftplib.print_line(??)\nftplib.socket\nftplib.sys\nftplib.test(??)\ngc.DEBUG_COLLECTABLE\ngc.DEBUG_INSTANCES\ngc.DEBUG_LEAK\ngc.DEBUG_OBJECTS\ngc.DEBUG_SAVEALL\ngc.DEBUG_STATS\ngc.DEBUG_UNCOLLECTABLE\ngc.collect() -> n\ngc.disable() -> None\ngc.enable() -> None\ngc.garbage\ngc.get_debug() -> flags\ngc.get_objects() -> [...]\ngc.get_referents(*objs) -> list\ngc.get_referrers(*objs) -> list\ngc.get_threshold() -> (threshold0, threshold1, threshold2)\ngc.isenabled() -> status\ngc.set_debug(flags) -> None\ngc.set_threshold(threshold0, [threshold1, threshold2]) -> None\ngdbm.error(??)\ngdbm.open(filename, [flags, [mode]])  -> dbm_object\ngdbm.open_flags\ngetattr(object, name[, default]) -> value\ngetopt.GetoptError(??)\ngetopt.do_longs(??)\ngetopt.do_shorts(??)\ngetopt.error(??)\ngetopt.getopt(args, options[, long_options]) -> opts, args\ngetopt.gnu_getopt(??)\ngetopt.long_has_args(??)\ngetopt.os\ngetopt.short_has_arg(??)\ngetpass.default_getpass(??)\ngetpass.getpass(??)\ngetpass.getuser(??)\ngetpass.sys\ngetpass.termios\ngetpass.unix_getpass(??)\ngetpass.win_getpass(??)\ngettext.Catalog(??)\ngettext.ENOENT\ngettext.GNUTranslations(??)\ngettext.NullTranslations(??)\ngettext.bind_textdomain_codeset(??)\ngettext.bindtextdomain(??)\ngettext.c2py(??)\ngettext.copy\ngettext.dgettext(??)\ngettext.dngettext(??)\ngettext.find(??)\ngettext.gettext(??)\ngettext.install(??)\ngettext.ldgettext(??)\ngettext.ldngettext(??)\ngettext.lgettext(??)\ngettext.lngettext(??)\ngettext.locale\ngettext.ngettext(??)\ngettext.os\ngettext.re\ngettext.struct\ngettext.sys\ngettext.test(??)\ngettext.textdomain(??)\ngettext.translation(??)\nglob.fnmatch\nglob.glob(??)\nglob.glob1(??)\nglob.has_magic(??)\nglob.magic_check\nglob.os\nglob.re\nglobals() -> dictionary\ngopherlib.A_BINARY\ngopherlib.A_CALENDAR\ngopherlib.A_CSO\ngopherlib.A_DUPLICATE\ngopherlib.A_ERROR\ngopherlib.A_EVENT\ngopherlib.A_GIF\ngopherlib.A_HTML\ngopherlib.A_IMAGE\ngopherlib.A_INDEX\ngopherlib.A_MACBINHEX\ngopherlib.A_MENU\ngopherlib.A_MIME\ngopherlib.A_PCBINHEX\ngopherlib.A_PLUS_IMAGE\ngopherlib.A_PLUS_MOVIE\ngopherlib.A_PLUS_SOUND\ngopherlib.A_QUERY\ngopherlib.A_SOUND\ngopherlib.A_TELNET\ngopherlib.A_TEXT\ngopherlib.A_TN3270\ngopherlib.A_UUENCODED\ngopherlib.A_WHOIS\ngopherlib.A_WWW\ngopherlib.CRLF\ngopherlib.DEF_HOST\ngopherlib.DEF_PORT\ngopherlib.DEF_SELECTOR\ngopherlib.TAB\ngopherlib.get_alt_binary(??)\ngopherlib.get_alt_textfile(??)\ngopherlib.get_binary(??)\ngopherlib.get_directory(??)\ngopherlib.get_textfile(??)\ngopherlib.path_to_datatype_name(??)\ngopherlib.path_to_selector(??)\ngopherlib.send_query(??)\ngopherlib.send_selector(??)\ngopherlib.test(??)\ngopherlib.type_to_name(??)\ngrp.getgrall() -> list of tuples\ngrp.getgrgid(id) -> tuple\ngrp.getgrnam(name) -> tuple\ngrp.struct_group\ngzip.FCOMMENT\ngzip.FEXTRA\ngzip.FHCRC\ngzip.FNAME\ngzip.FTEXT\ngzip.GzipFile(??)\ngzip.LOWU32(??)\ngzip.READ\ngzip.U32(??)\ngzip.WRITE\ngzip.open(??)\ngzip.read32(??)\ngzip.struct\ngzip.sys\ngzip.time\ngzip.write32(??)\ngzip.write32u(??)\ngzip.zlib\nhasattr(object, name) -> bool\nhash(object) -> integer\nheapq.bisect\nheapq.heapify\nheapq.heappop\nheapq.heappush\nheapq.heapreplace\nheapq.islice(iterable, [start,] stop [, step]) --> islice object\nheapq.nlargest\nheapq.nsmallest\nheapq.repeat(element [,times]) -> create an iterator which returns the element\nhelp\nhex(number) -> string\nhmac.HMAC(??)\nhmac.digest_size\nhmac.new(??)\nhotshot.Profile(??)\nhotshot.ProfilerError(??)\nhotshot.log\nhotshot.log.ENTER\nhotshot.log.EXIT\nhotshot.log.LINE\nhotshot.log.LogReader(??)\nhotshot.log.WHAT_ADD_INFO\nhotshot.log.WHAT_DEFINE_FILE\nhotshot.log.WHAT_DEFINE_FUNC\nhotshot.log.WHAT_ENTER\nhotshot.log.WHAT_EXIT\nhotshot.log.WHAT_LINENO\nhotshot.log.os\nhotshot.log.parser\nhotshot.log.symbol\nhotshot.log.sys\nhotshot.stats\nhotshot.stats.ENTER\nhotshot.stats.EXIT\nhotshot.stats.FakeCode(??)\nhotshot.stats.FakeFrame(??)\nhotshot.stats.Profile(??)\nhotshot.stats.StatsLoader(??)\nhotshot.stats.hotshot\nhotshot.stats.load(??)\nhotshot.stats.profile\nhotshot.stats.pstats\nhotshot.stones\nhotshot.stones.errno\nhotshot.stones.hotshot\nhotshot.stones.main(??)\nhotshot.stones.os\nhotshot.stones.sys\nhotshot.stones.test\nhtmlentitydefs.codepoint2name\nhtmlentitydefs.entitydefs\nhtmlentitydefs.name2codepoint\nhtmllib.AS_IS\nhtmllib.HTMLParseError(??)\nhtmllib.HTMLParser(??)\nhtmllib.sgmllib\nhtmllib.test(??)\nhttplib.ACCEPTED\nhttplib.BAD_GATEWAY\nhttplib.BAD_REQUEST\nhttplib.BadStatusLine(??)\nhttplib.CONFLICT\nhttplib.CONTINUE\nhttplib.CREATED\nhttplib.CannotSendHeader(??)\nhttplib.CannotSendRequest(??)\nhttplib.EXPECTATION_FAILED\nhttplib.FAILED_DEPENDENCY\nhttplib.FORBIDDEN\nhttplib.FOUND\nhttplib.FakeSocket(??)\nhttplib.GATEWAY_TIMEOUT\nhttplib.GONE\nhttplib.HTTP(??)\nhttplib.HTTPConnection(??)\nhttplib.HTTPException(??)\nhttplib.HTTPMessage(??)\nhttplib.HTTPResponse(??)\nhttplib.HTTPS(??)\nhttplib.HTTPSConnection(??)\nhttplib.HTTPS_PORT\nhttplib.HTTP_PORT\nhttplib.HTTP_VERSION_NOT_SUPPORTED\nhttplib.IM_USED\nhttplib.INSUFFICIENT_STORAGE\nhttplib.INTERNAL_SERVER_ERROR\nhttplib.ImproperConnectionState(??)\nhttplib.IncompleteRead(??)\nhttplib.InvalidURL(??)\nhttplib.LENGTH_REQUIRED\nhttplib.LOCKED\nhttplib.LineAndFileWrapper(??)\nhttplib.MAXAMOUNT\nhttplib.METHOD_NOT_ALLOWED\nhttplib.MOVED_PERMANENTLY\nhttplib.MULTIPLE_CHOICES\nhttplib.MULTI_STATUS\nhttplib.NON_AUTHORITATIVE_INFORMATION\nhttplib.NOT_ACCEPTABLE\nhttplib.NOT_EXTENDED\nhttplib.NOT_FOUND\nhttplib.NOT_IMPLEMENTED\nhttplib.NOT_MODIFIED\nhttplib.NO_CONTENT\nhttplib.NotConnected(??)\nhttplib.OK\nhttplib.PARTIAL_CONTENT\nhttplib.PAYMENT_REQUIRED\nhttplib.PRECONDITION_FAILED\nhttplib.PROCESSING\nhttplib.PROXY_AUTHENTICATION_REQUIRED\nhttplib.REQUESTED_RANGE_NOT_SATISFIABLE\nhttplib.REQUEST_ENTITY_TOO_LARGE\nhttplib.REQUEST_TIMEOUT\nhttplib.REQUEST_URI_TOO_LONG\nhttplib.RESET_CONTENT\nhttplib.ResponseNotReady(??)\nhttplib.SEE_OTHER\nhttplib.SERVICE_UNAVAILABLE\nhttplib.SSLFile(??)\nhttplib.SWITCHING_PROTOCOLS\nhttplib.SharedSocket(??)\nhttplib.SharedSocketClient(??)\nhttplib.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nhttplib.TEMPORARY_REDIRECT\nhttplib.UNAUTHORIZED\nhttplib.UNPROCESSABLE_ENTITY\nhttplib.UNSUPPORTED_MEDIA_TYPE\nhttplib.UPGRADE_REQUIRED\nhttplib.USE_PROXY\nhttplib.UnimplementedFileMode(??)\nhttplib.UnknownProtocol(??)\nhttplib.UnknownTransferEncoding(??)\nhttplib.errno\nhttplib.error(??)\nhttplib.mimetools\nhttplib.socket\nhttplib.test(??)\nhttplib.urlsplit(??)\nid(object) -> integer\nihooks.BUILTIN_MODULE\nihooks.BasicModuleImporter(??)\nihooks.BasicModuleLoader(??)\nihooks.C_BUILTIN\nihooks.C_EXTENSION\nihooks.FROZEN_MODULE\nihooks.FancyModuleLoader(??)\nihooks.Hooks(??)\nihooks.ModuleImporter(??)\nihooks.ModuleLoader(??)\nihooks.PKG_DIRECTORY\nihooks.PY_COMPILED\nihooks.PY_FROZEN\nihooks.PY_SOURCE\nihooks.VERBOSE\nihooks.current_importer\nihooks.default_importer\nihooks.imp\nihooks.install(??)\nihooks.os\nihooks.sys\nihooks.uninstall(??)\nimaplib.AllowedVersions\nimaplib.CRLF\nimaplib.Commands\nimaplib.Continuation\nimaplib.Debug\nimaplib.Flags\nimaplib.IMAP4(??)\nimaplib.IMAP4_PORT\nimaplib.IMAP4_SSL(??)\nimaplib.IMAP4_SSL_PORT\nimaplib.IMAP4_stream(??)\nimaplib.Int2AP(??)\nimaplib.InternalDate\nimaplib.Internaldate2tuple(??)\nimaplib.Literal\nimaplib.MapCRLF\nimaplib.Mon2num\nimaplib.ParseFlags(??)\nimaplib.Response_code\nimaplib.Time2Internaldate(??)\nimaplib.Untagged_response\nimaplib.Untagged_status\nimaplib.binascii\nimaplib.os\nimaplib.random\nimaplib.re\nimaplib.socket\nimaplib.sys\nimaplib.time\nimghdr.test(??)\nimghdr.test_bmp(??)\nimghdr.test_gif(??)\nimghdr.test_jpeg(??)\nimghdr.test_pbm(??)\nimghdr.test_pgm(??)\nimghdr.test_png(??)\nimghdr.test_ppm(??)\nimghdr.test_rast(??)\nimghdr.test_rgb(??)\nimghdr.test_tiff(??)\nimghdr.test_xbm(??)\nimghdr.testall(??)\nimghdr.tests\nimghdr.what(??)\nimp.C_BUILTIN\nimp.C_EXTENSION\nimp.IMP_HOOK\nimp.PKG_DIRECTORY\nimp.PY_CODERESOURCE\nimp.PY_COMPILED\nimp.PY_FROZEN\nimp.PY_RESOURCE\nimp.PY_SOURCE\nimp.SEARCH_ERROR\nimp.acquire_lock() -> None\nimp.find_module(name, [path]) -> (file, filename, (suffix, mode, type))\nimp.get_frozen_object\nimp.get_magic() -> string\nimp.get_suffixes() -> [(suffix, mode, type), ...]\nimp.init_builtin\nimp.init_frozen\nimp.is_builtin\nimp.is_frozen\nimp.load_compiled\nimp.load_dynamic\nimp.load_module(name, file, filename, (suffix, mode, type)) -> module\nimp.load_package\nimp.load_source\nimp.lock_held() -> boolean\nimp.new_module(name) -> module\nimp.release_lock() -> None\nimputil.BuiltinImporter(??)\nimputil.DynLoadSuffixImporter(??)\nimputil.ImportManager(??)\nimputil.Importer(??)\nimputil.imp\nimputil.marshal\nimputil.py_suffix_importer(??)\nimputil.struct\nimputil.sys\ninput([prompt]) -> value\ninspect.BlockFinder(??)\ninspect.CO_NEWLOCALS\ninspect.CO_OPTIMIZED\ninspect.CO_VARARGS\ninspect.CO_VARKEYWORDS\ninspect.EndOfBlock(??)\ninspect.ListReader(??)\ninspect.classify_class_attrs(??)\ninspect.currentframe\ninspect.dis\ninspect.findsource(??)\ninspect.formatargspec(??)\ninspect.formatargvalues(??)\ninspect.getabsfile(??)\ninspect.getargs(??)\ninspect.getargspec(??)\ninspect.getargvalues(??)\ninspect.getblock(??)\ninspect.getclasstree(??)\ninspect.getcomments(??)\ninspect.getdoc(??)\ninspect.getfile(??)\ninspect.getframeinfo(??)\ninspect.getinnerframes(??)\ninspect.getlineno(??)\ninspect.getmembers(??)\ninspect.getmodule(??)\ninspect.getmoduleinfo(??)\ninspect.getmodulename(??)\ninspect.getmro(??)\ninspect.getouterframes(??)\ninspect.getsource(??)\ninspect.getsourcefile(??)\ninspect.getsourcelines(??)\ninspect.imp\ninspect.indentsize(??)\ninspect.isbuiltin(??)\ninspect.isclass(??)\ninspect.iscode(??)\ninspect.isdatadescriptor(??)\ninspect.isframe(??)\ninspect.isfunction(??)\ninspect.ismethod(??)\ninspect.ismethoddescriptor(??)\ninspect.ismodule(??)\ninspect.isroutine(??)\ninspect.istraceback(??)\ninspect.joinseq(??)\ninspect.linecache\ninspect.modulesbyfile\ninspect.os\ninspect.re\ninspect.stack(??)\ninspect.string\ninspect.strseq(??)\ninspect.sys\ninspect.tokenize\ninspect.trace(??)\ninspect.types\ninspect.walktree(??)\nint(x[, base]) -> integer\nintern(string) -> string\nisinstance(object, class-or-type-or-tuple) -> bool\nissubclass(C, B) -> bool\niter(collection) -> iterator\nitertools.chain(*iterables) --> chain object\nitertools.count([firstval]) --> count object\nitertools.cycle(iterable) --> cycle object\nitertools.dropwhile(predicate, iterable) --> dropwhile object\nitertools.groupby(iterable[, keyfunc]) -> create an iterator which returns\nitertools.ifilter(function or None, sequence) --> ifilter object\nitertools.ifilterfalse(function or None, sequence) --> ifilterfalse object\nitertools.imap(func, *iterables) --> imap object\nitertools.islice(iterable, [start,] stop [, step]) --> islice object\nitertools.izip(iter1 [,iter2 [...]]) --> izip object\nitertools.repeat(element [,times]) -> create an iterator which returns the element\nitertools.starmap(function, sequence) --> starmap object\nitertools.takewhile(predicate, iterable) --> takewhile object\nitertools.tee(iterable, n=2) --> tuple of n independent iterators.\nkeyword.iskeyword\nkeyword.kwlist\nkeyword.main(??)\nlen(object) -> integer\nlicense\nlinecache.cache\nlinecache.checkcache(??)\nlinecache.clearcache(??)\nlinecache.getline(??)\nlinecache.getlines(??)\nlinecache.os\nlinecache.sys\nlinecache.updatecache(??)\nlinuxaudiodev.AFMT_A_LAW\nlinuxaudiodev.AFMT_MU_LAW\nlinuxaudiodev.AFMT_S16_BE\nlinuxaudiodev.AFMT_S16_LE\nlinuxaudiodev.AFMT_S16_NE\nlinuxaudiodev.AFMT_S8\nlinuxaudiodev.AFMT_U16_BE\nlinuxaudiodev.AFMT_U16_LE\nlinuxaudiodev.AFMT_U8\nlinuxaudiodev.error(??)\nlinuxaudiodev.open\nlist() -> new list\nlocale.ABDAY_1\nlocale.ABDAY_2\nlocale.ABDAY_3\nlocale.ABDAY_4\nlocale.ABDAY_5\nlocale.ABDAY_6\nlocale.ABDAY_7\nlocale.ABMON_1\nlocale.ABMON_10\nlocale.ABMON_11\nlocale.ABMON_12\nlocale.ABMON_2\nlocale.ABMON_3\nlocale.ABMON_4\nlocale.ABMON_5\nlocale.ABMON_6\nlocale.ABMON_7\nlocale.ABMON_8\nlocale.ABMON_9\nlocale.ALT_DIGITS\nlocale.AM_STR\nlocale.CHAR_MAX\nlocale.CODESET\nlocale.CRNCYSTR\nlocale.DAY_1\nlocale.DAY_2\nlocale.DAY_3\nlocale.DAY_4\nlocale.DAY_5\nlocale.DAY_6\nlocale.DAY_7\nlocale.D_FMT\nlocale.D_T_FMT\nlocale.ERA\nlocale.ERA_D_FMT\nlocale.ERA_D_T_FMT\nlocale.ERA_T_FMT\nlocale.Error(??)\nlocale.LC_ALL\nlocale.LC_COLLATE\nlocale.LC_CTYPE\nlocale.LC_MESSAGES\nlocale.LC_MONETARY\nlocale.LC_NUMERIC\nlocale.LC_TIME\nlocale.MON_1\nlocale.MON_10\nlocale.MON_11\nlocale.MON_12\nlocale.MON_2\nlocale.MON_3\nlocale.MON_4\nlocale.MON_5\nlocale.MON_6\nlocale.MON_7\nlocale.MON_8\nlocale.MON_9\nlocale.NOEXPR\nlocale.PM_STR\nlocale.RADIXCHAR\nlocale.THOUSEP\nlocale.T_FMT\nlocale.T_FMT_AMPM\nlocale.YESEXPR\nlocale.atof(??)\nlocale.atoi(??)\nlocale.bind_textdomain_codeset(domain, codeset) -> string\nlocale.bindtextdomain(domain, dir) -> string\nlocale.dcgettext(domain, msg, category) -> string\nlocale.dgettext(domain, msg) -> string\nlocale.encoding_alias\nlocale.format(??)\nlocale.getdefaultlocale(??)\nlocale.getlocale(??)\nlocale.getpreferredencoding(??)\nlocale.gettext(msg) -> string\nlocale.locale_alias\nlocale.localeconv\nlocale.nl_langinfo(key) -> string\nlocale.normalize(??)\nlocale.resetlocale(??)\nlocale.setlocale(??)\nlocale.str(??)\nlocale.strcoll\nlocale.strxfrm\nlocale.sys\nlocale.textdomain(domain) -> string\nlocale.windows_locale\nlocals() -> dictionary\nlogging.BASIC_FORMAT\nlogging.BufferingFormatter(??)\nlogging.CRITICAL\nlogging.DEBUG\nlogging.ERROR\nlogging.FATAL\nlogging.FileHandler(??)\nlogging.Filter(??)\nlogging.Filterer(??)\nlogging.Formatter(??)\nlogging.Handler(??)\nlogging.INFO\nlogging.LogRecord(??)\nlogging.Logger(??)\nlogging.Manager(??)\nlogging.NOTSET\nlogging.PlaceHolder(??)\nlogging.RootLogger(??)\nlogging.StreamHandler(??)\nlogging.WARN\nlogging.WARNING\nlogging.addLevelName(??)\nlogging.atexit\nlogging.basicConfig(??)\nlogging.cStringIO\nlogging.codecs\nlogging.config\nlogging.config.DEFAULT_LOGGING_CONFIG_PORT\nlogging.config.RESET_ERROR\nlogging.config.StreamRequestHandler(??)\nlogging.config.ThreadingTCPServer(??)\nlogging.config.fileConfig(??)\nlogging.config.listen(??)\nlogging.config.logging\nlogging.config.os\nlogging.config.socket\nlogging.config.stopListening(??)\nlogging.config.string\nlogging.config.struct\nlogging.config.sys\nlogging.config.thread\nlogging.config.threading\nlogging.config.traceback\nlogging.critical(??)\nlogging.currentframe\nlogging.debug(??)\nlogging.disable(??)\nlogging.error(??)\nlogging.exception(??)\nlogging.fatal(??)\nlogging.getLevelName(??)\nlogging.getLogger(??)\nlogging.getLoggerClass(??)\nlogging.handlers\nlogging.handlers.BaseRotatingHandler(??)\nlogging.handlers.BufferingHandler(??)\nlogging.handlers.DEFAULT_HTTP_LOGGING_PORT\nlogging.handlers.DEFAULT_SOAP_LOGGING_PORT\nlogging.handlers.DEFAULT_TCP_LOGGING_PORT\nlogging.handlers.DEFAULT_UDP_LOGGING_PORT\nlogging.handlers.DatagramHandler(??)\nlogging.handlers.HTTPHandler(??)\nlogging.handlers.MemoryHandler(??)\nlogging.handlers.NTEventLogHandler(??)\nlogging.handlers.RotatingFileHandler(??)\nlogging.handlers.SMTPHandler(??)\nlogging.handlers.SYSLOG_UDP_PORT\nlogging.handlers.SocketHandler(??)\nlogging.handlers.SysLogHandler(??)\nlogging.handlers.TimedRotatingFileHandler(??)\nlogging.handlers.cPickle\nlogging.handlers.codecs\nlogging.handlers.glob\nlogging.handlers.logging\nlogging.handlers.os\nlogging.handlers.socket\nlogging.handlers.string\nlogging.handlers.struct\nlogging.handlers.sys\nlogging.handlers.time\nlogging.handlers.types\nlogging.info(??)\nlogging.log(??)\nlogging.makeLogRecord(??)\nlogging.os\nlogging.raiseExceptions\nlogging.root\nlogging.setLoggerClass(??)\nlogging.shutdown(??)\nlogging.string\nlogging.sys\nlogging.thread\nlogging.threading\nlogging.time\nlogging.traceback\nlogging.types\nlogging.warn(??)\nlogging.warning(??)\nlong(x[, base]) -> integer\nmacpath.ST_ATIME\nmacpath.ST_CTIME\nmacpath.ST_DEV\nmacpath.ST_GID\nmacpath.ST_INO\nmacpath.ST_MODE\nmacpath.ST_MTIME\nmacpath.ST_NLINK\nmacpath.ST_SIZE\nmacpath.ST_UID\nmacpath.S_ENFMT\nmacpath.S_IEXEC\nmacpath.S_IFBLK\nmacpath.S_IFCHR\nmacpath.S_IFDIR\nmacpath.S_IFIFO\nmacpath.S_IFLNK\nmacpath.S_IFMT(??)\nmacpath.S_IFREG\nmacpath.S_IFSOCK\nmacpath.S_IMODE(??)\nmacpath.S_IREAD\nmacpath.S_IRGRP\nmacpath.S_IROTH\nmacpath.S_IRUSR\nmacpath.S_IRWXG\nmacpath.S_IRWXO\nmacpath.S_IRWXU\nmacpath.S_ISBLK(??)\nmacpath.S_ISCHR(??)\nmacpath.S_ISDIR(??)\nmacpath.S_ISFIFO(??)\nmacpath.S_ISGID\nmacpath.S_ISLNK(??)\nmacpath.S_ISREG(??)\nmacpath.S_ISSOCK(??)\nmacpath.S_ISUID\nmacpath.S_ISVTX\nmacpath.S_IWGRP\nmacpath.S_IWOTH\nmacpath.S_IWRITE\nmacpath.S_IWUSR\nmacpath.S_IXGRP\nmacpath.S_IXOTH\nmacpath.S_IXUSR\nmacpath.abspath(??)\nmacpath.altsep\nmacpath.basename(??)\nmacpath.commonprefix(??)\nmacpath.curdir\nmacpath.defpath\nmacpath.devnull\nmacpath.dirname(??)\nmacpath.exists(??)\nmacpath.expanduser(??)\nmacpath.expandvars(??)\nmacpath.extsep\nmacpath.getatime(??)\nmacpath.getctime(??)\nmacpath.getmtime(??)\nmacpath.getsize(??)\nmacpath.isabs(??)\nmacpath.isdir(??)\nmacpath.isfile(??)\nmacpath.islink(??)\nmacpath.ismount(??)\nmacpath.join(??)\nmacpath.lexists(??)\nmacpath.norm_error(??)\nmacpath.normcase(??)\nmacpath.normpath(??)\nmacpath.os\nmacpath.pardir\nmacpath.pathsep\nmacpath.realpath(??)\nmacpath.sep\nmacpath.split(??)\nmacpath.splitdrive(??)\nmacpath.splitext(??)\nmacpath.supports_unicode_filenames\nmacpath.walk(??)\nmacurl2path.os\nmacurl2path.pathname2url(??)\nmacurl2path.test(??)\nmacurl2path.url2pathname(??)\nmacurl2path.urllib\nmailbox.BabylMailbox(??)\nmailbox.MHMailbox(??)\nmailbox.Maildir(??)\nmailbox.MmdfMailbox(??)\nmailbox.PortableUnixMailbox(??)\nmailbox.UnixMailbox(??)\nmailbox.os\nmailbox.rfc822\nmailcap.findmatch(??)\nmailcap.findparam(??)\nmailcap.getcaps(??)\nmailcap.listmailcapfiles(??)\nmailcap.lookup(??)\nmailcap.os\nmailcap.parsefield(??)\nmailcap.parseline(??)\nmailcap.readmailcapfile(??)\nmailcap.show(??)\nmailcap.subst(??)\nmailcap.test(??)\nmap(function, sequence[, sequence, ...]) -> list\nmarkupbase.ParserBase(??)\nmarshal.dump\nmarshal.dumps\nmarshal.load\nmarshal.loads\nmarshal.version\nmath.acos(x)\nmath.asin(x)\nmath.atan(x)\nmath.atan2(y, x)\nmath.ceil(x)\nmath.cos(x)\nmath.cosh(x)\nmath.degrees(x) -> converts angle x from radians to degrees\nmath.e\nmath.exp(x)\nmath.fabs(x)\nmath.floor(x)\nmath.fmod(x,y)\nmath.frexp(x)\nmath.hypot(x,y)\nmath.ldexp(x, i) -> x * (2**i)\nmath.log(x[, base]) -> the logarithm of x to the given base.\nmath.log10(x) -> the base 10 logarithm of x.\nmath.modf(x)\nmath.pi\nmath.pow(x,y)\nmath.radians(x) -> converts angle x from degrees to radians\nmath.sin(x)\nmath.sinh(x)\nmath.sqrt(x)\nmath.tan(x)\nmath.tanh(x)\nmax(sequence) -> value\nmd5.MD5Type\nmd5.digest_size\nmd5.md5\nmd5.new([arg]) -> md5 object\nmhlib.Error(??)\nmhlib.FOLDER_PROTECT\nmhlib.Folder(??)\nmhlib.IntSet(??)\nmhlib.MH(??)\nmhlib.MH_PROFILE\nmhlib.MH_SEQUENCES\nmhlib.Message(??)\nmhlib.PATH\nmhlib.SubMessage(??)\nmhlib.bisect\nmhlib.isnumeric(??)\nmhlib.mimetools\nmhlib.multifile\nmhlib.numericprog\nmhlib.os\nmhlib.pickline(??)\nmhlib.re\nmhlib.shutil\nmhlib.sys\nmhlib.test(??)\nmhlib.updateline(??)\nmimetools.Message(??)\nmimetools.choose_boundary(??)\nmimetools.copybinary(??)\nmimetools.copyliteral(??)\nmimetools.decode(??)\nmimetools.decodetab\nmimetools.encode(??)\nmimetools.encodetab\nmimetools.os\nmimetools.pipethrough(??)\nmimetools.pipeto(??)\nmimetools.rfc822\nmimetools.tempfile\nmimetools.uudecode_pipe\nmimetypes.MimeTypes(??)\nmimetypes.add_type(??)\nmimetypes.common_types\nmimetypes.encodings_map\nmimetypes.guess_all_extensions(??)\nmimetypes.guess_extension(??)\nmimetypes.guess_type(??)\nmimetypes.init(??)\nmimetypes.inited\nmimetypes.knownfiles\nmimetypes.os\nmimetypes.posixpath\nmimetypes.read_mime_types(??)\nmimetypes.suffix_map\nmimetypes.types_map\nmimetypes.urllib\nmimify.CHARSET\nmimify.File(??)\nmimify.HeaderFile(??)\nmimify.MAXLEN\nmimify.QUOTE\nmimify.base64_re\nmimify.chrset\nmimify.cte\nmimify.he\nmimify.iso_char\nmimify.mime_char\nmimify.mime_code\nmimify.mime_decode(??)\nmimify.mime_decode_header(??)\nmimify.mime_encode(??)\nmimify.mime_encode_header(??)\nmimify.mime_head\nmimify.mime_header\nmimify.mime_header_char\nmimify.mimify(??)\nmimify.mimify_part(??)\nmimify.mp\nmimify.mv\nmimify.qp\nmimify.re\nmimify.repl\nmimify.sys\nmimify.unmimify(??)\nmimify.unmimify_part(??)\nmin(sequence) -> value\nmmap.ACCESS_COPY\nmmap.ACCESS_READ\nmmap.ACCESS_WRITE\nmmap.MAP_ANON\nmmap.MAP_ANONYMOUS\nmmap.MAP_DENYWRITE\nmmap.MAP_EXECUTABLE\nmmap.MAP_PRIVATE\nmmap.MAP_SHARED\nmmap.PAGESIZE\nmmap.PROT_EXEC\nmmap.PROT_READ\nmmap.PROT_WRITE\nmmap.error(??)\nmmap.mmap\nmodulefinder.AddPackagePath(??)\nmodulefinder.IMPORT_NAME\nmodulefinder.LOAD_CONST\nmodulefinder.Module(??)\nmodulefinder.ModuleFinder(??)\nmodulefinder.READ_MODE\nmodulefinder.ReplacePackage(??)\nmodulefinder.STORE_GLOBAL\nmodulefinder.STORE_NAME\nmodulefinder.STORE_OPS\nmodulefinder.dis\nmodulefinder.imp\nmodulefinder.marshal\nmodulefinder.new\nmodulefinder.os\nmodulefinder.packagePathMap\nmodulefinder.replacePackageMap\nmodulefinder.sys\nmodulefinder.test(??)\nmultifile.Error(??)\nmultifile.MultiFile(??)\nmutex.deque(iterable) --> deque object\nmutex.mutex(??)\nnetrc.NetrcParseError(??)\nnetrc.netrc(??)\nnetrc.os\nnetrc.shlex\nnew.classobj(name, bases, dict)\nnew.code\nnew.function(code, globals[, name[, argdefs[, closure]]])\nnew.instance(class[, dict])\nnew.instancemethod(function, instance, class)\nnew.module(name[, doc])\nnis.cat\nnis.error(??)\nnis.maps\nnis.match\nnntplib.CRLF\nnntplib.LONGRESP\nnntplib.NNTP(??)\nnntplib.NNTPDataError(??)\nnntplib.NNTPError(??)\nnntplib.NNTPPermanentError(??)\nnntplib.NNTPProtocolError(??)\nnntplib.NNTPReplyError(??)\nnntplib.NNTPTemporaryError(??)\nnntplib.NNTP_PORT\nnntplib.error_data(??)\nnntplib.error_perm(??)\nnntplib.error_proto(??)\nnntplib.error_reply(??)\nnntplib.error_temp(??)\nnntplib.re\nnntplib.socket\nntpath.abspath(??)\nntpath.altsep\nntpath.basename(??)\nntpath.commonprefix(??)\nntpath.curdir\nntpath.defpath\nntpath.devnull\nntpath.dirname(??)\nntpath.exists(??)\nntpath.expanduser(??)\nntpath.expandvars(??)\nntpath.extsep\nntpath.getatime(??)\nntpath.getctime(??)\nntpath.getmtime(??)\nntpath.getsize(??)\nntpath.isabs(??)\nntpath.isdir(??)\nntpath.isfile(??)\nntpath.islink(??)\nntpath.ismount(??)\nntpath.join(??)\nntpath.lexists(??)\nntpath.normcase(??)\nntpath.normpath(??)\nntpath.os\nntpath.pardir\nntpath.pathsep\nntpath.realpath(??)\nntpath.sep\nntpath.split(??)\nntpath.splitdrive(??)\nntpath.splitext(??)\nntpath.splitunc(??)\nntpath.stat\nntpath.supports_unicode_filenames\nntpath.sys\nntpath.walk(??)\nnturl2path.pathname2url(??)\nnturl2path.url2pathname(??)\nobject\noct(number) -> string\nopcode.EXTENDED_ARG\nopcode.HAVE_ARGUMENT\nopcode.cmp_op\nopcode.hascompare\nopcode.hasconst\nopcode.hasfree\nopcode.hasjabs\nopcode.hasjrel\nopcode.haslocal\nopcode.hasname\nopcode.opmap\nopcode.opname\nopen\noperator.abs(a) -- Same as abs(a).\noperator.add(a, b) -- Same as a + b.\noperator.and_(a, b) -- Same as a & b.\noperator.attrgetter(attr) --> attrgetter object\noperator.concat(a, b) -- Same as a + b, for a and b sequences.\noperator.contains(a, b) -- Same as b in a (note reversed operands).\noperator.countOf(a, b) -- Return the number of times b occurs in a.\noperator.delitem(a, b) -- Same as del a[b].\noperator.delslice(a, b, c) -- Same as del a[b:c].\noperator.div(a, b) -- Same as a / b when __future__.division is not in effect.\noperator.eq(a, b) -- Same as a==b.\noperator.floordiv(a, b) -- Same as a // b.\noperator.ge(a, b) -- Same as a>=b.\noperator.getitem(a, b) -- Same as a[b].\noperator.getslice(a, b, c) -- Same as a[b:c].\noperator.gt(a, b) -- Same as a>b.\noperator.indexOf(a, b) -- Return the first index of b in a.\noperator.inv(a) -- Same as ~a.\noperator.invert(a) -- Same as ~a.\noperator.isCallable(a) -- Same as callable(a).\noperator.isMappingType(a) -- Return True if a has a mapping type, False otherwise.\noperator.isNumberType(a) -- Return True if a has a numeric type, False otherwise.\noperator.isSequenceType(a) -- Return True if a has a sequence type, False otherwise.\noperator.is_(a, b) -- Same as a is b.\noperator.is_not(a, b) -- Same as a is not b.\noperator.itemgetter(item) --> itemgetter object\noperator.le(a, b) -- Same as a<=b.\noperator.lshift(a, b) -- Same as a << b.\noperator.lt(a, b) -- Same as a<b.\noperator.mod(a, b) -- Same as a % b.\noperator.mul(a, b) -- Same as a * b.\noperator.ne(a, b) -- Same as a!=b.\noperator.neg(a) -- Same as -a.\noperator.not_(a) -- Same as not a.\noperator.or_(a, b) -- Same as a | b.\noperator.pos(a) -- Same as +a.\noperator.pow(a, b) -- Same as a**b.\noperator.repeat(a, b) -- Return a * b, where a is a sequence, and b is an integer.\noperator.rshift(a, b) -- Same as a >> b.\noperator.sequenceIncludes(a, b) -- Same as b in a (note reversed operands; deprecated).\noperator.setitem(a, b, c) -- Same as a[b] = c.\noperator.setslice(a, b, c, d) -- Same as a[b:c] = d.\noperator.sub(a, b) -- Same as a - b.\noperator.truediv(a, b) -- Same as a / b when __future__.division is in effect.\noperator.truth(a) -- Return True if a is true, False otherwise.\noperator.xor(a, b) -- Same as a ^ b.\noptparse.BadOptionError(??)\noptparse.HelpFormatter(??)\noptparse.IndentedHelpFormatter(??)\noptparse.NO_DEFAULT\noptparse.OptParseError(??)\noptparse.Option(??)\noptparse.OptionConflictError(??)\noptparse.OptionContainer(??)\noptparse.OptionError(??)\noptparse.OptionGroup(??)\noptparse.OptionParser(??)\noptparse.OptionValueError(??)\noptparse.SUPPRESS_HELP\noptparse.SUPPRESS_USAGE\noptparse.TitledHelpFormatter(??)\noptparse.Values(??)\noptparse.check_builtin(??)\noptparse.check_choice(??)\noptparse.make_option(??)\noptparse.os\noptparse.sys\noptparse.textwrap\noptparse.types\nord(c) -> integer\nos.EX_CANTCREAT\nos.EX_CONFIG\nos.EX_DATAERR\nos.EX_IOERR\nos.EX_NOHOST\nos.EX_NOINPUT\nos.EX_NOPERM\nos.EX_NOUSER\nos.EX_OK\nos.EX_OSERR\nos.EX_OSFILE\nos.EX_PROTOCOL\nos.EX_SOFTWARE\nos.EX_TEMPFAIL\nos.EX_UNAVAILABLE\nos.EX_USAGE\nos.F_OK\nos.NGROUPS_MAX\nos.O_APPEND\nos.O_CREAT\nos.O_DIRECT\nos.O_DIRECTORY\nos.O_DSYNC\nos.O_EXCL\nos.O_LARGEFILE\nos.O_NDELAY\nos.O_NOCTTY\nos.O_NOFOLLOW\nos.O_NONBLOCK\nos.O_RDONLY\nos.O_RDWR\nos.O_RSYNC\nos.O_SYNC\nos.O_TRUNC\nos.O_WRONLY\nos.P_NOWAIT\nos.P_NOWAITO\nos.P_WAIT\nos.R_OK\nos.TMP_MAX\nos.UserDict\nos.WCONTINUED\nos.WCOREDUMP(status) -> bool\nos.WEXITSTATUS(status) -> integer\nos.WIFCONTINUED(status) -> bool\nos.WIFEXITED(status) -> bool\nos.WIFSIGNALED(status) -> bool\nos.WIFSTOPPED(status) -> bool\nos.WNOHANG\nos.WSTOPSIG(status) -> integer\nos.WTERMSIG(status) -> integer\nos.WUNTRACED\nos.W_OK\nos.X_OK\nos.abort() -> does not return!\nos.access(path, mode) -> 1 if granted, 0 otherwise\nos.altsep\nos.chdir(path)\nos.chmod(path, mode)\nos.chown(path, uid, gid)\nos.chroot(path)\nos.close(fd)\nos.confstr(name) -> string\nos.confstr_names\nos.ctermid() -> string\nos.curdir\nos.defpath\nos.devnull\nos.dup(fd) -> fd2\nos.dup2(old_fd, new_fd)\nos.environ\nos.error(??)\nos.execl(file, *args)\nos.execle(file, *args, env)\nos.execlp(file, *args)\nos.execlpe(file, *args, env)\nos.execv(path, args)\nos.execve(path, args, env)\nos.execvp(??)\nos.execvpe(file, args, env)\nos.extsep\nos.fchdir(fildes)\nos.fdatasync(fildes)\nos.fdopen(fd [, mode='r' [, bufsize]]) -> file_object\nos.fork() -> pid\nos.forkpty() -> (pid, master_fd)\nos.fpathconf(fd, name) -> integer\nos.fstat(fd) -> stat result\nos.fstatvfs(fd) -> statvfs result\nos.fsync(fildes)\nos.ftruncate(fd, length)\nos.getcwd() -> path\nos.getcwdu() -> path\nos.getegid() -> egid\nos.getenv(??)\nos.geteuid() -> euid\nos.getgid() -> gid\nos.getgroups() -> list of group IDs\nos.getloadavg() -> (float, float, float)\nos.getlogin() -> string\nos.getpgid(pid) -> pgid\nos.getpgrp() -> pgrp\nos.getpid() -> pid\nos.getppid() -> ppid\nos.getsid(pid) -> sid\nos.getuid() -> uid\nos.isatty(fd) -> bool\nos.kill(pid, sig)\nos.killpg(pgid, sig)\nos.lchown(path, uid, gid)\nos.linesep\nos.link(src, dst)\nos.listdir(path) -> list_of_strings\nos.lseek(fd, pos, how) -> newpos\nos.lstat(path) -> stat result\nos.major(device) -> major number\nos.makedev(major, minor) -> device number\nos.makedirs(path [, mode=0777])\nos.minor(device) -> minor number\nos.mkdir(path [, mode=0777])\nos.mkfifo(filename [, mode=0666])\nos.mknod(filename [, mode=0600, device])\nos.name\nos.nice(inc) -> new_priority\nos.open(filename, flag [, mode=0777]) -> fd\nos.openpty() -> (master_fd, slave_fd)\nos.pardir\nos.path\nos.pathconf(path, name) -> integer\nos.pathconf_names\nos.pathsep\nos.pipe() -> (read_end, write_end)\nos.popen(command [, mode='r' [, bufsize]]) -> pipe\nos.popen2(??)\nos.popen3(??)\nos.popen4(??)\nos.putenv(key, value)\nos.read(fd, buffersize) -> string\nos.readlink(path) -> path\nos.remove(path)\nos.removedirs(path)\nos.rename(old, new)\nos.renames(old, new)\nos.rmdir(path)\nos.sep\nos.setegid(gid)\nos.seteuid(uid)\nos.setgid(gid)\nos.setgroups(list)\nos.setpgid(pid, pgrp)\nos.setpgrp()\nos.setregid(rgid, egid)\nos.setreuid(ruid, euid)\nos.setsid()\nos.setuid(uid)\nos.spawnl(mode, file, *args) -> integer\nos.spawnle(mode, file, *args, env) -> integer\nos.spawnlp(mode, file, *args) -> integer\nos.spawnlpe(mode, file, *args, env) -> integer\nos.spawnv(mode, file, args) -> integer\nos.spawnve(mode, file, args, env) -> integer\nos.spawnvp(mode, file, args) -> integer\nos.spawnvpe(mode, file, args, env) -> integer\nos.stat(path) -> stat result\nos.stat_float_times([newval]) -> oldval\nos.stat_result\nos.statvfs(path) -> statvfs result\nos.statvfs_result\nos.strerror(code) -> string\nos.symlink(src, dst)\nos.sys\nos.sysconf(name) -> integer\nos.sysconf_names\nos.system(command) -> exit_status\nos.tcgetpgrp(fd) -> pgid\nos.tcsetpgrp(fd, pgid)\nos.tempnam([dir[, prefix]]) -> string\nos.times() -> (utime, stime, cutime, cstime, elapsed_time)\nos.tmpfile() -> file object\nos.tmpnam() -> string\nos.ttyname(fd) -> string\nos.umask(new_mask) -> old_mask\nos.uname() -> (sysname, nodename, release, version, machine)\nos.unlink(path)\nos.unsetenv(key)\nos.urandom(n) -> str\nos.utime(path, (atime, utime))\nos.wait() -> (pid, status)\nos.waitpid(pid, options) -> (pid, status)\nos.walk(??)\nos.write(fd, string) -> byteswritten\nos2emxpath.abspath(??)\nos2emxpath.altsep\nos2emxpath.basename(??)\nos2emxpath.commonprefix(??)\nos2emxpath.curdir\nos2emxpath.defpath\nos2emxpath.devnull\nos2emxpath.dirname(??)\nos2emxpath.exists(??)\nos2emxpath.expanduser(??)\nos2emxpath.expandvars(??)\nos2emxpath.extsep\nos2emxpath.getatime(??)\nos2emxpath.getctime(??)\nos2emxpath.getmtime(??)\nos2emxpath.getsize(??)\nos2emxpath.isabs(??)\nos2emxpath.isdir(??)\nos2emxpath.isfile(??)\nos2emxpath.islink(??)\nos2emxpath.ismount(??)\nos2emxpath.join(??)\nos2emxpath.lexists(??)\nos2emxpath.normcase(??)\nos2emxpath.normpath(??)\nos2emxpath.os\nos2emxpath.pardir\nos2emxpath.pathsep\nos2emxpath.realpath(??)\nos2emxpath.sep\nos2emxpath.split(??)\nos2emxpath.splitdrive(??)\nos2emxpath.splitext(??)\nos2emxpath.splitunc(??)\nos2emxpath.stat\nos2emxpath.supports_unicode_filenames\nos2emxpath.walk(??)\nossaudiodev.AFMT_AC3\nossaudiodev.AFMT_A_LAW\nossaudiodev.AFMT_IMA_ADPCM\nossaudiodev.AFMT_MPEG\nossaudiodev.AFMT_MU_LAW\nossaudiodev.AFMT_QUERY\nossaudiodev.AFMT_S16_BE\nossaudiodev.AFMT_S16_LE\nossaudiodev.AFMT_S16_NE\nossaudiodev.AFMT_S8\nossaudiodev.AFMT_U16_BE\nossaudiodev.AFMT_U16_LE\nossaudiodev.AFMT_U8\nossaudiodev.OSSAudioError(??)\nossaudiodev.SNDCTL_COPR_HALT\nossaudiodev.SNDCTL_COPR_LOAD\nossaudiodev.SNDCTL_COPR_RCODE\nossaudiodev.SNDCTL_COPR_RCVMSG\nossaudiodev.SNDCTL_COPR_RDATA\nossaudiodev.SNDCTL_COPR_RESET\nossaudiodev.SNDCTL_COPR_RUN\nossaudiodev.SNDCTL_COPR_SENDMSG\nossaudiodev.SNDCTL_COPR_WCODE\nossaudiodev.SNDCTL_COPR_WDATA\nossaudiodev.SNDCTL_DSP_BIND_CHANNEL\nossaudiodev.SNDCTL_DSP_CHANNELS\nossaudiodev.SNDCTL_DSP_GETBLKSIZE\nossaudiodev.SNDCTL_DSP_GETCAPS\nossaudiodev.SNDCTL_DSP_GETCHANNELMASK\nossaudiodev.SNDCTL_DSP_GETFMTS\nossaudiodev.SNDCTL_DSP_GETIPTR\nossaudiodev.SNDCTL_DSP_GETISPACE\nossaudiodev.SNDCTL_DSP_GETODELAY\nossaudiodev.SNDCTL_DSP_GETOPTR\nossaudiodev.SNDCTL_DSP_GETOSPACE\nossaudiodev.SNDCTL_DSP_GETSPDIF\nossaudiodev.SNDCTL_DSP_GETTRIGGER\nossaudiodev.SNDCTL_DSP_MAPINBUF\nossaudiodev.SNDCTL_DSP_MAPOUTBUF\nossaudiodev.SNDCTL_DSP_NONBLOCK\nossaudiodev.SNDCTL_DSP_POST\nossaudiodev.SNDCTL_DSP_PROFILE\nossaudiodev.SNDCTL_DSP_RESET\nossaudiodev.SNDCTL_DSP_SAMPLESIZE\nossaudiodev.SNDCTL_DSP_SETDUPLEX\nossaudiodev.SNDCTL_DSP_SETFMT\nossaudiodev.SNDCTL_DSP_SETFRAGMENT\nossaudiodev.SNDCTL_DSP_SETSPDIF\nossaudiodev.SNDCTL_DSP_SETSYNCRO\nossaudiodev.SNDCTL_DSP_SETTRIGGER\nossaudiodev.SNDCTL_DSP_SPEED\nossaudiodev.SNDCTL_DSP_STEREO\nossaudiodev.SNDCTL_DSP_SUBDIVIDE\nossaudiodev.SNDCTL_DSP_SYNC\nossaudiodev.SNDCTL_FM_4OP_ENABLE\nossaudiodev.SNDCTL_FM_LOAD_INSTR\nossaudiodev.SNDCTL_MIDI_INFO\nossaudiodev.SNDCTL_MIDI_MPUCMD\nossaudiodev.SNDCTL_MIDI_MPUMODE\nossaudiodev.SNDCTL_MIDI_PRETIME\nossaudiodev.SNDCTL_SEQ_CTRLRATE\nossaudiodev.SNDCTL_SEQ_GETINCOUNT\nossaudiodev.SNDCTL_SEQ_GETOUTCOUNT\nossaudiodev.SNDCTL_SEQ_GETTIME\nossaudiodev.SNDCTL_SEQ_NRMIDIS\nossaudiodev.SNDCTL_SEQ_NRSYNTHS\nossaudiodev.SNDCTL_SEQ_OUTOFBAND\nossaudiodev.SNDCTL_SEQ_PANIC\nossaudiodev.SNDCTL_SEQ_PERCMODE\nossaudiodev.SNDCTL_SEQ_RESET\nossaudiodev.SNDCTL_SEQ_RESETSAMPLES\nossaudiodev.SNDCTL_SEQ_SYNC\nossaudiodev.SNDCTL_SEQ_TESTMIDI\nossaudiodev.SNDCTL_SEQ_THRESHOLD\nossaudiodev.SNDCTL_SYNTH_CONTROL\nossaudiodev.SNDCTL_SYNTH_ID\nossaudiodev.SNDCTL_SYNTH_INFO\nossaudiodev.SNDCTL_SYNTH_MEMAVL\nossaudiodev.SNDCTL_SYNTH_REMOVESAMPLE\nossaudiodev.SNDCTL_TMR_CONTINUE\nossaudiodev.SNDCTL_TMR_METRONOME\nossaudiodev.SNDCTL_TMR_SELECT\nossaudiodev.SNDCTL_TMR_SOURCE\nossaudiodev.SNDCTL_TMR_START\nossaudiodev.SNDCTL_TMR_STOP\nossaudiodev.SNDCTL_TMR_TEMPO\nossaudiodev.SNDCTL_TMR_TIMEBASE\nossaudiodev.SOUND_MIXER_ALTPCM\nossaudiodev.SOUND_MIXER_BASS\nossaudiodev.SOUND_MIXER_CD\nossaudiodev.SOUND_MIXER_DIGITAL1\nossaudiodev.SOUND_MIXER_DIGITAL2\nossaudiodev.SOUND_MIXER_DIGITAL3\nossaudiodev.SOUND_MIXER_IGAIN\nossaudiodev.SOUND_MIXER_IMIX\nossaudiodev.SOUND_MIXER_LINE\nossaudiodev.SOUND_MIXER_LINE1\nossaudiodev.SOUND_MIXER_LINE2\nossaudiodev.SOUND_MIXER_LINE3\nossaudiodev.SOUND_MIXER_MIC\nossaudiodev.SOUND_MIXER_MONITOR\nossaudiodev.SOUND_MIXER_NRDEVICES\nossaudiodev.SOUND_MIXER_OGAIN\nossaudiodev.SOUND_MIXER_PCM\nossaudiodev.SOUND_MIXER_PHONEIN\nossaudiodev.SOUND_MIXER_PHONEOUT\nossaudiodev.SOUND_MIXER_RADIO\nossaudiodev.SOUND_MIXER_RECLEV\nossaudiodev.SOUND_MIXER_SPEAKER\nossaudiodev.SOUND_MIXER_SYNTH\nossaudiodev.SOUND_MIXER_TREBLE\nossaudiodev.SOUND_MIXER_VIDEO\nossaudiodev.SOUND_MIXER_VOLUME\nossaudiodev.control_labels\nossaudiodev.control_names\nossaudiodev.error(??)\nossaudiodev.open\nossaudiodev.openmixer\nparser.ASTType\nparser.ParserError(??)\nparser.STType\nparser.ast2list\nparser.ast2tuple\nparser.compileast\nparser.compilest\nparser.expr\nparser.isexpr\nparser.issuite\nparser.sequence2ast\nparser.sequence2st\nparser.st2list\nparser.st2tuple\nparser.suite\nparser.tuple2ast\nparser.tuple2st\npdb.Pdb(??)\npdb.Repr(??)\npdb.TESTCMD\npdb.bdb\npdb.cmd\npdb.find_function(??)\npdb.help(??)\npdb.line_prefix\npdb.linecache\npdb.main(??)\npdb.os\npdb.pm(??)\npdb.post_mortem(??)\npdb.pprint\npdb.re\npdb.run(??)\npdb.runcall(??)\npdb.runctx(??)\npdb.runeval(??)\npdb.set_trace(??)\npdb.sys\npdb.test(??)\npdb.traceback\npickle.APPEND\npickle.APPENDS\npickle.BINFLOAT\npickle.BINGET\npickle.BININT\npickle.BININT1\npickle.BININT2\npickle.BINPERSID\npickle.BINPUT\npickle.BINSTRING\npickle.BINUNICODE\npickle.BUILD\npickle.BooleanType\npickle.BufferType\npickle.BuiltinFunctionType\npickle.BuiltinMethodType\npickle.ClassType\npickle.CodeType\npickle.ComplexType\npickle.DICT\npickle.DUP\npickle.DictProxyType\npickle.DictType\npickle.DictionaryType\npickle.EMPTY_DICT\npickle.EMPTY_LIST\npickle.EMPTY_TUPLE\npickle.EXT1\npickle.EXT2\npickle.EXT4\npickle.EllipsisType\npickle.FALSE\npickle.FLOAT\npickle.FileType\npickle.FloatType\npickle.FrameType\npickle.FunctionType\npickle.GET\npickle.GLOBAL\npickle.GeneratorType\npickle.HIGHEST_PROTOCOL\npickle.INST\npickle.INT\npickle.InstanceType\npickle.IntType\npickle.LIST\npickle.LONG\npickle.LONG1\npickle.LONG4\npickle.LONG_BINGET\npickle.LONG_BINPUT\npickle.LambdaType\npickle.ListType\npickle.LongType\npickle.MARK\npickle.MethodType\npickle.ModuleType\npickle.NEWFALSE\npickle.NEWOBJ\npickle.NEWTRUE\npickle.NONE\npickle.NoneType\npickle.NotImplementedType\npickle.OBJ\npickle.ObjectType\npickle.PERSID\npickle.POP\npickle.POP_MARK\npickle.PROTO\npickle.PUT\npickle.PickleError(??)\npickle.Pickler(??)\npickle.PicklingError(??)\npickle.PyStringMap\npickle.REDUCE\npickle.SETITEM\npickle.SETITEMS\npickle.SHORT_BINSTRING\npickle.STOP\npickle.STRING\npickle.SliceType\npickle.StringIO([s]) -- Return a StringIO-like stream for reading or writing\npickle.StringType\npickle.StringTypes\npickle.TRUE\npickle.TUPLE\npickle.TUPLE1\npickle.TUPLE2\npickle.TUPLE3\npickle.TracebackType\npickle.TupleType\npickle.TypeType\npickle.UNICODE\npickle.UnboundMethodType\npickle.UnicodeType\npickle.Unpickler(??)\npickle.UnpicklingError(??)\npickle.XRangeType\npickle.classmap\npickle.compatible_formats\npickle.decode_long(??)\npickle.dispatch_table\npickle.dump(??)\npickle.dumps(??)\npickle.encode_long(??)\npickle.format_version\npickle.load(??)\npickle.loads(??)\npickle.marshal\npickle.mloads\npickle.re\npickle.struct\npickle.sys\npickle.warnings\npickle.whichmodule(??)\npickletools.ArgumentDescriptor\npickletools.OpcodeInfo\npickletools.StackObject\npickletools.TAKEN_FROM_ARGUMENT1\npickletools.TAKEN_FROM_ARGUMENT4\npickletools.UP_TO_NEWLINE\npickletools.anyobject\npickletools.code2op\npickletools.decimalnl_long\npickletools.decimalnl_short\npickletools.decode_long(??)\npickletools.dis(??)\npickletools.float8\npickletools.floatnl\npickletools.genops(??)\npickletools.int4\npickletools.long1\npickletools.long4\npickletools.markobject\npickletools.opcodes\npickletools.pybool\npickletools.pydict\npickletools.pyfloat\npickletools.pyint\npickletools.pyinteger_or_bool\npickletools.pylist\npickletools.pylong\npickletools.pynone\npickletools.pystring\npickletools.pytuple\npickletools.pyunicode\npickletools.read_decimalnl_long(??)\npickletools.read_decimalnl_short(??)\npickletools.read_float8(??)\npickletools.read_floatnl(??)\npickletools.read_int4(??)\npickletools.read_long1(??)\npickletools.read_long4(??)\npickletools.read_string1(??)\npickletools.read_string4(??)\npickletools.read_stringnl(??)\npickletools.read_stringnl_noescape(??)\npickletools.read_stringnl_noescape_pair(??)\npickletools.read_uint1(??)\npickletools.read_uint2(??)\npickletools.read_unicodestring4(??)\npickletools.read_unicodestringnl(??)\npickletools.stackslice\npickletools.string1\npickletools.string4\npickletools.stringnl\npickletools.stringnl_noescape\npickletools.stringnl_noescape_pair\npickletools.uint1\npickletools.uint2\npickletools.unicodestring4\npickletools.unicodestringnl\npipes.FILEIN_FILEOUT\npipes.FILEIN_STDOUT\npipes.SINK\npipes.SOURCE\npipes.STDIN_FILEOUT\npipes.STDIN_STDOUT\npipes.Template(??)\npipes.makepipeline(??)\npipes.os\npipes.quote(??)\npipes.re\npipes.stepkinds\npipes.string\npipes.tempfile\npipes.test(??)\npkgutil.extend_path(??)\npkgutil.os\npkgutil.sys\nplatform.architecture(??)\nplatform.dist(??)\nplatform.java_ver(??)\nplatform.libc_ver(??)\nplatform.mac_ver(??)\nplatform.machine(??)\nplatform.node(??)\nplatform.os\nplatform.platform(??)\nplatform.popen(??)\nplatform.processor(??)\nplatform.python_build(??)\nplatform.python_compiler(??)\nplatform.python_version(??)\nplatform.python_version_tuple(??)\nplatform.re\nplatform.release(??)\nplatform.string\nplatform.sys\nplatform.system(??)\nplatform.system_alias(??)\nplatform.uname(??)\nplatform.version(??)\nplatform.win32_ver(??)\npopen2.MAXFD\npopen2.Popen3(??)\npopen2.Popen4(??)\npopen2.os\npopen2.popen2(??)\npopen2.popen3(??)\npopen2.popen4(??)\npopen2.sys\npoplib.CR\npoplib.CRLF\npoplib.LF\npoplib.POP3(??)\npoplib.POP3_PORT\npoplib.POP3_SSL(??)\npoplib.POP3_SSL_PORT\npoplib.error_proto(??)\npoplib.re\npoplib.socket\nposix.EX_CANTCREAT\nposix.EX_CONFIG\nposix.EX_DATAERR\nposix.EX_IOERR\nposix.EX_NOHOST\nposix.EX_NOINPUT\nposix.EX_NOPERM\nposix.EX_NOUSER\nposix.EX_OK\nposix.EX_OSERR\nposix.EX_OSFILE\nposix.EX_PROTOCOL\nposix.EX_SOFTWARE\nposix.EX_TEMPFAIL\nposix.EX_UNAVAILABLE\nposix.EX_USAGE\nposix.F_OK\nposix.NGROUPS_MAX\nposix.O_APPEND\nposix.O_CREAT\nposix.O_DIRECT\nposix.O_DIRECTORY\nposix.O_DSYNC\nposix.O_EXCL\nposix.O_LARGEFILE\nposix.O_NDELAY\nposix.O_NOCTTY\nposix.O_NOFOLLOW\nposix.O_NONBLOCK\nposix.O_RDONLY\nposix.O_RDWR\nposix.O_RSYNC\nposix.O_SYNC\nposix.O_TRUNC\nposix.O_WRONLY\nposix.R_OK\nposix.TMP_MAX\nposix.WCONTINUED\nposix.WCOREDUMP(status) -> bool\nposix.WEXITSTATUS(status) -> integer\nposix.WIFCONTINUED(status) -> bool\nposix.WIFEXITED(status) -> bool\nposix.WIFSIGNALED(status) -> bool\nposix.WIFSTOPPED(status) -> bool\nposix.WNOHANG\nposix.WSTOPSIG(status) -> integer\nposix.WTERMSIG(status) -> integer\nposix.WUNTRACED\nposix.W_OK\nposix.X_OK\nposix.abort() -> does not return!\nposix.access(path, mode) -> 1 if granted, 0 otherwise\nposix.chdir(path)\nposix.chmod(path, mode)\nposix.chown(path, uid, gid)\nposix.chroot(path)\nposix.close(fd)\nposix.confstr(name) -> string\nposix.confstr_names\nposix.ctermid() -> string\nposix.dup(fd) -> fd2\nposix.dup2(old_fd, new_fd)\nposix.environ\nposix.error(??)\nposix.execv(path, args)\nposix.execve(path, args, env)\nposix.fchdir(fildes)\nposix.fdatasync(fildes)\nposix.fdopen(fd [, mode='r' [, bufsize]]) -> file_object\nposix.fork() -> pid\nposix.forkpty() -> (pid, master_fd)\nposix.fpathconf(fd, name) -> integer\nposix.fstat(fd) -> stat result\nposix.fstatvfs(fd) -> statvfs result\nposix.fsync(fildes)\nposix.ftruncate(fd, length)\nposix.getcwd() -> path\nposix.getcwdu() -> path\nposix.getegid() -> egid\nposix.geteuid() -> euid\nposix.getgid() -> gid\nposix.getgroups() -> list of group IDs\nposix.getloadavg() -> (float, float, float)\nposix.getlogin() -> string\nposix.getpgid(pid) -> pgid\nposix.getpgrp() -> pgrp\nposix.getpid() -> pid\nposix.getppid() -> ppid\nposix.getsid(pid) -> sid\nposix.getuid() -> uid\nposix.isatty(fd) -> bool\nposix.kill(pid, sig)\nposix.killpg(pgid, sig)\nposix.lchown(path, uid, gid)\nposix.link(src, dst)\nposix.listdir(path) -> list_of_strings\nposix.lseek(fd, pos, how) -> newpos\nposix.lstat(path) -> stat result\nposix.major(device) -> major number\nposix.makedev(major, minor) -> device number\nposix.minor(device) -> minor number\nposix.mkdir(path [, mode=0777])\nposix.mkfifo(filename [, mode=0666])\nposix.mknod(filename [, mode=0600, device])\nposix.nice(inc) -> new_priority\nposix.open(filename, flag [, mode=0777]) -> fd\nposix.openpty() -> (master_fd, slave_fd)\nposix.pathconf(path, name) -> integer\nposix.pathconf_names\nposix.pipe() -> (read_end, write_end)\nposix.popen(command [, mode='r' [, bufsize]]) -> pipe\nposix.putenv(key, value)\nposix.read(fd, buffersize) -> string\nposix.readlink(path) -> path\nposix.remove(path)\nposix.rename(old, new)\nposix.rmdir(path)\nposix.setegid(gid)\nposix.seteuid(uid)\nposix.setgid(gid)\nposix.setgroups(list)\nposix.setpgid(pid, pgrp)\nposix.setpgrp()\nposix.setregid(rgid, egid)\nposix.setreuid(ruid, euid)\nposix.setsid()\nposix.setuid(uid)\nposix.stat(path) -> stat result\nposix.stat_float_times([newval]) -> oldval\nposix.stat_result\nposix.statvfs(path) -> statvfs result\nposix.statvfs_result\nposix.strerror(code) -> string\nposix.symlink(src, dst)\nposix.sysconf(name) -> integer\nposix.sysconf_names\nposix.system(command) -> exit_status\nposix.tcgetpgrp(fd) -> pgid\nposix.tcsetpgrp(fd, pgid)\nposix.tempnam([dir[, prefix]]) -> string\nposix.times() -> (utime, stime, cutime, cstime, elapsed_time)\nposix.tmpfile() -> file object\nposix.tmpnam() -> string\nposix.ttyname(fd) -> string\nposix.umask(new_mask) -> old_mask\nposix.uname() -> (sysname, nodename, release, version, machine)\nposix.unlink(path)\nposix.unsetenv(key)\nposix.utime(path, (atime, utime))\nposix.wait() -> (pid, status)\nposix.waitpid(pid, options) -> (pid, status)\nposix.write(fd, string) -> byteswritten\nposixfile.SEEK_CUR\nposixfile.SEEK_END\nposixfile.SEEK_SET\nposixfile.fileopen(??)\nposixfile.open(??)\nposixpath.abspath(??)\nposixpath.altsep\nposixpath.basename(??)\nposixpath.commonprefix(??)\nposixpath.curdir\nposixpath.defpath\nposixpath.devnull\nposixpath.dirname(??)\nposixpath.exists(??)\nposixpath.expanduser(??)\nposixpath.expandvars(??)\nposixpath.extsep\nposixpath.getatime(??)\nposixpath.getctime(??)\nposixpath.getmtime(??)\nposixpath.getsize(??)\nposixpath.isabs(??)\nposixpath.isdir(??)\nposixpath.isfile(??)\nposixpath.islink(??)\nposixpath.ismount(??)\nposixpath.join(??)\nposixpath.lexists(??)\nposixpath.normcase(??)\nposixpath.normpath(??)\nposixpath.os\nposixpath.pardir\nposixpath.pathsep\nposixpath.realpath(??)\nposixpath.samefile(??)\nposixpath.sameopenfile(??)\nposixpath.samestat(??)\nposixpath.sep\nposixpath.split(??)\nposixpath.splitdrive(??)\nposixpath.splitext(??)\nposixpath.stat\nposixpath.supports_unicode_filenames\nposixpath.walk(??)\npow(x, y[, z]) -> number\npprint.PrettyPrinter(??)\npprint.isreadable(??)\npprint.isrecursive(??)\npprint.pformat(??)\npprint.pprint(??)\npprint.saferepr(??)\nprofile.OptionParser(??)\nprofile.Profile(??)\nprofile.Stats(??)\nprofile.help(??)\nprofile.marshal\nprofile.os\nprofile.run(??)\nprofile.runctx(??)\nprofile.sys\nprofile.time\nproperty(fget=None, fset=None, fdel=None, doc=None) -> property attribute\npstats.Stats(??)\npstats.TupleComp(??)\npstats.add_callers(??)\npstats.add_func_stats(??)\npstats.count_calls(??)\npstats.f8(??)\npstats.func_get_function_name(??)\npstats.func_std_string(??)\npstats.func_strip_path(??)\npstats.marshal\npstats.os\npstats.re\npstats.time\npty.CHILD\npty.STDERR_FILENO\npty.STDIN_FILENO\npty.STDOUT_FILENO\npty.fork() -> (pid, master_fd)\npty.master_open() -> (master_fd, slave_name)\npty.openpty() -> (master_fd, slave_fd)\npty.os\npty.select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\npty.slave_open(tty_name) -> slave_fd\npty.spawn(??)\npty.tty\npwd.getpwall() -> list_of_entries\npwd.getpwnam(name) -> (pw_name,pw_passwd,pw_uid,\npwd.getpwuid(uid) -> (pw_name,pw_passwd,pw_uid,\npwd.struct_passwd\npwd.struct_pwent\npy_compile.MAGIC\npy_compile.PyCompileError(??)\npy_compile.compile(??)\npy_compile.imp\npy_compile.main(??)\npy_compile.marshal\npy_compile.os\npy_compile.set_creator_type(??)\npy_compile.sys\npy_compile.traceback\npy_compile.wr_long(??)\npyclbr.Class(??)\npyclbr.DEDENT\npyclbr.Function(??)\npyclbr.NAME\npyclbr.NEWLINE\npyclbr.imp\npyclbr.itemgetter(item) --> itemgetter object\npyclbr.readmodule(??)\npyclbr.readmodule_ex(??)\npyclbr.sys\npyclbr.tokenize\npydoc.Doc(??)\npydoc.ErrorDuringImport(??)\npydoc.HTMLDoc(??)\npydoc.HTMLRepr(??)\npydoc.Helper(??)\npydoc.ModuleScanner(??)\npydoc.Repr(??)\npydoc.Scanner(??)\npydoc.TextDoc(??)\npydoc.TextRepr(??)\npydoc.allmethods(??)\npydoc.apropos(??)\npydoc.classname(??)\npydoc.cli(??)\npydoc.cram(??)\npydoc.deque(iterable) --> deque object\npydoc.describe(??)\npydoc.doc(??)\npydoc.expandtabs(s [,tabsize]) -> string\npydoc.find(s, sub [,start [,end]]) -> in\npydoc.getdoc(??)\npydoc.getpager(??)\npydoc.gui(??)\npydoc.help\npydoc.html\npydoc.imp\npydoc.importfile(??)\npydoc.inspect\npydoc.isdata(??)\npydoc.ispackage(??)\npydoc.ispath(??)\npydoc.join(list [,sep]) -> string\npydoc.locate(??)\npydoc.lower(s) -> string\npydoc.os\npydoc.pager(??)\npydoc.pathdirs(??)\npydoc.pipepager(??)\npydoc.plain(??)\npydoc.plainpager(??)\npydoc.re\npydoc.replace(??)\npydoc.resolve(??)\npydoc.rfind(s, sub [,start [,end]]) -> int\npydoc.rstrip(s [,chars]) -> string\npydoc.safeimport(??)\npydoc.serve(??)\npydoc.split(s [,sep [,maxsplit]]) -> list of strings\npydoc.splitdoc(??)\npydoc.strip(s [,chars]) -> string\npydoc.stripid(??)\npydoc.synopsis(??)\npydoc.sys\npydoc.tempfilepager(??)\npydoc.text\npydoc.ttypager(??)\npydoc.types\npydoc.visiblename(??)\npydoc.writedoc(??)\npydoc.writedocs(??)\npyexpat.EXPAT_VERSION\npyexpat.ErrorString(errno) -> string\npyexpat.ExpatError(??)\npyexpat.ParserCreate([encoding[, namespace_separator]]) -> parser\npyexpat.XMLParserType\npyexpat.XML_PARAM_ENTITY_PARSING_ALWAYS\npyexpat.XML_PARAM_ENTITY_PARSING_NEVER\npyexpat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE\npyexpat.error(??)\npyexpat.errors\npyexpat.features\npyexpat.model\npyexpat.native_encoding\npyexpat.version_info\nquit\nquopri.EMPTYSTRING\nquopri.ESCAPE\nquopri.HEX\nquopri.MAXLINESIZE\nquopri.a2b_qp\nquopri.b2a_qp(data, quotetabs=0, istext=1, header=0) -> s;\nquopri.decode(??)\nquopri.decodestring(??)\nquopri.encode(??)\nquopri.encodestring(??)\nquopri.ishex(??)\nquopri.main(??)\nquopri.needsquoting(??)\nquopri.quote(??)\nquopri.unhex(??)\nrandom.BPF\nrandom.LOG4\nrandom.NV_MAGICCONST\nrandom.RECIP_BPF\nrandom.Random\nrandom.SG_MAGICCONST\nrandom.SystemRandom\nrandom.TWOPI\nrandom.WichmannHill\nrandom.betavariate\nrandom.choice\nrandom.expovariate\nrandom.gammavariate\nrandom.gauss\nrandom.getrandbits(k) -> x.  Generates a long int with k random bits.\nrandom.getstate\nrandom.jumpahead(int) -> None.  Create new state from existing state and integer.\nrandom.lognormvariate\nrandom.normalvariate\nrandom.paretovariate\nrandom.randint\nrandom.random() -> x in the interval [0, 1).\nrandom.randrange\nrandom.sample\nrandom.seed\nrandom.setstate\nrandom.shuffle\nrandom.uniform\nrandom.vonmisesvariate\nrandom.weibullvariate\nrange([start,] stop[, step]) -> list of integers\nraw_input([prompt]) -> string\nre.DOTALL\nre.I\nre.IGNORECASE\nre.L\nre.LOCALE\nre.M\nre.MULTILINE\nre.S\nre.U\nre.UNICODE\nre.VERBOSE\nre.X\nre.compile(??)\nre.engine\nre.error(??)\nre.escape(??)\nre.findall(??)\nre.finditer(??)\nre.match(??)\nre.purge(??)\nre.search(??)\nre.split(??)\nre.sub(??)\nre.subn(??)\nre.template(??)\nreadline.add_history(string) -> None\nreadline.clear_history() -> None\nreadline.get_begidx() -> int\nreadline.get_completer() -> function\nreadline.get_completer_delims() -> string\nreadline.get_current_history_length() -> integer\nreadline.get_endidx() -> int\nreadline.get_history_item() -> string\nreadline.get_history_length() -> int\nreadline.get_line_buffer() -> string\nreadline.insert_text(string) -> None\nreadline.parse_and_bind(string) -> None\nreadline.read_history_file([filename]) -> None\nreadline.read_init_file([filename]) -> None\nreadline.redisplay() -> None\nreadline.remove_history_item(pos) -> None\nreadline.replace_history_item(pos, line) -> None\nreadline.set_completer([function]) -> None\nreadline.set_completer_delims(string) -> None\nreadline.set_history_length(length) -> None\nreadline.set_startup_hook([function]) -> None\nreadline.write_history_file([filename]) -> None\nreconvert.RE_ANSI_HEX\nreconvert.RE_BK_PLUS_QM\nreconvert.RE_CONTEXT_INDEP_OPS\nreconvert.RE_NEWLINE_OR\nreconvert.RE_NO_BK_PARENS\nreconvert.RE_NO_BK_VBAR\nreconvert.RE_NO_GNU_EXTENSIONS\nreconvert.RE_SYNTAX_AWK\nreconvert.RE_SYNTAX_EGREP\nreconvert.RE_SYNTAX_EMACS\nreconvert.RE_SYNTAX_GREP\nreconvert.RE_TIGHT_VBAR\nreconvert.convert(??)\nreconvert.main(??)\nreconvert.mastertable\nreconvert.quote(??)\nreconvert.regex\nreconvert.warnings\nreduce(function, sequence[, initial]) -> value\nregex.casefold\nregex.compile\nregex.error(??)\nregex.get_syntax\nregex.match\nregex.search\nregex.set_syntax\nregex.symcomp\nregex_syntax.RE_ANSI_HEX\nregex_syntax.RE_BK_PLUS_QM\nregex_syntax.RE_CONTEXT_INDEP_OPS\nregex_syntax.RE_NEWLINE_OR\nregex_syntax.RE_NO_BK_PARENS\nregex_syntax.RE_NO_BK_VBAR\nregex_syntax.RE_NO_GNU_EXTENSIONS\nregex_syntax.RE_SYNTAX_AWK\nregex_syntax.RE_SYNTAX_EGREP\nregex_syntax.RE_SYNTAX_EMACS\nregex_syntax.RE_SYNTAX_GREP\nregex_syntax.RE_TIGHT_VBAR\nregsub.cache\nregsub.capwords(??)\nregsub.clear_cache(??)\nregsub.compile(??)\nregsub.expand(??)\nregsub.gsub(??)\nregsub.intsplit(??)\nregsub.regex\nregsub.split(??)\nregsub.splitx(??)\nregsub.sub(??)\nregsub.test(??)\nregsub.warnings\nreload(module) -> module\nrepr(object) -> string\nrepr.Repr(??)\nrepr.aRepr\nrepr.islice(iterable, [start,] stop [, step]) --> islice object\nrepr.repr\nresource.RLIMIT_AS\nresource.RLIMIT_CORE\nresource.RLIMIT_CPU\nresource.RLIMIT_DATA\nresource.RLIMIT_FSIZE\nresource.RLIMIT_MEMLOCK\nresource.RLIMIT_NOFILE\nresource.RLIMIT_NPROC\nresource.RLIMIT_OFILE\nresource.RLIMIT_RSS\nresource.RLIMIT_STACK\nresource.RLIM_INFINITY\nresource.RUSAGE_CHILDREN\nresource.RUSAGE_SELF\nresource.error(??)\nresource.getpagesize\nresource.getrlimit\nresource.getrusage\nresource.setrlimit\nresource.struct_rusage\nreversed(sequence) -> reverse iterator over values of the sequence\nrexec.FileBase(??)\nrexec.FileDelegate(??)\nrexec.FileWrapper(??)\nrexec.RExec(??)\nrexec.RHooks(??)\nrexec.RModuleImporter(??)\nrexec.RModuleLoader(??)\nrexec.TEMPLATE\nrexec.ihooks\nrexec.imp\nrexec.os\nrexec.sys\nrexec.test(??)\nrfc822.AddressList(??)\nrfc822.AddrlistClass(??)\nrfc822.Message(??)\nrfc822.dump_address_pair(??)\nrfc822.formatdate(??)\nrfc822.mktime_tz(??)\nrfc822.parseaddr(??)\nrfc822.parsedate(??)\nrfc822.parsedate_tz(??)\nrfc822.quote(??)\nrfc822.time\nrfc822.unquote(??)\nrlcompleter.Completer(??)\nrlcompleter.get_class_members(??)\nrlcompleter.readline\nrobotparser.Entry(??)\nrobotparser.RobotFileParser(??)\nrobotparser.RuleLine(??)\nrobotparser.URLopener(??)\nrobotparser.debug\nrobotparser.urllib\nrobotparser.urlparse\nround(number[, ndigits]) -> floating point number\nsched.bisect\nsched.scheduler(??)\nselect.POLLERR\nselect.POLLHUP\nselect.POLLIN\nselect.POLLMSG\nselect.POLLNVAL\nselect.POLLOUT\nselect.POLLPRI\nselect.POLLRDBAND\nselect.POLLRDNORM\nselect.POLLWRBAND\nselect.POLLWRNORM\nselect.error(??)\nselect.poll\nselect.select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\nset(iterable) --> set object\nsetattr(object, name, value)\nsets.BaseSet\nsets.ImmutableSet\nsets.Set\nsets.generators\nsets.ifilter(function or None, sequence) --> ifilter object\nsets.ifilterfalse(function or None, sequence) --> ifilterfalse object\nsgmllib.SGMLParseError(??)\nsgmllib.SGMLParser(??)\nsgmllib.TestSGMLParser(??)\nsgmllib.attrfind\nsgmllib.charref\nsgmllib.endbracket\nsgmllib.entityref\nsgmllib.incomplete\nsgmllib.interesting\nsgmllib.markupbase\nsgmllib.piclose\nsgmllib.re\nsgmllib.shorttag\nsgmllib.shorttagopen\nsgmllib.starttagopen\nsgmllib.tagfind\nsgmllib.test(??)\nsha.blocksize\nsha.digest_size\nsha.digestsize\nsha.new\nsha.sha\nshelve.BsdDbShelf(??)\nshelve.DbfilenameShelf(??)\nshelve.Pickler(file, protocol=0) -- Create a pickler.\nshelve.Shelf(??)\nshelve.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nshelve.Unpickler(file) -- Create an unpickler.\nshelve.UserDict\nshelve.open(??)\nshelve.warnings\nshlex.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nshlex.deque(iterable) --> deque object\nshlex.os\nshlex.shlex(??)\nshlex.split(??)\nshlex.sys\nshutil.Error(??)\nshutil.abspath(??)\nshutil.copy(??)\nshutil.copy2(??)\nshutil.copyfile(??)\nshutil.copyfileobj(??)\nshutil.copymode(??)\nshutil.copystat(??)\nshutil.copytree(??)\nshutil.destinsrc(??)\nshutil.exceptions\nshutil.move(??)\nshutil.os\nshutil.rmtree(??)\nshutil.stat\nshutil.sys\nsignal.NSIG\nsignal.SIGABRT\nsignal.SIGALRM\nsignal.SIGBUS\nsignal.SIGCHLD\nsignal.SIGCLD\nsignal.SIGCONT\nsignal.SIGFPE\nsignal.SIGHUP\nsignal.SIGILL\nsignal.SIGINT\nsignal.SIGIO\nsignal.SIGIOT\nsignal.SIGKILL\nsignal.SIGPIPE\nsignal.SIGPOLL\nsignal.SIGPROF\nsignal.SIGPWR\nsignal.SIGQUIT\nsignal.SIGRTMAX\nsignal.SIGRTMIN\nsignal.SIGSEGV\nsignal.SIGSTOP\nsignal.SIGSYS\nsignal.SIGTERM\nsignal.SIGTRAP\nsignal.SIGTSTP\nsignal.SIGTTIN\nsignal.SIGTTOU\nsignal.SIGURG\nsignal.SIGUSR1\nsignal.SIGUSR2\nsignal.SIGVTALRM\nsignal.SIGWINCH\nsignal.SIGXCPU\nsignal.SIGXFSZ\nsignal.SIG_DFL\nsignal.SIG_IGN\nsignal.alarm(seconds)\nsignal.default_int_handler(...)\nsignal.getsignal(sig) -> action\nsignal.pause()\nsignal.signal(sig, action) -> action\nsite.abs__file__(??)\nsite.addbuilddir(??)\nsite.addpackage(??)\nsite.addsitedir(??)\nsite.addsitepackages(??)\nsite.aliasmbcs(??)\nsite.execsitecustomize(??)\nsite.main(??)\nsite.makepath(??)\nsite.os\nsite.removeduppaths(??)\nsite.setBEGINLIBPATH(??)\nsite.setcopyright(??)\nsite.setencoding(??)\nsite.sethelper(??)\nsite.setquit(??)\nsite.sys\nslice([start,] stop[, step])\nsmtpd.COMMASPACE\nsmtpd.DEBUGSTREAM\nsmtpd.DebuggingServer(??)\nsmtpd.Devnull(??)\nsmtpd.EMPTYSTRING\nsmtpd.MailmanProxy(??)\nsmtpd.NEWLINE\nsmtpd.Options(??)\nsmtpd.PureProxy(??)\nsmtpd.SMTPChannel(??)\nsmtpd.SMTPServer(??)\nsmtpd.asynchat\nsmtpd.asyncore\nsmtpd.errno\nsmtpd.getopt\nsmtpd.os\nsmtpd.parseargs(??)\nsmtpd.program\nsmtpd.socket\nsmtpd.sys\nsmtpd.time\nsmtpd.usage(??)\nsmtplib.CRLF\nsmtplib.OLDSTYLE_AUTH\nsmtplib.SMTP(??)\nsmtplib.SMTPAuthenticationError(??)\nsmtplib.SMTPConnectError(??)\nsmtplib.SMTPDataError(??)\nsmtplib.SMTPException(??)\nsmtplib.SMTPHeloError(??)\nsmtplib.SMTPRecipientsRefused(??)\nsmtplib.SMTPResponseException(??)\nsmtplib.SMTPSenderRefused(??)\nsmtplib.SMTPServerDisconnected(??)\nsmtplib.SMTP_PORT\nsmtplib.SSLFakeFile(??)\nsmtplib.SSLFakeSocket(??)\nsmtplib.base64\nsmtplib.encode_base64(??)\nsmtplib.hmac\nsmtplib.quoteaddr(??)\nsmtplib.quotedata(??)\nsmtplib.re\nsmtplib.rfc822\nsmtplib.socket\nsmtplib.stderr\nsndhdr.get_long_be(??)\nsndhdr.get_long_le(??)\nsndhdr.get_short_be(??)\nsndhdr.get_short_le(??)\nsndhdr.test(??)\nsndhdr.test_8svx(??)\nsndhdr.test_aifc(??)\nsndhdr.test_au(??)\nsndhdr.test_hcom(??)\nsndhdr.test_sndr(??)\nsndhdr.test_sndt(??)\nsndhdr.test_voc(??)\nsndhdr.test_wav(??)\nsndhdr.testall(??)\nsndhdr.tests\nsndhdr.what(??)\nsndhdr.whathdr(??)\nsocket.AF_APPLETALK\nsocket.AF_ASH\nsocket.AF_ATMPVC\nsocket.AF_ATMSVC\nsocket.AF_AX25\nsocket.AF_BRIDGE\nsocket.AF_DECnet\nsocket.AF_ECONET\nsocket.AF_INET\nsocket.AF_INET6\nsocket.AF_IPX\nsocket.AF_IRDA\nsocket.AF_KEY\nsocket.AF_NETBEUI\nsocket.AF_NETLINK\nsocket.AF_NETROM\nsocket.AF_PACKET\nsocket.AF_PPPOX\nsocket.AF_ROSE\nsocket.AF_ROUTE\nsocket.AF_SECURITY\nsocket.AF_SNA\nsocket.AF_UNIX\nsocket.AF_UNSPEC\nsocket.AF_WANPIPE\nsocket.AF_X25\nsocket.AI_ADDRCONFIG\nsocket.AI_ALL\nsocket.AI_CANONNAME\nsocket.AI_NUMERICHOST\nsocket.AI_NUMERICSERV\nsocket.AI_PASSIVE\nsocket.AI_V4MAPPED\nsocket.CAPI\nsocket.EAI_ADDRFAMILY\nsocket.EAI_AGAIN\nsocket.EAI_BADFLAGS\nsocket.EAI_FAIL\nsocket.EAI_FAMILY\nsocket.EAI_MEMORY\nsocket.EAI_NODATA\nsocket.EAI_NONAME\nsocket.EAI_OVERFLOW\nsocket.EAI_SERVICE\nsocket.EAI_SOCKTYPE\nsocket.EAI_SYSTEM\nsocket.EBADF\nsocket.INADDR_ALLHOSTS_GROUP\nsocket.INADDR_ANY\nsocket.INADDR_BROADCAST\nsocket.INADDR_LOOPBACK\nsocket.INADDR_MAX_LOCAL_GROUP\nsocket.INADDR_NONE\nsocket.INADDR_UNSPEC_GROUP\nsocket.IPPORT_RESERVED\nsocket.IPPORT_USERRESERVED\nsocket.IPPROTO_AH\nsocket.IPPROTO_DSTOPTS\nsocket.IPPROTO_EGP\nsocket.IPPROTO_ESP\nsocket.IPPROTO_FRAGMENT\nsocket.IPPROTO_GRE\nsocket.IPPROTO_HOPOPTS\nsocket.IPPROTO_ICMP\nsocket.IPPROTO_ICMPV6\nsocket.IPPROTO_IDP\nsocket.IPPROTO_IGMP\nsocket.IPPROTO_IP\nsocket.IPPROTO_IPIP\nsocket.IPPROTO_IPV6\nsocket.IPPROTO_NONE\nsocket.IPPROTO_PIM\nsocket.IPPROTO_PUP\nsocket.IPPROTO_RAW\nsocket.IPPROTO_ROUTING\nsocket.IPPROTO_RSVP\nsocket.IPPROTO_TCP\nsocket.IPPROTO_TP\nsocket.IPPROTO_UDP\nsocket.IPV6_CHECKSUM\nsocket.IPV6_DSTOPTS\nsocket.IPV6_HOPLIMIT\nsocket.IPV6_HOPOPTS\nsocket.IPV6_JOIN_GROUP\nsocket.IPV6_LEAVE_GROUP\nsocket.IPV6_MULTICAST_HOPS\nsocket.IPV6_MULTICAST_IF\nsocket.IPV6_MULTICAST_LOOP\nsocket.IPV6_NEXTHOP\nsocket.IPV6_PKTINFO\nsocket.IPV6_RECVDSTOPTS\nsocket.IPV6_RECVHOPLIMIT\nsocket.IPV6_RECVHOPOPTS\nsocket.IPV6_RECVPKTINFO\nsocket.IPV6_RECVRTHDR\nsocket.IPV6_RECVTCLASS\nsocket.IPV6_RTHDR\nsocket.IPV6_RTHDRDSTOPTS\nsocket.IPV6_RTHDR_TYPE_0\nsocket.IPV6_TCLASS\nsocket.IPV6_UNICAST_HOPS\nsocket.IPV6_V6ONLY\nsocket.IP_ADD_MEMBERSHIP\nsocket.IP_DEFAULT_MULTICAST_LOOP\nsocket.IP_DEFAULT_MULTICAST_TTL\nsocket.IP_DROP_MEMBERSHIP\nsocket.IP_HDRINCL\nsocket.IP_MAX_MEMBERSHIPS\nsocket.IP_MULTICAST_IF\nsocket.IP_MULTICAST_LOOP\nsocket.IP_MULTICAST_TTL\nsocket.IP_OPTIONS\nsocket.IP_RECVOPTS\nsocket.IP_RECVRETOPTS\nsocket.IP_RETOPTS\nsocket.IP_TOS\nsocket.IP_TTL\nsocket.MSG_CTRUNC\nsocket.MSG_DONTROUTE\nsocket.MSG_DONTWAIT\nsocket.MSG_EOR\nsocket.MSG_OOB\nsocket.MSG_PEEK\nsocket.MSG_TRUNC\nsocket.MSG_WAITALL\nsocket.NI_DGRAM\nsocket.NI_MAXHOST\nsocket.NI_MAXSERV\nsocket.NI_NAMEREQD\nsocket.NI_NOFQDN\nsocket.NI_NUMERICHOST\nsocket.NI_NUMERICSERV\nsocket.PACKET_BROADCAST\nsocket.PACKET_FASTROUTE\nsocket.PACKET_HOST\nsocket.PACKET_LOOPBACK\nsocket.PACKET_MULTICAST\nsocket.PACKET_OTHERHOST\nsocket.PACKET_OUTGOING\nsocket.PF_PACKET\nsocket.RAND_add(string, entropy)\nsocket.RAND_egd(path) -> bytes\nsocket.RAND_status() -> 0 or 1\nsocket.SHUT_RD\nsocket.SHUT_RDWR\nsocket.SHUT_WR\nsocket.SOCK_DGRAM\nsocket.SOCK_RAW\nsocket.SOCK_RDM\nsocket.SOCK_SEQPACKET\nsocket.SOCK_STREAM\nsocket.SOL_IP\nsocket.SOL_SOCKET\nsocket.SOL_TCP\nsocket.SOL_UDP\nsocket.SOMAXCONN\nsocket.SO_ACCEPTCONN\nsocket.SO_BROADCAST\nsocket.SO_DEBUG\nsocket.SO_DONTROUTE\nsocket.SO_ERROR\nsocket.SO_KEEPALIVE\nsocket.SO_LINGER\nsocket.SO_OOBINLINE\nsocket.SO_RCVBUF\nsocket.SO_RCVLOWAT\nsocket.SO_RCVTIMEO\nsocket.SO_REUSEADDR\nsocket.SO_SNDBUF\nsocket.SO_SNDLOWAT\nsocket.SO_SNDTIMEO\nsocket.SO_TYPE\nsocket.SSLType\nsocket.SSL_ERROR_EOF\nsocket.SSL_ERROR_INVALID_ERROR_CODE\nsocket.SSL_ERROR_SSL\nsocket.SSL_ERROR_SYSCALL\nsocket.SSL_ERROR_WANT_CONNECT\nsocket.SSL_ERROR_WANT_READ\nsocket.SSL_ERROR_WANT_WRITE\nsocket.SSL_ERROR_WANT_X509_LOOKUP\nsocket.SSL_ERROR_ZERO_RETURN\nsocket.SocketType\nsocket.TCP_CORK\nsocket.TCP_DEFER_ACCEPT\nsocket.TCP_INFO\nsocket.TCP_KEEPCNT\nsocket.TCP_KEEPIDLE\nsocket.TCP_KEEPINTVL\nsocket.TCP_LINGER2\nsocket.TCP_MAXSEG\nsocket.TCP_NODELAY\nsocket.TCP_QUICKACK\nsocket.TCP_SYNCNT\nsocket.TCP_WINDOW_CLAMP\nsocket.error(??)\nsocket.fromfd(fd, family, type[, proto]) -> socket object\nsocket.gaierror(??)\nsocket.getaddrinfo(host, port [, family, socktype, proto, flags])\nsocket.getdefaulttimeout() -> timeout\nsocket.getfqdn(??)\nsocket.gethostbyaddr(host) -> (name, aliaslist, addresslist)\nsocket.gethostbyname(host) -> address\nsocket.gethostbyname_ex(host) -> (name, aliaslist, addresslist)\nsocket.gethostname() -> string\nsocket.getnameinfo(sockaddr, flags) --> (host, port)\nsocket.getprotobyname(name) -> integer\nsocket.getservbyname(servicename[, protocolname]) -> integer\nsocket.getservbyport(port[, protocolname]) -> string\nsocket.has_ipv6\nsocket.herror(??)\nsocket.htonl(integer) -> integer\nsocket.htons(integer) -> integer\nsocket.inet_aton(string) -> packed 32-bit IP representation\nsocket.inet_ntoa(packed_ip) -> ip_address_string\nsocket.inet_ntop(af, packed_ip) -> string formatted IP address\nsocket.inet_pton(af, ip) -> packed IP address string\nsocket.ntohl(integer) -> integer\nsocket.ntohs(integer) -> integer\nsocket.os\nsocket.setdefaulttimeout(timeout)\nsocket.socket([family[, type[, proto]]]) -> socket object\nsocket.socketpair([family[, type[, proto]]]) -> (socket object, socket object)\nsocket.ssl(??)\nsocket.sslerror(??)\nsocket.sys\nsocket.timeout(??)\nsorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list\nsre.DEBUG\nsre.DOTALL\nsre.I\nsre.IGNORECASE\nsre.L\nsre.LOCALE\nsre.M\nsre.MULTILINE\nsre.S\nsre.Scanner(??)\nsre.T\nsre.TEMPLATE\nsre.U\nsre.UNICODE\nsre.VERBOSE\nsre.X\nsre.compile(??)\nsre.copy_reg\nsre.error(??)\nsre.escape(??)\nsre.findall(??)\nsre.finditer(??)\nsre.match(??)\nsre.purge(??)\nsre.search(??)\nsre.split(??)\nsre.sre_compile\nsre.sre_parse\nsre.sub(??)\nsre.subn(??)\nsre.sys\nsre.template(??)\nsre_compile.ANY\nsre_compile.ANY_ALL\nsre_compile.ASSERT\nsre_compile.ASSERT_NOT\nsre_compile.AT\nsre_compile.ATCODES\nsre_compile.AT_BEGINNING\nsre_compile.AT_BEGINNING_LINE\nsre_compile.AT_BEGINNING_STRING\nsre_compile.AT_BOUNDARY\nsre_compile.AT_END\nsre_compile.AT_END_LINE\nsre_compile.AT_END_STRING\nsre_compile.AT_LOCALE\nsre_compile.AT_LOC_BOUNDARY\nsre_compile.AT_LOC_NON_BOUNDARY\nsre_compile.AT_MULTILINE\nsre_compile.AT_NON_BOUNDARY\nsre_compile.AT_UNICODE\nsre_compile.AT_UNI_BOUNDARY\nsre_compile.AT_UNI_NON_BOUNDARY\nsre_compile.BIGCHARSET\nsre_compile.BRANCH\nsre_compile.CALL\nsre_compile.CATEGORY\nsre_compile.CATEGORY_DIGIT\nsre_compile.CATEGORY_LINEBREAK\nsre_compile.CATEGORY_LOC_NOT_WORD\nsre_compile.CATEGORY_LOC_WORD\nsre_compile.CATEGORY_NOT_DIGIT\nsre_compile.CATEGORY_NOT_LINEBREAK\nsre_compile.CATEGORY_NOT_SPACE\nsre_compile.CATEGORY_NOT_WORD\nsre_compile.CATEGORY_SPACE\nsre_compile.CATEGORY_UNI_DIGIT\nsre_compile.CATEGORY_UNI_LINEBREAK\nsre_compile.CATEGORY_UNI_NOT_DIGIT\nsre_compile.CATEGORY_UNI_NOT_LINEBREAK\nsre_compile.CATEGORY_UNI_NOT_SPACE\nsre_compile.CATEGORY_UNI_NOT_WORD\nsre_compile.CATEGORY_UNI_SPACE\nsre_compile.CATEGORY_UNI_WORD\nsre_compile.CATEGORY_WORD\nsre_compile.CHARSET\nsre_compile.CHCODES\nsre_compile.CH_LOCALE\nsre_compile.CH_UNICODE\nsre_compile.FAILURE\nsre_compile.GROUPREF\nsre_compile.GROUPREF_EXISTS\nsre_compile.GROUPREF_IGNORE\nsre_compile.IN\nsre_compile.INFO\nsre_compile.IN_IGNORE\nsre_compile.JUMP\nsre_compile.LITERAL\nsre_compile.LITERAL_IGNORE\nsre_compile.MAGIC\nsre_compile.MARK\nsre_compile.MAXCODE\nsre_compile.MAXREPEAT\nsre_compile.MAX_REPEAT\nsre_compile.MAX_UNTIL\nsre_compile.MIN_REPEAT\nsre_compile.MIN_REPEAT_ONE\nsre_compile.MIN_UNTIL\nsre_compile.NEGATE\nsre_compile.NOT_LITERAL\nsre_compile.NOT_LITERAL_IGNORE\nsre_compile.OPCODES\nsre_compile.OP_IGNORE\nsre_compile.RANGE\nsre_compile.REPEAT\nsre_compile.REPEAT_ONE\nsre_compile.SRE_FLAG_DEBUG\nsre_compile.SRE_FLAG_DOTALL\nsre_compile.SRE_FLAG_IGNORECASE\nsre_compile.SRE_FLAG_LOCALE\nsre_compile.SRE_FLAG_MULTILINE\nsre_compile.SRE_FLAG_TEMPLATE\nsre_compile.SRE_FLAG_UNICODE\nsre_compile.SRE_FLAG_VERBOSE\nsre_compile.SRE_INFO_CHARSET\nsre_compile.SRE_INFO_LITERAL\nsre_compile.SRE_INFO_PREFIX\nsre_compile.STRING_TYPES\nsre_compile.SUBPATTERN\nsre_compile.SUCCESS\nsre_compile.compile(??)\nsre_compile.error(??)\nsre_compile.isstring(??)\nsre_compile.makedict(??)\nsre_compile.sys\nsre_constants.ANY\nsre_constants.ANY_ALL\nsre_constants.ASSERT\nsre_constants.ASSERT_NOT\nsre_constants.AT\nsre_constants.ATCODES\nsre_constants.AT_BEGINNING\nsre_constants.AT_BEGINNING_LINE\nsre_constants.AT_BEGINNING_STRING\nsre_constants.AT_BOUNDARY\nsre_constants.AT_END\nsre_constants.AT_END_LINE\nsre_constants.AT_END_STRING\nsre_constants.AT_LOCALE\nsre_constants.AT_LOC_BOUNDARY\nsre_constants.AT_LOC_NON_BOUNDARY\nsre_constants.AT_MULTILINE\nsre_constants.AT_NON_BOUNDARY\nsre_constants.AT_UNICODE\nsre_constants.AT_UNI_BOUNDARY\nsre_constants.AT_UNI_NON_BOUNDARY\nsre_constants.BIGCHARSET\nsre_constants.BRANCH\nsre_constants.CALL\nsre_constants.CATEGORY\nsre_constants.CATEGORY_DIGIT\nsre_constants.CATEGORY_LINEBREAK\nsre_constants.CATEGORY_LOC_NOT_WORD\nsre_constants.CATEGORY_LOC_WORD\nsre_constants.CATEGORY_NOT_DIGIT\nsre_constants.CATEGORY_NOT_LINEBREAK\nsre_constants.CATEGORY_NOT_SPACE\nsre_constants.CATEGORY_NOT_WORD\nsre_constants.CATEGORY_SPACE\nsre_constants.CATEGORY_UNI_DIGIT\nsre_constants.CATEGORY_UNI_LINEBREAK\nsre_constants.CATEGORY_UNI_NOT_DIGIT\nsre_constants.CATEGORY_UNI_NOT_LINEBREAK\nsre_constants.CATEGORY_UNI_NOT_SPACE\nsre_constants.CATEGORY_UNI_NOT_WORD\nsre_constants.CATEGORY_UNI_SPACE\nsre_constants.CATEGORY_UNI_WORD\nsre_constants.CATEGORY_WORD\nsre_constants.CHARSET\nsre_constants.CHCODES\nsre_constants.CH_LOCALE\nsre_constants.CH_UNICODE\nsre_constants.FAILURE\nsre_constants.GROUPREF\nsre_constants.GROUPREF_EXISTS\nsre_constants.GROUPREF_IGNORE\nsre_constants.IN\nsre_constants.INFO\nsre_constants.IN_IGNORE\nsre_constants.JUMP\nsre_constants.LITERAL\nsre_constants.LITERAL_IGNORE\nsre_constants.MAGIC\nsre_constants.MARK\nsre_constants.MAXREPEAT\nsre_constants.MAX_REPEAT\nsre_constants.MAX_UNTIL\nsre_constants.MIN_REPEAT\nsre_constants.MIN_REPEAT_ONE\nsre_constants.MIN_UNTIL\nsre_constants.NEGATE\nsre_constants.NOT_LITERAL\nsre_constants.NOT_LITERAL_IGNORE\nsre_constants.OPCODES\nsre_constants.OP_IGNORE\nsre_constants.RANGE\nsre_constants.REPEAT\nsre_constants.REPEAT_ONE\nsre_constants.SRE_FLAG_DEBUG\nsre_constants.SRE_FLAG_DOTALL\nsre_constants.SRE_FLAG_IGNORECASE\nsre_constants.SRE_FLAG_LOCALE\nsre_constants.SRE_FLAG_MULTILINE\nsre_constants.SRE_FLAG_TEMPLATE\nsre_constants.SRE_FLAG_UNICODE\nsre_constants.SRE_FLAG_VERBOSE\nsre_constants.SRE_INFO_CHARSET\nsre_constants.SRE_INFO_LITERAL\nsre_constants.SRE_INFO_PREFIX\nsre_constants.SUBPATTERN\nsre_constants.SUCCESS\nsre_constants.error(??)\nsre_constants.makedict(??)\nsre_parse.ANY\nsre_parse.ANY_ALL\nsre_parse.ASSERT\nsre_parse.ASSERT_NOT\nsre_parse.AT\nsre_parse.ATCODES\nsre_parse.AT_BEGINNING\nsre_parse.AT_BEGINNING_LINE\nsre_parse.AT_BEGINNING_STRING\nsre_parse.AT_BOUNDARY\nsre_parse.AT_END\nsre_parse.AT_END_LINE\nsre_parse.AT_END_STRING\nsre_parse.AT_LOCALE\nsre_parse.AT_LOC_BOUNDARY\nsre_parse.AT_LOC_NON_BOUNDARY\nsre_parse.AT_MULTILINE\nsre_parse.AT_NON_BOUNDARY\nsre_parse.AT_UNICODE\nsre_parse.AT_UNI_BOUNDARY\nsre_parse.AT_UNI_NON_BOUNDARY\nsre_parse.BIGCHARSET\nsre_parse.BRANCH\nsre_parse.CALL\nsre_parse.CATEGORIES\nsre_parse.CATEGORY\nsre_parse.CATEGORY_DIGIT\nsre_parse.CATEGORY_LINEBREAK\nsre_parse.CATEGORY_LOC_NOT_WORD\nsre_parse.CATEGORY_LOC_WORD\nsre_parse.CATEGORY_NOT_DIGIT\nsre_parse.CATEGORY_NOT_LINEBREAK\nsre_parse.CATEGORY_NOT_SPACE\nsre_parse.CATEGORY_NOT_WORD\nsre_parse.CATEGORY_SPACE\nsre_parse.CATEGORY_UNI_DIGIT\nsre_parse.CATEGORY_UNI_LINEBREAK\nsre_parse.CATEGORY_UNI_NOT_DIGIT\nsre_parse.CATEGORY_UNI_NOT_LINEBREAK\nsre_parse.CATEGORY_UNI_NOT_SPACE\nsre_parse.CATEGORY_UNI_NOT_WORD\nsre_parse.CATEGORY_UNI_SPACE\nsre_parse.CATEGORY_UNI_WORD\nsre_parse.CATEGORY_WORD\nsre_parse.CHARSET\nsre_parse.CHCODES\nsre_parse.CH_LOCALE\nsre_parse.CH_UNICODE\nsre_parse.DIGITS\nsre_parse.ESCAPES\nsre_parse.FAILURE\nsre_parse.FLAGS\nsre_parse.GROUPREF\nsre_parse.GROUPREF_EXISTS\nsre_parse.GROUPREF_IGNORE\nsre_parse.HEXDIGITS\nsre_parse.IN\nsre_parse.INFO\nsre_parse.IN_IGNORE\nsre_parse.JUMP\nsre_parse.LITERAL\nsre_parse.LITERAL_IGNORE\nsre_parse.MAGIC\nsre_parse.MARK\nsre_parse.MAXREPEAT\nsre_parse.MAX_REPEAT\nsre_parse.MAX_UNTIL\nsre_parse.MIN_REPEAT\nsre_parse.MIN_REPEAT_ONE\nsre_parse.MIN_UNTIL\nsre_parse.NEGATE\nsre_parse.NOT_LITERAL\nsre_parse.NOT_LITERAL_IGNORE\nsre_parse.OCTDIGITS\nsre_parse.OPCODES\nsre_parse.OP_IGNORE\nsre_parse.Pattern(??)\nsre_parse.RANGE\nsre_parse.REPEAT\nsre_parse.REPEAT_CHARS\nsre_parse.REPEAT_ONE\nsre_parse.SPECIAL_CHARS\nsre_parse.SRE_FLAG_DEBUG\nsre_parse.SRE_FLAG_DOTALL\nsre_parse.SRE_FLAG_IGNORECASE\nsre_parse.SRE_FLAG_LOCALE\nsre_parse.SRE_FLAG_MULTILINE\nsre_parse.SRE_FLAG_TEMPLATE\nsre_parse.SRE_FLAG_UNICODE\nsre_parse.SRE_FLAG_VERBOSE\nsre_parse.SRE_INFO_CHARSET\nsre_parse.SRE_INFO_LITERAL\nsre_parse.SRE_INFO_PREFIX\nsre_parse.SUBPATTERN\nsre_parse.SUCCESS\nsre_parse.SubPattern(??)\nsre_parse.Tokenizer(??)\nsre_parse.WHITESPACE\nsre_parse.error(??)\nsre_parse.expand_template(??)\nsre_parse.isdigit(??)\nsre_parse.isident(??)\nsre_parse.isname(??)\nsre_parse.makedict(??)\nsre_parse.parse(??)\nsre_parse.parse_template(??)\nsre_parse.sys\nstat.ST_ATIME\nstat.ST_CTIME\nstat.ST_DEV\nstat.ST_GID\nstat.ST_INO\nstat.ST_MODE\nstat.ST_MTIME\nstat.ST_NLINK\nstat.ST_SIZE\nstat.ST_UID\nstat.S_ENFMT\nstat.S_IEXEC\nstat.S_IFBLK\nstat.S_IFCHR\nstat.S_IFDIR\nstat.S_IFIFO\nstat.S_IFLNK\nstat.S_IFMT(??)\nstat.S_IFREG\nstat.S_IFSOCK\nstat.S_IMODE(??)\nstat.S_IREAD\nstat.S_IRGRP\nstat.S_IROTH\nstat.S_IRUSR\nstat.S_IRWXG\nstat.S_IRWXO\nstat.S_IRWXU\nstat.S_ISBLK(??)\nstat.S_ISCHR(??)\nstat.S_ISDIR(??)\nstat.S_ISFIFO(??)\nstat.S_ISGID\nstat.S_ISLNK(??)\nstat.S_ISREG(??)\nstat.S_ISSOCK(??)\nstat.S_ISUID\nstat.S_ISVTX\nstat.S_IWGRP\nstat.S_IWOTH\nstat.S_IWRITE\nstat.S_IWUSR\nstat.S_IXGRP\nstat.S_IXOTH\nstat.S_IXUSR\nstatcache.ST_ATIME\nstatcache.ST_CTIME\nstatcache.ST_DEV\nstatcache.ST_GID\nstatcache.ST_INO\nstatcache.ST_MODE\nstatcache.ST_MTIME\nstatcache.ST_NLINK\nstatcache.ST_SIZE\nstatcache.ST_UID\nstatcache.S_ENFMT\nstatcache.S_IEXEC\nstatcache.S_IFBLK\nstatcache.S_IFCHR\nstatcache.S_IFDIR\nstatcache.S_IFIFO\nstatcache.S_IFLNK\nstatcache.S_IFMT(??)\nstatcache.S_IFREG\nstatcache.S_IFSOCK\nstatcache.S_IMODE(??)\nstatcache.S_IREAD\nstatcache.S_IRGRP\nstatcache.S_IROTH\nstatcache.S_IRUSR\nstatcache.S_IRWXG\nstatcache.S_IRWXO\nstatcache.S_IRWXU\nstatcache.S_ISBLK(??)\nstatcache.S_ISCHR(??)\nstatcache.S_ISDIR(??)\nstatcache.S_ISFIFO(??)\nstatcache.S_ISGID\nstatcache.S_ISLNK(??)\nstatcache.S_ISREG(??)\nstatcache.S_ISSOCK(??)\nstatcache.S_ISUID\nstatcache.S_ISVTX\nstatcache.S_IWGRP\nstatcache.S_IWOTH\nstatcache.S_IWRITE\nstatcache.S_IWUSR\nstatcache.S_IXGRP\nstatcache.S_IXOTH\nstatcache.S_IXUSR\nstatcache.cache\nstatcache.forget(??)\nstatcache.forget_dir(??)\nstatcache.forget_except_prefix(??)\nstatcache.forget_prefix(??)\nstatcache.isdir(??)\nstatcache.reset(??)\nstatcache.stat(??)\nstaticmethod(function) -> method\nstatvfs.F_BAVAIL\nstatvfs.F_BFREE\nstatvfs.F_BLOCKS\nstatvfs.F_BSIZE\nstatvfs.F_FAVAIL\nstatvfs.F_FFREE\nstatvfs.F_FILES\nstatvfs.F_FLAG\nstatvfs.F_FRSIZE\nstatvfs.F_NAMEMAX\nstr(object) -> string\nstring.Template\nstring.ascii_letters\nstring.ascii_lowercase\nstring.ascii_uppercase\nstring.atof(s) -> float\nstring.atof_error(??)\nstring.atoi(s [,base]) -> int\nstring.atoi_error(??)\nstring.atol(s [,base]) -> long\nstring.atol_error(??)\nstring.capitalize(s) -> string\nstring.capwords(s, [sep]) -> string\nstring.center(s, width[, fillchar]) -> string\nstring.count(s, sub[, start[,end]]) -> int\nstring.digits\nstring.expandtabs(s [,tabsize]) -> string\nstring.find(s, sub [,start [,end]]) -> in\nstring.hexdigits\nstring.index(s, sub [,start [,end]]) -> int\nstring.index_error(??)\nstring.join(list [,sep]) -> string\nstring.joinfields(??)\nstring.letters\nstring.ljust(s, width[, fillchar]) -> string\nstring.lower(s) -> string\nstring.lowercase\nstring.lstrip(s [,chars]) -> string\nstring.maketrans(frm, to) -> string\nstring.octdigits\nstring.printable\nstring.punctuation\nstring.replace (str, old, new[, maxsplit]) -> string\nstring.rfind(s, sub [,start [,end]]) -> int\nstring.rindex(s, sub [,start [,end]]) -> int\nstring.rjust(s, width[, fillchar]) -> string\nstring.rsplit(s [,sep [,maxsplit]]) -> list of strings\nstring.rstrip(s [,chars]) -> string\nstring.split(s [,sep [,maxsplit]]) -> list of strings\nstring.splitfields(??)\nstring.strip(s [,chars]) -> string\nstring.swapcase(s) -> string\nstring.translate(s,table [,deletions]) -> string\nstring.upper(s) -> string\nstring.uppercase\nstring.whitespace\nstring.zfill(x, width) -> string\nstringold.atof(s) -> float\nstringold.atof_error(??)\nstringold.atoi(s [,base]) -> int\nstringold.atoi_error(??)\nstringold.atol(s [,base]) -> long\nstringold.atol_error(??)\nstringold.capitalize(s) -> string\nstringold.capwords(s, [sep]) -> string\nstringold.center(s, width) -> string\nstringold.count(s, sub[, start[,end]]) -> int\nstringold.digits\nstringold.expandtabs(s [,tabsize]) -> string\nstringold.find(s, sub [,start [,end]]) -> in\nstringold.hexdigits\nstringold.index(s, sub [,start [,end]]) -> int\nstringold.index_error(??)\nstringold.join(list [,sep]) -> string\nstringold.joinfields(??)\nstringold.letters\nstringold.ljust(s, width) -> string\nstringold.lower(s) -> string\nstringold.lowercase\nstringold.lstrip(s) -> string\nstringold.maketrans(frm, to) -> string\nstringold.octdigits\nstringold.replace (str, old, new[, maxsplit]) -> string\nstringold.rfind(s, sub [,start [,end]]) -> int\nstringold.rindex(s, sub [,start [,end]]) -> int\nstringold.rjust(s, width) -> string\nstringold.rstrip(s) -> string\nstringold.split(str [,sep [,maxsplit]]) -> list of strings\nstringold.splitfields(??)\nstringold.strip(s) -> string\nstringold.swapcase(s) -> string\nstringold.translate(s,table [,deletechars]) -> string\nstringold.upper(s) -> string\nstringold.uppercase\nstringold.whitespace\nstringold.zfill(x, width) -> string\nstringprep.b1_set\nstringprep.b3_exceptions\nstringprep.c22_specials\nstringprep.c6_set\nstringprep.c7_set\nstringprep.c8_set\nstringprep.c9_set\nstringprep.in_table_a1(??)\nstringprep.in_table_b1(??)\nstringprep.in_table_c11(??)\nstringprep.in_table_c11_c12(??)\nstringprep.in_table_c12(??)\nstringprep.in_table_c21(??)\nstringprep.in_table_c21_c22(??)\nstringprep.in_table_c22(??)\nstringprep.in_table_c3(??)\nstringprep.in_table_c4(??)\nstringprep.in_table_c5(??)\nstringprep.in_table_c6(??)\nstringprep.in_table_c7(??)\nstringprep.in_table_c8(??)\nstringprep.in_table_c9(??)\nstringprep.in_table_d1(??)\nstringprep.in_table_d2(??)\nstringprep.map_table_b2(??)\nstringprep.map_table_b3(??)\nstringprep.unicodedata\nstrop.atof(s) -> float\nstrop.atoi(s [,base]) -> int\nstrop.atol(s [,base]) -> long\nstrop.capitalize(s) -> string\nstrop.count(s, sub[, start[, end]]) -> int\nstrop.expandtabs(string, [tabsize]) -> string\nstrop.find(s, sub [,start [,end]]) -> in\nstrop.join(list [,sep]) -> string\nstrop.joinfields\nstrop.lower(s) -> string\nstrop.lowercase\nstrop.lstrip(s) -> string\nstrop.maketrans(frm, to) -> string\nstrop.replace (str, old, new[, maxsplit]) -> string\nstrop.rfind(s, sub [,start [,end]]) -> int\nstrop.rstrip(s) -> string\nstrop.split(s [,sep [,maxsplit]]) -> list of strings\nstrop.splitfields\nstrop.strip(s) -> string\nstrop.swapcase(s) -> string\nstrop.translate(s,table [,deletechars]) -> string\nstrop.upper(s) -> string\nstrop.uppercase\nstrop.whitespace\nstruct.calcsize(fmt) -> int\nstruct.error(??)\nstruct.pack(fmt, v1, v2, ...) -> string\nstruct.unpack(fmt, string) -> (v1, v2, ...)\nsubprocess.MAXFD\nsubprocess.PIPE\nsubprocess.Popen\nsubprocess.STDOUT\nsubprocess.call(??)\nsubprocess.errno\nsubprocess.fcntl\nsubprocess.list2cmdline(??)\nsubprocess.mswindows\nsubprocess.os\nsubprocess.pickle\nsubprocess.select\nsubprocess.sys\nsubprocess.traceback\nsubprocess.types\nsum(sequence, start=0) -> value\nsunau.AUDIO_FILE_ENCODING_ADPCM_G721\nsunau.AUDIO_FILE_ENCODING_ADPCM_G722\nsunau.AUDIO_FILE_ENCODING_ADPCM_G723_3\nsunau.AUDIO_FILE_ENCODING_ADPCM_G723_5\nsunau.AUDIO_FILE_ENCODING_ALAW_8\nsunau.AUDIO_FILE_ENCODING_DOUBLE\nsunau.AUDIO_FILE_ENCODING_FLOAT\nsunau.AUDIO_FILE_ENCODING_LINEAR_16\nsunau.AUDIO_FILE_ENCODING_LINEAR_24\nsunau.AUDIO_FILE_ENCODING_LINEAR_32\nsunau.AUDIO_FILE_ENCODING_LINEAR_8\nsunau.AUDIO_FILE_ENCODING_MULAW_8\nsunau.AUDIO_FILE_MAGIC\nsunau.AUDIO_UNKNOWN_SIZE\nsunau.Au_read(??)\nsunau.Au_write(??)\nsunau.Error(??)\nsunau.open(??)\nsunau.openfp(??)\nsunaudio.MAGIC\nsunaudio.error(??)\nsunaudio.get_long_be(??)\nsunaudio.gethdr(??)\nsunaudio.printhdr(??)\nsuper(type) -> unbound super object\nsymbol.and_expr\nsymbol.and_test\nsymbol.arglist\nsymbol.argument\nsymbol.arith_expr\nsymbol.assert_stmt\nsymbol.atom\nsymbol.augassign\nsymbol.break_stmt\nsymbol.classdef\nsymbol.comp_op\nsymbol.comparison\nsymbol.compound_stmt\nsymbol.continue_stmt\nsymbol.decorator\nsymbol.decorators\nsymbol.del_stmt\nsymbol.dictmaker\nsymbol.dotted_as_name\nsymbol.dotted_as_names\nsymbol.dotted_name\nsymbol.encoding_decl\nsymbol.eval_input\nsymbol.except_clause\nsymbol.exec_stmt\nsymbol.expr\nsymbol.expr_stmt\nsymbol.exprlist\nsymbol.factor\nsymbol.file_input\nsymbol.flow_stmt\nsymbol.for_stmt\nsymbol.fpdef\nsymbol.fplist\nsymbol.funcdef\nsymbol.gen_for\nsymbol.gen_if\nsymbol.gen_iter\nsymbol.global_stmt\nsymbol.if_stmt\nsymbol.import_as_name\nsymbol.import_as_names\nsymbol.import_from\nsymbol.import_name\nsymbol.import_stmt\nsymbol.lambdef\nsymbol.list_for\nsymbol.list_if\nsymbol.list_iter\nsymbol.listmaker\nsymbol.main(??)\nsymbol.not_test\nsymbol.parameters\nsymbol.pass_stmt\nsymbol.power\nsymbol.print_stmt\nsymbol.raise_stmt\nsymbol.return_stmt\nsymbol.shift_expr\nsymbol.simple_stmt\nsymbol.single_input\nsymbol.sliceop\nsymbol.small_stmt\nsymbol.stmt\nsymbol.subscript\nsymbol.subscriptlist\nsymbol.suite\nsymbol.sym_name\nsymbol.term\nsymbol.test\nsymbol.testlist\nsymbol.testlist1\nsymbol.testlist_gexp\nsymbol.testlist_safe\nsymbol.trailer\nsymbol.try_stmt\nsymbol.varargslist\nsymbol.while_stmt\nsymbol.xor_expr\nsymbol.yield_stmt\nsymtable.Class(??)\nsymtable.DEF_BOUND\nsymtable.DEF_DOUBLESTAR\nsymtable.DEF_FREE\nsymtable.DEF_FREE_CLASS\nsymtable.DEF_FREE_GLOBAL\nsymtable.DEF_GLOBAL\nsymtable.DEF_IMPORT\nsymtable.DEF_INTUPLE\nsymtable.DEF_LOCAL\nsymtable.DEF_PARAM\nsymtable.DEF_STAR\nsymtable.Function(??)\nsymtable.OPT_BARE_EXEC\nsymtable.OPT_EXEC\nsymtable.OPT_IMPORT_STAR\nsymtable.Symbol(??)\nsymtable.SymbolTable(??)\nsymtable.SymbolTableFactory(??)\nsymtable.USE\nsymtable.is_free(??)\nsymtable.newSymbolTable\nsymtable.symtable(??)\nsymtable.weakref\nsys.api_version\nsys.argv\nsys.builtin_module_names\nsys.byteorder\nsys.call_tracing(func, args) -> object\nsys.callstats() -> tuple of integers\nsys.copyright\nsys.displayhook(object) -> None\nsys.exc_clear() -> None\nsys.exc_info() -> (type, value, traceback)\nsys.exc_type\nsys.excepthook(exctype, value, traceback) -> None\nsys.exec_prefix\nsys.executable\nsys.exit([status])\nsys.getcheckinterval() -> current check interval; see setcheckinterval().\nsys.getdefaultencoding() -> string\nsys.getdlopenflags() -> int\nsys.getfilesystemencoding() -> string\nsys.getrecursionlimit()\nsys.getrefcount(object) -> integer\nsys.hexversion\nsys.maxint\nsys.maxunicode\nsys.meta_path\nsys.modules\nsys.path\nsys.path_hooks\nsys.path_importer_cache\nsys.platform\nsys.prefix\nsys.setcheckinterval(n)\nsys.setdlopenflags(n) -> None\nsys.setprofile(function)\nsys.setrecursionlimit(n)\nsys.settrace(function)\nsys.stderr\nsys.stdin\nsys.stdout\nsys.version\nsys.version_info\nsys.warnoptions\nsyslog.LOG_ALERT\nsyslog.LOG_AUTH\nsyslog.LOG_CONS\nsyslog.LOG_CRIT\nsyslog.LOG_CRON\nsyslog.LOG_DAEMON\nsyslog.LOG_DEBUG\nsyslog.LOG_EMERG\nsyslog.LOG_ERR\nsyslog.LOG_INFO\nsyslog.LOG_KERN\nsyslog.LOG_LOCAL0\nsyslog.LOG_LOCAL1\nsyslog.LOG_LOCAL2\nsyslog.LOG_LOCAL3\nsyslog.LOG_LOCAL4\nsyslog.LOG_LOCAL5\nsyslog.LOG_LOCAL6\nsyslog.LOG_LOCAL7\nsyslog.LOG_LPR\nsyslog.LOG_MAIL\nsyslog.LOG_MASK\nsyslog.LOG_NDELAY\nsyslog.LOG_NEWS\nsyslog.LOG_NOTICE\nsyslog.LOG_NOWAIT\nsyslog.LOG_PERROR\nsyslog.LOG_PID\nsyslog.LOG_SYSLOG\nsyslog.LOG_UPTO\nsyslog.LOG_USER\nsyslog.LOG_UUCP\nsyslog.LOG_WARNING\nsyslog.closelog\nsyslog.openlog\nsyslog.setlogmask\nsyslog.syslog\ntabnanny.NannyNag(??)\ntabnanny.Whitespace(??)\ntabnanny.check(file_or_dir)\ntabnanny.errprint(??)\ntabnanny.filename_only\ntabnanny.format_witnesses(??)\ntabnanny.getopt\ntabnanny.main(??)\ntabnanny.os\ntabnanny.process_tokens(??)\ntabnanny.sys\ntabnanny.tokenize\ntabnanny.verbose\ntarfile.AREGTYPE\ntarfile.BLKTYPE\ntarfile.BLOCKSIZE\ntarfile.CHRTYPE\ntarfile.CONTTYPE\ntarfile.CompressionError(??)\ntarfile.DIRTYPE\ntarfile.ExFileObject\ntarfile.ExtractError(??)\ntarfile.FIFOTYPE\ntarfile.GNUTYPE_LONGLINK\ntarfile.GNUTYPE_LONGNAME\ntarfile.GNUTYPE_SPARSE\ntarfile.LENGTH_LINK\ntarfile.LENGTH_NAME\ntarfile.LENGTH_PREFIX\ntarfile.LNKTYPE\ntarfile.MAGIC\ntarfile.MAXSIZE_MEMBER\ntarfile.NUL\ntarfile.RECORDSIZE\ntarfile.REGTYPE\ntarfile.REGULAR_TYPES\ntarfile.ReadError(??)\ntarfile.SUPPORTED_TYPES\ntarfile.SYMTYPE\ntarfile.S_IFBLK\ntarfile.S_IFCHR\ntarfile.S_IFDIR\ntarfile.S_IFIFO\ntarfile.S_IFLNK\ntarfile.S_IFREG\ntarfile.StreamError(??)\ntarfile.TAR_GZIPPED\ntarfile.TAR_PLAIN\ntarfile.TGEXEC\ntarfile.TGREAD\ntarfile.TGWRITE\ntarfile.TOEXEC\ntarfile.TOREAD\ntarfile.TOWRITE\ntarfile.TSGID\ntarfile.TSUID\ntarfile.TSVTX\ntarfile.TUEXEC\ntarfile.TUREAD\ntarfile.TUWRITE\ntarfile.TarError(??)\ntarfile.TarFile\ntarfile.TarFileCompat(??)\ntarfile.TarInfo\ntarfile.TarIter(??)\ntarfile.VERSION\ntarfile.calc_chksum(??)\ntarfile.copyfileobj(??)\ntarfile.errno\ntarfile.filemode(??)\ntarfile.filemode_table\ntarfile.grp\ntarfile.is_tarfile(??)\ntarfile.normpath(??)\ntarfile.nts(??)\ntarfile.open\ntarfile.os\ntarfile.pwd\ntarfile.shutil\ntarfile.stat\ntarfile.struct\ntarfile.sys\ntarfile.time\ntarfile.version\ntelnetlib.AO\ntelnetlib.AUTHENTICATION\ntelnetlib.AYT\ntelnetlib.BINARY\ntelnetlib.BM\ntelnetlib.BRK\ntelnetlib.CHARSET\ntelnetlib.COM_PORT_OPTION\ntelnetlib.DEBUGLEVEL\ntelnetlib.DET\ntelnetlib.DM\ntelnetlib.DO\ntelnetlib.DONT\ntelnetlib.EC\ntelnetlib.ECHO\ntelnetlib.EL\ntelnetlib.ENCRYPT\ntelnetlib.EOR\ntelnetlib.EXOPL\ntelnetlib.FORWARD_X\ntelnetlib.GA\ntelnetlib.IAC\ntelnetlib.IP\ntelnetlib.KERMIT\ntelnetlib.LFLOW\ntelnetlib.LINEMODE\ntelnetlib.LOGOUT\ntelnetlib.NAMS\ntelnetlib.NAOCRD\ntelnetlib.NAOFFD\ntelnetlib.NAOHTD\ntelnetlib.NAOHTS\ntelnetlib.NAOL\ntelnetlib.NAOLFD\ntelnetlib.NAOP\ntelnetlib.NAOVTD\ntelnetlib.NAOVTS\ntelnetlib.NAWS\ntelnetlib.NEW_ENVIRON\ntelnetlib.NOOPT\ntelnetlib.NOP\ntelnetlib.OLD_ENVIRON\ntelnetlib.OUTMRK\ntelnetlib.PRAGMA_HEARTBEAT\ntelnetlib.PRAGMA_LOGON\ntelnetlib.RCP\ntelnetlib.RCTE\ntelnetlib.RSP\ntelnetlib.SB\ntelnetlib.SE\ntelnetlib.SEND_URL\ntelnetlib.SGA\ntelnetlib.SNDLOC\ntelnetlib.SSPI_LOGON\ntelnetlib.STATUS\ntelnetlib.SUPDUP\ntelnetlib.SUPDUPOUTPUT\ntelnetlib.SUPPRESS_LOCAL_ECHO\ntelnetlib.TELNET_PORT\ntelnetlib.TLS\ntelnetlib.TM\ntelnetlib.TN3270E\ntelnetlib.TSPEED\ntelnetlib.TTYLOC\ntelnetlib.TTYPE\ntelnetlib.TUID\ntelnetlib.Telnet(??)\ntelnetlib.VT3270REGIME\ntelnetlib.WILL\ntelnetlib.WONT\ntelnetlib.X3PAD\ntelnetlib.XASCII\ntelnetlib.XAUTH\ntelnetlib.XDISPLOC\ntelnetlib.select\ntelnetlib.socket\ntelnetlib.sys\ntelnetlib.test(??)\ntelnetlib.theNULL\ntempfile.NamedTemporaryFile(??)\ntempfile.TMP_MAX\ntempfile.TemporaryFile(??)\ntempfile.gettempdir(??)\ntempfile.gettempprefix(??)\ntempfile.mkdtemp([suffix, [prefix, [dir]]])\ntempfile.mkstemp([suffix, [prefix, [dir, [text]]]])\ntempfile.mktemp([suffix, [prefix, [dir]]])\ntempfile.tempdir\ntempfile.template\ntermios.B0\ntermios.B110\ntermios.B115200\ntermios.B1200\ntermios.B134\ntermios.B150\ntermios.B1800\ntermios.B19200\ntermios.B200\ntermios.B230400\ntermios.B2400\ntermios.B300\ntermios.B38400\ntermios.B460800\ntermios.B4800\ntermios.B50\ntermios.B57600\ntermios.B600\ntermios.B75\ntermios.B9600\ntermios.BRKINT\ntermios.BS0\ntermios.BS1\ntermios.BSDLY\ntermios.CBAUD\ntermios.CBAUDEX\ntermios.CDSUSP\ntermios.CEOF\ntermios.CEOL\ntermios.CEOT\ntermios.CERASE\ntermios.CFLUSH\ntermios.CIBAUD\ntermios.CINTR\ntermios.CKILL\ntermios.CLNEXT\ntermios.CLOCAL\ntermios.CQUIT\ntermios.CR0\ntermios.CR1\ntermios.CR2\ntermios.CR3\ntermios.CRDLY\ntermios.CREAD\ntermios.CRPRNT\ntermios.CRTSCTS\ntermios.CS5\ntermios.CS6\ntermios.CS7\ntermios.CS8\ntermios.CSIZE\ntermios.CSTART\ntermios.CSTOP\ntermios.CSTOPB\ntermios.CSUSP\ntermios.CWERASE\ntermios.ECHO\ntermios.ECHOCTL\ntermios.ECHOE\ntermios.ECHOK\ntermios.ECHOKE\ntermios.ECHONL\ntermios.ECHOPRT\ntermios.EXTA\ntermios.EXTB\ntermios.FF0\ntermios.FF1\ntermios.FFDLY\ntermios.FIOASYNC\ntermios.FIOCLEX\ntermios.FIONBIO\ntermios.FIONCLEX\ntermios.FIONREAD\ntermios.FLUSHO\ntermios.HUPCL\ntermios.ICANON\ntermios.ICRNL\ntermios.IEXTEN\ntermios.IGNBRK\ntermios.IGNCR\ntermios.IGNPAR\ntermios.IMAXBEL\ntermios.INLCR\ntermios.INPCK\ntermios.IOCSIZE_MASK\ntermios.IOCSIZE_SHIFT\ntermios.ISIG\ntermios.ISTRIP\ntermios.IUCLC\ntermios.IXANY\ntermios.IXOFF\ntermios.IXON\ntermios.NCC\ntermios.NCCS\ntermios.NL0\ntermios.NL1\ntermios.NLDLY\ntermios.NOFLSH\ntermios.N_MOUSE\ntermios.N_PPP\ntermios.N_SLIP\ntermios.N_STRIP\ntermios.N_TTY\ntermios.OCRNL\ntermios.OFDEL\ntermios.OFILL\ntermios.OLCUC\ntermios.ONLCR\ntermios.ONLRET\ntermios.ONOCR\ntermios.OPOST\ntermios.PARENB\ntermios.PARMRK\ntermios.PARODD\ntermios.PENDIN\ntermios.TAB0\ntermios.TAB1\ntermios.TAB2\ntermios.TAB3\ntermios.TABDLY\ntermios.TCFLSH\ntermios.TCGETA\ntermios.TCGETS\ntermios.TCIFLUSH\ntermios.TCIOFF\ntermios.TCIOFLUSH\ntermios.TCION\ntermios.TCOFLUSH\ntermios.TCOOFF\ntermios.TCOON\ntermios.TCSADRAIN\ntermios.TCSAFLUSH\ntermios.TCSANOW\ntermios.TCSBRK\ntermios.TCSBRKP\ntermios.TCSETA\ntermios.TCSETAF\ntermios.TCSETAW\ntermios.TCSETS\ntermios.TCSETSF\ntermios.TCSETSW\ntermios.TCXONC\ntermios.TIOCCONS\ntermios.TIOCEXCL\ntermios.TIOCGETD\ntermios.TIOCGICOUNT\ntermios.TIOCGLCKTRMIOS\ntermios.TIOCGPGRP\ntermios.TIOCGSERIAL\ntermios.TIOCGSOFTCAR\ntermios.TIOCGWINSZ\ntermios.TIOCINQ\ntermios.TIOCLINUX\ntermios.TIOCMBIC\ntermios.TIOCMBIS\ntermios.TIOCMGET\ntermios.TIOCMIWAIT\ntermios.TIOCMSET\ntermios.TIOCM_CAR\ntermios.TIOCM_CD\ntermios.TIOCM_CTS\ntermios.TIOCM_DSR\ntermios.TIOCM_DTR\ntermios.TIOCM_LE\ntermios.TIOCM_RI\ntermios.TIOCM_RNG\ntermios.TIOCM_RTS\ntermios.TIOCM_SR\ntermios.TIOCM_ST\ntermios.TIOCNOTTY\ntermios.TIOCNXCL\ntermios.TIOCOUTQ\ntermios.TIOCPKT\ntermios.TIOCPKT_DATA\ntermios.TIOCPKT_DOSTOP\ntermios.TIOCPKT_FLUSHREAD\ntermios.TIOCPKT_FLUSHWRITE\ntermios.TIOCPKT_NOSTOP\ntermios.TIOCPKT_START\ntermios.TIOCPKT_STOP\ntermios.TIOCSCTTY\ntermios.TIOCSERCONFIG\ntermios.TIOCSERGETLSR\ntermios.TIOCSERGETMULTI\ntermios.TIOCSERGSTRUCT\ntermios.TIOCSERGWILD\ntermios.TIOCSERSETMULTI\ntermios.TIOCSERSWILD\ntermios.TIOCSER_TEMT\ntermios.TIOCSETD\ntermios.TIOCSLCKTRMIOS\ntermios.TIOCSPGRP\ntermios.TIOCSSERIAL\ntermios.TIOCSSOFTCAR\ntermios.TIOCSTI\ntermios.TIOCSWINSZ\ntermios.TOSTOP\ntermios.VDISCARD\ntermios.VEOF\ntermios.VEOL\ntermios.VEOL2\ntermios.VERASE\ntermios.VINTR\ntermios.VKILL\ntermios.VLNEXT\ntermios.VMIN\ntermios.VQUIT\ntermios.VREPRINT\ntermios.VSTART\ntermios.VSTOP\ntermios.VSUSP\ntermios.VSWTC\ntermios.VSWTCH\ntermios.VT0\ntermios.VT1\ntermios.VTDLY\ntermios.VTIME\ntermios.VWERASE\ntermios.XCASE\ntermios.XTABS\ntermios.error(??)\ntermios.tcdrain(fd) -> None\ntermios.tcflow(fd, action) -> None\ntermios.tcflush(fd, queue) -> None\ntermios.tcgetattr(fd) -> list_of_attrs\ntermios.tcsendbreak(fd, duration) -> None\ntermios.tcsetattr(fd, when, attributes) -> None\ntextwrap.TextWrapper(??)\ntextwrap.dedent(text : string) -> string\ntextwrap.fill(??)\ntextwrap.re\ntextwrap.string\ntextwrap.wrap(??)\nthis.c\nthis.d\nthis.i\nthis.s\nthread.LockType\nthread.allocate\nthread.allocate_lock() -> lock object\nthread.error(??)\nthread.exit()\nthread.exit_thread\nthread.get_ident() -> integer\nthread.interrupt_main()\nthread.start_new\nthread.start_new_thread(function, args[, kwargs])\nthreading.BoundedSemaphore(??)\nthreading.Condition(??)\nthreading.Event(??)\nthreading.Lock\nthreading.RLock(??)\nthreading.Semaphore(??)\nthreading.Thread\nthreading.ThreadError(??)\nthreading.Timer(??)\nthreading.activeCount(??)\nthreading.currentThread(??)\nthreading.deque(iterable) --> deque object\nthreading.enumerate(??)\nthreading.local\nthreading.setprofile(??)\nthreading.settrace(??)\ntime.accept2dyear\ntime.altzone\ntime.asctime([tuple]) -> string\ntime.clock() -> floating point number\ntime.ctime(seconds) -> string\ntime.daylight\ntime.gmtime([seconds]) -> (tm_year, tm_mon, tm_day, tm_hour, tm_min,\ntime.localtime([seconds]) -> (tm_year,tm_mon,tm_day,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)\ntime.mktime(tuple) -> floating point number\ntime.sleep(seconds)\ntime.strftime(format[, tuple]) -> string\ntime.strptime(string, format) -> struct_time\ntime.struct_time\ntime.time() -> floating point number\ntime.timezone\ntime.tzname\ntime.tzset(zone)\ntimeit.Timer(??)\ntimeit.default_number\ntimeit.default_repeat\ntimeit.default_timer\ntimeit.dummy_src_name\ntimeit.gc\ntimeit.itertools\ntimeit.main(??)\ntimeit.reindent(??)\ntimeit.sys\ntimeit.template\ntimeit.time\ntiming.finish\ntiming.micro\ntiming.milli\ntiming.seconds\ntiming.start\ntoaiff.error(??)\ntoaiff.os\ntoaiff.pipes\ntoaiff.sndhdr\ntoaiff.t\ntoaiff.table\ntoaiff.tempfile\ntoaiff.toaiff(??)\ntoaiff.uncompress\ntoken.AMPER\ntoken.AMPEREQUAL\ntoken.AT\ntoken.BACKQUOTE\ntoken.CIRCUMFLEX\ntoken.CIRCUMFLEXEQUAL\ntoken.COLON\ntoken.COMMA\ntoken.DEDENT\ntoken.DOT\ntoken.DOUBLESLASH\ntoken.DOUBLESLASHEQUAL\ntoken.DOUBLESTAR\ntoken.DOUBLESTAREQUAL\ntoken.ENDMARKER\ntoken.EQEQUAL\ntoken.EQUAL\ntoken.ERRORTOKEN\ntoken.GREATER\ntoken.GREATEREQUAL\ntoken.INDENT\ntoken.ISEOF(??)\ntoken.ISNONTERMINAL(??)\ntoken.ISTERMINAL(??)\ntoken.LBRACE\ntoken.LEFTSHIFT\ntoken.LEFTSHIFTEQUAL\ntoken.LESS\ntoken.LESSEQUAL\ntoken.LPAR\ntoken.LSQB\ntoken.MINEQUAL\ntoken.MINUS\ntoken.NAME\ntoken.NEWLINE\ntoken.NOTEQUAL\ntoken.NT_OFFSET\ntoken.NUMBER\ntoken.N_TOKENS\ntoken.OP\ntoken.PERCENT\ntoken.PERCENTEQUAL\ntoken.PLUS\ntoken.PLUSEQUAL\ntoken.RBRACE\ntoken.RIGHTSHIFT\ntoken.RIGHTSHIFTEQUAL\ntoken.RPAR\ntoken.RSQB\ntoken.SEMI\ntoken.SLASH\ntoken.SLASHEQUAL\ntoken.STAR\ntoken.STAREQUAL\ntoken.STRING\ntoken.TILDE\ntoken.VBAR\ntoken.VBAREQUAL\ntoken.main(??)\ntoken.tok_name\ntokenize.AMPER\ntokenize.AMPEREQUAL\ntokenize.AT\ntokenize.BACKQUOTE\ntokenize.Bracket\ntokenize.CIRCUMFLEX\ntokenize.CIRCUMFLEXEQUAL\ntokenize.COLON\ntokenize.COMMA\ntokenize.COMMENT\ntokenize.Comment\ntokenize.ContStr\ntokenize.DEDENT\ntokenize.DOT\ntokenize.DOUBLESLASH\ntokenize.DOUBLESLASHEQUAL\ntokenize.DOUBLESTAR\ntokenize.DOUBLESTAREQUAL\ntokenize.Decnumber\ntokenize.Double\ntokenize.Double3\ntokenize.ENDMARKER\ntokenize.EQEQUAL\ntokenize.EQUAL\ntokenize.ERRORTOKEN\ntokenize.Expfloat\ntokenize.Exponent\ntokenize.Floatnumber\ntokenize.Funny\ntokenize.GREATER\ntokenize.GREATEREQUAL\ntokenize.Hexnumber\ntokenize.INDENT\ntokenize.ISEOF(??)\ntokenize.ISNONTERMINAL(??)\ntokenize.ISTERMINAL(??)\ntokenize.Ignore\ntokenize.Imagnumber\ntokenize.Intnumber\ntokenize.LBRACE\ntokenize.LEFTSHIFT\ntokenize.LEFTSHIFTEQUAL\ntokenize.LESS\ntokenize.LESSEQUAL\ntokenize.LPAR\ntokenize.LSQB\ntokenize.MINEQUAL\ntokenize.MINUS\ntokenize.NAME\ntokenize.NEWLINE\ntokenize.NL\ntokenize.NOTEQUAL\ntokenize.NT_OFFSET\ntokenize.NUMBER\ntokenize.N_TOKENS\ntokenize.Name\ntokenize.Number\ntokenize.OP\ntokenize.Octnumber\ntokenize.Operator\ntokenize.PERCENT\ntokenize.PERCENTEQUAL\ntokenize.PLUS\ntokenize.PLUSEQUAL\ntokenize.PlainToken\ntokenize.Pointfloat\ntokenize.PseudoExtras\ntokenize.PseudoToken\ntokenize.RBRACE\ntokenize.RIGHTSHIFT\ntokenize.RIGHTSHIFTEQUAL\ntokenize.RPAR\ntokenize.RSQB\ntokenize.SEMI\ntokenize.SLASH\ntokenize.SLASHEQUAL\ntokenize.STAR\ntokenize.STAREQUAL\ntokenize.STRING\ntokenize.Single\ntokenize.Single3\ntokenize.Special\ntokenize.StopTokenizing(??)\ntokenize.String\ntokenize.TILDE\ntokenize.Token\ntokenize.TokenError(??)\ntokenize.Triple\ntokenize.VBAR\ntokenize.VBAREQUAL\ntokenize.Whitespace\ntokenize.any(??)\ntokenize.double3prog\ntokenize.endprogs\ntokenize.generate_tokens(??)\ntokenize.group(??)\ntokenize.main(??)\ntokenize.maybe(??)\ntokenize.printtoken(??)\ntokenize.pseudoprog\ntokenize.re\ntokenize.single3prog\ntokenize.single_quoted\ntokenize.string\ntokenize.t\ntokenize.tabsize\ntokenize.tok_name\ntokenize.tokenize(??)\ntokenize.tokenize_loop(??)\ntokenize.tokenprog\ntokenize.triple_quoted\ntrace.CoverageResults(??)\ntrace.Ignore(??)\ntrace.PRAGMA_NOCOVER\ntrace.Trace(??)\ntrace.cPickle\ntrace.find_executable_linenos(??)\ntrace.find_lines(??)\ntrace.find_lines_from_code(??)\ntrace.find_strings(??)\ntrace.fullmodname(??)\ntrace.gc\ntrace.linecache\ntrace.main(??)\ntrace.modname(??)\ntrace.os\ntrace.pickle\ntrace.re\ntrace.rx_blank\ntrace.sys\ntrace.threading\ntrace.token\ntrace.tokenize\ntrace.types\ntrace.usage(??)\ntraceback.extract_stack(??)\ntraceback.extract_tb(??)\ntraceback.format_exc(??)\ntraceback.format_exception(??)\ntraceback.format_exception_only(??)\ntraceback.format_list(??)\ntraceback.format_stack(??)\ntraceback.format_tb(??)\ntraceback.linecache\ntraceback.print_exc(??)\ntraceback.print_exception(??)\ntraceback.print_last(??)\ntraceback.print_list(??)\ntraceback.print_stack(??)\ntraceback.print_tb(??)\ntraceback.sys\ntraceback.tb_lineno(??)\ntraceback.types\ntty.B0\ntty.B110\ntty.B115200\ntty.B1200\ntty.B134\ntty.B150\ntty.B1800\ntty.B19200\ntty.B200\ntty.B230400\ntty.B2400\ntty.B300\ntty.B38400\ntty.B460800\ntty.B4800\ntty.B50\ntty.B57600\ntty.B600\ntty.B75\ntty.B9600\ntty.BRKINT\ntty.BS0\ntty.BS1\ntty.BSDLY\ntty.CBAUD\ntty.CBAUDEX\ntty.CC\ntty.CDSUSP\ntty.CEOF\ntty.CEOL\ntty.CEOT\ntty.CERASE\ntty.CFLAG\ntty.CFLUSH\ntty.CIBAUD\ntty.CINTR\ntty.CKILL\ntty.CLNEXT\ntty.CLOCAL\ntty.CQUIT\ntty.CR0\ntty.CR1\ntty.CR2\ntty.CR3\ntty.CRDLY\ntty.CREAD\ntty.CRPRNT\ntty.CRTSCTS\ntty.CS5\ntty.CS6\ntty.CS7\ntty.CS8\ntty.CSIZE\ntty.CSTART\ntty.CSTOP\ntty.CSTOPB\ntty.CSUSP\ntty.CWERASE\ntty.ECHO\ntty.ECHOCTL\ntty.ECHOE\ntty.ECHOK\ntty.ECHOKE\ntty.ECHONL\ntty.ECHOPRT\ntty.EXTA\ntty.EXTB\ntty.FF0\ntty.FF1\ntty.FFDLY\ntty.FIOASYNC\ntty.FIOCLEX\ntty.FIONBIO\ntty.FIONCLEX\ntty.FIONREAD\ntty.FLUSHO\ntty.HUPCL\ntty.ICANON\ntty.ICRNL\ntty.IEXTEN\ntty.IFLAG\ntty.IGNBRK\ntty.IGNCR\ntty.IGNPAR\ntty.IMAXBEL\ntty.INLCR\ntty.INPCK\ntty.IOCSIZE_MASK\ntty.IOCSIZE_SHIFT\ntty.ISIG\ntty.ISPEED\ntty.ISTRIP\ntty.IUCLC\ntty.IXANY\ntty.IXOFF\ntty.IXON\ntty.LFLAG\ntty.NCC\ntty.NCCS\ntty.NL0\ntty.NL1\ntty.NLDLY\ntty.NOFLSH\ntty.N_MOUSE\ntty.N_PPP\ntty.N_SLIP\ntty.N_STRIP\ntty.N_TTY\ntty.OCRNL\ntty.OFDEL\ntty.OFILL\ntty.OFLAG\ntty.OLCUC\ntty.ONLCR\ntty.ONLRET\ntty.ONOCR\ntty.OPOST\ntty.OSPEED\ntty.PARENB\ntty.PARMRK\ntty.PARODD\ntty.PENDIN\ntty.TAB0\ntty.TAB1\ntty.TAB2\ntty.TAB3\ntty.TABDLY\ntty.TCFLSH\ntty.TCGETA\ntty.TCGETS\ntty.TCIFLUSH\ntty.TCIOFF\ntty.TCIOFLUSH\ntty.TCION\ntty.TCOFLUSH\ntty.TCOOFF\ntty.TCOON\ntty.TCSADRAIN\ntty.TCSAFLUSH\ntty.TCSANOW\ntty.TCSBRK\ntty.TCSBRKP\ntty.TCSETA\ntty.TCSETAF\ntty.TCSETAW\ntty.TCSETS\ntty.TCSETSF\ntty.TCSETSW\ntty.TCXONC\ntty.TIOCCONS\ntty.TIOCEXCL\ntty.TIOCGETD\ntty.TIOCGICOUNT\ntty.TIOCGLCKTRMIOS\ntty.TIOCGPGRP\ntty.TIOCGSERIAL\ntty.TIOCGSOFTCAR\ntty.TIOCGWINSZ\ntty.TIOCINQ\ntty.TIOCLINUX\ntty.TIOCMBIC\ntty.TIOCMBIS\ntty.TIOCMGET\ntty.TIOCMIWAIT\ntty.TIOCMSET\ntty.TIOCM_CAR\ntty.TIOCM_CD\ntty.TIOCM_CTS\ntty.TIOCM_DSR\ntty.TIOCM_DTR\ntty.TIOCM_LE\ntty.TIOCM_RI\ntty.TIOCM_RNG\ntty.TIOCM_RTS\ntty.TIOCM_SR\ntty.TIOCM_ST\ntty.TIOCNOTTY\ntty.TIOCNXCL\ntty.TIOCOUTQ\ntty.TIOCPKT\ntty.TIOCPKT_DATA\ntty.TIOCPKT_DOSTOP\ntty.TIOCPKT_FLUSHREAD\ntty.TIOCPKT_FLUSHWRITE\ntty.TIOCPKT_NOSTOP\ntty.TIOCPKT_START\ntty.TIOCPKT_STOP\ntty.TIOCSCTTY\ntty.TIOCSERCONFIG\ntty.TIOCSERGETLSR\ntty.TIOCSERGETMULTI\ntty.TIOCSERGSTRUCT\ntty.TIOCSERGWILD\ntty.TIOCSERSETMULTI\ntty.TIOCSERSWILD\ntty.TIOCSER_TEMT\ntty.TIOCSETD\ntty.TIOCSLCKTRMIOS\ntty.TIOCSPGRP\ntty.TIOCSSERIAL\ntty.TIOCSSOFTCAR\ntty.TIOCSTI\ntty.TIOCSWINSZ\ntty.TOSTOP\ntty.VDISCARD\ntty.VEOF\ntty.VEOL\ntty.VEOL2\ntty.VERASE\ntty.VINTR\ntty.VKILL\ntty.VLNEXT\ntty.VMIN\ntty.VQUIT\ntty.VREPRINT\ntty.VSTART\ntty.VSTOP\ntty.VSUSP\ntty.VSWTC\ntty.VSWTCH\ntty.VT0\ntty.VT1\ntty.VTDLY\ntty.VTIME\ntty.VWERASE\ntty.XCASE\ntty.XTABS\ntty.error(??)\ntty.setcbreak(??)\ntty.setraw(??)\ntty.tcdrain(fd) -> None\ntty.tcflow(fd, action) -> None\ntty.tcflush(fd, queue) -> None\ntty.tcgetattr(fd) -> list_of_attrs\ntty.tcsendbreak(fd, duration) -> None\ntty.tcsetattr(fd, when, attributes) -> None\ntuple() -> an empty tuple\ntype(object) -> the object's type\ntypes.BooleanType\ntypes.BufferType\ntypes.BuiltinFunctionType\ntypes.BuiltinMethodType\ntypes.ClassType\ntypes.CodeType\ntypes.ComplexType\ntypes.DictProxyType\ntypes.DictType\ntypes.DictionaryType\ntypes.EllipsisType\ntypes.FileType\ntypes.FloatType\ntypes.FrameType\ntypes.FunctionType\ntypes.GeneratorType\ntypes.InstanceType\ntypes.IntType\ntypes.LambdaType\ntypes.ListType\ntypes.LongType\ntypes.MethodType\ntypes.ModuleType\ntypes.NoneType\ntypes.NotImplementedType\ntypes.ObjectType\ntypes.SliceType\ntypes.StringType\ntypes.StringTypes\ntypes.TracebackType\ntypes.TupleType\ntypes.TypeType\ntypes.UnboundMethodType\ntypes.UnicodeType\ntypes.XRangeType\nunichr(i) -> Unicode character\nunicode(string [, encoding[, errors]]) -> object\nunicodedata.bidirectional\nunicodedata.category\nunicodedata.combining\nunicodedata.decimal\nunicodedata.decomposition\nunicodedata.digit\nunicodedata.east_asian_width\nunicodedata.lookup\nunicodedata.mirrored\nunicodedata.name\nunicodedata.normalize\nunicodedata.numeric\nunicodedata.ucnhash_CAPI\nunicodedata.unidata_version\nunittest.FunctionTestCase\nunittest.TestCase\nunittest.TestLoader\nunittest.TestProgram\nunittest.TestResult\nunittest.TestSuite\nunittest.TextTestRunner\nunittest.defaultTestLoader\nunittest.findTestCases(??)\nunittest.getTestCaseNames(??)\nunittest.main\nunittest.makeSuite(??)\nunittest.os\nunittest.sys\nunittest.time\nunittest.traceback\nunittest.types\nurllib.ContentTooShortError(??)\nurllib.FancyURLopener(??)\nurllib.MAXFTPCACHE\nurllib.URLopener(??)\nurllib.addbase(??)\nurllib.addclosehook(??)\nurllib.addinfo(??)\nurllib.addinfourl(??)\nurllib.always_safe\nurllib.basejoin(??)\nurllib.ftpcache\nurllib.ftperrors(??)\nurllib.ftpwrapper(??)\nurllib.getproxies(??)\nurllib.getproxies_environment(??)\nurllib.localhost(??)\nurllib.main(??)\nurllib.noheaders(??)\nurllib.os\nurllib.pathname2url(??)\nurllib.proxy_bypass(??)\nurllib.quote('abc def') -> 'abc%20def'\nurllib.quote_plus(??)\nurllib.reporthook(??)\nurllib.socket\nurllib.splitattr('/path;attr1=value1;attr2=value2;...') ->\nurllib.splitgophertype('/Xselector') --> 'X', 'selector'.\nurllib.splithost('//host[:port]/path') --> 'host[:port]', '/path'.\nurllib.splitnport(??)\nurllib.splitpasswd('user:passwd') -> 'user', 'passwd'.\nurllib.splitport('host:port') --> 'host', 'port'.\nurllib.splitquery('/path?query') --> '/path', 'query'.\nurllib.splittag('/path#tag') --> '/path', 'tag'.\nurllib.splittype('type:opaquestring') --> 'type', 'opaquestring'.\nurllib.splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.\nurllib.splitvalue('attr=value') --> 'attr', 'value'.\nurllib.string\nurllib.sys\nurllib.test(??)\nurllib.test1(??)\nurllib.thishost(??)\nurllib.time\nurllib.toBytes(u\"URL\") --> 'URL'.\nurllib.unquote('abc%20def') -> 'abc def'.\nurllib.unquote_plus(??)\nurllib.unwrap('<URL:type://host/path>') --> 'type://host/path'.\nurllib.url2pathname(??)\nurllib.urlcleanup(??)\nurllib.urlencode(??)\nurllib.urlopen(url [, data]) -> open file-like object\nurllib.urlretrieve(??)\nurllib2.AbstractBasicAuthHandler(??)\nurllib2.AbstractDigestAuthHandler(??)\nurllib2.AbstractHTTPHandler(??)\nurllib2.BaseHandler(??)\nurllib2.CacheFTPHandler(??)\nurllib2.CustomProxy(??)\nurllib2.CustomProxyHandler(??)\nurllib2.FTPHandler(??)\nurllib2.FileHandler(??)\nurllib2.GopherError(??)\nurllib2.GopherHandler(??)\nurllib2.HTTPBasicAuthHandler(??)\nurllib2.HTTPCookieProcessor(??)\nurllib2.HTTPDefaultErrorHandler(??)\nurllib2.HTTPDigestAuthHandler(??)\nurllib2.HTTPError(??)\nurllib2.HTTPErrorProcessor(??)\nurllib2.HTTPHandler(??)\nurllib2.HTTPPasswordMgr(??)\nurllib2.HTTPPasswordMgrWithDefaultRealm(??)\nurllib2.HTTPRedirectHandler(??)\nurllib2.HTTPSHandler(??)\nurllib2.OpenerDirector(??)\nurllib2.OpenerFactory(??)\nurllib2.ProxyBasicAuthHandler(??)\nurllib2.ProxyDigestAuthHandler(??)\nurllib2.ProxyHandler(??)\nurllib2.Request(??)\nurllib2.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nurllib2.URLError(??)\nurllib2.UnknownHandler(??)\nurllib2.addinfourl(??)\nurllib2.base64\nurllib2.bisect\nurllib2.build_opener(??)\nurllib2.cookielib\nurllib2.ftplib\nurllib2.ftpwrapper(??)\nurllib2.getproxies(??)\nurllib2.gopherlib\nurllib2.httplib\nurllib2.inspect\nurllib2.install_opener(??)\nurllib2.localhost(??)\nurllib2.md5\nurllib2.mimetools\nurllib2.mimetypes\nurllib2.noheaders(??)\nurllib2.os\nurllib2.parse_http_list(??)\nurllib2.parse_keqv_list(??)\nurllib2.posixpath\nurllib2.random\nurllib2.randombytes(??)\nurllib2.re\nurllib2.sha\nurllib2.socket\nurllib2.splitattr('/path;attr1=value1;attr2=value2;...') ->\nurllib2.splitgophertype('/Xselector') --> 'X', 'selector'.\nurllib2.splithost('//host[:port]/path') --> 'host[:port]', '/path'.\nurllib2.splitpasswd('user:passwd') -> 'user', 'passwd'.\nurllib2.splitport('host:port') --> 'host', 'port'.\nurllib2.splitquery('/path?query') --> '/path', 'query'.\nurllib2.splittype('type:opaquestring') --> 'type', 'opaquestring'.\nurllib2.splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.\nurllib2.splitvalue('attr=value') --> 'attr', 'value'.\nurllib2.sys\nurllib2.time\nurllib2.unquote('abc%20def') -> 'abc def'.\nurllib2.unwrap('<URL:type://host/path>') --> 'type://host/path'.\nurllib2.url2pathname(??)\nurllib2.urlopen(??)\nurllib2.urlparse\nurlparse.MAX_CACHE_SIZE\nurlparse.clear_cache(??)\nurlparse.non_hierarchical\nurlparse.scheme_chars\nurlparse.test(??)\nurlparse.test_input\nurlparse.urldefrag(??)\nurlparse.urljoin(??)\nurlparse.urlparse(??)\nurlparse.urlsplit(??)\nurlparse.urlunparse(??)\nurlparse.urlunsplit(??)\nurlparse.uses_fragment\nurlparse.uses_netloc\nurlparse.uses_params\nurlparse.uses_query\nurlparse.uses_relative\nuser.home\nuser.os\nuser.pythonrc\nuu.Error(??)\nuu.StringType\nuu.binascii\nuu.decode(??)\nuu.encode(??)\nuu.os\nuu.sys\nuu.test(??)\nvars([object]) -> dictionary\nwarnings.defaultaction\nwarnings.filters\nwarnings.filterwarnings(??)\nwarnings.formatwarning(??)\nwarnings.linecache\nwarnings.onceregistry\nwarnings.resetwarnings(??)\nwarnings.showwarning(??)\nwarnings.simplefilter(??)\nwarnings.sys\nwarnings.types\nwarnings.warn(??)\nwarnings.warn_explicit(??)\nwave.Chunk(??)\nwave.Error(??)\nwave.WAVE_FORMAT_PCM\nwave.Wave_read(??)\nwave.Wave_write(??)\nwave.big_endian\nwave.open(??)\nwave.openfp(??)\nwave.struct\nweakref.CallableProxyType\nweakref.KeyedRef\nweakref.ProxyType\nweakref.ProxyTypes\nweakref.ReferenceError(??)\nweakref.ReferenceType\nweakref.UserDict\nweakref.WeakKeyDictionary(??)\nweakref.WeakValueDictionary(??)\nweakref.getweakrefcount(object) -- return the number of weak references\nweakref.getweakrefs(object) -- return a list of all weak reference objects\nweakref.proxy(object[, callback]) -- create a proxy object that weakly\nweakref.ref\nwebbrowser.Error(??)\nwebbrowser.Galeon(??)\nwebbrowser.GenericBrowser(??)\nwebbrowser.Grail(??)\nwebbrowser.InternetConfig(??)\nwebbrowser.Konqueror(??)\nwebbrowser.Netscape(??)\nwebbrowser.PROCESS_CREATION_DELAY\nwebbrowser.WindowsDefault(??)\nwebbrowser.browser\nwebbrowser.get(??)\nwebbrowser.open(??)\nwebbrowser.open_new(??)\nwebbrowser.os\nwebbrowser.register(??)\nwebbrowser.sys\nwhichdb.dbm\nwhichdb.os\nwhichdb.struct\nwhichdb.sys\nwhichdb.whichdb(??)\nwhrandom.choice\nwhrandom.randint\nwhrandom.random\nwhrandom.randrange\nwhrandom.seed\nwhrandom.uniform\nwhrandom.warnings\nwhrandom.whrandom(??)\nxdrlib.ConversionError(??)\nxdrlib.Error(??)\nxdrlib.Packer(??)\nxdrlib.Unpacker(??)\nxdrlib.struct\nxml.dom\nxml.dom.DOMException(??)\nxml.dom.DOMSTRING_SIZE_ERR\nxml.dom.DomstringSizeErr(??)\nxml.dom.EMPTY_NAMESPACE\nxml.dom.EMPTY_PREFIX\nxml.dom.HIERARCHY_REQUEST_ERR\nxml.dom.HierarchyRequestErr(??)\nxml.dom.INDEX_SIZE_ERR\nxml.dom.INUSE_ATTRIBUTE_ERR\nxml.dom.INVALID_ACCESS_ERR\nxml.dom.INVALID_CHARACTER_ERR\nxml.dom.INVALID_MODIFICATION_ERR\nxml.dom.INVALID_STATE_ERR\nxml.dom.IndexSizeErr(??)\nxml.dom.InuseAttributeErr(??)\nxml.dom.InvalidAccessErr(??)\nxml.dom.InvalidCharacterErr(??)\nxml.dom.InvalidModificationErr(??)\nxml.dom.InvalidStateErr(??)\nxml.dom.NAMESPACE_ERR\nxml.dom.NOT_FOUND_ERR\nxml.dom.NOT_SUPPORTED_ERR\nxml.dom.NO_DATA_ALLOWED_ERR\nxml.dom.NO_MODIFICATION_ALLOWED_ERR\nxml.dom.NamespaceErr(??)\nxml.dom.NoDataAllowedErr(??)\nxml.dom.NoModificationAllowedErr(??)\nxml.dom.Node(??)\nxml.dom.NodeFilter\nxml.dom.NodeFilter.NodeFilter(??)\nxml.dom.NotFoundErr(??)\nxml.dom.NotSupportedErr(??)\nxml.dom.SYNTAX_ERR\nxml.dom.SyntaxErr(??)\nxml.dom.UserDataHandler(??)\nxml.dom.VALIDATION_ERR\nxml.dom.ValidationErr(??)\nxml.dom.WRONG_DOCUMENT_ERR\nxml.dom.WrongDocumentErr(??)\nxml.dom.XHTML_NAMESPACE\nxml.dom.XMLNS_NAMESPACE\nxml.dom.XML_NAMESPACE\nxml.dom.domreg\nxml.dom.domreg.EmptyNodeList\nxml.dom.domreg.GetattrMagic(??)\nxml.dom.domreg.NewStyle\nxml.dom.domreg.NodeList\nxml.dom.domreg.StringTypes\nxml.dom.domreg.defproperty(??)\nxml.dom.domreg.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxml.dom.domreg.registerDOMImplementation(name, factory)\nxml.dom.domreg.registered\nxml.dom.domreg.well_known_implementations\nxml.dom.expatbuilder\nxml.dom.expatbuilder.CDATA_SECTION_NODE\nxml.dom.expatbuilder.DOCUMENT_NODE\nxml.dom.expatbuilder.EMPTY_NAMESPACE\nxml.dom.expatbuilder.EMPTY_PREFIX\nxml.dom.expatbuilder.ElementInfo\nxml.dom.expatbuilder.EmptyNodeList\nxml.dom.expatbuilder.ExpatBuilder(??)\nxml.dom.expatbuilder.ExpatBuilderNS(??)\nxml.dom.expatbuilder.FILTER_ACCEPT\nxml.dom.expatbuilder.FILTER_INTERRUPT\nxml.dom.expatbuilder.FILTER_REJECT\nxml.dom.expatbuilder.FILTER_SKIP\nxml.dom.expatbuilder.FilterCrutch\nxml.dom.expatbuilder.FilterVisibilityController\nxml.dom.expatbuilder.FragmentBuilder(??)\nxml.dom.expatbuilder.FragmentBuilderNS(??)\nxml.dom.expatbuilder.GetattrMagic(??)\nxml.dom.expatbuilder.InternalSubsetExtractor(??)\nxml.dom.expatbuilder.Namespaces(??)\nxml.dom.expatbuilder.NewStyle\nxml.dom.expatbuilder.Node(??)\nxml.dom.expatbuilder.NodeFilter(??)\nxml.dom.expatbuilder.NodeList\nxml.dom.expatbuilder.ParseEscape(??)\nxml.dom.expatbuilder.Rejecter\nxml.dom.expatbuilder.Skipper\nxml.dom.expatbuilder.StringTypes\nxml.dom.expatbuilder.TEXT_NODE\nxml.dom.expatbuilder.XMLNS_NAMESPACE\nxml.dom.expatbuilder.defproperty(??)\nxml.dom.expatbuilder.expat\nxml.dom.expatbuilder.makeBuilder(??)\nxml.dom.expatbuilder.minidom\nxml.dom.expatbuilder.parse(??)\nxml.dom.expatbuilder.parseFragment(??)\nxml.dom.expatbuilder.parseFragmentString(??)\nxml.dom.expatbuilder.parseString(??)\nxml.dom.expatbuilder.theDOMImplementation\nxml.dom.expatbuilder.xmlbuilder\nxml.dom.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxml.dom.minicompat\nxml.dom.minicompat.EmptyNodeList\nxml.dom.minicompat.GetattrMagic(??)\nxml.dom.minicompat.NewStyle\nxml.dom.minicompat.NodeList\nxml.dom.minicompat.StringTypes\nxml.dom.minicompat.defproperty(??)\nxml.dom.minicompat.xml\nxml.dom.minidom\nxml.dom.minidom.Attr(??)\nxml.dom.minidom.AttributeList\nxml.dom.minidom.CDATASection(??)\nxml.dom.minidom.CharacterData(??)\nxml.dom.minidom.Childless(??)\nxml.dom.minidom.Comment(??)\nxml.dom.minidom.DOMImplementation(??)\nxml.dom.minidom.DOMImplementationLS(??)\nxml.dom.minidom.Document(??)\nxml.dom.minidom.DocumentFragment(??)\nxml.dom.minidom.DocumentLS(??)\nxml.dom.minidom.DocumentType(??)\nxml.dom.minidom.EMPTY_NAMESPACE\nxml.dom.minidom.EMPTY_PREFIX\nxml.dom.minidom.Element(??)\nxml.dom.minidom.ElementInfo\nxml.dom.minidom.EmptyNodeList\nxml.dom.minidom.Entity(??)\nxml.dom.minidom.GetattrMagic(??)\nxml.dom.minidom.Identified(??)\nxml.dom.minidom.NamedNodeMap\nxml.dom.minidom.NewStyle\nxml.dom.minidom.Node(??)\nxml.dom.minidom.NodeList\nxml.dom.minidom.Notation(??)\nxml.dom.minidom.ProcessingInstruction(??)\nxml.dom.minidom.ReadOnlySequentialNamedNodeMap\nxml.dom.minidom.StringTypes\nxml.dom.minidom.Text(??)\nxml.dom.minidom.TypeInfo\nxml.dom.minidom.XMLNS_NAMESPACE\nxml.dom.minidom.defproperty(??)\nxml.dom.minidom.domreg\nxml.dom.minidom.getDOMImplementation(??)\nxml.dom.minidom.parse(??)\nxml.dom.minidom.parseString(??)\nxml.dom.minidom.xml\nxml.dom.pulldom\nxml.dom.pulldom.CHARACTERS\nxml.dom.pulldom.COMMENT\nxml.dom.pulldom.DOMEventStream(??)\nxml.dom.pulldom.END_DOCUMENT\nxml.dom.pulldom.END_ELEMENT\nxml.dom.pulldom.ErrorHandler(??)\nxml.dom.pulldom.IGNORABLE_WHITESPACE\nxml.dom.pulldom.PROCESSING_INSTRUCTION\nxml.dom.pulldom.PullDOM(??)\nxml.dom.pulldom.SAX2DOM(??)\nxml.dom.pulldom.START_DOCUMENT\nxml.dom.pulldom.START_ELEMENT\nxml.dom.pulldom.default_bufsize\nxml.dom.pulldom.parse(??)\nxml.dom.pulldom.parseString(??)\nxml.dom.pulldom.types\nxml.dom.pulldom.xml\nxml.dom.registerDOMImplementation(name, factory)\nxml.dom.xmlbuilder\nxml.dom.xmlbuilder.DOMBuilder(??)\nxml.dom.xmlbuilder.DOMBuilderFilter(??)\nxml.dom.xmlbuilder.DOMEntityResolver\nxml.dom.xmlbuilder.DOMImplementationLS(??)\nxml.dom.xmlbuilder.DOMInputSource\nxml.dom.xmlbuilder.DocumentLS(??)\nxml.dom.xmlbuilder.EmptyNodeList\nxml.dom.xmlbuilder.GetattrMagic(??)\nxml.dom.xmlbuilder.NewStyle\nxml.dom.xmlbuilder.NodeList\nxml.dom.xmlbuilder.Options(??)\nxml.dom.xmlbuilder.StringTypes\nxml.dom.xmlbuilder.copy\nxml.dom.xmlbuilder.defproperty(??)\nxml.dom.xmlbuilder.xml\nxml.parsers\nxml.parsers.expat\nxml.parsers.expat.EXPAT_VERSION\nxml.parsers.expat.ErrorString(errno) -> string\nxml.parsers.expat.ExpatError(??)\nxml.parsers.expat.ParserCreate([encoding[, namespace_separator]]) -> parser\nxml.parsers.expat.XMLParserType\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_ALWAYS\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_NEVER\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE\nxml.parsers.expat.error(??)\nxml.parsers.expat.errors\nxml.parsers.expat.features\nxml.parsers.expat.model\nxml.parsers.expat.native_encoding\nxml.parsers.expat.version_info\nxml.sax\nxml.sax.ContentHandler(??)\nxml.sax.ErrorHandler(??)\nxml.sax.InputSource(??)\nxml.sax.SAXException(??)\nxml.sax.SAXNotRecognizedException(??)\nxml.sax.SAXNotSupportedException(??)\nxml.sax.SAXParseException(??)\nxml.sax.SAXReaderNotAvailable(??)\nxml.sax.default_parser_list\nxml.sax.expatreader\nxml.sax.expatreader.AttributesImpl(??)\nxml.sax.expatreader.AttributesNSImpl(??)\nxml.sax.expatreader.ExpatLocator(??)\nxml.sax.expatreader.ExpatParser(??)\nxml.sax.expatreader.SAXException(??)\nxml.sax.expatreader.SAXNotRecognizedException(??)\nxml.sax.expatreader.SAXNotSupportedException(??)\nxml.sax.expatreader.SAXParseException(??)\nxml.sax.expatreader.SAXReaderNotAvailable(??)\nxml.sax.expatreader.create_parser(??)\nxml.sax.expatreader.expat\nxml.sax.expatreader.feature_external_ges\nxml.sax.expatreader.feature_external_pes\nxml.sax.expatreader.feature_namespace_prefixes\nxml.sax.expatreader.feature_namespaces\nxml.sax.expatreader.feature_string_interning\nxml.sax.expatreader.feature_validation\nxml.sax.expatreader.handler\nxml.sax.expatreader.property_interning_dict\nxml.sax.expatreader.property_xml_string\nxml.sax.expatreader.saxutils\nxml.sax.expatreader.version\nxml.sax.expatreader.xmlreader\nxml.sax.handler\nxml.sax.handler.ContentHandler(??)\nxml.sax.handler.DTDHandler(??)\nxml.sax.handler.EntityResolver(??)\nxml.sax.handler.ErrorHandler(??)\nxml.sax.handler.all_features\nxml.sax.handler.all_properties\nxml.sax.handler.feature_external_ges\nxml.sax.handler.feature_external_pes\nxml.sax.handler.feature_namespace_prefixes\nxml.sax.handler.feature_namespaces\nxml.sax.handler.feature_string_interning\nxml.sax.handler.feature_validation\nxml.sax.handler.property_declaration_handler\nxml.sax.handler.property_dom_node\nxml.sax.handler.property_encoding\nxml.sax.handler.property_interning_dict\nxml.sax.handler.property_lexical_handler\nxml.sax.handler.property_xml_string\nxml.sax.handler.version\nxml.sax.make_parser(??)\nxml.sax.parse(??)\nxml.sax.parseString(??)\nxml.sax.saxutils\nxml.sax.saxutils.XMLFilterBase(??)\nxml.sax.saxutils.XMLGenerator(??)\nxml.sax.saxutils.escape(??)\nxml.sax.saxutils.handler\nxml.sax.saxutils.os\nxml.sax.saxutils.prepare_input_source(??)\nxml.sax.saxutils.quoteattr(??)\nxml.sax.saxutils.types\nxml.sax.saxutils.unescape(??)\nxml.sax.saxutils.urllib\nxml.sax.saxutils.urlparse\nxml.sax.saxutils.xmlreader\nxml.sax.xmlreader\nxml.sax.xmlreader.AttributesImpl(??)\nxml.sax.xmlreader.AttributesNSImpl(??)\nxml.sax.xmlreader.IncrementalParser(??)\nxml.sax.xmlreader.InputSource(??)\nxml.sax.xmlreader.Locator(??)\nxml.sax.xmlreader.SAXNotRecognizedException(??)\nxml.sax.xmlreader.SAXNotSupportedException(??)\nxml.sax.xmlreader.XMLReader(??)\nxml.sax.xmlreader.handler\nxmllib.Error(??)\nxmllib.TestXMLParser(??)\nxmllib.XMLParser(??)\nxmllib.amp\nxmllib.attrfind\nxmllib.attrtrans\nxmllib.cdataclose\nxmllib.cdataopen\nxmllib.charref\nxmllib.commentclose\nxmllib.commentopen\nxmllib.doctype\nxmllib.doubledash\nxmllib.endbracket\nxmllib.endbracketfind\nxmllib.endtagopen\nxmllib.entityref\nxmllib.illegal\nxmllib.interesting\nxmllib.ncname\nxmllib.newline\nxmllib.procclose\nxmllib.procopen\nxmllib.qname\nxmllib.re\nxmllib.ref\nxmllib.space\nxmllib.starttagend\nxmllib.starttagmatch\nxmllib.starttagopen\nxmllib.string\nxmllib.tagfind\nxmllib.test(??)\nxmllib.version\nxmllib.xmldecl\nxmllib.xmlns\nxmlrpclib.APPLICATION_ERROR\nxmlrpclib.Binary(??)\nxmlrpclib.Boolean\nxmlrpclib.BooleanType\nxmlrpclib.BufferType\nxmlrpclib.BuiltinFunctionType\nxmlrpclib.BuiltinMethodType\nxmlrpclib.ClassType\nxmlrpclib.CodeType\nxmlrpclib.ComplexType\nxmlrpclib.DateTime(??)\nxmlrpclib.DictProxyType\nxmlrpclib.DictType\nxmlrpclib.DictionaryType\nxmlrpclib.EllipsisType\nxmlrpclib.Error(??)\nxmlrpclib.ExpatParser(??)\nxmlrpclib.False\nxmlrpclib.FastMarshaller\nxmlrpclib.FastParser\nxmlrpclib.FastUnmarshaller\nxmlrpclib.Fault(??)\nxmlrpclib.FileType\nxmlrpclib.FloatType\nxmlrpclib.FrameType\nxmlrpclib.FunctionType\nxmlrpclib.GeneratorType\nxmlrpclib.INTERNAL_ERROR\nxmlrpclib.INVALID_ENCODING_CHAR\nxmlrpclib.INVALID_METHOD_PARAMS\nxmlrpclib.INVALID_XMLRPC\nxmlrpclib.InstanceType\nxmlrpclib.IntType\nxmlrpclib.LambdaType\nxmlrpclib.ListType\nxmlrpclib.LongType\nxmlrpclib.MAXINT\nxmlrpclib.METHOD_NOT_FOUND\nxmlrpclib.MININT\nxmlrpclib.Marshaller(??)\nxmlrpclib.MethodType\nxmlrpclib.ModuleType\nxmlrpclib.MultiCall(??)\nxmlrpclib.MultiCallIterator(??)\nxmlrpclib.NOT_WELLFORMED_ERROR\nxmlrpclib.NoneType\nxmlrpclib.NotImplementedType\nxmlrpclib.ObjectType\nxmlrpclib.PARSE_ERROR\nxmlrpclib.ProtocolError(??)\nxmlrpclib.ResponseError(??)\nxmlrpclib.SERVER_ERROR\nxmlrpclib.SYSTEM_ERROR\nxmlrpclib.SafeTransport(??)\nxmlrpclib.Server(??)\nxmlrpclib.ServerProxy(??)\nxmlrpclib.SgmlopParser\nxmlrpclib.SliceType\nxmlrpclib.SlowParser(??)\nxmlrpclib.StringIO\nxmlrpclib.StringType\nxmlrpclib.StringTypes\nxmlrpclib.TRANSPORT_ERROR\nxmlrpclib.TracebackType\nxmlrpclib.Transport(??)\nxmlrpclib.True\nxmlrpclib.TupleType\nxmlrpclib.TypeType\nxmlrpclib.UNSUPPORTED_ENCODING\nxmlrpclib.UnboundMethodType\nxmlrpclib.UnicodeType\nxmlrpclib.Unmarshaller(??)\nxmlrpclib.WRAPPERS\nxmlrpclib.XRangeType\nxmlrpclib.base64\nxmlrpclib.boolean\nxmlrpclib.dumps(??)\nxmlrpclib.escape(??)\nxmlrpclib.expat\nxmlrpclib.getparser() -> parser, unmarshaller\nxmlrpclib.loads(??)\nxmlrpclib.operator\nxmlrpclib.re\nxmlrpclib.string\nxmlrpclib.time\nxrange([start,] stop[, step]) -> xrange object\nxxsubtype.bench\nxxsubtype.spamdict\nxxsubtype.spamlist\nzip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\nzipfile.BadZipfile(??)\nzipfile.PyZipFile(??)\nzipfile.ZIP_DEFLATED\nzipfile.ZIP_STORED\nzipfile.ZipFile(??)\nzipfile.ZipInfo(??)\nzipfile.binascii\nzipfile.error(??)\nzipfile.is_zipfile(??)\nzipfile.os\nzipfile.stringCentralDir\nzipfile.stringEndArchive\nzipfile.stringFileHeader\nzipfile.struct\nzipfile.structCentralDir\nzipfile.structEndArchive\nzipfile.structFileHeader\nzipfile.time\nzipfile.zlib\nzipimport.ZipImportError(??)\nzipimport.zipimporter(archivepath) -> zipimporter object\nzlib.DEFLATED\nzlib.DEF_MEM_LEVEL\nzlib.MAX_WBITS\nzlib.ZLIB_VERSION\nzlib.Z_BEST_COMPRESSION\nzlib.Z_BEST_SPEED\nzlib.Z_DEFAULT_COMPRESSION\nzlib.Z_DEFAULT_STRATEGY\nzlib.Z_FILTERED\nzlib.Z_FINISH\nzlib.Z_FULL_FLUSH\nzlib.Z_HUFFMAN_ONLY\nzlib.Z_NO_FLUSH\nzlib.Z_SYNC_FLUSH\nzlib.adler32(string[, start]) -- Compute an Adler-32 checksum of string.\nzlib.compress(string[, level]) -- Returned compressed string.\nzlib.compressobj([level]) -- Return a compressor object.\nzlib.crc32(string[, start]) -- Compute a CRC-32 checksum of string.\nzlib.decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\nzlib.decompressobj([wbits]) -- Return a decompressor object.\nzlib.error(??)\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/qsci/api/python/Python-2.5.api",
    "content": "ArithmeticError\nAssertionError\nAttributeError\nBaseException\nBaseHTTPServer.BaseHTTPRequestHandler(??)\nBaseHTTPServer.DEFAULT_ERROR_MESSAGE\nBaseHTTPServer.HTTPServer(??)\nBaseHTTPServer.SocketServer\nBaseHTTPServer.mimetools\nBaseHTTPServer.socket\nBaseHTTPServer.sys\nBaseHTTPServer.test(??)\nBaseHTTPServer.time\nBastion.Bastion(??)\nBastion.BastionClass(??)\nBastion.MethodType\nCGIHTTPServer.BaseHTTPServer\nCGIHTTPServer.CGIHTTPRequestHandler(??)\nCGIHTTPServer.SimpleHTTPServer\nCGIHTTPServer.executable(??)\nCGIHTTPServer.nobody\nCGIHTTPServer.nobody_uid(??)\nCGIHTTPServer.os\nCGIHTTPServer.select\nCGIHTTPServer.sys\nCGIHTTPServer.test(??)\nCGIHTTPServer.urllib\nConfigParser.ConfigParser(??)\nConfigParser.DEFAULTSECT\nConfigParser.DuplicateSectionError\nConfigParser.Error\nConfigParser.InterpolationDepthError\nConfigParser.InterpolationError\nConfigParser.InterpolationMissingOptionError\nConfigParser.InterpolationSyntaxError\nConfigParser.MAX_INTERPOLATION_DEPTH\nConfigParser.MissingSectionHeaderError\nConfigParser.NoOptionError\nConfigParser.NoSectionError\nConfigParser.ParsingError\nConfigParser.RawConfigParser(??)\nConfigParser.SafeConfigParser(??)\nConfigParser.re\nCookie.BaseCookie\nCookie.Cookie\nCookie.CookieError\nCookie.Morsel\nCookie.SerialCookie\nCookie.SimpleCookie\nCookie.SmartCookie\nCookie.dumps(obj, protocol=0) -- Return a string containing an object in pickle format.\nCookie.loads(string) -- Load a pickle from the given string\nCookie.re\nCookie.string\nCookie.warnings\nDeprecationWarning\nDocXMLRPCServer.CGIXMLRPCRequestHandler(??)\nDocXMLRPCServer.DocCGIXMLRPCRequestHandler(??)\nDocXMLRPCServer.DocXMLRPCRequestHandler(??)\nDocXMLRPCServer.DocXMLRPCServer(??)\nDocXMLRPCServer.ServerHTMLDoc(??)\nDocXMLRPCServer.SimpleXMLRPCRequestHandler(??)\nDocXMLRPCServer.SimpleXMLRPCServer(??)\nDocXMLRPCServer.XMLRPCDocGenerator(??)\nDocXMLRPCServer.inspect\nDocXMLRPCServer.pydoc\nDocXMLRPCServer.re\nDocXMLRPCServer.resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d\nDocXMLRPCServer.sys\nEOFError\nEllipsis\nEnvironmentError\nException\nFalse\nFloatingPointError\nFutureWarning\nGeneratorExit\nHTMLParser.HTMLParseError\nHTMLParser.HTMLParser(??)\nHTMLParser.attrfind\nHTMLParser.charref\nHTMLParser.commentclose\nHTMLParser.endendtag\nHTMLParser.endtagfind\nHTMLParser.entityref\nHTMLParser.incomplete\nHTMLParser.interesting_cdata\nHTMLParser.interesting_normal\nHTMLParser.locatestarttagend\nHTMLParser.markupbase\nHTMLParser.piclose\nHTMLParser.re\nHTMLParser.starttagopen\nHTMLParser.tagfind\nIOError\nImportError\nImportWarning\nIndentationError\nIndexError\nKeyError\nKeyboardInterrupt\nLookupError\nMemoryError\nMimeWriter.MimeWriter(??)\nMimeWriter.mimetools\nNameError\nNone\nNotImplemented\nNotImplementedError\nOSError\nOverflowError\nPendingDeprecationWarning\nQueue.Empty\nQueue.Full\nQueue.Queue(??)\nQueue.deque(iterable) --> deque object\nReferenceError\nRuntimeError\nRuntimeWarning\nSimpleHTTPServer.BaseHTTPServer\nSimpleHTTPServer.SimpleHTTPRequestHandler(??)\nSimpleHTTPServer.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nSimpleHTTPServer.cgi\nSimpleHTTPServer.mimetypes\nSimpleHTTPServer.os\nSimpleHTTPServer.posixpath\nSimpleHTTPServer.shutil\nSimpleHTTPServer.test(??)\nSimpleHTTPServer.urllib\nSimpleHTTPServer.urlparse\nSimpleXMLRPCServer.BaseHTTPServer\nSimpleXMLRPCServer.CGIXMLRPCRequestHandler(??)\nSimpleXMLRPCServer.Fault\nSimpleXMLRPCServer.SimpleXMLRPCDispatcher(??)\nSimpleXMLRPCServer.SimpleXMLRPCRequestHandler(??)\nSimpleXMLRPCServer.SimpleXMLRPCServer(??)\nSimpleXMLRPCServer.SocketServer\nSimpleXMLRPCServer.fcntl\nSimpleXMLRPCServer.list_public_methods(??)\nSimpleXMLRPCServer.os\nSimpleXMLRPCServer.remove_duplicates([2,2,2,1,3,3]) => [3,1,2]\nSimpleXMLRPCServer.resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d\nSimpleXMLRPCServer.sys\nSimpleXMLRPCServer.xmlrpclib\nSocketServer.BaseRequestHandler(??)\nSocketServer.BaseServer(??)\nSocketServer.DatagramRequestHandler(??)\nSocketServer.ForkingMixIn(??)\nSocketServer.ForkingTCPServer(??)\nSocketServer.ForkingUDPServer(??)\nSocketServer.StreamRequestHandler(??)\nSocketServer.TCPServer(??)\nSocketServer.ThreadingMixIn(??)\nSocketServer.ThreadingTCPServer(??)\nSocketServer.ThreadingUDPServer(??)\nSocketServer.ThreadingUnixDatagramServer(??)\nSocketServer.ThreadingUnixStreamServer(??)\nSocketServer.UDPServer(??)\nSocketServer.UnixDatagramServer(??)\nSocketServer.UnixStreamServer(??)\nSocketServer.os\nSocketServer.socket\nSocketServer.sys\nStandardError\nStopIteration\nStringIO.EINVAL\nStringIO.StringIO(??)\nStringIO.test(??)\nSyntaxError\nSyntaxWarning\nSystemError\nSystemExit\nTabError\nTrue\nTypeError\nUnboundLocalError\nUnicodeDecodeError\nUnicodeEncodeError\nUnicodeError\nUnicodeTranslateError\nUnicodeWarning\nUserDict.DictMixin(??)\nUserDict.IterableUserDict(??)\nUserDict.UserDict(??)\nUserList.UserList(??)\nUserString.MutableString(??)\nUserString.UserString(??)\nUserString.sys\nUserWarning\nValueError\nWarning\nZeroDivisionError\nabs(number) -> number\naifc.Aifc_read(??)\naifc.Aifc_write(??)\naifc.Chunk(??)\naifc.Error\naifc.open(??)\naifc.openfp(??)\naifc.struct\nall(iterable) -> bool\nany(iterable) -> bool\nanydbm.error\nanydbm.open(??)\napply(object[, args[, kwargs]]) -> value\narray.ArrayType\narray.array(typecode [, initializer]) -> array\nasynchat.async_chat(??)\nasynchat.asyncore\nasynchat.deque(iterable) --> deque object\nasynchat.fifo(??)\nasynchat.find_prefix_at_end(??)\nasynchat.simple_producer(??)\nasynchat.socket\nasyncore.EALREADY\nasyncore.ECONNRESET\nasyncore.EINPROGRESS\nasyncore.EINTR\nasyncore.EISCONN\nasyncore.ENOTCONN\nasyncore.ESHUTDOWN\nasyncore.EWOULDBLOCK\nasyncore.ExitNow\nasyncore.close_all(??)\nasyncore.compact_traceback(??)\nasyncore.dispatcher(??)\nasyncore.dispatcher_with_send(??)\nasyncore.errorcode\nasyncore.fcntl\nasyncore.file_dispatcher(??)\nasyncore.file_wrapper(??)\nasyncore.loop(??)\nasyncore.os\nasyncore.poll(??)\nasyncore.poll2(??)\nasyncore.poll3(??)\nasyncore.read(??)\nasyncore.readwrite(??)\nasyncore.select\nasyncore.socket\nasyncore.socket_map\nasyncore.sys\nasyncore.time\nasyncore.write(??)\natexit.register(??)\natexit.sys\naudiodev.AudioDev(??)\naudiodev.Play_Audio_sgi(??)\naudiodev.Play_Audio_sun(??)\naudiodev.error\naudiodev.test(??)\naudioop.add\naudioop.adpcm2lin\naudioop.alaw2lin\naudioop.avg\naudioop.avgpp\naudioop.bias\naudioop.cross\naudioop.error\naudioop.findfactor\naudioop.findfit\naudioop.findmax\naudioop.getsample\naudioop.lin2adpcm\naudioop.lin2alaw\naudioop.lin2lin\naudioop.lin2ulaw\naudioop.max\naudioop.maxpp\naudioop.minmax\naudioop.mul\naudioop.ratecv\naudioop.reverse\naudioop.rms\naudioop.tomono\naudioop.tostereo\naudioop.ulaw2lin\nbase64.EMPTYSTRING\nbase64.MAXBINSIZE\nbase64.MAXLINESIZE\nbase64.b16decode(??)\nbase64.b16encode(??)\nbase64.b32decode(??)\nbase64.b32encode(??)\nbase64.b64decode(??)\nbase64.b64encode(??)\nbase64.binascii\nbase64.decode(??)\nbase64.decodestring(??)\nbase64.encode(??)\nbase64.encodestring(??)\nbase64.k\nbase64.re\nbase64.standard_b64decode(??)\nbase64.standard_b64encode(??)\nbase64.struct\nbase64.test(??)\nbase64.test1(??)\nbase64.urlsafe_b64decode(??)\nbase64.urlsafe_b64encode(??)\nbase64.v\nbasestring\nbdb.Bdb(??)\nbdb.BdbQuit\nbdb.Breakpoint(??)\nbdb.Tdb(??)\nbdb.bar(??)\nbdb.checkfuncname(??)\nbdb.effective(??)\nbdb.foo(??)\nbdb.os\nbdb.set_trace(??)\nbdb.sys\nbdb.test(??)\nbdb.types\nbinascii.Error\nbinascii.Incomplete\nbinascii.a2b_base64\nbinascii.a2b_hex(hexstr) -> s; Binary data of hexadecimal representation.\nbinascii.a2b_hqx\nbinascii.a2b_qp\nbinascii.a2b_uu\nbinascii.b2a_base64\nbinascii.b2a_hex(data) -> s; Hexadecimal representation of binary data.\nbinascii.b2a_hqx\nbinascii.b2a_qp(data, quotetabs=0, istext=1, header=0) -> s;\nbinascii.b2a_uu\nbinascii.crc32\nbinascii.crc_hqx\nbinascii.hexlify\nbinascii.rlecode_hqx\nbinascii.rledecode_hqx\nbinascii.unhexlify\nbinhex.BinHex(??)\nbinhex.Error\nbinhex.FInfo(??)\nbinhex.HexBin(??)\nbinhex.LINELEN\nbinhex.REASONABLY_LARGE\nbinhex.RUNCHAR\nbinhex.binascii\nbinhex.binhex(??)\nbinhex.getfileinfo(??)\nbinhex.hexbin(??)\nbinhex.openrsrc(??)\nbinhex.os\nbinhex.struct\nbinhex.sys\nbisect.bisect\nbisect.bisect_left(a, x[, lo[, hi]]) -> index\nbisect.bisect_right(a, x[, lo[, hi]]) -> index\nbisect.insort\nbisect.insort_left(a, x[, lo[, hi]])\nbisect.insort_right(a, x[, lo[, hi]])\nbool(x) -> bool\nbsddb.UserDict\nbsddb.btopen(??)\nbsddb.db\nbsddb.db.DB\nbsddb.db.DBAccessError\nbsddb.db.DBAgainError\nbsddb.db.DBBusyError\nbsddb.db.DBCursorClosedError\nbsddb.db.DBEnv\nbsddb.db.DBError\nbsddb.db.DBFileExistsError\nbsddb.db.DBInvalidArgError\nbsddb.db.DBKeyEmptyError\nbsddb.db.DBKeyExistError\nbsddb.db.DBLockDeadlockError\nbsddb.db.DBLockNotGrantedError\nbsddb.db.DBNoMemoryError\nbsddb.db.DBNoServerError\nbsddb.db.DBNoServerHomeError\nbsddb.db.DBNoServerIDError\nbsddb.db.DBNoSpaceError\nbsddb.db.DBNoSuchFileError\nbsddb.db.DBNotFoundError\nbsddb.db.DBOldVersionError\nbsddb.db.DBPageNotFoundError\nbsddb.db.DBPermissionsError\nbsddb.db.DBRunRecoveryError\nbsddb.db.DBSecondaryBadError\nbsddb.db.DBVerifyBadError\nbsddb.db.DB_AFTER\nbsddb.db.DB_AGGRESSIVE\nbsddb.db.DB_APPEND\nbsddb.db.DB_ARCH_ABS\nbsddb.db.DB_ARCH_DATA\nbsddb.db.DB_ARCH_LOG\nbsddb.db.DB_ARCH_REMOVE\nbsddb.db.DB_AUTO_COMMIT\nbsddb.db.DB_BEFORE\nbsddb.db.DB_BTREE\nbsddb.db.DB_CACHED_COUNTS\nbsddb.db.DB_CDB_ALLDB\nbsddb.db.DB_CHECKPOINT\nbsddb.db.DB_CHKSUM\nbsddb.db.DB_CONSUME\nbsddb.db.DB_CONSUME_WAIT\nbsddb.db.DB_CREATE\nbsddb.db.DB_CURRENT\nbsddb.db.DB_DIRECT_DB\nbsddb.db.DB_DIRECT_LOG\nbsddb.db.DB_DIRTY_READ\nbsddb.db.DB_DONOTINDEX\nbsddb.db.DB_DUP\nbsddb.db.DB_DUPSORT\nbsddb.db.DB_ENCRYPT\nbsddb.db.DB_ENCRYPT_AES\nbsddb.db.DB_EXCL\nbsddb.db.DB_EXTENT\nbsddb.db.DB_FAST_STAT\nbsddb.db.DB_FCNTL_LOCKING\nbsddb.db.DB_FIRST\nbsddb.db.DB_FLUSH\nbsddb.db.DB_FORCE\nbsddb.db.DB_GET_BOTH\nbsddb.db.DB_GET_RECNO\nbsddb.db.DB_HASH\nbsddb.db.DB_INCOMPLETE\nbsddb.db.DB_INIT_CDB\nbsddb.db.DB_INIT_LOCK\nbsddb.db.DB_INIT_LOG\nbsddb.db.DB_INIT_MPOOL\nbsddb.db.DB_INIT_REP\nbsddb.db.DB_INIT_TXN\nbsddb.db.DB_JOINENV\nbsddb.db.DB_JOIN_ITEM\nbsddb.db.DB_JOIN_NOSORT\nbsddb.db.DB_KEYEMPTY\nbsddb.db.DB_KEYEXIST\nbsddb.db.DB_KEYFIRST\nbsddb.db.DB_KEYLAST\nbsddb.db.DB_LAST\nbsddb.db.DB_LOCKDOWN\nbsddb.db.DB_LOCK_CONFLICT\nbsddb.db.DB_LOCK_DEADLOCK\nbsddb.db.DB_LOCK_DEFAULT\nbsddb.db.DB_LOCK_DIRTY\nbsddb.db.DB_LOCK_DUMP\nbsddb.db.DB_LOCK_GET\nbsddb.db.DB_LOCK_INHERIT\nbsddb.db.DB_LOCK_IREAD\nbsddb.db.DB_LOCK_IWR\nbsddb.db.DB_LOCK_IWRITE\nbsddb.db.DB_LOCK_MAXLOCKS\nbsddb.db.DB_LOCK_MINLOCKS\nbsddb.db.DB_LOCK_MINWRITE\nbsddb.db.DB_LOCK_NG\nbsddb.db.DB_LOCK_NORUN\nbsddb.db.DB_LOCK_NOTGRANTED\nbsddb.db.DB_LOCK_NOWAIT\nbsddb.db.DB_LOCK_OLDEST\nbsddb.db.DB_LOCK_PUT\nbsddb.db.DB_LOCK_PUT_ALL\nbsddb.db.DB_LOCK_PUT_OBJ\nbsddb.db.DB_LOCK_RANDOM\nbsddb.db.DB_LOCK_READ\nbsddb.db.DB_LOCK_RECORD\nbsddb.db.DB_LOCK_SWITCH\nbsddb.db.DB_LOCK_UPGRADE\nbsddb.db.DB_LOCK_UPGRADE_WRITE\nbsddb.db.DB_LOCK_WAIT\nbsddb.db.DB_LOCK_WRITE\nbsddb.db.DB_LOCK_WWRITE\nbsddb.db.DB_LOCK_YOUNGEST\nbsddb.db.DB_LOG_AUTOREMOVE\nbsddb.db.DB_LSTAT_ABORTED\nbsddb.db.DB_LSTAT_ERR\nbsddb.db.DB_LSTAT_FREE\nbsddb.db.DB_LSTAT_HELD\nbsddb.db.DB_LSTAT_PENDING\nbsddb.db.DB_LSTAT_WAITING\nbsddb.db.DB_MAX_PAGES\nbsddb.db.DB_MAX_RECORDS\nbsddb.db.DB_MULTIPLE\nbsddb.db.DB_MULTIPLE_KEY\nbsddb.db.DB_NEXT\nbsddb.db.DB_NEXT_DUP\nbsddb.db.DB_NEXT_NODUP\nbsddb.db.DB_NODUPDATA\nbsddb.db.DB_NOLOCKING\nbsddb.db.DB_NOMMAP\nbsddb.db.DB_NOORDERCHK\nbsddb.db.DB_NOOVERWRITE\nbsddb.db.DB_NOPANIC\nbsddb.db.DB_NOSERVER\nbsddb.db.DB_NOSERVER_HOME\nbsddb.db.DB_NOSERVER_ID\nbsddb.db.DB_NOSYNC\nbsddb.db.DB_NOTFOUND\nbsddb.db.DB_ODDFILESIZE\nbsddb.db.DB_OLD_VERSION\nbsddb.db.DB_OPFLAGS_MASK\nbsddb.db.DB_ORDERCHKONLY\nbsddb.db.DB_PAGE_NOTFOUND\nbsddb.db.DB_PANIC_ENVIRONMENT\nbsddb.db.DB_POSITION\nbsddb.db.DB_PREV\nbsddb.db.DB_PREV_NODUP\nbsddb.db.DB_PRIVATE\nbsddb.db.DB_PR_PAGE\nbsddb.db.DB_PR_RECOVERYTEST\nbsddb.db.DB_QUEUE\nbsddb.db.DB_RDONLY\nbsddb.db.DB_RDWRMASTER\nbsddb.db.DB_RECNO\nbsddb.db.DB_RECNUM\nbsddb.db.DB_RECORDCOUNT\nbsddb.db.DB_RECOVER\nbsddb.db.DB_RECOVER_FATAL\nbsddb.db.DB_REGION_INIT\nbsddb.db.DB_RENUMBER\nbsddb.db.DB_REVSPLITOFF\nbsddb.db.DB_RMW\nbsddb.db.DB_RPCCLIENT\nbsddb.db.DB_RUNRECOVERY\nbsddb.db.DB_SALVAGE\nbsddb.db.DB_SECONDARY_BAD\nbsddb.db.DB_SET\nbsddb.db.DB_SET_LOCK_TIMEOUT\nbsddb.db.DB_SET_RANGE\nbsddb.db.DB_SET_RECNO\nbsddb.db.DB_SET_TXN_TIMEOUT\nbsddb.db.DB_SNAPSHOT\nbsddb.db.DB_STAT_CLEAR\nbsddb.db.DB_SYSTEM_MEM\nbsddb.db.DB_THREAD\nbsddb.db.DB_TIME_NOTGRANTED\nbsddb.db.DB_TRUNCATE\nbsddb.db.DB_TXN_NOSYNC\nbsddb.db.DB_TXN_NOT_DURABLE\nbsddb.db.DB_TXN_NOWAIT\nbsddb.db.DB_TXN_SYNC\nbsddb.db.DB_TXN_WRITE_NOSYNC\nbsddb.db.DB_UNKNOWN\nbsddb.db.DB_UPGRADE\nbsddb.db.DB_USE_ENVIRON\nbsddb.db.DB_USE_ENVIRON_ROOT\nbsddb.db.DB_VERIFY\nbsddb.db.DB_VERIFY_BAD\nbsddb.db.DB_VERSION_MAJOR\nbsddb.db.DB_VERSION_MINOR\nbsddb.db.DB_VERSION_PATCH\nbsddb.db.DB_VERSION_STRING\nbsddb.db.DB_WRITECURSOR\nbsddb.db.DB_XA_CREATE\nbsddb.db.DB_YIELDCPU\nbsddb.db.EACCES\nbsddb.db.EAGAIN\nbsddb.db.EBUSY\nbsddb.db.EEXIST\nbsddb.db.EINVAL\nbsddb.db.ENOENT\nbsddb.db.ENOMEM\nbsddb.db.ENOSPC\nbsddb.db.EPERM\nbsddb.db.cvsid\nbsddb.db.version\nbsddb.dbobj\nbsddb.dbobj.DB(??)\nbsddb.dbobj.DBEnv(??)\nbsddb.dbobj.DBSequence(??)\nbsddb.dbobj.DictMixin(??)\nbsddb.dbobj.db\nbsddb.dbrecio\nbsddb.dbrecio.DBRecIO(??)\nbsddb.dbrecio.errno\nbsddb.dbrecio.string\nbsddb.dbshelve\nbsddb.dbshelve.DBShelf(??)\nbsddb.dbshelve.DBShelfCursor(??)\nbsddb.dbshelve.DictMixin(??)\nbsddb.dbshelve.cPickle\nbsddb.dbshelve.db\nbsddb.dbshelve.open(??)\nbsddb.dbtables\nbsddb.dbtables.Cond(??)\nbsddb.dbtables.DB\nbsddb.dbtables.DBAccessError\nbsddb.dbtables.DBAgainError\nbsddb.dbtables.DBBusyError\nbsddb.dbtables.DBCursorClosedError\nbsddb.dbtables.DBEnv\nbsddb.dbtables.DBError\nbsddb.dbtables.DBFileExistsError\nbsddb.dbtables.DBIncompleteError\nbsddb.dbtables.DBInvalidArgError\nbsddb.dbtables.DBKeyEmptyError\nbsddb.dbtables.DBKeyExistError\nbsddb.dbtables.DBLockDeadlockError\nbsddb.dbtables.DBLockNotGrantedError\nbsddb.dbtables.DBNoMemoryError\nbsddb.dbtables.DBNoServerError\nbsddb.dbtables.DBNoServerHomeError\nbsddb.dbtables.DBNoServerIDError\nbsddb.dbtables.DBNoSpaceError\nbsddb.dbtables.DBNoSuchFileError\nbsddb.dbtables.DBNotFoundError\nbsddb.dbtables.DBOldVersionError\nbsddb.dbtables.DBPageNotFoundError\nbsddb.dbtables.DBPermissionsError\nbsddb.dbtables.DBRunRecoveryError\nbsddb.dbtables.DBSecondaryBadError\nbsddb.dbtables.DBVerifyBadError\nbsddb.dbtables.DB_AFTER\nbsddb.dbtables.DB_AGGRESSIVE\nbsddb.dbtables.DB_APPEND\nbsddb.dbtables.DB_ARCH_ABS\nbsddb.dbtables.DB_ARCH_DATA\nbsddb.dbtables.DB_ARCH_LOG\nbsddb.dbtables.DB_ARCH_REMOVE\nbsddb.dbtables.DB_AUTO_COMMIT\nbsddb.dbtables.DB_BEFORE\nbsddb.dbtables.DB_BTREE\nbsddb.dbtables.DB_CACHED_COUNTS\nbsddb.dbtables.DB_CDB_ALLDB\nbsddb.dbtables.DB_CHECKPOINT\nbsddb.dbtables.DB_CHKSUM\nbsddb.dbtables.DB_CONSUME\nbsddb.dbtables.DB_CONSUME_WAIT\nbsddb.dbtables.DB_CREATE\nbsddb.dbtables.DB_CURRENT\nbsddb.dbtables.DB_DIRECT_DB\nbsddb.dbtables.DB_DIRECT_LOG\nbsddb.dbtables.DB_DIRTY_READ\nbsddb.dbtables.DB_DONOTINDEX\nbsddb.dbtables.DB_DUP\nbsddb.dbtables.DB_DUPSORT\nbsddb.dbtables.DB_ENCRYPT\nbsddb.dbtables.DB_ENCRYPT_AES\nbsddb.dbtables.DB_EXCL\nbsddb.dbtables.DB_EXTENT\nbsddb.dbtables.DB_FAST_STAT\nbsddb.dbtables.DB_FCNTL_LOCKING\nbsddb.dbtables.DB_FIRST\nbsddb.dbtables.DB_FLUSH\nbsddb.dbtables.DB_FORCE\nbsddb.dbtables.DB_GET_BOTH\nbsddb.dbtables.DB_GET_RECNO\nbsddb.dbtables.DB_HASH\nbsddb.dbtables.DB_INCOMPLETE\nbsddb.dbtables.DB_INIT_CDB\nbsddb.dbtables.DB_INIT_LOCK\nbsddb.dbtables.DB_INIT_LOG\nbsddb.dbtables.DB_INIT_MPOOL\nbsddb.dbtables.DB_INIT_REP\nbsddb.dbtables.DB_INIT_TXN\nbsddb.dbtables.DB_JOINENV\nbsddb.dbtables.DB_JOIN_ITEM\nbsddb.dbtables.DB_JOIN_NOSORT\nbsddb.dbtables.DB_KEYEMPTY\nbsddb.dbtables.DB_KEYEXIST\nbsddb.dbtables.DB_KEYFIRST\nbsddb.dbtables.DB_KEYLAST\nbsddb.dbtables.DB_LAST\nbsddb.dbtables.DB_LOCKDOWN\nbsddb.dbtables.DB_LOCK_CONFLICT\nbsddb.dbtables.DB_LOCK_DEADLOCK\nbsddb.dbtables.DB_LOCK_DEFAULT\nbsddb.dbtables.DB_LOCK_DIRTY\nbsddb.dbtables.DB_LOCK_DUMP\nbsddb.dbtables.DB_LOCK_GET\nbsddb.dbtables.DB_LOCK_INHERIT\nbsddb.dbtables.DB_LOCK_IREAD\nbsddb.dbtables.DB_LOCK_IWR\nbsddb.dbtables.DB_LOCK_IWRITE\nbsddb.dbtables.DB_LOCK_MAXLOCKS\nbsddb.dbtables.DB_LOCK_MINLOCKS\nbsddb.dbtables.DB_LOCK_MINWRITE\nbsddb.dbtables.DB_LOCK_NG\nbsddb.dbtables.DB_LOCK_NORUN\nbsddb.dbtables.DB_LOCK_NOTGRANTED\nbsddb.dbtables.DB_LOCK_NOWAIT\nbsddb.dbtables.DB_LOCK_OLDEST\nbsddb.dbtables.DB_LOCK_PUT\nbsddb.dbtables.DB_LOCK_PUT_ALL\nbsddb.dbtables.DB_LOCK_PUT_OBJ\nbsddb.dbtables.DB_LOCK_RANDOM\nbsddb.dbtables.DB_LOCK_READ\nbsddb.dbtables.DB_LOCK_RECORD\nbsddb.dbtables.DB_LOCK_SWITCH\nbsddb.dbtables.DB_LOCK_UPGRADE\nbsddb.dbtables.DB_LOCK_UPGRADE_WRITE\nbsddb.dbtables.DB_LOCK_WAIT\nbsddb.dbtables.DB_LOCK_WRITE\nbsddb.dbtables.DB_LOCK_WWRITE\nbsddb.dbtables.DB_LOCK_YOUNGEST\nbsddb.dbtables.DB_LOG_AUTOREMOVE\nbsddb.dbtables.DB_LSTAT_ABORTED\nbsddb.dbtables.DB_LSTAT_ERR\nbsddb.dbtables.DB_LSTAT_FREE\nbsddb.dbtables.DB_LSTAT_HELD\nbsddb.dbtables.DB_LSTAT_PENDING\nbsddb.dbtables.DB_LSTAT_WAITING\nbsddb.dbtables.DB_MAX_PAGES\nbsddb.dbtables.DB_MAX_RECORDS\nbsddb.dbtables.DB_MULTIPLE\nbsddb.dbtables.DB_MULTIPLE_KEY\nbsddb.dbtables.DB_NEXT\nbsddb.dbtables.DB_NEXT_DUP\nbsddb.dbtables.DB_NEXT_NODUP\nbsddb.dbtables.DB_NODUPDATA\nbsddb.dbtables.DB_NOLOCKING\nbsddb.dbtables.DB_NOMMAP\nbsddb.dbtables.DB_NOORDERCHK\nbsddb.dbtables.DB_NOOVERWRITE\nbsddb.dbtables.DB_NOPANIC\nbsddb.dbtables.DB_NOSERVER\nbsddb.dbtables.DB_NOSERVER_HOME\nbsddb.dbtables.DB_NOSERVER_ID\nbsddb.dbtables.DB_NOSYNC\nbsddb.dbtables.DB_NOTFOUND\nbsddb.dbtables.DB_ODDFILESIZE\nbsddb.dbtables.DB_OLD_VERSION\nbsddb.dbtables.DB_OPFLAGS_MASK\nbsddb.dbtables.DB_ORDERCHKONLY\nbsddb.dbtables.DB_PAGE_NOTFOUND\nbsddb.dbtables.DB_PANIC_ENVIRONMENT\nbsddb.dbtables.DB_POSITION\nbsddb.dbtables.DB_PREV\nbsddb.dbtables.DB_PREV_NODUP\nbsddb.dbtables.DB_PRIVATE\nbsddb.dbtables.DB_PR_PAGE\nbsddb.dbtables.DB_PR_RECOVERYTEST\nbsddb.dbtables.DB_QUEUE\nbsddb.dbtables.DB_RDONLY\nbsddb.dbtables.DB_RDWRMASTER\nbsddb.dbtables.DB_RECNO\nbsddb.dbtables.DB_RECNUM\nbsddb.dbtables.DB_RECORDCOUNT\nbsddb.dbtables.DB_RECOVER\nbsddb.dbtables.DB_RECOVER_FATAL\nbsddb.dbtables.DB_REGION_INIT\nbsddb.dbtables.DB_RENUMBER\nbsddb.dbtables.DB_REVSPLITOFF\nbsddb.dbtables.DB_RMW\nbsddb.dbtables.DB_RPCCLIENT\nbsddb.dbtables.DB_RUNRECOVERY\nbsddb.dbtables.DB_SALVAGE\nbsddb.dbtables.DB_SECONDARY_BAD\nbsddb.dbtables.DB_SET\nbsddb.dbtables.DB_SET_LOCK_TIMEOUT\nbsddb.dbtables.DB_SET_RANGE\nbsddb.dbtables.DB_SET_RECNO\nbsddb.dbtables.DB_SET_TXN_TIMEOUT\nbsddb.dbtables.DB_SNAPSHOT\nbsddb.dbtables.DB_STAT_CLEAR\nbsddb.dbtables.DB_SYSTEM_MEM\nbsddb.dbtables.DB_THREAD\nbsddb.dbtables.DB_TIME_NOTGRANTED\nbsddb.dbtables.DB_TRUNCATE\nbsddb.dbtables.DB_TXN_NOSYNC\nbsddb.dbtables.DB_TXN_NOT_DURABLE\nbsddb.dbtables.DB_TXN_NOWAIT\nbsddb.dbtables.DB_TXN_SYNC\nbsddb.dbtables.DB_TXN_WRITE_NOSYNC\nbsddb.dbtables.DB_UNKNOWN\nbsddb.dbtables.DB_UPGRADE\nbsddb.dbtables.DB_USE_ENVIRON\nbsddb.dbtables.DB_USE_ENVIRON_ROOT\nbsddb.dbtables.DB_VERIFY\nbsddb.dbtables.DB_VERIFY_BAD\nbsddb.dbtables.DB_VERSION_MAJOR\nbsddb.dbtables.DB_VERSION_MINOR\nbsddb.dbtables.DB_VERSION_PATCH\nbsddb.dbtables.DB_VERSION_STRING\nbsddb.dbtables.DB_WRITECURSOR\nbsddb.dbtables.DB_XA_CREATE\nbsddb.dbtables.DB_YIELDCPU\nbsddb.dbtables.EACCES\nbsddb.dbtables.EAGAIN\nbsddb.dbtables.EBUSY\nbsddb.dbtables.EEXIST\nbsddb.dbtables.EINVAL\nbsddb.dbtables.ENOENT\nbsddb.dbtables.ENOMEM\nbsddb.dbtables.ENOSPC\nbsddb.dbtables.EPERM\nbsddb.dbtables.ExactCond(??)\nbsddb.dbtables.LikeCond(??)\nbsddb.dbtables.ListType\nbsddb.dbtables.PostfixCond(??)\nbsddb.dbtables.PrefixCond(??)\nbsddb.dbtables.StringType\nbsddb.dbtables.TableAlreadyExists\nbsddb.dbtables.TableDBError\nbsddb.dbtables.bsdTableDB(??)\nbsddb.dbtables.contains_metastrings(??)\nbsddb.dbtables.copy\nbsddb.dbtables.cvsid\nbsddb.dbtables.pickle\nbsddb.dbtables.random\nbsddb.dbtables.re\nbsddb.dbtables.sys\nbsddb.dbtables.version\nbsddb.dbtables.xdrlib\nbsddb.dbutils\nbsddb.dbutils.DeadlockWrap(function, *_args, **_kwargs) - automatically retries\nbsddb.dbutils.db\nbsddb.error\nbsddb.hashopen(??)\nbsddb.os\nbsddb.ref\nbsddb.rnopen(??)\nbsddb.sys\nbuffer(object [, offset[, size]])\nbz2.BZ2Compressor([compresslevel=9]) -> compressor object\nbz2.BZ2Decompressor() -> decompressor object\nbz2.BZ2File(name [, mode='r', buffering=0, compresslevel=9]) -> file object\nbz2.compress(data [, compresslevel=9]) -> string\nbz2.decompress(data) -> decompressed data\ncPickle.BadPickleGet\ncPickle.HIGHEST_PROTOCOL\ncPickle.PickleError\ncPickle.Pickler(file, protocol=0) -- Create a pickler.\ncPickle.PicklingError\ncPickle.UnpickleableError\ncPickle.Unpickler(file) -- Create an unpickler.\ncPickle.UnpicklingError\ncPickle.compatible_formats\ncPickle.dump(obj, file, protocol=0) -- Write an object in pickle format to the given file.\ncPickle.dumps(obj, protocol=0) -- Return a string containing an object in pickle format.\ncPickle.format_version\ncPickle.load(file) -- Load a pickle from the given file\ncPickle.loads(string) -- Load a pickle from the given string\ncProfile.Profile(custom_timer=None, time_unit=None, subcalls=True, builtins=True)\ncProfile.help(??)\ncProfile.label(??)\ncProfile.main(??)\ncProfile.run(??)\ncProfile.runctx(??)\ncStringIO.InputType\ncStringIO.OutputType\ncStringIO.StringIO([s]) -- Return a StringIO-like stream for reading or writing\ncStringIO.cStringIO_CAPI\ncalendar.Calendar\ncalendar.EPOCH\ncalendar.FRIDAY\ncalendar.February\ncalendar.HTMLCalendar\ncalendar.IllegalMonthError\ncalendar.IllegalWeekdayError\ncalendar.January\ncalendar.LocaleHTMLCalendar\ncalendar.LocaleTextCalendar\ncalendar.MONDAY\ncalendar.SATURDAY\ncalendar.SUNDAY\ncalendar.THURSDAY\ncalendar.TUESDAY\ncalendar.TextCalendar\ncalendar.TimeEncoding(??)\ncalendar.WEDNESDAY\ncalendar.c\ncalendar.calendar\ncalendar.datetime\ncalendar.day_abbr\ncalendar.day_name\ncalendar.error\ncalendar.firstweekday\ncalendar.format(??)\ncalendar.formatstring(??)\ncalendar.isleap(??)\ncalendar.leapdays(??)\ncalendar.locale\ncalendar.main(??)\ncalendar.mdays\ncalendar.month\ncalendar.month_abbr\ncalendar.month_name\ncalendar.monthcalendar\ncalendar.monthrange(??)\ncalendar.prcal\ncalendar.prmonth\ncalendar.prweek\ncalendar.setfirstweekday(??)\ncalendar.sys\ncalendar.timegm(??)\ncalendar.week\ncalendar.weekday(??)\ncalendar.weekheader\ncalendar.with_statement\ncallable(object) -> bool\ncgi.FieldStorage(??)\ncgi.FormContent(??)\ncgi.FormContentDict(??)\ncgi.InterpFormContentDict(??)\ncgi.MiniFieldStorage(??)\ncgi.StringIO([s]) -- Return a StringIO-like stream for reading or writing\ncgi.SvFormContentDict(??)\ncgi.UserDict\ncgi.attrgetter(attr, ...) --> attrgetter object\ncgi.dolog(??)\ncgi.escape(??)\ncgi.initlog(??)\ncgi.log(??)\ncgi.logfile\ncgi.logfp\ncgi.maxlen\ncgi.mimetools\ncgi.nolog(??)\ncgi.os\ncgi.parse(??)\ncgi.parse_header(??)\ncgi.parse_multipart(??)\ncgi.parse_qs(??)\ncgi.parse_qsl(??)\ncgi.print_arguments(??)\ncgi.print_directory(??)\ncgi.print_environ(??)\ncgi.print_environ_usage(??)\ncgi.print_exception(??)\ncgi.print_form(??)\ncgi.rfc822\ncgi.sys\ncgi.test(??)\ncgi.urllib\ncgi.valid_boundary(??)\ncgitb.Hook(??)\ncgitb.enable(??)\ncgitb.grey(??)\ncgitb.handler\ncgitb.html(??)\ncgitb.lookup(??)\ncgitb.reset(??)\ncgitb.scanvars(??)\ncgitb.small(??)\ncgitb.strong(??)\ncgitb.sys\ncgitb.text(??)\nchr(i) -> character\nchunk.Chunk(??)\nclassmethod(function) -> method\ncmath.acos(x)\ncmath.acosh(x)\ncmath.asin(x)\ncmath.asinh(x)\ncmath.atan(x)\ncmath.atanh(x)\ncmath.cos(x)\ncmath.cosh(x)\ncmath.e\ncmath.exp(x)\ncmath.log(x[, base]) -> the logarithm of x to the given base.\ncmath.log10(x)\ncmath.pi\ncmath.sin(x)\ncmath.sinh(x)\ncmath.sqrt(x)\ncmath.tan(x)\ncmath.tanh(x)\ncmd.Cmd(??)\ncmd.IDENTCHARS\ncmd.PROMPT\ncmd.string\ncmp(x, y) -> integer\ncode.CommandCompiler(??)\ncode.InteractiveConsole(??)\ncode.InteractiveInterpreter(??)\ncode.compile_command(??)\ncode.interact(??)\ncode.softspace(??)\ncode.sys\ncode.traceback\ncodecs.BOM\ncodecs.BOM32_BE\ncodecs.BOM32_LE\ncodecs.BOM64_BE\ncodecs.BOM64_LE\ncodecs.BOM_BE\ncodecs.BOM_LE\ncodecs.BOM_UTF16\ncodecs.BOM_UTF16_BE\ncodecs.BOM_UTF16_LE\ncodecs.BOM_UTF32\ncodecs.BOM_UTF32_BE\ncodecs.BOM_UTF32_LE\ncodecs.BOM_UTF8\ncodecs.BufferedIncrementalDecoder\ncodecs.BufferedIncrementalEncoder\ncodecs.Codec(??)\ncodecs.CodecInfo\ncodecs.EncodedFile(??)\ncodecs.IncrementalDecoder\ncodecs.IncrementalEncoder\ncodecs.StreamReader(??)\ncodecs.StreamReaderWriter(??)\ncodecs.StreamRecoder(??)\ncodecs.StreamWriter(??)\ncodecs.ascii_decode\ncodecs.ascii_encode\ncodecs.backslashreplace_errors\ncodecs.charbuffer_encode\ncodecs.charmap_build\ncodecs.charmap_decode\ncodecs.charmap_encode\ncodecs.decode(obj, [encoding[,errors]]) -> object\ncodecs.encode(obj, [encoding[,errors]]) -> object\ncodecs.escape_decode\ncodecs.escape_encode\ncodecs.getdecoder(??)\ncodecs.getencoder(??)\ncodecs.getincrementaldecoder(??)\ncodecs.getincrementalencoder(??)\ncodecs.getreader(??)\ncodecs.getwriter(??)\ncodecs.ignore_errors\ncodecs.iterdecode(??)\ncodecs.iterencode(??)\ncodecs.latin_1_decode\ncodecs.latin_1_encode\ncodecs.lookup(encoding) -> (encoder, decoder, stream_reader, stream_writer)\ncodecs.lookup_error(errors) -> handler\ncodecs.make_encoding_map(??)\ncodecs.make_identity_dict(rng) -> dict\ncodecs.open(??)\ncodecs.raw_unicode_escape_decode\ncodecs.raw_unicode_escape_encode\ncodecs.readbuffer_encode\ncodecs.register(search_function)\ncodecs.register_error(errors, handler)\ncodecs.replace_errors\ncodecs.strict_errors\ncodecs.sys\ncodecs.unicode_escape_decode\ncodecs.unicode_escape_encode\ncodecs.unicode_internal_decode\ncodecs.unicode_internal_encode\ncodecs.utf_16_be_decode\ncodecs.utf_16_be_encode\ncodecs.utf_16_decode\ncodecs.utf_16_encode\ncodecs.utf_16_ex_decode\ncodecs.utf_16_le_decode\ncodecs.utf_16_le_encode\ncodecs.utf_7_decode\ncodecs.utf_7_encode\ncodecs.utf_8_decode\ncodecs.utf_8_encode\ncodecs.xmlcharrefreplace_errors\ncodeop.CommandCompiler(??)\ncodeop.Compile(??)\ncodeop.PyCF_DONT_IMPLY_DEDENT\ncodeop.compile_command(??)\ncodeop.fname\ncoerce(x, y) -> (x1, y1)\ncollections.defaultdict(default_factory) --> dict with default factory\ncollections.deque(iterable) --> deque object\ncolorsys.ONE_SIXTH\ncolorsys.ONE_THIRD\ncolorsys.TWO_THIRD\ncolorsys.hls_to_rgb(??)\ncolorsys.hsv_to_rgb(??)\ncolorsys.rgb_to_hls(??)\ncolorsys.rgb_to_hsv(??)\ncolorsys.rgb_to_yiq(??)\ncolorsys.yiq_to_rgb(??)\ncommands.getoutput(??)\ncommands.getstatus(??)\ncommands.getstatusoutput(??)\ncommands.mk2arg(??)\ncommands.mkarg(??)\ncompile(source, filename, mode[, flags[, dont_inherit]]) -> code object\ncompileall.compile_dir(??)\ncompileall.compile_path(??)\ncompileall.main(??)\ncompileall.os\ncompileall.py_compile\ncompileall.sys\ncompiler.ast\ncompiler.ast.Add(??)\ncompiler.ast.And(??)\ncompiler.ast.AssAttr(??)\ncompiler.ast.AssList(??)\ncompiler.ast.AssName(??)\ncompiler.ast.AssTuple(??)\ncompiler.ast.Assert(??)\ncompiler.ast.Assign(??)\ncompiler.ast.AugAssign(??)\ncompiler.ast.Backquote(??)\ncompiler.ast.Bitand(??)\ncompiler.ast.Bitor(??)\ncompiler.ast.Bitxor(??)\ncompiler.ast.Break(??)\ncompiler.ast.CO_VARARGS\ncompiler.ast.CO_VARKEYWORDS\ncompiler.ast.CallFunc(??)\ncompiler.ast.Class(??)\ncompiler.ast.Compare(??)\ncompiler.ast.Const(??)\ncompiler.ast.Continue(??)\ncompiler.ast.Decorators(??)\ncompiler.ast.Dict(??)\ncompiler.ast.Discard(??)\ncompiler.ast.Div(??)\ncompiler.ast.Ellipsis(??)\ncompiler.ast.EmptyNode(??)\ncompiler.ast.Exec(??)\ncompiler.ast.Expression(??)\ncompiler.ast.FloorDiv(??)\ncompiler.ast.For(??)\ncompiler.ast.From(??)\ncompiler.ast.Function(??)\ncompiler.ast.GenExpr(??)\ncompiler.ast.GenExprFor(??)\ncompiler.ast.GenExprIf(??)\ncompiler.ast.GenExprInner(??)\ncompiler.ast.Getattr(??)\ncompiler.ast.Global(??)\ncompiler.ast.If(??)\ncompiler.ast.IfExp(??)\ncompiler.ast.Import(??)\ncompiler.ast.Invert(??)\ncompiler.ast.Keyword(??)\ncompiler.ast.Lambda(??)\ncompiler.ast.LeftShift(??)\ncompiler.ast.List(??)\ncompiler.ast.ListComp(??)\ncompiler.ast.ListCompFor(??)\ncompiler.ast.ListCompIf(??)\ncompiler.ast.Mod(??)\ncompiler.ast.Module(??)\ncompiler.ast.Mul(??)\ncompiler.ast.Name(??)\ncompiler.ast.Node(??)\ncompiler.ast.Not(??)\ncompiler.ast.Or(??)\ncompiler.ast.Pass(??)\ncompiler.ast.Power(??)\ncompiler.ast.Print(??)\ncompiler.ast.Printnl(??)\ncompiler.ast.Raise(??)\ncompiler.ast.Return(??)\ncompiler.ast.RightShift(??)\ncompiler.ast.Slice(??)\ncompiler.ast.Sliceobj(??)\ncompiler.ast.Stmt(??)\ncompiler.ast.Sub(??)\ncompiler.ast.Subscript(??)\ncompiler.ast.TryExcept(??)\ncompiler.ast.TryFinally(??)\ncompiler.ast.Tuple(??)\ncompiler.ast.UnaryAdd(??)\ncompiler.ast.UnarySub(??)\ncompiler.ast.While(??)\ncompiler.ast.With(??)\ncompiler.ast.Yield(??)\ncompiler.ast.flatten(??)\ncompiler.ast.flatten_nodes(??)\ncompiler.ast.name\ncompiler.ast.nodes\ncompiler.ast.obj(??)\ncompiler.compile(??)\ncompiler.compileFile(??)\ncompiler.consts\ncompiler.consts.CO_FUTURE_ABSIMPORT\ncompiler.consts.CO_FUTURE_DIVISION\ncompiler.consts.CO_FUTURE_WITH_STATEMENT\ncompiler.consts.CO_GENERATOR\ncompiler.consts.CO_GENERATOR_ALLOWED\ncompiler.consts.CO_NESTED\ncompiler.consts.CO_NEWLOCALS\ncompiler.consts.CO_OPTIMIZED\ncompiler.consts.CO_VARARGS\ncompiler.consts.CO_VARKEYWORDS\ncompiler.consts.OP_APPLY\ncompiler.consts.OP_ASSIGN\ncompiler.consts.OP_DELETE\ncompiler.consts.SC_CELL\ncompiler.consts.SC_FREE\ncompiler.consts.SC_GLOBAL\ncompiler.consts.SC_LOCAL\ncompiler.consts.SC_UNKNOWN\ncompiler.future\ncompiler.future.BadFutureParser(??)\ncompiler.future.FutureParser(??)\ncompiler.future.ast\ncompiler.future.find_futures(??)\ncompiler.future.is_future(??)\ncompiler.future.walk(??)\ncompiler.misc\ncompiler.misc.MANGLE_LEN\ncompiler.misc.Set(??)\ncompiler.misc.Stack(??)\ncompiler.misc.flatten(??)\ncompiler.misc.mangle(??)\ncompiler.misc.set_filename(??)\ncompiler.parse(??)\ncompiler.parseFile(??)\ncompiler.pyassem\ncompiler.pyassem.Block(??)\ncompiler.pyassem.CONV\ncompiler.pyassem.CO_NEWLOCALS\ncompiler.pyassem.CO_OPTIMIZED\ncompiler.pyassem.CO_VARARGS\ncompiler.pyassem.CO_VARKEYWORDS\ncompiler.pyassem.DONE\ncompiler.pyassem.FLAT\ncompiler.pyassem.FlowGraph(??)\ncompiler.pyassem.LineAddrTable(??)\ncompiler.pyassem.PyFlowGraph(??)\ncompiler.pyassem.RAW\ncompiler.pyassem.StackDepthTracker(??)\ncompiler.pyassem.TupleArg(??)\ncompiler.pyassem.dfs_postorder(??)\ncompiler.pyassem.dis\ncompiler.pyassem.findDepth\ncompiler.pyassem.getArgCount(??)\ncompiler.pyassem.isJump(??)\ncompiler.pyassem.misc\ncompiler.pyassem.new\ncompiler.pyassem.sys\ncompiler.pyassem.twobyte(??)\ncompiler.pycodegen\ncompiler.pycodegen.AbstractClassCode(??)\ncompiler.pycodegen.AbstractCompileMode(??)\ncompiler.pycodegen.AbstractFunctionCode(??)\ncompiler.pycodegen.AugGetattr(??)\ncompiler.pycodegen.AugName(??)\ncompiler.pycodegen.AugSlice(??)\ncompiler.pycodegen.AugSubscript(??)\ncompiler.pycodegen.CO_FUTURE_ABSIMPORT\ncompiler.pycodegen.CO_FUTURE_DIVISION\ncompiler.pycodegen.CO_FUTURE_WITH_STATEMENT\ncompiler.pycodegen.CO_GENERATOR\ncompiler.pycodegen.CO_NESTED\ncompiler.pycodegen.CO_NEWLOCALS\ncompiler.pycodegen.CO_VARARGS\ncompiler.pycodegen.CO_VARKEYWORDS\ncompiler.pycodegen.ClassCodeGenerator(??)\ncompiler.pycodegen.CodeGenerator(??)\ncompiler.pycodegen.Delegator(??)\ncompiler.pycodegen.END_FINALLY\ncompiler.pycodegen.EXCEPT\ncompiler.pycodegen.Expression(??)\ncompiler.pycodegen.ExpressionCodeGenerator(??)\ncompiler.pycodegen.FunctionCodeGenerator(??)\ncompiler.pycodegen.GenExprCodeGenerator(??)\ncompiler.pycodegen.Interactive(??)\ncompiler.pycodegen.InteractiveCodeGenerator(??)\ncompiler.pycodegen.LOOP\ncompiler.pycodegen.LocalNameFinder(??)\ncompiler.pycodegen.Module(??)\ncompiler.pycodegen.ModuleCodeGenerator(??)\ncompiler.pycodegen.NestedScopeMixin(??)\ncompiler.pycodegen.OpFinder(??)\ncompiler.pycodegen.SC_CELL\ncompiler.pycodegen.SC_FREE\ncompiler.pycodegen.SC_GLOBAL\ncompiler.pycodegen.SC_LOCAL\ncompiler.pycodegen.StringIO([s]) -- Return a StringIO-like stream for reading or writing\ncompiler.pycodegen.TRY_FINALLY\ncompiler.pycodegen.TupleArg(??)\ncompiler.pycodegen.VERSION\ncompiler.pycodegen.ast\ncompiler.pycodegen.callfunc_opcode_info\ncompiler.pycodegen.compile(??)\ncompiler.pycodegen.compileFile(??)\ncompiler.pycodegen.findOp(??)\ncompiler.pycodegen.future\ncompiler.pycodegen.generateArgList(??)\ncompiler.pycodegen.imp\ncompiler.pycodegen.is_constant_false(??)\ncompiler.pycodegen.marshal\ncompiler.pycodegen.misc\ncompiler.pycodegen.os\ncompiler.pycodegen.parse(??)\ncompiler.pycodegen.pyassem\ncompiler.pycodegen.struct\ncompiler.pycodegen.symbols\ncompiler.pycodegen.syntax\ncompiler.pycodegen.sys\ncompiler.pycodegen.walk(??)\ncompiler.pycodegen.wrap_aug(??)\ncompiler.pycodegen.wrapper\ncompiler.symbols\ncompiler.symbols.ClassScope(??)\ncompiler.symbols.FunctionScope(??)\ncompiler.symbols.GenExprScope(??)\ncompiler.symbols.LambdaScope(??)\ncompiler.symbols.MANGLE_LEN\ncompiler.symbols.ModuleScope(??)\ncompiler.symbols.SC_CELL\ncompiler.symbols.SC_FREE\ncompiler.symbols.SC_GLOBAL\ncompiler.symbols.SC_LOCAL\ncompiler.symbols.SC_UNKNOWN\ncompiler.symbols.Scope(??)\ncompiler.symbols.SymbolVisitor(??)\ncompiler.symbols.ast\ncompiler.symbols.list_eq(??)\ncompiler.symbols.mangle(??)\ncompiler.symbols.sys\ncompiler.symbols.types\ncompiler.syntax\ncompiler.syntax.SyntaxErrorChecker(??)\ncompiler.syntax.ast\ncompiler.syntax.check(??)\ncompiler.syntax.walk(??)\ncompiler.transformer\ncompiler.transformer.Add(??)\ncompiler.transformer.And(??)\ncompiler.transformer.AssAttr(??)\ncompiler.transformer.AssList(??)\ncompiler.transformer.AssName(??)\ncompiler.transformer.AssTuple(??)\ncompiler.transformer.Assert(??)\ncompiler.transformer.Assign(??)\ncompiler.transformer.AugAssign(??)\ncompiler.transformer.Backquote(??)\ncompiler.transformer.Bitand(??)\ncompiler.transformer.Bitor(??)\ncompiler.transformer.Bitxor(??)\ncompiler.transformer.Break(??)\ncompiler.transformer.CO_VARARGS\ncompiler.transformer.CO_VARKEYWORDS\ncompiler.transformer.CallFunc(??)\ncompiler.transformer.Class(??)\ncompiler.transformer.Compare(??)\ncompiler.transformer.Const(??)\ncompiler.transformer.Continue(??)\ncompiler.transformer.Decorators(??)\ncompiler.transformer.Dict(??)\ncompiler.transformer.Discard(??)\ncompiler.transformer.Div(??)\ncompiler.transformer.Ellipsis(??)\ncompiler.transformer.EmptyNode(??)\ncompiler.transformer.Exec(??)\ncompiler.transformer.Expression(??)\ncompiler.transformer.FloorDiv(??)\ncompiler.transformer.For(??)\ncompiler.transformer.From(??)\ncompiler.transformer.Function(??)\ncompiler.transformer.GenExpr(??)\ncompiler.transformer.GenExprFor(??)\ncompiler.transformer.GenExprIf(??)\ncompiler.transformer.GenExprInner(??)\ncompiler.transformer.Getattr(??)\ncompiler.transformer.Global(??)\ncompiler.transformer.If(??)\ncompiler.transformer.IfExp(??)\ncompiler.transformer.Import(??)\ncompiler.transformer.Invert(??)\ncompiler.transformer.Keyword(??)\ncompiler.transformer.Lambda(??)\ncompiler.transformer.LeftShift(??)\ncompiler.transformer.List(??)\ncompiler.transformer.ListComp(??)\ncompiler.transformer.ListCompFor(??)\ncompiler.transformer.ListCompIf(??)\ncompiler.transformer.Mod(??)\ncompiler.transformer.Module(??)\ncompiler.transformer.Mul(??)\ncompiler.transformer.Name(??)\ncompiler.transformer.Node(??)\ncompiler.transformer.Not(??)\ncompiler.transformer.OP_APPLY\ncompiler.transformer.OP_ASSIGN\ncompiler.transformer.OP_DELETE\ncompiler.transformer.Or(??)\ncompiler.transformer.Pass(??)\ncompiler.transformer.Power(??)\ncompiler.transformer.Print(??)\ncompiler.transformer.Printnl(??)\ncompiler.transformer.Raise(??)\ncompiler.transformer.Return(??)\ncompiler.transformer.RightShift(??)\ncompiler.transformer.Slice(??)\ncompiler.transformer.Sliceobj(??)\ncompiler.transformer.Stmt(??)\ncompiler.transformer.Sub(??)\ncompiler.transformer.Subscript(??)\ncompiler.transformer.Transformer(??)\ncompiler.transformer.TryExcept(??)\ncompiler.transformer.TryFinally(??)\ncompiler.transformer.Tuple(??)\ncompiler.transformer.UnaryAdd(??)\ncompiler.transformer.UnarySub(??)\ncompiler.transformer.WalkerError\ncompiler.transformer.While(??)\ncompiler.transformer.With(??)\ncompiler.transformer.Yield(??)\ncompiler.transformer.asList(??)\ncompiler.transformer.debug_tree(??)\ncompiler.transformer.extractLineNo(??)\ncompiler.transformer.flatten(??)\ncompiler.transformer.flatten_nodes(??)\ncompiler.transformer.k\ncompiler.transformer.name\ncompiler.transformer.nodes\ncompiler.transformer.obj(??)\ncompiler.transformer.parse(??)\ncompiler.transformer.parseFile(??)\ncompiler.transformer.parser\ncompiler.transformer.symbol\ncompiler.transformer.sys\ncompiler.transformer.token\ncompiler.transformer.v\ncompiler.visitor\ncompiler.visitor.ASTVisitor(??)\ncompiler.visitor.ExampleASTVisitor(??)\ncompiler.visitor.ast\ncompiler.visitor.dumpNode(??)\ncompiler.visitor.walk(??)\ncompiler.walk(??)\ncomplex(real[, imag]) -> complex number\ncontextlib.GeneratorContextManager\ncontextlib.closing\ncontextlib.contextmanager(??)\ncontextlib.nested(??)\ncontextlib.sys\ncookielib.Absent(??)\ncookielib.Cookie(??)\ncookielib.CookieJar(??)\ncookielib.CookiePolicy(??)\ncookielib.DAYS\ncookielib.DEFAULT_HTTP_PORT\ncookielib.DefaultCookiePolicy(??)\ncookielib.EPOCH_YEAR\ncookielib.ESCAPED_CHAR_RE\ncookielib.FileCookieJar(??)\ncookielib.HEADER_ESCAPE_RE\ncookielib.HEADER_JOIN_ESCAPE_RE\ncookielib.HEADER_QUOTED_VALUE_RE\ncookielib.HEADER_TOKEN_RE\ncookielib.HEADER_VALUE_RE\ncookielib.HTTP_PATH_SAFE\ncookielib.IPV4_RE\ncookielib.ISO_DATE_RE\ncookielib.LOOSE_HTTP_DATE_RE\ncookielib.LWPCookieJar(??)\ncookielib.LoadError\ncookielib.MISSING_FILENAME_TEXT\ncookielib.MONTHS\ncookielib.MONTHS_LOWER\ncookielib.MozillaCookieJar(??)\ncookielib.STRICT_DATE_RE\ncookielib.TIMEZONE_RE\ncookielib.UTC_ZONES\ncookielib.WEEKDAY_RE\ncookielib.copy\ncookielib.cut_port_re\ncookielib.debug\ncookielib.deepvalues(??)\ncookielib.domain_match(??)\ncookielib.eff_request_host(??)\ncookielib.escape_path(??)\ncookielib.http2time(??)\ncookielib.httplib\ncookielib.is_HDN(??)\ncookielib.is_third_party(??)\ncookielib.iso2time(??)\ncookielib.join_header_words(??)\ncookielib.liberal_is_HDN(??)\ncookielib.logger\ncookielib.lwp_cookie_str(??)\ncookielib.month\ncookielib.offset_from_tz_string(??)\ncookielib.parse_ns_headers(??)\ncookielib.re\ncookielib.reach(??)\ncookielib.request_host(??)\ncookielib.request_path(??)\ncookielib.request_port(??)\ncookielib.split_header_words(??)\ncookielib.time\ncookielib.time2isoz(??)\ncookielib.time2netscape(??)\ncookielib.timegm(??)\ncookielib.unmatched(??)\ncookielib.uppercase_escaped_char(??)\ncookielib.urllib\ncookielib.urlparse\ncookielib.user_domain_match(??)\ncookielib.vals_sorted_by_key(??)\ncopy.Error\ncopy.PyStringMap\ncopy.copy(??)\ncopy.deepcopy(??)\ncopy.dispatch_table\ncopy.error\ncopy.name\ncopy.t\ncopy_reg.add_extension(??)\ncopy_reg.clear_extension_cache(??)\ncopy_reg.constructor(??)\ncopy_reg.dispatch_table\ncopy_reg.pickle(??)\ncopy_reg.pickle_complex(??)\ncopy_reg.remove_extension(??)\ncopyright\ncredits\ncrypt.crypt(word, salt) -> string\ncsv.Dialect(??)\ncsv.DictReader(??)\ncsv.DictWriter(??)\ncsv.Error\ncsv.QUOTE_ALL\ncsv.QUOTE_MINIMAL\ncsv.QUOTE_NONE\ncsv.QUOTE_NONNUMERIC\ncsv.Sniffer(??)\ncsv.StringIO([s]) -- Return a StringIO-like stream for reading or writing\ncsv.excel(??)\ncsv.excel_tab(??)\ncsv.field_size_limit\ncsv.get_dialect\ncsv.list_dialects\ncsv.re\ncsv.reader\ncsv.register_dialect\ncsv.unregister_dialect\ncsv.writer\nctypes.ARRAY(??)\nctypes.ArgumentError\nctypes.Array\nctypes.BigEndianStructure\nctypes.CDLL\nctypes.CFUNCTYPE(restype, *argtypes) -> function prototype.\nctypes.DEFAULT_MODE\nctypes.LibraryLoader\nctypes.LittleEndianStructure\nctypes.POINTER(??)\nctypes.PYFUNCTYPE(??)\nctypes.PyDLL\nctypes.RTLD_GLOBAL\nctypes.RTLD_LOCAL\nctypes.SetPointerType(??)\nctypes.Structure\nctypes.Union\nctypes.addressof(C instance) -> integer\nctypes.alignment(C type) -> integer\nctypes.byref(C instance) -> byref-object\nctypes.c_buffer(??)\nctypes.c_byte\nctypes.c_char\nctypes.c_char_p\nctypes.c_double\nctypes.c_float\nctypes.c_int\nctypes.c_int16\nctypes.c_int32\nctypes.c_int64\nctypes.c_int8\nctypes.c_long\nctypes.c_longlong\nctypes.c_short\nctypes.c_size_t\nctypes.c_ubyte\nctypes.c_uint\nctypes.c_uint16\nctypes.c_uint32\nctypes.c_uint64\nctypes.c_uint8\nctypes.c_ulong\nctypes.c_ulonglong\nctypes.c_ushort\nctypes.c_void_p\nctypes.c_voidp\nctypes.c_wchar\nctypes.c_wchar_p\nctypes.cast(??)\nctypes.cdll\nctypes.create_string_buffer(aString) -> character array\nctypes.create_unicode_buffer(aString) -> character array\nctypes.macholib\nctypes.macholib.dyld\nctypes.macholib.dyld.DEFAULT_FRAMEWORK_FALLBACK\nctypes.macholib.dyld.DEFAULT_LIBRARY_FALLBACK\nctypes.macholib.dyld.chain(*iterables) --> chain object\nctypes.macholib.dyld.count([firstval]) --> count object\nctypes.macholib.dyld.cycle(iterable) --> cycle object\nctypes.macholib.dyld.dropwhile(predicate, iterable) --> dropwhile object\nctypes.macholib.dyld.dyld_default_search(??)\nctypes.macholib.dyld.dyld_env(??)\nctypes.macholib.dyld.dyld_executable_path_search(??)\nctypes.macholib.dyld.dyld_fallback_framework_path(??)\nctypes.macholib.dyld.dyld_fallback_library_path(??)\nctypes.macholib.dyld.dyld_find(??)\nctypes.macholib.dyld.dyld_framework_path(??)\nctypes.macholib.dyld.dyld_image_suffix(??)\nctypes.macholib.dyld.dyld_image_suffix_search(??)\nctypes.macholib.dyld.dyld_library_path(??)\nctypes.macholib.dyld.dyld_override_search(??)\nctypes.macholib.dyld.dylib_info(??)\nctypes.macholib.dyld.ensure_utf8(??)\nctypes.macholib.dyld.framework_find(??)\nctypes.macholib.dyld.framework_info(??)\nctypes.macholib.dyld.groupby(iterable[, keyfunc]) -> create an iterator which returns\nctypes.macholib.dyld.ifilter(function or None, sequence) --> ifilter object\nctypes.macholib.dyld.ifilterfalse(function or None, sequence) --> ifilterfalse object\nctypes.macholib.dyld.imap(func, *iterables) --> imap object\nctypes.macholib.dyld.islice(iterable, [start,] stop [, step]) --> islice object\nctypes.macholib.dyld.izip(iter1 [,iter2 [...]]) --> izip object\nctypes.macholib.dyld.os\nctypes.macholib.dyld.repeat(element [,times]) -> create an iterator which returns the element\nctypes.macholib.dyld.starmap(function, sequence) --> starmap object\nctypes.macholib.dyld.takewhile(predicate, iterable) --> takewhile object\nctypes.macholib.dyld.tee(iterable, n=2) --> tuple of n independent iterators.\nctypes.macholib.dyld.test_dyld_find(??)\nctypes.macholib.dylib\nctypes.macholib.dylib.DYLIB_RE\nctypes.macholib.dylib.dylib_info(??)\nctypes.macholib.dylib.re\nctypes.macholib.dylib.test_dylib_info(??)\nctypes.macholib.framework\nctypes.macholib.framework.STRICT_FRAMEWORK_RE\nctypes.macholib.framework.framework_info(??)\nctypes.macholib.framework.re\nctypes.macholib.framework.test_framework_info(??)\nctypes.memmove\nctypes.memset\nctypes.pointer(??)\nctypes.py_object\nctypes.pydll\nctypes.pythonapi\nctypes.resize\nctypes.set_conversion_mode(encoding, errors) -> (previous-encoding, previous-errors)\nctypes.sizeof(C type) -> integer\nctypes.string_at(addr[, size]) -> string\nctypes.util\nctypes.util.errno\nctypes.util.find_library(??)\nctypes.util.os\nctypes.util.re\nctypes.util.sys\nctypes.util.tempfile\nctypes.util.test(??)\nctypes.wstring_at(addr[, size]) -> string\ncurses.ALL_MOUSE_EVENTS\ncurses.A_ALTCHARSET\ncurses.A_ATTRIBUTES\ncurses.A_BLINK\ncurses.A_BOLD\ncurses.A_CHARTEXT\ncurses.A_COLOR\ncurses.A_DIM\ncurses.A_HORIZONTAL\ncurses.A_INVIS\ncurses.A_LEFT\ncurses.A_LOW\ncurses.A_NORMAL\ncurses.A_PROTECT\ncurses.A_REVERSE\ncurses.A_RIGHT\ncurses.A_STANDOUT\ncurses.A_TOP\ncurses.A_UNDERLINE\ncurses.A_VERTICAL\ncurses.BUTTON1_CLICKED\ncurses.BUTTON1_DOUBLE_CLICKED\ncurses.BUTTON1_PRESSED\ncurses.BUTTON1_RELEASED\ncurses.BUTTON1_TRIPLE_CLICKED\ncurses.BUTTON2_CLICKED\ncurses.BUTTON2_DOUBLE_CLICKED\ncurses.BUTTON2_PRESSED\ncurses.BUTTON2_RELEASED\ncurses.BUTTON2_TRIPLE_CLICKED\ncurses.BUTTON3_CLICKED\ncurses.BUTTON3_DOUBLE_CLICKED\ncurses.BUTTON3_PRESSED\ncurses.BUTTON3_RELEASED\ncurses.BUTTON3_TRIPLE_CLICKED\ncurses.BUTTON4_CLICKED\ncurses.BUTTON4_DOUBLE_CLICKED\ncurses.BUTTON4_PRESSED\ncurses.BUTTON4_RELEASED\ncurses.BUTTON4_TRIPLE_CLICKED\ncurses.BUTTON_ALT\ncurses.BUTTON_CTRL\ncurses.BUTTON_SHIFT\ncurses.COLOR_BLACK\ncurses.COLOR_BLUE\ncurses.COLOR_CYAN\ncurses.COLOR_GREEN\ncurses.COLOR_MAGENTA\ncurses.COLOR_RED\ncurses.COLOR_WHITE\ncurses.COLOR_YELLOW\ncurses.ERR\ncurses.KEY_A1\ncurses.KEY_A3\ncurses.KEY_B2\ncurses.KEY_BACKSPACE\ncurses.KEY_BEG\ncurses.KEY_BREAK\ncurses.KEY_BTAB\ncurses.KEY_C1\ncurses.KEY_C3\ncurses.KEY_CANCEL\ncurses.KEY_CATAB\ncurses.KEY_CLEAR\ncurses.KEY_CLOSE\ncurses.KEY_COMMAND\ncurses.KEY_COPY\ncurses.KEY_CREATE\ncurses.KEY_CTAB\ncurses.KEY_DC\ncurses.KEY_DL\ncurses.KEY_DOWN\ncurses.KEY_EIC\ncurses.KEY_END\ncurses.KEY_ENTER\ncurses.KEY_EOL\ncurses.KEY_EOS\ncurses.KEY_EXIT\ncurses.KEY_F0\ncurses.KEY_F1\ncurses.KEY_F10\ncurses.KEY_F11\ncurses.KEY_F12\ncurses.KEY_F13\ncurses.KEY_F14\ncurses.KEY_F15\ncurses.KEY_F16\ncurses.KEY_F17\ncurses.KEY_F18\ncurses.KEY_F19\ncurses.KEY_F2\ncurses.KEY_F20\ncurses.KEY_F21\ncurses.KEY_F22\ncurses.KEY_F23\ncurses.KEY_F24\ncurses.KEY_F25\ncurses.KEY_F26\ncurses.KEY_F27\ncurses.KEY_F28\ncurses.KEY_F29\ncurses.KEY_F3\ncurses.KEY_F30\ncurses.KEY_F31\ncurses.KEY_F32\ncurses.KEY_F33\ncurses.KEY_F34\ncurses.KEY_F35\ncurses.KEY_F36\ncurses.KEY_F37\ncurses.KEY_F38\ncurses.KEY_F39\ncurses.KEY_F4\ncurses.KEY_F40\ncurses.KEY_F41\ncurses.KEY_F42\ncurses.KEY_F43\ncurses.KEY_F44\ncurses.KEY_F45\ncurses.KEY_F46\ncurses.KEY_F47\ncurses.KEY_F48\ncurses.KEY_F49\ncurses.KEY_F5\ncurses.KEY_F50\ncurses.KEY_F51\ncurses.KEY_F52\ncurses.KEY_F53\ncurses.KEY_F54\ncurses.KEY_F55\ncurses.KEY_F56\ncurses.KEY_F57\ncurses.KEY_F58\ncurses.KEY_F59\ncurses.KEY_F6\ncurses.KEY_F60\ncurses.KEY_F61\ncurses.KEY_F62\ncurses.KEY_F63\ncurses.KEY_F7\ncurses.KEY_F8\ncurses.KEY_F9\ncurses.KEY_FIND\ncurses.KEY_HELP\ncurses.KEY_HOME\ncurses.KEY_IC\ncurses.KEY_IL\ncurses.KEY_LEFT\ncurses.KEY_LL\ncurses.KEY_MARK\ncurses.KEY_MAX\ncurses.KEY_MESSAGE\ncurses.KEY_MIN\ncurses.KEY_MOUSE\ncurses.KEY_MOVE\ncurses.KEY_NEXT\ncurses.KEY_NPAGE\ncurses.KEY_OPEN\ncurses.KEY_OPTIONS\ncurses.KEY_PPAGE\ncurses.KEY_PREVIOUS\ncurses.KEY_PRINT\ncurses.KEY_REDO\ncurses.KEY_REFERENCE\ncurses.KEY_REFRESH\ncurses.KEY_REPLACE\ncurses.KEY_RESET\ncurses.KEY_RESIZE\ncurses.KEY_RESTART\ncurses.KEY_RESUME\ncurses.KEY_RIGHT\ncurses.KEY_SAVE\ncurses.KEY_SBEG\ncurses.KEY_SCANCEL\ncurses.KEY_SCOMMAND\ncurses.KEY_SCOPY\ncurses.KEY_SCREATE\ncurses.KEY_SDC\ncurses.KEY_SDL\ncurses.KEY_SELECT\ncurses.KEY_SEND\ncurses.KEY_SEOL\ncurses.KEY_SEXIT\ncurses.KEY_SF\ncurses.KEY_SFIND\ncurses.KEY_SHELP\ncurses.KEY_SHOME\ncurses.KEY_SIC\ncurses.KEY_SLEFT\ncurses.KEY_SMESSAGE\ncurses.KEY_SMOVE\ncurses.KEY_SNEXT\ncurses.KEY_SOPTIONS\ncurses.KEY_SPREVIOUS\ncurses.KEY_SPRINT\ncurses.KEY_SR\ncurses.KEY_SREDO\ncurses.KEY_SREPLACE\ncurses.KEY_SRESET\ncurses.KEY_SRIGHT\ncurses.KEY_SRSUME\ncurses.KEY_SSAVE\ncurses.KEY_SSUSPEND\ncurses.KEY_STAB\ncurses.KEY_SUNDO\ncurses.KEY_SUSPEND\ncurses.KEY_UNDO\ncurses.KEY_UP\ncurses.OK\ncurses.REPORT_MOUSE_POSITION\ncurses.ascii\ncurses.ascii.ACK\ncurses.ascii.BEL\ncurses.ascii.BS\ncurses.ascii.CAN\ncurses.ascii.CR\ncurses.ascii.DC1\ncurses.ascii.DC2\ncurses.ascii.DC3\ncurses.ascii.DC4\ncurses.ascii.DEL\ncurses.ascii.DLE\ncurses.ascii.EM\ncurses.ascii.ENQ\ncurses.ascii.EOT\ncurses.ascii.ESC\ncurses.ascii.ETB\ncurses.ascii.ETX\ncurses.ascii.FF\ncurses.ascii.FS\ncurses.ascii.GS\ncurses.ascii.HT\ncurses.ascii.LF\ncurses.ascii.NAK\ncurses.ascii.NL\ncurses.ascii.NUL\ncurses.ascii.RS\ncurses.ascii.SI\ncurses.ascii.SO\ncurses.ascii.SOH\ncurses.ascii.SP\ncurses.ascii.STX\ncurses.ascii.SUB\ncurses.ascii.SYN\ncurses.ascii.TAB\ncurses.ascii.US\ncurses.ascii.VT\ncurses.ascii.alt(??)\ncurses.ascii.ascii(??)\ncurses.ascii.controlnames\ncurses.ascii.ctrl(??)\ncurses.ascii.isalnum(??)\ncurses.ascii.isalpha(??)\ncurses.ascii.isascii(??)\ncurses.ascii.isblank(??)\ncurses.ascii.iscntrl(??)\ncurses.ascii.isctrl(??)\ncurses.ascii.isdigit(??)\ncurses.ascii.isgraph(??)\ncurses.ascii.islower(??)\ncurses.ascii.ismeta(??)\ncurses.ascii.isprint(??)\ncurses.ascii.ispunct(??)\ncurses.ascii.isspace(??)\ncurses.ascii.isupper(??)\ncurses.ascii.isxdigit(??)\ncurses.ascii.unctrl(??)\ncurses.baudrate\ncurses.beep\ncurses.can_change_color\ncurses.cbreak\ncurses.color_content\ncurses.color_pair\ncurses.curs_set\ncurses.def_prog_mode\ncurses.def_shell_mode\ncurses.delay_output\ncurses.doupdate\ncurses.echo\ncurses.endwin\ncurses.erasechar\ncurses.error\ncurses.filter\ncurses.flash\ncurses.flushinp\ncurses.getmouse\ncurses.getsyx\ncurses.getwin\ncurses.halfdelay\ncurses.has_colors\ncurses.has_ic\ncurses.has_il\ncurses.has_key\ncurses.has_key.has_key(??)\ncurses.init_color\ncurses.init_pair\ncurses.initscr(??)\ncurses.intrflush\ncurses.is_term_resized\ncurses.isendwin\ncurses.keyname\ncurses.killchar\ncurses.longname\ncurses.meta\ncurses.mouseinterval\ncurses.mousemask\ncurses.napms\ncurses.newpad\ncurses.newwin\ncurses.nl\ncurses.nocbreak\ncurses.noecho\ncurses.nonl\ncurses.noqiflush\ncurses.noraw\ncurses.pair_content\ncurses.pair_number\ncurses.panel\ncurses.panel.bottom_panel\ncurses.panel.error\ncurses.panel.new_panel\ncurses.panel.top_panel\ncurses.panel.update_panels\ncurses.panel.version\ncurses.putp\ncurses.qiflush\ncurses.raw\ncurses.reset_prog_mode\ncurses.reset_shell_mode\ncurses.resetty\ncurses.resize_term\ncurses.resizeterm\ncurses.savetty\ncurses.setsyx\ncurses.setupterm\ncurses.start_color(??)\ncurses.termattrs\ncurses.termname\ncurses.textpad\ncurses.textpad.Textbox(??)\ncurses.textpad.ascii\ncurses.textpad.curses\ncurses.textpad.rectangle(??)\ncurses.tigetflag\ncurses.tigetnum\ncurses.tigetstr\ncurses.tparm\ncurses.typeahead\ncurses.unctrl\ncurses.ungetch\ncurses.ungetmouse\ncurses.use_default_colors\ncurses.use_env\ncurses.version\ncurses.wrapper(??)\ncurses.wrapper.func_closure\ncurses.wrapper.func_code\ncurses.wrapper.func_defaults\ncurses.wrapper.func_dict\ncurses.wrapper.func_doc\ncurses.wrapper.func_globals\ncurses.wrapper.func_name\ndatetime.MAXYEAR\ndatetime.MINYEAR\ndatetime.date(year, month, day) --> date object\ndatetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\ndatetime.datetime_CAPI\ndatetime.time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\ndatetime.timedelta\ndatetime.tzinfo\ndbhash.bsddb\ndbhash.error\ndbhash.open(??)\ndbhash.sys\ndecimal.ALWAYS_ROUND\ndecimal.BasicContext\ndecimal.Clamped\ndecimal.Context\ndecimal.ConversionSyntax\ndecimal.Decimal\ndecimal.DecimalException\ndecimal.DefaultContext\ndecimal.DivisionByZero\ndecimal.DivisionImpossible\ndecimal.DivisionUndefined\ndecimal.ExtendedContext\ndecimal.Inexact\ndecimal.Inf\ndecimal.Infsign\ndecimal.InvalidContext\ndecimal.InvalidOperation\ndecimal.NEVER_ROUND\ndecimal.NaN\ndecimal.Overflow\ndecimal.ROUND_CEILING\ndecimal.ROUND_DOWN\ndecimal.ROUND_FLOOR\ndecimal.ROUND_HALF_DOWN\ndecimal.ROUND_HALF_EVEN\ndecimal.ROUND_HALF_UP\ndecimal.ROUND_UP\ndecimal.Rounded\ndecimal.Subnormal\ndecimal.Underflow\ndecimal.getcontext(??)\ndecimal.localcontext(??)\ndecimal.negInf\ndecimal.setcontext(??)\ndelattr(object, name)\ndict() -> new empty dictionary.\ndifflib.Differ(??)\ndifflib.HtmlDiff\ndifflib.IS_CHARACTER_JUNK(??)\ndifflib.IS_LINE_JUNK(??)\ndifflib.SequenceMatcher(??)\ndifflib.context_diff(??)\ndifflib.get_close_matches(??)\ndifflib.heapq\ndifflib.ndiff(??)\ndifflib.restore(??)\ndifflib.unified_diff(??)\ndir([object]) -> list of strings\ndircache.annotate(??)\ndircache.cache\ndircache.listdir(??)\ndircache.opendir(??)\ndircache.os\ndircache.reset(??)\ndis.EXTENDED_ARG\ndis.HAVE_ARGUMENT\ndis.cmp_op\ndis.dis(??)\ndis.disassemble(??)\ndis.disassemble_string(??)\ndis.disco(??)\ndis.distb(??)\ndis.findlabels(??)\ndis.findlinestarts(??)\ndis.hascompare\ndis.hasconst\ndis.hasfree\ndis.hasjabs\ndis.hasjrel\ndis.haslocal\ndis.hasname\ndis.opmap\ndis.opname\ndis.sys\ndis.types\ndivmod(x, y) -> (div, mod)\ndoctest.BLANKLINE_MARKER\ndoctest.COMPARISON_FLAGS\ndoctest.DONT_ACCEPT_BLANKLINE\ndoctest.DONT_ACCEPT_TRUE_FOR_1\ndoctest.DebugRunner(??)\ndoctest.DocFileCase\ndoctest.DocFileSuite(??)\ndoctest.DocFileTest(??)\ndoctest.DocTest(??)\ndoctest.DocTestCase\ndoctest.DocTestFailure\ndoctest.DocTestFinder(??)\ndoctest.DocTestParser(??)\ndoctest.DocTestRunner(??)\ndoctest.DocTestSuite(??)\ndoctest.ELLIPSIS\ndoctest.ELLIPSIS_MARKER\ndoctest.Example(??)\ndoctest.IGNORE_EXCEPTION_DETAIL\ndoctest.NORMALIZE_WHITESPACE\ndoctest.OPTIONFLAGS_BY_NAME\ndoctest.OutputChecker(??)\ndoctest.REPORTING_FLAGS\ndoctest.REPORT_CDIFF\ndoctest.REPORT_NDIFF\ndoctest.REPORT_ONLY_FIRST_FAILURE\ndoctest.REPORT_UDIFF\ndoctest.SKIP\ndoctest.StringIO(??)\ndoctest.Tester(??)\ndoctest.UnexpectedException\ndoctest.debug(??)\ndoctest.debug_script(??)\ndoctest.debug_src(??)\ndoctest.difflib\ndoctest.inspect\ndoctest.linecache\ndoctest.master\ndoctest.os\ndoctest.pdb\ndoctest.re\ndoctest.register_optionflag(??)\ndoctest.run_docstring_examples(??)\ndoctest.script_from_examples(??)\ndoctest.set_unittest_reportflags(??)\ndoctest.sys\ndoctest.tempfile\ndoctest.testfile(??)\ndoctest.testmod(??)\ndoctest.testsource(??)\ndoctest.traceback\ndoctest.unittest\ndoctest.warnings\ndumbdbm.UserDict\ndumbdbm.error\ndumbdbm.open(??)\ndummy_thread.LockType\ndummy_thread.allocate_lock(??)\ndummy_thread.error\ndummy_thread.exit(??)\ndummy_thread.get_ident(??)\ndummy_thread.interrupt_main(??)\ndummy_thread.stack_size(??)\ndummy_thread.start_new_thread(??)\ndummy_thread.warnings\ndummy_threading.BoundedSemaphore(??)\ndummy_threading.Condition(??)\ndummy_threading.Event(??)\ndummy_threading.Lock(??)\ndummy_threading.RLock(??)\ndummy_threading.Semaphore(??)\ndummy_threading.Thread\ndummy_threading.Timer(??)\ndummy_threading.activeCount(??)\ndummy_threading.currentThread(??)\ndummy_threading.enumerate(??)\ndummy_threading.local\ndummy_threading.setprofile(??)\ndummy_threading.settrace(??)\ndummy_threading.stack_size(??)\ndummy_threading.threading\nemail.Charset\nemail.Encoders\nemail.Errors\nemail.FeedParser\nemail.Generator\nemail.Header\nemail.Iterators\nemail.LazyImporter\nemail.MIMEAudio\nemail.MIMEBase\nemail.MIMEImage\nemail.MIMEMessage\nemail.MIMEMultipart\nemail.MIMENonMultipart\nemail.MIMEText\nemail.Message\nemail.Parser\nemail.Utils\nemail.base64MIME\nemail.base64mime\nemail.base64mime.CRLF\nemail.base64mime.EMPTYSTRING\nemail.base64mime.MISC_LEN\nemail.base64mime.NL\nemail.base64mime.a2b_base64\nemail.base64mime.b2a_base64\nemail.base64mime.base64_len(??)\nemail.base64mime.body_decode(??)\nemail.base64mime.body_encode(??)\nemail.base64mime.decode(??)\nemail.base64mime.decodestring(??)\nemail.base64mime.encode(??)\nemail.base64mime.encodestring(??)\nemail.base64mime.fix_eols(??)\nemail.base64mime.header_encode(??)\nemail.base64mime.re\nemail.charset\nemail.charset.ALIASES\nemail.charset.BASE64\nemail.charset.CHARSETS\nemail.charset.CODEC_MAP\nemail.charset.Charset(??)\nemail.charset.DEFAULT_CHARSET\nemail.charset.MISC_LEN\nemail.charset.QP\nemail.charset.SHORTEST\nemail.charset.add_alias(??)\nemail.charset.add_charset(??)\nemail.charset.add_codec(??)\nemail.charset.email\nemail.charset.encode_7or8bit(??)\nemail.charset.errors\nemail.email\nemail.encoders\nemail.encoders.base64\nemail.encoders.encode_7or8bit(??)\nemail.encoders.encode_base64(??)\nemail.encoders.encode_noop(??)\nemail.encoders.encode_quopri(??)\nemail.errors\nemail.errors.BoundaryError\nemail.errors.CharsetError\nemail.errors.FirstHeaderLineIsContinuationDefect(??)\nemail.errors.HeaderParseError\nemail.errors.MalformedHeaderDefect(??)\nemail.errors.MessageDefect(??)\nemail.errors.MessageError\nemail.errors.MessageParseError\nemail.errors.MisplacedEnvelopeHeaderDefect(??)\nemail.errors.MultipartConversionError\nemail.errors.MultipartInvariantViolationDefect(??)\nemail.errors.NoBoundaryInMultipartDefect(??)\nemail.errors.StartBoundaryNotFoundDefect(??)\nemail.feedparser\nemail.feedparser.BufferedSubFile\nemail.feedparser.EMPTYSTRING\nemail.feedparser.FeedParser(??)\nemail.feedparser.NL\nemail.feedparser.NLCRE\nemail.feedparser.NLCRE_bol\nemail.feedparser.NLCRE_crack\nemail.feedparser.NLCRE_eol\nemail.feedparser.NeedMoreData\nemail.feedparser.errors\nemail.feedparser.headerRE\nemail.feedparser.message\nemail.feedparser.re\nemail.generator\nemail.generator.DecodedGenerator(??)\nemail.generator.Generator(??)\nemail.generator.Header(??)\nemail.generator.NL\nemail.generator.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.generator.UNDERSCORE\nemail.generator.fcre\nemail.generator.random\nemail.generator.re\nemail.generator.sys\nemail.generator.time\nemail.generator.warnings\nemail.header\nemail.header.Charset(??)\nemail.header.Header(??)\nemail.header.HeaderParseError\nemail.header.MAXLINELEN\nemail.header.NL\nemail.header.SPACE\nemail.header.SPACE8\nemail.header.UEMPTYSTRING\nemail.header.USASCII\nemail.header.USPACE\nemail.header.UTF8\nemail.header.binascii\nemail.header.decode_header(??)\nemail.header.ecre\nemail.header.email\nemail.header.fcre\nemail.header.make_header(??)\nemail.header.re\nemail.importer\nemail.iterators\nemail.iterators.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.iterators.body_line_iterator(??)\nemail.iterators.sys\nemail.iterators.typed_subpart_iterator(??)\nemail.iterators.walk(??)\nemail.message\nemail.message.Message(??)\nemail.message.SEMISPACE\nemail.message.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.message.binascii\nemail.message.email\nemail.message.errors\nemail.message.paramre\nemail.message.re\nemail.message.tspecials\nemail.message.utils\nemail.message.uu\nemail.message.warnings\nemail.message_from_file(??)\nemail.message_from_string(??)\nemail.mime\nemail.mime.Audio\nemail.mime.Base\nemail.mime.Image\nemail.mime.Message\nemail.mime.Multipart\nemail.mime.NonMultipart\nemail.mime.Text\nemail.mime.application.MIMEApplication(??)\nemail.mime.application.MIMENonMultipart(??)\nemail.mime.application.encoders\nemail.mime.audio\nemail.mime.audio.MIMEAudio(??)\nemail.mime.audio.MIMENonMultipart(??)\nemail.mime.audio.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.mime.audio.encoders\nemail.mime.audio.sndhdr\nemail.mime.base\nemail.mime.base.MIMEBase(??)\nemail.mime.base.message\nemail.mime.image\nemail.mime.image.MIMEImage(??)\nemail.mime.image.MIMENonMultipart(??)\nemail.mime.image.encoders\nemail.mime.image.imghdr\nemail.mime.message\nemail.mime.message.MIMEMessage(??)\nemail.mime.message.MIMENonMultipart(??)\nemail.mime.message.message\nemail.mime.multipart\nemail.mime.multipart.MIMEBase(??)\nemail.mime.multipart.MIMEMultipart(??)\nemail.mime.nonmultipart\nemail.mime.nonmultipart.MIMEBase(??)\nemail.mime.nonmultipart.MIMENonMultipart(??)\nemail.mime.nonmultipart.errors\nemail.mime.text\nemail.mime.text.MIMENonMultipart(??)\nemail.mime.text.MIMEText(??)\nemail.mime.text.encode_7or8bit(??)\nemail.parser\nemail.parser.FeedParser(??)\nemail.parser.HeaderParser(??)\nemail.parser.Message(??)\nemail.parser.Parser(??)\nemail.parser.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.parser.warnings\nemail.quopriMIME\nemail.quoprimime\nemail.quoprimime.CRLF\nemail.quoprimime.MISC_LEN\nemail.quoprimime.NL\nemail.quoprimime.body_decode(??)\nemail.quoprimime.body_encode(??)\nemail.quoprimime.body_quopri_check(??)\nemail.quoprimime.body_quopri_len(??)\nemail.quoprimime.bqre\nemail.quoprimime.decode(??)\nemail.quoprimime.decodestring(??)\nemail.quoprimime.encode(??)\nemail.quoprimime.encodestring(??)\nemail.quoprimime.fix_eols(??)\nemail.quoprimime.header_decode(??)\nemail.quoprimime.header_encode(??)\nemail.quoprimime.header_quopri_check(??)\nemail.quoprimime.header_quopri_len(??)\nemail.quoprimime.hexdigits\nemail.quoprimime.hqre\nemail.quoprimime.quote(??)\nemail.quoprimime.re\nemail.quoprimime.unquote(??)\nemail.sys\nemail.utils\nemail.utils.COMMASPACE\nemail.utils.CRLF\nemail.utils.EMPTYSTRING\nemail.utils.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.utils.TICK\nemail.utils.UEMPTYSTRING\nemail.utils.base64\nemail.utils.collapse_rfc2231_value(??)\nemail.utils.decode_params(??)\nemail.utils.decode_rfc2231(??)\nemail.utils.ecre\nemail.utils.encode_rfc2231(??)\nemail.utils.escapesre\nemail.utils.fix_eols(??)\nemail.utils.formataddr(??)\nemail.utils.formatdate(??)\nemail.utils.getaddresses(??)\nemail.utils.make_msgid(??)\nemail.utils.mktime_tz(??)\nemail.utils.os\nemail.utils.parseaddr(??)\nemail.utils.parsedate(??)\nemail.utils.parsedate_tz(??)\nemail.utils.quote(??)\nemail.utils.random\nemail.utils.re\nemail.utils.rfc2231_continuation\nemail.utils.socket\nemail.utils.specialsre\nemail.utils.time\nemail.utils.unquote(??)\nemail.utils.urllib\nemail.utils.warnings\nenumerate(iterable) -> iterator for index, value of iterable\nerrno.E2BIG\nerrno.EACCES\nerrno.EADDRINUSE\nerrno.EADDRNOTAVAIL\nerrno.EADV\nerrno.EAFNOSUPPORT\nerrno.EAGAIN\nerrno.EALREADY\nerrno.EBADE\nerrno.EBADF\nerrno.EBADFD\nerrno.EBADMSG\nerrno.EBADR\nerrno.EBADRQC\nerrno.EBADSLT\nerrno.EBFONT\nerrno.EBUSY\nerrno.ECHILD\nerrno.ECHRNG\nerrno.ECOMM\nerrno.ECONNABORTED\nerrno.ECONNREFUSED\nerrno.ECONNRESET\nerrno.EDEADLK\nerrno.EDEADLOCK\nerrno.EDESTADDRREQ\nerrno.EDOM\nerrno.EDOTDOT\nerrno.EDQUOT\nerrno.EEXIST\nerrno.EFAULT\nerrno.EFBIG\nerrno.EHOSTDOWN\nerrno.EHOSTUNREACH\nerrno.EIDRM\nerrno.EILSEQ\nerrno.EINPROGRESS\nerrno.EINTR\nerrno.EINVAL\nerrno.EIO\nerrno.EISCONN\nerrno.EISDIR\nerrno.EISNAM\nerrno.EL2HLT\nerrno.EL2NSYNC\nerrno.EL3HLT\nerrno.EL3RST\nerrno.ELIBACC\nerrno.ELIBBAD\nerrno.ELIBEXEC\nerrno.ELIBMAX\nerrno.ELIBSCN\nerrno.ELNRNG\nerrno.ELOOP\nerrno.EMFILE\nerrno.EMLINK\nerrno.EMSGSIZE\nerrno.EMULTIHOP\nerrno.ENAMETOOLONG\nerrno.ENAVAIL\nerrno.ENETDOWN\nerrno.ENETRESET\nerrno.ENETUNREACH\nerrno.ENFILE\nerrno.ENOANO\nerrno.ENOBUFS\nerrno.ENOCSI\nerrno.ENODATA\nerrno.ENODEV\nerrno.ENOENT\nerrno.ENOEXEC\nerrno.ENOLCK\nerrno.ENOLINK\nerrno.ENOMEM\nerrno.ENOMSG\nerrno.ENONET\nerrno.ENOPKG\nerrno.ENOPROTOOPT\nerrno.ENOSPC\nerrno.ENOSR\nerrno.ENOSTR\nerrno.ENOSYS\nerrno.ENOTBLK\nerrno.ENOTCONN\nerrno.ENOTDIR\nerrno.ENOTEMPTY\nerrno.ENOTNAM\nerrno.ENOTSOCK\nerrno.ENOTTY\nerrno.ENOTUNIQ\nerrno.ENXIO\nerrno.EOPNOTSUPP\nerrno.EOVERFLOW\nerrno.EPERM\nerrno.EPFNOSUPPORT\nerrno.EPIPE\nerrno.EPROTO\nerrno.EPROTONOSUPPORT\nerrno.EPROTOTYPE\nerrno.ERANGE\nerrno.EREMCHG\nerrno.EREMOTE\nerrno.EREMOTEIO\nerrno.ERESTART\nerrno.EROFS\nerrno.ESHUTDOWN\nerrno.ESOCKTNOSUPPORT\nerrno.ESPIPE\nerrno.ESRCH\nerrno.ESRMNT\nerrno.ESTALE\nerrno.ESTRPIPE\nerrno.ETIME\nerrno.ETIMEDOUT\nerrno.ETOOMANYREFS\nerrno.ETXTBSY\nerrno.EUCLEAN\nerrno.EUNATCH\nerrno.EUSERS\nerrno.EWOULDBLOCK\nerrno.EXDEV\nerrno.EXFULL\nerrno.errorcode\neval(source[, globals[, locals]]) -> value\nexceptions.ArithmeticError\nexceptions.AssertionError\nexceptions.AttributeError\nexceptions.BaseException\nexceptions.DeprecationWarning\nexceptions.EOFError\nexceptions.EnvironmentError\nexceptions.Exception\nexceptions.FloatingPointError\nexceptions.FutureWarning\nexceptions.GeneratorExit\nexceptions.IOError\nexceptions.ImportError\nexceptions.ImportWarning\nexceptions.IndentationError\nexceptions.IndexError\nexceptions.KeyError\nexceptions.KeyboardInterrupt\nexceptions.LookupError\nexceptions.MemoryError\nexceptions.NameError\nexceptions.NotImplementedError\nexceptions.OSError\nexceptions.OverflowError\nexceptions.PendingDeprecationWarning\nexceptions.ReferenceError\nexceptions.RuntimeError\nexceptions.RuntimeWarning\nexceptions.StandardError\nexceptions.StopIteration\nexceptions.SyntaxError\nexceptions.SyntaxWarning\nexceptions.SystemError\nexceptions.SystemExit\nexceptions.TabError\nexceptions.TypeError\nexceptions.UnboundLocalError\nexceptions.UnicodeDecodeError\nexceptions.UnicodeEncodeError\nexceptions.UnicodeError\nexceptions.UnicodeTranslateError\nexceptions.UnicodeWarning\nexceptions.UserWarning\nexceptions.ValueError\nexceptions.Warning\nexceptions.ZeroDivisionError\nexecfile(filename[, globals[, locals]])\nexit\nfcntl.DN_ACCESS\nfcntl.DN_ATTRIB\nfcntl.DN_CREATE\nfcntl.DN_DELETE\nfcntl.DN_MODIFY\nfcntl.DN_MULTISHOT\nfcntl.DN_RENAME\nfcntl.FD_CLOEXEC\nfcntl.F_DUPFD\nfcntl.F_EXLCK\nfcntl.F_GETFD\nfcntl.F_GETFL\nfcntl.F_GETLEASE\nfcntl.F_GETLK\nfcntl.F_GETLK64\nfcntl.F_GETOWN\nfcntl.F_GETSIG\nfcntl.F_NOTIFY\nfcntl.F_RDLCK\nfcntl.F_SETFD\nfcntl.F_SETFL\nfcntl.F_SETLEASE\nfcntl.F_SETLK\nfcntl.F_SETLK64\nfcntl.F_SETLKW\nfcntl.F_SETLKW64\nfcntl.F_SETOWN\nfcntl.F_SETSIG\nfcntl.F_SHLCK\nfcntl.F_UNLCK\nfcntl.F_WRLCK\nfcntl.I_ATMARK\nfcntl.I_CANPUT\nfcntl.I_CKBAND\nfcntl.I_FDINSERT\nfcntl.I_FIND\nfcntl.I_FLUSH\nfcntl.I_FLUSHBAND\nfcntl.I_GETBAND\nfcntl.I_GETCLTIME\nfcntl.I_GETSIG\nfcntl.I_GRDOPT\nfcntl.I_GWROPT\nfcntl.I_LINK\nfcntl.I_LIST\nfcntl.I_LOOK\nfcntl.I_NREAD\nfcntl.I_PEEK\nfcntl.I_PLINK\nfcntl.I_POP\nfcntl.I_PUNLINK\nfcntl.I_PUSH\nfcntl.I_RECVFD\nfcntl.I_SENDFD\nfcntl.I_SETCLTIME\nfcntl.I_SETSIG\nfcntl.I_SRDOPT\nfcntl.I_STR\nfcntl.I_SWROPT\nfcntl.I_UNLINK\nfcntl.LOCK_EX\nfcntl.LOCK_MAND\nfcntl.LOCK_NB\nfcntl.LOCK_READ\nfcntl.LOCK_RW\nfcntl.LOCK_SH\nfcntl.LOCK_UN\nfcntl.LOCK_WRITE\nfcntl.fcntl(fd, opt, [arg])\nfcntl.flock(fd, operation)\nfcntl.ioctl(fd, opt[, arg[, mutate_flag]])\nfcntl.lockf (fd, operation, length=0, start=0, whence=0)\nfile(name[, mode[, buffering]]) -> file object\nfilecmp.BUFSIZE\nfilecmp.cmp(??)\nfilecmp.cmpfiles(??)\nfilecmp.demo(??)\nfilecmp.dircmp(??)\nfilecmp.ifilter(function or None, sequence) --> ifilter object\nfilecmp.ifilterfalse(function or None, sequence) --> ifilterfalse object\nfilecmp.imap(func, *iterables) --> imap object\nfilecmp.izip(iter1 [,iter2 [...]]) --> izip object\nfilecmp.os\nfilecmp.stat\nfilecmp.warnings\nfileinput.DEFAULT_BUFSIZE\nfileinput.FileInput(??)\nfileinput.close(??)\nfileinput.filelineno(??)\nfileinput.filename(??)\nfileinput.fileno(??)\nfileinput.hook_compressed(??)\nfileinput.hook_encoded(??)\nfileinput.input([files[, inplace[, backup[, mode[, openhook]]]]])\nfileinput.isfirstline(??)\nfileinput.isstdin(??)\nfileinput.lineno(??)\nfileinput.nextfile(??)\nfileinput.os\nfileinput.sys\nfilter(function or None, sequence) -> list, tuple, or string\nfloat(x) -> floating point number\nfnmatch.filter(??)\nfnmatch.fnmatch(??)\nfnmatch.fnmatchcase(??)\nfnmatch.re\nfnmatch.translate(??)\nformatter.AS_IS\nformatter.AbstractFormatter(??)\nformatter.AbstractWriter(??)\nformatter.DumbWriter(??)\nformatter.NullFormatter(??)\nformatter.NullWriter(??)\nformatter.sys\nformatter.test(??)\nfpformat.NotANumber\nfpformat.decoder\nfpformat.extract(??)\nfpformat.fix(??)\nfpformat.re\nfpformat.roundfrac(??)\nfpformat.sci(??)\nfpformat.test(??)\nfpformat.unexpo(??)\nfrozenset(iterable) --> frozenset object\nftplib.CRLF\nftplib.Error\nftplib.FTP(??)\nftplib.FTP_PORT\nftplib.MSG_OOB\nftplib.Netrc(??)\nftplib.all_errors\nftplib.error_perm\nftplib.error_proto\nftplib.error_reply\nftplib.error_temp\nftplib.ftpcp(??)\nftplib.os\nftplib.parse150(??)\nftplib.parse227(??)\nftplib.parse229(??)\nftplib.parse257(??)\nftplib.print_line(??)\nftplib.socket\nftplib.sys\nftplib.test(??)\nfunctools.WRAPPER_ASSIGNMENTS\nfunctools.WRAPPER_UPDATES\nfunctools.partial(func, *args, **keywords) - new function with partial application\nfunctools.update_wrapper(??)\nfunctools.wraps(??)\ngc.DEBUG_COLLECTABLE\ngc.DEBUG_INSTANCES\ngc.DEBUG_LEAK\ngc.DEBUG_OBJECTS\ngc.DEBUG_SAVEALL\ngc.DEBUG_STATS\ngc.DEBUG_UNCOLLECTABLE\ngc.collect([generation]) -> n\ngc.disable() -> None\ngc.enable() -> None\ngc.garbage\ngc.get_count() -> (count0, count1, count2)\ngc.get_debug() -> flags\ngc.get_objects() -> [...]\ngc.get_referents(*objs) -> list\ngc.get_referrers(*objs) -> list\ngc.get_threshold() -> (threshold0, threshold1, threshold2)\ngc.isenabled() -> status\ngc.set_debug(flags) -> None\ngc.set_threshold(threshold0, [threshold1, threshold2]) -> None\ngdbm.error\ngdbm.open(filename, [flags, [mode]])  -> dbm_object\ngdbm.open_flags\ngetattr(object, name[, default]) -> value\ngetopt.GetoptError\ngetopt.do_longs(??)\ngetopt.do_shorts(??)\ngetopt.error\ngetopt.getopt(args, options[, long_options]) -> opts, args\ngetopt.gnu_getopt(??)\ngetopt.long_has_args(??)\ngetopt.os\ngetopt.short_has_arg(??)\ngetpass.default_getpass(??)\ngetpass.getpass(??)\ngetpass.getuser(??)\ngetpass.sys\ngetpass.termios\ngetpass.unix_getpass(??)\ngetpass.win_getpass(??)\ngettext.Catalog(??)\ngettext.ENOENT\ngettext.GNUTranslations(??)\ngettext.NullTranslations(??)\ngettext.bind_textdomain_codeset(??)\ngettext.bindtextdomain(??)\ngettext.c2py(??)\ngettext.copy\ngettext.dgettext(??)\ngettext.dngettext(??)\ngettext.find(??)\ngettext.gettext(??)\ngettext.install(??)\ngettext.ldgettext(??)\ngettext.ldngettext(??)\ngettext.lgettext(??)\ngettext.lngettext(??)\ngettext.locale\ngettext.ngettext(??)\ngettext.os\ngettext.re\ngettext.struct\ngettext.sys\ngettext.test(??)\ngettext.textdomain(??)\ngettext.translation(??)\nglob.fnmatch\nglob.glob(??)\nglob.glob0(??)\nglob.glob1(??)\nglob.has_magic(??)\nglob.iglob(??)\nglob.magic_check\nglob.os\nglob.re\nglobals() -> dictionary\ngopherlib.A_BINARY\ngopherlib.A_CALENDAR\ngopherlib.A_CSO\ngopherlib.A_DUPLICATE\ngopherlib.A_ERROR\ngopherlib.A_EVENT\ngopherlib.A_GIF\ngopherlib.A_HTML\ngopherlib.A_IMAGE\ngopherlib.A_INDEX\ngopherlib.A_MACBINHEX\ngopherlib.A_MENU\ngopherlib.A_MIME\ngopherlib.A_PCBINHEX\ngopherlib.A_PLUS_IMAGE\ngopherlib.A_PLUS_MOVIE\ngopherlib.A_PLUS_SOUND\ngopherlib.A_QUERY\ngopherlib.A_SOUND\ngopherlib.A_TELNET\ngopherlib.A_TEXT\ngopherlib.A_TN3270\ngopherlib.A_UUENCODED\ngopherlib.A_WHOIS\ngopherlib.A_WWW\ngopherlib.CRLF\ngopherlib.DEF_HOST\ngopherlib.DEF_PORT\ngopherlib.DEF_SELECTOR\ngopherlib.TAB\ngopherlib.get_alt_binary(??)\ngopherlib.get_alt_textfile(??)\ngopherlib.get_binary(??)\ngopherlib.get_directory(??)\ngopherlib.get_textfile(??)\ngopherlib.path_to_datatype_name(??)\ngopherlib.path_to_selector(??)\ngopherlib.send_query(??)\ngopherlib.send_selector(??)\ngopherlib.test(??)\ngopherlib.type_to_name(??)\ngopherlib.warnings\ngrp.getgrall() -> list of tuples\ngrp.getgrgid(id) -> tuple\ngrp.getgrnam(name) -> tuple\ngrp.struct_group\ngzip.FCOMMENT\ngzip.FEXTRA\ngzip.FHCRC\ngzip.FNAME\ngzip.FTEXT\ngzip.GzipFile(??)\ngzip.LOWU32(??)\ngzip.READ\ngzip.U32(??)\ngzip.WRITE\ngzip.open(??)\ngzip.read32(??)\ngzip.struct\ngzip.sys\ngzip.time\ngzip.write32(??)\ngzip.write32u(??)\ngzip.zlib\nhasattr(object, name) -> bool\nhash(object) -> integer\nhashlib.md5\nhashlib.new(name, string='') - Return a new hashing object using the named algorithm;\nhashlib.sha1\nhashlib.sha224\nhashlib.sha256\nhashlib.sha384\nhashlib.sha512\nheapq.bisect\nheapq.count([firstval]) --> count object\nheapq.heapify\nheapq.heappop\nheapq.heappush\nheapq.heapreplace\nheapq.imap(func, *iterables) --> imap object\nheapq.islice(iterable, [start,] stop [, step]) --> islice object\nheapq.itemgetter(item, ...) --> itemgetter object\nheapq.izip(iter1 [,iter2 [...]]) --> izip object\nheapq.neg(a) -- Same as -a.\nheapq.nlargest(??)\nheapq.nsmallest(??)\nheapq.repeat(element [,times]) -> create an iterator which returns the element\nheapq.tee(iterable, n=2) --> tuple of n independent iterators.\nhelp\nhex(number) -> string\nhmac.HMAC(??)\nhmac.digest_size\nhmac.new(??)\nhotshot.Profile(??)\nhotshot.ProfilerError\nhotshot.log\nhotshot.log.ENTER\nhotshot.log.EXIT\nhotshot.log.LINE\nhotshot.log.LogReader(??)\nhotshot.log.WHAT_ADD_INFO\nhotshot.log.WHAT_DEFINE_FILE\nhotshot.log.WHAT_DEFINE_FUNC\nhotshot.log.WHAT_ENTER\nhotshot.log.WHAT_EXIT\nhotshot.log.WHAT_LINENO\nhotshot.log.os\nhotshot.log.parser\nhotshot.log.symbol\nhotshot.log.sys\nhotshot.stats\nhotshot.stats.ENTER\nhotshot.stats.EXIT\nhotshot.stats.FakeCode(??)\nhotshot.stats.FakeFrame(??)\nhotshot.stats.Profile(??)\nhotshot.stats.StatsLoader(??)\nhotshot.stats.hotshot\nhotshot.stats.load(??)\nhotshot.stats.profile\nhotshot.stats.pstats\nhotshot.stones\nhotshot.stones.errno\nhotshot.stones.hotshot\nhotshot.stones.main(??)\nhotshot.stones.os\nhotshot.stones.sys\nhotshot.stones.test\nhtmlentitydefs.codepoint2name\nhtmlentitydefs.entitydefs\nhtmlentitydefs.name2codepoint\nhtmllib.AS_IS\nhtmllib.HTMLParseError\nhtmllib.HTMLParser(??)\nhtmllib.sgmllib\nhtmllib.test(??)\nhttplib.ACCEPTED\nhttplib.BAD_GATEWAY\nhttplib.BAD_REQUEST\nhttplib.BadStatusLine\nhttplib.CONFLICT\nhttplib.CONTINUE\nhttplib.CREATED\nhttplib.CannotSendHeader\nhttplib.CannotSendRequest\nhttplib.EXPECTATION_FAILED\nhttplib.FAILED_DEPENDENCY\nhttplib.FORBIDDEN\nhttplib.FOUND\nhttplib.FakeSocket(??)\nhttplib.GATEWAY_TIMEOUT\nhttplib.GONE\nhttplib.HTTP(??)\nhttplib.HTTPConnection(??)\nhttplib.HTTPException\nhttplib.HTTPMessage(??)\nhttplib.HTTPResponse(??)\nhttplib.HTTPS(??)\nhttplib.HTTPSConnection(??)\nhttplib.HTTPS_PORT\nhttplib.HTTP_PORT\nhttplib.HTTP_VERSION_NOT_SUPPORTED\nhttplib.IM_USED\nhttplib.INSUFFICIENT_STORAGE\nhttplib.INTERNAL_SERVER_ERROR\nhttplib.ImproperConnectionState\nhttplib.IncompleteRead\nhttplib.InvalidURL\nhttplib.LENGTH_REQUIRED\nhttplib.LOCKED\nhttplib.LineAndFileWrapper(??)\nhttplib.MAXAMOUNT\nhttplib.METHOD_NOT_ALLOWED\nhttplib.MOVED_PERMANENTLY\nhttplib.MULTIPLE_CHOICES\nhttplib.MULTI_STATUS\nhttplib.NON_AUTHORITATIVE_INFORMATION\nhttplib.NOT_ACCEPTABLE\nhttplib.NOT_EXTENDED\nhttplib.NOT_FOUND\nhttplib.NOT_IMPLEMENTED\nhttplib.NOT_MODIFIED\nhttplib.NO_CONTENT\nhttplib.NotConnected\nhttplib.OK\nhttplib.PARTIAL_CONTENT\nhttplib.PAYMENT_REQUIRED\nhttplib.PRECONDITION_FAILED\nhttplib.PROCESSING\nhttplib.PROXY_AUTHENTICATION_REQUIRED\nhttplib.REQUESTED_RANGE_NOT_SATISFIABLE\nhttplib.REQUEST_ENTITY_TOO_LARGE\nhttplib.REQUEST_TIMEOUT\nhttplib.REQUEST_URI_TOO_LONG\nhttplib.RESET_CONTENT\nhttplib.ResponseNotReady\nhttplib.SEE_OTHER\nhttplib.SERVICE_UNAVAILABLE\nhttplib.SSLFile(??)\nhttplib.SWITCHING_PROTOCOLS\nhttplib.SharedSocket(??)\nhttplib.SharedSocketClient(??)\nhttplib.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nhttplib.TEMPORARY_REDIRECT\nhttplib.UNAUTHORIZED\nhttplib.UNPROCESSABLE_ENTITY\nhttplib.UNSUPPORTED_MEDIA_TYPE\nhttplib.UPGRADE_REQUIRED\nhttplib.USE_PROXY\nhttplib.UnimplementedFileMode\nhttplib.UnknownProtocol\nhttplib.UnknownTransferEncoding\nhttplib.errno\nhttplib.error\nhttplib.mimetools\nhttplib.responses\nhttplib.socket\nhttplib.test(??)\nhttplib.urlsplit(??)\nid(object) -> integer\nihooks.BUILTIN_MODULE\nihooks.BasicModuleImporter(??)\nihooks.BasicModuleLoader(??)\nihooks.C_BUILTIN\nihooks.C_EXTENSION\nihooks.FROZEN_MODULE\nihooks.FancyModuleLoader(??)\nihooks.Hooks(??)\nihooks.ModuleImporter(??)\nihooks.ModuleLoader(??)\nihooks.PKG_DIRECTORY\nihooks.PY_COMPILED\nihooks.PY_FROZEN\nihooks.PY_SOURCE\nihooks.VERBOSE\nihooks.current_importer\nihooks.default_importer\nihooks.imp\nihooks.install(??)\nihooks.os\nihooks.sys\nihooks.uninstall(??)\nimaplib.AllowedVersions\nimaplib.CRLF\nimaplib.Commands\nimaplib.Continuation\nimaplib.Debug\nimaplib.Flags\nimaplib.IMAP4(??)\nimaplib.IMAP4_PORT\nimaplib.IMAP4_SSL(??)\nimaplib.IMAP4_SSL_PORT\nimaplib.IMAP4_stream(??)\nimaplib.Int2AP(??)\nimaplib.InternalDate\nimaplib.Internaldate2tuple(??)\nimaplib.Literal\nimaplib.MapCRLF\nimaplib.Mon2num\nimaplib.ParseFlags(??)\nimaplib.Response_code\nimaplib.Time2Internaldate(??)\nimaplib.Untagged_response\nimaplib.Untagged_status\nimaplib.binascii\nimaplib.os\nimaplib.random\nimaplib.re\nimaplib.socket\nimaplib.sys\nimaplib.time\nimghdr.test(??)\nimghdr.test_bmp(??)\nimghdr.test_exif(??)\nimghdr.test_gif(??)\nimghdr.test_jpeg(??)\nimghdr.test_pbm(??)\nimghdr.test_pgm(??)\nimghdr.test_png(??)\nimghdr.test_ppm(??)\nimghdr.test_rast(??)\nimghdr.test_rgb(??)\nimghdr.test_tiff(??)\nimghdr.test_xbm(??)\nimghdr.testall(??)\nimghdr.tests\nimghdr.what(??)\nimp.C_BUILTIN\nimp.C_EXTENSION\nimp.IMP_HOOK\nimp.NullImporter\nimp.PKG_DIRECTORY\nimp.PY_CODERESOURCE\nimp.PY_COMPILED\nimp.PY_FROZEN\nimp.PY_RESOURCE\nimp.PY_SOURCE\nimp.SEARCH_ERROR\nimp.acquire_lock() -> None\nimp.find_module(name, [path]) -> (file, filename, (suffix, mode, type))\nimp.get_frozen_object\nimp.get_magic() -> string\nimp.get_suffixes() -> [(suffix, mode, type), ...]\nimp.init_builtin\nimp.init_frozen\nimp.is_builtin\nimp.is_frozen\nimp.load_compiled\nimp.load_dynamic\nimp.load_module(name, file, filename, (suffix, mode, type)) -> module\nimp.load_package\nimp.load_source\nimp.lock_held() -> boolean\nimp.new_module(name) -> module\nimp.release_lock() -> None\nimputil.BuiltinImporter(??)\nimputil.DynLoadSuffixImporter(??)\nimputil.ImportManager(??)\nimputil.Importer(??)\nimputil.imp\nimputil.marshal\nimputil.py_suffix_importer(??)\nimputil.struct\nimputil.sys\ninput([prompt]) -> value\ninspect.BlockFinder(??)\ninspect.CO_NEWLOCALS\ninspect.CO_OPTIMIZED\ninspect.CO_VARARGS\ninspect.CO_VARKEYWORDS\ninspect.EndOfBlock\ninspect.attrgetter(attr, ...) --> attrgetter object\ninspect.classify_class_attrs(??)\ninspect.currentframe\ninspect.dis\ninspect.findsource(??)\ninspect.formatargspec(??)\ninspect.formatargvalues(??)\ninspect.getabsfile(??)\ninspect.getargs(??)\ninspect.getargspec(??)\ninspect.getargvalues(??)\ninspect.getblock(??)\ninspect.getclasstree(??)\ninspect.getcomments(??)\ninspect.getdoc(??)\ninspect.getfile(??)\ninspect.getframeinfo(??)\ninspect.getinnerframes(??)\ninspect.getlineno(??)\ninspect.getmembers(??)\ninspect.getmodule(??)\ninspect.getmoduleinfo(??)\ninspect.getmodulename(??)\ninspect.getmro(??)\ninspect.getouterframes(??)\ninspect.getsource(??)\ninspect.getsourcefile(??)\ninspect.getsourcelines(??)\ninspect.imp\ninspect.indentsize(??)\ninspect.isbuiltin(??)\ninspect.isclass(??)\ninspect.iscode(??)\ninspect.isdatadescriptor(??)\ninspect.isframe(??)\ninspect.isfunction(??)\ninspect.isgetsetdescriptor(??)\ninspect.ismemberdescriptor(??)\ninspect.ismethod(??)\ninspect.ismethoddescriptor(??)\ninspect.ismodule(??)\ninspect.isroutine(??)\ninspect.istraceback(??)\ninspect.joinseq(??)\ninspect.linecache\ninspect.modulesbyfile\ninspect.os\ninspect.re\ninspect.stack(??)\ninspect.string\ninspect.strseq(??)\ninspect.sys\ninspect.tokenize\ninspect.trace(??)\ninspect.types\ninspect.walktree(??)\nint(x[, base]) -> integer\nintern(string) -> string\nisinstance(object, class-or-type-or-tuple) -> bool\nissubclass(C, B) -> bool\niter(collection) -> iterator\nitertools.chain(*iterables) --> chain object\nitertools.count([firstval]) --> count object\nitertools.cycle(iterable) --> cycle object\nitertools.dropwhile(predicate, iterable) --> dropwhile object\nitertools.groupby(iterable[, keyfunc]) -> create an iterator which returns\nitertools.ifilter(function or None, sequence) --> ifilter object\nitertools.ifilterfalse(function or None, sequence) --> ifilterfalse object\nitertools.imap(func, *iterables) --> imap object\nitertools.islice(iterable, [start,] stop [, step]) --> islice object\nitertools.izip(iter1 [,iter2 [...]]) --> izip object\nitertools.repeat(element [,times]) -> create an iterator which returns the element\nitertools.starmap(function, sequence) --> starmap object\nitertools.takewhile(predicate, iterable) --> takewhile object\nitertools.tee(iterable, n=2) --> tuple of n independent iterators.\nkeyword.iskeyword\nkeyword.kwlist\nkeyword.main(??)\nlen(object) -> integer\nlicense\nlinecache.cache\nlinecache.checkcache(??)\nlinecache.clearcache(??)\nlinecache.getline(??)\nlinecache.getlines(??)\nlinecache.os\nlinecache.sys\nlinecache.updatecache(??)\nlinuxaudiodev.AFMT_A_LAW\nlinuxaudiodev.AFMT_MU_LAW\nlinuxaudiodev.AFMT_S16_BE\nlinuxaudiodev.AFMT_S16_LE\nlinuxaudiodev.AFMT_S16_NE\nlinuxaudiodev.AFMT_S8\nlinuxaudiodev.AFMT_U16_BE\nlinuxaudiodev.AFMT_U16_LE\nlinuxaudiodev.AFMT_U8\nlinuxaudiodev.error\nlinuxaudiodev.open\nlist() -> new list\nlocale.ABDAY_1\nlocale.ABDAY_2\nlocale.ABDAY_3\nlocale.ABDAY_4\nlocale.ABDAY_5\nlocale.ABDAY_6\nlocale.ABDAY_7\nlocale.ABMON_1\nlocale.ABMON_10\nlocale.ABMON_11\nlocale.ABMON_12\nlocale.ABMON_2\nlocale.ABMON_3\nlocale.ABMON_4\nlocale.ABMON_5\nlocale.ABMON_6\nlocale.ABMON_7\nlocale.ABMON_8\nlocale.ABMON_9\nlocale.ALT_DIGITS\nlocale.AM_STR\nlocale.CHAR_MAX\nlocale.CODESET\nlocale.CRNCYSTR\nlocale.DAY_1\nlocale.DAY_2\nlocale.DAY_3\nlocale.DAY_4\nlocale.DAY_5\nlocale.DAY_6\nlocale.DAY_7\nlocale.D_FMT\nlocale.D_T_FMT\nlocale.ERA\nlocale.ERA_D_FMT\nlocale.ERA_D_T_FMT\nlocale.ERA_T_FMT\nlocale.Error\nlocale.LC_ALL\nlocale.LC_COLLATE\nlocale.LC_CTYPE\nlocale.LC_MESSAGES\nlocale.LC_MONETARY\nlocale.LC_NUMERIC\nlocale.LC_TIME\nlocale.MON_1\nlocale.MON_10\nlocale.MON_11\nlocale.MON_12\nlocale.MON_2\nlocale.MON_3\nlocale.MON_4\nlocale.MON_5\nlocale.MON_6\nlocale.MON_7\nlocale.MON_8\nlocale.MON_9\nlocale.NOEXPR\nlocale.PM_STR\nlocale.RADIXCHAR\nlocale.THOUSEP\nlocale.T_FMT\nlocale.T_FMT_AMPM\nlocale.YESEXPR\nlocale.atof(??)\nlocale.atoi(??)\nlocale.bind_textdomain_codeset(domain, codeset) -> string\nlocale.bindtextdomain(domain, dir) -> string\nlocale.currency(??)\nlocale.dcgettext(domain, msg, category) -> string\nlocale.dgettext(domain, msg) -> string\nlocale.encodings\nlocale.format(??)\nlocale.format_string(??)\nlocale.getdefaultlocale(??)\nlocale.getlocale(??)\nlocale.getpreferredencoding(??)\nlocale.gettext(msg) -> string\nlocale.locale_alias\nlocale.locale_encoding_alias\nlocale.localeconv\nlocale.nl_langinfo(key) -> string\nlocale.normalize(??)\nlocale.operator\nlocale.re\nlocale.resetlocale(??)\nlocale.setlocale(??)\nlocale.str(??)\nlocale.strcoll\nlocale.strxfrm\nlocale.sys\nlocale.textdomain(domain) -> string\nlocale.windows_locale\nlocals() -> dictionary\nlogging.BASIC_FORMAT\nlogging.BufferingFormatter(??)\nlogging.CRITICAL\nlogging.DEBUG\nlogging.ERROR\nlogging.FATAL\nlogging.FileHandler(??)\nlogging.Filter(??)\nlogging.Filterer(??)\nlogging.Formatter(??)\nlogging.Handler(??)\nlogging.INFO\nlogging.LogRecord(??)\nlogging.Logger(??)\nlogging.Manager(??)\nlogging.NOTSET\nlogging.PlaceHolder(??)\nlogging.RootLogger(??)\nlogging.StreamHandler(??)\nlogging.WARN\nlogging.WARNING\nlogging.addLevelName(??)\nlogging.atexit\nlogging.basicConfig(??)\nlogging.cStringIO\nlogging.codecs\nlogging.config\nlogging.config.DEFAULT_LOGGING_CONFIG_PORT\nlogging.config.RESET_ERROR\nlogging.config.StreamRequestHandler(??)\nlogging.config.ThreadingTCPServer(??)\nlogging.config.fileConfig(??)\nlogging.config.listen(??)\nlogging.config.logging\nlogging.config.os\nlogging.config.socket\nlogging.config.stopListening(??)\nlogging.config.string\nlogging.config.struct\nlogging.config.sys\nlogging.config.thread\nlogging.config.threading\nlogging.config.traceback\nlogging.config.types\nlogging.critical(??)\nlogging.currentframe(??)\nlogging.debug(??)\nlogging.disable(??)\nlogging.error(??)\nlogging.exception(??)\nlogging.fatal(??)\nlogging.getLevelName(??)\nlogging.getLogger(??)\nlogging.getLoggerClass(??)\nlogging.handlers\nlogging.handlers.BaseRotatingHandler(??)\nlogging.handlers.BufferingHandler(??)\nlogging.handlers.DEFAULT_HTTP_LOGGING_PORT\nlogging.handlers.DEFAULT_SOAP_LOGGING_PORT\nlogging.handlers.DEFAULT_TCP_LOGGING_PORT\nlogging.handlers.DEFAULT_UDP_LOGGING_PORT\nlogging.handlers.DatagramHandler(??)\nlogging.handlers.HTTPHandler(??)\nlogging.handlers.MemoryHandler(??)\nlogging.handlers.NTEventLogHandler(??)\nlogging.handlers.RotatingFileHandler(??)\nlogging.handlers.SMTPHandler(??)\nlogging.handlers.SYSLOG_UDP_PORT\nlogging.handlers.SocketHandler(??)\nlogging.handlers.SysLogHandler(??)\nlogging.handlers.TimedRotatingFileHandler(??)\nlogging.handlers.cPickle\nlogging.handlers.codecs\nlogging.handlers.glob\nlogging.handlers.logging\nlogging.handlers.os\nlogging.handlers.socket\nlogging.handlers.string\nlogging.handlers.struct\nlogging.handlers.sys\nlogging.handlers.time\nlogging.handlers.types\nlogging.info(??)\nlogging.log(??)\nlogging.logProcesses\nlogging.logThreads\nlogging.makeLogRecord(??)\nlogging.os\nlogging.raiseExceptions\nlogging.root\nlogging.setLoggerClass(??)\nlogging.shutdown(??)\nlogging.string\nlogging.sys\nlogging.thread\nlogging.threading\nlogging.time\nlogging.traceback\nlogging.types\nlogging.warn(??)\nlogging.warning(??)\nlong(x[, base]) -> integer\nmacpath.ST_ATIME\nmacpath.ST_CTIME\nmacpath.ST_DEV\nmacpath.ST_GID\nmacpath.ST_INO\nmacpath.ST_MODE\nmacpath.ST_MTIME\nmacpath.ST_NLINK\nmacpath.ST_SIZE\nmacpath.ST_UID\nmacpath.S_ENFMT\nmacpath.S_IEXEC\nmacpath.S_IFBLK\nmacpath.S_IFCHR\nmacpath.S_IFDIR\nmacpath.S_IFIFO\nmacpath.S_IFLNK\nmacpath.S_IFMT(??)\nmacpath.S_IFREG\nmacpath.S_IFSOCK\nmacpath.S_IMODE(??)\nmacpath.S_IREAD\nmacpath.S_IRGRP\nmacpath.S_IROTH\nmacpath.S_IRUSR\nmacpath.S_IRWXG\nmacpath.S_IRWXO\nmacpath.S_IRWXU\nmacpath.S_ISBLK(??)\nmacpath.S_ISCHR(??)\nmacpath.S_ISDIR(??)\nmacpath.S_ISFIFO(??)\nmacpath.S_ISGID\nmacpath.S_ISLNK(??)\nmacpath.S_ISREG(??)\nmacpath.S_ISSOCK(??)\nmacpath.S_ISUID\nmacpath.S_ISVTX\nmacpath.S_IWGRP\nmacpath.S_IWOTH\nmacpath.S_IWRITE\nmacpath.S_IWUSR\nmacpath.S_IXGRP\nmacpath.S_IXOTH\nmacpath.S_IXUSR\nmacpath.abspath(??)\nmacpath.altsep\nmacpath.basename(??)\nmacpath.commonprefix(??)\nmacpath.curdir\nmacpath.defpath\nmacpath.devnull\nmacpath.dirname(??)\nmacpath.exists(??)\nmacpath.expanduser(??)\nmacpath.expandvars(??)\nmacpath.extsep\nmacpath.getatime(??)\nmacpath.getctime(??)\nmacpath.getmtime(??)\nmacpath.getsize(??)\nmacpath.isabs(??)\nmacpath.isdir(??)\nmacpath.isfile(??)\nmacpath.islink(??)\nmacpath.ismount(??)\nmacpath.join(??)\nmacpath.lexists(??)\nmacpath.norm_error\nmacpath.normcase(??)\nmacpath.normpath(??)\nmacpath.os\nmacpath.pardir\nmacpath.pathsep\nmacpath.realpath(??)\nmacpath.sep\nmacpath.split(??)\nmacpath.splitdrive(??)\nmacpath.splitext(??)\nmacpath.supports_unicode_filenames\nmacpath.walk(??)\nmacurl2path.os\nmacurl2path.pathname2url(??)\nmacurl2path.test(??)\nmacurl2path.url2pathname(??)\nmacurl2path.urllib\nmailbox.Babyl(??)\nmailbox.BabylMailbox(??)\nmailbox.BabylMessage(??)\nmailbox.Error\nmailbox.ExternalClashError\nmailbox.FormatError\nmailbox.MH(??)\nmailbox.MHMailbox(??)\nmailbox.MHMessage(??)\nmailbox.MMDF(??)\nmailbox.MMDFMessage(??)\nmailbox.Mailbox(??)\nmailbox.Maildir(??)\nmailbox.MaildirMessage(??)\nmailbox.Message(??)\nmailbox.MmdfMailbox(??)\nmailbox.NoSuchMailboxError\nmailbox.NotEmptyError\nmailbox.PortableUnixMailbox(??)\nmailbox.StringIO\nmailbox.UnixMailbox(??)\nmailbox.calendar\nmailbox.copy\nmailbox.email\nmailbox.errno\nmailbox.fcntl\nmailbox.mbox(??)\nmailbox.mboxMessage(??)\nmailbox.os\nmailbox.rfc822\nmailbox.socket\nmailbox.sys\nmailbox.time\nmailcap.findmatch(??)\nmailcap.findparam(??)\nmailcap.getcaps(??)\nmailcap.listmailcapfiles(??)\nmailcap.lookup(??)\nmailcap.os\nmailcap.parsefield(??)\nmailcap.parseline(??)\nmailcap.readmailcapfile(??)\nmailcap.show(??)\nmailcap.subst(??)\nmailcap.test(??)\nmap(function, sequence[, sequence, ...]) -> list\nmarkupbase.ParserBase(??)\nmarshal.dump\nmarshal.dumps\nmarshal.load\nmarshal.loads\nmarshal.version\nmath.acos(x)\nmath.asin(x)\nmath.atan(x)\nmath.atan2(y, x)\nmath.ceil(x)\nmath.cos(x)\nmath.cosh(x)\nmath.degrees(x) -> converts angle x from radians to degrees\nmath.e\nmath.exp(x)\nmath.fabs(x)\nmath.floor(x)\nmath.fmod(x,y)\nmath.frexp(x)\nmath.hypot(x,y)\nmath.ldexp(x, i) -> x * (2**i)\nmath.log(x[, base]) -> the logarithm of x to the given base.\nmath.log10(x) -> the base 10 logarithm of x.\nmath.modf(x)\nmath.pi\nmath.pow(x,y)\nmath.radians(x) -> converts angle x from degrees to radians\nmath.sin(x)\nmath.sinh(x)\nmath.sqrt(x)\nmath.tan(x)\nmath.tanh(x)\nmax(iterable[, key=func]) -> value\nmd5.blocksize\nmd5.digest_size\nmd5.md5\nmd5.new\nmhlib.Error\nmhlib.FOLDER_PROTECT\nmhlib.Folder(??)\nmhlib.IntSet(??)\nmhlib.MH(??)\nmhlib.MH_PROFILE\nmhlib.MH_SEQUENCES\nmhlib.Message(??)\nmhlib.PATH\nmhlib.SubMessage(??)\nmhlib.bisect\nmhlib.isnumeric(??)\nmhlib.mimetools\nmhlib.multifile\nmhlib.numericprog\nmhlib.os\nmhlib.pickline(??)\nmhlib.re\nmhlib.shutil\nmhlib.sys\nmhlib.test(??)\nmhlib.updateline(??)\nmimetools.Message(??)\nmimetools.choose_boundary(??)\nmimetools.copybinary(??)\nmimetools.copyliteral(??)\nmimetools.decode(??)\nmimetools.decodetab\nmimetools.encode(??)\nmimetools.encodetab\nmimetools.os\nmimetools.pipethrough(??)\nmimetools.pipeto(??)\nmimetools.rfc822\nmimetools.tempfile\nmimetools.uudecode_pipe\nmimetypes.MimeTypes(??)\nmimetypes.add_type\nmimetypes.common_types\nmimetypes.encodings_map\nmimetypes.guess_all_extensions\nmimetypes.guess_extension\nmimetypes.guess_type\nmimetypes.init(??)\nmimetypes.inited\nmimetypes.knownfiles\nmimetypes.os\nmimetypes.posixpath\nmimetypes.read_mime_types(??)\nmimetypes.suffix_map\nmimetypes.types_map\nmimetypes.urllib\nmimify.CHARSET\nmimify.File(??)\nmimify.HeaderFile(??)\nmimify.MAXLEN\nmimify.QUOTE\nmimify.base64_re\nmimify.chrset\nmimify.cte\nmimify.he\nmimify.iso_char\nmimify.mime_char\nmimify.mime_code\nmimify.mime_decode(??)\nmimify.mime_decode_header(??)\nmimify.mime_encode(??)\nmimify.mime_encode_header(??)\nmimify.mime_head\nmimify.mime_header\nmimify.mime_header_char\nmimify.mimify(??)\nmimify.mimify_part(??)\nmimify.mp\nmimify.mv\nmimify.qp\nmimify.re\nmimify.repl\nmimify.sys\nmimify.unmimify(??)\nmimify.unmimify_part(??)\nmin(iterable[, key=func]) -> value\nmmap.ACCESS_COPY\nmmap.ACCESS_READ\nmmap.ACCESS_WRITE\nmmap.MAP_ANON\nmmap.MAP_ANONYMOUS\nmmap.MAP_DENYWRITE\nmmap.MAP_EXECUTABLE\nmmap.MAP_PRIVATE\nmmap.MAP_SHARED\nmmap.PAGESIZE\nmmap.PROT_EXEC\nmmap.PROT_READ\nmmap.PROT_WRITE\nmmap.error\nmmap.mmap\nmodulefinder.AddPackagePath(??)\nmodulefinder.IMPORT_NAME\nmodulefinder.LOAD_CONST\nmodulefinder.Module(??)\nmodulefinder.ModuleFinder(??)\nmodulefinder.READ_MODE\nmodulefinder.ReplacePackage(??)\nmodulefinder.STORE_GLOBAL\nmodulefinder.STORE_NAME\nmodulefinder.STORE_OPS\nmodulefinder.dis\nmodulefinder.imp\nmodulefinder.marshal\nmodulefinder.new\nmodulefinder.os\nmodulefinder.packagePathMap\nmodulefinder.replacePackageMap\nmodulefinder.sys\nmodulefinder.test(??)\nmultifile.Error\nmultifile.MultiFile(??)\nmutex.deque(iterable) --> deque object\nmutex.mutex(??)\nnetrc.NetrcParseError\nnetrc.netrc(??)\nnetrc.os\nnetrc.shlex\nnew.classobj(name, bases, dict)\nnew.code\nnew.function(code, globals[, name[, argdefs[, closure]]])\nnew.instance(class[, dict])\nnew.instancemethod(function, instance, class)\nnew.module(name[, doc])\nnis.cat(map, domain = defaultdomain)\nnis.error\nnis.get_default_domain() -> str\nnis.maps(domain = defaultdomain)\nnis.match(key, map, domain = defaultdomain)\nnntplib.CRLF\nnntplib.LONGRESP\nnntplib.NNTP(??)\nnntplib.NNTPDataError\nnntplib.NNTPError\nnntplib.NNTPPermanentError\nnntplib.NNTPProtocolError\nnntplib.NNTPReplyError\nnntplib.NNTPTemporaryError\nnntplib.NNTP_PORT\nnntplib.error_data\nnntplib.error_perm\nnntplib.error_proto\nnntplib.error_reply\nnntplib.error_temp\nnntplib.re\nnntplib.socket\nntpath.abspath(??)\nntpath.altsep\nntpath.basename(??)\nntpath.commonprefix(??)\nntpath.curdir\nntpath.defpath\nntpath.devnull\nntpath.dirname(??)\nntpath.exists(??)\nntpath.expanduser(??)\nntpath.expandvars(??)\nntpath.extsep\nntpath.getatime(??)\nntpath.getctime(??)\nntpath.getmtime(??)\nntpath.getsize(??)\nntpath.isabs(??)\nntpath.isdir(??)\nntpath.isfile(??)\nntpath.islink(??)\nntpath.ismount(??)\nntpath.join(??)\nntpath.lexists(??)\nntpath.normcase(??)\nntpath.normpath(??)\nntpath.os\nntpath.pardir\nntpath.pathsep\nntpath.realpath(??)\nntpath.sep\nntpath.split(??)\nntpath.splitdrive(??)\nntpath.splitext(??)\nntpath.splitunc(??)\nntpath.stat\nntpath.supports_unicode_filenames\nntpath.sys\nntpath.walk(??)\nnturl2path.pathname2url(??)\nnturl2path.url2pathname(??)\nobject\noct(number) -> string\nopcode.EXTENDED_ARG\nopcode.HAVE_ARGUMENT\nopcode.cmp_op\nopcode.hascompare\nopcode.hasconst\nopcode.hasfree\nopcode.hasjabs\nopcode.hasjrel\nopcode.haslocal\nopcode.hasname\nopcode.opmap\nopcode.opname\nopen(name[, mode[, buffering]]) -> file object\noperator.abs(a) -- Same as abs(a).\noperator.add(a, b) -- Same as a + b.\noperator.and_(a, b) -- Same as a & b.\noperator.attrgetter(attr, ...) --> attrgetter object\noperator.concat(a, b) -- Same as a + b, for a and b sequences.\noperator.contains(a, b) -- Same as b in a (note reversed operands).\noperator.countOf(a, b) -- Return the number of times b occurs in a.\noperator.delitem(a, b) -- Same as del a[b].\noperator.delslice(a, b, c) -- Same as del a[b:c].\noperator.div(a, b) -- Same as a / b when __future__.division is not in effect.\noperator.eq(a, b) -- Same as a==b.\noperator.floordiv(a, b) -- Same as a // b.\noperator.ge(a, b) -- Same as a>=b.\noperator.getitem(a, b) -- Same as a[b].\noperator.getslice(a, b, c) -- Same as a[b:c].\noperator.gt(a, b) -- Same as a>b.\noperator.iadd(a, b) -- Same as a += b.\noperator.iand(a, b) -- Same as a &= b.\noperator.iconcat(a, b) -- Same as a += b, for a and b sequences.\noperator.idiv(a, b) -- Same as a /= b when __future__.division is not in effect.\noperator.ifloordiv(a, b) -- Same as a //= b.\noperator.ilshift(a, b) -- Same as a <<= b.\noperator.imod(a, b) -- Same as a %= b.\noperator.imul(a, b) -- Same as a *= b.\noperator.index(a) -- Same as a.__index__()\noperator.indexOf(a, b) -- Return the first index of b in a.\noperator.inv(a) -- Same as ~a.\noperator.invert(a) -- Same as ~a.\noperator.ior(a, b) -- Same as a |= b.\noperator.ipow(a, b) -- Same as a **= b.\noperator.irepeat(a, b) -- Same as a *= b, where a is a sequence, and b is an integer.\noperator.irshift(a, b) -- Same as a >>= b.\noperator.isCallable(a) -- Same as callable(a).\noperator.isMappingType(a) -- Return True if a has a mapping type, False otherwise.\noperator.isNumberType(a) -- Return True if a has a numeric type, False otherwise.\noperator.isSequenceType(a) -- Return True if a has a sequence type, False otherwise.\noperator.is_(a, b) -- Same as a is b.\noperator.is_not(a, b) -- Same as a is not b.\noperator.isub(a, b) -- Same as a -= b.\noperator.itemgetter(item, ...) --> itemgetter object\noperator.itruediv(a, b) -- Same as a /= b when __future__.division is in effect.\noperator.ixor(a, b) -- Same as a ^= b.\noperator.le(a, b) -- Same as a<=b.\noperator.lshift(a, b) -- Same as a << b.\noperator.lt(a, b) -- Same as a<b.\noperator.mod(a, b) -- Same as a % b.\noperator.mul(a, b) -- Same as a * b.\noperator.ne(a, b) -- Same as a!=b.\noperator.neg(a) -- Same as -a.\noperator.not_(a) -- Same as not a.\noperator.or_(a, b) -- Same as a | b.\noperator.pos(a) -- Same as +a.\noperator.pow(a, b) -- Same as a ** b.\noperator.repeat(a, b) -- Return a * b, where a is a sequence, and b is an integer.\noperator.rshift(a, b) -- Same as a >> b.\noperator.sequenceIncludes(a, b) -- Same as b in a (note reversed operands; deprecated).\noperator.setitem(a, b, c) -- Same as a[b] = c.\noperator.setslice(a, b, c, d) -- Same as a[b:c] = d.\noperator.sub(a, b) -- Same as a - b.\noperator.truediv(a, b) -- Same as a / b when __future__.division is in effect.\noperator.truth(a) -- Return True if a is true, False otherwise.\noperator.xor(a, b) -- Same as a ^ b.\noptparse.AmbiguousOptionError\noptparse.BadOptionError\noptparse.HelpFormatter(??)\noptparse.IndentedHelpFormatter(??)\noptparse.NO_DEFAULT\noptparse.OptParseError\noptparse.Option(??)\noptparse.OptionConflictError\noptparse.OptionContainer(??)\noptparse.OptionError\noptparse.OptionGroup(??)\noptparse.OptionParser(??)\noptparse.OptionValueError\noptparse.SUPPRESS_HELP\noptparse.SUPPRESS_USAGE\noptparse.TitledHelpFormatter(??)\noptparse.Values(??)\noptparse.check_builtin(??)\noptparse.check_choice(??)\noptparse.gettext(??)\noptparse.isbasestring(??)\noptparse.make_option(??)\noptparse.os\noptparse.sys\noptparse.textwrap\noptparse.types\nord(c) -> integer\nos.EX_CANTCREAT\nos.EX_CONFIG\nos.EX_DATAERR\nos.EX_IOERR\nos.EX_NOHOST\nos.EX_NOINPUT\nos.EX_NOPERM\nos.EX_NOUSER\nos.EX_OK\nos.EX_OSERR\nos.EX_OSFILE\nos.EX_PROTOCOL\nos.EX_SOFTWARE\nos.EX_TEMPFAIL\nos.EX_UNAVAILABLE\nos.EX_USAGE\nos.F_OK\nos.NGROUPS_MAX\nos.O_APPEND\nos.O_CREAT\nos.O_DIRECT\nos.O_DIRECTORY\nos.O_DSYNC\nos.O_EXCL\nos.O_LARGEFILE\nos.O_NDELAY\nos.O_NOCTTY\nos.O_NOFOLLOW\nos.O_NONBLOCK\nos.O_RDONLY\nos.O_RDWR\nos.O_RSYNC\nos.O_SYNC\nos.O_TRUNC\nos.O_WRONLY\nos.P_NOWAIT\nos.P_NOWAITO\nos.P_WAIT\nos.R_OK\nos.SEEK_CUR\nos.SEEK_END\nos.SEEK_SET\nos.TMP_MAX\nos.UserDict\nos.WCONTINUED\nos.WCOREDUMP(status) -> bool\nos.WEXITSTATUS(status) -> integer\nos.WIFCONTINUED(status) -> bool\nos.WIFEXITED(status) -> bool\nos.WIFSIGNALED(status) -> bool\nos.WIFSTOPPED(status) -> bool\nos.WNOHANG\nos.WSTOPSIG(status) -> integer\nos.WTERMSIG(status) -> integer\nos.WUNTRACED\nos.W_OK\nos.X_OK\nos.abort() -> does not return!\nos.access(path, mode) -> True if granted, False otherwise\nos.altsep\nos.chdir(path)\nos.chmod(path, mode)\nos.chown(path, uid, gid)\nos.chroot(path)\nos.close(fd)\nos.confstr(name) -> string\nos.confstr_names\nos.ctermid() -> string\nos.curdir\nos.defpath\nos.devnull\nos.dup(fd) -> fd2\nos.dup2(old_fd, new_fd)\nos.environ\nos.error\nos.execl(file, *args)\nos.execle(file, *args, env)\nos.execlp(file, *args)\nos.execlpe(file, *args, env)\nos.execv(path, args)\nos.execve(path, args, env)\nos.execvp(??)\nos.execvpe(file, args, env)\nos.extsep\nos.fchdir(fildes)\nos.fdatasync(fildes)\nos.fdopen(fd [, mode='r' [, bufsize]]) -> file_object\nos.fork() -> pid\nos.forkpty() -> (pid, master_fd)\nos.fpathconf(fd, name) -> integer\nos.fstat(fd) -> stat result\nos.fstatvfs(fd) -> statvfs result\nos.fsync(fildes)\nos.ftruncate(fd, length)\nos.getcwd() -> path\nos.getcwdu() -> path\nos.getegid() -> egid\nos.getenv(??)\nos.geteuid() -> euid\nos.getgid() -> gid\nos.getgroups() -> list of group IDs\nos.getloadavg() -> (float, float, float)\nos.getlogin() -> string\nos.getpgid(pid) -> pgid\nos.getpgrp() -> pgrp\nos.getpid() -> pid\nos.getppid() -> ppid\nos.getsid(pid) -> sid\nos.getuid() -> uid\nos.isatty(fd) -> bool\nos.kill(pid, sig)\nos.killpg(pgid, sig)\nos.lchown(path, uid, gid)\nos.linesep\nos.link(src, dst)\nos.listdir(path) -> list_of_strings\nos.lseek(fd, pos, how) -> newpos\nos.lstat(path) -> stat result\nos.major(device) -> major number\nos.makedev(major, minor) -> device number\nos.makedirs(path [, mode=0777])\nos.minor(device) -> minor number\nos.mkdir(path [, mode=0777])\nos.mkfifo(filename [, mode=0666])\nos.mknod(filename [, mode=0600, device])\nos.name\nos.nice(inc) -> new_priority\nos.open(filename, flag [, mode=0777]) -> fd\nos.openpty() -> (master_fd, slave_fd)\nos.pardir\nos.path\nos.pathconf(path, name) -> integer\nos.pathconf_names\nos.pathsep\nos.pipe() -> (read_end, write_end)\nos.popen(command [, mode='r' [, bufsize]]) -> pipe\nos.popen2(??)\nos.popen3(??)\nos.popen4(??)\nos.putenv(key, value)\nos.read(fd, buffersize) -> string\nos.readlink(path) -> path\nos.remove(path)\nos.removedirs(path)\nos.rename(old, new)\nos.renames(old, new)\nos.rmdir(path)\nos.sep\nos.setegid(gid)\nos.seteuid(uid)\nos.setgid(gid)\nos.setgroups(list)\nos.setpgid(pid, pgrp)\nos.setpgrp()\nos.setregid(rgid, egid)\nos.setreuid(ruid, euid)\nos.setsid()\nos.setuid(uid)\nos.spawnl(mode, file, *args) -> integer\nos.spawnle(mode, file, *args, env) -> integer\nos.spawnlp(mode, file, *args) -> integer\nos.spawnlpe(mode, file, *args, env) -> integer\nos.spawnv(mode, file, args) -> integer\nos.spawnve(mode, file, args, env) -> integer\nos.spawnvp(mode, file, args) -> integer\nos.spawnvpe(mode, file, args, env) -> integer\nos.stat(path) -> stat result\nos.stat_float_times([newval]) -> oldval\nos.stat_result\nos.statvfs(path) -> statvfs result\nos.statvfs_result\nos.strerror(code) -> string\nos.symlink(src, dst)\nos.sys\nos.sysconf(name) -> integer\nos.sysconf_names\nos.system(command) -> exit_status\nos.tcgetpgrp(fd) -> pgid\nos.tcsetpgrp(fd, pgid)\nos.tempnam([dir[, prefix]]) -> string\nos.times() -> (utime, stime, cutime, cstime, elapsed_time)\nos.tmpfile() -> file object\nos.tmpnam() -> string\nos.ttyname(fd) -> string\nos.umask(new_mask) -> old_mask\nos.uname() -> (sysname, nodename, release, version, machine)\nos.unlink(path)\nos.unsetenv(key)\nos.urandom(n) -> str\nos.utime(path, (atime, mtime))\nos.wait() -> (pid, status)\nos.wait3(options) -> (pid, status, rusage)\nos.wait4(pid, options) -> (pid, status, rusage)\nos.waitpid(pid, options) -> (pid, status)\nos.walk(??)\nos.write(fd, string) -> byteswritten\nos2emxpath.abspath(??)\nos2emxpath.altsep\nos2emxpath.basename(??)\nos2emxpath.commonprefix(??)\nos2emxpath.curdir\nos2emxpath.defpath\nos2emxpath.devnull\nos2emxpath.dirname(??)\nos2emxpath.exists(??)\nos2emxpath.expanduser(??)\nos2emxpath.expandvars(??)\nos2emxpath.extsep\nos2emxpath.getatime(??)\nos2emxpath.getctime(??)\nos2emxpath.getmtime(??)\nos2emxpath.getsize(??)\nos2emxpath.isabs(??)\nos2emxpath.isdir(??)\nos2emxpath.isfile(??)\nos2emxpath.islink(??)\nos2emxpath.ismount(??)\nos2emxpath.join(??)\nos2emxpath.lexists(??)\nos2emxpath.normcase(??)\nos2emxpath.normpath(??)\nos2emxpath.os\nos2emxpath.pardir\nos2emxpath.pathsep\nos2emxpath.realpath(??)\nos2emxpath.sep\nos2emxpath.split(??)\nos2emxpath.splitdrive(??)\nos2emxpath.splitext(??)\nos2emxpath.splitunc(??)\nos2emxpath.stat\nos2emxpath.supports_unicode_filenames\nos2emxpath.walk(??)\nossaudiodev.AFMT_AC3\nossaudiodev.AFMT_A_LAW\nossaudiodev.AFMT_IMA_ADPCM\nossaudiodev.AFMT_MPEG\nossaudiodev.AFMT_MU_LAW\nossaudiodev.AFMT_QUERY\nossaudiodev.AFMT_S16_BE\nossaudiodev.AFMT_S16_LE\nossaudiodev.AFMT_S16_NE\nossaudiodev.AFMT_S8\nossaudiodev.AFMT_U16_BE\nossaudiodev.AFMT_U16_LE\nossaudiodev.AFMT_U8\nossaudiodev.OSSAudioError\nossaudiodev.SNDCTL_COPR_HALT\nossaudiodev.SNDCTL_COPR_LOAD\nossaudiodev.SNDCTL_COPR_RCODE\nossaudiodev.SNDCTL_COPR_RCVMSG\nossaudiodev.SNDCTL_COPR_RDATA\nossaudiodev.SNDCTL_COPR_RESET\nossaudiodev.SNDCTL_COPR_RUN\nossaudiodev.SNDCTL_COPR_SENDMSG\nossaudiodev.SNDCTL_COPR_WCODE\nossaudiodev.SNDCTL_COPR_WDATA\nossaudiodev.SNDCTL_DSP_BIND_CHANNEL\nossaudiodev.SNDCTL_DSP_CHANNELS\nossaudiodev.SNDCTL_DSP_GETBLKSIZE\nossaudiodev.SNDCTL_DSP_GETCAPS\nossaudiodev.SNDCTL_DSP_GETCHANNELMASK\nossaudiodev.SNDCTL_DSP_GETFMTS\nossaudiodev.SNDCTL_DSP_GETIPTR\nossaudiodev.SNDCTL_DSP_GETISPACE\nossaudiodev.SNDCTL_DSP_GETODELAY\nossaudiodev.SNDCTL_DSP_GETOPTR\nossaudiodev.SNDCTL_DSP_GETOSPACE\nossaudiodev.SNDCTL_DSP_GETSPDIF\nossaudiodev.SNDCTL_DSP_GETTRIGGER\nossaudiodev.SNDCTL_DSP_MAPINBUF\nossaudiodev.SNDCTL_DSP_MAPOUTBUF\nossaudiodev.SNDCTL_DSP_NONBLOCK\nossaudiodev.SNDCTL_DSP_POST\nossaudiodev.SNDCTL_DSP_PROFILE\nossaudiodev.SNDCTL_DSP_RESET\nossaudiodev.SNDCTL_DSP_SAMPLESIZE\nossaudiodev.SNDCTL_DSP_SETDUPLEX\nossaudiodev.SNDCTL_DSP_SETFMT\nossaudiodev.SNDCTL_DSP_SETFRAGMENT\nossaudiodev.SNDCTL_DSP_SETSPDIF\nossaudiodev.SNDCTL_DSP_SETSYNCRO\nossaudiodev.SNDCTL_DSP_SETTRIGGER\nossaudiodev.SNDCTL_DSP_SPEED\nossaudiodev.SNDCTL_DSP_STEREO\nossaudiodev.SNDCTL_DSP_SUBDIVIDE\nossaudiodev.SNDCTL_DSP_SYNC\nossaudiodev.SNDCTL_FM_4OP_ENABLE\nossaudiodev.SNDCTL_FM_LOAD_INSTR\nossaudiodev.SNDCTL_MIDI_INFO\nossaudiodev.SNDCTL_MIDI_MPUCMD\nossaudiodev.SNDCTL_MIDI_MPUMODE\nossaudiodev.SNDCTL_MIDI_PRETIME\nossaudiodev.SNDCTL_SEQ_CTRLRATE\nossaudiodev.SNDCTL_SEQ_GETINCOUNT\nossaudiodev.SNDCTL_SEQ_GETOUTCOUNT\nossaudiodev.SNDCTL_SEQ_GETTIME\nossaudiodev.SNDCTL_SEQ_NRMIDIS\nossaudiodev.SNDCTL_SEQ_NRSYNTHS\nossaudiodev.SNDCTL_SEQ_OUTOFBAND\nossaudiodev.SNDCTL_SEQ_PANIC\nossaudiodev.SNDCTL_SEQ_PERCMODE\nossaudiodev.SNDCTL_SEQ_RESET\nossaudiodev.SNDCTL_SEQ_RESETSAMPLES\nossaudiodev.SNDCTL_SEQ_SYNC\nossaudiodev.SNDCTL_SEQ_TESTMIDI\nossaudiodev.SNDCTL_SEQ_THRESHOLD\nossaudiodev.SNDCTL_SYNTH_CONTROL\nossaudiodev.SNDCTL_SYNTH_ID\nossaudiodev.SNDCTL_SYNTH_INFO\nossaudiodev.SNDCTL_SYNTH_MEMAVL\nossaudiodev.SNDCTL_SYNTH_REMOVESAMPLE\nossaudiodev.SNDCTL_TMR_CONTINUE\nossaudiodev.SNDCTL_TMR_METRONOME\nossaudiodev.SNDCTL_TMR_SELECT\nossaudiodev.SNDCTL_TMR_SOURCE\nossaudiodev.SNDCTL_TMR_START\nossaudiodev.SNDCTL_TMR_STOP\nossaudiodev.SNDCTL_TMR_TEMPO\nossaudiodev.SNDCTL_TMR_TIMEBASE\nossaudiodev.SOUND_MIXER_ALTPCM\nossaudiodev.SOUND_MIXER_BASS\nossaudiodev.SOUND_MIXER_CD\nossaudiodev.SOUND_MIXER_DIGITAL1\nossaudiodev.SOUND_MIXER_DIGITAL2\nossaudiodev.SOUND_MIXER_DIGITAL3\nossaudiodev.SOUND_MIXER_IGAIN\nossaudiodev.SOUND_MIXER_IMIX\nossaudiodev.SOUND_MIXER_LINE\nossaudiodev.SOUND_MIXER_LINE1\nossaudiodev.SOUND_MIXER_LINE2\nossaudiodev.SOUND_MIXER_LINE3\nossaudiodev.SOUND_MIXER_MIC\nossaudiodev.SOUND_MIXER_MONITOR\nossaudiodev.SOUND_MIXER_NRDEVICES\nossaudiodev.SOUND_MIXER_OGAIN\nossaudiodev.SOUND_MIXER_PCM\nossaudiodev.SOUND_MIXER_PHONEIN\nossaudiodev.SOUND_MIXER_PHONEOUT\nossaudiodev.SOUND_MIXER_RADIO\nossaudiodev.SOUND_MIXER_RECLEV\nossaudiodev.SOUND_MIXER_SPEAKER\nossaudiodev.SOUND_MIXER_SYNTH\nossaudiodev.SOUND_MIXER_TREBLE\nossaudiodev.SOUND_MIXER_VIDEO\nossaudiodev.SOUND_MIXER_VOLUME\nossaudiodev.control_labels\nossaudiodev.control_names\nossaudiodev.error\nossaudiodev.open\nossaudiodev.openmixer\nparser.ASTType\nparser.ParserError\nparser.STType\nparser.ast2list\nparser.ast2tuple\nparser.compileast\nparser.compilest\nparser.expr\nparser.isexpr\nparser.issuite\nparser.sequence2ast\nparser.sequence2st\nparser.st2list\nparser.st2tuple\nparser.suite\nparser.tuple2ast\nparser.tuple2st\npdb.Pdb(??)\npdb.Repr(??)\npdb.TESTCMD\npdb.bdb\npdb.cmd\npdb.find_function(??)\npdb.help(??)\npdb.line_prefix\npdb.linecache\npdb.main(??)\npdb.os\npdb.pm(??)\npdb.post_mortem(??)\npdb.pprint\npdb.re\npdb.run(??)\npdb.runcall(??)\npdb.runctx(??)\npdb.runeval(??)\npdb.set_trace(??)\npdb.sys\npdb.test(??)\npdb.traceback\npickle.APPEND\npickle.APPENDS\npickle.BINFLOAT\npickle.BINGET\npickle.BININT\npickle.BININT1\npickle.BININT2\npickle.BINPERSID\npickle.BINPUT\npickle.BINSTRING\npickle.BINUNICODE\npickle.BUILD\npickle.BooleanType\npickle.BufferType\npickle.BuiltinFunctionType\npickle.BuiltinMethodType\npickle.ClassType\npickle.CodeType\npickle.ComplexType\npickle.DICT\npickle.DUP\npickle.DictProxyType\npickle.DictType\npickle.DictionaryType\npickle.EMPTY_DICT\npickle.EMPTY_LIST\npickle.EMPTY_TUPLE\npickle.EXT1\npickle.EXT2\npickle.EXT4\npickle.EllipsisType\npickle.FALSE\npickle.FLOAT\npickle.FileType\npickle.FloatType\npickle.FrameType\npickle.FunctionType\npickle.GET\npickle.GLOBAL\npickle.GeneratorType\npickle.GetSetDescriptorType\npickle.HIGHEST_PROTOCOL\npickle.INST\npickle.INT\npickle.InstanceType\npickle.IntType\npickle.LIST\npickle.LONG\npickle.LONG1\npickle.LONG4\npickle.LONG_BINGET\npickle.LONG_BINPUT\npickle.LambdaType\npickle.ListType\npickle.LongType\npickle.MARK\npickle.MemberDescriptorType\npickle.MethodType\npickle.ModuleType\npickle.NEWFALSE\npickle.NEWOBJ\npickle.NEWTRUE\npickle.NONE\npickle.NoneType\npickle.NotImplementedType\npickle.OBJ\npickle.ObjectType\npickle.PERSID\npickle.POP\npickle.POP_MARK\npickle.PROTO\npickle.PUT\npickle.PickleError\npickle.Pickler(??)\npickle.PicklingError\npickle.PyStringMap\npickle.REDUCE\npickle.SETITEM\npickle.SETITEMS\npickle.SHORT_BINSTRING\npickle.STOP\npickle.STRING\npickle.SliceType\npickle.StringIO([s]) -- Return a StringIO-like stream for reading or writing\npickle.StringType\npickle.StringTypes\npickle.TRUE\npickle.TUPLE\npickle.TUPLE1\npickle.TUPLE2\npickle.TUPLE3\npickle.TracebackType\npickle.TupleType\npickle.TypeType\npickle.UNICODE\npickle.UnboundMethodType\npickle.UnicodeType\npickle.Unpickler(??)\npickle.UnpicklingError\npickle.XRangeType\npickle.classmap\npickle.compatible_formats\npickle.decode_long(??)\npickle.dispatch_table\npickle.dump(??)\npickle.dumps(??)\npickle.encode_long(??)\npickle.format_version\npickle.load(??)\npickle.loads(??)\npickle.marshal\npickle.mloads\npickle.re\npickle.struct\npickle.sys\npickle.whichmodule(??)\npickletools.ArgumentDescriptor\npickletools.OpcodeInfo\npickletools.StackObject\npickletools.TAKEN_FROM_ARGUMENT1\npickletools.TAKEN_FROM_ARGUMENT4\npickletools.UP_TO_NEWLINE\npickletools.anyobject\npickletools.code2op\npickletools.decimalnl_long\npickletools.decimalnl_short\npickletools.decode_long(??)\npickletools.dis(??)\npickletools.float8\npickletools.floatnl\npickletools.genops(??)\npickletools.int4\npickletools.long1\npickletools.long4\npickletools.markobject\npickletools.opcodes\npickletools.pybool\npickletools.pydict\npickletools.pyfloat\npickletools.pyint\npickletools.pyinteger_or_bool\npickletools.pylist\npickletools.pylong\npickletools.pynone\npickletools.pystring\npickletools.pytuple\npickletools.pyunicode\npickletools.read_decimalnl_long(??)\npickletools.read_decimalnl_short(??)\npickletools.read_float8(??)\npickletools.read_floatnl(??)\npickletools.read_int4(??)\npickletools.read_long1(??)\npickletools.read_long4(??)\npickletools.read_string1(??)\npickletools.read_string4(??)\npickletools.read_stringnl(??)\npickletools.read_stringnl_noescape(??)\npickletools.read_stringnl_noescape_pair(??)\npickletools.read_uint1(??)\npickletools.read_uint2(??)\npickletools.read_unicodestring4(??)\npickletools.read_unicodestringnl(??)\npickletools.stackslice\npickletools.string1\npickletools.string4\npickletools.stringnl\npickletools.stringnl_noescape\npickletools.stringnl_noescape_pair\npickletools.uint1\npickletools.uint2\npickletools.unicodestring4\npickletools.unicodestringnl\npipes.FILEIN_FILEOUT\npipes.FILEIN_STDOUT\npipes.SINK\npipes.SOURCE\npipes.STDIN_FILEOUT\npipes.STDIN_STDOUT\npipes.Template(??)\npipes.makepipeline(??)\npipes.os\npipes.quote(??)\npipes.re\npipes.stepkinds\npipes.string\npipes.tempfile\npipes.test(??)\npkgutil.ImpImporter(??)\npkgutil.ImpLoader(??)\npkgutil.ModuleType\npkgutil.extend_path(??)\npkgutil.find_loader(??)\npkgutil.get_importer(??)\npkgutil.get_loader(??)\npkgutil.imp\npkgutil.iter_importer_modules(??)\npkgutil.iter_importers(??)\npkgutil.iter_modules(??)\npkgutil.iter_zipimport_modules(??)\npkgutil.os\npkgutil.read_code(??)\npkgutil.simplegeneric(??)\npkgutil.sys\npkgutil.walk_packages(??)\npkgutil.zipimport\npkgutil.zipimporter(archivepath) -> zipimporter object\nplatform.architecture(??)\nplatform.dist(??)\nplatform.java_ver(??)\nplatform.libc_ver(??)\nplatform.mac_ver(??)\nplatform.machine(??)\nplatform.node(??)\nplatform.os\nplatform.platform(??)\nplatform.popen(??)\nplatform.processor(??)\nplatform.python_build(??)\nplatform.python_compiler(??)\nplatform.python_version(??)\nplatform.python_version_tuple(??)\nplatform.re\nplatform.release(??)\nplatform.string\nplatform.sys\nplatform.system(??)\nplatform.system_alias(??)\nplatform.uname(??)\nplatform.version(??)\nplatform.win32_ver(??)\npopen2.MAXFD\npopen2.Popen3(??)\npopen2.Popen4(??)\npopen2.os\npopen2.popen2(??)\npopen2.popen3(??)\npopen2.popen4(??)\npopen2.sys\npoplib.CR\npoplib.CRLF\npoplib.LF\npoplib.POP3(??)\npoplib.POP3_PORT\npoplib.POP3_SSL(??)\npoplib.POP3_SSL_PORT\npoplib.error_proto\npoplib.re\npoplib.socket\nposix.EX_CANTCREAT\nposix.EX_CONFIG\nposix.EX_DATAERR\nposix.EX_IOERR\nposix.EX_NOHOST\nposix.EX_NOINPUT\nposix.EX_NOPERM\nposix.EX_NOUSER\nposix.EX_OK\nposix.EX_OSERR\nposix.EX_OSFILE\nposix.EX_PROTOCOL\nposix.EX_SOFTWARE\nposix.EX_TEMPFAIL\nposix.EX_UNAVAILABLE\nposix.EX_USAGE\nposix.F_OK\nposix.NGROUPS_MAX\nposix.O_APPEND\nposix.O_CREAT\nposix.O_DIRECT\nposix.O_DIRECTORY\nposix.O_DSYNC\nposix.O_EXCL\nposix.O_LARGEFILE\nposix.O_NDELAY\nposix.O_NOCTTY\nposix.O_NOFOLLOW\nposix.O_NONBLOCK\nposix.O_RDONLY\nposix.O_RDWR\nposix.O_RSYNC\nposix.O_SYNC\nposix.O_TRUNC\nposix.O_WRONLY\nposix.R_OK\nposix.TMP_MAX\nposix.WCONTINUED\nposix.WCOREDUMP(status) -> bool\nposix.WEXITSTATUS(status) -> integer\nposix.WIFCONTINUED(status) -> bool\nposix.WIFEXITED(status) -> bool\nposix.WIFSIGNALED(status) -> bool\nposix.WIFSTOPPED(status) -> bool\nposix.WNOHANG\nposix.WSTOPSIG(status) -> integer\nposix.WTERMSIG(status) -> integer\nposix.WUNTRACED\nposix.W_OK\nposix.X_OK\nposix.abort() -> does not return!\nposix.access(path, mode) -> True if granted, False otherwise\nposix.chdir(path)\nposix.chmod(path, mode)\nposix.chown(path, uid, gid)\nposix.chroot(path)\nposix.close(fd)\nposix.confstr(name) -> string\nposix.confstr_names\nposix.ctermid() -> string\nposix.dup(fd) -> fd2\nposix.dup2(old_fd, new_fd)\nposix.environ\nposix.error\nposix.execv(path, args)\nposix.execve(path, args, env)\nposix.fchdir(fildes)\nposix.fdatasync(fildes)\nposix.fdopen(fd [, mode='r' [, bufsize]]) -> file_object\nposix.fork() -> pid\nposix.forkpty() -> (pid, master_fd)\nposix.fpathconf(fd, name) -> integer\nposix.fstat(fd) -> stat result\nposix.fstatvfs(fd) -> statvfs result\nposix.fsync(fildes)\nposix.ftruncate(fd, length)\nposix.getcwd() -> path\nposix.getcwdu() -> path\nposix.getegid() -> egid\nposix.geteuid() -> euid\nposix.getgid() -> gid\nposix.getgroups() -> list of group IDs\nposix.getloadavg() -> (float, float, float)\nposix.getlogin() -> string\nposix.getpgid(pid) -> pgid\nposix.getpgrp() -> pgrp\nposix.getpid() -> pid\nposix.getppid() -> ppid\nposix.getsid(pid) -> sid\nposix.getuid() -> uid\nposix.isatty(fd) -> bool\nposix.kill(pid, sig)\nposix.killpg(pgid, sig)\nposix.lchown(path, uid, gid)\nposix.link(src, dst)\nposix.listdir(path) -> list_of_strings\nposix.lseek(fd, pos, how) -> newpos\nposix.lstat(path) -> stat result\nposix.major(device) -> major number\nposix.makedev(major, minor) -> device number\nposix.minor(device) -> minor number\nposix.mkdir(path [, mode=0777])\nposix.mkfifo(filename [, mode=0666])\nposix.mknod(filename [, mode=0600, device])\nposix.nice(inc) -> new_priority\nposix.open(filename, flag [, mode=0777]) -> fd\nposix.openpty() -> (master_fd, slave_fd)\nposix.pathconf(path, name) -> integer\nposix.pathconf_names\nposix.pipe() -> (read_end, write_end)\nposix.popen(command [, mode='r' [, bufsize]]) -> pipe\nposix.putenv(key, value)\nposix.read(fd, buffersize) -> string\nposix.readlink(path) -> path\nposix.remove(path)\nposix.rename(old, new)\nposix.rmdir(path)\nposix.setegid(gid)\nposix.seteuid(uid)\nposix.setgid(gid)\nposix.setgroups(list)\nposix.setpgid(pid, pgrp)\nposix.setpgrp()\nposix.setregid(rgid, egid)\nposix.setreuid(ruid, euid)\nposix.setsid()\nposix.setuid(uid)\nposix.stat(path) -> stat result\nposix.stat_float_times([newval]) -> oldval\nposix.stat_result\nposix.statvfs(path) -> statvfs result\nposix.statvfs_result\nposix.strerror(code) -> string\nposix.symlink(src, dst)\nposix.sysconf(name) -> integer\nposix.sysconf_names\nposix.system(command) -> exit_status\nposix.tcgetpgrp(fd) -> pgid\nposix.tcsetpgrp(fd, pgid)\nposix.tempnam([dir[, prefix]]) -> string\nposix.times() -> (utime, stime, cutime, cstime, elapsed_time)\nposix.tmpfile() -> file object\nposix.tmpnam() -> string\nposix.ttyname(fd) -> string\nposix.umask(new_mask) -> old_mask\nposix.uname() -> (sysname, nodename, release, version, machine)\nposix.unlink(path)\nposix.unsetenv(key)\nposix.utime(path, (atime, mtime))\nposix.wait() -> (pid, status)\nposix.wait3(options) -> (pid, status, rusage)\nposix.wait4(pid, options) -> (pid, status, rusage)\nposix.waitpid(pid, options) -> (pid, status)\nposix.write(fd, string) -> byteswritten\nposixfile.SEEK_CUR\nposixfile.SEEK_END\nposixfile.SEEK_SET\nposixfile.fileopen(??)\nposixfile.open(??)\nposixpath.abspath(??)\nposixpath.altsep\nposixpath.basename(??)\nposixpath.commonprefix(??)\nposixpath.curdir\nposixpath.defpath\nposixpath.devnull\nposixpath.dirname(??)\nposixpath.exists(??)\nposixpath.expanduser(??)\nposixpath.expandvars(??)\nposixpath.extsep\nposixpath.getatime(??)\nposixpath.getctime(??)\nposixpath.getmtime(??)\nposixpath.getsize(??)\nposixpath.isabs(??)\nposixpath.isdir(??)\nposixpath.isfile(??)\nposixpath.islink(??)\nposixpath.ismount(??)\nposixpath.join(??)\nposixpath.lexists(??)\nposixpath.normcase(??)\nposixpath.normpath(??)\nposixpath.os\nposixpath.pardir\nposixpath.pathsep\nposixpath.realpath(??)\nposixpath.samefile(??)\nposixpath.sameopenfile(??)\nposixpath.samestat(??)\nposixpath.sep\nposixpath.split(??)\nposixpath.splitdrive(??)\nposixpath.splitext(??)\nposixpath.stat\nposixpath.supports_unicode_filenames\nposixpath.walk(??)\npow(x, y[, z]) -> number\npprint.PrettyPrinter(??)\npprint.isreadable(??)\npprint.isrecursive(??)\npprint.pformat(??)\npprint.pprint(??)\npprint.saferepr(??)\nprofile.OptionParser(??)\nprofile.Profile(??)\nprofile.Stats(??)\nprofile.help(??)\nprofile.main(??)\nprofile.marshal\nprofile.os\nprofile.resgetrusage(??)\nprofile.resource\nprofile.run(??)\nprofile.runctx(??)\nprofile.sys\nprofile.time\nproperty(fget=None, fset=None, fdel=None, doc=None) -> property attribute\npstats.Stats(??)\npstats.TupleComp(??)\npstats.add_callers(??)\npstats.add_func_stats(??)\npstats.count_calls(??)\npstats.f8(??)\npstats.func_get_function_name(??)\npstats.func_std_string(??)\npstats.func_strip_path(??)\npstats.marshal\npstats.os\npstats.re\npstats.sys\npstats.time\npty.CHILD\npty.STDERR_FILENO\npty.STDIN_FILENO\npty.STDOUT_FILENO\npty.fork() -> (pid, master_fd)\npty.master_open() -> (master_fd, slave_name)\npty.openpty() -> (master_fd, slave_fd)\npty.os\npty.select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\npty.slave_open(tty_name) -> slave_fd\npty.spawn(??)\npty.tty\npwd.getpwall() -> list_of_entries\npwd.getpwnam(name) -> (pw_name,pw_passwd,pw_uid,\npwd.getpwuid(uid) -> (pw_name,pw_passwd,pw_uid,\npwd.struct_passwd\npwd.struct_pwent\npy_compile.MAGIC\npy_compile.PyCompileError\npy_compile.compile(??)\npy_compile.imp\npy_compile.main(??)\npy_compile.marshal\npy_compile.os\npy_compile.set_creator_type(??)\npy_compile.sys\npy_compile.traceback\npy_compile.wr_long(??)\npyclbr.Class(??)\npyclbr.DEDENT\npyclbr.Function(??)\npyclbr.NAME\npyclbr.NEWLINE\npyclbr.OP\npyclbr.imp\npyclbr.itemgetter(item, ...) --> itemgetter object\npyclbr.readmodule(??)\npyclbr.readmodule_ex(??)\npyclbr.sys\npyclbr.tokenize\npydoc.Doc(??)\npydoc.ErrorDuringImport\npydoc.HTMLDoc(??)\npydoc.HTMLRepr(??)\npydoc.Helper(??)\npydoc.ModuleScanner(??)\npydoc.Repr(??)\npydoc.Scanner(??)\npydoc.TextDoc(??)\npydoc.TextRepr(??)\npydoc.allmethods(??)\npydoc.apropos(??)\npydoc.classify_class_attrs(??)\npydoc.classname(??)\npydoc.cli(??)\npydoc.cram(??)\npydoc.deque(iterable) --> deque object\npydoc.describe(??)\npydoc.doc(??)\npydoc.expandtabs(s [,tabsize]) -> string\npydoc.find(s, sub [,start [,end]]) -> in\npydoc.getdoc(??)\npydoc.getpager(??)\npydoc.gui(??)\npydoc.help\npydoc.html\npydoc.imp\npydoc.importfile(??)\npydoc.inspect\npydoc.isdata(??)\npydoc.ispackage(??)\npydoc.ispath(??)\npydoc.join(list [,sep]) -> string\npydoc.locate(??)\npydoc.lower(s) -> string\npydoc.os\npydoc.pager(??)\npydoc.pathdirs(??)\npydoc.pipepager(??)\npydoc.pkgutil\npydoc.plain(??)\npydoc.plainpager(??)\npydoc.re\npydoc.replace(??)\npydoc.resolve(??)\npydoc.rfind(s, sub [,start [,end]]) -> int\npydoc.rstrip(s [,chars]) -> string\npydoc.safeimport(??)\npydoc.serve(??)\npydoc.source_synopsis(??)\npydoc.split(s [,sep [,maxsplit]]) -> list of strings\npydoc.splitdoc(??)\npydoc.strip(s [,chars]) -> string\npydoc.stripid(??)\npydoc.synopsis(??)\npydoc.sys\npydoc.tempfilepager(??)\npydoc.text\npydoc.ttypager(??)\npydoc.types\npydoc.visiblename(??)\npydoc.writedoc(??)\npydoc.writedocs(??)\npyexpat.EXPAT_VERSION\npyexpat.ErrorString(errno) -> string\npyexpat.ExpatError\npyexpat.ParserCreate([encoding[, namespace_separator]]) -> parser\npyexpat.XMLParserType\npyexpat.XML_PARAM_ENTITY_PARSING_ALWAYS\npyexpat.XML_PARAM_ENTITY_PARSING_NEVER\npyexpat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE\npyexpat.error\npyexpat.errors\npyexpat.expat_CAPI\npyexpat.features\npyexpat.model\npyexpat.native_encoding\npyexpat.version_info\nquit\nquopri.EMPTYSTRING\nquopri.ESCAPE\nquopri.HEX\nquopri.MAXLINESIZE\nquopri.a2b_qp\nquopri.b2a_qp(data, quotetabs=0, istext=1, header=0) -> s;\nquopri.decode(??)\nquopri.decodestring(??)\nquopri.encode(??)\nquopri.encodestring(??)\nquopri.ishex(??)\nquopri.main(??)\nquopri.needsquoting(??)\nquopri.quote(??)\nquopri.unhex(??)\nrandom.BPF\nrandom.LOG4\nrandom.NV_MAGICCONST\nrandom.RECIP_BPF\nrandom.Random\nrandom.SG_MAGICCONST\nrandom.SystemRandom\nrandom.TWOPI\nrandom.WichmannHill\nrandom.betavariate\nrandom.choice\nrandom.expovariate\nrandom.gammavariate\nrandom.gauss\nrandom.getrandbits(k) -> x.  Generates a long int with k random bits.\nrandom.getstate\nrandom.jumpahead(int) -> None.  Create new state from existing state and integer.\nrandom.lognormvariate\nrandom.normalvariate\nrandom.paretovariate\nrandom.randint\nrandom.random() -> x in the interval [0, 1).\nrandom.randrange\nrandom.sample\nrandom.seed\nrandom.setstate\nrandom.shuffle\nrandom.uniform\nrandom.vonmisesvariate\nrandom.weibullvariate\nrange([start,] stop[, step]) -> list of integers\nraw_input([prompt]) -> string\nre.DEBUG\nre.DOTALL\nre.I\nre.IGNORECASE\nre.L\nre.LOCALE\nre.M\nre.MULTILINE\nre.S\nre.Scanner(??)\nre.T\nre.TEMPLATE\nre.U\nre.UNICODE\nre.VERBOSE\nre.X\nre.compile(??)\nre.copy_reg\nre.error\nre.escape(??)\nre.findall(??)\nre.finditer(??)\nre.match(??)\nre.purge(??)\nre.search(??)\nre.split(??)\nre.sre_compile\nre.sre_parse\nre.sub(??)\nre.subn(??)\nre.sys\nre.template(??)\nreadline.add_history(string) -> None\nreadline.clear_history() -> None\nreadline.get_begidx() -> int\nreadline.get_completer() -> function\nreadline.get_completer_delims() -> string\nreadline.get_current_history_length() -> integer\nreadline.get_endidx() -> int\nreadline.get_history_item() -> string\nreadline.get_history_length() -> int\nreadline.get_line_buffer() -> string\nreadline.insert_text(string) -> None\nreadline.parse_and_bind(string) -> None\nreadline.read_history_file([filename]) -> None\nreadline.read_init_file([filename]) -> None\nreadline.redisplay() -> None\nreadline.remove_history_item(pos) -> None\nreadline.replace_history_item(pos, line) -> None\nreadline.set_completer([function]) -> None\nreadline.set_completer_delims(string) -> None\nreadline.set_history_length(length) -> None\nreadline.set_pre_input_hook([function]) -> None\nreadline.set_startup_hook([function]) -> None\nreadline.write_history_file([filename]) -> None\nreduce(function, sequence[, initial]) -> value\nreload(module) -> module\nrepr(object) -> string\nrepr.Repr(??)\nrepr.aRepr\nrepr.islice(iterable, [start,] stop [, step]) --> islice object\nrepr.repr\nresource.RLIMIT_AS\nresource.RLIMIT_CORE\nresource.RLIMIT_CPU\nresource.RLIMIT_DATA\nresource.RLIMIT_FSIZE\nresource.RLIMIT_MEMLOCK\nresource.RLIMIT_NOFILE\nresource.RLIMIT_NPROC\nresource.RLIMIT_OFILE\nresource.RLIMIT_RSS\nresource.RLIMIT_STACK\nresource.RLIM_INFINITY\nresource.RUSAGE_CHILDREN\nresource.RUSAGE_SELF\nresource.error\nresource.getpagesize\nresource.getrlimit\nresource.getrusage\nresource.setrlimit\nresource.struct_rusage\nreversed(sequence) -> reverse iterator over values of the sequence\nrexec.FileBase(??)\nrexec.FileDelegate(??)\nrexec.FileWrapper(??)\nrexec.RExec(??)\nrexec.RHooks(??)\nrexec.RModuleImporter(??)\nrexec.RModuleLoader(??)\nrexec.TEMPLATE\nrexec.ihooks\nrexec.imp\nrexec.os\nrexec.sys\nrexec.test(??)\nrfc822.AddressList(??)\nrfc822.AddrlistClass(??)\nrfc822.Message(??)\nrfc822.dump_address_pair(??)\nrfc822.formatdate(??)\nrfc822.mktime_tz(??)\nrfc822.parseaddr(??)\nrfc822.parsedate(??)\nrfc822.parsedate_tz(??)\nrfc822.quote(??)\nrfc822.time\nrfc822.unquote(??)\nrlcompleter.Completer(??)\nrlcompleter.get_class_members(??)\nrlcompleter.readline\nrobotparser.Entry(??)\nrobotparser.RobotFileParser(??)\nrobotparser.RuleLine(??)\nrobotparser.URLopener(??)\nrobotparser.debug\nrobotparser.urllib\nrobotparser.urlparse\nround(number[, ndigits]) -> floating point number\nrunpy.get_loader(??)\nrunpy.imp\nrunpy.run_module(??)\nrunpy.sys\nsched.heapq\nsched.scheduler(??)\nselect.POLLERR\nselect.POLLHUP\nselect.POLLIN\nselect.POLLMSG\nselect.POLLNVAL\nselect.POLLOUT\nselect.POLLPRI\nselect.POLLRDBAND\nselect.POLLRDNORM\nselect.POLLWRBAND\nselect.POLLWRNORM\nselect.error\nselect.poll\nselect.select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\nset(iterable) --> set object\nsetattr(object, name, value)\nsets.BaseSet\nsets.ImmutableSet\nsets.Set\nsets.generators\nsets.ifilter(function or None, sequence) --> ifilter object\nsets.ifilterfalse(function or None, sequence) --> ifilterfalse object\nsgmllib.SGMLParseError\nsgmllib.SGMLParser(??)\nsgmllib.TestSGMLParser(??)\nsgmllib.attrfind\nsgmllib.charref\nsgmllib.endbracket\nsgmllib.entityref\nsgmllib.incomplete\nsgmllib.interesting\nsgmllib.markupbase\nsgmllib.piclose\nsgmllib.re\nsgmllib.shorttag\nsgmllib.shorttagopen\nsgmllib.starttagopen\nsgmllib.tagfind\nsgmllib.test(??)\nsha.blocksize\nsha.digest_size\nsha.digestsize\nsha.new\nsha.sha\nshelve.BsdDbShelf(??)\nshelve.DbfilenameShelf(??)\nshelve.Pickler(file, protocol=0) -- Create a pickler.\nshelve.Shelf(??)\nshelve.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nshelve.Unpickler(file) -- Create an unpickler.\nshelve.UserDict\nshelve.open(??)\nshelve.warnings\nshlex.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nshlex.deque(iterable) --> deque object\nshlex.os\nshlex.shlex(??)\nshlex.split(??)\nshlex.sys\nshutil.Error\nshutil.abspath(??)\nshutil.copy(??)\nshutil.copy2(??)\nshutil.copyfile(??)\nshutil.copyfileobj(??)\nshutil.copymode(??)\nshutil.copystat(??)\nshutil.copytree(??)\nshutil.destinsrc(??)\nshutil.move(??)\nshutil.os\nshutil.rmtree(??)\nshutil.stat\nshutil.sys\nsignal.NSIG\nsignal.SIGABRT\nsignal.SIGALRM\nsignal.SIGBUS\nsignal.SIGCHLD\nsignal.SIGCLD\nsignal.SIGCONT\nsignal.SIGFPE\nsignal.SIGHUP\nsignal.SIGILL\nsignal.SIGINT\nsignal.SIGIO\nsignal.SIGIOT\nsignal.SIGKILL\nsignal.SIGPIPE\nsignal.SIGPOLL\nsignal.SIGPROF\nsignal.SIGPWR\nsignal.SIGQUIT\nsignal.SIGRTMAX\nsignal.SIGRTMIN\nsignal.SIGSEGV\nsignal.SIGSTOP\nsignal.SIGSYS\nsignal.SIGTERM\nsignal.SIGTRAP\nsignal.SIGTSTP\nsignal.SIGTTIN\nsignal.SIGTTOU\nsignal.SIGURG\nsignal.SIGUSR1\nsignal.SIGUSR2\nsignal.SIGVTALRM\nsignal.SIGWINCH\nsignal.SIGXCPU\nsignal.SIGXFSZ\nsignal.SIG_DFL\nsignal.SIG_IGN\nsignal.alarm(seconds)\nsignal.default_int_handler(...)\nsignal.getsignal(sig) -> action\nsignal.pause()\nsignal.signal(sig, action) -> action\nsite.abs__file__(??)\nsite.addbuilddir(??)\nsite.addpackage(??)\nsite.addsitedir(??)\nsite.addsitepackages(??)\nsite.aliasmbcs(??)\nsite.execsitecustomize(??)\nsite.main(??)\nsite.makepath(??)\nsite.os\nsite.removeduppaths(??)\nsite.setBEGINLIBPATH(??)\nsite.setcopyright(??)\nsite.setencoding(??)\nsite.sethelper(??)\nsite.setquit(??)\nsite.sys\nslice([start,] stop[, step])\nsmtpd.COMMASPACE\nsmtpd.DEBUGSTREAM\nsmtpd.DebuggingServer(??)\nsmtpd.Devnull(??)\nsmtpd.EMPTYSTRING\nsmtpd.MailmanProxy(??)\nsmtpd.NEWLINE\nsmtpd.Options(??)\nsmtpd.PureProxy(??)\nsmtpd.SMTPChannel(??)\nsmtpd.SMTPServer(??)\nsmtpd.asynchat\nsmtpd.asyncore\nsmtpd.errno\nsmtpd.getopt\nsmtpd.os\nsmtpd.parseargs(??)\nsmtpd.program\nsmtpd.socket\nsmtpd.sys\nsmtpd.time\nsmtpd.usage(??)\nsmtplib.CRLF\nsmtplib.OLDSTYLE_AUTH\nsmtplib.SMTP(??)\nsmtplib.SMTPAuthenticationError\nsmtplib.SMTPConnectError\nsmtplib.SMTPDataError\nsmtplib.SMTPException\nsmtplib.SMTPHeloError\nsmtplib.SMTPRecipientsRefused\nsmtplib.SMTPResponseException\nsmtplib.SMTPSenderRefused\nsmtplib.SMTPServerDisconnected\nsmtplib.SMTP_PORT\nsmtplib.SSLFakeFile(??)\nsmtplib.SSLFakeSocket(??)\nsmtplib.base64\nsmtplib.email\nsmtplib.encode_base64(??)\nsmtplib.hmac\nsmtplib.quoteaddr(??)\nsmtplib.quotedata(??)\nsmtplib.re\nsmtplib.socket\nsmtplib.stderr\nsndhdr.get_long_be(??)\nsndhdr.get_long_le(??)\nsndhdr.get_short_be(??)\nsndhdr.get_short_le(??)\nsndhdr.test(??)\nsndhdr.test_8svx(??)\nsndhdr.test_aifc(??)\nsndhdr.test_au(??)\nsndhdr.test_hcom(??)\nsndhdr.test_sndr(??)\nsndhdr.test_sndt(??)\nsndhdr.test_voc(??)\nsndhdr.test_wav(??)\nsndhdr.testall(??)\nsndhdr.tests\nsndhdr.what(??)\nsndhdr.whathdr(??)\nsocket.AF_APPLETALK\nsocket.AF_ASH\nsocket.AF_ATMPVC\nsocket.AF_ATMSVC\nsocket.AF_AX25\nsocket.AF_BRIDGE\nsocket.AF_DECnet\nsocket.AF_ECONET\nsocket.AF_INET\nsocket.AF_INET6\nsocket.AF_IPX\nsocket.AF_IRDA\nsocket.AF_KEY\nsocket.AF_NETBEUI\nsocket.AF_NETLINK\nsocket.AF_NETROM\nsocket.AF_PACKET\nsocket.AF_PPPOX\nsocket.AF_ROSE\nsocket.AF_ROUTE\nsocket.AF_SECURITY\nsocket.AF_SNA\nsocket.AF_UNIX\nsocket.AF_UNSPEC\nsocket.AF_WANPIPE\nsocket.AF_X25\nsocket.AI_ADDRCONFIG\nsocket.AI_ALL\nsocket.AI_CANONNAME\nsocket.AI_NUMERICHOST\nsocket.AI_NUMERICSERV\nsocket.AI_PASSIVE\nsocket.AI_V4MAPPED\nsocket.CAPI\nsocket.EAI_ADDRFAMILY\nsocket.EAI_AGAIN\nsocket.EAI_BADFLAGS\nsocket.EAI_FAIL\nsocket.EAI_FAMILY\nsocket.EAI_MEMORY\nsocket.EAI_NODATA\nsocket.EAI_NONAME\nsocket.EAI_OVERFLOW\nsocket.EAI_SERVICE\nsocket.EAI_SOCKTYPE\nsocket.EAI_SYSTEM\nsocket.EBADF\nsocket.INADDR_ALLHOSTS_GROUP\nsocket.INADDR_ANY\nsocket.INADDR_BROADCAST\nsocket.INADDR_LOOPBACK\nsocket.INADDR_MAX_LOCAL_GROUP\nsocket.INADDR_NONE\nsocket.INADDR_UNSPEC_GROUP\nsocket.IPPORT_RESERVED\nsocket.IPPORT_USERRESERVED\nsocket.IPPROTO_AH\nsocket.IPPROTO_DSTOPTS\nsocket.IPPROTO_EGP\nsocket.IPPROTO_ESP\nsocket.IPPROTO_FRAGMENT\nsocket.IPPROTO_GRE\nsocket.IPPROTO_HOPOPTS\nsocket.IPPROTO_ICMP\nsocket.IPPROTO_ICMPV6\nsocket.IPPROTO_IDP\nsocket.IPPROTO_IGMP\nsocket.IPPROTO_IP\nsocket.IPPROTO_IPIP\nsocket.IPPROTO_IPV6\nsocket.IPPROTO_NONE\nsocket.IPPROTO_PIM\nsocket.IPPROTO_PUP\nsocket.IPPROTO_RAW\nsocket.IPPROTO_ROUTING\nsocket.IPPROTO_RSVP\nsocket.IPPROTO_TCP\nsocket.IPPROTO_TP\nsocket.IPPROTO_UDP\nsocket.IPV6_CHECKSUM\nsocket.IPV6_DSTOPTS\nsocket.IPV6_HOPLIMIT\nsocket.IPV6_HOPOPTS\nsocket.IPV6_JOIN_GROUP\nsocket.IPV6_LEAVE_GROUP\nsocket.IPV6_MULTICAST_HOPS\nsocket.IPV6_MULTICAST_IF\nsocket.IPV6_MULTICAST_LOOP\nsocket.IPV6_NEXTHOP\nsocket.IPV6_PKTINFO\nsocket.IPV6_RECVDSTOPTS\nsocket.IPV6_RECVHOPLIMIT\nsocket.IPV6_RECVHOPOPTS\nsocket.IPV6_RECVPKTINFO\nsocket.IPV6_RECVRTHDR\nsocket.IPV6_RECVTCLASS\nsocket.IPV6_RTHDR\nsocket.IPV6_RTHDRDSTOPTS\nsocket.IPV6_RTHDR_TYPE_0\nsocket.IPV6_TCLASS\nsocket.IPV6_UNICAST_HOPS\nsocket.IPV6_V6ONLY\nsocket.IP_ADD_MEMBERSHIP\nsocket.IP_DEFAULT_MULTICAST_LOOP\nsocket.IP_DEFAULT_MULTICAST_TTL\nsocket.IP_DROP_MEMBERSHIP\nsocket.IP_HDRINCL\nsocket.IP_MAX_MEMBERSHIPS\nsocket.IP_MULTICAST_IF\nsocket.IP_MULTICAST_LOOP\nsocket.IP_MULTICAST_TTL\nsocket.IP_OPTIONS\nsocket.IP_RECVOPTS\nsocket.IP_RECVRETOPTS\nsocket.IP_RETOPTS\nsocket.IP_TOS\nsocket.IP_TTL\nsocket.MSG_CTRUNC\nsocket.MSG_DONTROUTE\nsocket.MSG_DONTWAIT\nsocket.MSG_EOR\nsocket.MSG_OOB\nsocket.MSG_PEEK\nsocket.MSG_TRUNC\nsocket.MSG_WAITALL\nsocket.NETLINK_DNRTMSG\nsocket.NETLINK_FIREWALL\nsocket.NETLINK_IP6_FW\nsocket.NETLINK_NFLOG\nsocket.NETLINK_ROUTE\nsocket.NETLINK_USERSOCK\nsocket.NETLINK_W1\nsocket.NETLINK_XFRM\nsocket.NI_DGRAM\nsocket.NI_MAXHOST\nsocket.NI_MAXSERV\nsocket.NI_NAMEREQD\nsocket.NI_NOFQDN\nsocket.NI_NUMERICHOST\nsocket.NI_NUMERICSERV\nsocket.PACKET_BROADCAST\nsocket.PACKET_FASTROUTE\nsocket.PACKET_HOST\nsocket.PACKET_LOOPBACK\nsocket.PACKET_MULTICAST\nsocket.PACKET_OTHERHOST\nsocket.PACKET_OUTGOING\nsocket.PF_PACKET\nsocket.RAND_add(string, entropy)\nsocket.RAND_egd(path) -> bytes\nsocket.RAND_status() -> 0 or 1\nsocket.SHUT_RD\nsocket.SHUT_RDWR\nsocket.SHUT_WR\nsocket.SOCK_DGRAM\nsocket.SOCK_RAW\nsocket.SOCK_RDM\nsocket.SOCK_SEQPACKET\nsocket.SOCK_STREAM\nsocket.SOL_IP\nsocket.SOL_SOCKET\nsocket.SOL_TCP\nsocket.SOL_UDP\nsocket.SOMAXCONN\nsocket.SO_ACCEPTCONN\nsocket.SO_BROADCAST\nsocket.SO_DEBUG\nsocket.SO_DONTROUTE\nsocket.SO_ERROR\nsocket.SO_KEEPALIVE\nsocket.SO_LINGER\nsocket.SO_OOBINLINE\nsocket.SO_RCVBUF\nsocket.SO_RCVLOWAT\nsocket.SO_RCVTIMEO\nsocket.SO_REUSEADDR\nsocket.SO_SNDBUF\nsocket.SO_SNDLOWAT\nsocket.SO_SNDTIMEO\nsocket.SO_TYPE\nsocket.SSLType\nsocket.SSL_ERROR_EOF\nsocket.SSL_ERROR_INVALID_ERROR_CODE\nsocket.SSL_ERROR_SSL\nsocket.SSL_ERROR_SYSCALL\nsocket.SSL_ERROR_WANT_CONNECT\nsocket.SSL_ERROR_WANT_READ\nsocket.SSL_ERROR_WANT_WRITE\nsocket.SSL_ERROR_WANT_X509_LOOKUP\nsocket.SSL_ERROR_ZERO_RETURN\nsocket.SocketType\nsocket.TCP_CORK\nsocket.TCP_DEFER_ACCEPT\nsocket.TCP_INFO\nsocket.TCP_KEEPCNT\nsocket.TCP_KEEPIDLE\nsocket.TCP_KEEPINTVL\nsocket.TCP_LINGER2\nsocket.TCP_MAXSEG\nsocket.TCP_NODELAY\nsocket.TCP_QUICKACK\nsocket.TCP_SYNCNT\nsocket.TCP_WINDOW_CLAMP\nsocket.error\nsocket.fromfd(fd, family, type[, proto]) -> socket object\nsocket.gaierror\nsocket.getaddrinfo(host, port [, family, socktype, proto, flags])\nsocket.getdefaulttimeout() -> timeout\nsocket.getfqdn(??)\nsocket.gethostbyaddr(host) -> (name, aliaslist, addresslist)\nsocket.gethostbyname(host) -> address\nsocket.gethostbyname_ex(host) -> (name, aliaslist, addresslist)\nsocket.gethostname() -> string\nsocket.getnameinfo(sockaddr, flags) --> (host, port)\nsocket.getprotobyname(name) -> integer\nsocket.getservbyname(servicename[, protocolname]) -> integer\nsocket.getservbyport(port[, protocolname]) -> string\nsocket.has_ipv6\nsocket.herror\nsocket.htonl(integer) -> integer\nsocket.htons(integer) -> integer\nsocket.inet_aton(string) -> packed 32-bit IP representation\nsocket.inet_ntoa(packed_ip) -> ip_address_string\nsocket.inet_ntop(af, packed_ip) -> string formatted IP address\nsocket.inet_pton(af, ip) -> packed IP address string\nsocket.ntohl(integer) -> integer\nsocket.ntohs(integer) -> integer\nsocket.os\nsocket.setdefaulttimeout(timeout)\nsocket.socket([family[, type[, proto]]]) -> socket object\nsocket.socketpair([family[, type[, proto]]]) -> (socket object, socket object)\nsocket.ssl(??)\nsocket.sslerror\nsocket.sys\nsocket.timeout\nsorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list\nspwd.getspall() -> list_of_entries\nspwd.getspnam(name) -> (sp_namp, sp_pwdp, sp_lstchg, sp_min, sp_max,\nspwd.struct_spwd\nsqlite3.Binary\nsqlite3.Cache\nsqlite3.Connection\nsqlite3.Cursor\nsqlite3.DataError\nsqlite3.DatabaseError\nsqlite3.Date\nsqlite3.DateFromTicks(??)\nsqlite3.Error\nsqlite3.IntegrityError\nsqlite3.InterfaceError\nsqlite3.InternalError\nsqlite3.NotSupportedError\nsqlite3.OperationalError\nsqlite3.OptimizedUnicode\nsqlite3.PARSE_COLNAMES\nsqlite3.PARSE_DECLTYPES\nsqlite3.PrepareProtocol\nsqlite3.ProgrammingError\nsqlite3.Row\nsqlite3.SQLITE_ALTER_TABLE\nsqlite3.SQLITE_ANALYZE\nsqlite3.SQLITE_ATTACH\nsqlite3.SQLITE_CREATE_INDEX\nsqlite3.SQLITE_CREATE_TABLE\nsqlite3.SQLITE_CREATE_TEMP_INDEX\nsqlite3.SQLITE_CREATE_TEMP_TABLE\nsqlite3.SQLITE_CREATE_TEMP_TRIGGER\nsqlite3.SQLITE_CREATE_TEMP_VIEW\nsqlite3.SQLITE_CREATE_TRIGGER\nsqlite3.SQLITE_CREATE_VIEW\nsqlite3.SQLITE_DELETE\nsqlite3.SQLITE_DENY\nsqlite3.SQLITE_DETACH\nsqlite3.SQLITE_DROP_INDEX\nsqlite3.SQLITE_DROP_TABLE\nsqlite3.SQLITE_DROP_TEMP_INDEX\nsqlite3.SQLITE_DROP_TEMP_TABLE\nsqlite3.SQLITE_DROP_TEMP_TRIGGER\nsqlite3.SQLITE_DROP_TEMP_VIEW\nsqlite3.SQLITE_DROP_TRIGGER\nsqlite3.SQLITE_DROP_VIEW\nsqlite3.SQLITE_IGNORE\nsqlite3.SQLITE_INSERT\nsqlite3.SQLITE_OK\nsqlite3.SQLITE_PRAGMA\nsqlite3.SQLITE_READ\nsqlite3.SQLITE_REINDEX\nsqlite3.SQLITE_SELECT\nsqlite3.SQLITE_TRANSACTION\nsqlite3.SQLITE_UPDATE\nsqlite3.Statement\nsqlite3.Time\nsqlite3.TimeFromTicks(??)\nsqlite3.Timestamp\nsqlite3.TimestampFromTicks(??)\nsqlite3.Warning\nsqlite3.adapt(obj, protocol, alternate) -> adapt obj to given protocol. Non-standard.\nsqlite3.adapters\nsqlite3.apilevel\nsqlite3.complete_statement\nsqlite3.connect\nsqlite3.converters\nsqlite3.datetime\nsqlite3.dbapi2\nsqlite3.dbapi2.Binary\nsqlite3.dbapi2.Cache\nsqlite3.dbapi2.Connection\nsqlite3.dbapi2.Cursor\nsqlite3.dbapi2.DataError\nsqlite3.dbapi2.DatabaseError\nsqlite3.dbapi2.Date\nsqlite3.dbapi2.DateFromTicks(??)\nsqlite3.dbapi2.Error\nsqlite3.dbapi2.IntegrityError\nsqlite3.dbapi2.InterfaceError\nsqlite3.dbapi2.InternalError\nsqlite3.dbapi2.NotSupportedError\nsqlite3.dbapi2.OperationalError\nsqlite3.dbapi2.OptimizedUnicode\nsqlite3.dbapi2.PARSE_COLNAMES\nsqlite3.dbapi2.PARSE_DECLTYPES\nsqlite3.dbapi2.PrepareProtocol\nsqlite3.dbapi2.ProgrammingError\nsqlite3.dbapi2.Row\nsqlite3.dbapi2.SQLITE_ALTER_TABLE\nsqlite3.dbapi2.SQLITE_ANALYZE\nsqlite3.dbapi2.SQLITE_ATTACH\nsqlite3.dbapi2.SQLITE_CREATE_INDEX\nsqlite3.dbapi2.SQLITE_CREATE_TABLE\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_INDEX\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_TABLE\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_TRIGGER\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_VIEW\nsqlite3.dbapi2.SQLITE_CREATE_TRIGGER\nsqlite3.dbapi2.SQLITE_CREATE_VIEW\nsqlite3.dbapi2.SQLITE_DELETE\nsqlite3.dbapi2.SQLITE_DENY\nsqlite3.dbapi2.SQLITE_DETACH\nsqlite3.dbapi2.SQLITE_DROP_INDEX\nsqlite3.dbapi2.SQLITE_DROP_TABLE\nsqlite3.dbapi2.SQLITE_DROP_TEMP_INDEX\nsqlite3.dbapi2.SQLITE_DROP_TEMP_TABLE\nsqlite3.dbapi2.SQLITE_DROP_TEMP_TRIGGER\nsqlite3.dbapi2.SQLITE_DROP_TEMP_VIEW\nsqlite3.dbapi2.SQLITE_DROP_TRIGGER\nsqlite3.dbapi2.SQLITE_DROP_VIEW\nsqlite3.dbapi2.SQLITE_IGNORE\nsqlite3.dbapi2.SQLITE_INSERT\nsqlite3.dbapi2.SQLITE_OK\nsqlite3.dbapi2.SQLITE_PRAGMA\nsqlite3.dbapi2.SQLITE_READ\nsqlite3.dbapi2.SQLITE_REINDEX\nsqlite3.dbapi2.SQLITE_SELECT\nsqlite3.dbapi2.SQLITE_TRANSACTION\nsqlite3.dbapi2.SQLITE_UPDATE\nsqlite3.dbapi2.Statement\nsqlite3.dbapi2.Time\nsqlite3.dbapi2.TimeFromTicks(??)\nsqlite3.dbapi2.Timestamp\nsqlite3.dbapi2.TimestampFromTicks(??)\nsqlite3.dbapi2.Warning\nsqlite3.dbapi2.adapt(obj, protocol, alternate) -> adapt obj to given protocol. Non-standard.\nsqlite3.dbapi2.adapters\nsqlite3.dbapi2.apilevel\nsqlite3.dbapi2.complete_statement\nsqlite3.dbapi2.connect\nsqlite3.dbapi2.converters\nsqlite3.dbapi2.datetime\nsqlite3.dbapi2.enable_callback_tracebacks\nsqlite3.dbapi2.enable_shared_cache\nsqlite3.dbapi2.paramstyle\nsqlite3.dbapi2.register_adapter\nsqlite3.dbapi2.register_converter\nsqlite3.dbapi2.sqlite_version\nsqlite3.dbapi2.sqlite_version_info\nsqlite3.dbapi2.threadsafety\nsqlite3.dbapi2.time\nsqlite3.dbapi2.version\nsqlite3.dbapi2.version_info\nsqlite3.dbapi2.x\nsqlite3.enable_callback_tracebacks\nsqlite3.enable_shared_cache\nsqlite3.paramstyle\nsqlite3.register_adapter\nsqlite3.register_converter\nsqlite3.sqlite_version\nsqlite3.sqlite_version_info\nsqlite3.threadsafety\nsqlite3.time\nsqlite3.version\nsqlite3.version_info\nsqlite3.x\nsre.DOTALL\nsre.I\nsre.IGNORECASE\nsre.L\nsre.LOCALE\nsre.M\nsre.MULTILINE\nsre.S\nsre.U\nsre.UNICODE\nsre.VERBOSE\nsre.X\nsre.compile(??)\nsre.error\nsre.escape(??)\nsre.findall(??)\nsre.finditer(??)\nsre.match(??)\nsre.purge(??)\nsre.search(??)\nsre.split(??)\nsre.sub(??)\nsre.subn(??)\nsre.template(??)\nsre.warnings\nsre_compile.ANY\nsre_compile.ANY_ALL\nsre_compile.ASSERT\nsre_compile.ASSERT_NOT\nsre_compile.AT\nsre_compile.ATCODES\nsre_compile.AT_BEGINNING\nsre_compile.AT_BEGINNING_LINE\nsre_compile.AT_BEGINNING_STRING\nsre_compile.AT_BOUNDARY\nsre_compile.AT_END\nsre_compile.AT_END_LINE\nsre_compile.AT_END_STRING\nsre_compile.AT_LOCALE\nsre_compile.AT_LOC_BOUNDARY\nsre_compile.AT_LOC_NON_BOUNDARY\nsre_compile.AT_MULTILINE\nsre_compile.AT_NON_BOUNDARY\nsre_compile.AT_UNICODE\nsre_compile.AT_UNI_BOUNDARY\nsre_compile.AT_UNI_NON_BOUNDARY\nsre_compile.BIGCHARSET\nsre_compile.BRANCH\nsre_compile.CALL\nsre_compile.CATEGORY\nsre_compile.CATEGORY_DIGIT\nsre_compile.CATEGORY_LINEBREAK\nsre_compile.CATEGORY_LOC_NOT_WORD\nsre_compile.CATEGORY_LOC_WORD\nsre_compile.CATEGORY_NOT_DIGIT\nsre_compile.CATEGORY_NOT_LINEBREAK\nsre_compile.CATEGORY_NOT_SPACE\nsre_compile.CATEGORY_NOT_WORD\nsre_compile.CATEGORY_SPACE\nsre_compile.CATEGORY_UNI_DIGIT\nsre_compile.CATEGORY_UNI_LINEBREAK\nsre_compile.CATEGORY_UNI_NOT_DIGIT\nsre_compile.CATEGORY_UNI_NOT_LINEBREAK\nsre_compile.CATEGORY_UNI_NOT_SPACE\nsre_compile.CATEGORY_UNI_NOT_WORD\nsre_compile.CATEGORY_UNI_SPACE\nsre_compile.CATEGORY_UNI_WORD\nsre_compile.CATEGORY_WORD\nsre_compile.CHARSET\nsre_compile.CHCODES\nsre_compile.CH_LOCALE\nsre_compile.CH_UNICODE\nsre_compile.FAILURE\nsre_compile.GROUPREF\nsre_compile.GROUPREF_EXISTS\nsre_compile.GROUPREF_IGNORE\nsre_compile.IN\nsre_compile.INFO\nsre_compile.IN_IGNORE\nsre_compile.JUMP\nsre_compile.LITERAL\nsre_compile.LITERAL_IGNORE\nsre_compile.MAGIC\nsre_compile.MARK\nsre_compile.MAXCODE\nsre_compile.MAXREPEAT\nsre_compile.MAX_REPEAT\nsre_compile.MAX_UNTIL\nsre_compile.MIN_REPEAT\nsre_compile.MIN_REPEAT_ONE\nsre_compile.MIN_UNTIL\nsre_compile.NEGATE\nsre_compile.NOT_LITERAL\nsre_compile.NOT_LITERAL_IGNORE\nsre_compile.OPCODES\nsre_compile.OP_IGNORE\nsre_compile.RANGE\nsre_compile.REPEAT\nsre_compile.REPEAT_ONE\nsre_compile.SRE_FLAG_DEBUG\nsre_compile.SRE_FLAG_DOTALL\nsre_compile.SRE_FLAG_IGNORECASE\nsre_compile.SRE_FLAG_LOCALE\nsre_compile.SRE_FLAG_MULTILINE\nsre_compile.SRE_FLAG_TEMPLATE\nsre_compile.SRE_FLAG_UNICODE\nsre_compile.SRE_FLAG_VERBOSE\nsre_compile.SRE_INFO_CHARSET\nsre_compile.SRE_INFO_LITERAL\nsre_compile.SRE_INFO_PREFIX\nsre_compile.STRING_TYPES\nsre_compile.SUBPATTERN\nsre_compile.SUCCESS\nsre_compile.compile(??)\nsre_compile.error\nsre_compile.isstring(??)\nsre_compile.makedict(??)\nsre_compile.set(??)\nsre_compile.sys\nsre_constants.ANY\nsre_constants.ANY_ALL\nsre_constants.ASSERT\nsre_constants.ASSERT_NOT\nsre_constants.AT\nsre_constants.ATCODES\nsre_constants.AT_BEGINNING\nsre_constants.AT_BEGINNING_LINE\nsre_constants.AT_BEGINNING_STRING\nsre_constants.AT_BOUNDARY\nsre_constants.AT_END\nsre_constants.AT_END_LINE\nsre_constants.AT_END_STRING\nsre_constants.AT_LOCALE\nsre_constants.AT_LOC_BOUNDARY\nsre_constants.AT_LOC_NON_BOUNDARY\nsre_constants.AT_MULTILINE\nsre_constants.AT_NON_BOUNDARY\nsre_constants.AT_UNICODE\nsre_constants.AT_UNI_BOUNDARY\nsre_constants.AT_UNI_NON_BOUNDARY\nsre_constants.BIGCHARSET\nsre_constants.BRANCH\nsre_constants.CALL\nsre_constants.CATEGORY\nsre_constants.CATEGORY_DIGIT\nsre_constants.CATEGORY_LINEBREAK\nsre_constants.CATEGORY_LOC_NOT_WORD\nsre_constants.CATEGORY_LOC_WORD\nsre_constants.CATEGORY_NOT_DIGIT\nsre_constants.CATEGORY_NOT_LINEBREAK\nsre_constants.CATEGORY_NOT_SPACE\nsre_constants.CATEGORY_NOT_WORD\nsre_constants.CATEGORY_SPACE\nsre_constants.CATEGORY_UNI_DIGIT\nsre_constants.CATEGORY_UNI_LINEBREAK\nsre_constants.CATEGORY_UNI_NOT_DIGIT\nsre_constants.CATEGORY_UNI_NOT_LINEBREAK\nsre_constants.CATEGORY_UNI_NOT_SPACE\nsre_constants.CATEGORY_UNI_NOT_WORD\nsre_constants.CATEGORY_UNI_SPACE\nsre_constants.CATEGORY_UNI_WORD\nsre_constants.CATEGORY_WORD\nsre_constants.CHARSET\nsre_constants.CHCODES\nsre_constants.CH_LOCALE\nsre_constants.CH_UNICODE\nsre_constants.FAILURE\nsre_constants.GROUPREF\nsre_constants.GROUPREF_EXISTS\nsre_constants.GROUPREF_IGNORE\nsre_constants.IN\nsre_constants.INFO\nsre_constants.IN_IGNORE\nsre_constants.JUMP\nsre_constants.LITERAL\nsre_constants.LITERAL_IGNORE\nsre_constants.MAGIC\nsre_constants.MARK\nsre_constants.MAXREPEAT\nsre_constants.MAX_REPEAT\nsre_constants.MAX_UNTIL\nsre_constants.MIN_REPEAT\nsre_constants.MIN_REPEAT_ONE\nsre_constants.MIN_UNTIL\nsre_constants.NEGATE\nsre_constants.NOT_LITERAL\nsre_constants.NOT_LITERAL_IGNORE\nsre_constants.OPCODES\nsre_constants.OP_IGNORE\nsre_constants.RANGE\nsre_constants.REPEAT\nsre_constants.REPEAT_ONE\nsre_constants.SRE_FLAG_DEBUG\nsre_constants.SRE_FLAG_DOTALL\nsre_constants.SRE_FLAG_IGNORECASE\nsre_constants.SRE_FLAG_LOCALE\nsre_constants.SRE_FLAG_MULTILINE\nsre_constants.SRE_FLAG_TEMPLATE\nsre_constants.SRE_FLAG_UNICODE\nsre_constants.SRE_FLAG_VERBOSE\nsre_constants.SRE_INFO_CHARSET\nsre_constants.SRE_INFO_LITERAL\nsre_constants.SRE_INFO_PREFIX\nsre_constants.SUBPATTERN\nsre_constants.SUCCESS\nsre_constants.error\nsre_constants.makedict(??)\nsre_parse.ANY\nsre_parse.ANY_ALL\nsre_parse.ASSERT\nsre_parse.ASSERT_NOT\nsre_parse.AT\nsre_parse.ATCODES\nsre_parse.AT_BEGINNING\nsre_parse.AT_BEGINNING_LINE\nsre_parse.AT_BEGINNING_STRING\nsre_parse.AT_BOUNDARY\nsre_parse.AT_END\nsre_parse.AT_END_LINE\nsre_parse.AT_END_STRING\nsre_parse.AT_LOCALE\nsre_parse.AT_LOC_BOUNDARY\nsre_parse.AT_LOC_NON_BOUNDARY\nsre_parse.AT_MULTILINE\nsre_parse.AT_NON_BOUNDARY\nsre_parse.AT_UNICODE\nsre_parse.AT_UNI_BOUNDARY\nsre_parse.AT_UNI_NON_BOUNDARY\nsre_parse.BIGCHARSET\nsre_parse.BRANCH\nsre_parse.CALL\nsre_parse.CATEGORIES\nsre_parse.CATEGORY\nsre_parse.CATEGORY_DIGIT\nsre_parse.CATEGORY_LINEBREAK\nsre_parse.CATEGORY_LOC_NOT_WORD\nsre_parse.CATEGORY_LOC_WORD\nsre_parse.CATEGORY_NOT_DIGIT\nsre_parse.CATEGORY_NOT_LINEBREAK\nsre_parse.CATEGORY_NOT_SPACE\nsre_parse.CATEGORY_NOT_WORD\nsre_parse.CATEGORY_SPACE\nsre_parse.CATEGORY_UNI_DIGIT\nsre_parse.CATEGORY_UNI_LINEBREAK\nsre_parse.CATEGORY_UNI_NOT_DIGIT\nsre_parse.CATEGORY_UNI_NOT_LINEBREAK\nsre_parse.CATEGORY_UNI_NOT_SPACE\nsre_parse.CATEGORY_UNI_NOT_WORD\nsre_parse.CATEGORY_UNI_SPACE\nsre_parse.CATEGORY_UNI_WORD\nsre_parse.CATEGORY_WORD\nsre_parse.CHARSET\nsre_parse.CHCODES\nsre_parse.CH_LOCALE\nsre_parse.CH_UNICODE\nsre_parse.DIGITS\nsre_parse.ESCAPES\nsre_parse.FAILURE\nsre_parse.FLAGS\nsre_parse.GROUPREF\nsre_parse.GROUPREF_EXISTS\nsre_parse.GROUPREF_IGNORE\nsre_parse.HEXDIGITS\nsre_parse.IN\nsre_parse.INFO\nsre_parse.IN_IGNORE\nsre_parse.JUMP\nsre_parse.LITERAL\nsre_parse.LITERAL_IGNORE\nsre_parse.MAGIC\nsre_parse.MARK\nsre_parse.MAXREPEAT\nsre_parse.MAX_REPEAT\nsre_parse.MAX_UNTIL\nsre_parse.MIN_REPEAT\nsre_parse.MIN_REPEAT_ONE\nsre_parse.MIN_UNTIL\nsre_parse.NEGATE\nsre_parse.NOT_LITERAL\nsre_parse.NOT_LITERAL_IGNORE\nsre_parse.OCTDIGITS\nsre_parse.OPCODES\nsre_parse.OP_IGNORE\nsre_parse.Pattern(??)\nsre_parse.RANGE\nsre_parse.REPEAT\nsre_parse.REPEAT_CHARS\nsre_parse.REPEAT_ONE\nsre_parse.SPECIAL_CHARS\nsre_parse.SRE_FLAG_DEBUG\nsre_parse.SRE_FLAG_DOTALL\nsre_parse.SRE_FLAG_IGNORECASE\nsre_parse.SRE_FLAG_LOCALE\nsre_parse.SRE_FLAG_MULTILINE\nsre_parse.SRE_FLAG_TEMPLATE\nsre_parse.SRE_FLAG_UNICODE\nsre_parse.SRE_FLAG_VERBOSE\nsre_parse.SRE_INFO_CHARSET\nsre_parse.SRE_INFO_LITERAL\nsre_parse.SRE_INFO_PREFIX\nsre_parse.SUBPATTERN\nsre_parse.SUCCESS\nsre_parse.SubPattern(??)\nsre_parse.Tokenizer(??)\nsre_parse.WHITESPACE\nsre_parse.error\nsre_parse.expand_template(??)\nsre_parse.isdigit(??)\nsre_parse.isident(??)\nsre_parse.isname(??)\nsre_parse.makedict(??)\nsre_parse.parse(??)\nsre_parse.parse_template(??)\nsre_parse.set(??)\nsre_parse.sys\nstat.ST_ATIME\nstat.ST_CTIME\nstat.ST_DEV\nstat.ST_GID\nstat.ST_INO\nstat.ST_MODE\nstat.ST_MTIME\nstat.ST_NLINK\nstat.ST_SIZE\nstat.ST_UID\nstat.S_ENFMT\nstat.S_IEXEC\nstat.S_IFBLK\nstat.S_IFCHR\nstat.S_IFDIR\nstat.S_IFIFO\nstat.S_IFLNK\nstat.S_IFMT(??)\nstat.S_IFREG\nstat.S_IFSOCK\nstat.S_IMODE(??)\nstat.S_IREAD\nstat.S_IRGRP\nstat.S_IROTH\nstat.S_IRUSR\nstat.S_IRWXG\nstat.S_IRWXO\nstat.S_IRWXU\nstat.S_ISBLK(??)\nstat.S_ISCHR(??)\nstat.S_ISDIR(??)\nstat.S_ISFIFO(??)\nstat.S_ISGID\nstat.S_ISLNK(??)\nstat.S_ISREG(??)\nstat.S_ISSOCK(??)\nstat.S_ISUID\nstat.S_ISVTX\nstat.S_IWGRP\nstat.S_IWOTH\nstat.S_IWRITE\nstat.S_IWUSR\nstat.S_IXGRP\nstat.S_IXOTH\nstat.S_IXUSR\nstaticmethod(function) -> method\nstatvfs.F_BAVAIL\nstatvfs.F_BFREE\nstatvfs.F_BLOCKS\nstatvfs.F_BSIZE\nstatvfs.F_FAVAIL\nstatvfs.F_FFREE\nstatvfs.F_FILES\nstatvfs.F_FLAG\nstatvfs.F_FRSIZE\nstatvfs.F_NAMEMAX\nstr(object) -> string\nstring.Template\nstring.ascii_letters\nstring.ascii_lowercase\nstring.ascii_uppercase\nstring.atof(s) -> float\nstring.atof_error\nstring.atoi(s [,base]) -> int\nstring.atoi_error\nstring.atol(s [,base]) -> long\nstring.atol_error\nstring.capitalize(s) -> string\nstring.capwords(s, [sep]) -> string\nstring.center(s, width[, fillchar]) -> string\nstring.count(s, sub[, start[,end]]) -> int\nstring.digits\nstring.expandtabs(s [,tabsize]) -> string\nstring.find(s, sub [,start [,end]]) -> in\nstring.hexdigits\nstring.index(s, sub [,start [,end]]) -> int\nstring.index_error\nstring.join(list [,sep]) -> string\nstring.joinfields(??)\nstring.letters\nstring.ljust(s, width[, fillchar]) -> string\nstring.lower(s) -> string\nstring.lowercase\nstring.lstrip(s [,chars]) -> string\nstring.maketrans(frm, to) -> string\nstring.octdigits\nstring.printable\nstring.punctuation\nstring.replace (str, old, new[, maxsplit]) -> string\nstring.rfind(s, sub [,start [,end]]) -> int\nstring.rindex(s, sub [,start [,end]]) -> int\nstring.rjust(s, width[, fillchar]) -> string\nstring.rsplit(s [,sep [,maxsplit]]) -> list of strings\nstring.rstrip(s [,chars]) -> string\nstring.split(s [,sep [,maxsplit]]) -> list of strings\nstring.splitfields(??)\nstring.strip(s [,chars]) -> string\nstring.swapcase(s) -> string\nstring.translate(s,table [,deletions]) -> string\nstring.upper(s) -> string\nstring.uppercase\nstring.whitespace\nstring.zfill(x, width) -> string\nstringold.atof(s) -> float\nstringold.atof_error\nstringold.atoi(s [,base]) -> int\nstringold.atoi_error\nstringold.atol(s [,base]) -> long\nstringold.atol_error\nstringold.capitalize(s) -> string\nstringold.capwords(s, [sep]) -> string\nstringold.center(s, width) -> string\nstringold.count(s, sub[, start[,end]]) -> int\nstringold.digits\nstringold.expandtabs(s [,tabsize]) -> string\nstringold.find(s, sub [,start [,end]]) -> in\nstringold.hexdigits\nstringold.index(s, sub [,start [,end]]) -> int\nstringold.index_error\nstringold.join(list [,sep]) -> string\nstringold.joinfields(??)\nstringold.letters\nstringold.ljust(s, width) -> string\nstringold.lower(s) -> string\nstringold.lowercase\nstringold.lstrip(s) -> string\nstringold.maketrans(frm, to) -> string\nstringold.octdigits\nstringold.replace (str, old, new[, maxsplit]) -> string\nstringold.rfind(s, sub [,start [,end]]) -> int\nstringold.rindex(s, sub [,start [,end]]) -> int\nstringold.rjust(s, width) -> string\nstringold.rstrip(s) -> string\nstringold.split(str [,sep [,maxsplit]]) -> list of strings\nstringold.splitfields(??)\nstringold.strip(s) -> string\nstringold.swapcase(s) -> string\nstringold.translate(s,table [,deletechars]) -> string\nstringold.upper(s) -> string\nstringold.uppercase\nstringold.whitespace\nstringold.zfill(x, width) -> string\nstringprep.b1_set\nstringprep.b3_exceptions\nstringprep.c22_specials\nstringprep.c6_set\nstringprep.c7_set\nstringprep.c8_set\nstringprep.c9_set\nstringprep.in_table_a1(??)\nstringprep.in_table_b1(??)\nstringprep.in_table_c11(??)\nstringprep.in_table_c11_c12(??)\nstringprep.in_table_c12(??)\nstringprep.in_table_c21(??)\nstringprep.in_table_c21_c22(??)\nstringprep.in_table_c22(??)\nstringprep.in_table_c3(??)\nstringprep.in_table_c4(??)\nstringprep.in_table_c5(??)\nstringprep.in_table_c6(??)\nstringprep.in_table_c7(??)\nstringprep.in_table_c8(??)\nstringprep.in_table_c9(??)\nstringprep.in_table_d1(??)\nstringprep.in_table_d2(??)\nstringprep.map_table_b2(??)\nstringprep.map_table_b3(??)\nstringprep.unicodedata\nstrop.atof(s) -> float\nstrop.atoi(s [,base]) -> int\nstrop.atol(s [,base]) -> long\nstrop.capitalize(s) -> string\nstrop.count(s, sub[, start[, end]]) -> int\nstrop.expandtabs(string, [tabsize]) -> string\nstrop.find(s, sub [,start [,end]]) -> in\nstrop.join(list [,sep]) -> string\nstrop.joinfields\nstrop.lower(s) -> string\nstrop.lowercase\nstrop.lstrip(s) -> string\nstrop.maketrans(frm, to) -> string\nstrop.replace (str, old, new[, maxsplit]) -> string\nstrop.rfind(s, sub [,start [,end]]) -> int\nstrop.rstrip(s) -> string\nstrop.split(s [,sep [,maxsplit]]) -> list of strings\nstrop.splitfields\nstrop.strip(s) -> string\nstrop.swapcase(s) -> string\nstrop.translate(s,table [,deletechars]) -> string\nstrop.upper(s) -> string\nstrop.uppercase\nstrop.whitespace\nstruct.Struct\nstruct.calcsize(??)\nstruct.error\nstruct.pack(??)\nstruct.pack_into(??)\nstruct.unpack(??)\nstruct.unpack_from(??)\nsubprocess.CalledProcessError\nsubprocess.MAXFD\nsubprocess.PIPE\nsubprocess.Popen\nsubprocess.STDOUT\nsubprocess.call(??)\nsubprocess.check_call(??)\nsubprocess.errno\nsubprocess.fcntl\nsubprocess.list2cmdline(??)\nsubprocess.mswindows\nsubprocess.os\nsubprocess.pickle\nsubprocess.select\nsubprocess.sys\nsubprocess.traceback\nsubprocess.types\nsum(sequence, start=0) -> value\nsunau.AUDIO_FILE_ENCODING_ADPCM_G721\nsunau.AUDIO_FILE_ENCODING_ADPCM_G722\nsunau.AUDIO_FILE_ENCODING_ADPCM_G723_3\nsunau.AUDIO_FILE_ENCODING_ADPCM_G723_5\nsunau.AUDIO_FILE_ENCODING_ALAW_8\nsunau.AUDIO_FILE_ENCODING_DOUBLE\nsunau.AUDIO_FILE_ENCODING_FLOAT\nsunau.AUDIO_FILE_ENCODING_LINEAR_16\nsunau.AUDIO_FILE_ENCODING_LINEAR_24\nsunau.AUDIO_FILE_ENCODING_LINEAR_32\nsunau.AUDIO_FILE_ENCODING_LINEAR_8\nsunau.AUDIO_FILE_ENCODING_MULAW_8\nsunau.AUDIO_FILE_MAGIC\nsunau.AUDIO_UNKNOWN_SIZE\nsunau.Au_read(??)\nsunau.Au_write(??)\nsunau.Error\nsunau.open(??)\nsunau.openfp(??)\nsunaudio.MAGIC\nsunaudio.error\nsunaudio.get_long_be(??)\nsunaudio.gethdr(??)\nsunaudio.printhdr(??)\nsuper(type) -> unbound super object\nsymbol.and_expr\nsymbol.and_test\nsymbol.arglist\nsymbol.argument\nsymbol.arith_expr\nsymbol.assert_stmt\nsymbol.atom\nsymbol.augassign\nsymbol.break_stmt\nsymbol.classdef\nsymbol.comp_op\nsymbol.comparison\nsymbol.compound_stmt\nsymbol.continue_stmt\nsymbol.decorator\nsymbol.decorators\nsymbol.del_stmt\nsymbol.dictmaker\nsymbol.dotted_as_name\nsymbol.dotted_as_names\nsymbol.dotted_name\nsymbol.encoding_decl\nsymbol.eval_input\nsymbol.except_clause\nsymbol.exec_stmt\nsymbol.expr\nsymbol.expr_stmt\nsymbol.exprlist\nsymbol.factor\nsymbol.file_input\nsymbol.flow_stmt\nsymbol.for_stmt\nsymbol.fpdef\nsymbol.fplist\nsymbol.funcdef\nsymbol.gen_for\nsymbol.gen_if\nsymbol.gen_iter\nsymbol.global_stmt\nsymbol.if_stmt\nsymbol.import_as_name\nsymbol.import_as_names\nsymbol.import_from\nsymbol.import_name\nsymbol.import_stmt\nsymbol.lambdef\nsymbol.list_for\nsymbol.list_if\nsymbol.list_iter\nsymbol.listmaker\nsymbol.main(??)\nsymbol.not_test\nsymbol.old_lambdef\nsymbol.old_test\nsymbol.or_test\nsymbol.parameters\nsymbol.pass_stmt\nsymbol.power\nsymbol.print_stmt\nsymbol.raise_stmt\nsymbol.return_stmt\nsymbol.shift_expr\nsymbol.simple_stmt\nsymbol.single_input\nsymbol.sliceop\nsymbol.small_stmt\nsymbol.stmt\nsymbol.subscript\nsymbol.subscriptlist\nsymbol.suite\nsymbol.sym_name\nsymbol.term\nsymbol.test\nsymbol.testlist\nsymbol.testlist1\nsymbol.testlist_gexp\nsymbol.testlist_safe\nsymbol.trailer\nsymbol.try_stmt\nsymbol.varargslist\nsymbol.while_stmt\nsymbol.with_stmt\nsymbol.with_var\nsymbol.xor_expr\nsymbol.yield_expr\nsymbol.yield_stmt\nsymtable.Class(??)\nsymtable.DEF_BOUND\nsymtable.DEF_DOUBLESTAR\nsymtable.DEF_FREE\nsymtable.DEF_FREE_CLASS\nsymtable.DEF_FREE_GLOBAL\nsymtable.DEF_GLOBAL\nsymtable.DEF_IMPORT\nsymtable.DEF_INTUPLE\nsymtable.DEF_LOCAL\nsymtable.DEF_PARAM\nsymtable.DEF_STAR\nsymtable.Function(??)\nsymtable.OPT_BARE_EXEC\nsymtable.OPT_EXEC\nsymtable.OPT_IMPORT_STAR\nsymtable.Symbol(??)\nsymtable.SymbolTable(??)\nsymtable.SymbolTableFactory(??)\nsymtable.USE\nsymtable.is_free(??)\nsymtable.newSymbolTable\nsymtable.symtable(??)\nsymtable.weakref\nsys.api_version\nsys.argv\nsys.builtin_module_names\nsys.byteorder\nsys.call_tracing(func, args) -> object\nsys.callstats() -> tuple of integers\nsys.copyright\nsys.displayhook(object) -> None\nsys.exc_clear() -> None\nsys.exc_info() -> (type, value, traceback)\nsys.exc_type\nsys.excepthook(exctype, value, traceback) -> None\nsys.exec_prefix\nsys.executable\nsys.exit([status])\nsys.getcheckinterval() -> current check interval; see setcheckinterval().\nsys.getdefaultencoding() -> string\nsys.getdlopenflags() -> int\nsys.getfilesystemencoding() -> string\nsys.getrecursionlimit()\nsys.getrefcount(object) -> integer\nsys.hexversion\nsys.maxint\nsys.maxunicode\nsys.meta_path\nsys.modules\nsys.path\nsys.path_hooks\nsys.path_importer_cache\nsys.platform\nsys.prefix\nsys.setappdefaultencoding\nsys.setcheckinterval(n)\nsys.setdlopenflags(n) -> None\nsys.setprofile(function)\nsys.setrecursionlimit(n)\nsys.settrace(function)\nsys.stderr\nsys.stdin\nsys.stdout\nsys.subversion\nsys.version\nsys.version_info\nsys.warnoptions\nsyslog.LOG_ALERT\nsyslog.LOG_AUTH\nsyslog.LOG_CONS\nsyslog.LOG_CRIT\nsyslog.LOG_CRON\nsyslog.LOG_DAEMON\nsyslog.LOG_DEBUG\nsyslog.LOG_EMERG\nsyslog.LOG_ERR\nsyslog.LOG_INFO\nsyslog.LOG_KERN\nsyslog.LOG_LOCAL0\nsyslog.LOG_LOCAL1\nsyslog.LOG_LOCAL2\nsyslog.LOG_LOCAL3\nsyslog.LOG_LOCAL4\nsyslog.LOG_LOCAL5\nsyslog.LOG_LOCAL6\nsyslog.LOG_LOCAL7\nsyslog.LOG_LPR\nsyslog.LOG_MAIL\nsyslog.LOG_MASK\nsyslog.LOG_NDELAY\nsyslog.LOG_NEWS\nsyslog.LOG_NOTICE\nsyslog.LOG_NOWAIT\nsyslog.LOG_PERROR\nsyslog.LOG_PID\nsyslog.LOG_SYSLOG\nsyslog.LOG_UPTO\nsyslog.LOG_USER\nsyslog.LOG_UUCP\nsyslog.LOG_WARNING\nsyslog.closelog\nsyslog.openlog\nsyslog.setlogmask\nsyslog.syslog\ntabnanny.NannyNag\ntabnanny.Whitespace(??)\ntabnanny.check(file_or_dir)\ntabnanny.errprint(??)\ntabnanny.filename_only\ntabnanny.format_witnesses(??)\ntabnanny.getopt\ntabnanny.main(??)\ntabnanny.os\ntabnanny.process_tokens(??)\ntabnanny.sys\ntabnanny.tokenize\ntabnanny.verbose\ntarfile.AREGTYPE\ntarfile.BLKTYPE\ntarfile.BLOCKSIZE\ntarfile.CHRTYPE\ntarfile.CONTTYPE\ntarfile.CompressionError\ntarfile.DIRTYPE\ntarfile.ExFileObject\ntarfile.ExtractError\ntarfile.FIFOTYPE\ntarfile.GNUTYPE_LONGLINK\ntarfile.GNUTYPE_LONGNAME\ntarfile.GNUTYPE_SPARSE\ntarfile.LENGTH_LINK\ntarfile.LENGTH_NAME\ntarfile.LENGTH_PREFIX\ntarfile.LNKTYPE\ntarfile.MAGIC\ntarfile.MAXSIZE_MEMBER\ntarfile.NUL\ntarfile.RECORDSIZE\ntarfile.REGTYPE\ntarfile.REGULAR_TYPES\ntarfile.ReadError\ntarfile.SUPPORTED_TYPES\ntarfile.SYMTYPE\ntarfile.S_IFBLK\ntarfile.S_IFCHR\ntarfile.S_IFDIR\ntarfile.S_IFIFO\ntarfile.S_IFLNK\ntarfile.S_IFREG\ntarfile.StreamError\ntarfile.TAR_GZIPPED\ntarfile.TAR_PLAIN\ntarfile.TGEXEC\ntarfile.TGREAD\ntarfile.TGWRITE\ntarfile.TOEXEC\ntarfile.TOREAD\ntarfile.TOWRITE\ntarfile.TSGID\ntarfile.TSUID\ntarfile.TSVTX\ntarfile.TUEXEC\ntarfile.TUREAD\ntarfile.TUWRITE\ntarfile.TarError\ntarfile.TarFile\ntarfile.TarFileCompat(??)\ntarfile.TarInfo\ntarfile.TarIter(??)\ntarfile.VERSION\ntarfile.calc_chksums(??)\ntarfile.copy\ntarfile.copyfileobj(??)\ntarfile.errno\ntarfile.filemode(??)\ntarfile.filemode_table\ntarfile.grp\ntarfile.is_tarfile(??)\ntarfile.itn(??)\ntarfile.normpath(??)\ntarfile.nti(??)\ntarfile.open\ntarfile.os\ntarfile.pwd\ntarfile.shutil\ntarfile.stat\ntarfile.stn(??)\ntarfile.struct\ntarfile.sys\ntarfile.time\ntarfile.version\ntelnetlib.AO\ntelnetlib.AUTHENTICATION\ntelnetlib.AYT\ntelnetlib.BINARY\ntelnetlib.BM\ntelnetlib.BRK\ntelnetlib.CHARSET\ntelnetlib.COM_PORT_OPTION\ntelnetlib.DEBUGLEVEL\ntelnetlib.DET\ntelnetlib.DM\ntelnetlib.DO\ntelnetlib.DONT\ntelnetlib.EC\ntelnetlib.ECHO\ntelnetlib.EL\ntelnetlib.ENCRYPT\ntelnetlib.EOR\ntelnetlib.EXOPL\ntelnetlib.FORWARD_X\ntelnetlib.GA\ntelnetlib.IAC\ntelnetlib.IP\ntelnetlib.KERMIT\ntelnetlib.LFLOW\ntelnetlib.LINEMODE\ntelnetlib.LOGOUT\ntelnetlib.NAMS\ntelnetlib.NAOCRD\ntelnetlib.NAOFFD\ntelnetlib.NAOHTD\ntelnetlib.NAOHTS\ntelnetlib.NAOL\ntelnetlib.NAOLFD\ntelnetlib.NAOP\ntelnetlib.NAOVTD\ntelnetlib.NAOVTS\ntelnetlib.NAWS\ntelnetlib.NEW_ENVIRON\ntelnetlib.NOOPT\ntelnetlib.NOP\ntelnetlib.OLD_ENVIRON\ntelnetlib.OUTMRK\ntelnetlib.PRAGMA_HEARTBEAT\ntelnetlib.PRAGMA_LOGON\ntelnetlib.RCP\ntelnetlib.RCTE\ntelnetlib.RSP\ntelnetlib.SB\ntelnetlib.SE\ntelnetlib.SEND_URL\ntelnetlib.SGA\ntelnetlib.SNDLOC\ntelnetlib.SSPI_LOGON\ntelnetlib.STATUS\ntelnetlib.SUPDUP\ntelnetlib.SUPDUPOUTPUT\ntelnetlib.SUPPRESS_LOCAL_ECHO\ntelnetlib.TELNET_PORT\ntelnetlib.TLS\ntelnetlib.TM\ntelnetlib.TN3270E\ntelnetlib.TSPEED\ntelnetlib.TTYLOC\ntelnetlib.TTYPE\ntelnetlib.TUID\ntelnetlib.Telnet(??)\ntelnetlib.VT3270REGIME\ntelnetlib.WILL\ntelnetlib.WONT\ntelnetlib.X3PAD\ntelnetlib.XASCII\ntelnetlib.XAUTH\ntelnetlib.XDISPLOC\ntelnetlib.select\ntelnetlib.socket\ntelnetlib.sys\ntelnetlib.test(??)\ntelnetlib.theNULL\ntempfile.NamedTemporaryFile(??)\ntempfile.TMP_MAX\ntempfile.TemporaryFile(??)\ntempfile.gettempdir(??)\ntempfile.gettempprefix(??)\ntempfile.mkdtemp([suffix, [prefix, [dir]]])\ntempfile.mkstemp([suffix, [prefix, [dir, [text]]]])\ntempfile.mktemp([suffix, [prefix, [dir]]])\ntempfile.tempdir\ntempfile.template\ntermios.B0\ntermios.B110\ntermios.B115200\ntermios.B1200\ntermios.B134\ntermios.B150\ntermios.B1800\ntermios.B19200\ntermios.B200\ntermios.B230400\ntermios.B2400\ntermios.B300\ntermios.B38400\ntermios.B460800\ntermios.B4800\ntermios.B50\ntermios.B57600\ntermios.B600\ntermios.B75\ntermios.B9600\ntermios.BRKINT\ntermios.BS0\ntermios.BS1\ntermios.BSDLY\ntermios.CBAUD\ntermios.CBAUDEX\ntermios.CDSUSP\ntermios.CEOF\ntermios.CEOL\ntermios.CEOT\ntermios.CERASE\ntermios.CFLUSH\ntermios.CIBAUD\ntermios.CINTR\ntermios.CKILL\ntermios.CLNEXT\ntermios.CLOCAL\ntermios.CQUIT\ntermios.CR0\ntermios.CR1\ntermios.CR2\ntermios.CR3\ntermios.CRDLY\ntermios.CREAD\ntermios.CRPRNT\ntermios.CRTSCTS\ntermios.CS5\ntermios.CS6\ntermios.CS7\ntermios.CS8\ntermios.CSIZE\ntermios.CSTART\ntermios.CSTOP\ntermios.CSTOPB\ntermios.CSUSP\ntermios.CWERASE\ntermios.ECHO\ntermios.ECHOCTL\ntermios.ECHOE\ntermios.ECHOK\ntermios.ECHOKE\ntermios.ECHONL\ntermios.ECHOPRT\ntermios.EXTA\ntermios.EXTB\ntermios.FF0\ntermios.FF1\ntermios.FFDLY\ntermios.FIOASYNC\ntermios.FIOCLEX\ntermios.FIONBIO\ntermios.FIONCLEX\ntermios.FIONREAD\ntermios.FLUSHO\ntermios.HUPCL\ntermios.ICANON\ntermios.ICRNL\ntermios.IEXTEN\ntermios.IGNBRK\ntermios.IGNCR\ntermios.IGNPAR\ntermios.IMAXBEL\ntermios.INLCR\ntermios.INPCK\ntermios.IOCSIZE_MASK\ntermios.IOCSIZE_SHIFT\ntermios.ISIG\ntermios.ISTRIP\ntermios.IUCLC\ntermios.IXANY\ntermios.IXOFF\ntermios.IXON\ntermios.NCC\ntermios.NCCS\ntermios.NL0\ntermios.NL1\ntermios.NLDLY\ntermios.NOFLSH\ntermios.N_MOUSE\ntermios.N_PPP\ntermios.N_SLIP\ntermios.N_STRIP\ntermios.N_TTY\ntermios.OCRNL\ntermios.OFDEL\ntermios.OFILL\ntermios.OLCUC\ntermios.ONLCR\ntermios.ONLRET\ntermios.ONOCR\ntermios.OPOST\ntermios.PARENB\ntermios.PARMRK\ntermios.PARODD\ntermios.PENDIN\ntermios.TAB0\ntermios.TAB1\ntermios.TAB2\ntermios.TAB3\ntermios.TABDLY\ntermios.TCFLSH\ntermios.TCGETA\ntermios.TCGETS\ntermios.TCIFLUSH\ntermios.TCIOFF\ntermios.TCIOFLUSH\ntermios.TCION\ntermios.TCOFLUSH\ntermios.TCOOFF\ntermios.TCOON\ntermios.TCSADRAIN\ntermios.TCSAFLUSH\ntermios.TCSANOW\ntermios.TCSBRK\ntermios.TCSBRKP\ntermios.TCSETA\ntermios.TCSETAF\ntermios.TCSETAW\ntermios.TCSETS\ntermios.TCSETSF\ntermios.TCSETSW\ntermios.TCXONC\ntermios.TIOCCONS\ntermios.TIOCEXCL\ntermios.TIOCGETD\ntermios.TIOCGICOUNT\ntermios.TIOCGLCKTRMIOS\ntermios.TIOCGPGRP\ntermios.TIOCGSERIAL\ntermios.TIOCGSOFTCAR\ntermios.TIOCGWINSZ\ntermios.TIOCINQ\ntermios.TIOCLINUX\ntermios.TIOCMBIC\ntermios.TIOCMBIS\ntermios.TIOCMGET\ntermios.TIOCMIWAIT\ntermios.TIOCMSET\ntermios.TIOCM_CAR\ntermios.TIOCM_CD\ntermios.TIOCM_CTS\ntermios.TIOCM_DSR\ntermios.TIOCM_DTR\ntermios.TIOCM_LE\ntermios.TIOCM_RI\ntermios.TIOCM_RNG\ntermios.TIOCM_RTS\ntermios.TIOCM_SR\ntermios.TIOCM_ST\ntermios.TIOCNOTTY\ntermios.TIOCNXCL\ntermios.TIOCOUTQ\ntermios.TIOCPKT\ntermios.TIOCPKT_DATA\ntermios.TIOCPKT_DOSTOP\ntermios.TIOCPKT_FLUSHREAD\ntermios.TIOCPKT_FLUSHWRITE\ntermios.TIOCPKT_NOSTOP\ntermios.TIOCPKT_START\ntermios.TIOCPKT_STOP\ntermios.TIOCSCTTY\ntermios.TIOCSERCONFIG\ntermios.TIOCSERGETLSR\ntermios.TIOCSERGETMULTI\ntermios.TIOCSERGSTRUCT\ntermios.TIOCSERGWILD\ntermios.TIOCSERSETMULTI\ntermios.TIOCSERSWILD\ntermios.TIOCSER_TEMT\ntermios.TIOCSETD\ntermios.TIOCSLCKTRMIOS\ntermios.TIOCSPGRP\ntermios.TIOCSSERIAL\ntermios.TIOCSSOFTCAR\ntermios.TIOCSTI\ntermios.TIOCSWINSZ\ntermios.TOSTOP\ntermios.VDISCARD\ntermios.VEOF\ntermios.VEOL\ntermios.VEOL2\ntermios.VERASE\ntermios.VINTR\ntermios.VKILL\ntermios.VLNEXT\ntermios.VMIN\ntermios.VQUIT\ntermios.VREPRINT\ntermios.VSTART\ntermios.VSTOP\ntermios.VSUSP\ntermios.VSWTC\ntermios.VSWTCH\ntermios.VT0\ntermios.VT1\ntermios.VTDLY\ntermios.VTIME\ntermios.VWERASE\ntermios.XCASE\ntermios.XTABS\ntermios.error\ntermios.tcdrain(fd) -> None\ntermios.tcflow(fd, action) -> None\ntermios.tcflush(fd, queue) -> None\ntermios.tcgetattr(fd) -> list_of_attrs\ntermios.tcsendbreak(fd, duration) -> None\ntermios.tcsetattr(fd, when, attributes) -> None\ntextwrap.TextWrapper(??)\ntextwrap.dedent(??)\ntextwrap.fill(??)\ntextwrap.re\ntextwrap.string\ntextwrap.wrap(??)\nthis.c\nthis.d\nthis.i\nthis.s\nthread.LockType\nthread.allocate\nthread.allocate_lock() -> lock object\nthread.error\nthread.exit()\nthread.exit_thread\nthread.get_ident() -> integer\nthread.interrupt_main()\nthread.stack_size([size]) -> size\nthread.start_new\nthread.start_new_thread(function, args[, kwargs])\nthreading.BoundedSemaphore(??)\nthreading.Condition(??)\nthreading.Event(??)\nthreading.Lock\nthreading.RLock(??)\nthreading.Semaphore(??)\nthreading.Thread\nthreading.ThreadError\nthreading.Timer(??)\nthreading.activeCount(??)\nthreading.currentThread(??)\nthreading.deque(iterable) --> deque object\nthreading.enumerate(??)\nthreading.local\nthreading.setprofile(??)\nthreading.settrace(??)\nthreading.stack_size([size]) -> size\ntime.accept2dyear\ntime.altzone\ntime.asctime([tuple]) -> string\ntime.clock() -> floating point number\ntime.ctime(seconds) -> string\ntime.daylight\ntime.gmtime([seconds]) -> (tm_year, tm_mon, tm_day, tm_hour, tm_min,\ntime.localtime([seconds]) -> (tm_year,tm_mon,tm_day,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)\ntime.mktime(tuple) -> floating point number\ntime.sleep(seconds)\ntime.strftime(format[, tuple]) -> string\ntime.strptime(string, format) -> struct_time\ntime.struct_time\ntime.time() -> floating point number\ntime.timezone\ntime.tzname\ntime.tzset(zone)\ntimeit.Timer(??)\ntimeit.default_number\ntimeit.default_repeat\ntimeit.default_timer\ntimeit.dummy_src_name\ntimeit.gc\ntimeit.itertools\ntimeit.main(??)\ntimeit.reindent(??)\ntimeit.sys\ntimeit.template\ntimeit.time\ntoaiff.error\ntoaiff.os\ntoaiff.pipes\ntoaiff.sndhdr\ntoaiff.t\ntoaiff.table\ntoaiff.tempfile\ntoaiff.toaiff(??)\ntoaiff.uncompress\ntoken.AMPER\ntoken.AMPEREQUAL\ntoken.AT\ntoken.BACKQUOTE\ntoken.CIRCUMFLEX\ntoken.CIRCUMFLEXEQUAL\ntoken.COLON\ntoken.COMMA\ntoken.DEDENT\ntoken.DOT\ntoken.DOUBLESLASH\ntoken.DOUBLESLASHEQUAL\ntoken.DOUBLESTAR\ntoken.DOUBLESTAREQUAL\ntoken.ENDMARKER\ntoken.EQEQUAL\ntoken.EQUAL\ntoken.ERRORTOKEN\ntoken.GREATER\ntoken.GREATEREQUAL\ntoken.INDENT\ntoken.ISEOF(??)\ntoken.ISNONTERMINAL(??)\ntoken.ISTERMINAL(??)\ntoken.LBRACE\ntoken.LEFTSHIFT\ntoken.LEFTSHIFTEQUAL\ntoken.LESS\ntoken.LESSEQUAL\ntoken.LPAR\ntoken.LSQB\ntoken.MINEQUAL\ntoken.MINUS\ntoken.NAME\ntoken.NEWLINE\ntoken.NOTEQUAL\ntoken.NT_OFFSET\ntoken.NUMBER\ntoken.N_TOKENS\ntoken.OP\ntoken.PERCENT\ntoken.PERCENTEQUAL\ntoken.PLUS\ntoken.PLUSEQUAL\ntoken.RBRACE\ntoken.RIGHTSHIFT\ntoken.RIGHTSHIFTEQUAL\ntoken.RPAR\ntoken.RSQB\ntoken.SEMI\ntoken.SLASH\ntoken.SLASHEQUAL\ntoken.STAR\ntoken.STAREQUAL\ntoken.STRING\ntoken.TILDE\ntoken.VBAR\ntoken.VBAREQUAL\ntoken.main(??)\ntoken.tok_name\ntokenize.AMPER\ntokenize.AMPEREQUAL\ntokenize.AT\ntokenize.BACKQUOTE\ntokenize.Bracket\ntokenize.CIRCUMFLEX\ntokenize.CIRCUMFLEXEQUAL\ntokenize.COLON\ntokenize.COMMA\ntokenize.COMMENT\ntokenize.Comment\ntokenize.ContStr\ntokenize.DEDENT\ntokenize.DOT\ntokenize.DOUBLESLASH\ntokenize.DOUBLESLASHEQUAL\ntokenize.DOUBLESTAR\ntokenize.DOUBLESTAREQUAL\ntokenize.Decnumber\ntokenize.Double\ntokenize.Double3\ntokenize.ENDMARKER\ntokenize.EQEQUAL\ntokenize.EQUAL\ntokenize.ERRORTOKEN\ntokenize.Expfloat\ntokenize.Exponent\ntokenize.Floatnumber\ntokenize.Funny\ntokenize.GREATER\ntokenize.GREATEREQUAL\ntokenize.Hexnumber\ntokenize.INDENT\ntokenize.ISEOF(??)\ntokenize.ISNONTERMINAL(??)\ntokenize.ISTERMINAL(??)\ntokenize.Ignore\ntokenize.Imagnumber\ntokenize.Intnumber\ntokenize.LBRACE\ntokenize.LEFTSHIFT\ntokenize.LEFTSHIFTEQUAL\ntokenize.LESS\ntokenize.LESSEQUAL\ntokenize.LPAR\ntokenize.LSQB\ntokenize.MINEQUAL\ntokenize.MINUS\ntokenize.NAME\ntokenize.NEWLINE\ntokenize.NL\ntokenize.NOTEQUAL\ntokenize.NT_OFFSET\ntokenize.NUMBER\ntokenize.N_TOKENS\ntokenize.Name\ntokenize.Number\ntokenize.OP\ntokenize.Octnumber\ntokenize.Operator\ntokenize.PERCENT\ntokenize.PERCENTEQUAL\ntokenize.PLUS\ntokenize.PLUSEQUAL\ntokenize.PlainToken\ntokenize.Pointfloat\ntokenize.PseudoExtras\ntokenize.PseudoToken\ntokenize.RBRACE\ntokenize.RIGHTSHIFT\ntokenize.RIGHTSHIFTEQUAL\ntokenize.RPAR\ntokenize.RSQB\ntokenize.SEMI\ntokenize.SLASH\ntokenize.SLASHEQUAL\ntokenize.STAR\ntokenize.STAREQUAL\ntokenize.STRING\ntokenize.Single\ntokenize.Single3\ntokenize.Special\ntokenize.StopTokenizing\ntokenize.String\ntokenize.TILDE\ntokenize.Token\ntokenize.TokenError\ntokenize.Triple\ntokenize.VBAR\ntokenize.VBAREQUAL\ntokenize.Whitespace\ntokenize.any(??)\ntokenize.double3prog\ntokenize.endprogs\ntokenize.generate_tokens(??)\ntokenize.group(??)\ntokenize.main(??)\ntokenize.maybe(??)\ntokenize.printtoken(??)\ntokenize.pseudoprog\ntokenize.re\ntokenize.single3prog\ntokenize.single_quoted\ntokenize.string\ntokenize.t\ntokenize.tabsize\ntokenize.tok_name\ntokenize.tokenize(??)\ntokenize.tokenize_loop(??)\ntokenize.tokenprog\ntokenize.triple_quoted\ntokenize.untokenize(??)\ntrace.CoverageResults(??)\ntrace.Ignore(??)\ntrace.PRAGMA_NOCOVER\ntrace.Trace(??)\ntrace.cPickle\ntrace.find_executable_linenos(??)\ntrace.find_lines(??)\ntrace.find_lines_from_code(??)\ntrace.find_strings(??)\ntrace.fullmodname(??)\ntrace.gc\ntrace.linecache\ntrace.main(??)\ntrace.modname(??)\ntrace.os\ntrace.pickle\ntrace.re\ntrace.rx_blank\ntrace.sys\ntrace.threading\ntrace.token\ntrace.tokenize\ntrace.types\ntrace.usage(??)\ntraceback.extract_stack(??)\ntraceback.extract_tb(??)\ntraceback.format_exc(??)\ntraceback.format_exception(??)\ntraceback.format_exception_only(??)\ntraceback.format_list(??)\ntraceback.format_stack(??)\ntraceback.format_tb(??)\ntraceback.linecache\ntraceback.print_exc(??)\ntraceback.print_exception(??)\ntraceback.print_last(??)\ntraceback.print_list(??)\ntraceback.print_stack(??)\ntraceback.print_tb(??)\ntraceback.sys\ntraceback.tb_lineno(??)\ntraceback.types\ntty.B0\ntty.B110\ntty.B115200\ntty.B1200\ntty.B134\ntty.B150\ntty.B1800\ntty.B19200\ntty.B200\ntty.B230400\ntty.B2400\ntty.B300\ntty.B38400\ntty.B460800\ntty.B4800\ntty.B50\ntty.B57600\ntty.B600\ntty.B75\ntty.B9600\ntty.BRKINT\ntty.BS0\ntty.BS1\ntty.BSDLY\ntty.CBAUD\ntty.CBAUDEX\ntty.CC\ntty.CDSUSP\ntty.CEOF\ntty.CEOL\ntty.CEOT\ntty.CERASE\ntty.CFLAG\ntty.CFLUSH\ntty.CIBAUD\ntty.CINTR\ntty.CKILL\ntty.CLNEXT\ntty.CLOCAL\ntty.CQUIT\ntty.CR0\ntty.CR1\ntty.CR2\ntty.CR3\ntty.CRDLY\ntty.CREAD\ntty.CRPRNT\ntty.CRTSCTS\ntty.CS5\ntty.CS6\ntty.CS7\ntty.CS8\ntty.CSIZE\ntty.CSTART\ntty.CSTOP\ntty.CSTOPB\ntty.CSUSP\ntty.CWERASE\ntty.ECHO\ntty.ECHOCTL\ntty.ECHOE\ntty.ECHOK\ntty.ECHOKE\ntty.ECHONL\ntty.ECHOPRT\ntty.EXTA\ntty.EXTB\ntty.FF0\ntty.FF1\ntty.FFDLY\ntty.FIOASYNC\ntty.FIOCLEX\ntty.FIONBIO\ntty.FIONCLEX\ntty.FIONREAD\ntty.FLUSHO\ntty.HUPCL\ntty.ICANON\ntty.ICRNL\ntty.IEXTEN\ntty.IFLAG\ntty.IGNBRK\ntty.IGNCR\ntty.IGNPAR\ntty.IMAXBEL\ntty.INLCR\ntty.INPCK\ntty.IOCSIZE_MASK\ntty.IOCSIZE_SHIFT\ntty.ISIG\ntty.ISPEED\ntty.ISTRIP\ntty.IUCLC\ntty.IXANY\ntty.IXOFF\ntty.IXON\ntty.LFLAG\ntty.NCC\ntty.NCCS\ntty.NL0\ntty.NL1\ntty.NLDLY\ntty.NOFLSH\ntty.N_MOUSE\ntty.N_PPP\ntty.N_SLIP\ntty.N_STRIP\ntty.N_TTY\ntty.OCRNL\ntty.OFDEL\ntty.OFILL\ntty.OFLAG\ntty.OLCUC\ntty.ONLCR\ntty.ONLRET\ntty.ONOCR\ntty.OPOST\ntty.OSPEED\ntty.PARENB\ntty.PARMRK\ntty.PARODD\ntty.PENDIN\ntty.TAB0\ntty.TAB1\ntty.TAB2\ntty.TAB3\ntty.TABDLY\ntty.TCFLSH\ntty.TCGETA\ntty.TCGETS\ntty.TCIFLUSH\ntty.TCIOFF\ntty.TCIOFLUSH\ntty.TCION\ntty.TCOFLUSH\ntty.TCOOFF\ntty.TCOON\ntty.TCSADRAIN\ntty.TCSAFLUSH\ntty.TCSANOW\ntty.TCSBRK\ntty.TCSBRKP\ntty.TCSETA\ntty.TCSETAF\ntty.TCSETAW\ntty.TCSETS\ntty.TCSETSF\ntty.TCSETSW\ntty.TCXONC\ntty.TIOCCONS\ntty.TIOCEXCL\ntty.TIOCGETD\ntty.TIOCGICOUNT\ntty.TIOCGLCKTRMIOS\ntty.TIOCGPGRP\ntty.TIOCGSERIAL\ntty.TIOCGSOFTCAR\ntty.TIOCGWINSZ\ntty.TIOCINQ\ntty.TIOCLINUX\ntty.TIOCMBIC\ntty.TIOCMBIS\ntty.TIOCMGET\ntty.TIOCMIWAIT\ntty.TIOCMSET\ntty.TIOCM_CAR\ntty.TIOCM_CD\ntty.TIOCM_CTS\ntty.TIOCM_DSR\ntty.TIOCM_DTR\ntty.TIOCM_LE\ntty.TIOCM_RI\ntty.TIOCM_RNG\ntty.TIOCM_RTS\ntty.TIOCM_SR\ntty.TIOCM_ST\ntty.TIOCNOTTY\ntty.TIOCNXCL\ntty.TIOCOUTQ\ntty.TIOCPKT\ntty.TIOCPKT_DATA\ntty.TIOCPKT_DOSTOP\ntty.TIOCPKT_FLUSHREAD\ntty.TIOCPKT_FLUSHWRITE\ntty.TIOCPKT_NOSTOP\ntty.TIOCPKT_START\ntty.TIOCPKT_STOP\ntty.TIOCSCTTY\ntty.TIOCSERCONFIG\ntty.TIOCSERGETLSR\ntty.TIOCSERGETMULTI\ntty.TIOCSERGSTRUCT\ntty.TIOCSERGWILD\ntty.TIOCSERSETMULTI\ntty.TIOCSERSWILD\ntty.TIOCSER_TEMT\ntty.TIOCSETD\ntty.TIOCSLCKTRMIOS\ntty.TIOCSPGRP\ntty.TIOCSSERIAL\ntty.TIOCSSOFTCAR\ntty.TIOCSTI\ntty.TIOCSWINSZ\ntty.TOSTOP\ntty.VDISCARD\ntty.VEOF\ntty.VEOL\ntty.VEOL2\ntty.VERASE\ntty.VINTR\ntty.VKILL\ntty.VLNEXT\ntty.VMIN\ntty.VQUIT\ntty.VREPRINT\ntty.VSTART\ntty.VSTOP\ntty.VSUSP\ntty.VSWTC\ntty.VSWTCH\ntty.VT0\ntty.VT1\ntty.VTDLY\ntty.VTIME\ntty.VWERASE\ntty.XCASE\ntty.XTABS\ntty.error\ntty.setcbreak(??)\ntty.setraw(??)\ntty.tcdrain(fd) -> None\ntty.tcflow(fd, action) -> None\ntty.tcflush(fd, queue) -> None\ntty.tcgetattr(fd) -> list_of_attrs\ntty.tcsendbreak(fd, duration) -> None\ntty.tcsetattr(fd, when, attributes) -> None\ntuple() -> an empty tuple\ntype(object) -> the object's type\ntypes.BooleanType\ntypes.BufferType\ntypes.BuiltinFunctionType\ntypes.BuiltinMethodType\ntypes.ClassType\ntypes.CodeType\ntypes.ComplexType\ntypes.DictProxyType\ntypes.DictType\ntypes.DictionaryType\ntypes.EllipsisType\ntypes.FileType\ntypes.FloatType\ntypes.FrameType\ntypes.FunctionType\ntypes.GeneratorType\ntypes.GetSetDescriptorType\ntypes.InstanceType\ntypes.IntType\ntypes.LambdaType\ntypes.ListType\ntypes.LongType\ntypes.MemberDescriptorType\ntypes.MethodType\ntypes.ModuleType\ntypes.NoneType\ntypes.NotImplementedType\ntypes.ObjectType\ntypes.SliceType\ntypes.StringType\ntypes.StringTypes\ntypes.TracebackType\ntypes.TupleType\ntypes.TypeType\ntypes.UnboundMethodType\ntypes.UnicodeType\ntypes.XRangeType\nunichr(i) -> Unicode character\nunicode(string [, encoding[, errors]]) -> object\nunicodedata.UCD\nunicodedata.bidirectional(unichr)\nunicodedata.category(unichr)\nunicodedata.combining(unichr)\nunicodedata.decimal(unichr[, default])\nunicodedata.decomposition(unichr)\nunicodedata.digit(unichr[, default])\nunicodedata.east_asian_width(unichr)\nunicodedata.lookup(name)\nunicodedata.mirrored(unichr)\nunicodedata.name(unichr[, default])\nunicodedata.normalize(form, unistr)\nunicodedata.numeric(unichr[, default])\nunicodedata.ucd_3_2_0\nunicodedata.ucnhash_CAPI\nunicodedata.unidata_version\nunittest.FunctionTestCase\nunittest.TestCase\nunittest.TestLoader\nunittest.TestProgram\nunittest.TestResult\nunittest.TestSuite\nunittest.TextTestRunner\nunittest.defaultTestLoader\nunittest.findTestCases(??)\nunittest.getTestCaseNames(??)\nunittest.main\nunittest.makeSuite(??)\nunittest.os\nunittest.sys\nunittest.time\nunittest.traceback\nunittest.types\nurllib.ContentTooShortError\nurllib.FancyURLopener(??)\nurllib.MAXFTPCACHE\nurllib.URLopener(??)\nurllib.addbase(??)\nurllib.addclosehook(??)\nurllib.addinfo(??)\nurllib.addinfourl(??)\nurllib.always_safe\nurllib.basejoin(??)\nurllib.ftpcache\nurllib.ftperrors(??)\nurllib.ftpwrapper(??)\nurllib.getproxies(??)\nurllib.getproxies_environment(??)\nurllib.localhost(??)\nurllib.main(??)\nurllib.noheaders(??)\nurllib.os\nurllib.pathname2url(??)\nurllib.proxy_bypass(??)\nurllib.quote('abc def') -> 'abc%20def'\nurllib.quote_plus(??)\nurllib.reporthook(??)\nurllib.socket\nurllib.splitattr('/path;attr1=value1;attr2=value2;...') ->\nurllib.splitgophertype('/Xselector') --> 'X', 'selector'.\nurllib.splithost('//host[:port]/path') --> 'host[:port]', '/path'.\nurllib.splitnport(??)\nurllib.splitpasswd('user:passwd') -> 'user', 'passwd'.\nurllib.splitport('host:port') --> 'host', 'port'.\nurllib.splitquery('/path?query') --> '/path', 'query'.\nurllib.splittag('/path#tag') --> '/path', 'tag'.\nurllib.splittype('type:opaquestring') --> 'type', 'opaquestring'.\nurllib.splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.\nurllib.splitvalue('attr=value') --> 'attr', 'value'.\nurllib.string\nurllib.sys\nurllib.test(??)\nurllib.test1(??)\nurllib.thishost(??)\nurllib.time\nurllib.toBytes(u\"URL\") --> 'URL'.\nurllib.unquote('abc%20def') -> 'abc def'.\nurllib.unquote_plus(??)\nurllib.unwrap('<URL:type://host/path>') --> 'type://host/path'.\nurllib.url2pathname(??)\nurllib.urlcleanup(??)\nurllib.urlencode(??)\nurllib.urlopen(url [, data]) -> open file-like object\nurllib.urlretrieve(??)\nurllib2.AbstractBasicAuthHandler(??)\nurllib2.AbstractDigestAuthHandler(??)\nurllib2.AbstractHTTPHandler(??)\nurllib2.BaseHandler(??)\nurllib2.CacheFTPHandler(??)\nurllib2.FTPHandler(??)\nurllib2.FileHandler(??)\nurllib2.GopherError\nurllib2.GopherHandler(??)\nurllib2.HTTPBasicAuthHandler(??)\nurllib2.HTTPCookieProcessor(??)\nurllib2.HTTPDefaultErrorHandler(??)\nurllib2.HTTPDigestAuthHandler(??)\nurllib2.HTTPError\nurllib2.HTTPErrorProcessor(??)\nurllib2.HTTPHandler(??)\nurllib2.HTTPPasswordMgr(??)\nurllib2.HTTPPasswordMgrWithDefaultRealm(??)\nurllib2.HTTPRedirectHandler(??)\nurllib2.HTTPSHandler(??)\nurllib2.OpenerDirector(??)\nurllib2.ProxyBasicAuthHandler(??)\nurllib2.ProxyDigestAuthHandler(??)\nurllib2.ProxyHandler(??)\nurllib2.Request(??)\nurllib2.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nurllib2.URLError\nurllib2.UnknownHandler(??)\nurllib2.addinfourl(??)\nurllib2.base64\nurllib2.bisect\nurllib2.build_opener(??)\nurllib2.ftpwrapper(??)\nurllib2.getproxies(??)\nurllib2.hashlib\nurllib2.httplib\nurllib2.install_opener(??)\nurllib2.localhost(??)\nurllib2.mimetools\nurllib2.noheaders(??)\nurllib2.os\nurllib2.parse_http_list(??)\nurllib2.parse_keqv_list(??)\nurllib2.posixpath\nurllib2.quote('abc def') -> 'abc%20def'\nurllib2.random\nurllib2.randombytes(??)\nurllib2.re\nurllib2.request_host(??)\nurllib2.socket\nurllib2.splitattr('/path;attr1=value1;attr2=value2;...') ->\nurllib2.splitgophertype('/Xselector') --> 'X', 'selector'.\nurllib2.splithost('//host[:port]/path') --> 'host[:port]', '/path'.\nurllib2.splitpasswd('user:passwd') -> 'user', 'passwd'.\nurllib2.splitport('host:port') --> 'host', 'port'.\nurllib2.splitquery('/path?query') --> '/path', 'query'.\nurllib2.splittype('type:opaquestring') --> 'type', 'opaquestring'.\nurllib2.splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.\nurllib2.splitvalue('attr=value') --> 'attr', 'value'.\nurllib2.sys\nurllib2.time\nurllib2.unquote('abc%20def') -> 'abc def'.\nurllib2.unwrap('<URL:type://host/path>') --> 'type://host/path'.\nurllib2.url2pathname(??)\nurllib2.urlopen(??)\nurllib2.urlparse\nurlparse.BaseResult\nurlparse.MAX_CACHE_SIZE\nurlparse.ParseResult\nurlparse.SplitResult\nurlparse.clear_cache(??)\nurlparse.non_hierarchical\nurlparse.scheme_chars\nurlparse.test(??)\nurlparse.test_input\nurlparse.urldefrag(??)\nurlparse.urljoin(??)\nurlparse.urlparse(??)\nurlparse.urlsplit(??)\nurlparse.urlunparse(??)\nurlparse.urlunsplit(??)\nurlparse.uses_fragment\nurlparse.uses_netloc\nurlparse.uses_params\nurlparse.uses_query\nurlparse.uses_relative\nuser.home\nuser.os\nuser.pythonrc\nuu.Error\nuu.binascii\nuu.decode(??)\nuu.encode(??)\nuu.os\nuu.sys\nuu.test(??)\nuuid.NAMESPACE_DNS\nuuid.NAMESPACE_OID\nuuid.NAMESPACE_URL\nuuid.NAMESPACE_X500\nuuid.RESERVED_FUTURE\nuuid.RESERVED_MICROSOFT\nuuid.RESERVED_NCS\nuuid.RFC_4122\nuuid.UUID\nuuid.ctypes\nuuid.getnode(??)\nuuid.lib\nuuid.libname\nuuid.uuid1(??)\nuuid.uuid3(??)\nuuid.uuid4(??)\nuuid.uuid5(??)\nvars([object]) -> dictionary\nwarnings.defaultaction\nwarnings.filters\nwarnings.filterwarnings(??)\nwarnings.formatwarning(??)\nwarnings.linecache\nwarnings.onceregistry\nwarnings.resetwarnings(??)\nwarnings.showwarning(??)\nwarnings.simplefilter(??)\nwarnings.sys\nwarnings.types\nwarnings.warn(??)\nwarnings.warn_explicit(??)\nwave.Chunk(??)\nwave.Error\nwave.WAVE_FORMAT_PCM\nwave.Wave_read(??)\nwave.Wave_write(??)\nwave.big_endian\nwave.open(??)\nwave.openfp(??)\nwave.struct\nweakref.CallableProxyType\nweakref.KeyedRef\nweakref.ProxyType\nweakref.ProxyTypes\nweakref.ReferenceError\nweakref.ReferenceType\nweakref.UserDict\nweakref.WeakKeyDictionary(??)\nweakref.WeakValueDictionary(??)\nweakref.getweakrefcount(object) -- return the number of weak references\nweakref.getweakrefs(object) -- return a list of all weak reference objects\nweakref.proxy(object[, callback]) -- create a proxy object that weakly\nweakref.ref\nwebbrowser.BackgroundBrowser\nwebbrowser.BaseBrowser\nwebbrowser.Elinks\nwebbrowser.Error\nwebbrowser.Galeon\nwebbrowser.GenericBrowser\nwebbrowser.Grail\nwebbrowser.Konqueror\nwebbrowser.Mozilla\nwebbrowser.Netscape\nwebbrowser.Opera\nwebbrowser.UnixBrowser\nwebbrowser.get(??)\nwebbrowser.main(??)\nwebbrowser.open(??)\nwebbrowser.open_new(??)\nwebbrowser.open_new_tab(??)\nwebbrowser.os\nwebbrowser.register(??)\nwebbrowser.register_X_browsers(??)\nwebbrowser.shlex\nwebbrowser.stat\nwebbrowser.subprocess\nwebbrowser.sys\nwebbrowser.time\nwhichdb.dbm\nwhichdb.os\nwhichdb.struct\nwhichdb.sys\nwhichdb.whichdb(??)\nwsgiref.handlers\nwsgiref.handlers.BaseCGIHandler(??)\nwsgiref.handlers.BaseHandler(??)\nwsgiref.handlers.CGIHandler(??)\nwsgiref.handlers.FileWrapper(??)\nwsgiref.handlers.Headers(??)\nwsgiref.handlers.SimpleHandler(??)\nwsgiref.handlers.StringType\nwsgiref.handlers.format_date_time(??)\nwsgiref.handlers.guess_scheme(??)\nwsgiref.handlers.is_hop_by_hop(??)\nwsgiref.handlers.os\nwsgiref.handlers.sys\nwsgiref.handlers.time\nwsgiref.headers\nwsgiref.headers.Headers(??)\nwsgiref.headers.ListType\nwsgiref.headers.TupleType\nwsgiref.headers.re\nwsgiref.headers.tspecials\nwsgiref.simple_server\nwsgiref.simple_server.BaseHTTPRequestHandler(??)\nwsgiref.simple_server.HTTPServer(??)\nwsgiref.simple_server.ServerHandler(??)\nwsgiref.simple_server.SimpleHandler(??)\nwsgiref.simple_server.WSGIRequestHandler(??)\nwsgiref.simple_server.WSGIServer(??)\nwsgiref.simple_server.demo_app(??)\nwsgiref.simple_server.make_server(??)\nwsgiref.simple_server.server_version\nwsgiref.simple_server.software_version\nwsgiref.simple_server.sys\nwsgiref.simple_server.sys_version\nwsgiref.simple_server.urllib\nwsgiref.util\nwsgiref.util.FileWrapper(??)\nwsgiref.util.application_uri(??)\nwsgiref.util.guess_scheme(??)\nwsgiref.util.is_hop_by_hop(??)\nwsgiref.util.posixpath\nwsgiref.util.request_uri(??)\nwsgiref.util.setup_testing_defaults(??)\nwsgiref.util.shift_path_info(??)\nwsgiref.validate.DictType\nwsgiref.validate.ErrorWrapper(??)\nwsgiref.validate.InputWrapper(??)\nwsgiref.validate.IteratorWrapper(??)\nwsgiref.validate.ListType\nwsgiref.validate.PartialIteratorWrapper(??)\nwsgiref.validate.StringType\nwsgiref.validate.TupleType\nwsgiref.validate.WSGIWarning\nwsgiref.validate.WriteWrapper(??)\nwsgiref.validate.assert_(??)\nwsgiref.validate.bad_header_value_re\nwsgiref.validate.check_content_type(??)\nwsgiref.validate.check_environ(??)\nwsgiref.validate.check_errors(??)\nwsgiref.validate.check_exc_info(??)\nwsgiref.validate.check_headers(??)\nwsgiref.validate.check_input(??)\nwsgiref.validate.check_iterator(??)\nwsgiref.validate.check_status(??)\nwsgiref.validate.header_re\nwsgiref.validate.re\nwsgiref.validate.sys\nwsgiref.validate.validator(??)\nwsgiref.validate.warnings\nxdrlib.ConversionError\nxdrlib.Error\nxdrlib.Packer(??)\nxdrlib.Unpacker(??)\nxdrlib.struct\nxml.dom\nxml.dom.DOMException\nxml.dom.DOMSTRING_SIZE_ERR\nxml.dom.DomstringSizeErr\nxml.dom.EMPTY_NAMESPACE\nxml.dom.EMPTY_PREFIX\nxml.dom.HIERARCHY_REQUEST_ERR\nxml.dom.HierarchyRequestErr\nxml.dom.INDEX_SIZE_ERR\nxml.dom.INUSE_ATTRIBUTE_ERR\nxml.dom.INVALID_ACCESS_ERR\nxml.dom.INVALID_CHARACTER_ERR\nxml.dom.INVALID_MODIFICATION_ERR\nxml.dom.INVALID_STATE_ERR\nxml.dom.IndexSizeErr\nxml.dom.InuseAttributeErr\nxml.dom.InvalidAccessErr\nxml.dom.InvalidCharacterErr\nxml.dom.InvalidModificationErr\nxml.dom.InvalidStateErr\nxml.dom.NAMESPACE_ERR\nxml.dom.NOT_FOUND_ERR\nxml.dom.NOT_SUPPORTED_ERR\nxml.dom.NO_DATA_ALLOWED_ERR\nxml.dom.NO_MODIFICATION_ALLOWED_ERR\nxml.dom.NamespaceErr\nxml.dom.NoDataAllowedErr\nxml.dom.NoModificationAllowedErr\nxml.dom.Node(??)\nxml.dom.NodeFilter\nxml.dom.NodeFilter.NodeFilter(??)\nxml.dom.NotFoundErr\nxml.dom.NotSupportedErr\nxml.dom.SYNTAX_ERR\nxml.dom.SyntaxErr\nxml.dom.UserDataHandler(??)\nxml.dom.VALIDATION_ERR\nxml.dom.ValidationErr\nxml.dom.WRONG_DOCUMENT_ERR\nxml.dom.WrongDocumentErr\nxml.dom.XHTML_NAMESPACE\nxml.dom.XMLNS_NAMESPACE\nxml.dom.XML_NAMESPACE\nxml.dom.domreg\nxml.dom.domreg.EmptyNodeList\nxml.dom.domreg.NodeList\nxml.dom.domreg.StringTypes\nxml.dom.domreg.defproperty(??)\nxml.dom.domreg.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxml.dom.domreg.registerDOMImplementation(name, factory)\nxml.dom.domreg.registered\nxml.dom.domreg.well_known_implementations\nxml.dom.expatbuilder\nxml.dom.expatbuilder.CDATA_SECTION_NODE\nxml.dom.expatbuilder.DOCUMENT_NODE\nxml.dom.expatbuilder.EMPTY_NAMESPACE\nxml.dom.expatbuilder.EMPTY_PREFIX\nxml.dom.expatbuilder.ElementInfo\nxml.dom.expatbuilder.EmptyNodeList\nxml.dom.expatbuilder.ExpatBuilder(??)\nxml.dom.expatbuilder.ExpatBuilderNS(??)\nxml.dom.expatbuilder.FILTER_ACCEPT\nxml.dom.expatbuilder.FILTER_INTERRUPT\nxml.dom.expatbuilder.FILTER_REJECT\nxml.dom.expatbuilder.FILTER_SKIP\nxml.dom.expatbuilder.FilterCrutch\nxml.dom.expatbuilder.FilterVisibilityController\nxml.dom.expatbuilder.FragmentBuilder(??)\nxml.dom.expatbuilder.FragmentBuilderNS(??)\nxml.dom.expatbuilder.InternalSubsetExtractor(??)\nxml.dom.expatbuilder.Namespaces(??)\nxml.dom.expatbuilder.Node(??)\nxml.dom.expatbuilder.NodeFilter(??)\nxml.dom.expatbuilder.NodeList\nxml.dom.expatbuilder.ParseEscape\nxml.dom.expatbuilder.Rejecter\nxml.dom.expatbuilder.Skipper\nxml.dom.expatbuilder.StringTypes\nxml.dom.expatbuilder.TEXT_NODE\nxml.dom.expatbuilder.XMLNS_NAMESPACE\nxml.dom.expatbuilder.defproperty(??)\nxml.dom.expatbuilder.expat\nxml.dom.expatbuilder.makeBuilder(??)\nxml.dom.expatbuilder.minidom\nxml.dom.expatbuilder.parse(??)\nxml.dom.expatbuilder.parseFragment(??)\nxml.dom.expatbuilder.parseFragmentString(??)\nxml.dom.expatbuilder.parseString(??)\nxml.dom.expatbuilder.theDOMImplementation\nxml.dom.expatbuilder.xmlbuilder\nxml.dom.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxml.dom.minicompat\nxml.dom.minicompat.EmptyNodeList\nxml.dom.minicompat.NodeList\nxml.dom.minicompat.StringTypes\nxml.dom.minicompat.defproperty(??)\nxml.dom.minicompat.xml\nxml.dom.minidom\nxml.dom.minidom.Attr(??)\nxml.dom.minidom.AttributeList\nxml.dom.minidom.CDATASection(??)\nxml.dom.minidom.CharacterData(??)\nxml.dom.minidom.Childless(??)\nxml.dom.minidom.Comment(??)\nxml.dom.minidom.DOMImplementation(??)\nxml.dom.minidom.DOMImplementationLS(??)\nxml.dom.minidom.Document(??)\nxml.dom.minidom.DocumentFragment(??)\nxml.dom.minidom.DocumentLS(??)\nxml.dom.minidom.DocumentType(??)\nxml.dom.minidom.EMPTY_NAMESPACE\nxml.dom.minidom.EMPTY_PREFIX\nxml.dom.minidom.Element(??)\nxml.dom.minidom.ElementInfo\nxml.dom.minidom.EmptyNodeList\nxml.dom.minidom.Entity(??)\nxml.dom.minidom.Identified(??)\nxml.dom.minidom.NamedNodeMap\nxml.dom.minidom.Node(??)\nxml.dom.minidom.NodeList\nxml.dom.minidom.Notation(??)\nxml.dom.minidom.ProcessingInstruction(??)\nxml.dom.minidom.ReadOnlySequentialNamedNodeMap\nxml.dom.minidom.StringTypes\nxml.dom.minidom.Text(??)\nxml.dom.minidom.TypeInfo\nxml.dom.minidom.XMLNS_NAMESPACE\nxml.dom.minidom.defproperty(??)\nxml.dom.minidom.domreg\nxml.dom.minidom.getDOMImplementation(??)\nxml.dom.minidom.parse(??)\nxml.dom.minidom.parseString(??)\nxml.dom.minidom.xml\nxml.dom.pulldom\nxml.dom.pulldom.CHARACTERS\nxml.dom.pulldom.COMMENT\nxml.dom.pulldom.DOMEventStream(??)\nxml.dom.pulldom.END_DOCUMENT\nxml.dom.pulldom.END_ELEMENT\nxml.dom.pulldom.ErrorHandler(??)\nxml.dom.pulldom.IGNORABLE_WHITESPACE\nxml.dom.pulldom.PROCESSING_INSTRUCTION\nxml.dom.pulldom.PullDOM(??)\nxml.dom.pulldom.SAX2DOM(??)\nxml.dom.pulldom.START_DOCUMENT\nxml.dom.pulldom.START_ELEMENT\nxml.dom.pulldom.default_bufsize\nxml.dom.pulldom.parse(??)\nxml.dom.pulldom.parseString(??)\nxml.dom.pulldom.types\nxml.dom.pulldom.xml\nxml.dom.registerDOMImplementation(name, factory)\nxml.dom.xmlbuilder\nxml.dom.xmlbuilder.DOMBuilder(??)\nxml.dom.xmlbuilder.DOMBuilderFilter(??)\nxml.dom.xmlbuilder.DOMEntityResolver\nxml.dom.xmlbuilder.DOMImplementationLS(??)\nxml.dom.xmlbuilder.DOMInputSource\nxml.dom.xmlbuilder.DocumentLS(??)\nxml.dom.xmlbuilder.Options(??)\nxml.dom.xmlbuilder.copy\nxml.dom.xmlbuilder.xml\nxml.etree\nxml.etree.ElementInclude\nxml.etree.ElementInclude.ElementTree\nxml.etree.ElementInclude.FatalIncludeError\nxml.etree.ElementInclude.XINCLUDE\nxml.etree.ElementInclude.XINCLUDE_FALLBACK\nxml.etree.ElementInclude.XINCLUDE_INCLUDE\nxml.etree.ElementInclude.copy\nxml.etree.ElementInclude.default_loader(??)\nxml.etree.ElementInclude.include(??)\nxml.etree.ElementPath\nxml.etree.ElementPath.Path(??)\nxml.etree.ElementPath.find(??)\nxml.etree.ElementPath.findall(??)\nxml.etree.ElementPath.findtext(??)\nxml.etree.ElementPath.re\nxml.etree.ElementPath.xpath_descendant_or_self(??)\nxml.etree.ElementPath.xpath_tokenizer\nxml.etree.ElementTree\nxml.etree.ElementTree.Comment(??)\nxml.etree.ElementTree.Element(??)\nxml.etree.ElementTree.ElementPath\nxml.etree.ElementTree.ElementTree(??)\nxml.etree.ElementTree.PI(??)\nxml.etree.ElementTree.ProcessingInstruction(??)\nxml.etree.ElementTree.QName(??)\nxml.etree.ElementTree.SubElement(??)\nxml.etree.ElementTree.TreeBuilder(??)\nxml.etree.ElementTree.VERSION\nxml.etree.ElementTree.XML(??)\nxml.etree.ElementTree.XMLID(??)\nxml.etree.ElementTree.XMLParser(??)\nxml.etree.ElementTree.XMLTreeBuilder(??)\nxml.etree.ElementTree.dump(??)\nxml.etree.ElementTree.fixtag(??)\nxml.etree.ElementTree.fromstring(??)\nxml.etree.ElementTree.iselement(??)\nxml.etree.ElementTree.iterparse(??)\nxml.etree.ElementTree.parse(??)\nxml.etree.ElementTree.re\nxml.etree.ElementTree.string\nxml.etree.ElementTree.sys\nxml.etree.ElementTree.tostring(??)\nxml.etree.cElementTree\nxml.etree.cElementTree.Comment(??)\nxml.etree.cElementTree.Element\nxml.etree.cElementTree.ElementPath\nxml.etree.cElementTree.ElementTree(??)\nxml.etree.cElementTree.PI(??)\nxml.etree.cElementTree.ProcessingInstruction(??)\nxml.etree.cElementTree.QName(??)\nxml.etree.cElementTree.SubElement\nxml.etree.cElementTree.TreeBuilder\nxml.etree.cElementTree.VERSION\nxml.etree.cElementTree.XML(??)\nxml.etree.cElementTree.XMLID(??)\nxml.etree.cElementTree.XMLParser\nxml.etree.cElementTree.XMLParserError\nxml.etree.cElementTree.XMLTreeBuilder\nxml.etree.cElementTree.dump(??)\nxml.etree.cElementTree.fromstring(??)\nxml.etree.cElementTree.iselement(??)\nxml.etree.cElementTree.iterparse\nxml.etree.cElementTree.parse(??)\nxml.etree.cElementTree.tostring(??)\nxml.parsers\nxml.parsers.expat\nxml.parsers.expat.EXPAT_VERSION\nxml.parsers.expat.ErrorString(errno) -> string\nxml.parsers.expat.ExpatError\nxml.parsers.expat.ParserCreate([encoding[, namespace_separator]]) -> parser\nxml.parsers.expat.XMLParserType\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_ALWAYS\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_NEVER\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE\nxml.parsers.expat.error\nxml.parsers.expat.errors\nxml.parsers.expat.expat_CAPI\nxml.parsers.expat.features\nxml.parsers.expat.model\nxml.parsers.expat.native_encoding\nxml.parsers.expat.version_info\nxml.sax\nxml.sax.ContentHandler(??)\nxml.sax.ErrorHandler(??)\nxml.sax.InputSource(??)\nxml.sax.SAXException\nxml.sax.SAXNotRecognizedException\nxml.sax.SAXNotSupportedException\nxml.sax.SAXParseException\nxml.sax.SAXReaderNotAvailable\nxml.sax.default_parser_list\nxml.sax.expatreader\nxml.sax.expatreader.AttributesImpl(??)\nxml.sax.expatreader.AttributesNSImpl(??)\nxml.sax.expatreader.ExpatLocator(??)\nxml.sax.expatreader.ExpatParser(??)\nxml.sax.expatreader.SAXException\nxml.sax.expatreader.SAXNotRecognizedException\nxml.sax.expatreader.SAXNotSupportedException\nxml.sax.expatreader.SAXParseException\nxml.sax.expatreader.SAXReaderNotAvailable\nxml.sax.expatreader.create_parser(??)\nxml.sax.expatreader.expat\nxml.sax.expatreader.feature_external_ges\nxml.sax.expatreader.feature_external_pes\nxml.sax.expatreader.feature_namespace_prefixes\nxml.sax.expatreader.feature_namespaces\nxml.sax.expatreader.feature_string_interning\nxml.sax.expatreader.feature_validation\nxml.sax.expatreader.handler\nxml.sax.expatreader.property_interning_dict\nxml.sax.expatreader.property_xml_string\nxml.sax.expatreader.saxutils\nxml.sax.expatreader.version\nxml.sax.expatreader.xmlreader\nxml.sax.handler\nxml.sax.handler.ContentHandler(??)\nxml.sax.handler.DTDHandler(??)\nxml.sax.handler.EntityResolver(??)\nxml.sax.handler.ErrorHandler(??)\nxml.sax.handler.all_features\nxml.sax.handler.all_properties\nxml.sax.handler.feature_external_ges\nxml.sax.handler.feature_external_pes\nxml.sax.handler.feature_namespace_prefixes\nxml.sax.handler.feature_namespaces\nxml.sax.handler.feature_string_interning\nxml.sax.handler.feature_validation\nxml.sax.handler.property_declaration_handler\nxml.sax.handler.property_dom_node\nxml.sax.handler.property_encoding\nxml.sax.handler.property_interning_dict\nxml.sax.handler.property_lexical_handler\nxml.sax.handler.property_xml_string\nxml.sax.handler.version\nxml.sax.make_parser(??)\nxml.sax.parse(??)\nxml.sax.parseString(??)\nxml.sax.saxutils\nxml.sax.saxutils.XMLFilterBase(??)\nxml.sax.saxutils.XMLGenerator(??)\nxml.sax.saxutils.escape(??)\nxml.sax.saxutils.handler\nxml.sax.saxutils.os\nxml.sax.saxutils.prepare_input_source(??)\nxml.sax.saxutils.quoteattr(??)\nxml.sax.saxutils.types\nxml.sax.saxutils.unescape(??)\nxml.sax.saxutils.urllib\nxml.sax.saxutils.urlparse\nxml.sax.saxutils.xmlreader\nxml.sax.xmlreader\nxml.sax.xmlreader.AttributesImpl(??)\nxml.sax.xmlreader.AttributesNSImpl(??)\nxml.sax.xmlreader.IncrementalParser(??)\nxml.sax.xmlreader.InputSource(??)\nxml.sax.xmlreader.Locator(??)\nxml.sax.xmlreader.SAXNotRecognizedException\nxml.sax.xmlreader.SAXNotSupportedException\nxml.sax.xmlreader.XMLReader(??)\nxml.sax.xmlreader.handler\nxmlcore.dom\nxmlcore.dom.DOMException\nxmlcore.dom.DOMSTRING_SIZE_ERR\nxmlcore.dom.DomstringSizeErr\nxmlcore.dom.EMPTY_NAMESPACE\nxmlcore.dom.EMPTY_PREFIX\nxmlcore.dom.HIERARCHY_REQUEST_ERR\nxmlcore.dom.HierarchyRequestErr\nxmlcore.dom.INDEX_SIZE_ERR\nxmlcore.dom.INUSE_ATTRIBUTE_ERR\nxmlcore.dom.INVALID_ACCESS_ERR\nxmlcore.dom.INVALID_CHARACTER_ERR\nxmlcore.dom.INVALID_MODIFICATION_ERR\nxmlcore.dom.INVALID_STATE_ERR\nxmlcore.dom.IndexSizeErr\nxmlcore.dom.InuseAttributeErr\nxmlcore.dom.InvalidAccessErr\nxmlcore.dom.InvalidCharacterErr\nxmlcore.dom.InvalidModificationErr\nxmlcore.dom.InvalidStateErr\nxmlcore.dom.NAMESPACE_ERR\nxmlcore.dom.NOT_FOUND_ERR\nxmlcore.dom.NOT_SUPPORTED_ERR\nxmlcore.dom.NO_DATA_ALLOWED_ERR\nxmlcore.dom.NO_MODIFICATION_ALLOWED_ERR\nxmlcore.dom.NamespaceErr\nxmlcore.dom.NoDataAllowedErr\nxmlcore.dom.NoModificationAllowedErr\nxmlcore.dom.Node(??)\nxmlcore.dom.NodeFilter\nxmlcore.dom.NodeFilter.NodeFilter(??)\nxmlcore.dom.NotFoundErr\nxmlcore.dom.NotSupportedErr\nxmlcore.dom.SYNTAX_ERR\nxmlcore.dom.SyntaxErr\nxmlcore.dom.UserDataHandler(??)\nxmlcore.dom.VALIDATION_ERR\nxmlcore.dom.ValidationErr\nxmlcore.dom.WRONG_DOCUMENT_ERR\nxmlcore.dom.WrongDocumentErr\nxmlcore.dom.XHTML_NAMESPACE\nxmlcore.dom.XMLNS_NAMESPACE\nxmlcore.dom.XML_NAMESPACE\nxmlcore.dom.domreg\nxmlcore.dom.domreg.EmptyNodeList\nxmlcore.dom.domreg.NodeList\nxmlcore.dom.domreg.StringTypes\nxmlcore.dom.domreg.defproperty(??)\nxmlcore.dom.domreg.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxmlcore.dom.domreg.registerDOMImplementation(name, factory)\nxmlcore.dom.domreg.registered\nxmlcore.dom.domreg.well_known_implementations\nxmlcore.dom.expatbuilder\nxmlcore.dom.expatbuilder.CDATA_SECTION_NODE\nxmlcore.dom.expatbuilder.DOCUMENT_NODE\nxmlcore.dom.expatbuilder.EMPTY_NAMESPACE\nxmlcore.dom.expatbuilder.EMPTY_PREFIX\nxmlcore.dom.expatbuilder.ElementInfo\nxmlcore.dom.expatbuilder.EmptyNodeList\nxmlcore.dom.expatbuilder.ExpatBuilder(??)\nxmlcore.dom.expatbuilder.ExpatBuilderNS(??)\nxmlcore.dom.expatbuilder.FILTER_ACCEPT\nxmlcore.dom.expatbuilder.FILTER_INTERRUPT\nxmlcore.dom.expatbuilder.FILTER_REJECT\nxmlcore.dom.expatbuilder.FILTER_SKIP\nxmlcore.dom.expatbuilder.FilterCrutch\nxmlcore.dom.expatbuilder.FilterVisibilityController\nxmlcore.dom.expatbuilder.FragmentBuilder(??)\nxmlcore.dom.expatbuilder.FragmentBuilderNS(??)\nxmlcore.dom.expatbuilder.InternalSubsetExtractor(??)\nxmlcore.dom.expatbuilder.Namespaces(??)\nxmlcore.dom.expatbuilder.Node(??)\nxmlcore.dom.expatbuilder.NodeFilter(??)\nxmlcore.dom.expatbuilder.NodeList\nxmlcore.dom.expatbuilder.ParseEscape\nxmlcore.dom.expatbuilder.Rejecter\nxmlcore.dom.expatbuilder.Skipper\nxmlcore.dom.expatbuilder.StringTypes\nxmlcore.dom.expatbuilder.TEXT_NODE\nxmlcore.dom.expatbuilder.XMLNS_NAMESPACE\nxmlcore.dom.expatbuilder.defproperty(??)\nxmlcore.dom.expatbuilder.expat\nxmlcore.dom.expatbuilder.makeBuilder(??)\nxmlcore.dom.expatbuilder.minidom\nxmlcore.dom.expatbuilder.parse(??)\nxmlcore.dom.expatbuilder.parseFragment(??)\nxmlcore.dom.expatbuilder.parseFragmentString(??)\nxmlcore.dom.expatbuilder.parseString(??)\nxmlcore.dom.expatbuilder.theDOMImplementation\nxmlcore.dom.expatbuilder.xmlbuilder\nxmlcore.dom.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxmlcore.dom.minicompat\nxmlcore.dom.minicompat.EmptyNodeList\nxmlcore.dom.minicompat.NodeList\nxmlcore.dom.minicompat.StringTypes\nxmlcore.dom.minicompat.defproperty(??)\nxmlcore.dom.minicompat.xmlcore\nxmlcore.dom.minidom\nxmlcore.dom.minidom.Attr(??)\nxmlcore.dom.minidom.AttributeList\nxmlcore.dom.minidom.CDATASection(??)\nxmlcore.dom.minidom.CharacterData(??)\nxmlcore.dom.minidom.Childless(??)\nxmlcore.dom.minidom.Comment(??)\nxmlcore.dom.minidom.DOMImplementation(??)\nxmlcore.dom.minidom.DOMImplementationLS(??)\nxmlcore.dom.minidom.Document(??)\nxmlcore.dom.minidom.DocumentFragment(??)\nxmlcore.dom.minidom.DocumentLS(??)\nxmlcore.dom.minidom.DocumentType(??)\nxmlcore.dom.minidom.EMPTY_NAMESPACE\nxmlcore.dom.minidom.EMPTY_PREFIX\nxmlcore.dom.minidom.Element(??)\nxmlcore.dom.minidom.ElementInfo\nxmlcore.dom.minidom.EmptyNodeList\nxmlcore.dom.minidom.Entity(??)\nxmlcore.dom.minidom.Identified(??)\nxmlcore.dom.minidom.NamedNodeMap\nxmlcore.dom.minidom.Node(??)\nxmlcore.dom.minidom.NodeList\nxmlcore.dom.minidom.Notation(??)\nxmlcore.dom.minidom.ProcessingInstruction(??)\nxmlcore.dom.minidom.ReadOnlySequentialNamedNodeMap\nxmlcore.dom.minidom.StringTypes\nxmlcore.dom.minidom.Text(??)\nxmlcore.dom.minidom.TypeInfo\nxmlcore.dom.minidom.XMLNS_NAMESPACE\nxmlcore.dom.minidom.defproperty(??)\nxmlcore.dom.minidom.domreg\nxmlcore.dom.minidom.getDOMImplementation(??)\nxmlcore.dom.minidom.parse(??)\nxmlcore.dom.minidom.parseString(??)\nxmlcore.dom.minidom.xmlcore\nxmlcore.dom.pulldom\nxmlcore.dom.pulldom.CHARACTERS\nxmlcore.dom.pulldom.COMMENT\nxmlcore.dom.pulldom.DOMEventStream(??)\nxmlcore.dom.pulldom.END_DOCUMENT\nxmlcore.dom.pulldom.END_ELEMENT\nxmlcore.dom.pulldom.ErrorHandler(??)\nxmlcore.dom.pulldom.IGNORABLE_WHITESPACE\nxmlcore.dom.pulldom.PROCESSING_INSTRUCTION\nxmlcore.dom.pulldom.PullDOM(??)\nxmlcore.dom.pulldom.SAX2DOM(??)\nxmlcore.dom.pulldom.START_DOCUMENT\nxmlcore.dom.pulldom.START_ELEMENT\nxmlcore.dom.pulldom.default_bufsize\nxmlcore.dom.pulldom.parse(??)\nxmlcore.dom.pulldom.parseString(??)\nxmlcore.dom.pulldom.types\nxmlcore.dom.pulldom.xmlcore\nxmlcore.dom.registerDOMImplementation(name, factory)\nxmlcore.dom.xmlbuilder\nxmlcore.dom.xmlbuilder.DOMBuilder(??)\nxmlcore.dom.xmlbuilder.DOMBuilderFilter(??)\nxmlcore.dom.xmlbuilder.DOMEntityResolver\nxmlcore.dom.xmlbuilder.DOMImplementationLS(??)\nxmlcore.dom.xmlbuilder.DOMInputSource\nxmlcore.dom.xmlbuilder.DocumentLS(??)\nxmlcore.dom.xmlbuilder.Options(??)\nxmlcore.dom.xmlbuilder.copy\nxmlcore.dom.xmlbuilder.xmlcore\nxmlcore.etree\nxmlcore.etree.ElementInclude\nxmlcore.etree.ElementInclude.ElementTree\nxmlcore.etree.ElementInclude.FatalIncludeError\nxmlcore.etree.ElementInclude.XINCLUDE\nxmlcore.etree.ElementInclude.XINCLUDE_FALLBACK\nxmlcore.etree.ElementInclude.XINCLUDE_INCLUDE\nxmlcore.etree.ElementInclude.copy\nxmlcore.etree.ElementInclude.default_loader(??)\nxmlcore.etree.ElementInclude.include(??)\nxmlcore.etree.ElementPath\nxmlcore.etree.ElementPath.Path(??)\nxmlcore.etree.ElementPath.find(??)\nxmlcore.etree.ElementPath.findall(??)\nxmlcore.etree.ElementPath.findtext(??)\nxmlcore.etree.ElementPath.re\nxmlcore.etree.ElementPath.xpath_descendant_or_self(??)\nxmlcore.etree.ElementPath.xpath_tokenizer\nxmlcore.etree.ElementTree\nxmlcore.etree.ElementTree.Comment(??)\nxmlcore.etree.ElementTree.Element(??)\nxmlcore.etree.ElementTree.ElementPath\nxmlcore.etree.ElementTree.ElementTree(??)\nxmlcore.etree.ElementTree.PI(??)\nxmlcore.etree.ElementTree.ProcessingInstruction(??)\nxmlcore.etree.ElementTree.QName(??)\nxmlcore.etree.ElementTree.SubElement(??)\nxmlcore.etree.ElementTree.TreeBuilder(??)\nxmlcore.etree.ElementTree.VERSION\nxmlcore.etree.ElementTree.XML(??)\nxmlcore.etree.ElementTree.XMLID(??)\nxmlcore.etree.ElementTree.XMLParser(??)\nxmlcore.etree.ElementTree.XMLTreeBuilder(??)\nxmlcore.etree.ElementTree.dump(??)\nxmlcore.etree.ElementTree.fixtag(??)\nxmlcore.etree.ElementTree.fromstring(??)\nxmlcore.etree.ElementTree.iselement(??)\nxmlcore.etree.ElementTree.iterparse(??)\nxmlcore.etree.ElementTree.parse(??)\nxmlcore.etree.ElementTree.re\nxmlcore.etree.ElementTree.string\nxmlcore.etree.ElementTree.sys\nxmlcore.etree.ElementTree.tostring(??)\nxmlcore.etree.cElementTree\nxmlcore.etree.cElementTree.Comment(??)\nxmlcore.etree.cElementTree.Element\nxmlcore.etree.cElementTree.ElementPath\nxmlcore.etree.cElementTree.ElementTree(??)\nxmlcore.etree.cElementTree.PI(??)\nxmlcore.etree.cElementTree.ProcessingInstruction(??)\nxmlcore.etree.cElementTree.QName(??)\nxmlcore.etree.cElementTree.SubElement\nxmlcore.etree.cElementTree.TreeBuilder\nxmlcore.etree.cElementTree.VERSION\nxmlcore.etree.cElementTree.XML(??)\nxmlcore.etree.cElementTree.XMLID(??)\nxmlcore.etree.cElementTree.XMLParser\nxmlcore.etree.cElementTree.XMLParserError\nxmlcore.etree.cElementTree.XMLTreeBuilder\nxmlcore.etree.cElementTree.dump(??)\nxmlcore.etree.cElementTree.fromstring(??)\nxmlcore.etree.cElementTree.iselement(??)\nxmlcore.etree.cElementTree.iterparse\nxmlcore.etree.cElementTree.parse(??)\nxmlcore.etree.cElementTree.tostring(??)\nxmlcore.parsers\nxmlcore.parsers.expat\nxmlcore.parsers.expat.EXPAT_VERSION\nxmlcore.parsers.expat.ErrorString(errno) -> string\nxmlcore.parsers.expat.ExpatError\nxmlcore.parsers.expat.ParserCreate([encoding[, namespace_separator]]) -> parser\nxmlcore.parsers.expat.XMLParserType\nxmlcore.parsers.expat.XML_PARAM_ENTITY_PARSING_ALWAYS\nxmlcore.parsers.expat.XML_PARAM_ENTITY_PARSING_NEVER\nxmlcore.parsers.expat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE\nxmlcore.parsers.expat.error\nxmlcore.parsers.expat.errors\nxmlcore.parsers.expat.expat_CAPI\nxmlcore.parsers.expat.features\nxmlcore.parsers.expat.model\nxmlcore.parsers.expat.native_encoding\nxmlcore.parsers.expat.version_info\nxmlcore.sax\nxmlcore.sax.ContentHandler(??)\nxmlcore.sax.ErrorHandler(??)\nxmlcore.sax.InputSource(??)\nxmlcore.sax.SAXException\nxmlcore.sax.SAXNotRecognizedException\nxmlcore.sax.SAXNotSupportedException\nxmlcore.sax.SAXParseException\nxmlcore.sax.SAXReaderNotAvailable\nxmlcore.sax.default_parser_list\nxmlcore.sax.expatreader\nxmlcore.sax.expatreader.AttributesImpl(??)\nxmlcore.sax.expatreader.AttributesNSImpl(??)\nxmlcore.sax.expatreader.ExpatLocator(??)\nxmlcore.sax.expatreader.ExpatParser(??)\nxmlcore.sax.expatreader.SAXException\nxmlcore.sax.expatreader.SAXNotRecognizedException\nxmlcore.sax.expatreader.SAXNotSupportedException\nxmlcore.sax.expatreader.SAXParseException\nxmlcore.sax.expatreader.SAXReaderNotAvailable\nxmlcore.sax.expatreader.create_parser(??)\nxmlcore.sax.expatreader.expat\nxmlcore.sax.expatreader.feature_external_ges\nxmlcore.sax.expatreader.feature_external_pes\nxmlcore.sax.expatreader.feature_namespace_prefixes\nxmlcore.sax.expatreader.feature_namespaces\nxmlcore.sax.expatreader.feature_string_interning\nxmlcore.sax.expatreader.feature_validation\nxmlcore.sax.expatreader.handler\nxmlcore.sax.expatreader.property_interning_dict\nxmlcore.sax.expatreader.property_xml_string\nxmlcore.sax.expatreader.saxutils\nxmlcore.sax.expatreader.version\nxmlcore.sax.expatreader.xmlreader\nxmlcore.sax.handler\nxmlcore.sax.handler.ContentHandler(??)\nxmlcore.sax.handler.DTDHandler(??)\nxmlcore.sax.handler.EntityResolver(??)\nxmlcore.sax.handler.ErrorHandler(??)\nxmlcore.sax.handler.all_features\nxmlcore.sax.handler.all_properties\nxmlcore.sax.handler.feature_external_ges\nxmlcore.sax.handler.feature_external_pes\nxmlcore.sax.handler.feature_namespace_prefixes\nxmlcore.sax.handler.feature_namespaces\nxmlcore.sax.handler.feature_string_interning\nxmlcore.sax.handler.feature_validation\nxmlcore.sax.handler.property_declaration_handler\nxmlcore.sax.handler.property_dom_node\nxmlcore.sax.handler.property_encoding\nxmlcore.sax.handler.property_interning_dict\nxmlcore.sax.handler.property_lexical_handler\nxmlcore.sax.handler.property_xml_string\nxmlcore.sax.handler.version\nxmlcore.sax.make_parser(??)\nxmlcore.sax.parse(??)\nxmlcore.sax.parseString(??)\nxmlcore.sax.saxutils\nxmlcore.sax.saxutils.XMLFilterBase(??)\nxmlcore.sax.saxutils.XMLGenerator(??)\nxmlcore.sax.saxutils.escape(??)\nxmlcore.sax.saxutils.handler\nxmlcore.sax.saxutils.os\nxmlcore.sax.saxutils.prepare_input_source(??)\nxmlcore.sax.saxutils.quoteattr(??)\nxmlcore.sax.saxutils.types\nxmlcore.sax.saxutils.unescape(??)\nxmlcore.sax.saxutils.urllib\nxmlcore.sax.saxutils.urlparse\nxmlcore.sax.saxutils.xmlreader\nxmlcore.sax.xmlreader\nxmlcore.sax.xmlreader.AttributesImpl(??)\nxmlcore.sax.xmlreader.AttributesNSImpl(??)\nxmlcore.sax.xmlreader.IncrementalParser(??)\nxmlcore.sax.xmlreader.InputSource(??)\nxmlcore.sax.xmlreader.Locator(??)\nxmlcore.sax.xmlreader.SAXNotRecognizedException\nxmlcore.sax.xmlreader.SAXNotSupportedException\nxmlcore.sax.xmlreader.XMLReader(??)\nxmlcore.sax.xmlreader.handler\nxmllib.Error\nxmllib.TestXMLParser(??)\nxmllib.XMLParser(??)\nxmllib.amp\nxmllib.attrfind\nxmllib.attrtrans\nxmllib.cdataclose\nxmllib.cdataopen\nxmllib.charref\nxmllib.commentclose\nxmllib.commentopen\nxmllib.doctype\nxmllib.doubledash\nxmllib.endbracket\nxmllib.endbracketfind\nxmllib.endtagopen\nxmllib.entityref\nxmllib.illegal\nxmllib.interesting\nxmllib.ncname\nxmllib.newline\nxmllib.procclose\nxmllib.procopen\nxmllib.qname\nxmllib.re\nxmllib.ref\nxmllib.space\nxmllib.starttagend\nxmllib.starttagmatch\nxmllib.starttagopen\nxmllib.string\nxmllib.tagfind\nxmllib.test(??)\nxmllib.version\nxmllib.xmldecl\nxmllib.xmlns\nxmlrpclib.APPLICATION_ERROR\nxmlrpclib.Binary(??)\nxmlrpclib.Boolean\nxmlrpclib.BooleanType\nxmlrpclib.BufferType\nxmlrpclib.BuiltinFunctionType\nxmlrpclib.BuiltinMethodType\nxmlrpclib.ClassType\nxmlrpclib.CodeType\nxmlrpclib.ComplexType\nxmlrpclib.DateTime(??)\nxmlrpclib.DictProxyType\nxmlrpclib.DictType\nxmlrpclib.DictionaryType\nxmlrpclib.EllipsisType\nxmlrpclib.Error\nxmlrpclib.ExpatParser(??)\nxmlrpclib.False\nxmlrpclib.FastMarshaller\nxmlrpclib.FastParser\nxmlrpclib.FastUnmarshaller\nxmlrpclib.Fault\nxmlrpclib.FileType\nxmlrpclib.FloatType\nxmlrpclib.FrameType\nxmlrpclib.FunctionType\nxmlrpclib.GeneratorType\nxmlrpclib.GetSetDescriptorType\nxmlrpclib.INTERNAL_ERROR\nxmlrpclib.INVALID_ENCODING_CHAR\nxmlrpclib.INVALID_METHOD_PARAMS\nxmlrpclib.INVALID_XMLRPC\nxmlrpclib.InstanceType\nxmlrpclib.IntType\nxmlrpclib.LambdaType\nxmlrpclib.ListType\nxmlrpclib.LongType\nxmlrpclib.MAXINT\nxmlrpclib.METHOD_NOT_FOUND\nxmlrpclib.MININT\nxmlrpclib.Marshaller(??)\nxmlrpclib.MemberDescriptorType\nxmlrpclib.MethodType\nxmlrpclib.ModuleType\nxmlrpclib.MultiCall(??)\nxmlrpclib.MultiCallIterator(??)\nxmlrpclib.NOT_WELLFORMED_ERROR\nxmlrpclib.NoneType\nxmlrpclib.NotImplementedType\nxmlrpclib.ObjectType\nxmlrpclib.PARSE_ERROR\nxmlrpclib.ProtocolError\nxmlrpclib.ResponseError\nxmlrpclib.SERVER_ERROR\nxmlrpclib.SYSTEM_ERROR\nxmlrpclib.SafeTransport(??)\nxmlrpclib.Server(??)\nxmlrpclib.ServerProxy(??)\nxmlrpclib.SgmlopParser\nxmlrpclib.SliceType\nxmlrpclib.SlowParser(??)\nxmlrpclib.StringIO\nxmlrpclib.StringType\nxmlrpclib.StringTypes\nxmlrpclib.TRANSPORT_ERROR\nxmlrpclib.TracebackType\nxmlrpclib.Transport(??)\nxmlrpclib.True\nxmlrpclib.TupleType\nxmlrpclib.TypeType\nxmlrpclib.UNSUPPORTED_ENCODING\nxmlrpclib.UnboundMethodType\nxmlrpclib.UnicodeType\nxmlrpclib.Unmarshaller(??)\nxmlrpclib.WRAPPERS\nxmlrpclib.XRangeType\nxmlrpclib.base64\nxmlrpclib.boolean\nxmlrpclib.datetime\nxmlrpclib.dumps(??)\nxmlrpclib.escape(??)\nxmlrpclib.expat\nxmlrpclib.getparser() -> parser, unmarshaller\nxmlrpclib.loads(??)\nxmlrpclib.operator\nxmlrpclib.re\nxmlrpclib.string\nxmlrpclib.time\nxrange([start,] stop[, step]) -> xrange object\nxxsubtype.bench\nxxsubtype.spamdict\nxxsubtype.spamlist\nzip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\nzipfile.BadZipfile\nzipfile.LargeZipFile\nzipfile.PyZipFile(??)\nzipfile.ZIP64_LIMIT\nzipfile.ZIP_DEFLATED\nzipfile.ZIP_STORED\nzipfile.ZipFile(??)\nzipfile.ZipInfo\nzipfile.binascii\nzipfile.cStringIO\nzipfile.error\nzipfile.is_zipfile(??)\nzipfile.main(??)\nzipfile.os\nzipfile.stringCentralDir\nzipfile.stringEndArchive\nzipfile.stringEndArchive64\nzipfile.stringEndArchive64Locator\nzipfile.stringFileHeader\nzipfile.struct\nzipfile.structCentralDir\nzipfile.structEndArchive\nzipfile.structEndArchive64\nzipfile.structEndArchive64Locator\nzipfile.structFileHeader\nzipfile.sys\nzipfile.time\nzipfile.zlib\nzipimport.ZipImportError\nzipimport.zipimporter(archivepath) -> zipimporter object\nzlib.DEFLATED\nzlib.DEF_MEM_LEVEL\nzlib.MAX_WBITS\nzlib.ZLIB_VERSION\nzlib.Z_BEST_COMPRESSION\nzlib.Z_BEST_SPEED\nzlib.Z_DEFAULT_COMPRESSION\nzlib.Z_DEFAULT_STRATEGY\nzlib.Z_FILTERED\nzlib.Z_FINISH\nzlib.Z_FULL_FLUSH\nzlib.Z_HUFFMAN_ONLY\nzlib.Z_NO_FLUSH\nzlib.Z_SYNC_FLUSH\nzlib.adler32(string[, start]) -- Compute an Adler-32 checksum of string.\nzlib.compress(string[, level]) -- Returned compressed string.\nzlib.compressobj([level]) -- Return a compressor object.\nzlib.crc32(string[, start]) -- Compute a CRC-32 checksum of string.\nzlib.decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\nzlib.decompressobj([wbits]) -- Return a decompressor object.\nzlib.error\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/qsci/api/python/Python-2.6.api",
    "content": "ArithmeticError\nAssertionError\nAttributeError\nBaseException\nBaseHTTPServer.BaseHTTPRequestHandler(??)\nBaseHTTPServer.DEFAULT_ERROR_CONTENT_TYPE\nBaseHTTPServer.DEFAULT_ERROR_MESSAGE\nBaseHTTPServer.HTTPServer(??)\nBaseHTTPServer.SocketServer\nBaseHTTPServer.catch_warnings\nBaseHTTPServer.filterwarnings(??)\nBaseHTTPServer.mimetools\nBaseHTTPServer.socket\nBaseHTTPServer.sys\nBaseHTTPServer.test(??)\nBaseHTTPServer.time\nBastion.Bastion(??)\nBastion.BastionClass(??)\nBastion.MethodType\nBufferError\nBytesWarning\nCGIHTTPServer.BaseHTTPServer\nCGIHTTPServer.CGIHTTPRequestHandler(??)\nCGIHTTPServer.SimpleHTTPServer\nCGIHTTPServer.executable(??)\nCGIHTTPServer.nobody\nCGIHTTPServer.nobody_uid(??)\nCGIHTTPServer.os\nCGIHTTPServer.select\nCGIHTTPServer.sys\nCGIHTTPServer.test(??)\nCGIHTTPServer.urllib\nConfigParser.ConfigParser(??)\nConfigParser.DEFAULTSECT\nConfigParser.DuplicateSectionError\nConfigParser.Error\nConfigParser.InterpolationDepthError\nConfigParser.InterpolationError\nConfigParser.InterpolationMissingOptionError\nConfigParser.InterpolationSyntaxError\nConfigParser.MAX_INTERPOLATION_DEPTH\nConfigParser.MissingSectionHeaderError\nConfigParser.NoOptionError\nConfigParser.NoSectionError\nConfigParser.ParsingError\nConfigParser.RawConfigParser(??)\nConfigParser.SafeConfigParser(??)\nConfigParser.re\nCookie.BaseCookie\nCookie.Cookie\nCookie.CookieError\nCookie.Morsel\nCookie.SerialCookie\nCookie.SimpleCookie\nCookie.SmartCookie\nCookie.dumps(obj, protocol=0) -- Return a string containing an object in pickle format.\nCookie.loads(string) -- Load a pickle from the given string\nCookie.re\nCookie.string\nCookie.warnings\nDeprecationWarning\nDocXMLRPCServer.CGIXMLRPCRequestHandler(??)\nDocXMLRPCServer.DocCGIXMLRPCRequestHandler(??)\nDocXMLRPCServer.DocXMLRPCRequestHandler(??)\nDocXMLRPCServer.DocXMLRPCServer(??)\nDocXMLRPCServer.ServerHTMLDoc(??)\nDocXMLRPCServer.SimpleXMLRPCRequestHandler(??)\nDocXMLRPCServer.SimpleXMLRPCServer(??)\nDocXMLRPCServer.XMLRPCDocGenerator(??)\nDocXMLRPCServer.inspect\nDocXMLRPCServer.pydoc\nDocXMLRPCServer.re\nDocXMLRPCServer.resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d\nDocXMLRPCServer.sys\nEOFError\nEllipsis\nEnvironmentError\nException\nFalse\nFloatingPointError\nFutureWarning\nGeneratorExit\nHTMLParser.HTMLParseError\nHTMLParser.HTMLParser(??)\nHTMLParser.attrfind\nHTMLParser.charref\nHTMLParser.commentclose\nHTMLParser.endendtag\nHTMLParser.endtagfind\nHTMLParser.entityref\nHTMLParser.incomplete\nHTMLParser.interesting_cdata\nHTMLParser.interesting_normal\nHTMLParser.locatestarttagend\nHTMLParser.markupbase\nHTMLParser.piclose\nHTMLParser.re\nHTMLParser.starttagopen\nHTMLParser.tagfind\nIOError\nImportError\nImportWarning\nIndentationError\nIndexError\nKeyError\nKeyboardInterrupt\nLookupError\nMemoryError\nMimeWriter.MimeWriter(??)\nMimeWriter.mimetools\nMimeWriter.warnings\nNameError\nNone\nNotImplemented\nNotImplementedError\nOSError\nOverflowError\nPendingDeprecationWarning\nQueue.Empty\nQueue.Full\nQueue.LifoQueue(??)\nQueue.PriorityQueue(??)\nQueue.Queue(??)\nQueue.deque(iterable[, maxlen]) --> deque object\nQueue.heapq\nReferenceError\nRuntimeError\nRuntimeWarning\nSimpleHTTPServer.BaseHTTPServer\nSimpleHTTPServer.SimpleHTTPRequestHandler(??)\nSimpleHTTPServer.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nSimpleHTTPServer.cgi\nSimpleHTTPServer.mimetypes\nSimpleHTTPServer.os\nSimpleHTTPServer.posixpath\nSimpleHTTPServer.shutil\nSimpleHTTPServer.test(??)\nSimpleHTTPServer.urllib\nSimpleXMLRPCServer.BaseHTTPServer\nSimpleXMLRPCServer.CGIXMLRPCRequestHandler(??)\nSimpleXMLRPCServer.Fault\nSimpleXMLRPCServer.SimpleXMLRPCDispatcher(??)\nSimpleXMLRPCServer.SimpleXMLRPCRequestHandler(??)\nSimpleXMLRPCServer.SimpleXMLRPCServer(??)\nSimpleXMLRPCServer.SocketServer\nSimpleXMLRPCServer.fcntl\nSimpleXMLRPCServer.list_public_methods(??)\nSimpleXMLRPCServer.os\nSimpleXMLRPCServer.remove_duplicates([2,2,2,1,3,3]) => [3,1,2]\nSimpleXMLRPCServer.resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d\nSimpleXMLRPCServer.sys\nSimpleXMLRPCServer.traceback\nSimpleXMLRPCServer.xmlrpclib\nSocketServer.BaseRequestHandler(??)\nSocketServer.BaseServer(??)\nSocketServer.DatagramRequestHandler(??)\nSocketServer.ForkingMixIn(??)\nSocketServer.ForkingTCPServer(??)\nSocketServer.ForkingUDPServer(??)\nSocketServer.StreamRequestHandler(??)\nSocketServer.TCPServer(??)\nSocketServer.ThreadingMixIn(??)\nSocketServer.ThreadingTCPServer(??)\nSocketServer.ThreadingUDPServer(??)\nSocketServer.ThreadingUnixDatagramServer(??)\nSocketServer.ThreadingUnixStreamServer(??)\nSocketServer.UDPServer(??)\nSocketServer.UnixDatagramServer(??)\nSocketServer.UnixStreamServer(??)\nSocketServer.os\nSocketServer.select\nSocketServer.socket\nSocketServer.sys\nSocketServer.threading\nStandardError\nStopIteration\nStringIO.EINVAL\nStringIO.StringIO(??)\nStringIO.test(??)\nSyntaxError\nSyntaxWarning\nSystemError\nSystemExit\nTabError\nTrue\nTypeError\nUnboundLocalError\nUnicodeDecodeError\nUnicodeEncodeError\nUnicodeError\nUnicodeTranslateError\nUnicodeWarning\nUserDict.DictMixin(??)\nUserDict.IterableUserDict(??)\nUserDict.UserDict(??)\nUserList.UserList\nUserList.collections\nUserString.MutableString\nUserString.UserString\nUserString.collections\nUserString.sys\nUserWarning\nValueError\nWarning\nZeroDivisionError\nabc.ABCMeta\nabc.abstractmethod(??)\nabc.abstractproperty\nabs(number) -> number\naifc.Aifc_read(??)\naifc.Aifc_write(??)\naifc.Chunk(??)\naifc.Error\naifc.open(??)\naifc.openfp(??)\naifc.struct\nall(iterable) -> bool\nany(iterable) -> bool\nanydbm.error\nanydbm.open(??)\napply(object[, args[, kwargs]]) -> value\narray.ArrayType\narray.array(typecode [, initializer]) -> array\nast.AST\nast.Add\nast.And\nast.Assert\nast.Assign\nast.Attribute\nast.AugAssign\nast.AugLoad\nast.AugStore\nast.BinOp\nast.BitAnd\nast.BitOr\nast.BitXor\nast.BoolOp\nast.Break\nast.Call\nast.ClassDef\nast.Compare\nast.Continue\nast.Del\nast.Delete\nast.Dict\nast.Div\nast.Ellipsis\nast.Eq\nast.ExceptHandler\nast.Exec\nast.Expr\nast.Expression\nast.ExtSlice\nast.FloorDiv\nast.For\nast.FunctionDef\nast.GeneratorExp\nast.Global\nast.Gt\nast.GtE\nast.If\nast.IfExp\nast.Import\nast.ImportFrom\nast.In\nast.Index\nast.Interactive\nast.Invert\nast.Is\nast.IsNot\nast.LShift\nast.Lambda\nast.List\nast.ListComp\nast.Load\nast.Lt\nast.LtE\nast.Mod\nast.Module\nast.Mult\nast.Name\nast.NodeTransformer\nast.NodeVisitor\nast.Not\nast.NotEq\nast.NotIn\nast.Num\nast.Or\nast.Param\nast.Pass\nast.Pow\nast.Print\nast.PyCF_ONLY_AST\nast.RShift\nast.Raise\nast.Repr\nast.Return\nast.Slice\nast.Store\nast.Str\nast.Sub\nast.Subscript\nast.Suite\nast.TryExcept\nast.TryFinally\nast.Tuple\nast.UAdd\nast.USub\nast.UnaryOp\nast.While\nast.With\nast.Yield\nast.alias\nast.arguments\nast.boolop\nast.cmpop\nast.comprehension\nast.copy_location(??)\nast.dump(??)\nast.excepthandler\nast.expr\nast.expr_context\nast.fix_missing_locations(??)\nast.get_docstring(??)\nast.increment_lineno(??)\nast.iter_child_nodes(??)\nast.iter_fields(??)\nast.keyword\nast.literal_eval(??)\nast.mod\nast.operator\nast.parse(??)\nast.slice\nast.stmt\nast.unaryop\nast.walk(??)\nasynchat.async_chat(??)\nasynchat.asyncore\nasynchat.catch_warnings\nasynchat.deque(iterable[, maxlen]) --> deque object\nasynchat.fifo(??)\nasynchat.filterwarnings(??)\nasynchat.find_prefix_at_end(??)\nasynchat.py3kwarning\nasynchat.simple_producer(??)\nasynchat.socket\nasyncore.EALREADY\nasyncore.EBADF\nasyncore.ECONNABORTED\nasyncore.ECONNRESET\nasyncore.EINPROGRESS\nasyncore.EINTR\nasyncore.EISCONN\nasyncore.ENOTCONN\nasyncore.ESHUTDOWN\nasyncore.EWOULDBLOCK\nasyncore.ExitNow\nasyncore.close_all(??)\nasyncore.compact_traceback(??)\nasyncore.dispatcher(??)\nasyncore.dispatcher_with_send(??)\nasyncore.errorcode\nasyncore.fcntl\nasyncore.file_dispatcher(??)\nasyncore.file_wrapper(??)\nasyncore.loop(??)\nasyncore.os\nasyncore.poll(??)\nasyncore.poll2(??)\nasyncore.poll3(??)\nasyncore.read(??)\nasyncore.readwrite(??)\nasyncore.select\nasyncore.socket\nasyncore.socket_map\nasyncore.sys\nasyncore.time\nasyncore.write(??)\natexit.register(??)\natexit.sys\naudiodev.AudioDev(??)\naudiodev.Play_Audio_sgi(??)\naudiodev.Play_Audio_sun(??)\naudiodev.error\naudiodev.test(??)\naudioop.add\naudioop.adpcm2lin\naudioop.alaw2lin\naudioop.avg\naudioop.avgpp\naudioop.bias\naudioop.cross\naudioop.error\naudioop.findfactor\naudioop.findfit\naudioop.findmax\naudioop.getsample\naudioop.lin2adpcm\naudioop.lin2alaw\naudioop.lin2lin\naudioop.lin2ulaw\naudioop.max\naudioop.maxpp\naudioop.minmax\naudioop.mul\naudioop.ratecv\naudioop.reverse\naudioop.rms\naudioop.tomono\naudioop.tostereo\naudioop.ulaw2lin\nbase64.EMPTYSTRING\nbase64.MAXBINSIZE\nbase64.MAXLINESIZE\nbase64.b16decode(??)\nbase64.b16encode(??)\nbase64.b32decode(??)\nbase64.b32encode(??)\nbase64.b64decode(??)\nbase64.b64encode(??)\nbase64.binascii\nbase64.decode(??)\nbase64.decodestring(??)\nbase64.encode(??)\nbase64.encodestring(??)\nbase64.k\nbase64.re\nbase64.standard_b64decode(??)\nbase64.standard_b64encode(??)\nbase64.struct\nbase64.test(??)\nbase64.test1(??)\nbase64.urlsafe_b64decode(??)\nbase64.urlsafe_b64encode(??)\nbase64.v\nbasestring\nbdb.Bdb(??)\nbdb.BdbQuit\nbdb.Breakpoint(??)\nbdb.Tdb(??)\nbdb.bar(??)\nbdb.checkfuncname(??)\nbdb.effective(??)\nbdb.foo(??)\nbdb.os\nbdb.set_trace(??)\nbdb.sys\nbdb.test(??)\nbdb.types\nbin(number) -> string\nbinascii.Error\nbinascii.Incomplete\nbinascii.a2b_base64\nbinascii.a2b_hex(hexstr) -> s; Binary data of hexadecimal representation.\nbinascii.a2b_hqx\nbinascii.a2b_qp\nbinascii.a2b_uu\nbinascii.b2a_base64\nbinascii.b2a_hex(data) -> s; Hexadecimal representation of binary data.\nbinascii.b2a_hqx\nbinascii.b2a_qp(data, quotetabs=0, istext=1, header=0) -> s;\nbinascii.b2a_uu\nbinascii.crc32\nbinascii.crc_hqx\nbinascii.hexlify\nbinascii.rlecode_hqx\nbinascii.rledecode_hqx\nbinascii.unhexlify\nbinhex.BinHex(??)\nbinhex.Error\nbinhex.FInfo(??)\nbinhex.HexBin(??)\nbinhex.LINELEN\nbinhex.REASONABLY_LARGE\nbinhex.RUNCHAR\nbinhex.binascii\nbinhex.binhex(??)\nbinhex.getfileinfo(??)\nbinhex.hexbin(??)\nbinhex.openrsrc(??)\nbinhex.os\nbinhex.struct\nbinhex.sys\nbisect.bisect\nbisect.bisect_left(a, x[, lo[, hi]]) -> index\nbisect.bisect_right(a, x[, lo[, hi]]) -> index\nbisect.insort\nbisect.insort_left(a, x[, lo[, hi]])\nbisect.insort_right(a, x[, lo[, hi]])\nbool(x) -> bool\nbuffer(object [, offset[, size]])\nbytearray(iterable_of_ints) -> bytearray.\nbytes\ncPickle.BadPickleGet\ncPickle.HIGHEST_PROTOCOL\ncPickle.PickleError\ncPickle.Pickler(file, protocol=0) -- Create a pickler.\ncPickle.PicklingError\ncPickle.UnpickleableError\ncPickle.Unpickler(file) -- Create an unpickler.\ncPickle.UnpicklingError\ncPickle.compatible_formats\ncPickle.dump(obj, file, protocol=0) -- Write an object in pickle format to the given file.\ncPickle.dumps(obj, protocol=0) -- Return a string containing an object in pickle format.\ncPickle.format_version\ncPickle.load(file) -- Load a pickle from the given file\ncPickle.loads(string) -- Load a pickle from the given string\ncProfile.Profile(custom_timer=None, time_unit=None, subcalls=True, builtins=True)\ncProfile.help(??)\ncProfile.label(??)\ncProfile.main(??)\ncProfile.run(??)\ncProfile.runctx(??)\ncStringIO.InputType\ncStringIO.OutputType\ncStringIO.StringIO([s]) -- Return a StringIO-like stream for reading or writing\ncStringIO.cStringIO_CAPI\ncalendar.Calendar\ncalendar.EPOCH\ncalendar.FRIDAY\ncalendar.February\ncalendar.HTMLCalendar\ncalendar.IllegalMonthError\ncalendar.IllegalWeekdayError\ncalendar.January\ncalendar.LocaleHTMLCalendar\ncalendar.LocaleTextCalendar\ncalendar.MONDAY\ncalendar.SATURDAY\ncalendar.SUNDAY\ncalendar.THURSDAY\ncalendar.TUESDAY\ncalendar.TextCalendar\ncalendar.TimeEncoding(??)\ncalendar.WEDNESDAY\ncalendar.c\ncalendar.calendar\ncalendar.datetime\ncalendar.day_abbr\ncalendar.day_name\ncalendar.error\ncalendar.firstweekday\ncalendar.format(??)\ncalendar.formatstring(??)\ncalendar.isleap(??)\ncalendar.leapdays(??)\ncalendar.main(??)\ncalendar.mdays\ncalendar.month\ncalendar.month_abbr\ncalendar.month_name\ncalendar.monthcalendar\ncalendar.monthrange(??)\ncalendar.prcal\ncalendar.prmonth\ncalendar.prweek\ncalendar.setfirstweekday(??)\ncalendar.sys\ncalendar.timegm(??)\ncalendar.week\ncalendar.weekday(??)\ncalendar.weekheader\ncallable(object) -> bool\ncgi.FieldStorage(??)\ncgi.FormContent(??)\ncgi.FormContentDict(??)\ncgi.InterpFormContentDict(??)\ncgi.MiniFieldStorage(??)\ncgi.StringIO([s]) -- Return a StringIO-like stream for reading or writing\ncgi.SvFormContentDict(??)\ncgi.UserDict\ncgi.attrgetter(attr, ...) --> attrgetter object\ncgi.catch_warnings\ncgi.dolog(??)\ncgi.escape(??)\ncgi.filterwarnings(??)\ncgi.initlog(??)\ncgi.log(??)\ncgi.logfile\ncgi.logfp\ncgi.maxlen\ncgi.mimetools\ncgi.nolog(??)\ncgi.os\ncgi.parse(??)\ncgi.parse_header(??)\ncgi.parse_multipart(??)\ncgi.parse_qs(??)\ncgi.parse_qsl(??)\ncgi.print_arguments(??)\ncgi.print_directory(??)\ncgi.print_environ(??)\ncgi.print_environ_usage(??)\ncgi.print_exception(??)\ncgi.print_form(??)\ncgi.rfc822\ncgi.sys\ncgi.test(??)\ncgi.urllib\ncgi.urlparse\ncgi.valid_boundary(??)\ncgi.warn\ncgitb.Hook(??)\ncgitb.enable(??)\ncgitb.grey(??)\ncgitb.handler\ncgitb.html(??)\ncgitb.lookup(??)\ncgitb.reset(??)\ncgitb.scanvars(??)\ncgitb.small(??)\ncgitb.strong(??)\ncgitb.sys\ncgitb.text(??)\nchr(i) -> character\nchunk.Chunk(??)\nclassmethod(function) -> method\ncmath.acos(x)\ncmath.acosh(x)\ncmath.asin(x)\ncmath.asinh(x)\ncmath.atan(x)\ncmath.atanh(x)\ncmath.cos(x)\ncmath.cosh(x)\ncmath.e\ncmath.exp(x)\ncmath.isinf(z) -> bool\ncmath.isnan(z) -> bool\ncmath.log(x[, base]) -> the logarithm of x to the given base.\ncmath.log10(x)\ncmath.phase(z) -> float\ncmath.pi\ncmath.polar(z) -> r: float, phi: float\ncmath.rect(r, phi) -> z: complex\ncmath.sin(x)\ncmath.sinh(x)\ncmath.sqrt(x)\ncmath.tan(x)\ncmath.tanh(x)\ncmd.Cmd(??)\ncmd.IDENTCHARS\ncmd.PROMPT\ncmd.string\ncmp(x, y) -> integer\ncode.CommandCompiler(??)\ncode.InteractiveConsole(??)\ncode.InteractiveInterpreter(??)\ncode.compile_command(??)\ncode.interact(??)\ncode.softspace(??)\ncode.sys\ncode.traceback\ncodecs.BOM\ncodecs.BOM32_BE\ncodecs.BOM32_LE\ncodecs.BOM64_BE\ncodecs.BOM64_LE\ncodecs.BOM_BE\ncodecs.BOM_LE\ncodecs.BOM_UTF16\ncodecs.BOM_UTF16_BE\ncodecs.BOM_UTF16_LE\ncodecs.BOM_UTF32\ncodecs.BOM_UTF32_BE\ncodecs.BOM_UTF32_LE\ncodecs.BOM_UTF8\ncodecs.BufferedIncrementalDecoder\ncodecs.BufferedIncrementalEncoder\ncodecs.Codec(??)\ncodecs.CodecInfo\ncodecs.EncodedFile(??)\ncodecs.IncrementalDecoder\ncodecs.IncrementalEncoder\ncodecs.StreamReader(??)\ncodecs.StreamReaderWriter(??)\ncodecs.StreamRecoder(??)\ncodecs.StreamWriter(??)\ncodecs.ascii_decode\ncodecs.ascii_encode\ncodecs.backslashreplace_errors\ncodecs.charbuffer_encode\ncodecs.charmap_build\ncodecs.charmap_decode\ncodecs.charmap_encode\ncodecs.decode(obj, [encoding[,errors]]) -> object\ncodecs.encode(obj, [encoding[,errors]]) -> object\ncodecs.escape_decode\ncodecs.escape_encode\ncodecs.getdecoder(??)\ncodecs.getencoder(??)\ncodecs.getincrementaldecoder(??)\ncodecs.getincrementalencoder(??)\ncodecs.getreader(??)\ncodecs.getwriter(??)\ncodecs.ignore_errors\ncodecs.iterdecode(??)\ncodecs.iterencode(??)\ncodecs.latin_1_decode\ncodecs.latin_1_encode\ncodecs.lookup(encoding) -> CodecInfo\ncodecs.lookup_error(errors) -> handler\ncodecs.make_encoding_map(??)\ncodecs.make_identity_dict(rng) -> dict\ncodecs.open(??)\ncodecs.raw_unicode_escape_decode\ncodecs.raw_unicode_escape_encode\ncodecs.readbuffer_encode\ncodecs.register(search_function)\ncodecs.register_error(errors, handler)\ncodecs.replace_errors\ncodecs.strict_errors\ncodecs.sys\ncodecs.unicode_escape_decode\ncodecs.unicode_escape_encode\ncodecs.unicode_internal_decode\ncodecs.unicode_internal_encode\ncodecs.utf_16_be_decode\ncodecs.utf_16_be_encode\ncodecs.utf_16_decode\ncodecs.utf_16_encode\ncodecs.utf_16_ex_decode\ncodecs.utf_16_le_decode\ncodecs.utf_16_le_encode\ncodecs.utf_32_be_decode\ncodecs.utf_32_be_encode\ncodecs.utf_32_decode\ncodecs.utf_32_encode\ncodecs.utf_32_ex_decode\ncodecs.utf_32_le_decode\ncodecs.utf_32_le_encode\ncodecs.utf_7_decode\ncodecs.utf_7_encode\ncodecs.utf_8_decode\ncodecs.utf_8_encode\ncodecs.xmlcharrefreplace_errors\ncodeop.CommandCompiler(??)\ncodeop.Compile(??)\ncodeop.PyCF_DONT_IMPLY_DEDENT\ncodeop.compile_command(??)\ncodeop.fname\ncoerce(x, y) -> (x1, y1)\ncollections.Callable\ncollections.Container\ncollections.Hashable\ncollections.ItemsView\ncollections.Iterable\ncollections.Iterator\ncollections.KeysView\ncollections.Mapping\ncollections.MappingView\ncollections.MutableMapping\ncollections.MutableSequence\ncollections.MutableSet\ncollections.Sequence\ncollections.Set\ncollections.Sized\ncollections.ValuesView\ncollections.defaultdict(default_factory) --> dict with default factory\ncollections.deque(iterable[, maxlen]) --> deque object\ncollections.namedtuple(??)\ncolorsys.ONE_SIXTH\ncolorsys.ONE_THIRD\ncolorsys.TWO_THIRD\ncolorsys.hls_to_rgb(??)\ncolorsys.hsv_to_rgb(??)\ncolorsys.rgb_to_hls(??)\ncolorsys.rgb_to_hsv(??)\ncolorsys.rgb_to_yiq(??)\ncolorsys.yiq_to_rgb(??)\ncommands.getoutput(??)\ncommands.getstatus(??)\ncommands.getstatusoutput(??)\ncommands.mk2arg(??)\ncommands.mkarg(??)\ncompile(source, filename, mode[, flags[, dont_inherit]]) -> code object\ncompileall.compile_dir(??)\ncompileall.compile_path(??)\ncompileall.main(??)\ncompileall.os\ncompileall.py_compile\ncompileall.sys\ncompiler.ast\ncompiler.ast.Add(??)\ncompiler.ast.And(??)\ncompiler.ast.AssAttr(??)\ncompiler.ast.AssList(??)\ncompiler.ast.AssName(??)\ncompiler.ast.AssTuple(??)\ncompiler.ast.Assert(??)\ncompiler.ast.Assign(??)\ncompiler.ast.AugAssign(??)\ncompiler.ast.Backquote(??)\ncompiler.ast.Bitand(??)\ncompiler.ast.Bitor(??)\ncompiler.ast.Bitxor(??)\ncompiler.ast.Break(??)\ncompiler.ast.CO_VARARGS\ncompiler.ast.CO_VARKEYWORDS\ncompiler.ast.CallFunc(??)\ncompiler.ast.Class(??)\ncompiler.ast.Compare(??)\ncompiler.ast.Const(??)\ncompiler.ast.Continue(??)\ncompiler.ast.Decorators(??)\ncompiler.ast.Dict(??)\ncompiler.ast.Discard(??)\ncompiler.ast.Div(??)\ncompiler.ast.Ellipsis(??)\ncompiler.ast.EmptyNode(??)\ncompiler.ast.Exec(??)\ncompiler.ast.Expression(??)\ncompiler.ast.FloorDiv(??)\ncompiler.ast.For(??)\ncompiler.ast.From(??)\ncompiler.ast.Function(??)\ncompiler.ast.GenExpr(??)\ncompiler.ast.GenExprFor(??)\ncompiler.ast.GenExprIf(??)\ncompiler.ast.GenExprInner(??)\ncompiler.ast.Getattr(??)\ncompiler.ast.Global(??)\ncompiler.ast.If(??)\ncompiler.ast.IfExp(??)\ncompiler.ast.Import(??)\ncompiler.ast.Invert(??)\ncompiler.ast.Keyword(??)\ncompiler.ast.Lambda(??)\ncompiler.ast.LeftShift(??)\ncompiler.ast.List(??)\ncompiler.ast.ListComp(??)\ncompiler.ast.ListCompFor(??)\ncompiler.ast.ListCompIf(??)\ncompiler.ast.Mod(??)\ncompiler.ast.Module(??)\ncompiler.ast.Mul(??)\ncompiler.ast.Name(??)\ncompiler.ast.Node(??)\ncompiler.ast.Not(??)\ncompiler.ast.Or(??)\ncompiler.ast.Pass(??)\ncompiler.ast.Power(??)\ncompiler.ast.Print(??)\ncompiler.ast.Printnl(??)\ncompiler.ast.Raise(??)\ncompiler.ast.Return(??)\ncompiler.ast.RightShift(??)\ncompiler.ast.Slice(??)\ncompiler.ast.Sliceobj(??)\ncompiler.ast.Stmt(??)\ncompiler.ast.Sub(??)\ncompiler.ast.Subscript(??)\ncompiler.ast.TryExcept(??)\ncompiler.ast.TryFinally(??)\ncompiler.ast.Tuple(??)\ncompiler.ast.UnaryAdd(??)\ncompiler.ast.UnarySub(??)\ncompiler.ast.While(??)\ncompiler.ast.With(??)\ncompiler.ast.Yield(??)\ncompiler.ast.flatten(??)\ncompiler.ast.flatten_nodes(??)\ncompiler.ast.name\ncompiler.ast.nodes\ncompiler.ast.obj(??)\ncompiler.compile(??)\ncompiler.compileFile(??)\ncompiler.consts\ncompiler.consts.CO_FUTURE_ABSIMPORT\ncompiler.consts.CO_FUTURE_DIVISION\ncompiler.consts.CO_FUTURE_PRINT_FUNCTION\ncompiler.consts.CO_FUTURE_WITH_STATEMENT\ncompiler.consts.CO_GENERATOR\ncompiler.consts.CO_GENERATOR_ALLOWED\ncompiler.consts.CO_NESTED\ncompiler.consts.CO_NEWLOCALS\ncompiler.consts.CO_OPTIMIZED\ncompiler.consts.CO_VARARGS\ncompiler.consts.CO_VARKEYWORDS\ncompiler.consts.OP_APPLY\ncompiler.consts.OP_ASSIGN\ncompiler.consts.OP_DELETE\ncompiler.consts.SC_CELL\ncompiler.consts.SC_FREE\ncompiler.consts.SC_GLOBAL\ncompiler.consts.SC_LOCAL\ncompiler.consts.SC_UNKNOWN\ncompiler.future\ncompiler.future.BadFutureParser(??)\ncompiler.future.FutureParser(??)\ncompiler.future.ast\ncompiler.future.find_futures(??)\ncompiler.future.is_future(??)\ncompiler.future.walk(??)\ncompiler.misc\ncompiler.misc.MANGLE_LEN\ncompiler.misc.Set(??)\ncompiler.misc.Stack(??)\ncompiler.misc.flatten(??)\ncompiler.misc.mangle(??)\ncompiler.misc.set_filename(??)\ncompiler.parse(??)\ncompiler.parseFile(??)\ncompiler.pyassem\ncompiler.pyassem.Block(??)\ncompiler.pyassem.CONV\ncompiler.pyassem.CO_NEWLOCALS\ncompiler.pyassem.CO_OPTIMIZED\ncompiler.pyassem.CO_VARARGS\ncompiler.pyassem.CO_VARKEYWORDS\ncompiler.pyassem.DONE\ncompiler.pyassem.FLAT\ncompiler.pyassem.FlowGraph(??)\ncompiler.pyassem.LineAddrTable(??)\ncompiler.pyassem.PyFlowGraph(??)\ncompiler.pyassem.RAW\ncompiler.pyassem.StackDepthTracker(??)\ncompiler.pyassem.TupleArg(??)\ncompiler.pyassem.dfs_postorder(??)\ncompiler.pyassem.dis\ncompiler.pyassem.findDepth\ncompiler.pyassem.getArgCount(??)\ncompiler.pyassem.isJump(??)\ncompiler.pyassem.misc\ncompiler.pyassem.sys\ncompiler.pyassem.twobyte(??)\ncompiler.pyassem.types\ncompiler.pycodegen\ncompiler.pycodegen.AbstractClassCode(??)\ncompiler.pycodegen.AbstractCompileMode(??)\ncompiler.pycodegen.AbstractFunctionCode(??)\ncompiler.pycodegen.AugGetattr(??)\ncompiler.pycodegen.AugName(??)\ncompiler.pycodegen.AugSlice(??)\ncompiler.pycodegen.AugSubscript(??)\ncompiler.pycodegen.CO_FUTURE_ABSIMPORT\ncompiler.pycodegen.CO_FUTURE_DIVISION\ncompiler.pycodegen.CO_FUTURE_PRINT_FUNCTION\ncompiler.pycodegen.CO_FUTURE_WITH_STATEMENT\ncompiler.pycodegen.CO_GENERATOR\ncompiler.pycodegen.CO_NESTED\ncompiler.pycodegen.CO_NEWLOCALS\ncompiler.pycodegen.CO_VARARGS\ncompiler.pycodegen.CO_VARKEYWORDS\ncompiler.pycodegen.ClassCodeGenerator(??)\ncompiler.pycodegen.CodeGenerator(??)\ncompiler.pycodegen.Delegator(??)\ncompiler.pycodegen.END_FINALLY\ncompiler.pycodegen.EXCEPT\ncompiler.pycodegen.Expression(??)\ncompiler.pycodegen.ExpressionCodeGenerator(??)\ncompiler.pycodegen.FunctionCodeGenerator(??)\ncompiler.pycodegen.GenExprCodeGenerator(??)\ncompiler.pycodegen.Interactive(??)\ncompiler.pycodegen.InteractiveCodeGenerator(??)\ncompiler.pycodegen.LOOP\ncompiler.pycodegen.LocalNameFinder(??)\ncompiler.pycodegen.Module(??)\ncompiler.pycodegen.ModuleCodeGenerator(??)\ncompiler.pycodegen.NestedScopeMixin(??)\ncompiler.pycodegen.OpFinder(??)\ncompiler.pycodegen.SC_CELL\ncompiler.pycodegen.SC_FREE\ncompiler.pycodegen.SC_GLOBAL\ncompiler.pycodegen.SC_LOCAL\ncompiler.pycodegen.StringIO([s]) -- Return a StringIO-like stream for reading or writing\ncompiler.pycodegen.TRY_FINALLY\ncompiler.pycodegen.TupleArg(??)\ncompiler.pycodegen.VERSION\ncompiler.pycodegen.ast\ncompiler.pycodegen.callfunc_opcode_info\ncompiler.pycodegen.compile(??)\ncompiler.pycodegen.compileFile(??)\ncompiler.pycodegen.findOp(??)\ncompiler.pycodegen.future\ncompiler.pycodegen.generateArgList(??)\ncompiler.pycodegen.imp\ncompiler.pycodegen.is_constant_false(??)\ncompiler.pycodegen.marshal\ncompiler.pycodegen.misc\ncompiler.pycodegen.os\ncompiler.pycodegen.parse(??)\ncompiler.pycodegen.pyassem\ncompiler.pycodegen.struct\ncompiler.pycodegen.symbols\ncompiler.pycodegen.syntax\ncompiler.pycodegen.sys\ncompiler.pycodegen.walk(??)\ncompiler.pycodegen.wrap_aug(??)\ncompiler.pycodegen.wrapper\ncompiler.symbols\ncompiler.symbols.ClassScope(??)\ncompiler.symbols.FunctionScope(??)\ncompiler.symbols.GenExprScope(??)\ncompiler.symbols.LambdaScope(??)\ncompiler.symbols.MANGLE_LEN\ncompiler.symbols.ModuleScope(??)\ncompiler.symbols.SC_CELL\ncompiler.symbols.SC_FREE\ncompiler.symbols.SC_GLOBAL\ncompiler.symbols.SC_LOCAL\ncompiler.symbols.SC_UNKNOWN\ncompiler.symbols.Scope(??)\ncompiler.symbols.SymbolVisitor(??)\ncompiler.symbols.ast\ncompiler.symbols.list_eq(??)\ncompiler.symbols.mangle(??)\ncompiler.symbols.sys\ncompiler.symbols.types\ncompiler.syntax\ncompiler.syntax.SyntaxErrorChecker(??)\ncompiler.syntax.ast\ncompiler.syntax.check(??)\ncompiler.syntax.walk(??)\ncompiler.transformer\ncompiler.transformer.Add(??)\ncompiler.transformer.And(??)\ncompiler.transformer.AssAttr(??)\ncompiler.transformer.AssList(??)\ncompiler.transformer.AssName(??)\ncompiler.transformer.AssTuple(??)\ncompiler.transformer.Assert(??)\ncompiler.transformer.Assign(??)\ncompiler.transformer.AugAssign(??)\ncompiler.transformer.Backquote(??)\ncompiler.transformer.Bitand(??)\ncompiler.transformer.Bitor(??)\ncompiler.transformer.Bitxor(??)\ncompiler.transformer.Break(??)\ncompiler.transformer.CO_VARARGS\ncompiler.transformer.CO_VARKEYWORDS\ncompiler.transformer.CallFunc(??)\ncompiler.transformer.Class(??)\ncompiler.transformer.Compare(??)\ncompiler.transformer.Const(??)\ncompiler.transformer.Continue(??)\ncompiler.transformer.Decorators(??)\ncompiler.transformer.Dict(??)\ncompiler.transformer.Discard(??)\ncompiler.transformer.Div(??)\ncompiler.transformer.Ellipsis(??)\ncompiler.transformer.EmptyNode(??)\ncompiler.transformer.Exec(??)\ncompiler.transformer.Expression(??)\ncompiler.transformer.FloorDiv(??)\ncompiler.transformer.For(??)\ncompiler.transformer.From(??)\ncompiler.transformer.Function(??)\ncompiler.transformer.GenExpr(??)\ncompiler.transformer.GenExprFor(??)\ncompiler.transformer.GenExprIf(??)\ncompiler.transformer.GenExprInner(??)\ncompiler.transformer.Getattr(??)\ncompiler.transformer.Global(??)\ncompiler.transformer.If(??)\ncompiler.transformer.IfExp(??)\ncompiler.transformer.Import(??)\ncompiler.transformer.Invert(??)\ncompiler.transformer.Keyword(??)\ncompiler.transformer.Lambda(??)\ncompiler.transformer.LeftShift(??)\ncompiler.transformer.List(??)\ncompiler.transformer.ListComp(??)\ncompiler.transformer.ListCompFor(??)\ncompiler.transformer.ListCompIf(??)\ncompiler.transformer.Mod(??)\ncompiler.transformer.Module(??)\ncompiler.transformer.Mul(??)\ncompiler.transformer.Name(??)\ncompiler.transformer.Node(??)\ncompiler.transformer.Not(??)\ncompiler.transformer.OP_APPLY\ncompiler.transformer.OP_ASSIGN\ncompiler.transformer.OP_DELETE\ncompiler.transformer.Or(??)\ncompiler.transformer.Pass(??)\ncompiler.transformer.Power(??)\ncompiler.transformer.Print(??)\ncompiler.transformer.Printnl(??)\ncompiler.transformer.Raise(??)\ncompiler.transformer.Return(??)\ncompiler.transformer.RightShift(??)\ncompiler.transformer.Slice(??)\ncompiler.transformer.Sliceobj(??)\ncompiler.transformer.Stmt(??)\ncompiler.transformer.Sub(??)\ncompiler.transformer.Subscript(??)\ncompiler.transformer.Transformer(??)\ncompiler.transformer.TryExcept(??)\ncompiler.transformer.TryFinally(??)\ncompiler.transformer.Tuple(??)\ncompiler.transformer.UnaryAdd(??)\ncompiler.transformer.UnarySub(??)\ncompiler.transformer.WalkerError\ncompiler.transformer.While(??)\ncompiler.transformer.With(??)\ncompiler.transformer.Yield(??)\ncompiler.transformer.asList(??)\ncompiler.transformer.debug_tree(??)\ncompiler.transformer.extractLineNo(??)\ncompiler.transformer.flatten(??)\ncompiler.transformer.flatten_nodes(??)\ncompiler.transformer.k\ncompiler.transformer.name\ncompiler.transformer.nodes\ncompiler.transformer.obj(??)\ncompiler.transformer.parse(??)\ncompiler.transformer.parseFile(??)\ncompiler.transformer.parser\ncompiler.transformer.symbol\ncompiler.transformer.token\ncompiler.transformer.v\ncompiler.visitor\ncompiler.visitor.ASTVisitor(??)\ncompiler.visitor.ExampleASTVisitor(??)\ncompiler.visitor.ast\ncompiler.visitor.dumpNode(??)\ncompiler.visitor.walk(??)\ncompiler.walk(??)\ncomplex(real[, imag]) -> complex number\ncontextlib.GeneratorContextManager\ncontextlib.closing\ncontextlib.contextmanager(??)\ncontextlib.nested(??)\ncontextlib.sys\ncontextlib.wraps(??)\ncookielib.Absent(??)\ncookielib.Cookie(??)\ncookielib.CookieJar(??)\ncookielib.CookiePolicy(??)\ncookielib.DAYS\ncookielib.DEFAULT_HTTP_PORT\ncookielib.DefaultCookiePolicy(??)\ncookielib.EPOCH_YEAR\ncookielib.ESCAPED_CHAR_RE\ncookielib.FileCookieJar(??)\ncookielib.HEADER_ESCAPE_RE\ncookielib.HEADER_JOIN_ESCAPE_RE\ncookielib.HEADER_QUOTED_VALUE_RE\ncookielib.HEADER_TOKEN_RE\ncookielib.HEADER_VALUE_RE\ncookielib.HTTP_PATH_SAFE\ncookielib.IPV4_RE\ncookielib.ISO_DATE_RE\ncookielib.LOOSE_HTTP_DATE_RE\ncookielib.LWPCookieJar(??)\ncookielib.LoadError\ncookielib.MISSING_FILENAME_TEXT\ncookielib.MONTHS\ncookielib.MONTHS_LOWER\ncookielib.MozillaCookieJar(??)\ncookielib.STRICT_DATE_RE\ncookielib.TIMEZONE_RE\ncookielib.UTC_ZONES\ncookielib.WEEKDAY_RE\ncookielib.copy\ncookielib.cut_port_re\ncookielib.debug\ncookielib.deepvalues(??)\ncookielib.domain_match(??)\ncookielib.eff_request_host(??)\ncookielib.escape_path(??)\ncookielib.http2time(??)\ncookielib.httplib\ncookielib.is_HDN(??)\ncookielib.is_third_party(??)\ncookielib.iso2time(??)\ncookielib.join_header_words(??)\ncookielib.liberal_is_HDN(??)\ncookielib.logger\ncookielib.lwp_cookie_str(??)\ncookielib.month\ncookielib.offset_from_tz_string(??)\ncookielib.parse_ns_headers(??)\ncookielib.re\ncookielib.reach(??)\ncookielib.request_host(??)\ncookielib.request_path(??)\ncookielib.request_port(??)\ncookielib.split_header_words(??)\ncookielib.time\ncookielib.time2isoz(??)\ncookielib.time2netscape(??)\ncookielib.timegm(??)\ncookielib.unmatched(??)\ncookielib.uppercase_escaped_char(??)\ncookielib.urllib\ncookielib.urlparse\ncookielib.user_domain_match(??)\ncookielib.vals_sorted_by_key(??)\ncopy.Error\ncopy.PyStringMap\ncopy.copy(??)\ncopy.deepcopy(??)\ncopy.dispatch_table\ncopy.error\ncopy.name\ncopy.t\ncopy_reg.add_extension(??)\ncopy_reg.clear_extension_cache(??)\ncopy_reg.constructor(??)\ncopy_reg.dispatch_table\ncopy_reg.pickle(??)\ncopy_reg.pickle_complex(??)\ncopy_reg.remove_extension(??)\ncopyright\ncredits\ncrypt.crypt(word, salt) -> string\ncsv.Dialect(??)\ncsv.DictReader(??)\ncsv.DictWriter(??)\ncsv.Error\ncsv.QUOTE_ALL\ncsv.QUOTE_MINIMAL\ncsv.QUOTE_NONE\ncsv.QUOTE_NONNUMERIC\ncsv.Sniffer(??)\ncsv.StringIO([s]) -- Return a StringIO-like stream for reading or writing\ncsv.excel(??)\ncsv.excel_tab(??)\ncsv.field_size_limit\ncsv.get_dialect\ncsv.list_dialects\ncsv.re\ncsv.reader\ncsv.reduce(function, sequence[, initial]) -> value\ncsv.register_dialect\ncsv.unregister_dialect\ncsv.writer\nctypes.ARRAY(??)\nctypes.ArgumentError\nctypes.Array\nctypes.BigEndianStructure\nctypes.CDLL\nctypes.CFUNCTYPE(??)\nctypes.DEFAULT_MODE\nctypes.LibraryLoader\nctypes.LittleEndianStructure\nctypes.POINTER\nctypes.PYFUNCTYPE(??)\nctypes.PyDLL\nctypes.RTLD_GLOBAL\nctypes.RTLD_LOCAL\nctypes.SetPointerType(??)\nctypes.Structure\nctypes.Union\nctypes.addressof(C instance) -> integer\nctypes.alignment(C type) -> integer\nctypes.byref(C instance[, offset=0]) -> byref-object\nctypes.c_bool\nctypes.c_buffer(??)\nctypes.c_byte\nctypes.c_char\nctypes.c_char_p\nctypes.c_double\nctypes.c_float\nctypes.c_int\nctypes.c_int16\nctypes.c_int32\nctypes.c_int64\nctypes.c_int8\nctypes.c_long\nctypes.c_longdouble\nctypes.c_longlong\nctypes.c_short\nctypes.c_size_t\nctypes.c_ubyte\nctypes.c_uint\nctypes.c_uint16\nctypes.c_uint32\nctypes.c_uint64\nctypes.c_uint8\nctypes.c_ulong\nctypes.c_ulonglong\nctypes.c_ushort\nctypes.c_void_p\nctypes.c_voidp\nctypes.c_wchar\nctypes.c_wchar_p\nctypes.cast(??)\nctypes.cdll\nctypes.create_string_buffer(aString) -> character array\nctypes.create_unicode_buffer(aString) -> character array\nctypes.get_errno\nctypes.macholib.dyld.DEFAULT_FRAMEWORK_FALLBACK\nctypes.macholib.dyld.DEFAULT_LIBRARY_FALLBACK\nctypes.macholib.dyld.chain(*iterables) --> chain object\nctypes.macholib.dyld.combinations(iterable[, r]) --> combinations object\nctypes.macholib.dyld.count([firstval]) --> count object\nctypes.macholib.dyld.cycle(iterable) --> cycle object\nctypes.macholib.dyld.dropwhile(predicate, iterable) --> dropwhile object\nctypes.macholib.dyld.dyld_default_search(??)\nctypes.macholib.dyld.dyld_env(??)\nctypes.macholib.dyld.dyld_executable_path_search(??)\nctypes.macholib.dyld.dyld_fallback_framework_path(??)\nctypes.macholib.dyld.dyld_fallback_library_path(??)\nctypes.macholib.dyld.dyld_find(??)\nctypes.macholib.dyld.dyld_framework_path(??)\nctypes.macholib.dyld.dyld_image_suffix(??)\nctypes.macholib.dyld.dyld_image_suffix_search(??)\nctypes.macholib.dyld.dyld_library_path(??)\nctypes.macholib.dyld.dyld_override_search(??)\nctypes.macholib.dyld.dylib_info(??)\nctypes.macholib.dyld.ensure_utf8(??)\nctypes.macholib.dyld.framework_find(??)\nctypes.macholib.dyld.framework_info(??)\nctypes.macholib.dyld.groupby(iterable[, keyfunc]) -> create an iterator which returns\nctypes.macholib.dyld.ifilter(function or None, sequence) --> ifilter object\nctypes.macholib.dyld.ifilterfalse(function or None, sequence) --> ifilterfalse object\nctypes.macholib.dyld.imap(func, *iterables) --> imap object\nctypes.macholib.dyld.islice(iterable, [start,] stop [, step]) --> islice object\nctypes.macholib.dyld.izip(iter1 [,iter2 [...]]) --> izip object\nctypes.macholib.dyld.izip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> izip_longest object\nctypes.macholib.dyld.os\nctypes.macholib.dyld.permutations(iterable[, r]) --> permutations object\nctypes.macholib.dyld.product(*iterables) --> product object\nctypes.macholib.dyld.repeat(element [,times]) -> create an iterator which returns the element\nctypes.macholib.dyld.starmap(function, sequence) --> starmap object\nctypes.macholib.dyld.takewhile(predicate, iterable) --> takewhile object\nctypes.macholib.dyld.tee(iterable, n=2) --> tuple of n independent iterators.\nctypes.macholib.dyld.test_dyld_find(??)\nctypes.macholib.dylib.DYLIB_RE\nctypes.macholib.dylib.dylib_info(??)\nctypes.macholib.dylib.re\nctypes.macholib.dylib.test_dylib_info(??)\nctypes.macholib.framework\nctypes.macholib.framework.STRICT_FRAMEWORK_RE\nctypes.macholib.framework.framework_info(??)\nctypes.macholib.framework.re\nctypes.macholib.framework.test_framework_info(??)\nctypes.memmove\nctypes.memset\nctypes.pointer\nctypes.py_object\nctypes.pydll\nctypes.pythonapi\nctypes.resize\nctypes.set_conversion_mode(encoding, errors) -> (previous-encoding, previous-errors)\nctypes.set_errno\nctypes.sizeof(C type) -> integer\nctypes.string_at(addr[, size]) -> string\nctypes.util\nctypes.util.errno\nctypes.util.find_library(??)\nctypes.util.os\nctypes.util.re\nctypes.util.sys\nctypes.util.tempfile\nctypes.util.test(??)\nctypes.wstring_at(addr[, size]) -> string\ndatetime.MAXYEAR\ndatetime.MINYEAR\ndatetime.date(year, month, day) --> date object\ndatetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\ndatetime.datetime_CAPI\ndatetime.time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\ndatetime.timedelta\ndatetime.tzinfo\ndecimal.BasicContext\ndecimal.Clamped\ndecimal.Context\ndecimal.ConversionSyntax\ndecimal.Dec_0\ndecimal.Dec_n1\ndecimal.Dec_p1\ndecimal.Decimal\ndecimal.DecimalException\ndecimal.DecimalTuple(sign, digits, exponent)\ndecimal.DefaultContext\ndecimal.DivisionByZero\ndecimal.DivisionImpossible\ndecimal.DivisionUndefined\ndecimal.ExtendedContext\ndecimal.Inexact\ndecimal.Inf\ndecimal.Infsign\ndecimal.InvalidContext\ndecimal.InvalidOperation\ndecimal.NaN\ndecimal.Overflow\ndecimal.ROUND_05UP\ndecimal.ROUND_CEILING\ndecimal.ROUND_DOWN\ndecimal.ROUND_FLOOR\ndecimal.ROUND_HALF_DOWN\ndecimal.ROUND_HALF_EVEN\ndecimal.ROUND_HALF_UP\ndecimal.ROUND_UP\ndecimal.Rounded\ndecimal.Subnormal\ndecimal.Underflow\ndecimal.getcontext(??)\ndecimal.localcontext(??)\ndecimal.negInf\ndecimal.setcontext(??)\ndelattr(object, name)\ndict() -> new empty dictionary.\ndifflib.Differ(??)\ndifflib.HtmlDiff\ndifflib.IS_CHARACTER_JUNK(??)\ndifflib.IS_LINE_JUNK(??)\ndifflib.Match(a, b, size)\ndifflib.SequenceMatcher(??)\ndifflib.context_diff(??)\ndifflib.get_close_matches(??)\ndifflib.heapq\ndifflib.ndiff(??)\ndifflib.reduce(function, sequence[, initial]) -> value\ndifflib.restore(??)\ndifflib.unified_diff(??)\ndir([object]) -> list of strings\ndircache.annotate(??)\ndircache.cache\ndircache.listdir(??)\ndircache.opendir(??)\ndircache.os\ndircache.reset(??)\ndis.EXTENDED_ARG\ndis.HAVE_ARGUMENT\ndis.cmp_op\ndis.dis(??)\ndis.disassemble(??)\ndis.disassemble_string(??)\ndis.disco(??)\ndis.distb(??)\ndis.findlabels(??)\ndis.findlinestarts(??)\ndis.hascompare\ndis.hasconst\ndis.hasfree\ndis.hasjabs\ndis.hasjrel\ndis.haslocal\ndis.hasname\ndis.opmap\ndis.opname\ndis.sys\ndis.types\ndivmod(x, y) -> (div, mod)\ndoctest.BLANKLINE_MARKER\ndoctest.COMPARISON_FLAGS\ndoctest.DONT_ACCEPT_BLANKLINE\ndoctest.DONT_ACCEPT_TRUE_FOR_1\ndoctest.DebugRunner(??)\ndoctest.DocFileCase\ndoctest.DocFileSuite(??)\ndoctest.DocFileTest(??)\ndoctest.DocTest(??)\ndoctest.DocTestCase\ndoctest.DocTestFailure\ndoctest.DocTestFinder(??)\ndoctest.DocTestParser(??)\ndoctest.DocTestRunner(??)\ndoctest.DocTestSuite(??)\ndoctest.ELLIPSIS\ndoctest.ELLIPSIS_MARKER\ndoctest.Example(??)\ndoctest.IGNORE_EXCEPTION_DETAIL\ndoctest.NORMALIZE_WHITESPACE\ndoctest.OPTIONFLAGS_BY_NAME\ndoctest.OutputChecker(??)\ndoctest.REPORTING_FLAGS\ndoctest.REPORT_CDIFF\ndoctest.REPORT_NDIFF\ndoctest.REPORT_ONLY_FIRST_FAILURE\ndoctest.REPORT_UDIFF\ndoctest.SKIP\ndoctest.StringIO(??)\ndoctest.TestResults(failed, attempted)\ndoctest.Tester(??)\ndoctest.UnexpectedException\ndoctest.debug(??)\ndoctest.debug_script(??)\ndoctest.debug_src(??)\ndoctest.difflib\ndoctest.inspect\ndoctest.linecache\ndoctest.master\ndoctest.namedtuple(??)\ndoctest.os\ndoctest.pdb\ndoctest.re\ndoctest.register_optionflag(??)\ndoctest.run_docstring_examples(??)\ndoctest.script_from_examples(??)\ndoctest.set_unittest_reportflags(??)\ndoctest.sys\ndoctest.tempfile\ndoctest.testfile(??)\ndoctest.testmod(??)\ndoctest.testsource(??)\ndoctest.traceback\ndoctest.unittest\ndoctest.warnings\ndumbdbm.UserDict\ndumbdbm.error\ndumbdbm.open(??)\ndummy_thread.LockType\ndummy_thread.allocate_lock(??)\ndummy_thread.error\ndummy_thread.exit(??)\ndummy_thread.get_ident(??)\ndummy_thread.interrupt_main(??)\ndummy_thread.stack_size(??)\ndummy_thread.start_new_thread(??)\ndummy_threading.BoundedSemaphore(??)\ndummy_threading.Condition(??)\ndummy_threading.Event(??)\ndummy_threading.Lock(??)\ndummy_threading.RLock(??)\ndummy_threading.Semaphore(??)\ndummy_threading.Thread\ndummy_threading.Timer(??)\ndummy_threading.activeCount(??)\ndummy_threading.active_count(??)\ndummy_threading.currentThread(??)\ndummy_threading.current_thread(??)\ndummy_threading.enumerate(??)\ndummy_threading.local\ndummy_threading.setprofile(??)\ndummy_threading.settrace(??)\ndummy_threading.stack_size(??)\ndummy_threading.threading\nemail.Charset\nemail.Encoders\nemail.Errors\nemail.FeedParser\nemail.Generator\nemail.Header\nemail.Iterators\nemail.LazyImporter\nemail.MIMEAudio\nemail.MIMEBase\nemail.MIMEImage\nemail.MIMEMessage\nemail.MIMEMultipart\nemail.MIMENonMultipart\nemail.MIMEText\nemail.Message\nemail.Parser\nemail.Utils\nemail.base64MIME\nemail.base64mime\nemail.base64mime.CRLF\nemail.base64mime.EMPTYSTRING\nemail.base64mime.MISC_LEN\nemail.base64mime.NL\nemail.base64mime.a2b_base64\nemail.base64mime.b2a_base64\nemail.base64mime.base64_len(??)\nemail.base64mime.body_decode(??)\nemail.base64mime.body_encode(??)\nemail.base64mime.decode(??)\nemail.base64mime.decodestring(??)\nemail.base64mime.encode(??)\nemail.base64mime.encodestring(??)\nemail.base64mime.fix_eols(??)\nemail.base64mime.header_encode(??)\nemail.charset\nemail.charset.ALIASES\nemail.charset.BASE64\nemail.charset.CHARSETS\nemail.charset.CODEC_MAP\nemail.charset.Charset(??)\nemail.charset.DEFAULT_CHARSET\nemail.charset.MISC_LEN\nemail.charset.QP\nemail.charset.SHORTEST\nemail.charset.add_alias(??)\nemail.charset.add_charset(??)\nemail.charset.add_codec(??)\nemail.charset.email\nemail.charset.encode_7or8bit(??)\nemail.charset.errors\nemail.email\nemail.encoders\nemail.encoders.base64\nemail.encoders.encode_7or8bit(??)\nemail.encoders.encode_base64(??)\nemail.encoders.encode_noop(??)\nemail.encoders.encode_quopri(??)\nemail.errors\nemail.errors.BoundaryError\nemail.errors.CharsetError\nemail.errors.FirstHeaderLineIsContinuationDefect(??)\nemail.errors.HeaderParseError\nemail.errors.MalformedHeaderDefect(??)\nemail.errors.MessageDefect(??)\nemail.errors.MessageError\nemail.errors.MessageParseError\nemail.errors.MisplacedEnvelopeHeaderDefect(??)\nemail.errors.MultipartConversionError\nemail.errors.MultipartInvariantViolationDefect(??)\nemail.errors.NoBoundaryInMultipartDefect(??)\nemail.errors.StartBoundaryNotFoundDefect(??)\nemail.feedparser\nemail.feedparser.BufferedSubFile\nemail.feedparser.EMPTYSTRING\nemail.feedparser.FeedParser(??)\nemail.feedparser.NL\nemail.feedparser.NLCRE\nemail.feedparser.NLCRE_bol\nemail.feedparser.NLCRE_crack\nemail.feedparser.NLCRE_eol\nemail.feedparser.NeedMoreData\nemail.feedparser.errors\nemail.feedparser.headerRE\nemail.feedparser.message\nemail.feedparser.re\nemail.generator\nemail.generator.DecodedGenerator(??)\nemail.generator.Generator(??)\nemail.generator.Header(??)\nemail.generator.NL\nemail.generator.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.generator.UNDERSCORE\nemail.generator.fcre\nemail.generator.random\nemail.generator.re\nemail.generator.sys\nemail.generator.time\nemail.generator.warnings\nemail.header\nemail.header.Charset(??)\nemail.header.Header(??)\nemail.header.HeaderParseError\nemail.header.MAXLINELEN\nemail.header.NL\nemail.header.SPACE\nemail.header.SPACE8\nemail.header.UEMPTYSTRING\nemail.header.USASCII\nemail.header.USPACE\nemail.header.UTF8\nemail.header.binascii\nemail.header.decode_header(??)\nemail.header.ecre\nemail.header.email\nemail.header.fcre\nemail.header.make_header(??)\nemail.header.re\nemail.importer\nemail.iterators\nemail.iterators.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.iterators.body_line_iterator(??)\nemail.iterators.sys\nemail.iterators.typed_subpart_iterator(??)\nemail.iterators.walk(??)\nemail.message\nemail.message.Message(??)\nemail.message.SEMISPACE\nemail.message.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.message.binascii\nemail.message.email\nemail.message.errors\nemail.message.re\nemail.message.tspecials\nemail.message.utils\nemail.message.uu\nemail.message.warnings\nemail.message_from_file(??)\nemail.message_from_string(??)\nemail.mime\nemail.mime.Audio\nemail.mime.Base\nemail.mime.Image\nemail.mime.Message\nemail.mime.Multipart\nemail.mime.NonMultipart\nemail.mime.Text\nemail.mime.application.MIMEApplication(??)\nemail.mime.application.MIMENonMultipart(??)\nemail.mime.application.encoders\nemail.mime.audio\nemail.mime.audio.MIMEAudio(??)\nemail.mime.audio.MIMENonMultipart(??)\nemail.mime.audio.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.mime.audio.encoders\nemail.mime.audio.sndhdr\nemail.mime.base\nemail.mime.base.MIMEBase(??)\nemail.mime.base.message\nemail.mime.image.MIMEImage(??)\nemail.mime.image.MIMENonMultipart(??)\nemail.mime.image.encoders\nemail.mime.image.imghdr\nemail.mime.message.MIMEMessage(??)\nemail.mime.message.MIMENonMultipart(??)\nemail.mime.message.message\nemail.mime.multipart.MIMEBase(??)\nemail.mime.multipart.MIMEMultipart(??)\nemail.mime.nonmultipart\nemail.mime.nonmultipart.MIMEBase(??)\nemail.mime.nonmultipart.MIMENonMultipart(??)\nemail.mime.nonmultipart.errors\nemail.mime.text\nemail.mime.text.MIMENonMultipart(??)\nemail.mime.text.MIMEText(??)\nemail.mime.text.encode_7or8bit(??)\nemail.parser.FeedParser(??)\nemail.parser.HeaderParser(??)\nemail.parser.Message(??)\nemail.parser.Parser(??)\nemail.parser.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.parser.warnings\nemail.quopriMIME\nemail.quoprimime\nemail.quoprimime.CRLF\nemail.quoprimime.MISC_LEN\nemail.quoprimime.NL\nemail.quoprimime.body_decode(??)\nemail.quoprimime.body_encode(??)\nemail.quoprimime.body_quopri_check(??)\nemail.quoprimime.body_quopri_len(??)\nemail.quoprimime.bqre\nemail.quoprimime.decode(??)\nemail.quoprimime.decodestring(??)\nemail.quoprimime.encode(??)\nemail.quoprimime.encodestring(??)\nemail.quoprimime.fix_eols(??)\nemail.quoprimime.header_decode(??)\nemail.quoprimime.header_encode(??)\nemail.quoprimime.header_quopri_check(??)\nemail.quoprimime.header_quopri_len(??)\nemail.quoprimime.hexdigits\nemail.quoprimime.hqre\nemail.quoprimime.quote(??)\nemail.quoprimime.re\nemail.quoprimime.unquote(??)\nemail.sys\nemail.utils\nemail.utils.COMMASPACE\nemail.utils.CRLF\nemail.utils.EMPTYSTRING\nemail.utils.TICK\nemail.utils.UEMPTYSTRING\nemail.utils.base64\nemail.utils.collapse_rfc2231_value(??)\nemail.utils.decode_params(??)\nemail.utils.decode_rfc2231(??)\nemail.utils.ecre\nemail.utils.encode_rfc2231(??)\nemail.utils.escapesre\nemail.utils.fix_eols(??)\nemail.utils.formataddr(??)\nemail.utils.formatdate(??)\nemail.utils.getaddresses(??)\nemail.utils.make_msgid(??)\nemail.utils.mktime_tz(??)\nemail.utils.os\nemail.utils.parseaddr(??)\nemail.utils.parsedate(??)\nemail.utils.parsedate_tz(??)\nemail.utils.quote(??)\nemail.utils.random\nemail.utils.re\nemail.utils.rfc2231_continuation\nemail.utils.socket\nemail.utils.specialsre\nemail.utils.time\nemail.utils.unquote(??)\nemail.utils.urllib\nemail.utils.warnings\nenumerate(iterable) -> iterator for index, value of iterable\nerrno.E2BIG\nerrno.EACCES\nerrno.EADDRINUSE\nerrno.EADDRNOTAVAIL\nerrno.EADV\nerrno.EAFNOSUPPORT\nerrno.EAGAIN\nerrno.EALREADY\nerrno.EBADE\nerrno.EBADF\nerrno.EBADFD\nerrno.EBADMSG\nerrno.EBADR\nerrno.EBADRQC\nerrno.EBADSLT\nerrno.EBFONT\nerrno.EBUSY\nerrno.ECHILD\nerrno.ECHRNG\nerrno.ECOMM\nerrno.ECONNABORTED\nerrno.ECONNREFUSED\nerrno.ECONNRESET\nerrno.EDEADLK\nerrno.EDEADLOCK\nerrno.EDESTADDRREQ\nerrno.EDOM\nerrno.EDOTDOT\nerrno.EDQUOT\nerrno.EEXIST\nerrno.EFAULT\nerrno.EFBIG\nerrno.EHOSTDOWN\nerrno.EHOSTUNREACH\nerrno.EIDRM\nerrno.EILSEQ\nerrno.EINPROGRESS\nerrno.EINTR\nerrno.EINVAL\nerrno.EIO\nerrno.EISCONN\nerrno.EISDIR\nerrno.EISNAM\nerrno.EL2HLT\nerrno.EL2NSYNC\nerrno.EL3HLT\nerrno.EL3RST\nerrno.ELIBACC\nerrno.ELIBBAD\nerrno.ELIBEXEC\nerrno.ELIBMAX\nerrno.ELIBSCN\nerrno.ELNRNG\nerrno.ELOOP\nerrno.EMFILE\nerrno.EMLINK\nerrno.EMSGSIZE\nerrno.EMULTIHOP\nerrno.ENAMETOOLONG\nerrno.ENAVAIL\nerrno.ENETDOWN\nerrno.ENETRESET\nerrno.ENETUNREACH\nerrno.ENFILE\nerrno.ENOANO\nerrno.ENOBUFS\nerrno.ENOCSI\nerrno.ENODATA\nerrno.ENODEV\nerrno.ENOENT\nerrno.ENOEXEC\nerrno.ENOLCK\nerrno.ENOLINK\nerrno.ENOMEM\nerrno.ENOMSG\nerrno.ENONET\nerrno.ENOPKG\nerrno.ENOPROTOOPT\nerrno.ENOSPC\nerrno.ENOSR\nerrno.ENOSTR\nerrno.ENOSYS\nerrno.ENOTBLK\nerrno.ENOTCONN\nerrno.ENOTDIR\nerrno.ENOTEMPTY\nerrno.ENOTNAM\nerrno.ENOTSOCK\nerrno.ENOTTY\nerrno.ENOTUNIQ\nerrno.ENXIO\nerrno.EOPNOTSUPP\nerrno.EOVERFLOW\nerrno.EPERM\nerrno.EPFNOSUPPORT\nerrno.EPIPE\nerrno.EPROTO\nerrno.EPROTONOSUPPORT\nerrno.EPROTOTYPE\nerrno.ERANGE\nerrno.EREMCHG\nerrno.EREMOTE\nerrno.EREMOTEIO\nerrno.ERESTART\nerrno.EROFS\nerrno.ESHUTDOWN\nerrno.ESOCKTNOSUPPORT\nerrno.ESPIPE\nerrno.ESRCH\nerrno.ESRMNT\nerrno.ESTALE\nerrno.ESTRPIPE\nerrno.ETIME\nerrno.ETIMEDOUT\nerrno.ETOOMANYREFS\nerrno.ETXTBSY\nerrno.EUCLEAN\nerrno.EUNATCH\nerrno.EUSERS\nerrno.EWOULDBLOCK\nerrno.EXDEV\nerrno.EXFULL\nerrno.errorcode\neval(source[, globals[, locals]]) -> value\nexceptions.ArithmeticError\nexceptions.AssertionError\nexceptions.AttributeError\nexceptions.BaseException\nexceptions.BufferError\nexceptions.BytesWarning\nexceptions.DeprecationWarning\nexceptions.EOFError\nexceptions.EnvironmentError\nexceptions.Exception\nexceptions.FloatingPointError\nexceptions.FutureWarning\nexceptions.GeneratorExit\nexceptions.IOError\nexceptions.ImportError\nexceptions.ImportWarning\nexceptions.IndentationError\nexceptions.IndexError\nexceptions.KeyError\nexceptions.KeyboardInterrupt\nexceptions.LookupError\nexceptions.MemoryError\nexceptions.NameError\nexceptions.NotImplementedError\nexceptions.OSError\nexceptions.OverflowError\nexceptions.PendingDeprecationWarning\nexceptions.ReferenceError\nexceptions.RuntimeError\nexceptions.RuntimeWarning\nexceptions.StandardError\nexceptions.StopIteration\nexceptions.SyntaxError\nexceptions.SyntaxWarning\nexceptions.SystemError\nexceptions.SystemExit\nexceptions.TabError\nexceptions.TypeError\nexceptions.UnboundLocalError\nexceptions.UnicodeDecodeError\nexceptions.UnicodeEncodeError\nexceptions.UnicodeError\nexceptions.UnicodeTranslateError\nexceptions.UnicodeWarning\nexceptions.UserWarning\nexceptions.ValueError\nexceptions.Warning\nexceptions.ZeroDivisionError\nexecfile(filename[, globals[, locals]])\nexit\nfcntl.DN_ACCESS\nfcntl.DN_ATTRIB\nfcntl.DN_CREATE\nfcntl.DN_DELETE\nfcntl.DN_MODIFY\nfcntl.DN_MULTISHOT\nfcntl.DN_RENAME\nfcntl.FASYNC\nfcntl.FD_CLOEXEC\nfcntl.F_DUPFD\nfcntl.F_EXLCK\nfcntl.F_GETFD\nfcntl.F_GETFL\nfcntl.F_GETLEASE\nfcntl.F_GETLK\nfcntl.F_GETLK64\nfcntl.F_GETOWN\nfcntl.F_GETSIG\nfcntl.F_NOTIFY\nfcntl.F_RDLCK\nfcntl.F_SETFD\nfcntl.F_SETFL\nfcntl.F_SETLEASE\nfcntl.F_SETLK\nfcntl.F_SETLK64\nfcntl.F_SETLKW\nfcntl.F_SETLKW64\nfcntl.F_SETOWN\nfcntl.F_SETSIG\nfcntl.F_SHLCK\nfcntl.F_UNLCK\nfcntl.F_WRLCK\nfcntl.I_ATMARK\nfcntl.I_CANPUT\nfcntl.I_CKBAND\nfcntl.I_FDINSERT\nfcntl.I_FIND\nfcntl.I_FLUSH\nfcntl.I_FLUSHBAND\nfcntl.I_GETBAND\nfcntl.I_GETCLTIME\nfcntl.I_GETSIG\nfcntl.I_GRDOPT\nfcntl.I_GWROPT\nfcntl.I_LINK\nfcntl.I_LIST\nfcntl.I_LOOK\nfcntl.I_NREAD\nfcntl.I_PEEK\nfcntl.I_PLINK\nfcntl.I_POP\nfcntl.I_PUNLINK\nfcntl.I_PUSH\nfcntl.I_RECVFD\nfcntl.I_SENDFD\nfcntl.I_SETCLTIME\nfcntl.I_SETSIG\nfcntl.I_SRDOPT\nfcntl.I_STR\nfcntl.I_SWROPT\nfcntl.I_UNLINK\nfcntl.LOCK_EX\nfcntl.LOCK_MAND\nfcntl.LOCK_NB\nfcntl.LOCK_READ\nfcntl.LOCK_RW\nfcntl.LOCK_SH\nfcntl.LOCK_UN\nfcntl.LOCK_WRITE\nfcntl.fcntl(fd, opt, [arg])\nfcntl.flock(fd, operation)\nfcntl.ioctl(fd, opt[, arg[, mutate_flag]])\nfcntl.lockf (fd, operation, length=0, start=0, whence=0)\nfile(name[, mode[, buffering]]) -> file object\nfilecmp.BUFSIZE\nfilecmp.cmp(??)\nfilecmp.cmpfiles(??)\nfilecmp.demo(??)\nfilecmp.dircmp(??)\nfilecmp.ifilter(function or None, sequence) --> ifilter object\nfilecmp.ifilterfalse(function or None, sequence) --> ifilterfalse object\nfilecmp.imap(func, *iterables) --> imap object\nfilecmp.izip(iter1 [,iter2 [...]]) --> izip object\nfilecmp.os\nfilecmp.stat\nfileinput.DEFAULT_BUFSIZE\nfileinput.FileInput(??)\nfileinput.close(??)\nfileinput.filelineno(??)\nfileinput.filename(??)\nfileinput.fileno(??)\nfileinput.hook_compressed(??)\nfileinput.hook_encoded(??)\nfileinput.input([files[, inplace[, backup[, mode[, openhook]]]]])\nfileinput.isfirstline(??)\nfileinput.isstdin(??)\nfileinput.lineno(??)\nfileinput.nextfile(??)\nfileinput.os\nfileinput.sys\nfilter(function or None, sequence) -> list, tuple, or string\nfloat(x) -> floating point number\nfnmatch.filter(??)\nfnmatch.fnmatch(??)\nfnmatch.fnmatchcase(??)\nfnmatch.re\nfnmatch.translate(??)\nformat(value[, format_spec]) -> string\nformatter.AS_IS\nformatter.AbstractFormatter(??)\nformatter.AbstractWriter(??)\nformatter.DumbWriter(??)\nformatter.NullFormatter(??)\nformatter.NullWriter(??)\nformatter.sys\nformatter.test(??)\nfpformat.NotANumber\nfpformat.decoder\nfpformat.extract(??)\nfpformat.fix(??)\nfpformat.re\nfpformat.roundfrac(??)\nfpformat.sci(??)\nfpformat.test(??)\nfpformat.unexpo(??)\nfractions.Fraction\nfractions.Rational\nfractions.division\nfractions.gcd(??)\nfractions.math\nfractions.numbers\nfractions.operator\nfractions.re\nfrozenset(iterable) --> frozenset object\nftplib.CRLF\nftplib.Error\nftplib.FTP(??)\nftplib.FTP_PORT\nftplib.MSG_OOB\nftplib.Netrc(??)\nftplib.all_errors\nftplib.error_perm\nftplib.error_proto\nftplib.error_reply\nftplib.error_temp\nftplib.ftpcp(??)\nftplib.os\nftplib.parse150(??)\nftplib.parse227(??)\nftplib.parse229(??)\nftplib.parse257(??)\nftplib.print_line(??)\nftplib.socket\nftplib.sys\nftplib.test(??)\nfunctools.WRAPPER_ASSIGNMENTS\nfunctools.WRAPPER_UPDATES\nfunctools.partial(func, *args, **keywords) - new function with partial application\nfunctools.reduce(function, sequence[, initial]) -> value\nfunctools.update_wrapper(??)\nfunctools.wraps(??)\nfuture_builtins.ascii(object) -> string\nfuture_builtins.filter\nfuture_builtins.hex(number) -> string\nfuture_builtins.map\nfuture_builtins.oct(number) -> string\nfuture_builtins.zip\ngc.DEBUG_COLLECTABLE\ngc.DEBUG_INSTANCES\ngc.DEBUG_LEAK\ngc.DEBUG_OBJECTS\ngc.DEBUG_SAVEALL\ngc.DEBUG_STATS\ngc.DEBUG_UNCOLLECTABLE\ngc.collect([generation]) -> n\ngc.disable() -> None\ngc.enable() -> None\ngc.garbage\ngc.get_count() -> (count0, count1, count2)\ngc.get_debug() -> flags\ngc.get_objects() -> [...]\ngc.get_referents(*objs) -> list\ngc.get_referrers(*objs) -> list\ngc.get_threshold() -> (threshold0, threshold1, threshold2)\ngc.isenabled() -> status\ngc.set_debug(flags) -> None\ngc.set_threshold(threshold0, [threshold1, threshold2]) -> None\ngenericpath.commonprefix(??)\ngenericpath.exists(??)\ngenericpath.getatime(??)\ngenericpath.getctime(??)\ngenericpath.getmtime(??)\ngenericpath.getsize(??)\ngenericpath.isdir(??)\ngenericpath.isfile(??)\ngenericpath.os\ngenericpath.stat\ngetattr(object, name[, default]) -> value\ngetopt.GetoptError\ngetopt.do_longs(??)\ngetopt.do_shorts(??)\ngetopt.error\ngetopt.getopt(args, options[, long_options]) -> opts, args\ngetopt.gnu_getopt(??)\ngetopt.long_has_args(??)\ngetopt.os\ngetopt.short_has_arg(??)\ngetpass.GetPassWarning\ngetpass.fallback_getpass(??)\ngetpass.getpass(??)\ngetpass.getuser(??)\ngetpass.os\ngetpass.sys\ngetpass.termios\ngetpass.unix_getpass(??)\ngetpass.warnings\ngetpass.win_getpass(??)\ngettext.Catalog(??)\ngettext.ENOENT\ngettext.GNUTranslations(??)\ngettext.NullTranslations(??)\ngettext.bind_textdomain_codeset(??)\ngettext.bindtextdomain(??)\ngettext.c2py(??)\ngettext.copy\ngettext.dgettext(??)\ngettext.dngettext(??)\ngettext.find(??)\ngettext.gettext(??)\ngettext.install(??)\ngettext.ldgettext(??)\ngettext.ldngettext(??)\ngettext.lgettext(??)\ngettext.lngettext(??)\ngettext.locale\ngettext.ngettext(??)\ngettext.os\ngettext.re\ngettext.struct\ngettext.sys\ngettext.test(??)\ngettext.textdomain(??)\ngettext.translation(??)\nglob.fnmatch\nglob.glob(??)\nglob.glob0(??)\nglob.glob1(??)\nglob.has_magic(??)\nglob.iglob(??)\nglob.magic_check\nglob.os\nglob.re\nglob.sys\nglobals() -> dictionary\ngrp.getgrall() -> list of tuples\ngrp.getgrgid(id) -> tuple\ngrp.getgrnam(name) -> tuple\ngrp.struct_group\ngzip.FCOMMENT\ngzip.FEXTRA\ngzip.FHCRC\ngzip.FNAME\ngzip.FTEXT\ngzip.GzipFile(??)\ngzip.READ\ngzip.WRITE\ngzip.open(??)\ngzip.read32(??)\ngzip.struct\ngzip.sys\ngzip.time\ngzip.write32u(??)\ngzip.zlib\nhasattr(object, name) -> bool\nhash(object) -> integer\nhashlib.md5\nhashlib.new(name, string='') - Return a new hashing object using the named algorithm;\nhashlib.sha1\nhashlib.sha224\nhashlib.sha256\nhashlib.sha384\nhashlib.sha512\nheapq.bisect\nheapq.count([firstval]) --> count object\nheapq.heapify\nheapq.heappop\nheapq.heappush\nheapq.heappushpop\nheapq.heapreplace\nheapq.imap(func, *iterables) --> imap object\nheapq.islice(iterable, [start,] stop [, step]) --> islice object\nheapq.itemgetter(item, ...) --> itemgetter object\nheapq.izip(iter1 [,iter2 [...]]) --> izip object\nheapq.merge(??)\nheapq.neg(a) -- Same as -a.\nheapq.nlargest(??)\nheapq.nsmallest(??)\nheapq.repeat(element [,times]) -> create an iterator which returns the element\nheapq.tee(iterable, n=2) --> tuple of n independent iterators.\nhelp\nhex(number) -> string\nhmac.HMAC(??)\nhmac.digest_size\nhmac.new(??)\nhmac.trans_36\nhmac.trans_5C\nhmac.x\nhotshot.Profile(??)\nhotshot.ProfilerError\nhotshot.log\nhotshot.log.ENTER\nhotshot.log.EXIT\nhotshot.log.LINE\nhotshot.log.LogReader(??)\nhotshot.log.WHAT_ADD_INFO\nhotshot.log.WHAT_DEFINE_FILE\nhotshot.log.WHAT_DEFINE_FUNC\nhotshot.log.WHAT_ENTER\nhotshot.log.WHAT_EXIT\nhotshot.log.WHAT_LINENO\nhotshot.log.os\nhotshot.log.parser\nhotshot.log.symbol\nhotshot.stats\nhotshot.stats.ENTER\nhotshot.stats.EXIT\nhotshot.stats.FakeCode(??)\nhotshot.stats.FakeFrame(??)\nhotshot.stats.Profile(??)\nhotshot.stats.StatsLoader(??)\nhotshot.stats.hotshot\nhotshot.stats.load(??)\nhotshot.stats.profile\nhotshot.stats.pstats\nhotshot.stones.errno\nhotshot.stones.hotshot\nhotshot.stones.main(??)\nhotshot.stones.sys\nhotshot.stones.test\nhtmlentitydefs.codepoint2name\nhtmlentitydefs.entitydefs\nhtmlentitydefs.name2codepoint\nhtmllib.AS_IS\nhtmllib.HTMLParseError\nhtmllib.HTMLParser(??)\nhtmllib.sgmllib\nhtmllib.test(??)\nhttplib.ACCEPTED\nhttplib.BAD_GATEWAY\nhttplib.BAD_REQUEST\nhttplib.BadStatusLine\nhttplib.CONFLICT\nhttplib.CONTINUE\nhttplib.CREATED\nhttplib.CannotSendHeader\nhttplib.CannotSendRequest\nhttplib.EXPECTATION_FAILED\nhttplib.FAILED_DEPENDENCY\nhttplib.FORBIDDEN\nhttplib.FOUND\nhttplib.FakeSocket(??)\nhttplib.GATEWAY_TIMEOUT\nhttplib.GONE\nhttplib.HTTP(??)\nhttplib.HTTPConnection(??)\nhttplib.HTTPException\nhttplib.HTTPMessage(??)\nhttplib.HTTPResponse(??)\nhttplib.HTTPS(??)\nhttplib.HTTPSConnection(??)\nhttplib.HTTPS_PORT\nhttplib.HTTP_PORT\nhttplib.HTTP_VERSION_NOT_SUPPORTED\nhttplib.IM_USED\nhttplib.INSUFFICIENT_STORAGE\nhttplib.INTERNAL_SERVER_ERROR\nhttplib.ImproperConnectionState\nhttplib.IncompleteRead\nhttplib.InvalidURL\nhttplib.LENGTH_REQUIRED\nhttplib.LOCKED\nhttplib.LineAndFileWrapper(??)\nhttplib.MAXAMOUNT\nhttplib.METHOD_NOT_ALLOWED\nhttplib.MOVED_PERMANENTLY\nhttplib.MULTIPLE_CHOICES\nhttplib.MULTI_STATUS\nhttplib.NON_AUTHORITATIVE_INFORMATION\nhttplib.NOT_ACCEPTABLE\nhttplib.NOT_EXTENDED\nhttplib.NOT_FOUND\nhttplib.NOT_IMPLEMENTED\nhttplib.NOT_MODIFIED\nhttplib.NO_CONTENT\nhttplib.NotConnected\nhttplib.OK\nhttplib.PARTIAL_CONTENT\nhttplib.PAYMENT_REQUIRED\nhttplib.PRECONDITION_FAILED\nhttplib.PROCESSING\nhttplib.PROXY_AUTHENTICATION_REQUIRED\nhttplib.REQUESTED_RANGE_NOT_SATISFIABLE\nhttplib.REQUEST_ENTITY_TOO_LARGE\nhttplib.REQUEST_TIMEOUT\nhttplib.REQUEST_URI_TOO_LONG\nhttplib.RESET_CONTENT\nhttplib.ResponseNotReady\nhttplib.SEE_OTHER\nhttplib.SERVICE_UNAVAILABLE\nhttplib.SWITCHING_PROTOCOLS\nhttplib.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nhttplib.TEMPORARY_REDIRECT\nhttplib.UNAUTHORIZED\nhttplib.UNPROCESSABLE_ENTITY\nhttplib.UNSUPPORTED_MEDIA_TYPE\nhttplib.UPGRADE_REQUIRED\nhttplib.USE_PROXY\nhttplib.UnimplementedFileMode\nhttplib.UnknownProtocol\nhttplib.UnknownTransferEncoding\nhttplib.error\nhttplib.mimetools\nhttplib.py3kwarning\nhttplib.responses\nhttplib.socket\nhttplib.ssl\nhttplib.test(??)\nhttplib.urlsplit(??)\nhttplib.warnings\nid(object) -> integer\nihooks.BUILTIN_MODULE\nihooks.BasicModuleImporter(??)\nihooks.BasicModuleLoader(??)\nihooks.C_BUILTIN\nihooks.C_EXTENSION\nihooks.FROZEN_MODULE\nihooks.FancyModuleLoader(??)\nihooks.Hooks(??)\nihooks.ModuleImporter(??)\nihooks.ModuleLoader(??)\nihooks.PKG_DIRECTORY\nihooks.PY_COMPILED\nihooks.PY_FROZEN\nihooks.PY_SOURCE\nihooks.VERBOSE\nihooks.current_importer\nihooks.default_importer\nihooks.imp\nihooks.install(??)\nihooks.os\nihooks.sys\nihooks.uninstall(??)\nimaplib.AllowedVersions\nimaplib.CRLF\nimaplib.Commands\nimaplib.Continuation\nimaplib.Debug\nimaplib.Flags\nimaplib.IMAP4(??)\nimaplib.IMAP4_PORT\nimaplib.IMAP4_SSL(??)\nimaplib.IMAP4_SSL_PORT\nimaplib.IMAP4_stream(??)\nimaplib.Int2AP(??)\nimaplib.InternalDate\nimaplib.Internaldate2tuple(??)\nimaplib.Literal\nimaplib.MapCRLF\nimaplib.Mon2num\nimaplib.ParseFlags(??)\nimaplib.Response_code\nimaplib.Time2Internaldate(??)\nimaplib.Untagged_response\nimaplib.Untagged_status\nimaplib.binascii\nimaplib.os\nimaplib.random\nimaplib.re\nimaplib.socket\nimaplib.ssl\nimaplib.sys\nimaplib.time\nimghdr.test(??)\nimghdr.test_bmp(??)\nimghdr.test_exif(??)\nimghdr.test_gif(??)\nimghdr.test_jpeg(??)\nimghdr.test_pbm(??)\nimghdr.test_pgm(??)\nimghdr.test_png(??)\nimghdr.test_ppm(??)\nimghdr.test_rast(??)\nimghdr.test_rgb(??)\nimghdr.test_tiff(??)\nimghdr.test_xbm(??)\nimghdr.testall(??)\nimghdr.tests\nimghdr.what(??)\nimp.C_BUILTIN\nimp.C_EXTENSION\nimp.IMP_HOOK\nimp.NullImporter\nimp.PKG_DIRECTORY\nimp.PY_CODERESOURCE\nimp.PY_COMPILED\nimp.PY_FROZEN\nimp.PY_RESOURCE\nimp.PY_SOURCE\nimp.SEARCH_ERROR\nimp.acquire_lock() -> None\nimp.find_module(name, [path]) -> (file, filename, (suffix, mode, type))\nimp.get_frozen_object\nimp.get_magic() -> string\nimp.get_suffixes() -> [(suffix, mode, type), ...]\nimp.init_builtin\nimp.init_frozen\nimp.is_builtin\nimp.is_frozen\nimp.load_compiled\nimp.load_dynamic\nimp.load_module(name, file, filename, (suffix, mode, type)) -> module\nimp.load_package\nimp.load_source\nimp.lock_held() -> boolean\nimp.new_module(name) -> module\nimp.release_lock() -> None\nimp.reload(module) -> module\nimputil.BuiltinImporter(??)\nimputil.DynLoadSuffixImporter(??)\nimputil.ImportManager(??)\nimputil.Importer(??)\nimputil.imp\nimputil.marshal\nimputil.py_suffix_importer(??)\nimputil.struct\nimputil.sys\ninput([prompt]) -> value\ninspect.ArgInfo(args, varargs, keywords, locals)\ninspect.ArgSpec(args, varargs, keywords, defaults)\ninspect.Arguments(args, varargs, keywords)\ninspect.Attribute(name, kind, defining_class, object)\ninspect.BlockFinder(??)\ninspect.CO_GENERATOR\ninspect.CO_NESTED\ninspect.CO_NEWLOCALS\ninspect.CO_NOFREE\ninspect.CO_OPTIMIZED\ninspect.CO_VARARGS\ninspect.CO_VARKEYWORDS\ninspect.EndOfBlock\ninspect.ModuleInfo(name, suffix, mode, module_type)\ninspect.TPFLAGS_IS_ABSTRACT\ninspect.Traceback(filename, lineno, function, code_context, index)\ninspect.attrgetter(attr, ...) --> attrgetter object\ninspect.classify_class_attrs(??)\ninspect.cleandoc(??)\ninspect.currentframe\ninspect.dis\ninspect.findsource(??)\ninspect.formatargspec(??)\ninspect.formatargvalues(??)\ninspect.getabsfile(??)\ninspect.getargs(??)\ninspect.getargspec(??)\ninspect.getargvalues(??)\ninspect.getblock(??)\ninspect.getclasstree(??)\ninspect.getcomments(??)\ninspect.getdoc(??)\ninspect.getfile(??)\ninspect.getframeinfo(??)\ninspect.getinnerframes(??)\ninspect.getlineno(??)\ninspect.getmembers(??)\ninspect.getmodule(??)\ninspect.getmoduleinfo(??)\ninspect.getmodulename(??)\ninspect.getmro(??)\ninspect.getouterframes(??)\ninspect.getsource(??)\ninspect.getsourcefile(??)\ninspect.getsourcelines(??)\ninspect.imp\ninspect.indentsize(??)\ninspect.isabstract(??)\ninspect.isbuiltin(??)\ninspect.isclass(??)\ninspect.iscode(??)\ninspect.isdatadescriptor(??)\ninspect.isframe(??)\ninspect.isfunction(??)\ninspect.isgenerator(??)\ninspect.isgeneratorfunction(??)\ninspect.isgetsetdescriptor(??)\ninspect.ismemberdescriptor(??)\ninspect.ismethod(??)\ninspect.ismethoddescriptor(??)\ninspect.ismodule(??)\ninspect.isroutine(??)\ninspect.istraceback(??)\ninspect.joinseq(??)\ninspect.linecache\ninspect.modulesbyfile\ninspect.namedtuple(??)\ninspect.os\ninspect.re\ninspect.stack(??)\ninspect.string\ninspect.strseq(??)\ninspect.sys\ninspect.tokenize\ninspect.trace(??)\ninspect.types\ninspect.walktree(??)\nint(x[, base]) -> integer\nintern(string) -> string\nio.BlockingIOError\nio.BufferedIOBase\nio.BufferedRWPair\nio.BufferedRandom\nio.BufferedReader\nio.BufferedWriter\nio.BytesIO([buffer]) -> object\nio.DEFAULT_BUFFER_SIZE\nio.FileIO\nio.IOBase\nio.IncrementalNewlineDecoder\nio.OpenWrapper\nio.RawIOBase\nio.StringIO\nio.TextIOBase\nio.TextIOWrapper\nio.UnsupportedOperation\nio.abc\nio.codecs\nio.open(??)\nio.os\nio.print_function\nio.threading\nio.unicode_literals\nisinstance(object, class-or-type-or-tuple) -> bool\nissubclass(C, B) -> bool\niter(collection) -> iterator\nitertools.chain(*iterables) --> chain object\nitertools.combinations(iterable[, r]) --> combinations object\nitertools.count([firstval]) --> count object\nitertools.cycle(iterable) --> cycle object\nitertools.dropwhile(predicate, iterable) --> dropwhile object\nitertools.groupby(iterable[, keyfunc]) -> create an iterator which returns\nitertools.ifilter(function or None, sequence) --> ifilter object\nitertools.ifilterfalse(function or None, sequence) --> ifilterfalse object\nitertools.imap(func, *iterables) --> imap object\nitertools.islice(iterable, [start,] stop [, step]) --> islice object\nitertools.izip(iter1 [,iter2 [...]]) --> izip object\nitertools.izip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> izip_longest object\nitertools.permutations(iterable[, r]) --> permutations object\nitertools.product(*iterables) --> product object\nitertools.repeat(element [,times]) -> create an iterator which returns the element\nitertools.starmap(function, sequence) --> starmap object\nitertools.takewhile(predicate, iterable) --> takewhile object\nitertools.tee(iterable, n=2) --> tuple of n independent iterators.\njson.JSONDecoder\njson.JSONEncoder\njson.decoder\njson.decoder.ANYTHING\njson.decoder.BACKSLASH\njson.decoder.DEFAULT_ENCODING\njson.decoder.FLAGS\njson.decoder.JSONArray(??)\njson.decoder.JSONConstant(??)\njson.decoder.JSONDecoder\njson.decoder.JSONNumber(??)\njson.decoder.JSONObject(??)\njson.decoder.JSONScanner\njson.decoder.JSONString(??)\njson.decoder.NaN\njson.decoder.NegInf\njson.decoder.PosInf\njson.decoder.STRINGCHUNK\njson.decoder.Scanner\njson.decoder.WHITESPACE\njson.decoder.c_scanstring\njson.decoder.errmsg(??)\njson.decoder.linecol(??)\njson.decoder.pattern(??)\njson.decoder.py_scanstring(??)\njson.decoder.re\njson.decoder.scanstring(basestring, end, encoding) -> (str, end)\njson.decoder.sys\njson.dump(??)\njson.dumps(??)\njson.encoder\njson.encoder.ESCAPE\njson.encoder.ESCAPE_ASCII\njson.encoder.ESCAPE_DCT\njson.encoder.FLOAT_REPR\njson.encoder.HAS_UTF8\njson.encoder.JSONEncoder\njson.encoder.c_encode_basestring_ascii\njson.encoder.encode_basestring(??)\njson.encoder.encode_basestring_ascii(basestring) -> str\njson.encoder.floatstr(??)\njson.encoder.i\njson.encoder.math\njson.encoder.py_encode_basestring_ascii(??)\njson.encoder.re\njson.load(??)\njson.loads(??)\njson.scanner\njson.scanner.BRANCH\njson.scanner.DOTALL\njson.scanner.FLAGS\njson.scanner.MULTILINE\njson.scanner.SUBPATTERN\njson.scanner.Scanner\njson.scanner.VERBOSE\njson.scanner.pattern(??)\njson.scanner.re\njson.scanner.sre_compile\njson.scanner.sre_constants\njson.scanner.sre_parse\njson.tool.json\njson.tool.main(??)\njson.tool.sys\nkeyword.iskeyword\nkeyword.kwlist\nkeyword.main(??)\nlen(object) -> integer\nlicense\nlinecache.cache\nlinecache.checkcache(??)\nlinecache.clearcache(??)\nlinecache.getline(??)\nlinecache.getlines(??)\nlinecache.os\nlinecache.sys\nlinecache.updatecache(??)\nlinuxaudiodev.AFMT_A_LAW\nlinuxaudiodev.AFMT_MU_LAW\nlinuxaudiodev.AFMT_S16_BE\nlinuxaudiodev.AFMT_S16_LE\nlinuxaudiodev.AFMT_S16_NE\nlinuxaudiodev.AFMT_S8\nlinuxaudiodev.AFMT_U16_BE\nlinuxaudiodev.AFMT_U16_LE\nlinuxaudiodev.AFMT_U8\nlinuxaudiodev.error\nlinuxaudiodev.open\nlist() -> new list\nlocale.ABDAY_1\nlocale.ABDAY_2\nlocale.ABDAY_3\nlocale.ABDAY_4\nlocale.ABDAY_5\nlocale.ABDAY_6\nlocale.ABDAY_7\nlocale.ABMON_1\nlocale.ABMON_10\nlocale.ABMON_11\nlocale.ABMON_12\nlocale.ABMON_2\nlocale.ABMON_3\nlocale.ABMON_4\nlocale.ABMON_5\nlocale.ABMON_6\nlocale.ABMON_7\nlocale.ABMON_8\nlocale.ABMON_9\nlocale.ALT_DIGITS\nlocale.AM_STR\nlocale.CHAR_MAX\nlocale.CODESET\nlocale.CRNCYSTR\nlocale.DAY_1\nlocale.DAY_2\nlocale.DAY_3\nlocale.DAY_4\nlocale.DAY_5\nlocale.DAY_6\nlocale.DAY_7\nlocale.D_FMT\nlocale.D_T_FMT\nlocale.ERA\nlocale.ERA_D_FMT\nlocale.ERA_D_T_FMT\nlocale.ERA_T_FMT\nlocale.Error\nlocale.LC_ALL\nlocale.LC_COLLATE\nlocale.LC_CTYPE\nlocale.LC_MESSAGES\nlocale.LC_MONETARY\nlocale.LC_NUMERIC\nlocale.LC_TIME\nlocale.MON_1\nlocale.MON_10\nlocale.MON_11\nlocale.MON_12\nlocale.MON_2\nlocale.MON_3\nlocale.MON_4\nlocale.MON_5\nlocale.MON_6\nlocale.MON_7\nlocale.MON_8\nlocale.MON_9\nlocale.NOEXPR\nlocale.PM_STR\nlocale.RADIXCHAR\nlocale.THOUSEP\nlocale.T_FMT\nlocale.T_FMT_AMPM\nlocale.YESEXPR\nlocale.atof(??)\nlocale.atoi(??)\nlocale.bind_textdomain_codeset(domain, codeset) -> string\nlocale.bindtextdomain(domain, dir) -> string\nlocale.currency(??)\nlocale.dcgettext(domain, msg, category) -> string\nlocale.dgettext(domain, msg) -> string\nlocale.encodings\nlocale.format(??)\nlocale.format_string(??)\nlocale.functools\nlocale.getdefaultlocale(??)\nlocale.getlocale(??)\nlocale.getpreferredencoding(??)\nlocale.gettext(msg) -> string\nlocale.locale_alias\nlocale.locale_encoding_alias\nlocale.localeconv(??)\nlocale.nl_langinfo(key) -> string\nlocale.normalize(??)\nlocale.operator\nlocale.re\nlocale.resetlocale(??)\nlocale.setlocale(??)\nlocale.str(??)\nlocale.strcoll\nlocale.strxfrm\nlocale.sys\nlocale.textdomain(domain) -> string\nlocale.windows_locale\nlocals() -> dictionary\nlogging.BASIC_FORMAT\nlogging.BufferingFormatter(??)\nlogging.CRITICAL\nlogging.DEBUG\nlogging.ERROR\nlogging.FATAL\nlogging.FileHandler(??)\nlogging.Filter(??)\nlogging.Filterer(??)\nlogging.Formatter(??)\nlogging.Handler(??)\nlogging.INFO\nlogging.LogRecord(??)\nlogging.Logger(??)\nlogging.LoggerAdapter(??)\nlogging.Manager(??)\nlogging.NOTSET\nlogging.PlaceHolder(??)\nlogging.RootLogger(??)\nlogging.StreamHandler(??)\nlogging.WARN\nlogging.WARNING\nlogging.addLevelName(??)\nlogging.atexit\nlogging.basicConfig(??)\nlogging.cStringIO\nlogging.codecs\nlogging.config.DEFAULT_LOGGING_CONFIG_PORT\nlogging.config.RESET_ERROR\nlogging.config.StreamRequestHandler(??)\nlogging.config.ThreadingTCPServer(??)\nlogging.config.fileConfig(??)\nlogging.config.listen(??)\nlogging.config.logging\nlogging.config.os\nlogging.config.socket\nlogging.config.stopListening(??)\nlogging.config.string\nlogging.config.struct\nlogging.config.sys\nlogging.config.thread\nlogging.config.threading\nlogging.config.traceback\nlogging.config.types\nlogging.critical(??)\nlogging.currentframe(??)\nlogging.debug(??)\nlogging.disable(??)\nlogging.error(??)\nlogging.exception(??)\nlogging.fatal(??)\nlogging.getLevelName(??)\nlogging.getLogger(??)\nlogging.getLoggerClass(??)\nlogging.handlers.BaseRotatingHandler(??)\nlogging.handlers.BufferingHandler(??)\nlogging.handlers.DEFAULT_HTTP_LOGGING_PORT\nlogging.handlers.DEFAULT_SOAP_LOGGING_PORT\nlogging.handlers.DEFAULT_TCP_LOGGING_PORT\nlogging.handlers.DEFAULT_UDP_LOGGING_PORT\nlogging.handlers.DatagramHandler(??)\nlogging.handlers.HTTPHandler(??)\nlogging.handlers.MemoryHandler(??)\nlogging.handlers.NTEventLogHandler(??)\nlogging.handlers.RotatingFileHandler(??)\nlogging.handlers.SMTPHandler(??)\nlogging.handlers.ST_DEV\nlogging.handlers.ST_INO\nlogging.handlers.SYSLOG_UDP_PORT\nlogging.handlers.SocketHandler(??)\nlogging.handlers.SysLogHandler(??)\nlogging.handlers.TimedRotatingFileHandler(??)\nlogging.handlers.WatchedFileHandler(??)\nlogging.handlers.cPickle\nlogging.handlers.codecs\nlogging.handlers.logging\nlogging.handlers.os\nlogging.handlers.re\nlogging.handlers.socket\nlogging.handlers.string\nlogging.handlers.struct\nlogging.handlers.time\nlogging.handlers.types\nlogging.info(??)\nlogging.log(??)\nlogging.logProcesses\nlogging.logThreads\nlogging.makeLogRecord(??)\nlogging.os\nlogging.raiseExceptions\nlogging.root\nlogging.setLoggerClass(??)\nlogging.shutdown(??)\nlogging.string\nlogging.sys\nlogging.thread\nlogging.threading\nlogging.time\nlogging.traceback\nlogging.types\nlogging.warn(??)\nlogging.warning(??)\nlong(x[, base]) -> integer\nmacpath.SF_APPEND\nmacpath.SF_ARCHIVED\nmacpath.SF_IMMUTABLE\nmacpath.SF_NOUNLINK\nmacpath.SF_SNAPSHOT\nmacpath.ST_ATIME\nmacpath.ST_CTIME\nmacpath.ST_DEV\nmacpath.ST_GID\nmacpath.ST_INO\nmacpath.ST_MODE\nmacpath.ST_MTIME\nmacpath.ST_NLINK\nmacpath.ST_SIZE\nmacpath.ST_UID\nmacpath.S_ENFMT\nmacpath.S_IEXEC\nmacpath.S_IFBLK\nmacpath.S_IFCHR\nmacpath.S_IFDIR\nmacpath.S_IFIFO\nmacpath.S_IFLNK\nmacpath.S_IFMT(??)\nmacpath.S_IFREG\nmacpath.S_IFSOCK\nmacpath.S_IMODE(??)\nmacpath.S_IREAD\nmacpath.S_IRGRP\nmacpath.S_IROTH\nmacpath.S_IRUSR\nmacpath.S_IRWXG\nmacpath.S_IRWXO\nmacpath.S_IRWXU\nmacpath.S_ISBLK(??)\nmacpath.S_ISCHR(??)\nmacpath.S_ISDIR(??)\nmacpath.S_ISFIFO(??)\nmacpath.S_ISGID\nmacpath.S_ISLNK(??)\nmacpath.S_ISREG(??)\nmacpath.S_ISSOCK(??)\nmacpath.S_ISUID\nmacpath.S_ISVTX\nmacpath.S_IWGRP\nmacpath.S_IWOTH\nmacpath.S_IWRITE\nmacpath.S_IWUSR\nmacpath.S_IXGRP\nmacpath.S_IXOTH\nmacpath.S_IXUSR\nmacpath.UF_APPEND\nmacpath.UF_IMMUTABLE\nmacpath.UF_NODUMP\nmacpath.UF_NOUNLINK\nmacpath.UF_OPAQUE\nmacpath.abspath(??)\nmacpath.altsep\nmacpath.basename(??)\nmacpath.commonprefix(??)\nmacpath.curdir\nmacpath.defpath\nmacpath.devnull\nmacpath.dirname(??)\nmacpath.exists(??)\nmacpath.expanduser(??)\nmacpath.expandvars(??)\nmacpath.extsep\nmacpath.genericpath\nmacpath.getatime(??)\nmacpath.getctime(??)\nmacpath.getmtime(??)\nmacpath.getsize(??)\nmacpath.isabs(??)\nmacpath.isdir(??)\nmacpath.isfile(??)\nmacpath.islink(??)\nmacpath.ismount(??)\nmacpath.join(??)\nmacpath.lexists(??)\nmacpath.norm_error\nmacpath.normcase(??)\nmacpath.normpath(??)\nmacpath.os\nmacpath.pardir\nmacpath.pathsep\nmacpath.realpath(??)\nmacpath.sep\nmacpath.split(??)\nmacpath.splitdrive(??)\nmacpath.splitext(??)\nmacpath.supports_unicode_filenames\nmacpath.walk(??)\nmacpath.warnings\nmacurl2path.os\nmacurl2path.pathname2url(??)\nmacurl2path.test(??)\nmacurl2path.url2pathname(??)\nmacurl2path.urllib\nmailbox.Babyl(??)\nmailbox.BabylMailbox(??)\nmailbox.BabylMessage(??)\nmailbox.Error\nmailbox.ExternalClashError\nmailbox.FormatError\nmailbox.MH(??)\nmailbox.MHMailbox(??)\nmailbox.MHMessage(??)\nmailbox.MMDF(??)\nmailbox.MMDFMessage(??)\nmailbox.Mailbox(??)\nmailbox.Maildir(??)\nmailbox.MaildirMessage(??)\nmailbox.Message(??)\nmailbox.MmdfMailbox(??)\nmailbox.NoSuchMailboxError\nmailbox.NotEmptyError\nmailbox.PortableUnixMailbox(??)\nmailbox.StringIO\nmailbox.UnixMailbox(??)\nmailbox.calendar\nmailbox.copy\nmailbox.email\nmailbox.errno\nmailbox.fcntl\nmailbox.mbox(??)\nmailbox.mboxMessage(??)\nmailbox.os\nmailbox.rfc822\nmailbox.socket\nmailbox.sys\nmailbox.time\nmailcap.findmatch(??)\nmailcap.findparam(??)\nmailcap.getcaps(??)\nmailcap.listmailcapfiles(??)\nmailcap.lookup(??)\nmailcap.os\nmailcap.parsefield(??)\nmailcap.parseline(??)\nmailcap.readmailcapfile(??)\nmailcap.show(??)\nmailcap.subst(??)\nmailcap.test(??)\nmap(function, sequence[, sequence, ...]) -> list\nmarkupbase.ParserBase(??)\nmarshal.dump\nmarshal.dumps\nmarshal.load\nmarshal.loads\nmarshal.version\nmath.acos(x)\nmath.acosh(x)\nmath.asin(x)\nmath.asinh(x)\nmath.atan(x)\nmath.atan2(y, x)\nmath.atanh(x)\nmath.ceil(x)\nmath.copysign(x,y)\nmath.cos(x)\nmath.cosh(x)\nmath.degrees(x) -> converts angle x from radians to degrees\nmath.e\nmath.exp(x)\nmath.fabs(x)\nmath.factorial\nmath.floor(x)\nmath.fmod(x,y)\nmath.frexp(x)\nmath.fsum\nmath.hypot(x,y)\nmath.isinf(x) -> bool\nmath.isnan(x) -> bool\nmath.ldexp(x, i) -> x * (2**i)\nmath.log(x[, base]) -> the logarithm of x to the given base.\nmath.log10(x) -> the base 10 logarithm of x.\nmath.log1p(x)\nmath.modf(x)\nmath.pi\nmath.pow(x,y)\nmath.radians(x) -> converts angle x from degrees to radians\nmath.sin(x)\nmath.sinh(x)\nmath.sqrt(x)\nmath.tan(x)\nmath.tanh(x)\nmath.trunc(x:Real) -> Integral\nmax(iterable[, key=func]) -> value\nmd5.blocksize\nmd5.digest_size\nmd5.md5\nmd5.new\nmd5.warnings\nmhlib.Error\nmhlib.FOLDER_PROTECT\nmhlib.Folder(??)\nmhlib.IntSet(??)\nmhlib.MH(??)\nmhlib.MH_PROFILE\nmhlib.MH_SEQUENCES\nmhlib.Message(??)\nmhlib.PATH\nmhlib.SubMessage(??)\nmhlib.bisect\nmhlib.isnumeric(??)\nmhlib.mimetools\nmhlib.multifile\nmhlib.numericprog\nmhlib.os\nmhlib.pickline(??)\nmhlib.re\nmhlib.shutil\nmhlib.sys\nmhlib.test(??)\nmhlib.updateline(??)\nmimetools.Message(??)\nmimetools.catch_warnings\nmimetools.choose_boundary(??)\nmimetools.copybinary(??)\nmimetools.copyliteral(??)\nmimetools.decode(??)\nmimetools.decodetab\nmimetools.encode(??)\nmimetools.encodetab\nmimetools.filterwarnings(??)\nmimetools.os\nmimetools.pipethrough(??)\nmimetools.pipeto(??)\nmimetools.rfc822\nmimetools.sys\nmimetools.tempfile\nmimetools.uudecode_pipe\nmimetools.warnpy3k(??)\nmimetypes.MimeTypes(??)\nmimetypes.add_type\nmimetypes.common_types\nmimetypes.encodings_map\nmimetypes.guess_all_extensions\nmimetypes.guess_extension\nmimetypes.guess_type\nmimetypes.init(??)\nmimetypes.inited\nmimetypes.knownfiles\nmimetypes.os\nmimetypes.posixpath\nmimetypes.read_mime_types(??)\nmimetypes.suffix_map\nmimetypes.types_map\nmimetypes.urllib\nmimify.CHARSET\nmimify.File(??)\nmimify.HeaderFile(??)\nmimify.MAXLEN\nmimify.QUOTE\nmimify.base64_re\nmimify.chrset\nmimify.cte\nmimify.he\nmimify.iso_char\nmimify.mime_char\nmimify.mime_code\nmimify.mime_decode(??)\nmimify.mime_decode_header(??)\nmimify.mime_encode(??)\nmimify.mime_encode_header(??)\nmimify.mime_head\nmimify.mime_header\nmimify.mime_header_char\nmimify.mimify(??)\nmimify.mimify_part(??)\nmimify.mp\nmimify.mv\nmimify.qp\nmimify.re\nmimify.repl\nmimify.sys\nmimify.unmimify(??)\nmimify.unmimify_part(??)\nmimify.warnings\nmin(iterable[, key=func]) -> value\nmmap.ACCESS_COPY\nmmap.ACCESS_READ\nmmap.ACCESS_WRITE\nmmap.ALLOCATIONGRANULARITY\nmmap.MAP_ANON\nmmap.MAP_ANONYMOUS\nmmap.MAP_DENYWRITE\nmmap.MAP_EXECUTABLE\nmmap.MAP_PRIVATE\nmmap.MAP_SHARED\nmmap.PAGESIZE\nmmap.PROT_EXEC\nmmap.PROT_READ\nmmap.PROT_WRITE\nmmap.error\nmmap.mmap\nmodulefinder.AddPackagePath(??)\nmodulefinder.HAVE_ARGUMENT\nmodulefinder.IMPORT_NAME\nmodulefinder.LOAD_CONST\nmodulefinder.Module(??)\nmodulefinder.ModuleFinder(??)\nmodulefinder.READ_MODE\nmodulefinder.ReplacePackage(??)\nmodulefinder.STORE_GLOBAL\nmodulefinder.STORE_NAME\nmodulefinder.STORE_OPS\nmodulefinder.dis\nmodulefinder.generators\nmodulefinder.imp\nmodulefinder.marshal\nmodulefinder.os\nmodulefinder.packagePathMap\nmodulefinder.replacePackageMap\nmodulefinder.struct\nmodulefinder.sys\nmodulefinder.test(??)\nmodulefinder.types\nmultifile.Error\nmultifile.MultiFile(??)\nmultiprocessing.Array(??)\nmultiprocessing.AuthenticationError\nmultiprocessing.BoundedSemaphore(??)\nmultiprocessing.BufferTooShort\nmultiprocessing.Condition(??)\nmultiprocessing.Event(??)\nmultiprocessing.JoinableQueue(??)\nmultiprocessing.Lock(??)\nmultiprocessing.Manager(??)\nmultiprocessing.Pipe(??)\nmultiprocessing.Pool(??)\nmultiprocessing.Process\nmultiprocessing.ProcessError\nmultiprocessing.Queue(??)\nmultiprocessing.RLock(??)\nmultiprocessing.RawArray(??)\nmultiprocessing.RawValue(??)\nmultiprocessing.Semaphore(??)\nmultiprocessing.TimeoutError\nmultiprocessing.Value(??)\nmultiprocessing.active_children(??)\nmultiprocessing.allow_connection_pickling(??)\nmultiprocessing.connection\nmultiprocessing.connection.AuthenticationError\nmultiprocessing.connection.BUFSIZE\nmultiprocessing.connection.CHALLENGE\nmultiprocessing.connection.Client(??)\nmultiprocessing.connection.ConnectionWrapper\nmultiprocessing.connection.FAILURE\nmultiprocessing.connection.Finalize\nmultiprocessing.connection.Listener\nmultiprocessing.connection.MESSAGE_LENGTH\nmultiprocessing.connection.Pipe(??)\nmultiprocessing.connection.SocketClient(??)\nmultiprocessing.connection.SocketListener\nmultiprocessing.connection.WELCOME\nmultiprocessing.connection.XmlClient(??)\nmultiprocessing.connection.XmlListener\nmultiprocessing.connection.address_type(??)\nmultiprocessing.connection.answer_challenge(??)\nmultiprocessing.connection.arbitrary_address(??)\nmultiprocessing.connection.close(fd)\nmultiprocessing.connection.current_process(??)\nmultiprocessing.connection.debug(??)\nmultiprocessing.connection.default_family\nmultiprocessing.connection.deliver_challenge(??)\nmultiprocessing.connection.duplicate\nmultiprocessing.connection.errno\nmultiprocessing.connection.families\nmultiprocessing.connection.get_temp_dir(??)\nmultiprocessing.connection.itertools\nmultiprocessing.connection.os\nmultiprocessing.connection.socket\nmultiprocessing.connection.sub_debug(??)\nmultiprocessing.connection.sys\nmultiprocessing.connection.tempfile\nmultiprocessing.connection.time\nmultiprocessing.cpu_count(??)\nmultiprocessing.current_process(??)\nmultiprocessing.dummy\nmultiprocessing.dummy.Array(??)\nmultiprocessing.dummy.BoundedSemaphore(??)\nmultiprocessing.dummy.Condition\nmultiprocessing.dummy.DummyProcess\nmultiprocessing.dummy.Event(??)\nmultiprocessing.dummy.JoinableQueue(??)\nmultiprocessing.dummy.Lock\nmultiprocessing.dummy.Manager(??)\nmultiprocessing.dummy.Namespace\nmultiprocessing.dummy.Pipe(??)\nmultiprocessing.dummy.Pool(??)\nmultiprocessing.dummy.Process\nmultiprocessing.dummy.Queue(??)\nmultiprocessing.dummy.RLock(??)\nmultiprocessing.dummy.Semaphore(??)\nmultiprocessing.dummy.TimeoutError\nmultiprocessing.dummy.Value\nmultiprocessing.dummy.active_children(??)\nmultiprocessing.dummy.array\nmultiprocessing.dummy.connection\nmultiprocessing.dummy.connection.Client(??)\nmultiprocessing.dummy.connection.Connection\nmultiprocessing.dummy.connection.Listener\nmultiprocessing.dummy.connection.Pipe(??)\nmultiprocessing.dummy.connection.Queue(??)\nmultiprocessing.dummy.connection.families\nmultiprocessing.dummy.cpu_count(??)\nmultiprocessing.dummy.current_process(??)\nmultiprocessing.dummy.dict() -> new empty dictionary.\nmultiprocessing.dummy.freeze_support(??)\nmultiprocessing.dummy.itertools\nmultiprocessing.dummy.list() -> new list\nmultiprocessing.dummy.shutdown(??)\nmultiprocessing.dummy.sys\nmultiprocessing.dummy.threading\nmultiprocessing.dummy.weakref\nmultiprocessing.forking\nmultiprocessing.forking.ForkingPickler(??)\nmultiprocessing.forking.Pickler(??)\nmultiprocessing.forking.Popen\nmultiprocessing.forking.assert_spawning(??)\nmultiprocessing.forking.close(fd)\nmultiprocessing.forking.duplicate\nmultiprocessing.forking.exit\nmultiprocessing.forking.old_main_modules\nmultiprocessing.forking.os\nmultiprocessing.forking.partial(func, *args, **keywords) - new function with partial application\nmultiprocessing.forking.prepare(??)\nmultiprocessing.forking.process\nmultiprocessing.forking.signal\nmultiprocessing.forking.sys\nmultiprocessing.forking.time\nmultiprocessing.forking.util\nmultiprocessing.freeze_support(??)\nmultiprocessing.get_logger(??)\nmultiprocessing.heap.Arena\nmultiprocessing.heap.BufferWrapper\nmultiprocessing.heap.Finalize\nmultiprocessing.heap.Heap\nmultiprocessing.heap.assert_spawning(??)\nmultiprocessing.heap.bisect\nmultiprocessing.heap.info(??)\nmultiprocessing.heap.itertools\nmultiprocessing.heap.mmap\nmultiprocessing.heap.os\nmultiprocessing.heap.sys\nmultiprocessing.heap.tempfile\nmultiprocessing.heap.threading\nmultiprocessing.log_to_stderr(??)\nmultiprocessing.managers.AcquirerProxy\nmultiprocessing.managers.Array(??)\nmultiprocessing.managers.ArrayProxy\nmultiprocessing.managers.AuthenticationString\nmultiprocessing.managers.AutoProxy(??)\nmultiprocessing.managers.BaseListProxy\nmultiprocessing.managers.BaseManager\nmultiprocessing.managers.BaseProxy\nmultiprocessing.managers.ConditionProxy\nmultiprocessing.managers.DictProxy\nmultiprocessing.managers.EventProxy\nmultiprocessing.managers.Finalize\nmultiprocessing.managers.ForkingPickler(??)\nmultiprocessing.managers.IteratorProxy\nmultiprocessing.managers.ListProxy\nmultiprocessing.managers.MakeProxyType(??)\nmultiprocessing.managers.Namespace\nmultiprocessing.managers.NamespaceProxy\nmultiprocessing.managers.PicklingError\nmultiprocessing.managers.Pool(??)\nmultiprocessing.managers.PoolProxy\nmultiprocessing.managers.Popen\nmultiprocessing.managers.Process\nmultiprocessing.managers.ProcessLocalSet\nmultiprocessing.managers.Queue\nmultiprocessing.managers.RebuildProxy(??)\nmultiprocessing.managers.RemoteError\nmultiprocessing.managers.Server\nmultiprocessing.managers.State\nmultiprocessing.managers.SyncManager\nmultiprocessing.managers.Token\nmultiprocessing.managers.Value\nmultiprocessing.managers.ValueProxy\nmultiprocessing.managers.active_children(??)\nmultiprocessing.managers.all_methods(??)\nmultiprocessing.managers.array\nmultiprocessing.managers.assert_spawning(??)\nmultiprocessing.managers.connection\nmultiprocessing.managers.convert_to_error(??)\nmultiprocessing.managers.current_process(??)\nmultiprocessing.managers.dispatch(??)\nmultiprocessing.managers.exit\nmultiprocessing.managers.format_exc(??)\nmultiprocessing.managers.info(??)\nmultiprocessing.managers.listener_client\nmultiprocessing.managers.name\nmultiprocessing.managers.os\nmultiprocessing.managers.public_methods(??)\nmultiprocessing.managers.reduce_array(??)\nmultiprocessing.managers.sys\nmultiprocessing.managers.threading\nmultiprocessing.managers.util\nmultiprocessing.managers.view_types\nmultiprocessing.managers.weakref\nmultiprocessing.os\nmultiprocessing.pool\nmultiprocessing.pool.ApplyResult\nmultiprocessing.pool.CLOSE\nmultiprocessing.pool.Finalize\nmultiprocessing.pool.IMapIterator\nmultiprocessing.pool.IMapUnorderedIterator\nmultiprocessing.pool.MapResult\nmultiprocessing.pool.Pool\nmultiprocessing.pool.Process\nmultiprocessing.pool.Queue\nmultiprocessing.pool.RUN\nmultiprocessing.pool.TERMINATE\nmultiprocessing.pool.ThreadPool\nmultiprocessing.pool.TimeoutError\nmultiprocessing.pool.collections\nmultiprocessing.pool.cpu_count(??)\nmultiprocessing.pool.debug(??)\nmultiprocessing.pool.itertools\nmultiprocessing.pool.job_counter\nmultiprocessing.pool.mapstar(??)\nmultiprocessing.pool.threading\nmultiprocessing.pool.time\nmultiprocessing.pool.worker(??)\nmultiprocessing.process\nmultiprocessing.process.AuthenticationString\nmultiprocessing.process.ORIGINAL_DIR\nmultiprocessing.process.Process\nmultiprocessing.process.active_children(??)\nmultiprocessing.process.current_process(??)\nmultiprocessing.process.itertools\nmultiprocessing.process.name\nmultiprocessing.process.os\nmultiprocessing.process.signal\nmultiprocessing.process.signum\nmultiprocessing.process.sys\nmultiprocessing.queues.BoundedSemaphore\nmultiprocessing.queues.Condition\nmultiprocessing.queues.Empty\nmultiprocessing.queues.Finalize\nmultiprocessing.queues.Full\nmultiprocessing.queues.JoinableQueue\nmultiprocessing.queues.Lock\nmultiprocessing.queues.Pipe(??)\nmultiprocessing.queues.Queue\nmultiprocessing.queues.Semaphore\nmultiprocessing.queues.SimpleQueue\nmultiprocessing.queues.assert_spawning(??)\nmultiprocessing.queues.atexit\nmultiprocessing.queues.collections\nmultiprocessing.queues.debug(??)\nmultiprocessing.queues.info(??)\nmultiprocessing.queues.os\nmultiprocessing.queues.register_after_fork(??)\nmultiprocessing.queues.sys\nmultiprocessing.queues.threading\nmultiprocessing.queues.time\nmultiprocessing.queues.weakref\nmultiprocessing.reduction.Client(??)\nmultiprocessing.reduction.ForkingPickler(??)\nmultiprocessing.reduction.Listener\nmultiprocessing.reduction.Popen\nmultiprocessing.reduction.close(fd)\nmultiprocessing.reduction.current_process(??)\nmultiprocessing.reduction.debug(??)\nmultiprocessing.reduction.duplicate\nmultiprocessing.reduction.fromfd(??)\nmultiprocessing.reduction.os\nmultiprocessing.reduction.rebuild_connection(??)\nmultiprocessing.reduction.rebuild_handle(??)\nmultiprocessing.reduction.rebuild_socket(??)\nmultiprocessing.reduction.recv_handle(??)\nmultiprocessing.reduction.reduce_connection(??)\nmultiprocessing.reduction.reduce_handle(??)\nmultiprocessing.reduction.reduce_socket(??)\nmultiprocessing.reduction.register_after_fork(??)\nmultiprocessing.reduction.send_handle(??)\nmultiprocessing.reduction.socket\nmultiprocessing.reduction.sub_debug(??)\nmultiprocessing.reduction.sys\nmultiprocessing.reduction.threading\nmultiprocessing.sharedctypes.Array(??)\nmultiprocessing.sharedctypes.ForkingPickler(??)\nmultiprocessing.sharedctypes.RLock(??)\nmultiprocessing.sharedctypes.RawArray(??)\nmultiprocessing.sharedctypes.RawValue(??)\nmultiprocessing.sharedctypes.Synchronized\nmultiprocessing.sharedctypes.SynchronizedArray\nmultiprocessing.sharedctypes.SynchronizedBase\nmultiprocessing.sharedctypes.SynchronizedString\nmultiprocessing.sharedctypes.Value(??)\nmultiprocessing.sharedctypes.assert_spawning(??)\nmultiprocessing.sharedctypes.class_cache\nmultiprocessing.sharedctypes.copy(??)\nmultiprocessing.sharedctypes.ctypes\nmultiprocessing.sharedctypes.heap\nmultiprocessing.sharedctypes.make_property(??)\nmultiprocessing.sharedctypes.prop_cache\nmultiprocessing.sharedctypes.rebuild_ctype(??)\nmultiprocessing.sharedctypes.reduce_ctype(??)\nmultiprocessing.sharedctypes.synchronized(??)\nmultiprocessing.sharedctypes.sys\nmultiprocessing.sharedctypes.template\nmultiprocessing.sharedctypes.typecode_to_type\nmultiprocessing.sharedctypes.weakref\nmultiprocessing.synchronize.BoundedSemaphore\nmultiprocessing.synchronize.Condition\nmultiprocessing.synchronize.Event\nmultiprocessing.synchronize.Finalize\nmultiprocessing.synchronize.Lock\nmultiprocessing.synchronize.Popen\nmultiprocessing.synchronize.RECURSIVE_MUTEX\nmultiprocessing.synchronize.RLock\nmultiprocessing.synchronize.SEMAPHORE\nmultiprocessing.synchronize.SEM_VALUE_MAX\nmultiprocessing.synchronize.SemLock\nmultiprocessing.synchronize.Semaphore\nmultiprocessing.synchronize.assert_spawning(??)\nmultiprocessing.synchronize.current_process(??)\nmultiprocessing.synchronize.debug(??)\nmultiprocessing.synchronize.os\nmultiprocessing.synchronize.register_after_fork(??)\nmultiprocessing.synchronize.sys\nmultiprocessing.synchronize.threading\nmultiprocessing.sys\nmultiprocessing.util\nmultiprocessing.util.DEBUG\nmultiprocessing.util.DEFAULT_LOGGING_FORMAT\nmultiprocessing.util.Finalize\nmultiprocessing.util.ForkAwareLocal\nmultiprocessing.util.ForkAwareThreadLock\nmultiprocessing.util.INFO\nmultiprocessing.util.LOGGER_NAME\nmultiprocessing.util.NOTSET\nmultiprocessing.util.SUBDEBUG\nmultiprocessing.util.SUBWARNING\nmultiprocessing.util.active_children(??)\nmultiprocessing.util.atexit\nmultiprocessing.util.current_process(??)\nmultiprocessing.util.debug(??)\nmultiprocessing.util.get_logger(??)\nmultiprocessing.util.get_temp_dir(??)\nmultiprocessing.util.info(??)\nmultiprocessing.util.is_exiting(??)\nmultiprocessing.util.itertools\nmultiprocessing.util.log_to_stderr(??)\nmultiprocessing.util.register_after_fork(??)\nmultiprocessing.util.sub_debug(??)\nmultiprocessing.util.sub_warning(??)\nmultiprocessing.util.threading\nmultiprocessing.util.weakref\nmutex.deque(iterable[, maxlen]) --> deque object\nmutex.mutex(??)\nnetrc.NetrcParseError\nnetrc.netrc(??)\nnetrc.os\nnetrc.shlex\nnew.classobj(name, bases, dict)\nnew.code\nnew.function(code, globals[, name[, argdefs[, closure]]])\nnew.instance(class[, dict])\nnew.instancemethod(function, instance, class)\nnew.module(name[, doc])\nnext(iterator[, default])\nnis.cat(map, domain = defaultdomain)\nnis.error\nnis.get_default_domain() -> str\nnis.maps(domain = defaultdomain)\nnis.match(key, map, domain = defaultdomain)\nnntplib.CRLF\nnntplib.LONGRESP\nnntplib.NNTP(??)\nnntplib.NNTPDataError\nnntplib.NNTPError\nnntplib.NNTPPermanentError\nnntplib.NNTPProtocolError\nnntplib.NNTPReplyError\nnntplib.NNTPTemporaryError\nnntplib.NNTP_PORT\nnntplib.error_data\nnntplib.error_perm\nnntplib.error_proto\nnntplib.error_reply\nnntplib.error_temp\nnntplib.re\nnntplib.socket\nntpath.abspath(??)\nntpath.altsep\nntpath.basename(??)\nntpath.commonprefix(??)\nntpath.curdir\nntpath.defpath\nntpath.devnull\nntpath.dirname(??)\nntpath.exists(??)\nntpath.expanduser(??)\nntpath.expandvars(??)\nntpath.extsep\nntpath.genericpath\nntpath.getatime(??)\nntpath.getctime(??)\nntpath.getmtime(??)\nntpath.getsize(??)\nntpath.isabs(??)\nntpath.isdir(??)\nntpath.isfile(??)\nntpath.islink(??)\nntpath.ismount(??)\nntpath.join(??)\nntpath.lexists(??)\nntpath.normcase(??)\nntpath.normpath(??)\nntpath.os\nntpath.pardir\nntpath.pathsep\nntpath.realpath(??)\nntpath.relpath(??)\nntpath.sep\nntpath.split(??)\nntpath.splitdrive(??)\nntpath.splitext(??)\nntpath.splitunc(??)\nntpath.stat\nntpath.supports_unicode_filenames\nntpath.sys\nntpath.walk(??)\nntpath.warnings\nnturl2path.pathname2url(??)\nnturl2path.url2pathname(??)\nnumbers.ABCMeta\nnumbers.Complex\nnumbers.Integral\nnumbers.Number\nnumbers.Rational\nnumbers.Real\nnumbers.abstractmethod(??)\nnumbers.abstractproperty\nnumbers.division\nobject\noct(number) -> string\nopcode.EXTENDED_ARG\nopcode.HAVE_ARGUMENT\nopcode.cmp_op\nopcode.hascompare\nopcode.hasconst\nopcode.hasfree\nopcode.hasjabs\nopcode.hasjrel\nopcode.haslocal\nopcode.hasname\nopcode.opmap\nopcode.opname\nopen(name[, mode[, buffering]]) -> file object\noperator.abs(a) -- Same as abs(a).\noperator.add(a, b) -- Same as a + b.\noperator.and_(a, b) -- Same as a & b.\noperator.attrgetter(attr, ...) --> attrgetter object\noperator.concat(a, b) -- Same as a + b, for a and b sequences.\noperator.contains(a, b) -- Same as b in a (note reversed operands).\noperator.countOf(a, b) -- Return the number of times b occurs in a.\noperator.delitem(a, b) -- Same as del a[b].\noperator.delslice(a, b, c) -- Same as del a[b:c].\noperator.div(a, b) -- Same as a / b when __future__.division is not in effect.\noperator.eq(a, b) -- Same as a==b.\noperator.floordiv(a, b) -- Same as a // b.\noperator.ge(a, b) -- Same as a>=b.\noperator.getitem(a, b) -- Same as a[b].\noperator.getslice(a, b, c) -- Same as a[b:c].\noperator.gt(a, b) -- Same as a>b.\noperator.iadd(a, b) -- Same as a += b.\noperator.iand(a, b) -- Same as a &= b.\noperator.iconcat(a, b) -- Same as a += b, for a and b sequences.\noperator.idiv(a, b) -- Same as a /= b when __future__.division is not in effect.\noperator.ifloordiv(a, b) -- Same as a //= b.\noperator.ilshift(a, b) -- Same as a <<= b.\noperator.imod(a, b) -- Same as a %= b.\noperator.imul(a, b) -- Same as a *= b.\noperator.index(a) -- Same as a.__index__()\noperator.indexOf(a, b) -- Return the first index of b in a.\noperator.inv(a) -- Same as ~a.\noperator.invert(a) -- Same as ~a.\noperator.ior(a, b) -- Same as a |= b.\noperator.ipow(a, b) -- Same as a **= b.\noperator.irepeat(a, b) -- Same as a *= b, where a is a sequence, and b is an integer.\noperator.irshift(a, b) -- Same as a >>= b.\noperator.isCallable(a) -- Same as callable(a).\noperator.isMappingType(a) -- Return True if a has a mapping type, False otherwise.\noperator.isNumberType(a) -- Return True if a has a numeric type, False otherwise.\noperator.isSequenceType(a) -- Return True if a has a sequence type, False otherwise.\noperator.is_(a, b) -- Same as a is b.\noperator.is_not(a, b) -- Same as a is not b.\noperator.isub(a, b) -- Same as a -= b.\noperator.itemgetter(item, ...) --> itemgetter object\noperator.itruediv(a, b) -- Same as a /= b when __future__.division is in effect.\noperator.ixor(a, b) -- Same as a ^= b.\noperator.le(a, b) -- Same as a<=b.\noperator.lshift(a, b) -- Same as a << b.\noperator.lt(a, b) -- Same as a<b.\noperator.methodcaller(name, ...) --> methodcaller object\noperator.mod(a, b) -- Same as a % b.\noperator.mul(a, b) -- Same as a * b.\noperator.ne(a, b) -- Same as a!=b.\noperator.neg(a) -- Same as -a.\noperator.not_(a) -- Same as not a.\noperator.or_(a, b) -- Same as a | b.\noperator.pos(a) -- Same as +a.\noperator.pow(a, b) -- Same as a ** b.\noperator.repeat(a, b) -- Return a * b, where a is a sequence, and b is an integer.\noperator.rshift(a, b) -- Same as a >> b.\noperator.sequenceIncludes(a, b) -- Same as b in a (note reversed operands; deprecated).\noperator.setitem(a, b, c) -- Same as a[b] = c.\noperator.setslice(a, b, c, d) -- Same as a[b:c] = d.\noperator.sub(a, b) -- Same as a - b.\noperator.truediv(a, b) -- Same as a / b when __future__.division is in effect.\noperator.truth(a) -- Return True if a is true, False otherwise.\noperator.xor(a, b) -- Same as a ^ b.\noptparse.AmbiguousOptionError\noptparse.BadOptionError\noptparse.HelpFormatter(??)\noptparse.IndentedHelpFormatter(??)\noptparse.NO_DEFAULT\noptparse.OptParseError\noptparse.Option(??)\noptparse.OptionConflictError\noptparse.OptionContainer(??)\noptparse.OptionError\noptparse.OptionGroup(??)\noptparse.OptionParser(??)\noptparse.OptionValueError\noptparse.SUPPRESS_HELP\noptparse.SUPPRESS_USAGE\noptparse.TitledHelpFormatter(??)\noptparse.Values(??)\noptparse.check_builtin(??)\noptparse.check_choice(??)\noptparse.gettext(??)\noptparse.isbasestring(??)\noptparse.make_option(??)\noptparse.os\noptparse.sys\noptparse.textwrap\noptparse.types\nord(c) -> integer\nos.EX_CANTCREAT\nos.EX_CONFIG\nos.EX_DATAERR\nos.EX_IOERR\nos.EX_NOHOST\nos.EX_NOINPUT\nos.EX_NOPERM\nos.EX_NOUSER\nos.EX_OK\nos.EX_OSERR\nos.EX_OSFILE\nos.EX_PROTOCOL\nos.EX_SOFTWARE\nos.EX_TEMPFAIL\nos.EX_UNAVAILABLE\nos.EX_USAGE\nos.F_OK\nos.NGROUPS_MAX\nos.O_APPEND\nos.O_ASYNC\nos.O_CREAT\nos.O_DIRECT\nos.O_DIRECTORY\nos.O_DSYNC\nos.O_EXCL\nos.O_LARGEFILE\nos.O_NDELAY\nos.O_NOATIME\nos.O_NOCTTY\nos.O_NOFOLLOW\nos.O_NONBLOCK\nos.O_RDONLY\nos.O_RDWR\nos.O_RSYNC\nos.O_SYNC\nos.O_TRUNC\nos.O_WRONLY\nos.P_NOWAIT\nos.P_NOWAITO\nos.P_WAIT\nos.R_OK\nos.SEEK_CUR\nos.SEEK_END\nos.SEEK_SET\nos.TMP_MAX\nos.UserDict\nos.WCONTINUED\nos.WCOREDUMP(status) -> bool\nos.WEXITSTATUS(status) -> integer\nos.WIFCONTINUED(status) -> bool\nos.WIFEXITED(status) -> bool\nos.WIFSIGNALED(status) -> bool\nos.WIFSTOPPED(status) -> bool\nos.WNOHANG\nos.WSTOPSIG(status) -> integer\nos.WTERMSIG(status) -> integer\nos.WUNTRACED\nos.W_OK\nos.X_OK\nos.abort() -> does not return!\nos.access(path, mode) -> True if granted, False otherwise\nos.altsep\nos.chdir(path)\nos.chmod(path, mode)\nos.chown(path, uid, gid)\nos.chroot(path)\nos.close(fd)\nos.closerange(fd_low, fd_high)\nos.confstr(name) -> string\nos.confstr_names\nos.ctermid() -> string\nos.curdir\nos.defpath\nos.devnull\nos.dup(fd) -> fd2\nos.dup2(old_fd, new_fd)\nos.environ\nos.errno\nos.error\nos.execl(file, *args)\nos.execle(file, *args, env)\nos.execlp(file, *args)\nos.execlpe(file, *args, env)\nos.execv(path, args)\nos.execve(path, args, env)\nos.execvp(??)\nos.execvpe(file, args, env)\nos.extsep\nos.fchdir(fildes)\nos.fchmod(fd, mode)\nos.fchown(fd, uid, gid)\nos.fdatasync(fildes)\nos.fdopen(fd [, mode='r' [, bufsize]]) -> file_object\nos.fork() -> pid\nos.forkpty() -> (pid, master_fd)\nos.fpathconf(fd, name) -> integer\nos.fstat(fd) -> stat result\nos.fstatvfs(fd) -> statvfs result\nos.fsync(fildes)\nos.ftruncate(fd, length)\nos.getcwd() -> path\nos.getcwdu() -> path\nos.getegid() -> egid\nos.getenv(??)\nos.geteuid() -> euid\nos.getgid() -> gid\nos.getgroups() -> list of group IDs\nos.getloadavg() -> (float, float, float)\nos.getlogin() -> string\nos.getpgid(pid) -> pgid\nos.getpgrp() -> pgrp\nos.getpid() -> pid\nos.getppid() -> ppid\nos.getsid(pid) -> sid\nos.getuid() -> uid\nos.isatty(fd) -> bool\nos.kill(pid, sig)\nos.killpg(pgid, sig)\nos.lchown(path, uid, gid)\nos.linesep\nos.link(src, dst)\nos.listdir(path) -> list_of_strings\nos.lseek(fd, pos, how) -> newpos\nos.lstat(path) -> stat result\nos.major(device) -> major number\nos.makedev(major, minor) -> device number\nos.makedirs(path [, mode=0777])\nos.minor(device) -> minor number\nos.mkdir(path [, mode=0777])\nos.mkfifo(filename [, mode=0666])\nos.mknod(filename [, mode=0600, device])\nos.name\nos.nice(inc) -> new_priority\nos.open(filename, flag [, mode=0777]) -> fd\nos.openpty() -> (master_fd, slave_fd)\nos.pardir\nos.path\nos.pathconf(path, name) -> integer\nos.pathconf_names\nos.pathsep\nos.pipe() -> (read_end, write_end)\nos.popen(command [, mode='r' [, bufsize]]) -> pipe\nos.popen2(??)\nos.popen3(??)\nos.popen4(??)\nos.putenv(key, value)\nos.read(fd, buffersize) -> string\nos.readlink(path) -> path\nos.remove(path)\nos.removedirs(path)\nos.rename(old, new)\nos.renames(old, new)\nos.rmdir(path)\nos.sep\nos.setegid(gid)\nos.seteuid(uid)\nos.setgid(gid)\nos.setgroups(list)\nos.setpgid(pid, pgrp)\nos.setpgrp()\nos.setregid(rgid, egid)\nos.setreuid(ruid, euid)\nos.setsid()\nos.setuid(uid)\nos.spawnl(mode, file, *args) -> integer\nos.spawnle(mode, file, *args, env) -> integer\nos.spawnlp(mode, file, *args) -> integer\nos.spawnlpe(mode, file, *args, env) -> integer\nos.spawnv(mode, file, args) -> integer\nos.spawnve(mode, file, args, env) -> integer\nos.spawnvp(mode, file, args) -> integer\nos.spawnvpe(mode, file, args, env) -> integer\nos.stat(path) -> stat result\nos.stat_float_times([newval]) -> oldval\nos.stat_result\nos.statvfs(path) -> statvfs result\nos.statvfs_result\nos.strerror(code) -> string\nos.symlink(src, dst)\nos.sys\nos.sysconf(name) -> integer\nos.sysconf_names\nos.system(command) -> exit_status\nos.tcgetpgrp(fd) -> pgid\nos.tcsetpgrp(fd, pgid)\nos.tempnam([dir[, prefix]]) -> string\nos.times() -> (utime, stime, cutime, cstime, elapsed_time)\nos.tmpfile() -> file object\nos.tmpnam() -> string\nos.ttyname(fd) -> string\nos.umask(new_mask) -> old_mask\nos.uname() -> (sysname, nodename, release, version, machine)\nos.unlink(path)\nos.unsetenv(key)\nos.urandom(n) -> str\nos.utime(path, (atime, mtime))\nos.wait() -> (pid, status)\nos.wait3(options) -> (pid, status, rusage)\nos.wait4(pid, options) -> (pid, status, rusage)\nos.waitpid(pid, options) -> (pid, status)\nos.walk(??)\nos.write(fd, string) -> byteswritten\nos2emxpath.abspath(??)\nos2emxpath.altsep\nos2emxpath.basename(??)\nos2emxpath.commonprefix(??)\nos2emxpath.curdir\nos2emxpath.defpath\nos2emxpath.devnull\nos2emxpath.dirname(??)\nos2emxpath.exists(??)\nos2emxpath.expanduser(??)\nos2emxpath.expandvars(??)\nos2emxpath.extsep\nos2emxpath.getatime(??)\nos2emxpath.getctime(??)\nos2emxpath.getmtime(??)\nos2emxpath.getsize(??)\nos2emxpath.isabs(??)\nos2emxpath.isdir(??)\nos2emxpath.isfile(??)\nos2emxpath.islink(??)\nos2emxpath.ismount(??)\nos2emxpath.join(??)\nos2emxpath.lexists(??)\nos2emxpath.normcase(??)\nos2emxpath.normpath(??)\nos2emxpath.os\nos2emxpath.pardir\nos2emxpath.pathsep\nos2emxpath.realpath(??)\nos2emxpath.sep\nos2emxpath.split(??)\nos2emxpath.splitdrive(??)\nos2emxpath.splitext(??)\nos2emxpath.splitunc(??)\nos2emxpath.stat\nos2emxpath.supports_unicode_filenames\nos2emxpath.walk(??)\nossaudiodev.AFMT_AC3\nossaudiodev.AFMT_A_LAW\nossaudiodev.AFMT_IMA_ADPCM\nossaudiodev.AFMT_MPEG\nossaudiodev.AFMT_MU_LAW\nossaudiodev.AFMT_QUERY\nossaudiodev.AFMT_S16_BE\nossaudiodev.AFMT_S16_LE\nossaudiodev.AFMT_S16_NE\nossaudiodev.AFMT_S8\nossaudiodev.AFMT_U16_BE\nossaudiodev.AFMT_U16_LE\nossaudiodev.AFMT_U8\nossaudiodev.OSSAudioError\nossaudiodev.SNDCTL_COPR_HALT\nossaudiodev.SNDCTL_COPR_LOAD\nossaudiodev.SNDCTL_COPR_RCODE\nossaudiodev.SNDCTL_COPR_RCVMSG\nossaudiodev.SNDCTL_COPR_RDATA\nossaudiodev.SNDCTL_COPR_RESET\nossaudiodev.SNDCTL_COPR_RUN\nossaudiodev.SNDCTL_COPR_SENDMSG\nossaudiodev.SNDCTL_COPR_WCODE\nossaudiodev.SNDCTL_COPR_WDATA\nossaudiodev.SNDCTL_DSP_BIND_CHANNEL\nossaudiodev.SNDCTL_DSP_CHANNELS\nossaudiodev.SNDCTL_DSP_GETBLKSIZE\nossaudiodev.SNDCTL_DSP_GETCAPS\nossaudiodev.SNDCTL_DSP_GETCHANNELMASK\nossaudiodev.SNDCTL_DSP_GETFMTS\nossaudiodev.SNDCTL_DSP_GETIPTR\nossaudiodev.SNDCTL_DSP_GETISPACE\nossaudiodev.SNDCTL_DSP_GETODELAY\nossaudiodev.SNDCTL_DSP_GETOPTR\nossaudiodev.SNDCTL_DSP_GETOSPACE\nossaudiodev.SNDCTL_DSP_GETSPDIF\nossaudiodev.SNDCTL_DSP_GETTRIGGER\nossaudiodev.SNDCTL_DSP_MAPINBUF\nossaudiodev.SNDCTL_DSP_MAPOUTBUF\nossaudiodev.SNDCTL_DSP_NONBLOCK\nossaudiodev.SNDCTL_DSP_POST\nossaudiodev.SNDCTL_DSP_PROFILE\nossaudiodev.SNDCTL_DSP_RESET\nossaudiodev.SNDCTL_DSP_SAMPLESIZE\nossaudiodev.SNDCTL_DSP_SETDUPLEX\nossaudiodev.SNDCTL_DSP_SETFMT\nossaudiodev.SNDCTL_DSP_SETFRAGMENT\nossaudiodev.SNDCTL_DSP_SETSPDIF\nossaudiodev.SNDCTL_DSP_SETSYNCRO\nossaudiodev.SNDCTL_DSP_SETTRIGGER\nossaudiodev.SNDCTL_DSP_SPEED\nossaudiodev.SNDCTL_DSP_STEREO\nossaudiodev.SNDCTL_DSP_SUBDIVIDE\nossaudiodev.SNDCTL_DSP_SYNC\nossaudiodev.SNDCTL_FM_4OP_ENABLE\nossaudiodev.SNDCTL_FM_LOAD_INSTR\nossaudiodev.SNDCTL_MIDI_INFO\nossaudiodev.SNDCTL_MIDI_MPUCMD\nossaudiodev.SNDCTL_MIDI_MPUMODE\nossaudiodev.SNDCTL_MIDI_PRETIME\nossaudiodev.SNDCTL_SEQ_CTRLRATE\nossaudiodev.SNDCTL_SEQ_GETINCOUNT\nossaudiodev.SNDCTL_SEQ_GETOUTCOUNT\nossaudiodev.SNDCTL_SEQ_GETTIME\nossaudiodev.SNDCTL_SEQ_NRMIDIS\nossaudiodev.SNDCTL_SEQ_NRSYNTHS\nossaudiodev.SNDCTL_SEQ_OUTOFBAND\nossaudiodev.SNDCTL_SEQ_PANIC\nossaudiodev.SNDCTL_SEQ_PERCMODE\nossaudiodev.SNDCTL_SEQ_RESET\nossaudiodev.SNDCTL_SEQ_RESETSAMPLES\nossaudiodev.SNDCTL_SEQ_SYNC\nossaudiodev.SNDCTL_SEQ_TESTMIDI\nossaudiodev.SNDCTL_SEQ_THRESHOLD\nossaudiodev.SNDCTL_SYNTH_CONTROL\nossaudiodev.SNDCTL_SYNTH_ID\nossaudiodev.SNDCTL_SYNTH_INFO\nossaudiodev.SNDCTL_SYNTH_MEMAVL\nossaudiodev.SNDCTL_SYNTH_REMOVESAMPLE\nossaudiodev.SNDCTL_TMR_CONTINUE\nossaudiodev.SNDCTL_TMR_METRONOME\nossaudiodev.SNDCTL_TMR_SELECT\nossaudiodev.SNDCTL_TMR_SOURCE\nossaudiodev.SNDCTL_TMR_START\nossaudiodev.SNDCTL_TMR_STOP\nossaudiodev.SNDCTL_TMR_TEMPO\nossaudiodev.SNDCTL_TMR_TIMEBASE\nossaudiodev.SOUND_MIXER_ALTPCM\nossaudiodev.SOUND_MIXER_BASS\nossaudiodev.SOUND_MIXER_CD\nossaudiodev.SOUND_MIXER_DIGITAL1\nossaudiodev.SOUND_MIXER_DIGITAL2\nossaudiodev.SOUND_MIXER_DIGITAL3\nossaudiodev.SOUND_MIXER_IGAIN\nossaudiodev.SOUND_MIXER_IMIX\nossaudiodev.SOUND_MIXER_LINE\nossaudiodev.SOUND_MIXER_LINE1\nossaudiodev.SOUND_MIXER_LINE2\nossaudiodev.SOUND_MIXER_LINE3\nossaudiodev.SOUND_MIXER_MIC\nossaudiodev.SOUND_MIXER_MONITOR\nossaudiodev.SOUND_MIXER_NRDEVICES\nossaudiodev.SOUND_MIXER_OGAIN\nossaudiodev.SOUND_MIXER_PCM\nossaudiodev.SOUND_MIXER_PHONEIN\nossaudiodev.SOUND_MIXER_PHONEOUT\nossaudiodev.SOUND_MIXER_RADIO\nossaudiodev.SOUND_MIXER_RECLEV\nossaudiodev.SOUND_MIXER_SPEAKER\nossaudiodev.SOUND_MIXER_SYNTH\nossaudiodev.SOUND_MIXER_TREBLE\nossaudiodev.SOUND_MIXER_VIDEO\nossaudiodev.SOUND_MIXER_VOLUME\nossaudiodev.control_labels\nossaudiodev.control_names\nossaudiodev.error\nossaudiodev.open\nossaudiodev.openmixer\nparser.ASTType\nparser.ParserError\nparser.STType\nparser.ast2list\nparser.ast2tuple\nparser.compileast\nparser.compilest\nparser.expr\nparser.isexpr\nparser.issuite\nparser.sequence2ast\nparser.sequence2st\nparser.st2list\nparser.st2tuple\nparser.suite\nparser.tuple2ast\nparser.tuple2st\npdb.Pdb(??)\npdb.Repr(??)\npdb.Restart\npdb.TESTCMD\npdb.bdb\npdb.cmd\npdb.find_function(??)\npdb.help(??)\npdb.line_prefix\npdb.linecache\npdb.main(??)\npdb.os\npdb.pm(??)\npdb.post_mortem(??)\npdb.pprint\npdb.re\npdb.run(??)\npdb.runcall(??)\npdb.runctx(??)\npdb.runeval(??)\npdb.set_trace(??)\npdb.sys\npdb.test(??)\npdb.traceback\npickle.APPEND\npickle.APPENDS\npickle.BINFLOAT\npickle.BINGET\npickle.BININT\npickle.BININT1\npickle.BININT2\npickle.BINPERSID\npickle.BINPUT\npickle.BINSTRING\npickle.BINUNICODE\npickle.BUILD\npickle.BooleanType\npickle.BufferType\npickle.BuiltinFunctionType\npickle.BuiltinMethodType\npickle.ClassType\npickle.CodeType\npickle.ComplexType\npickle.DICT\npickle.DUP\npickle.DictProxyType\npickle.DictType\npickle.DictionaryType\npickle.EMPTY_DICT\npickle.EMPTY_LIST\npickle.EMPTY_TUPLE\npickle.EXT1\npickle.EXT2\npickle.EXT4\npickle.EllipsisType\npickle.FALSE\npickle.FLOAT\npickle.FileType\npickle.FloatType\npickle.FrameType\npickle.FunctionType\npickle.GET\npickle.GLOBAL\npickle.GeneratorType\npickle.GetSetDescriptorType\npickle.HIGHEST_PROTOCOL\npickle.INST\npickle.INT\npickle.InstanceType\npickle.IntType\npickle.LIST\npickle.LONG\npickle.LONG1\npickle.LONG4\npickle.LONG_BINGET\npickle.LONG_BINPUT\npickle.LambdaType\npickle.ListType\npickle.LongType\npickle.MARK\npickle.MemberDescriptorType\npickle.MethodType\npickle.ModuleType\npickle.NEWFALSE\npickle.NEWOBJ\npickle.NEWTRUE\npickle.NONE\npickle.NoneType\npickle.NotImplementedType\npickle.OBJ\npickle.ObjectType\npickle.PERSID\npickle.POP\npickle.POP_MARK\npickle.PROTO\npickle.PUT\npickle.PickleError\npickle.Pickler(??)\npickle.PicklingError\npickle.PyStringMap\npickle.REDUCE\npickle.SETITEM\npickle.SETITEMS\npickle.SHORT_BINSTRING\npickle.STOP\npickle.STRING\npickle.SliceType\npickle.StringIO([s]) -- Return a StringIO-like stream for reading or writing\npickle.StringType\npickle.StringTypes\npickle.TRUE\npickle.TUPLE\npickle.TUPLE1\npickle.TUPLE2\npickle.TUPLE3\npickle.TracebackType\npickle.TupleType\npickle.TypeType\npickle.UNICODE\npickle.UnboundMethodType\npickle.UnicodeType\npickle.Unpickler(??)\npickle.UnpicklingError\npickle.XRangeType\npickle.classmap\npickle.compatible_formats\npickle.decode_long(??)\npickle.dispatch_table\npickle.dump(??)\npickle.dumps(??)\npickle.encode_long(??)\npickle.format_version\npickle.load(??)\npickle.loads(??)\npickle.marshal\npickle.mloads\npickle.re\npickle.struct\npickle.sys\npickle.whichmodule(??)\npickletools.ArgumentDescriptor\npickletools.OpcodeInfo\npickletools.StackObject\npickletools.TAKEN_FROM_ARGUMENT1\npickletools.TAKEN_FROM_ARGUMENT4\npickletools.UP_TO_NEWLINE\npickletools.anyobject\npickletools.code2op\npickletools.decimalnl_long\npickletools.decimalnl_short\npickletools.decode_long(??)\npickletools.dis(??)\npickletools.float8\npickletools.floatnl\npickletools.genops(??)\npickletools.int4\npickletools.long1\npickletools.long4\npickletools.markobject\npickletools.opcodes\npickletools.optimize(??)\npickletools.pybool\npickletools.pydict\npickletools.pyfloat\npickletools.pyint\npickletools.pyinteger_or_bool\npickletools.pylist\npickletools.pylong\npickletools.pynone\npickletools.pystring\npickletools.pytuple\npickletools.pyunicode\npickletools.read_decimalnl_long(??)\npickletools.read_decimalnl_short(??)\npickletools.read_float8(??)\npickletools.read_floatnl(??)\npickletools.read_int4(??)\npickletools.read_long1(??)\npickletools.read_long4(??)\npickletools.read_string1(??)\npickletools.read_string4(??)\npickletools.read_stringnl(??)\npickletools.read_stringnl_noescape(??)\npickletools.read_stringnl_noescape_pair(??)\npickletools.read_uint1(??)\npickletools.read_uint2(??)\npickletools.read_unicodestring4(??)\npickletools.read_unicodestringnl(??)\npickletools.stackslice\npickletools.string1\npickletools.string4\npickletools.stringnl\npickletools.stringnl_noescape\npickletools.stringnl_noescape_pair\npickletools.uint1\npickletools.uint2\npickletools.unicodestring4\npickletools.unicodestringnl\npipes.FILEIN_FILEOUT\npipes.FILEIN_STDOUT\npipes.SINK\npipes.SOURCE\npipes.STDIN_FILEOUT\npipes.STDIN_STDOUT\npipes.Template(??)\npipes.makepipeline(??)\npipes.os\npipes.quote(??)\npipes.re\npipes.stepkinds\npipes.string\npipes.tempfile\npkgutil.ImpImporter(??)\npkgutil.ImpLoader(??)\npkgutil.ModuleType\npkgutil.extend_path(??)\npkgutil.find_loader(??)\npkgutil.get_data(??)\npkgutil.get_importer(??)\npkgutil.get_loader(??)\npkgutil.imp\npkgutil.iter_importer_modules(??)\npkgutil.iter_importers(??)\npkgutil.iter_modules(??)\npkgutil.iter_zipimport_modules(??)\npkgutil.os\npkgutil.read_code(??)\npkgutil.simplegeneric(??)\npkgutil.sys\npkgutil.walk_packages(??)\npkgutil.zipimport\npkgutil.zipimporter(archivepath) -> zipimporter object\nplatform.architecture(??)\nplatform.dist(??)\nplatform.java_ver(??)\nplatform.libc_ver(??)\nplatform.linux_distribution(??)\nplatform.mac_ver(??)\nplatform.machine(??)\nplatform.node(??)\nplatform.os\nplatform.platform(??)\nplatform.popen(??)\nplatform.processor(??)\nplatform.python_branch(??)\nplatform.python_build(??)\nplatform.python_compiler(??)\nplatform.python_implementation(??)\nplatform.python_revision(??)\nplatform.python_version(??)\nplatform.python_version_tuple(??)\nplatform.re\nplatform.release(??)\nplatform.string\nplatform.sys\nplatform.system(??)\nplatform.system_alias(??)\nplatform.uname(??)\nplatform.version(??)\nplatform.win32_ver(??)\nplistlib.Data(??)\nplistlib.Dict\nplistlib.DumbXMLWriter(??)\nplistlib.PLISTHEADER\nplistlib.Plist\nplistlib.PlistParser(??)\nplistlib.PlistWriter(??)\nplistlib.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nplistlib.binascii\nplistlib.datetime\nplistlib.re\nplistlib.readPlist(??)\nplistlib.readPlistFromResource(??)\nplistlib.readPlistFromString(??)\nplistlib.warnings\nplistlib.writePlist(??)\nplistlib.writePlistToResource(??)\nplistlib.writePlistToString(??)\npopen2.MAXFD\npopen2.Popen3(??)\npopen2.Popen4(??)\npopen2.os\npopen2.popen2(??)\npopen2.popen3(??)\npopen2.popen4(??)\npopen2.sys\npopen2.warnings\npoplib.CR\npoplib.CRLF\npoplib.LF\npoplib.POP3(??)\npoplib.POP3_PORT\npoplib.POP3_SSL(??)\npoplib.POP3_SSL_PORT\npoplib.error_proto\npoplib.re\npoplib.socket\npoplib.ssl\nposix.EX_CANTCREAT\nposix.EX_CONFIG\nposix.EX_DATAERR\nposix.EX_IOERR\nposix.EX_NOHOST\nposix.EX_NOINPUT\nposix.EX_NOPERM\nposix.EX_NOUSER\nposix.EX_OK\nposix.EX_OSERR\nposix.EX_OSFILE\nposix.EX_PROTOCOL\nposix.EX_SOFTWARE\nposix.EX_TEMPFAIL\nposix.EX_UNAVAILABLE\nposix.EX_USAGE\nposix.F_OK\nposix.NGROUPS_MAX\nposix.O_APPEND\nposix.O_ASYNC\nposix.O_CREAT\nposix.O_DIRECT\nposix.O_DIRECTORY\nposix.O_DSYNC\nposix.O_EXCL\nposix.O_LARGEFILE\nposix.O_NDELAY\nposix.O_NOATIME\nposix.O_NOCTTY\nposix.O_NOFOLLOW\nposix.O_NONBLOCK\nposix.O_RDONLY\nposix.O_RDWR\nposix.O_RSYNC\nposix.O_SYNC\nposix.O_TRUNC\nposix.O_WRONLY\nposix.R_OK\nposix.TMP_MAX\nposix.WCONTINUED\nposix.WCOREDUMP(status) -> bool\nposix.WEXITSTATUS(status) -> integer\nposix.WIFCONTINUED(status) -> bool\nposix.WIFEXITED(status) -> bool\nposix.WIFSIGNALED(status) -> bool\nposix.WIFSTOPPED(status) -> bool\nposix.WNOHANG\nposix.WSTOPSIG(status) -> integer\nposix.WTERMSIG(status) -> integer\nposix.WUNTRACED\nposix.W_OK\nposix.X_OK\nposix.abort() -> does not return!\nposix.access(path, mode) -> True if granted, False otherwise\nposix.chdir(path)\nposix.chmod(path, mode)\nposix.chown(path, uid, gid)\nposix.chroot(path)\nposix.close(fd)\nposix.closerange(fd_low, fd_high)\nposix.confstr(name) -> string\nposix.confstr_names\nposix.ctermid() -> string\nposix.dup(fd) -> fd2\nposix.dup2(old_fd, new_fd)\nposix.environ\nposix.error\nposix.execv(path, args)\nposix.execve(path, args, env)\nposix.fchdir(fildes)\nposix.fchmod(fd, mode)\nposix.fchown(fd, uid, gid)\nposix.fdatasync(fildes)\nposix.fdopen(fd [, mode='r' [, bufsize]]) -> file_object\nposix.fork() -> pid\nposix.forkpty() -> (pid, master_fd)\nposix.fpathconf(fd, name) -> integer\nposix.fstat(fd) -> stat result\nposix.fstatvfs(fd) -> statvfs result\nposix.fsync(fildes)\nposix.ftruncate(fd, length)\nposix.getcwd() -> path\nposix.getcwdu() -> path\nposix.getegid() -> egid\nposix.geteuid() -> euid\nposix.getgid() -> gid\nposix.getgroups() -> list of group IDs\nposix.getloadavg() -> (float, float, float)\nposix.getlogin() -> string\nposix.getpgid(pid) -> pgid\nposix.getpgrp() -> pgrp\nposix.getpid() -> pid\nposix.getppid() -> ppid\nposix.getsid(pid) -> sid\nposix.getuid() -> uid\nposix.isatty(fd) -> bool\nposix.kill(pid, sig)\nposix.killpg(pgid, sig)\nposix.lchown(path, uid, gid)\nposix.link(src, dst)\nposix.listdir(path) -> list_of_strings\nposix.lseek(fd, pos, how) -> newpos\nposix.lstat(path) -> stat result\nposix.major(device) -> major number\nposix.makedev(major, minor) -> device number\nposix.minor(device) -> minor number\nposix.mkdir(path [, mode=0777])\nposix.mkfifo(filename [, mode=0666])\nposix.mknod(filename [, mode=0600, device])\nposix.nice(inc) -> new_priority\nposix.open(filename, flag [, mode=0777]) -> fd\nposix.openpty() -> (master_fd, slave_fd)\nposix.pathconf(path, name) -> integer\nposix.pathconf_names\nposix.pipe() -> (read_end, write_end)\nposix.popen(command [, mode='r' [, bufsize]]) -> pipe\nposix.putenv(key, value)\nposix.read(fd, buffersize) -> string\nposix.readlink(path) -> path\nposix.remove(path)\nposix.rename(old, new)\nposix.rmdir(path)\nposix.setegid(gid)\nposix.seteuid(uid)\nposix.setgid(gid)\nposix.setgroups(list)\nposix.setpgid(pid, pgrp)\nposix.setpgrp()\nposix.setregid(rgid, egid)\nposix.setreuid(ruid, euid)\nposix.setsid()\nposix.setuid(uid)\nposix.stat(path) -> stat result\nposix.stat_float_times([newval]) -> oldval\nposix.stat_result\nposix.statvfs(path) -> statvfs result\nposix.statvfs_result\nposix.strerror(code) -> string\nposix.symlink(src, dst)\nposix.sysconf(name) -> integer\nposix.sysconf_names\nposix.system(command) -> exit_status\nposix.tcgetpgrp(fd) -> pgid\nposix.tcsetpgrp(fd, pgid)\nposix.tempnam([dir[, prefix]]) -> string\nposix.times() -> (utime, stime, cutime, cstime, elapsed_time)\nposix.tmpfile() -> file object\nposix.tmpnam() -> string\nposix.ttyname(fd) -> string\nposix.umask(new_mask) -> old_mask\nposix.uname() -> (sysname, nodename, release, version, machine)\nposix.unlink(path)\nposix.unsetenv(key)\nposix.utime(path, (atime, mtime))\nposix.wait() -> (pid, status)\nposix.wait3(options) -> (pid, status, rusage)\nposix.wait4(pid, options) -> (pid, status, rusage)\nposix.waitpid(pid, options) -> (pid, status)\nposix.write(fd, string) -> byteswritten\nposixfile.SEEK_CUR\nposixfile.SEEK_END\nposixfile.SEEK_SET\nposixfile.fileopen(??)\nposixfile.open(??)\nposixfile.warnings\nposixpath.abspath(??)\nposixpath.altsep\nposixpath.basename(??)\nposixpath.commonprefix(??)\nposixpath.curdir\nposixpath.defpath\nposixpath.devnull\nposixpath.dirname(??)\nposixpath.exists(??)\nposixpath.expanduser(??)\nposixpath.expandvars(??)\nposixpath.extsep\nposixpath.genericpath\nposixpath.getatime(??)\nposixpath.getctime(??)\nposixpath.getmtime(??)\nposixpath.getsize(??)\nposixpath.isabs(??)\nposixpath.isdir(??)\nposixpath.isfile(??)\nposixpath.islink(??)\nposixpath.ismount(??)\nposixpath.join(??)\nposixpath.lexists(??)\nposixpath.normcase(??)\nposixpath.normpath(??)\nposixpath.os\nposixpath.pardir\nposixpath.pathsep\nposixpath.realpath(??)\nposixpath.relpath(??)\nposixpath.samefile(??)\nposixpath.sameopenfile(??)\nposixpath.samestat(??)\nposixpath.sep\nposixpath.split(??)\nposixpath.splitdrive(??)\nposixpath.splitext(??)\nposixpath.stat\nposixpath.supports_unicode_filenames\nposixpath.walk(??)\nposixpath.warnings\npow(x, y[, z]) -> number\npprint.PrettyPrinter(??)\npprint.isreadable(??)\npprint.isrecursive(??)\npprint.pformat(??)\npprint.pprint(??)\npprint.saferepr(??)\nprint\nprofile.OptionParser(??)\nprofile.Profile(??)\nprofile.Stats(??)\nprofile.help(??)\nprofile.main(??)\nprofile.marshal\nprofile.os\nprofile.resgetrusage(??)\nprofile.resource\nprofile.run(??)\nprofile.runctx(??)\nprofile.sys\nprofile.time\nproperty(fget=None, fset=None, fdel=None, doc=None) -> property attribute\npstats.CmpToKey(??)\npstats.Stats(??)\npstats.TupleComp(??)\npstats.add_callers(??)\npstats.add_func_stats(??)\npstats.count_calls(??)\npstats.f8(??)\npstats.func_get_function_name(??)\npstats.func_std_string(??)\npstats.func_strip_path(??)\npstats.marshal\npstats.os\npstats.re\npstats.sys\npstats.time\npty.CHILD\npty.STDERR_FILENO\npty.STDIN_FILENO\npty.STDOUT_FILENO\npty.fork() -> (pid, master_fd)\npty.master_open() -> (master_fd, slave_name)\npty.openpty() -> (master_fd, slave_fd)\npty.os\npty.select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\npty.slave_open(tty_name) -> slave_fd\npty.spawn(??)\npty.tty\npwd.getpwall() -> list_of_entries\npwd.getpwnam(name) -> (pw_name,pw_passwd,pw_uid,\npwd.getpwuid(uid) -> (pw_name,pw_passwd,pw_uid,\npwd.struct_passwd\npwd.struct_pwent\npy_compile.MAGIC\npy_compile.PyCompileError\npy_compile.compile(??)\npy_compile.imp\npy_compile.main(??)\npy_compile.marshal\npy_compile.os\npy_compile.set_creator_type(??)\npy_compile.sys\npy_compile.traceback\npy_compile.wr_long(??)\npyclbr.Class(??)\npyclbr.DEDENT\npyclbr.Function(??)\npyclbr.NAME\npyclbr.OP\npyclbr.imp\npyclbr.itemgetter(item, ...) --> itemgetter object\npyclbr.readmodule(??)\npyclbr.readmodule_ex(??)\npyclbr.sys\npyclbr.tokenize\npydoc.Doc(??)\npydoc.ErrorDuringImport\npydoc.HTMLDoc(??)\npydoc.HTMLRepr(??)\npydoc.Helper(??)\npydoc.ModuleScanner(??)\npydoc.Repr(??)\npydoc.Scanner(??)\npydoc.TextDoc(??)\npydoc.TextRepr(??)\npydoc.allmethods(??)\npydoc.apropos(??)\npydoc.classify_class_attrs(??)\npydoc.classname(??)\npydoc.cli(??)\npydoc.cram(??)\npydoc.deque(iterable[, maxlen]) --> deque object\npydoc.describe(??)\npydoc.doc(??)\npydoc.expandtabs(s [,tabsize]) -> string\npydoc.find(s, sub [,start [,end]]) -> in\npydoc.getdoc(??)\npydoc.getpager(??)\npydoc.gui(??)\npydoc.help\npydoc.html\npydoc.imp\npydoc.importfile(??)\npydoc.inspect\npydoc.isdata(??)\npydoc.ispackage(??)\npydoc.ispath(??)\npydoc.join(list [,sep]) -> string\npydoc.locate(??)\npydoc.lower(s) -> string\npydoc.os\npydoc.pager(??)\npydoc.pathdirs(??)\npydoc.pipepager(??)\npydoc.pkgutil\npydoc.plain(??)\npydoc.plainpager(??)\npydoc.re\npydoc.render_doc(??)\npydoc.replace(??)\npydoc.resolve(??)\npydoc.rfind(s, sub [,start [,end]]) -> int\npydoc.rstrip(s [,chars]) -> string\npydoc.safeimport(??)\npydoc.serve(??)\npydoc.source_synopsis(??)\npydoc.split(s [,sep [,maxsplit]]) -> list of strings\npydoc.splitdoc(??)\npydoc.strip(s [,chars]) -> string\npydoc.stripid(??)\npydoc.synopsis(??)\npydoc.sys\npydoc.tempfilepager(??)\npydoc.text\npydoc.ttypager(??)\npydoc.types\npydoc.visiblename(??)\npydoc.writedoc(??)\npydoc.writedocs(??)\npydoc_topics.topics\npyexpat.EXPAT_VERSION\npyexpat.ErrorString(errno) -> string\npyexpat.ExpatError\npyexpat.ParserCreate([encoding[, namespace_separator]]) -> parser\npyexpat.XMLParserType\npyexpat.XML_PARAM_ENTITY_PARSING_ALWAYS\npyexpat.XML_PARAM_ENTITY_PARSING_NEVER\npyexpat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE\npyexpat.error\npyexpat.errors\npyexpat.expat_CAPI\npyexpat.features\npyexpat.model\npyexpat.native_encoding\npyexpat.version_info\nquit\nquopri.EMPTYSTRING\nquopri.ESCAPE\nquopri.HEX\nquopri.MAXLINESIZE\nquopri.a2b_qp\nquopri.b2a_qp(data, quotetabs=0, istext=1, header=0) -> s;\nquopri.decode(??)\nquopri.decodestring(??)\nquopri.encode(??)\nquopri.encodestring(??)\nquopri.ishex(??)\nquopri.main(??)\nquopri.needsquoting(??)\nquopri.quote(??)\nquopri.unhex(??)\nrandom.BPF\nrandom.LOG4\nrandom.NV_MAGICCONST\nrandom.RECIP_BPF\nrandom.Random\nrandom.SG_MAGICCONST\nrandom.SystemRandom\nrandom.TWOPI\nrandom.WichmannHill\nrandom.betavariate\nrandom.choice\nrandom.division\nrandom.expovariate\nrandom.gammavariate\nrandom.gauss\nrandom.getrandbits(k) -> x.  Generates a long int with k random bits.\nrandom.getstate\nrandom.jumpahead(int) -> None.  Create new state from existing state and integer.\nrandom.lognormvariate\nrandom.normalvariate\nrandom.paretovariate\nrandom.randint\nrandom.random() -> x in the interval [0, 1).\nrandom.randrange\nrandom.sample\nrandom.seed\nrandom.setstate\nrandom.shuffle\nrandom.triangular\nrandom.uniform\nrandom.vonmisesvariate\nrandom.weibullvariate\nrange([start,] stop[, step]) -> list of integers\nraw_input([prompt]) -> string\nre.DEBUG\nre.DOTALL\nre.I\nre.IGNORECASE\nre.L\nre.LOCALE\nre.M\nre.MULTILINE\nre.S\nre.Scanner(??)\nre.T\nre.TEMPLATE\nre.U\nre.UNICODE\nre.VERBOSE\nre.X\nre.compile(??)\nre.copy_reg\nre.error\nre.escape(??)\nre.findall(??)\nre.finditer(??)\nre.match(??)\nre.purge(??)\nre.search(??)\nre.split(??)\nre.sre_compile\nre.sre_parse\nre.sub(??)\nre.subn(??)\nre.sys\nre.template(??)\nreduce(function, sequence[, initial]) -> value\nreload(module) -> module\nrepr(object) -> string\nrepr.Repr(??)\nrepr.aRepr\nrepr.islice(iterable, [start,] stop [, step]) --> islice object\nrepr.repr\nresource.RLIMIT_AS\nresource.RLIMIT_CORE\nresource.RLIMIT_CPU\nresource.RLIMIT_DATA\nresource.RLIMIT_FSIZE\nresource.RLIMIT_MEMLOCK\nresource.RLIMIT_NOFILE\nresource.RLIMIT_NPROC\nresource.RLIMIT_OFILE\nresource.RLIMIT_RSS\nresource.RLIMIT_STACK\nresource.RLIM_INFINITY\nresource.RUSAGE_CHILDREN\nresource.RUSAGE_SELF\nresource.error\nresource.getpagesize\nresource.getrlimit\nresource.getrusage\nresource.setrlimit\nresource.struct_rusage\nreversed(sequence) -> reverse iterator over values of the sequence\nrexec.FileBase(??)\nrexec.FileDelegate(??)\nrexec.FileWrapper(??)\nrexec.RExec(??)\nrexec.RHooks(??)\nrexec.RModuleImporter(??)\nrexec.RModuleLoader(??)\nrexec.TEMPLATE\nrexec.ihooks\nrexec.imp\nrexec.os\nrexec.sys\nrexec.test(??)\nrfc822.AddressList(??)\nrfc822.AddrlistClass(??)\nrfc822.Message(??)\nrfc822.dump_address_pair(??)\nrfc822.formatdate(??)\nrfc822.mktime_tz(??)\nrfc822.parseaddr(??)\nrfc822.parsedate(??)\nrfc822.parsedate_tz(??)\nrfc822.quote(??)\nrfc822.time\nrfc822.unquote(??)\nrfc822.warnpy3k(??)\nrlcompleter.Completer(??)\nrlcompleter.get_class_members(??)\nrobotparser.Entry(??)\nrobotparser.RobotFileParser(??)\nrobotparser.RuleLine(??)\nrobotparser.URLopener(??)\nrobotparser.urllib\nrobotparser.urlparse\nround(number[, ndigits]) -> floating point number\nrunpy.get_loader(??)\nrunpy.imp\nrunpy.run_module(??)\nrunpy.sys\nsched.Event(time, priority, action, argument)\nsched.heapq\nsched.namedtuple(??)\nsched.scheduler(??)\nselect.EPOLLERR\nselect.EPOLLET\nselect.EPOLLHUP\nselect.EPOLLIN\nselect.EPOLLMSG\nselect.EPOLLONESHOT\nselect.EPOLLOUT\nselect.EPOLLPRI\nselect.EPOLLRDBAND\nselect.EPOLLRDNORM\nselect.EPOLLWRBAND\nselect.EPOLLWRNORM\nselect.POLLERR\nselect.POLLHUP\nselect.POLLIN\nselect.POLLMSG\nselect.POLLNVAL\nselect.POLLOUT\nselect.POLLPRI\nselect.POLLRDBAND\nselect.POLLRDNORM\nselect.POLLWRBAND\nselect.POLLWRNORM\nselect.epoll\nselect.error\nselect.poll\nselect.select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\nset(iterable) --> set object\nsetattr(object, name, value)\nsets.BaseSet\nsets.ImmutableSet\nsets.Set\nsets.generators\nsets.ifilter(function or None, sequence) --> ifilter object\nsets.ifilterfalse(function or None, sequence) --> ifilterfalse object\nsets.warnings\nsgmllib.SGMLParseError\nsgmllib.SGMLParser(??)\nsgmllib.TestSGMLParser(??)\nsgmllib.attrfind\nsgmllib.charref\nsgmllib.endbracket\nsgmllib.entityref\nsgmllib.incomplete\nsgmllib.interesting\nsgmllib.markupbase\nsgmllib.piclose\nsgmllib.re\nsgmllib.shorttag\nsgmllib.shorttagopen\nsgmllib.starttagopen\nsgmllib.tagfind\nsgmllib.test(??)\nsha.blocksize\nsha.digest_size\nsha.digestsize\nsha.new\nsha.sha\nsha.warnings\nshelve.BsdDbShelf(??)\nshelve.DbfilenameShelf(??)\nshelve.Pickler(file, protocol=0) -- Create a pickler.\nshelve.Shelf(??)\nshelve.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nshelve.Unpickler(file) -- Create an unpickler.\nshelve.UserDict\nshelve.open(??)\nshlex.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nshlex.deque(iterable[, maxlen]) --> deque object\nshlex.os\nshlex.shlex(??)\nshlex.split(??)\nshlex.sys\nshutil.Error\nshutil.WindowsError\nshutil.abspath(??)\nshutil.copy(??)\nshutil.copy2(??)\nshutil.copyfile(??)\nshutil.copyfileobj(??)\nshutil.copymode(??)\nshutil.copystat(??)\nshutil.copytree(??)\nshutil.destinsrc(??)\nshutil.fnmatch\nshutil.ignore_patterns(??)\nshutil.move(??)\nshutil.os\nshutil.rmtree(??)\nshutil.stat\nshutil.sys\nsignal.ITIMER_PROF\nsignal.ITIMER_REAL\nsignal.ITIMER_VIRTUAL\nsignal.ItimerError\nsignal.NSIG\nsignal.SIGABRT\nsignal.SIGALRM\nsignal.SIGBUS\nsignal.SIGCHLD\nsignal.SIGCLD\nsignal.SIGCONT\nsignal.SIGFPE\nsignal.SIGHUP\nsignal.SIGILL\nsignal.SIGINT\nsignal.SIGIO\nsignal.SIGIOT\nsignal.SIGKILL\nsignal.SIGPIPE\nsignal.SIGPOLL\nsignal.SIGPROF\nsignal.SIGPWR\nsignal.SIGQUIT\nsignal.SIGRTMAX\nsignal.SIGRTMIN\nsignal.SIGSEGV\nsignal.SIGSTOP\nsignal.SIGSYS\nsignal.SIGTERM\nsignal.SIGTRAP\nsignal.SIGTSTP\nsignal.SIGTTIN\nsignal.SIGTTOU\nsignal.SIGURG\nsignal.SIGUSR1\nsignal.SIGUSR2\nsignal.SIGVTALRM\nsignal.SIGWINCH\nsignal.SIGXCPU\nsignal.SIGXFSZ\nsignal.SIG_DFL\nsignal.SIG_IGN\nsignal.alarm(seconds)\nsignal.default_int_handler(...)\nsignal.getitimer(which)\nsignal.getsignal(sig) -> action\nsignal.pause()\nsignal.set_wakeup_fd(fd) -> fd\nsignal.setitimer(which, seconds[, interval])\nsignal.siginterrupt(sig, flag) -> None\nsignal.signal(sig, action) -> action\nsite.ENABLE_USER_SITE\nsite.PREFIXES\nsite.USER_BASE\nsite.USER_SITE\nsite.abs__file__(??)\nsite.addbuilddir(??)\nsite.addpackage(??)\nsite.addsitedir(??)\nsite.addsitepackages(??)\nsite.addusersitepackages(??)\nsite.aliasmbcs(??)\nsite.check_enableusersite(??)\nsite.execsitecustomize(??)\nsite.execusercustomize(??)\nsite.main(??)\nsite.makepath(??)\nsite.os\nsite.removeduppaths(??)\nsite.setBEGINLIBPATH(??)\nsite.setcopyright(??)\nsite.setencoding(??)\nsite.sethelper(??)\nsite.setquit(??)\nsite.sys\nslice([start,] stop[, step])\nsmtpd.COMMASPACE\nsmtpd.DEBUGSTREAM\nsmtpd.DebuggingServer(??)\nsmtpd.Devnull(??)\nsmtpd.EMPTYSTRING\nsmtpd.MailmanProxy(??)\nsmtpd.NEWLINE\nsmtpd.Options(??)\nsmtpd.PureProxy(??)\nsmtpd.SMTPChannel(??)\nsmtpd.SMTPServer(??)\nsmtpd.asynchat\nsmtpd.asyncore\nsmtpd.errno\nsmtpd.getopt\nsmtpd.os\nsmtpd.parseargs(??)\nsmtpd.program\nsmtpd.socket\nsmtpd.sys\nsmtpd.time\nsmtpd.usage(??)\nsmtplib.CRLF\nsmtplib.LMTP(??)\nsmtplib.LMTP_PORT\nsmtplib.OLDSTYLE_AUTH\nsmtplib.SMTP(??)\nsmtplib.SMTPAuthenticationError\nsmtplib.SMTPConnectError\nsmtplib.SMTPDataError\nsmtplib.SMTPException\nsmtplib.SMTPHeloError\nsmtplib.SMTPRecipientsRefused\nsmtplib.SMTPResponseException\nsmtplib.SMTPSenderRefused\nsmtplib.SMTPServerDisconnected\nsmtplib.SMTP_PORT\nsmtplib.SMTP_SSL(??)\nsmtplib.SMTP_SSL_PORT\nsmtplib.SSLFakeFile(??)\nsmtplib.base64\nsmtplib.email\nsmtplib.encode_base64(??)\nsmtplib.hmac\nsmtplib.quoteaddr(??)\nsmtplib.quotedata(??)\nsmtplib.re\nsmtplib.socket\nsmtplib.ssl\nsmtplib.stderr\nsndhdr.get_long_be(??)\nsndhdr.get_long_le(??)\nsndhdr.get_short_be(??)\nsndhdr.get_short_le(??)\nsndhdr.test(??)\nsndhdr.test_8svx(??)\nsndhdr.test_aifc(??)\nsndhdr.test_au(??)\nsndhdr.test_hcom(??)\nsndhdr.test_sndr(??)\nsndhdr.test_sndt(??)\nsndhdr.test_voc(??)\nsndhdr.test_wav(??)\nsndhdr.testall(??)\nsndhdr.tests\nsndhdr.what(??)\nsndhdr.whathdr(??)\nsocket.AF_APPLETALK\nsocket.AF_ASH\nsocket.AF_ATMPVC\nsocket.AF_ATMSVC\nsocket.AF_AX25\nsocket.AF_BRIDGE\nsocket.AF_DECnet\nsocket.AF_ECONET\nsocket.AF_INET\nsocket.AF_INET6\nsocket.AF_IPX\nsocket.AF_IRDA\nsocket.AF_KEY\nsocket.AF_NETBEUI\nsocket.AF_NETLINK\nsocket.AF_NETROM\nsocket.AF_PACKET\nsocket.AF_PPPOX\nsocket.AF_ROSE\nsocket.AF_ROUTE\nsocket.AF_SECURITY\nsocket.AF_SNA\nsocket.AF_TIPC\nsocket.AF_UNIX\nsocket.AF_UNSPEC\nsocket.AF_WANPIPE\nsocket.AF_X25\nsocket.AI_ADDRCONFIG\nsocket.AI_ALL\nsocket.AI_CANONNAME\nsocket.AI_NUMERICHOST\nsocket.AI_NUMERICSERV\nsocket.AI_PASSIVE\nsocket.AI_V4MAPPED\nsocket.CAPI\nsocket.EAI_ADDRFAMILY\nsocket.EAI_AGAIN\nsocket.EAI_BADFLAGS\nsocket.EAI_FAIL\nsocket.EAI_FAMILY\nsocket.EAI_MEMORY\nsocket.EAI_NODATA\nsocket.EAI_NONAME\nsocket.EAI_OVERFLOW\nsocket.EAI_SERVICE\nsocket.EAI_SOCKTYPE\nsocket.EAI_SYSTEM\nsocket.EBADF\nsocket.INADDR_ALLHOSTS_GROUP\nsocket.INADDR_ANY\nsocket.INADDR_BROADCAST\nsocket.INADDR_LOOPBACK\nsocket.INADDR_MAX_LOCAL_GROUP\nsocket.INADDR_NONE\nsocket.INADDR_UNSPEC_GROUP\nsocket.IPPORT_RESERVED\nsocket.IPPORT_USERRESERVED\nsocket.IPPROTO_AH\nsocket.IPPROTO_DSTOPTS\nsocket.IPPROTO_EGP\nsocket.IPPROTO_ESP\nsocket.IPPROTO_FRAGMENT\nsocket.IPPROTO_GRE\nsocket.IPPROTO_HOPOPTS\nsocket.IPPROTO_ICMP\nsocket.IPPROTO_ICMPV6\nsocket.IPPROTO_IDP\nsocket.IPPROTO_IGMP\nsocket.IPPROTO_IP\nsocket.IPPROTO_IPIP\nsocket.IPPROTO_IPV6\nsocket.IPPROTO_NONE\nsocket.IPPROTO_PIM\nsocket.IPPROTO_PUP\nsocket.IPPROTO_RAW\nsocket.IPPROTO_ROUTING\nsocket.IPPROTO_RSVP\nsocket.IPPROTO_TCP\nsocket.IPPROTO_TP\nsocket.IPPROTO_UDP\nsocket.IPV6_CHECKSUM\nsocket.IPV6_DSTOPTS\nsocket.IPV6_HOPLIMIT\nsocket.IPV6_HOPOPTS\nsocket.IPV6_JOIN_GROUP\nsocket.IPV6_LEAVE_GROUP\nsocket.IPV6_MULTICAST_HOPS\nsocket.IPV6_MULTICAST_IF\nsocket.IPV6_MULTICAST_LOOP\nsocket.IPV6_NEXTHOP\nsocket.IPV6_PKTINFO\nsocket.IPV6_RECVDSTOPTS\nsocket.IPV6_RECVHOPLIMIT\nsocket.IPV6_RECVHOPOPTS\nsocket.IPV6_RECVPKTINFO\nsocket.IPV6_RECVRTHDR\nsocket.IPV6_RECVTCLASS\nsocket.IPV6_RTHDR\nsocket.IPV6_RTHDRDSTOPTS\nsocket.IPV6_RTHDR_TYPE_0\nsocket.IPV6_TCLASS\nsocket.IPV6_UNICAST_HOPS\nsocket.IPV6_V6ONLY\nsocket.IP_ADD_MEMBERSHIP\nsocket.IP_DEFAULT_MULTICAST_LOOP\nsocket.IP_DEFAULT_MULTICAST_TTL\nsocket.IP_DROP_MEMBERSHIP\nsocket.IP_HDRINCL\nsocket.IP_MAX_MEMBERSHIPS\nsocket.IP_MULTICAST_IF\nsocket.IP_MULTICAST_LOOP\nsocket.IP_MULTICAST_TTL\nsocket.IP_OPTIONS\nsocket.IP_RECVOPTS\nsocket.IP_RECVRETOPTS\nsocket.IP_RETOPTS\nsocket.IP_TOS\nsocket.IP_TTL\nsocket.MSG_CTRUNC\nsocket.MSG_DONTROUTE\nsocket.MSG_DONTWAIT\nsocket.MSG_EOR\nsocket.MSG_OOB\nsocket.MSG_PEEK\nsocket.MSG_TRUNC\nsocket.MSG_WAITALL\nsocket.NETLINK_DNRTMSG\nsocket.NETLINK_FIREWALL\nsocket.NETLINK_IP6_FW\nsocket.NETLINK_NFLOG\nsocket.NETLINK_ROUTE\nsocket.NETLINK_USERSOCK\nsocket.NETLINK_XFRM\nsocket.NI_DGRAM\nsocket.NI_MAXHOST\nsocket.NI_MAXSERV\nsocket.NI_NAMEREQD\nsocket.NI_NOFQDN\nsocket.NI_NUMERICHOST\nsocket.NI_NUMERICSERV\nsocket.PACKET_BROADCAST\nsocket.PACKET_FASTROUTE\nsocket.PACKET_HOST\nsocket.PACKET_LOOPBACK\nsocket.PACKET_MULTICAST\nsocket.PACKET_OTHERHOST\nsocket.PACKET_OUTGOING\nsocket.PF_PACKET\nsocket.RAND_add(string, entropy)\nsocket.RAND_egd(path) -> bytes\nsocket.RAND_status() -> 0 or 1\nsocket.SHUT_RD\nsocket.SHUT_RDWR\nsocket.SHUT_WR\nsocket.SOCK_DGRAM\nsocket.SOCK_RAW\nsocket.SOCK_RDM\nsocket.SOCK_SEQPACKET\nsocket.SOCK_STREAM\nsocket.SOL_IP\nsocket.SOL_SOCKET\nsocket.SOL_TCP\nsocket.SOL_TIPC\nsocket.SOL_UDP\nsocket.SOMAXCONN\nsocket.SO_ACCEPTCONN\nsocket.SO_BROADCAST\nsocket.SO_DEBUG\nsocket.SO_DONTROUTE\nsocket.SO_ERROR\nsocket.SO_KEEPALIVE\nsocket.SO_LINGER\nsocket.SO_OOBINLINE\nsocket.SO_RCVBUF\nsocket.SO_RCVLOWAT\nsocket.SO_RCVTIMEO\nsocket.SO_REUSEADDR\nsocket.SO_SNDBUF\nsocket.SO_SNDLOWAT\nsocket.SO_SNDTIMEO\nsocket.SO_TYPE\nsocket.SSL_ERROR_EOF\nsocket.SSL_ERROR_INVALID_ERROR_CODE\nsocket.SSL_ERROR_SSL\nsocket.SSL_ERROR_SYSCALL\nsocket.SSL_ERROR_WANT_CONNECT\nsocket.SSL_ERROR_WANT_READ\nsocket.SSL_ERROR_WANT_WRITE\nsocket.SSL_ERROR_WANT_X509_LOOKUP\nsocket.SSL_ERROR_ZERO_RETURN\nsocket.SocketType\nsocket.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nsocket.TCP_CORK\nsocket.TCP_DEFER_ACCEPT\nsocket.TCP_INFO\nsocket.TCP_KEEPCNT\nsocket.TCP_KEEPIDLE\nsocket.TCP_KEEPINTVL\nsocket.TCP_LINGER2\nsocket.TCP_MAXSEG\nsocket.TCP_NODELAY\nsocket.TCP_QUICKACK\nsocket.TCP_SYNCNT\nsocket.TCP_WINDOW_CLAMP\nsocket.TIPC_ADDR_ID\nsocket.TIPC_ADDR_NAME\nsocket.TIPC_ADDR_NAMESEQ\nsocket.TIPC_CFG_SRV\nsocket.TIPC_CLUSTER_SCOPE\nsocket.TIPC_CONN_TIMEOUT\nsocket.TIPC_CRITICAL_IMPORTANCE\nsocket.TIPC_DEST_DROPPABLE\nsocket.TIPC_HIGH_IMPORTANCE\nsocket.TIPC_IMPORTANCE\nsocket.TIPC_LOW_IMPORTANCE\nsocket.TIPC_MEDIUM_IMPORTANCE\nsocket.TIPC_NODE_SCOPE\nsocket.TIPC_PUBLISHED\nsocket.TIPC_SRC_DROPPABLE\nsocket.TIPC_SUBSCR_TIMEOUT\nsocket.TIPC_SUB_CANCEL\nsocket.TIPC_SUB_PORTS\nsocket.TIPC_SUB_SERVICE\nsocket.TIPC_TOP_SRV\nsocket.TIPC_WAIT_FOREVER\nsocket.TIPC_WITHDRAWN\nsocket.TIPC_ZONE_SCOPE\nsocket.create_connection(??)\nsocket.error\nsocket.fromfd(fd, family, type[, proto]) -> socket object\nsocket.gaierror\nsocket.getaddrinfo(host, port [, family, socktype, proto, flags])\nsocket.getdefaulttimeout() -> timeout\nsocket.getfqdn(??)\nsocket.gethostbyaddr(host) -> (name, aliaslist, addresslist)\nsocket.gethostbyname(host) -> address\nsocket.gethostbyname_ex(host) -> (name, aliaslist, addresslist)\nsocket.gethostname() -> string\nsocket.getnameinfo(sockaddr, flags) --> (host, port)\nsocket.getprotobyname(name) -> integer\nsocket.getservbyname(servicename[, protocolname]) -> integer\nsocket.getservbyport(port[, protocolname]) -> string\nsocket.has_ipv6\nsocket.herror\nsocket.htonl(integer) -> integer\nsocket.htons(integer) -> integer\nsocket.inet_aton(string) -> packed 32-bit IP representation\nsocket.inet_ntoa(packed_ip) -> ip_address_string\nsocket.inet_ntop(af, packed_ip) -> string formatted IP address\nsocket.inet_pton(af, ip) -> packed IP address string\nsocket.ntohl(integer) -> integer\nsocket.ntohs(integer) -> integer\nsocket.os\nsocket.setdefaulttimeout(timeout)\nsocket.socket([family[, type[, proto]]]) -> socket object\nsocket.socketpair([family[, type[, proto]]]) -> (socket object, socket object)\nsocket.ssl(??)\nsocket.sslerror\nsocket.sys\nsocket.timeout\nsocket.warnings\nsorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list\nspwd.getspall() -> list_of_entries\nspwd.getspnam(name) -> (sp_namp, sp_pwdp, sp_lstchg, sp_min, sp_max,\nspwd.struct_spwd\nsqlite3.Binary\nsqlite3.Cache\nsqlite3.Connection\nsqlite3.Cursor\nsqlite3.DataError\nsqlite3.DatabaseError\nsqlite3.Date\nsqlite3.DateFromTicks(??)\nsqlite3.Error\nsqlite3.IntegrityError\nsqlite3.InterfaceError\nsqlite3.InternalError\nsqlite3.NotSupportedError\nsqlite3.OperationalError\nsqlite3.OptimizedUnicode\nsqlite3.PARSE_COLNAMES\nsqlite3.PARSE_DECLTYPES\nsqlite3.PrepareProtocol\nsqlite3.ProgrammingError\nsqlite3.Row\nsqlite3.SQLITE_ALTER_TABLE\nsqlite3.SQLITE_ANALYZE\nsqlite3.SQLITE_ATTACH\nsqlite3.SQLITE_CREATE_INDEX\nsqlite3.SQLITE_CREATE_TABLE\nsqlite3.SQLITE_CREATE_TEMP_INDEX\nsqlite3.SQLITE_CREATE_TEMP_TABLE\nsqlite3.SQLITE_CREATE_TEMP_TRIGGER\nsqlite3.SQLITE_CREATE_TEMP_VIEW\nsqlite3.SQLITE_CREATE_TRIGGER\nsqlite3.SQLITE_CREATE_VIEW\nsqlite3.SQLITE_DELETE\nsqlite3.SQLITE_DENY\nsqlite3.SQLITE_DETACH\nsqlite3.SQLITE_DROP_INDEX\nsqlite3.SQLITE_DROP_TABLE\nsqlite3.SQLITE_DROP_TEMP_INDEX\nsqlite3.SQLITE_DROP_TEMP_TABLE\nsqlite3.SQLITE_DROP_TEMP_TRIGGER\nsqlite3.SQLITE_DROP_TEMP_VIEW\nsqlite3.SQLITE_DROP_TRIGGER\nsqlite3.SQLITE_DROP_VIEW\nsqlite3.SQLITE_IGNORE\nsqlite3.SQLITE_INSERT\nsqlite3.SQLITE_OK\nsqlite3.SQLITE_PRAGMA\nsqlite3.SQLITE_READ\nsqlite3.SQLITE_REINDEX\nsqlite3.SQLITE_SELECT\nsqlite3.SQLITE_TRANSACTION\nsqlite3.SQLITE_UPDATE\nsqlite3.Statement\nsqlite3.Time\nsqlite3.TimeFromTicks(??)\nsqlite3.Timestamp\nsqlite3.TimestampFromTicks(??)\nsqlite3.Warning\nsqlite3.adapt(obj, protocol, alternate) -> adapt obj to given protocol. Non-standard.\nsqlite3.adapters\nsqlite3.apilevel\nsqlite3.complete_statement(sql)\nsqlite3.connect(database[, timeout, isolation_level, detect_types, factory])\nsqlite3.converters\nsqlite3.datetime\nsqlite3.dbapi2\nsqlite3.dbapi2.Binary\nsqlite3.dbapi2.Cache\nsqlite3.dbapi2.Connection\nsqlite3.dbapi2.Cursor\nsqlite3.dbapi2.DataError\nsqlite3.dbapi2.DatabaseError\nsqlite3.dbapi2.Date\nsqlite3.dbapi2.DateFromTicks(??)\nsqlite3.dbapi2.Error\nsqlite3.dbapi2.IntegrityError\nsqlite3.dbapi2.InterfaceError\nsqlite3.dbapi2.InternalError\nsqlite3.dbapi2.NotSupportedError\nsqlite3.dbapi2.OperationalError\nsqlite3.dbapi2.OptimizedUnicode\nsqlite3.dbapi2.PARSE_COLNAMES\nsqlite3.dbapi2.PARSE_DECLTYPES\nsqlite3.dbapi2.PrepareProtocol\nsqlite3.dbapi2.ProgrammingError\nsqlite3.dbapi2.Row\nsqlite3.dbapi2.SQLITE_ALTER_TABLE\nsqlite3.dbapi2.SQLITE_ANALYZE\nsqlite3.dbapi2.SQLITE_ATTACH\nsqlite3.dbapi2.SQLITE_CREATE_INDEX\nsqlite3.dbapi2.SQLITE_CREATE_TABLE\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_INDEX\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_TABLE\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_TRIGGER\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_VIEW\nsqlite3.dbapi2.SQLITE_CREATE_TRIGGER\nsqlite3.dbapi2.SQLITE_CREATE_VIEW\nsqlite3.dbapi2.SQLITE_DELETE\nsqlite3.dbapi2.SQLITE_DENY\nsqlite3.dbapi2.SQLITE_DETACH\nsqlite3.dbapi2.SQLITE_DROP_INDEX\nsqlite3.dbapi2.SQLITE_DROP_TABLE\nsqlite3.dbapi2.SQLITE_DROP_TEMP_INDEX\nsqlite3.dbapi2.SQLITE_DROP_TEMP_TABLE\nsqlite3.dbapi2.SQLITE_DROP_TEMP_TRIGGER\nsqlite3.dbapi2.SQLITE_DROP_TEMP_VIEW\nsqlite3.dbapi2.SQLITE_DROP_TRIGGER\nsqlite3.dbapi2.SQLITE_DROP_VIEW\nsqlite3.dbapi2.SQLITE_IGNORE\nsqlite3.dbapi2.SQLITE_INSERT\nsqlite3.dbapi2.SQLITE_OK\nsqlite3.dbapi2.SQLITE_PRAGMA\nsqlite3.dbapi2.SQLITE_READ\nsqlite3.dbapi2.SQLITE_REINDEX\nsqlite3.dbapi2.SQLITE_SELECT\nsqlite3.dbapi2.SQLITE_TRANSACTION\nsqlite3.dbapi2.SQLITE_UPDATE\nsqlite3.dbapi2.Statement\nsqlite3.dbapi2.Time\nsqlite3.dbapi2.TimeFromTicks(??)\nsqlite3.dbapi2.Timestamp\nsqlite3.dbapi2.TimestampFromTicks(??)\nsqlite3.dbapi2.Warning\nsqlite3.dbapi2.adapt(obj, protocol, alternate) -> adapt obj to given protocol. Non-standard.\nsqlite3.dbapi2.adapters\nsqlite3.dbapi2.apilevel\nsqlite3.dbapi2.complete_statement(sql)\nsqlite3.dbapi2.connect(database[, timeout, isolation_level, detect_types, factory])\nsqlite3.dbapi2.converters\nsqlite3.dbapi2.datetime\nsqlite3.dbapi2.enable_callback_tracebacks(flag)\nsqlite3.dbapi2.enable_shared_cache(do_enable)\nsqlite3.dbapi2.paramstyle\nsqlite3.dbapi2.register_adapter(type, callable)\nsqlite3.dbapi2.register_converter(typename, callable)\nsqlite3.dbapi2.sqlite_version\nsqlite3.dbapi2.sqlite_version_info\nsqlite3.dbapi2.threadsafety\nsqlite3.dbapi2.time\nsqlite3.dbapi2.version\nsqlite3.dbapi2.version_info\nsqlite3.dbapi2.x\nsqlite3.dump\nsqlite3.enable_callback_tracebacks(flag)\nsqlite3.enable_shared_cache(do_enable)\nsqlite3.paramstyle\nsqlite3.register_adapter(type, callable)\nsqlite3.register_converter(typename, callable)\nsqlite3.sqlite_version\nsqlite3.sqlite_version_info\nsqlite3.threadsafety\nsqlite3.time\nsqlite3.version\nsqlite3.version_info\nsqlite3.x\nsre.DOTALL\nsre.I\nsre.IGNORECASE\nsre.L\nsre.LOCALE\nsre.M\nsre.MULTILINE\nsre.S\nsre.U\nsre.UNICODE\nsre.VERBOSE\nsre.X\nsre.compile(??)\nsre.error\nsre.escape(??)\nsre.findall(??)\nsre.finditer(??)\nsre.match(??)\nsre.purge(??)\nsre.search(??)\nsre.split(??)\nsre.sub(??)\nsre.subn(??)\nsre.template(??)\nsre.warnings\nsre_compile.ANY\nsre_compile.ANY_ALL\nsre_compile.ASSERT\nsre_compile.ASSERT_NOT\nsre_compile.AT\nsre_compile.ATCODES\nsre_compile.AT_BEGINNING\nsre_compile.AT_BEGINNING_LINE\nsre_compile.AT_BEGINNING_STRING\nsre_compile.AT_BOUNDARY\nsre_compile.AT_END\nsre_compile.AT_END_LINE\nsre_compile.AT_END_STRING\nsre_compile.AT_LOCALE\nsre_compile.AT_LOC_BOUNDARY\nsre_compile.AT_LOC_NON_BOUNDARY\nsre_compile.AT_MULTILINE\nsre_compile.AT_NON_BOUNDARY\nsre_compile.AT_UNICODE\nsre_compile.AT_UNI_BOUNDARY\nsre_compile.AT_UNI_NON_BOUNDARY\nsre_compile.BIGCHARSET\nsre_compile.BRANCH\nsre_compile.CALL\nsre_compile.CATEGORY\nsre_compile.CATEGORY_DIGIT\nsre_compile.CATEGORY_LINEBREAK\nsre_compile.CATEGORY_LOC_NOT_WORD\nsre_compile.CATEGORY_LOC_WORD\nsre_compile.CATEGORY_NOT_DIGIT\nsre_compile.CATEGORY_NOT_LINEBREAK\nsre_compile.CATEGORY_NOT_SPACE\nsre_compile.CATEGORY_NOT_WORD\nsre_compile.CATEGORY_SPACE\nsre_compile.CATEGORY_UNI_DIGIT\nsre_compile.CATEGORY_UNI_LINEBREAK\nsre_compile.CATEGORY_UNI_NOT_DIGIT\nsre_compile.CATEGORY_UNI_NOT_LINEBREAK\nsre_compile.CATEGORY_UNI_NOT_SPACE\nsre_compile.CATEGORY_UNI_NOT_WORD\nsre_compile.CATEGORY_UNI_SPACE\nsre_compile.CATEGORY_UNI_WORD\nsre_compile.CATEGORY_WORD\nsre_compile.CHARSET\nsre_compile.CHCODES\nsre_compile.CH_LOCALE\nsre_compile.CH_UNICODE\nsre_compile.FAILURE\nsre_compile.GROUPREF\nsre_compile.GROUPREF_EXISTS\nsre_compile.GROUPREF_IGNORE\nsre_compile.IN\nsre_compile.INFO\nsre_compile.IN_IGNORE\nsre_compile.JUMP\nsre_compile.LITERAL\nsre_compile.LITERAL_IGNORE\nsre_compile.MAGIC\nsre_compile.MARK\nsre_compile.MAXCODE\nsre_compile.MAXREPEAT\nsre_compile.MAX_REPEAT\nsre_compile.MAX_UNTIL\nsre_compile.MIN_REPEAT\nsre_compile.MIN_REPEAT_ONE\nsre_compile.MIN_UNTIL\nsre_compile.NEGATE\nsre_compile.NOT_LITERAL\nsre_compile.NOT_LITERAL_IGNORE\nsre_compile.OPCODES\nsre_compile.OP_IGNORE\nsre_compile.RANGE\nsre_compile.REPEAT\nsre_compile.REPEAT_ONE\nsre_compile.SRE_FLAG_DEBUG\nsre_compile.SRE_FLAG_DOTALL\nsre_compile.SRE_FLAG_IGNORECASE\nsre_compile.SRE_FLAG_LOCALE\nsre_compile.SRE_FLAG_MULTILINE\nsre_compile.SRE_FLAG_TEMPLATE\nsre_compile.SRE_FLAG_UNICODE\nsre_compile.SRE_FLAG_VERBOSE\nsre_compile.SRE_INFO_CHARSET\nsre_compile.SRE_INFO_LITERAL\nsre_compile.SRE_INFO_PREFIX\nsre_compile.STRING_TYPES\nsre_compile.SUBPATTERN\nsre_compile.SUCCESS\nsre_compile.compile(??)\nsre_compile.error\nsre_compile.isstring(??)\nsre_compile.makedict(??)\nsre_compile.set(??)\nsre_compile.sre_parse\nsre_compile.sys\nsre_constants.ANY\nsre_constants.ANY_ALL\nsre_constants.ASSERT\nsre_constants.ASSERT_NOT\nsre_constants.AT\nsre_constants.ATCODES\nsre_constants.AT_BEGINNING\nsre_constants.AT_BEGINNING_LINE\nsre_constants.AT_BEGINNING_STRING\nsre_constants.AT_BOUNDARY\nsre_constants.AT_END\nsre_constants.AT_END_LINE\nsre_constants.AT_END_STRING\nsre_constants.AT_LOCALE\nsre_constants.AT_LOC_BOUNDARY\nsre_constants.AT_LOC_NON_BOUNDARY\nsre_constants.AT_MULTILINE\nsre_constants.AT_NON_BOUNDARY\nsre_constants.AT_UNICODE\nsre_constants.AT_UNI_BOUNDARY\nsre_constants.AT_UNI_NON_BOUNDARY\nsre_constants.BIGCHARSET\nsre_constants.BRANCH\nsre_constants.CALL\nsre_constants.CATEGORY\nsre_constants.CATEGORY_DIGIT\nsre_constants.CATEGORY_LINEBREAK\nsre_constants.CATEGORY_LOC_NOT_WORD\nsre_constants.CATEGORY_LOC_WORD\nsre_constants.CATEGORY_NOT_DIGIT\nsre_constants.CATEGORY_NOT_LINEBREAK\nsre_constants.CATEGORY_NOT_SPACE\nsre_constants.CATEGORY_NOT_WORD\nsre_constants.CATEGORY_SPACE\nsre_constants.CATEGORY_UNI_DIGIT\nsre_constants.CATEGORY_UNI_LINEBREAK\nsre_constants.CATEGORY_UNI_NOT_DIGIT\nsre_constants.CATEGORY_UNI_NOT_LINEBREAK\nsre_constants.CATEGORY_UNI_NOT_SPACE\nsre_constants.CATEGORY_UNI_NOT_WORD\nsre_constants.CATEGORY_UNI_SPACE\nsre_constants.CATEGORY_UNI_WORD\nsre_constants.CATEGORY_WORD\nsre_constants.CHARSET\nsre_constants.CHCODES\nsre_constants.CH_LOCALE\nsre_constants.CH_UNICODE\nsre_constants.FAILURE\nsre_constants.GROUPREF\nsre_constants.GROUPREF_EXISTS\nsre_constants.GROUPREF_IGNORE\nsre_constants.IN\nsre_constants.INFO\nsre_constants.IN_IGNORE\nsre_constants.JUMP\nsre_constants.LITERAL\nsre_constants.LITERAL_IGNORE\nsre_constants.MAGIC\nsre_constants.MARK\nsre_constants.MAXREPEAT\nsre_constants.MAX_REPEAT\nsre_constants.MAX_UNTIL\nsre_constants.MIN_REPEAT\nsre_constants.MIN_REPEAT_ONE\nsre_constants.MIN_UNTIL\nsre_constants.NEGATE\nsre_constants.NOT_LITERAL\nsre_constants.NOT_LITERAL_IGNORE\nsre_constants.OPCODES\nsre_constants.OP_IGNORE\nsre_constants.RANGE\nsre_constants.REPEAT\nsre_constants.REPEAT_ONE\nsre_constants.SRE_FLAG_DEBUG\nsre_constants.SRE_FLAG_DOTALL\nsre_constants.SRE_FLAG_IGNORECASE\nsre_constants.SRE_FLAG_LOCALE\nsre_constants.SRE_FLAG_MULTILINE\nsre_constants.SRE_FLAG_TEMPLATE\nsre_constants.SRE_FLAG_UNICODE\nsre_constants.SRE_FLAG_VERBOSE\nsre_constants.SRE_INFO_CHARSET\nsre_constants.SRE_INFO_LITERAL\nsre_constants.SRE_INFO_PREFIX\nsre_constants.SUBPATTERN\nsre_constants.SUCCESS\nsre_constants.error\nsre_constants.makedict(??)\nsre_parse.ANY\nsre_parse.ANY_ALL\nsre_parse.ASSERT\nsre_parse.ASSERT_NOT\nsre_parse.AT\nsre_parse.ATCODES\nsre_parse.AT_BEGINNING\nsre_parse.AT_BEGINNING_LINE\nsre_parse.AT_BEGINNING_STRING\nsre_parse.AT_BOUNDARY\nsre_parse.AT_END\nsre_parse.AT_END_LINE\nsre_parse.AT_END_STRING\nsre_parse.AT_LOCALE\nsre_parse.AT_LOC_BOUNDARY\nsre_parse.AT_LOC_NON_BOUNDARY\nsre_parse.AT_MULTILINE\nsre_parse.AT_NON_BOUNDARY\nsre_parse.AT_UNICODE\nsre_parse.AT_UNI_BOUNDARY\nsre_parse.AT_UNI_NON_BOUNDARY\nsre_parse.BIGCHARSET\nsre_parse.BRANCH\nsre_parse.CALL\nsre_parse.CATEGORIES\nsre_parse.CATEGORY\nsre_parse.CATEGORY_DIGIT\nsre_parse.CATEGORY_LINEBREAK\nsre_parse.CATEGORY_LOC_NOT_WORD\nsre_parse.CATEGORY_LOC_WORD\nsre_parse.CATEGORY_NOT_DIGIT\nsre_parse.CATEGORY_NOT_LINEBREAK\nsre_parse.CATEGORY_NOT_SPACE\nsre_parse.CATEGORY_NOT_WORD\nsre_parse.CATEGORY_SPACE\nsre_parse.CATEGORY_UNI_DIGIT\nsre_parse.CATEGORY_UNI_LINEBREAK\nsre_parse.CATEGORY_UNI_NOT_DIGIT\nsre_parse.CATEGORY_UNI_NOT_LINEBREAK\nsre_parse.CATEGORY_UNI_NOT_SPACE\nsre_parse.CATEGORY_UNI_NOT_WORD\nsre_parse.CATEGORY_UNI_SPACE\nsre_parse.CATEGORY_UNI_WORD\nsre_parse.CATEGORY_WORD\nsre_parse.CHARSET\nsre_parse.CHCODES\nsre_parse.CH_LOCALE\nsre_parse.CH_UNICODE\nsre_parse.DIGITS\nsre_parse.ESCAPES\nsre_parse.FAILURE\nsre_parse.FLAGS\nsre_parse.GROUPREF\nsre_parse.GROUPREF_EXISTS\nsre_parse.GROUPREF_IGNORE\nsre_parse.HEXDIGITS\nsre_parse.IN\nsre_parse.INFO\nsre_parse.IN_IGNORE\nsre_parse.JUMP\nsre_parse.LITERAL\nsre_parse.LITERAL_IGNORE\nsre_parse.MAGIC\nsre_parse.MARK\nsre_parse.MAXREPEAT\nsre_parse.MAX_REPEAT\nsre_parse.MAX_UNTIL\nsre_parse.MIN_REPEAT\nsre_parse.MIN_REPEAT_ONE\nsre_parse.MIN_UNTIL\nsre_parse.NEGATE\nsre_parse.NOT_LITERAL\nsre_parse.NOT_LITERAL_IGNORE\nsre_parse.OCTDIGITS\nsre_parse.OPCODES\nsre_parse.OP_IGNORE\nsre_parse.Pattern(??)\nsre_parse.RANGE\nsre_parse.REPEAT\nsre_parse.REPEAT_CHARS\nsre_parse.REPEAT_ONE\nsre_parse.SPECIAL_CHARS\nsre_parse.SRE_FLAG_DEBUG\nsre_parse.SRE_FLAG_DOTALL\nsre_parse.SRE_FLAG_IGNORECASE\nsre_parse.SRE_FLAG_LOCALE\nsre_parse.SRE_FLAG_MULTILINE\nsre_parse.SRE_FLAG_TEMPLATE\nsre_parse.SRE_FLAG_UNICODE\nsre_parse.SRE_FLAG_VERBOSE\nsre_parse.SRE_INFO_CHARSET\nsre_parse.SRE_INFO_LITERAL\nsre_parse.SRE_INFO_PREFIX\nsre_parse.SUBPATTERN\nsre_parse.SUCCESS\nsre_parse.SubPattern(??)\nsre_parse.Tokenizer(??)\nsre_parse.WHITESPACE\nsre_parse.error\nsre_parse.expand_template(??)\nsre_parse.isdigit(??)\nsre_parse.isident(??)\nsre_parse.isname(??)\nsre_parse.makedict(??)\nsre_parse.parse(??)\nsre_parse.parse_template(??)\nsre_parse.set(??)\nsre_parse.sys\nssl.CERT_NONE\nssl.CERT_OPTIONAL\nssl.CERT_REQUIRED\nssl.DER_cert_to_PEM_cert(??)\nssl.PEM_FOOTER\nssl.PEM_HEADER\nssl.PEM_cert_to_DER_cert(??)\nssl.PROTOCOL_SSLv2\nssl.PROTOCOL_SSLv23\nssl.PROTOCOL_SSLv3\nssl.PROTOCOL_TLSv1\nssl.RAND_add(string, entropy)\nssl.RAND_egd(path) -> bytes\nssl.RAND_status() -> 0 or 1\nssl.SSLError\nssl.SSLSocket\nssl.SSL_ERROR_EOF\nssl.SSL_ERROR_INVALID_ERROR_CODE\nssl.SSL_ERROR_SSL\nssl.SSL_ERROR_SYSCALL\nssl.SSL_ERROR_WANT_CONNECT\nssl.SSL_ERROR_WANT_READ\nssl.SSL_ERROR_WANT_WRITE\nssl.SSL_ERROR_WANT_X509_LOOKUP\nssl.SSL_ERROR_ZERO_RETURN\nssl.base64\nssl.cert_time_to_seconds(??)\nssl.get_protocol_name(??)\nssl.get_server_certificate(??)\nssl.socket([family[, type[, proto]]]) -> socket object\nssl.sslwrap_simple(??)\nssl.textwrap\nssl.wrap_socket(??)\nstat.SF_APPEND\nstat.SF_ARCHIVED\nstat.SF_IMMUTABLE\nstat.SF_NOUNLINK\nstat.SF_SNAPSHOT\nstat.ST_ATIME\nstat.ST_CTIME\nstat.ST_DEV\nstat.ST_GID\nstat.ST_INO\nstat.ST_MODE\nstat.ST_MTIME\nstat.ST_NLINK\nstat.ST_SIZE\nstat.ST_UID\nstat.S_ENFMT\nstat.S_IEXEC\nstat.S_IFBLK\nstat.S_IFCHR\nstat.S_IFDIR\nstat.S_IFIFO\nstat.S_IFLNK\nstat.S_IFMT(??)\nstat.S_IFREG\nstat.S_IFSOCK\nstat.S_IMODE(??)\nstat.S_IREAD\nstat.S_IRGRP\nstat.S_IROTH\nstat.S_IRUSR\nstat.S_IRWXG\nstat.S_IRWXO\nstat.S_IRWXU\nstat.S_ISBLK(??)\nstat.S_ISCHR(??)\nstat.S_ISDIR(??)\nstat.S_ISFIFO(??)\nstat.S_ISGID\nstat.S_ISLNK(??)\nstat.S_ISREG(??)\nstat.S_ISSOCK(??)\nstat.S_ISUID\nstat.S_ISVTX\nstat.S_IWGRP\nstat.S_IWOTH\nstat.S_IWRITE\nstat.S_IWUSR\nstat.S_IXGRP\nstat.S_IXOTH\nstat.S_IXUSR\nstat.UF_APPEND\nstat.UF_IMMUTABLE\nstat.UF_NODUMP\nstat.UF_NOUNLINK\nstat.UF_OPAQUE\nstaticmethod(function) -> method\nstatvfs.F_BAVAIL\nstatvfs.F_BFREE\nstatvfs.F_BLOCKS\nstatvfs.F_BSIZE\nstatvfs.F_FAVAIL\nstatvfs.F_FFREE\nstatvfs.F_FILES\nstatvfs.F_FLAG\nstatvfs.F_FRSIZE\nstatvfs.F_NAMEMAX\nstr(object) -> string\nstring.Formatter\nstring.Template\nstring.ascii_letters\nstring.ascii_lowercase\nstring.ascii_uppercase\nstring.atof(s) -> float\nstring.atof_error\nstring.atoi(s [,base]) -> int\nstring.atoi_error\nstring.atol(s [,base]) -> long\nstring.atol_error\nstring.capitalize(s) -> string\nstring.capwords(s, [sep]) -> string\nstring.center(s, width[, fillchar]) -> string\nstring.count(s, sub[, start[,end]]) -> int\nstring.digits\nstring.expandtabs(s [,tabsize]) -> string\nstring.find(s, sub [,start [,end]]) -> in\nstring.hexdigits\nstring.index(s, sub [,start [,end]]) -> int\nstring.index_error\nstring.join(list [,sep]) -> string\nstring.joinfields(??)\nstring.letters\nstring.ljust(s, width[, fillchar]) -> string\nstring.lower(s) -> string\nstring.lowercase\nstring.lstrip(s [,chars]) -> string\nstring.maketrans(frm, to) -> string\nstring.octdigits\nstring.printable\nstring.punctuation\nstring.replace (str, old, new[, maxsplit]) -> string\nstring.rfind(s, sub [,start [,end]]) -> int\nstring.rindex(s, sub [,start [,end]]) -> int\nstring.rjust(s, width[, fillchar]) -> string\nstring.rsplit(s [,sep [,maxsplit]]) -> list of strings\nstring.rstrip(s [,chars]) -> string\nstring.split(s [,sep [,maxsplit]]) -> list of strings\nstring.splitfields(??)\nstring.strip(s [,chars]) -> string\nstring.swapcase(s) -> string\nstring.translate(s,table [,deletions]) -> string\nstring.upper(s) -> string\nstring.uppercase\nstring.whitespace\nstring.zfill(x, width) -> string\nstringold.atof(s) -> float\nstringold.atof_error\nstringold.atoi(s [,base]) -> int\nstringold.atoi_error\nstringold.atol(s [,base]) -> long\nstringold.atol_error\nstringold.capitalize(s) -> string\nstringold.capwords(s, [sep]) -> string\nstringold.center(s, width) -> string\nstringold.count(s, sub[, start[,end]]) -> int\nstringold.digits\nstringold.expandtabs(s [,tabsize]) -> string\nstringold.find(s, sub [,start [,end]]) -> in\nstringold.hexdigits\nstringold.index(s, sub [,start [,end]]) -> int\nstringold.index_error\nstringold.join(list [,sep]) -> string\nstringold.joinfields(??)\nstringold.letters\nstringold.ljust(s, width) -> string\nstringold.lower(s) -> string\nstringold.lowercase\nstringold.lstrip(s) -> string\nstringold.maketrans(frm, to) -> string\nstringold.octdigits\nstringold.replace (str, old, new[, maxsplit]) -> string\nstringold.rfind(s, sub [,start [,end]]) -> int\nstringold.rindex(s, sub [,start [,end]]) -> int\nstringold.rjust(s, width) -> string\nstringold.rstrip(s) -> string\nstringold.split(str [,sep [,maxsplit]]) -> list of strings\nstringold.splitfields(??)\nstringold.strip(s) -> string\nstringold.swapcase(s) -> string\nstringold.translate(s,table [,deletechars]) -> string\nstringold.upper(s) -> string\nstringold.uppercase\nstringold.whitespace\nstringold.zfill(x, width) -> string\nstringprep.b1_set\nstringprep.b3_exceptions\nstringprep.c22_specials\nstringprep.c6_set\nstringprep.c7_set\nstringprep.c8_set\nstringprep.c9_set\nstringprep.in_table_a1(??)\nstringprep.in_table_b1(??)\nstringprep.in_table_c11(??)\nstringprep.in_table_c11_c12(??)\nstringprep.in_table_c12(??)\nstringprep.in_table_c21(??)\nstringprep.in_table_c21_c22(??)\nstringprep.in_table_c22(??)\nstringprep.in_table_c3(??)\nstringprep.in_table_c4(??)\nstringprep.in_table_c5(??)\nstringprep.in_table_c6(??)\nstringprep.in_table_c7(??)\nstringprep.in_table_c8(??)\nstringprep.in_table_c9(??)\nstringprep.in_table_d1(??)\nstringprep.in_table_d2(??)\nstringprep.map_table_b2(??)\nstringprep.map_table_b3(??)\nstringprep.unicodedata\nstrop.atof(s) -> float\nstrop.atoi(s [,base]) -> int\nstrop.atol(s [,base]) -> long\nstrop.capitalize(s) -> string\nstrop.count(s, sub[, start[, end]]) -> int\nstrop.expandtabs(string, [tabsize]) -> string\nstrop.find(s, sub [,start [,end]]) -> in\nstrop.join(list [,sep]) -> string\nstrop.joinfields\nstrop.lower(s) -> string\nstrop.lowercase\nstrop.lstrip(s) -> string\nstrop.maketrans(frm, to) -> string\nstrop.replace (str, old, new[, maxsplit]) -> string\nstrop.rfind(s, sub [,start [,end]]) -> int\nstrop.rstrip(s) -> string\nstrop.split(s [,sep [,maxsplit]]) -> list of strings\nstrop.splitfields\nstrop.strip(s) -> string\nstrop.swapcase(s) -> string\nstrop.translate(s,table [,deletechars]) -> string\nstrop.upper(s) -> string\nstrop.uppercase\nstrop.whitespace\nstruct.Struct\nstruct.calcsize\nstruct.error\nstruct.pack\nstruct.pack_into\nstruct.unpack\nstruct.unpack_from\nsubprocess.CalledProcessError\nsubprocess.MAXFD\nsubprocess.PIPE\nsubprocess.Popen\nsubprocess.STDOUT\nsubprocess.call(??)\nsubprocess.check_call(??)\nsubprocess.errno\nsubprocess.fcntl\nsubprocess.gc\nsubprocess.list2cmdline(??)\nsubprocess.mswindows\nsubprocess.os\nsubprocess.pickle\nsubprocess.select\nsubprocess.signal\nsubprocess.sys\nsubprocess.traceback\nsubprocess.types\nsum(sequence[, start]) -> value\nsunau.AUDIO_FILE_ENCODING_ADPCM_G721\nsunau.AUDIO_FILE_ENCODING_ADPCM_G722\nsunau.AUDIO_FILE_ENCODING_ADPCM_G723_3\nsunau.AUDIO_FILE_ENCODING_ADPCM_G723_5\nsunau.AUDIO_FILE_ENCODING_ALAW_8\nsunau.AUDIO_FILE_ENCODING_DOUBLE\nsunau.AUDIO_FILE_ENCODING_FLOAT\nsunau.AUDIO_FILE_ENCODING_LINEAR_16\nsunau.AUDIO_FILE_ENCODING_LINEAR_24\nsunau.AUDIO_FILE_ENCODING_LINEAR_32\nsunau.AUDIO_FILE_ENCODING_LINEAR_8\nsunau.AUDIO_FILE_ENCODING_MULAW_8\nsunau.AUDIO_FILE_MAGIC\nsunau.AUDIO_UNKNOWN_SIZE\nsunau.Au_read(??)\nsunau.Au_write(??)\nsunau.Error\nsunau.open(??)\nsunau.openfp(??)\nsunaudio.MAGIC\nsunaudio.error\nsunaudio.get_long_be(??)\nsunaudio.gethdr(??)\nsunaudio.printhdr(??)\nsuper(type) -> unbound super object\nsymbol.and_expr\nsymbol.and_test\nsymbol.arglist\nsymbol.argument\nsymbol.arith_expr\nsymbol.assert_stmt\nsymbol.atom\nsymbol.augassign\nsymbol.break_stmt\nsymbol.classdef\nsymbol.comp_op\nsymbol.comparison\nsymbol.compound_stmt\nsymbol.continue_stmt\nsymbol.decorated\nsymbol.decorator\nsymbol.decorators\nsymbol.del_stmt\nsymbol.dictmaker\nsymbol.dotted_as_name\nsymbol.dotted_as_names\nsymbol.dotted_name\nsymbol.encoding_decl\nsymbol.eval_input\nsymbol.except_clause\nsymbol.exec_stmt\nsymbol.expr\nsymbol.expr_stmt\nsymbol.exprlist\nsymbol.factor\nsymbol.file_input\nsymbol.flow_stmt\nsymbol.for_stmt\nsymbol.fpdef\nsymbol.fplist\nsymbol.funcdef\nsymbol.gen_for\nsymbol.gen_if\nsymbol.gen_iter\nsymbol.global_stmt\nsymbol.if_stmt\nsymbol.import_as_name\nsymbol.import_as_names\nsymbol.import_from\nsymbol.import_name\nsymbol.import_stmt\nsymbol.lambdef\nsymbol.list_for\nsymbol.list_if\nsymbol.list_iter\nsymbol.listmaker\nsymbol.main(??)\nsymbol.not_test\nsymbol.old_lambdef\nsymbol.old_test\nsymbol.or_test\nsymbol.parameters\nsymbol.pass_stmt\nsymbol.power\nsymbol.print_stmt\nsymbol.raise_stmt\nsymbol.return_stmt\nsymbol.shift_expr\nsymbol.simple_stmt\nsymbol.single_input\nsymbol.sliceop\nsymbol.small_stmt\nsymbol.stmt\nsymbol.subscript\nsymbol.subscriptlist\nsymbol.suite\nsymbol.sym_name\nsymbol.term\nsymbol.test\nsymbol.testlist\nsymbol.testlist1\nsymbol.testlist_gexp\nsymbol.testlist_safe\nsymbol.trailer\nsymbol.try_stmt\nsymbol.varargslist\nsymbol.while_stmt\nsymbol.with_stmt\nsymbol.with_var\nsymbol.xor_expr\nsymbol.yield_expr\nsymbol.yield_stmt\nsymtable.Class\nsymtable.DEF_BOUND\nsymtable.DEF_GLOBAL\nsymtable.DEF_IMPORT\nsymtable.DEF_LOCAL\nsymtable.DEF_PARAM\nsymtable.FREE\nsymtable.Function\nsymtable.GLOBAL_EXPLICIT\nsymtable.GLOBAL_IMPLICIT\nsymtable.OPT_BARE_EXEC\nsymtable.OPT_EXEC\nsymtable.OPT_IMPORT_STAR\nsymtable.SCOPE_MASK\nsymtable.SCOPE_OFF\nsymtable.Symbol\nsymtable.SymbolTable\nsymtable.SymbolTableFactory(??)\nsymtable.USE\nsymtable.symtable(??)\nsymtable.warnings\nsymtable.weakref\nsys.api_version\nsys.argv\nsys.builtin_module_names\nsys.byteorder\nsys.call_tracing(func, args) -> object\nsys.callstats() -> tuple of integers\nsys.copyright\nsys.displayhook(object) -> None\nsys.dont_write_bytecode\nsys.exc_clear() -> None\nsys.exc_info() -> (type, value, traceback)\nsys.exc_type\nsys.excepthook(exctype, value, traceback) -> None\nsys.exec_prefix\nsys.executable\nsys.exit([status])\nsys.flags\nsys.float_info\nsys.getcheckinterval() -> current check interval; see setcheckinterval().\nsys.getdefaultencoding() -> string\nsys.getdlopenflags() -> int\nsys.getfilesystemencoding() -> string\nsys.getprofile()\nsys.getrecursionlimit()\nsys.getrefcount(object) -> integer\nsys.getsizeof(object, default) -> int\nsys.gettrace()\nsys.hexversion\nsys.maxint\nsys.maxsize\nsys.maxunicode\nsys.meta_path\nsys.modules\nsys.path\nsys.path_hooks\nsys.path_importer_cache\nsys.platform\nsys.prefix\nsys.py3kwarning\nsys.setcheckinterval(n)\nsys.setdlopenflags(n) -> None\nsys.setprofile(function)\nsys.setrecursionlimit(n)\nsys.settrace(function)\nsys.stderr\nsys.stdin\nsys.stdout\nsys.subversion\nsys.version\nsys.version_info\nsys.warnoptions\nsyslog.LOG_ALERT\nsyslog.LOG_AUTH\nsyslog.LOG_CONS\nsyslog.LOG_CRIT\nsyslog.LOG_CRON\nsyslog.LOG_DAEMON\nsyslog.LOG_DEBUG\nsyslog.LOG_EMERG\nsyslog.LOG_ERR\nsyslog.LOG_INFO\nsyslog.LOG_KERN\nsyslog.LOG_LOCAL0\nsyslog.LOG_LOCAL1\nsyslog.LOG_LOCAL2\nsyslog.LOG_LOCAL3\nsyslog.LOG_LOCAL4\nsyslog.LOG_LOCAL5\nsyslog.LOG_LOCAL6\nsyslog.LOG_LOCAL7\nsyslog.LOG_LPR\nsyslog.LOG_MAIL\nsyslog.LOG_MASK\nsyslog.LOG_NDELAY\nsyslog.LOG_NEWS\nsyslog.LOG_NOTICE\nsyslog.LOG_NOWAIT\nsyslog.LOG_PERROR\nsyslog.LOG_PID\nsyslog.LOG_SYSLOG\nsyslog.LOG_UPTO\nsyslog.LOG_USER\nsyslog.LOG_UUCP\nsyslog.LOG_WARNING\nsyslog.closelog\nsyslog.openlog\nsyslog.setlogmask\nsyslog.syslog\ntabnanny.NannyNag\ntabnanny.Whitespace(??)\ntabnanny.check(file_or_dir)\ntabnanny.errprint(??)\ntabnanny.filename_only\ntabnanny.format_witnesses(??)\ntabnanny.getopt\ntabnanny.main(??)\ntabnanny.os\ntabnanny.process_tokens(??)\ntabnanny.sys\ntabnanny.tokenize\ntabnanny.verbose\ntarfile.AREGTYPE\ntarfile.BLKTYPE\ntarfile.BLOCKSIZE\ntarfile.CHRTYPE\ntarfile.CONTTYPE\ntarfile.CompressionError\ntarfile.DEFAULT_FORMAT\ntarfile.DIRTYPE\ntarfile.ENCODING\ntarfile.ExFileObject\ntarfile.ExtractError\ntarfile.FIFOTYPE\ntarfile.GNUTYPE_LONGLINK\ntarfile.GNUTYPE_LONGNAME\ntarfile.GNUTYPE_SPARSE\ntarfile.GNU_FORMAT\ntarfile.GNU_MAGIC\ntarfile.GNU_TYPES\ntarfile.HeaderError\ntarfile.LENGTH_LINK\ntarfile.LENGTH_NAME\ntarfile.LENGTH_PREFIX\ntarfile.LNKTYPE\ntarfile.NUL\ntarfile.PAX_FIELDS\ntarfile.PAX_FORMAT\ntarfile.PAX_NUMBER_FIELDS\ntarfile.POSIX_MAGIC\ntarfile.RECORDSIZE\ntarfile.REGTYPE\ntarfile.REGULAR_TYPES\ntarfile.ReadError\ntarfile.SOLARIS_XHDTYPE\ntarfile.SUPPORTED_TYPES\ntarfile.SYMTYPE\ntarfile.S_IFBLK\ntarfile.S_IFCHR\ntarfile.S_IFDIR\ntarfile.S_IFIFO\ntarfile.S_IFLNK\ntarfile.S_IFREG\ntarfile.StreamError\ntarfile.TAR_GZIPPED\ntarfile.TAR_PLAIN\ntarfile.TGEXEC\ntarfile.TGREAD\ntarfile.TGWRITE\ntarfile.TOEXEC\ntarfile.TOREAD\ntarfile.TOWRITE\ntarfile.TSGID\ntarfile.TSUID\ntarfile.TSVTX\ntarfile.TUEXEC\ntarfile.TUREAD\ntarfile.TUWRITE\ntarfile.TarError\ntarfile.TarFile\ntarfile.TarFileCompat(??)\ntarfile.TarInfo\ntarfile.TarIter(??)\ntarfile.USTAR_FORMAT\ntarfile.XGLTYPE\ntarfile.XHDTYPE\ntarfile.bltn_open\ntarfile.calc_chksums(??)\ntarfile.copy\ntarfile.copyfileobj(??)\ntarfile.errno\ntarfile.filemode(??)\ntarfile.filemode_table\ntarfile.grp\ntarfile.is_tarfile(??)\ntarfile.itn(??)\ntarfile.normpath(??)\ntarfile.nti(??)\ntarfile.nts(??)\ntarfile.open\ntarfile.operator\ntarfile.os\ntarfile.pwd\ntarfile.re\ntarfile.shutil\ntarfile.stat\ntarfile.stn(??)\ntarfile.struct\ntarfile.sys\ntarfile.time\ntarfile.uts(??)\ntarfile.version\ntelnetlib.AO\ntelnetlib.AUTHENTICATION\ntelnetlib.AYT\ntelnetlib.BINARY\ntelnetlib.BM\ntelnetlib.BRK\ntelnetlib.CHARSET\ntelnetlib.COM_PORT_OPTION\ntelnetlib.DEBUGLEVEL\ntelnetlib.DET\ntelnetlib.DM\ntelnetlib.DO\ntelnetlib.DONT\ntelnetlib.EC\ntelnetlib.ECHO\ntelnetlib.EL\ntelnetlib.ENCRYPT\ntelnetlib.EOR\ntelnetlib.EXOPL\ntelnetlib.FORWARD_X\ntelnetlib.GA\ntelnetlib.IAC\ntelnetlib.IP\ntelnetlib.KERMIT\ntelnetlib.LFLOW\ntelnetlib.LINEMODE\ntelnetlib.LOGOUT\ntelnetlib.NAMS\ntelnetlib.NAOCRD\ntelnetlib.NAOFFD\ntelnetlib.NAOHTD\ntelnetlib.NAOHTS\ntelnetlib.NAOL\ntelnetlib.NAOLFD\ntelnetlib.NAOP\ntelnetlib.NAOVTD\ntelnetlib.NAOVTS\ntelnetlib.NAWS\ntelnetlib.NEW_ENVIRON\ntelnetlib.NOOPT\ntelnetlib.NOP\ntelnetlib.OLD_ENVIRON\ntelnetlib.OUTMRK\ntelnetlib.PRAGMA_HEARTBEAT\ntelnetlib.PRAGMA_LOGON\ntelnetlib.RCP\ntelnetlib.RCTE\ntelnetlib.RSP\ntelnetlib.SB\ntelnetlib.SE\ntelnetlib.SEND_URL\ntelnetlib.SGA\ntelnetlib.SNDLOC\ntelnetlib.SSPI_LOGON\ntelnetlib.STATUS\ntelnetlib.SUPDUP\ntelnetlib.SUPDUPOUTPUT\ntelnetlib.SUPPRESS_LOCAL_ECHO\ntelnetlib.TELNET_PORT\ntelnetlib.TLS\ntelnetlib.TM\ntelnetlib.TN3270E\ntelnetlib.TSPEED\ntelnetlib.TTYLOC\ntelnetlib.TTYPE\ntelnetlib.TUID\ntelnetlib.Telnet(??)\ntelnetlib.VT3270REGIME\ntelnetlib.WILL\ntelnetlib.WONT\ntelnetlib.X3PAD\ntelnetlib.XASCII\ntelnetlib.XAUTH\ntelnetlib.XDISPLOC\ntelnetlib.select\ntelnetlib.socket\ntelnetlib.sys\ntelnetlib.test(??)\ntelnetlib.theNULL\ntempfile.NamedTemporaryFile(??)\ntempfile.SpooledTemporaryFile(??)\ntempfile.TMP_MAX\ntempfile.TemporaryFile(??)\ntempfile.gettempdir(??)\ntempfile.gettempprefix(??)\ntempfile.mkdtemp(??)\ntempfile.mkstemp(??)\ntempfile.mktemp(??)\ntempfile.tempdir\ntempfile.template\ntermios.B0\ntermios.B110\ntermios.B115200\ntermios.B1200\ntermios.B134\ntermios.B150\ntermios.B1800\ntermios.B19200\ntermios.B200\ntermios.B230400\ntermios.B2400\ntermios.B300\ntermios.B38400\ntermios.B460800\ntermios.B4800\ntermios.B50\ntermios.B57600\ntermios.B600\ntermios.B75\ntermios.B9600\ntermios.BRKINT\ntermios.BS0\ntermios.BS1\ntermios.BSDLY\ntermios.CBAUD\ntermios.CBAUDEX\ntermios.CDSUSP\ntermios.CEOF\ntermios.CEOL\ntermios.CEOT\ntermios.CERASE\ntermios.CFLUSH\ntermios.CIBAUD\ntermios.CINTR\ntermios.CKILL\ntermios.CLNEXT\ntermios.CLOCAL\ntermios.CQUIT\ntermios.CR0\ntermios.CR1\ntermios.CR2\ntermios.CR3\ntermios.CRDLY\ntermios.CREAD\ntermios.CRPRNT\ntermios.CRTSCTS\ntermios.CS5\ntermios.CS6\ntermios.CS7\ntermios.CS8\ntermios.CSIZE\ntermios.CSTART\ntermios.CSTOP\ntermios.CSTOPB\ntermios.CSUSP\ntermios.CWERASE\ntermios.ECHO\ntermios.ECHOCTL\ntermios.ECHOE\ntermios.ECHOK\ntermios.ECHOKE\ntermios.ECHONL\ntermios.ECHOPRT\ntermios.EXTA\ntermios.EXTB\ntermios.FF0\ntermios.FF1\ntermios.FFDLY\ntermios.FIOASYNC\ntermios.FIOCLEX\ntermios.FIONBIO\ntermios.FIONCLEX\ntermios.FIONREAD\ntermios.FLUSHO\ntermios.HUPCL\ntermios.ICANON\ntermios.ICRNL\ntermios.IEXTEN\ntermios.IGNBRK\ntermios.IGNCR\ntermios.IGNPAR\ntermios.IMAXBEL\ntermios.INLCR\ntermios.INPCK\ntermios.IOCSIZE_MASK\ntermios.IOCSIZE_SHIFT\ntermios.ISIG\ntermios.ISTRIP\ntermios.IUCLC\ntermios.IXANY\ntermios.IXOFF\ntermios.IXON\ntermios.NCC\ntermios.NCCS\ntermios.NL0\ntermios.NL1\ntermios.NLDLY\ntermios.NOFLSH\ntermios.N_MOUSE\ntermios.N_PPP\ntermios.N_SLIP\ntermios.N_STRIP\ntermios.N_TTY\ntermios.OCRNL\ntermios.OFDEL\ntermios.OFILL\ntermios.OLCUC\ntermios.ONLCR\ntermios.ONLRET\ntermios.ONOCR\ntermios.OPOST\ntermios.PARENB\ntermios.PARMRK\ntermios.PARODD\ntermios.PENDIN\ntermios.TAB0\ntermios.TAB1\ntermios.TAB2\ntermios.TAB3\ntermios.TABDLY\ntermios.TCFLSH\ntermios.TCGETA\ntermios.TCGETS\ntermios.TCIFLUSH\ntermios.TCIOFF\ntermios.TCIOFLUSH\ntermios.TCION\ntermios.TCOFLUSH\ntermios.TCOOFF\ntermios.TCOON\ntermios.TCSADRAIN\ntermios.TCSAFLUSH\ntermios.TCSANOW\ntermios.TCSBRK\ntermios.TCSBRKP\ntermios.TCSETA\ntermios.TCSETAF\ntermios.TCSETAW\ntermios.TCSETS\ntermios.TCSETSF\ntermios.TCSETSW\ntermios.TCXONC\ntermios.TIOCCONS\ntermios.TIOCEXCL\ntermios.TIOCGETD\ntermios.TIOCGICOUNT\ntermios.TIOCGLCKTRMIOS\ntermios.TIOCGPGRP\ntermios.TIOCGSERIAL\ntermios.TIOCGSOFTCAR\ntermios.TIOCGWINSZ\ntermios.TIOCINQ\ntermios.TIOCLINUX\ntermios.TIOCMBIC\ntermios.TIOCMBIS\ntermios.TIOCMGET\ntermios.TIOCMIWAIT\ntermios.TIOCMSET\ntermios.TIOCM_CAR\ntermios.TIOCM_CD\ntermios.TIOCM_CTS\ntermios.TIOCM_DSR\ntermios.TIOCM_DTR\ntermios.TIOCM_LE\ntermios.TIOCM_RI\ntermios.TIOCM_RNG\ntermios.TIOCM_RTS\ntermios.TIOCM_SR\ntermios.TIOCM_ST\ntermios.TIOCNOTTY\ntermios.TIOCNXCL\ntermios.TIOCOUTQ\ntermios.TIOCPKT\ntermios.TIOCPKT_DATA\ntermios.TIOCPKT_DOSTOP\ntermios.TIOCPKT_FLUSHREAD\ntermios.TIOCPKT_FLUSHWRITE\ntermios.TIOCPKT_NOSTOP\ntermios.TIOCPKT_START\ntermios.TIOCPKT_STOP\ntermios.TIOCSCTTY\ntermios.TIOCSERCONFIG\ntermios.TIOCSERGETLSR\ntermios.TIOCSERGETMULTI\ntermios.TIOCSERGSTRUCT\ntermios.TIOCSERGWILD\ntermios.TIOCSERSETMULTI\ntermios.TIOCSERSWILD\ntermios.TIOCSER_TEMT\ntermios.TIOCSETD\ntermios.TIOCSLCKTRMIOS\ntermios.TIOCSPGRP\ntermios.TIOCSSERIAL\ntermios.TIOCSSOFTCAR\ntermios.TIOCSTI\ntermios.TIOCSWINSZ\ntermios.TOSTOP\ntermios.VDISCARD\ntermios.VEOF\ntermios.VEOL\ntermios.VEOL2\ntermios.VERASE\ntermios.VINTR\ntermios.VKILL\ntermios.VLNEXT\ntermios.VMIN\ntermios.VQUIT\ntermios.VREPRINT\ntermios.VSTART\ntermios.VSTOP\ntermios.VSUSP\ntermios.VSWTC\ntermios.VSWTCH\ntermios.VT0\ntermios.VT1\ntermios.VTDLY\ntermios.VTIME\ntermios.VWERASE\ntermios.XCASE\ntermios.XTABS\ntermios.error\ntermios.tcdrain(fd) -> None\ntermios.tcflow(fd, action) -> None\ntermios.tcflush(fd, queue) -> None\ntermios.tcgetattr(fd) -> list_of_attrs\ntermios.tcsendbreak(fd, duration) -> None\ntermios.tcsetattr(fd, when, attributes) -> None\ntextwrap.TextWrapper(??)\ntextwrap.dedent(??)\ntextwrap.fill(??)\ntextwrap.re\ntextwrap.string\ntextwrap.wrap(??)\nthis.c\nthis.d\nthis.i\nthis.s\nthread.LockType\nthread.allocate\nthread.allocate_lock() -> lock object\nthread.error\nthread.exit()\nthread.exit_thread\nthread.get_ident() -> integer\nthread.interrupt_main()\nthread.stack_size([size]) -> size\nthread.start_new\nthread.start_new_thread(function, args[, kwargs])\nthreading.BoundedSemaphore(??)\nthreading.Condition(??)\nthreading.Event(??)\nthreading.Lock\nthreading.RLock(??)\nthreading.Semaphore(??)\nthreading.Thread\nthreading.ThreadError\nthreading.Timer(??)\nthreading.activeCount(??)\nthreading.active_count(??)\nthreading.currentThread(??)\nthreading.current_thread(??)\nthreading.deque(iterable[, maxlen]) --> deque object\nthreading.enumerate(??)\nthreading.local\nthreading.setprofile(??)\nthreading.settrace(??)\nthreading.stack_size([size]) -> size\nthreading.warnings\nthreading.wraps(??)\ntime.accept2dyear\ntime.altzone\ntime.asctime([tuple]) -> string\ntime.clock() -> floating point number\ntime.ctime(seconds) -> string\ntime.daylight\ntime.gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\ntime.localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\ntime.mktime(tuple) -> floating point number\ntime.sleep(seconds)\ntime.strftime(format[, tuple]) -> string\ntime.strptime(string, format) -> struct_time\ntime.struct_time\ntime.time() -> floating point number\ntime.timezone\ntime.tzname\ntime.tzset(zone)\ntimeit.Timer(??)\ntimeit.default_number\ntimeit.default_repeat\ntimeit.default_timer\ntimeit.dummy_src_name\ntimeit.gc\ntimeit.itertools\ntimeit.main(??)\ntimeit.reindent(??)\ntimeit.repeat(??)\ntimeit.sys\ntimeit.template\ntimeit.time\ntimeit.timeit(??)\ntoaiff.error\ntoaiff.os\ntoaiff.pipes\ntoaiff.sndhdr\ntoaiff.t\ntoaiff.table\ntoaiff.tempfile\ntoaiff.toaiff(??)\ntoaiff.uncompress\ntoken.AMPER\ntoken.AMPEREQUAL\ntoken.AT\ntoken.BACKQUOTE\ntoken.CIRCUMFLEX\ntoken.CIRCUMFLEXEQUAL\ntoken.COLON\ntoken.COMMA\ntoken.DEDENT\ntoken.DOT\ntoken.DOUBLESLASH\ntoken.DOUBLESLASHEQUAL\ntoken.DOUBLESTAR\ntoken.DOUBLESTAREQUAL\ntoken.ENDMARKER\ntoken.EQEQUAL\ntoken.EQUAL\ntoken.ERRORTOKEN\ntoken.GREATER\ntoken.GREATEREQUAL\ntoken.INDENT\ntoken.ISEOF(??)\ntoken.ISNONTERMINAL(??)\ntoken.ISTERMINAL(??)\ntoken.LBRACE\ntoken.LEFTSHIFT\ntoken.LEFTSHIFTEQUAL\ntoken.LESS\ntoken.LESSEQUAL\ntoken.LPAR\ntoken.LSQB\ntoken.MINEQUAL\ntoken.MINUS\ntoken.NAME\ntoken.NEWLINE\ntoken.NOTEQUAL\ntoken.NT_OFFSET\ntoken.NUMBER\ntoken.N_TOKENS\ntoken.OP\ntoken.PERCENT\ntoken.PERCENTEQUAL\ntoken.PLUS\ntoken.PLUSEQUAL\ntoken.RBRACE\ntoken.RIGHTSHIFT\ntoken.RIGHTSHIFTEQUAL\ntoken.RPAR\ntoken.RSQB\ntoken.SEMI\ntoken.SLASH\ntoken.SLASHEQUAL\ntoken.STAR\ntoken.STAREQUAL\ntoken.STRING\ntoken.TILDE\ntoken.VBAR\ntoken.VBAREQUAL\ntoken.main(??)\ntoken.tok_name\ntokenize.AMPER\ntokenize.AMPEREQUAL\ntokenize.AT\ntokenize.BACKQUOTE\ntokenize.Binnumber\ntokenize.Bracket\ntokenize.CIRCUMFLEX\ntokenize.CIRCUMFLEXEQUAL\ntokenize.COLON\ntokenize.COMMA\ntokenize.COMMENT\ntokenize.Comment\ntokenize.ContStr\ntokenize.DEDENT\ntokenize.DOT\ntokenize.DOUBLESLASH\ntokenize.DOUBLESLASHEQUAL\ntokenize.DOUBLESTAR\ntokenize.DOUBLESTAREQUAL\ntokenize.Decnumber\ntokenize.Double\ntokenize.Double3\ntokenize.ENDMARKER\ntokenize.EQEQUAL\ntokenize.EQUAL\ntokenize.ERRORTOKEN\ntokenize.Expfloat\ntokenize.Exponent\ntokenize.Floatnumber\ntokenize.Funny\ntokenize.GREATER\ntokenize.GREATEREQUAL\ntokenize.Hexnumber\ntokenize.INDENT\ntokenize.ISEOF(??)\ntokenize.ISNONTERMINAL(??)\ntokenize.ISTERMINAL(??)\ntokenize.Ignore\ntokenize.Imagnumber\ntokenize.Intnumber\ntokenize.LBRACE\ntokenize.LEFTSHIFT\ntokenize.LEFTSHIFTEQUAL\ntokenize.LESS\ntokenize.LESSEQUAL\ntokenize.LPAR\ntokenize.LSQB\ntokenize.MINEQUAL\ntokenize.MINUS\ntokenize.NAME\ntokenize.NEWLINE\ntokenize.NL\ntokenize.NOTEQUAL\ntokenize.NT_OFFSET\ntokenize.NUMBER\ntokenize.N_TOKENS\ntokenize.Name\ntokenize.Number\ntokenize.OP\ntokenize.Octnumber\ntokenize.Operator\ntokenize.PERCENT\ntokenize.PERCENTEQUAL\ntokenize.PLUS\ntokenize.PLUSEQUAL\ntokenize.PlainToken\ntokenize.Pointfloat\ntokenize.PseudoExtras\ntokenize.PseudoToken\ntokenize.RBRACE\ntokenize.RIGHTSHIFT\ntokenize.RIGHTSHIFTEQUAL\ntokenize.RPAR\ntokenize.RSQB\ntokenize.SEMI\ntokenize.SLASH\ntokenize.SLASHEQUAL\ntokenize.STAR\ntokenize.STAREQUAL\ntokenize.STRING\ntokenize.Single\ntokenize.Single3\ntokenize.Special\ntokenize.StopTokenizing\ntokenize.String\ntokenize.TILDE\ntokenize.Token\ntokenize.TokenError\ntokenize.Triple\ntokenize.Untokenizer(??)\ntokenize.VBAR\ntokenize.VBAREQUAL\ntokenize.Whitespace\ntokenize.any(??)\ntokenize.double3prog\ntokenize.endprogs\ntokenize.generate_tokens(??)\ntokenize.group(??)\ntokenize.main(??)\ntokenize.maybe(??)\ntokenize.printtoken(??)\ntokenize.pseudoprog\ntokenize.re\ntokenize.single3prog\ntokenize.single_quoted\ntokenize.string\ntokenize.t\ntokenize.tabsize\ntokenize.tok_name\ntokenize.tokenize(??)\ntokenize.tokenize_loop(??)\ntokenize.tokenprog\ntokenize.triple_quoted\ntokenize.untokenize(??)\ntrace.CoverageResults(??)\ntrace.Ignore(??)\ntrace.PRAGMA_NOCOVER\ntrace.Trace(??)\ntrace.cPickle\ntrace.find_executable_linenos(??)\ntrace.find_lines(??)\ntrace.find_lines_from_code(??)\ntrace.find_strings(??)\ntrace.fullmodname(??)\ntrace.gc\ntrace.linecache\ntrace.main(??)\ntrace.modname(??)\ntrace.os\ntrace.pickle\ntrace.re\ntrace.rx_blank\ntrace.sys\ntrace.threading\ntrace.time\ntrace.token\ntrace.tokenize\ntrace.types\ntrace.usage(??)\ntraceback.extract_stack(??)\ntraceback.extract_tb(??)\ntraceback.format_exc(??)\ntraceback.format_exception(??)\ntraceback.format_exception_only(??)\ntraceback.format_list(??)\ntraceback.format_stack(??)\ntraceback.format_tb(??)\ntraceback.linecache\ntraceback.print_exc(??)\ntraceback.print_exception(??)\ntraceback.print_last(??)\ntraceback.print_list(??)\ntraceback.print_stack(??)\ntraceback.print_tb(??)\ntraceback.sys\ntraceback.tb_lineno(??)\ntraceback.types\ntty.B0\ntty.B110\ntty.B115200\ntty.B1200\ntty.B134\ntty.B150\ntty.B1800\ntty.B19200\ntty.B200\ntty.B230400\ntty.B2400\ntty.B300\ntty.B38400\ntty.B460800\ntty.B4800\ntty.B50\ntty.B57600\ntty.B600\ntty.B75\ntty.B9600\ntty.BRKINT\ntty.BS0\ntty.BS1\ntty.BSDLY\ntty.CBAUD\ntty.CBAUDEX\ntty.CC\ntty.CDSUSP\ntty.CEOF\ntty.CEOL\ntty.CEOT\ntty.CERASE\ntty.CFLAG\ntty.CFLUSH\ntty.CIBAUD\ntty.CINTR\ntty.CKILL\ntty.CLNEXT\ntty.CLOCAL\ntty.CQUIT\ntty.CR0\ntty.CR1\ntty.CR2\ntty.CR3\ntty.CRDLY\ntty.CREAD\ntty.CRPRNT\ntty.CRTSCTS\ntty.CS5\ntty.CS6\ntty.CS7\ntty.CS8\ntty.CSIZE\ntty.CSTART\ntty.CSTOP\ntty.CSTOPB\ntty.CSUSP\ntty.CWERASE\ntty.ECHO\ntty.ECHOCTL\ntty.ECHOE\ntty.ECHOK\ntty.ECHOKE\ntty.ECHONL\ntty.ECHOPRT\ntty.EXTA\ntty.EXTB\ntty.FF0\ntty.FF1\ntty.FFDLY\ntty.FIOASYNC\ntty.FIOCLEX\ntty.FIONBIO\ntty.FIONCLEX\ntty.FIONREAD\ntty.FLUSHO\ntty.HUPCL\ntty.ICANON\ntty.ICRNL\ntty.IEXTEN\ntty.IFLAG\ntty.IGNBRK\ntty.IGNCR\ntty.IGNPAR\ntty.IMAXBEL\ntty.INLCR\ntty.INPCK\ntty.IOCSIZE_MASK\ntty.IOCSIZE_SHIFT\ntty.ISIG\ntty.ISPEED\ntty.ISTRIP\ntty.IUCLC\ntty.IXANY\ntty.IXOFF\ntty.IXON\ntty.LFLAG\ntty.NCC\ntty.NCCS\ntty.NL0\ntty.NL1\ntty.NLDLY\ntty.NOFLSH\ntty.N_MOUSE\ntty.N_PPP\ntty.N_SLIP\ntty.N_STRIP\ntty.N_TTY\ntty.OCRNL\ntty.OFDEL\ntty.OFILL\ntty.OFLAG\ntty.OLCUC\ntty.ONLCR\ntty.ONLRET\ntty.ONOCR\ntty.OPOST\ntty.OSPEED\ntty.PARENB\ntty.PARMRK\ntty.PARODD\ntty.PENDIN\ntty.TAB0\ntty.TAB1\ntty.TAB2\ntty.TAB3\ntty.TABDLY\ntty.TCFLSH\ntty.TCGETA\ntty.TCGETS\ntty.TCIFLUSH\ntty.TCIOFF\ntty.TCIOFLUSH\ntty.TCION\ntty.TCOFLUSH\ntty.TCOOFF\ntty.TCOON\ntty.TCSADRAIN\ntty.TCSAFLUSH\ntty.TCSANOW\ntty.TCSBRK\ntty.TCSBRKP\ntty.TCSETA\ntty.TCSETAF\ntty.TCSETAW\ntty.TCSETS\ntty.TCSETSF\ntty.TCSETSW\ntty.TCXONC\ntty.TIOCCONS\ntty.TIOCEXCL\ntty.TIOCGETD\ntty.TIOCGICOUNT\ntty.TIOCGLCKTRMIOS\ntty.TIOCGPGRP\ntty.TIOCGSERIAL\ntty.TIOCGSOFTCAR\ntty.TIOCGWINSZ\ntty.TIOCINQ\ntty.TIOCLINUX\ntty.TIOCMBIC\ntty.TIOCMBIS\ntty.TIOCMGET\ntty.TIOCMIWAIT\ntty.TIOCMSET\ntty.TIOCM_CAR\ntty.TIOCM_CD\ntty.TIOCM_CTS\ntty.TIOCM_DSR\ntty.TIOCM_DTR\ntty.TIOCM_LE\ntty.TIOCM_RI\ntty.TIOCM_RNG\ntty.TIOCM_RTS\ntty.TIOCM_SR\ntty.TIOCM_ST\ntty.TIOCNOTTY\ntty.TIOCNXCL\ntty.TIOCOUTQ\ntty.TIOCPKT\ntty.TIOCPKT_DATA\ntty.TIOCPKT_DOSTOP\ntty.TIOCPKT_FLUSHREAD\ntty.TIOCPKT_FLUSHWRITE\ntty.TIOCPKT_NOSTOP\ntty.TIOCPKT_START\ntty.TIOCPKT_STOP\ntty.TIOCSCTTY\ntty.TIOCSERCONFIG\ntty.TIOCSERGETLSR\ntty.TIOCSERGETMULTI\ntty.TIOCSERGSTRUCT\ntty.TIOCSERGWILD\ntty.TIOCSERSETMULTI\ntty.TIOCSERSWILD\ntty.TIOCSER_TEMT\ntty.TIOCSETD\ntty.TIOCSLCKTRMIOS\ntty.TIOCSPGRP\ntty.TIOCSSERIAL\ntty.TIOCSSOFTCAR\ntty.TIOCSTI\ntty.TIOCSWINSZ\ntty.TOSTOP\ntty.VDISCARD\ntty.VEOF\ntty.VEOL\ntty.VEOL2\ntty.VERASE\ntty.VINTR\ntty.VKILL\ntty.VLNEXT\ntty.VMIN\ntty.VQUIT\ntty.VREPRINT\ntty.VSTART\ntty.VSTOP\ntty.VSUSP\ntty.VSWTC\ntty.VSWTCH\ntty.VT0\ntty.VT1\ntty.VTDLY\ntty.VTIME\ntty.VWERASE\ntty.XCASE\ntty.XTABS\ntty.error\ntty.setcbreak(??)\ntty.setraw(??)\ntty.tcdrain(fd) -> None\ntty.tcflow(fd, action) -> None\ntty.tcflush(fd, queue) -> None\ntty.tcgetattr(fd) -> list_of_attrs\ntty.tcsendbreak(fd, duration) -> None\ntty.tcsetattr(fd, when, attributes) -> None\ntuple() -> an empty tuple\ntype(object) -> the object's type\ntypes.BooleanType\ntypes.BufferType\ntypes.BuiltinFunctionType\ntypes.BuiltinMethodType\ntypes.ClassType\ntypes.CodeType\ntypes.ComplexType\ntypes.DictProxyType\ntypes.DictType\ntypes.DictionaryType\ntypes.EllipsisType\ntypes.FileType\ntypes.FloatType\ntypes.FrameType\ntypes.FunctionType\ntypes.GeneratorType\ntypes.GetSetDescriptorType\ntypes.InstanceType\ntypes.IntType\ntypes.LambdaType\ntypes.ListType\ntypes.LongType\ntypes.MemberDescriptorType\ntypes.MethodType\ntypes.ModuleType\ntypes.NoneType\ntypes.NotImplementedType\ntypes.ObjectType\ntypes.SliceType\ntypes.StringType\ntypes.StringTypes\ntypes.TracebackType\ntypes.TupleType\ntypes.TypeType\ntypes.UnboundMethodType\ntypes.UnicodeType\ntypes.XRangeType\nunichr(i) -> Unicode character\nunicode(string [, encoding[, errors]]) -> object\nunicodedata.UCD\nunicodedata.bidirectional(unichr)\nunicodedata.category(unichr)\nunicodedata.combining(unichr)\nunicodedata.decimal(unichr[, default])\nunicodedata.decomposition(unichr)\nunicodedata.digit(unichr[, default])\nunicodedata.east_asian_width(unichr)\nunicodedata.lookup(name)\nunicodedata.mirrored(unichr)\nunicodedata.name(unichr[, default])\nunicodedata.normalize(form, unistr)\nunicodedata.numeric(unichr[, default])\nunicodedata.ucd_3_2_0\nunicodedata.ucnhash_CAPI\nunicodedata.unidata_version\nunittest.FunctionTestCase\nunittest.TestCase\nunittest.TestLoader\nunittest.TestProgram\nunittest.TestResult\nunittest.TestSuite\nunittest.TextTestRunner\nunittest.defaultTestLoader\nunittest.findTestCases(??)\nunittest.getTestCaseNames(??)\nunittest.main\nunittest.makeSuite(??)\nunittest.os\nunittest.sys\nunittest.time\nunittest.traceback\nunittest.types\nurllib.ContentTooShortError\nurllib.FancyURLopener(??)\nurllib.MAXFTPCACHE\nurllib.URLopener(??)\nurllib.addbase(??)\nurllib.addclosehook(??)\nurllib.addinfo(??)\nurllib.addinfourl(??)\nurllib.always_safe\nurllib.basejoin(??)\nurllib.ftpcache\nurllib.ftperrors(??)\nurllib.ftpwrapper(??)\nurllib.getproxies(??)\nurllib.getproxies_environment(??)\nurllib.localhost(??)\nurllib.main(??)\nurllib.noheaders(??)\nurllib.os\nurllib.pathname2url(??)\nurllib.proxy_bypass(??)\nurllib.proxy_bypass_environment(??)\nurllib.quote('abc def') -> 'abc%20def'\nurllib.quote_plus(??)\nurllib.reporthook(??)\nurllib.socket\nurllib.splitattr('/path;attr1=value1;attr2=value2;...') ->\nurllib.splithost('//host[:port]/path') --> 'host[:port]', '/path'.\nurllib.splitnport(??)\nurllib.splitpasswd('user:passwd') -> 'user', 'passwd'.\nurllib.splitport('host:port') --> 'host', 'port'.\nurllib.splitquery('/path?query') --> '/path', 'query'.\nurllib.splittag('/path#tag') --> '/path', 'tag'.\nurllib.splittype('type:opaquestring') --> 'type', 'opaquestring'.\nurllib.splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.\nurllib.splitvalue('attr=value') --> 'attr', 'value'.\nurllib.ssl\nurllib.string\nurllib.sys\nurllib.test(??)\nurllib.test1(??)\nurllib.thishost(??)\nurllib.time\nurllib.toBytes(u\"URL\") --> 'URL'.\nurllib.unquote('abc%20def') -> 'abc def'.\nurllib.unquote_plus(??)\nurllib.unwrap('<URL:type://host/path>') --> 'type://host/path'.\nurllib.url2pathname(??)\nurllib.urlcleanup(??)\nurllib.urlencode(??)\nurllib.urlopen(??)\nurllib.urlretrieve(??)\nurllib.warnings\nurllib2.AbstractBasicAuthHandler(??)\nurllib2.AbstractDigestAuthHandler(??)\nurllib2.AbstractHTTPHandler(??)\nurllib2.BaseHandler(??)\nurllib2.CacheFTPHandler(??)\nurllib2.FTPHandler(??)\nurllib2.FileHandler(??)\nurllib2.HTTPBasicAuthHandler(??)\nurllib2.HTTPCookieProcessor(??)\nurllib2.HTTPDefaultErrorHandler(??)\nurllib2.HTTPDigestAuthHandler(??)\nurllib2.HTTPError\nurllib2.HTTPErrorProcessor(??)\nurllib2.HTTPHandler(??)\nurllib2.HTTPPasswordMgr(??)\nurllib2.HTTPPasswordMgrWithDefaultRealm(??)\nurllib2.HTTPRedirectHandler(??)\nurllib2.HTTPSHandler(??)\nurllib2.OpenerDirector(??)\nurllib2.ProxyBasicAuthHandler(??)\nurllib2.ProxyDigestAuthHandler(??)\nurllib2.ProxyHandler(??)\nurllib2.Request(??)\nurllib2.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nurllib2.URLError\nurllib2.UnknownHandler(??)\nurllib2.addinfourl(??)\nurllib2.base64\nurllib2.bisect\nurllib2.build_opener(??)\nurllib2.ftpwrapper(??)\nurllib2.getproxies(??)\nurllib2.hashlib\nurllib2.httplib\nurllib2.install_opener(??)\nurllib2.localhost(??)\nurllib2.mimetools\nurllib2.os\nurllib2.parse_http_list(??)\nurllib2.parse_keqv_list(??)\nurllib2.posixpath\nurllib2.quote('abc def') -> 'abc%20def'\nurllib2.random\nurllib2.randombytes(??)\nurllib2.re\nurllib2.request_host(??)\nurllib2.socket\nurllib2.splitattr('/path;attr1=value1;attr2=value2;...') ->\nurllib2.splithost('//host[:port]/path') --> 'host[:port]', '/path'.\nurllib2.splitpasswd('user:passwd') -> 'user', 'passwd'.\nurllib2.splitport('host:port') --> 'host', 'port'.\nurllib2.splittype('type:opaquestring') --> 'type', 'opaquestring'.\nurllib2.splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.\nurllib2.splitvalue('attr=value') --> 'attr', 'value'.\nurllib2.sys\nurllib2.time\nurllib2.unquote('abc%20def') -> 'abc def'.\nurllib2.unwrap('<URL:type://host/path>') --> 'type://host/path'.\nurllib2.url2pathname(??)\nurllib2.urlopen(??)\nurllib2.urlparse\nurlparse.MAX_CACHE_SIZE\nurlparse.ParseResult\nurlparse.ResultMixin\nurlparse.SplitResult\nurlparse.clear_cache(??)\nurlparse.namedtuple(??)\nurlparse.non_hierarchical\nurlparse.parse_qs(??)\nurlparse.parse_qsl(??)\nurlparse.scheme_chars\nurlparse.test(??)\nurlparse.test_input\nurlparse.unquote('abc%20def') -> 'abc def'.\nurlparse.urldefrag(??)\nurlparse.urljoin(??)\nurlparse.urlparse(??)\nurlparse.urlsplit(??)\nurlparse.urlunparse(??)\nurlparse.urlunsplit(??)\nurlparse.uses_fragment\nurlparse.uses_netloc\nurlparse.uses_params\nurlparse.uses_query\nurlparse.uses_relative\nuser.home\nuser.os\nuser.pythonrc\nuu.Error\nuu.binascii\nuu.decode(??)\nuu.encode(??)\nuu.os\nuu.sys\nuu.test(??)\nuuid.NAMESPACE_DNS\nuuid.NAMESPACE_OID\nuuid.NAMESPACE_URL\nuuid.NAMESPACE_X500\nuuid.RESERVED_FUTURE\nuuid.RESERVED_MICROSOFT\nuuid.RESERVED_NCS\nuuid.RFC_4122\nuuid.UUID\nuuid.ctypes\nuuid.getnode(??)\nuuid.lib\nuuid.libname\nuuid.uuid1(??)\nuuid.uuid3(??)\nuuid.uuid4(??)\nuuid.uuid5(??)\nvars([object]) -> dictionary\nwarnings.WarningMessage\nwarnings.catch_warnings\nwarnings.default_action\nwarnings.defaultaction\nwarnings.filters\nwarnings.filterwarnings(??)\nwarnings.formatwarning(??)\nwarnings.linecache\nwarnings.once_registry\nwarnings.onceregistry\nwarnings.resetwarnings(??)\nwarnings.showwarning(??)\nwarnings.simplefilter(??)\nwarnings.sys\nwarnings.types\nwarnings.warn\nwarnings.warn_explicit\nwarnings.warnpy3k(??)\nwave.Chunk(??)\nwave.Error\nwave.WAVE_FORMAT_PCM\nwave.Wave_read(??)\nwave.Wave_write(??)\nwave.big_endian\nwave.open(??)\nwave.openfp(??)\nwave.struct\nweakref.CallableProxyType\nweakref.KeyedRef\nweakref.ProxyType\nweakref.ProxyTypes\nweakref.ReferenceError\nweakref.ReferenceType\nweakref.UserDict\nweakref.WeakKeyDictionary(??)\nweakref.WeakValueDictionary(??)\nweakref.getweakrefcount(object) -- return the number of weak references\nweakref.getweakrefs(object) -- return a list of all weak reference objects\nweakref.proxy(object[, callback]) -- create a proxy object that weakly\nweakref.ref\nwebbrowser.BackgroundBrowser\nwebbrowser.BaseBrowser\nwebbrowser.Elinks\nwebbrowser.Error\nwebbrowser.Galeon\nwebbrowser.GenericBrowser\nwebbrowser.Grail\nwebbrowser.Konqueror\nwebbrowser.Mozilla\nwebbrowser.Netscape\nwebbrowser.Opera\nwebbrowser.UnixBrowser\nwebbrowser.get(??)\nwebbrowser.main(??)\nwebbrowser.open(??)\nwebbrowser.open_new(??)\nwebbrowser.open_new_tab(??)\nwebbrowser.os\nwebbrowser.register(??)\nwebbrowser.register_X_browsers(??)\nwebbrowser.shlex\nwebbrowser.stat\nwebbrowser.subprocess\nwebbrowser.sys\nwebbrowser.time\nwhichdb.dbm\nwhichdb.os\nwhichdb.struct\nwhichdb.sys\nwhichdb.whichdb(??)\nwsgiref.handlers\nwsgiref.handlers.BaseCGIHandler(??)\nwsgiref.handlers.BaseHandler(??)\nwsgiref.handlers.CGIHandler(??)\nwsgiref.handlers.FileWrapper(??)\nwsgiref.handlers.Headers(??)\nwsgiref.handlers.SimpleHandler(??)\nwsgiref.handlers.StringType\nwsgiref.handlers.format_date_time(??)\nwsgiref.handlers.guess_scheme(??)\nwsgiref.handlers.is_hop_by_hop(??)\nwsgiref.handlers.os\nwsgiref.handlers.sys\nwsgiref.handlers.time\nwsgiref.headers\nwsgiref.headers.Headers(??)\nwsgiref.headers.ListType\nwsgiref.headers.TupleType\nwsgiref.headers.re\nwsgiref.headers.tspecials\nwsgiref.simple_server\nwsgiref.simple_server.BaseHTTPRequestHandler(??)\nwsgiref.simple_server.HTTPServer(??)\nwsgiref.simple_server.ServerHandler(??)\nwsgiref.simple_server.SimpleHandler(??)\nwsgiref.simple_server.WSGIRequestHandler(??)\nwsgiref.simple_server.WSGIServer(??)\nwsgiref.simple_server.demo_app(??)\nwsgiref.simple_server.make_server(??)\nwsgiref.simple_server.server_version\nwsgiref.simple_server.software_version\nwsgiref.simple_server.sys\nwsgiref.simple_server.sys_version\nwsgiref.simple_server.urllib\nwsgiref.util\nwsgiref.util.FileWrapper(??)\nwsgiref.util.application_uri(??)\nwsgiref.util.guess_scheme(??)\nwsgiref.util.is_hop_by_hop(??)\nwsgiref.util.posixpath\nwsgiref.util.request_uri(??)\nwsgiref.util.setup_testing_defaults(??)\nwsgiref.util.shift_path_info(??)\nwsgiref.validate.DictType\nwsgiref.validate.ErrorWrapper(??)\nwsgiref.validate.InputWrapper(??)\nwsgiref.validate.IteratorWrapper(??)\nwsgiref.validate.ListType\nwsgiref.validate.PartialIteratorWrapper(??)\nwsgiref.validate.StringType\nwsgiref.validate.TupleType\nwsgiref.validate.WSGIWarning\nwsgiref.validate.WriteWrapper(??)\nwsgiref.validate.assert_(??)\nwsgiref.validate.bad_header_value_re\nwsgiref.validate.check_content_type(??)\nwsgiref.validate.check_environ(??)\nwsgiref.validate.check_errors(??)\nwsgiref.validate.check_exc_info(??)\nwsgiref.validate.check_headers(??)\nwsgiref.validate.check_input(??)\nwsgiref.validate.check_iterator(??)\nwsgiref.validate.check_status(??)\nwsgiref.validate.header_re\nwsgiref.validate.re\nwsgiref.validate.sys\nwsgiref.validate.validator(??)\nwsgiref.validate.warnings\nxdrlib.ConversionError\nxdrlib.Error\nxdrlib.Packer(??)\nxdrlib.Unpacker(??)\nxdrlib.struct\nxml.dom\nxml.dom.DOMException\nxml.dom.DOMSTRING_SIZE_ERR\nxml.dom.DomstringSizeErr\nxml.dom.EMPTY_NAMESPACE\nxml.dom.EMPTY_PREFIX\nxml.dom.HIERARCHY_REQUEST_ERR\nxml.dom.HierarchyRequestErr\nxml.dom.INDEX_SIZE_ERR\nxml.dom.INUSE_ATTRIBUTE_ERR\nxml.dom.INVALID_ACCESS_ERR\nxml.dom.INVALID_CHARACTER_ERR\nxml.dom.INVALID_MODIFICATION_ERR\nxml.dom.INVALID_STATE_ERR\nxml.dom.IndexSizeErr\nxml.dom.InuseAttributeErr\nxml.dom.InvalidAccessErr\nxml.dom.InvalidCharacterErr\nxml.dom.InvalidModificationErr\nxml.dom.InvalidStateErr\nxml.dom.NAMESPACE_ERR\nxml.dom.NOT_FOUND_ERR\nxml.dom.NOT_SUPPORTED_ERR\nxml.dom.NO_DATA_ALLOWED_ERR\nxml.dom.NO_MODIFICATION_ALLOWED_ERR\nxml.dom.NamespaceErr\nxml.dom.NoDataAllowedErr\nxml.dom.NoModificationAllowedErr\nxml.dom.Node(??)\nxml.dom.NodeFilter.NodeFilter(??)\nxml.dom.NotFoundErr\nxml.dom.NotSupportedErr\nxml.dom.SYNTAX_ERR\nxml.dom.SyntaxErr\nxml.dom.UserDataHandler(??)\nxml.dom.VALIDATION_ERR\nxml.dom.ValidationErr\nxml.dom.WRONG_DOCUMENT_ERR\nxml.dom.WrongDocumentErr\nxml.dom.XHTML_NAMESPACE\nxml.dom.XMLNS_NAMESPACE\nxml.dom.XML_NAMESPACE\nxml.dom.domreg\nxml.dom.domreg.EmptyNodeList\nxml.dom.domreg.NodeList\nxml.dom.domreg.StringTypes\nxml.dom.domreg.defproperty(??)\nxml.dom.domreg.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxml.dom.domreg.registerDOMImplementation(name, factory)\nxml.dom.domreg.registered\nxml.dom.domreg.well_known_implementations\nxml.dom.expatbuilder.CDATA_SECTION_NODE\nxml.dom.expatbuilder.DOCUMENT_NODE\nxml.dom.expatbuilder.EMPTY_NAMESPACE\nxml.dom.expatbuilder.EMPTY_PREFIX\nxml.dom.expatbuilder.ElementInfo\nxml.dom.expatbuilder.EmptyNodeList\nxml.dom.expatbuilder.ExpatBuilder(??)\nxml.dom.expatbuilder.ExpatBuilderNS(??)\nxml.dom.expatbuilder.FILTER_ACCEPT\nxml.dom.expatbuilder.FILTER_INTERRUPT\nxml.dom.expatbuilder.FILTER_REJECT\nxml.dom.expatbuilder.FILTER_SKIP\nxml.dom.expatbuilder.FilterCrutch\nxml.dom.expatbuilder.FilterVisibilityController\nxml.dom.expatbuilder.FragmentBuilder(??)\nxml.dom.expatbuilder.FragmentBuilderNS(??)\nxml.dom.expatbuilder.InternalSubsetExtractor(??)\nxml.dom.expatbuilder.Namespaces(??)\nxml.dom.expatbuilder.Node(??)\nxml.dom.expatbuilder.NodeFilter(??)\nxml.dom.expatbuilder.NodeList\nxml.dom.expatbuilder.ParseEscape\nxml.dom.expatbuilder.Rejecter\nxml.dom.expatbuilder.Skipper\nxml.dom.expatbuilder.StringTypes\nxml.dom.expatbuilder.TEXT_NODE\nxml.dom.expatbuilder.XMLNS_NAMESPACE\nxml.dom.expatbuilder.defproperty(??)\nxml.dom.expatbuilder.expat\nxml.dom.expatbuilder.makeBuilder(??)\nxml.dom.expatbuilder.minidom\nxml.dom.expatbuilder.parse(??)\nxml.dom.expatbuilder.parseFragment(??)\nxml.dom.expatbuilder.parseFragmentString(??)\nxml.dom.expatbuilder.parseString(??)\nxml.dom.expatbuilder.theDOMImplementation\nxml.dom.expatbuilder.xmlbuilder\nxml.dom.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxml.dom.minicompat\nxml.dom.minicompat.EmptyNodeList\nxml.dom.minicompat.NodeList\nxml.dom.minicompat.StringTypes\nxml.dom.minicompat.defproperty(??)\nxml.dom.minicompat.xml\nxml.dom.minidom.Attr(??)\nxml.dom.minidom.AttributeList\nxml.dom.minidom.CDATASection(??)\nxml.dom.minidom.CharacterData(??)\nxml.dom.minidom.Childless(??)\nxml.dom.minidom.Comment(??)\nxml.dom.minidom.DOMImplementation(??)\nxml.dom.minidom.DOMImplementationLS(??)\nxml.dom.minidom.Document(??)\nxml.dom.minidom.DocumentFragment(??)\nxml.dom.minidom.DocumentLS(??)\nxml.dom.minidom.DocumentType(??)\nxml.dom.minidom.EMPTY_NAMESPACE\nxml.dom.minidom.EMPTY_PREFIX\nxml.dom.minidom.Element(??)\nxml.dom.minidom.ElementInfo\nxml.dom.minidom.EmptyNodeList\nxml.dom.minidom.Entity(??)\nxml.dom.minidom.Identified(??)\nxml.dom.minidom.NamedNodeMap\nxml.dom.minidom.Node(??)\nxml.dom.minidom.NodeList\nxml.dom.minidom.Notation(??)\nxml.dom.minidom.ProcessingInstruction(??)\nxml.dom.minidom.ReadOnlySequentialNamedNodeMap\nxml.dom.minidom.StringTypes\nxml.dom.minidom.Text(??)\nxml.dom.minidom.TypeInfo\nxml.dom.minidom.XMLNS_NAMESPACE\nxml.dom.minidom.defproperty(??)\nxml.dom.minidom.domreg\nxml.dom.minidom.getDOMImplementation(??)\nxml.dom.minidom.parse(??)\nxml.dom.minidom.parseString(??)\nxml.dom.minidom.xml\nxml.dom.pulldom\nxml.dom.pulldom.CHARACTERS\nxml.dom.pulldom.COMMENT\nxml.dom.pulldom.DOMEventStream(??)\nxml.dom.pulldom.END_DOCUMENT\nxml.dom.pulldom.END_ELEMENT\nxml.dom.pulldom.ErrorHandler(??)\nxml.dom.pulldom.IGNORABLE_WHITESPACE\nxml.dom.pulldom.PROCESSING_INSTRUCTION\nxml.dom.pulldom.PullDOM(??)\nxml.dom.pulldom.SAX2DOM(??)\nxml.dom.pulldom.START_DOCUMENT\nxml.dom.pulldom.START_ELEMENT\nxml.dom.pulldom.default_bufsize\nxml.dom.pulldom.parse(??)\nxml.dom.pulldom.parseString(??)\nxml.dom.pulldom.types\nxml.dom.pulldom.xml\nxml.dom.registerDOMImplementation(name, factory)\nxml.dom.xmlbuilder.DOMBuilder(??)\nxml.dom.xmlbuilder.DOMBuilderFilter(??)\nxml.dom.xmlbuilder.DOMEntityResolver\nxml.dom.xmlbuilder.DOMImplementationLS(??)\nxml.dom.xmlbuilder.DOMInputSource\nxml.dom.xmlbuilder.DocumentLS(??)\nxml.dom.xmlbuilder.Options(??)\nxml.dom.xmlbuilder.copy\nxml.dom.xmlbuilder.xml\nxml.etree.ElementInclude.ElementTree\nxml.etree.ElementInclude.FatalIncludeError\nxml.etree.ElementInclude.XINCLUDE\nxml.etree.ElementInclude.XINCLUDE_FALLBACK\nxml.etree.ElementInclude.XINCLUDE_INCLUDE\nxml.etree.ElementInclude.copy\nxml.etree.ElementInclude.default_loader(??)\nxml.etree.ElementInclude.include(??)\nxml.etree.ElementPath.Path(??)\nxml.etree.ElementPath.find(??)\nxml.etree.ElementPath.findall(??)\nxml.etree.ElementPath.findtext(??)\nxml.etree.ElementPath.re\nxml.etree.ElementPath.xpath_descendant_or_self(??)\nxml.etree.ElementPath.xpath_tokenizer\nxml.etree.ElementTree.Comment(??)\nxml.etree.ElementTree.Element(??)\nxml.etree.ElementTree.ElementPath\nxml.etree.ElementTree.ElementTree(??)\nxml.etree.ElementTree.PI(??)\nxml.etree.ElementTree.ProcessingInstruction(??)\nxml.etree.ElementTree.QName(??)\nxml.etree.ElementTree.SubElement(??)\nxml.etree.ElementTree.TreeBuilder(??)\nxml.etree.ElementTree.VERSION\nxml.etree.ElementTree.XML(??)\nxml.etree.ElementTree.XMLID(??)\nxml.etree.ElementTree.XMLParser(??)\nxml.etree.ElementTree.XMLTreeBuilder(??)\nxml.etree.ElementTree.dump(??)\nxml.etree.ElementTree.fixtag(??)\nxml.etree.ElementTree.fromstring(??)\nxml.etree.ElementTree.iselement(??)\nxml.etree.ElementTree.iterparse(??)\nxml.etree.ElementTree.parse(??)\nxml.etree.ElementTree.re\nxml.etree.ElementTree.string\nxml.etree.ElementTree.sys\nxml.etree.ElementTree.tostring(??)\nxml.etree.cElementTree.Comment(??)\nxml.etree.cElementTree.Element\nxml.etree.cElementTree.ElementPath\nxml.etree.cElementTree.ElementTree(??)\nxml.etree.cElementTree.PI(??)\nxml.etree.cElementTree.ProcessingInstruction(??)\nxml.etree.cElementTree.QName(??)\nxml.etree.cElementTree.SubElement\nxml.etree.cElementTree.TreeBuilder\nxml.etree.cElementTree.VERSION\nxml.etree.cElementTree.XML(??)\nxml.etree.cElementTree.XMLID(??)\nxml.etree.cElementTree.XMLParser\nxml.etree.cElementTree.XMLParserError\nxml.etree.cElementTree.XMLTreeBuilder\nxml.etree.cElementTree.dump(??)\nxml.etree.cElementTree.fromstring(??)\nxml.etree.cElementTree.iselement(??)\nxml.etree.cElementTree.iterparse\nxml.etree.cElementTree.parse(??)\nxml.etree.cElementTree.tostring(??)\nxml.parsers\nxml.parsers.expat\nxml.parsers.expat.EXPAT_VERSION\nxml.parsers.expat.ErrorString(errno) -> string\nxml.parsers.expat.ExpatError\nxml.parsers.expat.ParserCreate([encoding[, namespace_separator]]) -> parser\nxml.parsers.expat.XMLParserType\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_ALWAYS\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_NEVER\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE\nxml.parsers.expat.error\nxml.parsers.expat.errors\nxml.parsers.expat.expat_CAPI\nxml.parsers.expat.features\nxml.parsers.expat.model\nxml.parsers.expat.native_encoding\nxml.parsers.expat.version_info\nxml.sax\nxml.sax.ContentHandler(??)\nxml.sax.ErrorHandler(??)\nxml.sax.InputSource(??)\nxml.sax.SAXException\nxml.sax.SAXNotRecognizedException\nxml.sax.SAXNotSupportedException\nxml.sax.SAXParseException\nxml.sax.SAXReaderNotAvailable\nxml.sax.default_parser_list\nxml.sax.expatreader.AttributesImpl(??)\nxml.sax.expatreader.AttributesNSImpl(??)\nxml.sax.expatreader.ExpatLocator(??)\nxml.sax.expatreader.ExpatParser(??)\nxml.sax.expatreader.SAXException\nxml.sax.expatreader.SAXNotRecognizedException\nxml.sax.expatreader.SAXNotSupportedException\nxml.sax.expatreader.SAXParseException\nxml.sax.expatreader.SAXReaderNotAvailable\nxml.sax.expatreader.create_parser(??)\nxml.sax.expatreader.expat\nxml.sax.expatreader.feature_external_ges\nxml.sax.expatreader.feature_external_pes\nxml.sax.expatreader.feature_namespace_prefixes\nxml.sax.expatreader.feature_namespaces\nxml.sax.expatreader.feature_string_interning\nxml.sax.expatreader.feature_validation\nxml.sax.expatreader.handler\nxml.sax.expatreader.property_interning_dict\nxml.sax.expatreader.property_xml_string\nxml.sax.expatreader.saxutils\nxml.sax.expatreader.version\nxml.sax.expatreader.xmlreader\nxml.sax.handler\nxml.sax.handler.ContentHandler(??)\nxml.sax.handler.DTDHandler(??)\nxml.sax.handler.EntityResolver(??)\nxml.sax.handler.ErrorHandler(??)\nxml.sax.handler.all_features\nxml.sax.handler.all_properties\nxml.sax.handler.feature_external_ges\nxml.sax.handler.feature_external_pes\nxml.sax.handler.feature_namespace_prefixes\nxml.sax.handler.feature_namespaces\nxml.sax.handler.feature_string_interning\nxml.sax.handler.feature_validation\nxml.sax.handler.property_declaration_handler\nxml.sax.handler.property_dom_node\nxml.sax.handler.property_encoding\nxml.sax.handler.property_interning_dict\nxml.sax.handler.property_lexical_handler\nxml.sax.handler.property_xml_string\nxml.sax.handler.version\nxml.sax.make_parser(??)\nxml.sax.parse(??)\nxml.sax.parseString(??)\nxml.sax.saxutils\nxml.sax.saxutils.XMLFilterBase(??)\nxml.sax.saxutils.XMLGenerator(??)\nxml.sax.saxutils.escape(??)\nxml.sax.saxutils.handler\nxml.sax.saxutils.os\nxml.sax.saxutils.prepare_input_source(??)\nxml.sax.saxutils.quoteattr(??)\nxml.sax.saxutils.types\nxml.sax.saxutils.unescape(??)\nxml.sax.saxutils.urllib\nxml.sax.saxutils.urlparse\nxml.sax.saxutils.xmlreader\nxml.sax.xmlreader\nxml.sax.xmlreader.AttributesImpl(??)\nxml.sax.xmlreader.AttributesNSImpl(??)\nxml.sax.xmlreader.IncrementalParser(??)\nxml.sax.xmlreader.InputSource(??)\nxml.sax.xmlreader.Locator(??)\nxml.sax.xmlreader.SAXNotRecognizedException\nxml.sax.xmlreader.SAXNotSupportedException\nxml.sax.xmlreader.XMLReader(??)\nxml.sax.xmlreader.handler\nxmllib.Error\nxmllib.TestXMLParser(??)\nxmllib.XMLParser(??)\nxmllib.amp\nxmllib.attrfind\nxmllib.attrtrans\nxmllib.cdataclose\nxmllib.cdataopen\nxmllib.charref\nxmllib.commentclose\nxmllib.commentopen\nxmllib.doctype\nxmllib.doubledash\nxmllib.endbracket\nxmllib.endbracketfind\nxmllib.endtagopen\nxmllib.entityref\nxmllib.illegal\nxmllib.interesting\nxmllib.ncname\nxmllib.newline\nxmllib.procclose\nxmllib.procopen\nxmllib.qname\nxmllib.re\nxmllib.ref\nxmllib.space\nxmllib.starttagend\nxmllib.starttagmatch\nxmllib.starttagopen\nxmllib.string\nxmllib.tagfind\nxmllib.test(??)\nxmllib.version\nxmllib.xmldecl\nxmllib.xmlns\nxmlrpclib.APPLICATION_ERROR\nxmlrpclib.Binary(??)\nxmlrpclib.Boolean\nxmlrpclib.BooleanType\nxmlrpclib.BufferType\nxmlrpclib.BuiltinFunctionType\nxmlrpclib.BuiltinMethodType\nxmlrpclib.ClassType\nxmlrpclib.CodeType\nxmlrpclib.ComplexType\nxmlrpclib.DateTime(??)\nxmlrpclib.DictProxyType\nxmlrpclib.DictType\nxmlrpclib.DictionaryType\nxmlrpclib.EllipsisType\nxmlrpclib.Error\nxmlrpclib.ExpatParser(??)\nxmlrpclib.False\nxmlrpclib.FastMarshaller\nxmlrpclib.FastParser\nxmlrpclib.FastUnmarshaller\nxmlrpclib.Fault\nxmlrpclib.FileType\nxmlrpclib.FloatType\nxmlrpclib.FrameType\nxmlrpclib.FunctionType\nxmlrpclib.GeneratorType\nxmlrpclib.GetSetDescriptorType\nxmlrpclib.INTERNAL_ERROR\nxmlrpclib.INVALID_ENCODING_CHAR\nxmlrpclib.INVALID_METHOD_PARAMS\nxmlrpclib.INVALID_XMLRPC\nxmlrpclib.InstanceType\nxmlrpclib.IntType\nxmlrpclib.LambdaType\nxmlrpclib.ListType\nxmlrpclib.LongType\nxmlrpclib.MAXINT\nxmlrpclib.METHOD_NOT_FOUND\nxmlrpclib.MININT\nxmlrpclib.Marshaller(??)\nxmlrpclib.MemberDescriptorType\nxmlrpclib.MethodType\nxmlrpclib.ModuleType\nxmlrpclib.MultiCall(??)\nxmlrpclib.MultiCallIterator(??)\nxmlrpclib.NOT_WELLFORMED_ERROR\nxmlrpclib.NoneType\nxmlrpclib.NotImplementedType\nxmlrpclib.ObjectType\nxmlrpclib.PARSE_ERROR\nxmlrpclib.ProtocolError\nxmlrpclib.ResponseError\nxmlrpclib.SERVER_ERROR\nxmlrpclib.SYSTEM_ERROR\nxmlrpclib.SafeTransport(??)\nxmlrpclib.Server(??)\nxmlrpclib.ServerProxy(??)\nxmlrpclib.SgmlopParser\nxmlrpclib.SliceType\nxmlrpclib.SlowParser(??)\nxmlrpclib.StringIO\nxmlrpclib.StringType\nxmlrpclib.StringTypes\nxmlrpclib.TRANSPORT_ERROR\nxmlrpclib.TracebackType\nxmlrpclib.Transport(??)\nxmlrpclib.True\nxmlrpclib.TupleType\nxmlrpclib.TypeType\nxmlrpclib.UNSUPPORTED_ENCODING\nxmlrpclib.UnboundMethodType\nxmlrpclib.UnicodeType\nxmlrpclib.Unmarshaller(??)\nxmlrpclib.WRAPPERS\nxmlrpclib.XRangeType\nxmlrpclib.base64\nxmlrpclib.boolean\nxmlrpclib.datetime\nxmlrpclib.dumps(??)\nxmlrpclib.escape(??)\nxmlrpclib.expat\nxmlrpclib.getparser() -> parser, unmarshaller\nxmlrpclib.loads(??)\nxmlrpclib.operator\nxmlrpclib.re\nxmlrpclib.string\nxmlrpclib.time\nxrange([start,] stop[, step]) -> xrange object\nxxsubtype.bench\nxxsubtype.spamdict\nxxsubtype.spamlist\nzip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\nzipfile.BadZipfile\nzipfile.LargeZipFile\nzipfile.PyZipFile(??)\nzipfile.ZIP64_LIMIT\nzipfile.ZIP_DEFLATED\nzipfile.ZIP_FILECOUNT_LIMIT\nzipfile.ZIP_MAX_COMMENT\nzipfile.ZIP_STORED\nzipfile.ZipExtFile(??)\nzipfile.ZipFile(??)\nzipfile.ZipInfo\nzipfile.binascii\nzipfile.cStringIO\nzipfile.crc32(string[, start]) -- Compute a CRC-32 checksum of string.\nzipfile.error\nzipfile.is_zipfile(??)\nzipfile.main(??)\nzipfile.os\nzipfile.shutil\nzipfile.sizeCentralDir\nzipfile.sizeEndCentDir\nzipfile.sizeEndCentDir64\nzipfile.sizeEndCentDir64Locator\nzipfile.sizeFileHeader\nzipfile.stringCentralDir\nzipfile.stringEndArchive\nzipfile.stringEndArchive64\nzipfile.stringEndArchive64Locator\nzipfile.stringFileHeader\nzipfile.struct\nzipfile.structCentralDir\nzipfile.structEndArchive\nzipfile.structEndArchive64\nzipfile.structEndArchive64Locator\nzipfile.structFileHeader\nzipfile.sys\nzipfile.time\nzipfile.zlib\nzipimport.ZipImportError\nzipimport.zipimporter(archivepath) -> zipimporter object\nzlib.DEFLATED\nzlib.DEF_MEM_LEVEL\nzlib.MAX_WBITS\nzlib.ZLIB_VERSION\nzlib.Z_BEST_COMPRESSION\nzlib.Z_BEST_SPEED\nzlib.Z_DEFAULT_COMPRESSION\nzlib.Z_DEFAULT_STRATEGY\nzlib.Z_FILTERED\nzlib.Z_FINISH\nzlib.Z_FULL_FLUSH\nzlib.Z_HUFFMAN_ONLY\nzlib.Z_NO_FLUSH\nzlib.Z_SYNC_FLUSH\nzlib.adler32(string[, start]) -- Compute an Adler-32 checksum of string.\nzlib.compress(string[, level]) -- Returned compressed string.\nzlib.compressobj([level]) -- Return a compressor object.\nzlib.crc32(string[, start]) -- Compute a CRC-32 checksum of string.\nzlib.decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\nzlib.decompressobj([wbits]) -- Return a decompressor object.\nzlib.error\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/qsci/api/python/Python-2.7.api",
    "content": "ArithmeticError\nAssertionError\nAttributeError\nBaseException\nBaseHTTPServer.BaseHTTPRequestHandler(??)\nBaseHTTPServer.DEFAULT_ERROR_CONTENT_TYPE\nBaseHTTPServer.DEFAULT_ERROR_MESSAGE\nBaseHTTPServer.HTTPServer(??)\nBaseHTTPServer.SocketServer\nBaseHTTPServer.catch_warnings\nBaseHTTPServer.filterwarnings(??)\nBaseHTTPServer.mimetools\nBaseHTTPServer.socket\nBaseHTTPServer.sys\nBaseHTTPServer.test(??)\nBaseHTTPServer.time\nBastion.Bastion(??)\nBastion.BastionClass(??)\nBastion.MethodType\nBufferError\nBytesWarning\nCGIHTTPServer.BaseHTTPServer\nCGIHTTPServer.CGIHTTPRequestHandler(??)\nCGIHTTPServer.SimpleHTTPServer\nCGIHTTPServer.executable(??)\nCGIHTTPServer.nobody\nCGIHTTPServer.nobody_uid(??)\nCGIHTTPServer.os\nCGIHTTPServer.select\nCGIHTTPServer.sys\nCGIHTTPServer.test(??)\nCGIHTTPServer.urllib\nConfigParser.ConfigParser(??)\nConfigParser.DEFAULTSECT\nConfigParser.DuplicateSectionError\nConfigParser.Error\nConfigParser.InterpolationDepthError\nConfigParser.InterpolationError\nConfigParser.InterpolationMissingOptionError\nConfigParser.InterpolationSyntaxError\nConfigParser.MAX_INTERPOLATION_DEPTH\nConfigParser.MissingSectionHeaderError\nConfigParser.NoOptionError\nConfigParser.NoSectionError\nConfigParser.ParsingError\nConfigParser.RawConfigParser(??)\nConfigParser.SafeConfigParser(??)\nConfigParser.re\nCookie.BaseCookie\nCookie.Cookie\nCookie.CookieError\nCookie.Morsel\nCookie.SerialCookie\nCookie.SimpleCookie\nCookie.SmartCookie\nCookie.dumps(obj, protocol=0) -- Return a string containing an object in pickle format.\nCookie.loads(string) -- Load a pickle from the given string\nCookie.re\nCookie.string\nCookie.warnings\nDeprecationWarning\nDocXMLRPCServer.CGIXMLRPCRequestHandler(??)\nDocXMLRPCServer.DocCGIXMLRPCRequestHandler(??)\nDocXMLRPCServer.DocXMLRPCRequestHandler(??)\nDocXMLRPCServer.DocXMLRPCServer(??)\nDocXMLRPCServer.ServerHTMLDoc(??)\nDocXMLRPCServer.SimpleXMLRPCRequestHandler(??)\nDocXMLRPCServer.SimpleXMLRPCServer(??)\nDocXMLRPCServer.XMLRPCDocGenerator(??)\nDocXMLRPCServer.inspect\nDocXMLRPCServer.pydoc\nDocXMLRPCServer.re\nDocXMLRPCServer.resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d\nDocXMLRPCServer.sys\nEOFError\nEllipsis\nEnvironmentError\nException\nFalse\nFloatingPointError\nFutureWarning\nGeneratorExit\nHTMLParser.HTMLParseError\nHTMLParser.HTMLParser(??)\nHTMLParser.attrfind\nHTMLParser.charref\nHTMLParser.commentclose\nHTMLParser.endendtag\nHTMLParser.endtagfind\nHTMLParser.entityref\nHTMLParser.incomplete\nHTMLParser.interesting_cdata\nHTMLParser.interesting_normal\nHTMLParser.locatestarttagend\nHTMLParser.markupbase\nHTMLParser.piclose\nHTMLParser.re\nHTMLParser.starttagopen\nHTMLParser.tagfind\nIOError\nImportError\nImportWarning\nIndentationError\nIndexError\nKeyError\nKeyboardInterrupt\nLookupError\nMemoryError\nMimeWriter.MimeWriter(??)\nMimeWriter.mimetools\nMimeWriter.warnings\nNameError\nNone\nNotImplemented\nNotImplementedError\nOSError\nOverflowError\nPendingDeprecationWarning\nQueue.Empty\nQueue.Full\nQueue.LifoQueue(??)\nQueue.PriorityQueue(??)\nQueue.Queue(??)\nQueue.deque(iterable[, maxlen]) --> deque object\nQueue.heapq\nReferenceError\nRuntimeError\nRuntimeWarning\nSimpleHTTPServer.BaseHTTPServer\nSimpleHTTPServer.SimpleHTTPRequestHandler(??)\nSimpleHTTPServer.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nSimpleHTTPServer.cgi\nSimpleHTTPServer.mimetypes\nSimpleHTTPServer.os\nSimpleHTTPServer.posixpath\nSimpleHTTPServer.shutil\nSimpleHTTPServer.test(??)\nSimpleHTTPServer.urllib\nSimpleXMLRPCServer.BaseHTTPServer\nSimpleXMLRPCServer.CGIXMLRPCRequestHandler(??)\nSimpleXMLRPCServer.Fault\nSimpleXMLRPCServer.MultiPathXMLRPCServer(??)\nSimpleXMLRPCServer.SimpleXMLRPCDispatcher(??)\nSimpleXMLRPCServer.SimpleXMLRPCRequestHandler(??)\nSimpleXMLRPCServer.SimpleXMLRPCServer(??)\nSimpleXMLRPCServer.SocketServer\nSimpleXMLRPCServer.fcntl\nSimpleXMLRPCServer.list_public_methods(??)\nSimpleXMLRPCServer.os\nSimpleXMLRPCServer.re\nSimpleXMLRPCServer.remove_duplicates([2,2,2,1,3,3]) => [3,1,2]\nSimpleXMLRPCServer.resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d\nSimpleXMLRPCServer.sys\nSimpleXMLRPCServer.traceback\nSimpleXMLRPCServer.xmlrpclib\nSocketServer.BaseRequestHandler(??)\nSocketServer.BaseServer(??)\nSocketServer.DatagramRequestHandler(??)\nSocketServer.ForkingMixIn(??)\nSocketServer.ForkingTCPServer(??)\nSocketServer.ForkingUDPServer(??)\nSocketServer.StreamRequestHandler(??)\nSocketServer.TCPServer(??)\nSocketServer.ThreadingMixIn(??)\nSocketServer.ThreadingTCPServer(??)\nSocketServer.ThreadingUDPServer(??)\nSocketServer.ThreadingUnixDatagramServer(??)\nSocketServer.ThreadingUnixStreamServer(??)\nSocketServer.UDPServer(??)\nSocketServer.UnixDatagramServer(??)\nSocketServer.UnixStreamServer(??)\nSocketServer.os\nSocketServer.select\nSocketServer.socket\nSocketServer.sys\nSocketServer.threading\nStandardError\nStopIteration\nStringIO.EINVAL\nStringIO.StringIO(??)\nStringIO.test(??)\nSyntaxError\nSyntaxWarning\nSystemError\nSystemExit\nTabError\nTrue\nTypeError\nUnboundLocalError\nUnicodeDecodeError\nUnicodeEncodeError\nUnicodeError\nUnicodeTranslateError\nUnicodeWarning\nUserDict.DictMixin(??)\nUserDict.IterableUserDict(??)\nUserDict.UserDict(??)\nUserList.UserList\nUserList.collections\nUserString.MutableString\nUserString.UserString\nUserString.collections\nUserString.sys\nUserWarning\nValueError\nWarning\nZeroDivisionError\nabc.ABCMeta\nabc.abstractmethod(??)\nabc.abstractproperty\nabc.types\nabs(number) -> number\naifc.Aifc_read(??)\naifc.Aifc_write(??)\naifc.Chunk(??)\naifc.Error\naifc.open(??)\naifc.openfp(??)\naifc.struct\nall(iterable) -> bool\nantigravity.webbrowser\nany(iterable) -> bool\nanydbm.error\nanydbm.open(??)\napply(object[, args[, kwargs]]) -> value\nargparse.Action\nargparse.ArgumentDefaultsHelpFormatter\nargparse.ArgumentError\nargparse.ArgumentParser\nargparse.ArgumentTypeError\nargparse.FileType\nargparse.HelpFormatter\nargparse.Namespace\nargparse.ONE_OR_MORE\nargparse.OPTIONAL\nargparse.PARSER\nargparse.REMAINDER\nargparse.RawDescriptionHelpFormatter\nargparse.RawTextHelpFormatter\nargparse.SUPPRESS\nargparse.ZERO_OR_MORE\narray.ArrayType\narray.array(typecode [, initializer]) -> array\nast.AST\nast.Add\nast.And\nast.Assert\nast.Assign\nast.Attribute\nast.AugAssign\nast.AugLoad\nast.AugStore\nast.BinOp\nast.BitAnd\nast.BitOr\nast.BitXor\nast.BoolOp\nast.Break\nast.Call\nast.ClassDef\nast.Compare\nast.Continue\nast.Del\nast.Delete\nast.Dict\nast.DictComp\nast.Div\nast.Ellipsis\nast.Eq\nast.ExceptHandler\nast.Exec\nast.Expr\nast.Expression\nast.ExtSlice\nast.FloorDiv\nast.For\nast.FunctionDef\nast.GeneratorExp\nast.Global\nast.Gt\nast.GtE\nast.If\nast.IfExp\nast.Import\nast.ImportFrom\nast.In\nast.Index\nast.Interactive\nast.Invert\nast.Is\nast.IsNot\nast.LShift\nast.Lambda\nast.List\nast.ListComp\nast.Load\nast.Lt\nast.LtE\nast.Mod\nast.Module\nast.Mult\nast.Name\nast.NodeTransformer\nast.NodeVisitor\nast.Not\nast.NotEq\nast.NotIn\nast.Num\nast.Or\nast.Param\nast.Pass\nast.Pow\nast.Print\nast.PyCF_ONLY_AST\nast.RShift\nast.Raise\nast.Repr\nast.Return\nast.Set\nast.SetComp\nast.Slice\nast.Store\nast.Str\nast.Sub\nast.Subscript\nast.Suite\nast.TryExcept\nast.TryFinally\nast.Tuple\nast.UAdd\nast.USub\nast.UnaryOp\nast.While\nast.With\nast.Yield\nast.alias\nast.arguments\nast.boolop\nast.cmpop\nast.comprehension\nast.copy_location(??)\nast.dump(??)\nast.excepthandler\nast.expr\nast.expr_context\nast.fix_missing_locations(??)\nast.get_docstring(??)\nast.increment_lineno(??)\nast.iter_child_nodes(??)\nast.iter_fields(??)\nast.keyword\nast.literal_eval(??)\nast.mod\nast.operator\nast.parse(??)\nast.slice\nast.stmt\nast.unaryop\nast.walk(??)\nasynchat.async_chat(??)\nasynchat.asyncore\nasynchat.catch_warnings\nasynchat.deque(iterable[, maxlen]) --> deque object\nasynchat.fifo(??)\nasynchat.filterwarnings(??)\nasynchat.find_prefix_at_end(??)\nasynchat.py3kwarning\nasynchat.simple_producer(??)\nasynchat.socket\nasyncore.EALREADY\nasyncore.EBADF\nasyncore.ECONNABORTED\nasyncore.ECONNRESET\nasyncore.EINPROGRESS\nasyncore.EINTR\nasyncore.EISCONN\nasyncore.ENOTCONN\nasyncore.ESHUTDOWN\nasyncore.EWOULDBLOCK\nasyncore.ExitNow\nasyncore.close_all(??)\nasyncore.compact_traceback(??)\nasyncore.dispatcher(??)\nasyncore.dispatcher_with_send(??)\nasyncore.errorcode\nasyncore.fcntl\nasyncore.file_dispatcher(??)\nasyncore.file_wrapper(??)\nasyncore.loop(??)\nasyncore.os\nasyncore.poll(??)\nasyncore.poll2(??)\nasyncore.poll3(??)\nasyncore.read(??)\nasyncore.readwrite(??)\nasyncore.select\nasyncore.socket\nasyncore.socket_map\nasyncore.sys\nasyncore.time\nasyncore.warnings\nasyncore.write(??)\natexit.register(??)\natexit.sys\naudiodev.AudioDev(??)\naudiodev.Play_Audio_sgi(??)\naudiodev.Play_Audio_sun(??)\naudiodev.error\naudiodev.test(??)\naudioop.add\naudioop.adpcm2lin\naudioop.alaw2lin\naudioop.avg\naudioop.avgpp\naudioop.bias\naudioop.cross\naudioop.error\naudioop.findfactor\naudioop.findfit\naudioop.findmax\naudioop.getsample\naudioop.lin2adpcm\naudioop.lin2alaw\naudioop.lin2lin\naudioop.lin2ulaw\naudioop.max\naudioop.maxpp\naudioop.minmax\naudioop.mul\naudioop.ratecv\naudioop.reverse\naudioop.rms\naudioop.tomono\naudioop.tostereo\naudioop.ulaw2lin\nbase64.EMPTYSTRING\nbase64.MAXBINSIZE\nbase64.MAXLINESIZE\nbase64.b16decode(??)\nbase64.b16encode(??)\nbase64.b32decode(??)\nbase64.b32encode(??)\nbase64.b64decode(??)\nbase64.b64encode(??)\nbase64.binascii\nbase64.decode(??)\nbase64.decodestring(??)\nbase64.encode(??)\nbase64.encodestring(??)\nbase64.k\nbase64.re\nbase64.standard_b64decode(??)\nbase64.standard_b64encode(??)\nbase64.struct\nbase64.test(??)\nbase64.test1(??)\nbase64.urlsafe_b64decode(??)\nbase64.urlsafe_b64encode(??)\nbase64.v\nbasestring\nbdb.Bdb(??)\nbdb.BdbQuit\nbdb.Breakpoint(??)\nbdb.Tdb(??)\nbdb.bar(??)\nbdb.checkfuncname(??)\nbdb.effective(??)\nbdb.fnmatch\nbdb.foo(??)\nbdb.os\nbdb.set_trace(??)\nbdb.sys\nbdb.test(??)\nbdb.types\nbin(number) -> string\nbinascii.Error\nbinascii.Incomplete\nbinascii.a2b_base64\nbinascii.a2b_hex(hexstr) -> s; Binary data of hexadecimal representation.\nbinascii.a2b_hqx\nbinascii.a2b_qp\nbinascii.a2b_uu\nbinascii.b2a_base64\nbinascii.b2a_hex(data) -> s; Hexadecimal representation of binary data.\nbinascii.b2a_hqx\nbinascii.b2a_qp(data, quotetabs=0, istext=1, header=0) -> s;\nbinascii.b2a_uu\nbinascii.crc32\nbinascii.crc_hqx\nbinascii.hexlify\nbinascii.rlecode_hqx\nbinascii.rledecode_hqx\nbinascii.unhexlify\nbinhex.BinHex(??)\nbinhex.Error\nbinhex.FInfo(??)\nbinhex.HexBin(??)\nbinhex.LINELEN\nbinhex.REASONABLY_LARGE\nbinhex.RUNCHAR\nbinhex.binascii\nbinhex.binhex(??)\nbinhex.getfileinfo(??)\nbinhex.hexbin(??)\nbinhex.openrsrc(??)\nbinhex.os\nbinhex.struct\nbinhex.sys\nbisect.bisect\nbisect.bisect_left(a, x[, lo[, hi]]) -> index\nbisect.bisect_right(a, x[, lo[, hi]]) -> index\nbisect.insort\nbisect.insort_left(a, x[, lo[, hi]])\nbisect.insort_right(a, x[, lo[, hi]])\nbool(x) -> bool\nbuffer(object [, offset[, size]])\nbytearray(iterable_of_ints) -> bytearray.\nbytes\ncPickle.BadPickleGet\ncPickle.HIGHEST_PROTOCOL\ncPickle.PickleError\ncPickle.Pickler(file, protocol=0) -- Create a pickler.\ncPickle.PicklingError\ncPickle.UnpickleableError\ncPickle.Unpickler(file) -- Create an unpickler.\ncPickle.UnpicklingError\ncPickle.compatible_formats\ncPickle.dump(obj, file, protocol=0) -- Write an object in pickle format to the given file.\ncPickle.dumps(obj, protocol=0) -- Return a string containing an object in pickle format.\ncPickle.format_version\ncPickle.load(file) -- Load a pickle from the given file\ncPickle.loads(string) -- Load a pickle from the given string\ncProfile.Profile(custom_timer=None, time_unit=None, subcalls=True, builtins=True)\ncProfile.help(??)\ncProfile.label(??)\ncProfile.main(??)\ncProfile.run(??)\ncProfile.runctx(??)\ncStringIO.InputType\ncStringIO.OutputType\ncStringIO.StringIO([s]) -- Return a StringIO-like stream for reading or writing\ncStringIO.cStringIO_CAPI\ncalendar.Calendar\ncalendar.EPOCH\ncalendar.FRIDAY\ncalendar.February\ncalendar.HTMLCalendar\ncalendar.IllegalMonthError\ncalendar.IllegalWeekdayError\ncalendar.January\ncalendar.LocaleHTMLCalendar\ncalendar.LocaleTextCalendar\ncalendar.MONDAY\ncalendar.SATURDAY\ncalendar.SUNDAY\ncalendar.THURSDAY\ncalendar.TUESDAY\ncalendar.TextCalendar\ncalendar.TimeEncoding(??)\ncalendar.WEDNESDAY\ncalendar.c\ncalendar.calendar\ncalendar.datetime\ncalendar.day_abbr\ncalendar.day_name\ncalendar.error\ncalendar.firstweekday\ncalendar.format(??)\ncalendar.formatstring(??)\ncalendar.isleap(??)\ncalendar.leapdays(??)\ncalendar.main(??)\ncalendar.mdays\ncalendar.month\ncalendar.month_abbr\ncalendar.month_name\ncalendar.monthcalendar\ncalendar.monthrange(??)\ncalendar.prcal\ncalendar.prmonth\ncalendar.prweek\ncalendar.setfirstweekday(??)\ncalendar.sys\ncalendar.timegm(??)\ncalendar.week\ncalendar.weekday(??)\ncalendar.weekheader\ncallable(object) -> bool\ncgi.FieldStorage(??)\ncgi.FormContent(??)\ncgi.FormContentDict(??)\ncgi.InterpFormContentDict(??)\ncgi.MiniFieldStorage(??)\ncgi.StringIO([s]) -- Return a StringIO-like stream for reading or writing\ncgi.SvFormContentDict(??)\ncgi.UserDict\ncgi.attrgetter(attr, ...) --> attrgetter object\ncgi.catch_warnings\ncgi.dolog(??)\ncgi.escape(??)\ncgi.filterwarnings(??)\ncgi.initlog(??)\ncgi.log(??)\ncgi.logfile\ncgi.logfp\ncgi.maxlen\ncgi.mimetools\ncgi.nolog(??)\ncgi.os\ncgi.parse(??)\ncgi.parse_header(??)\ncgi.parse_multipart(??)\ncgi.parse_qs(??)\ncgi.parse_qsl(??)\ncgi.print_arguments(??)\ncgi.print_directory(??)\ncgi.print_environ(??)\ncgi.print_environ_usage(??)\ncgi.print_exception(??)\ncgi.print_form(??)\ncgi.rfc822\ncgi.sys\ncgi.test(??)\ncgi.urllib\ncgi.urlparse\ncgi.valid_boundary(??)\ncgi.warn\ncgitb.Hook(??)\ncgitb.enable(??)\ncgitb.grey(??)\ncgitb.handler\ncgitb.html(??)\ncgitb.inspect\ncgitb.keyword\ncgitb.linecache\ncgitb.lookup(??)\ncgitb.os\ncgitb.pydoc\ncgitb.reset(??)\ncgitb.scanvars(??)\ncgitb.small(??)\ncgitb.strong(??)\ncgitb.sys\ncgitb.tempfile\ncgitb.text(??)\ncgitb.time\ncgitb.tokenize\ncgitb.traceback\ncgitb.types\nchr(i) -> character\nchunk.Chunk(??)\nclassmethod(function) -> method\ncmath.acos(x)\ncmath.acosh(x)\ncmath.asin(x)\ncmath.asinh(x)\ncmath.atan(x)\ncmath.atanh(x)\ncmath.cos(x)\ncmath.cosh(x)\ncmath.e\ncmath.exp(x)\ncmath.isinf(z) -> bool\ncmath.isnan(z) -> bool\ncmath.log(x[, base]) -> the logarithm of x to the given base.\ncmath.log10(x)\ncmath.phase(z) -> float\ncmath.pi\ncmath.polar(z) -> r: float, phi: float\ncmath.rect(r, phi) -> z: complex\ncmath.sin(x)\ncmath.sinh(x)\ncmath.sqrt(x)\ncmath.tan(x)\ncmath.tanh(x)\ncmd.Cmd(??)\ncmd.IDENTCHARS\ncmd.PROMPT\ncmd.string\ncmp(x, y) -> integer\ncode.CommandCompiler(??)\ncode.InteractiveConsole(??)\ncode.InteractiveInterpreter(??)\ncode.compile_command(??)\ncode.interact(??)\ncode.softspace(??)\ncode.sys\ncode.traceback\ncodecs.BOM\ncodecs.BOM32_BE\ncodecs.BOM32_LE\ncodecs.BOM64_BE\ncodecs.BOM64_LE\ncodecs.BOM_BE\ncodecs.BOM_LE\ncodecs.BOM_UTF16\ncodecs.BOM_UTF16_BE\ncodecs.BOM_UTF16_LE\ncodecs.BOM_UTF32\ncodecs.BOM_UTF32_BE\ncodecs.BOM_UTF32_LE\ncodecs.BOM_UTF8\ncodecs.BufferedIncrementalDecoder\ncodecs.BufferedIncrementalEncoder\ncodecs.Codec(??)\ncodecs.CodecInfo\ncodecs.EncodedFile(??)\ncodecs.IncrementalDecoder\ncodecs.IncrementalEncoder\ncodecs.StreamReader(??)\ncodecs.StreamReaderWriter(??)\ncodecs.StreamRecoder(??)\ncodecs.StreamWriter(??)\ncodecs.ascii_decode\ncodecs.ascii_encode\ncodecs.backslashreplace_errors\ncodecs.charbuffer_encode\ncodecs.charmap_build\ncodecs.charmap_decode\ncodecs.charmap_encode\ncodecs.decode(obj, [encoding[,errors]]) -> object\ncodecs.encode(obj, [encoding[,errors]]) -> object\ncodecs.escape_decode\ncodecs.escape_encode\ncodecs.getdecoder(??)\ncodecs.getencoder(??)\ncodecs.getincrementaldecoder(??)\ncodecs.getincrementalencoder(??)\ncodecs.getreader(??)\ncodecs.getwriter(??)\ncodecs.ignore_errors\ncodecs.iterdecode(??)\ncodecs.iterencode(??)\ncodecs.latin_1_decode\ncodecs.latin_1_encode\ncodecs.lookup(encoding) -> CodecInfo\ncodecs.lookup_error(errors) -> handler\ncodecs.make_encoding_map(??)\ncodecs.make_identity_dict(rng) -> dict\ncodecs.open(??)\ncodecs.raw_unicode_escape_decode\ncodecs.raw_unicode_escape_encode\ncodecs.readbuffer_encode\ncodecs.register(search_function)\ncodecs.register_error(errors, handler)\ncodecs.replace_errors\ncodecs.strict_errors\ncodecs.sys\ncodecs.unicode_escape_decode\ncodecs.unicode_escape_encode\ncodecs.unicode_internal_decode\ncodecs.unicode_internal_encode\ncodecs.utf_16_be_decode\ncodecs.utf_16_be_encode\ncodecs.utf_16_decode\ncodecs.utf_16_encode\ncodecs.utf_16_ex_decode\ncodecs.utf_16_le_decode\ncodecs.utf_16_le_encode\ncodecs.utf_32_be_decode\ncodecs.utf_32_be_encode\ncodecs.utf_32_decode\ncodecs.utf_32_encode\ncodecs.utf_32_ex_decode\ncodecs.utf_32_le_decode\ncodecs.utf_32_le_encode\ncodecs.utf_7_decode\ncodecs.utf_7_encode\ncodecs.utf_8_decode\ncodecs.utf_8_encode\ncodecs.xmlcharrefreplace_errors\ncodeop.CommandCompiler(??)\ncodeop.Compile(??)\ncodeop.PyCF_DONT_IMPLY_DEDENT\ncodeop.compile_command(??)\ncodeop.fname\ncoerce(x, y) -> (x1, y1)\ncollections.Callable\ncollections.Container\ncollections.Counter\ncollections.Hashable\ncollections.ItemsView\ncollections.Iterable\ncollections.Iterator\ncollections.KeysView\ncollections.Mapping\ncollections.MappingView\ncollections.MutableMapping\ncollections.MutableSequence\ncollections.MutableSet\ncollections.OrderedDict\ncollections.Sequence\ncollections.Set\ncollections.Sized\ncollections.ValuesView\ncollections.defaultdict(default_factory) --> dict with default factory\ncollections.deque(iterable[, maxlen]) --> deque object\ncollections.namedtuple(??)\ncolorsys.ONE_SIXTH\ncolorsys.ONE_THIRD\ncolorsys.TWO_THIRD\ncolorsys.hls_to_rgb(??)\ncolorsys.hsv_to_rgb(??)\ncolorsys.rgb_to_hls(??)\ncolorsys.rgb_to_hsv(??)\ncolorsys.rgb_to_yiq(??)\ncolorsys.yiq_to_rgb(??)\ncommands.getoutput(??)\ncommands.getstatus(??)\ncommands.getstatusoutput(??)\ncommands.mk2arg(??)\ncommands.mkarg(??)\ncompile(source, filename, mode[, flags[, dont_inherit]]) -> code object\ncompileall.compile_dir(??)\ncompileall.compile_file(??)\ncompileall.compile_path(??)\ncompileall.expand_args(??)\ncompileall.imp\ncompileall.main(??)\ncompileall.os\ncompileall.py_compile\ncompileall.struct\ncompileall.sys\ncompiler.ast\ncompiler.ast.Add(??)\ncompiler.ast.And(??)\ncompiler.ast.AssAttr(??)\ncompiler.ast.AssList(??)\ncompiler.ast.AssName(??)\ncompiler.ast.AssTuple(??)\ncompiler.ast.Assert(??)\ncompiler.ast.Assign(??)\ncompiler.ast.AugAssign(??)\ncompiler.ast.Backquote(??)\ncompiler.ast.Bitand(??)\ncompiler.ast.Bitor(??)\ncompiler.ast.Bitxor(??)\ncompiler.ast.Break(??)\ncompiler.ast.CO_VARARGS\ncompiler.ast.CO_VARKEYWORDS\ncompiler.ast.CallFunc(??)\ncompiler.ast.Class(??)\ncompiler.ast.Compare(??)\ncompiler.ast.Const(??)\ncompiler.ast.Continue(??)\ncompiler.ast.Decorators(??)\ncompiler.ast.Dict(??)\ncompiler.ast.DictComp(??)\ncompiler.ast.Discard(??)\ncompiler.ast.Div(??)\ncompiler.ast.Ellipsis(??)\ncompiler.ast.EmptyNode(??)\ncompiler.ast.Exec(??)\ncompiler.ast.Expression(??)\ncompiler.ast.FloorDiv(??)\ncompiler.ast.For(??)\ncompiler.ast.From(??)\ncompiler.ast.Function(??)\ncompiler.ast.GenExpr(??)\ncompiler.ast.GenExprFor(??)\ncompiler.ast.GenExprIf(??)\ncompiler.ast.GenExprInner(??)\ncompiler.ast.Getattr(??)\ncompiler.ast.Global(??)\ncompiler.ast.If(??)\ncompiler.ast.IfExp(??)\ncompiler.ast.Import(??)\ncompiler.ast.Invert(??)\ncompiler.ast.Keyword(??)\ncompiler.ast.Lambda(??)\ncompiler.ast.LeftShift(??)\ncompiler.ast.List(??)\ncompiler.ast.ListComp(??)\ncompiler.ast.ListCompFor(??)\ncompiler.ast.ListCompIf(??)\ncompiler.ast.Mod(??)\ncompiler.ast.Module(??)\ncompiler.ast.Mul(??)\ncompiler.ast.Name(??)\ncompiler.ast.Node(??)\ncompiler.ast.Not(??)\ncompiler.ast.Or(??)\ncompiler.ast.Pass(??)\ncompiler.ast.Power(??)\ncompiler.ast.Print(??)\ncompiler.ast.Printnl(??)\ncompiler.ast.Raise(??)\ncompiler.ast.Return(??)\ncompiler.ast.RightShift(??)\ncompiler.ast.Set(??)\ncompiler.ast.SetComp(??)\ncompiler.ast.Slice(??)\ncompiler.ast.Sliceobj(??)\ncompiler.ast.Stmt(??)\ncompiler.ast.Sub(??)\ncompiler.ast.Subscript(??)\ncompiler.ast.TryExcept(??)\ncompiler.ast.TryFinally(??)\ncompiler.ast.Tuple(??)\ncompiler.ast.UnaryAdd(??)\ncompiler.ast.UnarySub(??)\ncompiler.ast.While(??)\ncompiler.ast.With(??)\ncompiler.ast.Yield(??)\ncompiler.ast.flatten(??)\ncompiler.ast.flatten_nodes(??)\ncompiler.ast.name\ncompiler.ast.nodes\ncompiler.ast.obj(??)\ncompiler.compile(??)\ncompiler.compileFile(??)\ncompiler.consts\ncompiler.consts.CO_FUTURE_ABSIMPORT\ncompiler.consts.CO_FUTURE_DIVISION\ncompiler.consts.CO_FUTURE_PRINT_FUNCTION\ncompiler.consts.CO_FUTURE_WITH_STATEMENT\ncompiler.consts.CO_GENERATOR\ncompiler.consts.CO_GENERATOR_ALLOWED\ncompiler.consts.CO_NESTED\ncompiler.consts.CO_NEWLOCALS\ncompiler.consts.CO_OPTIMIZED\ncompiler.consts.CO_VARARGS\ncompiler.consts.CO_VARKEYWORDS\ncompiler.consts.OP_APPLY\ncompiler.consts.OP_ASSIGN\ncompiler.consts.OP_DELETE\ncompiler.consts.SC_CELL\ncompiler.consts.SC_FREE\ncompiler.consts.SC_GLOBAL_EXPLICT\ncompiler.consts.SC_GLOBAL_IMPLICIT\ncompiler.consts.SC_LOCAL\ncompiler.consts.SC_UNKNOWN\ncompiler.future\ncompiler.future.BadFutureParser(??)\ncompiler.future.FutureParser(??)\ncompiler.future.ast\ncompiler.future.find_futures(??)\ncompiler.future.is_future(??)\ncompiler.future.walk(??)\ncompiler.misc\ncompiler.misc.MANGLE_LEN\ncompiler.misc.Set(??)\ncompiler.misc.Stack(??)\ncompiler.misc.flatten(??)\ncompiler.misc.mangle(??)\ncompiler.misc.set_filename(??)\ncompiler.parse(??)\ncompiler.parseFile(??)\ncompiler.pyassem\ncompiler.pyassem.Block(??)\ncompiler.pyassem.CONV\ncompiler.pyassem.CO_NEWLOCALS\ncompiler.pyassem.CO_OPTIMIZED\ncompiler.pyassem.CO_VARARGS\ncompiler.pyassem.CO_VARKEYWORDS\ncompiler.pyassem.DONE\ncompiler.pyassem.FLAT\ncompiler.pyassem.FlowGraph(??)\ncompiler.pyassem.LineAddrTable(??)\ncompiler.pyassem.PyFlowGraph(??)\ncompiler.pyassem.RAW\ncompiler.pyassem.StackDepthTracker(??)\ncompiler.pyassem.TupleArg(??)\ncompiler.pyassem.dis\ncompiler.pyassem.findDepth\ncompiler.pyassem.getArgCount(??)\ncompiler.pyassem.isJump(??)\ncompiler.pyassem.misc\ncompiler.pyassem.order_blocks(??)\ncompiler.pyassem.sys\ncompiler.pyassem.twobyte(??)\ncompiler.pyassem.types\ncompiler.pycodegen\ncompiler.pycodegen.AbstractClassCode(??)\ncompiler.pycodegen.AbstractCompileMode(??)\ncompiler.pycodegen.AbstractFunctionCode(??)\ncompiler.pycodegen.AugGetattr(??)\ncompiler.pycodegen.AugName(??)\ncompiler.pycodegen.AugSlice(??)\ncompiler.pycodegen.AugSubscript(??)\ncompiler.pycodegen.CO_FUTURE_ABSIMPORT\ncompiler.pycodegen.CO_FUTURE_DIVISION\ncompiler.pycodegen.CO_FUTURE_PRINT_FUNCTION\ncompiler.pycodegen.CO_FUTURE_WITH_STATEMENT\ncompiler.pycodegen.CO_GENERATOR\ncompiler.pycodegen.CO_NESTED\ncompiler.pycodegen.CO_NEWLOCALS\ncompiler.pycodegen.CO_VARARGS\ncompiler.pycodegen.CO_VARKEYWORDS\ncompiler.pycodegen.ClassCodeGenerator(??)\ncompiler.pycodegen.CodeGenerator(??)\ncompiler.pycodegen.Delegator(??)\ncompiler.pycodegen.END_FINALLY\ncompiler.pycodegen.EXCEPT\ncompiler.pycodegen.Expression(??)\ncompiler.pycodegen.ExpressionCodeGenerator(??)\ncompiler.pycodegen.FunctionCodeGenerator(??)\ncompiler.pycodegen.GenExprCodeGenerator(??)\ncompiler.pycodegen.Interactive(??)\ncompiler.pycodegen.InteractiveCodeGenerator(??)\ncompiler.pycodegen.LOOP\ncompiler.pycodegen.LocalNameFinder(??)\ncompiler.pycodegen.Module(??)\ncompiler.pycodegen.ModuleCodeGenerator(??)\ncompiler.pycodegen.NestedScopeMixin(??)\ncompiler.pycodegen.OpFinder(??)\ncompiler.pycodegen.SC_CELL\ncompiler.pycodegen.SC_FREE\ncompiler.pycodegen.SC_GLOBAL_EXPLICT\ncompiler.pycodegen.SC_GLOBAL_IMPLICIT\ncompiler.pycodegen.SC_LOCAL\ncompiler.pycodegen.StringIO([s]) -- Return a StringIO-like stream for reading or writing\ncompiler.pycodegen.TRY_FINALLY\ncompiler.pycodegen.TupleArg(??)\ncompiler.pycodegen.VERSION\ncompiler.pycodegen.ast\ncompiler.pycodegen.callfunc_opcode_info\ncompiler.pycodegen.compile(??)\ncompiler.pycodegen.compileFile(??)\ncompiler.pycodegen.findOp(??)\ncompiler.pycodegen.future\ncompiler.pycodegen.generateArgList(??)\ncompiler.pycodegen.imp\ncompiler.pycodegen.is_constant_false(??)\ncompiler.pycodegen.marshal\ncompiler.pycodegen.misc\ncompiler.pycodegen.os\ncompiler.pycodegen.parse(??)\ncompiler.pycodegen.pyassem\ncompiler.pycodegen.struct\ncompiler.pycodegen.symbols\ncompiler.pycodegen.syntax\ncompiler.pycodegen.sys\ncompiler.pycodegen.walk(??)\ncompiler.pycodegen.wrap_aug(??)\ncompiler.pycodegen.wrapper\ncompiler.symbols\ncompiler.symbols.ClassScope(??)\ncompiler.symbols.FunctionScope(??)\ncompiler.symbols.GenExprScope(??)\ncompiler.symbols.LambdaScope(??)\ncompiler.symbols.MANGLE_LEN\ncompiler.symbols.ModuleScope(??)\ncompiler.symbols.SC_CELL\ncompiler.symbols.SC_FREE\ncompiler.symbols.SC_GLOBAL_EXPLICT\ncompiler.symbols.SC_GLOBAL_IMPLICIT\ncompiler.symbols.SC_LOCAL\ncompiler.symbols.SC_UNKNOWN\ncompiler.symbols.Scope(??)\ncompiler.symbols.SymbolVisitor(??)\ncompiler.symbols.ast\ncompiler.symbols.list_eq(??)\ncompiler.symbols.mangle(??)\ncompiler.symbols.sys\ncompiler.symbols.types\ncompiler.syntax\ncompiler.syntax.SyntaxErrorChecker(??)\ncompiler.syntax.ast\ncompiler.syntax.check(??)\ncompiler.syntax.walk(??)\ncompiler.transformer\ncompiler.transformer.Add(??)\ncompiler.transformer.And(??)\ncompiler.transformer.AssAttr(??)\ncompiler.transformer.AssList(??)\ncompiler.transformer.AssName(??)\ncompiler.transformer.AssTuple(??)\ncompiler.transformer.Assert(??)\ncompiler.transformer.Assign(??)\ncompiler.transformer.AugAssign(??)\ncompiler.transformer.Backquote(??)\ncompiler.transformer.Bitand(??)\ncompiler.transformer.Bitor(??)\ncompiler.transformer.Bitxor(??)\ncompiler.transformer.Break(??)\ncompiler.transformer.CO_VARARGS\ncompiler.transformer.CO_VARKEYWORDS\ncompiler.transformer.CallFunc(??)\ncompiler.transformer.Class(??)\ncompiler.transformer.Compare(??)\ncompiler.transformer.Const(??)\ncompiler.transformer.Continue(??)\ncompiler.transformer.Decorators(??)\ncompiler.transformer.Dict(??)\ncompiler.transformer.DictComp(??)\ncompiler.transformer.Discard(??)\ncompiler.transformer.Div(??)\ncompiler.transformer.Ellipsis(??)\ncompiler.transformer.EmptyNode(??)\ncompiler.transformer.Exec(??)\ncompiler.transformer.Expression(??)\ncompiler.transformer.FloorDiv(??)\ncompiler.transformer.For(??)\ncompiler.transformer.From(??)\ncompiler.transformer.Function(??)\ncompiler.transformer.GenExpr(??)\ncompiler.transformer.GenExprFor(??)\ncompiler.transformer.GenExprIf(??)\ncompiler.transformer.GenExprInner(??)\ncompiler.transformer.Getattr(??)\ncompiler.transformer.Global(??)\ncompiler.transformer.If(??)\ncompiler.transformer.IfExp(??)\ncompiler.transformer.Import(??)\ncompiler.transformer.Invert(??)\ncompiler.transformer.Keyword(??)\ncompiler.transformer.Lambda(??)\ncompiler.transformer.LeftShift(??)\ncompiler.transformer.List(??)\ncompiler.transformer.ListComp(??)\ncompiler.transformer.ListCompFor(??)\ncompiler.transformer.ListCompIf(??)\ncompiler.transformer.Mod(??)\ncompiler.transformer.Module(??)\ncompiler.transformer.Mul(??)\ncompiler.transformer.Name(??)\ncompiler.transformer.Node(??)\ncompiler.transformer.Not(??)\ncompiler.transformer.OP_APPLY\ncompiler.transformer.OP_ASSIGN\ncompiler.transformer.OP_DELETE\ncompiler.transformer.Or(??)\ncompiler.transformer.Pass(??)\ncompiler.transformer.Power(??)\ncompiler.transformer.Print(??)\ncompiler.transformer.Printnl(??)\ncompiler.transformer.Raise(??)\ncompiler.transformer.Return(??)\ncompiler.transformer.RightShift(??)\ncompiler.transformer.Set(??)\ncompiler.transformer.SetComp(??)\ncompiler.transformer.Slice(??)\ncompiler.transformer.Sliceobj(??)\ncompiler.transformer.Stmt(??)\ncompiler.transformer.Sub(??)\ncompiler.transformer.Subscript(??)\ncompiler.transformer.Transformer(??)\ncompiler.transformer.TryExcept(??)\ncompiler.transformer.TryFinally(??)\ncompiler.transformer.Tuple(??)\ncompiler.transformer.UnaryAdd(??)\ncompiler.transformer.UnarySub(??)\ncompiler.transformer.WalkerError\ncompiler.transformer.While(??)\ncompiler.transformer.With(??)\ncompiler.transformer.Yield(??)\ncompiler.transformer.asList(??)\ncompiler.transformer.debug_tree(??)\ncompiler.transformer.extractLineNo(??)\ncompiler.transformer.flatten(??)\ncompiler.transformer.flatten_nodes(??)\ncompiler.transformer.k\ncompiler.transformer.name\ncompiler.transformer.nodes\ncompiler.transformer.obj(??)\ncompiler.transformer.parse(??)\ncompiler.transformer.parseFile(??)\ncompiler.transformer.parser\ncompiler.transformer.symbol\ncompiler.transformer.token\ncompiler.transformer.v\ncompiler.visitor\ncompiler.visitor.ASTVisitor(??)\ncompiler.visitor.ExampleASTVisitor(??)\ncompiler.visitor.ast\ncompiler.visitor.dumpNode(??)\ncompiler.visitor.walk(??)\ncompiler.walk(??)\ncompiler.warnings\ncomplex(real[, imag]) -> complex number\ncontextlib.GeneratorContextManager\ncontextlib.closing\ncontextlib.contextmanager(??)\ncontextlib.nested(??)\ncontextlib.sys\ncontextlib.warn\ncontextlib.wraps(??)\ncookielib.Absent(??)\ncookielib.Cookie(??)\ncookielib.CookieJar(??)\ncookielib.CookiePolicy(??)\ncookielib.DAYS\ncookielib.DEFAULT_HTTP_PORT\ncookielib.DefaultCookiePolicy(??)\ncookielib.EPOCH_YEAR\ncookielib.ESCAPED_CHAR_RE\ncookielib.FileCookieJar(??)\ncookielib.HEADER_ESCAPE_RE\ncookielib.HEADER_JOIN_ESCAPE_RE\ncookielib.HEADER_QUOTED_VALUE_RE\ncookielib.HEADER_TOKEN_RE\ncookielib.HEADER_VALUE_RE\ncookielib.HTTP_PATH_SAFE\ncookielib.IPV4_RE\ncookielib.ISO_DATE_RE\ncookielib.LOOSE_HTTP_DATE_RE\ncookielib.LWPCookieJar(??)\ncookielib.LoadError\ncookielib.MISSING_FILENAME_TEXT\ncookielib.MONTHS\ncookielib.MONTHS_LOWER\ncookielib.MozillaCookieJar(??)\ncookielib.STRICT_DATE_RE\ncookielib.TIMEZONE_RE\ncookielib.UTC_ZONES\ncookielib.WEEKDAY_RE\ncookielib.copy\ncookielib.cut_port_re\ncookielib.debug\ncookielib.deepvalues(??)\ncookielib.domain_match(??)\ncookielib.eff_request_host(??)\ncookielib.escape_path(??)\ncookielib.http2time(??)\ncookielib.httplib\ncookielib.is_HDN(??)\ncookielib.is_third_party(??)\ncookielib.iso2time(??)\ncookielib.join_header_words(??)\ncookielib.liberal_is_HDN(??)\ncookielib.logger\ncookielib.lwp_cookie_str(??)\ncookielib.month\ncookielib.offset_from_tz_string(??)\ncookielib.parse_ns_headers(??)\ncookielib.re\ncookielib.reach(??)\ncookielib.request_host(??)\ncookielib.request_path(??)\ncookielib.request_port(??)\ncookielib.split_header_words(??)\ncookielib.time\ncookielib.time2isoz(??)\ncookielib.time2netscape(??)\ncookielib.timegm(??)\ncookielib.unmatched(??)\ncookielib.uppercase_escaped_char(??)\ncookielib.urllib\ncookielib.urlparse\ncookielib.user_domain_match(??)\ncookielib.vals_sorted_by_key(??)\ncopy.Error\ncopy.PyStringMap\ncopy.copy(??)\ncopy.deepcopy(??)\ncopy.dispatch_table\ncopy.error\ncopy.name\ncopy.t\ncopy.weakref\ncopy_reg.add_extension(??)\ncopy_reg.clear_extension_cache(??)\ncopy_reg.constructor(??)\ncopy_reg.dispatch_table\ncopy_reg.pickle(??)\ncopy_reg.pickle_complex(??)\ncopy_reg.remove_extension(??)\ncopyright\ncredits\ncrypt.crypt(word, salt) -> string\ncsv.Dialect(??)\ncsv.DictReader(??)\ncsv.DictWriter(??)\ncsv.Error\ncsv.QUOTE_ALL\ncsv.QUOTE_MINIMAL\ncsv.QUOTE_NONE\ncsv.QUOTE_NONNUMERIC\ncsv.Sniffer(??)\ncsv.StringIO([s]) -- Return a StringIO-like stream for reading or writing\ncsv.excel(??)\ncsv.excel_tab(??)\ncsv.field_size_limit\ncsv.get_dialect\ncsv.list_dialects\ncsv.re\ncsv.reader\ncsv.reduce(function, sequence[, initial]) -> value\ncsv.register_dialect\ncsv.unregister_dialect\ncsv.writer\nctypes.ARRAY(??)\nctypes.ArgumentError\nctypes.Array\nctypes.BigEndianStructure\nctypes.CDLL\nctypes.CFUNCTYPE(??)\nctypes.DEFAULT_MODE\nctypes.LibraryLoader\nctypes.LittleEndianStructure\nctypes.POINTER\nctypes.PYFUNCTYPE(??)\nctypes.PyDLL\nctypes.RTLD_GLOBAL\nctypes.RTLD_LOCAL\nctypes.SetPointerType(??)\nctypes.Structure\nctypes.Union\nctypes.addressof(C instance) -> integer\nctypes.alignment(C type) -> integer\nctypes.byref(C instance[, offset=0]) -> byref-object\nctypes.c_bool\nctypes.c_buffer(??)\nctypes.c_byte\nctypes.c_char\nctypes.c_char_p\nctypes.c_double\nctypes.c_float\nctypes.c_int\nctypes.c_int16\nctypes.c_int32\nctypes.c_int64\nctypes.c_int8\nctypes.c_long\nctypes.c_longdouble\nctypes.c_longlong\nctypes.c_short\nctypes.c_size_t\nctypes.c_ssize_t\nctypes.c_ubyte\nctypes.c_uint\nctypes.c_uint16\nctypes.c_uint32\nctypes.c_uint64\nctypes.c_uint8\nctypes.c_ulong\nctypes.c_ulonglong\nctypes.c_ushort\nctypes.c_void_p\nctypes.c_voidp\nctypes.c_wchar\nctypes.c_wchar_p\nctypes.cast(??)\nctypes.cdll\nctypes.create_string_buffer(aString) -> character array\nctypes.create_unicode_buffer(aString) -> character array\nctypes.get_errno\nctypes.macholib\nctypes.macholib.dyld\nctypes.macholib.dyld.DEFAULT_FRAMEWORK_FALLBACK\nctypes.macholib.dyld.DEFAULT_LIBRARY_FALLBACK\nctypes.macholib.dyld.chain(*iterables) --> chain object\nctypes.macholib.dyld.combinations(iterable, r) --> combinations object\nctypes.macholib.dyld.combinations_with_replacement(iterable, r) --> combinations_with_replacement object\nctypes.macholib.dyld.compress(data, selectors) --> iterator over selected data\nctypes.macholib.dyld.count(start=0, step=1) --> count object\nctypes.macholib.dyld.cycle(iterable) --> cycle object\nctypes.macholib.dyld.dropwhile(predicate, iterable) --> dropwhile object\nctypes.macholib.dyld.dyld_default_search(??)\nctypes.macholib.dyld.dyld_env(??)\nctypes.macholib.dyld.dyld_executable_path_search(??)\nctypes.macholib.dyld.dyld_fallback_framework_path(??)\nctypes.macholib.dyld.dyld_fallback_library_path(??)\nctypes.macholib.dyld.dyld_find(??)\nctypes.macholib.dyld.dyld_framework_path(??)\nctypes.macholib.dyld.dyld_image_suffix(??)\nctypes.macholib.dyld.dyld_image_suffix_search(??)\nctypes.macholib.dyld.dyld_library_path(??)\nctypes.macholib.dyld.dyld_override_search(??)\nctypes.macholib.dyld.dylib_info(??)\nctypes.macholib.dyld.ensure_utf8(??)\nctypes.macholib.dyld.framework_find(??)\nctypes.macholib.dyld.framework_info(??)\nctypes.macholib.dyld.groupby(iterable[, keyfunc]) -> create an iterator which returns\nctypes.macholib.dyld.ifilter(function or None, sequence) --> ifilter object\nctypes.macholib.dyld.ifilterfalse(function or None, sequence) --> ifilterfalse object\nctypes.macholib.dyld.imap(func, *iterables) --> imap object\nctypes.macholib.dyld.islice(iterable, [start,] stop [, step]) --> islice object\nctypes.macholib.dyld.izip(iter1 [,iter2 [...]]) --> izip object\nctypes.macholib.dyld.izip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> izip_longest object\nctypes.macholib.dyld.os\nctypes.macholib.dyld.permutations(iterable[, r]) --> permutations object\nctypes.macholib.dyld.product(*iterables) --> product object\nctypes.macholib.dyld.repeat(object [,times]) -> create an iterator which returns the object\nctypes.macholib.dyld.starmap(function, sequence) --> starmap object\nctypes.macholib.dyld.takewhile(predicate, iterable) --> takewhile object\nctypes.macholib.dyld.tee(iterable, n=2) --> tuple of n independent iterators.\nctypes.macholib.dyld.test_dyld_find(??)\nctypes.macholib.dylib\nctypes.macholib.dylib.DYLIB_RE\nctypes.macholib.dylib.dylib_info(??)\nctypes.macholib.dylib.re\nctypes.macholib.dylib.test_dylib_info(??)\nctypes.macholib.framework\nctypes.macholib.framework.STRICT_FRAMEWORK_RE\nctypes.macholib.framework.framework_info(??)\nctypes.macholib.framework.re\nctypes.macholib.framework.test_framework_info(??)\nctypes.memmove\nctypes.memset\nctypes.pointer\nctypes.py_object\nctypes.pydll\nctypes.pythonapi\nctypes.resize\nctypes.set_conversion_mode(encoding, errors) -> (previous-encoding, previous-errors)\nctypes.set_errno\nctypes.sizeof(C type) -> integer\nctypes.string_at(addr[, size]) -> string\nctypes.util\nctypes.util.errno\nctypes.util.find_library(??)\nctypes.util.os\nctypes.util.re\nctypes.util.sys\nctypes.util.tempfile\nctypes.util.test(??)\nctypes.wstring_at(addr[, size]) -> string\ndatetime.MAXYEAR\ndatetime.MINYEAR\ndatetime.date(year, month, day) --> date object\ndatetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\ndatetime.datetime_CAPI\ndatetime.time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\ndatetime.timedelta\ndatetime.tzinfo\ndecimal.BasicContext\ndecimal.Clamped\ndecimal.Context\ndecimal.ConversionSyntax\ndecimal.Decimal\ndecimal.DecimalException\ndecimal.DecimalTuple(sign, digits, exponent)\ndecimal.DefaultContext\ndecimal.DivisionByZero\ndecimal.DivisionImpossible\ndecimal.DivisionUndefined\ndecimal.ExtendedContext\ndecimal.Inexact\ndecimal.InvalidContext\ndecimal.InvalidOperation\ndecimal.Overflow\ndecimal.ROUND_05UP\ndecimal.ROUND_CEILING\ndecimal.ROUND_DOWN\ndecimal.ROUND_FLOOR\ndecimal.ROUND_HALF_DOWN\ndecimal.ROUND_HALF_EVEN\ndecimal.ROUND_HALF_UP\ndecimal.ROUND_UP\ndecimal.Rounded\ndecimal.Subnormal\ndecimal.Underflow\ndecimal.getcontext(??)\ndecimal.localcontext(??)\ndecimal.setcontext(??)\ndelattr(object, name)\ndict() -> new empty dictionary\ndifflib.Differ(??)\ndifflib.HtmlDiff\ndifflib.IS_CHARACTER_JUNK(??)\ndifflib.IS_LINE_JUNK(??)\ndifflib.Match(a, b, size)\ndifflib.SequenceMatcher(??)\ndifflib.context_diff(??)\ndifflib.get_close_matches(??)\ndifflib.heapq\ndifflib.ndiff(??)\ndifflib.reduce(function, sequence[, initial]) -> value\ndifflib.restore(??)\ndifflib.unified_diff(??)\ndir([object]) -> list of strings\ndircache.annotate(??)\ndircache.cache\ndircache.listdir(??)\ndircache.opendir(??)\ndircache.os\ndircache.reset(??)\ndis.EXTENDED_ARG\ndis.HAVE_ARGUMENT\ndis.cmp_op\ndis.dis(??)\ndis.disassemble(??)\ndis.disassemble_string(??)\ndis.disco(??)\ndis.distb(??)\ndis.findlabels(??)\ndis.findlinestarts(??)\ndis.hascompare\ndis.hasconst\ndis.hasfree\ndis.hasjabs\ndis.hasjrel\ndis.haslocal\ndis.hasname\ndis.opmap\ndis.opname\ndis.sys\ndis.types\ndivmod(x, y) -> (div, mod)\ndoctest.BLANKLINE_MARKER\ndoctest.COMPARISON_FLAGS\ndoctest.DONT_ACCEPT_BLANKLINE\ndoctest.DONT_ACCEPT_TRUE_FOR_1\ndoctest.DebugRunner(??)\ndoctest.DocFileCase\ndoctest.DocFileSuite(??)\ndoctest.DocFileTest(??)\ndoctest.DocTest(??)\ndoctest.DocTestCase\ndoctest.DocTestFailure\ndoctest.DocTestFinder(??)\ndoctest.DocTestParser(??)\ndoctest.DocTestRunner(??)\ndoctest.DocTestSuite(??)\ndoctest.ELLIPSIS\ndoctest.ELLIPSIS_MARKER\ndoctest.Example(??)\ndoctest.IGNORE_EXCEPTION_DETAIL\ndoctest.NORMALIZE_WHITESPACE\ndoctest.OPTIONFLAGS_BY_NAME\ndoctest.OutputChecker(??)\ndoctest.REPORTING_FLAGS\ndoctest.REPORT_CDIFF\ndoctest.REPORT_NDIFF\ndoctest.REPORT_ONLY_FIRST_FAILURE\ndoctest.REPORT_UDIFF\ndoctest.SKIP\ndoctest.SkipDocTestCase\ndoctest.StringIO(??)\ndoctest.TestResults(failed, attempted)\ndoctest.Tester(??)\ndoctest.UnexpectedException\ndoctest.debug(??)\ndoctest.debug_script(??)\ndoctest.debug_src(??)\ndoctest.difflib\ndoctest.inspect\ndoctest.linecache\ndoctest.master\ndoctest.namedtuple(??)\ndoctest.os\ndoctest.pdb\ndoctest.re\ndoctest.register_optionflag(??)\ndoctest.run_docstring_examples(??)\ndoctest.script_from_examples(??)\ndoctest.set_unittest_reportflags(??)\ndoctest.sys\ndoctest.tempfile\ndoctest.testfile(??)\ndoctest.testmod(??)\ndoctest.testsource(??)\ndoctest.traceback\ndoctest.unittest\ndoctest.warnings\ndumbdbm.UserDict\ndumbdbm.error\ndumbdbm.open(??)\ndummy_thread.LockType\ndummy_thread.allocate_lock(??)\ndummy_thread.error\ndummy_thread.exit(??)\ndummy_thread.get_ident(??)\ndummy_thread.interrupt_main(??)\ndummy_thread.stack_size(??)\ndummy_thread.start_new_thread(??)\ndummy_threading.BoundedSemaphore(??)\ndummy_threading.Condition(??)\ndummy_threading.Event(??)\ndummy_threading.Lock(??)\ndummy_threading.RLock(??)\ndummy_threading.Semaphore(??)\ndummy_threading.Thread\ndummy_threading.Timer(??)\ndummy_threading.activeCount(??)\ndummy_threading.active_count(??)\ndummy_threading.currentThread(??)\ndummy_threading.current_thread(??)\ndummy_threading.enumerate(??)\ndummy_threading.local\ndummy_threading.setprofile(??)\ndummy_threading.settrace(??)\ndummy_threading.stack_size(??)\ndummy_threading.threading\nemail.Charset\nemail.Encoders\nemail.Errors\nemail.FeedParser\nemail.Generator\nemail.Header\nemail.Iterators\nemail.LazyImporter\nemail.MIMEAudio\nemail.MIMEBase\nemail.MIMEImage\nemail.MIMEMessage\nemail.MIMEMultipart\nemail.MIMENonMultipart\nemail.MIMEText\nemail.Message\nemail.Parser\nemail.Utils\nemail.base64MIME\nemail.base64mime\nemail.base64mime.CRLF\nemail.base64mime.EMPTYSTRING\nemail.base64mime.MISC_LEN\nemail.base64mime.NL\nemail.base64mime.a2b_base64\nemail.base64mime.b2a_base64\nemail.base64mime.base64_len(??)\nemail.base64mime.body_decode(??)\nemail.base64mime.body_encode(??)\nemail.base64mime.decode(??)\nemail.base64mime.decodestring(??)\nemail.base64mime.encode(??)\nemail.base64mime.encodestring(??)\nemail.base64mime.fix_eols(??)\nemail.base64mime.header_encode(??)\nemail.charset\nemail.charset.ALIASES\nemail.charset.BASE64\nemail.charset.CHARSETS\nemail.charset.CODEC_MAP\nemail.charset.Charset(??)\nemail.charset.DEFAULT_CHARSET\nemail.charset.MISC_LEN\nemail.charset.QP\nemail.charset.SHORTEST\nemail.charset.add_alias(??)\nemail.charset.add_charset(??)\nemail.charset.add_codec(??)\nemail.charset.codecs\nemail.charset.email\nemail.charset.encode_7or8bit(??)\nemail.charset.errors\nemail.email\nemail.encoders\nemail.encoders.base64\nemail.encoders.encode_7or8bit(??)\nemail.encoders.encode_base64(??)\nemail.encoders.encode_noop(??)\nemail.encoders.encode_quopri(??)\nemail.errors\nemail.errors.BoundaryError\nemail.errors.CharsetError\nemail.errors.FirstHeaderLineIsContinuationDefect(??)\nemail.errors.HeaderParseError\nemail.errors.MalformedHeaderDefect(??)\nemail.errors.MessageDefect(??)\nemail.errors.MessageError\nemail.errors.MessageParseError\nemail.errors.MisplacedEnvelopeHeaderDefect(??)\nemail.errors.MultipartConversionError\nemail.errors.MultipartInvariantViolationDefect(??)\nemail.errors.NoBoundaryInMultipartDefect(??)\nemail.errors.StartBoundaryNotFoundDefect(??)\nemail.feedparser\nemail.feedparser.BufferedSubFile\nemail.feedparser.EMPTYSTRING\nemail.feedparser.FeedParser(??)\nemail.feedparser.NL\nemail.feedparser.NLCRE\nemail.feedparser.NLCRE_bol\nemail.feedparser.NLCRE_crack\nemail.feedparser.NLCRE_eol\nemail.feedparser.NeedMoreData\nemail.feedparser.errors\nemail.feedparser.headerRE\nemail.feedparser.message\nemail.feedparser.re\nemail.generator\nemail.generator.DecodedGenerator(??)\nemail.generator.Generator(??)\nemail.generator.Header(??)\nemail.generator.NL\nemail.generator.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.generator.UNDERSCORE\nemail.generator.fcre\nemail.generator.random\nemail.generator.re\nemail.generator.sys\nemail.generator.time\nemail.generator.warnings\nemail.header\nemail.header.Charset(??)\nemail.header.Header(??)\nemail.header.HeaderParseError\nemail.header.MAXLINELEN\nemail.header.NL\nemail.header.SPACE\nemail.header.SPACE8\nemail.header.UEMPTYSTRING\nemail.header.USASCII\nemail.header.USPACE\nemail.header.UTF8\nemail.header.binascii\nemail.header.decode_header(??)\nemail.header.ecre\nemail.header.email\nemail.header.fcre\nemail.header.make_header(??)\nemail.header.re\nemail.importer\nemail.iterators\nemail.iterators.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.iterators.body_line_iterator(??)\nemail.iterators.sys\nemail.iterators.typed_subpart_iterator(??)\nemail.iterators.walk(??)\nemail.message\nemail.message.Message(??)\nemail.message.SEMISPACE\nemail.message.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.message.binascii\nemail.message.email\nemail.message.errors\nemail.message.re\nemail.message.tspecials\nemail.message.utils\nemail.message.uu\nemail.message.warnings\nemail.message_from_file(??)\nemail.message_from_string(??)\nemail.mime\nemail.mime.Audio\nemail.mime.Base\nemail.mime.Image\nemail.mime.Message\nemail.mime.Multipart\nemail.mime.NonMultipart\nemail.mime.Text\nemail.mime.application\nemail.mime.application.MIMEApplication(??)\nemail.mime.application.MIMENonMultipart(??)\nemail.mime.application.encoders\nemail.mime.audio\nemail.mime.audio.MIMEAudio(??)\nemail.mime.audio.MIMENonMultipart(??)\nemail.mime.audio.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.mime.audio.encoders\nemail.mime.audio.sndhdr\nemail.mime.base\nemail.mime.base.MIMEBase(??)\nemail.mime.base.message\nemail.mime.image\nemail.mime.image.MIMEImage(??)\nemail.mime.image.MIMENonMultipart(??)\nemail.mime.image.encoders\nemail.mime.image.imghdr\nemail.mime.message\nemail.mime.message.MIMEMessage(??)\nemail.mime.message.MIMENonMultipart(??)\nemail.mime.message.message\nemail.mime.multipart\nemail.mime.multipart.MIMEBase(??)\nemail.mime.multipart.MIMEMultipart(??)\nemail.mime.nonmultipart\nemail.mime.nonmultipart.MIMEBase(??)\nemail.mime.nonmultipart.MIMENonMultipart(??)\nemail.mime.nonmultipart.errors\nemail.mime.text\nemail.mime.text.MIMENonMultipart(??)\nemail.mime.text.MIMEText(??)\nemail.mime.text.encode_7or8bit(??)\nemail.parser\nemail.parser.FeedParser(??)\nemail.parser.HeaderParser(??)\nemail.parser.Message(??)\nemail.parser.Parser(??)\nemail.parser.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nemail.parser.warnings\nemail.quopriMIME\nemail.quoprimime\nemail.quoprimime.CRLF\nemail.quoprimime.MISC_LEN\nemail.quoprimime.NL\nemail.quoprimime.body_decode(??)\nemail.quoprimime.body_encode(??)\nemail.quoprimime.body_quopri_check(??)\nemail.quoprimime.body_quopri_len(??)\nemail.quoprimime.bqre\nemail.quoprimime.decode(??)\nemail.quoprimime.decodestring(??)\nemail.quoprimime.encode(??)\nemail.quoprimime.encodestring(??)\nemail.quoprimime.fix_eols(??)\nemail.quoprimime.header_decode(??)\nemail.quoprimime.header_encode(??)\nemail.quoprimime.header_quopri_check(??)\nemail.quoprimime.header_quopri_len(??)\nemail.quoprimime.hexdigits\nemail.quoprimime.hqre\nemail.quoprimime.quote(??)\nemail.quoprimime.re\nemail.quoprimime.unquote(??)\nemail.sys\nemail.utils\nemail.utils.COMMASPACE\nemail.utils.CRLF\nemail.utils.EMPTYSTRING\nemail.utils.TICK\nemail.utils.UEMPTYSTRING\nemail.utils.base64\nemail.utils.collapse_rfc2231_value(??)\nemail.utils.decode_params(??)\nemail.utils.decode_rfc2231(??)\nemail.utils.ecre\nemail.utils.encode_rfc2231(??)\nemail.utils.escapesre\nemail.utils.fix_eols(??)\nemail.utils.formataddr(??)\nemail.utils.formatdate(??)\nemail.utils.getaddresses(??)\nemail.utils.make_msgid(??)\nemail.utils.mktime_tz(??)\nemail.utils.os\nemail.utils.parseaddr(??)\nemail.utils.parsedate(??)\nemail.utils.parsedate_tz(??)\nemail.utils.quote(??)\nemail.utils.random\nemail.utils.re\nemail.utils.rfc2231_continuation\nemail.utils.socket\nemail.utils.specialsre\nemail.utils.time\nemail.utils.unquote(??)\nemail.utils.urllib\nemail.utils.warnings\nenumerate(iterable[, start]) -> iterator for index, value of iterable\nerrno.E2BIG\nerrno.EACCES\nerrno.EADDRINUSE\nerrno.EADDRNOTAVAIL\nerrno.EADV\nerrno.EAFNOSUPPORT\nerrno.EAGAIN\nerrno.EALREADY\nerrno.EBADE\nerrno.EBADF\nerrno.EBADFD\nerrno.EBADMSG\nerrno.EBADR\nerrno.EBADRQC\nerrno.EBADSLT\nerrno.EBFONT\nerrno.EBUSY\nerrno.ECHILD\nerrno.ECHRNG\nerrno.ECOMM\nerrno.ECONNABORTED\nerrno.ECONNREFUSED\nerrno.ECONNRESET\nerrno.EDEADLK\nerrno.EDEADLOCK\nerrno.EDESTADDRREQ\nerrno.EDOM\nerrno.EDOTDOT\nerrno.EDQUOT\nerrno.EEXIST\nerrno.EFAULT\nerrno.EFBIG\nerrno.EHOSTDOWN\nerrno.EHOSTUNREACH\nerrno.EIDRM\nerrno.EILSEQ\nerrno.EINPROGRESS\nerrno.EINTR\nerrno.EINVAL\nerrno.EIO\nerrno.EISCONN\nerrno.EISDIR\nerrno.EISNAM\nerrno.EL2HLT\nerrno.EL2NSYNC\nerrno.EL3HLT\nerrno.EL3RST\nerrno.ELIBACC\nerrno.ELIBBAD\nerrno.ELIBEXEC\nerrno.ELIBMAX\nerrno.ELIBSCN\nerrno.ELNRNG\nerrno.ELOOP\nerrno.EMFILE\nerrno.EMLINK\nerrno.EMSGSIZE\nerrno.EMULTIHOP\nerrno.ENAMETOOLONG\nerrno.ENAVAIL\nerrno.ENETDOWN\nerrno.ENETRESET\nerrno.ENETUNREACH\nerrno.ENFILE\nerrno.ENOANO\nerrno.ENOBUFS\nerrno.ENOCSI\nerrno.ENODATA\nerrno.ENODEV\nerrno.ENOENT\nerrno.ENOEXEC\nerrno.ENOLCK\nerrno.ENOLINK\nerrno.ENOMEM\nerrno.ENOMSG\nerrno.ENONET\nerrno.ENOPKG\nerrno.ENOPROTOOPT\nerrno.ENOSPC\nerrno.ENOSR\nerrno.ENOSTR\nerrno.ENOSYS\nerrno.ENOTBLK\nerrno.ENOTCONN\nerrno.ENOTDIR\nerrno.ENOTEMPTY\nerrno.ENOTNAM\nerrno.ENOTSOCK\nerrno.ENOTTY\nerrno.ENOTUNIQ\nerrno.ENXIO\nerrno.EOPNOTSUPP\nerrno.EOVERFLOW\nerrno.EPERM\nerrno.EPFNOSUPPORT\nerrno.EPIPE\nerrno.EPROTO\nerrno.EPROTONOSUPPORT\nerrno.EPROTOTYPE\nerrno.ERANGE\nerrno.EREMCHG\nerrno.EREMOTE\nerrno.EREMOTEIO\nerrno.ERESTART\nerrno.EROFS\nerrno.ESHUTDOWN\nerrno.ESOCKTNOSUPPORT\nerrno.ESPIPE\nerrno.ESRCH\nerrno.ESRMNT\nerrno.ESTALE\nerrno.ESTRPIPE\nerrno.ETIME\nerrno.ETIMEDOUT\nerrno.ETOOMANYREFS\nerrno.ETXTBSY\nerrno.EUCLEAN\nerrno.EUNATCH\nerrno.EUSERS\nerrno.EWOULDBLOCK\nerrno.EXDEV\nerrno.EXFULL\nerrno.errorcode\neval(source[, globals[, locals]]) -> value\nexceptions.ArithmeticError\nexceptions.AssertionError\nexceptions.AttributeError\nexceptions.BaseException\nexceptions.BufferError\nexceptions.BytesWarning\nexceptions.DeprecationWarning\nexceptions.EOFError\nexceptions.EnvironmentError\nexceptions.Exception\nexceptions.FloatingPointError\nexceptions.FutureWarning\nexceptions.GeneratorExit\nexceptions.IOError\nexceptions.ImportError\nexceptions.ImportWarning\nexceptions.IndentationError\nexceptions.IndexError\nexceptions.KeyError\nexceptions.KeyboardInterrupt\nexceptions.LookupError\nexceptions.MemoryError\nexceptions.NameError\nexceptions.NotImplementedError\nexceptions.OSError\nexceptions.OverflowError\nexceptions.PendingDeprecationWarning\nexceptions.ReferenceError\nexceptions.RuntimeError\nexceptions.RuntimeWarning\nexceptions.StandardError\nexceptions.StopIteration\nexceptions.SyntaxError\nexceptions.SyntaxWarning\nexceptions.SystemError\nexceptions.SystemExit\nexceptions.TabError\nexceptions.TypeError\nexceptions.UnboundLocalError\nexceptions.UnicodeDecodeError\nexceptions.UnicodeEncodeError\nexceptions.UnicodeError\nexceptions.UnicodeTranslateError\nexceptions.UnicodeWarning\nexceptions.UserWarning\nexceptions.ValueError\nexceptions.Warning\nexceptions.ZeroDivisionError\nexecfile(filename[, globals[, locals]])\nexit\nfcntl.DN_ACCESS\nfcntl.DN_ATTRIB\nfcntl.DN_CREATE\nfcntl.DN_DELETE\nfcntl.DN_MODIFY\nfcntl.DN_MULTISHOT\nfcntl.DN_RENAME\nfcntl.FASYNC\nfcntl.FD_CLOEXEC\nfcntl.F_DUPFD\nfcntl.F_EXLCK\nfcntl.F_GETFD\nfcntl.F_GETFL\nfcntl.F_GETLEASE\nfcntl.F_GETLK\nfcntl.F_GETLK64\nfcntl.F_GETOWN\nfcntl.F_GETSIG\nfcntl.F_NOTIFY\nfcntl.F_RDLCK\nfcntl.F_SETFD\nfcntl.F_SETFL\nfcntl.F_SETLEASE\nfcntl.F_SETLK\nfcntl.F_SETLK64\nfcntl.F_SETLKW\nfcntl.F_SETLKW64\nfcntl.F_SETOWN\nfcntl.F_SETSIG\nfcntl.F_SHLCK\nfcntl.F_UNLCK\nfcntl.F_WRLCK\nfcntl.I_ATMARK\nfcntl.I_CANPUT\nfcntl.I_CKBAND\nfcntl.I_FDINSERT\nfcntl.I_FIND\nfcntl.I_FLUSH\nfcntl.I_FLUSHBAND\nfcntl.I_GETBAND\nfcntl.I_GETCLTIME\nfcntl.I_GETSIG\nfcntl.I_GRDOPT\nfcntl.I_GWROPT\nfcntl.I_LINK\nfcntl.I_LIST\nfcntl.I_LOOK\nfcntl.I_NREAD\nfcntl.I_PEEK\nfcntl.I_PLINK\nfcntl.I_POP\nfcntl.I_PUNLINK\nfcntl.I_PUSH\nfcntl.I_RECVFD\nfcntl.I_SENDFD\nfcntl.I_SETCLTIME\nfcntl.I_SETSIG\nfcntl.I_SRDOPT\nfcntl.I_STR\nfcntl.I_SWROPT\nfcntl.I_UNLINK\nfcntl.LOCK_EX\nfcntl.LOCK_MAND\nfcntl.LOCK_NB\nfcntl.LOCK_READ\nfcntl.LOCK_RW\nfcntl.LOCK_SH\nfcntl.LOCK_UN\nfcntl.LOCK_WRITE\nfcntl.fcntl(fd, opt, [arg])\nfcntl.flock(fd, operation)\nfcntl.ioctl(fd, opt[, arg[, mutate_flag]])\nfcntl.lockf (fd, operation, length=0, start=0, whence=0)\nfile(name[, mode[, buffering]]) -> file object\nfilecmp.BUFSIZE\nfilecmp.cmp(??)\nfilecmp.cmpfiles(??)\nfilecmp.demo(??)\nfilecmp.dircmp(??)\nfilecmp.ifilter(function or None, sequence) --> ifilter object\nfilecmp.ifilterfalse(function or None, sequence) --> ifilterfalse object\nfilecmp.imap(func, *iterables) --> imap object\nfilecmp.izip(iter1 [,iter2 [...]]) --> izip object\nfilecmp.os\nfilecmp.stat\nfileinput.DEFAULT_BUFSIZE\nfileinput.FileInput(??)\nfileinput.close(??)\nfileinput.filelineno(??)\nfileinput.filename(??)\nfileinput.fileno(??)\nfileinput.hook_compressed(??)\nfileinput.hook_encoded(??)\nfileinput.input([files[, inplace[, backup[, mode[, openhook]]]]])\nfileinput.isfirstline(??)\nfileinput.isstdin(??)\nfileinput.lineno(??)\nfileinput.nextfile(??)\nfileinput.os\nfileinput.sys\nfilter(function or None, sequence) -> list, tuple, or string\nfloat(x) -> floating point number\nfnmatch.filter(??)\nfnmatch.fnmatch(??)\nfnmatch.fnmatchcase(??)\nfnmatch.re\nfnmatch.translate(??)\nformat(value[, format_spec]) -> string\nformatter.AS_IS\nformatter.AbstractFormatter(??)\nformatter.AbstractWriter(??)\nformatter.DumbWriter(??)\nformatter.NullFormatter(??)\nformatter.NullWriter(??)\nformatter.sys\nformatter.test(??)\nfpformat.NotANumber\nfpformat.decoder\nfpformat.extract(??)\nfpformat.fix(??)\nfpformat.re\nfpformat.roundfrac(??)\nfpformat.sci(??)\nfpformat.test(??)\nfpformat.unexpo(??)\nfractions.Decimal\nfractions.Fraction\nfractions.Rational\nfractions.division\nfractions.gcd(??)\nfractions.math\nfractions.numbers\nfractions.operator\nfractions.re\nfrozenset() -> empty frozenset object\nftplib.CRLF\nftplib.Error\nftplib.FTP(??)\nftplib.FTP_PORT\nftplib.FTP_TLS(??)\nftplib.MSG_OOB\nftplib.Netrc(??)\nftplib.all_errors\nftplib.error_perm\nftplib.error_proto\nftplib.error_reply\nftplib.error_temp\nftplib.ftpcp(??)\nftplib.os\nftplib.parse150(??)\nftplib.parse227(??)\nftplib.parse229(??)\nftplib.parse257(??)\nftplib.print_line(??)\nftplib.socket\nftplib.ssl\nftplib.sys\nftplib.test(??)\nfunctools.WRAPPER_ASSIGNMENTS\nfunctools.WRAPPER_UPDATES\nfunctools.cmp_to_key(??)\nfunctools.partial(func, *args, **keywords) - new function with partial application\nfunctools.reduce(function, sequence[, initial]) -> value\nfunctools.total_ordering(??)\nfunctools.update_wrapper(??)\nfunctools.wraps(??)\nfuture_builtins.ascii(object) -> string\nfuture_builtins.filter\nfuture_builtins.hex(number) -> string\nfuture_builtins.map\nfuture_builtins.oct(number) -> string\nfuture_builtins.zip\ngc.DEBUG_COLLECTABLE\ngc.DEBUG_INSTANCES\ngc.DEBUG_LEAK\ngc.DEBUG_OBJECTS\ngc.DEBUG_SAVEALL\ngc.DEBUG_STATS\ngc.DEBUG_UNCOLLECTABLE\ngc.collect([generation]) -> n\ngc.disable() -> None\ngc.enable() -> None\ngc.garbage\ngc.get_count() -> (count0, count1, count2)\ngc.get_debug() -> flags\ngc.get_objects() -> [...]\ngc.get_referents(*objs) -> list\ngc.get_referrers(*objs) -> list\ngc.get_threshold() -> (threshold0, threshold1, threshold2)\ngc.is_tracked(obj) -> bool\ngc.isenabled() -> status\ngc.set_debug(flags) -> None\ngc.set_threshold(threshold0, [threshold1, threshold2]) -> None\ngen_python_api.add_builtin_modules\ngen_python_api.add_builtins\ngen_python_api.add_keywords\ngen_python_api.add_manual_modules\ngen_python_api.add_other_modules\ngen_python_api.add_package_modules\ngen_python_api.addasgloballist\ngen_python_api.api\ngen_python_api.apilist\ngen_python_api.builtin\ngen_python_api.exclude_modules\ngen_python_api.exclude_names\ngen_python_api.excludedirlist\ngen_python_api.excludemodulelist\ngen_python_api.f\ngen_python_api.folder\ngen_python_api.folders\ngen_python_api.manuallist\ngen_python_api.module\ngen_python_api.moduletypes\ngen_python_api.os\ngen_python_api.processFolder(??)\ngen_python_api.processModule(??)\ngen_python_api.processName(??)\ngen_python_api.re\ngen_python_api.string\ngen_python_api.sys\ngen_python_api.types\ngenericpath.commonprefix(??)\ngenericpath.exists(??)\ngenericpath.getatime(??)\ngenericpath.getctime(??)\ngenericpath.getmtime(??)\ngenericpath.getsize(??)\ngenericpath.isdir(??)\ngenericpath.isfile(??)\ngenericpath.os\ngenericpath.stat\ngetattr(object, name[, default]) -> value\ngetopt.GetoptError\ngetopt.do_longs(??)\ngetopt.do_shorts(??)\ngetopt.error\ngetopt.getopt(args, options[, long_options]) -> opts, args\ngetopt.gnu_getopt(??)\ngetopt.long_has_args(??)\ngetopt.os\ngetopt.short_has_arg(??)\ngetpass.GetPassWarning\ngetpass.fallback_getpass(??)\ngetpass.getpass(??)\ngetpass.getuser(??)\ngetpass.os\ngetpass.sys\ngetpass.termios\ngetpass.unix_getpass(??)\ngetpass.warnings\ngetpass.win_getpass(??)\ngettext.Catalog(??)\ngettext.ENOENT\ngettext.GNUTranslations(??)\ngettext.NullTranslations(??)\ngettext.bind_textdomain_codeset(??)\ngettext.bindtextdomain(??)\ngettext.c2py(??)\ngettext.copy\ngettext.dgettext(??)\ngettext.dngettext(??)\ngettext.find(??)\ngettext.gettext(??)\ngettext.install(??)\ngettext.ldgettext(??)\ngettext.ldngettext(??)\ngettext.lgettext(??)\ngettext.lngettext(??)\ngettext.locale\ngettext.ngettext(??)\ngettext.os\ngettext.re\ngettext.struct\ngettext.sys\ngettext.test(??)\ngettext.textdomain(??)\ngettext.translation(??)\nglob.fnmatch\nglob.glob(??)\nglob.glob0(??)\nglob.glob1(??)\nglob.has_magic(??)\nglob.iglob(??)\nglob.magic_check\nglob.os\nglob.re\nglob.sys\nglobals() -> dictionary\ngrp.getgrall() -> list of tuples\ngrp.getgrgid(id) -> tuple\ngrp.getgrnam(name) -> tuple\ngrp.struct_group\ngzip.FCOMMENT\ngzip.FEXTRA\ngzip.FHCRC\ngzip.FNAME\ngzip.FTEXT\ngzip.GzipFile\ngzip.READ\ngzip.WRITE\ngzip.io\ngzip.open(??)\ngzip.os\ngzip.read32(??)\ngzip.struct\ngzip.sys\ngzip.time\ngzip.write32u(??)\ngzip.zlib\nhasattr(object, name) -> bool\nhash(object) -> integer\nhashlib.algorithms\nhashlib.md5\nhashlib.new(name, string='') - Return a new hashing object using the named algorithm;\nhashlib.sha1\nhashlib.sha224\nhashlib.sha256\nhashlib.sha384\nhashlib.sha512\nheapq.bisect\nheapq.chain(*iterables) --> chain object\nheapq.count(start=0, step=1) --> count object\nheapq.heapify\nheapq.heappop\nheapq.heappush\nheapq.heappushpop\nheapq.heapreplace\nheapq.imap(func, *iterables) --> imap object\nheapq.islice(iterable, [start,] stop [, step]) --> islice object\nheapq.itemgetter(item, ...) --> itemgetter object\nheapq.izip(iter1 [,iter2 [...]]) --> izip object\nheapq.merge(??)\nheapq.nlargest(??)\nheapq.nsmallest(??)\nheapq.repeat(object [,times]) -> create an iterator which returns the object\nheapq.tee(iterable, n=2) --> tuple of n independent iterators.\nhelp\nhex(number) -> string\nhmac.HMAC(??)\nhmac.digest_size\nhmac.new(??)\nhmac.trans_36\nhmac.trans_5C\nhmac.x\nhotshot.Profile(??)\nhotshot.ProfilerError\nhotshot.log\nhotshot.log.ENTER\nhotshot.log.EXIT\nhotshot.log.LINE\nhotshot.log.LogReader(??)\nhotshot.log.WHAT_ADD_INFO\nhotshot.log.WHAT_DEFINE_FILE\nhotshot.log.WHAT_DEFINE_FUNC\nhotshot.log.WHAT_ENTER\nhotshot.log.WHAT_EXIT\nhotshot.log.WHAT_LINENO\nhotshot.log.os\nhotshot.log.parser\nhotshot.log.symbol\nhotshot.stats\nhotshot.stats.ENTER\nhotshot.stats.EXIT\nhotshot.stats.FakeCode(??)\nhotshot.stats.FakeFrame(??)\nhotshot.stats.Profile(??)\nhotshot.stats.StatsLoader(??)\nhotshot.stats.hotshot\nhotshot.stats.load(??)\nhotshot.stats.profile\nhotshot.stats.pstats\nhotshot.stones\nhotshot.stones.errno\nhotshot.stones.hotshot\nhotshot.stones.main(??)\nhotshot.stones.sys\nhotshot.stones.test\nhtmlentitydefs.codepoint2name\nhtmlentitydefs.entitydefs\nhtmlentitydefs.name2codepoint\nhtmllib.AS_IS\nhtmllib.HTMLParseError\nhtmllib.HTMLParser(??)\nhtmllib.sgmllib\nhtmllib.test(??)\nhttplib.ACCEPTED\nhttplib.BAD_GATEWAY\nhttplib.BAD_REQUEST\nhttplib.BadStatusLine\nhttplib.CONFLICT\nhttplib.CONTINUE\nhttplib.CREATED\nhttplib.CannotSendHeader\nhttplib.CannotSendRequest\nhttplib.EXPECTATION_FAILED\nhttplib.FAILED_DEPENDENCY\nhttplib.FORBIDDEN\nhttplib.FOUND\nhttplib.FakeSocket(??)\nhttplib.GATEWAY_TIMEOUT\nhttplib.GONE\nhttplib.HTTP(??)\nhttplib.HTTPConnection(??)\nhttplib.HTTPException\nhttplib.HTTPMessage(??)\nhttplib.HTTPResponse(??)\nhttplib.HTTPS(??)\nhttplib.HTTPSConnection(??)\nhttplib.HTTPS_PORT\nhttplib.HTTP_PORT\nhttplib.HTTP_VERSION_NOT_SUPPORTED\nhttplib.IM_USED\nhttplib.INSUFFICIENT_STORAGE\nhttplib.INTERNAL_SERVER_ERROR\nhttplib.ImproperConnectionState\nhttplib.IncompleteRead\nhttplib.InvalidURL\nhttplib.LENGTH_REQUIRED\nhttplib.LOCKED\nhttplib.LineAndFileWrapper(??)\nhttplib.MAXAMOUNT\nhttplib.METHOD_NOT_ALLOWED\nhttplib.MOVED_PERMANENTLY\nhttplib.MULTIPLE_CHOICES\nhttplib.MULTI_STATUS\nhttplib.NON_AUTHORITATIVE_INFORMATION\nhttplib.NOT_ACCEPTABLE\nhttplib.NOT_EXTENDED\nhttplib.NOT_FOUND\nhttplib.NOT_IMPLEMENTED\nhttplib.NOT_MODIFIED\nhttplib.NO_CONTENT\nhttplib.NotConnected\nhttplib.OK\nhttplib.PARTIAL_CONTENT\nhttplib.PAYMENT_REQUIRED\nhttplib.PRECONDITION_FAILED\nhttplib.PROCESSING\nhttplib.PROXY_AUTHENTICATION_REQUIRED\nhttplib.REQUESTED_RANGE_NOT_SATISFIABLE\nhttplib.REQUEST_ENTITY_TOO_LARGE\nhttplib.REQUEST_TIMEOUT\nhttplib.REQUEST_URI_TOO_LONG\nhttplib.RESET_CONTENT\nhttplib.ResponseNotReady\nhttplib.SEE_OTHER\nhttplib.SERVICE_UNAVAILABLE\nhttplib.SWITCHING_PROTOCOLS\nhttplib.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nhttplib.TEMPORARY_REDIRECT\nhttplib.UNAUTHORIZED\nhttplib.UNPROCESSABLE_ENTITY\nhttplib.UNSUPPORTED_MEDIA_TYPE\nhttplib.UPGRADE_REQUIRED\nhttplib.USE_PROXY\nhttplib.UnimplementedFileMode\nhttplib.UnknownProtocol\nhttplib.UnknownTransferEncoding\nhttplib.array(typecode [, initializer]) -> array\nhttplib.error\nhttplib.mimetools\nhttplib.py3kwarning\nhttplib.responses\nhttplib.socket\nhttplib.ssl\nhttplib.test(??)\nhttplib.urlsplit(??)\nhttplib.warnings\nid(object) -> integer\nihooks.BUILTIN_MODULE\nihooks.BasicModuleImporter(??)\nihooks.BasicModuleLoader(??)\nihooks.C_BUILTIN\nihooks.C_EXTENSION\nihooks.FROZEN_MODULE\nihooks.FancyModuleLoader(??)\nihooks.Hooks(??)\nihooks.ModuleImporter(??)\nihooks.ModuleLoader(??)\nihooks.PKG_DIRECTORY\nihooks.PY_COMPILED\nihooks.PY_FROZEN\nihooks.PY_SOURCE\nihooks.VERBOSE\nihooks.current_importer\nihooks.default_importer\nihooks.imp\nihooks.install(??)\nihooks.os\nihooks.sys\nihooks.uninstall(??)\nihooks.warn\nimaplib.AllowedVersions\nimaplib.CRLF\nimaplib.Commands\nimaplib.Continuation\nimaplib.Debug\nimaplib.Flags\nimaplib.IMAP4(??)\nimaplib.IMAP4_PORT\nimaplib.IMAP4_SSL(??)\nimaplib.IMAP4_SSL_PORT\nimaplib.IMAP4_stream(??)\nimaplib.Int2AP(??)\nimaplib.InternalDate\nimaplib.Internaldate2tuple(??)\nimaplib.Literal\nimaplib.MapCRLF\nimaplib.Mon2num\nimaplib.ParseFlags(??)\nimaplib.Response_code\nimaplib.Time2Internaldate(??)\nimaplib.Untagged_response\nimaplib.Untagged_status\nimaplib.binascii\nimaplib.random\nimaplib.re\nimaplib.socket\nimaplib.ssl\nimaplib.subprocess\nimaplib.sys\nimaplib.time\nimghdr.test(??)\nimghdr.test_bmp(??)\nimghdr.test_exif(??)\nimghdr.test_gif(??)\nimghdr.test_jpeg(??)\nimghdr.test_pbm(??)\nimghdr.test_pgm(??)\nimghdr.test_png(??)\nimghdr.test_ppm(??)\nimghdr.test_rast(??)\nimghdr.test_rgb(??)\nimghdr.test_tiff(??)\nimghdr.test_xbm(??)\nimghdr.testall(??)\nimghdr.tests\nimghdr.what(??)\nimp.C_BUILTIN\nimp.C_EXTENSION\nimp.IMP_HOOK\nimp.NullImporter\nimp.PKG_DIRECTORY\nimp.PY_CODERESOURCE\nimp.PY_COMPILED\nimp.PY_FROZEN\nimp.PY_RESOURCE\nimp.PY_SOURCE\nimp.SEARCH_ERROR\nimp.acquire_lock() -> None\nimp.find_module(name, [path]) -> (file, filename, (suffix, mode, type))\nimp.get_frozen_object\nimp.get_magic() -> string\nimp.get_suffixes() -> [(suffix, mode, type), ...]\nimp.init_builtin\nimp.init_frozen\nimp.is_builtin\nimp.is_frozen\nimp.load_compiled\nimp.load_dynamic\nimp.load_module(name, file, filename, (suffix, mode, type)) -> module\nimp.load_package\nimp.load_source\nimp.lock_held() -> boolean\nimp.new_module(name) -> module\nimp.release_lock() -> None\nimp.reload(module) -> module\nimportlib.import_module(??)\nimportlib.sys\nimputil.BuiltinImporter(??)\nimputil.DynLoadSuffixImporter(??)\nimputil.ImportManager(??)\nimputil.Importer(??)\nimputil.imp\nimputil.marshal\nimputil.py_suffix_importer(??)\nimputil.struct\nimputil.sys\ninput([prompt]) -> value\ninspect.ArgInfo(args, varargs, keywords, locals)\ninspect.ArgSpec(args, varargs, keywords, defaults)\ninspect.Arguments(args, varargs, keywords)\ninspect.Attribute(name, kind, defining_class, object)\ninspect.BlockFinder(??)\ninspect.CO_GENERATOR\ninspect.CO_NESTED\ninspect.CO_NEWLOCALS\ninspect.CO_NOFREE\ninspect.CO_OPTIMIZED\ninspect.CO_VARARGS\ninspect.CO_VARKEYWORDS\ninspect.EndOfBlock\ninspect.ModuleInfo(name, suffix, mode, module_type)\ninspect.TPFLAGS_IS_ABSTRACT\ninspect.Traceback(filename, lineno, function, code_context, index)\ninspect.attrgetter(attr, ...) --> attrgetter object\ninspect.classify_class_attrs(??)\ninspect.cleandoc(??)\ninspect.currentframe\ninspect.dis\ninspect.findsource(??)\ninspect.formatargspec(??)\ninspect.formatargvalues(??)\ninspect.getabsfile(??)\ninspect.getargs(??)\ninspect.getargspec(??)\ninspect.getargvalues(??)\ninspect.getblock(??)\ninspect.getcallargs(??)\ninspect.getclasstree(??)\ninspect.getcomments(??)\ninspect.getdoc(??)\ninspect.getfile(??)\ninspect.getframeinfo(??)\ninspect.getinnerframes(??)\ninspect.getlineno(??)\ninspect.getmembers(??)\ninspect.getmodule(??)\ninspect.getmoduleinfo(??)\ninspect.getmodulename(??)\ninspect.getmro(??)\ninspect.getouterframes(??)\ninspect.getsource(??)\ninspect.getsourcefile(??)\ninspect.getsourcelines(??)\ninspect.imp\ninspect.indentsize(??)\ninspect.isabstract(??)\ninspect.isbuiltin(??)\ninspect.isclass(??)\ninspect.iscode(??)\ninspect.isdatadescriptor(??)\ninspect.isframe(??)\ninspect.isfunction(??)\ninspect.isgenerator(??)\ninspect.isgeneratorfunction(??)\ninspect.isgetsetdescriptor(??)\ninspect.ismemberdescriptor(??)\ninspect.ismethod(??)\ninspect.ismethoddescriptor(??)\ninspect.ismodule(??)\ninspect.isroutine(??)\ninspect.istraceback(??)\ninspect.joinseq(??)\ninspect.linecache\ninspect.modulesbyfile\ninspect.namedtuple(??)\ninspect.os\ninspect.re\ninspect.stack(??)\ninspect.string\ninspect.strseq(??)\ninspect.sys\ninspect.tokenize\ninspect.trace(??)\ninspect.types\ninspect.walktree(??)\nint(x[, base]) -> integer\nintern(string) -> string\nio.BlockingIOError\nio.BufferedIOBase\nio.BufferedRWPair\nio.BufferedRandom\nio.BufferedReader\nio.BufferedWriter\nio.BytesIO([buffer]) -> object\nio.DEFAULT_BUFFER_SIZE\nio.FileIO\nio.IOBase\nio.IncrementalNewlineDecoder\nio.OpenWrapper\nio.RawIOBase\nio.SEEK_CUR\nio.SEEK_END\nio.SEEK_SET\nio.StringIO\nio.TextIOBase\nio.TextIOWrapper\nio.UnsupportedOperation\nio.abc\nio.open\nisinstance(object, class-or-type-or-tuple) -> bool\nissubclass(C, B) -> bool\niter(collection) -> iterator\nitertools.chain(*iterables) --> chain object\nitertools.combinations(iterable, r) --> combinations object\nitertools.combinations_with_replacement(iterable, r) --> combinations_with_replacement object\nitertools.compress(data, selectors) --> iterator over selected data\nitertools.count(start=0, step=1) --> count object\nitertools.cycle(iterable) --> cycle object\nitertools.dropwhile(predicate, iterable) --> dropwhile object\nitertools.groupby(iterable[, keyfunc]) -> create an iterator which returns\nitertools.ifilter(function or None, sequence) --> ifilter object\nitertools.ifilterfalse(function or None, sequence) --> ifilterfalse object\nitertools.imap(func, *iterables) --> imap object\nitertools.islice(iterable, [start,] stop [, step]) --> islice object\nitertools.izip(iter1 [,iter2 [...]]) --> izip object\nitertools.izip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> izip_longest object\nitertools.permutations(iterable[, r]) --> permutations object\nitertools.product(*iterables) --> product object\nitertools.repeat(object [,times]) -> create an iterator which returns the object\nitertools.starmap(function, sequence) --> starmap object\nitertools.takewhile(predicate, iterable) --> takewhile object\nitertools.tee(iterable, n=2) --> tuple of n independent iterators.\njson.JSONDecoder\njson.JSONEncoder\njson.decoder\njson.decoder.BACKSLASH\njson.decoder.DEFAULT_ENCODING\njson.decoder.FLAGS\njson.decoder.JSONArray(??)\njson.decoder.JSONDecoder\njson.decoder.JSONObject(??)\njson.decoder.NaN\njson.decoder.NegInf\njson.decoder.PosInf\njson.decoder.STRINGCHUNK\njson.decoder.WHITESPACE\njson.decoder.WHITESPACE_STR\njson.decoder.c_scanstring\njson.decoder.errmsg(??)\njson.decoder.linecol(??)\njson.decoder.make_scanner\njson.decoder.py_scanstring(??)\njson.decoder.re\njson.decoder.scanstring(basestring, end, encoding, strict=True) -> (str, end)\njson.decoder.struct\njson.decoder.sys\njson.dump(??)\njson.dumps(??)\njson.encoder\njson.encoder.ESCAPE\njson.encoder.ESCAPE_ASCII\njson.encoder.ESCAPE_DCT\njson.encoder.FLOAT_REPR\njson.encoder.HAS_UTF8\njson.encoder.INFINITY\njson.encoder.JSONEncoder\njson.encoder.c_encode_basestring_ascii\njson.encoder.c_make_encoder\njson.encoder.encode_basestring(??)\njson.encoder.encode_basestring_ascii(basestring) -> str\njson.encoder.i\njson.encoder.py_encode_basestring_ascii(??)\njson.encoder.re\njson.load(??)\njson.loads(??)\njson.scanner\njson.scanner.NUMBER_RE\njson.scanner.c_make_scanner\njson.scanner.make_scanner\njson.scanner.py_make_scanner(??)\njson.scanner.re\njson.tool\njson.tool.json\njson.tool.main(??)\njson.tool.sys\nkeyword.iskeyword\nkeyword.kwlist\nkeyword.main(??)\nlen(object) -> integer\nlicense\nlinecache.cache\nlinecache.checkcache(??)\nlinecache.clearcache(??)\nlinecache.getline(??)\nlinecache.getlines(??)\nlinecache.os\nlinecache.sys\nlinecache.updatecache(??)\nlinuxaudiodev.AFMT_A_LAW\nlinuxaudiodev.AFMT_MU_LAW\nlinuxaudiodev.AFMT_S16_BE\nlinuxaudiodev.AFMT_S16_LE\nlinuxaudiodev.AFMT_S16_NE\nlinuxaudiodev.AFMT_S8\nlinuxaudiodev.AFMT_U16_BE\nlinuxaudiodev.AFMT_U16_LE\nlinuxaudiodev.AFMT_U8\nlinuxaudiodev.error\nlinuxaudiodev.open\nlist() -> new empty list\nlocale.ABDAY_1\nlocale.ABDAY_2\nlocale.ABDAY_3\nlocale.ABDAY_4\nlocale.ABDAY_5\nlocale.ABDAY_6\nlocale.ABDAY_7\nlocale.ABMON_1\nlocale.ABMON_10\nlocale.ABMON_11\nlocale.ABMON_12\nlocale.ABMON_2\nlocale.ABMON_3\nlocale.ABMON_4\nlocale.ABMON_5\nlocale.ABMON_6\nlocale.ABMON_7\nlocale.ABMON_8\nlocale.ABMON_9\nlocale.ALT_DIGITS\nlocale.AM_STR\nlocale.CHAR_MAX\nlocale.CODESET\nlocale.CRNCYSTR\nlocale.DAY_1\nlocale.DAY_2\nlocale.DAY_3\nlocale.DAY_4\nlocale.DAY_5\nlocale.DAY_6\nlocale.DAY_7\nlocale.D_FMT\nlocale.D_T_FMT\nlocale.ERA\nlocale.ERA_D_FMT\nlocale.ERA_D_T_FMT\nlocale.ERA_T_FMT\nlocale.Error\nlocale.LC_ALL\nlocale.LC_COLLATE\nlocale.LC_CTYPE\nlocale.LC_MESSAGES\nlocale.LC_MONETARY\nlocale.LC_NUMERIC\nlocale.LC_TIME\nlocale.MON_1\nlocale.MON_10\nlocale.MON_11\nlocale.MON_12\nlocale.MON_2\nlocale.MON_3\nlocale.MON_4\nlocale.MON_5\nlocale.MON_6\nlocale.MON_7\nlocale.MON_8\nlocale.MON_9\nlocale.NOEXPR\nlocale.PM_STR\nlocale.RADIXCHAR\nlocale.THOUSEP\nlocale.T_FMT\nlocale.T_FMT_AMPM\nlocale.YESEXPR\nlocale.atof(??)\nlocale.atoi(??)\nlocale.bind_textdomain_codeset(domain, codeset) -> string\nlocale.bindtextdomain(domain, dir) -> string\nlocale.currency(??)\nlocale.dcgettext(domain, msg, category) -> string\nlocale.dgettext(domain, msg) -> string\nlocale.encodings\nlocale.format(??)\nlocale.format_string(??)\nlocale.functools\nlocale.getdefaultlocale(??)\nlocale.getlocale(??)\nlocale.getpreferredencoding(??)\nlocale.gettext(msg) -> string\nlocale.locale_alias\nlocale.locale_encoding_alias\nlocale.localeconv(??)\nlocale.nl_langinfo(key) -> string\nlocale.normalize(??)\nlocale.operator\nlocale.re\nlocale.resetlocale(??)\nlocale.setlocale(??)\nlocale.str(??)\nlocale.strcoll\nlocale.strxfrm\nlocale.sys\nlocale.textdomain(domain) -> string\nlocale.windows_locale\nlocals() -> dictionary\nlogging.BASIC_FORMAT\nlogging.BufferingFormatter\nlogging.CRITICAL\nlogging.DEBUG\nlogging.ERROR\nlogging.FATAL\nlogging.FileHandler\nlogging.Filter\nlogging.Filterer\nlogging.Formatter\nlogging.Handler\nlogging.INFO\nlogging.LogRecord\nlogging.Logger\nlogging.LoggerAdapter\nlogging.Manager\nlogging.NOTSET\nlogging.NullHandler\nlogging.PlaceHolder\nlogging.RootLogger\nlogging.StreamHandler\nlogging.WARN\nlogging.WARNING\nlogging.addLevelName(??)\nlogging.atexit\nlogging.basicConfig(??)\nlogging.cStringIO\nlogging.captureWarnings(??)\nlogging.codecs\nlogging.config\nlogging.config.BaseConfigurator\nlogging.config.ConvertingDict\nlogging.config.ConvertingList\nlogging.config.ConvertingTuple\nlogging.config.DEFAULT_LOGGING_CONFIG_PORT\nlogging.config.DictConfigurator\nlogging.config.IDENTIFIER\nlogging.config.RESET_ERROR\nlogging.config.StreamRequestHandler(??)\nlogging.config.ThreadingTCPServer(??)\nlogging.config.cStringIO\nlogging.config.dictConfig(??)\nlogging.config.dictConfigClass\nlogging.config.fileConfig(??)\nlogging.config.listen(??)\nlogging.config.logging\nlogging.config.os\nlogging.config.re\nlogging.config.socket\nlogging.config.stopListening(??)\nlogging.config.struct\nlogging.config.sys\nlogging.config.thread\nlogging.config.threading\nlogging.config.traceback\nlogging.config.types\nlogging.config.valid_ident(??)\nlogging.critical(??)\nlogging.currentframe(??)\nlogging.debug(??)\nlogging.disable(??)\nlogging.error(??)\nlogging.exception(??)\nlogging.fatal(??)\nlogging.getLevelName(??)\nlogging.getLogger(??)\nlogging.getLoggerClass(??)\nlogging.handlers\nlogging.handlers.BaseRotatingHandler\nlogging.handlers.BufferingHandler\nlogging.handlers.DEFAULT_HTTP_LOGGING_PORT\nlogging.handlers.DEFAULT_SOAP_LOGGING_PORT\nlogging.handlers.DEFAULT_TCP_LOGGING_PORT\nlogging.handlers.DEFAULT_UDP_LOGGING_PORT\nlogging.handlers.DatagramHandler\nlogging.handlers.HTTPHandler\nlogging.handlers.MemoryHandler\nlogging.handlers.NTEventLogHandler\nlogging.handlers.RotatingFileHandler\nlogging.handlers.SMTPHandler\nlogging.handlers.ST_DEV\nlogging.handlers.ST_INO\nlogging.handlers.ST_MTIME\nlogging.handlers.SYSLOG_TCP_PORT\nlogging.handlers.SYSLOG_UDP_PORT\nlogging.handlers.SocketHandler\nlogging.handlers.SysLogHandler\nlogging.handlers.TimedRotatingFileHandler\nlogging.handlers.WatchedFileHandler\nlogging.handlers.cPickle\nlogging.handlers.codecs\nlogging.handlers.logging\nlogging.handlers.os\nlogging.handlers.re\nlogging.handlers.socket\nlogging.handlers.struct\nlogging.handlers.time\nlogging.info(??)\nlogging.log(??)\nlogging.logMultiprocessing\nlogging.logProcesses\nlogging.logThreads\nlogging.makeLogRecord(??)\nlogging.os\nlogging.raiseExceptions\nlogging.root\nlogging.setLoggerClass(??)\nlogging.shutdown(??)\nlogging.sys\nlogging.thread\nlogging.threading\nlogging.time\nlogging.traceback\nlogging.warn(??)\nlogging.warning(??)\nlogging.warnings\nlogging.weakref\nlong(x[, base]) -> integer\nmacpath.SF_APPEND\nmacpath.SF_ARCHIVED\nmacpath.SF_IMMUTABLE\nmacpath.SF_NOUNLINK\nmacpath.SF_SNAPSHOT\nmacpath.ST_ATIME\nmacpath.ST_CTIME\nmacpath.ST_DEV\nmacpath.ST_GID\nmacpath.ST_INO\nmacpath.ST_MODE\nmacpath.ST_MTIME\nmacpath.ST_NLINK\nmacpath.ST_SIZE\nmacpath.ST_UID\nmacpath.S_ENFMT\nmacpath.S_IEXEC\nmacpath.S_IFBLK\nmacpath.S_IFCHR\nmacpath.S_IFDIR\nmacpath.S_IFIFO\nmacpath.S_IFLNK\nmacpath.S_IFMT(??)\nmacpath.S_IFREG\nmacpath.S_IFSOCK\nmacpath.S_IMODE(??)\nmacpath.S_IREAD\nmacpath.S_IRGRP\nmacpath.S_IROTH\nmacpath.S_IRUSR\nmacpath.S_IRWXG\nmacpath.S_IRWXO\nmacpath.S_IRWXU\nmacpath.S_ISBLK(??)\nmacpath.S_ISCHR(??)\nmacpath.S_ISDIR(??)\nmacpath.S_ISFIFO(??)\nmacpath.S_ISGID\nmacpath.S_ISLNK(??)\nmacpath.S_ISREG(??)\nmacpath.S_ISSOCK(??)\nmacpath.S_ISUID\nmacpath.S_ISVTX\nmacpath.S_IWGRP\nmacpath.S_IWOTH\nmacpath.S_IWRITE\nmacpath.S_IWUSR\nmacpath.S_IXGRP\nmacpath.S_IXOTH\nmacpath.S_IXUSR\nmacpath.UF_APPEND\nmacpath.UF_IMMUTABLE\nmacpath.UF_NODUMP\nmacpath.UF_NOUNLINK\nmacpath.UF_OPAQUE\nmacpath.abspath(??)\nmacpath.altsep\nmacpath.basename(??)\nmacpath.commonprefix(??)\nmacpath.curdir\nmacpath.defpath\nmacpath.devnull\nmacpath.dirname(??)\nmacpath.exists(??)\nmacpath.expanduser(??)\nmacpath.expandvars(??)\nmacpath.extsep\nmacpath.genericpath\nmacpath.getatime(??)\nmacpath.getctime(??)\nmacpath.getmtime(??)\nmacpath.getsize(??)\nmacpath.isabs(??)\nmacpath.isdir(??)\nmacpath.isfile(??)\nmacpath.islink(??)\nmacpath.ismount(??)\nmacpath.join(??)\nmacpath.lexists(??)\nmacpath.norm_error\nmacpath.normcase(??)\nmacpath.normpath(??)\nmacpath.os\nmacpath.pardir\nmacpath.pathsep\nmacpath.realpath(??)\nmacpath.sep\nmacpath.split(??)\nmacpath.splitdrive(??)\nmacpath.splitext(??)\nmacpath.supports_unicode_filenames\nmacpath.walk(??)\nmacpath.warnings\nmacurl2path.os\nmacurl2path.pathname2url(??)\nmacurl2path.test(??)\nmacurl2path.url2pathname(??)\nmacurl2path.urllib\nmailbox.Babyl(??)\nmailbox.BabylMailbox(??)\nmailbox.BabylMessage(??)\nmailbox.Error\nmailbox.ExternalClashError\nmailbox.FormatError\nmailbox.MH(??)\nmailbox.MHMailbox(??)\nmailbox.MHMessage(??)\nmailbox.MMDF(??)\nmailbox.MMDFMessage(??)\nmailbox.Mailbox(??)\nmailbox.Maildir(??)\nmailbox.MaildirMessage(??)\nmailbox.Message(??)\nmailbox.MmdfMailbox(??)\nmailbox.NoSuchMailboxError\nmailbox.NotEmptyError\nmailbox.PortableUnixMailbox(??)\nmailbox.StringIO\nmailbox.UnixMailbox(??)\nmailbox.calendar\nmailbox.copy\nmailbox.email\nmailbox.errno\nmailbox.fcntl\nmailbox.mbox(??)\nmailbox.mboxMessage(??)\nmailbox.os\nmailbox.rfc822\nmailbox.socket\nmailbox.sys\nmailbox.time\nmailbox.warnings\nmailcap.findmatch(??)\nmailcap.findparam(??)\nmailcap.getcaps(??)\nmailcap.listmailcapfiles(??)\nmailcap.lookup(??)\nmailcap.os\nmailcap.parsefield(??)\nmailcap.parseline(??)\nmailcap.readmailcapfile(??)\nmailcap.show(??)\nmailcap.subst(??)\nmailcap.test(??)\nmap(function, sequence[, sequence, ...]) -> list\nmarkupbase.ParserBase(??)\nmarshal.dump(value, file[, version])\nmarshal.dumps(value[, version])\nmarshal.load(file)\nmarshal.loads(string)\nmarshal.version\nmath.acos(x)\nmath.acosh(x)\nmath.asin(x)\nmath.asinh(x)\nmath.atan(x)\nmath.atan2(y, x)\nmath.atanh(x)\nmath.ceil(x)\nmath.copysign(x, y)\nmath.cos(x)\nmath.cosh(x)\nmath.degrees(x)\nmath.e\nmath.erf(x)\nmath.erfc(x)\nmath.exp(x)\nmath.expm1(x)\nmath.fabs(x)\nmath.factorial(x) -> Integral\nmath.floor(x)\nmath.fmod(x, y)\nmath.frexp(x)\nmath.fsum(iterable)\nmath.gamma(x)\nmath.hypot(x, y)\nmath.isinf(x) -> bool\nmath.isnan(x) -> bool\nmath.ldexp(x, i)\nmath.lgamma(x)\nmath.log(x[, base])\nmath.log10(x)\nmath.log1p(x)\nmath.modf(x)\nmath.pi\nmath.pow(x, y)\nmath.radians(x)\nmath.sin(x)\nmath.sinh(x)\nmath.sqrt(x)\nmath.tan(x)\nmath.tanh(x)\nmath.trunc(x:Real) -> Integral\nmax(iterable[, key=func]) -> value\nmd5.blocksize\nmd5.digest_size\nmd5.md5\nmd5.new\nmd5.warnings\nmemoryview(object)\nmhlib.Error\nmhlib.FOLDER_PROTECT\nmhlib.Folder(??)\nmhlib.IntSet(??)\nmhlib.MH(??)\nmhlib.MH_PROFILE\nmhlib.MH_SEQUENCES\nmhlib.Message(??)\nmhlib.PATH\nmhlib.SubMessage(??)\nmhlib.bisect\nmhlib.isnumeric(??)\nmhlib.mimetools\nmhlib.multifile\nmhlib.numericprog\nmhlib.os\nmhlib.pickline(??)\nmhlib.re\nmhlib.shutil\nmhlib.sys\nmhlib.test(??)\nmhlib.updateline(??)\nmimetools.Message(??)\nmimetools.catch_warnings\nmimetools.choose_boundary(??)\nmimetools.copybinary(??)\nmimetools.copyliteral(??)\nmimetools.decode(??)\nmimetools.decodetab\nmimetools.encode(??)\nmimetools.encodetab\nmimetools.filterwarnings(??)\nmimetools.os\nmimetools.pipethrough(??)\nmimetools.pipeto(??)\nmimetools.rfc822\nmimetools.sys\nmimetools.tempfile\nmimetools.uudecode_pipe\nmimetools.warnpy3k(??)\nmimetypes.MimeTypes(??)\nmimetypes.add_type(??)\nmimetypes.common_types\nmimetypes.encodings_map\nmimetypes.guess_all_extensions(??)\nmimetypes.guess_extension(??)\nmimetypes.guess_type(??)\nmimetypes.init(??)\nmimetypes.inited\nmimetypes.knownfiles\nmimetypes.os\nmimetypes.posixpath\nmimetypes.read_mime_types(??)\nmimetypes.suffix_map\nmimetypes.sys\nmimetypes.types_map\nmimetypes.urllib\nmimify.CHARSET\nmimify.File(??)\nmimify.HeaderFile(??)\nmimify.MAXLEN\nmimify.QUOTE\nmimify.base64_re\nmimify.chrset\nmimify.cte\nmimify.he\nmimify.iso_char\nmimify.mime_char\nmimify.mime_code\nmimify.mime_decode(??)\nmimify.mime_decode_header(??)\nmimify.mime_encode(??)\nmimify.mime_encode_header(??)\nmimify.mime_head\nmimify.mime_header\nmimify.mime_header_char\nmimify.mimify(??)\nmimify.mimify_part(??)\nmimify.mp\nmimify.mv\nmimify.qp\nmimify.re\nmimify.repl\nmimify.sys\nmimify.unmimify(??)\nmimify.unmimify_part(??)\nmimify.warnings\nmin(iterable[, key=func]) -> value\nmmap.ACCESS_COPY\nmmap.ACCESS_READ\nmmap.ACCESS_WRITE\nmmap.ALLOCATIONGRANULARITY\nmmap.MAP_ANON\nmmap.MAP_ANONYMOUS\nmmap.MAP_DENYWRITE\nmmap.MAP_EXECUTABLE\nmmap.MAP_PRIVATE\nmmap.MAP_SHARED\nmmap.PAGESIZE\nmmap.PROT_EXEC\nmmap.PROT_READ\nmmap.PROT_WRITE\nmmap.error\nmmap.mmap\nmodulefinder.AddPackagePath(??)\nmodulefinder.HAVE_ARGUMENT\nmodulefinder.IMPORT_NAME\nmodulefinder.LOAD_CONST\nmodulefinder.Module(??)\nmodulefinder.ModuleFinder(??)\nmodulefinder.READ_MODE\nmodulefinder.ReplacePackage(??)\nmodulefinder.STORE_GLOBAL\nmodulefinder.STORE_NAME\nmodulefinder.STORE_OPS\nmodulefinder.dis\nmodulefinder.generators\nmodulefinder.imp\nmodulefinder.marshal\nmodulefinder.os\nmodulefinder.packagePathMap\nmodulefinder.replacePackageMap\nmodulefinder.struct\nmodulefinder.sys\nmodulefinder.test(??)\nmodulefinder.types\nmultifile.Error\nmultifile.MultiFile(??)\nmultiprocessing.Array(??)\nmultiprocessing.AuthenticationError\nmultiprocessing.BoundedSemaphore(??)\nmultiprocessing.BufferTooShort\nmultiprocessing.Condition(??)\nmultiprocessing.Event(??)\nmultiprocessing.JoinableQueue(??)\nmultiprocessing.Lock(??)\nmultiprocessing.Manager(??)\nmultiprocessing.Pipe(??)\nmultiprocessing.Pool(??)\nmultiprocessing.Process\nmultiprocessing.ProcessError\nmultiprocessing.Queue(??)\nmultiprocessing.RLock(??)\nmultiprocessing.RawArray(??)\nmultiprocessing.RawValue(??)\nmultiprocessing.SUBDEBUG\nmultiprocessing.SUBWARNING\nmultiprocessing.Semaphore(??)\nmultiprocessing.TimeoutError\nmultiprocessing.Value(??)\nmultiprocessing.active_children(??)\nmultiprocessing.allow_connection_pickling(??)\nmultiprocessing.connection\nmultiprocessing.connection.AuthenticationError\nmultiprocessing.connection.BUFSIZE\nmultiprocessing.connection.CHALLENGE\nmultiprocessing.connection.CONNECTION_TIMEOUT\nmultiprocessing.connection.Client(??)\nmultiprocessing.connection.ConnectionWrapper\nmultiprocessing.connection.FAILURE\nmultiprocessing.connection.Finalize\nmultiprocessing.connection.Listener\nmultiprocessing.connection.MESSAGE_LENGTH\nmultiprocessing.connection.Pipe(??)\nmultiprocessing.connection.SocketClient(??)\nmultiprocessing.connection.SocketListener\nmultiprocessing.connection.WELCOME\nmultiprocessing.connection.XmlClient(??)\nmultiprocessing.connection.XmlListener\nmultiprocessing.connection.address_type(??)\nmultiprocessing.connection.answer_challenge(??)\nmultiprocessing.connection.arbitrary_address(??)\nmultiprocessing.connection.close(fd)\nmultiprocessing.connection.current_process(??)\nmultiprocessing.connection.debug(??)\nmultiprocessing.connection.default_family\nmultiprocessing.connection.deliver_challenge(??)\nmultiprocessing.connection.duplicate\nmultiprocessing.connection.errno\nmultiprocessing.connection.families\nmultiprocessing.connection.get_temp_dir(??)\nmultiprocessing.connection.itertools\nmultiprocessing.connection.os\nmultiprocessing.connection.socket\nmultiprocessing.connection.sub_debug(??)\nmultiprocessing.connection.sys\nmultiprocessing.connection.tempfile\nmultiprocessing.connection.time\nmultiprocessing.cpu_count(??)\nmultiprocessing.current_process(??)\nmultiprocessing.dummy\nmultiprocessing.dummy.Array(??)\nmultiprocessing.dummy.BoundedSemaphore(??)\nmultiprocessing.dummy.Condition\nmultiprocessing.dummy.DummyProcess\nmultiprocessing.dummy.Event(??)\nmultiprocessing.dummy.JoinableQueue(??)\nmultiprocessing.dummy.Lock\nmultiprocessing.dummy.Manager(??)\nmultiprocessing.dummy.Namespace\nmultiprocessing.dummy.Pipe(??)\nmultiprocessing.dummy.Pool(??)\nmultiprocessing.dummy.Process\nmultiprocessing.dummy.Queue(??)\nmultiprocessing.dummy.RLock(??)\nmultiprocessing.dummy.Semaphore(??)\nmultiprocessing.dummy.TimeoutError\nmultiprocessing.dummy.Value\nmultiprocessing.dummy.active_children(??)\nmultiprocessing.dummy.array\nmultiprocessing.dummy.connection\nmultiprocessing.dummy.connection.Client(??)\nmultiprocessing.dummy.connection.Connection\nmultiprocessing.dummy.connection.Listener\nmultiprocessing.dummy.connection.Pipe(??)\nmultiprocessing.dummy.connection.Queue(??)\nmultiprocessing.dummy.connection.families\nmultiprocessing.dummy.cpu_count(??)\nmultiprocessing.dummy.current_process(??)\nmultiprocessing.dummy.dict() -> new empty dictionary\nmultiprocessing.dummy.freeze_support(??)\nmultiprocessing.dummy.itertools\nmultiprocessing.dummy.list() -> new empty list\nmultiprocessing.dummy.shutdown(??)\nmultiprocessing.dummy.sys\nmultiprocessing.dummy.threading\nmultiprocessing.dummy.weakref\nmultiprocessing.forking\nmultiprocessing.forking.ForkingPickler(??)\nmultiprocessing.forking.Pickler(??)\nmultiprocessing.forking.Popen\nmultiprocessing.forking.assert_spawning(??)\nmultiprocessing.forking.close(fd)\nmultiprocessing.forking.duplicate\nmultiprocessing.forking.exit\nmultiprocessing.forking.old_main_modules\nmultiprocessing.forking.os\nmultiprocessing.forking.partial(func, *args, **keywords) - new function with partial application\nmultiprocessing.forking.prepare(??)\nmultiprocessing.forking.process\nmultiprocessing.forking.signal\nmultiprocessing.forking.sys\nmultiprocessing.forking.time\nmultiprocessing.forking.util\nmultiprocessing.freeze_support(??)\nmultiprocessing.get_logger(??)\nmultiprocessing.heap\nmultiprocessing.heap.Arena\nmultiprocessing.heap.BufferWrapper\nmultiprocessing.heap.Finalize\nmultiprocessing.heap.Heap\nmultiprocessing.heap.assert_spawning(??)\nmultiprocessing.heap.bisect\nmultiprocessing.heap.info(??)\nmultiprocessing.heap.itertools\nmultiprocessing.heap.mmap\nmultiprocessing.heap.os\nmultiprocessing.heap.sys\nmultiprocessing.heap.tempfile\nmultiprocessing.heap.threading\nmultiprocessing.log_to_stderr(??)\nmultiprocessing.managers\nmultiprocessing.managers.AcquirerProxy\nmultiprocessing.managers.Array(??)\nmultiprocessing.managers.ArrayProxy\nmultiprocessing.managers.AuthenticationString\nmultiprocessing.managers.AutoProxy(??)\nmultiprocessing.managers.BaseListProxy\nmultiprocessing.managers.BaseManager\nmultiprocessing.managers.BaseProxy\nmultiprocessing.managers.ConditionProxy\nmultiprocessing.managers.DictProxy\nmultiprocessing.managers.EventProxy\nmultiprocessing.managers.Finalize\nmultiprocessing.managers.ForkingPickler(??)\nmultiprocessing.managers.IteratorProxy\nmultiprocessing.managers.ListProxy\nmultiprocessing.managers.MakeProxyType(??)\nmultiprocessing.managers.Namespace\nmultiprocessing.managers.NamespaceProxy\nmultiprocessing.managers.PicklingError\nmultiprocessing.managers.Pool(??)\nmultiprocessing.managers.PoolProxy\nmultiprocessing.managers.Popen\nmultiprocessing.managers.Process\nmultiprocessing.managers.ProcessLocalSet\nmultiprocessing.managers.Queue\nmultiprocessing.managers.RebuildProxy(??)\nmultiprocessing.managers.RemoteError\nmultiprocessing.managers.Server\nmultiprocessing.managers.State\nmultiprocessing.managers.SyncManager\nmultiprocessing.managers.Token\nmultiprocessing.managers.Value\nmultiprocessing.managers.ValueProxy\nmultiprocessing.managers.active_children(??)\nmultiprocessing.managers.all_methods(??)\nmultiprocessing.managers.array\nmultiprocessing.managers.assert_spawning(??)\nmultiprocessing.managers.connection\nmultiprocessing.managers.convert_to_error(??)\nmultiprocessing.managers.current_process(??)\nmultiprocessing.managers.dispatch(??)\nmultiprocessing.managers.exit\nmultiprocessing.managers.format_exc(??)\nmultiprocessing.managers.info(??)\nmultiprocessing.managers.listener_client\nmultiprocessing.managers.name\nmultiprocessing.managers.os\nmultiprocessing.managers.public_methods(??)\nmultiprocessing.managers.reduce_array(??)\nmultiprocessing.managers.sys\nmultiprocessing.managers.threading\nmultiprocessing.managers.util\nmultiprocessing.managers.view_types\nmultiprocessing.managers.weakref\nmultiprocessing.os\nmultiprocessing.pool\nmultiprocessing.pool.ApplyResult\nmultiprocessing.pool.CLOSE\nmultiprocessing.pool.Finalize\nmultiprocessing.pool.IMapIterator\nmultiprocessing.pool.IMapUnorderedIterator\nmultiprocessing.pool.MapResult\nmultiprocessing.pool.Pool\nmultiprocessing.pool.Process\nmultiprocessing.pool.Queue\nmultiprocessing.pool.RUN\nmultiprocessing.pool.TERMINATE\nmultiprocessing.pool.ThreadPool\nmultiprocessing.pool.TimeoutError\nmultiprocessing.pool.collections\nmultiprocessing.pool.cpu_count(??)\nmultiprocessing.pool.debug(??)\nmultiprocessing.pool.itertools\nmultiprocessing.pool.job_counter\nmultiprocessing.pool.mapstar(??)\nmultiprocessing.pool.threading\nmultiprocessing.pool.time\nmultiprocessing.pool.worker(??)\nmultiprocessing.process\nmultiprocessing.process.AuthenticationString\nmultiprocessing.process.ORIGINAL_DIR\nmultiprocessing.process.Process\nmultiprocessing.process.active_children(??)\nmultiprocessing.process.current_process(??)\nmultiprocessing.process.itertools\nmultiprocessing.process.name\nmultiprocessing.process.os\nmultiprocessing.process.signal\nmultiprocessing.process.signum\nmultiprocessing.process.sys\nmultiprocessing.queues\nmultiprocessing.queues.BoundedSemaphore\nmultiprocessing.queues.Condition\nmultiprocessing.queues.Empty\nmultiprocessing.queues.Finalize\nmultiprocessing.queues.Full\nmultiprocessing.queues.JoinableQueue\nmultiprocessing.queues.Lock\nmultiprocessing.queues.Pipe(??)\nmultiprocessing.queues.Queue\nmultiprocessing.queues.Semaphore\nmultiprocessing.queues.SimpleQueue\nmultiprocessing.queues.assert_spawning(??)\nmultiprocessing.queues.atexit\nmultiprocessing.queues.collections\nmultiprocessing.queues.debug(??)\nmultiprocessing.queues.info(??)\nmultiprocessing.queues.os\nmultiprocessing.queues.register_after_fork(??)\nmultiprocessing.queues.sys\nmultiprocessing.queues.threading\nmultiprocessing.queues.time\nmultiprocessing.queues.weakref\nmultiprocessing.reduction\nmultiprocessing.reduction.Client(??)\nmultiprocessing.reduction.ForkingPickler(??)\nmultiprocessing.reduction.Listener\nmultiprocessing.reduction.Popen\nmultiprocessing.reduction.close(fd)\nmultiprocessing.reduction.current_process(??)\nmultiprocessing.reduction.debug(??)\nmultiprocessing.reduction.duplicate\nmultiprocessing.reduction.fromfd(??)\nmultiprocessing.reduction.os\nmultiprocessing.reduction.rebuild_connection(??)\nmultiprocessing.reduction.rebuild_handle(??)\nmultiprocessing.reduction.rebuild_socket(??)\nmultiprocessing.reduction.recv_handle(??)\nmultiprocessing.reduction.reduce_connection(??)\nmultiprocessing.reduction.reduce_handle(??)\nmultiprocessing.reduction.reduce_socket(??)\nmultiprocessing.reduction.register_after_fork(??)\nmultiprocessing.reduction.send_handle(??)\nmultiprocessing.reduction.socket\nmultiprocessing.reduction.sub_debug(??)\nmultiprocessing.reduction.sys\nmultiprocessing.reduction.threading\nmultiprocessing.sharedctypes\nmultiprocessing.sharedctypes.Array(??)\nmultiprocessing.sharedctypes.ForkingPickler(??)\nmultiprocessing.sharedctypes.RLock(??)\nmultiprocessing.sharedctypes.RawArray(??)\nmultiprocessing.sharedctypes.RawValue(??)\nmultiprocessing.sharedctypes.Synchronized\nmultiprocessing.sharedctypes.SynchronizedArray\nmultiprocessing.sharedctypes.SynchronizedBase\nmultiprocessing.sharedctypes.SynchronizedString\nmultiprocessing.sharedctypes.Value(??)\nmultiprocessing.sharedctypes.assert_spawning(??)\nmultiprocessing.sharedctypes.class_cache\nmultiprocessing.sharedctypes.copy(??)\nmultiprocessing.sharedctypes.ctypes\nmultiprocessing.sharedctypes.heap\nmultiprocessing.sharedctypes.make_property(??)\nmultiprocessing.sharedctypes.prop_cache\nmultiprocessing.sharedctypes.rebuild_ctype(??)\nmultiprocessing.sharedctypes.reduce_ctype(??)\nmultiprocessing.sharedctypes.synchronized(??)\nmultiprocessing.sharedctypes.sys\nmultiprocessing.sharedctypes.template\nmultiprocessing.sharedctypes.typecode_to_type\nmultiprocessing.sharedctypes.weakref\nmultiprocessing.synchronize\nmultiprocessing.synchronize.BoundedSemaphore\nmultiprocessing.synchronize.Condition\nmultiprocessing.synchronize.Event\nmultiprocessing.synchronize.Finalize\nmultiprocessing.synchronize.Lock\nmultiprocessing.synchronize.Popen\nmultiprocessing.synchronize.RECURSIVE_MUTEX\nmultiprocessing.synchronize.RLock\nmultiprocessing.synchronize.SEMAPHORE\nmultiprocessing.synchronize.SEM_VALUE_MAX\nmultiprocessing.synchronize.SemLock\nmultiprocessing.synchronize.Semaphore\nmultiprocessing.synchronize.assert_spawning(??)\nmultiprocessing.synchronize.current_process(??)\nmultiprocessing.synchronize.debug(??)\nmultiprocessing.synchronize.os\nmultiprocessing.synchronize.register_after_fork(??)\nmultiprocessing.synchronize.sys\nmultiprocessing.synchronize.threading\nmultiprocessing.sys\nmultiprocessing.util\nmultiprocessing.util.DEBUG\nmultiprocessing.util.DEFAULT_LOGGING_FORMAT\nmultiprocessing.util.Finalize\nmultiprocessing.util.ForkAwareLocal\nmultiprocessing.util.ForkAwareThreadLock\nmultiprocessing.util.INFO\nmultiprocessing.util.LOGGER_NAME\nmultiprocessing.util.NOTSET\nmultiprocessing.util.SUBDEBUG\nmultiprocessing.util.SUBWARNING\nmultiprocessing.util.active_children(??)\nmultiprocessing.util.atexit\nmultiprocessing.util.current_process(??)\nmultiprocessing.util.debug(??)\nmultiprocessing.util.get_logger(??)\nmultiprocessing.util.get_temp_dir(??)\nmultiprocessing.util.info(??)\nmultiprocessing.util.is_exiting(??)\nmultiprocessing.util.itertools\nmultiprocessing.util.log_to_stderr(??)\nmultiprocessing.util.register_after_fork(??)\nmultiprocessing.util.sub_debug(??)\nmultiprocessing.util.sub_warning(??)\nmultiprocessing.util.threading\nmultiprocessing.util.weakref\nmutex.deque(iterable[, maxlen]) --> deque object\nmutex.mutex(??)\nnetrc.NetrcParseError\nnetrc.netrc(??)\nnetrc.os\nnetrc.shlex\nnew.classobj(name, bases, dict)\nnew.code\nnew.function(code, globals[, name[, argdefs[, closure]]])\nnew.instance(class[, dict])\nnew.instancemethod(function, instance, class)\nnew.module(name[, doc])\nnext(iterator[, default])\nnis.cat(map, domain = defaultdomain)\nnis.error\nnis.get_default_domain() -> str\nnis.maps(domain = defaultdomain)\nnis.match(key, map, domain = defaultdomain)\nnntplib.CRLF\nnntplib.LONGRESP\nnntplib.NNTP(??)\nnntplib.NNTPDataError\nnntplib.NNTPError\nnntplib.NNTPPermanentError\nnntplib.NNTPProtocolError\nnntplib.NNTPReplyError\nnntplib.NNTPTemporaryError\nnntplib.NNTP_PORT\nnntplib.error_data\nnntplib.error_perm\nnntplib.error_proto\nnntplib.error_reply\nnntplib.error_temp\nnntplib.re\nnntplib.socket\nntpath.abspath(??)\nntpath.altsep\nntpath.basename(??)\nntpath.commonprefix(??)\nntpath.curdir\nntpath.defpath\nntpath.devnull\nntpath.dirname(??)\nntpath.exists(??)\nntpath.expanduser(??)\nntpath.expandvars(??)\nntpath.extsep\nntpath.genericpath\nntpath.getatime(??)\nntpath.getctime(??)\nntpath.getmtime(??)\nntpath.getsize(??)\nntpath.isabs(??)\nntpath.isdir(??)\nntpath.isfile(??)\nntpath.islink(??)\nntpath.ismount(??)\nntpath.join(??)\nntpath.lexists(??)\nntpath.normcase(??)\nntpath.normpath(??)\nntpath.os\nntpath.pardir\nntpath.pathsep\nntpath.realpath(??)\nntpath.relpath(??)\nntpath.sep\nntpath.split(??)\nntpath.splitdrive(??)\nntpath.splitext(??)\nntpath.splitunc(??)\nntpath.stat\nntpath.supports_unicode_filenames\nntpath.sys\nntpath.walk(??)\nntpath.warnings\nnturl2path.pathname2url(??)\nnturl2path.url2pathname(??)\nnumbers.ABCMeta\nnumbers.Complex\nnumbers.Integral\nnumbers.Number\nnumbers.Rational\nnumbers.Real\nnumbers.abstractmethod(??)\nnumbers.abstractproperty\nnumbers.division\nobject\noct(number) -> string\nopcode.EXTENDED_ARG\nopcode.HAVE_ARGUMENT\nopcode.cmp_op\nopcode.hascompare\nopcode.hasconst\nopcode.hasfree\nopcode.hasjabs\nopcode.hasjrel\nopcode.haslocal\nopcode.hasname\nopcode.opmap\nopcode.opname\nopen(name[, mode[, buffering]]) -> file object\noperator.abs(a) -- Same as abs(a).\noperator.add(a, b) -- Same as a + b.\noperator.and_(a, b) -- Same as a & b.\noperator.attrgetter(attr, ...) --> attrgetter object\noperator.concat(a, b) -- Same as a + b, for a and b sequences.\noperator.contains(a, b) -- Same as b in a (note reversed operands).\noperator.countOf(a, b) -- Return the number of times b occurs in a.\noperator.delitem(a, b) -- Same as del a[b].\noperator.delslice(a, b, c) -- Same as del a[b:c].\noperator.div(a, b) -- Same as a / b when __future__.division is not in effect.\noperator.eq(a, b) -- Same as a==b.\noperator.floordiv(a, b) -- Same as a // b.\noperator.ge(a, b) -- Same as a>=b.\noperator.getitem(a, b) -- Same as a[b].\noperator.getslice(a, b, c) -- Same as a[b:c].\noperator.gt(a, b) -- Same as a>b.\noperator.iadd\noperator.iand\noperator.iconcat\noperator.idiv\noperator.ifloordiv\noperator.ilshift\noperator.imod\noperator.imul\noperator.index(a) -- Same as a.__index__()\noperator.indexOf(a, b) -- Return the first index of b in a.\noperator.inv(a) -- Same as ~a.\noperator.invert(a) -- Same as ~a.\noperator.ior\noperator.ipow\noperator.irepeat\noperator.irshift\noperator.isCallable(a) -- Same as callable(a).\noperator.isMappingType(a) -- Return True if a has a mapping type, False otherwise.\noperator.isNumberType(a) -- Return True if a has a numeric type, False otherwise.\noperator.isSequenceType(a) -- Return True if a has a sequence type, False otherwise.\noperator.is_(a, b) -- Same as a is b.\noperator.is_not(a, b) -- Same as a is not b.\noperator.isub\noperator.itemgetter(item, ...) --> itemgetter object\noperator.itruediv\noperator.ixor\noperator.le(a, b) -- Same as a<=b.\noperator.lshift(a, b) -- Same as a << b.\noperator.lt(a, b) -- Same as a<b.\noperator.methodcaller(name, ...) --> methodcaller object\noperator.mod(a, b) -- Same as a % b.\noperator.mul(a, b) -- Same as a * b.\noperator.ne(a, b) -- Same as a!=b.\noperator.neg(a) -- Same as -a.\noperator.not_(a) -- Same as not a.\noperator.or_(a, b) -- Same as a | b.\noperator.pos(a) -- Same as +a.\noperator.pow(a, b) -- Same as a ** b.\noperator.repeat(a, b) -- Return a * b, where a is a sequence, and b is an integer.\noperator.rshift(a, b) -- Same as a >> b.\noperator.sequenceIncludes(a, b) -- Same as b in a (note reversed operands; deprecated).\noperator.setitem(a, b, c) -- Same as a[b] = c.\noperator.setslice(a, b, c, d) -- Same as a[b:c] = d.\noperator.sub(a, b) -- Same as a - b.\noperator.truediv(a, b) -- Same as a / b when __future__.division is in effect.\noperator.truth(a) -- Return True if a is true, False otherwise.\noperator.xor(a, b) -- Same as a ^ b.\noptparse.AmbiguousOptionError\noptparse.BadOptionError\noptparse.HelpFormatter(??)\noptparse.IndentedHelpFormatter(??)\noptparse.NO_DEFAULT\noptparse.OptParseError\noptparse.Option(??)\noptparse.OptionConflictError\noptparse.OptionContainer(??)\noptparse.OptionError\noptparse.OptionGroup(??)\noptparse.OptionParser(??)\noptparse.OptionValueError\noptparse.SUPPRESS_HELP\noptparse.SUPPRESS_USAGE\noptparse.TitledHelpFormatter(??)\noptparse.Values(??)\noptparse.check_builtin(??)\noptparse.check_choice(??)\noptparse.gettext(??)\noptparse.isbasestring(??)\noptparse.make_option(??)\noptparse.os\noptparse.sys\noptparse.textwrap\noptparse.types\nord(c) -> integer\nos.EX_CANTCREAT\nos.EX_CONFIG\nos.EX_DATAERR\nos.EX_IOERR\nos.EX_NOHOST\nos.EX_NOINPUT\nos.EX_NOPERM\nos.EX_NOUSER\nos.EX_OK\nos.EX_OSERR\nos.EX_OSFILE\nos.EX_PROTOCOL\nos.EX_SOFTWARE\nos.EX_TEMPFAIL\nos.EX_UNAVAILABLE\nos.EX_USAGE\nos.F_OK\nos.NGROUPS_MAX\nos.O_APPEND\nos.O_ASYNC\nos.O_CREAT\nos.O_DIRECT\nos.O_DIRECTORY\nos.O_DSYNC\nos.O_EXCL\nos.O_LARGEFILE\nos.O_NDELAY\nos.O_NOATIME\nos.O_NOCTTY\nos.O_NOFOLLOW\nos.O_NONBLOCK\nos.O_RDONLY\nos.O_RDWR\nos.O_RSYNC\nos.O_SYNC\nos.O_TRUNC\nos.O_WRONLY\nos.P_NOWAIT\nos.P_NOWAITO\nos.P_WAIT\nos.R_OK\nos.SEEK_CUR\nos.SEEK_END\nos.SEEK_SET\nos.TMP_MAX\nos.UserDict\nos.WCONTINUED\nos.WCOREDUMP(status) -> bool\nos.WEXITSTATUS(status) -> integer\nos.WIFCONTINUED(status) -> bool\nos.WIFEXITED(status) -> bool\nos.WIFSIGNALED(status) -> bool\nos.WIFSTOPPED(status) -> bool\nos.WNOHANG\nos.WSTOPSIG(status) -> integer\nos.WTERMSIG(status) -> integer\nos.WUNTRACED\nos.W_OK\nos.X_OK\nos.abort() -> does not return!\nos.access(path, mode) -> True if granted, False otherwise\nos.altsep\nos.chdir(path)\nos.chmod(path, mode)\nos.chown(path, uid, gid)\nos.chroot(path)\nos.close(fd)\nos.closerange(fd_low, fd_high)\nos.confstr(name) -> string\nos.confstr_names\nos.ctermid() -> string\nos.curdir\nos.defpath\nos.devnull\nos.dup(fd) -> fd2\nos.dup2(old_fd, new_fd)\nos.environ\nos.errno\nos.error\nos.execl(file, *args)\nos.execle(file, *args, env)\nos.execlp(file, *args)\nos.execlpe(file, *args, env)\nos.execv(path, args)\nos.execve(path, args, env)\nos.execvp(file, args)\nos.execvpe(file, args, env)\nos.extsep\nos.fchdir(fildes)\nos.fchmod(fd, mode)\nos.fchown(fd, uid, gid)\nos.fdatasync(fildes)\nos.fdopen(fd [, mode='r' [, bufsize]]) -> file_object\nos.fork() -> pid\nos.forkpty() -> (pid, master_fd)\nos.fpathconf(fd, name) -> integer\nos.fstat(fd) -> stat result\nos.fstatvfs(fd) -> statvfs result\nos.fsync(fildes)\nos.ftruncate(fd, length)\nos.getcwd() -> path\nos.getcwdu() -> path\nos.getegid() -> egid\nos.getenv(??)\nos.geteuid() -> euid\nos.getgid() -> gid\nos.getgroups() -> list of group IDs\nos.getloadavg() -> (float, float, float)\nos.getlogin() -> string\nos.getpgid(pid) -> pgid\nos.getpgrp() -> pgrp\nos.getpid() -> pid\nos.getppid() -> ppid\nos.getresgid() -> (rgid, egid, sgid)\nos.getresuid() -> (ruid, euid, suid)\nos.getsid(pid) -> sid\nos.getuid() -> uid\nos.initgroups(username, gid) -> None\nos.isatty(fd) -> bool\nos.kill(pid, sig)\nos.killpg(pgid, sig)\nos.lchown(path, uid, gid)\nos.linesep\nos.link(src, dst)\nos.listdir(path) -> list_of_strings\nos.lseek(fd, pos, how) -> newpos\nos.lstat(path) -> stat result\nos.major(device) -> major number\nos.makedev(major, minor) -> device number\nos.makedirs(path [, mode=0777])\nos.minor(device) -> minor number\nos.mkdir(path [, mode=0777])\nos.mkfifo(filename [, mode=0666])\nos.mknod(filename [, mode=0600, device])\nos.name\nos.nice(inc) -> new_priority\nos.open(filename, flag [, mode=0777]) -> fd\nos.openpty() -> (master_fd, slave_fd)\nos.pardir\nos.path\nos.pathconf(path, name) -> integer\nos.pathconf_names\nos.pathsep\nos.pipe() -> (read_end, write_end)\nos.popen(command [, mode='r' [, bufsize]]) -> pipe\nos.popen2(??)\nos.popen3(??)\nos.popen4(??)\nos.putenv(key, value)\nos.read(fd, buffersize) -> string\nos.readlink(path) -> path\nos.remove(path)\nos.removedirs(path)\nos.rename(old, new)\nos.renames(old, new)\nos.rmdir(path)\nos.sep\nos.setegid(gid)\nos.seteuid(uid)\nos.setgid(gid)\nos.setgroups(list)\nos.setpgid(pid, pgrp)\nos.setpgrp()\nos.setregid(rgid, egid)\nos.setresgid(rgid, egid, sgid)\nos.setresuid(ruid, euid, suid)\nos.setreuid(ruid, euid)\nos.setsid()\nos.setuid(uid)\nos.spawnl(mode, file, *args) -> integer\nos.spawnle(mode, file, *args, env) -> integer\nos.spawnlp(mode, file, *args) -> integer\nos.spawnlpe(mode, file, *args, env) -> integer\nos.spawnv(mode, file, args) -> integer\nos.spawnve(mode, file, args, env) -> integer\nos.spawnvp(mode, file, args) -> integer\nos.spawnvpe(mode, file, args, env) -> integer\nos.stat(path) -> stat result\nos.stat_float_times([newval]) -> oldval\nos.stat_result\nos.statvfs(path) -> statvfs result\nos.statvfs_result\nos.strerror(code) -> string\nos.symlink(src, dst)\nos.sys\nos.sysconf(name) -> integer\nos.sysconf_names\nos.system(command) -> exit_status\nos.tcgetpgrp(fd) -> pgid\nos.tcsetpgrp(fd, pgid)\nos.tempnam([dir[, prefix]]) -> string\nos.times() -> (utime, stime, cutime, cstime, elapsed_time)\nos.tmpfile() -> file object\nos.tmpnam() -> string\nos.ttyname(fd) -> string\nos.umask(new_mask) -> old_mask\nos.uname() -> (sysname, nodename, release, version, machine)\nos.unlink(path)\nos.unsetenv(key)\nos.urandom(n) -> str\nos.utime(path, (atime, mtime))\nos.wait() -> (pid, status)\nos.wait3(options) -> (pid, status, rusage)\nos.wait4(pid, options) -> (pid, status, rusage)\nos.waitpid(pid, options) -> (pid, status)\nos.walk(??)\nos.write(fd, string) -> byteswritten\nos2emxpath.abspath(??)\nos2emxpath.altsep\nos2emxpath.basename(??)\nos2emxpath.commonprefix(??)\nos2emxpath.curdir\nos2emxpath.defpath\nos2emxpath.devnull\nos2emxpath.dirname(??)\nos2emxpath.exists(??)\nos2emxpath.expanduser(??)\nos2emxpath.expandvars(??)\nos2emxpath.extsep\nos2emxpath.getatime(??)\nos2emxpath.getctime(??)\nos2emxpath.getmtime(??)\nos2emxpath.getsize(??)\nos2emxpath.isabs(??)\nos2emxpath.isdir(??)\nos2emxpath.isfile(??)\nos2emxpath.islink(??)\nos2emxpath.ismount(??)\nos2emxpath.join(??)\nos2emxpath.lexists(??)\nos2emxpath.normcase(??)\nos2emxpath.normpath(??)\nos2emxpath.os\nos2emxpath.pardir\nos2emxpath.pathsep\nos2emxpath.realpath(??)\nos2emxpath.sep\nos2emxpath.split(??)\nos2emxpath.splitdrive(??)\nos2emxpath.splitext(??)\nos2emxpath.splitunc(??)\nos2emxpath.stat\nos2emxpath.supports_unicode_filenames\nos2emxpath.walk(??)\nossaudiodev.AFMT_AC3\nossaudiodev.AFMT_A_LAW\nossaudiodev.AFMT_IMA_ADPCM\nossaudiodev.AFMT_MPEG\nossaudiodev.AFMT_MU_LAW\nossaudiodev.AFMT_QUERY\nossaudiodev.AFMT_S16_BE\nossaudiodev.AFMT_S16_LE\nossaudiodev.AFMT_S16_NE\nossaudiodev.AFMT_S8\nossaudiodev.AFMT_U16_BE\nossaudiodev.AFMT_U16_LE\nossaudiodev.AFMT_U8\nossaudiodev.OSSAudioError\nossaudiodev.SNDCTL_COPR_HALT\nossaudiodev.SNDCTL_COPR_LOAD\nossaudiodev.SNDCTL_COPR_RCODE\nossaudiodev.SNDCTL_COPR_RCVMSG\nossaudiodev.SNDCTL_COPR_RDATA\nossaudiodev.SNDCTL_COPR_RESET\nossaudiodev.SNDCTL_COPR_RUN\nossaudiodev.SNDCTL_COPR_SENDMSG\nossaudiodev.SNDCTL_COPR_WCODE\nossaudiodev.SNDCTL_COPR_WDATA\nossaudiodev.SNDCTL_DSP_BIND_CHANNEL\nossaudiodev.SNDCTL_DSP_CHANNELS\nossaudiodev.SNDCTL_DSP_GETBLKSIZE\nossaudiodev.SNDCTL_DSP_GETCAPS\nossaudiodev.SNDCTL_DSP_GETCHANNELMASK\nossaudiodev.SNDCTL_DSP_GETFMTS\nossaudiodev.SNDCTL_DSP_GETIPTR\nossaudiodev.SNDCTL_DSP_GETISPACE\nossaudiodev.SNDCTL_DSP_GETODELAY\nossaudiodev.SNDCTL_DSP_GETOPTR\nossaudiodev.SNDCTL_DSP_GETOSPACE\nossaudiodev.SNDCTL_DSP_GETSPDIF\nossaudiodev.SNDCTL_DSP_GETTRIGGER\nossaudiodev.SNDCTL_DSP_MAPINBUF\nossaudiodev.SNDCTL_DSP_MAPOUTBUF\nossaudiodev.SNDCTL_DSP_NONBLOCK\nossaudiodev.SNDCTL_DSP_POST\nossaudiodev.SNDCTL_DSP_PROFILE\nossaudiodev.SNDCTL_DSP_RESET\nossaudiodev.SNDCTL_DSP_SAMPLESIZE\nossaudiodev.SNDCTL_DSP_SETDUPLEX\nossaudiodev.SNDCTL_DSP_SETFMT\nossaudiodev.SNDCTL_DSP_SETFRAGMENT\nossaudiodev.SNDCTL_DSP_SETSPDIF\nossaudiodev.SNDCTL_DSP_SETSYNCRO\nossaudiodev.SNDCTL_DSP_SETTRIGGER\nossaudiodev.SNDCTL_DSP_SPEED\nossaudiodev.SNDCTL_DSP_STEREO\nossaudiodev.SNDCTL_DSP_SUBDIVIDE\nossaudiodev.SNDCTL_DSP_SYNC\nossaudiodev.SNDCTL_FM_4OP_ENABLE\nossaudiodev.SNDCTL_FM_LOAD_INSTR\nossaudiodev.SNDCTL_MIDI_INFO\nossaudiodev.SNDCTL_MIDI_MPUCMD\nossaudiodev.SNDCTL_MIDI_MPUMODE\nossaudiodev.SNDCTL_MIDI_PRETIME\nossaudiodev.SNDCTL_SEQ_CTRLRATE\nossaudiodev.SNDCTL_SEQ_GETINCOUNT\nossaudiodev.SNDCTL_SEQ_GETOUTCOUNT\nossaudiodev.SNDCTL_SEQ_GETTIME\nossaudiodev.SNDCTL_SEQ_NRMIDIS\nossaudiodev.SNDCTL_SEQ_NRSYNTHS\nossaudiodev.SNDCTL_SEQ_OUTOFBAND\nossaudiodev.SNDCTL_SEQ_PANIC\nossaudiodev.SNDCTL_SEQ_PERCMODE\nossaudiodev.SNDCTL_SEQ_RESET\nossaudiodev.SNDCTL_SEQ_RESETSAMPLES\nossaudiodev.SNDCTL_SEQ_SYNC\nossaudiodev.SNDCTL_SEQ_TESTMIDI\nossaudiodev.SNDCTL_SEQ_THRESHOLD\nossaudiodev.SNDCTL_SYNTH_CONTROL\nossaudiodev.SNDCTL_SYNTH_ID\nossaudiodev.SNDCTL_SYNTH_INFO\nossaudiodev.SNDCTL_SYNTH_MEMAVL\nossaudiodev.SNDCTL_SYNTH_REMOVESAMPLE\nossaudiodev.SNDCTL_TMR_CONTINUE\nossaudiodev.SNDCTL_TMR_METRONOME\nossaudiodev.SNDCTL_TMR_SELECT\nossaudiodev.SNDCTL_TMR_SOURCE\nossaudiodev.SNDCTL_TMR_START\nossaudiodev.SNDCTL_TMR_STOP\nossaudiodev.SNDCTL_TMR_TEMPO\nossaudiodev.SNDCTL_TMR_TIMEBASE\nossaudiodev.SOUND_MIXER_ALTPCM\nossaudiodev.SOUND_MIXER_BASS\nossaudiodev.SOUND_MIXER_CD\nossaudiodev.SOUND_MIXER_DIGITAL1\nossaudiodev.SOUND_MIXER_DIGITAL2\nossaudiodev.SOUND_MIXER_DIGITAL3\nossaudiodev.SOUND_MIXER_IGAIN\nossaudiodev.SOUND_MIXER_IMIX\nossaudiodev.SOUND_MIXER_LINE\nossaudiodev.SOUND_MIXER_LINE1\nossaudiodev.SOUND_MIXER_LINE2\nossaudiodev.SOUND_MIXER_LINE3\nossaudiodev.SOUND_MIXER_MIC\nossaudiodev.SOUND_MIXER_MONITOR\nossaudiodev.SOUND_MIXER_NRDEVICES\nossaudiodev.SOUND_MIXER_OGAIN\nossaudiodev.SOUND_MIXER_PCM\nossaudiodev.SOUND_MIXER_PHONEIN\nossaudiodev.SOUND_MIXER_PHONEOUT\nossaudiodev.SOUND_MIXER_RADIO\nossaudiodev.SOUND_MIXER_RECLEV\nossaudiodev.SOUND_MIXER_SPEAKER\nossaudiodev.SOUND_MIXER_SYNTH\nossaudiodev.SOUND_MIXER_TREBLE\nossaudiodev.SOUND_MIXER_VIDEO\nossaudiodev.SOUND_MIXER_VOLUME\nossaudiodev.control_labels\nossaudiodev.control_names\nossaudiodev.error\nossaudiodev.open\nossaudiodev.openmixer\nparser.ASTType\nparser.ParserError\nparser.STType\nparser.ast2list\nparser.ast2tuple\nparser.compileast\nparser.compilest\nparser.expr\nparser.isexpr\nparser.issuite\nparser.sequence2ast\nparser.sequence2st\nparser.st2list\nparser.st2tuple\nparser.suite\nparser.tuple2ast\nparser.tuple2st\npdb.Pdb(??)\npdb.Repr(??)\npdb.Restart\npdb.TESTCMD\npdb.bdb\npdb.cmd\npdb.find_function(??)\npdb.help(??)\npdb.line_prefix\npdb.linecache\npdb.main(??)\npdb.os\npdb.pm(??)\npdb.post_mortem(??)\npdb.pprint\npdb.re\npdb.run(??)\npdb.runcall(??)\npdb.runctx(??)\npdb.runeval(??)\npdb.set_trace(??)\npdb.sys\npdb.test(??)\npdb.traceback\npickle.APPEND\npickle.APPENDS\npickle.BINFLOAT\npickle.BINGET\npickle.BININT\npickle.BININT1\npickle.BININT2\npickle.BINPERSID\npickle.BINPUT\npickle.BINSTRING\npickle.BINUNICODE\npickle.BUILD\npickle.BooleanType\npickle.BufferType\npickle.BuiltinFunctionType\npickle.BuiltinMethodType\npickle.ClassType\npickle.CodeType\npickle.ComplexType\npickle.DICT\npickle.DUP\npickle.DictProxyType\npickle.DictType\npickle.DictionaryType\npickle.EMPTY_DICT\npickle.EMPTY_LIST\npickle.EMPTY_TUPLE\npickle.EXT1\npickle.EXT2\npickle.EXT4\npickle.EllipsisType\npickle.FALSE\npickle.FLOAT\npickle.FileType\npickle.FloatType\npickle.FrameType\npickle.FunctionType\npickle.GET\npickle.GLOBAL\npickle.GeneratorType\npickle.GetSetDescriptorType\npickle.HIGHEST_PROTOCOL\npickle.INST\npickle.INT\npickle.InstanceType\npickle.IntType\npickle.LIST\npickle.LONG\npickle.LONG1\npickle.LONG4\npickle.LONG_BINGET\npickle.LONG_BINPUT\npickle.LambdaType\npickle.ListType\npickle.LongType\npickle.MARK\npickle.MemberDescriptorType\npickle.MethodType\npickle.ModuleType\npickle.NEWFALSE\npickle.NEWOBJ\npickle.NEWTRUE\npickle.NONE\npickle.NoneType\npickle.NotImplementedType\npickle.OBJ\npickle.ObjectType\npickle.PERSID\npickle.POP\npickle.POP_MARK\npickle.PROTO\npickle.PUT\npickle.PickleError\npickle.Pickler(??)\npickle.PicklingError\npickle.PyStringMap\npickle.REDUCE\npickle.SETITEM\npickle.SETITEMS\npickle.SHORT_BINSTRING\npickle.STOP\npickle.STRING\npickle.SliceType\npickle.StringIO([s]) -- Return a StringIO-like stream for reading or writing\npickle.StringType\npickle.StringTypes\npickle.TRUE\npickle.TUPLE\npickle.TUPLE1\npickle.TUPLE2\npickle.TUPLE3\npickle.TracebackType\npickle.TupleType\npickle.TypeType\npickle.UNICODE\npickle.UnboundMethodType\npickle.UnicodeType\npickle.Unpickler(??)\npickle.UnpicklingError\npickle.XRangeType\npickle.classmap\npickle.compatible_formats\npickle.decode_long(??)\npickle.dispatch_table\npickle.dump(??)\npickle.dumps(??)\npickle.encode_long(??)\npickle.format_version\npickle.load(??)\npickle.loads(??)\npickle.marshal\npickle.mloads\npickle.re\npickle.struct\npickle.sys\npickle.whichmodule(??)\npickletools.ArgumentDescriptor\npickletools.OpcodeInfo\npickletools.StackObject\npickletools.TAKEN_FROM_ARGUMENT1\npickletools.TAKEN_FROM_ARGUMENT4\npickletools.UP_TO_NEWLINE\npickletools.anyobject\npickletools.code2op\npickletools.decimalnl_long\npickletools.decimalnl_short\npickletools.decode_long(??)\npickletools.dis(??)\npickletools.float8\npickletools.floatnl\npickletools.genops(??)\npickletools.int4\npickletools.long1\npickletools.long4\npickletools.markobject\npickletools.opcodes\npickletools.optimize(??)\npickletools.pybool\npickletools.pydict\npickletools.pyfloat\npickletools.pyint\npickletools.pyinteger_or_bool\npickletools.pylist\npickletools.pylong\npickletools.pynone\npickletools.pystring\npickletools.pytuple\npickletools.pyunicode\npickletools.read_decimalnl_long(??)\npickletools.read_decimalnl_short(??)\npickletools.read_float8(??)\npickletools.read_floatnl(??)\npickletools.read_int4(??)\npickletools.read_long1(??)\npickletools.read_long4(??)\npickletools.read_string1(??)\npickletools.read_string4(??)\npickletools.read_stringnl(??)\npickletools.read_stringnl_noescape(??)\npickletools.read_stringnl_noescape_pair(??)\npickletools.read_uint1(??)\npickletools.read_uint2(??)\npickletools.read_unicodestring4(??)\npickletools.read_unicodestringnl(??)\npickletools.stackslice\npickletools.string1\npickletools.string4\npickletools.stringnl\npickletools.stringnl_noescape\npickletools.stringnl_noescape_pair\npickletools.uint1\npickletools.uint2\npickletools.unicodestring4\npickletools.unicodestringnl\npipes.FILEIN_FILEOUT\npipes.FILEIN_STDOUT\npipes.SINK\npipes.SOURCE\npipes.STDIN_FILEOUT\npipes.STDIN_STDOUT\npipes.Template(??)\npipes.makepipeline(??)\npipes.os\npipes.quote(??)\npipes.re\npipes.stepkinds\npipes.string\npipes.tempfile\npkgutil.ImpImporter(??)\npkgutil.ImpLoader(??)\npkgutil.ModuleType\npkgutil.extend_path(??)\npkgutil.find_loader(??)\npkgutil.get_data(??)\npkgutil.get_importer(??)\npkgutil.get_loader(??)\npkgutil.imp\npkgutil.iter_importer_modules(??)\npkgutil.iter_importers(??)\npkgutil.iter_modules(??)\npkgutil.iter_zipimport_modules(??)\npkgutil.os\npkgutil.read_code(??)\npkgutil.simplegeneric(??)\npkgutil.sys\npkgutil.walk_packages(??)\npkgutil.zipimport\npkgutil.zipimporter(archivepath) -> zipimporter object\nplatform.DEV_NULL\nplatform.architecture(??)\nplatform.dist(??)\nplatform.java_ver(??)\nplatform.libc_ver(??)\nplatform.linux_distribution(??)\nplatform.mac_ver(??)\nplatform.machine(??)\nplatform.node(??)\nplatform.os\nplatform.platform(??)\nplatform.popen(??)\nplatform.processor(??)\nplatform.python_branch(??)\nplatform.python_build(??)\nplatform.python_compiler(??)\nplatform.python_implementation(??)\nplatform.python_revision(??)\nplatform.python_version(??)\nplatform.python_version_tuple(??)\nplatform.re\nplatform.release(??)\nplatform.string\nplatform.sys\nplatform.system(??)\nplatform.system_alias(??)\nplatform.uname(??)\nplatform.version(??)\nplatform.win32_ver(??)\nplistlib.Data(??)\nplistlib.Dict\nplistlib.DumbXMLWriter(??)\nplistlib.PLISTHEADER\nplistlib.Plist\nplistlib.PlistParser(??)\nplistlib.PlistWriter(??)\nplistlib.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nplistlib.binascii\nplistlib.datetime\nplistlib.re\nplistlib.readPlist(??)\nplistlib.readPlistFromResource(??)\nplistlib.readPlistFromString(??)\nplistlib.warnings\nplistlib.writePlist(??)\nplistlib.writePlistToResource(??)\nplistlib.writePlistToString(??)\npopen2.MAXFD\npopen2.Popen3(??)\npopen2.Popen4(??)\npopen2.os\npopen2.popen2(??)\npopen2.popen3(??)\npopen2.popen4(??)\npopen2.sys\npopen2.warnings\npoplib.CR\npoplib.CRLF\npoplib.LF\npoplib.POP3(??)\npoplib.POP3_PORT\npoplib.POP3_SSL(??)\npoplib.POP3_SSL_PORT\npoplib.error_proto\npoplib.re\npoplib.socket\npoplib.ssl\nposix.EX_CANTCREAT\nposix.EX_CONFIG\nposix.EX_DATAERR\nposix.EX_IOERR\nposix.EX_NOHOST\nposix.EX_NOINPUT\nposix.EX_NOPERM\nposix.EX_NOUSER\nposix.EX_OK\nposix.EX_OSERR\nposix.EX_OSFILE\nposix.EX_PROTOCOL\nposix.EX_SOFTWARE\nposix.EX_TEMPFAIL\nposix.EX_UNAVAILABLE\nposix.EX_USAGE\nposix.F_OK\nposix.NGROUPS_MAX\nposix.O_APPEND\nposix.O_ASYNC\nposix.O_CREAT\nposix.O_DIRECT\nposix.O_DIRECTORY\nposix.O_DSYNC\nposix.O_EXCL\nposix.O_LARGEFILE\nposix.O_NDELAY\nposix.O_NOATIME\nposix.O_NOCTTY\nposix.O_NOFOLLOW\nposix.O_NONBLOCK\nposix.O_RDONLY\nposix.O_RDWR\nposix.O_RSYNC\nposix.O_SYNC\nposix.O_TRUNC\nposix.O_WRONLY\nposix.R_OK\nposix.TMP_MAX\nposix.WCONTINUED\nposix.WCOREDUMP(status) -> bool\nposix.WEXITSTATUS(status) -> integer\nposix.WIFCONTINUED(status) -> bool\nposix.WIFEXITED(status) -> bool\nposix.WIFSIGNALED(status) -> bool\nposix.WIFSTOPPED(status) -> bool\nposix.WNOHANG\nposix.WSTOPSIG(status) -> integer\nposix.WTERMSIG(status) -> integer\nposix.WUNTRACED\nposix.W_OK\nposix.X_OK\nposix.abort() -> does not return!\nposix.access(path, mode) -> True if granted, False otherwise\nposix.chdir(path)\nposix.chmod(path, mode)\nposix.chown(path, uid, gid)\nposix.chroot(path)\nposix.close(fd)\nposix.closerange(fd_low, fd_high)\nposix.confstr(name) -> string\nposix.confstr_names\nposix.ctermid() -> string\nposix.dup(fd) -> fd2\nposix.dup2(old_fd, new_fd)\nposix.environ\nposix.error\nposix.execv(path, args)\nposix.execve(path, args, env)\nposix.fchdir(fildes)\nposix.fchmod(fd, mode)\nposix.fchown(fd, uid, gid)\nposix.fdatasync(fildes)\nposix.fdopen(fd [, mode='r' [, bufsize]]) -> file_object\nposix.fork() -> pid\nposix.forkpty() -> (pid, master_fd)\nposix.fpathconf(fd, name) -> integer\nposix.fstat(fd) -> stat result\nposix.fstatvfs(fd) -> statvfs result\nposix.fsync(fildes)\nposix.ftruncate(fd, length)\nposix.getcwd() -> path\nposix.getcwdu() -> path\nposix.getegid() -> egid\nposix.geteuid() -> euid\nposix.getgid() -> gid\nposix.getgroups() -> list of group IDs\nposix.getloadavg() -> (float, float, float)\nposix.getlogin() -> string\nposix.getpgid(pid) -> pgid\nposix.getpgrp() -> pgrp\nposix.getpid() -> pid\nposix.getppid() -> ppid\nposix.getresgid() -> (rgid, egid, sgid)\nposix.getresuid() -> (ruid, euid, suid)\nposix.getsid(pid) -> sid\nposix.getuid() -> uid\nposix.initgroups(username, gid) -> None\nposix.isatty(fd) -> bool\nposix.kill(pid, sig)\nposix.killpg(pgid, sig)\nposix.lchown(path, uid, gid)\nposix.link(src, dst)\nposix.listdir(path) -> list_of_strings\nposix.lseek(fd, pos, how) -> newpos\nposix.lstat(path) -> stat result\nposix.major(device) -> major number\nposix.makedev(major, minor) -> device number\nposix.minor(device) -> minor number\nposix.mkdir(path [, mode=0777])\nposix.mkfifo(filename [, mode=0666])\nposix.mknod(filename [, mode=0600, device])\nposix.nice(inc) -> new_priority\nposix.open(filename, flag [, mode=0777]) -> fd\nposix.openpty() -> (master_fd, slave_fd)\nposix.pathconf(path, name) -> integer\nposix.pathconf_names\nposix.pipe() -> (read_end, write_end)\nposix.popen(command [, mode='r' [, bufsize]]) -> pipe\nposix.putenv(key, value)\nposix.read(fd, buffersize) -> string\nposix.readlink(path) -> path\nposix.remove(path)\nposix.rename(old, new)\nposix.rmdir(path)\nposix.setegid(gid)\nposix.seteuid(uid)\nposix.setgid(gid)\nposix.setgroups(list)\nposix.setpgid(pid, pgrp)\nposix.setpgrp()\nposix.setregid(rgid, egid)\nposix.setresgid(rgid, egid, sgid)\nposix.setresuid(ruid, euid, suid)\nposix.setreuid(ruid, euid)\nposix.setsid()\nposix.setuid(uid)\nposix.stat(path) -> stat result\nposix.stat_float_times([newval]) -> oldval\nposix.stat_result\nposix.statvfs(path) -> statvfs result\nposix.statvfs_result\nposix.strerror(code) -> string\nposix.symlink(src, dst)\nposix.sysconf(name) -> integer\nposix.sysconf_names\nposix.system(command) -> exit_status\nposix.tcgetpgrp(fd) -> pgid\nposix.tcsetpgrp(fd, pgid)\nposix.tempnam([dir[, prefix]]) -> string\nposix.times() -> (utime, stime, cutime, cstime, elapsed_time)\nposix.tmpfile() -> file object\nposix.tmpnam() -> string\nposix.ttyname(fd) -> string\nposix.umask(new_mask) -> old_mask\nposix.uname() -> (sysname, nodename, release, version, machine)\nposix.unlink(path)\nposix.unsetenv(key)\nposix.utime(path, (atime, mtime))\nposix.wait() -> (pid, status)\nposix.wait3(options) -> (pid, status, rusage)\nposix.wait4(pid, options) -> (pid, status, rusage)\nposix.waitpid(pid, options) -> (pid, status)\nposix.write(fd, string) -> byteswritten\nposixfile.SEEK_CUR\nposixfile.SEEK_END\nposixfile.SEEK_SET\nposixfile.fileopen(??)\nposixfile.open(??)\nposixfile.warnings\nposixpath.abspath(??)\nposixpath.altsep\nposixpath.basename(??)\nposixpath.commonprefix(??)\nposixpath.curdir\nposixpath.defpath\nposixpath.devnull\nposixpath.dirname(??)\nposixpath.exists(??)\nposixpath.expanduser(??)\nposixpath.expandvars(??)\nposixpath.extsep\nposixpath.genericpath\nposixpath.getatime(??)\nposixpath.getctime(??)\nposixpath.getmtime(??)\nposixpath.getsize(??)\nposixpath.isabs(??)\nposixpath.isdir(??)\nposixpath.isfile(??)\nposixpath.islink(??)\nposixpath.ismount(??)\nposixpath.join(??)\nposixpath.lexists(??)\nposixpath.normcase(??)\nposixpath.normpath(??)\nposixpath.os\nposixpath.pardir\nposixpath.pathsep\nposixpath.realpath(??)\nposixpath.relpath(??)\nposixpath.samefile(??)\nposixpath.sameopenfile(??)\nposixpath.samestat(??)\nposixpath.sep\nposixpath.split(??)\nposixpath.splitdrive(??)\nposixpath.splitext(??)\nposixpath.stat\nposixpath.supports_unicode_filenames\nposixpath.walk(??)\nposixpath.warnings\npow(x, y[, z]) -> number\npprint.PrettyPrinter(??)\npprint.isreadable(??)\npprint.isrecursive(??)\npprint.pformat(??)\npprint.pprint(??)\npprint.saferepr(??)\npprint.warnings\nprint\nprofile.OptionParser(??)\nprofile.Profile(??)\nprofile.Stats(??)\nprofile.help(??)\nprofile.main(??)\nprofile.marshal\nprofile.os\nprofile.resgetrusage(??)\nprofile.resource\nprofile.run(??)\nprofile.runctx(??)\nprofile.sys\nprofile.time\nproperty(fget=None, fset=None, fdel=None, doc=None) -> property attribute\npstats.Stats(??)\npstats.TupleComp(??)\npstats.add_callers(??)\npstats.add_func_stats(??)\npstats.cmp_to_key(??)\npstats.count_calls(??)\npstats.f8(??)\npstats.func_get_function_name(??)\npstats.func_std_string(??)\npstats.func_strip_path(??)\npstats.marshal\npstats.os\npstats.re\npstats.sys\npstats.time\npty.CHILD\npty.STDERR_FILENO\npty.STDIN_FILENO\npty.STDOUT_FILENO\npty.fork() -> (pid, master_fd)\npty.master_open() -> (master_fd, slave_name)\npty.openpty() -> (master_fd, slave_fd)\npty.os\npty.select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\npty.slave_open(tty_name) -> slave_fd\npty.spawn(??)\npty.tty\npwd.getpwall() -> list_of_entries\npwd.getpwnam(name) -> (pw_name,pw_passwd,pw_uid,\npwd.getpwuid(uid) -> (pw_name,pw_passwd,pw_uid,\npwd.struct_passwd\npwd.struct_pwent\npy_compile.MAGIC\npy_compile.PyCompileError\npy_compile.compile(??)\npy_compile.imp\npy_compile.main(??)\npy_compile.marshal\npy_compile.os\npy_compile.sys\npy_compile.traceback\npy_compile.wr_long(??)\npyclbr.Class(??)\npyclbr.DEDENT\npyclbr.Function(??)\npyclbr.NAME\npyclbr.OP\npyclbr.imp\npyclbr.itemgetter(item, ...) --> itemgetter object\npyclbr.readmodule(??)\npyclbr.readmodule_ex(??)\npyclbr.sys\npyclbr.tokenize\npydoc.Doc(??)\npydoc.ErrorDuringImport\npydoc.HTMLDoc(??)\npydoc.HTMLRepr(??)\npydoc.Helper(??)\npydoc.ModuleScanner(??)\npydoc.Repr(??)\npydoc.Scanner(??)\npydoc.TextDoc(??)\npydoc.TextRepr(??)\npydoc.allmethods(??)\npydoc.apropos(??)\npydoc.classify_class_attrs(??)\npydoc.classname(??)\npydoc.cli(??)\npydoc.cram(??)\npydoc.deque(iterable[, maxlen]) --> deque object\npydoc.describe(??)\npydoc.doc(??)\npydoc.expandtabs(s [,tabsize]) -> string\npydoc.extract_tb(??)\npydoc.find(s, sub [,start [,end]]) -> in\npydoc.getdoc(??)\npydoc.getpager(??)\npydoc.gui(??)\npydoc.help\npydoc.html\npydoc.imp\npydoc.importfile(??)\npydoc.inspect\npydoc.isdata(??)\npydoc.ispackage(??)\npydoc.ispath(??)\npydoc.join(list [,sep]) -> string\npydoc.locate(??)\npydoc.lower(s) -> string\npydoc.os\npydoc.pager(??)\npydoc.pathdirs(??)\npydoc.pipepager(??)\npydoc.pkgutil\npydoc.plain(??)\npydoc.plainpager(??)\npydoc.re\npydoc.render_doc(??)\npydoc.replace(??)\npydoc.resolve(??)\npydoc.rfind(s, sub [,start [,end]]) -> int\npydoc.rstrip(s [,chars]) -> string\npydoc.safeimport(??)\npydoc.serve(??)\npydoc.source_synopsis(??)\npydoc.split(s [,sep [,maxsplit]]) -> list of strings\npydoc.splitdoc(??)\npydoc.strip(s [,chars]) -> string\npydoc.stripid(??)\npydoc.synopsis(??)\npydoc.sys\npydoc.tempfilepager(??)\npydoc.text\npydoc.ttypager(??)\npydoc.types\npydoc.visiblename(??)\npydoc.writedoc(??)\npydoc.writedocs(??)\npydoc_data.topics\npydoc_data.topics.topics\npyexpat.EXPAT_VERSION\npyexpat.ErrorString(errno) -> string\npyexpat.ExpatError\npyexpat.ParserCreate([encoding[, namespace_separator]]) -> parser\npyexpat.XMLParserType\npyexpat.XML_PARAM_ENTITY_PARSING_ALWAYS\npyexpat.XML_PARAM_ENTITY_PARSING_NEVER\npyexpat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE\npyexpat.error\npyexpat.errors\npyexpat.expat_CAPI\npyexpat.features\npyexpat.model\npyexpat.native_encoding\npyexpat.version_info\nquit\nquopri.EMPTYSTRING\nquopri.ESCAPE\nquopri.HEX\nquopri.MAXLINESIZE\nquopri.a2b_qp\nquopri.b2a_qp(data, quotetabs=0, istext=1, header=0) -> s;\nquopri.decode(??)\nquopri.decodestring(??)\nquopri.encode(??)\nquopri.encodestring(??)\nquopri.ishex(??)\nquopri.main(??)\nquopri.needsquoting(??)\nquopri.quote(??)\nquopri.unhex(??)\nrandom.BPF\nrandom.LOG4\nrandom.NV_MAGICCONST\nrandom.RECIP_BPF\nrandom.Random\nrandom.SG_MAGICCONST\nrandom.SystemRandom\nrandom.TWOPI\nrandom.WichmannHill\nrandom.betavariate\nrandom.choice\nrandom.division\nrandom.expovariate\nrandom.gammavariate\nrandom.gauss\nrandom.getrandbits(k) -> x.  Generates a long int with k random bits.\nrandom.getstate\nrandom.jumpahead(int) -> None.  Create new state from existing state and integer.\nrandom.lognormvariate\nrandom.normalvariate\nrandom.paretovariate\nrandom.randint\nrandom.random() -> x in the interval [0, 1).\nrandom.randrange\nrandom.sample\nrandom.seed\nrandom.setstate\nrandom.shuffle\nrandom.triangular\nrandom.uniform\nrandom.vonmisesvariate\nrandom.weibullvariate\nrange([start,] stop[, step]) -> list of integers\nraw_input([prompt]) -> string\nre.DEBUG\nre.DOTALL\nre.I\nre.IGNORECASE\nre.L\nre.LOCALE\nre.M\nre.MULTILINE\nre.S\nre.Scanner(??)\nre.T\nre.TEMPLATE\nre.U\nre.UNICODE\nre.VERBOSE\nre.X\nre.compile(??)\nre.copy_reg\nre.error\nre.escape(??)\nre.findall(??)\nre.finditer(??)\nre.match(??)\nre.purge(??)\nre.search(??)\nre.split(??)\nre.sre_compile\nre.sre_parse\nre.sub(??)\nre.subn(??)\nre.sys\nre.template(??)\nreduce(function, sequence[, initial]) -> value\nreload(module) -> module\nrepr(object) -> string\nrepr.Repr(??)\nrepr.aRepr\nrepr.islice(iterable, [start,] stop [, step]) --> islice object\nrepr.repr\nresource.RLIMIT_AS\nresource.RLIMIT_CORE\nresource.RLIMIT_CPU\nresource.RLIMIT_DATA\nresource.RLIMIT_FSIZE\nresource.RLIMIT_MEMLOCK\nresource.RLIMIT_NOFILE\nresource.RLIMIT_NPROC\nresource.RLIMIT_OFILE\nresource.RLIMIT_RSS\nresource.RLIMIT_STACK\nresource.RLIM_INFINITY\nresource.RUSAGE_CHILDREN\nresource.RUSAGE_SELF\nresource.error\nresource.getpagesize\nresource.getrlimit\nresource.getrusage\nresource.setrlimit\nresource.struct_rusage\nreversed(sequence) -> reverse iterator over values of the sequence\nrexec.FileBase(??)\nrexec.FileDelegate(??)\nrexec.FileWrapper(??)\nrexec.RExec(??)\nrexec.RHooks(??)\nrexec.RModuleImporter(??)\nrexec.RModuleLoader(??)\nrexec.TEMPLATE\nrexec.ihooks\nrexec.imp\nrexec.os\nrexec.sys\nrexec.test(??)\nrfc822.AddressList(??)\nrfc822.AddrlistClass(??)\nrfc822.Message(??)\nrfc822.dump_address_pair(??)\nrfc822.formatdate(??)\nrfc822.mktime_tz(??)\nrfc822.parseaddr(??)\nrfc822.parsedate(??)\nrfc822.parsedate_tz(??)\nrfc822.quote(??)\nrfc822.time\nrfc822.unquote(??)\nrfc822.warnpy3k(??)\nrlcompleter.Completer(??)\nrlcompleter.get_class_members(??)\nrobotparser.Entry(??)\nrobotparser.RobotFileParser(??)\nrobotparser.RuleLine(??)\nrobotparser.URLopener(??)\nrobotparser.urllib\nrobotparser.urlparse\nround(number[, ndigits]) -> floating point number\nrunpy.get_loader(??)\nrunpy.imp\nrunpy.read_code(??)\nrunpy.run_module(??)\nrunpy.run_path(??)\nrunpy.sys\nsched.Event(time, priority, action, argument)\nsched.heapq\nsched.namedtuple(??)\nsched.scheduler(??)\nselect.EPOLLERR\nselect.EPOLLET\nselect.EPOLLHUP\nselect.EPOLLIN\nselect.EPOLLMSG\nselect.EPOLLONESHOT\nselect.EPOLLOUT\nselect.EPOLLPRI\nselect.EPOLLRDBAND\nselect.EPOLLRDNORM\nselect.EPOLLWRBAND\nselect.EPOLLWRNORM\nselect.PIPE_BUF\nselect.POLLERR\nselect.POLLHUP\nselect.POLLIN\nselect.POLLMSG\nselect.POLLNVAL\nselect.POLLOUT\nselect.POLLPRI\nselect.POLLRDBAND\nselect.POLLRDNORM\nselect.POLLWRBAND\nselect.POLLWRNORM\nselect.epoll\nselect.error\nselect.poll\nselect.select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\nset() -> new empty set object\nsetattr(object, name, value)\nsets.BaseSet\nsets.ImmutableSet\nsets.Set\nsets.ifilter(function or None, sequence) --> ifilter object\nsets.ifilterfalse(function or None, sequence) --> ifilterfalse object\nsets.warnings\nsgmllib.SGMLParseError\nsgmllib.SGMLParser(??)\nsgmllib.TestSGMLParser(??)\nsgmllib.attrfind\nsgmllib.charref\nsgmllib.endbracket\nsgmllib.entityref\nsgmllib.incomplete\nsgmllib.interesting\nsgmllib.markupbase\nsgmllib.piclose\nsgmllib.re\nsgmllib.shorttag\nsgmllib.shorttagopen\nsgmllib.starttagopen\nsgmllib.tagfind\nsgmllib.test(??)\nsha.blocksize\nsha.digest_size\nsha.digestsize\nsha.new\nsha.sha\nsha.warnings\nshelve.BsdDbShelf(??)\nshelve.DbfilenameShelf(??)\nshelve.Pickler(file, protocol=0) -- Create a pickler.\nshelve.Shelf(??)\nshelve.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nshelve.Unpickler(file) -- Create an unpickler.\nshelve.UserDict\nshelve.open(??)\nshlex.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nshlex.deque(iterable[, maxlen]) --> deque object\nshlex.os\nshlex.shlex(??)\nshlex.split(??)\nshlex.sys\nshutil.Error\nshutil.ExecError\nshutil.SpecialFileError\nshutil.WindowsError\nshutil.abspath(??)\nshutil.collections\nshutil.copy(??)\nshutil.copy2(??)\nshutil.copyfile(??)\nshutil.copyfileobj(??)\nshutil.copymode(??)\nshutil.copystat(??)\nshutil.copytree(??)\nshutil.errno\nshutil.fnmatch\nshutil.get_archive_formats(??)\nshutil.getgrnam(name) -> tuple\nshutil.getpwnam(name) -> (pw_name,pw_passwd,pw_uid,\nshutil.ignore_patterns(??)\nshutil.make_archive(??)\nshutil.move(??)\nshutil.os\nshutil.register_archive_format(??)\nshutil.rmtree(??)\nshutil.stat\nshutil.sys\nshutil.unregister_archive_format(??)\nsignal.ITIMER_PROF\nsignal.ITIMER_REAL\nsignal.ITIMER_VIRTUAL\nsignal.ItimerError\nsignal.NSIG\nsignal.SIGABRT\nsignal.SIGALRM\nsignal.SIGBUS\nsignal.SIGCHLD\nsignal.SIGCLD\nsignal.SIGCONT\nsignal.SIGFPE\nsignal.SIGHUP\nsignal.SIGILL\nsignal.SIGINT\nsignal.SIGIO\nsignal.SIGIOT\nsignal.SIGKILL\nsignal.SIGPIPE\nsignal.SIGPOLL\nsignal.SIGPROF\nsignal.SIGPWR\nsignal.SIGQUIT\nsignal.SIGRTMAX\nsignal.SIGRTMIN\nsignal.SIGSEGV\nsignal.SIGSTOP\nsignal.SIGSYS\nsignal.SIGTERM\nsignal.SIGTRAP\nsignal.SIGTSTP\nsignal.SIGTTIN\nsignal.SIGTTOU\nsignal.SIGURG\nsignal.SIGUSR1\nsignal.SIGUSR2\nsignal.SIGVTALRM\nsignal.SIGWINCH\nsignal.SIGXCPU\nsignal.SIGXFSZ\nsignal.SIG_DFL\nsignal.SIG_IGN\nsignal.alarm(seconds)\nsignal.default_int_handler(...)\nsignal.getitimer(which)\nsignal.getsignal(sig) -> action\nsignal.pause()\nsignal.set_wakeup_fd(fd) -> fd\nsignal.setitimer(which, seconds[, interval])\nsignal.siginterrupt(sig, flag) -> None\nsignal.signal(sig, action) -> action\nsite.ENABLE_USER_SITE\nsite.PREFIXES\nsite.USER_BASE\nsite.USER_SITE\nsite.abs__file__(??)\nsite.addbuilddir(??)\nsite.addpackage(??)\nsite.addsitedir(??)\nsite.addsitepackages(??)\nsite.addusersitepackages(??)\nsite.aliasmbcs(??)\nsite.check_enableusersite(??)\nsite.execsitecustomize(??)\nsite.execusercustomize(??)\nsite.getsitepackages(??)\nsite.getuserbase(??)\nsite.getusersitepackages(??)\nsite.main(??)\nsite.makepath(??)\nsite.os\nsite.removeduppaths(??)\nsite.setBEGINLIBPATH(??)\nsite.setcopyright(??)\nsite.setencoding(??)\nsite.sethelper(??)\nsite.setquit(??)\nsite.sys\nslice([start,] stop[, step])\nsmtpd.COMMASPACE\nsmtpd.DEBUGSTREAM\nsmtpd.DebuggingServer(??)\nsmtpd.Devnull(??)\nsmtpd.EMPTYSTRING\nsmtpd.MailmanProxy(??)\nsmtpd.NEWLINE\nsmtpd.Options(??)\nsmtpd.PureProxy(??)\nsmtpd.SMTPChannel(??)\nsmtpd.SMTPServer(??)\nsmtpd.asynchat\nsmtpd.asyncore\nsmtpd.errno\nsmtpd.getopt\nsmtpd.os\nsmtpd.parseargs(??)\nsmtpd.program\nsmtpd.socket\nsmtpd.sys\nsmtpd.time\nsmtpd.usage(??)\nsmtplib.CRLF\nsmtplib.LMTP(??)\nsmtplib.LMTP_PORT\nsmtplib.OLDSTYLE_AUTH\nsmtplib.SMTP(??)\nsmtplib.SMTPAuthenticationError\nsmtplib.SMTPConnectError\nsmtplib.SMTPDataError\nsmtplib.SMTPException\nsmtplib.SMTPHeloError\nsmtplib.SMTPRecipientsRefused\nsmtplib.SMTPResponseException\nsmtplib.SMTPSenderRefused\nsmtplib.SMTPServerDisconnected\nsmtplib.SMTP_PORT\nsmtplib.SMTP_SSL(??)\nsmtplib.SMTP_SSL_PORT\nsmtplib.SSLFakeFile(??)\nsmtplib.base64\nsmtplib.email\nsmtplib.encode_base64(??)\nsmtplib.hmac\nsmtplib.quoteaddr(??)\nsmtplib.quotedata(??)\nsmtplib.re\nsmtplib.socket\nsmtplib.ssl\nsmtplib.stderr\nsndhdr.get_long_be(??)\nsndhdr.get_long_le(??)\nsndhdr.get_short_be(??)\nsndhdr.get_short_le(??)\nsndhdr.test(??)\nsndhdr.test_8svx(??)\nsndhdr.test_aifc(??)\nsndhdr.test_au(??)\nsndhdr.test_hcom(??)\nsndhdr.test_sndr(??)\nsndhdr.test_sndt(??)\nsndhdr.test_voc(??)\nsndhdr.test_wav(??)\nsndhdr.testall(??)\nsndhdr.tests\nsndhdr.what(??)\nsndhdr.whathdr(??)\nsocket.AF_APPLETALK\nsocket.AF_ASH\nsocket.AF_ATMPVC\nsocket.AF_ATMSVC\nsocket.AF_AX25\nsocket.AF_BRIDGE\nsocket.AF_DECnet\nsocket.AF_ECONET\nsocket.AF_INET\nsocket.AF_INET6\nsocket.AF_IPX\nsocket.AF_IRDA\nsocket.AF_KEY\nsocket.AF_LLC\nsocket.AF_NETBEUI\nsocket.AF_NETLINK\nsocket.AF_NETROM\nsocket.AF_PACKET\nsocket.AF_PPPOX\nsocket.AF_ROSE\nsocket.AF_ROUTE\nsocket.AF_SECURITY\nsocket.AF_SNA\nsocket.AF_TIPC\nsocket.AF_UNIX\nsocket.AF_UNSPEC\nsocket.AF_WANPIPE\nsocket.AF_X25\nsocket.AI_ADDRCONFIG\nsocket.AI_ALL\nsocket.AI_CANONNAME\nsocket.AI_NUMERICHOST\nsocket.AI_NUMERICSERV\nsocket.AI_PASSIVE\nsocket.AI_V4MAPPED\nsocket.CAPI\nsocket.EAI_ADDRFAMILY\nsocket.EAI_AGAIN\nsocket.EAI_BADFLAGS\nsocket.EAI_FAIL\nsocket.EAI_FAMILY\nsocket.EAI_MEMORY\nsocket.EAI_NODATA\nsocket.EAI_NONAME\nsocket.EAI_OVERFLOW\nsocket.EAI_SERVICE\nsocket.EAI_SOCKTYPE\nsocket.EAI_SYSTEM\nsocket.EBADF\nsocket.EINTR\nsocket.INADDR_ALLHOSTS_GROUP\nsocket.INADDR_ANY\nsocket.INADDR_BROADCAST\nsocket.INADDR_LOOPBACK\nsocket.INADDR_MAX_LOCAL_GROUP\nsocket.INADDR_NONE\nsocket.INADDR_UNSPEC_GROUP\nsocket.IPPORT_RESERVED\nsocket.IPPORT_USERRESERVED\nsocket.IPPROTO_AH\nsocket.IPPROTO_DSTOPTS\nsocket.IPPROTO_EGP\nsocket.IPPROTO_ESP\nsocket.IPPROTO_FRAGMENT\nsocket.IPPROTO_GRE\nsocket.IPPROTO_HOPOPTS\nsocket.IPPROTO_ICMP\nsocket.IPPROTO_ICMPV6\nsocket.IPPROTO_IDP\nsocket.IPPROTO_IGMP\nsocket.IPPROTO_IP\nsocket.IPPROTO_IPIP\nsocket.IPPROTO_IPV6\nsocket.IPPROTO_NONE\nsocket.IPPROTO_PIM\nsocket.IPPROTO_PUP\nsocket.IPPROTO_RAW\nsocket.IPPROTO_ROUTING\nsocket.IPPROTO_RSVP\nsocket.IPPROTO_TCP\nsocket.IPPROTO_TP\nsocket.IPPROTO_UDP\nsocket.IPV6_CHECKSUM\nsocket.IPV6_DSTOPTS\nsocket.IPV6_HOPLIMIT\nsocket.IPV6_HOPOPTS\nsocket.IPV6_JOIN_GROUP\nsocket.IPV6_LEAVE_GROUP\nsocket.IPV6_MULTICAST_HOPS\nsocket.IPV6_MULTICAST_IF\nsocket.IPV6_MULTICAST_LOOP\nsocket.IPV6_NEXTHOP\nsocket.IPV6_PKTINFO\nsocket.IPV6_RECVDSTOPTS\nsocket.IPV6_RECVHOPLIMIT\nsocket.IPV6_RECVHOPOPTS\nsocket.IPV6_RECVPKTINFO\nsocket.IPV6_RECVRTHDR\nsocket.IPV6_RECVTCLASS\nsocket.IPV6_RTHDR\nsocket.IPV6_RTHDRDSTOPTS\nsocket.IPV6_RTHDR_TYPE_0\nsocket.IPV6_TCLASS\nsocket.IPV6_UNICAST_HOPS\nsocket.IPV6_V6ONLY\nsocket.IP_ADD_MEMBERSHIP\nsocket.IP_DEFAULT_MULTICAST_LOOP\nsocket.IP_DEFAULT_MULTICAST_TTL\nsocket.IP_DROP_MEMBERSHIP\nsocket.IP_HDRINCL\nsocket.IP_MAX_MEMBERSHIPS\nsocket.IP_MULTICAST_IF\nsocket.IP_MULTICAST_LOOP\nsocket.IP_MULTICAST_TTL\nsocket.IP_OPTIONS\nsocket.IP_RECVOPTS\nsocket.IP_RECVRETOPTS\nsocket.IP_RETOPTS\nsocket.IP_TOS\nsocket.IP_TTL\nsocket.MSG_CTRUNC\nsocket.MSG_DONTROUTE\nsocket.MSG_DONTWAIT\nsocket.MSG_EOR\nsocket.MSG_OOB\nsocket.MSG_PEEK\nsocket.MSG_TRUNC\nsocket.MSG_WAITALL\nsocket.MethodType\nsocket.NETLINK_DNRTMSG\nsocket.NETLINK_FIREWALL\nsocket.NETLINK_IP6_FW\nsocket.NETLINK_NFLOG\nsocket.NETLINK_ROUTE\nsocket.NETLINK_USERSOCK\nsocket.NETLINK_XFRM\nsocket.NI_DGRAM\nsocket.NI_MAXHOST\nsocket.NI_MAXSERV\nsocket.NI_NAMEREQD\nsocket.NI_NOFQDN\nsocket.NI_NUMERICHOST\nsocket.NI_NUMERICSERV\nsocket.PACKET_BROADCAST\nsocket.PACKET_FASTROUTE\nsocket.PACKET_HOST\nsocket.PACKET_LOOPBACK\nsocket.PACKET_MULTICAST\nsocket.PACKET_OTHERHOST\nsocket.PACKET_OUTGOING\nsocket.PF_PACKET\nsocket.RAND_add(string, entropy)\nsocket.RAND_egd(path) -> bytes\nsocket.RAND_status() -> 0 or 1\nsocket.SHUT_RD\nsocket.SHUT_RDWR\nsocket.SHUT_WR\nsocket.SOCK_DGRAM\nsocket.SOCK_RAW\nsocket.SOCK_RDM\nsocket.SOCK_SEQPACKET\nsocket.SOCK_STREAM\nsocket.SOL_IP\nsocket.SOL_SOCKET\nsocket.SOL_TCP\nsocket.SOL_TIPC\nsocket.SOL_UDP\nsocket.SOMAXCONN\nsocket.SO_ACCEPTCONN\nsocket.SO_BROADCAST\nsocket.SO_DEBUG\nsocket.SO_DONTROUTE\nsocket.SO_ERROR\nsocket.SO_KEEPALIVE\nsocket.SO_LINGER\nsocket.SO_OOBINLINE\nsocket.SO_RCVBUF\nsocket.SO_RCVLOWAT\nsocket.SO_RCVTIMEO\nsocket.SO_REUSEADDR\nsocket.SO_SNDBUF\nsocket.SO_SNDLOWAT\nsocket.SO_SNDTIMEO\nsocket.SO_TYPE\nsocket.SSL_ERROR_EOF\nsocket.SSL_ERROR_INVALID_ERROR_CODE\nsocket.SSL_ERROR_SSL\nsocket.SSL_ERROR_SYSCALL\nsocket.SSL_ERROR_WANT_CONNECT\nsocket.SSL_ERROR_WANT_READ\nsocket.SSL_ERROR_WANT_WRITE\nsocket.SSL_ERROR_WANT_X509_LOOKUP\nsocket.SSL_ERROR_ZERO_RETURN\nsocket.SocketType\nsocket.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nsocket.TCP_CORK\nsocket.TCP_DEFER_ACCEPT\nsocket.TCP_INFO\nsocket.TCP_KEEPCNT\nsocket.TCP_KEEPIDLE\nsocket.TCP_KEEPINTVL\nsocket.TCP_LINGER2\nsocket.TCP_MAXSEG\nsocket.TCP_NODELAY\nsocket.TCP_QUICKACK\nsocket.TCP_SYNCNT\nsocket.TCP_WINDOW_CLAMP\nsocket.TIPC_ADDR_ID\nsocket.TIPC_ADDR_NAME\nsocket.TIPC_ADDR_NAMESEQ\nsocket.TIPC_CFG_SRV\nsocket.TIPC_CLUSTER_SCOPE\nsocket.TIPC_CONN_TIMEOUT\nsocket.TIPC_CRITICAL_IMPORTANCE\nsocket.TIPC_DEST_DROPPABLE\nsocket.TIPC_HIGH_IMPORTANCE\nsocket.TIPC_IMPORTANCE\nsocket.TIPC_LOW_IMPORTANCE\nsocket.TIPC_MEDIUM_IMPORTANCE\nsocket.TIPC_NODE_SCOPE\nsocket.TIPC_PUBLISHED\nsocket.TIPC_SRC_DROPPABLE\nsocket.TIPC_SUBSCR_TIMEOUT\nsocket.TIPC_SUB_CANCEL\nsocket.TIPC_SUB_PORTS\nsocket.TIPC_SUB_SERVICE\nsocket.TIPC_TOP_SRV\nsocket.TIPC_WAIT_FOREVER\nsocket.TIPC_WITHDRAWN\nsocket.TIPC_ZONE_SCOPE\nsocket.create_connection(??)\nsocket.errno\nsocket.error\nsocket.fromfd(fd, family, type[, proto]) -> socket object\nsocket.gaierror\nsocket.getaddrinfo(host, port [, family, socktype, proto, flags])\nsocket.getdefaulttimeout() -> timeout\nsocket.getfqdn(??)\nsocket.gethostbyaddr(host) -> (name, aliaslist, addresslist)\nsocket.gethostbyname(host) -> address\nsocket.gethostbyname_ex(host) -> (name, aliaslist, addresslist)\nsocket.gethostname() -> string\nsocket.getnameinfo(sockaddr, flags) --> (host, port)\nsocket.getprotobyname(name) -> integer\nsocket.getservbyname(servicename[, protocolname]) -> integer\nsocket.getservbyport(port[, protocolname]) -> string\nsocket.has_ipv6\nsocket.herror\nsocket.htonl(integer) -> integer\nsocket.htons(integer) -> integer\nsocket.inet_aton(string) -> packed 32-bit IP representation\nsocket.inet_ntoa(packed_ip) -> ip_address_string\nsocket.inet_ntop(af, packed_ip) -> string formatted IP address\nsocket.inet_pton(af, ip) -> packed IP address string\nsocket.m\nsocket.meth(??)\nsocket.ntohl(integer) -> integer\nsocket.ntohs(integer) -> integer\nsocket.os\nsocket.p\nsocket.partial(func, *args, **keywords) - new function with partial application\nsocket.setdefaulttimeout(timeout)\nsocket.socket([family[, type[, proto]]]) -> socket object\nsocket.socketpair([family[, type[, proto]]]) -> (socket object, socket object)\nsocket.ssl(??)\nsocket.sslerror\nsocket.sys\nsocket.timeout\nsocket.warnings\nsorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list\nspwd.getspall() -> list_of_entries\nspwd.getspnam(name) -> (sp_namp, sp_pwdp, sp_lstchg, sp_min, sp_max,\nspwd.struct_spwd\nsre.DOTALL\nsre.I\nsre.IGNORECASE\nsre.L\nsre.LOCALE\nsre.M\nsre.MULTILINE\nsre.S\nsre.U\nsre.UNICODE\nsre.VERBOSE\nsre.X\nsre.compile(??)\nsre.error\nsre.escape(??)\nsre.findall(??)\nsre.finditer(??)\nsre.match(??)\nsre.purge(??)\nsre.search(??)\nsre.split(??)\nsre.sub(??)\nsre.subn(??)\nsre.template(??)\nsre.warnings\nsre_compile.ANY\nsre_compile.ANY_ALL\nsre_compile.ASSERT\nsre_compile.ASSERT_NOT\nsre_compile.AT\nsre_compile.ATCODES\nsre_compile.AT_BEGINNING\nsre_compile.AT_BEGINNING_LINE\nsre_compile.AT_BEGINNING_STRING\nsre_compile.AT_BOUNDARY\nsre_compile.AT_END\nsre_compile.AT_END_LINE\nsre_compile.AT_END_STRING\nsre_compile.AT_LOCALE\nsre_compile.AT_LOC_BOUNDARY\nsre_compile.AT_LOC_NON_BOUNDARY\nsre_compile.AT_MULTILINE\nsre_compile.AT_NON_BOUNDARY\nsre_compile.AT_UNICODE\nsre_compile.AT_UNI_BOUNDARY\nsre_compile.AT_UNI_NON_BOUNDARY\nsre_compile.BIGCHARSET\nsre_compile.BRANCH\nsre_compile.CALL\nsre_compile.CATEGORY\nsre_compile.CATEGORY_DIGIT\nsre_compile.CATEGORY_LINEBREAK\nsre_compile.CATEGORY_LOC_NOT_WORD\nsre_compile.CATEGORY_LOC_WORD\nsre_compile.CATEGORY_NOT_DIGIT\nsre_compile.CATEGORY_NOT_LINEBREAK\nsre_compile.CATEGORY_NOT_SPACE\nsre_compile.CATEGORY_NOT_WORD\nsre_compile.CATEGORY_SPACE\nsre_compile.CATEGORY_UNI_DIGIT\nsre_compile.CATEGORY_UNI_LINEBREAK\nsre_compile.CATEGORY_UNI_NOT_DIGIT\nsre_compile.CATEGORY_UNI_NOT_LINEBREAK\nsre_compile.CATEGORY_UNI_NOT_SPACE\nsre_compile.CATEGORY_UNI_NOT_WORD\nsre_compile.CATEGORY_UNI_SPACE\nsre_compile.CATEGORY_UNI_WORD\nsre_compile.CATEGORY_WORD\nsre_compile.CHARSET\nsre_compile.CHCODES\nsre_compile.CH_LOCALE\nsre_compile.CH_UNICODE\nsre_compile.FAILURE\nsre_compile.GROUPREF\nsre_compile.GROUPREF_EXISTS\nsre_compile.GROUPREF_IGNORE\nsre_compile.IN\nsre_compile.INFO\nsre_compile.IN_IGNORE\nsre_compile.JUMP\nsre_compile.LITERAL\nsre_compile.LITERAL_IGNORE\nsre_compile.MAGIC\nsre_compile.MARK\nsre_compile.MAXCODE\nsre_compile.MAXREPEAT\nsre_compile.MAX_REPEAT\nsre_compile.MAX_UNTIL\nsre_compile.MIN_REPEAT\nsre_compile.MIN_REPEAT_ONE\nsre_compile.MIN_UNTIL\nsre_compile.NEGATE\nsre_compile.NOT_LITERAL\nsre_compile.NOT_LITERAL_IGNORE\nsre_compile.OPCODES\nsre_compile.OP_IGNORE\nsre_compile.RANGE\nsre_compile.REPEAT\nsre_compile.REPEAT_ONE\nsre_compile.SRE_FLAG_DEBUG\nsre_compile.SRE_FLAG_DOTALL\nsre_compile.SRE_FLAG_IGNORECASE\nsre_compile.SRE_FLAG_LOCALE\nsre_compile.SRE_FLAG_MULTILINE\nsre_compile.SRE_FLAG_TEMPLATE\nsre_compile.SRE_FLAG_UNICODE\nsre_compile.SRE_FLAG_VERBOSE\nsre_compile.SRE_INFO_CHARSET\nsre_compile.SRE_INFO_LITERAL\nsre_compile.SRE_INFO_PREFIX\nsre_compile.STRING_TYPES\nsre_compile.SUBPATTERN\nsre_compile.SUCCESS\nsre_compile.compile(??)\nsre_compile.error\nsre_compile.isstring(??)\nsre_compile.makedict(??)\nsre_compile.sre_parse\nsre_compile.sys\nsre_constants.ANY\nsre_constants.ANY_ALL\nsre_constants.ASSERT\nsre_constants.ASSERT_NOT\nsre_constants.AT\nsre_constants.ATCODES\nsre_constants.AT_BEGINNING\nsre_constants.AT_BEGINNING_LINE\nsre_constants.AT_BEGINNING_STRING\nsre_constants.AT_BOUNDARY\nsre_constants.AT_END\nsre_constants.AT_END_LINE\nsre_constants.AT_END_STRING\nsre_constants.AT_LOCALE\nsre_constants.AT_LOC_BOUNDARY\nsre_constants.AT_LOC_NON_BOUNDARY\nsre_constants.AT_MULTILINE\nsre_constants.AT_NON_BOUNDARY\nsre_constants.AT_UNICODE\nsre_constants.AT_UNI_BOUNDARY\nsre_constants.AT_UNI_NON_BOUNDARY\nsre_constants.BIGCHARSET\nsre_constants.BRANCH\nsre_constants.CALL\nsre_constants.CATEGORY\nsre_constants.CATEGORY_DIGIT\nsre_constants.CATEGORY_LINEBREAK\nsre_constants.CATEGORY_LOC_NOT_WORD\nsre_constants.CATEGORY_LOC_WORD\nsre_constants.CATEGORY_NOT_DIGIT\nsre_constants.CATEGORY_NOT_LINEBREAK\nsre_constants.CATEGORY_NOT_SPACE\nsre_constants.CATEGORY_NOT_WORD\nsre_constants.CATEGORY_SPACE\nsre_constants.CATEGORY_UNI_DIGIT\nsre_constants.CATEGORY_UNI_LINEBREAK\nsre_constants.CATEGORY_UNI_NOT_DIGIT\nsre_constants.CATEGORY_UNI_NOT_LINEBREAK\nsre_constants.CATEGORY_UNI_NOT_SPACE\nsre_constants.CATEGORY_UNI_NOT_WORD\nsre_constants.CATEGORY_UNI_SPACE\nsre_constants.CATEGORY_UNI_WORD\nsre_constants.CATEGORY_WORD\nsre_constants.CHARSET\nsre_constants.CHCODES\nsre_constants.CH_LOCALE\nsre_constants.CH_UNICODE\nsre_constants.FAILURE\nsre_constants.GROUPREF\nsre_constants.GROUPREF_EXISTS\nsre_constants.GROUPREF_IGNORE\nsre_constants.IN\nsre_constants.INFO\nsre_constants.IN_IGNORE\nsre_constants.JUMP\nsre_constants.LITERAL\nsre_constants.LITERAL_IGNORE\nsre_constants.MAGIC\nsre_constants.MARK\nsre_constants.MAXREPEAT\nsre_constants.MAX_REPEAT\nsre_constants.MAX_UNTIL\nsre_constants.MIN_REPEAT\nsre_constants.MIN_REPEAT_ONE\nsre_constants.MIN_UNTIL\nsre_constants.NEGATE\nsre_constants.NOT_LITERAL\nsre_constants.NOT_LITERAL_IGNORE\nsre_constants.OPCODES\nsre_constants.OP_IGNORE\nsre_constants.RANGE\nsre_constants.REPEAT\nsre_constants.REPEAT_ONE\nsre_constants.SRE_FLAG_DEBUG\nsre_constants.SRE_FLAG_DOTALL\nsre_constants.SRE_FLAG_IGNORECASE\nsre_constants.SRE_FLAG_LOCALE\nsre_constants.SRE_FLAG_MULTILINE\nsre_constants.SRE_FLAG_TEMPLATE\nsre_constants.SRE_FLAG_UNICODE\nsre_constants.SRE_FLAG_VERBOSE\nsre_constants.SRE_INFO_CHARSET\nsre_constants.SRE_INFO_LITERAL\nsre_constants.SRE_INFO_PREFIX\nsre_constants.SUBPATTERN\nsre_constants.SUCCESS\nsre_constants.error\nsre_constants.makedict(??)\nsre_parse.ANY\nsre_parse.ANY_ALL\nsre_parse.ASSERT\nsre_parse.ASSERT_NOT\nsre_parse.AT\nsre_parse.ATCODES\nsre_parse.AT_BEGINNING\nsre_parse.AT_BEGINNING_LINE\nsre_parse.AT_BEGINNING_STRING\nsre_parse.AT_BOUNDARY\nsre_parse.AT_END\nsre_parse.AT_END_LINE\nsre_parse.AT_END_STRING\nsre_parse.AT_LOCALE\nsre_parse.AT_LOC_BOUNDARY\nsre_parse.AT_LOC_NON_BOUNDARY\nsre_parse.AT_MULTILINE\nsre_parse.AT_NON_BOUNDARY\nsre_parse.AT_UNICODE\nsre_parse.AT_UNI_BOUNDARY\nsre_parse.AT_UNI_NON_BOUNDARY\nsre_parse.BIGCHARSET\nsre_parse.BRANCH\nsre_parse.CALL\nsre_parse.CATEGORIES\nsre_parse.CATEGORY\nsre_parse.CATEGORY_DIGIT\nsre_parse.CATEGORY_LINEBREAK\nsre_parse.CATEGORY_LOC_NOT_WORD\nsre_parse.CATEGORY_LOC_WORD\nsre_parse.CATEGORY_NOT_DIGIT\nsre_parse.CATEGORY_NOT_LINEBREAK\nsre_parse.CATEGORY_NOT_SPACE\nsre_parse.CATEGORY_NOT_WORD\nsre_parse.CATEGORY_SPACE\nsre_parse.CATEGORY_UNI_DIGIT\nsre_parse.CATEGORY_UNI_LINEBREAK\nsre_parse.CATEGORY_UNI_NOT_DIGIT\nsre_parse.CATEGORY_UNI_NOT_LINEBREAK\nsre_parse.CATEGORY_UNI_NOT_SPACE\nsre_parse.CATEGORY_UNI_NOT_WORD\nsre_parse.CATEGORY_UNI_SPACE\nsre_parse.CATEGORY_UNI_WORD\nsre_parse.CATEGORY_WORD\nsre_parse.CHARSET\nsre_parse.CHCODES\nsre_parse.CH_LOCALE\nsre_parse.CH_UNICODE\nsre_parse.DIGITS\nsre_parse.ESCAPES\nsre_parse.FAILURE\nsre_parse.FLAGS\nsre_parse.GROUPREF\nsre_parse.GROUPREF_EXISTS\nsre_parse.GROUPREF_IGNORE\nsre_parse.HEXDIGITS\nsre_parse.IN\nsre_parse.INFO\nsre_parse.IN_IGNORE\nsre_parse.JUMP\nsre_parse.LITERAL\nsre_parse.LITERAL_IGNORE\nsre_parse.MAGIC\nsre_parse.MARK\nsre_parse.MAXREPEAT\nsre_parse.MAX_REPEAT\nsre_parse.MAX_UNTIL\nsre_parse.MIN_REPEAT\nsre_parse.MIN_REPEAT_ONE\nsre_parse.MIN_UNTIL\nsre_parse.NEGATE\nsre_parse.NOT_LITERAL\nsre_parse.NOT_LITERAL_IGNORE\nsre_parse.OCTDIGITS\nsre_parse.OPCODES\nsre_parse.OP_IGNORE\nsre_parse.Pattern(??)\nsre_parse.RANGE\nsre_parse.REPEAT\nsre_parse.REPEAT_CHARS\nsre_parse.REPEAT_ONE\nsre_parse.SPECIAL_CHARS\nsre_parse.SRE_FLAG_DEBUG\nsre_parse.SRE_FLAG_DOTALL\nsre_parse.SRE_FLAG_IGNORECASE\nsre_parse.SRE_FLAG_LOCALE\nsre_parse.SRE_FLAG_MULTILINE\nsre_parse.SRE_FLAG_TEMPLATE\nsre_parse.SRE_FLAG_UNICODE\nsre_parse.SRE_FLAG_VERBOSE\nsre_parse.SRE_INFO_CHARSET\nsre_parse.SRE_INFO_LITERAL\nsre_parse.SRE_INFO_PREFIX\nsre_parse.SUBPATTERN\nsre_parse.SUCCESS\nsre_parse.SubPattern(??)\nsre_parse.Tokenizer(??)\nsre_parse.WHITESPACE\nsre_parse.error\nsre_parse.expand_template(??)\nsre_parse.isdigit(??)\nsre_parse.isident(??)\nsre_parse.isname(??)\nsre_parse.makedict(??)\nsre_parse.parse(??)\nsre_parse.parse_template(??)\nsre_parse.sys\nssl.CERT_NONE\nssl.CERT_OPTIONAL\nssl.CERT_REQUIRED\nssl.DER_cert_to_PEM_cert(??)\nssl.OPENSSL_VERSION\nssl.OPENSSL_VERSION_INFO\nssl.OPENSSL_VERSION_NUMBER\nssl.PEM_FOOTER\nssl.PEM_HEADER\nssl.PEM_cert_to_DER_cert(??)\nssl.PROTOCOL_SSLv2\nssl.PROTOCOL_SSLv23\nssl.PROTOCOL_SSLv3\nssl.PROTOCOL_TLSv1\nssl.RAND_add(string, entropy)\nssl.RAND_egd(path) -> bytes\nssl.RAND_status() -> 0 or 1\nssl.SSLError\nssl.SSLSocket\nssl.SSL_ERROR_EOF\nssl.SSL_ERROR_INVALID_ERROR_CODE\nssl.SSL_ERROR_SSL\nssl.SSL_ERROR_SYSCALL\nssl.SSL_ERROR_WANT_CONNECT\nssl.SSL_ERROR_WANT_READ\nssl.SSL_ERROR_WANT_WRITE\nssl.SSL_ERROR_WANT_X509_LOOKUP\nssl.SSL_ERROR_ZERO_RETURN\nssl.base64\nssl.cert_time_to_seconds(??)\nssl.errno\nssl.get_protocol_name(??)\nssl.get_server_certificate(??)\nssl.socket([family[, type[, proto]]]) -> socket object\nssl.socket_error\nssl.sslwrap_simple(??)\nssl.textwrap\nssl.wrap_socket(??)\nstat.SF_APPEND\nstat.SF_ARCHIVED\nstat.SF_IMMUTABLE\nstat.SF_NOUNLINK\nstat.SF_SNAPSHOT\nstat.ST_ATIME\nstat.ST_CTIME\nstat.ST_DEV\nstat.ST_GID\nstat.ST_INO\nstat.ST_MODE\nstat.ST_MTIME\nstat.ST_NLINK\nstat.ST_SIZE\nstat.ST_UID\nstat.S_ENFMT\nstat.S_IEXEC\nstat.S_IFBLK\nstat.S_IFCHR\nstat.S_IFDIR\nstat.S_IFIFO\nstat.S_IFLNK\nstat.S_IFMT(??)\nstat.S_IFREG\nstat.S_IFSOCK\nstat.S_IMODE(??)\nstat.S_IREAD\nstat.S_IRGRP\nstat.S_IROTH\nstat.S_IRUSR\nstat.S_IRWXG\nstat.S_IRWXO\nstat.S_IRWXU\nstat.S_ISBLK(??)\nstat.S_ISCHR(??)\nstat.S_ISDIR(??)\nstat.S_ISFIFO(??)\nstat.S_ISGID\nstat.S_ISLNK(??)\nstat.S_ISREG(??)\nstat.S_ISSOCK(??)\nstat.S_ISUID\nstat.S_ISVTX\nstat.S_IWGRP\nstat.S_IWOTH\nstat.S_IWRITE\nstat.S_IWUSR\nstat.S_IXGRP\nstat.S_IXOTH\nstat.S_IXUSR\nstat.UF_APPEND\nstat.UF_IMMUTABLE\nstat.UF_NODUMP\nstat.UF_NOUNLINK\nstat.UF_OPAQUE\nstaticmethod(function) -> method\nstatvfs.F_BAVAIL\nstatvfs.F_BFREE\nstatvfs.F_BLOCKS\nstatvfs.F_BSIZE\nstatvfs.F_FAVAIL\nstatvfs.F_FFREE\nstatvfs.F_FILES\nstatvfs.F_FLAG\nstatvfs.F_FRSIZE\nstatvfs.F_NAMEMAX\nstr(object) -> string\nstring.Formatter\nstring.Template\nstring.ascii_letters\nstring.ascii_lowercase\nstring.ascii_uppercase\nstring.atof(s) -> float\nstring.atof_error\nstring.atoi(s [,base]) -> int\nstring.atoi_error\nstring.atol(s [,base]) -> long\nstring.atol_error\nstring.capitalize(s) -> string\nstring.capwords(s [,sep]) -> string\nstring.center(s, width[, fillchar]) -> string\nstring.count(s, sub[, start[,end]]) -> int\nstring.digits\nstring.expandtabs(s [,tabsize]) -> string\nstring.find(s, sub [,start [,end]]) -> in\nstring.hexdigits\nstring.index(s, sub [,start [,end]]) -> int\nstring.index_error\nstring.join(list [,sep]) -> string\nstring.joinfields(??)\nstring.letters\nstring.ljust(s, width[, fillchar]) -> string\nstring.lower(s) -> string\nstring.lowercase\nstring.lstrip(s [,chars]) -> string\nstring.maketrans(frm, to) -> string\nstring.octdigits\nstring.printable\nstring.punctuation\nstring.replace (str, old, new[, maxsplit]) -> string\nstring.rfind(s, sub [,start [,end]]) -> int\nstring.rindex(s, sub [,start [,end]]) -> int\nstring.rjust(s, width[, fillchar]) -> string\nstring.rsplit(s [,sep [,maxsplit]]) -> list of strings\nstring.rstrip(s [,chars]) -> string\nstring.split(s [,sep [,maxsplit]]) -> list of strings\nstring.splitfields(??)\nstring.strip(s [,chars]) -> string\nstring.swapcase(s) -> string\nstring.translate(s,table [,deletions]) -> string\nstring.upper(s) -> string\nstring.uppercase\nstring.whitespace\nstring.zfill(x, width) -> string\nstringold.atof(s) -> float\nstringold.atof_error\nstringold.atoi(s [,base]) -> int\nstringold.atoi_error\nstringold.atol(s [,base]) -> long\nstringold.atol_error\nstringold.capitalize(s) -> string\nstringold.capwords(s, [sep]) -> string\nstringold.center(s, width) -> string\nstringold.count(s, sub[, start[,end]]) -> int\nstringold.digits\nstringold.expandtabs(s [,tabsize]) -> string\nstringold.find(s, sub [,start [,end]]) -> in\nstringold.hexdigits\nstringold.index(s, sub [,start [,end]]) -> int\nstringold.index_error\nstringold.join(list [,sep]) -> string\nstringold.joinfields(??)\nstringold.letters\nstringold.ljust(s, width) -> string\nstringold.lower(s) -> string\nstringold.lowercase\nstringold.lstrip(s) -> string\nstringold.maketrans(frm, to) -> string\nstringold.octdigits\nstringold.replace (str, old, new[, maxsplit]) -> string\nstringold.rfind(s, sub [,start [,end]]) -> int\nstringold.rindex(s, sub [,start [,end]]) -> int\nstringold.rjust(s, width) -> string\nstringold.rstrip(s) -> string\nstringold.split(str [,sep [,maxsplit]]) -> list of strings\nstringold.splitfields(??)\nstringold.strip(s) -> string\nstringold.swapcase(s) -> string\nstringold.translate(s,table [,deletechars]) -> string\nstringold.upper(s) -> string\nstringold.uppercase\nstringold.whitespace\nstringold.zfill(x, width) -> string\nstringprep.b1_set\nstringprep.b3_exceptions\nstringprep.c22_specials\nstringprep.c6_set\nstringprep.c7_set\nstringprep.c8_set\nstringprep.c9_set\nstringprep.in_table_a1(??)\nstringprep.in_table_b1(??)\nstringprep.in_table_c11(??)\nstringprep.in_table_c11_c12(??)\nstringprep.in_table_c12(??)\nstringprep.in_table_c21(??)\nstringprep.in_table_c21_c22(??)\nstringprep.in_table_c22(??)\nstringprep.in_table_c3(??)\nstringprep.in_table_c4(??)\nstringprep.in_table_c5(??)\nstringprep.in_table_c6(??)\nstringprep.in_table_c7(??)\nstringprep.in_table_c8(??)\nstringprep.in_table_c9(??)\nstringprep.in_table_d1(??)\nstringprep.in_table_d2(??)\nstringprep.map_table_b2(??)\nstringprep.map_table_b3(??)\nstringprep.unicodedata\nstrop.atof(s) -> float\nstrop.atoi(s [,base]) -> int\nstrop.atol(s [,base]) -> long\nstrop.capitalize(s) -> string\nstrop.count(s, sub[, start[, end]]) -> int\nstrop.expandtabs(string, [tabsize]) -> string\nstrop.find(s, sub [,start [,end]]) -> in\nstrop.join(list [,sep]) -> string\nstrop.joinfields\nstrop.lower(s) -> string\nstrop.lowercase\nstrop.lstrip(s) -> string\nstrop.maketrans(frm, to) -> string\nstrop.replace (str, old, new[, maxsplit]) -> string\nstrop.rfind(s, sub [,start [,end]]) -> int\nstrop.rstrip(s) -> string\nstrop.split(s [,sep [,maxsplit]]) -> list of strings\nstrop.splitfields\nstrop.strip(s) -> string\nstrop.swapcase(s) -> string\nstrop.translate(s,table [,deletechars]) -> string\nstrop.upper(s) -> string\nstrop.uppercase\nstrop.whitespace\nstruct.Struct\nstruct.calcsize\nstruct.error\nstruct.pack\nstruct.pack_into\nstruct.unpack\nstruct.unpack_from\nsubprocess.CalledProcessError\nsubprocess.MAXFD\nsubprocess.PIPE\nsubprocess.Popen\nsubprocess.STDOUT\nsubprocess.call(??)\nsubprocess.check_call(??)\nsubprocess.check_output(??)\nsubprocess.errno\nsubprocess.fcntl\nsubprocess.gc\nsubprocess.list2cmdline(??)\nsubprocess.mswindows\nsubprocess.os\nsubprocess.pickle\nsubprocess.select\nsubprocess.signal\nsubprocess.sys\nsubprocess.traceback\nsubprocess.types\nsum(sequence[, start]) -> value\nsunau.AUDIO_FILE_ENCODING_ADPCM_G721\nsunau.AUDIO_FILE_ENCODING_ADPCM_G722\nsunau.AUDIO_FILE_ENCODING_ADPCM_G723_3\nsunau.AUDIO_FILE_ENCODING_ADPCM_G723_5\nsunau.AUDIO_FILE_ENCODING_ALAW_8\nsunau.AUDIO_FILE_ENCODING_DOUBLE\nsunau.AUDIO_FILE_ENCODING_FLOAT\nsunau.AUDIO_FILE_ENCODING_LINEAR_16\nsunau.AUDIO_FILE_ENCODING_LINEAR_24\nsunau.AUDIO_FILE_ENCODING_LINEAR_32\nsunau.AUDIO_FILE_ENCODING_LINEAR_8\nsunau.AUDIO_FILE_ENCODING_MULAW_8\nsunau.AUDIO_FILE_MAGIC\nsunau.AUDIO_UNKNOWN_SIZE\nsunau.Au_read(??)\nsunau.Au_write(??)\nsunau.Error\nsunau.open(??)\nsunau.openfp(??)\nsunaudio.MAGIC\nsunaudio.error\nsunaudio.get_long_be(??)\nsunaudio.gethdr(??)\nsunaudio.printhdr(??)\nsuper(type) -> unbound super object\nsymbol.and_expr\nsymbol.and_test\nsymbol.arglist\nsymbol.argument\nsymbol.arith_expr\nsymbol.assert_stmt\nsymbol.atom\nsymbol.augassign\nsymbol.break_stmt\nsymbol.classdef\nsymbol.comp_for\nsymbol.comp_if\nsymbol.comp_iter\nsymbol.comp_op\nsymbol.comparison\nsymbol.compound_stmt\nsymbol.continue_stmt\nsymbol.decorated\nsymbol.decorator\nsymbol.decorators\nsymbol.del_stmt\nsymbol.dictmaker\nsymbol.dictorsetmaker\nsymbol.dotted_as_name\nsymbol.dotted_as_names\nsymbol.dotted_name\nsymbol.encoding_decl\nsymbol.eval_input\nsymbol.except_clause\nsymbol.exec_stmt\nsymbol.expr\nsymbol.expr_stmt\nsymbol.exprlist\nsymbol.factor\nsymbol.file_input\nsymbol.flow_stmt\nsymbol.for_stmt\nsymbol.fpdef\nsymbol.fplist\nsymbol.funcdef\nsymbol.global_stmt\nsymbol.if_stmt\nsymbol.import_as_name\nsymbol.import_as_names\nsymbol.import_from\nsymbol.import_name\nsymbol.import_stmt\nsymbol.lambdef\nsymbol.list_for\nsymbol.list_if\nsymbol.list_iter\nsymbol.listmaker\nsymbol.main(??)\nsymbol.not_test\nsymbol.old_lambdef\nsymbol.old_test\nsymbol.or_test\nsymbol.parameters\nsymbol.pass_stmt\nsymbol.power\nsymbol.print_stmt\nsymbol.raise_stmt\nsymbol.return_stmt\nsymbol.shift_expr\nsymbol.simple_stmt\nsymbol.single_input\nsymbol.sliceop\nsymbol.small_stmt\nsymbol.stmt\nsymbol.subscript\nsymbol.subscriptlist\nsymbol.suite\nsymbol.sym_name\nsymbol.term\nsymbol.test\nsymbol.testlist\nsymbol.testlist1\nsymbol.testlist_comp\nsymbol.testlist_safe\nsymbol.trailer\nsymbol.try_stmt\nsymbol.varargslist\nsymbol.while_stmt\nsymbol.with_item\nsymbol.with_stmt\nsymbol.xor_expr\nsymbol.yield_expr\nsymbol.yield_stmt\nsymtable.CELL\nsymtable.Class\nsymtable.DEF_BOUND\nsymtable.DEF_GLOBAL\nsymtable.DEF_IMPORT\nsymtable.DEF_LOCAL\nsymtable.DEF_PARAM\nsymtable.FREE\nsymtable.Function\nsymtable.GLOBAL_EXPLICIT\nsymtable.GLOBAL_IMPLICIT\nsymtable.LOCAL\nsymtable.OPT_BARE_EXEC\nsymtable.OPT_EXEC\nsymtable.OPT_IMPORT_STAR\nsymtable.SCOPE_MASK\nsymtable.SCOPE_OFF\nsymtable.Symbol\nsymtable.SymbolTable\nsymtable.SymbolTableFactory(??)\nsymtable.USE\nsymtable.symtable(??)\nsymtable.weakref\nsys.api_version\nsys.argv\nsys.builtin_module_names\nsys.byteorder\nsys.call_tracing(func, args) -> object\nsys.callstats() -> tuple of integers\nsys.copyright\nsys.displayhook(object) -> None\nsys.dont_write_bytecode\nsys.exc_clear() -> None\nsys.exc_info() -> (type, value, traceback)\nsys.exc_type\nsys.excepthook(exctype, value, traceback) -> None\nsys.exec_prefix\nsys.executable\nsys.exit([status])\nsys.flags\nsys.float_info\nsys.float_repr_style\nsys.getcheckinterval() -> current check interval; see setcheckinterval().\nsys.getdefaultencoding() -> string\nsys.getdlopenflags() -> int\nsys.getfilesystemencoding() -> string\nsys.getprofile()\nsys.getrecursionlimit()\nsys.getrefcount(object) -> integer\nsys.getsizeof(object, default) -> int\nsys.gettrace()\nsys.hexversion\nsys.long_info\nsys.maxint\nsys.maxsize\nsys.maxunicode\nsys.meta_path\nsys.modules\nsys.path\nsys.path_hooks\nsys.path_importer_cache\nsys.platform\nsys.prefix\nsys.py3kwarning\nsys.setappdefaultencoding\nsys.setcheckinterval(n)\nsys.setdlopenflags(n) -> None\nsys.setprofile(function)\nsys.setrecursionlimit(n)\nsys.settrace(function)\nsys.stderr\nsys.stdin\nsys.stdout\nsys.subversion\nsys.version\nsys.version_info\nsys.warnoptions\nsysconfig.get_config_h_filename(??)\nsysconfig.get_config_var(??)\nsysconfig.get_config_vars(??)\nsysconfig.get_path(??)\nsysconfig.get_path_names(??)\nsysconfig.get_paths(??)\nsysconfig.get_platform(??)\nsysconfig.get_python_version(??)\nsysconfig.get_scheme_names(??)\nsysconfig.is_python_build(??)\nsysconfig.os\nsysconfig.pardir\nsysconfig.parse_config_h(??)\nsysconfig.realpath(??)\nsysconfig.sys\nsyslog.LOG_ALERT\nsyslog.LOG_AUTH\nsyslog.LOG_CONS\nsyslog.LOG_CRIT\nsyslog.LOG_CRON\nsyslog.LOG_DAEMON\nsyslog.LOG_DEBUG\nsyslog.LOG_EMERG\nsyslog.LOG_ERR\nsyslog.LOG_INFO\nsyslog.LOG_KERN\nsyslog.LOG_LOCAL0\nsyslog.LOG_LOCAL1\nsyslog.LOG_LOCAL2\nsyslog.LOG_LOCAL3\nsyslog.LOG_LOCAL4\nsyslog.LOG_LOCAL5\nsyslog.LOG_LOCAL6\nsyslog.LOG_LOCAL7\nsyslog.LOG_LPR\nsyslog.LOG_MAIL\nsyslog.LOG_MASK\nsyslog.LOG_NDELAY\nsyslog.LOG_NEWS\nsyslog.LOG_NOTICE\nsyslog.LOG_NOWAIT\nsyslog.LOG_PERROR\nsyslog.LOG_PID\nsyslog.LOG_SYSLOG\nsyslog.LOG_UPTO\nsyslog.LOG_USER\nsyslog.LOG_UUCP\nsyslog.LOG_WARNING\nsyslog.closelog\nsyslog.openlog\nsyslog.setlogmask\nsyslog.syslog\ntabnanny.NannyNag\ntabnanny.Whitespace(??)\ntabnanny.check(file_or_dir)\ntabnanny.errprint(??)\ntabnanny.filename_only\ntabnanny.format_witnesses(??)\ntabnanny.getopt\ntabnanny.main(??)\ntabnanny.os\ntabnanny.process_tokens(??)\ntabnanny.sys\ntabnanny.tokenize\ntabnanny.verbose\ntarfile.AREGTYPE\ntarfile.BLKTYPE\ntarfile.BLOCKSIZE\ntarfile.CHRTYPE\ntarfile.CONTTYPE\ntarfile.CompressionError\ntarfile.DEFAULT_FORMAT\ntarfile.DIRTYPE\ntarfile.ENCODING\ntarfile.EOFHeaderError\ntarfile.EmptyHeaderError\ntarfile.ExFileObject\ntarfile.ExtractError\ntarfile.FIFOTYPE\ntarfile.GNUTYPE_LONGLINK\ntarfile.GNUTYPE_LONGNAME\ntarfile.GNUTYPE_SPARSE\ntarfile.GNU_FORMAT\ntarfile.GNU_MAGIC\ntarfile.GNU_TYPES\ntarfile.HeaderError\ntarfile.InvalidHeaderError\ntarfile.LENGTH_LINK\ntarfile.LENGTH_NAME\ntarfile.LENGTH_PREFIX\ntarfile.LNKTYPE\ntarfile.NUL\ntarfile.PAX_FIELDS\ntarfile.PAX_FORMAT\ntarfile.PAX_NUMBER_FIELDS\ntarfile.POSIX_MAGIC\ntarfile.RECORDSIZE\ntarfile.REGTYPE\ntarfile.REGULAR_TYPES\ntarfile.ReadError\ntarfile.SOLARIS_XHDTYPE\ntarfile.SUPPORTED_TYPES\ntarfile.SYMTYPE\ntarfile.S_IFBLK\ntarfile.S_IFCHR\ntarfile.S_IFDIR\ntarfile.S_IFIFO\ntarfile.S_IFLNK\ntarfile.S_IFREG\ntarfile.StreamError\ntarfile.SubsequentHeaderError\ntarfile.TAR_GZIPPED\ntarfile.TAR_PLAIN\ntarfile.TGEXEC\ntarfile.TGREAD\ntarfile.TGWRITE\ntarfile.TOEXEC\ntarfile.TOREAD\ntarfile.TOWRITE\ntarfile.TSGID\ntarfile.TSUID\ntarfile.TSVTX\ntarfile.TUEXEC\ntarfile.TUREAD\ntarfile.TUWRITE\ntarfile.TarError\ntarfile.TarFile\ntarfile.TarFileCompat(??)\ntarfile.TarInfo\ntarfile.TarIter(??)\ntarfile.TruncatedHeaderError\ntarfile.USTAR_FORMAT\ntarfile.XGLTYPE\ntarfile.XHDTYPE\ntarfile.bltn_open\ntarfile.calc_chksums(??)\ntarfile.copy\ntarfile.copyfileobj(??)\ntarfile.errno\ntarfile.filemode(??)\ntarfile.filemode_table\ntarfile.grp\ntarfile.is_tarfile(??)\ntarfile.itn(??)\ntarfile.nti(??)\ntarfile.nts(??)\ntarfile.open\ntarfile.operator\ntarfile.os\ntarfile.pwd\ntarfile.re\ntarfile.shutil\ntarfile.stat\ntarfile.stn(??)\ntarfile.struct\ntarfile.sys\ntarfile.time\ntarfile.uts(??)\ntarfile.version\ntelnetlib.AO\ntelnetlib.AUTHENTICATION\ntelnetlib.AYT\ntelnetlib.BINARY\ntelnetlib.BM\ntelnetlib.BRK\ntelnetlib.CHARSET\ntelnetlib.COM_PORT_OPTION\ntelnetlib.DEBUGLEVEL\ntelnetlib.DET\ntelnetlib.DM\ntelnetlib.DO\ntelnetlib.DONT\ntelnetlib.EC\ntelnetlib.ECHO\ntelnetlib.EL\ntelnetlib.ENCRYPT\ntelnetlib.EOR\ntelnetlib.EXOPL\ntelnetlib.FORWARD_X\ntelnetlib.GA\ntelnetlib.IAC\ntelnetlib.IP\ntelnetlib.KERMIT\ntelnetlib.LFLOW\ntelnetlib.LINEMODE\ntelnetlib.LOGOUT\ntelnetlib.NAMS\ntelnetlib.NAOCRD\ntelnetlib.NAOFFD\ntelnetlib.NAOHTD\ntelnetlib.NAOHTS\ntelnetlib.NAOL\ntelnetlib.NAOLFD\ntelnetlib.NAOP\ntelnetlib.NAOVTD\ntelnetlib.NAOVTS\ntelnetlib.NAWS\ntelnetlib.NEW_ENVIRON\ntelnetlib.NOOPT\ntelnetlib.NOP\ntelnetlib.OLD_ENVIRON\ntelnetlib.OUTMRK\ntelnetlib.PRAGMA_HEARTBEAT\ntelnetlib.PRAGMA_LOGON\ntelnetlib.RCP\ntelnetlib.RCTE\ntelnetlib.RSP\ntelnetlib.SB\ntelnetlib.SE\ntelnetlib.SEND_URL\ntelnetlib.SGA\ntelnetlib.SNDLOC\ntelnetlib.SSPI_LOGON\ntelnetlib.STATUS\ntelnetlib.SUPDUP\ntelnetlib.SUPDUPOUTPUT\ntelnetlib.SUPPRESS_LOCAL_ECHO\ntelnetlib.TELNET_PORT\ntelnetlib.TLS\ntelnetlib.TM\ntelnetlib.TN3270E\ntelnetlib.TSPEED\ntelnetlib.TTYLOC\ntelnetlib.TTYPE\ntelnetlib.TUID\ntelnetlib.Telnet(??)\ntelnetlib.VT3270REGIME\ntelnetlib.WILL\ntelnetlib.WONT\ntelnetlib.X3PAD\ntelnetlib.XASCII\ntelnetlib.XAUTH\ntelnetlib.XDISPLOC\ntelnetlib.select\ntelnetlib.socket\ntelnetlib.sys\ntelnetlib.test(??)\ntelnetlib.theNULL\ntempfile.NamedTemporaryFile(??)\ntempfile.SpooledTemporaryFile(??)\ntempfile.TMP_MAX\ntempfile.TemporaryFile(??)\ntempfile.gettempdir(??)\ntempfile.gettempprefix(??)\ntempfile.mkdtemp(??)\ntempfile.mkstemp(??)\ntempfile.mktemp(??)\ntempfile.tempdir\ntempfile.template\ntermios.B0\ntermios.B110\ntermios.B115200\ntermios.B1200\ntermios.B134\ntermios.B150\ntermios.B1800\ntermios.B19200\ntermios.B200\ntermios.B230400\ntermios.B2400\ntermios.B300\ntermios.B38400\ntermios.B460800\ntermios.B4800\ntermios.B50\ntermios.B57600\ntermios.B600\ntermios.B75\ntermios.B9600\ntermios.BRKINT\ntermios.BS0\ntermios.BS1\ntermios.BSDLY\ntermios.CBAUD\ntermios.CBAUDEX\ntermios.CDSUSP\ntermios.CEOF\ntermios.CEOL\ntermios.CEOT\ntermios.CERASE\ntermios.CFLUSH\ntermios.CIBAUD\ntermios.CINTR\ntermios.CKILL\ntermios.CLNEXT\ntermios.CLOCAL\ntermios.CQUIT\ntermios.CR0\ntermios.CR1\ntermios.CR2\ntermios.CR3\ntermios.CRDLY\ntermios.CREAD\ntermios.CRPRNT\ntermios.CRTSCTS\ntermios.CS5\ntermios.CS6\ntermios.CS7\ntermios.CS8\ntermios.CSIZE\ntermios.CSTART\ntermios.CSTOP\ntermios.CSTOPB\ntermios.CSUSP\ntermios.CWERASE\ntermios.ECHO\ntermios.ECHOCTL\ntermios.ECHOE\ntermios.ECHOK\ntermios.ECHOKE\ntermios.ECHONL\ntermios.ECHOPRT\ntermios.EXTA\ntermios.EXTB\ntermios.FF0\ntermios.FF1\ntermios.FFDLY\ntermios.FIOASYNC\ntermios.FIOCLEX\ntermios.FIONBIO\ntermios.FIONCLEX\ntermios.FIONREAD\ntermios.FLUSHO\ntermios.HUPCL\ntermios.ICANON\ntermios.ICRNL\ntermios.IEXTEN\ntermios.IGNBRK\ntermios.IGNCR\ntermios.IGNPAR\ntermios.IMAXBEL\ntermios.INLCR\ntermios.INPCK\ntermios.IOCSIZE_MASK\ntermios.IOCSIZE_SHIFT\ntermios.ISIG\ntermios.ISTRIP\ntermios.IUCLC\ntermios.IXANY\ntermios.IXOFF\ntermios.IXON\ntermios.NCC\ntermios.NCCS\ntermios.NL0\ntermios.NL1\ntermios.NLDLY\ntermios.NOFLSH\ntermios.N_MOUSE\ntermios.N_PPP\ntermios.N_SLIP\ntermios.N_STRIP\ntermios.N_TTY\ntermios.OCRNL\ntermios.OFDEL\ntermios.OFILL\ntermios.OLCUC\ntermios.ONLCR\ntermios.ONLRET\ntermios.ONOCR\ntermios.OPOST\ntermios.PARENB\ntermios.PARMRK\ntermios.PARODD\ntermios.PENDIN\ntermios.TAB0\ntermios.TAB1\ntermios.TAB2\ntermios.TAB3\ntermios.TABDLY\ntermios.TCFLSH\ntermios.TCGETA\ntermios.TCGETS\ntermios.TCIFLUSH\ntermios.TCIOFF\ntermios.TCIOFLUSH\ntermios.TCION\ntermios.TCOFLUSH\ntermios.TCOOFF\ntermios.TCOON\ntermios.TCSADRAIN\ntermios.TCSAFLUSH\ntermios.TCSANOW\ntermios.TCSBRK\ntermios.TCSBRKP\ntermios.TCSETA\ntermios.TCSETAF\ntermios.TCSETAW\ntermios.TCSETS\ntermios.TCSETSF\ntermios.TCSETSW\ntermios.TCXONC\ntermios.TIOCCONS\ntermios.TIOCEXCL\ntermios.TIOCGETD\ntermios.TIOCGICOUNT\ntermios.TIOCGLCKTRMIOS\ntermios.TIOCGPGRP\ntermios.TIOCGSERIAL\ntermios.TIOCGSOFTCAR\ntermios.TIOCGWINSZ\ntermios.TIOCINQ\ntermios.TIOCLINUX\ntermios.TIOCMBIC\ntermios.TIOCMBIS\ntermios.TIOCMGET\ntermios.TIOCMIWAIT\ntermios.TIOCMSET\ntermios.TIOCM_CAR\ntermios.TIOCM_CD\ntermios.TIOCM_CTS\ntermios.TIOCM_DSR\ntermios.TIOCM_DTR\ntermios.TIOCM_LE\ntermios.TIOCM_RI\ntermios.TIOCM_RNG\ntermios.TIOCM_RTS\ntermios.TIOCM_SR\ntermios.TIOCM_ST\ntermios.TIOCNOTTY\ntermios.TIOCNXCL\ntermios.TIOCOUTQ\ntermios.TIOCPKT\ntermios.TIOCPKT_DATA\ntermios.TIOCPKT_DOSTOP\ntermios.TIOCPKT_FLUSHREAD\ntermios.TIOCPKT_FLUSHWRITE\ntermios.TIOCPKT_NOSTOP\ntermios.TIOCPKT_START\ntermios.TIOCPKT_STOP\ntermios.TIOCSCTTY\ntermios.TIOCSERCONFIG\ntermios.TIOCSERGETLSR\ntermios.TIOCSERGETMULTI\ntermios.TIOCSERGSTRUCT\ntermios.TIOCSERGWILD\ntermios.TIOCSERSETMULTI\ntermios.TIOCSERSWILD\ntermios.TIOCSER_TEMT\ntermios.TIOCSETD\ntermios.TIOCSLCKTRMIOS\ntermios.TIOCSPGRP\ntermios.TIOCSSERIAL\ntermios.TIOCSSOFTCAR\ntermios.TIOCSTI\ntermios.TIOCSWINSZ\ntermios.TOSTOP\ntermios.VDISCARD\ntermios.VEOF\ntermios.VEOL\ntermios.VEOL2\ntermios.VERASE\ntermios.VINTR\ntermios.VKILL\ntermios.VLNEXT\ntermios.VMIN\ntermios.VQUIT\ntermios.VREPRINT\ntermios.VSTART\ntermios.VSTOP\ntermios.VSUSP\ntermios.VSWTC\ntermios.VSWTCH\ntermios.VT0\ntermios.VT1\ntermios.VTDLY\ntermios.VTIME\ntermios.VWERASE\ntermios.XCASE\ntermios.XTABS\ntermios.error\ntermios.tcdrain(fd) -> None\ntermios.tcflow(fd, action) -> None\ntermios.tcflush(fd, queue) -> None\ntermios.tcgetattr(fd) -> list_of_attrs\ntermios.tcsendbreak(fd, duration) -> None\ntermios.tcsetattr(fd, when, attributes) -> None\ntextwrap.TextWrapper(??)\ntextwrap.dedent(??)\ntextwrap.fill(??)\ntextwrap.re\ntextwrap.string\ntextwrap.wrap(??)\nthis.c\nthis.d\nthis.i\nthis.s\nthread.LockType\nthread.allocate\nthread.allocate_lock() -> lock object\nthread.error\nthread.exit()\nthread.exit_thread\nthread.get_ident() -> integer\nthread.interrupt_main()\nthread.stack_size([size]) -> size\nthread.start_new\nthread.start_new_thread(function, args[, kwargs])\nthreading.BoundedSemaphore(??)\nthreading.Condition(??)\nthreading.Event(??)\nthreading.Lock\nthreading.RLock(??)\nthreading.Semaphore(??)\nthreading.Thread\nthreading.ThreadError\nthreading.Timer(??)\nthreading.activeCount(??)\nthreading.active_count(??)\nthreading.currentThread(??)\nthreading.current_thread(??)\nthreading.deque(iterable[, maxlen]) --> deque object\nthreading.enumerate(??)\nthreading.local\nthreading.setprofile(??)\nthreading.settrace(??)\nthreading.stack_size([size]) -> size\nthreading.warnings\ntime.accept2dyear\ntime.altzone\ntime.asctime([tuple]) -> string\ntime.clock() -> floating point number\ntime.ctime(seconds) -> string\ntime.daylight\ntime.gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\ntime.localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\ntime.mktime(tuple) -> floating point number\ntime.sleep(seconds)\ntime.strftime(format[, tuple]) -> string\ntime.strptime(string, format) -> struct_time\ntime.struct_time\ntime.time() -> floating point number\ntime.timezone\ntime.tzname\ntime.tzset(zone)\ntimeit.Timer(??)\ntimeit.default_number\ntimeit.default_repeat\ntimeit.default_timer\ntimeit.dummy_src_name\ntimeit.gc\ntimeit.itertools\ntimeit.main(??)\ntimeit.reindent(??)\ntimeit.repeat(??)\ntimeit.sys\ntimeit.template\ntimeit.time\ntimeit.timeit(??)\ntoaiff.error\ntoaiff.os\ntoaiff.pipes\ntoaiff.sndhdr\ntoaiff.t\ntoaiff.table\ntoaiff.tempfile\ntoaiff.toaiff(??)\ntoaiff.uncompress\ntoken.AMPER\ntoken.AMPEREQUAL\ntoken.AT\ntoken.BACKQUOTE\ntoken.CIRCUMFLEX\ntoken.CIRCUMFLEXEQUAL\ntoken.COLON\ntoken.COMMA\ntoken.DEDENT\ntoken.DOT\ntoken.DOUBLESLASH\ntoken.DOUBLESLASHEQUAL\ntoken.DOUBLESTAR\ntoken.DOUBLESTAREQUAL\ntoken.ENDMARKER\ntoken.EQEQUAL\ntoken.EQUAL\ntoken.ERRORTOKEN\ntoken.GREATER\ntoken.GREATEREQUAL\ntoken.INDENT\ntoken.ISEOF(??)\ntoken.ISNONTERMINAL(??)\ntoken.ISTERMINAL(??)\ntoken.LBRACE\ntoken.LEFTSHIFT\ntoken.LEFTSHIFTEQUAL\ntoken.LESS\ntoken.LESSEQUAL\ntoken.LPAR\ntoken.LSQB\ntoken.MINEQUAL\ntoken.MINUS\ntoken.NAME\ntoken.NEWLINE\ntoken.NOTEQUAL\ntoken.NT_OFFSET\ntoken.NUMBER\ntoken.N_TOKENS\ntoken.OP\ntoken.PERCENT\ntoken.PERCENTEQUAL\ntoken.PLUS\ntoken.PLUSEQUAL\ntoken.RBRACE\ntoken.RIGHTSHIFT\ntoken.RIGHTSHIFTEQUAL\ntoken.RPAR\ntoken.RSQB\ntoken.SEMI\ntoken.SLASH\ntoken.SLASHEQUAL\ntoken.STAR\ntoken.STAREQUAL\ntoken.STRING\ntoken.TILDE\ntoken.VBAR\ntoken.VBAREQUAL\ntoken.main(??)\ntoken.tok_name\ntokenize.AMPER\ntokenize.AMPEREQUAL\ntokenize.AT\ntokenize.BACKQUOTE\ntokenize.Binnumber\ntokenize.Bracket\ntokenize.CIRCUMFLEX\ntokenize.CIRCUMFLEXEQUAL\ntokenize.COLON\ntokenize.COMMA\ntokenize.COMMENT\ntokenize.Comment\ntokenize.ContStr\ntokenize.DEDENT\ntokenize.DOT\ntokenize.DOUBLESLASH\ntokenize.DOUBLESLASHEQUAL\ntokenize.DOUBLESTAR\ntokenize.DOUBLESTAREQUAL\ntokenize.Decnumber\ntokenize.Double\ntokenize.Double3\ntokenize.ENDMARKER\ntokenize.EQEQUAL\ntokenize.EQUAL\ntokenize.ERRORTOKEN\ntokenize.Expfloat\ntokenize.Exponent\ntokenize.Floatnumber\ntokenize.Funny\ntokenize.GREATER\ntokenize.GREATEREQUAL\ntokenize.Hexnumber\ntokenize.INDENT\ntokenize.ISEOF(??)\ntokenize.ISNONTERMINAL(??)\ntokenize.ISTERMINAL(??)\ntokenize.Ignore\ntokenize.Imagnumber\ntokenize.Intnumber\ntokenize.LBRACE\ntokenize.LEFTSHIFT\ntokenize.LEFTSHIFTEQUAL\ntokenize.LESS\ntokenize.LESSEQUAL\ntokenize.LPAR\ntokenize.LSQB\ntokenize.MINEQUAL\ntokenize.MINUS\ntokenize.NAME\ntokenize.NEWLINE\ntokenize.NL\ntokenize.NOTEQUAL\ntokenize.NT_OFFSET\ntokenize.NUMBER\ntokenize.N_TOKENS\ntokenize.Name\ntokenize.Number\ntokenize.OP\ntokenize.Octnumber\ntokenize.Operator\ntokenize.PERCENT\ntokenize.PERCENTEQUAL\ntokenize.PLUS\ntokenize.PLUSEQUAL\ntokenize.PlainToken\ntokenize.Pointfloat\ntokenize.PseudoExtras\ntokenize.PseudoToken\ntokenize.RBRACE\ntokenize.RIGHTSHIFT\ntokenize.RIGHTSHIFTEQUAL\ntokenize.RPAR\ntokenize.RSQB\ntokenize.SEMI\ntokenize.SLASH\ntokenize.SLASHEQUAL\ntokenize.STAR\ntokenize.STAREQUAL\ntokenize.STRING\ntokenize.Single\ntokenize.Single3\ntokenize.Special\ntokenize.StopTokenizing\ntokenize.String\ntokenize.TILDE\ntokenize.Token\ntokenize.TokenError\ntokenize.Triple\ntokenize.Untokenizer(??)\ntokenize.VBAR\ntokenize.VBAREQUAL\ntokenize.Whitespace\ntokenize.any(??)\ntokenize.double3prog\ntokenize.endprogs\ntokenize.generate_tokens(??)\ntokenize.group(??)\ntokenize.main(??)\ntokenize.maybe(??)\ntokenize.printtoken(??)\ntokenize.pseudoprog\ntokenize.re\ntokenize.single3prog\ntokenize.single_quoted\ntokenize.string\ntokenize.t\ntokenize.tabsize\ntokenize.tok_name\ntokenize.tokenize(??)\ntokenize.tokenize_loop(??)\ntokenize.tokenprog\ntokenize.triple_quoted\ntokenize.untokenize(??)\ntrace.CoverageResults(??)\ntrace.Ignore(??)\ntrace.PRAGMA_NOCOVER\ntrace.Trace(??)\ntrace.cPickle\ntrace.find_executable_linenos(??)\ntrace.find_lines(??)\ntrace.find_lines_from_code(??)\ntrace.find_strings(??)\ntrace.fullmodname(??)\ntrace.gc\ntrace.linecache\ntrace.main(??)\ntrace.modname(??)\ntrace.os\ntrace.pickle\ntrace.re\ntrace.rx_blank\ntrace.sys\ntrace.threading\ntrace.time\ntrace.token\ntrace.tokenize\ntrace.types\ntrace.usage(??)\ntraceback.extract_stack(??)\ntraceback.extract_tb(??)\ntraceback.format_exc(??)\ntraceback.format_exception(??)\ntraceback.format_exception_only(??)\ntraceback.format_list(??)\ntraceback.format_stack(??)\ntraceback.format_tb(??)\ntraceback.linecache\ntraceback.print_exc(??)\ntraceback.print_exception(??)\ntraceback.print_last(??)\ntraceback.print_list(??)\ntraceback.print_stack(??)\ntraceback.print_tb(??)\ntraceback.sys\ntraceback.tb_lineno(??)\ntraceback.types\ntty.B0\ntty.B110\ntty.B115200\ntty.B1200\ntty.B134\ntty.B150\ntty.B1800\ntty.B19200\ntty.B200\ntty.B230400\ntty.B2400\ntty.B300\ntty.B38400\ntty.B460800\ntty.B4800\ntty.B50\ntty.B57600\ntty.B600\ntty.B75\ntty.B9600\ntty.BRKINT\ntty.BS0\ntty.BS1\ntty.BSDLY\ntty.CBAUD\ntty.CBAUDEX\ntty.CC\ntty.CDSUSP\ntty.CEOF\ntty.CEOL\ntty.CEOT\ntty.CERASE\ntty.CFLAG\ntty.CFLUSH\ntty.CIBAUD\ntty.CINTR\ntty.CKILL\ntty.CLNEXT\ntty.CLOCAL\ntty.CQUIT\ntty.CR0\ntty.CR1\ntty.CR2\ntty.CR3\ntty.CRDLY\ntty.CREAD\ntty.CRPRNT\ntty.CRTSCTS\ntty.CS5\ntty.CS6\ntty.CS7\ntty.CS8\ntty.CSIZE\ntty.CSTART\ntty.CSTOP\ntty.CSTOPB\ntty.CSUSP\ntty.CWERASE\ntty.ECHO\ntty.ECHOCTL\ntty.ECHOE\ntty.ECHOK\ntty.ECHOKE\ntty.ECHONL\ntty.ECHOPRT\ntty.EXTA\ntty.EXTB\ntty.FF0\ntty.FF1\ntty.FFDLY\ntty.FIOASYNC\ntty.FIOCLEX\ntty.FIONBIO\ntty.FIONCLEX\ntty.FIONREAD\ntty.FLUSHO\ntty.HUPCL\ntty.ICANON\ntty.ICRNL\ntty.IEXTEN\ntty.IFLAG\ntty.IGNBRK\ntty.IGNCR\ntty.IGNPAR\ntty.IMAXBEL\ntty.INLCR\ntty.INPCK\ntty.IOCSIZE_MASK\ntty.IOCSIZE_SHIFT\ntty.ISIG\ntty.ISPEED\ntty.ISTRIP\ntty.IUCLC\ntty.IXANY\ntty.IXOFF\ntty.IXON\ntty.LFLAG\ntty.NCC\ntty.NCCS\ntty.NL0\ntty.NL1\ntty.NLDLY\ntty.NOFLSH\ntty.N_MOUSE\ntty.N_PPP\ntty.N_SLIP\ntty.N_STRIP\ntty.N_TTY\ntty.OCRNL\ntty.OFDEL\ntty.OFILL\ntty.OFLAG\ntty.OLCUC\ntty.ONLCR\ntty.ONLRET\ntty.ONOCR\ntty.OPOST\ntty.OSPEED\ntty.PARENB\ntty.PARMRK\ntty.PARODD\ntty.PENDIN\ntty.TAB0\ntty.TAB1\ntty.TAB2\ntty.TAB3\ntty.TABDLY\ntty.TCFLSH\ntty.TCGETA\ntty.TCGETS\ntty.TCIFLUSH\ntty.TCIOFF\ntty.TCIOFLUSH\ntty.TCION\ntty.TCOFLUSH\ntty.TCOOFF\ntty.TCOON\ntty.TCSADRAIN\ntty.TCSAFLUSH\ntty.TCSANOW\ntty.TCSBRK\ntty.TCSBRKP\ntty.TCSETA\ntty.TCSETAF\ntty.TCSETAW\ntty.TCSETS\ntty.TCSETSF\ntty.TCSETSW\ntty.TCXONC\ntty.TIOCCONS\ntty.TIOCEXCL\ntty.TIOCGETD\ntty.TIOCGICOUNT\ntty.TIOCGLCKTRMIOS\ntty.TIOCGPGRP\ntty.TIOCGSERIAL\ntty.TIOCGSOFTCAR\ntty.TIOCGWINSZ\ntty.TIOCINQ\ntty.TIOCLINUX\ntty.TIOCMBIC\ntty.TIOCMBIS\ntty.TIOCMGET\ntty.TIOCMIWAIT\ntty.TIOCMSET\ntty.TIOCM_CAR\ntty.TIOCM_CD\ntty.TIOCM_CTS\ntty.TIOCM_DSR\ntty.TIOCM_DTR\ntty.TIOCM_LE\ntty.TIOCM_RI\ntty.TIOCM_RNG\ntty.TIOCM_RTS\ntty.TIOCM_SR\ntty.TIOCM_ST\ntty.TIOCNOTTY\ntty.TIOCNXCL\ntty.TIOCOUTQ\ntty.TIOCPKT\ntty.TIOCPKT_DATA\ntty.TIOCPKT_DOSTOP\ntty.TIOCPKT_FLUSHREAD\ntty.TIOCPKT_FLUSHWRITE\ntty.TIOCPKT_NOSTOP\ntty.TIOCPKT_START\ntty.TIOCPKT_STOP\ntty.TIOCSCTTY\ntty.TIOCSERCONFIG\ntty.TIOCSERGETLSR\ntty.TIOCSERGETMULTI\ntty.TIOCSERGSTRUCT\ntty.TIOCSERGWILD\ntty.TIOCSERSETMULTI\ntty.TIOCSERSWILD\ntty.TIOCSER_TEMT\ntty.TIOCSETD\ntty.TIOCSLCKTRMIOS\ntty.TIOCSPGRP\ntty.TIOCSSERIAL\ntty.TIOCSSOFTCAR\ntty.TIOCSTI\ntty.TIOCSWINSZ\ntty.TOSTOP\ntty.VDISCARD\ntty.VEOF\ntty.VEOL\ntty.VEOL2\ntty.VERASE\ntty.VINTR\ntty.VKILL\ntty.VLNEXT\ntty.VMIN\ntty.VQUIT\ntty.VREPRINT\ntty.VSTART\ntty.VSTOP\ntty.VSUSP\ntty.VSWTC\ntty.VSWTCH\ntty.VT0\ntty.VT1\ntty.VTDLY\ntty.VTIME\ntty.VWERASE\ntty.XCASE\ntty.XTABS\ntty.error\ntty.setcbreak(??)\ntty.setraw(??)\ntty.tcdrain(fd) -> None\ntty.tcflow(fd, action) -> None\ntty.tcflush(fd, queue) -> None\ntty.tcgetattr(fd) -> list_of_attrs\ntty.tcsendbreak(fd, duration) -> None\ntty.tcsetattr(fd, when, attributes) -> None\ntuple() -> empty tuple\ntype(object) -> the object's type\ntypes.BooleanType\ntypes.BufferType\ntypes.BuiltinFunctionType\ntypes.BuiltinMethodType\ntypes.ClassType\ntypes.CodeType\ntypes.ComplexType\ntypes.DictProxyType\ntypes.DictType\ntypes.DictionaryType\ntypes.EllipsisType\ntypes.FileType\ntypes.FloatType\ntypes.FrameType\ntypes.FunctionType\ntypes.GeneratorType\ntypes.GetSetDescriptorType\ntypes.InstanceType\ntypes.IntType\ntypes.LambdaType\ntypes.ListType\ntypes.LongType\ntypes.MemberDescriptorType\ntypes.MethodType\ntypes.ModuleType\ntypes.NoneType\ntypes.NotImplementedType\ntypes.ObjectType\ntypes.SliceType\ntypes.StringType\ntypes.StringTypes\ntypes.TracebackType\ntypes.TupleType\ntypes.TypeType\ntypes.UnboundMethodType\ntypes.UnicodeType\ntypes.XRangeType\nunichr(i) -> Unicode character\nunicode(string [, encoding[, errors]]) -> object\nunicodedata.UCD\nunicodedata.bidirectional(unichr)\nunicodedata.category(unichr)\nunicodedata.combining(unichr)\nunicodedata.decimal(unichr[, default])\nunicodedata.decomposition(unichr)\nunicodedata.digit(unichr[, default])\nunicodedata.east_asian_width(unichr)\nunicodedata.lookup(name)\nunicodedata.mirrored(unichr)\nunicodedata.name(unichr[, default])\nunicodedata.normalize(form, unistr)\nunicodedata.numeric(unichr[, default])\nunicodedata.ucd_3_2_0\nunicodedata.ucnhash_CAPI\nunicodedata.unidata_version\nurllib.ContentTooShortError\nurllib.FancyURLopener(??)\nurllib.MAXFTPCACHE\nurllib.URLopener(??)\nurllib.addbase(??)\nurllib.addclosehook(??)\nurllib.addinfo(??)\nurllib.addinfourl(??)\nurllib.always_safe\nurllib.basejoin(??)\nurllib.c\nurllib.ftpcache\nurllib.ftperrors(??)\nurllib.ftpwrapper(??)\nurllib.getproxies(??)\nurllib.getproxies_environment(??)\nurllib.i\nurllib.localhost(??)\nurllib.main(??)\nurllib.noheaders(??)\nurllib.os\nurllib.pathname2url(??)\nurllib.proxy_bypass(??)\nurllib.proxy_bypass_environment(??)\nurllib.quote('abc def') -> 'abc%20def'\nurllib.quote_plus(??)\nurllib.reporthook(??)\nurllib.socket\nurllib.splitattr('/path;attr1=value1;attr2=value2;...') ->\nurllib.splithost('//host[:port]/path') --> 'host[:port]', '/path'.\nurllib.splitnport(??)\nurllib.splitpasswd('user:passwd') -> 'user', 'passwd'.\nurllib.splitport('host:port') --> 'host', 'port'.\nurllib.splitquery('/path?query') --> '/path', 'query'.\nurllib.splittag('/path#tag') --> '/path', 'tag'.\nurllib.splittype('type:opaquestring') --> 'type', 'opaquestring'.\nurllib.splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.\nurllib.splitvalue('attr=value') --> 'attr', 'value'.\nurllib.ssl\nurllib.string\nurllib.sys\nurllib.test(??)\nurllib.test1(??)\nurllib.thishost(??)\nurllib.time\nurllib.toBytes(u\"URL\") --> 'URL'.\nurllib.unquote('abc%20def') -> 'abc def'.\nurllib.unquote_plus(??)\nurllib.unwrap('<URL:type://host/path>') --> 'type://host/path'.\nurllib.url2pathname(??)\nurllib.urlcleanup(??)\nurllib.urlencode(??)\nurllib.urlopen(??)\nurllib.urlretrieve(??)\nurllib2.AbstractBasicAuthHandler(??)\nurllib2.AbstractDigestAuthHandler(??)\nurllib2.AbstractHTTPHandler(??)\nurllib2.BaseHandler(??)\nurllib2.CacheFTPHandler(??)\nurllib2.FTPHandler(??)\nurllib2.FileHandler(??)\nurllib2.HTTPBasicAuthHandler(??)\nurllib2.HTTPCookieProcessor(??)\nurllib2.HTTPDefaultErrorHandler(??)\nurllib2.HTTPDigestAuthHandler(??)\nurllib2.HTTPError\nurllib2.HTTPErrorProcessor(??)\nurllib2.HTTPHandler(??)\nurllib2.HTTPPasswordMgr(??)\nurllib2.HTTPPasswordMgrWithDefaultRealm(??)\nurllib2.HTTPRedirectHandler(??)\nurllib2.HTTPSHandler(??)\nurllib2.OpenerDirector(??)\nurllib2.ProxyBasicAuthHandler(??)\nurllib2.ProxyDigestAuthHandler(??)\nurllib2.ProxyHandler(??)\nurllib2.Request(??)\nurllib2.StringIO([s]) -- Return a StringIO-like stream for reading or writing\nurllib2.URLError\nurllib2.UnknownHandler(??)\nurllib2.addinfourl(??)\nurllib2.base64\nurllib2.bisect\nurllib2.build_opener(??)\nurllib2.ftpwrapper(??)\nurllib2.getproxies(??)\nurllib2.hashlib\nurllib2.httplib\nurllib2.install_opener(??)\nurllib2.localhost(??)\nurllib2.mimetools\nurllib2.os\nurllib2.parse_http_list(??)\nurllib2.parse_keqv_list(??)\nurllib2.posixpath\nurllib2.proxy_bypass(??)\nurllib2.quote('abc def') -> 'abc%20def'\nurllib2.random\nurllib2.randombytes(??)\nurllib2.re\nurllib2.request_host(??)\nurllib2.socket\nurllib2.splitattr('/path;attr1=value1;attr2=value2;...') ->\nurllib2.splithost('//host[:port]/path') --> 'host[:port]', '/path'.\nurllib2.splitpasswd('user:passwd') -> 'user', 'passwd'.\nurllib2.splitport('host:port') --> 'host', 'port'.\nurllib2.splittype('type:opaquestring') --> 'type', 'opaquestring'.\nurllib2.splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.\nurllib2.splitvalue('attr=value') --> 'attr', 'value'.\nurllib2.sys\nurllib2.time\nurllib2.unquote('abc%20def') -> 'abc def'.\nurllib2.unwrap('<URL:type://host/path>') --> 'type://host/path'.\nurllib2.url2pathname(??)\nurllib2.urlopen(??)\nurllib2.urlparse\nurlparse.MAX_CACHE_SIZE\nurlparse.ParseResult\nurlparse.ResultMixin\nurlparse.SplitResult\nurlparse.clear_cache(??)\nurlparse.namedtuple(??)\nurlparse.non_hierarchical\nurlparse.parse_qs(??)\nurlparse.parse_qsl(??)\nurlparse.scheme_chars\nurlparse.test(??)\nurlparse.test_input\nurlparse.unquote('abc%20def') -> 'abc def'.\nurlparse.urldefrag(??)\nurlparse.urljoin(??)\nurlparse.urlparse(??)\nurlparse.urlsplit(??)\nurlparse.urlunparse(??)\nurlparse.urlunsplit(??)\nurlparse.uses_fragment\nurlparse.uses_netloc\nurlparse.uses_params\nurlparse.uses_query\nurlparse.uses_relative\nuser.home\nuser.os\nuser.pythonrc\nuu.Error\nuu.binascii\nuu.decode(??)\nuu.encode(??)\nuu.os\nuu.sys\nuu.test(??)\nuuid.NAMESPACE_DNS\nuuid.NAMESPACE_OID\nuuid.NAMESPACE_URL\nuuid.NAMESPACE_X500\nuuid.RESERVED_FUTURE\nuuid.RESERVED_MICROSOFT\nuuid.RESERVED_NCS\nuuid.RFC_4122\nuuid.UUID\nuuid.ctypes\nuuid.getnode(??)\nuuid.lib\nuuid.libname\nuuid.sys\nuuid.uuid1(??)\nuuid.uuid3(??)\nuuid.uuid4(??)\nuuid.uuid5(??)\nvars([object]) -> dictionary\nwarnings.WarningMessage\nwarnings.catch_warnings\nwarnings.default_action\nwarnings.defaultaction\nwarnings.filters\nwarnings.filterwarnings(??)\nwarnings.formatwarning(??)\nwarnings.linecache\nwarnings.once_registry\nwarnings.onceregistry\nwarnings.resetwarnings(??)\nwarnings.showwarning(??)\nwarnings.simplefilter(??)\nwarnings.sys\nwarnings.types\nwarnings.warn\nwarnings.warn_explicit\nwarnings.warnpy3k(??)\nwave.Chunk(??)\nwave.Error\nwave.WAVE_FORMAT_PCM\nwave.Wave_read(??)\nwave.Wave_write(??)\nwave.big_endian\nwave.open(??)\nwave.openfp(??)\nwave.struct\nweakref.CallableProxyType\nweakref.KeyedRef\nweakref.ProxyType\nweakref.ProxyTypes\nweakref.ReferenceError\nweakref.ReferenceType\nweakref.UserDict\nweakref.WeakKeyDictionary(??)\nweakref.WeakSet\nweakref.WeakValueDictionary(??)\nweakref.getweakrefcount(object) -- return the number of weak references\nweakref.getweakrefs(object) -- return a list of all weak reference objects\nweakref.proxy(object[, callback]) -- create a proxy object that weakly\nweakref.ref\nwebbrowser.BackgroundBrowser\nwebbrowser.BaseBrowser\nwebbrowser.Elinks\nwebbrowser.Error\nwebbrowser.Galeon\nwebbrowser.GenericBrowser\nwebbrowser.Grail\nwebbrowser.Konqueror\nwebbrowser.Mozilla\nwebbrowser.Netscape\nwebbrowser.Opera\nwebbrowser.UnixBrowser\nwebbrowser.get(??)\nwebbrowser.main(??)\nwebbrowser.open(??)\nwebbrowser.open_new(??)\nwebbrowser.open_new_tab(??)\nwebbrowser.os\nwebbrowser.register(??)\nwebbrowser.register_X_browsers(??)\nwebbrowser.shlex\nwebbrowser.stat\nwebbrowser.subprocess\nwebbrowser.sys\nwebbrowser.time\nwhichdb.dbm\nwhichdb.os\nwhichdb.struct\nwhichdb.sys\nwhichdb.whichdb(??)\nwsgiref.handlers\nwsgiref.handlers.BaseCGIHandler(??)\nwsgiref.handlers.BaseHandler(??)\nwsgiref.handlers.CGIHandler(??)\nwsgiref.handlers.FileWrapper(??)\nwsgiref.handlers.Headers(??)\nwsgiref.handlers.SimpleHandler(??)\nwsgiref.handlers.StringType\nwsgiref.handlers.format_date_time(??)\nwsgiref.handlers.guess_scheme(??)\nwsgiref.handlers.is_hop_by_hop(??)\nwsgiref.handlers.os\nwsgiref.handlers.sys\nwsgiref.handlers.time\nwsgiref.headers\nwsgiref.headers.Headers(??)\nwsgiref.headers.ListType\nwsgiref.headers.TupleType\nwsgiref.headers.re\nwsgiref.headers.tspecials\nwsgiref.simple_server\nwsgiref.simple_server.BaseHTTPRequestHandler(??)\nwsgiref.simple_server.HTTPServer(??)\nwsgiref.simple_server.ServerHandler(??)\nwsgiref.simple_server.SimpleHandler(??)\nwsgiref.simple_server.WSGIRequestHandler(??)\nwsgiref.simple_server.WSGIServer(??)\nwsgiref.simple_server.demo_app(??)\nwsgiref.simple_server.make_server(??)\nwsgiref.simple_server.server_version\nwsgiref.simple_server.software_version\nwsgiref.simple_server.sys\nwsgiref.simple_server.sys_version\nwsgiref.simple_server.urllib\nwsgiref.util\nwsgiref.util.FileWrapper(??)\nwsgiref.util.application_uri(??)\nwsgiref.util.guess_scheme(??)\nwsgiref.util.is_hop_by_hop(??)\nwsgiref.util.posixpath\nwsgiref.util.request_uri(??)\nwsgiref.util.setup_testing_defaults(??)\nwsgiref.util.shift_path_info(??)\nwsgiref.validate\nwsgiref.validate.DictType\nwsgiref.validate.ErrorWrapper(??)\nwsgiref.validate.InputWrapper(??)\nwsgiref.validate.IteratorWrapper(??)\nwsgiref.validate.ListType\nwsgiref.validate.PartialIteratorWrapper(??)\nwsgiref.validate.StringType\nwsgiref.validate.TupleType\nwsgiref.validate.WSGIWarning\nwsgiref.validate.WriteWrapper(??)\nwsgiref.validate.assert_(??)\nwsgiref.validate.bad_header_value_re\nwsgiref.validate.check_content_type(??)\nwsgiref.validate.check_environ(??)\nwsgiref.validate.check_errors(??)\nwsgiref.validate.check_exc_info(??)\nwsgiref.validate.check_headers(??)\nwsgiref.validate.check_input(??)\nwsgiref.validate.check_iterator(??)\nwsgiref.validate.check_status(??)\nwsgiref.validate.header_re\nwsgiref.validate.re\nwsgiref.validate.sys\nwsgiref.validate.validator(??)\nwsgiref.validate.warnings\nxdrlib.ConversionError\nxdrlib.Error\nxdrlib.Packer(??)\nxdrlib.Unpacker(??)\nxdrlib.struct\nxml.dom\nxml.dom.DOMException\nxml.dom.DOMSTRING_SIZE_ERR\nxml.dom.DomstringSizeErr\nxml.dom.EMPTY_NAMESPACE\nxml.dom.EMPTY_PREFIX\nxml.dom.HIERARCHY_REQUEST_ERR\nxml.dom.HierarchyRequestErr\nxml.dom.INDEX_SIZE_ERR\nxml.dom.INUSE_ATTRIBUTE_ERR\nxml.dom.INVALID_ACCESS_ERR\nxml.dom.INVALID_CHARACTER_ERR\nxml.dom.INVALID_MODIFICATION_ERR\nxml.dom.INVALID_STATE_ERR\nxml.dom.IndexSizeErr\nxml.dom.InuseAttributeErr\nxml.dom.InvalidAccessErr\nxml.dom.InvalidCharacterErr\nxml.dom.InvalidModificationErr\nxml.dom.InvalidStateErr\nxml.dom.NAMESPACE_ERR\nxml.dom.NOT_FOUND_ERR\nxml.dom.NOT_SUPPORTED_ERR\nxml.dom.NO_DATA_ALLOWED_ERR\nxml.dom.NO_MODIFICATION_ALLOWED_ERR\nxml.dom.NamespaceErr\nxml.dom.NoDataAllowedErr\nxml.dom.NoModificationAllowedErr\nxml.dom.Node(??)\nxml.dom.NodeFilter\nxml.dom.NodeFilter.NodeFilter(??)\nxml.dom.NotFoundErr\nxml.dom.NotSupportedErr\nxml.dom.SYNTAX_ERR\nxml.dom.SyntaxErr\nxml.dom.UserDataHandler(??)\nxml.dom.VALIDATION_ERR\nxml.dom.ValidationErr\nxml.dom.WRONG_DOCUMENT_ERR\nxml.dom.WrongDocumentErr\nxml.dom.XHTML_NAMESPACE\nxml.dom.XMLNS_NAMESPACE\nxml.dom.XML_NAMESPACE\nxml.dom.domreg\nxml.dom.domreg.EmptyNodeList\nxml.dom.domreg.NodeList\nxml.dom.domreg.StringTypes\nxml.dom.domreg.defproperty(??)\nxml.dom.domreg.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxml.dom.domreg.registerDOMImplementation(name, factory)\nxml.dom.domreg.registered\nxml.dom.domreg.well_known_implementations\nxml.dom.expatbuilder\nxml.dom.expatbuilder.CDATA_SECTION_NODE\nxml.dom.expatbuilder.DOCUMENT_NODE\nxml.dom.expatbuilder.EMPTY_NAMESPACE\nxml.dom.expatbuilder.EMPTY_PREFIX\nxml.dom.expatbuilder.ElementInfo\nxml.dom.expatbuilder.EmptyNodeList\nxml.dom.expatbuilder.ExpatBuilder(??)\nxml.dom.expatbuilder.ExpatBuilderNS(??)\nxml.dom.expatbuilder.FILTER_ACCEPT\nxml.dom.expatbuilder.FILTER_INTERRUPT\nxml.dom.expatbuilder.FILTER_REJECT\nxml.dom.expatbuilder.FILTER_SKIP\nxml.dom.expatbuilder.FilterCrutch\nxml.dom.expatbuilder.FilterVisibilityController\nxml.dom.expatbuilder.FragmentBuilder(??)\nxml.dom.expatbuilder.FragmentBuilderNS(??)\nxml.dom.expatbuilder.InternalSubsetExtractor(??)\nxml.dom.expatbuilder.Namespaces(??)\nxml.dom.expatbuilder.Node(??)\nxml.dom.expatbuilder.NodeFilter(??)\nxml.dom.expatbuilder.NodeList\nxml.dom.expatbuilder.ParseEscape\nxml.dom.expatbuilder.Rejecter\nxml.dom.expatbuilder.Skipper\nxml.dom.expatbuilder.StringTypes\nxml.dom.expatbuilder.TEXT_NODE\nxml.dom.expatbuilder.XMLNS_NAMESPACE\nxml.dom.expatbuilder.defproperty(??)\nxml.dom.expatbuilder.expat\nxml.dom.expatbuilder.makeBuilder(??)\nxml.dom.expatbuilder.minidom\nxml.dom.expatbuilder.parse(??)\nxml.dom.expatbuilder.parseFragment(??)\nxml.dom.expatbuilder.parseFragmentString(??)\nxml.dom.expatbuilder.parseString(??)\nxml.dom.expatbuilder.theDOMImplementation\nxml.dom.expatbuilder.xmlbuilder\nxml.dom.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxml.dom.minicompat\nxml.dom.minicompat.EmptyNodeList\nxml.dom.minicompat.NodeList\nxml.dom.minicompat.StringTypes\nxml.dom.minicompat.defproperty(??)\nxml.dom.minicompat.xml\nxml.dom.minidom\nxml.dom.minidom.Attr(??)\nxml.dom.minidom.AttributeList\nxml.dom.minidom.CDATASection(??)\nxml.dom.minidom.CharacterData(??)\nxml.dom.minidom.Childless(??)\nxml.dom.minidom.Comment(??)\nxml.dom.minidom.DOMImplementation(??)\nxml.dom.minidom.DOMImplementationLS(??)\nxml.dom.minidom.Document(??)\nxml.dom.minidom.DocumentFragment(??)\nxml.dom.minidom.DocumentLS(??)\nxml.dom.minidom.DocumentType(??)\nxml.dom.minidom.EMPTY_NAMESPACE\nxml.dom.minidom.EMPTY_PREFIX\nxml.dom.minidom.Element(??)\nxml.dom.minidom.ElementInfo\nxml.dom.minidom.EmptyNodeList\nxml.dom.minidom.Entity(??)\nxml.dom.minidom.Identified(??)\nxml.dom.minidom.NamedNodeMap\nxml.dom.minidom.Node(??)\nxml.dom.minidom.NodeList\nxml.dom.minidom.Notation(??)\nxml.dom.minidom.ProcessingInstruction(??)\nxml.dom.minidom.ReadOnlySequentialNamedNodeMap\nxml.dom.minidom.StringTypes\nxml.dom.minidom.Text(??)\nxml.dom.minidom.TypeInfo\nxml.dom.minidom.XMLNS_NAMESPACE\nxml.dom.minidom.defproperty(??)\nxml.dom.minidom.domreg\nxml.dom.minidom.getDOMImplementation(??)\nxml.dom.minidom.parse(??)\nxml.dom.minidom.parseString(??)\nxml.dom.minidom.xml\nxml.dom.pulldom\nxml.dom.pulldom.CHARACTERS\nxml.dom.pulldom.COMMENT\nxml.dom.pulldom.DOMEventStream(??)\nxml.dom.pulldom.END_DOCUMENT\nxml.dom.pulldom.END_ELEMENT\nxml.dom.pulldom.ErrorHandler(??)\nxml.dom.pulldom.IGNORABLE_WHITESPACE\nxml.dom.pulldom.PROCESSING_INSTRUCTION\nxml.dom.pulldom.PullDOM(??)\nxml.dom.pulldom.SAX2DOM(??)\nxml.dom.pulldom.START_DOCUMENT\nxml.dom.pulldom.START_ELEMENT\nxml.dom.pulldom.default_bufsize\nxml.dom.pulldom.parse(??)\nxml.dom.pulldom.parseString(??)\nxml.dom.pulldom.types\nxml.dom.pulldom.xml\nxml.dom.registerDOMImplementation(name, factory)\nxml.dom.xmlbuilder\nxml.dom.xmlbuilder.DOMBuilder(??)\nxml.dom.xmlbuilder.DOMBuilderFilter(??)\nxml.dom.xmlbuilder.DOMEntityResolver\nxml.dom.xmlbuilder.DOMImplementationLS(??)\nxml.dom.xmlbuilder.DOMInputSource\nxml.dom.xmlbuilder.DocumentLS(??)\nxml.dom.xmlbuilder.Options(??)\nxml.dom.xmlbuilder.copy\nxml.dom.xmlbuilder.xml\nxml.etree\nxml.etree.ElementInclude\nxml.etree.ElementInclude.ElementTree\nxml.etree.ElementInclude.FatalIncludeError\nxml.etree.ElementInclude.XINCLUDE\nxml.etree.ElementInclude.XINCLUDE_FALLBACK\nxml.etree.ElementInclude.XINCLUDE_INCLUDE\nxml.etree.ElementInclude.copy\nxml.etree.ElementInclude.default_loader(??)\nxml.etree.ElementInclude.include(??)\nxml.etree.ElementPath\nxml.etree.ElementPath.find(??)\nxml.etree.ElementPath.findall(??)\nxml.etree.ElementPath.findtext(??)\nxml.etree.ElementPath.get_parent_map(??)\nxml.etree.ElementPath.iterfind(??)\nxml.etree.ElementPath.ops\nxml.etree.ElementPath.prepare_child(??)\nxml.etree.ElementPath.prepare_descendant(??)\nxml.etree.ElementPath.prepare_parent(??)\nxml.etree.ElementPath.prepare_predicate(??)\nxml.etree.ElementPath.prepare_self(??)\nxml.etree.ElementPath.prepare_star(??)\nxml.etree.ElementPath.re\nxml.etree.ElementPath.xpath_tokenizer(??)\nxml.etree.ElementPath.xpath_tokenizer_re\nxml.etree.ElementTree\nxml.etree.ElementTree.Comment(??)\nxml.etree.ElementTree.Element\nxml.etree.ElementTree.ElementPath\nxml.etree.ElementTree.ElementTree\nxml.etree.ElementTree.HTML_EMPTY\nxml.etree.ElementTree.PI(??)\nxml.etree.ElementTree.ParseError\nxml.etree.ElementTree.ProcessingInstruction(??)\nxml.etree.ElementTree.QName\nxml.etree.ElementTree.SubElement(??)\nxml.etree.ElementTree.TreeBuilder\nxml.etree.ElementTree.VERSION\nxml.etree.ElementTree.XML(??)\nxml.etree.ElementTree.XMLID(??)\nxml.etree.ElementTree.XMLParser\nxml.etree.ElementTree.XMLTreeBuilder\nxml.etree.ElementTree.dump(??)\nxml.etree.ElementTree.fromstring(??)\nxml.etree.ElementTree.fromstringlist(??)\nxml.etree.ElementTree.iselement(??)\nxml.etree.ElementTree.iterparse(??)\nxml.etree.ElementTree.parse(??)\nxml.etree.ElementTree.re\nxml.etree.ElementTree.register_namespace(??)\nxml.etree.ElementTree.sys\nxml.etree.ElementTree.tostring(??)\nxml.etree.ElementTree.tostringlist(??)\nxml.etree.ElementTree.warnings\nxml.etree.cElementTree\nxml.etree.cElementTree.Comment\nxml.etree.cElementTree.Element\nxml.etree.cElementTree.ElementPath\nxml.etree.cElementTree.ElementTree\nxml.etree.cElementTree.PI\nxml.etree.cElementTree.ParseError\nxml.etree.cElementTree.ProcessingInstruction\nxml.etree.cElementTree.QName\nxml.etree.cElementTree.SubElement\nxml.etree.cElementTree.TreeBuilder\nxml.etree.cElementTree.VERSION\nxml.etree.cElementTree.XML(??)\nxml.etree.cElementTree.XMLID(??)\nxml.etree.cElementTree.XMLParser\nxml.etree.cElementTree.XMLTreeBuilder\nxml.etree.cElementTree.dump(??)\nxml.etree.cElementTree.fromstring(??)\nxml.etree.cElementTree.fromstringlist(??)\nxml.etree.cElementTree.iselement(??)\nxml.etree.cElementTree.iterparse\nxml.etree.cElementTree.parse(??)\nxml.etree.cElementTree.register_namespace(??)\nxml.etree.cElementTree.tostring(??)\nxml.etree.cElementTree.tostringlist(??)\nxml.parsers\nxml.parsers.expat\nxml.parsers.expat.EXPAT_VERSION\nxml.parsers.expat.ErrorString(errno) -> string\nxml.parsers.expat.ExpatError\nxml.parsers.expat.ParserCreate([encoding[, namespace_separator]]) -> parser\nxml.parsers.expat.XMLParserType\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_ALWAYS\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_NEVER\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE\nxml.parsers.expat.error\nxml.parsers.expat.errors\nxml.parsers.expat.expat_CAPI\nxml.parsers.expat.features\nxml.parsers.expat.model\nxml.parsers.expat.native_encoding\nxml.parsers.expat.version_info\nxml.sax\nxml.sax.ContentHandler(??)\nxml.sax.ErrorHandler(??)\nxml.sax.InputSource(??)\nxml.sax.SAXException\nxml.sax.SAXNotRecognizedException\nxml.sax.SAXNotSupportedException\nxml.sax.SAXParseException\nxml.sax.SAXReaderNotAvailable\nxml.sax.default_parser_list\nxml.sax.expatreader\nxml.sax.expatreader.AttributesImpl(??)\nxml.sax.expatreader.AttributesNSImpl(??)\nxml.sax.expatreader.ExpatLocator(??)\nxml.sax.expatreader.ExpatParser(??)\nxml.sax.expatreader.SAXException\nxml.sax.expatreader.SAXNotRecognizedException\nxml.sax.expatreader.SAXNotSupportedException\nxml.sax.expatreader.SAXParseException\nxml.sax.expatreader.SAXReaderNotAvailable\nxml.sax.expatreader.create_parser(??)\nxml.sax.expatreader.expat\nxml.sax.expatreader.feature_external_ges\nxml.sax.expatreader.feature_external_pes\nxml.sax.expatreader.feature_namespace_prefixes\nxml.sax.expatreader.feature_namespaces\nxml.sax.expatreader.feature_string_interning\nxml.sax.expatreader.feature_validation\nxml.sax.expatreader.handler\nxml.sax.expatreader.property_interning_dict\nxml.sax.expatreader.property_xml_string\nxml.sax.expatreader.saxutils\nxml.sax.expatreader.version\nxml.sax.expatreader.xmlreader\nxml.sax.handler\nxml.sax.handler.ContentHandler(??)\nxml.sax.handler.DTDHandler(??)\nxml.sax.handler.EntityResolver(??)\nxml.sax.handler.ErrorHandler(??)\nxml.sax.handler.all_features\nxml.sax.handler.all_properties\nxml.sax.handler.feature_external_ges\nxml.sax.handler.feature_external_pes\nxml.sax.handler.feature_namespace_prefixes\nxml.sax.handler.feature_namespaces\nxml.sax.handler.feature_string_interning\nxml.sax.handler.feature_validation\nxml.sax.handler.property_declaration_handler\nxml.sax.handler.property_dom_node\nxml.sax.handler.property_encoding\nxml.sax.handler.property_interning_dict\nxml.sax.handler.property_lexical_handler\nxml.sax.handler.property_xml_string\nxml.sax.handler.version\nxml.sax.make_parser(??)\nxml.sax.parse(??)\nxml.sax.parseString(??)\nxml.sax.saxutils\nxml.sax.saxutils.XMLFilterBase(??)\nxml.sax.saxutils.XMLGenerator(??)\nxml.sax.saxutils.escape(??)\nxml.sax.saxutils.handler\nxml.sax.saxutils.os\nxml.sax.saxutils.prepare_input_source(??)\nxml.sax.saxutils.quoteattr(??)\nxml.sax.saxutils.types\nxml.sax.saxutils.unescape(??)\nxml.sax.saxutils.urllib\nxml.sax.saxutils.urlparse\nxml.sax.saxutils.xmlreader\nxml.sax.xmlreader\nxml.sax.xmlreader.AttributesImpl(??)\nxml.sax.xmlreader.AttributesNSImpl(??)\nxml.sax.xmlreader.IncrementalParser(??)\nxml.sax.xmlreader.InputSource(??)\nxml.sax.xmlreader.Locator(??)\nxml.sax.xmlreader.SAXNotRecognizedException\nxml.sax.xmlreader.SAXNotSupportedException\nxml.sax.xmlreader.XMLReader(??)\nxml.sax.xmlreader.handler\nxmllib.Error\nxmllib.TestXMLParser(??)\nxmllib.XMLParser(??)\nxmllib.amp\nxmllib.attrfind\nxmllib.attrtrans\nxmllib.cdataclose\nxmllib.cdataopen\nxmllib.charref\nxmllib.commentclose\nxmllib.commentopen\nxmllib.doctype\nxmllib.doubledash\nxmllib.endbracket\nxmllib.endbracketfind\nxmllib.endtagopen\nxmllib.entityref\nxmllib.illegal\nxmllib.interesting\nxmllib.ncname\nxmllib.newline\nxmllib.procclose\nxmllib.procopen\nxmllib.qname\nxmllib.re\nxmllib.ref\nxmllib.space\nxmllib.starttagend\nxmllib.starttagmatch\nxmllib.starttagopen\nxmllib.string\nxmllib.tagfind\nxmllib.test(??)\nxmllib.version\nxmllib.xmldecl\nxmllib.xmlns\nxmlrpclib.APPLICATION_ERROR\nxmlrpclib.Binary(??)\nxmlrpclib.Boolean\nxmlrpclib.BooleanType\nxmlrpclib.BufferType\nxmlrpclib.BuiltinFunctionType\nxmlrpclib.BuiltinMethodType\nxmlrpclib.ClassType\nxmlrpclib.CodeType\nxmlrpclib.ComplexType\nxmlrpclib.DateTime(??)\nxmlrpclib.DictProxyType\nxmlrpclib.DictType\nxmlrpclib.DictionaryType\nxmlrpclib.EllipsisType\nxmlrpclib.Error\nxmlrpclib.ExpatParser(??)\nxmlrpclib.False\nxmlrpclib.FastMarshaller\nxmlrpclib.FastParser\nxmlrpclib.FastUnmarshaller\nxmlrpclib.Fault\nxmlrpclib.FileType\nxmlrpclib.FloatType\nxmlrpclib.FrameType\nxmlrpclib.FunctionType\nxmlrpclib.GeneratorType\nxmlrpclib.GetSetDescriptorType\nxmlrpclib.GzipDecodedResponse\nxmlrpclib.INTERNAL_ERROR\nxmlrpclib.INVALID_ENCODING_CHAR\nxmlrpclib.INVALID_METHOD_PARAMS\nxmlrpclib.INVALID_XMLRPC\nxmlrpclib.InstanceType\nxmlrpclib.IntType\nxmlrpclib.LambdaType\nxmlrpclib.ListType\nxmlrpclib.LongType\nxmlrpclib.MAXINT\nxmlrpclib.METHOD_NOT_FOUND\nxmlrpclib.MININT\nxmlrpclib.Marshaller(??)\nxmlrpclib.MemberDescriptorType\nxmlrpclib.MethodType\nxmlrpclib.ModuleType\nxmlrpclib.MultiCall(??)\nxmlrpclib.MultiCallIterator(??)\nxmlrpclib.NOT_WELLFORMED_ERROR\nxmlrpclib.NoneType\nxmlrpclib.NotImplementedType\nxmlrpclib.ObjectType\nxmlrpclib.PARSE_ERROR\nxmlrpclib.ProtocolError\nxmlrpclib.ResponseError\nxmlrpclib.SERVER_ERROR\nxmlrpclib.SYSTEM_ERROR\nxmlrpclib.SafeTransport(??)\nxmlrpclib.Server(??)\nxmlrpclib.ServerProxy(??)\nxmlrpclib.SliceType\nxmlrpclib.SlowParser(??)\nxmlrpclib.StringIO\nxmlrpclib.StringType\nxmlrpclib.StringTypes\nxmlrpclib.TRANSPORT_ERROR\nxmlrpclib.TracebackType\nxmlrpclib.Transport(??)\nxmlrpclib.True\nxmlrpclib.TupleType\nxmlrpclib.TypeType\nxmlrpclib.UNSUPPORTED_ENCODING\nxmlrpclib.UnboundMethodType\nxmlrpclib.UnicodeType\nxmlrpclib.Unmarshaller(??)\nxmlrpclib.WRAPPERS\nxmlrpclib.XRangeType\nxmlrpclib.base64\nxmlrpclib.boolean\nxmlrpclib.datetime\nxmlrpclib.dumps(??)\nxmlrpclib.errno\nxmlrpclib.escape(??)\nxmlrpclib.expat\nxmlrpclib.getparser() -> parser, unmarshaller\nxmlrpclib.gzip\nxmlrpclib.gzip_decode(??)\nxmlrpclib.gzip_encode(??)\nxmlrpclib.httplib\nxmlrpclib.loads(??)\nxmlrpclib.operator\nxmlrpclib.re\nxmlrpclib.socket\nxmlrpclib.string\nxmlrpclib.time\nxrange([start,] stop[, step]) -> xrange object\nxxsubtype.bench\nxxsubtype.spamdict\nxxsubtype.spamlist\nzip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\nzipfile.BadZipfile\nzipfile.LargeZipFile\nzipfile.PyZipFile(??)\nzipfile.ZIP64_LIMIT\nzipfile.ZIP_DEFLATED\nzipfile.ZIP_FILECOUNT_LIMIT\nzipfile.ZIP_MAX_COMMENT\nzipfile.ZIP_STORED\nzipfile.ZipExtFile\nzipfile.ZipFile(??)\nzipfile.ZipInfo\nzipfile.binascii\nzipfile.cStringIO\nzipfile.crc32(string[, start]) -- Compute a CRC-32 checksum of string.\nzipfile.error\nzipfile.io\nzipfile.is_zipfile(??)\nzipfile.main(??)\nzipfile.os\nzipfile.re\nzipfile.shutil\nzipfile.sizeCentralDir\nzipfile.sizeEndCentDir\nzipfile.sizeEndCentDir64\nzipfile.sizeEndCentDir64Locator\nzipfile.sizeFileHeader\nzipfile.stat\nzipfile.stringCentralDir\nzipfile.stringEndArchive\nzipfile.stringEndArchive64\nzipfile.stringEndArchive64Locator\nzipfile.stringFileHeader\nzipfile.struct\nzipfile.structCentralDir\nzipfile.structEndArchive\nzipfile.structEndArchive64\nzipfile.structEndArchive64Locator\nzipfile.structFileHeader\nzipfile.sys\nzipfile.time\nzipfile.zlib\nzipimport.ZipImportError\nzipimport.zipimporter(archivepath) -> zipimporter object\nzlib.DEFLATED\nzlib.DEF_MEM_LEVEL\nzlib.MAX_WBITS\nzlib.ZLIB_VERSION\nzlib.Z_BEST_COMPRESSION\nzlib.Z_BEST_SPEED\nzlib.Z_DEFAULT_COMPRESSION\nzlib.Z_DEFAULT_STRATEGY\nzlib.Z_FILTERED\nzlib.Z_FINISH\nzlib.Z_FULL_FLUSH\nzlib.Z_HUFFMAN_ONLY\nzlib.Z_NO_FLUSH\nzlib.Z_SYNC_FLUSH\nzlib.adler32(string[, start]) -- Compute an Adler-32 checksum of string.\nzlib.compress(string[, level]) -- Returned compressed string.\nzlib.compressobj([level]) -- Return a compressor object.\nzlib.crc32(string[, start]) -- Compute a CRC-32 checksum of string.\nzlib.decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\nzlib.decompressobj([wbits]) -- Return a decompressor object.\nzlib.error\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/qsci/api/python/Python-3.1.api",
    "content": "ArithmeticError(??)\nAssertionError(??)\nAttributeError(??)\nBaseException(??)\nBufferError(??)\nBytesWarning(??)\nDeprecationWarning(??)\nEOFError(??)\nEllipsis(??)\nEnvironmentError(??)\nException(??)\nFalse(??)\nFloatingPointError(??)\nFutureWarning(??)\nGeneratorExit(??)\nIOError(??)\nImportError(??)\nImportWarning(??)\nIndentationError(??)\nIndexError(??)\nKeyError(??)\nKeyboardInterrupt(??)\nLookupError(??)\nMemoryError(??)\nNameError(??)\nNone(??)\nNotImplemented(??)\nNotImplementedError(??)\nOSError(??)\nOverflowError(??)\nPendingDeprecationWarning(??)\nReferenceError(??)\nRuntimeError(??)\nRuntimeWarning(??)\nStopIteration(??)\nSyntaxError(??)\nSyntaxWarning(??)\nSystemError(??)\nSystemExit(??)\nTabError(??)\nTrue(??)\nTypeError(??)\nUnboundLocalError(??)\nUnicodeDecodeError(??)\nUnicodeEncodeError(??)\nUnicodeError(??)\nUnicodeTranslateError(??)\nUnicodeWarning(??)\nUserWarning(??)\nValueError(??)\nWarning(??)\nZeroDivisionError(??)\nabc.ABCMeta(??)\nabc.WeakSet(??)\nabc.abstractmethod(??)\nabc.abstractproperty(??)\nabs(number) -> number\naifc.Aifc_read(??)\naifc.Aifc_write(??)\naifc.Chunk(??)\naifc.Error(??)\naifc.builtins(??)\naifc.open(??)\naifc.openfp(??)\naifc.struct(??)\nall(iterable) -> bool\nany(iterable) -> bool\narray.ArrayType(??)\narray.array(typecode [, initializer]) -> array\narray.typecodes\nascii(object) -> string\nast.AST(??)\nast.Add(??)\nast.And(??)\nast.Assert(??)\nast.Assign(??)\nast.Attribute(??)\nast.AugAssign(??)\nast.AugLoad(??)\nast.AugStore(??)\nast.BinOp(??)\nast.BitAnd(??)\nast.BitOr(??)\nast.BitXor(??)\nast.BoolOp(??)\nast.Break(??)\nast.Bytes(??)\nast.Call(??)\nast.ClassDef(??)\nast.Compare(??)\nast.Continue(??)\nast.Del(??)\nast.Delete(??)\nast.Dict(??)\nast.DictComp(??)\nast.Div(??)\nast.Ellipsis(??)\nast.Eq(??)\nast.ExceptHandler(??)\nast.Expr(??)\nast.Expression(??)\nast.ExtSlice(??)\nast.FloorDiv(??)\nast.For(??)\nast.FunctionDef(??)\nast.GeneratorExp(??)\nast.Global(??)\nast.Gt(??)\nast.GtE(??)\nast.If(??)\nast.IfExp(??)\nast.Import(??)\nast.ImportFrom(??)\nast.In(??)\nast.Index(??)\nast.Interactive(??)\nast.Invert(??)\nast.Is(??)\nast.IsNot(??)\nast.LShift(??)\nast.Lambda(??)\nast.List(??)\nast.ListComp(??)\nast.Load(??)\nast.Lt(??)\nast.LtE(??)\nast.Mod(??)\nast.Module(??)\nast.Mult(??)\nast.Name(??)\nast.NodeTransformer(??)\nast.NodeVisitor(??)\nast.Nonlocal(??)\nast.Not(??)\nast.NotEq(??)\nast.NotIn(??)\nast.Num(??)\nast.Or(??)\nast.Param(??)\nast.Pass(??)\nast.Pow(??)\nast.PyCF_ONLY_AST\nast.RShift(??)\nast.Raise(??)\nast.Return(??)\nast.Set(??)\nast.SetComp(??)\nast.Slice(??)\nast.Starred(??)\nast.Store(??)\nast.Str(??)\nast.Sub(??)\nast.Subscript(??)\nast.Suite(??)\nast.TryExcept(??)\nast.TryFinally(??)\nast.Tuple(??)\nast.UAdd(??)\nast.USub(??)\nast.UnaryOp(??)\nast.While(??)\nast.With(??)\nast.Yield(??)\nast.alias(??)\nast.arg(??)\nast.arguments(??)\nast.boolop(??)\nast.cmpop(??)\nast.comprehension(??)\nast.copy_location(??)\nast.dump(??)\nast.excepthandler(??)\nast.expr(??)\nast.expr_context(??)\nast.fix_missing_locations(??)\nast.get_docstring(??)\nast.increment_lineno(??)\nast.iter_child_nodes(??)\nast.iter_fields(??)\nast.keyword(??)\nast.literal_eval(??)\nast.mod(??)\nast.operator(??)\nast.parse(??)\nast.slice(??)\nast.stmt(??)\nast.unaryop(??)\nast.walk(??)\nasynchat.async_chat(??)\nasynchat.asyncore(??)\nasynchat.buffer(??)\nasynchat.deque(iterable[, maxlen]) --> deque object\nasynchat.fifo(??)\nasynchat.find_prefix_at_end(??)\nasynchat.simple_producer(??)\nasynchat.socket(??)\nasyncore.EALREADY\nasyncore.EBADF\nasyncore.ECONNABORTED\nasyncore.ECONNRESET\nasyncore.EINPROGRESS\nasyncore.EINTR\nasyncore.EISCONN\nasyncore.ENOTCONN\nasyncore.ESHUTDOWN\nasyncore.EWOULDBLOCK\nasyncore.ExitNow(??)\nasyncore.close_all(??)\nasyncore.compact_traceback(??)\nasyncore.dispatcher(??)\nasyncore.dispatcher_with_send(??)\nasyncore.errorcode(??)\nasyncore.fcntl(??)\nasyncore.file_dispatcher(??)\nasyncore.file_wrapper(??)\nasyncore.loop(??)\nasyncore.os(??)\nasyncore.poll(??)\nasyncore.poll2(??)\nasyncore.poll3(??)\nasyncore.read(??)\nasyncore.readwrite(??)\nasyncore.select(??)\nasyncore.socket(??)\nasyncore.socket_map(??)\nasyncore.sys(??)\nasyncore.time(??)\nasyncore.write(??)\natexit.register(func, *args, **kwargs) -> func\natexit.unregister(func) -> None\naudioop.add(??)\naudioop.adpcm2lin(??)\naudioop.alaw2lin(??)\naudioop.avg(??)\naudioop.avgpp(??)\naudioop.bias(??)\naudioop.cross(??)\naudioop.error(??)\naudioop.findfactor(??)\naudioop.findfit(??)\naudioop.findmax(??)\naudioop.getsample(??)\naudioop.lin2adpcm(??)\naudioop.lin2alaw(??)\naudioop.lin2lin(??)\naudioop.lin2ulaw(??)\naudioop.max(??)\naudioop.maxpp(??)\naudioop.minmax(??)\naudioop.mul(??)\naudioop.ratecv(??)\naudioop.reverse(??)\naudioop.rms(??)\naudioop.tomono(??)\naudioop.tostereo(??)\naudioop.ulaw2lin(??)\nbase64.MAXBINSIZE\nbase64.MAXLINESIZE\nbase64.b16decode(??)\nbase64.b16encode(??)\nbase64.b32decode(??)\nbase64.b32encode(??)\nbase64.b64decode(??)\nbase64.b64encode(??)\nbase64.binascii(??)\nbase64.bytes_types(??)\nbase64.decode(??)\nbase64.decodebytes(??)\nbase64.decodestring(??)\nbase64.encode(??)\nbase64.encodebytes(??)\nbase64.encodestring(??)\nbase64.main(??)\nbase64.re(??)\nbase64.standard_b64decode(??)\nbase64.standard_b64encode(??)\nbase64.struct(??)\nbase64.test(??)\nbase64.urlsafe_b64decode(??)\nbase64.urlsafe_b64encode(??)\nbdb.Bdb(??)\nbdb.BdbQuit(??)\nbdb.Breakpoint(??)\nbdb.Tdb(??)\nbdb.bar(??)\nbdb.checkfuncname(??)\nbdb.effective(??)\nbdb.fnmatch(??)\nbdb.foo(??)\nbdb.os(??)\nbdb.set_trace(??)\nbdb.sys(??)\nbdb.test(??)\nbdb.types(??)\nbin(number) -> string\nbinascii.Error(??)\nbinascii.Incomplete(??)\nbinascii.a2b_base64(??)\nbinascii.a2b_hex(hexstr) -> s; Binary data of hexadecimal representation.\nbinascii.a2b_hqx(??)\nbinascii.a2b_qp(??)\nbinascii.a2b_uu(??)\nbinascii.b2a_base64(??)\nbinascii.b2a_hex(data) -> s; Hexadecimal representation of binary data.\nbinascii.b2a_hqx(??)\nbinascii.b2a_qp(data, quotetabs=0, istext=1, header=0) -> s;\nbinascii.b2a_uu(??)\nbinascii.crc32(??)\nbinascii.crc_hqx(??)\nbinascii.hexlify(??)\nbinascii.rlecode_hqx(??)\nbinascii.rledecode_hqx(??)\nbinascii.unhexlify(??)\nbinhex.BinHex(??)\nbinhex.Error(??)\nbinhex.FInfo(??)\nbinhex.HexBin(??)\nbinhex.LINELEN\nbinhex.REASONABLY_LARGE\nbinhex.RUNCHAR\nbinhex.binascii(??)\nbinhex.binhex(infilename, outfilename): create binhex-encoded copy of a file\nbinhex.getfileinfo(??)\nbinhex.hexbin(infilename, outfilename) - Decode binhexed file\nbinhex.io(??)\nbinhex.openrsrc(??)\nbinhex.os(??)\nbinhex.struct(??)\nbinhex.sys(??)\nbisect.bisect(??)\nbisect.bisect_left(a, x[, lo[, hi]]) -> index\nbisect.bisect_right(a, x[, lo[, hi]]) -> index\nbisect.insort(??)\nbisect.insort_left(a, x[, lo[, hi]])\nbisect.insort_right(a, x[, lo[, hi]])\nbool(x) -> bool\nbuiltins.ArithmeticError(??)\nbuiltins.AssertionError(??)\nbuiltins.AttributeError(??)\nbuiltins.BaseException(??)\nbuiltins.BufferError(??)\nbuiltins.BytesWarning(??)\nbuiltins.DeprecationWarning(??)\nbuiltins.EOFError(??)\nbuiltins.Ellipsis(??)\nbuiltins.EnvironmentError(??)\nbuiltins.Exception(??)\nbuiltins.False\nbuiltins.FloatingPointError(??)\nbuiltins.FutureWarning(??)\nbuiltins.GeneratorExit(??)\nbuiltins.IOError(??)\nbuiltins.ImportError(??)\nbuiltins.ImportWarning(??)\nbuiltins.IndentationError(??)\nbuiltins.IndexError(??)\nbuiltins.KeyError(??)\nbuiltins.KeyboardInterrupt(??)\nbuiltins.LookupError(??)\nbuiltins.MemoryError(??)\nbuiltins.NameError(??)\nbuiltins.None\nbuiltins.NotImplemented(??)\nbuiltins.NotImplementedError(??)\nbuiltins.OSError(??)\nbuiltins.OverflowError(??)\nbuiltins.PendingDeprecationWarning(??)\nbuiltins.ReferenceError(??)\nbuiltins.RuntimeError(??)\nbuiltins.RuntimeWarning(??)\nbuiltins.StopIteration(??)\nbuiltins.SyntaxError(??)\nbuiltins.SyntaxWarning(??)\nbuiltins.SystemError(??)\nbuiltins.SystemExit(??)\nbuiltins.TabError(??)\nbuiltins.True\nbuiltins.TypeError(??)\nbuiltins.UnboundLocalError(??)\nbuiltins.UnicodeDecodeError(??)\nbuiltins.UnicodeEncodeError(??)\nbuiltins.UnicodeError(??)\nbuiltins.UnicodeTranslateError(??)\nbuiltins.UnicodeWarning(??)\nbuiltins.UserWarning(??)\nbuiltins.ValueError(??)\nbuiltins.Warning(??)\nbuiltins.ZeroDivisionError(??)\nbuiltins.abs(number) -> number\nbuiltins.all(iterable) -> bool\nbuiltins.any(iterable) -> bool\nbuiltins.ascii(object) -> string\nbuiltins.bin(number) -> string\nbuiltins.bool(x) -> bool\nbuiltins.bytearray(iterable_of_ints) -> bytearray\nbuiltins.bytes(iterable_of_ints) -> bytes\nbuiltins.chr(i) -> Unicode character\nbuiltins.classmethod(function) -> method\nbuiltins.compile(source, filename, mode[, flags[, dont_inherit]]) -> code object\nbuiltins.complex(real[, imag]) -> complex number\nbuiltins.copyright(??)\nbuiltins.credits(??)\nbuiltins.delattr(object, name)\nbuiltins.dict() -> new empty dictionary.\nbuiltins.dir([object]) -> list of strings\nbuiltins.divmod(x, y) -> (div, mod)\nbuiltins.enumerate(iterable) -> iterator for index, value of iterable\nbuiltins.eval(source[, globals[, locals]]) -> value\nbuiltins.exec(object[, globals[, locals]])\nbuiltins.exit(??)\nbuiltins.filter(function or None, iterable) --> filter object\nbuiltins.float(x) -> floating point number\nbuiltins.format(value[, format_spec]) -> string\nbuiltins.frozenset(iterable) --> frozenset object\nbuiltins.getattr(object, name[, default]) -> value\nbuiltins.globals() -> dictionary\nbuiltins.hasattr(object, name) -> bool\nbuiltins.hash(object) -> integer\nbuiltins.help(??)\nbuiltins.hex(number) -> string\nbuiltins.id(object) -> integer\nbuiltins.input([prompt]) -> string\nbuiltins.int(x[, base]) -> integer\nbuiltins.isinstance(object, class-or-type-or-tuple) -> bool\nbuiltins.issubclass(C, B) -> bool\nbuiltins.iter(iterable) -> iterator\nbuiltins.len(object) -> integer\nbuiltins.license(??)\nbuiltins.list() -> new list\nbuiltins.locals() -> dictionary\nbuiltins.map(func, *iterables) --> map object\nbuiltins.max(iterable[, key=func]) -> value\nbuiltins.memoryview(object)\nbuiltins.min(iterable[, key=func]) -> value\nbuiltins.next(iterator[, default])\nbuiltins.object(??)\nbuiltins.oct(number) -> string\nbuiltins.open(??)\nbuiltins.ord(c) -> integer\nbuiltins.pow(x, y[, z]) -> number\nbuiltins.print(value, ..., sep=' ', end='\\n', file=sys.stdout)\nbuiltins.property(fget=None, fset=None, fdel=None, doc=None) -> property attribute\nbuiltins.quit(??)\nbuiltins.range([start,] stop[, step]) -> range object\nbuiltins.repr(object) -> string\nbuiltins.reversed(sequence) -> reverse iterator over values of the sequence\nbuiltins.round(number[, ndigits]) -> number\nbuiltins.set(iterable) --> set object\nbuiltins.setattr(object, name, value)\nbuiltins.slice([start,] stop[, step])\nbuiltins.sorted(iterable, key=None, reverse=False) --> new sorted list\nbuiltins.staticmethod(function) -> method\nbuiltins.str(string[, encoding[, errors]]) -> str\nbuiltins.sum(iterable[, start]) -> value\nbuiltins.super() -> same as super(__class__, <first argument>)\nbuiltins.tuple() -> an empty tuple\nbuiltins.type(object) -> the object's type\nbuiltins.vars([object]) -> dictionary\nbuiltins.zip(iter1 [,iter2 [...]]) --> zip object\nbytearray(iterable_of_ints) -> bytearray\nbytes(iterable_of_ints) -> bytes\nbz2.BZ2Compressor([compresslevel=9]) -> compressor object\nbz2.BZ2Decompressor() -> decompressor object\nbz2.BZ2File(name [, mode='r', buffering=0, compresslevel=9]) -> file object\nbz2.compress(data [, compresslevel=9]) -> string\nbz2.decompress(data) -> decompressed data\ncProfile.Profile(custom_timer=None, time_unit=None, subcalls=True, builtins=True)\ncProfile.help(??)\ncProfile.label(??)\ncProfile.main(??)\ncProfile.run(??)\ncProfile.runctx(??)\ncalendar.Calendar(??)\ncalendar.EPOCH\ncalendar.FRIDAY\ncalendar.February\ncalendar.HTMLCalendar(??)\ncalendar.IllegalMonthError(??)\ncalendar.IllegalWeekdayError(??)\ncalendar.January\ncalendar.LocaleHTMLCalendar(??)\ncalendar.LocaleTextCalendar(??)\ncalendar.MONDAY\ncalendar.SATURDAY\ncalendar.SUNDAY\ncalendar.THURSDAY\ncalendar.TUESDAY\ncalendar.TextCalendar(??)\ncalendar.WEDNESDAY\ncalendar.c(??)\ncalendar.calendar(??)\ncalendar.datetime(??)\ncalendar.day_abbr(??)\ncalendar.day_name(??)\ncalendar.different_locale(??)\ncalendar.error(??)\ncalendar.firstweekday(??)\ncalendar.format(??)\ncalendar.formatstring(??)\ncalendar.isleap(??)\ncalendar.leapdays(??)\ncalendar.main(??)\ncalendar.mdays(??)\ncalendar.month(??)\ncalendar.month_abbr(??)\ncalendar.month_name(??)\ncalendar.monthcalendar(??)\ncalendar.monthrange(??)\ncalendar.prcal(??)\ncalendar.prmonth(??)\ncalendar.prweek(??)\ncalendar.setfirstweekday(??)\ncalendar.sys(??)\ncalendar.timegm(??)\ncalendar.week(??)\ncalendar.weekday(??)\ncalendar.weekheader(??)\ncgi.FieldStorage(??)\ncgi.MiniFieldStorage(??)\ncgi.StringIO(??)\ncgi.attrgetter(attr, ...) --> attrgetter object\ncgi.dolog(??)\ncgi.email(??)\ncgi.escape(??)\ncgi.initlog(??)\ncgi.log(??)\ncgi.logfile\ncgi.logfp(??)\ncgi.maxlen\ncgi.nolog(??)\ncgi.os(??)\ncgi.parse(??)\ncgi.parse_header(??)\ncgi.parse_multipart(??)\ncgi.parse_qs(??)\ncgi.parse_qsl(??)\ncgi.print_arguments(??)\ncgi.print_directory(??)\ncgi.print_environ(??)\ncgi.print_environ_usage(??)\ncgi.print_exception(??)\ncgi.print_form(??)\ncgi.sys(??)\ncgi.test(??)\ncgi.urllib(??)\ncgi.valid_boundary(??)\ncgi.warn(??)\ncgitb.Hook(??)\ncgitb.enable(??)\ncgitb.grey(??)\ncgitb.handler(??)\ncgitb.html(??)\ncgitb.inspect(??)\ncgitb.keyword(??)\ncgitb.linecache(??)\ncgitb.lookup(??)\ncgitb.os(??)\ncgitb.pydoc(??)\ncgitb.reset(??)\ncgitb.scanvars(??)\ncgitb.small(??)\ncgitb.strong(??)\ncgitb.sys(??)\ncgitb.tempfile(??)\ncgitb.text(??)\ncgitb.time(??)\ncgitb.tokenize(??)\ncgitb.traceback(??)\ncgitb.types(??)\nchr(i) -> Unicode character\nchunk.Chunk(??)\nclassmethod(function) -> method\ncmath.acos(x)\ncmath.acosh(x)\ncmath.asin(x)\ncmath.asinh(x)\ncmath.atan(x)\ncmath.atanh(x)\ncmath.cos(x)\ncmath.cosh(x)\ncmath.e\ncmath.exp(x)\ncmath.isinf(z) -> bool\ncmath.isnan(z) -> bool\ncmath.log(x[, base]) -> the logarithm of x to the given base.\ncmath.log10(x)\ncmath.phase(z) -> float\ncmath.pi\ncmath.polar(z) -> r: float, phi: float\ncmath.rect(r, phi) -> z: complex\ncmath.sin(x)\ncmath.sinh(x)\ncmath.sqrt(x)\ncmath.tan(x)\ncmath.tanh(x)\ncmd.Cmd(??)\ncmd.IDENTCHARS\ncmd.PROMPT\ncmd.string(??)\ncmd.sys(??)\ncode.CommandCompiler(??)\ncode.InteractiveConsole(??)\ncode.InteractiveInterpreter(??)\ncode.compile_command(??)\ncode.interact(??)\ncode.sys(??)\ncode.traceback(??)\ncodecs.BOM\ncodecs.BOM32_BE\ncodecs.BOM32_LE\ncodecs.BOM64_BE\ncodecs.BOM64_LE\ncodecs.BOM_BE\ncodecs.BOM_LE\ncodecs.BOM_UTF16\ncodecs.BOM_UTF16_BE\ncodecs.BOM_UTF16_LE\ncodecs.BOM_UTF32\ncodecs.BOM_UTF32_BE\ncodecs.BOM_UTF32_LE\ncodecs.BOM_UTF8\ncodecs.BufferedIncrementalDecoder(??)\ncodecs.BufferedIncrementalEncoder(??)\ncodecs.Codec(??)\ncodecs.CodecInfo(??)\ncodecs.EncodedFile(??)\ncodecs.IncrementalDecoder(??)\ncodecs.IncrementalEncoder(??)\ncodecs.StreamReader(??)\ncodecs.StreamReaderWriter(??)\ncodecs.StreamRecoder(??)\ncodecs.StreamWriter(??)\ncodecs.ascii_decode(??)\ncodecs.ascii_encode(??)\ncodecs.backslashreplace_errors(??)\ncodecs.builtins(??)\ncodecs.charbuffer_encode(??)\ncodecs.charmap_build(??)\ncodecs.charmap_decode(??)\ncodecs.charmap_encode(??)\ncodecs.decode(obj, [encoding[,errors]]) -> object\ncodecs.encode(obj, [encoding[,errors]]) -> object\ncodecs.escape_decode(??)\ncodecs.escape_encode(??)\ncodecs.getdecoder(??)\ncodecs.getencoder(??)\ncodecs.getincrementaldecoder(??)\ncodecs.getincrementalencoder(??)\ncodecs.getreader(??)\ncodecs.getwriter(??)\ncodecs.ignore_errors(??)\ncodecs.iterdecode(??)\ncodecs.iterencode(??)\ncodecs.latin_1_decode(??)\ncodecs.latin_1_encode(??)\ncodecs.lookup(encoding) -> CodecInfo\ncodecs.lookup_error(errors) -> handler\ncodecs.make_encoding_map(??)\ncodecs.make_identity_dict(rng) -> dict\ncodecs.open(??)\ncodecs.raw_unicode_escape_decode(??)\ncodecs.raw_unicode_escape_encode(??)\ncodecs.readbuffer_encode(??)\ncodecs.register(search_function)\ncodecs.register_error(errors, handler)\ncodecs.replace_errors(??)\ncodecs.strict_errors(??)\ncodecs.sys(??)\ncodecs.unicode_escape_decode(??)\ncodecs.unicode_escape_encode(??)\ncodecs.unicode_internal_decode(??)\ncodecs.unicode_internal_encode(??)\ncodecs.utf_16_be_decode(??)\ncodecs.utf_16_be_encode(??)\ncodecs.utf_16_decode(??)\ncodecs.utf_16_encode(??)\ncodecs.utf_16_ex_decode(??)\ncodecs.utf_16_le_decode(??)\ncodecs.utf_16_le_encode(??)\ncodecs.utf_32_be_decode(??)\ncodecs.utf_32_be_encode(??)\ncodecs.utf_32_decode(??)\ncodecs.utf_32_encode(??)\ncodecs.utf_32_ex_decode(??)\ncodecs.utf_32_le_decode(??)\ncodecs.utf_32_le_encode(??)\ncodecs.utf_7_decode(??)\ncodecs.utf_7_encode(??)\ncodecs.utf_8_decode(??)\ncodecs.utf_8_encode(??)\ncodecs.xmlcharrefreplace_errors(??)\ncodeop.CommandCompiler(??)\ncodeop.Compile(??)\ncodeop.PyCF_DONT_IMPLY_DEDENT\ncodeop.compile_command(??)\ncollections.ByteString(??)\ncollections.Callable(??)\ncollections.Container(??)\ncollections.Counter(??)\ncollections.Hashable(??)\ncollections.ItemsView(??)\ncollections.Iterable(??)\ncollections.Iterator(??)\ncollections.KeysView(??)\ncollections.Mapping(??)\ncollections.MappingView(??)\ncollections.MutableMapping(??)\ncollections.MutableSequence(??)\ncollections.MutableSet(??)\ncollections.OrderedDict(??)\ncollections.Sequence(??)\ncollections.Set(??)\ncollections.Sized(??)\ncollections.UserDict(??)\ncollections.UserList(??)\ncollections.UserString(??)\ncollections.ValuesView(??)\ncollections.bytearray_iterator(??)\ncollections.bytes_iterator(??)\ncollections.defaultdict(default_factory) --> dict with default factory\ncollections.deque(iterable[, maxlen]) --> deque object\ncollections.dict_itemiterator(??)\ncollections.dict_items(??)\ncollections.dict_keyiterator(??)\ncollections.dict_keys(??)\ncollections.dict_proxy(??)\ncollections.dict_valueiterator(??)\ncollections.dict_values(??)\ncollections.list_iterator(??)\ncollections.list_reverseiterator(??)\ncollections.namedtuple(??)\ncollections.range_iterator(??)\ncollections.set_iterator(??)\ncollections.str_iterator(??)\ncollections.tuple_iterator(??)\ncollections.zip_iterator(??)\ncolorsys.ONE_SIXTH\ncolorsys.ONE_THIRD\ncolorsys.TWO_THIRD\ncolorsys.hls_to_rgb(??)\ncolorsys.hsv_to_rgb(??)\ncolorsys.rgb_to_hls(??)\ncolorsys.rgb_to_hsv(??)\ncolorsys.rgb_to_yiq(??)\ncolorsys.yiq_to_rgb(??)\ncompile(source, filename, mode[, flags[, dont_inherit]]) -> code object\ncompileall.compile_dir(??)\ncompileall.compile_path(??)\ncompileall.imp(??)\ncompileall.main(??)\ncompileall.os(??)\ncompileall.py_compile(??)\ncompileall.struct(??)\ncompileall.sys(??)\ncomplex(real[, imag]) -> complex number\nconfigparser.ConfigParser(??)\nconfigparser.DEFAULTSECT\nconfigparser.DuplicateSectionError(??)\nconfigparser.Error(??)\nconfigparser.InterpolationDepthError(??)\nconfigparser.InterpolationError(??)\nconfigparser.InterpolationMissingOptionError(??)\nconfigparser.InterpolationSyntaxError(??)\nconfigparser.MAX_INTERPOLATION_DEPTH\nconfigparser.MissingSectionHeaderError(??)\nconfigparser.NoOptionError(??)\nconfigparser.NoSectionError(??)\nconfigparser.ParsingError(??)\nconfigparser.RawConfigParser(??)\nconfigparser.SafeConfigParser(??)\nconfigparser.re(??)\ncontextlib.GeneratorContextManager(??)\ncontextlib.closing(??)\ncontextlib.contextmanager(??)\ncontextlib.nested(??)\ncontextlib.sys(??)\ncontextlib.warn(??)\ncontextlib.wraps(??)\ncopy.Error(??)\ncopy.PyStringMap(??)\ncopy.copy(??)\ncopy.deepcopy(??)\ncopy.dispatch_table(??)\ncopy.error(??)\ncopy.name\ncopy.t(??)\ncopy.weakref(??)\ncopyreg.add_extension(??)\ncopyreg.clear_extension_cache(??)\ncopyreg.constructor(??)\ncopyreg.dispatch_table(??)\ncopyreg.pickle(??)\ncopyreg.pickle_complex(??)\ncopyreg.remove_extension(??)\ncopyright(??)\ncredits(??)\ncrypt.crypt(word, salt) -> string\ncsv.Dialect(??)\ncsv.DictReader(??)\ncsv.DictWriter(??)\ncsv.Error(??)\ncsv.QUOTE_ALL\ncsv.QUOTE_MINIMAL\ncsv.QUOTE_NONE\ncsv.QUOTE_NONNUMERIC\ncsv.Sniffer(??)\ncsv.StringIO(??)\ncsv.excel(??)\ncsv.excel_tab(??)\ncsv.field_size_limit(??)\ncsv.get_dialect(??)\ncsv.list_dialects(??)\ncsv.re(??)\ncsv.reader(??)\ncsv.register_dialect(??)\ncsv.unregister_dialect(??)\ncsv.writer(??)\nctypes.ARRAY(??)\nctypes.ArgumentError(??)\nctypes.Array(??)\nctypes.BigEndianStructure(??)\nctypes.CDLL(??)\nctypes.CFUNCTYPE(??)\nctypes.DEFAULT_MODE\nctypes.LibraryLoader(??)\nctypes.LittleEndianStructure(??)\nctypes.POINTER(??)\nctypes.PYFUNCTYPE(??)\nctypes.PyDLL(??)\nctypes.RTLD_GLOBAL\nctypes.RTLD_LOCAL\nctypes.SetPointerType(??)\nctypes.Structure(??)\nctypes.Union(??)\nctypes.addressof(C instance) -> integer\nctypes.alignment(C type) -> integer\nctypes.byref(C instance[, offset=0]) -> byref-object\nctypes.c_bool(??)\nctypes.c_buffer(??)\nctypes.c_byte(??)\nctypes.c_char(??)\nctypes.c_char_p(??)\nctypes.c_double(??)\nctypes.c_float(??)\nctypes.c_int(??)\nctypes.c_int16(??)\nctypes.c_int32(??)\nctypes.c_int64(??)\nctypes.c_int8(??)\nctypes.c_long(??)\nctypes.c_longdouble(??)\nctypes.c_longlong(??)\nctypes.c_short(??)\nctypes.c_size_t(??)\nctypes.c_ubyte(??)\nctypes.c_uint(??)\nctypes.c_uint16(??)\nctypes.c_uint32(??)\nctypes.c_uint64(??)\nctypes.c_uint8(??)\nctypes.c_ulong(??)\nctypes.c_ulonglong(??)\nctypes.c_ushort(??)\nctypes.c_void_p(??)\nctypes.c_voidp(??)\nctypes.c_wchar(??)\nctypes.c_wchar_p(??)\nctypes.cast(??)\nctypes.cdll(??)\nctypes.create_string_buffer(aBytes) -> character array\nctypes.create_unicode_buffer(aString) -> character array\nctypes.get_errno(??)\nctypes.macholib.dyld.DEFAULT_FRAMEWORK_FALLBACK(??)\nctypes.macholib.dyld.DEFAULT_LIBRARY_FALLBACK(??)\nctypes.macholib.dyld.chain(*iterables) --> chain object\nctypes.macholib.dyld.combinations(iterable[, r]) --> combinations object\nctypes.macholib.dyld.combinations_with_replacement(iterable[, r]) --> combinations_with_replacement object\nctypes.macholib.dyld.compress(data, selectors) --> iterator over selected data\nctypes.macholib.dyld.count(start=0, step=1]) --> count object\nctypes.macholib.dyld.cycle(iterable) --> cycle object\nctypes.macholib.dyld.dropwhile(predicate, iterable) --> dropwhile object\nctypes.macholib.dyld.dyld_default_search(??)\nctypes.macholib.dyld.dyld_env(??)\nctypes.macholib.dyld.dyld_executable_path_search(??)\nctypes.macholib.dyld.dyld_fallback_framework_path(??)\nctypes.macholib.dyld.dyld_fallback_library_path(??)\nctypes.macholib.dyld.dyld_find(??)\nctypes.macholib.dyld.dyld_framework_path(??)\nctypes.macholib.dyld.dyld_image_suffix(??)\nctypes.macholib.dyld.dyld_image_suffix_search(??)\nctypes.macholib.dyld.dyld_library_path(??)\nctypes.macholib.dyld.dyld_override_search(??)\nctypes.macholib.dyld.dylib_info(??)\nctypes.macholib.dyld.filterfalse(function or None, sequence) --> filterfalse object\nctypes.macholib.dyld.framework_find(??)\nctypes.macholib.dyld.framework_info(??)\nctypes.macholib.dyld.groupby(iterable[, keyfunc]) -> create an iterator which returns\nctypes.macholib.dyld.islice(iterable, [start,] stop [, step]) --> islice object\nctypes.macholib.dyld.os(??)\nctypes.macholib.dyld.permutations(iterable[, r]) --> permutations object\nctypes.macholib.dyld.product(*iterables) --> product object\nctypes.macholib.dyld.repeat(object [,times]) -> create an iterator which returns the object\nctypes.macholib.dyld.starmap(function, sequence) --> starmap object\nctypes.macholib.dyld.takewhile(predicate, iterable) --> takewhile object\nctypes.macholib.dyld.tee(iterable, n=2) --> tuple of n independent iterators.\nctypes.macholib.dyld.test_dyld_find(??)\nctypes.macholib.dyld.zip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> zip_longest object\nctypes.macholib.dylib.DYLIB_RE(??)\nctypes.macholib.dylib.dylib_info(??)\nctypes.macholib.dylib.re(??)\nctypes.macholib.dylib.test_dylib_info(??)\nctypes.macholib.framework(??)\nctypes.macholib.framework.STRICT_FRAMEWORK_RE(??)\nctypes.macholib.framework.framework_info(??)\nctypes.macholib.framework.re(??)\nctypes.macholib.framework.test_framework_info(??)\nctypes.memmove(??)\nctypes.memset(??)\nctypes.pointer(??)\nctypes.py_object(??)\nctypes.pydll(??)\nctypes.pythonapi(??)\nctypes.resize(??)\nctypes.set_conversion_mode(encoding, errors) -> (previous-encoding, previous-errors)\nctypes.set_errno(??)\nctypes.sizeof(C type) -> integer\nctypes.string_at(addr[, size]) -> string\nctypes.util(??)\nctypes.util.errno(??)\nctypes.util.find_library(??)\nctypes.util.os(??)\nctypes.util.re(??)\nctypes.util.sys(??)\nctypes.util.tempfile(??)\nctypes.util.test(??)\nctypes.wstring_at(addr[, size]) -> string\ncurses.ALL_MOUSE_EVENTS\ncurses.A_ALTCHARSET\ncurses.A_ATTRIBUTES\ncurses.A_BLINK\ncurses.A_BOLD\ncurses.A_CHARTEXT\ncurses.A_COLOR\ncurses.A_DIM\ncurses.A_HORIZONTAL\ncurses.A_INVIS\ncurses.A_LEFT\ncurses.A_LOW\ncurses.A_NORMAL\ncurses.A_PROTECT\ncurses.A_REVERSE\ncurses.A_RIGHT\ncurses.A_STANDOUT\ncurses.A_TOP\ncurses.A_UNDERLINE\ncurses.A_VERTICAL\ncurses.BUTTON1_CLICKED\ncurses.BUTTON1_DOUBLE_CLICKED\ncurses.BUTTON1_PRESSED\ncurses.BUTTON1_RELEASED\ncurses.BUTTON1_TRIPLE_CLICKED\ncurses.BUTTON2_CLICKED\ncurses.BUTTON2_DOUBLE_CLICKED\ncurses.BUTTON2_PRESSED\ncurses.BUTTON2_RELEASED\ncurses.BUTTON2_TRIPLE_CLICKED\ncurses.BUTTON3_CLICKED\ncurses.BUTTON3_DOUBLE_CLICKED\ncurses.BUTTON3_PRESSED\ncurses.BUTTON3_RELEASED\ncurses.BUTTON3_TRIPLE_CLICKED\ncurses.BUTTON4_CLICKED\ncurses.BUTTON4_DOUBLE_CLICKED\ncurses.BUTTON4_PRESSED\ncurses.BUTTON4_RELEASED\ncurses.BUTTON4_TRIPLE_CLICKED\ncurses.BUTTON_ALT\ncurses.BUTTON_CTRL\ncurses.BUTTON_SHIFT\ncurses.COLOR_BLACK\ncurses.COLOR_BLUE\ncurses.COLOR_CYAN\ncurses.COLOR_GREEN\ncurses.COLOR_MAGENTA\ncurses.COLOR_RED\ncurses.COLOR_WHITE\ncurses.COLOR_YELLOW\ncurses.ERR\ncurses.KEY_A1\ncurses.KEY_A3\ncurses.KEY_B2\ncurses.KEY_BACKSPACE\ncurses.KEY_BEG\ncurses.KEY_BREAK\ncurses.KEY_BTAB\ncurses.KEY_C1\ncurses.KEY_C3\ncurses.KEY_CANCEL\ncurses.KEY_CATAB\ncurses.KEY_CLEAR\ncurses.KEY_CLOSE\ncurses.KEY_COMMAND\ncurses.KEY_COPY\ncurses.KEY_CREATE\ncurses.KEY_CTAB\ncurses.KEY_DC\ncurses.KEY_DL\ncurses.KEY_DOWN\ncurses.KEY_EIC\ncurses.KEY_END\ncurses.KEY_ENTER\ncurses.KEY_EOL\ncurses.KEY_EOS\ncurses.KEY_EXIT\ncurses.KEY_F0\ncurses.KEY_F1\ncurses.KEY_F10\ncurses.KEY_F11\ncurses.KEY_F12\ncurses.KEY_F13\ncurses.KEY_F14\ncurses.KEY_F15\ncurses.KEY_F16\ncurses.KEY_F17\ncurses.KEY_F18\ncurses.KEY_F19\ncurses.KEY_F2\ncurses.KEY_F20\ncurses.KEY_F21\ncurses.KEY_F22\ncurses.KEY_F23\ncurses.KEY_F24\ncurses.KEY_F25\ncurses.KEY_F26\ncurses.KEY_F27\ncurses.KEY_F28\ncurses.KEY_F29\ncurses.KEY_F3\ncurses.KEY_F30\ncurses.KEY_F31\ncurses.KEY_F32\ncurses.KEY_F33\ncurses.KEY_F34\ncurses.KEY_F35\ncurses.KEY_F36\ncurses.KEY_F37\ncurses.KEY_F38\ncurses.KEY_F39\ncurses.KEY_F4\ncurses.KEY_F40\ncurses.KEY_F41\ncurses.KEY_F42\ncurses.KEY_F43\ncurses.KEY_F44\ncurses.KEY_F45\ncurses.KEY_F46\ncurses.KEY_F47\ncurses.KEY_F48\ncurses.KEY_F49\ncurses.KEY_F5\ncurses.KEY_F50\ncurses.KEY_F51\ncurses.KEY_F52\ncurses.KEY_F53\ncurses.KEY_F54\ncurses.KEY_F55\ncurses.KEY_F56\ncurses.KEY_F57\ncurses.KEY_F58\ncurses.KEY_F59\ncurses.KEY_F6\ncurses.KEY_F60\ncurses.KEY_F61\ncurses.KEY_F62\ncurses.KEY_F63\ncurses.KEY_F7\ncurses.KEY_F8\ncurses.KEY_F9\ncurses.KEY_FIND\ncurses.KEY_HELP\ncurses.KEY_HOME\ncurses.KEY_IC\ncurses.KEY_IL\ncurses.KEY_LEFT\ncurses.KEY_LL\ncurses.KEY_MARK\ncurses.KEY_MAX\ncurses.KEY_MESSAGE\ncurses.KEY_MIN\ncurses.KEY_MOUSE\ncurses.KEY_MOVE\ncurses.KEY_NEXT\ncurses.KEY_NPAGE\ncurses.KEY_OPEN\ncurses.KEY_OPTIONS\ncurses.KEY_PPAGE\ncurses.KEY_PREVIOUS\ncurses.KEY_PRINT\ncurses.KEY_REDO\ncurses.KEY_REFERENCE\ncurses.KEY_REFRESH\ncurses.KEY_REPLACE\ncurses.KEY_RESET\ncurses.KEY_RESIZE\ncurses.KEY_RESTART\ncurses.KEY_RESUME\ncurses.KEY_RIGHT\ncurses.KEY_SAVE\ncurses.KEY_SBEG\ncurses.KEY_SCANCEL\ncurses.KEY_SCOMMAND\ncurses.KEY_SCOPY\ncurses.KEY_SCREATE\ncurses.KEY_SDC\ncurses.KEY_SDL\ncurses.KEY_SELECT\ncurses.KEY_SEND\ncurses.KEY_SEOL\ncurses.KEY_SEXIT\ncurses.KEY_SF\ncurses.KEY_SFIND\ncurses.KEY_SHELP\ncurses.KEY_SHOME\ncurses.KEY_SIC\ncurses.KEY_SLEFT\ncurses.KEY_SMESSAGE\ncurses.KEY_SMOVE\ncurses.KEY_SNEXT\ncurses.KEY_SOPTIONS\ncurses.KEY_SPREVIOUS\ncurses.KEY_SPRINT\ncurses.KEY_SR\ncurses.KEY_SREDO\ncurses.KEY_SREPLACE\ncurses.KEY_SRESET\ncurses.KEY_SRIGHT\ncurses.KEY_SRSUME\ncurses.KEY_SSAVE\ncurses.KEY_SSUSPEND\ncurses.KEY_STAB\ncurses.KEY_SUNDO\ncurses.KEY_SUSPEND\ncurses.KEY_UNDO\ncurses.KEY_UP\ncurses.OK\ncurses.REPORT_MOUSE_POSITION\ncurses.ascii(??)\ncurses.ascii.ACK\ncurses.ascii.BEL\ncurses.ascii.BS\ncurses.ascii.CAN\ncurses.ascii.CR\ncurses.ascii.DC1\ncurses.ascii.DC2\ncurses.ascii.DC3\ncurses.ascii.DC4\ncurses.ascii.DEL\ncurses.ascii.DLE\ncurses.ascii.EM\ncurses.ascii.ENQ\ncurses.ascii.EOT\ncurses.ascii.ESC\ncurses.ascii.ETB\ncurses.ascii.ETX\ncurses.ascii.FF\ncurses.ascii.FS\ncurses.ascii.GS\ncurses.ascii.HT\ncurses.ascii.LF\ncurses.ascii.NAK\ncurses.ascii.NL\ncurses.ascii.NUL\ncurses.ascii.RS\ncurses.ascii.SI\ncurses.ascii.SO\ncurses.ascii.SOH\ncurses.ascii.SP\ncurses.ascii.STX\ncurses.ascii.SUB\ncurses.ascii.SYN\ncurses.ascii.TAB\ncurses.ascii.US\ncurses.ascii.VT\ncurses.ascii.alt(??)\ncurses.ascii.ascii(??)\ncurses.ascii.controlnames(??)\ncurses.ascii.ctrl(??)\ncurses.ascii.isalnum(??)\ncurses.ascii.isalpha(??)\ncurses.ascii.isascii(??)\ncurses.ascii.isblank(??)\ncurses.ascii.iscntrl(??)\ncurses.ascii.isctrl(??)\ncurses.ascii.isdigit(??)\ncurses.ascii.isgraph(??)\ncurses.ascii.islower(??)\ncurses.ascii.ismeta(??)\ncurses.ascii.isprint(??)\ncurses.ascii.ispunct(??)\ncurses.ascii.isspace(??)\ncurses.ascii.isupper(??)\ncurses.ascii.isxdigit(??)\ncurses.ascii.unctrl(??)\ncurses.baudrate(??)\ncurses.beep(??)\ncurses.can_change_color(??)\ncurses.cbreak(??)\ncurses.color_content(??)\ncurses.color_pair(??)\ncurses.curs_set(??)\ncurses.def_prog_mode(??)\ncurses.def_shell_mode(??)\ncurses.delay_output(??)\ncurses.doupdate(??)\ncurses.echo(??)\ncurses.endwin(??)\ncurses.erasechar(??)\ncurses.error(??)\ncurses.filter(??)\ncurses.flash(??)\ncurses.flushinp(??)\ncurses.getmouse(??)\ncurses.getsyx(??)\ncurses.getwin(??)\ncurses.halfdelay(??)\ncurses.has_colors(??)\ncurses.has_ic(??)\ncurses.has_il(??)\ncurses.has_key(??)\ncurses.has_key.has_key(??)\ncurses.init_color(??)\ncurses.init_pair(??)\ncurses.initscr(??)\ncurses.intrflush(??)\ncurses.is_term_resized(??)\ncurses.isendwin(??)\ncurses.keyname(??)\ncurses.killchar(??)\ncurses.longname(??)\ncurses.meta(??)\ncurses.mouseinterval(??)\ncurses.mousemask(??)\ncurses.napms(??)\ncurses.newpad(??)\ncurses.newwin(??)\ncurses.nl(??)\ncurses.nocbreak(??)\ncurses.noecho(??)\ncurses.nonl(??)\ncurses.noqiflush(??)\ncurses.noraw(??)\ncurses.pair_content(??)\ncurses.pair_number(??)\ncurses.panel(??)\ncurses.panel.bottom_panel(??)\ncurses.panel.error(??)\ncurses.panel.new_panel(??)\ncurses.panel.top_panel(??)\ncurses.panel.update_panels(??)\ncurses.panel.version\ncurses.putp(??)\ncurses.qiflush(??)\ncurses.raw(??)\ncurses.reset_prog_mode(??)\ncurses.reset_shell_mode(??)\ncurses.resetty(??)\ncurses.resize_term(??)\ncurses.resizeterm(??)\ncurses.savetty(??)\ncurses.setsyx(??)\ncurses.setupterm(??)\ncurses.start_color(??)\ncurses.termattrs(??)\ncurses.termname(??)\ncurses.textpad.Textbox(??)\ncurses.textpad.curses(??)\ncurses.textpad.rectangle(??)\ncurses.tigetflag(??)\ncurses.tigetnum(??)\ncurses.tigetstr(??)\ncurses.tparm(??)\ncurses.typeahead(??)\ncurses.unctrl(??)\ncurses.ungetch(??)\ncurses.ungetmouse(??)\ncurses.use_default_colors(??)\ncurses.use_env(??)\ncurses.version\ncurses.wrapper(??)\ndatetime.MAXYEAR\ndatetime.MINYEAR\ndatetime.date(year, month, day) --> date object\ndatetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\ndatetime.datetime_CAPI(??)\ndatetime.time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\ndatetime.timedelta(??)\ndatetime.tzinfo(??)\ndbm.dumb(??)\ndbm.dumb.collections(??)\ndbm.dumb.error(??)\ndbm.dumb.open(??)\ndbm.error(??)\ndbm.io(??)\ndbm.ndbm.error(??)\ndbm.ndbm.library\ndbm.ndbm.open(path[, flag[, mode]]) -> mapping\ndbm.open(??)\ndbm.os(??)\ndbm.struct(??)\ndbm.sys(??)\ndbm.whichdb(??)\ndecimal.BasicContext(??)\ndecimal.Clamped(??)\ndecimal.Context(??)\ndecimal.ConversionSyntax(??)\ndecimal.Decimal(??)\ndecimal.DecimalException(??)\ndecimal.DecimalTuple(sign, digits, exponent)\ndecimal.DefaultContext(??)\ndecimal.DivisionByZero(??)\ndecimal.DivisionImpossible(??)\ndecimal.DivisionUndefined(??)\ndecimal.ExtendedContext(??)\ndecimal.Inexact(??)\ndecimal.InvalidContext(??)\ndecimal.InvalidOperation(??)\ndecimal.Overflow(??)\ndecimal.ROUND_05UP\ndecimal.ROUND_CEILING\ndecimal.ROUND_DOWN\ndecimal.ROUND_FLOOR\ndecimal.ROUND_HALF_DOWN\ndecimal.ROUND_HALF_EVEN\ndecimal.ROUND_HALF_UP\ndecimal.ROUND_UP\ndecimal.Rounded(??)\ndecimal.Subnormal(??)\ndecimal.Underflow(??)\ndecimal.getcontext(??)\ndecimal.localcontext(??)\ndecimal.setcontext(??)\ndelattr(object, name)\ndict() -> new empty dictionary.\ndifflib.Differ(??)\ndifflib.HtmlDiff(??)\ndifflib.IS_CHARACTER_JUNK(??)\ndifflib.IS_LINE_JUNK(??)\ndifflib.Match(a, b, size)\ndifflib.SequenceMatcher(??)\ndifflib.context_diff(??)\ndifflib.get_close_matches(??)\ndifflib.heapq(??)\ndifflib.ndiff(??)\ndifflib.restore(??)\ndifflib.unified_diff(??)\ndir([object]) -> list of strings\ndis.EXTENDED_ARG\ndis.HAVE_ARGUMENT\ndis.cmp_op(??)\ndis.dis(??)\ndis.disassemble(??)\ndis.disassemble_string(??)\ndis.disco(??)\ndis.distb(??)\ndis.findlabels(??)\ndis.findlinestarts(??)\ndis.flag2name(??)\ndis.hascompare(??)\ndis.hasconst(??)\ndis.hasfree(??)\ndis.hasjabs(??)\ndis.hasjrel(??)\ndis.haslocal(??)\ndis.hasname(??)\ndis.opmap(??)\ndis.opname(??)\ndis.pretty_flags(??)\ndis.show_code(??)\ndis.sys(??)\ndis.types(??)\ndivmod(x, y) -> (div, mod)\ndoctest.BLANKLINE_MARKER\ndoctest.COMPARISON_FLAGS\ndoctest.DONT_ACCEPT_BLANKLINE\ndoctest.DONT_ACCEPT_TRUE_FOR_1\ndoctest.DebugRunner(??)\ndoctest.DocFileCase(??)\ndoctest.DocFileSuite(??)\ndoctest.DocFileTest(??)\ndoctest.DocTest(??)\ndoctest.DocTestCase(??)\ndoctest.DocTestFailure(??)\ndoctest.DocTestFinder(??)\ndoctest.DocTestParser(??)\ndoctest.DocTestRunner(??)\ndoctest.DocTestSuite(??)\ndoctest.ELLIPSIS\ndoctest.ELLIPSIS_MARKER\ndoctest.Example(??)\ndoctest.IGNORE_EXCEPTION_DETAIL\ndoctest.NORMALIZE_WHITESPACE\ndoctest.OPTIONFLAGS_BY_NAME(??)\ndoctest.OutputChecker(??)\ndoctest.REPORTING_FLAGS\ndoctest.REPORT_CDIFF\ndoctest.REPORT_NDIFF\ndoctest.REPORT_ONLY_FIRST_FAILURE\ndoctest.REPORT_UDIFF\ndoctest.SKIP\ndoctest.StringIO(??)\ndoctest.TestResults(failed, attempted)\ndoctest.UnexpectedException(??)\ndoctest.debug(??)\ndoctest.debug_script(??)\ndoctest.debug_src(??)\ndoctest.difflib(??)\ndoctest.inspect(??)\ndoctest.linecache(??)\ndoctest.master(??)\ndoctest.namedtuple(??)\ndoctest.os(??)\ndoctest.pdb(??)\ndoctest.re(??)\ndoctest.register_optionflag(??)\ndoctest.run_docstring_examples(??)\ndoctest.script_from_examples(??)\ndoctest.set_unittest_reportflags(??)\ndoctest.sys(??)\ndoctest.tempfile(??)\ndoctest.testfile(??)\ndoctest.testmod(??)\ndoctest.testsource(??)\ndoctest.traceback(??)\ndoctest.unittest(??)\ndoctest.warnings(??)\ndummy_threading.BoundedSemaphore(??)\ndummy_threading.Condition(??)\ndummy_threading.Event(??)\ndummy_threading.Lock(??)\ndummy_threading.RLock(??)\ndummy_threading.Semaphore(??)\ndummy_threading.Thread(??)\ndummy_threading.Timer(??)\ndummy_threading.active_count(??)\ndummy_threading.current_thread(??)\ndummy_threading.enumerate(??)\ndummy_threading.local(??)\ndummy_threading.setprofile(??)\ndummy_threading.settrace(??)\ndummy_threading.stack_size(??)\ndummy_threading.threading(??)\nemail.base64mime(??)\nemail.base64mime.CRLF\nemail.base64mime.EMPTYSTRING\nemail.base64mime.MISC_LEN\nemail.base64mime.NL\nemail.base64mime.a2b_base64(??)\nemail.base64mime.b2a_base64(??)\nemail.base64mime.b64encode(??)\nemail.base64mime.body_decode(??)\nemail.base64mime.body_encode(??)\nemail.base64mime.decode(??)\nemail.base64mime.decodestring(??)\nemail.base64mime.header_encode(??)\nemail.base64mime.header_length(??)\nemail.charset(??)\nemail.charset.ALIASES(??)\nemail.charset.BASE64\nemail.charset.CHARSETS(??)\nemail.charset.CODEC_MAP(??)\nemail.charset.Charset(??)\nemail.charset.DEFAULT_CHARSET\nemail.charset.EMPTYSTRING\nemail.charset.QP\nemail.charset.RFC2047_CHROME_LEN\nemail.charset.SHORTEST\nemail.charset.add_alias(??)\nemail.charset.add_charset(??)\nemail.charset.add_codec(??)\nemail.charset.email(??)\nemail.charset.encode_7or8bit(??)\nemail.charset.errors(??)\nemail.charset.partial(func, *args, **keywords) - new function with partial application\nemail.encoders(??)\nemail.encoders.encode_7or8bit(??)\nemail.encoders.encode_base64(??)\nemail.encoders.encode_noop(??)\nemail.encoders.encode_quopri(??)\nemail.errors(??)\nemail.errors.BoundaryError(??)\nemail.errors.CharsetError(??)\nemail.errors.FirstHeaderLineIsContinuationDefect(??)\nemail.errors.HeaderParseError(??)\nemail.errors.MalformedHeaderDefect(??)\nemail.errors.MessageDefect(??)\nemail.errors.MessageError(??)\nemail.errors.MessageParseError(??)\nemail.errors.MisplacedEnvelopeHeaderDefect(??)\nemail.errors.MultipartConversionError(??)\nemail.errors.MultipartInvariantViolationDefect(??)\nemail.errors.NoBoundaryInMultipartDefect(??)\nemail.errors.StartBoundaryNotFoundDefect(??)\nemail.feedparser(??)\nemail.feedparser.BufferedSubFile(??)\nemail.feedparser.EMPTYSTRING\nemail.feedparser.FeedParser(??)\nemail.feedparser.NL\nemail.feedparser.NLCRE(??)\nemail.feedparser.NLCRE_bol(??)\nemail.feedparser.NLCRE_crack(??)\nemail.feedparser.NLCRE_eol(??)\nemail.feedparser.NeedMoreData(??)\nemail.feedparser.errors(??)\nemail.feedparser.headerRE(??)\nemail.feedparser.message(??)\nemail.feedparser.re(??)\nemail.generator(??)\nemail.generator.DecodedGenerator(??)\nemail.generator.Generator(??)\nemail.generator.Header(??)\nemail.generator.NL\nemail.generator.StringIO(??)\nemail.generator.UNDERSCORE\nemail.generator.fcre(??)\nemail.generator.random(??)\nemail.generator.re(??)\nemail.generator.sys(??)\nemail.generator.time(??)\nemail.generator.warnings(??)\nemail.header(??)\nemail.header.BSPACE\nemail.header.Charset(??)\nemail.header.EMPTYSTRING\nemail.header.Header(??)\nemail.header.HeaderParseError(??)\nemail.header.MAXLINELEN\nemail.header.NL\nemail.header.SPACE\nemail.header.SPACE8\nemail.header.USASCII(??)\nemail.header.UTF8(??)\nemail.header.binascii(??)\nemail.header.decode_header(??)\nemail.header.ecre(??)\nemail.header.email(??)\nemail.header.fcre(??)\nemail.header.make_header(??)\nemail.header.re(??)\nemail.iterators(??)\nemail.iterators.StringIO(??)\nemail.iterators.body_line_iterator(??)\nemail.iterators.sys(??)\nemail.iterators.typed_subpart_iterator(??)\nemail.iterators.walk(??)\nemail.message(??)\nemail.message.BytesIO([buffer]) -> object\nemail.message.Charset(??)\nemail.message.Message(??)\nemail.message.SEMISPACE\nemail.message.StringIO(??)\nemail.message.base64(??)\nemail.message.binascii(??)\nemail.message.errors(??)\nemail.message.re(??)\nemail.message.tspecials(??)\nemail.message.utils(??)\nemail.message.uu(??)\nemail.message.warnings(??)\nemail.message_from_file(??)\nemail.message_from_string(??)\nemail.mime.application.MIMEApplication(??)\nemail.mime.application.MIMENonMultipart(??)\nemail.mime.application.encoders(??)\nemail.mime.audio(??)\nemail.mime.audio.BytesIO([buffer]) -> object\nemail.mime.audio.MIMEAudio(??)\nemail.mime.audio.MIMENonMultipart(??)\nemail.mime.audio.encoders(??)\nemail.mime.audio.sndhdr(??)\nemail.mime.base(??)\nemail.mime.base.MIMEBase(??)\nemail.mime.base.message(??)\nemail.mime.image.MIMEImage(??)\nemail.mime.image.MIMENonMultipart(??)\nemail.mime.image.encoders(??)\nemail.mime.image.imghdr(??)\nemail.mime.message.MIMEMessage(??)\nemail.mime.message.MIMENonMultipart(??)\nemail.mime.message.message(??)\nemail.mime.multipart.MIMEBase(??)\nemail.mime.multipart.MIMEMultipart(??)\nemail.mime.nonmultipart(??)\nemail.mime.nonmultipart.MIMEBase(??)\nemail.mime.nonmultipart.MIMENonMultipart(??)\nemail.mime.nonmultipart.errors(??)\nemail.mime.text(??)\nemail.mime.text.MIMENonMultipart(??)\nemail.mime.text.MIMEText(??)\nemail.mime.text.encode_7or8bit(??)\nemail.parser(??)\nemail.parser.FeedParser(??)\nemail.parser.HeaderParser(??)\nemail.parser.Message(??)\nemail.parser.Parser(??)\nemail.parser.StringIO(??)\nemail.parser.warnings(??)\nemail.quoprimime(??)\nemail.quoprimime.CRLF\nemail.quoprimime.EMPTYSTRING\nemail.quoprimime.NL\nemail.quoprimime.ascii_letters\nemail.quoprimime.body_check(??)\nemail.quoprimime.body_decode(??)\nemail.quoprimime.body_encode(??)\nemail.quoprimime.body_length(??)\nemail.quoprimime.c\nemail.quoprimime.decode(??)\nemail.quoprimime.decodestring(??)\nemail.quoprimime.digits\nemail.quoprimime.header_check(??)\nemail.quoprimime.header_decode(??)\nemail.quoprimime.header_encode(??)\nemail.quoprimime.header_length(??)\nemail.quoprimime.hexdigits\nemail.quoprimime.quote(??)\nemail.quoprimime.re(??)\nemail.quoprimime.unquote(??)\nemail.utils(??)\nemail.utils.COMMASPACE\nemail.utils.CRLF\nemail.utils.EMPTYSTRING\nemail.utils.StringIO(??)\nemail.utils.TICK\nemail.utils.UEMPTYSTRING\nemail.utils.base64(??)\nemail.utils.collapse_rfc2231_value(??)\nemail.utils.decode_params(??)\nemail.utils.decode_rfc2231(??)\nemail.utils.ecre(??)\nemail.utils.encode_rfc2231(??)\nemail.utils.escapesre(??)\nemail.utils.formataddr(??)\nemail.utils.formatdate(??)\nemail.utils.getaddresses(??)\nemail.utils.make_msgid(??)\nemail.utils.mktime_tz(??)\nemail.utils.os(??)\nemail.utils.parseaddr(??)\nemail.utils.parsedate(??)\nemail.utils.parsedate_tz(??)\nemail.utils.quote(??)\nemail.utils.random(??)\nemail.utils.re(??)\nemail.utils.rfc2231_continuation(??)\nemail.utils.socket(??)\nemail.utils.specialsre(??)\nemail.utils.time(??)\nemail.utils.unquote(??)\nemail.utils.urllib(??)\nemail.utils.warnings(??)\nenumerate(iterable) -> iterator for index, value of iterable\nerrno.E2BIG\nerrno.EACCES\nerrno.EADDRINUSE\nerrno.EADDRNOTAVAIL\nerrno.EADV\nerrno.EAFNOSUPPORT\nerrno.EAGAIN\nerrno.EALREADY\nerrno.EBADE\nerrno.EBADF\nerrno.EBADFD\nerrno.EBADMSG\nerrno.EBADR\nerrno.EBADRQC\nerrno.EBADSLT\nerrno.EBFONT\nerrno.EBUSY\nerrno.ECHILD\nerrno.ECHRNG\nerrno.ECOMM\nerrno.ECONNABORTED\nerrno.ECONNREFUSED\nerrno.ECONNRESET\nerrno.EDEADLK\nerrno.EDEADLOCK\nerrno.EDESTADDRREQ\nerrno.EDOM\nerrno.EDOTDOT\nerrno.EDQUOT\nerrno.EEXIST\nerrno.EFAULT\nerrno.EFBIG\nerrno.EHOSTDOWN\nerrno.EHOSTUNREACH\nerrno.EIDRM\nerrno.EILSEQ\nerrno.EINPROGRESS\nerrno.EINTR\nerrno.EINVAL\nerrno.EIO\nerrno.EISCONN\nerrno.EISDIR\nerrno.EISNAM\nerrno.EL2HLT\nerrno.EL2NSYNC\nerrno.EL3HLT\nerrno.EL3RST\nerrno.ELIBACC\nerrno.ELIBBAD\nerrno.ELIBEXEC\nerrno.ELIBMAX\nerrno.ELIBSCN\nerrno.ELNRNG\nerrno.ELOOP\nerrno.EMFILE\nerrno.EMLINK\nerrno.EMSGSIZE\nerrno.EMULTIHOP\nerrno.ENAMETOOLONG\nerrno.ENAVAIL\nerrno.ENETDOWN\nerrno.ENETRESET\nerrno.ENETUNREACH\nerrno.ENFILE\nerrno.ENOANO\nerrno.ENOBUFS\nerrno.ENOCSI\nerrno.ENODATA\nerrno.ENODEV\nerrno.ENOENT\nerrno.ENOEXEC\nerrno.ENOLCK\nerrno.ENOLINK\nerrno.ENOMEM\nerrno.ENOMSG\nerrno.ENONET\nerrno.ENOPKG\nerrno.ENOPROTOOPT\nerrno.ENOSPC\nerrno.ENOSR\nerrno.ENOSTR\nerrno.ENOSYS\nerrno.ENOTBLK\nerrno.ENOTCONN\nerrno.ENOTDIR\nerrno.ENOTEMPTY\nerrno.ENOTNAM\nerrno.ENOTSOCK\nerrno.ENOTTY\nerrno.ENOTUNIQ\nerrno.ENXIO\nerrno.EOPNOTSUPP\nerrno.EOVERFLOW\nerrno.EPERM\nerrno.EPFNOSUPPORT\nerrno.EPIPE\nerrno.EPROTO\nerrno.EPROTONOSUPPORT\nerrno.EPROTOTYPE\nerrno.ERANGE\nerrno.EREMCHG\nerrno.EREMOTE\nerrno.EREMOTEIO\nerrno.ERESTART\nerrno.EROFS\nerrno.ESHUTDOWN\nerrno.ESOCKTNOSUPPORT\nerrno.ESPIPE\nerrno.ESRCH\nerrno.ESRMNT\nerrno.ESTALE\nerrno.ESTRPIPE\nerrno.ETIME\nerrno.ETIMEDOUT\nerrno.ETOOMANYREFS\nerrno.ETXTBSY\nerrno.EUCLEAN\nerrno.EUNATCH\nerrno.EUSERS\nerrno.EWOULDBLOCK\nerrno.EXDEV\nerrno.EXFULL\nerrno.errorcode(??)\neval(source[, globals[, locals]]) -> value\nexec(object[, globals[, locals]])\nexit(??)\nfcntl.DN_ACCESS\nfcntl.DN_ATTRIB\nfcntl.DN_CREATE\nfcntl.DN_DELETE\nfcntl.DN_MODIFY\nfcntl.DN_MULTISHOT\nfcntl.DN_RENAME\nfcntl.FASYNC\nfcntl.FD_CLOEXEC\nfcntl.F_DUPFD\nfcntl.F_EXLCK\nfcntl.F_GETFD\nfcntl.F_GETFL\nfcntl.F_GETLEASE\nfcntl.F_GETLK\nfcntl.F_GETLK64\nfcntl.F_GETOWN\nfcntl.F_GETSIG\nfcntl.F_NOTIFY\nfcntl.F_RDLCK\nfcntl.F_SETFD\nfcntl.F_SETFL\nfcntl.F_SETLEASE\nfcntl.F_SETLK\nfcntl.F_SETLK64\nfcntl.F_SETLKW\nfcntl.F_SETLKW64\nfcntl.F_SETOWN\nfcntl.F_SETSIG\nfcntl.F_SHLCK\nfcntl.F_UNLCK\nfcntl.F_WRLCK\nfcntl.I_ATMARK\nfcntl.I_CANPUT\nfcntl.I_CKBAND\nfcntl.I_FDINSERT\nfcntl.I_FIND\nfcntl.I_FLUSH\nfcntl.I_FLUSHBAND\nfcntl.I_GETBAND\nfcntl.I_GETCLTIME\nfcntl.I_GETSIG\nfcntl.I_GRDOPT\nfcntl.I_GWROPT\nfcntl.I_LINK\nfcntl.I_LIST\nfcntl.I_LOOK\nfcntl.I_NREAD\nfcntl.I_PEEK\nfcntl.I_PLINK\nfcntl.I_POP\nfcntl.I_PUNLINK\nfcntl.I_PUSH\nfcntl.I_RECVFD\nfcntl.I_SENDFD\nfcntl.I_SETCLTIME\nfcntl.I_SETSIG\nfcntl.I_SRDOPT\nfcntl.I_STR\nfcntl.I_SWROPT\nfcntl.I_UNLINK\nfcntl.LOCK_EX\nfcntl.LOCK_MAND\nfcntl.LOCK_NB\nfcntl.LOCK_READ\nfcntl.LOCK_RW\nfcntl.LOCK_SH\nfcntl.LOCK_UN\nfcntl.LOCK_WRITE\nfcntl.fcntl(fd, opt, [arg])\nfcntl.flock(fd, operation)\nfcntl.ioctl(fd, opt[, arg[, mutate_flag]])\nfcntl.lockf (fd, operation, length=0, start=0, whence=0)\nfilecmp.BUFSIZE\nfilecmp.cmp(??)\nfilecmp.cmpfiles(??)\nfilecmp.demo(??)\nfilecmp.dircmp(??)\nfilecmp.filterfalse(function or None, sequence) --> filterfalse object\nfilecmp.os(??)\nfilecmp.stat(??)\nfileinput.DEFAULT_BUFSIZE\nfileinput.FileInput(??)\nfileinput.close(??)\nfileinput.filelineno(??)\nfileinput.filename(??)\nfileinput.fileno(??)\nfileinput.hook_compressed(??)\nfileinput.hook_encoded(??)\nfileinput.input(files=None, inplace=False, backup=\"\", bufsize=0, mode=\"r\", openhook=None)\nfileinput.isfirstline(??)\nfileinput.isstdin(??)\nfileinput.lineno(??)\nfileinput.nextfile(??)\nfileinput.os(??)\nfileinput.sys(??)\nfilter(function or None, iterable) --> filter object\nfloat(x) -> floating point number\nfnmatch.filter(??)\nfnmatch.fnmatch(??)\nfnmatch.fnmatchcase(??)\nfnmatch.re(??)\nfnmatch.translate(??)\nformat(value[, format_spec]) -> string\nformatter.AS_IS(??)\nformatter.AbstractFormatter(??)\nformatter.AbstractWriter(??)\nformatter.DumbWriter(??)\nformatter.NullFormatter(??)\nformatter.NullWriter(??)\nformatter.sys(??)\nformatter.test(??)\nfractions.Fraction(??)\nfractions.gcd(??)\nfractions.math(??)\nfractions.numbers(??)\nfractions.operator(??)\nfractions.re(??)\nfrozenset(iterable) --> frozenset object\nftplib.B_CRLF\nftplib.CRLF\nftplib.Error(??)\nftplib.FTP(??)\nftplib.FTP_PORT\nftplib.MSG_OOB\nftplib.Netrc(??)\nftplib.all_errors(??)\nftplib.error_perm(??)\nftplib.error_proto(??)\nftplib.error_reply(??)\nftplib.error_temp(??)\nftplib.ftpcp(??)\nftplib.os(??)\nftplib.parse150(??)\nftplib.parse227(??)\nftplib.parse229(??)\nftplib.parse257(??)\nftplib.print_line(??)\nftplib.socket(??)\nftplib.sys(??)\nftplib.test(??)\nfunctools.WRAPPER_ASSIGNMENTS(??)\nfunctools.WRAPPER_UPDATES(??)\nfunctools.partial(func, *args, **keywords) - new function with partial application\nfunctools.reduce(function, sequence[, initial]) -> value\nfunctools.update_wrapper(??)\nfunctools.wraps(??)\ngc.DEBUG_COLLECTABLE\ngc.DEBUG_LEAK\ngc.DEBUG_SAVEALL\ngc.DEBUG_STATS\ngc.DEBUG_UNCOLLECTABLE\ngc.collect([generation]) -> n\ngc.disable() -> None\ngc.enable() -> None\ngc.garbage(??)\ngc.get_count() -> (count0, count1, count2)\ngc.get_debug() -> flags\ngc.get_objects() -> [...]\ngc.get_referents(*objs) -> list\ngc.get_referrers(*objs) -> list\ngc.get_threshold() -> (threshold0, threshold1, threshold2)\ngc.is_tracked(obj) -> bool\ngc.isenabled() -> status\ngc.set_debug(flags) -> None\ngc.set_threshold(threshold0, [threshold1, threshold2]) -> None\ngenericpath.commonprefix(??)\ngenericpath.exists(??)\ngenericpath.getatime(??)\ngenericpath.getctime(??)\ngenericpath.getmtime(??)\ngenericpath.getsize(??)\ngenericpath.isdir(??)\ngenericpath.isfile(??)\ngenericpath.os(??)\ngenericpath.stat(??)\ngetattr(object, name[, default]) -> value\ngetopt.GetoptError(??)\ngetopt.do_longs(??)\ngetopt.do_shorts(??)\ngetopt.error(??)\ngetopt.getopt(args, options[, long_options]) -> opts, args\ngetopt.gnu_getopt(??)\ngetopt.long_has_args(??)\ngetopt.os(??)\ngetopt.short_has_arg(??)\ngetpass.GetPassWarning(??)\ngetpass.fallback_getpass(??)\ngetpass.getpass(??)\ngetpass.getuser(??)\ngetpass.os(??)\ngetpass.sys(??)\ngetpass.termios(??)\ngetpass.unix_getpass(??)\ngetpass.warnings(??)\ngetpass.win_getpass(??)\ngettext.Catalog(??)\ngettext.ENOENT\ngettext.GNUTranslations(??)\ngettext.NullTranslations(??)\ngettext.bind_textdomain_codeset(??)\ngettext.bindtextdomain(??)\ngettext.c2py(??)\ngettext.copy(??)\ngettext.dgettext(??)\ngettext.dngettext(??)\ngettext.find(??)\ngettext.gettext(??)\ngettext.install(??)\ngettext.ldgettext(??)\ngettext.ldngettext(??)\ngettext.lgettext(??)\ngettext.lngettext(??)\ngettext.locale(??)\ngettext.ngettext(??)\ngettext.os(??)\ngettext.re(??)\ngettext.struct(??)\ngettext.sys(??)\ngettext.test(??)\ngettext.textdomain(??)\ngettext.translation(??)\nglob.fnmatch(??)\nglob.glob(??)\nglob.glob0(??)\nglob.glob1(??)\nglob.has_magic(??)\nglob.iglob(??)\nglob.magic_check(??)\nglob.magic_check_bytes(??)\nglob.os(??)\nglob.re(??)\nglob.sys(??)\nglobals() -> dictionary\ngrp.getgrall() -> list of tuples\ngrp.getgrgid(id) -> tuple\ngrp.getgrnam(name) -> tuple\ngrp.struct_group(??)\ngzip.FCOMMENT\ngzip.FEXTRA\ngzip.FHCRC\ngzip.FNAME\ngzip.FTEXT\ngzip.GzipFile(??)\ngzip.LOWU32(??)\ngzip.READ\ngzip.U32(??)\ngzip.WRITE\ngzip.builtins(??)\ngzip.open(??)\ngzip.read32(??)\ngzip.struct(??)\ngzip.sys(??)\ngzip.time(??)\ngzip.write32u(??)\ngzip.zlib(??)\nhasattr(object, name) -> bool\nhash(object) -> integer\nhashlib.md5(??)\nhashlib.new(name, data=b'') - Return a new hashing object using the named algorithm;\nhashlib.sha1(??)\nhashlib.sha224(??)\nhashlib.sha256(??)\nhashlib.sha384(??)\nhashlib.sha512(??)\nheapq.bisect(??)\nheapq.chain(*iterables) --> chain object\nheapq.count(start=0, step=1]) --> count object\nheapq.heapify(??)\nheapq.heappop(??)\nheapq.heappush(??)\nheapq.heappushpop(??)\nheapq.heapreplace(??)\nheapq.islice(iterable, [start,] stop [, step]) --> islice object\nheapq.merge(??)\nheapq.nlargest(??)\nheapq.nsmallest(??)\nheapq.repeat(object [,times]) -> create an iterator which returns the object\nheapq.tee(iterable, n=2) --> tuple of n independent iterators.\nhelp(??)\nhex(number) -> string\nhmac.HMAC(??)\nhmac.digest_size(??)\nhmac.new(??)\nhmac.trans_36\nhmac.trans_5C\nhtml.entities.codepoint2name(??)\nhtml.entities.entitydefs(??)\nhtml.entities.name2codepoint(??)\nhtml.parser.HTMLParseError(??)\nhtml.parser.HTMLParser(??)\nhtml.parser.attrfind(??)\nhtml.parser.charref(??)\nhtml.parser.commentclose(??)\nhtml.parser.endendtag(??)\nhtml.parser.endtagfind(??)\nhtml.parser.entityref(??)\nhtml.parser.incomplete(??)\nhtml.parser.interesting_cdata(??)\nhtml.parser.interesting_normal(??)\nhtml.parser.locatestarttagend(??)\nhtml.parser.piclose(??)\nhtml.parser.re(??)\nhtml.parser.starttagopen(??)\nhtml.parser.tagfind(??)\nhttp.client(??)\nhttp.client.ACCEPTED\nhttp.client.BAD_GATEWAY\nhttp.client.BAD_REQUEST\nhttp.client.BadStatusLine(??)\nhttp.client.CONFLICT\nhttp.client.CONTINUE\nhttp.client.CREATED\nhttp.client.CannotSendHeader(??)\nhttp.client.CannotSendRequest(??)\nhttp.client.EXPECTATION_FAILED\nhttp.client.FAILED_DEPENDENCY\nhttp.client.FORBIDDEN\nhttp.client.FOUND\nhttp.client.FakeSocket(??)\nhttp.client.GATEWAY_TIMEOUT\nhttp.client.GONE\nhttp.client.HTTPConnection(??)\nhttp.client.HTTPException(??)\nhttp.client.HTTPMessage(??)\nhttp.client.HTTPResponse(??)\nhttp.client.HTTPSConnection(??)\nhttp.client.HTTPS_PORT\nhttp.client.HTTP_PORT\nhttp.client.HTTP_VERSION_NOT_SUPPORTED\nhttp.client.IM_USED\nhttp.client.INSUFFICIENT_STORAGE\nhttp.client.INTERNAL_SERVER_ERROR\nhttp.client.ImproperConnectionState(??)\nhttp.client.IncompleteRead(??)\nhttp.client.InvalidURL(??)\nhttp.client.LENGTH_REQUIRED\nhttp.client.LOCKED\nhttp.client.LineAndFileWrapper(??)\nhttp.client.MAXAMOUNT\nhttp.client.METHOD_NOT_ALLOWED\nhttp.client.MOVED_PERMANENTLY\nhttp.client.MULTIPLE_CHOICES\nhttp.client.MULTI_STATUS\nhttp.client.NON_AUTHORITATIVE_INFORMATION\nhttp.client.NOT_ACCEPTABLE\nhttp.client.NOT_EXTENDED\nhttp.client.NOT_FOUND\nhttp.client.NOT_IMPLEMENTED\nhttp.client.NOT_MODIFIED\nhttp.client.NO_CONTENT\nhttp.client.NotConnected(??)\nhttp.client.OK\nhttp.client.PARTIAL_CONTENT\nhttp.client.PAYMENT_REQUIRED\nhttp.client.PRECONDITION_FAILED\nhttp.client.PROCESSING\nhttp.client.PROXY_AUTHENTICATION_REQUIRED\nhttp.client.REQUESTED_RANGE_NOT_SATISFIABLE\nhttp.client.REQUEST_ENTITY_TOO_LARGE\nhttp.client.REQUEST_TIMEOUT\nhttp.client.REQUEST_URI_TOO_LONG\nhttp.client.RESET_CONTENT\nhttp.client.ResponseNotReady(??)\nhttp.client.SEE_OTHER\nhttp.client.SERVICE_UNAVAILABLE\nhttp.client.SWITCHING_PROTOCOLS\nhttp.client.TEMPORARY_REDIRECT\nhttp.client.UNAUTHORIZED\nhttp.client.UNPROCESSABLE_ENTITY\nhttp.client.UNSUPPORTED_MEDIA_TYPE\nhttp.client.UPGRADE_REQUIRED\nhttp.client.USE_PROXY\nhttp.client.UnimplementedFileMode(??)\nhttp.client.UnknownProtocol(??)\nhttp.client.UnknownTransferEncoding(??)\nhttp.client.email(??)\nhttp.client.error(??)\nhttp.client.io(??)\nhttp.client.os(??)\nhttp.client.parse_headers(??)\nhttp.client.responses(??)\nhttp.client.socket(??)\nhttp.client.ssl(??)\nhttp.client.urlsplit(??)\nhttp.client.warnings(??)\nhttp.cookiejar.Absent(??)\nhttp.cookiejar.Cookie(??)\nhttp.cookiejar.CookieJar(??)\nhttp.cookiejar.CookiePolicy(??)\nhttp.cookiejar.DAYS(??)\nhttp.cookiejar.DEFAULT_HTTP_PORT\nhttp.cookiejar.DefaultCookiePolicy(??)\nhttp.cookiejar.EPOCH_YEAR\nhttp.cookiejar.ESCAPED_CHAR_RE(??)\nhttp.cookiejar.FileCookieJar(??)\nhttp.cookiejar.HEADER_ESCAPE_RE(??)\nhttp.cookiejar.HEADER_JOIN_ESCAPE_RE(??)\nhttp.cookiejar.HEADER_QUOTED_VALUE_RE(??)\nhttp.cookiejar.HEADER_TOKEN_RE(??)\nhttp.cookiejar.HEADER_VALUE_RE(??)\nhttp.cookiejar.HTTP_PATH_SAFE\nhttp.cookiejar.IPV4_RE(??)\nhttp.cookiejar.ISO_DATE_RE(??)\nhttp.cookiejar.LOOSE_HTTP_DATE_RE(??)\nhttp.cookiejar.LWPCookieJar(??)\nhttp.cookiejar.LoadError(??)\nhttp.cookiejar.MISSING_FILENAME_TEXT\nhttp.cookiejar.MONTHS(??)\nhttp.cookiejar.MONTHS_LOWER(??)\nhttp.cookiejar.MozillaCookieJar(??)\nhttp.cookiejar.STRICT_DATE_RE(??)\nhttp.cookiejar.TIMEZONE_RE(??)\nhttp.cookiejar.UTC_ZONES(??)\nhttp.cookiejar.WEEKDAY_RE(??)\nhttp.cookiejar.copy(??)\nhttp.cookiejar.cut_port_re(??)\nhttp.cookiejar.debug(??)\nhttp.cookiejar.deepvalues(??)\nhttp.cookiejar.domain_match(??)\nhttp.cookiejar.eff_request_host(??)\nhttp.cookiejar.escape_path(??)\nhttp.cookiejar.http(??)\nhttp.cookiejar.http2time(??)\nhttp.cookiejar.is_HDN(??)\nhttp.cookiejar.is_third_party(??)\nhttp.cookiejar.iso2time(??)\nhttp.cookiejar.join_header_words(??)\nhttp.cookiejar.liberal_is_HDN(??)\nhttp.cookiejar.logger(??)\nhttp.cookiejar.lwp_cookie_str(??)\nhttp.cookiejar.month\nhttp.cookiejar.offset_from_tz_string(??)\nhttp.cookiejar.parse_ns_headers(??)\nhttp.cookiejar.re(??)\nhttp.cookiejar.reach(??)\nhttp.cookiejar.request_host(??)\nhttp.cookiejar.request_path(??)\nhttp.cookiejar.request_port(??)\nhttp.cookiejar.split_header_words(??)\nhttp.cookiejar.time(??)\nhttp.cookiejar.time2isoz(??)\nhttp.cookiejar.time2netscape(??)\nhttp.cookiejar.timegm(??)\nhttp.cookiejar.unmatched(??)\nhttp.cookiejar.uppercase_escaped_char(??)\nhttp.cookiejar.urllib(??)\nhttp.cookiejar.user_domain_match(??)\nhttp.cookiejar.vals_sorted_by_key(??)\nhttp.cookies.BaseCookie(??)\nhttp.cookies.CookieError(??)\nhttp.cookies.Morsel(??)\nhttp.cookies.SimpleCookie(??)\nhttp.cookies.dumps(??)\nhttp.cookies.loads(??)\nhttp.cookies.re(??)\nhttp.cookies.string(??)\nhttp.cookies.warnings(??)\nhttp.server(??)\nhttp.server.BaseHTTPRequestHandler(??)\nhttp.server.CGIHTTPRequestHandler(??)\nhttp.server.DEFAULT_ERROR_CONTENT_TYPE\nhttp.server.DEFAULT_ERROR_MESSAGE\nhttp.server.HTTPServer(??)\nhttp.server.SimpleHTTPRequestHandler(??)\nhttp.server.cgi(??)\nhttp.server.email(??)\nhttp.server.executable(??)\nhttp.server.http(??)\nhttp.server.io(??)\nhttp.server.mimetypes(??)\nhttp.server.nobody(??)\nhttp.server.nobody_uid(??)\nhttp.server.os(??)\nhttp.server.posixpath(??)\nhttp.server.select(??)\nhttp.server.shutil(??)\nhttp.server.socket(??)\nhttp.server.socketserver(??)\nhttp.server.sys(??)\nhttp.server.test(??)\nhttp.server.time(??)\nhttp.server.urllib(??)\nid(object) -> integer\nimaplib.AllowedVersions(??)\nimaplib.CRLF\nimaplib.Commands(??)\nimaplib.Continuation(??)\nimaplib.Debug\nimaplib.Flags(??)\nimaplib.IMAP4(??)\nimaplib.IMAP4_PORT\nimaplib.IMAP4_SSL(??)\nimaplib.IMAP4_SSL_PORT\nimaplib.IMAP4_stream(??)\nimaplib.Int2AP(??)\nimaplib.InternalDate(??)\nimaplib.Internaldate2tuple(??)\nimaplib.Literal(??)\nimaplib.MapCRLF(??)\nimaplib.Mon2num(??)\nimaplib.ParseFlags(??)\nimaplib.Response_code(??)\nimaplib.Time2Internaldate(??)\nimaplib.Untagged_response(??)\nimaplib.Untagged_status(??)\nimaplib.binascii(??)\nimaplib.random(??)\nimaplib.re(??)\nimaplib.socket(??)\nimaplib.ssl(??)\nimaplib.subprocess(??)\nimaplib.sys(??)\nimaplib.time(??)\nimghdr.test(??)\nimghdr.test_bmp(??)\nimghdr.test_gif(??)\nimghdr.test_jpeg(??)\nimghdr.test_pbm(??)\nimghdr.test_pgm(??)\nimghdr.test_png(??)\nimghdr.test_ppm(??)\nimghdr.test_rast(??)\nimghdr.test_rgb(??)\nimghdr.test_tiff(??)\nimghdr.test_xbm(??)\nimghdr.testall(??)\nimghdr.tests(??)\nimghdr.what(??)\nimp.C_BUILTIN\nimp.C_EXTENSION\nimp.IMP_HOOK\nimp.NullImporter(??)\nimp.PKG_DIRECTORY\nimp.PY_CODERESOURCE\nimp.PY_COMPILED\nimp.PY_FROZEN\nimp.PY_RESOURCE\nimp.PY_SOURCE\nimp.SEARCH_ERROR\nimp.acquire_lock() -> None\nimp.find_module(name, [path]) -> (file, filename, (suffix, mode, type))\nimp.get_frozen_object(??)\nimp.get_magic() -> string\nimp.get_suffixes() -> [(suffix, mode, type), ...]\nimp.init_builtin(??)\nimp.init_frozen(??)\nimp.is_builtin(??)\nimp.is_frozen(??)\nimp.is_frozen_package(??)\nimp.load_compiled(??)\nimp.load_dynamic(??)\nimp.load_module(name, file, filename, (suffix, mode, type)) -> module\nimp.load_package(??)\nimp.load_source(??)\nimp.lock_held() -> boolean\nimp.new_module(name) -> module\nimp.release_lock() -> None\nimp.reload(module) -> module\nimportlib.abc.Finder(??)\nimportlib.abc.InspectLoader(??)\nimportlib.abc.Loader(??)\nimportlib.abc.PyLoader(??)\nimportlib.abc.PyPycLoader(??)\nimportlib.abc.ResourceLoader(??)\nimportlib.abc.abc(??)\nimportlib.abc.machinery(??)\nimportlib.abc.types(??)\nimportlib.errno(??)\nimportlib.imp(??)\nimportlib.import_module(??)\nimportlib.machinery(??)\nimportlib.machinery.BuiltinImporter(??)\nimportlib.machinery.FrozenImporter(??)\nimportlib.machinery.PathFinder(??)\nimportlib.marshal(??)\nimportlib.os(??)\nimportlib.re(??)\nimportlib.sep\nimportlib.sys(??)\nimportlib.tokenize(??)\nimportlib.util(??)\nimportlib.util.module_for_loader(??)\nimportlib.util.set_loader(??)\nimportlib.util.set_package(??)\ninput([prompt]) -> string\ninspect.ArgInfo(args, varargs, keywords, locals)\ninspect.ArgSpec(args, varargs, keywords, defaults)\ninspect.Arguments(args, varargs, varkw)\ninspect.Attribute(name, kind, defining_class, object)\ninspect.BlockFinder(??)\ninspect.CO_GENERATOR\ninspect.CO_NESTED\ninspect.CO_NEWLOCALS\ninspect.CO_NOFREE\ninspect.CO_OPTIMIZED\ninspect.CO_VARARGS\ninspect.CO_VARKEYWORDS\ninspect.EndOfBlock(??)\ninspect.FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)\ninspect.ModuleInfo(name, suffix, mode, module_type)\ninspect.TPFLAGS_IS_ABSTRACT\ninspect.Traceback(filename, lineno, function, code_context, index)\ninspect.attrgetter(attr, ...) --> attrgetter object\ninspect.classify_class_attrs(??)\ninspect.cleandoc(??)\ninspect.currentframe(??)\ninspect.dis(??)\ninspect.findsource(??)\ninspect.formatannotation(??)\ninspect.formatannotationrelativeto(??)\ninspect.formatargspec(??)\ninspect.formatargvalues(??)\ninspect.getabsfile(??)\ninspect.getargs(??)\ninspect.getargspec(??)\ninspect.getargvalues(??)\ninspect.getblock(??)\ninspect.getclasstree(??)\ninspect.getcomments(??)\ninspect.getdoc(??)\ninspect.getfile(??)\ninspect.getframeinfo(??)\ninspect.getfullargspec(??)\ninspect.getinnerframes(??)\ninspect.getlineno(??)\ninspect.getmembers(??)\ninspect.getmodule(??)\ninspect.getmoduleinfo(??)\ninspect.getmodulename(??)\ninspect.getmro(??)\ninspect.getouterframes(??)\ninspect.getsource(??)\ninspect.getsourcefile(??)\ninspect.getsourcelines(??)\ninspect.imp(??)\ninspect.indentsize(??)\ninspect.isabstract(??)\ninspect.isbuiltin(??)\ninspect.isclass(??)\ninspect.iscode(??)\ninspect.isdatadescriptor(??)\ninspect.isframe(??)\ninspect.isfunction(??)\ninspect.isgenerator(??)\ninspect.isgeneratorfunction(??)\ninspect.isgetsetdescriptor(??)\ninspect.ismemberdescriptor(??)\ninspect.ismethod(??)\ninspect.ismethoddescriptor(??)\ninspect.ismodule(??)\ninspect.isroutine(??)\ninspect.istraceback(??)\ninspect.joinseq(??)\ninspect.linecache(??)\ninspect.modulesbyfile(??)\ninspect.namedtuple(??)\ninspect.os(??)\ninspect.re(??)\ninspect.stack(??)\ninspect.string(??)\ninspect.strseq(??)\ninspect.sys(??)\ninspect.tokenize(??)\ninspect.trace(??)\ninspect.types(??)\ninspect.walktree(??)\nint(x[, base]) -> integer\nio.BlockingIOError(??)\nio.BufferedIOBase(??)\nio.BufferedRWPair(??)\nio.BufferedRandom(??)\nio.BufferedReader(??)\nio.BufferedWriter(??)\nio.BytesIO([buffer]) -> object\nio.DEFAULT_BUFFER_SIZE\nio.FileIO(??)\nio.IOBase(??)\nio.IncrementalNewlineDecoder(??)\nio.OpenWrapper(??)\nio.RawIOBase(??)\nio.SEEK_CUR\nio.SEEK_END\nio.SEEK_SET\nio.StringIO(??)\nio.TextIOBase(??)\nio.TextIOWrapper(??)\nio.UnsupportedOperation(??)\nio.abc(??)\nio.open(??)\nipaddr.BaseIP(??)\nipaddr.Error(??)\nipaddr.IP(??)\nipaddr.IPAddressExclusionError(??)\nipaddr.IPTypeError(??)\nipaddr.IPv4(??)\nipaddr.IPv4IpValidationError(??)\nipaddr.IPv4NetmaskValidationError(??)\nipaddr.IPv6(??)\nipaddr.IPv6IpValidationError(??)\nipaddr.IPv6NetmaskValidationError(??)\nipaddr.PrefixlenDiffInvalidError(??)\nipaddr.collapse_address_list(??)\nipaddr.struct(??)\nisinstance(object, class-or-type-or-tuple) -> bool\nissubclass(C, B) -> bool\niter(iterable) -> iterator\nitertools.chain(*iterables) --> chain object\nitertools.combinations(iterable[, r]) --> combinations object\nitertools.combinations_with_replacement(iterable[, r]) --> combinations_with_replacement object\nitertools.compress(data, selectors) --> iterator over selected data\nitertools.count(start=0, step=1]) --> count object\nitertools.cycle(iterable) --> cycle object\nitertools.dropwhile(predicate, iterable) --> dropwhile object\nitertools.filterfalse(function or None, sequence) --> filterfalse object\nitertools.groupby(iterable[, keyfunc]) -> create an iterator which returns\nitertools.islice(iterable, [start,] stop [, step]) --> islice object\nitertools.permutations(iterable[, r]) --> permutations object\nitertools.product(*iterables) --> product object\nitertools.repeat(object [,times]) -> create an iterator which returns the object\nitertools.starmap(function, sequence) --> starmap object\nitertools.takewhile(predicate, iterable) --> takewhile object\nitertools.tee(iterable, n=2) --> tuple of n independent iterators.\nitertools.zip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> zip_longest object\njson.JSONDecoder(??)\njson.JSONEncoder(??)\njson.decoder(??)\njson.decoder.BACKSLASH(??)\njson.decoder.FLAGS\njson.decoder.JSONArray(??)\njson.decoder.JSONDecoder(??)\njson.decoder.JSONObject(??)\njson.decoder.NaN\njson.decoder.NegInf\njson.decoder.PosInf\njson.decoder.STRINGCHUNK(??)\njson.decoder.WHITESPACE(??)\njson.decoder.WHITESPACE_STR\njson.decoder.binascii(??)\njson.decoder.c_scanstring(??)\njson.decoder.errmsg(??)\njson.decoder.linecol(??)\njson.decoder.make_scanner(??)\njson.decoder.py_scanstring(??)\njson.decoder.re(??)\njson.decoder.scanstring(basestring, end, strict=True) -> (bytes, end)\njson.decoder.struct(??)\njson.decoder.sys(??)\njson.dump(??)\njson.dumps(??)\njson.encoder(??)\njson.encoder.ESCAPE(??)\njson.encoder.ESCAPE_ASCII(??)\njson.encoder.ESCAPE_DCT(??)\njson.encoder.FLOAT_REPR(??)\njson.encoder.HAS_UTF8(??)\njson.encoder.INFINITY\njson.encoder.JSONEncoder(??)\njson.encoder.c_encode_basestring_ascii(??)\njson.encoder.c_make_encoder(??)\njson.encoder.encode_basestring(??)\njson.encoder.encode_basestring_ascii(basestring) -> bytes\njson.encoder.i\njson.encoder.py_encode_basestring_ascii(??)\njson.encoder.re(??)\njson.load(??)\njson.loads(??)\njson.scanner(??)\njson.scanner.NUMBER_RE(??)\njson.scanner.c_make_scanner(??)\njson.scanner.make_scanner(??)\njson.scanner.py_make_scanner(??)\njson.scanner.re(??)\njson.tool.json(??)\njson.tool.main(??)\njson.tool.sys(??)\nkeyword.iskeyword(??)\nkeyword.kwlist(??)\nkeyword.main(??)\nlen(object) -> integer\nlicense(??)\nlinecache.cache(??)\nlinecache.checkcache(??)\nlinecache.clearcache(??)\nlinecache.getline(??)\nlinecache.getlines(??)\nlinecache.os(??)\nlinecache.sys(??)\nlinecache.tokenize(??)\nlinecache.updatecache(??)\nlist() -> new list\nlocale.ABDAY_1\nlocale.ABDAY_2\nlocale.ABDAY_3\nlocale.ABDAY_4\nlocale.ABDAY_5\nlocale.ABDAY_6\nlocale.ABDAY_7\nlocale.ABMON_1\nlocale.ABMON_10\nlocale.ABMON_11\nlocale.ABMON_12\nlocale.ABMON_2\nlocale.ABMON_3\nlocale.ABMON_4\nlocale.ABMON_5\nlocale.ABMON_6\nlocale.ABMON_7\nlocale.ABMON_8\nlocale.ABMON_9\nlocale.ALT_DIGITS\nlocale.AM_STR\nlocale.CHAR_MAX\nlocale.CODESET\nlocale.CRNCYSTR\nlocale.DAY_1\nlocale.DAY_2\nlocale.DAY_3\nlocale.DAY_4\nlocale.DAY_5\nlocale.DAY_6\nlocale.DAY_7\nlocale.D_FMT\nlocale.D_T_FMT\nlocale.ERA\nlocale.ERA_D_FMT\nlocale.ERA_D_T_FMT\nlocale.ERA_T_FMT\nlocale.Error(??)\nlocale.LC_ALL\nlocale.LC_COLLATE\nlocale.LC_CTYPE\nlocale.LC_MESSAGES\nlocale.LC_MONETARY\nlocale.LC_NUMERIC\nlocale.LC_TIME\nlocale.MON_1\nlocale.MON_10\nlocale.MON_11\nlocale.MON_12\nlocale.MON_2\nlocale.MON_3\nlocale.MON_4\nlocale.MON_5\nlocale.MON_6\nlocale.MON_7\nlocale.MON_8\nlocale.MON_9\nlocale.NOEXPR\nlocale.PM_STR\nlocale.RADIXCHAR\nlocale.THOUSEP\nlocale.T_FMT\nlocale.T_FMT_AMPM\nlocale.YESEXPR\nlocale.atof(??)\nlocale.atoi(??)\nlocale.bind_textdomain_codeset(domain, codeset) -> string\nlocale.bindtextdomain(domain, dir) -> string\nlocale.collections(??)\nlocale.currency(??)\nlocale.dcgettext(domain, msg, category) -> string\nlocale.dgettext(domain, msg) -> string\nlocale.encodings(??)\nlocale.format(??)\nlocale.format_string(??)\nlocale.functools(??)\nlocale.getdefaultlocale(??)\nlocale.getlocale(??)\nlocale.getpreferredencoding(??)\nlocale.gettext(msg) -> string\nlocale.locale_alias(??)\nlocale.locale_encoding_alias(??)\nlocale.localeconv(??)\nlocale.nl_langinfo(key) -> string\nlocale.normalize(??)\nlocale.re(??)\nlocale.resetlocale(??)\nlocale.setlocale(??)\nlocale.str(??)\nlocale.strcoll(??)\nlocale.strxfrm(string) -> string.\nlocale.sys(??)\nlocale.textdomain(domain) -> string\nlocale.windows_locale(??)\nlocals() -> dictionary\nlogging.BASIC_FORMAT\nlogging.BufferingFormatter(??)\nlogging.CRITICAL\nlogging.DEBUG\nlogging.ERROR\nlogging.FATAL\nlogging.FileHandler(??)\nlogging.Filter(??)\nlogging.Filterer(??)\nlogging.Formatter(??)\nlogging.Handler(??)\nlogging.INFO\nlogging.LogRecord(??)\nlogging.Logger(??)\nlogging.LoggerAdapter(??)\nlogging.Manager(??)\nlogging.NOTSET\nlogging.NullHandler(??)\nlogging.PlaceHolder(??)\nlogging.RootLogger(??)\nlogging.StreamHandler(??)\nlogging.WARN\nlogging.WARNING\nlogging.addLevelName(??)\nlogging.atexit(??)\nlogging.basicConfig(??)\nlogging.captureWarnings(??)\nlogging.codecs(??)\nlogging.config.DEFAULT_LOGGING_CONFIG_PORT\nlogging.config.RESET_ERROR\nlogging.config.StreamRequestHandler(??)\nlogging.config.ThreadingTCPServer(??)\nlogging.config.fileConfig(??)\nlogging.config.listen(??)\nlogging.config.logging(??)\nlogging.config.os(??)\nlogging.config.socket(??)\nlogging.config.stopListening(??)\nlogging.config.struct(??)\nlogging.config.sys(??)\nlogging.config.thread(??)\nlogging.config.threading(??)\nlogging.config.traceback(??)\nlogging.critical(??)\nlogging.currentframe(??)\nlogging.debug(??)\nlogging.disable(??)\nlogging.error(??)\nlogging.exception(??)\nlogging.fatal(??)\nlogging.getLevelName(??)\nlogging.getLogger(??)\nlogging.getLoggerClass(??)\nlogging.handlers.BaseRotatingHandler(??)\nlogging.handlers.BufferingHandler(??)\nlogging.handlers.DEFAULT_HTTP_LOGGING_PORT\nlogging.handlers.DEFAULT_SOAP_LOGGING_PORT\nlogging.handlers.DEFAULT_TCP_LOGGING_PORT\nlogging.handlers.DEFAULT_UDP_LOGGING_PORT\nlogging.handlers.DatagramHandler(??)\nlogging.handlers.HTTPHandler(??)\nlogging.handlers.MemoryHandler(??)\nlogging.handlers.NTEventLogHandler(??)\nlogging.handlers.RotatingFileHandler(??)\nlogging.handlers.SMTPHandler(??)\nlogging.handlers.ST_DEV\nlogging.handlers.ST_INO\nlogging.handlers.SYSLOG_UDP_PORT\nlogging.handlers.SocketHandler(??)\nlogging.handlers.SysLogHandler(??)\nlogging.handlers.TimedRotatingFileHandler(??)\nlogging.handlers.WatchedFileHandler(??)\nlogging.handlers.codecs(??)\nlogging.handlers.logging(??)\nlogging.handlers.os(??)\nlogging.handlers.pickle(??)\nlogging.handlers.re(??)\nlogging.handlers.socket(??)\nlogging.handlers.struct(??)\nlogging.handlers.time(??)\nlogging.info(??)\nlogging.io(??)\nlogging.log(??)\nlogging.logMultiprocessing\nlogging.logProcesses\nlogging.logThreads\nlogging.makeLogRecord(??)\nlogging.os(??)\nlogging.raiseExceptions\nlogging.root(??)\nlogging.setLoggerClass(??)\nlogging.shutdown(??)\nlogging.sys(??)\nlogging.thread(??)\nlogging.threading(??)\nlogging.time(??)\nlogging.traceback(??)\nlogging.warn(??)\nlogging.warning(??)\nlogging.warnings(??)\nmacpath.SF_APPEND\nmacpath.SF_ARCHIVED\nmacpath.SF_IMMUTABLE\nmacpath.SF_NOUNLINK\nmacpath.SF_SNAPSHOT\nmacpath.ST_ATIME\nmacpath.ST_CTIME\nmacpath.ST_DEV\nmacpath.ST_GID\nmacpath.ST_INO\nmacpath.ST_MODE\nmacpath.ST_MTIME\nmacpath.ST_NLINK\nmacpath.ST_SIZE\nmacpath.ST_UID\nmacpath.S_ENFMT\nmacpath.S_IEXEC\nmacpath.S_IFBLK\nmacpath.S_IFCHR\nmacpath.S_IFDIR\nmacpath.S_IFIFO\nmacpath.S_IFLNK\nmacpath.S_IFMT(??)\nmacpath.S_IFREG\nmacpath.S_IFSOCK\nmacpath.S_IMODE(??)\nmacpath.S_IREAD\nmacpath.S_IRGRP\nmacpath.S_IROTH\nmacpath.S_IRUSR\nmacpath.S_IRWXG\nmacpath.S_IRWXO\nmacpath.S_IRWXU\nmacpath.S_ISBLK(??)\nmacpath.S_ISCHR(??)\nmacpath.S_ISDIR(??)\nmacpath.S_ISFIFO(??)\nmacpath.S_ISGID\nmacpath.S_ISLNK(??)\nmacpath.S_ISREG(??)\nmacpath.S_ISSOCK(??)\nmacpath.S_ISUID\nmacpath.S_ISVTX\nmacpath.S_IWGRP\nmacpath.S_IWOTH\nmacpath.S_IWRITE\nmacpath.S_IWUSR\nmacpath.S_IXGRP\nmacpath.S_IXOTH\nmacpath.S_IXUSR\nmacpath.UF_APPEND\nmacpath.UF_IMMUTABLE\nmacpath.UF_NODUMP\nmacpath.UF_NOUNLINK\nmacpath.UF_OPAQUE\nmacpath.abspath(??)\nmacpath.altsep(??)\nmacpath.basename(??)\nmacpath.commonprefix(??)\nmacpath.curdir\nmacpath.defpath\nmacpath.devnull\nmacpath.dirname(??)\nmacpath.exists(??)\nmacpath.expanduser(??)\nmacpath.expandvars(??)\nmacpath.extsep\nmacpath.genericpath(??)\nmacpath.getatime(??)\nmacpath.getctime(??)\nmacpath.getmtime(??)\nmacpath.getsize(??)\nmacpath.isabs(??)\nmacpath.isdir(??)\nmacpath.isfile(??)\nmacpath.islink(??)\nmacpath.ismount(??)\nmacpath.join(??)\nmacpath.lexists(??)\nmacpath.norm_error(??)\nmacpath.normcase(??)\nmacpath.normpath(??)\nmacpath.os(??)\nmacpath.pardir\nmacpath.pathsep\nmacpath.realpath(??)\nmacpath.sep\nmacpath.split(??)\nmacpath.splitdrive(??)\nmacpath.splitext(??)\nmacpath.supports_unicode_filenames(??)\nmacurl2path.os(??)\nmacurl2path.pathname2url(??)\nmacurl2path.test(??)\nmacurl2path.url2pathname(??)\nmacurl2path.urllib(??)\nmailbox.Babyl(??)\nmailbox.BabylMessage(??)\nmailbox.Error(??)\nmailbox.ExternalClashError(??)\nmailbox.FormatError(??)\nmailbox.MH(??)\nmailbox.MHMessage(??)\nmailbox.MMDF(??)\nmailbox.MMDFMessage(??)\nmailbox.Mailbox(??)\nmailbox.Maildir(??)\nmailbox.MaildirMessage(??)\nmailbox.Message(??)\nmailbox.NoSuchMailboxError(??)\nmailbox.NotEmptyError(??)\nmailbox.calendar(??)\nmailbox.copy(??)\nmailbox.email(??)\nmailbox.errno(??)\nmailbox.fcntl(??)\nmailbox.io(??)\nmailbox.mbox(??)\nmailbox.mboxMessage(??)\nmailbox.os(??)\nmailbox.socket(??)\nmailbox.sys(??)\nmailbox.time(??)\nmailcap.findmatch(??)\nmailcap.findparam(??)\nmailcap.getcaps(??)\nmailcap.listmailcapfiles(??)\nmailcap.lookup(??)\nmailcap.os(??)\nmailcap.parsefield(??)\nmailcap.parseline(??)\nmailcap.readmailcapfile(??)\nmailcap.show(??)\nmailcap.subst(??)\nmailcap.test(??)\nmap(func, *iterables) --> map object\nmarshal.dump(value, file[, version])\nmarshal.dumps(value[, version])\nmarshal.load(file)\nmarshal.loads(string)\nmarshal.version\nmath.acos(x)\nmath.acosh(x)\nmath.asin(x)\nmath.asinh(x)\nmath.atan(x)\nmath.atan2(y, x)\nmath.atanh(x)\nmath.ceil(x)\nmath.copysign(x,y)\nmath.cos(x)\nmath.cosh(x)\nmath.degrees(x) -> converts angle x from radians to degrees\nmath.e\nmath.exp(x)\nmath.fabs(x)\nmath.factorial(x) -> Integral\nmath.floor(x)\nmath.fmod(x,y)\nmath.frexp(x)\nmath.fsum(??)\nmath.hypot(x,y)\nmath.isinf(x) -> bool\nmath.isnan(x) -> bool\nmath.ldexp(x, i) -> x * (2**i)\nmath.log(x[, base]) -> the logarithm of x to the given base.\nmath.log10(x) -> the base 10 logarithm of x.\nmath.log1p(x)\nmath.modf(x)\nmath.pi\nmath.pow(x,y)\nmath.radians(x) -> converts angle x from degrees to radians\nmath.sin(x)\nmath.sinh(x)\nmath.sqrt(x)\nmath.tan(x)\nmath.tanh(x)\nmath.trunc(x:Real) -> Integral\nmax(iterable[, key=func]) -> value\nmemoryview(object)\nmimetypes.MimeTypes(??)\nmimetypes.add_type(??)\nmimetypes.common_types(??)\nmimetypes.encodings_map(??)\nmimetypes.guess_all_extensions(??)\nmimetypes.guess_extension(??)\nmimetypes.guess_type(??)\nmimetypes.init(??)\nmimetypes.inited(??)\nmimetypes.knownfiles(??)\nmimetypes.os(??)\nmimetypes.posixpath(??)\nmimetypes.read_mime_types(??)\nmimetypes.suffix_map(??)\nmimetypes.types_map(??)\nmimetypes.urllib(??)\nmin(iterable[, key=func]) -> value\nmmap.ACCESS_COPY\nmmap.ACCESS_READ\nmmap.ACCESS_WRITE\nmmap.ALLOCATIONGRANULARITY\nmmap.MAP_ANON\nmmap.MAP_ANONYMOUS\nmmap.MAP_DENYWRITE\nmmap.MAP_EXECUTABLE\nmmap.MAP_PRIVATE\nmmap.MAP_SHARED\nmmap.PAGESIZE\nmmap.PROT_EXEC\nmmap.PROT_READ\nmmap.PROT_WRITE\nmmap.error(??)\nmmap.mmap(??)\nmodulefinder.AddPackagePath(??)\nmodulefinder.HAVE_ARGUMENT\nmodulefinder.IMPORT_NAME\nmodulefinder.LOAD_CONST\nmodulefinder.Module(??)\nmodulefinder.ModuleFinder(??)\nmodulefinder.READ_MODE\nmodulefinder.ReplacePackage(??)\nmodulefinder.STORE_GLOBAL\nmodulefinder.STORE_NAME\nmodulefinder.STORE_OPS(??)\nmodulefinder.dis(??)\nmodulefinder.generators(??)\nmodulefinder.imp(??)\nmodulefinder.marshal(??)\nmodulefinder.os(??)\nmodulefinder.packagePathMap(??)\nmodulefinder.replacePackageMap(??)\nmodulefinder.struct(??)\nmodulefinder.sys(??)\nmodulefinder.test(??)\nmodulefinder.types(??)\nmultiprocessing.Array(??)\nmultiprocessing.AuthenticationError(??)\nmultiprocessing.BoundedSemaphore(??)\nmultiprocessing.BufferTooShort(??)\nmultiprocessing.Condition(??)\nmultiprocessing.Event(??)\nmultiprocessing.JoinableQueue(??)\nmultiprocessing.Lock(??)\nmultiprocessing.Manager(??)\nmultiprocessing.Pipe(??)\nmultiprocessing.Pool(??)\nmultiprocessing.Process(??)\nmultiprocessing.ProcessError(??)\nmultiprocessing.Queue(??)\nmultiprocessing.RLock(??)\nmultiprocessing.RawArray(??)\nmultiprocessing.RawValue(??)\nmultiprocessing.SUBDEBUG\nmultiprocessing.SUBWARNING\nmultiprocessing.Semaphore(??)\nmultiprocessing.TimeoutError(??)\nmultiprocessing.Value(??)\nmultiprocessing.active_children(??)\nmultiprocessing.allow_connection_pickling(??)\nmultiprocessing.connection(??)\nmultiprocessing.connection.AuthenticationError(??)\nmultiprocessing.connection.BUFSIZE\nmultiprocessing.connection.CHALLENGE\nmultiprocessing.connection.Client(??)\nmultiprocessing.connection.ConnectionWrapper(??)\nmultiprocessing.connection.FAILURE\nmultiprocessing.connection.Finalize(??)\nmultiprocessing.connection.Listener(??)\nmultiprocessing.connection.MESSAGE_LENGTH\nmultiprocessing.connection.Pipe(??)\nmultiprocessing.connection.SocketClient(??)\nmultiprocessing.connection.SocketListener(??)\nmultiprocessing.connection.WELCOME\nmultiprocessing.connection.XmlClient(??)\nmultiprocessing.connection.XmlListener(??)\nmultiprocessing.connection.address_type(??)\nmultiprocessing.connection.answer_challenge(??)\nmultiprocessing.connection.arbitrary_address(??)\nmultiprocessing.connection.close(fd)\nmultiprocessing.connection.current_process(??)\nmultiprocessing.connection.debug(??)\nmultiprocessing.connection.default_family\nmultiprocessing.connection.deliver_challenge(??)\nmultiprocessing.connection.duplicate(??)\nmultiprocessing.connection.errno(??)\nmultiprocessing.connection.families(??)\nmultiprocessing.connection.get_temp_dir(??)\nmultiprocessing.connection.itertools(??)\nmultiprocessing.connection.os(??)\nmultiprocessing.connection.socket(??)\nmultiprocessing.connection.sub_debug(??)\nmultiprocessing.connection.sys(??)\nmultiprocessing.connection.tempfile(??)\nmultiprocessing.connection.time(??)\nmultiprocessing.cpu_count(??)\nmultiprocessing.current_process(??)\nmultiprocessing.dummy(??)\nmultiprocessing.dummy.Array(??)\nmultiprocessing.dummy.BoundedSemaphore(??)\nmultiprocessing.dummy.Condition(??)\nmultiprocessing.dummy.DummyProcess(??)\nmultiprocessing.dummy.Event(??)\nmultiprocessing.dummy.JoinableQueue(??)\nmultiprocessing.dummy.Lock(??)\nmultiprocessing.dummy.Manager(??)\nmultiprocessing.dummy.Namespace(??)\nmultiprocessing.dummy.Pipe(??)\nmultiprocessing.dummy.Pool(??)\nmultiprocessing.dummy.Process(??)\nmultiprocessing.dummy.Queue(??)\nmultiprocessing.dummy.RLock(??)\nmultiprocessing.dummy.Semaphore(??)\nmultiprocessing.dummy.TimeoutError(??)\nmultiprocessing.dummy.Value(??)\nmultiprocessing.dummy.active_children(??)\nmultiprocessing.dummy.array(??)\nmultiprocessing.dummy.connection(??)\nmultiprocessing.dummy.connection.Client(??)\nmultiprocessing.dummy.connection.Connection(??)\nmultiprocessing.dummy.connection.Listener(??)\nmultiprocessing.dummy.connection.Pipe(??)\nmultiprocessing.dummy.connection.Queue(??)\nmultiprocessing.dummy.connection.families(??)\nmultiprocessing.dummy.cpu_count(??)\nmultiprocessing.dummy.current_process(??)\nmultiprocessing.dummy.dict() -> new empty dictionary.\nmultiprocessing.dummy.freeze_support(??)\nmultiprocessing.dummy.itertools(??)\nmultiprocessing.dummy.list() -> new list\nmultiprocessing.dummy.shutdown(??)\nmultiprocessing.dummy.sys(??)\nmultiprocessing.dummy.threading(??)\nmultiprocessing.dummy.weakref(??)\nmultiprocessing.forking(??)\nmultiprocessing.forking.ForkingPickler(??)\nmultiprocessing.forking.Pickler(??)\nmultiprocessing.forking.Popen(??)\nmultiprocessing.forking.assert_spawning(??)\nmultiprocessing.forking.close(fd)\nmultiprocessing.forking.duplicate(??)\nmultiprocessing.forking.exit(??)\nmultiprocessing.forking.old_main_modules(??)\nmultiprocessing.forking.os(??)\nmultiprocessing.forking.partial(func, *args, **keywords) - new function with partial application\nmultiprocessing.forking.prepare(??)\nmultiprocessing.forking.process(??)\nmultiprocessing.forking.signal(??)\nmultiprocessing.forking.sys(??)\nmultiprocessing.forking.time(??)\nmultiprocessing.forking.util(??)\nmultiprocessing.freeze_support(??)\nmultiprocessing.get_logger(??)\nmultiprocessing.heap.Arena(??)\nmultiprocessing.heap.BufferWrapper(??)\nmultiprocessing.heap.Finalize(??)\nmultiprocessing.heap.Heap(??)\nmultiprocessing.heap.assert_spawning(??)\nmultiprocessing.heap.bisect(??)\nmultiprocessing.heap.info(??)\nmultiprocessing.heap.itertools(??)\nmultiprocessing.heap.mmap(??)\nmultiprocessing.heap.os(??)\nmultiprocessing.heap.sys(??)\nmultiprocessing.heap.tempfile(??)\nmultiprocessing.heap.threading(??)\nmultiprocessing.log_to_stderr(??)\nmultiprocessing.managers.AcquirerProxy(??)\nmultiprocessing.managers.Array(??)\nmultiprocessing.managers.ArrayProxy(??)\nmultiprocessing.managers.AuthenticationString(??)\nmultiprocessing.managers.AutoProxy(??)\nmultiprocessing.managers.BaseListProxy(??)\nmultiprocessing.managers.BaseManager(??)\nmultiprocessing.managers.BaseProxy(??)\nmultiprocessing.managers.ConditionProxy(??)\nmultiprocessing.managers.DictProxy(??)\nmultiprocessing.managers.EventProxy(??)\nmultiprocessing.managers.Finalize(??)\nmultiprocessing.managers.ForkingPickler(??)\nmultiprocessing.managers.IteratorProxy(??)\nmultiprocessing.managers.ListProxy(??)\nmultiprocessing.managers.MakeProxyType(??)\nmultiprocessing.managers.Namespace(??)\nmultiprocessing.managers.NamespaceProxy(??)\nmultiprocessing.managers.PicklingError(??)\nmultiprocessing.managers.Pool(??)\nmultiprocessing.managers.PoolProxy(??)\nmultiprocessing.managers.Popen(??)\nmultiprocessing.managers.Process(??)\nmultiprocessing.managers.ProcessLocalSet(??)\nmultiprocessing.managers.RebuildProxy(??)\nmultiprocessing.managers.RemoteError(??)\nmultiprocessing.managers.Server(??)\nmultiprocessing.managers.State(??)\nmultiprocessing.managers.SyncManager(??)\nmultiprocessing.managers.Token(??)\nmultiprocessing.managers.Value(??)\nmultiprocessing.managers.ValueProxy(??)\nmultiprocessing.managers.active_children(??)\nmultiprocessing.managers.all_methods(??)\nmultiprocessing.managers.array(??)\nmultiprocessing.managers.assert_spawning(??)\nmultiprocessing.managers.connection(??)\nmultiprocessing.managers.convert_to_error(??)\nmultiprocessing.managers.copyreg(??)\nmultiprocessing.managers.current_process(??)\nmultiprocessing.managers.dispatch(??)\nmultiprocessing.managers.exit(??)\nmultiprocessing.managers.format_exc(??)\nmultiprocessing.managers.info(??)\nmultiprocessing.managers.listener_client(??)\nmultiprocessing.managers.os(??)\nmultiprocessing.managers.public_methods(??)\nmultiprocessing.managers.queue(??)\nmultiprocessing.managers.rebuild_as_list(??)\nmultiprocessing.managers.reduce_array(??)\nmultiprocessing.managers.sys(??)\nmultiprocessing.managers.threading(??)\nmultiprocessing.managers.util(??)\nmultiprocessing.managers.view_type(??)\nmultiprocessing.managers.view_types(??)\nmultiprocessing.managers.weakref(??)\nmultiprocessing.os(??)\nmultiprocessing.pool(??)\nmultiprocessing.pool.ApplyResult(??)\nmultiprocessing.pool.CLOSE\nmultiprocessing.pool.Finalize(??)\nmultiprocessing.pool.IMapIterator(??)\nmultiprocessing.pool.IMapUnorderedIterator(??)\nmultiprocessing.pool.MapResult(??)\nmultiprocessing.pool.Pool(??)\nmultiprocessing.pool.Process(??)\nmultiprocessing.pool.RUN\nmultiprocessing.pool.TERMINATE\nmultiprocessing.pool.ThreadPool(??)\nmultiprocessing.pool.TimeoutError(??)\nmultiprocessing.pool.collections(??)\nmultiprocessing.pool.cpu_count(??)\nmultiprocessing.pool.debug(??)\nmultiprocessing.pool.itertools(??)\nmultiprocessing.pool.job_counter(??)\nmultiprocessing.pool.mapstar(??)\nmultiprocessing.pool.queue(??)\nmultiprocessing.pool.threading(??)\nmultiprocessing.pool.time(??)\nmultiprocessing.pool.worker(??)\nmultiprocessing.process(??)\nmultiprocessing.process.AuthenticationString(??)\nmultiprocessing.process.ORIGINAL_DIR\nmultiprocessing.process.Process(??)\nmultiprocessing.process.active_children(??)\nmultiprocessing.process.current_process(??)\nmultiprocessing.process.itertools(??)\nmultiprocessing.process.name\nmultiprocessing.process.os(??)\nmultiprocessing.process.signal(??)\nmultiprocessing.process.signum(??)\nmultiprocessing.process.sys(??)\nmultiprocessing.queues.BoundedSemaphore(??)\nmultiprocessing.queues.Condition(??)\nmultiprocessing.queues.Empty(??)\nmultiprocessing.queues.Finalize(??)\nmultiprocessing.queues.Full(??)\nmultiprocessing.queues.JoinableQueue(??)\nmultiprocessing.queues.Lock(??)\nmultiprocessing.queues.Pipe(??)\nmultiprocessing.queues.Queue(??)\nmultiprocessing.queues.Semaphore(??)\nmultiprocessing.queues.SimpleQueue(??)\nmultiprocessing.queues.assert_spawning(??)\nmultiprocessing.queues.atexit(??)\nmultiprocessing.queues.collections(??)\nmultiprocessing.queues.debug(??)\nmultiprocessing.queues.info(??)\nmultiprocessing.queues.os(??)\nmultiprocessing.queues.register_after_fork(??)\nmultiprocessing.queues.sys(??)\nmultiprocessing.queues.threading(??)\nmultiprocessing.queues.time(??)\nmultiprocessing.queues.weakref(??)\nmultiprocessing.reduction.Client(??)\nmultiprocessing.reduction.ForkingPickler(??)\nmultiprocessing.reduction.Listener(??)\nmultiprocessing.reduction.Popen(??)\nmultiprocessing.reduction.close(fd)\nmultiprocessing.reduction.current_process(??)\nmultiprocessing.reduction.debug(??)\nmultiprocessing.reduction.duplicate(??)\nmultiprocessing.reduction.fromfd(??)\nmultiprocessing.reduction.os(??)\nmultiprocessing.reduction.rebuild_connection(??)\nmultiprocessing.reduction.rebuild_handle(??)\nmultiprocessing.reduction.rebuild_socket(??)\nmultiprocessing.reduction.recv_handle(??)\nmultiprocessing.reduction.reduce_connection(??)\nmultiprocessing.reduction.reduce_handle(??)\nmultiprocessing.reduction.reduce_socket(??)\nmultiprocessing.reduction.register_after_fork(??)\nmultiprocessing.reduction.send_handle(??)\nmultiprocessing.reduction.socket(??)\nmultiprocessing.reduction.sub_debug(??)\nmultiprocessing.reduction.sys(??)\nmultiprocessing.reduction.threading(??)\nmultiprocessing.sharedctypes.Array(??)\nmultiprocessing.sharedctypes.ForkingPickler(??)\nmultiprocessing.sharedctypes.RLock(??)\nmultiprocessing.sharedctypes.RawArray(??)\nmultiprocessing.sharedctypes.RawValue(??)\nmultiprocessing.sharedctypes.Synchronized(??)\nmultiprocessing.sharedctypes.SynchronizedArray(??)\nmultiprocessing.sharedctypes.SynchronizedBase(??)\nmultiprocessing.sharedctypes.SynchronizedString(??)\nmultiprocessing.sharedctypes.Value(??)\nmultiprocessing.sharedctypes.assert_spawning(??)\nmultiprocessing.sharedctypes.class_cache(??)\nmultiprocessing.sharedctypes.copy(??)\nmultiprocessing.sharedctypes.ctypes(??)\nmultiprocessing.sharedctypes.heap(??)\nmultiprocessing.sharedctypes.make_property(??)\nmultiprocessing.sharedctypes.prop_cache(??)\nmultiprocessing.sharedctypes.rebuild_ctype(??)\nmultiprocessing.sharedctypes.reduce_ctype(??)\nmultiprocessing.sharedctypes.synchronized(??)\nmultiprocessing.sharedctypes.sys(??)\nmultiprocessing.sharedctypes.template\nmultiprocessing.sharedctypes.typecode_to_type(??)\nmultiprocessing.sharedctypes.weakref(??)\nmultiprocessing.synchronize.BoundedSemaphore(??)\nmultiprocessing.synchronize.Condition(??)\nmultiprocessing.synchronize.Event(??)\nmultiprocessing.synchronize.Finalize(??)\nmultiprocessing.synchronize.Lock(??)\nmultiprocessing.synchronize.Popen(??)\nmultiprocessing.synchronize.RECURSIVE_MUTEX\nmultiprocessing.synchronize.RLock(??)\nmultiprocessing.synchronize.SEMAPHORE\nmultiprocessing.synchronize.SEM_VALUE_MAX\nmultiprocessing.synchronize.SemLock(??)\nmultiprocessing.synchronize.Semaphore(??)\nmultiprocessing.synchronize.assert_spawning(??)\nmultiprocessing.synchronize.current_process(??)\nmultiprocessing.synchronize.debug(??)\nmultiprocessing.synchronize.os(??)\nmultiprocessing.synchronize.register_after_fork(??)\nmultiprocessing.synchronize.sys(??)\nmultiprocessing.synchronize.threading(??)\nmultiprocessing.sys(??)\nmultiprocessing.util(??)\nmultiprocessing.util.DEBUG\nmultiprocessing.util.DEFAULT_LOGGING_FORMAT\nmultiprocessing.util.Finalize(??)\nmultiprocessing.util.ForkAwareLocal(??)\nmultiprocessing.util.ForkAwareThreadLock(??)\nmultiprocessing.util.INFO\nmultiprocessing.util.LOGGER_NAME\nmultiprocessing.util.NOTSET\nmultiprocessing.util.SUBDEBUG\nmultiprocessing.util.SUBWARNING\nmultiprocessing.util.active_children(??)\nmultiprocessing.util.atexit(??)\nmultiprocessing.util.current_process(??)\nmultiprocessing.util.debug(??)\nmultiprocessing.util.get_logger(??)\nmultiprocessing.util.get_temp_dir(??)\nmultiprocessing.util.info(??)\nmultiprocessing.util.is_exiting(??)\nmultiprocessing.util.itertools(??)\nmultiprocessing.util.log_to_stderr(??)\nmultiprocessing.util.register_after_fork(??)\nmultiprocessing.util.sub_debug(??)\nmultiprocessing.util.sub_warning(??)\nmultiprocessing.util.threading(??)\nmultiprocessing.util.weakref(??)\nnetrc.NetrcParseError(??)\nnetrc.netrc(??)\nnetrc.os(??)\nnetrc.shlex(??)\nnext(iterator[, default])\nnis.cat(map, domain = defaultdomain)\nnis.error(??)\nnis.get_default_domain() -> str\nnis.maps(domain = defaultdomain)\nnis.match(key, map, domain = defaultdomain)\nnntplib.CRLF\nnntplib.LONGRESP(??)\nnntplib.NNTP(??)\nnntplib.NNTPDataError(??)\nnntplib.NNTPError(??)\nnntplib.NNTPPermanentError(??)\nnntplib.NNTPProtocolError(??)\nnntplib.NNTPReplyError(??)\nnntplib.NNTPTemporaryError(??)\nnntplib.NNTP_PORT\nnntplib.error_data(??)\nnntplib.error_perm(??)\nnntplib.error_proto(??)\nnntplib.error_reply(??)\nnntplib.error_temp(??)\nnntplib.re(??)\nnntplib.socket(??)\nnumbers.ABCMeta(??)\nnumbers.Complex(??)\nnumbers.Integral(??)\nnumbers.Number(??)\nnumbers.Rational(??)\nnumbers.Real(??)\nnumbers.abstractmethod(??)\nnumbers.abstractproperty(??)\nobject(??)\noct(number) -> string\nopen(??)\noperator.abs(a) -- Same as abs(a).\noperator.add(a, b) -- Same as a + b.\noperator.and_(a, b) -- Same as a & b.\noperator.attrgetter(attr, ...) --> attrgetter object\noperator.concat(a, b) -- Same as a + b, for a and b sequences.\noperator.contains(a, b) -- Same as b in a (note reversed operands).\noperator.countOf(a, b) -- Return the number of times b occurs in a.\noperator.delitem(a, b) -- Same as del a[b].\noperator.eq(a, b) -- Same as a==b.\noperator.floordiv(a, b) -- Same as a // b.\noperator.ge(a, b) -- Same as a>=b.\noperator.getitem(a, b) -- Same as a[b].\noperator.gt(a, b) -- Same as a>b.\noperator.iadd(a, b) -- Same as a += b.\noperator.iand(a, b) -- Same as a &= b.\noperator.iconcat(a, b) -- Same as a += b, for a and b sequences.\noperator.ifloordiv(a, b) -- Same as a //= b.\noperator.ilshift(a, b) -- Same as a <<= b.\noperator.imod(a, b) -- Same as a %= b.\noperator.imul(a, b) -- Same as a *= b.\noperator.index(a) -- Same as a.__index__()\noperator.indexOf(a, b) -- Return the first index of b in a.\noperator.inv(a) -- Same as ~a.\noperator.invert(a) -- Same as ~a.\noperator.ior(a, b) -- Same as a |= b.\noperator.ipow(a, b) -- Same as a **= b.\noperator.irshift(a, b) -- Same as a >>= b.\noperator.is_(a, b) -- Same as a is b.\noperator.is_not(a, b) -- Same as a is not b.\noperator.isub(a, b) -- Same as a -= b.\noperator.itemgetter(item, ...) --> itemgetter object\noperator.itruediv(a, b) -- Same as a /= b.\noperator.ixor(a, b) -- Same as a ^= b.\noperator.le(a, b) -- Same as a<=b.\noperator.lshift(a, b) -- Same as a << b.\noperator.lt(a, b) -- Same as a<b.\noperator.methodcaller(name, ...) --> methodcaller object\noperator.mod(a, b) -- Same as a % b.\noperator.mul(a, b) -- Same as a * b.\noperator.ne(a, b) -- Same as a!=b.\noperator.neg(a) -- Same as -a.\noperator.not_(a) -- Same as not a.\noperator.or_(a, b) -- Same as a | b.\noperator.pos(a) -- Same as +a.\noperator.pow(a, b) -- Same as a ** b.\noperator.rshift(a, b) -- Same as a >> b.\noperator.setitem(a, b, c) -- Same as a[b] = c.\noperator.sub(a, b) -- Same as a - b.\noperator.truediv(a, b) -- Same as a / b.\noperator.truth(a) -- Return True if a is true, False otherwise.\noperator.xor(a, b) -- Same as a ^ b.\noptparse.AmbiguousOptionError(??)\noptparse.BadOptionError(??)\noptparse.HelpFormatter(??)\noptparse.IndentedHelpFormatter(??)\noptparse.NO_DEFAULT(??)\noptparse.OptParseError(??)\noptparse.Option(??)\noptparse.OptionConflictError(??)\noptparse.OptionContainer(??)\noptparse.OptionError(??)\noptparse.OptionGroup(??)\noptparse.OptionParser(??)\noptparse.OptionValueError(??)\noptparse.SUPPRESS_HELP\noptparse.SUPPRESS_USAGE\noptparse.TitledHelpFormatter(??)\noptparse.Values(??)\noptparse.check_builtin(??)\noptparse.check_choice(??)\noptparse.gettext(??)\noptparse.make_option(??)\noptparse.os(??)\noptparse.sys(??)\noptparse.textwrap(??)\nord(c) -> integer\nos.EX_CANTCREAT\nos.EX_CONFIG\nos.EX_DATAERR\nos.EX_IOERR\nos.EX_NOHOST\nos.EX_NOINPUT\nos.EX_NOPERM\nos.EX_NOUSER\nos.EX_OK\nos.EX_OSERR\nos.EX_OSFILE\nos.EX_PROTOCOL\nos.EX_SOFTWARE\nos.EX_TEMPFAIL\nos.EX_UNAVAILABLE\nos.EX_USAGE\nos.F_OK\nos.MutableMapping(??)\nos.NGROUPS_MAX\nos.O_APPEND\nos.O_ASYNC\nos.O_CREAT\nos.O_DIRECT\nos.O_DIRECTORY\nos.O_DSYNC\nos.O_EXCL\nos.O_LARGEFILE\nos.O_NDELAY\nos.O_NOATIME\nos.O_NOCTTY\nos.O_NOFOLLOW\nos.O_NONBLOCK\nos.O_RDONLY\nos.O_RDWR\nos.O_RSYNC\nos.O_SYNC\nos.O_TRUNC\nos.O_WRONLY\nos.P_NOWAIT\nos.P_NOWAITO\nos.P_WAIT\nos.R_OK\nos.SEEK_CUR\nos.SEEK_END\nos.SEEK_SET\nos.TMP_MAX\nos.WCONTINUED\nos.WCOREDUMP(status) -> bool\nos.WEXITSTATUS(status) -> integer\nos.WIFCONTINUED(status) -> bool\nos.WIFEXITED(status) -> bool\nos.WIFSIGNALED(status) -> bool\nos.WIFSTOPPED(status) -> bool\nos.WNOHANG\nos.WSTOPSIG(status) -> integer\nos.WTERMSIG(status) -> integer\nos.WUNTRACED\nos.W_OK\nos.X_OK\nos.abort() -> does not return!\nos.access(path, mode) -> True if granted, False otherwise\nos.altsep(??)\nos.chdir(path)\nos.chmod(path, mode)\nos.chown(path, uid, gid)\nos.chroot(path)\nos.close(fd)\nos.closerange(fd_low, fd_high)\nos.confstr(name) -> string\nos.confstr_names(??)\nos.ctermid() -> string\nos.curdir\nos.defpath\nos.device_encoding(fd) -> str\nos.devnull\nos.dup(fd) -> fd2\nos.dup2(old_fd, new_fd)\nos.environ(??)\nos.errno(??)\nos.error(??)\nos.execl(file, *args)\nos.execle(file, *args, env)\nos.execlp(file, *args)\nos.execlpe(file, *args, env)\nos.execv(path, args)\nos.execve(path, args, env)\nos.execvp(??)\nos.execvpe(file, args, env)\nos.extsep\nos.fchdir(fildes)\nos.fchmod(fd, mode)\nos.fchown(fd, uid, gid)\nos.fdatasync(fildes)\nos.fdopen(??)\nos.fork() -> pid\nos.forkpty() -> (pid, master_fd)\nos.fpathconf(fd, name) -> integer\nos.fstat(fd) -> stat result\nos.fstatvfs(fd) -> statvfs result\nos.fsync(fildes)\nos.ftruncate(fd, length)\nos.getcwd() -> path\nos.getcwdb() -> path\nos.getegid() -> egid\nos.getenv(??)\nos.geteuid() -> euid\nos.getgid() -> gid\nos.getgroups() -> list of group IDs\nos.getloadavg() -> (float, float, float)\nos.getlogin() -> string\nos.getpgid(pid) -> pgid\nos.getpgrp() -> pgrp\nos.getpid() -> pid\nos.getppid() -> ppid\nos.getsid(pid) -> sid\nos.getuid() -> uid\nos.isatty(fd) -> bool\nos.kill(pid, sig)\nos.killpg(pgid, sig)\nos.lchown(path, uid, gid)\nos.linesep\nos.link(src, dst)\nos.listdir(path) -> list_of_strings\nos.lseek(fd, pos, how) -> newpos\nos.lstat(path) -> stat result\nos.major(device) -> major number\nos.makedev(major, minor) -> device number\nos.makedirs(path [, mode=0o777])\nos.minor(device) -> minor number\nos.mkdir(path [, mode=0777])\nos.mkfifo(filename [, mode=0666])\nos.mknod(filename [, mode=0600, device])\nos.name\nos.nice(inc) -> new_priority\nos.open(filename, flag [, mode=0777]) -> fd\nos.openpty() -> (master_fd, slave_fd)\nos.pardir\nos.path(??)\nos.pathconf(path, name) -> integer\nos.pathconf_names(??)\nos.pathsep\nos.pipe() -> (read_end, write_end)\nos.popen(??)\nos.putenv(key, value)\nos.read(fd, buffersize) -> string\nos.readlink(path) -> path\nos.remove(path)\nos.removedirs(path)\nos.rename(old, new)\nos.renames(old, new)\nos.rmdir(path)\nos.sep\nos.setegid(gid)\nos.seteuid(uid)\nos.setgid(gid)\nos.setgroups(list)\nos.setpgid(pid, pgrp)\nos.setpgrp()\nos.setregid(rgid, egid)\nos.setreuid(ruid, euid)\nos.setsid()\nos.setuid(uid)\nos.spawnl(mode, file, *args) -> integer\nos.spawnle(mode, file, *args, env) -> integer\nos.spawnlp(mode, file, *args) -> integer\nos.spawnlpe(mode, file, *args, env) -> integer\nos.spawnv(mode, file, args) -> integer\nos.spawnve(mode, file, args, env) -> integer\nos.spawnvp(mode, file, args) -> integer\nos.spawnvpe(mode, file, args, env) -> integer\nos.stat(path) -> stat result\nos.stat_float_times([newval]) -> oldval\nos.stat_result(??)\nos.statvfs(path) -> statvfs result\nos.statvfs_result(??)\nos.strerror(code) -> string\nos.symlink(src, dst)\nos.sys(??)\nos.sysconf(name) -> integer\nos.sysconf_names(??)\nos.system(command) -> exit_status\nos.tcgetpgrp(fd) -> pgid\nos.tcsetpgrp(fd, pgid)\nos.times() -> (utime, stime, cutime, cstime, elapsed_time)\nos.ttyname(fd) -> string\nos.umask(new_mask) -> old_mask\nos.uname() -> (sysname, nodename, release, version, machine)\nos.unlink(path)\nos.unsetenv(key)\nos.urandom(n) -> str\nos.utime(path, (atime, mtime))\nos.wait() -> (pid, status)\nos.wait3(options) -> (pid, status, rusage)\nos.wait4(pid, options) -> (pid, status, rusage)\nos.waitpid(pid, options) -> (pid, status)\nos.walk(??)\nos.write(fd, string) -> byteswritten\nossaudiodev.AFMT_AC3\nossaudiodev.AFMT_A_LAW\nossaudiodev.AFMT_IMA_ADPCM\nossaudiodev.AFMT_MPEG\nossaudiodev.AFMT_MU_LAW\nossaudiodev.AFMT_QUERY\nossaudiodev.AFMT_S16_BE\nossaudiodev.AFMT_S16_LE\nossaudiodev.AFMT_S16_NE\nossaudiodev.AFMT_S8\nossaudiodev.AFMT_U16_BE\nossaudiodev.AFMT_U16_LE\nossaudiodev.AFMT_U8\nossaudiodev.OSSAudioError(??)\nossaudiodev.SNDCTL_COPR_HALT\nossaudiodev.SNDCTL_COPR_LOAD\nossaudiodev.SNDCTL_COPR_RCODE\nossaudiodev.SNDCTL_COPR_RCVMSG\nossaudiodev.SNDCTL_COPR_RDATA\nossaudiodev.SNDCTL_COPR_RESET\nossaudiodev.SNDCTL_COPR_RUN\nossaudiodev.SNDCTL_COPR_SENDMSG\nossaudiodev.SNDCTL_COPR_WCODE\nossaudiodev.SNDCTL_COPR_WDATA\nossaudiodev.SNDCTL_DSP_BIND_CHANNEL\nossaudiodev.SNDCTL_DSP_CHANNELS\nossaudiodev.SNDCTL_DSP_GETBLKSIZE\nossaudiodev.SNDCTL_DSP_GETCAPS\nossaudiodev.SNDCTL_DSP_GETCHANNELMASK\nossaudiodev.SNDCTL_DSP_GETFMTS\nossaudiodev.SNDCTL_DSP_GETIPTR\nossaudiodev.SNDCTL_DSP_GETISPACE\nossaudiodev.SNDCTL_DSP_GETODELAY\nossaudiodev.SNDCTL_DSP_GETOPTR\nossaudiodev.SNDCTL_DSP_GETOSPACE\nossaudiodev.SNDCTL_DSP_GETSPDIF\nossaudiodev.SNDCTL_DSP_GETTRIGGER\nossaudiodev.SNDCTL_DSP_MAPINBUF\nossaudiodev.SNDCTL_DSP_MAPOUTBUF\nossaudiodev.SNDCTL_DSP_NONBLOCK\nossaudiodev.SNDCTL_DSP_POST\nossaudiodev.SNDCTL_DSP_PROFILE\nossaudiodev.SNDCTL_DSP_RESET\nossaudiodev.SNDCTL_DSP_SAMPLESIZE\nossaudiodev.SNDCTL_DSP_SETDUPLEX\nossaudiodev.SNDCTL_DSP_SETFMT\nossaudiodev.SNDCTL_DSP_SETFRAGMENT\nossaudiodev.SNDCTL_DSP_SETSPDIF\nossaudiodev.SNDCTL_DSP_SETSYNCRO\nossaudiodev.SNDCTL_DSP_SETTRIGGER\nossaudiodev.SNDCTL_DSP_SPEED\nossaudiodev.SNDCTL_DSP_STEREO\nossaudiodev.SNDCTL_DSP_SUBDIVIDE\nossaudiodev.SNDCTL_DSP_SYNC\nossaudiodev.SNDCTL_FM_4OP_ENABLE\nossaudiodev.SNDCTL_FM_LOAD_INSTR\nossaudiodev.SNDCTL_MIDI_INFO\nossaudiodev.SNDCTL_MIDI_MPUCMD\nossaudiodev.SNDCTL_MIDI_MPUMODE\nossaudiodev.SNDCTL_MIDI_PRETIME\nossaudiodev.SNDCTL_SEQ_CTRLRATE\nossaudiodev.SNDCTL_SEQ_GETINCOUNT\nossaudiodev.SNDCTL_SEQ_GETOUTCOUNT\nossaudiodev.SNDCTL_SEQ_GETTIME\nossaudiodev.SNDCTL_SEQ_NRMIDIS\nossaudiodev.SNDCTL_SEQ_NRSYNTHS\nossaudiodev.SNDCTL_SEQ_OUTOFBAND\nossaudiodev.SNDCTL_SEQ_PANIC\nossaudiodev.SNDCTL_SEQ_PERCMODE\nossaudiodev.SNDCTL_SEQ_RESET\nossaudiodev.SNDCTL_SEQ_RESETSAMPLES\nossaudiodev.SNDCTL_SEQ_SYNC\nossaudiodev.SNDCTL_SEQ_TESTMIDI\nossaudiodev.SNDCTL_SEQ_THRESHOLD\nossaudiodev.SNDCTL_SYNTH_CONTROL\nossaudiodev.SNDCTL_SYNTH_ID\nossaudiodev.SNDCTL_SYNTH_INFO\nossaudiodev.SNDCTL_SYNTH_MEMAVL\nossaudiodev.SNDCTL_SYNTH_REMOVESAMPLE\nossaudiodev.SNDCTL_TMR_CONTINUE\nossaudiodev.SNDCTL_TMR_METRONOME\nossaudiodev.SNDCTL_TMR_SELECT\nossaudiodev.SNDCTL_TMR_SOURCE\nossaudiodev.SNDCTL_TMR_START\nossaudiodev.SNDCTL_TMR_STOP\nossaudiodev.SNDCTL_TMR_TEMPO\nossaudiodev.SNDCTL_TMR_TIMEBASE\nossaudiodev.SOUND_MIXER_ALTPCM\nossaudiodev.SOUND_MIXER_BASS\nossaudiodev.SOUND_MIXER_CD\nossaudiodev.SOUND_MIXER_DIGITAL1\nossaudiodev.SOUND_MIXER_DIGITAL2\nossaudiodev.SOUND_MIXER_DIGITAL3\nossaudiodev.SOUND_MIXER_IGAIN\nossaudiodev.SOUND_MIXER_IMIX\nossaudiodev.SOUND_MIXER_LINE\nossaudiodev.SOUND_MIXER_LINE1\nossaudiodev.SOUND_MIXER_LINE2\nossaudiodev.SOUND_MIXER_LINE3\nossaudiodev.SOUND_MIXER_MIC\nossaudiodev.SOUND_MIXER_MONITOR\nossaudiodev.SOUND_MIXER_NRDEVICES\nossaudiodev.SOUND_MIXER_OGAIN\nossaudiodev.SOUND_MIXER_PCM\nossaudiodev.SOUND_MIXER_PHONEIN\nossaudiodev.SOUND_MIXER_PHONEOUT\nossaudiodev.SOUND_MIXER_RADIO\nossaudiodev.SOUND_MIXER_RECLEV\nossaudiodev.SOUND_MIXER_SPEAKER\nossaudiodev.SOUND_MIXER_SYNTH\nossaudiodev.SOUND_MIXER_TREBLE\nossaudiodev.SOUND_MIXER_VIDEO\nossaudiodev.SOUND_MIXER_VOLUME\nossaudiodev.control_labels(??)\nossaudiodev.control_names(??)\nossaudiodev.error(??)\nossaudiodev.open(??)\nossaudiodev.openmixer(??)\nparser.ParserError(??)\nparser.STType(??)\nparser.compilest(??)\nparser.expr(??)\nparser.isexpr(??)\nparser.issuite(??)\nparser.sequence2st(??)\nparser.st2list(??)\nparser.st2tuple(??)\nparser.suite(??)\nparser.tuple2st(??)\npdb.Pdb(??)\npdb.Repr(??)\npdb.Restart(??)\npdb.TESTCMD\npdb.bdb(??)\npdb.cmd(??)\npdb.find_function(??)\npdb.help(??)\npdb.line_prefix\npdb.linecache(??)\npdb.main(??)\npdb.os(??)\npdb.pm(??)\npdb.post_mortem(??)\npdb.pprint(??)\npdb.re(??)\npdb.run(??)\npdb.runcall(??)\npdb.runctx(??)\npdb.runeval(??)\npdb.set_trace(??)\npdb.sys(??)\npdb.test(??)\npdb.traceback(??)\npickle.APPEND\npickle.APPENDS\npickle.BINBYTES\npickle.BINFLOAT\npickle.BINGET\npickle.BININT\npickle.BININT1\npickle.BININT2\npickle.BINPERSID\npickle.BINPUT\npickle.BINSTRING\npickle.BINUNICODE\npickle.BUILD\npickle.BuiltinFunctionType(??)\npickle.DEFAULT_PROTOCOL\npickle.DICT\npickle.DUP\npickle.EMPTY_DICT\npickle.EMPTY_LIST\npickle.EMPTY_TUPLE\npickle.EXT1\npickle.EXT2\npickle.EXT4\npickle.FALSE\npickle.FLOAT\npickle.FunctionType(??)\npickle.GET\npickle.GLOBAL\npickle.HIGHEST_PROTOCOL\npickle.INST\npickle.INT\npickle.LIST\npickle.LONG\npickle.LONG1\npickle.LONG4\npickle.LONG_BINGET\npickle.LONG_BINPUT\npickle.MARK\npickle.NEWFALSE\npickle.NEWOBJ\npickle.NEWTRUE\npickle.NONE\npickle.OBJ\npickle.PERSID\npickle.POP\npickle.POP_MARK\npickle.PROTO\npickle.PUT\npickle.PickleError(??)\npickle.Pickler(file, protocol=None)\npickle.PicklingError(??)\npickle.PyStringMap(??)\npickle.REDUCE\npickle.SETITEM\npickle.SETITEMS\npickle.SHORT_BINBYTES\npickle.SHORT_BINSTRING\npickle.STOP\npickle.STRING\npickle.TRUE\npickle.TUPLE\npickle.TUPLE1\npickle.TUPLE2\npickle.TUPLE3\npickle.UNICODE\npickle.Unpickler(file, *, encoding='ASCII', errors='strict')\npickle.UnpicklingError(??)\npickle.bytes_types(??)\npickle.classmap(??)\npickle.codecs(??)\npickle.compatible_formats(??)\npickle.decode_long(??)\npickle.dispatch_table(??)\npickle.dump(??)\npickle.dumps(??)\npickle.encode_long(??)\npickle.format_version\npickle.io(??)\npickle.load(??)\npickle.loads(??)\npickle.marshal(??)\npickle.mloads(??)\npickle.re(??)\npickle.struct(??)\npickle.sys(??)\npickle.whichmodule(??)\npickletools.ArgumentDescriptor(??)\npickletools.OpcodeInfo(??)\npickletools.StackObject(??)\npickletools.TAKEN_FROM_ARGUMENT1\npickletools.TAKEN_FROM_ARGUMENT4\npickletools.UP_TO_NEWLINE\npickletools.anyobject(??)\npickletools.bytes_types(??)\npickletools.code2op(??)\npickletools.codecs(??)\npickletools.decimalnl_long(??)\npickletools.decimalnl_short(??)\npickletools.decode_long(??)\npickletools.dis(??)\npickletools.float8(??)\npickletools.floatnl(??)\npickletools.genops(??)\npickletools.int4(??)\npickletools.long1(??)\npickletools.long4(??)\npickletools.markobject(??)\npickletools.opcodes(??)\npickletools.optimize(??)\npickletools.pickle(??)\npickletools.pybool(??)\npickletools.pybytes(??)\npickletools.pydict(??)\npickletools.pyfloat(??)\npickletools.pyint(??)\npickletools.pyinteger_or_bool(??)\npickletools.pylist(??)\npickletools.pylong(??)\npickletools.pynone(??)\npickletools.pystring(??)\npickletools.pytuple(??)\npickletools.pyunicode(??)\npickletools.re(??)\npickletools.read_decimalnl_long(??)\npickletools.read_decimalnl_short(??)\npickletools.read_float8(??)\npickletools.read_floatnl(??)\npickletools.read_int4(??)\npickletools.read_long1(??)\npickletools.read_long4(??)\npickletools.read_string1(??)\npickletools.read_string4(??)\npickletools.read_stringnl(??)\npickletools.read_stringnl_noescape(??)\npickletools.read_stringnl_noescape_pair(??)\npickletools.read_uint1(??)\npickletools.read_uint2(??)\npickletools.read_unicodestring4(??)\npickletools.read_unicodestringnl(??)\npickletools.stackslice(??)\npickletools.string1(??)\npickletools.string4(??)\npickletools.stringnl(??)\npickletools.stringnl_noescape(??)\npickletools.stringnl_noescape_pair(??)\npickletools.uint1(??)\npickletools.uint2(??)\npickletools.unicodestring4(??)\npickletools.unicodestringnl(??)\npipes.FILEIN_FILEOUT\npipes.FILEIN_STDOUT\npipes.SINK\npipes.SOURCE\npipes.STDIN_FILEOUT\npipes.STDIN_STDOUT\npipes.Template(??)\npipes.makepipeline(??)\npipes.os(??)\npipes.quote(??)\npipes.re(??)\npipes.stepkinds(??)\npipes.string(??)\npipes.tempfile(??)\npkgutil.ImpImporter(??)\npkgutil.ImpLoader(??)\npkgutil.ModuleType(??)\npkgutil.extend_path(??)\npkgutil.find_loader(??)\npkgutil.get_data(??)\npkgutil.get_importer(??)\npkgutil.get_loader(??)\npkgutil.imp(??)\npkgutil.iter_importer_modules(??)\npkgutil.iter_importers(??)\npkgutil.iter_modules(??)\npkgutil.iter_zipimport_modules(??)\npkgutil.os(??)\npkgutil.read_code(??)\npkgutil.simplegeneric(??)\npkgutil.sys(??)\npkgutil.walk_packages(??)\npkgutil.zipimport(??)\npkgutil.zipimporter(archivepath) -> zipimporter object\nplatform.architecture(??)\nplatform.dist(??)\nplatform.java_ver(??)\nplatform.libc_ver(??)\nplatform.linux_distribution(??)\nplatform.mac_ver(??)\nplatform.machine(??)\nplatform.node(??)\nplatform.os(??)\nplatform.platform(??)\nplatform.popen(??)\nplatform.processor(??)\nplatform.python_branch(??)\nplatform.python_build(??)\nplatform.python_compiler(??)\nplatform.python_implementation(??)\nplatform.python_revision(??)\nplatform.python_version(??)\nplatform.python_version_tuple(??)\nplatform.re(??)\nplatform.release(??)\nplatform.sys(??)\nplatform.system(??)\nplatform.system_alias(??)\nplatform.uname(??)\nplatform.version(??)\nplatform.win32_ver(??)\nplistlib.BytesIO([buffer]) -> object\nplistlib.Data(??)\nplistlib.Dict(??)\nplistlib.DumbXMLWriter(??)\nplistlib.PLISTHEADER\nplistlib.Plist(??)\nplistlib.PlistParser(??)\nplistlib.PlistWriter(??)\nplistlib.binascii(??)\nplistlib.datetime(??)\nplistlib.re(??)\nplistlib.readPlist(??)\nplistlib.readPlistFromBytes(??)\nplistlib.writePlist(??)\nplistlib.writePlistToBytes(??)\npoplib.CR\npoplib.CRLF\npoplib.LF\npoplib.POP3(??)\npoplib.POP3_PORT\npoplib.POP3_SSL(??)\npoplib.POP3_SSL_PORT\npoplib.error_proto(??)\npoplib.re(??)\npoplib.socket(??)\npoplib.ssl(??)\nposix.EX_CANTCREAT\nposix.EX_CONFIG\nposix.EX_DATAERR\nposix.EX_IOERR\nposix.EX_NOHOST\nposix.EX_NOINPUT\nposix.EX_NOPERM\nposix.EX_NOUSER\nposix.EX_OK\nposix.EX_OSERR\nposix.EX_OSFILE\nposix.EX_PROTOCOL\nposix.EX_SOFTWARE\nposix.EX_TEMPFAIL\nposix.EX_UNAVAILABLE\nposix.EX_USAGE\nposix.F_OK\nposix.NGROUPS_MAX\nposix.O_APPEND\nposix.O_ASYNC\nposix.O_CREAT\nposix.O_DIRECT\nposix.O_DIRECTORY\nposix.O_DSYNC\nposix.O_EXCL\nposix.O_LARGEFILE\nposix.O_NDELAY\nposix.O_NOATIME\nposix.O_NOCTTY\nposix.O_NOFOLLOW\nposix.O_NONBLOCK\nposix.O_RDONLY\nposix.O_RDWR\nposix.O_RSYNC\nposix.O_SYNC\nposix.O_TRUNC\nposix.O_WRONLY\nposix.R_OK\nposix.TMP_MAX\nposix.WCONTINUED\nposix.WCOREDUMP(status) -> bool\nposix.WEXITSTATUS(status) -> integer\nposix.WIFCONTINUED(status) -> bool\nposix.WIFEXITED(status) -> bool\nposix.WIFSIGNALED(status) -> bool\nposix.WIFSTOPPED(status) -> bool\nposix.WNOHANG\nposix.WSTOPSIG(status) -> integer\nposix.WTERMSIG(status) -> integer\nposix.WUNTRACED\nposix.W_OK\nposix.X_OK\nposix.abort() -> does not return!\nposix.access(path, mode) -> True if granted, False otherwise\nposix.chdir(path)\nposix.chmod(path, mode)\nposix.chown(path, uid, gid)\nposix.chroot(path)\nposix.close(fd)\nposix.closerange(fd_low, fd_high)\nposix.confstr(name) -> string\nposix.confstr_names(??)\nposix.ctermid() -> string\nposix.device_encoding(fd) -> str\nposix.dup(fd) -> fd2\nposix.dup2(old_fd, new_fd)\nposix.environ(??)\nposix.error(??)\nposix.execv(path, args)\nposix.execve(path, args, env)\nposix.fchdir(fildes)\nposix.fchmod(fd, mode)\nposix.fchown(fd, uid, gid)\nposix.fdatasync(fildes)\nposix.fork() -> pid\nposix.forkpty() -> (pid, master_fd)\nposix.fpathconf(fd, name) -> integer\nposix.fstat(fd) -> stat result\nposix.fstatvfs(fd) -> statvfs result\nposix.fsync(fildes)\nposix.ftruncate(fd, length)\nposix.getcwd() -> path\nposix.getcwdb() -> path\nposix.getegid() -> egid\nposix.geteuid() -> euid\nposix.getgid() -> gid\nposix.getgroups() -> list of group IDs\nposix.getloadavg() -> (float, float, float)\nposix.getlogin() -> string\nposix.getpgid(pid) -> pgid\nposix.getpgrp() -> pgrp\nposix.getpid() -> pid\nposix.getppid() -> ppid\nposix.getsid(pid) -> sid\nposix.getuid() -> uid\nposix.isatty(fd) -> bool\nposix.kill(pid, sig)\nposix.killpg(pgid, sig)\nposix.lchown(path, uid, gid)\nposix.link(src, dst)\nposix.listdir(path) -> list_of_strings\nposix.lseek(fd, pos, how) -> newpos\nposix.lstat(path) -> stat result\nposix.major(device) -> major number\nposix.makedev(major, minor) -> device number\nposix.minor(device) -> minor number\nposix.mkdir(path [, mode=0777])\nposix.mkfifo(filename [, mode=0666])\nposix.mknod(filename [, mode=0600, device])\nposix.nice(inc) -> new_priority\nposix.open(filename, flag [, mode=0777]) -> fd\nposix.openpty() -> (master_fd, slave_fd)\nposix.pathconf(path, name) -> integer\nposix.pathconf_names(??)\nposix.pipe() -> (read_end, write_end)\nposix.putenv(key, value)\nposix.read(fd, buffersize) -> string\nposix.readlink(path) -> path\nposix.remove(path)\nposix.rename(old, new)\nposix.rmdir(path)\nposix.setegid(gid)\nposix.seteuid(uid)\nposix.setgid(gid)\nposix.setgroups(list)\nposix.setpgid(pid, pgrp)\nposix.setpgrp()\nposix.setregid(rgid, egid)\nposix.setreuid(ruid, euid)\nposix.setsid()\nposix.setuid(uid)\nposix.stat(path) -> stat result\nposix.stat_float_times([newval]) -> oldval\nposix.stat_result(??)\nposix.statvfs(path) -> statvfs result\nposix.statvfs_result(??)\nposix.strerror(code) -> string\nposix.symlink(src, dst)\nposix.sysconf(name) -> integer\nposix.sysconf_names(??)\nposix.system(command) -> exit_status\nposix.tcgetpgrp(fd) -> pgid\nposix.tcsetpgrp(fd, pgid)\nposix.times() -> (utime, stime, cutime, cstime, elapsed_time)\nposix.ttyname(fd) -> string\nposix.umask(new_mask) -> old_mask\nposix.uname() -> (sysname, nodename, release, version, machine)\nposix.unlink(path)\nposix.unsetenv(key)\nposix.utime(path, (atime, mtime))\nposix.wait() -> (pid, status)\nposix.wait3(options) -> (pid, status, rusage)\nposix.wait4(pid, options) -> (pid, status, rusage)\nposix.waitpid(pid, options) -> (pid, status)\nposix.write(fd, string) -> byteswritten\npow(x, y[, z]) -> number\npprint.PrettyPrinter(??)\npprint.isreadable(??)\npprint.isrecursive(??)\npprint.pformat(??)\npprint.pprint(??)\npprint.saferepr(??)\nprint(value, ..., sep=' ', end='\\n', file=sys.stdout)\nprofile.OptionParser(??)\nprofile.Profile(??)\nprofile.Stats(??)\nprofile.help(??)\nprofile.main(??)\nprofile.marshal(??)\nprofile.os(??)\nprofile.resgetrusage(??)\nprofile.resource(??)\nprofile.run(??)\nprofile.runctx(??)\nprofile.sys(??)\nprofile.time(??)\nproperty(fget=None, fset=None, fdel=None, doc=None) -> property attribute\npstats.CmpToKey(??)\npstats.Stats(??)\npstats.TupleComp(??)\npstats.add_callers(??)\npstats.add_func_stats(??)\npstats.count_calls(??)\npstats.f8(??)\npstats.func_get_function_name(??)\npstats.func_std_string(??)\npstats.func_strip_path(??)\npstats.marshal(??)\npstats.os(??)\npstats.re(??)\npstats.sys(??)\npstats.time(??)\npty.CHILD\npty.STDERR_FILENO\npty.STDIN_FILENO\npty.STDOUT_FILENO\npty.fork() -> (pid, master_fd)\npty.master_open() -> (master_fd, slave_name)\npty.openpty() -> (master_fd, slave_fd)\npty.os(??)\npty.select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\npty.slave_open(tty_name) -> slave_fd\npty.spawn(??)\npty.tty(??)\npwd.getpwall() -> list_of_entries\npwd.getpwnam(name) -> (pw_name,pw_passwd,pw_uid,\npwd.getpwuid(uid) -> (pw_name,pw_passwd,pw_uid,\npwd.struct_passwd(??)\npy_compile.MAGIC\npy_compile.PyCompileError(??)\npy_compile.builtins(??)\npy_compile.compile(??)\npy_compile.imp(??)\npy_compile.main(??)\npy_compile.marshal(??)\npy_compile.os(??)\npy_compile.re(??)\npy_compile.read_encoding(??)\npy_compile.set_creator_type(??)\npy_compile.sys(??)\npy_compile.traceback(??)\npy_compile.wr_long(??)\npyclbr.Class(??)\npyclbr.DEDENT\npyclbr.Function(??)\npyclbr.NAME\npyclbr.OP\npyclbr.imp(??)\npyclbr.itemgetter(item, ...) --> itemgetter object\npyclbr.readmodule(??)\npyclbr.readmodule_ex(??)\npyclbr.sys(??)\npyclbr.tokenize(??)\npydoc.Doc(??)\npydoc.ErrorDuringImport(??)\npydoc.HTMLDoc(??)\npydoc.HTMLRepr(??)\npydoc.Helper(??)\npydoc.ModuleScanner(??)\npydoc.Repr(??)\npydoc.Scanner(??)\npydoc.TextDoc(??)\npydoc.TextRepr(??)\npydoc.allmethods(??)\npydoc.apropos(??)\npydoc.builtins(??)\npydoc.classify_class_attrs(??)\npydoc.classname(??)\npydoc.cli(??)\npydoc.cram(??)\npydoc.deque(iterable[, maxlen]) --> deque object\npydoc.describe(??)\npydoc.doc(??)\npydoc.getdoc(??)\npydoc.getpager(??)\npydoc.gui(??)\npydoc.help(??)\npydoc.html(??)\npydoc.imp(??)\npydoc.importfile(??)\npydoc.inspect(??)\npydoc.isdata(??)\npydoc.ispackage(??)\npydoc.ispath(??)\npydoc.locate(??)\npydoc.os(??)\npydoc.pager(??)\npydoc.pathdirs(??)\npydoc.pipepager(??)\npydoc.pkgutil(??)\npydoc.plain(??)\npydoc.plainpager(??)\npydoc.re(??)\npydoc.render_doc(??)\npydoc.replace(??)\npydoc.resolve(??)\npydoc.safeimport(??)\npydoc.serve(??)\npydoc.source_synopsis(??)\npydoc.splitdoc(??)\npydoc.stripid(??)\npydoc.synopsis(??)\npydoc.sys(??)\npydoc.tempfilepager(??)\npydoc.text(??)\npydoc.ttypager(??)\npydoc.visiblename(??)\npydoc.writedoc(??)\npydoc.writedocs(??)\npydoc_data.topics(??)\npydoc_data.topics.topics(??)\nqueue.Empty(??)\nqueue.Full(??)\nqueue.LifoQueue(??)\nqueue.PriorityQueue(??)\nqueue.Queue(??)\nqueue.deque(iterable[, maxlen]) --> deque object\nqueue.heapq(??)\nquit(??)\nquopri.EMPTYSTRING\nquopri.ESCAPE\nquopri.HEX\nquopri.MAXLINESIZE\nquopri.a2b_qp(??)\nquopri.b2a_qp(data, quotetabs=0, istext=1, header=0) -> s;\nquopri.decode(??)\nquopri.decodestring(??)\nquopri.encode(??)\nquopri.encodestring(??)\nquopri.ishex(??)\nquopri.main(??)\nquopri.needsquoting(??)\nquopri.quote(??)\nquopri.unhex(??)\nrandom.BPF\nrandom.LOG4\nrandom.NV_MAGICCONST\nrandom.RECIP_BPF\nrandom.Random(??)\nrandom.SG_MAGICCONST\nrandom.SystemRandom(??)\nrandom.TWOPI\nrandom.betavariate(??)\nrandom.choice(??)\nrandom.division(??)\nrandom.expovariate(??)\nrandom.gammavariate(??)\nrandom.gauss(??)\nrandom.getrandbits(k) -> x.  Generates a long int with k random bits.\nrandom.getstate(??)\nrandom.lognormvariate(??)\nrandom.normalvariate(??)\nrandom.paretovariate(??)\nrandom.randint(??)\nrandom.random() -> x in the interval [0, 1).\nrandom.randrange(??)\nrandom.sample(??)\nrandom.seed(??)\nrandom.setstate(??)\nrandom.shuffle(??)\nrandom.triangular(??)\nrandom.uniform(??)\nrandom.vonmisesvariate(??)\nrandom.weibullvariate(??)\nrange([start,] stop[, step]) -> range object\nre.A\nre.ASCII\nre.DEBUG\nre.DOTALL\nre.I\nre.IGNORECASE\nre.L\nre.LOCALE\nre.M\nre.MULTILINE\nre.S\nre.Scanner(??)\nre.T\nre.TEMPLATE\nre.U\nre.UNICODE\nre.VERBOSE\nre.X\nre.compile(??)\nre.copyreg(??)\nre.error(??)\nre.escape(??)\nre.findall(??)\nre.finditer(??)\nre.match(??)\nre.purge(??)\nre.search(??)\nre.split(??)\nre.sre_compile(??)\nre.sre_parse(??)\nre.sub(??)\nre.subn(??)\nre.sys(??)\nre.template(??)\nreadline.add_history(string) -> None\nreadline.clear_history() -> None\nreadline.get_begidx() -> int\nreadline.get_completer() -> function\nreadline.get_completer_delims() -> string\nreadline.get_completion_type() -> int\nreadline.get_current_history_length() -> integer\nreadline.get_endidx() -> int\nreadline.get_history_item() -> string\nreadline.get_history_length() -> int\nreadline.get_line_buffer() -> string\nreadline.insert_text(string) -> None\nreadline.parse_and_bind(string) -> None\nreadline.read_history_file([filename]) -> None\nreadline.read_init_file([filename]) -> None\nreadline.redisplay() -> None\nreadline.remove_history_item(pos) -> None\nreadline.replace_history_item(pos, line) -> None\nreadline.set_completer([function]) -> None\nreadline.set_completer_delims(string) -> None\nreadline.set_completion_display_matches_hook([function]) -> None\nreadline.set_history_length(length) -> None\nreadline.set_pre_input_hook([function]) -> None\nreadline.set_startup_hook([function]) -> None\nreadline.write_history_file([filename]) -> None\nrepr(object) -> string\nreprlib.Repr(??)\nreprlib.aRepr(??)\nreprlib.builtins(??)\nreprlib.islice(iterable, [start,] stop [, step]) --> islice object\nreprlib.repr(??)\nresource.RLIMIT_AS\nresource.RLIMIT_CORE\nresource.RLIMIT_CPU\nresource.RLIMIT_DATA\nresource.RLIMIT_FSIZE\nresource.RLIMIT_MEMLOCK\nresource.RLIMIT_NOFILE\nresource.RLIMIT_NPROC\nresource.RLIMIT_OFILE\nresource.RLIMIT_RSS\nresource.RLIMIT_STACK\nresource.RLIM_INFINITY\nresource.RUSAGE_CHILDREN\nresource.RUSAGE_SELF\nresource.error(??)\nresource.getpagesize(??)\nresource.getrlimit(??)\nresource.getrusage(??)\nresource.setrlimit(??)\nresource.struct_rusage(??)\nreversed(sequence) -> reverse iterator over values of the sequence\nrlcompleter.Completer(??)\nrlcompleter.builtins(??)\nrlcompleter.get_class_members(??)\nrlcompleter.readline(??)\nround(number[, ndigits]) -> number\nrunpy.get_loader(??)\nrunpy.imp(??)\nrunpy.run_module(??)\nrunpy.sys(??)\nsched.Event(??)\nsched.heapq(??)\nsched.namedtuple(??)\nsched.scheduler(??)\nselect.EPOLLERR\nselect.EPOLLET\nselect.EPOLLHUP\nselect.EPOLLIN\nselect.EPOLLMSG\nselect.EPOLLONESHOT\nselect.EPOLLOUT\nselect.EPOLLPRI\nselect.EPOLLRDBAND\nselect.EPOLLRDNORM\nselect.EPOLLWRBAND\nselect.EPOLLWRNORM\nselect.POLLERR\nselect.POLLHUP\nselect.POLLIN\nselect.POLLMSG\nselect.POLLNVAL\nselect.POLLOUT\nselect.POLLPRI\nselect.POLLRDBAND\nselect.POLLRDNORM\nselect.POLLWRBAND\nselect.POLLWRNORM\nselect.epoll(??)\nselect.error(??)\nselect.poll(??)\nselect.select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\nset(iterable) --> set object\nsetattr(object, name, value)\nshelve.BsdDbShelf(??)\nshelve.BytesIO([buffer]) -> object\nshelve.DbfilenameShelf(??)\nshelve.Pickler(file, protocol=None)\nshelve.Shelf(??)\nshelve.Unpickler(file, *, encoding='ASCII', errors='strict')\nshelve.collections(??)\nshelve.open(??)\nshlex.StringIO(??)\nshlex.deque(iterable[, maxlen]) --> deque object\nshlex.os(??)\nshlex.shlex(??)\nshlex.split(??)\nshlex.sys(??)\nshutil.Error(??)\nshutil.SpecialFileError(??)\nshutil.WindowsError(??)\nshutil.abspath(??)\nshutil.copy(??)\nshutil.copy2(??)\nshutil.copyfile(??)\nshutil.copyfileobj(??)\nshutil.copymode(??)\nshutil.copystat(??)\nshutil.copytree(??)\nshutil.fnmatch(??)\nshutil.ignore_patterns(??)\nshutil.move(??)\nshutil.os(??)\nshutil.rmtree(??)\nshutil.stat(??)\nshutil.sys(??)\nsignal.ITIMER_PROF\nsignal.ITIMER_REAL\nsignal.ITIMER_VIRTUAL\nsignal.ItimerError(??)\nsignal.NSIG\nsignal.SIGABRT\nsignal.SIGALRM\nsignal.SIGBUS\nsignal.SIGCHLD\nsignal.SIGCLD\nsignal.SIGCONT\nsignal.SIGFPE\nsignal.SIGHUP\nsignal.SIGILL\nsignal.SIGINT\nsignal.SIGIO\nsignal.SIGIOT\nsignal.SIGKILL\nsignal.SIGPIPE\nsignal.SIGPOLL\nsignal.SIGPROF\nsignal.SIGPWR\nsignal.SIGQUIT\nsignal.SIGRTMAX\nsignal.SIGRTMIN\nsignal.SIGSEGV\nsignal.SIGSTOP\nsignal.SIGSYS\nsignal.SIGTERM\nsignal.SIGTRAP\nsignal.SIGTSTP\nsignal.SIGTTIN\nsignal.SIGTTOU\nsignal.SIGURG\nsignal.SIGUSR1\nsignal.SIGUSR2\nsignal.SIGVTALRM\nsignal.SIGWINCH\nsignal.SIGXCPU\nsignal.SIGXFSZ\nsignal.SIG_DFL\nsignal.SIG_IGN\nsignal.alarm(seconds)\nsignal.default_int_handler(...)\nsignal.getitimer(which)\nsignal.getsignal(sig) -> action\nsignal.pause()\nsignal.set_wakeup_fd(fd) -> fd\nsignal.setitimer(which, seconds[, interval])\nsignal.siginterrupt(sig, flag) -> None\nsignal.signal(sig, action) -> action\nsite.ENABLE_USER_SITE(??)\nsite.PREFIXES(??)\nsite.USER_BASE\nsite.USER_SITE\nsite.abs__file__(??)\nsite.addbuilddir(??)\nsite.addpackage(??)\nsite.addsitedir(??)\nsite.addsitepackages(??)\nsite.addusersitepackages(??)\nsite.aliasmbcs(??)\nsite.builtins(??)\nsite.check_enableusersite(??)\nsite.execsitecustomize(??)\nsite.execusercustomize(??)\nsite.main(??)\nsite.makepath(??)\nsite.os(??)\nsite.removeduppaths(??)\nsite.setBEGINLIBPATH(??)\nsite.setcopyright(??)\nsite.setencoding(??)\nsite.sethelper(??)\nsite.setquit(??)\nsite.sys(??)\nslice([start,] stop[, step])\nsmtpd.COMMASPACE\nsmtpd.DEBUGSTREAM(??)\nsmtpd.DebuggingServer(??)\nsmtpd.Devnull(??)\nsmtpd.EMPTYSTRING\nsmtpd.MailmanProxy(??)\nsmtpd.NEWLINE\nsmtpd.Options(??)\nsmtpd.PureProxy(??)\nsmtpd.SMTPChannel(??)\nsmtpd.SMTPServer(??)\nsmtpd.asynchat(??)\nsmtpd.asyncore(??)\nsmtpd.errno(??)\nsmtpd.getopt(??)\nsmtpd.os(??)\nsmtpd.parseargs(??)\nsmtpd.program\nsmtpd.socket(??)\nsmtpd.sys(??)\nsmtpd.time(??)\nsmtpd.usage(??)\nsmtplib.CRLF\nsmtplib.LMTP(??)\nsmtplib.LMTP_PORT\nsmtplib.OLDSTYLE_AUTH(??)\nsmtplib.SMTP(??)\nsmtplib.SMTPAuthenticationError(??)\nsmtplib.SMTPConnectError(??)\nsmtplib.SMTPDataError(??)\nsmtplib.SMTPException(??)\nsmtplib.SMTPHeloError(??)\nsmtplib.SMTPRecipientsRefused(??)\nsmtplib.SMTPResponseException(??)\nsmtplib.SMTPSenderRefused(??)\nsmtplib.SMTPServerDisconnected(??)\nsmtplib.SMTP_PORT\nsmtplib.SMTP_SSL(??)\nsmtplib.SMTP_SSL_PORT\nsmtplib.SSLFakeFile(??)\nsmtplib.base64(??)\nsmtplib.email(??)\nsmtplib.encode_base64(??)\nsmtplib.hmac(??)\nsmtplib.quoteaddr(??)\nsmtplib.quotedata(??)\nsmtplib.re(??)\nsmtplib.socket(??)\nsmtplib.ssl(??)\nsmtplib.stderr(??)\nsndhdr.get_long_be(??)\nsndhdr.get_long_le(??)\nsndhdr.get_short_be(??)\nsndhdr.get_short_le(??)\nsndhdr.test(??)\nsndhdr.test_8svx(??)\nsndhdr.test_aifc(??)\nsndhdr.test_au(??)\nsndhdr.test_hcom(??)\nsndhdr.test_sndr(??)\nsndhdr.test_sndt(??)\nsndhdr.test_voc(??)\nsndhdr.test_wav(??)\nsndhdr.testall(??)\nsndhdr.tests(??)\nsndhdr.what(??)\nsndhdr.whathdr(??)\nsocket.AF_APPLETALK\nsocket.AF_ASH\nsocket.AF_ATMPVC\nsocket.AF_ATMSVC\nsocket.AF_AX25\nsocket.AF_BRIDGE\nsocket.AF_DECnet\nsocket.AF_ECONET\nsocket.AF_INET\nsocket.AF_INET6\nsocket.AF_IPX\nsocket.AF_IRDA\nsocket.AF_KEY\nsocket.AF_NETBEUI\nsocket.AF_NETLINK\nsocket.AF_NETROM\nsocket.AF_PACKET\nsocket.AF_PPPOX\nsocket.AF_ROSE\nsocket.AF_ROUTE\nsocket.AF_SECURITY\nsocket.AF_SNA\nsocket.AF_TIPC\nsocket.AF_UNIX\nsocket.AF_UNSPEC\nsocket.AF_WANPIPE\nsocket.AF_X25\nsocket.AI_ADDRCONFIG\nsocket.AI_ALL\nsocket.AI_CANONNAME\nsocket.AI_NUMERICHOST\nsocket.AI_NUMERICSERV\nsocket.AI_PASSIVE\nsocket.AI_V4MAPPED\nsocket.CAPI(??)\nsocket.EAI_ADDRFAMILY\nsocket.EAI_AGAIN\nsocket.EAI_BADFLAGS\nsocket.EAI_FAIL\nsocket.EAI_FAMILY\nsocket.EAI_MEMORY\nsocket.EAI_NODATA\nsocket.EAI_NONAME\nsocket.EAI_OVERFLOW\nsocket.EAI_SERVICE\nsocket.EAI_SOCKTYPE\nsocket.EAI_SYSTEM\nsocket.EBADF\nsocket.INADDR_ALLHOSTS_GROUP\nsocket.INADDR_ANY\nsocket.INADDR_BROADCAST\nsocket.INADDR_LOOPBACK\nsocket.INADDR_MAX_LOCAL_GROUP\nsocket.INADDR_NONE\nsocket.INADDR_UNSPEC_GROUP\nsocket.IPPORT_RESERVED\nsocket.IPPORT_USERRESERVED\nsocket.IPPROTO_AH\nsocket.IPPROTO_DSTOPTS\nsocket.IPPROTO_EGP\nsocket.IPPROTO_ESP\nsocket.IPPROTO_FRAGMENT\nsocket.IPPROTO_GRE\nsocket.IPPROTO_HOPOPTS\nsocket.IPPROTO_ICMP\nsocket.IPPROTO_ICMPV6\nsocket.IPPROTO_IDP\nsocket.IPPROTO_IGMP\nsocket.IPPROTO_IP\nsocket.IPPROTO_IPIP\nsocket.IPPROTO_IPV6\nsocket.IPPROTO_NONE\nsocket.IPPROTO_PIM\nsocket.IPPROTO_PUP\nsocket.IPPROTO_RAW\nsocket.IPPROTO_ROUTING\nsocket.IPPROTO_RSVP\nsocket.IPPROTO_TCP\nsocket.IPPROTO_TP\nsocket.IPPROTO_UDP\nsocket.IPV6_CHECKSUM\nsocket.IPV6_DSTOPTS\nsocket.IPV6_HOPLIMIT\nsocket.IPV6_HOPOPTS\nsocket.IPV6_JOIN_GROUP\nsocket.IPV6_LEAVE_GROUP\nsocket.IPV6_MULTICAST_HOPS\nsocket.IPV6_MULTICAST_IF\nsocket.IPV6_MULTICAST_LOOP\nsocket.IPV6_NEXTHOP\nsocket.IPV6_PKTINFO\nsocket.IPV6_RECVDSTOPTS\nsocket.IPV6_RECVHOPLIMIT\nsocket.IPV6_RECVHOPOPTS\nsocket.IPV6_RECVPKTINFO\nsocket.IPV6_RECVRTHDR\nsocket.IPV6_RECVTCLASS\nsocket.IPV6_RTHDR\nsocket.IPV6_RTHDRDSTOPTS\nsocket.IPV6_RTHDR_TYPE_0\nsocket.IPV6_TCLASS\nsocket.IPV6_UNICAST_HOPS\nsocket.IPV6_V6ONLY\nsocket.IP_ADD_MEMBERSHIP\nsocket.IP_DEFAULT_MULTICAST_LOOP\nsocket.IP_DEFAULT_MULTICAST_TTL\nsocket.IP_DROP_MEMBERSHIP\nsocket.IP_HDRINCL\nsocket.IP_MAX_MEMBERSHIPS\nsocket.IP_MULTICAST_IF\nsocket.IP_MULTICAST_LOOP\nsocket.IP_MULTICAST_TTL\nsocket.IP_OPTIONS\nsocket.IP_RECVOPTS\nsocket.IP_RECVRETOPTS\nsocket.IP_RETOPTS\nsocket.IP_TOS\nsocket.IP_TTL\nsocket.MSG_CTRUNC\nsocket.MSG_DONTROUTE\nsocket.MSG_DONTWAIT\nsocket.MSG_EOR\nsocket.MSG_OOB\nsocket.MSG_PEEK\nsocket.MSG_TRUNC\nsocket.MSG_WAITALL\nsocket.NETLINK_DNRTMSG\nsocket.NETLINK_FIREWALL\nsocket.NETLINK_IP6_FW\nsocket.NETLINK_NFLOG\nsocket.NETLINK_ROUTE\nsocket.NETLINK_USERSOCK\nsocket.NETLINK_XFRM\nsocket.NI_DGRAM\nsocket.NI_MAXHOST\nsocket.NI_MAXSERV\nsocket.NI_NAMEREQD\nsocket.NI_NOFQDN\nsocket.NI_NUMERICHOST\nsocket.NI_NUMERICSERV\nsocket.PACKET_BROADCAST\nsocket.PACKET_FASTROUTE\nsocket.PACKET_HOST\nsocket.PACKET_LOOPBACK\nsocket.PACKET_MULTICAST\nsocket.PACKET_OTHERHOST\nsocket.PACKET_OUTGOING\nsocket.PF_PACKET\nsocket.SHUT_RD\nsocket.SHUT_RDWR\nsocket.SHUT_WR\nsocket.SOCK_DGRAM\nsocket.SOCK_RAW\nsocket.SOCK_RDM\nsocket.SOCK_SEQPACKET\nsocket.SOCK_STREAM\nsocket.SOL_IP\nsocket.SOL_SOCKET\nsocket.SOL_TCP\nsocket.SOL_TIPC\nsocket.SOL_UDP\nsocket.SOMAXCONN\nsocket.SO_ACCEPTCONN\nsocket.SO_BROADCAST\nsocket.SO_DEBUG\nsocket.SO_DONTROUTE\nsocket.SO_ERROR\nsocket.SO_KEEPALIVE\nsocket.SO_LINGER\nsocket.SO_OOBINLINE\nsocket.SO_RCVBUF\nsocket.SO_RCVLOWAT\nsocket.SO_RCVTIMEO\nsocket.SO_REUSEADDR\nsocket.SO_SNDBUF\nsocket.SO_SNDLOWAT\nsocket.SO_SNDTIMEO\nsocket.SO_TYPE\nsocket.SocketIO(??)\nsocket.SocketType(??)\nsocket.TCP_CORK\nsocket.TCP_DEFER_ACCEPT\nsocket.TCP_INFO\nsocket.TCP_KEEPCNT\nsocket.TCP_KEEPIDLE\nsocket.TCP_KEEPINTVL\nsocket.TCP_LINGER2\nsocket.TCP_MAXSEG\nsocket.TCP_NODELAY\nsocket.TCP_QUICKACK\nsocket.TCP_SYNCNT\nsocket.TCP_WINDOW_CLAMP\nsocket.TIPC_ADDR_ID\nsocket.TIPC_ADDR_NAME\nsocket.TIPC_ADDR_NAMESEQ\nsocket.TIPC_CFG_SRV\nsocket.TIPC_CLUSTER_SCOPE\nsocket.TIPC_CONN_TIMEOUT\nsocket.TIPC_CRITICAL_IMPORTANCE\nsocket.TIPC_DEST_DROPPABLE\nsocket.TIPC_HIGH_IMPORTANCE\nsocket.TIPC_IMPORTANCE\nsocket.TIPC_LOW_IMPORTANCE\nsocket.TIPC_MEDIUM_IMPORTANCE\nsocket.TIPC_NODE_SCOPE\nsocket.TIPC_PUBLISHED\nsocket.TIPC_SRC_DROPPABLE\nsocket.TIPC_SUBSCR_TIMEOUT\nsocket.TIPC_SUB_CANCEL\nsocket.TIPC_SUB_PORTS\nsocket.TIPC_SUB_SERVICE\nsocket.TIPC_TOP_SRV\nsocket.TIPC_WAIT_FOREVER\nsocket.TIPC_WITHDRAWN\nsocket.TIPC_ZONE_SCOPE\nsocket.create_connection(??)\nsocket.dup(integer) -> integer\nsocket.error(??)\nsocket.fromfd(fd, family, type[, proto]) -> socket object\nsocket.gaierror(??)\nsocket.getaddrinfo(host, port [, family, socktype, proto, flags])\nsocket.getdefaulttimeout() -> timeout\nsocket.getfqdn(??)\nsocket.gethostbyaddr(host) -> (name, aliaslist, addresslist)\nsocket.gethostbyname(host) -> address\nsocket.gethostbyname_ex(host) -> (name, aliaslist, addresslist)\nsocket.gethostname() -> string\nsocket.getnameinfo(sockaddr, flags) --> (host, port)\nsocket.getprotobyname(name) -> integer\nsocket.getservbyname(servicename[, protocolname]) -> integer\nsocket.getservbyport(port[, protocolname]) -> string\nsocket.has_ipv6(??)\nsocket.herror(??)\nsocket.htonl(integer) -> integer\nsocket.htons(integer) -> integer\nsocket.inet_aton(string) -> bytes giving packed 32-bit IP representation\nsocket.inet_ntoa(packed_ip) -> ip_address_string\nsocket.inet_ntop(af, packed_ip) -> string formatted IP address\nsocket.inet_pton(af, ip) -> packed IP address string\nsocket.io(??)\nsocket.ntohl(integer) -> integer\nsocket.ntohs(integer) -> integer\nsocket.os(??)\nsocket.setdefaulttimeout(timeout)\nsocket.socket(??)\nsocket.socketpair([family[, type[, proto]]]) -> (socket object, socket object)\nsocket.sys(??)\nsocket.timeout(??)\nsocketserver.BaseRequestHandler(??)\nsocketserver.BaseServer(??)\nsocketserver.DatagramRequestHandler(??)\nsocketserver.ForkingMixIn(??)\nsocketserver.ForkingTCPServer(??)\nsocketserver.ForkingUDPServer(??)\nsocketserver.StreamRequestHandler(??)\nsocketserver.TCPServer(??)\nsocketserver.ThreadingMixIn(??)\nsocketserver.ThreadingTCPServer(??)\nsocketserver.ThreadingUDPServer(??)\nsocketserver.ThreadingUnixDatagramServer(??)\nsocketserver.ThreadingUnixStreamServer(??)\nsocketserver.UDPServer(??)\nsocketserver.UnixDatagramServer(??)\nsocketserver.UnixStreamServer(??)\nsocketserver.os(??)\nsocketserver.select(??)\nsocketserver.socket(??)\nsocketserver.sys(??)\nsocketserver.threading(??)\nsorted(iterable, key=None, reverse=False) --> new sorted list\nspwd.getspall() -> list_of_entries\nspwd.getspnam(name) -> (sp_namp, sp_pwdp, sp_lstchg, sp_min, sp_max,\nspwd.struct_spwd(??)\nsqlite3.Binary(??)\nsqlite3.Cache(??)\nsqlite3.Connection(??)\nsqlite3.Cursor(??)\nsqlite3.DataError(??)\nsqlite3.DatabaseError(??)\nsqlite3.Date(??)\nsqlite3.DateFromTicks(??)\nsqlite3.Error(??)\nsqlite3.IntegrityError(??)\nsqlite3.InterfaceError(??)\nsqlite3.InternalError(??)\nsqlite3.NotSupportedError(??)\nsqlite3.OperationalError(??)\nsqlite3.OptimizedUnicode(??)\nsqlite3.PARSE_COLNAMES\nsqlite3.PARSE_DECLTYPES\nsqlite3.PrepareProtocol(??)\nsqlite3.ProgrammingError(??)\nsqlite3.Row(??)\nsqlite3.SQLITE_ALTER_TABLE\nsqlite3.SQLITE_ANALYZE\nsqlite3.SQLITE_ATTACH\nsqlite3.SQLITE_CREATE_INDEX\nsqlite3.SQLITE_CREATE_TABLE\nsqlite3.SQLITE_CREATE_TEMP_INDEX\nsqlite3.SQLITE_CREATE_TEMP_TABLE\nsqlite3.SQLITE_CREATE_TEMP_TRIGGER\nsqlite3.SQLITE_CREATE_TEMP_VIEW\nsqlite3.SQLITE_CREATE_TRIGGER\nsqlite3.SQLITE_CREATE_VIEW\nsqlite3.SQLITE_DELETE\nsqlite3.SQLITE_DENY\nsqlite3.SQLITE_DETACH\nsqlite3.SQLITE_DROP_INDEX\nsqlite3.SQLITE_DROP_TABLE\nsqlite3.SQLITE_DROP_TEMP_INDEX\nsqlite3.SQLITE_DROP_TEMP_TABLE\nsqlite3.SQLITE_DROP_TEMP_TRIGGER\nsqlite3.SQLITE_DROP_TEMP_VIEW\nsqlite3.SQLITE_DROP_TRIGGER\nsqlite3.SQLITE_DROP_VIEW\nsqlite3.SQLITE_IGNORE\nsqlite3.SQLITE_INSERT\nsqlite3.SQLITE_OK\nsqlite3.SQLITE_PRAGMA\nsqlite3.SQLITE_READ\nsqlite3.SQLITE_REINDEX\nsqlite3.SQLITE_SELECT\nsqlite3.SQLITE_TRANSACTION\nsqlite3.SQLITE_UPDATE\nsqlite3.Statement(??)\nsqlite3.Time(??)\nsqlite3.TimeFromTicks(??)\nsqlite3.Timestamp(??)\nsqlite3.TimestampFromTicks(??)\nsqlite3.Warning(??)\nsqlite3.adapt(obj, protocol, alternate) -> adapt obj to given protocol. Non-standard.\nsqlite3.adapters(??)\nsqlite3.apilevel\nsqlite3.complete_statement(sql)\nsqlite3.connect(database[, timeout, isolation_level, detect_types, factory])\nsqlite3.converters(??)\nsqlite3.datetime(??)\nsqlite3.dbapi2(??)\nsqlite3.dbapi2.Binary(??)\nsqlite3.dbapi2.Cache(??)\nsqlite3.dbapi2.Connection(??)\nsqlite3.dbapi2.Cursor(??)\nsqlite3.dbapi2.DataError(??)\nsqlite3.dbapi2.DatabaseError(??)\nsqlite3.dbapi2.Date(??)\nsqlite3.dbapi2.DateFromTicks(??)\nsqlite3.dbapi2.Error(??)\nsqlite3.dbapi2.IntegrityError(??)\nsqlite3.dbapi2.InterfaceError(??)\nsqlite3.dbapi2.InternalError(??)\nsqlite3.dbapi2.NotSupportedError(??)\nsqlite3.dbapi2.OperationalError(??)\nsqlite3.dbapi2.OptimizedUnicode(??)\nsqlite3.dbapi2.PARSE_COLNAMES\nsqlite3.dbapi2.PARSE_DECLTYPES\nsqlite3.dbapi2.PrepareProtocol(??)\nsqlite3.dbapi2.ProgrammingError(??)\nsqlite3.dbapi2.Row(??)\nsqlite3.dbapi2.SQLITE_ALTER_TABLE\nsqlite3.dbapi2.SQLITE_ANALYZE\nsqlite3.dbapi2.SQLITE_ATTACH\nsqlite3.dbapi2.SQLITE_CREATE_INDEX\nsqlite3.dbapi2.SQLITE_CREATE_TABLE\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_INDEX\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_TABLE\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_TRIGGER\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_VIEW\nsqlite3.dbapi2.SQLITE_CREATE_TRIGGER\nsqlite3.dbapi2.SQLITE_CREATE_VIEW\nsqlite3.dbapi2.SQLITE_DELETE\nsqlite3.dbapi2.SQLITE_DENY\nsqlite3.dbapi2.SQLITE_DETACH\nsqlite3.dbapi2.SQLITE_DROP_INDEX\nsqlite3.dbapi2.SQLITE_DROP_TABLE\nsqlite3.dbapi2.SQLITE_DROP_TEMP_INDEX\nsqlite3.dbapi2.SQLITE_DROP_TEMP_TABLE\nsqlite3.dbapi2.SQLITE_DROP_TEMP_TRIGGER\nsqlite3.dbapi2.SQLITE_DROP_TEMP_VIEW\nsqlite3.dbapi2.SQLITE_DROP_TRIGGER\nsqlite3.dbapi2.SQLITE_DROP_VIEW\nsqlite3.dbapi2.SQLITE_IGNORE\nsqlite3.dbapi2.SQLITE_INSERT\nsqlite3.dbapi2.SQLITE_OK\nsqlite3.dbapi2.SQLITE_PRAGMA\nsqlite3.dbapi2.SQLITE_READ\nsqlite3.dbapi2.SQLITE_REINDEX\nsqlite3.dbapi2.SQLITE_SELECT\nsqlite3.dbapi2.SQLITE_TRANSACTION\nsqlite3.dbapi2.SQLITE_UPDATE\nsqlite3.dbapi2.Statement(??)\nsqlite3.dbapi2.Time(??)\nsqlite3.dbapi2.TimeFromTicks(??)\nsqlite3.dbapi2.Timestamp(??)\nsqlite3.dbapi2.TimestampFromTicks(??)\nsqlite3.dbapi2.Warning(??)\nsqlite3.dbapi2.adapt(obj, protocol, alternate) -> adapt obj to given protocol. Non-standard.\nsqlite3.dbapi2.adapters(??)\nsqlite3.dbapi2.apilevel\nsqlite3.dbapi2.complete_statement(sql)\nsqlite3.dbapi2.connect(database[, timeout, isolation_level, detect_types, factory])\nsqlite3.dbapi2.converters(??)\nsqlite3.dbapi2.datetime(??)\nsqlite3.dbapi2.enable_callback_tracebacks(flag)\nsqlite3.dbapi2.enable_shared_cache(do_enable)\nsqlite3.dbapi2.paramstyle\nsqlite3.dbapi2.register_adapter(type, callable)\nsqlite3.dbapi2.register_converter(typename, callable)\nsqlite3.dbapi2.sqlite_version\nsqlite3.dbapi2.sqlite_version_info(??)\nsqlite3.dbapi2.threadsafety\nsqlite3.dbapi2.time(??)\nsqlite3.dbapi2.version\nsqlite3.dbapi2.version_info(??)\nsqlite3.dump(??)\nsqlite3.enable_callback_tracebacks(flag)\nsqlite3.enable_shared_cache(do_enable)\nsqlite3.paramstyle\nsqlite3.register_adapter(type, callable)\nsqlite3.register_converter(typename, callable)\nsqlite3.sqlite_version\nsqlite3.sqlite_version_info(??)\nsqlite3.threadsafety\nsqlite3.time(??)\nsqlite3.version\nsqlite3.version_info(??)\nssl.AF_INET\nssl.CERT_NONE\nssl.CERT_OPTIONAL\nssl.CERT_REQUIRED\nssl.DER_cert_to_PEM_cert(??)\nssl.PEM_FOOTER\nssl.PEM_HEADER\nssl.PEM_cert_to_DER_cert(??)\nssl.PROTOCOL_SSLv2\nssl.PROTOCOL_SSLv23\nssl.PROTOCOL_SSLv3\nssl.PROTOCOL_TLSv1\nssl.RAND_add(string, entropy)\nssl.RAND_egd(path) -> bytes\nssl.RAND_status() -> 0 or 1\nssl.SOCK_STREAM\nssl.SSLError(??)\nssl.SSLSocket(??)\nssl.SSL_ERROR_EOF\nssl.SSL_ERROR_INVALID_ERROR_CODE\nssl.SSL_ERROR_SSL\nssl.SSL_ERROR_SYSCALL\nssl.SSL_ERROR_WANT_CONNECT\nssl.SSL_ERROR_WANT_READ\nssl.SSL_ERROR_WANT_WRITE\nssl.SSL_ERROR_WANT_X509_LOOKUP\nssl.SSL_ERROR_ZERO_RETURN\nssl.base64(??)\nssl.cert_time_to_seconds(??)\nssl.get_protocol_name(??)\nssl.get_server_certificate(??)\nssl.socket(??)\nssl.socket_error(??)\nssl.textwrap(??)\nssl.traceback(??)\nssl.wrap_socket(??)\nstat.SF_APPEND\nstat.SF_ARCHIVED\nstat.SF_IMMUTABLE\nstat.SF_NOUNLINK\nstat.SF_SNAPSHOT\nstat.ST_ATIME\nstat.ST_CTIME\nstat.ST_DEV\nstat.ST_GID\nstat.ST_INO\nstat.ST_MODE\nstat.ST_MTIME\nstat.ST_NLINK\nstat.ST_SIZE\nstat.ST_UID\nstat.S_ENFMT\nstat.S_IEXEC\nstat.S_IFBLK\nstat.S_IFCHR\nstat.S_IFDIR\nstat.S_IFIFO\nstat.S_IFLNK\nstat.S_IFMT(??)\nstat.S_IFREG\nstat.S_IFSOCK\nstat.S_IMODE(??)\nstat.S_IREAD\nstat.S_IRGRP\nstat.S_IROTH\nstat.S_IRUSR\nstat.S_IRWXG\nstat.S_IRWXO\nstat.S_IRWXU\nstat.S_ISBLK(??)\nstat.S_ISCHR(??)\nstat.S_ISDIR(??)\nstat.S_ISFIFO(??)\nstat.S_ISGID\nstat.S_ISLNK(??)\nstat.S_ISREG(??)\nstat.S_ISSOCK(??)\nstat.S_ISUID\nstat.S_ISVTX\nstat.S_IWGRP\nstat.S_IWOTH\nstat.S_IWRITE\nstat.S_IWUSR\nstat.S_IXGRP\nstat.S_IXOTH\nstat.S_IXUSR\nstat.UF_APPEND\nstat.UF_IMMUTABLE\nstat.UF_NODUMP\nstat.UF_NOUNLINK\nstat.UF_OPAQUE\nstaticmethod(function) -> method\nstr(string[, encoding[, errors]]) -> str\nstring.Formatter(??)\nstring.Template(??)\nstring.ascii_letters\nstring.ascii_lowercase\nstring.ascii_uppercase\nstring.capwords(s, [sep]) -> string\nstring.digits\nstring.hexdigits\nstring.maketrans(frm, to) -> bytes\nstring.octdigits\nstring.printable\nstring.punctuation\nstring.whitespace\nstringprep.b1_set(??)\nstringprep.b3_exceptions(??)\nstringprep.c22_specials(??)\nstringprep.c6_set(??)\nstringprep.c7_set(??)\nstringprep.c8_set(??)\nstringprep.c9_set(??)\nstringprep.in_table_a1(??)\nstringprep.in_table_b1(??)\nstringprep.in_table_c11(??)\nstringprep.in_table_c11_c12(??)\nstringprep.in_table_c12(??)\nstringprep.in_table_c21(??)\nstringprep.in_table_c21_c22(??)\nstringprep.in_table_c22(??)\nstringprep.in_table_c3(??)\nstringprep.in_table_c4(??)\nstringprep.in_table_c5(??)\nstringprep.in_table_c6(??)\nstringprep.in_table_c7(??)\nstringprep.in_table_c8(??)\nstringprep.in_table_c9(??)\nstringprep.in_table_d1(??)\nstringprep.in_table_d2(??)\nstringprep.map_table_b2(??)\nstringprep.map_table_b3(??)\nstringprep.unicodedata(??)\nstruct.Struct(??)\nstruct.calcsize(??)\nstruct.error(??)\nstruct.pack(??)\nstruct.pack_into(??)\nstruct.unpack(??)\nstruct.unpack_from(??)\nsubprocess.CalledProcessError(??)\nsubprocess.MAXFD\nsubprocess.PIPE\nsubprocess.Popen(??)\nsubprocess.STDOUT\nsubprocess.call(??)\nsubprocess.check_call(??)\nsubprocess.check_output(??)\nsubprocess.errno(??)\nsubprocess.fcntl(??)\nsubprocess.gc(??)\nsubprocess.getoutput(??)\nsubprocess.getstatusoutput(??)\nsubprocess.io(??)\nsubprocess.list2cmdline(??)\nsubprocess.mswindows(??)\nsubprocess.os(??)\nsubprocess.pickle(??)\nsubprocess.select(??)\nsubprocess.signal(??)\nsubprocess.sys(??)\nsubprocess.traceback(??)\nsum(iterable[, start]) -> value\nsunau.AUDIO_FILE_ENCODING_ADPCM_G721\nsunau.AUDIO_FILE_ENCODING_ADPCM_G722\nsunau.AUDIO_FILE_ENCODING_ADPCM_G723_3\nsunau.AUDIO_FILE_ENCODING_ADPCM_G723_5\nsunau.AUDIO_FILE_ENCODING_ALAW_8\nsunau.AUDIO_FILE_ENCODING_DOUBLE\nsunau.AUDIO_FILE_ENCODING_FLOAT\nsunau.AUDIO_FILE_ENCODING_LINEAR_16\nsunau.AUDIO_FILE_ENCODING_LINEAR_24\nsunau.AUDIO_FILE_ENCODING_LINEAR_32\nsunau.AUDIO_FILE_ENCODING_LINEAR_8\nsunau.AUDIO_FILE_ENCODING_MULAW_8\nsunau.AUDIO_FILE_MAGIC\nsunau.AUDIO_UNKNOWN_SIZE\nsunau.Au_read(??)\nsunau.Au_write(??)\nsunau.Error(??)\nsunau.open(??)\nsunau.openfp(??)\nsuper() -> same as super(__class__, <first argument>)\nsymbol.and_expr\nsymbol.and_test\nsymbol.arglist\nsymbol.argument\nsymbol.arith_expr\nsymbol.assert_stmt\nsymbol.atom\nsymbol.augassign\nsymbol.break_stmt\nsymbol.classdef\nsymbol.comp_for\nsymbol.comp_if\nsymbol.comp_iter\nsymbol.comp_op\nsymbol.comparison\nsymbol.compound_stmt\nsymbol.continue_stmt\nsymbol.decorated\nsymbol.decorator\nsymbol.decorators\nsymbol.del_stmt\nsymbol.dictorsetmaker\nsymbol.dotted_as_name\nsymbol.dotted_as_names\nsymbol.dotted_name\nsymbol.encoding_decl\nsymbol.eval_input\nsymbol.except_clause\nsymbol.expr\nsymbol.expr_stmt\nsymbol.exprlist\nsymbol.factor\nsymbol.file_input\nsymbol.flow_stmt\nsymbol.for_stmt\nsymbol.funcdef\nsymbol.global_stmt\nsymbol.if_stmt\nsymbol.import_as_name\nsymbol.import_as_names\nsymbol.import_from\nsymbol.import_name\nsymbol.import_stmt\nsymbol.lambdef\nsymbol.lambdef_nocond\nsymbol.main(??)\nsymbol.nonlocal_stmt\nsymbol.not_test\nsymbol.or_test\nsymbol.parameters\nsymbol.pass_stmt\nsymbol.power\nsymbol.raise_stmt\nsymbol.return_stmt\nsymbol.shift_expr\nsymbol.simple_stmt\nsymbol.single_input\nsymbol.sliceop\nsymbol.small_stmt\nsymbol.star_expr\nsymbol.stmt\nsymbol.subscript\nsymbol.subscriptlist\nsymbol.suite\nsymbol.sym_name(??)\nsymbol.term\nsymbol.test\nsymbol.test_nocond\nsymbol.testlist\nsymbol.testlist1\nsymbol.testlist_comp\nsymbol.tfpdef\nsymbol.trailer\nsymbol.try_stmt\nsymbol.typedargslist\nsymbol.varargslist\nsymbol.vfpdef\nsymbol.while_stmt\nsymbol.with_item\nsymbol.with_stmt\nsymbol.xor_expr\nsymbol.yield_expr\nsymbol.yield_stmt\nsymtable.Class(??)\nsymtable.DEF_BOUND\nsymtable.DEF_FREE_CLASS\nsymtable.DEF_FREE_GLOBAL\nsymtable.DEF_GLOBAL\nsymtable.DEF_IMPORT\nsymtable.DEF_LOCAL\nsymtable.DEF_PARAM\nsymtable.FREE\nsymtable.Function(??)\nsymtable.GLOBAL_EXPLICIT\nsymtable.GLOBAL_IMPLICIT\nsymtable.OPT_IMPORT_STAR\nsymtable.SCOPE_MASK\nsymtable.SCOPE_OFF\nsymtable.Symbol(??)\nsymtable.SymbolTable(??)\nsymtable.SymbolTableFactory(??)\nsymtable.USE\nsymtable.symtable(??)\nsymtable.weakref(??)\nsys.api_version\nsys.argv(??)\nsys.builtin_module_names(??)\nsys.byteorder\nsys.call_tracing(func, args) -> object\nsys.callstats() -> tuple of integers\nsys.copyright\nsys.displayhook(object) -> None\nsys.dont_write_bytecode(??)\nsys.exc_info() -> (type, value, traceback)\nsys.excepthook(exctype, value, traceback) -> None\nsys.exec_prefix\nsys.executable\nsys.exit([status])\nsys.flags(??)\nsys.float_info(??)\nsys.float_repr_style\nsys.getcheckinterval() -> current check interval; see setcheckinterval().\nsys.getdefaultencoding() -> string\nsys.getdlopenflags() -> int\nsys.getfilesystemencoding() -> string\nsys.getprofile()\nsys.getrecursionlimit()\nsys.getrefcount(object) -> integer\nsys.getsizeof(object, default) -> int\nsys.gettrace()\nsys.hexversion\nsys.int_info(??)\nsys.intern(string) -> string\nsys.maxsize\nsys.maxunicode\nsys.meta_path(??)\nsys.modules(??)\nsys.path(??)\nsys.path_hooks(??)\nsys.path_importer_cache(??)\nsys.platform\nsys.prefix\nsys.setcheckinterval(n)\nsys.setdlopenflags(n) -> None\nsys.setfilesystemencoding(string) -> None\nsys.setprofile(function)\nsys.setrecursionlimit(n)\nsys.settrace(function)\nsys.stderr(??)\nsys.stdin(??)\nsys.stdout(??)\nsys.subversion(??)\nsys.version\nsys.version_info(??)\nsys.warnoptions(??)\nsyslog.LOG_ALERT\nsyslog.LOG_AUTH\nsyslog.LOG_CONS\nsyslog.LOG_CRIT\nsyslog.LOG_CRON\nsyslog.LOG_DAEMON\nsyslog.LOG_DEBUG\nsyslog.LOG_EMERG\nsyslog.LOG_ERR\nsyslog.LOG_INFO\nsyslog.LOG_KERN\nsyslog.LOG_LOCAL0\nsyslog.LOG_LOCAL1\nsyslog.LOG_LOCAL2\nsyslog.LOG_LOCAL3\nsyslog.LOG_LOCAL4\nsyslog.LOG_LOCAL5\nsyslog.LOG_LOCAL6\nsyslog.LOG_LOCAL7\nsyslog.LOG_LPR\nsyslog.LOG_MAIL\nsyslog.LOG_MASK(??)\nsyslog.LOG_NDELAY\nsyslog.LOG_NEWS\nsyslog.LOG_NOTICE\nsyslog.LOG_NOWAIT\nsyslog.LOG_PERROR\nsyslog.LOG_PID\nsyslog.LOG_SYSLOG\nsyslog.LOG_UPTO(??)\nsyslog.LOG_USER\nsyslog.LOG_UUCP\nsyslog.LOG_WARNING\nsyslog.closelog(??)\nsyslog.openlog(??)\nsyslog.setlogmask(??)\nsyslog.syslog(??)\ntabnanny.NannyNag(??)\ntabnanny.Whitespace(??)\ntabnanny.check(file_or_dir)\ntabnanny.errprint(??)\ntabnanny.filename_only\ntabnanny.format_witnesses(??)\ntabnanny.getopt(??)\ntabnanny.main(??)\ntabnanny.os(??)\ntabnanny.process_tokens(??)\ntabnanny.sys(??)\ntabnanny.tokenize(??)\ntabnanny.verbose\ntarfile.AREGTYPE\ntarfile.BLKTYPE\ntarfile.BLOCKSIZE\ntarfile.CHRTYPE\ntarfile.CONTTYPE\ntarfile.CompressionError(??)\ntarfile.DEFAULT_FORMAT\ntarfile.DIRTYPE\ntarfile.ENCODING\ntarfile.ExFileObject(??)\ntarfile.ExtractError(??)\ntarfile.FIFOTYPE\ntarfile.GNUTYPE_LONGLINK\ntarfile.GNUTYPE_LONGNAME\ntarfile.GNUTYPE_SPARSE\ntarfile.GNU_FORMAT\ntarfile.GNU_MAGIC\ntarfile.GNU_TYPES(??)\ntarfile.HeaderError(??)\ntarfile.LENGTH_LINK\ntarfile.LENGTH_NAME\ntarfile.LENGTH_PREFIX\ntarfile.LNKTYPE\ntarfile.NUL\ntarfile.PAX_FIELDS(??)\ntarfile.PAX_FORMAT\ntarfile.PAX_NUMBER_FIELDS(??)\ntarfile.POSIX_MAGIC\ntarfile.RECORDSIZE\ntarfile.REGTYPE\ntarfile.REGULAR_TYPES(??)\ntarfile.ReadError(??)\ntarfile.SOLARIS_XHDTYPE\ntarfile.SUPPORTED_TYPES(??)\ntarfile.SYMTYPE\ntarfile.S_IFBLK\ntarfile.S_IFCHR\ntarfile.S_IFDIR\ntarfile.S_IFIFO\ntarfile.S_IFLNK\ntarfile.S_IFREG\ntarfile.StreamError(??)\ntarfile.TGEXEC\ntarfile.TGREAD\ntarfile.TGWRITE\ntarfile.TOEXEC\ntarfile.TOREAD\ntarfile.TOWRITE\ntarfile.TSGID\ntarfile.TSUID\ntarfile.TSVTX\ntarfile.TUEXEC\ntarfile.TUREAD\ntarfile.TUWRITE\ntarfile.TarError(??)\ntarfile.TarFile(??)\ntarfile.TarInfo(??)\ntarfile.TarIter(??)\ntarfile.USTAR_FORMAT\ntarfile.XGLTYPE\ntarfile.XHDTYPE\ntarfile.bltn_open(??)\ntarfile.calc_chksums(??)\ntarfile.copy(??)\ntarfile.copyfileobj(??)\ntarfile.errno(??)\ntarfile.filemode(??)\ntarfile.filemode_table(??)\ntarfile.grp(??)\ntarfile.is_tarfile(??)\ntarfile.itn(??)\ntarfile.normpath(??)\ntarfile.nti(??)\ntarfile.nts(??)\ntarfile.open(??)\ntarfile.os(??)\ntarfile.pwd(??)\ntarfile.re(??)\ntarfile.shutil(??)\ntarfile.stat(??)\ntarfile.stn(??)\ntarfile.struct(??)\ntarfile.sys(??)\ntarfile.time(??)\ntarfile.version\ntelnetlib.AO\ntelnetlib.AUTHENTICATION\ntelnetlib.AYT\ntelnetlib.BINARY\ntelnetlib.BM\ntelnetlib.BRK\ntelnetlib.CHARSET\ntelnetlib.COM_PORT_OPTION\ntelnetlib.DEBUGLEVEL\ntelnetlib.DET\ntelnetlib.DM\ntelnetlib.DO\ntelnetlib.DONT\ntelnetlib.EC\ntelnetlib.ECHO\ntelnetlib.EL\ntelnetlib.ENCRYPT\ntelnetlib.EOR\ntelnetlib.EXOPL\ntelnetlib.FORWARD_X\ntelnetlib.GA\ntelnetlib.IAC\ntelnetlib.IP\ntelnetlib.KERMIT\ntelnetlib.LFLOW\ntelnetlib.LINEMODE\ntelnetlib.LOGOUT\ntelnetlib.NAMS\ntelnetlib.NAOCRD\ntelnetlib.NAOFFD\ntelnetlib.NAOHTD\ntelnetlib.NAOHTS\ntelnetlib.NAOL\ntelnetlib.NAOLFD\ntelnetlib.NAOP\ntelnetlib.NAOVTD\ntelnetlib.NAOVTS\ntelnetlib.NAWS\ntelnetlib.NEW_ENVIRON\ntelnetlib.NOOPT\ntelnetlib.NOP\ntelnetlib.OLD_ENVIRON\ntelnetlib.OUTMRK\ntelnetlib.PRAGMA_HEARTBEAT\ntelnetlib.PRAGMA_LOGON\ntelnetlib.RCP\ntelnetlib.RCTE\ntelnetlib.RSP\ntelnetlib.SB\ntelnetlib.SE\ntelnetlib.SEND_URL\ntelnetlib.SGA\ntelnetlib.SNDLOC\ntelnetlib.SSPI_LOGON\ntelnetlib.STATUS\ntelnetlib.SUPDUP\ntelnetlib.SUPDUPOUTPUT\ntelnetlib.SUPPRESS_LOCAL_ECHO\ntelnetlib.TELNET_PORT\ntelnetlib.TLS\ntelnetlib.TM\ntelnetlib.TN3270E\ntelnetlib.TSPEED\ntelnetlib.TTYLOC\ntelnetlib.TTYPE\ntelnetlib.TUID\ntelnetlib.Telnet(??)\ntelnetlib.VT3270REGIME\ntelnetlib.WILL\ntelnetlib.WONT\ntelnetlib.X3PAD\ntelnetlib.XASCII\ntelnetlib.XAUTH\ntelnetlib.XDISPLOC\ntelnetlib.select(??)\ntelnetlib.socket(??)\ntelnetlib.sys(??)\ntelnetlib.test(??)\ntelnetlib.theNULL\ntempfile.NamedTemporaryFile(??)\ntempfile.SpooledTemporaryFile(??)\ntempfile.TMP_MAX\ntempfile.TemporaryFile(??)\ntempfile.gettempdir(??)\ntempfile.gettempprefix(??)\ntempfile.mkdtemp(??)\ntempfile.mkstemp(??)\ntempfile.mktemp(??)\ntempfile.tempdir(??)\ntempfile.template\ntermios.B0\ntermios.B110\ntermios.B115200\ntermios.B1200\ntermios.B134\ntermios.B150\ntermios.B1800\ntermios.B19200\ntermios.B200\ntermios.B230400\ntermios.B2400\ntermios.B300\ntermios.B38400\ntermios.B460800\ntermios.B4800\ntermios.B50\ntermios.B57600\ntermios.B600\ntermios.B75\ntermios.B9600\ntermios.BRKINT\ntermios.BS0\ntermios.BS1\ntermios.BSDLY\ntermios.CBAUD\ntermios.CBAUDEX\ntermios.CDSUSP\ntermios.CEOF\ntermios.CEOL\ntermios.CEOT\ntermios.CERASE\ntermios.CFLUSH\ntermios.CIBAUD\ntermios.CINTR\ntermios.CKILL\ntermios.CLNEXT\ntermios.CLOCAL\ntermios.CQUIT\ntermios.CR0\ntermios.CR1\ntermios.CR2\ntermios.CR3\ntermios.CRDLY\ntermios.CREAD\ntermios.CRPRNT\ntermios.CRTSCTS\ntermios.CS5\ntermios.CS6\ntermios.CS7\ntermios.CS8\ntermios.CSIZE\ntermios.CSTART\ntermios.CSTOP\ntermios.CSTOPB\ntermios.CSUSP\ntermios.CWERASE\ntermios.ECHO\ntermios.ECHOCTL\ntermios.ECHOE\ntermios.ECHOK\ntermios.ECHOKE\ntermios.ECHONL\ntermios.ECHOPRT\ntermios.EXTA\ntermios.EXTB\ntermios.FF0\ntermios.FF1\ntermios.FFDLY\ntermios.FIOASYNC\ntermios.FIOCLEX\ntermios.FIONBIO\ntermios.FIONCLEX\ntermios.FIONREAD\ntermios.FLUSHO\ntermios.HUPCL\ntermios.ICANON\ntermios.ICRNL\ntermios.IEXTEN\ntermios.IGNBRK\ntermios.IGNCR\ntermios.IGNPAR\ntermios.IMAXBEL\ntermios.INLCR\ntermios.INPCK\ntermios.IOCSIZE_MASK\ntermios.IOCSIZE_SHIFT\ntermios.ISIG\ntermios.ISTRIP\ntermios.IUCLC\ntermios.IXANY\ntermios.IXOFF\ntermios.IXON\ntermios.NCC\ntermios.NCCS\ntermios.NL0\ntermios.NL1\ntermios.NLDLY\ntermios.NOFLSH\ntermios.N_MOUSE\ntermios.N_PPP\ntermios.N_SLIP\ntermios.N_STRIP\ntermios.N_TTY\ntermios.OCRNL\ntermios.OFDEL\ntermios.OFILL\ntermios.OLCUC\ntermios.ONLCR\ntermios.ONLRET\ntermios.ONOCR\ntermios.OPOST\ntermios.PARENB\ntermios.PARMRK\ntermios.PARODD\ntermios.PENDIN\ntermios.TAB0\ntermios.TAB1\ntermios.TAB2\ntermios.TAB3\ntermios.TABDLY\ntermios.TCFLSH\ntermios.TCGETA\ntermios.TCGETS\ntermios.TCIFLUSH\ntermios.TCIOFF\ntermios.TCIOFLUSH\ntermios.TCION\ntermios.TCOFLUSH\ntermios.TCOOFF\ntermios.TCOON\ntermios.TCSADRAIN\ntermios.TCSAFLUSH\ntermios.TCSANOW\ntermios.TCSBRK\ntermios.TCSBRKP\ntermios.TCSETA\ntermios.TCSETAF\ntermios.TCSETAW\ntermios.TCSETS\ntermios.TCSETSF\ntermios.TCSETSW\ntermios.TCXONC\ntermios.TIOCCONS\ntermios.TIOCEXCL\ntermios.TIOCGETD\ntermios.TIOCGICOUNT\ntermios.TIOCGLCKTRMIOS\ntermios.TIOCGPGRP\ntermios.TIOCGSERIAL\ntermios.TIOCGSOFTCAR\ntermios.TIOCGWINSZ\ntermios.TIOCINQ\ntermios.TIOCLINUX\ntermios.TIOCMBIC\ntermios.TIOCMBIS\ntermios.TIOCMGET\ntermios.TIOCMIWAIT\ntermios.TIOCMSET\ntermios.TIOCM_CAR\ntermios.TIOCM_CD\ntermios.TIOCM_CTS\ntermios.TIOCM_DSR\ntermios.TIOCM_DTR\ntermios.TIOCM_LE\ntermios.TIOCM_RI\ntermios.TIOCM_RNG\ntermios.TIOCM_RTS\ntermios.TIOCM_SR\ntermios.TIOCM_ST\ntermios.TIOCNOTTY\ntermios.TIOCNXCL\ntermios.TIOCOUTQ\ntermios.TIOCPKT\ntermios.TIOCPKT_DATA\ntermios.TIOCPKT_DOSTOP\ntermios.TIOCPKT_FLUSHREAD\ntermios.TIOCPKT_FLUSHWRITE\ntermios.TIOCPKT_NOSTOP\ntermios.TIOCPKT_START\ntermios.TIOCPKT_STOP\ntermios.TIOCSCTTY\ntermios.TIOCSERCONFIG\ntermios.TIOCSERGETLSR\ntermios.TIOCSERGETMULTI\ntermios.TIOCSERGSTRUCT\ntermios.TIOCSERGWILD\ntermios.TIOCSERSETMULTI\ntermios.TIOCSERSWILD\ntermios.TIOCSER_TEMT\ntermios.TIOCSETD\ntermios.TIOCSLCKTRMIOS\ntermios.TIOCSPGRP\ntermios.TIOCSSERIAL\ntermios.TIOCSSOFTCAR\ntermios.TIOCSTI\ntermios.TIOCSWINSZ\ntermios.TOSTOP\ntermios.VDISCARD\ntermios.VEOF\ntermios.VEOL\ntermios.VEOL2\ntermios.VERASE\ntermios.VINTR\ntermios.VKILL\ntermios.VLNEXT\ntermios.VMIN\ntermios.VQUIT\ntermios.VREPRINT\ntermios.VSTART\ntermios.VSTOP\ntermios.VSUSP\ntermios.VSWTC\ntermios.VSWTCH\ntermios.VT0\ntermios.VT1\ntermios.VTDLY\ntermios.VTIME\ntermios.VWERASE\ntermios.XCASE\ntermios.XTABS\ntermios.error(??)\ntermios.tcdrain(fd) -> None\ntermios.tcflow(fd, action) -> None\ntermios.tcflush(fd, queue) -> None\ntermios.tcgetattr(fd) -> list_of_attrs\ntermios.tcsendbreak(fd, duration) -> None\ntermios.tcsetattr(fd, when, attributes) -> None\ntextwrap.TextWrapper(??)\ntextwrap.dedent(??)\ntextwrap.fill(??)\ntextwrap.re(??)\ntextwrap.string(??)\ntextwrap.wrap(??)\nthreading.BoundedSemaphore(??)\nthreading.Condition(??)\nthreading.Event(??)\nthreading.Lock(??)\nthreading.RLock(??)\nthreading.Semaphore(??)\nthreading.Thread(??)\nthreading.ThreadError(??)\nthreading.Timer(??)\nthreading.activeCount(??)\nthreading.active_count(??)\nthreading.currentThread(??)\nthreading.current_thread(??)\nthreading.deque(iterable[, maxlen]) --> deque object\nthreading.enumerate(??)\nthreading.local(??)\nthreading.setprofile(??)\nthreading.settrace(??)\nthreading.stack_size([size]) -> size\ntime.accept2dyear\ntime.altzone\ntime.asctime([tuple]) -> string\ntime.clock() -> floating point number\ntime.ctime(seconds) -> string\ntime.daylight\ntime.gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\ntime.localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\ntime.mktime(tuple) -> floating point number\ntime.sleep(seconds)\ntime.strftime(format[, tuple]) -> string\ntime.strptime(string, format) -> struct_time\ntime.struct_time(??)\ntime.time() -> floating point number\ntime.timezone\ntime.tzname(??)\ntime.tzset(zone)\ntimeit.Timer(??)\ntimeit.default_number\ntimeit.default_repeat\ntimeit.default_timer(??)\ntimeit.dummy_src_name\ntimeit.gc(??)\ntimeit.itertools(??)\ntimeit.main(??)\ntimeit.reindent(??)\ntimeit.repeat(??)\ntimeit.sys(??)\ntimeit.template\ntimeit.time(??)\ntimeit.timeit(??)\ntoken.AMPER\ntoken.AMPEREQUAL\ntoken.AT\ntoken.CIRCUMFLEX\ntoken.CIRCUMFLEXEQUAL\ntoken.COLON\ntoken.COMMA\ntoken.DEDENT\ntoken.DOT\ntoken.DOUBLESLASH\ntoken.DOUBLESLASHEQUAL\ntoken.DOUBLESTAR\ntoken.DOUBLESTAREQUAL\ntoken.ELLIPSIS\ntoken.ENDMARKER\ntoken.EQEQUAL\ntoken.EQUAL\ntoken.ERRORTOKEN\ntoken.GREATER\ntoken.GREATEREQUAL\ntoken.INDENT\ntoken.ISEOF(??)\ntoken.ISNONTERMINAL(??)\ntoken.ISTERMINAL(??)\ntoken.LBRACE\ntoken.LEFTSHIFT\ntoken.LEFTSHIFTEQUAL\ntoken.LESS\ntoken.LESSEQUAL\ntoken.LPAR\ntoken.LSQB\ntoken.MINEQUAL\ntoken.MINUS\ntoken.NAME\ntoken.NEWLINE\ntoken.NOTEQUAL\ntoken.NT_OFFSET\ntoken.NUMBER\ntoken.N_TOKENS\ntoken.OP\ntoken.PERCENT\ntoken.PERCENTEQUAL\ntoken.PLUS\ntoken.PLUSEQUAL\ntoken.RARROW\ntoken.RBRACE\ntoken.RIGHTSHIFT\ntoken.RIGHTSHIFTEQUAL\ntoken.RPAR\ntoken.RSQB\ntoken.SEMI\ntoken.SLASH\ntoken.SLASHEQUAL\ntoken.STAR\ntoken.STAREQUAL\ntoken.STRING\ntoken.TILDE\ntoken.VBAR\ntoken.VBAREQUAL\ntoken.main(??)\ntoken.tok_name(??)\ntokenize.AMPER\ntokenize.AMPEREQUAL\ntokenize.AT\ntokenize.BOM_UTF8\ntokenize.Binnumber\ntokenize.Bracket\ntokenize.CIRCUMFLEX\ntokenize.CIRCUMFLEXEQUAL\ntokenize.COLON\ntokenize.COMMA\ntokenize.COMMENT\ntokenize.Comment\ntokenize.ContStr\ntokenize.DEDENT\ntokenize.DOT\ntokenize.DOUBLESLASH\ntokenize.DOUBLESLASHEQUAL\ntokenize.DOUBLESTAR\ntokenize.DOUBLESTAREQUAL\ntokenize.Decnumber\ntokenize.Double\ntokenize.Double3\ntokenize.ELLIPSIS\ntokenize.ENCODING\ntokenize.ENDMARKER\ntokenize.EQEQUAL\ntokenize.EQUAL\ntokenize.ERRORTOKEN\ntokenize.Expfloat\ntokenize.Exponent\ntokenize.Floatnumber\ntokenize.Funny\ntokenize.GREATER\ntokenize.GREATEREQUAL\ntokenize.Hexnumber\ntokenize.INDENT\ntokenize.ISEOF(??)\ntokenize.ISNONTERMINAL(??)\ntokenize.ISTERMINAL(??)\ntokenize.Ignore\ntokenize.Imagnumber\ntokenize.Intnumber\ntokenize.LBRACE\ntokenize.LEFTSHIFT\ntokenize.LEFTSHIFTEQUAL\ntokenize.LESS\ntokenize.LESSEQUAL\ntokenize.LPAR\ntokenize.LSQB\ntokenize.MINEQUAL\ntokenize.MINUS\ntokenize.NAME\ntokenize.NEWLINE\ntokenize.NL\ntokenize.NOTEQUAL\ntokenize.NT_OFFSET\ntokenize.NUMBER\ntokenize.N_TOKENS\ntokenize.Name\ntokenize.Number\ntokenize.OP\ntokenize.Octnumber\ntokenize.Operator\ntokenize.PERCENT\ntokenize.PERCENTEQUAL\ntokenize.PLUS\ntokenize.PLUSEQUAL\ntokenize.PlainToken\ntokenize.Pointfloat\ntokenize.PseudoExtras\ntokenize.PseudoToken\ntokenize.RARROW\ntokenize.RBRACE\ntokenize.RIGHTSHIFT\ntokenize.RIGHTSHIFTEQUAL\ntokenize.RPAR\ntokenize.RSQB\ntokenize.SEMI\ntokenize.SLASH\ntokenize.SLASHEQUAL\ntokenize.STAR\ntokenize.STAREQUAL\ntokenize.STRING\ntokenize.Single\ntokenize.Single3\ntokenize.Special\ntokenize.StopTokenizing(??)\ntokenize.String\ntokenize.TILDE\ntokenize.Token\ntokenize.TokenError(??)\ntokenize.TokenInfo(type, string, start, end, line)\ntokenize.Triple\ntokenize.Untokenizer(??)\ntokenize.VBAR\ntokenize.VBAREQUAL\ntokenize.Whitespace\ntokenize.any(??)\ntokenize.cookie_re(??)\ntokenize.detect_encoding(??)\ntokenize.double3prog(??)\ntokenize.endprogs(??)\ntokenize.generate_tokens(??)\ntokenize.group(??)\ntokenize.lookup(encoding) -> CodecInfo\ntokenize.main(??)\ntokenize.maybe(??)\ntokenize.pseudoprog(??)\ntokenize.re(??)\ntokenize.single3prog(??)\ntokenize.single_quoted(??)\ntokenize.string(??)\ntokenize.sys(??)\ntokenize.t\ntokenize.tabsize\ntokenize.tok_name(??)\ntokenize.tokenize(??)\ntokenize.tokenprog(??)\ntokenize.triple_quoted(??)\ntokenize.untokenize(??)\ntrace.CoverageResults(??)\ntrace.Ignore(??)\ntrace.PRAGMA_NOCOVER\ntrace.Trace(??)\ntrace.find_executable_linenos(??)\ntrace.find_lines(??)\ntrace.find_lines_from_code(??)\ntrace.find_strings(??)\ntrace.fullmodname(??)\ntrace.gc(??)\ntrace.io(??)\ntrace.linecache(??)\ntrace.main(??)\ntrace.modname(??)\ntrace.os(??)\ntrace.pickle(??)\ntrace.re(??)\ntrace.rx_blank(??)\ntrace.sys(??)\ntrace.threading(??)\ntrace.time(??)\ntrace.token(??)\ntrace.tokenize(??)\ntrace.types(??)\ntrace.usage(??)\ntraceback.extract_stack(??)\ntraceback.extract_tb(??)\ntraceback.format_exc(??)\ntraceback.format_exception(??)\ntraceback.format_exception_only(??)\ntraceback.format_list(??)\ntraceback.format_stack(??)\ntraceback.format_tb(??)\ntraceback.linecache(??)\ntraceback.print_exc(??)\ntraceback.print_exception(??)\ntraceback.print_last(??)\ntraceback.print_list(??)\ntraceback.print_stack(??)\ntraceback.print_tb(??)\ntraceback.sys(??)\ntty.B0\ntty.B110\ntty.B115200\ntty.B1200\ntty.B134\ntty.B150\ntty.B1800\ntty.B19200\ntty.B200\ntty.B230400\ntty.B2400\ntty.B300\ntty.B38400\ntty.B460800\ntty.B4800\ntty.B50\ntty.B57600\ntty.B600\ntty.B75\ntty.B9600\ntty.BRKINT\ntty.BS0\ntty.BS1\ntty.BSDLY\ntty.CBAUD\ntty.CBAUDEX\ntty.CC\ntty.CDSUSP\ntty.CEOF\ntty.CEOL\ntty.CEOT\ntty.CERASE\ntty.CFLAG\ntty.CFLUSH\ntty.CIBAUD\ntty.CINTR\ntty.CKILL\ntty.CLNEXT\ntty.CLOCAL\ntty.CQUIT\ntty.CR0\ntty.CR1\ntty.CR2\ntty.CR3\ntty.CRDLY\ntty.CREAD\ntty.CRPRNT\ntty.CRTSCTS\ntty.CS5\ntty.CS6\ntty.CS7\ntty.CS8\ntty.CSIZE\ntty.CSTART\ntty.CSTOP\ntty.CSTOPB\ntty.CSUSP\ntty.CWERASE\ntty.ECHO\ntty.ECHOCTL\ntty.ECHOE\ntty.ECHOK\ntty.ECHOKE\ntty.ECHONL\ntty.ECHOPRT\ntty.EXTA\ntty.EXTB\ntty.FF0\ntty.FF1\ntty.FFDLY\ntty.FIOASYNC\ntty.FIOCLEX\ntty.FIONBIO\ntty.FIONCLEX\ntty.FIONREAD\ntty.FLUSHO\ntty.HUPCL\ntty.ICANON\ntty.ICRNL\ntty.IEXTEN\ntty.IFLAG\ntty.IGNBRK\ntty.IGNCR\ntty.IGNPAR\ntty.IMAXBEL\ntty.INLCR\ntty.INPCK\ntty.IOCSIZE_MASK\ntty.IOCSIZE_SHIFT\ntty.ISIG\ntty.ISPEED\ntty.ISTRIP\ntty.IUCLC\ntty.IXANY\ntty.IXOFF\ntty.IXON\ntty.LFLAG\ntty.NCC\ntty.NCCS\ntty.NL0\ntty.NL1\ntty.NLDLY\ntty.NOFLSH\ntty.N_MOUSE\ntty.N_PPP\ntty.N_SLIP\ntty.N_STRIP\ntty.N_TTY\ntty.OCRNL\ntty.OFDEL\ntty.OFILL\ntty.OFLAG\ntty.OLCUC\ntty.ONLCR\ntty.ONLRET\ntty.ONOCR\ntty.OPOST\ntty.OSPEED\ntty.PARENB\ntty.PARMRK\ntty.PARODD\ntty.PENDIN\ntty.TAB0\ntty.TAB1\ntty.TAB2\ntty.TAB3\ntty.TABDLY\ntty.TCFLSH\ntty.TCGETA\ntty.TCGETS\ntty.TCIFLUSH\ntty.TCIOFF\ntty.TCIOFLUSH\ntty.TCION\ntty.TCOFLUSH\ntty.TCOOFF\ntty.TCOON\ntty.TCSADRAIN\ntty.TCSAFLUSH\ntty.TCSANOW\ntty.TCSBRK\ntty.TCSBRKP\ntty.TCSETA\ntty.TCSETAF\ntty.TCSETAW\ntty.TCSETS\ntty.TCSETSF\ntty.TCSETSW\ntty.TCXONC\ntty.TIOCCONS\ntty.TIOCEXCL\ntty.TIOCGETD\ntty.TIOCGICOUNT\ntty.TIOCGLCKTRMIOS\ntty.TIOCGPGRP\ntty.TIOCGSERIAL\ntty.TIOCGSOFTCAR\ntty.TIOCGWINSZ\ntty.TIOCINQ\ntty.TIOCLINUX\ntty.TIOCMBIC\ntty.TIOCMBIS\ntty.TIOCMGET\ntty.TIOCMIWAIT\ntty.TIOCMSET\ntty.TIOCM_CAR\ntty.TIOCM_CD\ntty.TIOCM_CTS\ntty.TIOCM_DSR\ntty.TIOCM_DTR\ntty.TIOCM_LE\ntty.TIOCM_RI\ntty.TIOCM_RNG\ntty.TIOCM_RTS\ntty.TIOCM_SR\ntty.TIOCM_ST\ntty.TIOCNOTTY\ntty.TIOCNXCL\ntty.TIOCOUTQ\ntty.TIOCPKT\ntty.TIOCPKT_DATA\ntty.TIOCPKT_DOSTOP\ntty.TIOCPKT_FLUSHREAD\ntty.TIOCPKT_FLUSHWRITE\ntty.TIOCPKT_NOSTOP\ntty.TIOCPKT_START\ntty.TIOCPKT_STOP\ntty.TIOCSCTTY\ntty.TIOCSERCONFIG\ntty.TIOCSERGETLSR\ntty.TIOCSERGETMULTI\ntty.TIOCSERGSTRUCT\ntty.TIOCSERGWILD\ntty.TIOCSERSETMULTI\ntty.TIOCSERSWILD\ntty.TIOCSER_TEMT\ntty.TIOCSETD\ntty.TIOCSLCKTRMIOS\ntty.TIOCSPGRP\ntty.TIOCSSERIAL\ntty.TIOCSSOFTCAR\ntty.TIOCSTI\ntty.TIOCSWINSZ\ntty.TOSTOP\ntty.VDISCARD\ntty.VEOF\ntty.VEOL\ntty.VEOL2\ntty.VERASE\ntty.VINTR\ntty.VKILL\ntty.VLNEXT\ntty.VMIN\ntty.VQUIT\ntty.VREPRINT\ntty.VSTART\ntty.VSTOP\ntty.VSUSP\ntty.VSWTC\ntty.VSWTCH\ntty.VT0\ntty.VT1\ntty.VTDLY\ntty.VTIME\ntty.VWERASE\ntty.XCASE\ntty.XTABS\ntty.error(??)\ntty.setcbreak(??)\ntty.setraw(??)\ntty.tcdrain(fd) -> None\ntty.tcflow(fd, action) -> None\ntty.tcflush(fd, queue) -> None\ntty.tcgetattr(fd) -> list_of_attrs\ntty.tcsendbreak(fd, duration) -> None\ntty.tcsetattr(fd, when, attributes) -> None\ntuple() -> an empty tuple\ntype(object) -> the object's type\ntypes.BuiltinFunctionType(??)\ntypes.BuiltinMethodType(??)\ntypes.CodeType(??)\ntypes.FrameType(??)\ntypes.FunctionType(??)\ntypes.GeneratorType(??)\ntypes.GetSetDescriptorType(??)\ntypes.LambdaType(??)\ntypes.MemberDescriptorType(??)\ntypes.MethodType(??)\ntypes.ModuleType(??)\ntypes.TracebackType(??)\nunicodedata.UCD(??)\nunicodedata.bidirectional(unichr)\nunicodedata.category(unichr)\nunicodedata.combining(unichr)\nunicodedata.decimal(unichr[, default])\nunicodedata.decomposition(unichr)\nunicodedata.digit(unichr[, default])\nunicodedata.east_asian_width(unichr)\nunicodedata.lookup(name)\nunicodedata.mirrored(unichr)\nunicodedata.name(unichr[, default])\nunicodedata.normalize(form, unistr)\nunicodedata.numeric(unichr[, default])\nunicodedata.ucd_3_2_0(??)\nunicodedata.ucnhash_CAPI(??)\nunicodedata.unidata_version\nunittest.CmpToKey(??)\nunittest.FunctionTestCase(??)\nunittest.SkipTest(??)\nunittest.TestCase(??)\nunittest.TestLoader(??)\nunittest.TestProgram(??)\nunittest.TestResult(??)\nunittest.TestSuite(??)\nunittest.TextTestRunner(??)\nunittest.defaultTestLoader(??)\nunittest.difflib(??)\nunittest.expectedFailure(??)\nunittest.findTestCases(??)\nunittest.functools(??)\nunittest.getTestCaseNames(??)\nunittest.main(??)\nunittest.makeSuite(??)\nunittest.os(??)\nunittest.pprint(??)\nunittest.re(??)\nunittest.skip(??)\nunittest.skipIf(??)\nunittest.skipUnless(??)\nunittest.sys(??)\nunittest.three_way_cmp(??)\nunittest.time(??)\nunittest.traceback(??)\nunittest.types(??)\nunittest.warnings(??)\nurllib.error(??)\nurllib.error.ContentTooShortError(??)\nurllib.error.HTTPError(??)\nurllib.error.URLError(??)\nurllib.error.urllib(??)\nurllib.parse(??)\nurllib.parse.MAX_CACHE_SIZE\nurllib.parse.ParseResult(??)\nurllib.parse.Quoter(??)\nurllib.parse.ResultMixin(??)\nurllib.parse.SplitResult(??)\nurllib.parse.clear_cache(??)\nurllib.parse.collections(??)\nurllib.parse.namedtuple(??)\nurllib.parse.non_hierarchical(??)\nurllib.parse.parse_qs(??)\nurllib.parse.parse_qsl(??)\nurllib.parse.quote('abc def') -> 'abc%20def'\nurllib.parse.quote_from_bytes(??)\nurllib.parse.quote_plus(??)\nurllib.parse.scheme_chars\nurllib.parse.splitattr('/path;attr1=value1;attr2=value2;...') ->\nurllib.parse.splithost('//host[:port]/path') --> 'host[:port]', '/path'.\nurllib.parse.splitnport(??)\nurllib.parse.splitpasswd('user:passwd') -> 'user', 'passwd'.\nurllib.parse.splitport('host:port') --> 'host', 'port'.\nurllib.parse.splitquery('/path?query') --> '/path', 'query'.\nurllib.parse.splittag('/path#tag') --> '/path', 'tag'.\nurllib.parse.splittype('type:opaquestring') --> 'type', 'opaquestring'.\nurllib.parse.splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.\nurllib.parse.splitvalue('attr=value') --> 'attr', 'value'.\nurllib.parse.sys(??)\nurllib.parse.test(??)\nurllib.parse.test_input\nurllib.parse.to_bytes(u\"URL\") --> 'URL'.\nurllib.parse.unquote(??)\nurllib.parse.unquote_plus(??)\nurllib.parse.unquote_to_bytes('abc%20def') -> b'abc def'.\nurllib.parse.unwrap('<URL:type://host/path>') --> 'type://host/path'.\nurllib.parse.urldefrag(??)\nurllib.parse.urlencode(??)\nurllib.parse.urljoin(??)\nurllib.parse.urlparse(??)\nurllib.parse.urlsplit(??)\nurllib.parse.urlunparse(??)\nurllib.parse.urlunsplit(??)\nurllib.parse.uses_fragment(??)\nurllib.parse.uses_netloc(??)\nurllib.parse.uses_params(??)\nurllib.parse.uses_query(??)\nurllib.parse.uses_relative(??)\nurllib.request(??)\nurllib.request.AbstractBasicAuthHandler(??)\nurllib.request.AbstractDigestAuthHandler(??)\nurllib.request.AbstractHTTPHandler(??)\nurllib.request.BaseHandler(??)\nurllib.request.CacheFTPHandler(??)\nurllib.request.ContentTooShortError(??)\nurllib.request.FTPHandler(??)\nurllib.request.FancyURLopener(??)\nurllib.request.FileHandler(??)\nurllib.request.HTTPBasicAuthHandler(??)\nurllib.request.HTTPCookieProcessor(??)\nurllib.request.HTTPDefaultErrorHandler(??)\nurllib.request.HTTPDigestAuthHandler(??)\nurllib.request.HTTPError(??)\nurllib.request.HTTPErrorProcessor(??)\nurllib.request.HTTPHandler(??)\nurllib.request.HTTPPasswordMgr(??)\nurllib.request.HTTPPasswordMgrWithDefaultRealm(??)\nurllib.request.HTTPRedirectHandler(??)\nurllib.request.HTTPSHandler(??)\nurllib.request.MAXFTPCACHE\nurllib.request.OpenerDirector(??)\nurllib.request.ProxyBasicAuthHandler(??)\nurllib.request.ProxyDigestAuthHandler(??)\nurllib.request.ProxyHandler(??)\nurllib.request.Request(??)\nurllib.request.URLError(??)\nurllib.request.URLopener(??)\nurllib.request.UnknownHandler(??)\nurllib.request.addclosehook(??)\nurllib.request.addinfourl(??)\nurllib.request.base64(??)\nurllib.request.bisect(??)\nurllib.request.build_opener(??)\nurllib.request.email(??)\nurllib.request.ftpcache(??)\nurllib.request.ftperrors(??)\nurllib.request.ftpwrapper(??)\nurllib.request.getproxies(??)\nurllib.request.getproxies_environment(??)\nurllib.request.hashlib(??)\nurllib.request.http(??)\nurllib.request.install_opener(??)\nurllib.request.io(??)\nurllib.request.localhost(??)\nurllib.request.noheaders(??)\nurllib.request.os(??)\nurllib.request.parse_http_list(??)\nurllib.request.parse_keqv_list(??)\nurllib.request.pathname2url(??)\nurllib.request.posixpath(??)\nurllib.request.proxy_bypass(??)\nurllib.request.proxy_bypass_environment(??)\nurllib.request.quote('abc def') -> 'abc%20def'\nurllib.request.random(??)\nurllib.request.randombytes(??)\nurllib.request.re(??)\nurllib.request.request_host(??)\nurllib.request.socket(??)\nurllib.request.splitattr('/path;attr1=value1;attr2=value2;...') ->\nurllib.request.splithost('//host[:port]/path') --> 'host[:port]', '/path'.\nurllib.request.splitpasswd('user:passwd') -> 'user', 'passwd'.\nurllib.request.splitport('host:port') --> 'host', 'port'.\nurllib.request.splitquery('/path?query') --> '/path', 'query'.\nurllib.request.splittype('type:opaquestring') --> 'type', 'opaquestring'.\nurllib.request.splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.\nurllib.request.splitvalue('attr=value') --> 'attr', 'value'.\nurllib.request.ssl(??)\nurllib.request.sys(??)\nurllib.request.thishost(??)\nurllib.request.time(??)\nurllib.request.to_bytes(u\"URL\") --> 'URL'.\nurllib.request.unquote(??)\nurllib.request.unwrap('<URL:type://host/path>') --> 'type://host/path'.\nurllib.request.url2pathname(??)\nurllib.request.urlcleanup(??)\nurllib.request.urljoin(??)\nurllib.request.urlopen(??)\nurllib.request.urlparse(??)\nurllib.request.urlretrieve(??)\nurllib.request.urlsplit(??)\nurllib.request.urlunparse(??)\nurllib.response(??)\nurllib.response.addbase(??)\nurllib.response.addclosehook(??)\nurllib.response.addinfo(??)\nurllib.response.addinfourl(??)\nurllib.robotparser.Entry(??)\nurllib.robotparser.RobotFileParser(??)\nurllib.robotparser.RuleLine(??)\nurllib.robotparser.urllib(??)\nuu.Error(??)\nuu.binascii(??)\nuu.decode(??)\nuu.encode(??)\nuu.os(??)\nuu.sys(??)\nuu.test(??)\nuuid.NAMESPACE_DNS(??)\nuuid.NAMESPACE_OID(??)\nuuid.NAMESPACE_URL(??)\nuuid.NAMESPACE_X500(??)\nuuid.RESERVED_FUTURE\nuuid.RESERVED_MICROSOFT\nuuid.RESERVED_NCS\nuuid.RFC_4122\nuuid.UUID(??)\nuuid.bytes_(??)\nuuid.ctypes(??)\nuuid.getnode(??)\nuuid.int_(??)\nuuid.lib(??)\nuuid.libname\nuuid.uuid1(??)\nuuid.uuid3(??)\nuuid.uuid4(??)\nuuid.uuid5(??)\nvars([object]) -> dictionary\nwarnings.WarningMessage(??)\nwarnings.catch_warnings(??)\nwarnings.default_action\nwarnings.defaultaction\nwarnings.filters(??)\nwarnings.filterwarnings(??)\nwarnings.formatwarning(??)\nwarnings.linecache(??)\nwarnings.once_registry(??)\nwarnings.onceregistry(??)\nwarnings.resetwarnings(??)\nwarnings.showwarning(??)\nwarnings.simplefilter(??)\nwarnings.sys(??)\nwarnings.warn(??)\nwarnings.warn_explicit(??)\nwave.Chunk(??)\nwave.Error(??)\nwave.WAVE_FORMAT_PCM\nwave.Wave_read(??)\nwave.Wave_write(??)\nwave.big_endian\nwave.builtins(??)\nwave.open(??)\nwave.openfp(??)\nwave.struct(??)\nweakref.CallableProxyType(??)\nweakref.KeyedRef(??)\nweakref.ProxyType(??)\nweakref.ProxyTypes(??)\nweakref.ReferenceType(??)\nweakref.WeakKeyDictionary(??)\nweakref.WeakSet(??)\nweakref.WeakValueDictionary(??)\nweakref.collections(??)\nweakref.getweakrefcount(object) -- return the number of weak references\nweakref.getweakrefs(object) -- return a list of all weak reference objects\nweakref.proxy(object[, callback]) -- create a proxy object that weakly\nweakref.ref(??)\nwebbrowser.BackgroundBrowser(??)\nwebbrowser.BaseBrowser(??)\nwebbrowser.Elinks(??)\nwebbrowser.Error(??)\nwebbrowser.Galeon(??)\nwebbrowser.GenericBrowser(??)\nwebbrowser.Grail(??)\nwebbrowser.Konqueror(??)\nwebbrowser.Mozilla(??)\nwebbrowser.Netscape(??)\nwebbrowser.Opera(??)\nwebbrowser.UnixBrowser(??)\nwebbrowser.get(??)\nwebbrowser.io(??)\nwebbrowser.main(??)\nwebbrowser.open(??)\nwebbrowser.open_new(??)\nwebbrowser.open_new_tab(??)\nwebbrowser.os(??)\nwebbrowser.register(??)\nwebbrowser.register_X_browsers(??)\nwebbrowser.shlex(??)\nwebbrowser.stat(??)\nwebbrowser.subprocess(??)\nwebbrowser.sys(??)\nwebbrowser.time(??)\nwsgiref.handlers(??)\nwsgiref.handlers.BaseCGIHandler(??)\nwsgiref.handlers.BaseHandler(??)\nwsgiref.handlers.CGIHandler(??)\nwsgiref.handlers.FileWrapper(??)\nwsgiref.handlers.Headers(??)\nwsgiref.handlers.SimpleHandler(??)\nwsgiref.handlers.format_date_time(??)\nwsgiref.handlers.guess_scheme(??)\nwsgiref.handlers.is_hop_by_hop(??)\nwsgiref.handlers.os(??)\nwsgiref.handlers.sys(??)\nwsgiref.handlers.time(??)\nwsgiref.headers(??)\nwsgiref.headers.Headers(??)\nwsgiref.headers.re(??)\nwsgiref.headers.tspecials(??)\nwsgiref.simple_server(??)\nwsgiref.simple_server.BaseHTTPRequestHandler(??)\nwsgiref.simple_server.HTTPServer(??)\nwsgiref.simple_server.ServerHandler(??)\nwsgiref.simple_server.SimpleHandler(??)\nwsgiref.simple_server.WSGIRequestHandler(??)\nwsgiref.simple_server.WSGIServer(??)\nwsgiref.simple_server.demo_app(??)\nwsgiref.simple_server.make_server(??)\nwsgiref.simple_server.server_version\nwsgiref.simple_server.software_version\nwsgiref.simple_server.sys(??)\nwsgiref.simple_server.sys_version\nwsgiref.simple_server.urllib(??)\nwsgiref.util(??)\nwsgiref.util.FileWrapper(??)\nwsgiref.util.application_uri(??)\nwsgiref.util.guess_scheme(??)\nwsgiref.util.is_hop_by_hop(??)\nwsgiref.util.posixpath(??)\nwsgiref.util.request_uri(??)\nwsgiref.util.setup_testing_defaults(??)\nwsgiref.util.shift_path_info(??)\nwsgiref.validate.ErrorWrapper(??)\nwsgiref.validate.InputWrapper(??)\nwsgiref.validate.IteratorWrapper(??)\nwsgiref.validate.PartialIteratorWrapper(??)\nwsgiref.validate.WSGIWarning(??)\nwsgiref.validate.WriteWrapper(??)\nwsgiref.validate.assert_(??)\nwsgiref.validate.bad_header_value_re(??)\nwsgiref.validate.check_content_type(??)\nwsgiref.validate.check_environ(??)\nwsgiref.validate.check_errors(??)\nwsgiref.validate.check_exc_info(??)\nwsgiref.validate.check_headers(??)\nwsgiref.validate.check_input(??)\nwsgiref.validate.check_iterator(??)\nwsgiref.validate.check_status(??)\nwsgiref.validate.check_string_type(??)\nwsgiref.validate.header_re(??)\nwsgiref.validate.re(??)\nwsgiref.validate.sys(??)\nwsgiref.validate.validator(??)\nwsgiref.validate.warnings(??)\nxdrlib.BytesIO([buffer]) -> object\nxdrlib.ConversionError(??)\nxdrlib.Error(??)\nxdrlib.Packer(??)\nxdrlib.Unpacker(??)\nxdrlib.struct(??)\nxml.dom(??)\nxml.dom.DOMException(??)\nxml.dom.DOMSTRING_SIZE_ERR\nxml.dom.DomstringSizeErr(??)\nxml.dom.EMPTY_NAMESPACE(??)\nxml.dom.EMPTY_PREFIX(??)\nxml.dom.HIERARCHY_REQUEST_ERR\nxml.dom.HierarchyRequestErr(??)\nxml.dom.INDEX_SIZE_ERR\nxml.dom.INUSE_ATTRIBUTE_ERR\nxml.dom.INVALID_ACCESS_ERR\nxml.dom.INVALID_CHARACTER_ERR\nxml.dom.INVALID_MODIFICATION_ERR\nxml.dom.INVALID_STATE_ERR\nxml.dom.IndexSizeErr(??)\nxml.dom.InuseAttributeErr(??)\nxml.dom.InvalidAccessErr(??)\nxml.dom.InvalidCharacterErr(??)\nxml.dom.InvalidModificationErr(??)\nxml.dom.InvalidStateErr(??)\nxml.dom.NAMESPACE_ERR\nxml.dom.NOT_FOUND_ERR\nxml.dom.NOT_SUPPORTED_ERR\nxml.dom.NO_DATA_ALLOWED_ERR\nxml.dom.NO_MODIFICATION_ALLOWED_ERR\nxml.dom.NamespaceErr(??)\nxml.dom.NoDataAllowedErr(??)\nxml.dom.NoModificationAllowedErr(??)\nxml.dom.Node(??)\nxml.dom.NodeFilter.NodeFilter(??)\nxml.dom.NotFoundErr(??)\nxml.dom.NotSupportedErr(??)\nxml.dom.SYNTAX_ERR\nxml.dom.SyntaxErr(??)\nxml.dom.UserDataHandler(??)\nxml.dom.VALIDATION_ERR\nxml.dom.ValidationErr(??)\nxml.dom.WRONG_DOCUMENT_ERR\nxml.dom.WrongDocumentErr(??)\nxml.dom.XHTML_NAMESPACE\nxml.dom.XMLNS_NAMESPACE\nxml.dom.XML_NAMESPACE\nxml.dom.domreg(??)\nxml.dom.domreg.EmptyNodeList(??)\nxml.dom.domreg.NodeList(??)\nxml.dom.domreg.StringTypes(??)\nxml.dom.domreg.defproperty(??)\nxml.dom.domreg.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxml.dom.domreg.registerDOMImplementation(name, factory)\nxml.dom.domreg.registered(??)\nxml.dom.domreg.well_known_implementations(??)\nxml.dom.expatbuilder.CDATA_SECTION_NODE\nxml.dom.expatbuilder.DOCUMENT_NODE\nxml.dom.expatbuilder.EMPTY_NAMESPACE(??)\nxml.dom.expatbuilder.EMPTY_PREFIX(??)\nxml.dom.expatbuilder.ElementInfo(??)\nxml.dom.expatbuilder.EmptyNodeList(??)\nxml.dom.expatbuilder.ExpatBuilder(??)\nxml.dom.expatbuilder.ExpatBuilderNS(??)\nxml.dom.expatbuilder.FILTER_ACCEPT\nxml.dom.expatbuilder.FILTER_INTERRUPT\nxml.dom.expatbuilder.FILTER_REJECT\nxml.dom.expatbuilder.FILTER_SKIP\nxml.dom.expatbuilder.FilterCrutch(??)\nxml.dom.expatbuilder.FilterVisibilityController(??)\nxml.dom.expatbuilder.FragmentBuilder(??)\nxml.dom.expatbuilder.FragmentBuilderNS(??)\nxml.dom.expatbuilder.InternalSubsetExtractor(??)\nxml.dom.expatbuilder.Namespaces(??)\nxml.dom.expatbuilder.Node(??)\nxml.dom.expatbuilder.NodeFilter(??)\nxml.dom.expatbuilder.NodeList(??)\nxml.dom.expatbuilder.ParseEscape(??)\nxml.dom.expatbuilder.Rejecter(??)\nxml.dom.expatbuilder.Skipper(??)\nxml.dom.expatbuilder.StringTypes(??)\nxml.dom.expatbuilder.TEXT_NODE\nxml.dom.expatbuilder.XMLNS_NAMESPACE\nxml.dom.expatbuilder.defproperty(??)\nxml.dom.expatbuilder.expat(??)\nxml.dom.expatbuilder.makeBuilder(??)\nxml.dom.expatbuilder.minidom(??)\nxml.dom.expatbuilder.parse(??)\nxml.dom.expatbuilder.parseFragment(??)\nxml.dom.expatbuilder.parseFragmentString(??)\nxml.dom.expatbuilder.parseString(??)\nxml.dom.expatbuilder.theDOMImplementation(??)\nxml.dom.expatbuilder.xmlbuilder(??)\nxml.dom.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxml.dom.minicompat(??)\nxml.dom.minicompat.EmptyNodeList(??)\nxml.dom.minicompat.NodeList(??)\nxml.dom.minicompat.StringTypes(??)\nxml.dom.minicompat.defproperty(??)\nxml.dom.minicompat.xml(??)\nxml.dom.minidom.Attr(??)\nxml.dom.minidom.AttributeList(??)\nxml.dom.minidom.CDATASection(??)\nxml.dom.minidom.CharacterData(??)\nxml.dom.minidom.Childless(??)\nxml.dom.minidom.Comment(??)\nxml.dom.minidom.DOMImplementation(??)\nxml.dom.minidom.DOMImplementationLS(??)\nxml.dom.minidom.Document(??)\nxml.dom.minidom.DocumentFragment(??)\nxml.dom.minidom.DocumentLS(??)\nxml.dom.minidom.DocumentType(??)\nxml.dom.minidom.EMPTY_NAMESPACE(??)\nxml.dom.minidom.EMPTY_PREFIX(??)\nxml.dom.minidom.Element(??)\nxml.dom.minidom.ElementInfo(??)\nxml.dom.minidom.EmptyNodeList(??)\nxml.dom.minidom.Entity(??)\nxml.dom.minidom.Identified(??)\nxml.dom.minidom.NamedNodeMap(??)\nxml.dom.minidom.Node(??)\nxml.dom.minidom.NodeList(??)\nxml.dom.minidom.Notation(??)\nxml.dom.minidom.ProcessingInstruction(??)\nxml.dom.minidom.ReadOnlySequentialNamedNodeMap(??)\nxml.dom.minidom.StringTypes(??)\nxml.dom.minidom.Text(??)\nxml.dom.minidom.TypeInfo(??)\nxml.dom.minidom.XMLNS_NAMESPACE\nxml.dom.minidom.codecs(??)\nxml.dom.minidom.defproperty(??)\nxml.dom.minidom.domreg(??)\nxml.dom.minidom.getDOMImplementation(??)\nxml.dom.minidom.io(??)\nxml.dom.minidom.parse(??)\nxml.dom.minidom.parseString(??)\nxml.dom.minidom.xml(??)\nxml.dom.pulldom(??)\nxml.dom.pulldom.CHARACTERS\nxml.dom.pulldom.COMMENT\nxml.dom.pulldom.DOMEventStream(??)\nxml.dom.pulldom.END_DOCUMENT\nxml.dom.pulldom.END_ELEMENT\nxml.dom.pulldom.ErrorHandler(??)\nxml.dom.pulldom.IGNORABLE_WHITESPACE\nxml.dom.pulldom.PROCESSING_INSTRUCTION\nxml.dom.pulldom.PullDOM(??)\nxml.dom.pulldom.SAX2DOM(??)\nxml.dom.pulldom.START_DOCUMENT\nxml.dom.pulldom.START_ELEMENT\nxml.dom.pulldom.default_bufsize\nxml.dom.pulldom.parse(??)\nxml.dom.pulldom.parseString(??)\nxml.dom.pulldom.types(??)\nxml.dom.pulldom.xml(??)\nxml.dom.registerDOMImplementation(name, factory)\nxml.dom.xmlbuilder.DOMBuilder(??)\nxml.dom.xmlbuilder.DOMBuilderFilter(??)\nxml.dom.xmlbuilder.DOMEntityResolver(??)\nxml.dom.xmlbuilder.DOMImplementationLS(??)\nxml.dom.xmlbuilder.DOMInputSource(??)\nxml.dom.xmlbuilder.DocumentLS(??)\nxml.dom.xmlbuilder.Options(??)\nxml.dom.xmlbuilder.copy(??)\nxml.dom.xmlbuilder.xml(??)\nxml.etree.ElementInclude.ElementTree(??)\nxml.etree.ElementInclude.FatalIncludeError(??)\nxml.etree.ElementInclude.XINCLUDE\nxml.etree.ElementInclude.XINCLUDE_FALLBACK\nxml.etree.ElementInclude.XINCLUDE_INCLUDE\nxml.etree.ElementInclude.copy(??)\nxml.etree.ElementInclude.default_loader(??)\nxml.etree.ElementInclude.include(??)\nxml.etree.ElementPath.Path(??)\nxml.etree.ElementPath.find(??)\nxml.etree.ElementPath.findall(??)\nxml.etree.ElementPath.findtext(??)\nxml.etree.ElementPath.re(??)\nxml.etree.ElementPath.xpath_descendant_or_self(??)\nxml.etree.ElementPath.xpath_tokenizer(??)\nxml.etree.ElementTree.Comment(??)\nxml.etree.ElementTree.Element(??)\nxml.etree.ElementTree.ElementPath(??)\nxml.etree.ElementTree.ElementTree(??)\nxml.etree.ElementTree.PI(??)\nxml.etree.ElementTree.ProcessingInstruction(??)\nxml.etree.ElementTree.QName(??)\nxml.etree.ElementTree.SubElement(??)\nxml.etree.ElementTree.TreeBuilder(??)\nxml.etree.ElementTree.VERSION\nxml.etree.ElementTree.XML(??)\nxml.etree.ElementTree.XMLID(??)\nxml.etree.ElementTree.XMLParser(??)\nxml.etree.ElementTree.XMLTreeBuilder(??)\nxml.etree.ElementTree.dump(??)\nxml.etree.ElementTree.fixtag(??)\nxml.etree.ElementTree.fromstring(??)\nxml.etree.ElementTree.iselement(??)\nxml.etree.ElementTree.iterparse(??)\nxml.etree.ElementTree.parse(??)\nxml.etree.ElementTree.re(??)\nxml.etree.ElementTree.sys(??)\nxml.etree.ElementTree.tostring(??)\nxml.etree.cElementTree.Comment(??)\nxml.etree.cElementTree.Element(??)\nxml.etree.cElementTree.ElementPath(??)\nxml.etree.cElementTree.ElementTree(??)\nxml.etree.cElementTree.PI(??)\nxml.etree.cElementTree.ProcessingInstruction(??)\nxml.etree.cElementTree.QName(??)\nxml.etree.cElementTree.SubElement(??)\nxml.etree.cElementTree.TreeBuilder(??)\nxml.etree.cElementTree.VERSION\nxml.etree.cElementTree.XML(??)\nxml.etree.cElementTree.XMLID(??)\nxml.etree.cElementTree.XMLParser(??)\nxml.etree.cElementTree.XMLParserError(??)\nxml.etree.cElementTree.XMLTreeBuilder(??)\nxml.etree.cElementTree.dump(??)\nxml.etree.cElementTree.fromstring(??)\nxml.etree.cElementTree.iselement(??)\nxml.etree.cElementTree.iterparse(??)\nxml.etree.cElementTree.parse(??)\nxml.etree.cElementTree.tostring(??)\nxml.parsers(??)\nxml.parsers.expat(??)\nxml.parsers.expat.EXPAT_VERSION\nxml.parsers.expat.ErrorString(errno) -> string\nxml.parsers.expat.ExpatError(??)\nxml.parsers.expat.ParserCreate([encoding[, namespace_separator]]) -> parser\nxml.parsers.expat.XMLParserType(??)\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_ALWAYS\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_NEVER\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE\nxml.parsers.expat.error(??)\nxml.parsers.expat.errors(??)\nxml.parsers.expat.expat_CAPI(??)\nxml.parsers.expat.features(??)\nxml.parsers.expat.model(??)\nxml.parsers.expat.native_encoding\nxml.parsers.expat.version_info(??)\nxml.sax(??)\nxml.sax.ContentHandler(??)\nxml.sax.ErrorHandler(??)\nxml.sax.InputSource(??)\nxml.sax.SAXException(??)\nxml.sax.SAXNotRecognizedException(??)\nxml.sax.SAXNotSupportedException(??)\nxml.sax.SAXParseException(??)\nxml.sax.SAXReaderNotAvailable(??)\nxml.sax.default_parser_list(??)\nxml.sax.expatreader.AttributesImpl(??)\nxml.sax.expatreader.AttributesNSImpl(??)\nxml.sax.expatreader.ExpatLocator(??)\nxml.sax.expatreader.ExpatParser(??)\nxml.sax.expatreader.SAXException(??)\nxml.sax.expatreader.SAXNotRecognizedException(??)\nxml.sax.expatreader.SAXNotSupportedException(??)\nxml.sax.expatreader.SAXParseException(??)\nxml.sax.expatreader.SAXReaderNotAvailable(??)\nxml.sax.expatreader.create_parser(??)\nxml.sax.expatreader.expat(??)\nxml.sax.expatreader.feature_external_ges\nxml.sax.expatreader.feature_external_pes\nxml.sax.expatreader.feature_namespace_prefixes\nxml.sax.expatreader.feature_namespaces\nxml.sax.expatreader.feature_string_interning\nxml.sax.expatreader.feature_validation\nxml.sax.expatreader.handler(??)\nxml.sax.expatreader.property_interning_dict\nxml.sax.expatreader.property_xml_string\nxml.sax.expatreader.saxutils(??)\nxml.sax.expatreader.version\nxml.sax.expatreader.xmlreader(??)\nxml.sax.handler(??)\nxml.sax.handler.ContentHandler(??)\nxml.sax.handler.DTDHandler(??)\nxml.sax.handler.EntityResolver(??)\nxml.sax.handler.ErrorHandler(??)\nxml.sax.handler.all_features(??)\nxml.sax.handler.all_properties(??)\nxml.sax.handler.feature_external_ges\nxml.sax.handler.feature_external_pes\nxml.sax.handler.feature_namespace_prefixes\nxml.sax.handler.feature_namespaces\nxml.sax.handler.feature_string_interning\nxml.sax.handler.feature_validation\nxml.sax.handler.property_declaration_handler\nxml.sax.handler.property_dom_node\nxml.sax.handler.property_encoding\nxml.sax.handler.property_interning_dict\nxml.sax.handler.property_lexical_handler\nxml.sax.handler.property_xml_string\nxml.sax.handler.version\nxml.sax.make_parser(??)\nxml.sax.parse(??)\nxml.sax.parseString(??)\nxml.sax.saxutils(??)\nxml.sax.saxutils.XMLFilterBase(??)\nxml.sax.saxutils.XMLGenerator(??)\nxml.sax.saxutils.escape(??)\nxml.sax.saxutils.handler(??)\nxml.sax.saxutils.os(??)\nxml.sax.saxutils.prepare_input_source(??)\nxml.sax.saxutils.quoteattr(??)\nxml.sax.saxutils.unescape(??)\nxml.sax.saxutils.urllib(??)\nxml.sax.saxutils.xmlreader(??)\nxml.sax.xmlreader(??)\nxml.sax.xmlreader.AttributesImpl(??)\nxml.sax.xmlreader.AttributesNSImpl(??)\nxml.sax.xmlreader.IncrementalParser(??)\nxml.sax.xmlreader.InputSource(??)\nxml.sax.xmlreader.Locator(??)\nxml.sax.xmlreader.SAXNotRecognizedException(??)\nxml.sax.xmlreader.SAXNotSupportedException(??)\nxml.sax.xmlreader.XMLReader(??)\nxml.sax.xmlreader.handler(??)\nxmlrpc.client(??)\nxmlrpc.client.APPLICATION_ERROR\nxmlrpc.client.Binary(??)\nxmlrpc.client.Boolean(??)\nxmlrpc.client.DateTime(??)\nxmlrpc.client.Error(??)\nxmlrpc.client.ExpatParser(??)\nxmlrpc.client.FastMarshaller(??)\nxmlrpc.client.FastParser(??)\nxmlrpc.client.FastUnmarshaller(??)\nxmlrpc.client.Fault(??)\nxmlrpc.client.INTERNAL_ERROR\nxmlrpc.client.INVALID_ENCODING_CHAR\nxmlrpc.client.INVALID_METHOD_PARAMS\nxmlrpc.client.INVALID_XMLRPC\nxmlrpc.client.MAXINT\nxmlrpc.client.METHOD_NOT_FOUND\nxmlrpc.client.MININT\nxmlrpc.client.Marshaller(??)\nxmlrpc.client.MultiCall(??)\nxmlrpc.client.MultiCallIterator(??)\nxmlrpc.client.NOT_WELLFORMED_ERROR\nxmlrpc.client.PARSE_ERROR\nxmlrpc.client.ProtocolError(??)\nxmlrpc.client.ResponseError(??)\nxmlrpc.client.SERVER_ERROR\nxmlrpc.client.SYSTEM_ERROR\nxmlrpc.client.SafeTransport(??)\nxmlrpc.client.Server(??)\nxmlrpc.client.ServerProxy(??)\nxmlrpc.client.TRANSPORT_ERROR\nxmlrpc.client.Transport(??)\nxmlrpc.client.UNSUPPORTED_ENCODING\nxmlrpc.client.Unmarshaller(??)\nxmlrpc.client.WRAPPERS(??)\nxmlrpc.client.base64(??)\nxmlrpc.client.boolean(??)\nxmlrpc.client.datetime(??)\nxmlrpc.client.dumps(??)\nxmlrpc.client.escape(??)\nxmlrpc.client.expat(??)\nxmlrpc.client.getparser() -> parser, unmarshaller\nxmlrpc.client.http(??)\nxmlrpc.client.io(??)\nxmlrpc.client.loads(??)\nxmlrpc.client.operator(??)\nxmlrpc.client.re(??)\nxmlrpc.client.time(??)\nxmlrpc.server(??)\nxmlrpc.server.BaseHTTPRequestHandler(??)\nxmlrpc.server.CGIXMLRPCRequestHandler(??)\nxmlrpc.server.DocCGIXMLRPCRequestHandler(??)\nxmlrpc.server.DocXMLRPCRequestHandler(??)\nxmlrpc.server.DocXMLRPCServer(??)\nxmlrpc.server.Fault(??)\nxmlrpc.server.ServerHTMLDoc(??)\nxmlrpc.server.SimpleXMLRPCDispatcher(??)\nxmlrpc.server.SimpleXMLRPCRequestHandler(??)\nxmlrpc.server.SimpleXMLRPCServer(??)\nxmlrpc.server.XMLRPCDocGenerator(??)\nxmlrpc.server.dumps(??)\nxmlrpc.server.fcntl(??)\nxmlrpc.server.http(??)\nxmlrpc.server.inspect(??)\nxmlrpc.server.list_public_methods(??)\nxmlrpc.server.loads(??)\nxmlrpc.server.os(??)\nxmlrpc.server.pydoc(??)\nxmlrpc.server.re(??)\nxmlrpc.server.resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d\nxmlrpc.server.socketserver(??)\nxmlrpc.server.sys(??)\nxmlrpc.server.traceback(??)\nzip(iter1 [,iter2 [...]]) --> zip object\nzipfile.BadZipfile(??)\nzipfile.LargeZipFile(??)\nzipfile.PyZipFile(??)\nzipfile.ZIP64_LIMIT\nzipfile.ZIP_DEFLATED\nzipfile.ZIP_FILECOUNT_LIMIT\nzipfile.ZIP_MAX_COMMENT\nzipfile.ZIP_STORED\nzipfile.ZipExtFile(??)\nzipfile.ZipFile(??)\nzipfile.ZipInfo(??)\nzipfile.binascii(??)\nzipfile.crc32(string[, start]) -- Compute a CRC-32 checksum of string.\nzipfile.error(??)\nzipfile.io(??)\nzipfile.is_zipfile(??)\nzipfile.main(??)\nzipfile.os(??)\nzipfile.shutil(??)\nzipfile.sizeCentralDir\nzipfile.sizeEndCentDir\nzipfile.sizeEndCentDir64\nzipfile.sizeEndCentDir64Locator\nzipfile.sizeFileHeader\nzipfile.stat(??)\nzipfile.stringCentralDir\nzipfile.stringEndArchive\nzipfile.stringEndArchive64\nzipfile.stringEndArchive64Locator\nzipfile.stringFileHeader\nzipfile.struct(??)\nzipfile.structCentralDir\nzipfile.structEndArchive\nzipfile.structEndArchive64\nzipfile.structEndArchive64Locator\nzipfile.structFileHeader\nzipfile.sys(??)\nzipfile.time(??)\nzipfile.zlib(??)\nzipimport.ZipImportError(??)\nzipimport.zipimporter(archivepath) -> zipimporter object\nzlib.DEFLATED\nzlib.DEF_MEM_LEVEL\nzlib.MAX_WBITS\nzlib.ZLIB_VERSION\nzlib.Z_BEST_COMPRESSION\nzlib.Z_BEST_SPEED\nzlib.Z_DEFAULT_COMPRESSION\nzlib.Z_DEFAULT_STRATEGY\nzlib.Z_FILTERED\nzlib.Z_FINISH\nzlib.Z_FULL_FLUSH\nzlib.Z_HUFFMAN_ONLY\nzlib.Z_NO_FLUSH\nzlib.Z_SYNC_FLUSH\nzlib.adler32(string[, start]) -- Compute an Adler-32 checksum of string.\nzlib.compress(string[, level]) -- Returned compressed string.\nzlib.compressobj([level]) -- Return a compressor object.\nzlib.crc32(string[, start]) -- Compute a CRC-32 checksum of string.\nzlib.decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\nzlib.decompressobj([wbits]) -- Return a decompressor object.\nzlib.error(??)\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/qsci/api/python/Python-3.2.api",
    "content": "ArithmeticError(??)\nAssertionError(??)\nAttributeError(??)\nBaseException(??)\nBufferError(??)\nBytesWarning(??)\nDeprecationWarning(??)\nEOFError(??)\nEllipsis(??)\nEnvironmentError(??)\nException(??)\nFalse(??)\nFloatingPointError(??)\nFutureWarning(??)\nGeneratorExit(??)\nIOError(??)\nImportError(??)\nImportWarning(??)\nIndentationError(??)\nIndexError(??)\nKeyError(??)\nKeyboardInterrupt(??)\nLookupError(??)\nMemoryError(??)\nNameError(??)\nNone(??)\nNotImplemented(??)\nNotImplementedError(??)\nOSError(??)\nOverflowError(??)\nPendingDeprecationWarning(??)\nReferenceError(??)\nResourceWarning(??)\nRuntimeError(??)\nRuntimeWarning(??)\nStopIteration(??)\nSyntaxError(??)\nSyntaxWarning(??)\nSystemError(??)\nSystemExit(??)\nTabError(??)\nTrue(??)\nTypeError(??)\nUnboundLocalError(??)\nUnicodeDecodeError(??)\nUnicodeEncodeError(??)\nUnicodeError(??)\nUnicodeTranslateError(??)\nUnicodeWarning(??)\nUserWarning(??)\nValueError(??)\nWarning(??)\nZeroDivisionError(??)\nabc.ABCMeta(??)\nabc.WeakSet(??)\nabc.abstractclassmethod(??)\nabc.abstractmethod(??)\nabc.abstractproperty(??)\nabc.abstractstaticmethod(??)\nabs(number) -> number\naifc.Aifc_read(??)\naifc.Aifc_write(??)\naifc.Chunk(??)\naifc.Error(??)\naifc.builtins(??)\naifc.open(??)\naifc.openfp(??)\naifc.struct(??)\nall(iterable) -> bool\nany(iterable) -> bool\nargparse.Action(??)\nargparse.ArgumentDefaultsHelpFormatter(??)\nargparse.ArgumentError(??)\nargparse.ArgumentParser(??)\nargparse.ArgumentTypeError(??)\nargparse.FileType(??)\nargparse.HelpFormatter(??)\nargparse.Namespace(??)\nargparse.ONE_OR_MORE\nargparse.OPTIONAL\nargparse.PARSER\nargparse.REMAINDER\nargparse.RawDescriptionHelpFormatter(??)\nargparse.RawTextHelpFormatter(??)\nargparse.SUPPRESS\nargparse.ZERO_OR_MORE\nargparse.ngettext(??)\nascii(object) -> string\nast.AST(??)\nast.Add(??)\nast.And(??)\nast.Assert(??)\nast.Assign(??)\nast.Attribute(??)\nast.AugAssign(??)\nast.AugLoad(??)\nast.AugStore(??)\nast.BinOp(??)\nast.BitAnd(??)\nast.BitOr(??)\nast.BitXor(??)\nast.BoolOp(??)\nast.Break(??)\nast.Bytes(??)\nast.Call(??)\nast.ClassDef(??)\nast.Compare(??)\nast.Continue(??)\nast.Del(??)\nast.Delete(??)\nast.Dict(??)\nast.DictComp(??)\nast.Div(??)\nast.Ellipsis(??)\nast.Eq(??)\nast.ExceptHandler(??)\nast.Expr(??)\nast.Expression(??)\nast.ExtSlice(??)\nast.FloorDiv(??)\nast.For(??)\nast.FunctionDef(??)\nast.GeneratorExp(??)\nast.Global(??)\nast.Gt(??)\nast.GtE(??)\nast.If(??)\nast.IfExp(??)\nast.Import(??)\nast.ImportFrom(??)\nast.In(??)\nast.Index(??)\nast.Interactive(??)\nast.Invert(??)\nast.Is(??)\nast.IsNot(??)\nast.LShift(??)\nast.Lambda(??)\nast.List(??)\nast.ListComp(??)\nast.Load(??)\nast.Lt(??)\nast.LtE(??)\nast.Mod(??)\nast.Module(??)\nast.Mult(??)\nast.Name(??)\nast.NodeTransformer(??)\nast.NodeVisitor(??)\nast.Nonlocal(??)\nast.Not(??)\nast.NotEq(??)\nast.NotIn(??)\nast.Num(??)\nast.Or(??)\nast.Param(??)\nast.Pass(??)\nast.Pow(??)\nast.PyCF_ONLY_AST\nast.RShift(??)\nast.Raise(??)\nast.Return(??)\nast.Set(??)\nast.SetComp(??)\nast.Slice(??)\nast.Starred(??)\nast.Store(??)\nast.Str(??)\nast.Sub(??)\nast.Subscript(??)\nast.Suite(??)\nast.TryExcept(??)\nast.TryFinally(??)\nast.Tuple(??)\nast.UAdd(??)\nast.USub(??)\nast.UnaryOp(??)\nast.While(??)\nast.With(??)\nast.Yield(??)\nast.alias(??)\nast.arg(??)\nast.arguments(??)\nast.boolop(??)\nast.cmpop(??)\nast.comprehension(??)\nast.copy_location(??)\nast.dump(??)\nast.excepthandler(??)\nast.expr(??)\nast.expr_context(??)\nast.fix_missing_locations(??)\nast.get_docstring(??)\nast.increment_lineno(??)\nast.iter_child_nodes(??)\nast.iter_fields(??)\nast.keyword(??)\nast.literal_eval(??)\nast.mod(??)\nast.operator(??)\nast.parse(??)\nast.slice(??)\nast.stmt(??)\nast.unaryop(??)\nast.walk(??)\nasynchat.async_chat(??)\nasynchat.asyncore(??)\nasynchat.buffer(??)\nasynchat.deque(iterable[, maxlen]) --> deque object\nasynchat.fifo(??)\nasynchat.find_prefix_at_end(??)\nasynchat.simple_producer(??)\nasynchat.socket(??)\nasyncore.EALREADY\nasyncore.EBADF\nasyncore.ECONNABORTED\nasyncore.ECONNRESET\nasyncore.EINPROGRESS\nasyncore.EINTR\nasyncore.EINVAL\nasyncore.EISCONN\nasyncore.ENOTCONN\nasyncore.ESHUTDOWN\nasyncore.EWOULDBLOCK\nasyncore.ExitNow(??)\nasyncore.close_all(??)\nasyncore.compact_traceback(??)\nasyncore.dispatcher(??)\nasyncore.dispatcher_with_send(??)\nasyncore.errorcode(??)\nasyncore.fcntl(??)\nasyncore.file_dispatcher(??)\nasyncore.file_wrapper(??)\nasyncore.loop(??)\nasyncore.os(??)\nasyncore.poll(??)\nasyncore.poll2(??)\nasyncore.poll3(??)\nasyncore.read(??)\nasyncore.readwrite(??)\nasyncore.select(??)\nasyncore.socket(??)\nasyncore.socket_map(??)\nasyncore.sys(??)\nasyncore.time(??)\nasyncore.warnings(??)\nasyncore.write(??)\nbase64.MAXBINSIZE\nbase64.MAXLINESIZE\nbase64.b16decode(??)\nbase64.b16encode(??)\nbase64.b32decode(??)\nbase64.b32encode(??)\nbase64.b64decode(??)\nbase64.b64encode(??)\nbase64.binascii(??)\nbase64.bytes_types(??)\nbase64.decode(??)\nbase64.decodebytes(??)\nbase64.decodestring(??)\nbase64.encode(??)\nbase64.encodebytes(??)\nbase64.encodestring(??)\nbase64.main(??)\nbase64.re(??)\nbase64.standard_b64decode(??)\nbase64.standard_b64encode(??)\nbase64.struct(??)\nbase64.test(??)\nbase64.urlsafe_b64decode(??)\nbase64.urlsafe_b64encode(??)\nbdb.Bdb(??)\nbdb.BdbQuit(??)\nbdb.Breakpoint(??)\nbdb.Tdb(??)\nbdb.bar(??)\nbdb.checkfuncname(??)\nbdb.effective(??)\nbdb.fnmatch(??)\nbdb.foo(??)\nbdb.os(??)\nbdb.set_trace(??)\nbdb.sys(??)\nbdb.test(??)\nbin(number) -> string\nbinhex.BinHex(??)\nbinhex.Error(??)\nbinhex.FInfo(??)\nbinhex.HexBin(??)\nbinhex.LINELEN\nbinhex.REASONABLY_LARGE\nbinhex.RUNCHAR\nbinhex.binascii(??)\nbinhex.binhex(infilename, outfilename): create binhex-encoded copy of a file\nbinhex.getfileinfo(??)\nbinhex.hexbin(infilename, outfilename) - Decode binhexed file\nbinhex.io(??)\nbinhex.openrsrc(??)\nbinhex.os(??)\nbinhex.struct(??)\nbinhex.sys(??)\nbisect.bisect(??)\nbisect.bisect_left(a, x[, lo[, hi]]) -> index\nbisect.bisect_right(a, x[, lo[, hi]]) -> index\nbisect.insort(??)\nbisect.insort_left(a, x[, lo[, hi]])\nbisect.insort_right(a, x[, lo[, hi]])\nbool(x) -> bool\nbuiltins.ArithmeticError(??)\nbuiltins.AssertionError(??)\nbuiltins.AttributeError(??)\nbuiltins.BaseException(??)\nbuiltins.BufferError(??)\nbuiltins.BytesWarning(??)\nbuiltins.DeprecationWarning(??)\nbuiltins.EOFError(??)\nbuiltins.Ellipsis(??)\nbuiltins.EnvironmentError(??)\nbuiltins.Exception(??)\nbuiltins.False\nbuiltins.FloatingPointError(??)\nbuiltins.FutureWarning(??)\nbuiltins.GeneratorExit(??)\nbuiltins.IOError(??)\nbuiltins.ImportError(??)\nbuiltins.ImportWarning(??)\nbuiltins.IndentationError(??)\nbuiltins.IndexError(??)\nbuiltins.KeyError(??)\nbuiltins.KeyboardInterrupt(??)\nbuiltins.LookupError(??)\nbuiltins.MemoryError(??)\nbuiltins.NameError(??)\nbuiltins.None\nbuiltins.NotImplemented(??)\nbuiltins.NotImplementedError(??)\nbuiltins.OSError(??)\nbuiltins.OverflowError(??)\nbuiltins.PendingDeprecationWarning(??)\nbuiltins.ReferenceError(??)\nbuiltins.ResourceWarning(??)\nbuiltins.RuntimeError(??)\nbuiltins.RuntimeWarning(??)\nbuiltins.StopIteration(??)\nbuiltins.SyntaxError(??)\nbuiltins.SyntaxWarning(??)\nbuiltins.SystemError(??)\nbuiltins.SystemExit(??)\nbuiltins.TabError(??)\nbuiltins.True\nbuiltins.TypeError(??)\nbuiltins.UnboundLocalError(??)\nbuiltins.UnicodeDecodeError(??)\nbuiltins.UnicodeEncodeError(??)\nbuiltins.UnicodeError(??)\nbuiltins.UnicodeTranslateError(??)\nbuiltins.UnicodeWarning(??)\nbuiltins.UserWarning(??)\nbuiltins.ValueError(??)\nbuiltins.Warning(??)\nbuiltins.ZeroDivisionError(??)\nbuiltins.abs(number) -> number\nbuiltins.all(iterable) -> bool\nbuiltins.any(iterable) -> bool\nbuiltins.ascii(object) -> string\nbuiltins.bin(number) -> string\nbuiltins.bool(x) -> bool\nbuiltins.bytearray(iterable_of_ints) -> bytearray\nbuiltins.bytes(iterable_of_ints) -> bytes\nbuiltins.callable(object) -> bool\nbuiltins.chr(i) -> Unicode character\nbuiltins.classmethod(function) -> method\nbuiltins.compile(source, filename, mode[, flags[, dont_inherit]]) -> code object\nbuiltins.complex(real[, imag]) -> complex number\nbuiltins.copyright(??)\nbuiltins.credits(??)\nbuiltins.delattr(object, name)\nbuiltins.dict() -> new empty dictionary\nbuiltins.dir([object]) -> list of strings\nbuiltins.divmod(x, y) -> (div, mod)\nbuiltins.enumerate(iterable[, start]) -> iterator for index, value of iterable\nbuiltins.eval(source[, globals[, locals]]) -> value\nbuiltins.exec(object[, globals[, locals]])\nbuiltins.exit(??)\nbuiltins.filter(function or None, iterable) --> filter object\nbuiltins.float(x) -> floating point number\nbuiltins.format(value[, format_spec]) -> string\nbuiltins.frozenset() -> empty frozenset object\nbuiltins.getattr(object, name[, default]) -> value\nbuiltins.globals() -> dictionary\nbuiltins.hasattr(object, name) -> bool\nbuiltins.hash(object) -> integer\nbuiltins.help(??)\nbuiltins.hex(number) -> string\nbuiltins.id(object) -> integer\nbuiltins.input([prompt]) -> string\nbuiltins.int(x[, base]) -> integer\nbuiltins.isinstance(object, class-or-type-or-tuple) -> bool\nbuiltins.issubclass(C, B) -> bool\nbuiltins.iter(iterable) -> iterator\nbuiltins.len(object) -> integer\nbuiltins.license(??)\nbuiltins.list() -> new empty list\nbuiltins.locals() -> dictionary\nbuiltins.map(func, *iterables) --> map object\nbuiltins.max(iterable[, key=func]) -> value\nbuiltins.memoryview(object)\nbuiltins.min(iterable[, key=func]) -> value\nbuiltins.next(iterator[, default])\nbuiltins.object(??)\nbuiltins.oct(number) -> string\nbuiltins.open(??)\nbuiltins.ord(c) -> integer\nbuiltins.pow(x, y[, z]) -> number\nbuiltins.print(value, ..., sep=' ', end='\\n', file=sys.stdout)\nbuiltins.property(fget=None, fset=None, fdel=None, doc=None) -> property attribute\nbuiltins.quit(??)\nbuiltins.range([start,] stop[, step]) -> range object\nbuiltins.repr(object) -> string\nbuiltins.reversed(sequence) -> reverse iterator over values of the sequence\nbuiltins.round(number[, ndigits]) -> number\nbuiltins.set() -> new empty set object\nbuiltins.setattr(object, name, value)\nbuiltins.slice([start,] stop[, step])\nbuiltins.sorted(iterable, key=None, reverse=False) --> new sorted list\nbuiltins.staticmethod(function) -> method\nbuiltins.str(string[, encoding[, errors]]) -> str\nbuiltins.sum(iterable[, start]) -> value\nbuiltins.super() -> same as super(__class__, <first argument>)\nbuiltins.tuple() -> empty tuple\nbuiltins.type(object) -> the object's type\nbuiltins.vars([object]) -> dictionary\nbuiltins.zip(iter1 [,iter2 [...]]) --> zip object\nbytearray(iterable_of_ints) -> bytearray\nbytes(iterable_of_ints) -> bytes\ncProfile.Profile(custom_timer=None, time_unit=None, subcalls=True, builtins=True)\ncProfile.label(??)\ncProfile.main(??)\ncProfile.run(??)\ncProfile.runctx(??)\ncalendar.Calendar(??)\ncalendar.EPOCH\ncalendar.FRIDAY\ncalendar.February\ncalendar.HTMLCalendar(??)\ncalendar.IllegalMonthError(??)\ncalendar.IllegalWeekdayError(??)\ncalendar.January\ncalendar.LocaleHTMLCalendar(??)\ncalendar.LocaleTextCalendar(??)\ncalendar.MONDAY\ncalendar.SATURDAY\ncalendar.SUNDAY\ncalendar.THURSDAY\ncalendar.TUESDAY\ncalendar.TextCalendar(??)\ncalendar.WEDNESDAY\ncalendar.c(??)\ncalendar.calendar(??)\ncalendar.datetime(??)\ncalendar.day_abbr(??)\ncalendar.day_name(??)\ncalendar.different_locale(??)\ncalendar.error(??)\ncalendar.firstweekday(??)\ncalendar.format(??)\ncalendar.formatstring(??)\ncalendar.isleap(??)\ncalendar.leapdays(??)\ncalendar.main(??)\ncalendar.mdays(??)\ncalendar.month(??)\ncalendar.month_abbr(??)\ncalendar.month_name(??)\ncalendar.monthcalendar(??)\ncalendar.monthrange(??)\ncalendar.prcal(??)\ncalendar.prmonth(??)\ncalendar.prweek(??)\ncalendar.setfirstweekday(??)\ncalendar.sys(??)\ncalendar.timegm(??)\ncalendar.week(??)\ncalendar.weekday(??)\ncalendar.weekheader(??)\ncallable(object) -> bool\ncgi.BytesIO([buffer]) -> object\ncgi.FeedParser(??)\ncgi.FieldStorage(??)\ncgi.MiniFieldStorage(??)\ncgi.StringIO(??)\ncgi.TextIOWrapper(??)\ncgi.dolog(??)\ncgi.escape(??)\ncgi.html(??)\ncgi.initlog(??)\ncgi.locale(??)\ncgi.log(??)\ncgi.logfile\ncgi.logfp(??)\ncgi.maxlen\ncgi.nolog(??)\ncgi.os(??)\ncgi.parse(??)\ncgi.parse_header(??)\ncgi.parse_multipart(??)\ncgi.parse_qs(??)\ncgi.parse_qsl(??)\ncgi.print_arguments(??)\ncgi.print_directory(??)\ncgi.print_environ(??)\ncgi.print_environ_usage(??)\ncgi.print_exception(??)\ncgi.print_form(??)\ncgi.sys(??)\ncgi.tempfile(??)\ncgi.test(??)\ncgi.urllib(??)\ncgi.valid_boundary(??)\ncgi.warn(??)\ncgitb.Hook(??)\ncgitb.enable(??)\ncgitb.grey(??)\ncgitb.handler(??)\ncgitb.html(??)\ncgitb.inspect(??)\ncgitb.keyword(??)\ncgitb.linecache(??)\ncgitb.lookup(??)\ncgitb.os(??)\ncgitb.pydoc(??)\ncgitb.reset(??)\ncgitb.scanvars(??)\ncgitb.small(??)\ncgitb.strong(??)\ncgitb.sys(??)\ncgitb.tempfile(??)\ncgitb.text(??)\ncgitb.time(??)\ncgitb.tokenize(??)\ncgitb.traceback(??)\ncgitb.types(??)\nchr(i) -> Unicode character\nchunk.Chunk(??)\nclassmethod(function) -> method\ncmd.Cmd(??)\ncmd.IDENTCHARS\ncmd.PROMPT\ncmd.string(??)\ncmd.sys(??)\ncode.CommandCompiler(??)\ncode.InteractiveConsole(??)\ncode.InteractiveInterpreter(??)\ncode.compile_command(??)\ncode.interact(??)\ncode.sys(??)\ncode.traceback(??)\ncodecs.BOM\ncodecs.BOM32_BE\ncodecs.BOM32_LE\ncodecs.BOM64_BE\ncodecs.BOM64_LE\ncodecs.BOM_BE\ncodecs.BOM_LE\ncodecs.BOM_UTF16\ncodecs.BOM_UTF16_BE\ncodecs.BOM_UTF16_LE\ncodecs.BOM_UTF32\ncodecs.BOM_UTF32_BE\ncodecs.BOM_UTF32_LE\ncodecs.BOM_UTF8\ncodecs.BufferedIncrementalDecoder(??)\ncodecs.BufferedIncrementalEncoder(??)\ncodecs.Codec(??)\ncodecs.CodecInfo(??)\ncodecs.EncodedFile(??)\ncodecs.IncrementalDecoder(??)\ncodecs.IncrementalEncoder(??)\ncodecs.StreamReader(??)\ncodecs.StreamReaderWriter(??)\ncodecs.StreamRecoder(??)\ncodecs.StreamWriter(??)\ncodecs.ascii_decode(??)\ncodecs.ascii_encode(??)\ncodecs.backslashreplace_errors(??)\ncodecs.builtins(??)\ncodecs.charmap_build(??)\ncodecs.charmap_decode(??)\ncodecs.charmap_encode(??)\ncodecs.decode(obj, [encoding[,errors]]) -> object\ncodecs.encode(obj, [encoding[,errors]]) -> object\ncodecs.escape_decode(??)\ncodecs.escape_encode(??)\ncodecs.getdecoder(??)\ncodecs.getencoder(??)\ncodecs.getincrementaldecoder(??)\ncodecs.getincrementalencoder(??)\ncodecs.getreader(??)\ncodecs.getwriter(??)\ncodecs.ignore_errors(??)\ncodecs.iterdecode(??)\ncodecs.iterencode(??)\ncodecs.latin_1_decode(??)\ncodecs.latin_1_encode(??)\ncodecs.lookup(encoding) -> CodecInfo\ncodecs.lookup_error(errors) -> handler\ncodecs.make_encoding_map(??)\ncodecs.make_identity_dict(rng) -> dict\ncodecs.open(??)\ncodecs.raw_unicode_escape_decode(??)\ncodecs.raw_unicode_escape_encode(??)\ncodecs.readbuffer_encode(??)\ncodecs.register(search_function)\ncodecs.register_error(errors, handler)\ncodecs.replace_errors(??)\ncodecs.strict_errors(??)\ncodecs.sys(??)\ncodecs.unicode_escape_decode(??)\ncodecs.unicode_escape_encode(??)\ncodecs.unicode_internal_decode(??)\ncodecs.unicode_internal_encode(??)\ncodecs.utf_16_be_decode(??)\ncodecs.utf_16_be_encode(??)\ncodecs.utf_16_decode(??)\ncodecs.utf_16_encode(??)\ncodecs.utf_16_ex_decode(??)\ncodecs.utf_16_le_decode(??)\ncodecs.utf_16_le_encode(??)\ncodecs.utf_32_be_decode(??)\ncodecs.utf_32_be_encode(??)\ncodecs.utf_32_decode(??)\ncodecs.utf_32_encode(??)\ncodecs.utf_32_ex_decode(??)\ncodecs.utf_32_le_decode(??)\ncodecs.utf_32_le_encode(??)\ncodecs.utf_7_decode(??)\ncodecs.utf_7_encode(??)\ncodecs.utf_8_decode(??)\ncodecs.utf_8_encode(??)\ncodecs.xmlcharrefreplace_errors(??)\ncodeop.CommandCompiler(??)\ncodeop.Compile(??)\ncodeop.PyCF_DONT_IMPLY_DEDENT\ncodeop.compile_command(??)\ncollections.ByteString(??)\ncollections.Callable(??)\ncollections.Container(??)\ncollections.Counter(??)\ncollections.Hashable(??)\ncollections.ItemsView(??)\ncollections.Iterable(??)\ncollections.Iterator(??)\ncollections.KeysView(??)\ncollections.Mapping(??)\ncollections.MappingView(??)\ncollections.MutableMapping(??)\ncollections.MutableSequence(??)\ncollections.MutableSet(??)\ncollections.OrderedDict(??)\ncollections.Sequence(??)\ncollections.Set(??)\ncollections.Sized(??)\ncollections.UserDict(??)\ncollections.UserList(??)\ncollections.UserString(??)\ncollections.ValuesView(??)\ncollections.defaultdict(default_factory) --> dict with default factory\ncollections.deque(iterable[, maxlen]) --> deque object\ncollections.namedtuple(??)\ncolorsys.ONE_SIXTH\ncolorsys.ONE_THIRD\ncolorsys.TWO_THIRD\ncolorsys.hls_to_rgb(??)\ncolorsys.hsv_to_rgb(??)\ncolorsys.rgb_to_hls(??)\ncolorsys.rgb_to_hsv(??)\ncolorsys.rgb_to_yiq(??)\ncolorsys.yiq_to_rgb(??)\ncompile(source, filename, mode[, flags[, dont_inherit]]) -> code object\ncompileall.compile_dir(??)\ncompileall.compile_file(??)\ncompileall.compile_path(??)\ncompileall.errno(??)\ncompileall.imp(??)\ncompileall.main(??)\ncompileall.os(??)\ncompileall.py_compile(??)\ncompileall.struct(??)\ncompileall.sys(??)\ncomplex(real[, imag]) -> complex number\nconcurrent.futures(??)\nconcurrent.futures.ALL_COMPLETED\nconcurrent.futures.CancelledError(??)\nconcurrent.futures.Executor(??)\nconcurrent.futures.FIRST_COMPLETED\nconcurrent.futures.FIRST_EXCEPTION\nconcurrent.futures.Future(??)\nconcurrent.futures.ProcessPoolExecutor(??)\nconcurrent.futures.ThreadPoolExecutor(??)\nconcurrent.futures.TimeoutError(??)\nconcurrent.futures.as_completed(??)\nconcurrent.futures.process(??)\nconcurrent.futures.process.EXTRA_QUEUED_CALLS\nconcurrent.futures.process.ProcessPoolExecutor(??)\nconcurrent.futures.process.atexit(??)\nconcurrent.futures.process.multiprocessing(??)\nconcurrent.futures.process.queue(??)\nconcurrent.futures.process.threading(??)\nconcurrent.futures.process.weakref(??)\nconcurrent.futures.thread(??)\nconcurrent.futures.thread.ThreadPoolExecutor(??)\nconcurrent.futures.thread.atexit(??)\nconcurrent.futures.thread.queue(??)\nconcurrent.futures.thread.threading(??)\nconcurrent.futures.thread.weakref(??)\nconcurrent.futures.wait(??)\nconfigparser.BasicInterpolation(??)\nconfigparser.ConfigParser(??)\nconfigparser.DEFAULTSECT\nconfigparser.DuplicateOptionError(??)\nconfigparser.DuplicateSectionError(??)\nconfigparser.Error(??)\nconfigparser.ExtendedInterpolation(??)\nconfigparser.Interpolation(??)\nconfigparser.InterpolationDepthError(??)\nconfigparser.InterpolationError(??)\nconfigparser.InterpolationMissingOptionError(??)\nconfigparser.InterpolationSyntaxError(??)\nconfigparser.LegacyInterpolation(??)\nconfigparser.MAX_INTERPOLATION_DEPTH\nconfigparser.MissingSectionHeaderError(??)\nconfigparser.MutableMapping(??)\nconfigparser.NoOptionError(??)\nconfigparser.NoSectionError(??)\nconfigparser.ParsingError(??)\nconfigparser.RawConfigParser(??)\nconfigparser.SafeConfigParser(??)\nconfigparser.SectionProxy(??)\nconfigparser.functools(??)\nconfigparser.io(??)\nconfigparser.itertools(??)\nconfigparser.re(??)\nconfigparser.sys(??)\nconfigparser.warnings(??)\ncontextlib.ContextDecorator(??)\ncontextlib.closing(??)\ncontextlib.contextmanager(??)\ncontextlib.sys(??)\ncontextlib.warn(??)\ncontextlib.wraps(??)\ncopy.Error(??)\ncopy.PyStringMap(??)\ncopy.builtins(??)\ncopy.copy(??)\ncopy.deepcopy(??)\ncopy.dispatch_table(??)\ncopy.error(??)\ncopy.name\ncopy.t(??)\ncopy.weakref(??)\ncopyreg.add_extension(??)\ncopyreg.clear_extension_cache(??)\ncopyreg.constructor(??)\ncopyreg.dispatch_table(??)\ncopyreg.pickle(??)\ncopyreg.pickle_complex(??)\ncopyreg.remove_extension(??)\ncopyright(??)\ncredits(??)\ncsv.Dialect(??)\ncsv.DictReader(??)\ncsv.DictWriter(??)\ncsv.Error(??)\ncsv.QUOTE_ALL\ncsv.QUOTE_MINIMAL\ncsv.QUOTE_NONE\ncsv.QUOTE_NONNUMERIC\ncsv.Sniffer(??)\ncsv.StringIO(??)\ncsv.excel(??)\ncsv.excel_tab(??)\ncsv.field_size_limit(??)\ncsv.get_dialect(??)\ncsv.list_dialects(??)\ncsv.re(??)\ncsv.reader(??)\ncsv.register_dialect(??)\ncsv.unix_dialect(??)\ncsv.unregister_dialect(??)\ncsv.writer(??)\nctypes.ARRAY(??)\nctypes.ArgumentError(??)\nctypes.Array(??)\nctypes.BigEndianStructure(??)\nctypes.CDLL(??)\nctypes.CFUNCTYPE(??)\nctypes.DEFAULT_MODE\nctypes.LibraryLoader(??)\nctypes.LittleEndianStructure(??)\nctypes.POINTER(??)\nctypes.PYFUNCTYPE(??)\nctypes.PyDLL(??)\nctypes.RTLD_GLOBAL\nctypes.RTLD_LOCAL\nctypes.SetPointerType(??)\nctypes.Structure(??)\nctypes.Union(??)\nctypes.addressof(C instance) -> integer\nctypes.alignment(C type) -> integer\nctypes.byref(C instance[, offset=0]) -> byref-object\nctypes.c_bool(??)\nctypes.c_buffer(??)\nctypes.c_byte(??)\nctypes.c_char(??)\nctypes.c_char_p(??)\nctypes.c_double(??)\nctypes.c_float(??)\nctypes.c_int(??)\nctypes.c_int16(??)\nctypes.c_int32(??)\nctypes.c_int64(??)\nctypes.c_int8(??)\nctypes.c_long(??)\nctypes.c_longdouble(??)\nctypes.c_longlong(??)\nctypes.c_short(??)\nctypes.c_size_t(??)\nctypes.c_ssize_t(??)\nctypes.c_ubyte(??)\nctypes.c_uint(??)\nctypes.c_uint16(??)\nctypes.c_uint32(??)\nctypes.c_uint64(??)\nctypes.c_uint8(??)\nctypes.c_ulong(??)\nctypes.c_ulonglong(??)\nctypes.c_ushort(??)\nctypes.c_void_p(??)\nctypes.c_voidp(??)\nctypes.c_wchar(??)\nctypes.c_wchar_p(??)\nctypes.cast(??)\nctypes.cdll(??)\nctypes.create_string_buffer(aBytes) -> character array\nctypes.create_unicode_buffer(aString) -> character array\nctypes.get_errno(??)\nctypes.macholib(??)\nctypes.macholib.dyld(??)\nctypes.macholib.dyld.DEFAULT_FRAMEWORK_FALLBACK(??)\nctypes.macholib.dyld.DEFAULT_LIBRARY_FALLBACK(??)\nctypes.macholib.dyld.accumulate(iterable) --> accumulate object\nctypes.macholib.dyld.chain(*iterables) --> chain object\nctypes.macholib.dyld.combinations(iterable, r) --> combinations object\nctypes.macholib.dyld.combinations_with_replacement(iterable, r) --> combinations_with_replacement object\nctypes.macholib.dyld.compress(data, selectors) --> iterator over selected data\nctypes.macholib.dyld.count(start=0, step=1) --> count object\nctypes.macholib.dyld.cycle(iterable) --> cycle object\nctypes.macholib.dyld.dropwhile(predicate, iterable) --> dropwhile object\nctypes.macholib.dyld.dyld_default_search(??)\nctypes.macholib.dyld.dyld_env(??)\nctypes.macholib.dyld.dyld_executable_path_search(??)\nctypes.macholib.dyld.dyld_fallback_framework_path(??)\nctypes.macholib.dyld.dyld_fallback_library_path(??)\nctypes.macholib.dyld.dyld_find(??)\nctypes.macholib.dyld.dyld_framework_path(??)\nctypes.macholib.dyld.dyld_image_suffix(??)\nctypes.macholib.dyld.dyld_image_suffix_search(??)\nctypes.macholib.dyld.dyld_library_path(??)\nctypes.macholib.dyld.dyld_override_search(??)\nctypes.macholib.dyld.dylib_info(??)\nctypes.macholib.dyld.filterfalse(function or None, sequence) --> filterfalse object\nctypes.macholib.dyld.framework_find(??)\nctypes.macholib.dyld.framework_info(??)\nctypes.macholib.dyld.groupby(iterable[, keyfunc]) -> create an iterator which returns\nctypes.macholib.dyld.islice(iterable, [start,] stop [, step]) --> islice object\nctypes.macholib.dyld.os(??)\nctypes.macholib.dyld.permutations(iterable[, r]) --> permutations object\nctypes.macholib.dyld.product(*iterables) --> product object\nctypes.macholib.dyld.repeat(object [,times]) -> create an iterator which returns the object\nctypes.macholib.dyld.starmap(function, sequence) --> starmap object\nctypes.macholib.dyld.takewhile(predicate, iterable) --> takewhile object\nctypes.macholib.dyld.tee(iterable, n=2) --> tuple of n independent iterators.\nctypes.macholib.dyld.test_dyld_find(??)\nctypes.macholib.dyld.zip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> zip_longest object\nctypes.macholib.dylib(??)\nctypes.macholib.dylib.DYLIB_RE(??)\nctypes.macholib.dylib.dylib_info(??)\nctypes.macholib.dylib.re(??)\nctypes.macholib.dylib.test_dylib_info(??)\nctypes.macholib.framework(??)\nctypes.macholib.framework.STRICT_FRAMEWORK_RE(??)\nctypes.macholib.framework.framework_info(??)\nctypes.macholib.framework.re(??)\nctypes.macholib.framework.test_framework_info(??)\nctypes.memmove(??)\nctypes.memset(??)\nctypes.pointer(??)\nctypes.py_object(??)\nctypes.pydll(??)\nctypes.pythonapi(??)\nctypes.resize(??)\nctypes.set_errno(??)\nctypes.sizeof(C type) -> integer\nctypes.string_at(addr[, size]) -> string\nctypes.util(??)\nctypes.util.contextlib(??)\nctypes.util.errno(??)\nctypes.util.find_library(??)\nctypes.util.os(??)\nctypes.util.re(??)\nctypes.util.sys(??)\nctypes.util.tempfile(??)\nctypes.util.test(??)\nctypes.wstring_at(addr[, size]) -> string\ndatetime.MAXYEAR\ndatetime.MINYEAR\ndatetime.date(year, month, day) --> date object\ndatetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\ndatetime.datetime_CAPI(??)\ndatetime.time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\ndatetime.timedelta(??)\ndatetime.timezone(??)\ndatetime.tzinfo(??)\ndbm.dumb.collections(??)\ndbm.dumb.error(??)\ndbm.dumb.open(??)\ndbm.error(??)\ndbm.io(??)\ndbm.open(??)\ndbm.os(??)\ndbm.struct(??)\ndbm.sys(??)\ndbm.whichdb(??)\ndecimal.BasicContext(??)\ndecimal.Clamped(??)\ndecimal.Context(??)\ndecimal.ConversionSyntax(??)\ndecimal.Decimal(??)\ndecimal.DecimalException(??)\ndecimal.DecimalTuple(sign, digits, exponent)\ndecimal.DefaultContext(??)\ndecimal.DivisionByZero(??)\ndecimal.DivisionImpossible(??)\ndecimal.DivisionUndefined(??)\ndecimal.ExtendedContext(??)\ndecimal.Inexact(??)\ndecimal.InvalidContext(??)\ndecimal.InvalidOperation(??)\ndecimal.Overflow(??)\ndecimal.ROUND_05UP\ndecimal.ROUND_CEILING\ndecimal.ROUND_DOWN\ndecimal.ROUND_FLOOR\ndecimal.ROUND_HALF_DOWN\ndecimal.ROUND_HALF_EVEN\ndecimal.ROUND_HALF_UP\ndecimal.ROUND_UP\ndecimal.Rounded(??)\ndecimal.Subnormal(??)\ndecimal.Underflow(??)\ndecimal.getcontext(??)\ndecimal.localcontext(??)\ndecimal.setcontext(??)\ndelattr(object, name)\ndict() -> new empty dictionary\ndifflib.Differ(??)\ndifflib.HtmlDiff(??)\ndifflib.IS_CHARACTER_JUNK(??)\ndifflib.IS_LINE_JUNK(??)\ndifflib.Match(a, b, size)\ndifflib.SequenceMatcher(??)\ndifflib.context_diff(??)\ndifflib.get_close_matches(??)\ndifflib.heapq(??)\ndifflib.ndiff(??)\ndifflib.restore(??)\ndifflib.unified_diff(??)\ndifflib.warnings(??)\ndir([object]) -> list of strings\ndis.COMPILER_FLAG_NAMES(??)\ndis.EXTENDED_ARG\ndis.HAVE_ARGUMENT\ndis.cmp_op(??)\ndis.code_info(??)\ndis.dis(??)\ndis.disassemble(??)\ndis.disco(??)\ndis.distb(??)\ndis.findlabels(??)\ndis.findlinestarts(??)\ndis.hascompare(??)\ndis.hasconst(??)\ndis.hasfree(??)\ndis.hasjabs(??)\ndis.hasjrel(??)\ndis.haslocal(??)\ndis.hasname(??)\ndis.opmap(??)\ndis.opname(??)\ndis.pretty_flags(??)\ndis.show_code(??)\ndis.sys(??)\ndis.types(??)\ndivmod(x, y) -> (div, mod)\ndoctest.BLANKLINE_MARKER\ndoctest.COMPARISON_FLAGS\ndoctest.DONT_ACCEPT_BLANKLINE\ndoctest.DONT_ACCEPT_TRUE_FOR_1\ndoctest.DebugRunner(??)\ndoctest.DocFileCase(??)\ndoctest.DocFileSuite(??)\ndoctest.DocFileTest(??)\ndoctest.DocTest(??)\ndoctest.DocTestCase(??)\ndoctest.DocTestFailure(??)\ndoctest.DocTestFinder(??)\ndoctest.DocTestParser(??)\ndoctest.DocTestRunner(??)\ndoctest.DocTestSuite(??)\ndoctest.ELLIPSIS\ndoctest.ELLIPSIS_MARKER\ndoctest.Example(??)\ndoctest.IGNORE_EXCEPTION_DETAIL\ndoctest.NORMALIZE_WHITESPACE\ndoctest.OPTIONFLAGS_BY_NAME(??)\ndoctest.OutputChecker(??)\ndoctest.REPORTING_FLAGS\ndoctest.REPORT_CDIFF\ndoctest.REPORT_NDIFF\ndoctest.REPORT_ONLY_FIRST_FAILURE\ndoctest.REPORT_UDIFF\ndoctest.SKIP\ndoctest.SkipDocTestCase(??)\ndoctest.StringIO(??)\ndoctest.TestResults(failed, attempted)\ndoctest.UnexpectedException(??)\ndoctest.debug(??)\ndoctest.debug_script(??)\ndoctest.debug_src(??)\ndoctest.difflib(??)\ndoctest.inspect(??)\ndoctest.linecache(??)\ndoctest.master(??)\ndoctest.namedtuple(??)\ndoctest.os(??)\ndoctest.pdb(??)\ndoctest.re(??)\ndoctest.register_optionflag(??)\ndoctest.run_docstring_examples(??)\ndoctest.script_from_examples(??)\ndoctest.set_unittest_reportflags(??)\ndoctest.sys(??)\ndoctest.tempfile(??)\ndoctest.testfile(??)\ndoctest.testmod(??)\ndoctest.testsource(??)\ndoctest.traceback(??)\ndoctest.unittest(??)\ndoctest.warnings(??)\ndummy_threading.Barrier(??)\ndummy_threading.BoundedSemaphore(??)\ndummy_threading.Condition(??)\ndummy_threading.Event(??)\ndummy_threading.Lock(??)\ndummy_threading.RLock(??)\ndummy_threading.Semaphore(??)\ndummy_threading.Thread(??)\ndummy_threading.Timer(??)\ndummy_threading.active_count(??)\ndummy_threading.current_thread(??)\ndummy_threading.enumerate(??)\ndummy_threading.local(??)\ndummy_threading.setprofile(??)\ndummy_threading.settrace(??)\ndummy_threading.stack_size(??)\ndummy_threading.threading(??)\nemail.base64mime(??)\nemail.base64mime.CRLF\nemail.base64mime.EMPTYSTRING\nemail.base64mime.MISC_LEN\nemail.base64mime.NL\nemail.base64mime.a2b_base64(??)\nemail.base64mime.b2a_base64(??)\nemail.base64mime.b64encode(??)\nemail.base64mime.body_decode(??)\nemail.base64mime.body_encode(??)\nemail.base64mime.decode(??)\nemail.base64mime.decodestring(??)\nemail.base64mime.header_encode(??)\nemail.base64mime.header_length(??)\nemail.charset(??)\nemail.charset.ALIASES(??)\nemail.charset.BASE64\nemail.charset.CHARSETS(??)\nemail.charset.CODEC_MAP(??)\nemail.charset.Charset(??)\nemail.charset.DEFAULT_CHARSET\nemail.charset.EMPTYSTRING\nemail.charset.QP\nemail.charset.RFC2047_CHROME_LEN\nemail.charset.SHORTEST\nemail.charset.UNKNOWN8BIT\nemail.charset.add_alias(??)\nemail.charset.add_charset(??)\nemail.charset.add_codec(??)\nemail.charset.email(??)\nemail.charset.encode_7or8bit(??)\nemail.charset.errors(??)\nemail.charset.partial(func, *args, **keywords) - new function with partial application\nemail.encoders(??)\nemail.encoders.encode_7or8bit(??)\nemail.encoders.encode_base64(??)\nemail.encoders.encode_noop(??)\nemail.encoders.encode_quopri(??)\nemail.errors(??)\nemail.errors.BoundaryError(??)\nemail.errors.CharsetError(??)\nemail.errors.FirstHeaderLineIsContinuationDefect(??)\nemail.errors.HeaderParseError(??)\nemail.errors.MalformedHeaderDefect(??)\nemail.errors.MessageDefect(??)\nemail.errors.MessageError(??)\nemail.errors.MessageParseError(??)\nemail.errors.MisplacedEnvelopeHeaderDefect(??)\nemail.errors.MultipartConversionError(??)\nemail.errors.MultipartInvariantViolationDefect(??)\nemail.errors.NoBoundaryInMultipartDefect(??)\nemail.errors.StartBoundaryNotFoundDefect(??)\nemail.feedparser(??)\nemail.feedparser.BufferedSubFile(??)\nemail.feedparser.BytesFeedParser(??)\nemail.feedparser.EMPTYSTRING\nemail.feedparser.FeedParser(??)\nemail.feedparser.NL\nemail.feedparser.NLCRE(??)\nemail.feedparser.NLCRE_bol(??)\nemail.feedparser.NLCRE_crack(??)\nemail.feedparser.NLCRE_eol(??)\nemail.feedparser.NeedMoreData(??)\nemail.feedparser.errors(??)\nemail.feedparser.headerRE(??)\nemail.feedparser.message(??)\nemail.feedparser.re(??)\nemail.generator(??)\nemail.generator.BytesGenerator(??)\nemail.generator.BytesIO([buffer]) -> object\nemail.generator.DecodedGenerator(??)\nemail.generator.Generator(??)\nemail.generator.Header(??)\nemail.generator.NL\nemail.generator.StringIO(??)\nemail.generator.UNDERSCORE\nemail.generator.fcre(??)\nemail.generator.random(??)\nemail.generator.re(??)\nemail.generator.sys(??)\nemail.generator.time(??)\nemail.generator.warnings(??)\nemail.header(??)\nemail.header.BSPACE\nemail.header.Charset(??)\nemail.header.EMPTYSTRING\nemail.header.Header(??)\nemail.header.HeaderParseError(??)\nemail.header.MAXLINELEN\nemail.header.NL\nemail.header.SPACE\nemail.header.SPACE8\nemail.header.USASCII(??)\nemail.header.UTF8(??)\nemail.header.binascii(??)\nemail.header.decode_header(??)\nemail.header.ecre(??)\nemail.header.email(??)\nemail.header.fcre(??)\nemail.header.make_header(??)\nemail.header.re(??)\nemail.iterators(??)\nemail.iterators.StringIO(??)\nemail.iterators.body_line_iterator(??)\nemail.iterators.sys(??)\nemail.iterators.typed_subpart_iterator(??)\nemail.iterators.walk(??)\nemail.message(??)\nemail.message.BytesIO([buffer]) -> object\nemail.message.Charset(??)\nemail.message.Message(??)\nemail.message.SEMISPACE\nemail.message.StringIO(??)\nemail.message.base64(??)\nemail.message.binascii(??)\nemail.message.errors(??)\nemail.message.header(??)\nemail.message.re(??)\nemail.message.tspecials(??)\nemail.message.utils(??)\nemail.message.uu(??)\nemail.message.warnings(??)\nemail.message_from_binary_file(??)\nemail.message_from_bytes(??)\nemail.message_from_file(??)\nemail.message_from_string(??)\nemail.mime(??)\nemail.mime.application(??)\nemail.mime.application.MIMEApplication(??)\nemail.mime.application.MIMENonMultipart(??)\nemail.mime.application.encoders(??)\nemail.mime.audio(??)\nemail.mime.audio.BytesIO([buffer]) -> object\nemail.mime.audio.MIMEAudio(??)\nemail.mime.audio.MIMENonMultipart(??)\nemail.mime.audio.encoders(??)\nemail.mime.audio.sndhdr(??)\nemail.mime.base(??)\nemail.mime.base.MIMEBase(??)\nemail.mime.base.message(??)\nemail.mime.image.MIMEImage(??)\nemail.mime.image.MIMENonMultipart(??)\nemail.mime.image.encoders(??)\nemail.mime.image.imghdr(??)\nemail.mime.message(??)\nemail.mime.message.MIMEMessage(??)\nemail.mime.message.MIMENonMultipart(??)\nemail.mime.message.message(??)\nemail.mime.multipart(??)\nemail.mime.multipart.MIMEBase(??)\nemail.mime.multipart.MIMEMultipart(??)\nemail.mime.nonmultipart(??)\nemail.mime.nonmultipart.MIMEBase(??)\nemail.mime.nonmultipart.MIMENonMultipart(??)\nemail.mime.nonmultipart.errors(??)\nemail.mime.text(??)\nemail.mime.text.MIMENonMultipart(??)\nemail.mime.text.MIMEText(??)\nemail.mime.text.encode_7or8bit(??)\nemail.parser(??)\nemail.parser.BytesParser(??)\nemail.parser.FeedParser(??)\nemail.parser.HeaderParser(??)\nemail.parser.Message(??)\nemail.parser.Parser(??)\nemail.parser.StringIO(??)\nemail.parser.TextIOWrapper(??)\nemail.parser.warnings(??)\nemail.quoprimime(??)\nemail.quoprimime.CRLF\nemail.quoprimime.EMPTYSTRING\nemail.quoprimime.NL\nemail.quoprimime.ascii_letters\nemail.quoprimime.body_check(??)\nemail.quoprimime.body_decode(??)\nemail.quoprimime.body_encode(??)\nemail.quoprimime.body_length(??)\nemail.quoprimime.c\nemail.quoprimime.decode(??)\nemail.quoprimime.decodestring(??)\nemail.quoprimime.digits\nemail.quoprimime.header_check(??)\nemail.quoprimime.header_decode(??)\nemail.quoprimime.header_encode(??)\nemail.quoprimime.header_length(??)\nemail.quoprimime.hexdigits\nemail.quoprimime.quote(??)\nemail.quoprimime.re(??)\nemail.quoprimime.unquote(??)\nemail.utils(??)\nemail.utils.COMMASPACE\nemail.utils.CRLF\nemail.utils.EMPTYSTRING\nemail.utils.StringIO(??)\nemail.utils.TICK\nemail.utils.UEMPTYSTRING\nemail.utils.base64(??)\nemail.utils.collapse_rfc2231_value(??)\nemail.utils.decode_params(??)\nemail.utils.decode_rfc2231(??)\nemail.utils.ecre(??)\nemail.utils.encode_rfc2231(??)\nemail.utils.escapesre(??)\nemail.utils.formataddr(??)\nemail.utils.formatdate(??)\nemail.utils.getaddresses(??)\nemail.utils.make_msgid(??)\nemail.utils.mktime_tz(??)\nemail.utils.os(??)\nemail.utils.parseaddr(??)\nemail.utils.parsedate(??)\nemail.utils.parsedate_tz(??)\nemail.utils.quote(??)\nemail.utils.random(??)\nemail.utils.re(??)\nemail.utils.rfc2231_continuation(??)\nemail.utils.socket(??)\nemail.utils.specialsre(??)\nemail.utils.time(??)\nemail.utils.unquote(??)\nemail.utils.urllib(??)\nemail.utils.warnings(??)\nenumerate(iterable[, start]) -> iterator for index, value of iterable\nerrno.E2BIG\nerrno.EACCES\nerrno.EADDRINUSE\nerrno.EADDRNOTAVAIL\nerrno.EADV\nerrno.EAFNOSUPPORT\nerrno.EAGAIN\nerrno.EALREADY\nerrno.EBADE\nerrno.EBADF\nerrno.EBADFD\nerrno.EBADMSG\nerrno.EBADR\nerrno.EBADRQC\nerrno.EBADSLT\nerrno.EBFONT\nerrno.EBUSY\nerrno.ECANCELED\nerrno.ECHILD\nerrno.ECHRNG\nerrno.ECOMM\nerrno.ECONNABORTED\nerrno.ECONNREFUSED\nerrno.ECONNRESET\nerrno.EDEADLK\nerrno.EDEADLOCK\nerrno.EDESTADDRREQ\nerrno.EDOM\nerrno.EDOTDOT\nerrno.EDQUOT\nerrno.EEXIST\nerrno.EFAULT\nerrno.EFBIG\nerrno.EHOSTDOWN\nerrno.EHOSTUNREACH\nerrno.EIDRM\nerrno.EILSEQ\nerrno.EINPROGRESS\nerrno.EINTR\nerrno.EINVAL\nerrno.EIO\nerrno.EISCONN\nerrno.EISDIR\nerrno.EISNAM\nerrno.EKEYEXPIRED\nerrno.EKEYREJECTED\nerrno.EKEYREVOKED\nerrno.EL2HLT\nerrno.EL2NSYNC\nerrno.EL3HLT\nerrno.EL3RST\nerrno.ELIBACC\nerrno.ELIBBAD\nerrno.ELIBEXEC\nerrno.ELIBMAX\nerrno.ELIBSCN\nerrno.ELNRNG\nerrno.ELOOP\nerrno.EMEDIUMTYPE\nerrno.EMFILE\nerrno.EMLINK\nerrno.EMSGSIZE\nerrno.EMULTIHOP\nerrno.ENAMETOOLONG\nerrno.ENAVAIL\nerrno.ENETDOWN\nerrno.ENETRESET\nerrno.ENETUNREACH\nerrno.ENFILE\nerrno.ENOANO\nerrno.ENOBUFS\nerrno.ENOCSI\nerrno.ENODATA\nerrno.ENODEV\nerrno.ENOENT\nerrno.ENOEXEC\nerrno.ENOKEY\nerrno.ENOLCK\nerrno.ENOLINK\nerrno.ENOMEDIUM\nerrno.ENOMEM\nerrno.ENOMSG\nerrno.ENONET\nerrno.ENOPKG\nerrno.ENOPROTOOPT\nerrno.ENOSPC\nerrno.ENOSR\nerrno.ENOSTR\nerrno.ENOSYS\nerrno.ENOTBLK\nerrno.ENOTCONN\nerrno.ENOTDIR\nerrno.ENOTEMPTY\nerrno.ENOTNAM\nerrno.ENOTRECOVERABLE\nerrno.ENOTSOCK\nerrno.ENOTSUP\nerrno.ENOTTY\nerrno.ENOTUNIQ\nerrno.ENXIO\nerrno.EOPNOTSUPP\nerrno.EOVERFLOW\nerrno.EOWNERDEAD\nerrno.EPERM\nerrno.EPFNOSUPPORT\nerrno.EPIPE\nerrno.EPROTO\nerrno.EPROTONOSUPPORT\nerrno.EPROTOTYPE\nerrno.ERANGE\nerrno.EREMCHG\nerrno.EREMOTE\nerrno.EREMOTEIO\nerrno.ERESTART\nerrno.ERFKILL\nerrno.EROFS\nerrno.ESHUTDOWN\nerrno.ESOCKTNOSUPPORT\nerrno.ESPIPE\nerrno.ESRCH\nerrno.ESRMNT\nerrno.ESTALE\nerrno.ESTRPIPE\nerrno.ETIME\nerrno.ETIMEDOUT\nerrno.ETOOMANYREFS\nerrno.ETXTBSY\nerrno.EUCLEAN\nerrno.EUNATCH\nerrno.EUSERS\nerrno.EWOULDBLOCK\nerrno.EXDEV\nerrno.EXFULL\nerrno.errorcode(??)\neval(source[, globals[, locals]]) -> value\nexec(object[, globals[, locals]])\nexit(??)\nfilecmp.BUFSIZE\nfilecmp.cmp(??)\nfilecmp.cmpfiles(??)\nfilecmp.demo(??)\nfilecmp.dircmp(??)\nfilecmp.filterfalse(function or None, sequence) --> filterfalse object\nfilecmp.os(??)\nfilecmp.stat(??)\nfileinput.DEFAULT_BUFSIZE\nfileinput.FileInput(??)\nfileinput.close(??)\nfileinput.filelineno(??)\nfileinput.filename(??)\nfileinput.fileno(??)\nfileinput.hook_compressed(??)\nfileinput.hook_encoded(??)\nfileinput.input(files=None, inplace=False, backup=\"\", bufsize=0, mode=\"r\", openhook=None)\nfileinput.isfirstline(??)\nfileinput.isstdin(??)\nfileinput.lineno(??)\nfileinput.nextfile(??)\nfileinput.os(??)\nfileinput.sys(??)\nfilter(function or None, iterable) --> filter object\nfloat(x) -> floating point number\nfnmatch.filter(??)\nfnmatch.fnmatch(??)\nfnmatch.fnmatchcase(??)\nfnmatch.functools(??)\nfnmatch.os(??)\nfnmatch.posixpath(??)\nfnmatch.re(??)\nfnmatch.translate(??)\nformat(value[, format_spec]) -> string\nformatter.AS_IS(??)\nformatter.AbstractFormatter(??)\nformatter.AbstractWriter(??)\nformatter.DumbWriter(??)\nformatter.NullFormatter(??)\nformatter.NullWriter(??)\nformatter.sys(??)\nformatter.test(??)\nfractions.Decimal(??)\nfractions.Fraction(??)\nfractions.gcd(??)\nfractions.math(??)\nfractions.numbers(??)\nfractions.operator(??)\nfractions.re(??)\nfractions.sys(??)\nfrozenset() -> empty frozenset object\nftplib.B_CRLF\nftplib.CRLF\nftplib.Error(??)\nftplib.FTP(??)\nftplib.FTP_PORT\nftplib.FTP_TLS(??)\nftplib.MSG_OOB\nftplib.Netrc(??)\nftplib.all_errors(??)\nftplib.error_perm(??)\nftplib.error_proto(??)\nftplib.error_reply(??)\nftplib.error_temp(??)\nftplib.ftpcp(??)\nftplib.os(??)\nftplib.parse150(??)\nftplib.parse227(??)\nftplib.parse229(??)\nftplib.parse257(??)\nftplib.print_line(??)\nftplib.socket(??)\nftplib.ssl(??)\nftplib.sys(??)\nftplib.test(??)\nfunctools.Lock(??)\nfunctools.OrderedDict(??)\nfunctools.WRAPPER_ASSIGNMENTS(??)\nfunctools.WRAPPER_UPDATES(??)\nfunctools.cmp_to_key(??)\nfunctools.lru_cache(??)\nfunctools.namedtuple(??)\nfunctools.partial(func, *args, **keywords) - new function with partial application\nfunctools.reduce(function, sequence[, initial]) -> value\nfunctools.total_ordering(??)\nfunctools.update_wrapper(??)\nfunctools.wraps(??)\ngc.DEBUG_COLLECTABLE\ngc.DEBUG_LEAK\ngc.DEBUG_SAVEALL\ngc.DEBUG_STATS\ngc.DEBUG_UNCOLLECTABLE\ngc.collect([generation]) -> n\ngc.disable() -> None\ngc.enable() -> None\ngc.garbage(??)\ngc.get_count() -> (count0, count1, count2)\ngc.get_debug() -> flags\ngc.get_objects() -> [...]\ngc.get_referents(*objs) -> list\ngc.get_referrers(*objs) -> list\ngc.get_threshold() -> (threshold0, threshold1, threshold2)\ngc.is_tracked(obj) -> bool\ngc.isenabled() -> status\ngc.set_debug(flags) -> None\ngc.set_threshold(threshold0, [threshold1, threshold2]) -> None\ngenericpath.commonprefix(??)\ngenericpath.exists(??)\ngenericpath.getatime(??)\ngenericpath.getctime(??)\ngenericpath.getmtime(??)\ngenericpath.getsize(??)\ngenericpath.isdir(??)\ngenericpath.isfile(??)\ngenericpath.os(??)\ngenericpath.stat(??)\ngetattr(object, name[, default]) -> value\ngetopt.GetoptError(??)\ngetopt.do_longs(??)\ngetopt.do_shorts(??)\ngetopt.error(??)\ngetopt.getopt(args, options[, long_options]) -> opts, args\ngetopt.gnu_getopt(??)\ngetopt.long_has_args(??)\ngetopt.os(??)\ngetopt.short_has_arg(??)\ngetpass.GetPassWarning(??)\ngetpass.fallback_getpass(??)\ngetpass.getpass(??)\ngetpass.getuser(??)\ngetpass.os(??)\ngetpass.sys(??)\ngetpass.termios(??)\ngetpass.unix_getpass(??)\ngetpass.warnings(??)\ngetpass.win_getpass(??)\ngettext.Catalog(??)\ngettext.ENOENT\ngettext.GNUTranslations(??)\ngettext.NullTranslations(??)\ngettext.bind_textdomain_codeset(??)\ngettext.bindtextdomain(??)\ngettext.c2py(??)\ngettext.copy(??)\ngettext.dgettext(??)\ngettext.dngettext(??)\ngettext.find(??)\ngettext.gettext(??)\ngettext.install(??)\ngettext.io(??)\ngettext.ldgettext(??)\ngettext.ldngettext(??)\ngettext.lgettext(??)\ngettext.lngettext(??)\ngettext.locale(??)\ngettext.ngettext(??)\ngettext.os(??)\ngettext.re(??)\ngettext.struct(??)\ngettext.sys(??)\ngettext.textdomain(??)\ngettext.translation(??)\nglob.fnmatch(??)\nglob.glob(??)\nglob.glob0(??)\nglob.glob1(??)\nglob.has_magic(??)\nglob.iglob(??)\nglob.magic_check(??)\nglob.magic_check_bytes(??)\nglob.os(??)\nglob.re(??)\nglob.sys(??)\nglobals() -> dictionary\ngzip.FCOMMENT\ngzip.FEXTRA\ngzip.FHCRC\ngzip.FNAME\ngzip.FTEXT\ngzip.GzipFile(??)\ngzip.LOWU32(??)\ngzip.READ\ngzip.U32(??)\ngzip.WRITE\ngzip.builtins(??)\ngzip.compress(??)\ngzip.decompress(??)\ngzip.io(??)\ngzip.open(??)\ngzip.os(??)\ngzip.read32(??)\ngzip.struct(??)\ngzip.sys(??)\ngzip.time(??)\ngzip.write32u(??)\ngzip.zlib(??)\nhasattr(object, name) -> bool\nhash(object) -> integer\nhashlib.algorithms_available(??)\nhashlib.algorithms_guaranteed(??)\nhashlib.md5(??)\nhashlib.new(name, data=b'') - Return a new hashing object using the named algorithm;\nhashlib.sha1(??)\nhashlib.sha224(??)\nhashlib.sha256(??)\nhashlib.sha384(??)\nhashlib.sha512(??)\nheapq.bisect(??)\nheapq.chain(*iterables) --> chain object\nheapq.count(start=0, step=1) --> count object\nheapq.heapify(??)\nheapq.heappop(??)\nheapq.heappush(??)\nheapq.heappushpop(??)\nheapq.heapreplace(??)\nheapq.islice(iterable, [start,] stop [, step]) --> islice object\nheapq.merge(??)\nheapq.nlargest(??)\nheapq.nsmallest(??)\nheapq.repeat(object [,times]) -> create an iterator which returns the object\nheapq.tee(iterable, n=2) --> tuple of n independent iterators.\nhelp(??)\nhex(number) -> string\nhmac.HMAC(??)\nhmac.digest_size(??)\nhmac.new(??)\nhmac.trans_36\nhmac.trans_5C\nhtml.entities(??)\nhtml.entities.codepoint2name(??)\nhtml.entities.entitydefs(??)\nhtml.entities.name2codepoint(??)\nhtml.escape(??)\nhtml.parser(??)\nhtml.parser.HTMLParseError(??)\nhtml.parser.HTMLParser(??)\nhtml.parser.attrfind(??)\nhtml.parser.attrfind_tolerant(??)\nhtml.parser.charref(??)\nhtml.parser.commentclose(??)\nhtml.parser.endendtag(??)\nhtml.parser.endtagfind(??)\nhtml.parser.entityref(??)\nhtml.parser.incomplete(??)\nhtml.parser.interesting_cdata(??)\nhtml.parser.interesting_normal(??)\nhtml.parser.locatestarttagend(??)\nhtml.parser.locatestarttagend_tolerant(??)\nhtml.parser.piclose(??)\nhtml.parser.re(??)\nhtml.parser.starttagopen(??)\nhtml.parser.tagfind(??)\nhttp.client(??)\nhttp.client.ACCEPTED\nhttp.client.BAD_GATEWAY\nhttp.client.BAD_REQUEST\nhttp.client.BadStatusLine(??)\nhttp.client.CONFLICT\nhttp.client.CONTINUE\nhttp.client.CREATED\nhttp.client.CannotSendHeader(??)\nhttp.client.CannotSendRequest(??)\nhttp.client.EXPECTATION_FAILED\nhttp.client.FAILED_DEPENDENCY\nhttp.client.FORBIDDEN\nhttp.client.FOUND\nhttp.client.GATEWAY_TIMEOUT\nhttp.client.GONE\nhttp.client.HTTPConnection(??)\nhttp.client.HTTPException(??)\nhttp.client.HTTPMessage(??)\nhttp.client.HTTPResponse(??)\nhttp.client.HTTPSConnection(??)\nhttp.client.HTTPS_PORT\nhttp.client.HTTP_PORT\nhttp.client.HTTP_VERSION_NOT_SUPPORTED\nhttp.client.IM_USED\nhttp.client.INSUFFICIENT_STORAGE\nhttp.client.INTERNAL_SERVER_ERROR\nhttp.client.ImproperConnectionState(??)\nhttp.client.IncompleteRead(??)\nhttp.client.InvalidURL(??)\nhttp.client.LENGTH_REQUIRED\nhttp.client.LOCKED\nhttp.client.LineTooLong(??)\nhttp.client.MAXAMOUNT\nhttp.client.METHOD_NOT_ALLOWED\nhttp.client.MOVED_PERMANENTLY\nhttp.client.MULTIPLE_CHOICES\nhttp.client.MULTI_STATUS\nhttp.client.NON_AUTHORITATIVE_INFORMATION\nhttp.client.NOT_ACCEPTABLE\nhttp.client.NOT_EXTENDED\nhttp.client.NOT_FOUND\nhttp.client.NOT_IMPLEMENTED\nhttp.client.NOT_MODIFIED\nhttp.client.NO_CONTENT\nhttp.client.NotConnected(??)\nhttp.client.OK\nhttp.client.PARTIAL_CONTENT\nhttp.client.PAYMENT_REQUIRED\nhttp.client.PRECONDITION_FAILED\nhttp.client.PROCESSING\nhttp.client.PROXY_AUTHENTICATION_REQUIRED\nhttp.client.REQUESTED_RANGE_NOT_SATISFIABLE\nhttp.client.REQUEST_ENTITY_TOO_LARGE\nhttp.client.REQUEST_TIMEOUT\nhttp.client.REQUEST_URI_TOO_LONG\nhttp.client.RESET_CONTENT\nhttp.client.ResponseNotReady(??)\nhttp.client.SEE_OTHER\nhttp.client.SERVICE_UNAVAILABLE\nhttp.client.SWITCHING_PROTOCOLS\nhttp.client.TEMPORARY_REDIRECT\nhttp.client.UNAUTHORIZED\nhttp.client.UNPROCESSABLE_ENTITY\nhttp.client.UNSUPPORTED_MEDIA_TYPE\nhttp.client.UPGRADE_REQUIRED\nhttp.client.USE_PROXY\nhttp.client.UnimplementedFileMode(??)\nhttp.client.UnknownProtocol(??)\nhttp.client.UnknownTransferEncoding(??)\nhttp.client.collections(??)\nhttp.client.email(??)\nhttp.client.error(??)\nhttp.client.io(??)\nhttp.client.os(??)\nhttp.client.parse_headers(??)\nhttp.client.responses(??)\nhttp.client.socket(??)\nhttp.client.ssl(??)\nhttp.client.urlsplit(??)\nhttp.client.warnings(??)\nhttp.cookiejar(??)\nhttp.cookiejar.Absent(??)\nhttp.cookiejar.Cookie(??)\nhttp.cookiejar.CookieJar(??)\nhttp.cookiejar.CookiePolicy(??)\nhttp.cookiejar.DAYS(??)\nhttp.cookiejar.DEFAULT_HTTP_PORT\nhttp.cookiejar.DefaultCookiePolicy(??)\nhttp.cookiejar.EPOCH_YEAR\nhttp.cookiejar.ESCAPED_CHAR_RE(??)\nhttp.cookiejar.FileCookieJar(??)\nhttp.cookiejar.HEADER_ESCAPE_RE(??)\nhttp.cookiejar.HEADER_JOIN_ESCAPE_RE(??)\nhttp.cookiejar.HEADER_QUOTED_VALUE_RE(??)\nhttp.cookiejar.HEADER_TOKEN_RE(??)\nhttp.cookiejar.HEADER_VALUE_RE(??)\nhttp.cookiejar.HTTP_PATH_SAFE\nhttp.cookiejar.IPV4_RE(??)\nhttp.cookiejar.ISO_DATE_RE(??)\nhttp.cookiejar.LOOSE_HTTP_DATE_RE(??)\nhttp.cookiejar.LWPCookieJar(??)\nhttp.cookiejar.LoadError(??)\nhttp.cookiejar.MISSING_FILENAME_TEXT\nhttp.cookiejar.MONTHS(??)\nhttp.cookiejar.MONTHS_LOWER(??)\nhttp.cookiejar.MozillaCookieJar(??)\nhttp.cookiejar.STRICT_DATE_RE(??)\nhttp.cookiejar.TIMEZONE_RE(??)\nhttp.cookiejar.UTC_ZONES(??)\nhttp.cookiejar.WEEKDAY_RE(??)\nhttp.cookiejar.copy(??)\nhttp.cookiejar.cut_port_re(??)\nhttp.cookiejar.debug(??)\nhttp.cookiejar.deepvalues(??)\nhttp.cookiejar.domain_match(??)\nhttp.cookiejar.eff_request_host(??)\nhttp.cookiejar.escape_path(??)\nhttp.cookiejar.http(??)\nhttp.cookiejar.http2time(??)\nhttp.cookiejar.is_HDN(??)\nhttp.cookiejar.is_third_party(??)\nhttp.cookiejar.iso2time(??)\nhttp.cookiejar.join_header_words(??)\nhttp.cookiejar.liberal_is_HDN(??)\nhttp.cookiejar.logger(??)\nhttp.cookiejar.lwp_cookie_str(??)\nhttp.cookiejar.month\nhttp.cookiejar.offset_from_tz_string(??)\nhttp.cookiejar.parse_ns_headers(??)\nhttp.cookiejar.re(??)\nhttp.cookiejar.reach(??)\nhttp.cookiejar.request_host(??)\nhttp.cookiejar.request_path(??)\nhttp.cookiejar.request_port(??)\nhttp.cookiejar.split_header_words(??)\nhttp.cookiejar.strip_quotes(??)\nhttp.cookiejar.time(??)\nhttp.cookiejar.time2isoz(??)\nhttp.cookiejar.time2netscape(??)\nhttp.cookiejar.timegm(??)\nhttp.cookiejar.unmatched(??)\nhttp.cookiejar.uppercase_escaped_char(??)\nhttp.cookiejar.urllib(??)\nhttp.cookiejar.user_domain_match(??)\nhttp.cookiejar.vals_sorted_by_key(??)\nhttp.cookies(??)\nhttp.cookies.BaseCookie(??)\nhttp.cookies.CookieError(??)\nhttp.cookies.Morsel(??)\nhttp.cookies.SimpleCookie(??)\nhttp.cookies.re(??)\nhttp.cookies.string(??)\nhttp.server(??)\nhttp.server.BaseHTTPRequestHandler(??)\nhttp.server.CGIHTTPRequestHandler(??)\nhttp.server.DEFAULT_ERROR_CONTENT_TYPE\nhttp.server.DEFAULT_ERROR_MESSAGE\nhttp.server.HTTPServer(??)\nhttp.server.SimpleHTTPRequestHandler(??)\nhttp.server.copy(??)\nhttp.server.email(??)\nhttp.server.executable(??)\nhttp.server.html(??)\nhttp.server.http(??)\nhttp.server.io(??)\nhttp.server.mimetypes(??)\nhttp.server.nobody(??)\nhttp.server.nobody_uid(??)\nhttp.server.os(??)\nhttp.server.posixpath(??)\nhttp.server.select(??)\nhttp.server.shutil(??)\nhttp.server.socket(??)\nhttp.server.socketserver(??)\nhttp.server.sys(??)\nhttp.server.test(??)\nhttp.server.time(??)\nhttp.server.urllib(??)\nid(object) -> integer\nimaplib.AllowedVersions(??)\nimaplib.CRLF\nimaplib.Commands(??)\nimaplib.Continuation(??)\nimaplib.Debug\nimaplib.Flags(??)\nimaplib.HAVE_SSL(??)\nimaplib.IMAP4(??)\nimaplib.IMAP4_PORT\nimaplib.IMAP4_SSL(??)\nimaplib.IMAP4_SSL_PORT\nimaplib.IMAP4_stream(??)\nimaplib.Int2AP(??)\nimaplib.InternalDate(??)\nimaplib.Internaldate2tuple(??)\nimaplib.Literal(??)\nimaplib.MapCRLF(??)\nimaplib.Mon2num(??)\nimaplib.ParseFlags(??)\nimaplib.Response_code(??)\nimaplib.Time2Internaldate(??)\nimaplib.Untagged_response(??)\nimaplib.Untagged_status(??)\nimaplib.binascii(??)\nimaplib.errno(??)\nimaplib.random(??)\nimaplib.re(??)\nimaplib.socket(??)\nimaplib.ssl(??)\nimaplib.subprocess(??)\nimaplib.sys(??)\nimaplib.time(??)\nimghdr.test(??)\nimghdr.test_bmp(??)\nimghdr.test_gif(??)\nimghdr.test_jpeg(??)\nimghdr.test_pbm(??)\nimghdr.test_pgm(??)\nimghdr.test_png(??)\nimghdr.test_ppm(??)\nimghdr.test_rast(??)\nimghdr.test_rgb(??)\nimghdr.test_tiff(??)\nimghdr.test_xbm(??)\nimghdr.testall(??)\nimghdr.tests(??)\nimghdr.what(??)\nimp.C_BUILTIN\nimp.C_EXTENSION\nimp.IMP_HOOK\nimp.NullImporter(??)\nimp.PKG_DIRECTORY\nimp.PY_CODERESOURCE\nimp.PY_COMPILED\nimp.PY_FROZEN\nimp.PY_RESOURCE\nimp.PY_SOURCE\nimp.SEARCH_ERROR\nimp.acquire_lock() -> None\nimp.cache_from_source(??)\nimp.find_module(name, [path]) -> (file, filename, (suffix, mode, type))\nimp.get_frozen_object(??)\nimp.get_magic() -> string\nimp.get_suffixes() -> [(suffix, mode, type), ...]\nimp.get_tag() -> string\nimp.init_builtin(??)\nimp.init_frozen(??)\nimp.is_builtin(??)\nimp.is_frozen(??)\nimp.is_frozen_package(??)\nimp.load_compiled(??)\nimp.load_dynamic(??)\nimp.load_module(name, file, filename, (suffix, mode, type)) -> module\nimp.load_package(??)\nimp.load_source(??)\nimp.lock_held() -> boolean\nimp.new_module(name) -> module\nimp.release_lock() -> None\nimp.reload(module) -> module\nimp.source_from_cache(??)\nimportlib.abc.ExecutionLoader(??)\nimportlib.abc.Finder(??)\nimportlib.abc.InspectLoader(??)\nimportlib.abc.Loader(??)\nimportlib.abc.PyLoader(??)\nimportlib.abc.PyPycLoader(??)\nimportlib.abc.ResourceLoader(??)\nimportlib.abc.SourceLoader(??)\nimportlib.abc.abc(??)\nimportlib.abc.imp(??)\nimportlib.abc.io(??)\nimportlib.abc.machinery(??)\nimportlib.abc.marshal(??)\nimportlib.abc.os(??)\nimportlib.abc.sys(??)\nimportlib.abc.tokenize(??)\nimportlib.abc.types(??)\nimportlib.abc.util(??)\nimportlib.abc.warnings(??)\nimportlib.errno(??)\nimportlib.imp(??)\nimportlib.import_module(??)\nimportlib.machinery(??)\nimportlib.machinery.BuiltinImporter(??)\nimportlib.machinery.FrozenImporter(??)\nimportlib.machinery.PathFinder(??)\nimportlib.marshal(??)\nimportlib.os(??)\nimportlib.re(??)\nimportlib.sep\nimportlib.sys(??)\nimportlib.tokenize(??)\nimportlib.util(??)\nimportlib.util.module_for_loader(??)\nimportlib.util.set_loader(??)\nimportlib.util.set_package(??)\ninput([prompt]) -> string\ninspect.ArgInfo(args, varargs, keywords, locals)\ninspect.ArgSpec(args, varargs, keywords, defaults)\ninspect.Arguments(args, varargs, varkw)\ninspect.Attribute(name, kind, defining_class, object)\ninspect.BlockFinder(??)\ninspect.CO_GENERATOR\ninspect.CO_NESTED\ninspect.CO_NEWLOCALS\ninspect.CO_NOFREE\ninspect.CO_OPTIMIZED\ninspect.CO_VARARGS\ninspect.CO_VARKEYWORDS\ninspect.EndOfBlock(??)\ninspect.FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)\ninspect.GEN_CLOSED\ninspect.GEN_CREATED\ninspect.GEN_RUNNING\ninspect.GEN_SUSPENDED\ninspect.ModuleInfo(name, suffix, mode, module_type)\ninspect.TPFLAGS_IS_ABSTRACT\ninspect.Traceback(filename, lineno, function, code_context, index)\ninspect.attrgetter(attr, ...) --> attrgetter object\ninspect.classify_class_attrs(??)\ninspect.cleandoc(??)\ninspect.currentframe(??)\ninspect.findsource(??)\ninspect.formatannotation(??)\ninspect.formatannotationrelativeto(??)\ninspect.formatargspec(??)\ninspect.formatargvalues(??)\ninspect.getabsfile(??)\ninspect.getargs(??)\ninspect.getargspec(??)\ninspect.getargvalues(??)\ninspect.getattr_static(??)\ninspect.getblock(??)\ninspect.getcallargs(??)\ninspect.getclasstree(??)\ninspect.getcomments(??)\ninspect.getdoc(??)\ninspect.getfile(??)\ninspect.getframeinfo(??)\ninspect.getfullargspec(??)\ninspect.getgeneratorstate(??)\ninspect.getinnerframes(??)\ninspect.getlineno(??)\ninspect.getmembers(??)\ninspect.getmodule(??)\ninspect.getmoduleinfo(??)\ninspect.getmodulename(??)\ninspect.getmro(??)\ninspect.getouterframes(??)\ninspect.getsource(??)\ninspect.getsourcefile(??)\ninspect.getsourcelines(??)\ninspect.imp(??)\ninspect.indentsize(??)\ninspect.isabstract(??)\ninspect.isbuiltin(??)\ninspect.isclass(??)\ninspect.iscode(??)\ninspect.isdatadescriptor(??)\ninspect.isframe(??)\ninspect.isfunction(??)\ninspect.isgenerator(??)\ninspect.isgeneratorfunction(??)\ninspect.isgetsetdescriptor(??)\ninspect.ismemberdescriptor(??)\ninspect.ismethod(??)\ninspect.ismethoddescriptor(??)\ninspect.ismodule(??)\ninspect.isroutine(??)\ninspect.istraceback(??)\ninspect.itertools(??)\ninspect.k\ninspect.linecache(??)\ninspect.mod_dict(??)\ninspect.modulesbyfile(??)\ninspect.namedtuple(??)\ninspect.os(??)\ninspect.re(??)\ninspect.stack(??)\ninspect.string(??)\ninspect.sys(??)\ninspect.tokenize(??)\ninspect.trace(??)\ninspect.types(??)\ninspect.v\ninspect.walktree(??)\nint(x[, base]) -> integer\nio.BlockingIOError(??)\nio.BufferedIOBase(??)\nio.BufferedRWPair(??)\nio.BufferedRandom(??)\nio.BufferedReader(??)\nio.BufferedWriter(??)\nio.BytesIO([buffer]) -> object\nio.DEFAULT_BUFFER_SIZE\nio.FileIO(??)\nio.IOBase(??)\nio.IncrementalNewlineDecoder(??)\nio.OpenWrapper(??)\nio.RawIOBase(??)\nio.SEEK_CUR\nio.SEEK_END\nio.SEEK_SET\nio.StringIO(??)\nio.TextIOBase(??)\nio.TextIOWrapper(??)\nio.UnsupportedOperation(??)\nio.abc(??)\nio.open(??)\nisinstance(object, class-or-type-or-tuple) -> bool\nissubclass(C, B) -> bool\niter(iterable) -> iterator\nitertools.accumulate(iterable) --> accumulate object\nitertools.chain(*iterables) --> chain object\nitertools.combinations(iterable, r) --> combinations object\nitertools.combinations_with_replacement(iterable, r) --> combinations_with_replacement object\nitertools.compress(data, selectors) --> iterator over selected data\nitertools.count(start=0, step=1) --> count object\nitertools.cycle(iterable) --> cycle object\nitertools.dropwhile(predicate, iterable) --> dropwhile object\nitertools.filterfalse(function or None, sequence) --> filterfalse object\nitertools.groupby(iterable[, keyfunc]) -> create an iterator which returns\nitertools.islice(iterable, [start,] stop [, step]) --> islice object\nitertools.permutations(iterable[, r]) --> permutations object\nitertools.product(*iterables) --> product object\nitertools.repeat(object [,times]) -> create an iterator which returns the object\nitertools.starmap(function, sequence) --> starmap object\nitertools.takewhile(predicate, iterable) --> takewhile object\nitertools.tee(iterable, n=2) --> tuple of n independent iterators.\nitertools.zip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> zip_longest object\njson.JSONDecoder(??)\njson.JSONEncoder(??)\njson.decoder(??)\njson.decoder.BACKSLASH(??)\njson.decoder.FLAGS\njson.decoder.JSONArray(??)\njson.decoder.JSONDecoder(??)\njson.decoder.JSONObject(??)\njson.decoder.NaN\njson.decoder.NegInf\njson.decoder.PosInf\njson.decoder.STRINGCHUNK(??)\njson.decoder.WHITESPACE(??)\njson.decoder.WHITESPACE_STR\njson.decoder.binascii(??)\njson.decoder.c_scanstring(??)\njson.decoder.errmsg(??)\njson.decoder.linecol(??)\njson.decoder.make_scanner(??)\njson.decoder.py_scanstring(??)\njson.decoder.re(??)\njson.decoder.scanstring(string, end, strict=True) -> (string, end)\njson.decoder.struct(??)\njson.decoder.sys(??)\njson.dump(??)\njson.dumps(??)\njson.encoder(??)\njson.encoder.ESCAPE(??)\njson.encoder.ESCAPE_ASCII(??)\njson.encoder.ESCAPE_DCT(??)\njson.encoder.FLOAT_REPR(??)\njson.encoder.HAS_UTF8(??)\njson.encoder.INFINITY\njson.encoder.JSONEncoder(??)\njson.encoder.c_encode_basestring_ascii(??)\njson.encoder.c_make_encoder(??)\njson.encoder.encode_basestring(??)\njson.encoder.encode_basestring_ascii(string) -> string\njson.encoder.i\njson.encoder.py_encode_basestring_ascii(??)\njson.encoder.re(??)\njson.load(??)\njson.loads(??)\njson.scanner(??)\njson.scanner.NUMBER_RE(??)\njson.scanner.c_make_scanner(??)\njson.scanner.make_scanner(??)\njson.scanner.py_make_scanner(??)\njson.scanner.re(??)\njson.tool(??)\njson.tool.json(??)\njson.tool.main(??)\njson.tool.sys(??)\nkeyword.iskeyword(??)\nkeyword.kwlist(??)\nkeyword.main(??)\nlen(object) -> integer\nlicense(??)\nlinecache.cache(??)\nlinecache.checkcache(??)\nlinecache.clearcache(??)\nlinecache.getline(??)\nlinecache.getlines(??)\nlinecache.os(??)\nlinecache.sys(??)\nlinecache.tokenize(??)\nlinecache.updatecache(??)\nlist() -> new empty list\nlocale.ABDAY_1\nlocale.ABDAY_2\nlocale.ABDAY_3\nlocale.ABDAY_4\nlocale.ABDAY_5\nlocale.ABDAY_6\nlocale.ABDAY_7\nlocale.ABMON_1\nlocale.ABMON_10\nlocale.ABMON_11\nlocale.ABMON_12\nlocale.ABMON_2\nlocale.ABMON_3\nlocale.ABMON_4\nlocale.ABMON_5\nlocale.ABMON_6\nlocale.ABMON_7\nlocale.ABMON_8\nlocale.ABMON_9\nlocale.ALT_DIGITS\nlocale.AM_STR\nlocale.CHAR_MAX\nlocale.CODESET\nlocale.CRNCYSTR\nlocale.DAY_1\nlocale.DAY_2\nlocale.DAY_3\nlocale.DAY_4\nlocale.DAY_5\nlocale.DAY_6\nlocale.DAY_7\nlocale.D_FMT\nlocale.D_T_FMT\nlocale.ERA\nlocale.ERA_D_FMT\nlocale.ERA_D_T_FMT\nlocale.ERA_T_FMT\nlocale.Error(??)\nlocale.LC_ALL\nlocale.LC_COLLATE\nlocale.LC_CTYPE\nlocale.LC_MESSAGES\nlocale.LC_MONETARY\nlocale.LC_NUMERIC\nlocale.LC_TIME\nlocale.MON_1\nlocale.MON_10\nlocale.MON_11\nlocale.MON_12\nlocale.MON_2\nlocale.MON_3\nlocale.MON_4\nlocale.MON_5\nlocale.MON_6\nlocale.MON_7\nlocale.MON_8\nlocale.MON_9\nlocale.NOEXPR\nlocale.PM_STR\nlocale.RADIXCHAR\nlocale.THOUSEP\nlocale.T_FMT\nlocale.T_FMT_AMPM\nlocale.YESEXPR\nlocale.atof(??)\nlocale.atoi(??)\nlocale.bind_textdomain_codeset(domain, codeset) -> string\nlocale.bindtextdomain(domain, dir) -> string\nlocale.collections(??)\nlocale.currency(??)\nlocale.dcgettext(domain, msg, category) -> string\nlocale.dgettext(domain, msg) -> string\nlocale.encodings(??)\nlocale.format(??)\nlocale.format_string(??)\nlocale.functools(??)\nlocale.getdefaultlocale(??)\nlocale.getlocale(??)\nlocale.getpreferredencoding(??)\nlocale.gettext(msg) -> string\nlocale.locale_alias(??)\nlocale.locale_encoding_alias(??)\nlocale.localeconv(??)\nlocale.nl_langinfo(key) -> string\nlocale.normalize(??)\nlocale.re(??)\nlocale.resetlocale(??)\nlocale.setlocale(??)\nlocale.str(??)\nlocale.strcoll(??)\nlocale.strxfrm(string) -> string.\nlocale.sys(??)\nlocale.textdomain(domain) -> string\nlocale.windows_locale(??)\nlocals() -> dictionary\nlogging.BASIC_FORMAT\nlogging.BufferingFormatter(??)\nlogging.CRITICAL\nlogging.DEBUG\nlogging.ERROR\nlogging.FATAL\nlogging.FileHandler(??)\nlogging.Filter(??)\nlogging.Filterer(??)\nlogging.Formatter(??)\nlogging.Handler(??)\nlogging.INFO\nlogging.LogRecord(??)\nlogging.Logger(??)\nlogging.LoggerAdapter(??)\nlogging.Manager(??)\nlogging.NOTSET\nlogging.NullHandler(??)\nlogging.PercentStyle(??)\nlogging.PlaceHolder(??)\nlogging.RootLogger(??)\nlogging.StrFormatStyle(??)\nlogging.StreamHandler(??)\nlogging.StringTemplateStyle(??)\nlogging.Template(??)\nlogging.WARN\nlogging.WARNING\nlogging.addLevelName(??)\nlogging.atexit(??)\nlogging.basicConfig(??)\nlogging.captureWarnings(??)\nlogging.codecs(??)\nlogging.config(??)\nlogging.config.BaseConfigurator(??)\nlogging.config.ConvertingDict(??)\nlogging.config.ConvertingList(??)\nlogging.config.ConvertingTuple(??)\nlogging.config.DEFAULT_LOGGING_CONFIG_PORT\nlogging.config.DictConfigurator(??)\nlogging.config.IDENTIFIER(??)\nlogging.config.RESET_ERROR\nlogging.config.StreamRequestHandler(??)\nlogging.config.ThreadingTCPServer(??)\nlogging.config.dictConfig(??)\nlogging.config.dictConfigClass(??)\nlogging.config.fileConfig(??)\nlogging.config.io(??)\nlogging.config.listen(??)\nlogging.config.logging(??)\nlogging.config.os(??)\nlogging.config.re(??)\nlogging.config.socket(??)\nlogging.config.stopListening(??)\nlogging.config.struct(??)\nlogging.config.sys(??)\nlogging.config.thread(??)\nlogging.config.threading(??)\nlogging.config.traceback(??)\nlogging.config.types(??)\nlogging.config.valid_ident(??)\nlogging.critical(??)\nlogging.currentframe(??)\nlogging.debug(??)\nlogging.disable(??)\nlogging.error(??)\nlogging.exception(??)\nlogging.fatal(??)\nlogging.getLevelName(??)\nlogging.getLogRecordFactory(??)\nlogging.getLogger(??)\nlogging.getLoggerClass(??)\nlogging.handlers(??)\nlogging.handlers.BaseRotatingHandler(??)\nlogging.handlers.BufferingHandler(??)\nlogging.handlers.DEFAULT_HTTP_LOGGING_PORT\nlogging.handlers.DEFAULT_SOAP_LOGGING_PORT\nlogging.handlers.DEFAULT_TCP_LOGGING_PORT\nlogging.handlers.DEFAULT_UDP_LOGGING_PORT\nlogging.handlers.DatagramHandler(??)\nlogging.handlers.HTTPHandler(??)\nlogging.handlers.MemoryHandler(??)\nlogging.handlers.NTEventLogHandler(??)\nlogging.handlers.QueueHandler(??)\nlogging.handlers.QueueListener(??)\nlogging.handlers.RotatingFileHandler(??)\nlogging.handlers.SMTPHandler(??)\nlogging.handlers.ST_DEV\nlogging.handlers.ST_INO\nlogging.handlers.ST_MTIME\nlogging.handlers.SYSLOG_TCP_PORT\nlogging.handlers.SYSLOG_UDP_PORT\nlogging.handlers.SocketHandler(??)\nlogging.handlers.SysLogHandler(??)\nlogging.handlers.TimedRotatingFileHandler(??)\nlogging.handlers.WatchedFileHandler(??)\nlogging.handlers.codecs(??)\nlogging.handlers.logging(??)\nlogging.handlers.os(??)\nlogging.handlers.pickle(??)\nlogging.handlers.re(??)\nlogging.handlers.socket(??)\nlogging.handlers.struct(??)\nlogging.handlers.time(??)\nlogging.info(??)\nlogging.io(??)\nlogging.lastResort(??)\nlogging.log(??)\nlogging.logMultiprocessing\nlogging.logProcesses\nlogging.logThreads\nlogging.makeLogRecord(??)\nlogging.os(??)\nlogging.raiseExceptions\nlogging.root(??)\nlogging.setLogRecordFactory(??)\nlogging.setLoggerClass(??)\nlogging.shutdown(??)\nlogging.sys(??)\nlogging.thread(??)\nlogging.threading(??)\nlogging.time(??)\nlogging.traceback(??)\nlogging.warn(??)\nlogging.warning(??)\nlogging.warnings(??)\nlogging.weakref(??)\nmacpath.SF_APPEND\nmacpath.SF_ARCHIVED\nmacpath.SF_IMMUTABLE\nmacpath.SF_NOUNLINK\nmacpath.SF_SNAPSHOT\nmacpath.ST_ATIME\nmacpath.ST_CTIME\nmacpath.ST_DEV\nmacpath.ST_GID\nmacpath.ST_INO\nmacpath.ST_MODE\nmacpath.ST_MTIME\nmacpath.ST_NLINK\nmacpath.ST_SIZE\nmacpath.ST_UID\nmacpath.S_ENFMT\nmacpath.S_IEXEC\nmacpath.S_IFBLK\nmacpath.S_IFCHR\nmacpath.S_IFDIR\nmacpath.S_IFIFO\nmacpath.S_IFLNK\nmacpath.S_IFMT(??)\nmacpath.S_IFREG\nmacpath.S_IFSOCK\nmacpath.S_IMODE(??)\nmacpath.S_IREAD\nmacpath.S_IRGRP\nmacpath.S_IROTH\nmacpath.S_IRUSR\nmacpath.S_IRWXG\nmacpath.S_IRWXO\nmacpath.S_IRWXU\nmacpath.S_ISBLK(??)\nmacpath.S_ISCHR(??)\nmacpath.S_ISDIR(??)\nmacpath.S_ISFIFO(??)\nmacpath.S_ISGID\nmacpath.S_ISLNK(??)\nmacpath.S_ISREG(??)\nmacpath.S_ISSOCK(??)\nmacpath.S_ISUID\nmacpath.S_ISVTX\nmacpath.S_IWGRP\nmacpath.S_IWOTH\nmacpath.S_IWRITE\nmacpath.S_IWUSR\nmacpath.S_IXGRP\nmacpath.S_IXOTH\nmacpath.S_IXUSR\nmacpath.UF_APPEND\nmacpath.UF_IMMUTABLE\nmacpath.UF_NODUMP\nmacpath.UF_NOUNLINK\nmacpath.UF_OPAQUE\nmacpath.abspath(??)\nmacpath.altsep(??)\nmacpath.basename(??)\nmacpath.commonprefix(??)\nmacpath.curdir\nmacpath.defpath\nmacpath.devnull\nmacpath.dirname(??)\nmacpath.exists(??)\nmacpath.expanduser(??)\nmacpath.expandvars(??)\nmacpath.extsep\nmacpath.genericpath(??)\nmacpath.getatime(??)\nmacpath.getctime(??)\nmacpath.getmtime(??)\nmacpath.getsize(??)\nmacpath.isabs(??)\nmacpath.isdir(??)\nmacpath.isfile(??)\nmacpath.islink(??)\nmacpath.ismount(??)\nmacpath.join(??)\nmacpath.lexists(??)\nmacpath.norm_error(??)\nmacpath.normcase(??)\nmacpath.normpath(??)\nmacpath.os(??)\nmacpath.pardir\nmacpath.pathsep\nmacpath.realpath(??)\nmacpath.sep\nmacpath.split(??)\nmacpath.splitdrive(??)\nmacpath.splitext(??)\nmacpath.supports_unicode_filenames(??)\nmacurl2path.os(??)\nmacurl2path.pathname2url(??)\nmacurl2path.test(??)\nmacurl2path.url2pathname(??)\nmacurl2path.urllib(??)\nmailbox.Babyl(??)\nmailbox.BabylMessage(??)\nmailbox.Error(??)\nmailbox.ExternalClashError(??)\nmailbox.FormatError(??)\nmailbox.MH(??)\nmailbox.MHMessage(??)\nmailbox.MMDF(??)\nmailbox.MMDFMessage(??)\nmailbox.Mailbox(??)\nmailbox.Maildir(??)\nmailbox.MaildirMessage(??)\nmailbox.Message(??)\nmailbox.NoSuchMailboxError(??)\nmailbox.NotEmptyError(??)\nmailbox.calendar(??)\nmailbox.copy(??)\nmailbox.email(??)\nmailbox.errno(??)\nmailbox.fcntl(??)\nmailbox.io(??)\nmailbox.linesep\nmailbox.mbox(??)\nmailbox.mboxMessage(??)\nmailbox.os(??)\nmailbox.socket(??)\nmailbox.sys(??)\nmailbox.time(??)\nmailbox.warnings(??)\nmailcap.findmatch(??)\nmailcap.findparam(??)\nmailcap.getcaps(??)\nmailcap.listmailcapfiles(??)\nmailcap.lookup(??)\nmailcap.os(??)\nmailcap.parsefield(??)\nmailcap.parseline(??)\nmailcap.readmailcapfile(??)\nmailcap.show(??)\nmailcap.subst(??)\nmailcap.test(??)\nmap(func, *iterables) --> map object\nmarshal.dump(value, file[, version])\nmarshal.dumps(value[, version])\nmarshal.load(file)\nmarshal.loads(string)\nmarshal.version\nmax(iterable[, key=func]) -> value\nmemoryview(object)\nmimetypes.MimeTypes(??)\nmimetypes.add_type(??)\nmimetypes.common_types(??)\nmimetypes.encodings_map(??)\nmimetypes.guess_all_extensions(??)\nmimetypes.guess_extension(??)\nmimetypes.guess_type(??)\nmimetypes.init(??)\nmimetypes.inited(??)\nmimetypes.knownfiles(??)\nmimetypes.os(??)\nmimetypes.posixpath(??)\nmimetypes.read_mime_types(??)\nmimetypes.suffix_map(??)\nmimetypes.sys(??)\nmimetypes.types_map(??)\nmimetypes.urllib(??)\nmin(iterable[, key=func]) -> value\nmodulefinder.AddPackagePath(??)\nmodulefinder.HAVE_ARGUMENT\nmodulefinder.IMPORT_NAME\nmodulefinder.LOAD_CONST\nmodulefinder.Module(??)\nmodulefinder.ModuleFinder(??)\nmodulefinder.READ_MODE\nmodulefinder.ReplacePackage(??)\nmodulefinder.STORE_GLOBAL\nmodulefinder.STORE_NAME\nmodulefinder.STORE_OPS(??)\nmodulefinder.dis(??)\nmodulefinder.generators(??)\nmodulefinder.imp(??)\nmodulefinder.marshal(??)\nmodulefinder.os(??)\nmodulefinder.packagePathMap(??)\nmodulefinder.replacePackageMap(??)\nmodulefinder.struct(??)\nmodulefinder.sys(??)\nmodulefinder.test(??)\nmodulefinder.types(??)\nmultiprocessing.Array(??)\nmultiprocessing.AuthenticationError(??)\nmultiprocessing.BoundedSemaphore(??)\nmultiprocessing.BufferTooShort(??)\nmultiprocessing.Condition(??)\nmultiprocessing.Event(??)\nmultiprocessing.JoinableQueue(??)\nmultiprocessing.Lock(??)\nmultiprocessing.Manager(??)\nmultiprocessing.Pipe(??)\nmultiprocessing.Pool(??)\nmultiprocessing.Process(??)\nmultiprocessing.ProcessError(??)\nmultiprocessing.Queue(??)\nmultiprocessing.RLock(??)\nmultiprocessing.RawArray(??)\nmultiprocessing.RawValue(??)\nmultiprocessing.SUBDEBUG\nmultiprocessing.SUBWARNING\nmultiprocessing.Semaphore(??)\nmultiprocessing.TimeoutError(??)\nmultiprocessing.Value(??)\nmultiprocessing.active_children(??)\nmultiprocessing.allow_connection_pickling(??)\nmultiprocessing.connection(??)\nmultiprocessing.connection.AuthenticationError(??)\nmultiprocessing.connection.BUFSIZE\nmultiprocessing.connection.CHALLENGE\nmultiprocessing.connection.CONNECTION_TIMEOUT\nmultiprocessing.connection.Client(??)\nmultiprocessing.connection.ConnectionWrapper(??)\nmultiprocessing.connection.FAILURE\nmultiprocessing.connection.Finalize(??)\nmultiprocessing.connection.Listener(??)\nmultiprocessing.connection.MESSAGE_LENGTH\nmultiprocessing.connection.Pipe(??)\nmultiprocessing.connection.SocketClient(??)\nmultiprocessing.connection.SocketListener(??)\nmultiprocessing.connection.WELCOME\nmultiprocessing.connection.XmlClient(??)\nmultiprocessing.connection.XmlListener(??)\nmultiprocessing.connection.address_type(??)\nmultiprocessing.connection.answer_challenge(??)\nmultiprocessing.connection.arbitrary_address(??)\nmultiprocessing.connection.close(fd)\nmultiprocessing.connection.current_process(??)\nmultiprocessing.connection.debug(??)\nmultiprocessing.connection.default_family\nmultiprocessing.connection.deliver_challenge(??)\nmultiprocessing.connection.duplicate(??)\nmultiprocessing.connection.errno(??)\nmultiprocessing.connection.families(??)\nmultiprocessing.connection.get_temp_dir(??)\nmultiprocessing.connection.itertools(??)\nmultiprocessing.connection.os(??)\nmultiprocessing.connection.socket(??)\nmultiprocessing.connection.sub_debug(??)\nmultiprocessing.connection.sys(??)\nmultiprocessing.connection.tempfile(??)\nmultiprocessing.connection.time(??)\nmultiprocessing.cpu_count(??)\nmultiprocessing.current_process(??)\nmultiprocessing.dummy(??)\nmultiprocessing.dummy.Array(??)\nmultiprocessing.dummy.BoundedSemaphore(??)\nmultiprocessing.dummy.Condition(??)\nmultiprocessing.dummy.DummyProcess(??)\nmultiprocessing.dummy.Event(??)\nmultiprocessing.dummy.JoinableQueue(??)\nmultiprocessing.dummy.Lock(??)\nmultiprocessing.dummy.Manager(??)\nmultiprocessing.dummy.Namespace(??)\nmultiprocessing.dummy.Pipe(??)\nmultiprocessing.dummy.Pool(??)\nmultiprocessing.dummy.Process(??)\nmultiprocessing.dummy.Queue(??)\nmultiprocessing.dummy.RLock(??)\nmultiprocessing.dummy.Semaphore(??)\nmultiprocessing.dummy.TimeoutError(??)\nmultiprocessing.dummy.Value(??)\nmultiprocessing.dummy.active_children(??)\nmultiprocessing.dummy.array(??)\nmultiprocessing.dummy.connection(??)\nmultiprocessing.dummy.connection.Client(??)\nmultiprocessing.dummy.connection.Connection(??)\nmultiprocessing.dummy.connection.Listener(??)\nmultiprocessing.dummy.connection.Pipe(??)\nmultiprocessing.dummy.connection.Queue(??)\nmultiprocessing.dummy.connection.families(??)\nmultiprocessing.dummy.cpu_count(??)\nmultiprocessing.dummy.current_process(??)\nmultiprocessing.dummy.dict() -> new empty dictionary\nmultiprocessing.dummy.freeze_support(??)\nmultiprocessing.dummy.itertools(??)\nmultiprocessing.dummy.list() -> new empty list\nmultiprocessing.dummy.shutdown(??)\nmultiprocessing.dummy.sys(??)\nmultiprocessing.dummy.threading(??)\nmultiprocessing.dummy.weakref(??)\nmultiprocessing.forking(??)\nmultiprocessing.forking.ForkingPickler(??)\nmultiprocessing.forking.Pickler(??)\nmultiprocessing.forking.Popen(??)\nmultiprocessing.forking.assert_spawning(??)\nmultiprocessing.forking.close(fd)\nmultiprocessing.forking.duplicate(??)\nmultiprocessing.forking.exit(??)\nmultiprocessing.forking.old_main_modules(??)\nmultiprocessing.forking.os(??)\nmultiprocessing.forking.partial(func, *args, **keywords) - new function with partial application\nmultiprocessing.forking.prepare(??)\nmultiprocessing.forking.process(??)\nmultiprocessing.forking.signal(??)\nmultiprocessing.forking.sys(??)\nmultiprocessing.forking.time(??)\nmultiprocessing.forking.util(??)\nmultiprocessing.freeze_support(??)\nmultiprocessing.get_logger(??)\nmultiprocessing.heap(??)\nmultiprocessing.heap.Arena(??)\nmultiprocessing.heap.BufferWrapper(??)\nmultiprocessing.heap.Finalize(??)\nmultiprocessing.heap.Heap(??)\nmultiprocessing.heap.assert_spawning(??)\nmultiprocessing.heap.bisect(??)\nmultiprocessing.heap.info(??)\nmultiprocessing.heap.itertools(??)\nmultiprocessing.heap.mmap(??)\nmultiprocessing.heap.os(??)\nmultiprocessing.heap.sys(??)\nmultiprocessing.heap.tempfile(??)\nmultiprocessing.heap.threading(??)\nmultiprocessing.log_to_stderr(??)\nmultiprocessing.managers(??)\nmultiprocessing.managers.AcquirerProxy(??)\nmultiprocessing.managers.Array(??)\nmultiprocessing.managers.ArrayProxy(??)\nmultiprocessing.managers.AuthenticationString(??)\nmultiprocessing.managers.AutoProxy(??)\nmultiprocessing.managers.BaseListProxy(??)\nmultiprocessing.managers.BaseManager(??)\nmultiprocessing.managers.BaseProxy(??)\nmultiprocessing.managers.ConditionProxy(??)\nmultiprocessing.managers.DictProxy(??)\nmultiprocessing.managers.EventProxy(??)\nmultiprocessing.managers.Finalize(??)\nmultiprocessing.managers.ForkingPickler(??)\nmultiprocessing.managers.IteratorProxy(??)\nmultiprocessing.managers.ListProxy(??)\nmultiprocessing.managers.MakeProxyType(??)\nmultiprocessing.managers.Namespace(??)\nmultiprocessing.managers.NamespaceProxy(??)\nmultiprocessing.managers.PicklingError(??)\nmultiprocessing.managers.Pool(??)\nmultiprocessing.managers.PoolProxy(??)\nmultiprocessing.managers.Popen(??)\nmultiprocessing.managers.Process(??)\nmultiprocessing.managers.ProcessLocalSet(??)\nmultiprocessing.managers.RebuildProxy(??)\nmultiprocessing.managers.RemoteError(??)\nmultiprocessing.managers.Server(??)\nmultiprocessing.managers.State(??)\nmultiprocessing.managers.SyncManager(??)\nmultiprocessing.managers.Token(??)\nmultiprocessing.managers.Value(??)\nmultiprocessing.managers.ValueProxy(??)\nmultiprocessing.managers.active_children(??)\nmultiprocessing.managers.all_methods(??)\nmultiprocessing.managers.array(??)\nmultiprocessing.managers.assert_spawning(??)\nmultiprocessing.managers.connection(??)\nmultiprocessing.managers.convert_to_error(??)\nmultiprocessing.managers.copyreg(??)\nmultiprocessing.managers.current_process(??)\nmultiprocessing.managers.dispatch(??)\nmultiprocessing.managers.exit(??)\nmultiprocessing.managers.format_exc(??)\nmultiprocessing.managers.info(??)\nmultiprocessing.managers.listener_client(??)\nmultiprocessing.managers.os(??)\nmultiprocessing.managers.public_methods(??)\nmultiprocessing.managers.queue(??)\nmultiprocessing.managers.rebuild_as_list(??)\nmultiprocessing.managers.reduce_array(??)\nmultiprocessing.managers.sys(??)\nmultiprocessing.managers.threading(??)\nmultiprocessing.managers.util(??)\nmultiprocessing.managers.view_type(??)\nmultiprocessing.managers.view_types(??)\nmultiprocessing.managers.weakref(??)\nmultiprocessing.os(??)\nmultiprocessing.pool(??)\nmultiprocessing.pool.ApplyResult(??)\nmultiprocessing.pool.CLOSE\nmultiprocessing.pool.Finalize(??)\nmultiprocessing.pool.IMapIterator(??)\nmultiprocessing.pool.IMapUnorderedIterator(??)\nmultiprocessing.pool.MapResult(??)\nmultiprocessing.pool.MaybeEncodingError(??)\nmultiprocessing.pool.Pool(??)\nmultiprocessing.pool.Process(??)\nmultiprocessing.pool.RUN\nmultiprocessing.pool.TERMINATE\nmultiprocessing.pool.ThreadPool(??)\nmultiprocessing.pool.TimeoutError(??)\nmultiprocessing.pool.collections(??)\nmultiprocessing.pool.cpu_count(??)\nmultiprocessing.pool.debug(??)\nmultiprocessing.pool.itertools(??)\nmultiprocessing.pool.job_counter(??)\nmultiprocessing.pool.mapstar(??)\nmultiprocessing.pool.queue(??)\nmultiprocessing.pool.threading(??)\nmultiprocessing.pool.time(??)\nmultiprocessing.pool.worker(??)\nmultiprocessing.process(??)\nmultiprocessing.process.AuthenticationString(??)\nmultiprocessing.process.ORIGINAL_DIR\nmultiprocessing.process.Process(??)\nmultiprocessing.process.active_children(??)\nmultiprocessing.process.current_process(??)\nmultiprocessing.process.itertools(??)\nmultiprocessing.process.name\nmultiprocessing.process.os(??)\nmultiprocessing.process.signal(??)\nmultiprocessing.process.signum(??)\nmultiprocessing.process.sys(??)\nmultiprocessing.queues(??)\nmultiprocessing.queues.BoundedSemaphore(??)\nmultiprocessing.queues.Condition(??)\nmultiprocessing.queues.Empty(??)\nmultiprocessing.queues.Finalize(??)\nmultiprocessing.queues.Full(??)\nmultiprocessing.queues.JoinableQueue(??)\nmultiprocessing.queues.Lock(??)\nmultiprocessing.queues.Pipe(??)\nmultiprocessing.queues.Queue(??)\nmultiprocessing.queues.Semaphore(??)\nmultiprocessing.queues.SimpleQueue(??)\nmultiprocessing.queues.assert_spawning(??)\nmultiprocessing.queues.atexit(??)\nmultiprocessing.queues.collections(??)\nmultiprocessing.queues.debug(??)\nmultiprocessing.queues.info(??)\nmultiprocessing.queues.os(??)\nmultiprocessing.queues.register_after_fork(??)\nmultiprocessing.queues.sys(??)\nmultiprocessing.queues.threading(??)\nmultiprocessing.queues.time(??)\nmultiprocessing.queues.weakref(??)\nmultiprocessing.reduction(??)\nmultiprocessing.reduction.Client(??)\nmultiprocessing.reduction.ForkingPickler(??)\nmultiprocessing.reduction.Listener(??)\nmultiprocessing.reduction.Popen(??)\nmultiprocessing.reduction.close(fd)\nmultiprocessing.reduction.current_process(??)\nmultiprocessing.reduction.debug(??)\nmultiprocessing.reduction.duplicate(??)\nmultiprocessing.reduction.fromfd(??)\nmultiprocessing.reduction.os(??)\nmultiprocessing.reduction.rebuild_connection(??)\nmultiprocessing.reduction.rebuild_handle(??)\nmultiprocessing.reduction.rebuild_socket(??)\nmultiprocessing.reduction.recv_handle(??)\nmultiprocessing.reduction.reduce_connection(??)\nmultiprocessing.reduction.reduce_handle(??)\nmultiprocessing.reduction.reduce_socket(??)\nmultiprocessing.reduction.register_after_fork(??)\nmultiprocessing.reduction.send_handle(??)\nmultiprocessing.reduction.socket(??)\nmultiprocessing.reduction.sub_debug(??)\nmultiprocessing.reduction.sys(??)\nmultiprocessing.reduction.threading(??)\nmultiprocessing.sharedctypes(??)\nmultiprocessing.sharedctypes.Array(??)\nmultiprocessing.sharedctypes.ForkingPickler(??)\nmultiprocessing.sharedctypes.RLock(??)\nmultiprocessing.sharedctypes.RawArray(??)\nmultiprocessing.sharedctypes.RawValue(??)\nmultiprocessing.sharedctypes.Synchronized(??)\nmultiprocessing.sharedctypes.SynchronizedArray(??)\nmultiprocessing.sharedctypes.SynchronizedBase(??)\nmultiprocessing.sharedctypes.SynchronizedString(??)\nmultiprocessing.sharedctypes.Value(??)\nmultiprocessing.sharedctypes.assert_spawning(??)\nmultiprocessing.sharedctypes.class_cache(??)\nmultiprocessing.sharedctypes.copy(??)\nmultiprocessing.sharedctypes.ctypes(??)\nmultiprocessing.sharedctypes.heap(??)\nmultiprocessing.sharedctypes.make_property(??)\nmultiprocessing.sharedctypes.prop_cache(??)\nmultiprocessing.sharedctypes.rebuild_ctype(??)\nmultiprocessing.sharedctypes.reduce_ctype(??)\nmultiprocessing.sharedctypes.synchronized(??)\nmultiprocessing.sharedctypes.sys(??)\nmultiprocessing.sharedctypes.template\nmultiprocessing.sharedctypes.typecode_to_type(??)\nmultiprocessing.sharedctypes.weakref(??)\nmultiprocessing.synchronize(??)\nmultiprocessing.synchronize.BoundedSemaphore(??)\nmultiprocessing.synchronize.Condition(??)\nmultiprocessing.synchronize.Event(??)\nmultiprocessing.synchronize.Finalize(??)\nmultiprocessing.synchronize.Lock(??)\nmultiprocessing.synchronize.Popen(??)\nmultiprocessing.synchronize.RECURSIVE_MUTEX\nmultiprocessing.synchronize.RLock(??)\nmultiprocessing.synchronize.SEMAPHORE\nmultiprocessing.synchronize.SEM_VALUE_MAX\nmultiprocessing.synchronize.SemLock(??)\nmultiprocessing.synchronize.Semaphore(??)\nmultiprocessing.synchronize.assert_spawning(??)\nmultiprocessing.synchronize.current_process(??)\nmultiprocessing.synchronize.debug(??)\nmultiprocessing.synchronize.os(??)\nmultiprocessing.synchronize.register_after_fork(??)\nmultiprocessing.synchronize.sys(??)\nmultiprocessing.synchronize.threading(??)\nmultiprocessing.sys(??)\nmultiprocessing.util(??)\nmultiprocessing.util.DEBUG\nmultiprocessing.util.DEFAULT_LOGGING_FORMAT\nmultiprocessing.util.Finalize(??)\nmultiprocessing.util.ForkAwareLocal(??)\nmultiprocessing.util.ForkAwareThreadLock(??)\nmultiprocessing.util.INFO\nmultiprocessing.util.LOGGER_NAME\nmultiprocessing.util.NOTSET\nmultiprocessing.util.SUBDEBUG\nmultiprocessing.util.SUBWARNING\nmultiprocessing.util.active_children(??)\nmultiprocessing.util.atexit(??)\nmultiprocessing.util.current_process(??)\nmultiprocessing.util.debug(??)\nmultiprocessing.util.get_logger(??)\nmultiprocessing.util.get_temp_dir(??)\nmultiprocessing.util.info(??)\nmultiprocessing.util.is_exiting(??)\nmultiprocessing.util.itertools(??)\nmultiprocessing.util.log_to_stderr(??)\nmultiprocessing.util.register_after_fork(??)\nmultiprocessing.util.sub_debug(??)\nmultiprocessing.util.sub_warning(??)\nmultiprocessing.util.threading(??)\nmultiprocessing.util.weakref(??)\nnetrc.NetrcParseError(??)\nnetrc.netrc(??)\nnetrc.os(??)\nnetrc.shlex(??)\nnext(iterator[, default])\nnntplib.ArticleInfo(number, message_id, lines)\nnntplib.GroupInfo(group, last, first, flag)\nnntplib.NNTP(??)\nnntplib.NNTPDataError(??)\nnntplib.NNTPError(??)\nnntplib.NNTPPermanentError(??)\nnntplib.NNTPProtocolError(??)\nnntplib.NNTPReplyError(??)\nnntplib.NNTPTemporaryError(??)\nnntplib.NNTP_PORT\nnntplib.NNTP_SSL(??)\nnntplib.NNTP_SSL_PORT\nnntplib.collections(??)\nnntplib.datetime(??)\nnntplib.decode_header(??)\nnntplib.re(??)\nnntplib.socket(??)\nnntplib.ssl(??)\nnntplib.warnings(??)\nnumbers.ABCMeta(??)\nnumbers.Complex(??)\nnumbers.Integral(??)\nnumbers.Number(??)\nnumbers.Rational(??)\nnumbers.Real(??)\nnumbers.abstractmethod(??)\nnumbers.abstractproperty(??)\nobject(??)\noct(number) -> string\nopen(??)\noperator.abs(a) -- Same as abs(a).\noperator.add(a, b) -- Same as a + b.\noperator.and_(a, b) -- Same as a & b.\noperator.attrgetter(attr, ...) --> attrgetter object\noperator.concat(a, b) -- Same as a + b, for a and b sequences.\noperator.contains(a, b) -- Same as b in a (note reversed operands).\noperator.countOf(a, b) -- Return the number of times b occurs in a.\noperator.delitem(a, b) -- Same as del a[b].\noperator.eq(a, b) -- Same as a==b.\noperator.floordiv(a, b) -- Same as a // b.\noperator.ge(a, b) -- Same as a>=b.\noperator.getitem(a, b) -- Same as a[b].\noperator.gt(a, b) -- Same as a>b.\noperator.iadd(??)\noperator.iand(??)\noperator.iconcat(??)\noperator.ifloordiv(??)\noperator.ilshift(??)\noperator.imod(??)\noperator.imul(??)\noperator.index(a) -- Same as a.__index__()\noperator.indexOf(a, b) -- Return the first index of b in a.\noperator.inv(a) -- Same as ~a.\noperator.invert(a) -- Same as ~a.\noperator.ior(??)\noperator.ipow(??)\noperator.irshift(??)\noperator.is_(a, b) -- Same as a is b.\noperator.is_not(a, b) -- Same as a is not b.\noperator.isub(??)\noperator.itemgetter(item, ...) --> itemgetter object\noperator.itruediv(??)\noperator.ixor(??)\noperator.le(a, b) -- Same as a<=b.\noperator.lshift(a, b) -- Same as a << b.\noperator.lt(a, b) -- Same as a<b.\noperator.methodcaller(name, ...) --> methodcaller object\noperator.mod(a, b) -- Same as a % b.\noperator.mul(a, b) -- Same as a * b.\noperator.ne(a, b) -- Same as a!=b.\noperator.neg(a) -- Same as -a.\noperator.not_(a) -- Same as not a.\noperator.or_(a, b) -- Same as a | b.\noperator.pos(a) -- Same as +a.\noperator.pow(a, b) -- Same as a ** b.\noperator.rshift(a, b) -- Same as a >> b.\noperator.setitem(a, b, c) -- Same as a[b] = c.\noperator.sub(a, b) -- Same as a - b.\noperator.truediv(a, b) -- Same as a / b.\noperator.truth(a) -- Return True if a is true, False otherwise.\noperator.xor(a, b) -- Same as a ^ b.\noptparse.AmbiguousOptionError(??)\noptparse.BadOptionError(??)\noptparse.HelpFormatter(??)\noptparse.IndentedHelpFormatter(??)\noptparse.NO_DEFAULT(??)\noptparse.OptParseError(??)\noptparse.Option(??)\noptparse.OptionConflictError(??)\noptparse.OptionContainer(??)\noptparse.OptionError(??)\noptparse.OptionGroup(??)\noptparse.OptionParser(??)\noptparse.OptionValueError(??)\noptparse.SUPPRESS_HELP\noptparse.SUPPRESS_USAGE\noptparse.TitledHelpFormatter(??)\noptparse.Values(??)\noptparse.check_builtin(??)\noptparse.check_choice(??)\noptparse.gettext(??)\noptparse.make_option(??)\noptparse.os(??)\noptparse.sys(??)\noptparse.textwrap(??)\nord(c) -> integer\nos.EX_CANTCREAT\nos.EX_CONFIG\nos.EX_DATAERR\nos.EX_IOERR\nos.EX_NOHOST\nos.EX_NOINPUT\nos.EX_NOPERM\nos.EX_NOUSER\nos.EX_OK\nos.EX_OSERR\nos.EX_OSFILE\nos.EX_PROTOCOL\nos.EX_SOFTWARE\nos.EX_TEMPFAIL\nos.EX_UNAVAILABLE\nos.EX_USAGE\nos.F_OK\nos.MutableMapping(??)\nos.NGROUPS_MAX\nos.O_APPEND\nos.O_ASYNC\nos.O_CREAT\nos.O_DIRECT\nos.O_DIRECTORY\nos.O_DSYNC\nos.O_EXCL\nos.O_LARGEFILE\nos.O_NDELAY\nos.O_NOATIME\nos.O_NOCTTY\nos.O_NOFOLLOW\nos.O_NONBLOCK\nos.O_RDONLY\nos.O_RDWR\nos.O_RSYNC\nos.O_SYNC\nos.O_TRUNC\nos.O_WRONLY\nos.P_NOWAIT\nos.P_NOWAITO\nos.P_WAIT\nos.R_OK\nos.SEEK_CUR\nos.SEEK_END\nos.SEEK_SET\nos.ST_NOSUID\nos.ST_RDONLY\nos.TMP_MAX\nos.WCONTINUED\nos.WCOREDUMP(status) -> bool\nos.WEXITSTATUS(status) -> integer\nos.WIFCONTINUED(status) -> bool\nos.WIFEXITED(status) -> bool\nos.WIFSIGNALED(status) -> bool\nos.WIFSTOPPED(status) -> bool\nos.WNOHANG\nos.WSTOPSIG(status) -> integer\nos.WTERMSIG(status) -> integer\nos.WUNTRACED\nos.W_OK\nos.X_OK\nos.abort() -> does not return!\nos.access(path, mode) -> True if granted, False otherwise\nos.altsep(??)\nos.chdir(path)\nos.chmod(path, mode)\nos.chown(path, uid, gid)\nos.chroot(path)\nos.close(fd)\nos.closerange(fd_low, fd_high)\nos.confstr(name) -> string\nos.confstr_names(??)\nos.ctermid() -> string\nos.curdir\nos.defpath\nos.device_encoding(fd) -> str\nos.devnull\nos.dup(fd) -> fd2\nos.dup2(old_fd, new_fd)\nos.environ(??)\nos.environb(??)\nos.errno(??)\nos.error(??)\nos.execl(file, *args)\nos.execle(file, *args, env)\nos.execlp(file, *args)\nos.execlpe(file, *args, env)\nos.execv(path, args)\nos.execve(path, args, env)\nos.execvp(file, args)\nos.execvpe(file, args, env)\nos.extsep\nos.fchdir(fildes)\nos.fchmod(fd, mode)\nos.fchown(fd, uid, gid)\nos.fdatasync(fildes)\nos.fdopen(??)\nos.fork() -> pid\nos.forkpty() -> (pid, master_fd)\nos.fpathconf(fd, name) -> integer\nos.fsdecode(??)\nos.fsencode(??)\nos.fstat(fd) -> stat result\nos.fstatvfs(fd) -> statvfs result\nos.fsync(fildes)\nos.ftruncate(fd, length)\nos.get_exec_path(??)\nos.getcwd() -> path\nos.getcwdb() -> path\nos.getegid() -> egid\nos.getenv(??)\nos.getenvb(??)\nos.geteuid() -> euid\nos.getgid() -> gid\nos.getgroups() -> list of group IDs\nos.getloadavg() -> (float, float, float)\nos.getlogin() -> string\nos.getpgid(pid) -> pgid\nos.getpgrp() -> pgrp\nos.getpid() -> pid\nos.getppid() -> ppid\nos.getresgid() -> (rgid, egid, sgid)\nos.getresuid() -> (ruid, euid, suid)\nos.getsid(pid) -> sid\nos.getuid() -> uid\nos.initgroups(username, gid) -> None\nos.isatty(fd) -> bool\nos.kill(pid, sig)\nos.killpg(pgid, sig)\nos.lchown(path, uid, gid)\nos.linesep\nos.link(src, dst)\nos.listdir([path]) -> list_of_strings\nos.lseek(fd, pos, how) -> newpos\nos.lstat(path) -> stat result\nos.major(device) -> major number\nos.makedev(major, minor) -> device number\nos.makedirs(path [, mode=0o777][, exist_ok=False])\nos.minor(device) -> minor number\nos.mkdir(path [, mode=0777])\nos.mkfifo(filename [, mode=0666])\nos.mknod(filename [, mode=0600, device])\nos.name\nos.nice(inc) -> new_priority\nos.open(filename, flag [, mode=0777]) -> fd\nos.openpty() -> (master_fd, slave_fd)\nos.pardir\nos.path(??)\nos.pathconf(path, name) -> integer\nos.pathconf_names(??)\nos.pathsep\nos.pipe() -> (read_end, write_end)\nos.popen(??)\nos.putenv(key, value)\nos.read(fd, buffersize) -> string\nos.readlink(path) -> path\nos.remove(path)\nos.removedirs(path)\nos.rename(old, new)\nos.renames(old, new)\nos.rmdir(path)\nos.sep\nos.setegid(gid)\nos.seteuid(uid)\nos.setgid(gid)\nos.setgroups(list)\nos.setpgid(pid, pgrp)\nos.setpgrp()\nos.setregid(rgid, egid)\nos.setresgid(rgid, egid, sgid)\nos.setresuid(ruid, euid, suid)\nos.setreuid(ruid, euid)\nos.setsid()\nos.setuid(uid)\nos.spawnl(mode, file, *args) -> integer\nos.spawnle(mode, file, *args, env) -> integer\nos.spawnlp(mode, file, *args) -> integer\nos.spawnlpe(mode, file, *args, env) -> integer\nos.spawnv(mode, file, args) -> integer\nos.spawnve(mode, file, args, env) -> integer\nos.spawnvp(mode, file, args) -> integer\nos.spawnvpe(mode, file, args, env) -> integer\nos.stat(path) -> stat result\nos.stat_float_times([newval]) -> oldval\nos.stat_result(??)\nos.statvfs(path) -> statvfs result\nos.statvfs_result(??)\nos.strerror(code) -> string\nos.supports_bytes_environ(??)\nos.symlink(src, dst)\nos.sys(??)\nos.sysconf(name) -> integer\nos.sysconf_names(??)\nos.system(command) -> exit_status\nos.tcgetpgrp(fd) -> pgid\nos.tcsetpgrp(fd, pgid)\nos.times() -> (utime, stime, cutime, cstime, elapsed_time)\nos.ttyname(fd) -> string\nos.umask(new_mask) -> old_mask\nos.uname() -> (sysname, nodename, release, version, machine)\nos.unlink(path)\nos.unsetenv(key)\nos.urandom(n) -> str\nos.utime(path, (atime, mtime))\nos.wait() -> (pid, status)\nos.wait3(options) -> (pid, status, rusage)\nos.wait4(pid, options) -> (pid, status, rusage)\nos.waitpid(pid, options) -> (pid, status)\nos.walk(??)\nos.write(fd, string) -> byteswritten\npdb.Pdb(??)\npdb.Restart(??)\npdb.TESTCMD\npdb.bdb(??)\npdb.cmd(??)\npdb.code(??)\npdb.dis(??)\npdb.find_function(??)\npdb.getsourcelines(??)\npdb.help(??)\npdb.inspect(??)\npdb.lasti2lineno(??)\npdb.line_prefix\npdb.linecache(??)\npdb.main(??)\npdb.os(??)\npdb.pm(??)\npdb.post_mortem(??)\npdb.pprint(??)\npdb.re(??)\npdb.run(??)\npdb.runcall(??)\npdb.runctx(??)\npdb.runeval(??)\npdb.set_trace(??)\npdb.signal(??)\npdb.sys(??)\npdb.test(??)\npdb.traceback(??)\npickle.APPEND\npickle.APPENDS\npickle.BINBYTES\npickle.BINFLOAT\npickle.BINGET\npickle.BININT\npickle.BININT1\npickle.BININT2\npickle.BINPERSID\npickle.BINPUT\npickle.BINSTRING\npickle.BINUNICODE\npickle.BUILD\npickle.BuiltinFunctionType(??)\npickle.DEFAULT_PROTOCOL\npickle.DICT\npickle.DUP\npickle.EMPTY_DICT\npickle.EMPTY_LIST\npickle.EMPTY_TUPLE\npickle.EXT1\npickle.EXT2\npickle.EXT4\npickle.FALSE\npickle.FLOAT\npickle.FunctionType(??)\npickle.GET\npickle.GLOBAL\npickle.HIGHEST_PROTOCOL\npickle.INST\npickle.INT\npickle.LIST\npickle.LONG\npickle.LONG1\npickle.LONG4\npickle.LONG_BINGET\npickle.LONG_BINPUT\npickle.MARK\npickle.NEWFALSE\npickle.NEWOBJ\npickle.NEWTRUE\npickle.NONE\npickle.OBJ\npickle.PERSID\npickle.POP\npickle.POP_MARK\npickle.PROTO\npickle.PUT\npickle.PickleError(??)\npickle.Pickler(file, protocol=None)\npickle.PicklingError(??)\npickle.PyStringMap(??)\npickle.REDUCE\npickle.SETITEM\npickle.SETITEMS\npickle.SHORT_BINBYTES\npickle.SHORT_BINSTRING\npickle.STOP\npickle.STRING\npickle.TRUE\npickle.TUPLE\npickle.TUPLE1\npickle.TUPLE2\npickle.TUPLE3\npickle.UNICODE\npickle.Unpickler(file, *, encoding='ASCII', errors='strict')\npickle.UnpicklingError(??)\npickle.bytes_types(??)\npickle.classmap(??)\npickle.codecs(??)\npickle.compatible_formats(??)\npickle.decode_long(??)\npickle.dispatch_table(??)\npickle.dump(obj, file, protocol=None, *, fix_imports=True) -> None\npickle.dumps(obj, protocol=None, *, fix_imports=True) -> bytes\npickle.encode_long(??)\npickle.format_version\npickle.io(??)\npickle.load(file, *, fix_imports=True, encoding='ASCII', errors='strict') -> object\npickle.loads(input, *, fix_imports=True, encoding='ASCII', errors='strict') -> object\npickle.marshal(??)\npickle.mloads(??)\npickle.re(??)\npickle.struct(??)\npickle.sys(??)\npickle.whichmodule(??)\npickletools.ArgumentDescriptor(??)\npickletools.OpcodeInfo(??)\npickletools.StackObject(??)\npickletools.TAKEN_FROM_ARGUMENT1\npickletools.TAKEN_FROM_ARGUMENT4\npickletools.UP_TO_NEWLINE\npickletools.anyobject(??)\npickletools.bytes_types(??)\npickletools.code2op(??)\npickletools.codecs(??)\npickletools.decimalnl_long(??)\npickletools.decimalnl_short(??)\npickletools.decode_long(??)\npickletools.dis(??)\npickletools.float8(??)\npickletools.floatnl(??)\npickletools.genops(??)\npickletools.int4(??)\npickletools.long1(??)\npickletools.long4(??)\npickletools.markobject(??)\npickletools.opcodes(??)\npickletools.optimize(??)\npickletools.pickle(??)\npickletools.pybool(??)\npickletools.pybytes(??)\npickletools.pydict(??)\npickletools.pyfloat(??)\npickletools.pyint(??)\npickletools.pyinteger_or_bool(??)\npickletools.pylist(??)\npickletools.pylong(??)\npickletools.pynone(??)\npickletools.pystring(??)\npickletools.pytuple(??)\npickletools.pyunicode(??)\npickletools.re(??)\npickletools.read_decimalnl_long(??)\npickletools.read_decimalnl_short(??)\npickletools.read_float8(??)\npickletools.read_floatnl(??)\npickletools.read_int4(??)\npickletools.read_long1(??)\npickletools.read_long4(??)\npickletools.read_string1(??)\npickletools.read_string4(??)\npickletools.read_stringnl(??)\npickletools.read_stringnl_noescape(??)\npickletools.read_stringnl_noescape_pair(??)\npickletools.read_uint1(??)\npickletools.read_uint2(??)\npickletools.read_unicodestring4(??)\npickletools.read_unicodestringnl(??)\npickletools.stackslice(??)\npickletools.string1(??)\npickletools.string4(??)\npickletools.stringnl(??)\npickletools.stringnl_noescape(??)\npickletools.stringnl_noescape_pair(??)\npickletools.uint1(??)\npickletools.uint2(??)\npickletools.unicodestring4(??)\npickletools.unicodestringnl(??)\npipes.FILEIN_FILEOUT\npipes.FILEIN_STDOUT\npipes.SINK\npipes.SOURCE\npipes.STDIN_FILEOUT\npipes.STDIN_STDOUT\npipes.Template(??)\npipes.makepipeline(??)\npipes.os(??)\npipes.quote(??)\npipes.re(??)\npipes.stepkinds(??)\npipes.string(??)\npipes.tempfile(??)\npkgutil.ImpImporter(??)\npkgutil.ImpLoader(??)\npkgutil.ModuleType(??)\npkgutil.extend_path(??)\npkgutil.find_loader(??)\npkgutil.get_data(??)\npkgutil.get_importer(??)\npkgutil.get_loader(??)\npkgutil.imp(??)\npkgutil.iter_importer_modules(??)\npkgutil.iter_importers(??)\npkgutil.iter_modules(??)\npkgutil.iter_zipimport_modules(??)\npkgutil.os(??)\npkgutil.read_code(??)\npkgutil.simplegeneric(??)\npkgutil.sys(??)\npkgutil.walk_packages(??)\npkgutil.zipimport(??)\npkgutil.zipimporter(archivepath) -> zipimporter object\nplatform.DEV_NULL\nplatform.architecture(??)\nplatform.dist(??)\nplatform.java_ver(??)\nplatform.libc_ver(??)\nplatform.linux_distribution(??)\nplatform.mac_ver(??)\nplatform.machine(??)\nplatform.node(??)\nplatform.os(??)\nplatform.platform(??)\nplatform.popen(??)\nplatform.processor(??)\nplatform.python_branch(??)\nplatform.python_build(??)\nplatform.python_compiler(??)\nplatform.python_implementation(??)\nplatform.python_revision(??)\nplatform.python_version(??)\nplatform.python_version_tuple(??)\nplatform.re(??)\nplatform.release(??)\nplatform.sys(??)\nplatform.system(??)\nplatform.system_alias(??)\nplatform.uname(??)\nplatform.version(??)\nplatform.win32_ver(??)\nplistlib.BytesIO([buffer]) -> object\nplistlib.Data(??)\nplistlib.Dict(??)\nplistlib.DumbXMLWriter(??)\nplistlib.PLISTHEADER\nplistlib.Plist(??)\nplistlib.PlistParser(??)\nplistlib.PlistWriter(??)\nplistlib.binascii(??)\nplistlib.datetime(??)\nplistlib.re(??)\nplistlib.readPlist(??)\nplistlib.readPlistFromBytes(??)\nplistlib.writePlist(??)\nplistlib.writePlistToBytes(??)\npoplib.CR\npoplib.CRLF\npoplib.LF\npoplib.POP3(??)\npoplib.POP3_PORT\npoplib.POP3_SSL(??)\npoplib.POP3_SSL_PORT\npoplib.error_proto(??)\npoplib.re(??)\npoplib.socket(??)\npoplib.ssl(??)\nposix.EX_CANTCREAT\nposix.EX_CONFIG\nposix.EX_DATAERR\nposix.EX_IOERR\nposix.EX_NOHOST\nposix.EX_NOINPUT\nposix.EX_NOPERM\nposix.EX_NOUSER\nposix.EX_OK\nposix.EX_OSERR\nposix.EX_OSFILE\nposix.EX_PROTOCOL\nposix.EX_SOFTWARE\nposix.EX_TEMPFAIL\nposix.EX_UNAVAILABLE\nposix.EX_USAGE\nposix.F_OK\nposix.NGROUPS_MAX\nposix.O_APPEND\nposix.O_ASYNC\nposix.O_CREAT\nposix.O_DIRECT\nposix.O_DIRECTORY\nposix.O_DSYNC\nposix.O_EXCL\nposix.O_LARGEFILE\nposix.O_NDELAY\nposix.O_NOATIME\nposix.O_NOCTTY\nposix.O_NOFOLLOW\nposix.O_NONBLOCK\nposix.O_RDONLY\nposix.O_RDWR\nposix.O_RSYNC\nposix.O_SYNC\nposix.O_TRUNC\nposix.O_WRONLY\nposix.R_OK\nposix.ST_NOSUID\nposix.ST_RDONLY\nposix.TMP_MAX\nposix.WCONTINUED\nposix.WCOREDUMP(status) -> bool\nposix.WEXITSTATUS(status) -> integer\nposix.WIFCONTINUED(status) -> bool\nposix.WIFEXITED(status) -> bool\nposix.WIFSIGNALED(status) -> bool\nposix.WIFSTOPPED(status) -> bool\nposix.WNOHANG\nposix.WSTOPSIG(status) -> integer\nposix.WTERMSIG(status) -> integer\nposix.WUNTRACED\nposix.W_OK\nposix.X_OK\nposix.abort() -> does not return!\nposix.access(path, mode) -> True if granted, False otherwise\nposix.chdir(path)\nposix.chmod(path, mode)\nposix.chown(path, uid, gid)\nposix.chroot(path)\nposix.close(fd)\nposix.closerange(fd_low, fd_high)\nposix.confstr(name) -> string\nposix.confstr_names(??)\nposix.ctermid() -> string\nposix.device_encoding(fd) -> str\nposix.dup(fd) -> fd2\nposix.dup2(old_fd, new_fd)\nposix.environ(??)\nposix.error(??)\nposix.execv(path, args)\nposix.execve(path, args, env)\nposix.fchdir(fildes)\nposix.fchmod(fd, mode)\nposix.fchown(fd, uid, gid)\nposix.fdatasync(fildes)\nposix.fork() -> pid\nposix.forkpty() -> (pid, master_fd)\nposix.fpathconf(fd, name) -> integer\nposix.fstat(fd) -> stat result\nposix.fstatvfs(fd) -> statvfs result\nposix.fsync(fildes)\nposix.ftruncate(fd, length)\nposix.getcwd() -> path\nposix.getcwdb() -> path\nposix.getegid() -> egid\nposix.geteuid() -> euid\nposix.getgid() -> gid\nposix.getgroups() -> list of group IDs\nposix.getloadavg() -> (float, float, float)\nposix.getlogin() -> string\nposix.getpgid(pid) -> pgid\nposix.getpgrp() -> pgrp\nposix.getpid() -> pid\nposix.getppid() -> ppid\nposix.getresgid() -> (rgid, egid, sgid)\nposix.getresuid() -> (ruid, euid, suid)\nposix.getsid(pid) -> sid\nposix.getuid() -> uid\nposix.initgroups(username, gid) -> None\nposix.isatty(fd) -> bool\nposix.kill(pid, sig)\nposix.killpg(pgid, sig)\nposix.lchown(path, uid, gid)\nposix.link(src, dst)\nposix.listdir([path]) -> list_of_strings\nposix.lseek(fd, pos, how) -> newpos\nposix.lstat(path) -> stat result\nposix.major(device) -> major number\nposix.makedev(major, minor) -> device number\nposix.minor(device) -> minor number\nposix.mkdir(path [, mode=0777])\nposix.mkfifo(filename [, mode=0666])\nposix.mknod(filename [, mode=0600, device])\nposix.nice(inc) -> new_priority\nposix.open(filename, flag [, mode=0777]) -> fd\nposix.openpty() -> (master_fd, slave_fd)\nposix.pathconf(path, name) -> integer\nposix.pathconf_names(??)\nposix.pipe() -> (read_end, write_end)\nposix.putenv(key, value)\nposix.read(fd, buffersize) -> string\nposix.readlink(path) -> path\nposix.remove(path)\nposix.rename(old, new)\nposix.rmdir(path)\nposix.setegid(gid)\nposix.seteuid(uid)\nposix.setgid(gid)\nposix.setgroups(list)\nposix.setpgid(pid, pgrp)\nposix.setpgrp()\nposix.setregid(rgid, egid)\nposix.setresgid(rgid, egid, sgid)\nposix.setresuid(ruid, euid, suid)\nposix.setreuid(ruid, euid)\nposix.setsid()\nposix.setuid(uid)\nposix.stat(path) -> stat result\nposix.stat_float_times([newval]) -> oldval\nposix.stat_result(??)\nposix.statvfs(path) -> statvfs result\nposix.statvfs_result(??)\nposix.strerror(code) -> string\nposix.symlink(src, dst)\nposix.sysconf(name) -> integer\nposix.sysconf_names(??)\nposix.system(command) -> exit_status\nposix.tcgetpgrp(fd) -> pgid\nposix.tcsetpgrp(fd, pgid)\nposix.times() -> (utime, stime, cutime, cstime, elapsed_time)\nposix.ttyname(fd) -> string\nposix.umask(new_mask) -> old_mask\nposix.uname() -> (sysname, nodename, release, version, machine)\nposix.unlink(path)\nposix.unsetenv(key)\nposix.utime(path, (atime, mtime))\nposix.wait() -> (pid, status)\nposix.wait3(options) -> (pid, status, rusage)\nposix.wait4(pid, options) -> (pid, status, rusage)\nposix.waitpid(pid, options) -> (pid, status)\nposix.write(fd, string) -> byteswritten\npow(x, y[, z]) -> number\npprint.PrettyPrinter(??)\npprint.isreadable(??)\npprint.isrecursive(??)\npprint.pformat(??)\npprint.pprint(??)\npprint.saferepr(??)\nprint(value, ..., sep=' ', end='\\n', file=sys.stdout)\nprofile.OptionParser(??)\nprofile.Profile(??)\nprofile.main(??)\nprofile.marshal(??)\nprofile.os(??)\nprofile.resgetrusage(??)\nprofile.resource(??)\nprofile.run(??)\nprofile.runctx(??)\nprofile.sys(??)\nprofile.time(??)\nproperty(fget=None, fset=None, fdel=None, doc=None) -> property attribute\npstats.Stats(??)\npstats.TupleComp(??)\npstats.add_callers(??)\npstats.add_func_stats(??)\npstats.cmp_to_key(??)\npstats.count_calls(??)\npstats.f8(??)\npstats.func_get_function_name(??)\npstats.func_std_string(??)\npstats.func_strip_path(??)\npstats.marshal(??)\npstats.os(??)\npstats.re(??)\npstats.sys(??)\npstats.time(??)\npty.CHILD\npty.STDERR_FILENO\npty.STDIN_FILENO\npty.STDOUT_FILENO\npty.fork() -> (pid, master_fd)\npty.master_open() -> (master_fd, slave_name)\npty.openpty() -> (master_fd, slave_fd)\npty.os(??)\npty.select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\npty.slave_open(tty_name) -> slave_fd\npty.spawn(??)\npty.tty(??)\npwd.getpwall() -> list_of_entries\npwd.getpwnam(name) -> (pw_name,pw_passwd,pw_uid,\npwd.getpwuid(uid) -> (pw_name,pw_passwd,pw_uid,\npwd.struct_passwd(??)\npy_compile.MAGIC\npy_compile.PyCompileError(??)\npy_compile.builtins(??)\npy_compile.compile(??)\npy_compile.errno(??)\npy_compile.imp(??)\npy_compile.main(??)\npy_compile.marshal(??)\npy_compile.os(??)\npy_compile.sys(??)\npy_compile.tokenize(??)\npy_compile.traceback(??)\npy_compile.wr_long(??)\npyclbr.Class(??)\npyclbr.DEDENT\npyclbr.Function(??)\npyclbr.NAME\npyclbr.OP\npyclbr.imp(??)\npyclbr.itemgetter(item, ...) --> itemgetter object\npyclbr.readmodule(??)\npyclbr.readmodule_ex(??)\npyclbr.sys(??)\npyclbr.tokenize(??)\npydoc.Doc(??)\npydoc.ErrorDuringImport(??)\npydoc.HTMLDoc(??)\npydoc.HTMLRepr(??)\npydoc.Helper(??)\npydoc.ModuleScanner(??)\npydoc.Repr(??)\npydoc.Scanner(??)\npydoc.TextDoc(??)\npydoc.TextRepr(??)\npydoc.allmethods(??)\npydoc.apropos(??)\npydoc.browse(??)\npydoc.builtins(??)\npydoc.classify_class_attrs(??)\npydoc.classname(??)\npydoc.cli(??)\npydoc.cram(??)\npydoc.deque(iterable[, maxlen]) --> deque object\npydoc.describe(??)\npydoc.doc(??)\npydoc.extract_tb(??)\npydoc.format_exception_only(??)\npydoc.getdoc(??)\npydoc.getpager(??)\npydoc.gui(??)\npydoc.help(??)\npydoc.html(??)\npydoc.imp(??)\npydoc.importfile(??)\npydoc.inspect(??)\npydoc.io(??)\npydoc.isdata(??)\npydoc.ispackage(??)\npydoc.ispath(??)\npydoc.locate(??)\npydoc.os(??)\npydoc.pager(??)\npydoc.pathdirs(??)\npydoc.pipepager(??)\npydoc.pkgutil(??)\npydoc.plain(??)\npydoc.plainpager(??)\npydoc.plaintext(??)\npydoc.platform(??)\npydoc.re(??)\npydoc.render_doc(??)\npydoc.replace(??)\npydoc.resolve(??)\npydoc.safeimport(??)\npydoc.serve(??)\npydoc.source_synopsis(??)\npydoc.splitdoc(??)\npydoc.stripid(??)\npydoc.synopsis(??)\npydoc.sys(??)\npydoc.tempfilepager(??)\npydoc.text(??)\npydoc.time(??)\npydoc.ttypager(??)\npydoc.visiblename(??)\npydoc.warnings(??)\npydoc.writedoc(??)\npydoc.writedocs(??)\npydoc_data.topics(??)\npydoc_data.topics.topics(??)\nqueue.Empty(??)\nqueue.Full(??)\nqueue.LifoQueue(??)\nqueue.PriorityQueue(??)\nqueue.Queue(??)\nqueue.deque(iterable[, maxlen]) --> deque object\nqueue.heapq(??)\nquit(??)\nquopri.EMPTYSTRING\nquopri.ESCAPE\nquopri.HEX\nquopri.MAXLINESIZE\nquopri.a2b_qp(??)\nquopri.b2a_qp(data, quotetabs=0, istext=1, header=0) -> s;\nquopri.decode(??)\nquopri.decodestring(??)\nquopri.encode(??)\nquopri.encodestring(??)\nquopri.ishex(??)\nquopri.main(??)\nquopri.needsquoting(??)\nquopri.quote(??)\nquopri.unhex(??)\nrandom.BPF\nrandom.LOG4\nrandom.NV_MAGICCONST\nrandom.RECIP_BPF\nrandom.Random(??)\nrandom.SG_MAGICCONST\nrandom.SystemRandom(??)\nrandom.TWOPI\nrandom.betavariate(??)\nrandom.choice(??)\nrandom.division(??)\nrandom.expovariate(??)\nrandom.gammavariate(??)\nrandom.gauss(??)\nrandom.getrandbits(k) -> x.  Generates a long int with k random bits.\nrandom.getstate(??)\nrandom.lognormvariate(??)\nrandom.normalvariate(??)\nrandom.paretovariate(??)\nrandom.randint(??)\nrandom.random() -> x in the interval [0, 1).\nrandom.randrange(??)\nrandom.sample(??)\nrandom.seed(??)\nrandom.setstate(??)\nrandom.shuffle(??)\nrandom.triangular(??)\nrandom.uniform(??)\nrandom.vonmisesvariate(??)\nrandom.weibullvariate(??)\nrange([start,] stop[, step]) -> range object\nre.A\nre.ASCII\nre.DEBUG\nre.DOTALL\nre.I\nre.IGNORECASE\nre.L\nre.LOCALE\nre.M\nre.MULTILINE\nre.S\nre.Scanner(??)\nre.T\nre.TEMPLATE\nre.U\nre.UNICODE\nre.VERBOSE\nre.X\nre.compile(??)\nre.copyreg(??)\nre.error(??)\nre.escape(??)\nre.findall(??)\nre.finditer(??)\nre.functools(??)\nre.match(??)\nre.purge(??)\nre.search(??)\nre.split(??)\nre.sre_compile(??)\nre.sre_parse(??)\nre.sub(??)\nre.subn(??)\nre.sys(??)\nre.template(??)\nrepr(object) -> string\nreprlib.Repr(??)\nreprlib.aRepr(??)\nreprlib.builtins(??)\nreprlib.get_ident() -> integer\nreprlib.islice(iterable, [start,] stop [, step]) --> islice object\nreprlib.recursive_repr(??)\nreprlib.repr(??)\nreversed(sequence) -> reverse iterator over values of the sequence\nrlcompleter.Completer(??)\nrlcompleter.builtins(??)\nrlcompleter.get_class_members(??)\nround(number[, ndigits]) -> number\nrunpy.get_loader(??)\nrunpy.imp(??)\nrunpy.read_code(??)\nrunpy.run_module(??)\nrunpy.run_path(??)\nrunpy.sys(??)\nsched.Event(??)\nsched.heapq(??)\nsched.namedtuple(??)\nsched.scheduler(??)\nset() -> new empty set object\nsetattr(object, name, value)\nshelve.BsdDbShelf(??)\nshelve.BytesIO([buffer]) -> object\nshelve.DbfilenameShelf(??)\nshelve.Pickler(file, protocol=None)\nshelve.Shelf(??)\nshelve.Unpickler(file, *, encoding='ASCII', errors='strict')\nshelve.collections(??)\nshelve.open(??)\nshlex.StringIO(??)\nshlex.deque(iterable[, maxlen]) --> deque object\nshlex.os(??)\nshlex.shlex(??)\nshlex.split(??)\nshlex.sys(??)\nshutil.Error(??)\nshutil.ExecError(??)\nshutil.ReadError(??)\nshutil.RegistryError(??)\nshutil.SpecialFileError(??)\nshutil.WindowsError(??)\nshutil.abspath(??)\nshutil.collections(??)\nshutil.copy(??)\nshutil.copy2(??)\nshutil.copyfile(??)\nshutil.copyfileobj(??)\nshutil.copymode(??)\nshutil.copystat(??)\nshutil.copytree(??)\nshutil.errno(??)\nshutil.fnmatch(??)\nshutil.get_archive_formats(??)\nshutil.get_unpack_formats(??)\nshutil.getgrnam(name) -> tuple\nshutil.getpwnam(name) -> (pw_name,pw_passwd,pw_uid,\nshutil.ignore_patterns(??)\nshutil.make_archive(??)\nshutil.move(??)\nshutil.os(??)\nshutil.register_archive_format(??)\nshutil.register_unpack_format(??)\nshutil.rmtree(??)\nshutil.stat(??)\nshutil.sys(??)\nshutil.tarfile(??)\nshutil.unpack_archive(??)\nshutil.unregister_archive_format(??)\nshutil.unregister_unpack_format(??)\nsignal.ITIMER_PROF\nsignal.ITIMER_REAL\nsignal.ITIMER_VIRTUAL\nsignal.ItimerError(??)\nsignal.NSIG\nsignal.SIGABRT\nsignal.SIGALRM\nsignal.SIGBUS\nsignal.SIGCHLD\nsignal.SIGCLD\nsignal.SIGCONT\nsignal.SIGFPE\nsignal.SIGHUP\nsignal.SIGILL\nsignal.SIGINT\nsignal.SIGIO\nsignal.SIGIOT\nsignal.SIGKILL\nsignal.SIGPIPE\nsignal.SIGPOLL\nsignal.SIGPROF\nsignal.SIGPWR\nsignal.SIGQUIT\nsignal.SIGRTMAX\nsignal.SIGRTMIN\nsignal.SIGSEGV\nsignal.SIGSTOP\nsignal.SIGSYS\nsignal.SIGTERM\nsignal.SIGTRAP\nsignal.SIGTSTP\nsignal.SIGTTIN\nsignal.SIGTTOU\nsignal.SIGURG\nsignal.SIGUSR1\nsignal.SIGUSR2\nsignal.SIGVTALRM\nsignal.SIGWINCH\nsignal.SIGXCPU\nsignal.SIGXFSZ\nsignal.SIG_DFL\nsignal.SIG_IGN\nsignal.alarm(seconds)\nsignal.default_int_handler(...)\nsignal.getitimer(which)\nsignal.getsignal(sig) -> action\nsignal.pause()\nsignal.set_wakeup_fd(fd) -> fd\nsignal.setitimer(which, seconds[, interval])\nsignal.siginterrupt(sig, flag) -> None\nsignal.signal(sig, action) -> action\nsite.ENABLE_USER_SITE(??)\nsite.PREFIXES(??)\nsite.USER_BASE\nsite.USER_SITE\nsite.abs_paths(??)\nsite.addpackage(??)\nsite.addsitedir(??)\nsite.addsitepackages(??)\nsite.addusersitepackages(??)\nsite.aliasmbcs(??)\nsite.builtins(??)\nsite.check_enableusersite(??)\nsite.execsitecustomize(??)\nsite.execusercustomize(??)\nsite.getsitepackages(??)\nsite.getuserbase(??)\nsite.getusersitepackages(??)\nsite.main(??)\nsite.makepath(??)\nsite.os(??)\nsite.removeduppaths(??)\nsite.setBEGINLIBPATH(??)\nsite.setcopyright(??)\nsite.sethelper(??)\nsite.setquit(??)\nsite.sys(??)\nsite.traceback(??)\nslice([start,] stop[, step])\nsmtpd.COMMASPACE\nsmtpd.DEBUGSTREAM(??)\nsmtpd.DebuggingServer(??)\nsmtpd.Devnull(??)\nsmtpd.EMPTYSTRING\nsmtpd.MailmanProxy(??)\nsmtpd.NEWLINE\nsmtpd.Options(??)\nsmtpd.PureProxy(??)\nsmtpd.SMTPChannel(??)\nsmtpd.SMTPServer(??)\nsmtpd.asynchat(??)\nsmtpd.asyncore(??)\nsmtpd.errno(??)\nsmtpd.getopt(??)\nsmtpd.os(??)\nsmtpd.parseargs(??)\nsmtpd.program\nsmtpd.socket(??)\nsmtpd.sys(??)\nsmtpd.time(??)\nsmtpd.usage(??)\nsmtpd.warn(??)\nsmtplib.CRLF\nsmtplib.LMTP(??)\nsmtplib.LMTP_PORT\nsmtplib.OLDSTYLE_AUTH(??)\nsmtplib.SMTP(??)\nsmtplib.SMTPAuthenticationError(??)\nsmtplib.SMTPConnectError(??)\nsmtplib.SMTPDataError(??)\nsmtplib.SMTPException(??)\nsmtplib.SMTPHeloError(??)\nsmtplib.SMTPRecipientsRefused(??)\nsmtplib.SMTPResponseException(??)\nsmtplib.SMTPSenderRefused(??)\nsmtplib.SMTPServerDisconnected(??)\nsmtplib.SMTP_PORT\nsmtplib.SMTP_SSL(??)\nsmtplib.SMTP_SSL_PORT\nsmtplib.SSLFakeFile(??)\nsmtplib.bCRLF\nsmtplib.base64(??)\nsmtplib.email(??)\nsmtplib.encode_base64(??)\nsmtplib.hmac(??)\nsmtplib.io(??)\nsmtplib.quoteaddr(??)\nsmtplib.quotedata(??)\nsmtplib.re(??)\nsmtplib.socket(??)\nsmtplib.ssl(??)\nsmtplib.stderr(??)\nsndhdr.get_long_be(??)\nsndhdr.get_long_le(??)\nsndhdr.get_short_be(??)\nsndhdr.get_short_le(??)\nsndhdr.test(??)\nsndhdr.test_8svx(??)\nsndhdr.test_aifc(??)\nsndhdr.test_au(??)\nsndhdr.test_hcom(??)\nsndhdr.test_sndr(??)\nsndhdr.test_sndt(??)\nsndhdr.test_voc(??)\nsndhdr.test_wav(??)\nsndhdr.testall(??)\nsndhdr.tests(??)\nsndhdr.what(??)\nsndhdr.whathdr(??)\nsocket.AF_APPLETALK\nsocket.AF_ASH\nsocket.AF_ATMPVC\nsocket.AF_ATMSVC\nsocket.AF_AX25\nsocket.AF_BLUETOOTH\nsocket.AF_BRIDGE\nsocket.AF_DECnet\nsocket.AF_ECONET\nsocket.AF_INET\nsocket.AF_INET6\nsocket.AF_IPX\nsocket.AF_IRDA\nsocket.AF_KEY\nsocket.AF_LLC\nsocket.AF_NETBEUI\nsocket.AF_NETLINK\nsocket.AF_NETROM\nsocket.AF_PACKET\nsocket.AF_PPPOX\nsocket.AF_ROSE\nsocket.AF_ROUTE\nsocket.AF_SECURITY\nsocket.AF_SNA\nsocket.AF_TIPC\nsocket.AF_UNIX\nsocket.AF_UNSPEC\nsocket.AF_WANPIPE\nsocket.AF_X25\nsocket.AI_ADDRCONFIG\nsocket.AI_ALL\nsocket.AI_CANONNAME\nsocket.AI_NUMERICHOST\nsocket.AI_NUMERICSERV\nsocket.AI_PASSIVE\nsocket.AI_V4MAPPED\nsocket.BDADDR_ANY\nsocket.BDADDR_LOCAL\nsocket.BTPROTO_HCI\nsocket.BTPROTO_L2CAP\nsocket.BTPROTO_RFCOMM\nsocket.BTPROTO_SCO\nsocket.CAPI(??)\nsocket.EAGAIN\nsocket.EAI_ADDRFAMILY\nsocket.EAI_AGAIN\nsocket.EAI_BADFLAGS\nsocket.EAI_FAIL\nsocket.EAI_FAMILY\nsocket.EAI_MEMORY\nsocket.EAI_NODATA\nsocket.EAI_NONAME\nsocket.EAI_OVERFLOW\nsocket.EAI_SERVICE\nsocket.EAI_SOCKTYPE\nsocket.EAI_SYSTEM\nsocket.EBADF\nsocket.EINTR\nsocket.EWOULDBLOCK\nsocket.HCI_DATA_DIR\nsocket.HCI_FILTER\nsocket.HCI_TIME_STAMP\nsocket.INADDR_ALLHOSTS_GROUP\nsocket.INADDR_ANY\nsocket.INADDR_BROADCAST\nsocket.INADDR_LOOPBACK\nsocket.INADDR_MAX_LOCAL_GROUP\nsocket.INADDR_NONE\nsocket.INADDR_UNSPEC_GROUP\nsocket.IPPORT_RESERVED\nsocket.IPPORT_USERRESERVED\nsocket.IPPROTO_AH\nsocket.IPPROTO_DSTOPTS\nsocket.IPPROTO_EGP\nsocket.IPPROTO_ESP\nsocket.IPPROTO_FRAGMENT\nsocket.IPPROTO_GRE\nsocket.IPPROTO_HOPOPTS\nsocket.IPPROTO_ICMP\nsocket.IPPROTO_ICMPV6\nsocket.IPPROTO_IDP\nsocket.IPPROTO_IGMP\nsocket.IPPROTO_IP\nsocket.IPPROTO_IPIP\nsocket.IPPROTO_IPV6\nsocket.IPPROTO_NONE\nsocket.IPPROTO_PIM\nsocket.IPPROTO_PUP\nsocket.IPPROTO_RAW\nsocket.IPPROTO_ROUTING\nsocket.IPPROTO_RSVP\nsocket.IPPROTO_TCP\nsocket.IPPROTO_TP\nsocket.IPPROTO_UDP\nsocket.IPV6_CHECKSUM\nsocket.IPV6_DSTOPTS\nsocket.IPV6_HOPLIMIT\nsocket.IPV6_HOPOPTS\nsocket.IPV6_JOIN_GROUP\nsocket.IPV6_LEAVE_GROUP\nsocket.IPV6_MULTICAST_HOPS\nsocket.IPV6_MULTICAST_IF\nsocket.IPV6_MULTICAST_LOOP\nsocket.IPV6_NEXTHOP\nsocket.IPV6_PKTINFO\nsocket.IPV6_RECVDSTOPTS\nsocket.IPV6_RECVHOPLIMIT\nsocket.IPV6_RECVHOPOPTS\nsocket.IPV6_RECVPKTINFO\nsocket.IPV6_RECVRTHDR\nsocket.IPV6_RECVTCLASS\nsocket.IPV6_RTHDR\nsocket.IPV6_RTHDRDSTOPTS\nsocket.IPV6_RTHDR_TYPE_0\nsocket.IPV6_TCLASS\nsocket.IPV6_UNICAST_HOPS\nsocket.IPV6_V6ONLY\nsocket.IP_ADD_MEMBERSHIP\nsocket.IP_DEFAULT_MULTICAST_LOOP\nsocket.IP_DEFAULT_MULTICAST_TTL\nsocket.IP_DROP_MEMBERSHIP\nsocket.IP_HDRINCL\nsocket.IP_MAX_MEMBERSHIPS\nsocket.IP_MULTICAST_IF\nsocket.IP_MULTICAST_LOOP\nsocket.IP_MULTICAST_TTL\nsocket.IP_OPTIONS\nsocket.IP_RECVOPTS\nsocket.IP_RECVRETOPTS\nsocket.IP_RETOPTS\nsocket.IP_TOS\nsocket.IP_TTL\nsocket.MSG_CTRUNC\nsocket.MSG_DONTROUTE\nsocket.MSG_DONTWAIT\nsocket.MSG_EOR\nsocket.MSG_OOB\nsocket.MSG_PEEK\nsocket.MSG_TRUNC\nsocket.MSG_WAITALL\nsocket.NETLINK_DNRTMSG\nsocket.NETLINK_FIREWALL\nsocket.NETLINK_IP6_FW\nsocket.NETLINK_NFLOG\nsocket.NETLINK_ROUTE\nsocket.NETLINK_USERSOCK\nsocket.NETLINK_XFRM\nsocket.NI_DGRAM\nsocket.NI_MAXHOST\nsocket.NI_MAXSERV\nsocket.NI_NAMEREQD\nsocket.NI_NOFQDN\nsocket.NI_NUMERICHOST\nsocket.NI_NUMERICSERV\nsocket.PACKET_BROADCAST\nsocket.PACKET_FASTROUTE\nsocket.PACKET_HOST\nsocket.PACKET_LOOPBACK\nsocket.PACKET_MULTICAST\nsocket.PACKET_OTHERHOST\nsocket.PACKET_OUTGOING\nsocket.PF_PACKET\nsocket.SHUT_RD\nsocket.SHUT_RDWR\nsocket.SHUT_WR\nsocket.SOCK_CLOEXEC\nsocket.SOCK_DGRAM\nsocket.SOCK_NONBLOCK\nsocket.SOCK_RAW\nsocket.SOCK_RDM\nsocket.SOCK_SEQPACKET\nsocket.SOCK_STREAM\nsocket.SOL_HCI\nsocket.SOL_IP\nsocket.SOL_SOCKET\nsocket.SOL_TCP\nsocket.SOL_TIPC\nsocket.SOL_UDP\nsocket.SOMAXCONN\nsocket.SO_ACCEPTCONN\nsocket.SO_BROADCAST\nsocket.SO_DEBUG\nsocket.SO_DONTROUTE\nsocket.SO_ERROR\nsocket.SO_KEEPALIVE\nsocket.SO_LINGER\nsocket.SO_OOBINLINE\nsocket.SO_RCVBUF\nsocket.SO_RCVLOWAT\nsocket.SO_RCVTIMEO\nsocket.SO_REUSEADDR\nsocket.SO_SNDBUF\nsocket.SO_SNDLOWAT\nsocket.SO_SNDTIMEO\nsocket.SO_TYPE\nsocket.SocketIO(??)\nsocket.SocketType(??)\nsocket.TCP_CORK\nsocket.TCP_DEFER_ACCEPT\nsocket.TCP_INFO\nsocket.TCP_KEEPCNT\nsocket.TCP_KEEPIDLE\nsocket.TCP_KEEPINTVL\nsocket.TCP_LINGER2\nsocket.TCP_MAXSEG\nsocket.TCP_NODELAY\nsocket.TCP_QUICKACK\nsocket.TCP_SYNCNT\nsocket.TCP_WINDOW_CLAMP\nsocket.TIPC_ADDR_ID\nsocket.TIPC_ADDR_NAME\nsocket.TIPC_ADDR_NAMESEQ\nsocket.TIPC_CFG_SRV\nsocket.TIPC_CLUSTER_SCOPE\nsocket.TIPC_CONN_TIMEOUT\nsocket.TIPC_CRITICAL_IMPORTANCE\nsocket.TIPC_DEST_DROPPABLE\nsocket.TIPC_HIGH_IMPORTANCE\nsocket.TIPC_IMPORTANCE\nsocket.TIPC_LOW_IMPORTANCE\nsocket.TIPC_MEDIUM_IMPORTANCE\nsocket.TIPC_NODE_SCOPE\nsocket.TIPC_PUBLISHED\nsocket.TIPC_SRC_DROPPABLE\nsocket.TIPC_SUBSCR_TIMEOUT\nsocket.TIPC_SUB_CANCEL\nsocket.TIPC_SUB_PORTS\nsocket.TIPC_SUB_SERVICE\nsocket.TIPC_TOP_SRV\nsocket.TIPC_WAIT_FOREVER\nsocket.TIPC_WITHDRAWN\nsocket.TIPC_ZONE_SCOPE\nsocket.create_connection(??)\nsocket.dup(integer) -> integer\nsocket.errno(??)\nsocket.error(??)\nsocket.fromfd(fd, family, type[, proto]) -> socket object\nsocket.gaierror(??)\nsocket.getaddrinfo(host, port [, family, socktype, proto, flags])\nsocket.getdefaulttimeout() -> timeout\nsocket.getfqdn(??)\nsocket.gethostbyaddr(host) -> (name, aliaslist, addresslist)\nsocket.gethostbyname(host) -> address\nsocket.gethostbyname_ex(host) -> (name, aliaslist, addresslist)\nsocket.gethostname() -> string\nsocket.getnameinfo(sockaddr, flags) --> (host, port)\nsocket.getprotobyname(name) -> integer\nsocket.getservbyname(servicename[, protocolname]) -> integer\nsocket.getservbyport(port[, protocolname]) -> string\nsocket.has_ipv6(??)\nsocket.herror(??)\nsocket.htonl(integer) -> integer\nsocket.htons(integer) -> integer\nsocket.inet_aton(string) -> bytes giving packed 32-bit IP representation\nsocket.inet_ntoa(packed_ip) -> ip_address_string\nsocket.inet_ntop(af, packed_ip) -> string formatted IP address\nsocket.inet_pton(af, ip) -> packed IP address string\nsocket.io(??)\nsocket.ntohl(integer) -> integer\nsocket.ntohs(integer) -> integer\nsocket.os(??)\nsocket.setdefaulttimeout(timeout)\nsocket.socket(??)\nsocket.socketpair([family[, type[, proto]]]) -> (socket object, socket object)\nsocket.sys(??)\nsocket.timeout(??)\nsocketserver.BaseRequestHandler(??)\nsocketserver.BaseServer(??)\nsocketserver.DatagramRequestHandler(??)\nsocketserver.ForkingMixIn(??)\nsocketserver.ForkingTCPServer(??)\nsocketserver.ForkingUDPServer(??)\nsocketserver.StreamRequestHandler(??)\nsocketserver.TCPServer(??)\nsocketserver.ThreadingMixIn(??)\nsocketserver.ThreadingTCPServer(??)\nsocketserver.ThreadingUDPServer(??)\nsocketserver.ThreadingUnixDatagramServer(??)\nsocketserver.ThreadingUnixStreamServer(??)\nsocketserver.UDPServer(??)\nsocketserver.UnixDatagramServer(??)\nsocketserver.UnixStreamServer(??)\nsocketserver.os(??)\nsocketserver.select(??)\nsocketserver.socket(??)\nsocketserver.sys(??)\nsocketserver.threading(??)\nsorted(iterable, key=None, reverse=False) --> new sorted list\nssl.AF_INET\nssl.CERT_NONE\nssl.CERT_OPTIONAL\nssl.CERT_REQUIRED\nssl.CertificateError(??)\nssl.DER_cert_to_PEM_cert(??)\nssl.HAS_SNI(??)\nssl.OPENSSL_VERSION\nssl.OPENSSL_VERSION_INFO(??)\nssl.OPENSSL_VERSION_NUMBER\nssl.OP_ALL\nssl.OP_NO_SSLv2\nssl.OP_NO_SSLv3\nssl.OP_NO_TLSv1\nssl.PEM_FOOTER\nssl.PEM_HEADER\nssl.PEM_cert_to_DER_cert(??)\nssl.PROTOCOL_SSLv2\nssl.PROTOCOL_SSLv23\nssl.PROTOCOL_SSLv3\nssl.PROTOCOL_TLSv1\nssl.RAND_add(string, entropy)\nssl.RAND_egd(path) -> bytes\nssl.RAND_status() -> 0 or 1\nssl.SOCK_STREAM\nssl.SSLContext(??)\nssl.SSLError(??)\nssl.SSLSocket(??)\nssl.SSL_ERROR_EOF\nssl.SSL_ERROR_INVALID_ERROR_CODE\nssl.SSL_ERROR_SSL\nssl.SSL_ERROR_SYSCALL\nssl.SSL_ERROR_WANT_CONNECT\nssl.SSL_ERROR_WANT_READ\nssl.SSL_ERROR_WANT_WRITE\nssl.SSL_ERROR_WANT_X509_LOOKUP\nssl.SSL_ERROR_ZERO_RETURN\nssl.base64(??)\nssl.cert_time_to_seconds(??)\nssl.errno(??)\nssl.get_protocol_name(??)\nssl.get_server_certificate(??)\nssl.match_hostname(??)\nssl.re(??)\nssl.socket(??)\nssl.socket_error(??)\nssl.textwrap(??)\nssl.traceback(??)\nssl.wrap_socket(??)\nstat.SF_APPEND\nstat.SF_ARCHIVED\nstat.SF_IMMUTABLE\nstat.SF_NOUNLINK\nstat.SF_SNAPSHOT\nstat.ST_ATIME\nstat.ST_CTIME\nstat.ST_DEV\nstat.ST_GID\nstat.ST_INO\nstat.ST_MODE\nstat.ST_MTIME\nstat.ST_NLINK\nstat.ST_SIZE\nstat.ST_UID\nstat.S_ENFMT\nstat.S_IEXEC\nstat.S_IFBLK\nstat.S_IFCHR\nstat.S_IFDIR\nstat.S_IFIFO\nstat.S_IFLNK\nstat.S_IFMT(??)\nstat.S_IFREG\nstat.S_IFSOCK\nstat.S_IMODE(??)\nstat.S_IREAD\nstat.S_IRGRP\nstat.S_IROTH\nstat.S_IRUSR\nstat.S_IRWXG\nstat.S_IRWXO\nstat.S_IRWXU\nstat.S_ISBLK(??)\nstat.S_ISCHR(??)\nstat.S_ISDIR(??)\nstat.S_ISFIFO(??)\nstat.S_ISGID\nstat.S_ISLNK(??)\nstat.S_ISREG(??)\nstat.S_ISSOCK(??)\nstat.S_ISUID\nstat.S_ISVTX\nstat.S_IWGRP\nstat.S_IWOTH\nstat.S_IWRITE\nstat.S_IWUSR\nstat.S_IXGRP\nstat.S_IXOTH\nstat.S_IXUSR\nstat.UF_APPEND\nstat.UF_IMMUTABLE\nstat.UF_NODUMP\nstat.UF_NOUNLINK\nstat.UF_OPAQUE\nstaticmethod(function) -> method\nstr(string[, encoding[, errors]]) -> str\nstring.Formatter(??)\nstring.Template(??)\nstring.ascii_letters\nstring.ascii_lowercase\nstring.ascii_uppercase\nstring.capwords(s [,sep]) -> string\nstring.digits\nstring.hexdigits\nstring.octdigits\nstring.printable\nstring.punctuation\nstring.whitespace\nstringprep.b1_set(??)\nstringprep.b3_exceptions(??)\nstringprep.c22_specials(??)\nstringprep.c6_set(??)\nstringprep.c7_set(??)\nstringprep.c8_set(??)\nstringprep.c9_set(??)\nstringprep.in_table_a1(??)\nstringprep.in_table_b1(??)\nstringprep.in_table_c11(??)\nstringprep.in_table_c11_c12(??)\nstringprep.in_table_c12(??)\nstringprep.in_table_c21(??)\nstringprep.in_table_c21_c22(??)\nstringprep.in_table_c22(??)\nstringprep.in_table_c3(??)\nstringprep.in_table_c4(??)\nstringprep.in_table_c5(??)\nstringprep.in_table_c6(??)\nstringprep.in_table_c7(??)\nstringprep.in_table_c8(??)\nstringprep.in_table_c9(??)\nstringprep.in_table_d1(??)\nstringprep.in_table_d2(??)\nstringprep.map_table_b2(??)\nstringprep.map_table_b3(??)\nstringprep.unicodedata(??)\nstruct.Struct(fmt) --> compiled struct object\nstruct.calcsize(fmt) -> integer\nstruct.error(??)\nstruct.pack(fmt, v1, v2, ...) -> bytes\nstruct.pack_into(fmt, buffer, offset, v1, v2, ...)\nstruct.unpack(fmt, buffer) -> (v1, v2, ...)\nstruct.unpack_from(fmt, buffer, offset=0) -> (v1, v2, ...)\nsubprocess.CalledProcessError(??)\nsubprocess.MAXFD\nsubprocess.PIPE\nsubprocess.Popen(??)\nsubprocess.STDOUT\nsubprocess.builtins(??)\nsubprocess.call(??)\nsubprocess.check_call(??)\nsubprocess.check_output(??)\nsubprocess.errno(??)\nsubprocess.fcntl(??)\nsubprocess.gc(??)\nsubprocess.getoutput(??)\nsubprocess.getstatusoutput(??)\nsubprocess.io(??)\nsubprocess.list2cmdline(??)\nsubprocess.mswindows(??)\nsubprocess.os(??)\nsubprocess.pickle(??)\nsubprocess.select(??)\nsubprocess.signal(??)\nsubprocess.sys(??)\nsubprocess.traceback(??)\nsubprocess.warnings(??)\nsum(iterable[, start]) -> value\nsunau.AUDIO_FILE_ENCODING_ADPCM_G721\nsunau.AUDIO_FILE_ENCODING_ADPCM_G722\nsunau.AUDIO_FILE_ENCODING_ADPCM_G723_3\nsunau.AUDIO_FILE_ENCODING_ADPCM_G723_5\nsunau.AUDIO_FILE_ENCODING_ALAW_8\nsunau.AUDIO_FILE_ENCODING_DOUBLE\nsunau.AUDIO_FILE_ENCODING_FLOAT\nsunau.AUDIO_FILE_ENCODING_LINEAR_16\nsunau.AUDIO_FILE_ENCODING_LINEAR_24\nsunau.AUDIO_FILE_ENCODING_LINEAR_32\nsunau.AUDIO_FILE_ENCODING_LINEAR_8\nsunau.AUDIO_FILE_ENCODING_MULAW_8\nsunau.AUDIO_FILE_MAGIC\nsunau.AUDIO_UNKNOWN_SIZE\nsunau.Au_read(??)\nsunau.Au_write(??)\nsunau.Error(??)\nsunau.open(??)\nsunau.openfp(??)\nsuper() -> same as super(__class__, <first argument>)\nsymbol.and_expr\nsymbol.and_test\nsymbol.arglist\nsymbol.argument\nsymbol.arith_expr\nsymbol.assert_stmt\nsymbol.atom\nsymbol.augassign\nsymbol.break_stmt\nsymbol.classdef\nsymbol.comp_for\nsymbol.comp_if\nsymbol.comp_iter\nsymbol.comp_op\nsymbol.comparison\nsymbol.compound_stmt\nsymbol.continue_stmt\nsymbol.decorated\nsymbol.decorator\nsymbol.decorators\nsymbol.del_stmt\nsymbol.dictorsetmaker\nsymbol.dotted_as_name\nsymbol.dotted_as_names\nsymbol.dotted_name\nsymbol.encoding_decl\nsymbol.eval_input\nsymbol.except_clause\nsymbol.expr\nsymbol.expr_stmt\nsymbol.exprlist\nsymbol.factor\nsymbol.file_input\nsymbol.flow_stmt\nsymbol.for_stmt\nsymbol.funcdef\nsymbol.global_stmt\nsymbol.if_stmt\nsymbol.import_as_name\nsymbol.import_as_names\nsymbol.import_from\nsymbol.import_name\nsymbol.import_stmt\nsymbol.lambdef\nsymbol.lambdef_nocond\nsymbol.main(??)\nsymbol.nonlocal_stmt\nsymbol.not_test\nsymbol.or_test\nsymbol.parameters\nsymbol.pass_stmt\nsymbol.power\nsymbol.raise_stmt\nsymbol.return_stmt\nsymbol.shift_expr\nsymbol.simple_stmt\nsymbol.single_input\nsymbol.sliceop\nsymbol.small_stmt\nsymbol.star_expr\nsymbol.stmt\nsymbol.subscript\nsymbol.subscriptlist\nsymbol.suite\nsymbol.sym_name(??)\nsymbol.term\nsymbol.test\nsymbol.test_nocond\nsymbol.testlist\nsymbol.testlist_comp\nsymbol.testlist_star_expr\nsymbol.tfpdef\nsymbol.trailer\nsymbol.try_stmt\nsymbol.typedargslist\nsymbol.varargslist\nsymbol.vfpdef\nsymbol.while_stmt\nsymbol.with_item\nsymbol.with_stmt\nsymbol.xor_expr\nsymbol.yield_expr\nsymbol.yield_stmt\nsymtable.CELL\nsymtable.Class(??)\nsymtable.DEF_BOUND\nsymtable.DEF_GLOBAL\nsymtable.DEF_IMPORT\nsymtable.DEF_LOCAL\nsymtable.DEF_PARAM\nsymtable.FREE\nsymtable.Function(??)\nsymtable.GLOBAL_EXPLICIT\nsymtable.GLOBAL_IMPLICIT\nsymtable.LOCAL\nsymtable.OPT_IMPORT_STAR\nsymtable.SCOPE_MASK\nsymtable.SCOPE_OFF\nsymtable.Symbol(??)\nsymtable.SymbolTable(??)\nsymtable.SymbolTableFactory(??)\nsymtable.USE\nsymtable.symtable(??)\nsymtable.weakref(??)\nsys.abiflags\nsys.api_version\nsys.argv(??)\nsys.builtin_module_names(??)\nsys.byteorder\nsys.call_tracing(func, args) -> object\nsys.callstats() -> tuple of integers\nsys.copyright\nsys.displayhook(object) -> None\nsys.dont_write_bytecode(??)\nsys.exc_info() -> (type, value, traceback)\nsys.excepthook(exctype, value, traceback) -> None\nsys.exec_prefix\nsys.executable\nsys.exit([status])\nsys.flags(??)\nsys.float_info(??)\nsys.float_repr_style\nsys.getcheckinterval() -> current check interval; see setcheckinterval().\nsys.getdefaultencoding() -> string\nsys.getdlopenflags() -> int\nsys.getfilesystemencoding() -> string\nsys.getprofile()\nsys.getrecursionlimit()\nsys.getrefcount(object) -> integer\nsys.getsizeof(object, default) -> int\nsys.getswitchinterval() -> current thread switch interval; see setswitchinterval().\nsys.gettrace()\nsys.hash_info(??)\nsys.hexversion\nsys.int_info(??)\nsys.intern(string) -> string\nsys.maxsize\nsys.maxunicode\nsys.meta_path(??)\nsys.modules(??)\nsys.path(??)\nsys.path_hooks(??)\nsys.path_importer_cache(??)\nsys.platform\nsys.prefix\nsys.setcheckinterval(n)\nsys.setdlopenflags(n) -> None\nsys.setprofile(function)\nsys.setrecursionlimit(n)\nsys.setswitchinterval(n)\nsys.settrace(function)\nsys.stderr(??)\nsys.stdin(??)\nsys.stdout(??)\nsys.subversion(??)\nsys.version\nsys.version_info(??)\nsys.warnoptions(??)\nsysconfig.get_config_h_filename(??)\nsysconfig.get_config_var(??)\nsysconfig.get_config_vars(??)\nsysconfig.get_makefile_filename(??)\nsysconfig.get_path(??)\nsysconfig.get_path_names(??)\nsysconfig.get_paths(??)\nsysconfig.get_platform(??)\nsysconfig.get_python_version(??)\nsysconfig.get_scheme_names(??)\nsysconfig.is_python_build(??)\nsysconfig.os(??)\nsysconfig.pardir\nsysconfig.parse_config_h(??)\nsysconfig.realpath(??)\nsysconfig.sys(??)\ntabnanny.NannyNag(??)\ntabnanny.Whitespace(??)\ntabnanny.check(file_or_dir)\ntabnanny.errprint(??)\ntabnanny.filename_only\ntabnanny.format_witnesses(??)\ntabnanny.getopt(??)\ntabnanny.main(??)\ntabnanny.os(??)\ntabnanny.process_tokens(??)\ntabnanny.sys(??)\ntabnanny.tokenize(??)\ntabnanny.verbose\ntarfile.AREGTYPE\ntarfile.BLKTYPE\ntarfile.BLOCKSIZE\ntarfile.CHRTYPE\ntarfile.CONTTYPE\ntarfile.CompressionError(??)\ntarfile.DEFAULT_FORMAT\ntarfile.DIRTYPE\ntarfile.ENCODING\ntarfile.EOFHeaderError(??)\ntarfile.EmptyHeaderError(??)\ntarfile.ExFileObject(??)\ntarfile.ExtractError(??)\ntarfile.FIFOTYPE\ntarfile.GNUTYPE_LONGLINK\ntarfile.GNUTYPE_LONGNAME\ntarfile.GNUTYPE_SPARSE\ntarfile.GNU_FORMAT\ntarfile.GNU_MAGIC\ntarfile.GNU_TYPES(??)\ntarfile.HeaderError(??)\ntarfile.InvalidHeaderError(??)\ntarfile.LENGTH_LINK\ntarfile.LENGTH_NAME\ntarfile.LENGTH_PREFIX\ntarfile.LNKTYPE\ntarfile.NUL\ntarfile.PAX_FIELDS(??)\ntarfile.PAX_FORMAT\ntarfile.PAX_NAME_FIELDS(??)\ntarfile.PAX_NUMBER_FIELDS(??)\ntarfile.POSIX_MAGIC\ntarfile.RECORDSIZE\ntarfile.REGTYPE\ntarfile.REGULAR_TYPES(??)\ntarfile.ReadError(??)\ntarfile.SOLARIS_XHDTYPE\ntarfile.SUPPORTED_TYPES(??)\ntarfile.SYMTYPE\ntarfile.S_IFBLK\ntarfile.S_IFCHR\ntarfile.S_IFDIR\ntarfile.S_IFIFO\ntarfile.S_IFLNK\ntarfile.S_IFREG\ntarfile.StreamError(??)\ntarfile.SubsequentHeaderError(??)\ntarfile.TGEXEC\ntarfile.TGREAD\ntarfile.TGWRITE\ntarfile.TOEXEC\ntarfile.TOREAD\ntarfile.TOWRITE\ntarfile.TSGID\ntarfile.TSUID\ntarfile.TSVTX\ntarfile.TUEXEC\ntarfile.TUREAD\ntarfile.TUWRITE\ntarfile.TarError(??)\ntarfile.TarFile(??)\ntarfile.TarInfo(??)\ntarfile.TarIter(??)\ntarfile.TruncatedHeaderError(??)\ntarfile.USTAR_FORMAT\ntarfile.XGLTYPE\ntarfile.XHDTYPE\ntarfile.bltn_open(??)\ntarfile.calc_chksums(??)\ntarfile.copy(??)\ntarfile.copyfileobj(??)\ntarfile.errno(??)\ntarfile.filemode(??)\ntarfile.filemode_table(??)\ntarfile.grp(??)\ntarfile.is_tarfile(??)\ntarfile.itn(??)\ntarfile.nti(??)\ntarfile.nts(??)\ntarfile.open(??)\ntarfile.os(??)\ntarfile.pwd(??)\ntarfile.re(??)\ntarfile.shutil(??)\ntarfile.stat(??)\ntarfile.stn(??)\ntarfile.struct(??)\ntarfile.symlink_exception(??)\ntarfile.sys(??)\ntarfile.time(??)\ntarfile.version\ntelnetlib.AO\ntelnetlib.AUTHENTICATION\ntelnetlib.AYT\ntelnetlib.BINARY\ntelnetlib.BM\ntelnetlib.BRK\ntelnetlib.CHARSET\ntelnetlib.COM_PORT_OPTION\ntelnetlib.DEBUGLEVEL\ntelnetlib.DET\ntelnetlib.DM\ntelnetlib.DO\ntelnetlib.DONT\ntelnetlib.EC\ntelnetlib.ECHO\ntelnetlib.EL\ntelnetlib.ENCRYPT\ntelnetlib.EOR\ntelnetlib.EXOPL\ntelnetlib.FORWARD_X\ntelnetlib.GA\ntelnetlib.IAC\ntelnetlib.IP\ntelnetlib.KERMIT\ntelnetlib.LFLOW\ntelnetlib.LINEMODE\ntelnetlib.LOGOUT\ntelnetlib.NAMS\ntelnetlib.NAOCRD\ntelnetlib.NAOFFD\ntelnetlib.NAOHTD\ntelnetlib.NAOHTS\ntelnetlib.NAOL\ntelnetlib.NAOLFD\ntelnetlib.NAOP\ntelnetlib.NAOVTD\ntelnetlib.NAOVTS\ntelnetlib.NAWS\ntelnetlib.NEW_ENVIRON\ntelnetlib.NOOPT\ntelnetlib.NOP\ntelnetlib.OLD_ENVIRON\ntelnetlib.OUTMRK\ntelnetlib.PRAGMA_HEARTBEAT\ntelnetlib.PRAGMA_LOGON\ntelnetlib.RCP\ntelnetlib.RCTE\ntelnetlib.RSP\ntelnetlib.SB\ntelnetlib.SE\ntelnetlib.SEND_URL\ntelnetlib.SGA\ntelnetlib.SNDLOC\ntelnetlib.SSPI_LOGON\ntelnetlib.STATUS\ntelnetlib.SUPDUP\ntelnetlib.SUPDUPOUTPUT\ntelnetlib.SUPPRESS_LOCAL_ECHO\ntelnetlib.TELNET_PORT\ntelnetlib.TLS\ntelnetlib.TM\ntelnetlib.TN3270E\ntelnetlib.TSPEED\ntelnetlib.TTYLOC\ntelnetlib.TTYPE\ntelnetlib.TUID\ntelnetlib.Telnet(??)\ntelnetlib.VT3270REGIME\ntelnetlib.WILL\ntelnetlib.WONT\ntelnetlib.X3PAD\ntelnetlib.XASCII\ntelnetlib.XAUTH\ntelnetlib.XDISPLOC\ntelnetlib.select(??)\ntelnetlib.socket(??)\ntelnetlib.sys(??)\ntelnetlib.test(??)\ntelnetlib.theNULL\ntempfile.NamedTemporaryFile(??)\ntempfile.SpooledTemporaryFile(??)\ntempfile.TMP_MAX\ntempfile.TemporaryDirectory(??)\ntempfile.TemporaryFile(??)\ntempfile.gettempdir(??)\ntempfile.gettempprefix(??)\ntempfile.mkdtemp(??)\ntempfile.mkstemp(??)\ntempfile.mktemp(??)\ntempfile.tempdir(??)\ntempfile.template\ntextwrap.TextWrapper(??)\ntextwrap.dedent(??)\ntextwrap.fill(??)\ntextwrap.re(??)\ntextwrap.string(??)\ntextwrap.wrap(??)\nthreading.Barrier(??)\nthreading.BoundedSemaphore(??)\nthreading.BrokenBarrierError(??)\nthreading.Condition(??)\nthreading.Event(??)\nthreading.Lock(??)\nthreading.RLock(??)\nthreading.Semaphore(??)\nthreading.TIMEOUT_MAX\nthreading.Thread(??)\nthreading.ThreadError(??)\nthreading.Timer(??)\nthreading.activeCount(??)\nthreading.active_count(??)\nthreading.currentThread(??)\nthreading.current_thread(??)\nthreading.deque(iterable[, maxlen]) --> deque object\nthreading.enumerate(??)\nthreading.local(??)\nthreading.setprofile(??)\nthreading.settrace(??)\nthreading.stack_size([size]) -> size\ntimeit.Timer(??)\ntimeit.default_number\ntimeit.default_repeat\ntimeit.default_timer(??)\ntimeit.dummy_src_name\ntimeit.gc(??)\ntimeit.itertools(??)\ntimeit.main(??)\ntimeit.reindent(??)\ntimeit.repeat(??)\ntimeit.sys(??)\ntimeit.template\ntimeit.time(??)\ntimeit.timeit(??)\ntoken.AMPER\ntoken.AMPEREQUAL\ntoken.AT\ntoken.CIRCUMFLEX\ntoken.CIRCUMFLEXEQUAL\ntoken.COLON\ntoken.COMMA\ntoken.DEDENT\ntoken.DOT\ntoken.DOUBLESLASH\ntoken.DOUBLESLASHEQUAL\ntoken.DOUBLESTAR\ntoken.DOUBLESTAREQUAL\ntoken.ELLIPSIS\ntoken.ENDMARKER\ntoken.EQEQUAL\ntoken.EQUAL\ntoken.ERRORTOKEN\ntoken.GREATER\ntoken.GREATEREQUAL\ntoken.INDENT\ntoken.ISEOF(??)\ntoken.ISNONTERMINAL(??)\ntoken.ISTERMINAL(??)\ntoken.LBRACE\ntoken.LEFTSHIFT\ntoken.LEFTSHIFTEQUAL\ntoken.LESS\ntoken.LESSEQUAL\ntoken.LPAR\ntoken.LSQB\ntoken.MINEQUAL\ntoken.MINUS\ntoken.NAME\ntoken.NEWLINE\ntoken.NOTEQUAL\ntoken.NT_OFFSET\ntoken.NUMBER\ntoken.N_TOKENS\ntoken.OP\ntoken.PERCENT\ntoken.PERCENTEQUAL\ntoken.PLUS\ntoken.PLUSEQUAL\ntoken.RARROW\ntoken.RBRACE\ntoken.RIGHTSHIFT\ntoken.RIGHTSHIFTEQUAL\ntoken.RPAR\ntoken.RSQB\ntoken.SEMI\ntoken.SLASH\ntoken.SLASHEQUAL\ntoken.STAR\ntoken.STAREQUAL\ntoken.STRING\ntoken.TILDE\ntoken.VBAR\ntoken.VBAREQUAL\ntoken.tok_name(??)\ntokenize.AMPER\ntokenize.AMPEREQUAL\ntokenize.AT\ntokenize.BOM_UTF8\ntokenize.Binnumber\ntokenize.Bracket\ntokenize.CIRCUMFLEX\ntokenize.CIRCUMFLEXEQUAL\ntokenize.COLON\ntokenize.COMMA\ntokenize.COMMENT\ntokenize.Comment\ntokenize.ContStr\ntokenize.DEDENT\ntokenize.DOT\ntokenize.DOUBLESLASH\ntokenize.DOUBLESLASHEQUAL\ntokenize.DOUBLESTAR\ntokenize.DOUBLESTAREQUAL\ntokenize.Decnumber\ntokenize.Double\ntokenize.Double3\ntokenize.ELLIPSIS\ntokenize.ENCODING\ntokenize.ENDMARKER\ntokenize.EQEQUAL\ntokenize.EQUAL\ntokenize.ERRORTOKEN\ntokenize.Expfloat\ntokenize.Exponent\ntokenize.Floatnumber\ntokenize.Funny\ntokenize.GREATER\ntokenize.GREATEREQUAL\ntokenize.Hexnumber\ntokenize.INDENT\ntokenize.ISEOF(??)\ntokenize.ISNONTERMINAL(??)\ntokenize.ISTERMINAL(??)\ntokenize.Ignore\ntokenize.Imagnumber\ntokenize.Intnumber\ntokenize.LBRACE\ntokenize.LEFTSHIFT\ntokenize.LEFTSHIFTEQUAL\ntokenize.LESS\ntokenize.LESSEQUAL\ntokenize.LPAR\ntokenize.LSQB\ntokenize.MINEQUAL\ntokenize.MINUS\ntokenize.NAME\ntokenize.NEWLINE\ntokenize.NL\ntokenize.NOTEQUAL\ntokenize.NT_OFFSET\ntokenize.NUMBER\ntokenize.N_TOKENS\ntokenize.Name\ntokenize.Number\ntokenize.OP\ntokenize.Octnumber\ntokenize.Operator\ntokenize.PERCENT\ntokenize.PERCENTEQUAL\ntokenize.PLUS\ntokenize.PLUSEQUAL\ntokenize.PlainToken\ntokenize.Pointfloat\ntokenize.PseudoExtras\ntokenize.PseudoToken\ntokenize.RARROW\ntokenize.RBRACE\ntokenize.RIGHTSHIFT\ntokenize.RIGHTSHIFTEQUAL\ntokenize.RPAR\ntokenize.RSQB\ntokenize.SEMI\ntokenize.SLASH\ntokenize.SLASHEQUAL\ntokenize.STAR\ntokenize.STAREQUAL\ntokenize.STRING\ntokenize.Single\ntokenize.Single3\ntokenize.Special\ntokenize.StopTokenizing(??)\ntokenize.String\ntokenize.TILDE\ntokenize.TextIOWrapper(??)\ntokenize.Token\ntokenize.TokenError(??)\ntokenize.TokenInfo(??)\ntokenize.Triple\ntokenize.Untokenizer(??)\ntokenize.VBAR\ntokenize.VBAREQUAL\ntokenize.Whitespace\ntokenize.any(??)\ntokenize.collections(??)\ntokenize.cookie_re(??)\ntokenize.detect_encoding(??)\ntokenize.double3prog(??)\ntokenize.endprogs(??)\ntokenize.generate_tokens(??)\ntokenize.group(??)\ntokenize.lookup(encoding) -> CodecInfo\ntokenize.maybe(??)\ntokenize.open(??)\ntokenize.pseudoprog(??)\ntokenize.re(??)\ntokenize.single3prog(??)\ntokenize.single_quoted(??)\ntokenize.sys(??)\ntokenize.t\ntokenize.tabsize\ntokenize.tok_name(??)\ntokenize.tokenize(??)\ntokenize.tokenprog(??)\ntokenize.triple_quoted(??)\ntokenize.untokenize(??)\ntrace.CoverageResults(??)\ntrace.Ignore(??)\ntrace.PRAGMA_NOCOVER\ntrace.Trace(??)\ntrace.dis(??)\ntrace.find_executable_linenos(??)\ntrace.find_lines(??)\ntrace.find_lines_from_code(??)\ntrace.find_strings(??)\ntrace.fullmodname(??)\ntrace.gc(??)\ntrace.inspect(??)\ntrace.io(??)\ntrace.linecache(??)\ntrace.main(??)\ntrace.modname(??)\ntrace.os(??)\ntrace.pickle(??)\ntrace.re(??)\ntrace.rx_blank(??)\ntrace.sys(??)\ntrace.threading(??)\ntrace.time(??)\ntrace.token(??)\ntrace.tokenize(??)\ntrace.usage(??)\ntraceback.extract_stack(??)\ntraceback.extract_tb(??)\ntraceback.format_exc(??)\ntraceback.format_exception(??)\ntraceback.format_exception_only(??)\ntraceback.format_list(??)\ntraceback.format_stack(??)\ntraceback.format_tb(??)\ntraceback.linecache(??)\ntraceback.print_exc(??)\ntraceback.print_exception(??)\ntraceback.print_last(??)\ntraceback.print_list(??)\ntraceback.print_stack(??)\ntraceback.print_tb(??)\ntraceback.sys(??)\ntty.B0\ntty.B1000000\ntty.B110\ntty.B115200\ntty.B1152000\ntty.B1200\ntty.B134\ntty.B150\ntty.B1500000\ntty.B1800\ntty.B19200\ntty.B200\ntty.B2000000\ntty.B230400\ntty.B2400\ntty.B2500000\ntty.B300\ntty.B3000000\ntty.B3500000\ntty.B38400\ntty.B4000000\ntty.B460800\ntty.B4800\ntty.B50\ntty.B500000\ntty.B57600\ntty.B576000\ntty.B600\ntty.B75\ntty.B921600\ntty.B9600\ntty.BRKINT\ntty.BS0\ntty.BS1\ntty.BSDLY\ntty.CBAUD\ntty.CBAUDEX\ntty.CC\ntty.CDSUSP\ntty.CEOF\ntty.CEOL\ntty.CEOT\ntty.CERASE\ntty.CFLAG\ntty.CFLUSH\ntty.CIBAUD\ntty.CINTR\ntty.CKILL\ntty.CLNEXT\ntty.CLOCAL\ntty.CQUIT\ntty.CR0\ntty.CR1\ntty.CR2\ntty.CR3\ntty.CRDLY\ntty.CREAD\ntty.CRPRNT\ntty.CRTSCTS\ntty.CS5\ntty.CS6\ntty.CS7\ntty.CS8\ntty.CSIZE\ntty.CSTART\ntty.CSTOP\ntty.CSTOPB\ntty.CSUSP\ntty.CWERASE\ntty.ECHO\ntty.ECHOCTL\ntty.ECHOE\ntty.ECHOK\ntty.ECHOKE\ntty.ECHONL\ntty.ECHOPRT\ntty.EXTA\ntty.EXTB\ntty.FF0\ntty.FF1\ntty.FFDLY\ntty.FIOASYNC\ntty.FIOCLEX\ntty.FIONBIO\ntty.FIONCLEX\ntty.FIONREAD\ntty.FLUSHO\ntty.HUPCL\ntty.ICANON\ntty.ICRNL\ntty.IEXTEN\ntty.IFLAG\ntty.IGNBRK\ntty.IGNCR\ntty.IGNPAR\ntty.IMAXBEL\ntty.INLCR\ntty.INPCK\ntty.IOCSIZE_MASK\ntty.IOCSIZE_SHIFT\ntty.ISIG\ntty.ISPEED\ntty.ISTRIP\ntty.IUCLC\ntty.IXANY\ntty.IXOFF\ntty.IXON\ntty.LFLAG\ntty.NCC\ntty.NCCS\ntty.NL0\ntty.NL1\ntty.NLDLY\ntty.NOFLSH\ntty.N_MOUSE\ntty.N_PPP\ntty.N_SLIP\ntty.N_STRIP\ntty.N_TTY\ntty.OCRNL\ntty.OFDEL\ntty.OFILL\ntty.OFLAG\ntty.OLCUC\ntty.ONLCR\ntty.ONLRET\ntty.ONOCR\ntty.OPOST\ntty.OSPEED\ntty.PARENB\ntty.PARMRK\ntty.PARODD\ntty.PENDIN\ntty.TAB0\ntty.TAB1\ntty.TAB2\ntty.TAB3\ntty.TABDLY\ntty.TCFLSH\ntty.TCGETA\ntty.TCGETS\ntty.TCIFLUSH\ntty.TCIOFF\ntty.TCIOFLUSH\ntty.TCION\ntty.TCOFLUSH\ntty.TCOOFF\ntty.TCOON\ntty.TCSADRAIN\ntty.TCSAFLUSH\ntty.TCSANOW\ntty.TCSBRK\ntty.TCSBRKP\ntty.TCSETA\ntty.TCSETAF\ntty.TCSETAW\ntty.TCSETS\ntty.TCSETSF\ntty.TCSETSW\ntty.TCXONC\ntty.TIOCCONS\ntty.TIOCEXCL\ntty.TIOCGETD\ntty.TIOCGICOUNT\ntty.TIOCGLCKTRMIOS\ntty.TIOCGPGRP\ntty.TIOCGSERIAL\ntty.TIOCGSOFTCAR\ntty.TIOCGWINSZ\ntty.TIOCINQ\ntty.TIOCLINUX\ntty.TIOCMBIC\ntty.TIOCMBIS\ntty.TIOCMGET\ntty.TIOCMIWAIT\ntty.TIOCMSET\ntty.TIOCM_CAR\ntty.TIOCM_CD\ntty.TIOCM_CTS\ntty.TIOCM_DSR\ntty.TIOCM_DTR\ntty.TIOCM_LE\ntty.TIOCM_RI\ntty.TIOCM_RNG\ntty.TIOCM_RTS\ntty.TIOCM_SR\ntty.TIOCM_ST\ntty.TIOCNOTTY\ntty.TIOCNXCL\ntty.TIOCOUTQ\ntty.TIOCPKT\ntty.TIOCPKT_DATA\ntty.TIOCPKT_DOSTOP\ntty.TIOCPKT_FLUSHREAD\ntty.TIOCPKT_FLUSHWRITE\ntty.TIOCPKT_NOSTOP\ntty.TIOCPKT_START\ntty.TIOCPKT_STOP\ntty.TIOCSCTTY\ntty.TIOCSERCONFIG\ntty.TIOCSERGETLSR\ntty.TIOCSERGETMULTI\ntty.TIOCSERGSTRUCT\ntty.TIOCSERGWILD\ntty.TIOCSERSETMULTI\ntty.TIOCSERSWILD\ntty.TIOCSER_TEMT\ntty.TIOCSETD\ntty.TIOCSLCKTRMIOS\ntty.TIOCSPGRP\ntty.TIOCSSERIAL\ntty.TIOCSSOFTCAR\ntty.TIOCSTI\ntty.TIOCSWINSZ\ntty.TOSTOP\ntty.VDISCARD\ntty.VEOF\ntty.VEOL\ntty.VEOL2\ntty.VERASE\ntty.VINTR\ntty.VKILL\ntty.VLNEXT\ntty.VMIN\ntty.VQUIT\ntty.VREPRINT\ntty.VSTART\ntty.VSTOP\ntty.VSUSP\ntty.VSWTC\ntty.VSWTCH\ntty.VT0\ntty.VT1\ntty.VTDLY\ntty.VTIME\ntty.VWERASE\ntty.XCASE\ntty.XTABS\ntty.error(??)\ntty.setcbreak(??)\ntty.setraw(??)\ntty.tcdrain(fd) -> None\ntty.tcflow(fd, action) -> None\ntty.tcflush(fd, queue) -> None\ntty.tcgetattr(fd) -> list_of_attrs\ntty.tcsendbreak(fd, duration) -> None\ntty.tcsetattr(fd, when, attributes) -> None\ntuple() -> empty tuple\ntype(object) -> the object's type\ntypes.BuiltinFunctionType(??)\ntypes.BuiltinMethodType(??)\ntypes.CodeType(??)\ntypes.FrameType(??)\ntypes.FunctionType(??)\ntypes.GeneratorType(??)\ntypes.GetSetDescriptorType(??)\ntypes.LambdaType(??)\ntypes.MemberDescriptorType(??)\ntypes.MethodType(??)\ntypes.ModuleType(??)\ntypes.TracebackType(??)\nurllib.error(??)\nurllib.error.ContentTooShortError(??)\nurllib.error.HTTPError(??)\nurllib.error.URLError(??)\nurllib.error.urllib(??)\nurllib.parse(??)\nurllib.parse.DefragResult(??)\nurllib.parse.DefragResultBytes(??)\nurllib.parse.MAX_CACHE_SIZE\nurllib.parse.ParseResult(??)\nurllib.parse.ParseResultBytes(??)\nurllib.parse.Quoter(??)\nurllib.parse.ResultBase(??)\nurllib.parse.SplitResult(??)\nurllib.parse.SplitResultBytes(??)\nurllib.parse.clear_cache(??)\nurllib.parse.collections(??)\nurllib.parse.namedtuple(??)\nurllib.parse.non_hierarchical(??)\nurllib.parse.parse_qs(??)\nurllib.parse.parse_qsl(??)\nurllib.parse.quote('abc def') -> 'abc%20def'\nurllib.parse.quote_from_bytes(??)\nurllib.parse.quote_plus(??)\nurllib.parse.scheme_chars\nurllib.parse.splitattr('/path;attr1=value1;attr2=value2;...') ->\nurllib.parse.splithost('//host[:port]/path') --> 'host[:port]', '/path'.\nurllib.parse.splitnport(??)\nurllib.parse.splitpasswd('user:passwd') -> 'user', 'passwd'.\nurllib.parse.splitport('host:port') --> 'host', 'port'.\nurllib.parse.splitquery('/path?query') --> '/path', 'query'.\nurllib.parse.splittag('/path#tag') --> '/path', 'tag'.\nurllib.parse.splittype('type:opaquestring') --> 'type', 'opaquestring'.\nurllib.parse.splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.\nurllib.parse.splitvalue('attr=value') --> 'attr', 'value'.\nurllib.parse.sys(??)\nurllib.parse.to_bytes(u\"URL\") --> 'URL'.\nurllib.parse.unquote(??)\nurllib.parse.unquote_plus(??)\nurllib.parse.unquote_to_bytes('abc%20def') -> b'abc def'.\nurllib.parse.unwrap('<URL:type://host/path>') --> 'type://host/path'.\nurllib.parse.urldefrag(??)\nurllib.parse.urlencode(??)\nurllib.parse.urljoin(??)\nurllib.parse.urlparse(??)\nurllib.parse.urlsplit(??)\nurllib.parse.urlunparse(??)\nurllib.parse.urlunsplit(??)\nurllib.parse.uses_fragment(??)\nurllib.parse.uses_netloc(??)\nurllib.parse.uses_params(??)\nurllib.parse.uses_query(??)\nurllib.parse.uses_relative(??)\nurllib.request(??)\nurllib.request.AbstractBasicAuthHandler(??)\nurllib.request.AbstractDigestAuthHandler(??)\nurllib.request.AbstractHTTPHandler(??)\nurllib.request.BaseHandler(??)\nurllib.request.CacheFTPHandler(??)\nurllib.request.ContentTooShortError(??)\nurllib.request.FTPHandler(??)\nurllib.request.FancyURLopener(??)\nurllib.request.FileHandler(??)\nurllib.request.HTTPBasicAuthHandler(??)\nurllib.request.HTTPCookieProcessor(??)\nurllib.request.HTTPDefaultErrorHandler(??)\nurllib.request.HTTPDigestAuthHandler(??)\nurllib.request.HTTPError(??)\nurllib.request.HTTPErrorProcessor(??)\nurllib.request.HTTPHandler(??)\nurllib.request.HTTPPasswordMgr(??)\nurllib.request.HTTPPasswordMgrWithDefaultRealm(??)\nurllib.request.HTTPRedirectHandler(??)\nurllib.request.HTTPSHandler(??)\nurllib.request.MAXFTPCACHE\nurllib.request.OpenerDirector(??)\nurllib.request.ProxyBasicAuthHandler(??)\nurllib.request.ProxyDigestAuthHandler(??)\nurllib.request.ProxyHandler(??)\nurllib.request.Request(??)\nurllib.request.URLError(??)\nurllib.request.URLopener(??)\nurllib.request.UnknownHandler(??)\nurllib.request.addclosehook(??)\nurllib.request.addinfourl(??)\nurllib.request.base64(??)\nurllib.request.bisect(??)\nurllib.request.build_opener(??)\nurllib.request.collections(??)\nurllib.request.email(??)\nurllib.request.ftpcache(??)\nurllib.request.ftperrors(??)\nurllib.request.ftpwrapper(??)\nurllib.request.getproxies(??)\nurllib.request.getproxies_environment(??)\nurllib.request.hashlib(??)\nurllib.request.http(??)\nurllib.request.install_opener(??)\nurllib.request.io(??)\nurllib.request.localhost(??)\nurllib.request.noheaders(??)\nurllib.request.os(??)\nurllib.request.parse_http_list(??)\nurllib.request.parse_keqv_list(??)\nurllib.request.pathname2url(??)\nurllib.request.posixpath(??)\nurllib.request.proxy_bypass(??)\nurllib.request.proxy_bypass_environment(??)\nurllib.request.quote('abc def') -> 'abc%20def'\nurllib.request.random(??)\nurllib.request.randombytes(??)\nurllib.request.re(??)\nurllib.request.request_host(??)\nurllib.request.socket(??)\nurllib.request.splitattr('/path;attr1=value1;attr2=value2;...') ->\nurllib.request.splithost('//host[:port]/path') --> 'host[:port]', '/path'.\nurllib.request.splitpasswd('user:passwd') -> 'user', 'passwd'.\nurllib.request.splitport('host:port') --> 'host', 'port'.\nurllib.request.splitquery('/path?query') --> '/path', 'query'.\nurllib.request.splittag('/path#tag') --> '/path', 'tag'.\nurllib.request.splittype('type:opaquestring') --> 'type', 'opaquestring'.\nurllib.request.splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.\nurllib.request.splitvalue('attr=value') --> 'attr', 'value'.\nurllib.request.ssl(??)\nurllib.request.sys(??)\nurllib.request.thishost(??)\nurllib.request.time(??)\nurllib.request.to_bytes(u\"URL\") --> 'URL'.\nurllib.request.unquote(??)\nurllib.request.unwrap('<URL:type://host/path>') --> 'type://host/path'.\nurllib.request.url2pathname(??)\nurllib.request.urlcleanup(??)\nurllib.request.urljoin(??)\nurllib.request.urlopen(??)\nurllib.request.urlparse(??)\nurllib.request.urlretrieve(??)\nurllib.request.urlsplit(??)\nurllib.request.urlunparse(??)\nurllib.response(??)\nurllib.response.addbase(??)\nurllib.response.addclosehook(??)\nurllib.response.addinfo(??)\nurllib.response.addinfourl(??)\nurllib.robotparser(??)\nurllib.robotparser.Entry(??)\nurllib.robotparser.RobotFileParser(??)\nurllib.robotparser.RuleLine(??)\nurllib.robotparser.urllib(??)\nuu.Error(??)\nuu.binascii(??)\nuu.decode(??)\nuu.encode(??)\nuu.os(??)\nuu.sys(??)\nuu.test(??)\nuuid.NAMESPACE_DNS(??)\nuuid.NAMESPACE_OID(??)\nuuid.NAMESPACE_URL(??)\nuuid.NAMESPACE_X500(??)\nuuid.RESERVED_FUTURE\nuuid.RESERVED_MICROSOFT\nuuid.RESERVED_NCS\nuuid.RFC_4122\nuuid.UUID(??)\nuuid.bytes_(??)\nuuid.ctypes(??)\nuuid.getnode(??)\nuuid.int_(??)\nuuid.lib(??)\nuuid.libname\nuuid.sys(??)\nuuid.uuid1(??)\nuuid.uuid3(??)\nuuid.uuid4(??)\nuuid.uuid5(??)\nvars([object]) -> dictionary\nwarnings.WarningMessage(??)\nwarnings.catch_warnings(??)\nwarnings.defaultaction\nwarnings.filters(??)\nwarnings.filterwarnings(??)\nwarnings.formatwarning(??)\nwarnings.linecache(??)\nwarnings.onceregistry(??)\nwarnings.resetwarnings(??)\nwarnings.showwarning(??)\nwarnings.simplefilter(??)\nwarnings.sys(??)\nwarnings.warn(??)\nwarnings.warn_explicit(??)\nwave.Chunk(??)\nwave.Error(??)\nwave.WAVE_FORMAT_PCM\nwave.Wave_read(??)\nwave.Wave_write(??)\nwave.big_endian\nwave.builtins(??)\nwave.open(??)\nwave.openfp(??)\nwave.struct(??)\nweakref.CallableProxyType(??)\nweakref.KeyedRef(??)\nweakref.ProxyType(??)\nweakref.ProxyTypes(??)\nweakref.ReferenceType(??)\nweakref.WeakKeyDictionary(??)\nweakref.WeakSet(??)\nweakref.WeakValueDictionary(??)\nweakref.collections(??)\nweakref.getweakrefcount(object) -- return the number of weak references\nweakref.getweakrefs(object) -- return a list of all weak reference objects\nweakref.proxy(object[, callback]) -- create a proxy object that weakly\nweakref.ref(??)\nwebbrowser.BackgroundBrowser(??)\nwebbrowser.BaseBrowser(??)\nwebbrowser.Elinks(??)\nwebbrowser.Error(??)\nwebbrowser.Galeon(??)\nwebbrowser.GenericBrowser(??)\nwebbrowser.Grail(??)\nwebbrowser.Konqueror(??)\nwebbrowser.Mozilla(??)\nwebbrowser.Netscape(??)\nwebbrowser.Opera(??)\nwebbrowser.UnixBrowser(??)\nwebbrowser.get(??)\nwebbrowser.io(??)\nwebbrowser.main(??)\nwebbrowser.open(??)\nwebbrowser.open_new(??)\nwebbrowser.open_new_tab(??)\nwebbrowser.os(??)\nwebbrowser.register(??)\nwebbrowser.register_X_browsers(??)\nwebbrowser.shlex(??)\nwebbrowser.stat(??)\nwebbrowser.subprocess(??)\nwebbrowser.sys(??)\nwebbrowser.time(??)\nwsgiref.handlers(??)\nwsgiref.handlers.BaseCGIHandler(??)\nwsgiref.handlers.BaseHandler(??)\nwsgiref.handlers.CGIHandler(??)\nwsgiref.handlers.FileWrapper(??)\nwsgiref.handlers.Headers(??)\nwsgiref.handlers.IISCGIHandler(??)\nwsgiref.handlers.SimpleHandler(??)\nwsgiref.handlers.format_date_time(??)\nwsgiref.handlers.guess_scheme(??)\nwsgiref.handlers.is_hop_by_hop(??)\nwsgiref.handlers.os(??)\nwsgiref.handlers.read_environ(??)\nwsgiref.handlers.sys(??)\nwsgiref.handlers.time(??)\nwsgiref.headers(??)\nwsgiref.headers.Headers(??)\nwsgiref.headers.re(??)\nwsgiref.headers.tspecials(??)\nwsgiref.simple_server(??)\nwsgiref.simple_server.BaseHTTPRequestHandler(??)\nwsgiref.simple_server.HTTPServer(??)\nwsgiref.simple_server.ServerHandler(??)\nwsgiref.simple_server.SimpleHandler(??)\nwsgiref.simple_server.WSGIRequestHandler(??)\nwsgiref.simple_server.WSGIServer(??)\nwsgiref.simple_server.demo_app(??)\nwsgiref.simple_server.make_server(??)\nwsgiref.simple_server.server_version\nwsgiref.simple_server.software_version\nwsgiref.simple_server.sys(??)\nwsgiref.simple_server.sys_version\nwsgiref.simple_server.urllib(??)\nwsgiref.util(??)\nwsgiref.util.FileWrapper(??)\nwsgiref.util.application_uri(??)\nwsgiref.util.guess_scheme(??)\nwsgiref.util.is_hop_by_hop(??)\nwsgiref.util.posixpath(??)\nwsgiref.util.request_uri(??)\nwsgiref.util.setup_testing_defaults(??)\nwsgiref.util.shift_path_info(??)\nwsgiref.validate(??)\nwsgiref.validate.ErrorWrapper(??)\nwsgiref.validate.InputWrapper(??)\nwsgiref.validate.IteratorWrapper(??)\nwsgiref.validate.PartialIteratorWrapper(??)\nwsgiref.validate.WSGIWarning(??)\nwsgiref.validate.WriteWrapper(??)\nwsgiref.validate.assert_(??)\nwsgiref.validate.bad_header_value_re(??)\nwsgiref.validate.check_content_type(??)\nwsgiref.validate.check_environ(??)\nwsgiref.validate.check_errors(??)\nwsgiref.validate.check_exc_info(??)\nwsgiref.validate.check_headers(??)\nwsgiref.validate.check_input(??)\nwsgiref.validate.check_iterator(??)\nwsgiref.validate.check_status(??)\nwsgiref.validate.check_string_type(??)\nwsgiref.validate.header_re(??)\nwsgiref.validate.re(??)\nwsgiref.validate.sys(??)\nwsgiref.validate.validator(??)\nwsgiref.validate.warnings(??)\nxdrlib.BytesIO([buffer]) -> object\nxdrlib.ConversionError(??)\nxdrlib.Error(??)\nxdrlib.Packer(??)\nxdrlib.Unpacker(??)\nxdrlib.struct(??)\nxml.dom(??)\nxml.dom.DOMException(??)\nxml.dom.DOMSTRING_SIZE_ERR\nxml.dom.DomstringSizeErr(??)\nxml.dom.EMPTY_NAMESPACE(??)\nxml.dom.EMPTY_PREFIX(??)\nxml.dom.HIERARCHY_REQUEST_ERR\nxml.dom.HierarchyRequestErr(??)\nxml.dom.INDEX_SIZE_ERR\nxml.dom.INUSE_ATTRIBUTE_ERR\nxml.dom.INVALID_ACCESS_ERR\nxml.dom.INVALID_CHARACTER_ERR\nxml.dom.INVALID_MODIFICATION_ERR\nxml.dom.INVALID_STATE_ERR\nxml.dom.IndexSizeErr(??)\nxml.dom.InuseAttributeErr(??)\nxml.dom.InvalidAccessErr(??)\nxml.dom.InvalidCharacterErr(??)\nxml.dom.InvalidModificationErr(??)\nxml.dom.InvalidStateErr(??)\nxml.dom.NAMESPACE_ERR\nxml.dom.NOT_FOUND_ERR\nxml.dom.NOT_SUPPORTED_ERR\nxml.dom.NO_DATA_ALLOWED_ERR\nxml.dom.NO_MODIFICATION_ALLOWED_ERR\nxml.dom.NamespaceErr(??)\nxml.dom.NoDataAllowedErr(??)\nxml.dom.NoModificationAllowedErr(??)\nxml.dom.Node(??)\nxml.dom.NodeFilter(??)\nxml.dom.NodeFilter.NodeFilter(??)\nxml.dom.NotFoundErr(??)\nxml.dom.NotSupportedErr(??)\nxml.dom.SYNTAX_ERR\nxml.dom.SyntaxErr(??)\nxml.dom.UserDataHandler(??)\nxml.dom.VALIDATION_ERR\nxml.dom.ValidationErr(??)\nxml.dom.WRONG_DOCUMENT_ERR\nxml.dom.WrongDocumentErr(??)\nxml.dom.XHTML_NAMESPACE\nxml.dom.XMLNS_NAMESPACE\nxml.dom.XML_NAMESPACE\nxml.dom.domreg(??)\nxml.dom.domreg.EmptyNodeList(??)\nxml.dom.domreg.NodeList(??)\nxml.dom.domreg.StringTypes(??)\nxml.dom.domreg.defproperty(??)\nxml.dom.domreg.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxml.dom.domreg.registerDOMImplementation(name, factory)\nxml.dom.domreg.registered(??)\nxml.dom.domreg.well_known_implementations(??)\nxml.dom.expatbuilder(??)\nxml.dom.expatbuilder.CDATA_SECTION_NODE\nxml.dom.expatbuilder.DOCUMENT_NODE\nxml.dom.expatbuilder.EMPTY_NAMESPACE(??)\nxml.dom.expatbuilder.EMPTY_PREFIX(??)\nxml.dom.expatbuilder.ElementInfo(??)\nxml.dom.expatbuilder.EmptyNodeList(??)\nxml.dom.expatbuilder.ExpatBuilder(??)\nxml.dom.expatbuilder.ExpatBuilderNS(??)\nxml.dom.expatbuilder.FILTER_ACCEPT\nxml.dom.expatbuilder.FILTER_INTERRUPT\nxml.dom.expatbuilder.FILTER_REJECT\nxml.dom.expatbuilder.FILTER_SKIP\nxml.dom.expatbuilder.FilterCrutch(??)\nxml.dom.expatbuilder.FilterVisibilityController(??)\nxml.dom.expatbuilder.FragmentBuilder(??)\nxml.dom.expatbuilder.FragmentBuilderNS(??)\nxml.dom.expatbuilder.InternalSubsetExtractor(??)\nxml.dom.expatbuilder.Namespaces(??)\nxml.dom.expatbuilder.Node(??)\nxml.dom.expatbuilder.NodeFilter(??)\nxml.dom.expatbuilder.NodeList(??)\nxml.dom.expatbuilder.ParseEscape(??)\nxml.dom.expatbuilder.Rejecter(??)\nxml.dom.expatbuilder.Skipper(??)\nxml.dom.expatbuilder.StringTypes(??)\nxml.dom.expatbuilder.TEXT_NODE\nxml.dom.expatbuilder.XMLNS_NAMESPACE\nxml.dom.expatbuilder.defproperty(??)\nxml.dom.expatbuilder.expat(??)\nxml.dom.expatbuilder.makeBuilder(??)\nxml.dom.expatbuilder.minidom(??)\nxml.dom.expatbuilder.parse(??)\nxml.dom.expatbuilder.parseFragment(??)\nxml.dom.expatbuilder.parseFragmentString(??)\nxml.dom.expatbuilder.parseString(??)\nxml.dom.expatbuilder.theDOMImplementation(??)\nxml.dom.expatbuilder.xmlbuilder(??)\nxml.dom.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxml.dom.minicompat(??)\nxml.dom.minicompat.EmptyNodeList(??)\nxml.dom.minicompat.NodeList(??)\nxml.dom.minicompat.StringTypes(??)\nxml.dom.minicompat.defproperty(??)\nxml.dom.minicompat.xml(??)\nxml.dom.minidom(??)\nxml.dom.minidom.Attr(??)\nxml.dom.minidom.AttributeList(??)\nxml.dom.minidom.CDATASection(??)\nxml.dom.minidom.CharacterData(??)\nxml.dom.minidom.Childless(??)\nxml.dom.minidom.Comment(??)\nxml.dom.minidom.DOMImplementation(??)\nxml.dom.minidom.DOMImplementationLS(??)\nxml.dom.minidom.Document(??)\nxml.dom.minidom.DocumentFragment(??)\nxml.dom.minidom.DocumentLS(??)\nxml.dom.minidom.DocumentType(??)\nxml.dom.minidom.EMPTY_NAMESPACE(??)\nxml.dom.minidom.EMPTY_PREFIX(??)\nxml.dom.minidom.Element(??)\nxml.dom.minidom.ElementInfo(??)\nxml.dom.minidom.EmptyNodeList(??)\nxml.dom.minidom.Entity(??)\nxml.dom.minidom.Identified(??)\nxml.dom.minidom.NamedNodeMap(??)\nxml.dom.minidom.Node(??)\nxml.dom.minidom.NodeList(??)\nxml.dom.minidom.Notation(??)\nxml.dom.minidom.ProcessingInstruction(??)\nxml.dom.minidom.ReadOnlySequentialNamedNodeMap(??)\nxml.dom.minidom.StringTypes(??)\nxml.dom.minidom.Text(??)\nxml.dom.minidom.TypeInfo(??)\nxml.dom.minidom.XMLNS_NAMESPACE\nxml.dom.minidom.codecs(??)\nxml.dom.minidom.defproperty(??)\nxml.dom.minidom.domreg(??)\nxml.dom.minidom.getDOMImplementation(??)\nxml.dom.minidom.io(??)\nxml.dom.minidom.parse(??)\nxml.dom.minidom.parseString(??)\nxml.dom.minidom.xml(??)\nxml.dom.pulldom(??)\nxml.dom.pulldom.CHARACTERS\nxml.dom.pulldom.COMMENT\nxml.dom.pulldom.DOMEventStream(??)\nxml.dom.pulldom.END_DOCUMENT\nxml.dom.pulldom.END_ELEMENT\nxml.dom.pulldom.ErrorHandler(??)\nxml.dom.pulldom.IGNORABLE_WHITESPACE\nxml.dom.pulldom.PROCESSING_INSTRUCTION\nxml.dom.pulldom.PullDOM(??)\nxml.dom.pulldom.SAX2DOM(??)\nxml.dom.pulldom.START_DOCUMENT\nxml.dom.pulldom.START_ELEMENT\nxml.dom.pulldom.default_bufsize\nxml.dom.pulldom.parse(??)\nxml.dom.pulldom.parseString(??)\nxml.dom.pulldom.types(??)\nxml.dom.pulldom.xml(??)\nxml.dom.registerDOMImplementation(name, factory)\nxml.dom.xmlbuilder(??)\nxml.dom.xmlbuilder.DOMBuilder(??)\nxml.dom.xmlbuilder.DOMBuilderFilter(??)\nxml.dom.xmlbuilder.DOMEntityResolver(??)\nxml.dom.xmlbuilder.DOMImplementationLS(??)\nxml.dom.xmlbuilder.DOMInputSource(??)\nxml.dom.xmlbuilder.DocumentLS(??)\nxml.dom.xmlbuilder.Options(??)\nxml.dom.xmlbuilder.copy(??)\nxml.dom.xmlbuilder.xml(??)\nxml.etree.ElementInclude(??)\nxml.etree.ElementInclude.ElementTree(??)\nxml.etree.ElementInclude.FatalIncludeError(??)\nxml.etree.ElementInclude.XINCLUDE\nxml.etree.ElementInclude.XINCLUDE_FALLBACK\nxml.etree.ElementInclude.XINCLUDE_INCLUDE\nxml.etree.ElementInclude.copy(??)\nxml.etree.ElementInclude.default_loader(??)\nxml.etree.ElementInclude.include(??)\nxml.etree.ElementPath(??)\nxml.etree.ElementPath.find(??)\nxml.etree.ElementPath.findall(??)\nxml.etree.ElementPath.findtext(??)\nxml.etree.ElementPath.get_parent_map(??)\nxml.etree.ElementPath.iterfind(??)\nxml.etree.ElementPath.ops(??)\nxml.etree.ElementPath.prepare_child(??)\nxml.etree.ElementPath.prepare_descendant(??)\nxml.etree.ElementPath.prepare_parent(??)\nxml.etree.ElementPath.prepare_predicate(??)\nxml.etree.ElementPath.prepare_self(??)\nxml.etree.ElementPath.prepare_star(??)\nxml.etree.ElementPath.re(??)\nxml.etree.ElementPath.xpath_tokenizer(??)\nxml.etree.ElementPath.xpath_tokenizer_re(??)\nxml.etree.ElementTree(??)\nxml.etree.ElementTree.Comment(??)\nxml.etree.ElementTree.Element(??)\nxml.etree.ElementTree.ElementPath(??)\nxml.etree.ElementTree.ElementTree(??)\nxml.etree.ElementTree.HTML_EMPTY(??)\nxml.etree.ElementTree.PI(??)\nxml.etree.ElementTree.ParseError(??)\nxml.etree.ElementTree.ProcessingInstruction(??)\nxml.etree.ElementTree.QName(??)\nxml.etree.ElementTree.SubElement(??)\nxml.etree.ElementTree.TreeBuilder(??)\nxml.etree.ElementTree.VERSION\nxml.etree.ElementTree.XML(??)\nxml.etree.ElementTree.XMLID(??)\nxml.etree.ElementTree.XMLParser(??)\nxml.etree.ElementTree.XMLTreeBuilder(??)\nxml.etree.ElementTree.dump(??)\nxml.etree.ElementTree.fromstring(??)\nxml.etree.ElementTree.fromstringlist(??)\nxml.etree.ElementTree.iselement(??)\nxml.etree.ElementTree.iterparse(??)\nxml.etree.ElementTree.parse(??)\nxml.etree.ElementTree.re(??)\nxml.etree.ElementTree.register_namespace(??)\nxml.etree.ElementTree.sys(??)\nxml.etree.ElementTree.tostring(??)\nxml.etree.ElementTree.tostringlist(??)\nxml.etree.ElementTree.warnings(??)\nxml.etree.cElementTree(??)\nxml.etree.cElementTree.Comment(??)\nxml.etree.cElementTree.Element(??)\nxml.etree.cElementTree.ElementPath(??)\nxml.etree.cElementTree.ElementTree(??)\nxml.etree.cElementTree.PI(??)\nxml.etree.cElementTree.ParseError(??)\nxml.etree.cElementTree.ProcessingInstruction(??)\nxml.etree.cElementTree.QName(??)\nxml.etree.cElementTree.SubElement(??)\nxml.etree.cElementTree.TreeBuilder(??)\nxml.etree.cElementTree.VERSION\nxml.etree.cElementTree.XML(??)\nxml.etree.cElementTree.XMLID(??)\nxml.etree.cElementTree.XMLParser(??)\nxml.etree.cElementTree.XMLTreeBuilder(??)\nxml.etree.cElementTree.dump(??)\nxml.etree.cElementTree.fromstring(??)\nxml.etree.cElementTree.fromstringlist(??)\nxml.etree.cElementTree.iselement(??)\nxml.etree.cElementTree.iterparse(??)\nxml.etree.cElementTree.parse(??)\nxml.etree.cElementTree.register_namespace(??)\nxml.etree.cElementTree.tostring(??)\nxml.etree.cElementTree.tostringlist(??)\nxml.parsers(??)\nxml.parsers.expat(??)\nxml.parsers.expat.EXPAT_VERSION\nxml.parsers.expat.ErrorString(errno) -> string\nxml.parsers.expat.ExpatError(??)\nxml.parsers.expat.ParserCreate([encoding[, namespace_separator]]) -> parser\nxml.parsers.expat.XMLParserType(??)\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_ALWAYS\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_NEVER\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE\nxml.parsers.expat.error(??)\nxml.parsers.expat.errors(??)\nxml.parsers.expat.expat_CAPI(??)\nxml.parsers.expat.features(??)\nxml.parsers.expat.model(??)\nxml.parsers.expat.native_encoding\nxml.parsers.expat.sys(??)\nxml.parsers.expat.version_info(??)\nxml.sax(??)\nxml.sax.ContentHandler(??)\nxml.sax.ErrorHandler(??)\nxml.sax.InputSource(??)\nxml.sax.SAXException(??)\nxml.sax.SAXNotRecognizedException(??)\nxml.sax.SAXNotSupportedException(??)\nxml.sax.SAXParseException(??)\nxml.sax.SAXReaderNotAvailable(??)\nxml.sax.default_parser_list(??)\nxml.sax.expatreader(??)\nxml.sax.expatreader.AttributesImpl(??)\nxml.sax.expatreader.AttributesNSImpl(??)\nxml.sax.expatreader.ExpatLocator(??)\nxml.sax.expatreader.ExpatParser(??)\nxml.sax.expatreader.SAXException(??)\nxml.sax.expatreader.SAXNotRecognizedException(??)\nxml.sax.expatreader.SAXNotSupportedException(??)\nxml.sax.expatreader.SAXParseException(??)\nxml.sax.expatreader.SAXReaderNotAvailable(??)\nxml.sax.expatreader.create_parser(??)\nxml.sax.expatreader.expat(??)\nxml.sax.expatreader.feature_external_ges\nxml.sax.expatreader.feature_external_pes\nxml.sax.expatreader.feature_namespace_prefixes\nxml.sax.expatreader.feature_namespaces\nxml.sax.expatreader.feature_string_interning\nxml.sax.expatreader.feature_validation\nxml.sax.expatreader.handler(??)\nxml.sax.expatreader.property_interning_dict\nxml.sax.expatreader.property_xml_string\nxml.sax.expatreader.saxutils(??)\nxml.sax.expatreader.version\nxml.sax.expatreader.xmlreader(??)\nxml.sax.handler(??)\nxml.sax.handler.ContentHandler(??)\nxml.sax.handler.DTDHandler(??)\nxml.sax.handler.EntityResolver(??)\nxml.sax.handler.ErrorHandler(??)\nxml.sax.handler.all_features(??)\nxml.sax.handler.all_properties(??)\nxml.sax.handler.feature_external_ges\nxml.sax.handler.feature_external_pes\nxml.sax.handler.feature_namespace_prefixes\nxml.sax.handler.feature_namespaces\nxml.sax.handler.feature_string_interning\nxml.sax.handler.feature_validation\nxml.sax.handler.property_declaration_handler\nxml.sax.handler.property_dom_node\nxml.sax.handler.property_encoding\nxml.sax.handler.property_interning_dict\nxml.sax.handler.property_lexical_handler\nxml.sax.handler.property_xml_string\nxml.sax.handler.version\nxml.sax.make_parser(??)\nxml.sax.parse(??)\nxml.sax.parseString(??)\nxml.sax.saxutils(??)\nxml.sax.saxutils.XMLFilterBase(??)\nxml.sax.saxutils.XMLGenerator(??)\nxml.sax.saxutils.escape(??)\nxml.sax.saxutils.handler(??)\nxml.sax.saxutils.os(??)\nxml.sax.saxutils.prepare_input_source(??)\nxml.sax.saxutils.quoteattr(??)\nxml.sax.saxutils.unescape(??)\nxml.sax.saxutils.urllib(??)\nxml.sax.saxutils.xmlreader(??)\nxml.sax.xmlreader(??)\nxml.sax.xmlreader.AttributesImpl(??)\nxml.sax.xmlreader.AttributesNSImpl(??)\nxml.sax.xmlreader.IncrementalParser(??)\nxml.sax.xmlreader.InputSource(??)\nxml.sax.xmlreader.Locator(??)\nxml.sax.xmlreader.SAXNotRecognizedException(??)\nxml.sax.xmlreader.SAXNotSupportedException(??)\nxml.sax.xmlreader.XMLReader(??)\nxml.sax.xmlreader.handler(??)\nxmlrpc.client(??)\nxmlrpc.client.APPLICATION_ERROR\nxmlrpc.client.Binary(??)\nxmlrpc.client.Boolean(??)\nxmlrpc.client.BytesIO([buffer]) -> object\nxmlrpc.client.DateTime(??)\nxmlrpc.client.Error(??)\nxmlrpc.client.ExpatParser(??)\nxmlrpc.client.FastMarshaller(??)\nxmlrpc.client.FastParser(??)\nxmlrpc.client.FastUnmarshaller(??)\nxmlrpc.client.Fault(??)\nxmlrpc.client.GzipDecodedResponse(??)\nxmlrpc.client.INTERNAL_ERROR\nxmlrpc.client.INVALID_ENCODING_CHAR\nxmlrpc.client.INVALID_METHOD_PARAMS\nxmlrpc.client.INVALID_XMLRPC\nxmlrpc.client.MAXINT\nxmlrpc.client.METHOD_NOT_FOUND\nxmlrpc.client.MININT\nxmlrpc.client.Marshaller(??)\nxmlrpc.client.MultiCall(??)\nxmlrpc.client.MultiCallIterator(??)\nxmlrpc.client.NOT_WELLFORMED_ERROR\nxmlrpc.client.PARSE_ERROR\nxmlrpc.client.ProtocolError(??)\nxmlrpc.client.ResponseError(??)\nxmlrpc.client.SERVER_ERROR\nxmlrpc.client.SYSTEM_ERROR\nxmlrpc.client.SafeTransport(??)\nxmlrpc.client.Server(??)\nxmlrpc.client.ServerProxy(??)\nxmlrpc.client.TRANSPORT_ERROR\nxmlrpc.client.Transport(??)\nxmlrpc.client.UNSUPPORTED_ENCODING\nxmlrpc.client.Unmarshaller(??)\nxmlrpc.client.WRAPPERS(??)\nxmlrpc.client.base64(??)\nxmlrpc.client.boolean(??)\nxmlrpc.client.datetime(??)\nxmlrpc.client.dumps(??)\nxmlrpc.client.errno(??)\nxmlrpc.client.escape(??)\nxmlrpc.client.expat(??)\nxmlrpc.client.getparser() -> parser, unmarshaller\nxmlrpc.client.gzip(??)\nxmlrpc.client.gzip_decode(??)\nxmlrpc.client.gzip_encode(??)\nxmlrpc.client.http(??)\nxmlrpc.client.io(??)\nxmlrpc.client.loads(??)\nxmlrpc.client.operator(??)\nxmlrpc.client.re(??)\nxmlrpc.client.socket(??)\nxmlrpc.client.time(??)\nxmlrpc.server(??)\nxmlrpc.server.BaseHTTPRequestHandler(??)\nxmlrpc.server.CGIXMLRPCRequestHandler(??)\nxmlrpc.server.DocCGIXMLRPCRequestHandler(??)\nxmlrpc.server.DocXMLRPCRequestHandler(??)\nxmlrpc.server.DocXMLRPCServer(??)\nxmlrpc.server.Fault(??)\nxmlrpc.server.MultiPathXMLRPCServer(??)\nxmlrpc.server.ServerHTMLDoc(??)\nxmlrpc.server.SimpleXMLRPCDispatcher(??)\nxmlrpc.server.SimpleXMLRPCRequestHandler(??)\nxmlrpc.server.SimpleXMLRPCServer(??)\nxmlrpc.server.XMLRPCDocGenerator(??)\nxmlrpc.server.dumps(??)\nxmlrpc.server.fcntl(??)\nxmlrpc.server.gzip_decode(??)\nxmlrpc.server.gzip_encode(??)\nxmlrpc.server.http(??)\nxmlrpc.server.inspect(??)\nxmlrpc.server.list_public_methods(??)\nxmlrpc.server.loads(??)\nxmlrpc.server.os(??)\nxmlrpc.server.pydoc(??)\nxmlrpc.server.re(??)\nxmlrpc.server.resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d\nxmlrpc.server.socketserver(??)\nxmlrpc.server.sys(??)\nxmlrpc.server.traceback(??)\nzip(iter1 [,iter2 [...]]) --> zip object\nzipfile.BadZipFile(??)\nzipfile.BadZipfile(??)\nzipfile.LargeZipFile(??)\nzipfile.PyZipFile(??)\nzipfile.ZIP64_LIMIT\nzipfile.ZIP_DEFLATED\nzipfile.ZIP_FILECOUNT_LIMIT\nzipfile.ZIP_MAX_COMMENT\nzipfile.ZIP_STORED\nzipfile.ZipExtFile(??)\nzipfile.ZipFile(??)\nzipfile.ZipInfo(??)\nzipfile.binascii(??)\nzipfile.crc32(string[, start]) -- Compute a CRC-32 checksum of string.\nzipfile.error(??)\nzipfile.imp(??)\nzipfile.io(??)\nzipfile.is_zipfile(??)\nzipfile.main(??)\nzipfile.os(??)\nzipfile.re(??)\nzipfile.shutil(??)\nzipfile.sizeCentralDir\nzipfile.sizeEndCentDir\nzipfile.sizeEndCentDir64\nzipfile.sizeEndCentDir64Locator\nzipfile.sizeFileHeader\nzipfile.stat(??)\nzipfile.stringCentralDir\nzipfile.stringEndArchive\nzipfile.stringEndArchive64\nzipfile.stringEndArchive64Locator\nzipfile.stringFileHeader\nzipfile.struct(??)\nzipfile.structCentralDir\nzipfile.structEndArchive\nzipfile.structEndArchive64\nzipfile.structEndArchive64Locator\nzipfile.structFileHeader\nzipfile.sys(??)\nzipfile.time(??)\nzipfile.zlib(??)\nzipimport.ZipImportError(??)\nzipimport.zipimporter(archivepath) -> zipimporter object\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/qsci/api/python/Python-3.3.api",
    "content": "ArithmeticError(??)\nAssertionError(??)\nAttributeError(??)\nBaseException(??)\nBlockingIOError(??)\nBrokenPipeError(??)\nBufferError(??)\nBytesWarning(??)\nChildProcessError(??)\nConnectionAbortedError(??)\nConnectionError(??)\nConnectionRefusedError(??)\nConnectionResetError(??)\nDeprecationWarning(??)\nEOFError(??)\nEllipsis(??)\nEnvironmentError(??)\nException(??)\nFalse(??)\nFileExistsError(??)\nFileNotFoundError(??)\nFloatingPointError(??)\nFutureWarning(??)\nGeneratorExit(??)\nIN.AF_APPLETALK\nIN.AF_ATM\nIN.AF_CCITT\nIN.AF_CHAOS\nIN.AF_CNT\nIN.AF_COIP\nIN.AF_DATAKIT\nIN.AF_DECnet\nIN.AF_DLI\nIN.AF_E164\nIN.AF_ECMA\nIN.AF_HYLINK\nIN.AF_IMPLINK\nIN.AF_INET\nIN.AF_INET6\nIN.AF_IPX\nIN.AF_ISDN\nIN.AF_ISO\nIN.AF_LAT\nIN.AF_LINK\nIN.AF_LOCAL\nIN.AF_MAX\nIN.AF_NATM\nIN.AF_NDRV\nIN.AF_NETBIOS\nIN.AF_NETGRAPH\nIN.AF_NS\nIN.AF_OSI\nIN.AF_PPP\nIN.AF_PUP\nIN.AF_RESERVED_36\nIN.AF_ROUTE\nIN.AF_SIP\nIN.AF_SNA\nIN.AF_SYSTEM\nIN.AF_UNIX\nIN.AF_UNSPEC\nIN.CMGROUP_MAX\nIN.HTONL(??)\nIN.HTONS(??)\nIN.ICMP6_FILTER\nIN.IN6_IS_ADDR_LINKLOCAL(??)\nIN.IN6_IS_ADDR_LOOPBACK(??)\nIN.IN6_IS_ADDR_MC_GLOBAL(??)\nIN.IN6_IS_ADDR_MC_LINKLOCAL(??)\nIN.IN6_IS_ADDR_MC_NODELOCAL(??)\nIN.IN6_IS_ADDR_MC_ORGLOCAL(??)\nIN.IN6_IS_ADDR_MC_SITELOCAL(??)\nIN.IN6_IS_ADDR_SITELOCAL(??)\nIN.IN6_IS_ADDR_UNSPECIFIED(??)\nIN.IN6_IS_ADDR_V4COMPAT(??)\nIN.IN6_IS_ADDR_V4MAPPED(??)\nIN.INADDR_NONE\nIN.INET6_ADDRSTRLEN\nIN.INET_ADDRSTRLEN\nIN.INT16_C(??)\nIN.INT16_MAX\nIN.INT16_MIN\nIN.INT32_C(??)\nIN.INT32_MAX\nIN.INT32_MIN\nIN.INT8_C(??)\nIN.INT8_MAX\nIN.INT8_MIN\nIN.INTPTR_MAX\nIN.INTPTR_MIN\nIN.INT_FAST16_MAX\nIN.INT_FAST16_MIN\nIN.INT_FAST32_MAX\nIN.INT_FAST32_MIN\nIN.INT_FAST8_MAX\nIN.INT_FAST8_MIN\nIN.INT_LEAST16_MAX\nIN.INT_LEAST16_MIN\nIN.INT_LEAST32_MAX\nIN.INT_LEAST32_MIN\nIN.INT_LEAST8_MAX\nIN.INT_LEAST8_MIN\nIN.IN_BADCLASS(??)\nIN.IN_CLASSA(??)\nIN.IN_CLASSA_HOST\nIN.IN_CLASSA_MAX\nIN.IN_CLASSA_NET\nIN.IN_CLASSA_NSHIFT\nIN.IN_CLASSB(??)\nIN.IN_CLASSB_HOST\nIN.IN_CLASSB_MAX\nIN.IN_CLASSB_NET\nIN.IN_CLASSB_NSHIFT\nIN.IN_CLASSC(??)\nIN.IN_CLASSC_HOST\nIN.IN_CLASSC_NET\nIN.IN_CLASSC_NSHIFT\nIN.IN_CLASSD(??)\nIN.IN_CLASSD_HOST\nIN.IN_CLASSD_NET\nIN.IN_CLASSD_NSHIFT\nIN.IN_EXPERIMENTAL(??)\nIN.IN_LINKLOCAL(??)\nIN.IN_LOOPBACKNET\nIN.IN_MULTICAST(??)\nIN.IPCTL_ACCEPTSOURCEROUTE\nIN.IPCTL_DEFMTU\nIN.IPCTL_DEFTTL\nIN.IPCTL_DIRECTEDBROADCAST\nIN.IPCTL_FASTFORWARDING\nIN.IPCTL_FORWARDING\nIN.IPCTL_GIF_TTL\nIN.IPCTL_INTRQDROPS\nIN.IPCTL_INTRQMAXLEN\nIN.IPCTL_KEEPFAITH\nIN.IPCTL_MAXID\nIN.IPCTL_RTEXPIRE\nIN.IPCTL_RTMAXCACHE\nIN.IPCTL_RTMINEXPIRE\nIN.IPCTL_SENDREDIRECTS\nIN.IPCTL_SOURCEROUTE\nIN.IPCTL_STATS\nIN.IPPORT_HIFIRSTAUTO\nIN.IPPORT_HILASTAUTO\nIN.IPPORT_RESERVED\nIN.IPPORT_RESERVEDSTART\nIN.IPPORT_USERRESERVED\nIN.IPPROTO_3PC\nIN.IPPROTO_ADFS\nIN.IPPROTO_AH\nIN.IPPROTO_AHIP\nIN.IPPROTO_APES\nIN.IPPROTO_ARGUS\nIN.IPPROTO_AX25\nIN.IPPROTO_BHA\nIN.IPPROTO_BLT\nIN.IPPROTO_BRSATMON\nIN.IPPROTO_CFTP\nIN.IPPROTO_CHAOS\nIN.IPPROTO_CMTP\nIN.IPPROTO_CPHB\nIN.IPPROTO_CPNX\nIN.IPPROTO_DDP\nIN.IPPROTO_DGP\nIN.IPPROTO_DIVERT\nIN.IPPROTO_DONE\nIN.IPPROTO_DSTOPTS\nIN.IPPROTO_EGP\nIN.IPPROTO_EMCON\nIN.IPPROTO_ENCAP\nIN.IPPROTO_EON\nIN.IPPROTO_ESP\nIN.IPPROTO_ETHERIP\nIN.IPPROTO_FRAGMENT\nIN.IPPROTO_GGP\nIN.IPPROTO_GMTP\nIN.IPPROTO_GRE\nIN.IPPROTO_HELLO\nIN.IPPROTO_HMP\nIN.IPPROTO_HOPOPTS\nIN.IPPROTO_ICMP\nIN.IPPROTO_ICMPV6\nIN.IPPROTO_IDP\nIN.IPPROTO_IDPR\nIN.IPPROTO_IDRP\nIN.IPPROTO_IGMP\nIN.IPPROTO_IGP\nIN.IPPROTO_IGRP\nIN.IPPROTO_IL\nIN.IPPROTO_INLSP\nIN.IPPROTO_INP\nIN.IPPROTO_IP\nIN.IPPROTO_IPCOMP\nIN.IPPROTO_IPCV\nIN.IPPROTO_IPEIP\nIN.IPPROTO_IPIP\nIN.IPPROTO_IPPC\nIN.IPPROTO_IPV4\nIN.IPPROTO_IPV6\nIN.IPPROTO_IRTP\nIN.IPPROTO_KRYPTOLAN\nIN.IPPROTO_LARP\nIN.IPPROTO_LEAF1\nIN.IPPROTO_LEAF2\nIN.IPPROTO_MAX\nIN.IPPROTO_MAXID\nIN.IPPROTO_MEAS\nIN.IPPROTO_MHRP\nIN.IPPROTO_MICP\nIN.IPPROTO_MTP\nIN.IPPROTO_MUX\nIN.IPPROTO_ND\nIN.IPPROTO_NHRP\nIN.IPPROTO_NONE\nIN.IPPROTO_NSP\nIN.IPPROTO_NVPII\nIN.IPPROTO_OSPFIGP\nIN.IPPROTO_PGM\nIN.IPPROTO_PIGP\nIN.IPPROTO_PIM\nIN.IPPROTO_PRM\nIN.IPPROTO_PUP\nIN.IPPROTO_PVP\nIN.IPPROTO_RAW\nIN.IPPROTO_RCCMON\nIN.IPPROTO_RDP\nIN.IPPROTO_ROUTING\nIN.IPPROTO_RSVP\nIN.IPPROTO_RVD\nIN.IPPROTO_SATEXPAK\nIN.IPPROTO_SATMON\nIN.IPPROTO_SCCSP\nIN.IPPROTO_SDRP\nIN.IPPROTO_SEP\nIN.IPPROTO_SRPC\nIN.IPPROTO_ST\nIN.IPPROTO_SVMTP\nIN.IPPROTO_SWIPE\nIN.IPPROTO_TCF\nIN.IPPROTO_TCP\nIN.IPPROTO_TP\nIN.IPPROTO_TPXX\nIN.IPPROTO_TRUNK1\nIN.IPPROTO_TRUNK2\nIN.IPPROTO_TTP\nIN.IPPROTO_UDP\nIN.IPPROTO_VINES\nIN.IPPROTO_VISA\nIN.IPPROTO_VMTP\nIN.IPPROTO_WBEXPAK\nIN.IPPROTO_WBMON\nIN.IPPROTO_WSN\nIN.IPPROTO_XNET\nIN.IPPROTO_XTP\nIN.IPV6CTL_ACCEPT_RTADV\nIN.IPV6CTL_AUTO_FLOWLABEL\nIN.IPV6CTL_AUTO_LINKLOCAL\nIN.IPV6CTL_DAD_COUNT\nIN.IPV6CTL_DEFHLIM\nIN.IPV6CTL_DEFMCASTHLIM\nIN.IPV6CTL_DEFMTU\nIN.IPV6CTL_FORWARDING\nIN.IPV6CTL_FORWSRCRT\nIN.IPV6CTL_GIF_HLIM\nIN.IPV6CTL_HDRNESTLIMIT\nIN.IPV6CTL_KAME_VERSION\nIN.IPV6CTL_KEEPFAITH\nIN.IPV6CTL_LOG_INTERVAL\nIN.IPV6CTL_MAPPED_ADDR\nIN.IPV6CTL_MAXFRAGPACKETS\nIN.IPV6CTL_MAXFRAGS\nIN.IPV6CTL_MAXID\nIN.IPV6CTL_MRTPROTO\nIN.IPV6CTL_MRTSTATS\nIN.IPV6CTL_RIP6STATS\nIN.IPV6CTL_RR_PRUNE\nIN.IPV6CTL_RTEXPIRE\nIN.IPV6CTL_RTMAXCACHE\nIN.IPV6CTL_RTMINEXPIRE\nIN.IPV6CTL_SENDREDIRECTS\nIN.IPV6CTL_SOURCECHECK\nIN.IPV6CTL_SOURCECHECK_LOGINT\nIN.IPV6CTL_STATS\nIN.IPV6CTL_TEMPPLTIME\nIN.IPV6CTL_TEMPVLTIME\nIN.IPV6CTL_USETEMPADDR\nIN.IPV6CTL_USE_DEPRECATED\nIN.IPV6CTL_V6ONLY\nIN.IPV6PORT_ANONMAX\nIN.IPV6PORT_ANONMIN\nIN.IPV6PORT_RESERVED\nIN.IPV6PORT_RESERVEDMAX\nIN.IPV6PORT_RESERVEDMIN\nIN.IPV6PROTO_MAXID\nIN.IPV6_BINDV6ONLY\nIN.IPV6_CHECKSUM\nIN.IPV6_DEFAULT_MULTICAST_HOPS\nIN.IPV6_DEFAULT_MULTICAST_LOOP\nIN.IPV6_DSTOPTS\nIN.IPV6_FAITH\nIN.IPV6_FW_ADD\nIN.IPV6_FW_DEL\nIN.IPV6_FW_FLUSH\nIN.IPV6_FW_GET\nIN.IPV6_FW_ZERO\nIN.IPV6_HOPLIMIT\nIN.IPV6_HOPOPTS\nIN.IPV6_IPSEC_POLICY\nIN.IPV6_JOIN_GROUP\nIN.IPV6_LEAVE_GROUP\nIN.IPV6_MULTICAST_HOPS\nIN.IPV6_MULTICAST_IF\nIN.IPV6_MULTICAST_LOOP\nIN.IPV6_NEXTHOP\nIN.IPV6_OPTIONS\nIN.IPV6_PKTINFO\nIN.IPV6_PKTOPTIONS\nIN.IPV6_PORTRANGE\nIN.IPV6_PORTRANGE_DEFAULT\nIN.IPV6_PORTRANGE_HIGH\nIN.IPV6_PORTRANGE_LOW\nIN.IPV6_RECVDSTADDR\nIN.IPV6_RECVOPTS\nIN.IPV6_RECVRETOPTS\nIN.IPV6_RETOPTS\nIN.IPV6_RTHDR\nIN.IPV6_RTHDR_LOOSE\nIN.IPV6_RTHDR_STRICT\nIN.IPV6_RTHDR_TYPE_0\nIN.IPV6_SOCKOPT_RESERVED1\nIN.IPV6_UNICAST_HOPS\nIN.IPV6_V6ONLY\nIN.IP_ADD_MEMBERSHIP\nIN.IP_DEFAULT_MULTICAST_LOOP\nIN.IP_DEFAULT_MULTICAST_TTL\nIN.IP_DROP_MEMBERSHIP\nIN.IP_DUMMYNET_CONFIGURE\nIN.IP_DUMMYNET_DEL\nIN.IP_DUMMYNET_FLUSH\nIN.IP_DUMMYNET_GET\nIN.IP_FAITH\nIN.IP_FORCE_OUT_IFP\nIN.IP_FW_ADD\nIN.IP_FW_DEL\nIN.IP_FW_FLUSH\nIN.IP_FW_GET\nIN.IP_FW_RESETLOG\nIN.IP_FW_ZERO\nIN.IP_HDRINCL\nIN.IP_IPSEC_POLICY\nIN.IP_MAX_MEMBERSHIPS\nIN.IP_MULTICAST_IF\nIN.IP_MULTICAST_LOOP\nIN.IP_MULTICAST_TTL\nIN.IP_MULTICAST_VIF\nIN.IP_NAT__XXX\nIN.IP_OLD_FW_ADD\nIN.IP_OLD_FW_DEL\nIN.IP_OLD_FW_FLUSH\nIN.IP_OLD_FW_GET\nIN.IP_OLD_FW_RESETLOG\nIN.IP_OLD_FW_ZERO\nIN.IP_OPTIONS\nIN.IP_PORTRANGE\nIN.IP_PORTRANGE_DEFAULT\nIN.IP_PORTRANGE_HIGH\nIN.IP_PORTRANGE_LOW\nIN.IP_RECVDSTADDR\nIN.IP_RECVIF\nIN.IP_RECVOPTS\nIN.IP_RECVRETOPTS\nIN.IP_RECVTTL\nIN.IP_RETOPTS\nIN.IP_RSVP_OFF\nIN.IP_RSVP_ON\nIN.IP_RSVP_VIF_OFF\nIN.IP_RSVP_VIF_ON\nIN.IP_STRIPHDR\nIN.IP_TOS\nIN.IP_TRAFFIC_MGT_BACKGROUND\nIN.IP_TTL\nIN.MSG_CTRUNC\nIN.MSG_DONTROUTE\nIN.MSG_DONTWAIT\nIN.MSG_EOF\nIN.MSG_EOR\nIN.MSG_FLUSH\nIN.MSG_HAVEMORE\nIN.MSG_HOLD\nIN.MSG_NEEDSA\nIN.MSG_OOB\nIN.MSG_PEEK\nIN.MSG_RCVMORE\nIN.MSG_SEND\nIN.MSG_TRUNC\nIN.MSG_WAITALL\nIN.MSG_WAITSTREAM\nIN.NET_MAXID\nIN.NET_RT_DUMP\nIN.NET_RT_DUMP2\nIN.NET_RT_FLAGS\nIN.NET_RT_IFLIST\nIN.NET_RT_IFLIST2\nIN.NET_RT_MAXID\nIN.NET_RT_STAT\nIN.NET_RT_TRASH\nIN.NTOHL(??)\nIN.NTOHS(??)\nIN.PF_APPLETALK\nIN.PF_ATM\nIN.PF_CCITT\nIN.PF_CHAOS\nIN.PF_CNT\nIN.PF_COIP\nIN.PF_DATAKIT\nIN.PF_DECnet\nIN.PF_DLI\nIN.PF_ECMA\nIN.PF_HYLINK\nIN.PF_IMPLINK\nIN.PF_INET\nIN.PF_INET6\nIN.PF_IPX\nIN.PF_ISDN\nIN.PF_ISO\nIN.PF_KEY\nIN.PF_LAT\nIN.PF_LINK\nIN.PF_LOCAL\nIN.PF_MAX\nIN.PF_NATM\nIN.PF_NDRV\nIN.PF_NETBIOS\nIN.PF_NETGRAPH\nIN.PF_NS\nIN.PF_OSI\nIN.PF_PIP\nIN.PF_PPP\nIN.PF_PUP\nIN.PF_RESERVED_36\nIN.PF_ROUTE\nIN.PF_RTIP\nIN.PF_SIP\nIN.PF_SNA\nIN.PF_SYSTEM\nIN.PF_UNIX\nIN.PF_UNSPEC\nIN.PF_XTP\nIN.PTRDIFF_MAX\nIN.PTRDIFF_MIN\nIN.SCM_CREDS\nIN.SCM_RIGHTS\nIN.SCM_TIMESTAMP\nIN.SHUT_RD\nIN.SHUT_RDWR\nIN.SHUT_WR\nIN.SIG_ATOMIC_MAX\nIN.SIG_ATOMIC_MIN\nIN.SOCK_DGRAM\nIN.SOCK_MAXADDRLEN\nIN.SOCK_RAW\nIN.SOCK_RDM\nIN.SOCK_SEQPACKET\nIN.SOCK_STREAM\nIN.SOL_SOCKET\nIN.SOMAXCONN\nIN.SO_ACCEPTCONN\nIN.SO_ACCEPTFILTER\nIN.SO_BROADCAST\nIN.SO_DEBUG\nIN.SO_DONTROUTE\nIN.SO_DONTTRUNC\nIN.SO_ERROR\nIN.SO_KEEPALIVE\nIN.SO_LABEL\nIN.SO_LINGER\nIN.SO_LINGER_SEC\nIN.SO_NKE\nIN.SO_NOADDRERR\nIN.SO_NOSIGPIPE\nIN.SO_NOTIFYCONFLICT\nIN.SO_NREAD\nIN.SO_NWRITE\nIN.SO_OOBINLINE\nIN.SO_PEERLABEL\nIN.SO_RCVBUF\nIN.SO_RCVLOWAT\nIN.SO_RCVTIMEO\nIN.SO_RESTRICTIONS\nIN.SO_RESTRICT_DENYIN\nIN.SO_RESTRICT_DENYOUT\nIN.SO_RESTRICT_DENYSET\nIN.SO_REUSEADDR\nIN.SO_REUSEPORT\nIN.SO_REUSESHAREUID\nIN.SO_SNDBUF\nIN.SO_SNDLOWAT\nIN.SO_SNDTIMEO\nIN.SO_TIMESTAMP\nIN.SO_TYPE\nIN.SO_USELOOPBACK\nIN.SO_WANTMORE\nIN.SO_WANTOOBFLAG\nIN.TRAFFIC_MGT_SO_BACKGROUND\nIN.TRAFFIC_MGT_SO_BG_SUPPRESSED\nIN.UINT16_MAX\nIN.UINT8_MAX\nIN.UINT_FAST16_MAX\nIN.UINT_FAST8_MAX\nIN.UINT_LEAST16_MAX\nIN.UINT_LEAST8_MAX\nIN.WCHAR_MAX\nIN.WCHAR_MIN\nIN.WINT_MAX\nIN.WINT_MIN\nIN.htonl(??)\nIN.htons(??)\nIN.ntohl(??)\nIN.ntohs(??)\nIN.pseudo_AF_HDRCMPLT\nIN.pseudo_AF_KEY\nIN.pseudo_AF_PIP\nIN.pseudo_AF_RTIP\nIN.pseudo_AF_XTP\nIOError(??)\nImportError(??)\nImportWarning(??)\nIndentationError(??)\nIndexError(??)\nInterruptedError(??)\nIsADirectoryError(??)\nKeyError(??)\nKeyboardInterrupt(??)\nLookupError(??)\nMemoryError(??)\nNameError(??)\nNone(??)\nNotADirectoryError(??)\nNotImplemented(??)\nNotImplementedError(??)\nOSError(??)\nOverflowError(??)\nPendingDeprecationWarning(??)\nPermissionError(??)\nProcessLookupError(??)\nReferenceError(??)\nResourceWarning(??)\nRuntimeError(??)\nRuntimeWarning(??)\nStopIteration(??)\nSyntaxError(??)\nSyntaxWarning(??)\nSystemError(??)\nSystemExit(??)\nTabError(??)\nTimeoutError(??)\nTrue(??)\nTypeError(??)\nUnboundLocalError(??)\nUnicodeDecodeError(??)\nUnicodeEncodeError(??)\nUnicodeError(??)\nUnicodeTranslateError(??)\nUnicodeWarning(??)\nUserWarning(??)\nValueError(??)\nWarning(??)\nZeroDivisionError(??)\nabc.ABCMeta(??)\nabc.WeakSet(??)\nabc.abstractclassmethod(??)\nabc.abstractmethod(??)\nabc.abstractproperty(??)\nabc.abstractstaticmethod(??)\nabs(number) -> number\naifc.Aifc_read(??)\naifc.Aifc_write(??)\naifc.Chunk(??)\naifc.Error(??)\naifc.builtins(??)\naifc.open(??)\naifc.openfp(??)\naifc.struct(??)\naifc.warnings(??)\nall(iterable) -> bool\nany(iterable) -> bool\nargparse.Action(??)\nargparse.ArgumentDefaultsHelpFormatter(??)\nargparse.ArgumentError(??)\nargparse.ArgumentParser(??)\nargparse.ArgumentTypeError(??)\nargparse.FileType(??)\nargparse.HelpFormatter(??)\nargparse.MetavarTypeHelpFormatter(??)\nargparse.Namespace(??)\nargparse.ONE_OR_MORE\nargparse.OPTIONAL\nargparse.PARSER\nargparse.REMAINDER\nargparse.RawDescriptionHelpFormatter(??)\nargparse.RawTextHelpFormatter(??)\nargparse.SUPPRESS\nargparse.ZERO_OR_MORE\nargparse.ngettext(??)\narray.ArrayType(??)\narray.array(typecode [, initializer]) -> array\narray.typecodes\nascii(object) -> string\nast.AST(??)\nast.Add(??)\nast.And(??)\nast.Assert(??)\nast.Assign(??)\nast.Attribute(??)\nast.AugAssign(??)\nast.AugLoad(??)\nast.AugStore(??)\nast.BinOp(??)\nast.BitAnd(??)\nast.BitOr(??)\nast.BitXor(??)\nast.BoolOp(??)\nast.Break(??)\nast.Bytes(??)\nast.Call(??)\nast.ClassDef(??)\nast.Compare(??)\nast.Continue(??)\nast.Del(??)\nast.Delete(??)\nast.Dict(??)\nast.DictComp(??)\nast.Div(??)\nast.Ellipsis(??)\nast.Eq(??)\nast.ExceptHandler(??)\nast.Expr(??)\nast.Expression(??)\nast.ExtSlice(??)\nast.FloorDiv(??)\nast.For(??)\nast.FunctionDef(??)\nast.GeneratorExp(??)\nast.Global(??)\nast.Gt(??)\nast.GtE(??)\nast.If(??)\nast.IfExp(??)\nast.Import(??)\nast.ImportFrom(??)\nast.In(??)\nast.Index(??)\nast.Interactive(??)\nast.Invert(??)\nast.Is(??)\nast.IsNot(??)\nast.LShift(??)\nast.Lambda(??)\nast.List(??)\nast.ListComp(??)\nast.Load(??)\nast.Lt(??)\nast.LtE(??)\nast.Mod(??)\nast.Module(??)\nast.Mult(??)\nast.Name(??)\nast.NodeTransformer(??)\nast.NodeVisitor(??)\nast.Nonlocal(??)\nast.Not(??)\nast.NotEq(??)\nast.NotIn(??)\nast.Num(??)\nast.Or(??)\nast.Param(??)\nast.Pass(??)\nast.Pow(??)\nast.PyCF_ONLY_AST\nast.RShift(??)\nast.Raise(??)\nast.Return(??)\nast.Set(??)\nast.SetComp(??)\nast.Slice(??)\nast.Starred(??)\nast.Store(??)\nast.Str(??)\nast.Sub(??)\nast.Subscript(??)\nast.Suite(??)\nast.Try(??)\nast.Tuple(??)\nast.UAdd(??)\nast.USub(??)\nast.UnaryOp(??)\nast.While(??)\nast.With(??)\nast.Yield(??)\nast.YieldFrom(??)\nast.alias(??)\nast.arg(??)\nast.arguments(??)\nast.boolop(??)\nast.cmpop(??)\nast.comprehension(??)\nast.copy_location(??)\nast.dump(??)\nast.excepthandler(??)\nast.expr(??)\nast.expr_context(??)\nast.fix_missing_locations(??)\nast.get_docstring(??)\nast.increment_lineno(??)\nast.iter_child_nodes(??)\nast.iter_fields(??)\nast.keyword(??)\nast.literal_eval(??)\nast.mod(??)\nast.operator(??)\nast.parse(??)\nast.slice(??)\nast.stmt(??)\nast.unaryop(??)\nast.walk(??)\nast.withitem(??)\nasynchat.async_chat(??)\nasynchat.asyncore(??)\nasynchat.deque(iterable[, maxlen]) --> deque object\nasynchat.fifo(??)\nasynchat.find_prefix_at_end(??)\nasynchat.simple_producer(??)\nasynchat.socket(??)\nasyncore.EAGAIN\nasyncore.EALREADY\nasyncore.EBADF\nasyncore.ECONNABORTED\nasyncore.ECONNRESET\nasyncore.EINPROGRESS\nasyncore.EINVAL\nasyncore.EISCONN\nasyncore.ENOTCONN\nasyncore.EPIPE\nasyncore.ESHUTDOWN\nasyncore.EWOULDBLOCK\nasyncore.ExitNow(??)\nasyncore.close_all(??)\nasyncore.compact_traceback(??)\nasyncore.dispatcher(??)\nasyncore.dispatcher_with_send(??)\nasyncore.errorcode(??)\nasyncore.fcntl(??)\nasyncore.file_dispatcher(??)\nasyncore.file_wrapper(??)\nasyncore.loop(??)\nasyncore.os(??)\nasyncore.poll(??)\nasyncore.poll2(??)\nasyncore.poll3(??)\nasyncore.read(??)\nasyncore.readwrite(??)\nasyncore.select(??)\nasyncore.socket(??)\nasyncore.socket_map(??)\nasyncore.sys(??)\nasyncore.time(??)\nasyncore.warnings(??)\nasyncore.write(??)\natexit.register(func, *args, **kwargs) -> func\natexit.unregister(func) -> None\naudioop.add(??)\naudioop.adpcm2lin(??)\naudioop.alaw2lin(??)\naudioop.avg(??)\naudioop.avgpp(??)\naudioop.bias(??)\naudioop.cross(??)\naudioop.error(??)\naudioop.findfactor(??)\naudioop.findfit(??)\naudioop.findmax(??)\naudioop.getsample(??)\naudioop.lin2adpcm(??)\naudioop.lin2alaw(??)\naudioop.lin2lin(??)\naudioop.lin2ulaw(??)\naudioop.max(??)\naudioop.maxpp(??)\naudioop.minmax(??)\naudioop.mul(??)\naudioop.ratecv(??)\naudioop.reverse(??)\naudioop.rms(??)\naudioop.tomono(??)\naudioop.tostereo(??)\naudioop.ulaw2lin(??)\nbase64.MAXBINSIZE\nbase64.MAXLINESIZE\nbase64.b16decode(??)\nbase64.b16encode(??)\nbase64.b32decode(??)\nbase64.b32encode(??)\nbase64.b64decode(??)\nbase64.b64encode(??)\nbase64.binascii(??)\nbase64.bytes_types(??)\nbase64.decode(??)\nbase64.decodebytes(??)\nbase64.decodestring(??)\nbase64.encode(??)\nbase64.encodebytes(??)\nbase64.encodestring(??)\nbase64.main(??)\nbase64.re(??)\nbase64.standard_b64decode(??)\nbase64.standard_b64encode(??)\nbase64.struct(??)\nbase64.test(??)\nbase64.urlsafe_b64decode(??)\nbase64.urlsafe_b64encode(??)\nbdb.Bdb(??)\nbdb.BdbQuit(??)\nbdb.Breakpoint(??)\nbdb.Tdb(??)\nbdb.bar(??)\nbdb.checkfuncname(??)\nbdb.effective(??)\nbdb.fnmatch(??)\nbdb.foo(??)\nbdb.os(??)\nbdb.set_trace(??)\nbdb.sys(??)\nbdb.test(??)\nbin(number) -> string\nbinascii.Error(??)\nbinascii.Incomplete(??)\nbinascii.a2b_base64(??)\nbinascii.a2b_hex(hexstr) -> s; Binary data of hexadecimal representation.\nbinascii.a2b_hqx(??)\nbinascii.a2b_qp(??)\nbinascii.a2b_uu(??)\nbinascii.b2a_base64(??)\nbinascii.b2a_hex(data) -> s; Hexadecimal representation of binary data.\nbinascii.b2a_hqx(??)\nbinascii.b2a_qp(data, quotetabs=0, istext=1, header=0) -> s;\nbinascii.b2a_uu(??)\nbinascii.crc32(??)\nbinascii.crc_hqx(??)\nbinascii.hexlify(??)\nbinascii.rlecode_hqx(??)\nbinascii.rledecode_hqx(??)\nbinascii.unhexlify(??)\nbinhex.BinHex(??)\nbinhex.Error(??)\nbinhex.FInfo(??)\nbinhex.HexBin(??)\nbinhex.LINELEN\nbinhex.REASONABLY_LARGE\nbinhex.RUNCHAR\nbinhex.binascii(??)\nbinhex.binhex(infilename, outfilename): create binhex-encoded copy of a file\nbinhex.getfileinfo(??)\nbinhex.hexbin(infilename, outfilename) - Decode binhexed file\nbinhex.io(??)\nbinhex.openrsrc(??)\nbinhex.os(??)\nbinhex.struct(??)\nbisect.bisect(??)\nbisect.bisect_left(a, x[, lo[, hi]]) -> index\nbisect.bisect_right(a, x[, lo[, hi]]) -> index\nbisect.insort(??)\nbisect.insort_left(a, x[, lo[, hi]])\nbisect.insort_right(a, x[, lo[, hi]])\nbool(x) -> bool\nbuiltins.ArithmeticError(??)\nbuiltins.AssertionError(??)\nbuiltins.AttributeError(??)\nbuiltins.BaseException(??)\nbuiltins.BlockingIOError(??)\nbuiltins.BrokenPipeError(??)\nbuiltins.BufferError(??)\nbuiltins.BytesWarning(??)\nbuiltins.ChildProcessError(??)\nbuiltins.ConnectionAbortedError(??)\nbuiltins.ConnectionError(??)\nbuiltins.ConnectionRefusedError(??)\nbuiltins.ConnectionResetError(??)\nbuiltins.DeprecationWarning(??)\nbuiltins.EOFError(??)\nbuiltins.Ellipsis(??)\nbuiltins.EnvironmentError(??)\nbuiltins.Exception(??)\nbuiltins.False\nbuiltins.FileExistsError(??)\nbuiltins.FileNotFoundError(??)\nbuiltins.FloatingPointError(??)\nbuiltins.FutureWarning(??)\nbuiltins.GeneratorExit(??)\nbuiltins.IOError(??)\nbuiltins.ImportError(??)\nbuiltins.ImportWarning(??)\nbuiltins.IndentationError(??)\nbuiltins.IndexError(??)\nbuiltins.InterruptedError(??)\nbuiltins.IsADirectoryError(??)\nbuiltins.KeyError(??)\nbuiltins.KeyboardInterrupt(??)\nbuiltins.LookupError(??)\nbuiltins.MemoryError(??)\nbuiltins.NameError(??)\nbuiltins.None\nbuiltins.NotADirectoryError(??)\nbuiltins.NotImplemented(??)\nbuiltins.NotImplementedError(??)\nbuiltins.OSError(??)\nbuiltins.OverflowError(??)\nbuiltins.PendingDeprecationWarning(??)\nbuiltins.PermissionError(??)\nbuiltins.ProcessLookupError(??)\nbuiltins.ReferenceError(??)\nbuiltins.ResourceWarning(??)\nbuiltins.RuntimeError(??)\nbuiltins.RuntimeWarning(??)\nbuiltins.StopIteration(??)\nbuiltins.SyntaxError(??)\nbuiltins.SyntaxWarning(??)\nbuiltins.SystemError(??)\nbuiltins.SystemExit(??)\nbuiltins.TabError(??)\nbuiltins.TimeoutError(??)\nbuiltins.True\nbuiltins.TypeError(??)\nbuiltins.UnboundLocalError(??)\nbuiltins.UnicodeDecodeError(??)\nbuiltins.UnicodeEncodeError(??)\nbuiltins.UnicodeError(??)\nbuiltins.UnicodeTranslateError(??)\nbuiltins.UnicodeWarning(??)\nbuiltins.UserWarning(??)\nbuiltins.ValueError(??)\nbuiltins.Warning(??)\nbuiltins.ZeroDivisionError(??)\nbuiltins.abs(number) -> number\nbuiltins.all(iterable) -> bool\nbuiltins.any(iterable) -> bool\nbuiltins.ascii(object) -> string\nbuiltins.bin(number) -> string\nbuiltins.bool(x) -> bool\nbuiltins.bytearray(iterable_of_ints) -> bytearray\nbuiltins.bytes(iterable_of_ints) -> bytes\nbuiltins.callable(object) -> bool\nbuiltins.chr(i) -> Unicode character\nbuiltins.classmethod(function) -> method\nbuiltins.compile(source, filename, mode[, flags[, dont_inherit]]) -> code object\nbuiltins.complex(real[, imag]) -> complex number\nbuiltins.copyright(??)\nbuiltins.credits(??)\nbuiltins.delattr(object, name)\nbuiltins.dict() -> new empty dictionary\nbuiltins.dir([object]) -> list of strings\nbuiltins.divmod(x, y) -> (div, mod)\nbuiltins.enumerate(iterable[, start]) -> iterator for index, value of iterable\nbuiltins.eval(source[, globals[, locals]]) -> value\nbuiltins.exec(object[, globals[, locals]])\nbuiltins.exit(??)\nbuiltins.filter(function or None, iterable) --> filter object\nbuiltins.float(x) -> floating point number\nbuiltins.format(value[, format_spec]) -> string\nbuiltins.frozenset() -> empty frozenset object\nbuiltins.getattr(object, name[, default]) -> value\nbuiltins.globals() -> dictionary\nbuiltins.hasattr(object, name) -> bool\nbuiltins.hash(object) -> integer\nbuiltins.help(??)\nbuiltins.hex(number) -> string\nbuiltins.id(object) -> integer\nbuiltins.input([prompt]) -> string\nbuiltins.int(x[, base]) -> integer\nbuiltins.isinstance(object, class-or-type-or-tuple) -> bool\nbuiltins.issubclass(C, B) -> bool\nbuiltins.iter(iterable) -> iterator\nbuiltins.len(object) -> integer\nbuiltins.license(??)\nbuiltins.list() -> new empty list\nbuiltins.locals() -> dictionary\nbuiltins.map(func, *iterables) --> map object\nbuiltins.max(iterable[, key=func]) -> value\nbuiltins.memoryview(object)\nbuiltins.min(iterable[, key=func]) -> value\nbuiltins.next(iterator[, default])\nbuiltins.object(??)\nbuiltins.oct(number) -> string\nbuiltins.open(??)\nbuiltins.ord(c) -> integer\nbuiltins.pow(x, y[, z]) -> number\nbuiltins.print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\nbuiltins.property(fget=None, fset=None, fdel=None, doc=None) -> property attribute\nbuiltins.quit(??)\nbuiltins.range([start,] stop[, step]) -> range object\nbuiltins.repr(object) -> string\nbuiltins.reversed(sequence) -> reverse iterator over values of the sequence\nbuiltins.round(number[, ndigits]) -> number\nbuiltins.set() -> new empty set object\nbuiltins.setattr(object, name, value)\nbuiltins.slice([start,] stop[, step])\nbuiltins.sorted(iterable, key=None, reverse=False) --> new sorted list\nbuiltins.staticmethod(function) -> method\nbuiltins.str(object[, encoding[, errors]]) -> str\nbuiltins.sum(iterable[, start]) -> value\nbuiltins.super() -> same as super(__class__, <first argument>)\nbuiltins.tuple() -> empty tuple\nbuiltins.type(object) -> the object's type\nbuiltins.vars([object]) -> dictionary\nbuiltins.zip(iter1 [,iter2 [...]]) --> zip object\nbytearray(iterable_of_ints) -> bytearray\nbytes(iterable_of_ints) -> bytes\nbz2.BZ2Compressor(compresslevel=9)\nbz2.BZ2Decompressor()\nbz2.BZ2File(??)\nbz2.RLock(??)\nbz2.builtins(??)\nbz2.compress(??)\nbz2.decompress(??)\nbz2.io(??)\nbz2.open(??)\nbz2.warnings(??)\ncProfile.Profile(custom_timer=None, time_unit=None, subcalls=True, builtins=True)\ncProfile.label(??)\ncProfile.main(??)\ncProfile.run(??)\ncProfile.runctx(??)\ncalendar.Calendar(??)\ncalendar.EPOCH\ncalendar.FRIDAY\ncalendar.February\ncalendar.HTMLCalendar(??)\ncalendar.IllegalMonthError(??)\ncalendar.IllegalWeekdayError(??)\ncalendar.January\ncalendar.LocaleHTMLCalendar(??)\ncalendar.LocaleTextCalendar(??)\ncalendar.MONDAY\ncalendar.SATURDAY\ncalendar.SUNDAY\ncalendar.THURSDAY\ncalendar.TUESDAY\ncalendar.TextCalendar(??)\ncalendar.WEDNESDAY\ncalendar.c(??)\ncalendar.calendar(??)\ncalendar.datetime(??)\ncalendar.day_abbr(??)\ncalendar.day_name(??)\ncalendar.different_locale(??)\ncalendar.error(??)\ncalendar.firstweekday(??)\ncalendar.format(??)\ncalendar.formatstring(??)\ncalendar.isleap(??)\ncalendar.leapdays(??)\ncalendar.main(??)\ncalendar.mdays(??)\ncalendar.month(??)\ncalendar.month_abbr(??)\ncalendar.month_name(??)\ncalendar.monthcalendar(??)\ncalendar.monthrange(??)\ncalendar.prcal(??)\ncalendar.prmonth(??)\ncalendar.prweek(??)\ncalendar.setfirstweekday(??)\ncalendar.sys(??)\ncalendar.timegm(??)\ncalendar.week(??)\ncalendar.weekday(??)\ncalendar.weekheader(??)\ncallable(object) -> bool\ncgi.BytesIO([buffer]) -> object\ncgi.FeedParser(??)\ncgi.FieldStorage(??)\ncgi.MiniFieldStorage(??)\ncgi.StringIO(??)\ncgi.TextIOWrapper(??)\ncgi.closelog(??)\ncgi.dolog(??)\ncgi.escape(??)\ncgi.html(??)\ncgi.initlog(??)\ncgi.locale(??)\ncgi.log(??)\ncgi.logfile\ncgi.logfp(??)\ncgi.maxlen\ncgi.nolog(??)\ncgi.os(??)\ncgi.parse(??)\ncgi.parse_header(??)\ncgi.parse_multipart(??)\ncgi.parse_qs(??)\ncgi.parse_qsl(??)\ncgi.print_arguments(??)\ncgi.print_directory(??)\ncgi.print_environ(??)\ncgi.print_environ_usage(??)\ncgi.print_exception(??)\ncgi.print_form(??)\ncgi.sys(??)\ncgi.tempfile(??)\ncgi.test(??)\ncgi.urllib(??)\ncgi.valid_boundary(??)\ncgi.warn(??)\ncgitb.Hook(??)\ncgitb.enable(??)\ncgitb.grey(??)\ncgitb.handler(??)\ncgitb.html(??)\ncgitb.inspect(??)\ncgitb.keyword(??)\ncgitb.linecache(??)\ncgitb.lookup(??)\ncgitb.os(??)\ncgitb.pydoc(??)\ncgitb.reset(??)\ncgitb.scanvars(??)\ncgitb.small(??)\ncgitb.strong(??)\ncgitb.sys(??)\ncgitb.tempfile(??)\ncgitb.text(??)\ncgitb.time(??)\ncgitb.tokenize(??)\ncgitb.traceback(??)\nchr(i) -> Unicode character\nchunk.Chunk(??)\nclassmethod(function) -> method\ncmath.acos(x)\ncmath.acosh(x)\ncmath.asin(x)\ncmath.asinh(x)\ncmath.atan(x)\ncmath.atanh(x)\ncmath.cos(x)\ncmath.cosh(x)\ncmath.e\ncmath.exp(x)\ncmath.isfinite(z) -> bool\ncmath.isinf(z) -> bool\ncmath.isnan(z) -> bool\ncmath.log(x[, base]) -> the logarithm of x to the given base.\ncmath.log10(x)\ncmath.phase(z) -> float\ncmath.pi\ncmath.polar(z) -> r: float, phi: float\ncmath.rect(r, phi) -> z: complex\ncmath.sin(x)\ncmath.sinh(x)\ncmath.sqrt(x)\ncmath.tan(x)\ncmath.tanh(x)\ncmd.Cmd(??)\ncmd.IDENTCHARS\ncmd.PROMPT\ncmd.string(??)\ncmd.sys(??)\ncode.CommandCompiler(??)\ncode.InteractiveConsole(??)\ncode.InteractiveInterpreter(??)\ncode.compile_command(??)\ncode.interact(??)\ncode.sys(??)\ncode.traceback(??)\ncodecs.BOM\ncodecs.BOM32_BE\ncodecs.BOM32_LE\ncodecs.BOM64_BE\ncodecs.BOM64_LE\ncodecs.BOM_BE\ncodecs.BOM_LE\ncodecs.BOM_UTF16\ncodecs.BOM_UTF16_BE\ncodecs.BOM_UTF16_LE\ncodecs.BOM_UTF32\ncodecs.BOM_UTF32_BE\ncodecs.BOM_UTF32_LE\ncodecs.BOM_UTF8\ncodecs.BufferedIncrementalDecoder(??)\ncodecs.BufferedIncrementalEncoder(??)\ncodecs.Codec(??)\ncodecs.CodecInfo(??)\ncodecs.EncodedFile(??)\ncodecs.IncrementalDecoder(??)\ncodecs.IncrementalEncoder(??)\ncodecs.StreamReader(??)\ncodecs.StreamReaderWriter(??)\ncodecs.StreamRecoder(??)\ncodecs.StreamWriter(??)\ncodecs.ascii_decode(??)\ncodecs.ascii_encode(??)\ncodecs.backslashreplace_errors(??)\ncodecs.builtins(??)\ncodecs.charmap_build(??)\ncodecs.charmap_decode(??)\ncodecs.charmap_encode(??)\ncodecs.decode(obj, [encoding[,errors]]) -> object\ncodecs.encode(obj, [encoding[,errors]]) -> object\ncodecs.escape_decode(??)\ncodecs.escape_encode(??)\ncodecs.getdecoder(??)\ncodecs.getencoder(??)\ncodecs.getincrementaldecoder(??)\ncodecs.getincrementalencoder(??)\ncodecs.getreader(??)\ncodecs.getwriter(??)\ncodecs.ignore_errors(??)\ncodecs.iterdecode(??)\ncodecs.iterencode(??)\ncodecs.latin_1_decode(??)\ncodecs.latin_1_encode(??)\ncodecs.lookup(encoding) -> CodecInfo\ncodecs.lookup_error(errors) -> handler\ncodecs.make_encoding_map(??)\ncodecs.make_identity_dict(rng) -> dict\ncodecs.open(??)\ncodecs.raw_unicode_escape_decode(??)\ncodecs.raw_unicode_escape_encode(??)\ncodecs.readbuffer_encode(??)\ncodecs.register(search_function)\ncodecs.register_error(errors, handler)\ncodecs.replace_errors(??)\ncodecs.strict_errors(??)\ncodecs.sys(??)\ncodecs.unicode_escape_decode(??)\ncodecs.unicode_escape_encode(??)\ncodecs.unicode_internal_decode(??)\ncodecs.unicode_internal_encode(??)\ncodecs.utf_16_be_decode(??)\ncodecs.utf_16_be_encode(??)\ncodecs.utf_16_decode(??)\ncodecs.utf_16_encode(??)\ncodecs.utf_16_ex_decode(??)\ncodecs.utf_16_le_decode(??)\ncodecs.utf_16_le_encode(??)\ncodecs.utf_32_be_decode(??)\ncodecs.utf_32_be_encode(??)\ncodecs.utf_32_decode(??)\ncodecs.utf_32_encode(??)\ncodecs.utf_32_ex_decode(??)\ncodecs.utf_32_le_decode(??)\ncodecs.utf_32_le_encode(??)\ncodecs.utf_7_decode(??)\ncodecs.utf_7_encode(??)\ncodecs.utf_8_decode(??)\ncodecs.utf_8_encode(??)\ncodecs.xmlcharrefreplace_errors(??)\ncodeop.CommandCompiler(??)\ncodeop.Compile(??)\ncodeop.PyCF_DONT_IMPLY_DEDENT\ncodeop.compile_command(??)\ncollections.ByteString(??)\ncollections.Callable(??)\ncollections.ChainMap(??)\ncollections.Container(??)\ncollections.Counter(??)\ncollections.Hashable(??)\ncollections.ItemsView(??)\ncollections.Iterable(??)\ncollections.Iterator(??)\ncollections.KeysView(??)\ncollections.Mapping(??)\ncollections.MappingView(??)\ncollections.MutableMapping(??)\ncollections.MutableSequence(??)\ncollections.MutableSet(??)\ncollections.OrderedDict(??)\ncollections.Sequence(??)\ncollections.Set(??)\ncollections.Sized(??)\ncollections.UserDict(??)\ncollections.UserList(??)\ncollections.UserString(??)\ncollections.ValuesView(??)\ncollections.abc(??)\ncollections.abc.ABCMeta(??)\ncollections.abc.ByteString(??)\ncollections.abc.Callable(??)\ncollections.abc.Container(??)\ncollections.abc.Hashable(??)\ncollections.abc.ItemsView(??)\ncollections.abc.Iterable(??)\ncollections.abc.Iterator(??)\ncollections.abc.KeysView(??)\ncollections.abc.Mapping(??)\ncollections.abc.MappingView(??)\ncollections.abc.MutableMapping(??)\ncollections.abc.MutableSequence(??)\ncollections.abc.MutableSet(??)\ncollections.abc.Sequence(??)\ncollections.abc.Set(??)\ncollections.abc.Sized(??)\ncollections.abc.ValuesView(??)\ncollections.abc.abstractmethod(??)\ncollections.abc.bytearray_iterator(??)\ncollections.abc.bytes_iterator(??)\ncollections.abc.dict_itemiterator(??)\ncollections.abc.dict_items(??)\ncollections.abc.dict_keyiterator(??)\ncollections.abc.dict_keys(??)\ncollections.abc.dict_valueiterator(??)\ncollections.abc.dict_values(??)\ncollections.abc.list_iterator(??)\ncollections.abc.list_reverseiterator(??)\ncollections.abc.mappingproxy(??)\ncollections.abc.range_iterator(??)\ncollections.abc.set_iterator(??)\ncollections.abc.str_iterator(??)\ncollections.abc.sys(??)\ncollections.abc.tuple_iterator(??)\ncollections.abc.zip_iterator(??)\ncollections.collections(??)\ncollections.defaultdict(default_factory) --> dict with default factory\ncollections.deque(iterable[, maxlen]) --> deque object\ncollections.namedtuple(??)\ncolorsys.ONE_SIXTH\ncolorsys.ONE_THIRD\ncolorsys.TWO_THIRD\ncolorsys.hls_to_rgb(??)\ncolorsys.hsv_to_rgb(??)\ncolorsys.rgb_to_hls(??)\ncolorsys.rgb_to_hsv(??)\ncolorsys.rgb_to_yiq(??)\ncolorsys.yiq_to_rgb(??)\ncompile(source, filename, mode[, flags[, dont_inherit]]) -> code object\ncompileall.compile_dir(??)\ncompileall.compile_file(??)\ncompileall.compile_path(??)\ncompileall.errno(??)\ncompileall.imp(??)\ncompileall.main(??)\ncompileall.os(??)\ncompileall.py_compile(??)\ncompileall.struct(??)\ncompileall.sys(??)\ncomplex(real[, imag]) -> complex number\nconcurrent.futures.ALL_COMPLETED\nconcurrent.futures.CancelledError(??)\nconcurrent.futures.Executor(??)\nconcurrent.futures.FIRST_COMPLETED\nconcurrent.futures.FIRST_EXCEPTION\nconcurrent.futures.Future(??)\nconcurrent.futures.ProcessPoolExecutor(??)\nconcurrent.futures.ThreadPoolExecutor(??)\nconcurrent.futures.TimeoutError(??)\nconcurrent.futures.as_completed(??)\nconcurrent.futures.process(??)\nconcurrent.futures.process.BrokenProcessPool(??)\nconcurrent.futures.process.EXTRA_QUEUED_CALLS\nconcurrent.futures.process.Full(??)\nconcurrent.futures.process.ProcessPoolExecutor(??)\nconcurrent.futures.process.SimpleQueue(??)\nconcurrent.futures.process.atexit(??)\nconcurrent.futures.process.multiprocessing(??)\nconcurrent.futures.process.os(??)\nconcurrent.futures.process.queue(??)\nconcurrent.futures.process.threading(??)\nconcurrent.futures.process.wait(??)\nconcurrent.futures.process.weakref(??)\nconcurrent.futures.thread(??)\nconcurrent.futures.thread.ThreadPoolExecutor(??)\nconcurrent.futures.thread.atexit(??)\nconcurrent.futures.thread.queue(??)\nconcurrent.futures.thread.threading(??)\nconcurrent.futures.thread.weakref(??)\nconcurrent.futures.wait(??)\nconfigparser.BasicInterpolation(??)\nconfigparser.ConfigParser(??)\nconfigparser.DEFAULTSECT\nconfigparser.DuplicateOptionError(??)\nconfigparser.DuplicateSectionError(??)\nconfigparser.Error(??)\nconfigparser.ExtendedInterpolation(??)\nconfigparser.Interpolation(??)\nconfigparser.InterpolationDepthError(??)\nconfigparser.InterpolationError(??)\nconfigparser.InterpolationMissingOptionError(??)\nconfigparser.InterpolationSyntaxError(??)\nconfigparser.LegacyInterpolation(??)\nconfigparser.MAX_INTERPOLATION_DEPTH\nconfigparser.MissingSectionHeaderError(??)\nconfigparser.MutableMapping(??)\nconfigparser.NoOptionError(??)\nconfigparser.NoSectionError(??)\nconfigparser.ParsingError(??)\nconfigparser.RawConfigParser(??)\nconfigparser.SafeConfigParser(??)\nconfigparser.SectionProxy(??)\nconfigparser.functools(??)\nconfigparser.io(??)\nconfigparser.itertools(??)\nconfigparser.re(??)\nconfigparser.sys(??)\nconfigparser.warnings(??)\ncontextlib.ContextDecorator(??)\ncontextlib.ExitStack(??)\ncontextlib.closing(??)\ncontextlib.contextmanager(??)\ncontextlib.deque(iterable[, maxlen]) --> deque object\ncontextlib.sys(??)\ncontextlib.wraps(??)\ncopy.Error(??)\ncopy.PyStringMap(??)\ncopy.builtins(??)\ncopy.copy(??)\ncopy.deepcopy(??)\ncopy.dispatch_table(??)\ncopy.error(??)\ncopy.name\ncopy.t(??)\ncopy.weakref(??)\ncopyreg.add_extension(??)\ncopyreg.clear_extension_cache(??)\ncopyreg.constructor(??)\ncopyreg.dispatch_table(??)\ncopyreg.pickle(??)\ncopyreg.pickle_complex(??)\ncopyreg.remove_extension(??)\ncopyright(??)\ncredits(??)\ncrypt.METHOD_CRYPT(??)\ncrypt.METHOD_MD5(??)\ncrypt.METHOD_SHA256(??)\ncrypt.METHOD_SHA512(??)\ncrypt.crypt(??)\ncrypt.methods(??)\ncrypt.mksalt(??)\ncsv.Dialect(??)\ncsv.DictReader(??)\ncsv.DictWriter(??)\ncsv.Error(??)\ncsv.QUOTE_ALL\ncsv.QUOTE_MINIMAL\ncsv.QUOTE_NONE\ncsv.QUOTE_NONNUMERIC\ncsv.Sniffer(??)\ncsv.StringIO(??)\ncsv.excel(??)\ncsv.excel_tab(??)\ncsv.field_size_limit(??)\ncsv.get_dialect(??)\ncsv.list_dialects(??)\ncsv.re(??)\ncsv.reader(??)\ncsv.register_dialect(??)\ncsv.unix_dialect(??)\ncsv.unregister_dialect(??)\ncsv.writer(??)\nctypes.ARRAY(??)\nctypes.ArgumentError(??)\nctypes.Array(??)\nctypes.BigEndianStructure(??)\nctypes.CDLL(??)\nctypes.CFUNCTYPE(??)\nctypes.DEFAULT_MODE\nctypes.LibraryLoader(??)\nctypes.LittleEndianStructure(??)\nctypes.POINTER(??)\nctypes.PYFUNCTYPE(??)\nctypes.PyDLL(??)\nctypes.RTLD_GLOBAL\nctypes.RTLD_LOCAL\nctypes.SetPointerType(??)\nctypes.Structure(??)\nctypes.Union(??)\nctypes.addressof(C instance) -> integer\nctypes.alignment(C type) -> integer\nctypes.byref(C instance[, offset=0]) -> byref-object\nctypes.c_bool(??)\nctypes.c_buffer(??)\nctypes.c_byte(??)\nctypes.c_char(??)\nctypes.c_char_p(??)\nctypes.c_double(??)\nctypes.c_float(??)\nctypes.c_int(??)\nctypes.c_int16(??)\nctypes.c_int32(??)\nctypes.c_int64(??)\nctypes.c_int8(??)\nctypes.c_long(??)\nctypes.c_longdouble(??)\nctypes.c_longlong(??)\nctypes.c_short(??)\nctypes.c_size_t(??)\nctypes.c_ssize_t(??)\nctypes.c_ubyte(??)\nctypes.c_uint(??)\nctypes.c_uint16(??)\nctypes.c_uint32(??)\nctypes.c_uint64(??)\nctypes.c_uint8(??)\nctypes.c_ulong(??)\nctypes.c_ulonglong(??)\nctypes.c_ushort(??)\nctypes.c_void_p(??)\nctypes.c_voidp(??)\nctypes.c_wchar(??)\nctypes.c_wchar_p(??)\nctypes.cast(??)\nctypes.cdll(??)\nctypes.create_string_buffer(aBytes) -> character array\nctypes.create_unicode_buffer(aString) -> character array\nctypes.get_errno(??)\nctypes.macholib.dyld.DEFAULT_FRAMEWORK_FALLBACK(??)\nctypes.macholib.dyld.DEFAULT_LIBRARY_FALLBACK(??)\nctypes.macholib.dyld.accumulate(iterable[, func]) --> accumulate object\nctypes.macholib.dyld.chain(*iterables) --> chain object\nctypes.macholib.dyld.combinations(iterable, r) --> combinations object\nctypes.macholib.dyld.combinations_with_replacement(iterable, r) --> combinations_with_replacement object\nctypes.macholib.dyld.compress(data, selectors) --> iterator over selected data\nctypes.macholib.dyld.count(start=0, step=1) --> count object\nctypes.macholib.dyld.cycle(iterable) --> cycle object\nctypes.macholib.dyld.dropwhile(predicate, iterable) --> dropwhile object\nctypes.macholib.dyld.dyld_default_search(??)\nctypes.macholib.dyld.dyld_env(??)\nctypes.macholib.dyld.dyld_executable_path_search(??)\nctypes.macholib.dyld.dyld_fallback_framework_path(??)\nctypes.macholib.dyld.dyld_fallback_library_path(??)\nctypes.macholib.dyld.dyld_find(??)\nctypes.macholib.dyld.dyld_framework_path(??)\nctypes.macholib.dyld.dyld_image_suffix(??)\nctypes.macholib.dyld.dyld_image_suffix_search(??)\nctypes.macholib.dyld.dyld_library_path(??)\nctypes.macholib.dyld.dyld_override_search(??)\nctypes.macholib.dyld.dylib_info(??)\nctypes.macholib.dyld.filterfalse(function or None, sequence) --> filterfalse object\nctypes.macholib.dyld.framework_find(??)\nctypes.macholib.dyld.framework_info(??)\nctypes.macholib.dyld.groupby(iterable[, keyfunc]) -> create an iterator which returns\nctypes.macholib.dyld.islice(iterable, [start,] stop [, step]) --> islice object\nctypes.macholib.dyld.os(??)\nctypes.macholib.dyld.permutations(iterable[, r]) --> permutations object\nctypes.macholib.dyld.product(*iterables) --> product object\nctypes.macholib.dyld.repeat(object [,times]) -> create an iterator which returns the object\nctypes.macholib.dyld.starmap(function, sequence) --> starmap object\nctypes.macholib.dyld.takewhile(predicate, iterable) --> takewhile object\nctypes.macholib.dyld.tee(iterable, n=2) --> tuple of n independent iterators.\nctypes.macholib.dyld.test_dyld_find(??)\nctypes.macholib.dyld.zip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> zip_longest object\nctypes.macholib.dylib.DYLIB_RE(??)\nctypes.macholib.dylib.dylib_info(??)\nctypes.macholib.dylib.re(??)\nctypes.macholib.dylib.test_dylib_info(??)\nctypes.macholib.framework.STRICT_FRAMEWORK_RE(??)\nctypes.macholib.framework.framework_info(??)\nctypes.macholib.framework.re(??)\nctypes.macholib.framework.test_framework_info(??)\nctypes.memmove(??)\nctypes.memset(??)\nctypes.pointer(??)\nctypes.py_object(??)\nctypes.pydll(??)\nctypes.pythonapi(??)\nctypes.resize(??)\nctypes.set_errno(??)\nctypes.sizeof(C type) -> integer\nctypes.string_at(addr[, size]) -> string\nctypes.util.contextlib(??)\nctypes.util.find_library(??)\nctypes.util.os(??)\nctypes.util.subprocess(??)\nctypes.util.sys(??)\nctypes.util.test(??)\nctypes.wstring_at(addr[, size]) -> string\ncurses.ALL_MOUSE_EVENTS\ncurses.A_ALTCHARSET\ncurses.A_ATTRIBUTES\ncurses.A_BLINK\ncurses.A_BOLD\ncurses.A_CHARTEXT\ncurses.A_COLOR\ncurses.A_DIM\ncurses.A_HORIZONTAL\ncurses.A_INVIS\ncurses.A_LEFT\ncurses.A_LOW\ncurses.A_NORMAL\ncurses.A_PROTECT\ncurses.A_REVERSE\ncurses.A_RIGHT\ncurses.A_STANDOUT\ncurses.A_TOP\ncurses.A_UNDERLINE\ncurses.A_VERTICAL\ncurses.BUTTON1_CLICKED\ncurses.BUTTON1_DOUBLE_CLICKED\ncurses.BUTTON1_PRESSED\ncurses.BUTTON1_RELEASED\ncurses.BUTTON1_TRIPLE_CLICKED\ncurses.BUTTON2_CLICKED\ncurses.BUTTON2_DOUBLE_CLICKED\ncurses.BUTTON2_PRESSED\ncurses.BUTTON2_RELEASED\ncurses.BUTTON2_TRIPLE_CLICKED\ncurses.BUTTON3_CLICKED\ncurses.BUTTON3_DOUBLE_CLICKED\ncurses.BUTTON3_PRESSED\ncurses.BUTTON3_RELEASED\ncurses.BUTTON3_TRIPLE_CLICKED\ncurses.BUTTON4_CLICKED\ncurses.BUTTON4_DOUBLE_CLICKED\ncurses.BUTTON4_PRESSED\ncurses.BUTTON4_RELEASED\ncurses.BUTTON4_TRIPLE_CLICKED\ncurses.BUTTON_ALT\ncurses.BUTTON_CTRL\ncurses.BUTTON_SHIFT\ncurses.COLOR_BLACK\ncurses.COLOR_BLUE\ncurses.COLOR_CYAN\ncurses.COLOR_GREEN\ncurses.COLOR_MAGENTA\ncurses.COLOR_RED\ncurses.COLOR_WHITE\ncurses.COLOR_YELLOW\ncurses.ERR\ncurses.KEY_A1\ncurses.KEY_A3\ncurses.KEY_B2\ncurses.KEY_BACKSPACE\ncurses.KEY_BEG\ncurses.KEY_BREAK\ncurses.KEY_BTAB\ncurses.KEY_C1\ncurses.KEY_C3\ncurses.KEY_CANCEL\ncurses.KEY_CATAB\ncurses.KEY_CLEAR\ncurses.KEY_CLOSE\ncurses.KEY_COMMAND\ncurses.KEY_COPY\ncurses.KEY_CREATE\ncurses.KEY_CTAB\ncurses.KEY_DC\ncurses.KEY_DL\ncurses.KEY_DOWN\ncurses.KEY_EIC\ncurses.KEY_END\ncurses.KEY_ENTER\ncurses.KEY_EOL\ncurses.KEY_EOS\ncurses.KEY_EXIT\ncurses.KEY_F0\ncurses.KEY_F1\ncurses.KEY_F10\ncurses.KEY_F11\ncurses.KEY_F12\ncurses.KEY_F13\ncurses.KEY_F14\ncurses.KEY_F15\ncurses.KEY_F16\ncurses.KEY_F17\ncurses.KEY_F18\ncurses.KEY_F19\ncurses.KEY_F2\ncurses.KEY_F20\ncurses.KEY_F21\ncurses.KEY_F22\ncurses.KEY_F23\ncurses.KEY_F24\ncurses.KEY_F25\ncurses.KEY_F26\ncurses.KEY_F27\ncurses.KEY_F28\ncurses.KEY_F29\ncurses.KEY_F3\ncurses.KEY_F30\ncurses.KEY_F31\ncurses.KEY_F32\ncurses.KEY_F33\ncurses.KEY_F34\ncurses.KEY_F35\ncurses.KEY_F36\ncurses.KEY_F37\ncurses.KEY_F38\ncurses.KEY_F39\ncurses.KEY_F4\ncurses.KEY_F40\ncurses.KEY_F41\ncurses.KEY_F42\ncurses.KEY_F43\ncurses.KEY_F44\ncurses.KEY_F45\ncurses.KEY_F46\ncurses.KEY_F47\ncurses.KEY_F48\ncurses.KEY_F49\ncurses.KEY_F5\ncurses.KEY_F50\ncurses.KEY_F51\ncurses.KEY_F52\ncurses.KEY_F53\ncurses.KEY_F54\ncurses.KEY_F55\ncurses.KEY_F56\ncurses.KEY_F57\ncurses.KEY_F58\ncurses.KEY_F59\ncurses.KEY_F6\ncurses.KEY_F60\ncurses.KEY_F61\ncurses.KEY_F62\ncurses.KEY_F63\ncurses.KEY_F7\ncurses.KEY_F8\ncurses.KEY_F9\ncurses.KEY_FIND\ncurses.KEY_HELP\ncurses.KEY_HOME\ncurses.KEY_IC\ncurses.KEY_IL\ncurses.KEY_LEFT\ncurses.KEY_LL\ncurses.KEY_MARK\ncurses.KEY_MAX\ncurses.KEY_MESSAGE\ncurses.KEY_MIN\ncurses.KEY_MOUSE\ncurses.KEY_MOVE\ncurses.KEY_NEXT\ncurses.KEY_NPAGE\ncurses.KEY_OPEN\ncurses.KEY_OPTIONS\ncurses.KEY_PPAGE\ncurses.KEY_PREVIOUS\ncurses.KEY_PRINT\ncurses.KEY_REDO\ncurses.KEY_REFERENCE\ncurses.KEY_REFRESH\ncurses.KEY_REPLACE\ncurses.KEY_RESET\ncurses.KEY_RESIZE\ncurses.KEY_RESTART\ncurses.KEY_RESUME\ncurses.KEY_RIGHT\ncurses.KEY_SAVE\ncurses.KEY_SBEG\ncurses.KEY_SCANCEL\ncurses.KEY_SCOMMAND\ncurses.KEY_SCOPY\ncurses.KEY_SCREATE\ncurses.KEY_SDC\ncurses.KEY_SDL\ncurses.KEY_SELECT\ncurses.KEY_SEND\ncurses.KEY_SEOL\ncurses.KEY_SEXIT\ncurses.KEY_SF\ncurses.KEY_SFIND\ncurses.KEY_SHELP\ncurses.KEY_SHOME\ncurses.KEY_SIC\ncurses.KEY_SLEFT\ncurses.KEY_SMESSAGE\ncurses.KEY_SMOVE\ncurses.KEY_SNEXT\ncurses.KEY_SOPTIONS\ncurses.KEY_SPREVIOUS\ncurses.KEY_SPRINT\ncurses.KEY_SR\ncurses.KEY_SREDO\ncurses.KEY_SREPLACE\ncurses.KEY_SRESET\ncurses.KEY_SRIGHT\ncurses.KEY_SRSUME\ncurses.KEY_SSAVE\ncurses.KEY_SSUSPEND\ncurses.KEY_STAB\ncurses.KEY_SUNDO\ncurses.KEY_SUSPEND\ncurses.KEY_UNDO\ncurses.KEY_UP\ncurses.OK\ncurses.REPORT_MOUSE_POSITION\ncurses.ascii.ACK\ncurses.ascii.BEL\ncurses.ascii.BS\ncurses.ascii.CAN\ncurses.ascii.CR\ncurses.ascii.DC1\ncurses.ascii.DC2\ncurses.ascii.DC3\ncurses.ascii.DC4\ncurses.ascii.DEL\ncurses.ascii.DLE\ncurses.ascii.EM\ncurses.ascii.ENQ\ncurses.ascii.EOT\ncurses.ascii.ESC\ncurses.ascii.ETB\ncurses.ascii.ETX\ncurses.ascii.FF\ncurses.ascii.FS\ncurses.ascii.GS\ncurses.ascii.HT\ncurses.ascii.LF\ncurses.ascii.NAK\ncurses.ascii.NL\ncurses.ascii.NUL\ncurses.ascii.RS\ncurses.ascii.SI\ncurses.ascii.SO\ncurses.ascii.SOH\ncurses.ascii.SP\ncurses.ascii.STX\ncurses.ascii.SUB\ncurses.ascii.SYN\ncurses.ascii.TAB\ncurses.ascii.US\ncurses.ascii.VT\ncurses.ascii.alt(??)\ncurses.ascii.ascii(??)\ncurses.ascii.controlnames(??)\ncurses.ascii.ctrl(??)\ncurses.ascii.isalnum(??)\ncurses.ascii.isalpha(??)\ncurses.ascii.isascii(??)\ncurses.ascii.isblank(??)\ncurses.ascii.iscntrl(??)\ncurses.ascii.isctrl(??)\ncurses.ascii.isdigit(??)\ncurses.ascii.isgraph(??)\ncurses.ascii.islower(??)\ncurses.ascii.ismeta(??)\ncurses.ascii.isprint(??)\ncurses.ascii.ispunct(??)\ncurses.ascii.isspace(??)\ncurses.ascii.isupper(??)\ncurses.ascii.isxdigit(??)\ncurses.ascii.unctrl(??)\ncurses.baudrate(??)\ncurses.beep(??)\ncurses.can_change_color(??)\ncurses.cbreak(??)\ncurses.color_content(??)\ncurses.color_pair(??)\ncurses.curs_set(??)\ncurses.def_prog_mode(??)\ncurses.def_shell_mode(??)\ncurses.delay_output(??)\ncurses.doupdate(??)\ncurses.echo(??)\ncurses.endwin(??)\ncurses.erasechar(??)\ncurses.error(??)\ncurses.filter(??)\ncurses.flash(??)\ncurses.flushinp(??)\ncurses.getmouse(??)\ncurses.getsyx(??)\ncurses.getwin(??)\ncurses.halfdelay(??)\ncurses.has_colors(??)\ncurses.has_ic(??)\ncurses.has_il(??)\ncurses.has_key(??)\ncurses.has_key.has_key(??)\ncurses.init_color(??)\ncurses.init_pair(??)\ncurses.initscr(??)\ncurses.intrflush(??)\ncurses.is_term_resized(??)\ncurses.isendwin(??)\ncurses.keyname(??)\ncurses.killchar(??)\ncurses.longname(??)\ncurses.meta(??)\ncurses.mouseinterval(??)\ncurses.mousemask(??)\ncurses.napms(??)\ncurses.newpad(??)\ncurses.newwin(??)\ncurses.nl(??)\ncurses.nocbreak(??)\ncurses.noecho(??)\ncurses.nonl(??)\ncurses.noqiflush(??)\ncurses.noraw(??)\ncurses.pair_content(??)\ncurses.pair_number(??)\ncurses.panel.bottom_panel(??)\ncurses.panel.error(??)\ncurses.panel.new_panel(??)\ncurses.panel.top_panel(??)\ncurses.panel.update_panels(??)\ncurses.panel.version\ncurses.putp(??)\ncurses.qiflush(??)\ncurses.raw(??)\ncurses.reset_prog_mode(??)\ncurses.reset_shell_mode(??)\ncurses.resetty(??)\ncurses.resize_term(??)\ncurses.resizeterm(??)\ncurses.savetty(??)\ncurses.setsyx(??)\ncurses.setupterm(??)\ncurses.start_color(??)\ncurses.termattrs(??)\ncurses.termname(??)\ncurses.textpad.Textbox(??)\ncurses.textpad.curses(??)\ncurses.textpad.rectangle(??)\ncurses.tigetflag(??)\ncurses.tigetnum(??)\ncurses.tigetstr(??)\ncurses.tparm(??)\ncurses.typeahead(??)\ncurses.unctrl(??)\ncurses.unget_wch(??)\ncurses.ungetch(??)\ncurses.ungetmouse(??)\ncurses.use_default_colors(??)\ncurses.use_env(??)\ncurses.version\ncurses.wrapper(??)\ndatetime.MAXYEAR\ndatetime.MINYEAR\ndatetime.date(year, month, day) --> date object\ndatetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\ndatetime.datetime_CAPI(??)\ndatetime.time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\ndatetime.timedelta(??)\ndatetime.timezone(??)\ndatetime.tzinfo(??)\ndbm.dumb.collections(??)\ndbm.dumb.error(??)\ndbm.dumb.open(??)\ndbm.error(??)\ndbm.io(??)\ndbm.ndbm.error(??)\ndbm.ndbm.library\ndbm.ndbm.open(path[, flag[, mode]]) -> mapping\ndbm.open(??)\ndbm.os(??)\ndbm.struct(??)\ndbm.sys(??)\ndbm.whichdb(??)\ndecimal.BasicContext(??)\ndecimal.Clamped(??)\ndecimal.Context(??)\ndecimal.ConversionSyntax(??)\ndecimal.Decimal(??)\ndecimal.DecimalException(??)\ndecimal.DecimalTuple(sign, digits, exponent)\ndecimal.DefaultContext(??)\ndecimal.DivisionByZero(??)\ndecimal.DivisionImpossible(??)\ndecimal.DivisionUndefined(??)\ndecimal.ExtendedContext(??)\ndecimal.FloatOperation(??)\ndecimal.HAVE_THREADS(??)\ndecimal.Inexact(??)\ndecimal.InvalidContext(??)\ndecimal.InvalidOperation(??)\ndecimal.MAX_EMAX\ndecimal.MAX_PREC\ndecimal.MIN_EMIN\ndecimal.MIN_ETINY\ndecimal.Overflow(??)\ndecimal.ROUND_05UP\ndecimal.ROUND_CEILING\ndecimal.ROUND_DOWN\ndecimal.ROUND_FLOOR\ndecimal.ROUND_HALF_DOWN\ndecimal.ROUND_HALF_EVEN\ndecimal.ROUND_HALF_UP\ndecimal.ROUND_UP\ndecimal.Rounded(??)\ndecimal.Subnormal(??)\ndecimal.Underflow(??)\ndecimal.getcontext(??)\ndecimal.localcontext(??)\ndecimal.setcontext(??)\ndelattr(object, name)\ndict() -> new empty dictionary\ndifflib.Differ(??)\ndifflib.HtmlDiff(??)\ndifflib.IS_CHARACTER_JUNK(??)\ndifflib.IS_LINE_JUNK(??)\ndifflib.Match(a, b, size)\ndifflib.SequenceMatcher(??)\ndifflib.context_diff(??)\ndifflib.get_close_matches(??)\ndifflib.heapq(??)\ndifflib.ndiff(??)\ndifflib.restore(??)\ndifflib.unified_diff(??)\ndifflib.warnings(??)\ndir([object]) -> list of strings\ndis.COMPILER_FLAG_NAMES(??)\ndis.EXTENDED_ARG\ndis.HAVE_ARGUMENT\ndis.cmp_op(??)\ndis.code_info(??)\ndis.dis(??)\ndis.disassemble(??)\ndis.disco(??)\ndis.distb(??)\ndis.findlabels(??)\ndis.findlinestarts(??)\ndis.hascompare(??)\ndis.hasconst(??)\ndis.hasfree(??)\ndis.hasjabs(??)\ndis.hasjrel(??)\ndis.haslocal(??)\ndis.hasname(??)\ndis.hasnargs(??)\ndis.opmap(??)\ndis.opname(??)\ndis.pretty_flags(??)\ndis.show_code(??)\ndis.sys(??)\ndis.types(??)\ndivmod(x, y) -> (div, mod)\ndoctest.BLANKLINE_MARKER\ndoctest.COMPARISON_FLAGS\ndoctest.DONT_ACCEPT_BLANKLINE\ndoctest.DONT_ACCEPT_TRUE_FOR_1\ndoctest.DebugRunner(??)\ndoctest.DocFileCase(??)\ndoctest.DocFileSuite(??)\ndoctest.DocFileTest(??)\ndoctest.DocTest(??)\ndoctest.DocTestCase(??)\ndoctest.DocTestFailure(??)\ndoctest.DocTestFinder(??)\ndoctest.DocTestParser(??)\ndoctest.DocTestRunner(??)\ndoctest.DocTestSuite(??)\ndoctest.ELLIPSIS\ndoctest.ELLIPSIS_MARKER\ndoctest.Example(??)\ndoctest.IGNORE_EXCEPTION_DETAIL\ndoctest.NORMALIZE_WHITESPACE\ndoctest.OPTIONFLAGS_BY_NAME(??)\ndoctest.OutputChecker(??)\ndoctest.REPORTING_FLAGS\ndoctest.REPORT_CDIFF\ndoctest.REPORT_NDIFF\ndoctest.REPORT_ONLY_FIRST_FAILURE\ndoctest.REPORT_UDIFF\ndoctest.SKIP\ndoctest.SkipDocTestCase(??)\ndoctest.StringIO(??)\ndoctest.TestResults(failed, attempted)\ndoctest.UnexpectedException(??)\ndoctest.debug(??)\ndoctest.debug_script(??)\ndoctest.debug_src(??)\ndoctest.difflib(??)\ndoctest.inspect(??)\ndoctest.linecache(??)\ndoctest.master(??)\ndoctest.namedtuple(??)\ndoctest.os(??)\ndoctest.pdb(??)\ndoctest.re(??)\ndoctest.register_optionflag(??)\ndoctest.run_docstring_examples(??)\ndoctest.script_from_examples(??)\ndoctest.set_unittest_reportflags(??)\ndoctest.sys(??)\ndoctest.testfile(??)\ndoctest.testmod(??)\ndoctest.testsource(??)\ndoctest.traceback(??)\ndoctest.unittest(??)\ndummy_threading.Barrier(??)\ndummy_threading.BoundedSemaphore(??)\ndummy_threading.Condition(??)\ndummy_threading.Event(??)\ndummy_threading.Lock(??)\ndummy_threading.RLock(??)\ndummy_threading.Semaphore(??)\ndummy_threading.Thread(??)\ndummy_threading.ThreadError(??)\ndummy_threading.Timer(??)\ndummy_threading.active_count(??)\ndummy_threading.current_thread(??)\ndummy_threading.enumerate(??)\ndummy_threading.local(??)\ndummy_threading.setprofile(??)\ndummy_threading.settrace(??)\ndummy_threading.stack_size(??)\ndummy_threading.threading(??)\nemail.base64mime(??)\nemail.base64mime.CRLF\nemail.base64mime.EMPTYSTRING\nemail.base64mime.MISC_LEN\nemail.base64mime.NL\nemail.base64mime.a2b_base64(??)\nemail.base64mime.b2a_base64(??)\nemail.base64mime.b64encode(??)\nemail.base64mime.body_decode(??)\nemail.base64mime.body_encode(??)\nemail.base64mime.decode(??)\nemail.base64mime.decodestring(??)\nemail.base64mime.header_encode(??)\nemail.base64mime.header_length(??)\nemail.charset(??)\nemail.charset.ALIASES(??)\nemail.charset.BASE64\nemail.charset.CHARSETS(??)\nemail.charset.CODEC_MAP(??)\nemail.charset.Charset(??)\nemail.charset.DEFAULT_CHARSET\nemail.charset.EMPTYSTRING\nemail.charset.QP\nemail.charset.RFC2047_CHROME_LEN\nemail.charset.SHORTEST\nemail.charset.UNKNOWN8BIT\nemail.charset.add_alias(??)\nemail.charset.add_charset(??)\nemail.charset.add_codec(??)\nemail.charset.email(??)\nemail.charset.encode_7or8bit(??)\nemail.charset.errors(??)\nemail.charset.partial(func, *args, **keywords) - new function with partial application\nemail.encoders(??)\nemail.encoders.encode_7or8bit(??)\nemail.encoders.encode_base64(??)\nemail.encoders.encode_noop(??)\nemail.encoders.encode_quopri(??)\nemail.errors(??)\nemail.errors.BoundaryError(??)\nemail.errors.CharsetError(??)\nemail.errors.CloseBoundaryNotFoundDefect(??)\nemail.errors.FirstHeaderLineIsContinuationDefect(??)\nemail.errors.HeaderDefect(??)\nemail.errors.HeaderMissingRequiredValue(??)\nemail.errors.HeaderParseError(??)\nemail.errors.InvalidBase64CharactersDefect(??)\nemail.errors.InvalidBase64PaddingDefect(??)\nemail.errors.InvalidHeaderDefect(??)\nemail.errors.InvalidMultipartContentTransferEncodingDefect(??)\nemail.errors.MalformedHeaderDefect(??)\nemail.errors.MessageDefect(??)\nemail.errors.MessageError(??)\nemail.errors.MessageParseError(??)\nemail.errors.MisplacedEnvelopeHeaderDefect(??)\nemail.errors.MissingHeaderBodySeparatorDefect(??)\nemail.errors.MultipartConversionError(??)\nemail.errors.MultipartInvariantViolationDefect(??)\nemail.errors.NoBoundaryInMultipartDefect(??)\nemail.errors.NonASCIILocalPartDefect(??)\nemail.errors.NonPrintableDefect(??)\nemail.errors.ObsoleteHeaderDefect(??)\nemail.errors.StartBoundaryNotFoundDefect(??)\nemail.errors.UndecodableBytesDefect(??)\nemail.feedparser(??)\nemail.feedparser.BufferedSubFile(??)\nemail.feedparser.BytesFeedParser(??)\nemail.feedparser.EMPTYSTRING\nemail.feedparser.FeedParser(??)\nemail.feedparser.NL\nemail.feedparser.NLCRE(??)\nemail.feedparser.NLCRE_bol(??)\nemail.feedparser.NLCRE_crack(??)\nemail.feedparser.NLCRE_eol(??)\nemail.feedparser.NeedMoreData(??)\nemail.feedparser.compat32(??)\nemail.feedparser.errors(??)\nemail.feedparser.headerRE(??)\nemail.feedparser.message(??)\nemail.feedparser.re(??)\nemail.generator.BytesGenerator(??)\nemail.generator.BytesIO([buffer]) -> object\nemail.generator.DecodedGenerator(??)\nemail.generator.Generator(??)\nemail.generator.Header(??)\nemail.generator.NL\nemail.generator.StringIO(??)\nemail.generator.UNDERSCORE\nemail.generator.compat32(??)\nemail.generator.fcre(??)\nemail.generator.random(??)\nemail.generator.re(??)\nemail.generator.sys(??)\nemail.generator.time(??)\nemail.generator.warnings(??)\nemail.header(??)\nemail.header.BSPACE\nemail.header.Charset(??)\nemail.header.EMPTYSTRING\nemail.header.FWS\nemail.header.Header(??)\nemail.header.HeaderParseError(??)\nemail.header.MAXLINELEN\nemail.header.NL\nemail.header.SPACE\nemail.header.SPACE8\nemail.header.USASCII(??)\nemail.header.UTF8(??)\nemail.header.binascii(??)\nemail.header.decode_header(??)\nemail.header.ecre(??)\nemail.header.email(??)\nemail.header.fcre(??)\nemail.header.make_header(??)\nemail.header.re(??)\nemail.headerregistry.Address(??)\nemail.headerregistry.AddressHeader(??)\nemail.headerregistry.BaseHeader(??)\nemail.headerregistry.ContentDispositionHeader(??)\nemail.headerregistry.ContentTransferEncodingHeader(??)\nemail.headerregistry.ContentTypeHeader(??)\nemail.headerregistry.DateHeader(??)\nemail.headerregistry.Group(??)\nemail.headerregistry.HeaderRegistry(??)\nemail.headerregistry.MIMEVersionHeader(??)\nemail.headerregistry.ParameterizedMIMEHeader(??)\nemail.headerregistry.SingleAddressHeader(??)\nemail.headerregistry.UniqueAddressHeader(??)\nemail.headerregistry.UniqueDateHeader(??)\nemail.headerregistry.UniqueSingleAddressHeader(??)\nemail.headerregistry.UniqueUnstructuredHeader(??)\nemail.headerregistry.UnstructuredHeader(??)\nemail.headerregistry.errors(??)\nemail.headerregistry.parser(??)\nemail.headerregistry.utils(??)\nemail.iterators(??)\nemail.iterators.StringIO(??)\nemail.iterators.body_line_iterator(??)\nemail.iterators.sys(??)\nemail.iterators.typed_subpart_iterator(??)\nemail.iterators.walk(??)\nemail.message(??)\nemail.message.BytesIO([buffer]) -> object\nemail.message.Charset(??)\nemail.message.Message(??)\nemail.message.SEMISPACE\nemail.message.StringIO(??)\nemail.message.base64(??)\nemail.message.binascii(??)\nemail.message.compat32(??)\nemail.message.decode_b(??)\nemail.message.errors(??)\nemail.message.re(??)\nemail.message.tspecials(??)\nemail.message.utils(??)\nemail.message.uu(??)\nemail.message_from_binary_file(??)\nemail.message_from_bytes(??)\nemail.message_from_file(??)\nemail.message_from_string(??)\nemail.mime.application.MIMEApplication(??)\nemail.mime.application.MIMENonMultipart(??)\nemail.mime.application.encoders(??)\nemail.mime.audio.BytesIO([buffer]) -> object\nemail.mime.audio.MIMEAudio(??)\nemail.mime.audio.MIMENonMultipart(??)\nemail.mime.audio.encoders(??)\nemail.mime.audio.sndhdr(??)\nemail.mime.base.MIMEBase(??)\nemail.mime.base.message(??)\nemail.mime.image.MIMEImage(??)\nemail.mime.image.MIMENonMultipart(??)\nemail.mime.image.encoders(??)\nemail.mime.image.imghdr(??)\nemail.mime.message.MIMEMessage(??)\nemail.mime.message.MIMENonMultipart(??)\nemail.mime.message.message(??)\nemail.mime.multipart.MIMEBase(??)\nemail.mime.multipart.MIMEMultipart(??)\nemail.mime.nonmultipart.MIMEBase(??)\nemail.mime.nonmultipart.MIMENonMultipart(??)\nemail.mime.nonmultipart.errors(??)\nemail.mime.text.MIMENonMultipart(??)\nemail.mime.text.MIMEText(??)\nemail.mime.text.encode_7or8bit(??)\nemail.parser(??)\nemail.parser.BytesHeaderParser(??)\nemail.parser.BytesParser(??)\nemail.parser.FeedParser(??)\nemail.parser.HeaderParser(??)\nemail.parser.Message(??)\nemail.parser.Parser(??)\nemail.parser.StringIO(??)\nemail.parser.TextIOWrapper(??)\nemail.parser.compat32(??)\nemail.parser.warnings(??)\nemail.policy.Compat32(??)\nemail.policy.EmailPolicy(??)\nemail.policy.HTTP(??)\nemail.policy.HeaderRegistry(??)\nemail.policy.Policy(??)\nemail.policy.SMTP(??)\nemail.policy.compat32(??)\nemail.policy.default(??)\nemail.policy.strict(??)\nemail.quoprimime(??)\nemail.quoprimime.CRLF\nemail.quoprimime.EMPTYSTRING\nemail.quoprimime.NL\nemail.quoprimime.ascii_letters\nemail.quoprimime.body_check(??)\nemail.quoprimime.body_decode(??)\nemail.quoprimime.body_encode(??)\nemail.quoprimime.body_length(??)\nemail.quoprimime.c\nemail.quoprimime.decode(??)\nemail.quoprimime.decodestring(??)\nemail.quoprimime.digits\nemail.quoprimime.header_check(??)\nemail.quoprimime.header_decode(??)\nemail.quoprimime.header_encode(??)\nemail.quoprimime.header_length(??)\nemail.quoprimime.hexdigits\nemail.quoprimime.io(??)\nemail.quoprimime.quote(??)\nemail.quoprimime.re(??)\nemail.quoprimime.unquote(??)\nemail.utils(??)\nemail.utils.COMMASPACE\nemail.utils.CRLF\nemail.utils.Charset(??)\nemail.utils.EMPTYSTRING\nemail.utils.StringIO(??)\nemail.utils.TICK\nemail.utils.UEMPTYSTRING\nemail.utils.base64(??)\nemail.utils.collapse_rfc2231_value(??)\nemail.utils.datetime(??)\nemail.utils.decode_params(??)\nemail.utils.decode_rfc2231(??)\nemail.utils.ecre(??)\nemail.utils.encode_rfc2231(??)\nemail.utils.escapesre(??)\nemail.utils.format_datetime(??)\nemail.utils.formataddr(??)\nemail.utils.formatdate(??)\nemail.utils.getaddresses(??)\nemail.utils.localtime(??)\nemail.utils.make_msgid(??)\nemail.utils.mktime_tz(??)\nemail.utils.os(??)\nemail.utils.parseaddr(??)\nemail.utils.parsedate(??)\nemail.utils.parsedate_to_datetime(??)\nemail.utils.parsedate_tz(??)\nemail.utils.quote(??)\nemail.utils.random(??)\nemail.utils.re(??)\nemail.utils.rfc2231_continuation(??)\nemail.utils.socket(??)\nemail.utils.specialsre(??)\nemail.utils.time(??)\nemail.utils.unquote(??)\nemail.utils.urllib(??)\nemail.utils.warnings(??)\nenumerate(iterable[, start]) -> iterator for index, value of iterable\nerrno.E2BIG\nerrno.EACCES\nerrno.EADDRINUSE\nerrno.EADDRNOTAVAIL\nerrno.EAFNOSUPPORT\nerrno.EAGAIN\nerrno.EALREADY\nerrno.EAUTH\nerrno.EBADARCH\nerrno.EBADEXEC\nerrno.EBADF\nerrno.EBADMACHO\nerrno.EBADMSG\nerrno.EBADRPC\nerrno.EBUSY\nerrno.ECANCELED\nerrno.ECHILD\nerrno.ECONNABORTED\nerrno.ECONNREFUSED\nerrno.ECONNRESET\nerrno.EDEADLK\nerrno.EDESTADDRREQ\nerrno.EDEVERR\nerrno.EDOM\nerrno.EDQUOT\nerrno.EEXIST\nerrno.EFAULT\nerrno.EFBIG\nerrno.EFTYPE\nerrno.EHOSTDOWN\nerrno.EHOSTUNREACH\nerrno.EIDRM\nerrno.EILSEQ\nerrno.EINPROGRESS\nerrno.EINTR\nerrno.EINVAL\nerrno.EIO\nerrno.EISCONN\nerrno.EISDIR\nerrno.ELOOP\nerrno.EMFILE\nerrno.EMLINK\nerrno.EMSGSIZE\nerrno.EMULTIHOP\nerrno.ENAMETOOLONG\nerrno.ENEEDAUTH\nerrno.ENETDOWN\nerrno.ENETRESET\nerrno.ENETUNREACH\nerrno.ENFILE\nerrno.ENOATTR\nerrno.ENOBUFS\nerrno.ENODATA\nerrno.ENODEV\nerrno.ENOENT\nerrno.ENOEXEC\nerrno.ENOLCK\nerrno.ENOLINK\nerrno.ENOMEM\nerrno.ENOMSG\nerrno.ENOPOLICY\nerrno.ENOPROTOOPT\nerrno.ENOSPC\nerrno.ENOSR\nerrno.ENOSTR\nerrno.ENOSYS\nerrno.ENOTBLK\nerrno.ENOTCONN\nerrno.ENOTDIR\nerrno.ENOTEMPTY\nerrno.ENOTSOCK\nerrno.ENOTSUP\nerrno.ENOTTY\nerrno.ENXIO\nerrno.EOPNOTSUPP\nerrno.EOVERFLOW\nerrno.EPERM\nerrno.EPFNOSUPPORT\nerrno.EPIPE\nerrno.EPROCLIM\nerrno.EPROCUNAVAIL\nerrno.EPROGMISMATCH\nerrno.EPROGUNAVAIL\nerrno.EPROTO\nerrno.EPROTONOSUPPORT\nerrno.EPROTOTYPE\nerrno.EPWROFF\nerrno.ERANGE\nerrno.EREMOTE\nerrno.EROFS\nerrno.ERPCMISMATCH\nerrno.ESHLIBVERS\nerrno.ESHUTDOWN\nerrno.ESOCKTNOSUPPORT\nerrno.ESPIPE\nerrno.ESRCH\nerrno.ESTALE\nerrno.ETIME\nerrno.ETIMEDOUT\nerrno.ETOOMANYREFS\nerrno.ETXTBSY\nerrno.EUSERS\nerrno.EWOULDBLOCK\nerrno.EXDEV\nerrno.errorcode(??)\neval(source[, globals[, locals]]) -> value\nexec(object[, globals[, locals]])\nexit(??)\nfaulthandler.cancel_dump_traceback_later():\nfaulthandler.disable(): disable the fault handler\nfaulthandler.dump_traceback(file=sys.stderr, all_threads=True): dump the traceback of the current thread, or of all threads if all_threads is True, into file\nfaulthandler.dump_traceback_later(timeout, repeat=False, file=sys.stderrn, exit=False):\nfaulthandler.enable(file=sys.stderr, all_threads=True): enable the fault handler\nfaulthandler.is_enabled()->bool: check if the handler is enabled\nfaulthandler.register(signum, file=sys.stderr, all_threads=True, chain=False): register an handler for the signal 'signum': dump the traceback of the current thread, or of all threads if all_threads is True, into file\nfaulthandler.unregister(signum): unregister the handler of the signal 'signum' registered by register()\nfcntl.FASYNC\nfcntl.FD_CLOEXEC\nfcntl.F_DUPFD\nfcntl.F_FULLFSYNC\nfcntl.F_GETFD\nfcntl.F_GETFL\nfcntl.F_GETLK\nfcntl.F_GETOWN\nfcntl.F_NOCACHE\nfcntl.F_RDLCK\nfcntl.F_SETFD\nfcntl.F_SETFL\nfcntl.F_SETLK\nfcntl.F_SETLKW\nfcntl.F_SETOWN\nfcntl.F_UNLCK\nfcntl.F_WRLCK\nfcntl.LOCK_EX\nfcntl.LOCK_NB\nfcntl.LOCK_SH\nfcntl.LOCK_UN\nfcntl.fcntl(fd, opt, [arg])\nfcntl.flock(fd, operation)\nfcntl.ioctl(fd, opt[, arg[, mutate_flag]])\nfcntl.lockf (fd, operation, length=0, start=0, whence=0)\nfilecmp.BUFSIZE\nfilecmp.cmp(??)\nfilecmp.cmpfiles(??)\nfilecmp.demo(??)\nfilecmp.dircmp(??)\nfilecmp.filterfalse(function or None, sequence) --> filterfalse object\nfilecmp.os(??)\nfilecmp.stat(??)\nfileinput.DEFAULT_BUFSIZE\nfileinput.FileInput(??)\nfileinput.close(??)\nfileinput.filelineno(??)\nfileinput.filename(??)\nfileinput.fileno(??)\nfileinput.hook_compressed(??)\nfileinput.hook_encoded(??)\nfileinput.input(files=None, inplace=False, backup=\"\", bufsize=0, mode=\"r\", openhook=None)\nfileinput.isfirstline(??)\nfileinput.isstdin(??)\nfileinput.lineno(??)\nfileinput.nextfile(??)\nfileinput.os(??)\nfileinput.sys(??)\nfilter(function or None, iterable) --> filter object\nfloat(x) -> floating point number\nfnmatch.filter(??)\nfnmatch.fnmatch(??)\nfnmatch.fnmatchcase(??)\nfnmatch.functools(??)\nfnmatch.os(??)\nfnmatch.posixpath(??)\nfnmatch.re(??)\nfnmatch.translate(??)\nformat(value[, format_spec]) -> string\nformatter.AS_IS(??)\nformatter.AbstractFormatter(??)\nformatter.AbstractWriter(??)\nformatter.DumbWriter(??)\nformatter.NullFormatter(??)\nformatter.NullWriter(??)\nformatter.sys(??)\nformatter.test(??)\nfractions.Decimal(??)\nfractions.Fraction(??)\nfractions.gcd(??)\nfractions.math(??)\nfractions.numbers(??)\nfractions.operator(??)\nfractions.re(??)\nfractions.sys(??)\nfrozenset() -> empty frozenset object\nftplib.B_CRLF\nftplib.CRLF\nftplib.Error(??)\nftplib.FTP(??)\nftplib.FTP_PORT\nftplib.FTP_TLS(??)\nftplib.MSG_OOB\nftplib.Netrc(??)\nftplib.all_errors(??)\nftplib.error_perm(??)\nftplib.error_proto(??)\nftplib.error_reply(??)\nftplib.error_temp(??)\nftplib.ftpcp(??)\nftplib.os(??)\nftplib.parse150(??)\nftplib.parse227(??)\nftplib.parse229(??)\nftplib.parse257(??)\nftplib.print_line(??)\nftplib.socket(??)\nftplib.ssl(??)\nftplib.sys(??)\nftplib.test(??)\nfunctools.Lock(??)\nfunctools.WRAPPER_ASSIGNMENTS(??)\nfunctools.WRAPPER_UPDATES(??)\nfunctools.cmp_to_key(??)\nfunctools.lru_cache(??)\nfunctools.namedtuple(??)\nfunctools.partial(func, *args, **keywords) - new function with partial application\nfunctools.reduce(function, sequence[, initial]) -> value\nfunctools.total_ordering(??)\nfunctools.update_wrapper(??)\nfunctools.wraps(??)\ngc.DEBUG_COLLECTABLE\ngc.DEBUG_LEAK\ngc.DEBUG_SAVEALL\ngc.DEBUG_STATS\ngc.DEBUG_UNCOLLECTABLE\ngc.callbacks(??)\ngc.collect([generation]) -> n\ngc.disable() -> None\ngc.enable() -> None\ngc.garbage(??)\ngc.get_count() -> (count0, count1, count2)\ngc.get_debug() -> flags\ngc.get_objects() -> [...]\ngc.get_referents(*objs) -> list\ngc.get_referrers(*objs) -> list\ngc.get_threshold() -> (threshold0, threshold1, threshold2)\ngc.is_tracked(obj) -> bool\ngc.isenabled() -> status\ngc.set_debug(flags) -> None\ngc.set_threshold(threshold0, [threshold1, threshold2]) -> None\ngenericpath.commonprefix(??)\ngenericpath.exists(??)\ngenericpath.getatime(??)\ngenericpath.getctime(??)\ngenericpath.getmtime(??)\ngenericpath.getsize(??)\ngenericpath.isdir(??)\ngenericpath.isfile(??)\ngenericpath.os(??)\ngenericpath.stat(??)\ngetattr(object, name[, default]) -> value\ngetopt.GetoptError(??)\ngetopt.do_longs(??)\ngetopt.do_shorts(??)\ngetopt.error(??)\ngetopt.getopt(args, options[, long_options]) -> opts, args\ngetopt.gnu_getopt(??)\ngetopt.long_has_args(??)\ngetopt.os(??)\ngetopt.short_has_arg(??)\ngetpass.GetPassWarning(??)\ngetpass.fallback_getpass(??)\ngetpass.getpass(??)\ngetpass.getuser(??)\ngetpass.os(??)\ngetpass.sys(??)\ngetpass.termios(??)\ngetpass.unix_getpass(??)\ngetpass.warnings(??)\ngetpass.win_getpass(??)\ngettext.Catalog(??)\ngettext.ENOENT\ngettext.GNUTranslations(??)\ngettext.NullTranslations(??)\ngettext.bind_textdomain_codeset(??)\ngettext.bindtextdomain(??)\ngettext.c2py(??)\ngettext.copy(??)\ngettext.dgettext(??)\ngettext.dngettext(??)\ngettext.find(??)\ngettext.gettext(??)\ngettext.install(??)\ngettext.io(??)\ngettext.ldgettext(??)\ngettext.ldngettext(??)\ngettext.lgettext(??)\ngettext.lngettext(??)\ngettext.locale(??)\ngettext.ngettext(??)\ngettext.os(??)\ngettext.re(??)\ngettext.struct(??)\ngettext.sys(??)\ngettext.textdomain(??)\ngettext.translation(??)\nglob.fnmatch(??)\nglob.glob(??)\nglob.glob0(??)\nglob.glob1(??)\nglob.has_magic(??)\nglob.iglob(??)\nglob.magic_check(??)\nglob.magic_check_bytes(??)\nglob.os(??)\nglob.re(??)\nglobals() -> dictionary\ngrp.getgrall() -> list of tuples\ngrp.getgrgid(id) -> tuple\ngrp.getgrnam(name) -> tuple\ngrp.struct_group(??)\ngzip.FCOMMENT\ngzip.FEXTRA\ngzip.FHCRC\ngzip.FNAME\ngzip.FTEXT\ngzip.GzipFile(??)\ngzip.READ\ngzip.WRITE\ngzip.builtins(??)\ngzip.compress(??)\ngzip.decompress(??)\ngzip.io(??)\ngzip.open(??)\ngzip.os(??)\ngzip.read32(??)\ngzip.struct(??)\ngzip.sys(??)\ngzip.time(??)\ngzip.write32u(??)\ngzip.zlib(??)\nhasattr(object, name) -> bool\nhash(object) -> integer\nhashlib.algorithms_available(??)\nhashlib.algorithms_guaranteed(??)\nhashlib.md5(??)\nhashlib.new(name, data=b'') - Return a new hashing object using the named algorithm;\nhashlib.sha1(??)\nhashlib.sha224(??)\nhashlib.sha256(??)\nhashlib.sha384(??)\nhashlib.sha512(??)\nheapq.bisect(??)\nheapq.chain(*iterables) --> chain object\nheapq.count(start=0, step=1) --> count object\nheapq.heapify(??)\nheapq.heappop(??)\nheapq.heappush(??)\nheapq.heappushpop(??)\nheapq.heapreplace(??)\nheapq.islice(iterable, [start,] stop [, step]) --> islice object\nheapq.merge(??)\nheapq.nlargest(??)\nheapq.nsmallest(??)\nheapq.repeat(object [,times]) -> create an iterator which returns the object\nheapq.tee(iterable, n=2) --> tuple of n independent iterators.\nhelp(??)\nhex(number) -> string\nhmac.HMAC(??)\nhmac.compare_digest(a, b) -> bool\nhmac.digest_size(??)\nhmac.new(??)\nhmac.trans_36\nhmac.trans_5C\nhtml.entities.codepoint2name(??)\nhtml.entities.entitydefs(??)\nhtml.entities.html5(??)\nhtml.entities.name2codepoint(??)\nhtml.escape(??)\nhtml.parser.HTMLParseError(??)\nhtml.parser.HTMLParser(??)\nhtml.parser.attrfind(??)\nhtml.parser.attrfind_tolerant(??)\nhtml.parser.charref(??)\nhtml.parser.commentclose(??)\nhtml.parser.endendtag(??)\nhtml.parser.endtagfind(??)\nhtml.parser.entityref(??)\nhtml.parser.incomplete(??)\nhtml.parser.interesting_normal(??)\nhtml.parser.locatestarttagend(??)\nhtml.parser.locatestarttagend_tolerant(??)\nhtml.parser.piclose(??)\nhtml.parser.re(??)\nhtml.parser.starttagopen(??)\nhtml.parser.tagfind(??)\nhtml.parser.tagfind_tolerant(??)\nhtml.parser.warnings(??)\nhttp.client.ACCEPTED\nhttp.client.BAD_GATEWAY\nhttp.client.BAD_REQUEST\nhttp.client.BadStatusLine(??)\nhttp.client.CONFLICT\nhttp.client.CONTINUE\nhttp.client.CREATED\nhttp.client.CannotSendHeader(??)\nhttp.client.CannotSendRequest(??)\nhttp.client.EXPECTATION_FAILED\nhttp.client.FAILED_DEPENDENCY\nhttp.client.FORBIDDEN\nhttp.client.FOUND\nhttp.client.GATEWAY_TIMEOUT\nhttp.client.GONE\nhttp.client.HTTPConnection(??)\nhttp.client.HTTPException(??)\nhttp.client.HTTPMessage(??)\nhttp.client.HTTPResponse(??)\nhttp.client.HTTPSConnection(??)\nhttp.client.HTTPS_PORT\nhttp.client.HTTP_PORT\nhttp.client.HTTP_VERSION_NOT_SUPPORTED\nhttp.client.IM_USED\nhttp.client.INSUFFICIENT_STORAGE\nhttp.client.INTERNAL_SERVER_ERROR\nhttp.client.ImproperConnectionState(??)\nhttp.client.IncompleteRead(??)\nhttp.client.InvalidURL(??)\nhttp.client.LENGTH_REQUIRED\nhttp.client.LOCKED\nhttp.client.LineTooLong(??)\nhttp.client.MAXAMOUNT\nhttp.client.METHOD_NOT_ALLOWED\nhttp.client.MOVED_PERMANENTLY\nhttp.client.MULTIPLE_CHOICES\nhttp.client.MULTI_STATUS\nhttp.client.NETWORK_AUTHENTICATION_REQUIRED\nhttp.client.NON_AUTHORITATIVE_INFORMATION\nhttp.client.NOT_ACCEPTABLE\nhttp.client.NOT_EXTENDED\nhttp.client.NOT_FOUND\nhttp.client.NOT_IMPLEMENTED\nhttp.client.NOT_MODIFIED\nhttp.client.NO_CONTENT\nhttp.client.NotConnected(??)\nhttp.client.OK\nhttp.client.PARTIAL_CONTENT\nhttp.client.PAYMENT_REQUIRED\nhttp.client.PRECONDITION_FAILED\nhttp.client.PRECONDITION_REQUIRED\nhttp.client.PROCESSING\nhttp.client.PROXY_AUTHENTICATION_REQUIRED\nhttp.client.REQUESTED_RANGE_NOT_SATISFIABLE\nhttp.client.REQUEST_ENTITY_TOO_LARGE\nhttp.client.REQUEST_HEADER_FIELDS_TOO_LARGE\nhttp.client.REQUEST_TIMEOUT\nhttp.client.REQUEST_URI_TOO_LONG\nhttp.client.RESET_CONTENT\nhttp.client.ResponseNotReady(??)\nhttp.client.SEE_OTHER\nhttp.client.SERVICE_UNAVAILABLE\nhttp.client.SWITCHING_PROTOCOLS\nhttp.client.TEMPORARY_REDIRECT\nhttp.client.TOO_MANY_REQUESTS\nhttp.client.UNAUTHORIZED\nhttp.client.UNPROCESSABLE_ENTITY\nhttp.client.UNSUPPORTED_MEDIA_TYPE\nhttp.client.UPGRADE_REQUIRED\nhttp.client.USE_PROXY\nhttp.client.UnimplementedFileMode(??)\nhttp.client.UnknownProtocol(??)\nhttp.client.UnknownTransferEncoding(??)\nhttp.client.collections(??)\nhttp.client.email(??)\nhttp.client.error(??)\nhttp.client.io(??)\nhttp.client.os(??)\nhttp.client.parse_headers(??)\nhttp.client.responses(??)\nhttp.client.socket(??)\nhttp.client.ssl(??)\nhttp.client.urlsplit(??)\nhttp.client.warnings(??)\nhttp.cookiejar.Absent(??)\nhttp.cookiejar.Cookie(??)\nhttp.cookiejar.CookieJar(??)\nhttp.cookiejar.CookiePolicy(??)\nhttp.cookiejar.DAYS(??)\nhttp.cookiejar.DEFAULT_HTTP_PORT\nhttp.cookiejar.DefaultCookiePolicy(??)\nhttp.cookiejar.EPOCH_YEAR\nhttp.cookiejar.ESCAPED_CHAR_RE(??)\nhttp.cookiejar.FileCookieJar(??)\nhttp.cookiejar.HEADER_ESCAPE_RE(??)\nhttp.cookiejar.HEADER_JOIN_ESCAPE_RE(??)\nhttp.cookiejar.HEADER_QUOTED_VALUE_RE(??)\nhttp.cookiejar.HEADER_TOKEN_RE(??)\nhttp.cookiejar.HEADER_VALUE_RE(??)\nhttp.cookiejar.HTTP_PATH_SAFE\nhttp.cookiejar.IPV4_RE(??)\nhttp.cookiejar.ISO_DATE_RE(??)\nhttp.cookiejar.LOOSE_HTTP_DATE_RE(??)\nhttp.cookiejar.LWPCookieJar(??)\nhttp.cookiejar.LoadError(??)\nhttp.cookiejar.MISSING_FILENAME_TEXT\nhttp.cookiejar.MONTHS(??)\nhttp.cookiejar.MONTHS_LOWER(??)\nhttp.cookiejar.MozillaCookieJar(??)\nhttp.cookiejar.STRICT_DATE_RE(??)\nhttp.cookiejar.TIMEZONE_RE(??)\nhttp.cookiejar.UTC_ZONES(??)\nhttp.cookiejar.WEEKDAY_RE(??)\nhttp.cookiejar.copy(??)\nhttp.cookiejar.cut_port_re(??)\nhttp.cookiejar.datetime(??)\nhttp.cookiejar.debug(??)\nhttp.cookiejar.deepvalues(??)\nhttp.cookiejar.domain_match(??)\nhttp.cookiejar.eff_request_host(??)\nhttp.cookiejar.escape_path(??)\nhttp.cookiejar.http(??)\nhttp.cookiejar.http2time(??)\nhttp.cookiejar.is_HDN(??)\nhttp.cookiejar.is_third_party(??)\nhttp.cookiejar.iso2time(??)\nhttp.cookiejar.join_header_words(??)\nhttp.cookiejar.liberal_is_HDN(??)\nhttp.cookiejar.logger(??)\nhttp.cookiejar.lwp_cookie_str(??)\nhttp.cookiejar.month\nhttp.cookiejar.offset_from_tz_string(??)\nhttp.cookiejar.parse_ns_headers(??)\nhttp.cookiejar.re(??)\nhttp.cookiejar.reach(??)\nhttp.cookiejar.request_host(??)\nhttp.cookiejar.request_path(??)\nhttp.cookiejar.request_port(??)\nhttp.cookiejar.split_header_words(??)\nhttp.cookiejar.strip_quotes(??)\nhttp.cookiejar.time(??)\nhttp.cookiejar.time2isoz(??)\nhttp.cookiejar.time2netscape(??)\nhttp.cookiejar.timegm(??)\nhttp.cookiejar.unmatched(??)\nhttp.cookiejar.uppercase_escaped_char(??)\nhttp.cookiejar.urllib(??)\nhttp.cookiejar.user_domain_match(??)\nhttp.cookiejar.vals_sorted_by_key(??)\nhttp.cookies.BaseCookie(??)\nhttp.cookies.CookieError(??)\nhttp.cookies.Morsel(??)\nhttp.cookies.SimpleCookie(??)\nhttp.cookies.re(??)\nhttp.cookies.string(??)\nhttp.server.BaseHTTPRequestHandler(??)\nhttp.server.CGIHTTPRequestHandler(??)\nhttp.server.DEFAULT_ERROR_CONTENT_TYPE\nhttp.server.DEFAULT_ERROR_MESSAGE\nhttp.server.HTTPServer(??)\nhttp.server.SimpleHTTPRequestHandler(??)\nhttp.server.argparse(??)\nhttp.server.copy(??)\nhttp.server.email(??)\nhttp.server.executable(??)\nhttp.server.html(??)\nhttp.server.http(??)\nhttp.server.io(??)\nhttp.server.mimetypes(??)\nhttp.server.nobody(??)\nhttp.server.nobody_uid(??)\nhttp.server.os(??)\nhttp.server.posixpath(??)\nhttp.server.select(??)\nhttp.server.shutil(??)\nhttp.server.socket(??)\nhttp.server.socketserver(??)\nhttp.server.sys(??)\nhttp.server.test(??)\nhttp.server.time(??)\nhttp.server.urllib(??)\nid(object) -> integer\nimaplib.AllowedVersions(??)\nimaplib.CRLF\nimaplib.Commands(??)\nimaplib.Continuation(??)\nimaplib.Debug\nimaplib.Flags(??)\nimaplib.HAVE_SSL(??)\nimaplib.IMAP4(??)\nimaplib.IMAP4_PORT\nimaplib.IMAP4_SSL(??)\nimaplib.IMAP4_SSL_PORT\nimaplib.IMAP4_stream(??)\nimaplib.Int2AP(??)\nimaplib.InternalDate(??)\nimaplib.Internaldate2tuple(??)\nimaplib.Literal(??)\nimaplib.MapCRLF(??)\nimaplib.Mon2num(??)\nimaplib.Months(??)\nimaplib.ParseFlags(??)\nimaplib.Response_code(??)\nimaplib.Time2Internaldate(??)\nimaplib.Untagged_response(??)\nimaplib.Untagged_status(??)\nimaplib.binascii(??)\nimaplib.calendar(??)\nimaplib.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\nimaplib.errno(??)\nimaplib.random(??)\nimaplib.re(??)\nimaplib.socket(??)\nimaplib.ssl(??)\nimaplib.subprocess(??)\nimaplib.sys(??)\nimaplib.time(??)\nimaplib.timedelta(??)\nimaplib.timezone(??)\nimghdr.test(??)\nimghdr.test_bmp(??)\nimghdr.test_gif(??)\nimghdr.test_jpeg(??)\nimghdr.test_pbm(??)\nimghdr.test_pgm(??)\nimghdr.test_png(??)\nimghdr.test_ppm(??)\nimghdr.test_rast(??)\nimghdr.test_rgb(??)\nimghdr.test_tiff(??)\nimghdr.test_xbm(??)\nimghdr.testall(??)\nimghdr.tests(??)\nimghdr.what(??)\nimp.C_BUILTIN\nimp.C_EXTENSION\nimp.IMP_HOOK\nimp.NullImporter(??)\nimp.PKG_DIRECTORY\nimp.PY_CODERESOURCE\nimp.PY_COMPILED\nimp.PY_FROZEN\nimp.PY_RESOURCE\nimp.PY_SOURCE\nimp.SEARCH_ERROR\nimp.acquire_lock() -> None\nimp.cache_from_source(??)\nimp.find_module(??)\nimp.get_frozen_object(??)\nimp.get_magic(??)\nimp.get_suffixes(??)\nimp.get_tag(??)\nimp.init_builtin(??)\nimp.init_frozen(??)\nimp.is_builtin(??)\nimp.is_frozen(??)\nimp.is_frozen_package(??)\nimp.load_compiled(??)\nimp.load_dynamic(??)\nimp.load_module(??)\nimp.load_package(??)\nimp.load_source(??)\nimp.lock_held() -> boolean\nimp.machinery(??)\nimp.new_module(??)\nimp.os(??)\nimp.release_lock() -> None\nimp.reload(??)\nimp.source_from_cache(??)\nimp.sys(??)\nimp.tokenize(??)\nimp.warnings(??)\nimportlib.abc.ExecutionLoader(??)\nimportlib.abc.FileLoader(??)\nimportlib.abc.Finder(??)\nimportlib.abc.InspectLoader(??)\nimportlib.abc.Loader(??)\nimportlib.abc.MetaPathFinder(??)\nimportlib.abc.PathEntryFinder(??)\nimportlib.abc.PyLoader(??)\nimportlib.abc.PyPycLoader(??)\nimportlib.abc.ResourceLoader(??)\nimportlib.abc.SourceLoader(??)\nimportlib.abc.abc(??)\nimportlib.abc.imp(??)\nimportlib.abc.machinery(??)\nimportlib.abc.marshal(??)\nimportlib.abc.sys(??)\nimportlib.abc.tokenize(??)\nimportlib.abc.warnings(??)\nimportlib.find_loader(??)\nimportlib.import_module(??)\nimportlib.invalidate_caches(??)\nimportlib.machinery(??)\nimportlib.machinery.BYTECODE_SUFFIXES(??)\nimportlib.machinery.BuiltinImporter(??)\nimportlib.machinery.DEBUG_BYTECODE_SUFFIXES(??)\nimportlib.machinery.EXTENSION_SUFFIXES(??)\nimportlib.machinery.ExtensionFileLoader(??)\nimportlib.machinery.FileFinder(??)\nimportlib.machinery.FrozenImporter(??)\nimportlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES(??)\nimportlib.machinery.PathFinder(??)\nimportlib.machinery.SOURCE_SUFFIXES(??)\nimportlib.machinery.SourceFileLoader(??)\nimportlib.machinery.SourcelessFileLoader(??)\nimportlib.machinery.WindowsRegistryFinder(??)\nimportlib.machinery.all_suffixes(??)\nimportlib.sys(??)\nimportlib.util.module_for_loader(??)\nimportlib.util.resolve_name(??)\nimportlib.util.set_loader(??)\nimportlib.util.set_package(??)\ninput([prompt]) -> string\ninspect.ArgInfo(args, varargs, keywords, locals)\ninspect.ArgSpec(args, varargs, keywords, defaults)\ninspect.Arguments(args, varargs, varkw)\ninspect.Attribute(name, kind, defining_class, object)\ninspect.BlockFinder(??)\ninspect.BoundArguments(??)\ninspect.CO_GENERATOR\ninspect.CO_NESTED\ninspect.CO_NEWLOCALS\ninspect.CO_NOFREE\ninspect.CO_OPTIMIZED\ninspect.CO_VARARGS\ninspect.CO_VARKEYWORDS\ninspect.ClosureVars(nonlocals, globals, builtins, unbound)\ninspect.EndOfBlock(??)\ninspect.FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)\ninspect.GEN_CLOSED\ninspect.GEN_CREATED\ninspect.GEN_RUNNING\ninspect.GEN_SUSPENDED\ninspect.ModuleInfo(name, suffix, mode, module_type)\ninspect.OrderedDict(??)\ninspect.Parameter(??)\ninspect.Signature(??)\ninspect.TPFLAGS_IS_ABSTRACT\ninspect.Traceback(filename, lineno, function, code_context, index)\ninspect.attrgetter(attr, ...) --> attrgetter object\ninspect.builtins(??)\ninspect.classify_class_attrs(??)\ninspect.cleandoc(??)\ninspect.currentframe(??)\ninspect.findsource(??)\ninspect.formatannotation(??)\ninspect.formatannotationrelativeto(??)\ninspect.formatargspec(??)\ninspect.formatargvalues(??)\ninspect.functools(??)\ninspect.getabsfile(??)\ninspect.getargs(??)\ninspect.getargspec(??)\ninspect.getargvalues(??)\ninspect.getattr_static(??)\ninspect.getblock(??)\ninspect.getcallargs(??)\ninspect.getclasstree(??)\ninspect.getclosurevars(??)\ninspect.getcomments(??)\ninspect.getdoc(??)\ninspect.getfile(??)\ninspect.getframeinfo(??)\ninspect.getfullargspec(??)\ninspect.getgeneratorlocals(??)\ninspect.getgeneratorstate(??)\ninspect.getinnerframes(??)\ninspect.getlineno(??)\ninspect.getmembers(??)\ninspect.getmodule(??)\ninspect.getmoduleinfo(??)\ninspect.getmodulename(??)\ninspect.getmro(??)\ninspect.getouterframes(??)\ninspect.getsource(??)\ninspect.getsourcefile(??)\ninspect.getsourcelines(??)\ninspect.imp(??)\ninspect.importlib(??)\ninspect.indentsize(??)\ninspect.isabstract(??)\ninspect.isbuiltin(??)\ninspect.isclass(??)\ninspect.iscode(??)\ninspect.isdatadescriptor(??)\ninspect.isframe(??)\ninspect.isfunction(??)\ninspect.isgenerator(??)\ninspect.isgeneratorfunction(??)\ninspect.isgetsetdescriptor(??)\ninspect.ismemberdescriptor(??)\ninspect.ismethod(??)\ninspect.ismethoddescriptor(??)\ninspect.ismodule(??)\ninspect.isroutine(??)\ninspect.istraceback(??)\ninspect.itertools(??)\ninspect.k\ninspect.linecache(??)\ninspect.mod_dict(??)\ninspect.modulesbyfile(??)\ninspect.namedtuple(??)\ninspect.os(??)\ninspect.re(??)\ninspect.signature(??)\ninspect.stack(??)\ninspect.sys(??)\ninspect.tokenize(??)\ninspect.trace(??)\ninspect.types(??)\ninspect.v\ninspect.walktree(??)\ninspect.warnings(??)\nint(x[, base]) -> integer\nio.BlockingIOError(??)\nio.BufferedIOBase(??)\nio.BufferedRWPair(??)\nio.BufferedRandom(??)\nio.BufferedReader(??)\nio.BufferedWriter(??)\nio.BytesIO([buffer]) -> object\nio.DEFAULT_BUFFER_SIZE\nio.FileIO(??)\nio.IOBase(??)\nio.IncrementalNewlineDecoder(??)\nio.OpenWrapper(??)\nio.RawIOBase(??)\nio.SEEK_CUR\nio.SEEK_END\nio.SEEK_SET\nio.StringIO(??)\nio.TextIOBase(??)\nio.TextIOWrapper(??)\nio.UnsupportedOperation(??)\nio.abc(??)\nio.open(??)\nipaddress.AddressValueError(??)\nipaddress.IPV4LENGTH\nipaddress.IPV6LENGTH\nipaddress.IPv4Address(??)\nipaddress.IPv4Interface(??)\nipaddress.IPv4Network(??)\nipaddress.IPv6Address(??)\nipaddress.IPv6Interface(??)\nipaddress.IPv6Network(??)\nipaddress.NetmaskValueError(??)\nipaddress.collapse_addresses(??)\nipaddress.functools(??)\nipaddress.get_mixed_type_key(??)\nipaddress.ip_address(??)\nipaddress.ip_interface(??)\nipaddress.ip_network(??)\nipaddress.summarize_address_range(??)\nipaddress.v4_int_to_packed(??)\nipaddress.v6_int_to_packed(??)\nisinstance(object, class-or-type-or-tuple) -> bool\nissubclass(C, B) -> bool\niter(iterable) -> iterator\nitertools.accumulate(iterable[, func]) --> accumulate object\nitertools.chain(*iterables) --> chain object\nitertools.combinations(iterable, r) --> combinations object\nitertools.combinations_with_replacement(iterable, r) --> combinations_with_replacement object\nitertools.compress(data, selectors) --> iterator over selected data\nitertools.count(start=0, step=1) --> count object\nitertools.cycle(iterable) --> cycle object\nitertools.dropwhile(predicate, iterable) --> dropwhile object\nitertools.filterfalse(function or None, sequence) --> filterfalse object\nitertools.groupby(iterable[, keyfunc]) -> create an iterator which returns\nitertools.islice(iterable, [start,] stop [, step]) --> islice object\nitertools.permutations(iterable[, r]) --> permutations object\nitertools.product(*iterables) --> product object\nitertools.repeat(object [,times]) -> create an iterator which returns the object\nitertools.starmap(function, sequence) --> starmap object\nitertools.takewhile(predicate, iterable) --> takewhile object\nitertools.tee(iterable, n=2) --> tuple of n independent iterators.\nitertools.zip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> zip_longest object\njson.JSONDecoder(??)\njson.JSONEncoder(??)\njson.decoder(??)\njson.decoder.BACKSLASH(??)\njson.decoder.FLAGS\njson.decoder.JSONArray(??)\njson.decoder.JSONDecoder(??)\njson.decoder.JSONObject(??)\njson.decoder.NaN\njson.decoder.NegInf\njson.decoder.PosInf\njson.decoder.STRINGCHUNK(??)\njson.decoder.WHITESPACE(??)\njson.decoder.WHITESPACE_STR\njson.decoder.binascii(??)\njson.decoder.c_scanstring(??)\njson.decoder.errmsg(??)\njson.decoder.linecol(??)\njson.decoder.py_scanstring(??)\njson.decoder.re(??)\njson.decoder.scanner(??)\njson.decoder.scanstring(string, end, strict=True) -> (string, end)\njson.decoder.struct(??)\njson.decoder.sys(??)\njson.dump(??)\njson.dumps(??)\njson.encoder(??)\njson.encoder.ESCAPE(??)\njson.encoder.ESCAPE_ASCII(??)\njson.encoder.ESCAPE_DCT(??)\njson.encoder.FLOAT_REPR(??)\njson.encoder.HAS_UTF8(??)\njson.encoder.INFINITY\njson.encoder.JSONEncoder(??)\njson.encoder.c_encode_basestring_ascii(??)\njson.encoder.c_make_encoder(??)\njson.encoder.encode_basestring(??)\njson.encoder.encode_basestring_ascii(string) -> string\njson.encoder.i\njson.encoder.py_encode_basestring_ascii(??)\njson.encoder.re(??)\njson.load(??)\njson.loads(??)\njson.scanner(??)\njson.scanner.NUMBER_RE(??)\njson.scanner.c_make_scanner(??)\njson.scanner.make_scanner(??)\njson.scanner.py_make_scanner(??)\njson.scanner.re(??)\njson.tool.json(??)\njson.tool.main(??)\njson.tool.sys(??)\nkeyword.iskeyword(??)\nkeyword.kwlist(??)\nkeyword.main(??)\nlen(object) -> integer\nlicense(??)\nlinecache.cache(??)\nlinecache.checkcache(??)\nlinecache.clearcache(??)\nlinecache.getline(??)\nlinecache.getlines(??)\nlinecache.os(??)\nlinecache.sys(??)\nlinecache.tokenize(??)\nlinecache.updatecache(??)\nlist() -> new empty list\nlocale.ABDAY_1\nlocale.ABDAY_2\nlocale.ABDAY_3\nlocale.ABDAY_4\nlocale.ABDAY_5\nlocale.ABDAY_6\nlocale.ABDAY_7\nlocale.ABMON_1\nlocale.ABMON_10\nlocale.ABMON_11\nlocale.ABMON_12\nlocale.ABMON_2\nlocale.ABMON_3\nlocale.ABMON_4\nlocale.ABMON_5\nlocale.ABMON_6\nlocale.ABMON_7\nlocale.ABMON_8\nlocale.ABMON_9\nlocale.ALT_DIGITS\nlocale.AM_STR\nlocale.CHAR_MAX\nlocale.CODESET\nlocale.CRNCYSTR\nlocale.DAY_1\nlocale.DAY_2\nlocale.DAY_3\nlocale.DAY_4\nlocale.DAY_5\nlocale.DAY_6\nlocale.DAY_7\nlocale.D_FMT\nlocale.D_T_FMT\nlocale.ERA\nlocale.ERA_D_FMT\nlocale.ERA_D_T_FMT\nlocale.ERA_T_FMT\nlocale.Error(??)\nlocale.LC_ALL\nlocale.LC_COLLATE\nlocale.LC_CTYPE\nlocale.LC_MESSAGES\nlocale.LC_MONETARY\nlocale.LC_NUMERIC\nlocale.LC_TIME\nlocale.MON_1\nlocale.MON_10\nlocale.MON_11\nlocale.MON_12\nlocale.MON_2\nlocale.MON_3\nlocale.MON_4\nlocale.MON_5\nlocale.MON_6\nlocale.MON_7\nlocale.MON_8\nlocale.MON_9\nlocale.NOEXPR\nlocale.PM_STR\nlocale.RADIXCHAR\nlocale.THOUSEP\nlocale.T_FMT\nlocale.T_FMT_AMPM\nlocale.YESEXPR\nlocale.atof(??)\nlocale.atoi(??)\nlocale.collections(??)\nlocale.currency(??)\nlocale.encodings(??)\nlocale.format(??)\nlocale.format_string(??)\nlocale.functools(??)\nlocale.getdefaultlocale(??)\nlocale.getlocale(??)\nlocale.getpreferredencoding(??)\nlocale.locale_alias(??)\nlocale.locale_encoding_alias(??)\nlocale.localeconv(??)\nlocale.nl_langinfo(key) -> string\nlocale.normalize(??)\nlocale.re(??)\nlocale.resetlocale(??)\nlocale.setlocale(??)\nlocale.str(??)\nlocale.strcoll(??)\nlocale.strxfrm(string) -> string.\nlocale.sys(??)\nlocale.windows_locale(??)\nlocals() -> dictionary\nlogging.BASIC_FORMAT\nlogging.BufferingFormatter(??)\nlogging.CRITICAL\nlogging.DEBUG\nlogging.ERROR\nlogging.FATAL\nlogging.FileHandler(??)\nlogging.Filter(??)\nlogging.Filterer(??)\nlogging.Formatter(??)\nlogging.Handler(??)\nlogging.INFO\nlogging.LogRecord(??)\nlogging.Logger(??)\nlogging.LoggerAdapter(??)\nlogging.Manager(??)\nlogging.NOTSET\nlogging.NullHandler(??)\nlogging.PercentStyle(??)\nlogging.PlaceHolder(??)\nlogging.RootLogger(??)\nlogging.StrFormatStyle(??)\nlogging.StreamHandler(??)\nlogging.StringTemplateStyle(??)\nlogging.Template(??)\nlogging.WARN\nlogging.WARNING\nlogging.addLevelName(??)\nlogging.atexit(??)\nlogging.basicConfig(??)\nlogging.captureWarnings(??)\nlogging.config.BaseConfigurator(??)\nlogging.config.ConvertingDict(??)\nlogging.config.ConvertingList(??)\nlogging.config.ConvertingTuple(??)\nlogging.config.DEFAULT_LOGGING_CONFIG_PORT\nlogging.config.DictConfigurator(??)\nlogging.config.IDENTIFIER(??)\nlogging.config.RESET_ERROR\nlogging.config.StreamRequestHandler(??)\nlogging.config.ThreadingTCPServer(??)\nlogging.config.dictConfig(??)\nlogging.config.dictConfigClass(??)\nlogging.config.fileConfig(??)\nlogging.config.io(??)\nlogging.config.listen(??)\nlogging.config.logging(??)\nlogging.config.re(??)\nlogging.config.socket(??)\nlogging.config.stopListening(??)\nlogging.config.struct(??)\nlogging.config.sys(??)\nlogging.config.thread(??)\nlogging.config.threading(??)\nlogging.config.traceback(??)\nlogging.config.valid_ident(??)\nlogging.critical(??)\nlogging.currentframe(??)\nlogging.debug(??)\nlogging.disable(??)\nlogging.error(??)\nlogging.exception(??)\nlogging.fatal(??)\nlogging.getLevelName(??)\nlogging.getLogRecordFactory(??)\nlogging.getLogger(??)\nlogging.getLoggerClass(??)\nlogging.handlers.BOM_UTF8\nlogging.handlers.BaseRotatingHandler(??)\nlogging.handlers.BufferingHandler(??)\nlogging.handlers.DEFAULT_HTTP_LOGGING_PORT\nlogging.handlers.DEFAULT_SOAP_LOGGING_PORT\nlogging.handlers.DEFAULT_TCP_LOGGING_PORT\nlogging.handlers.DEFAULT_UDP_LOGGING_PORT\nlogging.handlers.DatagramHandler(??)\nlogging.handlers.HTTPHandler(??)\nlogging.handlers.MemoryHandler(??)\nlogging.handlers.NTEventLogHandler(??)\nlogging.handlers.QueueHandler(??)\nlogging.handlers.QueueListener(??)\nlogging.handlers.RotatingFileHandler(??)\nlogging.handlers.SMTPHandler(??)\nlogging.handlers.ST_DEV\nlogging.handlers.ST_INO\nlogging.handlers.ST_MTIME\nlogging.handlers.SYSLOG_TCP_PORT\nlogging.handlers.SYSLOG_UDP_PORT\nlogging.handlers.SocketHandler(??)\nlogging.handlers.SysLogHandler(??)\nlogging.handlers.TimedRotatingFileHandler(??)\nlogging.handlers.WatchedFileHandler(??)\nlogging.handlers.errno(??)\nlogging.handlers.logging(??)\nlogging.handlers.os(??)\nlogging.handlers.pickle(??)\nlogging.handlers.queue(??)\nlogging.handlers.re(??)\nlogging.handlers.socket(??)\nlogging.handlers.struct(??)\nlogging.handlers.threading(??)\nlogging.handlers.time(??)\nlogging.info(??)\nlogging.io(??)\nlogging.lastResort(??)\nlogging.log(??)\nlogging.logMultiprocessing(??)\nlogging.logProcesses(??)\nlogging.logThreads(??)\nlogging.makeLogRecord(??)\nlogging.os(??)\nlogging.raiseExceptions(??)\nlogging.root(??)\nlogging.setLogRecordFactory(??)\nlogging.setLoggerClass(??)\nlogging.shutdown(??)\nlogging.sys(??)\nlogging.threading(??)\nlogging.time(??)\nlogging.traceback(??)\nlogging.warn(??)\nlogging.warning(??)\nlogging.warnings(??)\nlogging.weakref(??)\nlzma.CHECK_CRC32\nlzma.CHECK_CRC64\nlzma.CHECK_ID_MAX\nlzma.CHECK_NONE\nlzma.CHECK_SHA256\nlzma.CHECK_UNKNOWN\nlzma.FILTER_ARM\nlzma.FILTER_ARMTHUMB\nlzma.FILTER_DELTA\nlzma.FILTER_IA64\nlzma.FILTER_LZMA1\nlzma.FILTER_LZMA2\nlzma.FILTER_POWERPC\nlzma.FILTER_SPARC\nlzma.FILTER_X86\nlzma.FORMAT_ALONE\nlzma.FORMAT_AUTO\nlzma.FORMAT_RAW\nlzma.FORMAT_XZ\nlzma.LZMACompressor(format=FORMAT_XZ, check=-1, preset=None, filters=None)\nlzma.LZMADecompressor(format=FORMAT_AUTO, memlimit=None, filters=None)\nlzma.LZMAError(??)\nlzma.LZMAFile(??)\nlzma.MF_BT2\nlzma.MF_BT3\nlzma.MF_BT4\nlzma.MF_HC3\nlzma.MF_HC4\nlzma.MODE_FAST\nlzma.MODE_NORMAL\nlzma.PRESET_DEFAULT\nlzma.PRESET_EXTREME\nlzma.builtins(??)\nlzma.compress(??)\nlzma.decompress(??)\nlzma.io(??)\nlzma.is_check_supported(check_id) -> bool\nlzma.open(??)\nmacpath.SF_APPEND\nmacpath.SF_ARCHIVED\nmacpath.SF_IMMUTABLE\nmacpath.SF_NOUNLINK\nmacpath.SF_SNAPSHOT\nmacpath.ST_ATIME\nmacpath.ST_CTIME\nmacpath.ST_DEV\nmacpath.ST_GID\nmacpath.ST_INO\nmacpath.ST_MODE\nmacpath.ST_MTIME\nmacpath.ST_NLINK\nmacpath.ST_SIZE\nmacpath.ST_UID\nmacpath.S_ENFMT\nmacpath.S_IEXEC\nmacpath.S_IFBLK\nmacpath.S_IFCHR\nmacpath.S_IFDIR\nmacpath.S_IFIFO\nmacpath.S_IFLNK\nmacpath.S_IFMT(??)\nmacpath.S_IFREG\nmacpath.S_IFSOCK\nmacpath.S_IMODE(??)\nmacpath.S_IREAD\nmacpath.S_IRGRP\nmacpath.S_IROTH\nmacpath.S_IRUSR\nmacpath.S_IRWXG\nmacpath.S_IRWXO\nmacpath.S_IRWXU\nmacpath.S_ISBLK(??)\nmacpath.S_ISCHR(??)\nmacpath.S_ISDIR(??)\nmacpath.S_ISFIFO(??)\nmacpath.S_ISGID\nmacpath.S_ISLNK(??)\nmacpath.S_ISREG(??)\nmacpath.S_ISSOCK(??)\nmacpath.S_ISUID\nmacpath.S_ISVTX\nmacpath.S_IWGRP\nmacpath.S_IWOTH\nmacpath.S_IWRITE\nmacpath.S_IWUSR\nmacpath.S_IXGRP\nmacpath.S_IXOTH\nmacpath.S_IXUSR\nmacpath.UF_APPEND\nmacpath.UF_COMPRESSED\nmacpath.UF_HIDDEN\nmacpath.UF_IMMUTABLE\nmacpath.UF_NODUMP\nmacpath.UF_NOUNLINK\nmacpath.UF_OPAQUE\nmacpath.abspath(??)\nmacpath.altsep(??)\nmacpath.basename(??)\nmacpath.commonprefix(??)\nmacpath.curdir\nmacpath.defpath\nmacpath.devnull\nmacpath.dirname(??)\nmacpath.exists(??)\nmacpath.expanduser(??)\nmacpath.expandvars(??)\nmacpath.extsep\nmacpath.filemode(??)\nmacpath.genericpath(??)\nmacpath.getatime(??)\nmacpath.getctime(??)\nmacpath.getmtime(??)\nmacpath.getsize(??)\nmacpath.isabs(??)\nmacpath.isdir(??)\nmacpath.isfile(??)\nmacpath.islink(??)\nmacpath.ismount(??)\nmacpath.join(??)\nmacpath.lexists(??)\nmacpath.norm_error(??)\nmacpath.normcase(??)\nmacpath.normpath(??)\nmacpath.os(??)\nmacpath.pardir\nmacpath.pathsep\nmacpath.realpath(??)\nmacpath.sep\nmacpath.split(??)\nmacpath.splitdrive(??)\nmacpath.splitext(??)\nmacpath.supports_unicode_filenames(??)\nmacurl2path.os(??)\nmacurl2path.pathname2url(??)\nmacurl2path.test(??)\nmacurl2path.url2pathname(??)\nmacurl2path.urllib(??)\nmailbox.Babyl(??)\nmailbox.BabylMessage(??)\nmailbox.Error(??)\nmailbox.ExternalClashError(??)\nmailbox.FormatError(??)\nmailbox.MH(??)\nmailbox.MHMessage(??)\nmailbox.MMDF(??)\nmailbox.MMDFMessage(??)\nmailbox.Mailbox(??)\nmailbox.Maildir(??)\nmailbox.MaildirMessage(??)\nmailbox.Message(??)\nmailbox.NoSuchMailboxError(??)\nmailbox.NotEmptyError(??)\nmailbox.calendar(??)\nmailbox.contextlib(??)\nmailbox.copy(??)\nmailbox.email(??)\nmailbox.errno(??)\nmailbox.fcntl(??)\nmailbox.io(??)\nmailbox.linesep\nmailbox.mbox(??)\nmailbox.mboxMessage(??)\nmailbox.os(??)\nmailbox.socket(??)\nmailbox.sys(??)\nmailbox.time(??)\nmailbox.warnings(??)\nmailcap.findmatch(??)\nmailcap.findparam(??)\nmailcap.getcaps(??)\nmailcap.listmailcapfiles(??)\nmailcap.lookup(??)\nmailcap.os(??)\nmailcap.parsefield(??)\nmailcap.parseline(??)\nmailcap.readmailcapfile(??)\nmailcap.show(??)\nmailcap.subst(??)\nmailcap.test(??)\nmap(func, *iterables) --> map object\nmarshal.dump(value, file[, version])\nmarshal.dumps(value[, version])\nmarshal.load(file)\nmarshal.loads(bytes)\nmarshal.version\nmath.acos(x)\nmath.acosh(x)\nmath.asin(x)\nmath.asinh(x)\nmath.atan(x)\nmath.atan2(y, x)\nmath.atanh(x)\nmath.ceil(x)\nmath.copysign(x, y)\nmath.cos(x)\nmath.cosh(x)\nmath.degrees(x)\nmath.e\nmath.erf(x)\nmath.erfc(x)\nmath.exp(x)\nmath.expm1(x)\nmath.fabs(x)\nmath.factorial(x) -> Integral\nmath.floor(x)\nmath.fmod(x, y)\nmath.frexp(x)\nmath.fsum(iterable)\nmath.gamma(x)\nmath.hypot(x, y)\nmath.isfinite(x) -> bool\nmath.isinf(x) -> bool\nmath.isnan(x) -> bool\nmath.ldexp(x, i)\nmath.lgamma(x)\nmath.log(x[, base])\nmath.log10(x)\nmath.log1p(x)\nmath.log2(x)\nmath.modf(x)\nmath.pi\nmath.pow(x, y)\nmath.radians(x)\nmath.sin(x)\nmath.sinh(x)\nmath.sqrt(x)\nmath.tan(x)\nmath.tanh(x)\nmath.trunc(x:Real) -> Integral\nmax(iterable[, key=func]) -> value\nmemoryview(object)\nmimetypes.MimeTypes(??)\nmimetypes.add_type(??)\nmimetypes.common_types(??)\nmimetypes.encodings_map(??)\nmimetypes.guess_all_extensions(??)\nmimetypes.guess_extension(??)\nmimetypes.guess_type(??)\nmimetypes.init(??)\nmimetypes.inited(??)\nmimetypes.knownfiles(??)\nmimetypes.os(??)\nmimetypes.posixpath(??)\nmimetypes.read_mime_types(??)\nmimetypes.suffix_map(??)\nmimetypes.sys(??)\nmimetypes.types_map(??)\nmimetypes.urllib(??)\nmin(iterable[, key=func]) -> value\nmmap.ACCESS_COPY\nmmap.ACCESS_READ\nmmap.ACCESS_WRITE\nmmap.ALLOCATIONGRANULARITY\nmmap.MAP_ANON\nmmap.MAP_ANONYMOUS\nmmap.MAP_PRIVATE\nmmap.MAP_SHARED\nmmap.PAGESIZE\nmmap.PROT_EXEC\nmmap.PROT_READ\nmmap.PROT_WRITE\nmmap.error(??)\nmmap.mmap(??)\nmodulefinder.AddPackagePath(??)\nmodulefinder.HAVE_ARGUMENT\nmodulefinder.IMPORT_NAME\nmodulefinder.LOAD_CONST\nmodulefinder.Module(??)\nmodulefinder.ModuleFinder(??)\nmodulefinder.ReplacePackage(??)\nmodulefinder.STORE_GLOBAL\nmodulefinder.STORE_NAME\nmodulefinder.STORE_OPS(??)\nmodulefinder.dis(??)\nmodulefinder.imp(??)\nmodulefinder.marshal(??)\nmodulefinder.os(??)\nmodulefinder.packagePathMap(??)\nmodulefinder.replacePackageMap(??)\nmodulefinder.struct(??)\nmodulefinder.sys(??)\nmodulefinder.test(??)\nmodulefinder.types(??)\nmultiprocessing.Array(??)\nmultiprocessing.AuthenticationError(??)\nmultiprocessing.Barrier(??)\nmultiprocessing.BoundedSemaphore(??)\nmultiprocessing.BufferTooShort(??)\nmultiprocessing.Condition(??)\nmultiprocessing.Event(??)\nmultiprocessing.JoinableQueue(??)\nmultiprocessing.Lock(??)\nmultiprocessing.Manager(??)\nmultiprocessing.Pipe(??)\nmultiprocessing.Pool(??)\nmultiprocessing.Process(??)\nmultiprocessing.ProcessError(??)\nmultiprocessing.Queue(??)\nmultiprocessing.RLock(??)\nmultiprocessing.RawArray(??)\nmultiprocessing.RawValue(??)\nmultiprocessing.SUBDEBUG\nmultiprocessing.SUBWARNING\nmultiprocessing.Semaphore(??)\nmultiprocessing.SimpleQueue(??)\nmultiprocessing.TimeoutError(??)\nmultiprocessing.Value(??)\nmultiprocessing.active_children(??)\nmultiprocessing.allow_connection_pickling(??)\nmultiprocessing.connection(??)\nmultiprocessing.connection.AuthenticationError(??)\nmultiprocessing.connection.BUFSIZE\nmultiprocessing.connection.BufferTooShort(??)\nmultiprocessing.connection.CHALLENGE\nmultiprocessing.connection.CONNECTION_TIMEOUT\nmultiprocessing.connection.Client(??)\nmultiprocessing.connection.Connection(??)\nmultiprocessing.connection.ConnectionWrapper(??)\nmultiprocessing.connection.FAILURE\nmultiprocessing.connection.Finalize(??)\nmultiprocessing.connection.ForkingPickler(??)\nmultiprocessing.connection.Listener(??)\nmultiprocessing.connection.MESSAGE_LENGTH\nmultiprocessing.connection.Pipe(??)\nmultiprocessing.connection.SocketClient(??)\nmultiprocessing.connection.SocketListener(??)\nmultiprocessing.connection.WELCOME\nmultiprocessing.connection.XmlClient(??)\nmultiprocessing.connection.XmlListener(??)\nmultiprocessing.connection.address_type(??)\nmultiprocessing.connection.answer_challenge(??)\nmultiprocessing.connection.arbitrary_address(??)\nmultiprocessing.connection.current_process(??)\nmultiprocessing.connection.debug(??)\nmultiprocessing.connection.default_family\nmultiprocessing.connection.deliver_challenge(??)\nmultiprocessing.connection.errno(??)\nmultiprocessing.connection.families(??)\nmultiprocessing.connection.get_temp_dir(??)\nmultiprocessing.connection.io(??)\nmultiprocessing.connection.itertools(??)\nmultiprocessing.connection.os(??)\nmultiprocessing.connection.pickle(??)\nmultiprocessing.connection.reduction(??)\nmultiprocessing.connection.select(??)\nmultiprocessing.connection.socket(??)\nmultiprocessing.connection.struct(??)\nmultiprocessing.connection.sub_debug(??)\nmultiprocessing.connection.sys(??)\nmultiprocessing.connection.tempfile(??)\nmultiprocessing.connection.time(??)\nmultiprocessing.connection.wait(??)\nmultiprocessing.cpu_count(??)\nmultiprocessing.current_process(??)\nmultiprocessing.dummy.Array(??)\nmultiprocessing.dummy.Barrier(??)\nmultiprocessing.dummy.BoundedSemaphore(??)\nmultiprocessing.dummy.Condition(??)\nmultiprocessing.dummy.DummyProcess(??)\nmultiprocessing.dummy.Event(??)\nmultiprocessing.dummy.JoinableQueue(??)\nmultiprocessing.dummy.Lock(??)\nmultiprocessing.dummy.Manager(??)\nmultiprocessing.dummy.Namespace(??)\nmultiprocessing.dummy.Pipe(??)\nmultiprocessing.dummy.Pool(??)\nmultiprocessing.dummy.Process(??)\nmultiprocessing.dummy.Queue(??)\nmultiprocessing.dummy.RLock(??)\nmultiprocessing.dummy.Semaphore(??)\nmultiprocessing.dummy.Value(??)\nmultiprocessing.dummy.active_children(??)\nmultiprocessing.dummy.array(??)\nmultiprocessing.dummy.connection(??)\nmultiprocessing.dummy.connection.Client(??)\nmultiprocessing.dummy.connection.Connection(??)\nmultiprocessing.dummy.connection.Listener(??)\nmultiprocessing.dummy.connection.Pipe(??)\nmultiprocessing.dummy.connection.Queue(??)\nmultiprocessing.dummy.connection.families(??)\nmultiprocessing.dummy.current_process(??)\nmultiprocessing.dummy.dict() -> new empty dictionary\nmultiprocessing.dummy.freeze_support(??)\nmultiprocessing.dummy.list() -> new empty list\nmultiprocessing.dummy.shutdown(??)\nmultiprocessing.dummy.sys(??)\nmultiprocessing.dummy.threading(??)\nmultiprocessing.dummy.weakref(??)\nmultiprocessing.forking(??)\nmultiprocessing.forking.ForkingPickler(??)\nmultiprocessing.forking.Pickler(file, protocol=None)\nmultiprocessing.forking.Popen(??)\nmultiprocessing.forking.assert_spawning(??)\nmultiprocessing.forking.close(fd)\nmultiprocessing.forking.dispatch_table(??)\nmultiprocessing.forking.duplicate(??)\nmultiprocessing.forking.old_main_modules(??)\nmultiprocessing.forking.os(??)\nmultiprocessing.forking.partial(func, *args, **keywords) - new function with partial application\nmultiprocessing.forking.prepare(??)\nmultiprocessing.forking.process(??)\nmultiprocessing.forking.signal(??)\nmultiprocessing.forking.sys(??)\nmultiprocessing.forking.util(??)\nmultiprocessing.freeze_support(??)\nmultiprocessing.get_logger(??)\nmultiprocessing.heap.Arena(??)\nmultiprocessing.heap.BufferWrapper(??)\nmultiprocessing.heap.Finalize(??)\nmultiprocessing.heap.Heap(??)\nmultiprocessing.heap.assert_spawning(??)\nmultiprocessing.heap.bisect(??)\nmultiprocessing.heap.info(??)\nmultiprocessing.heap.itertools(??)\nmultiprocessing.heap.mmap(??)\nmultiprocessing.heap.os(??)\nmultiprocessing.heap.sys(??)\nmultiprocessing.heap.threading(??)\nmultiprocessing.log_to_stderr(??)\nmultiprocessing.managers.AcquirerProxy(??)\nmultiprocessing.managers.Array(??)\nmultiprocessing.managers.ArrayProxy(??)\nmultiprocessing.managers.AuthenticationString(??)\nmultiprocessing.managers.AutoProxy(??)\nmultiprocessing.managers.BarrierProxy(??)\nmultiprocessing.managers.BaseListProxy(??)\nmultiprocessing.managers.BaseManager(??)\nmultiprocessing.managers.BaseProxy(??)\nmultiprocessing.managers.ConditionProxy(??)\nmultiprocessing.managers.DictProxy(??)\nmultiprocessing.managers.EventProxy(??)\nmultiprocessing.managers.ForkingPickler(??)\nmultiprocessing.managers.IteratorProxy(??)\nmultiprocessing.managers.ListProxy(??)\nmultiprocessing.managers.MakeProxyType(??)\nmultiprocessing.managers.Namespace(??)\nmultiprocessing.managers.NamespaceProxy(??)\nmultiprocessing.managers.Pool(??)\nmultiprocessing.managers.PoolProxy(??)\nmultiprocessing.managers.Popen(??)\nmultiprocessing.managers.Process(??)\nmultiprocessing.managers.ProcessLocalSet(??)\nmultiprocessing.managers.RebuildProxy(??)\nmultiprocessing.managers.RemoteError(??)\nmultiprocessing.managers.Server(??)\nmultiprocessing.managers.State(??)\nmultiprocessing.managers.SyncManager(??)\nmultiprocessing.managers.Token(??)\nmultiprocessing.managers.Value(??)\nmultiprocessing.managers.ValueProxy(??)\nmultiprocessing.managers.active_children(??)\nmultiprocessing.managers.all_methods(??)\nmultiprocessing.managers.array(??)\nmultiprocessing.managers.connection(??)\nmultiprocessing.managers.convert_to_error(??)\nmultiprocessing.managers.copyreg(??)\nmultiprocessing.managers.current_process(??)\nmultiprocessing.managers.dispatch(??)\nmultiprocessing.managers.format_exc(??)\nmultiprocessing.managers.listener_client(??)\nmultiprocessing.managers.public_methods(??)\nmultiprocessing.managers.queue(??)\nmultiprocessing.managers.rebuild_as_list(??)\nmultiprocessing.managers.reduce_array(??)\nmultiprocessing.managers.sys(??)\nmultiprocessing.managers.threading(??)\nmultiprocessing.managers.util(??)\nmultiprocessing.managers.view_type(??)\nmultiprocessing.managers.view_types(??)\nmultiprocessing.os(??)\nmultiprocessing.pool.ApplyResult(??)\nmultiprocessing.pool.CLOSE\nmultiprocessing.pool.Finalize(??)\nmultiprocessing.pool.IMapIterator(??)\nmultiprocessing.pool.IMapUnorderedIterator(??)\nmultiprocessing.pool.MapResult(??)\nmultiprocessing.pool.MaybeEncodingError(??)\nmultiprocessing.pool.Pool(??)\nmultiprocessing.pool.Process(??)\nmultiprocessing.pool.RUN\nmultiprocessing.pool.TERMINATE\nmultiprocessing.pool.ThreadPool(??)\nmultiprocessing.pool.TimeoutError(??)\nmultiprocessing.pool.collections(??)\nmultiprocessing.pool.cpu_count(??)\nmultiprocessing.pool.debug(??)\nmultiprocessing.pool.itertools(??)\nmultiprocessing.pool.job_counter(??)\nmultiprocessing.pool.mapstar(??)\nmultiprocessing.pool.queue(??)\nmultiprocessing.pool.starmapstar(??)\nmultiprocessing.pool.threading(??)\nmultiprocessing.pool.time(??)\nmultiprocessing.pool.worker(??)\nmultiprocessing.process(??)\nmultiprocessing.process.AuthenticationString(??)\nmultiprocessing.process.ORIGINAL_DIR\nmultiprocessing.process.Process(??)\nmultiprocessing.process.WeakSet(??)\nmultiprocessing.process.active_children(??)\nmultiprocessing.process.current_process(??)\nmultiprocessing.process.itertools(??)\nmultiprocessing.process.name\nmultiprocessing.process.os(??)\nmultiprocessing.process.signal(??)\nmultiprocessing.process.signum\nmultiprocessing.process.sys(??)\nmultiprocessing.queues(??)\nmultiprocessing.queues.BoundedSemaphore(??)\nmultiprocessing.queues.Condition(??)\nmultiprocessing.queues.Empty(??)\nmultiprocessing.queues.Finalize(??)\nmultiprocessing.queues.Full(??)\nmultiprocessing.queues.JoinableQueue(??)\nmultiprocessing.queues.Lock(??)\nmultiprocessing.queues.Pipe(??)\nmultiprocessing.queues.Queue(??)\nmultiprocessing.queues.Semaphore(??)\nmultiprocessing.queues.SimpleQueue(??)\nmultiprocessing.queues.assert_spawning(??)\nmultiprocessing.queues.collections(??)\nmultiprocessing.queues.debug(??)\nmultiprocessing.queues.errno(??)\nmultiprocessing.queues.info(??)\nmultiprocessing.queues.os(??)\nmultiprocessing.queues.register_after_fork(??)\nmultiprocessing.queues.sys(??)\nmultiprocessing.queues.threading(??)\nmultiprocessing.queues.time(??)\nmultiprocessing.queues.weakref(??)\nmultiprocessing.reduction(??)\nmultiprocessing.reduction.ACKNOWLEDGE(??)\nmultiprocessing.reduction.DupFd(??)\nmultiprocessing.reduction.ResourceSharer(??)\nmultiprocessing.reduction.current_process(??)\nmultiprocessing.reduction.debug(??)\nmultiprocessing.reduction.is_exiting(??)\nmultiprocessing.reduction.os(??)\nmultiprocessing.reduction.rebuild_connection(??)\nmultiprocessing.reduction.rebuild_socket(??)\nmultiprocessing.reduction.recv_handle(??)\nmultiprocessing.reduction.reduce_connection(??)\nmultiprocessing.reduction.reduce_socket(??)\nmultiprocessing.reduction.register_after_fork(??)\nmultiprocessing.reduction.resource_sharer(??)\nmultiprocessing.reduction.send_handle(??)\nmultiprocessing.reduction.signal(??)\nmultiprocessing.reduction.socket(??)\nmultiprocessing.reduction.struct(??)\nmultiprocessing.reduction.sub_debug(??)\nmultiprocessing.reduction.sub_warning(??)\nmultiprocessing.reduction.sys(??)\nmultiprocessing.reduction.threading(??)\nmultiprocessing.sharedctypes.Array(??)\nmultiprocessing.sharedctypes.ForkingPickler(??)\nmultiprocessing.sharedctypes.RLock(??)\nmultiprocessing.sharedctypes.RawArray(??)\nmultiprocessing.sharedctypes.RawValue(??)\nmultiprocessing.sharedctypes.Synchronized(??)\nmultiprocessing.sharedctypes.SynchronizedArray(??)\nmultiprocessing.sharedctypes.SynchronizedBase(??)\nmultiprocessing.sharedctypes.SynchronizedString(??)\nmultiprocessing.sharedctypes.Value(??)\nmultiprocessing.sharedctypes.assert_spawning(??)\nmultiprocessing.sharedctypes.class_cache(??)\nmultiprocessing.sharedctypes.copy(??)\nmultiprocessing.sharedctypes.ctypes(??)\nmultiprocessing.sharedctypes.heap(??)\nmultiprocessing.sharedctypes.make_property(??)\nmultiprocessing.sharedctypes.prop_cache(??)\nmultiprocessing.sharedctypes.rebuild_ctype(??)\nmultiprocessing.sharedctypes.reduce_ctype(??)\nmultiprocessing.sharedctypes.synchronized(??)\nmultiprocessing.sharedctypes.template\nmultiprocessing.sharedctypes.typecode_to_type(??)\nmultiprocessing.sharedctypes.weakref(??)\nmultiprocessing.synchronize(??)\nmultiprocessing.synchronize.Barrier(??)\nmultiprocessing.synchronize.BoundedSemaphore(??)\nmultiprocessing.synchronize.Condition(??)\nmultiprocessing.synchronize.Event(??)\nmultiprocessing.synchronize.Lock(??)\nmultiprocessing.synchronize.Popen(??)\nmultiprocessing.synchronize.RECURSIVE_MUTEX\nmultiprocessing.synchronize.RLock(??)\nmultiprocessing.synchronize.SEMAPHORE\nmultiprocessing.synchronize.SEM_VALUE_MAX\nmultiprocessing.synchronize.SemLock(??)\nmultiprocessing.synchronize.Semaphore(??)\nmultiprocessing.synchronize.assert_spawning(??)\nmultiprocessing.synchronize.current_process(??)\nmultiprocessing.synchronize.debug(??)\nmultiprocessing.synchronize.register_after_fork(??)\nmultiprocessing.synchronize.sys(??)\nmultiprocessing.synchronize.threading(??)\nmultiprocessing.sys(??)\nmultiprocessing.util(??)\nmultiprocessing.util.DEBUG\nmultiprocessing.util.DEFAULT_LOGGING_FORMAT\nmultiprocessing.util.Finalize(??)\nmultiprocessing.util.ForkAwareLocal(??)\nmultiprocessing.util.ForkAwareThreadLock(??)\nmultiprocessing.util.INFO\nmultiprocessing.util.LOGGER_NAME\nmultiprocessing.util.NOTSET\nmultiprocessing.util.SUBDEBUG\nmultiprocessing.util.SUBWARNING\nmultiprocessing.util.active_children(??)\nmultiprocessing.util.atexit(??)\nmultiprocessing.util.current_process(??)\nmultiprocessing.util.debug(??)\nmultiprocessing.util.functools(??)\nmultiprocessing.util.get_logger(??)\nmultiprocessing.util.get_temp_dir(??)\nmultiprocessing.util.info(??)\nmultiprocessing.util.is_exiting(??)\nmultiprocessing.util.itertools(??)\nmultiprocessing.util.log_to_stderr(??)\nmultiprocessing.util.os(??)\nmultiprocessing.util.register_after_fork(??)\nmultiprocessing.util.sub_debug(??)\nmultiprocessing.util.sub_warning(??)\nmultiprocessing.util.sys(??)\nmultiprocessing.util.threading(??)\nmultiprocessing.util.weakref(??)\nnetrc.NetrcParseError(??)\nnetrc.io(??)\nnetrc.netrc(??)\nnetrc.os(??)\nnetrc.shlex(??)\nnext(iterator[, default])\nnis.cat(map, domain = defaultdomain)\nnis.error(??)\nnis.get_default_domain() -> str\nnis.maps(domain = defaultdomain)\nnis.match(key, map, domain = defaultdomain)\nnntplib.ArticleInfo(number, message_id, lines)\nnntplib.GroupInfo(group, last, first, flag)\nnntplib.NNTP(??)\nnntplib.NNTPDataError(??)\nnntplib.NNTPError(??)\nnntplib.NNTPPermanentError(??)\nnntplib.NNTPProtocolError(??)\nnntplib.NNTPReplyError(??)\nnntplib.NNTPTemporaryError(??)\nnntplib.NNTP_PORT\nnntplib.NNTP_SSL(??)\nnntplib.NNTP_SSL_PORT\nnntplib.collections(??)\nnntplib.datetime(??)\nnntplib.decode_header(??)\nnntplib.re(??)\nnntplib.socket(??)\nnntplib.ssl(??)\nnntplib.warnings(??)\nnumbers.ABCMeta(??)\nnumbers.Complex(??)\nnumbers.Integral(??)\nnumbers.Number(??)\nnumbers.Rational(??)\nnumbers.Real(??)\nnumbers.abstractmethod(??)\nobject(??)\noct(number) -> string\nopen(??)\noperator.abs(a) -- Same as abs(a).\noperator.add(a, b) -- Same as a + b.\noperator.and_(a, b) -- Same as a & b.\noperator.attrgetter(attr, ...) --> attrgetter object\noperator.concat(a, b) -- Same as a + b, for a and b sequences.\noperator.contains(a, b) -- Same as b in a (note reversed operands).\noperator.countOf(a, b) -- Return the number of times b occurs in a.\noperator.delitem(a, b) -- Same as del a[b].\noperator.eq(a, b) -- Same as a==b.\noperator.floordiv(a, b) -- Same as a // b.\noperator.ge(a, b) -- Same as a>=b.\noperator.getitem(a, b) -- Same as a[b].\noperator.gt(a, b) -- Same as a>b.\noperator.iadd(??)\noperator.iand(??)\noperator.iconcat(??)\noperator.ifloordiv(??)\noperator.ilshift(??)\noperator.imod(??)\noperator.imul(??)\noperator.index(a) -- Same as a.__index__()\noperator.indexOf(a, b) -- Return the first index of b in a.\noperator.inv(a) -- Same as ~a.\noperator.invert(a) -- Same as ~a.\noperator.ior(??)\noperator.ipow(??)\noperator.irshift(??)\noperator.is_(a, b) -- Same as a is b.\noperator.is_not(a, b) -- Same as a is not b.\noperator.isub(??)\noperator.itemgetter(item, ...) --> itemgetter object\noperator.itruediv(??)\noperator.ixor(??)\noperator.le(a, b) -- Same as a<=b.\noperator.lshift(a, b) -- Same as a << b.\noperator.lt(a, b) -- Same as a<b.\noperator.methodcaller(name, ...) --> methodcaller object\noperator.mod(a, b) -- Same as a % b.\noperator.mul(a, b) -- Same as a * b.\noperator.ne(a, b) -- Same as a!=b.\noperator.neg(a) -- Same as -a.\noperator.not_(a) -- Same as not a.\noperator.or_(a, b) -- Same as a | b.\noperator.pos(a) -- Same as +a.\noperator.pow(a, b) -- Same as a ** b.\noperator.rshift(a, b) -- Same as a >> b.\noperator.setitem(a, b, c) -- Same as a[b] = c.\noperator.sub(a, b) -- Same as a - b.\noperator.truediv(a, b) -- Same as a / b.\noperator.truth(a) -- Return True if a is true, False otherwise.\noperator.xor(a, b) -- Same as a ^ b.\noptparse.AmbiguousOptionError(??)\noptparse.BadOptionError(??)\noptparse.HelpFormatter(??)\noptparse.IndentedHelpFormatter(??)\noptparse.NO_DEFAULT(??)\noptparse.OptParseError(??)\noptparse.Option(??)\noptparse.OptionConflictError(??)\noptparse.OptionContainer(??)\noptparse.OptionError(??)\noptparse.OptionGroup(??)\noptparse.OptionParser(??)\noptparse.OptionValueError(??)\noptparse.SUPPRESS_HELP\noptparse.SUPPRESS_USAGE\noptparse.TitledHelpFormatter(??)\noptparse.Values(??)\noptparse.check_builtin(??)\noptparse.check_choice(??)\noptparse.gettext(??)\noptparse.make_option(??)\noptparse.ngettext(??)\noptparse.os(??)\noptparse.sys(??)\noptparse.textwrap(??)\nord(c) -> integer\nos.CLD_CONTINUED\nos.CLD_DUMPED\nos.CLD_EXITED\nos.CLD_TRAPPED\nos.EX_CANTCREAT\nos.EX_CONFIG\nos.EX_DATAERR\nos.EX_IOERR\nos.EX_NOHOST\nos.EX_NOINPUT\nos.EX_NOPERM\nos.EX_NOUSER\nos.EX_OK\nos.EX_OSERR\nos.EX_OSFILE\nos.EX_PROTOCOL\nos.EX_SOFTWARE\nos.EX_TEMPFAIL\nos.EX_UNAVAILABLE\nos.EX_USAGE\nos.F_LOCK\nos.F_OK\nos.F_TEST\nos.F_TLOCK\nos.F_ULOCK\nos.MutableMapping(??)\nos.NGROUPS_MAX\nos.O_ACCMODE\nos.O_APPEND\nos.O_ASYNC\nos.O_CREAT\nos.O_DIRECTORY\nos.O_DSYNC\nos.O_EXCL\nos.O_EXLOCK\nos.O_NDELAY\nos.O_NOCTTY\nos.O_NOFOLLOW\nos.O_NONBLOCK\nos.O_RDONLY\nos.O_RDWR\nos.O_SHLOCK\nos.O_SYNC\nos.O_TRUNC\nos.O_WRONLY\nos.PRIO_PGRP\nos.PRIO_PROCESS\nos.PRIO_USER\nos.P_ALL\nos.P_NOWAIT\nos.P_NOWAITO\nos.P_PGID\nos.P_PID\nos.P_WAIT\nos.RTLD_GLOBAL\nos.RTLD_LAZY\nos.RTLD_LOCAL\nos.RTLD_NODELETE\nos.RTLD_NOLOAD\nos.RTLD_NOW\nos.R_OK\nos.SCHED_FIFO\nos.SCHED_OTHER\nos.SCHED_RR\nos.SEEK_CUR\nos.SEEK_END\nos.SEEK_SET\nos.ST_NOSUID\nos.ST_RDONLY\nos.TMP_MAX\nos.WCONTINUED\nos.WCOREDUMP(status) -> bool\nos.WEXITED\nos.WEXITSTATUS(status) -> integer\nos.WIFCONTINUED(status) -> bool\nos.WIFEXITED(status) -> bool\nos.WIFSIGNALED(status) -> bool\nos.WIFSTOPPED(status) -> bool\nos.WNOHANG\nos.WNOWAIT\nos.WSTOPPED\nos.WSTOPSIG(status) -> integer\nos.WTERMSIG(status) -> integer\nos.WUNTRACED\nos.W_OK\nos.X_OK\nos.abort() -> does not return!\nos.access(path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True)\nos.altsep(??)\nos.chdir(path)\nos.chflags(path, flags, *, follow_symlinks=True)\nos.chmod(path, mode, *, dir_fd=None, follow_symlinks=True)\nos.chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True)\nos.chroot(path)\nos.close(fd)\nos.closerange(fd_low, fd_high)\nos.confstr(name) -> string\nos.confstr_names(??)\nos.ctermid() -> string\nos.curdir\nos.defpath\nos.device_encoding(fd) -> str\nos.devnull\nos.dup(fd) -> fd2\nos.dup2(old_fd, new_fd)\nos.environ(??)\nos.environb(??)\nos.errno(??)\nos.error(??)\nos.execl(file, *args)\nos.execle(file, *args, env)\nos.execlp(file, *args)\nos.execlpe(file, *args, env)\nos.execv(path, args)\nos.execve(path, args, env)\nos.execvp(file, args)\nos.execvpe(file, args, env)\nos.extsep\nos.fchdir(fd)\nos.fchmod(fd, mode)\nos.fchown(fd, uid, gid)\nos.fdopen(??)\nos.fork() -> pid\nos.forkpty() -> (pid, master_fd)\nos.fpathconf(fd, name) -> integer\nos.fsdecode(??)\nos.fsencode(??)\nos.fstat(fd) -> stat result\nos.fstatvfs(fd) -> statvfs result\nos.fsync(fildes)\nos.ftruncate(fd, length)\nos.get_exec_path(??)\nos.get_terminal_size(??)\nos.getcwd() -> path\nos.getcwdb() -> path\nos.getegid() -> egid\nos.getenv(??)\nos.getenvb(??)\nos.geteuid() -> euid\nos.getgid() -> gid\nos.getgrouplist(user, group) -> list of groups to which a user belongs\nos.getgroups() -> list of group IDs\nos.getloadavg() -> (float, float, float)\nos.getlogin() -> string\nos.getpgid(pid) -> pgid\nos.getpgrp() -> pgrp\nos.getpid() -> pid\nos.getppid() -> ppid\nos.getpriority(which, who) -> current_priority\nos.getsid(pid) -> sid\nos.getuid() -> uid\nos.initgroups(username, gid) -> None\nos.isatty(fd) -> bool\nos.kill(pid, sig)\nos.killpg(pgid, sig)\nos.lchflags(path, flags)\nos.lchmod(path, mode)\nos.lchown(path, uid, gid)\nos.linesep\nos.link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True)\nos.listdir(path='.') -> list_of_filenames\nos.lockf(fd, cmd, len)\nos.lseek(fd, pos, how) -> newpos\nos.lstat(path, *, dir_fd=None) -> stat result\nos.major(device) -> major number\nos.makedev(major, minor) -> device number\nos.makedirs(path [, mode=0o777][, exist_ok=False])\nos.minor(device) -> minor number\nos.mkdir(path, mode=0o777, *, dir_fd=None)\nos.mkfifo(path, mode=0o666, *, dir_fd=None)\nos.mknod(filename, mode=0o600, device=0, *, dir_fd=None)\nos.name\nos.nice(inc) -> new_priority\nos.open(path, flags, mode=0o777, *, dir_fd=None)\nos.openpty() -> (master_fd, slave_fd)\nos.pardir\nos.path(??)\nos.pathconf(path, name) -> integer\nos.pathconf_names(??)\nos.pathsep\nos.pipe() -> (read_end, write_end)\nos.popen(??)\nos.pread(fd, buffersize, offset) -> string\nos.putenv(key, value)\nos.pwrite(fd, string, offset) -> byteswritten\nos.read(fd, buffersize) -> string\nos.readlink(path, *, dir_fd=None) -> path\nos.readv(fd, buffers) -> bytesread\nos.remove(path, *, dir_fd=None)\nos.removedirs(path)\nos.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)\nos.renames(old, new)\nos.replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None)\nos.rmdir(path, *, dir_fd=None)\nos.sched_get_priority_max(policy)\nos.sched_get_priority_min(policy)\nos.sched_yield()\nos.sendfile(out, in, offset, nbytes) -> byteswritten\nos.sep\nos.setegid(gid)\nos.seteuid(uid)\nos.setgid(gid)\nos.setgroups(list)\nos.setpgid(pid, pgrp)\nos.setpgrp()\nos.setpriority(which, who, prio) -> None\nos.setregid(rgid, egid)\nos.setreuid(ruid, euid)\nos.setsid()\nos.setuid(uid)\nos.spawnl(mode, file, *args) -> integer\nos.spawnle(mode, file, *args, env) -> integer\nos.spawnlp(mode, file, *args) -> integer\nos.spawnlpe(mode, file, *args, env) -> integer\nos.spawnv(mode, file, args) -> integer\nos.spawnve(mode, file, args, env) -> integer\nos.spawnvp(mode, file, args) -> integer\nos.spawnvpe(mode, file, args, env) -> integer\nos.st(??)\nos.stat(path, *, dir_fd=None, follow_symlinks=True) -> stat result\nos.stat_float_times([newval]) -> oldval\nos.stat_result(??)\nos.statvfs(path)\nos.statvfs_result(??)\nos.strerror(code) -> string\nos.supports_bytes_environ(??)\nos.supports_dir_fd(??)\nos.supports_effective_ids(??)\nos.supports_fd(??)\nos.supports_follow_symlinks(??)\nos.symlink(src, dst, target_is_directory=False, *, dir_fd=None)\nos.sync()\nos.sys(??)\nos.sysconf(name) -> integer\nos.sysconf_names(??)\nos.system(command) -> exit_status\nos.tcgetpgrp(fd) -> pgid\nos.tcsetpgrp(fd, pgid)\nos.terminal_size(??)\nos.times() -> times_result\nos.times_result(??)\nos.truncate(path, length)\nos.ttyname(fd) -> string\nos.umask(new_mask) -> old_mask\nos.uname() -> uname_result\nos.uname_result(??)\nos.unlink(path, *, dir_fd=None)\nos.unsetenv(key)\nos.urandom(n) -> str\nos.utime(path, times=None, *, ns=None, dir_fd=None, follow_symlinks=True)\nos.wait() -> (pid, status)\nos.wait3(options) -> (pid, status, rusage)\nos.wait4(pid, options) -> (pid, status, rusage)\nos.waitpid(pid, options) -> (pid, status)\nos.walk(??)\nos.write(fd, string) -> byteswritten\nos.writev(fd, buffers) -> byteswritten\npackaging.command.PackagingModuleError(??)\npackaging.command.STANDARD_COMMANDS(??)\npackaging.command.bdist.Command(??)\npackaging.command.bdist.PackagingOptionError(??)\npackaging.command.bdist.PackagingPlatformError(??)\npackaging.command.bdist.bdist(??)\npackaging.command.bdist.os(??)\npackaging.command.bdist.show_formats(??)\npackaging.command.bdist.util(??)\npackaging.command.bdist_dumb.Command(??)\npackaging.command.bdist_dumb.PackagingPlatformError(??)\npackaging.command.bdist_dumb.bdist_dumb(??)\npackaging.command.bdist_dumb.get_platform(??)\npackaging.command.bdist_dumb.get_python_version(??)\npackaging.command.bdist_dumb.logger(??)\npackaging.command.bdist_dumb.os(??)\npackaging.command.bdist_dumb.rmtree(??)\npackaging.command.bdist_wininst.Command(??)\npackaging.command.bdist_wininst.PackagingOptionError(??)\npackaging.command.bdist_wininst.PackagingPlatformError(??)\npackaging.command.bdist_wininst.bdist_wininst(??)\npackaging.command.bdist_wininst.get_platform(??)\npackaging.command.bdist_wininst.get_python_version(??)\npackaging.command.bdist_wininst.logger(??)\npackaging.command.bdist_wininst.os(??)\npackaging.command.bdist_wininst.rmtree(??)\npackaging.command.bdist_wininst.sys(??)\npackaging.command.build.Command(??)\npackaging.command.build.PackagingOptionError(??)\npackaging.command.build.build(??)\npackaging.command.build.get_platform(??)\npackaging.command.build.os(??)\npackaging.command.build.show_compilers(??)\npackaging.command.build.sys(??)\npackaging.command.build_clib.Command(??)\npackaging.command.build_clib.PackagingSetupError(??)\npackaging.command.build_clib.build_clib(??)\npackaging.command.build_clib.customize_compiler(??)\npackaging.command.build_clib.logger(??)\npackaging.command.build_clib.new_compiler(??)\npackaging.command.build_clib.os(??)\npackaging.command.build_clib.show_compilers(??)\npackaging.command.build_ext.CCompilerError(??)\npackaging.command.build_ext.Command(??)\npackaging.command.build_ext.CompileError(??)\npackaging.command.build_ext.Extension(??)\npackaging.command.build_ext.PackagingError(??)\npackaging.command.build_ext.PackagingPlatformError(??)\npackaging.command.build_ext.PackagingSetupError(??)\npackaging.command.build_ext.build_ext(??)\npackaging.command.build_ext.customize_compiler(??)\npackaging.command.build_ext.extension_name_re(??)\npackaging.command.build_ext.get_platform(??)\npackaging.command.build_ext.logger(??)\npackaging.command.build_ext.newer_group(??)\npackaging.command.build_ext.os(??)\npackaging.command.build_ext.re(??)\npackaging.command.build_ext.show_compilers(??)\npackaging.command.build_ext.site(??)\npackaging.command.build_ext.sys(??)\npackaging.command.build_ext.sysconfig(??)\npackaging.command.build_py.Command(??)\npackaging.command.build_py.Mixin2to3(??)\npackaging.command.build_py.PackagingFileError(??)\npackaging.command.build_py.PackagingOptionError(??)\npackaging.command.build_py.build_py(??)\npackaging.command.build_py.convert_path(??)\npackaging.command.build_py.glob(??)\npackaging.command.build_py.imp(??)\npackaging.command.build_py.logger(??)\npackaging.command.build_py.os(??)\npackaging.command.build_scripts.Command(??)\npackaging.command.build_scripts.Mixin2to3(??)\npackaging.command.build_scripts.build_scripts(??)\npackaging.command.build_scripts.convert_path(??)\npackaging.command.build_scripts.detect_encoding(??)\npackaging.command.build_scripts.first_line_re(??)\npackaging.command.build_scripts.logger(??)\npackaging.command.build_scripts.newer(??)\npackaging.command.build_scripts.os(??)\npackaging.command.build_scripts.re(??)\npackaging.command.build_scripts.sysconfig(??)\npackaging.command.check.Command(??)\npackaging.command.check.PackagingSetupError(??)\npackaging.command.check.check(??)\npackaging.command.check.logger(??)\npackaging.command.check.resolve_name(??)\npackaging.command.clean.Command(??)\npackaging.command.clean.clean(??)\npackaging.command.clean.logger(??)\npackaging.command.clean.os(??)\npackaging.command.clean.rmtree(??)\npackaging.command.cmd.Command(??)\npackaging.command.cmd.PackagingOptionError(??)\npackaging.command.cmd.copyfile(??)\npackaging.command.cmd.logger(??)\npackaging.command.cmd.make_archive(??)\npackaging.command.cmd.move(??)\npackaging.command.cmd.os(??)\npackaging.command.cmd.re(??)\npackaging.command.cmd.util(??)\npackaging.command.config.Command(??)\npackaging.command.config.LANG_EXT(??)\npackaging.command.config.PackagingExecError(??)\npackaging.command.config.config(??)\npackaging.command.config.customize_compiler(??)\npackaging.command.config.dump_file(??)\npackaging.command.config.logger(??)\npackaging.command.config.os(??)\npackaging.command.config.re(??)\npackaging.command.get_command_class(??)\npackaging.command.get_command_names(??)\npackaging.command.install_dist.Command(??)\npackaging.command.install_dist.PackagingOptionError(??)\npackaging.command.install_dist.PackagingPlatformError(??)\npackaging.command.install_dist.change_root(??)\npackaging.command.install_dist.convert_path(??)\npackaging.command.install_dist.get_config_var(??)\npackaging.command.install_dist.get_config_vars(??)\npackaging.command.install_dist.get_path(??)\npackaging.command.install_dist.get_paths(??)\npackaging.command.install_dist.get_platform(??)\npackaging.command.install_dist.install_dist(??)\npackaging.command.install_dist.logger(??)\npackaging.command.install_dist.os(??)\npackaging.command.install_dist.sys(??)\npackaging.command.install_dist.sysconfig(??)\npackaging.command.install_dist.write_file(??)\npackaging.command.install_distinfo.Command(??)\npackaging.command.install_distinfo.csv(??)\npackaging.command.install_distinfo.hashlib(??)\npackaging.command.install_distinfo.install_distinfo(??)\npackaging.command.install_distinfo.logger(??)\npackaging.command.install_distinfo.os(??)\npackaging.command.install_distinfo.rmtree(??)\npackaging.command.install_headers.Command(??)\npackaging.command.install_headers.install_headers(??)\npackaging.command.install_lib.Command(??)\npackaging.command.install_lib.PYTHON_SOURCE_EXTENSION\npackaging.command.install_lib.PackagingOptionError(??)\npackaging.command.install_lib.imp(??)\npackaging.command.install_lib.install_lib(??)\npackaging.command.install_lib.logger(??)\npackaging.command.install_lib.os(??)\npackaging.command.install_scripts.Command(??)\npackaging.command.install_scripts.install_scripts(??)\npackaging.command.install_scripts.logger(??)\npackaging.command.install_scripts.os(??)\npackaging.command.os(??)\npackaging.command.register.Command(??)\npackaging.command.register.DEFAULT_REALM\npackaging.command.register.DEFAULT_REPOSITORY\npackaging.command.register.encode_multipart(??)\npackaging.command.register.generate_pypirc(??)\npackaging.command.register.get_pypirc_path(??)\npackaging.command.register.getpass(??)\npackaging.command.register.logger(??)\npackaging.command.register.read_pypirc(??)\npackaging.command.register.register(??)\npackaging.command.register.urllib(??)\npackaging.command.resolve_name(??)\npackaging.command.sdist.Command(??)\npackaging.command.sdist.Manifest(??)\npackaging.command.sdist.PackagingFileError(??)\npackaging.command.sdist.PackagingModuleError(??)\npackaging.command.sdist.PackagingOptionError(??)\npackaging.command.sdist.PackagingPlatformError(??)\npackaging.command.sdist.StringIO(??)\npackaging.command.sdist.get_archive_formats(??)\npackaging.command.sdist.get_command_names(??)\npackaging.command.sdist.logger(??)\npackaging.command.sdist.os(??)\npackaging.command.sdist.re(??)\npackaging.command.sdist.resolve_name(??)\npackaging.command.sdist.rmtree(??)\npackaging.command.sdist.sdist(??)\npackaging.command.sdist.show_formats(??)\npackaging.command.sdist.sys(??)\npackaging.command.set_command(??)\npackaging.command.test.Command(??)\npackaging.command.test.PackagingOptionError(??)\npackaging.command.test.get_distribution(??)\npackaging.command.test.logger(??)\npackaging.command.test.logging(??)\npackaging.command.test.os(??)\npackaging.command.test.resolve_name(??)\npackaging.command.test.sys(??)\npackaging.command.test.test(??)\npackaging.command.test.unittest(??)\npackaging.command.upload.Command(??)\npackaging.command.upload.DEFAULT_REALM\npackaging.command.upload.DEFAULT_REPOSITORY\npackaging.command.upload.HTTPError(??)\npackaging.command.upload.PackagingOptionError(??)\npackaging.command.upload.Request(??)\npackaging.command.upload.encode_multipart(??)\npackaging.command.upload.logger(??)\npackaging.command.upload.logging(??)\npackaging.command.upload.md5(??)\npackaging.command.upload.os(??)\npackaging.command.upload.platform(??)\npackaging.command.upload.read_pypirc(??)\npackaging.command.upload.socket(??)\npackaging.command.upload.spawn(??)\npackaging.command.upload.standard_b64encode(??)\npackaging.command.upload.upload(??)\npackaging.command.upload.urllib(??)\npackaging.command.upload.urlopen(??)\npackaging.command.upload_docs.BytesIO([buffer]) -> object\npackaging.command.upload_docs.Command(??)\npackaging.command.upload_docs.DEFAULT_REALM\npackaging.command.upload_docs.DEFAULT_REPOSITORY\npackaging.command.upload_docs.PackagingFileError(??)\npackaging.command.upload_docs.base64(??)\npackaging.command.upload_docs.encode_multipart(??)\npackaging.command.upload_docs.http(??)\npackaging.command.upload_docs.logger(??)\npackaging.command.upload_docs.logging(??)\npackaging.command.upload_docs.os(??)\npackaging.command.upload_docs.read_pypirc(??)\npackaging.command.upload_docs.socket(??)\npackaging.command.upload_docs.upload_docs(??)\npackaging.command.upload_docs.urllib(??)\npackaging.command.upload_docs.zip_dir(??)\npackaging.command.upload_docs.zipfile(??)\npackaging.compat.Mixin2to3(??)\npackaging.compat.logger(??)\npackaging.compiler.PackagingPlatformError(??)\npackaging.compiler.ccompiler.CCompiler(??)\npackaging.compiler.ccompiler.CompileError(??)\npackaging.compiler.ccompiler.LinkError(??)\npackaging.compiler.ccompiler.UnknownFileError(??)\npackaging.compiler.ccompiler.execute(??)\npackaging.compiler.ccompiler.gen_preprocess_options(??)\npackaging.compiler.ccompiler.logger(??)\npackaging.compiler.ccompiler.move(??)\npackaging.compiler.ccompiler.newer_group(??)\npackaging.compiler.ccompiler.os(??)\npackaging.compiler.ccompiler.spawn(??)\npackaging.compiler.ccompiler.split_quoted(??)\npackaging.compiler.customize_compiler(??)\npackaging.compiler.cygwinccompiler.CONFIG_H_NOTOK\npackaging.compiler.cygwinccompiler.CONFIG_H_OK\npackaging.compiler.cygwinccompiler.CONFIG_H_UNCERTAIN\npackaging.compiler.cygwinccompiler.CompileError(??)\npackaging.compiler.cygwinccompiler.CygwinCCompiler(??)\npackaging.compiler.cygwinccompiler.Mingw32CCompiler(??)\npackaging.compiler.cygwinccompiler.PackagingExecError(??)\npackaging.compiler.cygwinccompiler.UnixCCompiler(??)\npackaging.compiler.cygwinccompiler.UnknownFileError(??)\npackaging.compiler.cygwinccompiler.check_config_h(??)\npackaging.compiler.cygwinccompiler.get_compiler_versions(??)\npackaging.compiler.cygwinccompiler.get_msvcr(??)\npackaging.compiler.cygwinccompiler.logger(??)\npackaging.compiler.cygwinccompiler.os(??)\npackaging.compiler.cygwinccompiler.sys(??)\npackaging.compiler.cygwinccompiler.sysconfig(??)\npackaging.compiler.cygwinccompiler.write_file(??)\npackaging.compiler.extension(??)\npackaging.compiler.extension.Extension(??)\npackaging.compiler.extension.logger(??)\npackaging.compiler.gen_lib_options(??)\npackaging.compiler.gen_preprocess_options(??)\npackaging.compiler.get_default_compiler(??)\npackaging.compiler.logger(??)\npackaging.compiler.msvccompiler.CCompiler(??)\npackaging.compiler.msvccompiler.CompileError(??)\npackaging.compiler.msvccompiler.LibError(??)\npackaging.compiler.msvccompiler.LinkError(??)\npackaging.compiler.msvccompiler.MSVCCompiler(??)\npackaging.compiler.msvccompiler.MacroExpander(??)\npackaging.compiler.msvccompiler.PackagingExecError(??)\npackaging.compiler.msvccompiler.PackagingPlatformError(??)\npackaging.compiler.msvccompiler.convert_mbcs(??)\npackaging.compiler.msvccompiler.gen_lib_options(??)\npackaging.compiler.msvccompiler.get_build_architecture(??)\npackaging.compiler.msvccompiler.get_build_version(??)\npackaging.compiler.msvccompiler.logger(??)\npackaging.compiler.msvccompiler.normalize_and_reduce_paths(??)\npackaging.compiler.msvccompiler.os(??)\npackaging.compiler.msvccompiler.read_keys(??)\npackaging.compiler.msvccompiler.read_values(??)\npackaging.compiler.msvccompiler.sys(??)\npackaging.compiler.new_compiler(??)\npackaging.compiler.os(??)\npackaging.compiler.re(??)\npackaging.compiler.resolve_name(??)\npackaging.compiler.set_compiler(??)\npackaging.compiler.show_compilers(??)\npackaging.compiler.sys(??)\npackaging.compiler.sysconfig(??)\npackaging.compiler.unixccompiler.CCompiler(??)\npackaging.compiler.unixccompiler.CompileError(??)\npackaging.compiler.unixccompiler.LibError(??)\npackaging.compiler.unixccompiler.LinkError(??)\npackaging.compiler.unixccompiler.PackagingExecError(??)\npackaging.compiler.unixccompiler.UnixCCompiler(??)\npackaging.compiler.unixccompiler.gen_lib_options(??)\npackaging.compiler.unixccompiler.gen_preprocess_options(??)\npackaging.compiler.unixccompiler.logger(??)\npackaging.compiler.unixccompiler.newer(??)\npackaging.compiler.unixccompiler.os(??)\npackaging.compiler.unixccompiler.sys(??)\npackaging.compiler.unixccompiler.sysconfig(??)\npackaging.config.Config(??)\npackaging.config.Extension(??)\npackaging.config.PackagingOptionError(??)\npackaging.config.RawConfigParser(??)\npackaging.config.check_environ(??)\npackaging.config.get_resources_dests(??)\npackaging.config.iglob(??)\npackaging.config.interpret(??)\npackaging.config.logger(??)\npackaging.config.logging(??)\npackaging.config.os(??)\npackaging.config.resolve_name(??)\npackaging.config.set_command(??)\npackaging.config.set_compiler(??)\npackaging.config.split(??)\npackaging.config.split_multiline(??)\npackaging.config.strtobool(??)\npackaging.config.sys(??)\npackaging.create.CLASSIFIERS(??)\npackaging.create.LICENCES(??)\npackaging.create.MainProgram(??)\npackaging.create.PROJECT_MATURITY(??)\npackaging.create.RawConfigParser(??)\npackaging.create.ask(??)\npackaging.create.ask_yn(??)\npackaging.create.convert_yn_to_bool(??)\npackaging.create.dedent(??)\npackaging.create.detect_encoding(??)\npackaging.create.glob(??)\npackaging.create.imp(??)\npackaging.create.is_valid_version(??)\npackaging.create.load_setup(??)\npackaging.create.logger(??)\npackaging.create.main(??)\npackaging.create.md5(??)\npackaging.create.os(??)\npackaging.create.re(??)\npackaging.create.shutil(??)\npackaging.create.sys(??)\npackaging.create.sysconfig(??)\npackaging.database.DIST_FILES(??)\npackaging.database.Distribution(??)\npackaging.database.EggInfoDistribution(??)\npackaging.database.Metadata(??)\npackaging.database.PackagingError(??)\npackaging.database.StringIO(??)\npackaging.database.VersionPredicate(??)\npackaging.database.clear_cache(??)\npackaging.database.csv(??)\npackaging.database.disable_cache(??)\npackaging.database.distinfo_dirname(??)\npackaging.database.enable_cache(??)\npackaging.database.get_distribution(??)\npackaging.database.get_distributions(??)\npackaging.database.get_file(??)\npackaging.database.get_file_path(??)\npackaging.database.get_file_users(??)\npackaging.database.logger(??)\npackaging.database.md5(??)\npackaging.database.obsoletes_distribution(??)\npackaging.database.os(??)\npackaging.database.provides_distribution(??)\npackaging.database.re(??)\npackaging.database.suggest_normalized_version(??)\npackaging.database.sys(??)\npackaging.database.zipimport(??)\npackaging.depgraph.DependencyGraph(??)\npackaging.depgraph.IrrationalVersionError(??)\npackaging.depgraph.PackagingError(??)\npackaging.depgraph.StringIO(??)\npackaging.depgraph.VersionPredicate(??)\npackaging.depgraph.dependent_dists(??)\npackaging.depgraph.generate_graph(??)\npackaging.depgraph.graph_to_dot(??)\npackaging.depgraph.main(??)\npackaging.depgraph.sys(??)\npackaging.dist.Command(??)\npackaging.dist.Config(??)\npackaging.dist.Distribution(??)\npackaging.dist.FancyGetopt(??)\npackaging.dist.Metadata(??)\npackaging.dist.PackagingArgError(??)\npackaging.dist.PackagingClassError(??)\npackaging.dist.PackagingModuleError(??)\npackaging.dist.PackagingOptionError(??)\npackaging.dist.STANDARD_COMMANDS(??)\npackaging.dist.USAGE\npackaging.dist.command_re(??)\npackaging.dist.gen_usage(??)\npackaging.dist.get_command_class(??)\npackaging.dist.logger(??)\npackaging.dist.os(??)\npackaging.dist.re(??)\npackaging.dist.resolve_name(??)\npackaging.dist.strtobool(??)\npackaging.errors.CCompilerError(??)\npackaging.errors.CompileError(??)\npackaging.errors.HugeMajorVersionNumError(??)\npackaging.errors.InstallationConflict(??)\npackaging.errors.InstallationException(??)\npackaging.errors.IrrationalVersionError(??)\npackaging.errors.LibError(??)\npackaging.errors.LinkError(??)\npackaging.errors.MetadataConflictError(??)\npackaging.errors.MetadataMissingError(??)\npackaging.errors.MetadataUnrecognizedVersionError(??)\npackaging.errors.PackagingArgError(??)\npackaging.errors.PackagingClassError(??)\npackaging.errors.PackagingError(??)\npackaging.errors.PackagingExecError(??)\npackaging.errors.PackagingFileError(??)\npackaging.errors.PackagingGetoptError(??)\npackaging.errors.PackagingInternalError(??)\npackaging.errors.PackagingModuleError(??)\npackaging.errors.PackagingOptionError(??)\npackaging.errors.PackagingPlatformError(??)\npackaging.errors.PackagingPyPIError(??)\npackaging.errors.PackagingSetupError(??)\npackaging.errors.PackagingTemplateError(??)\npackaging.errors.PreprocessError(??)\npackaging.errors.UnknownFileError(??)\npackaging.fancy_getopt.FancyGetopt(??)\npackaging.fancy_getopt.OptionDummy(??)\npackaging.fancy_getopt.PackagingArgError(??)\npackaging.fancy_getopt.PackagingGetoptError(??)\npackaging.fancy_getopt.fancy_getopt(??)\npackaging.fancy_getopt.getopt(??)\npackaging.fancy_getopt.longopt_pat\npackaging.fancy_getopt.longopt_re(??)\npackaging.fancy_getopt.neg_alias_re(??)\npackaging.fancy_getopt.re(??)\npackaging.fancy_getopt.sys(??)\npackaging.fancy_getopt.textwrap(??)\npackaging.getLogger(??)\npackaging.install.CCompilerError(??)\npackaging.install.Distribution(??)\npackaging.install.InstallationConflict(??)\npackaging.install.InstallationException(??)\npackaging.install.PackagingError(??)\npackaging.install.ProjectNotFound(??)\npackaging.install.ReleaseNotFound(??)\npackaging.install.ask(??)\npackaging.install.database(??)\npackaging.install.egginfo_to_distinfo(??)\npackaging.install.errno(??)\npackaging.install.generate_graph(??)\npackaging.install.get_config_var(??)\npackaging.install.get_distribution(??)\npackaging.install.get_distributions(??)\npackaging.install.get_infos(??)\npackaging.install.get_install_method(??)\npackaging.install.get_path(??)\npackaging.install.get_version_predicate(??)\npackaging.install.install(??)\npackaging.install.install_dists(??)\npackaging.install.install_from_infos(??)\npackaging.install.install_local_project(??)\npackaging.install.install_methods(??)\npackaging.install.is_python_build(??)\npackaging.install.logger(??)\npackaging.install.logging(??)\npackaging.install.os(??)\npackaging.install.remove(??)\npackaging.install.shutil(??)\npackaging.install.stat(??)\npackaging.install.sys(??)\npackaging.install.tempfile(??)\npackaging.install.wrapper(??)\npackaging.logger(??)\npackaging.manifest.Manifest(??)\npackaging.manifest.PackagingInternalError(??)\npackaging.manifest.PackagingTemplateError(??)\npackaging.manifest.convert_path(??)\npackaging.manifest.fnmatch(??)\npackaging.manifest.logger(??)\npackaging.manifest.os(??)\npackaging.manifest.re(??)\npackaging.manifest.write_file(??)\npackaging.markers.BytesIO([buffer]) -> object\npackaging.markers.ENCODING\npackaging.markers.ENDMARKER\npackaging.markers.NAME\npackaging.markers.OP\npackaging.markers.STRING\npackaging.markers.interpret(??)\npackaging.markers.os(??)\npackaging.markers.platform(??)\npackaging.markers.sys(??)\npackaging.markers.tokenize(??)\npackaging.metadata.Metadata(??)\npackaging.metadata.MetadataConflictError(??)\npackaging.metadata.MetadataMissingError(??)\npackaging.metadata.MetadataUnrecognizedVersionError(??)\npackaging.metadata.PKG_INFO_ENCODING\npackaging.metadata.PKG_INFO_PREFERRED_VERSION\npackaging.metadata.StringIO(??)\npackaging.metadata.interpret(??)\npackaging.metadata.is_valid_predicate(??)\npackaging.metadata.is_valid_version(??)\npackaging.metadata.is_valid_versions(??)\npackaging.metadata.logger(??)\npackaging.metadata.logging(??)\npackaging.metadata.message_from_file(??)\npackaging.metadata.re(??)\npackaging.pypi.DistInfo(??)\npackaging.pypi.ReleaseInfo(??)\npackaging.pypi.ReleasesList(??)\npackaging.pypi.base(??)\npackaging.pypi.base.BaseClient(??)\npackaging.pypi.base.ReleasesList(??)\npackaging.pypi.dist(??)\npackaging.pypi.dist.CantParseArchiveName(??)\npackaging.pypi.dist.DIST_TYPES(??)\npackaging.pypi.dist.DistInfo(??)\npackaging.pypi.dist.EXTENSIONS(??)\npackaging.pypi.dist.HashDoesNotMatch(??)\npackaging.pypi.dist.IndexReference(??)\npackaging.pypi.dist.IrrationalVersionError(??)\npackaging.pypi.dist.MD5_HASH(??)\npackaging.pypi.dist.Metadata(??)\npackaging.pypi.dist.NormalizedVersion(??)\npackaging.pypi.dist.ReleaseInfo(??)\npackaging.pypi.dist.ReleasesList(??)\npackaging.pypi.dist.UnsupportedHashName(??)\npackaging.pypi.dist.get_infos_from_url(??)\npackaging.pypi.dist.get_version_predicate(??)\npackaging.pypi.dist.hashlib(??)\npackaging.pypi.dist.re(??)\npackaging.pypi.dist.split_archive_name(??)\npackaging.pypi.dist.suggest_normalized_version(??)\npackaging.pypi.dist.tempfile(??)\npackaging.pypi.dist.unpack_archive(??)\npackaging.pypi.dist.urllib(??)\npackaging.pypi.errors(??)\npackaging.pypi.errors.CantParseArchiveName(??)\npackaging.pypi.errors.DistributionNotFound(??)\npackaging.pypi.errors.DownloadError(??)\npackaging.pypi.errors.HashDoesNotMatch(??)\npackaging.pypi.errors.InvalidSearchField(??)\npackaging.pypi.errors.PackagingPyPIError(??)\npackaging.pypi.errors.ProjectNotFound(??)\npackaging.pypi.errors.ReleaseNotFound(??)\npackaging.pypi.errors.UnableToDownload(??)\npackaging.pypi.errors.UnsupportedHashName(??)\npackaging.pypi.mirrors(??)\npackaging.pypi.mirrors.DEFAULT_MIRROR_URL\npackaging.pypi.mirrors.ascii_lowercase\npackaging.pypi.mirrors.get_mirrors(??)\npackaging.pypi.mirrors.product(??)\npackaging.pypi.mirrors.socket(??)\npackaging.pypi.mirrors.string_range(??)\npackaging.pypi.simple(??)\npackaging.pypi.simple.BaseClient(??)\npackaging.pypi.simple.CantParseArchiveName(??)\npackaging.pypi.simple.Crawler(??)\npackaging.pypi.simple.DEFAULT_HOSTS(??)\npackaging.pypi.simple.DEFAULT_SIMPLE_INDEX_URL\npackaging.pypi.simple.DownloadError(??)\npackaging.pypi.simple.EGG_FRAGMENT(??)\npackaging.pypi.simple.ENTITY_SUB(??)\npackaging.pypi.simple.EXTENSIONS(??)\npackaging.pypi.simple.HREF(??)\npackaging.pypi.simple.MD5_HASH(??)\npackaging.pypi.simple.Metadata(??)\npackaging.pypi.simple.PackagingPyPIError(??)\npackaging.pypi.simple.ProjectNotFound(??)\npackaging.pypi.simple.REL(??)\npackaging.pypi.simple.ReleaseNotFound(??)\npackaging.pypi.simple.ReleasesList(??)\npackaging.pypi.simple.SOCKET_TIMEOUT\npackaging.pypi.simple.URL_SCHEME(??)\npackaging.pypi.simple.USER_AGENT\npackaging.pypi.simple.UnableToDownload(??)\npackaging.pypi.simple.get_infos_from_url(??)\npackaging.pypi.simple.get_mirrors(??)\npackaging.pypi.simple.get_version_predicate(??)\npackaging.pypi.simple.http(??)\npackaging.pypi.simple.logger(??)\npackaging.pypi.simple.os(??)\npackaging.pypi.simple.packaging_version\npackaging.pypi.simple.re(??)\npackaging.pypi.simple.socket(??)\npackaging.pypi.simple.socket_timeout(??)\npackaging.pypi.simple.sys(??)\npackaging.pypi.simple.translate(??)\npackaging.pypi.simple.urllib(??)\npackaging.pypi.simple.with_mirror_support(??)\npackaging.pypi.simple.wraps(??)\npackaging.pypi.wrapper(??)\npackaging.pypi.wrapper.ClientWrapper(??)\npackaging.pypi.wrapper.simple(??)\npackaging.pypi.wrapper.switch_index_if_fails(??)\npackaging.pypi.wrapper.xmlrpc(??)\npackaging.pypi.xmlrpc(??)\npackaging.pypi.xmlrpc.BaseClient(??)\npackaging.pypi.xmlrpc.Client(??)\npackaging.pypi.xmlrpc.DEFAULT_XMLRPC_INDEX_URL\npackaging.pypi.xmlrpc.InvalidSearchField(??)\npackaging.pypi.xmlrpc.IrrationalVersionError(??)\npackaging.pypi.xmlrpc.ProjectNotFound(??)\npackaging.pypi.xmlrpc.ReleaseInfo(??)\npackaging.pypi.xmlrpc.ReleaseNotFound(??)\npackaging.pypi.xmlrpc.get_version_predicate(??)\npackaging.pypi.xmlrpc.logger(??)\npackaging.pypi.xmlrpc.xmlrpc(??)\npackaging.run.CCompilerError(??)\npackaging.run.Dispatcher(??)\npackaging.run.Distribution(??)\npackaging.run.FancyGetopt(??)\npackaging.run.PackagingArgError(??)\npackaging.run.PackagingClassError(??)\npackaging.run.PackagingError(??)\npackaging.run.PackagingModuleError(??)\npackaging.run.STANDARD_COMMANDS(??)\npackaging.run.action_help(??)\npackaging.run.actions(??)\npackaging.run.command_re(??)\npackaging.run.common_usage\npackaging.run.display_option_names(??)\npackaging.run.display_options(??)\npackaging.run.generate_graph(??)\npackaging.run.generate_setup_py(??)\npackaging.run.get_command_class(??)\npackaging.run.get_distribution(??)\npackaging.run.get_distributions(??)\npackaging.run.getopt(??)\npackaging.run.global_options(??)\npackaging.run.install(??)\npackaging.run.install_local_project(??)\npackaging.run.logger(??)\npackaging.run.logging(??)\npackaging.run.main(??)\npackaging.run.negative_opt(??)\npackaging.run.os(??)\npackaging.run.re(??)\npackaging.run.remove(??)\npackaging.run.sys(??)\npackaging.util.DEFAULT_PYPIRC\npackaging.util.DEFAULT_REALM\npackaging.util.DEFAULT_REPOSITORY\npackaging.util.InstallationException(??)\npackaging.util.Mixin2to3(??)\npackaging.util.PackagingExecError(??)\npackaging.util.PackagingFileError(??)\npackaging.util.PackagingInternalError(??)\npackaging.util.PackagingPlatformError(??)\npackaging.util.RICH_GLOB(??)\npackaging.util.RawConfigParser(??)\npackaging.util.SETUP_TEMPLATE\npackaging.util.ask(??)\npackaging.util.byte_compile(??)\npackaging.util.cfg_to_args(??)\npackaging.util.change_root(??)\npackaging.util.check_environ(??)\npackaging.util.codecs(??)\npackaging.util.convert_path(??)\npackaging.util.copy_tree(??)\npackaging.util.csv(??)\npackaging.util.egginfo_to_distinfo(??)\npackaging.util.encode_multipart(??)\npackaging.util.errno(??)\npackaging.util.execute(??)\npackaging.util.find_executable(??)\npackaging.util.find_packages(??)\npackaging.util.fnmatchcase(??)\npackaging.util.generate_pypirc(??)\npackaging.util.generate_setup_py(??)\npackaging.util.get_compiler_versions(??)\npackaging.util.get_install_method(??)\npackaging.util.get_platform(??)\npackaging.util.get_pypirc_path(??)\npackaging.util.getsource(??)\npackaging.util.hashlib(??)\npackaging.util.iglob(??)\npackaging.util.imp(??)\npackaging.util.is_distutils(??)\npackaging.util.is_packaging(??)\npackaging.util.is_setuptools(??)\npackaging.util.logger(??)\npackaging.util.newer(??)\npackaging.util.newer_group(??)\npackaging.util.os(??)\npackaging.util.posixpath(??)\npackaging.util.re(??)\npackaging.util.read_pypirc(??)\npackaging.util.resolve_name(??)\npackaging.util.run_2to3(??)\npackaging.util.set_platform(??)\npackaging.util.shutil(??)\npackaging.util.spawn(??)\npackaging.util.split_multiline(??)\npackaging.util.split_quoted(??)\npackaging.util.splitext(??)\npackaging.util.std_iglob(??)\npackaging.util.string(??)\npackaging.util.strtobool(??)\npackaging.util.subprocess(??)\npackaging.util.sys(??)\npackaging.util.sysconfig(??)\npackaging.util.write_file(??)\npackaging.version.HugeMajorVersionNumError(??)\npackaging.version.IrrationalVersionError(??)\npackaging.version.NormalizedVersion(??)\npackaging.version.VersionPredicate(??)\npackaging.version.get_version_predicate(??)\npackaging.version.is_valid_predicate(??)\npackaging.version.is_valid_version(??)\npackaging.version.is_valid_versions(??)\npackaging.version.re(??)\npackaging.version.suggest_normalized_version(??)\nparser.ParserError(??)\nparser.STType(??)\nparser.compilest(??)\nparser.expr(??)\nparser.isexpr(??)\nparser.issuite(??)\nparser.sequence2st(??)\nparser.st2list(??)\nparser.st2tuple(??)\nparser.suite(??)\nparser.tuple2st(??)\npdb.Pdb(??)\npdb.Restart(??)\npdb.TESTCMD\npdb.bdb(??)\npdb.cmd(??)\npdb.code(??)\npdb.dis(??)\npdb.find_function(??)\npdb.getsourcelines(??)\npdb.glob(??)\npdb.help(??)\npdb.inspect(??)\npdb.lasti2lineno(??)\npdb.line_prefix\npdb.linecache(??)\npdb.main(??)\npdb.os(??)\npdb.pm(??)\npdb.post_mortem(??)\npdb.pprint(??)\npdb.re(??)\npdb.run(??)\npdb.runcall(??)\npdb.runctx(??)\npdb.runeval(??)\npdb.set_trace(??)\npdb.signal(??)\npdb.sys(??)\npdb.test(??)\npdb.traceback(??)\npickle.APPEND\npickle.APPENDS\npickle.BINBYTES\npickle.BINFLOAT\npickle.BINGET\npickle.BININT\npickle.BININT1\npickle.BININT2\npickle.BINPERSID\npickle.BINPUT\npickle.BINSTRING\npickle.BINUNICODE\npickle.BUILD\npickle.BuiltinFunctionType(??)\npickle.DEFAULT_PROTOCOL\npickle.DICT\npickle.DUP\npickle.EMPTY_DICT\npickle.EMPTY_LIST\npickle.EMPTY_TUPLE\npickle.EXT1\npickle.EXT2\npickle.EXT4\npickle.FALSE\npickle.FLOAT\npickle.FunctionType(??)\npickle.GET\npickle.GLOBAL\npickle.HIGHEST_PROTOCOL\npickle.INST\npickle.INT\npickle.LIST\npickle.LONG\npickle.LONG1\npickle.LONG4\npickle.LONG_BINGET\npickle.LONG_BINPUT\npickle.MARK\npickle.NEWFALSE\npickle.NEWOBJ\npickle.NEWTRUE\npickle.NONE\npickle.OBJ\npickle.PERSID\npickle.POP\npickle.POP_MARK\npickle.PROTO\npickle.PUT\npickle.PickleError(??)\npickle.Pickler(file, protocol=None)\npickle.PicklingError(??)\npickle.PyStringMap(??)\npickle.REDUCE\npickle.SETITEM\npickle.SETITEMS\npickle.SHORT_BINBYTES\npickle.SHORT_BINSTRING\npickle.STOP\npickle.STRING\npickle.TRUE\npickle.TUPLE\npickle.TUPLE1\npickle.TUPLE2\npickle.TUPLE3\npickle.UNICODE\npickle.Unpickler(file, *, encoding='ASCII', errors='strict')\npickle.UnpicklingError(??)\npickle.bytes_types(??)\npickle.classmap(??)\npickle.codecs(??)\npickle.compatible_formats(??)\npickle.decode_long(??)\npickle.dispatch_table(??)\npickle.dump(obj, file, protocol=None, *, fix_imports=True) -> None\npickle.dumps(obj, protocol=None, *, fix_imports=True) -> bytes\npickle.encode_long(??)\npickle.format_version\npickle.io(??)\npickle.load(file, *, fix_imports=True, encoding='ASCII', errors='strict') -> object\npickle.loads(input, *, fix_imports=True, encoding='ASCII', errors='strict') -> object\npickle.marshal(??)\npickle.mloads(??)\npickle.re(??)\npickle.struct(??)\npickle.sys(??)\npickle.whichmodule(??)\npickletools.ArgumentDescriptor(??)\npickletools.OpcodeInfo(??)\npickletools.StackObject(??)\npickletools.TAKEN_FROM_ARGUMENT1\npickletools.TAKEN_FROM_ARGUMENT4\npickletools.UP_TO_NEWLINE\npickletools.anyobject(??)\npickletools.bytes_types(??)\npickletools.code2op(??)\npickletools.codecs(??)\npickletools.decimalnl_long(??)\npickletools.decimalnl_short(??)\npickletools.decode_long(??)\npickletools.dis(??)\npickletools.float8(??)\npickletools.floatnl(??)\npickletools.genops(??)\npickletools.int4(??)\npickletools.long1(??)\npickletools.long4(??)\npickletools.markobject(??)\npickletools.opcodes(??)\npickletools.optimize(??)\npickletools.pickle(??)\npickletools.pybool(??)\npickletools.pybytes(??)\npickletools.pydict(??)\npickletools.pyfloat(??)\npickletools.pyint(??)\npickletools.pyinteger_or_bool(??)\npickletools.pylist(??)\npickletools.pylong(??)\npickletools.pynone(??)\npickletools.pystring(??)\npickletools.pytuple(??)\npickletools.pyunicode(??)\npickletools.re(??)\npickletools.read_decimalnl_long(??)\npickletools.read_decimalnl_short(??)\npickletools.read_float8(??)\npickletools.read_floatnl(??)\npickletools.read_int4(??)\npickletools.read_long1(??)\npickletools.read_long4(??)\npickletools.read_string1(??)\npickletools.read_string4(??)\npickletools.read_stringnl(??)\npickletools.read_stringnl_noescape(??)\npickletools.read_stringnl_noescape_pair(??)\npickletools.read_uint1(??)\npickletools.read_uint2(??)\npickletools.read_unicodestring4(??)\npickletools.read_unicodestringnl(??)\npickletools.stackslice(??)\npickletools.string1(??)\npickletools.string4(??)\npickletools.stringnl(??)\npickletools.stringnl_noescape(??)\npickletools.stringnl_noescape_pair(??)\npickletools.uint1(??)\npickletools.uint2(??)\npickletools.unicodestring4(??)\npickletools.unicodestringnl(??)\npipes.FILEIN_FILEOUT\npipes.FILEIN_STDOUT\npipes.SINK\npipes.SOURCE\npipes.STDIN_FILEOUT\npipes.STDIN_STDOUT\npipes.Template(??)\npipes.makepipeline(??)\npipes.os(??)\npipes.quote(??)\npipes.re(??)\npipes.stepkinds(??)\npipes.tempfile(??)\npkgutil.ImpImporter(??)\npkgutil.ImpLoader(??)\npkgutil.ModuleType(??)\npkgutil.extend_path(??)\npkgutil.find_loader(??)\npkgutil.get_data(??)\npkgutil.get_importer(??)\npkgutil.get_loader(??)\npkgutil.imp(??)\npkgutil.importlib(??)\npkgutil.iter_importer_modules(??)\npkgutil.iter_importers(??)\npkgutil.iter_modules(??)\npkgutil.iter_zipimport_modules(??)\npkgutil.os(??)\npkgutil.read_code(??)\npkgutil.simplegeneric(??)\npkgutil.sys(??)\npkgutil.walk_packages(??)\npkgutil.warn(??)\npkgutil.zipimport(??)\npkgutil.zipimporter(archivepath) -> zipimporter object\nplatform.DEV_NULL\nplatform.architecture(??)\nplatform.collections(??)\nplatform.dist(??)\nplatform.java_ver(??)\nplatform.libc_ver(??)\nplatform.linux_distribution(??)\nplatform.mac_ver(??)\nplatform.machine(??)\nplatform.node(??)\nplatform.os(??)\nplatform.platform(??)\nplatform.popen(??)\nplatform.processor(??)\nplatform.python_branch(??)\nplatform.python_build(??)\nplatform.python_compiler(??)\nplatform.python_implementation(??)\nplatform.python_revision(??)\nplatform.python_version(??)\nplatform.python_version_tuple(??)\nplatform.re(??)\nplatform.release(??)\nplatform.sys(??)\nplatform.system(??)\nplatform.system_alias(??)\nplatform.uname(??)\nplatform.uname_result(system, node, release, version, machine, processor)\nplatform.version(??)\nplatform.win32_ver(??)\nplistlib.BytesIO([buffer]) -> object\nplistlib.Data(??)\nplistlib.Dict(??)\nplistlib.DumbXMLWriter(??)\nplistlib.PLISTHEADER\nplistlib.Plist(??)\nplistlib.PlistParser(??)\nplistlib.PlistWriter(??)\nplistlib.binascii(??)\nplistlib.datetime(??)\nplistlib.re(??)\nplistlib.readPlist(??)\nplistlib.readPlistFromBytes(??)\nplistlib.writePlist(??)\nplistlib.writePlistToBytes(??)\npoplib.CR\npoplib.CRLF\npoplib.LF\npoplib.POP3(??)\npoplib.POP3_PORT\npoplib.POP3_SSL(??)\npoplib.POP3_SSL_PORT\npoplib.error_proto(??)\npoplib.re(??)\npoplib.socket(??)\npoplib.ssl(??)\nposix.CLD_CONTINUED\nposix.CLD_DUMPED\nposix.CLD_EXITED\nposix.CLD_TRAPPED\nposix.EX_CANTCREAT\nposix.EX_CONFIG\nposix.EX_DATAERR\nposix.EX_IOERR\nposix.EX_NOHOST\nposix.EX_NOINPUT\nposix.EX_NOPERM\nposix.EX_NOUSER\nposix.EX_OK\nposix.EX_OSERR\nposix.EX_OSFILE\nposix.EX_PROTOCOL\nposix.EX_SOFTWARE\nposix.EX_TEMPFAIL\nposix.EX_UNAVAILABLE\nposix.EX_USAGE\nposix.F_LOCK\nposix.F_OK\nposix.F_TEST\nposix.F_TLOCK\nposix.F_ULOCK\nposix.NGROUPS_MAX\nposix.O_ACCMODE\nposix.O_APPEND\nposix.O_ASYNC\nposix.O_CREAT\nposix.O_DIRECTORY\nposix.O_DSYNC\nposix.O_EXCL\nposix.O_EXLOCK\nposix.O_NDELAY\nposix.O_NOCTTY\nposix.O_NOFOLLOW\nposix.O_NONBLOCK\nposix.O_RDONLY\nposix.O_RDWR\nposix.O_SHLOCK\nposix.O_SYNC\nposix.O_TRUNC\nposix.O_WRONLY\nposix.PRIO_PGRP\nposix.PRIO_PROCESS\nposix.PRIO_USER\nposix.P_ALL\nposix.P_PGID\nposix.P_PID\nposix.RTLD_GLOBAL\nposix.RTLD_LAZY\nposix.RTLD_LOCAL\nposix.RTLD_NODELETE\nposix.RTLD_NOLOAD\nposix.RTLD_NOW\nposix.R_OK\nposix.SCHED_FIFO\nposix.SCHED_OTHER\nposix.SCHED_RR\nposix.ST_NOSUID\nposix.ST_RDONLY\nposix.TMP_MAX\nposix.WCONTINUED\nposix.WCOREDUMP(status) -> bool\nposix.WEXITED\nposix.WEXITSTATUS(status) -> integer\nposix.WIFCONTINUED(status) -> bool\nposix.WIFEXITED(status) -> bool\nposix.WIFSIGNALED(status) -> bool\nposix.WIFSTOPPED(status) -> bool\nposix.WNOHANG\nposix.WNOWAIT\nposix.WSTOPPED\nposix.WSTOPSIG(status) -> integer\nposix.WTERMSIG(status) -> integer\nposix.WUNTRACED\nposix.W_OK\nposix.X_OK\nposix.abort() -> does not return!\nposix.access(path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True)\nposix.chdir(path)\nposix.chflags(path, flags, *, follow_symlinks=True)\nposix.chmod(path, mode, *, dir_fd=None, follow_symlinks=True)\nposix.chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True)\nposix.chroot(path)\nposix.close(fd)\nposix.closerange(fd_low, fd_high)\nposix.confstr(name) -> string\nposix.confstr_names(??)\nposix.ctermid() -> string\nposix.device_encoding(fd) -> str\nposix.dup(fd) -> fd2\nposix.dup2(old_fd, new_fd)\nposix.environ(??)\nposix.error(??)\nposix.execv(path, args)\nposix.execve(path, args, env)\nposix.fchdir(fd)\nposix.fchmod(fd, mode)\nposix.fchown(fd, uid, gid)\nposix.fork() -> pid\nposix.forkpty() -> (pid, master_fd)\nposix.fpathconf(fd, name) -> integer\nposix.fstat(fd) -> stat result\nposix.fstatvfs(fd) -> statvfs result\nposix.fsync(fildes)\nposix.ftruncate(fd, length)\nposix.get_terminal_size(??)\nposix.getcwd() -> path\nposix.getcwdb() -> path\nposix.getegid() -> egid\nposix.geteuid() -> euid\nposix.getgid() -> gid\nposix.getgrouplist(user, group) -> list of groups to which a user belongs\nposix.getgroups() -> list of group IDs\nposix.getloadavg() -> (float, float, float)\nposix.getlogin() -> string\nposix.getpgid(pid) -> pgid\nposix.getpgrp() -> pgrp\nposix.getpid() -> pid\nposix.getppid() -> ppid\nposix.getpriority(which, who) -> current_priority\nposix.getsid(pid) -> sid\nposix.getuid() -> uid\nposix.initgroups(username, gid) -> None\nposix.isatty(fd) -> bool\nposix.kill(pid, sig)\nposix.killpg(pgid, sig)\nposix.lchflags(path, flags)\nposix.lchmod(path, mode)\nposix.lchown(path, uid, gid)\nposix.link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True)\nposix.listdir(path='.') -> list_of_filenames\nposix.lockf(fd, cmd, len)\nposix.lseek(fd, pos, how) -> newpos\nposix.lstat(path, *, dir_fd=None) -> stat result\nposix.major(device) -> major number\nposix.makedev(major, minor) -> device number\nposix.minor(device) -> minor number\nposix.mkdir(path, mode=0o777, *, dir_fd=None)\nposix.mkfifo(path, mode=0o666, *, dir_fd=None)\nposix.mknod(filename, mode=0o600, device=0, *, dir_fd=None)\nposix.nice(inc) -> new_priority\nposix.open(path, flags, mode=0o777, *, dir_fd=None)\nposix.openpty() -> (master_fd, slave_fd)\nposix.pathconf(path, name) -> integer\nposix.pathconf_names(??)\nposix.pipe() -> (read_end, write_end)\nposix.pread(fd, buffersize, offset) -> string\nposix.putenv(key, value)\nposix.pwrite(fd, string, offset) -> byteswritten\nposix.read(fd, buffersize) -> string\nposix.readlink(path, *, dir_fd=None) -> path\nposix.readv(fd, buffers) -> bytesread\nposix.remove(path, *, dir_fd=None)\nposix.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)\nposix.replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None)\nposix.rmdir(path, *, dir_fd=None)\nposix.sched_get_priority_max(policy)\nposix.sched_get_priority_min(policy)\nposix.sched_yield()\nposix.sendfile(out, in, offset, nbytes) -> byteswritten\nposix.setegid(gid)\nposix.seteuid(uid)\nposix.setgid(gid)\nposix.setgroups(list)\nposix.setpgid(pid, pgrp)\nposix.setpgrp()\nposix.setpriority(which, who, prio) -> None\nposix.setregid(rgid, egid)\nposix.setreuid(ruid, euid)\nposix.setsid()\nposix.setuid(uid)\nposix.stat(path, *, dir_fd=None, follow_symlinks=True) -> stat result\nposix.stat_float_times([newval]) -> oldval\nposix.stat_result(??)\nposix.statvfs(path)\nposix.statvfs_result(??)\nposix.strerror(code) -> string\nposix.symlink(src, dst, target_is_directory=False, *, dir_fd=None)\nposix.sync()\nposix.sysconf(name) -> integer\nposix.sysconf_names(??)\nposix.system(command) -> exit_status\nposix.tcgetpgrp(fd) -> pgid\nposix.tcsetpgrp(fd, pgid)\nposix.terminal_size(??)\nposix.times() -> times_result\nposix.times_result(??)\nposix.truncate(path, length)\nposix.ttyname(fd) -> string\nposix.umask(new_mask) -> old_mask\nposix.uname() -> uname_result\nposix.uname_result(??)\nposix.unlink(path, *, dir_fd=None)\nposix.unsetenv(key)\nposix.urandom(n) -> str\nposix.utime(path, times=None, *, ns=None, dir_fd=None, follow_symlinks=True)\nposix.wait() -> (pid, status)\nposix.wait3(options) -> (pid, status, rusage)\nposix.wait4(pid, options) -> (pid, status, rusage)\nposix.waitpid(pid, options) -> (pid, status)\nposix.write(fd, string) -> byteswritten\nposix.writev(fd, buffers) -> byteswritten\npow(x, y[, z]) -> number\npprint.PrettyPrinter(??)\npprint.isreadable(??)\npprint.isrecursive(??)\npprint.pformat(??)\npprint.pprint(??)\npprint.saferepr(??)\nprint(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\nprofile.OptionParser(??)\nprofile.Profile(??)\nprofile.main(??)\nprofile.marshal(??)\nprofile.os(??)\nprofile.run(??)\nprofile.runctx(??)\nprofile.sys(??)\nprofile.time(??)\nproperty(fget=None, fset=None, fdel=None, doc=None) -> property attribute\npstats.Stats(??)\npstats.TupleComp(??)\npstats.add_callers(??)\npstats.add_func_stats(??)\npstats.cmp_to_key(??)\npstats.count_calls(??)\npstats.f8(??)\npstats.func_get_function_name(??)\npstats.func_std_string(??)\npstats.func_strip_path(??)\npstats.marshal(??)\npstats.os(??)\npstats.re(??)\npstats.sys(??)\npstats.time(??)\npty.CHILD\npty.STDERR_FILENO\npty.STDIN_FILENO\npty.STDOUT_FILENO\npty.fork() -> (pid, master_fd)\npty.master_open() -> (master_fd, slave_name)\npty.openpty() -> (master_fd, slave_fd)\npty.os(??)\npty.select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\npty.slave_open(tty_name) -> slave_fd\npty.spawn(??)\npty.tty(??)\npwd.getpwall() -> list_of_entries\npwd.getpwnam(name) -> (pw_name,pw_passwd,pw_uid,\npwd.getpwuid(uid) -> (pw_name,pw_passwd,pw_uid,\npwd.struct_passwd(??)\npy_compile.MAGIC\npy_compile.PyCompileError(??)\npy_compile.builtins(??)\npy_compile.compile(??)\npy_compile.errno(??)\npy_compile.imp(??)\npy_compile.main(??)\npy_compile.marshal(??)\npy_compile.os(??)\npy_compile.sys(??)\npy_compile.tokenize(??)\npy_compile.traceback(??)\npy_compile.wr_long(??)\npyclbr.Class(??)\npyclbr.DEDENT\npyclbr.Function(??)\npyclbr.NAME\npyclbr.OP\npyclbr.importlib(??)\npyclbr.io(??)\npyclbr.itemgetter(item, ...) --> itemgetter object\npyclbr.os(??)\npyclbr.readmodule(??)\npyclbr.readmodule_ex(??)\npyclbr.sys(??)\npyclbr.tokenize(??)\npydoc.Doc(??)\npydoc.ErrorDuringImport(??)\npydoc.HTMLDoc(??)\npydoc.HTMLRepr(??)\npydoc.Helper(??)\npydoc.ModuleScanner(??)\npydoc.Repr(??)\npydoc.Scanner(??)\npydoc.TextDoc(??)\npydoc.TextRepr(??)\npydoc.allmethods(??)\npydoc.apropos(??)\npydoc.browse(??)\npydoc.builtins(??)\npydoc.classify_class_attrs(??)\npydoc.classname(??)\npydoc.cli(??)\npydoc.cram(??)\npydoc.deque(iterable[, maxlen]) --> deque object\npydoc.describe(??)\npydoc.doc(??)\npydoc.extract_tb(??)\npydoc.format_exception_only(??)\npydoc.getdoc(??)\npydoc.getpager(??)\npydoc.help(??)\npydoc.html(??)\npydoc.imp(??)\npydoc.importfile(??)\npydoc.importlib(??)\npydoc.inspect(??)\npydoc.io(??)\npydoc.isdata(??)\npydoc.ispackage(??)\npydoc.ispath(??)\npydoc.locate(??)\npydoc.os(??)\npydoc.pager(??)\npydoc.pathdirs(??)\npydoc.pipepager(??)\npydoc.pkgutil(??)\npydoc.plain(??)\npydoc.plainpager(??)\npydoc.plaintext(??)\npydoc.platform(??)\npydoc.re(??)\npydoc.render_doc(??)\npydoc.replace(??)\npydoc.resolve(??)\npydoc.safeimport(??)\npydoc.source_synopsis(??)\npydoc.splitdoc(??)\npydoc.stripid(??)\npydoc.synopsis(??)\npydoc.sys(??)\npydoc.tempfilepager(??)\npydoc.text(??)\npydoc.time(??)\npydoc.tokenize(??)\npydoc.ttypager(??)\npydoc.visiblename(??)\npydoc.warnings(??)\npydoc.writedoc(??)\npydoc.writedocs(??)\npydoc_data.topics.topics(??)\nqueue.Empty(??)\nqueue.Full(??)\nqueue.LifoQueue(??)\nqueue.PriorityQueue(??)\nqueue.Queue(??)\nqueue.deque(iterable[, maxlen]) --> deque object\nqueue.heappop(??)\nqueue.heappush(??)\nqueue.threading(??)\nqueue.time(??)\nquit(??)\nquopri.EMPTYSTRING\nquopri.ESCAPE\nquopri.HEX\nquopri.MAXLINESIZE\nquopri.a2b_qp(??)\nquopri.b2a_qp(data, quotetabs=0, istext=1, header=0) -> s;\nquopri.decode(??)\nquopri.decodestring(??)\nquopri.encode(??)\nquopri.encodestring(??)\nquopri.ishex(??)\nquopri.main(??)\nquopri.needsquoting(??)\nquopri.quote(??)\nquopri.unhex(??)\nrandom.BPF\nrandom.LOG4\nrandom.NV_MAGICCONST\nrandom.RECIP_BPF\nrandom.Random(??)\nrandom.SG_MAGICCONST\nrandom.SystemRandom(??)\nrandom.TWOPI\nrandom.betavariate(??)\nrandom.choice(??)\nrandom.expovariate(??)\nrandom.gammavariate(??)\nrandom.gauss(??)\nrandom.getrandbits(k) -> x.  Generates a long int with k random bits.\nrandom.getstate(??)\nrandom.lognormvariate(??)\nrandom.normalvariate(??)\nrandom.paretovariate(??)\nrandom.randint(??)\nrandom.random() -> x in the interval [0, 1).\nrandom.randrange(??)\nrandom.sample(??)\nrandom.seed(??)\nrandom.setstate(??)\nrandom.shuffle(??)\nrandom.triangular(??)\nrandom.uniform(??)\nrandom.vonmisesvariate(??)\nrandom.weibullvariate(??)\nrange([start,] stop[, step]) -> range object\nre.A\nre.ASCII\nre.DEBUG\nre.DOTALL\nre.I\nre.IGNORECASE\nre.L\nre.LOCALE\nre.M\nre.MULTILINE\nre.S\nre.Scanner(??)\nre.T\nre.TEMPLATE\nre.U\nre.UNICODE\nre.VERBOSE\nre.X\nre.compile(??)\nre.copyreg(??)\nre.error(??)\nre.escape(??)\nre.findall(??)\nre.finditer(??)\nre.functools(??)\nre.match(??)\nre.purge(??)\nre.search(??)\nre.split(??)\nre.sre_compile(??)\nre.sre_parse(??)\nre.sub(??)\nre.subn(??)\nre.sys(??)\nre.template(??)\nreadline.add_history(string) -> None\nreadline.clear_history() -> None\nreadline.get_begidx() -> int\nreadline.get_completer() -> function\nreadline.get_completer_delims() -> string\nreadline.get_completion_type() -> int\nreadline.get_current_history_length() -> integer\nreadline.get_endidx() -> int\nreadline.get_history_item() -> string\nreadline.get_history_length() -> int\nreadline.get_line_buffer() -> string\nreadline.insert_text(string) -> None\nreadline.parse_and_bind(string) -> None\nreadline.read_history_file([filename]) -> None\nreadline.read_init_file([filename]) -> None\nreadline.redisplay() -> None\nreadline.remove_history_item(pos) -> None\nreadline.replace_history_item(pos, line) -> None\nreadline.set_completer([function]) -> None\nreadline.set_completer_delims(string) -> None\nreadline.set_completion_display_matches_hook([function]) -> None\nreadline.set_history_length(length) -> None\nreadline.set_pre_input_hook([function]) -> None\nreadline.set_startup_hook([function]) -> None\nreadline.write_history_file([filename]) -> None\nrepr(object) -> string\nreprlib.Repr(??)\nreprlib.aRepr(??)\nreprlib.builtins(??)\nreprlib.get_ident() -> integer\nreprlib.islice(iterable, [start,] stop [, step]) --> islice object\nreprlib.recursive_repr(??)\nreprlib.repr(??)\nresource.RLIMIT_AS\nresource.RLIMIT_CORE\nresource.RLIMIT_CPU\nresource.RLIMIT_DATA\nresource.RLIMIT_FSIZE\nresource.RLIMIT_MEMLOCK\nresource.RLIMIT_NOFILE\nresource.RLIMIT_NPROC\nresource.RLIMIT_RSS\nresource.RLIMIT_STACK\nresource.RLIM_INFINITY\nresource.RUSAGE_CHILDREN\nresource.RUSAGE_SELF\nresource.error(??)\nresource.getpagesize(??)\nresource.getrlimit(??)\nresource.getrusage(??)\nresource.setrlimit(??)\nresource.struct_rusage(??)\nreversed(sequence) -> reverse iterator over values of the sequence\nrlcompleter.Completer(??)\nrlcompleter.builtins(??)\nrlcompleter.get_class_members(??)\nrlcompleter.readline(??)\nround(number[, ndigits]) -> number\nrunpy.get_importer(??)\nrunpy.get_loader(??)\nrunpy.imp(??)\nrunpy.importlib(??)\nrunpy.os(??)\nrunpy.read_code(??)\nrunpy.run_module(??)\nrunpy.run_path(??)\nrunpy.sys(??)\nsched.Event(??)\nsched.heapq(??)\nsched.namedtuple(??)\nsched.scheduler(??)\nsched.threading(??)\nsched.time(??)\nselect.KQ_EV_ADD\nselect.KQ_EV_CLEAR\nselect.KQ_EV_DELETE\nselect.KQ_EV_DISABLE\nselect.KQ_EV_ENABLE\nselect.KQ_EV_EOF\nselect.KQ_EV_ERROR\nselect.KQ_EV_FLAG1\nselect.KQ_EV_ONESHOT\nselect.KQ_EV_SYSFLAGS\nselect.KQ_FILTER_AIO\nselect.KQ_FILTER_PROC\nselect.KQ_FILTER_READ\nselect.KQ_FILTER_SIGNAL\nselect.KQ_FILTER_TIMER\nselect.KQ_FILTER_VNODE\nselect.KQ_FILTER_WRITE\nselect.KQ_NOTE_ATTRIB\nselect.KQ_NOTE_CHILD\nselect.KQ_NOTE_DELETE\nselect.KQ_NOTE_EXEC\nselect.KQ_NOTE_EXIT\nselect.KQ_NOTE_EXTEND\nselect.KQ_NOTE_FORK\nselect.KQ_NOTE_LINK\nselect.KQ_NOTE_LOWAT\nselect.KQ_NOTE_PCTRLMASK\nselect.KQ_NOTE_PDATAMASK\nselect.KQ_NOTE_RENAME\nselect.KQ_NOTE_REVOKE\nselect.KQ_NOTE_TRACK\nselect.KQ_NOTE_TRACKERR\nselect.KQ_NOTE_WRITE\nselect.PIPE_BUF\nselect.POLLERR\nselect.POLLHUP\nselect.POLLIN\nselect.POLLNVAL\nselect.POLLOUT\nselect.POLLPRI\nselect.POLLRDBAND\nselect.POLLRDNORM\nselect.POLLWRBAND\nselect.POLLWRNORM\nselect.error(??)\nselect.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)\nselect.kqueue(??)\nselect.poll(??)\nselect.select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\nset() -> new empty set object\nsetattr(object, name, value)\nshelve.BsdDbShelf(??)\nshelve.BytesIO([buffer]) -> object\nshelve.DbfilenameShelf(??)\nshelve.Pickler(file, protocol=None)\nshelve.Shelf(??)\nshelve.Unpickler(file, *, encoding='ASCII', errors='strict')\nshelve.collections(??)\nshelve.open(??)\nshlex.StringIO(??)\nshlex.deque(iterable[, maxlen]) --> deque object\nshlex.os(??)\nshlex.quote(??)\nshlex.re(??)\nshlex.shlex(??)\nshlex.split(??)\nshlex.sys(??)\nshutil.Error(??)\nshutil.ExecError(??)\nshutil.ReadError(??)\nshutil.RegistryError(??)\nshutil.SpecialFileError(??)\nshutil.WindowsError(??)\nshutil.abspath(??)\nshutil.chown(??)\nshutil.collections(??)\nshutil.copy(??)\nshutil.copy2(??)\nshutil.copyfile(??)\nshutil.copyfileobj(??)\nshutil.copymode(??)\nshutil.copystat(??)\nshutil.copytree(??)\nshutil.disk_usage(??)\nshutil.errno(??)\nshutil.fnmatch(??)\nshutil.get_archive_formats(??)\nshutil.get_terminal_size(??)\nshutil.get_unpack_formats(??)\nshutil.getgrnam(name) -> tuple\nshutil.getpwnam(name) -> (pw_name,pw_passwd,pw_uid,\nshutil.ignore_patterns(??)\nshutil.make_archive(??)\nshutil.move(??)\nshutil.os(??)\nshutil.register_archive_format(??)\nshutil.register_unpack_format(??)\nshutil.rmtree(??)\nshutil.stat(??)\nshutil.sys(??)\nshutil.tarfile(??)\nshutil.unpack_archive(??)\nshutil.unregister_archive_format(??)\nshutil.unregister_unpack_format(??)\nshutil.which(??)\nsignal.ITIMER_PROF\nsignal.ITIMER_REAL\nsignal.ITIMER_VIRTUAL\nsignal.ItimerError(??)\nsignal.NSIG\nsignal.SIGABRT\nsignal.SIGALRM\nsignal.SIGBUS\nsignal.SIGCHLD\nsignal.SIGCONT\nsignal.SIGEMT\nsignal.SIGFPE\nsignal.SIGHUP\nsignal.SIGILL\nsignal.SIGINFO\nsignal.SIGINT\nsignal.SIGIO\nsignal.SIGIOT\nsignal.SIGKILL\nsignal.SIGPIPE\nsignal.SIGPROF\nsignal.SIGQUIT\nsignal.SIGSEGV\nsignal.SIGSTOP\nsignal.SIGSYS\nsignal.SIGTERM\nsignal.SIGTRAP\nsignal.SIGTSTP\nsignal.SIGTTIN\nsignal.SIGTTOU\nsignal.SIGURG\nsignal.SIGUSR1\nsignal.SIGUSR2\nsignal.SIGVTALRM\nsignal.SIGWINCH\nsignal.SIGXCPU\nsignal.SIGXFSZ\nsignal.SIG_BLOCK\nsignal.SIG_DFL\nsignal.SIG_IGN\nsignal.SIG_SETMASK\nsignal.SIG_UNBLOCK\nsignal.alarm(seconds)\nsignal.default_int_handler(...)\nsignal.getitimer(which)\nsignal.getsignal(sig) -> action\nsignal.pause()\nsignal.pthread_kill(thread_id, signum)\nsignal.pthread_sigmask(how, mask) -> old mask\nsignal.set_wakeup_fd(fd) -> fd\nsignal.setitimer(which, seconds[, interval])\nsignal.siginterrupt(sig, flag) -> None\nsignal.signal(sig, action) -> action\nsignal.sigpending() -> list\nsignal.sigwait(sigset) -> signum\nsite.CONFIG_LINE(??)\nsite.ENABLE_USER_SITE(??)\nsite.PREFIXES(??)\nsite.USER_BASE\nsite.USER_SITE\nsite.abs_paths(??)\nsite.addpackage(??)\nsite.addsitedir(??)\nsite.addsitepackages(??)\nsite.addusersitepackages(??)\nsite.aliasmbcs(??)\nsite.builtins(??)\nsite.check_enableusersite(??)\nsite.execsitecustomize(??)\nsite.execusercustomize(??)\nsite.getsitepackages(??)\nsite.getuserbase(??)\nsite.getusersitepackages(??)\nsite.main(??)\nsite.makepath(??)\nsite.os(??)\nsite.re(??)\nsite.removeduppaths(??)\nsite.setBEGINLIBPATH(??)\nsite.setcopyright(??)\nsite.sethelper(??)\nsite.setquit(??)\nsite.sys(??)\nsite.venv(??)\nslice([start,] stop[, step])\nsmtpd.COMMASPACE\nsmtpd.DATA_SIZE_DEFAULT\nsmtpd.DEBUGSTREAM(??)\nsmtpd.DebuggingServer(??)\nsmtpd.Devnull(??)\nsmtpd.EMPTYSTRING\nsmtpd.MailmanProxy(??)\nsmtpd.NEWLINE\nsmtpd.Options(??)\nsmtpd.PureProxy(??)\nsmtpd.SMTPChannel(??)\nsmtpd.SMTPServer(??)\nsmtpd.asynchat(??)\nsmtpd.asyncore(??)\nsmtpd.collections(??)\nsmtpd.errno(??)\nsmtpd.get_addr_spec(??)\nsmtpd.get_angle_addr(??)\nsmtpd.getopt(??)\nsmtpd.os(??)\nsmtpd.parseargs(??)\nsmtpd.program\nsmtpd.socket(??)\nsmtpd.sys(??)\nsmtpd.time(??)\nsmtpd.usage(??)\nsmtpd.warn(??)\nsmtplib.CRLF\nsmtplib.LMTP(??)\nsmtplib.LMTP_PORT\nsmtplib.OLDSTYLE_AUTH(??)\nsmtplib.SMTP(??)\nsmtplib.SMTPAuthenticationError(??)\nsmtplib.SMTPConnectError(??)\nsmtplib.SMTPDataError(??)\nsmtplib.SMTPException(??)\nsmtplib.SMTPHeloError(??)\nsmtplib.SMTPRecipientsRefused(??)\nsmtplib.SMTPResponseException(??)\nsmtplib.SMTPSenderRefused(??)\nsmtplib.SMTPServerDisconnected(??)\nsmtplib.SMTP_PORT\nsmtplib.SMTP_SSL(??)\nsmtplib.SMTP_SSL_PORT\nsmtplib.bCRLF\nsmtplib.base64(??)\nsmtplib.copy(??)\nsmtplib.email(??)\nsmtplib.encode_base64(??)\nsmtplib.hmac(??)\nsmtplib.io(??)\nsmtplib.quoteaddr(??)\nsmtplib.quotedata(??)\nsmtplib.re(??)\nsmtplib.socket(??)\nsmtplib.ssl(??)\nsmtplib.stderr(??)\nsndhdr.get_long_be(??)\nsndhdr.get_long_le(??)\nsndhdr.get_short_be(??)\nsndhdr.get_short_le(??)\nsndhdr.test(??)\nsndhdr.test_8svx(??)\nsndhdr.test_aifc(??)\nsndhdr.test_au(??)\nsndhdr.test_hcom(??)\nsndhdr.test_sndr(??)\nsndhdr.test_sndt(??)\nsndhdr.test_voc(??)\nsndhdr.test_wav(??)\nsndhdr.testall(??)\nsndhdr.tests(??)\nsndhdr.what(??)\nsndhdr.whathdr(??)\nsocket.AF_APPLETALK\nsocket.AF_DECnet\nsocket.AF_INET\nsocket.AF_INET6\nsocket.AF_IPX\nsocket.AF_ROUTE\nsocket.AF_SNA\nsocket.AF_SYSTEM\nsocket.AF_UNIX\nsocket.AF_UNSPEC\nsocket.AI_ADDRCONFIG\nsocket.AI_ALL\nsocket.AI_CANONNAME\nsocket.AI_DEFAULT\nsocket.AI_MASK\nsocket.AI_NUMERICHOST\nsocket.AI_NUMERICSERV\nsocket.AI_PASSIVE\nsocket.AI_V4MAPPED\nsocket.AI_V4MAPPED_CFG\nsocket.CAPI(??)\nsocket.CMSG_LEN(length) -> control message length\nsocket.CMSG_SPACE(length) -> buffer size\nsocket.EAGAIN\nsocket.EAI_ADDRFAMILY\nsocket.EAI_AGAIN\nsocket.EAI_BADFLAGS\nsocket.EAI_BADHINTS\nsocket.EAI_FAIL\nsocket.EAI_FAMILY\nsocket.EAI_MAX\nsocket.EAI_MEMORY\nsocket.EAI_NODATA\nsocket.EAI_NONAME\nsocket.EAI_OVERFLOW\nsocket.EAI_PROTOCOL\nsocket.EAI_SERVICE\nsocket.EAI_SOCKTYPE\nsocket.EAI_SYSTEM\nsocket.EBADF\nsocket.EWOULDBLOCK\nsocket.INADDR_ALLHOSTS_GROUP\nsocket.INADDR_ANY\nsocket.INADDR_BROADCAST\nsocket.INADDR_LOOPBACK\nsocket.INADDR_MAX_LOCAL_GROUP\nsocket.INADDR_NONE\nsocket.INADDR_UNSPEC_GROUP\nsocket.IPPORT_RESERVED\nsocket.IPPORT_USERRESERVED\nsocket.IPPROTO_AH\nsocket.IPPROTO_DSTOPTS\nsocket.IPPROTO_EGP\nsocket.IPPROTO_EON\nsocket.IPPROTO_ESP\nsocket.IPPROTO_FRAGMENT\nsocket.IPPROTO_GGP\nsocket.IPPROTO_GRE\nsocket.IPPROTO_HELLO\nsocket.IPPROTO_HOPOPTS\nsocket.IPPROTO_ICMP\nsocket.IPPROTO_ICMPV6\nsocket.IPPROTO_IDP\nsocket.IPPROTO_IGMP\nsocket.IPPROTO_IP\nsocket.IPPROTO_IPCOMP\nsocket.IPPROTO_IPIP\nsocket.IPPROTO_IPV4\nsocket.IPPROTO_IPV6\nsocket.IPPROTO_MAX\nsocket.IPPROTO_ND\nsocket.IPPROTO_NONE\nsocket.IPPROTO_PIM\nsocket.IPPROTO_PUP\nsocket.IPPROTO_RAW\nsocket.IPPROTO_ROUTING\nsocket.IPPROTO_RSVP\nsocket.IPPROTO_TCP\nsocket.IPPROTO_TP\nsocket.IPPROTO_UDP\nsocket.IPPROTO_XTP\nsocket.IPV6_CHECKSUM\nsocket.IPV6_DSTOPTS\nsocket.IPV6_HOPLIMIT\nsocket.IPV6_HOPOPTS\nsocket.IPV6_JOIN_GROUP\nsocket.IPV6_LEAVE_GROUP\nsocket.IPV6_MULTICAST_HOPS\nsocket.IPV6_MULTICAST_IF\nsocket.IPV6_MULTICAST_LOOP\nsocket.IPV6_NEXTHOP\nsocket.IPV6_PKTINFO\nsocket.IPV6_RECVTCLASS\nsocket.IPV6_RTHDR\nsocket.IPV6_RTHDR_TYPE_0\nsocket.IPV6_TCLASS\nsocket.IPV6_UNICAST_HOPS\nsocket.IPV6_V6ONLY\nsocket.IP_ADD_MEMBERSHIP\nsocket.IP_DEFAULT_MULTICAST_LOOP\nsocket.IP_DEFAULT_MULTICAST_TTL\nsocket.IP_DROP_MEMBERSHIP\nsocket.IP_HDRINCL\nsocket.IP_MAX_MEMBERSHIPS\nsocket.IP_MULTICAST_IF\nsocket.IP_MULTICAST_LOOP\nsocket.IP_MULTICAST_TTL\nsocket.IP_OPTIONS\nsocket.IP_RECVDSTADDR\nsocket.IP_RECVOPTS\nsocket.IP_RECVRETOPTS\nsocket.IP_RETOPTS\nsocket.IP_TOS\nsocket.IP_TTL\nsocket.LOCAL_PEERCRED\nsocket.MSG_CTRUNC\nsocket.MSG_DONTROUTE\nsocket.MSG_DONTWAIT\nsocket.MSG_EOF\nsocket.MSG_EOR\nsocket.MSG_OOB\nsocket.MSG_PEEK\nsocket.MSG_TRUNC\nsocket.MSG_WAITALL\nsocket.NI_DGRAM\nsocket.NI_MAXHOST\nsocket.NI_MAXSERV\nsocket.NI_NAMEREQD\nsocket.NI_NOFQDN\nsocket.NI_NUMERICHOST\nsocket.NI_NUMERICSERV\nsocket.PF_SYSTEM\nsocket.SCM_CREDS\nsocket.SCM_RIGHTS\nsocket.SHUT_RD\nsocket.SHUT_RDWR\nsocket.SHUT_WR\nsocket.SOCK_DGRAM\nsocket.SOCK_RAW\nsocket.SOCK_RDM\nsocket.SOCK_SEQPACKET\nsocket.SOCK_STREAM\nsocket.SOL_IP\nsocket.SOL_SOCKET\nsocket.SOL_TCP\nsocket.SOL_UDP\nsocket.SOMAXCONN\nsocket.SO_ACCEPTCONN\nsocket.SO_BROADCAST\nsocket.SO_DEBUG\nsocket.SO_DONTROUTE\nsocket.SO_ERROR\nsocket.SO_KEEPALIVE\nsocket.SO_LINGER\nsocket.SO_OOBINLINE\nsocket.SO_RCVBUF\nsocket.SO_RCVLOWAT\nsocket.SO_RCVTIMEO\nsocket.SO_REUSEADDR\nsocket.SO_REUSEPORT\nsocket.SO_SNDBUF\nsocket.SO_SNDLOWAT\nsocket.SO_SNDTIMEO\nsocket.SO_TYPE\nsocket.SO_USELOOPBACK\nsocket.SYSPROTO_CONTROL\nsocket.SocketIO(??)\nsocket.SocketType(??)\nsocket.TCP_MAXSEG\nsocket.TCP_NODELAY\nsocket.create_connection(??)\nsocket.dup(integer) -> integer\nsocket.errno(??)\nsocket.error(??)\nsocket.fromfd(fd, family, type[, proto]) -> socket object\nsocket.gaierror(??)\nsocket.getaddrinfo(host, port [, family, socktype, proto, flags])\nsocket.getdefaulttimeout() -> timeout\nsocket.getfqdn(??)\nsocket.gethostbyaddr(host) -> (name, aliaslist, addresslist)\nsocket.gethostbyname(host) -> address\nsocket.gethostbyname_ex(host) -> (name, aliaslist, addresslist)\nsocket.gethostname() -> string\nsocket.getnameinfo(sockaddr, flags) --> (host, port)\nsocket.getprotobyname(name) -> integer\nsocket.getservbyname(servicename[, protocolname]) -> integer\nsocket.getservbyport(port[, protocolname]) -> string\nsocket.has_ipv6(??)\nsocket.herror(??)\nsocket.htonl(integer) -> integer\nsocket.htons(integer) -> integer\nsocket.if_indextoname(if_index)\nsocket.if_nameindex()\nsocket.if_nametoindex(if_name)\nsocket.inet_aton(string) -> bytes giving packed 32-bit IP representation\nsocket.inet_ntoa(packed_ip) -> ip_address_string\nsocket.inet_ntop(af, packed_ip) -> string formatted IP address\nsocket.inet_pton(af, ip) -> packed IP address string\nsocket.io(??)\nsocket.ntohl(integer) -> integer\nsocket.ntohs(integer) -> integer\nsocket.os(??)\nsocket.setdefaulttimeout(timeout)\nsocket.sethostname(name)\nsocket.socket(??)\nsocket.socketpair([family[, type[, proto]]]) -> (socket object, socket object)\nsocket.sys(??)\nsocket.timeout(??)\nsocketserver.BaseRequestHandler(??)\nsocketserver.BaseServer(??)\nsocketserver.DatagramRequestHandler(??)\nsocketserver.ForkingMixIn(??)\nsocketserver.ForkingTCPServer(??)\nsocketserver.ForkingUDPServer(??)\nsocketserver.StreamRequestHandler(??)\nsocketserver.TCPServer(??)\nsocketserver.ThreadingMixIn(??)\nsocketserver.ThreadingTCPServer(??)\nsocketserver.ThreadingUDPServer(??)\nsocketserver.ThreadingUnixDatagramServer(??)\nsocketserver.ThreadingUnixStreamServer(??)\nsocketserver.UDPServer(??)\nsocketserver.UnixDatagramServer(??)\nsocketserver.UnixStreamServer(??)\nsocketserver.errno(??)\nsocketserver.os(??)\nsocketserver.select(??)\nsocketserver.socket(??)\nsocketserver.sys(??)\nsocketserver.threading(??)\nsorted(iterable, key=None, reverse=False) --> new sorted list\nsqlite3.Binary(??)\nsqlite3.Cache(??)\nsqlite3.Connection(??)\nsqlite3.Cursor(??)\nsqlite3.DataError(??)\nsqlite3.DatabaseError(??)\nsqlite3.Date(??)\nsqlite3.DateFromTicks(??)\nsqlite3.Error(??)\nsqlite3.IntegrityError(??)\nsqlite3.InterfaceError(??)\nsqlite3.InternalError(??)\nsqlite3.NotSupportedError(??)\nsqlite3.OperationalError(??)\nsqlite3.OptimizedUnicode(??)\nsqlite3.PARSE_COLNAMES\nsqlite3.PARSE_DECLTYPES\nsqlite3.PrepareProtocol(??)\nsqlite3.ProgrammingError(??)\nsqlite3.Row(??)\nsqlite3.SQLITE_ALTER_TABLE\nsqlite3.SQLITE_ANALYZE\nsqlite3.SQLITE_ATTACH\nsqlite3.SQLITE_CREATE_INDEX\nsqlite3.SQLITE_CREATE_TABLE\nsqlite3.SQLITE_CREATE_TEMP_INDEX\nsqlite3.SQLITE_CREATE_TEMP_TABLE\nsqlite3.SQLITE_CREATE_TEMP_TRIGGER\nsqlite3.SQLITE_CREATE_TEMP_VIEW\nsqlite3.SQLITE_CREATE_TRIGGER\nsqlite3.SQLITE_CREATE_VIEW\nsqlite3.SQLITE_DELETE\nsqlite3.SQLITE_DENY\nsqlite3.SQLITE_DETACH\nsqlite3.SQLITE_DROP_INDEX\nsqlite3.SQLITE_DROP_TABLE\nsqlite3.SQLITE_DROP_TEMP_INDEX\nsqlite3.SQLITE_DROP_TEMP_TABLE\nsqlite3.SQLITE_DROP_TEMP_TRIGGER\nsqlite3.SQLITE_DROP_TEMP_VIEW\nsqlite3.SQLITE_DROP_TRIGGER\nsqlite3.SQLITE_DROP_VIEW\nsqlite3.SQLITE_IGNORE\nsqlite3.SQLITE_INSERT\nsqlite3.SQLITE_OK\nsqlite3.SQLITE_PRAGMA\nsqlite3.SQLITE_READ\nsqlite3.SQLITE_REINDEX\nsqlite3.SQLITE_SELECT\nsqlite3.SQLITE_TRANSACTION\nsqlite3.SQLITE_UPDATE\nsqlite3.Statement(??)\nsqlite3.Time(??)\nsqlite3.TimeFromTicks(??)\nsqlite3.Timestamp(??)\nsqlite3.TimestampFromTicks(??)\nsqlite3.Warning(??)\nsqlite3.adapt(obj, protocol, alternate) -> adapt obj to given protocol. Non-standard.\nsqlite3.adapters(??)\nsqlite3.apilevel\nsqlite3.complete_statement(sql)\nsqlite3.connect(database[, timeout, isolation_level, detect_types, factory])\nsqlite3.converters(??)\nsqlite3.datetime(??)\nsqlite3.dbapi2(??)\nsqlite3.dbapi2.Binary(??)\nsqlite3.dbapi2.Cache(??)\nsqlite3.dbapi2.Connection(??)\nsqlite3.dbapi2.Cursor(??)\nsqlite3.dbapi2.DataError(??)\nsqlite3.dbapi2.DatabaseError(??)\nsqlite3.dbapi2.Date(??)\nsqlite3.dbapi2.DateFromTicks(??)\nsqlite3.dbapi2.Error(??)\nsqlite3.dbapi2.IntegrityError(??)\nsqlite3.dbapi2.InterfaceError(??)\nsqlite3.dbapi2.InternalError(??)\nsqlite3.dbapi2.NotSupportedError(??)\nsqlite3.dbapi2.OperationalError(??)\nsqlite3.dbapi2.OptimizedUnicode(??)\nsqlite3.dbapi2.PARSE_COLNAMES\nsqlite3.dbapi2.PARSE_DECLTYPES\nsqlite3.dbapi2.PrepareProtocol(??)\nsqlite3.dbapi2.ProgrammingError(??)\nsqlite3.dbapi2.Row(??)\nsqlite3.dbapi2.SQLITE_ALTER_TABLE\nsqlite3.dbapi2.SQLITE_ANALYZE\nsqlite3.dbapi2.SQLITE_ATTACH\nsqlite3.dbapi2.SQLITE_CREATE_INDEX\nsqlite3.dbapi2.SQLITE_CREATE_TABLE\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_INDEX\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_TABLE\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_TRIGGER\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_VIEW\nsqlite3.dbapi2.SQLITE_CREATE_TRIGGER\nsqlite3.dbapi2.SQLITE_CREATE_VIEW\nsqlite3.dbapi2.SQLITE_DELETE\nsqlite3.dbapi2.SQLITE_DENY\nsqlite3.dbapi2.SQLITE_DETACH\nsqlite3.dbapi2.SQLITE_DROP_INDEX\nsqlite3.dbapi2.SQLITE_DROP_TABLE\nsqlite3.dbapi2.SQLITE_DROP_TEMP_INDEX\nsqlite3.dbapi2.SQLITE_DROP_TEMP_TABLE\nsqlite3.dbapi2.SQLITE_DROP_TEMP_TRIGGER\nsqlite3.dbapi2.SQLITE_DROP_TEMP_VIEW\nsqlite3.dbapi2.SQLITE_DROP_TRIGGER\nsqlite3.dbapi2.SQLITE_DROP_VIEW\nsqlite3.dbapi2.SQLITE_IGNORE\nsqlite3.dbapi2.SQLITE_INSERT\nsqlite3.dbapi2.SQLITE_OK\nsqlite3.dbapi2.SQLITE_PRAGMA\nsqlite3.dbapi2.SQLITE_READ\nsqlite3.dbapi2.SQLITE_REINDEX\nsqlite3.dbapi2.SQLITE_SELECT\nsqlite3.dbapi2.SQLITE_TRANSACTION\nsqlite3.dbapi2.SQLITE_UPDATE\nsqlite3.dbapi2.Statement(??)\nsqlite3.dbapi2.Time(??)\nsqlite3.dbapi2.TimeFromTicks(??)\nsqlite3.dbapi2.Timestamp(??)\nsqlite3.dbapi2.TimestampFromTicks(??)\nsqlite3.dbapi2.Warning(??)\nsqlite3.dbapi2.adapt(obj, protocol, alternate) -> adapt obj to given protocol. Non-standard.\nsqlite3.dbapi2.adapters(??)\nsqlite3.dbapi2.apilevel\nsqlite3.dbapi2.complete_statement(sql)\nsqlite3.dbapi2.connect(database[, timeout, isolation_level, detect_types, factory])\nsqlite3.dbapi2.converters(??)\nsqlite3.dbapi2.datetime(??)\nsqlite3.dbapi2.enable_callback_tracebacks(flag)\nsqlite3.dbapi2.enable_shared_cache(do_enable)\nsqlite3.dbapi2.paramstyle\nsqlite3.dbapi2.register_adapter(type, callable)\nsqlite3.dbapi2.register_converter(typename, callable)\nsqlite3.dbapi2.sqlite_version\nsqlite3.dbapi2.sqlite_version_info(??)\nsqlite3.dbapi2.threadsafety\nsqlite3.dbapi2.time(??)\nsqlite3.dbapi2.version\nsqlite3.dbapi2.version_info(??)\nsqlite3.enable_callback_tracebacks(flag)\nsqlite3.enable_shared_cache(do_enable)\nsqlite3.paramstyle\nsqlite3.register_adapter(type, callable)\nsqlite3.register_converter(typename, callable)\nsqlite3.sqlite_version\nsqlite3.sqlite_version_info(??)\nsqlite3.threadsafety\nsqlite3.time(??)\nsqlite3.version\nsqlite3.version_info(??)\nssl.AF_INET\nssl.CERT_NONE\nssl.CERT_OPTIONAL\nssl.CERT_REQUIRED\nssl.CHANNEL_BINDING_TYPES(??)\nssl.CertificateError(??)\nssl.DER_cert_to_PEM_cert(??)\nssl.HAS_ECDH(??)\nssl.HAS_NPN(??)\nssl.HAS_SNI(??)\nssl.OPENSSL_VERSION\nssl.OPENSSL_VERSION_INFO(??)\nssl.OPENSSL_VERSION_NUMBER\nssl.OP_ALL\nssl.OP_CIPHER_SERVER_PREFERENCE\nssl.OP_NO_SSLv2\nssl.OP_NO_SSLv3\nssl.OP_NO_TLSv1\nssl.OP_SINGLE_DH_USE\nssl.OP_SINGLE_ECDH_USE\nssl.PEM_FOOTER\nssl.PEM_HEADER\nssl.PEM_cert_to_DER_cert(??)\nssl.PROTOCOL_SSLv2\nssl.PROTOCOL_SSLv23\nssl.PROTOCOL_SSLv3\nssl.PROTOCOL_TLSv1\nssl.RAND_add(string, entropy)\nssl.RAND_bytes(n) -> bytes\nssl.RAND_egd(path) -> bytes\nssl.RAND_pseudo_bytes(n) -> (bytes, is_cryptographic)\nssl.RAND_status() -> 0 or 1\nssl.SOCK_STREAM\nssl.SSLContext(??)\nssl.SSLEOFError(??)\nssl.SSLError(??)\nssl.SSLSocket(??)\nssl.SSLSyscallError(??)\nssl.SSLWantReadError(??)\nssl.SSLWantWriteError(??)\nssl.SSLZeroReturnError(??)\nssl.SSL_ERROR_EOF\nssl.SSL_ERROR_INVALID_ERROR_CODE\nssl.SSL_ERROR_SSL\nssl.SSL_ERROR_SYSCALL\nssl.SSL_ERROR_WANT_CONNECT\nssl.SSL_ERROR_WANT_READ\nssl.SSL_ERROR_WANT_WRITE\nssl.SSL_ERROR_WANT_X509_LOOKUP\nssl.SSL_ERROR_ZERO_RETURN\nssl.base64(??)\nssl.cert_time_to_seconds(??)\nssl.create_connection(??)\nssl.errno(??)\nssl.get_protocol_name(??)\nssl.get_server_certificate(??)\nssl.match_hostname(??)\nssl.re(??)\nssl.socket(??)\nssl.socket_error(??)\nssl.textwrap(??)\nssl.traceback(??)\nssl.wrap_socket(??)\nstat.SF_APPEND\nstat.SF_ARCHIVED\nstat.SF_IMMUTABLE\nstat.SF_NOUNLINK\nstat.SF_SNAPSHOT\nstat.ST_ATIME\nstat.ST_CTIME\nstat.ST_DEV\nstat.ST_GID\nstat.ST_INO\nstat.ST_MODE\nstat.ST_MTIME\nstat.ST_NLINK\nstat.ST_SIZE\nstat.ST_UID\nstat.S_ENFMT\nstat.S_IEXEC\nstat.S_IFBLK\nstat.S_IFCHR\nstat.S_IFDIR\nstat.S_IFIFO\nstat.S_IFLNK\nstat.S_IFMT(??)\nstat.S_IFREG\nstat.S_IFSOCK\nstat.S_IMODE(??)\nstat.S_IREAD\nstat.S_IRGRP\nstat.S_IROTH\nstat.S_IRUSR\nstat.S_IRWXG\nstat.S_IRWXO\nstat.S_IRWXU\nstat.S_ISBLK(??)\nstat.S_ISCHR(??)\nstat.S_ISDIR(??)\nstat.S_ISFIFO(??)\nstat.S_ISGID\nstat.S_ISLNK(??)\nstat.S_ISREG(??)\nstat.S_ISSOCK(??)\nstat.S_ISUID\nstat.S_ISVTX\nstat.S_IWGRP\nstat.S_IWOTH\nstat.S_IWRITE\nstat.S_IWUSR\nstat.S_IXGRP\nstat.S_IXOTH\nstat.S_IXUSR\nstat.UF_APPEND\nstat.UF_COMPRESSED\nstat.UF_HIDDEN\nstat.UF_IMMUTABLE\nstat.UF_NODUMP\nstat.UF_NOUNLINK\nstat.UF_OPAQUE\nstat.filemode(??)\nstaticmethod(function) -> method\nstr(object[, encoding[, errors]]) -> str\nstring.ChainMap(??)\nstring.Formatter(??)\nstring.Template(??)\nstring.ascii_letters\nstring.ascii_lowercase\nstring.ascii_uppercase\nstring.capwords(s [,sep]) -> string\nstring.digits\nstring.hexdigits\nstring.octdigits\nstring.printable\nstring.punctuation\nstring.whitespace\nstringprep.b1_set(??)\nstringprep.b3_exceptions(??)\nstringprep.c22_specials(??)\nstringprep.c6_set(??)\nstringprep.c7_set(??)\nstringprep.c8_set(??)\nstringprep.c9_set(??)\nstringprep.in_table_a1(??)\nstringprep.in_table_b1(??)\nstringprep.in_table_c11(??)\nstringprep.in_table_c11_c12(??)\nstringprep.in_table_c12(??)\nstringprep.in_table_c21(??)\nstringprep.in_table_c21_c22(??)\nstringprep.in_table_c22(??)\nstringprep.in_table_c3(??)\nstringprep.in_table_c4(??)\nstringprep.in_table_c5(??)\nstringprep.in_table_c6(??)\nstringprep.in_table_c7(??)\nstringprep.in_table_c8(??)\nstringprep.in_table_c9(??)\nstringprep.in_table_d1(??)\nstringprep.in_table_d2(??)\nstringprep.map_table_b2(??)\nstringprep.map_table_b3(??)\nstringprep.unicodedata(??)\nstruct.Struct(fmt) --> compiled struct object\nstruct.calcsize(fmt) -> integer\nstruct.error(??)\nstruct.pack(fmt, v1, v2, ...) -> bytes\nstruct.pack_into(fmt, buffer, offset, v1, v2, ...)\nstruct.unpack(fmt, buffer) -> (v1, v2, ...)\nstruct.unpack_from(fmt, buffer, offset=0) -> (v1, v2, ...)\nsubprocess.CalledProcessError(??)\nsubprocess.DEVNULL\nsubprocess.MAXFD\nsubprocess.PIPE\nsubprocess.Popen(??)\nsubprocess.STDOUT\nsubprocess.SubprocessError(??)\nsubprocess.TimeoutExpired(??)\nsubprocess.builtins(??)\nsubprocess.call(??)\nsubprocess.check_call(??)\nsubprocess.check_output(??)\nsubprocess.errno(??)\nsubprocess.gc(??)\nsubprocess.getoutput(??)\nsubprocess.getstatusoutput(??)\nsubprocess.io(??)\nsubprocess.list2cmdline(??)\nsubprocess.mswindows(??)\nsubprocess.os(??)\nsubprocess.select(??)\nsubprocess.signal(??)\nsubprocess.sys(??)\nsubprocess.time(??)\nsubprocess.traceback(??)\nsubprocess.warnings(??)\nsum(iterable[, start]) -> value\nsunau.AUDIO_FILE_ENCODING_ADPCM_G721\nsunau.AUDIO_FILE_ENCODING_ADPCM_G722\nsunau.AUDIO_FILE_ENCODING_ADPCM_G723_3\nsunau.AUDIO_FILE_ENCODING_ADPCM_G723_5\nsunau.AUDIO_FILE_ENCODING_ALAW_8\nsunau.AUDIO_FILE_ENCODING_DOUBLE\nsunau.AUDIO_FILE_ENCODING_FLOAT\nsunau.AUDIO_FILE_ENCODING_LINEAR_16\nsunau.AUDIO_FILE_ENCODING_LINEAR_24\nsunau.AUDIO_FILE_ENCODING_LINEAR_32\nsunau.AUDIO_FILE_ENCODING_LINEAR_8\nsunau.AUDIO_FILE_ENCODING_MULAW_8\nsunau.AUDIO_FILE_MAGIC\nsunau.AUDIO_UNKNOWN_SIZE\nsunau.Au_read(??)\nsunau.Au_write(??)\nsunau.Error(??)\nsunau.open(??)\nsunau.openfp(??)\nsuper() -> same as super(__class__, <first argument>)\nsymbol.and_expr\nsymbol.and_test\nsymbol.arglist\nsymbol.argument\nsymbol.arith_expr\nsymbol.assert_stmt\nsymbol.atom\nsymbol.augassign\nsymbol.break_stmt\nsymbol.classdef\nsymbol.comp_for\nsymbol.comp_if\nsymbol.comp_iter\nsymbol.comp_op\nsymbol.comparison\nsymbol.compound_stmt\nsymbol.continue_stmt\nsymbol.decorated\nsymbol.decorator\nsymbol.decorators\nsymbol.del_stmt\nsymbol.dictorsetmaker\nsymbol.dotted_as_name\nsymbol.dotted_as_names\nsymbol.dotted_name\nsymbol.encoding_decl\nsymbol.eval_input\nsymbol.except_clause\nsymbol.expr\nsymbol.expr_stmt\nsymbol.exprlist\nsymbol.factor\nsymbol.file_input\nsymbol.flow_stmt\nsymbol.for_stmt\nsymbol.funcdef\nsymbol.global_stmt\nsymbol.if_stmt\nsymbol.import_as_name\nsymbol.import_as_names\nsymbol.import_from\nsymbol.import_name\nsymbol.import_stmt\nsymbol.lambdef\nsymbol.lambdef_nocond\nsymbol.main(??)\nsymbol.nonlocal_stmt\nsymbol.not_test\nsymbol.or_test\nsymbol.parameters\nsymbol.pass_stmt\nsymbol.power\nsymbol.raise_stmt\nsymbol.return_stmt\nsymbol.shift_expr\nsymbol.simple_stmt\nsymbol.single_input\nsymbol.sliceop\nsymbol.small_stmt\nsymbol.star_expr\nsymbol.stmt\nsymbol.subscript\nsymbol.subscriptlist\nsymbol.suite\nsymbol.sym_name(??)\nsymbol.term\nsymbol.test\nsymbol.test_nocond\nsymbol.testlist\nsymbol.testlist_comp\nsymbol.testlist_star_expr\nsymbol.tfpdef\nsymbol.trailer\nsymbol.try_stmt\nsymbol.typedargslist\nsymbol.varargslist\nsymbol.vfpdef\nsymbol.while_stmt\nsymbol.with_item\nsymbol.with_stmt\nsymbol.xor_expr\nsymbol.yield_expr\nsymbol.yield_stmt\nsymtable.CELL\nsymtable.Class(??)\nsymtable.DEF_BOUND\nsymtable.DEF_GLOBAL\nsymtable.DEF_IMPORT\nsymtable.DEF_LOCAL\nsymtable.DEF_PARAM\nsymtable.FREE\nsymtable.Function(??)\nsymtable.GLOBAL_EXPLICIT\nsymtable.GLOBAL_IMPLICIT\nsymtable.LOCAL\nsymtable.OPT_IMPORT_STAR\nsymtable.SCOPE_MASK\nsymtable.SCOPE_OFF\nsymtable.Symbol(??)\nsymtable.SymbolTable(??)\nsymtable.SymbolTableFactory(??)\nsymtable.USE\nsymtable.symtable(??)\nsymtable.weakref(??)\nsys.abiflags\nsys.api_version\nsys.argv(??)\nsys.base_exec_prefix\nsys.base_prefix\nsys.builtin_module_names(??)\nsys.byteorder\nsys.call_tracing(func, args) -> object\nsys.callstats() -> tuple of integers\nsys.copyright\nsys.displayhook(object) -> None\nsys.dont_write_bytecode(??)\nsys.exc_info() -> (type, value, traceback)\nsys.excepthook(exctype, value, traceback) -> None\nsys.exec_prefix\nsys.executable\nsys.exit([status])\nsys.flags(??)\nsys.float_info(??)\nsys.float_repr_style\nsys.getcheckinterval() -> current check interval; see setcheckinterval().\nsys.getdefaultencoding() -> string\nsys.getdlopenflags() -> int\nsys.getfilesystemencoding() -> string\nsys.getprofile()\nsys.getrecursionlimit()\nsys.getrefcount(object) -> integer\nsys.getsizeof(object, default) -> int\nsys.getswitchinterval() -> current thread switch interval; see setswitchinterval().\nsys.gettrace()\nsys.hash_info(??)\nsys.hexversion\nsys.implementation(??)\nsys.int_info(??)\nsys.intern(string) -> string\nsys.maxsize\nsys.maxunicode\nsys.meta_path(??)\nsys.modules(??)\nsys.path(??)\nsys.path_hooks(??)\nsys.path_importer_cache(??)\nsys.platform\nsys.prefix\nsys.setcheckinterval(n)\nsys.setdlopenflags(n) -> None\nsys.setprofile(function)\nsys.setrecursionlimit(n)\nsys.setswitchinterval(n)\nsys.settrace(function)\nsys.stderr(??)\nsys.stdin(??)\nsys.stdout(??)\nsys.thread_info(??)\nsys.version\nsys.version_info(??)\nsys.warnoptions(??)\nsysconfig.get_config_h_filename(??)\nsysconfig.get_config_var(??)\nsysconfig.get_config_vars(??)\nsysconfig.get_makefile_filename(??)\nsysconfig.get_path(??)\nsysconfig.get_path_names(??)\nsysconfig.get_paths(??)\nsysconfig.get_platform(??)\nsysconfig.get_python_version(??)\nsysconfig.get_scheme_names(??)\nsysconfig.is_python_build(??)\nsysconfig.os(??)\nsysconfig.pardir\nsysconfig.parse_config_h(??)\nsysconfig.re(??)\nsysconfig.realpath(??)\nsysconfig.sys(??)\nsyslog.LOG_ALERT\nsyslog.LOG_AUTH\nsyslog.LOG_AUTHPRIV\nsyslog.LOG_CONS\nsyslog.LOG_CRIT\nsyslog.LOG_CRON\nsyslog.LOG_DAEMON\nsyslog.LOG_DEBUG\nsyslog.LOG_EMERG\nsyslog.LOG_ERR\nsyslog.LOG_INFO\nsyslog.LOG_KERN\nsyslog.LOG_LOCAL0\nsyslog.LOG_LOCAL1\nsyslog.LOG_LOCAL2\nsyslog.LOG_LOCAL3\nsyslog.LOG_LOCAL4\nsyslog.LOG_LOCAL5\nsyslog.LOG_LOCAL6\nsyslog.LOG_LOCAL7\nsyslog.LOG_LPR\nsyslog.LOG_MAIL\nsyslog.LOG_MASK(??)\nsyslog.LOG_NDELAY\nsyslog.LOG_NEWS\nsyslog.LOG_NOTICE\nsyslog.LOG_NOWAIT\nsyslog.LOG_ODELAY\nsyslog.LOG_PERROR\nsyslog.LOG_PID\nsyslog.LOG_SYSLOG\nsyslog.LOG_UPTO(??)\nsyslog.LOG_USER\nsyslog.LOG_UUCP\nsyslog.LOG_WARNING\nsyslog.closelog(??)\nsyslog.openlog(??)\nsyslog.setlogmask(??)\nsyslog.syslog(??)\ntabnanny.NannyNag(??)\ntabnanny.Whitespace(??)\ntabnanny.check(file_or_dir)\ntabnanny.errprint(??)\ntabnanny.filename_only\ntabnanny.format_witnesses(??)\ntabnanny.getopt(??)\ntabnanny.main(??)\ntabnanny.os(??)\ntabnanny.process_tokens(??)\ntabnanny.sys(??)\ntabnanny.tokenize(??)\ntabnanny.verbose\ntarfile.AREGTYPE\ntarfile.BLKTYPE\ntarfile.BLOCKSIZE\ntarfile.CHRTYPE\ntarfile.CONTTYPE\ntarfile.CompressionError(??)\ntarfile.DEFAULT_FORMAT\ntarfile.DIRTYPE\ntarfile.ENCODING\ntarfile.EOFHeaderError(??)\ntarfile.EmptyHeaderError(??)\ntarfile.ExFileObject(??)\ntarfile.ExtractError(??)\ntarfile.FIFOTYPE\ntarfile.GNUTYPE_LONGLINK\ntarfile.GNUTYPE_LONGNAME\ntarfile.GNUTYPE_SPARSE\ntarfile.GNU_FORMAT\ntarfile.GNU_MAGIC\ntarfile.GNU_TYPES(??)\ntarfile.HeaderError(??)\ntarfile.InvalidHeaderError(??)\ntarfile.LENGTH_LINK\ntarfile.LENGTH_NAME\ntarfile.LENGTH_PREFIX\ntarfile.LNKTYPE\ntarfile.NUL\ntarfile.PAX_FIELDS(??)\ntarfile.PAX_FORMAT\ntarfile.PAX_NAME_FIELDS(??)\ntarfile.PAX_NUMBER_FIELDS(??)\ntarfile.POSIX_MAGIC\ntarfile.RECORDSIZE\ntarfile.REGTYPE\ntarfile.REGULAR_TYPES(??)\ntarfile.ReadError(??)\ntarfile.SOLARIS_XHDTYPE\ntarfile.SUPPORTED_TYPES(??)\ntarfile.SYMTYPE\ntarfile.S_IFBLK\ntarfile.S_IFCHR\ntarfile.S_IFDIR\ntarfile.S_IFIFO\ntarfile.S_IFLNK\ntarfile.S_IFREG\ntarfile.StreamError(??)\ntarfile.SubsequentHeaderError(??)\ntarfile.TGEXEC\ntarfile.TGREAD\ntarfile.TGWRITE\ntarfile.TOEXEC\ntarfile.TOREAD\ntarfile.TOWRITE\ntarfile.TSGID\ntarfile.TSUID\ntarfile.TSVTX\ntarfile.TUEXEC\ntarfile.TUREAD\ntarfile.TUWRITE\ntarfile.TarError(??)\ntarfile.TarFile(??)\ntarfile.TarInfo(??)\ntarfile.TarIter(??)\ntarfile.TruncatedHeaderError(??)\ntarfile.USTAR_FORMAT\ntarfile.XGLTYPE\ntarfile.XHDTYPE\ntarfile.bltn_open(??)\ntarfile.calc_chksums(??)\ntarfile.copy(??)\ntarfile.copyfileobj(??)\ntarfile.filemode(??)\ntarfile.grp(??)\ntarfile.io(??)\ntarfile.is_tarfile(??)\ntarfile.itn(??)\ntarfile.nti(??)\ntarfile.nts(??)\ntarfile.open(??)\ntarfile.os(??)\ntarfile.pwd(??)\ntarfile.re(??)\ntarfile.shutil(??)\ntarfile.stat(??)\ntarfile.stn(??)\ntarfile.struct(??)\ntarfile.symlink_exception(??)\ntarfile.sys(??)\ntarfile.time(??)\ntarfile.version\ntelnetlib.AO\ntelnetlib.AUTHENTICATION\ntelnetlib.AYT\ntelnetlib.BINARY\ntelnetlib.BM\ntelnetlib.BRK\ntelnetlib.CHARSET\ntelnetlib.COM_PORT_OPTION\ntelnetlib.DEBUGLEVEL\ntelnetlib.DET\ntelnetlib.DM\ntelnetlib.DO\ntelnetlib.DONT\ntelnetlib.EC\ntelnetlib.ECHO\ntelnetlib.EL\ntelnetlib.ENCRYPT\ntelnetlib.EOR\ntelnetlib.EXOPL\ntelnetlib.FORWARD_X\ntelnetlib.GA\ntelnetlib.IAC\ntelnetlib.IP\ntelnetlib.KERMIT\ntelnetlib.LFLOW\ntelnetlib.LINEMODE\ntelnetlib.LOGOUT\ntelnetlib.NAMS\ntelnetlib.NAOCRD\ntelnetlib.NAOFFD\ntelnetlib.NAOHTD\ntelnetlib.NAOHTS\ntelnetlib.NAOL\ntelnetlib.NAOLFD\ntelnetlib.NAOP\ntelnetlib.NAOVTD\ntelnetlib.NAOVTS\ntelnetlib.NAWS\ntelnetlib.NEW_ENVIRON\ntelnetlib.NOOPT\ntelnetlib.NOP\ntelnetlib.OLD_ENVIRON\ntelnetlib.OUTMRK\ntelnetlib.PRAGMA_HEARTBEAT\ntelnetlib.PRAGMA_LOGON\ntelnetlib.RCP\ntelnetlib.RCTE\ntelnetlib.RSP\ntelnetlib.SB\ntelnetlib.SE\ntelnetlib.SEND_URL\ntelnetlib.SGA\ntelnetlib.SNDLOC\ntelnetlib.SSPI_LOGON\ntelnetlib.STATUS\ntelnetlib.SUPDUP\ntelnetlib.SUPDUPOUTPUT\ntelnetlib.SUPPRESS_LOCAL_ECHO\ntelnetlib.TELNET_PORT\ntelnetlib.TLS\ntelnetlib.TM\ntelnetlib.TN3270E\ntelnetlib.TSPEED\ntelnetlib.TTYLOC\ntelnetlib.TTYPE\ntelnetlib.TUID\ntelnetlib.Telnet(??)\ntelnetlib.VT3270REGIME\ntelnetlib.WILL\ntelnetlib.WONT\ntelnetlib.X3PAD\ntelnetlib.XASCII\ntelnetlib.XAUTH\ntelnetlib.XDISPLOC\ntelnetlib.errno(??)\ntelnetlib.select(??)\ntelnetlib.socket(??)\ntelnetlib.sys(??)\ntelnetlib.test(??)\ntelnetlib.theNULL\ntempfile.NamedTemporaryFile(??)\ntempfile.SpooledTemporaryFile(??)\ntempfile.TMP_MAX\ntempfile.TemporaryDirectory(??)\ntempfile.TemporaryFile(??)\ntempfile.gettempdir(??)\ntempfile.gettempprefix(??)\ntempfile.mkdtemp(??)\ntempfile.mkstemp(??)\ntempfile.mktemp(??)\ntempfile.tempdir(??)\ntempfile.template\ntermios.B0\ntermios.B110\ntermios.B115200\ntermios.B1200\ntermios.B134\ntermios.B150\ntermios.B1800\ntermios.B19200\ntermios.B200\ntermios.B230400\ntermios.B2400\ntermios.B300\ntermios.B38400\ntermios.B4800\ntermios.B50\ntermios.B57600\ntermios.B600\ntermios.B75\ntermios.B9600\ntermios.BRKINT\ntermios.BS0\ntermios.BS1\ntermios.BSDLY\ntermios.CDSUSP\ntermios.CEOF\ntermios.CEOL\ntermios.CEOT\ntermios.CERASE\ntermios.CFLUSH\ntermios.CINTR\ntermios.CKILL\ntermios.CLNEXT\ntermios.CLOCAL\ntermios.CQUIT\ntermios.CR0\ntermios.CR1\ntermios.CR2\ntermios.CR3\ntermios.CRDLY\ntermios.CREAD\ntermios.CRPRNT\ntermios.CRTSCTS\ntermios.CS5\ntermios.CS6\ntermios.CS7\ntermios.CS8\ntermios.CSIZE\ntermios.CSTART\ntermios.CSTOP\ntermios.CSTOPB\ntermios.CSUSP\ntermios.CWERASE\ntermios.ECHO\ntermios.ECHOCTL\ntermios.ECHOE\ntermios.ECHOK\ntermios.ECHOKE\ntermios.ECHONL\ntermios.ECHOPRT\ntermios.EXTA\ntermios.EXTB\ntermios.FF0\ntermios.FF1\ntermios.FFDLY\ntermios.FIOASYNC\ntermios.FIOCLEX\ntermios.FIONBIO\ntermios.FIONCLEX\ntermios.FIONREAD\ntermios.FLUSHO\ntermios.HUPCL\ntermios.ICANON\ntermios.ICRNL\ntermios.IEXTEN\ntermios.IGNBRK\ntermios.IGNCR\ntermios.IGNPAR\ntermios.IMAXBEL\ntermios.INLCR\ntermios.INPCK\ntermios.ISIG\ntermios.ISTRIP\ntermios.IXANY\ntermios.IXOFF\ntermios.IXON\ntermios.NCCS\ntermios.NL0\ntermios.NL1\ntermios.NLDLY\ntermios.NOFLSH\ntermios.OCRNL\ntermios.OFDEL\ntermios.OFILL\ntermios.ONLCR\ntermios.ONLRET\ntermios.ONOCR\ntermios.OPOST\ntermios.PARENB\ntermios.PARMRK\ntermios.PARODD\ntermios.PENDIN\ntermios.TAB0\ntermios.TAB1\ntermios.TAB2\ntermios.TAB3\ntermios.TABDLY\ntermios.TCIFLUSH\ntermios.TCIOFF\ntermios.TCIOFLUSH\ntermios.TCION\ntermios.TCOFLUSH\ntermios.TCOOFF\ntermios.TCOON\ntermios.TCSADRAIN\ntermios.TCSAFLUSH\ntermios.TCSANOW\ntermios.TCSASOFT\ntermios.TIOCCONS\ntermios.TIOCEXCL\ntermios.TIOCGETD\ntermios.TIOCGPGRP\ntermios.TIOCGWINSZ\ntermios.TIOCMBIC\ntermios.TIOCMBIS\ntermios.TIOCMGET\ntermios.TIOCMSET\ntermios.TIOCM_CAR\ntermios.TIOCM_CD\ntermios.TIOCM_CTS\ntermios.TIOCM_DSR\ntermios.TIOCM_DTR\ntermios.TIOCM_LE\ntermios.TIOCM_RI\ntermios.TIOCM_RNG\ntermios.TIOCM_RTS\ntermios.TIOCM_SR\ntermios.TIOCM_ST\ntermios.TIOCNOTTY\ntermios.TIOCNXCL\ntermios.TIOCOUTQ\ntermios.TIOCPKT\ntermios.TIOCPKT_DATA\ntermios.TIOCPKT_DOSTOP\ntermios.TIOCPKT_FLUSHREAD\ntermios.TIOCPKT_FLUSHWRITE\ntermios.TIOCPKT_NOSTOP\ntermios.TIOCPKT_START\ntermios.TIOCPKT_STOP\ntermios.TIOCSCTTY\ntermios.TIOCSETD\ntermios.TIOCSPGRP\ntermios.TIOCSTI\ntermios.TIOCSWINSZ\ntermios.TOSTOP\ntermios.VDISCARD\ntermios.VEOF\ntermios.VEOL\ntermios.VEOL2\ntermios.VERASE\ntermios.VINTR\ntermios.VKILL\ntermios.VLNEXT\ntermios.VMIN\ntermios.VQUIT\ntermios.VREPRINT\ntermios.VSTART\ntermios.VSTOP\ntermios.VSUSP\ntermios.VT0\ntermios.VT1\ntermios.VTDLY\ntermios.VTIME\ntermios.VWERASE\ntermios.error(??)\ntermios.tcdrain(fd) -> None\ntermios.tcflow(fd, action) -> None\ntermios.tcflush(fd, queue) -> None\ntermios.tcgetattr(fd) -> list_of_attrs\ntermios.tcsendbreak(fd, duration) -> None\ntermios.tcsetattr(fd, when, attributes) -> None\ntextwrap.TextWrapper(??)\ntextwrap.dedent(??)\ntextwrap.fill(??)\ntextwrap.indent(??)\ntextwrap.re(??)\ntextwrap.wrap(??)\nthreading.Barrier(??)\nthreading.BoundedSemaphore(??)\nthreading.BrokenBarrierError(??)\nthreading.Condition(??)\nthreading.Event(??)\nthreading.Lock(??)\nthreading.RLock(??)\nthreading.Semaphore(??)\nthreading.TIMEOUT_MAX\nthreading.Thread(??)\nthreading.ThreadError(??)\nthreading.Timer(??)\nthreading.WeakSet(??)\nthreading.activeCount(??)\nthreading.active_count(??)\nthreading.currentThread(??)\nthreading.current_thread(??)\nthreading.enumerate(??)\nthreading.get_ident() -> integer\nthreading.local(??)\nthreading.setprofile(??)\nthreading.settrace(??)\nthreading.stack_size([size]) -> size\ntime.altzone\ntime.asctime([tuple]) -> string\ntime.clock() -> floating point number\ntime.ctime(seconds) -> string\ntime.daylight\ntime.get_clock_info(name: str) -> dict\ntime.gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\ntime.localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\ntime.mktime(tuple) -> floating point number\ntime.monotonic() -> float\ntime.perf_counter() -> float\ntime.process_time() -> float\ntime.sleep(seconds)\ntime.strftime(format[, tuple]) -> string\ntime.strptime(string, format) -> struct_time\ntime.struct_time(??)\ntime.time() -> floating point number\ntime.timezone\ntime.tzname(??)\ntime.tzset()\ntimeit.Timer(??)\ntimeit.default_number\ntimeit.default_repeat\ntimeit.default_timer(??)\ntimeit.dummy_src_name\ntimeit.gc(??)\ntimeit.itertools(??)\ntimeit.main(??)\ntimeit.reindent(??)\ntimeit.repeat(??)\ntimeit.sys(??)\ntimeit.template\ntimeit.time(??)\ntimeit.timeit(??)\ntkinter.ACTIVE\ntkinter.ALL\ntkinter.ANCHOR\ntkinter.ARC\ntkinter.At(??)\ntkinter.AtEnd(??)\ntkinter.AtInsert(??)\ntkinter.AtSelFirst(??)\ntkinter.AtSelLast(??)\ntkinter.BASELINE\ntkinter.BEVEL\ntkinter.BOTH\ntkinter.BOTTOM\ntkinter.BROWSE\ntkinter.BUTT\ntkinter.BaseWidget(??)\ntkinter.BitmapImage(??)\ntkinter.BooleanVar(??)\ntkinter.Button(??)\ntkinter.CASCADE\ntkinter.CENTER\ntkinter.CHAR\ntkinter.CHECKBUTTON\ntkinter.CHORD\ntkinter.COMMAND\ntkinter.CURRENT\ntkinter.CallWrapper(??)\ntkinter.Canvas(??)\ntkinter.Checkbutton(??)\ntkinter.DISABLED\ntkinter.DOTBOX\ntkinter.DoubleVar(??)\ntkinter.E\ntkinter.END\ntkinter.EW\ntkinter.EXCEPTION\ntkinter.EXTENDED\ntkinter.Entry(??)\ntkinter.Event(??)\ntkinter.FALSE\ntkinter.FIRST\ntkinter.FLAT\ntkinter.Frame(??)\ntkinter.GROOVE\ntkinter.Grid(??)\ntkinter.HIDDEN\ntkinter.HORIZONTAL\ntkinter.INSERT\ntkinter.INSIDE\ntkinter.Image(??)\ntkinter.IntVar(??)\ntkinter.LAST\ntkinter.LEFT\ntkinter.Label(??)\ntkinter.LabelFrame(??)\ntkinter.Listbox(??)\ntkinter.MITER\ntkinter.MOVETO\ntkinter.MULTIPLE\ntkinter.Menu(??)\ntkinter.Menubutton(??)\ntkinter.Message(??)\ntkinter.Misc(??)\ntkinter.N\ntkinter.NE\ntkinter.NO\ntkinter.NONE\ntkinter.NORMAL\ntkinter.NS\ntkinter.NSEW\ntkinter.NUMERIC\ntkinter.NW\ntkinter.NoDefaultRoot(??)\ntkinter.OFF\ntkinter.ON\ntkinter.OUTSIDE\ntkinter.OptionMenu(??)\ntkinter.PAGES\ntkinter.PIESLICE\ntkinter.PROJECTING\ntkinter.Pack(??)\ntkinter.PanedWindow(??)\ntkinter.PhotoImage(??)\ntkinter.Place(??)\ntkinter.RADIOBUTTON\ntkinter.RAISED\ntkinter.READABLE\ntkinter.RIDGE\ntkinter.RIGHT\ntkinter.ROUND\ntkinter.Radiobutton(??)\ntkinter.S\ntkinter.SCROLL\ntkinter.SE\ntkinter.SEL\ntkinter.SEL_FIRST\ntkinter.SEL_LAST\ntkinter.SEPARATOR\ntkinter.SINGLE\ntkinter.SOLID\ntkinter.SUNKEN\ntkinter.SW\ntkinter.Scale(??)\ntkinter.Scrollbar(??)\ntkinter.Spinbox(??)\ntkinter.StringVar(??)\ntkinter.Studbutton(??)\ntkinter.TOP\ntkinter.TRUE\ntkinter.Tcl(??)\ntkinter.TclError(??)\ntkinter.TclVersion\ntkinter.Text(??)\ntkinter.Tk(??)\ntkinter.TkVersion\ntkinter.Toplevel(??)\ntkinter.Tributton(??)\ntkinter.UNDERLINE\ntkinter.UNITS\ntkinter.VERTICAL\ntkinter.Variable(??)\ntkinter.W\ntkinter.WORD\ntkinter.WRITABLE\ntkinter.Widget(??)\ntkinter.Wm(??)\ntkinter.X\ntkinter.XView(??)\ntkinter.Y\ntkinter.YES\ntkinter.YView(??)\ntkinter.colorchooser.Chooser(??)\ntkinter.colorchooser.Dialog(??)\ntkinter.colorchooser.askcolor(??)\ntkinter.commondialog.ACTIVE\ntkinter.commondialog.ALL\ntkinter.commondialog.ANCHOR\ntkinter.commondialog.ARC\ntkinter.commondialog.At(??)\ntkinter.commondialog.AtEnd(??)\ntkinter.commondialog.AtInsert(??)\ntkinter.commondialog.AtSelFirst(??)\ntkinter.commondialog.AtSelLast(??)\ntkinter.commondialog.BASELINE\ntkinter.commondialog.BEVEL\ntkinter.commondialog.BOTH\ntkinter.commondialog.BOTTOM\ntkinter.commondialog.BROWSE\ntkinter.commondialog.BUTT\ntkinter.commondialog.BaseWidget(??)\ntkinter.commondialog.BitmapImage(??)\ntkinter.commondialog.BooleanVar(??)\ntkinter.commondialog.Button(??)\ntkinter.commondialog.CASCADE\ntkinter.commondialog.CENTER\ntkinter.commondialog.CHAR\ntkinter.commondialog.CHECKBUTTON\ntkinter.commondialog.CHORD\ntkinter.commondialog.COMMAND\ntkinter.commondialog.CURRENT\ntkinter.commondialog.CallWrapper(??)\ntkinter.commondialog.Canvas(??)\ntkinter.commondialog.Checkbutton(??)\ntkinter.commondialog.DISABLED\ntkinter.commondialog.DOTBOX\ntkinter.commondialog.Dialog(??)\ntkinter.commondialog.DoubleVar(??)\ntkinter.commondialog.E\ntkinter.commondialog.END\ntkinter.commondialog.EW\ntkinter.commondialog.EXCEPTION\ntkinter.commondialog.EXTENDED\ntkinter.commondialog.Entry(??)\ntkinter.commondialog.Event(??)\ntkinter.commondialog.FALSE\ntkinter.commondialog.FIRST\ntkinter.commondialog.FLAT\ntkinter.commondialog.Frame(??)\ntkinter.commondialog.GROOVE\ntkinter.commondialog.Grid(??)\ntkinter.commondialog.HIDDEN\ntkinter.commondialog.HORIZONTAL\ntkinter.commondialog.INSERT\ntkinter.commondialog.INSIDE\ntkinter.commondialog.Image(??)\ntkinter.commondialog.IntVar(??)\ntkinter.commondialog.LAST\ntkinter.commondialog.LEFT\ntkinter.commondialog.Label(??)\ntkinter.commondialog.LabelFrame(??)\ntkinter.commondialog.Listbox(??)\ntkinter.commondialog.MITER\ntkinter.commondialog.MOVETO\ntkinter.commondialog.MULTIPLE\ntkinter.commondialog.Menu(??)\ntkinter.commondialog.Menubutton(??)\ntkinter.commondialog.Message(??)\ntkinter.commondialog.Misc(??)\ntkinter.commondialog.N\ntkinter.commondialog.NE\ntkinter.commondialog.NO\ntkinter.commondialog.NONE\ntkinter.commondialog.NORMAL\ntkinter.commondialog.NS\ntkinter.commondialog.NSEW\ntkinter.commondialog.NUMERIC\ntkinter.commondialog.NW\ntkinter.commondialog.NoDefaultRoot(??)\ntkinter.commondialog.OFF\ntkinter.commondialog.ON\ntkinter.commondialog.OUTSIDE\ntkinter.commondialog.OptionMenu(??)\ntkinter.commondialog.PAGES\ntkinter.commondialog.PIESLICE\ntkinter.commondialog.PROJECTING\ntkinter.commondialog.Pack(??)\ntkinter.commondialog.PanedWindow(??)\ntkinter.commondialog.PhotoImage(??)\ntkinter.commondialog.Place(??)\ntkinter.commondialog.RADIOBUTTON\ntkinter.commondialog.RAISED\ntkinter.commondialog.READABLE\ntkinter.commondialog.RIDGE\ntkinter.commondialog.RIGHT\ntkinter.commondialog.ROUND\ntkinter.commondialog.Radiobutton(??)\ntkinter.commondialog.S\ntkinter.commondialog.SCROLL\ntkinter.commondialog.SE\ntkinter.commondialog.SEL\ntkinter.commondialog.SEL_FIRST\ntkinter.commondialog.SEL_LAST\ntkinter.commondialog.SEPARATOR\ntkinter.commondialog.SINGLE\ntkinter.commondialog.SOLID\ntkinter.commondialog.SUNKEN\ntkinter.commondialog.SW\ntkinter.commondialog.Scale(??)\ntkinter.commondialog.Scrollbar(??)\ntkinter.commondialog.Spinbox(??)\ntkinter.commondialog.StringVar(??)\ntkinter.commondialog.Studbutton(??)\ntkinter.commondialog.TOP\ntkinter.commondialog.TRUE\ntkinter.commondialog.Tcl(??)\ntkinter.commondialog.TclError(??)\ntkinter.commondialog.TclVersion\ntkinter.commondialog.Text(??)\ntkinter.commondialog.Tk(??)\ntkinter.commondialog.TkVersion\ntkinter.commondialog.Toplevel(??)\ntkinter.commondialog.Tributton(??)\ntkinter.commondialog.UNDERLINE\ntkinter.commondialog.UNITS\ntkinter.commondialog.VERTICAL\ntkinter.commondialog.Variable(??)\ntkinter.commondialog.W\ntkinter.commondialog.WORD\ntkinter.commondialog.WRITABLE\ntkinter.commondialog.Widget(??)\ntkinter.commondialog.Wm(??)\ntkinter.commondialog.X\ntkinter.commondialog.XView(??)\ntkinter.commondialog.Y\ntkinter.commondialog.YES\ntkinter.commondialog.YView(??)\ntkinter.commondialog.constants(??)\ntkinter.commondialog.getboolean(??)\ntkinter.commondialog.getdouble(??)\ntkinter.commondialog.getint(??)\ntkinter.commondialog.image_names(??)\ntkinter.commondialog.image_types(??)\ntkinter.commondialog.mainloop(??)\ntkinter.commondialog.sys(??)\ntkinter.commondialog.wantobjects\ntkinter.commondialog.warnings(??)\ntkinter.constants(??)\ntkinter.constants.ACTIVE\ntkinter.constants.ALL\ntkinter.constants.ANCHOR\ntkinter.constants.ARC\ntkinter.constants.BASELINE\ntkinter.constants.BEVEL\ntkinter.constants.BOTH\ntkinter.constants.BOTTOM\ntkinter.constants.BROWSE\ntkinter.constants.BUTT\ntkinter.constants.CASCADE\ntkinter.constants.CENTER\ntkinter.constants.CHAR\ntkinter.constants.CHECKBUTTON\ntkinter.constants.CHORD\ntkinter.constants.COMMAND\ntkinter.constants.CURRENT\ntkinter.constants.DISABLED\ntkinter.constants.DOTBOX\ntkinter.constants.E\ntkinter.constants.END\ntkinter.constants.EW\ntkinter.constants.EXTENDED\ntkinter.constants.FALSE\ntkinter.constants.FIRST\ntkinter.constants.FLAT\ntkinter.constants.GROOVE\ntkinter.constants.HIDDEN\ntkinter.constants.HORIZONTAL\ntkinter.constants.INSERT\ntkinter.constants.INSIDE\ntkinter.constants.LAST\ntkinter.constants.LEFT\ntkinter.constants.MITER\ntkinter.constants.MOVETO\ntkinter.constants.MULTIPLE\ntkinter.constants.N\ntkinter.constants.NE\ntkinter.constants.NO\ntkinter.constants.NONE\ntkinter.constants.NORMAL\ntkinter.constants.NS\ntkinter.constants.NSEW\ntkinter.constants.NUMERIC\ntkinter.constants.NW\ntkinter.constants.OFF\ntkinter.constants.ON\ntkinter.constants.OUTSIDE\ntkinter.constants.PAGES\ntkinter.constants.PIESLICE\ntkinter.constants.PROJECTING\ntkinter.constants.RADIOBUTTON\ntkinter.constants.RAISED\ntkinter.constants.RIDGE\ntkinter.constants.RIGHT\ntkinter.constants.ROUND\ntkinter.constants.S\ntkinter.constants.SCROLL\ntkinter.constants.SE\ntkinter.constants.SEL\ntkinter.constants.SEL_FIRST\ntkinter.constants.SEL_LAST\ntkinter.constants.SEPARATOR\ntkinter.constants.SINGLE\ntkinter.constants.SOLID\ntkinter.constants.SUNKEN\ntkinter.constants.SW\ntkinter.constants.TOP\ntkinter.constants.TRUE\ntkinter.constants.UNDERLINE\ntkinter.constants.UNITS\ntkinter.constants.VERTICAL\ntkinter.constants.W\ntkinter.constants.WORD\ntkinter.constants.X\ntkinter.constants.Y\ntkinter.constants.YES\ntkinter.dialog.ACTIVE\ntkinter.dialog.ALL\ntkinter.dialog.ANCHOR\ntkinter.dialog.ARC\ntkinter.dialog.At(??)\ntkinter.dialog.AtEnd(??)\ntkinter.dialog.AtInsert(??)\ntkinter.dialog.AtSelFirst(??)\ntkinter.dialog.AtSelLast(??)\ntkinter.dialog.BASELINE\ntkinter.dialog.BEVEL\ntkinter.dialog.BOTH\ntkinter.dialog.BOTTOM\ntkinter.dialog.BROWSE\ntkinter.dialog.BUTT\ntkinter.dialog.BaseWidget(??)\ntkinter.dialog.BitmapImage(??)\ntkinter.dialog.BooleanVar(??)\ntkinter.dialog.Button(??)\ntkinter.dialog.CASCADE\ntkinter.dialog.CENTER\ntkinter.dialog.CHAR\ntkinter.dialog.CHECKBUTTON\ntkinter.dialog.CHORD\ntkinter.dialog.COMMAND\ntkinter.dialog.CURRENT\ntkinter.dialog.CallWrapper(??)\ntkinter.dialog.Canvas(??)\ntkinter.dialog.Checkbutton(??)\ntkinter.dialog.DIALOG_ICON\ntkinter.dialog.DISABLED\ntkinter.dialog.DOTBOX\ntkinter.dialog.Dialog(??)\ntkinter.dialog.DoubleVar(??)\ntkinter.dialog.E\ntkinter.dialog.END\ntkinter.dialog.EW\ntkinter.dialog.EXCEPTION\ntkinter.dialog.EXTENDED\ntkinter.dialog.Entry(??)\ntkinter.dialog.Event(??)\ntkinter.dialog.FALSE\ntkinter.dialog.FIRST\ntkinter.dialog.FLAT\ntkinter.dialog.Frame(??)\ntkinter.dialog.GROOVE\ntkinter.dialog.Grid(??)\ntkinter.dialog.HIDDEN\ntkinter.dialog.HORIZONTAL\ntkinter.dialog.INSERT\ntkinter.dialog.INSIDE\ntkinter.dialog.Image(??)\ntkinter.dialog.IntVar(??)\ntkinter.dialog.LAST\ntkinter.dialog.LEFT\ntkinter.dialog.Label(??)\ntkinter.dialog.LabelFrame(??)\ntkinter.dialog.Listbox(??)\ntkinter.dialog.MITER\ntkinter.dialog.MOVETO\ntkinter.dialog.MULTIPLE\ntkinter.dialog.Menu(??)\ntkinter.dialog.Menubutton(??)\ntkinter.dialog.Message(??)\ntkinter.dialog.Misc(??)\ntkinter.dialog.N\ntkinter.dialog.NE\ntkinter.dialog.NO\ntkinter.dialog.NONE\ntkinter.dialog.NORMAL\ntkinter.dialog.NS\ntkinter.dialog.NSEW\ntkinter.dialog.NUMERIC\ntkinter.dialog.NW\ntkinter.dialog.NoDefaultRoot(??)\ntkinter.dialog.OFF\ntkinter.dialog.ON\ntkinter.dialog.OUTSIDE\ntkinter.dialog.OptionMenu(??)\ntkinter.dialog.PAGES\ntkinter.dialog.PIESLICE\ntkinter.dialog.PROJECTING\ntkinter.dialog.Pack(??)\ntkinter.dialog.PanedWindow(??)\ntkinter.dialog.PhotoImage(??)\ntkinter.dialog.Place(??)\ntkinter.dialog.RADIOBUTTON\ntkinter.dialog.RAISED\ntkinter.dialog.READABLE\ntkinter.dialog.RIDGE\ntkinter.dialog.RIGHT\ntkinter.dialog.ROUND\ntkinter.dialog.Radiobutton(??)\ntkinter.dialog.S\ntkinter.dialog.SCROLL\ntkinter.dialog.SE\ntkinter.dialog.SEL\ntkinter.dialog.SEL_FIRST\ntkinter.dialog.SEL_LAST\ntkinter.dialog.SEPARATOR\ntkinter.dialog.SINGLE\ntkinter.dialog.SOLID\ntkinter.dialog.SUNKEN\ntkinter.dialog.SW\ntkinter.dialog.Scale(??)\ntkinter.dialog.Scrollbar(??)\ntkinter.dialog.Spinbox(??)\ntkinter.dialog.StringVar(??)\ntkinter.dialog.Studbutton(??)\ntkinter.dialog.TOP\ntkinter.dialog.TRUE\ntkinter.dialog.Tcl(??)\ntkinter.dialog.TclError(??)\ntkinter.dialog.TclVersion\ntkinter.dialog.Text(??)\ntkinter.dialog.Tk(??)\ntkinter.dialog.TkVersion\ntkinter.dialog.Toplevel(??)\ntkinter.dialog.Tributton(??)\ntkinter.dialog.UNDERLINE\ntkinter.dialog.UNITS\ntkinter.dialog.VERTICAL\ntkinter.dialog.Variable(??)\ntkinter.dialog.W\ntkinter.dialog.WORD\ntkinter.dialog.WRITABLE\ntkinter.dialog.Widget(??)\ntkinter.dialog.Wm(??)\ntkinter.dialog.X\ntkinter.dialog.XView(??)\ntkinter.dialog.Y\ntkinter.dialog.YES\ntkinter.dialog.YView(??)\ntkinter.dialog.colorchooser(??)\ntkinter.dialog.commondialog(??)\ntkinter.dialog.constants(??)\ntkinter.dialog.getboolean(??)\ntkinter.dialog.getdouble(??)\ntkinter.dialog.getint(??)\ntkinter.dialog.image_names(??)\ntkinter.dialog.image_types(??)\ntkinter.dialog.mainloop(??)\ntkinter.dialog.sys(??)\ntkinter.dialog.wantobjects\ntkinter.dialog.warnings(??)\ntkinter.dnd.DndHandler(??)\ntkinter.dnd.Icon(??)\ntkinter.dnd.Tester(??)\ntkinter.dnd.dnd_start(??)\ntkinter.dnd.test(??)\ntkinter.dnd.tkinter(??)\ntkinter.filedialog.ACTIVE\ntkinter.filedialog.ALL\ntkinter.filedialog.ANCHOR\ntkinter.filedialog.ARC\ntkinter.filedialog.At(??)\ntkinter.filedialog.AtEnd(??)\ntkinter.filedialog.AtInsert(??)\ntkinter.filedialog.AtSelFirst(??)\ntkinter.filedialog.AtSelLast(??)\ntkinter.filedialog.BASELINE\ntkinter.filedialog.BEVEL\ntkinter.filedialog.BOTH\ntkinter.filedialog.BOTTOM\ntkinter.filedialog.BROWSE\ntkinter.filedialog.BUTT\ntkinter.filedialog.BaseWidget(??)\ntkinter.filedialog.BitmapImage(??)\ntkinter.filedialog.BooleanVar(??)\ntkinter.filedialog.Button(??)\ntkinter.filedialog.CASCADE\ntkinter.filedialog.CENTER\ntkinter.filedialog.CHAR\ntkinter.filedialog.CHECKBUTTON\ntkinter.filedialog.CHORD\ntkinter.filedialog.COMMAND\ntkinter.filedialog.CURRENT\ntkinter.filedialog.CallWrapper(??)\ntkinter.filedialog.Canvas(??)\ntkinter.filedialog.Checkbutton(??)\ntkinter.filedialog.DISABLED\ntkinter.filedialog.DOTBOX\ntkinter.filedialog.Dialog(??)\ntkinter.filedialog.Directory(??)\ntkinter.filedialog.DoubleVar(??)\ntkinter.filedialog.E\ntkinter.filedialog.END\ntkinter.filedialog.EW\ntkinter.filedialog.EXCEPTION\ntkinter.filedialog.EXTENDED\ntkinter.filedialog.Entry(??)\ntkinter.filedialog.Event(??)\ntkinter.filedialog.FALSE\ntkinter.filedialog.FIRST\ntkinter.filedialog.FLAT\ntkinter.filedialog.FileDialog(??)\ntkinter.filedialog.Frame(??)\ntkinter.filedialog.GROOVE\ntkinter.filedialog.Grid(??)\ntkinter.filedialog.HIDDEN\ntkinter.filedialog.HORIZONTAL\ntkinter.filedialog.INSERT\ntkinter.filedialog.INSIDE\ntkinter.filedialog.Image(??)\ntkinter.filedialog.IntVar(??)\ntkinter.filedialog.LAST\ntkinter.filedialog.LEFT\ntkinter.filedialog.Label(??)\ntkinter.filedialog.LabelFrame(??)\ntkinter.filedialog.Listbox(??)\ntkinter.filedialog.LoadFileDialog(??)\ntkinter.filedialog.MITER\ntkinter.filedialog.MOVETO\ntkinter.filedialog.MULTIPLE\ntkinter.filedialog.Menu(??)\ntkinter.filedialog.Menubutton(??)\ntkinter.filedialog.Message(??)\ntkinter.filedialog.Misc(??)\ntkinter.filedialog.N\ntkinter.filedialog.NE\ntkinter.filedialog.NO\ntkinter.filedialog.NONE\ntkinter.filedialog.NORMAL\ntkinter.filedialog.NS\ntkinter.filedialog.NSEW\ntkinter.filedialog.NUMERIC\ntkinter.filedialog.NW\ntkinter.filedialog.NoDefaultRoot(??)\ntkinter.filedialog.OFF\ntkinter.filedialog.ON\ntkinter.filedialog.OUTSIDE\ntkinter.filedialog.Open(??)\ntkinter.filedialog.OptionMenu(??)\ntkinter.filedialog.PAGES\ntkinter.filedialog.PIESLICE\ntkinter.filedialog.PROJECTING\ntkinter.filedialog.Pack(??)\ntkinter.filedialog.PanedWindow(??)\ntkinter.filedialog.PhotoImage(??)\ntkinter.filedialog.Place(??)\ntkinter.filedialog.RADIOBUTTON\ntkinter.filedialog.RAISED\ntkinter.filedialog.READABLE\ntkinter.filedialog.RIDGE\ntkinter.filedialog.RIGHT\ntkinter.filedialog.ROUND\ntkinter.filedialog.Radiobutton(??)\ntkinter.filedialog.S\ntkinter.filedialog.SCROLL\ntkinter.filedialog.SE\ntkinter.filedialog.SEL\ntkinter.filedialog.SEL_FIRST\ntkinter.filedialog.SEL_LAST\ntkinter.filedialog.SEPARATOR\ntkinter.filedialog.SINGLE\ntkinter.filedialog.SOLID\ntkinter.filedialog.SUNKEN\ntkinter.filedialog.SW\ntkinter.filedialog.SaveAs(??)\ntkinter.filedialog.SaveFileDialog(??)\ntkinter.filedialog.Scale(??)\ntkinter.filedialog.Scrollbar(??)\ntkinter.filedialog.Spinbox(??)\ntkinter.filedialog.StringVar(??)\ntkinter.filedialog.Studbutton(??)\ntkinter.filedialog.TOP\ntkinter.filedialog.TRUE\ntkinter.filedialog.Tcl(??)\ntkinter.filedialog.TclError(??)\ntkinter.filedialog.TclVersion\ntkinter.filedialog.Text(??)\ntkinter.filedialog.Tk(??)\ntkinter.filedialog.TkVersion\ntkinter.filedialog.Toplevel(??)\ntkinter.filedialog.Tributton(??)\ntkinter.filedialog.UNDERLINE\ntkinter.filedialog.UNITS\ntkinter.filedialog.VERTICAL\ntkinter.filedialog.Variable(??)\ntkinter.filedialog.W\ntkinter.filedialog.WORD\ntkinter.filedialog.WRITABLE\ntkinter.filedialog.Widget(??)\ntkinter.filedialog.Wm(??)\ntkinter.filedialog.X\ntkinter.filedialog.XView(??)\ntkinter.filedialog.Y\ntkinter.filedialog.YES\ntkinter.filedialog.YView(??)\ntkinter.filedialog.askdirectory(??)\ntkinter.filedialog.askopenfile(??)\ntkinter.filedialog.askopenfilename(??)\ntkinter.filedialog.askopenfilenames(??)\ntkinter.filedialog.askopenfiles(??)\ntkinter.filedialog.asksaveasfile(??)\ntkinter.filedialog.asksaveasfilename(??)\ntkinter.filedialog.colorchooser(??)\ntkinter.filedialog.commondialog(??)\ntkinter.filedialog.constants(??)\ntkinter.filedialog.dialog(??)\ntkinter.filedialog.dialogstates(??)\ntkinter.filedialog.dnd(??)\ntkinter.filedialog.fnmatch(??)\ntkinter.filedialog.getboolean(??)\ntkinter.filedialog.getdouble(??)\ntkinter.filedialog.getint(??)\ntkinter.filedialog.image_names(??)\ntkinter.filedialog.image_types(??)\ntkinter.filedialog.mainloop(??)\ntkinter.filedialog.os(??)\ntkinter.filedialog.sys(??)\ntkinter.filedialog.test(??)\ntkinter.filedialog.wantobjects\ntkinter.filedialog.warnings(??)\ntkinter.font.BOLD\ntkinter.font.Font(??)\ntkinter.font.ITALIC\ntkinter.font.NORMAL\ntkinter.font.ROMAN\ntkinter.font.families(??)\ntkinter.font.itertools(??)\ntkinter.font.names(??)\ntkinter.font.nametofont(??)\ntkinter.font.tkinter(??)\ntkinter.getboolean(??)\ntkinter.getdouble(??)\ntkinter.getint(??)\ntkinter.image_names(??)\ntkinter.image_types(??)\ntkinter.mainloop(??)\ntkinter.messagebox.ABORT\ntkinter.messagebox.ABORTRETRYIGNORE\ntkinter.messagebox.CANCEL\ntkinter.messagebox.Dialog(??)\ntkinter.messagebox.ERROR\ntkinter.messagebox.IGNORE\ntkinter.messagebox.INFO\ntkinter.messagebox.Message(??)\ntkinter.messagebox.NO\ntkinter.messagebox.OK\ntkinter.messagebox.OKCANCEL\ntkinter.messagebox.QUESTION\ntkinter.messagebox.RETRY\ntkinter.messagebox.RETRYCANCEL\ntkinter.messagebox.WARNING\ntkinter.messagebox.YES\ntkinter.messagebox.YESNO\ntkinter.messagebox.YESNOCANCEL\ntkinter.messagebox.askokcancel(??)\ntkinter.messagebox.askquestion(??)\ntkinter.messagebox.askretrycancel(??)\ntkinter.messagebox.askyesno(??)\ntkinter.messagebox.askyesnocancel(??)\ntkinter.messagebox.showerror(??)\ntkinter.messagebox.showinfo(??)\ntkinter.messagebox.showwarning(??)\ntkinter.scrolledtext.BOTH\ntkinter.scrolledtext.Frame(??)\ntkinter.scrolledtext.Grid(??)\ntkinter.scrolledtext.LEFT\ntkinter.scrolledtext.Pack(??)\ntkinter.scrolledtext.Place(??)\ntkinter.scrolledtext.RIGHT\ntkinter.scrolledtext.Scrollbar(??)\ntkinter.scrolledtext.ScrolledText(??)\ntkinter.scrolledtext.Text(??)\ntkinter.scrolledtext.Y\ntkinter.scrolledtext.example(??)\ntkinter.simpledialog.ACTIVE\ntkinter.simpledialog.ALL\ntkinter.simpledialog.ANCHOR\ntkinter.simpledialog.ARC\ntkinter.simpledialog.At(??)\ntkinter.simpledialog.AtEnd(??)\ntkinter.simpledialog.AtInsert(??)\ntkinter.simpledialog.AtSelFirst(??)\ntkinter.simpledialog.AtSelLast(??)\ntkinter.simpledialog.BASELINE\ntkinter.simpledialog.BEVEL\ntkinter.simpledialog.BOTH\ntkinter.simpledialog.BOTTOM\ntkinter.simpledialog.BROWSE\ntkinter.simpledialog.BUTT\ntkinter.simpledialog.BaseWidget(??)\ntkinter.simpledialog.BitmapImage(??)\ntkinter.simpledialog.BooleanVar(??)\ntkinter.simpledialog.Button(??)\ntkinter.simpledialog.CASCADE\ntkinter.simpledialog.CENTER\ntkinter.simpledialog.CHAR\ntkinter.simpledialog.CHECKBUTTON\ntkinter.simpledialog.CHORD\ntkinter.simpledialog.COMMAND\ntkinter.simpledialog.CURRENT\ntkinter.simpledialog.CallWrapper(??)\ntkinter.simpledialog.Canvas(??)\ntkinter.simpledialog.Checkbutton(??)\ntkinter.simpledialog.DISABLED\ntkinter.simpledialog.DOTBOX\ntkinter.simpledialog.Dialog(??)\ntkinter.simpledialog.DoubleVar(??)\ntkinter.simpledialog.E\ntkinter.simpledialog.END\ntkinter.simpledialog.EW\ntkinter.simpledialog.EXCEPTION\ntkinter.simpledialog.EXTENDED\ntkinter.simpledialog.Entry(??)\ntkinter.simpledialog.Event(??)\ntkinter.simpledialog.FALSE\ntkinter.simpledialog.FIRST\ntkinter.simpledialog.FLAT\ntkinter.simpledialog.Frame(??)\ntkinter.simpledialog.GROOVE\ntkinter.simpledialog.Grid(??)\ntkinter.simpledialog.HIDDEN\ntkinter.simpledialog.HORIZONTAL\ntkinter.simpledialog.INSERT\ntkinter.simpledialog.INSIDE\ntkinter.simpledialog.Image(??)\ntkinter.simpledialog.IntVar(??)\ntkinter.simpledialog.LAST\ntkinter.simpledialog.LEFT\ntkinter.simpledialog.Label(??)\ntkinter.simpledialog.LabelFrame(??)\ntkinter.simpledialog.Listbox(??)\ntkinter.simpledialog.MITER\ntkinter.simpledialog.MOVETO\ntkinter.simpledialog.MULTIPLE\ntkinter.simpledialog.Menu(??)\ntkinter.simpledialog.Menubutton(??)\ntkinter.simpledialog.Message(??)\ntkinter.simpledialog.Misc(??)\ntkinter.simpledialog.N\ntkinter.simpledialog.NE\ntkinter.simpledialog.NO\ntkinter.simpledialog.NONE\ntkinter.simpledialog.NORMAL\ntkinter.simpledialog.NS\ntkinter.simpledialog.NSEW\ntkinter.simpledialog.NUMERIC\ntkinter.simpledialog.NW\ntkinter.simpledialog.NoDefaultRoot(??)\ntkinter.simpledialog.OFF\ntkinter.simpledialog.ON\ntkinter.simpledialog.OUTSIDE\ntkinter.simpledialog.OptionMenu(??)\ntkinter.simpledialog.PAGES\ntkinter.simpledialog.PIESLICE\ntkinter.simpledialog.PROJECTING\ntkinter.simpledialog.Pack(??)\ntkinter.simpledialog.PanedWindow(??)\ntkinter.simpledialog.PhotoImage(??)\ntkinter.simpledialog.Place(??)\ntkinter.simpledialog.RADIOBUTTON\ntkinter.simpledialog.RAISED\ntkinter.simpledialog.READABLE\ntkinter.simpledialog.RIDGE\ntkinter.simpledialog.RIGHT\ntkinter.simpledialog.ROUND\ntkinter.simpledialog.Radiobutton(??)\ntkinter.simpledialog.S\ntkinter.simpledialog.SCROLL\ntkinter.simpledialog.SE\ntkinter.simpledialog.SEL\ntkinter.simpledialog.SEL_FIRST\ntkinter.simpledialog.SEL_LAST\ntkinter.simpledialog.SEPARATOR\ntkinter.simpledialog.SINGLE\ntkinter.simpledialog.SOLID\ntkinter.simpledialog.SUNKEN\ntkinter.simpledialog.SW\ntkinter.simpledialog.Scale(??)\ntkinter.simpledialog.Scrollbar(??)\ntkinter.simpledialog.SimpleDialog(??)\ntkinter.simpledialog.Spinbox(??)\ntkinter.simpledialog.StringVar(??)\ntkinter.simpledialog.Studbutton(??)\ntkinter.simpledialog.TOP\ntkinter.simpledialog.TRUE\ntkinter.simpledialog.Tcl(??)\ntkinter.simpledialog.TclError(??)\ntkinter.simpledialog.TclVersion\ntkinter.simpledialog.Text(??)\ntkinter.simpledialog.Tk(??)\ntkinter.simpledialog.TkVersion\ntkinter.simpledialog.Toplevel(??)\ntkinter.simpledialog.Tributton(??)\ntkinter.simpledialog.UNDERLINE\ntkinter.simpledialog.UNITS\ntkinter.simpledialog.VERTICAL\ntkinter.simpledialog.Variable(??)\ntkinter.simpledialog.W\ntkinter.simpledialog.WORD\ntkinter.simpledialog.WRITABLE\ntkinter.simpledialog.Widget(??)\ntkinter.simpledialog.Wm(??)\ntkinter.simpledialog.X\ntkinter.simpledialog.XView(??)\ntkinter.simpledialog.Y\ntkinter.simpledialog.YES\ntkinter.simpledialog.YView(??)\ntkinter.simpledialog.askfloat(??)\ntkinter.simpledialog.askinteger(??)\ntkinter.simpledialog.askstring(??)\ntkinter.simpledialog.colorchooser(??)\ntkinter.simpledialog.commondialog(??)\ntkinter.simpledialog.constants(??)\ntkinter.simpledialog.dialog(??)\ntkinter.simpledialog.dnd(??)\ntkinter.simpledialog.filedialog(??)\ntkinter.simpledialog.font(??)\ntkinter.simpledialog.getboolean(??)\ntkinter.simpledialog.getdouble(??)\ntkinter.simpledialog.getint(??)\ntkinter.simpledialog.image_names(??)\ntkinter.simpledialog.image_types(??)\ntkinter.simpledialog.mainloop(??)\ntkinter.simpledialog.messagebox(??)\ntkinter.simpledialog.scrolledtext(??)\ntkinter.simpledialog.sys(??)\ntkinter.simpledialog.tkinter(??)\ntkinter.simpledialog.wantobjects\ntkinter.simpledialog.warnings(??)\ntkinter.sys(??)\ntkinter.tix.ACROSSTOP\ntkinter.tix.ACTIVE\ntkinter.tix.ALL\ntkinter.tix.ANCHOR\ntkinter.tix.ARC\ntkinter.tix.ASCII\ntkinter.tix.AUTO\ntkinter.tix.At(??)\ntkinter.tix.AtEnd(??)\ntkinter.tix.AtInsert(??)\ntkinter.tix.AtSelFirst(??)\ntkinter.tix.AtSelLast(??)\ntkinter.tix.BALLOON\ntkinter.tix.BASELINE\ntkinter.tix.BEVEL\ntkinter.tix.BOTH\ntkinter.tix.BOTTOM\ntkinter.tix.BROWSE\ntkinter.tix.BUTT\ntkinter.tix.Balloon(??)\ntkinter.tix.BaseWidget(??)\ntkinter.tix.BitmapImage(??)\ntkinter.tix.BooleanVar(??)\ntkinter.tix.Button(??)\ntkinter.tix.ButtonBox(??)\ntkinter.tix.CASCADE\ntkinter.tix.CELL\ntkinter.tix.CENTER\ntkinter.tix.CHAR\ntkinter.tix.CHECKBUTTON\ntkinter.tix.CHORD\ntkinter.tix.COLUMN\ntkinter.tix.COMMAND\ntkinter.tix.CObjView(??)\ntkinter.tix.CURRENT\ntkinter.tix.CallWrapper(??)\ntkinter.tix.Canvas(??)\ntkinter.tix.CheckList(??)\ntkinter.tix.Checkbutton(??)\ntkinter.tix.ComboBox(??)\ntkinter.tix.Control(??)\ntkinter.tix.DECREASING\ntkinter.tix.DISABLED\ntkinter.tix.DOTBOX\ntkinter.tix.DialogShell(??)\ntkinter.tix.DirList(??)\ntkinter.tix.DirSelectBox(??)\ntkinter.tix.DirSelectDialog(??)\ntkinter.tix.DirTree(??)\ntkinter.tix.DisplayStyle(??)\ntkinter.tix.DoubleVar(??)\ntkinter.tix.E\ntkinter.tix.END\ntkinter.tix.EW\ntkinter.tix.EXCEPTION\ntkinter.tix.EXTENDED\ntkinter.tix.Entry(??)\ntkinter.tix.Event(??)\ntkinter.tix.ExFileSelectBox(??)\ntkinter.tix.ExFileSelectDialog(??)\ntkinter.tix.FALSE\ntkinter.tix.FIRST\ntkinter.tix.FLAT\ntkinter.tix.FileEntry(??)\ntkinter.tix.FileSelectBox(??)\ntkinter.tix.FileSelectDialog(??)\ntkinter.tix.FileTypeList(??)\ntkinter.tix.Form(??)\ntkinter.tix.Frame(??)\ntkinter.tix.GROOVE\ntkinter.tix.Grid(??)\ntkinter.tix.HIDDEN\ntkinter.tix.HList(??)\ntkinter.tix.HORIZONTAL\ntkinter.tix.IMAGE\ntkinter.tix.IMAGETEXT\ntkinter.tix.IMMEDIATE\ntkinter.tix.INCREASING\ntkinter.tix.INSERT\ntkinter.tix.INSIDE\ntkinter.tix.INTEGER\ntkinter.tix.Image(??)\ntkinter.tix.InputOnly(??)\ntkinter.tix.IntVar(??)\ntkinter.tix.LAST\ntkinter.tix.LEFT\ntkinter.tix.Label(??)\ntkinter.tix.LabelEntry(??)\ntkinter.tix.LabelFrame(??)\ntkinter.tix.ListNoteBook(??)\ntkinter.tix.Listbox(??)\ntkinter.tix.MAIN\ntkinter.tix.MAX\ntkinter.tix.MITER\ntkinter.tix.MOVETO\ntkinter.tix.MULTIPLE\ntkinter.tix.Menu(??)\ntkinter.tix.Menubutton(??)\ntkinter.tix.Message(??)\ntkinter.tix.Meter(??)\ntkinter.tix.Misc(??)\ntkinter.tix.N\ntkinter.tix.NE\ntkinter.tix.NO\ntkinter.tix.NONE\ntkinter.tix.NORMAL\ntkinter.tix.NS\ntkinter.tix.NSEW\ntkinter.tix.NUMERIC\ntkinter.tix.NW\ntkinter.tix.NoDefaultRoot(??)\ntkinter.tix.NoteBook(??)\ntkinter.tix.NoteBookFrame(??)\ntkinter.tix.OFF\ntkinter.tix.ON\ntkinter.tix.OUTSIDE\ntkinter.tix.OptionMenu(??)\ntkinter.tix.OptionName(??)\ntkinter.tix.PAGES\ntkinter.tix.PIESLICE\ntkinter.tix.PROJECTING\ntkinter.tix.Pack(??)\ntkinter.tix.PanedWindow(??)\ntkinter.tix.PhotoImage(??)\ntkinter.tix.Place(??)\ntkinter.tix.PopupMenu(??)\ntkinter.tix.RADIOBUTTON\ntkinter.tix.RAISED\ntkinter.tix.READABLE\ntkinter.tix.REAL\ntkinter.tix.RIDGE\ntkinter.tix.RIGHT\ntkinter.tix.ROUND\ntkinter.tix.ROW\ntkinter.tix.Radiobutton(??)\ntkinter.tix.ResizeHandle(??)\ntkinter.tix.S\ntkinter.tix.SCROLL\ntkinter.tix.SE\ntkinter.tix.SEL\ntkinter.tix.SEL_FIRST\ntkinter.tix.SEL_LAST\ntkinter.tix.SEPARATOR\ntkinter.tix.SINGLE\ntkinter.tix.SOLID\ntkinter.tix.STATUS\ntkinter.tix.SUNKEN\ntkinter.tix.SW\ntkinter.tix.S_REGION\ntkinter.tix.Scale(??)\ntkinter.tix.Scrollbar(??)\ntkinter.tix.ScrolledGrid(??)\ntkinter.tix.ScrolledHList(??)\ntkinter.tix.ScrolledListBox(??)\ntkinter.tix.ScrolledTList(??)\ntkinter.tix.ScrolledText(??)\ntkinter.tix.ScrolledWindow(??)\ntkinter.tix.Select(??)\ntkinter.tix.Shell(??)\ntkinter.tix.Spinbox(??)\ntkinter.tix.StdButtonBox(??)\ntkinter.tix.StringVar(??)\ntkinter.tix.Studbutton(??)\ntkinter.tix.TCL_ALL_EVENTS\ntkinter.tix.TCL_DONT_WAIT\ntkinter.tix.TCL_FILE_EVENTS\ntkinter.tix.TCL_IDLE_EVENTS\ntkinter.tix.TCL_TIMER_EVENTS\ntkinter.tix.TCL_WINDOW_EVENTS\ntkinter.tix.TEXT\ntkinter.tix.TList(??)\ntkinter.tix.TOP\ntkinter.tix.TRUE\ntkinter.tix.Tcl(??)\ntkinter.tix.TclError(??)\ntkinter.tix.TclVersion\ntkinter.tix.Text(??)\ntkinter.tix.TixSubWidget(??)\ntkinter.tix.TixWidget(??)\ntkinter.tix.Tk(??)\ntkinter.tix.TkVersion\ntkinter.tix.Toplevel(??)\ntkinter.tix.Tree(??)\ntkinter.tix.Tributton(??)\ntkinter.tix.UNDERLINE\ntkinter.tix.UNITS\ntkinter.tix.VERTICAL\ntkinter.tix.Variable(??)\ntkinter.tix.W\ntkinter.tix.WINDOW\ntkinter.tix.WORD\ntkinter.tix.WRITABLE\ntkinter.tix.Widget(??)\ntkinter.tix.Wm(??)\ntkinter.tix.X\ntkinter.tix.XView(??)\ntkinter.tix.X_REGION\ntkinter.tix.Y\ntkinter.tix.YES\ntkinter.tix.YView(??)\ntkinter.tix.Y_REGION\ntkinter.tix.colorchooser(??)\ntkinter.tix.commondialog(??)\ntkinter.tix.constants(??)\ntkinter.tix.dialog(??)\ntkinter.tix.dnd(??)\ntkinter.tix.filedialog(??)\ntkinter.tix.font(??)\ntkinter.tix.getboolean(??)\ntkinter.tix.getdouble(??)\ntkinter.tix.getint(??)\ntkinter.tix.image_names(??)\ntkinter.tix.image_types(??)\ntkinter.tix.mainloop(??)\ntkinter.tix.messagebox(??)\ntkinter.tix.os(??)\ntkinter.tix.scrolledtext(??)\ntkinter.tix.simpledialog(??)\ntkinter.tix.sys(??)\ntkinter.tix.tixCommand(??)\ntkinter.tix.tkinter(??)\ntkinter.tix.wantobjects\ntkinter.tix.warnings(??)\ntkinter.ttk.Button(??)\ntkinter.ttk.Checkbutton(??)\ntkinter.ttk.Combobox(??)\ntkinter.ttk.Entry(??)\ntkinter.ttk.Frame(??)\ntkinter.ttk.Label(??)\ntkinter.ttk.LabelFrame(??)\ntkinter.ttk.LabeledScale(??)\ntkinter.ttk.Labelframe(??)\ntkinter.ttk.Menubutton(??)\ntkinter.ttk.Notebook(??)\ntkinter.ttk.OptionMenu(??)\ntkinter.ttk.PanedWindow(??)\ntkinter.ttk.Panedwindow(??)\ntkinter.ttk.Progressbar(??)\ntkinter.ttk.Radiobutton(??)\ntkinter.ttk.Scale(??)\ntkinter.ttk.Scrollbar(??)\ntkinter.ttk.Separator(??)\ntkinter.ttk.Sizegrip(??)\ntkinter.ttk.Style(??)\ntkinter.ttk.Treeview(??)\ntkinter.ttk.Widget(??)\ntkinter.ttk.setup_master(??)\ntkinter.ttk.tclobjs_to_py(??)\ntkinter.ttk.tkinter(??)\ntkinter.wantobjects\ntkinter.warnings(??)\ntoken.AMPER\ntoken.AMPEREQUAL\ntoken.AT\ntoken.CIRCUMFLEX\ntoken.CIRCUMFLEXEQUAL\ntoken.COLON\ntoken.COMMA\ntoken.DEDENT\ntoken.DOT\ntoken.DOUBLESLASH\ntoken.DOUBLESLASHEQUAL\ntoken.DOUBLESTAR\ntoken.DOUBLESTAREQUAL\ntoken.ELLIPSIS\ntoken.ENDMARKER\ntoken.EQEQUAL\ntoken.EQUAL\ntoken.ERRORTOKEN\ntoken.GREATER\ntoken.GREATEREQUAL\ntoken.INDENT\ntoken.ISEOF(??)\ntoken.ISNONTERMINAL(??)\ntoken.ISTERMINAL(??)\ntoken.LBRACE\ntoken.LEFTSHIFT\ntoken.LEFTSHIFTEQUAL\ntoken.LESS\ntoken.LESSEQUAL\ntoken.LPAR\ntoken.LSQB\ntoken.MINEQUAL\ntoken.MINUS\ntoken.NAME\ntoken.NEWLINE\ntoken.NOTEQUAL\ntoken.NT_OFFSET\ntoken.NUMBER\ntoken.N_TOKENS\ntoken.OP\ntoken.PERCENT\ntoken.PERCENTEQUAL\ntoken.PLUS\ntoken.PLUSEQUAL\ntoken.RARROW\ntoken.RBRACE\ntoken.RIGHTSHIFT\ntoken.RIGHTSHIFTEQUAL\ntoken.RPAR\ntoken.RSQB\ntoken.SEMI\ntoken.SLASH\ntoken.SLASHEQUAL\ntoken.STAR\ntoken.STAREQUAL\ntoken.STRING\ntoken.TILDE\ntoken.VBAR\ntoken.VBAREQUAL\ntoken.tok_name(??)\ntokenize.AMPER\ntokenize.AMPEREQUAL\ntokenize.AT\ntokenize.BOM_UTF8\ntokenize.Binnumber\ntokenize.Bracket\ntokenize.CIRCUMFLEX\ntokenize.CIRCUMFLEXEQUAL\ntokenize.COLON\ntokenize.COMMA\ntokenize.COMMENT\ntokenize.Comment\ntokenize.ContStr\ntokenize.DEDENT\ntokenize.DOT\ntokenize.DOUBLESLASH\ntokenize.DOUBLESLASHEQUAL\ntokenize.DOUBLESTAR\ntokenize.DOUBLESTAREQUAL\ntokenize.Decnumber\ntokenize.Double\ntokenize.Double3\ntokenize.ELLIPSIS\ntokenize.ENCODING\ntokenize.ENDMARKER\ntokenize.EQEQUAL\ntokenize.EQUAL\ntokenize.ERRORTOKEN\ntokenize.EXACT_TOKEN_TYPES(??)\ntokenize.Expfloat\ntokenize.Exponent\ntokenize.Floatnumber\ntokenize.Funny\ntokenize.GREATER\ntokenize.GREATEREQUAL\ntokenize.Hexnumber\ntokenize.INDENT\ntokenize.ISEOF(??)\ntokenize.ISNONTERMINAL(??)\ntokenize.ISTERMINAL(??)\ntokenize.Ignore\ntokenize.Imagnumber\ntokenize.Intnumber\ntokenize.LBRACE\ntokenize.LEFTSHIFT\ntokenize.LEFTSHIFTEQUAL\ntokenize.LESS\ntokenize.LESSEQUAL\ntokenize.LPAR\ntokenize.LSQB\ntokenize.MINEQUAL\ntokenize.MINUS\ntokenize.NAME\ntokenize.NEWLINE\ntokenize.NL\ntokenize.NOTEQUAL\ntokenize.NT_OFFSET\ntokenize.NUMBER\ntokenize.N_TOKENS\ntokenize.Name\ntokenize.Number\ntokenize.OP\ntokenize.Octnumber\ntokenize.Operator\ntokenize.PERCENT\ntokenize.PERCENTEQUAL\ntokenize.PLUS\ntokenize.PLUSEQUAL\ntokenize.PlainToken\ntokenize.Pointfloat\ntokenize.PseudoExtras\ntokenize.PseudoToken\ntokenize.RARROW\ntokenize.RBRACE\ntokenize.RIGHTSHIFT\ntokenize.RIGHTSHIFTEQUAL\ntokenize.RPAR\ntokenize.RSQB\ntokenize.SEMI\ntokenize.SLASH\ntokenize.SLASHEQUAL\ntokenize.STAR\ntokenize.STAREQUAL\ntokenize.STRING\ntokenize.Single\ntokenize.Single3\ntokenize.Special\ntokenize.StopTokenizing(??)\ntokenize.String\ntokenize.StringPrefix\ntokenize.TILDE\ntokenize.TextIOWrapper(??)\ntokenize.Token\ntokenize.TokenError(??)\ntokenize.TokenInfo(??)\ntokenize.Triple\ntokenize.Untokenizer(??)\ntokenize.VBAR\ntokenize.VBAREQUAL\ntokenize.Whitespace\ntokenize.any(??)\ntokenize.builtins(??)\ntokenize.collections(??)\ntokenize.cookie_re(??)\ntokenize.detect_encoding(??)\ntokenize.endpats(??)\ntokenize.generate_tokens(??)\ntokenize.group(??)\ntokenize.lookup(encoding) -> CodecInfo\ntokenize.main(??)\ntokenize.maybe(??)\ntokenize.open(??)\ntokenize.re(??)\ntokenize.single_quoted(??)\ntokenize.sys(??)\ntokenize.t\ntokenize.tabsize\ntokenize.tok_name(??)\ntokenize.tokenize(??)\ntokenize.triple_quoted(??)\ntokenize.untokenize(??)\ntrace.CoverageResults(??)\ntrace.Ignore(??)\ntrace.PRAGMA_NOCOVER\ntrace.Trace(??)\ntrace.dis(??)\ntrace.find_executable_linenos(??)\ntrace.find_lines(??)\ntrace.find_lines_from_code(??)\ntrace.find_strings(??)\ntrace.fullmodname(??)\ntrace.gc(??)\ntrace.inspect(??)\ntrace.linecache(??)\ntrace.main(??)\ntrace.modname(??)\ntrace.os(??)\ntrace.pickle(??)\ntrace.re(??)\ntrace.rx_blank(??)\ntrace.sys(??)\ntrace.threading(??)\ntrace.token(??)\ntrace.tokenize(??)\ntrace.usage(??)\ntraceback.extract_stack(??)\ntraceback.extract_tb(??)\ntraceback.format_exc(??)\ntraceback.format_exception(??)\ntraceback.format_exception_only(??)\ntraceback.format_list(??)\ntraceback.format_stack(??)\ntraceback.format_tb(??)\ntraceback.linecache(??)\ntraceback.print_exc(??)\ntraceback.print_exception(??)\ntraceback.print_last(??)\ntraceback.print_list(??)\ntraceback.print_stack(??)\ntraceback.print_tb(??)\ntraceback.sys(??)\ntty.B0\ntty.B110\ntty.B115200\ntty.B1200\ntty.B134\ntty.B150\ntty.B1800\ntty.B19200\ntty.B200\ntty.B230400\ntty.B2400\ntty.B300\ntty.B38400\ntty.B4800\ntty.B50\ntty.B57600\ntty.B600\ntty.B75\ntty.B9600\ntty.BRKINT\ntty.BS0\ntty.BS1\ntty.BSDLY\ntty.CC\ntty.CDSUSP\ntty.CEOF\ntty.CEOL\ntty.CEOT\ntty.CERASE\ntty.CFLAG\ntty.CFLUSH\ntty.CINTR\ntty.CKILL\ntty.CLNEXT\ntty.CLOCAL\ntty.CQUIT\ntty.CR0\ntty.CR1\ntty.CR2\ntty.CR3\ntty.CRDLY\ntty.CREAD\ntty.CRPRNT\ntty.CRTSCTS\ntty.CS5\ntty.CS6\ntty.CS7\ntty.CS8\ntty.CSIZE\ntty.CSTART\ntty.CSTOP\ntty.CSTOPB\ntty.CSUSP\ntty.CWERASE\ntty.ECHO\ntty.ECHOCTL\ntty.ECHOE\ntty.ECHOK\ntty.ECHOKE\ntty.ECHONL\ntty.ECHOPRT\ntty.EXTA\ntty.EXTB\ntty.FF0\ntty.FF1\ntty.FFDLY\ntty.FIOASYNC\ntty.FIOCLEX\ntty.FIONBIO\ntty.FIONCLEX\ntty.FIONREAD\ntty.FLUSHO\ntty.HUPCL\ntty.ICANON\ntty.ICRNL\ntty.IEXTEN\ntty.IFLAG\ntty.IGNBRK\ntty.IGNCR\ntty.IGNPAR\ntty.IMAXBEL\ntty.INLCR\ntty.INPCK\ntty.ISIG\ntty.ISPEED\ntty.ISTRIP\ntty.IXANY\ntty.IXOFF\ntty.IXON\ntty.LFLAG\ntty.NCCS\ntty.NL0\ntty.NL1\ntty.NLDLY\ntty.NOFLSH\ntty.OCRNL\ntty.OFDEL\ntty.OFILL\ntty.OFLAG\ntty.ONLCR\ntty.ONLRET\ntty.ONOCR\ntty.OPOST\ntty.OSPEED\ntty.PARENB\ntty.PARMRK\ntty.PARODD\ntty.PENDIN\ntty.TAB0\ntty.TAB1\ntty.TAB2\ntty.TAB3\ntty.TABDLY\ntty.TCIFLUSH\ntty.TCIOFF\ntty.TCIOFLUSH\ntty.TCION\ntty.TCOFLUSH\ntty.TCOOFF\ntty.TCOON\ntty.TCSADRAIN\ntty.TCSAFLUSH\ntty.TCSANOW\ntty.TCSASOFT\ntty.TIOCCONS\ntty.TIOCEXCL\ntty.TIOCGETD\ntty.TIOCGPGRP\ntty.TIOCGWINSZ\ntty.TIOCMBIC\ntty.TIOCMBIS\ntty.TIOCMGET\ntty.TIOCMSET\ntty.TIOCM_CAR\ntty.TIOCM_CD\ntty.TIOCM_CTS\ntty.TIOCM_DSR\ntty.TIOCM_DTR\ntty.TIOCM_LE\ntty.TIOCM_RI\ntty.TIOCM_RNG\ntty.TIOCM_RTS\ntty.TIOCM_SR\ntty.TIOCM_ST\ntty.TIOCNOTTY\ntty.TIOCNXCL\ntty.TIOCOUTQ\ntty.TIOCPKT\ntty.TIOCPKT_DATA\ntty.TIOCPKT_DOSTOP\ntty.TIOCPKT_FLUSHREAD\ntty.TIOCPKT_FLUSHWRITE\ntty.TIOCPKT_NOSTOP\ntty.TIOCPKT_START\ntty.TIOCPKT_STOP\ntty.TIOCSCTTY\ntty.TIOCSETD\ntty.TIOCSPGRP\ntty.TIOCSTI\ntty.TIOCSWINSZ\ntty.TOSTOP\ntty.VDISCARD\ntty.VEOF\ntty.VEOL\ntty.VEOL2\ntty.VERASE\ntty.VINTR\ntty.VKILL\ntty.VLNEXT\ntty.VMIN\ntty.VQUIT\ntty.VREPRINT\ntty.VSTART\ntty.VSTOP\ntty.VSUSP\ntty.VT0\ntty.VT1\ntty.VTDLY\ntty.VTIME\ntty.VWERASE\ntty.error(??)\ntty.setcbreak(??)\ntty.setraw(??)\ntty.tcdrain(fd) -> None\ntty.tcflow(fd, action) -> None\ntty.tcflush(fd, queue) -> None\ntty.tcgetattr(fd) -> list_of_attrs\ntty.tcsendbreak(fd, duration) -> None\ntty.tcsetattr(fd, when, attributes) -> None\ntuple() -> empty tuple\nturtle.Canvas(??)\nturtle.Pen(??)\nturtle.RawPen(??)\nturtle.RawTurtle(??)\nturtle.Screen(??)\nturtle.ScrolledCanvas(??)\nturtle.Shape(??)\nturtle.TK(??)\nturtle.TNavigator(??)\nturtle.TPen(??)\nturtle.Tbuffer(??)\nturtle.Terminator(??)\nturtle.Turtle(??)\nturtle.TurtleGraphicsError(??)\nturtle.TurtleScreen(??)\nturtle.TurtleScreenBase(??)\nturtle.Vec2D(??)\nturtle.addshape(??)\nturtle.back(??)\nturtle.backward(??)\nturtle.begin_fill(??)\nturtle.begin_poly(??)\nturtle.bgcolor(??)\nturtle.bgpic(??)\nturtle.bk(??)\nturtle.bye(??)\nturtle.circle(??)\nturtle.clear(??)\nturtle.clearscreen(??)\nturtle.clearstamp(??)\nturtle.clearstamps(??)\nturtle.clone(??)\nturtle.color(??)\nturtle.colormode(??)\nturtle.config_dict(??)\nturtle.deepcopy(??)\nturtle.defstr\nturtle.degrees(??)\nturtle.delay(??)\nturtle.distance(??)\nturtle.done(??)\nturtle.dot(??)\nturtle.down(??)\nturtle.end_fill(??)\nturtle.end_poly(??)\nturtle.exitonclick(??)\nturtle.fd(??)\nturtle.fillcolor(??)\nturtle.filling(??)\nturtle.forward(??)\nturtle.get_poly(??)\nturtle.get_shapepoly(??)\nturtle.getcanvas(??)\nturtle.getmethparlist(??)\nturtle.getpen(??)\nturtle.getscreen(??)\nturtle.getshapes(??)\nturtle.getturtle(??)\nturtle.goto(??)\nturtle.heading(??)\nturtle.hideturtle(??)\nturtle.home(??)\nturtle.ht(??)\nturtle.inspect(??)\nturtle.isdown(??)\nturtle.isfile(??)\nturtle.isvisible(??)\nturtle.join(??)\nturtle.left(??)\nturtle.listen(??)\nturtle.lt(??)\nturtle.mainloop(??)\nturtle.math(??)\nturtle.methodname\nturtle.mode(??)\nturtle.numinput(??)\nturtle.onclick(??)\nturtle.ondrag(??)\nturtle.onkey(??)\nturtle.onkeypress(??)\nturtle.onkeyrelease(??)\nturtle.onrelease(??)\nturtle.onscreenclick(??)\nturtle.ontimer(??)\nturtle.pd(??)\nturtle.pen(??)\nturtle.pencolor(??)\nturtle.pendown(??)\nturtle.pensize(??)\nturtle.penup(??)\nturtle.pl1\nturtle.pl2\nturtle.pos(??)\nturtle.position(??)\nturtle.pu(??)\nturtle.radians(??)\nturtle.read_docstrings(??)\nturtle.readconfig(??)\nturtle.register_shape(??)\nturtle.reset(??)\nturtle.resetscreen(??)\nturtle.resizemode(??)\nturtle.right(??)\nturtle.rt(??)\nturtle.screensize(??)\nturtle.seth(??)\nturtle.setheading(??)\nturtle.setpos(??)\nturtle.setposition(??)\nturtle.settiltangle(??)\nturtle.setundobuffer(??)\nturtle.setup(??)\nturtle.setworldcoordinates(??)\nturtle.setx(??)\nturtle.sety(??)\nturtle.shape(??)\nturtle.shapesize(??)\nturtle.shapetransform(??)\nturtle.shearfactor(??)\nturtle.showturtle(??)\nturtle.simpledialog(??)\nturtle.speed(??)\nturtle.split(??)\nturtle.st(??)\nturtle.stamp(??)\nturtle.textinput(??)\nturtle.tilt(??)\nturtle.tiltangle(??)\nturtle.time(??)\nturtle.title(??)\nturtle.towards(??)\nturtle.tracer(??)\nturtle.turtles(??)\nturtle.turtlesize(??)\nturtle.types(??)\nturtle.undo (repeatedly) the last turtle action.\nturtle.undobufferentries(??)\nturtle.up(??)\nturtle.update(??)\nturtle.width(??)\nturtle.window_height(??)\nturtle.window_width(??)\nturtle.write(??)\nturtle.write_docstringdict(??)\nturtle.xcor(??)\nturtle.ycor(??)\ntype(object) -> the object's type\ntypes.BuiltinFunctionType(??)\ntypes.BuiltinMethodType(??)\ntypes.CodeType(??)\ntypes.FrameType(??)\ntypes.FunctionType(??)\ntypes.GeneratorType(??)\ntypes.GetSetDescriptorType(??)\ntypes.LambdaType(??)\ntypes.MappingProxyType(??)\ntypes.MemberDescriptorType(??)\ntypes.MethodType(??)\ntypes.ModuleType(??)\ntypes.SimpleNamespace(??)\ntypes.TracebackType(??)\ntypes.new_class(??)\ntypes.prepare_class(??)\nunicodedata.UCD(??)\nunicodedata.bidirectional(unichr)\nunicodedata.category(unichr)\nunicodedata.combining(unichr)\nunicodedata.decimal(unichr[, default])\nunicodedata.decomposition(unichr)\nunicodedata.digit(unichr[, default])\nunicodedata.east_asian_width(unichr)\nunicodedata.lookup(name)\nunicodedata.mirrored(unichr)\nunicodedata.name(unichr[, default])\nunicodedata.normalize(form, unistr)\nunicodedata.numeric(unichr[, default])\nunicodedata.ucd_3_2_0(??)\nunicodedata.ucnhash_CAPI(??)\nunicodedata.unidata_version\nurllib.error(??)\nurllib.error.ContentTooShortError(??)\nurllib.error.HTTPError(??)\nurllib.error.URLError(??)\nurllib.error.urllib(??)\nurllib.parse(??)\nurllib.parse.DefragResult(??)\nurllib.parse.DefragResultBytes(??)\nurllib.parse.MAX_CACHE_SIZE\nurllib.parse.ParseResult(??)\nurllib.parse.ParseResultBytes(??)\nurllib.parse.Quoter(??)\nurllib.parse.ResultBase(??)\nurllib.parse.SplitResult(??)\nurllib.parse.SplitResultBytes(??)\nurllib.parse.clear_cache(??)\nurllib.parse.collections(??)\nurllib.parse.namedtuple(??)\nurllib.parse.non_hierarchical(??)\nurllib.parse.parse_qs(??)\nurllib.parse.parse_qsl(??)\nurllib.parse.quote('abc def') -> 'abc%20def'\nurllib.parse.quote_from_bytes(??)\nurllib.parse.quote_plus(??)\nurllib.parse.scheme_chars\nurllib.parse.splitattr('/path;attr1=value1;attr2=value2;...') ->\nurllib.parse.splithost('//host[:port]/path') --> 'host[:port]', '/path'.\nurllib.parse.splitnport(??)\nurllib.parse.splitpasswd('user:passwd') -> 'user', 'passwd'.\nurllib.parse.splitport('host:port') --> 'host', 'port'.\nurllib.parse.splitquery('/path?query') --> '/path', 'query'.\nurllib.parse.splittag('/path#tag') --> '/path', 'tag'.\nurllib.parse.splittype('type:opaquestring') --> 'type', 'opaquestring'.\nurllib.parse.splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.\nurllib.parse.splitvalue('attr=value') --> 'attr', 'value'.\nurllib.parse.sys(??)\nurllib.parse.to_bytes(u\"URL\") --> 'URL'.\nurllib.parse.unquote(??)\nurllib.parse.unquote_plus(??)\nurllib.parse.unquote_to_bytes('abc%20def') -> b'abc def'.\nurllib.parse.unwrap('<URL:type://host/path>') --> 'type://host/path'.\nurllib.parse.urldefrag(??)\nurllib.parse.urlencode(??)\nurllib.parse.urljoin(??)\nurllib.parse.urlparse(??)\nurllib.parse.urlsplit(??)\nurllib.parse.urlunparse(??)\nurllib.parse.urlunsplit(??)\nurllib.parse.uses_fragment(??)\nurllib.parse.uses_netloc(??)\nurllib.parse.uses_params(??)\nurllib.parse.uses_query(??)\nurllib.parse.uses_relative(??)\nurllib.request(??)\nurllib.request.AbstractBasicAuthHandler(??)\nurllib.request.AbstractDigestAuthHandler(??)\nurllib.request.AbstractHTTPHandler(??)\nurllib.request.BaseHandler(??)\nurllib.request.CacheFTPHandler(??)\nurllib.request.ContentTooShortError(??)\nurllib.request.FTPHandler(??)\nurllib.request.FancyURLopener(??)\nurllib.request.FileHandler(??)\nurllib.request.HTTPBasicAuthHandler(??)\nurllib.request.HTTPCookieProcessor(??)\nurllib.request.HTTPDefaultErrorHandler(??)\nurllib.request.HTTPDigestAuthHandler(??)\nurllib.request.HTTPError(??)\nurllib.request.HTTPErrorProcessor(??)\nurllib.request.HTTPHandler(??)\nurllib.request.HTTPPasswordMgr(??)\nurllib.request.HTTPPasswordMgrWithDefaultRealm(??)\nurllib.request.HTTPRedirectHandler(??)\nurllib.request.HTTPSHandler(??)\nurllib.request.MAXFTPCACHE\nurllib.request.OpenerDirector(??)\nurllib.request.ProxyBasicAuthHandler(??)\nurllib.request.ProxyDigestAuthHandler(??)\nurllib.request.ProxyHandler(??)\nurllib.request.Request(??)\nurllib.request.URLError(??)\nurllib.request.URLopener(??)\nurllib.request.UnknownHandler(??)\nurllib.request.addclosehook(??)\nurllib.request.addinfourl(??)\nurllib.request.base64(??)\nurllib.request.bisect(??)\nurllib.request.build_opener(??)\nurllib.request.collections(??)\nurllib.request.contextlib(??)\nurllib.request.email(??)\nurllib.request.ftpcache(??)\nurllib.request.ftperrors(??)\nurllib.request.ftpwrapper(??)\nurllib.request.getproxies(??)\nurllib.request.getproxies_environment(??)\nurllib.request.getproxies_macosx_sysconf(??)\nurllib.request.hashlib(??)\nurllib.request.http(??)\nurllib.request.install_opener(??)\nurllib.request.io(??)\nurllib.request.localhost(??)\nurllib.request.noheaders(??)\nurllib.request.os(??)\nurllib.request.parse_http_list(??)\nurllib.request.parse_keqv_list(??)\nurllib.request.pathname2url(??)\nurllib.request.posixpath(??)\nurllib.request.proxy_bypass(??)\nurllib.request.proxy_bypass_environment(??)\nurllib.request.proxy_bypass_macosx_sysconf(??)\nurllib.request.quote('abc def') -> 'abc%20def'\nurllib.request.re(??)\nurllib.request.request_host(??)\nurllib.request.socket(??)\nurllib.request.splitattr('/path;attr1=value1;attr2=value2;...') ->\nurllib.request.splithost('//host[:port]/path') --> 'host[:port]', '/path'.\nurllib.request.splitpasswd('user:passwd') -> 'user', 'passwd'.\nurllib.request.splitport('host:port') --> 'host', 'port'.\nurllib.request.splitquery('/path?query') --> '/path', 'query'.\nurllib.request.splittag('/path#tag') --> '/path', 'tag'.\nurllib.request.splittype('type:opaquestring') --> 'type', 'opaquestring'.\nurllib.request.splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.\nurllib.request.splitvalue('attr=value') --> 'attr', 'value'.\nurllib.request.ssl(??)\nurllib.request.sys(??)\nurllib.request.tempfile(??)\nurllib.request.thishost(??)\nurllib.request.time(??)\nurllib.request.to_bytes(u\"URL\") --> 'URL'.\nurllib.request.unquote(??)\nurllib.request.unwrap('<URL:type://host/path>') --> 'type://host/path'.\nurllib.request.url2pathname(??)\nurllib.request.urlcleanup(??)\nurllib.request.urljoin(??)\nurllib.request.urlopen(??)\nurllib.request.urlparse(??)\nurllib.request.urlretrieve(??)\nurllib.request.urlsplit(??)\nurllib.request.urlunparse(??)\nurllib.request.warnings(??)\nurllib.response(??)\nurllib.response.addbase(??)\nurllib.response.addclosehook(??)\nurllib.response.addinfo(??)\nurllib.response.addinfourl(??)\nurllib.robotparser.Entry(??)\nurllib.robotparser.RobotFileParser(??)\nurllib.robotparser.RuleLine(??)\nurllib.robotparser.urllib(??)\nuu.Error(??)\nuu.binascii(??)\nuu.decode(??)\nuu.encode(??)\nuu.os(??)\nuu.sys(??)\nuu.test(??)\nuuid.NAMESPACE_DNS(??)\nuuid.NAMESPACE_OID(??)\nuuid.NAMESPACE_URL(??)\nuuid.NAMESPACE_X500(??)\nuuid.RESERVED_FUTURE\nuuid.RESERVED_MICROSOFT\nuuid.RESERVED_NCS\nuuid.RFC_4122\nuuid.UUID(??)\nuuid.bytes_(??)\nuuid.ctypes(??)\nuuid.getnode(??)\nuuid.int_(??)\nuuid.lib(??)\nuuid.libname\nuuid.os(??)\nuuid.sys(??)\nuuid.uuid1(??)\nuuid.uuid3(??)\nuuid.uuid4(??)\nuuid.uuid5(??)\nvars([object]) -> dictionary\nvenv.Context(??)\nvenv.EnvBuilder(??)\nvenv.base64(??)\nvenv.create(??)\nvenv.io(??)\nvenv.logger(??)\nvenv.logging(??)\nvenv.main(??)\nvenv.os(??)\nvenv.shutil(??)\nvenv.sys(??)\nvenv.sysconfig(??)\nvenv.threading(??)\nwarnings.WarningMessage(??)\nwarnings.catch_warnings(??)\nwarnings.defaultaction\nwarnings.filters(??)\nwarnings.filterwarnings(??)\nwarnings.formatwarning(??)\nwarnings.linecache(??)\nwarnings.onceregistry(??)\nwarnings.resetwarnings(??)\nwarnings.showwarning(??)\nwarnings.simplefilter(??)\nwarnings.sys(??)\nwarnings.warn(??)\nwarnings.warn_explicit(??)\nwave.Chunk(??)\nwave.Error(??)\nwave.WAVE_FORMAT_PCM\nwave.Wave_read(??)\nwave.Wave_write(??)\nwave.big_endian\nwave.builtins(??)\nwave.open(??)\nwave.openfp(??)\nwave.struct(??)\nweakref.CallableProxyType(??)\nweakref.KeyedRef(??)\nweakref.ProxyType(??)\nweakref.ProxyTypes(??)\nweakref.ReferenceType(??)\nweakref.WeakKeyDictionary(??)\nweakref.WeakSet(??)\nweakref.WeakValueDictionary(??)\nweakref.collections(??)\nweakref.getweakrefcount(object) -- return the number of weak references\nweakref.getweakrefs(object) -- return a list of all weak reference objects\nweakref.proxy(object[, callback]) -- create a proxy object that weakly\nweakref.ref(??)\nwebbrowser.BackgroundBrowser(??)\nwebbrowser.BaseBrowser(??)\nwebbrowser.Chrome(??)\nwebbrowser.Chromium(??)\nwebbrowser.Elinks(??)\nwebbrowser.Error(??)\nwebbrowser.Galeon(??)\nwebbrowser.GenericBrowser(??)\nwebbrowser.Grail(??)\nwebbrowser.Konqueror(??)\nwebbrowser.MacOSX(??)\nwebbrowser.MacOSXOSAScript(??)\nwebbrowser.Mozilla(??)\nwebbrowser.Netscape(??)\nwebbrowser.Opera(??)\nwebbrowser.UnixBrowser(??)\nwebbrowser.get(??)\nwebbrowser.io(??)\nwebbrowser.main(??)\nwebbrowser.open(??)\nwebbrowser.open_new(??)\nwebbrowser.open_new_tab(??)\nwebbrowser.os(??)\nwebbrowser.register(??)\nwebbrowser.register_X_browsers(??)\nwebbrowser.shlex(??)\nwebbrowser.stat(??)\nwebbrowser.subprocess(??)\nwebbrowser.sys(??)\nwebbrowser.time(??)\nwsgiref.handlers.BaseCGIHandler(??)\nwsgiref.handlers.BaseHandler(??)\nwsgiref.handlers.CGIHandler(??)\nwsgiref.handlers.FileWrapper(??)\nwsgiref.handlers.Headers(??)\nwsgiref.handlers.IISCGIHandler(??)\nwsgiref.handlers.SimpleHandler(??)\nwsgiref.handlers.format_date_time(??)\nwsgiref.handlers.guess_scheme(??)\nwsgiref.handlers.is_hop_by_hop(??)\nwsgiref.handlers.os(??)\nwsgiref.handlers.read_environ(??)\nwsgiref.handlers.sys(??)\nwsgiref.handlers.time(??)\nwsgiref.headers.Headers(??)\nwsgiref.headers.re(??)\nwsgiref.headers.tspecials(??)\nwsgiref.simple_server.BaseHTTPRequestHandler(??)\nwsgiref.simple_server.HTTPServer(??)\nwsgiref.simple_server.ServerHandler(??)\nwsgiref.simple_server.SimpleHandler(??)\nwsgiref.simple_server.WSGIRequestHandler(??)\nwsgiref.simple_server.WSGIServer(??)\nwsgiref.simple_server.demo_app(??)\nwsgiref.simple_server.make_server(??)\nwsgiref.simple_server.python_implementation(??)\nwsgiref.simple_server.server_version\nwsgiref.simple_server.software_version\nwsgiref.simple_server.sys(??)\nwsgiref.simple_server.sys_version\nwsgiref.simple_server.urllib(??)\nwsgiref.util.FileWrapper(??)\nwsgiref.util.application_uri(??)\nwsgiref.util.guess_scheme(??)\nwsgiref.util.is_hop_by_hop(??)\nwsgiref.util.posixpath(??)\nwsgiref.util.request_uri(??)\nwsgiref.util.setup_testing_defaults(??)\nwsgiref.util.shift_path_info(??)\nwsgiref.validate.ErrorWrapper(??)\nwsgiref.validate.InputWrapper(??)\nwsgiref.validate.IteratorWrapper(??)\nwsgiref.validate.PartialIteratorWrapper(??)\nwsgiref.validate.WSGIWarning(??)\nwsgiref.validate.WriteWrapper(??)\nwsgiref.validate.assert_(??)\nwsgiref.validate.bad_header_value_re(??)\nwsgiref.validate.check_content_type(??)\nwsgiref.validate.check_environ(??)\nwsgiref.validate.check_errors(??)\nwsgiref.validate.check_exc_info(??)\nwsgiref.validate.check_headers(??)\nwsgiref.validate.check_input(??)\nwsgiref.validate.check_iterator(??)\nwsgiref.validate.check_status(??)\nwsgiref.validate.check_string_type(??)\nwsgiref.validate.header_re(??)\nwsgiref.validate.re(??)\nwsgiref.validate.sys(??)\nwsgiref.validate.validator(??)\nwsgiref.validate.warnings(??)\nxdrlib.BytesIO([buffer]) -> object\nxdrlib.ConversionError(??)\nxdrlib.Error(??)\nxdrlib.Packer(??)\nxdrlib.Unpacker(??)\nxdrlib.struct(??)\nxml.dom.DOMException(??)\nxml.dom.DOMSTRING_SIZE_ERR\nxml.dom.DomstringSizeErr(??)\nxml.dom.EMPTY_NAMESPACE(??)\nxml.dom.EMPTY_PREFIX(??)\nxml.dom.HIERARCHY_REQUEST_ERR\nxml.dom.HierarchyRequestErr(??)\nxml.dom.INDEX_SIZE_ERR\nxml.dom.INUSE_ATTRIBUTE_ERR\nxml.dom.INVALID_ACCESS_ERR\nxml.dom.INVALID_CHARACTER_ERR\nxml.dom.INVALID_MODIFICATION_ERR\nxml.dom.INVALID_STATE_ERR\nxml.dom.IndexSizeErr(??)\nxml.dom.InuseAttributeErr(??)\nxml.dom.InvalidAccessErr(??)\nxml.dom.InvalidCharacterErr(??)\nxml.dom.InvalidModificationErr(??)\nxml.dom.InvalidStateErr(??)\nxml.dom.NAMESPACE_ERR\nxml.dom.NOT_FOUND_ERR\nxml.dom.NOT_SUPPORTED_ERR\nxml.dom.NO_DATA_ALLOWED_ERR\nxml.dom.NO_MODIFICATION_ALLOWED_ERR\nxml.dom.NamespaceErr(??)\nxml.dom.NoDataAllowedErr(??)\nxml.dom.NoModificationAllowedErr(??)\nxml.dom.Node(??)\nxml.dom.NodeFilter.NodeFilter(??)\nxml.dom.NotFoundErr(??)\nxml.dom.NotSupportedErr(??)\nxml.dom.SYNTAX_ERR\nxml.dom.SyntaxErr(??)\nxml.dom.UserDataHandler(??)\nxml.dom.VALIDATION_ERR\nxml.dom.ValidationErr(??)\nxml.dom.WRONG_DOCUMENT_ERR\nxml.dom.WrongDocumentErr(??)\nxml.dom.XHTML_NAMESPACE\nxml.dom.XMLNS_NAMESPACE\nxml.dom.XML_NAMESPACE\nxml.dom.domreg(??)\nxml.dom.domreg.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxml.dom.domreg.registerDOMImplementation(name, factory)\nxml.dom.domreg.registered(??)\nxml.dom.domreg.well_known_implementations(??)\nxml.dom.expatbuilder.CDATA_SECTION_NODE\nxml.dom.expatbuilder.DOCUMENT_NODE\nxml.dom.expatbuilder.EMPTY_NAMESPACE(??)\nxml.dom.expatbuilder.EMPTY_PREFIX(??)\nxml.dom.expatbuilder.ElementInfo(??)\nxml.dom.expatbuilder.ExpatBuilder(??)\nxml.dom.expatbuilder.ExpatBuilderNS(??)\nxml.dom.expatbuilder.FILTER_ACCEPT\nxml.dom.expatbuilder.FILTER_INTERRUPT\nxml.dom.expatbuilder.FILTER_REJECT\nxml.dom.expatbuilder.FILTER_SKIP\nxml.dom.expatbuilder.FilterCrutch(??)\nxml.dom.expatbuilder.FilterVisibilityController(??)\nxml.dom.expatbuilder.FragmentBuilder(??)\nxml.dom.expatbuilder.FragmentBuilderNS(??)\nxml.dom.expatbuilder.InternalSubsetExtractor(??)\nxml.dom.expatbuilder.Namespaces(??)\nxml.dom.expatbuilder.Node(??)\nxml.dom.expatbuilder.NodeFilter(??)\nxml.dom.expatbuilder.ParseEscape(??)\nxml.dom.expatbuilder.Rejecter(??)\nxml.dom.expatbuilder.Skipper(??)\nxml.dom.expatbuilder.TEXT_NODE\nxml.dom.expatbuilder.XMLNS_NAMESPACE\nxml.dom.expatbuilder.expat(??)\nxml.dom.expatbuilder.makeBuilder(??)\nxml.dom.expatbuilder.minidom(??)\nxml.dom.expatbuilder.parse(??)\nxml.dom.expatbuilder.parseFragment(??)\nxml.dom.expatbuilder.parseFragmentString(??)\nxml.dom.expatbuilder.parseString(??)\nxml.dom.expatbuilder.theDOMImplementation(??)\nxml.dom.expatbuilder.xmlbuilder(??)\nxml.dom.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxml.dom.minicompat.EmptyNodeList(??)\nxml.dom.minicompat.NodeList(??)\nxml.dom.minicompat.StringTypes(??)\nxml.dom.minicompat.defproperty(??)\nxml.dom.minicompat.xml(??)\nxml.dom.minidom.Attr(??)\nxml.dom.minidom.AttributeList(??)\nxml.dom.minidom.CDATASection(??)\nxml.dom.minidom.CharacterData(??)\nxml.dom.minidom.Childless(??)\nxml.dom.minidom.Comment(??)\nxml.dom.minidom.DOMImplementation(??)\nxml.dom.minidom.DOMImplementationLS(??)\nxml.dom.minidom.Document(??)\nxml.dom.minidom.DocumentFragment(??)\nxml.dom.minidom.DocumentLS(??)\nxml.dom.minidom.DocumentType(??)\nxml.dom.minidom.EMPTY_NAMESPACE(??)\nxml.dom.minidom.EMPTY_PREFIX(??)\nxml.dom.minidom.Element(??)\nxml.dom.minidom.ElementInfo(??)\nxml.dom.minidom.EmptyNodeList(??)\nxml.dom.minidom.Entity(??)\nxml.dom.minidom.Identified(??)\nxml.dom.minidom.NamedNodeMap(??)\nxml.dom.minidom.Node(??)\nxml.dom.minidom.NodeList(??)\nxml.dom.minidom.Notation(??)\nxml.dom.minidom.ProcessingInstruction(??)\nxml.dom.minidom.ReadOnlySequentialNamedNodeMap(??)\nxml.dom.minidom.StringTypes(??)\nxml.dom.minidom.Text(??)\nxml.dom.minidom.TypeInfo(??)\nxml.dom.minidom.XMLNS_NAMESPACE\nxml.dom.minidom.defproperty(??)\nxml.dom.minidom.domreg(??)\nxml.dom.minidom.getDOMImplementation(??)\nxml.dom.minidom.io(??)\nxml.dom.minidom.parse(??)\nxml.dom.minidom.parseString(??)\nxml.dom.minidom.xml(??)\nxml.dom.pulldom.CHARACTERS\nxml.dom.pulldom.COMMENT\nxml.dom.pulldom.DOMEventStream(??)\nxml.dom.pulldom.END_DOCUMENT\nxml.dom.pulldom.END_ELEMENT\nxml.dom.pulldom.ErrorHandler(??)\nxml.dom.pulldom.IGNORABLE_WHITESPACE\nxml.dom.pulldom.PROCESSING_INSTRUCTION\nxml.dom.pulldom.PullDOM(??)\nxml.dom.pulldom.SAX2DOM(??)\nxml.dom.pulldom.START_DOCUMENT\nxml.dom.pulldom.START_ELEMENT\nxml.dom.pulldom.default_bufsize\nxml.dom.pulldom.parse(??)\nxml.dom.pulldom.parseString(??)\nxml.dom.pulldom.xml(??)\nxml.dom.registerDOMImplementation(name, factory)\nxml.dom.xmlbuilder.DOMBuilder(??)\nxml.dom.xmlbuilder.DOMBuilderFilter(??)\nxml.dom.xmlbuilder.DOMEntityResolver(??)\nxml.dom.xmlbuilder.DOMImplementationLS(??)\nxml.dom.xmlbuilder.DOMInputSource(??)\nxml.dom.xmlbuilder.DocumentLS(??)\nxml.dom.xmlbuilder.Options(??)\nxml.dom.xmlbuilder.copy(??)\nxml.dom.xmlbuilder.xml(??)\nxml.etree.ElementInclude.ElementTree(??)\nxml.etree.ElementInclude.FatalIncludeError(??)\nxml.etree.ElementInclude.XINCLUDE\nxml.etree.ElementInclude.XINCLUDE_FALLBACK\nxml.etree.ElementInclude.XINCLUDE_INCLUDE\nxml.etree.ElementInclude.copy(??)\nxml.etree.ElementInclude.default_loader(??)\nxml.etree.ElementInclude.include(??)\nxml.etree.ElementPath.find(??)\nxml.etree.ElementPath.findall(??)\nxml.etree.ElementPath.findtext(??)\nxml.etree.ElementPath.get_parent_map(??)\nxml.etree.ElementPath.iterfind(??)\nxml.etree.ElementPath.ops(??)\nxml.etree.ElementPath.prepare_child(??)\nxml.etree.ElementPath.prepare_descendant(??)\nxml.etree.ElementPath.prepare_parent(??)\nxml.etree.ElementPath.prepare_predicate(??)\nxml.etree.ElementPath.prepare_self(??)\nxml.etree.ElementPath.prepare_star(??)\nxml.etree.ElementPath.re(??)\nxml.etree.ElementPath.xpath_tokenizer(??)\nxml.etree.ElementPath.xpath_tokenizer_re(??)\nxml.etree.ElementTree.Comment(??)\nxml.etree.ElementTree.Element(??)\nxml.etree.ElementTree.ElementPath(??)\nxml.etree.ElementTree.ElementTree(??)\nxml.etree.ElementTree.HTML_EMPTY(??)\nxml.etree.ElementTree.PI(??)\nxml.etree.ElementTree.ParseError(??)\nxml.etree.ElementTree.ProcessingInstruction(??)\nxml.etree.ElementTree.QName(??)\nxml.etree.ElementTree.SubElement(??)\nxml.etree.ElementTree.TreeBuilder(??)\nxml.etree.ElementTree.VERSION\nxml.etree.ElementTree.XML(??)\nxml.etree.ElementTree.XMLID(??)\nxml.etree.ElementTree.XMLParser(??)\nxml.etree.ElementTree.XMLTreeBuilder(??)\nxml.etree.ElementTree.contextlib(??)\nxml.etree.ElementTree.dump(??)\nxml.etree.ElementTree.fromstring(??)\nxml.etree.ElementTree.fromstringlist(??)\nxml.etree.ElementTree.io(??)\nxml.etree.ElementTree.iselement(??)\nxml.etree.ElementTree.iterparse(??)\nxml.etree.ElementTree.parse(??)\nxml.etree.ElementTree.re(??)\nxml.etree.ElementTree.register_namespace(??)\nxml.etree.ElementTree.sys(??)\nxml.etree.ElementTree.tostring(??)\nxml.etree.ElementTree.tostringlist(??)\nxml.etree.ElementTree.warnings(??)\nxml.etree.cElementTree.Comment(??)\nxml.etree.cElementTree.Element(??)\nxml.etree.cElementTree.ElementTree(??)\nxml.etree.cElementTree.PI(??)\nxml.etree.cElementTree.ParseError(??)\nxml.etree.cElementTree.ProcessingInstruction(??)\nxml.etree.cElementTree.QName(??)\nxml.etree.cElementTree.SubElement(??)\nxml.etree.cElementTree.TreeBuilder(??)\nxml.etree.cElementTree.VERSION\nxml.etree.cElementTree.XML(??)\nxml.etree.cElementTree.XMLID(??)\nxml.etree.cElementTree.XMLParser(??)\nxml.etree.cElementTree.XMLTreeBuilder(??)\nxml.etree.cElementTree.dump(??)\nxml.etree.cElementTree.fromstring(??)\nxml.etree.cElementTree.fromstringlist(??)\nxml.etree.cElementTree.iselement(??)\nxml.etree.cElementTree.iterparse(??)\nxml.etree.cElementTree.parse(??)\nxml.etree.cElementTree.register_namespace(??)\nxml.etree.cElementTree.tostring(??)\nxml.etree.cElementTree.tostringlist(??)\nxml.parsers(??)\nxml.parsers.expat(??)\nxml.parsers.expat.EXPAT_VERSION\nxml.parsers.expat.ErrorString(errno) -> string\nxml.parsers.expat.ExpatError(??)\nxml.parsers.expat.ParserCreate([encoding[, namespace_separator]]) -> parser\nxml.parsers.expat.XMLParserType(??)\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_ALWAYS\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_NEVER\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE\nxml.parsers.expat.error(??)\nxml.parsers.expat.errors(??)\nxml.parsers.expat.expat_CAPI(??)\nxml.parsers.expat.features(??)\nxml.parsers.expat.model(??)\nxml.parsers.expat.native_encoding\nxml.parsers.expat.sys(??)\nxml.parsers.expat.version_info(??)\nxml.sax.ContentHandler(??)\nxml.sax.ErrorHandler(??)\nxml.sax.InputSource(??)\nxml.sax.SAXException(??)\nxml.sax.SAXNotRecognizedException(??)\nxml.sax.SAXNotSupportedException(??)\nxml.sax.SAXParseException(??)\nxml.sax.SAXReaderNotAvailable(??)\nxml.sax.default_parser_list(??)\nxml.sax.expatreader.AttributesImpl(??)\nxml.sax.expatreader.AttributesNSImpl(??)\nxml.sax.expatreader.ExpatLocator(??)\nxml.sax.expatreader.ExpatParser(??)\nxml.sax.expatreader.SAXException(??)\nxml.sax.expatreader.SAXNotRecognizedException(??)\nxml.sax.expatreader.SAXNotSupportedException(??)\nxml.sax.expatreader.SAXParseException(??)\nxml.sax.expatreader.SAXReaderNotAvailable(??)\nxml.sax.expatreader.create_parser(??)\nxml.sax.expatreader.expat(??)\nxml.sax.expatreader.feature_external_ges\nxml.sax.expatreader.feature_external_pes\nxml.sax.expatreader.feature_namespace_prefixes\nxml.sax.expatreader.feature_namespaces\nxml.sax.expatreader.feature_string_interning\nxml.sax.expatreader.feature_validation\nxml.sax.expatreader.handler(??)\nxml.sax.expatreader.property_interning_dict\nxml.sax.expatreader.property_xml_string\nxml.sax.expatreader.saxutils(??)\nxml.sax.expatreader.version\nxml.sax.expatreader.xmlreader(??)\nxml.sax.handler(??)\nxml.sax.handler.ContentHandler(??)\nxml.sax.handler.DTDHandler(??)\nxml.sax.handler.EntityResolver(??)\nxml.sax.handler.ErrorHandler(??)\nxml.sax.handler.all_features(??)\nxml.sax.handler.all_properties(??)\nxml.sax.handler.feature_external_ges\nxml.sax.handler.feature_external_pes\nxml.sax.handler.feature_namespace_prefixes\nxml.sax.handler.feature_namespaces\nxml.sax.handler.feature_string_interning\nxml.sax.handler.feature_validation\nxml.sax.handler.property_declaration_handler\nxml.sax.handler.property_dom_node\nxml.sax.handler.property_encoding\nxml.sax.handler.property_interning_dict\nxml.sax.handler.property_lexical_handler\nxml.sax.handler.property_xml_string\nxml.sax.handler.version\nxml.sax.make_parser(??)\nxml.sax.parse(??)\nxml.sax.parseString(??)\nxml.sax.saxutils.XMLFilterBase(??)\nxml.sax.saxutils.XMLGenerator(??)\nxml.sax.saxutils.escape(??)\nxml.sax.saxutils.handler(??)\nxml.sax.saxutils.os(??)\nxml.sax.saxutils.prepare_input_source(??)\nxml.sax.saxutils.quoteattr(??)\nxml.sax.saxutils.unescape(??)\nxml.sax.saxutils.urllib(??)\nxml.sax.saxutils.xmlreader(??)\nxml.sax.xmlreader(??)\nxml.sax.xmlreader.AttributesImpl(??)\nxml.sax.xmlreader.AttributesNSImpl(??)\nxml.sax.xmlreader.IncrementalParser(??)\nxml.sax.xmlreader.InputSource(??)\nxml.sax.xmlreader.Locator(??)\nxml.sax.xmlreader.SAXNotRecognizedException(??)\nxml.sax.xmlreader.SAXNotSupportedException(??)\nxml.sax.xmlreader.XMLReader(??)\nxml.sax.xmlreader.handler(??)\nxmlrpc.client(??)\nxmlrpc.client.APPLICATION_ERROR\nxmlrpc.client.Binary(??)\nxmlrpc.client.Boolean(??)\nxmlrpc.client.BytesIO([buffer]) -> object\nxmlrpc.client.DateTime(??)\nxmlrpc.client.Error(??)\nxmlrpc.client.ExpatParser(??)\nxmlrpc.client.FastMarshaller(??)\nxmlrpc.client.FastParser(??)\nxmlrpc.client.FastUnmarshaller(??)\nxmlrpc.client.Fault(??)\nxmlrpc.client.GzipDecodedResponse(??)\nxmlrpc.client.INTERNAL_ERROR\nxmlrpc.client.INVALID_ENCODING_CHAR\nxmlrpc.client.INVALID_METHOD_PARAMS\nxmlrpc.client.INVALID_XMLRPC\nxmlrpc.client.MAXINT\nxmlrpc.client.METHOD_NOT_FOUND\nxmlrpc.client.MININT\nxmlrpc.client.Marshaller(??)\nxmlrpc.client.MultiCall(??)\nxmlrpc.client.MultiCallIterator(??)\nxmlrpc.client.NOT_WELLFORMED_ERROR\nxmlrpc.client.PARSE_ERROR\nxmlrpc.client.ProtocolError(??)\nxmlrpc.client.ResponseError(??)\nxmlrpc.client.SERVER_ERROR\nxmlrpc.client.SYSTEM_ERROR\nxmlrpc.client.SafeTransport(??)\nxmlrpc.client.Server(??)\nxmlrpc.client.ServerProxy(??)\nxmlrpc.client.TRANSPORT_ERROR\nxmlrpc.client.Transport(??)\nxmlrpc.client.UNSUPPORTED_ENCODING\nxmlrpc.client.Unmarshaller(??)\nxmlrpc.client.WRAPPERS(??)\nxmlrpc.client.base64(??)\nxmlrpc.client.boolean(??)\nxmlrpc.client.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\nxmlrpc.client.dumps(??)\nxmlrpc.client.errno(??)\nxmlrpc.client.escape(??)\nxmlrpc.client.expat(??)\nxmlrpc.client.getparser() -> parser, unmarshaller\nxmlrpc.client.gzip(??)\nxmlrpc.client.gzip_decode(??)\nxmlrpc.client.gzip_encode(??)\nxmlrpc.client.http(??)\nxmlrpc.client.loads(??)\nxmlrpc.client.socket(??)\nxmlrpc.client.sys(??)\nxmlrpc.client.time(??)\nxmlrpc.client.urllib(??)\nxmlrpc.server.BaseHTTPRequestHandler(??)\nxmlrpc.server.CGIXMLRPCRequestHandler(??)\nxmlrpc.server.DocCGIXMLRPCRequestHandler(??)\nxmlrpc.server.DocXMLRPCRequestHandler(??)\nxmlrpc.server.DocXMLRPCServer(??)\nxmlrpc.server.Fault(??)\nxmlrpc.server.MultiPathXMLRPCServer(??)\nxmlrpc.server.ServerHTMLDoc(??)\nxmlrpc.server.SimpleXMLRPCDispatcher(??)\nxmlrpc.server.SimpleXMLRPCRequestHandler(??)\nxmlrpc.server.SimpleXMLRPCServer(??)\nxmlrpc.server.XMLRPCDocGenerator(??)\nxmlrpc.server.dumps(??)\nxmlrpc.server.fcntl(??)\nxmlrpc.server.gzip_decode(??)\nxmlrpc.server.gzip_encode(??)\nxmlrpc.server.http(??)\nxmlrpc.server.inspect(??)\nxmlrpc.server.list_public_methods(??)\nxmlrpc.server.loads(??)\nxmlrpc.server.os(??)\nxmlrpc.server.pydoc(??)\nxmlrpc.server.re(??)\nxmlrpc.server.resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d\nxmlrpc.server.socketserver(??)\nxmlrpc.server.sys(??)\nxmlrpc.server.traceback(??)\nzip(iter1 [,iter2 [...]]) --> zip object\nzipfile.BZIP2_VERSION\nzipfile.BadZipFile(??)\nzipfile.BadZipfile(??)\nzipfile.DEFAULT_VERSION\nzipfile.LZMACompressor(??)\nzipfile.LZMADecompressor(??)\nzipfile.LZMA_VERSION\nzipfile.LargeZipFile(??)\nzipfile.MAX_EXTRACT_VERSION\nzipfile.PyZipFile(??)\nzipfile.ZIP64_LIMIT\nzipfile.ZIP64_VERSION\nzipfile.ZIP_BZIP2\nzipfile.ZIP_DEFLATED\nzipfile.ZIP_FILECOUNT_LIMIT\nzipfile.ZIP_LZMA\nzipfile.ZIP_MAX_COMMENT\nzipfile.ZIP_STORED\nzipfile.ZipExtFile(??)\nzipfile.ZipFile(??)\nzipfile.ZipInfo(??)\nzipfile.binascii(??)\nzipfile.bz2(??)\nzipfile.compressor_names(??)\nzipfile.crc32(string[, start]) -- Compute a CRC-32 checksum of string.\nzipfile.error(??)\nzipfile.imp(??)\nzipfile.io(??)\nzipfile.is_zipfile(??)\nzipfile.lzma(??)\nzipfile.main(??)\nzipfile.os(??)\nzipfile.re(??)\nzipfile.shutil(??)\nzipfile.sizeCentralDir\nzipfile.sizeEndCentDir\nzipfile.sizeEndCentDir64\nzipfile.sizeEndCentDir64Locator\nzipfile.sizeFileHeader\nzipfile.stat(??)\nzipfile.stringCentralDir\nzipfile.stringEndArchive\nzipfile.stringEndArchive64\nzipfile.stringEndArchive64Locator\nzipfile.stringFileHeader\nzipfile.struct(??)\nzipfile.structCentralDir\nzipfile.structEndArchive\nzipfile.structEndArchive64\nzipfile.structEndArchive64Locator\nzipfile.structFileHeader\nzipfile.sys(??)\nzipfile.time(??)\nzipfile.zlib(??)\nzipimport.ZipImportError(??)\nzipimport.zipimporter(archivepath) -> zipimporter object\nzlib.DEFLATED\nzlib.DEF_MEM_LEVEL\nzlib.MAX_WBITS\nzlib.ZLIB_RUNTIME_VERSION\nzlib.ZLIB_VERSION\nzlib.Z_BEST_COMPRESSION\nzlib.Z_BEST_SPEED\nzlib.Z_DEFAULT_COMPRESSION\nzlib.Z_DEFAULT_STRATEGY\nzlib.Z_FILTERED\nzlib.Z_FINISH\nzlib.Z_FULL_FLUSH\nzlib.Z_HUFFMAN_ONLY\nzlib.Z_NO_FLUSH\nzlib.Z_SYNC_FLUSH\nzlib.adler32(string[, start]) -- Compute an Adler-32 checksum of string.\nzlib.compress(string[, level]) -- Returned compressed string.\nzlib.compressobj(??)\nzlib.crc32(string[, start]) -- Compute a CRC-32 checksum of string.\nzlib.decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\nzlib.decompressobj([wbits[, zdict]]) -- Return a decompressor object.\nzlib.error(??)\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/qsci/api/python/Python-3.4.api",
    "content": "ArithmeticError(??)\nAssertionError(??)\nAttributeError(??)\nBaseException(??)\nBlockingIOError(??)\nBrokenPipeError(??)\nBufferError(??)\nBytesWarning(??)\nChildProcessError(??)\nConnectionAbortedError(??)\nConnectionError(??)\nConnectionRefusedError(??)\nConnectionResetError(??)\nDeprecationWarning(??)\nEOFError(??)\nEllipsis(??)\nEnvironmentError(??)\nException(??)\nFalse(??)\nFileExistsError(??)\nFileNotFoundError(??)\nFloatingPointError(??)\nFutureWarning(??)\nGeneratorExit(??)\nIN.AF_APPLETALK\nIN.AF_ATM\nIN.AF_CCITT\nIN.AF_CHAOS\nIN.AF_CNT\nIN.AF_COIP\nIN.AF_DATAKIT\nIN.AF_DECnet\nIN.AF_DLI\nIN.AF_E164\nIN.AF_ECMA\nIN.AF_HYLINK\nIN.AF_IMPLINK\nIN.AF_INET\nIN.AF_INET6\nIN.AF_IPX\nIN.AF_ISDN\nIN.AF_ISO\nIN.AF_LAT\nIN.AF_LINK\nIN.AF_LOCAL\nIN.AF_MAX\nIN.AF_NATM\nIN.AF_NDRV\nIN.AF_NETBIOS\nIN.AF_NETGRAPH\nIN.AF_NS\nIN.AF_OSI\nIN.AF_PPP\nIN.AF_PUP\nIN.AF_RESERVED_36\nIN.AF_ROUTE\nIN.AF_SIP\nIN.AF_SNA\nIN.AF_SYSTEM\nIN.AF_UNIX\nIN.AF_UNSPEC\nIN.CMGROUP_MAX\nIN.HTONL(??)\nIN.HTONS(??)\nIN.ICMP6_FILTER\nIN.IN6_IS_ADDR_LINKLOCAL(??)\nIN.IN6_IS_ADDR_LOOPBACK(??)\nIN.IN6_IS_ADDR_MC_GLOBAL(??)\nIN.IN6_IS_ADDR_MC_LINKLOCAL(??)\nIN.IN6_IS_ADDR_MC_NODELOCAL(??)\nIN.IN6_IS_ADDR_MC_ORGLOCAL(??)\nIN.IN6_IS_ADDR_MC_SITELOCAL(??)\nIN.IN6_IS_ADDR_SITELOCAL(??)\nIN.IN6_IS_ADDR_UNSPECIFIED(??)\nIN.IN6_IS_ADDR_V4COMPAT(??)\nIN.IN6_IS_ADDR_V4MAPPED(??)\nIN.INADDR_NONE\nIN.INET6_ADDRSTRLEN\nIN.INET_ADDRSTRLEN\nIN.INT16_C(??)\nIN.INT16_MAX\nIN.INT16_MIN\nIN.INT32_C(??)\nIN.INT32_MAX\nIN.INT32_MIN\nIN.INT8_C(??)\nIN.INT8_MAX\nIN.INT8_MIN\nIN.INTPTR_MAX\nIN.INTPTR_MIN\nIN.INT_FAST16_MAX\nIN.INT_FAST16_MIN\nIN.INT_FAST32_MAX\nIN.INT_FAST32_MIN\nIN.INT_FAST8_MAX\nIN.INT_FAST8_MIN\nIN.INT_LEAST16_MAX\nIN.INT_LEAST16_MIN\nIN.INT_LEAST32_MAX\nIN.INT_LEAST32_MIN\nIN.INT_LEAST8_MAX\nIN.INT_LEAST8_MIN\nIN.IN_BADCLASS(??)\nIN.IN_CLASSA(??)\nIN.IN_CLASSA_HOST\nIN.IN_CLASSA_MAX\nIN.IN_CLASSA_NET\nIN.IN_CLASSA_NSHIFT\nIN.IN_CLASSB(??)\nIN.IN_CLASSB_HOST\nIN.IN_CLASSB_MAX\nIN.IN_CLASSB_NET\nIN.IN_CLASSB_NSHIFT\nIN.IN_CLASSC(??)\nIN.IN_CLASSC_HOST\nIN.IN_CLASSC_NET\nIN.IN_CLASSC_NSHIFT\nIN.IN_CLASSD(??)\nIN.IN_CLASSD_HOST\nIN.IN_CLASSD_NET\nIN.IN_CLASSD_NSHIFT\nIN.IN_EXPERIMENTAL(??)\nIN.IN_LINKLOCAL(??)\nIN.IN_LOOPBACKNET\nIN.IN_MULTICAST(??)\nIN.IPCTL_ACCEPTSOURCEROUTE\nIN.IPCTL_DEFMTU\nIN.IPCTL_DEFTTL\nIN.IPCTL_DIRECTEDBROADCAST\nIN.IPCTL_FASTFORWARDING\nIN.IPCTL_FORWARDING\nIN.IPCTL_GIF_TTL\nIN.IPCTL_INTRQDROPS\nIN.IPCTL_INTRQMAXLEN\nIN.IPCTL_KEEPFAITH\nIN.IPCTL_MAXID\nIN.IPCTL_RTEXPIRE\nIN.IPCTL_RTMAXCACHE\nIN.IPCTL_RTMINEXPIRE\nIN.IPCTL_SENDREDIRECTS\nIN.IPCTL_SOURCEROUTE\nIN.IPCTL_STATS\nIN.IPPORT_HIFIRSTAUTO\nIN.IPPORT_HILASTAUTO\nIN.IPPORT_RESERVED\nIN.IPPORT_RESERVEDSTART\nIN.IPPORT_USERRESERVED\nIN.IPPROTO_3PC\nIN.IPPROTO_ADFS\nIN.IPPROTO_AH\nIN.IPPROTO_AHIP\nIN.IPPROTO_APES\nIN.IPPROTO_ARGUS\nIN.IPPROTO_AX25\nIN.IPPROTO_BHA\nIN.IPPROTO_BLT\nIN.IPPROTO_BRSATMON\nIN.IPPROTO_CFTP\nIN.IPPROTO_CHAOS\nIN.IPPROTO_CMTP\nIN.IPPROTO_CPHB\nIN.IPPROTO_CPNX\nIN.IPPROTO_DDP\nIN.IPPROTO_DGP\nIN.IPPROTO_DIVERT\nIN.IPPROTO_DONE\nIN.IPPROTO_DSTOPTS\nIN.IPPROTO_EGP\nIN.IPPROTO_EMCON\nIN.IPPROTO_ENCAP\nIN.IPPROTO_EON\nIN.IPPROTO_ESP\nIN.IPPROTO_ETHERIP\nIN.IPPROTO_FRAGMENT\nIN.IPPROTO_GGP\nIN.IPPROTO_GMTP\nIN.IPPROTO_GRE\nIN.IPPROTO_HELLO\nIN.IPPROTO_HMP\nIN.IPPROTO_HOPOPTS\nIN.IPPROTO_ICMP\nIN.IPPROTO_ICMPV6\nIN.IPPROTO_IDP\nIN.IPPROTO_IDPR\nIN.IPPROTO_IDRP\nIN.IPPROTO_IGMP\nIN.IPPROTO_IGP\nIN.IPPROTO_IGRP\nIN.IPPROTO_IL\nIN.IPPROTO_INLSP\nIN.IPPROTO_INP\nIN.IPPROTO_IP\nIN.IPPROTO_IPCOMP\nIN.IPPROTO_IPCV\nIN.IPPROTO_IPEIP\nIN.IPPROTO_IPIP\nIN.IPPROTO_IPPC\nIN.IPPROTO_IPV4\nIN.IPPROTO_IPV6\nIN.IPPROTO_IRTP\nIN.IPPROTO_KRYPTOLAN\nIN.IPPROTO_LARP\nIN.IPPROTO_LEAF1\nIN.IPPROTO_LEAF2\nIN.IPPROTO_MAX\nIN.IPPROTO_MAXID\nIN.IPPROTO_MEAS\nIN.IPPROTO_MHRP\nIN.IPPROTO_MICP\nIN.IPPROTO_MTP\nIN.IPPROTO_MUX\nIN.IPPROTO_ND\nIN.IPPROTO_NHRP\nIN.IPPROTO_NONE\nIN.IPPROTO_NSP\nIN.IPPROTO_NVPII\nIN.IPPROTO_OSPFIGP\nIN.IPPROTO_PGM\nIN.IPPROTO_PIGP\nIN.IPPROTO_PIM\nIN.IPPROTO_PRM\nIN.IPPROTO_PUP\nIN.IPPROTO_PVP\nIN.IPPROTO_RAW\nIN.IPPROTO_RCCMON\nIN.IPPROTO_RDP\nIN.IPPROTO_ROUTING\nIN.IPPROTO_RSVP\nIN.IPPROTO_RVD\nIN.IPPROTO_SATEXPAK\nIN.IPPROTO_SATMON\nIN.IPPROTO_SCCSP\nIN.IPPROTO_SDRP\nIN.IPPROTO_SEP\nIN.IPPROTO_SRPC\nIN.IPPROTO_ST\nIN.IPPROTO_SVMTP\nIN.IPPROTO_SWIPE\nIN.IPPROTO_TCF\nIN.IPPROTO_TCP\nIN.IPPROTO_TP\nIN.IPPROTO_TPXX\nIN.IPPROTO_TRUNK1\nIN.IPPROTO_TRUNK2\nIN.IPPROTO_TTP\nIN.IPPROTO_UDP\nIN.IPPROTO_VINES\nIN.IPPROTO_VISA\nIN.IPPROTO_VMTP\nIN.IPPROTO_WBEXPAK\nIN.IPPROTO_WBMON\nIN.IPPROTO_WSN\nIN.IPPROTO_XNET\nIN.IPPROTO_XTP\nIN.IPV6CTL_ACCEPT_RTADV\nIN.IPV6CTL_AUTO_FLOWLABEL\nIN.IPV6CTL_AUTO_LINKLOCAL\nIN.IPV6CTL_DAD_COUNT\nIN.IPV6CTL_DEFHLIM\nIN.IPV6CTL_DEFMCASTHLIM\nIN.IPV6CTL_DEFMTU\nIN.IPV6CTL_FORWARDING\nIN.IPV6CTL_FORWSRCRT\nIN.IPV6CTL_GIF_HLIM\nIN.IPV6CTL_HDRNESTLIMIT\nIN.IPV6CTL_KAME_VERSION\nIN.IPV6CTL_KEEPFAITH\nIN.IPV6CTL_LOG_INTERVAL\nIN.IPV6CTL_MAPPED_ADDR\nIN.IPV6CTL_MAXFRAGPACKETS\nIN.IPV6CTL_MAXFRAGS\nIN.IPV6CTL_MAXID\nIN.IPV6CTL_MRTPROTO\nIN.IPV6CTL_MRTSTATS\nIN.IPV6CTL_RIP6STATS\nIN.IPV6CTL_RR_PRUNE\nIN.IPV6CTL_RTEXPIRE\nIN.IPV6CTL_RTMAXCACHE\nIN.IPV6CTL_RTMINEXPIRE\nIN.IPV6CTL_SENDREDIRECTS\nIN.IPV6CTL_SOURCECHECK\nIN.IPV6CTL_SOURCECHECK_LOGINT\nIN.IPV6CTL_STATS\nIN.IPV6CTL_TEMPPLTIME\nIN.IPV6CTL_TEMPVLTIME\nIN.IPV6CTL_USETEMPADDR\nIN.IPV6CTL_USE_DEPRECATED\nIN.IPV6CTL_V6ONLY\nIN.IPV6PORT_ANONMAX\nIN.IPV6PORT_ANONMIN\nIN.IPV6PORT_RESERVED\nIN.IPV6PORT_RESERVEDMAX\nIN.IPV6PORT_RESERVEDMIN\nIN.IPV6PROTO_MAXID\nIN.IPV6_BINDV6ONLY\nIN.IPV6_CHECKSUM\nIN.IPV6_DEFAULT_MULTICAST_HOPS\nIN.IPV6_DEFAULT_MULTICAST_LOOP\nIN.IPV6_DSTOPTS\nIN.IPV6_FAITH\nIN.IPV6_FW_ADD\nIN.IPV6_FW_DEL\nIN.IPV6_FW_FLUSH\nIN.IPV6_FW_GET\nIN.IPV6_FW_ZERO\nIN.IPV6_HOPLIMIT\nIN.IPV6_HOPOPTS\nIN.IPV6_IPSEC_POLICY\nIN.IPV6_JOIN_GROUP\nIN.IPV6_LEAVE_GROUP\nIN.IPV6_MULTICAST_HOPS\nIN.IPV6_MULTICAST_IF\nIN.IPV6_MULTICAST_LOOP\nIN.IPV6_NEXTHOP\nIN.IPV6_OPTIONS\nIN.IPV6_PKTINFO\nIN.IPV6_PKTOPTIONS\nIN.IPV6_PORTRANGE\nIN.IPV6_PORTRANGE_DEFAULT\nIN.IPV6_PORTRANGE_HIGH\nIN.IPV6_PORTRANGE_LOW\nIN.IPV6_RECVDSTADDR\nIN.IPV6_RECVOPTS\nIN.IPV6_RECVRETOPTS\nIN.IPV6_RETOPTS\nIN.IPV6_RTHDR\nIN.IPV6_RTHDR_LOOSE\nIN.IPV6_RTHDR_STRICT\nIN.IPV6_RTHDR_TYPE_0\nIN.IPV6_SOCKOPT_RESERVED1\nIN.IPV6_UNICAST_HOPS\nIN.IPV6_V6ONLY\nIN.IP_ADD_MEMBERSHIP\nIN.IP_DEFAULT_MULTICAST_LOOP\nIN.IP_DEFAULT_MULTICAST_TTL\nIN.IP_DROP_MEMBERSHIP\nIN.IP_DUMMYNET_CONFIGURE\nIN.IP_DUMMYNET_DEL\nIN.IP_DUMMYNET_FLUSH\nIN.IP_DUMMYNET_GET\nIN.IP_FAITH\nIN.IP_FORCE_OUT_IFP\nIN.IP_FW_ADD\nIN.IP_FW_DEL\nIN.IP_FW_FLUSH\nIN.IP_FW_GET\nIN.IP_FW_RESETLOG\nIN.IP_FW_ZERO\nIN.IP_HDRINCL\nIN.IP_IPSEC_POLICY\nIN.IP_MAX_MEMBERSHIPS\nIN.IP_MULTICAST_IF\nIN.IP_MULTICAST_LOOP\nIN.IP_MULTICAST_TTL\nIN.IP_MULTICAST_VIF\nIN.IP_NAT__XXX\nIN.IP_OLD_FW_ADD\nIN.IP_OLD_FW_DEL\nIN.IP_OLD_FW_FLUSH\nIN.IP_OLD_FW_GET\nIN.IP_OLD_FW_RESETLOG\nIN.IP_OLD_FW_ZERO\nIN.IP_OPTIONS\nIN.IP_PORTRANGE\nIN.IP_PORTRANGE_DEFAULT\nIN.IP_PORTRANGE_HIGH\nIN.IP_PORTRANGE_LOW\nIN.IP_RECVDSTADDR\nIN.IP_RECVIF\nIN.IP_RECVOPTS\nIN.IP_RECVRETOPTS\nIN.IP_RECVTTL\nIN.IP_RETOPTS\nIN.IP_RSVP_OFF\nIN.IP_RSVP_ON\nIN.IP_RSVP_VIF_OFF\nIN.IP_RSVP_VIF_ON\nIN.IP_STRIPHDR\nIN.IP_TOS\nIN.IP_TRAFFIC_MGT_BACKGROUND\nIN.IP_TTL\nIN.MSG_CTRUNC\nIN.MSG_DONTROUTE\nIN.MSG_DONTWAIT\nIN.MSG_EOF\nIN.MSG_EOR\nIN.MSG_FLUSH\nIN.MSG_HAVEMORE\nIN.MSG_HOLD\nIN.MSG_NEEDSA\nIN.MSG_OOB\nIN.MSG_PEEK\nIN.MSG_RCVMORE\nIN.MSG_SEND\nIN.MSG_TRUNC\nIN.MSG_WAITALL\nIN.MSG_WAITSTREAM\nIN.NET_MAXID\nIN.NET_RT_DUMP\nIN.NET_RT_DUMP2\nIN.NET_RT_FLAGS\nIN.NET_RT_IFLIST\nIN.NET_RT_IFLIST2\nIN.NET_RT_MAXID\nIN.NET_RT_STAT\nIN.NET_RT_TRASH\nIN.NTOHL(??)\nIN.NTOHS(??)\nIN.PF_APPLETALK\nIN.PF_ATM\nIN.PF_CCITT\nIN.PF_CHAOS\nIN.PF_CNT\nIN.PF_COIP\nIN.PF_DATAKIT\nIN.PF_DECnet\nIN.PF_DLI\nIN.PF_ECMA\nIN.PF_HYLINK\nIN.PF_IMPLINK\nIN.PF_INET\nIN.PF_INET6\nIN.PF_IPX\nIN.PF_ISDN\nIN.PF_ISO\nIN.PF_KEY\nIN.PF_LAT\nIN.PF_LINK\nIN.PF_LOCAL\nIN.PF_MAX\nIN.PF_NATM\nIN.PF_NDRV\nIN.PF_NETBIOS\nIN.PF_NETGRAPH\nIN.PF_NS\nIN.PF_OSI\nIN.PF_PIP\nIN.PF_PPP\nIN.PF_PUP\nIN.PF_RESERVED_36\nIN.PF_ROUTE\nIN.PF_RTIP\nIN.PF_SIP\nIN.PF_SNA\nIN.PF_SYSTEM\nIN.PF_UNIX\nIN.PF_UNSPEC\nIN.PF_XTP\nIN.PTRDIFF_MAX\nIN.PTRDIFF_MIN\nIN.SCM_CREDS\nIN.SCM_RIGHTS\nIN.SCM_TIMESTAMP\nIN.SHUT_RD\nIN.SHUT_RDWR\nIN.SHUT_WR\nIN.SIG_ATOMIC_MAX\nIN.SIG_ATOMIC_MIN\nIN.SOCK_DGRAM\nIN.SOCK_MAXADDRLEN\nIN.SOCK_RAW\nIN.SOCK_RDM\nIN.SOCK_SEQPACKET\nIN.SOCK_STREAM\nIN.SOL_SOCKET\nIN.SOMAXCONN\nIN.SO_ACCEPTCONN\nIN.SO_ACCEPTFILTER\nIN.SO_BROADCAST\nIN.SO_DEBUG\nIN.SO_DONTROUTE\nIN.SO_DONTTRUNC\nIN.SO_ERROR\nIN.SO_KEEPALIVE\nIN.SO_LABEL\nIN.SO_LINGER\nIN.SO_LINGER_SEC\nIN.SO_NKE\nIN.SO_NOADDRERR\nIN.SO_NOSIGPIPE\nIN.SO_NOTIFYCONFLICT\nIN.SO_NREAD\nIN.SO_NWRITE\nIN.SO_OOBINLINE\nIN.SO_PEERLABEL\nIN.SO_RCVBUF\nIN.SO_RCVLOWAT\nIN.SO_RCVTIMEO\nIN.SO_RESTRICTIONS\nIN.SO_RESTRICT_DENYIN\nIN.SO_RESTRICT_DENYOUT\nIN.SO_RESTRICT_DENYSET\nIN.SO_REUSEADDR\nIN.SO_REUSEPORT\nIN.SO_REUSESHAREUID\nIN.SO_SNDBUF\nIN.SO_SNDLOWAT\nIN.SO_SNDTIMEO\nIN.SO_TIMESTAMP\nIN.SO_TYPE\nIN.SO_USELOOPBACK\nIN.SO_WANTMORE\nIN.SO_WANTOOBFLAG\nIN.TRAFFIC_MGT_SO_BACKGROUND\nIN.TRAFFIC_MGT_SO_BG_SUPPRESSED\nIN.UINT16_MAX\nIN.UINT8_MAX\nIN.UINT_FAST16_MAX\nIN.UINT_FAST8_MAX\nIN.UINT_LEAST16_MAX\nIN.UINT_LEAST8_MAX\nIN.WCHAR_MAX\nIN.WCHAR_MIN\nIN.WINT_MAX\nIN.WINT_MIN\nIN.htonl(??)\nIN.htons(??)\nIN.ntohl(??)\nIN.ntohs(??)\nIN.pseudo_AF_HDRCMPLT\nIN.pseudo_AF_KEY\nIN.pseudo_AF_PIP\nIN.pseudo_AF_RTIP\nIN.pseudo_AF_XTP\nIOError(??)\nImportError(??)\nImportWarning(??)\nIndentationError(??)\nIndexError(??)\nInterruptedError(??)\nIsADirectoryError(??)\nKeyError(??)\nKeyboardInterrupt(??)\nLookupError(??)\nMemoryError(??)\nNameError(??)\nNone(??)\nNotADirectoryError(??)\nNotImplemented(??)\nNotImplementedError(??)\nOSError(??)\nOverflowError(??)\nPendingDeprecationWarning(??)\nPermissionError(??)\nProcessLookupError(??)\nReferenceError(??)\nResourceWarning(??)\nRuntimeError(??)\nRuntimeWarning(??)\nStopIteration(??)\nSyntaxError(??)\nSyntaxWarning(??)\nSystemError(??)\nSystemExit(??)\nTabError(??)\nTimeoutError(??)\nTrue(??)\nTypeError(??)\nUnboundLocalError(??)\nUnicodeDecodeError(??)\nUnicodeEncodeError(??)\nUnicodeError(??)\nUnicodeTranslateError(??)\nUnicodeWarning(??)\nUserWarning(??)\nValueError(??)\nWarning(??)\nZeroDivisionError(??)\nabc.ABC(??)\nabc.ABCMeta(??)\nabc.WeakSet(??)\nabc.abstractclassmethod(??)\nabc.abstractmethod(??)\nabc.abstractproperty(??)\nabc.abstractstaticmethod(??)\nabc.get_cache_token(??)\nabs(number) -> number\naifc.Aifc_read(??)\naifc.Aifc_write(??)\naifc.Chunk(??)\naifc.Error(??)\naifc.builtins(??)\naifc.namedtuple(??)\naifc.open(??)\naifc.openfp(??)\naifc.struct(??)\naifc.warnings(??)\nall(iterable) -> bool\nany(iterable) -> bool\nargparse.Action(??)\nargparse.ArgumentDefaultsHelpFormatter(??)\nargparse.ArgumentError(??)\nargparse.ArgumentParser(??)\nargparse.ArgumentTypeError(??)\nargparse.FileType(??)\nargparse.HelpFormatter(??)\nargparse.MetavarTypeHelpFormatter(??)\nargparse.Namespace(??)\nargparse.ONE_OR_MORE\nargparse.OPTIONAL\nargparse.PARSER\nargparse.REMAINDER\nargparse.RawDescriptionHelpFormatter(??)\nargparse.RawTextHelpFormatter(??)\nargparse.SUPPRESS\nargparse.ZERO_OR_MORE\nargparse.ngettext(??)\narray.ArrayType(??)\narray.array(typecode [, initializer]) -> array\narray.typecodes\nascii(object) -> string\nast.AST(??)\nast.Add(??)\nast.And(??)\nast.Assert(??)\nast.Assign(??)\nast.Attribute(??)\nast.AugAssign(??)\nast.AugLoad(??)\nast.AugStore(??)\nast.BinOp(??)\nast.BitAnd(??)\nast.BitOr(??)\nast.BitXor(??)\nast.BoolOp(??)\nast.Break(??)\nast.Bytes(??)\nast.Call(??)\nast.ClassDef(??)\nast.Compare(??)\nast.Continue(??)\nast.Del(??)\nast.Delete(??)\nast.Dict(??)\nast.DictComp(??)\nast.Div(??)\nast.Ellipsis(??)\nast.Eq(??)\nast.ExceptHandler(??)\nast.Expr(??)\nast.Expression(??)\nast.ExtSlice(??)\nast.FloorDiv(??)\nast.For(??)\nast.FunctionDef(??)\nast.GeneratorExp(??)\nast.Global(??)\nast.Gt(??)\nast.GtE(??)\nast.If(??)\nast.IfExp(??)\nast.Import(??)\nast.ImportFrom(??)\nast.In(??)\nast.Index(??)\nast.Interactive(??)\nast.Invert(??)\nast.Is(??)\nast.IsNot(??)\nast.LShift(??)\nast.Lambda(??)\nast.List(??)\nast.ListComp(??)\nast.Load(??)\nast.Lt(??)\nast.LtE(??)\nast.Mod(??)\nast.Module(??)\nast.Mult(??)\nast.Name(??)\nast.NameConstant(??)\nast.NodeTransformer(??)\nast.NodeVisitor(??)\nast.Nonlocal(??)\nast.Not(??)\nast.NotEq(??)\nast.NotIn(??)\nast.Num(??)\nast.Or(??)\nast.Param(??)\nast.Pass(??)\nast.Pow(??)\nast.PyCF_ONLY_AST\nast.RShift(??)\nast.Raise(??)\nast.Return(??)\nast.Set(??)\nast.SetComp(??)\nast.Slice(??)\nast.Starred(??)\nast.Store(??)\nast.Str(??)\nast.Sub(??)\nast.Subscript(??)\nast.Suite(??)\nast.Try(??)\nast.Tuple(??)\nast.UAdd(??)\nast.USub(??)\nast.UnaryOp(??)\nast.While(??)\nast.With(??)\nast.Yield(??)\nast.YieldFrom(??)\nast.alias(??)\nast.arg(??)\nast.arguments(??)\nast.boolop(??)\nast.cmpop(??)\nast.comprehension(??)\nast.copy_location(??)\nast.dump(??)\nast.excepthandler(??)\nast.expr(??)\nast.expr_context(??)\nast.fix_missing_locations(??)\nast.get_docstring(??)\nast.increment_lineno(??)\nast.iter_child_nodes(??)\nast.iter_fields(??)\nast.keyword(??)\nast.literal_eval(??)\nast.mod(??)\nast.operator(??)\nast.parse(??)\nast.slice(??)\nast.stmt(??)\nast.unaryop(??)\nast.walk(??)\nast.withitem(??)\nasynchat.async_chat(??)\nasynchat.asyncore(??)\nasynchat.deque([iterable[, maxlen]]) --> deque object\nasynchat.fifo(??)\nasynchat.find_prefix_at_end(??)\nasynchat.simple_producer(??)\nasynchat.socket(??)\nasyncio.ALL_COMPLETED\nasyncio.AbstractChildWatcher(??)\nasyncio.AbstractEventLoop(??)\nasyncio.AbstractEventLoopPolicy(??)\nasyncio.AbstractServer(??)\nasyncio.BaseProtocol(??)\nasyncio.BaseTransport(??)\nasyncio.BoundedSemaphore(??)\nasyncio.CancelledError(??)\nasyncio.Condition(??)\nasyncio.DatagramProtocol(??)\nasyncio.DatagramTransport(??)\nasyncio.DefaultEventLoopPolicy(??)\nasyncio.Event(??)\nasyncio.FIRST_COMPLETED\nasyncio.FIRST_EXCEPTION\nasyncio.FastChildWatcher(??)\nasyncio.Future(??)\nasyncio.Handle(??)\nasyncio.IncompleteReadError(??)\nasyncio.InvalidStateError(??)\nasyncio.JoinableQueue(??)\nasyncio.LifoQueue(??)\nasyncio.Lock(??)\nasyncio.PriorityQueue(??)\nasyncio.Protocol(??)\nasyncio.Queue(??)\nasyncio.QueueEmpty(??)\nasyncio.QueueFull(??)\nasyncio.ReadTransport(??)\nasyncio.SafeChildWatcher(??)\nasyncio.SelectorEventLoop(??)\nasyncio.Semaphore(??)\nasyncio.StreamReader(??)\nasyncio.StreamReaderProtocol(??)\nasyncio.StreamWriter(??)\nasyncio.SubprocessProtocol(??)\nasyncio.SubprocessTransport(??)\nasyncio.Task(??)\nasyncio.TimeoutError(??)\nasyncio.TimerHandle(??)\nasyncio.Transport(??)\nasyncio.WriteTransport(??)\nasyncio.as_completed(??)\nasyncio.async(??)\nasyncio.base_events(??)\nasyncio.base_events.BaseEventLoop(??)\nasyncio.base_events.Server(??)\nasyncio.base_events.collections(??)\nasyncio.base_events.concurrent(??)\nasyncio.base_events.events(??)\nasyncio.base_events.futures(??)\nasyncio.base_events.heapq(??)\nasyncio.base_events.logger(??)\nasyncio.base_events.logging(??)\nasyncio.base_events.os(??)\nasyncio.base_events.socket(??)\nasyncio.base_events.subprocess(??)\nasyncio.base_events.sys(??)\nasyncio.base_events.tasks(??)\nasyncio.base_events.time(??)\nasyncio.base_subprocess(??)\nasyncio.base_subprocess.BaseSubprocessTransport(??)\nasyncio.base_subprocess.ReadSubprocessPipeProto(??)\nasyncio.base_subprocess.WriteSubprocessPipeProto(??)\nasyncio.base_subprocess.collections(??)\nasyncio.base_subprocess.protocols(??)\nasyncio.base_subprocess.subprocess(??)\nasyncio.base_subprocess.tasks(??)\nasyncio.base_subprocess.transports(??)\nasyncio.constants(??)\nasyncio.constants.ACCEPT_RETRY_DELAY\nasyncio.constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES\nasyncio.coroutine(??)\nasyncio.create_subprocess_exec(??)\nasyncio.create_subprocess_shell(??)\nasyncio.events(??)\nasyncio.events.AbstractEventLoop(??)\nasyncio.events.AbstractEventLoopPolicy(??)\nasyncio.events.AbstractServer(??)\nasyncio.events.BaseDefaultEventLoopPolicy(??)\nasyncio.events.Handle(??)\nasyncio.events.TimerHandle(??)\nasyncio.events.get_child_watcher(??)\nasyncio.events.get_event_loop(??)\nasyncio.events.get_event_loop_policy(??)\nasyncio.events.new_event_loop(??)\nasyncio.events.set_child_watcher(??)\nasyncio.events.set_event_loop(??)\nasyncio.events.set_event_loop_policy(??)\nasyncio.events.socket(??)\nasyncio.events.subprocess(??)\nasyncio.events.threading(??)\nasyncio.futures(??)\nasyncio.futures.CancelledError(??)\nasyncio.futures.Error(??)\nasyncio.futures.Future(??)\nasyncio.futures.InvalidStateError(??)\nasyncio.futures.STACK_DEBUG\nasyncio.futures.TimeoutError(??)\nasyncio.futures.concurrent(??)\nasyncio.futures.events(??)\nasyncio.futures.logging(??)\nasyncio.futures.sys(??)\nasyncio.futures.traceback(??)\nasyncio.futures.wrap_future(??)\nasyncio.gather(??)\nasyncio.get_child_watcher(??)\nasyncio.get_event_loop(??)\nasyncio.get_event_loop_policy(??)\nasyncio.iscoroutine(??)\nasyncio.iscoroutinefunction(??)\nasyncio.locks(??)\nasyncio.locks.BoundedSemaphore(??)\nasyncio.locks.Condition(??)\nasyncio.locks.Event(??)\nasyncio.locks.Lock(??)\nasyncio.locks.Semaphore(??)\nasyncio.locks.collections(??)\nasyncio.locks.events(??)\nasyncio.locks.futures(??)\nasyncio.locks.tasks(??)\nasyncio.log(??)\nasyncio.log.logger(??)\nasyncio.log.logging(??)\nasyncio.new_event_loop(??)\nasyncio.open_connection(??)\nasyncio.open_unix_connection(??)\nasyncio.proactor_events.BaseProactorEventLoop(??)\nasyncio.proactor_events.base_events(??)\nasyncio.proactor_events.constants(??)\nasyncio.proactor_events.futures(??)\nasyncio.proactor_events.logger(??)\nasyncio.proactor_events.socket(??)\nasyncio.proactor_events.transports(??)\nasyncio.protocols(??)\nasyncio.protocols.BaseProtocol(??)\nasyncio.protocols.DatagramProtocol(??)\nasyncio.protocols.Protocol(??)\nasyncio.protocols.SubprocessProtocol(??)\nasyncio.queues(??)\nasyncio.queues.JoinableQueue(??)\nasyncio.queues.LifoQueue(??)\nasyncio.queues.PriorityQueue(??)\nasyncio.queues.Queue(??)\nasyncio.queues.QueueEmpty(??)\nasyncio.queues.QueueFull(??)\nasyncio.queues.collections(??)\nasyncio.queues.coroutine(??)\nasyncio.queues.events(??)\nasyncio.queues.futures(??)\nasyncio.queues.heapq(??)\nasyncio.queues.locks(??)\nasyncio.selector_events(??)\nasyncio.selector_events.BaseSelectorEventLoop(??)\nasyncio.selector_events.base_events(??)\nasyncio.selector_events.collections(??)\nasyncio.selector_events.constants(??)\nasyncio.selector_events.errno(??)\nasyncio.selector_events.events(??)\nasyncio.selector_events.futures(??)\nasyncio.selector_events.logger(??)\nasyncio.selector_events.selectors(??)\nasyncio.selector_events.socket(??)\nasyncio.selector_events.ssl(??)\nasyncio.selector_events.transports(??)\nasyncio.selectors(??)\nasyncio.set_child_watcher(??)\nasyncio.set_event_loop(??)\nasyncio.set_event_loop_policy(??)\nasyncio.shield(??)\nasyncio.sleep(??)\nasyncio.start_server(??)\nasyncio.start_unix_server(??)\nasyncio.streams(??)\nasyncio.streams.FlowControlMixin(??)\nasyncio.streams.IncompleteReadError(??)\nasyncio.streams.StreamReader(??)\nasyncio.streams.StreamReaderProtocol(??)\nasyncio.streams.StreamWriter(??)\nasyncio.streams.events(??)\nasyncio.streams.futures(??)\nasyncio.streams.open_connection(??)\nasyncio.streams.open_unix_connection(??)\nasyncio.streams.protocols(??)\nasyncio.streams.socket(??)\nasyncio.streams.start_server(??)\nasyncio.streams.start_unix_server(??)\nasyncio.streams.tasks(??)\nasyncio.subprocess(??)\nasyncio.subprocess.DEVNULL\nasyncio.subprocess.PIPE\nasyncio.subprocess.Process(??)\nasyncio.subprocess.STDOUT\nasyncio.subprocess.SubprocessStreamProtocol(??)\nasyncio.subprocess.collections(??)\nasyncio.subprocess.create_subprocess_exec(??)\nasyncio.subprocess.create_subprocess_shell(??)\nasyncio.subprocess.events(??)\nasyncio.subprocess.futures(??)\nasyncio.subprocess.protocols(??)\nasyncio.subprocess.streams(??)\nasyncio.subprocess.subprocess(??)\nasyncio.subprocess.tasks(??)\nasyncio.sys(??)\nasyncio.tasks(??)\nasyncio.tasks.ALL_COMPLETED\nasyncio.tasks.CoroWrapper(??)\nasyncio.tasks.FIRST_COMPLETED\nasyncio.tasks.FIRST_EXCEPTION\nasyncio.tasks.Task(??)\nasyncio.tasks.as_completed(??)\nasyncio.tasks.async(??)\nasyncio.tasks.concurrent(??)\nasyncio.tasks.coroutine(??)\nasyncio.tasks.events(??)\nasyncio.tasks.functools(??)\nasyncio.tasks.futures(??)\nasyncio.tasks.gather(??)\nasyncio.tasks.inspect(??)\nasyncio.tasks.iscoroutine(??)\nasyncio.tasks.iscoroutinefunction(??)\nasyncio.tasks.linecache(??)\nasyncio.tasks.logger(??)\nasyncio.tasks.os(??)\nasyncio.tasks.shield(??)\nasyncio.tasks.sleep(??)\nasyncio.tasks.sys(??)\nasyncio.tasks.traceback(??)\nasyncio.tasks.wait(??)\nasyncio.tasks.wait_for(??)\nasyncio.tasks.weakref(??)\nasyncio.test_utils.HTTPServer(??)\nasyncio.test_utils.MockCallback(??)\nasyncio.test_utils.MockPattern(??)\nasyncio.test_utils.SSLWSGIServer(??)\nasyncio.test_utils.SSLWSGIServerMixin(??)\nasyncio.test_utils.SilentUnixWSGIServer(??)\nasyncio.test_utils.SilentWSGIRequestHandler(??)\nasyncio.test_utils.SilentWSGIServer(??)\nasyncio.test_utils.TestLoop(??)\nasyncio.test_utils.TestSelector(??)\nasyncio.test_utils.UnixHTTPServer(??)\nasyncio.test_utils.UnixSSLWSGIServer(??)\nasyncio.test_utils.UnixWSGIServer(??)\nasyncio.test_utils.WSGIRequestHandler(??)\nasyncio.test_utils.WSGIServer(??)\nasyncio.test_utils.base_events(??)\nasyncio.test_utils.collections(??)\nasyncio.test_utils.contextlib(??)\nasyncio.test_utils.dummy_ssl_context(??)\nasyncio.test_utils.events(??)\nasyncio.test_utils.gen_unix_socket_path(??)\nasyncio.test_utils.io(??)\nasyncio.test_utils.make_test_protocol(??)\nasyncio.test_utils.os(??)\nasyncio.test_utils.re(??)\nasyncio.test_utils.run_briefly(??)\nasyncio.test_utils.run_once(??)\nasyncio.test_utils.run_test_server(??)\nasyncio.test_utils.run_test_unix_server(??)\nasyncio.test_utils.run_until(??)\nasyncio.test_utils.selectors(??)\nasyncio.test_utils.socket(??)\nasyncio.test_utils.socketpair([family[, type[, proto]]]) -> (socket object, socket object)\nasyncio.test_utils.socketserver(??)\nasyncio.test_utils.ssl(??)\nasyncio.test_utils.sys(??)\nasyncio.test_utils.tasks(??)\nasyncio.test_utils.tempfile(??)\nasyncio.test_utils.threading(??)\nasyncio.test_utils.time(??)\nasyncio.test_utils.unittest(??)\nasyncio.test_utils.unix_socket_path(??)\nasyncio.transports(??)\nasyncio.transports.BaseTransport(??)\nasyncio.transports.DatagramTransport(??)\nasyncio.transports.ReadTransport(??)\nasyncio.transports.SubprocessTransport(??)\nasyncio.transports.Transport(??)\nasyncio.transports.WriteTransport(??)\nasyncio.transports.sys(??)\nasyncio.unix_events(??)\nasyncio.unix_events.AbstractChildWatcher(??)\nasyncio.unix_events.BaseChildWatcher(??)\nasyncio.unix_events.DefaultEventLoopPolicy(??)\nasyncio.unix_events.FastChildWatcher(??)\nasyncio.unix_events.SafeChildWatcher(??)\nasyncio.unix_events.SelectorEventLoop(??)\nasyncio.unix_events.base_events(??)\nasyncio.unix_events.base_subprocess(??)\nasyncio.unix_events.constants(??)\nasyncio.unix_events.errno(??)\nasyncio.unix_events.events(??)\nasyncio.unix_events.fcntl(??)\nasyncio.unix_events.logger(??)\nasyncio.unix_events.os(??)\nasyncio.unix_events.selector_events(??)\nasyncio.unix_events.signal(??)\nasyncio.unix_events.socket(??)\nasyncio.unix_events.stat(??)\nasyncio.unix_events.subprocess(??)\nasyncio.unix_events.sys(??)\nasyncio.unix_events.tasks(??)\nasyncio.unix_events.threading(??)\nasyncio.unix_events.transports(??)\nasyncio.wait(??)\nasyncio.wait_for(??)\nasyncio.wrap_future(??)\nasyncore.EAGAIN\nasyncore.EALREADY\nasyncore.EBADF\nasyncore.ECONNABORTED\nasyncore.ECONNRESET\nasyncore.EINPROGRESS\nasyncore.EINVAL\nasyncore.EISCONN\nasyncore.ENOTCONN\nasyncore.EPIPE\nasyncore.ESHUTDOWN\nasyncore.EWOULDBLOCK\nasyncore.ExitNow(??)\nasyncore.close_all(??)\nasyncore.compact_traceback(??)\nasyncore.dispatcher(??)\nasyncore.dispatcher_with_send(??)\nasyncore.errorcode(??)\nasyncore.fcntl(??)\nasyncore.file_dispatcher(??)\nasyncore.file_wrapper(??)\nasyncore.loop(??)\nasyncore.os(??)\nasyncore.poll(??)\nasyncore.poll2(??)\nasyncore.poll3(??)\nasyncore.read(??)\nasyncore.readwrite(??)\nasyncore.select(??)\nasyncore.socket(??)\nasyncore.socket_map(??)\nasyncore.sys(??)\nasyncore.time(??)\nasyncore.warnings(??)\nasyncore.write(??)\natexit.register(func, *args, **kwargs) -> func\natexit.unregister(func) -> None\naudioop.add(??)\naudioop.adpcm2lin(??)\naudioop.alaw2lin(??)\naudioop.avg(??)\naudioop.avgpp(??)\naudioop.bias(??)\naudioop.byteswap(??)\naudioop.cross(??)\naudioop.error(??)\naudioop.findfactor(??)\naudioop.findfit(??)\naudioop.findmax(??)\naudioop.getsample(??)\naudioop.lin2adpcm(??)\naudioop.lin2alaw(??)\naudioop.lin2lin(??)\naudioop.lin2ulaw(??)\naudioop.max(??)\naudioop.maxpp(??)\naudioop.minmax(??)\naudioop.mul(??)\naudioop.ratecv(??)\naudioop.reverse(??)\naudioop.rms(??)\naudioop.tomono(??)\naudioop.tostereo(??)\naudioop.ulaw2lin(??)\nbase64.MAXBINSIZE\nbase64.MAXLINESIZE\nbase64.a85decode(??)\nbase64.a85encode(??)\nbase64.b16decode(??)\nbase64.b16encode(??)\nbase64.b32decode(??)\nbase64.b32encode(??)\nbase64.b64decode(??)\nbase64.b64encode(??)\nbase64.b85decode(??)\nbase64.b85encode(??)\nbase64.binascii(??)\nbase64.bytes_types(??)\nbase64.decode(??)\nbase64.decodebytes(??)\nbase64.decodestring(??)\nbase64.encode(??)\nbase64.encodebytes(??)\nbase64.encodestring(??)\nbase64.itertools(??)\nbase64.main(??)\nbase64.re(??)\nbase64.standard_b64decode(??)\nbase64.standard_b64encode(??)\nbase64.struct(??)\nbase64.test(??)\nbase64.urlsafe_b64decode(??)\nbase64.urlsafe_b64encode(??)\nbdb.Bdb(??)\nbdb.BdbQuit(??)\nbdb.Breakpoint(??)\nbdb.CO_GENERATOR\nbdb.Tdb(??)\nbdb.bar(??)\nbdb.checkfuncname(??)\nbdb.effective(??)\nbdb.fnmatch(??)\nbdb.foo(??)\nbdb.os(??)\nbdb.set_trace(??)\nbdb.sys(??)\nbdb.test(??)\nbin(number) -> string\nbinascii.Error(??)\nbinascii.Incomplete(??)\nbinascii.a2b_base64(??)\nbinascii.a2b_hex(??)\nbinascii.a2b_hqx(??)\nbinascii.a2b_qp(??)\nbinascii.a2b_uu(??)\nbinascii.b2a_base64(??)\nbinascii.b2a_hex(??)\nbinascii.b2a_hqx(??)\nbinascii.b2a_qp(??)\nbinascii.b2a_uu(??)\nbinascii.crc32(??)\nbinascii.crc_hqx(??)\nbinascii.hexlify(??)\nbinascii.rlecode_hqx(??)\nbinascii.rledecode_hqx(??)\nbinascii.unhexlify(??)\nbinhex.BinHex(??)\nbinhex.Error(??)\nbinhex.FInfo(??)\nbinhex.HexBin(??)\nbinhex.LINELEN\nbinhex.REASONABLY_LARGE\nbinhex.RUNCHAR\nbinhex.binascii(??)\nbinhex.binhex(infilename, outfilename): create binhex-encoded copy of a file\nbinhex.getfileinfo(??)\nbinhex.hexbin(infilename, outfilename) - Decode binhexed file\nbinhex.io(??)\nbinhex.openrsrc(??)\nbinhex.os(??)\nbinhex.struct(??)\nbisect.bisect(??)\nbisect.bisect_left(a, x[, lo[, hi]]) -> index\nbisect.bisect_right(a, x[, lo[, hi]]) -> index\nbisect.insort(??)\nbisect.insort_left(a, x[, lo[, hi]])\nbisect.insort_right(a, x[, lo[, hi]])\nbool(x) -> bool\nbuiltins.ArithmeticError(??)\nbuiltins.AssertionError(??)\nbuiltins.AttributeError(??)\nbuiltins.BaseException(??)\nbuiltins.BlockingIOError(??)\nbuiltins.BrokenPipeError(??)\nbuiltins.BufferError(??)\nbuiltins.BytesWarning(??)\nbuiltins.ChildProcessError(??)\nbuiltins.ConnectionAbortedError(??)\nbuiltins.ConnectionError(??)\nbuiltins.ConnectionRefusedError(??)\nbuiltins.ConnectionResetError(??)\nbuiltins.DeprecationWarning(??)\nbuiltins.EOFError(??)\nbuiltins.Ellipsis(??)\nbuiltins.EnvironmentError(??)\nbuiltins.Exception(??)\nbuiltins.False\nbuiltins.FileExistsError(??)\nbuiltins.FileNotFoundError(??)\nbuiltins.FloatingPointError(??)\nbuiltins.FutureWarning(??)\nbuiltins.GeneratorExit(??)\nbuiltins.IOError(??)\nbuiltins.ImportError(??)\nbuiltins.ImportWarning(??)\nbuiltins.IndentationError(??)\nbuiltins.IndexError(??)\nbuiltins.InterruptedError(??)\nbuiltins.IsADirectoryError(??)\nbuiltins.KeyError(??)\nbuiltins.KeyboardInterrupt(??)\nbuiltins.LookupError(??)\nbuiltins.MemoryError(??)\nbuiltins.NameError(??)\nbuiltins.None\nbuiltins.NotADirectoryError(??)\nbuiltins.NotImplemented(??)\nbuiltins.NotImplementedError(??)\nbuiltins.OSError(??)\nbuiltins.OverflowError(??)\nbuiltins.PendingDeprecationWarning(??)\nbuiltins.PermissionError(??)\nbuiltins.ProcessLookupError(??)\nbuiltins.ReferenceError(??)\nbuiltins.ResourceWarning(??)\nbuiltins.RuntimeError(??)\nbuiltins.RuntimeWarning(??)\nbuiltins.StopIteration(??)\nbuiltins.SyntaxError(??)\nbuiltins.SyntaxWarning(??)\nbuiltins.SystemError(??)\nbuiltins.SystemExit(??)\nbuiltins.TabError(??)\nbuiltins.TimeoutError(??)\nbuiltins.True\nbuiltins.TypeError(??)\nbuiltins.UnboundLocalError(??)\nbuiltins.UnicodeDecodeError(??)\nbuiltins.UnicodeEncodeError(??)\nbuiltins.UnicodeError(??)\nbuiltins.UnicodeTranslateError(??)\nbuiltins.UnicodeWarning(??)\nbuiltins.UserWarning(??)\nbuiltins.ValueError(??)\nbuiltins.Warning(??)\nbuiltins.ZeroDivisionError(??)\nbuiltins.abs(number) -> number\nbuiltins.all(iterable) -> bool\nbuiltins.any(iterable) -> bool\nbuiltins.ascii(object) -> string\nbuiltins.bin(number) -> string\nbuiltins.bool(x) -> bool\nbuiltins.bytearray(iterable_of_ints) -> bytearray\nbuiltins.bytes(iterable_of_ints) -> bytes\nbuiltins.callable(object) -> bool\nbuiltins.chr(i) -> Unicode character\nbuiltins.classmethod(function) -> method\nbuiltins.compile(source, filename, mode[, flags[, dont_inherit]]) -> code object\nbuiltins.complex(real[, imag]) -> complex number\nbuiltins.copyright(??)\nbuiltins.credits(??)\nbuiltins.delattr(object, name)\nbuiltins.dict() -> new empty dictionary\nbuiltins.dir([object]) -> list of strings\nbuiltins.divmod(x, y) -> (div, mod)\nbuiltins.enumerate(iterable[, start]) -> iterator for index, value of iterable\nbuiltins.eval(source[, globals[, locals]]) -> value\nbuiltins.exec(object[, globals[, locals]])\nbuiltins.exit(??)\nbuiltins.filter(function or None, iterable) --> filter object\nbuiltins.float(x) -> floating point number\nbuiltins.format(value[, format_spec]) -> string\nbuiltins.frozenset() -> empty frozenset object\nbuiltins.getattr(object, name[, default]) -> value\nbuiltins.globals() -> dictionary\nbuiltins.hasattr(object, name) -> bool\nbuiltins.hash(object) -> integer\nbuiltins.help(??)\nbuiltins.hex(number) -> string\nbuiltins.id(object) -> integer\nbuiltins.input([prompt]) -> string\nbuiltins.int(x=0) -> integer\nbuiltins.isinstance(object, class-or-type-or-tuple) -> bool\nbuiltins.issubclass(C, B) -> bool\nbuiltins.iter(iterable) -> iterator\nbuiltins.len(module, object)\nbuiltins.license(??)\nbuiltins.list() -> new empty list\nbuiltins.locals() -> dictionary\nbuiltins.map(func, *iterables) --> map object\nbuiltins.max(iterable[, key=func]) -> value\nbuiltins.memoryview(object)\nbuiltins.min(iterable[, key=func]) -> value\nbuiltins.next(iterator[, default])\nbuiltins.object(??)\nbuiltins.oct(number) -> string\nbuiltins.open(??)\nbuiltins.ord(c) -> integer\nbuiltins.pow(x, y[, z]) -> number\nbuiltins.print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\nbuiltins.property(fget=None, fset=None, fdel=None, doc=None) -> property attribute\nbuiltins.quit(??)\nbuiltins.range(stop) -> range object\nbuiltins.repr(object) -> string\nbuiltins.reversed(sequence) -> reverse iterator over values of the sequence\nbuiltins.round(number[, ndigits]) -> number\nbuiltins.set() -> new empty set object\nbuiltins.setattr(object, name, value)\nbuiltins.slice(stop)\nbuiltins.sorted(iterable, key=None, reverse=False) --> new sorted list\nbuiltins.staticmethod(function) -> method\nbuiltins.str(object='') -> str\nbuiltins.sum(iterable[, start]) -> value\nbuiltins.super() -> same as super(__class__, <first argument>)\nbuiltins.tuple() -> empty tuple\nbuiltins.type(object_or_name, bases, dict)\nbuiltins.vars([object]) -> dictionary\nbuiltins.zip(iter1 [,iter2 [...]]) --> zip object\nbytearray(iterable_of_ints) -> bytearray\nbytes(iterable_of_ints) -> bytes\nbz2.BZ2Compressor(??)\nbz2.BZ2Decompressor(??)\nbz2.BZ2File(??)\nbz2.RLock(??)\nbz2.compress(??)\nbz2.decompress(??)\nbz2.io(??)\nbz2.open(??)\nbz2.warnings(??)\ncProfile.Profile(custom_timer=None, time_unit=None, subcalls=True, builtins=True)\ncProfile.label(??)\ncProfile.main(??)\ncProfile.run(??)\ncProfile.runctx(??)\ncalendar.Calendar(??)\ncalendar.EPOCH\ncalendar.FRIDAY\ncalendar.February\ncalendar.HTMLCalendar(??)\ncalendar.IllegalMonthError(??)\ncalendar.IllegalWeekdayError(??)\ncalendar.January\ncalendar.LocaleHTMLCalendar(??)\ncalendar.LocaleTextCalendar(??)\ncalendar.MONDAY\ncalendar.SATURDAY\ncalendar.SUNDAY\ncalendar.THURSDAY\ncalendar.TUESDAY\ncalendar.TextCalendar(??)\ncalendar.WEDNESDAY\ncalendar.c(??)\ncalendar.calendar(??)\ncalendar.datetime(??)\ncalendar.day_abbr(??)\ncalendar.day_name(??)\ncalendar.different_locale(??)\ncalendar.error(??)\ncalendar.firstweekday(??)\ncalendar.format(??)\ncalendar.formatstring(??)\ncalendar.isleap(??)\ncalendar.leapdays(??)\ncalendar.main(??)\ncalendar.mdays(??)\ncalendar.month(??)\ncalendar.month_abbr(??)\ncalendar.month_name(??)\ncalendar.monthcalendar(??)\ncalendar.monthrange(??)\ncalendar.prcal(??)\ncalendar.prmonth(??)\ncalendar.prweek(??)\ncalendar.setfirstweekday(??)\ncalendar.sys(??)\ncalendar.timegm(??)\ncalendar.week(??)\ncalendar.weekday(??)\ncalendar.weekheader(??)\ncallable(object) -> bool\ncgi.BytesIO([buffer]) -> object\ncgi.FeedParser(??)\ncgi.FieldStorage(??)\ncgi.Mapping(??)\ncgi.Message(??)\ncgi.MiniFieldStorage(??)\ncgi.StringIO(??)\ncgi.TextIOWrapper(??)\ncgi.closelog(??)\ncgi.dolog(??)\ncgi.escape(??)\ncgi.html(??)\ncgi.initlog(??)\ncgi.locale(??)\ncgi.log(??)\ncgi.logfile\ncgi.logfp(??)\ncgi.maxlen\ncgi.nolog(??)\ncgi.os(??)\ncgi.parse(??)\ncgi.parse_header(??)\ncgi.parse_multipart(??)\ncgi.parse_qs(??)\ncgi.parse_qsl(??)\ncgi.print_arguments(??)\ncgi.print_directory(??)\ncgi.print_environ(??)\ncgi.print_environ_usage(??)\ncgi.print_exception(??)\ncgi.print_form(??)\ncgi.sys(??)\ncgi.tempfile(??)\ncgi.test(??)\ncgi.urllib(??)\ncgi.valid_boundary(??)\ncgi.warn(??)\ncgitb.Hook(??)\ncgitb.enable(??)\ncgitb.grey(??)\ncgitb.handler(??)\ncgitb.html(??)\ncgitb.inspect(??)\ncgitb.keyword(??)\ncgitb.linecache(??)\ncgitb.lookup(??)\ncgitb.os(??)\ncgitb.pydoc(??)\ncgitb.reset(??)\ncgitb.scanvars(??)\ncgitb.small(??)\ncgitb.strong(??)\ncgitb.sys(??)\ncgitb.tempfile(??)\ncgitb.text(??)\ncgitb.time(??)\ncgitb.tokenize(??)\ncgitb.traceback(??)\nchr(i) -> Unicode character\nchunk.Chunk(??)\nclassmethod(function) -> method\ncmath.acos(x)\ncmath.acosh(x)\ncmath.asin(x)\ncmath.asinh(x)\ncmath.atan(x)\ncmath.atanh(x)\ncmath.cos(x)\ncmath.cosh(x)\ncmath.e\ncmath.exp(x)\ncmath.isfinite(z) -> bool\ncmath.isinf(z) -> bool\ncmath.isnan(z) -> bool\ncmath.log(x[, base]) -> the logarithm of x to the given base.\ncmath.log10(x)\ncmath.phase(z) -> float\ncmath.pi\ncmath.polar(z) -> r: float, phi: float\ncmath.rect(r, phi) -> z: complex\ncmath.sin(x)\ncmath.sinh(x)\ncmath.sqrt(x)\ncmath.tan(x)\ncmath.tanh(x)\ncmd.Cmd(??)\ncmd.IDENTCHARS\ncmd.PROMPT\ncmd.string(??)\ncmd.sys(??)\ncode.CommandCompiler(??)\ncode.InteractiveConsole(??)\ncode.InteractiveInterpreter(??)\ncode.compile_command(??)\ncode.interact(??)\ncode.sys(??)\ncode.traceback(??)\ncodecs.BOM\ncodecs.BOM32_BE\ncodecs.BOM32_LE\ncodecs.BOM64_BE\ncodecs.BOM64_LE\ncodecs.BOM_BE\ncodecs.BOM_LE\ncodecs.BOM_UTF16\ncodecs.BOM_UTF16_BE\ncodecs.BOM_UTF16_LE\ncodecs.BOM_UTF32\ncodecs.BOM_UTF32_BE\ncodecs.BOM_UTF32_LE\ncodecs.BOM_UTF8\ncodecs.BufferedIncrementalDecoder(??)\ncodecs.BufferedIncrementalEncoder(??)\ncodecs.Codec(??)\ncodecs.CodecInfo(??)\ncodecs.EncodedFile(??)\ncodecs.IncrementalDecoder(??)\ncodecs.IncrementalEncoder(??)\ncodecs.StreamReader(??)\ncodecs.StreamReaderWriter(??)\ncodecs.StreamRecoder(??)\ncodecs.StreamWriter(??)\ncodecs.ascii_decode(??)\ncodecs.ascii_encode(??)\ncodecs.backslashreplace_errors(??)\ncodecs.builtins(??)\ncodecs.charmap_build(??)\ncodecs.charmap_decode(??)\ncodecs.charmap_encode(??)\ncodecs.decode(obj, [encoding[,errors]]) -> object\ncodecs.encode(obj, [encoding[,errors]]) -> object\ncodecs.escape_decode(??)\ncodecs.escape_encode(??)\ncodecs.getdecoder(??)\ncodecs.getencoder(??)\ncodecs.getincrementaldecoder(??)\ncodecs.getincrementalencoder(??)\ncodecs.getreader(??)\ncodecs.getwriter(??)\ncodecs.ignore_errors(??)\ncodecs.iterdecode(??)\ncodecs.iterencode(??)\ncodecs.latin_1_decode(??)\ncodecs.latin_1_encode(??)\ncodecs.lookup(encoding) -> CodecInfo\ncodecs.lookup_error(errors) -> handler\ncodecs.make_encoding_map(??)\ncodecs.make_identity_dict(rng) -> dict\ncodecs.open(??)\ncodecs.raw_unicode_escape_decode(??)\ncodecs.raw_unicode_escape_encode(??)\ncodecs.readbuffer_encode(??)\ncodecs.register(search_function)\ncodecs.register_error(errors, handler)\ncodecs.replace_errors(??)\ncodecs.strict_errors(??)\ncodecs.sys(??)\ncodecs.unicode_escape_decode(??)\ncodecs.unicode_escape_encode(??)\ncodecs.unicode_internal_decode(??)\ncodecs.unicode_internal_encode(??)\ncodecs.utf_16_be_decode(??)\ncodecs.utf_16_be_encode(??)\ncodecs.utf_16_decode(??)\ncodecs.utf_16_encode(??)\ncodecs.utf_16_ex_decode(??)\ncodecs.utf_16_le_decode(??)\ncodecs.utf_16_le_encode(??)\ncodecs.utf_32_be_decode(??)\ncodecs.utf_32_be_encode(??)\ncodecs.utf_32_decode(??)\ncodecs.utf_32_encode(??)\ncodecs.utf_32_ex_decode(??)\ncodecs.utf_32_le_decode(??)\ncodecs.utf_32_le_encode(??)\ncodecs.utf_7_decode(??)\ncodecs.utf_7_encode(??)\ncodecs.utf_8_decode(??)\ncodecs.utf_8_encode(??)\ncodecs.xmlcharrefreplace_errors(??)\ncodeop.CommandCompiler(??)\ncodeop.Compile(??)\ncodeop.PyCF_DONT_IMPLY_DEDENT\ncodeop.compile_command(??)\ncollections.ByteString(??)\ncollections.Callable(??)\ncollections.ChainMap(??)\ncollections.Container(??)\ncollections.Counter(??)\ncollections.Hashable(??)\ncollections.ItemsView(??)\ncollections.Iterable(??)\ncollections.Iterator(??)\ncollections.KeysView(??)\ncollections.Mapping(??)\ncollections.MappingView(??)\ncollections.MutableMapping(??)\ncollections.MutableSequence(??)\ncollections.MutableSet(??)\ncollections.OrderedDict(??)\ncollections.Sequence(??)\ncollections.Set(??)\ncollections.Sized(??)\ncollections.UserDict(??)\ncollections.UserList(??)\ncollections.UserString(??)\ncollections.ValuesView(??)\ncollections.abc.ByteString(??)\ncollections.abc.Callable(??)\ncollections.abc.Container(??)\ncollections.abc.Hashable(??)\ncollections.abc.ItemsView(??)\ncollections.abc.Iterable(??)\ncollections.abc.Iterator(??)\ncollections.abc.KeysView(??)\ncollections.abc.Mapping(??)\ncollections.abc.MappingView(??)\ncollections.abc.MutableMapping(??)\ncollections.abc.MutableSequence(??)\ncollections.abc.MutableSet(??)\ncollections.abc.Sequence(??)\ncollections.abc.Set(??)\ncollections.abc.Sized(??)\ncollections.abc.ValuesView(??)\ncollections.defaultdict(default_factory[, ...]) --> dict with default factory\ncollections.deque([iterable[, maxlen]]) --> deque object\ncollections.namedtuple(??)\ncolorsys.ONE_SIXTH\ncolorsys.ONE_THIRD\ncolorsys.TWO_THIRD\ncolorsys.hls_to_rgb(??)\ncolorsys.hsv_to_rgb(??)\ncolorsys.rgb_to_hls(??)\ncolorsys.rgb_to_hsv(??)\ncolorsys.rgb_to_yiq(??)\ncolorsys.yiq_to_rgb(??)\ncompile(source, filename, mode[, flags[, dont_inherit]]) -> code object\ncompileall.compile_dir(??)\ncompileall.compile_file(??)\ncompileall.compile_path(??)\ncompileall.errno(??)\ncompileall.importlib(??)\ncompileall.main(??)\ncompileall.os(??)\ncompileall.py_compile(??)\ncompileall.struct(??)\ncompileall.sys(??)\ncomplex(real[, imag]) -> complex number\nconcurrent.futures(??)\nconcurrent.futures.ALL_COMPLETED\nconcurrent.futures.CancelledError(??)\nconcurrent.futures.Executor(??)\nconcurrent.futures.FIRST_COMPLETED\nconcurrent.futures.FIRST_EXCEPTION\nconcurrent.futures.Future(??)\nconcurrent.futures.ProcessPoolExecutor(??)\nconcurrent.futures.ThreadPoolExecutor(??)\nconcurrent.futures.TimeoutError(??)\nconcurrent.futures.as_completed(??)\nconcurrent.futures.process(??)\nconcurrent.futures.process.BrokenProcessPool(??)\nconcurrent.futures.process.EXTRA_QUEUED_CALLS\nconcurrent.futures.process.Full(??)\nconcurrent.futures.process.ProcessPoolExecutor(??)\nconcurrent.futures.process.SimpleQueue(??)\nconcurrent.futures.process.atexit(??)\nconcurrent.futures.process.multiprocessing(??)\nconcurrent.futures.process.os(??)\nconcurrent.futures.process.queue(??)\nconcurrent.futures.process.threading(??)\nconcurrent.futures.process.wait(??)\nconcurrent.futures.process.weakref(??)\nconcurrent.futures.thread(??)\nconcurrent.futures.thread.ThreadPoolExecutor(??)\nconcurrent.futures.thread.atexit(??)\nconcurrent.futures.thread.queue(??)\nconcurrent.futures.thread.threading(??)\nconcurrent.futures.thread.weakref(??)\nconcurrent.futures.wait(??)\nconfigparser.BasicInterpolation(??)\nconfigparser.ConfigParser(??)\nconfigparser.DEFAULTSECT\nconfigparser.DuplicateOptionError(??)\nconfigparser.DuplicateSectionError(??)\nconfigparser.Error(??)\nconfigparser.ExtendedInterpolation(??)\nconfigparser.Interpolation(??)\nconfigparser.InterpolationDepthError(??)\nconfigparser.InterpolationError(??)\nconfigparser.InterpolationMissingOptionError(??)\nconfigparser.InterpolationSyntaxError(??)\nconfigparser.LegacyInterpolation(??)\nconfigparser.MAX_INTERPOLATION_DEPTH\nconfigparser.MissingSectionHeaderError(??)\nconfigparser.MutableMapping(??)\nconfigparser.NoOptionError(??)\nconfigparser.NoSectionError(??)\nconfigparser.ParsingError(??)\nconfigparser.RawConfigParser(??)\nconfigparser.SafeConfigParser(??)\nconfigparser.SectionProxy(??)\nconfigparser.functools(??)\nconfigparser.io(??)\nconfigparser.itertools(??)\nconfigparser.re(??)\nconfigparser.sys(??)\nconfigparser.warnings(??)\ncontextlib.ContextDecorator(??)\ncontextlib.ExitStack(??)\ncontextlib.closing(??)\ncontextlib.contextmanager(??)\ncontextlib.deque([iterable[, maxlen]]) --> deque object\ncontextlib.redirect_stdout(??)\ncontextlib.suppress(??)\ncontextlib.sys(??)\ncontextlib.wraps(??)\ncopy.Error(??)\ncopy.PyStringMap(??)\ncopy.builtins(??)\ncopy.copy(??)\ncopy.deepcopy(??)\ncopy.dispatch_table(??)\ncopy.error(??)\ncopy.name\ncopy.t(??)\ncopy.weakref(??)\ncopyreg.add_extension(??)\ncopyreg.clear_extension_cache(??)\ncopyreg.constructor(??)\ncopyreg.dispatch_table(??)\ncopyreg.pickle(??)\ncopyreg.pickle_complex(??)\ncopyreg.remove_extension(??)\ncopyright(??)\ncredits(??)\ncrypt.METHOD_CRYPT(??)\ncrypt.METHOD_MD5(??)\ncrypt.METHOD_SHA256(??)\ncrypt.METHOD_SHA512(??)\ncrypt.crypt(??)\ncrypt.methods(??)\ncrypt.mksalt(??)\ncsv.Dialect(??)\ncsv.DictReader(??)\ncsv.DictWriter(??)\ncsv.Error(??)\ncsv.QUOTE_ALL\ncsv.QUOTE_MINIMAL\ncsv.QUOTE_NONE\ncsv.QUOTE_NONNUMERIC\ncsv.Sniffer(??)\ncsv.StringIO(??)\ncsv.excel(??)\ncsv.excel_tab(??)\ncsv.field_size_limit(??)\ncsv.get_dialect(??)\ncsv.list_dialects(??)\ncsv.re(??)\ncsv.reader(??)\ncsv.register_dialect(??)\ncsv.unix_dialect(??)\ncsv.unregister_dialect(??)\ncsv.writer(??)\nctypes.ARRAY(??)\nctypes.ArgumentError(??)\nctypes.Array(??)\nctypes.BigEndianStructure(??)\nctypes.CDLL(??)\nctypes.CFUNCTYPE(??)\nctypes.DEFAULT_MODE\nctypes.LibraryLoader(??)\nctypes.LittleEndianStructure(??)\nctypes.POINTER(??)\nctypes.PYFUNCTYPE(??)\nctypes.PyDLL(??)\nctypes.RTLD_GLOBAL\nctypes.RTLD_LOCAL\nctypes.SetPointerType(??)\nctypes.Structure(??)\nctypes.Union(??)\nctypes.addressof(C instance) -> integer\nctypes.alignment(C type) -> integer\nctypes.byref(C instance[, offset=0]) -> byref-object\nctypes.c_bool(??)\nctypes.c_buffer(??)\nctypes.c_byte(??)\nctypes.c_char(??)\nctypes.c_char_p(??)\nctypes.c_double(??)\nctypes.c_float(??)\nctypes.c_int(??)\nctypes.c_int16(??)\nctypes.c_int32(??)\nctypes.c_int64(??)\nctypes.c_int8(??)\nctypes.c_long(??)\nctypes.c_longdouble(??)\nctypes.c_longlong(??)\nctypes.c_short(??)\nctypes.c_size_t(??)\nctypes.c_ssize_t(??)\nctypes.c_ubyte(??)\nctypes.c_uint(??)\nctypes.c_uint16(??)\nctypes.c_uint32(??)\nctypes.c_uint64(??)\nctypes.c_uint8(??)\nctypes.c_ulong(??)\nctypes.c_ulonglong(??)\nctypes.c_ushort(??)\nctypes.c_void_p(??)\nctypes.c_voidp(??)\nctypes.c_wchar(??)\nctypes.c_wchar_p(??)\nctypes.cast(??)\nctypes.cdll(??)\nctypes.create_string_buffer(aBytes) -> character array\nctypes.create_unicode_buffer(aString) -> character array\nctypes.get_errno(??)\nctypes.macholib.dyld.DEFAULT_FRAMEWORK_FALLBACK(??)\nctypes.macholib.dyld.DEFAULT_LIBRARY_FALLBACK(??)\nctypes.macholib.dyld.accumulate(iterable[, func]) --> accumulate object\nctypes.macholib.dyld.chain(*iterables) --> chain object\nctypes.macholib.dyld.combinations(iterable, r) --> combinations object\nctypes.macholib.dyld.combinations_with_replacement(iterable, r) --> combinations_with_replacement object\nctypes.macholib.dyld.compress(data, selectors) --> iterator over selected data\nctypes.macholib.dyld.count(start=0, step=1) --> count object\nctypes.macholib.dyld.cycle(iterable) --> cycle object\nctypes.macholib.dyld.dropwhile(predicate, iterable) --> dropwhile object\nctypes.macholib.dyld.dyld_default_search(??)\nctypes.macholib.dyld.dyld_env(??)\nctypes.macholib.dyld.dyld_executable_path_search(??)\nctypes.macholib.dyld.dyld_fallback_framework_path(??)\nctypes.macholib.dyld.dyld_fallback_library_path(??)\nctypes.macholib.dyld.dyld_find(??)\nctypes.macholib.dyld.dyld_framework_path(??)\nctypes.macholib.dyld.dyld_image_suffix(??)\nctypes.macholib.dyld.dyld_image_suffix_search(??)\nctypes.macholib.dyld.dyld_library_path(??)\nctypes.macholib.dyld.dyld_override_search(??)\nctypes.macholib.dyld.dylib_info(??)\nctypes.macholib.dyld.filterfalse(function or None, sequence) --> filterfalse object\nctypes.macholib.dyld.framework_find(??)\nctypes.macholib.dyld.framework_info(??)\nctypes.macholib.dyld.groupby(iterable[, keyfunc]) -> create an iterator which returns\nctypes.macholib.dyld.islice(iterable, stop) --> islice object\nctypes.macholib.dyld.os(??)\nctypes.macholib.dyld.permutations(iterable[, r]) --> permutations object\nctypes.macholib.dyld.product(*iterables, repeat=1) --> product object\nctypes.macholib.dyld.repeat(object [,times]) -> create an iterator which returns the object\nctypes.macholib.dyld.starmap(function, sequence) --> starmap object\nctypes.macholib.dyld.takewhile(predicate, iterable) --> takewhile object\nctypes.macholib.dyld.tee(iterable, n=2) --> tuple of n independent iterators.\nctypes.macholib.dyld.test_dyld_find(??)\nctypes.macholib.dyld.zip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> zip_longest object\nctypes.macholib.dylib.DYLIB_RE(??)\nctypes.macholib.dylib.dylib_info(??)\nctypes.macholib.dylib.re(??)\nctypes.macholib.dylib.test_dylib_info(??)\nctypes.macholib.framework.STRICT_FRAMEWORK_RE(??)\nctypes.macholib.framework.framework_info(??)\nctypes.macholib.framework.re(??)\nctypes.macholib.framework.test_framework_info(??)\nctypes.memmove(??)\nctypes.memset(??)\nctypes.pointer(??)\nctypes.py_object(??)\nctypes.pydll(??)\nctypes.pythonapi(??)\nctypes.resize(??)\nctypes.set_errno(??)\nctypes.sizeof(C type) -> integer\nctypes.string_at(addr[, size]) -> string\nctypes.util.contextlib(??)\nctypes.util.find_library(??)\nctypes.util.os(??)\nctypes.util.subprocess(??)\nctypes.util.sys(??)\nctypes.util.test(??)\nctypes.wstring_at(addr[, size]) -> string\ncurses.ALL_MOUSE_EVENTS\ncurses.A_ALTCHARSET\ncurses.A_ATTRIBUTES\ncurses.A_BLINK\ncurses.A_BOLD\ncurses.A_CHARTEXT\ncurses.A_COLOR\ncurses.A_DIM\ncurses.A_HORIZONTAL\ncurses.A_INVIS\ncurses.A_LEFT\ncurses.A_LOW\ncurses.A_NORMAL\ncurses.A_PROTECT\ncurses.A_REVERSE\ncurses.A_RIGHT\ncurses.A_STANDOUT\ncurses.A_TOP\ncurses.A_UNDERLINE\ncurses.A_VERTICAL\ncurses.BUTTON1_CLICKED\ncurses.BUTTON1_DOUBLE_CLICKED\ncurses.BUTTON1_PRESSED\ncurses.BUTTON1_RELEASED\ncurses.BUTTON1_TRIPLE_CLICKED\ncurses.BUTTON2_CLICKED\ncurses.BUTTON2_DOUBLE_CLICKED\ncurses.BUTTON2_PRESSED\ncurses.BUTTON2_RELEASED\ncurses.BUTTON2_TRIPLE_CLICKED\ncurses.BUTTON3_CLICKED\ncurses.BUTTON3_DOUBLE_CLICKED\ncurses.BUTTON3_PRESSED\ncurses.BUTTON3_RELEASED\ncurses.BUTTON3_TRIPLE_CLICKED\ncurses.BUTTON4_CLICKED\ncurses.BUTTON4_DOUBLE_CLICKED\ncurses.BUTTON4_PRESSED\ncurses.BUTTON4_RELEASED\ncurses.BUTTON4_TRIPLE_CLICKED\ncurses.BUTTON_ALT\ncurses.BUTTON_CTRL\ncurses.BUTTON_SHIFT\ncurses.COLOR_BLACK\ncurses.COLOR_BLUE\ncurses.COLOR_CYAN\ncurses.COLOR_GREEN\ncurses.COLOR_MAGENTA\ncurses.COLOR_RED\ncurses.COLOR_WHITE\ncurses.COLOR_YELLOW\ncurses.ERR\ncurses.KEY_A1\ncurses.KEY_A3\ncurses.KEY_B2\ncurses.KEY_BACKSPACE\ncurses.KEY_BEG\ncurses.KEY_BREAK\ncurses.KEY_BTAB\ncurses.KEY_C1\ncurses.KEY_C3\ncurses.KEY_CANCEL\ncurses.KEY_CATAB\ncurses.KEY_CLEAR\ncurses.KEY_CLOSE\ncurses.KEY_COMMAND\ncurses.KEY_COPY\ncurses.KEY_CREATE\ncurses.KEY_CTAB\ncurses.KEY_DC\ncurses.KEY_DL\ncurses.KEY_DOWN\ncurses.KEY_EIC\ncurses.KEY_END\ncurses.KEY_ENTER\ncurses.KEY_EOL\ncurses.KEY_EOS\ncurses.KEY_EXIT\ncurses.KEY_F0\ncurses.KEY_F1\ncurses.KEY_F10\ncurses.KEY_F11\ncurses.KEY_F12\ncurses.KEY_F13\ncurses.KEY_F14\ncurses.KEY_F15\ncurses.KEY_F16\ncurses.KEY_F17\ncurses.KEY_F18\ncurses.KEY_F19\ncurses.KEY_F2\ncurses.KEY_F20\ncurses.KEY_F21\ncurses.KEY_F22\ncurses.KEY_F23\ncurses.KEY_F24\ncurses.KEY_F25\ncurses.KEY_F26\ncurses.KEY_F27\ncurses.KEY_F28\ncurses.KEY_F29\ncurses.KEY_F3\ncurses.KEY_F30\ncurses.KEY_F31\ncurses.KEY_F32\ncurses.KEY_F33\ncurses.KEY_F34\ncurses.KEY_F35\ncurses.KEY_F36\ncurses.KEY_F37\ncurses.KEY_F38\ncurses.KEY_F39\ncurses.KEY_F4\ncurses.KEY_F40\ncurses.KEY_F41\ncurses.KEY_F42\ncurses.KEY_F43\ncurses.KEY_F44\ncurses.KEY_F45\ncurses.KEY_F46\ncurses.KEY_F47\ncurses.KEY_F48\ncurses.KEY_F49\ncurses.KEY_F5\ncurses.KEY_F50\ncurses.KEY_F51\ncurses.KEY_F52\ncurses.KEY_F53\ncurses.KEY_F54\ncurses.KEY_F55\ncurses.KEY_F56\ncurses.KEY_F57\ncurses.KEY_F58\ncurses.KEY_F59\ncurses.KEY_F6\ncurses.KEY_F60\ncurses.KEY_F61\ncurses.KEY_F62\ncurses.KEY_F63\ncurses.KEY_F7\ncurses.KEY_F8\ncurses.KEY_F9\ncurses.KEY_FIND\ncurses.KEY_HELP\ncurses.KEY_HOME\ncurses.KEY_IC\ncurses.KEY_IL\ncurses.KEY_LEFT\ncurses.KEY_LL\ncurses.KEY_MARK\ncurses.KEY_MAX\ncurses.KEY_MESSAGE\ncurses.KEY_MIN\ncurses.KEY_MOUSE\ncurses.KEY_MOVE\ncurses.KEY_NEXT\ncurses.KEY_NPAGE\ncurses.KEY_OPEN\ncurses.KEY_OPTIONS\ncurses.KEY_PPAGE\ncurses.KEY_PREVIOUS\ncurses.KEY_PRINT\ncurses.KEY_REDO\ncurses.KEY_REFERENCE\ncurses.KEY_REFRESH\ncurses.KEY_REPLACE\ncurses.KEY_RESET\ncurses.KEY_RESIZE\ncurses.KEY_RESTART\ncurses.KEY_RESUME\ncurses.KEY_RIGHT\ncurses.KEY_SAVE\ncurses.KEY_SBEG\ncurses.KEY_SCANCEL\ncurses.KEY_SCOMMAND\ncurses.KEY_SCOPY\ncurses.KEY_SCREATE\ncurses.KEY_SDC\ncurses.KEY_SDL\ncurses.KEY_SELECT\ncurses.KEY_SEND\ncurses.KEY_SEOL\ncurses.KEY_SEXIT\ncurses.KEY_SF\ncurses.KEY_SFIND\ncurses.KEY_SHELP\ncurses.KEY_SHOME\ncurses.KEY_SIC\ncurses.KEY_SLEFT\ncurses.KEY_SMESSAGE\ncurses.KEY_SMOVE\ncurses.KEY_SNEXT\ncurses.KEY_SOPTIONS\ncurses.KEY_SPREVIOUS\ncurses.KEY_SPRINT\ncurses.KEY_SR\ncurses.KEY_SREDO\ncurses.KEY_SREPLACE\ncurses.KEY_SRESET\ncurses.KEY_SRIGHT\ncurses.KEY_SRSUME\ncurses.KEY_SSAVE\ncurses.KEY_SSUSPEND\ncurses.KEY_STAB\ncurses.KEY_SUNDO\ncurses.KEY_SUSPEND\ncurses.KEY_UNDO\ncurses.KEY_UP\ncurses.OK\ncurses.REPORT_MOUSE_POSITION\ncurses.ascii.ACK\ncurses.ascii.BEL\ncurses.ascii.BS\ncurses.ascii.CAN\ncurses.ascii.CR\ncurses.ascii.DC1\ncurses.ascii.DC2\ncurses.ascii.DC3\ncurses.ascii.DC4\ncurses.ascii.DEL\ncurses.ascii.DLE\ncurses.ascii.EM\ncurses.ascii.ENQ\ncurses.ascii.EOT\ncurses.ascii.ESC\ncurses.ascii.ETB\ncurses.ascii.ETX\ncurses.ascii.FF\ncurses.ascii.FS\ncurses.ascii.GS\ncurses.ascii.HT\ncurses.ascii.LF\ncurses.ascii.NAK\ncurses.ascii.NL\ncurses.ascii.NUL\ncurses.ascii.RS\ncurses.ascii.SI\ncurses.ascii.SO\ncurses.ascii.SOH\ncurses.ascii.SP\ncurses.ascii.STX\ncurses.ascii.SUB\ncurses.ascii.SYN\ncurses.ascii.TAB\ncurses.ascii.US\ncurses.ascii.VT\ncurses.ascii.alt(??)\ncurses.ascii.ascii(??)\ncurses.ascii.controlnames(??)\ncurses.ascii.ctrl(??)\ncurses.ascii.isalnum(??)\ncurses.ascii.isalpha(??)\ncurses.ascii.isascii(??)\ncurses.ascii.isblank(??)\ncurses.ascii.iscntrl(??)\ncurses.ascii.isctrl(??)\ncurses.ascii.isdigit(??)\ncurses.ascii.isgraph(??)\ncurses.ascii.islower(??)\ncurses.ascii.ismeta(??)\ncurses.ascii.isprint(??)\ncurses.ascii.ispunct(??)\ncurses.ascii.isspace(??)\ncurses.ascii.isupper(??)\ncurses.ascii.isxdigit(??)\ncurses.ascii.unctrl(??)\ncurses.baudrate(??)\ncurses.beep(??)\ncurses.can_change_color(??)\ncurses.cbreak(??)\ncurses.color_content(??)\ncurses.color_pair(??)\ncurses.curs_set(??)\ncurses.def_prog_mode(??)\ncurses.def_shell_mode(??)\ncurses.delay_output(??)\ncurses.doupdate(??)\ncurses.echo(??)\ncurses.endwin(??)\ncurses.erasechar(??)\ncurses.error(??)\ncurses.filter(??)\ncurses.flash(??)\ncurses.flushinp(??)\ncurses.getmouse(??)\ncurses.getsyx(??)\ncurses.getwin(??)\ncurses.halfdelay(??)\ncurses.has_colors(??)\ncurses.has_ic(??)\ncurses.has_il(??)\ncurses.has_key(??)\ncurses.has_key.has_key(??)\ncurses.init_color(??)\ncurses.init_pair(??)\ncurses.initscr(??)\ncurses.intrflush(??)\ncurses.is_term_resized(??)\ncurses.isendwin(??)\ncurses.keyname(??)\ncurses.killchar(??)\ncurses.longname(??)\ncurses.meta(??)\ncurses.mouseinterval(??)\ncurses.mousemask(??)\ncurses.napms(??)\ncurses.newpad(??)\ncurses.newwin(??)\ncurses.nl(??)\ncurses.nocbreak(??)\ncurses.noecho(??)\ncurses.nonl(??)\ncurses.noqiflush(??)\ncurses.noraw(??)\ncurses.pair_content(??)\ncurses.pair_number(??)\ncurses.panel.bottom_panel(??)\ncurses.panel.error(??)\ncurses.panel.new_panel(??)\ncurses.panel.top_panel(??)\ncurses.panel.update_panels(??)\ncurses.panel.version\ncurses.putp(??)\ncurses.qiflush(??)\ncurses.raw(??)\ncurses.reset_prog_mode(??)\ncurses.reset_shell_mode(??)\ncurses.resetty(??)\ncurses.resize_term(??)\ncurses.resizeterm(??)\ncurses.savetty(??)\ncurses.setsyx(??)\ncurses.setupterm(??)\ncurses.start_color(??)\ncurses.termattrs(??)\ncurses.termname(??)\ncurses.textpad.Textbox(??)\ncurses.textpad.curses(??)\ncurses.textpad.rectangle(??)\ncurses.tigetflag(??)\ncurses.tigetnum(??)\ncurses.tigetstr(??)\ncurses.tparm(??)\ncurses.typeahead(??)\ncurses.unctrl(??)\ncurses.unget_wch(??)\ncurses.ungetch(??)\ncurses.ungetmouse(??)\ncurses.use_default_colors(??)\ncurses.use_env(??)\ncurses.version\ncurses.wrapper(??)\ndatetime.MAXYEAR\ndatetime.MINYEAR\ndatetime.date(year, month, day) --> date object\ndatetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\ndatetime.datetime_CAPI(??)\ndatetime.time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\ndatetime.timedelta(??)\ndatetime.timezone(??)\ndatetime.tzinfo(??)\ndbm.dumb.collections(??)\ndbm.dumb.error(??)\ndbm.dumb.open(??)\ndbm.error(??)\ndbm.io(??)\ndbm.ndbm(??)\ndbm.ndbm.error(??)\ndbm.ndbm.library\ndbm.ndbm.open(??)\ndbm.open(??)\ndbm.os(??)\ndbm.struct(??)\ndbm.sys(??)\ndbm.whichdb(??)\ndecimal.BasicContext(??)\ndecimal.Clamped(??)\ndecimal.Context(??)\ndecimal.ConversionSyntax(??)\ndecimal.Decimal(??)\ndecimal.DecimalException(??)\ndecimal.DecimalTuple(sign, digits, exponent)\ndecimal.DefaultContext(??)\ndecimal.DivisionByZero(??)\ndecimal.DivisionImpossible(??)\ndecimal.DivisionUndefined(??)\ndecimal.ExtendedContext(??)\ndecimal.FloatOperation(??)\ndecimal.HAVE_THREADS(??)\ndecimal.Inexact(??)\ndecimal.InvalidContext(??)\ndecimal.InvalidOperation(??)\ndecimal.MAX_EMAX\ndecimal.MAX_PREC\ndecimal.MIN_EMIN\ndecimal.MIN_ETINY\ndecimal.Overflow(??)\ndecimal.ROUND_05UP\ndecimal.ROUND_CEILING\ndecimal.ROUND_DOWN\ndecimal.ROUND_FLOOR\ndecimal.ROUND_HALF_DOWN\ndecimal.ROUND_HALF_EVEN\ndecimal.ROUND_HALF_UP\ndecimal.ROUND_UP\ndecimal.Rounded(??)\ndecimal.Subnormal(??)\ndecimal.Underflow(??)\ndecimal.getcontext(??)\ndecimal.localcontext(??)\ndecimal.setcontext(??)\ndelattr(object, name)\ndict() -> new empty dictionary\ndifflib.Differ(??)\ndifflib.HtmlDiff(??)\ndifflib.IS_CHARACTER_JUNK(??)\ndifflib.IS_LINE_JUNK(??)\ndifflib.Match(a, b, size)\ndifflib.SequenceMatcher(??)\ndifflib.context_diff(??)\ndifflib.get_close_matches(??)\ndifflib.heapq(??)\ndifflib.ndiff(??)\ndifflib.restore(??)\ndifflib.unified_diff(??)\ndifflib.warnings(??)\ndir([object]) -> list of strings\ndis.Bytecode(??)\ndis.COMPILER_FLAG_NAMES(??)\ndis.EXTENDED_ARG\ndis.HAVE_ARGUMENT\ndis.Instruction(??)\ndis.cmp_op(??)\ndis.code_info(??)\ndis.collections(??)\ndis.dis(??)\ndis.disassemble(??)\ndis.disco(??)\ndis.distb(??)\ndis.findlabels(??)\ndis.findlinestarts(??)\ndis.get_instructions(??)\ndis.hascompare(??)\ndis.hasconst(??)\ndis.hasfree(??)\ndis.hasjabs(??)\ndis.hasjrel(??)\ndis.haslocal(??)\ndis.hasname(??)\ndis.hasnargs(??)\ndis.io(??)\ndis.opmap(??)\ndis.opname(??)\ndis.pretty_flags(??)\ndis.show_code(??)\ndis.stack_effect(??)\ndis.sys(??)\ndis.types(??)\ndivmod(x, y) -> (div, mod)\ndoctest.BLANKLINE_MARKER\ndoctest.COMPARISON_FLAGS\ndoctest.DONT_ACCEPT_BLANKLINE\ndoctest.DONT_ACCEPT_TRUE_FOR_1\ndoctest.DebugRunner(??)\ndoctest.DocFileCase(??)\ndoctest.DocFileSuite(??)\ndoctest.DocFileTest(??)\ndoctest.DocTest(??)\ndoctest.DocTestCase(??)\ndoctest.DocTestFailure(??)\ndoctest.DocTestFinder(??)\ndoctest.DocTestParser(??)\ndoctest.DocTestRunner(??)\ndoctest.DocTestSuite(??)\ndoctest.ELLIPSIS\ndoctest.ELLIPSIS_MARKER\ndoctest.Example(??)\ndoctest.FAIL_FAST\ndoctest.IGNORE_EXCEPTION_DETAIL\ndoctest.NORMALIZE_WHITESPACE\ndoctest.OPTIONFLAGS_BY_NAME(??)\ndoctest.OutputChecker(??)\ndoctest.REPORTING_FLAGS\ndoctest.REPORT_CDIFF\ndoctest.REPORT_NDIFF\ndoctest.REPORT_ONLY_FIRST_FAILURE\ndoctest.REPORT_UDIFF\ndoctest.SKIP\ndoctest.SkipDocTestCase(??)\ndoctest.StringIO(??)\ndoctest.TestResults(failed, attempted)\ndoctest.UnexpectedException(??)\ndoctest.argparse(??)\ndoctest.debug(??)\ndoctest.debug_script(??)\ndoctest.debug_src(??)\ndoctest.difflib(??)\ndoctest.inspect(??)\ndoctest.linecache(??)\ndoctest.master(??)\ndoctest.namedtuple(??)\ndoctest.os(??)\ndoctest.pdb(??)\ndoctest.re(??)\ndoctest.register_optionflag(??)\ndoctest.run_docstring_examples(??)\ndoctest.script_from_examples(??)\ndoctest.set_unittest_reportflags(??)\ndoctest.sys(??)\ndoctest.testfile(??)\ndoctest.testmod(??)\ndoctest.testsource(??)\ndoctest.traceback(??)\ndoctest.unittest(??)\ndummy_threading.Barrier(??)\ndummy_threading.BoundedSemaphore(??)\ndummy_threading.Condition(??)\ndummy_threading.Event(??)\ndummy_threading.Lock(??)\ndummy_threading.RLock(??)\ndummy_threading.Semaphore(??)\ndummy_threading.Thread(??)\ndummy_threading.ThreadError(??)\ndummy_threading.Timer(??)\ndummy_threading.active_count(??)\ndummy_threading.current_thread(??)\ndummy_threading.enumerate(??)\ndummy_threading.local(??)\ndummy_threading.setprofile(??)\ndummy_threading.settrace(??)\ndummy_threading.stack_size(??)\ndummy_threading.threading(??)\nemail.base64mime(??)\nemail.base64mime.CRLF\nemail.base64mime.EMPTYSTRING\nemail.base64mime.MISC_LEN\nemail.base64mime.NL\nemail.base64mime.a2b_base64(??)\nemail.base64mime.b2a_base64(??)\nemail.base64mime.b64encode(??)\nemail.base64mime.body_decode(??)\nemail.base64mime.body_encode(??)\nemail.base64mime.decode(??)\nemail.base64mime.decodestring(??)\nemail.base64mime.header_encode(??)\nemail.base64mime.header_length(??)\nemail.charset(??)\nemail.charset.ALIASES(??)\nemail.charset.BASE64\nemail.charset.CHARSETS(??)\nemail.charset.CODEC_MAP(??)\nemail.charset.Charset(??)\nemail.charset.DEFAULT_CHARSET\nemail.charset.EMPTYSTRING\nemail.charset.QP\nemail.charset.RFC2047_CHROME_LEN\nemail.charset.SHORTEST\nemail.charset.UNKNOWN8BIT\nemail.charset.add_alias(??)\nemail.charset.add_charset(??)\nemail.charset.add_codec(??)\nemail.charset.email(??)\nemail.charset.encode_7or8bit(??)\nemail.charset.errors(??)\nemail.charset.partial(func, *args, **keywords) - new function with partial application\nemail.contentmanager.ContentManager(??)\nemail.contentmanager.binascii(??)\nemail.contentmanager.email(??)\nemail.contentmanager.get_and_fixup_unknown_message_content(??)\nemail.contentmanager.get_message_content(??)\nemail.contentmanager.get_non_text_content(??)\nemail.contentmanager.get_text_content(??)\nemail.contentmanager.maintype\nemail.contentmanager.quoprimime(??)\nemail.contentmanager.raw_data_manager(??)\nemail.contentmanager.set_bytes_content(??)\nemail.contentmanager.set_message_content(??)\nemail.contentmanager.set_text_content(??)\nemail.contentmanager.subtype\nemail.contentmanager.typ(??)\nemail.encoders(??)\nemail.encoders.encode_7or8bit(??)\nemail.encoders.encode_base64(??)\nemail.encoders.encode_noop(??)\nemail.encoders.encode_quopri(??)\nemail.errors(??)\nemail.errors.BoundaryError(??)\nemail.errors.CharsetError(??)\nemail.errors.CloseBoundaryNotFoundDefect(??)\nemail.errors.FirstHeaderLineIsContinuationDefect(??)\nemail.errors.HeaderDefect(??)\nemail.errors.HeaderMissingRequiredValue(??)\nemail.errors.HeaderParseError(??)\nemail.errors.InvalidBase64CharactersDefect(??)\nemail.errors.InvalidBase64PaddingDefect(??)\nemail.errors.InvalidHeaderDefect(??)\nemail.errors.InvalidMultipartContentTransferEncodingDefect(??)\nemail.errors.MalformedHeaderDefect(??)\nemail.errors.MessageDefect(??)\nemail.errors.MessageError(??)\nemail.errors.MessageParseError(??)\nemail.errors.MisplacedEnvelopeHeaderDefect(??)\nemail.errors.MissingHeaderBodySeparatorDefect(??)\nemail.errors.MultipartConversionError(??)\nemail.errors.MultipartInvariantViolationDefect(??)\nemail.errors.NoBoundaryInMultipartDefect(??)\nemail.errors.NonASCIILocalPartDefect(??)\nemail.errors.NonPrintableDefect(??)\nemail.errors.ObsoleteHeaderDefect(??)\nemail.errors.StartBoundaryNotFoundDefect(??)\nemail.errors.UndecodableBytesDefect(??)\nemail.feedparser(??)\nemail.feedparser.BufferedSubFile(??)\nemail.feedparser.BytesFeedParser(??)\nemail.feedparser.EMPTYSTRING\nemail.feedparser.FeedParser(??)\nemail.feedparser.NL\nemail.feedparser.NLCRE(??)\nemail.feedparser.NLCRE_bol(??)\nemail.feedparser.NLCRE_crack(??)\nemail.feedparser.NLCRE_eol(??)\nemail.feedparser.NeedMoreData(??)\nemail.feedparser.compat32(??)\nemail.feedparser.errors(??)\nemail.feedparser.headerRE(??)\nemail.feedparser.message(??)\nemail.feedparser.re(??)\nemail.generator.BytesGenerator(??)\nemail.generator.BytesIO([buffer]) -> object\nemail.generator.DecodedGenerator(??)\nemail.generator.Generator(??)\nemail.generator.Header(??)\nemail.generator.NL\nemail.generator.StringIO(??)\nemail.generator.UNDERSCORE\nemail.generator.compat32(??)\nemail.generator.deepcopy(??)\nemail.generator.fcre(??)\nemail.generator.random(??)\nemail.generator.re(??)\nemail.generator.sys(??)\nemail.generator.time(??)\nemail.generator.warnings(??)\nemail.header(??)\nemail.header.BSPACE\nemail.header.Charset(??)\nemail.header.EMPTYSTRING\nemail.header.FWS\nemail.header.Header(??)\nemail.header.HeaderParseError(??)\nemail.header.MAXLINELEN\nemail.header.NL\nemail.header.SPACE\nemail.header.SPACE8\nemail.header.USASCII(??)\nemail.header.UTF8(??)\nemail.header.binascii(??)\nemail.header.decode_header(??)\nemail.header.ecre(??)\nemail.header.email(??)\nemail.header.fcre(??)\nemail.header.make_header(??)\nemail.header.re(??)\nemail.headerregistry.Address(??)\nemail.headerregistry.AddressHeader(??)\nemail.headerregistry.BaseHeader(??)\nemail.headerregistry.ContentDispositionHeader(??)\nemail.headerregistry.ContentTransferEncodingHeader(??)\nemail.headerregistry.ContentTypeHeader(??)\nemail.headerregistry.DateHeader(??)\nemail.headerregistry.Group(??)\nemail.headerregistry.HeaderRegistry(??)\nemail.headerregistry.MIMEVersionHeader(??)\nemail.headerregistry.ParameterizedMIMEHeader(??)\nemail.headerregistry.SingleAddressHeader(??)\nemail.headerregistry.UniqueAddressHeader(??)\nemail.headerregistry.UniqueDateHeader(??)\nemail.headerregistry.UniqueSingleAddressHeader(??)\nemail.headerregistry.UniqueUnstructuredHeader(??)\nemail.headerregistry.UnstructuredHeader(??)\nemail.headerregistry.errors(??)\nemail.headerregistry.parser(??)\nemail.headerregistry.utils(??)\nemail.iterators(??)\nemail.iterators.StringIO(??)\nemail.iterators.body_line_iterator(??)\nemail.iterators.sys(??)\nemail.iterators.typed_subpart_iterator(??)\nemail.iterators.walk(??)\nemail.message(??)\nemail.message.BytesIO([buffer]) -> object\nemail.message.Charset(??)\nemail.message.EmailMessage(??)\nemail.message.MIMEPart(??)\nemail.message.Message(??)\nemail.message.SEMISPACE\nemail.message.StringIO(??)\nemail.message.compat32(??)\nemail.message.decode_b(??)\nemail.message.errors(??)\nemail.message.re(??)\nemail.message.tspecials(??)\nemail.message.utils(??)\nemail.message.uu(??)\nemail.message_from_binary_file(??)\nemail.message_from_bytes(??)\nemail.message_from_file(??)\nemail.message_from_string(??)\nemail.mime.application.MIMEApplication(??)\nemail.mime.application.MIMENonMultipart(??)\nemail.mime.application.encoders(??)\nemail.mime.audio.BytesIO([buffer]) -> object\nemail.mime.audio.MIMEAudio(??)\nemail.mime.audio.MIMENonMultipart(??)\nemail.mime.audio.encoders(??)\nemail.mime.audio.sndhdr(??)\nemail.mime.base.MIMEBase(??)\nemail.mime.base.message(??)\nemail.mime.image.MIMEImage(??)\nemail.mime.image.MIMENonMultipart(??)\nemail.mime.image.encoders(??)\nemail.mime.image.imghdr(??)\nemail.mime.message.MIMEMessage(??)\nemail.mime.message.MIMENonMultipart(??)\nemail.mime.message.message(??)\nemail.mime.multipart.MIMEBase(??)\nemail.mime.multipart.MIMEMultipart(??)\nemail.mime.nonmultipart.MIMEBase(??)\nemail.mime.nonmultipart.MIMENonMultipart(??)\nemail.mime.nonmultipart.errors(??)\nemail.mime.text.MIMENonMultipart(??)\nemail.mime.text.MIMEText(??)\nemail.mime.text.encode_7or8bit(??)\nemail.parser(??)\nemail.parser.BytesFeedParser(??)\nemail.parser.BytesHeaderParser(??)\nemail.parser.BytesParser(??)\nemail.parser.FeedParser(??)\nemail.parser.HeaderParser(??)\nemail.parser.Message(??)\nemail.parser.Parser(??)\nemail.parser.StringIO(??)\nemail.parser.TextIOWrapper(??)\nemail.parser.compat32(??)\nemail.parser.warnings(??)\nemail.policy.Compat32(??)\nemail.policy.EmailPolicy(??)\nemail.policy.HTTP(??)\nemail.policy.HeaderRegistry(??)\nemail.policy.Policy(??)\nemail.policy.SMTP(??)\nemail.policy.compat32(??)\nemail.policy.default(??)\nemail.policy.raw_data_manager(??)\nemail.policy.strict(??)\nemail.quoprimime(??)\nemail.quoprimime.CRLF\nemail.quoprimime.EMPTYSTRING\nemail.quoprimime.NL\nemail.quoprimime.ascii_letters\nemail.quoprimime.body_check(??)\nemail.quoprimime.body_decode(??)\nemail.quoprimime.body_encode(??)\nemail.quoprimime.body_length(??)\nemail.quoprimime.c\nemail.quoprimime.decode(??)\nemail.quoprimime.decodestring(??)\nemail.quoprimime.digits\nemail.quoprimime.header_check(??)\nemail.quoprimime.header_decode(??)\nemail.quoprimime.header_encode(??)\nemail.quoprimime.header_length(??)\nemail.quoprimime.hexdigits\nemail.quoprimime.io(??)\nemail.quoprimime.quote(??)\nemail.quoprimime.re(??)\nemail.quoprimime.unquote(??)\nemail.utils(??)\nemail.utils.COMMASPACE\nemail.utils.CRLF\nemail.utils.Charset(??)\nemail.utils.EMPTYSTRING\nemail.utils.StringIO(??)\nemail.utils.TICK\nemail.utils.UEMPTYSTRING\nemail.utils.base64(??)\nemail.utils.collapse_rfc2231_value(??)\nemail.utils.datetime(??)\nemail.utils.decode_params(??)\nemail.utils.decode_rfc2231(??)\nemail.utils.ecre(??)\nemail.utils.encode_rfc2231(??)\nemail.utils.escapesre(??)\nemail.utils.format_datetime(??)\nemail.utils.formataddr(??)\nemail.utils.formatdate(??)\nemail.utils.getaddresses(??)\nemail.utils.localtime(??)\nemail.utils.make_msgid(??)\nemail.utils.mktime_tz(??)\nemail.utils.os(??)\nemail.utils.parseaddr(??)\nemail.utils.parsedate(??)\nemail.utils.parsedate_to_datetime(??)\nemail.utils.parsedate_tz(??)\nemail.utils.quote(??)\nemail.utils.random(??)\nemail.utils.re(??)\nemail.utils.rfc2231_continuation(??)\nemail.utils.socket(??)\nemail.utils.specialsre(??)\nemail.utils.time(??)\nemail.utils.unquote(??)\nemail.utils.urllib(??)\nemail.utils.warnings(??)\nensurepip.bootstrap(??)\nensurepip.os(??)\nensurepip.pkgutil(??)\nensurepip.ssl(??)\nensurepip.sys(??)\nensurepip.tempfile(??)\nensurepip.version(??)\nenum.DynamicClassAttribute(??)\nenum.Enum(??)\nenum.EnumMeta(??)\nenum.IntEnum(??)\nenum.MappingProxyType(??)\nenum.OrderedDict(??)\nenum.sys(??)\nenum.unique(??)\nenumerate(iterable[, start]) -> iterator for index, value of iterable\nerrno.E2BIG\nerrno.EACCES\nerrno.EADDRINUSE\nerrno.EADDRNOTAVAIL\nerrno.EAFNOSUPPORT\nerrno.EAGAIN\nerrno.EALREADY\nerrno.EAUTH\nerrno.EBADARCH\nerrno.EBADEXEC\nerrno.EBADF\nerrno.EBADMACHO\nerrno.EBADMSG\nerrno.EBADRPC\nerrno.EBUSY\nerrno.ECANCELED\nerrno.ECHILD\nerrno.ECONNABORTED\nerrno.ECONNREFUSED\nerrno.ECONNRESET\nerrno.EDEADLK\nerrno.EDESTADDRREQ\nerrno.EDEVERR\nerrno.EDOM\nerrno.EDQUOT\nerrno.EEXIST\nerrno.EFAULT\nerrno.EFBIG\nerrno.EFTYPE\nerrno.EHOSTDOWN\nerrno.EHOSTUNREACH\nerrno.EIDRM\nerrno.EILSEQ\nerrno.EINPROGRESS\nerrno.EINTR\nerrno.EINVAL\nerrno.EIO\nerrno.EISCONN\nerrno.EISDIR\nerrno.ELOOP\nerrno.EMFILE\nerrno.EMLINK\nerrno.EMSGSIZE\nerrno.EMULTIHOP\nerrno.ENAMETOOLONG\nerrno.ENEEDAUTH\nerrno.ENETDOWN\nerrno.ENETRESET\nerrno.ENETUNREACH\nerrno.ENFILE\nerrno.ENOATTR\nerrno.ENOBUFS\nerrno.ENODATA\nerrno.ENODEV\nerrno.ENOENT\nerrno.ENOEXEC\nerrno.ENOLCK\nerrno.ENOLINK\nerrno.ENOMEM\nerrno.ENOMSG\nerrno.ENOPOLICY\nerrno.ENOPROTOOPT\nerrno.ENOSPC\nerrno.ENOSR\nerrno.ENOSTR\nerrno.ENOSYS\nerrno.ENOTBLK\nerrno.ENOTCONN\nerrno.ENOTDIR\nerrno.ENOTEMPTY\nerrno.ENOTSOCK\nerrno.ENOTSUP\nerrno.ENOTTY\nerrno.ENXIO\nerrno.EOPNOTSUPP\nerrno.EOVERFLOW\nerrno.EPERM\nerrno.EPFNOSUPPORT\nerrno.EPIPE\nerrno.EPROCLIM\nerrno.EPROCUNAVAIL\nerrno.EPROGMISMATCH\nerrno.EPROGUNAVAIL\nerrno.EPROTO\nerrno.EPROTONOSUPPORT\nerrno.EPROTOTYPE\nerrno.EPWROFF\nerrno.ERANGE\nerrno.EREMOTE\nerrno.EROFS\nerrno.ERPCMISMATCH\nerrno.ESHLIBVERS\nerrno.ESHUTDOWN\nerrno.ESOCKTNOSUPPORT\nerrno.ESPIPE\nerrno.ESRCH\nerrno.ESTALE\nerrno.ETIME\nerrno.ETIMEDOUT\nerrno.ETOOMANYREFS\nerrno.ETXTBSY\nerrno.EUSERS\nerrno.EWOULDBLOCK\nerrno.EXDEV\nerrno.errorcode(??)\neval(source[, globals[, locals]]) -> value\nexec(object[, globals[, locals]])\nexit(??)\nfaulthandler.cancel_dump_traceback_later():\nfaulthandler.disable(): disable the fault handler\nfaulthandler.dump_traceback(file=sys.stderr, all_threads=True): dump the traceback of the current thread, or of all threads if all_threads is True, into file\nfaulthandler.dump_traceback_later(timeout, repeat=False, file=sys.stderrn, exit=False):\nfaulthandler.enable(file=sys.stderr, all_threads=True): enable the fault handler\nfaulthandler.is_enabled()->bool: check if the handler is enabled\nfaulthandler.register(signum, file=sys.stderr, all_threads=True, chain=False): register an handler for the signal 'signum': dump the traceback of the current thread, or of all threads if all_threads is True, into file\nfaulthandler.unregister(signum): unregister the handler of the signal 'signum' registered by register()\nfcntl.FASYNC\nfcntl.FD_CLOEXEC\nfcntl.F_DUPFD\nfcntl.F_FULLFSYNC\nfcntl.F_GETFD\nfcntl.F_GETFL\nfcntl.F_GETLK\nfcntl.F_GETOWN\nfcntl.F_NOCACHE\nfcntl.F_RDLCK\nfcntl.F_SETFD\nfcntl.F_SETFL\nfcntl.F_SETLK\nfcntl.F_SETLKW\nfcntl.F_SETOWN\nfcntl.F_UNLCK\nfcntl.F_WRLCK\nfcntl.LOCK_EX\nfcntl.LOCK_NB\nfcntl.LOCK_SH\nfcntl.LOCK_UN\nfcntl.fcntl(fd, op, [arg])\nfcntl.flock(fd, operation)\nfcntl.ioctl(fd, op[, arg[, mutate_flag]])\nfcntl.lockf (fd, operation, length=0, start=0, whence=0)\nfilecmp.BUFSIZE\nfilecmp.DEFAULT_IGNORES(??)\nfilecmp.clear_cache(??)\nfilecmp.cmp(??)\nfilecmp.cmpfiles(??)\nfilecmp.demo(??)\nfilecmp.dircmp(??)\nfilecmp.filterfalse(function or None, sequence) --> filterfalse object\nfilecmp.os(??)\nfilecmp.stat(??)\nfileinput.DEFAULT_BUFSIZE\nfileinput.FileInput([files[, inplace[, backup[, bufsize, [, mode[, openhook]]]]]])\nfileinput.close(??)\nfileinput.filelineno(??)\nfileinput.filename(??)\nfileinput.fileno(??)\nfileinput.hook_compressed(??)\nfileinput.hook_encoded(??)\nfileinput.input(??)\nfileinput.isfirstline(??)\nfileinput.isstdin(??)\nfileinput.lineno(??)\nfileinput.nextfile(??)\nfileinput.os(??)\nfileinput.sys(??)\nfilter(function or None, iterable) --> filter object\nfloat(x) -> floating point number\nfnmatch.filter(??)\nfnmatch.fnmatch(??)\nfnmatch.fnmatchcase(??)\nfnmatch.functools(??)\nfnmatch.os(??)\nfnmatch.posixpath(??)\nfnmatch.re(??)\nfnmatch.translate(??)\nformat(value[, format_spec]) -> string\nformatter.AS_IS(??)\nformatter.AbstractFormatter(??)\nformatter.AbstractWriter(??)\nformatter.DumbWriter(??)\nformatter.NullFormatter(??)\nformatter.NullWriter(??)\nformatter.sys(??)\nformatter.test(??)\nformatter.warnings(??)\nfractions.Decimal(??)\nfractions.Fraction(??)\nfractions.gcd(??)\nfractions.math(??)\nfractions.numbers(??)\nfractions.operator(??)\nfractions.re(??)\nfractions.sys(??)\nfrozenset() -> empty frozenset object\nftplib.B_CRLF\nftplib.CRLF\nftplib.Error(??)\nftplib.FTP(??)\nftplib.FTP_PORT\nftplib.FTP_TLS(??)\nftplib.MAXLINE\nftplib.MSG_OOB\nftplib.Netrc(??)\nftplib.all_errors(??)\nftplib.error_perm(??)\nftplib.error_proto(??)\nftplib.error_reply(??)\nftplib.error_temp(??)\nftplib.ftpcp(??)\nftplib.os(??)\nftplib.parse150(??)\nftplib.parse227(??)\nftplib.parse229(??)\nftplib.parse257(??)\nftplib.print_line(??)\nftplib.socket(??)\nftplib.ssl(??)\nftplib.sys(??)\nftplib.test(??)\nftplib.warnings(??)\nfunctools.MappingProxyType(??)\nfunctools.MethodType(??)\nfunctools.RLock(??)\nfunctools.WRAPPER_ASSIGNMENTS(??)\nfunctools.WRAPPER_UPDATES(??)\nfunctools.WeakKeyDictionary(??)\nfunctools.cmp_to_key(??)\nfunctools.get_cache_token(??)\nfunctools.lru_cache(??)\nfunctools.namedtuple(??)\nfunctools.partial(func, *args, **keywords) - new function with partial application\nfunctools.partialmethod(??)\nfunctools.reduce(function, sequence[, initial]) -> value\nfunctools.singledispatch(??)\nfunctools.total_ordering(??)\nfunctools.update_wrapper(??)\nfunctools.wraps(??)\ngc.DEBUG_COLLECTABLE\ngc.DEBUG_LEAK\ngc.DEBUG_SAVEALL\ngc.DEBUG_STATS\ngc.DEBUG_UNCOLLECTABLE\ngc.callbacks(??)\ngc.collect([generation]) -> n\ngc.disable() -> None\ngc.enable() -> None\ngc.garbage(??)\ngc.get_count() -> (count0, count1, count2)\ngc.get_debug() -> flags\ngc.get_objects() -> [...]\ngc.get_referents(*objs) -> list\ngc.get_referrers(*objs) -> list\ngc.get_stats() -> [...]\ngc.get_threshold() -> (threshold0, threshold1, threshold2)\ngc.is_tracked(obj) -> bool\ngc.isenabled() -> status\ngc.set_debug(flags) -> None\ngc.set_threshold(threshold0, [threshold1, threshold2]) -> None\ngenericpath.commonprefix(??)\ngenericpath.exists(??)\ngenericpath.getatime(??)\ngenericpath.getctime(??)\ngenericpath.getmtime(??)\ngenericpath.getsize(??)\ngenericpath.isdir(??)\ngenericpath.isfile(??)\ngenericpath.os(??)\ngenericpath.samefile(??)\ngenericpath.sameopenfile(??)\ngenericpath.samestat(??)\ngenericpath.stat(??)\ngetattr(object, name[, default]) -> value\ngetopt.GetoptError(??)\ngetopt.do_longs(??)\ngetopt.do_shorts(??)\ngetopt.error(??)\ngetopt.getopt(args, options[, long_options]) -> opts, args\ngetopt.gnu_getopt(??)\ngetopt.long_has_args(??)\ngetopt.os(??)\ngetopt.short_has_arg(??)\ngetpass.GetPassWarning(??)\ngetpass.contextlib(??)\ngetpass.fallback_getpass(??)\ngetpass.getpass(??)\ngetpass.getuser(??)\ngetpass.io(??)\ngetpass.os(??)\ngetpass.sys(??)\ngetpass.termios(??)\ngetpass.unix_getpass(??)\ngetpass.warnings(??)\ngetpass.win_getpass(??)\ngettext.Catalog(??)\ngettext.ENOENT\ngettext.GNUTranslations(??)\ngettext.NullTranslations(??)\ngettext.bind_textdomain_codeset(??)\ngettext.bindtextdomain(??)\ngettext.c2py(??)\ngettext.copy(??)\ngettext.dgettext(??)\ngettext.dngettext(??)\ngettext.find(??)\ngettext.gettext(??)\ngettext.install(??)\ngettext.io(??)\ngettext.ldgettext(??)\ngettext.ldngettext(??)\ngettext.lgettext(??)\ngettext.lngettext(??)\ngettext.locale(??)\ngettext.ngettext(??)\ngettext.os(??)\ngettext.re(??)\ngettext.struct(??)\ngettext.sys(??)\ngettext.textdomain(??)\ngettext.translation(??)\nglob.escape(??)\nglob.fnmatch(??)\nglob.glob(??)\nglob.glob0(??)\nglob.glob1(??)\nglob.has_magic(??)\nglob.iglob(??)\nglob.magic_check(??)\nglob.magic_check_bytes(??)\nglob.os(??)\nglob.re(??)\nglobals() -> dictionary\ngrp.getgrall() -> list of tuples\ngrp.getgrgid(id) -> tuple\ngrp.getgrnam(name) -> tuple\ngrp.struct_group(??)\ngzip.FCOMMENT\ngzip.FEXTRA\ngzip.FHCRC\ngzip.FNAME\ngzip.FTEXT\ngzip.GzipFile(??)\ngzip.READ\ngzip.WRITE\ngzip.builtins(??)\ngzip.compress(??)\ngzip.decompress(??)\ngzip.io(??)\ngzip.open(??)\ngzip.os(??)\ngzip.struct(??)\ngzip.sys(??)\ngzip.time(??)\ngzip.write32u(??)\ngzip.zlib(??)\nhasattr(object, name) -> bool\nhash(object) -> integer\nhashlib.algorithms_available(??)\nhashlib.algorithms_guaranteed(??)\nhashlib.md5(??)\nhashlib.new(name, data=b'') - Return a new hashing object using the named algorithm;\nhashlib.pbkdf2_hmac(??)\nhashlib.sha1(??)\nhashlib.sha224(??)\nhashlib.sha256(??)\nhashlib.sha384(??)\nhashlib.sha512(??)\nheapq.chain(*iterables) --> chain object\nheapq.count(start=0, step=1) --> count object\nheapq.heapify(??)\nheapq.heappop(??)\nheapq.heappush(heap, item) -> None. Push item onto heap, maintaining the heap invariant.\nheapq.heappushpop(heap, item) -> value. Push item on the heap, then pop and return the smallest item\nheapq.heapreplace(heap, item) -> value. Pop and return the current smallest value, and add the new item.\nheapq.islice(iterable, stop) --> islice object\nheapq.merge(??)\nheapq.nlargest(??)\nheapq.nsmallest(??)\nheapq.tee(iterable, n=2) --> tuple of n independent iterators.\nhelp(??)\nhex(number) -> string\nhmac.HMAC(??)\nhmac.compare_digest(a, b) -> bool\nhmac.digest_size(??)\nhmac.new(??)\nhmac.trans_36\nhmac.trans_5C\nhtml.entities(??)\nhtml.entities.codepoint2name(??)\nhtml.entities.entitydefs(??)\nhtml.entities.html5(??)\nhtml.entities.name2codepoint(??)\nhtml.escape(??)\nhtml.parser.HTMLParseError(??)\nhtml.parser.HTMLParser(??)\nhtml.parser.attrfind(??)\nhtml.parser.attrfind_tolerant(??)\nhtml.parser.charref(??)\nhtml.parser.commentclose(??)\nhtml.parser.endendtag(??)\nhtml.parser.endtagfind(??)\nhtml.parser.entityref(??)\nhtml.parser.incomplete(??)\nhtml.parser.interesting_normal(??)\nhtml.parser.locatestarttagend(??)\nhtml.parser.locatestarttagend_tolerant(??)\nhtml.parser.piclose(??)\nhtml.parser.re(??)\nhtml.parser.starttagopen(??)\nhtml.parser.tagfind(??)\nhtml.parser.tagfind_tolerant(??)\nhtml.parser.unescape(??)\nhtml.parser.warnings(??)\nhtml.unescape(??)\nhttp.client(??)\nhttp.client.ACCEPTED\nhttp.client.BAD_GATEWAY\nhttp.client.BAD_REQUEST\nhttp.client.BadStatusLine(??)\nhttp.client.CONFLICT\nhttp.client.CONTINUE\nhttp.client.CREATED\nhttp.client.CannotSendHeader(??)\nhttp.client.CannotSendRequest(??)\nhttp.client.EXPECTATION_FAILED\nhttp.client.FAILED_DEPENDENCY\nhttp.client.FORBIDDEN\nhttp.client.FOUND\nhttp.client.GATEWAY_TIMEOUT\nhttp.client.GONE\nhttp.client.HTTPConnection(??)\nhttp.client.HTTPException(??)\nhttp.client.HTTPMessage(??)\nhttp.client.HTTPResponse(??)\nhttp.client.HTTPSConnection(??)\nhttp.client.HTTPS_PORT\nhttp.client.HTTP_PORT\nhttp.client.HTTP_VERSION_NOT_SUPPORTED\nhttp.client.IM_USED\nhttp.client.INSUFFICIENT_STORAGE\nhttp.client.INTERNAL_SERVER_ERROR\nhttp.client.ImproperConnectionState(??)\nhttp.client.IncompleteRead(??)\nhttp.client.InvalidURL(??)\nhttp.client.LENGTH_REQUIRED\nhttp.client.LOCKED\nhttp.client.LineTooLong(??)\nhttp.client.MAXAMOUNT\nhttp.client.METHOD_NOT_ALLOWED\nhttp.client.MOVED_PERMANENTLY\nhttp.client.MULTIPLE_CHOICES\nhttp.client.MULTI_STATUS\nhttp.client.NETWORK_AUTHENTICATION_REQUIRED\nhttp.client.NON_AUTHORITATIVE_INFORMATION\nhttp.client.NOT_ACCEPTABLE\nhttp.client.NOT_EXTENDED\nhttp.client.NOT_FOUND\nhttp.client.NOT_IMPLEMENTED\nhttp.client.NOT_MODIFIED\nhttp.client.NO_CONTENT\nhttp.client.NotConnected(??)\nhttp.client.OK\nhttp.client.PARTIAL_CONTENT\nhttp.client.PAYMENT_REQUIRED\nhttp.client.PRECONDITION_FAILED\nhttp.client.PRECONDITION_REQUIRED\nhttp.client.PROCESSING\nhttp.client.PROXY_AUTHENTICATION_REQUIRED\nhttp.client.REQUESTED_RANGE_NOT_SATISFIABLE\nhttp.client.REQUEST_ENTITY_TOO_LARGE\nhttp.client.REQUEST_HEADER_FIELDS_TOO_LARGE\nhttp.client.REQUEST_TIMEOUT\nhttp.client.REQUEST_URI_TOO_LONG\nhttp.client.RESET_CONTENT\nhttp.client.ResponseNotReady(??)\nhttp.client.SEE_OTHER\nhttp.client.SERVICE_UNAVAILABLE\nhttp.client.SWITCHING_PROTOCOLS\nhttp.client.TEMPORARY_REDIRECT\nhttp.client.TOO_MANY_REQUESTS\nhttp.client.UNAUTHORIZED\nhttp.client.UNPROCESSABLE_ENTITY\nhttp.client.UNSUPPORTED_MEDIA_TYPE\nhttp.client.UPGRADE_REQUIRED\nhttp.client.USE_PROXY\nhttp.client.UnimplementedFileMode(??)\nhttp.client.UnknownProtocol(??)\nhttp.client.UnknownTransferEncoding(??)\nhttp.client.collections(??)\nhttp.client.email(??)\nhttp.client.error(??)\nhttp.client.io(??)\nhttp.client.os(??)\nhttp.client.parse_headers(??)\nhttp.client.responses(??)\nhttp.client.socket(??)\nhttp.client.ssl(??)\nhttp.client.urlsplit(??)\nhttp.client.warnings(??)\nhttp.cookiejar.Absent(??)\nhttp.cookiejar.Cookie(??)\nhttp.cookiejar.CookieJar(??)\nhttp.cookiejar.CookiePolicy(??)\nhttp.cookiejar.DAYS(??)\nhttp.cookiejar.DEFAULT_HTTP_PORT\nhttp.cookiejar.DefaultCookiePolicy(??)\nhttp.cookiejar.EPOCH_YEAR\nhttp.cookiejar.ESCAPED_CHAR_RE(??)\nhttp.cookiejar.FileCookieJar(??)\nhttp.cookiejar.HEADER_ESCAPE_RE(??)\nhttp.cookiejar.HEADER_JOIN_ESCAPE_RE(??)\nhttp.cookiejar.HEADER_QUOTED_VALUE_RE(??)\nhttp.cookiejar.HEADER_TOKEN_RE(??)\nhttp.cookiejar.HEADER_VALUE_RE(??)\nhttp.cookiejar.HTTP_PATH_SAFE\nhttp.cookiejar.IPV4_RE(??)\nhttp.cookiejar.ISO_DATE_RE(??)\nhttp.cookiejar.LOOSE_HTTP_DATE_RE(??)\nhttp.cookiejar.LWPCookieJar(??)\nhttp.cookiejar.LoadError(??)\nhttp.cookiejar.MISSING_FILENAME_TEXT\nhttp.cookiejar.MONTHS(??)\nhttp.cookiejar.MONTHS_LOWER(??)\nhttp.cookiejar.MozillaCookieJar(??)\nhttp.cookiejar.STRICT_DATE_RE(??)\nhttp.cookiejar.TIMEZONE_RE(??)\nhttp.cookiejar.UTC_ZONES(??)\nhttp.cookiejar.WEEKDAY_RE(??)\nhttp.cookiejar.copy(??)\nhttp.cookiejar.cut_port_re(??)\nhttp.cookiejar.datetime(??)\nhttp.cookiejar.debug(??)\nhttp.cookiejar.deepvalues(??)\nhttp.cookiejar.domain_match(??)\nhttp.cookiejar.eff_request_host(??)\nhttp.cookiejar.escape_path(??)\nhttp.cookiejar.http(??)\nhttp.cookiejar.http2time(??)\nhttp.cookiejar.is_HDN(??)\nhttp.cookiejar.is_third_party(??)\nhttp.cookiejar.iso2time(??)\nhttp.cookiejar.join_header_words(??)\nhttp.cookiejar.liberal_is_HDN(??)\nhttp.cookiejar.logger(??)\nhttp.cookiejar.lwp_cookie_str(??)\nhttp.cookiejar.month\nhttp.cookiejar.offset_from_tz_string(??)\nhttp.cookiejar.parse_ns_headers(??)\nhttp.cookiejar.re(??)\nhttp.cookiejar.reach(??)\nhttp.cookiejar.request_host(??)\nhttp.cookiejar.request_path(??)\nhttp.cookiejar.request_port(??)\nhttp.cookiejar.split_header_words(??)\nhttp.cookiejar.strip_quotes(??)\nhttp.cookiejar.time(??)\nhttp.cookiejar.time2isoz(??)\nhttp.cookiejar.time2netscape(??)\nhttp.cookiejar.timegm(??)\nhttp.cookiejar.unmatched(??)\nhttp.cookiejar.uppercase_escaped_char(??)\nhttp.cookiejar.urllib(??)\nhttp.cookiejar.user_domain_match(??)\nhttp.cookiejar.vals_sorted_by_key(??)\nhttp.cookies.BaseCookie(??)\nhttp.cookies.CookieError(??)\nhttp.cookies.Morsel(??)\nhttp.cookies.SimpleCookie(??)\nhttp.cookies.re(??)\nhttp.cookies.string(??)\nhttp.server(??)\nhttp.server.BaseHTTPRequestHandler(??)\nhttp.server.CGIHTTPRequestHandler(??)\nhttp.server.DEFAULT_ERROR_CONTENT_TYPE\nhttp.server.DEFAULT_ERROR_MESSAGE\nhttp.server.HTTPServer(??)\nhttp.server.SimpleHTTPRequestHandler(??)\nhttp.server.argparse(??)\nhttp.server.copy(??)\nhttp.server.email(??)\nhttp.server.executable(??)\nhttp.server.html(??)\nhttp.server.http(??)\nhttp.server.io(??)\nhttp.server.mimetypes(??)\nhttp.server.nobody(??)\nhttp.server.nobody_uid(??)\nhttp.server.os(??)\nhttp.server.posixpath(??)\nhttp.server.select(??)\nhttp.server.shutil(??)\nhttp.server.socket(??)\nhttp.server.socketserver(??)\nhttp.server.sys(??)\nhttp.server.test(??)\nhttp.server.time(??)\nhttp.server.urllib(??)\nid(object) -> integer\nimaplib.AllowedVersions(??)\nimaplib.CRLF\nimaplib.Commands(??)\nimaplib.Continuation(??)\nimaplib.DEFAULT_BUFFER_SIZE\nimaplib.Debug\nimaplib.Flags(??)\nimaplib.HAVE_SSL(??)\nimaplib.IMAP4(??)\nimaplib.IMAP4_PORT\nimaplib.IMAP4_SSL(??)\nimaplib.IMAP4_SSL_PORT\nimaplib.IMAP4_stream(??)\nimaplib.Int2AP(??)\nimaplib.InternalDate(??)\nimaplib.Internaldate2tuple(??)\nimaplib.Literal(??)\nimaplib.MapCRLF(??)\nimaplib.Mon2num(??)\nimaplib.Months(??)\nimaplib.ParseFlags(??)\nimaplib.Response_code(??)\nimaplib.Time2Internaldate(??)\nimaplib.Untagged_response(??)\nimaplib.Untagged_status(??)\nimaplib.binascii(??)\nimaplib.calendar(??)\nimaplib.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\nimaplib.errno(??)\nimaplib.random(??)\nimaplib.re(??)\nimaplib.socket(??)\nimaplib.ssl(??)\nimaplib.subprocess(??)\nimaplib.sys(??)\nimaplib.time(??)\nimaplib.timedelta(??)\nimaplib.timezone(??)\nimghdr.test(??)\nimghdr.test_bmp(??)\nimghdr.test_gif(??)\nimghdr.test_jpeg(??)\nimghdr.test_pbm(??)\nimghdr.test_pgm(??)\nimghdr.test_png(??)\nimghdr.test_ppm(??)\nimghdr.test_rast(??)\nimghdr.test_rgb(??)\nimghdr.test_tiff(??)\nimghdr.test_xbm(??)\nimghdr.testall(??)\nimghdr.tests(??)\nimghdr.what(??)\nimp.C_BUILTIN\nimp.C_EXTENSION\nimp.IMP_HOOK\nimp.NullImporter(??)\nimp.PKG_DIRECTORY\nimp.PY_CODERESOURCE\nimp.PY_COMPILED\nimp.PY_FROZEN\nimp.PY_RESOURCE\nimp.PY_SOURCE\nimp.SEARCH_ERROR\nimp.SourcelessFileLoader(??)\nimp.acquire_lock(??)\nimp.cache_from_source(??)\nimp.find_module(??)\nimp.get_frozen_object(??)\nimp.get_magic(??)\nimp.get_suffixes(??)\nimp.get_tag(??)\nimp.importlib(??)\nimp.init_builtin(??)\nimp.init_frozen(??)\nimp.is_builtin(??)\nimp.is_frozen(??)\nimp.is_frozen_package(??)\nimp.load_compiled(??)\nimp.load_dynamic(??)\nimp.load_module(??)\nimp.load_package(??)\nimp.load_source(??)\nimp.lock_held(??)\nimp.machinery(??)\nimp.new_module(??)\nimp.os(??)\nimp.release_lock(??)\nimp.reload(??)\nimp.source_from_cache(??)\nimp.sys(??)\nimp.tokenize(??)\nimp.types(??)\nimp.util(??)\nimp.warnings(??)\nimportlib.abc.ExecutionLoader(??)\nimportlib.abc.FileLoader(??)\nimportlib.abc.Finder(??)\nimportlib.abc.InspectLoader(??)\nimportlib.abc.Loader(??)\nimportlib.abc.MetaPathFinder(??)\nimportlib.abc.PathEntryFinder(??)\nimportlib.abc.ResourceLoader(??)\nimportlib.abc.SourceLoader(??)\nimportlib.abc.abc(??)\nimportlib.abc.machinery(??)\nimportlib.find_loader(??)\nimportlib.import_module(??)\nimportlib.invalidate_caches(??)\nimportlib.machinery(??)\nimportlib.machinery.BYTECODE_SUFFIXES(??)\nimportlib.machinery.BuiltinImporter(??)\nimportlib.machinery.DEBUG_BYTECODE_SUFFIXES(??)\nimportlib.machinery.EXTENSION_SUFFIXES(??)\nimportlib.machinery.ExtensionFileLoader(??)\nimportlib.machinery.FileFinder(??)\nimportlib.machinery.FrozenImporter(??)\nimportlib.machinery.ModuleSpec(??)\nimportlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES(??)\nimportlib.machinery.PathFinder(??)\nimportlib.machinery.SOURCE_SUFFIXES(??)\nimportlib.machinery.SourceFileLoader(??)\nimportlib.machinery.SourcelessFileLoader(??)\nimportlib.machinery.WindowsRegistryFinder(??)\nimportlib.machinery.all_suffixes(??)\nimportlib.reload(??)\nimportlib.sys(??)\nimportlib.types(??)\nimportlib.util(??)\nimportlib.util.MAGIC_NUMBER\nimportlib.util.cache_from_source(??)\nimportlib.util.contextmanager(??)\nimportlib.util.decode_source(??)\nimportlib.util.find_spec(??)\nimportlib.util.functools(??)\nimportlib.util.module_for_loader(??)\nimportlib.util.resolve_name(??)\nimportlib.util.set_loader(??)\nimportlib.util.set_package(??)\nimportlib.util.source_from_cache(??)\nimportlib.util.spec_from_file_location(??)\nimportlib.util.spec_from_loader(??)\nimportlib.util.sys(??)\nimportlib.util.warnings(??)\nimportlib.warnings(??)\ninput([prompt]) -> string\ninspect.ArgInfo(args, varargs, keywords, locals)\ninspect.ArgSpec(args, varargs, keywords, defaults)\ninspect.Arguments(args, varargs, varkw)\ninspect.Attribute(name, kind, defining_class, object)\ninspect.BlockFinder(??)\ninspect.BoundArguments(??)\ninspect.CO_GENERATOR\ninspect.CO_NESTED\ninspect.CO_NEWLOCALS\ninspect.CO_NOFREE\ninspect.CO_OPTIMIZED\ninspect.CO_VARARGS\ninspect.CO_VARKEYWORDS\ninspect.ClosureVars(nonlocals, globals, builtins, unbound)\ninspect.EndOfBlock(??)\ninspect.FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)\ninspect.GEN_CLOSED\ninspect.GEN_CREATED\ninspect.GEN_RUNNING\ninspect.GEN_SUSPENDED\ninspect.ModuleInfo(name, suffix, mode, module_type)\ninspect.OrderedDict(??)\ninspect.Parameter(??)\ninspect.Signature(??)\ninspect.TPFLAGS_IS_ABSTRACT\ninspect.Traceback(filename, lineno, function, code_context, index)\ninspect.ast(??)\ninspect.attrgetter(attr, ...) --> attrgetter object\ninspect.builtins(??)\ninspect.classify_class_attrs(??)\ninspect.cleandoc(??)\ninspect.currentframe(??)\ninspect.findsource(??)\ninspect.formatannotation(??)\ninspect.formatannotationrelativeto(??)\ninspect.formatargspec(??)\ninspect.formatargvalues(??)\ninspect.functools(??)\ninspect.getabsfile(??)\ninspect.getargs(??)\ninspect.getargspec(??)\ninspect.getargvalues(??)\ninspect.getattr_static(??)\ninspect.getblock(??)\ninspect.getcallargs(??)\ninspect.getclasstree(??)\ninspect.getclosurevars(??)\ninspect.getcomments(??)\ninspect.getdoc(??)\ninspect.getfile(??)\ninspect.getframeinfo(??)\ninspect.getfullargspec(??)\ninspect.getgeneratorlocals(??)\ninspect.getgeneratorstate(??)\ninspect.getinnerframes(??)\ninspect.getlineno(??)\ninspect.getmembers(??)\ninspect.getmodule(??)\ninspect.getmoduleinfo(??)\ninspect.getmodulename(??)\ninspect.getmro(??)\ninspect.getouterframes(??)\ninspect.getsource(??)\ninspect.getsourcefile(??)\ninspect.getsourcelines(??)\ninspect.importlib(??)\ninspect.indentsize(??)\ninspect.isabstract(??)\ninspect.isbuiltin(??)\ninspect.isclass(??)\ninspect.iscode(??)\ninspect.isdatadescriptor(??)\ninspect.isframe(??)\ninspect.isfunction(??)\ninspect.isgenerator(??)\ninspect.isgeneratorfunction(??)\ninspect.isgetsetdescriptor(??)\ninspect.ismemberdescriptor(??)\ninspect.ismethod(??)\ninspect.ismethoddescriptor(??)\ninspect.ismodule(??)\ninspect.isroutine(??)\ninspect.istraceback(??)\ninspect.itertools(??)\ninspect.k\ninspect.linecache(??)\ninspect.mod_dict(??)\ninspect.modulesbyfile(??)\ninspect.namedtuple(??)\ninspect.os(??)\ninspect.re(??)\ninspect.signature(??)\ninspect.stack(??)\ninspect.sys(??)\ninspect.token(??)\ninspect.tokenize(??)\ninspect.trace(??)\ninspect.types(??)\ninspect.unwrap(??)\ninspect.v\ninspect.walktree(??)\ninspect.warnings(??)\nint(x=0) -> integer\nio.BlockingIOError(??)\nio.BufferedIOBase(??)\nio.BufferedRWPair(??)\nio.BufferedRandom(??)\nio.BufferedReader(??)\nio.BufferedWriter(??)\nio.BytesIO([buffer]) -> object\nio.DEFAULT_BUFFER_SIZE\nio.FileIO(??)\nio.IOBase(??)\nio.IncrementalNewlineDecoder(??)\nio.OpenWrapper(??)\nio.RawIOBase(??)\nio.SEEK_CUR\nio.SEEK_END\nio.SEEK_SET\nio.StringIO(??)\nio.TextIOBase(??)\nio.TextIOWrapper(??)\nio.UnsupportedOperation(??)\nio.abc(??)\nio.open(??)\nipaddress.AddressValueError(??)\nipaddress.IPV4LENGTH\nipaddress.IPV6LENGTH\nipaddress.IPv4Address(??)\nipaddress.IPv4Interface(??)\nipaddress.IPv4Network(??)\nipaddress.IPv6Address(??)\nipaddress.IPv6Interface(??)\nipaddress.IPv6Network(??)\nipaddress.NetmaskValueError(??)\nipaddress.collapse_addresses(??)\nipaddress.functools(??)\nipaddress.get_mixed_type_key(??)\nipaddress.ip_address(??)\nipaddress.ip_interface(??)\nipaddress.ip_network(??)\nipaddress.summarize_address_range(??)\nipaddress.v4_int_to_packed(??)\nipaddress.v6_int_to_packed(??)\nisinstance(object, class-or-type-or-tuple) -> bool\nissubclass(C, B) -> bool\niter(iterable) -> iterator\nitertools.accumulate(iterable[, func]) --> accumulate object\nitertools.chain(*iterables) --> chain object\nitertools.combinations(iterable, r) --> combinations object\nitertools.combinations_with_replacement(iterable, r) --> combinations_with_replacement object\nitertools.compress(data, selectors) --> iterator over selected data\nitertools.count(start=0, step=1) --> count object\nitertools.cycle(iterable) --> cycle object\nitertools.dropwhile(predicate, iterable) --> dropwhile object\nitertools.filterfalse(function or None, sequence) --> filterfalse object\nitertools.groupby(iterable[, keyfunc]) -> create an iterator which returns\nitertools.islice(iterable, stop) --> islice object\nitertools.permutations(iterable[, r]) --> permutations object\nitertools.product(*iterables, repeat=1) --> product object\nitertools.repeat(object [,times]) -> create an iterator which returns the object\nitertools.starmap(function, sequence) --> starmap object\nitertools.takewhile(predicate, iterable) --> takewhile object\nitertools.tee(iterable, n=2) --> tuple of n independent iterators.\nitertools.zip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> zip_longest object\njson.JSONDecoder(??)\njson.JSONEncoder(??)\njson.decoder(??)\njson.decoder.BACKSLASH(??)\njson.decoder.FLAGS\njson.decoder.JSONArray(??)\njson.decoder.JSONDecoder(??)\njson.decoder.JSONObject(??)\njson.decoder.NaN\njson.decoder.NegInf\njson.decoder.PosInf\njson.decoder.STRINGCHUNK(??)\njson.decoder.WHITESPACE(??)\njson.decoder.WHITESPACE_STR\njson.decoder.c_scanstring(??)\njson.decoder.errmsg(??)\njson.decoder.linecol(??)\njson.decoder.py_scanstring(??)\njson.decoder.re(??)\njson.decoder.scanner(??)\njson.decoder.scanstring(string, end, strict=True) -> (string, end)\njson.dump(??)\njson.dumps(??)\njson.encoder(??)\njson.encoder.ESCAPE(??)\njson.encoder.ESCAPE_ASCII(??)\njson.encoder.ESCAPE_DCT(??)\njson.encoder.FLOAT_REPR(??)\njson.encoder.HAS_UTF8(??)\njson.encoder.INFINITY\njson.encoder.JSONEncoder(??)\njson.encoder.c_encode_basestring_ascii(??)\njson.encoder.c_make_encoder(??)\njson.encoder.encode_basestring(??)\njson.encoder.encode_basestring_ascii(string) -> string\njson.encoder.i\njson.encoder.py_encode_basestring_ascii(??)\njson.encoder.re(??)\njson.load(??)\njson.loads(??)\njson.scanner(??)\njson.scanner.NUMBER_RE(??)\njson.scanner.c_make_scanner(??)\njson.scanner.make_scanner(??)\njson.scanner.py_make_scanner(??)\njson.scanner.re(??)\njson.tool.json(??)\njson.tool.main(??)\njson.tool.sys(??)\nkeyword.iskeyword(??)\nkeyword.kwlist(??)\nkeyword.main(??)\nlen(module, object)\nlicense(??)\nlinecache.cache(??)\nlinecache.checkcache(??)\nlinecache.clearcache(??)\nlinecache.getline(??)\nlinecache.getlines(??)\nlinecache.os(??)\nlinecache.sys(??)\nlinecache.tokenize(??)\nlinecache.updatecache(??)\nlist() -> new empty list\nlocale.ABDAY_1\nlocale.ABDAY_2\nlocale.ABDAY_3\nlocale.ABDAY_4\nlocale.ABDAY_5\nlocale.ABDAY_6\nlocale.ABDAY_7\nlocale.ABMON_1\nlocale.ABMON_10\nlocale.ABMON_11\nlocale.ABMON_12\nlocale.ABMON_2\nlocale.ABMON_3\nlocale.ABMON_4\nlocale.ABMON_5\nlocale.ABMON_6\nlocale.ABMON_7\nlocale.ABMON_8\nlocale.ABMON_9\nlocale.ALT_DIGITS\nlocale.AM_STR\nlocale.CHAR_MAX\nlocale.CODESET\nlocale.CRNCYSTR\nlocale.DAY_1\nlocale.DAY_2\nlocale.DAY_3\nlocale.DAY_4\nlocale.DAY_5\nlocale.DAY_6\nlocale.DAY_7\nlocale.D_FMT\nlocale.D_T_FMT\nlocale.ERA\nlocale.ERA_D_FMT\nlocale.ERA_D_T_FMT\nlocale.ERA_T_FMT\nlocale.Error(??)\nlocale.LC_ALL\nlocale.LC_COLLATE\nlocale.LC_CTYPE\nlocale.LC_MESSAGES\nlocale.LC_MONETARY\nlocale.LC_NUMERIC\nlocale.LC_TIME\nlocale.MON_1\nlocale.MON_10\nlocale.MON_11\nlocale.MON_12\nlocale.MON_2\nlocale.MON_3\nlocale.MON_4\nlocale.MON_5\nlocale.MON_6\nlocale.MON_7\nlocale.MON_8\nlocale.MON_9\nlocale.NOEXPR\nlocale.PM_STR\nlocale.RADIXCHAR\nlocale.THOUSEP\nlocale.T_FMT\nlocale.T_FMT_AMPM\nlocale.YESEXPR\nlocale.atof(??)\nlocale.atoi(??)\nlocale.collections(??)\nlocale.currency(??)\nlocale.encodings(??)\nlocale.format(??)\nlocale.format_string(??)\nlocale.functools(??)\nlocale.getdefaultlocale(??)\nlocale.getlocale(??)\nlocale.getpreferredencoding(??)\nlocale.k\nlocale.locale_alias(??)\nlocale.locale_encoding_alias(??)\nlocale.localeconv(??)\nlocale.nl_langinfo(key) -> string\nlocale.normalize(??)\nlocale.re(??)\nlocale.resetlocale(??)\nlocale.setlocale(??)\nlocale.str(??)\nlocale.strcoll(??)\nlocale.strxfrm(string) -> string.\nlocale.sys(??)\nlocale.v\nlocale.windows_locale(??)\nlocals() -> dictionary\nlogging.BASIC_FORMAT\nlogging.BufferingFormatter(??)\nlogging.CRITICAL\nlogging.DEBUG\nlogging.ERROR\nlogging.FATAL\nlogging.FileHandler(??)\nlogging.Filter(??)\nlogging.Filterer(??)\nlogging.Formatter(??)\nlogging.Handler(??)\nlogging.INFO\nlogging.LogRecord(??)\nlogging.Logger(??)\nlogging.LoggerAdapter(??)\nlogging.Manager(??)\nlogging.NOTSET\nlogging.NullHandler(??)\nlogging.PercentStyle(??)\nlogging.PlaceHolder(??)\nlogging.RootLogger(??)\nlogging.StrFormatStyle(??)\nlogging.StreamHandler(??)\nlogging.StringTemplateStyle(??)\nlogging.Template(??)\nlogging.WARN\nlogging.WARNING\nlogging.addLevelName(??)\nlogging.atexit(??)\nlogging.basicConfig(??)\nlogging.captureWarnings(??)\nlogging.config.BaseConfigurator(??)\nlogging.config.ConvertingDict(??)\nlogging.config.ConvertingList(??)\nlogging.config.ConvertingTuple(??)\nlogging.config.DEFAULT_LOGGING_CONFIG_PORT\nlogging.config.DictConfigurator(??)\nlogging.config.IDENTIFIER(??)\nlogging.config.RESET_ERROR\nlogging.config.StreamRequestHandler(??)\nlogging.config.ThreadingTCPServer(??)\nlogging.config.dictConfig(??)\nlogging.config.dictConfigClass(??)\nlogging.config.fileConfig(??)\nlogging.config.io(??)\nlogging.config.listen(??)\nlogging.config.logging(??)\nlogging.config.re(??)\nlogging.config.socket(??)\nlogging.config.stopListening(??)\nlogging.config.struct(??)\nlogging.config.sys(??)\nlogging.config.thread(??)\nlogging.config.threading(??)\nlogging.config.traceback(??)\nlogging.config.valid_ident(??)\nlogging.critical(??)\nlogging.currentframe(??)\nlogging.debug(??)\nlogging.disable(??)\nlogging.error(??)\nlogging.exception(??)\nlogging.fatal(??)\nlogging.getLevelName(??)\nlogging.getLogRecordFactory(??)\nlogging.getLogger(??)\nlogging.getLoggerClass(??)\nlogging.handlers.BOM_UTF8\nlogging.handlers.BaseRotatingHandler(??)\nlogging.handlers.BufferingHandler(??)\nlogging.handlers.DEFAULT_HTTP_LOGGING_PORT\nlogging.handlers.DEFAULT_SOAP_LOGGING_PORT\nlogging.handlers.DEFAULT_TCP_LOGGING_PORT\nlogging.handlers.DEFAULT_UDP_LOGGING_PORT\nlogging.handlers.DatagramHandler(??)\nlogging.handlers.HTTPHandler(??)\nlogging.handlers.MemoryHandler(??)\nlogging.handlers.NTEventLogHandler(??)\nlogging.handlers.QueueHandler(??)\nlogging.handlers.QueueListener(??)\nlogging.handlers.RotatingFileHandler(??)\nlogging.handlers.SMTPHandler(??)\nlogging.handlers.ST_DEV\nlogging.handlers.ST_INO\nlogging.handlers.ST_MTIME\nlogging.handlers.SYSLOG_TCP_PORT\nlogging.handlers.SYSLOG_UDP_PORT\nlogging.handlers.SocketHandler(??)\nlogging.handlers.SysLogHandler(??)\nlogging.handlers.TimedRotatingFileHandler(??)\nlogging.handlers.WatchedFileHandler(??)\nlogging.handlers.errno(??)\nlogging.handlers.logging(??)\nlogging.handlers.os(??)\nlogging.handlers.pickle(??)\nlogging.handlers.queue(??)\nlogging.handlers.re(??)\nlogging.handlers.socket(??)\nlogging.handlers.struct(??)\nlogging.handlers.threading(??)\nlogging.handlers.time(??)\nlogging.info(??)\nlogging.io(??)\nlogging.lastResort(??)\nlogging.log(??)\nlogging.logMultiprocessing(??)\nlogging.logProcesses(??)\nlogging.logThreads(??)\nlogging.makeLogRecord(??)\nlogging.os(??)\nlogging.raiseExceptions(??)\nlogging.root(??)\nlogging.setLogRecordFactory(??)\nlogging.setLoggerClass(??)\nlogging.shutdown(??)\nlogging.sys(??)\nlogging.threading(??)\nlogging.time(??)\nlogging.traceback(??)\nlogging.warn(??)\nlogging.warning(??)\nlogging.warnings(??)\nlogging.weakref(??)\nlzma.CHECK_CRC32\nlzma.CHECK_CRC64\nlzma.CHECK_ID_MAX\nlzma.CHECK_NONE\nlzma.CHECK_SHA256\nlzma.CHECK_UNKNOWN\nlzma.FILTER_ARM\nlzma.FILTER_ARMTHUMB\nlzma.FILTER_DELTA\nlzma.FILTER_IA64\nlzma.FILTER_LZMA1\nlzma.FILTER_LZMA2\nlzma.FILTER_POWERPC\nlzma.FILTER_SPARC\nlzma.FILTER_X86\nlzma.FORMAT_ALONE\nlzma.FORMAT_AUTO\nlzma.FORMAT_RAW\nlzma.FORMAT_XZ\nlzma.LZMACompressor(format=FORMAT_XZ, check=-1, preset=None, filters=None)\nlzma.LZMADecompressor(??)\nlzma.LZMAError(??)\nlzma.LZMAFile(??)\nlzma.MF_BT2\nlzma.MF_BT3\nlzma.MF_BT4\nlzma.MF_HC3\nlzma.MF_HC4\nlzma.MODE_FAST\nlzma.MODE_NORMAL\nlzma.PRESET_DEFAULT\nlzma.PRESET_EXTREME\nlzma.builtins(??)\nlzma.compress(??)\nlzma.decompress(??)\nlzma.io(??)\nlzma.is_check_supported(??)\nlzma.open(??)\nmacpath.SF_APPEND\nmacpath.SF_ARCHIVED\nmacpath.SF_IMMUTABLE\nmacpath.SF_NOUNLINK\nmacpath.SF_SNAPSHOT\nmacpath.ST_ATIME\nmacpath.ST_CTIME\nmacpath.ST_DEV\nmacpath.ST_GID\nmacpath.ST_INO\nmacpath.ST_MODE\nmacpath.ST_MTIME\nmacpath.ST_NLINK\nmacpath.ST_SIZE\nmacpath.ST_UID\nmacpath.S_ENFMT\nmacpath.S_IEXEC\nmacpath.S_IFBLK\nmacpath.S_IFCHR\nmacpath.S_IFDIR\nmacpath.S_IFDOOR\nmacpath.S_IFIFO\nmacpath.S_IFLNK\nmacpath.S_IFMT(??)\nmacpath.S_IFPORT\nmacpath.S_IFREG\nmacpath.S_IFSOCK\nmacpath.S_IFWHT\nmacpath.S_IMODE(??)\nmacpath.S_IREAD\nmacpath.S_IRGRP\nmacpath.S_IROTH\nmacpath.S_IRUSR\nmacpath.S_IRWXG\nmacpath.S_IRWXO\nmacpath.S_IRWXU\nmacpath.S_ISBLK(mode) -> bool\nmacpath.S_ISCHR(mode) -> bool\nmacpath.S_ISDIR(mode) -> bool\nmacpath.S_ISDOOR(mode) -> bool\nmacpath.S_ISFIFO(mode) -> bool\nmacpath.S_ISGID\nmacpath.S_ISLNK(mode) -> bool\nmacpath.S_ISPORT(mode) -> bool\nmacpath.S_ISREG(mode) -> bool\nmacpath.S_ISSOCK(mode) -> bool\nmacpath.S_ISUID\nmacpath.S_ISVTX\nmacpath.S_ISWHT(mode) -> bool\nmacpath.S_IWGRP\nmacpath.S_IWOTH\nmacpath.S_IWRITE\nmacpath.S_IWUSR\nmacpath.S_IXGRP\nmacpath.S_IXOTH\nmacpath.S_IXUSR\nmacpath.UF_APPEND\nmacpath.UF_COMPRESSED\nmacpath.UF_HIDDEN\nmacpath.UF_IMMUTABLE\nmacpath.UF_NODUMP\nmacpath.UF_NOUNLINK\nmacpath.UF_OPAQUE\nmacpath.abspath(??)\nmacpath.altsep(??)\nmacpath.basename(??)\nmacpath.commonprefix(??)\nmacpath.curdir\nmacpath.defpath\nmacpath.devnull\nmacpath.dirname(??)\nmacpath.exists(??)\nmacpath.expanduser(??)\nmacpath.expandvars(??)\nmacpath.extsep\nmacpath.filemode(??)\nmacpath.genericpath(??)\nmacpath.getatime(??)\nmacpath.getctime(??)\nmacpath.getmtime(??)\nmacpath.getsize(??)\nmacpath.isabs(??)\nmacpath.isdir(??)\nmacpath.isfile(??)\nmacpath.islink(??)\nmacpath.ismount(??)\nmacpath.join(??)\nmacpath.lexists(??)\nmacpath.norm_error(??)\nmacpath.normcase(??)\nmacpath.normpath(??)\nmacpath.os(??)\nmacpath.pardir\nmacpath.pathsep\nmacpath.realpath(??)\nmacpath.samefile(??)\nmacpath.sameopenfile(??)\nmacpath.samestat(??)\nmacpath.sep\nmacpath.split(??)\nmacpath.splitdrive(??)\nmacpath.splitext(??)\nmacpath.supports_unicode_filenames(??)\nmacurl2path.os(??)\nmacurl2path.pathname2url(??)\nmacurl2path.url2pathname(??)\nmacurl2path.urllib(??)\nmailbox.Babyl(??)\nmailbox.BabylMessage(??)\nmailbox.Error(??)\nmailbox.ExternalClashError(??)\nmailbox.FormatError(??)\nmailbox.MH(??)\nmailbox.MHMessage(??)\nmailbox.MMDF(??)\nmailbox.MMDFMessage(??)\nmailbox.Mailbox(??)\nmailbox.Maildir(??)\nmailbox.MaildirMessage(??)\nmailbox.Message(??)\nmailbox.NoSuchMailboxError(??)\nmailbox.NotEmptyError(??)\nmailbox.calendar(??)\nmailbox.contextlib(??)\nmailbox.copy(??)\nmailbox.email(??)\nmailbox.errno(??)\nmailbox.fcntl(??)\nmailbox.io(??)\nmailbox.linesep\nmailbox.mbox(??)\nmailbox.mboxMessage(??)\nmailbox.os(??)\nmailbox.socket(??)\nmailbox.sys(??)\nmailbox.time(??)\nmailbox.warnings(??)\nmailcap.findmatch(??)\nmailcap.findparam(??)\nmailcap.getcaps(??)\nmailcap.listmailcapfiles(??)\nmailcap.lookup(??)\nmailcap.os(??)\nmailcap.parsefield(??)\nmailcap.parseline(??)\nmailcap.readmailcapfile(??)\nmailcap.show(??)\nmailcap.subst(??)\nmailcap.test(??)\nmap(func, *iterables) --> map object\nmarshal.dump(value, file[, version])\nmarshal.dumps(value[, version])\nmarshal.load(file)\nmarshal.loads(bytes)\nmarshal.version\nmath.acos(x)\nmath.acosh(x)\nmath.asin(x)\nmath.asinh(x)\nmath.atan(x)\nmath.atan2(y, x)\nmath.atanh(x)\nmath.ceil(x)\nmath.copysign(x, y)\nmath.cos(x)\nmath.cosh(x)\nmath.degrees(x)\nmath.e\nmath.erf(x)\nmath.erfc(x)\nmath.exp(x)\nmath.expm1(x)\nmath.fabs(x)\nmath.factorial(x) -> Integral\nmath.floor(x)\nmath.fmod(x, y)\nmath.frexp(x)\nmath.fsum(iterable)\nmath.gamma(x)\nmath.hypot(x, y)\nmath.isfinite(x) -> bool\nmath.isinf(x) -> bool\nmath.isnan(x) -> bool\nmath.ldexp(x, i)\nmath.lgamma(x)\nmath.log(x[, base])\nmath.log10(x)\nmath.log1p(x)\nmath.log2(x)\nmath.modf(x)\nmath.pi\nmath.pow(x, y)\nmath.radians(x)\nmath.sin(x)\nmath.sinh(x)\nmath.sqrt(x)\nmath.tan(x)\nmath.tanh(x)\nmath.trunc(x:Real) -> Integral\nmax(iterable[, key=func]) -> value\nmemoryview(object)\nmimetypes.MimeTypes(??)\nmimetypes.add_type(??)\nmimetypes.common_types(??)\nmimetypes.encodings_map(??)\nmimetypes.guess_all_extensions(??)\nmimetypes.guess_extension(??)\nmimetypes.guess_type(??)\nmimetypes.init(??)\nmimetypes.inited(??)\nmimetypes.knownfiles(??)\nmimetypes.os(??)\nmimetypes.posixpath(??)\nmimetypes.read_mime_types(??)\nmimetypes.suffix_map(??)\nmimetypes.sys(??)\nmimetypes.types_map(??)\nmimetypes.urllib(??)\nmin(iterable[, key=func]) -> value\nmmap.ACCESS_COPY\nmmap.ACCESS_READ\nmmap.ACCESS_WRITE\nmmap.ALLOCATIONGRANULARITY\nmmap.MAP_ANON\nmmap.MAP_ANONYMOUS\nmmap.MAP_PRIVATE\nmmap.MAP_SHARED\nmmap.PAGESIZE\nmmap.PROT_EXEC\nmmap.PROT_READ\nmmap.PROT_WRITE\nmmap.error(??)\nmmap.mmap(??)\nmodulefinder.AddPackagePath(??)\nmodulefinder.HAVE_ARGUMENT\nmodulefinder.IMPORT_NAME\nmodulefinder.LOAD_CONST\nmodulefinder.Module(??)\nmodulefinder.ModuleFinder(??)\nmodulefinder.ReplacePackage(??)\nmodulefinder.STORE_GLOBAL\nmodulefinder.STORE_NAME\nmodulefinder.STORE_OPS(??)\nmodulefinder.dis(??)\nmodulefinder.imp(??)\nmodulefinder.importlib(??)\nmodulefinder.marshal(??)\nmodulefinder.os(??)\nmodulefinder.packagePathMap(??)\nmodulefinder.replacePackageMap(??)\nmodulefinder.struct(??)\nmodulefinder.sys(??)\nmodulefinder.test(??)\nmodulefinder.types(??)\nmodulefinder.warnings(??)\nmultiprocessing.Array(??)\nmultiprocessing.AuthenticationError(??)\nmultiprocessing.Barrier(??)\nmultiprocessing.BoundedSemaphore(??)\nmultiprocessing.BufferTooShort(??)\nmultiprocessing.Condition(??)\nmultiprocessing.Event(??)\nmultiprocessing.JoinableQueue(??)\nmultiprocessing.Lock(??)\nmultiprocessing.Manager(??)\nmultiprocessing.Pipe(??)\nmultiprocessing.Pool(??)\nmultiprocessing.Process(??)\nmultiprocessing.ProcessError(??)\nmultiprocessing.Queue(??)\nmultiprocessing.RLock(??)\nmultiprocessing.RawArray(??)\nmultiprocessing.RawValue(??)\nmultiprocessing.SUBDEBUG\nmultiprocessing.SUBWARNING\nmultiprocessing.Semaphore(??)\nmultiprocessing.SimpleQueue(??)\nmultiprocessing.TimeoutError(??)\nmultiprocessing.Value(??)\nmultiprocessing.active_children(??)\nmultiprocessing.allow_connection_pickling(??)\nmultiprocessing.connection(??)\nmultiprocessing.connection.AuthenticationError(??)\nmultiprocessing.connection.BUFSIZE\nmultiprocessing.connection.BufferTooShort(??)\nmultiprocessing.connection.CHALLENGE\nmultiprocessing.connection.CONNECTION_TIMEOUT\nmultiprocessing.connection.Client(??)\nmultiprocessing.connection.Connection(??)\nmultiprocessing.connection.ConnectionWrapper(??)\nmultiprocessing.connection.FAILURE\nmultiprocessing.connection.ForkingPickler(??)\nmultiprocessing.connection.Listener(??)\nmultiprocessing.connection.MESSAGE_LENGTH\nmultiprocessing.connection.Pipe(??)\nmultiprocessing.connection.SocketClient(??)\nmultiprocessing.connection.SocketListener(??)\nmultiprocessing.connection.WELCOME\nmultiprocessing.connection.XmlClient(??)\nmultiprocessing.connection.XmlListener(??)\nmultiprocessing.connection.address_type(??)\nmultiprocessing.connection.answer_challenge(??)\nmultiprocessing.connection.arbitrary_address(??)\nmultiprocessing.connection.default_family\nmultiprocessing.connection.deliver_challenge(??)\nmultiprocessing.connection.errno(??)\nmultiprocessing.connection.families(??)\nmultiprocessing.connection.io(??)\nmultiprocessing.connection.itertools(??)\nmultiprocessing.connection.os(??)\nmultiprocessing.connection.rebuild_connection(??)\nmultiprocessing.connection.reduce_connection(??)\nmultiprocessing.connection.reduction(??)\nmultiprocessing.connection.selectors(??)\nmultiprocessing.connection.socket(??)\nmultiprocessing.connection.struct(??)\nmultiprocessing.connection.sys(??)\nmultiprocessing.connection.tempfile(??)\nmultiprocessing.connection.time(??)\nmultiprocessing.connection.util(??)\nmultiprocessing.connection.wait(??)\nmultiprocessing.context(??)\nmultiprocessing.context.AuthenticationError(??)\nmultiprocessing.context.BaseContext(??)\nmultiprocessing.context.BufferTooShort(??)\nmultiprocessing.context.DefaultContext(??)\nmultiprocessing.context.ForkContext(??)\nmultiprocessing.context.ForkProcess(??)\nmultiprocessing.context.ForkServerContext(??)\nmultiprocessing.context.ForkServerProcess(??)\nmultiprocessing.context.Process(??)\nmultiprocessing.context.ProcessError(??)\nmultiprocessing.context.SpawnContext(??)\nmultiprocessing.context.SpawnProcess(??)\nmultiprocessing.context.TimeoutError(??)\nmultiprocessing.context.assert_spawning(??)\nmultiprocessing.context.get_spawning_popen(??)\nmultiprocessing.context.os(??)\nmultiprocessing.context.process(??)\nmultiprocessing.context.set_spawning_popen(??)\nmultiprocessing.context.sys(??)\nmultiprocessing.context.threading(??)\nmultiprocessing.cpu_count(??)\nmultiprocessing.current_process(??)\nmultiprocessing.dummy.Array(??)\nmultiprocessing.dummy.Barrier(??)\nmultiprocessing.dummy.BoundedSemaphore(??)\nmultiprocessing.dummy.Condition(??)\nmultiprocessing.dummy.DummyProcess(??)\nmultiprocessing.dummy.Event(??)\nmultiprocessing.dummy.JoinableQueue(??)\nmultiprocessing.dummy.Lock(??)\nmultiprocessing.dummy.Manager(??)\nmultiprocessing.dummy.Namespace(??)\nmultiprocessing.dummy.Pipe(??)\nmultiprocessing.dummy.Pool(??)\nmultiprocessing.dummy.Process(??)\nmultiprocessing.dummy.Queue(??)\nmultiprocessing.dummy.RLock(??)\nmultiprocessing.dummy.Semaphore(??)\nmultiprocessing.dummy.Value(??)\nmultiprocessing.dummy.active_children(??)\nmultiprocessing.dummy.array(??)\nmultiprocessing.dummy.connection(??)\nmultiprocessing.dummy.connection.Client(??)\nmultiprocessing.dummy.connection.Connection(??)\nmultiprocessing.dummy.connection.Listener(??)\nmultiprocessing.dummy.connection.Pipe(??)\nmultiprocessing.dummy.connection.Queue(??)\nmultiprocessing.dummy.connection.families(??)\nmultiprocessing.dummy.current_process(??)\nmultiprocessing.dummy.dict() -> new empty dictionary\nmultiprocessing.dummy.freeze_support(??)\nmultiprocessing.dummy.list() -> new empty list\nmultiprocessing.dummy.shutdown(??)\nmultiprocessing.dummy.sys(??)\nmultiprocessing.dummy.threading(??)\nmultiprocessing.dummy.weakref(??)\nmultiprocessing.forkserver.ForkServer(??)\nmultiprocessing.forkserver.MAXFDS_TO_SEND\nmultiprocessing.forkserver.UNSIGNED_STRUCT(??)\nmultiprocessing.forkserver.connect_to_new_process(??)\nmultiprocessing.forkserver.connection(??)\nmultiprocessing.forkserver.ensure_running(??)\nmultiprocessing.forkserver.errno(??)\nmultiprocessing.forkserver.get_inherited_fds(??)\nmultiprocessing.forkserver.main(??)\nmultiprocessing.forkserver.os(??)\nmultiprocessing.forkserver.process(??)\nmultiprocessing.forkserver.read_unsigned(??)\nmultiprocessing.forkserver.reduction(??)\nmultiprocessing.forkserver.selectors(??)\nmultiprocessing.forkserver.semaphore_tracker(??)\nmultiprocessing.forkserver.set_forkserver_preload(??)\nmultiprocessing.forkserver.signal(??)\nmultiprocessing.forkserver.socket(??)\nmultiprocessing.forkserver.spawn(??)\nmultiprocessing.forkserver.struct(??)\nmultiprocessing.forkserver.sys(??)\nmultiprocessing.forkserver.threading(??)\nmultiprocessing.forkserver.util(??)\nmultiprocessing.forkserver.write_unsigned(??)\nmultiprocessing.freeze_support(??)\nmultiprocessing.get_all_start_methods(??)\nmultiprocessing.get_context(??)\nmultiprocessing.get_logger(??)\nmultiprocessing.get_start_method(??)\nmultiprocessing.heap.Arena(??)\nmultiprocessing.heap.BufferWrapper(??)\nmultiprocessing.heap.Heap(??)\nmultiprocessing.heap.bisect(??)\nmultiprocessing.heap.context(??)\nmultiprocessing.heap.itertools(??)\nmultiprocessing.heap.mmap(??)\nmultiprocessing.heap.os(??)\nmultiprocessing.heap.rebuild_arena(??)\nmultiprocessing.heap.reduce_arena(??)\nmultiprocessing.heap.reduction(??)\nmultiprocessing.heap.sys(??)\nmultiprocessing.heap.tempfile(??)\nmultiprocessing.heap.threading(??)\nmultiprocessing.heap.util(??)\nmultiprocessing.log_to_stderr(??)\nmultiprocessing.managers.AcquirerProxy(??)\nmultiprocessing.managers.Array(??)\nmultiprocessing.managers.ArrayProxy(??)\nmultiprocessing.managers.AutoProxy(??)\nmultiprocessing.managers.BarrierProxy(??)\nmultiprocessing.managers.BaseListProxy(??)\nmultiprocessing.managers.BaseManager(??)\nmultiprocessing.managers.BaseProxy(??)\nmultiprocessing.managers.ConditionProxy(??)\nmultiprocessing.managers.DictProxy(??)\nmultiprocessing.managers.EventProxy(??)\nmultiprocessing.managers.IteratorProxy(??)\nmultiprocessing.managers.ListProxy(??)\nmultiprocessing.managers.MakeProxyType(??)\nmultiprocessing.managers.Namespace(??)\nmultiprocessing.managers.NamespaceProxy(??)\nmultiprocessing.managers.PoolProxy(??)\nmultiprocessing.managers.ProcessLocalSet(??)\nmultiprocessing.managers.RebuildProxy(??)\nmultiprocessing.managers.RemoteError(??)\nmultiprocessing.managers.Server(??)\nmultiprocessing.managers.State(??)\nmultiprocessing.managers.SyncManager(??)\nmultiprocessing.managers.Token(??)\nmultiprocessing.managers.Value(??)\nmultiprocessing.managers.ValueProxy(??)\nmultiprocessing.managers.all_methods(??)\nmultiprocessing.managers.array(??)\nmultiprocessing.managers.connection(??)\nmultiprocessing.managers.context(??)\nmultiprocessing.managers.convert_to_error(??)\nmultiprocessing.managers.dispatch(??)\nmultiprocessing.managers.format_exc(??)\nmultiprocessing.managers.get_context(??)\nmultiprocessing.managers.listener_client(??)\nmultiprocessing.managers.pool(??)\nmultiprocessing.managers.process(??)\nmultiprocessing.managers.public_methods(??)\nmultiprocessing.managers.queue(??)\nmultiprocessing.managers.rebuild_as_list(??)\nmultiprocessing.managers.reduce_array(??)\nmultiprocessing.managers.reduction(??)\nmultiprocessing.managers.sys(??)\nmultiprocessing.managers.threading(??)\nmultiprocessing.managers.util(??)\nmultiprocessing.managers.view_type(??)\nmultiprocessing.managers.view_types(??)\nmultiprocessing.pool.ApplyResult(??)\nmultiprocessing.pool.AsyncResult(??)\nmultiprocessing.pool.CLOSE\nmultiprocessing.pool.ExceptionWithTraceback(??)\nmultiprocessing.pool.IMapIterator(??)\nmultiprocessing.pool.IMapUnorderedIterator(??)\nmultiprocessing.pool.MapResult(??)\nmultiprocessing.pool.MaybeEncodingError(??)\nmultiprocessing.pool.Pool(??)\nmultiprocessing.pool.RUN\nmultiprocessing.pool.RemoteTraceback(??)\nmultiprocessing.pool.TERMINATE\nmultiprocessing.pool.ThreadPool(??)\nmultiprocessing.pool.TimeoutError(??)\nmultiprocessing.pool.collections(??)\nmultiprocessing.pool.cpu_count(??)\nmultiprocessing.pool.get_context(??)\nmultiprocessing.pool.itertools(??)\nmultiprocessing.pool.job_counter(??)\nmultiprocessing.pool.mapstar(??)\nmultiprocessing.pool.os(??)\nmultiprocessing.pool.queue(??)\nmultiprocessing.pool.rebuild_exc(??)\nmultiprocessing.pool.starmapstar(??)\nmultiprocessing.pool.threading(??)\nmultiprocessing.pool.time(??)\nmultiprocessing.pool.traceback(??)\nmultiprocessing.pool.util(??)\nmultiprocessing.pool.worker(??)\nmultiprocessing.popen_fork.Popen(??)\nmultiprocessing.popen_fork.errno(??)\nmultiprocessing.popen_fork.os(??)\nmultiprocessing.popen_fork.signal(??)\nmultiprocessing.popen_fork.sys(??)\nmultiprocessing.popen_fork.util(??)\nmultiprocessing.popen_forkserver.Popen(??)\nmultiprocessing.popen_forkserver.context(??)\nmultiprocessing.popen_forkserver.forkserver(??)\nmultiprocessing.popen_forkserver.io(??)\nmultiprocessing.popen_forkserver.os(??)\nmultiprocessing.popen_forkserver.popen_fork(??)\nmultiprocessing.popen_forkserver.reduction(??)\nmultiprocessing.popen_forkserver.spawn(??)\nmultiprocessing.popen_forkserver.util(??)\nmultiprocessing.popen_spawn_posix.Popen(??)\nmultiprocessing.popen_spawn_posix.context(??)\nmultiprocessing.popen_spawn_posix.current_process(??)\nmultiprocessing.popen_spawn_posix.fcntl(??)\nmultiprocessing.popen_spawn_posix.io(??)\nmultiprocessing.popen_spawn_posix.os(??)\nmultiprocessing.popen_spawn_posix.popen_fork(??)\nmultiprocessing.popen_spawn_posix.reduction(??)\nmultiprocessing.popen_spawn_posix.spawn(??)\nmultiprocessing.popen_spawn_posix.util(??)\nmultiprocessing.process(??)\nmultiprocessing.process.AuthenticationString(??)\nmultiprocessing.process.BaseProcess(??)\nmultiprocessing.process.ORIGINAL_DIR\nmultiprocessing.process.WeakSet(??)\nmultiprocessing.process.active_children(??)\nmultiprocessing.process.current_process(??)\nmultiprocessing.process.itertools(??)\nmultiprocessing.process.name\nmultiprocessing.process.os(??)\nmultiprocessing.process.signal(??)\nmultiprocessing.process.signum(??)\nmultiprocessing.process.sys(??)\nmultiprocessing.queues.Empty(??)\nmultiprocessing.queues.Finalize(??)\nmultiprocessing.queues.ForkingPickler(??)\nmultiprocessing.queues.Full(??)\nmultiprocessing.queues.JoinableQueue(??)\nmultiprocessing.queues.Queue(??)\nmultiprocessing.queues.SimpleQueue(??)\nmultiprocessing.queues.collections(??)\nmultiprocessing.queues.connection(??)\nmultiprocessing.queues.context(??)\nmultiprocessing.queues.debug(??)\nmultiprocessing.queues.errno(??)\nmultiprocessing.queues.info(??)\nmultiprocessing.queues.is_exiting(??)\nmultiprocessing.queues.os(??)\nmultiprocessing.queues.register_after_fork(??)\nmultiprocessing.queues.sys(??)\nmultiprocessing.queues.threading(??)\nmultiprocessing.queues.time(??)\nmultiprocessing.queues.weakref(??)\nmultiprocessing.reduction(??)\nmultiprocessing.reduction.ACKNOWLEDGE(??)\nmultiprocessing.reduction.DupFd(??)\nmultiprocessing.reduction.ForkingPickler(??)\nmultiprocessing.reduction.HAVE_SEND_HANDLE(??)\nmultiprocessing.reduction.array(??)\nmultiprocessing.reduction.context(??)\nmultiprocessing.reduction.copyreg(??)\nmultiprocessing.reduction.dump(??)\nmultiprocessing.reduction.functools(??)\nmultiprocessing.reduction.io(??)\nmultiprocessing.reduction.os(??)\nmultiprocessing.reduction.pickle(??)\nmultiprocessing.reduction.recv_handle(??)\nmultiprocessing.reduction.recvfds(??)\nmultiprocessing.reduction.register(??)\nmultiprocessing.reduction.send_handle(??)\nmultiprocessing.reduction.sendfds(??)\nmultiprocessing.reduction.socket(??)\nmultiprocessing.reduction.sys(??)\nmultiprocessing.reduction.util(??)\nmultiprocessing.resource_sharer.DupFd(??)\nmultiprocessing.resource_sharer.os(??)\nmultiprocessing.resource_sharer.process(??)\nmultiprocessing.resource_sharer.reduction(??)\nmultiprocessing.resource_sharer.signal(??)\nmultiprocessing.resource_sharer.socket(??)\nmultiprocessing.resource_sharer.stop(??)\nmultiprocessing.resource_sharer.sys(??)\nmultiprocessing.resource_sharer.threading(??)\nmultiprocessing.resource_sharer.util(??)\nmultiprocessing.semaphore_tracker.SemaphoreTracker(??)\nmultiprocessing.semaphore_tracker.current_process(??)\nmultiprocessing.semaphore_tracker.ensure_running(??)\nmultiprocessing.semaphore_tracker.errno(??)\nmultiprocessing.semaphore_tracker.getfd(??)\nmultiprocessing.semaphore_tracker.main(??)\nmultiprocessing.semaphore_tracker.os(??)\nmultiprocessing.semaphore_tracker.register(??)\nmultiprocessing.semaphore_tracker.signal(??)\nmultiprocessing.semaphore_tracker.spawn(??)\nmultiprocessing.semaphore_tracker.sys(??)\nmultiprocessing.semaphore_tracker.threading(??)\nmultiprocessing.semaphore_tracker.unregister(??)\nmultiprocessing.semaphore_tracker.util(??)\nmultiprocessing.semaphore_tracker.warnings(??)\nmultiprocessing.set_executable(??)\nmultiprocessing.set_forkserver_preload(??)\nmultiprocessing.set_start_method(??)\nmultiprocessing.sharedctypes.Array(??)\nmultiprocessing.sharedctypes.ForkingPickler(??)\nmultiprocessing.sharedctypes.RawArray(??)\nmultiprocessing.sharedctypes.RawValue(??)\nmultiprocessing.sharedctypes.Synchronized(??)\nmultiprocessing.sharedctypes.SynchronizedArray(??)\nmultiprocessing.sharedctypes.SynchronizedBase(??)\nmultiprocessing.sharedctypes.SynchronizedString(??)\nmultiprocessing.sharedctypes.Value(??)\nmultiprocessing.sharedctypes.assert_spawning(??)\nmultiprocessing.sharedctypes.class_cache(??)\nmultiprocessing.sharedctypes.copy(??)\nmultiprocessing.sharedctypes.ctypes(??)\nmultiprocessing.sharedctypes.get_context(??)\nmultiprocessing.sharedctypes.heap(??)\nmultiprocessing.sharedctypes.make_property(??)\nmultiprocessing.sharedctypes.prop_cache(??)\nmultiprocessing.sharedctypes.rebuild_ctype(??)\nmultiprocessing.sharedctypes.reduce_ctype(??)\nmultiprocessing.sharedctypes.synchronized(??)\nmultiprocessing.sharedctypes.template\nmultiprocessing.sharedctypes.typecode_to_type(??)\nmultiprocessing.sharedctypes.weakref(??)\nmultiprocessing.spawn.WINEXE(??)\nmultiprocessing.spawn.WINSERVICE(??)\nmultiprocessing.spawn.freeze_support(??)\nmultiprocessing.spawn.get_command_line(??)\nmultiprocessing.spawn.get_executable(??)\nmultiprocessing.spawn.get_preparation_data(??)\nmultiprocessing.spawn.get_start_method(??)\nmultiprocessing.spawn.import_main_path(??)\nmultiprocessing.spawn.is_forking(??)\nmultiprocessing.spawn.old_main_modules(??)\nmultiprocessing.spawn.os(??)\nmultiprocessing.spawn.pickle(??)\nmultiprocessing.spawn.prepare(??)\nmultiprocessing.spawn.process(??)\nmultiprocessing.spawn.runpy(??)\nmultiprocessing.spawn.set_executable(??)\nmultiprocessing.spawn.set_start_method(??)\nmultiprocessing.spawn.spawn_main(??)\nmultiprocessing.spawn.sys(??)\nmultiprocessing.spawn.types(??)\nmultiprocessing.spawn.util(??)\nmultiprocessing.synchronize.Barrier(??)\nmultiprocessing.synchronize.BoundedSemaphore(??)\nmultiprocessing.synchronize.Condition(??)\nmultiprocessing.synchronize.Event(??)\nmultiprocessing.synchronize.Lock(??)\nmultiprocessing.synchronize.RECURSIVE_MUTEX\nmultiprocessing.synchronize.RLock(??)\nmultiprocessing.synchronize.SEMAPHORE\nmultiprocessing.synchronize.SEM_VALUE_MAX\nmultiprocessing.synchronize.SemLock(??)\nmultiprocessing.synchronize.Semaphore(??)\nmultiprocessing.synchronize.context(??)\nmultiprocessing.synchronize.itertools(??)\nmultiprocessing.synchronize.os(??)\nmultiprocessing.synchronize.process(??)\nmultiprocessing.synchronize.sem_unlink(??)\nmultiprocessing.synchronize.sys(??)\nmultiprocessing.synchronize.tempfile(??)\nmultiprocessing.synchronize.threading(??)\nmultiprocessing.synchronize.util(??)\nmultiprocessing.sys(??)\nmultiprocessing.util(??)\nmultiprocessing.util.DEBUG\nmultiprocessing.util.DEFAULT_LOGGING_FORMAT\nmultiprocessing.util.Finalize(??)\nmultiprocessing.util.ForkAwareLocal(??)\nmultiprocessing.util.ForkAwareThreadLock(??)\nmultiprocessing.util.INFO\nmultiprocessing.util.LOGGER_NAME\nmultiprocessing.util.MAXFD\nmultiprocessing.util.NOTSET\nmultiprocessing.util.SUBDEBUG\nmultiprocessing.util.SUBWARNING\nmultiprocessing.util.atexit(??)\nmultiprocessing.util.close_all_fds_except(??)\nmultiprocessing.util.debug(??)\nmultiprocessing.util.functools(??)\nmultiprocessing.util.get_logger(??)\nmultiprocessing.util.get_temp_dir(??)\nmultiprocessing.util.info(??)\nmultiprocessing.util.is_exiting(??)\nmultiprocessing.util.itertools(??)\nmultiprocessing.util.log_to_stderr(??)\nmultiprocessing.util.os(??)\nmultiprocessing.util.process(??)\nmultiprocessing.util.register_after_fork(??)\nmultiprocessing.util.spawnv_passfds(??)\nmultiprocessing.util.sub_debug(??)\nmultiprocessing.util.sub_warning(??)\nmultiprocessing.util.sys(??)\nmultiprocessing.util.threading(??)\nmultiprocessing.util.weakref(??)\nnetrc.NetrcParseError(??)\nnetrc.netrc(??)\nnetrc.os(??)\nnetrc.shlex(??)\nnetrc.stat(??)\nnext(iterator[, default])\nnis.cat(map, domain = defaultdomain)\nnis.error(??)\nnis.get_default_domain() -> str\nnis.maps(domain = defaultdomain)\nnis.match(key, map, domain = defaultdomain)\nnntplib.ArticleInfo(number, message_id, lines)\nnntplib.GroupInfo(group, last, first, flag)\nnntplib.NNTP(??)\nnntplib.NNTPDataError(??)\nnntplib.NNTPError(??)\nnntplib.NNTPPermanentError(??)\nnntplib.NNTPProtocolError(??)\nnntplib.NNTPReplyError(??)\nnntplib.NNTPTemporaryError(??)\nnntplib.NNTP_PORT\nnntplib.NNTP_SSL(??)\nnntplib.NNTP_SSL_PORT\nnntplib.collections(??)\nnntplib.datetime(??)\nnntplib.decode_header(??)\nnntplib.re(??)\nnntplib.socket(??)\nnntplib.ssl(??)\nnntplib.warnings(??)\nnumbers.ABCMeta(??)\nnumbers.Complex(??)\nnumbers.Integral(??)\nnumbers.Number(??)\nnumbers.Rational(??)\nnumbers.Real(??)\nnumbers.abstractmethod(??)\nobject(??)\noct(number) -> string\nopen(??)\noperator.abs(a) -- Same as abs(a).\noperator.add(a, b) -- Same as a + b.\noperator.and_(a, b) -- Same as a & b.\noperator.attrgetter(attr, ...) --> attrgetter object\noperator.concat(a, b) -- Same as a + b, for a and b sequences.\noperator.contains(a, b) -- Same as b in a (note reversed operands).\noperator.countOf(a, b) -- Return the number of times b occurs in a.\noperator.delitem(a, b) -- Same as del a[b].\noperator.eq(a, b) -- Same as a==b.\noperator.floordiv(a, b) -- Same as a // b.\noperator.ge(a, b) -- Same as a>=b.\noperator.getitem(a, b) -- Same as a[b].\noperator.gt(a, b) -- Same as a>b.\noperator.iadd(??)\noperator.iand(??)\noperator.iconcat(??)\noperator.ifloordiv(??)\noperator.ilshift(??)\noperator.imod(??)\noperator.imul(??)\noperator.index(a) -- Same as a.__index__()\noperator.indexOf(a, b) -- Return the first index of b in a.\noperator.inv(a) -- Same as ~a.\noperator.invert(a) -- Same as ~a.\noperator.ior(??)\noperator.ipow(??)\noperator.irshift(??)\noperator.is_(a, b) -- Same as a is b.\noperator.is_not(a, b) -- Same as a is not b.\noperator.isub(??)\noperator.itemgetter(item, ...) --> itemgetter object\noperator.itruediv(??)\noperator.ixor(??)\noperator.le(a, b) -- Same as a<=b.\noperator.length_hint(obj, default=0) -> int\noperator.lshift(a, b) -- Same as a << b.\noperator.lt(a, b) -- Same as a<b.\noperator.methodcaller(name, ...) --> methodcaller object\noperator.mod(a, b) -- Same as a % b.\noperator.mul(a, b) -- Same as a * b.\noperator.ne(a, b) -- Same as a!=b.\noperator.neg(a) -- Same as -a.\noperator.not_(a) -- Same as not a.\noperator.or_(a, b) -- Same as a | b.\noperator.pos(a) -- Same as +a.\noperator.pow(a, b) -- Same as a ** b.\noperator.rshift(a, b) -- Same as a >> b.\noperator.setitem(a, b, c) -- Same as a[b] = c.\noperator.sub(a, b) -- Same as a - b.\noperator.truediv(a, b) -- Same as a / b.\noperator.truth(a) -- Return True if a is true, False otherwise.\noperator.xor(a, b) -- Same as a ^ b.\noptparse.AmbiguousOptionError(??)\noptparse.BadOptionError(??)\noptparse.HelpFormatter(??)\noptparse.IndentedHelpFormatter(??)\noptparse.NO_DEFAULT(??)\noptparse.OptParseError(??)\noptparse.Option(??)\noptparse.OptionConflictError(??)\noptparse.OptionContainer(??)\noptparse.OptionError(??)\noptparse.OptionGroup(??)\noptparse.OptionParser(??)\noptparse.OptionValueError(??)\noptparse.SUPPRESS_HELP\noptparse.SUPPRESS_USAGE\noptparse.TitledHelpFormatter(??)\noptparse.Values(??)\noptparse.check_builtin(??)\noptparse.check_choice(??)\noptparse.gettext(??)\noptparse.make_option(??)\noptparse.ngettext(??)\noptparse.os(??)\noptparse.sys(??)\noptparse.textwrap(??)\nord(c) -> integer\nos.CLD_CONTINUED\nos.CLD_DUMPED\nos.CLD_EXITED\nos.CLD_TRAPPED\nos.EX_CANTCREAT\nos.EX_CONFIG\nos.EX_DATAERR\nos.EX_IOERR\nos.EX_NOHOST\nos.EX_NOINPUT\nos.EX_NOPERM\nos.EX_NOUSER\nos.EX_OK\nos.EX_OSERR\nos.EX_OSFILE\nos.EX_PROTOCOL\nos.EX_SOFTWARE\nos.EX_TEMPFAIL\nos.EX_UNAVAILABLE\nos.EX_USAGE\nos.F_LOCK\nos.F_OK\nos.F_TEST\nos.F_TLOCK\nos.F_ULOCK\nos.MutableMapping(??)\nos.NGROUPS_MAX\nos.O_ACCMODE\nos.O_APPEND\nos.O_ASYNC\nos.O_CREAT\nos.O_DIRECTORY\nos.O_DSYNC\nos.O_EXCL\nos.O_EXLOCK\nos.O_NDELAY\nos.O_NOCTTY\nos.O_NOFOLLOW\nos.O_NONBLOCK\nos.O_RDONLY\nos.O_RDWR\nos.O_SHLOCK\nos.O_SYNC\nos.O_TRUNC\nos.O_WRONLY\nos.PRIO_PGRP\nos.PRIO_PROCESS\nos.PRIO_USER\nos.P_ALL\nos.P_NOWAIT\nos.P_NOWAITO\nos.P_PGID\nos.P_PID\nos.P_WAIT\nos.RTLD_GLOBAL\nos.RTLD_LAZY\nos.RTLD_LOCAL\nos.RTLD_NODELETE\nos.RTLD_NOLOAD\nos.RTLD_NOW\nos.R_OK\nos.SCHED_FIFO\nos.SCHED_OTHER\nos.SCHED_RR\nos.SEEK_CUR\nos.SEEK_END\nos.SEEK_SET\nos.ST_NOSUID\nos.ST_RDONLY\nos.TMP_MAX\nos.WCONTINUED\nos.WCOREDUMP(status) -> bool\nos.WEXITED\nos.WEXITSTATUS(status) -> integer\nos.WIFCONTINUED(status) -> bool\nos.WIFEXITED(status) -> bool\nos.WIFSIGNALED(status) -> bool\nos.WIFSTOPPED(status) -> bool\nos.WNOHANG\nos.WNOWAIT\nos.WSTOPPED\nos.WSTOPSIG(status) -> integer\nos.WTERMSIG(status) -> integer\nos.WUNTRACED\nos.W_OK\nos.X_OK\nos.abort() -> does not return!\nos.access(??)\nos.altsep(??)\nos.chdir(path)\nos.chflags(path, flags, *, follow_symlinks=True)\nos.chmod(path, mode, *, dir_fd=None, follow_symlinks=True)\nos.chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True)\nos.chroot(path)\nos.close(fd)\nos.closerange(fd_low, fd_high)\nos.confstr(name) -> string\nos.confstr_names(??)\nos.cpu_count() -> integer\nos.ctermid() -> string\nos.curdir\nos.defpath\nos.device_encoding(fd) -> str\nos.devnull\nos.dup(fd) -> fd2\nos.dup2(old_fd, new_fd)\nos.environ(??)\nos.environb(??)\nos.errno(??)\nos.error(??)\nos.execl(file, *args)\nos.execle(file, *args, env)\nos.execlp(file, *args)\nos.execlpe(file, *args, env)\nos.execv(path, args)\nos.execve(path, args, env)\nos.execvp(file, args)\nos.execvpe(file, args, env)\nos.extsep\nos.fchdir(fd)\nos.fchmod(fd, mode)\nos.fchown(fd, uid, gid)\nos.fdopen(??)\nos.fork() -> pid\nos.forkpty() -> (pid, master_fd)\nos.fpathconf(fd, name) -> integer\nos.fsdecode(??)\nos.fsencode(??)\nos.fstat(fd) -> stat result\nos.fstatvfs(fd) -> statvfs result\nos.fsync(fildes)\nos.ftruncate(fd, length)\nos.get_exec_path(??)\nos.get_inheritable(fd) -> bool\nos.get_terminal_size(??)\nos.getcwd() -> path\nos.getcwdb() -> path\nos.getegid() -> egid\nos.getenv(??)\nos.getenvb(??)\nos.geteuid() -> euid\nos.getgid() -> gid\nos.getgrouplist(user, group) -> list of groups to which a user belongs\nos.getgroups() -> list of group IDs\nos.getloadavg() -> (float, float, float)\nos.getlogin() -> string\nos.getpgid(pid) -> pgid\nos.getpgrp() -> pgrp\nos.getpid() -> pid\nos.getppid() -> ppid\nos.getpriority(which, who) -> current_priority\nos.getsid(pid) -> sid\nos.getuid() -> uid\nos.initgroups(username, gid) -> None\nos.isatty(fd) -> bool\nos.kill(pid, sig)\nos.killpg(pgid, sig)\nos.lchflags(path, flags)\nos.lchmod(path, mode)\nos.lchown(path, uid, gid)\nos.linesep\nos.link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True)\nos.listdir(path='.') -> list_of_filenames\nos.lockf(fd, cmd, len)\nos.lseek(fd, pos, how) -> newpos\nos.lstat(path, *, dir_fd=None) -> stat result\nos.major(device) -> major number\nos.makedev(major, minor) -> device number\nos.makedirs(path [, mode=0o777][, exist_ok=False])\nos.minor(device) -> minor number\nos.mkdir(path, mode=0o777, *, dir_fd=None)\nos.mkfifo(path, mode=0o666, *, dir_fd=None)\nos.mknod(filename, mode=0o600, device=0, *, dir_fd=None)\nos.name\nos.nice(inc) -> new_priority\nos.open(path, flags, mode=0o777, *, dir_fd=None)\nos.openpty() -> (master_fd, slave_fd)\nos.pardir\nos.path(??)\nos.pathconf(path, name) -> integer\nos.pathconf_names(??)\nos.pathsep\nos.pipe() -> (read_end, write_end)\nos.popen(??)\nos.pread(fd, buffersize, offset) -> string\nos.putenv(key, value)\nos.pwrite(fd, string, offset) -> byteswritten\nos.read(fd, buffersize) -> bytes\nos.readlink(path, *, dir_fd=None) -> path\nos.readv(fd, buffers) -> bytesread\nos.remove(path, *, dir_fd=None)\nos.removedirs(path)\nos.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)\nos.renames(old, new)\nos.replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None)\nos.rmdir(path, *, dir_fd=None)\nos.sched_get_priority_max(policy)\nos.sched_get_priority_min(policy)\nos.sched_yield()\nos.sendfile(out, in, offset, nbytes) -> byteswritten\nos.sep\nos.set_inheritable(fd, inheritable)\nos.setegid(gid)\nos.seteuid(uid)\nos.setgid(gid)\nos.setgroups(list)\nos.setpgid(pid, pgrp)\nos.setpgrp()\nos.setpriority(which, who, prio) -> None\nos.setregid(rgid, egid)\nos.setreuid(ruid, euid)\nos.setsid()\nos.setuid(uid)\nos.spawnl(mode, file, *args) -> integer\nos.spawnle(mode, file, *args, env) -> integer\nos.spawnlp(mode, file, *args) -> integer\nos.spawnlpe(mode, file, *args, env) -> integer\nos.spawnv(mode, file, args) -> integer\nos.spawnve(mode, file, args, env) -> integer\nos.spawnvp(mode, file, args) -> integer\nos.spawnvpe(mode, file, args, env) -> integer\nos.st(??)\nos.stat(??)\nos.stat_float_times([newval]) -> oldval\nos.stat_result(??)\nos.statvfs(path)\nos.statvfs_result(??)\nos.strerror(code) -> string\nos.supports_bytes_environ(??)\nos.supports_dir_fd(??)\nos.supports_effective_ids(??)\nos.supports_fd(??)\nos.supports_follow_symlinks(??)\nos.symlink(src, dst, target_is_directory=False, *, dir_fd=None)\nos.sync()\nos.sys(??)\nos.sysconf(name) -> integer\nos.sysconf_names(??)\nos.system(command) -> exit_status\nos.tcgetpgrp(fd) -> pgid\nos.tcsetpgrp(fd, pgid)\nos.terminal_size(??)\nos.times() -> times_result\nos.times_result(??)\nos.truncate(path, length)\nos.ttyname(??)\nos.umask(new_mask) -> old_mask\nos.uname() -> uname_result\nos.uname_result(??)\nos.unlink(path, *, dir_fd=None)\nos.unsetenv(key)\nos.urandom(n) -> str\nos.utime(path, times=None, *, ns=None, dir_fd=None, follow_symlinks=True)\nos.wait() -> (pid, status)\nos.wait3(options) -> (pid, status, rusage)\nos.wait4(pid, options) -> (pid, status, rusage)\nos.waitpid(pid, options) -> (pid, status)\nos.walk(??)\nos.write(fd, data) -> byteswritten\nos.writev(fd, buffers) -> byteswritten\nparser.ParserError(??)\nparser.STType(??)\nparser.compilest(??)\nparser.expr(??)\nparser.isexpr(??)\nparser.issuite(??)\nparser.sequence2st(??)\nparser.st2list(??)\nparser.st2tuple(??)\nparser.suite(??)\nparser.tuple2st(??)\npathlib.EINVAL\npathlib.ENOENT\npathlib.Path(??)\npathlib.PosixPath(??)\npathlib.PurePath(??)\npathlib.PurePosixPath(??)\npathlib.PureWindowsPath(??)\npathlib.S_ISBLK(mode) -> bool\npathlib.S_ISCHR(mode) -> bool\npathlib.S_ISDIR(mode) -> bool\npathlib.S_ISFIFO(mode) -> bool\npathlib.S_ISLNK(mode) -> bool\npathlib.S_ISREG(mode) -> bool\npathlib.S_ISSOCK(mode) -> bool\npathlib.Sequence(??)\npathlib.WindowsPath(??)\npathlib.attrgetter(attr, ...) --> attrgetter object\npathlib.contextmanager(??)\npathlib.fnmatch(??)\npathlib.functools(??)\npathlib.io(??)\npathlib.nt(??)\npathlib.ntpath(??)\npathlib.os(??)\npathlib.posixpath(??)\npathlib.re(??)\npathlib.supports_symlinks(??)\npathlib.sys(??)\npathlib.urlquote_from_bytes(??)\npdb.Pdb(??)\npdb.Restart(??)\npdb.TESTCMD\npdb.bdb(??)\npdb.cmd(??)\npdb.code(??)\npdb.dis(??)\npdb.find_function(??)\npdb.getsourcelines(??)\npdb.glob(??)\npdb.help(??)\npdb.inspect(??)\npdb.lasti2lineno(??)\npdb.line_prefix\npdb.linecache(??)\npdb.main(??)\npdb.os(??)\npdb.pm(??)\npdb.post_mortem(??)\npdb.pprint(??)\npdb.re(??)\npdb.run(??)\npdb.runcall(??)\npdb.runctx(??)\npdb.runeval(??)\npdb.set_trace(??)\npdb.signal(??)\npdb.sys(??)\npdb.test(??)\npdb.traceback(??)\npickle.ADDITEMS\npickle.APPEND\npickle.APPENDS\npickle.BINBYTES\npickle.BINBYTES8\npickle.BINFLOAT\npickle.BINGET\npickle.BININT\npickle.BININT1\npickle.BININT2\npickle.BINPERSID\npickle.BINPUT\npickle.BINSTRING\npickle.BINUNICODE\npickle.BINUNICODE8\npickle.BUILD\npickle.DEFAULT_PROTOCOL\npickle.DICT\npickle.DUP\npickle.EMPTY_DICT\npickle.EMPTY_LIST\npickle.EMPTY_SET\npickle.EMPTY_TUPLE\npickle.EXT1\npickle.EXT2\npickle.EXT4\npickle.FALSE\npickle.FLOAT\npickle.FRAME\npickle.FROZENSET\npickle.FunctionType(??)\npickle.GET\npickle.GLOBAL\npickle.HIGHEST_PROTOCOL\npickle.INST\npickle.INT\npickle.LIST\npickle.LONG\npickle.LONG1\npickle.LONG4\npickle.LONG_BINGET\npickle.LONG_BINPUT\npickle.MARK\npickle.MEMOIZE\npickle.ModuleType(??)\npickle.NEWFALSE\npickle.NEWOBJ\npickle.NEWOBJ_EX\npickle.NEWTRUE\npickle.NONE\npickle.OBJ\npickle.PERSID\npickle.POP\npickle.POP_MARK\npickle.PROTO\npickle.PUT\npickle.PickleError(??)\npickle.Pickler(??)\npickle.PicklingError(??)\npickle.PyStringMap(??)\npickle.REDUCE\npickle.SETITEM\npickle.SETITEMS\npickle.SHORT_BINBYTES\npickle.SHORT_BINSTRING\npickle.SHORT_BINUNICODE\npickle.STACK_GLOBAL\npickle.STOP\npickle.STRING\npickle.TRUE\npickle.TUPLE\npickle.TUPLE1\npickle.TUPLE2\npickle.TUPLE3\npickle.UNICODE\npickle.Unpickler(??)\npickle.UnpicklingError(??)\npickle.bytes_types(??)\npickle.codecs(??)\npickle.compatible_formats(??)\npickle.decode_long(??)\npickle.dispatch_table(??)\npickle.dump(??)\npickle.dumps(??)\npickle.encode_long(??)\npickle.format_version\npickle.io(??)\npickle.islice(iterable, stop) --> islice object\npickle.load(??)\npickle.loads(??)\npickle.maxsize\npickle.pack(fmt, v1, v2, ...) -> bytes\npickle.re(??)\npickle.sys(??)\npickle.unpack(fmt, buffer) -> (v1, v2, ...)\npickle.whichmodule(??)\npickletools.ArgumentDescriptor(??)\npickletools.OpcodeInfo(??)\npickletools.StackObject(??)\npickletools.TAKEN_FROM_ARGUMENT1\npickletools.TAKEN_FROM_ARGUMENT4\npickletools.TAKEN_FROM_ARGUMENT4U\npickletools.TAKEN_FROM_ARGUMENT8U\npickletools.UP_TO_NEWLINE\npickletools.anyobject(??)\npickletools.bytes1(??)\npickletools.bytes4(??)\npickletools.bytes8(??)\npickletools.bytes_types(??)\npickletools.code2op(??)\npickletools.codecs(??)\npickletools.decimalnl_long(??)\npickletools.decimalnl_short(??)\npickletools.decode_long(??)\npickletools.dis(??)\npickletools.float8(??)\npickletools.floatnl(??)\npickletools.genops(??)\npickletools.int4(??)\npickletools.io(??)\npickletools.long1(??)\npickletools.long4(??)\npickletools.markobject(??)\npickletools.opcodes(??)\npickletools.optimize(??)\npickletools.pickle(??)\npickletools.pybool(??)\npickletools.pybytes(??)\npickletools.pybytes_or_str(??)\npickletools.pydict(??)\npickletools.pyfloat(??)\npickletools.pyfrozenset(??)\npickletools.pyint(??)\npickletools.pyinteger_or_bool(??)\npickletools.pylist(??)\npickletools.pylong(??)\npickletools.pynone(??)\npickletools.pyset(??)\npickletools.pystring(??)\npickletools.pytuple(??)\npickletools.pyunicode(??)\npickletools.re(??)\npickletools.read_bytes1(??)\npickletools.read_bytes4(??)\npickletools.read_bytes8(??)\npickletools.read_decimalnl_long(??)\npickletools.read_decimalnl_short(??)\npickletools.read_float8(??)\npickletools.read_floatnl(??)\npickletools.read_int4(??)\npickletools.read_long1(??)\npickletools.read_long4(??)\npickletools.read_string1(??)\npickletools.read_string4(??)\npickletools.read_stringnl(??)\npickletools.read_stringnl_noescape(??)\npickletools.read_stringnl_noescape_pair(??)\npickletools.read_uint1(??)\npickletools.read_uint2(??)\npickletools.read_uint4(??)\npickletools.read_uint8(??)\npickletools.read_unicodestring1(??)\npickletools.read_unicodestring4(??)\npickletools.read_unicodestring8(??)\npickletools.read_unicodestringnl(??)\npickletools.stackslice(??)\npickletools.string1(??)\npickletools.string4(??)\npickletools.stringnl(??)\npickletools.stringnl_noescape(??)\npickletools.stringnl_noescape_pair(??)\npickletools.sys(??)\npickletools.uint1(??)\npickletools.uint2(??)\npickletools.uint4(??)\npickletools.uint8(??)\npickletools.unicodestring1(??)\npickletools.unicodestring4(??)\npickletools.unicodestring8(??)\npickletools.unicodestringnl(??)\npipes.FILEIN_FILEOUT\npipes.FILEIN_STDOUT\npipes.SINK\npipes.SOURCE\npipes.STDIN_FILEOUT\npipes.STDIN_STDOUT\npipes.Template(??)\npipes.makepipeline(??)\npipes.os(??)\npipes.quote(??)\npipes.re(??)\npipes.stepkinds(??)\npipes.tempfile(??)\npkgutil.ImpImporter(??)\npkgutil.ImpLoader(??)\npkgutil.ModuleType(??)\npkgutil.extend_path(??)\npkgutil.find_loader(??)\npkgutil.get_data(??)\npkgutil.get_importer(??)\npkgutil.get_loader(??)\npkgutil.importlib(??)\npkgutil.iter_importer_modules(??)\npkgutil.iter_importers(??)\npkgutil.iter_modules(??)\npkgutil.iter_zipimport_modules(??)\npkgutil.os(??)\npkgutil.read_code(??)\npkgutil.simplegeneric(??)\npkgutil.sys(??)\npkgutil.walk_packages(??)\npkgutil.warnings(??)\npkgutil.zipimport(??)\npkgutil.zipimporter(archivepath) -> zipimporter object\nplatform.DEV_NULL\nplatform.architecture(??)\nplatform.collections(??)\nplatform.dist(??)\nplatform.java_ver(??)\nplatform.libc_ver(??)\nplatform.linux_distribution(??)\nplatform.mac_ver(??)\nplatform.machine(??)\nplatform.node(??)\nplatform.os(??)\nplatform.platform(??)\nplatform.popen(??)\nplatform.processor(??)\nplatform.python_branch(??)\nplatform.python_build(??)\nplatform.python_compiler(??)\nplatform.python_implementation(??)\nplatform.python_revision(??)\nplatform.python_version(??)\nplatform.python_version_tuple(??)\nplatform.re(??)\nplatform.release(??)\nplatform.subprocess(??)\nplatform.sys(??)\nplatform.system(??)\nplatform.system_alias(??)\nplatform.uname(??)\nplatform.uname_result(system, node, release, version, machine, processor)\nplatform.version(??)\nplatform.win32_ver(??)\nplistlib.BytesIO([buffer]) -> object\nplistlib.Data(??)\nplistlib.Dict(??)\nplistlib.FMT_BINARY(??)\nplistlib.FMT_XML(??)\nplistlib.InvalidFileException(??)\nplistlib.PLISTHEADER\nplistlib.ParserCreate([encoding[, namespace_separator]]) -> parser\nplistlib.Plist(??)\nplistlib.PlistFormat(??)\nplistlib.binascii(??)\nplistlib.codecs(??)\nplistlib.contextlib(??)\nplistlib.datetime(??)\nplistlib.dump(??)\nplistlib.dumps(??)\nplistlib.enum(??)\nplistlib.itertools(??)\nplistlib.load(??)\nplistlib.loads(??)\nplistlib.os(??)\nplistlib.re(??)\nplistlib.readPlist(??)\nplistlib.readPlistFromBytes(??)\nplistlib.struct(??)\nplistlib.warn(??)\nplistlib.writePlist(??)\nplistlib.writePlistToBytes(??)\npoplib.CR\npoplib.CRLF\npoplib.HAVE_SSL(??)\npoplib.LF\npoplib.POP3(??)\npoplib.POP3_PORT\npoplib.POP3_SSL(??)\npoplib.POP3_SSL_PORT\npoplib.errno(??)\npoplib.error_proto(??)\npoplib.re(??)\npoplib.socket(??)\npoplib.ssl(??)\nposix.CLD_CONTINUED\nposix.CLD_DUMPED\nposix.CLD_EXITED\nposix.CLD_TRAPPED\nposix.EX_CANTCREAT\nposix.EX_CONFIG\nposix.EX_DATAERR\nposix.EX_IOERR\nposix.EX_NOHOST\nposix.EX_NOINPUT\nposix.EX_NOPERM\nposix.EX_NOUSER\nposix.EX_OK\nposix.EX_OSERR\nposix.EX_OSFILE\nposix.EX_PROTOCOL\nposix.EX_SOFTWARE\nposix.EX_TEMPFAIL\nposix.EX_UNAVAILABLE\nposix.EX_USAGE\nposix.F_LOCK\nposix.F_OK\nposix.F_TEST\nposix.F_TLOCK\nposix.F_ULOCK\nposix.NGROUPS_MAX\nposix.O_ACCMODE\nposix.O_APPEND\nposix.O_ASYNC\nposix.O_CREAT\nposix.O_DIRECTORY\nposix.O_DSYNC\nposix.O_EXCL\nposix.O_EXLOCK\nposix.O_NDELAY\nposix.O_NOCTTY\nposix.O_NOFOLLOW\nposix.O_NONBLOCK\nposix.O_RDONLY\nposix.O_RDWR\nposix.O_SHLOCK\nposix.O_SYNC\nposix.O_TRUNC\nposix.O_WRONLY\nposix.PRIO_PGRP\nposix.PRIO_PROCESS\nposix.PRIO_USER\nposix.P_ALL\nposix.P_PGID\nposix.P_PID\nposix.RTLD_GLOBAL\nposix.RTLD_LAZY\nposix.RTLD_LOCAL\nposix.RTLD_NODELETE\nposix.RTLD_NOLOAD\nposix.RTLD_NOW\nposix.R_OK\nposix.SCHED_FIFO\nposix.SCHED_OTHER\nposix.SCHED_RR\nposix.ST_NOSUID\nposix.ST_RDONLY\nposix.TMP_MAX\nposix.WCONTINUED\nposix.WCOREDUMP(status) -> bool\nposix.WEXITED\nposix.WEXITSTATUS(status) -> integer\nposix.WIFCONTINUED(status) -> bool\nposix.WIFEXITED(status) -> bool\nposix.WIFSIGNALED(status) -> bool\nposix.WIFSTOPPED(status) -> bool\nposix.WNOHANG\nposix.WNOWAIT\nposix.WSTOPPED\nposix.WSTOPSIG(status) -> integer\nposix.WTERMSIG(status) -> integer\nposix.WUNTRACED\nposix.W_OK\nposix.X_OK\nposix.abort() -> does not return!\nposix.access(??)\nposix.chdir(path)\nposix.chflags(path, flags, *, follow_symlinks=True)\nposix.chmod(path, mode, *, dir_fd=None, follow_symlinks=True)\nposix.chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True)\nposix.chroot(path)\nposix.close(fd)\nposix.closerange(fd_low, fd_high)\nposix.confstr(name) -> string\nposix.confstr_names(??)\nposix.cpu_count() -> integer\nposix.ctermid() -> string\nposix.device_encoding(fd) -> str\nposix.dup(fd) -> fd2\nposix.dup2(old_fd, new_fd)\nposix.environ(??)\nposix.error(??)\nposix.execv(path, args)\nposix.execve(path, args, env)\nposix.fchdir(fd)\nposix.fchmod(fd, mode)\nposix.fchown(fd, uid, gid)\nposix.fork() -> pid\nposix.forkpty() -> (pid, master_fd)\nposix.fpathconf(fd, name) -> integer\nposix.fstat(fd) -> stat result\nposix.fstatvfs(fd) -> statvfs result\nposix.fsync(fildes)\nposix.ftruncate(fd, length)\nposix.get_inheritable(fd) -> bool\nposix.get_terminal_size(??)\nposix.getcwd() -> path\nposix.getcwdb() -> path\nposix.getegid() -> egid\nposix.geteuid() -> euid\nposix.getgid() -> gid\nposix.getgrouplist(user, group) -> list of groups to which a user belongs\nposix.getgroups() -> list of group IDs\nposix.getloadavg() -> (float, float, float)\nposix.getlogin() -> string\nposix.getpgid(pid) -> pgid\nposix.getpgrp() -> pgrp\nposix.getpid() -> pid\nposix.getppid() -> ppid\nposix.getpriority(which, who) -> current_priority\nposix.getsid(pid) -> sid\nposix.getuid() -> uid\nposix.initgroups(username, gid) -> None\nposix.isatty(fd) -> bool\nposix.kill(pid, sig)\nposix.killpg(pgid, sig)\nposix.lchflags(path, flags)\nposix.lchmod(path, mode)\nposix.lchown(path, uid, gid)\nposix.link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True)\nposix.listdir(path='.') -> list_of_filenames\nposix.lockf(fd, cmd, len)\nposix.lseek(fd, pos, how) -> newpos\nposix.lstat(path, *, dir_fd=None) -> stat result\nposix.major(device) -> major number\nposix.makedev(major, minor) -> device number\nposix.minor(device) -> minor number\nposix.mkdir(path, mode=0o777, *, dir_fd=None)\nposix.mkfifo(path, mode=0o666, *, dir_fd=None)\nposix.mknod(filename, mode=0o600, device=0, *, dir_fd=None)\nposix.nice(inc) -> new_priority\nposix.open(path, flags, mode=0o777, *, dir_fd=None)\nposix.openpty() -> (master_fd, slave_fd)\nposix.pathconf(path, name) -> integer\nposix.pathconf_names(??)\nposix.pipe() -> (read_end, write_end)\nposix.pread(fd, buffersize, offset) -> string\nposix.putenv(key, value)\nposix.pwrite(fd, string, offset) -> byteswritten\nposix.read(fd, buffersize) -> bytes\nposix.readlink(path, *, dir_fd=None) -> path\nposix.readv(fd, buffers) -> bytesread\nposix.remove(path, *, dir_fd=None)\nposix.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)\nposix.replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None)\nposix.rmdir(path, *, dir_fd=None)\nposix.sched_get_priority_max(policy)\nposix.sched_get_priority_min(policy)\nposix.sched_yield()\nposix.sendfile(out, in, offset, nbytes) -> byteswritten\nposix.set_inheritable(fd, inheritable)\nposix.setegid(gid)\nposix.seteuid(uid)\nposix.setgid(gid)\nposix.setgroups(list)\nposix.setpgid(pid, pgrp)\nposix.setpgrp()\nposix.setpriority(which, who, prio) -> None\nposix.setregid(rgid, egid)\nposix.setreuid(ruid, euid)\nposix.setsid()\nposix.setuid(uid)\nposix.stat(??)\nposix.stat_float_times([newval]) -> oldval\nposix.stat_result(??)\nposix.statvfs(path)\nposix.statvfs_result(??)\nposix.strerror(code) -> string\nposix.symlink(src, dst, target_is_directory=False, *, dir_fd=None)\nposix.sync()\nposix.sysconf(name) -> integer\nposix.sysconf_names(??)\nposix.system(command) -> exit_status\nposix.tcgetpgrp(fd) -> pgid\nposix.tcsetpgrp(fd, pgid)\nposix.terminal_size(??)\nposix.times() -> times_result\nposix.times_result(??)\nposix.truncate(path, length)\nposix.ttyname(??)\nposix.umask(new_mask) -> old_mask\nposix.uname() -> uname_result\nposix.uname_result(??)\nposix.unlink(path, *, dir_fd=None)\nposix.unsetenv(key)\nposix.urandom(n) -> str\nposix.utime(path, times=None, *, ns=None, dir_fd=None, follow_symlinks=True)\nposix.wait() -> (pid, status)\nposix.wait3(options) -> (pid, status, rusage)\nposix.wait4(pid, options) -> (pid, status, rusage)\nposix.waitpid(pid, options) -> (pid, status)\nposix.write(fd, data) -> byteswritten\nposix.writev(fd, buffers) -> byteswritten\npow(x, y[, z]) -> number\npprint.PrettyPrinter(??)\npprint.isreadable(??)\npprint.isrecursive(??)\npprint.pformat(??)\npprint.pprint(??)\npprint.re(??)\npprint.saferepr(??)\nprint(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\nprofile.OptionParser(??)\nprofile.Profile(??)\nprofile.main(??)\nprofile.marshal(??)\nprofile.os(??)\nprofile.run(??)\nprofile.runctx(??)\nprofile.sys(??)\nprofile.time(??)\nproperty(fget=None, fset=None, fdel=None, doc=None) -> property attribute\npstats.Stats(??)\npstats.TupleComp(??)\npstats.add_callers(??)\npstats.add_func_stats(??)\npstats.cmp_to_key(??)\npstats.count_calls(??)\npstats.f8(??)\npstats.func_get_function_name(??)\npstats.func_std_string(??)\npstats.func_strip_path(??)\npstats.marshal(??)\npstats.os(??)\npstats.re(??)\npstats.sys(??)\npstats.time(??)\npty.CHILD\npty.STDERR_FILENO\npty.STDIN_FILENO\npty.STDOUT_FILENO\npty.fork() -> (pid, master_fd)\npty.master_open() -> (master_fd, slave_name)\npty.openpty() -> (master_fd, slave_fd)\npty.os(??)\npty.select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\npty.slave_open(tty_name) -> slave_fd\npty.spawn(??)\npty.tty(??)\npwd.getpwall() -> list_of_entries\npwd.getpwnam(name) -> (pw_name,pw_passwd,pw_uid,\npwd.getpwuid(uid) -> (pw_name,pw_passwd,pw_uid,\npwd.struct_passwd(??)\npy_compile.PyCompileError(??)\npy_compile.compile(??)\npy_compile.importlib(??)\npy_compile.main(??)\npy_compile.os(??)\npy_compile.sys(??)\npy_compile.traceback(??)\npyclbr.Class(??)\npyclbr.DEDENT\npyclbr.Function(??)\npyclbr.NAME\npyclbr.OP\npyclbr.importlib(??)\npyclbr.io(??)\npyclbr.itemgetter(item, ...) --> itemgetter object\npyclbr.os(??)\npyclbr.readmodule(??)\npyclbr.readmodule_ex(??)\npyclbr.sys(??)\npyclbr.tokenize(??)\npydoc.Doc(??)\npydoc.ErrorDuringImport(??)\npydoc.HTMLDoc(??)\npydoc.HTMLRepr(??)\npydoc.Helper(??)\npydoc.ModuleScanner(??)\npydoc.Repr(??)\npydoc.TextDoc(??)\npydoc.TextRepr(??)\npydoc.allmethods(??)\npydoc.apropos(??)\npydoc.browse(??)\npydoc.builtins(??)\npydoc.classify_class_attrs(??)\npydoc.classname(??)\npydoc.cli(??)\npydoc.cram(??)\npydoc.deque([iterable[, maxlen]]) --> deque object\npydoc.describe(??)\npydoc.doc(??)\npydoc.extract_tb(??)\npydoc.format_exception_only(??)\npydoc.getdoc(??)\npydoc.getpager(??)\npydoc.help(??)\npydoc.html(??)\npydoc.importfile(??)\npydoc.importlib(??)\npydoc.inspect(??)\npydoc.io(??)\npydoc.isdata(??)\npydoc.ispackage(??)\npydoc.ispath(??)\npydoc.locate(??)\npydoc.os(??)\npydoc.pager(??)\npydoc.pathdirs(??)\npydoc.pipepager(??)\npydoc.pkgutil(??)\npydoc.plain(??)\npydoc.plainpager(??)\npydoc.plaintext(??)\npydoc.platform(??)\npydoc.re(??)\npydoc.render_doc(??)\npydoc.replace(??)\npydoc.resolve(??)\npydoc.safeimport(??)\npydoc.source_synopsis(??)\npydoc.splitdoc(??)\npydoc.stripid(??)\npydoc.synopsis(??)\npydoc.sys(??)\npydoc.tempfilepager(??)\npydoc.text(??)\npydoc.time(??)\npydoc.tokenize(??)\npydoc.ttypager(??)\npydoc.visiblename(??)\npydoc.warnings(??)\npydoc.writedoc(??)\npydoc.writedocs(??)\npydoc_data.topics.topics(??)\nqueue.Empty(??)\nqueue.Full(??)\nqueue.LifoQueue(??)\nqueue.PriorityQueue(??)\nqueue.Queue(??)\nqueue.deque([iterable[, maxlen]]) --> deque object\nqueue.heappop(??)\nqueue.heappush(heap, item) -> None. Push item onto heap, maintaining the heap invariant.\nqueue.threading(??)\nqueue.time(??)\nquit(??)\nquopri.EMPTYSTRING\nquopri.ESCAPE\nquopri.HEX\nquopri.MAXLINESIZE\nquopri.a2b_qp(??)\nquopri.b2a_qp(??)\nquopri.decode(??)\nquopri.decodestring(??)\nquopri.encode(??)\nquopri.encodestring(??)\nquopri.ishex(??)\nquopri.main(??)\nquopri.needsquoting(??)\nquopri.quote(??)\nquopri.unhex(??)\nrandom.BPF\nrandom.LOG4\nrandom.NV_MAGICCONST\nrandom.RECIP_BPF\nrandom.Random(??)\nrandom.SG_MAGICCONST\nrandom.SystemRandom(??)\nrandom.TWOPI\nrandom.betavariate(??)\nrandom.choice(??)\nrandom.expovariate(??)\nrandom.gammavariate(??)\nrandom.gauss(??)\nrandom.getrandbits(k) -> x.  Generates an int with k random bits.\nrandom.getstate(??)\nrandom.lognormvariate(??)\nrandom.normalvariate(??)\nrandom.paretovariate(??)\nrandom.randint(??)\nrandom.random() -> x in the interval [0, 1).\nrandom.randrange(??)\nrandom.sample(??)\nrandom.seed(??)\nrandom.setstate(??)\nrandom.shuffle(??)\nrandom.triangular(??)\nrandom.uniform(??)\nrandom.vonmisesvariate(??)\nrandom.weibullvariate(??)\nrange(stop) -> range object\nre.A\nre.ASCII\nre.DEBUG\nre.DOTALL\nre.I\nre.IGNORECASE\nre.L\nre.LOCALE\nre.M\nre.MULTILINE\nre.S\nre.Scanner(??)\nre.T\nre.TEMPLATE\nre.U\nre.UNICODE\nre.VERBOSE\nre.X\nre.compile(??)\nre.copyreg(??)\nre.error(??)\nre.escape(??)\nre.findall(??)\nre.finditer(??)\nre.fullmatch(??)\nre.match(??)\nre.purge(??)\nre.search(??)\nre.split(??)\nre.sre_compile(??)\nre.sre_parse(??)\nre.sub(??)\nre.subn(??)\nre.sys(??)\nre.template(??)\nreadline.add_history(string) -> None\nreadline.clear_history() -> None\nreadline.get_begidx() -> int\nreadline.get_completer() -> function\nreadline.get_completer_delims() -> string\nreadline.get_completion_type() -> int\nreadline.get_current_history_length() -> integer\nreadline.get_endidx() -> int\nreadline.get_history_item() -> string\nreadline.get_history_length() -> int\nreadline.get_line_buffer() -> string\nreadline.insert_text(string) -> None\nreadline.parse_and_bind(string) -> None\nreadline.read_history_file([filename]) -> None\nreadline.read_init_file([filename]) -> None\nreadline.redisplay() -> None\nreadline.remove_history_item(pos) -> None\nreadline.replace_history_item(pos, line) -> None\nreadline.set_completer([function]) -> None\nreadline.set_completer_delims(string) -> None\nreadline.set_completion_display_matches_hook([function]) -> None\nreadline.set_history_length(length) -> None\nreadline.set_pre_input_hook([function]) -> None\nreadline.set_startup_hook([function]) -> None\nreadline.write_history_file([filename]) -> None\nrepr(object) -> string\nreprlib.Repr(??)\nreprlib.aRepr(??)\nreprlib.builtins(??)\nreprlib.get_ident() -> integer\nreprlib.islice(iterable, stop) --> islice object\nreprlib.recursive_repr(??)\nreprlib.repr(??)\nresource.RLIMIT_AS\nresource.RLIMIT_CORE\nresource.RLIMIT_CPU\nresource.RLIMIT_DATA\nresource.RLIMIT_FSIZE\nresource.RLIMIT_MEMLOCK\nresource.RLIMIT_NOFILE\nresource.RLIMIT_NPROC\nresource.RLIMIT_RSS\nresource.RLIMIT_STACK\nresource.RLIM_INFINITY\nresource.RUSAGE_CHILDREN\nresource.RUSAGE_SELF\nresource.error(??)\nresource.getpagesize(??)\nresource.getrlimit(??)\nresource.getrusage(??)\nresource.setrlimit(??)\nresource.struct_rusage(??)\nreversed(sequence) -> reverse iterator over values of the sequence\nrlcompleter.Completer(??)\nrlcompleter.atexit(??)\nrlcompleter.builtins(??)\nrlcompleter.get_class_members(??)\nrlcompleter.readline(??)\nround(number[, ndigits]) -> number\nrunpy.get_importer(??)\nrunpy.importlib(??)\nrunpy.os(??)\nrunpy.read_code(??)\nrunpy.run_module(??)\nrunpy.run_path(??)\nrunpy.sys(??)\nrunpy.types(??)\nsched.Event(??)\nsched.heapq(??)\nsched.namedtuple(??)\nsched.scheduler(??)\nsched.threading(??)\nsched.time(??)\nselect.KQ_EV_ADD\nselect.KQ_EV_CLEAR\nselect.KQ_EV_DELETE\nselect.KQ_EV_DISABLE\nselect.KQ_EV_ENABLE\nselect.KQ_EV_EOF\nselect.KQ_EV_ERROR\nselect.KQ_EV_FLAG1\nselect.KQ_EV_ONESHOT\nselect.KQ_EV_SYSFLAGS\nselect.KQ_FILTER_AIO\nselect.KQ_FILTER_PROC\nselect.KQ_FILTER_READ\nselect.KQ_FILTER_SIGNAL\nselect.KQ_FILTER_TIMER\nselect.KQ_FILTER_VNODE\nselect.KQ_FILTER_WRITE\nselect.KQ_NOTE_ATTRIB\nselect.KQ_NOTE_CHILD\nselect.KQ_NOTE_DELETE\nselect.KQ_NOTE_EXEC\nselect.KQ_NOTE_EXIT\nselect.KQ_NOTE_EXTEND\nselect.KQ_NOTE_FORK\nselect.KQ_NOTE_LINK\nselect.KQ_NOTE_LOWAT\nselect.KQ_NOTE_PCTRLMASK\nselect.KQ_NOTE_PDATAMASK\nselect.KQ_NOTE_RENAME\nselect.KQ_NOTE_REVOKE\nselect.KQ_NOTE_TRACK\nselect.KQ_NOTE_TRACKERR\nselect.KQ_NOTE_WRITE\nselect.PIPE_BUF\nselect.POLLERR\nselect.POLLHUP\nselect.POLLIN\nselect.POLLNVAL\nselect.POLLOUT\nselect.POLLPRI\nselect.POLLRDBAND\nselect.POLLRDNORM\nselect.POLLWRBAND\nselect.POLLWRNORM\nselect.error(??)\nselect.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)\nselect.kqueue(??)\nselect.poll(??)\nselect.select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\nselectors.ABCMeta(??)\nselectors.BaseSelector(??)\nselectors.DefaultSelector(??)\nselectors.EVENT_READ\nselectors.EVENT_WRITE\nselectors.KqueueSelector(??)\nselectors.Mapping(??)\nselectors.PollSelector(??)\nselectors.SelectSelector(??)\nselectors.SelectorKey(fileobj, fd, events, data)\nselectors.abstractmethod(??)\nselectors.math(??)\nselectors.namedtuple(??)\nselectors.select(??)\nselectors.sys(??)\nset() -> new empty set object\nsetattr(object, name, value)\nshelve.BsdDbShelf(??)\nshelve.BytesIO([buffer]) -> object\nshelve.DbfilenameShelf(??)\nshelve.Pickler(??)\nshelve.Shelf(??)\nshelve.Unpickler(??)\nshelve.collections(??)\nshelve.open(??)\nshlex.StringIO(??)\nshlex.deque([iterable[, maxlen]]) --> deque object\nshlex.os(??)\nshlex.quote(??)\nshlex.re(??)\nshlex.shlex(??)\nshlex.split(??)\nshlex.sys(??)\nshutil.Error(??)\nshutil.ExecError(??)\nshutil.ReadError(??)\nshutil.RegistryError(??)\nshutil.SameFileError(??)\nshutil.SpecialFileError(??)\nshutil.abspath(??)\nshutil.chown(??)\nshutil.collections(??)\nshutil.copy(??)\nshutil.copy2(??)\nshutil.copyfile(??)\nshutil.copyfileobj(??)\nshutil.copymode(??)\nshutil.copystat(??)\nshutil.copytree(??)\nshutil.disk_usage(??)\nshutil.errno(??)\nshutil.fnmatch(??)\nshutil.get_archive_formats(??)\nshutil.get_terminal_size(??)\nshutil.get_unpack_formats(??)\nshutil.getgrnam(name) -> tuple\nshutil.getpwnam(name) -> (pw_name,pw_passwd,pw_uid,\nshutil.ignore_patterns(??)\nshutil.make_archive(??)\nshutil.move(??)\nshutil.os(??)\nshutil.register_archive_format(??)\nshutil.register_unpack_format(??)\nshutil.rmtree(??)\nshutil.stat(??)\nshutil.sys(??)\nshutil.tarfile(??)\nshutil.unpack_archive(??)\nshutil.unregister_archive_format(??)\nshutil.unregister_unpack_format(??)\nshutil.which(??)\nsignal.ITIMER_PROF\nsignal.ITIMER_REAL\nsignal.ITIMER_VIRTUAL\nsignal.ItimerError(??)\nsignal.NSIG\nsignal.SIGABRT\nsignal.SIGALRM\nsignal.SIGBUS\nsignal.SIGCHLD\nsignal.SIGCONT\nsignal.SIGEMT\nsignal.SIGFPE\nsignal.SIGHUP\nsignal.SIGILL\nsignal.SIGINFO\nsignal.SIGINT\nsignal.SIGIO\nsignal.SIGIOT\nsignal.SIGKILL\nsignal.SIGPIPE\nsignal.SIGPROF\nsignal.SIGQUIT\nsignal.SIGSEGV\nsignal.SIGSTOP\nsignal.SIGSYS\nsignal.SIGTERM\nsignal.SIGTRAP\nsignal.SIGTSTP\nsignal.SIGTTIN\nsignal.SIGTTOU\nsignal.SIGURG\nsignal.SIGUSR1\nsignal.SIGUSR2\nsignal.SIGVTALRM\nsignal.SIGWINCH\nsignal.SIGXCPU\nsignal.SIGXFSZ\nsignal.SIG_BLOCK\nsignal.SIG_DFL\nsignal.SIG_IGN\nsignal.SIG_SETMASK\nsignal.SIG_UNBLOCK\nsignal.alarm(seconds)\nsignal.default_int_handler(...)\nsignal.getitimer(which)\nsignal.getsignal(sig) -> action\nsignal.pause()\nsignal.pthread_kill(thread_id, signum)\nsignal.pthread_sigmask(how, mask) -> old mask\nsignal.set_wakeup_fd(fd) -> fd\nsignal.setitimer(which, seconds[, interval])\nsignal.siginterrupt(sig, flag) -> None\nsignal.signal(sig, action) -> action\nsignal.sigpending() -> list\nsignal.sigwait(sigset) -> signum\nsite.CONFIG_LINE\nsite.ENABLE_USER_SITE(??)\nsite.PREFIXES(??)\nsite.USER_BASE\nsite.USER_SITE\nsite.abs_paths(??)\nsite.addpackage(??)\nsite.addsitedir(??)\nsite.addsitepackages(??)\nsite.addusersitepackages(??)\nsite.aliasmbcs(??)\nsite.builtins(??)\nsite.check_enableusersite(??)\nsite.enablerlcompleter(??)\nsite.execsitecustomize(??)\nsite.execusercustomize(??)\nsite.getsitepackages(??)\nsite.getuserbase(??)\nsite.getusersitepackages(??)\nsite.main(??)\nsite.makepath(??)\nsite.os(??)\nsite.removeduppaths(??)\nsite.setcopyright(??)\nsite.sethelper(??)\nsite.setquit(??)\nsite.sys(??)\nsite.venv(??)\nslice(stop)\nsmtpd.COMMASPACE\nsmtpd.DATA_SIZE_DEFAULT\nsmtpd.DEBUGSTREAM(??)\nsmtpd.DebuggingServer(??)\nsmtpd.Devnull(??)\nsmtpd.EMPTYSTRING\nsmtpd.MailmanProxy(??)\nsmtpd.NEWLINE\nsmtpd.Options(??)\nsmtpd.PureProxy(??)\nsmtpd.SMTPChannel(??)\nsmtpd.SMTPServer(??)\nsmtpd.asynchat(??)\nsmtpd.asyncore(??)\nsmtpd.collections(??)\nsmtpd.errno(??)\nsmtpd.get_addr_spec(??)\nsmtpd.get_angle_addr(??)\nsmtpd.getopt(??)\nsmtpd.os(??)\nsmtpd.parseargs(??)\nsmtpd.program\nsmtpd.socket(??)\nsmtpd.sys(??)\nsmtpd.time(??)\nsmtpd.usage(??)\nsmtpd.warn(??)\nsmtplib.CRLF\nsmtplib.LMTP(??)\nsmtplib.LMTP_PORT\nsmtplib.OLDSTYLE_AUTH(??)\nsmtplib.SMTP(??)\nsmtplib.SMTPAuthenticationError(??)\nsmtplib.SMTPConnectError(??)\nsmtplib.SMTPDataError(??)\nsmtplib.SMTPException(??)\nsmtplib.SMTPHeloError(??)\nsmtplib.SMTPRecipientsRefused(??)\nsmtplib.SMTPResponseException(??)\nsmtplib.SMTPSenderRefused(??)\nsmtplib.SMTPServerDisconnected(??)\nsmtplib.SMTP_PORT\nsmtplib.SMTP_SSL(??)\nsmtplib.SMTP_SSL_PORT\nsmtplib.bCRLF\nsmtplib.base64(??)\nsmtplib.copy(??)\nsmtplib.email(??)\nsmtplib.encode_base64(??)\nsmtplib.hmac(??)\nsmtplib.io(??)\nsmtplib.quoteaddr(??)\nsmtplib.quotedata(??)\nsmtplib.re(??)\nsmtplib.socket(??)\nsmtplib.ssl(??)\nsmtplib.stderr(??)\nsndhdr.get_long_be(??)\nsndhdr.get_long_le(??)\nsndhdr.get_short_be(??)\nsndhdr.get_short_le(??)\nsndhdr.test(??)\nsndhdr.test_8svx(??)\nsndhdr.test_aifc(??)\nsndhdr.test_au(??)\nsndhdr.test_hcom(??)\nsndhdr.test_sndr(??)\nsndhdr.test_sndt(??)\nsndhdr.test_voc(??)\nsndhdr.test_wav(??)\nsndhdr.testall(??)\nsndhdr.tests(??)\nsndhdr.what(??)\nsndhdr.whathdr(??)\nsocket.AF_APPLETALK(??)\nsocket.AF_DECnet\nsocket.AF_INET(??)\nsocket.AF_INET6(??)\nsocket.AF_IPX(??)\nsocket.AF_LINK(??)\nsocket.AF_ROUTE(??)\nsocket.AF_SNA(??)\nsocket.AF_SYSTEM(??)\nsocket.AF_UNIX(??)\nsocket.AF_UNSPEC(??)\nsocket.AI_ADDRCONFIG\nsocket.AI_ALL\nsocket.AI_CANONNAME\nsocket.AI_DEFAULT\nsocket.AI_MASK\nsocket.AI_NUMERICHOST\nsocket.AI_NUMERICSERV\nsocket.AI_PASSIVE\nsocket.AI_V4MAPPED\nsocket.AI_V4MAPPED_CFG\nsocket.AddressFamily(??)\nsocket.CAPI(??)\nsocket.CMSG_LEN(length) -> control message length\nsocket.CMSG_SPACE(length) -> buffer size\nsocket.EAGAIN\nsocket.EAI_ADDRFAMILY\nsocket.EAI_AGAIN\nsocket.EAI_BADFLAGS\nsocket.EAI_BADHINTS\nsocket.EAI_FAIL\nsocket.EAI_FAMILY\nsocket.EAI_MAX\nsocket.EAI_MEMORY\nsocket.EAI_NODATA\nsocket.EAI_NONAME\nsocket.EAI_OVERFLOW\nsocket.EAI_PROTOCOL\nsocket.EAI_SERVICE\nsocket.EAI_SOCKTYPE\nsocket.EAI_SYSTEM\nsocket.EBADF\nsocket.EWOULDBLOCK\nsocket.INADDR_ALLHOSTS_GROUP\nsocket.INADDR_ANY\nsocket.INADDR_BROADCAST\nsocket.INADDR_LOOPBACK\nsocket.INADDR_MAX_LOCAL_GROUP\nsocket.INADDR_NONE\nsocket.INADDR_UNSPEC_GROUP\nsocket.IPPORT_RESERVED\nsocket.IPPORT_USERRESERVED\nsocket.IPPROTO_AH\nsocket.IPPROTO_DSTOPTS\nsocket.IPPROTO_EGP\nsocket.IPPROTO_EON\nsocket.IPPROTO_ESP\nsocket.IPPROTO_FRAGMENT\nsocket.IPPROTO_GGP\nsocket.IPPROTO_GRE\nsocket.IPPROTO_HELLO\nsocket.IPPROTO_HOPOPTS\nsocket.IPPROTO_ICMP\nsocket.IPPROTO_ICMPV6\nsocket.IPPROTO_IDP\nsocket.IPPROTO_IGMP\nsocket.IPPROTO_IP\nsocket.IPPROTO_IPCOMP\nsocket.IPPROTO_IPIP\nsocket.IPPROTO_IPV4\nsocket.IPPROTO_IPV6\nsocket.IPPROTO_MAX\nsocket.IPPROTO_ND\nsocket.IPPROTO_NONE\nsocket.IPPROTO_PIM\nsocket.IPPROTO_PUP\nsocket.IPPROTO_RAW\nsocket.IPPROTO_ROUTING\nsocket.IPPROTO_RSVP\nsocket.IPPROTO_TCP\nsocket.IPPROTO_TP\nsocket.IPPROTO_UDP\nsocket.IPPROTO_XTP\nsocket.IPV6_CHECKSUM\nsocket.IPV6_DSTOPTS\nsocket.IPV6_HOPLIMIT\nsocket.IPV6_HOPOPTS\nsocket.IPV6_JOIN_GROUP\nsocket.IPV6_LEAVE_GROUP\nsocket.IPV6_MULTICAST_HOPS\nsocket.IPV6_MULTICAST_IF\nsocket.IPV6_MULTICAST_LOOP\nsocket.IPV6_NEXTHOP\nsocket.IPV6_PKTINFO\nsocket.IPV6_RECVTCLASS\nsocket.IPV6_RTHDR\nsocket.IPV6_RTHDR_TYPE_0\nsocket.IPV6_TCLASS\nsocket.IPV6_UNICAST_HOPS\nsocket.IPV6_V6ONLY\nsocket.IP_ADD_MEMBERSHIP\nsocket.IP_DEFAULT_MULTICAST_LOOP\nsocket.IP_DEFAULT_MULTICAST_TTL\nsocket.IP_DROP_MEMBERSHIP\nsocket.IP_HDRINCL\nsocket.IP_MAX_MEMBERSHIPS\nsocket.IP_MULTICAST_IF\nsocket.IP_MULTICAST_LOOP\nsocket.IP_MULTICAST_TTL\nsocket.IP_OPTIONS\nsocket.IP_RECVDSTADDR\nsocket.IP_RECVOPTS\nsocket.IP_RECVRETOPTS\nsocket.IP_RETOPTS\nsocket.IP_TOS\nsocket.IP_TTL\nsocket.IntEnum(??)\nsocket.LOCAL_PEERCRED\nsocket.MSG_CTRUNC\nsocket.MSG_DONTROUTE\nsocket.MSG_DONTWAIT\nsocket.MSG_EOF\nsocket.MSG_EOR\nsocket.MSG_OOB\nsocket.MSG_PEEK\nsocket.MSG_TRUNC\nsocket.MSG_WAITALL\nsocket.NI_DGRAM\nsocket.NI_MAXHOST\nsocket.NI_MAXSERV\nsocket.NI_NAMEREQD\nsocket.NI_NOFQDN\nsocket.NI_NUMERICHOST\nsocket.NI_NUMERICSERV\nsocket.PF_SYSTEM\nsocket.SCM_CREDS\nsocket.SCM_RIGHTS\nsocket.SHUT_RD\nsocket.SHUT_RDWR\nsocket.SHUT_WR\nsocket.SOCK_DGRAM(??)\nsocket.SOCK_RAW(??)\nsocket.SOCK_RDM(??)\nsocket.SOCK_SEQPACKET(??)\nsocket.SOCK_STREAM(??)\nsocket.SOL_IP\nsocket.SOL_SOCKET\nsocket.SOL_TCP\nsocket.SOL_UDP\nsocket.SOMAXCONN\nsocket.SO_ACCEPTCONN\nsocket.SO_BROADCAST\nsocket.SO_DEBUG\nsocket.SO_DONTROUTE\nsocket.SO_ERROR\nsocket.SO_KEEPALIVE\nsocket.SO_LINGER\nsocket.SO_OOBINLINE\nsocket.SO_RCVBUF\nsocket.SO_RCVLOWAT\nsocket.SO_RCVTIMEO\nsocket.SO_REUSEADDR\nsocket.SO_REUSEPORT\nsocket.SO_SNDBUF\nsocket.SO_SNDLOWAT\nsocket.SO_SNDTIMEO\nsocket.SO_TYPE\nsocket.SO_USELOOPBACK\nsocket.SYSPROTO_CONTROL\nsocket.SocketIO(??)\nsocket.SocketType(??)\nsocket.TCP_MAXSEG\nsocket.TCP_NODELAY\nsocket.create_connection(??)\nsocket.dup(integer) -> integer\nsocket.errno(??)\nsocket.error(??)\nsocket.fromfd(fd, family, type[, proto]) -> socket object\nsocket.gaierror(??)\nsocket.getaddrinfo(??)\nsocket.getdefaulttimeout() -> timeout\nsocket.getfqdn(??)\nsocket.gethostbyaddr(host) -> (name, aliaslist, addresslist)\nsocket.gethostbyname(host) -> address\nsocket.gethostbyname_ex(host) -> (name, aliaslist, addresslist)\nsocket.gethostname() -> string\nsocket.getnameinfo(sockaddr, flags) --> (host, port)\nsocket.getprotobyname(name) -> integer\nsocket.getservbyname(servicename[, protocolname]) -> integer\nsocket.getservbyport(port[, protocolname]) -> string\nsocket.has_ipv6(??)\nsocket.herror(??)\nsocket.htonl(integer) -> integer\nsocket.htons(integer) -> integer\nsocket.if_indextoname(if_index)\nsocket.if_nameindex()\nsocket.if_nametoindex(if_name)\nsocket.inet_aton(string) -> bytes giving packed 32-bit IP representation\nsocket.inet_ntoa(packed_ip) -> ip_address_string\nsocket.inet_ntop(af, packed_ip) -> string formatted IP address\nsocket.inet_pton(af, ip) -> packed IP address string\nsocket.io(??)\nsocket.ntohl(integer) -> integer\nsocket.ntohs(integer) -> integer\nsocket.os(??)\nsocket.setdefaulttimeout(timeout)\nsocket.sethostname(name)\nsocket.socket(??)\nsocket.socketpair([family[, type[, proto]]]) -> (socket object, socket object)\nsocket.sys(??)\nsocket.timeout(??)\nsocketserver.BaseRequestHandler(??)\nsocketserver.BaseServer(??)\nsocketserver.DatagramRequestHandler(??)\nsocketserver.ForkingMixIn(??)\nsocketserver.ForkingTCPServer(??)\nsocketserver.ForkingUDPServer(??)\nsocketserver.StreamRequestHandler(??)\nsocketserver.TCPServer(??)\nsocketserver.ThreadingMixIn(??)\nsocketserver.ThreadingTCPServer(??)\nsocketserver.ThreadingUDPServer(??)\nsocketserver.ThreadingUnixDatagramServer(??)\nsocketserver.ThreadingUnixStreamServer(??)\nsocketserver.UDPServer(??)\nsocketserver.UnixDatagramServer(??)\nsocketserver.UnixStreamServer(??)\nsocketserver.errno(??)\nsocketserver.os(??)\nsocketserver.select(??)\nsocketserver.socket(??)\nsocketserver.sys(??)\nsocketserver.threading(??)\nsorted(iterable, key=None, reverse=False) --> new sorted list\nsqlite3.Binary(??)\nsqlite3.Cache(??)\nsqlite3.Connection(??)\nsqlite3.Cursor(??)\nsqlite3.DataError(??)\nsqlite3.DatabaseError(??)\nsqlite3.Date(??)\nsqlite3.DateFromTicks(??)\nsqlite3.Error(??)\nsqlite3.IntegrityError(??)\nsqlite3.InterfaceError(??)\nsqlite3.InternalError(??)\nsqlite3.NotSupportedError(??)\nsqlite3.OperationalError(??)\nsqlite3.OptimizedUnicode(??)\nsqlite3.PARSE_COLNAMES\nsqlite3.PARSE_DECLTYPES\nsqlite3.PrepareProtocol(??)\nsqlite3.ProgrammingError(??)\nsqlite3.Row(??)\nsqlite3.SQLITE_ALTER_TABLE\nsqlite3.SQLITE_ANALYZE\nsqlite3.SQLITE_ATTACH\nsqlite3.SQLITE_CREATE_INDEX\nsqlite3.SQLITE_CREATE_TABLE\nsqlite3.SQLITE_CREATE_TEMP_INDEX\nsqlite3.SQLITE_CREATE_TEMP_TABLE\nsqlite3.SQLITE_CREATE_TEMP_TRIGGER\nsqlite3.SQLITE_CREATE_TEMP_VIEW\nsqlite3.SQLITE_CREATE_TRIGGER\nsqlite3.SQLITE_CREATE_VIEW\nsqlite3.SQLITE_DELETE\nsqlite3.SQLITE_DENY\nsqlite3.SQLITE_DETACH\nsqlite3.SQLITE_DROP_INDEX\nsqlite3.SQLITE_DROP_TABLE\nsqlite3.SQLITE_DROP_TEMP_INDEX\nsqlite3.SQLITE_DROP_TEMP_TABLE\nsqlite3.SQLITE_DROP_TEMP_TRIGGER\nsqlite3.SQLITE_DROP_TEMP_VIEW\nsqlite3.SQLITE_DROP_TRIGGER\nsqlite3.SQLITE_DROP_VIEW\nsqlite3.SQLITE_IGNORE\nsqlite3.SQLITE_INSERT\nsqlite3.SQLITE_OK\nsqlite3.SQLITE_PRAGMA\nsqlite3.SQLITE_READ\nsqlite3.SQLITE_REINDEX\nsqlite3.SQLITE_SELECT\nsqlite3.SQLITE_TRANSACTION\nsqlite3.SQLITE_UPDATE\nsqlite3.Statement(??)\nsqlite3.Time(??)\nsqlite3.TimeFromTicks(??)\nsqlite3.Timestamp(??)\nsqlite3.TimestampFromTicks(??)\nsqlite3.Warning(??)\nsqlite3.adapt(obj, protocol, alternate) -> adapt obj to given protocol. Non-standard.\nsqlite3.adapters(??)\nsqlite3.apilevel\nsqlite3.complete_statement(sql)\nsqlite3.connect(??)\nsqlite3.converters(??)\nsqlite3.datetime(??)\nsqlite3.dbapi2(??)\nsqlite3.dbapi2.Binary(??)\nsqlite3.dbapi2.Cache(??)\nsqlite3.dbapi2.Connection(??)\nsqlite3.dbapi2.Cursor(??)\nsqlite3.dbapi2.DataError(??)\nsqlite3.dbapi2.DatabaseError(??)\nsqlite3.dbapi2.Date(??)\nsqlite3.dbapi2.DateFromTicks(??)\nsqlite3.dbapi2.Error(??)\nsqlite3.dbapi2.IntegrityError(??)\nsqlite3.dbapi2.InterfaceError(??)\nsqlite3.dbapi2.InternalError(??)\nsqlite3.dbapi2.NotSupportedError(??)\nsqlite3.dbapi2.OperationalError(??)\nsqlite3.dbapi2.OptimizedUnicode(??)\nsqlite3.dbapi2.PARSE_COLNAMES\nsqlite3.dbapi2.PARSE_DECLTYPES\nsqlite3.dbapi2.PrepareProtocol(??)\nsqlite3.dbapi2.ProgrammingError(??)\nsqlite3.dbapi2.Row(??)\nsqlite3.dbapi2.SQLITE_ALTER_TABLE\nsqlite3.dbapi2.SQLITE_ANALYZE\nsqlite3.dbapi2.SQLITE_ATTACH\nsqlite3.dbapi2.SQLITE_CREATE_INDEX\nsqlite3.dbapi2.SQLITE_CREATE_TABLE\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_INDEX\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_TABLE\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_TRIGGER\nsqlite3.dbapi2.SQLITE_CREATE_TEMP_VIEW\nsqlite3.dbapi2.SQLITE_CREATE_TRIGGER\nsqlite3.dbapi2.SQLITE_CREATE_VIEW\nsqlite3.dbapi2.SQLITE_DELETE\nsqlite3.dbapi2.SQLITE_DENY\nsqlite3.dbapi2.SQLITE_DETACH\nsqlite3.dbapi2.SQLITE_DROP_INDEX\nsqlite3.dbapi2.SQLITE_DROP_TABLE\nsqlite3.dbapi2.SQLITE_DROP_TEMP_INDEX\nsqlite3.dbapi2.SQLITE_DROP_TEMP_TABLE\nsqlite3.dbapi2.SQLITE_DROP_TEMP_TRIGGER\nsqlite3.dbapi2.SQLITE_DROP_TEMP_VIEW\nsqlite3.dbapi2.SQLITE_DROP_TRIGGER\nsqlite3.dbapi2.SQLITE_DROP_VIEW\nsqlite3.dbapi2.SQLITE_IGNORE\nsqlite3.dbapi2.SQLITE_INSERT\nsqlite3.dbapi2.SQLITE_OK\nsqlite3.dbapi2.SQLITE_PRAGMA\nsqlite3.dbapi2.SQLITE_READ\nsqlite3.dbapi2.SQLITE_REINDEX\nsqlite3.dbapi2.SQLITE_SELECT\nsqlite3.dbapi2.SQLITE_TRANSACTION\nsqlite3.dbapi2.SQLITE_UPDATE\nsqlite3.dbapi2.Statement(??)\nsqlite3.dbapi2.Time(??)\nsqlite3.dbapi2.TimeFromTicks(??)\nsqlite3.dbapi2.Timestamp(??)\nsqlite3.dbapi2.TimestampFromTicks(??)\nsqlite3.dbapi2.Warning(??)\nsqlite3.dbapi2.adapt(obj, protocol, alternate) -> adapt obj to given protocol. Non-standard.\nsqlite3.dbapi2.adapters(??)\nsqlite3.dbapi2.apilevel\nsqlite3.dbapi2.complete_statement(sql)\nsqlite3.dbapi2.connect(??)\nsqlite3.dbapi2.converters(??)\nsqlite3.dbapi2.datetime(??)\nsqlite3.dbapi2.enable_callback_tracebacks(flag)\nsqlite3.dbapi2.enable_shared_cache(do_enable)\nsqlite3.dbapi2.paramstyle\nsqlite3.dbapi2.register_adapter(type, callable)\nsqlite3.dbapi2.register_converter(typename, callable)\nsqlite3.dbapi2.sqlite_version\nsqlite3.dbapi2.sqlite_version_info(??)\nsqlite3.dbapi2.threadsafety\nsqlite3.dbapi2.time(??)\nsqlite3.dbapi2.version\nsqlite3.dbapi2.version_info(??)\nsqlite3.enable_callback_tracebacks(flag)\nsqlite3.enable_shared_cache(do_enable)\nsqlite3.paramstyle\nsqlite3.register_adapter(type, callable)\nsqlite3.register_converter(typename, callable)\nsqlite3.sqlite_version\nsqlite3.sqlite_version_info(??)\nsqlite3.threadsafety\nsqlite3.time(??)\nsqlite3.version\nsqlite3.version_info(??)\nssl.AF_INET(??)\nssl.ALERT_DESCRIPTION_ACCESS_DENIED\nssl.ALERT_DESCRIPTION_BAD_CERTIFICATE\nssl.ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE\nssl.ALERT_DESCRIPTION_BAD_RECORD_MAC\nssl.ALERT_DESCRIPTION_CERTIFICATE_EXPIRED\nssl.ALERT_DESCRIPTION_CERTIFICATE_REVOKED\nssl.ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN\nssl.ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE\nssl.ALERT_DESCRIPTION_CLOSE_NOTIFY\nssl.ALERT_DESCRIPTION_DECODE_ERROR\nssl.ALERT_DESCRIPTION_DECOMPRESSION_FAILURE\nssl.ALERT_DESCRIPTION_DECRYPT_ERROR\nssl.ALERT_DESCRIPTION_HANDSHAKE_FAILURE\nssl.ALERT_DESCRIPTION_ILLEGAL_PARAMETER\nssl.ALERT_DESCRIPTION_INSUFFICIENT_SECURITY\nssl.ALERT_DESCRIPTION_INTERNAL_ERROR\nssl.ALERT_DESCRIPTION_NO_RENEGOTIATION\nssl.ALERT_DESCRIPTION_PROTOCOL_VERSION\nssl.ALERT_DESCRIPTION_RECORD_OVERFLOW\nssl.ALERT_DESCRIPTION_UNEXPECTED_MESSAGE\nssl.ALERT_DESCRIPTION_UNKNOWN_CA\nssl.ALERT_DESCRIPTION_UNRECOGNIZED_NAME\nssl.ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE\nssl.ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION\nssl.ALERT_DESCRIPTION_USER_CANCELLED\nssl.CERT_NONE\nssl.CERT_OPTIONAL\nssl.CERT_REQUIRED\nssl.CHANNEL_BINDING_TYPES(??)\nssl.CertificateError(??)\nssl.DER_cert_to_PEM_cert(??)\nssl.DefaultVerifyPaths(cafile, capath, openssl_cafile_env, openssl_cafile, openssl_capath_env, openssl_capath)\nssl.HAS_ECDH(??)\nssl.HAS_NPN(??)\nssl.HAS_SNI(??)\nssl.OPENSSL_VERSION\nssl.OPENSSL_VERSION_INFO(??)\nssl.OPENSSL_VERSION_NUMBER\nssl.OP_ALL\nssl.OP_CIPHER_SERVER_PREFERENCE\nssl.OP_NO_SSLv2\nssl.OP_NO_SSLv3\nssl.OP_NO_TLSv1\nssl.OP_SINGLE_DH_USE\nssl.OP_SINGLE_ECDH_USE\nssl.PEM_FOOTER\nssl.PEM_HEADER\nssl.PEM_cert_to_DER_cert(??)\nssl.PROTOCOL_SSLv2\nssl.PROTOCOL_SSLv23\nssl.PROTOCOL_SSLv3\nssl.PROTOCOL_TLSv1\nssl.Purpose(??)\nssl.RAND_add(string, entropy)\nssl.RAND_bytes(n) -> bytes\nssl.RAND_egd(path) -> bytes\nssl.RAND_pseudo_bytes(n) -> (bytes, is_cryptographic)\nssl.RAND_status() -> 0 or 1\nssl.SOCK_STREAM(??)\nssl.SOL_SOCKET\nssl.SO_TYPE\nssl.SSLContext(??)\nssl.SSLEOFError(??)\nssl.SSLError(??)\nssl.SSLSocket(??)\nssl.SSLSyscallError(??)\nssl.SSLWantReadError(??)\nssl.SSLWantWriteError(??)\nssl.SSLZeroReturnError(??)\nssl.SSL_ERROR_EOF\nssl.SSL_ERROR_INVALID_ERROR_CODE\nssl.SSL_ERROR_SSL\nssl.SSL_ERROR_SYSCALL\nssl.SSL_ERROR_WANT_CONNECT\nssl.SSL_ERROR_WANT_READ\nssl.SSL_ERROR_WANT_WRITE\nssl.SSL_ERROR_WANT_X509_LOOKUP\nssl.SSL_ERROR_ZERO_RETURN\nssl.VERIFY_CRL_CHECK_CHAIN\nssl.VERIFY_CRL_CHECK_LEAF\nssl.VERIFY_DEFAULT\nssl.VERIFY_X509_STRICT\nssl.base64(??)\nssl.cert_time_to_seconds(??)\nssl.create_connection(??)\nssl.create_default_context(??)\nssl.errno(??)\nssl.get_default_verify_paths(??)\nssl.get_protocol_name(??)\nssl.get_server_certificate(??)\nssl.match_hostname(??)\nssl.namedtuple(??)\nssl.os(??)\nssl.re(??)\nssl.socket(??)\nssl.socket_error(??)\nssl.sys(??)\nssl.textwrap(??)\nssl.traceback(??)\nssl.wrap_socket(??)\nstat.SF_APPEND\nstat.SF_ARCHIVED\nstat.SF_IMMUTABLE\nstat.SF_NOUNLINK\nstat.SF_SNAPSHOT\nstat.ST_ATIME\nstat.ST_CTIME\nstat.ST_DEV\nstat.ST_GID\nstat.ST_INO\nstat.ST_MODE\nstat.ST_MTIME\nstat.ST_NLINK\nstat.ST_SIZE\nstat.ST_UID\nstat.S_ENFMT\nstat.S_IEXEC\nstat.S_IFBLK\nstat.S_IFCHR\nstat.S_IFDIR\nstat.S_IFDOOR\nstat.S_IFIFO\nstat.S_IFLNK\nstat.S_IFMT(??)\nstat.S_IFPORT\nstat.S_IFREG\nstat.S_IFSOCK\nstat.S_IFWHT\nstat.S_IMODE(??)\nstat.S_IREAD\nstat.S_IRGRP\nstat.S_IROTH\nstat.S_IRUSR\nstat.S_IRWXG\nstat.S_IRWXO\nstat.S_IRWXU\nstat.S_ISBLK(mode) -> bool\nstat.S_ISCHR(mode) -> bool\nstat.S_ISDIR(mode) -> bool\nstat.S_ISDOOR(mode) -> bool\nstat.S_ISFIFO(mode) -> bool\nstat.S_ISGID\nstat.S_ISLNK(mode) -> bool\nstat.S_ISPORT(mode) -> bool\nstat.S_ISREG(mode) -> bool\nstat.S_ISSOCK(mode) -> bool\nstat.S_ISUID\nstat.S_ISVTX\nstat.S_ISWHT(mode) -> bool\nstat.S_IWGRP\nstat.S_IWOTH\nstat.S_IWRITE\nstat.S_IWUSR\nstat.S_IXGRP\nstat.S_IXOTH\nstat.S_IXUSR\nstat.UF_APPEND\nstat.UF_COMPRESSED\nstat.UF_HIDDEN\nstat.UF_IMMUTABLE\nstat.UF_NODUMP\nstat.UF_NOUNLINK\nstat.UF_OPAQUE\nstat.filemode(??)\nstaticmethod(function) -> method\nstatistics.Decimal(??)\nstatistics.Fraction(??)\nstatistics.StatisticsError(??)\nstatistics.collections(??)\nstatistics.math(??)\nstatistics.mean(??)\nstatistics.median(??)\nstatistics.median_grouped(??)\nstatistics.median_high(??)\nstatistics.median_low(??)\nstatistics.mode(??)\nstatistics.pstdev(??)\nstatistics.pvariance(??)\nstatistics.stdev(??)\nstatistics.variance(??)\nstr(object='') -> str\nstring.ChainMap(??)\nstring.Formatter(??)\nstring.Template(??)\nstring.ascii_letters\nstring.ascii_lowercase\nstring.ascii_uppercase\nstring.capwords(s [,sep]) -> string\nstring.digits\nstring.hexdigits\nstring.octdigits\nstring.printable\nstring.punctuation\nstring.whitespace\nstringprep.b1_set(??)\nstringprep.b3_exceptions(??)\nstringprep.c22_specials(??)\nstringprep.c6_set(??)\nstringprep.c7_set(??)\nstringprep.c8_set(??)\nstringprep.c9_set(??)\nstringprep.in_table_a1(??)\nstringprep.in_table_b1(??)\nstringprep.in_table_c11(??)\nstringprep.in_table_c11_c12(??)\nstringprep.in_table_c12(??)\nstringprep.in_table_c21(??)\nstringprep.in_table_c21_c22(??)\nstringprep.in_table_c22(??)\nstringprep.in_table_c3(??)\nstringprep.in_table_c4(??)\nstringprep.in_table_c5(??)\nstringprep.in_table_c6(??)\nstringprep.in_table_c7(??)\nstringprep.in_table_c8(??)\nstringprep.in_table_c9(??)\nstringprep.in_table_d1(??)\nstringprep.in_table_d2(??)\nstringprep.map_table_b2(??)\nstringprep.map_table_b3(??)\nstringprep.unicodedata(??)\nstruct.Struct(fmt) --> compiled struct object\nstruct.calcsize(fmt) -> integer\nstruct.error(??)\nstruct.iter_unpack(fmt, buffer) -> iterator(v1, v2, ...)\nstruct.pack(fmt, v1, v2, ...) -> bytes\nstruct.pack_into(fmt, buffer, offset, v1, v2, ...)\nstruct.unpack(fmt, buffer) -> (v1, v2, ...)\nstruct.unpack_from(fmt, buffer, offset=0) -> (v1, v2, ...)\nsubprocess.CalledProcessError(??)\nsubprocess.DEVNULL\nsubprocess.MAXFD\nsubprocess.PIPE\nsubprocess.Popen(??)\nsubprocess.STDOUT\nsubprocess.SubprocessError(??)\nsubprocess.TimeoutExpired(??)\nsubprocess.builtins(??)\nsubprocess.call(??)\nsubprocess.check_call(??)\nsubprocess.check_output(??)\nsubprocess.errno(??)\nsubprocess.gc(??)\nsubprocess.getoutput(??)\nsubprocess.getstatusoutput(??)\nsubprocess.io(??)\nsubprocess.list2cmdline(??)\nsubprocess.mswindows(??)\nsubprocess.os(??)\nsubprocess.select(??)\nsubprocess.selectors(??)\nsubprocess.signal(??)\nsubprocess.sys(??)\nsubprocess.time(??)\nsubprocess.traceback(??)\nsubprocess.warnings(??)\nsum(iterable[, start]) -> value\nsunau.AUDIO_FILE_ENCODING_ADPCM_G721\nsunau.AUDIO_FILE_ENCODING_ADPCM_G722\nsunau.AUDIO_FILE_ENCODING_ADPCM_G723_3\nsunau.AUDIO_FILE_ENCODING_ADPCM_G723_5\nsunau.AUDIO_FILE_ENCODING_ALAW_8\nsunau.AUDIO_FILE_ENCODING_DOUBLE\nsunau.AUDIO_FILE_ENCODING_FLOAT\nsunau.AUDIO_FILE_ENCODING_LINEAR_16\nsunau.AUDIO_FILE_ENCODING_LINEAR_24\nsunau.AUDIO_FILE_ENCODING_LINEAR_32\nsunau.AUDIO_FILE_ENCODING_LINEAR_8\nsunau.AUDIO_FILE_ENCODING_MULAW_8\nsunau.AUDIO_FILE_MAGIC\nsunau.AUDIO_UNKNOWN_SIZE\nsunau.Au_read(??)\nsunau.Au_write(??)\nsunau.Error(??)\nsunau.namedtuple(??)\nsunau.open(??)\nsunau.openfp(??)\nsuper() -> same as super(__class__, <first argument>)\nsymbol.and_expr\nsymbol.and_test\nsymbol.arglist\nsymbol.argument\nsymbol.arith_expr\nsymbol.assert_stmt\nsymbol.atom\nsymbol.augassign\nsymbol.break_stmt\nsymbol.classdef\nsymbol.comp_for\nsymbol.comp_if\nsymbol.comp_iter\nsymbol.comp_op\nsymbol.comparison\nsymbol.compound_stmt\nsymbol.continue_stmt\nsymbol.decorated\nsymbol.decorator\nsymbol.decorators\nsymbol.del_stmt\nsymbol.dictorsetmaker\nsymbol.dotted_as_name\nsymbol.dotted_as_names\nsymbol.dotted_name\nsymbol.encoding_decl\nsymbol.eval_input\nsymbol.except_clause\nsymbol.expr\nsymbol.expr_stmt\nsymbol.exprlist\nsymbol.factor\nsymbol.file_input\nsymbol.flow_stmt\nsymbol.for_stmt\nsymbol.funcdef\nsymbol.global_stmt\nsymbol.if_stmt\nsymbol.import_as_name\nsymbol.import_as_names\nsymbol.import_from\nsymbol.import_name\nsymbol.import_stmt\nsymbol.lambdef\nsymbol.lambdef_nocond\nsymbol.nonlocal_stmt\nsymbol.not_test\nsymbol.or_test\nsymbol.parameters\nsymbol.pass_stmt\nsymbol.power\nsymbol.raise_stmt\nsymbol.return_stmt\nsymbol.shift_expr\nsymbol.simple_stmt\nsymbol.single_input\nsymbol.sliceop\nsymbol.small_stmt\nsymbol.star_expr\nsymbol.stmt\nsymbol.subscript\nsymbol.subscriptlist\nsymbol.suite\nsymbol.sym_name(??)\nsymbol.term\nsymbol.test\nsymbol.test_nocond\nsymbol.testlist\nsymbol.testlist_comp\nsymbol.testlist_star_expr\nsymbol.tfpdef\nsymbol.trailer\nsymbol.try_stmt\nsymbol.typedargslist\nsymbol.varargslist\nsymbol.vfpdef\nsymbol.while_stmt\nsymbol.with_item\nsymbol.with_stmt\nsymbol.xor_expr\nsymbol.yield_arg\nsymbol.yield_expr\nsymbol.yield_stmt\nsymtable.CELL\nsymtable.Class(??)\nsymtable.DEF_BOUND\nsymtable.DEF_GLOBAL\nsymtable.DEF_IMPORT\nsymtable.DEF_LOCAL\nsymtable.DEF_PARAM\nsymtable.FREE\nsymtable.Function(??)\nsymtable.GLOBAL_EXPLICIT\nsymtable.GLOBAL_IMPLICIT\nsymtable.LOCAL\nsymtable.OPT_IMPORT_STAR\nsymtable.SCOPE_MASK\nsymtable.SCOPE_OFF\nsymtable.Symbol(??)\nsymtable.SymbolTable(??)\nsymtable.SymbolTableFactory(??)\nsymtable.USE\nsymtable.symtable(??)\nsymtable.weakref(??)\nsys.abiflags\nsys.api_version\nsys.argv(??)\nsys.base_exec_prefix\nsys.base_prefix\nsys.builtin_module_names(??)\nsys.byteorder\nsys.call_tracing(func, args) -> object\nsys.callstats() -> tuple of integers\nsys.copyright\nsys.displayhook(object) -> None\nsys.dont_write_bytecode(??)\nsys.exc_info() -> (type, value, traceback)\nsys.excepthook(exctype, value, traceback) -> None\nsys.exec_prefix\nsys.executable\nsys.exit([status])\nsys.flags(??)\nsys.float_info(??)\nsys.float_repr_style\nsys.getallocatedblocks() -> integer\nsys.getcheckinterval() -> current check interval; see setcheckinterval().\nsys.getdefaultencoding() -> string\nsys.getdlopenflags() -> int\nsys.getfilesystemencoding() -> string\nsys.getprofile()\nsys.getrecursionlimit()\nsys.getrefcount(object) -> integer\nsys.getsizeof(object, default) -> int\nsys.getswitchinterval() -> current thread switch interval; see setswitchinterval().\nsys.gettrace()\nsys.hash_info(??)\nsys.hexversion\nsys.implementation(??)\nsys.int_info(??)\nsys.intern(string) -> string\nsys.maxsize\nsys.maxunicode\nsys.meta_path(??)\nsys.modules(??)\nsys.path(??)\nsys.path_hooks(??)\nsys.path_importer_cache(??)\nsys.platform\nsys.prefix\nsys.setcheckinterval(n)\nsys.setdlopenflags(n) -> None\nsys.setprofile(function)\nsys.setrecursionlimit(n)\nsys.setswitchinterval(n)\nsys.settrace(function)\nsys.stderr(??)\nsys.stdin(??)\nsys.stdout(??)\nsys.thread_info(??)\nsys.version\nsys.version_info(??)\nsys.warnoptions(??)\nsysconfig.get_config_h_filename(??)\nsysconfig.get_config_var(??)\nsysconfig.get_config_vars(??)\nsysconfig.get_makefile_filename(??)\nsysconfig.get_path(??)\nsysconfig.get_path_names(??)\nsysconfig.get_paths(??)\nsysconfig.get_platform(??)\nsysconfig.get_python_version(??)\nsysconfig.get_scheme_names(??)\nsysconfig.is_python_build(??)\nsysconfig.os(??)\nsysconfig.pardir\nsysconfig.parse_config_h(??)\nsysconfig.realpath(??)\nsysconfig.sys(??)\nsyslog.LOG_ALERT\nsyslog.LOG_AUTH\nsyslog.LOG_AUTHPRIV\nsyslog.LOG_CONS\nsyslog.LOG_CRIT\nsyslog.LOG_CRON\nsyslog.LOG_DAEMON\nsyslog.LOG_DEBUG\nsyslog.LOG_EMERG\nsyslog.LOG_ERR\nsyslog.LOG_INFO\nsyslog.LOG_KERN\nsyslog.LOG_LOCAL0\nsyslog.LOG_LOCAL1\nsyslog.LOG_LOCAL2\nsyslog.LOG_LOCAL3\nsyslog.LOG_LOCAL4\nsyslog.LOG_LOCAL5\nsyslog.LOG_LOCAL6\nsyslog.LOG_LOCAL7\nsyslog.LOG_LPR\nsyslog.LOG_MAIL\nsyslog.LOG_MASK(??)\nsyslog.LOG_NDELAY\nsyslog.LOG_NEWS\nsyslog.LOG_NOTICE\nsyslog.LOG_NOWAIT\nsyslog.LOG_ODELAY\nsyslog.LOG_PERROR\nsyslog.LOG_PID\nsyslog.LOG_SYSLOG\nsyslog.LOG_UPTO(??)\nsyslog.LOG_USER\nsyslog.LOG_UUCP\nsyslog.LOG_WARNING\nsyslog.closelog(??)\nsyslog.openlog(??)\nsyslog.setlogmask(??)\nsyslog.syslog(??)\ntabnanny.NannyNag(??)\ntabnanny.Whitespace(??)\ntabnanny.check(file_or_dir)\ntabnanny.errprint(??)\ntabnanny.filename_only\ntabnanny.format_witnesses(??)\ntabnanny.getopt(??)\ntabnanny.main(??)\ntabnanny.os(??)\ntabnanny.process_tokens(??)\ntabnanny.sys(??)\ntabnanny.tokenize(??)\ntabnanny.verbose\ntarfile.AREGTYPE\ntarfile.BLKTYPE\ntarfile.BLOCKSIZE\ntarfile.CHRTYPE\ntarfile.CONTTYPE\ntarfile.CompressionError(??)\ntarfile.DEFAULT_FORMAT\ntarfile.DIRTYPE\ntarfile.ENCODING\ntarfile.EOFHeaderError(??)\ntarfile.EmptyHeaderError(??)\ntarfile.ExFileObject(??)\ntarfile.ExtractError(??)\ntarfile.FIFOTYPE\ntarfile.GNUTYPE_LONGLINK\ntarfile.GNUTYPE_LONGNAME\ntarfile.GNUTYPE_SPARSE\ntarfile.GNU_FORMAT\ntarfile.GNU_MAGIC\ntarfile.GNU_TYPES(??)\ntarfile.HeaderError(??)\ntarfile.InvalidHeaderError(??)\ntarfile.LENGTH_LINK\ntarfile.LENGTH_NAME\ntarfile.LENGTH_PREFIX\ntarfile.LNKTYPE\ntarfile.NUL\ntarfile.PAX_FIELDS(??)\ntarfile.PAX_FORMAT\ntarfile.PAX_NAME_FIELDS(??)\ntarfile.PAX_NUMBER_FIELDS(??)\ntarfile.POSIX_MAGIC\ntarfile.RECORDSIZE\ntarfile.REGTYPE\ntarfile.REGULAR_TYPES(??)\ntarfile.ReadError(??)\ntarfile.SOLARIS_XHDTYPE\ntarfile.SUPPORTED_TYPES(??)\ntarfile.SYMTYPE\ntarfile.StreamError(??)\ntarfile.SubsequentHeaderError(??)\ntarfile.TarError(??)\ntarfile.TarFile(??)\ntarfile.TarInfo(??)\ntarfile.TarIter(??)\ntarfile.TruncatedHeaderError(??)\ntarfile.USTAR_FORMAT\ntarfile.XGLTYPE\ntarfile.XHDTYPE\ntarfile.bltn_open(??)\ntarfile.calc_chksums(??)\ntarfile.copy(??)\ntarfile.copyfileobj(??)\ntarfile.filemode(??)\ntarfile.grp(??)\ntarfile.io(??)\ntarfile.is_tarfile(??)\ntarfile.itn(??)\ntarfile.main(??)\ntarfile.nti(??)\ntarfile.nts(??)\ntarfile.open(??)\ntarfile.os(??)\ntarfile.pwd(??)\ntarfile.re(??)\ntarfile.shutil(??)\ntarfile.stat(??)\ntarfile.stn(??)\ntarfile.struct(??)\ntarfile.symlink_exception(??)\ntarfile.sys(??)\ntarfile.time(??)\ntarfile.version\ntelnetlib.AO\ntelnetlib.AUTHENTICATION\ntelnetlib.AYT\ntelnetlib.BINARY\ntelnetlib.BM\ntelnetlib.BRK\ntelnetlib.CHARSET\ntelnetlib.COM_PORT_OPTION\ntelnetlib.DEBUGLEVEL\ntelnetlib.DET\ntelnetlib.DM\ntelnetlib.DO\ntelnetlib.DONT\ntelnetlib.EC\ntelnetlib.ECHO\ntelnetlib.EL\ntelnetlib.ENCRYPT\ntelnetlib.EOR\ntelnetlib.EXOPL\ntelnetlib.FORWARD_X\ntelnetlib.GA\ntelnetlib.IAC\ntelnetlib.IP\ntelnetlib.KERMIT\ntelnetlib.LFLOW\ntelnetlib.LINEMODE\ntelnetlib.LOGOUT\ntelnetlib.NAMS\ntelnetlib.NAOCRD\ntelnetlib.NAOFFD\ntelnetlib.NAOHTD\ntelnetlib.NAOHTS\ntelnetlib.NAOL\ntelnetlib.NAOLFD\ntelnetlib.NAOP\ntelnetlib.NAOVTD\ntelnetlib.NAOVTS\ntelnetlib.NAWS\ntelnetlib.NEW_ENVIRON\ntelnetlib.NOOPT\ntelnetlib.NOP\ntelnetlib.OLD_ENVIRON\ntelnetlib.OUTMRK\ntelnetlib.PRAGMA_HEARTBEAT\ntelnetlib.PRAGMA_LOGON\ntelnetlib.RCP\ntelnetlib.RCTE\ntelnetlib.RSP\ntelnetlib.SB\ntelnetlib.SE\ntelnetlib.SEND_URL\ntelnetlib.SGA\ntelnetlib.SNDLOC\ntelnetlib.SSPI_LOGON\ntelnetlib.STATUS\ntelnetlib.SUPDUP\ntelnetlib.SUPDUPOUTPUT\ntelnetlib.SUPPRESS_LOCAL_ECHO\ntelnetlib.TELNET_PORT\ntelnetlib.TLS\ntelnetlib.TM\ntelnetlib.TN3270E\ntelnetlib.TSPEED\ntelnetlib.TTYLOC\ntelnetlib.TTYPE\ntelnetlib.TUID\ntelnetlib.Telnet(??)\ntelnetlib.VT3270REGIME\ntelnetlib.WILL\ntelnetlib.WONT\ntelnetlib.X3PAD\ntelnetlib.XASCII\ntelnetlib.XAUTH\ntelnetlib.XDISPLOC\ntelnetlib.selectors(??)\ntelnetlib.socket(??)\ntelnetlib.sys(??)\ntelnetlib.test(??)\ntelnetlib.theNULL\ntempfile.NamedTemporaryFile(??)\ntempfile.SpooledTemporaryFile(??)\ntempfile.TMP_MAX\ntempfile.TemporaryDirectory(??)\ntempfile.TemporaryFile(??)\ntempfile.gettempdir(??)\ntempfile.gettempprefix(??)\ntempfile.mkdtemp(??)\ntempfile.mkstemp(??)\ntempfile.mktemp(??)\ntempfile.tempdir(??)\ntempfile.template\ntermios.B0\ntermios.B110\ntermios.B115200\ntermios.B1200\ntermios.B134\ntermios.B150\ntermios.B1800\ntermios.B19200\ntermios.B200\ntermios.B230400\ntermios.B2400\ntermios.B300\ntermios.B38400\ntermios.B4800\ntermios.B50\ntermios.B57600\ntermios.B600\ntermios.B75\ntermios.B9600\ntermios.BRKINT\ntermios.BS0\ntermios.BS1\ntermios.BSDLY\ntermios.CDSUSP\ntermios.CEOF\ntermios.CEOL\ntermios.CEOT\ntermios.CERASE\ntermios.CFLUSH\ntermios.CINTR\ntermios.CKILL\ntermios.CLNEXT\ntermios.CLOCAL\ntermios.CQUIT\ntermios.CR0\ntermios.CR1\ntermios.CR2\ntermios.CR3\ntermios.CRDLY\ntermios.CREAD\ntermios.CRPRNT\ntermios.CRTSCTS\ntermios.CS5\ntermios.CS6\ntermios.CS7\ntermios.CS8\ntermios.CSIZE\ntermios.CSTART\ntermios.CSTOP\ntermios.CSTOPB\ntermios.CSUSP\ntermios.CWERASE\ntermios.ECHO\ntermios.ECHOCTL\ntermios.ECHOE\ntermios.ECHOK\ntermios.ECHOKE\ntermios.ECHONL\ntermios.ECHOPRT\ntermios.EXTA\ntermios.EXTB\ntermios.FF0\ntermios.FF1\ntermios.FFDLY\ntermios.FIOASYNC\ntermios.FIOCLEX\ntermios.FIONBIO\ntermios.FIONCLEX\ntermios.FIONREAD\ntermios.FLUSHO\ntermios.HUPCL\ntermios.ICANON\ntermios.ICRNL\ntermios.IEXTEN\ntermios.IGNBRK\ntermios.IGNCR\ntermios.IGNPAR\ntermios.IMAXBEL\ntermios.INLCR\ntermios.INPCK\ntermios.ISIG\ntermios.ISTRIP\ntermios.IXANY\ntermios.IXOFF\ntermios.IXON\ntermios.NCCS\ntermios.NL0\ntermios.NL1\ntermios.NLDLY\ntermios.NOFLSH\ntermios.OCRNL\ntermios.OFDEL\ntermios.OFILL\ntermios.ONLCR\ntermios.ONLRET\ntermios.ONOCR\ntermios.OPOST\ntermios.PARENB\ntermios.PARMRK\ntermios.PARODD\ntermios.PENDIN\ntermios.TAB0\ntermios.TAB1\ntermios.TAB2\ntermios.TAB3\ntermios.TABDLY\ntermios.TCIFLUSH\ntermios.TCIOFF\ntermios.TCIOFLUSH\ntermios.TCION\ntermios.TCOFLUSH\ntermios.TCOOFF\ntermios.TCOON\ntermios.TCSADRAIN\ntermios.TCSAFLUSH\ntermios.TCSANOW\ntermios.TCSASOFT\ntermios.TIOCCONS\ntermios.TIOCEXCL\ntermios.TIOCGETD\ntermios.TIOCGPGRP\ntermios.TIOCGWINSZ\ntermios.TIOCMBIC\ntermios.TIOCMBIS\ntermios.TIOCMGET\ntermios.TIOCMSET\ntermios.TIOCM_CAR\ntermios.TIOCM_CD\ntermios.TIOCM_CTS\ntermios.TIOCM_DSR\ntermios.TIOCM_DTR\ntermios.TIOCM_LE\ntermios.TIOCM_RI\ntermios.TIOCM_RNG\ntermios.TIOCM_RTS\ntermios.TIOCM_SR\ntermios.TIOCM_ST\ntermios.TIOCNOTTY\ntermios.TIOCNXCL\ntermios.TIOCOUTQ\ntermios.TIOCPKT\ntermios.TIOCPKT_DATA\ntermios.TIOCPKT_DOSTOP\ntermios.TIOCPKT_FLUSHREAD\ntermios.TIOCPKT_FLUSHWRITE\ntermios.TIOCPKT_NOSTOP\ntermios.TIOCPKT_START\ntermios.TIOCPKT_STOP\ntermios.TIOCSCTTY\ntermios.TIOCSETD\ntermios.TIOCSPGRP\ntermios.TIOCSTI\ntermios.TIOCSWINSZ\ntermios.TOSTOP\ntermios.VDISCARD\ntermios.VEOF\ntermios.VEOL\ntermios.VEOL2\ntermios.VERASE\ntermios.VINTR\ntermios.VKILL\ntermios.VLNEXT\ntermios.VMIN\ntermios.VQUIT\ntermios.VREPRINT\ntermios.VSTART\ntermios.VSTOP\ntermios.VSUSP\ntermios.VT0\ntermios.VT1\ntermios.VTDLY\ntermios.VTIME\ntermios.VWERASE\ntermios.error(??)\ntermios.tcdrain(fd) -> None\ntermios.tcflow(fd, action) -> None\ntermios.tcflush(fd, queue) -> None\ntermios.tcgetattr(fd) -> list_of_attrs\ntermios.tcsendbreak(fd, duration) -> None\ntermios.tcsetattr(fd, when, attributes) -> None\ntextwrap.TextWrapper(??)\ntextwrap.dedent(??)\ntextwrap.fill(??)\ntextwrap.indent(??)\ntextwrap.re(??)\ntextwrap.shorten(??)\ntextwrap.wrap(??)\nthreading.Barrier(??)\nthreading.BoundedSemaphore(??)\nthreading.BrokenBarrierError(??)\nthreading.Condition(??)\nthreading.Event(??)\nthreading.Lock(??)\nthreading.RLock(??)\nthreading.Semaphore(??)\nthreading.TIMEOUT_MAX\nthreading.Thread(??)\nthreading.ThreadError(??)\nthreading.Timer(??)\nthreading.WeakSet(??)\nthreading.activeCount(??)\nthreading.active_count(??)\nthreading.currentThread(??)\nthreading.current_thread(??)\nthreading.enumerate(??)\nthreading.get_ident() -> integer\nthreading.local(??)\nthreading.main_thread(??)\nthreading.setprofile(??)\nthreading.settrace(??)\nthreading.stack_size([size]) -> size\ntime.altzone\ntime.asctime([tuple]) -> string\ntime.clock() -> floating point number\ntime.ctime(seconds) -> string\ntime.daylight\ntime.get_clock_info(name: str) -> dict\ntime.gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\ntime.localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\ntime.mktime(tuple) -> floating point number\ntime.monotonic() -> float\ntime.perf_counter() -> float\ntime.process_time() -> float\ntime.sleep(seconds)\ntime.strftime(format[, tuple]) -> string\ntime.strptime(string, format) -> struct_time\ntime.struct_time(??)\ntime.time() -> floating point number\ntime.timezone\ntime.tzname(??)\ntime.tzset()\ntimeit.Timer(??)\ntimeit.default_number\ntimeit.default_repeat\ntimeit.default_timer(??)\ntimeit.dummy_src_name\ntimeit.gc(??)\ntimeit.itertools(??)\ntimeit.main(??)\ntimeit.reindent(??)\ntimeit.repeat(??)\ntimeit.sys(??)\ntimeit.template\ntimeit.time(??)\ntimeit.timeit(??)\ntkinter.ACTIVE\ntkinter.ALL\ntkinter.ANCHOR\ntkinter.ARC\ntkinter.BASELINE\ntkinter.BEVEL\ntkinter.BOTH\ntkinter.BOTTOM\ntkinter.BROWSE\ntkinter.BUTT\ntkinter.BaseWidget(??)\ntkinter.BitmapImage(??)\ntkinter.BooleanVar(??)\ntkinter.Button(??)\ntkinter.CASCADE\ntkinter.CENTER\ntkinter.CHAR\ntkinter.CHECKBUTTON\ntkinter.CHORD\ntkinter.COMMAND\ntkinter.CURRENT\ntkinter.CallWrapper(??)\ntkinter.Canvas(??)\ntkinter.Checkbutton(??)\ntkinter.DISABLED\ntkinter.DOTBOX\ntkinter.DoubleVar(??)\ntkinter.E\ntkinter.END\ntkinter.EW\ntkinter.EXCEPTION\ntkinter.EXTENDED\ntkinter.Entry(??)\ntkinter.Event(??)\ntkinter.FALSE\ntkinter.FIRST\ntkinter.FLAT\ntkinter.Frame(??)\ntkinter.GROOVE\ntkinter.Grid(??)\ntkinter.HIDDEN\ntkinter.HORIZONTAL\ntkinter.INSERT\ntkinter.INSIDE\ntkinter.Image(??)\ntkinter.IntVar(??)\ntkinter.LAST\ntkinter.LEFT\ntkinter.Label(??)\ntkinter.LabelFrame(??)\ntkinter.Listbox(??)\ntkinter.MITER\ntkinter.MOVETO\ntkinter.MULTIPLE\ntkinter.Menu(??)\ntkinter.Menubutton(??)\ntkinter.Message(??)\ntkinter.Misc(??)\ntkinter.N\ntkinter.NE\ntkinter.NO\ntkinter.NONE\ntkinter.NORMAL\ntkinter.NS\ntkinter.NSEW\ntkinter.NUMERIC\ntkinter.NW\ntkinter.NoDefaultRoot(??)\ntkinter.OFF\ntkinter.ON\ntkinter.OUTSIDE\ntkinter.OptionMenu(??)\ntkinter.PAGES\ntkinter.PIESLICE\ntkinter.PROJECTING\ntkinter.Pack(??)\ntkinter.PanedWindow(??)\ntkinter.PhotoImage(??)\ntkinter.Place(??)\ntkinter.RADIOBUTTON\ntkinter.RAISED\ntkinter.READABLE\ntkinter.RIDGE\ntkinter.RIGHT\ntkinter.ROUND\ntkinter.Radiobutton(??)\ntkinter.S\ntkinter.SCROLL\ntkinter.SE\ntkinter.SEL\ntkinter.SEL_FIRST\ntkinter.SEL_LAST\ntkinter.SEPARATOR\ntkinter.SINGLE\ntkinter.SOLID\ntkinter.SUNKEN\ntkinter.SW\ntkinter.Scale(??)\ntkinter.Scrollbar(??)\ntkinter.Spinbox(??)\ntkinter.StringVar(??)\ntkinter.Studbutton(??)\ntkinter.TOP\ntkinter.TRUE\ntkinter.Tcl(??)\ntkinter.TclError(??)\ntkinter.TclVersion\ntkinter.Text(??)\ntkinter.Tk(??)\ntkinter.TkVersion\ntkinter.Toplevel(??)\ntkinter.Tributton(??)\ntkinter.UNDERLINE\ntkinter.UNITS\ntkinter.VERTICAL\ntkinter.Variable(??)\ntkinter.W\ntkinter.WORD\ntkinter.WRITABLE\ntkinter.Widget(??)\ntkinter.Wm(??)\ntkinter.X\ntkinter.XView(??)\ntkinter.Y\ntkinter.YES\ntkinter.YView(??)\ntkinter.colorchooser.Chooser(??)\ntkinter.colorchooser.Dialog(??)\ntkinter.colorchooser.askcolor(??)\ntkinter.commondialog.ACTIVE\ntkinter.commondialog.ALL\ntkinter.commondialog.ANCHOR\ntkinter.commondialog.ARC\ntkinter.commondialog.BASELINE\ntkinter.commondialog.BEVEL\ntkinter.commondialog.BOTH\ntkinter.commondialog.BOTTOM\ntkinter.commondialog.BROWSE\ntkinter.commondialog.BUTT\ntkinter.commondialog.BaseWidget(??)\ntkinter.commondialog.BitmapImage(??)\ntkinter.commondialog.BooleanVar(??)\ntkinter.commondialog.Button(??)\ntkinter.commondialog.CASCADE\ntkinter.commondialog.CENTER\ntkinter.commondialog.CHAR\ntkinter.commondialog.CHECKBUTTON\ntkinter.commondialog.CHORD\ntkinter.commondialog.COMMAND\ntkinter.commondialog.CURRENT\ntkinter.commondialog.CallWrapper(??)\ntkinter.commondialog.Canvas(??)\ntkinter.commondialog.Checkbutton(??)\ntkinter.commondialog.DISABLED\ntkinter.commondialog.DOTBOX\ntkinter.commondialog.Dialog(??)\ntkinter.commondialog.DoubleVar(??)\ntkinter.commondialog.E\ntkinter.commondialog.END\ntkinter.commondialog.EW\ntkinter.commondialog.EXCEPTION\ntkinter.commondialog.EXTENDED\ntkinter.commondialog.Entry(??)\ntkinter.commondialog.Event(??)\ntkinter.commondialog.FALSE\ntkinter.commondialog.FIRST\ntkinter.commondialog.FLAT\ntkinter.commondialog.Frame(??)\ntkinter.commondialog.GROOVE\ntkinter.commondialog.Grid(??)\ntkinter.commondialog.HIDDEN\ntkinter.commondialog.HORIZONTAL\ntkinter.commondialog.INSERT\ntkinter.commondialog.INSIDE\ntkinter.commondialog.Image(??)\ntkinter.commondialog.IntVar(??)\ntkinter.commondialog.LAST\ntkinter.commondialog.LEFT\ntkinter.commondialog.Label(??)\ntkinter.commondialog.LabelFrame(??)\ntkinter.commondialog.Listbox(??)\ntkinter.commondialog.MITER\ntkinter.commondialog.MOVETO\ntkinter.commondialog.MULTIPLE\ntkinter.commondialog.Menu(??)\ntkinter.commondialog.Menubutton(??)\ntkinter.commondialog.Message(??)\ntkinter.commondialog.Misc(??)\ntkinter.commondialog.N\ntkinter.commondialog.NE\ntkinter.commondialog.NO\ntkinter.commondialog.NONE\ntkinter.commondialog.NORMAL\ntkinter.commondialog.NS\ntkinter.commondialog.NSEW\ntkinter.commondialog.NUMERIC\ntkinter.commondialog.NW\ntkinter.commondialog.NoDefaultRoot(??)\ntkinter.commondialog.OFF\ntkinter.commondialog.ON\ntkinter.commondialog.OUTSIDE\ntkinter.commondialog.OptionMenu(??)\ntkinter.commondialog.PAGES\ntkinter.commondialog.PIESLICE\ntkinter.commondialog.PROJECTING\ntkinter.commondialog.Pack(??)\ntkinter.commondialog.PanedWindow(??)\ntkinter.commondialog.PhotoImage(??)\ntkinter.commondialog.Place(??)\ntkinter.commondialog.RADIOBUTTON\ntkinter.commondialog.RAISED\ntkinter.commondialog.READABLE\ntkinter.commondialog.RIDGE\ntkinter.commondialog.RIGHT\ntkinter.commondialog.ROUND\ntkinter.commondialog.Radiobutton(??)\ntkinter.commondialog.S\ntkinter.commondialog.SCROLL\ntkinter.commondialog.SE\ntkinter.commondialog.SEL\ntkinter.commondialog.SEL_FIRST\ntkinter.commondialog.SEL_LAST\ntkinter.commondialog.SEPARATOR\ntkinter.commondialog.SINGLE\ntkinter.commondialog.SOLID\ntkinter.commondialog.SUNKEN\ntkinter.commondialog.SW\ntkinter.commondialog.Scale(??)\ntkinter.commondialog.Scrollbar(??)\ntkinter.commondialog.Spinbox(??)\ntkinter.commondialog.StringVar(??)\ntkinter.commondialog.Studbutton(??)\ntkinter.commondialog.TOP\ntkinter.commondialog.TRUE\ntkinter.commondialog.Tcl(??)\ntkinter.commondialog.TclError(??)\ntkinter.commondialog.TclVersion\ntkinter.commondialog.Text(??)\ntkinter.commondialog.Tk(??)\ntkinter.commondialog.TkVersion\ntkinter.commondialog.Toplevel(??)\ntkinter.commondialog.Tributton(??)\ntkinter.commondialog.UNDERLINE\ntkinter.commondialog.UNITS\ntkinter.commondialog.VERTICAL\ntkinter.commondialog.Variable(??)\ntkinter.commondialog.W\ntkinter.commondialog.WORD\ntkinter.commondialog.WRITABLE\ntkinter.commondialog.Widget(??)\ntkinter.commondialog.Wm(??)\ntkinter.commondialog.X\ntkinter.commondialog.XView(??)\ntkinter.commondialog.Y\ntkinter.commondialog.YES\ntkinter.commondialog.YView(??)\ntkinter.commondialog.constants(??)\ntkinter.commondialog.getboolean(??)\ntkinter.commondialog.getdouble(??)\ntkinter.commondialog.getint(??)\ntkinter.commondialog.image_names(??)\ntkinter.commondialog.image_types(??)\ntkinter.commondialog.mainloop(??)\ntkinter.commondialog.re(??)\ntkinter.commondialog.sys(??)\ntkinter.commondialog.wantobjects\ntkinter.commondialog.warnings(??)\ntkinter.constants(??)\ntkinter.constants.ACTIVE\ntkinter.constants.ALL\ntkinter.constants.ANCHOR\ntkinter.constants.ARC\ntkinter.constants.BASELINE\ntkinter.constants.BEVEL\ntkinter.constants.BOTH\ntkinter.constants.BOTTOM\ntkinter.constants.BROWSE\ntkinter.constants.BUTT\ntkinter.constants.CASCADE\ntkinter.constants.CENTER\ntkinter.constants.CHAR\ntkinter.constants.CHECKBUTTON\ntkinter.constants.CHORD\ntkinter.constants.COMMAND\ntkinter.constants.CURRENT\ntkinter.constants.DISABLED\ntkinter.constants.DOTBOX\ntkinter.constants.E\ntkinter.constants.END\ntkinter.constants.EW\ntkinter.constants.EXTENDED\ntkinter.constants.FALSE\ntkinter.constants.FIRST\ntkinter.constants.FLAT\ntkinter.constants.GROOVE\ntkinter.constants.HIDDEN\ntkinter.constants.HORIZONTAL\ntkinter.constants.INSERT\ntkinter.constants.INSIDE\ntkinter.constants.LAST\ntkinter.constants.LEFT\ntkinter.constants.MITER\ntkinter.constants.MOVETO\ntkinter.constants.MULTIPLE\ntkinter.constants.N\ntkinter.constants.NE\ntkinter.constants.NO\ntkinter.constants.NONE\ntkinter.constants.NORMAL\ntkinter.constants.NS\ntkinter.constants.NSEW\ntkinter.constants.NUMERIC\ntkinter.constants.NW\ntkinter.constants.OFF\ntkinter.constants.ON\ntkinter.constants.OUTSIDE\ntkinter.constants.PAGES\ntkinter.constants.PIESLICE\ntkinter.constants.PROJECTING\ntkinter.constants.RADIOBUTTON\ntkinter.constants.RAISED\ntkinter.constants.RIDGE\ntkinter.constants.RIGHT\ntkinter.constants.ROUND\ntkinter.constants.S\ntkinter.constants.SCROLL\ntkinter.constants.SE\ntkinter.constants.SEL\ntkinter.constants.SEL_FIRST\ntkinter.constants.SEL_LAST\ntkinter.constants.SEPARATOR\ntkinter.constants.SINGLE\ntkinter.constants.SOLID\ntkinter.constants.SUNKEN\ntkinter.constants.SW\ntkinter.constants.TOP\ntkinter.constants.TRUE\ntkinter.constants.UNDERLINE\ntkinter.constants.UNITS\ntkinter.constants.VERTICAL\ntkinter.constants.W\ntkinter.constants.WORD\ntkinter.constants.X\ntkinter.constants.Y\ntkinter.constants.YES\ntkinter.dialog.ACTIVE\ntkinter.dialog.ALL\ntkinter.dialog.ANCHOR\ntkinter.dialog.ARC\ntkinter.dialog.BASELINE\ntkinter.dialog.BEVEL\ntkinter.dialog.BOTH\ntkinter.dialog.BOTTOM\ntkinter.dialog.BROWSE\ntkinter.dialog.BUTT\ntkinter.dialog.BaseWidget(??)\ntkinter.dialog.BitmapImage(??)\ntkinter.dialog.BooleanVar(??)\ntkinter.dialog.Button(??)\ntkinter.dialog.CASCADE\ntkinter.dialog.CENTER\ntkinter.dialog.CHAR\ntkinter.dialog.CHECKBUTTON\ntkinter.dialog.CHORD\ntkinter.dialog.COMMAND\ntkinter.dialog.CURRENT\ntkinter.dialog.CallWrapper(??)\ntkinter.dialog.Canvas(??)\ntkinter.dialog.Checkbutton(??)\ntkinter.dialog.DIALOG_ICON\ntkinter.dialog.DISABLED\ntkinter.dialog.DOTBOX\ntkinter.dialog.Dialog(??)\ntkinter.dialog.DoubleVar(??)\ntkinter.dialog.E\ntkinter.dialog.END\ntkinter.dialog.EW\ntkinter.dialog.EXCEPTION\ntkinter.dialog.EXTENDED\ntkinter.dialog.Entry(??)\ntkinter.dialog.Event(??)\ntkinter.dialog.FALSE\ntkinter.dialog.FIRST\ntkinter.dialog.FLAT\ntkinter.dialog.Frame(??)\ntkinter.dialog.GROOVE\ntkinter.dialog.Grid(??)\ntkinter.dialog.HIDDEN\ntkinter.dialog.HORIZONTAL\ntkinter.dialog.INSERT\ntkinter.dialog.INSIDE\ntkinter.dialog.Image(??)\ntkinter.dialog.IntVar(??)\ntkinter.dialog.LAST\ntkinter.dialog.LEFT\ntkinter.dialog.Label(??)\ntkinter.dialog.LabelFrame(??)\ntkinter.dialog.Listbox(??)\ntkinter.dialog.MITER\ntkinter.dialog.MOVETO\ntkinter.dialog.MULTIPLE\ntkinter.dialog.Menu(??)\ntkinter.dialog.Menubutton(??)\ntkinter.dialog.Message(??)\ntkinter.dialog.Misc(??)\ntkinter.dialog.N\ntkinter.dialog.NE\ntkinter.dialog.NO\ntkinter.dialog.NONE\ntkinter.dialog.NORMAL\ntkinter.dialog.NS\ntkinter.dialog.NSEW\ntkinter.dialog.NUMERIC\ntkinter.dialog.NW\ntkinter.dialog.NoDefaultRoot(??)\ntkinter.dialog.OFF\ntkinter.dialog.ON\ntkinter.dialog.OUTSIDE\ntkinter.dialog.OptionMenu(??)\ntkinter.dialog.PAGES\ntkinter.dialog.PIESLICE\ntkinter.dialog.PROJECTING\ntkinter.dialog.Pack(??)\ntkinter.dialog.PanedWindow(??)\ntkinter.dialog.PhotoImage(??)\ntkinter.dialog.Place(??)\ntkinter.dialog.RADIOBUTTON\ntkinter.dialog.RAISED\ntkinter.dialog.READABLE\ntkinter.dialog.RIDGE\ntkinter.dialog.RIGHT\ntkinter.dialog.ROUND\ntkinter.dialog.Radiobutton(??)\ntkinter.dialog.S\ntkinter.dialog.SCROLL\ntkinter.dialog.SE\ntkinter.dialog.SEL\ntkinter.dialog.SEL_FIRST\ntkinter.dialog.SEL_LAST\ntkinter.dialog.SEPARATOR\ntkinter.dialog.SINGLE\ntkinter.dialog.SOLID\ntkinter.dialog.SUNKEN\ntkinter.dialog.SW\ntkinter.dialog.Scale(??)\ntkinter.dialog.Scrollbar(??)\ntkinter.dialog.Spinbox(??)\ntkinter.dialog.StringVar(??)\ntkinter.dialog.Studbutton(??)\ntkinter.dialog.TOP\ntkinter.dialog.TRUE\ntkinter.dialog.Tcl(??)\ntkinter.dialog.TclError(??)\ntkinter.dialog.TclVersion\ntkinter.dialog.Text(??)\ntkinter.dialog.Tk(??)\ntkinter.dialog.TkVersion\ntkinter.dialog.Toplevel(??)\ntkinter.dialog.Tributton(??)\ntkinter.dialog.UNDERLINE\ntkinter.dialog.UNITS\ntkinter.dialog.VERTICAL\ntkinter.dialog.Variable(??)\ntkinter.dialog.W\ntkinter.dialog.WORD\ntkinter.dialog.WRITABLE\ntkinter.dialog.Widget(??)\ntkinter.dialog.Wm(??)\ntkinter.dialog.X\ntkinter.dialog.XView(??)\ntkinter.dialog.Y\ntkinter.dialog.YES\ntkinter.dialog.YView(??)\ntkinter.dialog.colorchooser(??)\ntkinter.dialog.commondialog(??)\ntkinter.dialog.constants(??)\ntkinter.dialog.getboolean(??)\ntkinter.dialog.getdouble(??)\ntkinter.dialog.getint(??)\ntkinter.dialog.image_names(??)\ntkinter.dialog.image_types(??)\ntkinter.dialog.mainloop(??)\ntkinter.dialog.re(??)\ntkinter.dialog.sys(??)\ntkinter.dialog.wantobjects\ntkinter.dialog.warnings(??)\ntkinter.dnd.DndHandler(??)\ntkinter.dnd.Icon(??)\ntkinter.dnd.Tester(??)\ntkinter.dnd.dnd_start(??)\ntkinter.dnd.test(??)\ntkinter.dnd.tkinter(??)\ntkinter.filedialog.ACTIVE\ntkinter.filedialog.ALL\ntkinter.filedialog.ANCHOR\ntkinter.filedialog.ARC\ntkinter.filedialog.BASELINE\ntkinter.filedialog.BEVEL\ntkinter.filedialog.BOTH\ntkinter.filedialog.BOTTOM\ntkinter.filedialog.BROWSE\ntkinter.filedialog.BUTT\ntkinter.filedialog.BaseWidget(??)\ntkinter.filedialog.BitmapImage(??)\ntkinter.filedialog.BooleanVar(??)\ntkinter.filedialog.Button(??)\ntkinter.filedialog.CASCADE\ntkinter.filedialog.CENTER\ntkinter.filedialog.CHAR\ntkinter.filedialog.CHECKBUTTON\ntkinter.filedialog.CHORD\ntkinter.filedialog.COMMAND\ntkinter.filedialog.CURRENT\ntkinter.filedialog.CallWrapper(??)\ntkinter.filedialog.Canvas(??)\ntkinter.filedialog.Checkbutton(??)\ntkinter.filedialog.DISABLED\ntkinter.filedialog.DOTBOX\ntkinter.filedialog.Dialog(??)\ntkinter.filedialog.Directory(??)\ntkinter.filedialog.DoubleVar(??)\ntkinter.filedialog.E\ntkinter.filedialog.END\ntkinter.filedialog.EW\ntkinter.filedialog.EXCEPTION\ntkinter.filedialog.EXTENDED\ntkinter.filedialog.Entry(??)\ntkinter.filedialog.Event(??)\ntkinter.filedialog.FALSE\ntkinter.filedialog.FIRST\ntkinter.filedialog.FLAT\ntkinter.filedialog.FileDialog(??)\ntkinter.filedialog.Frame(??)\ntkinter.filedialog.GROOVE\ntkinter.filedialog.Grid(??)\ntkinter.filedialog.HIDDEN\ntkinter.filedialog.HORIZONTAL\ntkinter.filedialog.INSERT\ntkinter.filedialog.INSIDE\ntkinter.filedialog.Image(??)\ntkinter.filedialog.IntVar(??)\ntkinter.filedialog.LAST\ntkinter.filedialog.LEFT\ntkinter.filedialog.Label(??)\ntkinter.filedialog.LabelFrame(??)\ntkinter.filedialog.Listbox(??)\ntkinter.filedialog.LoadFileDialog(??)\ntkinter.filedialog.MITER\ntkinter.filedialog.MOVETO\ntkinter.filedialog.MULTIPLE\ntkinter.filedialog.Menu(??)\ntkinter.filedialog.Menubutton(??)\ntkinter.filedialog.Message(??)\ntkinter.filedialog.Misc(??)\ntkinter.filedialog.N\ntkinter.filedialog.NE\ntkinter.filedialog.NO\ntkinter.filedialog.NONE\ntkinter.filedialog.NORMAL\ntkinter.filedialog.NS\ntkinter.filedialog.NSEW\ntkinter.filedialog.NUMERIC\ntkinter.filedialog.NW\ntkinter.filedialog.NoDefaultRoot(??)\ntkinter.filedialog.OFF\ntkinter.filedialog.ON\ntkinter.filedialog.OUTSIDE\ntkinter.filedialog.Open(??)\ntkinter.filedialog.OptionMenu(??)\ntkinter.filedialog.PAGES\ntkinter.filedialog.PIESLICE\ntkinter.filedialog.PROJECTING\ntkinter.filedialog.Pack(??)\ntkinter.filedialog.PanedWindow(??)\ntkinter.filedialog.PhotoImage(??)\ntkinter.filedialog.Place(??)\ntkinter.filedialog.RADIOBUTTON\ntkinter.filedialog.RAISED\ntkinter.filedialog.READABLE\ntkinter.filedialog.RIDGE\ntkinter.filedialog.RIGHT\ntkinter.filedialog.ROUND\ntkinter.filedialog.Radiobutton(??)\ntkinter.filedialog.S\ntkinter.filedialog.SCROLL\ntkinter.filedialog.SE\ntkinter.filedialog.SEL\ntkinter.filedialog.SEL_FIRST\ntkinter.filedialog.SEL_LAST\ntkinter.filedialog.SEPARATOR\ntkinter.filedialog.SINGLE\ntkinter.filedialog.SOLID\ntkinter.filedialog.SUNKEN\ntkinter.filedialog.SW\ntkinter.filedialog.SaveAs(??)\ntkinter.filedialog.SaveFileDialog(??)\ntkinter.filedialog.Scale(??)\ntkinter.filedialog.Scrollbar(??)\ntkinter.filedialog.Spinbox(??)\ntkinter.filedialog.StringVar(??)\ntkinter.filedialog.Studbutton(??)\ntkinter.filedialog.TOP\ntkinter.filedialog.TRUE\ntkinter.filedialog.Tcl(??)\ntkinter.filedialog.TclError(??)\ntkinter.filedialog.TclVersion\ntkinter.filedialog.Text(??)\ntkinter.filedialog.Tk(??)\ntkinter.filedialog.TkVersion\ntkinter.filedialog.Toplevel(??)\ntkinter.filedialog.Tributton(??)\ntkinter.filedialog.UNDERLINE\ntkinter.filedialog.UNITS\ntkinter.filedialog.VERTICAL\ntkinter.filedialog.Variable(??)\ntkinter.filedialog.W\ntkinter.filedialog.WORD\ntkinter.filedialog.WRITABLE\ntkinter.filedialog.Widget(??)\ntkinter.filedialog.Wm(??)\ntkinter.filedialog.X\ntkinter.filedialog.XView(??)\ntkinter.filedialog.Y\ntkinter.filedialog.YES\ntkinter.filedialog.YView(??)\ntkinter.filedialog.askdirectory(??)\ntkinter.filedialog.askopenfile(??)\ntkinter.filedialog.askopenfilename(??)\ntkinter.filedialog.askopenfilenames(??)\ntkinter.filedialog.askopenfiles(??)\ntkinter.filedialog.asksaveasfile(??)\ntkinter.filedialog.asksaveasfilename(??)\ntkinter.filedialog.colorchooser(??)\ntkinter.filedialog.commondialog(??)\ntkinter.filedialog.constants(??)\ntkinter.filedialog.dialog(??)\ntkinter.filedialog.dialogstates(??)\ntkinter.filedialog.dnd(??)\ntkinter.filedialog.fnmatch(??)\ntkinter.filedialog.getboolean(??)\ntkinter.filedialog.getdouble(??)\ntkinter.filedialog.getint(??)\ntkinter.filedialog.image_names(??)\ntkinter.filedialog.image_types(??)\ntkinter.filedialog.mainloop(??)\ntkinter.filedialog.os(??)\ntkinter.filedialog.re(??)\ntkinter.filedialog.sys(??)\ntkinter.filedialog.test(??)\ntkinter.filedialog.wantobjects\ntkinter.filedialog.warnings(??)\ntkinter.font.BOLD\ntkinter.font.Font(??)\ntkinter.font.ITALIC\ntkinter.font.NORMAL\ntkinter.font.ROMAN\ntkinter.font.families(??)\ntkinter.font.itertools(??)\ntkinter.font.names(??)\ntkinter.font.nametofont(??)\ntkinter.font.tkinter(??)\ntkinter.getboolean(??)\ntkinter.getdouble(??)\ntkinter.getint(??)\ntkinter.image_names(??)\ntkinter.image_types(??)\ntkinter.mainloop(??)\ntkinter.messagebox.ABORT\ntkinter.messagebox.ABORTRETRYIGNORE\ntkinter.messagebox.CANCEL\ntkinter.messagebox.Dialog(??)\ntkinter.messagebox.ERROR\ntkinter.messagebox.IGNORE\ntkinter.messagebox.INFO\ntkinter.messagebox.Message(??)\ntkinter.messagebox.NO\ntkinter.messagebox.OK\ntkinter.messagebox.OKCANCEL\ntkinter.messagebox.QUESTION\ntkinter.messagebox.RETRY\ntkinter.messagebox.RETRYCANCEL\ntkinter.messagebox.WARNING\ntkinter.messagebox.YES\ntkinter.messagebox.YESNO\ntkinter.messagebox.YESNOCANCEL\ntkinter.messagebox.askokcancel(??)\ntkinter.messagebox.askquestion(??)\ntkinter.messagebox.askretrycancel(??)\ntkinter.messagebox.askyesno(??)\ntkinter.messagebox.askyesnocancel(??)\ntkinter.messagebox.showerror(??)\ntkinter.messagebox.showinfo(??)\ntkinter.messagebox.showwarning(??)\ntkinter.re(??)\ntkinter.scrolledtext.BOTH\ntkinter.scrolledtext.Frame(??)\ntkinter.scrolledtext.Grid(??)\ntkinter.scrolledtext.LEFT\ntkinter.scrolledtext.Pack(??)\ntkinter.scrolledtext.Place(??)\ntkinter.scrolledtext.RIGHT\ntkinter.scrolledtext.Scrollbar(??)\ntkinter.scrolledtext.ScrolledText(??)\ntkinter.scrolledtext.Text(??)\ntkinter.scrolledtext.Y\ntkinter.scrolledtext.example(??)\ntkinter.simpledialog.ACTIVE\ntkinter.simpledialog.ALL\ntkinter.simpledialog.ANCHOR\ntkinter.simpledialog.ARC\ntkinter.simpledialog.BASELINE\ntkinter.simpledialog.BEVEL\ntkinter.simpledialog.BOTH\ntkinter.simpledialog.BOTTOM\ntkinter.simpledialog.BROWSE\ntkinter.simpledialog.BUTT\ntkinter.simpledialog.BaseWidget(??)\ntkinter.simpledialog.BitmapImage(??)\ntkinter.simpledialog.BooleanVar(??)\ntkinter.simpledialog.Button(??)\ntkinter.simpledialog.CASCADE\ntkinter.simpledialog.CENTER\ntkinter.simpledialog.CHAR\ntkinter.simpledialog.CHECKBUTTON\ntkinter.simpledialog.CHORD\ntkinter.simpledialog.COMMAND\ntkinter.simpledialog.CURRENT\ntkinter.simpledialog.CallWrapper(??)\ntkinter.simpledialog.Canvas(??)\ntkinter.simpledialog.Checkbutton(??)\ntkinter.simpledialog.DISABLED\ntkinter.simpledialog.DOTBOX\ntkinter.simpledialog.Dialog(??)\ntkinter.simpledialog.DoubleVar(??)\ntkinter.simpledialog.E\ntkinter.simpledialog.END\ntkinter.simpledialog.EW\ntkinter.simpledialog.EXCEPTION\ntkinter.simpledialog.EXTENDED\ntkinter.simpledialog.Entry(??)\ntkinter.simpledialog.Event(??)\ntkinter.simpledialog.FALSE\ntkinter.simpledialog.FIRST\ntkinter.simpledialog.FLAT\ntkinter.simpledialog.Frame(??)\ntkinter.simpledialog.GROOVE\ntkinter.simpledialog.Grid(??)\ntkinter.simpledialog.HIDDEN\ntkinter.simpledialog.HORIZONTAL\ntkinter.simpledialog.INSERT\ntkinter.simpledialog.INSIDE\ntkinter.simpledialog.Image(??)\ntkinter.simpledialog.IntVar(??)\ntkinter.simpledialog.LAST\ntkinter.simpledialog.LEFT\ntkinter.simpledialog.Label(??)\ntkinter.simpledialog.LabelFrame(??)\ntkinter.simpledialog.Listbox(??)\ntkinter.simpledialog.MITER\ntkinter.simpledialog.MOVETO\ntkinter.simpledialog.MULTIPLE\ntkinter.simpledialog.Menu(??)\ntkinter.simpledialog.Menubutton(??)\ntkinter.simpledialog.Message(??)\ntkinter.simpledialog.Misc(??)\ntkinter.simpledialog.N\ntkinter.simpledialog.NE\ntkinter.simpledialog.NO\ntkinter.simpledialog.NONE\ntkinter.simpledialog.NORMAL\ntkinter.simpledialog.NS\ntkinter.simpledialog.NSEW\ntkinter.simpledialog.NUMERIC\ntkinter.simpledialog.NW\ntkinter.simpledialog.NoDefaultRoot(??)\ntkinter.simpledialog.OFF\ntkinter.simpledialog.ON\ntkinter.simpledialog.OUTSIDE\ntkinter.simpledialog.OptionMenu(??)\ntkinter.simpledialog.PAGES\ntkinter.simpledialog.PIESLICE\ntkinter.simpledialog.PROJECTING\ntkinter.simpledialog.Pack(??)\ntkinter.simpledialog.PanedWindow(??)\ntkinter.simpledialog.PhotoImage(??)\ntkinter.simpledialog.Place(??)\ntkinter.simpledialog.RADIOBUTTON\ntkinter.simpledialog.RAISED\ntkinter.simpledialog.READABLE\ntkinter.simpledialog.RIDGE\ntkinter.simpledialog.RIGHT\ntkinter.simpledialog.ROUND\ntkinter.simpledialog.Radiobutton(??)\ntkinter.simpledialog.S\ntkinter.simpledialog.SCROLL\ntkinter.simpledialog.SE\ntkinter.simpledialog.SEL\ntkinter.simpledialog.SEL_FIRST\ntkinter.simpledialog.SEL_LAST\ntkinter.simpledialog.SEPARATOR\ntkinter.simpledialog.SINGLE\ntkinter.simpledialog.SOLID\ntkinter.simpledialog.SUNKEN\ntkinter.simpledialog.SW\ntkinter.simpledialog.Scale(??)\ntkinter.simpledialog.Scrollbar(??)\ntkinter.simpledialog.SimpleDialog(??)\ntkinter.simpledialog.Spinbox(??)\ntkinter.simpledialog.StringVar(??)\ntkinter.simpledialog.Studbutton(??)\ntkinter.simpledialog.TOP\ntkinter.simpledialog.TRUE\ntkinter.simpledialog.Tcl(??)\ntkinter.simpledialog.TclError(??)\ntkinter.simpledialog.TclVersion\ntkinter.simpledialog.Text(??)\ntkinter.simpledialog.Tk(??)\ntkinter.simpledialog.TkVersion\ntkinter.simpledialog.Toplevel(??)\ntkinter.simpledialog.Tributton(??)\ntkinter.simpledialog.UNDERLINE\ntkinter.simpledialog.UNITS\ntkinter.simpledialog.VERTICAL\ntkinter.simpledialog.Variable(??)\ntkinter.simpledialog.W\ntkinter.simpledialog.WORD\ntkinter.simpledialog.WRITABLE\ntkinter.simpledialog.Widget(??)\ntkinter.simpledialog.Wm(??)\ntkinter.simpledialog.X\ntkinter.simpledialog.XView(??)\ntkinter.simpledialog.Y\ntkinter.simpledialog.YES\ntkinter.simpledialog.YView(??)\ntkinter.simpledialog.askfloat(??)\ntkinter.simpledialog.askinteger(??)\ntkinter.simpledialog.askstring(??)\ntkinter.simpledialog.colorchooser(??)\ntkinter.simpledialog.commondialog(??)\ntkinter.simpledialog.constants(??)\ntkinter.simpledialog.dialog(??)\ntkinter.simpledialog.dnd(??)\ntkinter.simpledialog.filedialog(??)\ntkinter.simpledialog.font(??)\ntkinter.simpledialog.getboolean(??)\ntkinter.simpledialog.getdouble(??)\ntkinter.simpledialog.getint(??)\ntkinter.simpledialog.image_names(??)\ntkinter.simpledialog.image_types(??)\ntkinter.simpledialog.mainloop(??)\ntkinter.simpledialog.messagebox(??)\ntkinter.simpledialog.re(??)\ntkinter.simpledialog.scrolledtext(??)\ntkinter.simpledialog.sys(??)\ntkinter.simpledialog.tkinter(??)\ntkinter.simpledialog.wantobjects\ntkinter.simpledialog.warnings(??)\ntkinter.sys(??)\ntkinter.tix.ACROSSTOP\ntkinter.tix.ACTIVE\ntkinter.tix.ALL\ntkinter.tix.ANCHOR\ntkinter.tix.ARC\ntkinter.tix.ASCII\ntkinter.tix.AUTO\ntkinter.tix.BALLOON\ntkinter.tix.BASELINE\ntkinter.tix.BEVEL\ntkinter.tix.BOTH\ntkinter.tix.BOTTOM\ntkinter.tix.BROWSE\ntkinter.tix.BUTT\ntkinter.tix.Balloon(??)\ntkinter.tix.BaseWidget(??)\ntkinter.tix.BitmapImage(??)\ntkinter.tix.BooleanVar(??)\ntkinter.tix.Button(??)\ntkinter.tix.ButtonBox(??)\ntkinter.tix.CASCADE\ntkinter.tix.CELL\ntkinter.tix.CENTER\ntkinter.tix.CHAR\ntkinter.tix.CHECKBUTTON\ntkinter.tix.CHORD\ntkinter.tix.COLUMN\ntkinter.tix.COMMAND\ntkinter.tix.CObjView(??)\ntkinter.tix.CURRENT\ntkinter.tix.CallWrapper(??)\ntkinter.tix.Canvas(??)\ntkinter.tix.CheckList(??)\ntkinter.tix.Checkbutton(??)\ntkinter.tix.ComboBox(??)\ntkinter.tix.Control(??)\ntkinter.tix.DECREASING\ntkinter.tix.DISABLED\ntkinter.tix.DOTBOX\ntkinter.tix.DialogShell(??)\ntkinter.tix.DirList(??)\ntkinter.tix.DirSelectBox(??)\ntkinter.tix.DirSelectDialog(??)\ntkinter.tix.DirTree(??)\ntkinter.tix.DisplayStyle(??)\ntkinter.tix.DoubleVar(??)\ntkinter.tix.E\ntkinter.tix.END\ntkinter.tix.EW\ntkinter.tix.EXCEPTION\ntkinter.tix.EXTENDED\ntkinter.tix.Entry(??)\ntkinter.tix.Event(??)\ntkinter.tix.ExFileSelectBox(??)\ntkinter.tix.ExFileSelectDialog(??)\ntkinter.tix.FALSE\ntkinter.tix.FIRST\ntkinter.tix.FLAT\ntkinter.tix.FileEntry(??)\ntkinter.tix.FileSelectBox(??)\ntkinter.tix.FileSelectDialog(??)\ntkinter.tix.FileTypeList(??)\ntkinter.tix.Form(??)\ntkinter.tix.Frame(??)\ntkinter.tix.GROOVE\ntkinter.tix.Grid(??)\ntkinter.tix.HIDDEN\ntkinter.tix.HList(??)\ntkinter.tix.HORIZONTAL\ntkinter.tix.IMAGE\ntkinter.tix.IMAGETEXT\ntkinter.tix.IMMEDIATE\ntkinter.tix.INCREASING\ntkinter.tix.INSERT\ntkinter.tix.INSIDE\ntkinter.tix.INTEGER\ntkinter.tix.Image(??)\ntkinter.tix.InputOnly(??)\ntkinter.tix.IntVar(??)\ntkinter.tix.LAST\ntkinter.tix.LEFT\ntkinter.tix.Label(??)\ntkinter.tix.LabelEntry(??)\ntkinter.tix.LabelFrame(??)\ntkinter.tix.ListNoteBook(??)\ntkinter.tix.Listbox(??)\ntkinter.tix.MAIN\ntkinter.tix.MAX\ntkinter.tix.MITER\ntkinter.tix.MOVETO\ntkinter.tix.MULTIPLE\ntkinter.tix.Menu(??)\ntkinter.tix.Menubutton(??)\ntkinter.tix.Message(??)\ntkinter.tix.Meter(??)\ntkinter.tix.Misc(??)\ntkinter.tix.N\ntkinter.tix.NE\ntkinter.tix.NO\ntkinter.tix.NONE\ntkinter.tix.NORMAL\ntkinter.tix.NS\ntkinter.tix.NSEW\ntkinter.tix.NUMERIC\ntkinter.tix.NW\ntkinter.tix.NoDefaultRoot(??)\ntkinter.tix.NoteBook(??)\ntkinter.tix.NoteBookFrame(??)\ntkinter.tix.OFF\ntkinter.tix.ON\ntkinter.tix.OUTSIDE\ntkinter.tix.OptionMenu(??)\ntkinter.tix.OptionName(??)\ntkinter.tix.PAGES\ntkinter.tix.PIESLICE\ntkinter.tix.PROJECTING\ntkinter.tix.Pack(??)\ntkinter.tix.PanedWindow(??)\ntkinter.tix.PhotoImage(??)\ntkinter.tix.Place(??)\ntkinter.tix.PopupMenu(??)\ntkinter.tix.RADIOBUTTON\ntkinter.tix.RAISED\ntkinter.tix.READABLE\ntkinter.tix.REAL\ntkinter.tix.RIDGE\ntkinter.tix.RIGHT\ntkinter.tix.ROUND\ntkinter.tix.ROW\ntkinter.tix.Radiobutton(??)\ntkinter.tix.ResizeHandle(??)\ntkinter.tix.S\ntkinter.tix.SCROLL\ntkinter.tix.SE\ntkinter.tix.SEL\ntkinter.tix.SEL_FIRST\ntkinter.tix.SEL_LAST\ntkinter.tix.SEPARATOR\ntkinter.tix.SINGLE\ntkinter.tix.SOLID\ntkinter.tix.STATUS\ntkinter.tix.SUNKEN\ntkinter.tix.SW\ntkinter.tix.S_REGION\ntkinter.tix.Scale(??)\ntkinter.tix.Scrollbar(??)\ntkinter.tix.ScrolledGrid(??)\ntkinter.tix.ScrolledHList(??)\ntkinter.tix.ScrolledListBox(??)\ntkinter.tix.ScrolledTList(??)\ntkinter.tix.ScrolledText(??)\ntkinter.tix.ScrolledWindow(??)\ntkinter.tix.Select(??)\ntkinter.tix.Shell(??)\ntkinter.tix.Spinbox(??)\ntkinter.tix.StdButtonBox(??)\ntkinter.tix.StringVar(??)\ntkinter.tix.Studbutton(??)\ntkinter.tix.TCL_ALL_EVENTS\ntkinter.tix.TCL_DONT_WAIT\ntkinter.tix.TCL_FILE_EVENTS\ntkinter.tix.TCL_IDLE_EVENTS\ntkinter.tix.TCL_TIMER_EVENTS\ntkinter.tix.TCL_WINDOW_EVENTS\ntkinter.tix.TEXT\ntkinter.tix.TList(??)\ntkinter.tix.TOP\ntkinter.tix.TRUE\ntkinter.tix.Tcl(??)\ntkinter.tix.TclError(??)\ntkinter.tix.TclVersion\ntkinter.tix.Text(??)\ntkinter.tix.TixSubWidget(??)\ntkinter.tix.TixWidget(??)\ntkinter.tix.Tk(??)\ntkinter.tix.TkVersion\ntkinter.tix.Toplevel(??)\ntkinter.tix.Tree(??)\ntkinter.tix.Tributton(??)\ntkinter.tix.UNDERLINE\ntkinter.tix.UNITS\ntkinter.tix.VERTICAL\ntkinter.tix.Variable(??)\ntkinter.tix.W\ntkinter.tix.WINDOW\ntkinter.tix.WORD\ntkinter.tix.WRITABLE\ntkinter.tix.Widget(??)\ntkinter.tix.Wm(??)\ntkinter.tix.X\ntkinter.tix.XView(??)\ntkinter.tix.X_REGION\ntkinter.tix.Y\ntkinter.tix.YES\ntkinter.tix.YView(??)\ntkinter.tix.Y_REGION\ntkinter.tix.colorchooser(??)\ntkinter.tix.commondialog(??)\ntkinter.tix.constants(??)\ntkinter.tix.dialog(??)\ntkinter.tix.dnd(??)\ntkinter.tix.filedialog(??)\ntkinter.tix.font(??)\ntkinter.tix.getboolean(??)\ntkinter.tix.getdouble(??)\ntkinter.tix.getint(??)\ntkinter.tix.image_names(??)\ntkinter.tix.image_types(??)\ntkinter.tix.mainloop(??)\ntkinter.tix.messagebox(??)\ntkinter.tix.os(??)\ntkinter.tix.re(??)\ntkinter.tix.scrolledtext(??)\ntkinter.tix.simpledialog(??)\ntkinter.tix.sys(??)\ntkinter.tix.tixCommand(??)\ntkinter.tix.tkinter(??)\ntkinter.tix.wantobjects\ntkinter.tix.warnings(??)\ntkinter.ttk.Button(??)\ntkinter.ttk.Checkbutton(??)\ntkinter.ttk.Combobox(??)\ntkinter.ttk.Entry(??)\ntkinter.ttk.Frame(??)\ntkinter.ttk.Label(??)\ntkinter.ttk.LabelFrame(??)\ntkinter.ttk.LabeledScale(??)\ntkinter.ttk.Labelframe(??)\ntkinter.ttk.Menubutton(??)\ntkinter.ttk.Notebook(??)\ntkinter.ttk.OptionMenu(??)\ntkinter.ttk.PanedWindow(??)\ntkinter.ttk.Panedwindow(??)\ntkinter.ttk.Progressbar(??)\ntkinter.ttk.Radiobutton(??)\ntkinter.ttk.Scale(??)\ntkinter.ttk.Scrollbar(??)\ntkinter.ttk.Separator(??)\ntkinter.ttk.Sizegrip(??)\ntkinter.ttk.Style(??)\ntkinter.ttk.Treeview(??)\ntkinter.ttk.Widget(??)\ntkinter.ttk.setup_master(??)\ntkinter.ttk.tclobjs_to_py(??)\ntkinter.ttk.tkinter(??)\ntkinter.wantobjects\ntkinter.warnings(??)\ntoken.AMPER\ntoken.AMPEREQUAL\ntoken.AT\ntoken.CIRCUMFLEX\ntoken.CIRCUMFLEXEQUAL\ntoken.COLON\ntoken.COMMA\ntoken.DEDENT\ntoken.DOT\ntoken.DOUBLESLASH\ntoken.DOUBLESLASHEQUAL\ntoken.DOUBLESTAR\ntoken.DOUBLESTAREQUAL\ntoken.ELLIPSIS\ntoken.ENDMARKER\ntoken.EQEQUAL\ntoken.EQUAL\ntoken.ERRORTOKEN\ntoken.GREATER\ntoken.GREATEREQUAL\ntoken.INDENT\ntoken.ISEOF(??)\ntoken.ISNONTERMINAL(??)\ntoken.ISTERMINAL(??)\ntoken.LBRACE\ntoken.LEFTSHIFT\ntoken.LEFTSHIFTEQUAL\ntoken.LESS\ntoken.LESSEQUAL\ntoken.LPAR\ntoken.LSQB\ntoken.MINEQUAL\ntoken.MINUS\ntoken.NAME\ntoken.NEWLINE\ntoken.NOTEQUAL\ntoken.NT_OFFSET\ntoken.NUMBER\ntoken.N_TOKENS\ntoken.OP\ntoken.PERCENT\ntoken.PERCENTEQUAL\ntoken.PLUS\ntoken.PLUSEQUAL\ntoken.RARROW\ntoken.RBRACE\ntoken.RIGHTSHIFT\ntoken.RIGHTSHIFTEQUAL\ntoken.RPAR\ntoken.RSQB\ntoken.SEMI\ntoken.SLASH\ntoken.SLASHEQUAL\ntoken.STAR\ntoken.STAREQUAL\ntoken.STRING\ntoken.TILDE\ntoken.VBAR\ntoken.VBAREQUAL\ntoken.tok_name(??)\ntokenize.AMPER\ntokenize.AMPEREQUAL\ntokenize.AT\ntokenize.BOM_UTF8\ntokenize.Binnumber\ntokenize.Bracket\ntokenize.CIRCUMFLEX\ntokenize.CIRCUMFLEXEQUAL\ntokenize.COLON\ntokenize.COMMA\ntokenize.COMMENT\ntokenize.Comment\ntokenize.ContStr\ntokenize.DEDENT\ntokenize.DOT\ntokenize.DOUBLESLASH\ntokenize.DOUBLESLASHEQUAL\ntokenize.DOUBLESTAR\ntokenize.DOUBLESTAREQUAL\ntokenize.Decnumber\ntokenize.Double\ntokenize.Double3\ntokenize.ELLIPSIS\ntokenize.ENCODING\ntokenize.ENDMARKER\ntokenize.EQEQUAL\ntokenize.EQUAL\ntokenize.ERRORTOKEN\ntokenize.EXACT_TOKEN_TYPES(??)\ntokenize.Expfloat\ntokenize.Exponent\ntokenize.Floatnumber\ntokenize.Funny\ntokenize.GREATER\ntokenize.GREATEREQUAL\ntokenize.Hexnumber\ntokenize.INDENT\ntokenize.ISEOF(??)\ntokenize.ISNONTERMINAL(??)\ntokenize.ISTERMINAL(??)\ntokenize.Ignore\ntokenize.Imagnumber\ntokenize.Intnumber\ntokenize.LBRACE\ntokenize.LEFTSHIFT\ntokenize.LEFTSHIFTEQUAL\ntokenize.LESS\ntokenize.LESSEQUAL\ntokenize.LPAR\ntokenize.LSQB\ntokenize.MINEQUAL\ntokenize.MINUS\ntokenize.NAME\ntokenize.NEWLINE\ntokenize.NL\ntokenize.NOTEQUAL\ntokenize.NT_OFFSET\ntokenize.NUMBER\ntokenize.N_TOKENS\ntokenize.Name\ntokenize.Number\ntokenize.OP\ntokenize.Octnumber\ntokenize.Operator\ntokenize.PERCENT\ntokenize.PERCENTEQUAL\ntokenize.PLUS\ntokenize.PLUSEQUAL\ntokenize.PlainToken\ntokenize.Pointfloat\ntokenize.PseudoExtras\ntokenize.PseudoToken\ntokenize.RARROW\ntokenize.RBRACE\ntokenize.RIGHTSHIFT\ntokenize.RIGHTSHIFTEQUAL\ntokenize.RPAR\ntokenize.RSQB\ntokenize.SEMI\ntokenize.SLASH\ntokenize.SLASHEQUAL\ntokenize.STAR\ntokenize.STAREQUAL\ntokenize.STRING\ntokenize.Single\ntokenize.Single3\ntokenize.Special\ntokenize.StopTokenizing(??)\ntokenize.String\ntokenize.StringPrefix\ntokenize.TILDE\ntokenize.TextIOWrapper(??)\ntokenize.Token\ntokenize.TokenError(??)\ntokenize.TokenInfo(??)\ntokenize.Triple\ntokenize.Untokenizer(??)\ntokenize.VBAR\ntokenize.VBAREQUAL\ntokenize.Whitespace\ntokenize.any(??)\ntokenize.blank_re(??)\ntokenize.builtins(??)\ntokenize.collections(??)\ntokenize.cookie_re(??)\ntokenize.detect_encoding(??)\ntokenize.endpats(??)\ntokenize.generate_tokens(??)\ntokenize.group(??)\ntokenize.lookup(encoding) -> CodecInfo\ntokenize.main(??)\ntokenize.maybe(??)\ntokenize.open(??)\ntokenize.re(??)\ntokenize.single_quoted(??)\ntokenize.sys(??)\ntokenize.t\ntokenize.tabsize\ntokenize.tok_name(??)\ntokenize.tokenize(??)\ntokenize.triple_quoted(??)\ntokenize.untokenize(??)\ntrace.CoverageResults(??)\ntrace.Ignore(??)\ntrace.PRAGMA_NOCOVER\ntrace.Trace(??)\ntrace.dis(??)\ntrace.find_executable_linenos(??)\ntrace.find_lines(??)\ntrace.find_lines_from_code(??)\ntrace.find_strings(??)\ntrace.fullmodname(??)\ntrace.gc(??)\ntrace.inspect(??)\ntrace.linecache(??)\ntrace.main(??)\ntrace.modname(??)\ntrace.os(??)\ntrace.pickle(??)\ntrace.re(??)\ntrace.rx_blank(??)\ntrace.sys(??)\ntrace.threading(??)\ntrace.token(??)\ntrace.tokenize(??)\ntrace.usage(??)\ntraceback.clear_frames(??)\ntraceback.extract_stack(??)\ntraceback.extract_tb(??)\ntraceback.format_exc(??)\ntraceback.format_exception(??)\ntraceback.format_exception_only(??)\ntraceback.format_list(??)\ntraceback.format_stack(??)\ntraceback.format_tb(??)\ntraceback.linecache(??)\ntraceback.operator(??)\ntraceback.print_exc(??)\ntraceback.print_exception(??)\ntraceback.print_last(??)\ntraceback.print_list(??)\ntraceback.print_stack(??)\ntraceback.print_tb(??)\ntraceback.sys(??)\ntracemalloc.Filter(??)\ntracemalloc.Frame(??)\ntracemalloc.Sequence(??)\ntracemalloc.Snapshot(??)\ntracemalloc.Statistic(??)\ntracemalloc.StatisticDiff(??)\ntracemalloc.Trace(??)\ntracemalloc.Traceback(??)\ntracemalloc.clear_traces()\ntracemalloc.fnmatch(??)\ntracemalloc.get_object_traceback(??)\ntracemalloc.get_traceback_limit() -> int\ntracemalloc.get_traced_memory() -> (int, int)\ntracemalloc.get_tracemalloc_memory() -> int\ntracemalloc.is_tracing()->bool\ntracemalloc.linecache(??)\ntracemalloc.os(??)\ntracemalloc.pickle(??)\ntracemalloc.start(nframe: int=1)\ntracemalloc.stop()\ntracemalloc.take_snapshot(??)\ntracemalloc.total_ordering(??)\ntty.B0\ntty.B110\ntty.B115200\ntty.B1200\ntty.B134\ntty.B150\ntty.B1800\ntty.B19200\ntty.B200\ntty.B230400\ntty.B2400\ntty.B300\ntty.B38400\ntty.B4800\ntty.B50\ntty.B57600\ntty.B600\ntty.B75\ntty.B9600\ntty.BRKINT\ntty.BS0\ntty.BS1\ntty.BSDLY\ntty.CC\ntty.CDSUSP\ntty.CEOF\ntty.CEOL\ntty.CEOT\ntty.CERASE\ntty.CFLAG\ntty.CFLUSH\ntty.CINTR\ntty.CKILL\ntty.CLNEXT\ntty.CLOCAL\ntty.CQUIT\ntty.CR0\ntty.CR1\ntty.CR2\ntty.CR3\ntty.CRDLY\ntty.CREAD\ntty.CRPRNT\ntty.CRTSCTS\ntty.CS5\ntty.CS6\ntty.CS7\ntty.CS8\ntty.CSIZE\ntty.CSTART\ntty.CSTOP\ntty.CSTOPB\ntty.CSUSP\ntty.CWERASE\ntty.ECHO\ntty.ECHOCTL\ntty.ECHOE\ntty.ECHOK\ntty.ECHOKE\ntty.ECHONL\ntty.ECHOPRT\ntty.EXTA\ntty.EXTB\ntty.FF0\ntty.FF1\ntty.FFDLY\ntty.FIOASYNC\ntty.FIOCLEX\ntty.FIONBIO\ntty.FIONCLEX\ntty.FIONREAD\ntty.FLUSHO\ntty.HUPCL\ntty.ICANON\ntty.ICRNL\ntty.IEXTEN\ntty.IFLAG\ntty.IGNBRK\ntty.IGNCR\ntty.IGNPAR\ntty.IMAXBEL\ntty.INLCR\ntty.INPCK\ntty.ISIG\ntty.ISPEED\ntty.ISTRIP\ntty.IXANY\ntty.IXOFF\ntty.IXON\ntty.LFLAG\ntty.NCCS\ntty.NL0\ntty.NL1\ntty.NLDLY\ntty.NOFLSH\ntty.OCRNL\ntty.OFDEL\ntty.OFILL\ntty.OFLAG\ntty.ONLCR\ntty.ONLRET\ntty.ONOCR\ntty.OPOST\ntty.OSPEED\ntty.PARENB\ntty.PARMRK\ntty.PARODD\ntty.PENDIN\ntty.TAB0\ntty.TAB1\ntty.TAB2\ntty.TAB3\ntty.TABDLY\ntty.TCIFLUSH\ntty.TCIOFF\ntty.TCIOFLUSH\ntty.TCION\ntty.TCOFLUSH\ntty.TCOOFF\ntty.TCOON\ntty.TCSADRAIN\ntty.TCSAFLUSH\ntty.TCSANOW\ntty.TCSASOFT\ntty.TIOCCONS\ntty.TIOCEXCL\ntty.TIOCGETD\ntty.TIOCGPGRP\ntty.TIOCGWINSZ\ntty.TIOCMBIC\ntty.TIOCMBIS\ntty.TIOCMGET\ntty.TIOCMSET\ntty.TIOCM_CAR\ntty.TIOCM_CD\ntty.TIOCM_CTS\ntty.TIOCM_DSR\ntty.TIOCM_DTR\ntty.TIOCM_LE\ntty.TIOCM_RI\ntty.TIOCM_RNG\ntty.TIOCM_RTS\ntty.TIOCM_SR\ntty.TIOCM_ST\ntty.TIOCNOTTY\ntty.TIOCNXCL\ntty.TIOCOUTQ\ntty.TIOCPKT\ntty.TIOCPKT_DATA\ntty.TIOCPKT_DOSTOP\ntty.TIOCPKT_FLUSHREAD\ntty.TIOCPKT_FLUSHWRITE\ntty.TIOCPKT_NOSTOP\ntty.TIOCPKT_START\ntty.TIOCPKT_STOP\ntty.TIOCSCTTY\ntty.TIOCSETD\ntty.TIOCSPGRP\ntty.TIOCSTI\ntty.TIOCSWINSZ\ntty.TOSTOP\ntty.VDISCARD\ntty.VEOF\ntty.VEOL\ntty.VEOL2\ntty.VERASE\ntty.VINTR\ntty.VKILL\ntty.VLNEXT\ntty.VMIN\ntty.VQUIT\ntty.VREPRINT\ntty.VSTART\ntty.VSTOP\ntty.VSUSP\ntty.VT0\ntty.VT1\ntty.VTDLY\ntty.VTIME\ntty.VWERASE\ntty.error(??)\ntty.setcbreak(??)\ntty.setraw(??)\ntty.tcdrain(fd) -> None\ntty.tcflow(fd, action) -> None\ntty.tcflush(fd, queue) -> None\ntty.tcgetattr(fd) -> list_of_attrs\ntty.tcsendbreak(fd, duration) -> None\ntty.tcsetattr(fd, when, attributes) -> None\ntuple() -> empty tuple\nturtle.Canvas(??)\nturtle.Pen(??)\nturtle.RawPen(??)\nturtle.RawTurtle(??)\nturtle.Screen(??)\nturtle.ScrolledCanvas(??)\nturtle.Shape(??)\nturtle.TK(??)\nturtle.TNavigator(??)\nturtle.TPen(??)\nturtle.Tbuffer(??)\nturtle.Terminator(??)\nturtle.Turtle(??)\nturtle.TurtleGraphicsError(??)\nturtle.TurtleScreen(??)\nturtle.TurtleScreenBase(??)\nturtle.Vec2D(??)\nturtle.addshape(??)\nturtle.back(??)\nturtle.backward(??)\nturtle.begin_fill(??)\nturtle.begin_poly(??)\nturtle.bgcolor(??)\nturtle.bgpic(??)\nturtle.bk(??)\nturtle.bye(??)\nturtle.circle(??)\nturtle.clear(??)\nturtle.clearscreen(??)\nturtle.clearstamp(??)\nturtle.clearstamps(??)\nturtle.clone(??)\nturtle.color(??)\nturtle.colormode(??)\nturtle.config_dict(??)\nturtle.deepcopy(??)\nturtle.defstr\nturtle.degrees(??)\nturtle.delay(??)\nturtle.distance(??)\nturtle.done(??)\nturtle.dot(??)\nturtle.down(??)\nturtle.end_fill(??)\nturtle.end_poly(??)\nturtle.exitonclick(??)\nturtle.fd(??)\nturtle.fillcolor(??)\nturtle.filling(??)\nturtle.forward(??)\nturtle.get_poly(??)\nturtle.get_shapepoly(??)\nturtle.getcanvas(??)\nturtle.getmethparlist(??)\nturtle.getpen(??)\nturtle.getscreen(??)\nturtle.getshapes(??)\nturtle.getturtle(??)\nturtle.goto(??)\nturtle.heading(??)\nturtle.hideturtle(??)\nturtle.home(??)\nturtle.ht(??)\nturtle.inspect(??)\nturtle.isdown(??)\nturtle.isfile(??)\nturtle.isvisible(??)\nturtle.join(??)\nturtle.left(??)\nturtle.listen(??)\nturtle.lt(??)\nturtle.mainloop(??)\nturtle.math(??)\nturtle.methodname\nturtle.mode(??)\nturtle.numinput(??)\nturtle.onclick(??)\nturtle.ondrag(??)\nturtle.onkey(??)\nturtle.onkeypress(??)\nturtle.onkeyrelease(??)\nturtle.onrelease(??)\nturtle.onscreenclick(??)\nturtle.ontimer(??)\nturtle.pd(??)\nturtle.pen(??)\nturtle.pencolor(??)\nturtle.pendown(??)\nturtle.pensize(??)\nturtle.penup(??)\nturtle.pl1\nturtle.pl2\nturtle.pos(??)\nturtle.position(??)\nturtle.pu(??)\nturtle.radians(??)\nturtle.read_docstrings(??)\nturtle.readconfig(??)\nturtle.register_shape(??)\nturtle.reset(??)\nturtle.resetscreen(??)\nturtle.resizemode(??)\nturtle.right(??)\nturtle.rt(??)\nturtle.screensize(??)\nturtle.seth(??)\nturtle.setheading(??)\nturtle.setpos(??)\nturtle.setposition(??)\nturtle.settiltangle(??)\nturtle.setundobuffer(??)\nturtle.setup(??)\nturtle.setworldcoordinates(??)\nturtle.setx(??)\nturtle.sety(??)\nturtle.shape(??)\nturtle.shapesize(??)\nturtle.shapetransform(??)\nturtle.shearfactor(??)\nturtle.showturtle(??)\nturtle.simpledialog(??)\nturtle.speed(??)\nturtle.split(??)\nturtle.st(??)\nturtle.stamp(??)\nturtle.textinput(??)\nturtle.tilt(??)\nturtle.tiltangle(??)\nturtle.time(??)\nturtle.title(??)\nturtle.towards(??)\nturtle.tracer(??)\nturtle.turtles(??)\nturtle.turtlesize(??)\nturtle.types(??)\nturtle.undo (repeatedly) the last turtle action.\nturtle.undobufferentries(??)\nturtle.up(??)\nturtle.update(??)\nturtle.width(??)\nturtle.window_height(??)\nturtle.window_width(??)\nturtle.write(??)\nturtle.write_docstringdict(??)\nturtle.xcor(??)\nturtle.ycor(??)\ntype(object_or_name, bases, dict)\ntypes.BuiltinFunctionType(??)\ntypes.BuiltinMethodType(??)\ntypes.CodeType(??)\ntypes.DynamicClassAttribute(??)\ntypes.FrameType(??)\ntypes.FunctionType(??)\ntypes.GeneratorType(??)\ntypes.GetSetDescriptorType(??)\ntypes.LambdaType(??)\ntypes.MappingProxyType(??)\ntypes.MemberDescriptorType(??)\ntypes.MethodType(??)\ntypes.ModuleType(??)\ntypes.SimpleNamespace(??)\ntypes.TracebackType(??)\ntypes.new_class(??)\ntypes.prepare_class(??)\nunicodedata.UCD(??)\nunicodedata.bidirectional(unichr)\nunicodedata.category(unichr)\nunicodedata.combining(unichr)\nunicodedata.decimal(??)\nunicodedata.decomposition(unichr)\nunicodedata.digit(unichr[, default])\nunicodedata.east_asian_width(unichr)\nunicodedata.lookup(name)\nunicodedata.mirrored(unichr)\nunicodedata.name(unichr[, default])\nunicodedata.normalize(form, unistr)\nunicodedata.numeric(unichr[, default])\nunicodedata.ucd_3_2_0(??)\nunicodedata.ucnhash_CAPI(??)\nunicodedata.unidata_version\nurllib.error(??)\nurllib.error.ContentTooShortError(??)\nurllib.error.HTTPError(??)\nurllib.error.URLError(??)\nurllib.error.urllib(??)\nurllib.parse(??)\nurllib.parse.DefragResult(??)\nurllib.parse.DefragResultBytes(??)\nurllib.parse.MAX_CACHE_SIZE\nurllib.parse.ParseResult(??)\nurllib.parse.ParseResultBytes(??)\nurllib.parse.Quoter(??)\nurllib.parse.ResultBase(??)\nurllib.parse.SplitResult(??)\nurllib.parse.SplitResultBytes(??)\nurllib.parse.clear_cache(??)\nurllib.parse.collections(??)\nurllib.parse.namedtuple(??)\nurllib.parse.non_hierarchical(??)\nurllib.parse.parse_qs(??)\nurllib.parse.parse_qsl(??)\nurllib.parse.quote('abc def') -> 'abc%20def'\nurllib.parse.quote_from_bytes(??)\nurllib.parse.quote_plus(??)\nurllib.parse.re(??)\nurllib.parse.scheme_chars\nurllib.parse.splitattr('/path;attr1=value1;attr2=value2;...') ->\nurllib.parse.splithost('//host[:port]/path') --> 'host[:port]', '/path'.\nurllib.parse.splitnport(??)\nurllib.parse.splitpasswd('user:passwd') -> 'user', 'passwd'.\nurllib.parse.splitport('host:port') --> 'host', 'port'.\nurllib.parse.splitquery('/path?query') --> '/path', 'query'.\nurllib.parse.splittag('/path#tag') --> '/path', 'tag'.\nurllib.parse.splittype('type:opaquestring') --> 'type', 'opaquestring'.\nurllib.parse.splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.\nurllib.parse.splitvalue('attr=value') --> 'attr', 'value'.\nurllib.parse.sys(??)\nurllib.parse.to_bytes(u\"URL\") --> 'URL'.\nurllib.parse.unquote(??)\nurllib.parse.unquote_plus(??)\nurllib.parse.unquote_to_bytes('abc%20def') -> b'abc def'.\nurllib.parse.unwrap('<URL:type://host/path>') --> 'type://host/path'.\nurllib.parse.urldefrag(??)\nurllib.parse.urlencode(??)\nurllib.parse.urljoin(??)\nurllib.parse.urlparse(??)\nurllib.parse.urlsplit(??)\nurllib.parse.urlunparse(??)\nurllib.parse.urlunsplit(??)\nurllib.parse.uses_fragment(??)\nurllib.parse.uses_netloc(??)\nurllib.parse.uses_params(??)\nurllib.parse.uses_query(??)\nurllib.parse.uses_relative(??)\nurllib.request(??)\nurllib.request.AbstractBasicAuthHandler(??)\nurllib.request.AbstractDigestAuthHandler(??)\nurllib.request.AbstractHTTPHandler(??)\nurllib.request.BaseHandler(??)\nurllib.request.CacheFTPHandler(??)\nurllib.request.ContentTooShortError(??)\nurllib.request.DataHandler(??)\nurllib.request.FTPHandler(??)\nurllib.request.FancyURLopener(??)\nurllib.request.FileHandler(??)\nurllib.request.HTTPBasicAuthHandler(??)\nurllib.request.HTTPCookieProcessor(??)\nurllib.request.HTTPDefaultErrorHandler(??)\nurllib.request.HTTPDigestAuthHandler(??)\nurllib.request.HTTPError(??)\nurllib.request.HTTPErrorProcessor(??)\nurllib.request.HTTPHandler(??)\nurllib.request.HTTPPasswordMgr(??)\nurllib.request.HTTPPasswordMgrWithDefaultRealm(??)\nurllib.request.HTTPRedirectHandler(??)\nurllib.request.HTTPSHandler(??)\nurllib.request.MAXFTPCACHE\nurllib.request.OpenerDirector(??)\nurllib.request.ProxyBasicAuthHandler(??)\nurllib.request.ProxyDigestAuthHandler(??)\nurllib.request.ProxyHandler(??)\nurllib.request.Request(??)\nurllib.request.URLError(??)\nurllib.request.URLopener(??)\nurllib.request.UnknownHandler(??)\nurllib.request.addclosehook(??)\nurllib.request.addinfourl(??)\nurllib.request.base64(??)\nurllib.request.bisect(??)\nurllib.request.build_opener(??)\nurllib.request.collections(??)\nurllib.request.contextlib(??)\nurllib.request.email(??)\nurllib.request.ftpcache(??)\nurllib.request.ftperrors(??)\nurllib.request.ftpwrapper(??)\nurllib.request.getproxies(??)\nurllib.request.getproxies_environment(??)\nurllib.request.getproxies_macosx_sysconf(??)\nurllib.request.hashlib(??)\nurllib.request.http(??)\nurllib.request.install_opener(??)\nurllib.request.io(??)\nurllib.request.localhost(??)\nurllib.request.noheaders(??)\nurllib.request.os(??)\nurllib.request.parse_http_list(??)\nurllib.request.parse_keqv_list(??)\nurllib.request.pathname2url(??)\nurllib.request.posixpath(??)\nurllib.request.proxy_bypass(??)\nurllib.request.proxy_bypass_environment(??)\nurllib.request.proxy_bypass_macosx_sysconf(??)\nurllib.request.quote('abc def') -> 'abc%20def'\nurllib.request.re(??)\nurllib.request.request_host(??)\nurllib.request.socket(??)\nurllib.request.splitattr('/path;attr1=value1;attr2=value2;...') ->\nurllib.request.splithost('//host[:port]/path') --> 'host[:port]', '/path'.\nurllib.request.splitpasswd('user:passwd') -> 'user', 'passwd'.\nurllib.request.splitport('host:port') --> 'host', 'port'.\nurllib.request.splitquery('/path?query') --> '/path', 'query'.\nurllib.request.splittag('/path#tag') --> '/path', 'tag'.\nurllib.request.splittype('type:opaquestring') --> 'type', 'opaquestring'.\nurllib.request.splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.\nurllib.request.splitvalue('attr=value') --> 'attr', 'value'.\nurllib.request.ssl(??)\nurllib.request.sys(??)\nurllib.request.tempfile(??)\nurllib.request.thishost(??)\nurllib.request.time(??)\nurllib.request.to_bytes(u\"URL\") --> 'URL'.\nurllib.request.unquote(??)\nurllib.request.unquote_to_bytes('abc%20def') -> b'abc def'.\nurllib.request.unwrap('<URL:type://host/path>') --> 'type://host/path'.\nurllib.request.url2pathname(??)\nurllib.request.urlcleanup(??)\nurllib.request.urljoin(??)\nurllib.request.urlopen(??)\nurllib.request.urlparse(??)\nurllib.request.urlretrieve(??)\nurllib.request.urlsplit(??)\nurllib.request.urlunparse(??)\nurllib.request.warnings(??)\nurllib.response(??)\nurllib.response.addbase(??)\nurllib.response.addclosehook(??)\nurllib.response.addinfo(??)\nurllib.response.addinfourl(??)\nurllib.robotparser.Entry(??)\nurllib.robotparser.RobotFileParser(??)\nurllib.robotparser.RuleLine(??)\nurllib.robotparser.urllib(??)\nuu.Error(??)\nuu.binascii(??)\nuu.decode(??)\nuu.encode(??)\nuu.os(??)\nuu.sys(??)\nuu.test(??)\nuuid.NAMESPACE_DNS(??)\nuuid.NAMESPACE_OID(??)\nuuid.NAMESPACE_URL(??)\nuuid.NAMESPACE_X500(??)\nuuid.RESERVED_FUTURE\nuuid.RESERVED_MICROSOFT\nuuid.RESERVED_NCS\nuuid.RFC_4122\nuuid.UUID(??)\nuuid.bytes_(??)\nuuid.ctypes(??)\nuuid.getnode(??)\nuuid.int_(??)\nuuid.lib(??)\nuuid.libname\nuuid.os(??)\nuuid.sys(??)\nuuid.uuid1(??)\nuuid.uuid3(??)\nuuid.uuid4(??)\nuuid.uuid5(??)\nvars([object]) -> dictionary\nvenv.EnvBuilder(??)\nvenv.create(??)\nvenv.logger(??)\nvenv.logging(??)\nvenv.main(??)\nvenv.os(??)\nvenv.shutil(??)\nvenv.subprocess(??)\nvenv.sys(??)\nvenv.sysconfig(??)\nvenv.types(??)\nwarnings.WarningMessage(??)\nwarnings.catch_warnings(??)\nwarnings.defaultaction\nwarnings.filters(??)\nwarnings.filterwarnings(??)\nwarnings.formatwarning(??)\nwarnings.onceregistry(??)\nwarnings.resetwarnings(??)\nwarnings.showwarning(??)\nwarnings.simplefilter(??)\nwarnings.sys(??)\nwarnings.warn(??)\nwarnings.warn_explicit(??)\nwave.Chunk(??)\nwave.Error(??)\nwave.WAVE_FORMAT_PCM\nwave.Wave_read(??)\nwave.Wave_write(??)\nwave.audioop(??)\nwave.builtins(??)\nwave.namedtuple(??)\nwave.open(??)\nwave.openfp(??)\nwave.struct(??)\nwave.sys(??)\nweakref.CallableProxyType(??)\nweakref.KeyedRef(??)\nweakref.ProxyType(??)\nweakref.ProxyTypes(??)\nweakref.ReferenceType(??)\nweakref.WeakKeyDictionary(??)\nweakref.WeakMethod(??)\nweakref.WeakSet(??)\nweakref.WeakValueDictionary(??)\nweakref.collections(??)\nweakref.finalize(??)\nweakref.getweakrefcount(??)\nweakref.getweakrefs(object) -- return a list of all weak reference objects\nweakref.itertools(??)\nweakref.proxy(object[, callback]) -- create a proxy object that weakly\nweakref.ref(??)\nweakref.sys(??)\nwebbrowser.BackgroundBrowser(??)\nwebbrowser.BaseBrowser(??)\nwebbrowser.Chrome(??)\nwebbrowser.Chromium(??)\nwebbrowser.Elinks(??)\nwebbrowser.Error(??)\nwebbrowser.Galeon(??)\nwebbrowser.GenericBrowser(??)\nwebbrowser.Grail(??)\nwebbrowser.Konqueror(??)\nwebbrowser.MacOSX(??)\nwebbrowser.MacOSXOSAScript(??)\nwebbrowser.Mozilla(??)\nwebbrowser.Netscape(??)\nwebbrowser.Opera(??)\nwebbrowser.UnixBrowser(??)\nwebbrowser.get(??)\nwebbrowser.main(??)\nwebbrowser.open(??)\nwebbrowser.open_new(??)\nwebbrowser.open_new_tab(??)\nwebbrowser.os(??)\nwebbrowser.register(??)\nwebbrowser.register_X_browsers(??)\nwebbrowser.shlex(??)\nwebbrowser.shutil(??)\nwebbrowser.subprocess(??)\nwebbrowser.sys(??)\nwsgiref.handlers(??)\nwsgiref.handlers.BaseCGIHandler(??)\nwsgiref.handlers.BaseHandler(??)\nwsgiref.handlers.CGIHandler(??)\nwsgiref.handlers.FileWrapper(??)\nwsgiref.handlers.Headers(??)\nwsgiref.handlers.IISCGIHandler(??)\nwsgiref.handlers.SimpleHandler(??)\nwsgiref.handlers.format_date_time(??)\nwsgiref.handlers.guess_scheme(??)\nwsgiref.handlers.is_hop_by_hop(??)\nwsgiref.handlers.os(??)\nwsgiref.handlers.read_environ(??)\nwsgiref.handlers.sys(??)\nwsgiref.handlers.time(??)\nwsgiref.headers(??)\nwsgiref.headers.Headers(??)\nwsgiref.headers.re(??)\nwsgiref.headers.tspecials(??)\nwsgiref.simple_server(??)\nwsgiref.simple_server.BaseHTTPRequestHandler(??)\nwsgiref.simple_server.HTTPServer(??)\nwsgiref.simple_server.ServerHandler(??)\nwsgiref.simple_server.SimpleHandler(??)\nwsgiref.simple_server.WSGIRequestHandler(??)\nwsgiref.simple_server.WSGIServer(??)\nwsgiref.simple_server.demo_app(??)\nwsgiref.simple_server.make_server(??)\nwsgiref.simple_server.python_implementation(??)\nwsgiref.simple_server.server_version\nwsgiref.simple_server.software_version\nwsgiref.simple_server.sys(??)\nwsgiref.simple_server.sys_version\nwsgiref.simple_server.urllib(??)\nwsgiref.util(??)\nwsgiref.util.FileWrapper(??)\nwsgiref.util.application_uri(??)\nwsgiref.util.guess_scheme(??)\nwsgiref.util.is_hop_by_hop(??)\nwsgiref.util.posixpath(??)\nwsgiref.util.request_uri(??)\nwsgiref.util.setup_testing_defaults(??)\nwsgiref.util.shift_path_info(??)\nwsgiref.validate.ErrorWrapper(??)\nwsgiref.validate.InputWrapper(??)\nwsgiref.validate.IteratorWrapper(??)\nwsgiref.validate.PartialIteratorWrapper(??)\nwsgiref.validate.WSGIWarning(??)\nwsgiref.validate.WriteWrapper(??)\nwsgiref.validate.assert_(??)\nwsgiref.validate.bad_header_value_re(??)\nwsgiref.validate.check_content_type(??)\nwsgiref.validate.check_environ(??)\nwsgiref.validate.check_errors(??)\nwsgiref.validate.check_exc_info(??)\nwsgiref.validate.check_headers(??)\nwsgiref.validate.check_input(??)\nwsgiref.validate.check_iterator(??)\nwsgiref.validate.check_status(??)\nwsgiref.validate.check_string_type(??)\nwsgiref.validate.header_re(??)\nwsgiref.validate.re(??)\nwsgiref.validate.sys(??)\nwsgiref.validate.validator(??)\nwsgiref.validate.warnings(??)\nxdrlib.BytesIO([buffer]) -> object\nxdrlib.ConversionError(??)\nxdrlib.Error(??)\nxdrlib.Packer(??)\nxdrlib.Unpacker(??)\nxdrlib.struct(??)\nxml.dom.DOMException(??)\nxml.dom.DOMSTRING_SIZE_ERR\nxml.dom.DomstringSizeErr(??)\nxml.dom.EMPTY_NAMESPACE(??)\nxml.dom.EMPTY_PREFIX(??)\nxml.dom.HIERARCHY_REQUEST_ERR\nxml.dom.HierarchyRequestErr(??)\nxml.dom.INDEX_SIZE_ERR\nxml.dom.INUSE_ATTRIBUTE_ERR\nxml.dom.INVALID_ACCESS_ERR\nxml.dom.INVALID_CHARACTER_ERR\nxml.dom.INVALID_MODIFICATION_ERR\nxml.dom.INVALID_STATE_ERR\nxml.dom.IndexSizeErr(??)\nxml.dom.InuseAttributeErr(??)\nxml.dom.InvalidAccessErr(??)\nxml.dom.InvalidCharacterErr(??)\nxml.dom.InvalidModificationErr(??)\nxml.dom.InvalidStateErr(??)\nxml.dom.NAMESPACE_ERR\nxml.dom.NOT_FOUND_ERR\nxml.dom.NOT_SUPPORTED_ERR\nxml.dom.NO_DATA_ALLOWED_ERR\nxml.dom.NO_MODIFICATION_ALLOWED_ERR\nxml.dom.NamespaceErr(??)\nxml.dom.NoDataAllowedErr(??)\nxml.dom.NoModificationAllowedErr(??)\nxml.dom.Node(??)\nxml.dom.NodeFilter.NodeFilter(??)\nxml.dom.NotFoundErr(??)\nxml.dom.NotSupportedErr(??)\nxml.dom.SYNTAX_ERR\nxml.dom.SyntaxErr(??)\nxml.dom.UserDataHandler(??)\nxml.dom.VALIDATION_ERR\nxml.dom.ValidationErr(??)\nxml.dom.WRONG_DOCUMENT_ERR\nxml.dom.WrongDocumentErr(??)\nxml.dom.XHTML_NAMESPACE\nxml.dom.XMLNS_NAMESPACE\nxml.dom.XML_NAMESPACE\nxml.dom.domreg(??)\nxml.dom.domreg.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxml.dom.domreg.registerDOMImplementation(name, factory)\nxml.dom.domreg.registered(??)\nxml.dom.domreg.well_known_implementations(??)\nxml.dom.expatbuilder.CDATA_SECTION_NODE\nxml.dom.expatbuilder.DOCUMENT_NODE\nxml.dom.expatbuilder.EMPTY_NAMESPACE(??)\nxml.dom.expatbuilder.EMPTY_PREFIX(??)\nxml.dom.expatbuilder.ElementInfo(??)\nxml.dom.expatbuilder.ExpatBuilder(??)\nxml.dom.expatbuilder.ExpatBuilderNS(??)\nxml.dom.expatbuilder.FILTER_ACCEPT\nxml.dom.expatbuilder.FILTER_INTERRUPT\nxml.dom.expatbuilder.FILTER_REJECT\nxml.dom.expatbuilder.FILTER_SKIP\nxml.dom.expatbuilder.FilterCrutch(??)\nxml.dom.expatbuilder.FilterVisibilityController(??)\nxml.dom.expatbuilder.FragmentBuilder(??)\nxml.dom.expatbuilder.FragmentBuilderNS(??)\nxml.dom.expatbuilder.InternalSubsetExtractor(??)\nxml.dom.expatbuilder.Namespaces(??)\nxml.dom.expatbuilder.Node(??)\nxml.dom.expatbuilder.NodeFilter(??)\nxml.dom.expatbuilder.ParseEscape(??)\nxml.dom.expatbuilder.Rejecter(??)\nxml.dom.expatbuilder.Skipper(??)\nxml.dom.expatbuilder.TEXT_NODE\nxml.dom.expatbuilder.XMLNS_NAMESPACE\nxml.dom.expatbuilder.expat(??)\nxml.dom.expatbuilder.makeBuilder(??)\nxml.dom.expatbuilder.minidom(??)\nxml.dom.expatbuilder.parse(??)\nxml.dom.expatbuilder.parseFragment(??)\nxml.dom.expatbuilder.parseFragmentString(??)\nxml.dom.expatbuilder.parseString(??)\nxml.dom.expatbuilder.theDOMImplementation(??)\nxml.dom.expatbuilder.xmlbuilder(??)\nxml.dom.getDOMImplementation(name = None, features = ()) -> DOM implementation.\nxml.dom.minicompat.EmptyNodeList(??)\nxml.dom.minicompat.NodeList(??)\nxml.dom.minicompat.StringTypes(??)\nxml.dom.minicompat.defproperty(??)\nxml.dom.minicompat.xml(??)\nxml.dom.minidom.Attr(??)\nxml.dom.minidom.AttributeList(??)\nxml.dom.minidom.CDATASection(??)\nxml.dom.minidom.CharacterData(??)\nxml.dom.minidom.Childless(??)\nxml.dom.minidom.Comment(??)\nxml.dom.minidom.DOMImplementation(??)\nxml.dom.minidom.DOMImplementationLS(??)\nxml.dom.minidom.Document(??)\nxml.dom.minidom.DocumentFragment(??)\nxml.dom.minidom.DocumentLS(??)\nxml.dom.minidom.DocumentType(??)\nxml.dom.minidom.EMPTY_NAMESPACE(??)\nxml.dom.minidom.EMPTY_PREFIX(??)\nxml.dom.minidom.Element(??)\nxml.dom.minidom.ElementInfo(??)\nxml.dom.minidom.EmptyNodeList(??)\nxml.dom.minidom.Entity(??)\nxml.dom.minidom.Identified(??)\nxml.dom.minidom.NamedNodeMap(??)\nxml.dom.minidom.Node(??)\nxml.dom.minidom.NodeList(??)\nxml.dom.minidom.Notation(??)\nxml.dom.minidom.ProcessingInstruction(??)\nxml.dom.minidom.ReadOnlySequentialNamedNodeMap(??)\nxml.dom.minidom.StringTypes(??)\nxml.dom.minidom.Text(??)\nxml.dom.minidom.TypeInfo(??)\nxml.dom.minidom.XMLNS_NAMESPACE\nxml.dom.minidom.defproperty(??)\nxml.dom.minidom.domreg(??)\nxml.dom.minidom.getDOMImplementation(??)\nxml.dom.minidom.io(??)\nxml.dom.minidom.parse(??)\nxml.dom.minidom.parseString(??)\nxml.dom.minidom.xml(??)\nxml.dom.pulldom.CHARACTERS\nxml.dom.pulldom.COMMENT\nxml.dom.pulldom.DOMEventStream(??)\nxml.dom.pulldom.END_DOCUMENT\nxml.dom.pulldom.END_ELEMENT\nxml.dom.pulldom.ErrorHandler(??)\nxml.dom.pulldom.IGNORABLE_WHITESPACE\nxml.dom.pulldom.PROCESSING_INSTRUCTION\nxml.dom.pulldom.PullDOM(??)\nxml.dom.pulldom.SAX2DOM(??)\nxml.dom.pulldom.START_DOCUMENT\nxml.dom.pulldom.START_ELEMENT\nxml.dom.pulldom.default_bufsize\nxml.dom.pulldom.parse(??)\nxml.dom.pulldom.parseString(??)\nxml.dom.pulldom.xml(??)\nxml.dom.registerDOMImplementation(name, factory)\nxml.dom.xmlbuilder.DOMBuilder(??)\nxml.dom.xmlbuilder.DOMBuilderFilter(??)\nxml.dom.xmlbuilder.DOMEntityResolver(??)\nxml.dom.xmlbuilder.DOMImplementationLS(??)\nxml.dom.xmlbuilder.DOMInputSource(??)\nxml.dom.xmlbuilder.DocumentLS(??)\nxml.dom.xmlbuilder.Options(??)\nxml.dom.xmlbuilder.copy(??)\nxml.dom.xmlbuilder.xml(??)\nxml.etree.ElementInclude.ElementTree(??)\nxml.etree.ElementInclude.FatalIncludeError(??)\nxml.etree.ElementInclude.XINCLUDE\nxml.etree.ElementInclude.XINCLUDE_FALLBACK\nxml.etree.ElementInclude.XINCLUDE_INCLUDE\nxml.etree.ElementInclude.copy(??)\nxml.etree.ElementInclude.default_loader(??)\nxml.etree.ElementInclude.include(??)\nxml.etree.ElementPath.find(??)\nxml.etree.ElementPath.findall(??)\nxml.etree.ElementPath.findtext(??)\nxml.etree.ElementPath.get_parent_map(??)\nxml.etree.ElementPath.iterfind(??)\nxml.etree.ElementPath.ops(??)\nxml.etree.ElementPath.prepare_child(??)\nxml.etree.ElementPath.prepare_descendant(??)\nxml.etree.ElementPath.prepare_parent(??)\nxml.etree.ElementPath.prepare_predicate(??)\nxml.etree.ElementPath.prepare_self(??)\nxml.etree.ElementPath.prepare_star(??)\nxml.etree.ElementPath.re(??)\nxml.etree.ElementPath.xpath_tokenizer(??)\nxml.etree.ElementPath.xpath_tokenizer_re(??)\nxml.etree.ElementTree.Comment(??)\nxml.etree.ElementTree.Element(??)\nxml.etree.ElementTree.ElementPath(??)\nxml.etree.ElementTree.ElementTree(??)\nxml.etree.ElementTree.HTML_EMPTY(??)\nxml.etree.ElementTree.PI(??)\nxml.etree.ElementTree.ParseError(??)\nxml.etree.ElementTree.ProcessingInstruction(??)\nxml.etree.ElementTree.QName(??)\nxml.etree.ElementTree.SubElement(??)\nxml.etree.ElementTree.TreeBuilder(??)\nxml.etree.ElementTree.VERSION\nxml.etree.ElementTree.XML(??)\nxml.etree.ElementTree.XMLID(??)\nxml.etree.ElementTree.XMLParser(??)\nxml.etree.ElementTree.XMLPullParser(??)\nxml.etree.ElementTree.contextlib(??)\nxml.etree.ElementTree.dump(??)\nxml.etree.ElementTree.fromstring(??)\nxml.etree.ElementTree.fromstringlist(??)\nxml.etree.ElementTree.io(??)\nxml.etree.ElementTree.iselement(??)\nxml.etree.ElementTree.iterparse(??)\nxml.etree.ElementTree.parse(??)\nxml.etree.ElementTree.re(??)\nxml.etree.ElementTree.register_namespace(??)\nxml.etree.ElementTree.sys(??)\nxml.etree.ElementTree.tostring(??)\nxml.etree.ElementTree.tostringlist(??)\nxml.etree.ElementTree.warnings(??)\nxml.etree.cElementTree.Comment(??)\nxml.etree.cElementTree.Element(??)\nxml.etree.cElementTree.ElementTree(??)\nxml.etree.cElementTree.PI(??)\nxml.etree.cElementTree.ParseError(??)\nxml.etree.cElementTree.ProcessingInstruction(??)\nxml.etree.cElementTree.QName(??)\nxml.etree.cElementTree.SubElement(??)\nxml.etree.cElementTree.TreeBuilder(??)\nxml.etree.cElementTree.VERSION\nxml.etree.cElementTree.XML(??)\nxml.etree.cElementTree.XMLID(??)\nxml.etree.cElementTree.XMLParser(??)\nxml.etree.cElementTree.dump(??)\nxml.etree.cElementTree.fromstring(??)\nxml.etree.cElementTree.fromstringlist(??)\nxml.etree.cElementTree.iselement(??)\nxml.etree.cElementTree.iterparse(??)\nxml.etree.cElementTree.parse(??)\nxml.etree.cElementTree.register_namespace(??)\nxml.etree.cElementTree.tostring(??)\nxml.etree.cElementTree.tostringlist(??)\nxml.parsers(??)\nxml.parsers.expat(??)\nxml.parsers.expat.EXPAT_VERSION\nxml.parsers.expat.ErrorString(errno) -> string\nxml.parsers.expat.ExpatError(??)\nxml.parsers.expat.ParserCreate([encoding[, namespace_separator]]) -> parser\nxml.parsers.expat.XMLParserType(??)\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_ALWAYS\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_NEVER\nxml.parsers.expat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE\nxml.parsers.expat.error(??)\nxml.parsers.expat.errors(??)\nxml.parsers.expat.expat_CAPI(??)\nxml.parsers.expat.features(??)\nxml.parsers.expat.model(??)\nxml.parsers.expat.native_encoding\nxml.parsers.expat.sys(??)\nxml.parsers.expat.version_info(??)\nxml.sax.ContentHandler(??)\nxml.sax.ErrorHandler(??)\nxml.sax.InputSource(??)\nxml.sax.SAXException(??)\nxml.sax.SAXNotRecognizedException(??)\nxml.sax.SAXNotSupportedException(??)\nxml.sax.SAXParseException(??)\nxml.sax.SAXReaderNotAvailable(??)\nxml.sax.default_parser_list(??)\nxml.sax.expatreader.AttributesImpl(??)\nxml.sax.expatreader.AttributesNSImpl(??)\nxml.sax.expatreader.ExpatLocator(??)\nxml.sax.expatreader.ExpatParser(??)\nxml.sax.expatreader.SAXException(??)\nxml.sax.expatreader.SAXNotRecognizedException(??)\nxml.sax.expatreader.SAXNotSupportedException(??)\nxml.sax.expatreader.SAXParseException(??)\nxml.sax.expatreader.SAXReaderNotAvailable(??)\nxml.sax.expatreader.create_parser(??)\nxml.sax.expatreader.expat(??)\nxml.sax.expatreader.feature_external_ges\nxml.sax.expatreader.feature_external_pes\nxml.sax.expatreader.feature_namespace_prefixes\nxml.sax.expatreader.feature_namespaces\nxml.sax.expatreader.feature_string_interning\nxml.sax.expatreader.feature_validation\nxml.sax.expatreader.handler(??)\nxml.sax.expatreader.property_interning_dict\nxml.sax.expatreader.property_xml_string\nxml.sax.expatreader.saxutils(??)\nxml.sax.expatreader.version\nxml.sax.expatreader.xmlreader(??)\nxml.sax.handler(??)\nxml.sax.handler.ContentHandler(??)\nxml.sax.handler.DTDHandler(??)\nxml.sax.handler.EntityResolver(??)\nxml.sax.handler.ErrorHandler(??)\nxml.sax.handler.all_features(??)\nxml.sax.handler.all_properties(??)\nxml.sax.handler.feature_external_ges\nxml.sax.handler.feature_external_pes\nxml.sax.handler.feature_namespace_prefixes\nxml.sax.handler.feature_namespaces\nxml.sax.handler.feature_string_interning\nxml.sax.handler.feature_validation\nxml.sax.handler.property_declaration_handler\nxml.sax.handler.property_dom_node\nxml.sax.handler.property_encoding\nxml.sax.handler.property_interning_dict\nxml.sax.handler.property_lexical_handler\nxml.sax.handler.property_xml_string\nxml.sax.handler.version\nxml.sax.make_parser(??)\nxml.sax.parse(??)\nxml.sax.parseString(??)\nxml.sax.saxutils.XMLFilterBase(??)\nxml.sax.saxutils.XMLGenerator(??)\nxml.sax.saxutils.codecs(??)\nxml.sax.saxutils.escape(??)\nxml.sax.saxutils.handler(??)\nxml.sax.saxutils.io(??)\nxml.sax.saxutils.os(??)\nxml.sax.saxutils.prepare_input_source(??)\nxml.sax.saxutils.quoteattr(??)\nxml.sax.saxutils.unescape(??)\nxml.sax.saxutils.urllib(??)\nxml.sax.saxutils.xmlreader(??)\nxml.sax.xmlreader(??)\nxml.sax.xmlreader.AttributesImpl(??)\nxml.sax.xmlreader.AttributesNSImpl(??)\nxml.sax.xmlreader.IncrementalParser(??)\nxml.sax.xmlreader.InputSource(??)\nxml.sax.xmlreader.Locator(??)\nxml.sax.xmlreader.SAXNotRecognizedException(??)\nxml.sax.xmlreader.SAXNotSupportedException(??)\nxml.sax.xmlreader.XMLReader(??)\nxml.sax.xmlreader.handler(??)\nxmlrpc.client.APPLICATION_ERROR\nxmlrpc.client.Binary(??)\nxmlrpc.client.Boolean(??)\nxmlrpc.client.BytesIO([buffer]) -> object\nxmlrpc.client.DateTime(??)\nxmlrpc.client.Error(??)\nxmlrpc.client.ExpatParser(??)\nxmlrpc.client.FastMarshaller(??)\nxmlrpc.client.FastParser(??)\nxmlrpc.client.FastUnmarshaller(??)\nxmlrpc.client.Fault(??)\nxmlrpc.client.GzipDecodedResponse(??)\nxmlrpc.client.INTERNAL_ERROR\nxmlrpc.client.INVALID_ENCODING_CHAR\nxmlrpc.client.INVALID_METHOD_PARAMS\nxmlrpc.client.INVALID_XMLRPC\nxmlrpc.client.MAXINT\nxmlrpc.client.METHOD_NOT_FOUND\nxmlrpc.client.MININT\nxmlrpc.client.Marshaller(??)\nxmlrpc.client.MultiCall(??)\nxmlrpc.client.MultiCallIterator(??)\nxmlrpc.client.NOT_WELLFORMED_ERROR\nxmlrpc.client.PARSE_ERROR\nxmlrpc.client.ProtocolError(??)\nxmlrpc.client.ResponseError(??)\nxmlrpc.client.SERVER_ERROR\nxmlrpc.client.SYSTEM_ERROR\nxmlrpc.client.SafeTransport(??)\nxmlrpc.client.Server(??)\nxmlrpc.client.ServerProxy(??)\nxmlrpc.client.TRANSPORT_ERROR\nxmlrpc.client.Transport(??)\nxmlrpc.client.UNSUPPORTED_ENCODING\nxmlrpc.client.Unmarshaller(??)\nxmlrpc.client.WRAPPERS(??)\nxmlrpc.client.base64(??)\nxmlrpc.client.boolean(??)\nxmlrpc.client.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\nxmlrpc.client.dumps(??)\nxmlrpc.client.errno(??)\nxmlrpc.client.escape(??)\nxmlrpc.client.expat(??)\nxmlrpc.client.getparser() -> parser, unmarshaller\nxmlrpc.client.gzip(??)\nxmlrpc.client.gzip_decode(??)\nxmlrpc.client.gzip_encode(??)\nxmlrpc.client.http(??)\nxmlrpc.client.loads(??)\nxmlrpc.client.socket(??)\nxmlrpc.client.sys(??)\nxmlrpc.client.time(??)\nxmlrpc.client.urllib(??)\nxmlrpc.server.BaseHTTPRequestHandler(??)\nxmlrpc.server.CGIXMLRPCRequestHandler(??)\nxmlrpc.server.DocCGIXMLRPCRequestHandler(??)\nxmlrpc.server.DocXMLRPCRequestHandler(??)\nxmlrpc.server.DocXMLRPCServer(??)\nxmlrpc.server.Fault(??)\nxmlrpc.server.MultiPathXMLRPCServer(??)\nxmlrpc.server.ServerHTMLDoc(??)\nxmlrpc.server.SimpleXMLRPCDispatcher(??)\nxmlrpc.server.SimpleXMLRPCRequestHandler(??)\nxmlrpc.server.SimpleXMLRPCServer(??)\nxmlrpc.server.XMLRPCDocGenerator(??)\nxmlrpc.server.dumps(??)\nxmlrpc.server.fcntl(??)\nxmlrpc.server.gzip_decode(??)\nxmlrpc.server.gzip_encode(??)\nxmlrpc.server.http(??)\nxmlrpc.server.inspect(??)\nxmlrpc.server.list_public_methods(??)\nxmlrpc.server.loads(??)\nxmlrpc.server.os(??)\nxmlrpc.server.pydoc(??)\nxmlrpc.server.re(??)\nxmlrpc.server.resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d\nxmlrpc.server.socketserver(??)\nxmlrpc.server.sys(??)\nxmlrpc.server.traceback(??)\nxxlimited.Null(??)\nxxlimited.Str(??)\nxxlimited.error(??)\nxxlimited.foo(i,j)\nxxlimited.new() -> new Xx object\nxxlimited.roj(a,b) -> None\nzip(iter1 [,iter2 [...]]) --> zip object\nzipfile.BZIP2_VERSION\nzipfile.BadZipFile(??)\nzipfile.BadZipfile(??)\nzipfile.DEFAULT_VERSION\nzipfile.LZMACompressor(??)\nzipfile.LZMADecompressor(??)\nzipfile.LZMA_VERSION\nzipfile.LargeZipFile(??)\nzipfile.MAX_EXTRACT_VERSION\nzipfile.PyZipFile(??)\nzipfile.ZIP64_LIMIT\nzipfile.ZIP64_VERSION\nzipfile.ZIP_BZIP2\nzipfile.ZIP_DEFLATED\nzipfile.ZIP_FILECOUNT_LIMIT\nzipfile.ZIP_LZMA\nzipfile.ZIP_MAX_COMMENT\nzipfile.ZIP_STORED\nzipfile.ZipExtFile(??)\nzipfile.ZipFile(??)\nzipfile.ZipInfo(??)\nzipfile.binascii(??)\nzipfile.bz2(??)\nzipfile.compressor_names(??)\nzipfile.crc32(??)\nzipfile.error(??)\nzipfile.importlib(??)\nzipfile.io(??)\nzipfile.is_zipfile(??)\nzipfile.lzma(??)\nzipfile.main(??)\nzipfile.os(??)\nzipfile.re(??)\nzipfile.shutil(??)\nzipfile.sizeCentralDir\nzipfile.sizeEndCentDir\nzipfile.sizeEndCentDir64\nzipfile.sizeEndCentDir64Locator\nzipfile.sizeFileHeader\nzipfile.stat(??)\nzipfile.stringCentralDir\nzipfile.stringEndArchive\nzipfile.stringEndArchive64\nzipfile.stringEndArchive64Locator\nzipfile.stringFileHeader\nzipfile.struct(??)\nzipfile.structCentralDir\nzipfile.structEndArchive\nzipfile.structEndArchive64\nzipfile.structEndArchive64Locator\nzipfile.structFileHeader\nzipfile.sys(??)\nzipfile.time(??)\nzipfile.zlib(??)\nzipimport.ZipImportError(??)\nzipimport.zipimporter(archivepath) -> zipimporter object\nzlib.DEFLATED\nzlib.DEF_BUF_SIZE\nzlib.DEF_MEM_LEVEL\nzlib.MAX_WBITS\nzlib.ZLIB_RUNTIME_VERSION\nzlib.ZLIB_VERSION\nzlib.Z_BEST_COMPRESSION\nzlib.Z_BEST_SPEED\nzlib.Z_DEFAULT_COMPRESSION\nzlib.Z_DEFAULT_STRATEGY\nzlib.Z_FILTERED\nzlib.Z_FINISH\nzlib.Z_FULL_FLUSH\nzlib.Z_HUFFMAN_ONLY\nzlib.Z_NO_FLUSH\nzlib.Z_SYNC_FLUSH\nzlib.adler32(??)\nzlib.compress(??)\nzlib.compressobj(??)\nzlib.crc32(??)\nzlib.decompress(??)\nzlib.decompressobj(??)\nzlib.error(??)\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/AutoComplete.cpp",
    "content": "// Scintilla source code edit control\n/** @file AutoComplete.cxx\n ** Defines the auto completion list box.\n **/\n// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <assert.h>\n\n#include <string>\n#include <vector>\n#include <algorithm>\n\n#include \"Platform.h\"\n\n#include \"CharacterSet.h\"\n#include \"AutoComplete.h\"\n#include \"Scintilla.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nAutoComplete::AutoComplete() :\n\tactive(false),\n\tseparator(' '),\n\ttypesep('?'),\n\tignoreCase(false),\n\tchooseSingle(false),\n\tlb(0),\n\tposStart(0),\n\tstartLen(0),\n\tcancelAtStartPos(true),\n\tautoHide(true),\n\tdropRestOfWord(false),\n\tignoreCaseBehaviour(SC_CASEINSENSITIVEBEHAVIOUR_RESPECTCASE),\n\twidthLBDefault(100),\n\theightLBDefault(100),\n\tautoSort(SC_ORDER_PRESORTED) {\n\tlb = ListBox::Allocate();\n\tstopChars[0] = '\\0';\n\tfillUpChars[0] = '\\0';\n}\n\nAutoComplete::~AutoComplete() {\n\tif (lb) {\n\t\tlb->Destroy();\n\t\tdelete lb;\n\t\tlb = 0;\n\t}\n}\n\nbool AutoComplete::Active() const {\n\treturn active;\n}\n\nvoid AutoComplete::Start(Window &parent, int ctrlID,\n\tint position, Point location, int startLen_,\n\tint lineHeight, bool unicodeMode, int technology) {\n\tif (active) {\n\t\tCancel();\n\t}\n\tlb->Create(parent, ctrlID, location, lineHeight, unicodeMode, technology);\n\tlb->Clear();\n\tactive = true;\n\tstartLen = startLen_;\n\tposStart = position;\n}\n\nvoid AutoComplete::SetStopChars(const char *stopChars_) {\n\tstrncpy(stopChars, stopChars_, sizeof(stopChars));\n\tstopChars[sizeof(stopChars) - 1] = '\\0';\n}\n\nbool AutoComplete::IsStopChar(char ch) {\n\treturn ch && strchr(stopChars, ch);\n}\n\nvoid AutoComplete::SetFillUpChars(const char *fillUpChars_) {\n\tstrncpy(fillUpChars, fillUpChars_, sizeof(fillUpChars));\n\tfillUpChars[sizeof(fillUpChars) - 1] = '\\0';\n}\n\nbool AutoComplete::IsFillUpChar(char ch) {\n\treturn ch && strchr(fillUpChars, ch);\n}\n\nvoid AutoComplete::SetSeparator(char separator_) {\n\tseparator = separator_;\n}\n\nchar AutoComplete::GetSeparator() const {\n\treturn separator;\n}\n\nvoid AutoComplete::SetTypesep(char separator_) {\n\ttypesep = separator_;\n}\n\nchar AutoComplete::GetTypesep() const {\n\treturn typesep;\n}\n\nstruct Sorter {\n\tAutoComplete *ac;\n\tconst char *list;\n\tstd::vector<int> indices;\n\n\tSorter(AutoComplete *ac_, const char *list_) : ac(ac_), list(list_) {\n\t\tint i = 0;\n\t\twhile (list[i]) {\n\t\t\tindices.push_back(i); // word start\n\t\t\twhile (list[i] != ac->GetTypesep() && list[i] != ac->GetSeparator() && list[i])\n\t\t\t\t++i;\n\t\t\tindices.push_back(i); // word end\n\t\t\tif (list[i] == ac->GetTypesep()) {\n\t\t\t\twhile (list[i] != ac->GetSeparator() && list[i])\n\t\t\t\t\t++i;\n\t\t\t}\n\t\t\tif (list[i] == ac->GetSeparator()) {\n\t\t\t\t++i;\n\t\t\t\t// preserve trailing separator as blank entry\n\t\t\t\tif (!list[i]) {\n\t\t\t\t\tindices.push_back(i);\n\t\t\t\t\tindices.push_back(i);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tindices.push_back(i); // index of last position\n\t}\n\n\tbool operator()(int a, int b) {\n\t\tint lenA = indices[a * 2 + 1] - indices[a * 2];\n\t\tint lenB = indices[b * 2 + 1] - indices[b * 2];\n\t\tint len  = std::min(lenA, lenB);\n\t\tint cmp;\n\t\tif (ac->ignoreCase)\n\t\t\tcmp = CompareNCaseInsensitive(list + indices[a * 2], list + indices[b * 2], len);\n\t\telse\n\t\t\tcmp = strncmp(list + indices[a * 2], list + indices[b * 2], len);\n\t\tif (cmp == 0)\n\t\t\tcmp = lenA - lenB;\n\t\treturn cmp < 0;\n\t}\n};\n\nvoid AutoComplete::SetList(const char *list) {\n\tif (autoSort == SC_ORDER_PRESORTED) {\n\t\tlb->SetList(list, separator, typesep);\n\t\tsortMatrix.clear();\n\t\tfor (int i = 0; i < lb->Length(); ++i)\n\t\t\tsortMatrix.push_back(i);\n\t\treturn;\n\t}\n\n\tSorter IndexSort(this, list);\n\tsortMatrix.clear();\n\tfor (int i = 0; i < (int)IndexSort.indices.size() / 2; ++i)\n\t\tsortMatrix.push_back(i);\n\tstd::sort(sortMatrix.begin(), sortMatrix.end(), IndexSort);\n\tif (autoSort == SC_ORDER_CUSTOM || sortMatrix.size() < 2) {\n\t\tlb->SetList(list, separator, typesep);\n\t\tPLATFORM_ASSERT(lb->Length() == static_cast<int>(sortMatrix.size()));\n\t\treturn;\n\t}\n\n\tstd::string sortedList;\n\tchar item[maxItemLen];\n\tfor (size_t i = 0; i < sortMatrix.size(); ++i) {\n\t\tint wordLen = IndexSort.indices[sortMatrix[i] * 2 + 2] - IndexSort.indices[sortMatrix[i] * 2];\n\t\tstrncpy(item, list + IndexSort.indices[sortMatrix[i] * 2], wordLen);\n\t\tif ((i+1) == sortMatrix.size()) {\n\t\t\t// Last item so remove separator if present\n\t\t\tif ((wordLen > 0) && (item[wordLen-1] == separator))\n\t\t\t\twordLen--;\n\t\t} else {\n\t\t\t// Item before last needs a separator\n\t\t\tif ((wordLen == 0) || (item[wordLen-1] != separator)) {\n\t\t\t\titem[wordLen] = separator;\n\t\t\t\twordLen++;\n\t\t\t}\n\t\t}\n\t\titem[wordLen] = '\\0';\n\t\tsortedList += item;\n\t}\n\tfor (int i = 0; i < (int)sortMatrix.size(); ++i)\n\t\tsortMatrix[i] = i;\n\tlb->SetList(sortedList.c_str(), separator, typesep);\n}\n\nint AutoComplete::GetSelection() const {\n\treturn lb->GetSelection();\n}\n\nstd::string AutoComplete::GetValue(int item) const {\n\tchar value[maxItemLen];\n\tlb->GetValue(item, value, sizeof(value));\n\treturn std::string(value);\n}\n\nvoid AutoComplete::Show(bool show) {\n\tlb->Show(show);\n\tif (show)\n\t\tlb->Select(0);\n}\n\nvoid AutoComplete::Cancel() {\n\tif (lb->Created()) {\n\t\tlb->Clear();\n\t\tlb->Destroy();\n\t\tactive = false;\n\t}\n}\n\n\nvoid AutoComplete::Move(int delta) {\n\tint count = lb->Length();\n\tint current = lb->GetSelection();\n\tcurrent += delta;\n\tif (current >= count)\n\t\tcurrent = count - 1;\n\tif (current < 0)\n\t\tcurrent = 0;\n\tlb->Select(current);\n}\n\nvoid AutoComplete::Select(const char *word) {\n\tsize_t lenWord = strlen(word);\n\tint location = -1;\n\tint start = 0; // lower bound of the api array block to search\n\tint end = lb->Length() - 1; // upper bound of the api array block to search\n\twhile ((start <= end) && (location == -1)) { // Binary searching loop\n\t\tint pivot = (start + end) / 2;\n\t\tchar item[maxItemLen];\n\t\tlb->GetValue(sortMatrix[pivot], item, maxItemLen);\n\t\tint cond;\n\t\tif (ignoreCase)\n\t\t\tcond = CompareNCaseInsensitive(word, item, lenWord);\n\t\telse\n\t\t\tcond = strncmp(word, item, lenWord);\n\t\tif (!cond) {\n\t\t\t// Find first match\n\t\t\twhile (pivot > start) {\n\t\t\t\tlb->GetValue(sortMatrix[pivot-1], item, maxItemLen);\n\t\t\t\tif (ignoreCase)\n\t\t\t\t\tcond = CompareNCaseInsensitive(word, item, lenWord);\n\t\t\t\telse\n\t\t\t\t\tcond = strncmp(word, item, lenWord);\n\t\t\t\tif (0 != cond)\n\t\t\t\t\tbreak;\n\t\t\t\t--pivot;\n\t\t\t}\n\t\t\tlocation = pivot;\n\t\t\tif (ignoreCase\n\t\t\t\t&& ignoreCaseBehaviour == SC_CASEINSENSITIVEBEHAVIOUR_RESPECTCASE) {\n\t\t\t\t// Check for exact-case match\n\t\t\t\tfor (; pivot <= end; pivot++) {\n\t\t\t\t\tlb->GetValue(sortMatrix[pivot], item, maxItemLen);\n\t\t\t\t\tif (!strncmp(word, item, lenWord)) {\n\t\t\t\t\t\tlocation = pivot;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (CompareNCaseInsensitive(word, item, lenWord))\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (cond < 0) {\n\t\t\tend = pivot - 1;\n\t\t} else if (cond > 0) {\n\t\t\tstart = pivot + 1;\n\t\t}\n\t}\n\tif (location == -1) {\n\t\tif (autoHide)\n\t\t\tCancel();\n\t\telse\n\t\t\tlb->Select(-1);\n\t} else {\n\t\tif (autoSort == SC_ORDER_CUSTOM) {\n\t\t\t// Check for a logically earlier match\n\t\t\tchar item[maxItemLen];\n\t\t\tfor (int i = location + 1; i <= end; ++i) {\n\t\t\t\tlb->GetValue(sortMatrix[i], item, maxItemLen);\n\t\t\t\tif (CompareNCaseInsensitive(word, item, lenWord))\n\t\t\t\t\tbreak;\n\t\t\t\tif (sortMatrix[i] < sortMatrix[location] && !strncmp(word, item, lenWord))\n\t\t\t\t\tlocation = i;\n\t\t\t}\n\t\t}\n\t\tlb->Select(sortMatrix[location]);\n\t}\n}\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/AutoComplete.h",
    "content": "// Scintilla source code edit control\n/** @file AutoComplete.h\n ** Defines the auto completion list box.\n **/\n// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef AUTOCOMPLETE_H\n#define AUTOCOMPLETE_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n/**\n */\nclass AutoComplete {\n\tbool active;\n\tchar stopChars[256];\n\tchar fillUpChars[256];\n\tchar separator;\n\tchar typesep; // Type seperator\n\tenum { maxItemLen=1000 };\n\tstd::vector<int> sortMatrix;\n\npublic:\n\n\tbool ignoreCase;\n\tbool chooseSingle;\n\tListBox *lb;\n\tint posStart;\n\tint startLen;\n\t/// Should autocompletion be canceled if editor's currentPos <= startPos?\n\tbool cancelAtStartPos;\n\tbool autoHide;\n\tbool dropRestOfWord;\n\tunsigned int ignoreCaseBehaviour;\n\tint widthLBDefault;\n\tint heightLBDefault;\n\t/** SC_ORDER_PRESORTED:   Assume the list is presorted; selection will fail if it is not alphabetical<br />\n\t *  SC_ORDER_PERFORMSORT: Sort the list alphabetically; start up performance cost for sorting<br />\n\t *  SC_ORDER_CUSTOM:      Handle non-alphabetical entries; start up performance cost for generating a sorted lookup table\n\t */\n\tint autoSort;\n\n\tAutoComplete();\n\t~AutoComplete();\n\n\t/// Is the auto completion list displayed?\n\tbool Active() const;\n\n\t/// Display the auto completion list positioned to be near a character position\n\tvoid Start(Window &parent, int ctrlID, int position, Point location,\n\t\tint startLen_, int lineHeight, bool unicodeMode, int technology);\n\n\t/// The stop chars are characters which, when typed, cause the auto completion list to disappear\n\tvoid SetStopChars(const char *stopChars_);\n\tbool IsStopChar(char ch);\n\n\t/// The fillup chars are characters which, when typed, fill up the selected word\n\tvoid SetFillUpChars(const char *fillUpChars_);\n\tbool IsFillUpChar(char ch);\n\n\t/// The separator character is used when interpreting the list in SetList\n\tvoid SetSeparator(char separator_);\n\tchar GetSeparator() const;\n\n\t/// The typesep character is used for seperating the word from the type\n\tvoid SetTypesep(char separator_);\n\tchar GetTypesep() const;\n\n\t/// The list string contains a sequence of words separated by the separator character\n\tvoid SetList(const char *list);\n\t\n\t/// Return the position of the currently selected list item\n\tint GetSelection() const;\n\n\t/// Return the value of an item in the list\n\tstd::string GetValue(int item) const;\n\n\tvoid Show(bool show);\n\tvoid Cancel();\n\n\t/// Move the current list element by delta, scrolling appropriately\n\tvoid Move(int delta);\n\n\t/// Select a list element that starts with word as the current element\n\tvoid Select(const char *word);\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/CallTip.cpp",
    "content": "// Scintilla source code edit control\n/** @file CallTip.cxx\n ** Code for displaying call tips.\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n\n#include <string>\n\n#include \"Platform.h\"\n\n#include \"Scintilla.h\"\n#include \"CallTip.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nCallTip::CallTip() {\n\twCallTip = 0;\n\tinCallTipMode = false;\n\tposStartCallTip = 0;\n\trectUp = PRectangle(0,0,0,0);\n\trectDown = PRectangle(0,0,0,0);\n\tlineHeight = 1;\n\toffsetMain = 0;\n\tstartHighlight = 0;\n\tendHighlight = 0;\n\ttabSize = 0;\n\tabove = false;\n\tuseStyleCallTip = false;    // for backwards compatibility\n\n\tinsetX = 5;\n\twidthArrow = 14;\n\tborderHeight = 2; // Extra line for border and an empty line at top and bottom.\n\tverticalOffset = 1;\n\n#ifdef __APPLE__\n\t// proper apple colours for the default\n\tcolourBG = ColourDesired(0xff, 0xff, 0xc6);\n\tcolourUnSel = ColourDesired(0, 0, 0);\n#else\n\tcolourBG = ColourDesired(0xff, 0xff, 0xff);\n\tcolourUnSel = ColourDesired(0x80, 0x80, 0x80);\n#endif\n\tcolourSel = ColourDesired(0, 0, 0x80);\n\tcolourShade = ColourDesired(0, 0, 0);\n\tcolourLight = ColourDesired(0xc0, 0xc0, 0xc0);\n\tcodePage = 0;\n\tclickPlace = 0;\n}\n\nCallTip::~CallTip() {\n\tfont.Release();\n\twCallTip.Destroy();\n}\n\n// Although this test includes 0, we should never see a \\0 character.\nstatic bool IsArrowCharacter(char ch) {\n\treturn (ch == 0) || (ch == '\\001') || (ch == '\\002');\n}\n\n// We ignore tabs unless a tab width has been set.\nbool CallTip::IsTabCharacter(char ch) const {\n\treturn (tabSize > 0) && (ch == '\\t');\n}\n\nint CallTip::NextTabPos(int x) const {\n\tif (tabSize > 0) {              // paranoia... not called unless this is true\n\t\tx -= insetX;                // position relative to text\n\t\tx = (x + tabSize) / tabSize;  // tab \"number\"\n\t\treturn tabSize*x + insetX;  // position of next tab\n\t} else {\n\t\treturn x + 1;                 // arbitrary\n\t}\n}\n\n// Draw a section of the call tip that does not include \\n in one colour.\n// The text may include up to numEnds tabs or arrow characters.\nvoid CallTip::DrawChunk(Surface *surface, int &x, const char *s,\n\tint posStart, int posEnd, int ytext, PRectangle rcClient,\n\tbool highlight, bool draw) {\n\ts += posStart;\n\tint len = posEnd - posStart;\n\n\t// Divide the text into sections that are all text, or that are\n\t// single arrows or single tab characters (if tabSize > 0).\n\tint maxEnd = 0;\n\tconst int numEnds = 10;\n\tint ends[numEnds + 2];\n\tfor (int i=0; i<len; i++) {\n\t\tif ((maxEnd < numEnds) &&\n\t\t        (IsArrowCharacter(s[i]) || IsTabCharacter(s[i]))) {\n\t\t\tif (i > 0)\n\t\t\t\tends[maxEnd++] = i;\n\t\t\tends[maxEnd++] = i+1;\n\t\t}\n\t}\n\tends[maxEnd++] = len;\n\tint startSeg = 0;\n\tint xEnd;\n\tfor (int seg = 0; seg<maxEnd; seg++) {\n\t\tint endSeg = ends[seg];\n\t\tif (endSeg > startSeg) {\n\t\t\tif (IsArrowCharacter(s[startSeg])) {\n\t\t\t\tbool upArrow = s[startSeg] == '\\001';\n\t\t\t\trcClient.left = x;\n\t\t\t\trcClient.right = rcClient.left + widthArrow;\n\t\t\t\tif (draw) {\n\t\t\t\t\tconst int halfWidth = widthArrow / 2 - 3;\n\t\t\t\t\tconst int centreX = rcClient.left + widthArrow / 2 - 1;\n\t\t\t\t\tconst int centreY = (rcClient.top + rcClient.bottom) / 2;\n\t\t\t\t\tsurface->FillRectangle(rcClient, colourBG);\n\t\t\t\t\tPRectangle rcClientInner(rcClient.left + 1, rcClient.top + 1,\n\t\t\t\t\t                         rcClient.right - 2, rcClient.bottom - 1);\n\t\t\t\t\tsurface->FillRectangle(rcClientInner, colourUnSel);\n\n\t\t\t\t\tif (upArrow) {      // Up arrow\n\t\t\t\t\t\tPoint pts[] = {\n    \t\t\t\t\t\tPoint(centreX - halfWidth, centreY + halfWidth / 2),\n    \t\t\t\t\t\tPoint(centreX + halfWidth, centreY + halfWidth / 2),\n    \t\t\t\t\t\tPoint(centreX, centreY - halfWidth + halfWidth / 2),\n\t\t\t\t\t\t};\n\t\t\t\t\t\tsurface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),\n                 \t\t\t\t\t\tcolourBG, colourBG);\n\t\t\t\t\t} else {            // Down arrow\n\t\t\t\t\t\tPoint pts[] = {\n    \t\t\t\t\t\tPoint(centreX - halfWidth, centreY - halfWidth / 2),\n    \t\t\t\t\t\tPoint(centreX + halfWidth, centreY - halfWidth / 2),\n    \t\t\t\t\t\tPoint(centreX, centreY + halfWidth - halfWidth / 2),\n\t\t\t\t\t\t};\n\t\t\t\t\t\tsurface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),\n                 \t\t\t\t\t\tcolourBG, colourBG);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\txEnd = rcClient.right;\n\t\t\t\toffsetMain = xEnd;\n\t\t\t\tif (upArrow) {\n\t\t\t\t\trectUp = rcClient;\n\t\t\t\t} else {\n\t\t\t\t\trectDown = rcClient;\n\t\t\t\t}\n\t\t\t} else if (IsTabCharacter(s[startSeg])) {\n\t\t\t\txEnd = NextTabPos(x);\n\t\t\t} else {\n\t\t\t\txEnd = x + surface->WidthText(font, s + startSeg, endSeg - startSeg);\n\t\t\t\tif (draw) {\n\t\t\t\t\trcClient.left = x;\n\t\t\t\t\trcClient.right = xEnd;\n\t\t\t\t\tsurface->DrawTextTransparent(rcClient, font, ytext,\n\t\t\t\t\t\t\t\t\t\ts+startSeg, endSeg - startSeg,\n\t\t\t\t\t                             highlight ? colourSel : colourUnSel);\n\t\t\t\t}\n\t\t\t}\n\t\t\tx = xEnd;\n\t\t\tstartSeg = endSeg;\n\t\t}\n\t}\n}\n\nint CallTip::PaintContents(Surface *surfaceWindow, bool draw) {\n\tPRectangle rcClientPos = wCallTip.GetClientPosition();\n\tPRectangle rcClientSize(0, 0, rcClientPos.right - rcClientPos.left,\n\t                        rcClientPos.bottom - rcClientPos.top);\n\tPRectangle rcClient(1, 1, rcClientSize.right - 1, rcClientSize.bottom - 1);\n\n\t// To make a nice small call tip window, it is only sized to fit most normal characters without accents\n\tint ascent = surfaceWindow->Ascent(font) - surfaceWindow->InternalLeading(font);\n\n\t// For each line...\n\t// Draw the definition in three parts: before highlight, highlighted, after highlight\n\tint ytext = rcClient.top + ascent + 1;\n\trcClient.bottom = ytext + surfaceWindow->Descent(font) + 1;\n\tconst char *chunkVal = val.c_str();\n\tbool moreChunks = true;\n\tint maxWidth = 0;\n\n\twhile (moreChunks) {\n\t\tconst char *chunkEnd = strchr(chunkVal, '\\n');\n\t\tif (chunkEnd == NULL) {\n\t\t\tchunkEnd = chunkVal + strlen(chunkVal);\n\t\t\tmoreChunks = false;\n\t\t}\n\t\tint chunkOffset = chunkVal - val.c_str();\n\t\tint chunkLength = chunkEnd - chunkVal;\n\t\tint chunkEndOffset = chunkOffset + chunkLength;\n\t\tint thisStartHighlight = Platform::Maximum(startHighlight, chunkOffset);\n\t\tthisStartHighlight = Platform::Minimum(thisStartHighlight, chunkEndOffset);\n\t\tthisStartHighlight -= chunkOffset;\n\t\tint thisEndHighlight = Platform::Maximum(endHighlight, chunkOffset);\n\t\tthisEndHighlight = Platform::Minimum(thisEndHighlight, chunkEndOffset);\n\t\tthisEndHighlight -= chunkOffset;\n\t\trcClient.top = ytext - ascent - 1;\n\n\t\tint x = insetX;     // start each line at this inset\n\n\t\tDrawChunk(surfaceWindow, x, chunkVal, 0, thisStartHighlight,\n\t\t\tytext, rcClient, false, draw);\n\t\tDrawChunk(surfaceWindow, x, chunkVal, thisStartHighlight, thisEndHighlight,\n\t\t\tytext, rcClient, true, draw);\n\t\tDrawChunk(surfaceWindow, x, chunkVal, thisEndHighlight, chunkLength,\n\t\t\tytext, rcClient, false, draw);\n\n\t\tchunkVal = chunkEnd + 1;\n\t\tytext += lineHeight;\n\t\trcClient.bottom += lineHeight;\n\t\tmaxWidth = Platform::Maximum(maxWidth, x);\n\t}\n\treturn maxWidth;\n}\n\nvoid CallTip::PaintCT(Surface *surfaceWindow) {\n\tif (val.empty())\n\t\treturn;\n\tPRectangle rcClientPos = wCallTip.GetClientPosition();\n\tPRectangle rcClientSize(0, 0, rcClientPos.right - rcClientPos.left,\n\t                        rcClientPos.bottom - rcClientPos.top);\n\tPRectangle rcClient(1, 1, rcClientSize.right - 1, rcClientSize.bottom - 1);\n\n\tsurfaceWindow->FillRectangle(rcClient, colourBG);\n\n\toffsetMain = insetX;    // initial alignment assuming no arrows\n\tPaintContents(surfaceWindow, true);\n\n#ifndef __APPLE__\n\t// OSX doesn't put borders on \"help tags\"\n\t// Draw a raised border around the edges of the window\n\tsurfaceWindow->MoveTo(0, rcClientSize.bottom - 1);\n\tsurfaceWindow->PenColour(colourShade);\n\tsurfaceWindow->LineTo(rcClientSize.right - 1, rcClientSize.bottom - 1);\n\tsurfaceWindow->LineTo(rcClientSize.right - 1, 0);\n\tsurfaceWindow->PenColour(colourLight);\n\tsurfaceWindow->LineTo(0, 0);\n\tsurfaceWindow->LineTo(0, rcClientSize.bottom - 1);\n#endif\n}\n\nvoid CallTip::MouseClick(Point pt) {\n\tclickPlace = 0;\n\tif (rectUp.Contains(pt))\n\t\tclickPlace = 1;\n\tif (rectDown.Contains(pt))\n\t\tclickPlace = 2;\n}\n\nPRectangle CallTip::CallTipStart(int pos, Point pt, int textHeight, const char *defn,\n                                 const char *faceName, int size,\n                                 int codePage_, int characterSet,\n\t\t\t\t\t\t\t\t int technology, Window &wParent) {\n\tclickPlace = 0;\n\tval = defn;\n\tcodePage = codePage_;\n\tSurface *surfaceMeasure = Surface::Allocate(technology);\n\tif (!surfaceMeasure)\n\t\treturn PRectangle();\n\tsurfaceMeasure->Init(wParent.GetID());\n\tsurfaceMeasure->SetUnicodeMode(SC_CP_UTF8 == codePage);\n\tsurfaceMeasure->SetDBCSMode(codePage);\n\tstartHighlight = 0;\n\tendHighlight = 0;\n\tinCallTipMode = true;\n\tposStartCallTip = pos;\n\tint deviceHeight = surfaceMeasure->DeviceHeightFont(size);\n\tFontParameters fp(faceName, deviceHeight / SC_FONT_SIZE_MULTIPLIER, SC_WEIGHT_NORMAL, false, 0, technology, characterSet);\n\tfont.Create(fp);\n\t// Look for multiple lines in the text\n\t// Only support \\n here - simply means container must avoid \\r!\n\tint numLines = 1;\n\tconst char *newline;\n\tconst char *look = val.c_str();\n\trectUp = PRectangle(0,0,0,0);\n\trectDown = PRectangle(0,0,0,0);\n\toffsetMain = insetX;            // changed to right edge of any arrows\n\tint width = PaintContents(surfaceMeasure, false) + insetX;\n\twhile ((newline = strchr(look, '\\n')) != NULL) {\n\t\tlook = newline + 1;\n\t\tnumLines++;\n\t}\n\tlineHeight = surfaceMeasure->Height(font);\n\n\t// The returned\n\t// rectangle is aligned to the right edge of the last arrow encountered in\n\t// the tip text, else to the tip text left edge.\n\tint height = lineHeight * numLines - surfaceMeasure->InternalLeading(font) + borderHeight * 2;\n\tdelete surfaceMeasure;\n\tif (above) {\n\t\treturn PRectangle(pt.x - offsetMain, pt.y - verticalOffset - height, pt.x + width - offsetMain, pt.y - verticalOffset);\n\t} else {\n\t\treturn PRectangle(pt.x - offsetMain, pt.y + verticalOffset + textHeight, pt.x + width - offsetMain, pt.y + verticalOffset + textHeight + height);\n\t}\n}\n\nvoid CallTip::CallTipCancel() {\n\tinCallTipMode = false;\n\tif (wCallTip.Created()) {\n\t\twCallTip.Destroy();\n\t}\n}\n\nvoid CallTip::SetHighlight(int start, int end) {\n\t// Avoid flashing by checking something has really changed\n\tif ((start != startHighlight) || (end != endHighlight)) {\n\t\tstartHighlight = start;\n\t\tendHighlight = (end > start) ? end : start;\n\t\tif (wCallTip.Created()) {\n\t\t\twCallTip.InvalidateAll();\n\t\t}\n\t}\n}\n\n// Set the tab size (sizes > 0 enable the use of tabs). This also enables the\n// use of the STYLE_CALLTIP.\nvoid CallTip::SetTabSize(int tabSz) {\n\ttabSize = tabSz;\n\tuseStyleCallTip = true;\n}\n\n// Set the calltip position, below the text by default or if above is false\n// else above the text.\nvoid CallTip::SetPosition(bool aboveText) {\n\tabove = aboveText;\n}\n\n// It might be better to have two access functions for this and to use\n// them for all settings of colours.\nvoid CallTip::SetForeBack(const ColourDesired &fore, const ColourDesired &back) {\n\tcolourBG = back;\n\tcolourUnSel = fore;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/CallTip.h",
    "content": "// Scintilla source code edit control\n/** @file CallTip.h\n ** Interface to the call tip control.\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef CALLTIP_H\n#define CALLTIP_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n/**\n */\nclass CallTip {\n\tint startHighlight;    // character offset to start and...\n\tint endHighlight;      // ...end of highlighted text\n\tstd::string val;\n\tFont font;\n\tPRectangle rectUp;      // rectangle of last up angle in the tip\n\tPRectangle rectDown;    // rectangle of last down arrow in the tip\n\tint lineHeight;         // vertical line spacing\n\tint offsetMain;         // The alignment point of the call tip\n\tint tabSize;            // Tab size in pixels, <=0 no TAB expand\n\tbool useStyleCallTip;   // if true, STYLE_CALLTIP should be used\n\tbool above;\t\t// if true, display calltip above text\n\n\t// Private so CallTip objects can not be copied\n\tCallTip(const CallTip &);\n\tCallTip &operator=(const CallTip &);\n\tvoid DrawChunk(Surface *surface, int &x, const char *s,\n\t\tint posStart, int posEnd, int ytext, PRectangle rcClient,\n\t\tbool highlight, bool draw);\n\tint PaintContents(Surface *surfaceWindow, bool draw);\n\tbool IsTabCharacter(char c) const;\n\tint NextTabPos(int x) const;\n\npublic:\n\tWindow wCallTip;\n\tWindow wDraw;\n\tbool inCallTipMode;\n\tint posStartCallTip;\n\tColourDesired colourBG;\n\tColourDesired colourUnSel;\n\tColourDesired colourSel;\n\tColourDesired colourShade;\n\tColourDesired colourLight;\n\tint codePage;\n\tint clickPlace;\n\n\tint insetX; // text inset in x from calltip border\n\tint widthArrow;\n\tint borderHeight;\n\tint verticalOffset; // pixel offset up or down of the calltip with respect to the line\n\n\tCallTip();\n\t~CallTip();\n\n\tvoid PaintCT(Surface *surfaceWindow);\n\n\tvoid MouseClick(Point pt);\n\n\t/// Setup the calltip and return a rectangle of the area required.\n\tPRectangle CallTipStart(int pos, Point pt, int textHeight, const char *defn,\n\t\tconst char *faceName, int size, int codePage_,\n\t\tint characterSet, int technology, Window &wParent);\n\n\tvoid CallTipCancel();\n\n\t/// Set a range of characters to be displayed in a highlight style.\n\t/// Commonly used to highlight the current parameter.\n\tvoid SetHighlight(int start, int end);\n\n\t/// Set the tab size in pixels for the call tip. 0 or -ve means no tab expand.\n\tvoid SetTabSize(int tabSz);\n\n\t/// Set calltip position.\n\tvoid SetPosition(bool aboveText);\n\n\t/// Used to determine which STYLE_xxxx to use for call tip information\n\tbool UseStyleCallTip() const { return useStyleCallTip;}\n\n\t// Modify foreground and background colours\n\tvoid SetForeBack(const ColourDesired &fore, const ColourDesired &back);\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/CaseConvert.cpp",
    "content": "// Scintilla source code edit control\n// Encoding: UTF-8\n/** @file CaseConvert.cxx\n ** Case fold characters and convert them to upper or lower case.\n ** Tables automatically regenerated by scripts/GenerateCaseConvert.py\n ** Should only be rarely regenerated for new versions of Unicode.\n **/\n// Copyright 2013 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <cstring>\n\n#include <vector>\n#include <algorithm>\n\n#include \"CaseConvert.h\"\n#include \"UniConversion.h\"\n#include \"UnicodeFromUTF8.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nnamespace {\n\t// Use an unnamed namespace to protect the declarations from name conflicts\n\n// Unicode code points are ordered by groups and follow patterns.\n// Most characters (pitch==1) are in ranges for a particular alphabet and their\n// upper case forms are a fixed distance away.\n// Another pattern (pitch==2) is where each lower case letter is preceded by\n// the upper case form. These are also grouped into ranges.\n\nint symmetricCaseConversionRanges[] = {\n//lower, upper, range length, range pitch\n//++Autogenerated -- start of section automatically generated\n//**\\(\\*\\n\\)\n97,65,26,1, \n224,192,23,1, \n248,216,7,1, \n257,256,24,2, \n314,313,8,2, \n331,330,23,2, \n462,461,8,2, \n479,478,9,2, \n505,504,20,2, \n547,546,9,2, \n583,582,5,2, \n945,913,17,1, \n963,931,9,1, \n985,984,12,2, \n1072,1040,32,1, \n1104,1024,16,1, \n1121,1120,17,2, \n1163,1162,27,2, \n1218,1217,7,2, \n1233,1232,44,2, \n1377,1329,38,1, \n7681,7680,75,2, \n7841,7840,48,2, \n7936,7944,8,1, \n7952,7960,6,1, \n7968,7976,8,1, \n7984,7992,8,1, \n8000,8008,6,1, \n8032,8040,8,1, \n8560,8544,16,1, \n9424,9398,26,1, \n11312,11264,47,1, \n11393,11392,50,2, \n11520,4256,38,1, \n42561,42560,23,2, \n42625,42624,12,2, \n42787,42786,7,2, \n42803,42802,31,2, \n42879,42878,5,2, \n42913,42912,5,2, \n65345,65313,26,1, \n66600,66560,40,1, \n\n//--Autogenerated -- end of section automatically generated\n};\n\n// Code points that are symmetric but don't fit into a range of similar characters\n// are listed here.\n\nint symmetricCaseConversions[] = {\n//lower, upper\n//++Autogenerated -- start of section automatically generated\n//**1 \\(\\*\\n\\)\n255,376, \n307,306, \n309,308, \n311,310, \n378,377, \n380,379, \n382,381, \n384,579, \n387,386, \n389,388, \n392,391, \n396,395, \n402,401, \n405,502, \n409,408, \n410,573, \n414,544, \n417,416, \n419,418, \n421,420, \n424,423, \n429,428, \n432,431, \n436,435, \n438,437, \n441,440, \n445,444, \n447,503, \n454,452, \n457,455, \n460,458, \n477,398, \n499,497, \n501,500, \n572,571, \n575,11390, \n576,11391, \n578,577, \n592,11375, \n593,11373, \n594,11376, \n595,385, \n596,390, \n598,393, \n599,394, \n601,399, \n603,400, \n608,403, \n611,404, \n613,42893, \n614,42922, \n616,407, \n617,406, \n619,11362, \n623,412, \n625,11374, \n626,413, \n629,415, \n637,11364, \n640,422, \n643,425, \n648,430, \n649,580, \n650,433, \n651,434, \n652,581, \n658,439, \n881,880, \n883,882, \n887,886, \n891,1021, \n892,1022, \n893,1023, \n940,902, \n941,904, \n942,905, \n943,906, \n972,908, \n973,910, \n974,911, \n983,975, \n1010,1017, \n1016,1015, \n1019,1018, \n1231,1216, \n7545,42877, \n7549,11363, \n8017,8025, \n8019,8027, \n8021,8029, \n8023,8031, \n8048,8122, \n8049,8123, \n8050,8136, \n8051,8137, \n8052,8138, \n8053,8139, \n8054,8154, \n8055,8155, \n8056,8184, \n8057,8185, \n8058,8170, \n8059,8171, \n8060,8186, \n8061,8187, \n8112,8120, \n8113,8121, \n8144,8152, \n8145,8153, \n8160,8168, \n8161,8169, \n8165,8172, \n8526,8498, \n8580,8579, \n11361,11360, \n11365,570, \n11366,574, \n11368,11367, \n11370,11369, \n11372,11371, \n11379,11378, \n11382,11381, \n11500,11499, \n11502,11501, \n11507,11506, \n11559,4295, \n11565,4301, \n42874,42873, \n42876,42875, \n42892,42891, \n42897,42896, \n42899,42898, \n\n//--Autogenerated -- end of section automatically generated\n};\n\n// Characters that have complex case conversions are listed here.\n// This includes cases where more than one character is needed for a conversion,\n// folding is different to lowering, or (as appropriate) upper(lower(x)) != x or\n// lower(upper(x)) != x.\n\nconst char *complexCaseConversions =\n// Original | Folded | Upper | Lower |\n//++Autogenerated -- start of section automatically generated\n//**2 \\(\\*\\n\\)\n\"\\xc2\\xb5|\\xce\\xbc|\\xce\\x9c||\"\n\"\\xc3\\x9f|ss|SS||\"\n\"\\xc4\\xb0|i\\xcc\\x87||i\\xcc\\x87|\"\n\"\\xc4\\xb1||I||\"\n\"\\xc5\\x89|\\xca\\xbcn|\\xca\\xbcN||\"\n\"\\xc5\\xbf|s|S||\"\n\"\\xc7\\x85|\\xc7\\x86|\\xc7\\x84|\\xc7\\x86|\"\n\"\\xc7\\x88|\\xc7\\x89|\\xc7\\x87|\\xc7\\x89|\"\n\"\\xc7\\x8b|\\xc7\\x8c|\\xc7\\x8a|\\xc7\\x8c|\"\n\"\\xc7\\xb0|j\\xcc\\x8c|J\\xcc\\x8c||\"\n\"\\xc7\\xb2|\\xc7\\xb3|\\xc7\\xb1|\\xc7\\xb3|\"\n\"\\xcd\\x85|\\xce\\xb9|\\xce\\x99||\"\n\"\\xce\\x90|\\xce\\xb9\\xcc\\x88\\xcc\\x81|\\xce\\x99\\xcc\\x88\\xcc\\x81||\"\n\"\\xce\\xb0|\\xcf\\x85\\xcc\\x88\\xcc\\x81|\\xce\\xa5\\xcc\\x88\\xcc\\x81||\"\n\"\\xcf\\x82|\\xcf\\x83|\\xce\\xa3||\"\n\"\\xcf\\x90|\\xce\\xb2|\\xce\\x92||\"\n\"\\xcf\\x91|\\xce\\xb8|\\xce\\x98||\"\n\"\\xcf\\x95|\\xcf\\x86|\\xce\\xa6||\"\n\"\\xcf\\x96|\\xcf\\x80|\\xce\\xa0||\"\n\"\\xcf\\xb0|\\xce\\xba|\\xce\\x9a||\"\n\"\\xcf\\xb1|\\xcf\\x81|\\xce\\xa1||\"\n\"\\xcf\\xb4|\\xce\\xb8||\\xce\\xb8|\"\n\"\\xcf\\xb5|\\xce\\xb5|\\xce\\x95||\"\n\"\\xd6\\x87|\\xd5\\xa5\\xd6\\x82|\\xd4\\xb5\\xd5\\x92||\"\n\"\\xe1\\xba\\x96|h\\xcc\\xb1|H\\xcc\\xb1||\"\n\"\\xe1\\xba\\x97|t\\xcc\\x88|T\\xcc\\x88||\"\n\"\\xe1\\xba\\x98|w\\xcc\\x8a|W\\xcc\\x8a||\"\n\"\\xe1\\xba\\x99|y\\xcc\\x8a|Y\\xcc\\x8a||\"\n\"\\xe1\\xba\\x9a|a\\xca\\xbe|A\\xca\\xbe||\"\n\"\\xe1\\xba\\x9b|\\xe1\\xb9\\xa1|\\xe1\\xb9\\xa0||\"\n\"\\xe1\\xba\\x9e|ss||\\xc3\\x9f|\"\n\"\\xe1\\xbd\\x90|\\xcf\\x85\\xcc\\x93|\\xce\\xa5\\xcc\\x93||\"\n\"\\xe1\\xbd\\x92|\\xcf\\x85\\xcc\\x93\\xcc\\x80|\\xce\\xa5\\xcc\\x93\\xcc\\x80||\"\n\"\\xe1\\xbd\\x94|\\xcf\\x85\\xcc\\x93\\xcc\\x81|\\xce\\xa5\\xcc\\x93\\xcc\\x81||\"\n\"\\xe1\\xbd\\x96|\\xcf\\x85\\xcc\\x93\\xcd\\x82|\\xce\\xa5\\xcc\\x93\\xcd\\x82||\"\n\"\\xe1\\xbe\\x80|\\xe1\\xbc\\x80\\xce\\xb9|\\xe1\\xbc\\x88\\xce\\x99||\"\n\"\\xe1\\xbe\\x81|\\xe1\\xbc\\x81\\xce\\xb9|\\xe1\\xbc\\x89\\xce\\x99||\"\n\"\\xe1\\xbe\\x82|\\xe1\\xbc\\x82\\xce\\xb9|\\xe1\\xbc\\x8a\\xce\\x99||\"\n\"\\xe1\\xbe\\x83|\\xe1\\xbc\\x83\\xce\\xb9|\\xe1\\xbc\\x8b\\xce\\x99||\"\n\"\\xe1\\xbe\\x84|\\xe1\\xbc\\x84\\xce\\xb9|\\xe1\\xbc\\x8c\\xce\\x99||\"\n\"\\xe1\\xbe\\x85|\\xe1\\xbc\\x85\\xce\\xb9|\\xe1\\xbc\\x8d\\xce\\x99||\"\n\"\\xe1\\xbe\\x86|\\xe1\\xbc\\x86\\xce\\xb9|\\xe1\\xbc\\x8e\\xce\\x99||\"\n\"\\xe1\\xbe\\x87|\\xe1\\xbc\\x87\\xce\\xb9|\\xe1\\xbc\\x8f\\xce\\x99||\"\n\"\\xe1\\xbe\\x88|\\xe1\\xbc\\x80\\xce\\xb9|\\xe1\\xbc\\x88\\xce\\x99|\\xe1\\xbe\\x80|\"\n\"\\xe1\\xbe\\x89|\\xe1\\xbc\\x81\\xce\\xb9|\\xe1\\xbc\\x89\\xce\\x99|\\xe1\\xbe\\x81|\"\n\"\\xe1\\xbe\\x8a|\\xe1\\xbc\\x82\\xce\\xb9|\\xe1\\xbc\\x8a\\xce\\x99|\\xe1\\xbe\\x82|\"\n\"\\xe1\\xbe\\x8b|\\xe1\\xbc\\x83\\xce\\xb9|\\xe1\\xbc\\x8b\\xce\\x99|\\xe1\\xbe\\x83|\"\n\"\\xe1\\xbe\\x8c|\\xe1\\xbc\\x84\\xce\\xb9|\\xe1\\xbc\\x8c\\xce\\x99|\\xe1\\xbe\\x84|\"\n\"\\xe1\\xbe\\x8d|\\xe1\\xbc\\x85\\xce\\xb9|\\xe1\\xbc\\x8d\\xce\\x99|\\xe1\\xbe\\x85|\"\n\"\\xe1\\xbe\\x8e|\\xe1\\xbc\\x86\\xce\\xb9|\\xe1\\xbc\\x8e\\xce\\x99|\\xe1\\xbe\\x86|\"\n\"\\xe1\\xbe\\x8f|\\xe1\\xbc\\x87\\xce\\xb9|\\xe1\\xbc\\x8f\\xce\\x99|\\xe1\\xbe\\x87|\"\n\"\\xe1\\xbe\\x90|\\xe1\\xbc\\xa0\\xce\\xb9|\\xe1\\xbc\\xa8\\xce\\x99||\"\n\"\\xe1\\xbe\\x91|\\xe1\\xbc\\xa1\\xce\\xb9|\\xe1\\xbc\\xa9\\xce\\x99||\"\n\"\\xe1\\xbe\\x92|\\xe1\\xbc\\xa2\\xce\\xb9|\\xe1\\xbc\\xaa\\xce\\x99||\"\n\"\\xe1\\xbe\\x93|\\xe1\\xbc\\xa3\\xce\\xb9|\\xe1\\xbc\\xab\\xce\\x99||\"\n\"\\xe1\\xbe\\x94|\\xe1\\xbc\\xa4\\xce\\xb9|\\xe1\\xbc\\xac\\xce\\x99||\"\n\"\\xe1\\xbe\\x95|\\xe1\\xbc\\xa5\\xce\\xb9|\\xe1\\xbc\\xad\\xce\\x99||\"\n\"\\xe1\\xbe\\x96|\\xe1\\xbc\\xa6\\xce\\xb9|\\xe1\\xbc\\xae\\xce\\x99||\"\n\"\\xe1\\xbe\\x97|\\xe1\\xbc\\xa7\\xce\\xb9|\\xe1\\xbc\\xaf\\xce\\x99||\"\n\"\\xe1\\xbe\\x98|\\xe1\\xbc\\xa0\\xce\\xb9|\\xe1\\xbc\\xa8\\xce\\x99|\\xe1\\xbe\\x90|\"\n\"\\xe1\\xbe\\x99|\\xe1\\xbc\\xa1\\xce\\xb9|\\xe1\\xbc\\xa9\\xce\\x99|\\xe1\\xbe\\x91|\"\n\"\\xe1\\xbe\\x9a|\\xe1\\xbc\\xa2\\xce\\xb9|\\xe1\\xbc\\xaa\\xce\\x99|\\xe1\\xbe\\x92|\"\n\"\\xe1\\xbe\\x9b|\\xe1\\xbc\\xa3\\xce\\xb9|\\xe1\\xbc\\xab\\xce\\x99|\\xe1\\xbe\\x93|\"\n\"\\xe1\\xbe\\x9c|\\xe1\\xbc\\xa4\\xce\\xb9|\\xe1\\xbc\\xac\\xce\\x99|\\xe1\\xbe\\x94|\"\n\"\\xe1\\xbe\\x9d|\\xe1\\xbc\\xa5\\xce\\xb9|\\xe1\\xbc\\xad\\xce\\x99|\\xe1\\xbe\\x95|\"\n\"\\xe1\\xbe\\x9e|\\xe1\\xbc\\xa6\\xce\\xb9|\\xe1\\xbc\\xae\\xce\\x99|\\xe1\\xbe\\x96|\"\n\"\\xe1\\xbe\\x9f|\\xe1\\xbc\\xa7\\xce\\xb9|\\xe1\\xbc\\xaf\\xce\\x99|\\xe1\\xbe\\x97|\"\n\"\\xe1\\xbe\\xa0|\\xe1\\xbd\\xa0\\xce\\xb9|\\xe1\\xbd\\xa8\\xce\\x99||\"\n\"\\xe1\\xbe\\xa1|\\xe1\\xbd\\xa1\\xce\\xb9|\\xe1\\xbd\\xa9\\xce\\x99||\"\n\"\\xe1\\xbe\\xa2|\\xe1\\xbd\\xa2\\xce\\xb9|\\xe1\\xbd\\xaa\\xce\\x99||\"\n\"\\xe1\\xbe\\xa3|\\xe1\\xbd\\xa3\\xce\\xb9|\\xe1\\xbd\\xab\\xce\\x99||\"\n\"\\xe1\\xbe\\xa4|\\xe1\\xbd\\xa4\\xce\\xb9|\\xe1\\xbd\\xac\\xce\\x99||\"\n\"\\xe1\\xbe\\xa5|\\xe1\\xbd\\xa5\\xce\\xb9|\\xe1\\xbd\\xad\\xce\\x99||\"\n\"\\xe1\\xbe\\xa6|\\xe1\\xbd\\xa6\\xce\\xb9|\\xe1\\xbd\\xae\\xce\\x99||\"\n\"\\xe1\\xbe\\xa7|\\xe1\\xbd\\xa7\\xce\\xb9|\\xe1\\xbd\\xaf\\xce\\x99||\"\n\"\\xe1\\xbe\\xa8|\\xe1\\xbd\\xa0\\xce\\xb9|\\xe1\\xbd\\xa8\\xce\\x99|\\xe1\\xbe\\xa0|\"\n\"\\xe1\\xbe\\xa9|\\xe1\\xbd\\xa1\\xce\\xb9|\\xe1\\xbd\\xa9\\xce\\x99|\\xe1\\xbe\\xa1|\"\n\"\\xe1\\xbe\\xaa|\\xe1\\xbd\\xa2\\xce\\xb9|\\xe1\\xbd\\xaa\\xce\\x99|\\xe1\\xbe\\xa2|\"\n\"\\xe1\\xbe\\xab|\\xe1\\xbd\\xa3\\xce\\xb9|\\xe1\\xbd\\xab\\xce\\x99|\\xe1\\xbe\\xa3|\"\n\"\\xe1\\xbe\\xac|\\xe1\\xbd\\xa4\\xce\\xb9|\\xe1\\xbd\\xac\\xce\\x99|\\xe1\\xbe\\xa4|\"\n\"\\xe1\\xbe\\xad|\\xe1\\xbd\\xa5\\xce\\xb9|\\xe1\\xbd\\xad\\xce\\x99|\\xe1\\xbe\\xa5|\"\n\"\\xe1\\xbe\\xae|\\xe1\\xbd\\xa6\\xce\\xb9|\\xe1\\xbd\\xae\\xce\\x99|\\xe1\\xbe\\xa6|\"\n\"\\xe1\\xbe\\xaf|\\xe1\\xbd\\xa7\\xce\\xb9|\\xe1\\xbd\\xaf\\xce\\x99|\\xe1\\xbe\\xa7|\"\n\"\\xe1\\xbe\\xb2|\\xe1\\xbd\\xb0\\xce\\xb9|\\xe1\\xbe\\xba\\xce\\x99||\"\n\"\\xe1\\xbe\\xb3|\\xce\\xb1\\xce\\xb9|\\xce\\x91\\xce\\x99||\"\n\"\\xe1\\xbe\\xb4|\\xce\\xac\\xce\\xb9|\\xce\\x86\\xce\\x99||\"\n\"\\xe1\\xbe\\xb6|\\xce\\xb1\\xcd\\x82|\\xce\\x91\\xcd\\x82||\"\n\"\\xe1\\xbe\\xb7|\\xce\\xb1\\xcd\\x82\\xce\\xb9|\\xce\\x91\\xcd\\x82\\xce\\x99||\"\n\"\\xe1\\xbe\\xbc|\\xce\\xb1\\xce\\xb9|\\xce\\x91\\xce\\x99|\\xe1\\xbe\\xb3|\"\n\"\\xe1\\xbe\\xbe|\\xce\\xb9|\\xce\\x99||\"\n\"\\xe1\\xbf\\x82|\\xe1\\xbd\\xb4\\xce\\xb9|\\xe1\\xbf\\x8a\\xce\\x99||\"\n\"\\xe1\\xbf\\x83|\\xce\\xb7\\xce\\xb9|\\xce\\x97\\xce\\x99||\"\n\"\\xe1\\xbf\\x84|\\xce\\xae\\xce\\xb9|\\xce\\x89\\xce\\x99||\"\n\"\\xe1\\xbf\\x86|\\xce\\xb7\\xcd\\x82|\\xce\\x97\\xcd\\x82||\"\n\"\\xe1\\xbf\\x87|\\xce\\xb7\\xcd\\x82\\xce\\xb9|\\xce\\x97\\xcd\\x82\\xce\\x99||\"\n\"\\xe1\\xbf\\x8c|\\xce\\xb7\\xce\\xb9|\\xce\\x97\\xce\\x99|\\xe1\\xbf\\x83|\"\n\"\\xe1\\xbf\\x92|\\xce\\xb9\\xcc\\x88\\xcc\\x80|\\xce\\x99\\xcc\\x88\\xcc\\x80||\"\n\"\\xe1\\xbf\\x93|\\xce\\xb9\\xcc\\x88\\xcc\\x81|\\xce\\x99\\xcc\\x88\\xcc\\x81||\"\n\"\\xe1\\xbf\\x96|\\xce\\xb9\\xcd\\x82|\\xce\\x99\\xcd\\x82||\"\n\"\\xe1\\xbf\\x97|\\xce\\xb9\\xcc\\x88\\xcd\\x82|\\xce\\x99\\xcc\\x88\\xcd\\x82||\"\n\"\\xe1\\xbf\\xa2|\\xcf\\x85\\xcc\\x88\\xcc\\x80|\\xce\\xa5\\xcc\\x88\\xcc\\x80||\"\n\"\\xe1\\xbf\\xa3|\\xcf\\x85\\xcc\\x88\\xcc\\x81|\\xce\\xa5\\xcc\\x88\\xcc\\x81||\"\n\"\\xe1\\xbf\\xa4|\\xcf\\x81\\xcc\\x93|\\xce\\xa1\\xcc\\x93||\"\n\"\\xe1\\xbf\\xa6|\\xcf\\x85\\xcd\\x82|\\xce\\xa5\\xcd\\x82||\"\n\"\\xe1\\xbf\\xa7|\\xcf\\x85\\xcc\\x88\\xcd\\x82|\\xce\\xa5\\xcc\\x88\\xcd\\x82||\"\n\"\\xe1\\xbf\\xb2|\\xe1\\xbd\\xbc\\xce\\xb9|\\xe1\\xbf\\xba\\xce\\x99||\"\n\"\\xe1\\xbf\\xb3|\\xcf\\x89\\xce\\xb9|\\xce\\xa9\\xce\\x99||\"\n\"\\xe1\\xbf\\xb4|\\xcf\\x8e\\xce\\xb9|\\xce\\x8f\\xce\\x99||\"\n\"\\xe1\\xbf\\xb6|\\xcf\\x89\\xcd\\x82|\\xce\\xa9\\xcd\\x82||\"\n\"\\xe1\\xbf\\xb7|\\xcf\\x89\\xcd\\x82\\xce\\xb9|\\xce\\xa9\\xcd\\x82\\xce\\x99||\"\n\"\\xe1\\xbf\\xbc|\\xcf\\x89\\xce\\xb9|\\xce\\xa9\\xce\\x99|\\xe1\\xbf\\xb3|\"\n\"\\xe2\\x84\\xa6|\\xcf\\x89||\\xcf\\x89|\"\n\"\\xe2\\x84\\xaa|k||k|\"\n\"\\xe2\\x84\\xab|\\xc3\\xa5||\\xc3\\xa5|\"\n\"\\xef\\xac\\x80|ff|FF||\"\n\"\\xef\\xac\\x81|fi|FI||\"\n\"\\xef\\xac\\x82|fl|FL||\"\n\"\\xef\\xac\\x83|ffi|FFI||\"\n\"\\xef\\xac\\x84|ffl|FFL||\"\n\"\\xef\\xac\\x85|st|ST||\"\n\"\\xef\\xac\\x86|st|ST||\"\n\"\\xef\\xac\\x93|\\xd5\\xb4\\xd5\\xb6|\\xd5\\x84\\xd5\\x86||\"\n\"\\xef\\xac\\x94|\\xd5\\xb4\\xd5\\xa5|\\xd5\\x84\\xd4\\xb5||\"\n\"\\xef\\xac\\x95|\\xd5\\xb4\\xd5\\xab|\\xd5\\x84\\xd4\\xbb||\"\n\"\\xef\\xac\\x96|\\xd5\\xbe\\xd5\\xb6|\\xd5\\x8e\\xd5\\x86||\"\n\"\\xef\\xac\\x97|\\xd5\\xb4\\xd5\\xad|\\xd5\\x84\\xd4\\xbd||\"\n\n//--Autogenerated -- end of section automatically generated\n;\n\nclass CaseConverter : public ICaseConverter {\n\t// Maximum length of a case conversion result is 6 bytes in UTF-8\n\tenum { maxConversionLength=6 };\n\tstruct ConversionString {\n\t\tchar conversion[maxConversionLength+1];\n\t};\n\t// Conversions are initially store in a vector of structs but then decomposed into\n\t// parallel arrays as that is about 10% faster to search.\n\tstruct CharacterConversion {\n\t\tint character;\n\t\tConversionString conversion;\n\t\tCharacterConversion(int character_=0, const char *conversion_=\"\") : character(character_) {\n\t\t\tstrcpy(conversion.conversion, conversion_);\n\t\t}\n\t\tbool operator<(const CharacterConversion &other) const {\n\t\t\treturn character < other.character;\n\t\t}\n\t};\n\ttypedef std::vector<CharacterConversion> CharacterToConversion;\n\tCharacterToConversion characterToConversion;\n\t// The parallel arrays\n\tstd::vector<int> characters;\n\tstd::vector<ConversionString> conversions;\n\npublic:\n\tCaseConverter() {\n\t}\n\tbool Initialised() const {\n\t\treturn characters.size() > 0;\n\t}\n\tvoid Add(int character, const char *conversion) {\n\t\tcharacterToConversion.push_back(CharacterConversion(character, conversion));\n\t}\n\tconst char *Find(int character) {\n\t\tconst std::vector<int>::iterator it = std::lower_bound(characters.begin(), characters.end(), character);\n\t\tif (it == characters.end())\n\t\t\treturn 0;\n\t\telse if (*it == character)\n\t\t\treturn conversions[it - characters.begin()].conversion;\n\t\telse\n\t\t\treturn 0;\n\t}\n\tsize_t CaseConvertString(char *converted, size_t sizeConverted, const char *mixed, size_t lenMixed) {\n\t\tsize_t lenConverted = 0;\n\t\tsize_t mixedPos = 0;\n\t\tunsigned char bytes[UTF8MaxBytes + 1];\n\t\twhile (mixedPos < lenMixed) {\n\t\t\tconst unsigned char leadByte = static_cast<unsigned char>(mixed[mixedPos]);\n\t\t\tconst char *caseConverted = 0;\n\t\t\tsize_t lenMixedChar = 1;\n\t\t\tif (UTF8IsAscii(leadByte)) {\n\t\t\t\tcaseConverted = Find(leadByte);\n\t\t\t} else {\n\t\t\t\tbytes[0] = leadByte;\n\t\t\t\tconst int widthCharBytes = UTF8BytesOfLead[leadByte];\n\t\t\t\tfor (int b=1; b<widthCharBytes; b++) {\n\t\t\t\t\tbytes[b] = (mixedPos+b < lenMixed) ? mixed[mixedPos+b] : 0;\n\t\t\t\t}\n\t\t\t\tint classified = UTF8Classify(bytes, widthCharBytes);\n\t\t\t\tif (!(classified & UTF8MaskInvalid)) {\n\t\t\t\t\t// valid UTF-8\n\t\t\t\t\tlenMixedChar = classified & UTF8MaskWidth;\n\t\t\t\t\tint character = UnicodeFromUTF8(bytes);\n\t\t\t\t\tcaseConverted = Find(character);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (caseConverted) {\n\t\t\t\t// Character has a conversion so copy that conversion in\n\t\t\t\twhile (*caseConverted) {\n\t\t\t\t\tconverted[lenConverted++] = *caseConverted++;\n\t\t\t\t\tif (lenConverted >= sizeConverted)\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Character has no conversion so copy the input to output\n\t\t\t\tfor (size_t i=0; i<lenMixedChar; i++) {\n\t\t\t\t\tconverted[lenConverted++] = mixed[mixedPos+i];\n\t\t\t\t\tif (lenConverted >= sizeConverted)\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tmixedPos += lenMixedChar;\n\t\t}\n\t\treturn lenConverted;\n\t}\n\tvoid FinishedAdding() {\n\t\tstd::sort(characterToConversion.begin(), characterToConversion.end());\n\t\tcharacters.reserve(characterToConversion.size());\n\t\tconversions.reserve(characterToConversion.size());\n\t\tfor (CharacterToConversion::iterator it = characterToConversion.begin(); it != characterToConversion.end(); ++it) {\n\t\t\tcharacters.push_back(it->character);\n\t\t\tconversions.push_back(it->conversion);\n\t\t}\n\t\t// Empty the original calculated data completely\n\t\tCharacterToConversion().swap(characterToConversion);\n\t}\n};\n\nCaseConverter caseConvFold;\nCaseConverter caseConvUp;\nCaseConverter caseConvLow;\n\nvoid UTF8FromUTF32Character(int uch, char *putf) {\n\tsize_t k = 0;\n\tif (uch < 0x80) {\n\t\tputf[k++] = static_cast<char>(uch);\n\t} else if (uch < 0x800) {\n\t\tputf[k++] = static_cast<char>(0xC0 | (uch >> 6));\n\t\tputf[k++] = static_cast<char>(0x80 | (uch & 0x3f));\n\t} else if (uch < 0x10000) {\n\t\tputf[k++] = static_cast<char>(0xE0 | (uch >> 12));\n\t\tputf[k++] = static_cast<char>(0x80 | ((uch >> 6) & 0x3f));\n\t\tputf[k++] = static_cast<char>(0x80 | (uch & 0x3f));\n\t} else {\n\t\tputf[k++] = static_cast<char>(0xF0 | (uch >> 18));\n\t\tputf[k++] = static_cast<char>(0x80 | ((uch >> 12) & 0x3f));\n\t\tputf[k++] = static_cast<char>(0x80 | ((uch >> 6) & 0x3f));\n\t\tputf[k++] = static_cast<char>(0x80 | (uch & 0x3f));\n\t}\n\tputf[k] = 0;\n}\n\nvoid AddSymmetric(enum CaseConversion conversion, int lower,int upper) {\n\tchar lowerUTF8[UTF8MaxBytes+1];\n\tUTF8FromUTF32Character(lower, lowerUTF8);\n\tchar upperUTF8[UTF8MaxBytes+1];\n\tUTF8FromUTF32Character(upper, upperUTF8);\n\n\tswitch (conversion) {\n\tcase CaseConversionFold:\n\t\tcaseConvFold.Add(upper, lowerUTF8);\n\t\tbreak;\n\tcase CaseConversionUpper:\n\t\tcaseConvUp.Add(lower, upperUTF8);\n\t\tbreak;\n\tcase CaseConversionLower:\n\t\tcaseConvLow.Add(upper, lowerUTF8);\n\t\tbreak;\n\t}\n}\n\nvoid SetupConversions(enum CaseConversion conversion) {\n\t// First initialize for the symmetric ranges\n\tfor (size_t i=0; i<sizeof(symmetricCaseConversionRanges)/sizeof(symmetricCaseConversionRanges[0]);) {\n\t\tint lower = symmetricCaseConversionRanges[i++];\n\t\tint upper = symmetricCaseConversionRanges[i++];\n\t\tint length = symmetricCaseConversionRanges[i++];\n\t\tint pitch = symmetricCaseConversionRanges[i++];\n\t\tfor (int j=0;j<length*pitch;j+=pitch) {\n\t\t\tAddSymmetric(conversion, lower+j, upper+j);\n\t\t}\n\t}\n\t// Add the symmetric singletons\n\tfor (size_t i=0; i<sizeof(symmetricCaseConversions)/sizeof(symmetricCaseConversions[0]);) {\n\t\tint lower = symmetricCaseConversions[i++];\n\t\tint upper = symmetricCaseConversions[i++];\n\t\tAddSymmetric(conversion, lower, upper);\n\t}\n\t// Add the complex cases\n\tconst char *sComplex = complexCaseConversions;\n\twhile (*sComplex) {\n\t\t// Longest ligature is 3 character so 5 for safety\n\t\tconst size_t lenUTF8 = 5*UTF8MaxBytes+1;\n\t\tchar originUTF8[lenUTF8];\n\t\tchar foldedUTF8[lenUTF8];\n\t\tchar lowerUTF8[lenUTF8];\n\t\tchar upperUTF8[lenUTF8];\n\t\tsize_t i = 0;\n\t\twhile (*sComplex && *sComplex != '|') {\n\t\t\toriginUTF8[i++] = *sComplex;\n\t\t\tsComplex++;\n\t\t}\n\t\tsComplex++;\n\t\toriginUTF8[i] = 0;\n\t\ti = 0;\n\t\twhile (*sComplex && *sComplex != '|') {\n\t\t\tfoldedUTF8[i++] = *sComplex;\n\t\t\tsComplex++;\n\t\t}\n\t\tsComplex++;\n\t\tfoldedUTF8[i] = 0;\n\t\ti = 0;\n\t\twhile (*sComplex && *sComplex != '|') {\n\t\t\tupperUTF8[i++] = *sComplex;\n\t\t\tsComplex++;\n\t\t}\n\t\tsComplex++;\n\t\tupperUTF8[i] = 0;\n\t\ti = 0;\n\t\twhile (*sComplex && *sComplex != '|') {\n\t\t\tlowerUTF8[i++] = *sComplex;\n\t\t\tsComplex++;\n\t\t}\n\t\tsComplex++;\n\t\tlowerUTF8[i] = 0;\n\n\t\tint character = UnicodeFromUTF8(reinterpret_cast<unsigned char *>(originUTF8));\n\n\t\tif (conversion == CaseConversionFold && foldedUTF8[0]) {\n\t\t\tcaseConvFold.Add(character, foldedUTF8);\n\t\t}\n\n\t\tif (conversion == CaseConversionUpper && upperUTF8[0]) {\n\t\t\tcaseConvUp.Add(character, upperUTF8);\n\t\t}\n\n\t\tif (conversion == CaseConversionLower && lowerUTF8[0]) {\n\t\t\tcaseConvLow.Add(character, lowerUTF8);\n\t\t}\n\t}\n\n\tswitch (conversion) {\n\tcase CaseConversionFold:\n\t\tcaseConvFold.FinishedAdding();\n\t\tbreak;\n\tcase CaseConversionUpper:\n\t\tcaseConvUp.FinishedAdding();\n\t\tbreak;\n\tcase CaseConversionLower:\n\t\tcaseConvLow.FinishedAdding();\n\t\tbreak;\n\t}\n}\n\nCaseConverter *ConverterForConversion(enum CaseConversion conversion) {\n\tswitch (conversion) {\n\tcase CaseConversionFold:\n\t\treturn &caseConvFold;\n\tcase CaseConversionUpper:\n\t\treturn &caseConvUp;\n\tcase CaseConversionLower:\n\t\treturn &caseConvLow;\n\t}\n\treturn 0;\n}\n\n}\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nICaseConverter *ConverterFor(enum CaseConversion conversion) {\n\tCaseConverter *pCaseConv = ConverterForConversion(conversion);\n\tif (!pCaseConv->Initialised())\n\t\tSetupConversions(conversion);\n\treturn pCaseConv;\n}\n\nconst char *CaseConvert(int character, enum CaseConversion conversion) {\n\tCaseConverter *pCaseConv = ConverterForConversion(conversion);\n\tif (!pCaseConv->Initialised())\n\t\tSetupConversions(conversion);\n\treturn pCaseConv->Find(character);\n}\n\nsize_t CaseConvertString(char *converted, size_t sizeConverted, const char *mixed, size_t lenMixed, enum CaseConversion conversion) {\n\tCaseConverter *pCaseConv = ConverterForConversion(conversion);\n\tif (!pCaseConv->Initialised())\n\t\tSetupConversions(conversion);\n\treturn pCaseConv->CaseConvertString(converted, sizeConverted, mixed, lenMixed);\n}\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/CaseConvert.h",
    "content": "// Scintilla source code edit control\n// Encoding: UTF-8\n/** @file CaseConvert.h\n ** Performs Unicode case conversions.\n ** Does not handle locale-sensitive case conversion.\n **/\n// Copyright 2013 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef CASECONVERT_H\n#define CASECONVERT_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nenum CaseConversion {\n\tCaseConversionFold,\n\tCaseConversionUpper,\n\tCaseConversionLower\n};\n\nclass ICaseConverter {\npublic:\n\tvirtual size_t CaseConvertString(char *converted, size_t sizeConverted, const char *mixed, size_t lenMixed) = 0;\n};\n\nICaseConverter *ConverterFor(enum CaseConversion conversion);\n\n// Returns a UTF-8 string. Empty when no conversion\nconst char *CaseConvert(int character, enum CaseConversion conversion);\n\n// When performing CaseConvertString, the converted value may be up to 3 times longer than the input.\n// Ligatures are often decomposed into multiple characters and long cases include:\n// ΐ \"\\xce\\x90\" folds to ΐ \"\\xce\\xb9\\xcc\\x88\\xcc\\x81\"\nconst int maxExpansionCaseConversion=3;\n\n// Converts a mixed case string using a particular conversion.\n// Result may be a different length to input and the length is the return value.\n// If there is not enough space then 0 is returned.\nsize_t CaseConvertString(char *converted, size_t sizeConverted, const char *mixed, size_t lenMixed, enum CaseConversion conversion);\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/CaseFolder.cpp",
    "content": "// Scintilla source code edit control\n/** @file CaseFolder.cxx\n ** Classes for case folding.\n **/\n// Copyright 1998-2013 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <vector>\n#include <algorithm>\n\n#include \"CaseConvert.h\"\n#include \"UniConversion.h\"\n#include \"CaseFolder.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nCaseFolder::~CaseFolder() {\n}\n\nCaseFolderTable::CaseFolderTable() {\n\tfor (size_t iChar=0; iChar<sizeof(mapping); iChar++) {\n\t\tmapping[iChar] = static_cast<char>(iChar);\n\t}\n}\n\nCaseFolderTable::~CaseFolderTable() {\n}\n\nsize_t CaseFolderTable::Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) {\n\tif (lenMixed > sizeFolded) {\n\t\treturn 0;\n\t} else {\n\t\tfor (size_t i=0; i<lenMixed; i++) {\n\t\t\tfolded[i] = mapping[static_cast<unsigned char>(mixed[i])];\n\t\t}\n\t\treturn lenMixed;\n\t}\n}\n\nvoid CaseFolderTable::SetTranslation(char ch, char chTranslation) {\n\tmapping[static_cast<unsigned char>(ch)] = chTranslation;\n}\n\nvoid CaseFolderTable::StandardASCII() {\n\tfor (size_t iChar=0; iChar<sizeof(mapping); iChar++) {\n\t\tif (iChar >= 'A' && iChar <= 'Z') {\n\t\t\tmapping[iChar] = static_cast<char>(iChar - 'A' + 'a');\n\t\t} else {\n\t\t\tmapping[iChar] = static_cast<char>(iChar);\n\t\t}\n\t}\n}\n\nCaseFolderUnicode::CaseFolderUnicode() {\n\tStandardASCII();\n\tconverter = ConverterFor(CaseConversionFold);\n}\n\nsize_t CaseFolderUnicode::Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) {\n\tif ((lenMixed == 1) && (sizeFolded > 0)) {\n\t\tfolded[0] = mapping[static_cast<unsigned char>(mixed[0])];\n\t\treturn 1;\n\t} else {\n\t\treturn converter->CaseConvertString(folded, sizeFolded, mixed, lenMixed);\n\t}\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/CaseFolder.h",
    "content": "// Scintilla source code edit control\n/** @file CaseFolder.h\n ** Classes for case folding.\n **/\n// Copyright 1998-2013 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef CASEFOLDER_H\n#define CASEFOLDER_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nclass CaseFolder {\npublic:\n\tvirtual ~CaseFolder();\n\tvirtual size_t Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) = 0;\n};\n\nclass CaseFolderTable : public CaseFolder {\nprotected:\n\tchar mapping[256];\npublic:\n\tCaseFolderTable();\n\tvirtual ~CaseFolderTable();\n\tvirtual size_t Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed);\n\tvoid SetTranslation(char ch, char chTranslation);\n\tvoid StandardASCII();\n};\n\nclass ICaseConverter;\n\nclass CaseFolderUnicode : public CaseFolderTable {\n\tICaseConverter *converter;\npublic:\n\tCaseFolderUnicode();\n\tvirtual size_t Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed);\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/Catalogue.cpp",
    "content": "// Scintilla source code edit control\n/** @file Catalogue.cxx\n ** Colourise for particular languages.\n **/\n// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <stdarg.h>\n#include <assert.h>\n\n#include <vector>\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"LexerModule.h\"\n#include \"Catalogue.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic std::vector<LexerModule *> lexerCatalogue;\nstatic int nextLanguage = SCLEX_AUTOMATIC+1;\n\nconst LexerModule *Catalogue::Find(int language) {\n\tScintilla_LinkLexers();\n\tfor (std::vector<LexerModule *>::iterator it=lexerCatalogue.begin();\n\t\tit != lexerCatalogue.end(); ++it) {\n\t\tif ((*it)->GetLanguage() == language) {\n\t\t\treturn *it;\n\t\t}\n\t}\n\treturn 0;\n}\n\nconst LexerModule *Catalogue::Find(const char *languageName) {\n\tScintilla_LinkLexers();\n\tif (languageName) {\n\t\tfor (std::vector<LexerModule *>::iterator it=lexerCatalogue.begin();\n\t\t\tit != lexerCatalogue.end(); ++it) {\n\t\t\tif ((*it)->languageName && (0 == strcmp((*it)->languageName, languageName))) {\n\t\t\t\treturn *it;\n\t\t\t}\n\t\t}\n\t}\n\treturn 0;\n}\n\nvoid Catalogue::AddLexerModule(LexerModule *plm) {\n\tif (plm->GetLanguage() == SCLEX_AUTOMATIC) {\n\t\tplm->language = nextLanguage;\n\t\tnextLanguage++;\n\t}\n\tlexerCatalogue.push_back(plm);\n}\n\n// To add or remove a lexer, add or remove its file and run LexGen.py.\n\n// Force a reference to all of the Scintilla lexers so that the linker will\n// not remove the code of the lexers.\nint Scintilla_LinkLexers() {\n\n\tstatic int initialised = 0;\n\tif (initialised)\n\t\treturn 0;\n\tinitialised = 1;\n\n// Shorten the code that declares a lexer and ensures it is linked in by calling a method.\n#define LINK_LEXER(lexer) extern LexerModule lexer; Catalogue::AddLexerModule(&lexer);\n\n//++Autogenerated -- run scripts/LexGen.py to regenerate\n//**\\(\\tLINK_LEXER(\\*);\\n\\)\n//\tLINK_LEXER(lmA68k);\n//\tLINK_LEXER(lmAbaqus);\n//\tLINK_LEXER(lmAda);\n//\tLINK_LEXER(lmAPDL);\n//\tLINK_LEXER(lmAsm);\n//\tLINK_LEXER(lmAsn1);\n//\tLINK_LEXER(lmASY);\n//\tLINK_LEXER(lmAU3);\n//\tLINK_LEXER(lmAVE);\n//\tLINK_LEXER(lmAVS);\n//\tLINK_LEXER(lmBaan);\n//\tLINK_LEXER(lmBash);\n//\tLINK_LEXER(lmBatch);\n//\tLINK_LEXER(lmBlitzBasic);\n//\tLINK_LEXER(lmBullant);\n//\tLINK_LEXER(lmCaml);\n//\tLINK_LEXER(lmClw);\n//\tLINK_LEXER(lmClwNoCase);\n//\tLINK_LEXER(lmCmake);\n//\tLINK_LEXER(lmCOBOL);\n//\tLINK_LEXER(lmCoffeeScript);\n//\tLINK_LEXER(lmConf);\n\tLINK_LEXER(lmCPP);\n//\tLINK_LEXER(lmCPPNoCase);\n//\tLINK_LEXER(lmCsound);\n//\tLINK_LEXER(lmCss);\n//\tLINK_LEXER(lmD);\n//\tLINK_LEXER(lmDiff);\n//\tLINK_LEXER(lmECL);\n//\tLINK_LEXER(lmEiffel);\n//\tLINK_LEXER(lmEiffelkw);\n//\tLINK_LEXER(lmErlang);\n//\tLINK_LEXER(lmErrorList);\n//\tLINK_LEXER(lmESCRIPT);\n//\tLINK_LEXER(lmF77);\n//\tLINK_LEXER(lmFlagShip);\n//\tLINK_LEXER(lmForth);\n//\tLINK_LEXER(lmFortran);\n//\tLINK_LEXER(lmFreeBasic);\n//\tLINK_LEXER(lmGAP);\n//\tLINK_LEXER(lmGui4Cli);\n//\tLINK_LEXER(lmHaskell);\n//\tLINK_LEXER(lmHTML);\n//\tLINK_LEXER(lmInno);\n//\tLINK_LEXER(lmKix);\n//\tLINK_LEXER(lmKVIrc);\n//\tLINK_LEXER(lmLatex);\n//\tLINK_LEXER(lmLISP);\n//\tLINK_LEXER(lmLiterateHaskell);\n//\tLINK_LEXER(lmLot);\n//\tLINK_LEXER(lmLout);\n//\tLINK_LEXER(lmLua);\n//\tLINK_LEXER(lmMagikSF);\n//\tLINK_LEXER(lmMake);\n//\tLINK_LEXER(lmMarkdown);\n//\tLINK_LEXER(lmMatlab);\n//\tLINK_LEXER(lmMETAPOST);\n//\tLINK_LEXER(lmMMIXAL);\n//\tLINK_LEXER(lmModula);\n//\tLINK_LEXER(lmMSSQL);\n//\tLINK_LEXER(lmMySQL);\n//\tLINK_LEXER(lmNimrod);\n//\tLINK_LEXER(lmNncrontab);\n//\tLINK_LEXER(lmNsis);\n//\tLINK_LEXER(lmNull);\n//\tLINK_LEXER(lmOctave);\n//\tLINK_LEXER(lmOpal);\n//\tLINK_LEXER(lmOScript);\n//\tLINK_LEXER(lmPascal);\n//\tLINK_LEXER(lmPB);\n//\tLINK_LEXER(lmPerl);\n//\tLINK_LEXER(lmPHPSCRIPT);\n//\tLINK_LEXER(lmPLM);\n//\tLINK_LEXER(lmPO);\n//\tLINK_LEXER(lmPOV);\n//\tLINK_LEXER(lmPowerPro);\n//\tLINK_LEXER(lmPowerShell);\n//\tLINK_LEXER(lmProgress);\n//\tLINK_LEXER(lmProps);\n//\tLINK_LEXER(lmPS);\n//\tLINK_LEXER(lmPureBasic);\n//\tLINK_LEXER(lmPython);\n//\tLINK_LEXER(lmR);\n//\tLINK_LEXER(lmREBOL);\n//\tLINK_LEXER(lmRuby);\n//\tLINK_LEXER(lmRust);\n//\tLINK_LEXER(lmScriptol);\n//\tLINK_LEXER(lmSmalltalk);\n//\tLINK_LEXER(lmSML);\n//\tLINK_LEXER(lmSorc);\n//\tLINK_LEXER(lmSpecman);\n//\tLINK_LEXER(lmSpice);\n//\tLINK_LEXER(lmSQL);\n//\tLINK_LEXER(lmSTTXT);\n//\tLINK_LEXER(lmTACL);\n//\tLINK_LEXER(lmTADS3);\n//\tLINK_LEXER(lmTAL);\n//\tLINK_LEXER(lmTCL);\n//\tLINK_LEXER(lmTCMD);\n//\tLINK_LEXER(lmTeX);\n//\tLINK_LEXER(lmTxt2tags);\n//\tLINK_LEXER(lmVB);\n//\tLINK_LEXER(lmVBScript);\n//\tLINK_LEXER(lmVerilog);\n//\tLINK_LEXER(lmVHDL);\n//\tLINK_LEXER(lmVisualProlog);\n//\tLINK_LEXER(lmXML);\n//\tLINK_LEXER(lmYAML);\n\n//--Autogenerated -- end of automatically generated section\n\n\treturn 1;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/Catalogue.h",
    "content": "// Scintilla source code edit control\n/** @file Catalogue.h\n ** Lexer infrastructure.\n **/\n// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef CATALOGUE_H\n#define CATALOGUE_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nclass Catalogue {\npublic:\n\tstatic const LexerModule *Find(int language);\n\tstatic const LexerModule *Find(const char *languageName);\n\tstatic void AddLexerModule(LexerModule *plm);\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/CellBuffer.cpp",
    "content": "// Scintilla source code edit control\n/** @file CellBuffer.cxx\n ** Manages a buffer of cells.\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n\n#include <algorithm>\n\n#include \"Platform.h\"\n\n#include \"Scintilla.h\"\n#include \"SplitVector.h\"\n#include \"Partitioning.h\"\n#include \"CellBuffer.h\"\n#include \"UniConversion.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nLineVector::LineVector() : starts(256), perLine(0) {\n\tInit();\n}\n\nLineVector::~LineVector() {\n\tstarts.DeleteAll();\n}\n\nvoid LineVector::Init() {\n\tstarts.DeleteAll();\n\tif (perLine) {\n\t\tperLine->Init();\n\t}\n}\n\nvoid LineVector::SetPerLine(PerLine *pl) {\n\tperLine = pl;\n}\n\nvoid LineVector::InsertText(int line, int delta) {\n\tstarts.InsertText(line, delta);\n}\n\nvoid LineVector::InsertLine(int line, int position, bool lineStart) {\n\tstarts.InsertPartition(line, position);\n\tif (perLine) {\n\t\tif ((line > 0) && lineStart)\n\t\t\tline--;\n\t\tperLine->InsertLine(line);\n\t}\n}\n\nvoid LineVector::SetLineStart(int line, int position) {\n\tstarts.SetPartitionStartPosition(line, position);\n}\n\nvoid LineVector::RemoveLine(int line) {\n\tstarts.RemovePartition(line);\n\tif (perLine) {\n\t\tperLine->RemoveLine(line);\n\t}\n}\n\nint LineVector::LineFromPosition(int pos) const {\n\treturn starts.PartitionFromPosition(pos);\n}\n\nAction::Action() {\n\tat = startAction;\n\tposition = 0;\n\tdata = 0;\n\tlenData = 0;\n\tmayCoalesce = false;\n}\n\nAction::~Action() {\n\tDestroy();\n}\n\nvoid Action::Create(actionType at_, int position_, const char *data_, int lenData_, bool mayCoalesce_) {\n\tdelete []data;\n\tdata = NULL;\n\tposition = position_;\n\tat = at_;\n\tif (lenData_) {\n\t\tdata = new char[lenData_];\n\t\tmemcpy(data, data_, lenData_);\n\t}\n\tlenData = lenData_;\n\tmayCoalesce = mayCoalesce_;\n}\n\nvoid Action::Destroy() {\n\tdelete []data;\n\tdata = 0;\n}\n\nvoid Action::Grab(Action *source) {\n\tdelete []data;\n\n\tposition = source->position;\n\tat = source->at;\n\tdata = source->data;\n\tlenData = source->lenData;\n\tmayCoalesce = source->mayCoalesce;\n\n\t// Ownership of source data transferred to this\n\tsource->position = 0;\n\tsource->at = startAction;\n\tsource->data = 0;\n\tsource->lenData = 0;\n\tsource->mayCoalesce = true;\n}\n\n// The undo history stores a sequence of user operations that represent the user's view of the\n// commands executed on the text.\n// Each user operation contains a sequence of text insertion and text deletion actions.\n// All the user operations are stored in a list of individual actions with 'start' actions used\n// as delimiters between user operations.\n// Initially there is one start action in the history.\n// As each action is performed, it is recorded in the history. The action may either become\n// part of the current user operation or may start a new user operation. If it is to be part of the\n// current operation, then it overwrites the current last action. If it is to be part of a new\n// operation, it is appended after the current last action.\n// After writing the new action, a new start action is appended at the end of the history.\n// The decision of whether to start a new user operation is based upon two factors. If a\n// compound operation has been explicitly started by calling BeginUndoAction and no matching\n// EndUndoAction (these calls nest) has been called, then the action is coalesced into the current\n// operation. If there is no outstanding BeginUndoAction call then a new operation is started\n// unless it looks as if the new action is caused by the user typing or deleting a stream of text.\n// Sequences that look like typing or deletion are coalesced into a single user operation.\n\nUndoHistory::UndoHistory() {\n\n\tlenActions = 100;\n\tactions = new Action[lenActions];\n\tmaxAction = 0;\n\tcurrentAction = 0;\n\tundoSequenceDepth = 0;\n\tsavePoint = 0;\n\n\tactions[currentAction].Create(startAction);\n}\n\nUndoHistory::~UndoHistory() {\n\tdelete []actions;\n\tactions = 0;\n}\n\nvoid UndoHistory::EnsureUndoRoom() {\n\t// Have to test that there is room for 2 more actions in the array\n\t// as two actions may be created by the calling function\n\tif (currentAction >= (lenActions - 2)) {\n\t\t// Run out of undo nodes so extend the array\n\t\tint lenActionsNew = lenActions * 2;\n\t\tAction *actionsNew = new Action[lenActionsNew];\n\t\tfor (int act = 0; act <= currentAction; act++)\n\t\t\tactionsNew[act].Grab(&actions[act]);\n\t\tdelete []actions;\n\t\tlenActions = lenActionsNew;\n\t\tactions = actionsNew;\n\t}\n}\n\nconst char *UndoHistory::AppendAction(actionType at, int position, const char *data, int lengthData,\n\tbool &startSequence, bool mayCoalesce) {\n\tEnsureUndoRoom();\n\t//Platform::DebugPrintf(\"%% %d action %d %d %d\\n\", at, position, lengthData, currentAction);\n\t//Platform::DebugPrintf(\"^ %d action %d %d\\n\", actions[currentAction - 1].at,\n\t//\tactions[currentAction - 1].position, actions[currentAction - 1].lenData);\n\tif (currentAction < savePoint) {\n\t\tsavePoint = -1;\n\t}\n\tint oldCurrentAction = currentAction;\n\tif (currentAction >= 1) {\n\t\tif (0 == undoSequenceDepth) {\n\t\t\t// Top level actions may not always be coalesced\n\t\t\tint targetAct = -1;\n\t\t\tconst Action *actPrevious = &(actions[currentAction + targetAct]);\n\t\t\t// Container actions may forward the coalesce state of Scintilla Actions.\n\t\t\twhile ((actPrevious->at == containerAction) && actPrevious->mayCoalesce) {\n\t\t\t\ttargetAct--;\n\t\t\t\tactPrevious = &(actions[currentAction + targetAct]);\n\t\t\t}\n\t\t\t// See if current action can be coalesced into previous action\n\t\t\t// Will work if both are inserts or deletes and position is same\n\t\t\tif (currentAction == savePoint) {\n\t\t\t\tcurrentAction++;\n\t\t\t} else if (!actions[currentAction].mayCoalesce) {\n\t\t\t\t// Not allowed to coalesce if this set\n\t\t\t\tcurrentAction++;\n\t\t\t} else if (!mayCoalesce || !actPrevious->mayCoalesce) {\n\t\t\t\tcurrentAction++;\n\t\t\t} else if (at == containerAction || actions[currentAction].at == containerAction) {\n\t\t\t\t;\t// A coalescible containerAction\n\t\t\t} else if ((at != actPrevious->at) && (actPrevious->at != startAction)) {\n\t\t\t\tcurrentAction++;\n\t\t\t} else if ((at == insertAction) &&\n\t\t\t           (position != (actPrevious->position + actPrevious->lenData))) {\n\t\t\t\t// Insertions must be immediately after to coalesce\n\t\t\t\tcurrentAction++;\n\t\t\t} else if (at == removeAction) {\n\t\t\t\tif ((lengthData == 1) || (lengthData == 2)) {\n\t\t\t\t\tif ((position + lengthData) == actPrevious->position) {\n\t\t\t\t\t\t; // Backspace -> OK\n\t\t\t\t\t} else if (position == actPrevious->position) {\n\t\t\t\t\t\t; // Delete -> OK\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Removals must be at same position to coalesce\n\t\t\t\t\t\tcurrentAction++;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Removals must be of one character to coalesce\n\t\t\t\t\tcurrentAction++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Action coalesced.\n\t\t\t}\n\n\t\t} else {\n\t\t\t// Actions not at top level are always coalesced unless this is after return to top level\n\t\t\tif (!actions[currentAction].mayCoalesce)\n\t\t\t\tcurrentAction++;\n\t\t}\n\t} else {\n\t\tcurrentAction++;\n\t}\n\tstartSequence = oldCurrentAction != currentAction;\n\tint actionWithData = currentAction;\n\tactions[currentAction].Create(at, position, data, lengthData, mayCoalesce);\n\tcurrentAction++;\n\tactions[currentAction].Create(startAction);\n\tmaxAction = currentAction;\n\treturn actions[actionWithData].data;\n}\n\nvoid UndoHistory::BeginUndoAction() {\n\tEnsureUndoRoom();\n\tif (undoSequenceDepth == 0) {\n\t\tif (actions[currentAction].at != startAction) {\n\t\t\tcurrentAction++;\n\t\t\tactions[currentAction].Create(startAction);\n\t\t\tmaxAction = currentAction;\n\t\t}\n\t\tactions[currentAction].mayCoalesce = false;\n\t}\n\tundoSequenceDepth++;\n}\n\nvoid UndoHistory::EndUndoAction() {\n\tPLATFORM_ASSERT(undoSequenceDepth > 0);\n\tEnsureUndoRoom();\n\tundoSequenceDepth--;\n\tif (0 == undoSequenceDepth) {\n\t\tif (actions[currentAction].at != startAction) {\n\t\t\tcurrentAction++;\n\t\t\tactions[currentAction].Create(startAction);\n\t\t\tmaxAction = currentAction;\n\t\t}\n\t\tactions[currentAction].mayCoalesce = false;\n\t}\n}\n\nvoid UndoHistory::DropUndoSequence() {\n\tundoSequenceDepth = 0;\n}\n\nvoid UndoHistory::DeleteUndoHistory() {\n\tfor (int i = 1; i < maxAction; i++)\n\t\tactions[i].Destroy();\n\tmaxAction = 0;\n\tcurrentAction = 0;\n\tactions[currentAction].Create(startAction);\n\tsavePoint = 0;\n}\n\nvoid UndoHistory::SetSavePoint() {\n\tsavePoint = currentAction;\n}\n\nbool UndoHistory::IsSavePoint() const {\n\treturn savePoint == currentAction;\n}\n\nbool UndoHistory::CanUndo() const {\n\treturn (currentAction > 0) && (maxAction > 0);\n}\n\nint UndoHistory::StartUndo() {\n\t// Drop any trailing startAction\n\tif (actions[currentAction].at == startAction && currentAction > 0)\n\t\tcurrentAction--;\n\n\t// Count the steps in this action\n\tint act = currentAction;\n\twhile (actions[act].at != startAction && act > 0) {\n\t\tact--;\n\t}\n\treturn currentAction - act;\n}\n\nconst Action &UndoHistory::GetUndoStep() const {\n\treturn actions[currentAction];\n}\n\nvoid UndoHistory::CompletedUndoStep() {\n\tcurrentAction--;\n}\n\nbool UndoHistory::CanRedo() const {\n\treturn maxAction > currentAction;\n}\n\nint UndoHistory::StartRedo() {\n\t// Drop any leading startAction\n\tif (actions[currentAction].at == startAction && currentAction < maxAction)\n\t\tcurrentAction++;\n\n\t// Count the steps in this action\n\tint act = currentAction;\n\twhile (actions[act].at != startAction && act < maxAction) {\n\t\tact++;\n\t}\n\treturn act - currentAction;\n}\n\nconst Action &UndoHistory::GetRedoStep() const {\n\treturn actions[currentAction];\n}\n\nvoid UndoHistory::CompletedRedoStep() {\n\tcurrentAction++;\n}\n\nCellBuffer::CellBuffer() {\n\treadOnly = false;\n\tutf8LineEnds = 0;\n\tcollectingUndo = true;\n}\n\nCellBuffer::~CellBuffer() {\n}\n\nchar CellBuffer::CharAt(int position) const {\n\treturn substance.ValueAt(position);\n}\n\nvoid CellBuffer::GetCharRange(char *buffer, int position, int lengthRetrieve) const {\n\tif (lengthRetrieve < 0)\n\t\treturn;\n\tif (position < 0)\n\t\treturn;\n\tif ((position + lengthRetrieve) > substance.Length()) {\n\t\tPlatform::DebugPrintf(\"Bad GetCharRange %d for %d of %d\\n\", position,\n\t\t                      lengthRetrieve, substance.Length());\n\t\treturn;\n\t}\n\tsubstance.GetRange(buffer, position, lengthRetrieve);\n}\n\nchar CellBuffer::StyleAt(int position) const {\n\treturn style.ValueAt(position);\n}\n\nvoid CellBuffer::GetStyleRange(unsigned char *buffer, int position, int lengthRetrieve) const {\n\tif (lengthRetrieve < 0)\n\t\treturn;\n\tif (position < 0)\n\t\treturn;\n\tif ((position + lengthRetrieve) > style.Length()) {\n\t\tPlatform::DebugPrintf(\"Bad GetStyleRange %d for %d of %d\\n\", position,\n\t\t                      lengthRetrieve, style.Length());\n\t\treturn;\n\t}\n\tstyle.GetRange(reinterpret_cast<char *>(buffer), position, lengthRetrieve);\n}\n\nconst char *CellBuffer::BufferPointer() {\n\treturn substance.BufferPointer();\n}\n\nconst char *CellBuffer::RangePointer(int position, int rangeLength) {\n\treturn substance.RangePointer(position, rangeLength);\n}\n\nint CellBuffer::GapPosition() const {\n\treturn substance.GapPosition();\n}\n\n// The char* returned is to an allocation owned by the undo history\nconst char *CellBuffer::InsertString(int position, const char *s, int insertLength, bool &startSequence) {\n\t// InsertString and DeleteChars are the bottleneck though which all changes occur\n\tconst char *data = s;\n\tif (!readOnly) {\n\t\tif (collectingUndo) {\n\t\t\t// Save into the undo/redo stack, but only the characters - not the formatting\n\t\t\t// This takes up about half load time\n\t\t\tdata = uh.AppendAction(insertAction, position, s, insertLength, startSequence);\n\t\t}\n\n\t\tBasicInsertString(position, s, insertLength);\n\t}\n\treturn data;\n}\n\nbool CellBuffer::SetStyleAt(int position, char styleValue, char mask) {\n\tstyleValue &= mask;\n\tchar curVal = style.ValueAt(position);\n\tif ((curVal & mask) != styleValue) {\n\t\tstyle.SetValueAt(position, static_cast<char>((curVal & ~mask) | styleValue));\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n}\n\nbool CellBuffer::SetStyleFor(int position, int lengthStyle, char styleValue, char mask) {\n\tbool changed = false;\n\tPLATFORM_ASSERT(lengthStyle == 0 ||\n\t\t(lengthStyle > 0 && lengthStyle + position <= style.Length()));\n\twhile (lengthStyle--) {\n\t\tchar curVal = style.ValueAt(position);\n\t\tif ((curVal & mask) != styleValue) {\n\t\t\tstyle.SetValueAt(position, static_cast<char>((curVal & ~mask) | styleValue));\n\t\t\tchanged = true;\n\t\t}\n\t\tposition++;\n\t}\n\treturn changed;\n}\n\n// The char* returned is to an allocation owned by the undo history\nconst char *CellBuffer::DeleteChars(int position, int deleteLength, bool &startSequence) {\n\t// InsertString and DeleteChars are the bottleneck though which all changes occur\n\tPLATFORM_ASSERT(deleteLength > 0);\n\tconst char *data = 0;\n\tif (!readOnly) {\n\t\tif (collectingUndo) {\n\t\t\t// Save into the undo/redo stack, but only the characters - not the formatting\n\t\t\t// The gap would be moved to position anyway for the deletion so this doesn't cost extra\n\t\t\tdata = substance.RangePointer(position, deleteLength);\n\t\t\tdata = uh.AppendAction(removeAction, position, data, deleteLength, startSequence);\n\t\t}\n\n\t\tBasicDeleteChars(position, deleteLength);\n\t}\n\treturn data;\n}\n\nint CellBuffer::Length() const {\n\treturn substance.Length();\n}\n\nvoid CellBuffer::Allocate(int newSize) {\n\tsubstance.ReAllocate(newSize);\n\tstyle.ReAllocate(newSize);\n}\n\nvoid CellBuffer::SetLineEndTypes(int utf8LineEnds_) {\n\tif (utf8LineEnds != utf8LineEnds_) {\n\t\tutf8LineEnds = utf8LineEnds_;\n\t\tResetLineEnds();\n\t}\n}\n\nvoid CellBuffer::SetPerLine(PerLine *pl) {\n\tlv.SetPerLine(pl);\n}\n\nint CellBuffer::Lines() const {\n\treturn lv.Lines();\n}\n\nint CellBuffer::LineStart(int line) const {\n\tif (line < 0)\n\t\treturn 0;\n\telse if (line >= Lines())\n\t\treturn Length();\n\telse\n\t\treturn lv.LineStart(line);\n}\n\nbool CellBuffer::IsReadOnly() const {\n\treturn readOnly;\n}\n\nvoid CellBuffer::SetReadOnly(bool set) {\n\treadOnly = set;\n}\n\nvoid CellBuffer::SetSavePoint() {\n\tuh.SetSavePoint();\n}\n\nbool CellBuffer::IsSavePoint() const {\n\treturn uh.IsSavePoint();\n}\n\n// Without undo\n\nvoid CellBuffer::InsertLine(int line, int position, bool lineStart) {\n\tlv.InsertLine(line, position, lineStart);\n}\n\nvoid CellBuffer::RemoveLine(int line) {\n\tlv.RemoveLine(line);\n}\n\nbool CellBuffer::UTF8LineEndOverlaps(int position) const {\n\tunsigned char bytes[] = {\n\t\tstatic_cast<unsigned char>(substance.ValueAt(position-2)),\n\t\tstatic_cast<unsigned char>(substance.ValueAt(position-1)),\n\t\tstatic_cast<unsigned char>(substance.ValueAt(position)),\n\t\tstatic_cast<unsigned char>(substance.ValueAt(position+1)),\n\t};\n\treturn UTF8IsSeparator(bytes) || UTF8IsSeparator(bytes+1) || UTF8IsNEL(bytes+1);\n}\n\nvoid CellBuffer::ResetLineEnds() {\n\t// Reinitialize line data -- too much work to preserve\n\tlv.Init();\n\n\tint position = 0;\n\tint length = Length();\n\tint lineInsert = 1;\n\tbool atLineStart = true;\n\tlv.InsertText(lineInsert-1, length);\n\tunsigned char chBeforePrev = 0;\n\tunsigned char chPrev = 0;\n\tfor (int i = 0; i < length; i++) {\n\t\tunsigned char ch = substance.ValueAt(position + i);\n\t\tif (ch == '\\r') {\n\t\t\tInsertLine(lineInsert, (position + i) + 1, atLineStart);\n\t\t\tlineInsert++;\n\t\t} else if (ch == '\\n') {\n\t\t\tif (chPrev == '\\r') {\n\t\t\t\t// Patch up what was end of line\n\t\t\t\tlv.SetLineStart(lineInsert - 1, (position + i) + 1);\n\t\t\t} else {\n\t\t\t\tInsertLine(lineInsert, (position + i) + 1, atLineStart);\n\t\t\t\tlineInsert++;\n\t\t\t}\n\t\t} else if (utf8LineEnds) {\n\t\t\tunsigned char back3[3] = {chBeforePrev, chPrev, ch};\n\t\t\tif (UTF8IsSeparator(back3) || UTF8IsNEL(back3+1)) {\n\t\t\t\tInsertLine(lineInsert, (position + i) + 1, atLineStart);\n\t\t\t\tlineInsert++;\n\t\t\t}\n\t\t}\n\t\tchBeforePrev = chPrev;\n\t\tchPrev = ch;\n\t}\n}\n\nvoid CellBuffer::BasicInsertString(int position, const char *s, int insertLength) {\n\tif (insertLength == 0)\n\t\treturn;\n\tPLATFORM_ASSERT(insertLength > 0);\n\n\tunsigned char chAfter = substance.ValueAt(position);\n\tbool breakingUTF8LineEnd = false;\n\tif (utf8LineEnds && UTF8IsTrailByte(chAfter)) {\n\t\tbreakingUTF8LineEnd = UTF8LineEndOverlaps(position);\n\t}\n\n\tsubstance.InsertFromArray(position, s, 0, insertLength);\n\tstyle.InsertValue(position, insertLength, 0);\n\n\tint lineInsert = lv.LineFromPosition(position) + 1;\n\tbool atLineStart = lv.LineStart(lineInsert-1) == position;\n\t// Point all the lines after the insertion point further along in the buffer\n\tlv.InsertText(lineInsert-1, insertLength);\n\tunsigned char chBeforePrev = substance.ValueAt(position - 2);\n\tunsigned char chPrev = substance.ValueAt(position - 1);\n\tif (chPrev == '\\r' && chAfter == '\\n') {\n\t\t// Splitting up a crlf pair at position\n\t\tInsertLine(lineInsert, position, false);\n\t\tlineInsert++;\n\t}\n\tif (breakingUTF8LineEnd) {\n\t\tRemoveLine(lineInsert);\n\t}\n\tunsigned char ch = ' ';\n\tfor (int i = 0; i < insertLength; i++) {\n\t\tch = s[i];\n\t\tif (ch == '\\r') {\n\t\t\tInsertLine(lineInsert, (position + i) + 1, atLineStart);\n\t\t\tlineInsert++;\n\t\t} else if (ch == '\\n') {\n\t\t\tif (chPrev == '\\r') {\n\t\t\t\t// Patch up what was end of line\n\t\t\t\tlv.SetLineStart(lineInsert - 1, (position + i) + 1);\n\t\t\t} else {\n\t\t\t\tInsertLine(lineInsert, (position + i) + 1, atLineStart);\n\t\t\t\tlineInsert++;\n\t\t\t}\n\t\t} else if (utf8LineEnds) {\n\t\t\tunsigned char back3[3] = {chBeforePrev, chPrev, ch};\n\t\t\tif (UTF8IsSeparator(back3) || UTF8IsNEL(back3+1)) {\n\t\t\t\tInsertLine(lineInsert, (position + i) + 1, atLineStart);\n\t\t\t\tlineInsert++;\n\t\t\t}\n\t\t}\n\t\tchBeforePrev = chPrev;\n\t\tchPrev = ch;\n\t}\n\t// Joining two lines where last insertion is cr and following substance starts with lf\n\tif (chAfter == '\\n') {\n\t\tif (ch == '\\r') {\n\t\t\t// End of line already in buffer so drop the newly created one\n\t\t\tRemoveLine(lineInsert - 1);\n\t\t}\n\t} else if (utf8LineEnds && !UTF8IsAscii(chAfter)) {\n\t\t// May have end of UTF-8 line end in buffer and start in insertion\n\t\tfor (int j = 0; j < UTF8SeparatorLength-1; j++) {\n\t\t\tunsigned char chAt = substance.ValueAt(position + insertLength + j);\n\t\t\tunsigned char back3[3] = {chBeforePrev, chPrev, chAt};\n\t\t\tif (UTF8IsSeparator(back3)) {\n\t\t\t\tInsertLine(lineInsert, (position + insertLength + j) + 1, atLineStart);\n\t\t\t\tlineInsert++;\n\t\t\t}\n\t\t\tif ((j == 0) && UTF8IsNEL(back3+1)) {\n\t\t\t\tInsertLine(lineInsert, (position + insertLength + j) + 1, atLineStart);\n\t\t\t\tlineInsert++;\n\t\t\t}\n\t\t\tchBeforePrev = chPrev;\n\t\t\tchPrev = chAt;\n\t\t}\n\t}\n}\n\nvoid CellBuffer::BasicDeleteChars(int position, int deleteLength) {\n\tif (deleteLength == 0)\n\t\treturn;\n\n\tif ((position == 0) && (deleteLength == substance.Length())) {\n\t\t// If whole buffer is being deleted, faster to reinitialise lines data\n\t\t// than to delete each line.\n\t\tlv.Init();\n\t} else {\n\t\t// Have to fix up line positions before doing deletion as looking at text in buffer\n\t\t// to work out which lines have been removed\n\n\t\tint lineRemove = lv.LineFromPosition(position) + 1;\n\t\tlv.InsertText(lineRemove-1, - (deleteLength));\n\t\tunsigned char chPrev = substance.ValueAt(position - 1);\n\t\tunsigned char chBefore = chPrev;\n\t\tunsigned char chNext = substance.ValueAt(position);\n\t\tbool ignoreNL = false;\n\t\tif (chPrev == '\\r' && chNext == '\\n') {\n\t\t\t// Move back one\n\t\t\tlv.SetLineStart(lineRemove, position);\n\t\t\tlineRemove++;\n\t\t\tignoreNL = true; \t// First \\n is not real deletion\n\t\t}\n\t\tif (utf8LineEnds && UTF8IsTrailByte(chNext)) {\n\t\t\tif (UTF8LineEndOverlaps(position)) {\n\t\t\t\tRemoveLine(lineRemove);\n\t\t\t}\n\t\t}\n\n\t\tunsigned char ch = chNext;\n\t\tfor (int i = 0; i < deleteLength; i++) {\n\t\t\tchNext = substance.ValueAt(position + i + 1);\n\t\t\tif (ch == '\\r') {\n\t\t\t\tif (chNext != '\\n') {\n\t\t\t\t\tRemoveLine(lineRemove);\n\t\t\t\t}\n\t\t\t} else if (ch == '\\n') {\n\t\t\t\tif (ignoreNL) {\n\t\t\t\t\tignoreNL = false; \t// Further \\n are real deletions\n\t\t\t\t} else {\n\t\t\t\t\tRemoveLine(lineRemove);\n\t\t\t\t}\n\t\t\t} else if (utf8LineEnds) {\n\t\t\t\tif (!UTF8IsAscii(ch)) {\n\t\t\t\t\tunsigned char next3[3] = {ch, chNext,\n\t\t\t\t\t\tstatic_cast<unsigned char>(substance.ValueAt(position + i + 2))};\n\t\t\t\t\tif (UTF8IsSeparator(next3) || UTF8IsNEL(next3)) {\n\t\t\t\t\t\tRemoveLine(lineRemove);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tch = chNext;\n\t\t}\n\t\t// May have to fix up end if last deletion causes cr to be next to lf\n\t\t// or removes one of a crlf pair\n\t\tchar chAfter = substance.ValueAt(position + deleteLength);\n\t\tif (chBefore == '\\r' && chAfter == '\\n') {\n\t\t\t// Using lineRemove-1 as cr ended line before start of deletion\n\t\t\tRemoveLine(lineRemove - 1);\n\t\t\tlv.SetLineStart(lineRemove - 1, position + 1);\n\t\t}\n\t}\n\tsubstance.DeleteRange(position, deleteLength);\n\tstyle.DeleteRange(position, deleteLength);\n}\n\nbool CellBuffer::SetUndoCollection(bool collectUndo) {\n\tcollectingUndo = collectUndo;\n\tuh.DropUndoSequence();\n\treturn collectingUndo;\n}\n\nbool CellBuffer::IsCollectingUndo() const {\n\treturn collectingUndo;\n}\n\nvoid CellBuffer::BeginUndoAction() {\n\tuh.BeginUndoAction();\n}\n\nvoid CellBuffer::EndUndoAction() {\n\tuh.EndUndoAction();\n}\n\nvoid CellBuffer::AddUndoAction(int token, bool mayCoalesce) {\n\tbool startSequence;\n\tuh.AppendAction(containerAction, token, 0, 0, startSequence, mayCoalesce);\n}\n\nvoid CellBuffer::DeleteUndoHistory() {\n\tuh.DeleteUndoHistory();\n}\n\nbool CellBuffer::CanUndo() const {\n\treturn uh.CanUndo();\n}\n\nint CellBuffer::StartUndo() {\n\treturn uh.StartUndo();\n}\n\nconst Action &CellBuffer::GetUndoStep() const {\n\treturn uh.GetUndoStep();\n}\n\nvoid CellBuffer::PerformUndoStep() {\n\tconst Action &actionStep = uh.GetUndoStep();\n\tif (actionStep.at == insertAction) {\n\t\tBasicDeleteChars(actionStep.position, actionStep.lenData);\n\t} else if (actionStep.at == removeAction) {\n\t\tBasicInsertString(actionStep.position, actionStep.data, actionStep.lenData);\n\t}\n\tuh.CompletedUndoStep();\n}\n\nbool CellBuffer::CanRedo() const {\n\treturn uh.CanRedo();\n}\n\nint CellBuffer::StartRedo() {\n\treturn uh.StartRedo();\n}\n\nconst Action &CellBuffer::GetRedoStep() const {\n\treturn uh.GetRedoStep();\n}\n\nvoid CellBuffer::PerformRedoStep() {\n\tconst Action &actionStep = uh.GetRedoStep();\n\tif (actionStep.at == insertAction) {\n\t\tBasicInsertString(actionStep.position, actionStep.data, actionStep.lenData);\n\t} else if (actionStep.at == removeAction) {\n\t\tBasicDeleteChars(actionStep.position, actionStep.lenData);\n\t}\n\tuh.CompletedRedoStep();\n}\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/CellBuffer.h",
    "content": "// Scintilla source code edit control\n/** @file CellBuffer.h\n ** Manages the text of the document.\n **/\n// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef CELLBUFFER_H\n#define CELLBUFFER_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n// Interface to per-line data that wants to see each line insertion and deletion\nclass PerLine {\npublic:\n\tvirtual ~PerLine() {}\n\tvirtual void Init()=0;\n\tvirtual void InsertLine(int)=0;\n\tvirtual void RemoveLine(int)=0;\n};\n\n/**\n * The line vector contains information about each of the lines in a cell buffer.\n */\nclass LineVector {\n\n\tPartitioning starts;\n\tPerLine *perLine;\n\npublic:\n\n\tLineVector();\n\t~LineVector();\n\tvoid Init();\n\tvoid SetPerLine(PerLine *pl);\n\n\tvoid InsertText(int line, int delta);\n\tvoid InsertLine(int line, int position, bool lineStart);\n\tvoid SetLineStart(int line, int position);\n\tvoid RemoveLine(int line);\n\tint Lines() const {\n\t\treturn starts.Partitions();\n\t}\n\tint LineFromPosition(int pos) const;\n\tint LineStart(int line) const {\n\t\treturn starts.PositionFromPartition(line);\n\t}\n\n\tint MarkValue(int line);\n\tint AddMark(int line, int marker);\n\tvoid MergeMarkers(int pos);\n\tvoid DeleteMark(int line, int markerNum, bool all);\n\tvoid DeleteMarkFromHandle(int markerHandle);\n\tint LineFromHandle(int markerHandle);\n\n\tvoid ClearLevels();\n\tint SetLevel(int line, int level);\n\tint GetLevel(int line);\n\n\tint SetLineState(int line, int state);\n\tint GetLineState(int line);\n\tint GetMaxLineState();\n\n};\n\nenum actionType { insertAction, removeAction, startAction, containerAction };\n\n/**\n * Actions are used to store all the information required to perform one undo/redo step.\n */\nclass Action {\npublic:\n\tactionType at;\n\tint position;\n\tchar *data;\n\tint lenData;\n\tbool mayCoalesce;\n\n\tAction();\n\t~Action();\n\tvoid Create(actionType at_, int position_=0, const char *data_=0, int lenData_=0, bool mayCoalesce_=true);\n\tvoid Destroy();\n\tvoid Grab(Action *source);\n};\n\n/**\n *\n */\nclass UndoHistory {\n\tAction *actions;\n\tint lenActions;\n\tint maxAction;\n\tint currentAction;\n\tint undoSequenceDepth;\n\tint savePoint;\n\n\tvoid EnsureUndoRoom();\n\n\t// Private so UndoHistory objects can not be copied\n\tUndoHistory(const UndoHistory &);\n\npublic:\n\tUndoHistory();\n\t~UndoHistory();\n\n\tconst char *AppendAction(actionType at, int position, const char *data, int length, bool &startSequence, bool mayCoalesce=true);\n\n\tvoid BeginUndoAction();\n\tvoid EndUndoAction();\n\tvoid DropUndoSequence();\n\tvoid DeleteUndoHistory();\n\n\t/// The save point is a marker in the undo stack where the container has stated that\n\t/// the buffer was saved. Undo and redo can move over the save point.\n\tvoid SetSavePoint();\n\tbool IsSavePoint() const;\n\n\t/// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is\n\t/// called that many times. Similarly for redo.\n\tbool CanUndo() const;\n\tint StartUndo();\n\tconst Action &GetUndoStep() const;\n\tvoid CompletedUndoStep();\n\tbool CanRedo() const;\n\tint StartRedo();\n\tconst Action &GetRedoStep() const;\n\tvoid CompletedRedoStep();\n};\n\n/**\n * Holder for an expandable array of characters that supports undo and line markers.\n * Based on article \"Data Structures in a Bit-Mapped Text Editor\"\n * by Wilfred J. Hansen, Byte January 1987, page 183.\n */\nclass CellBuffer {\nprivate:\n\tSplitVector<char> substance;\n\tSplitVector<char> style;\n\tbool readOnly;\n\tint utf8LineEnds;\n\n\tbool collectingUndo;\n\tUndoHistory uh;\n\n\tLineVector lv;\n\n\tbool UTF8LineEndOverlaps(int position) const;\n\tvoid ResetLineEnds();\n\t/// Actions without undo\n\tvoid BasicInsertString(int position, const char *s, int insertLength);\n\tvoid BasicDeleteChars(int position, int deleteLength);\n\npublic:\n\n\tCellBuffer();\n\t~CellBuffer();\n\n\t/// Retrieving positions outside the range of the buffer works and returns 0\n\tchar CharAt(int position) const;\n\tvoid GetCharRange(char *buffer, int position, int lengthRetrieve) const;\n\tchar StyleAt(int position) const;\n\tvoid GetStyleRange(unsigned char *buffer, int position, int lengthRetrieve) const;\n\tconst char *BufferPointer();\n\tconst char *RangePointer(int position, int rangeLength);\n\tint GapPosition() const;\n\n\tint Length() const;\n\tvoid Allocate(int newSize);\n\tint GetLineEndTypes() const { return utf8LineEnds; }\n\tvoid SetLineEndTypes(int utf8LineEnds_);\n\tvoid SetPerLine(PerLine *pl);\n\tint Lines() const;\n\tint LineStart(int line) const;\n\tint LineFromPosition(int pos) const { return lv.LineFromPosition(pos); }\n\tvoid InsertLine(int line, int position, bool lineStart);\n\tvoid RemoveLine(int line);\n\tconst char *InsertString(int position, const char *s, int insertLength, bool &startSequence);\n\n\t/// Setting styles for positions outside the range of the buffer is safe and has no effect.\n\t/// @return true if the style of a character is changed.\n\tbool SetStyleAt(int position, char styleValue, char mask='\\377');\n\tbool SetStyleFor(int position, int length, char styleValue, char mask);\n\n\tconst char *DeleteChars(int position, int deleteLength, bool &startSequence);\n\n\tbool IsReadOnly() const;\n\tvoid SetReadOnly(bool set);\n\n\t/// The save point is a marker in the undo stack where the container has stated that\n\t/// the buffer was saved. Undo and redo can move over the save point.\n\tvoid SetSavePoint();\n\tbool IsSavePoint() const;\n\n\tbool SetUndoCollection(bool collectUndo);\n\tbool IsCollectingUndo() const;\n\tvoid BeginUndoAction();\n\tvoid EndUndoAction();\n\tvoid AddUndoAction(int token, bool mayCoalesce);\n\tvoid DeleteUndoHistory();\n\n\t/// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is\n\t/// called that many times. Similarly for redo.\n\tbool CanUndo() const;\n\tint StartUndo();\n\tconst Action &GetUndoStep() const;\n\tvoid PerformUndoStep();\n\tbool CanRedo() const;\n\tint StartRedo();\n\tconst Action &GetRedoStep() const;\n\tvoid PerformRedoStep();\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/CharClassify.cpp",
    "content": "// Scintilla source code edit control\n/** @file CharClassify.cxx\n ** Character classifications used by Document and RESearch.\n **/\n// Copyright 2006 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <ctype.h>\n\n#include \"CharClassify.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n// Shut up annoying Visual C++ warnings:\n#ifdef _MSC_VER\n#pragma warning(disable: 4514)\n#endif\n\nCharClassify::CharClassify() {\n\tSetDefaultCharClasses(true);\n}\n\nvoid CharClassify::SetDefaultCharClasses(bool includeWordClass) {\n\t// Initialize all char classes to default values\n\tfor (int ch = 0; ch < 256; ch++) {\n\t\tif (ch == '\\r' || ch == '\\n')\n\t\t\tcharClass[ch] = ccNewLine;\n\t\telse if (ch < 0x20 || ch == ' ')\n\t\t\tcharClass[ch] = ccSpace;\n\t\telse if (includeWordClass && (ch >= 0x80 || isalnum(ch) || ch == '_'))\n\t\t\tcharClass[ch] = ccWord;\n\t\telse\n\t\t\tcharClass[ch] = ccPunctuation;\n\t}\n}\n\nvoid CharClassify::SetCharClasses(const unsigned char *chars, cc newCharClass) {\n\t// Apply the newCharClass to the specifed chars\n\tif (chars) {\n\t\twhile (*chars) {\n\t\t\tcharClass[*chars] = static_cast<unsigned char>(newCharClass);\n\t\t\tchars++;\n\t\t}\n\t}\n}\n\nint CharClassify::GetCharsOfClass(cc characterClass, unsigned char *buffer) {\n\t// Get characters belonging to the given char class; return the number\n\t// of characters (if the buffer is NULL, don't write to it).\n\tint count = 0;\n\tfor (int ch = maxChar - 1; ch >= 0; --ch) {\n\t\tif (charClass[ch] == characterClass) {\n\t\t\t++count;\n\t\t\tif (buffer) {\n\t\t\t\t*buffer = static_cast<unsigned char>(ch);\n\t\t\t\tbuffer++;\n\t\t\t}\n\t\t}\n\t}\n\treturn count;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/CharClassify.h",
    "content": "// Scintilla source code edit control\n/** @file CharClassify.h\n ** Character classifications used by Document and RESearch.\n **/\n// Copyright 2006-2009 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef CHARCLASSIFY_H\n#define CHARCLASSIFY_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nclass CharClassify {\npublic:\n\tCharClassify();\n\n\tenum cc { ccSpace, ccNewLine, ccWord, ccPunctuation };\n\tvoid SetDefaultCharClasses(bool includeWordClass);\n\tvoid SetCharClasses(const unsigned char *chars, cc newCharClass);\n\tint GetCharsOfClass(cc charClass, unsigned char *buffer);\n\tcc GetClass(unsigned char ch) const { return static_cast<cc>(charClass[ch]);}\n\tbool IsWord(unsigned char ch) const { return static_cast<cc>(charClass[ch]) == ccWord;}\n\nprivate:\n\tenum { maxChar=256 };\n\tunsigned char charClass[maxChar];    // not type cc to save space\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/ContractionState.cpp",
    "content": "// Scintilla source code edit control\n/** @file ContractionState.cxx\n ** Manages visibility of lines for folding and wrapping.\n **/\n// Copyright 1998-2007 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <string.h>\n\n#include <algorithm>\n\n#include \"Platform.h\"\n\n#include \"SplitVector.h\"\n#include \"Partitioning.h\"\n#include \"RunStyles.h\"\n#include \"ContractionState.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nContractionState::ContractionState() : visible(0), expanded(0), heights(0), displayLines(0), linesInDocument(1) {\n\t//InsertLine(0);\n}\n\nContractionState::~ContractionState() {\n\tClear();\n}\n\nvoid ContractionState::EnsureData() {\n\tif (OneToOne()) {\n\t\tvisible = new RunStyles();\n\t\texpanded = new RunStyles();\n\t\theights = new RunStyles();\n\t\tdisplayLines = new Partitioning(4);\n\t\tInsertLines(0, linesInDocument);\n\t}\n}\n\nvoid ContractionState::Clear() {\n\tdelete visible;\n\tvisible = 0;\n\tdelete expanded;\n\texpanded = 0;\n\tdelete heights;\n\theights = 0;\n\tdelete displayLines;\n\tdisplayLines = 0;\n\tlinesInDocument = 1;\n}\n\nint ContractionState::LinesInDoc() const {\n\tif (OneToOne()) {\n\t\treturn linesInDocument;\n\t} else {\n\t\treturn displayLines->Partitions() - 1;\n\t}\n}\n\nint ContractionState::LinesDisplayed() const {\n\tif (OneToOne()) {\n\t\treturn linesInDocument;\n\t} else {\n\t\treturn displayLines->PositionFromPartition(LinesInDoc());\n\t}\n}\n\nint ContractionState::DisplayFromDoc(int lineDoc) const {\n\tif (OneToOne()) {\n\t\treturn (lineDoc <= linesInDocument) ? lineDoc : linesInDocument;\n\t} else {\n\t\tif (lineDoc > displayLines->Partitions())\n\t\t\tlineDoc = displayLines->Partitions();\n\t\treturn displayLines->PositionFromPartition(lineDoc);\n\t}\n}\n\nint ContractionState::DocFromDisplay(int lineDisplay) const {\n\tif (OneToOne()) {\n\t\treturn lineDisplay;\n\t} else {\n\t\tif (lineDisplay <= 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (lineDisplay > LinesDisplayed()) {\n\t\t\treturn displayLines->PartitionFromPosition(LinesDisplayed());\n\t\t}\n\t\tint lineDoc = displayLines->PartitionFromPosition(lineDisplay);\n\t\tPLATFORM_ASSERT(GetVisible(lineDoc));\n\t\treturn lineDoc;\n\t}\n}\n\nvoid ContractionState::InsertLine(int lineDoc) {\n\tif (OneToOne()) {\n\t\tlinesInDocument++;\n\t} else {\n\t\tvisible->InsertSpace(lineDoc, 1);\n\t\tvisible->SetValueAt(lineDoc, 1);\n\t\texpanded->InsertSpace(lineDoc, 1);\n\t\texpanded->SetValueAt(lineDoc, 1);\n\t\theights->InsertSpace(lineDoc, 1);\n\t\theights->SetValueAt(lineDoc, 1);\n\t\tint lineDisplay = DisplayFromDoc(lineDoc);\n\t\tdisplayLines->InsertPartition(lineDoc, lineDisplay);\n\t\tdisplayLines->InsertText(lineDoc, 1);\n\t}\n}\n\nvoid ContractionState::InsertLines(int lineDoc, int lineCount) {\n\tfor (int l = 0; l < lineCount; l++) {\n\t\tInsertLine(lineDoc + l);\n\t}\n\tCheck();\n}\n\nvoid ContractionState::DeleteLine(int lineDoc) {\n\tif (OneToOne()) {\n\t\tlinesInDocument--;\n\t} else {\n\t\tif (GetVisible(lineDoc)) {\n\t\t\tdisplayLines->InsertText(lineDoc, -heights->ValueAt(lineDoc));\n\t\t}\n\t\tdisplayLines->RemovePartition(lineDoc);\n\t\tvisible->DeleteRange(lineDoc, 1);\n\t\texpanded->DeleteRange(lineDoc, 1);\n\t\theights->DeleteRange(lineDoc, 1);\n\t}\n}\n\nvoid ContractionState::DeleteLines(int lineDoc, int lineCount) {\n\tfor (int l = 0; l < lineCount; l++) {\n\t\tDeleteLine(lineDoc);\n\t}\n\tCheck();\n}\n\nbool ContractionState::GetVisible(int lineDoc) const {\n\tif (OneToOne()) {\n\t\treturn true;\n\t} else {\n\t\tif (lineDoc >= visible->Length())\n\t\t\treturn true;\n\t\treturn visible->ValueAt(lineDoc) == 1;\n\t}\n}\n\nbool ContractionState::SetVisible(int lineDocStart, int lineDocEnd, bool visible_) {\n\tif (OneToOne() && visible_) {\n\t\treturn false;\n\t} else {\n\t\tEnsureData();\n\t\tint delta = 0;\n\t\tCheck();\n\t\tif ((lineDocStart <= lineDocEnd) && (lineDocStart >= 0) && (lineDocEnd < LinesInDoc())) {\n\t\t\tfor (int line = lineDocStart; line <= lineDocEnd; line++) {\n\t\t\t\tif (GetVisible(line) != visible_) {\n\t\t\t\t\tint difference = visible_ ? heights->ValueAt(line) : -heights->ValueAt(line);\n\t\t\t\t\tvisible->SetValueAt(line, visible_ ? 1 : 0);\n\t\t\t\t\tdisplayLines->InsertText(line, difference);\n\t\t\t\t\tdelta += difference;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t\tCheck();\n\t\treturn delta != 0;\n\t}\n}\n\nbool ContractionState::HiddenLines() const {\n\tif (OneToOne()) {\n\t\treturn false;\n\t} else {\n\t\treturn !visible->AllSameAs(1);\n\t}\n}\n\nbool ContractionState::GetExpanded(int lineDoc) const {\n\tif (OneToOne()) {\n\t\treturn true;\n\t} else {\n\t\tCheck();\n\t\treturn expanded->ValueAt(lineDoc) == 1;\n\t}\n}\n\nbool ContractionState::SetExpanded(int lineDoc, bool expanded_) {\n\tif (OneToOne() && expanded_) {\n\t\treturn false;\n\t} else {\n\t\tEnsureData();\n\t\tif (expanded_ != (expanded->ValueAt(lineDoc) == 1)) {\n\t\t\texpanded->SetValueAt(lineDoc, expanded_ ? 1 : 0);\n\t\t\tCheck();\n\t\t\treturn true;\n\t\t} else {\n\t\t\tCheck();\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\nint ContractionState::ContractedNext(int lineDocStart) const {\n\tif (OneToOne()) {\n\t\treturn -1;\n\t} else {\n\t\tCheck();\n\t\tif (!expanded->ValueAt(lineDocStart)) {\n\t\t\treturn lineDocStart;\n\t\t} else {\n\t\t\tint lineDocNextChange = expanded->EndRun(lineDocStart);\n\t\t\tif (lineDocNextChange < LinesInDoc())\n\t\t\t\treturn lineDocNextChange;\n\t\t\telse\n\t\t\t\treturn -1;\n\t\t}\n\t}\n}\n\nint ContractionState::GetHeight(int lineDoc) const {\n\tif (OneToOne()) {\n\t\treturn 1;\n\t} else {\n\t\treturn heights->ValueAt(lineDoc);\n\t}\n}\n\n// Set the number of display lines needed for this line.\n// Return true if this is a change.\nbool ContractionState::SetHeight(int lineDoc, int height) {\n\tif (OneToOne() && (height == 1)) {\n\t\treturn false;\n\t} else if (lineDoc < LinesInDoc()) {\n\t\tEnsureData();\n\t\tif (GetHeight(lineDoc) != height) {\n\t\t\tif (GetVisible(lineDoc)) {\n\t\t\t\tdisplayLines->InsertText(lineDoc, height - GetHeight(lineDoc));\n\t\t\t}\n\t\t\theights->SetValueAt(lineDoc, height);\n\t\t\tCheck();\n\t\t\treturn true;\n\t\t} else {\n\t\t\tCheck();\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\treturn false;\n\t}\n}\n\nvoid ContractionState::ShowAll() {\n\tint lines = LinesInDoc();\n\tClear();\n\tlinesInDocument = lines;\n}\n\n// Debugging checks\n\nvoid ContractionState::Check() const {\n#ifdef CHECK_CORRECTNESS\n\tfor (int vline = 0; vline < LinesDisplayed(); vline++) {\n\t\tconst int lineDoc = DocFromDisplay(vline);\n\t\tPLATFORM_ASSERT(GetVisible(lineDoc));\n\t}\n\tfor (int lineDoc = 0; lineDoc < LinesInDoc(); lineDoc++) {\n\t\tconst int displayThis = DisplayFromDoc(lineDoc);\n\t\tconst int displayNext = DisplayFromDoc(lineDoc + 1);\n\t\tconst int height = displayNext - displayThis;\n\t\tPLATFORM_ASSERT(height >= 0);\n\t\tif (GetVisible(lineDoc)) {\n\t\t\tPLATFORM_ASSERT(GetHeight(lineDoc) == height);\n\t\t} else {\n\t\t\tPLATFORM_ASSERT(0 == height);\n\t\t}\n\t}\n#endif\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/ContractionState.h",
    "content": "// Scintilla source code edit control\n/** @file ContractionState.h\n ** Manages visibility of lines for folding and wrapping.\n **/\n// Copyright 1998-2007 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef CONTRACTIONSTATE_H\n#define CONTRACTIONSTATE_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n/**\n */\nclass ContractionState {\n\t// These contain 1 element for every document line.\n\tRunStyles *visible;\n\tRunStyles *expanded;\n\tRunStyles *heights;\n\tPartitioning *displayLines;\n\tint linesInDocument;\n\n\tvoid EnsureData();\n\n\tbool OneToOne() const {\n\t\t// True when each document line is exactly one display line so need for\n\t\t// complex data structures.\n\t\treturn visible == 0;\n\t}\n\npublic:\n\tContractionState();\n\tvirtual ~ContractionState();\n\n\tvoid Clear();\n\n\tint LinesInDoc() const;\n\tint LinesDisplayed() const;\n\tint DisplayFromDoc(int lineDoc) const;\n\tint DocFromDisplay(int lineDisplay) const;\n\n\tvoid InsertLine(int lineDoc);\n\tvoid InsertLines(int lineDoc, int lineCount);\n\tvoid DeleteLine(int lineDoc);\n\tvoid DeleteLines(int lineDoc, int lineCount);\n\n\tbool GetVisible(int lineDoc) const;\n\tbool SetVisible(int lineDocStart, int lineDocEnd, bool visible);\n\tbool HiddenLines() const;\n\n\tbool GetExpanded(int lineDoc) const;\n\tbool SetExpanded(int lineDoc, bool expanded);\n\tint ContractedNext(int lineDocStart) const;\n\n\tint GetHeight(int lineDoc) const;\n\tbool SetHeight(int lineDoc, int height);\n\n\tvoid ShowAll();\n\tvoid Check() const;\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/Decoration.cpp",
    "content": "/** @file Decoration.cxx\n ** Visual elements added over text.\n **/\n// Copyright 1998-2007 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n\n#include <algorithm>\n\n#include \"Platform.h\"\n\n#include \"Scintilla.h\"\n#include \"SplitVector.h\"\n#include \"Partitioning.h\"\n#include \"RunStyles.h\"\n#include \"Decoration.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nDecoration::Decoration(int indicator_) : next(0), indicator(indicator_) {\n}\n\nDecoration::~Decoration() {\n}\n\nbool Decoration::Empty() const {\n\treturn (rs.Runs() == 1) && (rs.AllSameAs(0));\n}\n\nDecorationList::DecorationList() : currentIndicator(0), currentValue(1), current(0),\n\tlengthDocument(0), root(0), clickNotified(false) {\n}\n\nDecorationList::~DecorationList() {\n\tDecoration *deco = root;\n\twhile (deco) {\n\t\tDecoration *decoNext = deco->next;\n\t\tdelete deco;\n\t\tdeco = decoNext;\n\t}\n\troot = 0;\n\tcurrent = 0;\n}\n\nDecoration *DecorationList::DecorationFromIndicator(int indicator) {\n\tfor (Decoration *deco=root; deco; deco = deco->next) {\n\t\tif (deco->indicator == indicator) {\n\t\t\treturn deco;\n\t\t}\n\t}\n\treturn 0;\n}\n\nDecoration *DecorationList::Create(int indicator, int length) {\n\tcurrentIndicator = indicator;\n\tDecoration *decoNew = new Decoration(indicator);\n\tdecoNew->rs.InsertSpace(0, length);\n\n\tDecoration *decoPrev = 0;\n\tDecoration *deco = root;\n\n\twhile (deco && (deco->indicator < indicator)) {\n\t\tdecoPrev = deco;\n\t\tdeco = deco->next;\n\t}\n\tif (decoPrev == 0) {\n\t\tdecoNew->next = root;\n\t\troot = decoNew;\n\t} else {\n\t\tdecoNew->next = deco;\n\t\tdecoPrev->next = decoNew;\n\t}\n\treturn decoNew;\n}\n\nvoid DecorationList::Delete(int indicator) {\n\tDecoration *decoToDelete = 0;\n\tif (root) {\n\t\tif (root->indicator == indicator) {\n\t\t\tdecoToDelete = root;\n\t\t\troot = root->next;\n\t\t} else {\n\t\t\tDecoration *deco=root;\n\t\t\twhile (deco->next && !decoToDelete) {\n\t\t\t\tif (deco->next && deco->next->indicator == indicator) {\n\t\t\t\t\tdecoToDelete = deco->next;\n\t\t\t\t\tdeco->next = decoToDelete->next;\n\t\t\t\t} else {\n\t\t\t\t\tdeco = deco->next;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (decoToDelete) {\n\t\tdelete decoToDelete;\n\t\tcurrent = 0;\n\t}\n}\n\nvoid DecorationList::SetCurrentIndicator(int indicator) {\n\tcurrentIndicator = indicator;\n\tcurrent = DecorationFromIndicator(indicator);\n\tcurrentValue = 1;\n}\n\nvoid DecorationList::SetCurrentValue(int value) {\n\tcurrentValue = value ? value : 1;\n}\n\nbool DecorationList::FillRange(int &position, int value, int &fillLength) {\n\tif (!current) {\n\t\tcurrent = DecorationFromIndicator(currentIndicator);\n\t\tif (!current) {\n\t\t\tcurrent = Create(currentIndicator, lengthDocument);\n\t\t}\n\t}\n\tbool changed = current->rs.FillRange(position, value, fillLength);\n\tif (current->Empty()) {\n\t\tDelete(currentIndicator);\n\t}\n\treturn changed;\n}\n\nvoid DecorationList::InsertSpace(int position, int insertLength) {\n\tconst bool atEnd = position == lengthDocument;\n\tlengthDocument += insertLength;\n\tfor (Decoration *deco=root; deco; deco = deco->next) {\n\t\tdeco->rs.InsertSpace(position, insertLength);\n\t\tif (atEnd) {\n\t\t\tdeco->rs.FillRange(position, 0, insertLength);\n\t\t}\n\t}\n}\n\nvoid DecorationList::DeleteRange(int position, int deleteLength) {\n\tlengthDocument -= deleteLength;\n\tDecoration *deco;\n\tfor (deco=root; deco; deco = deco->next) {\n\t\tdeco->rs.DeleteRange(position, deleteLength);\n\t}\n\tDeleteAnyEmpty();\n}\n\nvoid DecorationList::DeleteAnyEmpty() {\n\tDecoration *deco = root;\n\twhile (deco) {\n\t\tif ((lengthDocument == 0) || deco->Empty()) {\n\t\t\tDelete(deco->indicator);\n\t\t\tdeco = root;\n\t\t} else {\n\t\t\tdeco = deco->next;\n\t\t}\n\t}\n}\n\nint DecorationList::AllOnFor(int position) const {\n\tint mask = 0;\n\tfor (Decoration *deco=root; deco; deco = deco->next) {\n\t\tif (deco->rs.ValueAt(position)) {\n\t\t\tmask |= 1 << deco->indicator;\n\t\t}\n\t}\n\treturn mask;\n}\n\nint DecorationList::ValueAt(int indicator, int position) {\n\tDecoration *deco = DecorationFromIndicator(indicator);\n\tif (deco) {\n\t\treturn deco->rs.ValueAt(position);\n\t}\n\treturn 0;\n}\n\nint DecorationList::Start(int indicator, int position) {\n\tDecoration *deco = DecorationFromIndicator(indicator);\n\tif (deco) {\n\t\treturn deco->rs.StartRun(position);\n\t}\n\treturn 0;\n}\n\nint DecorationList::End(int indicator, int position) {\n\tDecoration *deco = DecorationFromIndicator(indicator);\n\tif (deco) {\n\t\treturn deco->rs.EndRun(position);\n\t}\n\treturn 0;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/Decoration.h",
    "content": "/** @file Decoration.h\n ** Visual elements added over text.\n **/\n// Copyright 1998-2007 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef DECORATION_H\n#define DECORATION_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nclass Decoration {\npublic:\n\tDecoration *next;\n\tRunStyles rs;\n\tint indicator;\n\n\tDecoration(int indicator_);\n\t~Decoration();\n\n\tbool Empty() const;\n};\n\nclass DecorationList {\n\tint currentIndicator;\n\tint currentValue;\n\tDecoration *current;\n\tint lengthDocument;\n\tDecoration *DecorationFromIndicator(int indicator);\n\tDecoration *Create(int indicator, int length);\n\tvoid Delete(int indicator);\n\tvoid DeleteAnyEmpty();\npublic:\n\tDecoration *root;\n\tbool clickNotified;\n\n\tDecorationList();\n\t~DecorationList();\n\n\tvoid SetCurrentIndicator(int indicator);\n\tint GetCurrentIndicator() const { return currentIndicator; }\n\n\tvoid SetCurrentValue(int value);\n\tint GetCurrentValue() const { return currentValue; }\n\n\t// Returns true if some values may have changed\n\tbool FillRange(int &position, int value, int &fillLength);\n\n\tvoid InsertSpace(int position, int insertLength);\n\tvoid DeleteRange(int position, int deleteLength);\n\n\tint AllOnFor(int position) const;\n\tint ValueAt(int indicator, int position);\n\tint Start(int indicator, int position);\n\tint End(int indicator, int position);\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/Document.cpp",
    "content": "// Scintilla source code edit control\n/** @file Document.cxx\n ** Text document that handles notifications, DBCS, styling, words and end of line.\n **/\n// Copyright 1998-2011 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <assert.h>\n\n#include <string>\n#include <vector>\n#include <algorithm>\n\n#include \"Platform.h\"\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n\n#include \"SplitVector.h\"\n#include \"Partitioning.h\"\n#include \"RunStyles.h\"\n#include \"CellBuffer.h\"\n#include \"PerLine.h\"\n#include \"CharClassify.h\"\n#include \"CharacterSet.h\"\n#include \"Decoration.h\"\n#include \"CaseFolder.h\"\n#include \"Document.h\"\n#include \"RESearch.h\"\n#include \"UniConversion.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsPunctuation(char ch) {\n\treturn IsASCII(ch) && ispunct(ch);\n}\n\nvoid LexInterface::Colourise(int start, int end) {\n\tif (pdoc && instance && !performingStyle) {\n\t\t// Protect against reentrance, which may occur, for example, when\n\t\t// fold points are discovered while performing styling and the folding\n\t\t// code looks for child lines which may trigger styling.\n\t\tperformingStyle = true;\n\n\t\tint lengthDoc = pdoc->Length();\n\t\tif (end == -1)\n\t\t\tend = lengthDoc;\n\t\tint len = end - start;\n\n\t\tPLATFORM_ASSERT(len >= 0);\n\t\tPLATFORM_ASSERT(start + len <= lengthDoc);\n\n\t\tint styleStart = 0;\n\t\tif (start > 0)\n\t\t\tstyleStart = pdoc->StyleAt(start - 1) & pdoc->stylingBitsMask;\n\n\t\tif (len > 0) {\n\t\t\tinstance->Lex(start, len, styleStart, pdoc);\n\t\t\tinstance->Fold(start, len, styleStart, pdoc);\n\t\t}\n\n\t\tperformingStyle = false;\n\t}\n}\n\nint LexInterface::LineEndTypesSupported() {\n\tif (instance) {\n\t\tint interfaceVersion = instance->Version();\n\t\tif (interfaceVersion >= lvSubStyles) {\n\t\t\tILexerWithSubStyles *ssinstance = static_cast<ILexerWithSubStyles *>(instance);\n\t\t\treturn ssinstance->LineEndTypesSupported();\n\t\t}\n\t}\n\treturn 0;\n}\n\nDocument::Document() {\n\trefCount = 0;\n\tpcf = NULL;\n#ifdef _WIN32\n\teolMode = SC_EOL_CRLF;\n#else\n\teolMode = SC_EOL_LF;\n#endif\n\tdbcsCodePage = 0;\n\tlineEndBitSet = SC_LINE_END_TYPE_DEFAULT;\n\tstylingBits = 5;\n\tstylingBitsMask = 0x1F;\n\tstylingMask = 0;\n\tendStyled = 0;\n\tstyleClock = 0;\n\tenteredModification = 0;\n\tenteredStyling = 0;\n\tenteredReadOnlyCount = 0;\n\ttabInChars = 8;\n\tindentInChars = 0;\n\tactualIndentInChars = 8;\n\tuseTabs = true;\n\ttabIndents = true;\n\tbackspaceUnindents = false;\n\n\tmatchesValid = false;\n\tregex = 0;\n\n\tUTF8BytesOfLeadInitialise();\n\n\tperLineData[ldMarkers] = new LineMarkers();\n\tperLineData[ldLevels] = new LineLevels();\n\tperLineData[ldState] = new LineState();\n\tperLineData[ldMargin] = new LineAnnotation();\n\tperLineData[ldAnnotation] = new LineAnnotation();\n\n\tcb.SetPerLine(this);\n\n\tpli = 0;\n}\n\nDocument::~Document() {\n\tfor (std::vector<WatcherWithUserData>::iterator it = watchers.begin(); it != watchers.end(); ++it) {\n\t\tit->watcher->NotifyDeleted(this, it->userData);\n\t}\n\tfor (int j=0; j<ldSize; j++) {\n\t\tdelete perLineData[j];\n\t\tperLineData[j] = 0;\n\t}\n\tdelete regex;\n\tregex = 0;\n\tdelete pli;\n\tpli = 0;\n\tdelete pcf;\n\tpcf = 0;\n}\n\nvoid Document::Init() {\n\tfor (int j=0; j<ldSize; j++) {\n\t\tif (perLineData[j])\n\t\t\tperLineData[j]->Init();\n\t}\n}\n\nint Document::LineEndTypesSupported() const {\n\tif ((SC_CP_UTF8 == dbcsCodePage) && pli)\n\t\treturn pli->LineEndTypesSupported();\n\telse\n\t\treturn 0;\n}\n\nbool Document::SetDBCSCodePage(int dbcsCodePage_) {\n\tif (dbcsCodePage != dbcsCodePage_) {\n\t\tdbcsCodePage = dbcsCodePage_;\n\t\tSetCaseFolder(NULL);\n\t\tcb.SetLineEndTypes(lineEndBitSet & LineEndTypesSupported());\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n}\n\nbool Document::SetLineEndTypesAllowed(int lineEndBitSet_) {\n\tif (lineEndBitSet != lineEndBitSet_) {\n\t\tlineEndBitSet = lineEndBitSet_;\n\t\tint lineEndBitSetActive = lineEndBitSet & LineEndTypesSupported();\n\t\tif (lineEndBitSetActive != cb.GetLineEndTypes()) {\n\t\t\tModifiedAt(0);\n\t\t\tcb.SetLineEndTypes(lineEndBitSetActive);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\treturn false;\n\t}\n}\n\nvoid Document::InsertLine(int line) {\n\tfor (int j=0; j<ldSize; j++) {\n\t\tif (perLineData[j])\n\t\t\tperLineData[j]->InsertLine(line);\n\t}\n}\n\nvoid Document::RemoveLine(int line) {\n\tfor (int j=0; j<ldSize; j++) {\n\t\tif (perLineData[j])\n\t\t\tperLineData[j]->RemoveLine(line);\n\t}\n}\n\n// Increase reference count and return its previous value.\nint Document::AddRef() {\n\treturn refCount++;\n}\n\n// Decrease reference count and return its previous value.\n// Delete the document if reference count reaches zero.\nint SCI_METHOD Document::Release() {\n\tint curRefCount = --refCount;\n\tif (curRefCount == 0)\n\t\tdelete this;\n\treturn curRefCount;\n}\n\nvoid Document::SetSavePoint() {\n\tcb.SetSavePoint();\n\tNotifySavePoint(true);\n}\n\nint Document::GetMark(int line) {\n\treturn static_cast<LineMarkers *>(perLineData[ldMarkers])->MarkValue(line);\n}\n\nint Document::MarkerNext(int lineStart, int mask) const {\n\treturn static_cast<LineMarkers *>(perLineData[ldMarkers])->MarkerNext(lineStart, mask);\n}\n\nint Document::AddMark(int line, int markerNum) {\n\tif (line >= 0 && line <= LinesTotal()) {\n\t\tint prev = static_cast<LineMarkers *>(perLineData[ldMarkers])->\n\t\t\tAddMark(line, markerNum, LinesTotal());\n\t\tDocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line);\n\t\tNotifyModified(mh);\n\t\treturn prev;\n\t} else {\n\t\treturn 0;\n\t}\n}\n\nvoid Document::AddMarkSet(int line, int valueSet) {\n\tif (line < 0 || line > LinesTotal()) {\n\t\treturn;\n\t}\n\tunsigned int m = valueSet;\n\tfor (int i = 0; m; i++, m >>= 1)\n\t\tif (m & 1)\n\t\t\tstatic_cast<LineMarkers *>(perLineData[ldMarkers])->\n\t\t\t\tAddMark(line, i, LinesTotal());\n\tDocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line);\n\tNotifyModified(mh);\n}\n\nvoid Document::DeleteMark(int line, int markerNum) {\n\tstatic_cast<LineMarkers *>(perLineData[ldMarkers])->DeleteMark(line, markerNum, false);\n\tDocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line);\n\tNotifyModified(mh);\n}\n\nvoid Document::DeleteMarkFromHandle(int markerHandle) {\n\tstatic_cast<LineMarkers *>(perLineData[ldMarkers])->DeleteMarkFromHandle(markerHandle);\n\tDocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0);\n\tmh.line = -1;\n\tNotifyModified(mh);\n}\n\nvoid Document::DeleteAllMarks(int markerNum) {\n\tbool someChanges = false;\n\tfor (int line = 0; line < LinesTotal(); line++) {\n\t\tif (static_cast<LineMarkers *>(perLineData[ldMarkers])->DeleteMark(line, markerNum, true))\n\t\t\tsomeChanges = true;\n\t}\n\tif (someChanges) {\n\t\tDocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0);\n\t\tmh.line = -1;\n\t\tNotifyModified(mh);\n\t}\n}\n\nint Document::LineFromHandle(int markerHandle) {\n\treturn static_cast<LineMarkers *>(perLineData[ldMarkers])->LineFromHandle(markerHandle);\n}\n\nint SCI_METHOD Document::LineStart(int line) const {\n\treturn cb.LineStart(line);\n}\n\nint SCI_METHOD Document::LineEnd(int line) const {\n\tif (line >= LinesTotal() - 1) {\n\t\treturn LineStart(line + 1);\n\t} else {\n\t\tint position = LineStart(line + 1);\n\t\tif (SC_CP_UTF8 == dbcsCodePage) {\n\t\t\tunsigned char bytes[] = {\n\t\t\t\tstatic_cast<unsigned char>(cb.CharAt(position-3)),\n\t\t\t\tstatic_cast<unsigned char>(cb.CharAt(position-2)),\n\t\t\t\tstatic_cast<unsigned char>(cb.CharAt(position-1)),\n\t\t\t};\n\t\t\tif (UTF8IsSeparator(bytes)) {\n\t\t\t\treturn position - UTF8SeparatorLength;\n\t\t\t}\n\t\t\tif (UTF8IsNEL(bytes+1)) {\n\t\t\t\treturn position - UTF8NELLength;\n\t\t\t}\n\t\t}\n\t\tposition--; // Back over CR or LF\n\t\t// When line terminator is CR+LF, may need to go back one more\n\t\tif ((position > LineStart(line)) && (cb.CharAt(position - 1) == '\\r')) {\n\t\t\tposition--;\n\t\t}\n\t\treturn position;\n\t}\n}\n\nvoid SCI_METHOD Document::SetErrorStatus(int status) {\n\t// Tell the watchers an error has occurred.\n\tfor (std::vector<WatcherWithUserData>::iterator it = watchers.begin(); it != watchers.end(); ++it) {\n\t\tit->watcher->NotifyErrorOccurred(this, it->userData, status);\n\t}\n}\n\nint SCI_METHOD Document::LineFromPosition(int pos) const {\n\treturn cb.LineFromPosition(pos);\n}\n\nint Document::LineEndPosition(int position) const {\n\treturn LineEnd(LineFromPosition(position));\n}\n\nbool Document::IsLineEndPosition(int position) const {\n\treturn LineEnd(LineFromPosition(position)) == position;\n}\n\nbool Document::IsPositionInLineEnd(int position) const {\n\treturn position >= LineEnd(LineFromPosition(position));\n}\n\nint Document::VCHomePosition(int position) const {\n\tint line = LineFromPosition(position);\n\tint startPosition = LineStart(line);\n\tint endLine = LineEnd(line);\n\tint startText = startPosition;\n\twhile (startText < endLine && (cb.CharAt(startText) == ' ' || cb.CharAt(startText) == '\\t'))\n\t\tstartText++;\n\tif (position == startText)\n\t\treturn startPosition;\n\telse\n\t\treturn startText;\n}\n\nint SCI_METHOD Document::SetLevel(int line, int level) {\n\tint prev = static_cast<LineLevels *>(perLineData[ldLevels])->SetLevel(line, level, LinesTotal());\n\tif (prev != level) {\n\t\tDocModification mh(SC_MOD_CHANGEFOLD | SC_MOD_CHANGEMARKER,\n\t\t                   LineStart(line), 0, 0, 0, line);\n\t\tmh.foldLevelNow = level;\n\t\tmh.foldLevelPrev = prev;\n\t\tNotifyModified(mh);\n\t}\n\treturn prev;\n}\n\nint SCI_METHOD Document::GetLevel(int line) const {\n\treturn static_cast<LineLevels *>(perLineData[ldLevels])->GetLevel(line);\n}\n\nvoid Document::ClearLevels() {\n\tstatic_cast<LineLevels *>(perLineData[ldLevels])->ClearLevels();\n}\n\nstatic bool IsSubordinate(int levelStart, int levelTry) {\n\tif (levelTry & SC_FOLDLEVELWHITEFLAG)\n\t\treturn true;\n\telse\n\t\treturn (levelStart & SC_FOLDLEVELNUMBERMASK) < (levelTry & SC_FOLDLEVELNUMBERMASK);\n}\n\nint Document::GetLastChild(int lineParent, int level, int lastLine) {\n\tif (level == -1)\n\t\tlevel = GetLevel(lineParent) & SC_FOLDLEVELNUMBERMASK;\n\tint maxLine = LinesTotal();\n\tint lookLastLine = (lastLine != -1) ? Platform::Minimum(LinesTotal() - 1, lastLine) : -1;\n\tint lineMaxSubord = lineParent;\n\twhile (lineMaxSubord < maxLine - 1) {\n\t\tEnsureStyledTo(LineStart(lineMaxSubord + 2));\n\t\tif (!IsSubordinate(level, GetLevel(lineMaxSubord + 1)))\n\t\t\tbreak;\n\t\tif ((lookLastLine != -1) && (lineMaxSubord >= lookLastLine) && !(GetLevel(lineMaxSubord) & SC_FOLDLEVELWHITEFLAG))\n\t\t\tbreak;\n\t\tlineMaxSubord++;\n\t}\n\tif (lineMaxSubord > lineParent) {\n\t\tif (level > (GetLevel(lineMaxSubord + 1) & SC_FOLDLEVELNUMBERMASK)) {\n\t\t\t// Have chewed up some whitespace that belongs to a parent so seek back\n\t\t\tif (GetLevel(lineMaxSubord) & SC_FOLDLEVELWHITEFLAG) {\n\t\t\t\tlineMaxSubord--;\n\t\t\t}\n\t\t}\n\t}\n\treturn lineMaxSubord;\n}\n\nint Document::GetFoldParent(int line) const {\n\tint level = GetLevel(line) & SC_FOLDLEVELNUMBERMASK;\n\tint lineLook = line - 1;\n\twhile ((lineLook > 0) && (\n\t            (!(GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG)) ||\n\t            ((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) >= level))\n\t      ) {\n\t\tlineLook--;\n\t}\n\tif ((GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG) &&\n\t        ((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) < level)) {\n\t\treturn lineLook;\n\t} else {\n\t\treturn -1;\n\t}\n}\n\nvoid Document::GetHighlightDelimiters(HighlightDelimiter &highlightDelimiter, int line, int lastLine) {\n\tint level = GetLevel(line);\n\tint lookLastLine = Platform::Maximum(line, lastLine) + 1;\n\n\tint lookLine = line;\n\tint lookLineLevel = level;\n\tint lookLineLevelNum = lookLineLevel & SC_FOLDLEVELNUMBERMASK;\n\twhile ((lookLine > 0) && ((lookLineLevel & SC_FOLDLEVELWHITEFLAG) ||\n\t\t((lookLineLevel & SC_FOLDLEVELHEADERFLAG) && (lookLineLevelNum >= (GetLevel(lookLine + 1) & SC_FOLDLEVELNUMBERMASK))))) {\n\t\tlookLineLevel = GetLevel(--lookLine);\n\t\tlookLineLevelNum = lookLineLevel & SC_FOLDLEVELNUMBERMASK;\n\t}\n\n\tint beginFoldBlock = (lookLineLevel & SC_FOLDLEVELHEADERFLAG) ? lookLine : GetFoldParent(lookLine);\n\tif (beginFoldBlock == -1) {\n\t\thighlightDelimiter.Clear();\n\t\treturn;\n\t}\n\n\tint endFoldBlock = GetLastChild(beginFoldBlock, -1, lookLastLine);\n\tint firstChangeableLineBefore = -1;\n\tif (endFoldBlock < line) {\n\t\tlookLine = beginFoldBlock - 1;\n\t\tlookLineLevel = GetLevel(lookLine);\n\t\tlookLineLevelNum = lookLineLevel & SC_FOLDLEVELNUMBERMASK;\n\t\twhile ((lookLine >= 0) && (lookLineLevelNum >= SC_FOLDLEVELBASE)) {\n\t\t\tif (lookLineLevel & SC_FOLDLEVELHEADERFLAG) {\n\t\t\t\tif (GetLastChild(lookLine, -1, lookLastLine) == line) {\n\t\t\t\t\tbeginFoldBlock = lookLine;\n\t\t\t\t\tendFoldBlock = line;\n\t\t\t\t\tfirstChangeableLineBefore = line - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((lookLine > 0) && (lookLineLevelNum == SC_FOLDLEVELBASE) && ((GetLevel(lookLine - 1) & SC_FOLDLEVELNUMBERMASK) > lookLineLevelNum))\n\t\t\t\tbreak;\n\t\t\tlookLineLevel = GetLevel(--lookLine);\n\t\t\tlookLineLevelNum = lookLineLevel & SC_FOLDLEVELNUMBERMASK;\n\t\t}\n\t}\n\tif (firstChangeableLineBefore == -1) {\n\t\tfor (lookLine = line - 1, lookLineLevel = GetLevel(lookLine), lookLineLevelNum = lookLineLevel & SC_FOLDLEVELNUMBERMASK;\n\t\t\tlookLine >= beginFoldBlock;\n\t\t\tlookLineLevel = GetLevel(--lookLine), lookLineLevelNum = lookLineLevel & SC_FOLDLEVELNUMBERMASK) {\n\t\t\tif ((lookLineLevel & SC_FOLDLEVELWHITEFLAG) || (lookLineLevelNum > (level & SC_FOLDLEVELNUMBERMASK))) {\n\t\t\t\tfirstChangeableLineBefore = lookLine;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (firstChangeableLineBefore == -1)\n\t\tfirstChangeableLineBefore = beginFoldBlock - 1;\n\n\tint firstChangeableLineAfter = -1;\n\tfor (lookLine = line + 1, lookLineLevel = GetLevel(lookLine), lookLineLevelNum = lookLineLevel & SC_FOLDLEVELNUMBERMASK;\n\t\tlookLine <= endFoldBlock;\n\t\tlookLineLevel = GetLevel(++lookLine), lookLineLevelNum = lookLineLevel & SC_FOLDLEVELNUMBERMASK) {\n\t\tif ((lookLineLevel & SC_FOLDLEVELHEADERFLAG) && (lookLineLevelNum < (GetLevel(lookLine + 1) & SC_FOLDLEVELNUMBERMASK))) {\n\t\t\tfirstChangeableLineAfter = lookLine;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (firstChangeableLineAfter == -1)\n\t\tfirstChangeableLineAfter = endFoldBlock + 1;\n\n\thighlightDelimiter.beginFoldBlock = beginFoldBlock;\n\thighlightDelimiter.endFoldBlock = endFoldBlock;\n\thighlightDelimiter.firstChangeableLineBefore = firstChangeableLineBefore;\n\thighlightDelimiter.firstChangeableLineAfter = firstChangeableLineAfter;\n}\n\nint Document::ClampPositionIntoDocument(int pos) const {\n\treturn Platform::Clamp(pos, 0, Length());\n}\n\nbool Document::IsCrLf(int pos) const {\n\tif (pos < 0)\n\t\treturn false;\n\tif (pos >= (Length() - 1))\n\t\treturn false;\n\treturn (cb.CharAt(pos) == '\\r') && (cb.CharAt(pos + 1) == '\\n');\n}\n\nint Document::LenChar(int pos) {\n\tif (pos < 0) {\n\t\treturn 1;\n\t} else if (IsCrLf(pos)) {\n\t\treturn 2;\n\t} else if (SC_CP_UTF8 == dbcsCodePage) {\n\t\tconst unsigned char leadByte = static_cast<unsigned char>(cb.CharAt(pos));\n\t\tconst int widthCharBytes = UTF8BytesOfLead[leadByte];\n\t\tint lengthDoc = Length();\n\t\tif ((pos + widthCharBytes) > lengthDoc)\n\t\t\treturn lengthDoc - pos;\n\t\telse\n\t\t\treturn widthCharBytes;\n\t} else if (dbcsCodePage) {\n\t\treturn IsDBCSLeadByte(cb.CharAt(pos)) ? 2 : 1;\n\t} else {\n\t\treturn 1;\n\t}\n}\n\nbool Document::InGoodUTF8(int pos, int &start, int &end) const {\n\tint trail = pos;\n\twhile ((trail>0) && (pos-trail < UTF8MaxBytes) && UTF8IsTrailByte(static_cast<unsigned char>(cb.CharAt(trail-1))))\n\t\ttrail--;\n\tstart = (trail > 0) ? trail-1 : trail;\n\n\tconst unsigned char leadByte = static_cast<unsigned char>(cb.CharAt(start));\n\tconst int widthCharBytes = UTF8BytesOfLead[leadByte];\n\tif (widthCharBytes == 1) {\n\t\treturn false;\n\t} else {\n\t\tint trailBytes = widthCharBytes - 1;\n\t\tint len = pos - start;\n\t\tif (len > trailBytes)\n\t\t\t// pos too far from lead\n\t\t\treturn false;\n\t\tchar charBytes[UTF8MaxBytes] = {static_cast<char>(leadByte),0,0,0};\n\t\tfor (int b=1; b<widthCharBytes && ((start+b) < Length()); b++)\n\t\t\tcharBytes[b] = cb.CharAt(static_cast<int>(start+b));\n\t\tint utf8status = UTF8Classify(reinterpret_cast<const unsigned char *>(charBytes), widthCharBytes);\n\t\tif (utf8status & UTF8MaskInvalid)\n\t\t\treturn false;\n\t\tend = start + widthCharBytes;\n\t\treturn true;\n\t}\n}\n\n// Normalise a position so that it is not halfway through a two byte character.\n// This can occur in two situations -\n// When lines are terminated with \\r\\n pairs which should be treated as one character.\n// When displaying DBCS text such as Japanese.\n// If moving, move the position in the indicated direction.\nint Document::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) {\n\t//Platform::DebugPrintf(\"NoCRLF %d %d\\n\", pos, moveDir);\n\t// If out of range, just return minimum/maximum value.\n\tif (pos <= 0)\n\t\treturn 0;\n\tif (pos >= Length())\n\t\treturn Length();\n\n\t// PLATFORM_ASSERT(pos > 0 && pos < Length());\n\tif (checkLineEnd && IsCrLf(pos - 1)) {\n\t\tif (moveDir > 0)\n\t\t\treturn pos + 1;\n\t\telse\n\t\t\treturn pos - 1;\n\t}\n\n\tif (dbcsCodePage) {\n\t\tif (SC_CP_UTF8 == dbcsCodePage) {\n\t\t\tunsigned char ch = static_cast<unsigned char>(cb.CharAt(pos));\n\t\t\t// If ch is not a trail byte then pos is valid intercharacter position\n\t\t\tif (UTF8IsTrailByte(ch)) {\n\t\t\t\tint startUTF = pos;\n\t\t\t\tint endUTF = pos;\n\t\t\t\tif (InGoodUTF8(pos, startUTF, endUTF)) {\n\t\t\t\t\t// ch is a trail byte within a UTF-8 character\n\t\t\t\t\tif (moveDir > 0)\n\t\t\t\t\t\tpos = endUTF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpos = startUTF;\n\t\t\t\t}\n\t\t\t\t// Else invalid UTF-8 so return position of isolated trail byte\n\t\t\t}\n\t\t} else {\n\t\t\t// Anchor DBCS calculations at start of line because start of line can\n\t\t\t// not be a DBCS trail byte.\n\t\t\tint posStartLine = LineStart(LineFromPosition(pos));\n\t\t\tif (pos == posStartLine)\n\t\t\t\treturn pos;\n\n\t\t\t// Step back until a non-lead-byte is found.\n\t\t\tint posCheck = pos;\n\t\t\twhile ((posCheck > posStartLine) && IsDBCSLeadByte(cb.CharAt(posCheck-1)))\n\t\t\t\tposCheck--;\n\n\t\t\t// Check from known start of character.\n\t\t\twhile (posCheck < pos) {\n\t\t\t\tint mbsize = IsDBCSLeadByte(cb.CharAt(posCheck)) ? 2 : 1;\n\t\t\t\tif (posCheck + mbsize == pos) {\n\t\t\t\t\treturn pos;\n\t\t\t\t} else if (posCheck + mbsize > pos) {\n\t\t\t\t\tif (moveDir > 0) {\n\t\t\t\t\t\treturn posCheck + mbsize;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn posCheck;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tposCheck += mbsize;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn pos;\n}\n\n// NextPosition moves between valid positions - it can not handle a position in the middle of a\n// multi-byte character. It is used to iterate through text more efficiently than MovePositionOutsideChar.\n// A \\r\\n pair is treated as two characters.\nint Document::NextPosition(int pos, int moveDir) const {\n\t// If out of range, just return minimum/maximum value.\n\tint increment = (moveDir > 0) ? 1 : -1;\n\tif (pos + increment <= 0)\n\t\treturn 0;\n\tif (pos + increment >= Length())\n\t\treturn Length();\n\n\tif (dbcsCodePage) {\n\t\tif (SC_CP_UTF8 == dbcsCodePage) {\n\t\t\tif (increment == 1) {\n\t\t\t\t// Simple forward movement case so can avoid some checks\n\t\t\t\tconst unsigned char leadByte = static_cast<unsigned char>(cb.CharAt(pos));\n\t\t\t\tif (UTF8IsAscii(leadByte)) {\n\t\t\t\t\t// Single byte character or invalid\n\t\t\t\t\tpos++;\n\t\t\t\t} else {\n\t\t\t\t\tconst int widthCharBytes = UTF8BytesOfLead[leadByte];\n\t\t\t\t\tchar charBytes[UTF8MaxBytes] = {static_cast<char>(leadByte),0,0,0};\n\t\t\t\t\tfor (int b=1; b<widthCharBytes; b++)\n\t\t\t\t\t\tcharBytes[b] = cb.CharAt(static_cast<int>(pos+b));\n\t\t\t\t\tint utf8status = UTF8Classify(reinterpret_cast<const unsigned char *>(charBytes), widthCharBytes);\n\t\t\t\t\tif (utf8status & UTF8MaskInvalid)\n\t\t\t\t\t\tpos++;\n\t\t\t\t\telse\n\t\t\t\t\t\tpos += utf8status & UTF8MaskWidth;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Examine byte before position\n\t\t\t\tpos--;\n\t\t\t\tunsigned char ch = static_cast<unsigned char>(cb.CharAt(pos));\n\t\t\t\t// If ch is not a trail byte then pos is valid intercharacter position\n\t\t\t\tif (UTF8IsTrailByte(ch)) {\n\t\t\t\t\t// If ch is a trail byte in a valid UTF-8 character then return start of character\n\t\t\t\t\tint startUTF = pos;\n\t\t\t\t\tint endUTF = pos;\n\t\t\t\t\tif (InGoodUTF8(pos, startUTF, endUTF)) {\n\t\t\t\t\t\tpos = startUTF;\n\t\t\t\t\t}\n\t\t\t\t\t// Else invalid UTF-8 so return position of isolated trail byte\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (moveDir > 0) {\n\t\t\t\tint mbsize = IsDBCSLeadByte(cb.CharAt(pos)) ? 2 : 1;\n\t\t\t\tpos += mbsize;\n\t\t\t\tif (pos > Length())\n\t\t\t\t\tpos = Length();\n\t\t\t} else {\n\t\t\t\t// Anchor DBCS calculations at start of line because start of line can\n\t\t\t\t// not be a DBCS trail byte.\n\t\t\t\tint posStartLine = LineStart(LineFromPosition(pos));\n\t\t\t\t// See http://msdn.microsoft.com/en-us/library/cc194792%28v=MSDN.10%29.aspx\n\t\t\t\t// http://msdn.microsoft.com/en-us/library/cc194790.aspx\n\t\t\t\tif ((pos - 1) <= posStartLine) {\n\t\t\t\t\treturn pos - 1;\n\t\t\t\t} else if (IsDBCSLeadByte(cb.CharAt(pos - 1))) {\n\t\t\t\t\t// Must actually be trail byte\n\t\t\t\t\treturn pos - 2;\n\t\t\t\t} else {\n\t\t\t\t\t// Otherwise, step back until a non-lead-byte is found.\n\t\t\t\t\tint posTemp = pos - 1;\n\t\t\t\t\twhile (posStartLine <= --posTemp && IsDBCSLeadByte(cb.CharAt(posTemp)))\n\t\t\t\t\t\t;\n\t\t\t\t\t// Now posTemp+1 must point to the beginning of a character,\n\t\t\t\t\t// so figure out whether we went back an even or an odd\n\t\t\t\t\t// number of bytes and go back 1 or 2 bytes, respectively.\n\t\t\t\t\treturn (pos - 1 - ((pos - posTemp) & 1));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tpos += increment;\n\t}\n\n\treturn pos;\n}\n\nbool Document::NextCharacter(int &pos, int moveDir) const {\n\t// Returns true if pos changed\n\tint posNext = NextPosition(pos, moveDir);\n\tif (posNext == pos) {\n\t\treturn false;\n\t} else {\n\t\tpos = posNext;\n\t\treturn true;\n\t}\n}\n\nstatic inline int UnicodeFromBytes(const unsigned char *us) {\n\tif (us[0] < 0xC2) {\n\t\treturn us[0];\n\t} else if (us[0] < 0xE0) {\n\t\treturn ((us[0] & 0x1F) << 6) + (us[1] & 0x3F);\n\t} else if (us[0] < 0xF0) {\n\t\treturn ((us[0] & 0xF) << 12) + ((us[1] & 0x3F) << 6) + (us[2] & 0x3F);\n\t} else if (us[0] < 0xF5) {\n\t\treturn ((us[0] & 0x7) << 18) + ((us[1] & 0x3F) << 12) + ((us[2] & 0x3F) << 6) + (us[3] & 0x3F);\n\t}\n\treturn us[0];\n}\n\n// Return -1  on out-of-bounds\nint SCI_METHOD Document::GetRelativePosition(int positionStart, int characterOffset) const {\n\tint pos = positionStart;\n\tif (dbcsCodePage) {\n\t\tconst int increment = (characterOffset > 0) ? 1 : -1;\n\t\twhile (characterOffset != 0) {\n\t\t\tconst int posNext = NextPosition(pos, increment);\n\t\t\tif (posNext == pos)\n\t\t\t\treturn INVALID_POSITION;\n\t\t\tpos = posNext;\n\t\t\tcharacterOffset -= increment;\n\t\t}\n\t} else {\n\t\tpos = positionStart + characterOffset;\n\t\tif ((pos < 0) || (pos > Length()))\n\t\t\treturn INVALID_POSITION;\n\t}\n\treturn pos;\n}\n\nint SCI_METHOD Document::GetCharacterAndWidth(int position, int *pWidth) const {\n\tint character;\n\tint bytesInCharacter = 1;\n\tif (dbcsCodePage) {\n\t\tconst unsigned char leadByte = static_cast<unsigned char>(cb.CharAt(position));\n\t\tif (SC_CP_UTF8 == dbcsCodePage) {\n\t\t\tif (UTF8IsAscii(leadByte)) {\n\t\t\t\t// Single byte character or invalid\n\t\t\t\tcharacter =  leadByte;\n\t\t\t} else {\n\t\t\t\tconst int widthCharBytes = UTF8BytesOfLead[leadByte];\n\t\t\t\tunsigned char charBytes[UTF8MaxBytes] = {leadByte,0,0,0};\n\t\t\t\tfor (int b=1; b<widthCharBytes; b++)\n\t\t\t\t\tcharBytes[b] = static_cast<unsigned char>(cb.CharAt(position+b));\n\t\t\t\tint utf8status = UTF8Classify(charBytes, widthCharBytes);\n\t\t\t\tif (utf8status & UTF8MaskInvalid) {\n\t\t\t\t\t// Report as singleton surrogate values which are invalid Unicode\n\t\t\t\t\tcharacter =  0xDC80 + leadByte;\n\t\t\t\t} else {\n\t\t\t\t\tbytesInCharacter = utf8status & UTF8MaskWidth;\n\t\t\t\t\tcharacter = UnicodeFromBytes(charBytes);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (IsDBCSLeadByte(leadByte)) {\n\t\t\t\tbytesInCharacter = 2;\n\t\t\t\tcharacter = (leadByte << 8) | static_cast<unsigned char>(cb.CharAt(position+1));\n\t\t\t} else {\n\t\t\t\tcharacter = leadByte;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tcharacter = cb.CharAt(position);\n\t}\n\tif (pWidth) {\n\t\t*pWidth = bytesInCharacter;\n\t}\n\treturn character;\n}\n\nint SCI_METHOD Document::CodePage() const {\n\treturn dbcsCodePage;\n}\n\nbool SCI_METHOD Document::IsDBCSLeadByte(char ch) const {\n\t// Byte ranges found in Wikipedia articles with relevant search strings in each case\n\tunsigned char uch = static_cast<unsigned char>(ch);\n\tswitch (dbcsCodePage) {\n\t\tcase 932:\n\t\t\t// Shift_jis\n\t\t\treturn ((uch >= 0x81) && (uch <= 0x9F)) ||\n\t\t\t\t((uch >= 0xE0) && (uch <= 0xFC));\n\t\t\t\t// Lead bytes F0 to FC may be a Microsoft addition.\n\t\tcase 936:\n\t\t\t// GBK\n\t\t\treturn (uch >= 0x81) && (uch <= 0xFE);\n\t\tcase 949:\n\t\t\t// Korean Wansung KS C-5601-1987\n\t\t\treturn (uch >= 0x81) && (uch <= 0xFE);\n\t\tcase 950:\n\t\t\t// Big5\n\t\t\treturn (uch >= 0x81) && (uch <= 0xFE);\n\t\tcase 1361:\n\t\t\t// Korean Johab KS C-5601-1992\n\t\t\treturn\n\t\t\t\t((uch >= 0x84) && (uch <= 0xD3)) ||\n\t\t\t\t((uch >= 0xD8) && (uch <= 0xDE)) ||\n\t\t\t\t((uch >= 0xE0) && (uch <= 0xF9));\n\t}\n\treturn false;\n}\n\nstatic inline bool IsSpaceOrTab(int ch) {\n\treturn ch == ' ' || ch == '\\t';\n}\n\n// Need to break text into segments near lengthSegment but taking into\n// account the encoding to not break inside a UTF-8 or DBCS character\n// and also trying to avoid breaking inside a pair of combining characters.\n// The segment length must always be long enough (more than 4 bytes)\n// so that there will be at least one whole character to make a segment.\n// For UTF-8, text must consist only of valid whole characters.\n// In preference order from best to worst:\n//   1) Break after space\n//   2) Break before punctuation\n//   3) Break after whole character\n\nint Document::SafeSegment(const char *text, int length, int lengthSegment) const {\n\tif (length <= lengthSegment)\n\t\treturn length;\n\tint lastSpaceBreak = -1;\n\tint lastPunctuationBreak = -1;\n\tint lastEncodingAllowedBreak = 0;\n\tfor (int j=0; j < lengthSegment;) {\n\t\tunsigned char ch = static_cast<unsigned char>(text[j]);\n\t\tif (j > 0) {\n\t\t\tif (IsSpaceOrTab(text[j - 1]) && !IsSpaceOrTab(text[j])) {\n\t\t\t\tlastSpaceBreak = j;\n\t\t\t}\n\t\t\tif (ch < 'A') {\n\t\t\t\tlastPunctuationBreak = j;\n\t\t\t}\n\t\t}\n\t\tlastEncodingAllowedBreak = j;\n\n\t\tif (dbcsCodePage == SC_CP_UTF8) {\n\t\t\tj += UTF8BytesOfLead[ch];\n\t\t} else if (dbcsCodePage) {\n\t\t\tj += IsDBCSLeadByte(ch) ? 2 : 1;\n\t\t} else {\n\t\t\tj++;\n\t\t}\n\t}\n\tif (lastSpaceBreak >= 0) {\n\t\treturn lastSpaceBreak;\n\t} else if (lastPunctuationBreak >= 0) {\n\t\treturn lastPunctuationBreak;\n\t}\n\treturn lastEncodingAllowedBreak;\n}\n\nEncodingFamily Document::CodePageFamily() const {\n\tif (SC_CP_UTF8 == dbcsCodePage)\n\t\treturn efUnicode;\n\telse if (dbcsCodePage)\n\t\treturn efDBCS;\n\telse\n\t\treturn efEightBit;\n}\n\nvoid Document::ModifiedAt(int pos) {\n\tif (endStyled > pos)\n\t\tendStyled = pos;\n}\n\nvoid Document::CheckReadOnly() {\n\tif (cb.IsReadOnly() && enteredReadOnlyCount == 0) {\n\t\tenteredReadOnlyCount++;\n\t\tNotifyModifyAttempt();\n\t\tenteredReadOnlyCount--;\n\t}\n}\n\n// Document only modified by gateways DeleteChars, InsertString, Undo, Redo, and SetStyleAt.\n// SetStyleAt does not change the persistent state of a document\n\nbool Document::DeleteChars(int pos, int len) {\n\tif (len <= 0)\n\t\treturn false;\n\tif ((pos + len) > Length())\n\t\treturn false;\n\tCheckReadOnly();\n\tif (enteredModification != 0) {\n\t\treturn false;\n\t} else {\n\t\tenteredModification++;\n\t\tif (!cb.IsReadOnly()) {\n\t\t\tNotifyModified(\n\t\t\t    DocModification(\n\t\t\t        SC_MOD_BEFOREDELETE | SC_PERFORMED_USER,\n\t\t\t        pos, len,\n\t\t\t        0, 0));\n\t\t\tint prevLinesTotal = LinesTotal();\n\t\t\tbool startSavePoint = cb.IsSavePoint();\n\t\t\tbool startSequence = false;\n\t\t\tconst char *text = cb.DeleteChars(pos, len, startSequence);\n\t\t\tif (startSavePoint && cb.IsCollectingUndo())\n\t\t\t\tNotifySavePoint(!startSavePoint);\n\t\t\tif ((pos < Length()) || (pos == 0))\n\t\t\t\tModifiedAt(pos);\n\t\t\telse\n\t\t\t\tModifiedAt(pos-1);\n\t\t\tNotifyModified(\n\t\t\t    DocModification(\n\t\t\t        SC_MOD_DELETETEXT | SC_PERFORMED_USER | (startSequence?SC_STARTACTION:0),\n\t\t\t        pos, len,\n\t\t\t        LinesTotal() - prevLinesTotal, text));\n\t\t}\n\t\tenteredModification--;\n\t}\n\treturn !cb.IsReadOnly();\n}\n\n/**\n * Insert a string with a length.\n */\nbool Document::InsertString(int position, const char *s, int insertLength) {\n\tif (insertLength <= 0) {\n\t\treturn false;\n\t}\n\tCheckReadOnly();\n\tif (enteredModification != 0) {\n\t\treturn false;\n\t} else {\n\t\tenteredModification++;\n\t\tif (!cb.IsReadOnly()) {\n\t\t\tNotifyModified(\n\t\t\t    DocModification(\n\t\t\t        SC_MOD_BEFOREINSERT | SC_PERFORMED_USER,\n\t\t\t        position, insertLength,\n\t\t\t        0, s));\n\t\t\tint prevLinesTotal = LinesTotal();\n\t\t\tbool startSavePoint = cb.IsSavePoint();\n\t\t\tbool startSequence = false;\n\t\t\tconst char *text = cb.InsertString(position, s, insertLength, startSequence);\n\t\t\tif (startSavePoint && cb.IsCollectingUndo())\n\t\t\t\tNotifySavePoint(!startSavePoint);\n\t\t\tModifiedAt(position);\n\t\t\tNotifyModified(\n\t\t\t    DocModification(\n\t\t\t        SC_MOD_INSERTTEXT | SC_PERFORMED_USER | (startSequence?SC_STARTACTION:0),\n\t\t\t        position, insertLength,\n\t\t\t        LinesTotal() - prevLinesTotal, text));\n\t\t}\n\t\tenteredModification--;\n\t}\n\treturn !cb.IsReadOnly();\n}\n\nint SCI_METHOD Document::AddData(char *data, int length) {\n\ttry {\n\t\tint position = Length();\n\t\tInsertString(position,data, length);\n\t} catch (std::bad_alloc &) {\n\t\treturn SC_STATUS_BADALLOC;\n\t} catch (...) {\n\t\treturn SC_STATUS_FAILURE;\n\t}\n\treturn 0;\n}\n\nvoid * SCI_METHOD Document::ConvertToDocument() {\n\treturn this;\n}\n\nint Document::Undo() {\n\tint newPos = -1;\n\tCheckReadOnly();\n\tif ((enteredModification == 0) && (cb.IsCollectingUndo())) {\n\t\tenteredModification++;\n\t\tif (!cb.IsReadOnly()) {\n\t\t\tbool startSavePoint = cb.IsSavePoint();\n\t\t\tbool multiLine = false;\n\t\t\tint steps = cb.StartUndo();\n\t\t\t//Platform::DebugPrintf(\"Steps=%d\\n\", steps);\n\t\t\tint coalescedRemovePos = -1;\n\t\t\tint coalescedRemoveLen = 0;\n\t\t\tint prevRemoveActionPos = -1;\n\t\t\tint prevRemoveActionLen = 0;\n\t\t\tfor (int step = 0; step < steps; step++) {\n\t\t\t\tconst int prevLinesTotal = LinesTotal();\n\t\t\t\tconst Action &action = cb.GetUndoStep();\n\t\t\t\tif (action.at == removeAction) {\n\t\t\t\t\tNotifyModified(DocModification(\n\t\t\t\t\t\t\t\t\tSC_MOD_BEFOREINSERT | SC_PERFORMED_UNDO, action));\n\t\t\t\t} else if (action.at == containerAction) {\n\t\t\t\t\tDocModification dm(SC_MOD_CONTAINER | SC_PERFORMED_UNDO);\n\t\t\t\t\tdm.token = action.position;\n\t\t\t\t\tNotifyModified(dm);\n\t\t\t\t\tif (!action.mayCoalesce) {\n\t\t\t\t\t\tcoalescedRemovePos = -1;\n\t\t\t\t\t\tcoalescedRemoveLen = 0;\n\t\t\t\t\t\tprevRemoveActionPos = -1;\n\t\t\t\t\t\tprevRemoveActionLen = 0;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tNotifyModified(DocModification(\n\t\t\t\t\t\t\t\t\tSC_MOD_BEFOREDELETE | SC_PERFORMED_UNDO, action));\n\t\t\t\t}\n\t\t\t\tcb.PerformUndoStep();\n\t\t\t\tif (action.at != containerAction) {\n\t\t\t\t\tModifiedAt(action.position);\n\t\t\t\t\tnewPos = action.position;\n\t\t\t\t}\n\n\t\t\t\tint modFlags = SC_PERFORMED_UNDO;\n\t\t\t\t// With undo, an insertion action becomes a deletion notification\n\t\t\t\tif (action.at == removeAction) {\n\t\t\t\t\tnewPos += action.lenData;\n\t\t\t\t\tmodFlags |= SC_MOD_INSERTTEXT;\n\t\t\t\t\tif ((coalescedRemoveLen > 0) &&\n\t\t\t\t\t\t(action.position == prevRemoveActionPos || action.position == (prevRemoveActionPos + prevRemoveActionLen))) {\n\t\t\t\t\t\tcoalescedRemoveLen += action.lenData;\n\t\t\t\t\t\tnewPos = coalescedRemovePos + coalescedRemoveLen;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcoalescedRemovePos = action.position;\n\t\t\t\t\t\tcoalescedRemoveLen = action.lenData;\n\t\t\t\t\t}\n\t\t\t\t\tprevRemoveActionPos = action.position;\n\t\t\t\t\tprevRemoveActionLen = action.lenData;\n\t\t\t\t} else if (action.at == insertAction) {\n\t\t\t\t\tmodFlags |= SC_MOD_DELETETEXT;\n\t\t\t\t\tcoalescedRemovePos = -1;\n\t\t\t\t\tcoalescedRemoveLen = 0;\n\t\t\t\t\tprevRemoveActionPos = -1;\n\t\t\t\t\tprevRemoveActionLen = 0;\n\t\t\t\t}\n\t\t\t\tif (steps > 1)\n\t\t\t\t\tmodFlags |= SC_MULTISTEPUNDOREDO;\n\t\t\t\tconst int linesAdded = LinesTotal() - prevLinesTotal;\n\t\t\t\tif (linesAdded != 0)\n\t\t\t\t\tmultiLine = true;\n\t\t\t\tif (step == steps - 1) {\n\t\t\t\t\tmodFlags |= SC_LASTSTEPINUNDOREDO;\n\t\t\t\t\tif (multiLine)\n\t\t\t\t\t\tmodFlags |= SC_MULTILINEUNDOREDO;\n\t\t\t\t}\n\t\t\t\tNotifyModified(DocModification(modFlags, action.position, action.lenData,\n\t\t\t\t\t\t\t\t\t\t\t   linesAdded, action.data));\n\t\t\t}\n\n\t\t\tbool endSavePoint = cb.IsSavePoint();\n\t\t\tif (startSavePoint != endSavePoint)\n\t\t\t\tNotifySavePoint(endSavePoint);\n\t\t}\n\t\tenteredModification--;\n\t}\n\treturn newPos;\n}\n\nint Document::Redo() {\n\tint newPos = -1;\n\tCheckReadOnly();\n\tif ((enteredModification == 0) && (cb.IsCollectingUndo())) {\n\t\tenteredModification++;\n\t\tif (!cb.IsReadOnly()) {\n\t\t\tbool startSavePoint = cb.IsSavePoint();\n\t\t\tbool multiLine = false;\n\t\t\tint steps = cb.StartRedo();\n\t\t\tfor (int step = 0; step < steps; step++) {\n\t\t\t\tconst int prevLinesTotal = LinesTotal();\n\t\t\t\tconst Action &action = cb.GetRedoStep();\n\t\t\t\tif (action.at == insertAction) {\n\t\t\t\t\tNotifyModified(DocModification(\n\t\t\t\t\t\t\t\t\tSC_MOD_BEFOREINSERT | SC_PERFORMED_REDO, action));\n\t\t\t\t} else if (action.at == containerAction) {\n\t\t\t\t\tDocModification dm(SC_MOD_CONTAINER | SC_PERFORMED_REDO);\n\t\t\t\t\tdm.token = action.position;\n\t\t\t\t\tNotifyModified(dm);\n\t\t\t\t} else {\n\t\t\t\t\tNotifyModified(DocModification(\n\t\t\t\t\t\t\t\t\tSC_MOD_BEFOREDELETE | SC_PERFORMED_REDO, action));\n\t\t\t\t}\n\t\t\t\tcb.PerformRedoStep();\n\t\t\t\tif (action.at != containerAction) {\n\t\t\t\t\tModifiedAt(action.position);\n\t\t\t\t\tnewPos = action.position;\n\t\t\t\t}\n\n\t\t\t\tint modFlags = SC_PERFORMED_REDO;\n\t\t\t\tif (action.at == insertAction) {\n\t\t\t\t\tnewPos += action.lenData;\n\t\t\t\t\tmodFlags |= SC_MOD_INSERTTEXT;\n\t\t\t\t} else if (action.at == removeAction) {\n\t\t\t\t\tmodFlags |= SC_MOD_DELETETEXT;\n\t\t\t\t}\n\t\t\t\tif (steps > 1)\n\t\t\t\t\tmodFlags |= SC_MULTISTEPUNDOREDO;\n\t\t\t\tconst int linesAdded = LinesTotal() - prevLinesTotal;\n\t\t\t\tif (linesAdded != 0)\n\t\t\t\t\tmultiLine = true;\n\t\t\t\tif (step == steps - 1) {\n\t\t\t\t\tmodFlags |= SC_LASTSTEPINUNDOREDO;\n\t\t\t\t\tif (multiLine)\n\t\t\t\t\t\tmodFlags |= SC_MULTILINEUNDOREDO;\n\t\t\t\t}\n\t\t\t\tNotifyModified(\n\t\t\t\t\tDocModification(modFlags, action.position, action.lenData,\n\t\t\t\t\t\t\t\t\tlinesAdded, action.data));\n\t\t\t}\n\n\t\t\tbool endSavePoint = cb.IsSavePoint();\n\t\t\tif (startSavePoint != endSavePoint)\n\t\t\t\tNotifySavePoint(endSavePoint);\n\t\t}\n\t\tenteredModification--;\n\t}\n\treturn newPos;\n}\n\n/**\n * Insert a single character.\n */\nbool Document::InsertChar(int pos, char ch) {\n\tchar chs[1];\n\tchs[0] = ch;\n\treturn InsertString(pos, chs, 1);\n}\n\n/**\n * Insert a null terminated string.\n */\nbool Document::InsertCString(int position, const char *s) {\n\treturn InsertString(position, s, static_cast<int>(s ? strlen(s) : 0));\n}\n\nvoid Document::DelChar(int pos) {\n\tDeleteChars(pos, LenChar(pos));\n}\n\nvoid Document::DelCharBack(int pos) {\n\tif (pos <= 0) {\n\t\treturn;\n\t} else if (IsCrLf(pos - 2)) {\n\t\tDeleteChars(pos - 2, 2);\n\t} else if (dbcsCodePage) {\n\t\tint startChar = NextPosition(pos, -1);\n\t\tDeleteChars(startChar, pos - startChar);\n\t} else {\n\t\tDeleteChars(pos - 1, 1);\n\t}\n}\n\nstatic int NextTab(int pos, int tabSize) {\n\treturn ((pos / tabSize) + 1) * tabSize;\n}\n\nstatic std::string CreateIndentation(int indent, int tabSize, bool insertSpaces) {\n\tstd::string indentation;\n\tif (!insertSpaces) {\n\t\twhile (indent >= tabSize) {\n\t\t\tindentation += '\\t';\n\t\t\tindent -= tabSize;\n\t\t}\n\t}\n\twhile (indent > 0) {\n\t\tindentation += ' ';\n\t\tindent--;\n\t}\n\treturn indentation;\n}\n\nint SCI_METHOD Document::GetLineIndentation(int line) {\n\tint indent = 0;\n\tif ((line >= 0) && (line < LinesTotal())) {\n\t\tint lineStart = LineStart(line);\n\t\tint length = Length();\n\t\tfor (int i = lineStart; i < length; i++) {\n\t\t\tchar ch = cb.CharAt(i);\n\t\t\tif (ch == ' ')\n\t\t\t\tindent++;\n\t\t\telse if (ch == '\\t')\n\t\t\t\tindent = NextTab(indent, tabInChars);\n\t\t\telse\n\t\t\t\treturn indent;\n\t\t}\n\t}\n\treturn indent;\n}\n\nvoid Document::SetLineIndentation(int line, int indent) {\n\tint indentOfLine = GetLineIndentation(line);\n\tif (indent < 0)\n\t\tindent = 0;\n\tif (indent != indentOfLine) {\n\t\tstd::string linebuf = CreateIndentation(indent, tabInChars, !useTabs);\n\t\tint thisLineStart = LineStart(line);\n\t\tint indentPos = GetLineIndentPosition(line);\n\t\tUndoGroup ug(this);\n\t\tDeleteChars(thisLineStart, indentPos - thisLineStart);\n\t\tInsertCString(thisLineStart, linebuf.c_str());\n\t}\n}\n\nint Document::GetLineIndentPosition(int line) const {\n\tif (line < 0)\n\t\treturn 0;\n\tint pos = LineStart(line);\n\tint length = Length();\n\twhile ((pos < length) && IsSpaceOrTab(cb.CharAt(pos))) {\n\t\tpos++;\n\t}\n\treturn pos;\n}\n\nint Document::GetColumn(int pos) {\n\tint column = 0;\n\tint line = LineFromPosition(pos);\n\tif ((line >= 0) && (line < LinesTotal())) {\n\t\tfor (int i = LineStart(line); i < pos;) {\n\t\t\tchar ch = cb.CharAt(i);\n\t\t\tif (ch == '\\t') {\n\t\t\t\tcolumn = NextTab(column, tabInChars);\n\t\t\t\ti++;\n\t\t\t} else if (ch == '\\r') {\n\t\t\t\treturn column;\n\t\t\t} else if (ch == '\\n') {\n\t\t\t\treturn column;\n\t\t\t} else if (i >= Length()) {\n\t\t\t\treturn column;\n\t\t\t} else {\n\t\t\t\tcolumn++;\n\t\t\t\ti = NextPosition(i, 1);\n\t\t\t}\n\t\t}\n\t}\n\treturn column;\n}\n\nint Document::CountCharacters(int startPos, int endPos) {\n\tstartPos = MovePositionOutsideChar(startPos, 1, false);\n\tendPos = MovePositionOutsideChar(endPos, -1, false);\n\tint count = 0;\n\tint i = startPos;\n\twhile (i < endPos) {\n\t\tcount++;\n\t\tif (IsCrLf(i))\n\t\t\ti++;\n\t\ti = NextPosition(i, 1);\n\t}\n\treturn count;\n}\n\nint Document::FindColumn(int line, int column) {\n\tint position = LineStart(line);\n\tif ((line >= 0) && (line < LinesTotal())) {\n\t\tint columnCurrent = 0;\n\t\twhile ((columnCurrent < column) && (position < Length())) {\n\t\t\tchar ch = cb.CharAt(position);\n\t\t\tif (ch == '\\t') {\n\t\t\t\tcolumnCurrent = NextTab(columnCurrent, tabInChars);\n\t\t\t\tif (columnCurrent > column)\n\t\t\t\t\treturn position;\n\t\t\t\tposition++;\n\t\t\t} else if (ch == '\\r') {\n\t\t\t\treturn position;\n\t\t\t} else if (ch == '\\n') {\n\t\t\t\treturn position;\n\t\t\t} else {\n\t\t\t\tcolumnCurrent++;\n\t\t\t\tposition = NextPosition(position, 1);\n\t\t\t}\n\t\t}\n\t}\n\treturn position;\n}\n\nvoid Document::Indent(bool forwards, int lineBottom, int lineTop) {\n\t// Dedent - suck white space off the front of the line to dedent by equivalent of a tab\n\tfor (int line = lineBottom; line >= lineTop; line--) {\n\t\tint indentOfLine = GetLineIndentation(line);\n\t\tif (forwards) {\n\t\t\tif (LineStart(line) < LineEnd(line)) {\n\t\t\t\tSetLineIndentation(line, indentOfLine + IndentSize());\n\t\t\t}\n\t\t} else {\n\t\t\tSetLineIndentation(line, indentOfLine - IndentSize());\n\t\t}\n\t}\n}\n\n// Convert line endings for a piece of text to a particular mode.\n// Stop at len or when a NUL is found.\nstd::string Document::TransformLineEnds(const char *s, size_t len, int eolModeWanted) {\n\tstd::string dest;\n\tfor (size_t i = 0; (i < len) && (s[i]); i++) {\n\t\tif (s[i] == '\\n' || s[i] == '\\r') {\n\t\t\tif (eolModeWanted == SC_EOL_CR) {\n\t\t\t\tdest.push_back('\\r');\n\t\t\t} else if (eolModeWanted == SC_EOL_LF) {\n\t\t\t\tdest.push_back('\\n');\n\t\t\t} else { // eolModeWanted == SC_EOL_CRLF\n\t\t\t\tdest.push_back('\\r');\n\t\t\t\tdest.push_back('\\n');\n\t\t\t}\n\t\t\tif ((s[i] == '\\r') && (i+1 < len) && (s[i+1] == '\\n')) {\n\t\t\t\ti++;\n\t\t\t}\n\t\t} else {\n\t\t\tdest.push_back(s[i]);\n\t\t}\n\t}\n\treturn dest;\n}\n\nvoid Document::ConvertLineEnds(int eolModeSet) {\n\tUndoGroup ug(this);\n\n\tfor (int pos = 0; pos < Length(); pos++) {\n\t\tif (cb.CharAt(pos) == '\\r') {\n\t\t\tif (cb.CharAt(pos + 1) == '\\n') {\n\t\t\t\t// CRLF\n\t\t\t\tif (eolModeSet == SC_EOL_CR) {\n\t\t\t\t\tDeleteChars(pos + 1, 1); // Delete the LF\n\t\t\t\t} else if (eolModeSet == SC_EOL_LF) {\n\t\t\t\t\tDeleteChars(pos, 1); // Delete the CR\n\t\t\t\t} else {\n\t\t\t\t\tpos++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// CR\n\t\t\t\tif (eolModeSet == SC_EOL_CRLF) {\n\t\t\t\t\tInsertString(pos + 1, \"\\n\", 1); // Insert LF\n\t\t\t\t\tpos++;\n\t\t\t\t} else if (eolModeSet == SC_EOL_LF) {\n\t\t\t\t\tInsertString(pos, \"\\n\", 1); // Insert LF\n\t\t\t\t\tDeleteChars(pos + 1, 1); // Delete CR\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (cb.CharAt(pos) == '\\n') {\n\t\t\t// LF\n\t\t\tif (eolModeSet == SC_EOL_CRLF) {\n\t\t\t\tInsertString(pos, \"\\r\", 1); // Insert CR\n\t\t\t\tpos++;\n\t\t\t} else if (eolModeSet == SC_EOL_CR) {\n\t\t\t\tInsertString(pos, \"\\r\", 1); // Insert CR\n\t\t\t\tDeleteChars(pos + 1, 1); // Delete LF\n\t\t\t}\n\t\t}\n\t}\n\n}\n\nbool Document::IsWhiteLine(int line) const {\n\tint currentChar = LineStart(line);\n\tint endLine = LineEnd(line);\n\twhile (currentChar < endLine) {\n\t\tif (cb.CharAt(currentChar) != ' ' && cb.CharAt(currentChar) != '\\t') {\n\t\t\treturn false;\n\t\t}\n\t\t++currentChar;\n\t}\n\treturn true;\n}\n\nint Document::ParaUp(int pos) const {\n\tint line = LineFromPosition(pos);\n\tline--;\n\twhile (line >= 0 && IsWhiteLine(line)) { // skip empty lines\n\t\tline--;\n\t}\n\twhile (line >= 0 && !IsWhiteLine(line)) { // skip non-empty lines\n\t\tline--;\n\t}\n\tline++;\n\treturn LineStart(line);\n}\n\nint Document::ParaDown(int pos) const {\n\tint line = LineFromPosition(pos);\n\twhile (line < LinesTotal() && !IsWhiteLine(line)) { // skip non-empty lines\n\t\tline++;\n\t}\n\twhile (line < LinesTotal() && IsWhiteLine(line)) { // skip empty lines\n\t\tline++;\n\t}\n\tif (line < LinesTotal())\n\t\treturn LineStart(line);\n\telse // end of a document\n\t\treturn LineEnd(line-1);\n}\n\nCharClassify::cc Document::WordCharClass(unsigned char ch) const {\n\tif ((SC_CP_UTF8 == dbcsCodePage) && (!UTF8IsAscii(ch)))\n\t\treturn CharClassify::ccWord;\n\treturn charClass.GetClass(ch);\n}\n\n/**\n * Used by commmands that want to select whole words.\n * Finds the start of word at pos when delta < 0 or the end of the word when delta >= 0.\n */\nint Document::ExtendWordSelect(int pos, int delta, bool onlyWordCharacters) {\n\tCharClassify::cc ccStart = CharClassify::ccWord;\n\tif (delta < 0) {\n\t\tif (!onlyWordCharacters)\n\t\t\tccStart = WordCharClass(cb.CharAt(pos-1));\n\t\twhile (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccStart))\n\t\t\tpos--;\n\t} else {\n\t\tif (!onlyWordCharacters && pos < Length())\n\t\t\tccStart = WordCharClass(cb.CharAt(pos));\n\t\twhile (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart))\n\t\t\tpos++;\n\t}\n\treturn MovePositionOutsideChar(pos, delta, true);\n}\n\n/**\n * Find the start of the next word in either a forward (delta >= 0) or backwards direction\n * (delta < 0).\n * This is looking for a transition between character classes although there is also some\n * additional movement to transit white space.\n * Used by cursor movement by word commands.\n */\nint Document::NextWordStart(int pos, int delta) {\n\tif (delta < 0) {\n\t\twhile (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace))\n\t\t\tpos--;\n\t\tif (pos > 0) {\n\t\t\tCharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1));\n\t\t\twhile (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccStart)) {\n\t\t\t\tpos--;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tCharClassify::cc ccStart = WordCharClass(cb.CharAt(pos));\n\t\twhile (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart))\n\t\t\tpos++;\n\t\twhile (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace))\n\t\t\tpos++;\n\t}\n\treturn pos;\n}\n\n/**\n * Find the end of the next word in either a forward (delta >= 0) or backwards direction\n * (delta < 0).\n * This is looking for a transition between character classes although there is also some\n * additional movement to transit white space.\n * Used by cursor movement by word commands.\n */\nint Document::NextWordEnd(int pos, int delta) {\n\tif (delta < 0) {\n\t\tif (pos > 0) {\n\t\t\tCharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1));\n\t\t\tif (ccStart != CharClassify::ccSpace) {\n\t\t\t\twhile (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == ccStart) {\n\t\t\t\t\tpos--;\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace) {\n\t\t\t\tpos--;\n\t\t\t}\n\t\t}\n\t} else {\n\t\twhile (pos < Length() && WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace) {\n\t\t\tpos++;\n\t\t}\n\t\tif (pos < Length()) {\n\t\t\tCharClassify::cc ccStart = WordCharClass(cb.CharAt(pos));\n\t\t\twhile (pos < Length() && WordCharClass(cb.CharAt(pos)) == ccStart) {\n\t\t\t\tpos++;\n\t\t\t}\n\t\t}\n\t}\n\treturn pos;\n}\n\n/**\n * Check that the character at the given position is a word or punctuation character and that\n * the previous character is of a different character class.\n */\nbool Document::IsWordStartAt(int pos) const {\n\tif (pos > 0) {\n\t\tCharClassify::cc ccPos = WordCharClass(CharAt(pos));\n\t\treturn (ccPos == CharClassify::ccWord || ccPos == CharClassify::ccPunctuation) &&\n\t\t\t(ccPos != WordCharClass(CharAt(pos - 1)));\n\t}\n\treturn true;\n}\n\n/**\n * Check that the character at the given position is a word or punctuation character and that\n * the next character is of a different character class.\n */\nbool Document::IsWordEndAt(int pos) const {\n\tif (pos < Length()) {\n\t\tCharClassify::cc ccPrev = WordCharClass(CharAt(pos-1));\n\t\treturn (ccPrev == CharClassify::ccWord || ccPrev == CharClassify::ccPunctuation) &&\n\t\t\t(ccPrev != WordCharClass(CharAt(pos)));\n\t}\n\treturn true;\n}\n\n/**\n * Check that the given range is has transitions between character classes at both\n * ends and where the characters on the inside are word or punctuation characters.\n */\nbool Document::IsWordAt(int start, int end) const {\n\treturn IsWordStartAt(start) && IsWordEndAt(end);\n}\n\nbool Document::MatchesWordOptions(bool word, bool wordStart, int pos, int length) const {\n\treturn (!word && !wordStart) ||\n\t\t\t(word && IsWordAt(pos, pos + length)) ||\n\t\t\t(wordStart && IsWordStartAt(pos));\n}\n\nbool Document::HasCaseFolder(void) const {\n\treturn pcf != 0;\n}\n\nvoid Document::SetCaseFolder(CaseFolder *pcf_) {\n\tdelete pcf;\n\tpcf = pcf_;\n}\n\n/**\n * Find text in document, supporting both forward and backward\n * searches (just pass minPos > maxPos to do a backward search)\n * Has not been tested with backwards DBCS searches yet.\n */\nlong Document::FindText(int minPos, int maxPos, const char *search,\n                        bool caseSensitive, bool word, bool wordStart, bool regExp, int flags,\n                        int *length) {\n\tif (*length <= 0)\n\t\treturn minPos;\n\tif (regExp) {\n\t\tif (!regex)\n\t\t\tregex = CreateRegexSearch(&charClass);\n\t\treturn regex->FindText(this, minPos, maxPos, search, caseSensitive, word, wordStart, flags, length);\n\t} else {\n\n\t\tconst bool forward = minPos <= maxPos;\n\t\tconst int increment = forward ? 1 : -1;\n\n\t\t// Range endpoints should not be inside DBCS characters, but just in case, move them.\n\t\tconst int startPos = MovePositionOutsideChar(minPos, increment, false);\n\t\tconst int endPos = MovePositionOutsideChar(maxPos, increment, false);\n\n\t\t// Compute actual search ranges needed\n\t\tconst int lengthFind = *length;\n\n\t\t//Platform::DebugPrintf(\"Find %d %d %s %d\\n\", startPos, endPos, ft->lpstrText, lengthFind);\n\t\tconst int limitPos = Platform::Maximum(startPos, endPos);\n\t\tint pos = startPos;\n\t\tif (!forward) {\n\t\t\t// Back all of a character\n\t\t\tpos = NextPosition(pos, increment);\n\t\t}\n\t\tif (caseSensitive) {\n\t\t\tconst int endSearch = (startPos <= endPos) ? endPos - lengthFind + 1 : endPos;\n\t\t\tconst char charStartSearch =  search[0];\n\t\t\twhile (forward ? (pos < endSearch) : (pos >= endSearch)) {\n\t\t\t\tif (CharAt(pos) == charStartSearch) {\n\t\t\t\t\tbool found = (pos + lengthFind) <= limitPos;\n\t\t\t\t\tfor (int indexSearch = 1; (indexSearch < lengthFind) && found; indexSearch++) {\n\t\t\t\t\t\tfound = CharAt(pos + indexSearch) == search[indexSearch];\n\t\t\t\t\t}\n\t\t\t\t\tif (found && MatchesWordOptions(word, wordStart, pos, lengthFind)) {\n\t\t\t\t\t\treturn pos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!NextCharacter(pos, increment))\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} else if (SC_CP_UTF8 == dbcsCodePage) {\n\t\t\tconst size_t maxFoldingExpansion = 4;\n\t\t\tstd::vector<char> searchThing(lengthFind * UTF8MaxBytes * maxFoldingExpansion + 1);\n\t\t\tconst int lenSearch = static_cast<int>(\n\t\t\t\tpcf->Fold(&searchThing[0], searchThing.size(), search, lengthFind));\n\t\t\tchar bytes[UTF8MaxBytes + 1];\n\t\t\tchar folded[UTF8MaxBytes * maxFoldingExpansion + 1];\n\t\t\twhile (forward ? (pos < endPos) : (pos >= endPos)) {\n\t\t\t\tint widthFirstCharacter = 0;\n\t\t\t\tint posIndexDocument = pos;\n\t\t\t\tint indexSearch = 0;\n\t\t\t\tbool characterMatches = true;\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst unsigned char leadByte = static_cast<unsigned char>(cb.CharAt(posIndexDocument));\n\t\t\t\t\tbytes[0] = leadByte;\n\t\t\t\t\tint widthChar = 1;\n\t\t\t\t\tif (!UTF8IsAscii(leadByte)) {\n\t\t\t\t\t\tconst int widthCharBytes = UTF8BytesOfLead[leadByte];\n\t\t\t\t\t\tfor (int b=1; b<widthCharBytes; b++) {\n\t\t\t\t\t\t\tbytes[b] = cb.CharAt(posIndexDocument+b);\n\t\t\t\t\t\t}\n\t\t\t\t\t\twidthChar = UTF8Classify(reinterpret_cast<const unsigned char *>(bytes), widthCharBytes) & UTF8MaskWidth;\n\t\t\t\t\t}\n\t\t\t\t\tif (!widthFirstCharacter)\n\t\t\t\t\t\twidthFirstCharacter = widthChar;\n\t\t\t\t\tif ((posIndexDocument + widthChar) > limitPos)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tconst int lenFlat = static_cast<int>(pcf->Fold(folded, sizeof(folded), bytes, widthChar));\n\t\t\t\t\tfolded[lenFlat] = 0;\n\t\t\t\t\t// Does folded match the buffer\n\t\t\t\t\tcharacterMatches = 0 == memcmp(folded, &searchThing[0] + indexSearch, lenFlat);\n\t\t\t\t\tif (!characterMatches)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tposIndexDocument += widthChar;\n\t\t\t\t\tindexSearch += lenFlat;\n\t\t\t\t\tif (indexSearch >= lenSearch)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (characterMatches && (indexSearch == static_cast<int>(lenSearch))) {\n\t\t\t\t\tif (MatchesWordOptions(word, wordStart, pos, posIndexDocument - pos)) {\n\t\t\t\t\t\t*length = posIndexDocument - pos;\n\t\t\t\t\t\treturn pos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (forward) {\n\t\t\t\t\tpos += widthFirstCharacter;\n\t\t\t\t} else {\n\t\t\t\t\tif (!NextCharacter(pos, increment))\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (dbcsCodePage) {\n\t\t\tconst size_t maxBytesCharacter = 2;\n\t\t\tconst size_t maxFoldingExpansion = 4;\n\t\t\tstd::vector<char> searchThing(lengthFind * maxBytesCharacter * maxFoldingExpansion + 1);\n\t\t\tconst int lenSearch = static_cast<int>(\n\t\t\t\tpcf->Fold(&searchThing[0], searchThing.size(), search, lengthFind));\n\t\t\twhile (forward ? (pos < endPos) : (pos >= endPos)) {\n\t\t\t\tint indexDocument = 0;\n\t\t\t\tint indexSearch = 0;\n\t\t\t\tbool characterMatches = true;\n\t\t\t\twhile (characterMatches &&\n\t\t\t\t\t((pos + indexDocument) < limitPos) &&\n\t\t\t\t\t(indexSearch < lenSearch)) {\n\t\t\t\t\tchar bytes[maxBytesCharacter + 1];\n\t\t\t\t\tbytes[0] = cb.CharAt(pos + indexDocument);\n\t\t\t\t\tconst int widthChar = IsDBCSLeadByte(bytes[0]) ? 2 : 1;\n\t\t\t\t\tif (widthChar == 2)\n\t\t\t\t\t\tbytes[1] = cb.CharAt(pos + indexDocument + 1);\n\t\t\t\t\tif ((pos + indexDocument + widthChar) > limitPos)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tchar folded[maxBytesCharacter * maxFoldingExpansion + 1];\n\t\t\t\t\tconst int lenFlat = static_cast<int>(pcf->Fold(folded, sizeof(folded), bytes, widthChar));\n\t\t\t\t\tfolded[lenFlat] = 0;\n\t\t\t\t\t// Does folded match the buffer\n\t\t\t\t\tcharacterMatches = 0 == memcmp(folded, &searchThing[0] + indexSearch, lenFlat);\n\t\t\t\t\tindexDocument += widthChar;\n\t\t\t\t\tindexSearch += lenFlat;\n\t\t\t\t}\n\t\t\t\tif (characterMatches && (indexSearch == static_cast<int>(lenSearch))) {\n\t\t\t\t\tif (MatchesWordOptions(word, wordStart, pos, indexDocument)) {\n\t\t\t\t\t\t*length = indexDocument;\n\t\t\t\t\t\treturn pos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!NextCharacter(pos, increment))\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\tconst int endSearch = (startPos <= endPos) ? endPos - lengthFind + 1 : endPos;\n\t\t\tstd::vector<char> searchThing(lengthFind + 1);\n\t\t\tpcf->Fold(&searchThing[0], searchThing.size(), search, lengthFind);\n\t\t\twhile (forward ? (pos < endSearch) : (pos >= endSearch)) {\n\t\t\t\tbool found = (pos + lengthFind) <= limitPos;\n\t\t\t\tfor (int indexSearch = 0; (indexSearch < lengthFind) && found; indexSearch++) {\n\t\t\t\t\tchar ch = CharAt(pos + indexSearch);\n\t\t\t\t\tchar folded[2];\n\t\t\t\t\tpcf->Fold(folded, sizeof(folded), &ch, 1);\n\t\t\t\t\tfound = folded[0] == searchThing[indexSearch];\n\t\t\t\t}\n\t\t\t\tif (found && MatchesWordOptions(word, wordStart, pos, lengthFind)) {\n\t\t\t\t\treturn pos;\n\t\t\t\t}\n\t\t\t\tif (!NextCharacter(pos, increment))\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t//Platform::DebugPrintf(\"Not found\\n\");\n\treturn -1;\n}\n\nconst char *Document::SubstituteByPosition(const char *text, int *length) {\n\tif (regex)\n\t\treturn regex->SubstituteByPosition(this, text, length);\n\telse\n\t\treturn 0;\n}\n\nint Document::LinesTotal() const {\n\treturn cb.Lines();\n}\n\nvoid Document::SetDefaultCharClasses(bool includeWordClass) {\n    charClass.SetDefaultCharClasses(includeWordClass);\n}\n\nvoid Document::SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass) {\n    charClass.SetCharClasses(chars, newCharClass);\n}\n\nint Document::GetCharsOfClass(CharClassify::cc characterClass, unsigned char *buffer) {\n    return charClass.GetCharsOfClass(characterClass, buffer);\n}\n\nvoid Document::SetStylingBits(int bits) {\n\tstylingBits = bits;\n\tstylingBitsMask = (1 << stylingBits) - 1;\n}\n\nvoid SCI_METHOD Document::StartStyling(int position, char mask) {\n\tstylingMask = mask;\n\tendStyled = position;\n}\n\nbool SCI_METHOD Document::SetStyleFor(int length, char style) {\n\tif (enteredStyling != 0) {\n\t\treturn false;\n\t} else {\n\t\tenteredStyling++;\n\t\tstyle &= stylingMask;\n\t\tint prevEndStyled = endStyled;\n\t\tif (cb.SetStyleFor(endStyled, length, style, stylingMask)) {\n\t\t\tDocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER,\n\t\t\t                   prevEndStyled, length);\n\t\t\tNotifyModified(mh);\n\t\t}\n\t\tendStyled += length;\n\t\tenteredStyling--;\n\t\treturn true;\n\t}\n}\n\nbool SCI_METHOD Document::SetStyles(int length, const char *styles) {\n\tif (enteredStyling != 0) {\n\t\treturn false;\n\t} else {\n\t\tenteredStyling++;\n\t\tbool didChange = false;\n\t\tint startMod = 0;\n\t\tint endMod = 0;\n\t\tfor (int iPos = 0; iPos < length; iPos++, endStyled++) {\n\t\t\tPLATFORM_ASSERT(endStyled < Length());\n\t\t\tif (cb.SetStyleAt(endStyled, styles[iPos], stylingMask)) {\n\t\t\t\tif (!didChange) {\n\t\t\t\t\tstartMod = endStyled;\n\t\t\t\t}\n\t\t\t\tdidChange = true;\n\t\t\t\tendMod = endStyled;\n\t\t\t}\n\t\t}\n\t\tif (didChange) {\n\t\t\tDocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER,\n\t\t\t                   startMod, endMod - startMod + 1);\n\t\t\tNotifyModified(mh);\n\t\t}\n\t\tenteredStyling--;\n\t\treturn true;\n\t}\n}\n\nvoid Document::EnsureStyledTo(int pos) {\n\tif ((enteredStyling == 0) && (pos > GetEndStyled())) {\n\t\tIncrementStyleClock();\n\t\tif (pli && !pli->UseContainerLexing()) {\n\t\t\tint lineEndStyled = LineFromPosition(GetEndStyled());\n\t\t\tint endStyledTo = LineStart(lineEndStyled);\n\t\t\tpli->Colourise(endStyledTo, pos);\n\t\t} else {\n\t\t\t// Ask the watchers to style, and stop as soon as one responds.\n\t\t\tfor (std::vector<WatcherWithUserData>::iterator it = watchers.begin();\n\t\t\t\t(pos > GetEndStyled()) && (it != watchers.end()); ++it) {\n\t\t\t\tit->watcher->NotifyStyleNeeded(this, it->userData, pos);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid Document::LexerChanged() {\n\t// Tell the watchers the lexer has changed.\n\tfor (std::vector<WatcherWithUserData>::iterator it = watchers.begin(); it != watchers.end(); ++it) {\n\t\tit->watcher->NotifyLexerChanged(this, it->userData);\n\t}\n}\n\nint SCI_METHOD Document::SetLineState(int line, int state) {\n\tint statePrevious = static_cast<LineState *>(perLineData[ldState])->SetLineState(line, state);\n\tif (state != statePrevious) {\n\t\tDocModification mh(SC_MOD_CHANGELINESTATE, LineStart(line), 0, 0, 0, line);\n\t\tNotifyModified(mh);\n\t}\n\treturn statePrevious;\n}\n\nint SCI_METHOD Document::GetLineState(int line) const {\n\treturn static_cast<LineState *>(perLineData[ldState])->GetLineState(line);\n}\n\nint Document::GetMaxLineState() {\n\treturn static_cast<LineState *>(perLineData[ldState])->GetMaxLineState();\n}\n\nvoid SCI_METHOD Document::ChangeLexerState(int start, int end) {\n\tDocModification mh(SC_MOD_LEXERSTATE, start, end-start, 0, 0, 0);\n\tNotifyModified(mh);\n}\n\nStyledText Document::MarginStyledText(int line) const {\n\tLineAnnotation *pla = static_cast<LineAnnotation *>(perLineData[ldMargin]);\n\treturn StyledText(pla->Length(line), pla->Text(line),\n\t\tpla->MultipleStyles(line), pla->Style(line), pla->Styles(line));\n}\n\nvoid Document::MarginSetText(int line, const char *text) {\n\tstatic_cast<LineAnnotation *>(perLineData[ldMargin])->SetText(line, text);\n\tDocModification mh(SC_MOD_CHANGEMARGIN, LineStart(line), 0, 0, 0, line);\n\tNotifyModified(mh);\n}\n\nvoid Document::MarginSetStyle(int line, int style) {\n\tstatic_cast<LineAnnotation *>(perLineData[ldMargin])->SetStyle(line, style);\n\tNotifyModified(DocModification(SC_MOD_CHANGEMARGIN, LineStart(line), 0, 0, 0, line));\n}\n\nvoid Document::MarginSetStyles(int line, const unsigned char *styles) {\n\tstatic_cast<LineAnnotation *>(perLineData[ldMargin])->SetStyles(line, styles);\n\tNotifyModified(DocModification(SC_MOD_CHANGEMARGIN, LineStart(line), 0, 0, 0, line));\n}\n\nvoid Document::MarginClearAll() {\n\tint maxEditorLine = LinesTotal();\n\tfor (int l=0; l<maxEditorLine; l++)\n\t\tMarginSetText(l, 0);\n\t// Free remaining data\n\tstatic_cast<LineAnnotation *>(perLineData[ldMargin])->ClearAll();\n}\n\nStyledText Document::AnnotationStyledText(int line) const {\n\tLineAnnotation *pla = static_cast<LineAnnotation *>(perLineData[ldAnnotation]);\n\treturn StyledText(pla->Length(line), pla->Text(line),\n\t\tpla->MultipleStyles(line), pla->Style(line), pla->Styles(line));\n}\n\nvoid Document::AnnotationSetText(int line, const char *text) {\n\tif (line >= 0 && line < LinesTotal()) {\n\t\tconst int linesBefore = AnnotationLines(line);\n\t\tstatic_cast<LineAnnotation *>(perLineData[ldAnnotation])->SetText(line, text);\n\t\tconst int linesAfter = AnnotationLines(line);\n\t\tDocModification mh(SC_MOD_CHANGEANNOTATION, LineStart(line), 0, 0, 0, line);\n\t\tmh.annotationLinesAdded = linesAfter - linesBefore;\n\t\tNotifyModified(mh);\n\t}\n}\n\nvoid Document::AnnotationSetStyle(int line, int style) {\n\tstatic_cast<LineAnnotation *>(perLineData[ldAnnotation])->SetStyle(line, style);\n\tDocModification mh(SC_MOD_CHANGEANNOTATION, LineStart(line), 0, 0, 0, line);\n\tNotifyModified(mh);\n}\n\nvoid Document::AnnotationSetStyles(int line, const unsigned char *styles) {\n\tif (line >= 0 && line < LinesTotal()) {\n\t\tstatic_cast<LineAnnotation *>(perLineData[ldAnnotation])->SetStyles(line, styles);\n\t}\n}\n\nint Document::AnnotationLines(int line) const {\n\treturn static_cast<LineAnnotation *>(perLineData[ldAnnotation])->Lines(line);\n}\n\nvoid Document::AnnotationClearAll() {\n\tint maxEditorLine = LinesTotal();\n\tfor (int l=0; l<maxEditorLine; l++)\n\t\tAnnotationSetText(l, 0);\n\t// Free remaining data\n\tstatic_cast<LineAnnotation *>(perLineData[ldAnnotation])->ClearAll();\n}\n\nvoid Document::IncrementStyleClock() {\n\tstyleClock = (styleClock + 1) % 0x100000;\n}\n\nvoid SCI_METHOD Document::DecorationFillRange(int position, int value, int fillLength) {\n\tif (decorations.FillRange(position, value, fillLength)) {\n\t\tDocModification mh(SC_MOD_CHANGEINDICATOR | SC_PERFORMED_USER,\n\t\t\t\t\t\t\tposition, fillLength);\n\t\tNotifyModified(mh);\n\t}\n}\n\nbool Document::AddWatcher(DocWatcher *watcher, void *userData) {\n\tWatcherWithUserData wwud(watcher, userData);\n\tstd::vector<WatcherWithUserData>::iterator it = \n\t\tstd::find(watchers.begin(), watchers.end(), wwud);\n\tif (it != watchers.end())\n\t\treturn false;\n\twatchers.push_back(wwud);\n\treturn true;\n}\n\nbool Document::RemoveWatcher(DocWatcher *watcher, void *userData) {\n\tstd::vector<WatcherWithUserData>::iterator it = \n\t\tstd::find(watchers.begin(), watchers.end(), WatcherWithUserData(watcher, userData));\n\tif (it != watchers.end()) {\n\t\twatchers.erase(it);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nvoid Document::NotifyModifyAttempt() {\n\tfor (std::vector<WatcherWithUserData>::iterator it = watchers.begin(); it != watchers.end(); ++it) {\n\t\tit->watcher->NotifyModifyAttempt(this, it->userData);\n\t}\n}\n\nvoid Document::NotifySavePoint(bool atSavePoint) {\n\tfor (std::vector<WatcherWithUserData>::iterator it = watchers.begin(); it != watchers.end(); ++it) {\n\t\tit->watcher->NotifySavePoint(this, it->userData, atSavePoint);\n\t}\n}\n\nvoid Document::NotifyModified(DocModification mh) {\n\tif (mh.modificationType & SC_MOD_INSERTTEXT) {\n\t\tdecorations.InsertSpace(mh.position, mh.length);\n\t} else if (mh.modificationType & SC_MOD_DELETETEXT) {\n\t\tdecorations.DeleteRange(mh.position, mh.length);\n\t}\n\tfor (std::vector<WatcherWithUserData>::iterator it = watchers.begin(); it != watchers.end(); ++it) {\n\t\tit->watcher->NotifyModified(this, mh, it->userData);\n\t}\n}\n\nbool Document::IsWordPartSeparator(char ch) const {\n\treturn (WordCharClass(ch) == CharClassify::ccWord) && IsPunctuation(ch);\n}\n\nint Document::WordPartLeft(int pos) {\n\tif (pos > 0) {\n\t\t--pos;\n\t\tchar startChar = cb.CharAt(pos);\n\t\tif (IsWordPartSeparator(startChar)) {\n\t\t\twhile (pos > 0 && IsWordPartSeparator(cb.CharAt(pos))) {\n\t\t\t\t--pos;\n\t\t\t}\n\t\t}\n\t\tif (pos > 0) {\n\t\t\tstartChar = cb.CharAt(pos);\n\t\t\t--pos;\n\t\t\tif (IsLowerCase(startChar)) {\n\t\t\t\twhile (pos > 0 && IsLowerCase(cb.CharAt(pos)))\n\t\t\t\t\t--pos;\n\t\t\t\tif (!IsUpperCase(cb.CharAt(pos)) && !IsLowerCase(cb.CharAt(pos)))\n\t\t\t\t\t++pos;\n\t\t\t} else if (IsUpperCase(startChar)) {\n\t\t\t\twhile (pos > 0 && IsUpperCase(cb.CharAt(pos)))\n\t\t\t\t\t--pos;\n\t\t\t\tif (!IsUpperCase(cb.CharAt(pos)))\n\t\t\t\t\t++pos;\n\t\t\t} else if (IsADigit(startChar)) {\n\t\t\t\twhile (pos > 0 && IsADigit(cb.CharAt(pos)))\n\t\t\t\t\t--pos;\n\t\t\t\tif (!IsADigit(cb.CharAt(pos)))\n\t\t\t\t\t++pos;\n\t\t\t} else if (IsPunctuation(startChar)) {\n\t\t\t\twhile (pos > 0 && IsPunctuation(cb.CharAt(pos)))\n\t\t\t\t\t--pos;\n\t\t\t\tif (!IsPunctuation(cb.CharAt(pos)))\n\t\t\t\t\t++pos;\n\t\t\t} else if (isspacechar(startChar)) {\n\t\t\t\twhile (pos > 0 && isspacechar(cb.CharAt(pos)))\n\t\t\t\t\t--pos;\n\t\t\t\tif (!isspacechar(cb.CharAt(pos)))\n\t\t\t\t\t++pos;\n\t\t\t} else if (!IsASCII(startChar)) {\n\t\t\t\twhile (pos > 0 && !IsASCII(cb.CharAt(pos)))\n\t\t\t\t\t--pos;\n\t\t\t\tif (IsASCII(cb.CharAt(pos)))\n\t\t\t\t\t++pos;\n\t\t\t} else {\n\t\t\t\t++pos;\n\t\t\t}\n\t\t}\n\t}\n\treturn pos;\n}\n\nint Document::WordPartRight(int pos) {\n\tchar startChar = cb.CharAt(pos);\n\tint length = Length();\n\tif (IsWordPartSeparator(startChar)) {\n\t\twhile (pos < length && IsWordPartSeparator(cb.CharAt(pos)))\n\t\t\t++pos;\n\t\tstartChar = cb.CharAt(pos);\n\t}\n\tif (!IsASCII(startChar)) {\n\t\twhile (pos < length && !IsASCII(cb.CharAt(pos)))\n\t\t\t++pos;\n\t} else if (IsLowerCase(startChar)) {\n\t\twhile (pos < length && IsLowerCase(cb.CharAt(pos)))\n\t\t\t++pos;\n\t} else if (IsUpperCase(startChar)) {\n\t\tif (IsLowerCase(cb.CharAt(pos + 1))) {\n\t\t\t++pos;\n\t\t\twhile (pos < length && IsLowerCase(cb.CharAt(pos)))\n\t\t\t\t++pos;\n\t\t} else {\n\t\t\twhile (pos < length && IsUpperCase(cb.CharAt(pos)))\n\t\t\t\t++pos;\n\t\t}\n\t\tif (IsLowerCase(cb.CharAt(pos)) && IsUpperCase(cb.CharAt(pos - 1)))\n\t\t\t--pos;\n\t} else if (IsADigit(startChar)) {\n\t\twhile (pos < length && IsADigit(cb.CharAt(pos)))\n\t\t\t++pos;\n\t} else if (IsPunctuation(startChar)) {\n\t\twhile (pos < length && IsPunctuation(cb.CharAt(pos)))\n\t\t\t++pos;\n\t} else if (isspacechar(startChar)) {\n\t\twhile (pos < length && isspacechar(cb.CharAt(pos)))\n\t\t\t++pos;\n\t} else {\n\t\t++pos;\n\t}\n\treturn pos;\n}\n\nbool IsLineEndChar(char c) {\n\treturn (c == '\\n' || c == '\\r');\n}\n\nint Document::ExtendStyleRange(int pos, int delta, bool singleLine) {\n\tint sStart = cb.StyleAt(pos);\n\tif (delta < 0) {\n\t\twhile (pos > 0 && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos))))\n\t\t\tpos--;\n\t\tpos++;\n\t} else {\n\t\twhile (pos < (Length()) && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos))))\n\t\t\tpos++;\n\t}\n\treturn pos;\n}\n\nstatic char BraceOpposite(char ch) {\n\tswitch (ch) {\n\tcase '(':\n\t\treturn ')';\n\tcase ')':\n\t\treturn '(';\n\tcase '[':\n\t\treturn ']';\n\tcase ']':\n\t\treturn '[';\n\tcase '{':\n\t\treturn '}';\n\tcase '}':\n\t\treturn '{';\n\tcase '<':\n\t\treturn '>';\n\tcase '>':\n\t\treturn '<';\n\tdefault:\n\t\treturn '\\0';\n\t}\n}\n\n// TODO: should be able to extend styled region to find matching brace\nint Document::BraceMatch(int position, int /*maxReStyle*/) {\n\tchar chBrace = CharAt(position);\n\tchar chSeek = BraceOpposite(chBrace);\n\tif (chSeek == '\\0')\n\t\treturn - 1;\n\tchar styBrace = static_cast<char>(StyleAt(position) & stylingBitsMask);\n\tint direction = -1;\n\tif (chBrace == '(' || chBrace == '[' || chBrace == '{' || chBrace == '<')\n\t\tdirection = 1;\n\tint depth = 1;\n\tposition = NextPosition(position, direction);\n\twhile ((position >= 0) && (position < Length())) {\n\t\tchar chAtPos = CharAt(position);\n\t\tchar styAtPos = static_cast<char>(StyleAt(position) & stylingBitsMask);\n\t\tif ((position > GetEndStyled()) || (styAtPos == styBrace)) {\n\t\t\tif (chAtPos == chBrace)\n\t\t\t\tdepth++;\n\t\t\tif (chAtPos == chSeek)\n\t\t\t\tdepth--;\n\t\t\tif (depth == 0)\n\t\t\t\treturn position;\n\t\t}\n\t\tint positionBeforeMove = position;\n\t\tposition = NextPosition(position, direction);\n\t\tif (position == positionBeforeMove)\n\t\t\tbreak;\n\t}\n\treturn - 1;\n}\n\n/**\n * Implementation of RegexSearchBase for the default built-in regular expression engine\n */\nclass BuiltinRegex : public RegexSearchBase {\npublic:\n\tBuiltinRegex(CharClassify *charClassTable) : search(charClassTable) {}\n\n\tvirtual ~BuiltinRegex() {\n\t}\n\n\tvirtual long FindText(Document *doc, int minPos, int maxPos, const char *s,\n                        bool caseSensitive, bool word, bool wordStart, int flags,\n                        int *length);\n\n\tvirtual const char *SubstituteByPosition(Document *doc, const char *text, int *length);\n\nprivate:\n\tRESearch search;\n\tstd::string substituted;\n};\n\n// Define a way for the Regular Expression code to access the document\nclass DocumentIndexer : public CharacterIndexer {\n\tDocument *pdoc;\n\tint end;\npublic:\n\tDocumentIndexer(Document *pdoc_, int end_) :\n\t\tpdoc(pdoc_), end(end_) {\n\t}\n\n\tvirtual ~DocumentIndexer() {\n\t}\n\n\tvirtual char CharAt(int index) {\n\t\tif (index < 0 || index >= end)\n\t\t\treturn 0;\n\t\telse\n\t\t\treturn pdoc->CharAt(index);\n\t}\n};\n\nlong BuiltinRegex::FindText(Document *doc, int minPos, int maxPos, const char *s,\n                        bool caseSensitive, bool, bool, int flags,\n                        int *length) {\n\tbool posix = (flags & SCFIND_POSIX) != 0;\n\tint increment = (minPos <= maxPos) ? 1 : -1;\n\n\tint startPos = minPos;\n\tint endPos = maxPos;\n\n\t// Range endpoints should not be inside DBCS characters, but just in case, move them.\n\tstartPos = doc->MovePositionOutsideChar(startPos, 1, false);\n\tendPos = doc->MovePositionOutsideChar(endPos, 1, false);\n\n\tconst char *errmsg = search.Compile(s, *length, caseSensitive, posix);\n\tif (errmsg) {\n\t\treturn -1;\n\t}\n\t// Find a variable in a property file: \\$(\\([A-Za-z0-9_.]+\\))\n\t// Replace first '.' with '-' in each property file variable reference:\n\t//     Search: \\$(\\([A-Za-z0-9_-]+\\)\\.\\([A-Za-z0-9_.]+\\))\n\t//     Replace: $(\\1-\\2)\n\tint lineRangeStart = doc->LineFromPosition(startPos);\n\tint lineRangeEnd = doc->LineFromPosition(endPos);\n\tif ((increment == 1) &&\n\t\t(startPos >= doc->LineEnd(lineRangeStart)) &&\n\t\t(lineRangeStart < lineRangeEnd)) {\n\t\t// the start position is at end of line or between line end characters.\n\t\tlineRangeStart++;\n\t\tstartPos = doc->LineStart(lineRangeStart);\n\t} else if ((increment == -1) &&\n\t           (startPos <= doc->LineStart(lineRangeStart)) &&\n\t           (lineRangeStart > lineRangeEnd)) {\n\t\t// the start position is at beginning of line.\n\t\tlineRangeStart--;\n\t\tstartPos = doc->LineEnd(lineRangeStart);\n\t}\n\tint pos = -1;\n\tint lenRet = 0;\n\tchar searchEnd = s[*length - 1];\n\tchar searchEndPrev = (*length > 1) ? s[*length - 2] : '\\0';\n\tint lineRangeBreak = lineRangeEnd + increment;\n\tfor (int line = lineRangeStart; line != lineRangeBreak; line += increment) {\n\t\tint startOfLine = doc->LineStart(line);\n\t\tint endOfLine = doc->LineEnd(line);\n\t\tif (increment == 1) {\n\t\t\tif (line == lineRangeStart) {\n\t\t\t\tif ((startPos != startOfLine) && (s[0] == '^'))\n\t\t\t\t\tcontinue;\t// Can't match start of line if start position after start of line\n\t\t\t\tstartOfLine = startPos;\n\t\t\t}\n\t\t\tif (line == lineRangeEnd) {\n\t\t\t\tif ((endPos != endOfLine) && (searchEnd == '$') && (searchEndPrev != '\\\\'))\n\t\t\t\t\tcontinue;\t// Can't match end of line if end position before end of line\n\t\t\t\tendOfLine = endPos;\n\t\t\t}\n\t\t} else {\n\t\t\tif (line == lineRangeEnd) {\n\t\t\t\tif ((endPos != startOfLine) && (s[0] == '^'))\n\t\t\t\t\tcontinue;\t// Can't match start of line if end position after start of line\n\t\t\t\tstartOfLine = endPos;\n\t\t\t}\n\t\t\tif (line == lineRangeStart) {\n\t\t\t\tif ((startPos != endOfLine) && (searchEnd == '$') && (searchEndPrev != '\\\\'))\n\t\t\t\t\tcontinue;\t// Can't match end of line if start position before end of line\n\t\t\t\tendOfLine = startPos;\n\t\t\t}\n\t\t}\n\n\t\tDocumentIndexer di(doc, endOfLine);\n\t\tint success = search.Execute(di, startOfLine, endOfLine);\n\t\tif (success) {\n\t\t\tpos = search.bopat[0];\n\t\t\t// Ensure only whole characters selected\n\t\t\tsearch.eopat[0] = doc->MovePositionOutsideChar(search.eopat[0], 1, false);\n\t\t\tlenRet = search.eopat[0] - search.bopat[0];\n\t\t\t// There can be only one start of a line, so no need to look for last match in line\n\t\t\tif ((increment == -1) && (s[0] != '^')) {\n\t\t\t\t// Check for the last match on this line.\n\t\t\t\tint repetitions = 1000;\t// Break out of infinite loop\n\t\t\t\twhile (success && (search.eopat[0] <= endOfLine) && (repetitions--)) {\n\t\t\t\t\tsuccess = search.Execute(di, pos+1, endOfLine);\n\t\t\t\t\tif (success) {\n\t\t\t\t\t\tif (search.eopat[0] <= minPos) {\n\t\t\t\t\t\t\tpos = search.bopat[0];\n\t\t\t\t\t\t\tlenRet = search.eopat[0] - search.bopat[0];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsuccess = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\t*length = lenRet;\n\treturn pos;\n}\n\nconst char *BuiltinRegex::SubstituteByPosition(Document *doc, const char *text, int *length) {\n\tsubstituted.clear();\n\tDocumentIndexer di(doc, doc->Length());\n\tsearch.GrabMatches(di);\n\tfor (int j = 0; j < *length; j++) {\n\t\tif (text[j] == '\\\\') {\n\t\t\tif (text[j + 1] >= '0' && text[j + 1] <= '9') {\n\t\t\t\tunsigned int patNum = text[j + 1] - '0';\n\t\t\t\tunsigned int len = search.eopat[patNum] - search.bopat[patNum];\n\t\t\t\tif (!search.pat[patNum].empty())\t// Will be null if try for a match that did not occur\n\t\t\t\t\tsubstituted.append(search.pat[patNum].c_str(), len);\n\t\t\t\tj++;\n\t\t\t} else {\n\t\t\t\tj++;\n\t\t\t\tswitch (text[j]) {\n\t\t\t\tcase 'a':\n\t\t\t\t\tsubstituted.push_back('\\a');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'b':\n\t\t\t\t\tsubstituted.push_back('\\b');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'f':\n\t\t\t\t\tsubstituted.push_back('\\f');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'n':\n\t\t\t\t\tsubstituted.push_back('\\n');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'r':\n\t\t\t\t\tsubstituted.push_back('\\r');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 't':\n\t\t\t\t\tsubstituted.push_back('\\t');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'v':\n\t\t\t\t\tsubstituted.push_back('\\v');\n\t\t\t\t\tbreak;\n\t\t\t\tcase '\\\\':\n\t\t\t\t\tsubstituted.push_back('\\\\');\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tsubstituted.push_back('\\\\');\n\t\t\t\t\tj--;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tsubstituted.push_back(text[j]);\n\t\t}\n\t}\n\t*length = static_cast<int>(substituted.length());\n\treturn substituted.c_str();\n}\n\n#ifndef SCI_OWNREGEX\n\n#ifdef SCI_NAMESPACE\n\nRegexSearchBase *Scintilla::CreateRegexSearch(CharClassify *charClassTable) {\n\treturn new BuiltinRegex(charClassTable);\n}\n\n#else\n\nRegexSearchBase *CreateRegexSearch(CharClassify *charClassTable) {\n\treturn new BuiltinRegex(charClassTable);\n}\n\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/Document.h",
    "content": "// Scintilla source code edit control\n/** @file Document.h\n ** Text document that handles notifications, DBCS, styling, words and end of line.\n **/\n// Copyright 1998-2011 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef DOCUMENT_H\n#define DOCUMENT_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n/**\n * A Position is a position within a document between two characters or at the beginning or end.\n * Sometimes used as a character index where it identifies the character after the position.\n */\ntypedef int Position;\nconst Position invalidPosition = -1;\n\nenum EncodingFamily { efEightBit, efUnicode, efDBCS };\n\n/**\n * The range class represents a range of text in a document.\n * The two values are not sorted as one end may be more significant than the other\n * as is the case for the selection where the end position is the position of the caret.\n * If either position is invalidPosition then the range is invalid and most operations will fail.\n */\nclass Range {\npublic:\n\tPosition start;\n\tPosition end;\n\n\tRange(Position pos=0) :\n\t\tstart(pos), end(pos) {\n\t}\n\tRange(Position start_, Position end_) :\n\t\tstart(start_), end(end_) {\n\t}\n\n\tbool Valid() const {\n\t\treturn (start != invalidPosition) && (end != invalidPosition);\n\t}\n\n\t// Is the position within the range?\n\tbool Contains(Position pos) const {\n\t\tif (start < end) {\n\t\t\treturn (pos >= start && pos <= end);\n\t\t} else {\n\t\t\treturn (pos <= start && pos >= end);\n\t\t}\n\t}\n\n\t// Is the character after pos within the range?\n\tbool ContainsCharacter(Position pos) const {\n\t\tif (start < end) {\n\t\t\treturn (pos >= start && pos < end);\n\t\t} else {\n\t\t\treturn (pos < start && pos >= end);\n\t\t}\n\t}\n\n\tbool Contains(Range other) const {\n\t\treturn Contains(other.start) && Contains(other.end);\n\t}\n\n\tbool Overlaps(Range other) const {\n\t\treturn\n\t\tContains(other.start) ||\n\t\tContains(other.end) ||\n\t\tother.Contains(start) ||\n\t\tother.Contains(end);\n\t}\n};\n\nclass DocWatcher;\nclass DocModification;\nclass Document;\n\n/**\n * Interface class for regular expression searching\n */\nclass RegexSearchBase {\npublic:\n\tvirtual ~RegexSearchBase() {}\n\n\tvirtual long FindText(Document *doc, int minPos, int maxPos, const char *s,\n                        bool caseSensitive, bool word, bool wordStart, int flags, int *length) = 0;\n\n\t///@return String with the substitutions, must remain valid until the next call or destruction\n\tvirtual const char *SubstituteByPosition(Document *doc, const char *text, int *length) = 0;\n};\n\n/// Factory function for RegexSearchBase\nextern RegexSearchBase *CreateRegexSearch(CharClassify *charClassTable);\n\nstruct StyledText {\n\tsize_t length;\n\tconst char *text;\n\tbool multipleStyles;\n\tsize_t style;\n\tconst unsigned char *styles;\n\tStyledText(size_t length_, const char *text_, bool multipleStyles_, int style_, const unsigned char *styles_) :\n\t\tlength(length_), text(text_), multipleStyles(multipleStyles_), style(style_), styles(styles_) {\n\t}\n\t// Return number of bytes from start to before '\\n' or end of text.\n\t// Return 1 when start is outside text\n\tsize_t LineLength(size_t start) const {\n\t\tsize_t cur = start;\n\t\twhile ((cur < length) && (text[cur] != '\\n'))\n\t\t\tcur++;\n\t\treturn cur-start;\n\t}\n\tsize_t StyleAt(size_t i) const {\n\t\treturn multipleStyles ? styles[i] : style;\n\t}\n};\n\nclass HighlightDelimiter {\npublic:\n\tHighlightDelimiter() : isEnabled(false) {\n\t\tClear();\n\t}\n\n\tvoid Clear() {\n\t\tbeginFoldBlock = -1;\n\t\tendFoldBlock = -1;\n\t\tfirstChangeableLineBefore = -1;\n\t\tfirstChangeableLineAfter = -1;\n\t}\n\n\tbool NeedsDrawing(int line) const {\n\t\treturn isEnabled && (line <= firstChangeableLineBefore || line >= firstChangeableLineAfter);\n\t}\n\n\tbool IsFoldBlockHighlighted(int line) const {\n\t\treturn isEnabled && beginFoldBlock != -1 && beginFoldBlock <= line && line <= endFoldBlock;\n\t}\n\n\tbool IsHeadOfFoldBlock(int line) const {\n\t\treturn beginFoldBlock == line && line < endFoldBlock;\n\t}\n\n\tbool IsBodyOfFoldBlock(int line) const {\n\t\treturn beginFoldBlock != -1 && beginFoldBlock < line && line < endFoldBlock;\n\t}\n\n\tbool IsTailOfFoldBlock(int line) const {\n\t\treturn beginFoldBlock != -1 && beginFoldBlock < line && line == endFoldBlock;\n\t}\n\n\tint beginFoldBlock;\t// Begin of current fold block\n\tint endFoldBlock;\t// End of current fold block\n\tint firstChangeableLineBefore;\t// First line that triggers repaint before starting line that determined current fold block\n\tint firstChangeableLineAfter;\t// First line that triggers repaint after starting line that determined current fold block\n\tbool isEnabled;\n};\n\nclass Document;\n\nclass LexInterface {\nprotected:\n\tDocument *pdoc;\n\tILexer *instance;\n\tbool performingStyle;\t///< Prevent reentrance\npublic:\n\tLexInterface(Document *pdoc_) : pdoc(pdoc_), instance(0), performingStyle(false) {\n\t}\n\tvirtual ~LexInterface() {\n\t}\n\tvoid Colourise(int start, int end);\n\tint LineEndTypesSupported();\n\tbool UseContainerLexing() const {\n\t\treturn instance == 0;\n\t}\n};\n\n/**\n */\nclass Document : PerLine, public IDocumentWithLineEnd, public ILoader {\n\npublic:\n\t/** Used to pair watcher pointer with user data. */\n\tstruct WatcherWithUserData {\n\t\tDocWatcher *watcher;\n\t\tvoid *userData;\n\t\tWatcherWithUserData(DocWatcher *watcher_=0, void *userData_=0) :\n\t\t\twatcher(watcher_), userData(userData_) {\n\t\t}\n\t\tbool operator==(const WatcherWithUserData &other) const {\n\t\t\treturn (watcher == other.watcher) && (userData == other.userData);\n\t\t}\n\t};\n\nprivate:\n\tint refCount;\n\tCellBuffer cb;\n\tCharClassify charClass;\n\tCaseFolder *pcf;\n\tchar stylingMask;\n\tint endStyled;\n\tint styleClock;\n\tint enteredModification;\n\tint enteredStyling;\n\tint enteredReadOnlyCount;\n\n\tstd::vector<WatcherWithUserData> watchers;\n\n\t// ldSize is not real data - it is for dimensions and loops\n\tenum lineData { ldMarkers, ldLevels, ldState, ldMargin, ldAnnotation, ldSize };\n\tPerLine *perLineData[ldSize];\n\n\tbool matchesValid;\n\tRegexSearchBase *regex;\n\npublic:\n\n\tLexInterface *pli;\n\n\tint stylingBits;\n\tint stylingBitsMask;\n\n\tint eolMode;\n\t/// Can also be SC_CP_UTF8 to enable UTF-8 mode\n\tint dbcsCodePage;\n\tint lineEndBitSet;\n\tint tabInChars;\n\tint indentInChars;\n\tint actualIndentInChars;\n\tbool useTabs;\n\tbool tabIndents;\n\tbool backspaceUnindents;\n\n\tDecorationList decorations;\n\n\tDocument();\n\tvirtual ~Document();\n\n\tint AddRef();\n\tint SCI_METHOD Release();\n\n\tvirtual void Init();\n\tint LineEndTypesSupported() const;\n\tbool SetDBCSCodePage(int dbcsCodePage_);\n\tint GetLineEndTypesAllowed() const { return cb.GetLineEndTypes(); }\n\tbool SetLineEndTypesAllowed(int lineEndBitSet_);\n\tint GetLineEndTypesActive() const { return cb.GetLineEndTypes(); }\n\tvirtual void InsertLine(int line);\n\tvirtual void RemoveLine(int line);\n\n\tint SCI_METHOD Version() const {\n\t\treturn dvLineEnd;\n\t}\n\n\tvoid SCI_METHOD SetErrorStatus(int status);\n\n\tint SCI_METHOD LineFromPosition(int pos) const;\n\tint ClampPositionIntoDocument(int pos) const;\n\tbool IsCrLf(int pos) const;\n\tint LenChar(int pos);\n\tbool InGoodUTF8(int pos, int &start, int &end) const;\n\tint MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true);\n\tint NextPosition(int pos, int moveDir) const;\n\tbool NextCharacter(int &pos, int moveDir) const;\t// Returns true if pos changed\n\tint SCI_METHOD GetRelativePosition(int positionStart, int characterOffset) const;\n\tint SCI_METHOD GetCharacterAndWidth(int position, int *pWidth) const;\n\tint SCI_METHOD CodePage() const;\n\tbool SCI_METHOD IsDBCSLeadByte(char ch) const;\n\tint SafeSegment(const char *text, int length, int lengthSegment) const;\n\tEncodingFamily CodePageFamily() const;\n\n\t// Gateways to modifying document\n\tvoid ModifiedAt(int pos);\n\tvoid CheckReadOnly();\n\tbool DeleteChars(int pos, int len);\n\tbool InsertString(int position, const char *s, int insertLength);\n\tint SCI_METHOD AddData(char *data, int length);\n\tvoid * SCI_METHOD ConvertToDocument();\n\tint Undo();\n\tint Redo();\n\tbool CanUndo() const { return cb.CanUndo(); }\n\tbool CanRedo() const { return cb.CanRedo(); }\n\tvoid DeleteUndoHistory() { cb.DeleteUndoHistory(); }\n\tbool SetUndoCollection(bool collectUndo) {\n\t\treturn cb.SetUndoCollection(collectUndo);\n\t}\n\tbool IsCollectingUndo() const { return cb.IsCollectingUndo(); }\n\tvoid BeginUndoAction() { cb.BeginUndoAction(); }\n\tvoid EndUndoAction() { cb.EndUndoAction(); }\n\tvoid AddUndoAction(int token, bool mayCoalesce) { cb.AddUndoAction(token, mayCoalesce); }\n\tvoid SetSavePoint();\n\tbool IsSavePoint() const { return cb.IsSavePoint(); }\n\tconst char * SCI_METHOD BufferPointer() { return cb.BufferPointer(); }\n\tconst char *RangePointer(int position, int rangeLength) { return cb.RangePointer(position, rangeLength); }\n\tint GapPosition() const { return cb.GapPosition(); }\n\n\tint SCI_METHOD GetLineIndentation(int line);\n\tvoid SetLineIndentation(int line, int indent);\n\tint GetLineIndentPosition(int line) const;\n\tint GetColumn(int position);\n\tint CountCharacters(int startPos, int endPos);\n\tint FindColumn(int line, int column);\n\tvoid Indent(bool forwards, int lineBottom, int lineTop);\n\tstatic std::string TransformLineEnds(const char *s, size_t len, int eolModeWanted);\n\tvoid ConvertLineEnds(int eolModeSet);\n\tvoid SetReadOnly(bool set) { cb.SetReadOnly(set); }\n\tbool IsReadOnly() const { return cb.IsReadOnly(); }\n\n\tbool InsertChar(int pos, char ch);\n\tbool InsertCString(int position, const char *s);\n\tvoid DelChar(int pos);\n\tvoid DelCharBack(int pos);\n\n\tchar CharAt(int position) const { return cb.CharAt(position); }\n\tvoid SCI_METHOD GetCharRange(char *buffer, int position, int lengthRetrieve) const {\n\t\tcb.GetCharRange(buffer, position, lengthRetrieve);\n\t}\n\tchar SCI_METHOD StyleAt(int position) const { return cb.StyleAt(position); }\n\tvoid GetStyleRange(unsigned char *buffer, int position, int lengthRetrieve) const {\n\t\tcb.GetStyleRange(buffer, position, lengthRetrieve);\n\t}\n\tint GetMark(int line);\n\tint MarkerNext(int lineStart, int mask) const;\n\tint AddMark(int line, int markerNum);\n\tvoid AddMarkSet(int line, int valueSet);\n\tvoid DeleteMark(int line, int markerNum);\n\tvoid DeleteMarkFromHandle(int markerHandle);\n\tvoid DeleteAllMarks(int markerNum);\n\tint LineFromHandle(int markerHandle);\n\tint SCI_METHOD LineStart(int line) const;\n\tint SCI_METHOD LineEnd(int line) const;\n\tint LineEndPosition(int position) const;\n\tbool IsLineEndPosition(int position) const;\n\tbool IsPositionInLineEnd(int position) const;\n\tint VCHomePosition(int position) const;\n\n\tint SCI_METHOD SetLevel(int line, int level);\n\tint SCI_METHOD GetLevel(int line) const;\n\tvoid ClearLevels();\n\tint GetLastChild(int lineParent, int level=-1, int lastLine=-1);\n\tint GetFoldParent(int line) const;\n\tvoid GetHighlightDelimiters(HighlightDelimiter &hDelimiter, int line, int lastLine);\n\n\tvoid Indent(bool forwards);\n\tint ExtendWordSelect(int pos, int delta, bool onlyWordCharacters=false);\n\tint NextWordStart(int pos, int delta);\n\tint NextWordEnd(int pos, int delta);\n\tint SCI_METHOD Length() const { return cb.Length(); }\n\tvoid Allocate(int newSize) { cb.Allocate(newSize); }\n\tbool MatchesWordOptions(bool word, bool wordStart, int pos, int length) const;\n\tbool HasCaseFolder(void) const;\n\tvoid SetCaseFolder(CaseFolder *pcf_);\n\tlong FindText(int minPos, int maxPos, const char *search, bool caseSensitive, bool word,\n\t\tbool wordStart, bool regExp, int flags, int *length);\n\tconst char *SubstituteByPosition(const char *text, int *length);\n\tint LinesTotal() const;\n\n\tvoid SetDefaultCharClasses(bool includeWordClass);\n\tvoid SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass);\n\tint GetCharsOfClass(CharClassify::cc charClass, unsigned char *buffer);\n\tvoid SetStylingBits(int bits);\n\tvoid SCI_METHOD StartStyling(int position, char mask);\n\tbool SCI_METHOD SetStyleFor(int length, char style);\n\tbool SCI_METHOD SetStyles(int length, const char *styles);\n\tint GetEndStyled() const { return endStyled; }\n\tvoid EnsureStyledTo(int pos);\n\tvoid LexerChanged();\n\tint GetStyleClock() const { return styleClock; }\n\tvoid IncrementStyleClock();\n\tvoid SCI_METHOD DecorationSetCurrentIndicator(int indicator) {\n\t\tdecorations.SetCurrentIndicator(indicator);\n\t}\n\tvoid SCI_METHOD DecorationFillRange(int position, int value, int fillLength);\n\n\tint SCI_METHOD SetLineState(int line, int state);\n\tint SCI_METHOD GetLineState(int line) const;\n\tint GetMaxLineState();\n\tvoid SCI_METHOD ChangeLexerState(int start, int end);\n\n\tStyledText MarginStyledText(int line) const;\n\tvoid MarginSetStyle(int line, int style);\n\tvoid MarginSetStyles(int line, const unsigned char *styles);\n\tvoid MarginSetText(int line, const char *text);\n\tvoid MarginClearAll();\n\n\tStyledText AnnotationStyledText(int line) const;\n\tvoid AnnotationSetText(int line, const char *text);\n\tvoid AnnotationSetStyle(int line, int style);\n\tvoid AnnotationSetStyles(int line, const unsigned char *styles);\n\tint AnnotationLines(int line) const;\n\tvoid AnnotationClearAll();\n\n\tbool AddWatcher(DocWatcher *watcher, void *userData);\n\tbool RemoveWatcher(DocWatcher *watcher, void *userData);\n\n\tCharClassify::cc WordCharClass(unsigned char ch) const;\n\tbool IsWordPartSeparator(char ch) const;\n\tint WordPartLeft(int pos);\n\tint WordPartRight(int pos);\n\tint ExtendStyleRange(int pos, int delta, bool singleLine = false);\n\tbool IsWhiteLine(int line) const;\n\tint ParaUp(int pos) const;\n\tint ParaDown(int pos) const;\n\tint IndentSize() const { return actualIndentInChars; }\n\tint BraceMatch(int position, int maxReStyle);\n\nprivate:\n\tbool IsWordStartAt(int pos) const;\n\tbool IsWordEndAt(int pos) const;\n\tbool IsWordAt(int start, int end) const;\n\n\tvoid NotifyModifyAttempt();\n\tvoid NotifySavePoint(bool atSavePoint);\n\tvoid NotifyModified(DocModification mh);\n};\n\nclass UndoGroup {\n\tDocument *pdoc;\n\tbool groupNeeded;\npublic:\n\tUndoGroup(Document *pdoc_, bool groupNeeded_=true) :\n\t\tpdoc(pdoc_), groupNeeded(groupNeeded_) {\n\t\tif (groupNeeded) {\n\t\t\tpdoc->BeginUndoAction();\n\t\t}\n\t}\n\t~UndoGroup() {\n\t\tif (groupNeeded) {\n\t\t\tpdoc->EndUndoAction();\n\t\t}\n\t}\n\tbool Needed() const {\n\t\treturn groupNeeded;\n\t}\n};\n\n\n/**\n * To optimise processing of document modifications by DocWatchers, a hint is passed indicating the\n * scope of the change.\n * If the DocWatcher is a document view then this can be used to optimise screen updating.\n */\nclass DocModification {\npublic:\n  \tint modificationType;\n\tint position;\n \tint length;\n \tint linesAdded;\t/**< Negative if lines deleted. */\n \tconst char *text;\t/**< Only valid for changes to text, not for changes to style. */\n \tint line;\n\tint foldLevelNow;\n\tint foldLevelPrev;\n\tint annotationLinesAdded;\n\tint token;\n\n\tDocModification(int modificationType_, int position_=0, int length_=0,\n\t\tint linesAdded_=0, const char *text_=0, int line_=0) :\n\t\tmodificationType(modificationType_),\n\t\tposition(position_),\n\t\tlength(length_),\n\t\tlinesAdded(linesAdded_),\n\t\ttext(text_),\n\t\tline(line_),\n\t\tfoldLevelNow(0),\n\t\tfoldLevelPrev(0),\n\t\tannotationLinesAdded(0),\n\t\ttoken(0) {}\n\n\tDocModification(int modificationType_, const Action &act, int linesAdded_=0) :\n\t\tmodificationType(modificationType_),\n\t\tposition(act.position),\n\t\tlength(act.lenData),\n\t\tlinesAdded(linesAdded_),\n\t\ttext(act.data),\n\t\tline(0),\n\t\tfoldLevelNow(0),\n\t\tfoldLevelPrev(0),\n\t\tannotationLinesAdded(0),\n\t\ttoken(0) {}\n};\n\n/**\n * A class that wants to receive notifications from a Document must be derived from DocWatcher\n * and implement the notification methods. It can then be added to the watcher list with AddWatcher.\n */\nclass DocWatcher {\npublic:\n\tvirtual ~DocWatcher() {}\n\n\tvirtual void NotifyModifyAttempt(Document *doc, void *userData) = 0;\n\tvirtual void NotifySavePoint(Document *doc, void *userData, bool atSavePoint) = 0;\n\tvirtual void NotifyModified(Document *doc, DocModification mh, void *userData) = 0;\n\tvirtual void NotifyDeleted(Document *doc, void *userData) = 0;\n\tvirtual void NotifyStyleNeeded(Document *doc, void *userData, int endPos) = 0;\n\tvirtual void NotifyLexerChanged(Document *doc, void *userData) = 0;\n\tvirtual void NotifyErrorOccurred(Document *doc, void *userData, int status) = 0;\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp",
    "content": "// Scintilla source code edit control\n/** @file Editor.cxx\n ** Main code for the edit control.\n **/\n// Copyright 1998-2011 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <math.h>\n#include <assert.h>\n\n#include <string>\n#include <vector>\n#include <map>\n#include <algorithm>\n#include <memory>\n\n#include \"Platform.h\"\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n\n#include \"SplitVector.h\"\n#include \"Partitioning.h\"\n#include \"RunStyles.h\"\n#include \"ContractionState.h\"\n#include \"CellBuffer.h\"\n#include \"KeyMap.h\"\n#include \"Indicator.h\"\n#include \"XPM.h\"\n#include \"LineMarker.h\"\n#include \"Style.h\"\n#include \"ViewStyle.h\"\n#include \"CharClassify.h\"\n#include \"Decoration.h\"\n#include \"CaseFolder.h\"\n#include \"Document.h\"\n#include \"UniConversion.h\"\n#include \"Selection.h\"\n#include \"PositionCache.h\"\n#include \"Editor.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n/*\n\treturn whether this modification represents an operation that\n\tmay reasonably be deferred (not done now OR [possibly] at all)\n*/\nstatic bool CanDeferToLastStep(const DocModification &mh) {\n\tif (mh.modificationType & (SC_MOD_BEFOREINSERT | SC_MOD_BEFOREDELETE))\n\t\treturn true;\t// CAN skip\n\tif (!(mh.modificationType & (SC_PERFORMED_UNDO | SC_PERFORMED_REDO)))\n\t\treturn false;\t// MUST do\n\tif (mh.modificationType & SC_MULTISTEPUNDOREDO)\n\t\treturn true;\t// CAN skip\n\treturn false;\t\t// PRESUMABLY must do\n}\n\nstatic bool CanEliminate(const DocModification &mh) {\n\treturn\n\t    (mh.modificationType & (SC_MOD_BEFOREINSERT | SC_MOD_BEFOREDELETE)) != 0;\n}\n\n/*\n\treturn whether this modification represents the FINAL step\n\tin a [possibly lengthy] multi-step Undo/Redo sequence\n*/\nstatic bool IsLastStep(const DocModification &mh) {\n\treturn\n\t    (mh.modificationType & (SC_PERFORMED_UNDO | SC_PERFORMED_REDO)) != 0\n\t    && (mh.modificationType & SC_MULTISTEPUNDOREDO) != 0\n\t    && (mh.modificationType & SC_LASTSTEPINUNDOREDO) != 0\n\t    && (mh.modificationType & SC_MULTILINEUNDOREDO) != 0;\n}\n\nCaret::Caret() :\n\t\tactive(false), on(false), period(500) {}\n\nTimer::Timer() :\n\t\tticking(false), ticksToWait(0), tickerID(0) {}\n\nIdler::Idler() :\n\t\tstate(false), idlerID(0) {}\n\nstatic inline bool IsControlCharacter(int ch) {\n\t// iscntrl returns true for lots of chars > 127 which are displayable\n\treturn ch >= 0 && ch < ' ';\n}\n\nstatic inline bool IsAllSpacesOrTabs(char *s, unsigned int len) {\n\tfor (unsigned int i = 0; i < len; i++) {\n\t\t// This is safe because IsSpaceOrTab() will return false for null terminators\n\t\tif (!IsSpaceOrTab(s[i]))\n\t\t\treturn false;\n\t}\n\treturn true;\n}\n\nPrintParameters::PrintParameters() {\n\tmagnification = 0;\n\tcolourMode = SC_PRINT_NORMAL;\n\twrapState = eWrapWord;\n}\n\nEditor::Editor() {\n\tctrlID = 0;\n\n\tstylesValid = false;\n\ttechnology = SC_TECHNOLOGY_DEFAULT;\n\tscaleRGBAImage = 100;\n\n\tcursorMode = SC_CURSORNORMAL;\n\n\thasFocus = false;\n\thideSelection = false;\n\tinOverstrike = false;\n\tdrawOverstrikeCaret = true;\n\terrorStatus = 0;\n\tmouseDownCaptures = true;\n\n\tbufferedDraw = true;\n\ttwoPhaseDraw = true;\n\n\tlastClickTime = 0;\n\tdwellDelay = SC_TIME_FOREVER;\n\tticksToDwell = SC_TIME_FOREVER;\n\tdwelling = false;\n\tptMouseLast.x = 0;\n\tptMouseLast.y = 0;\n\tinDragDrop = ddNone;\n\tdropWentOutside = false;\n\tposDrag = SelectionPosition(invalidPosition);\n\tposDrop = SelectionPosition(invalidPosition);\n\thotSpotClickPos = INVALID_POSITION;\n\tselectionType = selChar;\n\n\tlastXChosen = 0;\n\tlineAnchorPos = 0;\n\toriginalAnchorPos = 0;\n\twordSelectAnchorStartPos = 0;\n\twordSelectAnchorEndPos = 0;\n\twordSelectInitialCaretPos = -1;\n\n\tprimarySelection = true;\n\n\tcaretXPolicy = CARET_SLOP | CARET_EVEN;\n\tcaretXSlop = 50;\n\n\tcaretYPolicy = CARET_EVEN;\n\tcaretYSlop = 0;\n\n\tvisiblePolicy = 0;\n\tvisibleSlop = 0;\n\n\tsearchAnchor = 0;\n\n\txOffset = 0;\n\txCaretMargin = 50;\n\thorizontalScrollBarVisible = true;\n\tscrollWidth = 2000;\n\ttrackLineWidth = false;\n\tlineWidthMaxSeen = 0;\n\tverticalScrollBarVisible = true;\n\tendAtLastLine = true;\n\tcaretSticky = SC_CARETSTICKY_OFF;\n\tmarginOptions = SC_MARGINOPTION_NONE;\n\tmouseSelectionRectangularSwitch = false;\n\tmultipleSelection = false;\n\tadditionalSelectionTyping = false;\n\tmultiPasteMode = SC_MULTIPASTE_ONCE;\n\tadditionalCaretsBlink = true;\n\tadditionalCaretsVisible = true;\n\tvirtualSpaceOptions = SCVS_NONE;\n\n\tpixmapLine = 0;\n\tpixmapSelMargin = 0;\n\tpixmapSelPattern = 0;\n\tpixmapSelPatternOffset1 = 0;\n\tpixmapIndentGuide = 0;\n\tpixmapIndentGuideHighlight = 0;\n\n\ttargetStart = 0;\n\ttargetEnd = 0;\n\tsearchFlags = 0;\n\n\ttopLine = 0;\n\tposTopLine = 0;\n\n\tlengthForEncode = -1;\n\n\tneedUpdateUI = 0;\n\tContainerNeedsUpdate(SC_UPDATE_CONTENT);\n\tbraces[0] = invalidPosition;\n\tbraces[1] = invalidPosition;\n\tbracesMatchStyle = STYLE_BRACEBAD;\n\thighlightGuideColumn = 0;\n\n\tpaintState = notPainting;\n\tpaintAbandonedByStyling = false;\n\tpaintingAllText = false;\n\twillRedrawAll = false;\n\n\tmodEventMask = SC_MODEVENTMASKALL;\n\n\tpdoc = new Document();\n\tpdoc->AddRef();\n\tpdoc->AddWatcher(this, 0);\n\n\trecordingMacro = false;\n\tfoldFlags = 0;\n\tfoldAutomatic = 0;\n\n\twrapWidth = LineLayout::wrapWidthInfinite;\n\n\tconvertPastes = true;\n\n\thsStart = -1;\n\thsEnd = -1;\n\n\tllc.SetLevel(LineLayoutCache::llcCaret);\n\tposCache.SetSize(0x400);\n\n\tSetRepresentations();\n}\n\nEditor::~Editor() {\n\tpdoc->RemoveWatcher(this, 0);\n\tpdoc->Release();\n\tpdoc = 0;\n\tDropGraphics(true);\n}\n\nvoid Editor::Finalise() {\n\tSetIdle(false);\n\tCancelModes();\n}\n\nvoid Editor::SetRepresentations() {\n\treprs.Clear();\n\n\t// C0 control set\n\tconst char *reps[] = {\n\t\t\"NUL\", \"SOH\", \"STX\", \"ETX\", \"EOT\", \"ENQ\", \"ACK\", \"BEL\",\n\t\t\"BS\", \"HT\", \"LF\", \"VT\", \"FF\", \"CR\", \"SO\", \"SI\",\n\t\t\"DLE\", \"DC1\", \"DC2\", \"DC3\", \"DC4\", \"NAK\", \"SYN\", \"ETB\",\n\t\t\"CAN\", \"EM\", \"SUB\", \"ESC\", \"FS\", \"GS\", \"RS\", \"US\"\n\t};\n\tfor (size_t j=0; j < (sizeof(reps) / sizeof(reps[0])); j++) {\n\t\tchar c[2] = { static_cast<char>(j), 0 };\n\t\treprs.SetRepresentation(c, reps[j]);\n\t}\n\n\t// C1 control set\n\t// As well as Unicode mode, ISO-8859-1 should use these\n\tif (IsUnicodeMode()) {\n\t\tconst char *repsC1[] = {\n\t\t\t\"PAD\", \"HOP\", \"BPH\", \"NBH\", \"IND\", \"NEL\", \"SSA\", \"ESA\",\n\t\t\t\"HTS\", \"HTJ\", \"VTS\", \"PLD\", \"PLU\", \"RI\", \"SS2\", \"SS3\",\n\t\t\t\"DCS\", \"PU1\", \"PU2\", \"STS\", \"CCH\", \"MW\", \"SPA\", \"EPA\",\n\t\t\t\"SOS\", \"SGCI\", \"SCI\", \"CSI\", \"ST\", \"OSC\", \"PM\", \"APC\"\n\t\t};\n\t\tfor (size_t j=0; j < (sizeof(repsC1) / sizeof(repsC1[0])); j++) {\n\t\t\tchar c1[3] = { '\\xc2',  static_cast<char>(0x80+j), 0 };\n\t\t\treprs.SetRepresentation(c1, repsC1[j]);\n\t\t}\n\t}\n\n\t// UTF-8 invalid bytes\n\tif (IsUnicodeMode()) {\n\t\tfor (int k=0x80; k < 0x100; k++) {\n\t\t\tchar hiByte[2] = {  static_cast<char>(k), 0 };\n\t\t\tchar hexits[4];\n// Robo 1.4\n// Robo 1.4\n#if defined(__GNUC__) && !defined(__clang__) // gcc\n#pragma GCC diagnostic push    \n#pragma GCC diagnostic ignored \"-Wformat-overflow\"\n#endif\n\t\t\tsprintf(hexits, \"x%2X\", k); \n#if defined(__GNUG__) && !defined(__clang__) // gcc\n#pragma GCC diagnostic pop\n#endif\t\n\t\t\treprs.SetRepresentation(hiByte, hexits);\n\t\t}\n\t}\n}\n\nvoid Editor::DropGraphics(bool freeObjects) {\n\tif (freeObjects) {\n\t\tdelete pixmapLine;\n\t\tpixmapLine = 0;\n\t\tdelete pixmapSelMargin;\n\t\tpixmapSelMargin = 0;\n\t\tdelete pixmapSelPattern;\n\t\tpixmapSelPattern = 0;\n\t\tdelete pixmapSelPatternOffset1;\n\t\tpixmapSelPatternOffset1 = 0;\n\t\tdelete pixmapIndentGuide;\n\t\tpixmapIndentGuide = 0;\n\t\tdelete pixmapIndentGuideHighlight;\n\t\tpixmapIndentGuideHighlight = 0;\n\t} else {\n\t\tif (pixmapLine)\n\t\t\tpixmapLine->Release();\n\t\tif (pixmapSelMargin)\n\t\t\tpixmapSelMargin->Release();\n\t\tif (pixmapSelPattern)\n\t\t\tpixmapSelPattern->Release();\n\t\tif (pixmapSelPatternOffset1)\n\t\t\tpixmapSelPatternOffset1->Release();\n\t\tif (pixmapIndentGuide)\n\t\t\tpixmapIndentGuide->Release();\n\t\tif (pixmapIndentGuideHighlight)\n\t\t\tpixmapIndentGuideHighlight->Release();\n\t}\n}\n\nvoid Editor::AllocateGraphics() {\n\tif (!pixmapLine)\n\t\tpixmapLine = Surface::Allocate(technology);\n\tif (!pixmapSelMargin)\n\t\tpixmapSelMargin = Surface::Allocate(technology);\n\tif (!pixmapSelPattern)\n\t\tpixmapSelPattern = Surface::Allocate(technology);\n\tif (!pixmapSelPatternOffset1)\n\t\tpixmapSelPatternOffset1 = Surface::Allocate(technology);\n\tif (!pixmapIndentGuide)\n\t\tpixmapIndentGuide = Surface::Allocate(technology);\n\tif (!pixmapIndentGuideHighlight)\n\t\tpixmapIndentGuideHighlight = Surface::Allocate(technology);\n}\n\nvoid Editor::InvalidateStyleData() {\n\tstylesValid = false;\n\tvs.technology = technology;\n\tDropGraphics(false);\n\tAllocateGraphics();\n\tllc.Invalidate(LineLayout::llInvalid);\n\tposCache.Clear();\n}\n\nvoid Editor::InvalidateStyleRedraw() {\n\tNeedWrapping();\n\tInvalidateStyleData();\n\tRedraw();\n}\n\nvoid Editor::RefreshStyleData() {\n\tif (!stylesValid) {\n\t\tstylesValid = true;\n\t\tAutoSurface surface(this);\n\t\tif (surface) {\n\t\t\tvs.Refresh(*surface, pdoc->tabInChars);\n\t\t}\n\t\tSetScrollBars();\n\t\tSetRectangularRange();\n\t}\n}\n\nPoint Editor::GetVisibleOriginInMain() {\n\treturn Point(0,0);\n}\n\nPoint Editor::DocumentPointFromView(Point ptView) {\n\tPoint ptDocument = ptView;\n\tif (wMargin.GetID()) {\n\t\tPoint ptOrigin = GetVisibleOriginInMain();\n\t\tptDocument.x += ptOrigin.x;\n\t\tptDocument.y += ptOrigin.y;\n\t} else {\n\t\tptDocument.x += xOffset;\n\t\tptDocument.y += topLine * vs.lineHeight;\n\t}\n\treturn ptDocument;\n}\n\nint Editor::TopLineOfMain() const {\n\tif (wMargin.GetID())\n\t\treturn 0;\n\telse\n\t\treturn topLine;\n}\n\nPRectangle Editor::GetClientRectangle() {\n\treturn wMain.GetClientPosition();\n}\n\nPRectangle Editor::GetTextRectangle() {\n\tPRectangle rc = GetClientRectangle();\n\trc.left += vs.textStart;\n\trc.right -= vs.rightMarginWidth;\n\treturn rc;\n}\n\nint Editor::LinesOnScreen() {\n\tPRectangle rcClient = GetClientRectangle();\n\tint htClient = rcClient.bottom - rcClient.top;\n\t//Platform::DebugPrintf(\"lines on screen = %d\\n\", htClient / lineHeight + 1);\n\treturn htClient / vs.lineHeight;\n}\n\nint Editor::LinesToScroll() {\n\tint retVal = LinesOnScreen() - 1;\n\tif (retVal < 1)\n\t\treturn 1;\n\telse\n\t\treturn retVal;\n}\n\nint Editor::MaxScrollPos() {\n\t//Platform::DebugPrintf(\"Lines %d screen = %d maxScroll = %d\\n\",\n\t//LinesTotal(), LinesOnScreen(), LinesTotal() - LinesOnScreen() + 1);\n\tint retVal = cs.LinesDisplayed();\n\tif (endAtLastLine) {\n\t\tretVal -= LinesOnScreen();\n\t} else {\n\t\tretVal--;\n\t}\n\tif (retVal < 0) {\n\t\treturn 0;\n\t} else {\n\t\treturn retVal;\n\t}\n}\n\nconst char *ControlCharacterString(unsigned char ch) {\n\tconst char *reps[] = {\n\t\t\"NUL\", \"SOH\", \"STX\", \"ETX\", \"EOT\", \"ENQ\", \"ACK\", \"BEL\",\n\t\t\"BS\", \"HT\", \"LF\", \"VT\", \"FF\", \"CR\", \"SO\", \"SI\",\n\t\t\"DLE\", \"DC1\", \"DC2\", \"DC3\", \"DC4\", \"NAK\", \"SYN\", \"ETB\",\n\t\t\"CAN\", \"EM\", \"SUB\", \"ESC\", \"FS\", \"GS\", \"RS\", \"US\"\n\t};\n\tif (ch < (sizeof(reps) / sizeof(reps[0]))) {\n\t\treturn reps[ch];\n\t} else {\n\t\treturn \"BAD\";\n\t}\n}\n\n/**\n * Convenience class to ensure LineLayout objects are always disposed.\n */\nclass AutoLineLayout {\n\tLineLayoutCache &llc;\n\tLineLayout *ll;\n\tAutoLineLayout &operator=(const AutoLineLayout &);\npublic:\n\tAutoLineLayout(LineLayoutCache &llc_, LineLayout *ll_) : llc(llc_), ll(ll_) {}\n\t~AutoLineLayout() {\n\t\tllc.Dispose(ll);\n\t\tll = 0;\n\t}\n\tLineLayout *operator->() const {\n\t\treturn ll;\n\t}\n\toperator LineLayout *() const {\n\t\treturn ll;\n\t}\n\tvoid Set(LineLayout *ll_) {\n\t\tllc.Dispose(ll);\n\t\tll = ll_;\n\t}\n};\n\nSelectionPosition Editor::ClampPositionIntoDocument(SelectionPosition sp) const {\n\tif (sp.Position() < 0) {\n\t\treturn SelectionPosition(0);\n\t} else if (sp.Position() > pdoc->Length()) {\n\t\treturn SelectionPosition(pdoc->Length());\n\t} else {\n\t\t// If not at end of line then set offset to 0\n\t\tif (!pdoc->IsLineEndPosition(sp.Position()))\n\t\t\tsp.SetVirtualSpace(0);\n\t\treturn sp;\n\t}\n}\n\nPoint Editor::LocationFromPosition(SelectionPosition pos) {\n\tPoint pt;\n\tRefreshStyleData();\n\tif (pos.Position() == INVALID_POSITION)\n\t\treturn pt;\n\tint line = pdoc->LineFromPosition(pos.Position());\n\tint lineVisible = cs.DisplayFromDoc(line);\n\t//Platform::DebugPrintf(\"line=%d\\n\", line);\n\tAutoSurface surface(this);\n\tAutoLineLayout ll(llc, RetrieveLineLayout(line));\n\tif (surface && ll) {\n\t\t// -1 because of adding in for visible lines in following loop.\n\t\tpt.y = (lineVisible - topLine - 1) * vs.lineHeight;\n\t\tpt.x = 0;\n\t\tunsigned int posLineStart = pdoc->LineStart(line);\n\t\tLayoutLine(line, surface, vs, ll, wrapWidth);\n\t\tint posInLine = pos.Position() - posLineStart;\n\t\t// In case of very long line put x at arbitrary large position\n\t\tif (posInLine > ll->maxLineLength) {\n\t\t\tpt.x = ll->positions[ll->maxLineLength] - ll->positions[ll->LineStart(ll->lines)];\n\t\t}\n\n\t\tfor (int subLine = 0; subLine < ll->lines; subLine++) {\n\t\t\tif ((posInLine >= ll->LineStart(subLine)) && (posInLine <= ll->LineStart(subLine + 1))) {\n\t\t\t\tpt.x = ll->positions[posInLine] - ll->positions[ll->LineStart(subLine)];\n\t\t\t\tif (ll->wrapIndent != 0) {\n\t\t\t\t\tint lineStart = ll->LineStart(subLine);\n\t\t\t\t\tif (lineStart != 0)\t// Wrapped\n\t\t\t\t\t\tpt.x += ll->wrapIndent;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (posInLine >= ll->LineStart(subLine)) {\n\t\t\t\tpt.y += vs.lineHeight;\n\t\t\t}\n\t\t}\n\t\tpt.x += vs.textStart - xOffset;\n\t}\n\tpt.x += pos.VirtualSpace() * vs.styles[ll->EndLineStyle()].spaceWidth;\n\treturn pt;\n}\n\nPoint Editor::LocationFromPosition(int pos) {\n\treturn LocationFromPosition(SelectionPosition(pos));\n}\n\nint Editor::XFromPosition(int pos) {\n\tPoint pt = LocationFromPosition(pos);\n\treturn pt.x - vs.textStart + xOffset;\n}\n\nint Editor::XFromPosition(SelectionPosition sp) {\n\tPoint pt = LocationFromPosition(sp);\n\treturn pt.x - vs.textStart + xOffset;\n}\n\nint Editor::LineFromLocation(Point pt) const {\n\treturn cs.DocFromDisplay(pt.y / vs.lineHeight + topLine);\n}\n\nvoid Editor::SetTopLine(int topLineNew) {\n\tif ((topLine != topLineNew) && (topLineNew >= 0)) {\n\t\ttopLine = topLineNew;\n\t\tContainerNeedsUpdate(SC_UPDATE_V_SCROLL);\n\t}\n\tposTopLine = pdoc->LineStart(cs.DocFromDisplay(topLine));\n}\n\nSelectionPosition Editor::SPositionFromLocation(Point pt, bool canReturnInvalid, bool charPosition, bool virtualSpace) {\n\tRefreshStyleData();\n\tif (canReturnInvalid) {\n\t\tPRectangle rcClient = GetTextRectangle();\n\t\t// May be in scroll view coordinates so translate back to main view\n\t\tPoint ptOrigin = GetVisibleOriginInMain();\n\t\trcClient.Move(-ptOrigin.x, -ptOrigin.y);\n\t\tif (!rcClient.Contains(pt))\n\t\t\treturn SelectionPosition(INVALID_POSITION);\n\t\tif (pt.x < vs.textStart)\n\t\t\treturn SelectionPosition(INVALID_POSITION);\n\t\tif (pt.y < 0)\n\t\t\treturn SelectionPosition(INVALID_POSITION);\n\t}\n\tpt = DocumentPointFromView(pt);\n\tpt.x = pt.x - vs.textStart;\n\tint visibleLine = floor(pt.y / vs.lineHeight);\n\tif (!canReturnInvalid && (visibleLine < 0))\n\t\tvisibleLine = 0;\n\tint lineDoc = cs.DocFromDisplay(visibleLine);\n\tif (canReturnInvalid && (lineDoc < 0))\n\t\treturn SelectionPosition(INVALID_POSITION);\n\tif (lineDoc >= pdoc->LinesTotal())\n\t\treturn SelectionPosition(canReturnInvalid ? INVALID_POSITION : pdoc->Length());\n\tunsigned int posLineStart = pdoc->LineStart(lineDoc);\n\tSelectionPosition retVal(canReturnInvalid ? INVALID_POSITION : static_cast<int>(posLineStart));\n\tAutoSurface surface(this);\n\tAutoLineLayout ll(llc, RetrieveLineLayout(lineDoc));\n\tif (surface && ll) {\n\t\tLayoutLine(lineDoc, surface, vs, ll, wrapWidth);\n\t\tint lineStartSet = cs.DisplayFromDoc(lineDoc);\n\t\tint subLine = visibleLine - lineStartSet;\n\t\tif (subLine < ll->lines) {\n\t\t\tint lineStart = ll->LineStart(subLine);\n\t\t\tint lineEnd = ll->LineLastVisible(subLine);\n\t\t\tXYPOSITION subLineStart = ll->positions[lineStart];\n\n\t\t\tif (ll->wrapIndent != 0) {\n\t\t\t\tif (lineStart != 0)\t// Wrapped\n\t\t\t\t\tpt.x -= ll->wrapIndent;\n\t\t\t}\n\t\t\tint i = ll->FindBefore(pt.x + subLineStart, lineStart, lineEnd);\n\t\t\twhile (i < lineEnd) {\n\t\t\t\tif (charPosition) {\n\t\t\t\t\tif ((pt.x + subLineStart) < (ll->positions[i + 1])) {\n\t\t\t\t\t\treturn SelectionPosition(pdoc->MovePositionOutsideChar(i + posLineStart, 1));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif ((pt.x + subLineStart) < ((ll->positions[i] + ll->positions[i + 1]) / 2)) {\n\t\t\t\t\t\treturn SelectionPosition(pdoc->MovePositionOutsideChar(i + posLineStart, 1));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (virtualSpace) {\n\t\t\t\tconst XYPOSITION spaceWidth = vs.styles[ll->EndLineStyle()].spaceWidth;\n\t\t\t\tint spaceOffset = (pt.x + subLineStart - ll->positions[lineEnd] + spaceWidth / 2) /\n\t\t\t\t\tspaceWidth;\n\t\t\t\treturn SelectionPosition(lineEnd + posLineStart, spaceOffset);\n\t\t\t} else if (canReturnInvalid) {\n\t\t\t\tif (pt.x < (ll->positions[lineEnd] - subLineStart)) {\n\t\t\t\t\treturn SelectionPosition(pdoc->MovePositionOutsideChar(lineEnd + posLineStart, 1));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn SelectionPosition(lineEnd + posLineStart);\n\t\t\t}\n\t\t}\n\t\tif (!canReturnInvalid)\n\t\t\treturn SelectionPosition(ll->numCharsInLine + posLineStart);\n\t}\n\treturn retVal;\n}\n\nint Editor::PositionFromLocation(Point pt, bool canReturnInvalid, bool charPosition) {\n\treturn SPositionFromLocation(pt, canReturnInvalid, charPosition, false).Position();\n}\n\n/**\n * Find the document position corresponding to an x coordinate on a particular document line.\n * Ensure is between whole characters when document is in multi-byte or UTF-8 mode.\n */\nSelectionPosition Editor::SPositionFromLineX(int lineDoc, int x) {\n\tRefreshStyleData();\n\tif (lineDoc >= pdoc->LinesTotal())\n\t\treturn SelectionPosition(pdoc->Length());\n\t//Platform::DebugPrintf(\"Position of (%d,%d) line = %d top=%d\\n\", pt.x, pt.y, line, topLine);\n\tAutoSurface surface(this);\n\tAutoLineLayout ll(llc, RetrieveLineLayout(lineDoc));\n\tint retVal = 0;\n\tif (surface && ll) {\n\t\tunsigned int posLineStart = pdoc->LineStart(lineDoc);\n\t\tLayoutLine(lineDoc, surface, vs, ll, wrapWidth);\n\t\tint subLine = 0;\n\t\tint lineStart = ll->LineStart(subLine);\n\t\tint lineEnd = ll->LineLastVisible(subLine);\n\t\tXYPOSITION subLineStart = ll->positions[lineStart];\n\t\tXYPOSITION newX = x;\n\n\t\tif (ll->wrapIndent != 0) {\n\t\t\tif (lineStart != 0)\t// Wrapped\n\t\t\t\tnewX -= ll->wrapIndent;\n\t\t}\n\t\tint i = ll->FindBefore(newX + subLineStart, lineStart, lineEnd);\n\t\twhile (i < lineEnd) {\n\t\t\tif ((newX + subLineStart) < ((ll->positions[i] + ll->positions[i + 1]) / 2)) {\n\t\t\t\tretVal = pdoc->MovePositionOutsideChar(i + posLineStart, 1);\n\t\t\t\treturn SelectionPosition(retVal);\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\t\tconst XYPOSITION spaceWidth = vs.styles[ll->EndLineStyle()].spaceWidth;\n\t\tint spaceOffset = (newX + subLineStart - ll->positions[lineEnd] + spaceWidth / 2) / spaceWidth;\n\t\treturn SelectionPosition(lineEnd + posLineStart, spaceOffset);\n\t}\n\treturn SelectionPosition(retVal);\n}\n\nint Editor::PositionFromLineX(int lineDoc, int x) {\n\treturn SPositionFromLineX(lineDoc, x).Position();\n}\n\n/**\n * If painting then abandon the painting because a wider redraw is needed.\n * @return true if calling code should stop drawing.\n */\nbool Editor::AbandonPaint() {\n\tif ((paintState == painting) && !paintingAllText) {\n\t\tpaintState = paintAbandoned;\n\t}\n\treturn paintState == paintAbandoned;\n}\n\nvoid Editor::RedrawRect(PRectangle rc) {\n\t//Platform::DebugPrintf(\"Redraw %0d,%0d - %0d,%0d\\n\", rc.left, rc.top, rc.right, rc.bottom);\n\n\t// Clip the redraw rectangle into the client area\n\tPRectangle rcClient = GetClientRectangle();\n\tif (rc.top < rcClient.top)\n\t\trc.top = rcClient.top;\n\tif (rc.bottom > rcClient.bottom)\n\t\trc.bottom = rcClient.bottom;\n\tif (rc.left < rcClient.left)\n\t\trc.left = rcClient.left;\n\tif (rc.right > rcClient.right)\n\t\trc.right = rcClient.right;\n\n\tif ((rc.bottom > rc.top) && (rc.right > rc.left)) {\n\t\twMain.InvalidateRectangle(rc);\n\t}\n}\n\nvoid Editor::Redraw() {\n\t//Platform::DebugPrintf(\"Redraw all\\n\");\n\tPRectangle rcClient = GetClientRectangle();\n\twMain.InvalidateRectangle(rcClient);\n\tif (wMargin.GetID())\n\t\twMargin.InvalidateAll();\n\t//wMain.InvalidateAll();\n}\n\nvoid Editor::RedrawSelMargin(int line, bool allAfter) {\n\tif (!AbandonPaint()) {\n\t\tif (vs.maskInLine) {\n\t\t\tRedraw();\n\t\t} else {\n\t\t\tPRectangle rcSelMargin = GetClientRectangle();\n\t\t\trcSelMargin.right = rcSelMargin.left + vs.fixedColumnWidth;\n\t\t\tif (line != -1) {\n\t\t\t\tint position = pdoc->LineStart(line);\n\t\t\t\tPRectangle rcLine = RectangleFromRange(position, position);\n\n\t\t\t\t// Inflate line rectangle if there are image markers with height larger than line height\n\t\t\t\tif (vs.largestMarkerHeight > vs.lineHeight) {\n\t\t\t\t\tint delta = (vs.largestMarkerHeight - vs.lineHeight + 1) / 2;\n\t\t\t\t\trcLine.top -= delta;\n\t\t\t\t\trcLine.bottom += delta;\n\t\t\t\t\tif (rcLine.top < rcSelMargin.top)\n\t\t\t\t\t\trcLine.top = rcSelMargin.top;\n\t\t\t\t\tif (rcLine.bottom > rcSelMargin.bottom)\n\t\t\t\t\t\trcLine.bottom = rcSelMargin.bottom;\n\t\t\t\t}\n\n\t\t\t\trcSelMargin.top = rcLine.top;\n\t\t\t\tif (!allAfter)\n\t\t\t\t\trcSelMargin.bottom = rcLine.bottom;\n\t\t\t\tif (rcSelMargin.Empty())\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (wMargin.GetID()) {\n\t\t\t\tPoint ptOrigin = GetVisibleOriginInMain();\n\t\t\t\trcSelMargin.Move(-ptOrigin.x, -ptOrigin.y);\n\t\t\t\twMargin.InvalidateRectangle(rcSelMargin);\n\t\t\t} else {\n\t\t\t\twMain.InvalidateRectangle(rcSelMargin);\n\t\t\t}\n\t\t}\n\t}\n}\n\nPRectangle Editor::RectangleFromRange(int start, int end) {\n\tint minPos = start;\n\tif (minPos > end)\n\t\tminPos = end;\n\tint maxPos = start;\n\tif (maxPos < end)\n\t\tmaxPos = end;\n\tint minLine = cs.DisplayFromDoc(pdoc->LineFromPosition(minPos));\n\tint lineDocMax = pdoc->LineFromPosition(maxPos);\n\tint maxLine = cs.DisplayFromDoc(lineDocMax) + cs.GetHeight(lineDocMax) - 1;\n\tPRectangle rcClient = GetTextRectangle();\n\tPRectangle rc;\n\tconst int leftTextOverlap = ((xOffset == 0) && (vs.leftMarginWidth > 0)) ? 1 : 0;\n\trc.left = vs.textStart - leftTextOverlap;\n\trc.top = (minLine - TopLineOfMain()) * vs.lineHeight;\n\tif (rc.top < rcClient.top)\n\t\trc.top = rcClient.top;\n\trc.right = rcClient.right;\n\trc.bottom = (maxLine - TopLineOfMain() + 1) * vs.lineHeight;\n\n\treturn rc;\n}\n\nvoid Editor::InvalidateRange(int start, int end) {\n\tRedrawRect(RectangleFromRange(start, end));\n}\n\nint Editor::CurrentPosition() const {\n\treturn sel.MainCaret();\n}\n\nbool Editor::SelectionEmpty() const {\n\treturn sel.Empty();\n}\n\nSelectionPosition Editor::SelectionStart() {\n\treturn sel.RangeMain().Start();\n}\n\nSelectionPosition Editor::SelectionEnd() {\n\treturn sel.RangeMain().End();\n}\n\nvoid Editor::SetRectangularRange() {\n\tif (sel.IsRectangular()) {\n\t\tint xAnchor = XFromPosition(sel.Rectangular().anchor);\n\t\tint xCaret = XFromPosition(sel.Rectangular().caret);\n\t\tif (sel.selType == Selection::selThin) {\n\t\t\txCaret = xAnchor;\n\t\t}\n\t\tint lineAnchorRect = pdoc->LineFromPosition(sel.Rectangular().anchor.Position());\n\t\tint lineCaret = pdoc->LineFromPosition(sel.Rectangular().caret.Position());\n\t\tint increment = (lineCaret > lineAnchorRect) ? 1 : -1;\n\t\tfor (int line=lineAnchorRect; line != lineCaret+increment; line += increment) {\n\t\t\tSelectionRange range(SPositionFromLineX(line, xCaret), SPositionFromLineX(line, xAnchor));\n\t\t\tif ((virtualSpaceOptions & SCVS_RECTANGULARSELECTION) == 0)\n\t\t\t\trange.ClearVirtualSpace();\n\t\t\tif (line == lineAnchorRect)\n\t\t\t\tsel.SetSelection(range);\n\t\t\telse\n\t\t\t\tsel.AddSelectionWithoutTrim(range);\n\t\t}\n\t}\n}\n\nvoid Editor::ThinRectangularRange() {\n\tif (sel.IsRectangular()) {\n\t\tsel.selType = Selection::selThin;\n\t\tif (sel.Rectangular().caret < sel.Rectangular().anchor) {\n\t\t\tsel.Rectangular() = SelectionRange(sel.Range(sel.Count()-1).caret, sel.Range(0).anchor);\n\t\t} else {\n\t\t\tsel.Rectangular() = SelectionRange(sel.Range(sel.Count()-1).anchor, sel.Range(0).caret);\n\t\t}\n\t\tSetRectangularRange();\n\t}\n}\n\nvoid Editor::InvalidateSelection(SelectionRange newMain, bool invalidateWholeSelection) {\n\tif (sel.Count() > 1 || !(sel.RangeMain().anchor == newMain.anchor) || sel.IsRectangular()) {\n\t\tinvalidateWholeSelection = true;\n\t}\n\tint firstAffected = Platform::Minimum(sel.RangeMain().Start().Position(), newMain.Start().Position());\n\t// +1 for lastAffected ensures caret repainted\n\tint lastAffected = Platform::Maximum(newMain.caret.Position()+1, newMain.anchor.Position());\n\tlastAffected = Platform::Maximum(lastAffected, sel.RangeMain().End().Position());\n\tif (invalidateWholeSelection) {\n\t\tfor (size_t r=0; r<sel.Count(); r++) {\n\t\t\tfirstAffected = Platform::Minimum(firstAffected, sel.Range(r).caret.Position());\n\t\t\tfirstAffected = Platform::Minimum(firstAffected, sel.Range(r).anchor.Position());\n\t\t\tlastAffected = Platform::Maximum(lastAffected, sel.Range(r).caret.Position()+1);\n\t\t\tlastAffected = Platform::Maximum(lastAffected, sel.Range(r).anchor.Position());\n\t\t}\n\t}\n\tContainerNeedsUpdate(SC_UPDATE_SELECTION);\n\tInvalidateRange(firstAffected, lastAffected);\n}\n\nvoid Editor::SetSelection(SelectionPosition currentPos_, SelectionPosition anchor_) {\n\tcurrentPos_ = ClampPositionIntoDocument(currentPos_);\n\tanchor_ = ClampPositionIntoDocument(anchor_);\n\tint currentLine = pdoc->LineFromPosition(currentPos_.Position());\n\t/* For Line selection - ensure the anchor and caret are always\n\t   at the beginning and end of the region lines. */\n\tif (sel.selType == Selection::selLines) {\n\t\tif (currentPos_ > anchor_) {\n\t\t\tanchor_ = SelectionPosition(pdoc->LineStart(pdoc->LineFromPosition(anchor_.Position())));\n\t\t\tcurrentPos_ = SelectionPosition(pdoc->LineEnd(pdoc->LineFromPosition(currentPos_.Position())));\n\t\t} else {\n\t\t\tcurrentPos_ = SelectionPosition(pdoc->LineStart(pdoc->LineFromPosition(currentPos_.Position())));\n\t\t\tanchor_ = SelectionPosition(pdoc->LineEnd(pdoc->LineFromPosition(anchor_.Position())));\n\t\t}\n\t}\n\tSelectionRange rangeNew(currentPos_, anchor_);\n\tif (sel.Count() > 1 || !(sel.RangeMain() == rangeNew)) {\n\t\tInvalidateSelection(rangeNew);\n\t}\n\tsel.RangeMain() = rangeNew;\n\tSetRectangularRange();\n\tClaimSelection();\n\n\tif (highlightDelimiter.NeedsDrawing(currentLine)) {\n\t\tRedrawSelMargin();\n\t}\n\tQueueIdleWork(WorkNeeded::workUpdateUI);\n}\n\nvoid Editor::SetSelection(int currentPos_, int anchor_) {\n\tSetSelection(SelectionPosition(currentPos_), SelectionPosition(anchor_));\n}\n\n// Just move the caret on the main selection\nvoid Editor::SetSelection(SelectionPosition currentPos_) {\n\tcurrentPos_ = ClampPositionIntoDocument(currentPos_);\n\tint currentLine = pdoc->LineFromPosition(currentPos_.Position());\n\tif (sel.Count() > 1 || !(sel.RangeMain().caret == currentPos_)) {\n\t\tInvalidateSelection(SelectionRange(currentPos_));\n\t}\n\tif (sel.IsRectangular()) {\n\t\tsel.Rectangular() =\n\t\t\tSelectionRange(SelectionPosition(currentPos_), sel.Rectangular().anchor);\n\t\tSetRectangularRange();\n\t} else {\n\t\tsel.RangeMain() =\n\t\t\tSelectionRange(SelectionPosition(currentPos_), sel.RangeMain().anchor);\n\t}\n\tClaimSelection();\n\n\tif (highlightDelimiter.NeedsDrawing(currentLine)) {\n\t\tRedrawSelMargin();\n\t}\n\tQueueIdleWork(WorkNeeded::workUpdateUI);\n}\n\nvoid Editor::SetSelection(int currentPos_) {\n\tSetSelection(SelectionPosition(currentPos_));\n}\n\nvoid Editor::SetEmptySelection(SelectionPosition currentPos_) {\n\tint currentLine = pdoc->LineFromPosition(currentPos_.Position());\n\tSelectionRange rangeNew(ClampPositionIntoDocument(currentPos_));\n\tif (sel.Count() > 1 || !(sel.RangeMain() == rangeNew)) {\n\t\tInvalidateSelection(rangeNew);\n\t}\n\tsel.Clear();\n\tsel.RangeMain() = rangeNew;\n\tSetRectangularRange();\n\tClaimSelection();\n\n\tif (highlightDelimiter.NeedsDrawing(currentLine)) {\n\t\tRedrawSelMargin();\n\t}\n\tQueueIdleWork(WorkNeeded::workUpdateUI);\n}\n\nvoid Editor::SetEmptySelection(int currentPos_) {\n\tSetEmptySelection(SelectionPosition(currentPos_));\n}\n\nbool Editor::RangeContainsProtected(int start, int end) const {\n\tif (vs.ProtectionActive()) {\n\t\tif (start > end) {\n\t\t\tint t = start;\n\t\t\tstart = end;\n\t\t\tend = t;\n\t\t}\n\t\tint mask = pdoc->stylingBitsMask;\n\t\tfor (int pos = start; pos < end; pos++) {\n\t\t\tif (vs.styles[pdoc->StyleAt(pos) & mask].IsProtected())\n\t\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nbool Editor::SelectionContainsProtected() {\n\tfor (size_t r=0; r<sel.Count(); r++) {\n\t\tif (RangeContainsProtected(sel.Range(r).Start().Position(),\n\t\t\tsel.Range(r).End().Position())) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * Asks document to find a good position and then moves out of any invisible positions.\n */\nint Editor::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) const {\n\treturn MovePositionOutsideChar(SelectionPosition(pos), moveDir, checkLineEnd).Position();\n}\n\nSelectionPosition Editor::MovePositionOutsideChar(SelectionPosition pos, int moveDir, bool checkLineEnd) const {\n\tint posMoved = pdoc->MovePositionOutsideChar(pos.Position(), moveDir, checkLineEnd);\n\tif (posMoved != pos.Position())\n\t\tpos.SetPosition(posMoved);\n\tif (vs.ProtectionActive()) {\n\t\tint mask = pdoc->stylingBitsMask;\n\t\tif (moveDir > 0) {\n\t\t\tif ((pos.Position() > 0) && vs.styles[pdoc->StyleAt(pos.Position() - 1) & mask].IsProtected()) {\n\t\t\t\twhile ((pos.Position() < pdoc->Length()) &&\n\t\t\t\t        (vs.styles[pdoc->StyleAt(pos.Position()) & mask].IsProtected()))\n\t\t\t\t\tpos.Add(1);\n\t\t\t}\n\t\t} else if (moveDir < 0) {\n\t\t\tif (vs.styles[pdoc->StyleAt(pos.Position()) & mask].IsProtected()) {\n\t\t\t\twhile ((pos.Position() > 0) &&\n\t\t\t\t        (vs.styles[pdoc->StyleAt(pos.Position() - 1) & mask].IsProtected()))\n\t\t\t\t\tpos.Add(-1);\n\t\t\t}\n\t\t}\n\t}\n\treturn pos;\n}\n\nint Editor::MovePositionTo(SelectionPosition newPos, Selection::selTypes selt, bool ensureVisible) {\n\tbool simpleCaret = (sel.Count() == 1) && sel.Empty();\n\tSelectionPosition spCaret = sel.Last();\n\n\tint delta = newPos.Position() - sel.MainCaret();\n\tnewPos = ClampPositionIntoDocument(newPos);\n\tnewPos = MovePositionOutsideChar(newPos, delta);\n\tif (!multipleSelection && sel.IsRectangular() && (selt == Selection::selStream)) {\n\t\t// Can't turn into multiple selection so clear additional selections\n\t\tInvalidateSelection(SelectionRange(newPos), true);\n\t\tSelectionRange rangeMain = sel.RangeMain();\n\t\tsel.SetSelection(rangeMain);\n\t}\n\tif (!sel.IsRectangular() && (selt == Selection::selRectangle)) {\n\t\t// Switching to rectangular\n\t\tInvalidateSelection(sel.RangeMain(), false);\n\t\tSelectionRange rangeMain = sel.RangeMain();\n\t\tsel.Clear();\n\t\tsel.Rectangular() = rangeMain;\n\t}\n\tif (selt != Selection::noSel) {\n\t\tsel.selType = selt;\n\t}\n\tif (selt != Selection::noSel || sel.MoveExtends()) {\n\t\tSetSelection(newPos);\n\t} else {\n\t\tSetEmptySelection(newPos);\n\t}\n\tShowCaretAtCurrentPosition();\n\n\tint currentLine = pdoc->LineFromPosition(newPos.Position());\n\tif (ensureVisible) {\n\t\t// In case in need of wrapping to ensure DisplayFromDoc works.\n\t\tif (currentLine >= wrapPending.start)\n\t\t\tWrapLines(wsAll);\n\t\tXYScrollPosition newXY = XYScrollToMakeVisible(\n\t\t\tSelectionRange(posDrag.IsValid() ? posDrag : sel.RangeMain().caret), xysDefault);\n\t\tif (simpleCaret && (newXY.xOffset == xOffset)) {\n\t\t\t// simple vertical scroll then invalidate\n\t\t\tScrollTo(newXY.topLine);\n\t\t\tInvalidateSelection(SelectionRange(spCaret), true);\n\t\t} else {\n\t\t\tSetXYScroll(newXY);\n\t\t}\n\t}\n\n\tif (highlightDelimiter.NeedsDrawing(currentLine)) {\n\t\tRedrawSelMargin();\n\t}\n\treturn 0;\n}\n\nint Editor::MovePositionTo(int newPos, Selection::selTypes selt, bool ensureVisible) {\n\treturn MovePositionTo(SelectionPosition(newPos), selt, ensureVisible);\n}\n\nSelectionPosition Editor::MovePositionSoVisible(SelectionPosition pos, int moveDir) {\n\tpos = ClampPositionIntoDocument(pos);\n\tpos = MovePositionOutsideChar(pos, moveDir);\n\tint lineDoc = pdoc->LineFromPosition(pos.Position());\n\tif (cs.GetVisible(lineDoc)) {\n\t\treturn pos;\n\t} else {\n\t\tint lineDisplay = cs.DisplayFromDoc(lineDoc);\n\t\tif (moveDir > 0) {\n\t\t\t// lineDisplay is already line before fold as lines in fold use display line of line after fold\n\t\t\tlineDisplay = Platform::Clamp(lineDisplay, 0, cs.LinesDisplayed());\n\t\t\treturn SelectionPosition(pdoc->LineStart(cs.DocFromDisplay(lineDisplay)));\n\t\t} else {\n\t\t\tlineDisplay = Platform::Clamp(lineDisplay - 1, 0, cs.LinesDisplayed());\n\t\t\treturn SelectionPosition(pdoc->LineEnd(cs.DocFromDisplay(lineDisplay)));\n\t\t}\n\t}\n}\n\nSelectionPosition Editor::MovePositionSoVisible(int pos, int moveDir) {\n\treturn MovePositionSoVisible(SelectionPosition(pos), moveDir);\n}\n\nPoint Editor::PointMainCaret() {\n\treturn LocationFromPosition(sel.Range(sel.Main()).caret);\n}\n\n/**\n * Choose the x position that the caret will try to stick to\n * as it moves up and down.\n */\nvoid Editor::SetLastXChosen() {\n\tPoint pt = PointMainCaret();\n\tlastXChosen = pt.x + xOffset;\n}\n\nvoid Editor::ScrollTo(int line, bool moveThumb) {\n\tint topLineNew = Platform::Clamp(line, 0, MaxScrollPos());\n\tif (topLineNew != topLine) {\n\t\t// Try to optimise small scrolls\n#ifndef UNDER_CE\n\t\tint linesToMove = topLine - topLineNew;\n\t\tbool performBlit = (abs(linesToMove) <= 10) && (paintState == notPainting);\n\t\twillRedrawAll = !performBlit;\n#endif\n\t\tSetTopLine(topLineNew);\n\t\t// Optimize by styling the view as this will invalidate any needed area\n\t\t// which could abort the initial paint if discovered later.\n\t\tStyleToPositionInView(PositionAfterArea(GetClientRectangle()));\n#ifndef UNDER_CE\n\t\t// Perform redraw rather than scroll if many lines would be redrawn anyway.\n\t\tif (performBlit) {\n\t\t\tScrollText(linesToMove);\n\t\t} else {\n\t\t\tRedraw();\n\t\t}\n\t\twillRedrawAll = false;\n#else\n\t\tRedraw();\n#endif\n\t\tif (moveThumb) {\n\t\t\tSetVerticalScrollPos();\n\t\t}\n\t}\n}\n\nvoid Editor::ScrollText(int /* linesToMove */) {\n\t//Platform::DebugPrintf(\"Editor::ScrollText %d\\n\", linesToMove);\n\tRedraw();\n}\n\nvoid Editor::HorizontalScrollTo(int xPos) {\n\t//Platform::DebugPrintf(\"HorizontalScroll %d\\n\", xPos);\n\tif (xPos < 0)\n\t\txPos = 0;\n\tif (!Wrapping() && (xOffset != xPos)) {\n\t\txOffset = xPos;\n\t\tContainerNeedsUpdate(SC_UPDATE_H_SCROLL);\n\t\tSetHorizontalScrollPos();\n\t\tRedrawRect(GetClientRectangle());\n\t}\n}\n\nvoid Editor::VerticalCentreCaret() {\n\tint lineDoc = pdoc->LineFromPosition(sel.IsRectangular() ? sel.Rectangular().caret.Position() : sel.MainCaret());\n\tint lineDisplay = cs.DisplayFromDoc(lineDoc);\n\tint newTop = lineDisplay - (LinesOnScreen() / 2);\n\tif (topLine != newTop) {\n\t\tSetTopLine(newTop > 0 ? newTop : 0);\n\t\tRedrawRect(GetClientRectangle());\n\t}\n}\n\n// Avoid 64 bit compiler warnings.\n// Scintilla does not support text buffers larger than 2**31\nstatic int istrlen(const char *s) {\n\treturn static_cast<int>(strlen(s));\n}\n\nvoid Editor::MoveSelectedLines(int lineDelta) {\n\n\t// if selection doesn't start at the beginning of the line, set the new start\n\tint selectionStart = SelectionStart().Position();\n\tint startLine = pdoc->LineFromPosition(selectionStart);\n\tint beginningOfStartLine = pdoc->LineStart(startLine);\n\tselectionStart = beginningOfStartLine;\n\n\t// if selection doesn't end at the beginning of a line greater than that of the start,\n\t// then set it at the beginning of the next one\n\tint selectionEnd = SelectionEnd().Position();\n\tint endLine = pdoc->LineFromPosition(selectionEnd);\n\tint beginningOfEndLine = pdoc->LineStart(endLine);\n\tbool appendEol = false;\n\tif (selectionEnd > beginningOfEndLine\n\t\t|| selectionStart == selectionEnd) {\n\t\tselectionEnd = pdoc->LineStart(endLine + 1);\n\t\tappendEol = (selectionEnd == pdoc->Length() && pdoc->LineFromPosition(selectionEnd) == endLine);\n\t}\n\n\t// if there's nowhere for the selection to move\n\t// (i.e. at the beginning going up or at the end going down),\n\t// stop it right there!\n\tif ((selectionStart == 0 && lineDelta < 0)\n\t\t|| (selectionEnd == pdoc->Length() && lineDelta > 0)\n\t        || selectionStart == selectionEnd) {\n\t\treturn;\n\t}\n\n\tUndoGroup ug(pdoc);\n\n\tif (lineDelta > 0 && selectionEnd == pdoc->LineStart(pdoc->LinesTotal() - 1)) {\n\t\tSetSelection(pdoc->MovePositionOutsideChar(selectionEnd - 1, -1), selectionEnd);\n\t\tClearSelection();\n\t\tselectionEnd = CurrentPosition();\n\t}\n\tSetSelection(selectionStart, selectionEnd);\n\n\tSelectionText selectedText;\n\tCopySelectionRange(&selectedText);\n\n\tint selectionLength = SelectionRange(selectionStart, selectionEnd).Length();\n\tPoint currentLocation = LocationFromPosition(CurrentPosition());\n\tint currentLine = LineFromLocation(currentLocation);\n\n\tif (appendEol)\n\t\tSetSelection(pdoc->MovePositionOutsideChar(selectionStart - 1, -1), selectionEnd);\n\tClearSelection();\n\n\tconst char *eol = StringFromEOLMode(pdoc->eolMode);\n\tif (currentLine + lineDelta >= pdoc->LinesTotal())\n\t\tpdoc->InsertCString(pdoc->Length(), eol);\n\tGoToLine(currentLine + lineDelta);\n\n\tpdoc->InsertCString(CurrentPosition(), selectedText.Data());\n\tif (appendEol) {\n\t\tpdoc->InsertCString(CurrentPosition() + selectionLength, eol);\n\t\tselectionLength += istrlen(eol);\n\t}\n\tSetSelection(CurrentPosition(), CurrentPosition() + selectionLength);\n}\n\nvoid Editor::MoveSelectedLinesUp() {\n\tMoveSelectedLines(-1);\n}\n\nvoid Editor::MoveSelectedLinesDown() {\n\tMoveSelectedLines(1);\n}\n\nvoid Editor::MoveCaretInsideView(bool ensureVisible) {\n\tPRectangle rcClient = GetTextRectangle();\n\tPoint pt = PointMainCaret();\n\tif (pt.y < rcClient.top) {\n\t\tMovePositionTo(SPositionFromLocation(\n\t\t            Point(lastXChosen - xOffset, rcClient.top),\n\t\t\t\t\tfalse, false, UserVirtualSpace()),\n\t\t\t\t\tSelection::noSel, ensureVisible);\n\t} else if ((pt.y + vs.lineHeight - 1) > rcClient.bottom) {\n\t\tint yOfLastLineFullyDisplayed = rcClient.top + (LinesOnScreen() - 1) * vs.lineHeight;\n\t\tMovePositionTo(SPositionFromLocation(\n\t\t            Point(lastXChosen - xOffset, rcClient.top + yOfLastLineFullyDisplayed),\n\t\t\t\t\tfalse, false, UserVirtualSpace()),\n\t\t        Selection::noSel, ensureVisible);\n\t}\n}\n\nint Editor::DisplayFromPosition(int pos) {\n\tint lineDoc = pdoc->LineFromPosition(pos);\n\tint lineDisplay = cs.DisplayFromDoc(lineDoc);\n\tAutoSurface surface(this);\n\tAutoLineLayout ll(llc, RetrieveLineLayout(lineDoc));\n\tif (surface && ll) {\n\t\tLayoutLine(lineDoc, surface, vs, ll, wrapWidth);\n\t\tunsigned int posLineStart = pdoc->LineStart(lineDoc);\n\t\tint posInLine = pos - posLineStart;\n\t\tlineDisplay--; // To make up for first increment ahead.\n\t\tfor (int subLine = 0; subLine < ll->lines; subLine++) {\n\t\t\tif (posInLine >= ll->LineStart(subLine)) {\n\t\t\t\tlineDisplay++;\n\t\t\t}\n\t\t}\n\t}\n\treturn lineDisplay;\n}\n\n/**\n * Ensure the caret is reasonably visible in context.\n *\nCaret policy in SciTE\n\nIf slop is set, we can define a slop value.\nThis value defines an unwanted zone (UZ) where the caret is... unwanted.\nThis zone is defined as a number of pixels near the vertical margins,\nand as a number of lines near the horizontal margins.\nBy keeping the caret away from the edges, it is seen within its context,\nso it is likely that the identifier that the caret is on can be completely seen,\nand that the current line is seen with some of the lines following it which are\noften dependent on that line.\n\nIf strict is set, the policy is enforced... strictly.\nThe caret is centred on the display if slop is not set,\nand cannot go in the UZ if slop is set.\n\nIf jumps is set, the display is moved more energetically\nso the caret can move in the same direction longer before the policy is applied again.\n'3UZ' notation is used to indicate three time the size of the UZ as a distance to the margin.\n\nIf even is not set, instead of having symmetrical UZs,\nthe left and bottom UZs are extended up to right and top UZs respectively.\nThis way, we favour the displaying of useful information: the begining of lines,\nwhere most code reside, and the lines after the caret, eg. the body of a function.\n\n     |        |       |      |                                            |\nslop | strict | jumps | even | Caret can go to the margin                 | When reaching limit (caret going out of\n     |        |       |      |                                            | visibility or going into the UZ) display is...\n-----+--------+-------+------+--------------------------------------------+--------------------------------------------------------------\n  0  |   0    |   0   |   0  | Yes                                        | moved to put caret on top/on right\n  0  |   0    |   0   |   1  | Yes                                        | moved by one position\n  0  |   0    |   1   |   0  | Yes                                        | moved to put caret on top/on right\n  0  |   0    |   1   |   1  | Yes                                        | centred on the caret\n  0  |   1    |   -   |   0  | Caret is always on top/on right of display | -\n  0  |   1    |   -   |   1  | No, caret is always centred                | -\n  1  |   0    |   0   |   0  | Yes                                        | moved to put caret out of the asymmetrical UZ\n  1  |   0    |   0   |   1  | Yes                                        | moved to put caret out of the UZ\n  1  |   0    |   1   |   0  | Yes                                        | moved to put caret at 3UZ of the top or right margin\n  1  |   0    |   1   |   1  | Yes                                        | moved to put caret at 3UZ of the margin\n  1  |   1    |   -   |   0  | Caret is always at UZ of top/right margin  | -\n  1  |   1    |   0   |   1  | No, kept out of UZ                         | moved by one position\n  1  |   1    |   1   |   1  | No, kept out of UZ                         | moved to put caret at 3UZ of the margin\n*/\n\nEditor::XYScrollPosition Editor::XYScrollToMakeVisible(const SelectionRange range, const XYScrollOptions options) {\n\tPRectangle rcClient = GetTextRectangle();\n\tPoint pt = LocationFromPosition(range.caret);\n\tPoint ptAnchor = LocationFromPosition(range.anchor);\n\tconst Point ptOrigin = GetVisibleOriginInMain();\n\tpt.x += ptOrigin.x;\n\tpt.y += ptOrigin.y;\n\tptAnchor.x += ptOrigin.x;\n\tptAnchor.y += ptOrigin.y;\n\tconst Point ptBottomCaret(pt.x, pt.y + vs.lineHeight - 1);\n\n\tXYScrollPosition newXY(xOffset, topLine);\n\tif (rcClient.Empty()) {\n\t\treturn newXY;\n\t}\n\n\t// Vertical positioning\n\tif ((options & xysVertical) && (pt.y < rcClient.top || ptBottomCaret.y >= rcClient.bottom || (caretYPolicy & CARET_STRICT) != 0)) {\n\t\tconst int lineCaret = DisplayFromPosition(range.caret.Position());\n\t\tconst int linesOnScreen = LinesOnScreen();\n\t\tconst int halfScreen = Platform::Maximum(linesOnScreen - 1, 2) / 2;\n\t\tconst bool bSlop = (caretYPolicy & CARET_SLOP) != 0;\n\t\tconst bool bStrict = (caretYPolicy & CARET_STRICT) != 0;\n\t\tconst bool bJump = (caretYPolicy & CARET_JUMPS) != 0;\n\t\tconst bool bEven = (caretYPolicy & CARET_EVEN) != 0;\n\n\t\t// It should be possible to scroll the window to show the caret,\n\t\t// but this fails to remove the caret on GTK+\n\t\tif (bSlop) {\t// A margin is defined\n\t\t\tint yMoveT, yMoveB;\n\t\t\tif (bStrict) {\n\t\t\t\tint yMarginT, yMarginB;\n\t\t\t\tif (!(options & xysUseMargin)) {\n\t\t\t\t\t// In drag mode, avoid moves\n\t\t\t\t\t// otherwise, a double click will select several lines.\n\t\t\t\t\tyMarginT = yMarginB = 0;\n\t\t\t\t} else {\n\t\t\t\t\t// yMarginT must equal to caretYSlop, with a minimum of 1 and\n\t\t\t\t\t// a maximum of slightly less than half the heigth of the text area.\n\t\t\t\t\tyMarginT = Platform::Clamp(caretYSlop, 1, halfScreen);\n\t\t\t\t\tif (bEven) {\n\t\t\t\t\t\tyMarginB = yMarginT;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tyMarginB = linesOnScreen - yMarginT - 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tyMoveT = yMarginT;\n\t\t\t\tif (bEven) {\n\t\t\t\t\tif (bJump) {\n\t\t\t\t\t\tyMoveT = Platform::Clamp(caretYSlop * 3, 1, halfScreen);\n\t\t\t\t\t}\n\t\t\t\t\tyMoveB = yMoveT;\n\t\t\t\t} else {\n\t\t\t\t\tyMoveB = linesOnScreen - yMoveT - 1;\n\t\t\t\t}\n\t\t\t\tif (lineCaret < topLine + yMarginT) {\n\t\t\t\t\t// Caret goes too high\n\t\t\t\t\tnewXY.topLine = lineCaret - yMoveT;\n\t\t\t\t} else if (lineCaret > topLine + linesOnScreen - 1 - yMarginB) {\n\t\t\t\t\t// Caret goes too low\n\t\t\t\t\tnewXY.topLine = lineCaret - linesOnScreen + 1 + yMoveB;\n\t\t\t\t}\n\t\t\t} else {\t// Not strict\n\t\t\t\tyMoveT = bJump ? caretYSlop * 3 : caretYSlop;\n\t\t\t\tyMoveT = Platform::Clamp(yMoveT, 1, halfScreen);\n\t\t\t\tif (bEven) {\n\t\t\t\t\tyMoveB = yMoveT;\n\t\t\t\t} else {\n\t\t\t\t\tyMoveB = linesOnScreen - yMoveT - 1;\n\t\t\t\t}\n\t\t\t\tif (lineCaret < topLine) {\n\t\t\t\t\t// Caret goes too high\n\t\t\t\t\tnewXY.topLine = lineCaret - yMoveT;\n\t\t\t\t} else if (lineCaret > topLine + linesOnScreen - 1) {\n\t\t\t\t\t// Caret goes too low\n\t\t\t\t\tnewXY.topLine = lineCaret - linesOnScreen + 1 + yMoveB;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\t// No slop\n\t\t\tif (!bStrict && !bJump) {\n\t\t\t\t// Minimal move\n\t\t\t\tif (lineCaret < topLine) {\n\t\t\t\t\t// Caret goes too high\n\t\t\t\t\tnewXY.topLine = lineCaret;\n\t\t\t\t} else if (lineCaret > topLine + linesOnScreen - 1) {\n\t\t\t\t\t// Caret goes too low\n\t\t\t\t\tif (bEven) {\n\t\t\t\t\t\tnewXY.topLine = lineCaret - linesOnScreen + 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewXY.topLine = lineCaret;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\t// Strict or going out of display\n\t\t\t\tif (bEven) {\n\t\t\t\t\t// Always center caret\n\t\t\t\t\tnewXY.topLine = lineCaret - halfScreen;\n\t\t\t\t} else {\n\t\t\t\t\t// Always put caret on top of display\n\t\t\t\t\tnewXY.topLine = lineCaret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!(range.caret == range.anchor)) {\n\t\t\tconst int lineAnchor = DisplayFromPosition(range.anchor.Position());\n\t\t\tif (lineAnchor < lineCaret) {\n\t\t\t\t// Shift up to show anchor or as much of range as possible\n\t\t\t\tnewXY.topLine = std::min(newXY.topLine, lineAnchor);\n\t\t\t\tnewXY.topLine = std::max(newXY.topLine, lineCaret - LinesOnScreen());\n\t\t\t} else {\n\t\t\t\t// Shift down to show anchor or as much of range as possible\n\t\t\t\tnewXY.topLine = std::max(newXY.topLine, lineAnchor - LinesOnScreen());\n\t\t\t\tnewXY.topLine = std::min(newXY.topLine, lineCaret);\n\t\t\t}\n\t\t}\n\t\tnewXY.topLine = Platform::Clamp(newXY.topLine, 0, MaxScrollPos());\n\t}\n\n\t// Horizontal positioning\n\tif ((options & xysHorizontal) && !Wrapping()) {\n\t\tconst int halfScreen = Platform::Maximum(rcClient.Width() - 4, 4) / 2;\n\t\tconst bool bSlop = (caretXPolicy & CARET_SLOP) != 0;\n\t\tconst bool bStrict = (caretXPolicy & CARET_STRICT) != 0;\n\t\tconst bool bJump = (caretXPolicy & CARET_JUMPS) != 0;\n\t\tconst bool bEven = (caretXPolicy & CARET_EVEN) != 0;\n\n\t\tif (bSlop) {\t// A margin is defined\n\t\t\tint xMoveL, xMoveR;\n\t\t\tif (bStrict) {\n\t\t\t\tint xMarginL, xMarginR;\n\t\t\t\tif (!(options & xysUseMargin)) {\n\t\t\t\t\t// In drag mode, avoid moves unless very near of the margin\n\t\t\t\t\t// otherwise, a simple click will select text.\n\t\t\t\t\txMarginL = xMarginR = 2;\n\t\t\t\t} else {\n\t\t\t\t\t// xMargin must equal to caretXSlop, with a minimum of 2 and\n\t\t\t\t\t// a maximum of slightly less than half the width of the text area.\n\t\t\t\t\txMarginR = Platform::Clamp(caretXSlop, 2, halfScreen);\n\t\t\t\t\tif (bEven) {\n\t\t\t\t\t\txMarginL = xMarginR;\n\t\t\t\t\t} else {\n\t\t\t\t\t\txMarginL = rcClient.Width() - xMarginR - 4;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (bJump && bEven) {\n\t\t\t\t\t// Jump is used only in even mode\n\t\t\t\t\txMoveL = xMoveR = Platform::Clamp(caretXSlop * 3, 1, halfScreen);\n\t\t\t\t} else {\n\t\t\t\t\txMoveL = xMoveR = 0;\t// Not used, avoid a warning\n\t\t\t\t}\n\t\t\t\tif (pt.x < rcClient.left + xMarginL) {\n\t\t\t\t\t// Caret is on the left of the display\n\t\t\t\t\tif (bJump && bEven) {\n\t\t\t\t\t\tnewXY.xOffset -= xMoveL;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Move just enough to allow to display the caret\n\t\t\t\t\t\tnewXY.xOffset -= (rcClient.left + xMarginL) - pt.x;\n\t\t\t\t\t}\n\t\t\t\t} else if (pt.x >= rcClient.right - xMarginR) {\n\t\t\t\t\t// Caret is on the right of the display\n\t\t\t\t\tif (bJump && bEven) {\n\t\t\t\t\t\tnewXY.xOffset += xMoveR;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Move just enough to allow to display the caret\n\t\t\t\t\t\tnewXY.xOffset += pt.x - (rcClient.right - xMarginR) + 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\t// Not strict\n\t\t\t\txMoveR = bJump ? caretXSlop * 3 : caretXSlop;\n\t\t\t\txMoveR = Platform::Clamp(xMoveR, 1, halfScreen);\n\t\t\t\tif (bEven) {\n\t\t\t\t\txMoveL = xMoveR;\n\t\t\t\t} else {\n\t\t\t\t\txMoveL = rcClient.Width() - xMoveR - 4;\n\t\t\t\t}\n\t\t\t\tif (pt.x < rcClient.left) {\n\t\t\t\t\t// Caret is on the left of the display\n\t\t\t\t\tnewXY.xOffset -= xMoveL;\n\t\t\t\t} else if (pt.x >= rcClient.right) {\n\t\t\t\t\t// Caret is on the right of the display\n\t\t\t\t\tnewXY.xOffset += xMoveR;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\t// No slop\n\t\t\tif (bStrict ||\n\t\t\t        (bJump && (pt.x < rcClient.left || pt.x >= rcClient.right))) {\n\t\t\t\t// Strict or going out of display\n\t\t\t\tif (bEven) {\n\t\t\t\t\t// Center caret\n\t\t\t\t\tnewXY.xOffset += pt.x - rcClient.left - halfScreen;\n\t\t\t\t} else {\n\t\t\t\t\t// Put caret on right\n\t\t\t\t\tnewXY.xOffset += pt.x - rcClient.right + 1;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Move just enough to allow to display the caret\n\t\t\t\tif (pt.x < rcClient.left) {\n\t\t\t\t\t// Caret is on the left of the display\n\t\t\t\t\tif (bEven) {\n\t\t\t\t\t\tnewXY.xOffset -= rcClient.left - pt.x;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewXY.xOffset += pt.x - rcClient.right + 1;\n\t\t\t\t\t}\n\t\t\t\t} else if (pt.x >= rcClient.right) {\n\t\t\t\t\t// Caret is on the right of the display\n\t\t\t\t\tnewXY.xOffset += pt.x - rcClient.right + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// In case of a jump (find result) largely out of display, adjust the offset to display the caret\n\t\tif (pt.x + xOffset < rcClient.left + newXY.xOffset) {\n\t\t\tnewXY.xOffset = pt.x + xOffset - rcClient.left;\n\t\t} else if (pt.x + xOffset >= rcClient.right + newXY.xOffset) {\n\t\t\tnewXY.xOffset = pt.x + xOffset - rcClient.right + 1;\n\t\t\tif (vs.caretStyle == CARETSTYLE_BLOCK) {\n\t\t\t\t// Ensure we can see a good portion of the block caret\n\t\t\t\tnewXY.xOffset += static_cast<int>(vs.aveCharWidth);\n\t\t\t}\n\t\t}\n\t\tif (!(range.caret == range.anchor)) {\n\t\t\tif (ptAnchor.x < pt.x) {\n\t\t\t\t// Shift to left to show anchor or as much of range as possible\n\t\t\t\tint maxOffset = ptAnchor.x + xOffset - rcClient.left - 1;\n\t\t\t\tint minOffset = pt.x + xOffset - rcClient.right + 1;\n\t\t\t\tnewXY.xOffset = std::min(newXY.xOffset, maxOffset);\n\t\t\t\tnewXY.xOffset = std::max(newXY.xOffset, minOffset);\n\t\t\t} else {\n\t\t\t\t// Shift to right to show anchor or as much of range as possible\n\t\t\t\tint minOffset = ptAnchor.x + xOffset - rcClient.right + 1;\n\t\t\t\tint maxOffset = pt.x + xOffset - rcClient.left - 1;\n\t\t\t\tnewXY.xOffset = std::max(newXY.xOffset, minOffset);\n\t\t\t\tnewXY.xOffset = std::min(newXY.xOffset, maxOffset);\n\t\t\t}\n\t\t}\n\t\tif (newXY.xOffset < 0) {\n\t\t\tnewXY.xOffset = 0;\n\t\t}\n\t}\n\n\treturn newXY;\n}\n\nvoid Editor::SetXYScroll(XYScrollPosition newXY) {\n\tif ((newXY.topLine != topLine) || (newXY.xOffset != xOffset)) {\n\t\tif (newXY.topLine != topLine) {\n\t\t\tSetTopLine(newXY.topLine);\n\t\t\tSetVerticalScrollPos();\n\t\t}\n\t\tif (newXY.xOffset != xOffset) {\n\t\t\txOffset = newXY.xOffset;\n\t\t\tContainerNeedsUpdate(SC_UPDATE_H_SCROLL);\n\t\t\tif (newXY.xOffset > 0) {\n\t\t\t\tPRectangle rcText = GetTextRectangle();\n\t\t\t\tif (horizontalScrollBarVisible &&\n\t\t\t\t\trcText.Width() + xOffset > scrollWidth) {\n\t\t\t\t\tscrollWidth = xOffset + rcText.Width();\n\t\t\t\t\tSetScrollBars();\n\t\t\t\t}\n\t\t\t}\n\t\t\tSetHorizontalScrollPos();\n\t\t}\n\t\tRedraw();\n\t\tUpdateSystemCaret();\n\t}\n}\n\nvoid Editor::ScrollRange(SelectionRange range) {\n\tSetXYScroll(XYScrollToMakeVisible(range, xysDefault));\n}\n\nvoid Editor::EnsureCaretVisible(bool useMargin, bool vert, bool horiz) {\n\tSetXYScroll(XYScrollToMakeVisible(SelectionRange(posDrag.IsValid() ? posDrag : sel.RangeMain().caret),\n\t\tstatic_cast<XYScrollOptions>((useMargin?xysUseMargin:0)|(vert?xysVertical:0)|(horiz?xysHorizontal:0))));\n}\n\nvoid Editor::ShowCaretAtCurrentPosition() {\n\tif (hasFocus) {\n\t\tcaret.active = true;\n\t\tcaret.on = true;\n\t\tSetTicking(true);\n\t} else {\n\t\tcaret.active = false;\n\t\tcaret.on = false;\n\t}\n\tInvalidateCaret();\n}\n\nvoid Editor::DropCaret() {\n\tcaret.active = false;\n\tInvalidateCaret();\n}\n\nvoid Editor::InvalidateCaret() {\n\tif (posDrag.IsValid()) {\n\t\tInvalidateRange(posDrag.Position(), posDrag.Position() + 1);\n\t} else {\n\t\tfor (size_t r=0; r<sel.Count(); r++) {\n\t\t\tInvalidateRange(sel.Range(r).caret.Position(), sel.Range(r).caret.Position() + 1);\n\t\t}\n\t}\n\tUpdateSystemCaret();\n}\n\nvoid Editor::UpdateSystemCaret() {\n}\n\nbool Editor::Wrapping() const {\n\treturn vs.wrapState != eWrapNone;\n}\n\nvoid Editor::NeedWrapping(int docLineStart, int docLineEnd) {\n//Platform::DebugPrintf(\"\\nNeedWrapping: %0d..%0d\\n\", docLineStart, docLineEnd);\n\tif (wrapPending.AddRange(docLineStart, docLineEnd)) {\n\t\tllc.Invalidate(LineLayout::llPositions);\n\t}\n\t// Wrap lines during idle.\n\tif (Wrapping() && wrapPending.NeedsWrap()) {\n\t\tSetIdle(true);\n\t}\n}\n\nbool Editor::WrapOneLine(Surface *surface, int lineToWrap) {\n\tAutoLineLayout ll(llc, RetrieveLineLayout(lineToWrap));\n\tint linesWrapped = 1;\n\tif (ll) {\n\t\tLayoutLine(lineToWrap, surface, vs, ll, wrapWidth);\n\t\tlinesWrapped = ll->lines;\n\t}\n\treturn cs.SetHeight(lineToWrap, linesWrapped +\n\t\t(vs.annotationVisible ? pdoc->AnnotationLines(lineToWrap) : 0));\n}\n\n// Perform  wrapping for a subset of the lines needing wrapping.\n// wsAll: wrap all lines which need wrapping in this single call\n// wsVisible: wrap currently visible lines\n// wsIdle: wrap one page + 100 lines\n// Return true if wrapping occurred.\nbool Editor::WrapLines(enum wrapScope ws) {\n\tint goodTopLine = topLine;\n\tbool wrapOccurred = false;\n\tif (!Wrapping()) {\n\t\tif (wrapWidth != LineLayout::wrapWidthInfinite) {\n\t\t\twrapWidth = LineLayout::wrapWidthInfinite;\n\t\t\tfor (int lineDoc = 0; lineDoc < pdoc->LinesTotal(); lineDoc++) {\n\t\t\t\tcs.SetHeight(lineDoc, 1 +\n\t\t\t\t\t(vs.annotationVisible ? pdoc->AnnotationLines(lineDoc) : 0));\n\t\t\t}\n\t\t\twrapOccurred = true;\n\t\t}\n\t\twrapPending.Reset();\n\n\t} else if (wrapPending.NeedsWrap()) {\n\t\twrapPending.start = std::min(wrapPending.start, pdoc->LinesTotal());\n\t\tif (!SetIdle(true)) {\n\t\t\t// Idle processing not supported so full wrap required.\n\t\t\tws = wsAll;\n\t\t}\n\t\t// Decide where to start wrapping\n\t\tint lineToWrap = wrapPending.start;\n\t\tint lineToWrapEnd = std::min(wrapPending.end, pdoc->LinesTotal());\n\t\tconst int lineDocTop = cs.DocFromDisplay(topLine);\n\t\tconst int subLineTop = topLine - cs.DisplayFromDoc(lineDocTop);\n\t\tif (ws == wsVisible) {\n\t\t\tlineToWrap = Platform::Clamp(lineDocTop-5, wrapPending.start, pdoc->LinesTotal());\n\t\t\t// Priority wrap to just after visible area.\n\t\t\t// Since wrapping could reduce display lines, treat each\n\t\t\t// as taking only one display line.\n\t\t\tlineToWrapEnd = lineDocTop;\n\t\t\tint lines = LinesOnScreen() + 1;\n\t\t\twhile ((lineToWrapEnd < cs.LinesInDoc()) && (lines>0)) {\n\t\t\t\tif (cs.GetVisible(lineToWrapEnd))\n\t\t\t\t\tlines--;\n\t\t\t\tlineToWrapEnd++;\n\t\t\t}\n\t\t\t// .. and if the paint window is outside pending wraps\n\t\t\tif ((lineToWrap > wrapPending.end) || (lineToWrapEnd < wrapPending.start)) {\n\t\t\t\t// Currently visible text does not need wrapping\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (ws == wsIdle) {\n\t\t\tlineToWrapEnd = lineToWrap + LinesOnScreen() + 100;\n\t\t}\n\t\tconst int lineEndNeedWrap = std::min(wrapPending.end, pdoc->LinesTotal());\n\t\tlineToWrapEnd = std::min(lineToWrapEnd, lineEndNeedWrap);\n\n\t\t// Ensure all lines being wrapped are styled.\n\t\tpdoc->EnsureStyledTo(pdoc->LineStart(lineToWrapEnd));\n\n\t\tif (lineToWrap < lineToWrapEnd) {\n\n\t\t\tPRectangle rcTextArea = GetClientRectangle();\n\t\t\trcTextArea.left = vs.textStart;\n\t\t\trcTextArea.right -= vs.rightMarginWidth;\n\t\t\twrapWidth = rcTextArea.Width();\n\t\t\tRefreshStyleData();\n\t\t\tAutoSurface surface(this);\n\t\t\tif (surface) {\n//Platform::DebugPrintf(\"Wraplines: scope=%0d need=%0d..%0d perform=%0d..%0d\\n\", ws, wrapPending.start, wrapPending.end, lineToWrap, lineToWrapEnd);\n\n\t\t\t\twhile (lineToWrap < lineToWrapEnd) {\n\t\t\t\t\tif (WrapOneLine(surface, lineToWrap)) {\n\t\t\t\t\t\twrapOccurred = true;\n\t\t\t\t\t}\n\t\t\t\t\twrapPending.Wrapped(lineToWrap);\n\t\t\t\t\tlineToWrap++;\n\t\t\t\t}\n\n\t\t\t\tgoodTopLine = cs.DisplayFromDoc(lineDocTop) + std::min(subLineTop, cs.GetHeight(lineDocTop)-1);\n\t\t\t}\n\t\t}\n\n\t\t// If wrapping is done, bring it to resting position\n\t\tif (wrapPending.start >= lineEndNeedWrap) {\n\t\t\twrapPending.Reset();\n\t\t}\n\t}\n\n\tif (wrapOccurred) {\n\t\tSetScrollBars();\n\t\tSetTopLine(Platform::Clamp(goodTopLine, 0, MaxScrollPos()));\n\t\tSetVerticalScrollPos();\n\t}\n\n\treturn wrapOccurred;\n}\n\nvoid Editor::LinesJoin() {\n\tif (!RangeContainsProtected(targetStart, targetEnd)) {\n\t\tUndoGroup ug(pdoc);\n\t\tbool prevNonWS = true;\n\t\tfor (int pos = targetStart; pos < targetEnd; pos++) {\n\t\t\tif (pdoc->IsPositionInLineEnd(pos)) {\n\t\t\t\ttargetEnd -= pdoc->LenChar(pos);\n\t\t\t\tpdoc->DelChar(pos);\n\t\t\t\tif (prevNonWS) {\n\t\t\t\t\t// Ensure at least one space separating previous lines\n\t\t\t\t\tpdoc->InsertChar(pos, ' ');\n\t\t\t\t\ttargetEnd++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tprevNonWS = pdoc->CharAt(pos) != ' ';\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst char *Editor::StringFromEOLMode(int eolMode) {\n\tif (eolMode == SC_EOL_CRLF) {\n\t\treturn \"\\r\\n\";\n\t} else if (eolMode == SC_EOL_CR) {\n\t\treturn \"\\r\";\n\t} else {\n\t\treturn \"\\n\";\n\t}\n}\n\nvoid Editor::LinesSplit(int pixelWidth) {\n\tif (!RangeContainsProtected(targetStart, targetEnd)) {\n\t\tif (pixelWidth == 0) {\n\t\t\tPRectangle rcText = GetTextRectangle();\n\t\t\tpixelWidth = rcText.Width();\n\t\t}\n\t\tint lineStart = pdoc->LineFromPosition(targetStart);\n\t\tint lineEnd = pdoc->LineFromPosition(targetEnd);\n\t\tconst char *eol = StringFromEOLMode(pdoc->eolMode);\n\t\tUndoGroup ug(pdoc);\n\t\tfor (int line = lineStart; line <= lineEnd; line++) {\n\t\t\tAutoSurface surface(this);\n\t\t\tAutoLineLayout ll(llc, RetrieveLineLayout(line));\n\t\t\tif (surface && ll) {\n\t\t\t\tunsigned int posLineStart = pdoc->LineStart(line);\n\t\t\t\tLayoutLine(line, surface, vs, ll, pixelWidth);\n\t\t\t\tfor (int subLine = 1; subLine < ll->lines; subLine++) {\n\t\t\t\t\tpdoc->InsertCString(\n\t\t\t\t\t\tstatic_cast<int>(posLineStart + (subLine - 1) * strlen(eol) +\n\t\t\t\t\t\t\tll->LineStart(subLine)),\n\t\t\t\t\t\teol);\n\t\t\t\t\ttargetEnd += static_cast<int>(strlen(eol));\n\t\t\t\t}\n\t\t\t}\n\t\t\tlineEnd = pdoc->LineFromPosition(targetEnd);\n\t\t}\n\t}\n}\n\nint Editor::SubstituteMarkerIfEmpty(int markerCheck, int markerDefault) const {\n\tif (vs.markers[markerCheck].markType == SC_MARK_EMPTY)\n\t\treturn markerDefault;\n\treturn markerCheck;\n}\n\nbool ValidStyledText(ViewStyle &vs, size_t styleOffset, const StyledText &st) {\n\tif (st.multipleStyles) {\n\t\tfor (size_t iStyle=0; iStyle<st.length; iStyle++) {\n\t\t\tif (!vs.ValidStyle(styleOffset + st.styles[iStyle]))\n\t\t\t\treturn false;\n\t\t}\n\t} else {\n\t\tif (!vs.ValidStyle(styleOffset + st.style))\n\t\t\treturn false;\n\t}\n\treturn true;\n}\n\nstatic int WidthStyledText(Surface *surface, ViewStyle &vs, int styleOffset,\n\tconst char *text, const unsigned char *styles, size_t len) {\n\tint width = 0;\n\tsize_t start = 0;\n\twhile (start < len) {\n\t\tsize_t style = styles[start];\n\t\tsize_t endSegment = start;\n\t\twhile ((endSegment+1 < len) && (static_cast<size_t>(styles[endSegment+1]) == style))\n\t\t\tendSegment++;\n\t\twidth += surface->WidthText(vs.styles[style+styleOffset].font, text + start,\n\t\t\tstatic_cast<int>(endSegment - start + 1));\n\t\tstart = endSegment + 1;\n\t}\n\treturn width;\n}\n\nstatic int WidestLineWidth(Surface *surface, ViewStyle &vs, int styleOffset, const StyledText &st) {\n\tint widthMax = 0;\n\tsize_t start = 0;\n\twhile (start < st.length) {\n\t\tsize_t lenLine = st.LineLength(start);\n\t\tint widthSubLine;\n\t\tif (st.multipleStyles) {\n\t\t\twidthSubLine = WidthStyledText(surface, vs, styleOffset, st.text + start, st.styles + start, lenLine);\n\t\t} else {\n\t\t\twidthSubLine = surface->WidthText(vs.styles[styleOffset + st.style].font,\n\t\t\t\tst.text + start, static_cast<int>(lenLine));\n\t\t}\n\t\tif (widthSubLine > widthMax)\n\t\t\twidthMax = widthSubLine;\n\t\tstart += lenLine + 1;\n\t}\n\treturn widthMax;\n}\n\nvoid DrawStyledText(Surface *surface, ViewStyle &vs, int styleOffset, PRectangle rcText, int ascent,\n\tconst StyledText &st, size_t start, size_t length) {\n\n\tif (st.multipleStyles) {\n\t\tint x = rcText.left;\n\t\tsize_t i = 0;\n\t\twhile (i < length) {\n\t\t\tsize_t end = i;\n\t\t\tint style = st.styles[i + start];\n\t\t\twhile (end < length-1 && st.styles[start+end+1] == style)\n\t\t\t\tend++;\n\t\t\tstyle += styleOffset;\n\t\t\tint width = surface->WidthText(vs.styles[style].font,\n\t\t\t\tst.text + start + i, static_cast<int>(end - i + 1));\n\t\t\tPRectangle rcSegment = rcText;\n\t\t\trcSegment.left = x;\n\t\t\trcSegment.right = x + width + 1;\n\t\t\tsurface->DrawTextNoClip(rcSegment, vs.styles[style].font,\n\t\t\t\t\tascent, st.text + start + i,\n\t\t\t\t\tstatic_cast<int>(end - i + 1),\n\t\t\t\t\tvs.styles[style].fore,\n\t\t\t\t\tvs.styles[style].back);\n\t\t\tx += width;\n\t\t\ti = end + 1;\n\t\t}\n\t} else {\n\t\tsize_t style = st.style + styleOffset;\n\t\tsurface->DrawTextNoClip(rcText, vs.styles[style].font,\n\t\t\t\trcText.top + vs.maxAscent, st.text + start,\n\t\t\t\tstatic_cast<int>(length),\n\t\t\t\tvs.styles[style].fore,\n\t\t\t\tvs.styles[style].back);\n\t}\n}\n\nvoid Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {\n\tif (vs.fixedColumnWidth == 0)\n\t\treturn;\n\n\tAllocateGraphics();\n\tRefreshStyleData();\n\tRefreshPixMaps(surfWindow);\n\n\tPRectangle rcMargin = GetClientRectangle();\n\tPoint ptOrigin = GetVisibleOriginInMain();\n\trcMargin.Move(0, -ptOrigin.y);\n\trcMargin.left = 0;\n\trcMargin.right = vs.fixedColumnWidth;\n\n\tif (!rc.Intersects(rcMargin))\n\t\treturn;\n\n\tSurface *surface;\n\tif (bufferedDraw) {\n\t\tsurface = pixmapSelMargin;\n\t} else {\n\t\tsurface = surfWindow;\n\t}\n\n\t// Clip vertically to paint area to avoid drawing line numbers\n\tif (rcMargin.bottom > rc.bottom)\n\t\trcMargin.bottom = rc.bottom;\n\tif (rcMargin.top < rc.top)\n\t\trcMargin.top = rc.top;\n\n\tPRectangle rcSelMargin = rcMargin;\n\trcSelMargin.right = rcMargin.left;\n\tif (rcSelMargin.bottom < rc.bottom)\n\t\trcSelMargin.bottom = rc.bottom;\n\n\tfor (int margin = 0; margin <= SC_MAX_MARGIN; margin++) {\n\t\tif (vs.ms[margin].width > 0) {\n\n\t\t\trcSelMargin.left = rcSelMargin.right;\n\t\t\trcSelMargin.right = rcSelMargin.left + vs.ms[margin].width;\n\n\t\t\tif (vs.ms[margin].style != SC_MARGIN_NUMBER) {\n\t\t\t\tif (vs.ms[margin].mask & SC_MASK_FOLDERS) {\n\t\t\t\t\t// Required because of special way brush is created for selection margin\n\t\t\t\t\t// Ensure patterns line up when scrolling with separate margin view\n\t\t\t\t\t// by choosing correctly aligned variant.\n\t\t\t\t\tbool invertPhase = static_cast<int>(ptOrigin.y) & 1;\n\t\t\t\t\tsurface->FillRectangle(rcSelMargin,\n\t\t\t\t\t  invertPhase ? *pixmapSelPattern : *pixmapSelPatternOffset1);\n\t\t\t\t} else {\n\t\t\t\t\tColourDesired colour;\n\t\t\t\t\tswitch (vs.ms[margin].style) {\n\t\t\t\t\tcase SC_MARGIN_BACK:\n\t\t\t\t\t\tcolour = vs.styles[STYLE_DEFAULT].back;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SC_MARGIN_FORE:\n\t\t\t\t\t\tcolour = vs.styles[STYLE_DEFAULT].fore;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcolour = vs.styles[STYLE_LINENUMBER].back;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tsurface->FillRectangle(rcSelMargin, colour);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsurface->FillRectangle(rcSelMargin, vs.styles[STYLE_LINENUMBER].back);\n\t\t\t}\n\n\t\t\tconst int lineStartPaint = (rcMargin.top + ptOrigin.y) / vs.lineHeight;\n\t\t\tint visibleLine = TopLineOfMain() + lineStartPaint;\n\t\t\tint yposScreen = lineStartPaint * vs.lineHeight - ptOrigin.y;\n\t\t\t// Work out whether the top line is whitespace located after a\n\t\t\t// lessening of fold level which implies a 'fold tail' but which should not\n\t\t\t// be displayed until the last of a sequence of whitespace.\n\t\t\tbool needWhiteClosure = false;\n\t\t\tif (vs.ms[margin].mask & SC_MASK_FOLDERS) {\n\t\t\t\tint level = pdoc->GetLevel(cs.DocFromDisplay(visibleLine));\n\t\t\t\tif (level & SC_FOLDLEVELWHITEFLAG) {\n\t\t\t\t\tint lineBack = cs.DocFromDisplay(visibleLine);\n\t\t\t\t\tint levelPrev = level;\n\t\t\t\t\twhile ((lineBack > 0) && (levelPrev & SC_FOLDLEVELWHITEFLAG)) {\n\t\t\t\t\t\tlineBack--;\n\t\t\t\t\t\tlevelPrev = pdoc->GetLevel(lineBack);\n\t\t\t\t\t}\n\t\t\t\t\tif (!(levelPrev & SC_FOLDLEVELHEADERFLAG)) {\n\t\t\t\t\t\tif ((level & SC_FOLDLEVELNUMBERMASK) < (levelPrev & SC_FOLDLEVELNUMBERMASK))\n\t\t\t\t\t\t\tneedWhiteClosure = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (highlightDelimiter.isEnabled) {\n\t\t\t\t\tint lastLine = cs.DocFromDisplay(topLine + LinesOnScreen()) + 1;\n\t\t\t\t\tpdoc->GetHighlightDelimiters(highlightDelimiter, pdoc->LineFromPosition(CurrentPosition()), lastLine);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Old code does not know about new markers needed to distinguish all cases\n\t\t\tint folderOpenMid = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEROPENMID,\n\t\t\t        SC_MARKNUM_FOLDEROPEN);\n\t\t\tint folderEnd = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEREND,\n\t\t\t        SC_MARKNUM_FOLDER);\n\n\t\t\twhile ((visibleLine < cs.LinesDisplayed()) && yposScreen < rc.bottom) {\n\n\t\t\t\tPLATFORM_ASSERT(visibleLine < cs.LinesDisplayed());\n\t\t\t\tint lineDoc = cs.DocFromDisplay(visibleLine);\n\t\t\t\tPLATFORM_ASSERT(cs.GetVisible(lineDoc));\n\t\t\t\tbool firstSubLine = visibleLine == cs.DisplayFromDoc(lineDoc);\n\t\t\t\tbool lastSubLine = visibleLine == (cs.DisplayFromDoc(lineDoc + 1) - 1);\n\n\t\t\t\tint marks = pdoc->GetMark(lineDoc);\n\t\t\t\tif (!firstSubLine)\n\t\t\t\t\tmarks = 0;\n\n\t\t\t\tbool headWithTail = false;\n\n\t\t\t\tif (vs.ms[margin].mask & SC_MASK_FOLDERS) {\n\t\t\t\t\t// Decide which fold indicator should be displayed\n\t\t\t\t\tint level = pdoc->GetLevel(lineDoc);\n\t\t\t\t\tint levelNext = pdoc->GetLevel(lineDoc + 1);\n\t\t\t\t\tint levelNum = level & SC_FOLDLEVELNUMBERMASK;\n\t\t\t\t\tint levelNextNum = levelNext & SC_FOLDLEVELNUMBERMASK;\n\t\t\t\t\tif (level & SC_FOLDLEVELHEADERFLAG) {\n\t\t\t\t\t\tif (firstSubLine) {\n\t\t\t\t\t\t\tif (levelNum < levelNextNum) {\n\t\t\t\t\t\t\t\tif (cs.GetExpanded(lineDoc)) {\n\t\t\t\t\t\t\t\t\tif (levelNum == SC_FOLDLEVELBASE)\n\t\t\t\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDEROPEN;\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tmarks |= 1 << folderOpenMid;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tif (levelNum == SC_FOLDLEVELBASE)\n\t\t\t\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDER;\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tmarks |= 1 << folderEnd;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (levelNum > SC_FOLDLEVELBASE) {\n\t\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDERSUB;\n \t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (levelNum < levelNextNum) {\n\t\t\t\t\t\t\t\tif (cs.GetExpanded(lineDoc)) {\n\t\t\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDERSUB;\n\t\t\t\t\t\t\t\t} else if (levelNum > SC_FOLDLEVELBASE) {\n\t\t\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDERSUB;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (levelNum > SC_FOLDLEVELBASE) {\n\t\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDERSUB;\n \t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tneedWhiteClosure = false;\n\t\t\t\t\t\tint firstFollowupLine = cs.DocFromDisplay(cs.DisplayFromDoc(lineDoc + 1));\n\t\t\t\t\t\tint firstFollowupLineLevel = pdoc->GetLevel(firstFollowupLine);\n\t\t\t\t\t\tint secondFollowupLineLevelNum = pdoc->GetLevel(firstFollowupLine + 1) & SC_FOLDLEVELNUMBERMASK;\n\t\t\t\t\t\tif (!cs.GetExpanded(lineDoc)) {\n\t\t\t\t\t\t\tif ((firstFollowupLineLevel & SC_FOLDLEVELWHITEFLAG) &&\n\t\t\t\t\t\t\t\t(levelNum > secondFollowupLineLevelNum))\n\t\t\t\t\t\t\t\tneedWhiteClosure = true;\n\n\t\t\t\t\t\t\tif (highlightDelimiter.IsFoldBlockHighlighted(firstFollowupLine))\n\t\t\t\t\t\t\t\theadWithTail = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (level & SC_FOLDLEVELWHITEFLAG) {\n\t\t\t\t\t\tif (needWhiteClosure) {\n\t\t\t\t\t\t\tif (levelNext & SC_FOLDLEVELWHITEFLAG) {\n\t\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDERSUB;\n\t\t\t\t\t\t\t} else if (levelNextNum > SC_FOLDLEVELBASE) {\n\t\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDERMIDTAIL;\n\t\t\t\t\t\t\t\tneedWhiteClosure = false;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDERTAIL;\n\t\t\t\t\t\t\t\tneedWhiteClosure = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (levelNum > SC_FOLDLEVELBASE) {\n\t\t\t\t\t\t\tif (levelNextNum < levelNum) {\n\t\t\t\t\t\t\t\tif (levelNextNum > SC_FOLDLEVELBASE) {\n\t\t\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDERMIDTAIL;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDERTAIL;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDERSUB;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (levelNum > SC_FOLDLEVELBASE) {\n\t\t\t\t\t\tif (levelNextNum < levelNum) {\n\t\t\t\t\t\t\tneedWhiteClosure = false;\n\t\t\t\t\t\t\tif (levelNext & SC_FOLDLEVELWHITEFLAG) {\n\t\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDERSUB;\n\t\t\t\t\t\t\t\tneedWhiteClosure = true;\n\t\t\t\t\t\t\t} else if (lastSubLine) {\n\t\t\t\t\t\t\t\tif (levelNextNum > SC_FOLDLEVELBASE) {\n\t\t\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDERMIDTAIL;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDERTAIL;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDERSUB;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmarks |= 1 << SC_MARKNUM_FOLDERSUB;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tmarks &= vs.ms[margin].mask;\n\n\t\t\t\tPRectangle rcMarker = rcSelMargin;\n\t\t\t\trcMarker.top = yposScreen;\n\t\t\t\trcMarker.bottom = yposScreen + vs.lineHeight;\n\t\t\t\tif (vs.ms[margin].style == SC_MARGIN_NUMBER) {\n\t\t\t\t\tif (firstSubLine) {\n\t\t\t\t\t\tchar number[100] = \"\";\n\t\t\t\t\t\tif (lineDoc >= 0)\n\t\t\t\t\t\t\tsprintf(number, \"%d\", lineDoc + 1);\n\t\t\t\t\t\tif (foldFlags & SC_FOLDFLAG_LEVELNUMBERS) {\n\t\t\t\t\t\t\tint lev = pdoc->GetLevel(lineDoc);\n\t\t\t\t\t\t\tsprintf(number, \"%c%c %03X %03X\",\n\t\t\t\t\t\t\t\t\t(lev & SC_FOLDLEVELHEADERFLAG) ? 'H' : '_',\n\t\t\t\t\t\t\t\t\t(lev & SC_FOLDLEVELWHITEFLAG) ? 'W' : '_',\n\t\t\t\t\t\t\t\t\tlev & SC_FOLDLEVELNUMBERMASK,\n\t\t\t\t\t\t\t\t\tlev >> 16\n\t\t\t\t\t\t\t\t   );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tPRectangle rcNumber = rcMarker;\n\t\t\t\t\t\t// Right justify\n\t\t\t\t\t\tXYPOSITION width = surface->WidthText(vs.styles[STYLE_LINENUMBER].font, number, istrlen(number));\n\t\t\t\t\t\tXYPOSITION xpos = rcNumber.right - width - vs.marginNumberPadding;\n\t\t\t\t\t\trcNumber.left = xpos;\n\t\t\t\t\t\tsurface->DrawTextNoClip(rcNumber, vs.styles[STYLE_LINENUMBER].font,\n\t\t\t\t\t\t\t\trcNumber.top + vs.maxAscent, number, istrlen(number),\n\t\t\t\t\t\t\t\tvs.styles[STYLE_LINENUMBER].fore,\n\t\t\t\t\t\t\t\tvs.styles[STYLE_LINENUMBER].back);\n\t\t\t\t\t} else if (vs.wrapVisualFlags & SC_WRAPVISUALFLAG_MARGIN) {\n\t\t\t\t\t\tPRectangle rcWrapMarker = rcMarker;\n\t\t\t\t\t\trcWrapMarker.right -= 3;\n\t\t\t\t\t\trcWrapMarker.left = rcWrapMarker.right - vs.styles[STYLE_LINENUMBER].aveCharWidth;\n\t\t\t\t\t\tDrawWrapMarker(surface, rcWrapMarker, false, vs.styles[STYLE_LINENUMBER].fore);\n\t\t\t\t\t}\n\t\t\t\t} else if (vs.ms[margin].style == SC_MARGIN_TEXT || vs.ms[margin].style == SC_MARGIN_RTEXT) {\n\t\t\t\t\tif (firstSubLine) {\n\t\t\t\t\t\tconst StyledText stMargin  = pdoc->MarginStyledText(lineDoc);\n\t\t\t\t\t\tif (stMargin.text && ValidStyledText(vs, vs.marginStyleOffset, stMargin)) {\n\t\t\t\t\t\t\tsurface->FillRectangle(rcMarker,\n\t\t\t\t\t\t\t\tvs.styles[stMargin.StyleAt(0)+vs.marginStyleOffset].back);\n\t\t\t\t\t\t\tif (vs.ms[margin].style == SC_MARGIN_RTEXT) {\n\t\t\t\t\t\t\t\tint width = WidestLineWidth(surface, vs, vs.marginStyleOffset, stMargin);\n\t\t\t\t\t\t\t\trcMarker.left = rcMarker.right - width - 3;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tDrawStyledText(surface, vs, vs.marginStyleOffset, rcMarker, rcMarker.top + vs.maxAscent,\n\t\t\t\t\t\t\t\tstMargin, 0, stMargin.length);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (marks) {\n\t\t\t\t\tfor (int markBit = 0; (markBit < 32) && marks; markBit++) {\n\t\t\t\t\t\tif (marks & 1) {\n\t\t\t\t\t\t\tLineMarker::typeOfFold tFold = LineMarker::undefined;\n\t\t\t\t\t\t\tif ((vs.ms[margin].mask & SC_MASK_FOLDERS) && highlightDelimiter.IsFoldBlockHighlighted(lineDoc)) {\n\t\t\t\t\t\t\t\tif (highlightDelimiter.IsBodyOfFoldBlock(lineDoc)) {\n\t\t\t\t\t\t\t\t\ttFold = LineMarker::body;\n\t\t\t\t\t\t\t\t} else if (highlightDelimiter.IsHeadOfFoldBlock(lineDoc)) {\n\t\t\t\t\t\t\t\t\tif (firstSubLine) {\n\t\t\t\t\t\t\t\t\t\ttFold = headWithTail ? LineMarker::headWithTail : LineMarker::head;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tif (cs.GetExpanded(lineDoc) || headWithTail) {\n\t\t\t\t\t\t\t\t\t\t\ttFold = LineMarker::body;\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\ttFold = LineMarker::undefined;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (highlightDelimiter.IsTailOfFoldBlock(lineDoc)) {\n\t\t\t\t\t\t\t\t\ttFold = LineMarker::tail;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvs.markers[markBit].Draw(surface, rcMarker, vs.styles[STYLE_LINENUMBER].font, tFold, vs.ms[margin].style);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmarks >>= 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvisibleLine++;\n\t\t\t\typosScreen += vs.lineHeight;\n\t\t\t}\n\t\t}\n\t}\n\n\tPRectangle rcBlankMargin = rcMargin;\n\trcBlankMargin.left = rcSelMargin.right;\n\tsurface->FillRectangle(rcBlankMargin, vs.styles[STYLE_DEFAULT].back);\n\n\tif (bufferedDraw) {\n\t\tsurfWindow->Copy(rcMargin, Point(rcMargin.left, rcMargin.top), *pixmapSelMargin);\n\t}\n}\n\nvoid DrawTabArrow(Surface *surface, PRectangle rcTab, int ymid) {\n\tint ydiff = (rcTab.bottom - rcTab.top) / 2;\n\tint xhead = rcTab.right - 1 - ydiff;\n\tif (xhead <= rcTab.left) {\n\t\tydiff -= rcTab.left - xhead - 1;\n\t\txhead = rcTab.left - 1;\n\t}\n\tif ((rcTab.left + 2) < (rcTab.right - 1))\n\t\tsurface->MoveTo(rcTab.left + 2, ymid);\n\telse\n\t\tsurface->MoveTo(rcTab.right - 1, ymid);\n\tsurface->LineTo(rcTab.right - 1, ymid);\n\tsurface->LineTo(xhead, ymid - ydiff);\n\tsurface->MoveTo(rcTab.right - 1, ymid);\n\tsurface->LineTo(xhead, ymid + ydiff);\n}\n\nLineLayout *Editor::RetrieveLineLayout(int lineNumber) {\n\tint posLineStart = pdoc->LineStart(lineNumber);\n\tint posLineEnd = pdoc->LineStart(lineNumber + 1);\n\tPLATFORM_ASSERT(posLineEnd >= posLineStart);\n\tint lineCaret = pdoc->LineFromPosition(sel.MainCaret());\n\treturn llc.Retrieve(lineNumber, lineCaret,\n\t        posLineEnd - posLineStart, pdoc->GetStyleClock(),\n\t        LinesOnScreen() + 1, pdoc->LinesTotal());\n}\n\n/**\n * Fill in the LineLayout data for the given line.\n * Copy the given @a line and its styles from the document into local arrays.\n * Also determine the x position at which each character starts.\n */\nvoid Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout *ll, int width) {\n//void LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout *ll, int width, Document *pdoc, PositionCache &posCache, SpecialRepresentations &reprs) {\n\tif (!ll)\n\t\treturn;\n\n\tPLATFORM_ASSERT(line < pdoc->LinesTotal());\n\tPLATFORM_ASSERT(ll->chars != NULL);\n\tint posLineStart = pdoc->LineStart(line);\n\tint posLineEnd = pdoc->LineStart(line + 1);\n\t// If the line is very long, limit the treatment to a length that should fit in the viewport\n\tif (posLineEnd > (posLineStart + ll->maxLineLength)) {\n\t\tposLineEnd = posLineStart + ll->maxLineLength;\n\t}\n\tif (ll->validity == LineLayout::llCheckTextAndStyle) {\n\t\tint lineLength = posLineEnd - posLineStart;\n\t\tif (!vstyle.viewEOL) {\n\t\t\tlineLength = pdoc->LineEnd(line) - posLineStart;\n\t\t}\n\t\tif (lineLength == ll->numCharsInLine) {\n\t\t\t// See if chars, styles, indicators, are all the same\n\t\t\tbool allSame = true;\n\t\t\tconst int styleMask = pdoc->stylingBitsMask;\n\t\t\t// Check base line layout\n\t\t\tchar styleByte = 0;\n\t\t\tint numCharsInLine = 0;\n\t\t\twhile (numCharsInLine < lineLength) {\n\t\t\t\tint charInDoc = numCharsInLine + posLineStart;\n\t\t\t\tchar chDoc = pdoc->CharAt(charInDoc);\n\t\t\t\tstyleByte = pdoc->StyleAt(charInDoc);\n\t\t\t\tallSame = allSame &&\n\t\t\t\t        (ll->styles[numCharsInLine] == static_cast<unsigned char>(styleByte & styleMask));\n\t\t\t\tallSame = allSame &&\n\t\t\t\t        (ll->indicators[numCharsInLine] == static_cast<char>(styleByte & ~styleMask));\n\t\t\t\tif (vstyle.styles[ll->styles[numCharsInLine]].caseForce == Style::caseMixed)\n\t\t\t\t\tallSame = allSame &&\n\t\t\t\t\t        (ll->chars[numCharsInLine] == chDoc);\n\t\t\t\telse if (vstyle.styles[ll->styles[numCharsInLine]].caseForce == Style::caseLower)\n\t\t\t\t\tallSame = allSame &&\n\t\t\t\t\t        (ll->chars[numCharsInLine] == static_cast<char>(tolower(chDoc)));\n\t\t\t\telse\t// Style::caseUpper\n\t\t\t\t\tallSame = allSame &&\n\t\t\t\t\t        (ll->chars[numCharsInLine] == static_cast<char>(toupper(chDoc)));\n\t\t\t\tnumCharsInLine++;\n\t\t\t}\n\t\t\tallSame = allSame && (ll->styles[numCharsInLine] == styleByte);\t// For eolFilled\n\t\t\tif (allSame) {\n\t\t\t\tll->validity = LineLayout::llPositions;\n\t\t\t} else {\n\t\t\t\tll->validity = LineLayout::llInvalid;\n\t\t\t}\n\t\t} else {\n\t\t\tll->validity = LineLayout::llInvalid;\n\t\t}\n\t}\n\tif (ll->validity == LineLayout::llInvalid) {\n\t\tll->widthLine = LineLayout::wrapWidthInfinite;\n\t\tll->lines = 1;\n\t\tif (vstyle.edgeState == EDGE_BACKGROUND) {\n\t\t\tll->edgeColumn = pdoc->FindColumn(line, vstyle.theEdge);\n\t\t\tif (ll->edgeColumn >= posLineStart) {\n\t\t\t\tll->edgeColumn -= posLineStart;\n\t\t\t}\n\t\t} else {\n\t\t\tll->edgeColumn = -1;\n\t\t}\n\n\t\tchar styleByte;\n\t\tconst int styleMask = pdoc->stylingBitsMask;\n\t\tll->styleBitsSet = 0;\n\t\t// Fill base line layout\n\t\tconst int lineLength = posLineEnd - posLineStart;\n\t\tpdoc->GetCharRange(ll->chars, posLineStart, lineLength);\n\t\tpdoc->GetStyleRange(ll->styles, posLineStart, lineLength);\n\t\tint numCharsBeforeEOL = pdoc->LineEnd(line) - posLineStart;\n\t\tconst int numCharsInLine = (vstyle.viewEOL) ? lineLength : numCharsBeforeEOL;\n\t\tfor (int styleInLine = 0; styleInLine < numCharsInLine; styleInLine++) {\n\t\t\tstyleByte = ll->styles[styleInLine];\n\t\t\tll->styleBitsSet |= styleByte;\n\t\t\tll->styles[styleInLine] = static_cast<char>(styleByte & styleMask);\n\t\t\tll->indicators[styleInLine] = static_cast<char>(styleByte & ~styleMask);\n\t\t}\n\t\tstyleByte = static_cast<char>(((lineLength > 0) ? ll->styles[lineLength-1] : 0) & styleMask);\n\t\tif (vstyle.someStylesForceCase) {\n\t\t\tfor (int charInLine = 0; charInLine<lineLength; charInLine++) {\n\t\t\t\tchar chDoc = ll->chars[charInLine];\n\t\t\t\tif (vstyle.styles[ll->styles[charInLine]].caseForce == Style::caseUpper)\n\t\t\t\t\tll->chars[charInLine] = static_cast<char>(toupper(chDoc));\n\t\t\t\telse if (vstyle.styles[ll->styles[charInLine]].caseForce == Style::caseLower)\n\t\t\t\t\tll->chars[charInLine] = static_cast<char>(tolower(chDoc));\n\t\t\t}\n\t\t}\n\t\tll->xHighlightGuide = 0;\n\t\t// Extra element at the end of the line to hold end x position and act as\n\t\tll->chars[numCharsInLine] = 0;   // Also triggers processing in the loops as this is a control character\n\t\tll->styles[numCharsInLine] = styleByte;\t// For eolFilled\n\t\tll->indicators[numCharsInLine] = 0;\n\n\t\t// Layout the line, determining the position of each character,\n\t\t// with an extra element at the end for the end of the line.\n\t\tll->positions[0] = 0;\n\t\tbool lastSegItalics = false;\n\n\t\tBreakFinder bfLayout(ll, 0, numCharsInLine, posLineStart, 0, false, pdoc, &reprs);\n\t\twhile (bfLayout.More()) {\n\n\t\t\tconst TextSegment ts = bfLayout.Next();\n\n\t\t\tstd::fill(&ll->positions[ts.start+1], &ll->positions[ts.end()+1], 0.0f);\n\t\t\tif (vstyle.styles[ll->styles[ts.start]].visible) {\n\t\t\t\tif (ts.representation) {\n\t\t\t\t\tXYPOSITION representationWidth = vstyle.controlCharWidth;\n\t\t\t\t\tif (ll->chars[ts.start] == '\\t') {\n\t\t\t\t\t\t// Tab is a special case of representation, taking a variable amount of space\n\t\t\t\t\t\trepresentationWidth =\n\t\t\t\t\t\t\t((static_cast<int>((ll->positions[ts.start] + 2) / vstyle.tabWidth) + 1) * vstyle.tabWidth) - ll->positions[ts.start];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (representationWidth <= 0.0) {\n\t\t\t\t\t\t\tXYPOSITION positionsRepr[256];\t// Should expand when needed\n\t\t\t\t\t\t\tposCache.MeasureWidths(surface, vstyle, STYLE_CONTROLCHAR, ts.representation->stringRep.c_str(),\n\t\t\t\t\t\t\t\tstatic_cast<unsigned int>(ts.representation->stringRep.length()), positionsRepr, pdoc);\n\t\t\t\t\t\t\trepresentationWidth = positionsRepr[ts.representation->stringRep.length()-1] + vstyle.ctrlCharPadding;\n \t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (int ii=0; ii < ts.length; ii++)\n\t\t\t\t\t\tll->positions[ts.start + 1 + ii] = representationWidth;\n\t\t\t\t} else {\n\t\t\t\t\tif ((ts.length == 1) && (' ' == ll->chars[ts.start])) {\n\t\t\t\t\t\t// Over half the segments are single characters and of these about half are space characters.\n\t\t\t\t\t\tll->positions[ts.start + 1] = vstyle.styles[ll->styles[ts.start]].spaceWidth;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposCache.MeasureWidths(surface, vstyle, ll->styles[ts.start], ll->chars + ts.start,\n\t\t\t\t\t\t\t    ts.length, ll->positions + ts.start + 1, pdoc);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlastSegItalics = (!ts.representation) && ((ll->chars[ts.end()-1] != ' ') && vstyle.styles[ll->styles[ts.start]].italic);\n\t\t\t}\n\n\t\t\tfor (int posToIncrease = ts.start+1; posToIncrease <= ts.end(); posToIncrease++) {\n\t\t\t\tll->positions[posToIncrease] += ll->positions[ts.start];\n\t\t\t}\n\t\t}\n\n\t\t// Small hack to make lines that end with italics not cut off the edge of the last character\n\t\tif (lastSegItalics) {\n\t\t\tll->positions[numCharsInLine] += vstyle.lastSegItalicsOffset;\n\t\t}\n\t\tll->numCharsInLine = numCharsInLine;\n\t\tll->numCharsBeforeEOL = numCharsBeforeEOL;\n\t\tll->validity = LineLayout::llPositions;\n\t}\n\t// Hard to cope when too narrow, so just assume there is space\n\tif (width < 20) {\n\t\twidth = 20;\n\t}\n\tif ((ll->validity == LineLayout::llPositions) || (ll->widthLine != width)) {\n\t\tll->widthLine = width;\n\t\tif (width == LineLayout::wrapWidthInfinite) {\n\t\t\tll->lines = 1;\n\t\t} else if (width > ll->positions[ll->numCharsInLine]) {\n\t\t\t// Simple common case where line does not need wrapping.\n\t\t\tll->lines = 1;\n\t\t} else {\n\t\t\tif (vstyle.wrapVisualFlags & SC_WRAPVISUALFLAG_END) {\n\t\t\t\twidth -= static_cast<int>(vstyle.aveCharWidth); // take into account the space for end wrap mark\n\t\t\t}\n\t\t\tXYPOSITION wrapAddIndent = 0; // This will be added to initial indent of line\n\t\t\tif (vstyle.wrapIndentMode == SC_WRAPINDENT_INDENT) {\n\t\t\t\twrapAddIndent = pdoc->IndentSize() * vstyle.spaceWidth;\n\t\t\t} else if (vstyle.wrapIndentMode == SC_WRAPINDENT_FIXED) {\n\t\t\t\twrapAddIndent = vstyle.wrapVisualStartIndent * vstyle.aveCharWidth;\n\t\t\t}\n\t\t\tll->wrapIndent = wrapAddIndent;\n\t\t\tif (vstyle.wrapIndentMode != SC_WRAPINDENT_FIXED)\n\t\t\t\tfor (int i = 0; i < ll->numCharsInLine; i++) {\n\t\t\t\t\tif (!IsSpaceOrTab(ll->chars[i])) {\n\t\t\t\t\t\tll->wrapIndent += ll->positions[i]; // Add line indent\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t// Check for text width minimum\n\t\t\tif (ll->wrapIndent > width - static_cast<int>(vstyle.aveCharWidth) * 15)\n\t\t\t\tll->wrapIndent = wrapAddIndent;\n\t\t\t// Check for wrapIndent minimum\n\t\t\tif ((vstyle.wrapVisualFlags & SC_WRAPVISUALFLAG_START) && (ll->wrapIndent < vstyle.aveCharWidth))\n\t\t\t\tll->wrapIndent = vstyle.aveCharWidth; // Indent to show start visual\n\t\t\tll->lines = 0;\n\t\t\t// Calculate line start positions based upon width.\n\t\t\tint lastGoodBreak = 0;\n\t\t\tint lastLineStart = 0;\n\t\t\tXYACCUMULATOR startOffset = 0;\n\t\t\tint p = 0;\n\t\t\twhile (p < ll->numCharsInLine) {\n\t\t\t\tif ((ll->positions[p + 1] - startOffset) >= width) {\n\t\t\t\t\tif (lastGoodBreak == lastLineStart) {\n\t\t\t\t\t\t// Try moving to start of last character\n\t\t\t\t\t\tif (p > 0) {\n\t\t\t\t\t\t\tlastGoodBreak = pdoc->MovePositionOutsideChar(p + posLineStart, -1)\n\t\t\t\t\t\t\t        - posLineStart;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (lastGoodBreak == lastLineStart) {\n\t\t\t\t\t\t\t// Ensure at least one character on line.\n\t\t\t\t\t\t\tlastGoodBreak = pdoc->MovePositionOutsideChar(lastGoodBreak + posLineStart + 1, 1)\n\t\t\t\t\t\t\t        - posLineStart;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tlastLineStart = lastGoodBreak;\n\t\t\t\t\tll->lines++;\n\t\t\t\t\tll->SetLineStart(ll->lines, lastGoodBreak);\n\t\t\t\t\tstartOffset = ll->positions[lastGoodBreak];\n\t\t\t\t\t// take into account the space for start wrap mark and indent\n\t\t\t\t\tstartOffset -= ll->wrapIndent;\n\t\t\t\t\tp = lastGoodBreak + 1;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (p > 0) {\n\t\t\t\t\tif (vstyle.wrapState == eWrapChar) {\n\t\t\t\t\t\tlastGoodBreak = pdoc->MovePositionOutsideChar(p + posLineStart, -1)\n\t\t\t\t\t\t        - posLineStart;\n\t\t\t\t\t\tp = pdoc->MovePositionOutsideChar(p + 1 + posLineStart, 1) - posLineStart;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else if (ll->styles[p] != ll->styles[p - 1]) {\n\t\t\t\t\t\tlastGoodBreak = p;\n\t\t\t\t\t} else if (IsSpaceOrTab(ll->chars[p - 1]) && !IsSpaceOrTab(ll->chars[p])) {\n\t\t\t\t\t\tlastGoodBreak = p;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tp++;\n\t\t\t}\n\t\t\tll->lines++;\n\t\t}\n\t\tll->validity = LineLayout::llLines;\n\t}\n}\n\nColourDesired Editor::SelectionBackground(ViewStyle &vsDraw, bool main) const {\n\treturn main ?\n\t\t(primarySelection ? vsDraw.selColours.back : vsDraw.selBackground2) :\n\t\tvsDraw.selAdditionalBackground;\n}\n\nColourDesired Editor::TextBackground(ViewStyle &vsDraw, bool overrideBackground,\n        ColourDesired background, int inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll) const {\n\tif (inSelection == 1) {\n\t\tif (vsDraw.selColours.back.isSet && (vsDraw.selAlpha == SC_ALPHA_NOALPHA)) {\n\t\t\treturn SelectionBackground(vsDraw, true);\n\t\t}\n\t} else if (inSelection == 2) {\n\t\tif (vsDraw.selColours.back.isSet && (vsDraw.selAdditionalAlpha == SC_ALPHA_NOALPHA)) {\n\t\t\treturn SelectionBackground(vsDraw, false);\n\t\t}\n\t} else {\n\t\tif ((vsDraw.edgeState == EDGE_BACKGROUND) &&\n\t\t        (i >= ll->edgeColumn) &&\n\t\t        (i < ll->numCharsBeforeEOL))\n\t\t\treturn vsDraw.edgecolour;\n\t\tif (inHotspot && vsDraw.hotspotColours.back.isSet)\n\t\t\treturn vsDraw.hotspotColours.back;\n\t}\n\tif (overrideBackground && (styleMain != STYLE_BRACELIGHT) && (styleMain != STYLE_BRACEBAD)) {\n\t\treturn background;\n\t} else {\n\t\treturn vsDraw.styles[styleMain].back;\n\t}\n}\n\nvoid Editor::DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight) {\n\tPoint from(0, ((lineVisible & 1) && (lineHeight & 1)) ? 1 : 0);\n\tPRectangle rcCopyArea(start + 1, rcSegment.top, start + 2, rcSegment.bottom);\n\tsurface->Copy(rcCopyArea, from,\n\t        highlight ? *pixmapIndentGuideHighlight : *pixmapIndentGuide);\n}\n\nvoid Editor::DrawWrapMarker(Surface *surface, PRectangle rcPlace,\n        bool isEndMarker, ColourDesired wrapColour) {\n\tsurface->PenColour(wrapColour);\n\n\tenum { xa = 1 }; // gap before start\n\tint w = rcPlace.right - rcPlace.left - xa - 1;\n\n\tbool xStraight = isEndMarker;  // x-mirrored symbol for start marker\n\n\tint x0 = xStraight ? rcPlace.left : rcPlace.right - 1;\n\tint y0 = rcPlace.top;\n\n\tint dy = (rcPlace.bottom - rcPlace.top) / 5;\n\tint y = (rcPlace.bottom - rcPlace.top) / 2 + dy;\n\n\tstruct Relative {\n\t\tSurface *surface;\n\t\tint xBase;\n\t\tint xDir;\n\t\tint yBase;\n\t\tint yDir;\n\t\tvoid MoveTo(int xRelative, int yRelative) {\n\t\t\tsurface->MoveTo(xBase + xDir * xRelative, yBase + yDir * yRelative);\n\t\t}\n\t\tvoid LineTo(int xRelative, int yRelative) {\n\t\t\tsurface->LineTo(xBase + xDir * xRelative, yBase + yDir * yRelative);\n\t\t}\n\t};\n\tRelative rel = {surface, x0, xStraight ? 1 : -1, y0, 1};\n\n\t// arrow head\n\trel.MoveTo(xa, y);\n\trel.LineTo(xa + 2*w / 3, y - dy);\n\trel.MoveTo(xa, y);\n\trel.LineTo(xa + 2*w / 3, y + dy);\n\n\t// arrow body\n\trel.MoveTo(xa, y);\n\trel.LineTo(xa + w, y);\n\trel.LineTo(xa + w, y - 2 * dy);\n\trel.LineTo(xa - 1,   // on windows lineto is exclusive endpoint, perhaps GTK not...\n\t        y - 2 * dy);\n}\n\nstatic void SimpleAlphaRectangle(Surface *surface, PRectangle rc, ColourDesired fill, int alpha) {\n\tif (alpha != SC_ALPHA_NOALPHA) {\n\t\tsurface->AlphaRectangle(rc, 0, fill, alpha, fill, alpha, 0);\n\t}\n}\n\nvoid DrawTextBlob(Surface *surface, ViewStyle &vsDraw, PRectangle rcSegment,\n\t\t\t\t  const char *s, ColourDesired textBack, ColourDesired textFore, bool twoPhaseDraw) {\n\tif (!twoPhaseDraw) {\n\t\tsurface->FillRectangle(rcSegment, textBack);\n\t}\n\tFont &ctrlCharsFont = vsDraw.styles[STYLE_CONTROLCHAR].font;\n\tint normalCharHeight = surface->Ascent(ctrlCharsFont) -\n\t        surface->InternalLeading(ctrlCharsFont);\n\tPRectangle rcCChar = rcSegment;\n\trcCChar.left = rcCChar.left + 1;\n\trcCChar.top = rcSegment.top + vsDraw.maxAscent - normalCharHeight;\n\trcCChar.bottom = rcSegment.top + vsDraw.maxAscent + 1;\n\tPRectangle rcCentral = rcCChar;\n\trcCentral.top++;\n\trcCentral.bottom--;\n\tsurface->FillRectangle(rcCentral, textFore);\n\tPRectangle rcChar = rcCChar;\n\trcChar.left++;\n\trcChar.right--;\n\tsurface->DrawTextClipped(rcChar, ctrlCharsFont,\n\t        rcSegment.top + vsDraw.maxAscent, s, istrlen(s),\n\t        textBack, textFore);\n}\n\nvoid Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll,\n        int line, int lineEnd, int xStart, int subLine, XYACCUMULATOR subLineStart,\n        bool overrideBackground, ColourDesired background,\n        bool drawWrapMarkEnd, ColourDesired wrapColour) {\n\n\tconst int posLineStart = pdoc->LineStart(line);\n\tconst int styleMask = pdoc->stylingBitsMask;\n\tPRectangle rcSegment = rcLine;\n\n\tconst bool lastSubLine = subLine == (ll->lines - 1);\n\tXYPOSITION virtualSpace = 0;\n\tif (lastSubLine) {\n\t\tconst XYPOSITION spaceWidth = vsDraw.styles[ll->EndLineStyle()].spaceWidth;\n\t\tvirtualSpace = sel.VirtualSpaceFor(pdoc->LineEnd(line)) * spaceWidth;\n\t}\n\tXYPOSITION xEol = ll->positions[lineEnd] - subLineStart;\n\n\t// Fill the virtual space and show selections within it\n\tif (virtualSpace) {\n\t\trcSegment.left = xEol + xStart;\n\t\trcSegment.right = xEol + xStart + virtualSpace;\n\t\tsurface->FillRectangle(rcSegment, overrideBackground ? background : vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back);\n\t\tif (!hideSelection && ((vsDraw.selAlpha == SC_ALPHA_NOALPHA) || (vsDraw.selAdditionalAlpha == SC_ALPHA_NOALPHA))) {\n\t\t\tSelectionSegment virtualSpaceRange(SelectionPosition(pdoc->LineEnd(line)), SelectionPosition(pdoc->LineEnd(line), sel.VirtualSpaceFor(pdoc->LineEnd(line))));\n\t\t\tfor (size_t r=0; r<sel.Count(); r++) {\n\t\t\t\tint alpha = (r == sel.Main()) ? vsDraw.selAlpha : vsDraw.selAdditionalAlpha;\n\t\t\t\tif (alpha == SC_ALPHA_NOALPHA) {\n\t\t\t\t\tSelectionSegment portion = sel.Range(r).Intersect(virtualSpaceRange);\n\t\t\t\t\tif (!portion.Empty()) {\n\t\t\t\t\t\tconst XYPOSITION spaceWidth = vsDraw.styles[ll->EndLineStyle()].spaceWidth;\n\t\t\t\t\t\trcSegment.left = xStart + ll->positions[portion.start.Position() - posLineStart] - subLineStart + portion.start.VirtualSpace() * spaceWidth;\n\t\t\t\t\t\trcSegment.right = xStart + ll->positions[portion.end.Position() - posLineStart] - subLineStart + portion.end.VirtualSpace() * spaceWidth;\n\t\t\t\t\t\trcSegment.left = (rcSegment.left > rcLine.left) ? rcSegment.left : rcLine.left;\n\t\t\t\t\t\trcSegment.right = (rcSegment.right < rcLine.right) ? rcSegment.right : rcLine.right;\n\t\t\t\t\t\tsurface->FillRectangle(rcSegment, SelectionBackground(vsDraw, r == sel.Main()));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tint eolInSelection = 0;\n\tint alpha = SC_ALPHA_NOALPHA;\n\tif (!hideSelection) {\n\t\tint posAfterLineEnd = pdoc->LineStart(line + 1);\n\t\teolInSelection = (subLine == (ll->lines - 1)) ? sel.InSelectionForEOL(posAfterLineEnd) : 0;\n\t\talpha = (eolInSelection == 1) ? vsDraw.selAlpha : vsDraw.selAdditionalAlpha;\n\t}\n\n\t// Draw the [CR], [LF], or [CR][LF] blobs if visible line ends are on\n\tXYPOSITION blobsWidth = 0;\n\tif (lastSubLine) {\n\t\tfor (int eolPos=ll->numCharsBeforeEOL; eolPos<ll->numCharsInLine; eolPos++) {\n\t\t\trcSegment.left = xStart + ll->positions[eolPos] - subLineStart + virtualSpace;\n\t\t\trcSegment.right = xStart + ll->positions[eolPos+1] - subLineStart + virtualSpace;\n\t\t\tblobsWidth += rcSegment.Width();\n\t\t\tchar hexits[4];\n\t\t\tconst char *ctrlChar;\n\t\t\tunsigned char chEOL = ll->chars[eolPos];\n\t\t\tif (UTF8IsAscii(chEOL)) {\n\t\t\t\tctrlChar = ControlCharacterString(chEOL);\n\t\t\t} else {\n\t\t\t\tsprintf(hexits, \"x%2X\", chEOL);\n\t\t\t\tctrlChar = hexits;\n\t\t\t}\n\t\t\tint styleMain = ll->styles[eolPos];\n\t\t\tColourDesired textBack = TextBackground(vsDraw, overrideBackground, background, eolInSelection, false, styleMain, eolPos, ll);\n\t\t\tColourDesired textFore = vsDraw.styles[styleMain].fore;\n\t\t\tif (eolInSelection && vsDraw.selColours.fore.isSet) {\n\t\t\t\ttextFore = (eolInSelection == 1) ? vsDraw.selColours.fore : vsDraw.selAdditionalForeground;\n\t\t\t}\n\t\t\tif (eolInSelection && vsDraw.selColours.back.isSet && (line < pdoc->LinesTotal() - 1)) {\n\t\t\t\tif (alpha == SC_ALPHA_NOALPHA) {\n\t\t\t\t\tsurface->FillRectangle(rcSegment, SelectionBackground(vsDraw, eolInSelection == 1));\n\t\t\t\t} else {\n\t\t\t\t\tsurface->FillRectangle(rcSegment, textBack);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsurface->FillRectangle(rcSegment, textBack);\n\t\t\t}\n\t\t\tDrawTextBlob(surface, vsDraw, rcSegment, ctrlChar, textBack, textFore, twoPhaseDraw);\n\t\t\tif (eolInSelection && vsDraw.selColours.back.isSet && (line < pdoc->LinesTotal() - 1) && (alpha != SC_ALPHA_NOALPHA)) {\n\t\t\t\tSimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw, eolInSelection == 1), alpha);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Draw the eol-is-selected rectangle\n\trcSegment.left = xEol + xStart + virtualSpace + blobsWidth;\n\trcSegment.right = rcSegment.left + vsDraw.aveCharWidth;\n\n\tif (eolInSelection && vsDraw.selColours.back.isSet && (line < pdoc->LinesTotal() - 1) && (alpha == SC_ALPHA_NOALPHA)) {\n\t\tsurface->FillRectangle(rcSegment, SelectionBackground(vsDraw, eolInSelection == 1));\n\t} else {\n\t\tif (overrideBackground) {\n\t\t\tsurface->FillRectangle(rcSegment, background);\n\t\t} else if (line < pdoc->LinesTotal() - 1) {\n\t\t\tsurface->FillRectangle(rcSegment, vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back);\n\t\t} else if (vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].eolFilled) {\n\t\t\tsurface->FillRectangle(rcSegment, vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back);\n\t\t} else {\n\t\t\tsurface->FillRectangle(rcSegment, vsDraw.styles[STYLE_DEFAULT].back);\n\t\t}\n\t\tif (eolInSelection && vsDraw.selColours.back.isSet && (line < pdoc->LinesTotal() - 1) && (alpha != SC_ALPHA_NOALPHA)) {\n\t\t\tSimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw, eolInSelection == 1), alpha);\n\t\t}\n\t}\n\n\t// Fill the remainder of the line\n\trcSegment.left = rcSegment.right;\n\tif (rcSegment.left < rcLine.left)\n\t\trcSegment.left = rcLine.left;\n\trcSegment.right = rcLine.right;\n\n\tif (eolInSelection && vsDraw.selEOLFilled && vsDraw.selColours.back.isSet && (line < pdoc->LinesTotal() - 1) && (alpha == SC_ALPHA_NOALPHA)) {\n\t\tsurface->FillRectangle(rcSegment, SelectionBackground(vsDraw, eolInSelection == 1));\n\t} else {\n\t\tif (overrideBackground) {\n\t\t\tsurface->FillRectangle(rcSegment, background);\n\t\t} else if (vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].eolFilled) {\n\t\t\tsurface->FillRectangle(rcSegment, vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back);\n\t\t} else {\n\t\t\tsurface->FillRectangle(rcSegment, vsDraw.styles[STYLE_DEFAULT].back);\n\t\t}\n\t\tif (eolInSelection && vsDraw.selEOLFilled && vsDraw.selColours.back.isSet && (line < pdoc->LinesTotal() - 1) && (alpha != SC_ALPHA_NOALPHA)) {\n\t\t\tSimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw, eolInSelection == 1), alpha);\n\t\t}\n\t}\n\n\tif (drawWrapMarkEnd) {\n\t\tPRectangle rcPlace = rcSegment;\n\n\t\tif (vsDraw.wrapVisualFlagsLocation & SC_WRAPVISUALFLAGLOC_END_BY_TEXT) {\n\t\t\trcPlace.left = xEol + xStart + virtualSpace;\n\t\t\trcPlace.right = rcPlace.left + vsDraw.aveCharWidth;\n\t\t} else {\n\t\t\t// rcLine is clipped to text area\n\t\t\trcPlace.right = rcLine.right;\n\t\t\trcPlace.left = rcPlace.right - vsDraw.aveCharWidth;\n\t\t}\n\t\tDrawWrapMarker(surface, rcPlace, true, wrapColour);\n\t}\n}\n\nvoid Editor::DrawIndicator(int indicNum, int startPos, int endPos, Surface *surface, ViewStyle &vsDraw,\n\t\tint xStart, PRectangle rcLine, LineLayout *ll, int subLine) {\n\tconst XYPOSITION subLineStart = ll->positions[ll->LineStart(subLine)];\n\tPRectangle rcIndic(\n\t\tll->positions[startPos] + xStart - subLineStart,\n\t\trcLine.top + vsDraw.maxAscent,\n\t\tll->positions[endPos] + xStart - subLineStart,\n\t\trcLine.top + vsDraw.maxAscent + 3);\n\tvsDraw.indicators[indicNum].Draw(surface, rcIndic, rcLine);\n}\n\nvoid Editor::DrawIndicators(Surface *surface, ViewStyle &vsDraw, int line, int xStart,\n        PRectangle rcLine, LineLayout *ll, int subLine, int lineEnd, bool under) {\n\t// Draw decorators\n\tconst int posLineStart = pdoc->LineStart(line);\n\tconst int lineStart = ll->LineStart(subLine);\n\tconst int posLineEnd = posLineStart + lineEnd;\n\n\tif (!under) {\n\t\t// Draw indicators\n\t\t// foreach indicator...\n\t\tfor (int indicnum = 0, mask = 1 << pdoc->stylingBits; mask < 0x100; indicnum++) {\n\t\t\tif (!(mask & ll->styleBitsSet)) {\n\t\t\t\tmask <<= 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tint startPos = -1;\n\t\t\t// foreach style pos in line...\n\t\t\tfor (int indicPos = lineStart; indicPos <= lineEnd; indicPos++) {\n\t\t\t\t// look for starts...\n\t\t\t\tif (startPos < 0) {\n\t\t\t\t\t// NOT in indicator run, looking for START\n\t\t\t\t\tif (indicPos < lineEnd && (ll->indicators[indicPos] & mask))\n\t\t\t\t\t\tstartPos = indicPos;\n\t\t\t\t}\n\t\t\t\t// ... or ends\n\t\t\t\tif (startPos >= 0) {\n\t\t\t\t\t// IN indicator run, looking for END\n\t\t\t\t\tif (indicPos >= lineEnd || !(ll->indicators[indicPos] & mask)) {\n\t\t\t\t\t\t// AT end of indicator run, DRAW it!\n\t\t\t\t\t\tDrawIndicator(indicnum, startPos, indicPos, surface, vsDraw, xStart, rcLine, ll, subLine);\n\t\t\t\t\t\t// RESET control var\n\t\t\t\t\t\tstartPos = -1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tmask <<= 1;\n\t\t}\n\t}\n\n\tfor (Decoration *deco = pdoc->decorations.root; deco; deco = deco->next) {\n\t\tif (under == vsDraw.indicators[deco->indicator].under) {\n\t\t\tint startPos = posLineStart + lineStart;\n\t\t\tif (!deco->rs.ValueAt(startPos)) {\n\t\t\t\tstartPos = deco->rs.EndRun(startPos);\n\t\t\t}\n\t\t\twhile ((startPos < posLineEnd) && (deco->rs.ValueAt(startPos))) {\n\t\t\t\tint endPos = deco->rs.EndRun(startPos);\n\t\t\t\tif (endPos > posLineEnd)\n\t\t\t\t\tendPos = posLineEnd;\n\t\t\t\tDrawIndicator(deco->indicator, startPos - posLineStart, endPos - posLineStart,\n\t\t\t\t\tsurface, vsDraw, xStart, rcLine, ll, subLine);\n\t\t\t\tstartPos = deco->rs.EndRun(endPos);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Use indicators to highlight matching braces\n\tif ((vs.braceHighlightIndicatorSet && (bracesMatchStyle == STYLE_BRACELIGHT)) ||\n\t\t(vs.braceBadLightIndicatorSet && (bracesMatchStyle == STYLE_BRACEBAD))) {\n\t\tint braceIndicator = (bracesMatchStyle == STYLE_BRACELIGHT) ? vs.braceHighlightIndicator : vs.braceBadLightIndicator;\n\t\tif (under == vsDraw.indicators[braceIndicator].under) {\n\t\t\tRange rangeLine(posLineStart + lineStart, posLineEnd);\n\t\t\tif (rangeLine.ContainsCharacter(braces[0])) {\n\t\t\t\tint braceOffset = braces[0] - posLineStart;\n\t\t\t\tif (braceOffset < ll->numCharsInLine) {\n\t\t\t\t\tDrawIndicator(braceIndicator, braceOffset, braceOffset + 1, surface, vsDraw, xStart, rcLine, ll, subLine);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (rangeLine.ContainsCharacter(braces[1])) {\n\t\t\t\tint braceOffset = braces[1] - posLineStart;\n\t\t\t\tif (braceOffset < ll->numCharsInLine) {\n\t\t\t\t\tDrawIndicator(braceIndicator, braceOffset, braceOffset + 1, surface, vsDraw, xStart, rcLine, ll, subLine);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid Editor::DrawAnnotation(Surface *surface, ViewStyle &vsDraw, int line, int xStart,\n    PRectangle rcLine, LineLayout *ll, int subLine) {\n\tint indent = pdoc->GetLineIndentation(line) * vsDraw.spaceWidth;\n\tPRectangle rcSegment = rcLine;\n\tint annotationLine = subLine - ll->lines;\n\tconst StyledText stAnnotation  = pdoc->AnnotationStyledText(line);\n\tif (stAnnotation.text && ValidStyledText(vsDraw, vsDraw.annotationStyleOffset, stAnnotation)) {\n\t\tsurface->FillRectangle(rcSegment, vsDraw.styles[0].back);\n\t\tif (vs.annotationVisible == ANNOTATION_BOXED) {\n\t\t\t// Only care about calculating width if need to draw box\n\t\t\tint widthAnnotation = WidestLineWidth(surface, vsDraw, vsDraw.annotationStyleOffset, stAnnotation);\n\t\t\twidthAnnotation += vsDraw.spaceWidth * 2; // Margins\n\t\t\trcSegment.left = xStart + indent;\n\t\t\trcSegment.right = rcSegment.left + widthAnnotation;\n\t\t} else {\n\t\t\trcSegment.left = xStart;\n\t\t}\n\t\tconst int annotationLines = pdoc->AnnotationLines(line);\n\t\tsize_t start = 0;\n\t\tsize_t lengthAnnotation = stAnnotation.LineLength(start);\n\t\tint lineInAnnotation = 0;\n\t\twhile ((lineInAnnotation < annotationLine) && (start < stAnnotation.length)) {\n\t\t\tstart += lengthAnnotation + 1;\n\t\t\tlengthAnnotation = stAnnotation.LineLength(start);\n\t\t\tlineInAnnotation++;\n\t\t}\n\t\tPRectangle rcText = rcSegment;\n\t\tif (vs.annotationVisible == ANNOTATION_BOXED) {\n\t\t\tsurface->FillRectangle(rcText,\n\t\t\t\tvsDraw.styles[stAnnotation.StyleAt(start) + vsDraw.annotationStyleOffset].back);\n\t\t\trcText.left += vsDraw.spaceWidth;\n\t\t}\n\t\tDrawStyledText(surface, vsDraw, vsDraw.annotationStyleOffset, rcText, rcText.top + vsDraw.maxAscent,\n\t\t\tstAnnotation, start, lengthAnnotation);\n\t\tif (vs.annotationVisible == ANNOTATION_BOXED) {\n\t\t\tsurface->PenColour(vsDraw.styles[vsDraw.annotationStyleOffset].fore);\n\t\t\tsurface->MoveTo(rcSegment.left, rcSegment.top);\n\t\t\tsurface->LineTo(rcSegment.left, rcSegment.bottom);\n\t\t\tsurface->MoveTo(rcSegment.right, rcSegment.top);\n\t\t\tsurface->LineTo(rcSegment.right, rcSegment.bottom);\n\t\t\tif (subLine == ll->lines) {\n\t\t\t\tsurface->MoveTo(rcSegment.left, rcSegment.top);\n\t\t\t\tsurface->LineTo(rcSegment.right, rcSegment.top);\n\t\t\t}\n\t\t\tif (subLine == ll->lines+annotationLines-1) {\n\t\t\t\tsurface->MoveTo(rcSegment.left, rcSegment.bottom - 1);\n\t\t\t\tsurface->LineTo(rcSegment.right, rcSegment.bottom - 1);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart,\n        PRectangle rcLine, LineLayout *ll, int subLine) {\n\n\tif (subLine >= ll->lines) {\n\t\tDrawAnnotation(surface, vsDraw, line, xStart, rcLine, ll, subLine);\n\t\treturn; // No further drawing\n\t}\n\n\tPRectangle rcSegment = rcLine;\n\n\t// Using one font for all control characters so it can be controlled independently to ensure\n\t// the box goes around the characters tightly. Seems to be no way to work out what height\n\t// is taken by an individual character - internal leading gives varying results.\n\tFont &ctrlCharsFont = vsDraw.styles[STYLE_CONTROLCHAR].font;\n\n\t// See if something overrides the line background color:  Either if caret is on the line\n\t// and background color is set for that, or if a marker is defined that forces its background\n\t// color onto the line, or if a marker is defined but has no selection margin in which to\n\t// display itself (as long as it's not an SC_MARK_EMPTY marker).  These are checked in order\n\t// with the earlier taking precedence.  When multiple markers cause background override,\n\t// the color for the highest numbered one is used.\n\tbool overrideBackground = false;\n\tColourDesired background;\n\tif ((caret.active || vsDraw.alwaysShowCaretLineBackground) && vsDraw.showCaretLineBackground && (vsDraw.caretLineAlpha == SC_ALPHA_NOALPHA) && ll->containsCaret) {\n\t\toverrideBackground = true;\n\t\tbackground = vsDraw.caretLineBackground;\n\t}\n\tif (!overrideBackground) {\n\t\tint marks = pdoc->GetMark(line);\n\t\tfor (int markBit = 0; (markBit < 32) && marks; markBit++) {\n\t\t\tif ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND) &&\n\t\t\t        (vsDraw.markers[markBit].alpha == SC_ALPHA_NOALPHA)) {\n\t\t\t\tbackground = vsDraw.markers[markBit].back;\n\t\t\t\toverrideBackground = true;\n\t\t\t}\n\t\t\tmarks >>= 1;\n\t\t}\n\t}\n\tif (!overrideBackground) {\n\t\tif (vsDraw.maskInLine) {\n\t\t\tint marksMasked = pdoc->GetMark(line) & vsDraw.maskInLine;\n\t\t\tif (marksMasked) {\n\t\t\t\tfor (int markBit = 0; (markBit < 32) && marksMasked; markBit++) {\n\t\t\t\t\tif ((marksMasked & 1) && (vsDraw.markers[markBit].markType != SC_MARK_EMPTY) &&\n\t\t\t\t\t        (vsDraw.markers[markBit].alpha == SC_ALPHA_NOALPHA)) {\n\t\t\t\t\t\toverrideBackground = true;\n\t\t\t\t\t\tbackground = vsDraw.markers[markBit].back;\n\t\t\t\t\t}\n\t\t\t\t\tmarksMasked >>= 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst bool drawWhitespaceBackground = (vsDraw.viewWhitespace != wsInvisible) &&\n\t        (!overrideBackground) && (vsDraw.whitespaceColours.back.isSet);\n\n\tbool inIndentation = subLine == 0;\t// Do not handle indentation except on first subline.\n\tconst XYPOSITION indentWidth = pdoc->IndentSize() * vsDraw.spaceWidth;\n\tconst XYPOSITION epsilon = 0.0001f;\t// A small nudge to avoid floating point precision issues\n\n\tconst int posLineStart = pdoc->LineStart(line);\n\n\tconst int startseg = ll->LineStart(subLine);\n\tconst XYACCUMULATOR subLineStart = ll->positions[startseg];\n\tint lineStart = 0;\n\tint lineEnd = 0;\n\tif (subLine < ll->lines) {\n\t\tlineStart = ll->LineStart(subLine);\n\t\tlineEnd = ll->LineStart(subLine + 1);\n\t\tif (subLine == ll->lines - 1) {\n\t\t\tlineEnd = ll->numCharsBeforeEOL;\n\t\t}\n\t}\n\n\tconst ColourDesired wrapColour = vsDraw.WrapColour();\n\n\tbool drawWrapMarkEnd = false;\n\n\tif (vsDraw.wrapVisualFlags & SC_WRAPVISUALFLAG_END) {\n\t\tif (subLine + 1 < ll->lines) {\n\t\t\tdrawWrapMarkEnd = ll->LineStart(subLine + 1) != 0;\n\t\t}\n\t}\n\n\tif (ll->wrapIndent != 0) {\n\n\t\tbool continuedWrapLine = false;\n\t\tif (subLine < ll->lines) {\n\t\t\tcontinuedWrapLine = ll->LineStart(subLine) != 0;\n\t\t}\n\n\t\tif (continuedWrapLine) {\n\t\t\t// draw continuation rect\n\t\t\tPRectangle rcPlace = rcSegment;\n\n\t\t\trcPlace.left = ll->positions[startseg] + xStart - subLineStart;\n\t\t\trcPlace.right = rcPlace.left + ll->wrapIndent;\n\n\t\t\t// default bgnd here..\n\t\t\tsurface->FillRectangle(rcSegment, overrideBackground ? background :\n\t\t\t        vsDraw.styles[STYLE_DEFAULT].back);\n\n\t\t\t// main line style would be below but this would be inconsistent with end markers\n\t\t\t// also would possibly not be the style at wrap point\n\t\t\t//int styleMain = ll->styles[lineStart];\n\t\t\t//surface->FillRectangle(rcPlace, vsDraw.styles[styleMain].back);\n\n\t\t\tif (vsDraw.wrapVisualFlags & SC_WRAPVISUALFLAG_START) {\n\n\t\t\t\tif (vsDraw.wrapVisualFlagsLocation & SC_WRAPVISUALFLAGLOC_START_BY_TEXT)\n\t\t\t\t\trcPlace.left = rcPlace.right - vsDraw.aveCharWidth;\n\t\t\t\telse\n\t\t\t\t\trcPlace.right = rcPlace.left + vsDraw.aveCharWidth;\n\n\t\t\t\tDrawWrapMarker(surface, rcPlace, false, wrapColour);\n\t\t\t}\n\n\t\t\txStart += static_cast<int>(ll->wrapIndent);\n\t\t}\n\t}\n\n\tconst bool selBackDrawn = vsDraw.selColours.back.isSet &&\n\t\t((vsDraw.selAlpha == SC_ALPHA_NOALPHA) || (vsDraw.selAdditionalAlpha == SC_ALPHA_NOALPHA));\n\n\t// Does not take margin into account but not significant\n\tconst int xStartVisible = static_cast<int>(subLineStart) - xStart;\n\n\tll->psel = &sel;\n\n\tif (twoPhaseDraw) {\n\t\tBreakFinder bfBack(ll, lineStart, lineEnd, posLineStart, xStartVisible, selBackDrawn, pdoc, &reprs);\n\n\t\t// Background drawing loop\n\t\twhile (bfBack.More()) {\n\n\t\t\tconst TextSegment ts = bfBack.Next();\n\t\t\tconst int i = ts.end() - 1;\n\t\t\tconst int iDoc = i + posLineStart;\n\n\t\t\trcSegment.left = ll->positions[ts.start] + xStart - subLineStart;\n\t\t\trcSegment.right = ll->positions[ts.end()] + xStart - subLineStart;\n\t\t\t// Only try to draw if really visible - enhances performance by not calling environment to\n\t\t\t// draw strings that are completely past the right side of the window.\n\t\t\tif (rcSegment.Intersects(rcLine)) {\n\t\t\t\t// Clip to line rectangle, since may have a huge position which will not work with some platforms\n\t\t\t\tif (rcSegment.left < rcLine.left)\n\t\t\t\t\trcSegment.left = rcLine.left;\n\t\t\t\tif (rcSegment.right > rcLine.right)\n\t\t\t\t\trcSegment.right = rcLine.right;\n\n\t\t\t\tconst int inSelection = hideSelection ? 0 : sel.CharacterInSelection(iDoc);\n\t\t\t\tconst bool inHotspot = (ll->hsStart != -1) && (iDoc >= ll->hsStart) && (iDoc < ll->hsEnd);\n\t\t\t\tColourDesired textBack = TextBackground(vsDraw, overrideBackground, background, inSelection,\n\t\t\t\t\tinHotspot, ll->styles[i], i, ll);\n\t\t\t\tif (ts.representation) {\n\t\t\t\t\tif (ll->chars[i] == '\\t') {\n\t\t\t\t\t\t// Tab display\n\t\t\t\t\t\tif (drawWhitespaceBackground &&\n\t\t\t\t\t\t\t\t(!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways))\n\t\t\t\t\t\t\ttextBack = vsDraw.whitespaceColours.back;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Blob display\n\t\t\t\t\t\tinIndentation = false;\n\t\t\t\t\t}\n\t\t\t\t\tsurface->FillRectangle(rcSegment, textBack);\n\t\t\t\t} else {\n\t\t\t\t\t// Normal text display\n\t\t\t\t\tsurface->FillRectangle(rcSegment, textBack);\n\t\t\t\t\tif (vsDraw.viewWhitespace != wsInvisible ||\n\t\t\t\t\t\t\t(inIndentation && vsDraw.viewIndentationGuides == ivReal)) {\n\t\t\t\t\t\tfor (int cpos = 0; cpos <= i - ts.start; cpos++) {\n\t\t\t\t\t\t\tif (ll->chars[cpos + ts.start] == ' ') {\n\t\t\t\t\t\t\t\tif (drawWhitespaceBackground &&\n\t\t\t\t\t\t\t\t\t\t(!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways)) {\n\t\t\t\t\t\t\t\t\tPRectangle rcSpace(ll->positions[cpos + ts.start] + xStart - subLineStart,\n\t\t\t\t\t\t\t\t\t\trcSegment.top,\n\t\t\t\t\t\t\t\t\t\tll->positions[cpos + ts.start + 1] + xStart - subLineStart,\n\t\t\t\t\t\t\t\t\t\trcSegment.bottom);\n\t\t\t\t\t\t\t\t\tsurface->FillRectangle(rcSpace, vsDraw.whitespaceColours.back);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tinIndentation = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (rcSegment.left > rcLine.right) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tDrawEOL(surface, vsDraw, rcLine, ll, line, lineEnd,\n\t\t        xStart, subLine, subLineStart, overrideBackground, background,\n\t\t        drawWrapMarkEnd, wrapColour);\n\t}\n\n\tDrawIndicators(surface, vsDraw, line, xStart, rcLine, ll, subLine, lineEnd, true);\n\n\tif (vsDraw.edgeState == EDGE_LINE) {\n\t\tint edgeX = vsDraw.theEdge * vsDraw.spaceWidth;\n\t\trcSegment.left = edgeX + xStart;\n\t\tif ((ll->wrapIndent != 0) && (lineStart != 0))\n\t\t\trcSegment.left -= ll->wrapIndent;\n\t\trcSegment.right = rcSegment.left + 1;\n\t\tsurface->FillRectangle(rcSegment, vsDraw.edgecolour);\n\t}\n\n\t// Draw underline mark as part of background if not transparent\n\tint marks = pdoc->GetMark(line);\n\tint markBit;\n\tfor (markBit = 0; (markBit < 32) && marks; markBit++) {\n\t\tif ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_UNDERLINE) &&\n\t\t    (vsDraw.markers[markBit].alpha == SC_ALPHA_NOALPHA)) {\n\t\t\tPRectangle rcUnderline = rcLine;\n\t\t\trcUnderline.top = rcUnderline.bottom - 2;\n\t\t\tsurface->FillRectangle(rcUnderline, vsDraw.markers[markBit].back);\n\t\t}\n\t\tmarks >>= 1;\n\t}\n\n\tinIndentation = subLine == 0;\t// Do not handle indentation except on first subline.\n\t// Foreground drawing loop\n\tBreakFinder bfFore(ll, lineStart, lineEnd, posLineStart, xStartVisible,\n\t\t((!twoPhaseDraw && selBackDrawn) || vsDraw.selColours.fore.isSet), pdoc, &reprs);\n\n\twhile (bfFore.More()) {\n\n\t\tconst TextSegment ts = bfFore.Next();\n\t\tconst int i = ts.end() - 1;\n\t\tconst int iDoc = i + posLineStart;\n\n\t\trcSegment.left = ll->positions[ts.start] + xStart - subLineStart;\n\t\trcSegment.right = ll->positions[ts.end()] + xStart - subLineStart;\n\t\t// Only try to draw if really visible - enhances performance by not calling environment to\n\t\t// draw strings that are completely past the right side of the window.\n\t\tif (rcSegment.Intersects(rcLine)) {\n\t\t\tint styleMain = ll->styles[i];\n\t\t\tColourDesired textFore = vsDraw.styles[styleMain].fore;\n\t\t\tFont &textFont = vsDraw.styles[styleMain].font;\n\t\t\t//hotspot foreground\n\t\t\tif (ll->hsStart != -1 && iDoc >= ll->hsStart && iDoc < hsEnd) {\n\t\t\t\tif (vsDraw.hotspotColours.fore.isSet)\n\t\t\t\t\ttextFore = vsDraw.hotspotColours.fore;\n\t\t\t}\n\t\t\tconst int inSelection = hideSelection ? 0 : sel.CharacterInSelection(iDoc);\n\t\t\tif (inSelection && (vsDraw.selColours.fore.isSet)) {\n\t\t\t\ttextFore = (inSelection == 1) ? vsDraw.selColours.fore : vsDraw.selAdditionalForeground;\n\t\t\t}\n\t\t\tconst bool inHotspot = (ll->hsStart != -1) && (iDoc >= ll->hsStart) && (iDoc < ll->hsEnd);\n\t\t\tColourDesired textBack = TextBackground(vsDraw, overrideBackground, background, inSelection, inHotspot, styleMain, i, ll);\n\t\t\tif (ts.representation) {\n\t\t\t\tif (ll->chars[i] == '\\t') {\n\t\t\t\t\t// Tab display\n\t\t\t\t\tif (!twoPhaseDraw) {\n\t\t\t\t\t\tif (drawWhitespaceBackground &&\n\t\t\t\t\t\t\t\t(!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways))\n\t\t\t\t\t\t\ttextBack = vsDraw.whitespaceColours.back;\n\t\t\t\t\t\tsurface->FillRectangle(rcSegment, textBack);\n\t\t\t\t\t}\n\t\t\t\t\tif (inIndentation && vsDraw.viewIndentationGuides == ivReal) {\n\t\t\t\t\t\tfor (int indentCount = (ll->positions[i] + epsilon) / indentWidth;\n\t\t\t\t\t\t\tindentCount <= (ll->positions[i + 1] - epsilon) / indentWidth;\n\t\t\t\t\t\t\tindentCount++) {\n\t\t\t\t\t\t\tif (indentCount > 0) {\n\t\t\t\t\t\t\t\tint xIndent = indentCount * indentWidth;\n\t\t\t\t\t\t\t\tDrawIndentGuide(surface, lineVisible, vsDraw.lineHeight, xIndent + xStart, rcSegment,\n\t\t\t\t\t\t\t\t\t\t(ll->xHighlightGuide == xIndent));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (vsDraw.viewWhitespace != wsInvisible) {\n\t\t\t\t\t\tif (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways) {\n\t\t\t\t\t\t\tif (vsDraw.whitespaceColours.fore.isSet)\n\t\t\t\t\t\t\t\ttextFore = vsDraw.whitespaceColours.fore;\n\t\t\t\t\t\t\tsurface->PenColour(textFore);\n\t\t\t\t\t\t\tPRectangle rcTab(rcSegment.left + 1, rcSegment.top + 4,\n\t\t\t\t\t\t\t\t\trcSegment.right - 1, rcSegment.bottom - vsDraw.maxDescent);\n\t\t\t\t\t\t\tDrawTabArrow(surface, rcTab, rcSegment.top + vsDraw.lineHeight / 2);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tinIndentation = false;\n\t\t\t\t\tif (vsDraw.controlCharSymbol >= 32) {\n\t\t\t\t\t\tchar cc[2] = { static_cast<char>(vsDraw.controlCharSymbol), '\\0' };\n\t\t\t\t\t\tsurface->DrawTextNoClip(rcSegment, ctrlCharsFont,\n\t\t\t\t\t\t\t\trcSegment.top + vsDraw.maxAscent,\n\t\t\t\t\t\t\t\tcc, 1, textBack, textFore);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tDrawTextBlob(surface, vsDraw, rcSegment, ts.representation->stringRep.c_str(), textBack, textFore, twoPhaseDraw);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Normal text display\n\t\t\t\tif (vsDraw.styles[styleMain].visible) {\n\t\t\t\t\tif (twoPhaseDraw) {\n\t\t\t\t\t\tsurface->DrawTextTransparent(rcSegment, textFont,\n\t\t\t\t\t\t        rcSegment.top + vsDraw.maxAscent, ll->chars + ts.start,\n\t\t\t\t\t\t        i - ts.start + 1, textFore);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsurface->DrawTextNoClip(rcSegment, textFont,\n\t\t\t\t\t\t        rcSegment.top + vsDraw.maxAscent, ll->chars + ts.start,\n\t\t\t\t\t\t        i - ts.start + 1, textFore, textBack);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (vsDraw.viewWhitespace != wsInvisible ||\n\t\t\t\t        (inIndentation && vsDraw.viewIndentationGuides != ivNone)) {\n\t\t\t\t\tfor (int cpos = 0; cpos <= i - ts.start; cpos++) {\n\t\t\t\t\t\tif (ll->chars[cpos + ts.start] == ' ') {\n\t\t\t\t\t\t\tif (vsDraw.viewWhitespace != wsInvisible) {\n\t\t\t\t\t\t\t\tif (vsDraw.whitespaceColours.fore.isSet)\n\t\t\t\t\t\t\t\t\ttextFore = vsDraw.whitespaceColours.fore;\n\t\t\t\t\t\t\t\tif (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways) {\n\t\t\t\t\t\t\t\t\tXYPOSITION xmid = (ll->positions[cpos + ts.start] + ll->positions[cpos + ts.start + 1]) / 2;\n\t\t\t\t\t\t\t\t\tif (!twoPhaseDraw && drawWhitespaceBackground &&\n\t\t\t\t\t\t\t\t\t        (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways)) {\n\t\t\t\t\t\t\t\t\t\ttextBack = vsDraw.whitespaceColours.back;\n\t\t\t\t\t\t\t\t\t\tPRectangle rcSpace(ll->positions[cpos + ts.start] + xStart - subLineStart,\n\t\t\t\t\t\t\t\t\t\t\trcSegment.top,\n\t\t\t\t\t\t\t\t\t\t\tll->positions[cpos + ts.start + 1] + xStart - subLineStart,\n\t\t\t\t\t\t\t\t\t\t\trcSegment.bottom);\n\t\t\t\t\t\t\t\t\t\tsurface->FillRectangle(rcSpace, textBack);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tPRectangle rcDot(xmid + xStart - subLineStart, rcSegment.top + vsDraw.lineHeight / 2, 0, 0);\n\t\t\t\t\t\t\t\t\trcDot.right = rcDot.left + vs.whitespaceSize;\n\t\t\t\t\t\t\t\t\trcDot.bottom = rcDot.top + vs.whitespaceSize;\n\t\t\t\t\t\t\t\t\tsurface->FillRectangle(rcDot, textFore);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (inIndentation && vsDraw.viewIndentationGuides == ivReal) {\n\t\t\t\t\t\t\t\tfor (int indentCount = (ll->positions[cpos + ts.start] + epsilon) / indentWidth;\n\t\t\t\t\t\t\t\t\tindentCount <= (ll->positions[cpos + ts.start + 1] - epsilon) / indentWidth;\n\t\t\t\t\t\t\t\t\tindentCount++) {\n\t\t\t\t\t\t\t\t\tif (indentCount > 0) {\n\t\t\t\t\t\t\t\t\t\tint xIndent = indentCount * indentWidth;\n\t\t\t\t\t\t\t\t\t\tDrawIndentGuide(surface, lineVisible, vsDraw.lineHeight, xIndent + xStart, rcSegment,\n\t\t\t\t\t\t\t\t\t\t\t\t(ll->xHighlightGuide == xIndent));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinIndentation = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ll->hsStart != -1 && vsDraw.hotspotUnderline && iDoc >= ll->hsStart && iDoc < ll->hsEnd) {\n\t\t\t\tPRectangle rcUL = rcSegment;\n\t\t\t\trcUL.top = rcUL.top + vsDraw.maxAscent + 1;\n\t\t\t\trcUL.bottom = rcUL.top + 1;\n\t\t\t\tif (vsDraw.hotspotColours.fore.isSet)\n\t\t\t\t\tsurface->FillRectangle(rcUL, vsDraw.hotspotColours.fore);\n\t\t\t\telse\n\t\t\t\t\tsurface->FillRectangle(rcUL, textFore);\n\t\t\t} else if (vsDraw.styles[styleMain].underline) {\n\t\t\t\tPRectangle rcUL = rcSegment;\n\t\t\t\trcUL.top = rcUL.top + vsDraw.maxAscent + 1;\n\t\t\t\trcUL.bottom = rcUL.top + 1;\n\t\t\t\tsurface->FillRectangle(rcUL, textFore);\n\t\t\t}\n\t\t} else if (rcSegment.left > rcLine.right) {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif ((vsDraw.viewIndentationGuides == ivLookForward || vsDraw.viewIndentationGuides == ivLookBoth)\n\t        && (subLine == 0)) {\n\t\tint indentSpace = pdoc->GetLineIndentation(line);\n\t\tint xStartText = ll->positions[pdoc->GetLineIndentPosition(line) - posLineStart];\n\n\t\t// Find the most recent line with some text\n\n\t\tint lineLastWithText = line;\n\t\twhile (lineLastWithText > Platform::Maximum(line-20, 0) && pdoc->IsWhiteLine(lineLastWithText)) {\n\t\t\tlineLastWithText--;\n\t\t}\n\t\tif (lineLastWithText < line) {\n\t\t\txStartText = 100000;\t// Don't limit to visible indentation on empty line\n\t\t\t// This line is empty, so use indentation of last line with text\n\t\t\tint indentLastWithText = pdoc->GetLineIndentation(lineLastWithText);\n\t\t\tint isFoldHeader = pdoc->GetLevel(lineLastWithText) & SC_FOLDLEVELHEADERFLAG;\n\t\t\tif (isFoldHeader) {\n\t\t\t\t// Level is one more level than parent\n\t\t\t\tindentLastWithText += pdoc->IndentSize();\n\t\t\t}\n\t\t\tif (vsDraw.viewIndentationGuides == ivLookForward) {\n\t\t\t\t// In viLookForward mode, previous line only used if it is a fold header\n\t\t\t\tif (isFoldHeader) {\n\t\t\t\t\tindentSpace = Platform::Maximum(indentSpace, indentLastWithText);\n\t\t\t\t}\n\t\t\t} else {\t// viLookBoth\n\t\t\t\tindentSpace = Platform::Maximum(indentSpace, indentLastWithText);\n\t\t\t}\n\t\t}\n\n\t\tint lineNextWithText = line;\n\t\twhile (lineNextWithText < Platform::Minimum(line+20, pdoc->LinesTotal()) && pdoc->IsWhiteLine(lineNextWithText)) {\n\t\t\tlineNextWithText++;\n\t\t}\n\t\tif (lineNextWithText > line) {\n\t\t\txStartText = 100000;\t// Don't limit to visible indentation on empty line\n\t\t\t// This line is empty, so use indentation of first next line with text\n\t\t\tindentSpace = Platform::Maximum(indentSpace,\n\t\t\t        pdoc->GetLineIndentation(lineNextWithText));\n\t\t}\n\n\t\tfor (int indentPos = pdoc->IndentSize(); indentPos < indentSpace; indentPos += pdoc->IndentSize()) {\n\t\t\tint xIndent = indentPos * vsDraw.spaceWidth;\n\t\t\tif (xIndent < xStartText) {\n\t\t\t\tDrawIndentGuide(surface, lineVisible, vsDraw.lineHeight, xIndent + xStart, rcSegment,\n\t\t\t\t\t(ll->xHighlightGuide == xIndent));\n\t\t\t}\n\t\t}\n\t}\n\n\tDrawIndicators(surface, vsDraw, line, xStart, rcLine, ll, subLine, lineEnd, false);\n\n\t// End of the drawing of the current line\n\tif (!twoPhaseDraw) {\n\t\tDrawEOL(surface, vsDraw, rcLine, ll, line, lineEnd,\n\t\t        xStart, subLine, subLineStart, overrideBackground, background,\n\t\t        drawWrapMarkEnd, wrapColour);\n\t}\n\tif (!hideSelection && ((vsDraw.selAlpha != SC_ALPHA_NOALPHA) || (vsDraw.selAdditionalAlpha != SC_ALPHA_NOALPHA))) {\n\t\t// For each selection draw\n\t\tint virtualSpaces = 0;\n\t\tif (subLine == (ll->lines - 1)) {\n\t\t\tvirtualSpaces = sel.VirtualSpaceFor(pdoc->LineEnd(line));\n\t\t}\n\t\tSelectionPosition posStart(posLineStart + lineStart);\n\t\tSelectionPosition posEnd(posLineStart + lineEnd, virtualSpaces);\n\t\tSelectionSegment virtualSpaceRange(posStart, posEnd);\n\t\tfor (size_t r=0; r<sel.Count(); r++) {\n\t\t\tint alpha = (r == sel.Main()) ? vsDraw.selAlpha : vsDraw.selAdditionalAlpha;\n\t\t\tif (alpha != SC_ALPHA_NOALPHA) {\n\t\t\t\tSelectionSegment portion = sel.Range(r).Intersect(virtualSpaceRange);\n\t\t\t\tif (!portion.Empty()) {\n\t\t\t\t\tconst XYPOSITION spaceWidth = vsDraw.styles[ll->EndLineStyle()].spaceWidth;\n\t\t\t\t\trcSegment.left = xStart + ll->positions[portion.start.Position() - posLineStart] - subLineStart + portion.start.VirtualSpace() * spaceWidth;\n\t\t\t\t\trcSegment.right = xStart + ll->positions[portion.end.Position() - posLineStart] - subLineStart + portion.end.VirtualSpace() * spaceWidth;\n\t\t\t\t\tif ((ll->wrapIndent != 0) && (lineStart != 0)) {\n\t\t\t\t\t\tif ((portion.start.Position() - posLineStart) == lineStart && sel.Range(r).ContainsCharacter(portion.start.Position() - 1))\n\t\t\t\t\t\t\trcSegment.left -= static_cast<int>(ll->wrapIndent); // indentation added to xStart was truncated to int, so we do the same here\n\t\t\t\t\t}\n\t\t\t\t\trcSegment.left = (rcSegment.left > rcLine.left) ? rcSegment.left : rcLine.left;\n\t\t\t\t\trcSegment.right = (rcSegment.right < rcLine.right) ? rcSegment.right : rcLine.right;\n\t\t\t\t\tif (rcSegment.right > rcLine.left)\n\t\t\t\t\t\tSimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw, r == sel.Main()), alpha);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Draw any translucent whole line states\n\trcSegment = rcLine;\n\tif ((caret.active || vsDraw.alwaysShowCaretLineBackground) && vsDraw.showCaretLineBackground && ll->containsCaret) {\n\t\tSimpleAlphaRectangle(surface, rcSegment, vsDraw.caretLineBackground, vsDraw.caretLineAlpha);\n\t}\n\tmarks = pdoc->GetMark(line);\n\tfor (markBit = 0; (markBit < 32) && marks; markBit++) {\n\t\tif ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND)) {\n\t\t\tSimpleAlphaRectangle(surface, rcSegment, vsDraw.markers[markBit].back, vsDraw.markers[markBit].alpha);\n\t\t} else if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_UNDERLINE)) {\n\t\t\tPRectangle rcUnderline = rcSegment;\n\t\t\trcUnderline.top = rcUnderline.bottom - 2;\n\t\t\tSimpleAlphaRectangle(surface, rcUnderline, vsDraw.markers[markBit].back, vsDraw.markers[markBit].alpha);\n\t\t}\n\t\tmarks >>= 1;\n\t}\n\tif (vsDraw.maskInLine) {\n\t\tint marksMasked = pdoc->GetMark(line) & vsDraw.maskInLine;\n\t\tif (marksMasked) {\n\t\t\tfor (markBit = 0; (markBit < 32) && marksMasked; markBit++) {\n\t\t\t\tif ((marksMasked & 1) && (vsDraw.markers[markBit].markType != SC_MARK_EMPTY)) {\n\t\t\t\t\tSimpleAlphaRectangle(surface, rcSegment, vsDraw.markers[markBit].back, vsDraw.markers[markBit].alpha);\n\t\t\t\t}\n\t\t\t\tmarksMasked >>= 1;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid Editor::DrawBlockCaret(Surface *surface, ViewStyle &vsDraw, LineLayout *ll, int subLine,\n\t\t\t\t\t\t\tint xStart, int offset, int posCaret, PRectangle rcCaret, ColourDesired caretColour) {\n\n\tint lineStart = ll->LineStart(subLine);\n\tint posBefore = posCaret;\n\tint posAfter = MovePositionOutsideChar(posCaret + 1, 1);\n\tint numCharsToDraw = posAfter - posCaret;\n\n\t// Work out where the starting and ending offsets are. We need to\n\t// see if the previous character shares horizontal space, such as a\n\t// glyph / combining character. If so we'll need to draw that too.\n\tint offsetFirstChar = offset;\n\tint offsetLastChar = offset + (posAfter - posCaret);\n\twhile ((posBefore > 0) && ((offsetLastChar - numCharsToDraw) >= lineStart)) {\n\t\tif ((ll->positions[offsetLastChar] - ll->positions[offsetLastChar - numCharsToDraw]) > 0) {\n\t\t\t// The char does not share horizontal space\n\t\t\tbreak;\n\t\t}\n\t\t// Char shares horizontal space, update the numChars to draw\n\t\t// Update posBefore to point to the prev char\n\t\tposBefore = MovePositionOutsideChar(posBefore - 1, -1);\n\t\tnumCharsToDraw = posAfter - posBefore;\n\t\toffsetFirstChar = offset - (posCaret - posBefore);\n\t}\n\n\t// See if the next character shares horizontal space, if so we'll\n\t// need to draw that too.\n\tif (offsetFirstChar < 0)\n\t\toffsetFirstChar = 0;\n\tnumCharsToDraw = offsetLastChar - offsetFirstChar;\n\twhile ((offsetLastChar < ll->LineStart(subLine + 1)) && (offsetLastChar <= ll->numCharsInLine)) {\n\t\t// Update posAfter to point to the 2nd next char, this is where\n\t\t// the next character ends, and 2nd next begins. We'll need\n\t\t// to compare these two\n\t\tposBefore = posAfter;\n\t\tposAfter = MovePositionOutsideChar(posAfter + 1, 1);\n\t\toffsetLastChar = offset + (posAfter - posCaret);\n\t\tif ((ll->positions[offsetLastChar] - ll->positions[offsetLastChar - (posAfter - posBefore)]) > 0) {\n\t\t\t// The char does not share horizontal space\n\t\t\tbreak;\n\t\t}\n\t\t// Char shares horizontal space, update the numChars to draw\n\t\tnumCharsToDraw = offsetLastChar - offsetFirstChar;\n\t}\n\n\t// We now know what to draw, update the caret drawing rectangle\n\trcCaret.left = ll->positions[offsetFirstChar] - ll->positions[lineStart] + xStart;\n\trcCaret.right = ll->positions[offsetFirstChar+numCharsToDraw] - ll->positions[lineStart] + xStart;\n\n\t// Adjust caret position to take into account any word wrapping symbols.\n\tif ((ll->wrapIndent != 0) && (lineStart != 0)) {\n\t\tXYPOSITION wordWrapCharWidth = ll->wrapIndent;\n\t\trcCaret.left += wordWrapCharWidth;\n\t\trcCaret.right += wordWrapCharWidth;\n\t}\n\n\t// This character is where the caret block is, we override the colours\n\t// (inversed) for drawing the caret here.\n\tint styleMain = ll->styles[offsetFirstChar];\n\tsurface->DrawTextClipped(rcCaret, vsDraw.styles[styleMain].font,\n\t        rcCaret.top + vsDraw.maxAscent, ll->chars + offsetFirstChar,\n\t        numCharsToDraw, vsDraw.styles[styleMain].back,\n\t        caretColour);\n}\n\nvoid Editor::RefreshPixMaps(Surface *surfaceWindow) {\n\tif (!pixmapSelPattern->Initialised()) {\n\t\tconst int patternSize = 8;\n\t\tpixmapSelPattern->InitPixMap(patternSize, patternSize, surfaceWindow, wMain.GetID());\n\t\tpixmapSelPatternOffset1->InitPixMap(patternSize, patternSize, surfaceWindow, wMain.GetID());\n\t\t// This complex procedure is to reproduce the checkerboard dithered pattern used by windows\n\t\t// for scroll bars and Visual Studio for its selection margin. The colour of this pattern is half\n\t\t// way between the chrome colour and the chrome highlight colour making a nice transition\n\t\t// between the window chrome and the content area. And it works in low colour depths.\n\t\tPRectangle rcPattern(0, 0, patternSize, patternSize);\n\n\t\t// Initialize default colours based on the chrome colour scheme.  Typically the highlight is white.\n\t\tColourDesired colourFMFill = vs.selbar;\n\t\tColourDesired colourFMStripes = vs.selbarlight;\n\n\t\tif (!(vs.selbarlight == ColourDesired(0xff, 0xff, 0xff))) {\n\t\t\t// User has chosen an unusual chrome colour scheme so just use the highlight edge colour.\n\t\t\t// (Typically, the highlight colour is white.)\n\t\t\tcolourFMFill = vs.selbarlight;\n\t\t}\n\n\t\tif (vs.foldmarginColour.isSet) {\n\t\t\t// override default fold margin colour\n\t\t\tcolourFMFill = vs.foldmarginColour;\n\t\t}\n\t\tif (vs.foldmarginHighlightColour.isSet) {\n\t\t\t// override default fold margin highlight colour\n\t\t\tcolourFMStripes = vs.foldmarginHighlightColour;\n\t\t}\n\n\t\tpixmapSelPattern->FillRectangle(rcPattern, colourFMFill);\n\t\tpixmapSelPatternOffset1->FillRectangle(rcPattern, colourFMStripes);\n\t\tfor (int y = 0; y < patternSize; y++) {\n\t\t\tfor (int x = y % 2; x < patternSize; x+=2) {\n\t\t\t\tPRectangle rcPixel(x, y, x+1, y+1);\n\t\t\t\tpixmapSelPattern->FillRectangle(rcPixel, colourFMStripes);\n\t\t\t\tpixmapSelPatternOffset1->FillRectangle(rcPixel, colourFMFill);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!pixmapIndentGuide->Initialised()) {\n\t\t// 1 extra pixel in height so can handle odd/even positions and so produce a continuous line\n\t\tpixmapIndentGuide->InitPixMap(1, vs.lineHeight + 1, surfaceWindow, wMain.GetID());\n\t\tpixmapIndentGuideHighlight->InitPixMap(1, vs.lineHeight + 1, surfaceWindow, wMain.GetID());\n\t\tPRectangle rcIG(0, 0, 1, vs.lineHeight);\n\t\tpixmapIndentGuide->FillRectangle(rcIG, vs.styles[STYLE_INDENTGUIDE].back);\n\t\tpixmapIndentGuide->PenColour(vs.styles[STYLE_INDENTGUIDE].fore);\n\t\tpixmapIndentGuideHighlight->FillRectangle(rcIG, vs.styles[STYLE_BRACELIGHT].back);\n\t\tpixmapIndentGuideHighlight->PenColour(vs.styles[STYLE_BRACELIGHT].fore);\n\t\tfor (int stripe = 1; stripe < vs.lineHeight + 1; stripe += 2) {\n\t\t\tPRectangle rcPixel(0, stripe, 1, stripe+1);\n\t\t\tpixmapIndentGuide->FillRectangle(rcPixel, vs.styles[STYLE_INDENTGUIDE].fore);\n\t\t\tpixmapIndentGuideHighlight->FillRectangle(rcPixel, vs.styles[STYLE_BRACELIGHT].fore);\n\t\t}\n\t}\n\n\tif (bufferedDraw) {\n\t\tif (!pixmapLine->Initialised()) {\n\t\t\tPRectangle rcClient = GetClientRectangle();\n\t\t\tpixmapLine->InitPixMap(rcClient.Width(), vs.lineHeight,\n\t\t\t        surfaceWindow, wMain.GetID());\n\t\t\tpixmapSelMargin->InitPixMap(vs.fixedColumnWidth,\n\t\t\t        rcClient.Height(), surfaceWindow, wMain.GetID());\n\t\t}\n\t}\n}\n\nvoid Editor::DrawCarets(Surface *surface, ViewStyle &vsDraw, int lineDoc, int xStart,\n        PRectangle rcLine, LineLayout *ll, int subLine) {\n\t// When drag is active it is the only caret drawn\n\tbool drawDrag = posDrag.IsValid();\n\tif (hideSelection && !drawDrag)\n\t\treturn;\n\tconst int posLineStart = pdoc->LineStart(lineDoc);\n\t// For each selection draw\n\tfor (size_t r=0; (r<sel.Count()) || drawDrag; r++) {\n\t\tconst bool mainCaret = r == sel.Main();\n\t\tconst SelectionPosition posCaret = (drawDrag ? posDrag : sel.Range(r).caret);\n\t\tconst int offset = posCaret.Position() - posLineStart;\n\t\tconst XYPOSITION spaceWidth = vsDraw.styles[ll->EndLineStyle()].spaceWidth;\n\t\tconst XYPOSITION virtualOffset = posCaret.VirtualSpace() * spaceWidth;\n\t\tif (ll->InLine(offset, subLine) && offset <= ll->numCharsBeforeEOL) {\n\t\t\tXYPOSITION xposCaret = ll->positions[offset] + virtualOffset - ll->positions[ll->LineStart(subLine)];\n\t\t\tif (ll->wrapIndent != 0) {\n\t\t\t\tint lineStart = ll->LineStart(subLine);\n\t\t\t\tif (lineStart != 0)\t// Wrapped\n\t\t\t\t\txposCaret += ll->wrapIndent;\n\t\t\t}\n\t\t\tbool caretBlinkState = (caret.active && caret.on) || (!additionalCaretsBlink && !mainCaret);\n\t\t\tbool caretVisibleState = additionalCaretsVisible || mainCaret;\n\t\t\tif ((xposCaret >= 0) && (vsDraw.caretWidth > 0) && (vsDraw.caretStyle != CARETSTYLE_INVISIBLE) &&\n\t\t\t        ((posDrag.IsValid()) || (caretBlinkState && caretVisibleState))) {\n\t\t\t\tbool caretAtEOF = false;\n\t\t\t\tbool caretAtEOL = false;\n\t\t\t\tbool drawBlockCaret = false;\n\t\t\t\tXYPOSITION widthOverstrikeCaret;\n\t\t\t\tint caretWidthOffset = 0;\n\t\t\t\tPRectangle rcCaret = rcLine;\n\n\t\t\t\tif (posCaret.Position() == pdoc->Length())\t{   // At end of document\n\t\t\t\t\tcaretAtEOF = true;\n\t\t\t\t\twidthOverstrikeCaret = vsDraw.aveCharWidth;\n\t\t\t\t} else if ((posCaret.Position() - posLineStart) >= ll->numCharsInLine) {\t// At end of line\n\t\t\t\t\tcaretAtEOL = true;\n\t\t\t\t\twidthOverstrikeCaret = vsDraw.aveCharWidth;\n\t\t\t\t} else {\n\t\t\t\t\twidthOverstrikeCaret = ll->positions[offset + 1] - ll->positions[offset];\n\t\t\t\t}\n\t\t\t\tif (widthOverstrikeCaret < 3)\t// Make sure its visible\n\t\t\t\t\twidthOverstrikeCaret = 3;\n\n\t\t\t\tif (xposCaret > 0)\n\t\t\t\t\tcaretWidthOffset = 1;\t// Move back so overlaps both character cells.\n\t\t\t\txposCaret += xStart;\n\t\t\t\tif (posDrag.IsValid()) {\n\t\t\t\t\t/* Dragging text, use a line caret */\n\t\t\t\t\trcCaret.left = xposCaret - caretWidthOffset;\n\t\t\t\t\trcCaret.right = rcCaret.left + vsDraw.caretWidth;\n\t\t\t\t} else if (inOverstrike && drawOverstrikeCaret) {\n\t\t\t\t\t/* Overstrike (insert mode), use a modified bar caret */\n\t\t\t\t\trcCaret.top = rcCaret.bottom - 2;\n\t\t\t\t\trcCaret.left = xposCaret + 1;\n\t\t\t\t\trcCaret.right = rcCaret.left + widthOverstrikeCaret - 1;\n\t\t\t\t} else if (vsDraw.caretStyle == CARETSTYLE_BLOCK) {\n\t\t\t\t\t/* Block caret */\n\t\t\t\t\trcCaret.left = xposCaret;\n\t\t\t\t\tif (!caretAtEOL && !caretAtEOF && (ll->chars[offset] != '\\t') && !(IsControlCharacter(ll->chars[offset]))) {\n\t\t\t\t\t\tdrawBlockCaret = true;\n\t\t\t\t\t\trcCaret.right = xposCaret + widthOverstrikeCaret;\n\t\t\t\t\t} else {\n\t\t\t\t\t\trcCaret.right = xposCaret + vsDraw.aveCharWidth;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t/* Line caret */\n\t\t\t\t\trcCaret.left = xposCaret - caretWidthOffset;\n\t\t\t\t\trcCaret.right = rcCaret.left + vsDraw.caretWidth;\n\t\t\t\t}\n\t\t\t\tColourDesired caretColour = mainCaret ? vsDraw.caretcolour : vsDraw.additionalCaretColour;\n\t\t\t\tif (drawBlockCaret) {\n\t\t\t\t\tDrawBlockCaret(surface, vsDraw, ll, subLine, xStart, offset, posCaret.Position(), rcCaret, caretColour);\n\t\t\t\t} else {\n\t\t\t\t\tsurface->FillRectangle(rcCaret, caretColour);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (drawDrag)\n\t\t\tbreak;\n\t}\n}\n\nvoid Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {\n\t//Platform::DebugPrintf(\"Paint:%1d (%3d,%3d) ... (%3d,%3d)\\n\",\n\t//\tpaintingAllText, rcArea.left, rcArea.top, rcArea.right, rcArea.bottom);\n\tAllocateGraphics();\n\n\tRefreshStyleData();\n\tif (paintState == paintAbandoned)\n\t\treturn;\t// Scroll bars may have changed so need redraw\n\tRefreshPixMaps(surfaceWindow);\n\n\tpaintAbandonedByStyling = false;\n\n\tStyleToPositionInView(PositionAfterArea(rcArea));\n\n\tPRectangle rcClient = GetClientRectangle();\n\tPoint ptOrigin = GetVisibleOriginInMain();\n\t//Platform::DebugPrintf(\"Client: (%3d,%3d) ... (%3d,%3d)   %d\\n\",\n\t//\trcClient.left, rcClient.top, rcClient.right, rcClient.bottom);\n\n\tint screenLinePaintFirst = rcArea.top / vs.lineHeight;\n\n\tint xStart = vs.textStart - xOffset + ptOrigin.x;\n\tint ypos = 0;\n\tif (!bufferedDraw)\n\t\typos += screenLinePaintFirst * vs.lineHeight;\n\tint yposScreen = screenLinePaintFirst * vs.lineHeight;\n\n\tif (NotifyUpdateUI()) {\n\t\tRefreshStyleData();\n\t\tRefreshPixMaps(surfaceWindow);\n\t}\n\n\t// Wrap the visible lines if needed.\n\tif (WrapLines(wsVisible)) {\n\t\t// The wrapping process has changed the height of some lines so\n\t\t// abandon this paint for a complete repaint.\n\t\tif (AbandonPaint()) {\n\t\t\treturn;\n\t\t}\n\t\tRefreshPixMaps(surfaceWindow);\t// In case pixmaps invalidated by scrollbar change\n\t}\n\tPLATFORM_ASSERT(pixmapSelPattern->Initialised());\n\n\tif (!bufferedDraw)\n\t\tsurfaceWindow->SetClip(rcArea);\n\n\tif (paintState != paintAbandoned) {\n\t\tif (vs.marginInside) {\n\t\t\tPaintSelMargin(surfaceWindow, rcArea);\n\t\t\tPRectangle rcRightMargin = rcClient;\n\t\t\trcRightMargin.left = rcRightMargin.right - vs.rightMarginWidth;\n\t\t\tif (rcArea.Intersects(rcRightMargin)) {\n\t\t\t\tsurfaceWindow->FillRectangle(rcRightMargin, vs.styles[STYLE_DEFAULT].back);\n\t\t\t}\n\t\t} else { // Else separate view so separate paint event but leftMargin included to allow overlap\n\t\t\tPRectangle rcLeftMargin = rcArea;\n\t\t\trcLeftMargin.left = 0;\n\t\t\trcLeftMargin.right = rcLeftMargin.left + vs.leftMarginWidth;\n\t\t\tif (rcArea.Intersects(rcLeftMargin)) {\n\t\t\t\tsurfaceWindow->FillRectangle(rcLeftMargin, vs.styles[STYLE_DEFAULT].back);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (paintState == paintAbandoned) {\n\t\t// Either styling or NotifyUpdateUI noticed that painting is needed\n\t\t// outside the current painting rectangle\n\t\t//Platform::DebugPrintf(\"Abandoning paint\\n\");\n\t\tif (Wrapping()) {\n\t\t\tif (paintAbandonedByStyling) {\n\t\t\t\t// Styling has spilled over a line end, such as occurs by starting a multiline\n\t\t\t\t// comment. The width of subsequent text may have changed, so rewrap.\n\t\t\t\tNeedWrapping(cs.DocFromDisplay(topLine));\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\t//Platform::DebugPrintf(\"start display %d, offset = %d\\n\", pdoc->Length(), xOffset);\n\n\t// Allow text at start of line to overlap 1 pixel into the margin as this displays\n\t// serifs and italic stems for aliased text.\n\tconst int leftTextOverlap = ((xOffset == 0) && (vs.leftMarginWidth > 0)) ? 1 : 0;\n\n\t// Do the painting\n\tif (rcArea.right > vs.textStart - leftTextOverlap) {\n\n\t\tSurface *surface = surfaceWindow;\n\t\tif (bufferedDraw) {\n\t\t\tsurface = pixmapLine;\n\t\t\tPLATFORM_ASSERT(pixmapLine->Initialised());\n\t\t}\n\t\tsurface->SetUnicodeMode(IsUnicodeMode());\n\t\tsurface->SetDBCSMode(CodePage());\n\n\t\tint visibleLine = TopLineOfMain() + screenLinePaintFirst;\n\n\t\tSelectionPosition posCaret = sel.RangeMain().caret;\n\t\tif (posDrag.IsValid())\n\t\t\tposCaret = posDrag;\n\t\tint lineCaret = pdoc->LineFromPosition(posCaret.Position());\n\n\t\tPRectangle rcTextArea = rcClient;\n\t\tif (vs.marginInside) {\n\t\t\trcTextArea.left += vs.textStart;\n\t\t\trcTextArea.right -= vs.rightMarginWidth;\n\t\t} else {\n\t\t\trcTextArea = rcArea;\n\t\t}\n\n\t\t// Remove selection margin from drawing area so text will not be drawn\n\t\t// on it in unbuffered mode.\n\t\tif (!bufferedDraw && vs.marginInside) {\n\t\t\tPRectangle rcClipText = rcTextArea;\n\t\t\trcClipText.left -= leftTextOverlap;\n\t\t\tsurfaceWindow->SetClip(rcClipText);\n\t\t}\n\n\t\t// Loop on visible lines\n\t\t//double durLayout = 0.0;\n\t\t//double durPaint = 0.0;\n\t\t//double durCopy = 0.0;\n\t\t//ElapsedTime etWhole;\n\t\tint lineDocPrevious = -1;\t// Used to avoid laying out one document line multiple times\n\t\tAutoLineLayout ll(llc, 0);\n\t\twhile (visibleLine < cs.LinesDisplayed() && yposScreen < rcArea.bottom) {\n\n\t\t\tint lineDoc = cs.DocFromDisplay(visibleLine);\n\t\t\t// Only visible lines should be handled by the code within the loop\n\t\t\tPLATFORM_ASSERT(cs.GetVisible(lineDoc));\n\t\t\tint lineStartSet = cs.DisplayFromDoc(lineDoc);\n\t\t\tint subLine = visibleLine - lineStartSet;\n\n\t\t\t// Copy this line and its styles from the document into local arrays\n\t\t\t// and determine the x position at which each character starts.\n\t\t\t//ElapsedTime et;\n\t\t\tif (lineDoc != lineDocPrevious) {\n\t\t\t\tll.Set(0);\n\t\t\t\tll.Set(RetrieveLineLayout(lineDoc));\n\t\t\t\tLayoutLine(lineDoc, surface, vs, ll, wrapWidth);\n\t\t\t\tlineDocPrevious = lineDoc;\n\t\t\t}\n\t\t\t//durLayout += et.Duration(true);\n\n\t\t\tif (ll) {\n\t\t\t\tll->containsCaret = lineDoc == lineCaret;\n\t\t\t\tif (hideSelection) {\n\t\t\t\t\tll->containsCaret = false;\n\t\t\t\t}\n\n\t\t\t\tGetHotSpotRange(ll->hsStart, ll->hsEnd);\n\n\t\t\t\tPRectangle rcLine = rcTextArea;\n\t\t\t\trcLine.top = ypos;\n\t\t\t\trcLine.bottom = ypos + vs.lineHeight;\n\n\t\t\t\tbool bracesIgnoreStyle = false;\n\t\t\t\tif ((vs.braceHighlightIndicatorSet && (bracesMatchStyle == STYLE_BRACELIGHT)) ||\n\t\t\t\t\t(vs.braceBadLightIndicatorSet && (bracesMatchStyle == STYLE_BRACEBAD))) {\n\t\t\t\t\tbracesIgnoreStyle = true;\n\t\t\t\t}\n\t\t\t\tRange rangeLine(pdoc->LineStart(lineDoc), pdoc->LineStart(lineDoc + 1));\n\t\t\t\t// Highlight the current braces if any\n\t\t\t\tll->SetBracesHighlight(rangeLine, braces, static_cast<char>(bracesMatchStyle),\n\t\t\t\t        highlightGuideColumn * vs.spaceWidth, bracesIgnoreStyle);\n\n\t\t\t\tif (leftTextOverlap && bufferedDraw) {\n\t\t\t\t\tPRectangle rcSpacer = rcLine;\n\t\t\t\t\trcSpacer.right = rcSpacer.left;\n\t\t\t\t\trcSpacer.left -= 1;\n\t\t\t\t\tsurface->FillRectangle(rcSpacer, vs.styles[STYLE_DEFAULT].back);\n\t\t\t\t}\n\n\t\t\t\t// Draw the line\n\t\t\t\tDrawLine(surface, vs, lineDoc, visibleLine, xStart, rcLine, ll, subLine);\n\t\t\t\t//durPaint += et.Duration(true);\n\n\t\t\t\t// Restore the previous styles for the brace highlights in case layout is in cache.\n\t\t\t\tll->RestoreBracesHighlight(rangeLine, braces, bracesIgnoreStyle);\n\n\t\t\t\tbool expanded = cs.GetExpanded(lineDoc);\n\t\t\t\tconst int level = pdoc->GetLevel(lineDoc);\n\t\t\t\tconst int levelNext = pdoc->GetLevel(lineDoc + 1);\n\t\t\t\tif ((level & SC_FOLDLEVELHEADERFLAG) &&\n\t\t\t\t\t((level & SC_FOLDLEVELNUMBERMASK) < (levelNext & SC_FOLDLEVELNUMBERMASK))) {\n\t\t\t\t\t// Paint the line above the fold\n\t\t\t\t\tif ((expanded && (foldFlags & SC_FOLDFLAG_LINEBEFORE_EXPANDED))\n\t\t\t\t\t\t||\n\t\t\t\t\t\t(!expanded && (foldFlags & SC_FOLDFLAG_LINEBEFORE_CONTRACTED))) {\n\t\t\t\t\t\tPRectangle rcFoldLine = rcLine;\n\t\t\t\t\t\trcFoldLine.bottom = rcFoldLine.top + 1;\n\t\t\t\t\t\tsurface->FillRectangle(rcFoldLine, vs.styles[STYLE_DEFAULT].fore);\n\t\t\t\t\t}\n\t\t\t\t\t// Paint the line below the fold\n\t\t\t\t\tif ((expanded && (foldFlags & SC_FOLDFLAG_LINEAFTER_EXPANDED))\n\t\t\t\t\t\t||\n\t\t\t\t\t\t(!expanded && (foldFlags & SC_FOLDFLAG_LINEAFTER_CONTRACTED))) {\n\t\t\t\t\t\tPRectangle rcFoldLine = rcLine;\n\t\t\t\t\t\trcFoldLine.top = rcFoldLine.bottom - 1;\n\t\t\t\t\t\tsurface->FillRectangle(rcFoldLine, vs.styles[STYLE_DEFAULT].fore);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tDrawCarets(surface, vs, lineDoc, xStart, rcLine, ll, subLine);\n\n\t\t\t\tif (bufferedDraw) {\n\t\t\t\t\tPoint from(vs.textStart-leftTextOverlap, 0);\n\t\t\t\t\tPRectangle rcCopyArea(vs.textStart-leftTextOverlap, yposScreen,\n\t\t\t\t\t        rcClient.right - vs.rightMarginWidth, yposScreen + vs.lineHeight);\n\t\t\t\t\tsurfaceWindow->Copy(rcCopyArea, from, *pixmapLine);\n\t\t\t\t}\n\n\t\t\t\tlineWidthMaxSeen = Platform::Maximum(\n\t\t\t\t\t    lineWidthMaxSeen, ll->positions[ll->numCharsInLine]);\n\t\t\t\t//durCopy += et.Duration(true);\n\t\t\t}\n\n\t\t\tif (!bufferedDraw) {\n\t\t\t\typos += vs.lineHeight;\n\t\t\t}\n\n\t\t\typosScreen += vs.lineHeight;\n\t\t\tvisibleLine++;\n\n\t\t\t//gdk_flush();\n\t\t}\n\t\tll.Set(0);\n\t\t//if (durPaint < 0.00000001)\n\t\t//\tdurPaint = 0.00000001;\n\n\t\t// Right column limit indicator\n\t\tPRectangle rcBeyondEOF = (vs.marginInside) ? rcClient : rcArea;\n\t\trcBeyondEOF.left = vs.textStart;\n\t\trcBeyondEOF.right = rcBeyondEOF.right - ((vs.marginInside) ? vs.rightMarginWidth : 0);\n\t\trcBeyondEOF.top = (cs.LinesDisplayed() - TopLineOfMain()) * vs.lineHeight;\n\t\tif (rcBeyondEOF.top < rcBeyondEOF.bottom) {\n\t\t\tsurfaceWindow->FillRectangle(rcBeyondEOF, vs.styles[STYLE_DEFAULT].back);\n\t\t\tif (vs.edgeState == EDGE_LINE) {\n\t\t\t\tint edgeX = vs.theEdge * vs.spaceWidth;\n\t\t\t\trcBeyondEOF.left = edgeX + xStart;\n\t\t\t\trcBeyondEOF.right = rcBeyondEOF.left + 1;\n\t\t\t\tsurfaceWindow->FillRectangle(rcBeyondEOF, vs.edgecolour);\n\t\t\t}\n\t\t}\n\t\t//Platform::DebugPrintf(\n\t\t//\"Layout:%9.6g    Paint:%9.6g    Ratio:%9.6g   Copy:%9.6g   Total:%9.6g\\n\",\n\t\t//durLayout, durPaint, durLayout / durPaint, durCopy, etWhole.Duration());\n\t\tNotifyPainted();\n\t}\n}\n\n// Space (3 space characters) between line numbers and text when printing.\n#define lineNumberPrintSpace \"   \"\n\nColourDesired InvertedLight(ColourDesired orig) {\n\tunsigned int r = orig.GetRed();\n\tunsigned int g = orig.GetGreen();\n\tunsigned int b = orig.GetBlue();\n\tunsigned int l = (r + g + b) / 3; \t// There is a better calculation for this that matches human eye\n\tunsigned int il = 0xff - l;\n\tif (l == 0)\n\t\treturn ColourDesired(0xff, 0xff, 0xff);\n\tr = r * il / l;\n\tg = g * il / l;\n\tb = b * il / l;\n\treturn ColourDesired(Platform::Minimum(r, 0xff), Platform::Minimum(g, 0xff), Platform::Minimum(b, 0xff));\n}\n\n// This is mostly copied from the Paint method but with some things omitted\n// such as the margin markers, line numbers, selection and caret\n// Should be merged back into a combined Draw method.\nlong Editor::FormatRange(bool draw, Sci_RangeToFormat *pfr) {\n\tif (!pfr)\n\t\treturn 0;\n\n\tAutoSurface surface(pfr->hdc, this, SC_TECHNOLOGY_DEFAULT);\n\tif (!surface)\n\t\treturn 0;\n\tAutoSurface surfaceMeasure(pfr->hdcTarget, this, SC_TECHNOLOGY_DEFAULT);\n\tif (!surfaceMeasure) {\n\t\treturn 0;\n\t}\n\n\t// Can't use measurements cached for screen\n\tposCache.Clear();\n\n\tViewStyle vsPrint(vs);\n\tvsPrint.technology = SC_TECHNOLOGY_DEFAULT;\n\n\t// Modify the view style for printing as do not normally want any of the transient features to be printed\n\t// Printing supports only the line number margin.\n\tint lineNumberIndex = -1;\n\tfor (int margin = 0; margin <= SC_MAX_MARGIN; margin++) {\n\t\tif ((vsPrint.ms[margin].style == SC_MARGIN_NUMBER) && (vsPrint.ms[margin].width > 0)) {\n\t\t\tlineNumberIndex = margin;\n\t\t} else {\n\t\t\tvsPrint.ms[margin].width = 0;\n\t\t}\n\t}\n\tvsPrint.fixedColumnWidth = 0;\n\tvsPrint.zoomLevel = printParameters.magnification;\n\t// Don't show indentation guides\n\t// If this ever gets changed, cached pixmap would need to be recreated if technology != SC_TECHNOLOGY_DEFAULT\n\tvsPrint.viewIndentationGuides = ivNone;\n\t// Don't show the selection when printing\n\tvsPrint.selColours.back.isSet = false;\n\tvsPrint.selColours.fore.isSet = false;\n\tvsPrint.selAlpha = SC_ALPHA_NOALPHA;\n\tvsPrint.selAdditionalAlpha = SC_ALPHA_NOALPHA;\n\tvsPrint.whitespaceColours.back.isSet = false;\n\tvsPrint.whitespaceColours.fore.isSet = false;\n\tvsPrint.showCaretLineBackground = false;\n\tvsPrint.alwaysShowCaretLineBackground = false;\n\t// Don't highlight matching braces using indicators\n\tvsPrint.braceHighlightIndicatorSet = false;\n\tvsPrint.braceBadLightIndicatorSet = false;\n\n\t// Set colours for printing according to users settings\n\tfor (size_t sty = 0; sty < vsPrint.styles.size(); sty++) {\n\t\tif (printParameters.colourMode == SC_PRINT_INVERTLIGHT) {\n\t\t\tvsPrint.styles[sty].fore = InvertedLight(vsPrint.styles[sty].fore);\n\t\t\tvsPrint.styles[sty].back = InvertedLight(vsPrint.styles[sty].back);\n\t\t} else if (printParameters.colourMode == SC_PRINT_BLACKONWHITE) {\n\t\t\tvsPrint.styles[sty].fore = ColourDesired(0, 0, 0);\n\t\t\tvsPrint.styles[sty].back = ColourDesired(0xff, 0xff, 0xff);\n\t\t} else if (printParameters.colourMode == SC_PRINT_COLOURONWHITE) {\n\t\t\tvsPrint.styles[sty].back = ColourDesired(0xff, 0xff, 0xff);\n\t\t} else if (printParameters.colourMode == SC_PRINT_COLOURONWHITEDEFAULTBG) {\n\t\t\tif (sty <= STYLE_DEFAULT) {\n\t\t\t\tvsPrint.styles[sty].back = ColourDesired(0xff, 0xff, 0xff);\n\t\t\t}\n\t\t}\n\t}\n\t// White background for the line numbers\n\tvsPrint.styles[STYLE_LINENUMBER].back = ColourDesired(0xff, 0xff, 0xff);\n\n\t// Printing uses different margins, so reset screen margins\n\tvsPrint.leftMarginWidth = 0;\n\tvsPrint.rightMarginWidth = 0;\n\n\tvsPrint.Refresh(*surfaceMeasure, pdoc->tabInChars);\n\t// Determining width must hapen after fonts have been realised in Refresh\n\tint lineNumberWidth = 0;\n\tif (lineNumberIndex >= 0) {\n\t\tlineNumberWidth = surfaceMeasure->WidthText(vsPrint.styles[STYLE_LINENUMBER].font,\n\t\t        \"99999\" lineNumberPrintSpace, 5 + istrlen(lineNumberPrintSpace));\n\t\tvsPrint.ms[lineNumberIndex].width = lineNumberWidth;\n\t\tvsPrint.Refresh(*surfaceMeasure, pdoc->tabInChars);\t// Recalculate fixedColumnWidth\n\t}\n\n\tint linePrintStart = pdoc->LineFromPosition(pfr->chrg.cpMin);\n\tint linePrintLast = linePrintStart + (pfr->rc.bottom - pfr->rc.top) / vsPrint.lineHeight - 1;\n\tif (linePrintLast < linePrintStart)\n\t\tlinePrintLast = linePrintStart;\n\tint linePrintMax = pdoc->LineFromPosition(pfr->chrg.cpMax);\n\tif (linePrintLast > linePrintMax)\n\t\tlinePrintLast = linePrintMax;\n\t//Platform::DebugPrintf(\"Formatting lines=[%0d,%0d,%0d] top=%0d bottom=%0d line=%0d %0d\\n\",\n\t//      linePrintStart, linePrintLast, linePrintMax, pfr->rc.top, pfr->rc.bottom, vsPrint.lineHeight,\n\t//      surfaceMeasure->Height(vsPrint.styles[STYLE_LINENUMBER].font));\n\tint endPosPrint = pdoc->Length();\n\tif (linePrintLast < pdoc->LinesTotal())\n\t\tendPosPrint = pdoc->LineStart(linePrintLast + 1);\n\n\t// Ensure we are styled to where we are formatting.\n\tpdoc->EnsureStyledTo(endPosPrint);\n\n\tint xStart = vsPrint.fixedColumnWidth + pfr->rc.left;\n\tint ypos = pfr->rc.top;\n\n\tint lineDoc = linePrintStart;\n\n\tint nPrintPos = pfr->chrg.cpMin;\n\tint visibleLine = 0;\n\tint widthPrint = pfr->rc.right - pfr->rc.left - vsPrint.fixedColumnWidth;\n\tif (printParameters.wrapState == eWrapNone)\n\t\twidthPrint = LineLayout::wrapWidthInfinite;\n\n\twhile (lineDoc <= linePrintLast && ypos < pfr->rc.bottom) {\n\n\t\t// When printing, the hdc and hdcTarget may be the same, so\n\t\t// changing the state of surfaceMeasure may change the underlying\n\t\t// state of surface. Therefore, any cached state is discarded before\n\t\t// using each surface.\n\t\tsurfaceMeasure->FlushCachedState();\n\n\t\t// Copy this line and its styles from the document into local arrays\n\t\t// and determine the x position at which each character starts.\n\t\tLineLayout ll(pdoc->LineStart(lineDoc+1)-pdoc->LineStart(lineDoc)+1);\n\t\tLayoutLine(lineDoc, surfaceMeasure, vsPrint, &ll, widthPrint);\n\n\t\tll.containsCaret = false;\n\n\t\tPRectangle rcLine;\n\t\trcLine.left = pfr->rc.left;\n\t\trcLine.top = ypos;\n\t\trcLine.right = pfr->rc.right - 1;\n\t\trcLine.bottom = ypos + vsPrint.lineHeight;\n\n\t\t// When document line is wrapped over multiple display lines, find where\n\t\t// to start printing from to ensure a particular position is on the first\n\t\t// line of the page.\n\t\tif (visibleLine == 0) {\n\t\t\tint startWithinLine = nPrintPos - pdoc->LineStart(lineDoc);\n\t\t\tfor (int iwl = 0; iwl < ll.lines - 1; iwl++) {\n\t\t\t\tif (ll.LineStart(iwl) <= startWithinLine && ll.LineStart(iwl + 1) >= startWithinLine) {\n\t\t\t\t\tvisibleLine = -iwl;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ll.lines > 1 && startWithinLine >= ll.LineStart(ll.lines - 1)) {\n\t\t\t\tvisibleLine = -(ll.lines - 1);\n\t\t\t}\n\t\t}\n\n\t\tif (draw && lineNumberWidth &&\n\t\t        (ypos + vsPrint.lineHeight <= pfr->rc.bottom) &&\n\t\t        (visibleLine >= 0)) {\n\t\t\tchar number[100];\n\t\t\tsprintf(number, \"%d\" lineNumberPrintSpace, lineDoc + 1);\n\t\t\tPRectangle rcNumber = rcLine;\n\t\t\trcNumber.right = rcNumber.left + lineNumberWidth;\n\t\t\t// Right justify\n\t\t\trcNumber.left = rcNumber.right - surfaceMeasure->WidthText(\n\t\t\t            vsPrint.styles[STYLE_LINENUMBER].font, number, istrlen(number));\n\t\t\tsurface->FlushCachedState();\n\t\t\tsurface->DrawTextNoClip(rcNumber, vsPrint.styles[STYLE_LINENUMBER].font,\n\t\t\t        ypos + vsPrint.maxAscent, number, istrlen(number),\n\t\t\t        vsPrint.styles[STYLE_LINENUMBER].fore,\n\t\t\t        vsPrint.styles[STYLE_LINENUMBER].back);\n\t\t}\n\n\t\t// Draw the line\n\t\tsurface->FlushCachedState();\n\n\t\tfor (int iwl = 0; iwl < ll.lines; iwl++) {\n\t\t\tif (ypos + vsPrint.lineHeight <= pfr->rc.bottom) {\n\t\t\t\tif (visibleLine >= 0) {\n\t\t\t\t\tif (draw) {\n\t\t\t\t\t\trcLine.top = ypos;\n\t\t\t\t\t\trcLine.bottom = ypos + vsPrint.lineHeight;\n\t\t\t\t\t\tDrawLine(surface, vsPrint, lineDoc, visibleLine, xStart, rcLine, &ll, iwl);\n\t\t\t\t\t}\n\t\t\t\t\typos += vsPrint.lineHeight;\n\t\t\t\t}\n\t\t\t\tvisibleLine++;\n\t\t\t\tif (iwl == ll.lines - 1)\n\t\t\t\t\tnPrintPos = pdoc->LineStart(lineDoc + 1);\n\t\t\t\telse\n\t\t\t\t\tnPrintPos += ll.LineStart(iwl + 1) - ll.LineStart(iwl);\n\t\t\t}\n\t\t}\n\n\t\t++lineDoc;\n\t}\n\n\t// Clear cache so measurements are not used for screen\n\tposCache.Clear();\n\n\treturn nPrintPos;\n}\n\nint Editor::TextWidth(int style, const char *text) {\n\tRefreshStyleData();\n\tAutoSurface surface(this);\n\tif (surface) {\n\t\treturn surface->WidthText(vs.styles[style].font, text, istrlen(text));\n\t} else {\n\t\treturn 1;\n\t}\n}\n\n// Empty method is overridden on GTK+ to show / hide scrollbars\nvoid Editor::ReconfigureScrollBars() {}\n\nvoid Editor::SetScrollBars() {\n\tRefreshStyleData();\n\n\tint nMax = MaxScrollPos();\n\tint nPage = LinesOnScreen();\n\tbool modified = ModifyScrollBars(nMax + nPage - 1, nPage);\n\tif (modified) {\n\t\tDwellEnd(true);\n\t}\n\n\t// TODO: ensure always showing as many lines as possible\n\t// May not be, if, for example, window made larger\n\tif (topLine > MaxScrollPos()) {\n\t\tSetTopLine(Platform::Clamp(topLine, 0, MaxScrollPos()));\n\t\tSetVerticalScrollPos();\n\t\tRedraw();\n\t}\n\tif (modified) {\n\t\tif (!AbandonPaint())\n\t\t\tRedraw();\n\t}\n\t//Platform::DebugPrintf(\"end max = %d page = %d\\n\", nMax, nPage);\n}\n\nvoid Editor::ChangeSize() {\n\tDropGraphics(false);\n\tSetScrollBars();\n\tif (Wrapping()) {\n\t\tPRectangle rcTextArea = GetClientRectangle();\n\t\trcTextArea.left = vs.textStart;\n\t\trcTextArea.right -= vs.rightMarginWidth;\n\t\tif (wrapWidth != rcTextArea.Width()) {\n\t\t\tNeedWrapping();\n\t\t\tRedraw();\n\t\t}\n\t}\n}\n\nint Editor::InsertSpace(int position, unsigned int spaces) {\n\tif (spaces > 0) {\n\t\tstd::string spaceText(spaces, ' ');\n\t\tpdoc->InsertString(position, spaceText.c_str(), spaces);\n\t\tposition += spaces;\n\t}\n\treturn position;\n}\n\nvoid Editor::AddChar(char ch) {\n\tchar s[2];\n\ts[0] = ch;\n\ts[1] = '\\0';\n\tAddCharUTF(s, 1);\n}\n\nvoid Editor::FilterSelections() {\n\tif (!additionalSelectionTyping && (sel.Count() > 1)) {\n\t\tSelectionRange rangeOnly = sel.RangeMain();\n\t\tInvalidateSelection(rangeOnly, true);\n\t\tsel.SetSelection(rangeOnly);\n\t}\n}\n\nstatic bool cmpSelPtrs(const SelectionRange *a, const SelectionRange *b) {\n\treturn *a < *b;\n}\n\n// AddCharUTF inserts an array of bytes which may or may not be in UTF-8.\nvoid Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) {\n\tFilterSelections();\n\t{\n\t\tUndoGroup ug(pdoc, (sel.Count() > 1) || !sel.Empty() || inOverstrike);\n\n\t\tstd::vector<SelectionRange *> selPtrs;\n\t\tfor (size_t r = 0; r < sel.Count(); r++) {\n\t\t\tselPtrs.push_back(&sel.Range(r));\n\t\t}\n\t\tstd::sort(selPtrs.begin(), selPtrs.end(), cmpSelPtrs);\n\n\t\tfor (std::vector<SelectionRange *>::reverse_iterator rit = selPtrs.rbegin();\n\t\t\trit != selPtrs.rend(); ++rit) {\n\t\t\tSelectionRange *currentSel = *rit;\n\t\t\tif (!RangeContainsProtected(currentSel->Start().Position(),\n\t\t\t\tcurrentSel->End().Position())) {\n\t\t\t\tint positionInsert = currentSel->Start().Position();\n\t\t\t\tif (!currentSel->Empty()) {\n\t\t\t\t\tif (currentSel->Length()) {\n\t\t\t\t\t\tpdoc->DeleteChars(positionInsert, currentSel->Length());\n\t\t\t\t\t\tcurrentSel->ClearVirtualSpace();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Range is all virtual so collapse to start of virtual space\n\t\t\t\t\t\tcurrentSel->MinimizeVirtualSpace();\n\t\t\t\t\t}\n\t\t\t\t} else if (inOverstrike) {\n\t\t\t\t\tif (positionInsert < pdoc->Length()) {\n\t\t\t\t\t\tif (!pdoc->IsPositionInLineEnd(positionInsert)) {\n\t\t\t\t\t\t\tpdoc->DelChar(positionInsert);\n\t\t\t\t\t\t\tcurrentSel->ClearVirtualSpace();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpositionInsert = InsertSpace(positionInsert, currentSel->caret.VirtualSpace());\n\t\t\t\tif (pdoc->InsertString(positionInsert, s, len)) {\n\t\t\t\t\tcurrentSel->caret.SetPosition(positionInsert + len);\n\t\t\t\t\tcurrentSel->anchor.SetPosition(positionInsert + len);\n\t\t\t\t}\n\t\t\t\tcurrentSel->ClearVirtualSpace();\n\t\t\t\t// If in wrap mode rewrap current line so EnsureCaretVisible has accurate information\n\t\t\t\tif (Wrapping()) {\n\t\t\t\t\tAutoSurface surface(this);\n\t\t\t\t\tif (surface) {\n\t\t\t\t\t\tif (WrapOneLine(surface, pdoc->LineFromPosition(positionInsert))) {\n\t\t\t\t\t\t\tSetScrollBars();\n\t\t\t\t\t\t\tSetVerticalScrollPos();\n\t\t\t\t\t\t\tRedraw();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (Wrapping()) {\n\t\tSetScrollBars();\n\t}\n\tThinRectangularRange();\n\t// If in wrap mode rewrap current line so EnsureCaretVisible has accurate information\n\tEnsureCaretVisible();\n\t// Avoid blinking during rapid typing:\n\tShowCaretAtCurrentPosition();\n\tif ((caretSticky == SC_CARETSTICKY_OFF) ||\n\t\t((caretSticky == SC_CARETSTICKY_WHITESPACE) && !IsAllSpacesOrTabs(s, len))) {\n\t\tSetLastXChosen();\n\t}\n\n\tif (treatAsDBCS) {\n\t\tNotifyChar((static_cast<unsigned char>(s[0]) << 8) |\n\t\t        static_cast<unsigned char>(s[1]));\n\t} else if (len > 0) {\n\t\tint byte = static_cast<unsigned char>(s[0]);\n\t\tif ((byte < 0xC0) || (1 == len)) {\n\t\t\t// Handles UTF-8 characters between 0x01 and 0x7F and single byte\n\t\t\t// characters when not in UTF-8 mode.\n\t\t\t// Also treats \\0 and naked trail bytes 0x80 to 0xBF as valid\n\t\t\t// characters representing themselves.\n\t\t} else {\n\t\t\t// Unroll 1 to 3 byte UTF-8 sequences.  See reference data at:\n\t\t\t// http://www.cl.cam.ac.uk/~mgk25/unicode.html\n\t\t\t// http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt\n\t\t\tif (byte < 0xE0) {\n\t\t\t\tint byte2 = static_cast<unsigned char>(s[1]);\n\t\t\t\tif ((byte2 & 0xC0) == 0x80) {\n\t\t\t\t\t// Two-byte-character lead-byte followed by a trail-byte.\n\t\t\t\t\tbyte = (((byte & 0x1F) << 6) | (byte2 & 0x3F));\n\t\t\t\t}\n\t\t\t\t// A two-byte-character lead-byte not followed by trail-byte\n\t\t\t\t// represents itself.\n\t\t\t} else if (byte < 0xF0) {\n\t\t\t\tint byte2 = static_cast<unsigned char>(s[1]);\n\t\t\t\tint byte3 = static_cast<unsigned char>(s[2]);\n\t\t\t\tif (((byte2 & 0xC0) == 0x80) && ((byte3 & 0xC0) == 0x80)) {\n\t\t\t\t\t// Three-byte-character lead byte followed by two trail bytes.\n\t\t\t\t\tbyte = (((byte & 0x0F) << 12) | ((byte2 & 0x3F) << 6) |\n\t\t\t\t\t        (byte3 & 0x3F));\n\t\t\t\t}\n\t\t\t\t// A three-byte-character lead-byte not followed by two trail-bytes\n\t\t\t\t// represents itself.\n\t\t\t}\n\t\t}\n\t\tNotifyChar(byte);\n\t}\n\n\tif (recordingMacro) {\n\t\tNotifyMacroRecord(SCI_REPLACESEL, 0, reinterpret_cast<sptr_t>(s));\n\t}\n}\n\nvoid Editor::InsertPaste(SelectionPosition selStart, const char *text, int len) {\n\tif (multiPasteMode == SC_MULTIPASTE_ONCE) {\n\t\tselStart = SelectionPosition(InsertSpace(selStart.Position(), selStart.VirtualSpace()));\n\t\tif (pdoc->InsertString(selStart.Position(), text, len)) {\n\t\t\tSetEmptySelection(selStart.Position() + len);\n\t\t}\n\t} else {\n\t\t// SC_MULTIPASTE_EACH\n\t\tfor (size_t r=0; r<sel.Count(); r++) {\n\t\t\tif (!RangeContainsProtected(sel.Range(r).Start().Position(),\n\t\t\t\tsel.Range(r).End().Position())) {\n\t\t\t\tint positionInsert = sel.Range(r).Start().Position();\n\t\t\t\tif (!sel.Range(r).Empty()) {\n\t\t\t\t\tif (sel.Range(r).Length()) {\n\t\t\t\t\t\tpdoc->DeleteChars(positionInsert, sel.Range(r).Length());\n\t\t\t\t\t\tsel.Range(r).ClearVirtualSpace();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Range is all virtual so collapse to start of virtual space\n\t\t\t\t\t\tsel.Range(r).MinimizeVirtualSpace();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpositionInsert = InsertSpace(positionInsert, sel.Range(r).caret.VirtualSpace());\n\t\t\t\tif (pdoc->InsertString(positionInsert, text, len)) {\n\t\t\t\t\tsel.Range(r).caret.SetPosition(positionInsert + len);\n\t\t\t\t\tsel.Range(r).anchor.SetPosition(positionInsert + len);\n\t\t\t\t}\n\t\t\t\tsel.Range(r).ClearVirtualSpace();\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid Editor::ClearSelection(bool retainMultipleSelections) {\n\tif (!sel.IsRectangular() && !retainMultipleSelections)\n\t\tFilterSelections();\n\tUndoGroup ug(pdoc);\n\tfor (size_t r=0; r<sel.Count(); r++) {\n\t\tif (!sel.Range(r).Empty()) {\n\t\t\tif (!RangeContainsProtected(sel.Range(r).Start().Position(),\n\t\t\t\tsel.Range(r).End().Position())) {\n\t\t\t\tpdoc->DeleteChars(sel.Range(r).Start().Position(),\n\t\t\t\t\tsel.Range(r).Length());\n\t\t\t\tsel.Range(r) = sel.Range(r).Start();\n\t\t\t}\n\t\t}\n\t}\n\tThinRectangularRange();\n\tsel.RemoveDuplicates();\n\tClaimSelection();\n}\n\nvoid Editor::ClearAll() {\n\t{\n\t\tUndoGroup ug(pdoc);\n\t\tif (0 != pdoc->Length()) {\n\t\t\tpdoc->DeleteChars(0, pdoc->Length());\n\t\t}\n\t\tif (!pdoc->IsReadOnly()) {\n\t\t\tcs.Clear();\n\t\t\tpdoc->AnnotationClearAll();\n\t\t\tpdoc->MarginClearAll();\n\t\t}\n\t}\n\tsel.Clear();\n\tSetTopLine(0);\n\tSetVerticalScrollPos();\n\tInvalidateStyleRedraw();\n}\n\nvoid Editor::ClearDocumentStyle() {\n\tDecoration *deco = pdoc->decorations.root;\n\twhile (deco) {\n\t\t// Save next in case deco deleted\n\t\tDecoration *decoNext = deco->next;\n\t\tif (deco->indicator < INDIC_CONTAINER) {\n\t\t\tpdoc->decorations.SetCurrentIndicator(deco->indicator);\n\t\t\tpdoc->DecorationFillRange(0, 0, pdoc->Length());\n\t\t}\n\t\tdeco = decoNext;\n\t}\n\tpdoc->StartStyling(0, '\\377');\n\tpdoc->SetStyleFor(pdoc->Length(), 0);\n\tcs.ShowAll();\n\tpdoc->ClearLevels();\n}\n\nvoid Editor::CopyAllowLine() {\n\tSelectionText selectedText;\n\tCopySelectionRange(&selectedText, true);\n\tCopyToClipboard(selectedText);\n}\n\nvoid Editor::Cut() {\n\tpdoc->CheckReadOnly();\n\tif (!pdoc->IsReadOnly() && !SelectionContainsProtected()) {\n\t\tCopy();\n\t\tClearSelection();\n\t}\n}\n\nvoid Editor::PasteRectangular(SelectionPosition pos, const char *ptr, int len) {\n\tif (pdoc->IsReadOnly() || SelectionContainsProtected()) {\n\t\treturn;\n\t}\n\tsel.Clear();\n\tsel.RangeMain() = SelectionRange(pos);\n\tint line = pdoc->LineFromPosition(sel.MainCaret());\n\tUndoGroup ug(pdoc);\n\tsel.RangeMain().caret = SelectionPosition(\n\t\tInsertSpace(sel.RangeMain().caret.Position(), sel.RangeMain().caret.VirtualSpace()));\n\tint xInsert = XFromPosition(sel.RangeMain().caret);\n\tbool prevCr = false;\n\twhile ((len > 0) && IsEOLChar(ptr[len-1]))\n\t\tlen--;\n\tfor (int i = 0; i < len; i++) {\n\t\tif (IsEOLChar(ptr[i])) {\n\t\t\tif ((ptr[i] == '\\r') || (!prevCr))\n\t\t\t\tline++;\n\t\t\tif (line >= pdoc->LinesTotal()) {\n\t\t\t\tif (pdoc->eolMode != SC_EOL_LF)\n\t\t\t\t\tpdoc->InsertChar(pdoc->Length(), '\\r');\n\t\t\t\tif (pdoc->eolMode != SC_EOL_CR)\n\t\t\t\t\tpdoc->InsertChar(pdoc->Length(), '\\n');\n\t\t\t}\n\t\t\t// Pad the end of lines with spaces if required\n\t\t\tsel.RangeMain().caret.SetPosition(PositionFromLineX(line, xInsert));\n\t\t\tif ((XFromPosition(sel.MainCaret()) < xInsert) && (i + 1 < len)) {\n\t\t\t\twhile (XFromPosition(sel.MainCaret()) < xInsert) {\n\t\t\t\t\tpdoc->InsertChar(sel.MainCaret(), ' ');\n\t\t\t\t\tsel.RangeMain().caret.Add(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tprevCr = ptr[i] == '\\r';\n\t\t} else {\n\t\t\tpdoc->InsertString(sel.MainCaret(), ptr + i, 1);\n\t\t\tsel.RangeMain().caret.Add(1);\n\t\t\tprevCr = false;\n\t\t}\n\t}\n\tSetEmptySelection(pos);\n}\n\nbool Editor::CanPaste() {\n\treturn !pdoc->IsReadOnly() && !SelectionContainsProtected();\n}\n\nvoid Editor::Clear() {\n\t// If multiple selections, don't delete EOLS\n\tif (sel.Empty()) {\n\t\tbool singleVirtual = false;\n\t\tif ((sel.Count() == 1) &&\n\t\t\t!RangeContainsProtected(sel.MainCaret(), sel.MainCaret() + 1) &&\n\t\t\tsel.RangeMain().Start().VirtualSpace()) {\n\t\t\tsingleVirtual = true;\n\t\t}\n\t\tUndoGroup ug(pdoc, (sel.Count() > 1) || singleVirtual);\n\t\tfor (size_t r=0; r<sel.Count(); r++) {\n\t\t\tif (!RangeContainsProtected(sel.Range(r).caret.Position(), sel.Range(r).caret.Position() + 1)) {\n\t\t\t\tif (sel.Range(r).Start().VirtualSpace()) {\n\t\t\t\t\tif (sel.Range(r).anchor < sel.Range(r).caret)\n\t\t\t\t\t\tsel.Range(r) = SelectionPosition(InsertSpace(sel.Range(r).anchor.Position(), sel.Range(r).anchor.VirtualSpace()));\n\t\t\t\t\telse\n\t\t\t\t\t\tsel.Range(r) = SelectionPosition(InsertSpace(sel.Range(r).caret.Position(), sel.Range(r).caret.VirtualSpace()));\n\t\t\t\t}\n\t\t\t\tif ((sel.Count() == 1) || !pdoc->IsPositionInLineEnd(sel.Range(r).caret.Position())) {\n\t\t\t\t\tpdoc->DelChar(sel.Range(r).caret.Position());\n\t\t\t\t\tsel.Range(r).ClearVirtualSpace();\n\t\t\t\t}  // else multiple selection so don't eat line ends\n\t\t\t} else {\n\t\t\t\tsel.Range(r).ClearVirtualSpace();\n\t\t\t}\n\t\t}\n\t} else {\n\t\tClearSelection();\n\t}\n\tsel.RemoveDuplicates();\n}\n\nvoid Editor::SelectAll() {\n\tsel.Clear();\n\tSetSelection(0, pdoc->Length());\n\tRedraw();\n}\n\nvoid Editor::Undo() {\n\tif (pdoc->CanUndo()) {\n\t\tInvalidateCaret();\n\t\tint newPos = pdoc->Undo();\n\t\tif (newPos >= 0)\n\t\t\tSetEmptySelection(newPos);\n\t\tEnsureCaretVisible();\n\t}\n}\n\nvoid Editor::Redo() {\n\tif (pdoc->CanRedo()) {\n\t\tint newPos = pdoc->Redo();\n\t\tif (newPos >= 0)\n\t\t\tSetEmptySelection(newPos);\n\t\tEnsureCaretVisible();\n\t}\n}\n\nvoid Editor::DelChar() {\n\tif (!RangeContainsProtected(sel.MainCaret(), sel.MainCaret() + 1)) {\n\t\tpdoc->DelChar(sel.MainCaret());\n\t}\n\t// Avoid blinking during rapid typing:\n\tShowCaretAtCurrentPosition();\n}\n\nvoid Editor::DelCharBack(bool allowLineStartDeletion) {\n\tif (!sel.IsRectangular())\n\t\tFilterSelections();\n\tif (sel.IsRectangular())\n\t\tallowLineStartDeletion = false;\n\tUndoGroup ug(pdoc, (sel.Count() > 1) || !sel.Empty());\n\tif (sel.Empty()) {\n\t\tfor (size_t r=0; r<sel.Count(); r++) {\n\t\t\tif (!RangeContainsProtected(sel.Range(r).caret.Position() - 1, sel.Range(r).caret.Position())) {\n\t\t\t\tif (sel.Range(r).caret.VirtualSpace()) {\n\t\t\t\t\tsel.Range(r).caret.SetVirtualSpace(sel.Range(r).caret.VirtualSpace() - 1);\n\t\t\t\t\tsel.Range(r).anchor.SetVirtualSpace(sel.Range(r).caret.VirtualSpace());\n\t\t\t\t} else {\n\t\t\t\t\tint lineCurrentPos = pdoc->LineFromPosition(sel.Range(r).caret.Position());\n\t\t\t\t\tif (allowLineStartDeletion || (pdoc->LineStart(lineCurrentPos) != sel.Range(r).caret.Position())) {\n\t\t\t\t\t\tif (pdoc->GetColumn(sel.Range(r).caret.Position()) <= pdoc->GetLineIndentation(lineCurrentPos) &&\n\t\t\t\t\t\t\t\tpdoc->GetColumn(sel.Range(r).caret.Position()) > 0 && pdoc->backspaceUnindents) {\n\t\t\t\t\t\t\tUndoGroup ugInner(pdoc, !ug.Needed());\n\t\t\t\t\t\t\tint indentation = pdoc->GetLineIndentation(lineCurrentPos);\n\t\t\t\t\t\t\tint indentationStep = pdoc->IndentSize();\n\t\t\t\t\t\t\tif (indentation % indentationStep == 0) {\n\t\t\t\t\t\t\t\tpdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tpdoc->SetLineIndentation(lineCurrentPos, indentation - (indentation % indentationStep));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// SetEmptySelection\n\t\t\t\t\t\t\tsel.Range(r) = SelectionRange(pdoc->GetLineIndentPosition(lineCurrentPos),\n\t\t\t\t\t\t\t\tpdoc->GetLineIndentPosition(lineCurrentPos));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpdoc->DelCharBack(sel.Range(r).caret.Position());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsel.Range(r).ClearVirtualSpace();\n\t\t\t}\n\t\t}\n\t\tThinRectangularRange();\n\t} else {\n\t\tClearSelection();\n\t}\n\tsel.RemoveDuplicates();\n\tContainerNeedsUpdate(SC_UPDATE_SELECTION);\n\t// Avoid blinking during rapid typing:\n\tShowCaretAtCurrentPosition();\n}\n\nvoid Editor::NotifyFocus(bool focus) {\n\tSCNotification scn = {};\n\tscn.nmhdr.code = focus ? SCN_FOCUSIN : SCN_FOCUSOUT;\n\tNotifyParent(scn);\n}\n\nvoid Editor::SetCtrlID(int identifier) {\n\tctrlID = identifier;\n}\n\nvoid Editor::NotifyStyleToNeeded(int endStyleNeeded) {\n\tSCNotification scn = {};\n\tscn.nmhdr.code = SCN_STYLENEEDED;\n\tscn.position = endStyleNeeded;\n\tNotifyParent(scn);\n}\n\nvoid Editor::NotifyStyleNeeded(Document *, void *, int endStyleNeeded) {\n\tNotifyStyleToNeeded(endStyleNeeded);\n}\n\nvoid Editor::NotifyLexerChanged(Document *, void *) {\n}\n\nvoid Editor::NotifyErrorOccurred(Document *, void *, int status) {\n\terrorStatus = status;\n}\n\nvoid Editor::NotifyChar(int ch) {\n\tSCNotification scn = {};\n\tscn.nmhdr.code = SCN_CHARADDED;\n\tscn.ch = ch;\n\tNotifyParent(scn);\n}\n\nvoid Editor::NotifySavePoint(bool isSavePoint) {\n\tSCNotification scn = {};\n\tif (isSavePoint) {\n\t\tscn.nmhdr.code = SCN_SAVEPOINTREACHED;\n\t} else {\n\t\tscn.nmhdr.code = SCN_SAVEPOINTLEFT;\n\t}\n\tNotifyParent(scn);\n}\n\nvoid Editor::NotifyModifyAttempt() {\n\tSCNotification scn = {};\n\tscn.nmhdr.code = SCN_MODIFYATTEMPTRO;\n\tNotifyParent(scn);\n}\n\nvoid Editor::NotifyDoubleClick(Point pt, bool shift, bool ctrl, bool alt) {\n\tSCNotification scn = {};\n\tscn.nmhdr.code = SCN_DOUBLECLICK;\n\tscn.line = LineFromLocation(pt);\n\tscn.position = PositionFromLocation(pt, true);\n\tscn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) |\n\t        (alt ? SCI_ALT : 0);\n\tNotifyParent(scn);\n}\n\nvoid Editor::NotifyHotSpotDoubleClicked(int position, bool shift, bool ctrl, bool alt) {\n\tSCNotification scn = {};\n\tscn.nmhdr.code = SCN_HOTSPOTDOUBLECLICK;\n\tscn.position = position;\n\tscn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) |\n\t        (alt ? SCI_ALT : 0);\n\tNotifyParent(scn);\n}\n\nvoid Editor::NotifyHotSpotClicked(int position, bool shift, bool ctrl, bool alt) {\n\tSCNotification scn = {};\n\tscn.nmhdr.code = SCN_HOTSPOTCLICK;\n\tscn.position = position;\n\tscn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) |\n\t        (alt ? SCI_ALT : 0);\n\tNotifyParent(scn);\n}\n\nvoid Editor::NotifyHotSpotReleaseClick(int position, bool shift, bool ctrl, bool alt) {\n\tSCNotification scn = {};\n\tscn.nmhdr.code = SCN_HOTSPOTRELEASECLICK;\n\tscn.position = position;\n\tscn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) |\n\t        (alt ? SCI_ALT : 0);\n\tNotifyParent(scn);\n}\n\nbool Editor::NotifyUpdateUI() {\n\tif (needUpdateUI) {\n\t\tSCNotification scn = {};\n\t\tscn.nmhdr.code = SCN_UPDATEUI;\n\t\tscn.updated = needUpdateUI;\n\t\tNotifyParent(scn);\n\t\tneedUpdateUI = 0;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nvoid Editor::NotifyPainted() {\n\tSCNotification scn = {};\n\tscn.nmhdr.code = SCN_PAINTED;\n\tNotifyParent(scn);\n}\n\nvoid Editor::NotifyIndicatorClick(bool click, int position, bool shift, bool ctrl, bool alt) {\n\tint mask = pdoc->decorations.AllOnFor(position);\n\tif ((click && mask) || pdoc->decorations.clickNotified) {\n\t\tSCNotification scn = {};\n\t\tpdoc->decorations.clickNotified = click;\n\t\tscn.nmhdr.code = click ? SCN_INDICATORCLICK : SCN_INDICATORRELEASE;\n\t\tscn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | (alt ? SCI_ALT : 0);\n\t\tscn.position = position;\n\t\tNotifyParent(scn);\n\t}\n}\n\nbool Editor::NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt) {\n\tint marginClicked = -1;\n\tint x = vs.textStart - vs.fixedColumnWidth;\n\tfor (int margin = 0; margin <= SC_MAX_MARGIN; margin++) {\n\t\tif ((pt.x >= x) && (pt.x < x + vs.ms[margin].width))\n\t\t\tmarginClicked = margin;\n\t\tx += vs.ms[margin].width;\n\t}\n\tif ((marginClicked >= 0) && vs.ms[marginClicked].sensitive) {\n\t\tint position = pdoc->LineStart(LineFromLocation(pt));\n\t\tif ((vs.ms[marginClicked].mask & SC_MASK_FOLDERS) && (foldAutomatic & SC_AUTOMATICFOLD_CLICK)) {\n\t\t\tint lineClick = pdoc->LineFromPosition(position);\n\t\t\tif (shift && ctrl) {\n\t\t\t\tFoldAll(SC_FOLDACTION_TOGGLE);\n\t\t\t} else {\n\t\t\t\tint levelClick = pdoc->GetLevel(lineClick);\n\t\t\t\tif (levelClick & SC_FOLDLEVELHEADERFLAG) {\n\t\t\t\t\tif (shift) {\n\t\t\t\t\t\t// Ensure all children visible\n\t\t\t\t\t\tFoldExpand(lineClick, SC_FOLDACTION_EXPAND, levelClick);\n\t\t\t\t\t} else if (ctrl) {\n\t\t\t\t\t\tFoldExpand(lineClick, SC_FOLDACTION_TOGGLE, levelClick);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Toggle this line\n\t\t\t\t\t\tFoldLine(lineClick, SC_FOLDACTION_TOGGLE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tSCNotification scn = {};\n\t\tscn.nmhdr.code = SCN_MARGINCLICK;\n\t\tscn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) |\n\t\t        (alt ? SCI_ALT : 0);\n\t\tscn.position = position;\n\t\tscn.margin = marginClicked;\n\t\tNotifyParent(scn);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n}\n\nvoid Editor::NotifyNeedShown(int pos, int len) {\n\tSCNotification scn = {};\n\tscn.nmhdr.code = SCN_NEEDSHOWN;\n\tscn.position = pos;\n\tscn.length = len;\n\tNotifyParent(scn);\n}\n\nvoid Editor::NotifyDwelling(Point pt, bool state) {\n\tSCNotification scn = {};\n\tscn.nmhdr.code = state ? SCN_DWELLSTART : SCN_DWELLEND;\n\tscn.position = PositionFromLocation(pt, true);\n\tscn.x = pt.x + vs.ExternalMarginWidth();\n\tscn.y = pt.y;\n\tNotifyParent(scn);\n}\n\nvoid Editor::NotifyZoom() {\n\tSCNotification scn = {};\n\tscn.nmhdr.code = SCN_ZOOM;\n\tNotifyParent(scn);\n}\n\n// Notifications from document\nvoid Editor::NotifyModifyAttempt(Document *, void *) {\n\t//Platform::DebugPrintf(\"** Modify Attempt\\n\");\n\tNotifyModifyAttempt();\n}\n\nvoid Editor::NotifySavePoint(Document *, void *, bool atSavePoint) {\n\t//Platform::DebugPrintf(\"** Save Point %s\\n\", atSavePoint ? \"On\" : \"Off\");\n\tNotifySavePoint(atSavePoint);\n}\n\nvoid Editor::CheckModificationForWrap(DocModification mh) {\n\tif (mh.modificationType & (SC_MOD_INSERTTEXT | SC_MOD_DELETETEXT)) {\n\t\tllc.Invalidate(LineLayout::llCheckTextAndStyle);\n\t\tint lineDoc = pdoc->LineFromPosition(mh.position);\n\t\tint lines = Platform::Maximum(0, mh.linesAdded);\n\t\tif (Wrapping()) {\n\t\t\tNeedWrapping(lineDoc, lineDoc + lines + 1);\n\t\t}\n\t\tRefreshStyleData();\n\t\t// Fix up annotation heights\n\t\tSetAnnotationHeights(lineDoc, lineDoc + lines + 2);\n\t}\n}\n\n// Move a position so it is still after the same character as before the insertion.\nstatic inline int MovePositionForInsertion(int position, int startInsertion, int length) {\n\tif (position > startInsertion) {\n\t\treturn position + length;\n\t}\n\treturn position;\n}\n\n// Move a position so it is still after the same character as before the deletion if that\n// character is still present else after the previous surviving character.\nstatic inline int MovePositionForDeletion(int position, int startDeletion, int length) {\n\tif (position > startDeletion) {\n\t\tint endDeletion = startDeletion + length;\n\t\tif (position > endDeletion) {\n\t\t\treturn position - length;\n\t\t} else {\n\t\t\treturn startDeletion;\n\t\t}\n\t} else {\n\t\treturn position;\n\t}\n}\n\nvoid Editor::NotifyModified(Document *, DocModification mh, void *) {\n\tContainerNeedsUpdate(SC_UPDATE_CONTENT);\n\tif (paintState == painting) {\n\t\tCheckForChangeOutsidePaint(Range(mh.position, mh.position + mh.length));\n\t}\n\tif (mh.modificationType & SC_MOD_CHANGELINESTATE) {\n\t\tif (paintState == painting) {\n\t\t\tCheckForChangeOutsidePaint(\n\t\t\t    Range(pdoc->LineStart(mh.line), pdoc->LineStart(mh.line + 1)));\n\t\t} else {\n\t\t\t// Could check that change is before last visible line.\n\t\t\tRedraw();\n\t\t}\n\t}\n\tif (mh.modificationType & SC_MOD_LEXERSTATE) {\n\t\tif (paintState == painting) {\n\t\t\tCheckForChangeOutsidePaint(\n\t\t\t    Range(mh.position, mh.position + mh.length));\n\t\t} else {\n\t\t\tRedraw();\n\t\t}\n\t}\n\tif (mh.modificationType & (SC_MOD_CHANGESTYLE | SC_MOD_CHANGEINDICATOR)) {\n\t\tif (mh.modificationType & SC_MOD_CHANGESTYLE) {\n\t\t\tpdoc->IncrementStyleClock();\n\t\t}\n\t\tif (paintState == notPainting) {\n\t\t\tif (mh.position < pdoc->LineStart(topLine)) {\n\t\t\t\t// Styling performed before this view\n\t\t\t\tRedraw();\n\t\t\t} else {\n\t\t\t\tInvalidateRange(mh.position, mh.position + mh.length);\n\t\t\t}\n\t\t}\n\t\tif (mh.modificationType & SC_MOD_CHANGESTYLE) {\n\t\t\tllc.Invalidate(LineLayout::llCheckTextAndStyle);\n\t\t}\n\t} else {\n\t\t// Move selection and brace highlights\n\t\tif (mh.modificationType & SC_MOD_INSERTTEXT) {\n\t\t\tsel.MovePositions(true, mh.position, mh.length);\n\t\t\tbraces[0] = MovePositionForInsertion(braces[0], mh.position, mh.length);\n\t\t\tbraces[1] = MovePositionForInsertion(braces[1], mh.position, mh.length);\n\t\t} else if (mh.modificationType & SC_MOD_DELETETEXT) {\n\t\t\tsel.MovePositions(false, mh.position, mh.length);\n\t\t\tbraces[0] = MovePositionForDeletion(braces[0], mh.position, mh.length);\n\t\t\tbraces[1] = MovePositionForDeletion(braces[1], mh.position, mh.length);\n\t\t}\n\t\tif ((mh.modificationType & (SC_MOD_BEFOREINSERT | SC_MOD_BEFOREDELETE)) && cs.HiddenLines()) {\n\t\t\t// Some lines are hidden so may need shown.\n\t\t\t// TODO: check if the modified area is hidden.\n\t\t\tif (mh.modificationType & SC_MOD_BEFOREINSERT) {\n\t\t\t\tint lineOfPos = pdoc->LineFromPosition(mh.position);\n\t\t\t\tbool insertingNewLine = false;\n\t\t\t\tfor (int i=0; i < mh.length; i++) {\n\t\t\t\t\tif ((mh.text[i] == '\\n') || (mh.text[i] == '\\r'))\n\t\t\t\t\t\tinsertingNewLine = true;\n\t\t\t\t}\n\t\t\t\tif (insertingNewLine && (mh.position != pdoc->LineStart(lineOfPos)))\n\t\t\t\t\tNeedShown(mh.position, pdoc->LineStart(lineOfPos+1) - mh.position);\n\t\t\t\telse\n\t\t\t\t\tNeedShown(mh.position, 0);\n\t\t\t} else if (mh.modificationType & SC_MOD_BEFOREDELETE) {\n\t\t\t\tNeedShown(mh.position, mh.length);\n\t\t\t}\n\t\t}\n\t\tif (mh.linesAdded != 0) {\n\t\t\t// Update contraction state for inserted and removed lines\n\t\t\t// lineOfPos should be calculated in context of state before modification, shouldn't it\n\t\t\tint lineOfPos = pdoc->LineFromPosition(mh.position);\n\t\t\tif (mh.position > pdoc->LineStart(lineOfPos))\n\t\t\t\tlineOfPos++;\t// Affecting subsequent lines\n\t\t\tif (mh.linesAdded > 0) {\n\t\t\t\tcs.InsertLines(lineOfPos, mh.linesAdded);\n\t\t\t} else {\n\t\t\t\tcs.DeleteLines(lineOfPos, -mh.linesAdded);\n\t\t\t}\n\t\t}\n\t\tif (mh.modificationType & SC_MOD_CHANGEANNOTATION) {\n\t\t\tint lineDoc = pdoc->LineFromPosition(mh.position);\n\t\t\tif (vs.annotationVisible) {\n\t\t\t\tcs.SetHeight(lineDoc, cs.GetHeight(lineDoc) + mh.annotationLinesAdded);\n\t\t\t\tRedraw();\n\t\t\t}\n\t\t}\n\t\tCheckModificationForWrap(mh);\n\t\tif (mh.linesAdded != 0) {\n\t\t\t// Avoid scrolling of display if change before current display\n\t\t\tif (mh.position < posTopLine && !CanDeferToLastStep(mh)) {\n\t\t\t\tint newTop = Platform::Clamp(topLine + mh.linesAdded, 0, MaxScrollPos());\n\t\t\t\tif (newTop != topLine) {\n\t\t\t\t\tSetTopLine(newTop);\n\t\t\t\t\tSetVerticalScrollPos();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (paintState == notPainting && !CanDeferToLastStep(mh)) {\n\t\t\t\tQueueIdleWork(WorkNeeded::workStyle, pdoc->Length());\n\t\t\t\tRedraw();\n\t\t\t}\n\t\t} else {\n\t\t\tif (paintState == notPainting && mh.length && !CanEliminate(mh)) {\n\t\t\t\tQueueIdleWork(WorkNeeded::workStyle, mh.position + mh.length);\n\t\t\t\tInvalidateRange(mh.position, mh.position + mh.length);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (mh.linesAdded != 0 && !CanDeferToLastStep(mh)) {\n\t\tSetScrollBars();\n\t}\n\n\tif ((mh.modificationType & SC_MOD_CHANGEMARKER) || (mh.modificationType & SC_MOD_CHANGEMARGIN)) {\n\t\tif ((!willRedrawAll) && ((paintState == notPainting) || !PaintContainsMargin())) {\n\t\t\tif (mh.modificationType & SC_MOD_CHANGEFOLD) {\n\t\t\t\t// Fold changes can affect the drawing of following lines so redraw whole margin\n\t\t\t\tRedrawSelMargin(highlightDelimiter.isEnabled ? -1 : mh.line-1, true);\n\t\t\t} else {\n\t\t\t\tRedrawSelMargin(mh.line);\n\t\t\t}\n\t\t}\n\t}\n\tif ((mh.modificationType & SC_MOD_CHANGEFOLD) && (foldAutomatic & SC_AUTOMATICFOLD_CHANGE)) {\n\t\tFoldChanged(mh.line, mh.foldLevelNow, mh.foldLevelPrev);\n\t}\n\n\t// NOW pay the piper WRT \"deferred\" visual updates\n\tif (IsLastStep(mh)) {\n\t\tSetScrollBars();\n\t\tRedraw();\n\t}\n\n\t// If client wants to see this modification\n\tif (mh.modificationType & modEventMask) {\n\t\tif ((mh.modificationType & (SC_MOD_CHANGESTYLE | SC_MOD_CHANGEINDICATOR)) == 0) {\n\t\t\t// Real modification made to text of document.\n\t\t\tNotifyChange();\t// Send EN_CHANGE\n\t\t}\n\n\t\tSCNotification scn = {};\n\t\tscn.nmhdr.code = SCN_MODIFIED;\n\t\tscn.position = mh.position;\n\t\tscn.modificationType = mh.modificationType;\n\t\tscn.text = mh.text;\n\t\tscn.length = mh.length;\n\t\tscn.linesAdded = mh.linesAdded;\n\t\tscn.line = mh.line;\n\t\tscn.foldLevelNow = mh.foldLevelNow;\n\t\tscn.foldLevelPrev = mh.foldLevelPrev;\n\t\tscn.token = mh.token;\n\t\tscn.annotationLinesAdded = mh.annotationLinesAdded;\n\t\tNotifyParent(scn);\n\t}\n}\n\nvoid Editor::NotifyDeleted(Document *, void *) {\n\t/* Do nothing */\n}\n\nvoid Editor::NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {\n\n\t// Enumerates all macroable messages\n\tswitch (iMessage) {\n\tcase SCI_CUT:\n\tcase SCI_COPY:\n\tcase SCI_PASTE:\n\tcase SCI_CLEAR:\n\tcase SCI_REPLACESEL:\n\tcase SCI_ADDTEXT:\n\tcase SCI_INSERTTEXT:\n\tcase SCI_APPENDTEXT:\n\tcase SCI_CLEARALL:\n\tcase SCI_SELECTALL:\n\tcase SCI_GOTOLINE:\n\tcase SCI_GOTOPOS:\n\tcase SCI_SEARCHANCHOR:\n\tcase SCI_SEARCHNEXT:\n\tcase SCI_SEARCHPREV:\n\tcase SCI_LINEDOWN:\n\tcase SCI_LINEDOWNEXTEND:\n\tcase SCI_PARADOWN:\n\tcase SCI_PARADOWNEXTEND:\n\tcase SCI_LINEUP:\n\tcase SCI_LINEUPEXTEND:\n\tcase SCI_PARAUP:\n\tcase SCI_PARAUPEXTEND:\n\tcase SCI_CHARLEFT:\n\tcase SCI_CHARLEFTEXTEND:\n\tcase SCI_CHARRIGHT:\n\tcase SCI_CHARRIGHTEXTEND:\n\tcase SCI_WORDLEFT:\n\tcase SCI_WORDLEFTEXTEND:\n\tcase SCI_WORDRIGHT:\n\tcase SCI_WORDRIGHTEXTEND:\n\tcase SCI_WORDPARTLEFT:\n\tcase SCI_WORDPARTLEFTEXTEND:\n\tcase SCI_WORDPARTRIGHT:\n\tcase SCI_WORDPARTRIGHTEXTEND:\n\tcase SCI_WORDLEFTEND:\n\tcase SCI_WORDLEFTENDEXTEND:\n\tcase SCI_WORDRIGHTEND:\n\tcase SCI_WORDRIGHTENDEXTEND:\n\tcase SCI_HOME:\n\tcase SCI_HOMEEXTEND:\n\tcase SCI_LINEEND:\n\tcase SCI_LINEENDEXTEND:\n\tcase SCI_HOMEWRAP:\n\tcase SCI_HOMEWRAPEXTEND:\n\tcase SCI_LINEENDWRAP:\n\tcase SCI_LINEENDWRAPEXTEND:\n\tcase SCI_DOCUMENTSTART:\n\tcase SCI_DOCUMENTSTARTEXTEND:\n\tcase SCI_DOCUMENTEND:\n\tcase SCI_DOCUMENTENDEXTEND:\n\tcase SCI_STUTTEREDPAGEUP:\n\tcase SCI_STUTTEREDPAGEUPEXTEND:\n\tcase SCI_STUTTEREDPAGEDOWN:\n\tcase SCI_STUTTEREDPAGEDOWNEXTEND:\n\tcase SCI_PAGEUP:\n\tcase SCI_PAGEUPEXTEND:\n\tcase SCI_PAGEDOWN:\n\tcase SCI_PAGEDOWNEXTEND:\n\tcase SCI_EDITTOGGLEOVERTYPE:\n\tcase SCI_CANCEL:\n\tcase SCI_DELETEBACK:\n\tcase SCI_TAB:\n\tcase SCI_BACKTAB:\n\tcase SCI_FORMFEED:\n\tcase SCI_VCHOME:\n\tcase SCI_VCHOMEEXTEND:\n\tcase SCI_VCHOMEWRAP:\n\tcase SCI_VCHOMEWRAPEXTEND:\n\tcase SCI_VCHOMEDISPLAY:\n\tcase SCI_VCHOMEDISPLAYEXTEND:\n\tcase SCI_DELWORDLEFT:\n\tcase SCI_DELWORDRIGHT:\n\tcase SCI_DELWORDRIGHTEND:\n\tcase SCI_DELLINELEFT:\n\tcase SCI_DELLINERIGHT:\n\tcase SCI_LINECOPY:\n\tcase SCI_LINECUT:\n\tcase SCI_LINEDELETE:\n\tcase SCI_LINETRANSPOSE:\n\tcase SCI_LINEDUPLICATE:\n\tcase SCI_LOWERCASE:\n\tcase SCI_UPPERCASE:\n\tcase SCI_LINESCROLLDOWN:\n\tcase SCI_LINESCROLLUP:\n\tcase SCI_DELETEBACKNOTLINE:\n\tcase SCI_HOMEDISPLAY:\n\tcase SCI_HOMEDISPLAYEXTEND:\n\tcase SCI_LINEENDDISPLAY:\n\tcase SCI_LINEENDDISPLAYEXTEND:\n\tcase SCI_SETSELECTIONMODE:\n\tcase SCI_LINEDOWNRECTEXTEND:\n\tcase SCI_LINEUPRECTEXTEND:\n\tcase SCI_CHARLEFTRECTEXTEND:\n\tcase SCI_CHARRIGHTRECTEXTEND:\n\tcase SCI_HOMERECTEXTEND:\n\tcase SCI_VCHOMERECTEXTEND:\n\tcase SCI_LINEENDRECTEXTEND:\n\tcase SCI_PAGEUPRECTEXTEND:\n\tcase SCI_PAGEDOWNRECTEXTEND:\n\tcase SCI_SELECTIONDUPLICATE:\n\tcase SCI_COPYALLOWLINE:\n\tcase SCI_VERTICALCENTRECARET:\n\tcase SCI_MOVESELECTEDLINESUP:\n\tcase SCI_MOVESELECTEDLINESDOWN:\n\tcase SCI_SCROLLTOSTART:\n\tcase SCI_SCROLLTOEND:\n\t\tbreak;\n\n\t\t// Filter out all others like display changes. Also, newlines are redundant\n\t\t// with char insert messages.\n\tcase SCI_NEWLINE:\n\tdefault:\n\t\t//\t\tprintf(\"Filtered out %ld of macro recording\\n\", iMessage);\n\t\treturn ;\n\t}\n\n\t// Send notification\n\tSCNotification scn = {};\n\tscn.nmhdr.code = SCN_MACRORECORD;\n\tscn.message = iMessage;\n\tscn.wParam = wParam;\n\tscn.lParam = lParam;\n\tNotifyParent(scn);\n}\n\n// Something has changed that the container should know about\nvoid Editor::ContainerNeedsUpdate(int flags) {\n\tneedUpdateUI |= flags;\n}\n\n/**\n * Force scroll and keep position relative to top of window.\n *\n * If stuttered = true and not already at first/last row, move to first/last row of window.\n * If stuttered = true and already at first/last row, scroll as normal.\n */\nvoid Editor::PageMove(int direction, Selection::selTypes selt, bool stuttered) {\n\tint topLineNew;\n\tSelectionPosition newPos;\n\n\tint currentLine = pdoc->LineFromPosition(sel.MainCaret());\n\tint topStutterLine = topLine + caretYSlop;\n\tint bottomStutterLine =\n\t    pdoc->LineFromPosition(PositionFromLocation(\n\t                Point(lastXChosen - xOffset, direction * vs.lineHeight * LinesToScroll())))\n\t    - caretYSlop - 1;\n\n\tif (stuttered && (direction < 0 && currentLine > topStutterLine)) {\n\t\ttopLineNew = topLine;\n\t\tnewPos = SPositionFromLocation(Point(lastXChosen - xOffset, vs.lineHeight * caretYSlop),\n\t\t\tfalse, false, UserVirtualSpace());\n\n\t} else if (stuttered && (direction > 0 && currentLine < bottomStutterLine)) {\n\t\ttopLineNew = topLine;\n\t\tnewPos = SPositionFromLocation(Point(lastXChosen - xOffset, vs.lineHeight * (LinesToScroll() - caretYSlop)),\n\t\t\tfalse, false, UserVirtualSpace());\n\n\t} else {\n\t\tPoint pt = LocationFromPosition(sel.MainCaret());\n\n\t\ttopLineNew = Platform::Clamp(\n\t\t            topLine + direction * LinesToScroll(), 0, MaxScrollPos());\n\t\tnewPos = SPositionFromLocation(\n\t\t\tPoint(lastXChosen - xOffset, pt.y + direction * (vs.lineHeight * LinesToScroll())),\n\t\t\tfalse, false, UserVirtualSpace());\n\t}\n\n\tif (topLineNew != topLine) {\n\t\tSetTopLine(topLineNew);\n\t\tMovePositionTo(newPos, selt);\n\t\tRedraw();\n\t\tSetVerticalScrollPos();\n\t} else {\n\t\tMovePositionTo(newPos, selt);\n\t}\n}\n\nvoid Editor::ChangeCaseOfSelection(int caseMapping) {\n\tUndoGroup ug(pdoc);\n\tfor (size_t r=0; r<sel.Count(); r++) {\n\t\tSelectionRange current = sel.Range(r);\n\t\tSelectionRange currentNoVS = current;\n\t\tcurrentNoVS.ClearVirtualSpace();\n\t\tsize_t rangeBytes = currentNoVS.Length();\n\t\tif (rangeBytes > 0) {\n\t\t\tstd::string sText = RangeText(currentNoVS.Start().Position(), currentNoVS.End().Position());\n\n\t\t\tstd::string sMapped = CaseMapString(sText, caseMapping);\n\n\t\t\tif (sMapped != sText) {\n\t\t\t\tsize_t firstDifference = 0;\n\t\t\t\twhile (sMapped[firstDifference] == sText[firstDifference])\n\t\t\t\t\tfirstDifference++;\n\t\t\t\tsize_t lastDifferenceText = sText.size() - 1;\n\t\t\t\tsize_t lastDifferenceMapped = sMapped.size() - 1;\n\t\t\t\twhile (sMapped[lastDifferenceMapped] == sText[lastDifferenceText]) {\n\t\t\t\t\tlastDifferenceText--;\n\t\t\t\t\tlastDifferenceMapped--;\n\t\t\t\t}\n\t\t\t\tsize_t endDifferenceText = sText.size() - 1 - lastDifferenceText;\n\t\t\t\tpdoc->DeleteChars(\n\t\t\t\t\tstatic_cast<int>(currentNoVS.Start().Position() + firstDifference),\n\t\t\t\t\tstatic_cast<int>(rangeBytes - firstDifference - endDifferenceText));\n\t\t\t\tpdoc->InsertString(\n\t\t\t\t\tstatic_cast<int>(currentNoVS.Start().Position() + firstDifference),\n\t\t\t\t\tsMapped.c_str() + firstDifference,\n\t\t\t\t\tstatic_cast<int>(lastDifferenceMapped - firstDifference + 1));\n\t\t\t\t// Automatic movement changes selection so reset to exactly the same as it was.\n\t\t\t\tint diffSizes = static_cast<int>(sMapped.size() - sText.size());\n\t\t\t\tif (diffSizes != 0) {\n\t\t\t\t\tif (current.anchor > current.caret)\n\t\t\t\t\t\tcurrent.anchor.Add(diffSizes);\n\t\t\t\t\telse\n\t\t\t\t\t\tcurrent.caret.Add(diffSizes);\n\t\t\t\t}\n\t\t\t\tsel.Range(r) = current;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid Editor::LineTranspose() {\n\tint line = pdoc->LineFromPosition(sel.MainCaret());\n\tif (line > 0) {\n\t\tUndoGroup ug(pdoc);\n\t\tint startPrev = pdoc->LineStart(line - 1);\n\t\tint endPrev = pdoc->LineEnd(line - 1);\n\t\tint start = pdoc->LineStart(line);\n\t\tint end = pdoc->LineEnd(line);\n\t\tstd::string line1 = RangeText(startPrev, endPrev);\n\t\tint len1 = endPrev - startPrev;\n\t\tstd::string line2 = RangeText(start, end);\n\t\tint len2 = end - start;\n\t\tpdoc->DeleteChars(start, len2);\n\t\tpdoc->DeleteChars(startPrev, len1);\n\t\tpdoc->InsertString(startPrev, line2.c_str(), len2);\n\t\tpdoc->InsertString(start - len1 + len2, line1.c_str(), len1);\n\t\tMovePositionTo(SelectionPosition(start - len1 + len2));\n\t}\n}\n\nvoid Editor::Duplicate(bool forLine) {\n\tif (sel.Empty()) {\n\t\tforLine = true;\n\t}\n\tUndoGroup ug(pdoc);\n\tconst char *eol = \"\";\n\tint eolLen = 0;\n\tif (forLine) {\n\t\teol = StringFromEOLMode(pdoc->eolMode);\n\t\teolLen = istrlen(eol);\n\t}\n\tfor (size_t r=0; r<sel.Count(); r++) {\n\t\tSelectionPosition start = sel.Range(r).Start();\n\t\tSelectionPosition end = sel.Range(r).End();\n\t\tif (forLine) {\n\t\t\tint line = pdoc->LineFromPosition(sel.Range(r).caret.Position());\n\t\t\tstart = SelectionPosition(pdoc->LineStart(line));\n\t\t\tend = SelectionPosition(pdoc->LineEnd(line));\n\t\t}\n\t\tstd::string text = RangeText(start.Position(), end.Position());\n\t\tif (forLine)\n\t\t\tpdoc->InsertString(end.Position(), eol, eolLen);\n\t\tpdoc->InsertString(end.Position() + eolLen, text.c_str(), SelectionRange(end, start).Length());\n\t}\n\tif (sel.Count() && sel.IsRectangular()) {\n\t\tSelectionPosition last = sel.Last();\n\t\tif (forLine) {\n\t\t\tint line = pdoc->LineFromPosition(last.Position());\n\t\t\tlast = SelectionPosition(last.Position() + pdoc->LineStart(line+1) - pdoc->LineStart(line));\n\t\t}\n\t\tif (sel.Rectangular().anchor > sel.Rectangular().caret)\n\t\t\tsel.Rectangular().anchor = last;\n\t\telse\n\t\t\tsel.Rectangular().caret = last;\n\t\tSetRectangularRange();\n\t}\n}\n\nvoid Editor::CancelModes() {\n\tsel.SetMoveExtends(false);\n}\n\nvoid Editor::NewLine() {\n\t// Remove non-main ranges\n\tInvalidateSelection(sel.RangeMain(), true);\n\tsel.SetSelection(sel.RangeMain());\n\n\t// Clear main range and insert line end\n\tbool needGroupUndo = !sel.Empty();\n\tif (needGroupUndo)\n\t\tpdoc->BeginUndoAction();\n\n\tif (!sel.Empty())\n\t\tClearSelection();\n\tconst char *eol = \"\\n\";\n\tif (pdoc->eolMode == SC_EOL_CRLF) {\n\t\teol = \"\\r\\n\";\n\t} else if (pdoc->eolMode == SC_EOL_CR) {\n\t\teol = \"\\r\";\n\t} // else SC_EOL_LF -> \"\\n\" already set\n\tbool inserted = pdoc->InsertCString(sel.MainCaret(), eol);\n\t// Want to end undo group before NotifyChar as applications often modify text here\n\tif (needGroupUndo)\n\t\tpdoc->EndUndoAction();\n\tif (inserted) {\n\t\tSetEmptySelection(sel.MainCaret() + istrlen(eol));\n\t\twhile (*eol) {\n\t\t\tNotifyChar(*eol);\n\t\t\tif (recordingMacro) {\n\t\t\t\tchar txt[2];\n\t\t\t\ttxt[0] = *eol;\n\t\t\t\ttxt[1] = '\\0';\n\t\t\t\tNotifyMacroRecord(SCI_REPLACESEL, 0, reinterpret_cast<sptr_t>(txt));\n\t\t\t}\n\t\t\teol++;\n\t\t}\n\t}\n\tSetLastXChosen();\n\tSetScrollBars();\n\tEnsureCaretVisible();\n\t// Avoid blinking during rapid typing:\n\tShowCaretAtCurrentPosition();\n}\n\nvoid Editor::CursorUpOrDown(int direction, Selection::selTypes selt) {\n\tSelectionPosition caretToUse = sel.Range(sel.Main()).caret;\n\tif (sel.IsRectangular()) {\n\t\tif (selt ==  Selection::noSel) {\n\t\t\tcaretToUse = (direction > 0) ? sel.Limits().end : sel.Limits().start;\n\t\t} else {\n\t\t\tcaretToUse = sel.Rectangular().caret;\n\t\t}\n\t}\n\n\tPoint pt = LocationFromPosition(caretToUse);\n\tint skipLines = 0;\n\n\tif (vs.annotationVisible) {\n\t\tint lineDoc = pdoc->LineFromPosition(caretToUse.Position());\n\t\tPoint ptStartLine = LocationFromPosition(pdoc->LineStart(lineDoc));\n\t\tint subLine = (pt.y - ptStartLine.y) / vs.lineHeight;\n\n\t\tif (direction < 0 && subLine == 0) {\n\t\t\tint lineDisplay = cs.DisplayFromDoc(lineDoc);\n\t\t\tif (lineDisplay > 0) {\n\t\t\t\tskipLines = pdoc->AnnotationLines(cs.DocFromDisplay(lineDisplay - 1));\n\t\t\t}\n\t\t} else if (direction > 0 && subLine >= (cs.GetHeight(lineDoc) - 1 - pdoc->AnnotationLines(lineDoc))) {\n\t\t\tskipLines = pdoc->AnnotationLines(lineDoc);\n\t\t}\n\t}\n\n\tint newY = pt.y + (1 + skipLines) * direction * vs.lineHeight;\n\tSelectionPosition posNew = SPositionFromLocation(\n\t            Point(lastXChosen - xOffset, newY), false, false, UserVirtualSpace());\n\n\tif (direction < 0) {\n\t\t// Line wrapping may lead to a location on the same line, so\n\t\t// seek back if that is the case.\n\t\tPoint ptNew = LocationFromPosition(posNew.Position());\n\t\twhile ((posNew.Position() > 0) && (pt.y == ptNew.y)) {\n\t\t\tposNew.Add(-1);\n\t\t\tposNew.SetVirtualSpace(0);\n\t\t\tptNew = LocationFromPosition(posNew.Position());\n\t\t}\n\t} else if (direction > 0 && posNew.Position() != pdoc->Length()) {\n\t\t// There is an equivalent case when moving down which skips\n\t\t// over a line.\n\t\tPoint ptNew = LocationFromPosition(posNew.Position());\n\t\twhile ((posNew.Position() > caretToUse.Position()) && (ptNew.y > newY)) {\n\t\t\tposNew.Add(-1);\n\t\t\tposNew.SetVirtualSpace(0);\n\t\t\tptNew = LocationFromPosition(posNew.Position());\n\t\t}\n\t}\n\n\tMovePositionTo(MovePositionSoVisible(posNew, direction), selt);\n}\n\nvoid Editor::ParaUpOrDown(int direction, Selection::selTypes selt) {\n\tint lineDoc, savedPos = sel.MainCaret();\n\tdo {\n\t\tMovePositionTo(SelectionPosition(direction > 0 ? pdoc->ParaDown(sel.MainCaret()) : pdoc->ParaUp(sel.MainCaret())), selt);\n\t\tlineDoc = pdoc->LineFromPosition(sel.MainCaret());\n\t\tif (direction > 0) {\n\t\t\tif (sel.MainCaret() >= pdoc->Length() && !cs.GetVisible(lineDoc)) {\n\t\t\t\tif (selt == Selection::noSel) {\n\t\t\t\t\tMovePositionTo(SelectionPosition(pdoc->LineEndPosition(savedPos)));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} while (!cs.GetVisible(lineDoc));\n}\n\nint Editor::StartEndDisplayLine(int pos, bool start) {\n\tRefreshStyleData();\n\tint line = pdoc->LineFromPosition(pos);\n\tAutoSurface surface(this);\n\tAutoLineLayout ll(llc, RetrieveLineLayout(line));\n\tint posRet = INVALID_POSITION;\n\tif (surface && ll) {\n\t\tunsigned int posLineStart = pdoc->LineStart(line);\n\t\tLayoutLine(line, surface, vs, ll, wrapWidth);\n\t\tint posInLine = pos - posLineStart;\n\t\tif (posInLine <= ll->maxLineLength) {\n\t\t\tfor (int subLine = 0; subLine < ll->lines; subLine++) {\n\t\t\t\tif ((posInLine >= ll->LineStart(subLine)) && (posInLine <= ll->LineStart(subLine + 1))) {\n\t\t\t\t\tif (start) {\n\t\t\t\t\t\tposRet = ll->LineStart(subLine) + posLineStart;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (subLine == ll->lines - 1)\n\t\t\t\t\t\t\tposRet = ll->LineStart(subLine + 1) + posLineStart;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tposRet = ll->LineStart(subLine + 1) + posLineStart - 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (posRet == INVALID_POSITION) {\n\t\treturn pos;\n\t} else {\n\t\treturn posRet;\n\t}\n}\n\nint Editor::KeyCommand(unsigned int iMessage) {\n\tswitch (iMessage) {\n\tcase SCI_LINEDOWN:\n\t\tCursorUpOrDown(1);\n\t\tbreak;\n\tcase SCI_LINEDOWNEXTEND:\n\t\tCursorUpOrDown(1, Selection::selStream);\n\t\tbreak;\n\tcase SCI_LINEDOWNRECTEXTEND:\n\t\tCursorUpOrDown(1, Selection::selRectangle);\n\t\tbreak;\n\tcase SCI_PARADOWN:\n\t\tParaUpOrDown(1);\n\t\tbreak;\n\tcase SCI_PARADOWNEXTEND:\n\t\tParaUpOrDown(1, Selection::selStream);\n\t\tbreak;\n\tcase SCI_LINESCROLLDOWN:\n\t\tScrollTo(topLine + 1);\n\t\tMoveCaretInsideView(false);\n\t\tbreak;\n\tcase SCI_LINEUP:\n\t\tCursorUpOrDown(-1);\n\t\tbreak;\n\tcase SCI_LINEUPEXTEND:\n\t\tCursorUpOrDown(-1, Selection::selStream);\n\t\tbreak;\n\tcase SCI_LINEUPRECTEXTEND:\n\t\tCursorUpOrDown(-1, Selection::selRectangle);\n\t\tbreak;\n\tcase SCI_PARAUP:\n\t\tParaUpOrDown(-1);\n\t\tbreak;\n\tcase SCI_PARAUPEXTEND:\n\t\tParaUpOrDown(-1, Selection::selStream);\n\t\tbreak;\n\tcase SCI_LINESCROLLUP:\n\t\tScrollTo(topLine - 1);\n\t\tMoveCaretInsideView(false);\n\t\tbreak;\n\tcase SCI_CHARLEFT:\n\t\tif (SelectionEmpty() || sel.MoveExtends()) {\n\t\t\tif ((sel.Count() == 1) && pdoc->IsLineEndPosition(sel.MainCaret()) && sel.RangeMain().caret.VirtualSpace()) {\n\t\t\t\tSelectionPosition spCaret = sel.RangeMain().caret;\n\t\t\t\tspCaret.SetVirtualSpace(spCaret.VirtualSpace() - 1);\n\t\t\t\tMovePositionTo(spCaret);\n\t\t\t} else if (sel.MoveExtends() && sel.selType == Selection::selStream) {\n\t\t\t\tMovePositionTo(MovePositionSoVisible(SelectionPosition(sel.MainCaret() - 1), -1));\n\t\t\t} else {\n\t\t\t\tMovePositionTo(MovePositionSoVisible(\n\t\t\t\t\tSelectionPosition((sel.LimitsForRectangularElseMain().start).Position() - 1), -1));\n\t\t\t}\n\t\t} else {\n\t\t\tMovePositionTo(sel.LimitsForRectangularElseMain().start);\n\t\t}\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_CHARLEFTEXTEND:\n\t\tif (pdoc->IsLineEndPosition(sel.MainCaret()) && sel.RangeMain().caret.VirtualSpace()) {\n\t\t\tSelectionPosition spCaret = sel.RangeMain().caret;\n\t\t\tspCaret.SetVirtualSpace(spCaret.VirtualSpace() - 1);\n\t\t\tMovePositionTo(spCaret, Selection::selStream);\n\t\t} else {\n\t\t\tMovePositionTo(MovePositionSoVisible(SelectionPosition(sel.MainCaret() - 1), -1), Selection::selStream);\n\t\t}\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_CHARLEFTRECTEXTEND:\n\t\tif (pdoc->IsLineEndPosition(sel.MainCaret()) && sel.RangeMain().caret.VirtualSpace()) {\n\t\t\tSelectionPosition spCaret = sel.RangeMain().caret;\n\t\t\tspCaret.SetVirtualSpace(spCaret.VirtualSpace() - 1);\n\t\t\tMovePositionTo(spCaret, Selection::selRectangle);\n\t\t} else {\n\t\t\tMovePositionTo(MovePositionSoVisible(SelectionPosition(sel.MainCaret() - 1), -1), Selection::selRectangle);\n\t\t}\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_CHARRIGHT:\n\t\tif (SelectionEmpty() || sel.MoveExtends()) {\n\t\t\tif ((virtualSpaceOptions & SCVS_USERACCESSIBLE) && pdoc->IsLineEndPosition(sel.MainCaret())) {\n\t\t\t\tSelectionPosition spCaret = sel.RangeMain().caret;\n\t\t\t\tspCaret.SetVirtualSpace(spCaret.VirtualSpace() + 1);\n\t\t\t\tMovePositionTo(spCaret);\n\t\t\t} else if (sel.MoveExtends() && sel.selType == Selection::selStream) {\n\t\t\t\tMovePositionTo(MovePositionSoVisible(SelectionPosition(sel.MainCaret() + 1), 1));\n\t\t\t} else {\n\t\t\t\tMovePositionTo(MovePositionSoVisible(\n\t\t\t\t\tSelectionPosition((sel.LimitsForRectangularElseMain().end).Position() + 1), 1));\n\t\t\t}\n\t\t} else {\n\t\t\tMovePositionTo(sel.LimitsForRectangularElseMain().end);\n\t\t}\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_CHARRIGHTEXTEND:\n\t\tif ((virtualSpaceOptions & SCVS_USERACCESSIBLE) && pdoc->IsLineEndPosition(sel.MainCaret())) {\n\t\t\tSelectionPosition spCaret = sel.RangeMain().caret;\n\t\t\tspCaret.SetVirtualSpace(spCaret.VirtualSpace() + 1);\n\t\t\tMovePositionTo(spCaret, Selection::selStream);\n\t\t} else {\n\t\t\tMovePositionTo(MovePositionSoVisible(SelectionPosition(sel.MainCaret() + 1), 1), Selection::selStream);\n\t\t}\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_CHARRIGHTRECTEXTEND:\n\t\tif ((virtualSpaceOptions & SCVS_RECTANGULARSELECTION) && pdoc->IsLineEndPosition(sel.MainCaret())) {\n\t\t\tSelectionPosition spCaret = sel.RangeMain().caret;\n\t\t\tspCaret.SetVirtualSpace(spCaret.VirtualSpace() + 1);\n\t\t\tMovePositionTo(spCaret, Selection::selRectangle);\n\t\t} else {\n\t\t\tMovePositionTo(MovePositionSoVisible(SelectionPosition(sel.MainCaret() + 1), 1), Selection::selRectangle);\n\t\t}\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_WORDLEFT:\n\t\tMovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(sel.MainCaret(), -1), -1));\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_WORDLEFTEXTEND:\n\t\tMovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(sel.MainCaret(), -1), -1), Selection::selStream);\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_WORDRIGHT:\n\t\tMovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(sel.MainCaret(), 1), 1));\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_WORDRIGHTEXTEND:\n\t\tMovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(sel.MainCaret(), 1), 1), Selection::selStream);\n\t\tSetLastXChosen();\n\t\tbreak;\n\n\tcase SCI_WORDLEFTEND:\n\t\tMovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(sel.MainCaret(), -1), -1));\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_WORDLEFTENDEXTEND:\n\t\tMovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(sel.MainCaret(), -1), -1), Selection::selStream);\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_WORDRIGHTEND:\n\t\tMovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(sel.MainCaret(), 1), 1));\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_WORDRIGHTENDEXTEND:\n\t\tMovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(sel.MainCaret(), 1), 1), Selection::selStream);\n\t\tSetLastXChosen();\n\t\tbreak;\n\n\tcase SCI_HOME:\n\t\tMovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(sel.MainCaret())));\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_HOMEEXTEND:\n\t\tMovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(sel.MainCaret())), Selection::selStream);\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_HOMERECTEXTEND:\n\t\tMovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(sel.MainCaret())), Selection::selRectangle);\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_LINEEND:\n\t\tMovePositionTo(pdoc->LineEndPosition(sel.MainCaret()));\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_LINEENDEXTEND:\n\t\tMovePositionTo(pdoc->LineEndPosition(sel.MainCaret()), Selection::selStream);\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_LINEENDRECTEXTEND:\n\t\tMovePositionTo(pdoc->LineEndPosition(sel.MainCaret()), Selection::selRectangle);\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_HOMEWRAP: {\n\t\t\tSelectionPosition homePos = MovePositionSoVisible(StartEndDisplayLine(sel.MainCaret(), true), -1);\n\t\t\tif (sel.RangeMain().caret <= homePos)\n\t\t\t\thomePos = SelectionPosition(pdoc->LineStart(pdoc->LineFromPosition(sel.MainCaret())));\n\t\t\tMovePositionTo(homePos);\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tbreak;\n\tcase SCI_HOMEWRAPEXTEND: {\n\t\t\tSelectionPosition homePos = MovePositionSoVisible(StartEndDisplayLine(sel.MainCaret(), true), -1);\n\t\t\tif (sel.RangeMain().caret <= homePos)\n\t\t\t\thomePos = SelectionPosition(pdoc->LineStart(pdoc->LineFromPosition(sel.MainCaret())));\n\t\t\tMovePositionTo(homePos, Selection::selStream);\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tbreak;\n\tcase SCI_LINEENDWRAP: {\n\t\t\tSelectionPosition endPos = MovePositionSoVisible(StartEndDisplayLine(sel.MainCaret(), false), 1);\n\t\t\tSelectionPosition realEndPos = SelectionPosition(pdoc->LineEndPosition(sel.MainCaret()));\n\t\t\tif (endPos > realEndPos      // if moved past visible EOLs\n\t\t\t        || sel.RangeMain().caret >= endPos) // if at end of display line already\n\t\t\t\tendPos = realEndPos;\n\t\t\tMovePositionTo(endPos);\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tbreak;\n\tcase SCI_LINEENDWRAPEXTEND: {\n\t\t\tSelectionPosition endPos = MovePositionSoVisible(StartEndDisplayLine(sel.MainCaret(), false), 1);\n\t\t\tSelectionPosition realEndPos = SelectionPosition(pdoc->LineEndPosition(sel.MainCaret()));\n\t\t\tif (endPos > realEndPos      // if moved past visible EOLs\n\t\t\t        || sel.RangeMain().caret >= endPos) // if at end of display line already\n\t\t\t\tendPos = realEndPos;\n\t\t\tMovePositionTo(endPos, Selection::selStream);\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tbreak;\n\tcase SCI_DOCUMENTSTART:\n\t\tMovePositionTo(0);\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_DOCUMENTSTARTEXTEND:\n\t\tMovePositionTo(0, Selection::selStream);\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_DOCUMENTEND:\n\t\tMovePositionTo(pdoc->Length());\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_DOCUMENTENDEXTEND:\n\t\tMovePositionTo(pdoc->Length(), Selection::selStream);\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_STUTTEREDPAGEUP:\n\t\tPageMove(-1, Selection::noSel, true);\n\t\tbreak;\n\tcase SCI_STUTTEREDPAGEUPEXTEND:\n\t\tPageMove(-1, Selection::selStream, true);\n\t\tbreak;\n\tcase SCI_STUTTEREDPAGEDOWN:\n\t\tPageMove(1, Selection::noSel, true);\n\t\tbreak;\n\tcase SCI_STUTTEREDPAGEDOWNEXTEND:\n\t\tPageMove(1, Selection::selStream, true);\n\t\tbreak;\n\tcase SCI_PAGEUP:\n\t\tPageMove(-1);\n\t\tbreak;\n\tcase SCI_PAGEUPEXTEND:\n\t\tPageMove(-1, Selection::selStream);\n\t\tbreak;\n\tcase SCI_PAGEUPRECTEXTEND:\n\t\tPageMove(-1, Selection::selRectangle);\n\t\tbreak;\n\tcase SCI_PAGEDOWN:\n\t\tPageMove(1);\n\t\tbreak;\n\tcase SCI_PAGEDOWNEXTEND:\n\t\tPageMove(1, Selection::selStream);\n\t\tbreak;\n\tcase SCI_PAGEDOWNRECTEXTEND:\n\t\tPageMove(1, Selection::selRectangle);\n\t\tbreak;\n\tcase SCI_EDITTOGGLEOVERTYPE:\n\t\tinOverstrike = !inOverstrike;\n\t\tDropCaret();\n\t\tShowCaretAtCurrentPosition();\n\t\tContainerNeedsUpdate(SC_UPDATE_CONTENT);\n\t\tNotifyUpdateUI();\n\t\tbreak;\n\tcase SCI_CANCEL:            \t// Cancel any modes - handled in subclass\n\t\t// Also unselect text\n\t\tCancelModes();\n\t\tbreak;\n\tcase SCI_DELETEBACK:\n\t\tDelCharBack(true);\n\t\tif ((caretSticky == SC_CARETSTICKY_OFF) || (caretSticky == SC_CARETSTICKY_WHITESPACE)) {\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tEnsureCaretVisible();\n\t\tbreak;\n\tcase SCI_DELETEBACKNOTLINE:\n\t\tDelCharBack(false);\n\t\tif ((caretSticky == SC_CARETSTICKY_OFF) || (caretSticky == SC_CARETSTICKY_WHITESPACE)) {\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tEnsureCaretVisible();\n\t\tbreak;\n\tcase SCI_TAB:\n\t\tIndent(true);\n\t\tif (caretSticky == SC_CARETSTICKY_OFF) {\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tEnsureCaretVisible();\n\t\tShowCaretAtCurrentPosition();\t\t// Avoid blinking\n\t\tbreak;\n\tcase SCI_BACKTAB:\n\t\tIndent(false);\n\t\tif ((caretSticky == SC_CARETSTICKY_OFF) || (caretSticky == SC_CARETSTICKY_WHITESPACE)) {\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tEnsureCaretVisible();\n\t\tShowCaretAtCurrentPosition();\t\t// Avoid blinking\n\t\tbreak;\n\tcase SCI_NEWLINE:\n\t\tNewLine();\n\t\tbreak;\n\tcase SCI_FORMFEED:\n\t\tAddChar('\\f');\n\t\tbreak;\n\tcase SCI_VCHOME:\n\t\tMovePositionTo(pdoc->VCHomePosition(sel.MainCaret()));\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_VCHOMEEXTEND:\n\t\tMovePositionTo(pdoc->VCHomePosition(sel.MainCaret()), Selection::selStream);\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_VCHOMERECTEXTEND:\n\t\tMovePositionTo(pdoc->VCHomePosition(sel.MainCaret()), Selection::selRectangle);\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_VCHOMEWRAP: {\n\t\t\tSelectionPosition homePos = SelectionPosition(pdoc->VCHomePosition(sel.MainCaret()));\n\t\t\tSelectionPosition viewLineStart = MovePositionSoVisible(StartEndDisplayLine(sel.MainCaret(), true), -1);\n\t\t\tif ((viewLineStart < sel.RangeMain().caret) && (viewLineStart > homePos))\n\t\t\t\thomePos = viewLineStart;\n\n\t\t\tMovePositionTo(homePos);\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tbreak;\n\tcase SCI_VCHOMEWRAPEXTEND: {\n\t\t\tSelectionPosition homePos = SelectionPosition(pdoc->VCHomePosition(sel.MainCaret()));\n\t\t\tSelectionPosition viewLineStart = MovePositionSoVisible(StartEndDisplayLine(sel.MainCaret(), true), -1);\n\t\t\tif ((viewLineStart < sel.RangeMain().caret) && (viewLineStart > homePos))\n\t\t\t\thomePos = viewLineStart;\n\n\t\t\tMovePositionTo(homePos, Selection::selStream);\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tbreak;\n\tcase SCI_ZOOMIN:\n\t\tif (vs.zoomLevel < 20) {\n\t\t\tvs.zoomLevel++;\n\t\t\tInvalidateStyleRedraw();\n\t\t\tNotifyZoom();\n\t\t}\n\t\tbreak;\n\tcase SCI_ZOOMOUT:\n\t\tif (vs.zoomLevel > -10) {\n\t\t\tvs.zoomLevel--;\n\t\t\tInvalidateStyleRedraw();\n\t\t\tNotifyZoom();\n\t\t}\n\t\tbreak;\n\tcase SCI_DELWORDLEFT: {\n\t\t\tint startWord = pdoc->NextWordStart(sel.MainCaret(), -1);\n\t\t\tpdoc->DeleteChars(startWord, sel.MainCaret() - startWord);\n\t\t\tsel.RangeMain().ClearVirtualSpace();\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tbreak;\n\tcase SCI_DELWORDRIGHT: {\n\t\t\tUndoGroup ug(pdoc);\n\t\t\tsel.RangeMain().caret = SelectionPosition(\n\t\t\t\tInsertSpace(sel.RangeMain().caret.Position(), sel.RangeMain().caret.VirtualSpace()));\n\t\t\tsel.RangeMain().anchor = sel.RangeMain().caret;\n\t\t\tint endWord = pdoc->NextWordStart(sel.MainCaret(), 1);\n\t\t\tpdoc->DeleteChars(sel.MainCaret(), endWord - sel.MainCaret());\n\t\t}\n\t\tbreak;\n\tcase SCI_DELWORDRIGHTEND: {\n\t\t\tUndoGroup ug(pdoc);\n\t\t\tsel.RangeMain().caret = SelectionPosition(\n\t\t\t\tInsertSpace(sel.RangeMain().caret.Position(), sel.RangeMain().caret.VirtualSpace()));\n\t\t\tint endWord = pdoc->NextWordEnd(sel.MainCaret(), 1);\n\t\t\tpdoc->DeleteChars(sel.MainCaret(), endWord - sel.MainCaret());\n\t\t}\n\t\tbreak;\n\tcase SCI_DELLINELEFT: {\n\t\t\tint line = pdoc->LineFromPosition(sel.MainCaret());\n\t\t\tint start = pdoc->LineStart(line);\n\t\t\tpdoc->DeleteChars(start, sel.MainCaret() - start);\n\t\t\tsel.RangeMain().ClearVirtualSpace();\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tbreak;\n\tcase SCI_DELLINERIGHT: {\n\t\t\tint line = pdoc->LineFromPosition(sel.MainCaret());\n\t\t\tint end = pdoc->LineEnd(line);\n\t\t\tpdoc->DeleteChars(sel.MainCaret(), end - sel.MainCaret());\n\t\t}\n\t\tbreak;\n\tcase SCI_LINECOPY: {\n\t\t\tint lineStart = pdoc->LineFromPosition(SelectionStart().Position());\n\t\t\tint lineEnd = pdoc->LineFromPosition(SelectionEnd().Position());\n\t\t\tCopyRangeToClipboard(pdoc->LineStart(lineStart),\n\t\t\t        pdoc->LineStart(lineEnd + 1));\n\t\t}\n\t\tbreak;\n\tcase SCI_LINECUT: {\n\t\t\tint lineStart = pdoc->LineFromPosition(SelectionStart().Position());\n\t\t\tint lineEnd = pdoc->LineFromPosition(SelectionEnd().Position());\n\t\t\tint start = pdoc->LineStart(lineStart);\n\t\t\tint end = pdoc->LineStart(lineEnd + 1);\n\t\t\tSetSelection(start, end);\n\t\t\tCut();\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tbreak;\n\tcase SCI_LINEDELETE: {\n\t\t\tint line = pdoc->LineFromPosition(sel.MainCaret());\n\t\t\tint start = pdoc->LineStart(line);\n\t\t\tint end = pdoc->LineStart(line + 1);\n\t\t\tpdoc->DeleteChars(start, end - start);\n\t\t}\n\t\tbreak;\n\tcase SCI_LINETRANSPOSE:\n\t\tLineTranspose();\n\t\tbreak;\n\tcase SCI_LINEDUPLICATE:\n\t\tDuplicate(true);\n\t\tbreak;\n\tcase SCI_SELECTIONDUPLICATE:\n\t\tDuplicate(false);\n\t\tbreak;\n\tcase SCI_LOWERCASE:\n\t\tChangeCaseOfSelection(cmLower);\n\t\tbreak;\n\tcase SCI_UPPERCASE:\n\t\tChangeCaseOfSelection(cmUpper);\n\t\tbreak;\n\tcase SCI_WORDPARTLEFT:\n\t\tMovePositionTo(MovePositionSoVisible(pdoc->WordPartLeft(sel.MainCaret()), -1));\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_WORDPARTLEFTEXTEND:\n\t\tMovePositionTo(MovePositionSoVisible(pdoc->WordPartLeft(sel.MainCaret()), -1), Selection::selStream);\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_WORDPARTRIGHT:\n\t\tMovePositionTo(MovePositionSoVisible(pdoc->WordPartRight(sel.MainCaret()), 1));\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_WORDPARTRIGHTEXTEND:\n\t\tMovePositionTo(MovePositionSoVisible(pdoc->WordPartRight(sel.MainCaret()), 1), Selection::selStream);\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_HOMEDISPLAY:\n\t\tMovePositionTo(MovePositionSoVisible(\n\t\t            StartEndDisplayLine(sel.MainCaret(), true), -1));\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_VCHOMEDISPLAY: {\n\t\t\tSelectionPosition homePos = SelectionPosition(pdoc->VCHomePosition(sel.MainCaret()));\n\t\t\tSelectionPosition viewLineStart = MovePositionSoVisible(StartEndDisplayLine(sel.MainCaret(), true), -1);\n\t\t\tif (viewLineStart > homePos)\n\t\t\t\thomePos = viewLineStart;\n\n\t\t\tMovePositionTo(homePos);\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tbreak;\n\tcase SCI_HOMEDISPLAYEXTEND:\n\t\tMovePositionTo(MovePositionSoVisible(\n\t\t            StartEndDisplayLine(sel.MainCaret(), true), -1), Selection::selStream);\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_VCHOMEDISPLAYEXTEND: {\n\t\t\tSelectionPosition homePos = SelectionPosition(pdoc->VCHomePosition(sel.MainCaret()));\n\t\t\tSelectionPosition viewLineStart = MovePositionSoVisible(StartEndDisplayLine(sel.MainCaret(), true), -1);\n\t\t\tif (viewLineStart > homePos)\n\t\t\t\thomePos = viewLineStart;\n\n\t\t\tMovePositionTo(homePos, Selection::selStream);\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tbreak;\n\tcase SCI_LINEENDDISPLAY:\n\t\tMovePositionTo(MovePositionSoVisible(\n\t\t            StartEndDisplayLine(sel.MainCaret(), false), 1));\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_LINEENDDISPLAYEXTEND:\n\t\tMovePositionTo(MovePositionSoVisible(\n\t\t            StartEndDisplayLine(sel.MainCaret(), false), 1), Selection::selStream);\n\t\tSetLastXChosen();\n\t\tbreak;\n\tcase SCI_SCROLLTOSTART:\n\t\tScrollTo(0);\n\t\tbreak;\n\tcase SCI_SCROLLTOEND:\n\t\tScrollTo(MaxScrollPos());\n\t\tbreak;\n\t}\n\treturn 0;\n}\n\nint Editor::KeyDefault(int, int) {\n\treturn 0;\n}\n\nint Editor::KeyDownWithModifiers(int key, int modifiers, bool *consumed) {\n\tDwellEnd(false);\n\tint msg = kmap.Find(key, modifiers);\n\tif (msg) {\n\t\tif (consumed)\n\t\t\t*consumed = true;\n\t\treturn WndProc(msg, 0, 0);\n\t} else {\n\t\tif (consumed)\n\t\t\t*consumed = false;\n\t\treturn KeyDefault(key, modifiers);\n\t}\n}\n\nint Editor::KeyDown(int key, bool shift, bool ctrl, bool alt, bool *consumed) {\n\tint modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) |\n\t        (alt ? SCI_ALT : 0);\n\treturn KeyDownWithModifiers(key, modifiers, consumed);\n}\n\nvoid Editor::Indent(bool forwards) {\n\tUndoGroup ug(pdoc);\n\tfor (size_t r=0; r<sel.Count(); r++) {\n\t\tint lineOfAnchor = pdoc->LineFromPosition(sel.Range(r).anchor.Position());\n\t\tint caretPosition = sel.Range(r).caret.Position();\n\t\tint lineCurrentPos = pdoc->LineFromPosition(caretPosition);\n\t\tif (lineOfAnchor == lineCurrentPos) {\n\t\t\tif (forwards) {\n\t\t\t\tpdoc->DeleteChars(sel.Range(r).Start().Position(), sel.Range(r).Length());\n\t\t\t\tcaretPosition = sel.Range(r).caret.Position();\n\t\t\t\tif (pdoc->GetColumn(caretPosition) <= pdoc->GetColumn(pdoc->GetLineIndentPosition(lineCurrentPos)) &&\n\t\t\t\t\t\tpdoc->tabIndents) {\n\t\t\t\t\tint indentation = pdoc->GetLineIndentation(lineCurrentPos);\n\t\t\t\t\tint indentationStep = pdoc->IndentSize();\n\t\t\t\t\tpdoc->SetLineIndentation(lineCurrentPos, indentation + indentationStep - indentation % indentationStep);\n\t\t\t\t\tsel.Range(r) = SelectionRange(pdoc->GetLineIndentPosition(lineCurrentPos));\n\t\t\t\t} else {\n\t\t\t\t\tif (pdoc->useTabs) {\n\t\t\t\t\t\tpdoc->InsertChar(caretPosition, '\\t');\n\t\t\t\t\t\tsel.Range(r) = SelectionRange(caretPosition+1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tint numSpaces = (pdoc->tabInChars) -\n\t\t\t\t\t\t\t\t(pdoc->GetColumn(caretPosition) % (pdoc->tabInChars));\n\t\t\t\t\t\tif (numSpaces < 1)\n\t\t\t\t\t\t\tnumSpaces = pdoc->tabInChars;\n\t\t\t\t\t\tfor (int i = 0; i < numSpaces; i++) {\n\t\t\t\t\t\t\tpdoc->InsertChar(caretPosition + i, ' ');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsel.Range(r) = SelectionRange(caretPosition+numSpaces);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (pdoc->GetColumn(caretPosition) <= pdoc->GetLineIndentation(lineCurrentPos) &&\n\t\t\t\t\t\tpdoc->tabIndents) {\n\t\t\t\t\tint indentation = pdoc->GetLineIndentation(lineCurrentPos);\n\t\t\t\t\tint indentationStep = pdoc->IndentSize();\n\t\t\t\t\tpdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep);\n\t\t\t\t\tsel.Range(r) = SelectionRange(pdoc->GetLineIndentPosition(lineCurrentPos));\n\t\t\t\t} else {\n\t\t\t\t\tint newColumn = ((pdoc->GetColumn(caretPosition) - 1) / pdoc->tabInChars) *\n\t\t\t\t\t\t\tpdoc->tabInChars;\n\t\t\t\t\tif (newColumn < 0)\n\t\t\t\t\t\tnewColumn = 0;\n\t\t\t\t\tint newPos = caretPosition;\n\t\t\t\t\twhile (pdoc->GetColumn(newPos) > newColumn)\n\t\t\t\t\t\tnewPos--;\n\t\t\t\t\tsel.Range(r) = SelectionRange(newPos);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\t// Multiline\n\t\t\tint anchorPosOnLine = sel.Range(r).anchor.Position() - pdoc->LineStart(lineOfAnchor);\n\t\t\tint currentPosPosOnLine = caretPosition - pdoc->LineStart(lineCurrentPos);\n\t\t\t// Multiple lines selected so indent / dedent\n\t\t\tint lineTopSel = Platform::Minimum(lineOfAnchor, lineCurrentPos);\n\t\t\tint lineBottomSel = Platform::Maximum(lineOfAnchor, lineCurrentPos);\n\t\t\tif (pdoc->LineStart(lineBottomSel) == sel.Range(r).anchor.Position() || pdoc->LineStart(lineBottomSel) == caretPosition)\n\t\t\t\tlineBottomSel--;  \t// If not selecting any characters on a line, do not indent\n\t\t\tpdoc->Indent(forwards, lineBottomSel, lineTopSel);\n\t\t\tif (lineOfAnchor < lineCurrentPos) {\n\t\t\t\tif (currentPosPosOnLine == 0)\n\t\t\t\t\tsel.Range(r) = SelectionRange(pdoc->LineStart(lineCurrentPos), pdoc->LineStart(lineOfAnchor));\n\t\t\t\telse\n\t\t\t\t\tsel.Range(r) = SelectionRange(pdoc->LineStart(lineCurrentPos + 1), pdoc->LineStart(lineOfAnchor));\n\t\t\t} else {\n\t\t\t\tif (anchorPosOnLine == 0)\n\t\t\t\t\tsel.Range(r) = SelectionRange(pdoc->LineStart(lineCurrentPos), pdoc->LineStart(lineOfAnchor));\n\t\t\t\telse\n\t\t\t\t\tsel.Range(r) = SelectionRange(pdoc->LineStart(lineCurrentPos), pdoc->LineStart(lineOfAnchor + 1));\n\t\t\t}\n\t\t}\n\t}\n}\n\nclass CaseFolderASCII : public CaseFolderTable {\npublic:\n\tCaseFolderASCII() {\n\t\tStandardASCII();\n\t}\n\t~CaseFolderASCII() {\n\t}\n};\n\n\nCaseFolder *Editor::CaseFolderForEncoding() {\n\t// Simple default that only maps ASCII upper case to lower case.\n\treturn new CaseFolderASCII();\n}\n\n/**\n * Search of a text in the document, in the given range.\n * @return The position of the found text, -1 if not found.\n */\nlong Editor::FindText(\n    uptr_t wParam,\t\t///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,\n    ///< @c SCFIND_WORDSTART, @c SCFIND_REGEXP or @c SCFIND_POSIX.\n    sptr_t lParam) {\t///< @c TextToFind structure: The text to search for in the given range.\n\n\tSci_TextToFind *ft = reinterpret_cast<Sci_TextToFind *>(lParam);\n\tint lengthFound = istrlen(ft->lpstrText);\n\tif (!pdoc->HasCaseFolder())\n\t\tpdoc->SetCaseFolder(CaseFolderForEncoding());\n\tint pos = pdoc->FindText(ft->chrg.cpMin, ft->chrg.cpMax, ft->lpstrText,\n\t        (wParam & SCFIND_MATCHCASE) != 0,\n\t        (wParam & SCFIND_WHOLEWORD) != 0,\n\t        (wParam & SCFIND_WORDSTART) != 0,\n\t        (wParam & SCFIND_REGEXP) != 0,\n\t        wParam,\n\t        &lengthFound);\n\tif (pos != -1) {\n\t\tft->chrgText.cpMin = pos;\n\t\tft->chrgText.cpMax = pos + lengthFound;\n\t}\n\treturn pos;\n}\n\n/**\n * Relocatable search support : Searches relative to current selection\n * point and sets the selection to the found text range with\n * each search.\n */\n/**\n * Anchor following searches at current selection start: This allows\n * multiple incremental interactive searches to be macro recorded\n * while still setting the selection to found text so the find/select\n * operation is self-contained.\n */\nvoid Editor::SearchAnchor() {\n\tsearchAnchor = SelectionStart().Position();\n}\n\n/**\n * Find text from current search anchor: Must call @c SearchAnchor first.\n * Used for next text and previous text requests.\n * @return The position of the found text, -1 if not found.\n */\nlong Editor::SearchText(\n    unsigned int iMessage,\t\t///< Accepts both @c SCI_SEARCHNEXT and @c SCI_SEARCHPREV.\n    uptr_t wParam,\t\t\t\t///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,\n    ///< @c SCFIND_WORDSTART, @c SCFIND_REGEXP or @c SCFIND_POSIX.\n    sptr_t lParam) {\t\t\t///< The text to search for.\n\n\tconst char *txt = reinterpret_cast<char *>(lParam);\n\tint pos;\n\tint lengthFound = istrlen(txt);\n\tif (!pdoc->HasCaseFolder())\n\t\tpdoc->SetCaseFolder(CaseFolderForEncoding());\n\tif (iMessage == SCI_SEARCHNEXT) {\n\t\tpos = pdoc->FindText(searchAnchor, pdoc->Length(), txt,\n\t\t        (wParam & SCFIND_MATCHCASE) != 0,\n\t\t        (wParam & SCFIND_WHOLEWORD) != 0,\n\t\t        (wParam & SCFIND_WORDSTART) != 0,\n\t\t        (wParam & SCFIND_REGEXP) != 0,\n\t\t        wParam,\n\t\t        &lengthFound);\n\t} else {\n\t\tpos = pdoc->FindText(searchAnchor, 0, txt,\n\t\t        (wParam & SCFIND_MATCHCASE) != 0,\n\t\t        (wParam & SCFIND_WHOLEWORD) != 0,\n\t\t        (wParam & SCFIND_WORDSTART) != 0,\n\t\t        (wParam & SCFIND_REGEXP) != 0,\n\t\t        wParam,\n\t\t        &lengthFound);\n\t}\n\tif (pos != -1) {\n\t\tSetSelection(pos, pos + lengthFound);\n\t}\n\n\treturn pos;\n}\n\nstd::string Editor::CaseMapString(const std::string &s, int caseMapping) {\n\tstd::string ret(s);\n\tfor (size_t i=0; i<ret.size(); i++) {\n\t\tswitch (caseMapping) {\n\t\t\tcase cmUpper:\n\t\t\t\tif (ret[i] >= 'a' && ret[i] <= 'z')\n\t\t\t\t\tret[i] = static_cast<char>(ret[i] - 'a' + 'A');\n\t\t\t\tbreak;\n\t\t\tcase cmLower:\n\t\t\t\tif (ret[i] >= 'A' && ret[i] <= 'Z')\n\t\t\t\t\tret[i] = static_cast<char>(ret[i] - 'A' + 'a');\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn ret;\n}\n\n/**\n * Search for text in the target range of the document.\n * @return The position of the found text, -1 if not found.\n */\nlong Editor::SearchInTarget(const char *text, int length) {\n\tint lengthFound = length;\n\n\tif (!pdoc->HasCaseFolder())\n\t\tpdoc->SetCaseFolder(CaseFolderForEncoding());\n\tint pos = pdoc->FindText(targetStart, targetEnd, text,\n\t        (searchFlags & SCFIND_MATCHCASE) != 0,\n\t        (searchFlags & SCFIND_WHOLEWORD) != 0,\n\t        (searchFlags & SCFIND_WORDSTART) != 0,\n\t        (searchFlags & SCFIND_REGEXP) != 0,\n\t        searchFlags,\n\t        &lengthFound);\n\tif (pos != -1) {\n\t\ttargetStart = pos;\n\t\ttargetEnd = pos + lengthFound;\n\t}\n\treturn pos;\n}\n\nvoid Editor::GoToLine(int lineNo) {\n\tif (lineNo > pdoc->LinesTotal())\n\t\tlineNo = pdoc->LinesTotal();\n\tif (lineNo < 0)\n\t\tlineNo = 0;\n\tSetEmptySelection(pdoc->LineStart(lineNo));\n\tShowCaretAtCurrentPosition();\n\tEnsureCaretVisible();\n}\n\nstatic bool Close(Point pt1, Point pt2) {\n\tif (abs(pt1.x - pt2.x) > 3)\n\t\treturn false;\n\tif (abs(pt1.y - pt2.y) > 3)\n\t\treturn false;\n\treturn true;\n}\n\nstd::string Editor::RangeText(int start, int end) const {\n\tif (start < end) {\n\t\tint len = end - start;\n\t\tstd::string ret(len, '\\0');\n\t\tfor (int i = 0; i < len; i++) {\n\t\t\tret[i] = pdoc->CharAt(start + i);\n\t\t}\n\t\treturn ret;\n\t}\n\treturn std::string();\n}\n\nvoid Editor::CopySelectionRange(SelectionText *ss, bool allowLineCopy) {\n\tif (sel.Empty()) {\n\t\tif (allowLineCopy) {\n\t\t\tint currentLine = pdoc->LineFromPosition(sel.MainCaret());\n\t\t\tint start = pdoc->LineStart(currentLine);\n\t\t\tint end = pdoc->LineEnd(currentLine);\n\n\t\t\tstd::string text = RangeText(start, end);\n\t\t\tif (pdoc->eolMode != SC_EOL_LF)\n\t\t\t\ttext.push_back('\\r');\n\t\t\tif (pdoc->eolMode != SC_EOL_CR)\n\t\t\t\ttext.push_back('\\n');\n\t\t\tss->Copy(text, pdoc->dbcsCodePage,\n\t\t\t\tvs.styles[STYLE_DEFAULT].characterSet, false, true);\n\t\t}\n\t} else {\n\t\tstd::string text;\n\t\tstd::vector<SelectionRange> rangesInOrder = sel.RangesCopy();\n\t\tif (sel.selType == Selection::selRectangle)\n\t\t\tstd::sort(rangesInOrder.begin(), rangesInOrder.end());\n\t\tfor (size_t r=0; r<rangesInOrder.size(); r++) {\n\t\t\tSelectionRange current = rangesInOrder[r];\n\t\t\ttext.append(RangeText(current.Start().Position(), current.End().Position()));\n\t\t\tif (sel.selType == Selection::selRectangle) {\n\t\t\t\tif (pdoc->eolMode != SC_EOL_LF)\n\t\t\t\t\ttext.push_back('\\r');\n\t\t\t\tif (pdoc->eolMode != SC_EOL_CR)\n\t\t\t\t\ttext.push_back('\\n');\n\t\t\t}\n\t\t}\n\t\tss->Copy(text, pdoc->dbcsCodePage,\n\t\t\tvs.styles[STYLE_DEFAULT].characterSet, sel.IsRectangular(), sel.selType == Selection::selLines);\n\t}\n}\n\nvoid Editor::CopyRangeToClipboard(int start, int end) {\n\tstart = pdoc->ClampPositionIntoDocument(start);\n\tend = pdoc->ClampPositionIntoDocument(end);\n\tSelectionText selectedText;\n\tstd::string text = RangeText(start, end);\n\tselectedText.Copy(text,\n\t\tpdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, false, false);\n\tCopyToClipboard(selectedText);\n}\n\nvoid Editor::CopyText(int length, const char *text) {\n\tSelectionText selectedText;\n\tselectedText.Copy(std::string(text, length),\n\t\tpdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, false, false);\n\tCopyToClipboard(selectedText);\n}\n\nvoid Editor::SetDragPosition(SelectionPosition newPos) {\n\tif (newPos.Position() >= 0) {\n\t\tnewPos = MovePositionOutsideChar(newPos, 1);\n\t\tposDrop = newPos;\n\t}\n\tif (!(posDrag == newPos)) {\n\t\tcaret.on = true;\n\t\tSetTicking(true);\n\t\tInvalidateCaret();\n\t\tposDrag = newPos;\n\t\tInvalidateCaret();\n\t}\n}\n\nvoid Editor::DisplayCursor(Window::Cursor c) {\n\tif (cursorMode == SC_CURSORNORMAL)\n\t\twMain.SetCursor(c);\n\telse\n\t\twMain.SetCursor(static_cast<Window::Cursor>(cursorMode));\n}\n\nbool Editor::DragThreshold(Point ptStart, Point ptNow) {\n\tint xMove = ptStart.x - ptNow.x;\n\tint yMove = ptStart.y - ptNow.y;\n\tint distanceSquared = xMove * xMove + yMove * yMove;\n\treturn distanceSquared > 16;\n}\n\nvoid Editor::StartDrag() {\n\t// Always handled by subclasses\n\t//SetMouseCapture(true);\n\t//DisplayCursor(Window::cursorArrow);\n}\n\nvoid Editor::DropAt(SelectionPosition position, const char *value, size_t lengthValue, bool moving, bool rectangular) {\n\t//Platform::DebugPrintf(\"DropAt %d %d\\n\", inDragDrop, position);\n\tif (inDragDrop == ddDragging)\n\t\tdropWentOutside = false;\n\n\tbool positionWasInSelection = PositionInSelection(position.Position());\n\n\tbool positionOnEdgeOfSelection =\n\t    (position == SelectionStart()) || (position == SelectionEnd());\n\n\tif ((inDragDrop != ddDragging) || !(positionWasInSelection) ||\n\t        (positionOnEdgeOfSelection && !moving)) {\n\n\t\tSelectionPosition selStart = SelectionStart();\n\t\tSelectionPosition selEnd = SelectionEnd();\n\n\t\tUndoGroup ug(pdoc);\n\n\t\tSelectionPosition positionAfterDeletion = position;\n\t\tif ((inDragDrop == ddDragging) && moving) {\n\t\t\t// Remove dragged out text\n\t\t\tif (rectangular || sel.selType == Selection::selLines) {\n\t\t\t\tfor (size_t r=0; r<sel.Count(); r++) {\n\t\t\t\t\tif (position >= sel.Range(r).Start()) {\n\t\t\t\t\t\tif (position > sel.Range(r).End()) {\n\t\t\t\t\t\t\tpositionAfterDeletion.Add(-sel.Range(r).Length());\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpositionAfterDeletion.Add(-SelectionRange(position, sel.Range(r).Start()).Length());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (position > selStart) {\n\t\t\t\t\tpositionAfterDeletion.Add(-SelectionRange(selEnd, selStart).Length());\n\t\t\t\t}\n\t\t\t}\n\t\t\tClearSelection();\n\t\t}\n\t\tposition = positionAfterDeletion;\n\n\t\tif (rectangular) {\n\t\t\tPasteRectangular(position, value, static_cast<int>(lengthValue));\n\t\t\t// Should try to select new rectangle but it may not be a rectangle now so just select the drop position\n\t\t\tSetEmptySelection(position);\n\t\t} else {\n\t\t\tposition = MovePositionOutsideChar(position, sel.MainCaret() - position.Position());\n\t\t\tposition = SelectionPosition(InsertSpace(position.Position(), position.VirtualSpace()));\n\t\t\tif (pdoc->InsertString(position.Position(), value, static_cast<int>(lengthValue))) {\n\t\t\t\tSelectionPosition posAfterInsertion = position;\n\t\t\t\tposAfterInsertion.Add(static_cast<int>(lengthValue));\n\t\t\t\tSetSelection(posAfterInsertion, position);\n\t\t\t}\n\t\t}\n\t} else if (inDragDrop == ddDragging) {\n\t\tSetEmptySelection(position);\n\t}\n}\n\nvoid Editor::DropAt(SelectionPosition position, const char *value, bool moving, bool rectangular) {\n\tDropAt(position, value, strlen(value), moving, rectangular);\n}\n\n/**\n * @return true if given position is inside the selection,\n */\nbool Editor::PositionInSelection(int pos) {\n\tpos = MovePositionOutsideChar(pos, sel.MainCaret() - pos);\n\tfor (size_t r=0; r<sel.Count(); r++) {\n\t\tif (sel.Range(r).Contains(pos))\n\t\t\treturn true;\n\t}\n\treturn false;\n}\n\nbool Editor::PointInSelection(Point pt) {\n\tSelectionPosition pos = SPositionFromLocation(pt, false, true);\n\tPoint ptPos = LocationFromPosition(pos);\n\tfor (size_t r=0; r<sel.Count(); r++) {\n\t\tSelectionRange range = sel.Range(r);\n\t\tif (range.Contains(pos)) {\n\t\t\tbool hit = true;\n\t\t\tif (pos == range.Start()) {\n\t\t\t\t// see if just before selection\n\t\t\t\tif (pt.x < ptPos.x) {\n\t\t\t\t\thit = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pos == range.End()) {\n\t\t\t\t// see if just after selection\n\t\t\t\tif (pt.x > ptPos.x) {\n\t\t\t\t\thit = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (hit)\n\t\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nbool Editor::PointInSelMargin(Point pt) {\n\t// Really means: \"Point in a margin\"\n\tif (vs.fixedColumnWidth > 0) {\t// There is a margin\n\t\tPRectangle rcSelMargin = GetClientRectangle();\n\t\trcSelMargin.right = vs.textStart - vs.leftMarginWidth;\n\t\trcSelMargin.left = vs.textStart - vs.fixedColumnWidth;\n\t\treturn rcSelMargin.Contains(pt);\n\t} else {\n\t\treturn false;\n\t}\n}\n\nWindow::Cursor Editor::GetMarginCursor(Point pt) const {\n\tint x = 0;\n\tfor (int margin = 0; margin <= SC_MAX_MARGIN; margin++) {\n\t\tif ((pt.x >= x) && (pt.x < x + vs.ms[margin].width))\n\t\t\treturn static_cast<Window::Cursor>(vs.ms[margin].cursor);\n\t\tx += vs.ms[margin].width;\n\t}\n\treturn Window::cursorReverseArrow;\n}\n\nvoid Editor::TrimAndSetSelection(int currentPos_, int anchor_) {\n\tsel.TrimSelection(SelectionRange(currentPos_, anchor_));\n\tSetSelection(currentPos_, anchor_);\n}\n\nvoid Editor::LineSelection(int lineCurrentPos_, int lineAnchorPos_, bool wholeLine) {\n\tint selCurrentPos, selAnchorPos;\n\tif (wholeLine) {\n\t\tint lineCurrent_ = pdoc->LineFromPosition(lineCurrentPos_);\n\t\tint lineAnchor_ = pdoc->LineFromPosition(lineAnchorPos_);\n\t\tif (lineAnchorPos_ < lineCurrentPos_) {\n\t\t\tselCurrentPos = pdoc->LineStart(lineCurrent_ + 1);\n\t\t\tselAnchorPos = pdoc->LineStart(lineAnchor_);\n\t\t} else if (lineAnchorPos_ > lineCurrentPos_) {\n\t\t\tselCurrentPos = pdoc->LineStart(lineCurrent_);\n\t\t\tselAnchorPos = pdoc->LineStart(lineAnchor_ + 1);\n\t\t} else { // Same line, select it\n\t\t\tselCurrentPos = pdoc->LineStart(lineAnchor_ + 1);\n\t\t\tselAnchorPos = pdoc->LineStart(lineAnchor_);\n\t\t}\n\t} else {\n\t\tif (lineAnchorPos_ < lineCurrentPos_) {\n\t\t\tselCurrentPos = StartEndDisplayLine(lineCurrentPos_, false) + 1;\n\t\t\tselCurrentPos = pdoc->MovePositionOutsideChar(selCurrentPos, 1);\n\t\t\tselAnchorPos = StartEndDisplayLine(lineAnchorPos_, true);\n\t\t} else if (lineAnchorPos_ > lineCurrentPos_) {\n\t\t\tselCurrentPos = StartEndDisplayLine(lineCurrentPos_, true);\n\t\t\tselAnchorPos = StartEndDisplayLine(lineAnchorPos_, false) + 1;\n\t\t\tselAnchorPos = pdoc->MovePositionOutsideChar(selAnchorPos, 1);\n\t\t} else { // Same line, select it\n\t\t\tselCurrentPos = StartEndDisplayLine(lineAnchorPos_, false) + 1;\n\t\t\tselCurrentPos = pdoc->MovePositionOutsideChar(selCurrentPos, 1);\n\t\t\tselAnchorPos = StartEndDisplayLine(lineAnchorPos_, true);\n\t\t}\n\t}\n\tTrimAndSetSelection(selCurrentPos, selAnchorPos);\n}\n\nvoid Editor::WordSelection(int pos) {\n\tif (pos < wordSelectAnchorStartPos) {\n\t\t// Extend backward to the word containing pos.\n\t\t// Skip ExtendWordSelect if the line is empty or if pos is after the last character.\n\t\t// This ensures that a series of empty lines isn't counted as a single \"word\".\n\t\tif (!pdoc->IsLineEndPosition(pos))\n\t\t\tpos = pdoc->ExtendWordSelect(pdoc->MovePositionOutsideChar(pos + 1, 1), -1);\n\t\tTrimAndSetSelection(pos, wordSelectAnchorEndPos);\n\t} else if (pos > wordSelectAnchorEndPos) {\n\t\t// Extend forward to the word containing the character to the left of pos.\n\t\t// Skip ExtendWordSelect if the line is empty or if pos is the first position on the line.\n\t\t// This ensures that a series of empty lines isn't counted as a single \"word\".\n\t\tif (pos > pdoc->LineStart(pdoc->LineFromPosition(pos)))\n\t\t\tpos = pdoc->ExtendWordSelect(pdoc->MovePositionOutsideChar(pos - 1, -1), 1);\n\t\tTrimAndSetSelection(pos, wordSelectAnchorStartPos);\n\t} else {\n\t\t// Select only the anchored word\n\t\tif (pos >= originalAnchorPos)\n\t\t\tTrimAndSetSelection(wordSelectAnchorEndPos, wordSelectAnchorStartPos);\n\t\telse\n\t\t\tTrimAndSetSelection(wordSelectAnchorStartPos, wordSelectAnchorEndPos);\n\t}\n}\n\nvoid Editor::DwellEnd(bool mouseMoved) {\n\tif (mouseMoved)\n\t\tticksToDwell = dwellDelay;\n\telse\n\t\tticksToDwell = SC_TIME_FOREVER;\n\tif (dwelling && (dwellDelay < SC_TIME_FOREVER)) {\n\t\tdwelling = false;\n\t\tNotifyDwelling(ptMouseLast, dwelling);\n\t}\n}\n\nvoid Editor::MouseLeave() {\n\tSetHotSpotRange(NULL);\n\tif (!HaveMouseCapture()) {\n\t\tptMouseLast = Point(-1,-1);\n\t\tDwellEnd(true);\n\t}\n}\n\nstatic bool AllowVirtualSpace(int virtualSpaceOptions, bool rectangular) {\n\treturn (!rectangular && ((virtualSpaceOptions & SCVS_USERACCESSIBLE) != 0))\n\t\t|| (rectangular && ((virtualSpaceOptions & SCVS_RECTANGULARSELECTION) != 0));\n}\n\nvoid Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) {\n\t//Platform::DebugPrintf(\"ButtonDown %d %d = %d alt=%d %d\\n\", curTime, lastClickTime, curTime - lastClickTime, alt, inDragDrop);\n\tptMouseLast = pt;\n\tSelectionPosition newPos = SPositionFromLocation(pt, false, false, AllowVirtualSpace(virtualSpaceOptions, alt));\n\tnewPos = MovePositionOutsideChar(newPos, sel.MainCaret() - newPos.Position());\n\tinDragDrop = ddNone;\n\tsel.SetMoveExtends(false);\n\n\tif (NotifyMarginClick(pt, shift, ctrl, alt))\n\t\treturn;\n\n\tNotifyIndicatorClick(true, newPos.Position(), shift, ctrl, alt);\n\n\tbool inSelMargin = PointInSelMargin(pt);\n\t// In margin ctrl+(double)click should always select everything\n\tif (ctrl && inSelMargin) {\n\t\tSelectAll();\n\t\tlastClickTime = curTime;\n\t\tlastClick = pt;\n\t\treturn;\n\t}\n\tif (shift && !inSelMargin) {\n\t\tSetSelection(newPos);\n\t}\n\tif (((curTime - lastClickTime) < Platform::DoubleClickTime()) && Close(pt, lastClick)) {\n\t\t//Platform::DebugPrintf(\"Double click %d %d = %d\\n\", curTime, lastClickTime, curTime - lastClickTime);\n\t\tSetMouseCapture(true);\n\t\tif (!ctrl || !multipleSelection || (selectionType != selChar && selectionType != selWord))\n\t\t\tSetEmptySelection(newPos.Position());\n\t\tbool doubleClick = false;\n\t\t// Stop mouse button bounce changing selection type\n\t\tif (!Platform::MouseButtonBounce() || curTime != lastClickTime) {\n\t\t\tif (inSelMargin) {\n\t\t\t\t// Inside margin selection type should be either selSubLine or selWholeLine.\n\t\t\t\tif (selectionType == selSubLine) {\n\t\t\t\t\t// If it is selSubLine, we're inside a *double* click and word wrap is enabled,\n\t\t\t\t\t// so we switch to selWholeLine in order to select whole line.\n\t\t\t\t\tselectionType = selWholeLine;\n\t\t\t\t} else if (selectionType != selSubLine && selectionType != selWholeLine) {\n\t\t\t\t\t// If it is neither, reset selection type to line selection.\n\t\t\t\t\tselectionType = (Wrapping() && (marginOptions & SC_MARGINOPTION_SUBLINESELECT)) ? selSubLine : selWholeLine;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (selectionType == selChar) {\n\t\t\t\t\tselectionType = selWord;\n\t\t\t\t\tdoubleClick = true;\n\t\t\t\t} else if (selectionType == selWord) {\n\t\t\t\t\t// Since we ended up here, we're inside a *triple* click, which should always select\n\t\t\t\t\t// whole line irregardless of word wrap being enabled or not.\n\t\t\t\t\tselectionType = selWholeLine;\n\t\t\t\t} else {\n\t\t\t\t\tselectionType = selChar;\n\t\t\t\t\toriginalAnchorPos = sel.MainCaret();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (selectionType == selWord) {\n\t\t\tint charPos = originalAnchorPos;\n\t\t\tif (sel.MainCaret() == originalAnchorPos) {\n\t\t\t\tcharPos = PositionFromLocation(pt, false, true);\n\t\t\t\tcharPos = MovePositionOutsideChar(charPos, -1);\n\t\t\t}\n\n\t\t\tint startWord, endWord;\n\t\t\tif ((sel.MainCaret() >= originalAnchorPos) && !pdoc->IsLineEndPosition(charPos)) {\n\t\t\t\tstartWord = pdoc->ExtendWordSelect(pdoc->MovePositionOutsideChar(charPos + 1, 1), -1);\n\t\t\t\tendWord = pdoc->ExtendWordSelect(charPos, 1);\n\t\t\t} else {\n\t\t\t\t// Selecting backwards, or anchor beyond last character on line. In these cases,\n\t\t\t\t// we select the word containing the character to the *left* of the anchor.\n\t\t\t\tif (charPos > pdoc->LineStart(pdoc->LineFromPosition(charPos))) {\n\t\t\t\t\tstartWord = pdoc->ExtendWordSelect(charPos, -1);\n\t\t\t\t\tendWord = pdoc->ExtendWordSelect(startWord, 1);\n\t\t\t\t} else {\n\t\t\t\t\t// Anchor at start of line; select nothing to begin with.\n\t\t\t\t\tstartWord = charPos;\n\t\t\t\t\tendWord = charPos;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twordSelectAnchorStartPos = startWord;\n\t\t\twordSelectAnchorEndPos = endWord;\n\t\t\twordSelectInitialCaretPos = sel.MainCaret();\n\t\t\tWordSelection(wordSelectInitialCaretPos);\n\t\t} else if (selectionType == selSubLine || selectionType == selWholeLine) {\n\t\t\tlineAnchorPos = newPos.Position();\n\t\t\tLineSelection(lineAnchorPos, lineAnchorPos, selectionType == selWholeLine);\n\t\t\t//Platform::DebugPrintf(\"Triple click: %d - %d\\n\", anchor, currentPos);\n\t\t} else {\n\t\t\tSetEmptySelection(sel.MainCaret());\n\t\t}\n\t\t//Platform::DebugPrintf(\"Double click: %d - %d\\n\", anchor, currentPos);\n\t\tif (doubleClick) {\n\t\t\tNotifyDoubleClick(pt, shift, ctrl, alt);\n\t\t\tif (PositionIsHotspot(newPos.Position()))\n\t\t\t\tNotifyHotSpotDoubleClicked(newPos.Position(), shift, ctrl, alt);\n\t\t}\n\t} else {\t// Single click\n\t\tif (inSelMargin) {\n\t\t\tsel.selType = Selection::selStream;\n\t\t\tif (!shift) {\n\t\t\t\t// Single click in margin: select whole line or only subline if word wrap is enabled\n\t\t\t\tlineAnchorPos = newPos.Position();\n\t\t\t\tselectionType = (Wrapping() && (marginOptions & SC_MARGINOPTION_SUBLINESELECT)) ? selSubLine : selWholeLine;\n\t\t\t\tLineSelection(lineAnchorPos, lineAnchorPos, selectionType == selWholeLine);\n\t\t\t} else {\n\t\t\t\t// Single shift+click in margin: select from line anchor to clicked line\n\t\t\t\tif (sel.MainAnchor() > sel.MainCaret())\n\t\t\t\t\tlineAnchorPos = sel.MainAnchor() - 1;\n\t\t\t\telse\n\t\t\t\t\tlineAnchorPos = sel.MainAnchor();\n\t\t\t\t// Reset selection type if there is an empty selection.\n\t\t\t\t// This ensures that we don't end up stuck in previous selection mode, which is no longer valid.\n\t\t\t\t// Otherwise, if there's a non empty selection, reset selection type only if it differs from selSubLine and selWholeLine.\n\t\t\t\t// This ensures that we continue selecting in the same selection mode.\n\t\t\t\tif (sel.Empty() || (selectionType != selSubLine && selectionType != selWholeLine))\n\t\t\t\t\tselectionType = (Wrapping() && (marginOptions & SC_MARGINOPTION_SUBLINESELECT)) ? selSubLine : selWholeLine;\n\t\t\t\tLineSelection(newPos.Position(), lineAnchorPos, selectionType == selWholeLine);\n\t\t\t}\n\n\t\t\tSetDragPosition(SelectionPosition(invalidPosition));\n\t\t\tSetMouseCapture(true);\n\t\t} else {\n\t\t\tif (PointIsHotspot(pt)) {\n\t\t\t\tNotifyHotSpotClicked(newPos.Position(), shift, ctrl, alt);\n\t\t\t\thotSpotClickPos = PositionFromLocation(pt,true,false);\n\t\t\t}\n\t\t\tif (!shift) {\n\t\t\t\tif (PointInSelection(pt) && !SelectionEmpty())\n\t\t\t\t\tinDragDrop = ddInitial;\n\t\t\t\telse\n\t\t\t\t\tinDragDrop = ddNone;\n\t\t\t}\n\t\t\tSetMouseCapture(true);\n\t\t\tif (inDragDrop != ddInitial) {\n\t\t\t\tSetDragPosition(SelectionPosition(invalidPosition));\n\t\t\t\tif (!shift) {\n\t\t\t\t\tif (ctrl && multipleSelection) {\n\t\t\t\t\t\tSelectionRange range(newPos);\n\t\t\t\t\t\tsel.TentativeSelection(range);\n\t\t\t\t\t\tInvalidateSelection(range, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tInvalidateSelection(SelectionRange(newPos), true);\n\t\t\t\t\t\tif (sel.Count() > 1)\n\t\t\t\t\t\t\tRedraw();\n\t\t\t\t\t\tif ((sel.Count() > 1) || (sel.selType != Selection::selStream))\n\t\t\t\t\t\t\tsel.Clear();\n\t\t\t\t\t\tsel.selType = alt ? Selection::selRectangle : Selection::selStream;\n\t\t\t\t\t\tSetSelection(newPos, newPos);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tSelectionPosition anchorCurrent = newPos;\n\t\t\t\tif (shift)\n\t\t\t\t\tanchorCurrent = sel.IsRectangular() ?\n\t\t\t\t\t\tsel.Rectangular().anchor : sel.RangeMain().anchor;\n\t\t\t\tsel.selType = alt ? Selection::selRectangle : Selection::selStream;\n\t\t\t\tselectionType = selChar;\n\t\t\t\toriginalAnchorPos = sel.MainCaret();\n\t\t\t\tsel.Rectangular() = SelectionRange(newPos, anchorCurrent);\n\t\t\t\tSetRectangularRange();\n\t\t\t}\n\t\t}\n\t}\n\tlastClickTime = curTime;\n\tlastClick = pt;\n\tlastXChosen = pt.x + xOffset;\n\tShowCaretAtCurrentPosition();\n}\n\nbool Editor::PositionIsHotspot(int position) const {\n\treturn vs.styles[pdoc->StyleAt(position) & pdoc->stylingBitsMask].hotspot;\n}\n\nbool Editor::PointIsHotspot(Point pt) {\n\tint pos = PositionFromLocation(pt, true);\n\tif (pos == INVALID_POSITION)\n\t\treturn false;\n\treturn PositionIsHotspot(pos);\n}\n\nvoid Editor::SetHotSpotRange(Point *pt) {\n\tif (pt) {\n\t\tint pos = PositionFromLocation(*pt);\n\n\t\t// If we don't limit this to word characters then the\n\t\t// range can encompass more than the run range and then\n\t\t// the underline will not be drawn properly.\n\t\tint hsStart_ = pdoc->ExtendStyleRange(pos, -1, vs.hotspotSingleLine);\n\t\tint hsEnd_ = pdoc->ExtendStyleRange(pos, 1, vs.hotspotSingleLine);\n\n\t\t// Only invalidate the range if the hotspot range has changed...\n\t\tif (hsStart_ != hsStart || hsEnd_ != hsEnd) {\n\t\t\tif (hsStart != -1) {\n\t\t\t\tInvalidateRange(hsStart, hsEnd);\n\t\t\t}\n\t\t\thsStart = hsStart_;\n\t\t\thsEnd = hsEnd_;\n\t\t\tInvalidateRange(hsStart, hsEnd);\n\t\t}\n\t} else {\n\t\tif (hsStart != -1) {\n\t\t\tint hsStart_ = hsStart;\n\t\t\tint hsEnd_ = hsEnd;\n\t\t\thsStart = -1;\n\t\t\thsEnd = -1;\n\t\t\tInvalidateRange(hsStart_, hsEnd_);\n\t\t} else {\n\t\t\thsStart = -1;\n\t\t\thsEnd = -1;\n\t\t}\n\t}\n}\n\nvoid Editor::GetHotSpotRange(int &hsStart_, int &hsEnd_) const {\n\thsStart_ = hsStart;\n\thsEnd_ = hsEnd;\n}\n\nvoid Editor::ButtonMoveWithModifiers(Point pt, int modifiers) {\n\tif ((ptMouseLast.x != pt.x) || (ptMouseLast.y != pt.y)) {\n\t\tDwellEnd(true);\n\t}\n\n\tSelectionPosition movePos = SPositionFromLocation(pt, false, false,\n\t\tAllowVirtualSpace(virtualSpaceOptions, sel.IsRectangular()));\n\tmovePos = MovePositionOutsideChar(movePos, sel.MainCaret() - movePos.Position());\n\n\tif (inDragDrop == ddInitial) {\n\t\tif (DragThreshold(ptMouseLast, pt)) {\n\t\t\tSetMouseCapture(false);\n\t\t\tSetDragPosition(movePos);\n\t\t\tCopySelectionRange(&drag);\n\t\t\tStartDrag();\n\t\t}\n\t\treturn;\n\t}\n\n\tptMouseLast = pt;\n\t//Platform::DebugPrintf(\"Move %d %d\\n\", pt.x, pt.y);\n\tif (HaveMouseCapture()) {\n\n\t\t// Slow down autoscrolling/selection\n\t\tautoScrollTimer.ticksToWait -= timer.tickSize;\n\t\tif (autoScrollTimer.ticksToWait > 0)\n\t\t\treturn;\n\t\tautoScrollTimer.ticksToWait = autoScrollDelay;\n\n\t\t// Adjust selection\n\t\tif (posDrag.IsValid()) {\n\t\t\tSetDragPosition(movePos);\n\t\t} else {\n\t\t\tif (selectionType == selChar) {\n\t\t\t\tif (sel.selType == Selection::selStream && (modifiers & SCI_ALT) && mouseSelectionRectangularSwitch) {\n\t\t\t\t\tsel.selType = Selection::selRectangle;\n\t\t\t\t}\n\t\t\t\tif (sel.IsRectangular()) {\n\t\t\t\t\tsel.Rectangular() = SelectionRange(movePos, sel.Rectangular().anchor);\n\t\t\t\t\tSetSelection(movePos, sel.RangeMain().anchor);\n\t\t\t\t} else if (sel.Count() > 1) {\n\t\t\t\t\tInvalidateSelection(sel.RangeMain(), false);\n\t\t\t\t\tSelectionRange range(movePos, sel.RangeMain().anchor);\n\t\t\t\t\tsel.TentativeSelection(range);\n\t\t\t\t\tInvalidateSelection(range, true);\n\t\t\t\t} else {\n\t\t\t\t\tSetSelection(movePos, sel.RangeMain().anchor);\n\t\t\t\t}\n\t\t\t} else if (selectionType == selWord) {\n\t\t\t\t// Continue selecting by word\n\t\t\t\tif (movePos.Position() == wordSelectInitialCaretPos) {  // Didn't move\n\t\t\t\t\t// No need to do anything. Previously this case was lumped\n\t\t\t\t\t// in with \"Moved forward\", but that can be harmful in this\n\t\t\t\t\t// case: a handler for the NotifyDoubleClick re-adjusts\n\t\t\t\t\t// the selection for a fancier definition of \"word\" (for\n\t\t\t\t\t// example, in Perl it is useful to include the leading\n\t\t\t\t\t// '$', '%' or '@' on variables for word selection). In this\n\t\t\t\t\t// the ButtonMove() called via Tick() for auto-scrolling\n\t\t\t\t\t// could result in the fancier word selection adjustment\n\t\t\t\t\t// being unmade.\n\t\t\t\t} else {\n\t\t\t\t\twordSelectInitialCaretPos = -1;\n\t\t\t\t\tWordSelection(movePos.Position());\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Continue selecting by line\n\t\t\t\tLineSelection(movePos.Position(), lineAnchorPos, selectionType == selWholeLine);\n\t\t\t}\n\t\t}\n\n\t\t// Autoscroll\n\t\tPRectangle rcClient = GetClientRectangle();\n\t\tPoint ptOrigin = GetVisibleOriginInMain();\n\t\trcClient.Move(0, -ptOrigin.y);\n\t\tint lineMove = DisplayFromPosition(movePos.Position());\n\t\tif (pt.y > rcClient.bottom) {\n\t\t\tScrollTo(lineMove - LinesOnScreen() + 1);\n\t\t\tRedraw();\n\t\t} else if (pt.y < rcClient.top) {\n\t\t\tScrollTo(lineMove);\n\t\t\tRedraw();\n\t\t}\n\t\tEnsureCaretVisible(false, false, true);\n\n\t\tif (hsStart != -1 && !PositionIsHotspot(movePos.Position()))\n\t\t\tSetHotSpotRange(NULL);\n\n\t\tif (hotSpotClickPos != INVALID_POSITION && PositionFromLocation(pt,true,false) != hotSpotClickPos) {\n\t\t\tif (inDragDrop == ddNone) {\n\t\t\t\tDisplayCursor(Window::cursorText);\n\t\t\t}\n\t\t\thotSpotClickPos = INVALID_POSITION;\n\t\t}\n\n\t} else {\n\t\tif (vs.fixedColumnWidth > 0) {\t// There is a margin\n\t\t\tif (PointInSelMargin(pt)) {\n\t\t\t\tDisplayCursor(GetMarginCursor(pt));\n\t\t\t\tSetHotSpotRange(NULL);\n\t\t\t\treturn; \t// No need to test for selection\n\t\t\t}\n\t\t}\n\t\t// Display regular (drag) cursor over selection\n\t\tif (PointInSelection(pt) && !SelectionEmpty()) {\n\t\t\tDisplayCursor(Window::cursorArrow);\n\t\t} else if (PointIsHotspot(pt)) {\n\t\t\tDisplayCursor(Window::cursorHand);\n\t\t\tSetHotSpotRange(&pt);\n\t\t} else {\n\t\t\tDisplayCursor(Window::cursorText);\n\t\t\tSetHotSpotRange(NULL);\n\t\t}\n\t}\n}\n\nvoid Editor::ButtonMove(Point pt) {\n\tButtonMoveWithModifiers(pt, 0);\n}\n\nvoid Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {\n\t//Platform::DebugPrintf(\"ButtonUp %d %d\\n\", HaveMouseCapture(), inDragDrop);\n\tSelectionPosition newPos = SPositionFromLocation(pt, false, false,\n\t\tAllowVirtualSpace(virtualSpaceOptions, sel.IsRectangular()));\n\tnewPos = MovePositionOutsideChar(newPos, sel.MainCaret() - newPos.Position());\n\tif (inDragDrop == ddInitial) {\n\t\tinDragDrop = ddNone;\n\t\tSetEmptySelection(newPos);\n\t\tselectionType = selChar;\n\t\toriginalAnchorPos = sel.MainCaret();\n\t}\n\tif (hotSpotClickPos != INVALID_POSITION && PointIsHotspot(pt)) {\n\t\thotSpotClickPos = INVALID_POSITION;\n\t\tNotifyHotSpotReleaseClick(newPos.Position(), false, ctrl, false);\n\t}\n\tif (HaveMouseCapture()) {\n\t\tif (PointInSelMargin(pt)) {\n\t\t\tDisplayCursor(GetMarginCursor(pt));\n\t\t} else {\n\t\t\tDisplayCursor(Window::cursorText);\n\t\t\tSetHotSpotRange(NULL);\n\t\t}\n\t\tptMouseLast = pt;\n\t\tSetMouseCapture(false);\n\t\tNotifyIndicatorClick(false, newPos.Position(), false, false, false);\n\t\tif (inDragDrop == ddDragging) {\n\t\t\tSelectionPosition selStart = SelectionStart();\n\t\t\tSelectionPosition selEnd = SelectionEnd();\n\t\t\tif (selStart < selEnd) {\n\t\t\t\tif (drag.Length()) {\n\t\t\t\t\tif (ctrl) {\n\t\t\t\t\t\tif (pdoc->InsertString(newPos.Position(), drag.Data(), static_cast<int>(drag.Length()))) {\n\t\t\t\t\t\t\tSetSelection(newPos.Position(), newPos.Position() + static_cast<int>(drag.Length()));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (newPos < selStart) {\n\t\t\t\t\t\tpdoc->DeleteChars(selStart.Position(), static_cast<int>(drag.Length()));\n\t\t\t\t\t\tif (pdoc->InsertString(newPos.Position(), drag.Data(), static_cast<int>(drag.Length()))) {\n\t\t\t\t\t\t\tSetSelection(newPos.Position(), newPos.Position() + static_cast<int>(drag.Length()));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (newPos > selEnd) {\n\t\t\t\t\t\tpdoc->DeleteChars(selStart.Position(), static_cast<int>(drag.Length()));\n\t\t\t\t\t\tnewPos.Add(-static_cast<int>(drag.Length()));\n\t\t\t\t\t\tif (pdoc->InsertString(newPos.Position(), drag.Data(), static_cast<int>(drag.Length()))) {\n\t\t\t\t\t\t\tSetSelection(newPos.Position(), newPos.Position() + static_cast<int>(drag.Length()));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tSetEmptySelection(newPos.Position());\n\t\t\t\t\t}\n\t\t\t\t\tdrag.Clear();\n\t\t\t\t}\n\t\t\t\tselectionType = selChar;\n\t\t\t}\n\t\t} else {\n\t\t\tif (selectionType == selChar) {\n\t\t\t\tif (sel.Count() > 1) {\n\t\t\t\t\tsel.RangeMain() =\n\t\t\t\t\t\tSelectionRange(newPos, sel.Range(sel.Count() - 1).anchor);\n\t\t\t\t\tInvalidateSelection(sel.RangeMain(), true);\n\t\t\t\t} else {\n\t\t\t\t\tSetSelection(newPos, sel.RangeMain().anchor);\n\t\t\t\t}\n\t\t\t}\n\t\t\tsel.CommitTentative();\n\t\t}\n\t\tSetRectangularRange();\n\t\tlastClickTime = curTime;\n\t\tlastClick = pt;\n\t\tlastXChosen = pt.x + xOffset;\n\t\tif (sel.selType == Selection::selStream) {\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tinDragDrop = ddNone;\n\t\tEnsureCaretVisible(false);\n\t}\n}\n\n// Called frequently to perform background UI including\n// caret blinking and automatic scrolling.\nvoid Editor::Tick() {\n\tif (HaveMouseCapture()) {\n\t\t// Auto scroll\n\t\tButtonMove(ptMouseLast);\n\t}\n\tif (caret.period > 0) {\n\t\ttimer.ticksToWait -= timer.tickSize;\n\t\tif (timer.ticksToWait <= 0) {\n\t\t\tcaret.on = !caret.on;\n\t\t\ttimer.ticksToWait = caret.period;\n\t\t\tif (caret.active) {\n\t\t\t\tInvalidateCaret();\n\t\t\t}\n\t\t}\n\t}\n\tif (horizontalScrollBarVisible && trackLineWidth && (lineWidthMaxSeen > scrollWidth)) {\n\t\tscrollWidth = lineWidthMaxSeen;\n\t\tSetScrollBars();\n\t}\n\tif ((dwellDelay < SC_TIME_FOREVER) &&\n\t        (ticksToDwell > 0) &&\n\t        (!HaveMouseCapture()) &&\n\t        (ptMouseLast.y >= 0)) {\n\t\tticksToDwell -= timer.tickSize;\n\t\tif (ticksToDwell <= 0) {\n\t\t\tdwelling = true;\n\t\t\tNotifyDwelling(ptMouseLast, dwelling);\n\t\t}\n\t}\n}\n\nbool Editor::Idle() {\n\n\tbool idleDone;\n\n\tbool wrappingDone = !Wrapping();\n\n\tif (!wrappingDone) {\n\t\t// Wrap lines during idle.\n\t\tWrapLines(wsIdle);\n\t\t// No more wrapping\n\t\tif (!wrapPending.NeedsWrap())\n\t\t\twrappingDone = true;\n\t}\n\n\t// Add more idle things to do here, but make sure idleDone is\n\t// set correctly before the function returns. returning\n\t// false will stop calling this idle funtion until SetIdle() is\n\t// called again.\n\n\tidleDone = wrappingDone; // && thatDone && theOtherThingDone...\n\n\treturn !idleDone;\n}\n\nvoid Editor::SetFocusState(bool focusState) {\n\thasFocus = focusState;\n\tNotifyFocus(hasFocus);\n\tif (hasFocus) {\n\t\tShowCaretAtCurrentPosition();\n\t} else {\n\t\tCancelModes();\n\t\tDropCaret();\n\t}\n}\n\nint Editor::PositionAfterArea(PRectangle rcArea) const {\n\t// The start of the document line after the display line after the area\n\t// This often means that the line after a modification is restyled which helps\n\t// detect multiline comment additions and heals single line comments\n\tint lineAfter = topLine + (rcArea.bottom - 1) / vs.lineHeight + 1;\n\tif (lineAfter < cs.LinesDisplayed())\n\t\treturn pdoc->LineStart(cs.DocFromDisplay(lineAfter) + 1);\n\telse\n\t\treturn pdoc->Length();\n}\n\n// Style to a position within the view. If this causes a change at end of last line then\n// affects later lines so style all the viewed text.\nvoid Editor::StyleToPositionInView(Position pos) {\n\tint endWindow = (vs.marginInside) ? (PositionAfterArea(GetClientRectangle())) : (pdoc->Length());\n\tif (pos > endWindow)\n\t\tpos = endWindow;\n\tint styleAtEnd = pdoc->StyleAt(pos-1);\n\tpdoc->EnsureStyledTo(pos);\n\tif ((endWindow > pos) && (styleAtEnd != pdoc->StyleAt(pos-1))) {\n\t\t// Style at end of line changed so is multi-line change like starting a comment\n\t\t// so require rest of window to be styled.\n\t\tpdoc->EnsureStyledTo(endWindow);\n\t}\n}\n\nvoid Editor::IdleWork() {\n\t// Style the line after the modification as this allows modifications that change just the\n\t// line of the modification to heal instead of propagating to the rest of the window.\n\tif (workNeeded.items & WorkNeeded::workStyle)\n\t\tStyleToPositionInView(pdoc->LineStart(pdoc->LineFromPosition(workNeeded.upTo) + 2));\n\n\tNotifyUpdateUI();\n\tworkNeeded.Reset();\n}\n\nvoid Editor::QueueIdleWork(WorkNeeded::workItems items, int upTo) {\n\tworkNeeded.Need(items, upTo);\n}\n\nbool Editor::PaintContains(PRectangle rc) {\n\tif (rc.Empty()) {\n\t\treturn true;\n\t} else {\n\t\treturn rcPaint.Contains(rc);\n\t}\n}\n\nbool Editor::PaintContainsMargin() {\n\tif (wMargin.GetID()) {\n\t\t// With separate margin view, paint of text view\n\t\t// never contains margin.\n\t\treturn false;\n\t}\n\tPRectangle rcSelMargin = GetClientRectangle();\n\trcSelMargin.right = vs.textStart;\n\treturn PaintContains(rcSelMargin);\n}\n\nvoid Editor::CheckForChangeOutsidePaint(Range r) {\n\tif (paintState == painting && !paintingAllText) {\n\t\t//Platform::DebugPrintf(\"Checking range in paint %d-%d\\n\", r.start, r.end);\n\t\tif (!r.Valid())\n\t\t\treturn;\n\n\t\tPRectangle rcRange = RectangleFromRange(r.start, r.end);\n\t\tPRectangle rcText = GetTextRectangle();\n\t\tif (rcRange.top < rcText.top) {\n\t\t\trcRange.top = rcText.top;\n\t\t}\n\t\tif (rcRange.bottom > rcText.bottom) {\n\t\t\trcRange.bottom = rcText.bottom;\n\t\t}\n\n\t\tif (!PaintContains(rcRange)) {\n\t\t\tAbandonPaint();\n\t\t\tpaintAbandonedByStyling = true;\n\t\t}\n\t}\n}\n\nvoid Editor::SetBraceHighlight(Position pos0, Position pos1, int matchStyle) {\n\tif ((pos0 != braces[0]) || (pos1 != braces[1]) || (matchStyle != bracesMatchStyle)) {\n\t\tif ((braces[0] != pos0) || (matchStyle != bracesMatchStyle)) {\n\t\t\tCheckForChangeOutsidePaint(Range(braces[0]));\n\t\t\tCheckForChangeOutsidePaint(Range(pos0));\n\t\t\tbraces[0] = pos0;\n\t\t}\n\t\tif ((braces[1] != pos1) || (matchStyle != bracesMatchStyle)) {\n\t\t\tCheckForChangeOutsidePaint(Range(braces[1]));\n\t\t\tCheckForChangeOutsidePaint(Range(pos1));\n\t\t\tbraces[1] = pos1;\n\t\t}\n\t\tbracesMatchStyle = matchStyle;\n\t\tif (paintState == notPainting) {\n\t\t\tRedraw();\n\t\t}\n\t}\n}\n\nvoid Editor::SetAnnotationHeights(int start, int end) {\n\tif (vs.annotationVisible) {\n\t\tbool changedHeight = false;\n\t\tfor (int line=start; line<end && line<pdoc->LinesTotal(); line++) {\n\t\t\tint linesWrapped = 1;\n\t\t\tif (Wrapping()) {\n\t\t\t\tAutoSurface surface(this);\n\t\t\t\tAutoLineLayout ll(llc, RetrieveLineLayout(line));\n\t\t\t\tif (surface && ll) {\n\t\t\t\t\tLayoutLine(line, surface, vs, ll, wrapWidth);\n\t\t\t\t\tlinesWrapped = ll->lines;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (cs.SetHeight(line, pdoc->AnnotationLines(line) + linesWrapped))\n\t\t\t\tchangedHeight = true;\n\t\t}\n\t\tif (changedHeight) {\n\t\t\tRedraw();\n\t\t}\n\t}\n}\n\nvoid Editor::SetDocPointer(Document *document) {\n\t//Platform::DebugPrintf(\"** %x setdoc to %x\\n\", pdoc, document);\n\tpdoc->RemoveWatcher(this, 0);\n\tpdoc->Release();\n\tif (document == NULL) {\n\t\tpdoc = new Document();\n\t} else {\n\t\tpdoc = document;\n\t}\n\tpdoc->AddRef();\n\n\t// Ensure all positions within document\n\tsel.Clear();\n\ttargetStart = 0;\n\ttargetEnd = 0;\n\n\tbraces[0] = invalidPosition;\n\tbraces[1] = invalidPosition;\n\n\tvs.ReleaseAllExtendedStyles();\n\n\tSetRepresentations();\n\n\t// Reset the contraction state to fully shown.\n\tcs.Clear();\n\tcs.InsertLines(0, pdoc->LinesTotal() - 1);\n\tSetAnnotationHeights(0, pdoc->LinesTotal());\n\tllc.Deallocate();\n\tNeedWrapping();\n\n\tpdoc->AddWatcher(this, 0);\n\tSetScrollBars();\n\tRedraw();\n}\n\nvoid Editor::SetAnnotationVisible(int visible) {\n\tif (vs.annotationVisible != visible) {\n\t\tbool changedFromOrToHidden = ((vs.annotationVisible != 0) != (visible != 0));\n\t\tvs.annotationVisible = visible;\n\t\tif (changedFromOrToHidden) {\n\t\t\tint dir = vs.annotationVisible ? 1 : -1;\n\t\t\tfor (int line=0; line<pdoc->LinesTotal(); line++) {\n\t\t\t\tint annotationLines = pdoc->AnnotationLines(line);\n\t\t\t\tif (annotationLines > 0) {\n\t\t\t\t\tcs.SetHeight(line, cs.GetHeight(line) + annotationLines * dir);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tRedraw();\n\t}\n}\n\n/**\n * Recursively expand a fold, making lines visible except where they have an unexpanded parent.\n */\nint Editor::ExpandLine(int line) {\n\tint lineMaxSubord = pdoc->GetLastChild(line);\n\tline++;\n\twhile (line <= lineMaxSubord) {\n\t\tcs.SetVisible(line, line, true);\n\t\tint level = pdoc->GetLevel(line);\n\t\tif (level & SC_FOLDLEVELHEADERFLAG) {\n\t\t\tif (cs.GetExpanded(line)) {\n\t\t\t\tline = ExpandLine(line);\n\t\t\t} else {\n\t\t\t\tline = pdoc->GetLastChild(line);\n\t\t\t}\n\t\t}\n\t\tline++;\n\t}\n\treturn lineMaxSubord;\n}\n\nvoid Editor::SetFoldExpanded(int lineDoc, bool expanded) {\n\tif (cs.SetExpanded(lineDoc, expanded)) {\n\t\tRedrawSelMargin();\n\t}\n}\n\nvoid Editor::FoldLine(int line, int action) {\n\tif (line >= 0) {\n\t\tif (action == SC_FOLDACTION_TOGGLE) {\n \t\t\tif ((pdoc->GetLevel(line) & SC_FOLDLEVELHEADERFLAG) == 0) {\n\t\t\t\tline = pdoc->GetFoldParent(line);\n\t\t\t\tif (line < 0)\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t\taction = (cs.GetExpanded(line)) ? SC_FOLDACTION_CONTRACT : SC_FOLDACTION_EXPAND;\n\t\t}\n\n\t\tif (action == SC_FOLDACTION_CONTRACT) {\n\t\t\tint lineMaxSubord = pdoc->GetLastChild(line);\n\t\t\tif (lineMaxSubord > line) {\n\t\t\t\tcs.SetExpanded(line, 0);\n\t\t\t\tcs.SetVisible(line + 1, lineMaxSubord, false);\n\n\t\t\t\tint lineCurrent = pdoc->LineFromPosition(sel.MainCaret());\n\t\t\t\tif (lineCurrent > line && lineCurrent <= lineMaxSubord) {\n\t\t\t\t\t// This does not re-expand the fold\n\t\t\t\t\tEnsureCaretVisible();\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\t\t\tif (!(cs.GetVisible(line))) {\n\t\t\t\tEnsureLineVisible(line, false);\n\t\t\t\tGoToLine(line);\n\t\t\t}\n\t\t\tcs.SetExpanded(line, 1);\n\t\t\tExpandLine(line);\n\t\t}\n\n\t\tSetScrollBars();\n\t\tRedraw();\n\t}\n}\n\nvoid Editor::FoldExpand(int line, int action, int level) {\n\tbool expanding = action == SC_FOLDACTION_EXPAND;\n\tif (action == SC_FOLDACTION_TOGGLE) {\n\t\texpanding = !cs.GetExpanded(line);\n\t}\n\tSetFoldExpanded(line, expanding);\n\tif (expanding && (cs.HiddenLines() == 0))\n\t\t// Nothing to do\n\t\treturn;\n\tint lineMaxSubord = pdoc->GetLastChild(line, level & SC_FOLDLEVELNUMBERMASK);\n\tline++;\n\tcs.SetVisible(line, lineMaxSubord, expanding);\n\twhile (line <= lineMaxSubord) {\n\t\tint levelLine = pdoc->GetLevel(line);\n\t\tif (levelLine & SC_FOLDLEVELHEADERFLAG) {\n\t\t\tSetFoldExpanded(line, expanding);\n\t\t}\n\t\tline++;\n\t}\n\tSetScrollBars();\n\tRedraw();\n}\n\nint Editor::ContractedFoldNext(int lineStart) const {\n\tfor (int line = lineStart; line<pdoc->LinesTotal();) {\n\t\tif (!cs.GetExpanded(line) && (pdoc->GetLevel(line) & SC_FOLDLEVELHEADERFLAG))\n\t\t\treturn line;\n\t\tline = cs.ContractedNext(line+1);\n\t\tif (line < 0)\n\t\t\treturn -1;\n\t}\n\n\treturn -1;\n}\n\n/**\n * Recurse up from this line to find any folds that prevent this line from being visible\n * and unfold them all.\n */\nvoid Editor::EnsureLineVisible(int lineDoc, bool enforcePolicy) {\n\n\t// In case in need of wrapping to ensure DisplayFromDoc works.\n\tif (lineDoc >= wrapPending.start)\n\t\tWrapLines(wsAll);\n\n\tif (!cs.GetVisible(lineDoc)) {\n\t\t// Back up to find a non-blank line\n\t\tint lookLine = lineDoc;\n\t\tint lookLineLevel = pdoc->GetLevel(lookLine);\n\t\twhile ((lookLine > 0) && (lookLineLevel & SC_FOLDLEVELWHITEFLAG)) {\n\t\t\tlookLineLevel = pdoc->GetLevel(--lookLine);\n\t\t}\n\t\tint lineParent = pdoc->GetFoldParent(lookLine);\n\t\tif (lineParent < 0) {\n\t\t\t// Backed up to a top level line, so try to find parent of initial line\n\t\t\tlineParent = pdoc->GetFoldParent(lineDoc);\n\t\t}\n\t\tif (lineParent >= 0) {\n\t\t\tif (lineDoc != lineParent)\n\t\t\t\tEnsureLineVisible(lineParent, enforcePolicy);\n\t\t\tif (!cs.GetExpanded(lineParent)) {\n\t\t\t\tcs.SetExpanded(lineParent, 1);\n\t\t\t\tExpandLine(lineParent);\n\t\t\t}\n\t\t}\n\t\tSetScrollBars();\n\t\tRedraw();\n\t}\n\tif (enforcePolicy) {\n\t\tint lineDisplay = cs.DisplayFromDoc(lineDoc);\n\t\tif (visiblePolicy & VISIBLE_SLOP) {\n\t\t\tif ((topLine > lineDisplay) || ((visiblePolicy & VISIBLE_STRICT) && (topLine + visibleSlop > lineDisplay))) {\n\t\t\t\tSetTopLine(Platform::Clamp(lineDisplay - visibleSlop, 0, MaxScrollPos()));\n\t\t\t\tSetVerticalScrollPos();\n\t\t\t\tRedraw();\n\t\t\t} else if ((lineDisplay > topLine + LinesOnScreen() - 1) ||\n\t\t\t        ((visiblePolicy & VISIBLE_STRICT) && (lineDisplay > topLine + LinesOnScreen() - 1 - visibleSlop))) {\n\t\t\t\tSetTopLine(Platform::Clamp(lineDisplay - LinesOnScreen() + 1 + visibleSlop, 0, MaxScrollPos()));\n\t\t\t\tSetVerticalScrollPos();\n\t\t\t\tRedraw();\n\t\t\t}\n\t\t} else {\n\t\t\tif ((topLine > lineDisplay) || (lineDisplay > topLine + LinesOnScreen() - 1) || (visiblePolicy & VISIBLE_STRICT)) {\n\t\t\t\tSetTopLine(Platform::Clamp(lineDisplay - LinesOnScreen() / 2 + 1, 0, MaxScrollPos()));\n\t\t\t\tSetVerticalScrollPos();\n\t\t\t\tRedraw();\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid Editor::FoldAll(int action) {\n\tpdoc->EnsureStyledTo(pdoc->Length());\n\tint maxLine = pdoc->LinesTotal();\n\tbool expanding = action == SC_FOLDACTION_EXPAND;\n\tif (action == SC_FOLDACTION_TOGGLE) {\n\t\t// Discover current state\n\t\tfor (int lineSeek = 0; lineSeek < maxLine; lineSeek++) {\n\t\t\tif (pdoc->GetLevel(lineSeek) & SC_FOLDLEVELHEADERFLAG) {\n\t\t\t\texpanding = !cs.GetExpanded(lineSeek);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (expanding) {\n\t\tcs.SetVisible(0, maxLine-1, true);\n\t\tfor (int line = 0; line < maxLine; line++) {\n\t\t\tint levelLine = pdoc->GetLevel(line);\n\t\t\tif (levelLine & SC_FOLDLEVELHEADERFLAG) {\n\t\t\t\tSetFoldExpanded(line, true);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor (int line = 0; line < maxLine; line++) {\n\t\t\tint level = pdoc->GetLevel(line);\n\t\t\tif ((level & SC_FOLDLEVELHEADERFLAG) &&\n\t\t\t\t\t(SC_FOLDLEVELBASE == (level & SC_FOLDLEVELNUMBERMASK))) {\n\t\t\t\tSetFoldExpanded(line, false);\n\t\t\t\tint lineMaxSubord = pdoc->GetLastChild(line, -1);\n\t\t\t\tif (lineMaxSubord > line) {\n\t\t\t\t\tcs.SetVisible(line + 1, lineMaxSubord, false);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tSetScrollBars();\n\tRedraw();\n}\n\nvoid Editor::FoldChanged(int line, int levelNow, int levelPrev) {\n\tif (levelNow & SC_FOLDLEVELHEADERFLAG) {\n\t\tif (!(levelPrev & SC_FOLDLEVELHEADERFLAG)) {\n\t\t\t// Adding a fold point.\n\t\t\tif (cs.SetExpanded(line, true)) {\n\t\t\t\tRedrawSelMargin();\n\t\t\t}\n\t\t\tFoldExpand(line, SC_FOLDACTION_EXPAND, levelPrev);\n\t\t}\n\t} else if (levelPrev & SC_FOLDLEVELHEADERFLAG) {\n\t\tif (!cs.GetExpanded(line)) {\n\t\t\t// Removing the fold from one that has been contracted so should expand\n\t\t\t// otherwise lines are left invisible with no way to make them visible\n\t\t\tif (cs.SetExpanded(line, true)) {\n\t\t\t\tRedrawSelMargin();\n\t\t\t}\n\t\t\tFoldExpand(line, SC_FOLDACTION_EXPAND, levelPrev);\n\t\t}\n\t}\n\tif (!(levelNow & SC_FOLDLEVELWHITEFLAG) &&\n\t        ((levelPrev & SC_FOLDLEVELNUMBERMASK) > (levelNow & SC_FOLDLEVELNUMBERMASK))) {\n\t\tif (cs.HiddenLines()) {\n\t\t\t// See if should still be hidden\n\t\t\tint parentLine = pdoc->GetFoldParent(line);\n\t\t\tif ((parentLine < 0) || (cs.GetExpanded(parentLine) && cs.GetVisible(parentLine))) {\n\t\t\t\tcs.SetVisible(line, line, true);\n\t\t\t\tSetScrollBars();\n\t\t\t\tRedraw();\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid Editor::NeedShown(int pos, int len) {\n\tif (foldAutomatic & SC_AUTOMATICFOLD_SHOW) {\n\t\tint lineStart = pdoc->LineFromPosition(pos);\n\t\tint lineEnd = pdoc->LineFromPosition(pos+len);\n\t\tfor (int line = lineStart; line <= lineEnd; line++) {\n\t\t\tEnsureLineVisible(line, false);\n\t\t}\n\t} else {\n\t\tNotifyNeedShown(pos, len);\n\t}\n}\n\nint Editor::GetTag(char *tagValue, int tagNumber) {\n\tconst char *text = 0;\n\tint length = 0;\n\tif ((tagNumber >= 1) && (tagNumber <= 9)) {\n\t\tchar name[3] = \"\\\\?\";\n\t\tname[1] = static_cast<char>(tagNumber + '0');\n\t\tlength = 2;\n\t\ttext = pdoc->SubstituteByPosition(name, &length);\n\t}\n\tif (tagValue) {\n\t\tif (text)\n\t\t\tmemcpy(tagValue, text, length + 1);\n\t\telse\n\t\t\t*tagValue = '\\0';\n\t}\n\treturn length;\n}\n\nint Editor::ReplaceTarget(bool replacePatterns, const char *text, int length) {\n\tUndoGroup ug(pdoc);\n\tif (length == -1)\n\t\tlength = istrlen(text);\n\tif (replacePatterns) {\n\t\ttext = pdoc->SubstituteByPosition(text, &length);\n\t\tif (!text) {\n\t\t\treturn 0;\n\t\t}\n\t}\n\tif (targetStart != targetEnd)\n\t\tpdoc->DeleteChars(targetStart, targetEnd - targetStart);\n\ttargetEnd = targetStart;\n\tpdoc->InsertString(targetStart, text, length);\n\ttargetEnd = targetStart + length;\n\treturn length;\n}\n\nbool Editor::IsUnicodeMode() const {\n\treturn pdoc && (SC_CP_UTF8 == pdoc->dbcsCodePage);\n}\n\nint Editor::CodePage() const {\n\tif (pdoc)\n\t\treturn pdoc->dbcsCodePage;\n\telse\n\t\treturn 0;\n}\n\nint Editor::WrapCount(int line) {\n\tAutoSurface surface(this);\n\tAutoLineLayout ll(llc, RetrieveLineLayout(line));\n\n\tif (surface && ll) {\n\t\tLayoutLine(line, surface, vs, ll, wrapWidth);\n\t\treturn ll->lines;\n\t} else {\n\t\treturn 1;\n\t}\n}\n\nvoid Editor::AddStyledText(char *buffer, int appendLength) {\n\t// The buffer consists of alternating character bytes and style bytes\n\tint textLength = appendLength / 2;\n\tstd::string text(textLength, '\\0');\n\tint i;\n\tfor (i = 0; i < textLength; i++) {\n\t\ttext[i] = buffer[i*2];\n\t}\n\tpdoc->InsertString(CurrentPosition(), text.c_str(), textLength);\n\tfor (i = 0; i < textLength; i++) {\n\t\ttext[i] = buffer[i*2+1];\n\t}\n\tpdoc->StartStyling(CurrentPosition(), static_cast<char>(0xff));\n\tpdoc->SetStyles(textLength, text.c_str());\n\tSetEmptySelection(sel.MainCaret() + textLength);\n}\n\nstatic bool ValidMargin(unsigned long wParam) {\n\treturn wParam <= SC_MAX_MARGIN;\n}\n\nstatic char *CharPtrFromSPtr(sptr_t lParam) {\n\treturn reinterpret_cast<char *>(lParam);\n}\n\nvoid Editor::StyleSetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {\n\tvs.EnsureStyle(wParam);\n\tswitch (iMessage) {\n\tcase SCI_STYLESETFORE:\n\t\tvs.styles[wParam].fore = ColourDesired(lParam);\n\t\tbreak;\n\tcase SCI_STYLESETBACK:\n\t\tvs.styles[wParam].back = ColourDesired(lParam);\n\t\tbreak;\n\tcase SCI_STYLESETBOLD:\n\t\tvs.styles[wParam].weight = lParam != 0 ? SC_WEIGHT_BOLD : SC_WEIGHT_NORMAL;\n\t\tbreak;\n\tcase SCI_STYLESETWEIGHT:\n\t\tvs.styles[wParam].weight = lParam;\n\t\tbreak;\n\tcase SCI_STYLESETITALIC:\n\t\tvs.styles[wParam].italic = lParam != 0;\n\t\tbreak;\n\tcase SCI_STYLESETEOLFILLED:\n\t\tvs.styles[wParam].eolFilled = lParam != 0;\n\t\tbreak;\n\tcase SCI_STYLESETSIZE:\n\t\tvs.styles[wParam].size = lParam * SC_FONT_SIZE_MULTIPLIER;\n\t\tbreak;\n\tcase SCI_STYLESETSIZEFRACTIONAL:\n\t\tvs.styles[wParam].size = lParam;\n\t\tbreak;\n\tcase SCI_STYLESETFONT:\n\t\tif (lParam != 0) {\n\t\t\tvs.SetStyleFontName(wParam, CharPtrFromSPtr(lParam));\n\t\t}\n\t\tbreak;\n\tcase SCI_STYLESETUNDERLINE:\n\t\tvs.styles[wParam].underline = lParam != 0;\n\t\tbreak;\n\tcase SCI_STYLESETCASE:\n\t\tvs.styles[wParam].caseForce = static_cast<Style::ecaseForced>(lParam);\n\t\tbreak;\n\tcase SCI_STYLESETCHARACTERSET:\n\t\tvs.styles[wParam].characterSet = lParam;\n\t\tpdoc->SetCaseFolder(NULL);\n\t\tbreak;\n\tcase SCI_STYLESETVISIBLE:\n\t\tvs.styles[wParam].visible = lParam != 0;\n\t\tbreak;\n\tcase SCI_STYLESETCHANGEABLE:\n\t\tvs.styles[wParam].changeable = lParam != 0;\n\t\tbreak;\n\tcase SCI_STYLESETHOTSPOT:\n\t\tvs.styles[wParam].hotspot = lParam != 0;\n\t\tbreak;\n\t}\n\tInvalidateStyleRedraw();\n}\n\nsptr_t Editor::StyleGetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {\n\tvs.EnsureStyle(wParam);\n\tswitch (iMessage) {\n\tcase SCI_STYLEGETFORE:\n\t\treturn vs.styles[wParam].fore.AsLong();\n\tcase SCI_STYLEGETBACK:\n\t\treturn vs.styles[wParam].back.AsLong();\n\tcase SCI_STYLEGETBOLD:\n\t\treturn vs.styles[wParam].weight > SC_WEIGHT_NORMAL;\n\tcase SCI_STYLEGETWEIGHT:\n\t\treturn vs.styles[wParam].weight;\n\tcase SCI_STYLEGETITALIC:\n\t\treturn vs.styles[wParam].italic ? 1 : 0;\n\tcase SCI_STYLEGETEOLFILLED:\n\t\treturn vs.styles[wParam].eolFilled ? 1 : 0;\n\tcase SCI_STYLEGETSIZE:\n\t\treturn vs.styles[wParam].size / SC_FONT_SIZE_MULTIPLIER;\n\tcase SCI_STYLEGETSIZEFRACTIONAL:\n\t\treturn vs.styles[wParam].size;\n\tcase SCI_STYLEGETFONT:\n\t\tif (!vs.styles[wParam].fontName)\n\t\t\treturn 0;\n\t\tif (lParam != 0)\n\t\t\tstrcpy(CharPtrFromSPtr(lParam), vs.styles[wParam].fontName);\n\t\treturn strlen(vs.styles[wParam].fontName);\n\tcase SCI_STYLEGETUNDERLINE:\n\t\treturn vs.styles[wParam].underline ? 1 : 0;\n\tcase SCI_STYLEGETCASE:\n\t\treturn static_cast<int>(vs.styles[wParam].caseForce);\n\tcase SCI_STYLEGETCHARACTERSET:\n\t\treturn vs.styles[wParam].characterSet;\n\tcase SCI_STYLEGETVISIBLE:\n\t\treturn vs.styles[wParam].visible ? 1 : 0;\n\tcase SCI_STYLEGETCHANGEABLE:\n\t\treturn vs.styles[wParam].changeable ? 1 : 0;\n\tcase SCI_STYLEGETHOTSPOT:\n\t\treturn vs.styles[wParam].hotspot ? 1 : 0;\n\t}\n\treturn 0;\n}\n\nsptr_t Editor::StringResult(sptr_t lParam, const char *val) {\n\tconst size_t n = strlen(val);\n\tif (lParam != 0) {\n\t\tchar *ptr = reinterpret_cast<char *>(lParam);\n\t\tstrcpy(ptr, val);\n\t}\n\treturn n;\t// Not including NUL\n}\n\nsptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {\n\t//Platform::DebugPrintf(\"S start wnd proc %d %d %d\\n\",iMessage, wParam, lParam);\n\n\t// Optional macro recording hook\n\tif (recordingMacro)\n\t\tNotifyMacroRecord(iMessage, wParam, lParam);\n\n\tswitch (iMessage) {\n\n\tcase SCI_GETTEXT: {\n\t\t\tif (lParam == 0)\n\t\t\t\treturn pdoc->Length() + 1;\n\t\t\tif (wParam == 0)\n\t\t\t\treturn 0;\n\t\t\tchar *ptr = CharPtrFromSPtr(lParam);\n\t\t\tunsigned int iChar = 0;\n\t\t\tfor (; iChar < wParam - 1; iChar++)\n\t\t\t\tptr[iChar] = pdoc->CharAt(iChar);\n\t\t\tptr[iChar] = '\\0';\n\t\t\treturn iChar;\n\t\t}\n\n\tcase SCI_SETTEXT: {\n\t\t\tif (lParam == 0)\n\t\t\t\treturn 0;\n\t\t\tUndoGroup ug(pdoc);\n\t\t\tpdoc->DeleteChars(0, pdoc->Length());\n\t\t\tSetEmptySelection(0);\n\t\t\tpdoc->InsertCString(0, CharPtrFromSPtr(lParam));\n\t\t\treturn 1;\n\t\t}\n\n\tcase SCI_GETTEXTLENGTH:\n\t\treturn pdoc->Length();\n\n\tcase SCI_CUT:\n\t\tCut();\n\t\tSetLastXChosen();\n\t\tbreak;\n\n\tcase SCI_COPY:\n\t\tCopy();\n\t\tbreak;\n\n\tcase SCI_COPYALLOWLINE:\n\t\tCopyAllowLine();\n\t\tbreak;\n\n\tcase SCI_VERTICALCENTRECARET:\n\t\tVerticalCentreCaret();\n\t\tbreak;\n\n\tcase SCI_MOVESELECTEDLINESUP:\n\t\tMoveSelectedLinesUp();\n\t\tbreak;\n\n\tcase SCI_MOVESELECTEDLINESDOWN:\n\t\tMoveSelectedLinesDown();\n\t\tbreak;\n\n\tcase SCI_COPYRANGE:\n\t\tCopyRangeToClipboard(wParam, lParam);\n\t\tbreak;\n\n\tcase SCI_COPYTEXT:\n\t\tCopyText(wParam, CharPtrFromSPtr(lParam));\n\t\tbreak;\n\n\tcase SCI_PASTE:\n\t\tPaste();\n\t\tif ((caretSticky == SC_CARETSTICKY_OFF) || (caretSticky == SC_CARETSTICKY_WHITESPACE)) {\n\t\t\tSetLastXChosen();\n\t\t}\n\t\tEnsureCaretVisible();\n\t\tbreak;\n\n\tcase SCI_CLEAR:\n\t\tClear();\n\t\tSetLastXChosen();\n\t\tEnsureCaretVisible();\n\t\tbreak;\n\n\tcase SCI_UNDO:\n\t\tUndo();\n\t\tSetLastXChosen();\n\t\tbreak;\n\n\tcase SCI_CANUNDO:\n\t\treturn (pdoc->CanUndo() && !pdoc->IsReadOnly()) ? 1 : 0;\n\n\tcase SCI_EMPTYUNDOBUFFER:\n\t\tpdoc->DeleteUndoHistory();\n\t\treturn 0;\n\n\tcase SCI_GETFIRSTVISIBLELINE:\n\t\treturn topLine;\n\n\tcase SCI_SETFIRSTVISIBLELINE:\n\t\tScrollTo(wParam);\n\t\tbreak;\n\n\tcase SCI_GETLINE: {\t// Risk of overwriting the end of the buffer\n\t\t\tint lineStart = pdoc->LineStart(wParam);\n\t\t\tint lineEnd = pdoc->LineStart(wParam + 1);\n\t\t\tif (lParam == 0) {\n\t\t\t\treturn lineEnd - lineStart;\n\t\t\t}\n\t\t\tchar *ptr = CharPtrFromSPtr(lParam);\n\t\t\tint iPlace = 0;\n\t\t\tfor (int iChar = lineStart; iChar < lineEnd; iChar++) {\n\t\t\t\tptr[iPlace++] = pdoc->CharAt(iChar);\n\t\t\t}\n\t\t\treturn iPlace;\n\t\t}\n\n\tcase SCI_GETLINECOUNT:\n\t\tif (pdoc->LinesTotal() == 0)\n\t\t\treturn 1;\n\t\telse\n\t\t\treturn pdoc->LinesTotal();\n\n\tcase SCI_GETMODIFY:\n\t\treturn !pdoc->IsSavePoint();\n\n\tcase SCI_SETSEL: {\n\t\t\tint nStart = static_cast<int>(wParam);\n\t\t\tint nEnd = static_cast<int>(lParam);\n\t\t\tif (nEnd < 0)\n\t\t\t\tnEnd = pdoc->Length();\n\t\t\tif (nStart < 0)\n\t\t\t\tnStart = nEnd; \t// Remove selection\n\t\t\tInvalidateSelection(SelectionRange(nStart, nEnd));\n\t\t\tsel.Clear();\n\t\t\tsel.selType = Selection::selStream;\n\t\t\tSetSelection(nEnd, nStart);\n\t\t\tEnsureCaretVisible();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETSELTEXT: {\n\t\t\tSelectionText selectedText;\n\t\t\tCopySelectionRange(&selectedText);\n\t\t\tif (lParam == 0) {\n\t\t\t\treturn selectedText.LengthWithTerminator();\n\t\t\t} else {\n\t\t\t\tchar *ptr = CharPtrFromSPtr(lParam);\n\t\t\t\tunsigned int iChar = 0;\n\t\t\t\tif (selectedText.Length()) {\n\t\t\t\t\tfor (; iChar < selectedText.LengthWithTerminator(); iChar++)\n\t\t\t\t\t\tptr[iChar] = selectedText.Data()[iChar];\n\t\t\t\t} else {\n\t\t\t\t\tptr[0] = '\\0';\n\t\t\t\t}\n\t\t\t\treturn iChar;\n\t\t\t}\n\t\t}\n\n\tcase SCI_LINEFROMPOSITION:\n\t\tif (static_cast<int>(wParam) < 0)\n\t\t\treturn 0;\n\t\treturn pdoc->LineFromPosition(wParam);\n\n\tcase SCI_POSITIONFROMLINE:\n\t\tif (static_cast<int>(wParam) < 0)\n\t\t\twParam = pdoc->LineFromPosition(SelectionStart().Position());\n\t\tif (wParam == 0)\n\t\t\treturn 0; \t// Even if there is no text, there is a first line that starts at 0\n\t\tif (static_cast<int>(wParam) > pdoc->LinesTotal())\n\t\t\treturn -1;\n\t\t//if (wParam > pdoc->LineFromPosition(pdoc->Length()))\t// Useful test, anyway...\n\t\t//\treturn -1;\n\t\treturn pdoc->LineStart(wParam);\n\n\t\t// Replacement of the old Scintilla interpretation of EM_LINELENGTH\n\tcase SCI_LINELENGTH:\n\t\tif ((static_cast<int>(wParam) < 0) ||\n\t\t        (static_cast<int>(wParam) > pdoc->LineFromPosition(pdoc->Length())))\n\t\t\treturn 0;\n\t\treturn pdoc->LineStart(wParam + 1) - pdoc->LineStart(wParam);\n\n\tcase SCI_REPLACESEL: {\n\t\t\tif (lParam == 0)\n\t\t\t\treturn 0;\n\t\t\tUndoGroup ug(pdoc);\n\t\t\tClearSelection();\n\t\t\tchar *replacement = CharPtrFromSPtr(lParam);\n\t\t\tpdoc->InsertCString(sel.MainCaret(), replacement);\n\t\t\tSetEmptySelection(sel.MainCaret() + istrlen(replacement));\n\t\t\tEnsureCaretVisible();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_SETTARGETSTART:\n\t\ttargetStart = wParam;\n\t\tbreak;\n\n\tcase SCI_GETTARGETSTART:\n\t\treturn targetStart;\n\n\tcase SCI_SETTARGETEND:\n\t\ttargetEnd = wParam;\n\t\tbreak;\n\n\tcase SCI_GETTARGETEND:\n\t\treturn targetEnd;\n\n\tcase SCI_TARGETFROMSELECTION:\n\t\tif (sel.MainCaret() < sel.MainAnchor()) {\n\t\t\ttargetStart = sel.MainCaret();\n\t\t\ttargetEnd = sel.MainAnchor();\n\t\t} else {\n\t\t\ttargetStart = sel.MainAnchor();\n\t\t\ttargetEnd = sel.MainCaret();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_REPLACETARGET:\n\t\tPLATFORM_ASSERT(lParam);\n\t\treturn ReplaceTarget(false, CharPtrFromSPtr(lParam), wParam);\n\n\tcase SCI_REPLACETARGETRE:\n\t\tPLATFORM_ASSERT(lParam);\n\t\treturn ReplaceTarget(true, CharPtrFromSPtr(lParam), wParam);\n\n\tcase SCI_SEARCHINTARGET:\n\t\tPLATFORM_ASSERT(lParam);\n\t\treturn SearchInTarget(CharPtrFromSPtr(lParam), wParam);\n\n\tcase SCI_SETSEARCHFLAGS:\n\t\tsearchFlags = wParam;\n\t\tbreak;\n\n\tcase SCI_GETSEARCHFLAGS:\n\t\treturn searchFlags;\n\n\tcase SCI_GETTAG:\n\t\treturn GetTag(CharPtrFromSPtr(lParam), wParam);\n\n\tcase SCI_POSITIONBEFORE:\n\t\treturn pdoc->MovePositionOutsideChar(wParam - 1, -1, true);\n\n\tcase SCI_POSITIONAFTER:\n\t\treturn pdoc->MovePositionOutsideChar(wParam + 1, 1, true);\n\n\tcase SCI_POSITIONRELATIVE:\n\t\treturn Platform::Clamp(pdoc->GetRelativePosition(wParam, lParam), 0, pdoc->Length());\n\n\tcase SCI_LINESCROLL:\n\t\tScrollTo(topLine + lParam);\n\t\tHorizontalScrollTo(xOffset + static_cast<int>(wParam) * vs.spaceWidth);\n\t\treturn 1;\n\n\tcase SCI_SETXOFFSET:\n\t\txOffset = wParam;\n\t\tContainerNeedsUpdate(SC_UPDATE_H_SCROLL);\n\t\tSetHorizontalScrollPos();\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_GETXOFFSET:\n\t\treturn xOffset;\n\n\tcase SCI_CHOOSECARETX:\n\t\tSetLastXChosen();\n\t\tbreak;\n\n\tcase SCI_SCROLLCARET:\n\t\tEnsureCaretVisible();\n\t\tbreak;\n\n\tcase SCI_SETREADONLY:\n\t\tpdoc->SetReadOnly(wParam != 0);\n\t\treturn 1;\n\n\tcase SCI_GETREADONLY:\n\t\treturn pdoc->IsReadOnly();\n\n\tcase SCI_CANPASTE:\n\t\treturn CanPaste();\n\n\tcase SCI_POINTXFROMPOSITION:\n\t\tif (lParam < 0) {\n\t\t\treturn 0;\n\t\t} else {\n\t\t\tPoint pt = LocationFromPosition(lParam);\n\t\t\t// Convert to view-relative\n\t\t\treturn pt.x - vs.textStart + vs.fixedColumnWidth;\n\t\t}\n\n\tcase SCI_POINTYFROMPOSITION:\n\t\tif (lParam < 0) {\n\t\t\treturn 0;\n\t\t} else {\n\t\t\tPoint pt = LocationFromPosition(lParam);\n\t\t\treturn pt.y;\n\t\t}\n\n\tcase SCI_FINDTEXT:\n\t\treturn FindText(wParam, lParam);\n\n\tcase SCI_GETTEXTRANGE: {\n\t\t\tif (lParam == 0)\n\t\t\t\treturn 0;\n\t\t\tSci_TextRange *tr = reinterpret_cast<Sci_TextRange *>(lParam);\n\t\t\tint cpMax = tr->chrg.cpMax;\n\t\t\tif (cpMax == -1)\n\t\t\t\tcpMax = pdoc->Length();\n\t\t\tPLATFORM_ASSERT(cpMax <= pdoc->Length());\n\t\t\tint len = cpMax - tr->chrg.cpMin; \t// No -1 as cpMin and cpMax are referring to inter character positions\n\t\t\tpdoc->GetCharRange(tr->lpstrText, tr->chrg.cpMin, len);\n\t\t\t// Spec says copied text is terminated with a NUL\n\t\t\ttr->lpstrText[len] = '\\0';\n\t\t\treturn len; \t// Not including NUL\n\t\t}\n\n\tcase SCI_HIDESELECTION:\n\t\thideSelection = wParam != 0;\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_FORMATRANGE:\n\t\treturn FormatRange(wParam != 0, reinterpret_cast<Sci_RangeToFormat *>(lParam));\n\n\tcase SCI_GETMARGINLEFT:\n\t\treturn vs.leftMarginWidth;\n\n\tcase SCI_GETMARGINRIGHT:\n\t\treturn vs.rightMarginWidth;\n\n\tcase SCI_SETMARGINLEFT:\n\t\tlastXChosen += lParam - vs.leftMarginWidth;\n\t\tvs.leftMarginWidth = lParam;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_SETMARGINRIGHT:\n\t\tvs.rightMarginWidth = lParam;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\t\t// Control specific mesages\n\n\tcase SCI_ADDTEXT: {\n\t\t\tif (lParam == 0)\n\t\t\t\treturn 0;\n\t\t\tpdoc->InsertString(CurrentPosition(), CharPtrFromSPtr(lParam), wParam);\n\t\t\tSetEmptySelection(sel.MainCaret() + wParam);\n\t\t\treturn 0;\n\t\t}\n\n\tcase SCI_ADDSTYLEDTEXT:\n\t\tif (lParam)\n\t\t\tAddStyledText(CharPtrFromSPtr(lParam), wParam);\n\t\treturn 0;\n\n\tcase SCI_INSERTTEXT: {\n\t\t\tif (lParam == 0)\n\t\t\t\treturn 0;\n\t\t\tint insertPos = wParam;\n\t\t\tif (static_cast<int>(wParam) == -1)\n\t\t\t\tinsertPos = CurrentPosition();\n\t\t\tint newCurrent = CurrentPosition();\n\t\t\tchar *sz = CharPtrFromSPtr(lParam);\n\t\t\tpdoc->InsertCString(insertPos, sz);\n\t\t\tif (newCurrent > insertPos)\n\t\t\t\tnewCurrent += istrlen(sz);\n\t\t\tSetEmptySelection(newCurrent);\n\t\t\treturn 0;\n\t\t}\n\n\tcase SCI_APPENDTEXT:\n\t\tpdoc->InsertString(pdoc->Length(), CharPtrFromSPtr(lParam), wParam);\n\t\treturn 0;\n\n\tcase SCI_CLEARALL:\n\t\tClearAll();\n\t\treturn 0;\n\n\tcase SCI_DELETERANGE:\n\t\tpdoc->DeleteChars(wParam, lParam);\n\t\treturn 0;\n\n\tcase SCI_CLEARDOCUMENTSTYLE:\n\t\tClearDocumentStyle();\n\t\treturn 0;\n\n\tcase SCI_SETUNDOCOLLECTION:\n\t\tpdoc->SetUndoCollection(wParam != 0);\n\t\treturn 0;\n\n\tcase SCI_GETUNDOCOLLECTION:\n\t\treturn pdoc->IsCollectingUndo();\n\n\tcase SCI_BEGINUNDOACTION:\n\t\tpdoc->BeginUndoAction();\n\t\treturn 0;\n\n\tcase SCI_ENDUNDOACTION:\n\t\tpdoc->EndUndoAction();\n\t\treturn 0;\n\n\tcase SCI_GETCARETPERIOD:\n\t\treturn caret.period;\n\n\tcase SCI_SETCARETPERIOD:\n\t\tcaret.period = wParam;\n\t\tbreak;\n\n\tcase SCI_GETWORDCHARS:\n\t\treturn pdoc->GetCharsOfClass(CharClassify::ccWord, reinterpret_cast<unsigned char *>(lParam));\n\n\tcase SCI_SETWORDCHARS: {\n\t\t\tpdoc->SetDefaultCharClasses(false);\n\t\t\tif (lParam == 0)\n\t\t\t\treturn 0;\n\t\t\tpdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), CharClassify::ccWord);\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETWHITESPACECHARS:\n\t\treturn pdoc->GetCharsOfClass(CharClassify::ccSpace, reinterpret_cast<unsigned char *>(lParam));\n\n\tcase SCI_SETWHITESPACECHARS: {\n\t\t\tif (lParam == 0)\n\t\t\t\treturn 0;\n\t\t\tpdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), CharClassify::ccSpace);\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETPUNCTUATIONCHARS:\n\t\treturn pdoc->GetCharsOfClass(CharClassify::ccPunctuation, reinterpret_cast<unsigned char *>(lParam));\n\n\tcase SCI_SETPUNCTUATIONCHARS: {\n\t\t\tif (lParam == 0)\n\t\t\t\treturn 0;\n\t\t\tpdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), CharClassify::ccPunctuation);\n\t\t}\n\t\tbreak;\n\n\tcase SCI_SETCHARSDEFAULT:\n\t\tpdoc->SetDefaultCharClasses(true);\n\t\tbreak;\n\n\tcase SCI_GETLENGTH:\n\t\treturn pdoc->Length();\n\n\tcase SCI_ALLOCATE:\n\t\tpdoc->Allocate(wParam);\n\t\tbreak;\n\n\tcase SCI_GETCHARAT:\n\t\treturn pdoc->CharAt(wParam);\n\n\tcase SCI_SETCURRENTPOS:\n\t\tif (sel.IsRectangular()) {\n\t\t\tsel.Rectangular().caret.SetPosition(wParam);\n\t\t\tSetRectangularRange();\n\t\t\tRedraw();\n\t\t} else {\n\t\t\tSetSelection(wParam, sel.MainAnchor());\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETCURRENTPOS:\n\t\treturn sel.IsRectangular() ? sel.Rectangular().caret.Position() : sel.MainCaret();\n\n\tcase SCI_SETANCHOR:\n\t\tif (sel.IsRectangular()) {\n\t\t\tsel.Rectangular().anchor.SetPosition(wParam);\n\t\t\tSetRectangularRange();\n\t\t\tRedraw();\n\t\t} else {\n\t\t\tSetSelection(sel.MainCaret(), wParam);\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETANCHOR:\n\t\treturn sel.IsRectangular() ? sel.Rectangular().anchor.Position() : sel.MainAnchor();\n\n\tcase SCI_SETSELECTIONSTART:\n\t\tSetSelection(Platform::Maximum(sel.MainCaret(), wParam), wParam);\n\t\tbreak;\n\n\tcase SCI_GETSELECTIONSTART:\n\t\treturn sel.LimitsForRectangularElseMain().start.Position();\n\n\tcase SCI_SETSELECTIONEND:\n\t\tSetSelection(wParam, Platform::Minimum(sel.MainAnchor(), wParam));\n\t\tbreak;\n\n\tcase SCI_GETSELECTIONEND:\n\t\treturn sel.LimitsForRectangularElseMain().end.Position();\n\n\tcase SCI_SETEMPTYSELECTION:\n\t\tSetEmptySelection(wParam);\n\t\tbreak;\n\n\tcase SCI_SETPRINTMAGNIFICATION:\n\t\tprintParameters.magnification = wParam;\n\t\tbreak;\n\n\tcase SCI_GETPRINTMAGNIFICATION:\n\t\treturn printParameters.magnification;\n\n\tcase SCI_SETPRINTCOLOURMODE:\n\t\tprintParameters.colourMode = wParam;\n\t\tbreak;\n\n\tcase SCI_GETPRINTCOLOURMODE:\n\t\treturn printParameters.colourMode;\n\n\tcase SCI_SETPRINTWRAPMODE:\n\t\tprintParameters.wrapState = (wParam == SC_WRAP_WORD) ? eWrapWord : eWrapNone;\n\t\tbreak;\n\n\tcase SCI_GETPRINTWRAPMODE:\n\t\treturn printParameters.wrapState;\n\n\tcase SCI_GETSTYLEAT:\n\t\tif (static_cast<int>(wParam) >= pdoc->Length())\n\t\t\treturn 0;\n\t\telse\n\t\t\treturn pdoc->StyleAt(wParam);\n\n\tcase SCI_REDO:\n\t\tRedo();\n\t\tbreak;\n\n\tcase SCI_SELECTALL:\n\t\tSelectAll();\n\t\tbreak;\n\n\tcase SCI_SETSAVEPOINT:\n\t\tpdoc->SetSavePoint();\n\t\tbreak;\n\n\tcase SCI_GETSTYLEDTEXT: {\n\t\t\tif (lParam == 0)\n\t\t\t\treturn 0;\n\t\t\tSci_TextRange *tr = reinterpret_cast<Sci_TextRange *>(lParam);\n\t\t\tint iPlace = 0;\n\t\t\tfor (int iChar = tr->chrg.cpMin; iChar < tr->chrg.cpMax; iChar++) {\n\t\t\t\ttr->lpstrText[iPlace++] = pdoc->CharAt(iChar);\n\t\t\t\ttr->lpstrText[iPlace++] = pdoc->StyleAt(iChar);\n\t\t\t}\n\t\t\ttr->lpstrText[iPlace] = '\\0';\n\t\t\ttr->lpstrText[iPlace + 1] = '\\0';\n\t\t\treturn iPlace;\n\t\t}\n\n\tcase SCI_CANREDO:\n\t\treturn (pdoc->CanRedo() && !pdoc->IsReadOnly()) ? 1 : 0;\n\n\tcase SCI_MARKERLINEFROMHANDLE:\n\t\treturn pdoc->LineFromHandle(wParam);\n\n\tcase SCI_MARKERDELETEHANDLE:\n\t\tpdoc->DeleteMarkFromHandle(wParam);\n\t\tbreak;\n\n\tcase SCI_GETVIEWWS:\n\t\treturn vs.viewWhitespace;\n\n\tcase SCI_SETVIEWWS:\n\t\tvs.viewWhitespace = static_cast<WhiteSpaceVisibility>(wParam);\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_GETWHITESPACESIZE:\n\t\treturn vs.whitespaceSize;\n\n\tcase SCI_SETWHITESPACESIZE:\n\t\tvs.whitespaceSize = static_cast<int>(wParam);\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_POSITIONFROMPOINT:\n\t\treturn PositionFromLocation(Point(wParam - vs.ExternalMarginWidth(), lParam),\n\t\t\t\t\t    false, false);\n\n\tcase SCI_POSITIONFROMPOINTCLOSE:\n\t\treturn PositionFromLocation(Point(wParam - vs.ExternalMarginWidth(), lParam),\n\t\t\t\t\t    true, false);\n\n\tcase SCI_CHARPOSITIONFROMPOINT:\n\t\treturn PositionFromLocation(Point(wParam - vs.ExternalMarginWidth(), lParam),\n\t\t\t\t\t    false, true);\n\n\tcase SCI_CHARPOSITIONFROMPOINTCLOSE:\n\t\treturn PositionFromLocation(Point(wParam - vs.ExternalMarginWidth(), lParam),\n\t\t\t\t\t    true, true);\n\n\tcase SCI_GOTOLINE:\n\t\tGoToLine(wParam);\n\t\tbreak;\n\n\tcase SCI_GOTOPOS:\n\t\tSetEmptySelection(wParam);\n\t\tEnsureCaretVisible();\n\t\tbreak;\n\n\tcase SCI_GETCURLINE: {\n\t\t\tint lineCurrentPos = pdoc->LineFromPosition(sel.MainCaret());\n\t\t\tint lineStart = pdoc->LineStart(lineCurrentPos);\n\t\t\tunsigned int lineEnd = pdoc->LineStart(lineCurrentPos + 1);\n\t\t\tif (lParam == 0) {\n\t\t\t\treturn 1 + lineEnd - lineStart;\n\t\t\t}\n\t\t\tPLATFORM_ASSERT(wParam > 0);\n\t\t\tchar *ptr = CharPtrFromSPtr(lParam);\n\t\t\tunsigned int iPlace = 0;\n\t\t\tfor (unsigned int iChar = lineStart; iChar < lineEnd && iPlace < wParam - 1; iChar++) {\n\t\t\t\tptr[iPlace++] = pdoc->CharAt(iChar);\n\t\t\t}\n\t\t\tptr[iPlace] = '\\0';\n\t\t\treturn sel.MainCaret() - lineStart;\n\t\t}\n\n\tcase SCI_GETENDSTYLED:\n\t\treturn pdoc->GetEndStyled();\n\n\tcase SCI_GETEOLMODE:\n\t\treturn pdoc->eolMode;\n\n\tcase SCI_SETEOLMODE:\n\t\tpdoc->eolMode = wParam;\n\t\tbreak;\n\n\tcase SCI_SETLINEENDTYPESALLOWED:\n\t\tif (pdoc->SetLineEndTypesAllowed(wParam)) {\n\t\t\tcs.Clear();\n\t\t\tcs.InsertLines(0, pdoc->LinesTotal() - 1);\n\t\t\tSetAnnotationHeights(0, pdoc->LinesTotal());\n\t\t\tInvalidateStyleRedraw();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETLINEENDTYPESALLOWED:\n\t\treturn pdoc->GetLineEndTypesAllowed();\n\n\tcase SCI_GETLINEENDTYPESACTIVE:\n\t\treturn pdoc->GetLineEndTypesActive();\n\n\tcase SCI_STARTSTYLING:\n\t\tpdoc->StartStyling(wParam, static_cast<char>(lParam));\n\t\tbreak;\n\n\tcase SCI_SETSTYLING:\n\t\tpdoc->SetStyleFor(wParam, static_cast<char>(lParam));\n\t\tbreak;\n\n\tcase SCI_SETSTYLINGEX:             // Specify a complete styling buffer\n\t\tif (lParam == 0)\n\t\t\treturn 0;\n\t\tpdoc->SetStyles(wParam, CharPtrFromSPtr(lParam));\n\t\tbreak;\n\n\tcase SCI_SETBUFFEREDDRAW:\n\t\tbufferedDraw = wParam != 0;\n\t\tbreak;\n\n\tcase SCI_GETBUFFEREDDRAW:\n\t\treturn bufferedDraw;\n\n\tcase SCI_GETTWOPHASEDRAW:\n\t\treturn twoPhaseDraw;\n\n\tcase SCI_SETTWOPHASEDRAW:\n\t\ttwoPhaseDraw = wParam != 0;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_SETFONTQUALITY:\n\t\tvs.extraFontFlag &= ~SC_EFF_QUALITY_MASK;\n\t\tvs.extraFontFlag |= (wParam & SC_EFF_QUALITY_MASK);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETFONTQUALITY:\n\t\treturn (vs.extraFontFlag & SC_EFF_QUALITY_MASK);\n\n\tcase SCI_SETTABWIDTH:\n\t\tif (wParam > 0) {\n\t\t\tpdoc->tabInChars = wParam;\n\t\t\tif (pdoc->indentInChars == 0)\n\t\t\t\tpdoc->actualIndentInChars = pdoc->tabInChars;\n\t\t}\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETTABWIDTH:\n\t\treturn pdoc->tabInChars;\n\n\tcase SCI_SETINDENT:\n\t\tpdoc->indentInChars = wParam;\n\t\tif (pdoc->indentInChars != 0)\n\t\t\tpdoc->actualIndentInChars = pdoc->indentInChars;\n\t\telse\n\t\t\tpdoc->actualIndentInChars = pdoc->tabInChars;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETINDENT:\n\t\treturn pdoc->indentInChars;\n\n\tcase SCI_SETUSETABS:\n\t\tpdoc->useTabs = wParam != 0;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETUSETABS:\n\t\treturn pdoc->useTabs;\n\n\tcase SCI_SETLINEINDENTATION:\n\t\tpdoc->SetLineIndentation(wParam, lParam);\n\t\tbreak;\n\n\tcase SCI_GETLINEINDENTATION:\n\t\treturn pdoc->GetLineIndentation(wParam);\n\n\tcase SCI_GETLINEINDENTPOSITION:\n\t\treturn pdoc->GetLineIndentPosition(wParam);\n\n\tcase SCI_SETTABINDENTS:\n\t\tpdoc->tabIndents = wParam != 0;\n\t\tbreak;\n\n\tcase SCI_GETTABINDENTS:\n\t\treturn pdoc->tabIndents;\n\n\tcase SCI_SETBACKSPACEUNINDENTS:\n\t\tpdoc->backspaceUnindents = wParam != 0;\n\t\tbreak;\n\n\tcase SCI_GETBACKSPACEUNINDENTS:\n\t\treturn pdoc->backspaceUnindents;\n\n\tcase SCI_SETMOUSEDWELLTIME:\n\t\tdwellDelay = wParam;\n\t\tticksToDwell = dwellDelay;\n\t\tbreak;\n\n\tcase SCI_GETMOUSEDWELLTIME:\n\t\treturn dwellDelay;\n\n\tcase SCI_WORDSTARTPOSITION:\n\t\treturn pdoc->ExtendWordSelect(wParam, -1, lParam != 0);\n\n\tcase SCI_WORDENDPOSITION:\n\t\treturn pdoc->ExtendWordSelect(wParam, 1, lParam != 0);\n\n\tcase SCI_SETWRAPMODE:\n\t\tif (vs.SetWrapState(wParam)) {\n\t\t\txOffset = 0;\n\t\t\tContainerNeedsUpdate(SC_UPDATE_H_SCROLL);\n\t\t\tInvalidateStyleRedraw();\n\t\t\tReconfigureScrollBars();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETWRAPMODE:\n\t\treturn vs.wrapState;\n\n\tcase SCI_SETWRAPVISUALFLAGS:\n\t\tif (vs.SetWrapVisualFlags(wParam)) {\n\t\t\tInvalidateStyleRedraw();\n\t\t\tReconfigureScrollBars();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETWRAPVISUALFLAGS:\n\t\treturn vs.wrapVisualFlags;\n\n\tcase SCI_SETWRAPVISUALFLAGSLOCATION:\n\t\tif (vs.SetWrapVisualFlagsLocation(wParam)) {\n\t\t\tInvalidateStyleRedraw();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETWRAPVISUALFLAGSLOCATION:\n\t\treturn vs.wrapVisualFlagsLocation;\n\n\tcase SCI_SETWRAPSTARTINDENT:\n\t\tif (vs.SetWrapVisualStartIndent(wParam)) {\n\t\t\tInvalidateStyleRedraw();\n\t\t\tReconfigureScrollBars();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETWRAPSTARTINDENT:\n\t\treturn vs.wrapVisualStartIndent;\n\n\tcase SCI_SETWRAPINDENTMODE:\n\t\tif (vs.SetWrapIndentMode(wParam)) {\n\t\t\tInvalidateStyleRedraw();\n\t\t\tReconfigureScrollBars();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETWRAPINDENTMODE:\n\t\treturn vs.wrapIndentMode;\n\n\tcase SCI_SETLAYOUTCACHE:\n\t\tllc.SetLevel(wParam);\n\t\tbreak;\n\n\tcase SCI_GETLAYOUTCACHE:\n\t\treturn llc.GetLevel();\n\n\tcase SCI_SETPOSITIONCACHE:\n\t\tposCache.SetSize(wParam);\n\t\tbreak;\n\n\tcase SCI_GETPOSITIONCACHE:\n\t\treturn posCache.GetSize();\n\n\tcase SCI_SETSCROLLWIDTH:\n\t\tPLATFORM_ASSERT(wParam > 0);\n\t\tif ((wParam > 0) && (wParam != static_cast<unsigned int >(scrollWidth))) {\n\t\t\tlineWidthMaxSeen = 0;\n\t\t\tscrollWidth = wParam;\n\t\t\tSetScrollBars();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETSCROLLWIDTH:\n\t\treturn scrollWidth;\n\n\tcase SCI_SETSCROLLWIDTHTRACKING:\n\t\ttrackLineWidth = wParam != 0;\n\t\tbreak;\n\n\tcase SCI_GETSCROLLWIDTHTRACKING:\n\t\treturn trackLineWidth;\n\n\tcase SCI_LINESJOIN:\n\t\tLinesJoin();\n\t\tbreak;\n\n\tcase SCI_LINESSPLIT:\n\t\tLinesSplit(wParam);\n\t\tbreak;\n\n\tcase SCI_TEXTWIDTH:\n\t\tPLATFORM_ASSERT(wParam < vs.styles.size());\n\t\tPLATFORM_ASSERT(lParam);\n\t\treturn TextWidth(wParam, CharPtrFromSPtr(lParam));\n\n\tcase SCI_TEXTHEIGHT:\n\t\treturn vs.lineHeight;\n\n\tcase SCI_SETENDATLASTLINE:\n\t\tPLATFORM_ASSERT((wParam == 0) || (wParam == 1));\n\t\tif (endAtLastLine != (wParam != 0)) {\n\t\t\tendAtLastLine = wParam != 0;\n\t\t\tSetScrollBars();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETENDATLASTLINE:\n\t\treturn endAtLastLine;\n\n\tcase SCI_SETCARETSTICKY:\n\t\tPLATFORM_ASSERT(wParam <= SC_CARETSTICKY_WHITESPACE);\n\t\tif (wParam <= SC_CARETSTICKY_WHITESPACE) {\n\t\t\tcaretSticky = wParam;\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETCARETSTICKY:\n\t\treturn caretSticky;\n\n\tcase SCI_TOGGLECARETSTICKY:\n\t\tcaretSticky = !caretSticky;\n\t\tbreak;\n\n\tcase SCI_GETCOLUMN:\n\t\treturn pdoc->GetColumn(wParam);\n\n\tcase SCI_FINDCOLUMN:\n\t\treturn pdoc->FindColumn(wParam, lParam);\n\n\tcase SCI_SETHSCROLLBAR :\n\t\tif (horizontalScrollBarVisible != (wParam != 0)) {\n\t\t\thorizontalScrollBarVisible = wParam != 0;\n\t\t\tSetScrollBars();\n\t\t\tReconfigureScrollBars();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETHSCROLLBAR:\n\t\treturn horizontalScrollBarVisible;\n\n\tcase SCI_SETVSCROLLBAR:\n\t\tif (verticalScrollBarVisible != (wParam != 0)) {\n\t\t\tverticalScrollBarVisible = wParam != 0;\n\t\t\tSetScrollBars();\n\t\t\tReconfigureScrollBars();\n\t\t\tif (verticalScrollBarVisible)\n\t\t\t\tSetVerticalScrollPos();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETVSCROLLBAR:\n\t\treturn verticalScrollBarVisible;\n\n\tcase SCI_SETINDENTATIONGUIDES:\n\t\tvs.viewIndentationGuides = IndentView(wParam);\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_GETINDENTATIONGUIDES:\n\t\treturn vs.viewIndentationGuides;\n\n\tcase SCI_SETHIGHLIGHTGUIDE:\n\t\tif ((highlightGuideColumn != static_cast<int>(wParam)) || (wParam > 0)) {\n\t\t\thighlightGuideColumn = wParam;\n\t\t\tRedraw();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETHIGHLIGHTGUIDE:\n\t\treturn highlightGuideColumn;\n\n\tcase SCI_GETLINEENDPOSITION:\n\t\treturn pdoc->LineEnd(wParam);\n\n\tcase SCI_SETCODEPAGE:\n\t\tif (ValidCodePage(wParam)) {\n\t\t\tif (pdoc->SetDBCSCodePage(wParam)) {\n\t\t\t\tcs.Clear();\n\t\t\t\tcs.InsertLines(0, pdoc->LinesTotal() - 1);\n\t\t\t\tSetAnnotationHeights(0, pdoc->LinesTotal());\n\t\t\t\tInvalidateStyleRedraw();\n\t\t\t\tSetRepresentations();\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETCODEPAGE:\n\t\treturn pdoc->dbcsCodePage;\n\n#ifdef INCLUDE_DEPRECATED_FEATURES\n\tcase SCI_SETUSEPALETTE:\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETUSEPALETTE:\n\t\treturn 0;\n#endif\n\n\t\t// Marker definition and setting\n\tcase SCI_MARKERDEFINE:\n\t\tif (wParam <= MARKER_MAX) {\n\t\t\tvs.markers[wParam].markType = lParam;\n\t\t\tvs.CalcLargestMarkerHeight();\n\t\t}\n\t\tInvalidateStyleData();\n\t\tRedrawSelMargin();\n\t\tbreak;\n\n\tcase SCI_MARKERSYMBOLDEFINED:\n\t\tif (wParam <= MARKER_MAX)\n\t\t\treturn vs.markers[wParam].markType;\n\t\telse\n\t\t\treturn 0;\n\n\tcase SCI_MARKERSETFORE:\n\t\tif (wParam <= MARKER_MAX)\n\t\t\tvs.markers[wParam].fore = ColourDesired(lParam);\n\t\tInvalidateStyleData();\n\t\tRedrawSelMargin();\n\t\tbreak;\n\tcase SCI_MARKERSETBACKSELECTED:\n\t\tif (wParam <= MARKER_MAX)\n\t\t\tvs.markers[wParam].backSelected = ColourDesired(lParam);\n\t\tInvalidateStyleData();\n\t\tRedrawSelMargin();\n\t\tbreak;\n\tcase SCI_MARKERENABLEHIGHLIGHT:\n\t\thighlightDelimiter.isEnabled = wParam == 1;\n\t\tRedrawSelMargin();\n\t\tbreak;\n\tcase SCI_MARKERSETBACK:\n\t\tif (wParam <= MARKER_MAX)\n\t\t\tvs.markers[wParam].back = ColourDesired(lParam);\n\t\tInvalidateStyleData();\n\t\tRedrawSelMargin();\n\t\tbreak;\n\tcase SCI_MARKERSETALPHA:\n\t\tif (wParam <= MARKER_MAX)\n\t\t\tvs.markers[wParam].alpha = lParam;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\tcase SCI_MARKERADD: {\n\t\t\tint markerID = pdoc->AddMark(wParam, lParam);\n\t\t\treturn markerID;\n\t\t}\n\tcase SCI_MARKERADDSET:\n\t\tif (lParam != 0)\n\t\t\tpdoc->AddMarkSet(wParam, lParam);\n\t\tbreak;\n\n\tcase SCI_MARKERDELETE:\n\t\tpdoc->DeleteMark(wParam, lParam);\n\t\tbreak;\n\n\tcase SCI_MARKERDELETEALL:\n\t\tpdoc->DeleteAllMarks(static_cast<int>(wParam));\n\t\tbreak;\n\n\tcase SCI_MARKERGET:\n\t\treturn pdoc->GetMark(wParam);\n\n\tcase SCI_MARKERNEXT:\n\t\treturn pdoc->MarkerNext(wParam, lParam);\n\n\tcase SCI_MARKERPREVIOUS: {\n\t\t\tfor (int iLine = wParam; iLine >= 0; iLine--) {\n\t\t\t\tif ((pdoc->GetMark(iLine) & lParam) != 0)\n\t\t\t\t\treturn iLine;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\n\tcase SCI_MARKERDEFINEPIXMAP:\n\t\tif (wParam <= MARKER_MAX) {\n\t\t\tvs.markers[wParam].SetXPM(CharPtrFromSPtr(lParam));\n\t\t\tvs.CalcLargestMarkerHeight();\n\t\t};\n\t\tInvalidateStyleData();\n\t\tRedrawSelMargin();\n\t\tbreak;\n\n\tcase SCI_RGBAIMAGESETWIDTH:\n\t\tsizeRGBAImage.x = wParam;\n\t\tbreak;\n\n\tcase SCI_RGBAIMAGESETHEIGHT:\n\t\tsizeRGBAImage.y = wParam;\n\t\tbreak;\n\n\tcase SCI_RGBAIMAGESETSCALE:\n\t\tscaleRGBAImage = wParam;\n\t\tbreak;\n\n\tcase SCI_MARKERDEFINERGBAIMAGE:\n\t\tif (wParam <= MARKER_MAX) {\n\t\t\tvs.markers[wParam].SetRGBAImage(sizeRGBAImage, scaleRGBAImage / 100.0, reinterpret_cast<unsigned char *>(lParam));\n\t\t\tvs.CalcLargestMarkerHeight();\n\t\t};\n\t\tInvalidateStyleData();\n\t\tRedrawSelMargin();\n\t\tbreak;\n\n\tcase SCI_SETMARGINTYPEN:\n\t\tif (ValidMargin(wParam)) {\n\t\t\tvs.ms[wParam].style = lParam;\n\t\t\tInvalidateStyleRedraw();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETMARGINTYPEN:\n\t\tif (ValidMargin(wParam))\n\t\t\treturn vs.ms[wParam].style;\n\t\telse\n\t\t\treturn 0;\n\n\tcase SCI_SETMARGINWIDTHN:\n\t\tif (ValidMargin(wParam)) {\n\t\t\t// Short-circuit if the width is unchanged, to avoid unnecessary redraw.\n\t\t\tif (vs.ms[wParam].width != lParam) {\n\t\t\t\tlastXChosen += lParam - vs.ms[wParam].width;\n\t\t\t\tvs.ms[wParam].width = lParam;\n\t\t\t\tInvalidateStyleRedraw();\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETMARGINWIDTHN:\n\t\tif (ValidMargin(wParam))\n\t\t\treturn vs.ms[wParam].width;\n\t\telse\n\t\t\treturn 0;\n\n\tcase SCI_SETMARGINMASKN:\n\t\tif (ValidMargin(wParam)) {\n\t\t\tvs.ms[wParam].mask = lParam;\n\t\t\tInvalidateStyleRedraw();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETMARGINMASKN:\n\t\tif (ValidMargin(wParam))\n\t\t\treturn vs.ms[wParam].mask;\n\t\telse\n\t\t\treturn 0;\n\n\tcase SCI_SETMARGINSENSITIVEN:\n\t\tif (ValidMargin(wParam)) {\n\t\t\tvs.ms[wParam].sensitive = lParam != 0;\n\t\t\tInvalidateStyleRedraw();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_GETMARGINSENSITIVEN:\n\t\tif (ValidMargin(wParam))\n\t\t\treturn vs.ms[wParam].sensitive ? 1 : 0;\n\t\telse\n\t\t\treturn 0;\n\n\tcase SCI_SETMARGINCURSORN:\n\t\tif (ValidMargin(wParam))\n\t\t\tvs.ms[wParam].cursor = lParam;\n\t\tbreak;\n\n\tcase SCI_GETMARGINCURSORN:\n\t\tif (ValidMargin(wParam))\n\t\t\treturn vs.ms[wParam].cursor;\n\t\telse\n\t\t\treturn 0;\n\n\tcase SCI_STYLECLEARALL:\n\t\tvs.ClearStyles();\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_STYLESETFORE:\n\tcase SCI_STYLESETBACK:\n\tcase SCI_STYLESETBOLD:\n\tcase SCI_STYLESETWEIGHT:\n\tcase SCI_STYLESETITALIC:\n\tcase SCI_STYLESETEOLFILLED:\n\tcase SCI_STYLESETSIZE:\n\tcase SCI_STYLESETSIZEFRACTIONAL:\n\tcase SCI_STYLESETFONT:\n\tcase SCI_STYLESETUNDERLINE:\n\tcase SCI_STYLESETCASE:\n\tcase SCI_STYLESETCHARACTERSET:\n\tcase SCI_STYLESETVISIBLE:\n\tcase SCI_STYLESETCHANGEABLE:\n\tcase SCI_STYLESETHOTSPOT:\n\t\tStyleSetMessage(iMessage, wParam, lParam);\n\t\tbreak;\n\n\tcase SCI_STYLEGETFORE:\n\tcase SCI_STYLEGETBACK:\n\tcase SCI_STYLEGETBOLD:\n\tcase SCI_STYLEGETWEIGHT:\n\tcase SCI_STYLEGETITALIC:\n\tcase SCI_STYLEGETEOLFILLED:\n\tcase SCI_STYLEGETSIZE:\n\tcase SCI_STYLEGETSIZEFRACTIONAL:\n\tcase SCI_STYLEGETFONT:\n\tcase SCI_STYLEGETUNDERLINE:\n\tcase SCI_STYLEGETCASE:\n\tcase SCI_STYLEGETCHARACTERSET:\n\tcase SCI_STYLEGETVISIBLE:\n\tcase SCI_STYLEGETCHANGEABLE:\n\tcase SCI_STYLEGETHOTSPOT:\n\t\treturn StyleGetMessage(iMessage, wParam, lParam);\n\n\tcase SCI_STYLERESETDEFAULT:\n\t\tvs.ResetDefaultStyle();\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\tcase SCI_SETSTYLEBITS:\n\t\tvs.EnsureStyle((1 << wParam) - 1);\n\t\tpdoc->SetStylingBits(wParam);\n\t\tbreak;\n\n\tcase SCI_GETSTYLEBITS:\n\t\treturn pdoc->stylingBits;\n\n\tcase SCI_SETLINESTATE:\n\t\treturn pdoc->SetLineState(wParam, lParam);\n\n\tcase SCI_GETLINESTATE:\n\t\treturn pdoc->GetLineState(wParam);\n\n\tcase SCI_GETMAXLINESTATE:\n\t\treturn pdoc->GetMaxLineState();\n\n\tcase SCI_GETCARETLINEVISIBLE:\n\t\treturn vs.showCaretLineBackground;\n\tcase SCI_SETCARETLINEVISIBLE:\n\t\tvs.showCaretLineBackground = wParam != 0;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\tcase SCI_GETCARETLINEVISIBLEALWAYS:\n\t\treturn vs.alwaysShowCaretLineBackground;\n\tcase SCI_SETCARETLINEVISIBLEALWAYS:\n\t\tvs.alwaysShowCaretLineBackground = wParam != 0;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETCARETLINEBACK:\n\t\treturn vs.caretLineBackground.AsLong();\n\tcase SCI_SETCARETLINEBACK:\n\t\tvs.caretLineBackground = wParam;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\tcase SCI_GETCARETLINEBACKALPHA:\n\t\treturn vs.caretLineAlpha;\n\tcase SCI_SETCARETLINEBACKALPHA:\n\t\tvs.caretLineAlpha = wParam;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\t\t// Folding messages\n\n\tcase SCI_VISIBLEFROMDOCLINE:\n\t\treturn cs.DisplayFromDoc(wParam);\n\n\tcase SCI_DOCLINEFROMVISIBLE:\n\t\treturn cs.DocFromDisplay(wParam);\n\n\tcase SCI_WRAPCOUNT:\n\t\treturn WrapCount(wParam);\n\n\tcase SCI_SETFOLDLEVEL: {\n\t\t\tint prev = pdoc->SetLevel(wParam, lParam);\n\t\t\tif (prev != lParam)\n\t\t\t\tRedrawSelMargin();\n\t\t\treturn prev;\n\t\t}\n\n\tcase SCI_GETFOLDLEVEL:\n\t\treturn pdoc->GetLevel(wParam);\n\n\tcase SCI_GETLASTCHILD:\n\t\treturn pdoc->GetLastChild(wParam, lParam);\n\n\tcase SCI_GETFOLDPARENT:\n\t\treturn pdoc->GetFoldParent(wParam);\n\n\tcase SCI_SHOWLINES:\n\t\tcs.SetVisible(wParam, lParam, true);\n\t\tSetScrollBars();\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_HIDELINES:\n\t\tif (wParam > 0)\n\t\t\tcs.SetVisible(wParam, lParam, false);\n\t\tSetScrollBars();\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_GETLINEVISIBLE:\n\t\treturn cs.GetVisible(wParam);\n\n\tcase SCI_GETALLLINESVISIBLE:\n\t\treturn cs.HiddenLines() ? 0 : 1;\n\n\tcase SCI_SETFOLDEXPANDED:\n\t\tSetFoldExpanded(wParam, lParam != 0);\n\t\tbreak;\n\n\tcase SCI_GETFOLDEXPANDED:\n\t\treturn cs.GetExpanded(wParam);\n\n\tcase SCI_SETAUTOMATICFOLD:\n\t\tfoldAutomatic = wParam;\n\t\tbreak;\n\n\tcase SCI_GETAUTOMATICFOLD:\n\t\treturn foldAutomatic;\n\n\tcase SCI_SETFOLDFLAGS:\n\t\tfoldFlags = wParam;\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_TOGGLEFOLD:\n\t\tFoldLine(wParam, SC_FOLDACTION_TOGGLE);\n\t\tbreak;\n\n\tcase SCI_FOLDLINE:\n\t\tFoldLine(wParam, lParam);\n\t\tbreak;\n\n\tcase SCI_FOLDCHILDREN:\n\t\tFoldExpand(wParam, lParam, pdoc->GetLevel(wParam));\n\t\tbreak;\n\n\tcase SCI_FOLDALL:\n\t\tFoldAll(wParam);\n\t\tbreak;\n\n\tcase SCI_EXPANDCHILDREN:\n\t\tFoldExpand(wParam, SC_FOLDACTION_EXPAND, lParam);\n\t\tbreak;\n\n\tcase SCI_CONTRACTEDFOLDNEXT:\n\t\treturn ContractedFoldNext(wParam);\n\n\tcase SCI_ENSUREVISIBLE:\n\t\tEnsureLineVisible(wParam, false);\n\t\tbreak;\n\n\tcase SCI_ENSUREVISIBLEENFORCEPOLICY:\n\t\tEnsureLineVisible(wParam, true);\n\t\tbreak;\n\n\tcase SCI_SCROLLRANGE:\n\t\tScrollRange(SelectionRange(lParam, wParam));\n\t\tbreak;\n\n\tcase SCI_SEARCHANCHOR:\n\t\tSearchAnchor();\n\t\tbreak;\n\n\tcase SCI_SEARCHNEXT:\n\tcase SCI_SEARCHPREV:\n\t\treturn SearchText(iMessage, wParam, lParam);\n\n\tcase SCI_SETXCARETPOLICY:\n\t\tcaretXPolicy = wParam;\n\t\tcaretXSlop = lParam;\n\t\tbreak;\n\n\tcase SCI_SETYCARETPOLICY:\n\t\tcaretYPolicy = wParam;\n\t\tcaretYSlop = lParam;\n\t\tbreak;\n\n\tcase SCI_SETVISIBLEPOLICY:\n\t\tvisiblePolicy = wParam;\n\t\tvisibleSlop = lParam;\n\t\tbreak;\n\n\tcase SCI_LINESONSCREEN:\n\t\treturn LinesOnScreen();\n\n\tcase SCI_SETSELFORE:\n\t\tvs.selColours.fore = ColourOptional(wParam, lParam);\n\t\tvs.selAdditionalForeground = ColourDesired(lParam);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_SETSELBACK:\n\t\tvs.selColours.back = ColourOptional(wParam, lParam);\n\t\tvs.selAdditionalBackground = ColourDesired(lParam);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_SETSELALPHA:\n\t\tvs.selAlpha = wParam;\n\t\tvs.selAdditionalAlpha = wParam;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETSELALPHA:\n\t\treturn vs.selAlpha;\n\n\tcase SCI_GETSELEOLFILLED:\n\t\treturn vs.selEOLFilled;\n\n\tcase SCI_SETSELEOLFILLED:\n\t\tvs.selEOLFilled = wParam != 0;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_SETWHITESPACEFORE:\n\t\tvs.whitespaceColours.fore = ColourOptional(wParam, lParam);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_SETWHITESPACEBACK:\n\t\tvs.whitespaceColours.back = ColourOptional(wParam, lParam);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_SETCARETFORE:\n\t\tvs.caretcolour = ColourDesired(wParam);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETCARETFORE:\n\t\treturn vs.caretcolour.AsLong();\n\n\tcase SCI_SETCARETSTYLE:\n\t\tif (wParam <= CARETSTYLE_BLOCK)\n\t\t\tvs.caretStyle = wParam;\n\t\telse\n\t\t\t/* Default to the line caret */\n\t\t\tvs.caretStyle = CARETSTYLE_LINE;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETCARETSTYLE:\n\t\treturn vs.caretStyle;\n\n\tcase SCI_SETCARETWIDTH:\n\t\tif (static_cast<int>(wParam) <= 0)\n\t\t\tvs.caretWidth = 0;\n\t\telse if (wParam >= 3)\n\t\t\tvs.caretWidth = 3;\n\t\telse\n\t\t\tvs.caretWidth = wParam;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETCARETWIDTH:\n\t\treturn vs.caretWidth;\n\n\tcase SCI_ASSIGNCMDKEY:\n\t\tkmap.AssignCmdKey(Platform::LowShortFromLong(wParam),\n\t\t        Platform::HighShortFromLong(wParam), lParam);\n\t\tbreak;\n\n\tcase SCI_CLEARCMDKEY:\n\t\tkmap.AssignCmdKey(Platform::LowShortFromLong(wParam),\n\t\t        Platform::HighShortFromLong(wParam), SCI_NULL);\n\t\tbreak;\n\n\tcase SCI_CLEARALLCMDKEYS:\n\t\tkmap.Clear();\n\t\tbreak;\n\n\tcase SCI_INDICSETSTYLE:\n\t\tif (wParam <= INDIC_MAX) {\n\t\t\tvs.indicators[wParam].style = lParam;\n\t\t\tInvalidateStyleRedraw();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_INDICGETSTYLE:\n\t\treturn (wParam <= INDIC_MAX) ? vs.indicators[wParam].style : 0;\n\n\tcase SCI_INDICSETFORE:\n\t\tif (wParam <= INDIC_MAX) {\n\t\t\tvs.indicators[wParam].fore = ColourDesired(lParam);\n\t\t\tInvalidateStyleRedraw();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_INDICGETFORE:\n\t\treturn (wParam <= INDIC_MAX) ? vs.indicators[wParam].fore.AsLong() : 0;\n\n\tcase SCI_INDICSETUNDER:\n\t\tif (wParam <= INDIC_MAX) {\n\t\t\tvs.indicators[wParam].under = lParam != 0;\n\t\t\tInvalidateStyleRedraw();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_INDICGETUNDER:\n\t\treturn (wParam <= INDIC_MAX) ? vs.indicators[wParam].under : 0;\n\n\tcase SCI_INDICSETALPHA:\n\t\tif (wParam <= INDIC_MAX && lParam >=0 && lParam <= 255) {\n\t\t\tvs.indicators[wParam].fillAlpha = lParam;\n\t\t\tInvalidateStyleRedraw();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_INDICGETALPHA:\n\t\treturn (wParam <= INDIC_MAX) ? vs.indicators[wParam].fillAlpha : 0;\n\n\tcase SCI_INDICSETOUTLINEALPHA:\n\t\tif (wParam <= INDIC_MAX && lParam >=0 && lParam <= 255) {\n\t\t\tvs.indicators[wParam].outlineAlpha = lParam;\n\t\t\tInvalidateStyleRedraw();\n\t\t}\n\t\tbreak;\n\n\tcase SCI_INDICGETOUTLINEALPHA:\n\t\treturn (wParam <= INDIC_MAX) ? vs.indicators[wParam].outlineAlpha : 0;\n\n\tcase SCI_SETINDICATORCURRENT:\n\t\tpdoc->decorations.SetCurrentIndicator(wParam);\n\t\tbreak;\n\tcase SCI_GETINDICATORCURRENT:\n\t\treturn pdoc->decorations.GetCurrentIndicator();\n\tcase SCI_SETINDICATORVALUE:\n\t\tpdoc->decorations.SetCurrentValue(wParam);\n\t\tbreak;\n\tcase SCI_GETINDICATORVALUE:\n\t\treturn pdoc->decorations.GetCurrentValue();\n\n\tcase SCI_INDICATORFILLRANGE:\n\t\tpdoc->DecorationFillRange(wParam, pdoc->decorations.GetCurrentValue(), lParam);\n\t\tbreak;\n\n\tcase SCI_INDICATORCLEARRANGE:\n\t\tpdoc->DecorationFillRange(wParam, 0, lParam);\n\t\tbreak;\n\n\tcase SCI_INDICATORALLONFOR:\n\t\treturn pdoc->decorations.AllOnFor(wParam);\n\n\tcase SCI_INDICATORVALUEAT:\n\t\treturn pdoc->decorations.ValueAt(wParam, lParam);\n\n\tcase SCI_INDICATORSTART:\n\t\treturn pdoc->decorations.Start(wParam, lParam);\n\n\tcase SCI_INDICATOREND:\n\t\treturn pdoc->decorations.End(wParam, lParam);\n\n\tcase SCI_LINEDOWN:\n\tcase SCI_LINEDOWNEXTEND:\n\tcase SCI_PARADOWN:\n\tcase SCI_PARADOWNEXTEND:\n\tcase SCI_LINEUP:\n\tcase SCI_LINEUPEXTEND:\n\tcase SCI_PARAUP:\n\tcase SCI_PARAUPEXTEND:\n\tcase SCI_CHARLEFT:\n\tcase SCI_CHARLEFTEXTEND:\n\tcase SCI_CHARRIGHT:\n\tcase SCI_CHARRIGHTEXTEND:\n\tcase SCI_WORDLEFT:\n\tcase SCI_WORDLEFTEXTEND:\n\tcase SCI_WORDRIGHT:\n\tcase SCI_WORDRIGHTEXTEND:\n\tcase SCI_WORDLEFTEND:\n\tcase SCI_WORDLEFTENDEXTEND:\n\tcase SCI_WORDRIGHTEND:\n\tcase SCI_WORDRIGHTENDEXTEND:\n\tcase SCI_HOME:\n\tcase SCI_HOMEEXTEND:\n\tcase SCI_LINEEND:\n\tcase SCI_LINEENDEXTEND:\n\tcase SCI_HOMEWRAP:\n\tcase SCI_HOMEWRAPEXTEND:\n\tcase SCI_LINEENDWRAP:\n\tcase SCI_LINEENDWRAPEXTEND:\n\tcase SCI_DOCUMENTSTART:\n\tcase SCI_DOCUMENTSTARTEXTEND:\n\tcase SCI_DOCUMENTEND:\n\tcase SCI_DOCUMENTENDEXTEND:\n\tcase SCI_SCROLLTOSTART:\n\tcase SCI_SCROLLTOEND:\n\n\tcase SCI_STUTTEREDPAGEUP:\n\tcase SCI_STUTTEREDPAGEUPEXTEND:\n\tcase SCI_STUTTEREDPAGEDOWN:\n\tcase SCI_STUTTEREDPAGEDOWNEXTEND:\n\n\tcase SCI_PAGEUP:\n\tcase SCI_PAGEUPEXTEND:\n\tcase SCI_PAGEDOWN:\n\tcase SCI_PAGEDOWNEXTEND:\n\tcase SCI_EDITTOGGLEOVERTYPE:\n\tcase SCI_CANCEL:\n\tcase SCI_DELETEBACK:\n\tcase SCI_TAB:\n\tcase SCI_BACKTAB:\n\tcase SCI_NEWLINE:\n\tcase SCI_FORMFEED:\n\tcase SCI_VCHOME:\n\tcase SCI_VCHOMEEXTEND:\n\tcase SCI_VCHOMEWRAP:\n\tcase SCI_VCHOMEWRAPEXTEND:\n\tcase SCI_VCHOMEDISPLAY:\n\tcase SCI_VCHOMEDISPLAYEXTEND:\n\tcase SCI_ZOOMIN:\n\tcase SCI_ZOOMOUT:\n\tcase SCI_DELWORDLEFT:\n\tcase SCI_DELWORDRIGHT:\n\tcase SCI_DELWORDRIGHTEND:\n\tcase SCI_DELLINELEFT:\n\tcase SCI_DELLINERIGHT:\n\tcase SCI_LINECOPY:\n\tcase SCI_LINECUT:\n\tcase SCI_LINEDELETE:\n\tcase SCI_LINETRANSPOSE:\n\tcase SCI_LINEDUPLICATE:\n\tcase SCI_LOWERCASE:\n\tcase SCI_UPPERCASE:\n\tcase SCI_LINESCROLLDOWN:\n\tcase SCI_LINESCROLLUP:\n\tcase SCI_WORDPARTLEFT:\n\tcase SCI_WORDPARTLEFTEXTEND:\n\tcase SCI_WORDPARTRIGHT:\n\tcase SCI_WORDPARTRIGHTEXTEND:\n\tcase SCI_DELETEBACKNOTLINE:\n\tcase SCI_HOMEDISPLAY:\n\tcase SCI_HOMEDISPLAYEXTEND:\n\tcase SCI_LINEENDDISPLAY:\n\tcase SCI_LINEENDDISPLAYEXTEND:\n\tcase SCI_LINEDOWNRECTEXTEND:\n\tcase SCI_LINEUPRECTEXTEND:\n\tcase SCI_CHARLEFTRECTEXTEND:\n\tcase SCI_CHARRIGHTRECTEXTEND:\n\tcase SCI_HOMERECTEXTEND:\n\tcase SCI_VCHOMERECTEXTEND:\n\tcase SCI_LINEENDRECTEXTEND:\n\tcase SCI_PAGEUPRECTEXTEND:\n\tcase SCI_PAGEDOWNRECTEXTEND:\n\tcase SCI_SELECTIONDUPLICATE:\n\t\treturn KeyCommand(iMessage);\n\n\tcase SCI_BRACEHIGHLIGHT:\n\t\tSetBraceHighlight(static_cast<int>(wParam), lParam, STYLE_BRACELIGHT);\n\t\tbreak;\n\n\tcase SCI_BRACEHIGHLIGHTINDICATOR:\n\t\tif (lParam >= 0 && lParam <= INDIC_MAX) {\n\t\t\tvs.braceHighlightIndicatorSet = wParam != 0;\n\t\t\tvs.braceHighlightIndicator = lParam;\n\t\t}\n\t\tbreak;\n\n\tcase SCI_BRACEBADLIGHT:\n\t\tSetBraceHighlight(static_cast<int>(wParam), -1, STYLE_BRACEBAD);\n\t\tbreak;\n\n\tcase SCI_BRACEBADLIGHTINDICATOR:\n\t\tif (lParam >= 0 && lParam <= INDIC_MAX) {\n\t\t\tvs.braceBadLightIndicatorSet = wParam != 0;\n\t\t\tvs.braceBadLightIndicator = lParam;\n\t\t}\n\t\tbreak;\n\n\tcase SCI_BRACEMATCH:\n\t\t// wParam is position of char to find brace for,\n\t\t// lParam is maximum amount of text to restyle to find it\n\t\treturn pdoc->BraceMatch(wParam, lParam);\n\n\tcase SCI_GETVIEWEOL:\n\t\treturn vs.viewEOL;\n\n\tcase SCI_SETVIEWEOL:\n\t\tvs.viewEOL = wParam != 0;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_SETZOOM:\n\t\tvs.zoomLevel = wParam;\n\t\tInvalidateStyleRedraw();\n\t\tNotifyZoom();\n\t\tbreak;\n\n\tcase SCI_GETZOOM:\n\t\treturn vs.zoomLevel;\n\n\tcase SCI_GETEDGECOLUMN:\n\t\treturn vs.theEdge;\n\n\tcase SCI_SETEDGECOLUMN:\n\t\tvs.theEdge = wParam;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETEDGEMODE:\n\t\treturn vs.edgeState;\n\n\tcase SCI_SETEDGEMODE:\n\t\tvs.edgeState = wParam;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETEDGECOLOUR:\n\t\treturn vs.edgecolour.AsLong();\n\n\tcase SCI_SETEDGECOLOUR:\n\t\tvs.edgecolour = ColourDesired(wParam);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETDOCPOINTER:\n\t\treturn reinterpret_cast<sptr_t>(pdoc);\n\n\tcase SCI_SETDOCPOINTER:\n\t\tCancelModes();\n\t\tSetDocPointer(reinterpret_cast<Document *>(lParam));\n\t\treturn 0;\n\n\tcase SCI_CREATEDOCUMENT: {\n\t\t\tDocument *doc = new Document();\n\t\t\tdoc->AddRef();\n\t\t\treturn reinterpret_cast<sptr_t>(doc);\n\t\t}\n\n\tcase SCI_ADDREFDOCUMENT:\n\t\t(reinterpret_cast<Document *>(lParam))->AddRef();\n\t\tbreak;\n\n\tcase SCI_RELEASEDOCUMENT:\n\t\t(reinterpret_cast<Document *>(lParam))->Release();\n\t\tbreak;\n\n\tcase SCI_CREATELOADER: {\n\t\t\tDocument *doc = new Document();\n\t\t\tdoc->AddRef();\n\t\t\tdoc->Allocate(wParam);\n\t\t\tdoc->SetUndoCollection(false);\n\t\t\treturn reinterpret_cast<sptr_t>(static_cast<ILoader *>(doc));\n\t\t}\n\n\tcase SCI_SETMODEVENTMASK:\n\t\tmodEventMask = wParam;\n\t\treturn 0;\n\n\tcase SCI_GETMODEVENTMASK:\n\t\treturn modEventMask;\n\n\tcase SCI_CONVERTEOLS:\n\t\tpdoc->ConvertLineEnds(wParam);\n\t\tSetSelection(sel.MainCaret(), sel.MainAnchor());\t// Ensure selection inside document\n\t\treturn 0;\n\n\tcase SCI_SETLENGTHFORENCODE:\n\t\tlengthForEncode = wParam;\n\t\treturn 0;\n\n\tcase SCI_SELECTIONISRECTANGLE:\n\t\treturn sel.selType == Selection::selRectangle ? 1 : 0;\n\n\tcase SCI_SETSELECTIONMODE: {\n\t\t\tswitch (wParam) {\n\t\t\tcase SC_SEL_STREAM:\n\t\t\t\tsel.SetMoveExtends(!sel.MoveExtends() || (sel.selType != Selection::selStream));\n\t\t\t\tsel.selType = Selection::selStream;\n\t\t\t\tbreak;\n\t\t\tcase SC_SEL_RECTANGLE:\n\t\t\t\tsel.SetMoveExtends(!sel.MoveExtends() || (sel.selType != Selection::selRectangle));\n\t\t\t\tsel.selType = Selection::selRectangle;\n\t\t\t\tbreak;\n\t\t\tcase SC_SEL_LINES:\n\t\t\t\tsel.SetMoveExtends(!sel.MoveExtends() || (sel.selType != Selection::selLines));\n\t\t\t\tsel.selType = Selection::selLines;\n\t\t\t\tbreak;\n\t\t\tcase SC_SEL_THIN:\n\t\t\t\tsel.SetMoveExtends(!sel.MoveExtends() || (sel.selType != Selection::selThin));\n\t\t\t\tsel.selType = Selection::selThin;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tsel.SetMoveExtends(!sel.MoveExtends() || (sel.selType != Selection::selStream));\n\t\t\t\tsel.selType = Selection::selStream;\n\t\t\t}\n\t\t\tInvalidateSelection(sel.RangeMain(), true);\n\t\t\tbreak;\n\t\t}\n\tcase SCI_GETSELECTIONMODE:\n\t\tswitch (sel.selType) {\n\t\tcase Selection::selStream:\n\t\t\treturn SC_SEL_STREAM;\n\t\tcase Selection::selRectangle:\n\t\t\treturn SC_SEL_RECTANGLE;\n\t\tcase Selection::selLines:\n\t\t\treturn SC_SEL_LINES;\n\t\tcase Selection::selThin:\n\t\t\treturn SC_SEL_THIN;\n\t\tdefault:\t// ?!\n\t\t\treturn SC_SEL_STREAM;\n\t\t}\n\tcase SCI_GETLINESELSTARTPOSITION:\n\tcase SCI_GETLINESELENDPOSITION: {\n\t\t\tSelectionSegment segmentLine(SelectionPosition(pdoc->LineStart(wParam)),\n\t\t\t\tSelectionPosition(pdoc->LineEnd(wParam)));\n\t\t\tfor (size_t r=0; r<sel.Count(); r++) {\n\t\t\t\tSelectionSegment portion = sel.Range(r).Intersect(segmentLine);\n\t\t\t\tif (portion.start.IsValid()) {\n\t\t\t\t\treturn (iMessage == SCI_GETLINESELSTARTPOSITION) ? portion.start.Position() : portion.end.Position();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn INVALID_POSITION;\n\t\t}\n\n\tcase SCI_SETOVERTYPE:\n\t\tinOverstrike = wParam != 0;\n\t\tbreak;\n\n\tcase SCI_GETOVERTYPE:\n\t\treturn inOverstrike ? 1 : 0;\n\n\tcase SCI_SETFOCUS:\n\t\tSetFocusState(wParam != 0);\n\t\tbreak;\n\n\tcase SCI_GETFOCUS:\n\t\treturn hasFocus;\n\n\tcase SCI_SETSTATUS:\n\t\terrorStatus = wParam;\n\t\tbreak;\n\n\tcase SCI_GETSTATUS:\n\t\treturn errorStatus;\n\n\tcase SCI_SETMOUSEDOWNCAPTURES:\n\t\tmouseDownCaptures = wParam != 0;\n\t\tbreak;\n\n\tcase SCI_GETMOUSEDOWNCAPTURES:\n\t\treturn mouseDownCaptures;\n\n\tcase SCI_SETCURSOR:\n\t\tcursorMode = wParam;\n\t\tDisplayCursor(Window::cursorText);\n\t\tbreak;\n\n\tcase SCI_GETCURSOR:\n\t\treturn cursorMode;\n\n\tcase SCI_SETCONTROLCHARSYMBOL:\n\t\tvs.controlCharSymbol = wParam;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETCONTROLCHARSYMBOL:\n\t\treturn vs.controlCharSymbol;\n\n\tcase SCI_SETREPRESENTATION:\n\t\treprs.SetRepresentation(reinterpret_cast<const char *>(wParam), CharPtrFromSPtr(lParam));\n\t\tbreak;\n\n\tcase SCI_GETREPRESENTATION: {\n\t\t\tRepresentation *repr = reprs.RepresentationFromCharacter(\n\t\t\t\treinterpret_cast<const char *>(wParam), UTF8MaxBytes);\n\t\t\tif (repr) {\n\t\t\t\tif (lParam != 0)\n\t\t\t\t\tstrcpy(CharPtrFromSPtr(lParam), repr->stringRep.c_str());\n\t\t\t\treturn repr->stringRep.size();\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\n\tcase SCI_CLEARREPRESENTATION:\n\t\treprs.ClearRepresentation(reinterpret_cast<const char *>(wParam));\n\t\tbreak;\n\n\tcase SCI_STARTRECORD:\n\t\trecordingMacro = true;\n\t\treturn 0;\n\n\tcase SCI_STOPRECORD:\n\t\trecordingMacro = false;\n\t\treturn 0;\n\n\tcase SCI_MOVECARETINSIDEVIEW:\n\t\tMoveCaretInsideView();\n\t\tbreak;\n\n\tcase SCI_SETFOLDMARGINCOLOUR:\n\t\tvs.foldmarginColour = ColourOptional(wParam, lParam);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_SETFOLDMARGINHICOLOUR:\n\t\tvs.foldmarginHighlightColour = ColourOptional(wParam, lParam);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_SETHOTSPOTACTIVEFORE:\n\t\tvs.hotspotColours.fore = ColourOptional(wParam, lParam);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETHOTSPOTACTIVEFORE:\n\t\treturn vs.hotspotColours.fore.AsLong();\n\n\tcase SCI_SETHOTSPOTACTIVEBACK:\n\t\tvs.hotspotColours.back = ColourOptional(wParam, lParam);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETHOTSPOTACTIVEBACK:\n\t\treturn vs.hotspotColours.back.AsLong();\n\n\tcase SCI_SETHOTSPOTACTIVEUNDERLINE:\n\t\tvs.hotspotUnderline = wParam != 0;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETHOTSPOTACTIVEUNDERLINE:\n\t\treturn vs.hotspotUnderline ? 1 : 0;\n\n\tcase SCI_SETHOTSPOTSINGLELINE:\n\t\tvs.hotspotSingleLine = wParam != 0;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETHOTSPOTSINGLELINE:\n\t\treturn vs.hotspotSingleLine ? 1 : 0;\n\n\tcase SCI_SETPASTECONVERTENDINGS:\n\t\tconvertPastes = wParam != 0;\n\t\tbreak;\n\n\tcase SCI_GETPASTECONVERTENDINGS:\n\t\treturn convertPastes ? 1 : 0;\n\n\tcase SCI_GETCHARACTERPOINTER:\n\t\treturn reinterpret_cast<sptr_t>(pdoc->BufferPointer());\n\n\tcase SCI_GETRANGEPOINTER:\n\t\treturn reinterpret_cast<sptr_t>(pdoc->RangePointer(wParam, lParam));\n\n\tcase SCI_GETGAPPOSITION:\n\t\treturn pdoc->GapPosition();\n\n\tcase SCI_SETEXTRAASCENT:\n\t\tvs.extraAscent = wParam;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETEXTRAASCENT:\n\t\treturn vs.extraAscent;\n\n\tcase SCI_SETEXTRADESCENT:\n\t\tvs.extraDescent = wParam;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETEXTRADESCENT:\n\t\treturn vs.extraDescent;\n\n\tcase SCI_MARGINSETSTYLEOFFSET:\n\t\tvs.marginStyleOffset = wParam;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_MARGINGETSTYLEOFFSET:\n\t\treturn vs.marginStyleOffset;\n\n\tcase SCI_SETMARGINOPTIONS:\n\t\tmarginOptions = wParam;\n\t\tbreak;\n\n\tcase SCI_GETMARGINOPTIONS:\n\t\treturn marginOptions;\n\n\tcase SCI_MARGINSETTEXT:\n\t\tpdoc->MarginSetText(wParam, CharPtrFromSPtr(lParam));\n\t\tbreak;\n\n\tcase SCI_MARGINGETTEXT: {\n\t\t\tconst StyledText st = pdoc->MarginStyledText(wParam);\n\t\t\tif (lParam) {\n\t\t\t\tif (st.text)\n\t\t\t\t\tmemcpy(CharPtrFromSPtr(lParam), st.text, st.length);\n\t\t\t\telse\n\t\t\t\t\tstrcpy(CharPtrFromSPtr(lParam), \"\");\n\t\t\t}\n\t\t\treturn st.length;\n\t\t}\n\n\tcase SCI_MARGINSETSTYLE:\n\t\tpdoc->MarginSetStyle(wParam, lParam);\n\t\tbreak;\n\n\tcase SCI_MARGINGETSTYLE: {\n\t\t\tconst StyledText st = pdoc->MarginStyledText(wParam);\n\t\t\treturn st.style;\n\t\t}\n\n\tcase SCI_MARGINSETSTYLES:\n\t\tpdoc->MarginSetStyles(wParam, reinterpret_cast<const unsigned char *>(lParam));\n\t\tbreak;\n\n\tcase SCI_MARGINGETSTYLES: {\n\t\t\tconst StyledText st = pdoc->MarginStyledText(wParam);\n\t\t\tif (lParam) {\n\t\t\t\tif (st.styles)\n\t\t\t\t\tmemcpy(CharPtrFromSPtr(lParam), st.styles, st.length);\n\t\t\t\telse\n\t\t\t\t\tstrcpy(CharPtrFromSPtr(lParam), \"\");\n\t\t\t}\n\t\t\treturn st.styles ? st.length : 0;\n\t\t}\n\n\tcase SCI_MARGINTEXTCLEARALL:\n\t\tpdoc->MarginClearAll();\n\t\tbreak;\n\n\tcase SCI_ANNOTATIONSETTEXT:\n\t\tpdoc->AnnotationSetText(wParam, CharPtrFromSPtr(lParam));\n\t\tbreak;\n\n\tcase SCI_ANNOTATIONGETTEXT: {\n\t\t\tconst StyledText st = pdoc->AnnotationStyledText(wParam);\n\t\t\tif (lParam) {\n\t\t\t\tif (st.text)\n\t\t\t\t\tmemcpy(CharPtrFromSPtr(lParam), st.text, st.length);\n\t\t\t\telse\n\t\t\t\t\tstrcpy(CharPtrFromSPtr(lParam), \"\");\n\t\t\t}\n\t\t\treturn st.length;\n\t\t}\n\n\tcase SCI_ANNOTATIONGETSTYLE: {\n\t\t\tconst StyledText st = pdoc->AnnotationStyledText(wParam);\n\t\t\treturn st.style;\n\t\t}\n\n\tcase SCI_ANNOTATIONSETSTYLE:\n\t\tpdoc->AnnotationSetStyle(wParam, lParam);\n\t\tbreak;\n\n\tcase SCI_ANNOTATIONSETSTYLES:\n\t\tpdoc->AnnotationSetStyles(wParam, reinterpret_cast<const unsigned char *>(lParam));\n\t\tbreak;\n\n\tcase SCI_ANNOTATIONGETSTYLES: {\n\t\t\tconst StyledText st = pdoc->AnnotationStyledText(wParam);\n\t\t\tif (lParam) {\n\t\t\t\tif (st.styles)\n\t\t\t\t\tmemcpy(CharPtrFromSPtr(lParam), st.styles, st.length);\n\t\t\t\telse\n\t\t\t\t\tstrcpy(CharPtrFromSPtr(lParam), \"\");\n\t\t\t}\n\t\t\treturn st.styles ? st.length : 0;\n\t\t}\n\n\tcase SCI_ANNOTATIONGETLINES:\n\t\treturn pdoc->AnnotationLines(wParam);\n\n\tcase SCI_ANNOTATIONCLEARALL:\n\t\tpdoc->AnnotationClearAll();\n\t\tbreak;\n\n\tcase SCI_ANNOTATIONSETVISIBLE:\n\t\tSetAnnotationVisible(wParam);\n\t\tbreak;\n\n\tcase SCI_ANNOTATIONGETVISIBLE:\n\t\treturn vs.annotationVisible;\n\n\tcase SCI_ANNOTATIONSETSTYLEOFFSET:\n\t\tvs.annotationStyleOffset = wParam;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_ANNOTATIONGETSTYLEOFFSET:\n\t\treturn vs.annotationStyleOffset;\n\n\tcase SCI_RELEASEALLEXTENDEDSTYLES:\n\t\tvs.ReleaseAllExtendedStyles();\n\t\tbreak;\n\n\tcase SCI_ALLOCATEEXTENDEDSTYLES:\n\t\treturn vs.AllocateExtendedStyles(wParam);\n\n\tcase SCI_ADDUNDOACTION:\n\t\tpdoc->AddUndoAction(wParam, lParam & UNDO_MAY_COALESCE);\n\t\tbreak;\n\n\tcase SCI_SETMOUSESELECTIONRECTANGULARSWITCH:\n\t\tmouseSelectionRectangularSwitch = wParam != 0;\n\t\tbreak;\n\n\tcase SCI_GETMOUSESELECTIONRECTANGULARSWITCH:\n\t\treturn mouseSelectionRectangularSwitch;\n\n\tcase SCI_SETMULTIPLESELECTION:\n\t\tmultipleSelection = wParam != 0;\n\t\tInvalidateCaret();\n\t\tbreak;\n\n\tcase SCI_GETMULTIPLESELECTION:\n\t\treturn multipleSelection;\n\n\tcase SCI_SETADDITIONALSELECTIONTYPING:\n\t\tadditionalSelectionTyping = wParam != 0;\n\t\tInvalidateCaret();\n\t\tbreak;\n\n\tcase SCI_GETADDITIONALSELECTIONTYPING:\n\t\treturn additionalSelectionTyping;\n\n\tcase SCI_SETMULTIPASTE:\n\t\tmultiPasteMode = wParam;\n\t\tbreak;\n\n\tcase SCI_GETMULTIPASTE:\n\t\treturn multiPasteMode;\n\n\tcase SCI_SETADDITIONALCARETSBLINK:\n\t\tadditionalCaretsBlink = wParam != 0;\n\t\tInvalidateCaret();\n\t\tbreak;\n\n\tcase SCI_GETADDITIONALCARETSBLINK:\n\t\treturn additionalCaretsBlink;\n\n\tcase SCI_SETADDITIONALCARETSVISIBLE:\n\t\tadditionalCaretsVisible = wParam != 0;\n\t\tInvalidateCaret();\n\t\tbreak;\n\n\tcase SCI_GETADDITIONALCARETSVISIBLE:\n\t\treturn additionalCaretsVisible;\n\n\tcase SCI_GETSELECTIONS:\n\t\treturn sel.Count();\n\n\tcase SCI_GETSELECTIONEMPTY:\n\t\treturn sel.Empty();\n\n\tcase SCI_CLEARSELECTIONS:\n\t\tsel.Clear();\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_SETSELECTION:\n\t\tsel.SetSelection(SelectionRange(wParam, lParam));\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_ADDSELECTION:\n\t\tsel.AddSelection(SelectionRange(wParam, lParam));\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_SETMAINSELECTION:\n\t\tsel.SetMain(wParam);\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_GETMAINSELECTION:\n\t\treturn sel.Main();\n\n\tcase SCI_SETSELECTIONNCARET:\n\t\tsel.Range(wParam).caret.SetPosition(lParam);\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_GETSELECTIONNCARET:\n\t\treturn sel.Range(wParam).caret.Position();\n\n\tcase SCI_SETSELECTIONNANCHOR:\n\t\tsel.Range(wParam).anchor.SetPosition(lParam);\n\t\tRedraw();\n\t\tbreak;\n\tcase SCI_GETSELECTIONNANCHOR:\n\t\treturn sel.Range(wParam).anchor.Position();\n\n\tcase SCI_SETSELECTIONNCARETVIRTUALSPACE:\n\t\tsel.Range(wParam).caret.SetVirtualSpace(lParam);\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_GETSELECTIONNCARETVIRTUALSPACE:\n\t\treturn sel.Range(wParam).caret.VirtualSpace();\n\n\tcase SCI_SETSELECTIONNANCHORVIRTUALSPACE:\n\t\tsel.Range(wParam).anchor.SetVirtualSpace(lParam);\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_GETSELECTIONNANCHORVIRTUALSPACE:\n\t\treturn sel.Range(wParam).anchor.VirtualSpace();\n\n\tcase SCI_SETSELECTIONNSTART:\n\t\tsel.Range(wParam).anchor.SetPosition(lParam);\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_GETSELECTIONNSTART:\n\t\treturn sel.Range(wParam).Start().Position();\n\n\tcase SCI_SETSELECTIONNEND:\n\t\tsel.Range(wParam).caret.SetPosition(lParam);\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_GETSELECTIONNEND:\n\t\treturn sel.Range(wParam).End().Position();\n\n\tcase SCI_SETRECTANGULARSELECTIONCARET:\n\t\tif (!sel.IsRectangular())\n\t\t\tsel.Clear();\n\t\tsel.selType = Selection::selRectangle;\n\t\tsel.Rectangular().caret.SetPosition(wParam);\n\t\tSetRectangularRange();\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_GETRECTANGULARSELECTIONCARET:\n\t\treturn sel.Rectangular().caret.Position();\n\n\tcase SCI_SETRECTANGULARSELECTIONANCHOR:\n\t\tif (!sel.IsRectangular())\n\t\t\tsel.Clear();\n\t\tsel.selType = Selection::selRectangle;\n\t\tsel.Rectangular().anchor.SetPosition(wParam);\n\t\tSetRectangularRange();\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_GETRECTANGULARSELECTIONANCHOR:\n\t\treturn sel.Rectangular().anchor.Position();\n\n\tcase SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE:\n\t\tif (!sel.IsRectangular())\n\t\t\tsel.Clear();\n\t\tsel.selType = Selection::selRectangle;\n\t\tsel.Rectangular().caret.SetVirtualSpace(wParam);\n\t\tSetRectangularRange();\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE:\n\t\treturn sel.Rectangular().caret.VirtualSpace();\n\n\tcase SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE:\n\t\tif (!sel.IsRectangular())\n\t\t\tsel.Clear();\n\t\tsel.selType = Selection::selRectangle;\n\t\tsel.Rectangular().anchor.SetVirtualSpace(wParam);\n\t\tSetRectangularRange();\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE:\n\t\treturn sel.Rectangular().anchor.VirtualSpace();\n\n\tcase SCI_SETVIRTUALSPACEOPTIONS:\n\t\tvirtualSpaceOptions = wParam;\n\t\tbreak;\n\n\tcase SCI_GETVIRTUALSPACEOPTIONS:\n\t\treturn virtualSpaceOptions;\n\n\tcase SCI_SETADDITIONALSELFORE:\n\t\tvs.selAdditionalForeground = ColourDesired(wParam);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_SETADDITIONALSELBACK:\n\t\tvs.selAdditionalBackground = ColourDesired(wParam);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_SETADDITIONALSELALPHA:\n\t\tvs.selAdditionalAlpha = wParam;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETADDITIONALSELALPHA:\n\t\treturn vs.selAdditionalAlpha;\n\n\tcase SCI_SETADDITIONALCARETFORE:\n\t\tvs.additionalCaretColour = ColourDesired(wParam);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_GETADDITIONALCARETFORE:\n\t\treturn vs.additionalCaretColour.AsLong();\n\n\tcase SCI_ROTATESELECTION:\n\t\tsel.RotateMain();\n\t\tInvalidateSelection(sel.RangeMain(), true);\n\t\tbreak;\n\n\tcase SCI_SWAPMAINANCHORCARET:\n\t\tInvalidateSelection(sel.RangeMain());\n\t\tsel.RangeMain() = SelectionRange(sel.RangeMain().anchor, sel.RangeMain().caret);\n\t\tbreak;\n\n\tcase SCI_CHANGELEXERSTATE:\n\t\tpdoc->ChangeLexerState(wParam, lParam);\n\t\tbreak;\n\n\tcase SCI_SETIDENTIFIER:\n\t\tSetCtrlID(wParam);\n\t\tbreak;\n\n\tcase SCI_GETIDENTIFIER:\n\t\treturn GetCtrlID();\n\n\tcase SCI_SETTECHNOLOGY:\n\t\t// No action by default\n\t\tbreak;\n\n\tcase SCI_GETTECHNOLOGY:\n\t\treturn technology;\n\n\tcase SCI_COUNTCHARACTERS:\n\t\treturn pdoc->CountCharacters(wParam, lParam);\n\n\tdefault:\n\t\treturn DefWndProc(iMessage, wParam, lParam);\n\t}\n\t//Platform::DebugPrintf(\"end wnd proc\\n\");\n\treturn 0l;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/Editor.h",
    "content": "// Scintilla source code edit control\n/** @file Editor.h\n ** Defines the main editor class.\n **/\n// Copyright 1998-2011 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef EDITOR_H\n#define EDITOR_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n/**\n */\nclass Caret {\npublic:\n\tbool active;\n\tbool on;\n\tint period;\n\n\tCaret();\n};\n\n/**\n */\nclass Timer {\npublic:\n\tbool ticking;\n\tint ticksToWait;\n\tenum {tickSize = 100};\n\tTickerID tickerID;\n\n\tTimer();\n};\n\n/**\n */\nclass Idler {\npublic:\n\tbool state;\n\tIdlerID idlerID;\n\n\tIdler();\n};\n\n/**\n * When platform has a way to generate an event before painting,\n * accumulate needed styling range and other work items in \n * WorkNeeded to avoid unnecessary work inside paint handler\n */\nclass WorkNeeded {\npublic:\n\tenum workItems {\n\t\tworkNone=0,\n\t\tworkStyle=1,\n\t\tworkUpdateUI=2\n\t};\n\tbool active;\n\tenum workItems items;\n\tPosition upTo;\n\n\tWorkNeeded() : active(false), items(workNone), upTo(0) {}\n\tvoid Reset() {\n\t\tactive = false;\n\t\titems = workNone;\n\t\tupTo = 0;\n\t}\n\tvoid Need(workItems items_, Position pos) {\n\t\tif ((items_ & workStyle) && (upTo < pos))\n\t\t\tupTo = pos;\n\t\titems = static_cast<workItems>(items | items_);\n\t}\n};\n\n/**\n * Hold a piece of text selected for copying or dragging, along with encoding and selection format information.\n */\nclass SelectionText {\n\tstd::string s;\npublic:\n\tbool rectangular;\n\tbool lineCopy;\n\tint codePage;\n\tint characterSet;\n\tSelectionText() : rectangular(false), lineCopy(false), codePage(0), characterSet(0) {}\n\t~SelectionText() {\n\t}\n\tvoid Clear() {\n\t\ts.clear();\n\t\trectangular = false;\n\t\tlineCopy = false;\n\t\tcodePage = 0;\n\t\tcharacterSet = 0;\n\t}\n\tvoid Copy(const std::string &s_, int codePage_, int characterSet_, bool rectangular_, bool lineCopy_) {\n\t\ts = s_;\n\t\tcodePage = codePage_;\n\t\tcharacterSet = characterSet_;\n\t\trectangular = rectangular_;\n\t\tlineCopy = lineCopy_;\n\t\tFixSelectionForClipboard();\n\t}\n\tvoid Copy(const SelectionText &other) {\n\t\tCopy(other.s, other.codePage, other.characterSet, other.rectangular, other.lineCopy);\n\t}\n\tconst char *Data() const {\n\t\treturn s.c_str();\n\t}\n\tsize_t Length() const {\n\t\treturn s.length();\n\t}\n\tsize_t LengthWithTerminator() const {\n\t\treturn s.length() + 1;\n\t}\n\tbool Empty() const {\n\t\treturn s.empty();\n\t}\nprivate:\n\tvoid FixSelectionForClipboard() {\n\t\t// To avoid truncating the contents of the clipboard when pasted where the \n\t\t// clipboard contains NUL characters, replace NUL characters by spaces.\n\t\tstd::replace(s.begin(), s.end(), '\\0', ' ');\n\t}\n};\n\nstruct WrapPending {\n\t// The range of lines that need to be wrapped\n\tenum { lineLarge = 0x7ffffff };\n\tint start;\t// When there are wraps pending, will be in document range\n\tint end;\t// May be lineLarge to indicate all of document after start\n\tWrapPending() {\n\t\tstart = lineLarge;\n\t\tend = lineLarge;\n\t}\n\tvoid Reset() {\n\t\tstart = lineLarge;\n\t\tend = lineLarge;\n\t}\n\tvoid Wrapped(int line) {\n\t\tif (start == line)\n\t\t\tstart++;\n\t}\n\tbool NeedsWrap() const {\n\t\treturn start < end;\n\t}\n\tbool AddRange(int lineStart, int lineEnd) {\n\t\tconst bool neededWrap = NeedsWrap();\n\t\tbool changed = false;\n\t\tif (start > lineStart) {\n\t\t\tstart = lineStart;\n\t\t\tchanged = true;\n\t\t}\n\t\tif ((end < lineEnd) || !neededWrap) {\n\t\t\tend = lineEnd;\n\t\t\tchanged = true;\n\t\t}\n\t\treturn changed;\n\t}\n};\n\nstruct PrintParameters {\n\tint magnification;\n\tint colourMode;\n\tWrapMode wrapState;\n\tPrintParameters();\n};\n\n/**\n */\nclass Editor : public DocWatcher {\n\t// Private so Editor objects can not be copied\n\tEditor(const Editor &);\n\tEditor &operator=(const Editor &);\n\nprotected:\t// ScintillaBase subclass needs access to much of Editor\n\n\t/** On GTK+, Scintilla is a container widget holding two scroll bars\n\t * whereas on Windows there is just one window with both scroll bars turned on. */\n\tWindow wMain;\t///< The Scintilla parent window\n\tWindow wMargin;\t///< May be separate when using a scroll view for wMain\n\n\t/** Style resources may be expensive to allocate so are cached between uses.\n\t * When a style attribute is changed, this cache is flushed. */\n\tbool stylesValid;\n\tViewStyle vs;\n\tint technology;\n\tPoint sizeRGBAImage;\n\tfloat scaleRGBAImage;\n\n\tPrintParameters printParameters;\n\n\tint cursorMode;\n\n\t// Highlight current folding block\n\tHighlightDelimiter highlightDelimiter;\n\n\tbool hasFocus;\n\tbool hideSelection;\n\tbool inOverstrike;\n\tbool drawOverstrikeCaret;\n\tbool mouseDownCaptures;\n\n\t/** In bufferedDraw mode, graphics operations are drawn to a pixmap and then copied to\n\t * the screen. This avoids flashing but is about 30% slower. */\n\tbool bufferedDraw;\n\t/** In twoPhaseDraw mode, drawing is performed in two phases, first the background\n\t* and then the foreground. This avoids chopping off characters that overlap the next run. */\n\tbool twoPhaseDraw;\n\n\tint xOffset;\t\t///< Horizontal scrolled amount in pixels\n\tint xCaretMargin;\t///< Ensure this many pixels visible on both sides of caret\n\tbool horizontalScrollBarVisible;\n\tint scrollWidth;\n\tbool trackLineWidth;\n\tint lineWidthMaxSeen;\n\tbool verticalScrollBarVisible;\n\tbool endAtLastLine;\n\tint caretSticky;\n\tint marginOptions;\n\tbool mouseSelectionRectangularSwitch;\n\tbool multipleSelection;\n\tbool additionalSelectionTyping;\n\tint multiPasteMode;\n\tbool additionalCaretsBlink;\n\tbool additionalCaretsVisible;\n\n\tint virtualSpaceOptions;\n\n\tSurface *pixmapLine;\n\tSurface *pixmapSelMargin;\n\tSurface *pixmapSelPattern;\n\tSurface *pixmapSelPatternOffset1;\n\tSurface *pixmapIndentGuide;\n\tSurface *pixmapIndentGuideHighlight;\n\n\tLineLayoutCache llc;\n\tPositionCache posCache;\n\tSpecialRepresentations reprs;\n\n\tKeyMap kmap;\n\n\tCaret caret;\n\tTimer timer;\n\tTimer autoScrollTimer;\n\tenum { autoScrollDelay = 200 };\n\n\tIdler idler;\n\n\tPoint lastClick;\n\tunsigned int lastClickTime;\n\tint dwellDelay;\n\tint ticksToDwell;\n\tbool dwelling;\n\tenum { selChar, selWord, selSubLine, selWholeLine } selectionType;\n\tPoint ptMouseLast;\n\tenum { ddNone, ddInitial, ddDragging } inDragDrop;\n\tbool dropWentOutside;\n\tSelectionPosition posDrag;\n\tSelectionPosition posDrop;\n\tint hotSpotClickPos;\n\tint lastXChosen;\n\tint lineAnchorPos;\n\tint originalAnchorPos;\n\tint wordSelectAnchorStartPos;\n\tint wordSelectAnchorEndPos;\n\tint wordSelectInitialCaretPos;\n\tint targetStart;\n\tint targetEnd;\n\tint searchFlags;\n\tint topLine;\n\tint posTopLine;\n\tint lengthForEncode;\n\n\tint needUpdateUI;\n\tPosition braces[2];\n\tint bracesMatchStyle;\n\tint highlightGuideColumn;\n\n\tenum { notPainting, painting, paintAbandoned } paintState;\n\tbool paintAbandonedByStyling;\n\tPRectangle rcPaint;\n\tbool paintingAllText;\n\tbool willRedrawAll;\n\tWorkNeeded workNeeded;\n\n\tint modEventMask;\n\n\tSelectionText drag;\n\tSelection sel;\n\tbool primarySelection;\n\n\tint caretXPolicy;\n\tint caretXSlop;\t///< Ensure this many pixels visible on both sides of caret\n\n\tint caretYPolicy;\n\tint caretYSlop;\t///< Ensure this many lines visible on both sides of caret\n\n\tint visiblePolicy;\n\tint visibleSlop;\n\n\tint searchAnchor;\n\n\tbool recordingMacro;\n\n\tint foldFlags;\n\tint foldAutomatic;\n\tContractionState cs;\n\n\t// Hotspot support\n\tint hsStart;\n\tint hsEnd;\n\n\t// Wrapping support\n\tint wrapWidth;\n\tWrapPending wrapPending;\n\n\tbool convertPastes;\n\n\tDocument *pdoc;\n\n\tEditor();\n\tvirtual ~Editor();\n\tvirtual void Initialise() = 0;\n\tvirtual void Finalise();\n\n\tvoid InvalidateStyleData();\n\tvoid InvalidateStyleRedraw();\n\tvoid RefreshStyleData();\n\tvoid SetRepresentations();\n\tvoid DropGraphics(bool freeObjects);\n\tvoid AllocateGraphics();\n\n\t// The top left visible point in main window coordinates. Will be 0,0 except for\n\t// scroll views where it will be equivalent to the current scroll position.\n\tvirtual Point GetVisibleOriginInMain();\n\tPoint DocumentPointFromView(Point ptView);  // Convert a point from view space to document\n\tint TopLineOfMain() const;   // Return the line at Main's y coordinate 0\n\tvirtual PRectangle GetClientRectangle();\n\tPRectangle GetTextRectangle();\n\n\tint LinesOnScreen();\n\tint LinesToScroll();\n\tint MaxScrollPos();\n\tSelectionPosition ClampPositionIntoDocument(SelectionPosition sp) const;\n\tPoint LocationFromPosition(SelectionPosition pos);\n\tPoint LocationFromPosition(int pos);\n\tint XFromPosition(int pos);\n\tint XFromPosition(SelectionPosition sp);\n\tSelectionPosition SPositionFromLocation(Point pt, bool canReturnInvalid=false, bool charPosition=false, bool virtualSpace=true);\n\tint PositionFromLocation(Point pt, bool canReturnInvalid=false, bool charPosition=false);\n\tSelectionPosition SPositionFromLineX(int lineDoc, int x);\n\tint PositionFromLineX(int line, int x);\n\tint LineFromLocation(Point pt) const;\n\tvoid SetTopLine(int topLineNew);\n\n\tbool AbandonPaint();\n\tvoid RedrawRect(PRectangle rc);\n\tvoid Redraw();\n\tvoid RedrawSelMargin(int line=-1, bool allAfter=false);\n\tPRectangle RectangleFromRange(int start, int end);\n\tvoid InvalidateRange(int start, int end);\n\n\tbool UserVirtualSpace() const {\n\t\treturn ((virtualSpaceOptions & SCVS_USERACCESSIBLE) != 0);\n\t}\n\tint CurrentPosition() const;\n\tbool SelectionEmpty() const;\n\tSelectionPosition SelectionStart();\n\tSelectionPosition SelectionEnd();\n\tvoid SetRectangularRange();\n\tvoid ThinRectangularRange();\n\tvoid InvalidateSelection(SelectionRange newMain, bool invalidateWholeSelection=false);\n\tvoid SetSelection(SelectionPosition currentPos_, SelectionPosition anchor_);\n\tvoid SetSelection(int currentPos_, int anchor_);\n\tvoid SetSelection(SelectionPosition currentPos_);\n\tvoid SetSelection(int currentPos_);\n\tvoid SetEmptySelection(SelectionPosition currentPos_);\n\tvoid SetEmptySelection(int currentPos_);\n\tbool RangeContainsProtected(int start, int end) const;\n\tbool SelectionContainsProtected();\n\tint MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true) const;\n\tSelectionPosition MovePositionOutsideChar(SelectionPosition pos, int moveDir, bool checkLineEnd=true) const;\n\tint MovePositionTo(SelectionPosition newPos, Selection::selTypes sel=Selection::noSel, bool ensureVisible=true);\n\tint MovePositionTo(int newPos, Selection::selTypes sel=Selection::noSel, bool ensureVisible=true);\n\tSelectionPosition MovePositionSoVisible(SelectionPosition pos, int moveDir);\n\tSelectionPosition MovePositionSoVisible(int pos, int moveDir);\n\tPoint PointMainCaret();\n\tvoid SetLastXChosen();\n\n\tvoid ScrollTo(int line, bool moveThumb=true);\n\tvirtual void ScrollText(int linesToMove);\n\tvoid HorizontalScrollTo(int xPos);\n\tvoid VerticalCentreCaret();\n\tvoid MoveSelectedLines(int lineDelta);\n\tvoid MoveSelectedLinesUp();\n\tvoid MoveSelectedLinesDown();\n\tvoid MoveCaretInsideView(bool ensureVisible=true);\n\tint DisplayFromPosition(int pos);\n\n\tstruct XYScrollPosition {\n\t\tint xOffset;\n\t\tint topLine;\n\t\tXYScrollPosition(int xOffset_, int topLine_) : xOffset(xOffset_), topLine(topLine_) {}\n\t\tbool operator==(const XYScrollPosition &other) const {\n\t\t\treturn (xOffset == other.xOffset) && (topLine == other.topLine);\n\t\t}\n\t};\n\tenum XYScrollOptions {\n\t\txysUseMargin=0x1,\n\t\txysVertical=0x2,\n\t\txysHorizontal=0x4,\n\t\txysDefault=xysUseMargin|xysVertical|xysHorizontal};\n\tXYScrollPosition XYScrollToMakeVisible(const SelectionRange range, const XYScrollOptions options);\n\tvoid SetXYScroll(XYScrollPosition newXY);\n\tvoid EnsureCaretVisible(bool useMargin=true, bool vert=true, bool horiz=true);\n\tvoid ScrollRange(SelectionRange range);\n\tvoid ShowCaretAtCurrentPosition();\n\tvoid DropCaret();\n\tvoid InvalidateCaret();\n\tvirtual void UpdateSystemCaret();\n\n\tbool Wrapping() const;\n\tvoid NeedWrapping(int docLineStart=0, int docLineEnd=WrapPending::lineLarge);\n\tbool WrapOneLine(Surface *surface, int lineToWrap);\n\tenum wrapScope {wsAll, wsVisible, wsIdle};\n\tbool WrapLines(enum wrapScope ws);\n\tvoid LinesJoin();\n\tvoid LinesSplit(int pixelWidth);\n\n\tint SubstituteMarkerIfEmpty(int markerCheck, int markerDefault) const;\n\tvoid PaintSelMargin(Surface *surface, PRectangle &rc);\n\tLineLayout *RetrieveLineLayout(int lineNumber);\n\tvoid LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout *ll,\n\t\tint width=LineLayout::wrapWidthInfinite);\n\tColourDesired SelectionBackground(ViewStyle &vsDraw, bool main) const;\n\tColourDesired TextBackground(ViewStyle &vsDraw, bool overrideBackground, ColourDesired background, int inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll) const;\n\tvoid DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight);\n\tvoid DrawWrapMarker(Surface *surface, PRectangle rcPlace, bool isEndMarker, ColourDesired wrapColour);\n\tvoid DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll,\n\t\tint line, int lineEnd, int xStart, int subLine, XYACCUMULATOR subLineStart,\n\t\tbool overrideBackground, ColourDesired background,\n\t\tbool drawWrapMark, ColourDesired wrapColour);\n\tvoid DrawIndicator(int indicNum, int startPos, int endPos, Surface *surface, ViewStyle &vsDraw,\n\t\tint xStart, PRectangle rcLine, LineLayout *ll, int subLine);\n\tvoid DrawIndicators(Surface *surface, ViewStyle &vsDraw, int line, int xStart,\n\t\tPRectangle rcLine, LineLayout *ll, int subLine, int lineEnd, bool under);\n\tvoid DrawAnnotation(Surface *surface, ViewStyle &vsDraw, int line, int xStart,\n        PRectangle rcLine, LineLayout *ll, int subLine);\n\tvoid DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart,\n\t\tPRectangle rcLine, LineLayout *ll, int subLine);\n\tvoid DrawBlockCaret(Surface *surface, ViewStyle &vsDraw, LineLayout *ll, int subLine,\n\t\tint xStart, int offset, int posCaret, PRectangle rcCaret, ColourDesired caretColour);\n\tvoid DrawCarets(Surface *surface, ViewStyle &vsDraw, int line, int xStart,\n\t\tPRectangle rcLine, LineLayout *ll, int subLine);\n\tvoid RefreshPixMaps(Surface *surfaceWindow);\n\tvoid Paint(Surface *surfaceWindow, PRectangle rcArea);\n\tlong FormatRange(bool draw, Sci_RangeToFormat *pfr);\n\tint TextWidth(int style, const char *text);\n\n\tvirtual void SetVerticalScrollPos() = 0;\n\tvirtual void SetHorizontalScrollPos() = 0;\n\tvirtual bool ModifyScrollBars(int nMax, int nPage) = 0;\n\tvirtual void ReconfigureScrollBars();\n\tvoid SetScrollBars();\n\tvoid ChangeSize();\n\n\tvoid FilterSelections();\n\tint InsertSpace(int position, unsigned int spaces);\n\tvoid AddChar(char ch);\n\tvirtual void AddCharUTF(char *s, unsigned int len, bool treatAsDBCS=false);\n\tvoid InsertPaste(SelectionPosition selStart, const char *text, int len);\n\tvoid ClearSelection(bool retainMultipleSelections=false);\n\tvoid ClearAll();\n\tvoid ClearDocumentStyle();\n\tvoid Cut();\n\tvoid PasteRectangular(SelectionPosition pos, const char *ptr, int len);\n\tvirtual void Copy() = 0;\n\tvirtual void CopyAllowLine();\n\tvirtual bool CanPaste();\n\tvirtual void Paste() = 0;\n\tvoid Clear();\n\tvoid SelectAll();\n\tvoid Undo();\n\tvoid Redo();\n\tvoid DelChar();\n\tvoid DelCharBack(bool allowLineStartDeletion);\n\tvirtual void ClaimSelection() = 0;\n\n\tvirtual void NotifyChange() = 0;\n\tvirtual void NotifyFocus(bool focus);\n\tvirtual void SetCtrlID(int identifier);\n\tvirtual int GetCtrlID() { return ctrlID; }\n\tvirtual void NotifyParent(SCNotification scn) = 0;\n\tvirtual void NotifyStyleToNeeded(int endStyleNeeded);\n\tvoid NotifyChar(int ch);\n\tvoid NotifySavePoint(bool isSavePoint);\n\tvoid NotifyModifyAttempt();\n\tvirtual void NotifyDoubleClick(Point pt, bool shift, bool ctrl, bool alt);\n\tvoid NotifyHotSpotClicked(int position, bool shift, bool ctrl, bool alt);\n\tvoid NotifyHotSpotDoubleClicked(int position, bool shift, bool ctrl, bool alt);\n\tvoid NotifyHotSpotReleaseClick(int position, bool shift, bool ctrl, bool alt);\n\tbool NotifyUpdateUI();\n\tvoid NotifyPainted();\n\tvoid NotifyIndicatorClick(bool click, int position, bool shift, bool ctrl, bool alt);\n\tbool NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt);\n\tvoid NotifyNeedShown(int pos, int len);\n\tvoid NotifyDwelling(Point pt, bool state);\n\tvoid NotifyZoom();\n\n\tvoid NotifyModifyAttempt(Document *document, void *userData);\n\tvoid NotifySavePoint(Document *document, void *userData, bool atSavePoint);\n\tvoid CheckModificationForWrap(DocModification mh);\n\tvoid NotifyModified(Document *document, DocModification mh, void *userData);\n\tvoid NotifyDeleted(Document *document, void *userData);\n\tvoid NotifyStyleNeeded(Document *doc, void *userData, int endPos);\n\tvoid NotifyLexerChanged(Document *doc, void *userData);\n\tvoid NotifyErrorOccurred(Document *doc, void *userData, int status);\n\tvoid NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lParam);\n\n\tvoid ContainerNeedsUpdate(int flags);\n\tvoid PageMove(int direction, Selection::selTypes sel=Selection::noSel, bool stuttered = false);\n\tenum { cmSame, cmUpper, cmLower };\n\tvirtual std::string CaseMapString(const std::string &s, int caseMapping);\n\tvoid ChangeCaseOfSelection(int caseMapping);\n\tvoid LineTranspose();\n\tvoid Duplicate(bool forLine);\n\tvirtual void CancelModes();\n\tvoid NewLine();\n\tvoid CursorUpOrDown(int direction, Selection::selTypes sel=Selection::noSel);\n\tvoid ParaUpOrDown(int direction, Selection::selTypes sel=Selection::noSel);\n\tint StartEndDisplayLine(int pos, bool start);\n\tvirtual int KeyCommand(unsigned int iMessage);\n\tvirtual int KeyDefault(int /* key */, int /*modifiers*/);\n\tint KeyDownWithModifiers(int key, int modifiers, bool *consumed);\n\tint KeyDown(int key, bool shift, bool ctrl, bool alt, bool *consumed=0);\n\n\tvoid Indent(bool forwards);\n\n\tvirtual CaseFolder *CaseFolderForEncoding();\n\tlong FindText(uptr_t wParam, sptr_t lParam);\n\tvoid SearchAnchor();\n\tlong SearchText(unsigned int iMessage, uptr_t wParam, sptr_t lParam);\n\tlong SearchInTarget(const char *text, int length);\n\tvoid GoToLine(int lineNo);\n\n\tvirtual void CopyToClipboard(const SelectionText &selectedText) = 0;\n\tstd::string RangeText(int start, int end) const;\n\tvoid CopySelectionRange(SelectionText *ss, bool allowLineCopy=false);\n\tvoid CopyRangeToClipboard(int start, int end);\n\tvoid CopyText(int length, const char *text);\n\tvoid SetDragPosition(SelectionPosition newPos);\n\tvirtual void DisplayCursor(Window::Cursor c);\n\tvirtual bool DragThreshold(Point ptStart, Point ptNow);\n\tvirtual void StartDrag();\n\tvoid DropAt(SelectionPosition position, const char *value, size_t lengthValue, bool moving, bool rectangular);\n\tvoid DropAt(SelectionPosition position, const char *value, bool moving, bool rectangular);\n\t/** PositionInSelection returns true if position in selection. */\n\tbool PositionInSelection(int pos);\n\tbool PointInSelection(Point pt);\n\tbool PointInSelMargin(Point pt);\n\tWindow::Cursor GetMarginCursor(Point pt) const;\n\tvoid TrimAndSetSelection(int currentPos_, int anchor_);\n\tvoid LineSelection(int lineCurrentPos_, int lineAnchorPos_, bool wholeLine);\n\tvoid WordSelection(int pos);\n\tvoid DwellEnd(bool mouseMoved);\n\tvoid MouseLeave();\n\tvirtual void ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt);\n\tvoid ButtonMoveWithModifiers(Point pt, int modifiers);\n\tvoid ButtonMove(Point pt);\n\tvoid ButtonUp(Point pt, unsigned int curTime, bool ctrl);\n\n\tvoid Tick();\n\tbool Idle();\n\tvirtual void SetTicking(bool on) = 0;\n\tvirtual bool SetIdle(bool) { return false; }\n\tvirtual void SetMouseCapture(bool on) = 0;\n\tvirtual bool HaveMouseCapture() = 0;\n\tvoid SetFocusState(bool focusState);\n\n\tint PositionAfterArea(PRectangle rcArea) const;\n\tvoid StyleToPositionInView(Position pos);\n\tvirtual void IdleWork();\n\tvirtual void QueueIdleWork(WorkNeeded::workItems items, int upTo=0);\n\n\tvirtual bool PaintContains(PRectangle rc);\n\tbool PaintContainsMargin();\n\tvoid CheckForChangeOutsidePaint(Range r);\n\tvoid SetBraceHighlight(Position pos0, Position pos1, int matchStyle);\n\n\tvoid SetAnnotationHeights(int start, int end);\n\tvirtual void SetDocPointer(Document *document);\n\n\tvoid SetAnnotationVisible(int visible);\n\n\tint ExpandLine(int line);\n\tvoid SetFoldExpanded(int lineDoc, bool expanded);\n\tvoid FoldLine(int line, int action);\n\tvoid FoldExpand(int line, int action, int level);\n\tint ContractedFoldNext(int lineStart) const;\n\tvoid EnsureLineVisible(int lineDoc, bool enforcePolicy);\n\tvoid FoldChanged(int line, int levelNow, int levelPrev);\n\tvoid NeedShown(int pos, int len);\n\tvoid FoldAll(int action);\n\n\tint GetTag(char *tagValue, int tagNumber);\n\tint ReplaceTarget(bool replacePatterns, const char *text, int length=-1);\n\n\tbool PositionIsHotspot(int position) const;\n\tbool PointIsHotspot(Point pt);\n\tvoid SetHotSpotRange(Point *pt);\n\tvoid GetHotSpotRange(int &hsStart, int &hsEnd) const;\n\n\tint CodePage() const;\n\tvirtual bool ValidCodePage(int /* codePage */) const { return true; }\n\tint WrapCount(int line);\n\tvoid AddStyledText(char *buffer, int appendLength);\n\n\tvirtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) = 0;\n\tvoid StyleSetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam);\n\tsptr_t StyleGetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam);\n\n\tstatic const char *StringFromEOLMode(int eolMode);\n\n\tstatic sptr_t StringResult(sptr_t lParam, const char *val);\n\npublic:\n\t// Public so the COM thunks can access it.\n\tbool IsUnicodeMode() const;\n\t// Public so scintilla_send_message can use it.\n\tvirtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam);\n\t// Public so scintilla_set_id can use it.\n\tint ctrlID;\n\t// Public so COM methods for drag and drop can set it.\n\tint errorStatus;\n\tfriend class AutoSurface;\n\tfriend class SelectionLineIterator;\n};\n\n/**\n * A smart pointer class to ensure Surfaces are set up and deleted correctly.\n */\nclass AutoSurface {\nprivate:\n\tSurface *surf;\npublic:\n\tAutoSurface(Editor *ed, int technology = -1) : surf(0) {\n\t\tif (ed->wMain.GetID()) {\n\t\t\tsurf = Surface::Allocate(technology != -1 ? technology : ed->technology);\n\t\t\tif (surf) {\n\t\t\t\tsurf->Init(ed->wMain.GetID());\n\t\t\t\tsurf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage());\n\t\t\t\tsurf->SetDBCSMode(ed->CodePage());\n\t\t\t}\n\t\t}\n\t}\n\tAutoSurface(SurfaceID sid, Editor *ed, int technology = -1) : surf(0) {\n\t\tif (ed->wMain.GetID()) {\n\t\t\tsurf = Surface::Allocate(technology != -1 ? technology : ed->technology);\n\t\t\tif (surf) {\n\t\t\t\tsurf->Init(sid, ed->wMain.GetID());\n\t\t\t\tsurf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage());\n\t\t\t\tsurf->SetDBCSMode(ed->CodePage());\n\t\t\t}\n\t\t}\n\t}\n\t~AutoSurface() {\n\t\tdelete surf;\n\t}\n\tSurface *operator->() const {\n\t\treturn surf;\n\t}\n\toperator Surface *() const {\n\t\treturn surf;\n\t}\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/ExternalLexer.cpp",
    "content": "// Scintilla source code edit control\n/** @file ExternalLexer.cxx\n ** Support external lexers in DLLs.\n **/\n// Copyright 2001 Simon Steele <ss@pnotepad.org>, portions copyright Neil Hodgson.\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <assert.h>\n\n#include <string>\n\n#include \"Platform.h\"\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n#include \"SciLexer.h\"\n\n#include \"LexerModule.h\"\n#include \"Catalogue.h\"\n#include \"ExternalLexer.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nLexerManager *LexerManager::theInstance = NULL;\n\n//------------------------------------------\n//\n// ExternalLexerModule\n//\n//------------------------------------------\n\nvoid ExternalLexerModule::SetExternal(GetLexerFactoryFunction fFactory, int index) {\n\tfneFactory = fFactory;\n\tfnFactory = fFactory(index);\n}\n\n//------------------------------------------\n//\n// LexerLibrary\n//\n//------------------------------------------\n\nLexerLibrary::LexerLibrary(const char *ModuleName) {\n\t// Initialise some members...\n\tfirst = NULL;\n\tlast = NULL;\n\n\t// Load the DLL\n\tlib = DynamicLibrary::Load(ModuleName);\n\tif (lib->IsValid()) {\n\t\tm_sModuleName = ModuleName;\n\t\t//Cannot use reinterpret_cast because: ANSI C++ forbids casting between pointers to functions and objects\n\t\tGetLexerCountFn GetLexerCount = (GetLexerCountFn)(sptr_t)lib->FindFunction(\"GetLexerCount\");\n\n\t\tif (GetLexerCount) {\n\t\t\tExternalLexerModule *lex;\n\t\t\tLexerMinder *lm;\n\n\t\t\t// Find functions in the DLL\n\t\t\tGetLexerNameFn GetLexerName = (GetLexerNameFn)(sptr_t)lib->FindFunction(\"GetLexerName\");\n\t\t\tGetLexerFactoryFunction fnFactory = (GetLexerFactoryFunction)(sptr_t)lib->FindFunction(\"GetLexerFactory\");\n\n\t\t\t// Assign a buffer for the lexer name.\n\t\t\tchar lexname[100];\n\t\t\tstrcpy(lexname, \"\");\n\n\t\t\tint nl = GetLexerCount();\n\n\t\t\tfor (int i = 0; i < nl; i++) {\n\t\t\t\tGetLexerName(i, lexname, 100);\n\t\t\t\tlex = new ExternalLexerModule(SCLEX_AUTOMATIC, NULL, lexname, NULL);\n\t\t\t\tCatalogue::AddLexerModule(lex);\n\n\t\t\t\t// Create a LexerMinder so we don't leak the ExternalLexerModule...\n\t\t\t\tlm = new LexerMinder;\n\t\t\t\tlm->self = lex;\n\t\t\t\tlm->next = NULL;\n\t\t\t\tif (first != NULL) {\n\t\t\t\t\tlast->next = lm;\n\t\t\t\t\tlast = lm;\n\t\t\t\t} else {\n\t\t\t\t\tfirst = lm;\n\t\t\t\t\tlast = lm;\n\t\t\t\t}\n\n\t\t\t\t// The external lexer needs to know how to call into its DLL to\n\t\t\t\t// do its lexing and folding, we tell it here.\n\t\t\t\tlex->SetExternal(fnFactory, i);\n\t\t\t}\n\t\t}\n\t}\n\tnext = NULL;\n}\n\nLexerLibrary::~LexerLibrary() {\n\tRelease();\n\tdelete lib;\n}\n\nvoid LexerLibrary::Release() {\n\tLexerMinder *lm;\n\tLexerMinder *lmNext;\n\tlm = first;\n\twhile (NULL != lm) {\n\t\tlmNext = lm->next;\n\t\tdelete lm->self;\n\t\tdelete lm;\n\t\tlm = lmNext;\n\t}\n\n\tfirst = NULL;\n\tlast = NULL;\n}\n\n//------------------------------------------\n//\n// LexerManager\n//\n//------------------------------------------\n\n/// Return the single LexerManager instance...\nLexerManager *LexerManager::GetInstance() {\n\tif (!theInstance)\n\t\ttheInstance = new LexerManager;\n\treturn theInstance;\n}\n\n/// Delete any LexerManager instance...\nvoid LexerManager::DeleteInstance() {\n\tdelete theInstance;\n\ttheInstance = NULL;\n}\n\n/// protected constructor - this is a singleton...\nLexerManager::LexerManager() {\n\tfirst = NULL;\n\tlast = NULL;\n}\n\nLexerManager::~LexerManager() {\n\tClear();\n}\n\nvoid LexerManager::Load(const char *path) {\n\tLoadLexerLibrary(path);\n}\n\nvoid LexerManager::LoadLexerLibrary(const char *module) {\n\tfor (LexerLibrary *ll = first; ll; ll= ll->next) {\n\t\tif (strcmp(ll->m_sModuleName.c_str(), module) == 0)\n\t\t\treturn;\n\t}\n\tLexerLibrary *lib = new LexerLibrary(module);\n\tif (NULL != first) {\n\t\tlast->next = lib;\n\t\tlast = lib;\n\t} else {\n\t\tfirst = lib;\n\t\tlast = lib;\n\t}\n}\n\nvoid LexerManager::Clear() {\n\tif (NULL != first) {\n\t\tLexerLibrary *cur = first;\n\t\tLexerLibrary *next;\n\t\twhile (cur) {\n\t\t\tnext = cur->next;\n\t\t\tdelete cur;\n\t\t\tcur = next;\n\t\t}\n\t\tfirst = NULL;\n\t\tlast = NULL;\n\t}\n}\n\n//------------------------------------------\n//\n// LexerManager\n//\n//------------------------------------------\n\nLMMinder::~LMMinder() {\n\tLexerManager::DeleteInstance();\n}\n\nLMMinder minder;\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/ExternalLexer.h",
    "content": "// Scintilla source code edit control\n/** @file ExternalLexer.h\n ** Support external lexers in DLLs.\n **/\n// Copyright 2001 Simon Steele <ss@pnotepad.org>, portions copyright Neil Hodgson.\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef EXTERNALLEXER_H\n#define EXTERNALLEXER_H\n\n#if PLAT_WIN\n#define EXT_LEXER_DECL __stdcall\n#elif PLAT_QT\n#include <qglobal.h>\n#if defined(Q_OS_WIN32) || defined(Q_OS_WIN64)\n#define EXT_LEXER_DECL __stdcall\n#else\n#define EXT_LEXER_DECL\n#endif\n#else\n#define EXT_LEXER_DECL\n#endif\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\ntypedef void*(EXT_LEXER_DECL *GetLexerFunction)(unsigned int Index);\ntypedef int (EXT_LEXER_DECL *GetLexerCountFn)();\ntypedef void (EXT_LEXER_DECL *GetLexerNameFn)(unsigned int Index, char *name, int buflength);\ntypedef LexerFactoryFunction(EXT_LEXER_DECL *GetLexerFactoryFunction)(unsigned int Index);\n\n/// Sub-class of LexerModule to use an external lexer.\nclass ExternalLexerModule : public LexerModule {\nprotected:\n\tGetLexerFactoryFunction fneFactory;\n\tchar name[100];\npublic:\n\tExternalLexerModule(int language_, LexerFunction fnLexer_,\n\t\tconst char *languageName_=0, LexerFunction fnFolder_=0) :\n\t\tLexerModule(language_, fnLexer_, 0, fnFolder_),\n\t\tfneFactory(0) {\n\t\tstrncpy(name, languageName_, sizeof(name));\n\t\tname[sizeof(name)-1] = '\\0';\n\t\tlanguageName = name;\n\t}\n\tvirtual void SetExternal(GetLexerFactoryFunction fFactory, int index);\n};\n\n/// LexerMinder points to an ExternalLexerModule - so we don't leak them.\nclass LexerMinder {\npublic:\n\tExternalLexerModule *self;\n\tLexerMinder *next;\n};\n\n/// LexerLibrary exists for every External Lexer DLL, contains LexerMinders.\nclass LexerLibrary {\n\tDynamicLibrary\t*lib;\n\tLexerMinder\t\t*first;\n\tLexerMinder\t\t*last;\n\npublic:\n\tLexerLibrary(const char *ModuleName);\n\t~LexerLibrary();\n\tvoid Release();\n\n\tLexerLibrary\t*next;\n\tstd::string\t\t\tm_sModuleName;\n};\n\n/// LexerManager manages external lexers, contains LexerLibrarys.\nclass LexerManager {\npublic:\n\t~LexerManager();\n\n\tstatic LexerManager *GetInstance();\n\tstatic void DeleteInstance();\n\n\tvoid Load(const char *path);\n\tvoid Clear();\n\nprivate:\n\tLexerManager();\n\tstatic LexerManager *theInstance;\n\n\tvoid LoadLexerLibrary(const char *module);\n\tLexerLibrary *first;\n\tLexerLibrary *last;\n};\n\nclass LMMinder {\npublic:\n\t~LMMinder();\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/FontQuality.h",
    "content": "// Scintilla source code edit control\n/** @file FontQuality.h\n ** Definitions to control font anti-aliasing.\n **/\n// Copyright 1998-2009 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef FONTQUALITY_H\n#define FONTQUALITY_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n#define SC_EFF_QUALITY_MASK            0xF\n#define SC_EFF_QUALITY_DEFAULT           0\n#define SC_EFF_QUALITY_NON_ANTIALIASED   1\n#define SC_EFF_QUALITY_ANTIALIASED       2\n#define SC_EFF_QUALITY_LCD_OPTIMIZED     3\n\n#define SCWIN_TECH_GDI 0\n#define SCWIN_TECH_DIRECTWRITE 1\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/Indicator.cpp",
    "content": "// Scintilla source code edit control\n/** @file Indicator.cxx\n ** Defines the style of indicators which are text decorations such as underlining.\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <vector>\n#include <map>\n\n#include \"Platform.h\"\n\n#include \"Scintilla.h\"\n#include \"XPM.h\"\n#include \"Indicator.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic PRectangle PixelGridAlign(const PRectangle &rc) {\n\t// Move left and right side to nearest pixel to avoid blurry visuals\n\treturn PRectangle(int(rc.left + 0.5), rc.top, int(rc.right + 0.5), rc.bottom);\n}\n\nvoid Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine) {\n\tsurface->PenColour(fore);\n\tint ymid = (rc.bottom + rc.top) / 2;\n\tif (style == INDIC_SQUIGGLE) {\n\t\tint x = int(rc.left+0.5);\n\t\tint xLast = int(rc.right+0.5);\n\t\tint y = 0;\n\t\tsurface->MoveTo(x, rc.top + y);\n\t\twhile (x < xLast) {\n\t\t\tif ((x + 2) > xLast) {\n\t\t\t\tif (xLast > x)\n\t\t\t\t\ty = 1;\n\t\t\t\tx = xLast;\n\t\t\t} else {\n\t\t\t\tx += 2;\n\t\t\t\ty = 2 - y;\n\t\t\t}\n\t\t\tsurface->LineTo(x, rc.top + y);\n\t\t}\n\t} else if (style == INDIC_SQUIGGLEPIXMAP) {\n\t\tPRectangle rcSquiggle = PixelGridAlign(rc);\n\n\t\tint width = Platform::Minimum(4000, rcSquiggle.Width());\n\t\tRGBAImage image(width, 3, 1.0, 0);\n\t\tenum { alphaFull = 0xff, alphaSide = 0x2f, alphaSide2=0x5f };\n\t\tfor (int x = 0; x < width; x++) {\n\t\t\tif (x%2) {\n\t\t\t\t// Two halfway columns have a full pixel in middle flanked by light pixels\n\t\t\t\timage.SetPixel(x, 0, fore, alphaSide);\n\t\t\t\timage.SetPixel(x, 1, fore, alphaFull);\n\t\t\t\timage.SetPixel(x, 2, fore, alphaSide);\n\t\t\t} else {\n\t\t\t\t// Extreme columns have a full pixel at bottom or top and a mid-tone pixel in centre\n\t\t\t\timage.SetPixel(x, (x%4) ? 0 : 2, fore, alphaFull);\n\t\t\t\timage.SetPixel(x, 1, fore, alphaSide2);\n\t\t\t}\n\t\t}\n\t\tsurface->DrawRGBAImage(rcSquiggle, image.GetWidth(), image.GetHeight(), image.Pixels());\n\t} else if (style == INDIC_SQUIGGLELOW) {\n\t\tsurface->MoveTo(rc.left, rc.top);\n\t\tint x = rc.left + 3;\n\t\tint y = 0;\n\t\twhile (x < rc.right) {\n\t\t\tsurface->LineTo(x-1, rc.top + y);\n\t\t\ty = 1 - y;\n        \tsurface->LineTo(x, rc.top + y);\n\t\t\tx += 3;\n\t\t}\n\t\tsurface->LineTo(rc.right, rc.top + y);\t// Finish the line\n\t} else if (style == INDIC_TT) {\n\t\tsurface->MoveTo(rc.left, ymid);\n\t\tint x = rc.left + 5;\n\t\twhile (x < rc.right) {\n\t\t\tsurface->LineTo(x, ymid);\n\t\t\tsurface->MoveTo(x-3, ymid);\n\t\t\tsurface->LineTo(x-3, ymid+2);\n\t\t\tx++;\n\t\t\tsurface->MoveTo(x, ymid);\n\t\t\tx += 5;\n\t\t}\n\t\tsurface->LineTo(rc.right, ymid);\t// Finish the line\n\t\tif (x - 3 <= rc.right) {\n\t\t\tsurface->MoveTo(x-3, ymid);\n\t\t\tsurface->LineTo(x-3, ymid+2);\n\t\t}\n\t} else if (style == INDIC_DIAGONAL) {\n\t\tint x = rc.left;\n\t\twhile (x < rc.right) {\n\t\t\tsurface->MoveTo(x, rc.top+2);\n\t\t\tint endX = x+3;\n\t\t\tint endY = rc.top - 1;\n\t\t\tif (endX > rc.right) {\n\t\t\t\tendY += endX - rc.right;\n\t\t\t\tendX = rc.right;\n\t\t\t}\n\t\t\tsurface->LineTo(endX, endY);\n\t\t\tx += 4;\n\t\t}\n\t} else if (style == INDIC_STRIKE) {\n\t\tsurface->MoveTo(rc.left, rc.top - 4);\n\t\tsurface->LineTo(rc.right, rc.top - 4);\n\t} else if (style == INDIC_HIDDEN) {\n\t\t// Draw nothing\n\t} else if (style == INDIC_BOX) {\n\t\tsurface->MoveTo(rc.left, ymid+1);\n\t\tsurface->LineTo(rc.right, ymid+1);\n\t\tsurface->LineTo(rc.right, rcLine.top+1);\n\t\tsurface->LineTo(rc.left, rcLine.top+1);\n\t\tsurface->LineTo(rc.left, ymid+1);\n\t} else if (style == INDIC_ROUNDBOX || style == INDIC_STRAIGHTBOX) {\n\t\tPRectangle rcBox = rcLine;\n\t\trcBox.top = rcLine.top + 1;\n\t\trcBox.left = rc.left;\n\t\trcBox.right = rc.right;\n\t\tsurface->AlphaRectangle(rcBox, (style == INDIC_ROUNDBOX) ? 1 : 0, fore, fillAlpha, fore, outlineAlpha, 0);\n\t} else if (style == INDIC_DOTBOX) {\n\t\tPRectangle rcBox = PixelGridAlign(rc);\n\t\trcBox.top = rcLine.top + 1;\n\t\trcBox.bottom = rcLine.bottom;\n\t\t// Cap width at 4000 to avoid large allocations when mistakes made\n\t\tint width = Platform::Minimum(rcBox.Width(), 4000);\n\t\tRGBAImage image(width, rcBox.Height(), 1.0, 0);\n\t\t// Draw horizontal lines top and bottom\n\t\tfor (int x=0; x<width; x++) {\n\t\t\tfor (int y=0; y<rcBox.Height(); y += rcBox.Height()-1) {\n\t\t\t\timage.SetPixel(x, y, fore, ((x + y) % 2) ? outlineAlpha : fillAlpha);\n\t\t\t}\n\t\t}\n\t\t// Draw vertical lines left and right\n\t\tfor (int y=1; y<rcBox.Height(); y++) {\n\t\t\tfor (int x=0; x<width; x += width-1) {\n\t\t\t\timage.SetPixel(x, y, fore, ((x + y) % 2) ? outlineAlpha : fillAlpha);\n\t\t\t}\n\t\t}\n\t\tsurface->DrawRGBAImage(rcBox, image.GetWidth(), image.GetHeight(), image.Pixels());\n\t} else if (style == INDIC_DASH) {\n\t\tint x = rc.left;\n\t\twhile (x < rc.right) {\n\t\t\tsurface->MoveTo(x, ymid);\n\t\t\tsurface->LineTo(Platform::Minimum(x + 4, rc.right), ymid);\n\t\t\tx += 7;\n\t\t}\n\t} else if (style == INDIC_DOTS) {\n\t\tint x = rc.left;\n\t\twhile (x < rc.right) {\n\t\t\tPRectangle rcDot(x, ymid, x+1, ymid+1);\n\t\t\tsurface->FillRectangle(rcDot, fore);\n\t\t\tx += 2;\n\t\t}\n\t} else if (style == INDIC_COMPOSITIONTHICK) {\n\t\tPRectangle rcComposition(rc.left+1, rcLine.bottom-2, rc.right-1, rcLine.bottom);\n\t\tsurface->FillRectangle(rcComposition, fore);\n\t} else {\t// Either INDIC_PLAIN or unknown\n\t\tsurface->MoveTo(rc.left, ymid);\n\t\tsurface->LineTo(rc.right, ymid);\n\t}\n}\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/Indicator.h",
    "content": "// Scintilla source code edit control\n/** @file Indicator.h\n ** Defines the style of indicators which are text decorations such as underlining.\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef INDICATOR_H\n#define INDICATOR_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n/**\n */\nclass Indicator {\npublic:\n\tint style;\n\tbool under;\n\tColourDesired fore;\n\tint fillAlpha;\n\tint outlineAlpha;\n\tIndicator() : style(INDIC_PLAIN), under(false), fore(ColourDesired(0,0,0)), fillAlpha(30), outlineAlpha(50) {\n\t}\n\tvoid Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine);\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/KeyMap.cpp",
    "content": "// Scintilla source code edit control\n/** @file KeyMap.cxx\n ** Defines a mapping between keystrokes and commands.\n **/\n// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n\n#include <vector>\n\n#include \"Platform.h\"\n\n#include \"Scintilla.h\"\n\n#include \"KeyMap.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nKeyMap::KeyMap() {\n\tfor (int i = 0; MapDefault[i].key; i++) {\n\t\tAssignCmdKey(MapDefault[i].key,\n\t\t\tMapDefault[i].modifiers,\n\t\t\tMapDefault[i].msg);\n\t}\n}\n\nKeyMap::~KeyMap() {\n\tClear();\n}\n\nvoid KeyMap::Clear() {\n\tkmap.clear();\n}\n\nvoid KeyMap::AssignCmdKey(int key, int modifiers, unsigned int msg) {\n\tfor (size_t keyIndex = 0; keyIndex < kmap.size(); keyIndex++) {\n\t\tif ((key == kmap[keyIndex].key) && (modifiers == kmap[keyIndex].modifiers)) {\n\t\t\tkmap[keyIndex].msg = msg;\n\t\t\treturn;\n\t\t}\n\t}\n\tKeyToCommand ktc;\n\tktc.key = key;\n\tktc.modifiers = modifiers;\n\tktc.msg = msg;\n\tkmap.push_back(ktc);\n}\n\nunsigned int KeyMap::Find(int key, int modifiers) const {\n\tfor (size_t i = 0; i < kmap.size(); i++) {\n\t\tif ((key == kmap[i].key) && (modifiers == kmap[i].modifiers)) {\n\t\t\treturn kmap[i].msg;\n\t\t}\n\t}\n\treturn 0;\n}\n\n#if PLAT_GTK_MACOSX\n#define OS_X_KEYS 1\n#else\n#define OS_X_KEYS 0\n#endif\n\n// Define a modifier that is exactly Ctrl key on all platforms\n// Most uses of Ctrl map to Cmd on OS X but some can't so use SCI_[S]CTRL_META\n#if OS_X_KEYS\n#define SCI_CTRL_META SCI_META\n#define SCI_SCTRL_META (SCI_META | SCI_SHIFT)\n#else\n#define SCI_CTRL_META SCI_CTRL\n#define SCI_SCTRL_META (SCI_CTRL | SCI_SHIFT)\n#endif\n\nconst KeyToCommand KeyMap::MapDefault[] = {\n\n#if OS_X_KEYS\n    {SCK_DOWN,\t\tSCI_CTRL,\tSCI_DOCUMENTEND},\n    {SCK_DOWN,\t\tSCI_CSHIFT,\tSCI_DOCUMENTENDEXTEND},\n    {SCK_UP,\t\tSCI_CTRL,\tSCI_DOCUMENTSTART},\n    {SCK_UP,\t\tSCI_CSHIFT,\tSCI_DOCUMENTSTARTEXTEND},\n    {SCK_LEFT,\t\tSCI_CTRL,\tSCI_VCHOME},\n    {SCK_LEFT,\t\tSCI_CSHIFT,\tSCI_VCHOMEEXTEND},\n    {SCK_RIGHT,\t\tSCI_CTRL,\tSCI_LINEEND},\n    {SCK_RIGHT,\t\tSCI_CSHIFT,\tSCI_LINEENDEXTEND},\n#endif\n\n    {SCK_DOWN,\t\tSCI_NORM,\tSCI_LINEDOWN},\n    {SCK_DOWN,\t\tSCI_SHIFT,\tSCI_LINEDOWNEXTEND},\n    {SCK_DOWN,\t\tSCI_CTRL_META,\tSCI_LINESCROLLDOWN},\n    {SCK_DOWN,\t\tSCI_ASHIFT,\tSCI_LINEDOWNRECTEXTEND},\n    {SCK_UP,\t\tSCI_NORM,\tSCI_LINEUP},\n    {SCK_UP,\t\t\tSCI_SHIFT,\tSCI_LINEUPEXTEND},\n    {SCK_UP,\t\t\tSCI_CTRL_META,\tSCI_LINESCROLLUP},\n    {SCK_UP,\t\tSCI_ASHIFT,\tSCI_LINEUPRECTEXTEND},\n    {'[',\t\t\tSCI_CTRL,\t\tSCI_PARAUP},\n    {'[',\t\t\tSCI_CSHIFT,\tSCI_PARAUPEXTEND},\n    {']',\t\t\tSCI_CTRL,\t\tSCI_PARADOWN},\n    {']',\t\t\tSCI_CSHIFT,\tSCI_PARADOWNEXTEND},\n    {SCK_LEFT,\t\tSCI_NORM,\tSCI_CHARLEFT},\n    {SCK_LEFT,\t\tSCI_SHIFT,\tSCI_CHARLEFTEXTEND},\n    {SCK_LEFT,\t\tSCI_CTRL_META,\tSCI_WORDLEFT},\n    {SCK_LEFT,\t\tSCI_SCTRL_META,\tSCI_WORDLEFTEXTEND},\n    {SCK_LEFT,\t\tSCI_ASHIFT,\tSCI_CHARLEFTRECTEXTEND},\n    {SCK_RIGHT,\t\tSCI_NORM,\tSCI_CHARRIGHT},\n    {SCK_RIGHT,\t\tSCI_SHIFT,\tSCI_CHARRIGHTEXTEND},\n    {SCK_RIGHT,\t\tSCI_CTRL_META,\tSCI_WORDRIGHT},\n    {SCK_RIGHT,\t\tSCI_SCTRL_META,\tSCI_WORDRIGHTEXTEND},\n    {SCK_RIGHT,\t\tSCI_ASHIFT,\tSCI_CHARRIGHTRECTEXTEND},\n    {'/',\t\tSCI_CTRL,\t\tSCI_WORDPARTLEFT},\n    {'/',\t\tSCI_CSHIFT,\tSCI_WORDPARTLEFTEXTEND},\n    {'\\\\',\t\tSCI_CTRL,\t\tSCI_WORDPARTRIGHT},\n    {'\\\\',\t\tSCI_CSHIFT,\tSCI_WORDPARTRIGHTEXTEND},\n    {SCK_HOME,\t\tSCI_NORM,\tSCI_VCHOME},\n    {SCK_HOME, \t\tSCI_SHIFT, \tSCI_VCHOMEEXTEND},\n    {SCK_HOME, \t\tSCI_CTRL, \tSCI_DOCUMENTSTART},\n    {SCK_HOME, \t\tSCI_CSHIFT, \tSCI_DOCUMENTSTARTEXTEND},\n    {SCK_HOME, \t\tSCI_ALT, \tSCI_HOMEDISPLAY},\n    {SCK_HOME,\t\tSCI_ASHIFT,\tSCI_VCHOMERECTEXTEND},\n    {SCK_END,\t \tSCI_NORM,\tSCI_LINEEND},\n    {SCK_END,\t \tSCI_SHIFT, \tSCI_LINEENDEXTEND},\n    {SCK_END, \t\tSCI_CTRL, \tSCI_DOCUMENTEND},\n    {SCK_END, \t\tSCI_CSHIFT, \tSCI_DOCUMENTENDEXTEND},\n    {SCK_END, \t\tSCI_ALT, \tSCI_LINEENDDISPLAY},\n    {SCK_END,\t\tSCI_ASHIFT,\tSCI_LINEENDRECTEXTEND},\n    {SCK_PRIOR,\t\tSCI_NORM,\tSCI_PAGEUP},\n    {SCK_PRIOR,\t\tSCI_SHIFT, \tSCI_PAGEUPEXTEND},\n    {SCK_PRIOR,\t\tSCI_ASHIFT,\tSCI_PAGEUPRECTEXTEND},\n    {SCK_NEXT, \t\tSCI_NORM, \tSCI_PAGEDOWN},\n    {SCK_NEXT, \t\tSCI_SHIFT, \tSCI_PAGEDOWNEXTEND},\n    {SCK_NEXT,\t\tSCI_ASHIFT,\tSCI_PAGEDOWNRECTEXTEND},\n    {SCK_DELETE, \tSCI_NORM,\tSCI_CLEAR},\n    {SCK_DELETE, \tSCI_SHIFT,\tSCI_CUT},\n    {SCK_DELETE, \tSCI_CTRL,\tSCI_DELWORDRIGHT},\n    {SCK_DELETE,\tSCI_CSHIFT,\tSCI_DELLINERIGHT},\n    {SCK_INSERT, \t\tSCI_NORM,\tSCI_EDITTOGGLEOVERTYPE},\n    {SCK_INSERT, \t\tSCI_SHIFT,\tSCI_PASTE},\n    {SCK_INSERT, \t\tSCI_CTRL,\tSCI_COPY},\n    {SCK_ESCAPE,  \tSCI_NORM,\tSCI_CANCEL},\n    {SCK_BACK,\t\tSCI_NORM, \tSCI_DELETEBACK},\n    {SCK_BACK,\t\tSCI_SHIFT, \tSCI_DELETEBACK},\n    {SCK_BACK,\t\tSCI_CTRL, \tSCI_DELWORDLEFT},\n    {SCK_BACK, \t\tSCI_ALT,\tSCI_UNDO},\n    {SCK_BACK,\t\tSCI_CSHIFT,\tSCI_DELLINELEFT},\n    {'Z', \t\t\tSCI_CTRL,\tSCI_UNDO},\n#if OS_X_KEYS\n    {'Z', \t\t\tSCI_CSHIFT,\tSCI_REDO},\n#else\n    {'Y', \t\t\tSCI_CTRL,\tSCI_REDO},\n#endif\n    {'X', \t\t\tSCI_CTRL,\tSCI_CUT},\n    {'C', \t\t\tSCI_CTRL,\tSCI_COPY},\n    {'V', \t\t\tSCI_CTRL,\tSCI_PASTE},\n    {'A', \t\t\tSCI_CTRL,\tSCI_SELECTALL},\n    {SCK_TAB,\t\tSCI_NORM,\tSCI_TAB},\n    {SCK_TAB,\t\tSCI_SHIFT,\tSCI_BACKTAB},\n    {SCK_RETURN, \tSCI_NORM,\tSCI_NEWLINE},\n    {SCK_RETURN, \tSCI_SHIFT,\tSCI_NEWLINE},\n    {SCK_ADD, \t\tSCI_CTRL,\tSCI_ZOOMIN},\n    {SCK_SUBTRACT,\tSCI_CTRL,\tSCI_ZOOMOUT},\n    {SCK_DIVIDE,\tSCI_CTRL,\tSCI_SETZOOM},\n    {'L', \t\t\tSCI_CTRL,\tSCI_LINECUT},\n    {'L', \t\t\tSCI_CSHIFT,\tSCI_LINEDELETE},\n    {'T', \t\t\tSCI_CSHIFT,\tSCI_LINECOPY},\n    {'T', \t\t\tSCI_CTRL,\tSCI_LINETRANSPOSE},\n    {'D', \t\t\tSCI_CTRL,\tSCI_SELECTIONDUPLICATE},\n    {'U', \t\t\tSCI_CTRL,\tSCI_LOWERCASE},\n    {'U', \t\t\tSCI_CSHIFT,\tSCI_UPPERCASE},\n    {0,0,0},\n};\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/KeyMap.h",
    "content": "// Scintilla source code edit control\n/** @file KeyMap.h\n ** Defines a mapping between keystrokes and commands.\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef KEYMAP_H\n#define KEYMAP_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n#define SCI_NORM 0\n#define SCI_SHIFT SCMOD_SHIFT\n#define SCI_CTRL SCMOD_CTRL\n#define SCI_ALT SCMOD_ALT\n#define SCI_META SCMOD_META\n#define SCI_CSHIFT (SCI_CTRL | SCI_SHIFT)\n#define SCI_ASHIFT (SCI_ALT | SCI_SHIFT)\n\n/**\n */\nclass KeyToCommand {\npublic:\n\tint key;\n\tint modifiers;\n\tunsigned int msg;\n};\n\n/**\n */\nclass KeyMap {\n\tstd::vector<KeyToCommand> kmap;\n\tstatic const KeyToCommand MapDefault[];\n\npublic:\n\tKeyMap();\n\t~KeyMap();\n\tvoid Clear();\n\tvoid AssignCmdKey(int key, int modifiers, unsigned int msg);\n\tunsigned int Find(int key, int modifiers) const;\t// 0 returned on failure\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/License.txt",
    "content": "License for Scintilla and SciTE\n\nCopyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n\nAll Rights Reserved \n\nPermission to use, copy, modify, and distribute this software and its \ndocumentation for any purpose and without fee is hereby granted, \nprovided that the above copyright notice appear in all copies and that \nboth that copyright notice and this permission notice appear in \nsupporting documentation. \n\nNEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS \nSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY \nAND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY \nSPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES \nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, \nWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER \nTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE \nOR PERFORMANCE OF THIS SOFTWARE. "
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/LineMarker.cpp",
    "content": "// Scintilla source code edit control\n/** @file LineMarker.cxx\n ** Defines the look of a line marker in the margin .\n **/\n// Copyright 1998-2011 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <string.h>\n#include <math.h>\n\n#include <vector>\n#include <map>\n\n#include \"Platform.h\"\n\n#include \"Scintilla.h\"\n#include \"XPM.h\"\n#include \"LineMarker.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nvoid LineMarker::SetXPM(const char *textForm) {\n\tdelete pxpm;\n\tpxpm = new XPM(textForm);\n\tmarkType = SC_MARK_PIXMAP;\n}\n\nvoid LineMarker::SetXPM(const char *const *linesForm) {\n\tdelete pxpm;\n\tpxpm = new XPM(linesForm);\n\tmarkType = SC_MARK_PIXMAP;\n}\n\nvoid LineMarker::SetRGBAImage(Point sizeRGBAImage, float scale, const unsigned char *pixelsRGBAImage) {\n\tdelete image;\n\timage = new RGBAImage(sizeRGBAImage.x, sizeRGBAImage.y, scale, pixelsRGBAImage);\n\tmarkType = SC_MARK_RGBAIMAGE;\n}\n\nstatic void DrawBox(Surface *surface, int centreX, int centreY, int armSize, ColourDesired fore, ColourDesired back) {\n\tPRectangle rc;\n\trc.left = centreX - armSize;\n\trc.top = centreY - armSize;\n\trc.right = centreX + armSize + 1;\n\trc.bottom = centreY + armSize + 1;\n\tsurface->RectangleDraw(rc, back, fore);\n}\n\nstatic void DrawCircle(Surface *surface, int centreX, int centreY, int armSize, ColourDesired fore, ColourDesired back) {\n\tPRectangle rcCircle;\n\trcCircle.left = centreX - armSize;\n\trcCircle.top = centreY - armSize;\n\trcCircle.right = centreX + armSize + 1;\n\trcCircle.bottom = centreY + armSize + 1;\n\tsurface->Ellipse(rcCircle, back, fore);\n}\n\nstatic void DrawPlus(Surface *surface, int centreX, int centreY, int armSize, ColourDesired fore) {\n\tPRectangle rcV(centreX, centreY - armSize + 2, centreX + 1, centreY + armSize - 2 + 1);\n\tsurface->FillRectangle(rcV, fore);\n\tPRectangle rcH(centreX - armSize + 2, centreY, centreX + armSize - 2 + 1, centreY+1);\n\tsurface->FillRectangle(rcH, fore);\n}\n\nstatic void DrawMinus(Surface *surface, int centreX, int centreY, int armSize, ColourDesired fore) {\n\tPRectangle rcH(centreX - armSize + 2, centreY, centreX + armSize - 2 + 1, centreY+1);\n\tsurface->FillRectangle(rcH, fore);\n}\n\nvoid LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharacter, typeOfFold tFold, int marginStyle) {\n\tColourDesired head = back;\n\tColourDesired body = back;\n\tColourDesired tail = back;\n\n\tswitch (tFold) {\n\tcase LineMarker::head :\n\tcase LineMarker::headWithTail :\n\t\thead = backSelected;\n\t\ttail = backSelected;\n\t\tbreak;\n\tcase LineMarker::body :\n\t\thead = backSelected;\n\t\tbody = backSelected;\n\t\tbreak;\n\tcase LineMarker::tail :\n\t\tbody = backSelected;\n\t\ttail = backSelected;\n\t\tbreak;\n\tdefault :\n\t\t// LineMarker::undefined\n\t\tbreak;\n\t}\n\n\tif ((markType == SC_MARK_PIXMAP) && (pxpm)) {\n\t\tpxpm->Draw(surface, rcWhole);\n\t\treturn;\n\t}\n\tif ((markType == SC_MARK_RGBAIMAGE) && (image)) {\n\t\t// Make rectangle just large enough to fit image centred on centre of rcWhole\n\t\tPRectangle rcImage;\n\t\trcImage.top = static_cast<int>(((rcWhole.top + rcWhole.bottom) - image->GetScaledHeight()) / 2);\n\t\trcImage.bottom = rcImage.top + image->GetScaledHeight();\n\t\trcImage.left = static_cast<int>(((rcWhole.left + rcWhole.right) - image->GetScaledWidth()) / 2);\n\t\trcImage.right = rcImage.left + image->GetScaledWidth();\n\t\tsurface->DrawRGBAImage(rcImage, image->GetWidth(), image->GetHeight(), image->Pixels());\n\t\treturn;\n\t}\n\t// Restrict most shapes a bit\n\tPRectangle rc = rcWhole;\n\trc.top++;\n\trc.bottom--;\n\tint minDim = Platform::Minimum(rc.Width(), rc.Height());\n\tminDim--;\t// Ensure does not go beyond edge\n\tint centreX = floor((rc.right + rc.left) / 2.0);\n\tint centreY = floor((rc.bottom + rc.top) / 2.0);\n\tint dimOn2 = minDim / 2;\n\tint dimOn4 = minDim / 4;\n\tint blobSize = dimOn2-1;\n\tint armSize = dimOn2-2;\n\tif (marginStyle == SC_MARGIN_NUMBER || marginStyle == SC_MARGIN_TEXT || marginStyle == SC_MARGIN_RTEXT) {\n\t\t// On textual margins move marker to the left to try to avoid overlapping the text\n\t\tcentreX = rc.left + dimOn2 + 1;\n\t}\n\tif (markType == SC_MARK_ROUNDRECT) {\n\t\tPRectangle rcRounded = rc;\n\t\trcRounded.left = rc.left + 1;\n\t\trcRounded.right = rc.right - 1;\n\t\tsurface->RoundedRectangle(rcRounded, fore, back);\n\t} else if (markType == SC_MARK_CIRCLE) {\n\t\tPRectangle rcCircle;\n\t\trcCircle.left = centreX - dimOn2;\n\t\trcCircle.top = centreY - dimOn2;\n\t\trcCircle.right = centreX + dimOn2;\n\t\trcCircle.bottom = centreY + dimOn2;\n\t\tsurface->Ellipse(rcCircle, fore, back);\n\t} else if (markType == SC_MARK_ARROW) {\n\t\tPoint pts[] = {\n    \t\tPoint(centreX - dimOn4, centreY - dimOn2),\n    \t\tPoint(centreX - dimOn4, centreY + dimOn2),\n    \t\tPoint(centreX + dimOn2 - dimOn4, centreY),\n\t\t};\n\t\tsurface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),\n                 \t\tfore, back);\n\n\t} else if (markType == SC_MARK_ARROWDOWN) {\n\t\tPoint pts[] = {\n    \t\tPoint(centreX - dimOn2, centreY - dimOn4),\n    \t\tPoint(centreX + dimOn2, centreY - dimOn4),\n    \t\tPoint(centreX, centreY + dimOn2 - dimOn4),\n\t\t};\n\t\tsurface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),\n                 \t\tfore, back);\n\n\t} else if (markType == SC_MARK_PLUS) {\n\t\tPoint pts[] = {\n    \t\tPoint(centreX - armSize, centreY - 1),\n    \t\tPoint(centreX - 1, centreY - 1),\n    \t\tPoint(centreX - 1, centreY - armSize),\n    \t\tPoint(centreX + 1, centreY - armSize),\n    \t\tPoint(centreX + 1, centreY - 1),\n    \t\tPoint(centreX + armSize, centreY -1),\n    \t\tPoint(centreX + armSize, centreY +1),\n    \t\tPoint(centreX + 1, centreY + 1),\n    \t\tPoint(centreX + 1, centreY + armSize),\n    \t\tPoint(centreX - 1, centreY + armSize),\n    \t\tPoint(centreX - 1, centreY + 1),\n    \t\tPoint(centreX - armSize, centreY + 1),\n\t\t};\n\t\tsurface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),\n                 \t\tfore, back);\n\n\t} else if (markType == SC_MARK_MINUS) {\n\t\tPoint pts[] = {\n    \t\tPoint(centreX - armSize, centreY - 1),\n    \t\tPoint(centreX + armSize, centreY -1),\n    \t\tPoint(centreX + armSize, centreY +1),\n    \t\tPoint(centreX - armSize, centreY + 1),\n\t\t};\n\t\tsurface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),\n                 \t\tfore, back);\n\n\t} else if (markType == SC_MARK_SMALLRECT) {\n\t\tPRectangle rcSmall;\n\t\trcSmall.left = rc.left + 1;\n\t\trcSmall.top = rc.top + 2;\n\t\trcSmall.right = rc.right - 1;\n\t\trcSmall.bottom = rc.bottom - 2;\n\t\tsurface->RectangleDraw(rcSmall, fore, back);\n\n\t} else if (markType == SC_MARK_EMPTY || markType == SC_MARK_BACKGROUND ||\n\t\tmarkType == SC_MARK_UNDERLINE || markType == SC_MARK_AVAILABLE) {\n\t\t// An invisible marker so don't draw anything\n\n\t} else if (markType == SC_MARK_VLINE) {\n\t\tsurface->PenColour(body);\n\t\tsurface->MoveTo(centreX, rcWhole.top);\n\t\tsurface->LineTo(centreX, rcWhole.bottom);\n\n\t} else if (markType == SC_MARK_LCORNER) {\n\t\tsurface->PenColour(tail);\n\t\tsurface->MoveTo(centreX, rcWhole.top);\n\t\tsurface->LineTo(centreX, centreY);\n\t\tsurface->LineTo(rc.right - 1, centreY);\n\n\t} else if (markType == SC_MARK_TCORNER) {\n\t\tsurface->PenColour(tail);\n\t\tsurface->MoveTo(centreX, centreY);\n\t\tsurface->LineTo(rc.right - 1, centreY);\n\n\t\tsurface->PenColour(body);\n\t\tsurface->MoveTo(centreX, rcWhole.top);\n\t\tsurface->LineTo(centreX, centreY + 1);\n\n\t\tsurface->PenColour(head);\n\t\tsurface->LineTo(centreX, rcWhole.bottom);\n\n\t} else if (markType == SC_MARK_LCORNERCURVE) {\n\t\tsurface->PenColour(tail);\n\t\tsurface->MoveTo(centreX, rcWhole.top);\n\t\tsurface->LineTo(centreX, centreY-3);\n\t\tsurface->LineTo(centreX+3, centreY);\n\t\tsurface->LineTo(rc.right - 1, centreY);\n\n\t} else if (markType == SC_MARK_TCORNERCURVE) {\n\t\tsurface->PenColour(tail);\n\t\tsurface->MoveTo(centreX, centreY-3);\n\t\tsurface->LineTo(centreX+3, centreY);\n\t\tsurface->LineTo(rc.right - 1, centreY);\n\n\t\tsurface->PenColour(body);\n\t\tsurface->MoveTo(centreX, rcWhole.top);\n\t\tsurface->LineTo(centreX, centreY-2);\n\n\t\tsurface->PenColour(head);\n\t\tsurface->LineTo(centreX, rcWhole.bottom);\n\n\t} else if (markType == SC_MARK_BOXPLUS) {\n\t\tDrawBox(surface, centreX, centreY, blobSize, fore, head);\n\t\tDrawPlus(surface, centreX, centreY, blobSize, tail);\n\n\t} else if (markType == SC_MARK_BOXPLUSCONNECTED) {\n\t\tif (tFold == LineMarker::headWithTail)\n\t\t\tsurface->PenColour(tail);\n\t\telse\n\t\t\tsurface->PenColour(body);\n\t\tsurface->MoveTo(centreX, centreY + blobSize);\n\t\tsurface->LineTo(centreX, rcWhole.bottom);\n\n\t\tsurface->PenColour(body);\n\t\tsurface->MoveTo(centreX, rcWhole.top);\n\t\tsurface->LineTo(centreX, centreY - blobSize);\n\n\t\tDrawBox(surface, centreX, centreY, blobSize, fore, head);\n\t\tDrawPlus(surface, centreX, centreY, blobSize, tail);\n\n\t\tif (tFold == LineMarker::body) {\n\t\t\tsurface->PenColour(tail);\n\t\t\tsurface->MoveTo(centreX + 1, centreY + blobSize);\n\t\t\tsurface->LineTo(centreX + blobSize + 1, centreY + blobSize);\n\n\t\t\tsurface->MoveTo(centreX + blobSize, centreY + blobSize);\n\t\t\tsurface->LineTo(centreX + blobSize, centreY - blobSize);\n\n\t\t\tsurface->MoveTo(centreX + 1, centreY - blobSize);\n\t\t\tsurface->LineTo(centreX + blobSize + 1, centreY - blobSize);\n\t\t}\n\t} else if (markType == SC_MARK_BOXMINUS) {\n\t\tDrawBox(surface, centreX, centreY, blobSize, fore, head);\n\t\tDrawMinus(surface, centreX, centreY, blobSize, tail);\n\n\t\tsurface->PenColour(head);\n\t\tsurface->MoveTo(centreX, centreY + blobSize);\n\t\tsurface->LineTo(centreX, rcWhole.bottom);\n\n\t} else if (markType == SC_MARK_BOXMINUSCONNECTED) {\n\t\tDrawBox(surface, centreX, centreY, blobSize, fore, head);\n\t\tDrawMinus(surface, centreX, centreY, blobSize, tail);\n\n\t\tsurface->PenColour(head);\n\t\tsurface->MoveTo(centreX, centreY + blobSize);\n\t\tsurface->LineTo(centreX, rcWhole.bottom);\n\n\t\tsurface->PenColour(body);\n\t\tsurface->MoveTo(centreX, rcWhole.top);\n\t\tsurface->LineTo(centreX, centreY - blobSize);\n\n\t\tif (tFold == LineMarker::body) {\n\t\t\tsurface->PenColour(tail);\n\t\t\tsurface->MoveTo(centreX + 1, centreY + blobSize);\n\t\t\tsurface->LineTo(centreX + blobSize + 1, centreY + blobSize);\n\n\t\t\tsurface->MoveTo(centreX + blobSize, centreY + blobSize);\n\t\t\tsurface->LineTo(centreX + blobSize, centreY - blobSize);\n\n\t\t\tsurface->MoveTo(centreX + 1, centreY - blobSize);\n\t\t\tsurface->LineTo(centreX + blobSize + 1, centreY - blobSize);\n\t\t}\n\t} else if (markType == SC_MARK_CIRCLEPLUS) {\n\t\tDrawCircle(surface, centreX, centreY, blobSize, fore, head);\n\t\tDrawPlus(surface, centreX, centreY, blobSize, tail);\n\n\t} else if (markType == SC_MARK_CIRCLEPLUSCONNECTED) {\n\t\tif (tFold == LineMarker::headWithTail)\n\t\t\tsurface->PenColour(tail);\n\t\telse\n\t\t\tsurface->PenColour(body);\n\t\tsurface->MoveTo(centreX, centreY + blobSize);\n\t\tsurface->LineTo(centreX, rcWhole.bottom);\n\n\t\tsurface->PenColour(body);\n\t\tsurface->MoveTo(centreX, rcWhole.top);\n\t\tsurface->LineTo(centreX, centreY - blobSize);\n\n\t\tDrawCircle(surface, centreX, centreY, blobSize, fore, head);\n\t\tDrawPlus(surface, centreX, centreY, blobSize, tail);\n\n\t} else if (markType == SC_MARK_CIRCLEMINUS) {\n\t\tDrawCircle(surface, centreX, centreY, blobSize, fore, head);\n\t\tDrawMinus(surface, centreX, centreY, blobSize, tail);\n\n\t\tsurface->PenColour(head);\n\t\tsurface->MoveTo(centreX, centreY + blobSize);\n\t\tsurface->LineTo(centreX, rcWhole.bottom);\n\n\t} else if (markType == SC_MARK_CIRCLEMINUSCONNECTED) {\n\t\tDrawCircle(surface, centreX, centreY, blobSize, fore, head);\n\t\tDrawMinus(surface, centreX, centreY, blobSize, tail);\n\n\t\tsurface->PenColour(head);\n\t\tsurface->MoveTo(centreX, centreY + blobSize);\n\t\tsurface->LineTo(centreX, rcWhole.bottom);\n\n\t\tsurface->PenColour(body);\n\t\tsurface->MoveTo(centreX, rcWhole.top);\n\t\tsurface->LineTo(centreX, centreY - blobSize);\n\n\t} else if (markType >= SC_MARK_CHARACTER) {\n\t\tchar character[1];\n\t\tcharacter[0] = static_cast<char>(markType - SC_MARK_CHARACTER);\n\t\tXYPOSITION width = surface->WidthText(fontForCharacter, character, 1);\n\t\trc.left += (rc.Width() - width) / 2;\n\t\trc.right = rc.left + width;\n\t\tsurface->DrawTextClipped(rc, fontForCharacter, rc.bottom - 2,\n\t\t\tcharacter, 1, fore, back);\n\n\t} else if (markType == SC_MARK_DOTDOTDOT) {\n\t\tint right = centreX - 6;\n\t\tfor (int b=0; b<3; b++) {\n\t\t\tPRectangle rcBlob(right, rc.bottom - 4, right + 2, rc.bottom-2);\n\t\t\tsurface->FillRectangle(rcBlob, fore);\n\t\t\tright += 5;\n\t\t}\n\t} else if (markType == SC_MARK_ARROWS) {\n\t\tsurface->PenColour(fore);\n\t\tint right = centreX - 2;\n\t\tfor (int b=0; b<3; b++) {\n\t\t\tsurface->MoveTo(right - 4, centreY - 4);\n\t\t\tsurface->LineTo(right, centreY);\n\t\t\tsurface->LineTo(right - 5, centreY + 5);\n\t\t\tright += 4;\n\t\t}\n\t} else if (markType == SC_MARK_SHORTARROW) {\n\t\tPoint pts[] = {\n\t\t\tPoint(centreX, centreY + dimOn2),\n\t\t\tPoint(centreX + dimOn2, centreY),\n\t\t\tPoint(centreX, centreY - dimOn2),\n\t\t\tPoint(centreX, centreY - dimOn4),\n\t\t\tPoint(centreX - dimOn4, centreY - dimOn4),\n\t\t\tPoint(centreX - dimOn4, centreY + dimOn4),\n\t\t\tPoint(centreX, centreY + dimOn4),\n\t\t\tPoint(centreX, centreY + dimOn2),\n\t\t};\n\t\tsurface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),\n\t\t\t\tfore, back);\n\t} else if (markType == SC_MARK_LEFTRECT) {\n\t\tPRectangle rcLeft = rcWhole;\n\t\trcLeft.right = rcLeft.left + 4;\n\t\tsurface->FillRectangle(rcLeft, back);\n\t} else { // SC_MARK_FULLRECT\n\t\tsurface->FillRectangle(rcWhole, back);\n\t}\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/LineMarker.h",
    "content": "// Scintilla source code edit control\n/** @file LineMarker.h\n ** Defines the look of a line marker in the margin .\n **/\n// Copyright 1998-2011 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef LINEMARKER_H\n#define LINEMARKER_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n/**\n */\nclass LineMarker {\npublic:\n\tenum typeOfFold { undefined, head, body, tail, headWithTail };\n\n\tint markType;\n\tColourDesired fore;\n\tColourDesired back;\n\tColourDesired backSelected;\n\tint alpha;\n\tXPM *pxpm;\n\tRGBAImage *image;\n\tLineMarker() {\n\t\tmarkType = SC_MARK_CIRCLE;\n\t\tfore = ColourDesired(0,0,0);\n\t\tback = ColourDesired(0xff,0xff,0xff);\n\t\tbackSelected = ColourDesired(0xff,0x00,0x00);\n\t\talpha = SC_ALPHA_NOALPHA;\n\t\tpxpm = NULL;\n\t\timage = NULL;\n\t}\n\tLineMarker(const LineMarker &) {\n\t\t// Defined to avoid pxpm being blindly copied, not as a complete copy constructor\n\t\tmarkType = SC_MARK_CIRCLE;\n\t\tfore = ColourDesired(0,0,0);\n\t\tback = ColourDesired(0xff,0xff,0xff);\n\t\tbackSelected = ColourDesired(0xff,0x00,0x00);\n\t\talpha = SC_ALPHA_NOALPHA;\n\t\tpxpm = NULL;\n\t\timage = NULL;\n\t}\n\t~LineMarker() {\n\t\tdelete pxpm;\n\t\tdelete image;\n\t}\n\tLineMarker &operator=(const LineMarker &other) {\n\t\t// Defined to avoid pxpm being blindly copied, not as a complete assignment operator\n\t\tif (this != &other) {\n\t\t\tmarkType = SC_MARK_CIRCLE;\n\t\t\tfore = ColourDesired(0,0,0);\n\t\t\tback = ColourDesired(0xff,0xff,0xff);\n\t\t\tbackSelected = ColourDesired(0xff,0x00,0x00);\n\t\t\talpha = SC_ALPHA_NOALPHA;\n\t\t\tdelete pxpm;\n\t\t\tpxpm = NULL;\n\t\t\tdelete image;\n\t\t\timage = NULL;\n\t\t}\n\t\treturn *this;\n\t}\n\tvoid SetXPM(const char *textForm);\n\tvoid SetXPM(const char *const *linesForm);\n\tvoid SetRGBAImage(Point sizeRGBAImage, float scale, const unsigned char *pixelsRGBAImage);\n\tvoid Draw(Surface *surface, PRectangle &rc, Font &fontForCharacter, typeOfFold tFold, int marginStyle);\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/Partitioning.h",
    "content": "// Scintilla source code edit control\n/** @file Partitioning.h\n ** Data structure used to partition an interval. Used for holding line start/end positions.\n **/\n// Copyright 1998-2007 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef PARTITIONING_H\n#define PARTITIONING_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n/// A split vector of integers with a method for adding a value to all elements\n/// in a range.\n/// Used by the Partitioning class.\n\nclass SplitVectorWithRangeAdd : public SplitVector<int> {\npublic:\n\tSplitVectorWithRangeAdd(int growSize_) {\n\t\tSetGrowSize(growSize_);\n\t\tReAllocate(growSize_);\n\t}\n\t~SplitVectorWithRangeAdd() {\n\t}\n\tvoid RangeAddDelta(int start, int end, int delta) {\n\t\t// end is 1 past end, so end-start is number of elements to change\n\t\tint i = 0;\n\t\tint rangeLength = end - start;\n\t\tint range1Length = rangeLength;\n\t\tint part1Left = part1Length - start;\n\t\tif (range1Length > part1Left)\n\t\t\trange1Length = part1Left;\n\t\twhile (i < range1Length) {\n\t\t\tbody[start++] += delta;\n\t\t\ti++;\n\t\t}\n\t\tstart += gapLength;\n\t\twhile (i < rangeLength) {\n\t\t\tbody[start++] += delta;\n\t\t\ti++;\n\t\t}\n\t}\n};\n\n/// Divide an interval into multiple partitions.\n/// Useful for breaking a document down into sections such as lines.\n/// A 0 length interval has a single 0 length partition, numbered 0\n/// If interval not 0 length then each partition non-zero length\n/// When needed, positions after the interval are considered part of the last partition\n/// but the end of the last partition can be found with PositionFromPartition(last+1).\n\nclass Partitioning {\nprivate:\n\t// To avoid calculating all the partition positions whenever any text is inserted\n\t// there may be a step somewhere in the list.\n\tint stepPartition;\n\tint stepLength;\n\tSplitVectorWithRangeAdd *body;\n\n\t// Move step forward\n\tvoid ApplyStep(int partitionUpTo) {\n\t\tif (stepLength != 0) {\n\t\t\tbody->RangeAddDelta(stepPartition+1, partitionUpTo + 1, stepLength);\n\t\t}\n\t\tstepPartition = partitionUpTo;\n\t\tif (stepPartition >= body->Length()-1) {\n\t\t\tstepPartition = body->Length()-1;\n\t\t\tstepLength = 0;\n\t\t}\n\t}\n\n\t// Move step backward\n\tvoid BackStep(int partitionDownTo) {\n\t\tif (stepLength != 0) {\n\t\t\tbody->RangeAddDelta(partitionDownTo+1, stepPartition+1, -stepLength);\n\t\t}\n\t\tstepPartition = partitionDownTo;\n\t}\n\n\tvoid Allocate(int growSize) {\n\t\tbody = new SplitVectorWithRangeAdd(growSize);\n\t\tstepPartition = 0;\n\t\tstepLength = 0;\n\t\tbody->Insert(0, 0);\t// This value stays 0 for ever\n\t\tbody->Insert(1, 0);\t// This is the end of the first partition and will be the start of the second\n\t}\n\npublic:\n\tPartitioning(int growSize) {\n\t\tAllocate(growSize);\n\t}\n\n\t~Partitioning() {\n\t\tdelete body;\n\t\tbody = 0;\n\t}\n\n\tint Partitions() const {\n\t\treturn body->Length()-1;\n\t}\n\n\tvoid InsertPartition(int partition, int pos) {\n\t\tif (stepPartition < partition) {\n\t\t\tApplyStep(partition);\n\t\t}\n\t\tbody->Insert(partition, pos);\n\t\tstepPartition++;\n\t}\n\n\tvoid SetPartitionStartPosition(int partition, int pos) {\n\t\tApplyStep(partition+1);\n\t\tif ((partition < 0) || (partition > body->Length())) {\n\t\t\treturn;\n\t\t}\n\t\tbody->SetValueAt(partition, pos);\n\t}\n\n\tvoid InsertText(int partitionInsert, int delta) {\n\t\t// Point all the partitions after the insertion point further along in the buffer\n\t\tif (stepLength != 0) {\n\t\t\tif (partitionInsert >= stepPartition) {\n\t\t\t\t// Fill in up to the new insertion point\n\t\t\t\tApplyStep(partitionInsert);\n\t\t\t\tstepLength += delta;\n\t\t\t} else if (partitionInsert >= (stepPartition - body->Length() / 10)) {\n\t\t\t\t// Close to step but before so move step back\n\t\t\t\tBackStep(partitionInsert);\n\t\t\t\tstepLength += delta;\n\t\t\t} else {\n\t\t\t\tApplyStep(body->Length()-1);\n\t\t\t\tstepPartition = partitionInsert;\n\t\t\t\tstepLength = delta;\n\t\t\t}\n\t\t} else {\n\t\t\tstepPartition = partitionInsert;\n\t\t\tstepLength = delta;\n\t\t}\n\t}\n\n\tvoid RemovePartition(int partition) {\n\t\tif (partition > stepPartition) {\n\t\t\tApplyStep(partition);\n\t\t\tstepPartition--;\n\t\t} else {\n\t\t\tstepPartition--;\n\t\t}\n\t\tbody->Delete(partition);\n\t}\n\n\tint PositionFromPartition(int partition) const {\n\t\tPLATFORM_ASSERT(partition >= 0);\n\t\tPLATFORM_ASSERT(partition < body->Length());\n\t\tif ((partition < 0) || (partition >= body->Length())) {\n\t\t\treturn 0;\n\t\t}\n\t\tint pos = body->ValueAt(partition);\n\t\tif (partition > stepPartition)\n\t\t\tpos += stepLength;\n\t\treturn pos;\n\t}\n\n\t/// Return value in range [0 .. Partitions() - 1] even for arguments outside interval\n\tint PartitionFromPosition(int pos) const {\n\t\tif (body->Length() <= 1)\n\t\t\treturn 0;\n\t\tif (pos >= (PositionFromPartition(body->Length()-1)))\n\t\t\treturn body->Length() - 1 - 1;\n\t\tint lower = 0;\n\t\tint upper = body->Length()-1;\n\t\tdo {\n\t\t\tint middle = (upper + lower + 1) / 2; \t// Round high\n\t\t\tint posMiddle = body->ValueAt(middle);\n\t\t\tif (middle > stepPartition)\n\t\t\t\tposMiddle += stepLength;\n\t\t\tif (pos < posMiddle) {\n\t\t\t\tupper = middle - 1;\n\t\t\t} else {\n\t\t\t\tlower = middle;\n\t\t\t}\n\t\t} while (lower < upper);\n\t\treturn lower;\n\t}\n\n\tvoid DeleteAll() {\n\t\tint growSize = body->GetGrowSize();\n\t\tdelete body;\n\t\tAllocate(growSize);\n\t}\n};\n\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/PerLine.cpp",
    "content": "// Scintilla source code edit control\n/** @file PerLine.cxx\n ** Manages data associated with each line of the document\n **/\n// Copyright 1998-2009 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <string.h>\n\n#include <algorithm>\n\n#include \"Platform.h\"\n\n#include \"Scintilla.h\"\n#include \"SplitVector.h\"\n#include \"Partitioning.h\"\n#include \"CellBuffer.h\"\n#include \"PerLine.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nMarkerHandleSet::MarkerHandleSet() {\n\troot = 0;\n}\n\nMarkerHandleSet::~MarkerHandleSet() {\n\tMarkerHandleNumber *mhn = root;\n\twhile (mhn) {\n\t\tMarkerHandleNumber *mhnToFree = mhn;\n\t\tmhn = mhn->next;\n\t\tdelete mhnToFree;\n\t}\n\troot = 0;\n}\n\nint MarkerHandleSet::Length() const {\n\tint c = 0;\n\tMarkerHandleNumber *mhn = root;\n\twhile (mhn) {\n\t\tc++;\n\t\tmhn = mhn->next;\n\t}\n\treturn c;\n}\n\nint MarkerHandleSet::MarkValue() const {\n\tunsigned int m = 0;\n\tMarkerHandleNumber *mhn = root;\n\twhile (mhn) {\n\t\tm |= (1 << mhn->number);\n\t\tmhn = mhn->next;\n\t}\n\treturn m;\n}\n\nbool MarkerHandleSet::Contains(int handle) const {\n\tMarkerHandleNumber *mhn = root;\n\twhile (mhn) {\n\t\tif (mhn->handle == handle) {\n\t\t\treturn true;\n\t\t}\n\t\tmhn = mhn->next;\n\t}\n\treturn false;\n}\n\nbool MarkerHandleSet::InsertHandle(int handle, int markerNum) {\n\tMarkerHandleNumber *mhn = new MarkerHandleNumber;\n\tmhn->handle = handle;\n\tmhn->number = markerNum;\n\tmhn->next = root;\n\troot = mhn;\n\treturn true;\n}\n\nvoid MarkerHandleSet::RemoveHandle(int handle) {\n\tMarkerHandleNumber **pmhn = &root;\n\twhile (*pmhn) {\n\t\tMarkerHandleNumber *mhn = *pmhn;\n\t\tif (mhn->handle == handle) {\n\t\t\t*pmhn = mhn->next;\n\t\t\tdelete mhn;\n\t\t\treturn;\n\t\t}\n\t\tpmhn = &((*pmhn)->next);\n\t}\n}\n\nbool MarkerHandleSet::RemoveNumber(int markerNum, bool all) {\n\tbool performedDeletion = false;\n\tMarkerHandleNumber **pmhn = &root;\n\twhile (*pmhn) {\n\t\tMarkerHandleNumber *mhn = *pmhn;\n\t\tif (mhn->number == markerNum) {\n\t\t\t*pmhn = mhn->next;\n\t\t\tdelete mhn;\n\t\t\tperformedDeletion = true;\n\t\t\tif (!all)\n\t\t\t\tbreak; \n\t\t} else {\n\t\t\tpmhn = &((*pmhn)->next);\n\t\t}\n\t}\n\treturn performedDeletion;\n}\n\nvoid MarkerHandleSet::CombineWith(MarkerHandleSet *other) {\n\tMarkerHandleNumber **pmhn = &root;\n\twhile (*pmhn) {\n\t\tpmhn = &((*pmhn)->next);\n\t}\n\t*pmhn = other->root;\n\tother->root = 0;\n}\n\nLineMarkers::~LineMarkers() {\n\tInit();\n}\n\nvoid LineMarkers::Init() {\n\tfor (int line = 0; line < markers.Length(); line++) {\n\t\tdelete markers[line];\n\t\tmarkers[line] = 0;\n\t}\n\tmarkers.DeleteAll();\n}\n\nvoid LineMarkers::InsertLine(int line) {\n\tif (markers.Length()) {\n\t\tmarkers.Insert(line, 0);\n\t}\n}\n\nvoid LineMarkers::RemoveLine(int line) {\n\t// Retain the markers from the deleted line by oring them into the previous line\n\tif (markers.Length()) {\n\t\tif (line > 0) {\n\t\t\tMergeMarkers(line - 1);\n\t\t}\n\t\tmarkers.Delete(line);\n\t}\n}\n\nint LineMarkers::LineFromHandle(int markerHandle) {\n\tif (markers.Length()) {\n\t\tfor (int line = 0; line < markers.Length(); line++) {\n\t\t\tif (markers[line]) {\n\t\t\t\tif (markers[line]->Contains(markerHandle)) {\n\t\t\t\t\treturn line;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn -1;\n}\n\nvoid LineMarkers::MergeMarkers(int pos) {\n\tif (markers[pos + 1] != NULL) {\n\t\tif (markers[pos] == NULL)\n\t\t\tmarkers[pos] = new MarkerHandleSet;\n\t\tmarkers[pos]->CombineWith(markers[pos + 1]);\n\t\tdelete markers[pos + 1];\n\t\tmarkers[pos + 1] = NULL;\n\t}\n}\n\nint LineMarkers::MarkValue(int line) {\n\tif (markers.Length() && (line >= 0) && (line < markers.Length()) && markers[line])\n\t\treturn markers[line]->MarkValue();\n\telse\n\t\treturn 0;\n}\n\nint LineMarkers::MarkerNext(int lineStart, int mask) const {\n\tif (lineStart < 0)\n\t\tlineStart = 0;\n\tint length = markers.Length();\n\tfor (int iLine = lineStart; iLine < length; iLine++) {\n\t\tMarkerHandleSet *onLine = markers[iLine];\n\t\tif (onLine && ((onLine->MarkValue() & mask) != 0))\n\t\t//if ((pdoc->GetMark(iLine) & lParam) != 0)\n\t\t\treturn iLine;\n\t}\n\treturn -1;\n}\n\nint LineMarkers::AddMark(int line, int markerNum, int lines) {\n\thandleCurrent++;\n\tif (!markers.Length()) {\n\t\t// No existing markers so allocate one element per line\n\t\tmarkers.InsertValue(0, lines, 0);\n\t}\n\tif (line >= markers.Length()) {\n\t\treturn -1;\n\t}\n\tif (!markers[line]) {\n\t\t// Need new structure to hold marker handle\n\t\tmarkers[line] = new MarkerHandleSet();\n\t}\n\tmarkers[line]->InsertHandle(handleCurrent, markerNum);\n\n\treturn handleCurrent;\n}\n\nbool LineMarkers::DeleteMark(int line, int markerNum, bool all) {\n\tbool someChanges = false;\n\tif (markers.Length() && (line >= 0) && (line < markers.Length()) && markers[line]) {\n\t\tif (markerNum == -1) {\n\t\t\tsomeChanges = true;\n\t\t\tdelete markers[line];\n\t\t\tmarkers[line] = NULL;\n\t\t} else {\n\t\t\tsomeChanges = markers[line]->RemoveNumber(markerNum, all);\n\t\t\tif (markers[line]->Length() == 0) {\n\t\t\t\tdelete markers[line];\n\t\t\t\tmarkers[line] = NULL;\n\t\t\t}\n\t\t}\n\t}\n\treturn someChanges;\n}\n\nvoid LineMarkers::DeleteMarkFromHandle(int markerHandle) {\n\tint line = LineFromHandle(markerHandle);\n\tif (line >= 0) {\n\t\tmarkers[line]->RemoveHandle(markerHandle);\n\t\tif (markers[line]->Length() == 0) {\n\t\t\tdelete markers[line];\n\t\t\tmarkers[line] = NULL;\n\t\t}\n\t}\n}\n\nLineLevels::~LineLevels() {\n}\n\nvoid LineLevels::Init() {\n\tlevels.DeleteAll();\n}\n\nvoid LineLevels::InsertLine(int line) {\n\tif (levels.Length()) {\n\t\tint level = (line < levels.Length()) ? levels[line] : SC_FOLDLEVELBASE;\n\t\tlevels.InsertValue(line, 1, level);\n\t}\n}\n\nvoid LineLevels::RemoveLine(int line) {\n\tif (levels.Length()) {\n\t\t// Move up following lines but merge header flag from this line\n\t\t// to line before to avoid a temporary disappearence causing expansion.\n\t\tint firstHeader = levels[line] & SC_FOLDLEVELHEADERFLAG;\n\t\tlevels.Delete(line);\n\t\tif (line == levels.Length()-1) // Last line loses the header flag\n\t\t\tlevels[line-1] &= ~SC_FOLDLEVELHEADERFLAG;\n\t\telse if (line > 0)\n\t\t\tlevels[line-1] |= firstHeader;\n\t}\n}\n\nvoid LineLevels::ExpandLevels(int sizeNew) {\n\tlevels.InsertValue(levels.Length(), sizeNew - levels.Length(), SC_FOLDLEVELBASE);\n}\n\nvoid LineLevels::ClearLevels() {\n\tlevels.DeleteAll();\n}\n\nint LineLevels::SetLevel(int line, int level, int lines) {\n\tint prev = 0;\n\tif ((line >= 0) && (line < lines)) {\n\t\tif (!levels.Length()) {\n\t\t\tExpandLevels(lines + 1);\n\t\t}\n\t\tprev = levels[line];\n\t\tif (prev != level) {\n\t\t\tlevels[line] = level;\n\t\t}\n\t}\n\treturn prev;\n}\n\nint LineLevels::GetLevel(int line) const {\n\tif (levels.Length() && (line >= 0) && (line < levels.Length())) {\n\t\treturn levels[line];\n\t} else {\n\t\treturn SC_FOLDLEVELBASE;\n\t}\n}\n\nLineState::~LineState() {\n}\n\nvoid LineState::Init() {\n\tlineStates.DeleteAll();\n}\n\nvoid LineState::InsertLine(int line) {\n\tif (lineStates.Length()) {\n\t\tlineStates.EnsureLength(line);\n\t\tint val = (line < lineStates.Length()) ? lineStates[line] : 0;\n\t\tlineStates.Insert(line, val);\n\t}\n}\n\nvoid LineState::RemoveLine(int line) {\n\tif (lineStates.Length() > line) {\n\t\tlineStates.Delete(line);\n\t}\n}\n\nint LineState::SetLineState(int line, int state) {\n\tlineStates.EnsureLength(line + 1);\n\tint stateOld = lineStates[line];\n\tlineStates[line] = state;\n\treturn stateOld;\n}\n\nint LineState::GetLineState(int line) {\n\tif (line < 0)\n\t\treturn 0;\n\tlineStates.EnsureLength(line + 1);\n\treturn lineStates[line];\n}\n\nint LineState::GetMaxLineState() const {\n\treturn lineStates.Length();\n}\n\nstatic int NumberLines(const char *text) {\n\tif (text) {\n\t\tint newLines = 0;\n\t\twhile (*text) {\n\t\t\tif (*text == '\\n')\n\t\t\t\tnewLines++;\n\t\t\ttext++;\n\t\t}\n\t\treturn newLines+1;\n\t} else {\n\t\treturn 0;\n\t}\n}\n\n// Each allocated LineAnnotation is a char array which starts with an AnnotationHeader\n// and then has text and optional styles.\n\nstatic const int IndividualStyles = 0x100;\n\nstruct AnnotationHeader {\n\tshort style;\t// Style IndividualStyles implies array of styles\n\tshort lines;\n\tint length;\n};\n\nLineAnnotation::~LineAnnotation() {\n\tClearAll();\n}\n\nvoid LineAnnotation::Init() {\n\tClearAll();\n}\n\nvoid LineAnnotation::InsertLine(int line) {\n\tif (annotations.Length()) {\n\t\tannotations.EnsureLength(line);\n\t\tannotations.Insert(line, 0);\n\t}\n}\n\nvoid LineAnnotation::RemoveLine(int line) {\n\tif (annotations.Length() && (line < annotations.Length())) {\n\t\tdelete []annotations[line];\n\t\tannotations.Delete(line);\n\t}\n}\n\nbool LineAnnotation::MultipleStyles(int line) const {\n\tif (annotations.Length() && (line >= 0) && (line < annotations.Length()) && annotations[line])\n\t\treturn reinterpret_cast<AnnotationHeader *>(annotations[line])->style == IndividualStyles;\n\telse\n\t\treturn 0;\n}\n\nint LineAnnotation::Style(int line) const {\n\tif (annotations.Length() && (line >= 0) && (line < annotations.Length()) && annotations[line])\n\t\treturn reinterpret_cast<AnnotationHeader *>(annotations[line])->style;\n\telse\n\t\treturn 0;\n}\n\nconst char *LineAnnotation::Text(int line) const {\n\tif (annotations.Length() && (line >= 0) && (line < annotations.Length()) && annotations[line])\n\t\treturn annotations[line]+sizeof(AnnotationHeader);\n\telse\n\t\treturn 0;\n}\n\nconst unsigned char *LineAnnotation::Styles(int line) const {\n\tif (annotations.Length() && (line >= 0) && (line < annotations.Length()) && annotations[line] && MultipleStyles(line))\n\t\treturn reinterpret_cast<unsigned char *>(annotations[line] + sizeof(AnnotationHeader) + Length(line));\n\telse\n\t\treturn 0;\n}\n\nstatic char *AllocateAnnotation(int length, int style) {\n\tsize_t len = sizeof(AnnotationHeader) + length + ((style == IndividualStyles) ? length : 0);\n\tchar *ret = new char[len];\n\tmemset(ret, 0, len);\n\treturn ret;\n}\n\nvoid LineAnnotation::SetText(int line, const char *text) {\n\tif (text && (line >= 0)) {\n\t\tannotations.EnsureLength(line+1);\n\t\tint style = Style(line);\n\t\tif (annotations[line]) {\n\t\t\tdelete []annotations[line];\n\t\t}\n\t\tannotations[line] = AllocateAnnotation(static_cast<int>(strlen(text)), style);\n\t\tAnnotationHeader *pah = reinterpret_cast<AnnotationHeader *>(annotations[line]);\n\t\tpah->style = static_cast<short>(style);\n\t\tpah->length = static_cast<int>(strlen(text));\n\t\tpah->lines = static_cast<short>(NumberLines(text));\n\t\tmemcpy(annotations[line]+sizeof(AnnotationHeader), text, pah->length);\n\t} else {\n\t\tif (annotations.Length() && (line >= 0) && (line < annotations.Length()) && annotations[line]) {\n\t\t\tdelete []annotations[line];\n\t\t\tannotations[line] = 0;\n\t\t}\n\t}\n}\n\nvoid LineAnnotation::ClearAll() {\n\tfor (int line = 0; line < annotations.Length(); line++) {\n\t\tdelete []annotations[line];\n\t\tannotations[line] = 0;\n\t}\n\tannotations.DeleteAll();\n}\n\nvoid LineAnnotation::SetStyle(int line, int style) {\n\tannotations.EnsureLength(line+1);\n\tif (!annotations[line]) {\n\t\tannotations[line] = AllocateAnnotation(0, style);\n\t}\n\treinterpret_cast<AnnotationHeader *>(annotations[line])->style = static_cast<short>(style);\n}\n\nvoid LineAnnotation::SetStyles(int line, const unsigned char *styles) {\n\tif (line >= 0) {\n\t\tannotations.EnsureLength(line+1);\n\t\tif (!annotations[line]) {\n\t\t\tannotations[line] = AllocateAnnotation(0, IndividualStyles);\n\t\t} else {\n\t\t\tAnnotationHeader *pahSource = reinterpret_cast<AnnotationHeader *>(annotations[line]);\n\t\t\tif (pahSource->style != IndividualStyles) {\n\t\t\t\tchar *allocation = AllocateAnnotation(pahSource->length, IndividualStyles);\n\t\t\t\tAnnotationHeader *pahAlloc = reinterpret_cast<AnnotationHeader *>(allocation);\n\t\t\t\tpahAlloc->length = pahSource->length;\n\t\t\t\tpahAlloc->lines = pahSource->lines;\n\t\t\t\tmemcpy(allocation + sizeof(AnnotationHeader), annotations[line] + sizeof(AnnotationHeader), pahSource->length);\n\t\t\t\tdelete []annotations[line];\n\t\t\t\tannotations[line] = allocation;\n\t\t\t}\n\t\t}\n\t\tAnnotationHeader *pah = reinterpret_cast<AnnotationHeader *>(annotations[line]);\n\t\tpah->style = IndividualStyles;\n\t\tmemcpy(annotations[line] + sizeof(AnnotationHeader) + pah->length, styles, pah->length);\n\t}\n}\n\nint LineAnnotation::Length(int line) const {\n\tif (annotations.Length() && (line >= 0) && (line < annotations.Length()) && annotations[line])\n\t\treturn reinterpret_cast<AnnotationHeader *>(annotations[line])->length;\n\telse\n\t\treturn 0;\n}\n\nint LineAnnotation::Lines(int line) const {\n\tif (annotations.Length() && (line >= 0) && (line < annotations.Length()) && annotations[line])\n\t\treturn reinterpret_cast<AnnotationHeader *>(annotations[line])->lines;\n\telse\n\t\treturn 0;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/PerLine.h",
    "content": "// Scintilla source code edit control\n/** @file PerLine.h\n ** Manages data associated with each line of the document\n **/\n// Copyright 1998-2009 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef PERLINE_H\n#define PERLINE_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n/**\n * This holds the marker identifier and the marker type to display.\n * MarkerHandleNumbers are members of lists.\n */\nstruct MarkerHandleNumber {\n\tint handle;\n\tint number;\n\tMarkerHandleNumber *next;\n};\n\n/**\n * A marker handle set contains any number of MarkerHandleNumbers.\n */\nclass MarkerHandleSet {\n\tMarkerHandleNumber *root;\n\npublic:\n\tMarkerHandleSet();\n\t~MarkerHandleSet();\n\tint Length() const;\n\tint MarkValue() const;\t///< Bit set of marker numbers.\n\tbool Contains(int handle) const;\n\tbool InsertHandle(int handle, int markerNum);\n\tvoid RemoveHandle(int handle);\n\tbool RemoveNumber(int markerNum, bool all);\n\tvoid CombineWith(MarkerHandleSet *other);\n};\n\nclass LineMarkers : public PerLine {\n\tSplitVector<MarkerHandleSet *> markers;\n\t/// Handles are allocated sequentially and should never have to be reused as 32 bit ints are very big.\n\tint handleCurrent;\npublic:\n\tLineMarkers() : handleCurrent(0) {\n\t}\n\tvirtual ~LineMarkers();\n\tvirtual void Init();\n\tvirtual void InsertLine(int line);\n\tvirtual void RemoveLine(int line);\n\n\tint MarkValue(int line);\n\tint MarkerNext(int lineStart, int mask) const;\n\tint AddMark(int line, int marker, int lines);\n\tvoid MergeMarkers(int pos);\n\tbool DeleteMark(int line, int markerNum, bool all);\n\tvoid DeleteMarkFromHandle(int markerHandle);\n\tint LineFromHandle(int markerHandle);\n};\n\nclass LineLevels : public PerLine {\n\tSplitVector<int> levels;\npublic:\n\tvirtual ~LineLevels();\n\tvirtual void Init();\n\tvirtual void InsertLine(int line);\n\tvirtual void RemoveLine(int line);\n\n\tvoid ExpandLevels(int sizeNew=-1);\n\tvoid ClearLevels();\n\tint SetLevel(int line, int level, int lines);\n\tint GetLevel(int line) const;\n};\n\nclass LineState : public PerLine {\n\tSplitVector<int> lineStates;\npublic:\n\tLineState() {\n\t}\n\tvirtual ~LineState();\n\tvirtual void Init();\n\tvirtual void InsertLine(int line);\n\tvirtual void RemoveLine(int line);\n\n\tint SetLineState(int line, int state);\n\tint GetLineState(int line);\n\tint GetMaxLineState() const;\n};\n\nclass LineAnnotation : public PerLine {\n\tSplitVector<char *> annotations;\npublic:\n\tLineAnnotation() {\n\t}\n\tvirtual ~LineAnnotation();\n\tvirtual void Init();\n\tvirtual void InsertLine(int line);\n\tvirtual void RemoveLine(int line);\n\n\tbool MultipleStyles(int line) const;\n\tint Style(int line) const;\n\tconst char *Text(int line) const;\n\tconst unsigned char *Styles(int line) const;\n\tvoid SetText(int line, const char *text);\n\tvoid ClearAll();\n\tvoid SetStyle(int line, int style);\n\tvoid SetStyles(int line, const unsigned char *styles);\n\tint Length(int line) const;\n\tint Lines(int line) const;\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/PositionCache.cpp",
    "content": "// Scintilla source code edit control\n/** @file PositionCache.cxx\n ** Classes for caching layout information.\n **/\n// Copyright 1998-2007 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n\n#include <string>\n#include <vector>\n#include <map>\n#include <algorithm>\n\n#include \"Platform.h\"\n\n#include \"Scintilla.h\"\n\n#include \"SplitVector.h\"\n#include \"Partitioning.h\"\n#include \"RunStyles.h\"\n#include \"ContractionState.h\"\n#include \"CellBuffer.h\"\n#include \"KeyMap.h\"\n#include \"Indicator.h\"\n#include \"XPM.h\"\n#include \"LineMarker.h\"\n#include \"Style.h\"\n#include \"ViewStyle.h\"\n#include \"CharClassify.h\"\n#include \"Decoration.h\"\n#include \"ILexer.h\"\n#include \"CaseFolder.h\"\n#include \"Document.h\"\n#include \"UniConversion.h\"\n#include \"Selection.h\"\n#include \"PositionCache.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nstatic inline bool IsControlCharacter(int ch) {\n\t// iscntrl returns true for lots of chars > 127 which are displayable\n\treturn ch >= 0 && ch < ' ';\n}\n\nLineLayout::LineLayout(int maxLineLength_) :\n\tlineStarts(0),\n\tlenLineStarts(0),\n\tlineNumber(-1),\n\tinCache(false),\n\tmaxLineLength(-1),\n\tnumCharsInLine(0),\n\tnumCharsBeforeEOL(0),\n\tvalidity(llInvalid),\n\txHighlightGuide(0),\n\thighlightColumn(0),\n\tpsel(NULL),\n\tcontainsCaret(false),\n\tedgeColumn(0),\n\tchars(0),\n\tstyles(0),\n\tstyleBitsSet(0),\n\tindicators(0),\n\tpositions(0),\n\thsStart(0),\n\thsEnd(0),\n\twidthLine(wrapWidthInfinite),\n\tlines(1),\n\twrapIndent(0) {\n\tbracePreviousStyles[0] = 0;\n\tbracePreviousStyles[1] = 0;\n\tResize(maxLineLength_);\n}\n\nLineLayout::~LineLayout() {\n\tFree();\n}\n\nvoid LineLayout::Resize(int maxLineLength_) {\n\tif (maxLineLength_ > maxLineLength) {\n\t\tFree();\n\t\tchars = new char[maxLineLength_ + 1];\n\t\tstyles = new unsigned char[maxLineLength_ + 1];\n\t\tindicators = new char[maxLineLength_ + 1];\n\t\t// Extra position allocated as sometimes the Windows\n\t\t// GetTextExtentExPoint API writes an extra element.\n\t\tpositions = new XYPOSITION[maxLineLength_ + 1 + 1];\n\t\tmaxLineLength = maxLineLength_;\n\t}\n}\n\nvoid LineLayout::Free() {\n\tdelete []chars;\n\tchars = 0;\n\tdelete []styles;\n\tstyles = 0;\n\tdelete []indicators;\n\tindicators = 0;\n\tdelete []positions;\n\tpositions = 0;\n\tdelete []lineStarts;\n\tlineStarts = 0;\n}\n\nvoid LineLayout::Invalidate(validLevel validity_) {\n\tif (validity > validity_)\n\t\tvalidity = validity_;\n}\n\nint LineLayout::LineStart(int line) const {\n\tif (line <= 0) {\n\t\treturn 0;\n\t} else if ((line >= lines) || !lineStarts) {\n\t\treturn numCharsInLine;\n\t} else {\n\t\treturn lineStarts[line];\n\t}\n}\n\nint LineLayout::LineLastVisible(int line) const {\n\tif (line < 0) {\n\t\treturn 0;\n\t} else if ((line >= lines-1) || !lineStarts) {\n\t\treturn numCharsBeforeEOL;\n\t} else {\n\t\treturn lineStarts[line+1];\n\t}\n}\n\nbool LineLayout::InLine(int offset, int line) const {\n\treturn ((offset >= LineStart(line)) && (offset < LineStart(line + 1))) ||\n\t\t((offset == numCharsInLine) && (line == (lines-1)));\n}\n\nvoid LineLayout::SetLineStart(int line, int start) {\n\tif ((line >= lenLineStarts) && (line != 0)) {\n\t\tint newMaxLines = line + 20;\n\t\tint *newLineStarts = new int[newMaxLines];\n\t\tfor (int i = 0; i < newMaxLines; i++) {\n\t\t\tif (i < lenLineStarts)\n\t\t\t\tnewLineStarts[i] = lineStarts[i];\n\t\t\telse\n\t\t\t\tnewLineStarts[i] = 0;\n\t\t}\n\t\tdelete []lineStarts;\n\t\tlineStarts = newLineStarts;\n\t\tlenLineStarts = newMaxLines;\n\t}\n\tlineStarts[line] = start;\n}\n\nvoid LineLayout::SetBracesHighlight(Range rangeLine, Position braces[],\n                                    char bracesMatchStyle, int xHighlight, bool ignoreStyle) {\n\tif (!ignoreStyle && rangeLine.ContainsCharacter(braces[0])) {\n\t\tint braceOffset = braces[0] - rangeLine.start;\n\t\tif (braceOffset < numCharsInLine) {\n\t\t\tbracePreviousStyles[0] = styles[braceOffset];\n\t\t\tstyles[braceOffset] = bracesMatchStyle;\n\t\t}\n\t}\n\tif (!ignoreStyle && rangeLine.ContainsCharacter(braces[1])) {\n\t\tint braceOffset = braces[1] - rangeLine.start;\n\t\tif (braceOffset < numCharsInLine) {\n\t\t\tbracePreviousStyles[1] = styles[braceOffset];\n\t\t\tstyles[braceOffset] = bracesMatchStyle;\n\t\t}\n\t}\n\tif ((braces[0] >= rangeLine.start && braces[1] <= rangeLine.end) ||\n\t        (braces[1] >= rangeLine.start && braces[0] <= rangeLine.end)) {\n\t\txHighlightGuide = xHighlight;\n\t}\n}\n\nvoid LineLayout::RestoreBracesHighlight(Range rangeLine, Position braces[], bool ignoreStyle) {\n\tif (!ignoreStyle && rangeLine.ContainsCharacter(braces[0])) {\n\t\tint braceOffset = braces[0] - rangeLine.start;\n\t\tif (braceOffset < numCharsInLine) {\n\t\t\tstyles[braceOffset] = bracePreviousStyles[0];\n\t\t}\n\t}\n\tif (!ignoreStyle && rangeLine.ContainsCharacter(braces[1])) {\n\t\tint braceOffset = braces[1] - rangeLine.start;\n\t\tif (braceOffset < numCharsInLine) {\n\t\t\tstyles[braceOffset] = bracePreviousStyles[1];\n\t\t}\n\t}\n\txHighlightGuide = 0;\n}\n\nint LineLayout::FindBefore(XYPOSITION x, int lower, int upper) const {\n\tdo {\n\t\tint middle = (upper + lower + 1) / 2; \t// Round high\n\t\tXYPOSITION posMiddle = positions[middle];\n\t\tif (x < posMiddle) {\n\t\t\tupper = middle - 1;\n\t\t} else {\n\t\t\tlower = middle;\n\t\t}\n\t} while (lower < upper);\n\treturn lower;\n}\n\nint LineLayout::EndLineStyle() const {\n\treturn styles[numCharsBeforeEOL > 0 ? numCharsBeforeEOL-1 : 0];\n}\n\nLineLayoutCache::LineLayoutCache() :\n\tlevel(0),\n\tallInvalidated(false), styleClock(-1), useCount(0) {\n\tAllocate(0);\n}\n\nLineLayoutCache::~LineLayoutCache() {\n\tDeallocate();\n}\n\nvoid LineLayoutCache::Allocate(size_t length_) {\n\tPLATFORM_ASSERT(cache.empty());\n\tallInvalidated = false;\n\tcache.resize(length_);\n}\n\nvoid LineLayoutCache::AllocateForLevel(int linesOnScreen, int linesInDoc) {\n\tPLATFORM_ASSERT(useCount == 0);\n\tsize_t lengthForLevel = 0;\n\tif (level == llcCaret) {\n\t\tlengthForLevel = 1;\n\t} else if (level == llcPage) {\n\t\tlengthForLevel = linesOnScreen + 1;\n\t} else if (level == llcDocument) {\n\t\tlengthForLevel = linesInDoc;\n\t}\n\tif (lengthForLevel > cache.size()) {\n\t\tDeallocate();\n\t\tAllocate(lengthForLevel);\n\t} else {\n\t\tif (lengthForLevel < cache.size()) {\n\t\t\tfor (size_t i = lengthForLevel; i < cache.size(); i++) {\n\t\t\t\tdelete cache[i];\n\t\t\t\tcache[i] = 0;\n\t\t\t}\n\t\t}\n\t\tcache.resize(lengthForLevel);\n\t}\n\tPLATFORM_ASSERT(cache.size() == lengthForLevel);\n}\n\nvoid LineLayoutCache::Deallocate() {\n\tPLATFORM_ASSERT(useCount == 0);\n\tfor (size_t i = 0; i < cache.size(); i++)\n\t\tdelete cache[i];\n\tcache.clear();\n}\n\nvoid LineLayoutCache::Invalidate(LineLayout::validLevel validity_) {\n\tif (!cache.empty() && !allInvalidated) {\n\t\tfor (size_t i = 0; i < cache.size(); i++) {\n\t\t\tif (cache[i]) {\n\t\t\t\tcache[i]->Invalidate(validity_);\n\t\t\t}\n\t\t}\n\t\tif (validity_ == LineLayout::llInvalid) {\n\t\t\tallInvalidated = true;\n\t\t}\n\t}\n}\n\nvoid LineLayoutCache::SetLevel(int level_) {\n\tallInvalidated = false;\n\tif ((level_ != -1) && (level != level_)) {\n\t\tlevel = level_;\n\t\tDeallocate();\n\t}\n}\n\nLineLayout *LineLayoutCache::Retrieve(int lineNumber, int lineCaret, int maxChars, int styleClock_,\n                                      int linesOnScreen, int linesInDoc) {\n\tAllocateForLevel(linesOnScreen, linesInDoc);\n\tif (styleClock != styleClock_) {\n\t\tInvalidate(LineLayout::llCheckTextAndStyle);\n\t\tstyleClock = styleClock_;\n\t}\n\tallInvalidated = false;\n\tint pos = -1;\n\tLineLayout *ret = 0;\n\tif (level == llcCaret) {\n\t\tpos = 0;\n\t} else if (level == llcPage) {\n\t\tif (lineNumber == lineCaret) {\n\t\t\tpos = 0;\n\t\t} else if (cache.size() > 1) {\n\t\t\tpos = 1 + (lineNumber % (cache.size() - 1));\n\t\t}\n\t} else if (level == llcDocument) {\n\t\tpos = lineNumber;\n\t}\n\tif (pos >= 0) {\n\t\tPLATFORM_ASSERT(useCount == 0);\n\t\tif (!cache.empty() && (pos < static_cast<int>(cache.size()))) {\n\t\t\tif (cache[pos]) {\n\t\t\t\tif ((cache[pos]->lineNumber != lineNumber) ||\n\t\t\t\t        (cache[pos]->maxLineLength < maxChars)) {\n\t\t\t\t\tdelete cache[pos];\n\t\t\t\t\tcache[pos] = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!cache[pos]) {\n\t\t\t\tcache[pos] = new LineLayout(maxChars);\n\t\t\t}\n\t\t\tcache[pos]->lineNumber = lineNumber;\n\t\t\tcache[pos]->inCache = true;\n\t\t\tret = cache[pos];\n\t\t\tuseCount++;\n\t\t}\n\t}\n\n\tif (!ret) {\n\t\tret = new LineLayout(maxChars);\n\t\tret->lineNumber = lineNumber;\n\t}\n\n\treturn ret;\n}\n\nvoid LineLayoutCache::Dispose(LineLayout *ll) {\n\tallInvalidated = false;\n\tif (ll) {\n\t\tif (!ll->inCache) {\n\t\t\tdelete ll;\n\t\t} else {\n\t\t\tuseCount--;\n\t\t}\n\t}\n}\n\n// Simply pack the (maximum 4) character bytes into an int\nstatic inline int KeyFromString(const char *charBytes, size_t len) {\n\tPLATFORM_ASSERT(len <= 4);\n\tint k=0;\n\tfor (size_t i=0; i<len && charBytes[i]; i++) {\n\t\tk = k * 0x100;\n\t\tk += static_cast<unsigned char>(charBytes[i]);\n\t}\n\treturn k;\n}\n\nSpecialRepresentations::SpecialRepresentations() {\n\tstd::fill(startByteHasReprs, startByteHasReprs+0x100, 0);\n}\n\nvoid SpecialRepresentations::SetRepresentation(const char *charBytes, const char *value) {\n\tMapRepresentation::iterator it = mapReprs.find(KeyFromString(charBytes, UTF8MaxBytes));\n\tif (it == mapReprs.end()) {\n\t\t// New entry so increment for first byte\n\t\tstartByteHasReprs[static_cast<unsigned char>(charBytes[0])]++;\n\t}\n\tmapReprs[KeyFromString(charBytes, UTF8MaxBytes)] = value;\n}\n\nvoid SpecialRepresentations::ClearRepresentation(const char *charBytes) {\n\tMapRepresentation::iterator it = mapReprs.find(KeyFromString(charBytes, UTF8MaxBytes));\n\tif (it != mapReprs.end()) {\n\t\tmapReprs.erase(it);\n\t\tstartByteHasReprs[static_cast<unsigned char>(charBytes[0])]--;\n\t}\n}\n\nRepresentation *SpecialRepresentations::RepresentationFromCharacter(const char *charBytes, size_t len) {\n\tPLATFORM_ASSERT(len <= 4);\n\tif (!startByteHasReprs[static_cast<unsigned char>(charBytes[0])])\n\t\treturn 0;\n\tMapRepresentation::iterator it = mapReprs.find(KeyFromString(charBytes, len));\n\tif (it != mapReprs.end()) {\n\t\treturn &(it->second);\n\t}\n\treturn 0;\n}\n\nbool SpecialRepresentations::Contains(const char *charBytes, size_t len) const {\n\tPLATFORM_ASSERT(len <= 4);\n\tif (!startByteHasReprs[static_cast<unsigned char>(charBytes[0])])\n\t\treturn false;\n\tMapRepresentation::const_iterator it = mapReprs.find(KeyFromString(charBytes, len));\n\treturn it != mapReprs.end();\n}\n\nvoid SpecialRepresentations::Clear() {\n\tmapReprs.clear();\n\tstd::fill(startByteHasReprs, startByteHasReprs+0x100, 0);\n}\n\nvoid BreakFinder::Insert(int val) {\n\tif (val > nextBreak) {\n\t\tconst std::vector<int>::iterator it = std::lower_bound(selAndEdge.begin(), selAndEdge.end(), val);\n\t\tif (it == selAndEdge.end()) {\n\t\t\tselAndEdge.push_back(val);\n\t\t} else if (*it != val) {\n\t\t\tselAndEdge.insert(it, 1, val);\n\t\t}\n\t}\n}\n\nBreakFinder::BreakFinder(LineLayout *ll_, int lineStart_, int lineEnd_, int posLineStart_,\n\tint xStart, bool breakForSelection, Document *pdoc_, SpecialRepresentations *preprs_) :\n\tll(ll_),\n\tlineStart(lineStart_),\n\tlineEnd(lineEnd_),\n\tposLineStart(posLineStart_),\n\tnextBreak(lineStart_),\n\tsaeCurrentPos(0),\n\tsaeNext(0),\n\tsubBreak(-1),\n\tpdoc(pdoc_),\n\tencodingFamily(pdoc_->CodePageFamily()),\n\tpreprs(preprs_) {\n\n\t// Search for first visible break\n\t// First find the first visible character\n\tif (xStart > 0.0f)\n\t\tnextBreak = ll->FindBefore(xStart, lineStart, lineEnd);\n\t// Now back to a style break\n\twhile ((nextBreak > lineStart) && (ll->styles[nextBreak] == ll->styles[nextBreak - 1])) {\n\t\tnextBreak--;\n\t}\n\n\tif (breakForSelection) {\n\t\tSelectionPosition posStart(posLineStart);\n\t\tSelectionPosition posEnd(posLineStart + lineEnd);\n\t\tSelectionSegment segmentLine(posStart, posEnd);\n\t\tfor (size_t r=0; r<ll->psel->Count(); r++) {\n\t\t\tSelectionSegment portion = ll->psel->Range(r).Intersect(segmentLine);\n\t\t\tif (!(portion.start == portion.end)) {\n\t\t\t\tif (portion.start.IsValid())\n\t\t\t\t\tInsert(portion.start.Position() - posLineStart);\n\t\t\t\tif (portion.end.IsValid())\n\t\t\t\t\tInsert(portion.end.Position() - posLineStart);\n\t\t\t}\n\t\t}\n\t}\n\n\tInsert(ll->edgeColumn);\n\tInsert(lineEnd);\n\tsaeNext = (!selAndEdge.empty()) ? selAndEdge[0] : -1;\n}\n\nBreakFinder::~BreakFinder() {\n}\n\nTextSegment BreakFinder::Next() {\n\tif (subBreak == -1) {\n\t\tint prev = nextBreak;\n \t\twhile (nextBreak < lineEnd) {\n\t\t\tint charWidth = 1;\n\t\t\tif (encodingFamily == efUnicode)\n\t\t\t\tcharWidth = UTF8DrawBytes(reinterpret_cast<unsigned char *>(ll->chars) + nextBreak, lineEnd - nextBreak);\n\t\t\telse if (encodingFamily == efDBCS)\n\t\t\t\tcharWidth = pdoc->IsDBCSLeadByte(ll->chars[nextBreak]) ? 2 : 1;\n\t\t\tRepresentation *repr = preprs->RepresentationFromCharacter(ll->chars + nextBreak, charWidth);\n\t\t\tif (((nextBreak > 0) && (ll->styles[nextBreak] != ll->styles[nextBreak - 1])) ||\n\t\t\t\t\trepr ||\n\t\t\t\t\t(nextBreak == saeNext)) {\n\t\t\t\twhile ((nextBreak >= saeNext) && (saeNext < lineEnd)) {\n\t\t\t\t\tsaeCurrentPos++;\n\t\t\t\t\tsaeNext = (saeCurrentPos < selAndEdge.size()) ? selAndEdge[saeCurrentPos] : lineEnd;\n\t\t\t\t}\n\t\t\t\tif ((nextBreak > prev) || repr) {\n\t\t\t\t\t// Have a segment to report\n\t\t\t\t\tif (nextBreak == prev) {\n\t\t\t\t\t\tnextBreak += charWidth;\n\t\t\t\t\t} else {\n\t\t\t\t\t\trepr = 0;\t// Optimize -> should remember repr\n\t\t\t\t\t}\n\t\t\t\t\tif ((nextBreak - prev) < lengthStartSubdivision) {\n\t\t\t\t\t\treturn TextSegment(prev, nextBreak - prev, repr);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tnextBreak += charWidth;\n\t\t}\n\t\tif ((nextBreak - prev) < lengthStartSubdivision) {\n\t\t\treturn TextSegment(prev, nextBreak - prev);\n\t\t}\n\t\tsubBreak = prev;\n\t}\n\t// Splitting up a long run from prev to nextBreak in lots of approximately lengthEachSubdivision.\n\t// For very long runs add extra breaks after spaces or if no spaces before low punctuation.\n\tint startSegment = subBreak;\n\tif ((nextBreak - subBreak) <= lengthEachSubdivision) {\n\t\tsubBreak = -1;\n\t\treturn TextSegment(startSegment, nextBreak - startSegment);\n\t} else {\n\t\tsubBreak += pdoc->SafeSegment(ll->chars + subBreak, nextBreak-subBreak, lengthEachSubdivision);\n\t\tif (subBreak >= nextBreak) {\n\t\t\tsubBreak = -1;\n\t\t\treturn TextSegment(startSegment, nextBreak - startSegment);\n\t\t} else {\n\t\t\treturn TextSegment(startSegment, subBreak - startSegment);\n\t\t}\n\t}\n}\n\nbool BreakFinder::More() const {\n\treturn (subBreak >= 0) || (nextBreak < lineEnd);\n}\n\nPositionCacheEntry::PositionCacheEntry() :\n\tstyleNumber(0), len(0), clock(0), positions(0) {\n}\n\nvoid PositionCacheEntry::Set(unsigned int styleNumber_, const char *s_,\n\tunsigned int len_, XYPOSITION *positions_, unsigned int clock_) {\n\tClear();\n\tstyleNumber = styleNumber_;\n\tlen = len_;\n\tclock = clock_;\n\tif (s_ && positions_) {\n\t\tpositions = new XYPOSITION[len + (len / 4) + 1];\n\t\tfor (unsigned int i=0; i<len; i++) {\n\t\t\tpositions[i] = static_cast<XYPOSITION>(positions_[i]);\n\t\t}\n\t\tmemcpy(reinterpret_cast<char *>(positions + len), s_, len);\n\t}\n}\n\nPositionCacheEntry::~PositionCacheEntry() {\n\tClear();\n}\n\nvoid PositionCacheEntry::Clear() {\n\tdelete []positions;\n\tpositions = 0;\n\tstyleNumber = 0;\n\tlen = 0;\n\tclock = 0;\n}\n\nbool PositionCacheEntry::Retrieve(unsigned int styleNumber_, const char *s_,\n\tunsigned int len_, XYPOSITION *positions_) const {\n\tif ((styleNumber == styleNumber_) && (len == len_) &&\n\t\t(memcmp(reinterpret_cast<char *>(positions + len), s_, len)== 0)) {\n\t\tfor (unsigned int i=0; i<len; i++) {\n\t\t\tpositions_[i] = positions[i];\n\t\t}\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n}\n\nint PositionCacheEntry::Hash(unsigned int styleNumber_, const char *s, unsigned int len_) {\n\tunsigned int ret = s[0] << 7;\n\tfor (unsigned int i=0; i<len_; i++) {\n\t\tret *= 1000003;\n\t\tret ^= s[i];\n\t}\n\tret *= 1000003;\n\tret ^= len_;\n\tret *= 1000003;\n\tret ^= styleNumber_;\n\treturn ret;\n}\n\nbool PositionCacheEntry::NewerThan(const PositionCacheEntry &other) const {\n\treturn clock > other.clock;\n}\n\nvoid PositionCacheEntry::ResetClock() {\n\tif (clock > 0) {\n\t\tclock = 1;\n\t}\n}\n\nPositionCache::PositionCache() {\n\tclock = 1;\n\tpces.resize(0x400);\n\tallClear = true;\n}\n\nPositionCache::~PositionCache() {\n\tClear();\n}\n\nvoid PositionCache::Clear() {\n\tif (!allClear) {\n\t\tfor (size_t i=0; i<pces.size(); i++) {\n\t\t\tpces[i].Clear();\n\t\t}\n\t}\n\tclock = 1;\n\tallClear = true;\n}\n\nvoid PositionCache::SetSize(size_t size_) {\n\tClear();\n\tpces.resize(size_);\n}\n\nvoid PositionCache::MeasureWidths(Surface *surface, ViewStyle &vstyle, unsigned int styleNumber,\n\tconst char *s, unsigned int len, XYPOSITION *positions, Document *pdoc) {\n\n\tallClear = false;\n\tint probe = -1;\n\tif ((!pces.empty()) && (len < 30)) {\n\t\t// Only store short strings in the cache so it doesn't churn with\n\t\t// long comments with only a single comment.\n\n\t\t// Two way associative: try two probe positions.\n\t\tint hashValue = PositionCacheEntry::Hash(styleNumber, s, len);\n\t\tprobe = static_cast<int>(hashValue % pces.size());\n\t\tif (pces[probe].Retrieve(styleNumber, s, len, positions)) {\n\t\t\treturn;\n\t\t}\n\t\tint probe2 = static_cast<int>((hashValue * 37) % pces.size());\n\t\tif (pces[probe2].Retrieve(styleNumber, s, len, positions)) {\n\t\t\treturn;\n\t\t}\n\t\t// Not found. Choose the oldest of the two slots to replace\n\t\tif (pces[probe].NewerThan(pces[probe2])) {\n\t\t\tprobe = probe2;\n\t\t}\n\t}\n\tif (len > BreakFinder::lengthStartSubdivision) {\n\t\t// Break up into segments\n\t\tunsigned int startSegment = 0;\n\t\tXYPOSITION xStartSegment = 0;\n\t\twhile (startSegment < len) {\n\t\t\tunsigned int lenSegment = pdoc->SafeSegment(s + startSegment, len - startSegment, BreakFinder::lengthEachSubdivision);\n\t\t\tsurface->MeasureWidths(vstyle.styles[styleNumber].font, s + startSegment, lenSegment, positions + startSegment);\n\t\t\tfor (unsigned int inSeg = 0; inSeg < lenSegment; inSeg++) {\n\t\t\t\tpositions[startSegment + inSeg] += xStartSegment;\n\t\t\t}\n\t\t\txStartSegment = positions[startSegment + lenSegment - 1];\n\t\t\tstartSegment += lenSegment;\n\t\t}\n\t} else {\n\t\tsurface->MeasureWidths(vstyle.styles[styleNumber].font, s, len, positions);\n\t}\n\tif (probe >= 0) {\n\t\tclock++;\n\t\tif (clock > 60000) {\n\t\t\t// Since there are only 16 bits for the clock, wrap it round and\n\t\t\t// reset all cache entries so none get stuck with a high clock.\n\t\t\tfor (size_t i=0; i<pces.size(); i++) {\n\t\t\t\tpces[i].ResetClock();\n\t\t\t}\n\t\t\tclock = 2;\n\t\t}\n\t\tpces[probe].Set(styleNumber, s, len, positions, clock);\n\t}\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/PositionCache.h",
    "content": "// Scintilla source code edit control\n/** @file PositionCache.h\n ** Classes for caching layout information.\n **/\n// Copyright 1998-2009 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef POSITIONCACHE_H\n#define POSITIONCACHE_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nstatic inline bool IsEOLChar(char ch) {\n\treturn (ch == '\\r') || (ch == '\\n');\n}\n\n/**\n */\nclass LineLayout {\nprivate:\n\tfriend class LineLayoutCache;\n\tint *lineStarts;\n\tint lenLineStarts;\n\t/// Drawing is only performed for @a maxLineLength characters on each line.\n\tint lineNumber;\n\tbool inCache;\npublic:\n\tenum { wrapWidthInfinite = 0x7ffffff };\n\tint maxLineLength;\n\tint numCharsInLine;\n\tint numCharsBeforeEOL;\n\tenum validLevel { llInvalid, llCheckTextAndStyle, llPositions, llLines } validity;\n\tint xHighlightGuide;\n\tbool highlightColumn;\n\tSelection *psel;\n\tbool containsCaret;\n\tint edgeColumn;\n\tchar *chars;\n\tunsigned char *styles;\n\tint styleBitsSet;\n\tchar *indicators;\n\tXYPOSITION *positions;\n\tchar bracePreviousStyles[2];\n\n\t// Hotspot support\n\tint hsStart;\n\tint hsEnd;\n\n\t// Wrapped line support\n\tint widthLine;\n\tint lines;\n\tXYPOSITION wrapIndent; // In pixels\n\n\tLineLayout(int maxLineLength_);\n\tvirtual ~LineLayout();\n\tvoid Resize(int maxLineLength_);\n\tvoid Free();\n\tvoid Invalidate(validLevel validity_);\n\tint LineStart(int line) const;\n\tint LineLastVisible(int line) const;\n\tbool InLine(int offset, int line) const;\n\tvoid SetLineStart(int line, int start);\n\tvoid SetBracesHighlight(Range rangeLine, Position braces[],\n\t\tchar bracesMatchStyle, int xHighlight, bool ignoreStyle);\n\tvoid RestoreBracesHighlight(Range rangeLine, Position braces[], bool ignoreStyle);\n\tint FindBefore(XYPOSITION x, int lower, int upper) const;\n\tint EndLineStyle() const;\n};\n\n/**\n */\nclass LineLayoutCache {\n\tint level;\n\tstd::vector<LineLayout *>cache;\n\tbool allInvalidated;\n\tint styleClock;\n\tint useCount;\n\tvoid Allocate(size_t length_);\n\tvoid AllocateForLevel(int linesOnScreen, int linesInDoc);\npublic:\n\tLineLayoutCache();\n\tvirtual ~LineLayoutCache();\n\tvoid Deallocate();\n\tenum {\n\t\tllcNone=SC_CACHE_NONE,\n\t\tllcCaret=SC_CACHE_CARET,\n\t\tllcPage=SC_CACHE_PAGE,\n\t\tllcDocument=SC_CACHE_DOCUMENT\n\t};\n\tvoid Invalidate(LineLayout::validLevel validity_);\n\tvoid SetLevel(int level_);\n\tint GetLevel() const { return level; }\n\tLineLayout *Retrieve(int lineNumber, int lineCaret, int maxChars, int styleClock_,\n\t\tint linesOnScreen, int linesInDoc);\n\tvoid Dispose(LineLayout *ll);\n};\n\nclass PositionCacheEntry {\n\tunsigned int styleNumber:8;\n\tunsigned int len:8;\n\tunsigned int clock:16;\n\tXYPOSITION *positions;\npublic:\n\tPositionCacheEntry();\n\t~PositionCacheEntry();\n\tvoid Set(unsigned int styleNumber_, const char *s_, unsigned int len_, XYPOSITION *positions_, unsigned int clock);\n\tvoid Clear();\n\tbool Retrieve(unsigned int styleNumber_, const char *s_, unsigned int len_, XYPOSITION *positions_) const;\n\tstatic int Hash(unsigned int styleNumber_, const char *s, unsigned int len);\n\tbool NewerThan(const PositionCacheEntry &other) const;\n\tvoid ResetClock();\n};\n\nclass Representation {\npublic:\n\tstd::string stringRep;\n\tRepresentation(const char *value=\"\") : stringRep(value) {\n\t}\n};\n\ntypedef std::map<int, Representation> MapRepresentation;\n\nclass SpecialRepresentations {\n\tMapRepresentation mapReprs;\n\tshort startByteHasReprs[0x100];\npublic:\n\tSpecialRepresentations();\n\tvoid SetRepresentation(const char *charBytes, const char *value);\n\tvoid ClearRepresentation(const char *charBytes);\n\tRepresentation *RepresentationFromCharacter(const char *charBytes, size_t len);\n\tbool Contains(const char *charBytes, size_t len) const;\n\tvoid Clear();\n};\n\nstruct TextSegment {\n\tint start;\n\tint length;\n\tRepresentation *representation;\n\tTextSegment(int start_=0, int length_=0, Representation *representation_=0) :\n\t\tstart(start_), length(length_), representation(representation_) {\n\t}\n\tint end() const {\n\t\treturn start + length;\n\t}\n};\n\n// Class to break a line of text into shorter runs at sensible places.\nclass BreakFinder {\n\tLineLayout *ll;\n\tint lineStart;\n\tint lineEnd;\n\tint posLineStart;\n\tint nextBreak;\n\tstd::vector<int> selAndEdge;\n\tunsigned int saeCurrentPos;\n\tint saeNext;\n\tint subBreak;\n\tDocument *pdoc;\n\tEncodingFamily encodingFamily;\n\tSpecialRepresentations *preprs;\n\tvoid Insert(int val);\n\t// Private so BreakFinder objects can not be copied\n\tBreakFinder(const BreakFinder &);\npublic:\n\t// If a whole run is longer than lengthStartSubdivision then subdivide\n\t// into smaller runs at spaces or punctuation.\n\tenum { lengthStartSubdivision = 300 };\n\t// Try to make each subdivided run lengthEachSubdivision or shorter.\n\tenum { lengthEachSubdivision = 100 };\n\tBreakFinder(LineLayout *ll_, int lineStart_, int lineEnd_, int posLineStart_,\n\t\tint xStart, bool breakForSelection, Document *pdoc_, SpecialRepresentations *preprs_);\n\t~BreakFinder();\n\tTextSegment Next();\n\tbool More() const;\n};\n\nclass PositionCache {\n\tstd::vector<PositionCacheEntry> pces;\n\tunsigned int clock;\n\tbool allClear;\n\t// Private so PositionCache objects can not be copied\n\tPositionCache(const PositionCache &);\npublic:\n\tPositionCache();\n\t~PositionCache();\n\tvoid Clear();\n\tvoid SetSize(size_t size_);\n\tsize_t GetSize() const { return pces.size(); }\n\tvoid MeasureWidths(Surface *surface, ViewStyle &vstyle, unsigned int styleNumber,\n\t\tconst char *s, unsigned int len, XYPOSITION *positions, Document *pdoc);\n};\n\ninline bool IsSpaceOrTab(int ch) {\n\treturn ch == ' ' || ch == '\\t';\n}\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/RESearch.cpp",
    "content": "// Scintilla source code edit control\n/** @file RESearch.cxx\n ** Regular expression search library.\n **/\n\n/*\n * regex - Regular expression pattern matching and replacement\n *\n * By:  Ozan S. Yigit (oz)\n *      Dept. of Computer Science\n *      York University\n *\n * Original code available from http://www.cs.yorku.ca/~oz/\n * Translation to C++ by Neil Hodgson neilh@scintilla.org\n * Removed all use of register.\n * Converted to modern function prototypes.\n * Put all global/static variables into an object so this code can be\n * used from multiple threads, etc.\n * Some extensions by Philippe Lhoste PhiLho(a)GMX.net\n * '?' extensions by Michael Mullin masmullin@gmail.com\n *\n * These routines are the PUBLIC DOMAIN equivalents of regex\n * routines as found in 4.nBSD UN*X, with minor extensions.\n *\n * These routines are derived from various implementations found\n * in software tools books, and Conroy's grep. They are NOT derived\n * from licensed/restricted software.\n * For more interesting/academic/complicated implementations,\n * see Henry Spencer's regexp routines, or GNU Emacs pattern\n * matching module.\n *\n * Modification history removed.\n *\n * Interfaces:\n *  RESearch::Compile:      compile a regular expression into a NFA.\n *\n *          const char *RESearch::Compile(const char *pattern, int length,\n *                                        bool caseSensitive, bool posix)\n *\n * Returns a short error string if they fail.\n *\n *  RESearch::Execute:      execute the NFA to match a pattern.\n *\n *          int RESearch::Execute(characterIndexer &ci, int lp, int endp)\n *\n *  re_fail:                failure routine for RESearch::Execute. (no longer used)\n *\n *          void re_fail(char *msg, char op)\n *\n * Regular Expressions:\n *\n *      [1]     char    matches itself, unless it is a special\n *                      character (metachar): . \\ [ ] * + ? ^ $\n *                      and ( ) if posix option.\n *\n *      [2]     .       matches any character.\n *\n *      [3]     \\       matches the character following it, except:\n *                      - \\a, \\b, \\f, \\n, \\r, \\t, \\v match the corresponding C\n *                      escape char, respectively BEL, BS, FF, LF, CR, TAB and VT;\n *                      Note that \\r and \\n are never matched because Scintilla\n *                      regex searches are made line per line\n *                      (stripped of end-of-line chars).\n *                      - if not in posix mode, when followed by a\n *                      left or right round bracket (see [8]);\n *                      - when followed by a digit 1 to 9 (see [9]);\n *                      - when followed by a left or right angle bracket\n *                      (see [10]);\n *                      - when followed by d, D, s, S, w or W (see [11]);\n *                      - when followed by x and two hexa digits (see [12].\n *                      Backslash is used as an escape character for all\n *                      other meta-characters, and itself.\n *\n *      [4]     [set]   matches one of the characters in the set.\n *                      If the first character in the set is \"^\",\n *                      it matches the characters NOT in the set, i.e.\n *                      complements the set. A shorthand S-E (start dash end)\n *                      is used to specify a set of characters S up to\n *                      E, inclusive. S and E must be characters, otherwise\n *                      the dash is taken literally (eg. in expression [\\d-a]).\n *                      The special characters \"]\" and \"-\" have no special\n *                      meaning if they appear as the first chars in the set.\n *                      To include both, put - first: [-]A-Z]\n *                      (or just backslash them).\n *                      examples:        match:\n *\n *                              [-]|]    matches these 3 chars,\n *\n *                              []-|]    matches from ] to | chars\n *\n *                              [a-z]    any lowercase alpha\n *\n *                              [^-]]    any char except - and ]\n *\n *                              [^A-Z]   any char except uppercase\n *                                       alpha\n *\n *                              [a-zA-Z] any alpha\n *\n *      [5]     *       any regular expression form [1] to [4]\n *                      (except [8], [9] and [10] forms of [3]),\n *                      followed by closure char (*)\n *                      matches zero or more matches of that form.\n *\n *      [6]     +       same as [5], except it matches one or more.\n *\n *      [5-6]           Both [5] and [6] are greedy (they match as much as possible).\n *                      Unless they are followed by the 'lazy' quantifier (?)\n *                      In which case both [5] and [6] try to match as little as possible\n *\n *      [7]     ?       same as [5] except it matches zero or one.\n *\n *      [8]             a regular expression in the form [1] to [13], enclosed\n *                      as \\(form\\) (or (form) with posix flag) matches what\n *                      form matches. The enclosure creates a set of tags,\n *                      used for [9] and for pattern substitution.\n *                      The tagged forms are numbered starting from 1.\n *\n *      [9]             a \\ followed by a digit 1 to 9 matches whatever a\n *                      previously tagged regular expression ([8]) matched.\n *\n *      [10]    \\<      a regular expression starting with a \\< construct\n *              \\>      and/or ending with a \\> construct, restricts the\n *                      pattern matching to the beginning of a word, and/or\n *                      the end of a word. A word is defined to be a character\n *                      string beginning and/or ending with the characters\n *                      A-Z a-z 0-9 and _. Scintilla extends this definition\n *                      by user setting. The word must also be preceded and/or\n *                      followed by any character outside those mentioned.\n *\n *      [11]    \\l      a backslash followed by d, D, s, S, w or W,\n *                      becomes a character class (both inside and\n *                      outside sets []).\n *                        d: decimal digits\n *                        D: any char except decimal digits\n *                        s: whitespace (space, \\t \\n \\r \\f \\v)\n *                        S: any char except whitespace (see above)\n *                        w: alphanumeric & underscore (changed by user setting)\n *                        W: any char except alphanumeric & underscore (see above)\n *\n *      [12]    \\xHH    a backslash followed by x and two hexa digits,\n *                      becomes the character whose Ascii code is equal\n *                      to these digits. If not followed by two digits,\n *                      it is 'x' char itself.\n *\n *      [13]            a composite regular expression xy where x and y\n *                      are in the form [1] to [12] matches the longest\n *                      match of x followed by a match for y.\n *\n *      [14]    ^       a regular expression starting with a ^ character\n *              $       and/or ending with a $ character, restricts the\n *                      pattern matching to the beginning of the line,\n *                      or the end of line. [anchors] Elsewhere in the\n *                      pattern, ^ and $ are treated as ordinary characters.\n *\n *\n * Acknowledgements:\n *\n *  HCR's Hugh Redelmeier has been most helpful in various\n *  stages of development. He convinced me to include BOW\n *  and EOW constructs, originally invented by Rob Pike at\n *  the University of Toronto.\n *\n * References:\n *              Software tools                  Kernighan & Plauger\n *              Software tools in Pascal        Kernighan & Plauger\n *              Grep [rsx-11 C dist]            David Conroy\n *              ed - text editor                Un*x Programmer's Manual\n *              Advanced editing on Un*x        B. W. Kernighan\n *              RegExp routines                 Henry Spencer\n *\n * Notes:\n *\n *  This implementation uses a bit-set representation for character\n *  classes for speed and compactness. Each character is represented\n *  by one bit in a 256-bit block. Thus, CCL always takes a\n *\tconstant 32 bytes in the internal nfa, and RESearch::Execute does a single\n *  bit comparison to locate the character in the set.\n *\n * Examples:\n *\n *  pattern:    foo*.*\n *  compile:    CHR f CHR o CLO CHR o END CLO ANY END END\n *  matches:    fo foo fooo foobar fobar foxx ...\n *\n *  pattern:    fo[ob]a[rz]\n *  compile:    CHR f CHR o CCL bitset CHR a CCL bitset END\n *  matches:    fobar fooar fobaz fooaz\n *\n *  pattern:    foo\\\\+\n *  compile:    CHR f CHR o CHR o CHR \\ CLO CHR \\ END END\n *  matches:    foo\\ foo\\\\ foo\\\\\\  ...\n *\n *  pattern:    \\(foo\\)[1-3]\\1  (same as foo[1-3]foo)\n *  compile:    BOT 1 CHR f CHR o CHR o EOT 1 CCL bitset REF 1 END\n *  matches:    foo1foo foo2foo foo3foo\n *\n *  pattern:    \\(fo.*\\)-\\1\n *  compile:    BOT 1 CHR f CHR o CLO ANY END EOT 1 CHR - REF 1 END\n *  matches:    foo-foo fo-fo fob-fob foobar-foobar ...\n */\n\n#include <stdlib.h>\n\n#include <string>\n\n#include \"CharClassify.h\"\n#include \"RESearch.h\"\n\n// Shut up annoying Visual C++ warnings:\n#ifdef _MSC_VER\n#pragma warning(disable: 4514)\n#endif\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n#define OKP     1\n#define NOP     0\n\n#define CHR     1\n#define ANY     2\n#define CCL     3\n#define BOL     4\n#define EOL     5\n#define BOT     6\n#define EOT     7\n#define BOW     8\n#define EOW     9\n#define REF     10\n#define CLO     11\n#define CLQ     12 /* 0 to 1 closure */\n#define LCLO    13 /* lazy closure */\n\n#define END     0\n\n/*\n * The following defines are not meant to be changeable.\n * They are for readability only.\n */\n#define BLKIND  0370\n#define BITIND  07\n\nconst char bitarr[] = { 1, 2, 4, 8, 16, 32, 64, '\\200' };\n\n#define badpat(x)\t(*nfa = END, x)\n\n/*\n * Character classification table for word boundary operators BOW\n * and EOW is passed in by the creator of this object (Scintilla\n * Document). The Document default state is that word chars are:\n * 0-9, a-z, A-Z and _\n */\n\nRESearch::RESearch(CharClassify *charClassTable) {\n\tfailure = 0;\n\tcharClass = charClassTable;\n\tInit();\n}\n\nRESearch::~RESearch() {\n\tClear();\n}\n\nvoid RESearch::Init() {\n\tsta = NOP;                  /* status of lastpat */\n\tbol = 0;\n\tfor (int i = 0; i < MAXTAG; i++)\n\t\tpat[i].clear();\n\tfor (int j = 0; j < BITBLK; j++)\n\t\tbittab[j] = 0;\n}\n\nvoid RESearch::Clear() {\n\tfor (int i = 0; i < MAXTAG; i++) {\n\t\tpat[i].clear();\n\t\tbopat[i] = NOTFOUND;\n\t\teopat[i] = NOTFOUND;\n\t}\n}\n\nvoid RESearch::GrabMatches(CharacterIndexer &ci) {\n\tfor (unsigned int i = 0; i < MAXTAG; i++) {\n\t\tif ((bopat[i] != NOTFOUND) && (eopat[i] != NOTFOUND)) {\n\t\t\tunsigned int len = eopat[i] - bopat[i];\n\t\t\tpat[i] = std::string(len+1, '\\0');\n\t\t\tfor (unsigned int j = 0; j < len; j++)\n\t\t\t\tpat[i][j] = ci.CharAt(bopat[i] + j);\n\t\t\tpat[i][len] = '\\0';\n\t\t}\n\t}\n}\n\nvoid RESearch::ChSet(unsigned char c) {\n\tbittab[((c) & BLKIND) >> 3] |= bitarr[(c) & BITIND];\n}\n\nvoid RESearch::ChSetWithCase(unsigned char c, bool caseSensitive) {\n\tif (caseSensitive) {\n\t\tChSet(c);\n\t} else {\n\t\tif ((c >= 'a') && (c <= 'z')) {\n\t\t\tChSet(c);\n\t\t\tChSet(static_cast<unsigned char>(c - 'a' + 'A'));\n\t\t} else if ((c >= 'A') && (c <= 'Z')) {\n\t\t\tChSet(c);\n\t\t\tChSet(static_cast<unsigned char>(c - 'A' + 'a'));\n\t\t} else {\n\t\t\tChSet(c);\n\t\t}\n\t}\n}\n\nunsigned char escapeValue(unsigned char ch) {\n\tswitch (ch) {\n\tcase 'a':\treturn '\\a';\n\tcase 'b':\treturn '\\b';\n\tcase 'f':\treturn '\\f';\n\tcase 'n':\treturn '\\n';\n\tcase 'r':\treturn '\\r';\n\tcase 't':\treturn '\\t';\n\tcase 'v':\treturn '\\v';\n\t}\n\treturn 0;\n}\n\nstatic int GetHexaChar(unsigned char hd1, unsigned char hd2) {\n\tint hexValue = 0;\n\tif (hd1 >= '0' && hd1 <= '9') {\n\t\thexValue += 16 * (hd1 - '0');\n\t} else if (hd1 >= 'A' && hd1 <= 'F') {\n\t\thexValue += 16 * (hd1 - 'A' + 10);\n\t} else if (hd1 >= 'a' && hd1 <= 'f') {\n\t\thexValue += 16 * (hd1 - 'a' + 10);\n\t} else\n\t\treturn -1;\n\tif (hd2 >= '0' && hd2 <= '9') {\n\t\thexValue += hd2 - '0';\n\t} else if (hd2 >= 'A' && hd2 <= 'F') {\n\t\thexValue += hd2 - 'A' + 10;\n\t} else if (hd2 >= 'a' && hd2 <= 'f') {\n\t\thexValue += hd2 - 'a' + 10;\n\t} else\n\t\treturn -1;\n\treturn hexValue;\n}\n\n/**\n * Called when the parser finds a backslash not followed\n * by a valid expression (like \\( in non-Posix mode).\n * @param pattern: pointer on the char after the backslash.\n * @param incr: (out) number of chars to skip after expression evaluation.\n * @return the char if it resolves to a simple char,\n * or -1 for a char class. In this case, bittab is changed.\n */\nint RESearch::GetBackslashExpression(\n    const char *pattern,\n    int &incr) {\n\t// Since error reporting is primitive and messages are not used anyway,\n\t// I choose to interpret unexpected syntax in a logical way instead\n\t// of reporting errors. Otherwise, we can stick on, eg., PCRE behavior.\n\tincr = 0;\t// Most of the time, will skip the char \"naturally\".\n\tint c;\n\tint result = -1;\n\tunsigned char bsc = *pattern;\n\tif (!bsc) {\n\t\t// Avoid overrun\n\t\tresult = '\\\\';\t// \\ at end of pattern, take it literally\n\t\treturn result;\n\t}\n\n\tswitch (bsc) {\n\tcase 'a':\n\tcase 'b':\n\tcase 'n':\n\tcase 'f':\n\tcase 'r':\n\tcase 't':\n\tcase 'v':\n\t\tresult = escapeValue(bsc);\n\t\tbreak;\n\tcase 'x': {\n\t\t\tunsigned char hd1 = *(pattern + 1);\n\t\t\tunsigned char hd2 = *(pattern + 2);\n\t\t\tint hexValue = GetHexaChar(hd1, hd2);\n\t\t\tif (hexValue >= 0) {\n\t\t\t\tresult = hexValue;\n\t\t\t\tincr = 2;\t// Must skip the digits\n\t\t\t} else {\n\t\t\t\tresult = 'x';\t// \\x without 2 digits: see it as 'x'\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase 'd':\n\t\tfor (c = '0'; c <= '9'; c++) {\n\t\t\tChSet(static_cast<unsigned char>(c));\n\t\t}\n\t\tbreak;\n\tcase 'D':\n\t\tfor (c = 0; c < MAXCHR; c++) {\n\t\t\tif (c < '0' || c > '9') {\n\t\t\t\tChSet(static_cast<unsigned char>(c));\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase 's':\n\t\tChSet(' ');\n\t\tChSet('\\t');\n\t\tChSet('\\n');\n\t\tChSet('\\r');\n\t\tChSet('\\f');\n\t\tChSet('\\v');\n\t\tbreak;\n\tcase 'S':\n\t\tfor (c = 0; c < MAXCHR; c++) {\n\t\t\tif (c != ' ' && !(c >= 0x09 && c <= 0x0D)) {\n\t\t\t\tChSet(static_cast<unsigned char>(c));\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase 'w':\n\t\tfor (c = 0; c < MAXCHR; c++) {\n\t\t\tif (iswordc(static_cast<unsigned char>(c))) {\n\t\t\t\tChSet(static_cast<unsigned char>(c));\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase 'W':\n\t\tfor (c = 0; c < MAXCHR; c++) {\n\t\t\tif (!iswordc(static_cast<unsigned char>(c))) {\n\t\t\t\tChSet(static_cast<unsigned char>(c));\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tresult = bsc;\n\t}\n\treturn result;\n}\n\nconst char *RESearch::Compile(const char *pattern, int length, bool caseSensitive, bool posix) {\n\tchar *mp=nfa;          /* nfa pointer       */\n\tchar *lp;              /* saved pointer     */\n\tchar *sp=nfa;          /* another one       */\n\tchar *mpMax = mp + MAXNFA - BITBLK - 10;\n\n\tint tagi = 0;          /* tag stack index   */\n\tint tagc = 1;          /* actual tag count  */\n\n\tint n;\n\tchar mask;             /* xor mask -CCL/NCL */\n\tint c1, c2, prevChar;\n\n\tif (!pattern || !length) {\n\t\tif (sta)\n\t\t\treturn 0;\n\t\telse\n\t\t\treturn badpat(\"No previous regular expression\");\n\t}\n\tsta = NOP;\n\n\tconst char *p=pattern;     /* pattern pointer   */\n\tfor (int i=0; i<length; i++, p++) {\n\t\tif (mp > mpMax)\n\t\t\treturn badpat(\"Pattern too long\");\n\t\tlp = mp;\n\t\tswitch (*p) {\n\n\t\tcase '.':               /* match any char  */\n\t\t\t*mp++ = ANY;\n\t\t\tbreak;\n\n\t\tcase '^':               /* match beginning */\n\t\t\tif (p == pattern)\n\t\t\t\t*mp++ = BOL;\n\t\t\telse {\n\t\t\t\t*mp++ = CHR;\n\t\t\t\t*mp++ = *p;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase '$':               /* match endofline */\n\t\t\tif (!*(p+1))\n\t\t\t\t*mp++ = EOL;\n\t\t\telse {\n\t\t\t\t*mp++ = CHR;\n\t\t\t\t*mp++ = *p;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase '[':               /* match char class */\n\t\t\t*mp++ = CCL;\n\t\t\tprevChar = 0;\n\n\t\t\ti++;\n\t\t\tif (*++p == '^') {\n\t\t\t\tmask = '\\377';\n\t\t\t\ti++;\n\t\t\t\tp++;\n\t\t\t} else\n\t\t\t\tmask = 0;\n\n\t\t\tif (*p == '-') {\t/* real dash */\n\t\t\t\ti++;\n\t\t\t\tprevChar = *p;\n\t\t\t\tChSet(*p++);\n\t\t\t}\n\t\t\tif (*p == ']') {\t/* real brace */\n\t\t\t\ti++;\n\t\t\t\tprevChar = *p;\n\t\t\t\tChSet(*p++);\n\t\t\t}\n\t\t\twhile (*p && *p != ']') {\n\t\t\t\tif (*p == '-') {\n\t\t\t\t\tif (prevChar < 0) {\n\t\t\t\t\t\t// Previous def. was a char class like \\d, take dash literally\n\t\t\t\t\t\tprevChar = *p;\n\t\t\t\t\t\tChSet(*p);\n\t\t\t\t\t} else if (*(p+1)) {\n\t\t\t\t\t\tif (*(p+1) != ']') {\n\t\t\t\t\t\t\tc1 = prevChar + 1;\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\tc2 = static_cast<unsigned char>(*++p);\n\t\t\t\t\t\t\tif (c2 == '\\\\') {\n\t\t\t\t\t\t\t\tif (!*(p+1))\t// End of RE\n\t\t\t\t\t\t\t\t\treturn badpat(\"Missing ]\");\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\t\t\tp++;\n\t\t\t\t\t\t\t\t\tint incr;\n\t\t\t\t\t\t\t\t\tc2 = GetBackslashExpression(p, incr);\n\t\t\t\t\t\t\t\t\ti += incr;\n\t\t\t\t\t\t\t\t\tp += incr;\n\t\t\t\t\t\t\t\t\tif (c2 >= 0) {\n\t\t\t\t\t\t\t\t\t\t// Convention: \\c (c is any char) is case sensitive, whatever the option\n\t\t\t\t\t\t\t\t\t\tChSet(static_cast<unsigned char>(c2));\n\t\t\t\t\t\t\t\t\t\tprevChar = c2;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t// bittab is already changed\n\t\t\t\t\t\t\t\t\t\tprevChar = -1;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (prevChar < 0) {\n\t\t\t\t\t\t\t\t// Char after dash is char class like \\d, take dash literally\n\t\t\t\t\t\t\t\tprevChar = '-';\n\t\t\t\t\t\t\t\tChSet('-');\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Put all chars between c1 and c2 included in the char set\n\t\t\t\t\t\t\t\twhile (c1 <= c2) {\n\t\t\t\t\t\t\t\t\tChSetWithCase(static_cast<unsigned char>(c1++), caseSensitive);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Dash before the ], take it literally\n\t\t\t\t\t\t\tprevChar = *p;\n\t\t\t\t\t\t\tChSet(*p);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn badpat(\"Missing ]\");\n\t\t\t\t\t}\n\t\t\t\t} else if (*p == '\\\\' && *(p+1)) {\n\t\t\t\t\ti++;\n\t\t\t\t\tp++;\n\t\t\t\t\tint incr;\n\t\t\t\t\tint c = GetBackslashExpression(p, incr);\n\t\t\t\t\ti += incr;\n\t\t\t\t\tp += incr;\n\t\t\t\t\tif (c >= 0) {\n\t\t\t\t\t\t// Convention: \\c (c is any char) is case sensitive, whatever the option\n\t\t\t\t\t\tChSet(static_cast<unsigned char>(c));\n\t\t\t\t\t\tprevChar = c;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// bittab is already changed\n\t\t\t\t\t\tprevChar = -1;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tprevChar = static_cast<unsigned char>(*p);\n\t\t\t\t\tChSetWithCase(*p, caseSensitive);\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t\tp++;\n\t\t\t}\n\t\t\tif (!*p)\n\t\t\t\treturn badpat(\"Missing ]\");\n\n\t\t\tfor (n = 0; n < BITBLK; bittab[n++] = 0)\n\t\t\t\t*mp++ = static_cast<char>(mask ^ bittab[n]);\n\n\t\t\tbreak;\n\n\t\tcase '*':               /* match 0 or more... */\n\t\tcase '+':               /* match 1 or more... */\n\t\tcase '?':\n\t\t\tif (p == pattern)\n\t\t\t\treturn badpat(\"Empty closure\");\n\t\t\tlp = sp;\t\t/* previous opcode */\n\t\t\tif (*lp == CLO || *lp == LCLO)\t\t/* equivalence... */\n\t\t\t\tbreak;\n\t\t\tswitch (*lp) {\n\n\t\t\tcase BOL:\n\t\t\tcase BOT:\n\t\t\tcase EOT:\n\t\t\tcase BOW:\n\t\t\tcase EOW:\n\t\t\tcase REF:\n\t\t\t\treturn badpat(\"Illegal closure\");\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (*p == '+')\n\t\t\t\tfor (sp = mp; lp < sp; lp++)\n\t\t\t\t\t*mp++ = *lp;\n\n\t\t\t*mp++ = END;\n\t\t\t*mp++ = END;\n\t\t\tsp = mp;\n\n\t\t\twhile (--mp > lp)\n\t\t\t\t*mp = mp[-1];\n\t\t\tif (*p == '?')          *mp = CLQ;\n\t\t\telse if (*(p+1) == '?') *mp = LCLO;\n\t\t\telse                    *mp = CLO;\n\n\t\t\tmp = sp;\n\t\t\tbreak;\n\n\t\tcase '\\\\':              /* tags, backrefs... */\n\t\t\ti++;\n\t\t\tswitch (*++p) {\n\t\t\tcase '<':\n\t\t\t\t*mp++ = BOW;\n\t\t\t\tbreak;\n\t\t\tcase '>':\n\t\t\t\tif (*sp == BOW)\n\t\t\t\t\treturn badpat(\"Null pattern inside \\\\<\\\\>\");\n\t\t\t\t*mp++ = EOW;\n\t\t\t\tbreak;\n\t\t\tcase '1':\n\t\t\tcase '2':\n\t\t\tcase '3':\n\t\t\tcase '4':\n\t\t\tcase '5':\n\t\t\tcase '6':\n\t\t\tcase '7':\n\t\t\tcase '8':\n\t\t\tcase '9':\n\t\t\t\tn = *p-'0';\n\t\t\t\tif (tagi > 0 && tagstk[tagi] == n)\n\t\t\t\t\treturn badpat(\"Cyclical reference\");\n\t\t\t\tif (tagc > n) {\n\t\t\t\t\t*mp++ = static_cast<char>(REF);\n\t\t\t\t\t*mp++ = static_cast<char>(n);\n\t\t\t\t} else\n\t\t\t\t\treturn badpat(\"Undetermined reference\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (!posix && *p == '(') {\n\t\t\t\t\tif (tagc < MAXTAG) {\n\t\t\t\t\t\ttagstk[++tagi] = tagc;\n\t\t\t\t\t\t*mp++ = BOT;\n\t\t\t\t\t\t*mp++ = static_cast<char>(tagc++);\n\t\t\t\t\t} else\n\t\t\t\t\t\treturn badpat(\"Too many \\\\(\\\\) pairs\");\n\t\t\t\t} else if (!posix && *p == ')') {\n\t\t\t\t\tif (*sp == BOT)\n\t\t\t\t\t\treturn badpat(\"Null pattern inside \\\\(\\\\)\");\n\t\t\t\t\tif (tagi > 0) {\n\t\t\t\t\t\t*mp++ = static_cast<char>(EOT);\n\t\t\t\t\t\t*mp++ = static_cast<char>(tagstk[tagi--]);\n\t\t\t\t\t} else\n\t\t\t\t\t\treturn badpat(\"Unmatched \\\\)\");\n\t\t\t\t} else {\n\t\t\t\t\tint incr;\n\t\t\t\t\tint c = GetBackslashExpression(p, incr);\n\t\t\t\t\ti += incr;\n\t\t\t\t\tp += incr;\n\t\t\t\t\tif (c >= 0) {\n\t\t\t\t\t\t*mp++ = CHR;\n\t\t\t\t\t\t*mp++ = static_cast<unsigned char>(c);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t*mp++ = CCL;\n\t\t\t\t\t\tmask = 0;\n\t\t\t\t\t\tfor (n = 0; n < BITBLK; bittab[n++] = 0)\n\t\t\t\t\t\t\t*mp++ = static_cast<char>(mask ^ bittab[n]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault :               /* an ordinary char */\n\t\t\tif (posix && *p == '(') {\n\t\t\t\tif (tagc < MAXTAG) {\n\t\t\t\t\ttagstk[++tagi] = tagc;\n\t\t\t\t\t*mp++ = BOT;\n\t\t\t\t\t*mp++ = static_cast<char>(tagc++);\n\t\t\t\t} else\n\t\t\t\t\treturn badpat(\"Too many () pairs\");\n\t\t\t} else if (posix && *p == ')') {\n\t\t\t\tif (*sp == BOT)\n\t\t\t\t\treturn badpat(\"Null pattern inside ()\");\n\t\t\t\tif (tagi > 0) {\n\t\t\t\t\t*mp++ = static_cast<char>(EOT);\n\t\t\t\t\t*mp++ = static_cast<char>(tagstk[tagi--]);\n\t\t\t\t} else\n\t\t\t\t\treturn badpat(\"Unmatched )\");\n\t\t\t} else {\n\t\t\t\tunsigned char c = *p;\n\t\t\t\tif (!c)\t// End of RE\n\t\t\t\t\tc = '\\\\';\t// We take it as raw backslash\n\t\t\t\tif (caseSensitive || !iswordc(c)) {\n\t\t\t\t\t*mp++ = CHR;\n\t\t\t\t\t*mp++ = c;\n\t\t\t\t} else {\n\t\t\t\t\t*mp++ = CCL;\n\t\t\t\t\tmask = 0;\n\t\t\t\t\tChSetWithCase(c, false);\n\t\t\t\t\tfor (n = 0; n < BITBLK; bittab[n++] = 0)\n\t\t\t\t\t\t*mp++ = static_cast<char>(mask ^ bittab[n]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tsp = lp;\n\t}\n\tif (tagi > 0)\n\t\treturn badpat((posix ? \"Unmatched (\" : \"Unmatched \\\\(\"));\n\t*mp = END;\n\tsta = OKP;\n\treturn 0;\n}\n\n/*\n * RESearch::Execute:\n *   execute nfa to find a match.\n *\n *  special cases: (nfa[0])\n *      BOL\n *          Match only once, starting from the\n *          beginning.\n *      CHR\n *          First locate the character without\n *          calling PMatch, and if found, call\n *          PMatch for the remaining string.\n *      END\n *          RESearch::Compile failed, poor luser did not\n *          check for it. Fail fast.\n *\n *  If a match is found, bopat[0] and eopat[0] are set\n *  to the beginning and the end of the matched fragment,\n *  respectively.\n *\n */\nint RESearch::Execute(CharacterIndexer &ci, int lp, int endp) {\n\tunsigned char c;\n\tint ep = NOTFOUND;\n\tchar *ap = nfa;\n\n\tbol = lp;\n\tfailure = 0;\n\n\tClear();\n\n\tswitch (*ap) {\n\n\tcase BOL:\t\t\t/* anchored: match from BOL only */\n\t\tep = PMatch(ci, lp, endp, ap);\n\t\tbreak;\n\tcase EOL:\t\t\t/* just searching for end of line normal path doesn't work */\n\t\tif (*(ap+1) == END) {\n\t\t\tlp = endp;\n\t\t\tep = lp;\n\t\t\tbreak;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\tcase CHR:\t\t\t/* ordinary char: locate it fast */\n\t\tc = *(ap+1);\n\t\twhile ((lp < endp) && (static_cast<unsigned char>(ci.CharAt(lp)) != c))\n\t\t\tlp++;\n\t\tif (lp >= endp)\t/* if EOS, fail, else fall thru. */\n\t\t\treturn 0;\n\tdefault:\t\t\t/* regular matching all the way. */\n\t\twhile (lp < endp) {\n\t\t\tep = PMatch(ci, lp, endp, ap);\n\t\t\tif (ep != NOTFOUND)\n\t\t\t\tbreak;\n\t\t\tlp++;\n\t\t}\n\t\tbreak;\n\tcase END:\t\t\t/* munged automaton. fail always */\n\t\treturn 0;\n\t}\n\tif (ep == NOTFOUND)\n\t\treturn 0;\n\n\tbopat[0] = lp;\n\teopat[0] = ep;\n\treturn 1;\n}\n\n/*\n * PMatch: internal routine for the hard part\n *\n *  This code is partly snarfed from an early grep written by\n *  David Conroy. The backref and tag stuff, and various other\n *  innovations are by oz.\n *\n *  special case optimizations: (nfa[n], nfa[n+1])\n *      CLO ANY\n *          We KNOW .* will match everything upto the\n *          end of line. Thus, directly go to the end of\n *          line, without recursive PMatch calls. As in\n *          the other closure cases, the remaining pattern\n *          must be matched by moving backwards on the\n *          string recursively, to find a match for xy\n *          (x is \".*\" and y is the remaining pattern)\n *          where the match satisfies the LONGEST match for\n *          x followed by a match for y.\n *      CLO CHR\n *          We can again scan the string forward for the\n *          single char and at the point of failure, we\n *          execute the remaining nfa recursively, same as\n *          above.\n *\n *  At the end of a successful match, bopat[n] and eopat[n]\n *  are set to the beginning and end of subpatterns matched\n *  by tagged expressions (n = 1 to 9).\n */\n\nextern void re_fail(char *,char);\n\n#define isinset(x,y)\t((x)[((y)&BLKIND)>>3] & bitarr[(y)&BITIND])\n\n/*\n * skip values for CLO XXX to skip past the closure\n */\n\n#define ANYSKIP 2 \t/* [CLO] ANY END          */\n#define CHRSKIP 3\t/* [CLO] CHR chr END      */\n#define CCLSKIP 34\t/* [CLO] CCL 32 bytes END */\n\nint RESearch::PMatch(CharacterIndexer &ci, int lp, int endp, char *ap) {\n\tint op, c, n;\n\tint e;\t\t/* extra pointer for CLO  */\n\tint bp;\t\t/* beginning of subpat... */\n\tint ep;\t\t/* ending of subpat...    */\n\tint are;\t/* to save the line ptr.  */\n\tint llp;\t/* lazy lp for LCLO       */\n\n\twhile ((op = *ap++) != END)\n\t\tswitch (op) {\n\n\t\tcase CHR:\n\t\t\tif (ci.CharAt(lp++) != *ap++)\n\t\t\t\treturn NOTFOUND;\n\t\t\tbreak;\n\t\tcase ANY:\n\t\t\tif (lp++ >= endp)\n\t\t\t\treturn NOTFOUND;\n\t\t\tbreak;\n\t\tcase CCL:\n\t\t\tif (lp >= endp)\n\t\t\t\treturn NOTFOUND;\n\t\t\tc = ci.CharAt(lp++);\n\t\t\tif (!isinset(ap,c))\n\t\t\t\treturn NOTFOUND;\n\t\t\tap += BITBLK;\n\t\t\tbreak;\n\t\tcase BOL:\n\t\t\tif (lp != bol)\n\t\t\t\treturn NOTFOUND;\n\t\t\tbreak;\n\t\tcase EOL:\n\t\t\tif (lp < endp)\n\t\t\t\treturn NOTFOUND;\n\t\t\tbreak;\n\t\tcase BOT:\n\t\t\tbopat[static_cast<int>(*ap++)] = lp;\n\t\t\tbreak;\n\t\tcase EOT:\n\t\t\teopat[static_cast<int>(*ap++)] = lp;\n\t\t\tbreak;\n\t\tcase BOW:\n\t\t\tif ((lp!=bol && iswordc(ci.CharAt(lp-1))) || !iswordc(ci.CharAt(lp)))\n\t\t\t\treturn NOTFOUND;\n\t\t\tbreak;\n\t\tcase EOW:\n\t\t\tif (lp==bol || !iswordc(ci.CharAt(lp-1)) || iswordc(ci.CharAt(lp)))\n\t\t\t\treturn NOTFOUND;\n\t\t\tbreak;\n\t\tcase REF:\n\t\t\tn = *ap++;\n\t\t\tbp = bopat[n];\n\t\t\tep = eopat[n];\n\t\t\twhile (bp < ep)\n\t\t\t\tif (ci.CharAt(bp++) != ci.CharAt(lp++))\n\t\t\t\t\treturn NOTFOUND;\n\t\t\tbreak;\n\t\tcase LCLO:\n\t\tcase CLQ:\n\t\tcase CLO:\n\t\t\tare = lp;\n\t\t\tswitch (*ap) {\n\n\t\t\tcase ANY:\n\t\t\t\tif (op == CLO || op == LCLO)\n\t\t\t\t\twhile (lp < endp)\n\t\t\t\t\t\tlp++;\n\t\t\t\telse if (lp < endp)\n\t\t\t\t\tlp++;\n\n\t\t\t\tn = ANYSKIP;\n\t\t\t\tbreak;\n\t\t\tcase CHR:\n\t\t\t\tc = *(ap+1);\n\t\t\t\tif (op == CLO || op == LCLO)\n\t\t\t\t\twhile ((lp < endp) && (c == ci.CharAt(lp)))\n\t\t\t\t\t\tlp++;\n\t\t\t\telse if ((lp < endp) && (c == ci.CharAt(lp)))\n\t\t\t\t\tlp++;\n\t\t\t\tn = CHRSKIP;\n\t\t\t\tbreak;\n\t\t\tcase CCL:\n\t\t\t\twhile ((lp < endp) && isinset(ap+1,ci.CharAt(lp)))\n\t\t\t\t\tlp++;\n\t\t\t\tn = CCLSKIP;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tfailure = true;\n\t\t\t\t//re_fail(\"closure: bad nfa.\", *ap);\n\t\t\t\treturn NOTFOUND;\n\t\t\t}\n\t\t\tap += n;\n\n\t\t\tllp = lp;\n\t\t\te = NOTFOUND;\n\t\t\twhile (llp >= are) {\n\t\t\t\tint q;\n\t\t\t\tif ((q = PMatch(ci, llp, endp, ap)) != NOTFOUND) {\n\t\t\t\t\te = q;\n\t\t\t\t\tlp = llp;\n\t\t\t\t\tif (op != LCLO) return e;\n\t\t\t\t}\n\t\t\t\tif (*ap == END) return e;\n\t\t\t\t--llp;\n\t\t\t}\n\t\t\tif (*ap == EOT)\n\t\t\t\tPMatch(ci, lp, endp, ap);\n\t\t\treturn e;\n\t\tdefault:\n\t\t\t//re_fail(\"RESearch::Execute: bad nfa.\", static_cast<char>(op));\n\t\t\treturn NOTFOUND;\n\t\t}\n\treturn lp;\n}\n\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/RESearch.h",
    "content": "// Scintilla source code edit control\n/** @file RESearch.h\n ** Interface to the regular expression search library.\n **/\n// Written by Neil Hodgson <neilh@scintilla.org>\n// Based on the work of Ozan S. Yigit.\n// This file is in the public domain.\n\n#ifndef RESEARCH_H\n#define RESEARCH_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n/*\n * The following defines are not meant to be changeable.\n * They are for readability only.\n */\n#define MAXCHR\t256\n#define CHRBIT\t8\n#define BITBLK\tMAXCHR/CHRBIT\n\nclass CharacterIndexer {\npublic:\n\tvirtual char CharAt(int index)=0;\n\tvirtual ~CharacterIndexer() {\n\t}\n};\n\nclass RESearch {\n\npublic:\n\tRESearch(CharClassify *charClassTable);\n\t~RESearch();\n\tvoid GrabMatches(CharacterIndexer &ci);\n\tconst char *Compile(const char *pattern, int length, bool caseSensitive, bool posix);\n\tint Execute(CharacterIndexer &ci, int lp, int endp);\n\n\tenum { MAXTAG=10 };\n\tenum { MAXNFA=2048 };\n\tenum { NOTFOUND=-1 };\n\n\tint bopat[MAXTAG];\n\tint eopat[MAXTAG];\n\tstd::string pat[MAXTAG];\n\nprivate:\n\tvoid Init();\n\tvoid Clear();\n\tvoid ChSet(unsigned char c);\n\tvoid ChSetWithCase(unsigned char c, bool caseSensitive);\n\tint GetBackslashExpression(const char *pattern, int &incr);\n\n\tint PMatch(CharacterIndexer &ci, int lp, int endp, char *ap);\n\n\tint bol;\n\tint tagstk[MAXTAG];  /* subpat tag stack */\n\tchar nfa[MAXNFA];    /* automaton */\n\tint sta;\n\tunsigned char bittab[BITBLK]; /* bit table for CCL pre-set bits */\n\tint failure;\n\tCharClassify *charClass;\n\tbool iswordc(unsigned char x) const {\n\t\treturn charClass->IsWord(x);\n\t}\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/RunStyles.cpp",
    "content": "/** @file RunStyles.cxx\n ** Data structure used to store sparse styles.\n **/\n// Copyright 1998-2007 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdarg.h>\n\n#include <stdexcept>\n#include <algorithm>\n\n#include \"Platform.h\"\n\n#include \"Scintilla.h\"\n#include \"SplitVector.h\"\n#include \"Partitioning.h\"\n#include \"RunStyles.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n// Find the first run at a position\nint RunStyles::RunFromPosition(int position) const {\n\tint run = starts->PartitionFromPosition(position);\n\t// Go to first element with this position\n\twhile ((run > 0) && (position == starts->PositionFromPartition(run-1))) {\n\t\trun--;\n\t}\n\treturn run;\n}\n\n// If there is no run boundary at position, insert one continuing style.\nint RunStyles::SplitRun(int position) {\n\tint run = RunFromPosition(position);\n\tint posRun = starts->PositionFromPartition(run);\n\tif (posRun < position) {\n\t\tint runStyle = ValueAt(position);\n\t\trun++;\n\t\tstarts->InsertPartition(run, position);\n\t\tstyles->InsertValue(run, 1, runStyle);\n\t}\n\treturn run;\n}\n\nvoid RunStyles::RemoveRun(int run) {\n\tstarts->RemovePartition(run);\n\tstyles->DeleteRange(run, 1);\n}\n\nvoid RunStyles::RemoveRunIfEmpty(int run) {\n\tif ((run < starts->Partitions()) && (starts->Partitions() > 1)) {\n\t\tif (starts->PositionFromPartition(run) == starts->PositionFromPartition(run+1)) {\n\t\t\tRemoveRun(run);\n\t\t}\n\t}\n}\n\nvoid RunStyles::RemoveRunIfSameAsPrevious(int run) {\n\tif ((run > 0) && (run < starts->Partitions())) {\n\t\tif (styles->ValueAt(run-1) == styles->ValueAt(run)) {\n\t\t\tRemoveRun(run);\n\t\t}\n\t}\n}\n\nRunStyles::RunStyles() {\n\tstarts = new Partitioning(8);\n\tstyles = new SplitVector<int>();\n\tstyles->InsertValue(0, 2, 0);\n}\n\nRunStyles::~RunStyles() {\n\tdelete starts;\n\tstarts = NULL;\n\tdelete styles;\n\tstyles = NULL;\n}\n\nint RunStyles::Length() const {\n\treturn starts->PositionFromPartition(starts->Partitions());\n}\n\nint RunStyles::ValueAt(int position) const {\n\treturn styles->ValueAt(starts->PartitionFromPosition(position));\n}\n\nint RunStyles::FindNextChange(int position, int end) const {\n\tint run = starts->PartitionFromPosition(position);\n\tif (run < starts->Partitions()) {\n\t\tint runChange = starts->PositionFromPartition(run);\n\t\tif (runChange > position)\n\t\t\treturn runChange;\n\t\tint nextChange = starts->PositionFromPartition(run + 1);\n\t\tif (nextChange > position) {\n\t\t\treturn nextChange;\n\t\t} else if (position < end) {\n\t\t\treturn end;\n\t\t} else {\n\t\t\treturn end + 1;\n\t\t}\n\t} else {\n\t\treturn end + 1;\n\t}\n}\n\nint RunStyles::StartRun(int position) const {\n\treturn starts->PositionFromPartition(starts->PartitionFromPosition(position));\n}\n\nint RunStyles::EndRun(int position) const {\n\treturn starts->PositionFromPartition(starts->PartitionFromPosition(position) + 1);\n}\n\nbool RunStyles::FillRange(int &position, int value, int &fillLength) {\n\tif (fillLength <= 0) {\n\t\treturn false;\n\t}\n\tint end = position + fillLength;\n\tif (end > Length()) {\n\t\treturn false;\n\t}\n\tint runEnd = RunFromPosition(end);\n\tif (styles->ValueAt(runEnd) == value) {\n\t\t// End already has value so trim range.\n\t\tend = starts->PositionFromPartition(runEnd);\n\t\tif (position >= end) {\n\t\t\t// Whole range is already same as value so no action\n\t\t\treturn false;\n\t\t}\n\t\tfillLength = end - position;\n\t} else {\n\t\trunEnd = SplitRun(end);\n\t}\n\tint runStart = RunFromPosition(position);\n\tif (styles->ValueAt(runStart) == value) {\n\t\t// Start is in expected value so trim range.\n\t\trunStart++;\n\t\tposition = starts->PositionFromPartition(runStart);\n\t\tfillLength = end - position;\n\t} else {\n\t\tif (starts->PositionFromPartition(runStart) < position) {\n\t\t\trunStart = SplitRun(position);\n\t\t\trunEnd++;\n\t\t}\n\t}\n\tif (runStart < runEnd) {\n\t\tstyles->SetValueAt(runStart, value);\n\t\t// Remove each old run over the range\n\t\tfor (int run=runStart+1; run<runEnd; run++) {\n\t\t\tRemoveRun(runStart+1);\n\t\t}\n\t\trunEnd = RunFromPosition(end);\n\t\tRemoveRunIfSameAsPrevious(runEnd);\n\t\tRemoveRunIfSameAsPrevious(runStart);\n\t\trunEnd = RunFromPosition(end);\n\t\tRemoveRunIfEmpty(runEnd);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n}\n\nvoid RunStyles::SetValueAt(int position, int value) {\n\tint len = 1;\n\tFillRange(position, value, len);\n}\n\nvoid RunStyles::InsertSpace(int position, int insertLength) {\n\tint runStart = RunFromPosition(position);\n\tif (starts->PositionFromPartition(runStart) == position) {\n\t\tint runStyle = ValueAt(position);\n\t\t// Inserting at start of run so make previous longer\n\t\tif (runStart == 0) {\n\t\t\t// Inserting at start of document so ensure 0\n\t\t\tif (runStyle) {\n\t\t\t\tstyles->SetValueAt(0, 0);\n\t\t\t\tstarts->InsertPartition(1, 0);\n\t\t\t\tstyles->InsertValue(1, 1, runStyle);\n\t\t\t\tstarts->InsertText(0, insertLength);\n\t\t\t} else {\n\t\t\t\tstarts->InsertText(runStart, insertLength);\n\t\t\t}\n\t\t} else {\n\t\t\tif (runStyle) {\n\t\t\t\tstarts->InsertText(runStart-1, insertLength);\n\t\t\t} else {\n\t\t\t\t// Insert at end of run so do not extend style\n\t\t\t\tstarts->InsertText(runStart, insertLength);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tstarts->InsertText(runStart, insertLength);\n\t}\n}\n\nvoid RunStyles::DeleteAll() {\n\tdelete starts;\n\tstarts = NULL;\n\tdelete styles;\n\tstyles = NULL;\n\tstarts = new Partitioning(8);\n\tstyles = new SplitVector<int>();\n\tstyles->InsertValue(0, 2, 0);\n}\n\nvoid RunStyles::DeleteRange(int position, int deleteLength) {\n\tint end = position + deleteLength;\n\tint runStart = RunFromPosition(position);\n\tint runEnd = RunFromPosition(end);\n\tif (runStart == runEnd) {\n\t\t// Deleting from inside one run\n\t\tstarts->InsertText(runStart, -deleteLength);\n\t\tRemoveRunIfEmpty(runStart);\n\t} else {\n\t\trunStart = SplitRun(position);\n\t\trunEnd = SplitRun(end);\n\t\tstarts->InsertText(runStart, -deleteLength);\n\t\t// Remove each old run over the range\n\t\tfor (int run=runStart; run<runEnd; run++) {\n\t\t\tRemoveRun(runStart);\n\t\t}\n\t\tRemoveRunIfEmpty(runStart);\n\t\tRemoveRunIfSameAsPrevious(runStart);\n\t}\n}\n\nint RunStyles::Runs() const {\n\treturn starts->Partitions();\n}\n\nbool RunStyles::AllSame() const {\n\tfor (int run = 1; run < starts->Partitions(); run++) {\n\t\tif (styles->ValueAt(run) != styles->ValueAt(run - 1))\n\t\t\treturn false;\n\t}\n\treturn true;\n}\n\nbool RunStyles::AllSameAs(int value) const {\n\treturn AllSame() && (styles->ValueAt(0) == value);\n}\n\nint RunStyles::Find(int value, int start) const {\n\tif (start < Length()) {\n\t\tint run = start ? RunFromPosition(start) : 0;\n\t\tif (styles->ValueAt(run) == value)\n\t\t\treturn start;\n\t\trun++;\n\t\twhile (run < starts->Partitions()) {\n\t\t\tif (styles->ValueAt(run) == value)\n\t\t\t\treturn starts->PositionFromPartition(run);\n\t\t\trun++;\n\t\t}\n\t}\n\treturn -1;\n}\n\nvoid RunStyles::Check() const {\n\tif (Length() < 0) {\n\t\tthrow std::runtime_error(\"RunStyles: Length can not be negative.\");\n\t}\n\tif (starts->Partitions() < 1) {\n\t\tthrow std::runtime_error(\"RunStyles: Must always have 1 or more partitions.\");\n\t}\n\tif (starts->Partitions() != styles->Length()-1) {\n\t\tthrow std::runtime_error(\"RunStyles: Partitions and styles different lengths.\");\n\t}\n\tint start=0;\n\twhile (start < Length()) {\n\t\tint end = EndRun(start);\n\t\tif (start >= end) {\n\t\t\tthrow std::runtime_error(\"RunStyles: Partition is 0 length.\");\n\t\t}\n\t\tstart = end;\n\t}\n\tif (styles->ValueAt(styles->Length()-1) != 0) {\n\t\tthrow std::runtime_error(\"RunStyles: Unused style at end changed.\");\n\t}\n\tfor (int j=1; j<styles->Length()-1; j++) {\n\t\tif (styles->ValueAt(j) == styles->ValueAt(j-1)) {\n\t\t\tthrow std::runtime_error(\"RunStyles: Style of a partition same as previous.\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/RunStyles.h",
    "content": "/** @file RunStyles.h\n ** Data structure used to store sparse styles.\n **/\n// Copyright 1998-2007 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n/// Styling buffer using one element for each run rather than using\n/// a filled buffer.\n\n#ifndef RUNSTYLES_H\n#define RUNSTYLES_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nclass RunStyles {\nprivate:\n\tPartitioning *starts;\n\tSplitVector<int> *styles;\n\tint RunFromPosition(int position) const;\n\tint SplitRun(int position);\n\tvoid RemoveRun(int run);\n\tvoid RemoveRunIfEmpty(int run);\n\tvoid RemoveRunIfSameAsPrevious(int run);\n\t// Private so RunStyles objects can not be copied\n\tRunStyles(const RunStyles &);\npublic:\n\tRunStyles();\n\t~RunStyles();\n\tint Length() const;\n\tint ValueAt(int position) const;\n\tint FindNextChange(int position, int end) const;\n\tint StartRun(int position) const;\n\tint EndRun(int position) const;\n\t// Returns true if some values may have changed\n\tbool FillRange(int &position, int value, int &fillLength);\n\tvoid SetValueAt(int position, int value);\n\tvoid InsertSpace(int position, int insertLength);\n\tvoid DeleteAll();\n\tvoid DeleteRange(int position, int deleteLength);\n\tint Runs() const;\n\tbool AllSame() const;\n\tbool AllSameAs(int value) const;\n\tint Find(int value, int start) const;\n\n\tvoid Check() const;\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/SciTE.properties",
    "content": "# SciTE.properties is the per directory local options file and can be used to override\n# settings made in SciTEGlobal.properties\ncommand.build.directory.*.cxx=..\\win32\ncommand.build.directory.*.h=..\\win32\ncommand.build.*.cxx=nmake -f scintilla.mak QUIET=1\ncommand.build.*.h=nmake -f scintilla.mak QUIET=1\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/ScintillaBase.cpp",
    "content": "// Scintilla source code edit control\n/** @file ScintillaBase.cxx\n ** An enhanced subclass of Editor with calltips, autocomplete and context menu.\n **/\n// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <assert.h>\n\n#include <string>\n#include <vector>\n#include <map>\n#include <algorithm>\n\n#include \"Platform.h\"\n\n#include \"ILexer.h\"\n#include \"Scintilla.h\"\n\n#include \"PropSetSimple.h\"\n#ifdef SCI_LEXER\n#include \"SciLexer.h\"\n#include \"LexerModule.h\"\n#include \"Catalogue.h\"\n#endif\n#include \"SplitVector.h\"\n#include \"Partitioning.h\"\n#include \"RunStyles.h\"\n#include \"ContractionState.h\"\n#include \"CellBuffer.h\"\n#include \"CallTip.h\"\n#include \"KeyMap.h\"\n#include \"Indicator.h\"\n#include \"XPM.h\"\n#include \"LineMarker.h\"\n#include \"Style.h\"\n#include \"ViewStyle.h\"\n#include \"AutoComplete.h\"\n#include \"CharClassify.h\"\n#include \"Decoration.h\"\n#include \"CaseFolder.h\"\n#include \"Document.h\"\n#include \"Selection.h\"\n#include \"PositionCache.h\"\n#include \"Editor.h\"\n#include \"ScintillaBase.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nScintillaBase::ScintillaBase() {\n\tdisplayPopupMenu = true;\n\tlistType = 0;\n\tmaxListWidth = 0;\n}\n\nScintillaBase::~ScintillaBase() {\n}\n\nvoid ScintillaBase::Finalise() {\n\tEditor::Finalise();\n\tpopup.Destroy();\n}\n\nvoid ScintillaBase::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) {\n\tbool isFillUp = ac.Active() && ac.IsFillUpChar(*s);\n\tif (!isFillUp) {\n\t\tEditor::AddCharUTF(s, len, treatAsDBCS);\n\t}\n\tif (ac.Active()) {\n\t\tAutoCompleteCharacterAdded(s[0]);\n\t\t// For fill ups add the character after the autocompletion has\n\t\t// triggered so containers see the key so can display a calltip.\n\t\tif (isFillUp) {\n\t\t\tEditor::AddCharUTF(s, len, treatAsDBCS);\n\t\t}\n\t}\n}\n\nvoid ScintillaBase::Command(int cmdId) {\n\n\tswitch (cmdId) {\n\n\tcase idAutoComplete:  \t// Nothing to do\n\n\t\tbreak;\n\n\tcase idCallTip:  \t// Nothing to do\n\n\t\tbreak;\n\n\tcase idcmdUndo:\n\t\tWndProc(SCI_UNDO, 0, 0);\n\t\tbreak;\n\n\tcase idcmdRedo:\n\t\tWndProc(SCI_REDO, 0, 0);\n\t\tbreak;\n\n\tcase idcmdCut:\n\t\tWndProc(SCI_CUT, 0, 0);\n\t\tbreak;\n\n\tcase idcmdCopy:\n\t\tWndProc(SCI_COPY, 0, 0);\n\t\tbreak;\n\n\tcase idcmdPaste:\n\t\tWndProc(SCI_PASTE, 0, 0);\n\t\tbreak;\n\n\tcase idcmdDelete:\n\t\tWndProc(SCI_CLEAR, 0, 0);\n\t\tbreak;\n\n\tcase idcmdSelectAll:\n\t\tWndProc(SCI_SELECTALL, 0, 0);\n\t\tbreak;\n\t}\n}\n\nint ScintillaBase::KeyCommand(unsigned int iMessage) {\n\t// Most key commands cancel autocompletion mode\n\tif (ac.Active()) {\n\t\tswitch (iMessage) {\n\t\t\t// Except for these\n\t\tcase SCI_LINEDOWN:\n\t\t\tAutoCompleteMove(1);\n\t\t\treturn 0;\n\t\tcase SCI_LINEUP:\n\t\t\tAutoCompleteMove(-1);\n\t\t\treturn 0;\n\t\tcase SCI_PAGEDOWN:\n\t\t\tAutoCompleteMove(ac.lb->GetVisibleRows());\n\t\t\treturn 0;\n\t\tcase SCI_PAGEUP:\n\t\t\tAutoCompleteMove(-ac.lb->GetVisibleRows());\n\t\t\treturn 0;\n\t\tcase SCI_VCHOME:\n\t\t\tAutoCompleteMove(-5000);\n\t\t\treturn 0;\n\t\tcase SCI_LINEEND:\n\t\t\tAutoCompleteMove(5000);\n\t\t\treturn 0;\n\t\tcase SCI_DELETEBACK:\n\t\t\tDelCharBack(true);\n\t\t\tAutoCompleteCharacterDeleted();\n\t\t\tEnsureCaretVisible();\n\t\t\treturn 0;\n\t\tcase SCI_DELETEBACKNOTLINE:\n\t\t\tDelCharBack(false);\n\t\t\tAutoCompleteCharacterDeleted();\n\t\t\tEnsureCaretVisible();\n\t\t\treturn 0;\n\t\tcase SCI_TAB:\n\t\t\tAutoCompleteCompleted();\n\t\t\treturn 0;\n\t\tcase SCI_NEWLINE:\n\t\t\tAutoCompleteCompleted();\n\t\t\treturn 0;\n\n\t\tdefault:\n\t\t\tAutoCompleteCancel();\n\t\t}\n\t}\n\n\tif (ct.inCallTipMode) {\n\t\tif (\n\t\t    (iMessage != SCI_CHARLEFT) &&\n\t\t    (iMessage != SCI_CHARLEFTEXTEND) &&\n\t\t    (iMessage != SCI_CHARRIGHT) &&\n\t\t    (iMessage != SCI_CHARRIGHTEXTEND) &&\n\t\t    (iMessage != SCI_EDITTOGGLEOVERTYPE) &&\n\t\t    (iMessage != SCI_DELETEBACK) &&\n\t\t    (iMessage != SCI_DELETEBACKNOTLINE)\n\t\t) {\n\t\t\tct.CallTipCancel();\n\t\t}\n\t\tif ((iMessage == SCI_DELETEBACK) || (iMessage == SCI_DELETEBACKNOTLINE)) {\n\t\t\tif (sel.MainCaret() <= ct.posStartCallTip) {\n\t\t\t\tct.CallTipCancel();\n\t\t\t}\n\t\t}\n\t}\n\treturn Editor::KeyCommand(iMessage);\n}\n\nvoid ScintillaBase::AutoCompleteDoubleClick(void *p) {\n\tScintillaBase *sci = reinterpret_cast<ScintillaBase *>(p);\n\tsci->AutoCompleteCompleted();\n}\n\nvoid ScintillaBase::AutoCompleteInsert(Position startPos, int removeLen, const char *text, int textLen) {\n\tUndoGroup ug(pdoc);\n\tpdoc->DeleteChars(startPos, removeLen);\n\tpdoc->InsertString(startPos, text, textLen);\n\tSetEmptySelection(startPos + textLen);\n}\n\nvoid ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {\n\t//Platform::DebugPrintf(\"AutoComplete %s\\n\", list);\n\tct.CallTipCancel();\n\n\tif (ac.chooseSingle && (listType == 0)) {\n\t\tif (list && !strchr(list, ac.GetSeparator())) {\n\t\t\tconst char *typeSep = strchr(list, ac.GetTypesep());\n\t\t\tint lenInsert = typeSep ? \n\t\t\t\tstatic_cast<int>(typeSep-list) : static_cast<int>(strlen(list));\n\t\t\tif (ac.ignoreCase) {\n\t\t\t\t// May need to convert the case before invocation, so remove lenEntered characters\n\t\t\t\tAutoCompleteInsert(sel.MainCaret() - lenEntered, lenEntered, list, lenInsert);\n\t\t\t} else {\n\t\t\t\tAutoCompleteInsert(sel.MainCaret(), 0, list + lenEntered, lenInsert - lenEntered);\n\t\t\t}\n\t\t\tac.Cancel();\n\t\t\treturn;\n\t\t}\n\t}\n\tac.Start(wMain, idAutoComplete, sel.MainCaret(), PointMainCaret(),\n\t\t\t\tlenEntered, vs.lineHeight, IsUnicodeMode(), technology);\n\n\tPRectangle rcClient = GetClientRectangle();\n\tPoint pt = LocationFromPosition(sel.MainCaret() - lenEntered);\n\tPRectangle rcPopupBounds = wMain.GetMonitorRect(pt);\n\tif (rcPopupBounds.Height() == 0)\n\t\trcPopupBounds = rcClient;\n\n\tint heightLB = ac.heightLBDefault;\n\tint widthLB = ac.widthLBDefault;\n\tif (pt.x >= rcClient.right - widthLB) {\n\t\tHorizontalScrollTo(xOffset + pt.x - rcClient.right + widthLB);\n\t\tRedraw();\n\t\tpt = PointMainCaret();\n\t}\n\tif (wMargin.GetID()) {\n\t\tPoint ptOrigin = GetVisibleOriginInMain();\n\t\tpt.x += ptOrigin.x;\n\t\tpt.y += ptOrigin.y;\n\t}\n\tPRectangle rcac;\n\trcac.left = pt.x - ac.lb->CaretFromEdge();\n\tif (pt.y >= rcPopupBounds.bottom - heightLB &&  // Wont fit below.\n\t        pt.y >= (rcPopupBounds.bottom + rcPopupBounds.top) / 2) { // and there is more room above.\n\t\trcac.top = pt.y - heightLB;\n\t\tif (rcac.top < rcPopupBounds.top) {\n\t\t\theightLB -= (rcPopupBounds.top - rcac.top);\n\t\t\trcac.top = rcPopupBounds.top;\n\t\t}\n\t} else {\n\t\trcac.top = pt.y + vs.lineHeight;\n\t}\n\trcac.right = rcac.left + widthLB;\n\trcac.bottom = Platform::Minimum(rcac.top + heightLB, rcPopupBounds.bottom);\n\tac.lb->SetPositionRelative(rcac, wMain);\n\tac.lb->SetFont(vs.styles[STYLE_DEFAULT].font);\n\tunsigned int aveCharWidth = vs.styles[STYLE_DEFAULT].aveCharWidth;\n\tac.lb->SetAverageCharWidth(aveCharWidth);\n\tac.lb->SetDoubleClickAction(AutoCompleteDoubleClick, this);\n\n\tac.SetList(list ? list : \"\");\n\n\t// Fiddle the position of the list so it is right next to the target and wide enough for all its strings\n\tPRectangle rcList = ac.lb->GetDesiredRect();\n\tint heightAlloced = rcList.bottom - rcList.top;\n\twidthLB = Platform::Maximum(widthLB, rcList.right - rcList.left);\n\tif (maxListWidth != 0)\n\t\twidthLB = Platform::Minimum(widthLB, aveCharWidth*maxListWidth);\n\t// Make an allowance for large strings in list\n\trcList.left = pt.x - ac.lb->CaretFromEdge();\n\trcList.right = rcList.left + widthLB;\n\tif (((pt.y + vs.lineHeight) >= (rcPopupBounds.bottom - heightAlloced)) &&  // Wont fit below.\n\t        ((pt.y + vs.lineHeight / 2) >= (rcPopupBounds.bottom + rcPopupBounds.top) / 2)) { // and there is more room above.\n\t\trcList.top = pt.y - heightAlloced;\n\t} else {\n\t\trcList.top = pt.y + vs.lineHeight;\n\t}\n\trcList.bottom = rcList.top + heightAlloced;\n\tac.lb->SetPositionRelative(rcList, wMain);\n\tac.Show(true);\n\tif (lenEntered != 0) {\n\t\tAutoCompleteMoveToCurrentWord();\n\t}\n}\n\nvoid ScintillaBase::AutoCompleteCancel() {\n\tif (ac.Active()) {\n\t\tSCNotification scn = {};\n\t\tscn.nmhdr.code = SCN_AUTOCCANCELLED;\n\t\tscn.wParam = 0;\n\t\tscn.listType = 0;\n\t\tNotifyParent(scn);\n\t}\n\tac.Cancel();\n}\n\nvoid ScintillaBase::AutoCompleteMove(int delta) {\n\tac.Move(delta);\n}\n\nvoid ScintillaBase::AutoCompleteMoveToCurrentWord() {\n\tstd::string wordCurrent = RangeText(ac.posStart - ac.startLen, sel.MainCaret());\n\tac.Select(wordCurrent.c_str());\n}\n\nvoid ScintillaBase::AutoCompleteCharacterAdded(char ch) {\n\tif (ac.IsFillUpChar(ch)) {\n\t\tAutoCompleteCompleted();\n\t} else if (ac.IsStopChar(ch)) {\n\t\tAutoCompleteCancel();\n\t} else {\n\t\tAutoCompleteMoveToCurrentWord();\n\t}\n}\n\nvoid ScintillaBase::AutoCompleteCharacterDeleted() {\n\tif (sel.MainCaret() < ac.posStart - ac.startLen) {\n\t\tAutoCompleteCancel();\n\t} else if (ac.cancelAtStartPos && (sel.MainCaret() <= ac.posStart)) {\n\t\tAutoCompleteCancel();\n\t} else {\n\t\tAutoCompleteMoveToCurrentWord();\n\t}\n\tSCNotification scn = {};\n\tscn.nmhdr.code = SCN_AUTOCCHARDELETED;\n\tscn.wParam = 0;\n\tscn.listType = 0;\n\tNotifyParent(scn);\n}\n\nvoid ScintillaBase::AutoCompleteCompleted() {\n\tint item = ac.GetSelection();\n\tif (item == -1) {\n\t\tAutoCompleteCancel();\n\t\treturn;\n\t}\n\tconst std::string selected = ac.GetValue(item);\n\n\tac.Show(false);\n\n\tSCNotification scn = {};\n\tscn.nmhdr.code = listType > 0 ? SCN_USERLISTSELECTION : SCN_AUTOCSELECTION;\n\tscn.message = 0;\n\tscn.wParam = listType;\n\tscn.listType = listType;\n\tPosition firstPos = ac.posStart - ac.startLen;\n\tscn.position = firstPos;\n\tscn.lParam = firstPos;\n\tscn.text = selected.c_str();\n\tNotifyParent(scn);\n\n\tif (!ac.Active())\n\t\treturn;\n\tac.Cancel();\n\n\tif (listType > 0)\n\t\treturn;\n\n\tPosition endPos = sel.MainCaret();\n\tif (ac.dropRestOfWord)\n\t\tendPos = pdoc->ExtendWordSelect(endPos, 1, true);\n\tif (endPos < firstPos)\n\t\treturn;\n\tAutoCompleteInsert(firstPos, endPos - firstPos, selected.c_str(), static_cast<int>(selected.length()));\n\tSetLastXChosen();\n}\n\nint ScintillaBase::AutoCompleteGetCurrent() const {\n\tif (!ac.Active())\n\t\treturn -1;\n\treturn ac.GetSelection();\n}\n\nint ScintillaBase::AutoCompleteGetCurrentText(char *buffer) const {\n\tif (ac.Active()) {\n\t\tint item = ac.GetSelection();\n\t\tif (item != -1) {\n\t\t\tconst std::string selected = ac.GetValue(item);\n\t\t\tif (buffer != NULL)\n\t\t\t\tstrcpy(buffer, selected.c_str());\n\t\t\treturn static_cast<int>(selected.length());\n\t\t}\n\t}\n\tif (buffer != NULL)\n\t\t*buffer = '\\0';\n\treturn 0;\n}\n\nvoid ScintillaBase::CallTipShow(Point pt, const char *defn) {\n\tac.Cancel();\n\t// If container knows about STYLE_CALLTIP then use it in place of the\n\t// STYLE_DEFAULT for the face name, size and character set. Also use it\n\t// for the foreground and background colour.\n\tint ctStyle = ct.UseStyleCallTip() ? STYLE_CALLTIP : STYLE_DEFAULT;\n\tif (ct.UseStyleCallTip()) {\n\t\tct.SetForeBack(vs.styles[STYLE_CALLTIP].fore, vs.styles[STYLE_CALLTIP].back);\n\t}\n\tif (wMargin.GetID()) {\n\t\tPoint ptOrigin = GetVisibleOriginInMain();\n\t\tpt.x += ptOrigin.x;\n\t\tpt.y += ptOrigin.y;\n\t}\n\tPRectangle rc = ct.CallTipStart(sel.MainCaret(), pt,\n\t\tvs.lineHeight,\n\t\tdefn,\n\t\tvs.styles[ctStyle].fontName,\n\t\tvs.styles[ctStyle].sizeZoomed,\n\t\tCodePage(),\n\t\tvs.styles[ctStyle].characterSet,\n\t\tvs.technology,\n\t\twMain);\n\t// If the call-tip window would be out of the client\n\t// space\n\tPRectangle rcClient = GetClientRectangle();\n\tint offset = vs.lineHeight + rc.Height();\n\t// adjust so it displays below the text.\n\tif (rc.top < rcClient.top) {\n\t\trc.top += offset;\n\t\trc.bottom += offset;\n\t}\n\t// adjust so it displays above the text.\n\tif (rc.bottom > rcClient.bottom) {\n\t\trc.top -= offset;\n\t\trc.bottom -= offset;\n\t}\n\t// Now display the window.\n\tCreateCallTipWindow(rc);\n\tct.wCallTip.SetPositionRelative(rc, wMain);\n\tct.wCallTip.Show();\n}\n\nvoid ScintillaBase::CallTipClick() {\n\tSCNotification scn = {};\n\tscn.nmhdr.code = SCN_CALLTIPCLICK;\n\tscn.position = ct.clickPlace;\n\tNotifyParent(scn);\n}\n\nvoid ScintillaBase::ContextMenu(Point pt) {\n\tif (displayPopupMenu) {\n\t\tbool writable = !WndProc(SCI_GETREADONLY, 0, 0);\n\t\tpopup.CreatePopUp();\n\t\tAddToPopUp(\"Undo\", idcmdUndo, writable && pdoc->CanUndo());\n\t\tAddToPopUp(\"Redo\", idcmdRedo, writable && pdoc->CanRedo());\n\t\tAddToPopUp(\"\");\n\t\tAddToPopUp(\"Cut\", idcmdCut, writable && !sel.Empty());\n\t\tAddToPopUp(\"Copy\", idcmdCopy, !sel.Empty());\n\t\tAddToPopUp(\"Paste\", idcmdPaste, writable && WndProc(SCI_CANPASTE, 0, 0));\n\t\tAddToPopUp(\"Delete\", idcmdDelete, writable && !sel.Empty());\n\t\tAddToPopUp(\"\");\n\t\tAddToPopUp(\"Select All\", idcmdSelectAll);\n\t\tpopup.Show(pt, wMain);\n\t}\n}\n\nvoid ScintillaBase::CancelModes() {\n\tAutoCompleteCancel();\n\tct.CallTipCancel();\n\tEditor::CancelModes();\n}\n\nvoid ScintillaBase::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) {\n\tCancelModes();\n\tEditor::ButtonDown(pt, curTime, shift, ctrl, alt);\n}\n\n#ifdef SCI_LEXER\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nclass LexState : public LexInterface {\n\tconst LexerModule *lexCurrent;\n\tvoid SetLexerModule(const LexerModule *lex);\n\tPropSetSimple props;\n\tint interfaceVersion;\npublic:\n\tint lexLanguage;\n\n\tLexState(Document *pdoc_);\n\tvirtual ~LexState();\n\tvoid SetLexer(uptr_t wParam);\n\tvoid SetLexerLanguage(const char *languageName);\n\tconst char *DescribeWordListSets();\n\tvoid SetWordList(int n, const char *wl);\n\tint GetStyleBitsNeeded() const;\n\tconst char *GetName() const;\n\tvoid *PrivateCall(int operation, void *pointer);\n\tconst char *PropertyNames();\n\tint PropertyType(const char *name);\n\tconst char *DescribeProperty(const char *name);\n\tvoid PropSet(const char *key, const char *val);\n\tconst char *PropGet(const char *key) const;\n\tint PropGetInt(const char *key, int defaultValue=0) const;\n\tint PropGetExpanded(const char *key, char *result) const;\n\n\tint LineEndTypesSupported();\n\tint AllocateSubStyles(int styleBase, int numberStyles);\n\tint SubStylesStart(int styleBase);\n\tint SubStylesLength(int styleBase);\n\tint StyleFromSubStyle(int subStyle);\n\tint PrimaryStyleFromStyle(int style);\n\tvoid FreeSubStyles();\n\tvoid SetIdentifiers(int style, const char *identifiers);\n\tint DistanceToSecondaryStyles();\n\tconst char *GetSubStyleBases();\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\nLexState::LexState(Document *pdoc_) : LexInterface(pdoc_) {\n\tlexCurrent = 0;\n\tperformingStyle = false;\n\tinterfaceVersion = lvOriginal;\n\tlexLanguage = SCLEX_CONTAINER;\n}\n\nLexState::~LexState() {\n\tif (instance) {\n\t\tinstance->Release();\n\t\tinstance = 0;\n\t}\n}\n\nLexState *ScintillaBase::DocumentLexState() {\n\tif (!pdoc->pli) {\n\t\tpdoc->pli = new LexState(pdoc);\n\t}\n\treturn static_cast<LexState *>(pdoc->pli);\n}\n\nvoid LexState::SetLexerModule(const LexerModule *lex) {\n\tif (lex != lexCurrent) {\n\t\tif (instance) {\n\t\t\tinstance->Release();\n\t\t\tinstance = 0;\n\t\t}\n\t\tinterfaceVersion = lvOriginal;\n\t\tlexCurrent = lex;\n\t\tif (lexCurrent) {\n\t\t\tinstance = lexCurrent->Create();\n\t\t\tinterfaceVersion = instance->Version();\n\t\t}\n\t\tpdoc->LexerChanged();\n\t}\n}\n\nvoid LexState::SetLexer(uptr_t wParam) {\n\tlexLanguage = wParam;\n\tif (lexLanguage == SCLEX_CONTAINER) {\n\t\tSetLexerModule(0);\n\t} else {\n\t\tconst LexerModule *lex = Catalogue::Find(lexLanguage);\n\t\tif (!lex)\n\t\t\tlex = Catalogue::Find(SCLEX_NULL);\n\t\tSetLexerModule(lex);\n\t}\n}\n\nvoid LexState::SetLexerLanguage(const char *languageName) {\n\tconst LexerModule *lex = Catalogue::Find(languageName);\n\tif (!lex)\n\t\tlex = Catalogue::Find(SCLEX_NULL);\n\tif (lex)\n\t\tlexLanguage = lex->GetLanguage();\n\tSetLexerModule(lex);\n}\n\nconst char *LexState::DescribeWordListSets() {\n\tif (instance) {\n\t\treturn instance->DescribeWordListSets();\n\t} else {\n\t\treturn 0;\n\t}\n}\n\nvoid LexState::SetWordList(int n, const char *wl) {\n\tif (instance) {\n\t\tint firstModification = instance->WordListSet(n, wl);\n\t\tif (firstModification >= 0) {\n\t\t\tpdoc->ModifiedAt(firstModification);\n\t\t}\n\t}\n}\n\nint LexState::GetStyleBitsNeeded() const {\n\treturn lexCurrent ? lexCurrent->GetStyleBitsNeeded() : 5;\n}\n\nconst char *LexState::GetName() const {\n\treturn lexCurrent ? lexCurrent->languageName : \"\";\n}\n\nvoid *LexState::PrivateCall(int operation, void *pointer) {\n\tif (pdoc && instance) {\n\t\treturn instance->PrivateCall(operation, pointer);\n\t} else {\n\t\treturn 0;\n\t}\n}\n\nconst char *LexState::PropertyNames() {\n\tif (instance) {\n\t\treturn instance->PropertyNames();\n\t} else {\n\t\treturn 0;\n\t}\n}\n\nint LexState::PropertyType(const char *name) {\n\tif (instance) {\n\t\treturn instance->PropertyType(name);\n\t} else {\n\t\treturn SC_TYPE_BOOLEAN;\n\t}\n}\n\nconst char *LexState::DescribeProperty(const char *name) {\n\tif (instance) {\n\t\treturn instance->DescribeProperty(name);\n\t} else {\n\t\treturn 0;\n\t}\n}\n\nvoid LexState::PropSet(const char *key, const char *val) {\n\tprops.Set(key, val);\n\tif (instance) {\n\t\tint firstModification = instance->PropertySet(key, val);\n\t\tif (firstModification >= 0) {\n\t\t\tpdoc->ModifiedAt(firstModification);\n\t\t}\n\t}\n}\n\nconst char *LexState::PropGet(const char *key) const {\n\treturn props.Get(key);\n}\n\nint LexState::PropGetInt(const char *key, int defaultValue) const {\n\treturn props.GetInt(key, defaultValue);\n}\n\nint LexState::PropGetExpanded(const char *key, char *result) const {\n\treturn props.GetExpanded(key, result);\n}\n\nint LexState::LineEndTypesSupported() {\n\tif (instance && (interfaceVersion >= lvSubStyles)) {\n\t\treturn static_cast<ILexerWithSubStyles *>(instance)->LineEndTypesSupported();\n\t}\n\treturn 0;\n}\n\nint LexState::AllocateSubStyles(int styleBase, int numberStyles) {\n\tif (instance && (interfaceVersion >= lvSubStyles)) {\n\t\treturn static_cast<ILexerWithSubStyles *>(instance)->AllocateSubStyles(styleBase, numberStyles);\n\t}\n\treturn -1;\n}\n\nint LexState::SubStylesStart(int styleBase) {\n\tif (instance && (interfaceVersion >= lvSubStyles)) {\n\t\treturn static_cast<ILexerWithSubStyles *>(instance)->SubStylesStart(styleBase);\n\t}\n\treturn -1;\n}\n\nint LexState::SubStylesLength(int styleBase) {\n\tif (instance && (interfaceVersion >= lvSubStyles)) {\n\t\treturn static_cast<ILexerWithSubStyles *>(instance)->SubStylesLength(styleBase);\n\t}\n\treturn 0;\n}\n\nint LexState::StyleFromSubStyle(int subStyle) {\n\tif (instance && (interfaceVersion >= lvSubStyles)) {\n\t\treturn static_cast<ILexerWithSubStyles *>(instance)->StyleFromSubStyle(subStyle);\n\t}\n\treturn 0;\n}\n\nint LexState::PrimaryStyleFromStyle(int style) {\n\tif (instance && (interfaceVersion >= lvSubStyles)) {\n\t\treturn static_cast<ILexerWithSubStyles *>(instance)->PrimaryStyleFromStyle(style);\n\t}\n\treturn 0;\n}\n\nvoid LexState::FreeSubStyles() {\n\tif (instance && (interfaceVersion >= lvSubStyles)) {\n\t\tstatic_cast<ILexerWithSubStyles *>(instance)->FreeSubStyles();\n\t}\n}\n\nvoid LexState::SetIdentifiers(int style, const char *identifiers) {\n\tif (instance && (interfaceVersion >= lvSubStyles)) {\n\t\tstatic_cast<ILexerWithSubStyles *>(instance)->SetIdentifiers(style, identifiers);\n\t}\n}\n\nint LexState::DistanceToSecondaryStyles() {\n\tif (instance && (interfaceVersion >= lvSubStyles)) {\n\t\treturn static_cast<ILexerWithSubStyles *>(instance)->DistanceToSecondaryStyles();\n\t}\n\treturn 0;\n}\n\nconst char *LexState::GetSubStyleBases() {\n\tif (instance && (interfaceVersion >= lvSubStyles)) {\n\t\treturn static_cast<ILexerWithSubStyles *>(instance)->GetSubStyleBases();\n\t}\n\treturn \"\";\n}\n\n#endif\n\nvoid ScintillaBase::NotifyStyleToNeeded(int endStyleNeeded) {\n#ifdef SCI_LEXER\n\tif (DocumentLexState()->lexLanguage != SCLEX_CONTAINER) {\n\t\tint lineEndStyled = pdoc->LineFromPosition(pdoc->GetEndStyled());\n\t\tint endStyled = pdoc->LineStart(lineEndStyled);\n\t\tDocumentLexState()->Colourise(endStyled, endStyleNeeded);\n\t\treturn;\n\t}\n#endif\n\tEditor::NotifyStyleToNeeded(endStyleNeeded);\n}\n\nvoid ScintillaBase::NotifyLexerChanged(Document *, void *) {\n#ifdef SCI_LEXER\n\tint bits = DocumentLexState()->GetStyleBitsNeeded();\n\tvs.EnsureStyle((1 << bits) - 1);\n#endif\n}\n\nsptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {\n\tswitch (iMessage) {\n\tcase SCI_AUTOCSHOW:\n\t\tlistType = 0;\n\t\tAutoCompleteStart(wParam, reinterpret_cast<const char *>(lParam));\n\t\tbreak;\n\n\tcase SCI_AUTOCCANCEL:\n\t\tac.Cancel();\n\t\tbreak;\n\n\tcase SCI_AUTOCACTIVE:\n\t\treturn ac.Active();\n\n\tcase SCI_AUTOCPOSSTART:\n\t\treturn ac.posStart;\n\n\tcase SCI_AUTOCCOMPLETE:\n\t\tAutoCompleteCompleted();\n\t\tbreak;\n\n\tcase SCI_AUTOCSETSEPARATOR:\n\t\tac.SetSeparator(static_cast<char>(wParam));\n\t\tbreak;\n\n\tcase SCI_AUTOCGETSEPARATOR:\n\t\treturn ac.GetSeparator();\n\n\tcase SCI_AUTOCSTOPS:\n\t\tac.SetStopChars(reinterpret_cast<char *>(lParam));\n\t\tbreak;\n\n\tcase SCI_AUTOCSELECT:\n\t\tac.Select(reinterpret_cast<char *>(lParam));\n\t\tbreak;\n\n\tcase SCI_AUTOCGETCURRENT:\n\t\treturn AutoCompleteGetCurrent();\n\n\tcase SCI_AUTOCGETCURRENTTEXT:\n\t\treturn AutoCompleteGetCurrentText(reinterpret_cast<char *>(lParam));\n\n\tcase SCI_AUTOCSETCANCELATSTART:\n\t\tac.cancelAtStartPos = wParam != 0;\n\t\tbreak;\n\n\tcase SCI_AUTOCGETCANCELATSTART:\n\t\treturn ac.cancelAtStartPos;\n\n\tcase SCI_AUTOCSETFILLUPS:\n\t\tac.SetFillUpChars(reinterpret_cast<char *>(lParam));\n\t\tbreak;\n\n\tcase SCI_AUTOCSETCHOOSESINGLE:\n\t\tac.chooseSingle = wParam != 0;\n\t\tbreak;\n\n\tcase SCI_AUTOCGETCHOOSESINGLE:\n\t\treturn ac.chooseSingle;\n\n\tcase SCI_AUTOCSETIGNORECASE:\n\t\tac.ignoreCase = wParam != 0;\n\t\tbreak;\n\n\tcase SCI_AUTOCGETIGNORECASE:\n\t\treturn ac.ignoreCase;\n\n\tcase SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR:\n\t\tac.ignoreCaseBehaviour = wParam;\n\t\tbreak;\n\n\tcase SCI_AUTOCGETCASEINSENSITIVEBEHAVIOUR:\n\t\treturn ac.ignoreCaseBehaviour;\n\n\tcase SCI_AUTOCSETORDER:\n\t\tac.autoSort = wParam;\n\t\tbreak;\n\n\tcase SCI_AUTOCGETORDER:\n\t\treturn ac.autoSort;\n\n\tcase SCI_USERLISTSHOW:\n\t\tlistType = wParam;\n\t\tAutoCompleteStart(0, reinterpret_cast<const char *>(lParam));\n\t\tbreak;\n\n\tcase SCI_AUTOCSETAUTOHIDE:\n\t\tac.autoHide = wParam != 0;\n\t\tbreak;\n\n\tcase SCI_AUTOCGETAUTOHIDE:\n\t\treturn ac.autoHide;\n\n\tcase SCI_AUTOCSETDROPRESTOFWORD:\n\t\tac.dropRestOfWord = wParam != 0;\n\t\tbreak;\n\n\tcase SCI_AUTOCGETDROPRESTOFWORD:\n\t\treturn ac.dropRestOfWord;\n\n\tcase SCI_AUTOCSETMAXHEIGHT:\n\t\tac.lb->SetVisibleRows(wParam);\n\t\tbreak;\n\n\tcase SCI_AUTOCGETMAXHEIGHT:\n\t\treturn ac.lb->GetVisibleRows();\n\n\tcase SCI_AUTOCSETMAXWIDTH:\n\t\tmaxListWidth = wParam;\n\t\tbreak;\n\n\tcase SCI_AUTOCGETMAXWIDTH:\n\t\treturn maxListWidth;\n\n\tcase SCI_REGISTERIMAGE:\n\t\tac.lb->RegisterImage(wParam, reinterpret_cast<const char *>(lParam));\n\t\tbreak;\n\n\tcase SCI_REGISTERRGBAIMAGE:\n\t\tac.lb->RegisterRGBAImage(wParam, sizeRGBAImage.x, sizeRGBAImage.y, reinterpret_cast<unsigned char *>(lParam));\n\t\tbreak;\n\n\tcase SCI_CLEARREGISTEREDIMAGES:\n\t\tac.lb->ClearRegisteredImages();\n\t\tbreak;\n\n\tcase SCI_AUTOCSETTYPESEPARATOR:\n\t\tac.SetTypesep(static_cast<char>(wParam));\n\t\tbreak;\n\n\tcase SCI_AUTOCGETTYPESEPARATOR:\n\t\treturn ac.GetTypesep();\n\n\tcase SCI_CALLTIPSHOW:\n\t\tCallTipShow(LocationFromPosition(wParam),\n\t\t\treinterpret_cast<const char *>(lParam));\n\t\tbreak;\n\n\tcase SCI_CALLTIPCANCEL:\n\t\tct.CallTipCancel();\n\t\tbreak;\n\n\tcase SCI_CALLTIPACTIVE:\n\t\treturn ct.inCallTipMode;\n\n\tcase SCI_CALLTIPPOSSTART:\n\t\treturn ct.posStartCallTip;\n\n\tcase SCI_CALLTIPSETHLT:\n\t\tct.SetHighlight(wParam, lParam);\n\t\tbreak;\n\n\tcase SCI_CALLTIPSETBACK:\n\t\tct.colourBG = ColourDesired(wParam);\n\t\tvs.styles[STYLE_CALLTIP].back = ct.colourBG;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_CALLTIPSETFORE:\n\t\tct.colourUnSel = ColourDesired(wParam);\n\t\tvs.styles[STYLE_CALLTIP].fore = ct.colourUnSel;\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_CALLTIPSETFOREHLT:\n\t\tct.colourSel = ColourDesired(wParam);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_CALLTIPUSESTYLE:\n\t\tct.SetTabSize((int)wParam);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_CALLTIPSETPOSITION:\n\t\tct.SetPosition(wParam != 0);\n\t\tInvalidateStyleRedraw();\n\t\tbreak;\n\n\tcase SCI_USEPOPUP:\n\t\tdisplayPopupMenu = wParam != 0;\n\t\tbreak;\n\n#ifdef SCI_LEXER\n\tcase SCI_SETLEXER:\n\t\tDocumentLexState()->SetLexer(wParam);\n\t\tbreak;\n\n\tcase SCI_GETLEXER:\n\t\treturn DocumentLexState()->lexLanguage;\n\n\tcase SCI_COLOURISE:\n\t\tif (DocumentLexState()->lexLanguage == SCLEX_CONTAINER) {\n\t\t\tpdoc->ModifiedAt(wParam);\n\t\t\tNotifyStyleToNeeded((lParam == -1) ? pdoc->Length() : lParam);\n\t\t} else {\n\t\t\tDocumentLexState()->Colourise(wParam, lParam);\n\t\t}\n\t\tRedraw();\n\t\tbreak;\n\n\tcase SCI_SETPROPERTY:\n\t\tDocumentLexState()->PropSet(reinterpret_cast<const char *>(wParam),\n\t\t          reinterpret_cast<const char *>(lParam));\n\t\tbreak;\n\n\tcase SCI_GETPROPERTY:\n\t\treturn StringResult(lParam, DocumentLexState()->PropGet(reinterpret_cast<const char *>(wParam)));\n\n\tcase SCI_GETPROPERTYEXPANDED:\n\t\treturn DocumentLexState()->PropGetExpanded(reinterpret_cast<const char *>(wParam),\n\t\t\treinterpret_cast<char *>(lParam));\n\n\tcase SCI_GETPROPERTYINT:\n\t\treturn DocumentLexState()->PropGetInt(reinterpret_cast<const char *>(wParam), lParam);\n\n\tcase SCI_SETKEYWORDS:\n\t\tDocumentLexState()->SetWordList(wParam, reinterpret_cast<const char *>(lParam));\n\t\tbreak;\n\n\tcase SCI_SETLEXERLANGUAGE:\n\t\tDocumentLexState()->SetLexerLanguage(reinterpret_cast<const char *>(lParam));\n\t\tbreak;\n\n\tcase SCI_GETLEXERLANGUAGE:\n\t\treturn StringResult(lParam, DocumentLexState()->GetName());\n\n\tcase SCI_PRIVATELEXERCALL:\n\t\treturn reinterpret_cast<sptr_t>(\n\t\t\tDocumentLexState()->PrivateCall(wParam, reinterpret_cast<void *>(lParam)));\n\n\tcase SCI_GETSTYLEBITSNEEDED:\n\t\treturn DocumentLexState()->GetStyleBitsNeeded();\n\n\tcase SCI_PROPERTYNAMES:\n\t\treturn StringResult(lParam, DocumentLexState()->PropertyNames());\n\n\tcase SCI_PROPERTYTYPE:\n\t\treturn DocumentLexState()->PropertyType(reinterpret_cast<const char *>(wParam));\n\n\tcase SCI_DESCRIBEPROPERTY:\n\t\treturn StringResult(lParam, DocumentLexState()->DescribeProperty(reinterpret_cast<const char *>(wParam)));\n\n\tcase SCI_DESCRIBEKEYWORDSETS:\n\t\treturn StringResult(lParam, DocumentLexState()->DescribeWordListSets());\n\n\tcase SCI_GETLINEENDTYPESSUPPORTED:\n\t\treturn DocumentLexState()->LineEndTypesSupported();\n\n\tcase SCI_ALLOCATESUBSTYLES:\n\t\treturn DocumentLexState()->AllocateSubStyles(wParam, lParam);\n\n\tcase SCI_GETSUBSTYLESSTART:\n\t\treturn DocumentLexState()->SubStylesStart(wParam);\n\n\tcase SCI_GETSUBSTYLESLENGTH:\n\t\treturn DocumentLexState()->SubStylesLength(wParam);\n\n\tcase SCI_GETSTYLEFROMSUBSTYLE:\n\t\treturn DocumentLexState()->StyleFromSubStyle(wParam);\n\n\tcase SCI_GETPRIMARYSTYLEFROMSTYLE:\n\t\treturn DocumentLexState()->PrimaryStyleFromStyle(wParam);\n\n\tcase SCI_FREESUBSTYLES:\n\t\tDocumentLexState()->FreeSubStyles();\n\t\tbreak;\n\n\tcase SCI_SETIDENTIFIERS:\n\t\tDocumentLexState()->SetIdentifiers(wParam, reinterpret_cast<const char *>(lParam));\n\t\tbreak;\n\n\tcase SCI_DISTANCETOSECONDARYSTYLES:\n\t\treturn DocumentLexState()->DistanceToSecondaryStyles();\n\n\tcase SCI_GETSUBSTYLEBASES:\n\t\treturn StringResult(lParam, DocumentLexState()->GetSubStyleBases());\n#endif\n\n\tdefault:\n\t\treturn Editor::WndProc(iMessage, wParam, lParam);\n\t}\n\treturn 0l;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/ScintillaBase.h",
    "content": "// Scintilla source code edit control\n/** @file ScintillaBase.h\n ** Defines an enhanced subclass of Editor with calltips, autocomplete and context menu.\n **/\n// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef SCINTILLABASE_H\n#define SCINTILLABASE_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n#ifdef SCI_LEXER\nclass LexState;\n#endif\n\n/**\n */\nclass ScintillaBase : public Editor {\n\t// Private so ScintillaBase objects can not be copied\n\tScintillaBase(const ScintillaBase &);\n\tScintillaBase &operator=(const ScintillaBase &);\n\nprotected:\n\t/** Enumeration of commands and child windows. */\n\tenum {\n\t\tidCallTip=1,\n\t\tidAutoComplete=2,\n\n\t\tidcmdUndo=10,\n\t\tidcmdRedo=11,\n\t\tidcmdCut=12,\n\t\tidcmdCopy=13,\n\t\tidcmdPaste=14,\n\t\tidcmdDelete=15,\n\t\tidcmdSelectAll=16\n\t};\n\n\tbool displayPopupMenu;\n\tMenu popup;\n\tAutoComplete ac;\n\n\tCallTip ct;\n\n\tint listType;\t\t\t///< 0 is an autocomplete list\n\tint maxListWidth;\t\t/// Maximum width of list, in average character widths\n\n#ifdef SCI_LEXER\n\tLexState *DocumentLexState();\n\tvoid SetLexer(uptr_t wParam);\n\tvoid SetLexerLanguage(const char *languageName);\n\tvoid Colourise(int start, int end);\n#endif\n\n\tScintillaBase();\n\tvirtual ~ScintillaBase();\n\tvirtual void Initialise() = 0;\n\tvirtual void Finalise();\n\n\tvirtual void AddCharUTF(char *s, unsigned int len, bool treatAsDBCS=false);\n\tvoid Command(int cmdId);\n\tvirtual void CancelModes();\n\tvirtual int KeyCommand(unsigned int iMessage);\n\n\tvoid AutoCompleteInsert(Position startPos, int removeLen, const char *text, int textLen);\n\tvoid AutoCompleteStart(int lenEntered, const char *list);\n\tvoid AutoCompleteCancel();\n\tvoid AutoCompleteMove(int delta);\n\tint AutoCompleteGetCurrent() const;\n\tint AutoCompleteGetCurrentText(char *buffer) const;\n\tvoid AutoCompleteCharacterAdded(char ch);\n\tvoid AutoCompleteCharacterDeleted();\n\tvoid AutoCompleteCompleted();\n\tvoid AutoCompleteMoveToCurrentWord();\n\tstatic void AutoCompleteDoubleClick(void *p);\n\n\tvoid CallTipClick();\n\tvoid CallTipShow(Point pt, const char *defn);\n\tvirtual void CreateCallTipWindow(PRectangle rc) = 0;\n\n\tvirtual void AddToPopUp(const char *label, int cmd=0, bool enabled=true) = 0;\n\tvoid ContextMenu(Point pt);\n\n\tvirtual void ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt);\n\n\tvoid NotifyStyleToNeeded(int endStyleNeeded);\n\tvoid NotifyLexerChanged(Document *doc, void *userData);\n\npublic:\n\t// Public so scintilla_send_message can use it\n\tvirtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam);\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/Selection.cpp",
    "content": "// Scintilla source code edit control\n/** @file Selection.cxx\n ** Classes maintaining the selection.\n **/\n// Copyright 2009 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n\n#include <vector>\n#include <algorithm>\n\n#include \"Platform.h\"\n\n#include \"Scintilla.h\"\n\n#include \"Selection.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nvoid SelectionPosition::MoveForInsertDelete(bool insertion, int startChange, int length) {\n\tif (insertion) {\n\t\tif (position == startChange) {\n\t\t\tint virtualLengthRemove = std::min(length, virtualSpace);\n\t\t\tvirtualSpace -= virtualLengthRemove;\n\t\t\tposition += virtualLengthRemove;\n\t\t} else if (position > startChange) {\n\t\t\tposition += length;\n\t\t}\n\t} else {\n\t\tif (position == startChange) {\n\t\t\tvirtualSpace = 0;\n\t\t}\n\t\tif (position > startChange) {\n\t\t\tint endDeletion = startChange + length;\n\t\t\tif (position > endDeletion) {\n\t\t\t\tposition -= length;\n\t\t\t} else {\n\t\t\t\tposition = startChange;\n\t\t\t\tvirtualSpace = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nbool SelectionPosition::operator <(const SelectionPosition &other) const {\n\tif (position == other.position)\n\t\treturn virtualSpace < other.virtualSpace;\n\telse\n\t\treturn position < other.position;\n}\n\nbool SelectionPosition::operator >(const SelectionPosition &other) const {\n\tif (position == other.position)\n\t\treturn virtualSpace > other.virtualSpace;\n\telse\n\t\treturn position > other.position;\n}\n\nbool SelectionPosition::operator <=(const SelectionPosition &other) const {\n\tif (position == other.position && virtualSpace == other.virtualSpace)\n\t\treturn true;\n\telse\n\t\treturn other > *this;\n}\n\nbool SelectionPosition::operator >=(const SelectionPosition &other) const {\n\tif (position == other.position && virtualSpace == other.virtualSpace)\n\t\treturn true;\n\telse\n\t\treturn *this > other;\n}\n\nint SelectionRange::Length() const {\n\tif (anchor > caret) {\n\t\treturn anchor.Position() - caret.Position();\n\t} else {\n\t\treturn caret.Position() - anchor.Position();\n\t}\n}\n\nbool SelectionRange::Contains(int pos) const {\n\tif (anchor > caret)\n\t\treturn (pos >= caret.Position()) && (pos <= anchor.Position());\n\telse\n\t\treturn (pos >= anchor.Position()) && (pos <= caret.Position());\n}\n\nbool SelectionRange::Contains(SelectionPosition sp) const {\n\tif (anchor > caret)\n\t\treturn (sp >= caret) && (sp <= anchor);\n\telse\n\t\treturn (sp >= anchor) && (sp <= caret);\n}\n\nbool SelectionRange::ContainsCharacter(int posCharacter) const {\n\tif (anchor > caret)\n\t\treturn (posCharacter >= caret.Position()) && (posCharacter < anchor.Position());\n\telse\n\t\treturn (posCharacter >= anchor.Position()) && (posCharacter < caret.Position());\n}\n\nSelectionSegment SelectionRange::Intersect(SelectionSegment check) const {\n\tSelectionSegment inOrder(caret, anchor);\n\tif ((inOrder.start <= check.end) || (inOrder.end >= check.start)) {\n\t\tSelectionSegment portion = check;\n\t\tif (portion.start < inOrder.start)\n\t\t\tportion.start = inOrder.start;\n\t\tif (portion.end > inOrder.end)\n\t\t\tportion.end = inOrder.end;\n\t\tif (portion.start > portion.end)\n\t\t\treturn SelectionSegment();\n\t\telse\n\t\t\treturn portion;\n\t} else {\n\t\treturn SelectionSegment();\n\t}\n}\n\nbool SelectionRange::Trim(SelectionRange range) {\n\tSelectionPosition startRange = range.Start();\n\tSelectionPosition endRange = range.End();\n\tSelectionPosition start = Start();\n\tSelectionPosition end = End();\n\tPLATFORM_ASSERT(start <= end);\n\tPLATFORM_ASSERT(startRange <= endRange);\n\tif ((startRange <= end) && (endRange >= start)) {\n\t\tif ((start > startRange) && (end < endRange)) {\n\t\t\t// Completely covered by range -> empty at start\n\t\t\tend = start;\n\t\t} else if ((start < startRange) && (end > endRange)) {\n\t\t\t// Completely covers range -> empty at start\n\t\t\tend = start;\n\t\t} else if (start <= startRange) {\n\t\t\t// Trim end\n\t\t\tend = startRange;\n\t\t} else { //\n\t\t\tPLATFORM_ASSERT(end >= endRange);\n\t\t\t// Trim start\n\t\t\tstart = endRange;\n\t\t}\n\t\tif (anchor > caret) {\n\t\t\tcaret = start;\n\t\t\tanchor = end;\n\t\t} else {\n\t\t\tanchor = start;\n\t\t\tcaret = end;\n\t\t}\n\t\treturn Empty();\n\t} else {\n\t\treturn false;\n\t}\n}\n\n// If range is all virtual collapse to start of virtual space\nvoid SelectionRange::MinimizeVirtualSpace() {\n\tif (caret.Position() == anchor.Position()) {\n\t\tint virtualSpace = caret.VirtualSpace();\n\t\tif (virtualSpace > anchor.VirtualSpace())\n\t\t\tvirtualSpace = anchor.VirtualSpace();\n\t\tcaret.SetVirtualSpace(virtualSpace);\n\t\tanchor.SetVirtualSpace(virtualSpace);\n\t}\n}\n\nSelection::Selection() : mainRange(0), moveExtends(false), tentativeMain(false), selType(selStream) {\n\tAddSelection(SelectionPosition(0));\n}\n\nSelection::~Selection() {\n}\n\nbool Selection::IsRectangular() const {\n\treturn (selType == selRectangle) || (selType == selThin);\n}\n\nint Selection::MainCaret() const {\n\treturn ranges[mainRange].caret.Position();\n}\n\nint Selection::MainAnchor() const {\n\treturn ranges[mainRange].anchor.Position();\n}\n\nSelectionRange &Selection::Rectangular() {\n\treturn rangeRectangular;\n}\n\nSelectionSegment Selection::Limits() const {\n\tif (ranges.empty()) {\n\t\treturn SelectionSegment();\n\t} else {\n\t\tSelectionSegment sr(ranges[0].anchor, ranges[0].caret);\n\t\tfor (size_t i=1; i<ranges.size(); i++) {\n\t\t\tsr.Extend(ranges[i].anchor);\n\t\t\tsr.Extend(ranges[i].caret);\n\t\t}\n\t\treturn sr;\n\t}\n}\n\nSelectionSegment Selection::LimitsForRectangularElseMain() const {\n\tif (IsRectangular()) {\n\t\treturn Limits();\n\t} else {\n\t\treturn SelectionSegment(ranges[mainRange].caret, ranges[mainRange].anchor);\n\t}\n}\n\nsize_t Selection::Count() const {\n\treturn ranges.size();\n}\n\nsize_t Selection::Main() const {\n\treturn mainRange;\n}\n\nvoid Selection::SetMain(size_t r) {\n\tPLATFORM_ASSERT(r < ranges.size());\n\tmainRange = r;\n}\n\nSelectionRange &Selection::Range(size_t r) {\n\treturn ranges[r];\n}\n\nSelectionRange &Selection::RangeMain() {\n\treturn ranges[mainRange];\n}\n\nbool Selection::MoveExtends() const {\n\treturn moveExtends;\n}\n\nvoid Selection::SetMoveExtends(bool moveExtends_) {\n\tmoveExtends = moveExtends_;\n}\n\nbool Selection::Empty() const {\n\tfor (size_t i=0; i<ranges.size(); i++) {\n\t\tif (!ranges[i].Empty())\n\t\t\treturn false;\n\t}\n\treturn true;\n}\n\nSelectionPosition Selection::Last() const {\n\tSelectionPosition lastPosition;\n\tfor (size_t i=0; i<ranges.size(); i++) {\n\t\tif (lastPosition < ranges[i].caret)\n\t\t\tlastPosition = ranges[i].caret;\n\t\tif (lastPosition < ranges[i].anchor)\n\t\t\tlastPosition = ranges[i].anchor;\n\t}\n\treturn lastPosition;\n}\n\nint Selection::Length() const {\n\tint len = 0;\n\tfor (size_t i=0; i<ranges.size(); i++) {\n\t\tlen += ranges[i].Length();\n\t}\n\treturn len;\n}\n\nvoid Selection::MovePositions(bool insertion, int startChange, int length) {\n\tfor (size_t i=0; i<ranges.size(); i++) {\n\t\tranges[i].caret.MoveForInsertDelete(insertion, startChange, length);\n\t\tranges[i].anchor.MoveForInsertDelete(insertion, startChange, length);\n\t}\n}\n\nvoid Selection::TrimSelection(SelectionRange range) {\n\tfor (size_t i=0; i<ranges.size();) {\n\t\tif ((i != mainRange) && (ranges[i].Trim(range))) {\n\t\t\t// Trimmed to empty so remove\n\t\t\tfor (size_t j=i; j<ranges.size()-1; j++) {\n\t\t\t\tranges[j] = ranges[j+1];\n\t\t\t\tif (j == mainRange-1)\n\t\t\t\t\tmainRange--;\n\t\t\t}\n\t\t\tranges.pop_back();\n\t\t} else {\n\t\t\ti++;\n\t\t}\n\t}\n}\n\nvoid Selection::SetSelection(SelectionRange range) {\n\tranges.clear();\n\tranges.push_back(range);\n\tmainRange = ranges.size() - 1;\n}\n\nvoid Selection::AddSelection(SelectionRange range) {\n\tTrimSelection(range);\n\tranges.push_back(range);\n\tmainRange = ranges.size() - 1;\n}\n\nvoid Selection::AddSelectionWithoutTrim(SelectionRange range) {\n\tranges.push_back(range);\n\tmainRange = ranges.size() - 1;\n}\n\nvoid Selection::TentativeSelection(SelectionRange range) {\n\tif (!tentativeMain) {\n\t\trangesSaved = ranges;\n\t}\n\tranges = rangesSaved;\n\tAddSelection(range);\n\tTrimSelection(ranges[mainRange]);\n\ttentativeMain = true;\n}\n\nvoid Selection::CommitTentative() {\n\trangesSaved.clear();\n\ttentativeMain = false;\n}\n\nint Selection::CharacterInSelection(int posCharacter) const {\n\tfor (size_t i=0; i<ranges.size(); i++) {\n\t\tif (ranges[i].ContainsCharacter(posCharacter))\n\t\t\treturn i == mainRange ? 1 : 2;\n\t}\n\treturn 0;\n}\n\nint Selection::InSelectionForEOL(int pos) const {\n\tfor (size_t i=0; i<ranges.size(); i++) {\n\t\tif (!ranges[i].Empty() && (pos > ranges[i].Start().Position()) && (pos <= ranges[i].End().Position()))\n\t\t\treturn i == mainRange ? 1 : 2;\n\t}\n\treturn 0;\n}\n\nint Selection::VirtualSpaceFor(int pos) const {\n\tint virtualSpace = 0;\n\tfor (size_t i=0; i<ranges.size(); i++) {\n\t\tif ((ranges[i].caret.Position() == pos) && (virtualSpace < ranges[i].caret.VirtualSpace()))\n\t\t\tvirtualSpace = ranges[i].caret.VirtualSpace();\n\t\tif ((ranges[i].anchor.Position() == pos) && (virtualSpace < ranges[i].anchor.VirtualSpace()))\n\t\t\tvirtualSpace = ranges[i].anchor.VirtualSpace();\n\t}\n\treturn virtualSpace;\n}\n\nvoid Selection::Clear() {\n\tranges.clear();\n\tranges.push_back(SelectionRange());\n\tmainRange = ranges.size() - 1;\n\tselType = selStream;\n\tmoveExtends = false;\n\tranges[mainRange].Reset();\n\trangeRectangular.Reset();\n}\n\nvoid Selection::RemoveDuplicates() {\n\tfor (size_t i=0; i<ranges.size()-1; i++) {\n\t\tif (ranges[i].Empty()) {\n\t\t\tsize_t j=i+1;\n\t\t\twhile (j<ranges.size()) {\n\t\t\t\tif (ranges[i] == ranges[j]) {\n\t\t\t\t\tranges.erase(ranges.begin() + j);\n\t\t\t\t\tif (mainRange >= j)\n\t\t\t\t\t\tmainRange--;\n\t\t\t\t} else {\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid Selection::RotateMain() {\n\tmainRange = (mainRange + 1) % ranges.size();\n}\n\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/Selection.h",
    "content": "// Scintilla source code edit control\n/** @file Selection.h\n ** Classes maintaining the selection.\n **/\n// Copyright 2009 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef SELECTION_H\n#define SELECTION_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nclass SelectionPosition {\n\tint position;\n\tint virtualSpace;\npublic:\n\texplicit SelectionPosition(int position_=INVALID_POSITION, int virtualSpace_=0) : position(position_), virtualSpace(virtualSpace_) {\n\t\tPLATFORM_ASSERT(virtualSpace < 800000);\n\t\tif (virtualSpace < 0)\n\t\t\tvirtualSpace = 0;\n\t}\n\tvoid Reset() {\n\t\tposition = 0;\n\t\tvirtualSpace = 0;\n\t}\n\tvoid MoveForInsertDelete(bool insertion, int startChange, int length);\n\tbool operator ==(const SelectionPosition &other) const {\n\t\treturn position == other.position && virtualSpace == other.virtualSpace;\n\t}\n\tbool operator <(const SelectionPosition &other) const;\n\tbool operator >(const SelectionPosition &other) const;\n\tbool operator <=(const SelectionPosition &other) const;\n\tbool operator >=(const SelectionPosition &other) const;\n\tint Position() const {\n\t\treturn position;\n\t}\n\tvoid SetPosition(int position_) {\n\t\tposition = position_;\n\t\tvirtualSpace = 0;\n\t}\n\tint VirtualSpace() const {\n\t\treturn virtualSpace;\n\t}\n\tvoid SetVirtualSpace(int virtualSpace_) {\n\t\tPLATFORM_ASSERT(virtualSpace_ < 800000);\n\t\tif (virtualSpace_ >= 0)\n\t\t\tvirtualSpace = virtualSpace_;\n\t}\n\tvoid Add(int increment) {\n\t\tposition = position + increment;\n\t}\n\tbool IsValid() const {\n\t\treturn position >= 0;\n\t}\n};\n\n// Ordered range to make drawing simpler\nstruct SelectionSegment {\n\tSelectionPosition start;\n\tSelectionPosition end;\n\tSelectionSegment() : start(), end() {\n\t}\n\tSelectionSegment(SelectionPosition a, SelectionPosition b) {\n\t\tif (a < b) {\n\t\t\tstart = a;\n\t\t\tend = b;\n\t\t} else {\n\t\t\tstart = b;\n\t\t\tend = a;\n\t\t}\n\t}\n\tbool Empty() const {\n\t\treturn start == end;\n\t}\n\tvoid Extend(SelectionPosition p) {\n\t\tif (start > p)\n\t\t\tstart = p;\n\t\tif (end < p)\n\t\t\tend = p;\n\t}\n};\n\nstruct SelectionRange {\n\tSelectionPosition caret;\n\tSelectionPosition anchor;\n\n\tSelectionRange() : caret(), anchor() {\n\t}\n\tSelectionRange(SelectionPosition single) : caret(single), anchor(single) {\n\t}\n\tSelectionRange(int single) : caret(single), anchor(single) {\n\t}\n\tSelectionRange(SelectionPosition caret_, SelectionPosition anchor_) : caret(caret_), anchor(anchor_) {\n\t}\n\tSelectionRange(int caret_, int anchor_) : caret(caret_), anchor(anchor_) {\n\t}\n\tbool Empty() const {\n\t\treturn anchor == caret;\n\t}\n\tint Length() const;\n\t// int Width() const;\t// Like Length but takes virtual space into account\n\tbool operator ==(const SelectionRange &other) const {\n\t\treturn caret == other.caret && anchor == other.anchor;\n\t}\n\tbool operator <(const SelectionRange &other) const {\n\t\treturn caret < other.caret || ((caret == other.caret) && (anchor < other.anchor));\n\t}\n\tvoid Reset() {\n\t\tanchor.Reset();\n\t\tcaret.Reset();\n\t}\n\tvoid ClearVirtualSpace() {\n\t\tanchor.SetVirtualSpace(0);\n\t\tcaret.SetVirtualSpace(0);\n\t}\n\tbool Contains(int pos) const;\n\tbool Contains(SelectionPosition sp) const;\n\tbool ContainsCharacter(int posCharacter) const;\n\tSelectionSegment Intersect(SelectionSegment check) const;\n\tSelectionPosition Start() const {\n\t\treturn (anchor < caret) ? anchor : caret;\n\t}\n\tSelectionPosition End() const {\n\t\treturn (anchor < caret) ? caret : anchor;\n\t}\n\tbool Trim(SelectionRange range);\n\t// If range is all virtual collapse to start of virtual space\n\tvoid MinimizeVirtualSpace();\n};\n\nclass Selection {\n\tstd::vector<SelectionRange> ranges;\n\tstd::vector<SelectionRange> rangesSaved;\n\tSelectionRange rangeRectangular;\n\tsize_t mainRange;\n\tbool moveExtends;\n\tbool tentativeMain;\npublic:\n\tenum selTypes { noSel, selStream, selRectangle, selLines, selThin };\n\tselTypes selType;\n\n\tSelection();\n\t~Selection();\n\tbool IsRectangular() const;\n\tint MainCaret() const;\n\tint MainAnchor() const;\n\tSelectionRange &Rectangular();\n\tSelectionSegment Limits() const;\n\t// This is for when you want to move the caret in response to a\n\t// user direction command - for rectangular selections, use the range\n\t// that covers all selected text otherwise return the main selection.\n\tSelectionSegment LimitsForRectangularElseMain() const;\n\tsize_t Count() const;\n\tsize_t Main() const;\n\tvoid SetMain(size_t r);\n\tSelectionRange &Range(size_t r);\n\tSelectionRange &RangeMain();\n\tbool MoveExtends() const;\n\tvoid SetMoveExtends(bool moveExtends_);\n\tbool Empty() const;\n\tSelectionPosition Last() const;\n\tint Length() const;\n\tvoid MovePositions(bool insertion, int startChange, int length);\n\tvoid TrimSelection(SelectionRange range);\n\tvoid SetSelection(SelectionRange range);\n\tvoid AddSelection(SelectionRange range);\n\tvoid AddSelectionWithoutTrim(SelectionRange range);\n\tvoid TentativeSelection(SelectionRange range);\n\tvoid CommitTentative();\n\tint CharacterInSelection(int posCharacter) const;\n\tint InSelectionForEOL(int pos) const;\n\tint VirtualSpaceFor(int pos) const;\n\tvoid Clear();\n\tvoid RemoveDuplicates();\n\tvoid RotateMain();\n\tbool Tentative() const { return tentativeMain; }\n\tstd::vector<SelectionRange> RangesCopy() const {\n\t\treturn ranges;\n\t}\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/SplitVector.h",
    "content": "// Scintilla source code edit control\n/** @file SplitVector.h\n ** Main data structure for holding arrays that handle insertions\n ** and deletions efficiently.\n **/\n// Copyright 1998-2007 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef SPLITVECTOR_H\n#define SPLITVECTOR_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\ntemplate <typename T>\nclass SplitVector {\nprotected:\n\tT *body;\n\tint size;\n\tint lengthBody;\n\tint part1Length;\n\tint gapLength;\t/// invariant: gapLength == size - lengthBody\n\tint growSize;\n\n\t/// Move the gap to a particular position so that insertion and\n\t/// deletion at that point will not require much copying and\n\t/// hence be fast.\n\tvoid GapTo(int position) {\n\t\tif (position != part1Length) {\n\t\t\tif (position < part1Length) {\n\t\t\t\tmemmove(\n\t\t\t\t\tbody + position + gapLength,\n\t\t\t\t\tbody + position,\n\t\t\t\t\tsizeof(T) * (part1Length - position));\n\t\t\t} else {\t// position > part1Length\n\t\t\t\tmemmove(\n\t\t\t\t\tbody + part1Length,\n\t\t\t\t\tbody + part1Length + gapLength,\n\t\t\t\t\tsizeof(T) * (position - part1Length));\n\t\t\t}\n\t\t\tpart1Length = position;\n\t\t}\n\t}\n\n\t/// Check that there is room in the buffer for an insertion,\n\t/// reallocating if more space needed.\n\tvoid RoomFor(int insertionLength) {\n\t\tif (gapLength <= insertionLength) {\n\t\t\twhile (growSize < size / 6)\n\t\t\t\tgrowSize *= 2;\n\t\t\tReAllocate(size + insertionLength + growSize);\n\t\t}\n\t}\n\n\tvoid Init() {\n\t\tbody = NULL;\n\t\tgrowSize = 8;\n\t\tsize = 0;\n\t\tlengthBody = 0;\n\t\tpart1Length = 0;\n\t\tgapLength = 0;\n\t}\n\npublic:\n\t/// Construct a split buffer.\n\tSplitVector() {\n\t\tInit();\n\t}\n\n\t~SplitVector() {\n\t\tdelete []body;\n\t\tbody = 0;\n\t}\n\n\tint GetGrowSize() const {\n\t\treturn growSize;\n\t}\n\n\tvoid SetGrowSize(int growSize_) {\n\t\tgrowSize = growSize_;\n\t}\n\n\t/// Reallocate the storage for the buffer to be newSize and\n\t/// copy exisiting contents to the new buffer.\n\t/// Must not be used to decrease the size of the buffer.\n\tvoid ReAllocate(int newSize) {\n\t\tif (newSize > size) {\n\t\t\t// Move the gap to the end\n\t\t\tGapTo(lengthBody);\n\t\t\tT *newBody = new T[newSize];\n\t\t\tif ((size != 0) && (body != 0)) {\n\t\t\t\tmemmove(newBody, body, sizeof(T) * lengthBody);\n\t\t\t\tdelete []body;\n\t\t\t}\n\t\t\tbody = newBody;\n\t\t\tgapLength += newSize - size;\n\t\t\tsize = newSize;\n\t\t}\n\t}\n\n\t/// Retrieve the character at a particular position.\n\t/// Retrieving positions outside the range of the buffer returns 0.\n\t/// The assertions here are disabled since calling code can be\n\t/// simpler if out of range access works and returns 0.\n\tT ValueAt(int position) const {\n\t\tif (position < part1Length) {\n\t\t\t//PLATFORM_ASSERT(position >= 0);\n\t\t\tif (position < 0) {\n\t\t\t\treturn 0;\n\t\t\t} else {\n\t\t\t\treturn body[position];\n\t\t\t}\n\t\t} else {\n\t\t\t//PLATFORM_ASSERT(position < lengthBody);\n\t\t\tif (position >= lengthBody) {\n\t\t\t\treturn 0;\n\t\t\t} else {\n\t\t\t\treturn body[gapLength + position];\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid SetValueAt(int position, T v) {\n\t\tif (position < part1Length) {\n\t\t\tPLATFORM_ASSERT(position >= 0);\n\t\t\tif (position < 0) {\n\t\t\t\t;\n\t\t\t} else {\n\t\t\t\tbody[position] = v;\n\t\t\t}\n\t\t} else {\n\t\t\tPLATFORM_ASSERT(position < lengthBody);\n\t\t\tif (position >= lengthBody) {\n\t\t\t\t;\n\t\t\t} else {\n\t\t\t\tbody[gapLength + position] = v;\n\t\t\t}\n\t\t}\n\t}\n\n\tT &operator[](int position) const {\n\t\tPLATFORM_ASSERT(position >= 0 && position < lengthBody);\n\t\tif (position < part1Length) {\n\t\t\treturn body[position];\n\t\t} else {\n\t\t\treturn body[gapLength + position];\n\t\t}\n\t}\n\n\t/// Retrieve the length of the buffer.\n\tint Length() const {\n\t\treturn lengthBody;\n\t}\n\n\t/// Insert a single value into the buffer.\n\t/// Inserting at positions outside the current range fails.\n\tvoid Insert(int position, T v) {\n\t\tPLATFORM_ASSERT((position >= 0) && (position <= lengthBody));\n\t\tif ((position < 0) || (position > lengthBody)) {\n\t\t\treturn;\n\t\t}\n\t\tRoomFor(1);\n\t\tGapTo(position);\n\t\tbody[part1Length] = v;\n\t\tlengthBody++;\n\t\tpart1Length++;\n\t\tgapLength--;\n\t}\n\n\t/// Insert a number of elements into the buffer setting their value.\n\t/// Inserting at positions outside the current range fails.\n\tvoid InsertValue(int position, int insertLength, T v) {\n\t\tPLATFORM_ASSERT((position >= 0) && (position <= lengthBody));\n\t\tif (insertLength > 0) {\n\t\t\tif ((position < 0) || (position > lengthBody)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tRoomFor(insertLength);\n\t\t\tGapTo(position);\n\t\t\tstd::fill(&body[part1Length], &body[part1Length + insertLength], v);\n\t\t\tlengthBody += insertLength;\n\t\t\tpart1Length += insertLength;\n\t\t\tgapLength -= insertLength;\n\t\t}\n\t}\n\n\t/// Ensure at least length elements allocated,\n\t/// appending zero valued elements if needed.\n\tvoid EnsureLength(int wantedLength) {\n\t\tif (Length() < wantedLength) {\n\t\t\tInsertValue(Length(), wantedLength - Length(), 0);\n\t\t}\n\t}\n\n\t/// Insert text into the buffer from an array.\n\tvoid InsertFromArray(int positionToInsert, const T s[], int positionFrom, int insertLength) {\n\t\tPLATFORM_ASSERT((positionToInsert >= 0) && (positionToInsert <= lengthBody));\n\t\tif (insertLength > 0) {\n\t\t\tif ((positionToInsert < 0) || (positionToInsert > lengthBody)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tRoomFor(insertLength);\n\t\t\tGapTo(positionToInsert);\n\t\t\tmemmove(body + part1Length, s + positionFrom, sizeof(T) * insertLength);\n\t\t\tlengthBody += insertLength;\n\t\t\tpart1Length += insertLength;\n\t\t\tgapLength -= insertLength;\n\t\t}\n\t}\n\n\t/// Delete one element from the buffer.\n\tvoid Delete(int position) {\n\t\tPLATFORM_ASSERT((position >= 0) && (position < lengthBody));\n\t\tif ((position < 0) || (position >= lengthBody)) {\n\t\t\treturn;\n\t\t}\n\t\tDeleteRange(position, 1);\n\t}\n\n\t/// Delete a range from the buffer.\n\t/// Deleting positions outside the current range fails.\n\tvoid DeleteRange(int position, int deleteLength) {\n\t\tPLATFORM_ASSERT((position >= 0) && (position + deleteLength <= lengthBody));\n\t\tif ((position < 0) || ((position + deleteLength) > lengthBody)) {\n\t\t\treturn;\n\t\t}\n\t\tif ((position == 0) && (deleteLength == lengthBody)) {\n\t\t\t// Full deallocation returns storage and is faster\n\t\t\tdelete []body;\n\t\t\tInit();\n\t\t} else if (deleteLength > 0) {\n\t\t\tGapTo(position);\n\t\t\tlengthBody -= deleteLength;\n\t\t\tgapLength += deleteLength;\n\t\t}\n\t}\n\n\t/// Delete all the buffer contents.\n\tvoid DeleteAll() {\n\t\tDeleteRange(0, lengthBody);\n\t}\n\n\t// Retrieve a range of elements into an array\n\tvoid GetRange(T *buffer, int position, int retrieveLength) const {\n\t\t// Split into up to 2 ranges, before and after the split then use memcpy on each.\n\t\tint range1Length = 0;\n\t\tif (position < part1Length) {\n\t\t\tint part1AfterPosition = part1Length - position;\n\t\t\trange1Length = retrieveLength;\n\t\t\tif (range1Length > part1AfterPosition)\n\t\t\t\trange1Length = part1AfterPosition;\n\t\t}\n\t\tmemcpy(buffer, body + position, range1Length * sizeof(T));\n\t\tbuffer += range1Length;\n\t\tposition = position + range1Length + gapLength;\n\t\tint range2Length = retrieveLength - range1Length;\n\t\tmemcpy(buffer, body + position, range2Length * sizeof(T));\n\t}\n\n\tT *BufferPointer() {\n\t\tRoomFor(1);\n\t\tGapTo(lengthBody);\n\t\tbody[lengthBody] = 0;\n\t\treturn body;\n\t}\n\n\tT *RangePointer(int position, int rangeLength) {\n\t\tif (position < part1Length) {\n\t\t\tif ((position + rangeLength) > part1Length) {\n\t\t\t\t// Range overlaps gap, so move gap to start of range.\n\t\t\t\tGapTo(position);\n\t\t\t\treturn body + position + gapLength;\n\t\t\t} else {\n\t\t\t\treturn body + position ;\n\t\t\t}\n\t\t} else {\n\t\t\treturn body + position + gapLength;\n\t\t}\n\t}\n\n\tint GapPosition() const {\n\t\treturn part1Length; \n\t}\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/Style.cpp",
    "content": "// Scintilla source code edit control\n/** @file Style.cxx\n ** Defines the font and colour style for a class of text.\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <string.h>\n\n#include \"Platform.h\"\n\n#include \"Scintilla.h\"\n#include \"Style.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nFontAlias::FontAlias() {\n}\n\nFontAlias::~FontAlias() {\n\tSetID(0);\n\t// ~Font will not release the actual font resource since it is now 0\n}\n\nvoid FontAlias::MakeAlias(Font &fontOrigin) {\n\tSetID(fontOrigin.GetID());\n}\n\nvoid FontAlias::ClearFont() {\n\tSetID(0);\n}\n\nbool FontSpecification::operator==(const FontSpecification &other) const {\n\treturn fontName == other.fontName &&\n\t       weight == other.weight &&\n\t       italic == other.italic &&\n\t       size == other.size &&\n\t       characterSet == other.characterSet &&\n\t       extraFontFlag == other.extraFontFlag;\n}\n\nbool FontSpecification::operator<(const FontSpecification &other) const {\n\tif (fontName != other.fontName)\n\t\treturn fontName < other.fontName;\n\tif (weight != other.weight)\n\t\treturn weight < other.weight;\n\tif (italic != other.italic)\n\t\treturn italic == false;\n\tif (size != other.size)\n\t\treturn size < other.size;\n\tif (characterSet != other.characterSet)\n\t\treturn characterSet < other.characterSet;\n\tif (extraFontFlag != other.extraFontFlag)\n\t\treturn extraFontFlag < other.extraFontFlag;\n\treturn false;\n}\n\nFontMeasurements::FontMeasurements() {\n\tClear();\n}\n\nvoid FontMeasurements::Clear() {\n\tascent = 1;\n\tdescent = 1;\n\taveCharWidth = 1;\n\tspaceWidth = 1;\n\tsizeZoomed = 2;\n}\n\nStyle::Style() : FontSpecification() {\n\tClear(ColourDesired(0, 0, 0), ColourDesired(0xff, 0xff, 0xff),\n\t      Platform::DefaultFontSize() * SC_FONT_SIZE_MULTIPLIER, 0, SC_CHARSET_DEFAULT,\n\t      SC_WEIGHT_NORMAL, false, false, false, caseMixed, true, true, false);\n}\n\nStyle::Style(const Style &source) : FontSpecification(), FontMeasurements() {\n\tClear(ColourDesired(0, 0, 0), ColourDesired(0xff, 0xff, 0xff),\n\t      0, 0, 0,\n\t      SC_WEIGHT_NORMAL, false, false, false, caseMixed, true, true, false);\n\tfore = source.fore;\n\tback = source.back;\n\tcharacterSet = source.characterSet;\n\tweight = source.weight;\n\titalic = source.italic;\n\tsize = source.size;\n\tfontName = source.fontName;\n\teolFilled = source.eolFilled;\n\tunderline = source.underline;\n\tcaseForce = source.caseForce;\n\tvisible = source.visible;\n\tchangeable = source.changeable;\n\thotspot = source.hotspot;\n}\n\nStyle::~Style() {\n}\n\nStyle &Style::operator=(const Style &source) {\n\tif (this == &source)\n\t\treturn * this;\n\tClear(ColourDesired(0, 0, 0), ColourDesired(0xff, 0xff, 0xff),\n\t      0, 0, SC_CHARSET_DEFAULT,\n\t      SC_WEIGHT_NORMAL, false, false, false, caseMixed, true, true, false);\n\tfore = source.fore;\n\tback = source.back;\n\tcharacterSet = source.characterSet;\n\tweight = source.weight;\n\titalic = source.italic;\n\tsize = source.size;\n\tfontName = source.fontName;\n\teolFilled = source.eolFilled;\n\tunderline = source.underline;\n\tcaseForce = source.caseForce;\n\tvisible = source.visible;\n\tchangeable = source.changeable;\n\treturn *this;\n}\n\nvoid Style::Clear(ColourDesired fore_, ColourDesired back_, int size_,\n        const char *fontName_, int characterSet_,\n        int weight_, bool italic_, bool eolFilled_,\n        bool underline_, ecaseForced caseForce_,\n        bool visible_, bool changeable_, bool hotspot_) {\n\tfore = fore_;\n\tback = back_;\n\tcharacterSet = characterSet_;\n\tweight = weight_;\n\titalic = italic_;\n\tsize = size_;\n\tfontName = fontName_;\n\teolFilled = eolFilled_;\n\tunderline = underline_;\n\tcaseForce = caseForce_;\n\tvisible = visible_;\n\tchangeable = changeable_;\n\thotspot = hotspot_;\n\tfont.ClearFont();\n\tFontMeasurements::Clear();\n}\n\nvoid Style::ClearTo(const Style &source) {\n\tClear(\n\t    source.fore,\n\t    source.back,\n\t    source.size,\n\t    source.fontName,\n\t    source.characterSet,\n\t    source.weight,\n\t    source.italic,\n\t    source.eolFilled,\n\t    source.underline,\n\t    source.caseForce,\n\t    source.visible,\n\t    source.changeable,\n\t    source.hotspot);\n}\n\nvoid Style::Copy(Font &font_, const FontMeasurements &fm_) {\n\tfont.MakeAlias(font_);\n#if PLAT_WX\n\tfont.SetAscent(fm_.ascent);\n#endif\n\t(FontMeasurements &)(*this) = fm_;\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/Style.h",
    "content": "// Scintilla source code edit control\n/** @file Style.h\n ** Defines the font and colour style for a class of text.\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef STYLE_H\n#define STYLE_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nstruct FontSpecification {\n\tconst char *fontName;\n\tint weight;\n\tbool italic;\n\tint size;\n\tint characterSet;\n\tint extraFontFlag;\n\tFontSpecification() :\n\t\tfontName(0),\n\t\tweight(SC_WEIGHT_NORMAL),\n\t\titalic(false),\n\t\tsize(10 * SC_FONT_SIZE_MULTIPLIER),\n\t\tcharacterSet(0),\n\t\textraFontFlag(0) {\n\t}\n\tbool operator==(const FontSpecification &other) const;\n\tbool operator<(const FontSpecification &other) const;\n};\n\n// Just like Font but only has a copy of the FontID so should not delete it\nclass FontAlias : public Font {\n\t// Private so FontAlias objects can not be copied\n\tFontAlias(const FontAlias &);\n\tFontAlias &operator=(const FontAlias &);\npublic:\n\tFontAlias();\n\tvirtual ~FontAlias();\n\tvoid MakeAlias(Font &fontOrigin);\n\tvoid ClearFont();\n};\n\nstruct FontMeasurements {\n\tunsigned int ascent;\n\tunsigned int descent;\n\tXYPOSITION aveCharWidth;\n\tXYPOSITION spaceWidth;\n\tint sizeZoomed;\n\tFontMeasurements();\n\tvoid Clear();\n};\n\n/**\n */\nclass Style : public FontSpecification, public FontMeasurements {\npublic:\n\tColourDesired fore;\n\tColourDesired back;\n\tbool eolFilled;\n\tbool underline;\n\tenum ecaseForced {caseMixed, caseUpper, caseLower};\n\tecaseForced caseForce;\n\tbool visible;\n\tbool changeable;\n\tbool hotspot;\n\n\tFontAlias font;\n\n\tStyle();\n\tStyle(const Style &source);\n\t~Style();\n\tStyle &operator=(const Style &source);\n\tvoid Clear(ColourDesired fore_, ColourDesired back_,\n\t           int size_,\n\t           const char *fontName_, int characterSet_,\n\t           int weight_, bool italic_, bool eolFilled_,\n\t           bool underline_, ecaseForced caseForce_,\n\t           bool visible_, bool changeable_, bool hotspot_);\n\tvoid ClearTo(const Style &source);\n\tvoid Copy(Font &font_, const FontMeasurements &fm_);\n\tbool IsProtected() const { return !(changeable && visible);}\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/UniConversion.cpp",
    "content": "// Scintilla source code edit control\n/** @file UniConversion.cxx\n ** Functions to handle UTF-8 and UTF-16 strings.\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n\n#include \"UniConversion.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nenum { SURROGATE_LEAD_FIRST = 0xD800 };\nenum { SURROGATE_TRAIL_FIRST = 0xDC00 };\nenum { SURROGATE_TRAIL_LAST = 0xDFFF };\n\nunsigned int UTF8Length(const wchar_t *uptr, unsigned int tlen) {\n\tunsigned int len = 0;\n\tfor (unsigned int i = 0; i < tlen && uptr[i];) {\n\t\tunsigned int uch = uptr[i];\n\t\tif (uch < 0x80) {\n\t\t\tlen++;\n\t\t} else if (uch < 0x800) {\n\t\t\tlen += 2;\n\t\t} else if ((uch >= SURROGATE_LEAD_FIRST) &&\n\t\t\t(uch <= SURROGATE_TRAIL_LAST)) {\n\t\t\tlen += 4;\n\t\t\ti++;\n\t\t} else {\n\t\t\tlen += 3;\n\t\t}\n\t\ti++;\n\t}\n\treturn len;\n}\n\nvoid UTF8FromUTF16(const wchar_t *uptr, unsigned int tlen, char *putf, unsigned int len) {\n\tint k = 0;\n\tfor (unsigned int i = 0; i < tlen && uptr[i];) {\n\t\tunsigned int uch = uptr[i];\n\t\tif (uch < 0x80) {\n\t\t\tputf[k++] = static_cast<char>(uch);\n\t\t} else if (uch < 0x800) {\n\t\t\tputf[k++] = static_cast<char>(0xC0 | (uch >> 6));\n\t\t\tputf[k++] = static_cast<char>(0x80 | (uch & 0x3f));\n\t\t} else if ((uch >= SURROGATE_LEAD_FIRST) &&\n\t\t\t(uch <= SURROGATE_TRAIL_LAST)) {\n\t\t\t// Half a surrogate pair\n\t\t\ti++;\n\t\t\tunsigned int xch = 0x10000 + ((uch & 0x3ff) << 10) + (uptr[i] & 0x3ff);\n\t\t\tputf[k++] = static_cast<char>(0xF0 | (xch >> 18));\n\t\t\tputf[k++] = static_cast<char>(0x80 | ((xch >> 12) & 0x3f));\n\t\t\tputf[k++] = static_cast<char>(0x80 | ((xch >> 6) & 0x3f));\n\t\t\tputf[k++] = static_cast<char>(0x80 | (xch & 0x3f));\n\t\t} else {\n\t\t\tputf[k++] = static_cast<char>(0xE0 | (uch >> 12));\n\t\t\tputf[k++] = static_cast<char>(0x80 | ((uch >> 6) & 0x3f));\n\t\t\tputf[k++] = static_cast<char>(0x80 | (uch & 0x3f));\n\t\t}\n\t\ti++;\n\t}\n\tputf[len] = '\\0';\n}\n\nunsigned int UTF8CharLength(unsigned char ch) {\n\tif (ch < 0x80) {\n\t\treturn 1;\n\t} else if (ch < 0x80 + 0x40 + 0x20) {\n\t\treturn 2;\n\t} else if (ch < 0x80 + 0x40 + 0x20 + 0x10) {\n\t\treturn 3;\n\t} else {\n\t\treturn 4;\n\t}\n}\n\nunsigned int UTF16Length(const char *s, unsigned int len) {\n\tunsigned int ulen = 0;\n\tunsigned int charLen;\n\tfor (unsigned int i=0; i<len;) {\n\t\tunsigned char ch = static_cast<unsigned char>(s[i]);\n\t\tif (ch < 0x80) {\n\t\t\tcharLen = 1;\n\t\t} else if (ch < 0x80 + 0x40 + 0x20) {\n\t\t\tcharLen = 2;\n\t\t} else if (ch < 0x80 + 0x40 + 0x20 + 0x10) {\n\t\t\tcharLen = 3;\n\t\t} else {\n\t\t\tcharLen = 4;\n\t\t\tulen++;\n\t\t}\n\t\ti += charLen;\n\t\tulen++;\n\t}\n\treturn ulen;\n}\n\nunsigned int UTF16FromUTF8(const char *s, unsigned int len, wchar_t *tbuf, unsigned int tlen) {\n\tunsigned int ui=0;\n\tconst unsigned char *us = reinterpret_cast<const unsigned char *>(s);\n\tunsigned int i=0;\n\twhile ((i<len) && (ui<tlen)) {\n\t\tunsigned char ch = us[i++];\n\t\tif (ch < 0x80) {\n\t\t\ttbuf[ui] = ch;\n\t\t} else if (ch < 0x80 + 0x40 + 0x20) {\n\t\t\ttbuf[ui] = static_cast<wchar_t>((ch & 0x1F) << 6);\n\t\t\tch = us[i++];\n\t\t\ttbuf[ui] = static_cast<wchar_t>(tbuf[ui] + (ch & 0x7F));\n\t\t} else if (ch < 0x80 + 0x40 + 0x20 + 0x10) {\n\t\t\ttbuf[ui] = static_cast<wchar_t>((ch & 0xF) << 12);\n\t\t\tch = us[i++];\n\t\t\ttbuf[ui] = static_cast<wchar_t>(tbuf[ui] + ((ch & 0x7F) << 6));\n\t\t\tch = us[i++];\n\t\t\ttbuf[ui] = static_cast<wchar_t>(tbuf[ui] + (ch & 0x7F));\n\t\t} else {\n\t\t\t// Outside the BMP so need two surrogates\n\t\t\tint val = (ch & 0x7) << 18;\n\t\t\tch = us[i++];\n\t\t\tval += (ch & 0x3F) << 12;\n\t\t\tch = us[i++];\n\t\t\tval += (ch & 0x3F) << 6;\n\t\t\tch = us[i++];\n\t\t\tval += (ch & 0x3F);\n\t\t\ttbuf[ui] = static_cast<wchar_t>(((val - 0x10000) >> 10) + SURROGATE_LEAD_FIRST);\n\t\t\tui++;\n\t\t\ttbuf[ui] = static_cast<wchar_t>((val & 0x3ff) + SURROGATE_TRAIL_FIRST);\n\t\t}\n\t\tui++;\n\t}\n\treturn ui;\n}\n\nint UTF8BytesOfLead[256];\nstatic bool initialisedBytesOfLead = false;\n\nstatic int BytesFromLead(int leadByte) {\n\tif (leadByte < 0xC2) {\n\t\t// Single byte or invalid\n\t\treturn 1;\n\t} else if (leadByte < 0xE0) {\n\t\treturn 2;\n\t} else if (leadByte < 0xF0) {\n\t\treturn 3;\n\t} else if (leadByte < 0xF5) {\n\t\treturn 4;\n\t} else {\n\t\t// Characters longer than 4 bytes not possible in current UTF-8\n\t\treturn 1;\n\t}\n}\n\nvoid UTF8BytesOfLeadInitialise() {\n\tif (!initialisedBytesOfLead) {\n\t\tfor (int i=0;i<256;i++) {\n\t\t\tUTF8BytesOfLead[i] = BytesFromLead(i);\n\t\t}\n\t\tinitialisedBytesOfLead = true;\n\t}\n}\n\n// Return both the width of the first character in the string and a status\n// saying whether it is valid or invalid.\n// Most invalid sequences return a width of 1 so are treated as isolated bytes but\n// the non-characters *FFFE, *FFFF and FDD0 .. FDEF return 3 or 4 as they can be\n// reasonably treated as code points in some circumstances. They will, however,\n// not have associated glyphs.\nint UTF8Classify(const unsigned char *us, int len) {\n\t// For the rules: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n\tif (*us < 0x80) {\n\t\t// Single bytes easy\n\t\treturn 1;\n\t} else if (*us > 0xf4) {\n\t\t// Characters longer than 4 bytes not possible in current UTF-8\n\t\treturn UTF8MaskInvalid | 1;\n\t} else if (*us >= 0xf0) {\n\t\t// 4 bytes\n\t\tif (len < 4)\n\t\t\treturn UTF8MaskInvalid | 1;\n\t\tif (UTF8IsTrailByte(us[1]) && UTF8IsTrailByte(us[2]) && UTF8IsTrailByte(us[3])) {\n\t\t\tif (((us[1] & 0xf) == 0xf) && (us[2] == 0xbf) && ((us[3] == 0xbe) || (us[3] == 0xbf))) {\n\t\t\t\t// *FFFE or *FFFF non-character\n\t\t\t\treturn UTF8MaskInvalid | 4;\n\t\t\t}\n\t\t\tif (*us == 0xf4) {\n\t\t\t\t// Check if encoding a value beyond the last Unicode character 10FFFF\n\t\t\t\tif (us[1] > 0x8f) {\n\t\t\t\t\treturn UTF8MaskInvalid | 1;\n\t\t\t\t} else if (us[1] == 0x8f) {\n\t\t\t\t\tif (us[2] > 0xbf) {\n\t\t\t\t\t\treturn UTF8MaskInvalid | 1;\n\t\t\t\t\t} else if (us[2] == 0xbf) {\n\t\t\t\t\t\tif (us[3] > 0xbf) {\n\t\t\t\t\t\t\treturn UTF8MaskInvalid | 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if ((*us == 0xf0) && ((us[1] & 0xf0) == 0x80)) {\n\t\t\t\t// Overlong\n\t\t\t\treturn UTF8MaskInvalid | 1;\n\t\t\t}\n\t\t\treturn 4;\n\t\t} else {\n\t\t\treturn UTF8MaskInvalid | 1;\n\t\t}\n\t} else if (*us >= 0xe0) {\n\t\t// 3 bytes\n\t\tif (len < 3)\n\t\t\treturn UTF8MaskInvalid | 1;\n\t\tif (UTF8IsTrailByte(us[1]) && UTF8IsTrailByte(us[2])) {\n\t\t\tif ((*us == 0xe0) && ((us[1] & 0xe0) == 0x80)) {\n\t\t\t\t// Overlong\n\t\t\t\treturn UTF8MaskInvalid | 1;\n\t\t\t}\n\t\t\tif ((*us == 0xed) && ((us[1] & 0xe0) == 0xa0)) {\n\t\t\t\t// Surrogate\n\t\t\t\treturn UTF8MaskInvalid | 1;\n\t\t\t}\n\t\t\tif ((*us == 0xef) && (us[1] == 0xbf) && (us[2] == 0xbe)) {\n\t\t\t\t// U+FFFE non-character - 3 bytes long\n\t\t\t\treturn UTF8MaskInvalid | 3;\n\t\t\t}\n\t\t\tif ((*us == 0xef) && (us[1] == 0xbf) && (us[2] == 0xbf)) {\n\t\t\t\t// U+FFFF non-character - 3 bytes long\n\t\t\t\treturn UTF8MaskInvalid | 3;\n\t\t\t}\n\t\t\tif ((*us == 0xef) && (us[1] == 0xb7) && (((us[2] & 0xf0) == 0x90) || ((us[2] & 0xf0) == 0xa0))) {\n\t\t\t\t// U+FDD0 .. U+FDEF\n\t\t\t\treturn UTF8MaskInvalid | 3;\n\t\t\t}\n\t\t\treturn 3;\n\t\t} else {\n\t\t\treturn UTF8MaskInvalid | 1;\n\t\t}\n\t} else if (*us >= 0xc2) {\n\t\t// 2 bytes\n\t\tif (len < 2)\n\t\t\treturn UTF8MaskInvalid | 1;\n\t\tif (UTF8IsTrailByte(us[1])) {\n\t\t\treturn 2;\n\t\t} else {\n\t\t\treturn UTF8MaskInvalid | 1;\n\t\t}\n\t} else {\n\t\t// 0xc0 .. 0xc1 is overlong encoding\n\t\t// 0x80 .. 0xbf is trail byte\n\t\treturn UTF8MaskInvalid | 1;\n\t}\n}\n\nint UTF8DrawBytes(const unsigned char *us, int len) {\n\tint utf8StatusNext = UTF8Classify(us, len);\n\treturn (utf8StatusNext & UTF8MaskInvalid) ? 1 : (utf8StatusNext & UTF8MaskWidth);\n}\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/UniConversion.h",
    "content": "// Scintilla source code edit control\n/** @file UniConversion.h\n ** Functions to handle UTF-8 and UTF-16 strings.\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef UNICONVERSION_H\n#define UNICONVERSION_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\nconst int UTF8MaxBytes = 4;\n\nunsigned int UTF8Length(const wchar_t *uptr, unsigned int tlen);\nvoid UTF8FromUTF16(const wchar_t *uptr, unsigned int tlen, char *putf, unsigned int len);\nunsigned int UTF8CharLength(unsigned char ch);\nunsigned int UTF16Length(const char *s, unsigned int len);\nunsigned int UTF16FromUTF8(const char *s, unsigned int len, wchar_t *tbuf, unsigned int tlen);\n\nextern int UTF8BytesOfLead[256];\nvoid UTF8BytesOfLeadInitialise();\n\ninline bool UTF8IsTrailByte(int ch) {\n\treturn (ch >= 0x80) && (ch < 0xc0);\n}\n\ninline bool UTF8IsAscii(int ch) {\n\treturn ch < 0x80;\n}\n\nenum { UTF8MaskWidth=0x7, UTF8MaskInvalid=0x8 };\nint UTF8Classify(const unsigned char *us, int len);\n\n// Similar to UTF8Classify but returns a length of 1 for invalid bytes\n// instead of setting the invalid flag\nint UTF8DrawBytes(const unsigned char *us, int len);\n\n// Line separator is U+2028 \\xe2\\x80\\xa8\n// Paragraph separator is U+2029 \\xe2\\x80\\xa9\nconst int UTF8SeparatorLength = 3;\ninline bool UTF8IsSeparator(const unsigned char *us) {\n\treturn (us[0] == 0xe2) && (us[1] == 0x80) && ((us[2] == 0xa8) || (us[2] == 0xa9));\n}\n\n// NEL is U+0085 \\xc2\\x85\nconst int UTF8NELLength = 2;\ninline bool UTF8IsNEL(const unsigned char *us) {\n\treturn (us[0] == 0xc2) && (us[1] == 0x85);\n}\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/UnicodeFromUTF8.h",
    "content": "// Scintilla source code edit control\n/** @file UnicodeFromUTF8.h\n ** Lexer infrastructure.\n **/\n// Copyright 2013 by Neil Hodgson <neilh@scintilla.org>\n// This file is in the public domain.\n\n#ifndef UNICODEFROMUTF8_H\n#define UNICODEFROMUTF8_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\ninline int UnicodeFromUTF8(const unsigned char *us) {\n\tif (us[0] < 0xC2) {\n\t\treturn us[0];\n\t} else if (us[0] < 0xE0) {\n\t\treturn ((us[0] & 0x1F) << 6) + (us[1] & 0x3F);\n\t} else if (us[0] < 0xF0) {\n\t\treturn ((us[0] & 0xF) << 12) + ((us[1] & 0x3F) << 6) + (us[2] & 0x3F);\n\t} else if (us[0] < 0xF5) {\n\t\treturn ((us[0] & 0x7) << 18) + ((us[1] & 0x3F) << 12) + ((us[2] & 0x3F) << 6) + (us[3] & 0x3F);\n\t}\n\treturn us[0];\n}\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/ViewStyle.cpp",
    "content": "// Scintilla source code edit control\n/** @file ViewStyle.cxx\n ** Store information on how the document is to be viewed.\n **/\n// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <string.h>\n#include <assert.h>\n\n#include <vector>\n#include <map>\n\n#include \"Platform.h\"\n\n#include \"Scintilla.h\"\n#include \"SplitVector.h\"\n#include \"Partitioning.h\"\n#include \"RunStyles.h\"\n#include \"Indicator.h\"\n#include \"XPM.h\"\n#include \"LineMarker.h\"\n#include \"Style.h\"\n#include \"ViewStyle.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\nMarginStyle::MarginStyle() :\n\tstyle(SC_MARGIN_SYMBOL), width(0), mask(0), sensitive(false), cursor(SC_CURSORREVERSEARROW) {\n}\n\n// A list of the fontnames - avoids wasting space in each style\nFontNames::FontNames() {\n}\n\nFontNames::~FontNames() {\n\tClear();\n}\n\nvoid FontNames::Clear() {\n\tfor (std::vector<char *>::const_iterator it=names.begin(); it != names.end(); ++it) {\n\t\tdelete []*it;\n\t}\n\tnames.clear();\n}\n\nconst char *FontNames::Save(const char *name) {\n\tif (!name)\n\t\treturn 0;\n\n\tfor (std::vector<char *>::const_iterator it=names.begin(); it != names.end(); ++it) {\n\t\tif (strcmp(*it, name) == 0) {\n\t\t\treturn *it;\n\t\t}\n\t}\n\tchar *nameSave = new char[strlen(name) + 1];\n\tstrcpy(nameSave, name);\n\tnames.push_back(nameSave);\n\treturn nameSave;\n}\n\nFontRealised::FontRealised() {\n}\n\nFontRealised::~FontRealised() {\n\tfont.Release();\n}\n\nvoid FontRealised::Realise(Surface &surface, int zoomLevel, int technology, const FontSpecification &fs) {\n\tPLATFORM_ASSERT(fs.fontName);\n\tsizeZoomed = fs.size + zoomLevel * SC_FONT_SIZE_MULTIPLIER;\n\tif (sizeZoomed <= 2 * SC_FONT_SIZE_MULTIPLIER)\t// Hangs if sizeZoomed <= 1\n\t\tsizeZoomed = 2 * SC_FONT_SIZE_MULTIPLIER;\n\n\tfloat deviceHeight = surface.DeviceHeightFont(sizeZoomed);\n\tFontParameters fp(fs.fontName, deviceHeight / SC_FONT_SIZE_MULTIPLIER, fs.weight, fs.italic, fs.extraFontFlag, technology, fs.characterSet);\n\tfont.Create(fp);\n\n\tascent = surface.Ascent(font);\n\tdescent = surface.Descent(font);\n\taveCharWidth = surface.AverageCharWidth(font);\n\tspaceWidth = surface.WidthChar(font, ' ');\n}\n\nViewStyle::ViewStyle() {\n\tInit();\n}\n\nViewStyle::ViewStyle(const ViewStyle &source) {\n\tInit(source.styles.size());\n\tfor (unsigned int sty=0; sty<source.styles.size(); sty++) {\n\t\tstyles[sty] = source.styles[sty];\n\t\t// Can't just copy fontname as its lifetime is relative to its owning ViewStyle\n\t\tstyles[sty].fontName = fontNames.Save(source.styles[sty].fontName);\n\t}\n\tnextExtendedStyle = source.nextExtendedStyle;\n\tfor (int mrk=0; mrk<=MARKER_MAX; mrk++) {\n\t\tmarkers[mrk] = source.markers[mrk];\n\t}\n\tCalcLargestMarkerHeight();\n\tfor (int ind=0; ind<=INDIC_MAX; ind++) {\n\t\tindicators[ind] = source.indicators[ind];\n\t}\n\n\tselColours = source.selColours;\n\tselAdditionalForeground = source.selAdditionalForeground;\n\tselAdditionalBackground = source.selAdditionalBackground;\n\tselBackground2 = source.selBackground2;\n\tselAlpha = source.selAlpha;\n\tselAdditionalAlpha = source.selAdditionalAlpha;\n\tselEOLFilled = source.selEOLFilled;\n\n\tfoldmarginColour = source.foldmarginColour;\n\tfoldmarginHighlightColour = source.foldmarginHighlightColour;\n\n\thotspotColours = source.hotspotColours;\n\thotspotUnderline = source.hotspotUnderline;\n\thotspotSingleLine = source.hotspotSingleLine;\n\n\twhitespaceColours = source.whitespaceColours;\n\tcontrolCharSymbol = source.controlCharSymbol;\n\tcontrolCharWidth = source.controlCharWidth;\n\tselbar = source.selbar;\n\tselbarlight = source.selbarlight;\n\tcaretcolour = source.caretcolour;\n\tadditionalCaretColour = source.additionalCaretColour;\n\tshowCaretLineBackground = source.showCaretLineBackground;\n\talwaysShowCaretLineBackground = source.alwaysShowCaretLineBackground;\n\tcaretLineBackground = source.caretLineBackground;\n\tcaretLineAlpha = source.caretLineAlpha;\n\tedgecolour = source.edgecolour;\n\tedgeState = source.edgeState;\n\tcaretStyle = source.caretStyle;\n\tcaretWidth = source.caretWidth;\n\tsomeStylesProtected = false;\n\tsomeStylesForceCase = false;\n\tleftMarginWidth = source.leftMarginWidth;\n\trightMarginWidth = source.rightMarginWidth;\n\tfor (int margin=0; margin <= SC_MAX_MARGIN; margin++) {\n\t\tms[margin] = source.ms[margin];\n\t}\n\tmaskInLine = source.maskInLine;\n\tfixedColumnWidth = source.fixedColumnWidth;\n\tmarginInside = source.marginInside;\n\ttextStart = source.textStart;\n\tzoomLevel = source.zoomLevel;\n\tviewWhitespace = source.viewWhitespace;\n\twhitespaceSize = source.whitespaceSize;\n\tviewIndentationGuides = source.viewIndentationGuides;\n\tviewEOL = source.viewEOL;\n\textraFontFlag = source.extraFontFlag;\n\textraAscent = source.extraAscent;\n\textraDescent = source.extraDescent;\n\tmarginStyleOffset = source.marginStyleOffset;\n\tannotationVisible = source.annotationVisible;\n\tannotationStyleOffset = source.annotationStyleOffset;\n\tbraceHighlightIndicatorSet = source.braceHighlightIndicatorSet;\n\tbraceHighlightIndicator = source.braceHighlightIndicator;\n\tbraceBadLightIndicatorSet = source.braceBadLightIndicatorSet;\n\tbraceBadLightIndicator = source.braceBadLightIndicator;\n\n\ttheEdge = source.theEdge;\n\n\tmarginNumberPadding = source.marginNumberPadding;\n\tctrlCharPadding = source.ctrlCharPadding;\n\tlastSegItalicsOffset = source.lastSegItalicsOffset;\n\n\twrapState = source.wrapState;\n\twrapVisualFlags = source.wrapVisualFlags;\n\twrapVisualFlagsLocation = source.wrapVisualFlagsLocation;\n\twrapVisualStartIndent = source.wrapVisualStartIndent;\n\twrapIndentMode = source.wrapIndentMode;\n}\n\nViewStyle::~ViewStyle() {\n\tstyles.clear();\n\tfor (FontMap::iterator it = fonts.begin(); it != fonts.end(); ++it) {\n\t\tdelete it->second;\n\t}\n\tfonts.clear();\n}\n\nvoid ViewStyle::Init(size_t stylesSize_) {\n\tAllocStyles(stylesSize_);\n\tnextExtendedStyle = 256;\n\tfontNames.Clear();\n\tResetDefaultStyle();\n\n\t// There are no image markers by default, so no need for calling CalcLargestMarkerHeight()\n\tlargestMarkerHeight = 0;\n\n\tindicators[0].style = INDIC_SQUIGGLE;\n\tindicators[0].under = false;\n\tindicators[0].fore = ColourDesired(0, 0x7f, 0);\n\tindicators[1].style = INDIC_TT;\n\tindicators[1].under = false;\n\tindicators[1].fore = ColourDesired(0, 0, 0xff);\n\tindicators[2].style = INDIC_PLAIN;\n\tindicators[2].under = false;\n\tindicators[2].fore = ColourDesired(0xff, 0, 0);\n\n\ttechnology = SC_TECHNOLOGY_DEFAULT;\n\tlineHeight = 1;\n\tmaxAscent = 1;\n\tmaxDescent = 1;\n\taveCharWidth = 8;\n\tspaceWidth = 8;\n\ttabWidth = spaceWidth * 8;\n\n\tselColours.fore = ColourOptional(ColourDesired(0xff, 0, 0));\n\tselColours.back = ColourOptional(ColourDesired(0xc0, 0xc0, 0xc0), true);\n\tselAdditionalForeground = ColourDesired(0xff, 0, 0);\n\tselAdditionalBackground = ColourDesired(0xd7, 0xd7, 0xd7);\n\tselBackground2 = ColourDesired(0xb0, 0xb0, 0xb0);\n\tselAlpha = SC_ALPHA_NOALPHA;\n\tselAdditionalAlpha = SC_ALPHA_NOALPHA;\n\tselEOLFilled = false;\n\n\tfoldmarginColour = ColourOptional(ColourDesired(0xff, 0, 0));\n\tfoldmarginHighlightColour = ColourOptional(ColourDesired(0xc0, 0xc0, 0xc0));\n\n\twhitespaceColours.fore = ColourOptional();\n\twhitespaceColours.back = ColourOptional(ColourDesired(0xff, 0xff, 0xff));\n\tcontrolCharSymbol = 0;\t/* Draw the control characters */\n\tcontrolCharWidth = 0;\n\tselbar = Platform::Chrome();\n\tselbarlight = Platform::ChromeHighlight();\n\tstyles[STYLE_LINENUMBER].fore = ColourDesired(0, 0, 0);\n\tstyles[STYLE_LINENUMBER].back = Platform::Chrome();\n\tcaretcolour = ColourDesired(0, 0, 0);\n\tadditionalCaretColour = ColourDesired(0x7f, 0x7f, 0x7f);\n\tshowCaretLineBackground = false;\n\talwaysShowCaretLineBackground = false;\n\tcaretLineBackground = ColourDesired(0xff, 0xff, 0);\n\tcaretLineAlpha = SC_ALPHA_NOALPHA;\n\tedgecolour = ColourDesired(0xc0, 0xc0, 0xc0);\n\tedgeState = EDGE_NONE;\n\tcaretStyle = CARETSTYLE_LINE;\n\tcaretWidth = 1;\n\tsomeStylesProtected = false;\n\tsomeStylesForceCase = false;\n\n\thotspotColours.fore = ColourOptional(ColourDesired(0, 0, 0xff));\n\thotspotColours.back = ColourOptional(ColourDesired(0xff, 0xff, 0xff));\n\thotspotUnderline = true;\n\thotspotSingleLine = true;\n\n\tleftMarginWidth = 1;\n\trightMarginWidth = 1;\n\tms[0].style = SC_MARGIN_NUMBER;\n\tms[0].width = 0;\n\tms[0].mask = 0;\n\tms[1].style = SC_MARGIN_SYMBOL;\n\tms[1].width = 16;\n\tms[1].mask = ~SC_MASK_FOLDERS;\n\tms[2].style = SC_MARGIN_SYMBOL;\n\tms[2].width = 0;\n\tms[2].mask = 0;\n\tmarginInside = true;\n\tfixedColumnWidth = marginInside ? leftMarginWidth : 0;\n\tmaskInLine = 0xffffffff;\n\tfor (int margin=0; margin <= SC_MAX_MARGIN; margin++) {\n\t\tfixedColumnWidth += ms[margin].width;\n\t\tif (ms[margin].width > 0)\n\t\t\tmaskInLine &= ~ms[margin].mask;\n\t}\n\ttextStart = marginInside ? fixedColumnWidth : leftMarginWidth;\n\tzoomLevel = 0;\n\tviewWhitespace = wsInvisible;\n\twhitespaceSize = 1;\n\tviewIndentationGuides = ivNone;\n\tviewEOL = false;\n\textraFontFlag = 0;\n\textraAscent = 0;\n\textraDescent = 0;\n\tmarginStyleOffset = 0;\n\tannotationVisible = ANNOTATION_HIDDEN;\n\tannotationStyleOffset = 0;\n\tbraceHighlightIndicatorSet = false;\n\tbraceHighlightIndicator = 0;\n\tbraceBadLightIndicatorSet = false;\n\tbraceBadLightIndicator = 0;\n\n\ttheEdge = 0;\n\n\tmarginNumberPadding = 3;\n\tctrlCharPadding = 3; // +3 For a blank on front and rounded edge each side\n\tlastSegItalicsOffset = 2;\n\n\twrapState = eWrapNone;\n\twrapVisualFlags = 0;\n\twrapVisualFlagsLocation = 0;\n\twrapVisualStartIndent = 0;\n\twrapIndentMode = SC_WRAPINDENT_FIXED;\n}\n\nvoid ViewStyle::Refresh(Surface &surface, int tabInChars) {\n\tfor (FontMap::iterator it = fonts.begin(); it != fonts.end(); ++it) {\n\t\tdelete it->second;\n\t}\n\tfonts.clear();\n\n\tselbar = Platform::Chrome();\n\tselbarlight = Platform::ChromeHighlight();\n\n\tfor (unsigned int i=0; i<styles.size(); i++) {\n\t\tstyles[i].extraFontFlag = extraFontFlag;\n\t}\n\n\tCreateFont(styles[STYLE_DEFAULT]);\n\tfor (unsigned int j=0; j<styles.size(); j++) {\n\t\tCreateFont(styles[j]);\n\t}\n\n\tfor (FontMap::iterator it = fonts.begin(); it != fonts.end(); ++it) {\n\t\tit->second->Realise(surface, zoomLevel, technology, it->first);\n\t}\n\n\tfor (unsigned int k=0; k<styles.size(); k++) {\n\t\tFontRealised *fr = Find(styles[k]);\n\t\tstyles[k].Copy(fr->font, *fr);\n\t}\n\tmaxAscent = 1;\n\tmaxDescent = 1;\n\tFindMaxAscentDescent();\n\tmaxAscent += extraAscent;\n\tmaxDescent += extraDescent;\n\tlineHeight = maxAscent + maxDescent;\n\n\tsomeStylesProtected = false;\n\tsomeStylesForceCase = false;\n\tfor (unsigned int l=0; l<styles.size(); l++) {\n\t\tif (styles[l].IsProtected()) {\n\t\t\tsomeStylesProtected = true;\n\t\t}\n\t\tif (styles[l].caseForce != Style::caseMixed) {\n\t\t\tsomeStylesForceCase = true;\n\t\t}\n\t}\n\n\taveCharWidth = styles[STYLE_DEFAULT].aveCharWidth;\n\tspaceWidth = styles[STYLE_DEFAULT].spaceWidth;\n\ttabWidth = spaceWidth * tabInChars;\n\n\tcontrolCharWidth = 0.0;\n\tif (controlCharSymbol >= 32) {\n\t\tcontrolCharWidth = surface.WidthChar(styles[STYLE_CONTROLCHAR].font, controlCharSymbol);\n\t}\n\n\tfixedColumnWidth = marginInside ? leftMarginWidth : 0;\n\tmaskInLine = 0xffffffff;\n\tfor (int margin=0; margin <= SC_MAX_MARGIN; margin++) {\n\t\tfixedColumnWidth += ms[margin].width;\n\t\tif (ms[margin].width > 0)\n\t\t\tmaskInLine &= ~ms[margin].mask;\n\t}\n\ttextStart = marginInside ? fixedColumnWidth : leftMarginWidth;\n}\n\nvoid ViewStyle::ReleaseAllExtendedStyles() {\n\tnextExtendedStyle = 256;\n}\n\nint ViewStyle::AllocateExtendedStyles(int numberStyles) {\n\tint startRange = static_cast<int>(nextExtendedStyle);\n\tnextExtendedStyle += numberStyles;\n\tEnsureStyle(nextExtendedStyle);\n\tfor (size_t i=startRange; i<nextExtendedStyle; i++) {\n\t\tstyles[i].ClearTo(styles[STYLE_DEFAULT]);\n\t}\n\treturn startRange;\n}\n\nvoid ViewStyle::EnsureStyle(size_t index) {\n\tif (index >= styles.size()) {\n\t\tAllocStyles(index+1);\n\t}\n}\n\nvoid ViewStyle::ResetDefaultStyle() {\n\tstyles[STYLE_DEFAULT].Clear(ColourDesired(0,0,0),\n\t        ColourDesired(0xff,0xff,0xff),\n\t        Platform::DefaultFontSize() * SC_FONT_SIZE_MULTIPLIER, fontNames.Save(Platform::DefaultFont()),\n\t        SC_CHARSET_DEFAULT,\n\t        SC_WEIGHT_NORMAL, false, false, false, Style::caseMixed, true, true, false);\n}\n\nvoid ViewStyle::ClearStyles() {\n\t// Reset all styles to be like the default style\n\tfor (unsigned int i=0; i<styles.size(); i++) {\n\t\tif (i != STYLE_DEFAULT) {\n\t\t\tstyles[i].ClearTo(styles[STYLE_DEFAULT]);\n\t\t}\n\t}\n\tstyles[STYLE_LINENUMBER].back = Platform::Chrome();\n\n\t// Set call tip fore/back to match the values previously set for call tips\n\tstyles[STYLE_CALLTIP].back = ColourDesired(0xff, 0xff, 0xff);\n\tstyles[STYLE_CALLTIP].fore = ColourDesired(0x80, 0x80, 0x80);\n}\n\nvoid ViewStyle::SetStyleFontName(int styleIndex, const char *name) {\n\tstyles[styleIndex].fontName = fontNames.Save(name);\n}\n\nbool ViewStyle::ProtectionActive() const {\n\treturn someStylesProtected;\n}\n\nint ViewStyle::ExternalMarginWidth() const {\n\treturn marginInside ? 0 : fixedColumnWidth;\n}\n\nbool ViewStyle::ValidStyle(size_t styleIndex) const {\n\treturn styleIndex < styles.size();\n}\n\nvoid ViewStyle::CalcLargestMarkerHeight() {\n\tlargestMarkerHeight = 0;\n\tfor (int m = 0; m <= MARKER_MAX; ++m) {\n\t\tswitch (markers[m].markType) {\n\t\tcase SC_MARK_PIXMAP:\n\t\t\tif (markers[m].pxpm && markers[m].pxpm->GetHeight() > largestMarkerHeight)\n\t\t\t\tlargestMarkerHeight = markers[m].pxpm->GetHeight();\n\t\t\tbreak;\n\t\tcase SC_MARK_RGBAIMAGE:\n\t\t\tif (markers[m].image && markers[m].image->GetHeight() > largestMarkerHeight)\n\t\t\t\tlargestMarkerHeight = markers[m].image->GetHeight();\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nColourDesired ViewStyle::WrapColour() const {\n\tif (whitespaceColours.fore.isSet)\n\t\treturn whitespaceColours.fore;\n\telse\n\t\treturn styles[STYLE_DEFAULT].fore;\n}\n\nbool ViewStyle::SetWrapState(int wrapState_) {\n\tWrapMode wrapStateWanted;\n\tswitch (wrapState_) {\n\tcase SC_WRAP_WORD:\n\t\twrapStateWanted = eWrapWord;\n\t\tbreak;\n\tcase SC_WRAP_CHAR:\n\t\twrapStateWanted = eWrapChar;\n\t\tbreak;\n\tdefault:\n\t\twrapStateWanted = eWrapNone;\n\t\tbreak;\n\t}\n\tbool changed = wrapState != wrapStateWanted;\n\twrapState = wrapStateWanted;\n\treturn changed;\n}\n\nbool ViewStyle::SetWrapVisualFlags(int wrapVisualFlags_) {\n\tbool changed = wrapVisualFlags != wrapVisualFlags_;\n\twrapVisualFlags = wrapVisualFlags_;\n\treturn changed;\n}\n\nbool ViewStyle::SetWrapVisualFlagsLocation(int wrapVisualFlagsLocation_) {\n\tbool changed = wrapVisualFlagsLocation != wrapVisualFlagsLocation_;\n\twrapVisualFlagsLocation = wrapVisualFlagsLocation_;\n\treturn changed;\n}\n\nbool ViewStyle::SetWrapVisualStartIndent(int wrapVisualStartIndent_) {\n\tbool changed = wrapVisualStartIndent != wrapVisualStartIndent_;\n\twrapVisualStartIndent = wrapVisualStartIndent_;\n\treturn changed;\n}\n\nbool ViewStyle::SetWrapIndentMode(int wrapIndentMode_) {\n\tbool changed = wrapIndentMode != wrapIndentMode_;\n\twrapIndentMode = wrapIndentMode_;\n\treturn changed;\n}\n\nvoid ViewStyle::AllocStyles(size_t sizeNew) {\n\tsize_t i=styles.size();\n\tstyles.resize(sizeNew);\n\tif (styles.size() > STYLE_DEFAULT) {\n\t\tfor (; i<sizeNew; i++) {\n\t\t\tif (i != STYLE_DEFAULT) {\n\t\t\t\tstyles[i].ClearTo(styles[STYLE_DEFAULT]);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid ViewStyle::CreateFont(const FontSpecification &fs) {\n\tif (fs.fontName) {\n\t\tFontMap::iterator it = fonts.find(fs);\n\t\tif (it == fonts.end()) {\n\t\t\tfonts[fs] = new FontRealised();\n\t\t}\n\t}\n}\n\nFontRealised *ViewStyle::Find(const FontSpecification &fs) {\n\tif (!fs.fontName)\t// Invalid specification so return arbitrary object\n\t\treturn fonts.begin()->second;\n\tFontMap::iterator it = fonts.find(fs);\n\tif (it != fonts.end()) {\n\t\t// Should always reach here since map was just set for all styles\n\t\treturn it->second;\n\t}\n\treturn 0;\n}\n\nvoid ViewStyle::FindMaxAscentDescent() {\n\tfor (FontMap::const_iterator it = fonts.begin(); it != fonts.end(); ++it) {\n\t\tif (maxAscent < it->second->ascent)\n\t\t\tmaxAscent = it->second->ascent;\n\t\tif (maxDescent < it->second->descent)\n\t\t\tmaxDescent = it->second->descent;\n\t}\n}\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/ViewStyle.h",
    "content": "// Scintilla source code edit control\n/** @file ViewStyle.h\n ** Store information on how the document is to be viewed.\n **/\n// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef VIEWSTYLE_H\n#define VIEWSTYLE_H\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n/**\n */\nclass MarginStyle {\npublic:\n\tint style;\n\tint width;\n\tint mask;\n\tbool sensitive;\n\tint cursor;\n\tMarginStyle();\n};\n\n/**\n */\nclass FontNames {\nprivate:\n\tstd::vector<char *> names;\n\n\t// Private so FontNames objects can not be copied\n\tFontNames(const FontNames &);\npublic:\n\tFontNames();\n\t~FontNames();\n\tvoid Clear();\n\tconst char *Save(const char *name);\n};\n\nclass FontRealised : public FontMeasurements {\n\t// Private so FontRealised objects can not be copied\n\tFontRealised(const FontRealised &);\n\tFontRealised &operator=(const FontRealised &);\npublic:\n\tFont font;\n\tFontRealised();\n\tvirtual ~FontRealised();\n\tvoid Realise(Surface &surface, int zoomLevel, int technology, const FontSpecification &fs);\n};\n\nenum IndentView {ivNone, ivReal, ivLookForward, ivLookBoth};\n\nenum WhiteSpaceVisibility {wsInvisible=0, wsVisibleAlways=1, wsVisibleAfterIndent=2};\n\ntypedef std::map<FontSpecification, FontRealised *> FontMap;\n\nenum WrapMode { eWrapNone, eWrapWord, eWrapChar };\n\nclass ColourOptional : public ColourDesired {\npublic:\n\tbool isSet;\n\tColourOptional(ColourDesired colour_=ColourDesired(0,0,0), bool isSet_=false) : ColourDesired(colour_), isSet(isSet_) {\n\t}\n\tColourOptional(uptr_t wParam, sptr_t lParam) : ColourDesired(lParam), isSet(wParam != 0) {\n\t}\n};\n\nstruct ForeBackColours {\n\tColourOptional fore;\n\tColourOptional back;\n};\n\n/**\n */\nclass ViewStyle {\n\tFontNames fontNames;\n\tFontMap fonts;\npublic:\n\tstd::vector<Style> styles;\n\tsize_t nextExtendedStyle;\n\tLineMarker markers[MARKER_MAX + 1];\n\tint largestMarkerHeight;\n\tIndicator indicators[INDIC_MAX + 1];\n\tint technology;\n\tint lineHeight;\n\tunsigned int maxAscent;\n\tunsigned int maxDescent;\n\tXYPOSITION aveCharWidth;\n\tXYPOSITION spaceWidth;\n\tXYPOSITION tabWidth;\n\tForeBackColours selColours;\n\tColourDesired selAdditionalForeground;\n\tColourDesired selAdditionalBackground;\n\tColourDesired selBackground2;\n\tint selAlpha;\n\tint selAdditionalAlpha;\n\tbool selEOLFilled;\n\tForeBackColours whitespaceColours;\n\tint controlCharSymbol;\n\tXYPOSITION controlCharWidth;\n\tColourDesired selbar;\n\tColourDesired selbarlight;\n\tColourOptional foldmarginColour;\n\tColourOptional foldmarginHighlightColour;\n\tForeBackColours hotspotColours;\n\tbool hotspotUnderline;\n\tbool hotspotSingleLine;\n\t/// Margins are ordered: Line Numbers, Selection Margin, Spacing Margin\n\tint leftMarginWidth;\t///< Spacing margin on left of text\n\tint rightMarginWidth;\t///< Spacing margin on right of text\n\tint maskInLine;\t///< Mask for markers to be put into text because there is nowhere for them to go in margin\n\tMarginStyle ms[SC_MAX_MARGIN+1];\n\tint fixedColumnWidth;\t///< Total width of margins\n\tbool marginInside;\t///< true: margin included in text view, false: separate views\n\tint textStart;\t///< Starting x position of text within the view\n\tint zoomLevel;\n\tWhiteSpaceVisibility viewWhitespace;\n\tint whitespaceSize;\n\tIndentView viewIndentationGuides;\n\tbool viewEOL;\n\tColourDesired caretcolour;\n\tColourDesired additionalCaretColour;\n\tbool showCaretLineBackground;\n\tbool alwaysShowCaretLineBackground;\n\tColourDesired caretLineBackground;\n\tint caretLineAlpha;\n\tColourDesired edgecolour;\n\tint edgeState;\n\tint caretStyle;\n\tint caretWidth;\n\tbool someStylesProtected;\n\tbool someStylesForceCase;\n\tint extraFontFlag;\n\tint extraAscent;\n\tint extraDescent;\n\tint marginStyleOffset;\n\tint annotationVisible;\n\tint annotationStyleOffset;\n\tbool braceHighlightIndicatorSet;\n\tint braceHighlightIndicator;\n\tbool braceBadLightIndicatorSet;\n\tint braceBadLightIndicator;\n\tint theEdge;\n\tint marginNumberPadding; // the right-side padding of the number margin\n\tint ctrlCharPadding; // the padding around control character text blobs\n\tint lastSegItalicsOffset; // the offset so as not to clip italic characters at EOLs\n\n\t// Wrapping support\n\tWrapMode wrapState;\n\tint wrapVisualFlags;\n\tint wrapVisualFlagsLocation;\n\tint wrapVisualStartIndent;\n\tint wrapIndentMode; // SC_WRAPINDENT_FIXED, _SAME, _INDENT\n\n\tViewStyle();\n\tViewStyle(const ViewStyle &source);\n\t~ViewStyle();\n\tvoid Init(size_t stylesSize_=64);\n\tvoid Refresh(Surface &surface, int tabInChars);\n\tvoid ReleaseAllExtendedStyles();\n\tint AllocateExtendedStyles(int numberStyles);\n\tvoid EnsureStyle(size_t index);\n\tvoid ResetDefaultStyle();\n\tvoid ClearStyles();\n\tvoid SetStyleFontName(int styleIndex, const char *name);\n\tbool ProtectionActive() const;\n\tint ExternalMarginWidth() const;\n\tbool ValidStyle(size_t styleIndex) const;\n\tvoid CalcLargestMarkerHeight();\n\tColourDesired WrapColour() const;\n\tbool SetWrapState(int wrapState_);\n\tbool SetWrapVisualFlags(int wrapVisualFlags_);\n\tbool SetWrapVisualFlagsLocation(int wrapVisualFlagsLocation_);\n\tbool SetWrapVisualStartIndent(int wrapVisualStartIndent_);\n\tbool SetWrapIndentMode(int wrapIndentMode_);\n\nprivate:\n\tvoid AllocStyles(size_t sizeNew);\n\tvoid CreateFont(const FontSpecification &fs);\n\tFontRealised *Find(const FontSpecification &fs);\n\tvoid FindMaxAscentDescent();\n\t// Private so can only be copied through copy constructor which ensures font names initialised correctly\n\tViewStyle &operator=(const ViewStyle &);\n};\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/XPM.cpp",
    "content": "// Scintilla source code edit control\n/** @file XPM.cxx\n ** Define a class that holds data in the X Pixmap (XPM) format.\n **/\n// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#include <stdlib.h>\n#include <string.h>\n\n#include <vector>\n#include <map>\n\n#include \"Platform.h\"\n\n#include \"XPM.h\"\n\n#ifdef SCI_NAMESPACE\nusing namespace Scintilla;\n#endif\n\n#if defined(PLAT_QT)\n\nXPM::XPM(const char *textForm)\n{\n    qpm = *reinterpret_cast<const QPixmap *>(textForm);\n}\n\nXPM::XPM(const char *const *linesForm)\n{\n    qpm = *reinterpret_cast<const QPixmap *>(linesForm);\n}\n\nvoid XPM::Draw(Surface *surface, PRectangle &rc)\n{\n    surface->DrawXPM(rc, this);\n}\n\nRGBAImage::RGBAImage(int width_, int height_, float scale_,\n        const unsigned char *pixels_)\n    : height(height_), width(width_), scale(scale_)\n{\n    if (pixels_)\n    {\n        qim = new QImage(*reinterpret_cast<const QImage *>(pixels_));\n    }\n    else\n    {\n#if QT_VERSION >= 0x040000\n        qim = new QImage(width_, height_, QImage::Format_ARGB32);\n#else\n        qim = new QImage(width_, height_, 32);\n        qim->setAlphaBuffer(true);\n#endif\n        qim->fill(0);\n    }\n}\n\nRGBAImage::RGBAImage(const XPM &xpm)\n{\n#if QT_VERSION >= 0x040000\n    qim = new QImage(xpm.Pixmap().toImage());\n#else\n    qim = new QImage(xpm.Pixmap().convertToImage());\n#endif\n\n    width = qim->width();\n    height = qim->height();\n}\n\nRGBAImage::~RGBAImage()\n{\n    delete qim;\n}\n\nconst unsigned char *RGBAImage::Pixels() const\n{\n    return reinterpret_cast<const unsigned char *>(qim);\n}\n\nvoid RGBAImage::SetPixel(int x, int y, ColourDesired colour, int alpha)\n{\n    QRgb rgba = qRgba(colour.GetRed(), colour.GetGreen(), colour.GetBlue(),\n            alpha);\n\n    uint index_or_rgb;\n\n#if QT_VERSION >= 0x040000\n    switch (qim->format())\n    {\n    case QImage::Format_RGB32:\n    case QImage::Format_ARGB32:\n        index_or_rgb = rgba;\n        break;\n\n    case QImage::Format_ARGB32_Premultiplied:\n        {\n            uint a = alpha;\n#if QT_POINTER_SIZE == 8\n            quint64 t = (((quint64(rgba)) | ((quint64(rgba)) << 24)) & 0x00ff00ff00ff00ff) * a;\n            t = (t + ((t >> 8) & 0xff00ff00ff00ff) + 0x80008000800080) >> 8;\n            t &= 0x000000ff00ff00ff;\n            index_or_rgb = (uint(t)) | (uint(t >> 24)) | (a << 24);\n#else\n            uint t = (rgba & 0xff00ff) * a;\n            t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8;\n            t &= 0xff00ff;\n\n            rgba = ((rgba >> 8) & 0xff) * a;\n            rgba = (rgba + ((rgba >> 8) & 0xff) + 0x80);\n            rgba &= 0xff00;\n            index_or_rgb = rgba | t | (a << 24);\n#endif\n            break;\n        }\n\n    default:\n#if QT_VERSION >= 0x040600\n        index_or_rgb = qim->colorCount();\n#else\n        index_or_rgb = qim->colorTable().count();\n#endif\n\n        qim->setColor(index_or_rgb, rgba);\n    }\n#else\n    if (qim->depth() == 32)\n    {\n        index_or_rgb = rgba;\n    }\n    else\n    {\n        index_or_rgb = qim->numColors();\n        qim->setNumColors(index_or_rgb + 1);\n\n        qim->setColor(index_or_rgb, rgba);\n    }\n#endif\n\n    qim->setPixel(x, y, index_or_rgb);\n}\n\n#else\n\nstatic const char *NextField(const char *s) {\n\t// In case there are leading spaces in the string\n\twhile (*s && *s == ' ') {\n\t\ts++;\n\t}\n\twhile (*s && *s != ' ') {\n\t\ts++;\n\t}\n\twhile (*s && *s == ' ') {\n\t\ts++;\n\t}\n\treturn s;\n}\n\n// Data lines in XPM can be terminated either with NUL or \"\nstatic size_t MeasureLength(const char *s) {\n\tsize_t i = 0;\n\twhile (s[i] && (s[i] != '\\\"'))\n\t\ti++;\n\treturn i;\n}\n\nColourDesired XPM::ColourFromCode(int ch) const {\n\treturn colourCodeTable[ch];\n}\n\nvoid XPM::FillRun(Surface *surface, int code, int startX, int y, int x) {\n\tif ((code != codeTransparent) && (startX != x)) {\n\t\tPRectangle rc(startX, y, x, y+1);\n\t\tsurface->FillRectangle(rc, ColourFromCode(code));\n\t}\n}\n\nXPM::XPM(const char *textForm) {\n\tInit(textForm);\n}\n\nXPM::XPM(const char *const *linesForm) {\n\tInit(linesForm);\n}\n\nXPM::~XPM() {\n\tClear();\n}\n\nvoid XPM::Init(const char *textForm) {\n\tClear();\n\t// Test done is two parts to avoid possibility of overstepping the memory\n\t// if memcmp implemented strangely. Must be 4 bytes at least at destination.\n\tif ((0 == memcmp(textForm, \"/* X\", 4)) && (0 == memcmp(textForm, \"/* XPM */\", 9))) {\n\t\t// Build the lines form out of the text form\n\t\tstd::vector<const char *> linesForm = LinesFormFromTextForm(textForm);\n\t\tif (!linesForm.empty()) {\n\t\t\tInit(&linesForm[0]);\n\t\t}\n\t} else {\n\t\t// It is really in line form\n\t\tInit(reinterpret_cast<const char * const *>(textForm));\n\t}\n}\n\nvoid XPM::Init(const char *const *linesForm) {\n\tClear();\n\theight = 1;\n\twidth = 1;\n\tnColours = 1;\n\tpixels.clear();\n\tcodeTransparent = ' ';\n\tif (!linesForm)\n\t\treturn;\n\n\tstd::fill(colourCodeTable, colourCodeTable+256, 0);\n\tconst char *line0 = linesForm[0];\n\twidth = atoi(line0);\n\tline0 = NextField(line0);\n\theight = atoi(line0);\n\tpixels.resize(width*height);\n\tline0 = NextField(line0);\n\tnColours = atoi(line0);\n\tline0 = NextField(line0);\n\tif (atoi(line0) != 1) {\n\t\t// Only one char per pixel is supported\n\t\treturn;\n\t}\n\n\tfor (int c=0; c<nColours; c++) {\n\t\tconst char *colourDef = linesForm[c+1];\n\t\tint code = static_cast<unsigned char>(colourDef[0]);\n\t\tcolourDef += 4;\n\t\tColourDesired colour(0xff, 0xff, 0xff);\n\t\tif (*colourDef == '#') {\n\t\t\tcolour.Set(colourDef);\n\t\t} else {\n\t\t\tcodeTransparent = code;\n\t\t}\n\t\tcolourCodeTable[code] = colour;\n\t}\n\n\tfor (int y=0; y<height; y++) {\n\t\tconst char *lform = linesForm[y+nColours+1];\n\t\tsize_t len = MeasureLength(lform);\n\t\tfor (size_t x = 0; x<len; x++) \n\t\t\tpixels[y * width + x] = static_cast<unsigned char>(lform[x]);\n\t}\n}\n\nvoid XPM::Clear() {\n}\n\nvoid XPM::Draw(Surface *surface, PRectangle &rc) {\n\tif (pixels.empty()) {\n\t\treturn;\n\t}\n\t// Centre the pixmap\n\tint startY = rc.top + (rc.Height() - height) / 2;\n\tint startX = rc.left + (rc.Width() - width) / 2;\n\tfor (int y=0; y<height; y++) {\n\t\tint prevCode = 0;\n\t\tint xStartRun = 0;\n\t\tfor (int x=0; x<width; x++) {\n\t\t\tint code = pixels[y * width + x];\n\t\t\tif (code != prevCode) {\n\t\t\t\tFillRun(surface, prevCode, startX + xStartRun, startY + y, startX + x);\n\t\t\t\txStartRun = x;\n\t\t\t\tprevCode = code;\n\t\t\t}\n\t\t}\n\t\tFillRun(surface, prevCode, startX + xStartRun, startY + y, startX + width);\n\t}\n}\n\nvoid XPM::PixelAt(int x, int y, ColourDesired &colour, bool &transparent) const {\n\tif (pixels.empty() || (x<0) || (x >= width) || (y<0) || (y >= height)) {\n\t\tcolour = 0;\n\t\ttransparent = true;\n\t\treturn;\n\t}\n\tint code = pixels[y * width + x];\n\ttransparent = code == codeTransparent;\n\tif (transparent) {\n\t\tcolour = 0;\n\t} else {\n\t\tcolour = ColourFromCode(code).AsLong();\n\t}\n}\n\nstd::vector<const char *> XPM::LinesFormFromTextForm(const char *textForm) {\n\t// Build the lines form out of the text form\n\tstd::vector<const char *> linesForm;\n\tint countQuotes = 0;\n\tint strings=1;\n\tint j=0;\n\tfor (; countQuotes < (2*strings) && textForm[j] != '\\0'; j++) {\n\t\tif (textForm[j] == '\\\"') {\n\t\t\tif (countQuotes == 0) {\n\t\t\t\t// First field: width, height, number of colors, chars per pixel\n\t\t\t\tconst char *line0 = textForm + j + 1;\n\t\t\t\t// Skip width\n\t\t\t\tline0 = NextField(line0);\n\t\t\t\t// Add 1 line for each pixel of height\n\t\t\t\tstrings += atoi(line0);\n\t\t\t\tline0 = NextField(line0);\n\t\t\t\t// Add 1 line for each colour\n\t\t\t\tstrings += atoi(line0);\n\t\t\t}\n\t\t\tif (countQuotes / 2 >= strings) {\n\t\t\t\tbreak;\t// Bad height or number of colors!\n\t\t\t}\n\t\t\tif ((countQuotes & 1) == 0) {\n\t\t\t\tlinesForm.push_back(textForm + j + 1);\n\t\t\t}\n\t\t\tcountQuotes++;\n\t\t}\n\t}\n\tif (textForm[j] == '\\0' || countQuotes / 2 > strings) {\n\t\t// Malformed XPM! Height + number of colors too high or too low\n\t\tlinesForm.clear();\n\t}\n\treturn linesForm;\n}\n\nRGBAImage::RGBAImage(int width_, int height_, float scale_, const unsigned char *pixels_) :\n\theight(height_), width(width_), scale(scale_) {\n\tif (pixels_) {\n\t\tpixelBytes.assign(pixels_, pixels_ + CountBytes());\n\t} else {\n\t\tpixelBytes.resize(CountBytes());\n\t}\n}\n\nRGBAImage::RGBAImage(const XPM &xpm) {\n\theight = xpm.GetHeight();\n\twidth = xpm.GetWidth();\n\tscale = 1;\n\tpixelBytes.resize(CountBytes());\n\tfor (int y=0; y<height; y++) {\n\t\tfor (int x=0; x<width; x++) {\n\t\t\tColourDesired colour;\n\t\t\tbool transparent = false;\n\t\t\txpm.PixelAt(x, y, colour, transparent);\n\t\t\tSetPixel(x, y, colour, transparent ? 0 : 255);\n\t\t}\n\t}\n}\n\nRGBAImage::~RGBAImage() {\n}\n\nint RGBAImage::CountBytes() const {\n\treturn width * height * 4;\n}\n\nconst unsigned char *RGBAImage::Pixels() const {\n\treturn &pixelBytes[0];\n}\n\nvoid RGBAImage::SetPixel(int x, int y, ColourDesired colour, int alpha) {\n\tunsigned char *pixel = &pixelBytes[0] + (y*width+x) * 4;\n\t// RGBA\n\tpixel[0] = static_cast<unsigned char>(colour.GetRed());\n\tpixel[1] = static_cast<unsigned char>(colour.GetGreen());\n\tpixel[2] = static_cast<unsigned char>(colour.GetBlue());\n\tpixel[3] = static_cast<unsigned char>(alpha);\n}\n\nRGBAImageSet::RGBAImageSet() : height(-1), width(-1){\n}\n\nRGBAImageSet::~RGBAImageSet() {\n\tClear();\n}\n\n/// Remove all images.\nvoid RGBAImageSet::Clear() {\n\tfor (ImageMap::iterator it=images.begin(); it != images.end(); ++it) {\n\t\tdelete it->second;\n\t\tit->second = 0;\n\t}\n\timages.clear();\n\theight = -1;\n\twidth = -1;\n}\n\n/// Add an image.\nvoid RGBAImageSet::Add(int ident, RGBAImage *image) {\n\tImageMap::iterator it=images.find(ident);\n\tif (it == images.end()) {\n\t\timages[ident] = image;\n\t} else {\n\t\tdelete it->second;\n\t\tit->second = image;\n\t}\n\theight = -1;\n\twidth = -1;\n}\n\n/// Get image by id.\nRGBAImage *RGBAImageSet::Get(int ident) {\n\tImageMap::iterator it = images.find(ident);\n\tif (it != images.end()) {\n\t\treturn it->second;\n\t}\n\treturn NULL;\n}\n\n/// Give the largest height of the set.\nint RGBAImageSet::GetHeight() const {\n\tif (height < 0) {\n\t\tfor (ImageMap::const_iterator it=images.begin(); it != images.end(); ++it) {\n\t\t\tif (height < it->second->GetHeight()) {\n\t\t\t\theight = it->second->GetHeight();\n\t\t\t}\n\t\t}\n\t}\n\treturn (height > 0) ? height : 0;\n}\n\n/// Give the largest width of the set.\nint RGBAImageSet::GetWidth() const {\n\tif (width < 0) {\n\t\tfor (ImageMap::const_iterator it=images.begin(); it != images.end(); ++it) {\n\t\t\tif (width < it->second->GetWidth()) {\n\t\t\t\twidth = it->second->GetWidth();\n\t\t\t}\n\t\t}\n\t}\n\treturn (width > 0) ? width : 0;\n}\n\n#endif\n"
  },
  {
    "path": "src/third-party/qscintilla-2.8.4/sources/src/XPM.h",
    "content": "// Scintilla source code edit control\n/** @file XPM.h\n ** Define a classes to hold image data in the X Pixmap (XPM) and RGBA formats.\n **/\n// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n// The License.txt file describes the conditions under which this software may be distributed.\n\n#ifndef XPM_H\n#define XPM_H\n\n#if defined(PLAT_QT)\n#include <qimage.h>\n#include <qpixmap.h>\n#endif\n\n#ifdef SCI_NAMESPACE\nnamespace Scintilla {\n#endif\n\n/**\n * Hold a pixmap in XPM format.\n */\nclass XPM {\n#if defined(PLAT_QT)\n    QPixmap qpm;\n\npublic:\n    XPM(const char *textForm);\n    XPM(const char *const *linesForm);\n    ~XPM() {}\n\n    void Draw(Surface *surface, PRectangle &rc);\n    int GetHeight() const {return qpm.height();}\n\n    const QPixmap &Pixmap() const {return qpm;}\n#else\n\tint height;\n\tint width;\n\tint nColours;\n\tstd::vector<unsigned char> pixels;\n\tColourDesired colourCodeTable[256];\n\tchar codeTransparent;\n\tColourDesired ColourFromCode(int ch) const;\n\tvoid FillRun(Surface *surface, int code, int startX, int y, int x);\npublic:\n\tXPM(const char *textForm);\n\tXPM(const char *const *linesForm);\n\t~XPM();\n\tvoid Init(const char *textForm);\n\tvoid Init(const char *const *linesForm);\n\tvoid Clear();\n\t/// Decompose image into runs and use FillRectangle for each run\n\tvoid Draw(Surface *surface, PRectangle &rc);\n\tint GetHeight() const { return height; }\n\tint GetWidth() const { return width; }\n\tvoid PixelAt(int x, int y, ColourDesired &colour, bool &transparent) const;\nprivate:\n\tstatic std::vector<const char *>LinesFormFromTextForm(const char *textForm);\n#endif\n};\n\n/**\n * A translucent image stored as a sequence of RGBA bytes.\n */\nclass RGBAImage {\n\t// Private so RGBAImage objects can not be copied\n\tRGBAImage(const RGBAImage &);\n\tRGBAImage &operator=(const RGBAImage &);\n\tint height;\n\tint width;\n\tfloat scale;\n#if defined(PLAT_QT)\n    QImage *qim;\n#else\n\tstd::vector<unsigned char> pixelBytes;\n#endif\npublic:\n\tRGBAImage(int width_, int height_, float scale_, const unsigned char *pixels_);\n\tRGBAImage(const XPM &xpm);\n\tvirtual ~RGBAImage();\n\tint GetHeight() const { return height; }\n\tint GetWidth() const { return width; }\n\tfloat GetScale() const { return scale; }\n\tfloat GetScaledHeight() const { return height / scale; }\n\tfloat GetScaledWidth() const { return width / scale; }\n#if !defined(PLAT_QT)\n\tint CountBytes() const;\n#endif\n\tconst unsigned char *Pixels() const;\n\tvoid SetPixel(int x, int y, ColourDesired colour, int alpha=0xff); \n};\n\n#if !defined(PLAT_QT)\n\n/**\n * A collection of RGBAImage pixmaps indexed by integer id.\n */\nclass RGBAImageSet {\n\ttypedef std::map<int, RGBAImage*> ImageMap;\n\tImageMap images;\n\tmutable int height;\t///< Memorize largest height of the set.\n\tmutable int width;\t///< Memorize largest width of the set.\npublic:\n\tRGBAImageSet();\n\t~RGBAImageSet();\n\t/// Remove all images.\n\tvoid Clear();\n\t/// Add an image.\n\tvoid Add(int ident, RGBAImage *image);\n\t/// Get image by id.\n\tRGBAImage *Get(int ident);\n\t/// Give the largest height of the set.\n\tint GetHeight() const;\n\t/// Give the largest width of the set.\n\tint GetWidth() const;\n};\n\n#endif\n\n#ifdef SCI_NAMESPACE\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "static_analysis/clang-tidy_debug_Aug2020.txt",
    "content": "\nEnabled checks:\n    clang-analyzer-apiModeling.StdCLibraryFunctions\n    clang-analyzer-apiModeling.TrustNonnull\n    clang-analyzer-apiModeling.google.GTest\n    clang-analyzer-apiModeling.llvm.CastValue\n    clang-analyzer-apiModeling.llvm.ReturnValue\n    clang-analyzer-core.CallAndMessage\n    clang-analyzer-core.DivideZero\n    clang-analyzer-core.DynamicTypePropagation\n    clang-analyzer-core.NonNullParamChecker\n    clang-analyzer-core.NonnilStringConstants\n    clang-analyzer-core.NullDereference\n    clang-analyzer-core.StackAddrEscapeBase\n    clang-analyzer-core.StackAddressEscape\n    clang-analyzer-core.UndefinedBinaryOperatorResult\n    clang-analyzer-core.VLASize\n    clang-analyzer-core.builtin.BuiltinFunctions\n    clang-analyzer-core.builtin.NoReturnFunctions\n    clang-analyzer-core.uninitialized.ArraySubscript\n    clang-analyzer-core.uninitialized.Assign\n    clang-analyzer-core.uninitialized.Branch\n    clang-analyzer-core.uninitialized.CapturedBlockVariable\n    clang-analyzer-core.uninitialized.UndefReturn\n    clang-analyzer-cplusplus.InnerPointer\n    clang-analyzer-cplusplus.Move\n    clang-analyzer-cplusplus.NewDelete\n    clang-analyzer-cplusplus.NewDeleteLeaks\n    clang-analyzer-cplusplus.PureVirtualCall\n    clang-analyzer-cplusplus.SelfAssignment\n    clang-analyzer-cplusplus.SmartPtr\n    clang-analyzer-cplusplus.VirtualCallModeling\n    clang-analyzer-deadcode.DeadStores\n    clang-analyzer-fuchsia.HandleChecker\n    clang-analyzer-nullability.NullPassedToNonnull\n    clang-analyzer-nullability.NullReturnedFromNonnull\n    clang-analyzer-nullability.NullabilityBase\n    clang-analyzer-nullability.NullableDereferenced\n    clang-analyzer-nullability.NullablePassedToNonnull\n    clang-analyzer-nullability.NullableReturnedFromNonnull\n    clang-analyzer-optin.cplusplus.UninitializedObject\n    clang-analyzer-optin.cplusplus.VirtualCall\n    clang-analyzer-optin.mpi.MPI-Checker\n    clang-analyzer-optin.osx.OSObjectCStyleCast\n    clang-analyzer-optin.osx.cocoa.localizability.EmptyLocalizationContextChecker\n    clang-analyzer-optin.osx.cocoa.localizability.NonLocalizedStringChecker\n    clang-analyzer-optin.performance.GCDAntipattern\n    clang-analyzer-optin.performance.Padding\n    clang-analyzer-optin.portability.UnixAPI\n    clang-analyzer-osx.API\n    clang-analyzer-osx.MIG\n    clang-analyzer-osx.NSOrCFErrorDerefChecker\n    clang-analyzer-osx.NumberObjectConversion\n    clang-analyzer-osx.OSObjectRetainCount\n    clang-analyzer-osx.ObjCProperty\n    clang-analyzer-osx.SecKeychainAPI\n    clang-analyzer-osx.cocoa.AtSync\n    clang-analyzer-osx.cocoa.AutoreleaseWrite\n    clang-analyzer-osx.cocoa.ClassRelease\n    clang-analyzer-osx.cocoa.Dealloc\n    clang-analyzer-osx.cocoa.IncompatibleMethodTypes\n    clang-analyzer-osx.cocoa.Loops\n    clang-analyzer-osx.cocoa.MissingSuperCall\n    clang-analyzer-osx.cocoa.NSAutoreleasePool\n    clang-analyzer-osx.cocoa.NSError\n    clang-analyzer-osx.cocoa.NilArg\n    clang-analyzer-osx.cocoa.NonNilReturnValue\n    clang-analyzer-osx.cocoa.ObjCGenerics\n    clang-analyzer-osx.cocoa.RetainCount\n    clang-analyzer-osx.cocoa.RetainCountBase\n    clang-analyzer-osx.cocoa.RunLoopAutoreleaseLeak\n    clang-analyzer-osx.cocoa.SelfInit\n    clang-analyzer-osx.cocoa.SuperDealloc\n    clang-analyzer-osx.cocoa.UnusedIvars\n    clang-analyzer-osx.cocoa.VariadicMethodTypes\n    clang-analyzer-osx.coreFoundation.CFError\n    clang-analyzer-osx.coreFoundation.CFNumber\n    clang-analyzer-osx.coreFoundation.CFRetainRelease\n    clang-analyzer-osx.coreFoundation.containers.OutOfBounds\n    clang-analyzer-osx.coreFoundation.containers.PointerSizedValues\n    clang-analyzer-security.FloatLoopCounter\n    clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling\n    clang-analyzer-security.insecureAPI.SecuritySyntaxChecker\n    clang-analyzer-security.insecureAPI.UncheckedReturn\n    clang-analyzer-security.insecureAPI.bcmp\n    clang-analyzer-security.insecureAPI.bcopy\n    clang-analyzer-security.insecureAPI.bzero\n    clang-analyzer-security.insecureAPI.decodeValueOfObjCType\n    clang-analyzer-security.insecureAPI.getpw\n    clang-analyzer-security.insecureAPI.gets\n    clang-analyzer-security.insecureAPI.mkstemp\n    clang-analyzer-security.insecureAPI.mktemp\n    clang-analyzer-security.insecureAPI.rand\n    clang-analyzer-security.insecureAPI.strcpy\n    clang-analyzer-security.insecureAPI.vfork\n    clang-analyzer-unix.API\n    clang-analyzer-unix.DynamicMemoryModeling\n    clang-analyzer-unix.Malloc\n    clang-analyzer-unix.MallocSizeof\n    clang-analyzer-unix.MismatchedDeallocator\n    clang-analyzer-unix.Vfork\n    clang-analyzer-unix.cstring.BadSizeArg\n    clang-analyzer-unix.cstring.CStringModeling\n    clang-analyzer-unix.cstring.NullArg\n    clang-analyzer-valist.CopyToSelf\n    clang-analyzer-valist.Uninitialized\n    clang-analyzer-valist.Unterminated\n    clang-analyzer-valist.ValistBase\n\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/global.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/comp.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/crypt.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/bcrypt_pbkdf.c\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/bcrypt_pbkdf.c:84:46: \nwarning: expression does not compute the number of elements in this array; element type is 'uint32_t' \n  (aka 'unsigned int'), not 'uint64_t' (aka 'unsigned long long') [clang-diagnostic-sizeof-array-div]\n        blf_enc(&state, cdata, sizeof(cdata) / sizeof(uint64_t));\n                                             ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/bcrypt_pbkdf.c:65:14: note: array 'cdata' declared here\n    uint32_t cdata[BCRYPT_BLOCKS];\n             ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/bcrypt_pbkdf.c:84:46: note: place parentheses around the 'sizeof(uint64_t)' expression to silence this warning\n        blf_enc(&state, cdata, sizeof(cdata) / sizeof(uint64_t));\n                                             ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/blowfish.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/agent.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/keepalive.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/mac.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/hostkey.c\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/hostkey.c:411:5: warning: Value stored to 'sig_len' is never read [clang-analyzer-deadcode.DeadStores]\n    sig_len -= 15;\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/hostkey.c:411:5: note: Value stored to 'sig_len' is never read\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/misc.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/packet.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:328:9: warning: Value stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores]\n        ret = EC_POINT_oct2point(ec_group, point, k, k_len, NULL);\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:328:9: note: Value stored to 'ret' is never read\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:1605:9: warning: Value stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores]\n        ret = -1;\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:1605:9: note: Value stored to 'ret' is never read\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:1613:9: warning: Value stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores]\n        ret = -1;\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:1613:9: note: Value stored to 'ret' is never read\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:1633:9: warning: Value stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores]\n        ret = -1;\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:1633:9: note: Value stored to 'ret' is never read\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:1656:13: warning: Value stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores]\n            ret = -1;\n            ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:1656:13: note: Value stored to 'ret' is never read\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:2384:9: warning: Although the value stored to 'rc' is used in the enclosing expression, the value is never actually read from 'rc' [clang-analyzer-deadcode.DeadStores]\n    if((rc = _libssh2_ecdsa_curve_name_with_octal_new(&ec_key, point_buf,\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:2384:9: note: Although the value stored to 'rc' is used in the enclosing expression, the value is never actually read from 'rc'\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:2393:9: warning: Value stored to 'rc' is never read [clang-analyzer-deadcode.DeadStores]\n        rc = -1;\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:2393:9: note: Value stored to 'rc' is never read\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/publickey.c\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/publickey.c:51:16: warning: Excessive padding in 'struct _LIBSSH2_PUBLICKEY_CODE_LIST' (8 padding bytes, where 0 is optimal). \nOptimal fields order: \nname, \ncode, \nname_len, \nconsider reordering the fields or adding explicit padding members [clang-analyzer-optin.performance.Padding]\ntypedef struct _LIBSSH2_PUBLICKEY_CODE_LIST\n               ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/publickey.c:51:16: note: Excessive padding in 'struct _LIBSSH2_PUBLICKEY_CODE_LIST' (8 padding bytes, where 0 is optimal). Optimal fields order: name, code, name_len, consider reordering the fields or adding explicit padding members\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/pem.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/scp.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/version.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/ssh/test.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/ssh/server.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/ssh/ssh.c\n/opt/robo/src/robomongo/ssh/ssh.c:111:16: warning: Potential leak of memory pointed to by 'session' [clang-analyzer-unix.Malloc]\n        return NULL;\n               ^\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:88:58: note: Memory is allocated\n    struct rbm_session *session = (struct rbm_session *) malloc(sizeof(struct rbm_session));\n                                                         ^\n/opt/robo/src/robomongo/ssh/ssh.c:89:9: note: Assuming 'session' is non-null\n    if (!session)\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:89:5: note: Taking false branch\n    if (!session)\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:101:9: note: Assuming field 'loglevel' is equal to RBM_SSH_LOG_TYPE_ERROR\n    if (config->loglevel != RBM_SSH_LOG_TYPE_ERROR &&\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:101:52: note: Left side of '&&' is false\n    if (config->loglevel != RBM_SSH_LOG_TYPE_ERROR &&\n                                                   ^\n/opt/robo/src/robomongo/ssh/ssh.c:110:9: note: Assuming 'publicsession' is null\n    if (!publicsession)\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:110:5: note: Taking true branch\n    if (!publicsession)\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:111:16: note: Potential leak of memory pointed to by 'session'\n        return NULL;\n               ^\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:196:16: warning: Potential leak of memory pointed to by 'channel' [clang-analyzer-unix.Malloc]\n        return NULL;\n               ^\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:142:5: note: Loop condition is true.  Entering loop body\n    while (1) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:143:14: note: Calling 'rbm_open_tunnel'\n        rc = rbm_open_tunnel(connection);\n             ^\n/opt/robo/src/robomongo/ssh/ssh.c:329:13: note: Assuming 'local_socket' is <= 'ssh_socket'\n    fdmax = local_socket > ssh_socket ? local_socket : ssh_socket;\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:329:13: note: '?' condition is false\n/opt/robo/src/robomongo/ssh/ssh.c:331:5: note: Loop condition is true.  Entering loop body\n    while (errors < maxerrors) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:337:13: note: Assuming the condition is false\n        if (!FD_ISSET(local_socket, &readset))\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:337:9: note: Taking false branch\n        if (!FD_ISSET(local_socket, &readset))\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:341:13: note: Assuming the condition is false\n        if (select(fdmax + 1, &readset, NULL, NULL, NULL) == -1) {\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:341:9: note: Taking false branch\n        if (select(fdmax + 1, &readset, NULL, NULL, NULL) == -1) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:348:26: note: Assuming 'isocket' is <= 'fdmax'\n        for(isocket = 0; isocket <= fdmax; isocket++) {\n                         ^\n/opt/robo/src/robomongo/ssh/ssh.c:348:9: note: Loop condition is true.  Entering loop body\n        for(isocket = 0; isocket <= fdmax; isocket++) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:351:17: note: Assuming the condition is false\n            if (!FD_ISSET(isocket, &readset))\n                ^\n/opt/robo/src/robomongo/ssh/ssh.c:351:13: note: Taking false branch\n            if (!FD_ISSET(isocket, &readset))\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:354:17: note: Assuming 'isocket' is equal to 'local_socket'\n            if (isocket == local_socket) {\n                ^\n/opt/robo/src/robomongo/ssh/ssh.c:354:13: note: Taking true branch\n            if (isocket == local_socket) {\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:355:22: note: Calling 'handle_new_client_connections'\n                rc = handle_new_client_connections(connection, &fdmax, &masterset);\n                     ^\n/opt/robo/src/robomongo/ssh/ssh.c:408:9: note: Assuming the condition is false\n    if ((newfd = accept(local_socket, (struct sockaddr *) &remoteaddr, &slen)) == -1) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:408:5: note: Taking false branch\n    if ((newfd = accept(local_socket, (struct sockaddr *) &remoteaddr, &slen)) == -1) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:414:13: note: Assuming the condition is false\n        if (newfd > *fdmax) {       // keep track of the maximum\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:414:9: note: Taking false branch\n        if (newfd > *fdmax) {       // keep track of the maximum\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:424:5: note: Loop condition is true.  Entering loop body\n    while (attempts < maxattempts) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:430:13: note: Assuming 'channel' is non-null\n        if (!channel) {\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:430:9: note: Taking false branch\n        if (!channel) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:446:9: note:  Execution continues on line 449\n        break;\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:449:10: note: 'channel' is non-null\n    if (!channel) {\n         ^\n/opt/robo/src/robomongo/ssh/ssh.c:449:5: note: Taking false branch\n    if (!channel) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:454:9: note: Calling 'rbm_channel_create'\n    if (rbm_channel_create(connection, newfd, channel) == NULL) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:190:35: note: Memory is allocated\n    struct rbm_channel *channel = malloc(sizeof(struct rbm_channel));\n                                  ^\n/opt/robo/src/robomongo/ssh/ssh.c:191:9: note: Assuming 'channel' is non-null\n    if (!channel)\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:191:5: note: Taking false branch\n    if (!channel)\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:195:9: note: Assuming 'inbuf' is null\n    if (!inbuf)\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:195:5: note: Taking true branch\n    if (!inbuf)\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:196:16: note: Potential leak of memory pointed to by 'channel'\n        return NULL;\n               ^\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:200:16: warning: Potential leak of memory pointed to by 'inbuf' [clang-analyzer-unix.Malloc]\n        return NULL;\n               ^\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:142:5: note: Loop condition is true.  Entering loop body\n    while (1) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:143:14: note: Calling 'rbm_open_tunnel'\n        rc = rbm_open_tunnel(connection);\n             ^\n/opt/robo/src/robomongo/ssh/ssh.c:329:13: note: Assuming 'local_socket' is <= 'ssh_socket'\n    fdmax = local_socket > ssh_socket ? local_socket : ssh_socket;\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:329:13: note: '?' condition is false\n/opt/robo/src/robomongo/ssh/ssh.c:331:5: note: Loop condition is true.  Entering loop body\n    while (errors < maxerrors) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:337:13: note: Assuming the condition is false\n        if (!FD_ISSET(local_socket, &readset))\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:337:9: note: Taking false branch\n        if (!FD_ISSET(local_socket, &readset))\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:341:13: note: Assuming the condition is false\n        if (select(fdmax + 1, &readset, NULL, NULL, NULL) == -1) {\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:341:9: note: Taking false branch\n        if (select(fdmax + 1, &readset, NULL, NULL, NULL) == -1) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:348:26: note: Assuming 'isocket' is <= 'fdmax'\n        for(isocket = 0; isocket <= fdmax; isocket++) {\n                         ^\n/opt/robo/src/robomongo/ssh/ssh.c:348:9: note: Loop condition is true.  Entering loop body\n        for(isocket = 0; isocket <= fdmax; isocket++) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:351:17: note: Assuming the condition is false\n            if (!FD_ISSET(isocket, &readset))\n                ^\n/opt/robo/src/robomongo/ssh/ssh.c:351:13: note: Taking false branch\n            if (!FD_ISSET(isocket, &readset))\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:354:17: note: Assuming 'isocket' is equal to 'local_socket'\n            if (isocket == local_socket) {\n                ^\n/opt/robo/src/robomongo/ssh/ssh.c:354:13: note: Taking true branch\n            if (isocket == local_socket) {\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:355:22: note: Calling 'handle_new_client_connections'\n                rc = handle_new_client_connections(connection, &fdmax, &masterset);\n                     ^\n/opt/robo/src/robomongo/ssh/ssh.c:408:9: note: Assuming the condition is false\n    if ((newfd = accept(local_socket, (struct sockaddr *) &remoteaddr, &slen)) == -1) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:408:5: note: Taking false branch\n    if ((newfd = accept(local_socket, (struct sockaddr *) &remoteaddr, &slen)) == -1) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:414:13: note: Assuming the condition is false\n        if (newfd > *fdmax) {       // keep track of the maximum\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:414:9: note: Taking false branch\n        if (newfd > *fdmax) {       // keep track of the maximum\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:424:5: note: Loop condition is true.  Entering loop body\n    while (attempts < maxattempts) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:430:13: note: Assuming 'channel' is non-null\n        if (!channel) {\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:430:9: note: Taking false branch\n        if (!channel) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:446:9: note:  Execution continues on line 449\n        break;\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:449:10: note: 'channel' is non-null\n    if (!channel) {\n         ^\n/opt/robo/src/robomongo/ssh/ssh.c:449:5: note: Taking false branch\n    if (!channel) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:454:9: note: Calling 'rbm_channel_create'\n    if (rbm_channel_create(connection, newfd, channel) == NULL) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:191:9: note: Assuming 'channel' is non-null\n    if (!channel)\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:191:5: note: Taking false branch\n    if (!channel)\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:194:19: note: Memory is allocated\n    char *inbuf = malloc(sizeof(char) * RBM_BUFSIZE);\n                  ^\n/opt/robo/src/robomongo/ssh/ssh.c:195:9: note: Assuming 'inbuf' is non-null\n    if (!inbuf)\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:195:5: note: Taking false branch\n    if (!inbuf)\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:199:9: note: Assuming 'outbuf' is null\n    if (!outbuf)\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:199:5: note: Taking true branch\n    if (!outbuf)\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:200:16: note: Potential leak of memory pointed to by 'inbuf'\n        return NULL;\n               ^\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:291:9: warning: Use of memory after it is freed [clang-analyzer-unix.Malloc]\n        rbm_channel_close(session->channels[0]);\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:142:5: note: Loop condition is true.  Entering loop body\n    while (1) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:143:14: note: Calling 'rbm_open_tunnel'\n        rc = rbm_open_tunnel(connection);\n             ^\n/opt/robo/src/robomongo/ssh/ssh.c:329:13: note: Assuming 'local_socket' is <= 'ssh_socket'\n    fdmax = local_socket > ssh_socket ? local_socket : ssh_socket;\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:329:13: note: '?' condition is false\n/opt/robo/src/robomongo/ssh/ssh.c:331:5: note: Loop condition is true.  Entering loop body\n    while (errors < maxerrors) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:337:13: note: Assuming the condition is true\n        if (!FD_ISSET(local_socket, &readset))\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:337:9: note: Taking true branch\n        if (!FD_ISSET(local_socket, &readset))\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:338:13: note:  Execution continues on line 385\n            break;\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:385:9: note: 'errors' is < 'maxerrors'\n    if (errors >= maxerrors) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:385:5: note: Taking false branch\n    if (errors >= maxerrors) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:390:5: note: Calling 'rbm_ssh_session_close'\n    rbm_ssh_session_close(connection->publicsession);\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:125:9: note: Assuming the condition is false\n    if (session->localsocket != rbm_socket_invalid) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:125:5: note: Taking false branch\n    if (session->localsocket != rbm_socket_invalid) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:131:5: note: Calling 'rbm_session_cleanup'\n    rbm_session_cleanup(session);\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:280:9: note: 'session' is not equal to NULL\n    if (session == NULL)\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:280:5: note: Taking false branch\n    if (session == NULL)\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:290:12: note: Assuming field 'channelssize' is > 0\n    while (session->channelssize > 0) {\n           ^\n/opt/robo/src/robomongo/ssh/ssh.c:290:5: note: Loop condition is true.  Entering loop body\n    while (session->channelssize > 0) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:291:9: note: Calling 'rbm_channel_close'\n        rbm_channel_close(session->channels[0]);\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:217:9: note: Assuming the condition is false\n    if (rbm_array_remove((void ***)&session->channels, &session->channelssize, channel))\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:217:5: note: Taking false branch\n    if (rbm_array_remove((void ***)&session->channels, &session->channelssize, channel))\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:221:9: note: Assuming the condition is false\n    if (channel->socket != rbm_socket_invalid) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:221:5: note: Taking false branch\n    if (channel->socket != rbm_socket_invalid) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:227:9: note: Assuming field 'channel' is null\n    if (channel->channel) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:227:5: note: Taking false branch\n    if (channel->channel) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:239:5: note: Memory is released\n    free(channel);\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:291:9: note: Returning; memory was released via 1st parameter\n        rbm_channel_close(session->channels[0]);\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:290:21: note: Field 'channelssize' is > 0\n    while (session->channelssize > 0) {\n                    ^\n/opt/robo/src/robomongo/ssh/ssh.c:290:5: note: Loop condition is true.  Entering loop body\n    while (session->channelssize > 0) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:291:9: note: Use of memory after it is freed\n        rbm_channel_close(session->channels[0]);\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:322:5: warning: The bzero() function is obsoleted by memset() [clang-analyzer-security.insecureAPI.bzero]\n    FD_ZERO(&masterset);\n    ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_zero.h:29:25: note: expanded from macro 'FD_ZERO'\n#define FD_ZERO(p)      __DARWIN_FD_ZERO(p)\n                        ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_def.h:108:33: note: expanded from macro '__DARWIN_FD_ZERO'\n#define __DARWIN_FD_ZERO(p)     __builtin_bzero(p, sizeof(*(p)))\n                                ^\n/opt/robo/src/robomongo/ssh/ssh.c:322:5: note: The bzero() function is obsoleted by memset()\n    FD_ZERO(&masterset);\n    ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_zero.h:29:25: note: expanded from macro 'FD_ZERO'\n#define FD_ZERO(p)      __DARWIN_FD_ZERO(p)\n                        ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_def.h:108:33: note: expanded from macro '__DARWIN_FD_ZERO'\n#define __DARWIN_FD_ZERO(p)     __builtin_bzero(p, sizeof(*(p)))\n                                ^\n/opt/robo/src/robomongo/ssh/ssh.c:429:13: warning: Value stored to 'errsave' during its initialization is never read [clang-analyzer-deadcode.DeadStores]\n        int errsave = errno;\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:429:13: note: Value stored to 'errsave' during its initialization is never read\n/opt/robo/src/robomongo/ssh/ssh.c:510:17: warning: Value stored to 'result' is never read [clang-analyzer-deadcode.DeadStores]\n                result = RBM_ERROR;\n                ^\n/opt/robo/src/robomongo/ssh/ssh.c:510:17: note: Value stored to 'result' is never read\n/opt/robo/src/robomongo/ssh/ssh.c:730:5: warning: Value stored to 'fingerprint' is never read [clang-analyzer-deadcode.DeadStores]\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:730:5: note: Value stored to 'fingerprint' is never read\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/ssh/log.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/ssh/array.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2191:9: warning: Value stored to 's' is never read [clang-analyzer-deadcode.DeadStores]\n        s += host_sig_len;\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2191:9: note: Value stored to 's' is never read\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2607:15: warning: 2nd function call argument is an uninitialized value [clang-analyzer-core.CallAndMessage]\n        ret = ecdh_sha2_nistp(session, type, key_state->data,\n              ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2533:5: note: 'type' declared without an initial value\n    libssh2_curve_type type;\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2535:8: note: Assuming field 'state' is not equal to libssh2_NB_state_idle\n    if(key_state->state == libssh2_NB_state_idle) {\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2535:5: note: Taking false branch\n    if(key_state->state == libssh2_NB_state_idle) {\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2541:8: note: Assuming field 'state' is not equal to libssh2_NB_state_created\n    if(key_state->state == libssh2_NB_state_created) {\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2541:5: note: Taking false branch\n    if(key_state->state == libssh2_NB_state_created) {\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2572:8: note: Assuming field 'state' is not equal to libssh2_NB_state_sent\n    if(key_state->state == libssh2_NB_state_sent) {\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2572:5: note: Taking false branch\n    if(key_state->state == libssh2_NB_state_sent) {\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2587:8: note: Assuming field 'state' is not equal to libssh2_NB_state_sent1\n    if(key_state->state == libssh2_NB_state_sent1) {\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2587:5: note: Taking false branch\n    if(key_state->state == libssh2_NB_state_sent1) {\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2603:8: note: Assuming field 'state' is equal to libssh2_NB_state_sent2\n    if(key_state->state == libssh2_NB_state_sent2) {\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2603:5: note: Taking true branch\n    if(key_state->state == libssh2_NB_state_sent2) {\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2605:15: note: Calling 'kex_session_ecdh_curve_type'\n        (void)kex_session_ecdh_curve_type(session->kex->name, &type);\n              ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:1900:8: note: Assuming 'name' is equal to NULL\n    if(name == NULL)\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:1900:5: note: Taking true branch\n    if(name == NULL)\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:1901:9: note: Returning without writing to '*out_type'\n        return -1;\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2605:15: note: Returning from 'kex_session_ecdh_curve_type'\n        (void)kex_session_ecdh_curve_type(session->kex->name, &type);\n              ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2607:15: note: 2nd function call argument is an uninitialized value\n        ret = ecdh_sha2_nistp(session, type, key_state->data,\n              ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:3526:13: warning: Value stored to 'p' is never read [clang-analyzer-deadcode.DeadStores]\n            p += lang_sc_len + 4;\n            ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:3526:13: note: Value stored to 'p' is never read\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/transport.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qjson-0.8.1/sources/src/qobjecthelper.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qjson-0.8.1/sources/src/parser.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qjson-0.8.1/sources/src/json_scanner.cpp\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/json_scanner.cc:3837:2: warning: Call to virtual method 'yyFlexLexer::yy_delete_buffer' during destruction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]\n        yy_delete_buffer( YY_CURRENT_BUFFER );\n        ^\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/json_scanner.cpp:46:1: note: Calling '~yyFlexLexer'\n}\n^\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/json_scanner.cc:3837:20: note: Assuming field 'yy_buffer_stack' is null\n        yy_delete_buffer( YY_CURRENT_BUFFER );\n                          ^\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/json_scanner.cc:274:29: note: expanded from macro 'YY_CURRENT_BUFFER'\n#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \\\n                            ^\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/json_scanner.cc:3837:20: note: '?' condition is false\n        yy_delete_buffer( YY_CURRENT_BUFFER );\n                          ^\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/json_scanner.cc:274:29: note: expanded from macro 'YY_CURRENT_BUFFER'\n#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \\\n                            ^\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/json_scanner.cc:3837:2: note: Call to virtual method 'yyFlexLexer::yy_delete_buffer' during destruction bypasses virtual dispatch\n        yy_delete_buffer( YY_CURRENT_BUFFER );\n        ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:181:42: warning: Null pointer passed as 1st argument to string length function [clang-analyzer-unix.cstring.NullArg]\n                                   salt, strlen(salt));\n                                         ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:625:8: note: Assuming 'hostlen' is >= 1\n    if(hostlen < 1)\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:625:5: note: Taking false branch\n    if(hostlen < 1)\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:631:5: note: Loop condition is true.  Entering loop body\n    while(name > host) {\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:637:13: note: Assuming 'name' is equal to 'host'\n        if((name == host) || (*(name-1) == ',')) {\n            ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:637:27: note: Left side of '||' is true\n        if((name == host) || (*(name-1) == ',')) {\n                          ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:642:13: note: Taking false branch\n            if(namelen >= sizeof(hostbuf)-1)\n            ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:652:48: note: Passing null pointer value via 3rd parameter 'salt'\n            rc = knownhost_add(hosts, hostbuf, NULL,\n                                               ^\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:16: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n               ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:652:18: note: Calling 'knownhost_add'\n            rc = knownhost_add(hosts, hostbuf, NULL,\n                 ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:148:8: note: Assuming the condition is false\n    if(!(typemask & LIBSSH2_KNOWNHOST_KEY_MASK))\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:148:5: note: Taking false branch\n    if(!(typemask & LIBSSH2_KNOWNHOST_KEY_MASK))\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:153:8: note: Assuming 'entry' is non-null\n    if(!entry)\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:153:5: note: Taking false branch\n    if(!entry)\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:160:5: note: Control jumps to 'case 2:'  at line 172\n    switch(entry->typemask  & LIBSSH2_KNOWNHOST_TYPE_MASK) {\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:175:12: note: Assuming 'rc' is 0\n        if(rc)\n           ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:175:9: note: Taking false branch\n        if(rc)\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:181:42: note: Null pointer passed as 1st argument to string length function\n                                   salt, strlen(salt));\n                                         ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/session.c\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/session.c:655:13: warning: The bzero() function is obsoleted by memset() [clang-analyzer-security.insecureAPI.bzero]\n            FD_ZERO(&rfd);\n            ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_zero.h:29:25: note: expanded from macro 'FD_ZERO'\n#define FD_ZERO(p)      __DARWIN_FD_ZERO(p)\n                        ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_def.h:108:33: note: expanded from macro '__DARWIN_FD_ZERO'\n#define __DARWIN_FD_ZERO(p)     __builtin_bzero(p, sizeof(*(p)))\n                                ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/session.c:655:13: note: The bzero() function is obsoleted by memset()\n            FD_ZERO(&rfd);\n            ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_zero.h:29:25: note: expanded from macro 'FD_ZERO'\n#define FD_ZERO(p)      __DARWIN_FD_ZERO(p)\n                        ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_def.h:108:33: note: expanded from macro '__DARWIN_FD_ZERO'\n#define __DARWIN_FD_ZERO(p)     __builtin_bzero(p, sizeof(*(p)))\n                                ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/session.c:661:13: warning: The bzero() function is obsoleted by memset() [clang-analyzer-security.insecureAPI.bzero]\n            FD_ZERO(&wfd);\n            ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_zero.h:29:25: note: expanded from macro 'FD_ZERO'\n#define FD_ZERO(p)      __DARWIN_FD_ZERO(p)\n                        ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_def.h:108:33: note: expanded from macro '__DARWIN_FD_ZERO'\n#define __DARWIN_FD_ZERO(p)     __builtin_bzero(p, sizeof(*(p)))\n                                ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/session.c:661:13: note: The bzero() function is obsoleted by memset()\n            FD_ZERO(&wfd);\n            ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_zero.h:29:25: note: expanded from macro 'FD_ZERO'\n#define FD_ZERO(p)      __DARWIN_FD_ZERO(p)\n                        ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_def.h:108:33: note: expanded from macro '__DARWIN_FD_ZERO'\n#define __DARWIN_FD_ZERO(p)     __builtin_bzero(p, sizeof(*(p)))\n                                ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/session.c:1549:5: warning: The bzero() function is obsoleted by memset() [clang-analyzer-security.insecureAPI.bzero]\n    FD_ZERO(&rfds);\n    ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_zero.h:29:25: note: expanded from macro 'FD_ZERO'\n#define FD_ZERO(p)      __DARWIN_FD_ZERO(p)\n                        ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_def.h:108:33: note: expanded from macro '__DARWIN_FD_ZERO'\n#define __DARWIN_FD_ZERO(p)     __builtin_bzero(p, sizeof(*(p)))\n                                ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/session.c:1549:5: note: The bzero() function is obsoleted by memset()\n    FD_ZERO(&rfds);\n    ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_zero.h:29:25: note: expanded from macro 'FD_ZERO'\n#define FD_ZERO(p)      __DARWIN_FD_ZERO(p)\n                        ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_def.h:108:33: note: expanded from macro '__DARWIN_FD_ZERO'\n#define __DARWIN_FD_ZERO(p)     __builtin_bzero(p, sizeof(*(p)))\n                                ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/session.c:1550:5: warning: The bzero() function is obsoleted by memset() [clang-analyzer-security.insecureAPI.bzero]\n    FD_ZERO(&wfds);\n    ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_zero.h:29:25: note: expanded from macro 'FD_ZERO'\n#define FD_ZERO(p)      __DARWIN_FD_ZERO(p)\n                        ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_def.h:108:33: note: expanded from macro '__DARWIN_FD_ZERO'\n#define __DARWIN_FD_ZERO(p)     __builtin_bzero(p, sizeof(*(p)))\n                                ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/session.c:1550:5: note: The bzero() function is obsoleted by memset()\n    FD_ZERO(&wfds);\n    ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_zero.h:29:25: note: expanded from macro 'FD_ZERO'\n#define FD_ZERO(p)      __DARWIN_FD_ZERO(p)\n                        ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_def.h:108:33: note: expanded from macro '__DARWIN_FD_ZERO'\n#define __DARWIN_FD_ZERO(p)     __builtin_bzero(p, sizeof(*(p)))\n                                ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/build/debug/src/third-party/qjson-0.8.1/qjson_autogen/mocs_compilation.cpp\nerror: no input files [clang-diagnostic-error]\nerror: no such file or directory: '/opt/robo/build/debug/src/third-party/qjson-0.8.1/qjson_autogen/mocs_compilation.cpp' [clang-diagnostic-error]\nerror: unable to handle compilation, expected exactly one compiler job in '' [clang-diagnostic-error]\nclang-tidy -p=/opt/robo/build/debug /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciabstractapis.cpp\nerror: no input files [clang-diagnostic-error]\nerror: no such file or directory: '/opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciabstractapis.cpp' [clang-diagnostic-error]\nerror: unable to handle compilation, expected exactly one compiler job in '' [clang-diagnostic-error]\nclang-tidy -p=/opt/robo/build/debug /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciapis.cpp\nerror: no input files [clang-diagnostic-error]\nerror: no such file or directory: '/opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciapis.cpp' [clang-diagnostic-error]\nerror: unable to handle compilation, expected exactly one compiler job in '' [clang-diagnostic-error]\nclang-tidy -p=/opt/robo/build/debug /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscilexer.cpp\nerror: no input files [clang-diagnostic-error]\nerror: no such file or directory: '/opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscilexer.cpp' [clang-diagnostic-error]\nerror: unable to handle compilation, expected exactly one compiler job in '' [clang-diagnostic-error]\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qjson-0.8.1/sources/src/parserrunnable.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscilexercpp.cpp\nerror: no input files [clang-diagnostic-error]\nerror: no such file or directory: '/opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscilexercpp.cpp' [clang-diagnostic-error]\nerror: unable to handle compilation, expected exactly one compiler job in '' [clang-diagnostic-error]\nclang-tidy -p=/opt/robo/build/debug /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscilexerjavascript.cpp\nerror: no input files [clang-diagnostic-error]\nerror: no such file or directory: '/opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscilexerjavascript.cpp' [clang-diagnostic-error]\nerror: unable to handle compilation, expected exactly one compiler job in '' [clang-diagnostic-error]\nclang-tidy -p=/opt/robo/build/debug /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscimacro.cpp\nerror: no input files [clang-diagnostic-error]\nerror: no such file or directory: '/opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscimacro.cpp' [clang-diagnostic-error]\nerror: unable to handle compilation, expected exactly one compiler job in '' [clang-diagnostic-error]\nclang-tidy -p=/opt/robo/build/debug /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciscintilla.cpp\nerror: no input files [clang-diagnostic-error]\nerror: no such file or directory: '/opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciscintilla.cpp' [clang-diagnostic-error]\nerror: unable to handle compilation, expected exactly one compiler job in '' [clang-diagnostic-error]\nclang-tidy -p=/opt/robo/build/debug /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciscintillabase.cpp\nerror: no input files [clang-diagnostic-error]\nerror: no such file or directory: '/opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciscintillabase.cpp' [clang-diagnostic-error]\nerror: unable to handle compilation, expected exactly one compiler job in '' [clang-diagnostic-error]\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qjson-0.8.1/sources/src/json_parser.cc\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/lexlib/WordList.cpp\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexlib/WordList.cpp:126:2: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]\n        strcpy(list, s);\n        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexlib/WordList.cpp:126:2: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/lexlib/LexerBase.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qjson-0.8.1/sources/src/serializerrunnable.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/channel.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/lexlib/LexerModule.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/lexlib/CharacterCategory.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/lexlib/LexerSimple.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/lexlib/LexerNoExceptions.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/lexlib/Accessor.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/lexlib/CharacterSet.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerjavascript.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qjson-0.8.1/sources/src/serializer.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/lexlib/StyleContext.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexercpp.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/userauth.c\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/userauth.c:765:8: warning: Access to field 'signv' results in a dereference of a null pointer (loaded from variable 'privkeyobj') [clang-analyzer-core.NullDereference]\n    if(privkeyobj->signv(session, sig, sig_len, 1, &datavec,\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/userauth.c:752:10: note: Calling 'memory_read_privatekey'\n    rc = memory_read_privatekey(session, &privkeyobj, &hostkey_abstract,\n         ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/userauth.c:669:5: note: Null pointer value stored to 'privkeyobj'\n    *hostkey_method = NULL;\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/userauth.c:671:11: note: Assuming the condition is false\n    while(*hostkey_methods_avail && (*hostkey_methods_avail)->name) {\n          ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/userauth.c:671:34: note: Left side of '&&' is false\n    while(*hostkey_methods_avail && (*hostkey_methods_avail)->name) {\n                                 ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/userauth.c:680:5: note: Taking true branch\n    if(!*hostkey_method) {\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/userauth.c:681:9: note: Returning value, which participates in a condition later\n        return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NONE,\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/userauth.c:752:10: note: Returning from 'memory_read_privatekey'\n    rc = memory_read_privatekey(session, &privkeyobj, &hostkey_abstract,\n         ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/userauth.c:758:8: note: Assuming 'rc' is 0\n    if(rc)\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/userauth.c:758:5: note: Taking false branch\n    if(rc)\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/userauth.c:765:8: note: Access to field 'signv' results in a dereference of a null pointer (loaded from variable 'privkeyobj')\n    if(privkeyobj->signv(session, sig, sig_len, 1, &datavec,\n       ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscistyle.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciabstractapis.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/InputMethod.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ScintillaQt.cpp\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ScintillaQt.cpp:116:5: warning: Call to virtual method 'QsciScintillaQt::Initialise' during construction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]\n    Initialise();\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ScintillaQt.cpp:116:5: note: Call to virtual method 'QsciScintillaQt::Initialise' during construction bypasses virtual dispatch\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ScintillaQt.cpp:123:5: warning: Call to virtual method 'QsciScintillaQt::Finalise' during destruction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]\n    Finalise();\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ScintillaQt.cpp:123:5: note: Call to virtual method 'QsciScintillaQt::Finalise' during destruction bypasses virtual dispatch\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ScintillaQt.cpp:130:5: warning: Call to virtual method 'QsciScintillaQt::SetTicking' during construction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]\n    SetTicking(true);\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ScintillaQt.cpp:116:5: note: Calling 'QsciScintillaQt::Initialise'\n    Initialise();\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ScintillaQt.cpp:130:5: note: Call to virtual method 'QsciScintillaQt::SetTicking' during construction bypasses virtual dispatch\n    SetTicking(true);\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ScintillaQt.cpp:137:5: warning: Call to virtual method 'QsciScintillaQt::SetTicking' during destruction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]\n    SetTicking(false);\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ScintillaQt.cpp:123:5: note: Calling 'QsciScintillaQt::Finalise'\n    Finalise();\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ScintillaQt.cpp:137:5: note: Call to virtual method 'QsciScintillaQt::SetTicking' during destruction bypasses virtual dispatch\n    SetTicking(false);\n    ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscidocument.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintillabase.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscistyledtext.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscicommand.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ListBoxQt.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/lexlib/PropSetSimple.cpp\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexlib/PropSetSimple.cpp:149:3: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]\n                strcpy(result, val.c_str());\n                ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexlib/PropSetSimple.cpp:149:3: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexer.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/SciClasses.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/MacPasteboardMime.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/PlatQt.cpp\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/PlatQt.cpp:259:5: warning: Call to virtual method 'SurfaceImpl::Release' during destruction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]\n    Release();\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/PlatQt.cpp:259:5: note: Call to virtual method 'SurfaceImpl::Release' during destruction bypasses virtual dispatch\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscicommandset.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciprinter.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscimacro.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/CaseFolder.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Catalogue.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/CallTip.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/CharClassify.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:148:12: warning: The result of the left shift is undefined because the right operand is negative [clang-analyzer-core.UndefinedBinaryOperatorResult]\n                return 1 << level;\n                         ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:506:6: note: Assuming field 'identifiersAllowDollars' is false\n        if (options.identifiersAllowDollars) {\n            ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:506:2: note: Taking false branch\n        if (options.identifiersAllowDollars) {\n        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:520:7: note: Assuming the condition is false\n        if ((MaskActive(initStyle) == SCE_C_PREPROCESSOR) ||\n             ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:520:6: note: Left side of '||' is false\n        if ((MaskActive(initStyle) == SCE_C_PREPROCESSOR) ||\n            ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:521:8: note: Assuming the condition is false\n      (MaskActive(initStyle) == SCE_C_COMMENTLINE) ||\n       ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:520:6: note: Left side of '||' is false\n        if ((MaskActive(initStyle) == SCE_C_PREPROCESSOR) ||\n            ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:522:8: note: Assuming the condition is false\n      (MaskActive(initStyle) == SCE_C_COMMENTLINEDOC)) {\n       ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:520:2: note: Taking false branch\n        if ((MaskActive(initStyle) == SCE_C_PREPROCESSOR) ||\n        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:533:6: note: Assuming 'startPos' is <= 0\n        if (startPos > 0) {\n            ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:533:2: note: Taking false branch\n        if (startPos > 0) {\n        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:543:24: note: Calling 'PPStates::ForLine'\n        LinePPState preproc = vlls.ForLine(lineCurrent);\n                              ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:192:8: note: Assuming 'line' is <= 0\n                if ((line > 0) && (vlls.size() > static_cast<size_t>(line))) {\n                     ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:192:18: note: Left side of '&&' is false\n                if ((line > 0) && (vlls.size() > static_cast<size_t>(line))) {\n                               ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:195:11: note: Calling default constructor for 'LinePPState'\n                        return LinePPState();\n                               ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:151:40: note: The value -1 is assigned to 'preproc.level'\n        LinePPState() : state(0), ifTaken(0), level(-1) {\n                                              ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:195:11: note: Returning from default constructor for 'LinePPState'\n                        return LinePPState();\n                               ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:543:24: note: Returning from 'PPStates::ForLine'\n        LinePPState preproc = vlls.ForLine(lineCurrent);\n                              ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:549:6: note: Assuming field 'updatePreprocessor' is true\n        if (!options.updatePreprocessor)\n            ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:549:2: note: Taking false branch\n        if (!options.updatePreprocessor)\n        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:553:2: note: Taking true branch\n        if (itInvalid != ppDefineHistory.end()) {\n        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:559:2: note: Loop condition is false. Execution continues on line 566\n        for (std::vector<PPDefinition>::iterator itDef = ppDefineHistory.begin(); itDef != ppDefineHistory.end(); ++itDef) {\n        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:569:20: note: '?' condition is false\n        int activitySet = preproc.IsInactive() ? activeFlag : 0;\n                          ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:576:2: note: Loop condition is true.  Entering loop body\n        for (; sc.More();) {\n        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:578:10: note: Field 'atLineStart' is false\n                if (sc.atLineStart) {\n                       ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:578:3: note: Taking false branch\n                if (sc.atLineStart) {\n                ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:601:10: note: Field 'atLineEnd' is false\n                if (sc.atLineEnd) {\n                       ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:601:3: note: Taking false branch\n                if (sc.atLineEnd) {\n                ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:611:7: note: Assuming the condition is false\n                if (sc.ch == '\\\\') {\n                    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:611:3: note: Taking false branch\n                if (sc.ch == '\\\\') {\n                ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:630:3: note: 'Default' branch taken. Execution continues on line 861\n                switch (MaskActive(sc.state)) {\n                ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:861:10: note: Field 'atLineEnd' is false\n                if (sc.atLineEnd && !atLineEndBeforeSwitch) {\n                       ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:861:20: note: Left side of '&&' is false\n                if (sc.atLineEnd && !atLineEndBeforeSwitch) {\n                                 ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:869:7: note: Assuming the condition is true\n                if (MaskActive(sc.state) == SCE_C_DEFAULT) {\n                    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:869:3: note: Taking true branch\n                if (MaskActive(sc.state) == SCE_C_DEFAULT) {\n                ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:870:4: note: Taking false branch\n                        if (sc.Match('@', '\\\"')) {\n                        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:873:15: note: Assuming field 'triplequotedStrings' is false\n                        } else if (options.triplequotedStrings && sc.Match(\"\\\"\\\"\\\"\")) {\n                                   ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:873:43: note: Left side of '&&' is false\n                        } else if (options.triplequotedStrings && sc.Match(\"\\\"\\\"\\\"\")) {\n                                                               ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:876:15: note: Assuming field 'hashquotedStrings' is false\n                        } else if (options.hashquotedStrings && sc.Match('#', '\\\"')) {\n                                   ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:876:41: note: Left side of '&&' is false\n                        } else if (options.hashquotedStrings && sc.Match('#', '\\\"')) {\n                                                             ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:879:15: note: Left side of '||' is false\n                        } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n                                   ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:879:35: note: Assuming the condition is false\n                        } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n                                                       ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:879:48: note: Left side of '&&' is false\n                        } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\n                                                                    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:886:19: note: Field 'atLineEnd' is false\n                        } else if (!sc.atLineEnd && (setWordStart.Contains(sc.ch) || (sc.ch == '@'))) {\n                                       ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:886:15: note: Left side of '&&' is true\n                        } else if (!sc.atLineEnd && (setWordStart.Contains(sc.ch) || (sc.ch == '@'))) {\n                                   ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:886:33: note: Assuming the condition is false\n                        } else if (!sc.atLineEnd && (setWordStart.Contains(sc.ch) || (sc.ch == '@'))) {\n                                                     ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:886:33: note: Left side of '||' is false\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:886:11: note: Taking false branch\n                        } else if (!sc.atLineEnd && (setWordStart.Contains(sc.ch) || (sc.ch == '@'))) {\n                               ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:893:11: note: Taking false branch\n                        } else if (sc.Match('/', '*')) {\n                               ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:900:11: note: Taking false branch\n                        } else if (sc.Match('/', '/')) {\n                               ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:907:8: note: Left side of '&&' is false\n                                   && (setOKBeforeRE.Contains(chPrevNonWhite)\n                                   ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:913:15: note: Assuming the condition is false\n                        } else if (sc.ch == '\\\"') {\n                                   ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:913:11: note: Taking false branch\n                        } else if (sc.ch == '\\\"') {\n                               ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:933:15: note: 'isIncludePreprocessor' is false\n                        } else if (isIncludePreprocessor && sc.ch == '<') {\n                                   ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:933:37: note: Left side of '&&' is false\n                        } else if (isIncludePreprocessor && sc.ch == '<') {\n                                                         ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:935:15: note: Assuming the condition is false\n                        } else if (sc.ch == '\\'') {\n                                   ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:935:11: note: Taking false branch\n                        } else if (sc.ch == '\\'') {\n                               ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:937:15: note: Assuming the condition is true\n                        } else if (sc.ch == '#' && visibleChars == 0) {\n                                   ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:937:15: note: Left side of '&&' is true\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:937:31: note: 'visibleChars' is equal to 0\n                        } else if (sc.ch == '#' && visibleChars == 0) {\n                                                   ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:937:11: note: Taking true branch\n                        } else if (sc.ch == '#' && visibleChars == 0) {\n                               ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:943:15: note: Assuming the condition is false\n                                } while ((sc.ch == ' ' || sc.ch == '\\t') && sc.More());\n                                          ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:943:15: note: Left side of '||' is false\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:943:31: note: Assuming the condition is false\n                                } while ((sc.ch == ' ' || sc.ch == '\\t') && sc.More());\n                                                          ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:943:46: note: Left side of '&&' is false\n                                } while ((sc.ch == ' ' || sc.ch == '\\t') && sc.More());\n                                                                         ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:941:5: note: Loop condition is false.  Exiting loop\n                                do {\n                                ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:944:12: note: Field 'atLineEnd' is false\n                                if (sc.atLineEnd) {\n                                       ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:944:5: note: Taking false branch\n                                if (sc.atLineEnd) {\n                                ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:946:12: note: Taking false branch\n                                } else if (sc.Match(\"include\")) {\n                                       ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:949:10: note: Assuming field 'trackPreprocessor' is true\n                                        if (options.trackPreprocessor) {\n                                            ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:949:6: note: Taking true branch\n                                        if (options.trackPreprocessor) {\n                                        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:950:11: note: Left side of '||' is false\n                                                if (sc.Match(\"ifdef\") || sc.Match(\"ifndef\")) {\n                                                    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:950:7: note: Taking false branch\n                                                if (sc.Match(\"ifdef\") || sc.Match(\"ifndef\")) {\n                                                ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:956:18: note: Assuming the condition is false\n                                                } else if (sc.Match(\"if\")) {\n                                                           ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:956:14: note: Taking false branch\n                                                } else if (sc.Match(\"if\")) {\n                                                       ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:960:18: note: Assuming the condition is true\n                                                } else if (sc.Match(\"else\")) {\n                                                           ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:960:14: note: Taking true branch\n                                                } else if (sc.Match(\"else\")) {\n                                                       ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:961:13: note: Calling 'LinePPState::CurrentIfTaken'\n                                                        if (!preproc.CurrentIfTaken()) {\n                                                             ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:157:21: note: Calling 'LinePPState::maskLevel'\n                return (ifTaken & maskLevel()) != 0;\n                                  ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:148:12: note: The result of the left shift is undefined because the right operand is negative\n                return 1 << level;\n                         ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/AutoComplete.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Decoration.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:119:5: warning: Call to virtual method 'QsciScintilla::setColor' during construction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]\n    setColor(pal.text().color());\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:119:5: note: Call to virtual method 'QsciScintilla::setColor' during construction bypasses virtual dispatch\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:120:5: warning: Call to virtual method 'QsciScintilla::setPaper' during construction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]\n    setPaper(pal.base().color());\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:120:5: note: Call to virtual method 'QsciScintilla::setPaper' during construction bypasses virtual dispatch\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:121:5: warning: Call to virtual method 'QsciScintilla::setSelectionForegroundColor' during construction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]\n    setSelectionForegroundColor(pal.highlightedText().color());\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:121:5: note: Call to virtual method 'QsciScintilla::setSelectionForegroundColor' during construction bypasses virtual dispatch\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:122:5: warning: Call to virtual method 'QsciScintilla::setSelectionBackgroundColor' during construction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]\n    setSelectionBackgroundColor(pal.highlight().color());\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:122:5: note: Call to virtual method 'QsciScintilla::setSelectionBackgroundColor' during construction bypasses virtual dispatch\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:128:5: warning: Call to virtual method 'QsciScintilla::setEolMode' during construction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]\n    setEolMode(EolUnix);\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:128:5: note: Call to virtual method 'QsciScintilla::setEolMode' during construction bypasses virtual dispatch\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:139:5: warning: Call to virtual method 'QsciScintilla::setLexer' during construction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]\n    setLexer();\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:139:5: note: Call to virtual method 'QsciScintilla::setLexer' during construction bypasses virtual dispatch\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:3289:9: warning: Call to virtual method 'QsciScintilla::setColor' during construction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]\n        setColor(nl_text_colour);\n        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:139:5: note: Calling 'QsciScintilla::setLexer'\n    setLexer();\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:3222:5: note: Taking false branch\n    if (lex)\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:3289:9: note: Call to virtual method 'QsciScintilla::setColor' during construction bypasses virtual dispatch\n        setColor(nl_text_colour);\n        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:3290:9: warning: Call to virtual method 'QsciScintilla::setPaper' during construction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]\n        setPaper(nl_paper_colour);\n        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:139:5: note: Calling 'QsciScintilla::setLexer'\n    setLexer();\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:3222:5: note: Taking false branch\n    if (lex)\n    ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:3290:9: note: Call to virtual method 'QsciScintilla::setPaper' during construction bypasses virtual dispatch\n        setPaper(nl_paper_colour);\n        ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:927:9: warning: Value stored to 'rc' is never read [clang-analyzer-deadcode.DeadStores]\n        rc = LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:927:9: note: Value stored to 'rc' is never read\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3661:21: warning: The left operand of '>' is a garbage value [clang-analyzer-core.UndefinedBinaryOperatorResult]\n        if(data_len > 0) {\n                    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3725:8: note: Assuming 'sftp' is non-null\n    if(!sftp)\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3725:5: note: Taking false branch\n    if(!sftp)\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3728:18: note: Calling 'sftp_symlink'\n                 sftp_symlink(sftp, path, path_len, target, target_len,\n                 ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/session.h:58:16: note: expanded from macro 'BLOCK_ADJUST'\n          rc = x; \\\n               ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3583:12: note: 'data_len' declared without an initial value\n    size_t data_len, link_len;\n           ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3587:11: note: Assuming 'link_type' is not equal to LIBSSH2_SFTP_SYMLINK\n        ((link_type == LIBSSH2_SFTP_SYMLINK) ? (4 + target_len) : 0);\n          ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3587:10: note: '?' condition is false\n        ((link_type == LIBSSH2_SFTP_SYMLINK) ? (4 + target_len) : 0);\n         ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3593:9: note: Assuming field 'version' is >= 3\n    if((sftp->version < 3) && (link_type != LIBSSH2_SFTP_REALPATH)) {\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3593:28: note: Left side of '&&' is false\n    if((sftp->version < 3) && (link_type != LIBSSH2_SFTP_REALPATH)) {\n                           ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3598:8: note: Assuming field 'symlink_state' is not equal to libssh2_NB_state_idle\n    if(sftp->symlink_state == libssh2_NB_state_idle) {\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3598:5: note: Taking false branch\n    if(sftp->symlink_state == libssh2_NB_state_idle) {\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3637:8: note: Assuming field 'symlink_state' is not equal to libssh2_NB_state_created\n    if(sftp->symlink_state == libssh2_NB_state_created) {\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3637:5: note: Taking false branch\n    if(sftp->symlink_state == libssh2_NB_state_created) {\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3655:15: note: Calling 'sftp_packet_requirev'\n    retcode = sftp_packet_requirev(sftp, 2, link_responses,\n              ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:580:8: note: 'data' is not equal to NULL\n    if(data == NULL || data_len == NULL || required_size == 0) {\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:580:8: note: Left side of '||' is false\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:580:24: note: 'data_len' is not equal to NULL\n    if(data == NULL || data_len == NULL || required_size == 0) {\n                       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:580:8: note: Left side of '||' is false\n    if(data == NULL || data_len == NULL || required_size == 0) {\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:580:44: note: 'required_size' is not equal to 0\n    if(data == NULL || data_len == NULL || required_size == 0) {\n                                           ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:580:5: note: Taking false branch\n    if(data == NULL || data_len == NULL || required_size == 0) {\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:585:8: note: Assuming field 'requirev_start' is not equal to 0\n    if(sftp->requirev_start == 0)\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:585:5: note: Taking false branch\n    if(sftp->requirev_start == 0)\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:588:11: note: Assuming field 'socket_state' is equal to LIBSSH2_SOCKET_CONNECTED\n    while(sftp->channel->session->socket_state == LIBSSH2_SOCKET_CONNECTED) {\n          ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:588:5: note: Loop condition is true.  Entering loop body\n    while(sftp->channel->session->socket_state == LIBSSH2_SOCKET_CONNECTED) {\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:589:9: note: Loop condition is true.  Entering loop body\n        for(i = 0; i < num_valid_responses; i++) {\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:590:16: note: Calling 'sftp_packet_ask'\n            if(sftp_packet_ask(sftp, valid_responses[i], request_id,\n               ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:489:8: note: Assuming 'packet' is null\n    if(!packet)\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:489:5: note: Taking true branch\n    if(!packet)\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:490:9: note: Returning without writing to '*data_len'\n        return -1;\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:590:16: note: Returning from 'sftp_packet_ask'\n            if(sftp_packet_ask(sftp, valid_responses[i], request_id,\n               ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:590:13: note: Taking false branch\n            if(sftp_packet_ask(sftp, valid_responses[i], request_id,\n            ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:589:9: note: Loop condition is true.  Entering loop body\n        for(i = 0; i < num_valid_responses; i++) {\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:590:16: note: Calling 'sftp_packet_ask'\n            if(sftp_packet_ask(sftp, valid_responses[i], request_id,\n               ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:489:8: note: Assuming 'packet' is null\n    if(!packet)\n       ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:489:5: note: Taking true branch\n    if(!packet)\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:490:9: note: Returning without writing to '*data_len'\n        return -1;\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:590:16: note: Returning from 'sftp_packet_ask'\n            if(sftp_packet_ask(sftp, valid_responses[i], request_id,\n               ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:590:13: note: Taking false branch\n            if(sftp_packet_ask(sftp, valid_responses[i], request_id,\n            ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:589:9: note: Loop condition is false. Execution continues on line 606\n        for(i = 0; i < num_valid_responses; i++) {\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:607:13: note: Assuming 'rc' is < 0\n        if((rc < 0) && (rc != LIBSSH2_ERROR_EAGAIN)) {\n            ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:607:12: note: Left side of '&&' is true\n        if((rc < 0) && (rc != LIBSSH2_ERROR_EAGAIN)) {\n           ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:607:25: note: Assuming the condition is true\n        if((rc < 0) && (rc != LIBSSH2_ERROR_EAGAIN)) {\n                        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:607:9: note: Taking true branch\n        if((rc < 0) && (rc != LIBSSH2_ERROR_EAGAIN)) {\n        ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:609:13: note: Returning without writing to '*data_len'\n            return rc;\n            ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3655:15: note: Returning from 'sftp_packet_requirev'\n    retcode = sftp_packet_requirev(sftp, 2, link_responses,\n              ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3658:5: note: Taking false branch\n    if(retcode == LIBSSH2_ERROR_EAGAIN)\n    ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3660:13: note: Assuming the condition is true\n    else if(retcode == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n            ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3660:10: note: Taking true branch\n    else if(retcode == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {\n         ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3661:21: note: The left operand of '>' is a garbage value\n        if(data_len > 0) {\n                    ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciapis.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/CaseConvert.cpp\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/CaseConvert.cpp:377:4: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]\n                        strcpy(conversion.conversion, conversion_);\n                        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/CaseConvert.cpp:377:4: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/KeyMap.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Indicator.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/ExternalLexer.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/LineMarker.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/ContractionState.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/ScintillaBase.cpp\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/ScintillaBase.cpp:384:5: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]\n                                strcpy(buffer, selected.c_str());\n                                ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/ScintillaBase.cpp:384:5: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/PerLine.cpp\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/PerLine.cpp:119:2: warning: Call to virtual method 'LineMarkers::Init' during destruction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]\n        Init();\n        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/PerLine.cpp:119:2: note: Call to virtual method 'LineMarkers::Init' during destruction bypasses virtual dispatch\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/RESearch.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Style.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/UniConversion.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/XPM.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/qscintilla_autogen/mocs_compilation.cpp\nerror: no input files [clang-diagnostic-error]\nerror: no such file or directory: '/opt/robo/build/debug/src/third-party/qscintilla-2.8.4/qscintilla_autogen/mocs_compilation.cpp' [clang-diagnostic-error]\nerror: unable to handle compilation, expected exactly one compiler job in '' [clang-diagnostic-error]\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/PositionCache.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/googletest-1.8.1/googlemock/src/gmock-all.cc\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/CellBuffer.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/googletest-1.8.1/googletest/src/gtest_main.cc\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Selection.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/build/debug/src/robomongo/shell_autogen/mocs_compilation.cpp\nerror: no input files [clang-diagnostic-error]\nerror: no such file or directory: '/opt/robo/build/debug/src/robomongo/shell_autogen/mocs_compilation.cpp' [clang-diagnostic-error]\nerror: unable to handle compilation, expected exactly one compiler job in '' [clang-diagnostic-error]\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/googletest-1.8.1/googlemock/src/gmock_main.cc\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/RunStyles.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/build/debug/src/robomongo/tests_autogen/mocs_compilation.cpp\nerror: no input files [clang-diagnostic-error]\nerror: no such file or directory: '/opt/robo/build/debug/src/robomongo/tests_autogen/mocs_compilation.cpp' [clang-diagnostic-error]\nerror: unable to handle compilation, expected exactly one compiler job in '' [clang-diagnostic-error]\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n2 warnings generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n2 warnings generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n8 warnings generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n2 warnings generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n8 warnings generated.\n4 warnings generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\n2 warnings generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n5 warnings generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\nError reading configuration from /opt/robo/build/debug/src/third-party/qjson-0.8.1/qjson_autogen: directory doesn't exist.\nError reading configuration from /opt/robo/build/debug/src/third-party/qjson-0.8.1/qjson_autogen: directory doesn't exist.\nError while processing /opt/robo/build/debug/src/third-party/qjson-0.8.1/qjson_autogen/mocs_compilation.cpp.\nFound compiler error(s).\nError while processing /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciabstractapis.cpp.\nFound compiler error(s).\nError while processing /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciapis.cpp.\nFound compiler error(s).\nError while processing /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscilexer.cpp.\nFound compiler error(s).\nError while processing /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscilexercpp.cpp.\nFound compiler error(s).\nError while processing /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscilexerjavascript.cpp.\nFound compiler error(s).\nError while processing /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscimacro.cpp.\nFound compiler error(s).\nError while processing /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciscintilla.cpp.\nFound compiler error(s).\nError while processing /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciscintillabase.cpp.\nFound compiler error(s).\n1 warning generated.\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n2 warnings generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n5 warnings generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\n1 warning generated.\n8 warnings generated.\n3 warnings generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\n2 warnings generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 warning generated.\nError reading configuration from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/qscintilla_autogen: directory doesn't exist.\nError reading configuration from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/qscintilla_autogen: directory doesn't exist.\nError while processing /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/qscintilla_autogen/mocs_compilation.cpp.\nFound compiler error(s).\n1 warning generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\nSuppressed 1 warnings (1 NOLINT).\nError reading configuration from /opt/robo/build/debug/src/robomongo/shell_autogen: directory doesn't exist.\nError reading configuration from /opt/robo/build/debug/src/robomongo/shell_autogen: directory doesn't exist.\nError while processing /opt/robo/build/debug/src/robomongo/shell_autogen/mocs_compilation.cpp.\nFound compiler error(s).\nError reading configuration from /opt/robo/build/debug/src/robomongo/tests_autogen: directory doesn't exist.\nError reading configuration from /opt/robo/build/debug/src/robomongo/tests_autogen: directory doesn't exist.\nError while processing /opt/robo/build/debug/src/robomongo/tests_autogen/mocs_compilation.cpp.\nFound compiler error(s).\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/ViewStyle.cpp\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/ViewStyle.cpp:59:2: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]\n        strcpy(nameSave, name);\n        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/ViewStyle.cpp:59:2: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/googletest-1.8.1/googletest/src/gtest-all.cc\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/utils/StdUtils.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/editors/JSLexer.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/utils/QtUtils.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/shell/shell/dbshell.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\n/opt/robo/src/robomongo/shell/shell/dbshell.cpp:67:10: error: 'mongo/util/static_observer.h' file not found [clang-diagnostic-error]\n#include \"mongo/util/static_observer.h\"\n         ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/app/main.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/settings/CredentialSettings.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/utils/Logger.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/Enums.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/app/main_test.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/Event.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/EventBusSubscriber.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/EventError.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/HexUtils.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/utils/BsonUtils.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoNamespace.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/EventBusDispatcher.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/KeyboardManager.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/EventWrapper.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/settings/ConnectionSettings.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/EventBus.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/CursorPosition.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoFunction.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoUtils.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/ScriptInfo.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoCollectionInfo.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoQueryInfo.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Document.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoCollection.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/events/MongoEventsInfo.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/AppStyle.cpp\n/opt/robo/src/robomongo/gui/AppStyle.cpp:19:17: warning: Potential memory leak [clang-analyzer-cplusplus.NewDeleteLeaks]\n                return;\n                ^\n/opt/robo/src/robomongo/gui/AppStyle.cpp:35:13: note: Calling 'applyStyle'\n            applyStyle(style);\n            ^\n/opt/robo/src/robomongo/gui/AppStyle.cpp:17:17: note: Assuming the condition is true\n            if (styleName == \"Native\") {\n                ^\n/opt/robo/src/robomongo/gui/AppStyle.cpp:17:13: note: Taking true branch\n            if (styleName == \"Native\") {\n            ^\n/opt/robo/src/robomongo/gui/AppStyle.cpp:18:40: note: Memory is allocated\n                QApplication::setStyle(new AppStyle);\n                                       ^\n/opt/robo/src/robomongo/gui/AppStyle.cpp:19:17: note: Potential memory leak\n                return;\n                ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoDocument.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/events/MongoEvents.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/engine/ScriptEngine.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoServer.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoShell.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/mongodb/ReplicaSet.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoDatabase.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/mongodb/MongoClient.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/App.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/utils/StringOperations.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/mongodb/MongoWorker.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/utils/SimpleCrypt.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/settings/SettingsManager.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/GuiRegistry.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/AppRegistry.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/utils/common.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/AboutDialog.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/utils/RoboCrypt.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/shell/bson/json.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/ConnectionAdvancedTab.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/EulaDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/ConnectionAuthTab.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp:7355:4: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]\n                        strcpy(CharPtrFromSPtr(lParam), vs.styles[wParam].fontName);\n                        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp:7355:4: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp:7377:3: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]\n                strcpy(ptr, val);\n                ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp:7377:3: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp:9199:6: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]\n                                        strcpy(CharPtrFromSPtr(lParam), repr->stringRep.c_str());\n                                        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp:9199:6: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp:9320:6: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]\n                                        strcpy(CharPtrFromSPtr(lParam), \"\");\n                                        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp:9320:6: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp:9344:6: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]\n                                        strcpy(CharPtrFromSPtr(lParam), \"\");\n                                        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp:9344:6: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp:9363:6: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]\n                                        strcpy(CharPtrFromSPtr(lParam), \"\");\n                                        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp:9363:6: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp:9387:6: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]\n                                        strcpy(CharPtrFromSPtr(lParam), \"\");\n                                        ^\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp:9387:6: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/IndicatorLabel.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/ConnectionBasicTab.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/ConnectionDiagnosticDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp\n/opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:51:14: warning: Potential leak of memory pointed to by 'serverIndicator' [clang-analyzer-cplusplus.NewDeleteLeaks]\n        if (!database.isEmpty())\n             ^\n/opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:27:38: note: Memory is allocated\n        Indicator *serverIndicator = new Indicator(GuiRegistry::instance().serverIcon(), serverName);\n                                     ^\n/opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:41:9: note: '?' condition is true\n        VERIFY(connect(_buttonBox, SIGNAL(accepted()), this, SLOT(accept())));\n        ^\n/opt/robo/src/robomongo/core/utils/QtUtils.h:14:19: note: expanded from macro 'VERIFY'\n#define VERIFY(x) Q_ASSERT(x)\n                  ^\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:782:29: note: expanded from macro 'Q_ASSERT'\n#    define Q_ASSERT(cond) ((cond) ? static_cast<void>(0) : qt_assert(#cond, __FILE__, __LINE__))\n                            ^\n/opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:42:9: note: '?' condition is true\n        VERIFY(connect(_buttonBox, SIGNAL(rejected()), this, SLOT(reject())));\n        ^\n/opt/robo/src/robomongo/core/utils/QtUtils.h:14:19: note: expanded from macro 'VERIFY'\n#define VERIFY(x) Q_ASSERT(x)\n                  ^\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:782:29: note: expanded from macro 'Q_ASSERT'\n#    define Q_ASSERT(cond) ((cond) ? static_cast<void>(0) : qt_assert(#cond, __FILE__, __LINE__))\n                            ^\n/opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:49:13: note: Assuming the condition is false\n        if (!serverName.isEmpty())\n            ^\n/opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:49:9: note: Taking false branch\n        if (!serverName.isEmpty())\n        ^\n/opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:51:14: note: Potential leak of memory pointed to by 'serverIndicator'\n        if (!database.isEmpty())\n             ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/utils/ComboBoxUtils.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/shell/db/ptimeutil.cpp\n/opt/robo/src/robomongo/shell/db/ptimeutil.cpp:277:13: warning: Call to function 'strcat' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcat'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]\n            strcat(buf, utc_buff);\n            ^\n/opt/robo/src/robomongo/shell/db/ptimeutil.cpp:277:13: note: Call to function 'strcat' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcat'. CWE-119\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/utils/DialogUtils.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/ConnectionDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/CopyCollectionDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/PreferencesDialog.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/CreateCollectionDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/CreateUserDialog.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/editors/PlainJavaScriptEditor.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/editors/JSLexer.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/ConnectionsDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/ExportDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/editors/FindFrame.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/ChangeShellTimeoutDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/AddEditIndexDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/ScriptWidget.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetFolderItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerUserTreeItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerFunctionTreeItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/FunctionTextEditor.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/DocumentTextEditor.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableModel.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableView.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerServerTreeItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeWidget.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerWidget.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeWidget.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeModel.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/JsonPrepareThread.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeItem.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/PagingWidget.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/ProgressBarPopup.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemHeaderWidget.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/Notifier.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabBar.cpp\n/opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabBar.cpp:143:16: warning: Value stored to 'selectedBorder' during its initialization is never read [clang-analyzer-deadcode.DeadStores]\n        QColor selectedBorder = background.darker(103);\n               ^\n/opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabBar.cpp:143:16: note: Value stored to 'selectedBorder' during its initialization is never read\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemContentWidget.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.cpp\n/opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.cpp:69:17: warning: Value stored to 'isSimple' is never read [clang-analyzer-deadcode.DeadStores]\n                isSimple = detail::isSimpleType(documentItem);\n                ^\n/opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.cpp:69:17: note: Value stored to 'isSimple' is never read\n/opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.cpp:168:13: warning: Value stored to 'count' during its initialization is never read [clang-analyzer-deadcode.DeadStores]\n        int count = indexes.count();\n            ^\n/opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.cpp:168:13: note: Value stored to 'count' during its initialization is never read\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/OutputWidget.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/LogWidget.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/settings/SshSettings.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/QueryWidget.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/settings/SslSettings.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/build/debug/src/robomongo/robomongo_autogen/mocs_compilation.cpp\nerror: no input files [clang-diagnostic-error]\nerror: no such file or directory: '/opt/robo/build/debug/src/robomongo/robomongo_autogen/mocs_compilation.cpp' [clang-diagnostic-error]\nerror: unable to handle compilation, expected exactly one compiler job in '' [clang-diagnostic-error]\nclang-tidy -p=/opt/robo/build/debug /opt/robo/build/debug/src/robomongo/robomongo_autogen/3YJK5W5UP7/qrc_robo.cpp\nerror: no input files [clang-diagnostic-error]\nerror: no such file or directory: '/opt/robo/build/debug/src/robomongo/robomongo_autogen/3YJK5W5UP7/qrc_robo.cpp' [clang-diagnostic-error]\nerror: unable to handle compilation, expected exactly one compiler job in '' [clang-diagnostic-error]\n2 warnings generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n5 warnings generated.\nSuppressed 5 warnings (5 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n2 errors generated.\nError while processing /opt/robo/src/robomongo/shell/shell/dbshell.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/app/main.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/utils/Logger.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/utils/BsonUtils.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/settings/ConnectionSettings.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/domain/MongoFunction.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/domain/MongoCollectionInfo.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/domain/MongoQueryInfo.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/domain/MongoCollection.cpp.\nFound compiler error(s).\n1 warning generated.\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/domain/MongoDocument.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/events/MongoEvents.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/engine/ScriptEngine.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/domain/MongoServer.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/domain/MongoShell.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/domain/MongoDatabase.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/mongodb/MongoClient.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/domain/App.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/mongodb/MongoWorker.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/settings/SettingsManager.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/AppRegistry.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/utils/common.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/utils/RoboCrypt.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/dialogs/ConnectionAdvancedTab.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/dialogs/EulaDialog.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/dialogs/ConnectionAuthTab.cpp.\nFound compiler error(s).\n8 warnings generated.\nSuppressed 1 warnings (1 in non-user code).\nUse -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/dialogs/ConnectionBasicTab.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/dialogs/ConnectionDiagnosticDialog.cpp.\nFound compiler error(s).\n1 warning generated.\n1 warning generated.\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/dialogs/ConnectionDialog.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/dialogs/CopyCollectionDialog.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/dialogs/CreateCollectionDialog.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/dialogs/ConnectionsDialog.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/dialogs/ExportDialog.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/dialogs/ChangeShellTimeoutDialog.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/explorer/AddEditIndexDialog.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/workarea/ScriptWidget.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexItem.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetFolderItem.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerUserTreeItem.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerFunctionTreeItem.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/dialogs/DocumentTextEditor.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerServerTreeItem.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeWidget.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerWidget.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeItem.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeModel.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/domain/Notifier.cpp.\nFound compiler error(s).\n1 warning generated.\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemContentWidget.cpp.\nFound compiler error(s).\n2 warnings generated.\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/workarea/OutputWidget.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/workarea/QueryWidget.cpp.\nFound compiler error(s).\nError reading configuration from /opt/robo/build/debug/src/robomongo/robomongo_autogen: directory doesn't exist.\nError reading configuration from /opt/robo/build/debug/src/robomongo/robomongo_autogen: directory doesn't exist.\nError while processing /opt/robo/build/debug/src/robomongo/robomongo_autogen/mocs_compilation.cpp.\nFound compiler error(s).\nError reading configuration from /opt/robo/build/debug/src/robomongo/robomongo_autogen/3YJK5W5UP7: directory doesn't exist.\nError reading configuration from /opt/robo/build/debug/src/robomongo/robomongo_autogen: directory doesn't exist.\nError reading configuration from /opt/robo/build/debug/src/robomongo/robomongo_autogen/3YJK5W5UP7: directory doesn't exist.\nError reading configuration from /opt/robo/build/debug/src/robomongo/robomongo_autogen: directory doesn't exist.\nError while processing /opt/robo/build/debug/src/robomongo/robomongo_autogen/3YJK5W5UP7/qrc_robo.cpp.\nFound compiler error(s).\nclang-tidy -p=/opt/robo/build/debug /opt/robo/build/debug/src/robomongo/robomongo_autogen/YHP5W5E6RA/qrc_gui.cpp\nerror: no input files [clang-diagnostic-error]\nerror: no such file or directory: '/opt/robo/build/debug/src/robomongo/robomongo_autogen/YHP5W5E6RA/qrc_gui.cpp' [clang-diagnostic-error]\nerror: unable to handle compilation, expected exactly one compiler job in '' [clang-diagnostic-error]\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabWidget.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/WelcomeTab.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/SSHTunnelTab.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/MainWindow.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/SSLTab.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/settings/ReplicaSetSettings.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/mongodb/SshTunnelWorker.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nError reading configuration from /opt/robo/build/debug/src/robomongo/robomongo_autogen/YHP5W5E6RA: directory doesn't exist.\nError reading configuration from /opt/robo/build/debug/src/robomongo/robomongo_autogen: directory doesn't exist.\nError reading configuration from /opt/robo/build/debug/src/robomongo/robomongo_autogen/YHP5W5E6RA: directory doesn't exist.\nError reading configuration from /opt/robo/build/debug/src/robomongo/robomongo_autogen: directory doesn't exist.\nError while processing /opt/robo/build/debug/src/robomongo/robomongo_autogen/YHP5W5E6RA/qrc_gui.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabWidget.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/workarea/WelcomeTab.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/dialogs/SSHTunnelTab.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/MainWindow.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/dialogs/SSLTab.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/settings/ReplicaSetSettings.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/mongodb/SshTunnelWorker.cpp.\nFound compiler error(s).\n\n"
  },
  {
    "path": "static_analysis/clang-tidy_debug_Aug2020_robo.txt",
    "content": "\nEnabled checks:\n    clang-analyzer-apiModeling.StdCLibraryFunctions\n    clang-analyzer-apiModeling.TrustNonnull\n    clang-analyzer-apiModeling.google.GTest\n    clang-analyzer-apiModeling.llvm.CastValue\n    clang-analyzer-apiModeling.llvm.ReturnValue\n    clang-analyzer-core.CallAndMessage\n    clang-analyzer-core.DivideZero\n    clang-analyzer-core.DynamicTypePropagation\n    clang-analyzer-core.NonNullParamChecker\n    clang-analyzer-core.NonnilStringConstants\n    clang-analyzer-core.NullDereference\n    clang-analyzer-core.StackAddrEscapeBase\n    clang-analyzer-core.StackAddressEscape\n    clang-analyzer-core.UndefinedBinaryOperatorResult\n    clang-analyzer-core.VLASize\n    clang-analyzer-core.builtin.BuiltinFunctions\n    clang-analyzer-core.builtin.NoReturnFunctions\n    clang-analyzer-core.uninitialized.ArraySubscript\n    clang-analyzer-core.uninitialized.Assign\n    clang-analyzer-core.uninitialized.Branch\n    clang-analyzer-core.uninitialized.CapturedBlockVariable\n    clang-analyzer-core.uninitialized.UndefReturn\n    clang-analyzer-cplusplus.InnerPointer\n    clang-analyzer-cplusplus.Move\n    clang-analyzer-cplusplus.NewDelete\n    clang-analyzer-cplusplus.NewDeleteLeaks\n    clang-analyzer-cplusplus.PureVirtualCall\n    clang-analyzer-cplusplus.SelfAssignment\n    clang-analyzer-cplusplus.SmartPtr\n    clang-analyzer-cplusplus.VirtualCallModeling\n    clang-analyzer-deadcode.DeadStores\n    clang-analyzer-fuchsia.HandleChecker\n    clang-analyzer-nullability.NullPassedToNonnull\n    clang-analyzer-nullability.NullReturnedFromNonnull\n    clang-analyzer-nullability.NullabilityBase\n    clang-analyzer-nullability.NullableDereferenced\n    clang-analyzer-nullability.NullablePassedToNonnull\n    clang-analyzer-nullability.NullableReturnedFromNonnull\n    clang-analyzer-optin.cplusplus.UninitializedObject\n    clang-analyzer-optin.cplusplus.VirtualCall\n    clang-analyzer-optin.mpi.MPI-Checker\n    clang-analyzer-optin.osx.OSObjectCStyleCast\n    clang-analyzer-optin.osx.cocoa.localizability.EmptyLocalizationContextChecker\n    clang-analyzer-optin.osx.cocoa.localizability.NonLocalizedStringChecker\n    clang-analyzer-optin.performance.GCDAntipattern\n    clang-analyzer-optin.performance.Padding\n    clang-analyzer-optin.portability.UnixAPI\n    clang-analyzer-osx.API\n    clang-analyzer-osx.MIG\n    clang-analyzer-osx.NSOrCFErrorDerefChecker\n    clang-analyzer-osx.NumberObjectConversion\n    clang-analyzer-osx.OSObjectRetainCount\n    clang-analyzer-osx.ObjCProperty\n    clang-analyzer-osx.SecKeychainAPI\n    clang-analyzer-osx.cocoa.AtSync\n    clang-analyzer-osx.cocoa.AutoreleaseWrite\n    clang-analyzer-osx.cocoa.ClassRelease\n    clang-analyzer-osx.cocoa.Dealloc\n    clang-analyzer-osx.cocoa.IncompatibleMethodTypes\n    clang-analyzer-osx.cocoa.Loops\n    clang-analyzer-osx.cocoa.MissingSuperCall\n    clang-analyzer-osx.cocoa.NSAutoreleasePool\n    clang-analyzer-osx.cocoa.NSError\n    clang-analyzer-osx.cocoa.NilArg\n    clang-analyzer-osx.cocoa.NonNilReturnValue\n    clang-analyzer-osx.cocoa.ObjCGenerics\n    clang-analyzer-osx.cocoa.RetainCount\n    clang-analyzer-osx.cocoa.RetainCountBase\n    clang-analyzer-osx.cocoa.RunLoopAutoreleaseLeak\n    clang-analyzer-osx.cocoa.SelfInit\n    clang-analyzer-osx.cocoa.SuperDealloc\n    clang-analyzer-osx.cocoa.UnusedIvars\n    clang-analyzer-osx.cocoa.VariadicMethodTypes\n    clang-analyzer-osx.coreFoundation.CFError\n    clang-analyzer-osx.coreFoundation.CFNumber\n    clang-analyzer-osx.coreFoundation.CFRetainRelease\n    clang-analyzer-osx.coreFoundation.containers.OutOfBounds\n    clang-analyzer-osx.coreFoundation.containers.PointerSizedValues\n    clang-analyzer-security.FloatLoopCounter\n    clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling\n    clang-analyzer-security.insecureAPI.SecuritySyntaxChecker\n    clang-analyzer-security.insecureAPI.UncheckedReturn\n    clang-analyzer-security.insecureAPI.bcmp\n    clang-analyzer-security.insecureAPI.bcopy\n    clang-analyzer-security.insecureAPI.bzero\n    clang-analyzer-security.insecureAPI.decodeValueOfObjCType\n    clang-analyzer-security.insecureAPI.getpw\n    clang-analyzer-security.insecureAPI.gets\n    clang-analyzer-security.insecureAPI.mkstemp\n    clang-analyzer-security.insecureAPI.mktemp\n    clang-analyzer-security.insecureAPI.rand\n    clang-analyzer-security.insecureAPI.strcpy\n    clang-analyzer-security.insecureAPI.vfork\n    clang-analyzer-unix.API\n    clang-analyzer-unix.DynamicMemoryModeling\n    clang-analyzer-unix.Malloc\n    clang-analyzer-unix.MallocSizeof\n    clang-analyzer-unix.MismatchedDeallocator\n    clang-analyzer-unix.Vfork\n    clang-analyzer-unix.cstring.BadSizeArg\n    clang-analyzer-unix.cstring.CStringModeling\n    clang-analyzer-unix.cstring.NullArg\n    clang-analyzer-valist.CopyToSelf\n    clang-analyzer-valist.Uninitialized\n    clang-analyzer-valist.Unterminated\n    clang-analyzer-valist.ValistBase\n\n\n\n...\n\n\n\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/ssh/test.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/ssh/server.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/ssh/ssh.c\n/opt/robo/src/robomongo/ssh/ssh.c:111:16: warning: Potential leak of memory pointed to by 'session' [clang-analyzer-unix.Malloc]\n        return NULL;\n               ^\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:88:58: note: Memory is allocated\n    struct rbm_session *session = (struct rbm_session *) malloc(sizeof(struct rbm_session));\n                                                         ^\n/opt/robo/src/robomongo/ssh/ssh.c:89:9: note: Assuming 'session' is non-null\n    if (!session)\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:89:5: note: Taking false branch\n    if (!session)\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:101:9: note: Assuming field 'loglevel' is equal to RBM_SSH_LOG_TYPE_ERROR\n    if (config->loglevel != RBM_SSH_LOG_TYPE_ERROR &&\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:101:52: note: Left side of '&&' is false\n    if (config->loglevel != RBM_SSH_LOG_TYPE_ERROR &&\n                                                   ^\n/opt/robo/src/robomongo/ssh/ssh.c:110:9: note: Assuming 'publicsession' is null\n    if (!publicsession)\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:110:5: note: Taking true branch\n    if (!publicsession)\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:111:16: note: Potential leak of memory pointed to by 'session'\n        return NULL;\n               ^\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:196:16: warning: Potential leak of memory pointed to by 'channel' [clang-analyzer-unix.Malloc]\n        return NULL;\n               ^\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:142:5: note: Loop condition is true.  Entering loop body\n    while (1) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:143:14: note: Calling 'rbm_open_tunnel'\n        rc = rbm_open_tunnel(connection);\n             ^\n/opt/robo/src/robomongo/ssh/ssh.c:329:13: note: Assuming 'local_socket' is <= 'ssh_socket'\n    fdmax = local_socket > ssh_socket ? local_socket : ssh_socket;\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:329:13: note: '?' condition is false\n/opt/robo/src/robomongo/ssh/ssh.c:331:5: note: Loop condition is true.  Entering loop body\n    while (errors < maxerrors) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:337:13: note: Assuming the condition is false\n        if (!FD_ISSET(local_socket, &readset))\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:337:9: note: Taking false branch\n        if (!FD_ISSET(local_socket, &readset))\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:341:13: note: Assuming the condition is false\n        if (select(fdmax + 1, &readset, NULL, NULL, NULL) == -1) {\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:341:9: note: Taking false branch\n        if (select(fdmax + 1, &readset, NULL, NULL, NULL) == -1) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:348:26: note: Assuming 'isocket' is <= 'fdmax'\n        for(isocket = 0; isocket <= fdmax; isocket++) {\n                         ^\n/opt/robo/src/robomongo/ssh/ssh.c:348:9: note: Loop condition is true.  Entering loop body\n        for(isocket = 0; isocket <= fdmax; isocket++) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:351:17: note: Assuming the condition is false\n            if (!FD_ISSET(isocket, &readset))\n                ^\n/opt/robo/src/robomongo/ssh/ssh.c:351:13: note: Taking false branch\n            if (!FD_ISSET(isocket, &readset))\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:354:17: note: Assuming 'isocket' is equal to 'local_socket'\n            if (isocket == local_socket) {\n                ^\n/opt/robo/src/robomongo/ssh/ssh.c:354:13: note: Taking true branch\n            if (isocket == local_socket) {\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:355:22: note: Calling 'handle_new_client_connections'\n                rc = handle_new_client_connections(connection, &fdmax, &masterset);\n                     ^\n/opt/robo/src/robomongo/ssh/ssh.c:408:9: note: Assuming the condition is false\n    if ((newfd = accept(local_socket, (struct sockaddr *) &remoteaddr, &slen)) == -1) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:408:5: note: Taking false branch\n    if ((newfd = accept(local_socket, (struct sockaddr *) &remoteaddr, &slen)) == -1) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:414:13: note: Assuming the condition is false\n        if (newfd > *fdmax) {       // keep track of the maximum\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:414:9: note: Taking false branch\n        if (newfd > *fdmax) {       // keep track of the maximum\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:424:5: note: Loop condition is true.  Entering loop body\n    while (attempts < maxattempts) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:430:13: note: Assuming 'channel' is non-null\n        if (!channel) {\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:430:9: note: Taking false branch\n        if (!channel) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:446:9: note:  Execution continues on line 449\n        break;\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:449:10: note: 'channel' is non-null\n    if (!channel) {\n         ^\n/opt/robo/src/robomongo/ssh/ssh.c:449:5: note: Taking false branch\n    if (!channel) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:454:9: note: Calling 'rbm_channel_create'\n    if (rbm_channel_create(connection, newfd, channel) == NULL) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:190:35: note: Memory is allocated\n    struct rbm_channel *channel = malloc(sizeof(struct rbm_channel));\n                                  ^\n/opt/robo/src/robomongo/ssh/ssh.c:191:9: note: Assuming 'channel' is non-null\n    if (!channel)\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:191:5: note: Taking false branch\n    if (!channel)\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:195:9: note: Assuming 'inbuf' is null\n    if (!inbuf)\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:195:5: note: Taking true branch\n    if (!inbuf)\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:196:16: note: Potential leak of memory pointed to by 'channel'\n        return NULL;\n               ^\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:200:16: warning: Potential leak of memory pointed to by 'inbuf' [clang-analyzer-unix.Malloc]\n        return NULL;\n               ^\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:142:5: note: Loop condition is true.  Entering loop body\n    while (1) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:143:14: note: Calling 'rbm_open_tunnel'\n        rc = rbm_open_tunnel(connection);\n             ^\n/opt/robo/src/robomongo/ssh/ssh.c:329:13: note: Assuming 'local_socket' is <= 'ssh_socket'\n    fdmax = local_socket > ssh_socket ? local_socket : ssh_socket;\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:329:13: note: '?' condition is false\n/opt/robo/src/robomongo/ssh/ssh.c:331:5: note: Loop condition is true.  Entering loop body\n    while (errors < maxerrors) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:337:13: note: Assuming the condition is false\n        if (!FD_ISSET(local_socket, &readset))\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:337:9: note: Taking false branch\n        if (!FD_ISSET(local_socket, &readset))\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:341:13: note: Assuming the condition is false\n        if (select(fdmax + 1, &readset, NULL, NULL, NULL) == -1) {\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:341:9: note: Taking false branch\n        if (select(fdmax + 1, &readset, NULL, NULL, NULL) == -1) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:348:26: note: Assuming 'isocket' is <= 'fdmax'\n        for(isocket = 0; isocket <= fdmax; isocket++) {\n                         ^\n/opt/robo/src/robomongo/ssh/ssh.c:348:9: note: Loop condition is true.  Entering loop body\n        for(isocket = 0; isocket <= fdmax; isocket++) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:351:17: note: Assuming the condition is false\n            if (!FD_ISSET(isocket, &readset))\n                ^\n/opt/robo/src/robomongo/ssh/ssh.c:351:13: note: Taking false branch\n            if (!FD_ISSET(isocket, &readset))\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:354:17: note: Assuming 'isocket' is equal to 'local_socket'\n            if (isocket == local_socket) {\n                ^\n/opt/robo/src/robomongo/ssh/ssh.c:354:13: note: Taking true branch\n            if (isocket == local_socket) {\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:355:22: note: Calling 'handle_new_client_connections'\n                rc = handle_new_client_connections(connection, &fdmax, &masterset);\n                     ^\n/opt/robo/src/robomongo/ssh/ssh.c:408:9: note: Assuming the condition is false\n    if ((newfd = accept(local_socket, (struct sockaddr *) &remoteaddr, &slen)) == -1) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:408:5: note: Taking false branch\n    if ((newfd = accept(local_socket, (struct sockaddr *) &remoteaddr, &slen)) == -1) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:414:13: note: Assuming the condition is false\n        if (newfd > *fdmax) {       // keep track of the maximum\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:414:9: note: Taking false branch\n        if (newfd > *fdmax) {       // keep track of the maximum\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:424:5: note: Loop condition is true.  Entering loop body\n    while (attempts < maxattempts) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:430:13: note: Assuming 'channel' is non-null\n        if (!channel) {\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:430:9: note: Taking false branch\n        if (!channel) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:446:9: note:  Execution continues on line 449\n        break;\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:449:10: note: 'channel' is non-null\n    if (!channel) {\n         ^\n/opt/robo/src/robomongo/ssh/ssh.c:449:5: note: Taking false branch\n    if (!channel) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:454:9: note: Calling 'rbm_channel_create'\n    if (rbm_channel_create(connection, newfd, channel) == NULL) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:191:9: note: Assuming 'channel' is non-null\n    if (!channel)\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:191:5: note: Taking false branch\n    if (!channel)\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:194:19: note: Memory is allocated\n    char *inbuf = malloc(sizeof(char) * RBM_BUFSIZE);\n                  ^\n/opt/robo/src/robomongo/ssh/ssh.c:195:9: note: Assuming 'inbuf' is non-null\n    if (!inbuf)\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:195:5: note: Taking false branch\n    if (!inbuf)\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:199:9: note: Assuming 'outbuf' is null\n    if (!outbuf)\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:199:5: note: Taking true branch\n    if (!outbuf)\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:200:16: note: Potential leak of memory pointed to by 'inbuf'\n        return NULL;\n               ^\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:291:9: warning: Use of memory after it is freed [clang-analyzer-unix.Malloc]\n        rbm_channel_close(session->channels[0]);\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:142:5: note: Loop condition is true.  Entering loop body\n    while (1) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:143:14: note: Calling 'rbm_open_tunnel'\n        rc = rbm_open_tunnel(connection);\n             ^\n/opt/robo/src/robomongo/ssh/ssh.c:329:13: note: Assuming 'local_socket' is <= 'ssh_socket'\n    fdmax = local_socket > ssh_socket ? local_socket : ssh_socket;\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:329:13: note: '?' condition is false\n/opt/robo/src/robomongo/ssh/ssh.c:331:5: note: Loop condition is true.  Entering loop body\n    while (errors < maxerrors) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:337:13: note: Assuming the condition is true\n        if (!FD_ISSET(local_socket, &readset))\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:337:9: note: Taking true branch\n        if (!FD_ISSET(local_socket, &readset))\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:338:13: note:  Execution continues on line 385\n            break;\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:385:9: note: 'errors' is < 'maxerrors'\n    if (errors >= maxerrors) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:385:5: note: Taking false branch\n    if (errors >= maxerrors) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:390:5: note: Calling 'rbm_ssh_session_close'\n    rbm_ssh_session_close(connection->publicsession);\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:125:9: note: Assuming the condition is false\n    if (session->localsocket != rbm_socket_invalid) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:125:5: note: Taking false branch\n    if (session->localsocket != rbm_socket_invalid) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:131:5: note: Calling 'rbm_session_cleanup'\n    rbm_session_cleanup(session);\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:280:9: note: 'session' is not equal to NULL\n    if (session == NULL)\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:280:5: note: Taking false branch\n    if (session == NULL)\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:290:12: note: Assuming field 'channelssize' is > 0\n    while (session->channelssize > 0) {\n           ^\n/opt/robo/src/robomongo/ssh/ssh.c:290:5: note: Loop condition is true.  Entering loop body\n    while (session->channelssize > 0) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:291:9: note: Calling 'rbm_channel_close'\n        rbm_channel_close(session->channels[0]);\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:217:9: note: Assuming the condition is false\n    if (rbm_array_remove((void ***)&session->channels, &session->channelssize, channel))\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:217:5: note: Taking false branch\n    if (rbm_array_remove((void ***)&session->channels, &session->channelssize, channel))\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:221:9: note: Assuming the condition is false\n    if (channel->socket != rbm_socket_invalid) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:221:5: note: Taking false branch\n    if (channel->socket != rbm_socket_invalid) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:227:9: note: Assuming field 'channel' is null\n    if (channel->channel) {\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:227:5: note: Taking false branch\n    if (channel->channel) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:239:5: note: Memory is released\n    free(channel);\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:291:9: note: Returning; memory was released via 1st parameter\n        rbm_channel_close(session->channels[0]);\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:290:21: note: Field 'channelssize' is > 0\n    while (session->channelssize > 0) {\n                    ^\n/opt/robo/src/robomongo/ssh/ssh.c:290:5: note: Loop condition is true.  Entering loop body\n    while (session->channelssize > 0) {\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:291:9: note: Use of memory after it is freed\n        rbm_channel_close(session->channels[0]);\n        ^\n/opt/robo/src/robomongo/ssh/ssh.c:322:5: warning: The bzero() function is obsoleted by memset() [clang-analyzer-security.insecureAPI.bzero]\n    FD_ZERO(&masterset);\n    ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_zero.h:29:25: note: expanded from macro 'FD_ZERO'\n#define FD_ZERO(p)      __DARWIN_FD_ZERO(p)\n                        ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_def.h:108:33: note: expanded from macro '__DARWIN_FD_ZERO'\n#define __DARWIN_FD_ZERO(p)     __builtin_bzero(p, sizeof(*(p)))\n                                ^\n/opt/robo/src/robomongo/ssh/ssh.c:322:5: note: The bzero() function is obsoleted by memset()\n    FD_ZERO(&masterset);\n    ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_zero.h:29:25: note: expanded from macro 'FD_ZERO'\n#define FD_ZERO(p)      __DARWIN_FD_ZERO(p)\n                        ^\n/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_fd_def.h:108:33: note: expanded from macro '__DARWIN_FD_ZERO'\n#define __DARWIN_FD_ZERO(p)     __builtin_bzero(p, sizeof(*(p)))\n                                ^\n/opt/robo/src/robomongo/ssh/ssh.c:429:13: warning: Value stored to 'errsave' during its initialization is never read [clang-analyzer-deadcode.DeadStores]\n        int errsave = errno;\n            ^\n/opt/robo/src/robomongo/ssh/ssh.c:429:13: note: Value stored to 'errsave' during its initialization is never read\n/opt/robo/src/robomongo/ssh/ssh.c:510:17: warning: Value stored to 'result' is never read [clang-analyzer-deadcode.DeadStores]\n                result = RBM_ERROR;\n                ^\n/opt/robo/src/robomongo/ssh/ssh.c:510:17: note: Value stored to 'result' is never read\n/opt/robo/src/robomongo/ssh/ssh.c:730:5: warning: Value stored to 'fingerprint' is never read [clang-analyzer-deadcode.DeadStores]\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    ^\n/opt/robo/src/robomongo/ssh/ssh.c:730:5: note: Value stored to 'fingerprint' is never read\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/ssh/log.c\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/ssh/array.c\n\n\n\n\n...\n\n\n\n\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/utils/StdUtils.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/editors/JSLexer.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/utils/QtUtils.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/shell/shell/dbshell.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\n/opt/robo/src/robomongo/shell/shell/dbshell.cpp:67:10: error: 'mongo/util/static_observer.h' file not found [clang-diagnostic-error]\n#include \"mongo/util/static_observer.h\"\n         ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/app/main.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/settings/CredentialSettings.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/utils/Logger.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/Enums.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/app/main_test.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/Event.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/EventBusSubscriber.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/EventError.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/HexUtils.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/utils/BsonUtils.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoNamespace.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/EventBusDispatcher.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/KeyboardManager.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/EventWrapper.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/settings/ConnectionSettings.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/EventBus.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/CursorPosition.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoFunction.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoUtils.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/ScriptInfo.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoCollectionInfo.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoQueryInfo.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Document.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoCollection.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/events/MongoEventsInfo.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/AppStyle.cpp\n/opt/robo/src/robomongo/gui/AppStyle.cpp:19:17: warning: Potential memory leak [clang-analyzer-cplusplus.NewDeleteLeaks]\n                return;\n                ^\n/opt/robo/src/robomongo/gui/AppStyle.cpp:35:13: note: Calling 'applyStyle'\n            applyStyle(style);\n            ^\n/opt/robo/src/robomongo/gui/AppStyle.cpp:17:17: note: Assuming the condition is true\n            if (styleName == \"Native\") {\n                ^\n/opt/robo/src/robomongo/gui/AppStyle.cpp:17:13: note: Taking true branch\n            if (styleName == \"Native\") {\n            ^\n/opt/robo/src/robomongo/gui/AppStyle.cpp:18:40: note: Memory is allocated\n                QApplication::setStyle(new AppStyle);\n                                       ^\n/opt/robo/src/robomongo/gui/AppStyle.cpp:19:17: note: Potential memory leak\n                return;\n                ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoDocument.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/events/MongoEvents.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/engine/ScriptEngine.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoServer.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoShell.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/mongodb/ReplicaSet.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/MongoDatabase.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/mongodb/MongoClient.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/App.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/utils/StringOperations.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/mongodb/MongoWorker.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/utils/SimpleCrypt.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/settings/SettingsManager.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/GuiRegistry.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/AppRegistry.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/utils/common.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/AboutDialog.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/utils/RoboCrypt.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/shell/bson/json.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/ConnectionAdvancedTab.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/EulaDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/ConnectionAuthTab.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\n\n\n\n....\n\n\n\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/IndicatorLabel.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/ConnectionBasicTab.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/ConnectionDiagnosticDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp\n/opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:51:14: warning: Potential leak of memory pointed to by 'serverIndicator' [clang-analyzer-cplusplus.NewDeleteLeaks]\n        if (!database.isEmpty())\n             ^\n/opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:27:38: note: Memory is allocated\n        Indicator *serverIndicator = new Indicator(GuiRegistry::instance().serverIcon(), serverName);\n                                     ^\n/opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:41:9: note: '?' condition is true\n        VERIFY(connect(_buttonBox, SIGNAL(accepted()), this, SLOT(accept())));\n        ^\n/opt/robo/src/robomongo/core/utils/QtUtils.h:14:19: note: expanded from macro 'VERIFY'\n#define VERIFY(x) Q_ASSERT(x)\n                  ^\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:782:29: note: expanded from macro 'Q_ASSERT'\n#    define Q_ASSERT(cond) ((cond) ? static_cast<void>(0) : qt_assert(#cond, __FILE__, __LINE__))\n                            ^\n/opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:42:9: note: '?' condition is true\n        VERIFY(connect(_buttonBox, SIGNAL(rejected()), this, SLOT(reject())));\n        ^\n/opt/robo/src/robomongo/core/utils/QtUtils.h:14:19: note: expanded from macro 'VERIFY'\n#define VERIFY(x) Q_ASSERT(x)\n                  ^\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:782:29: note: expanded from macro 'Q_ASSERT'\n#    define Q_ASSERT(cond) ((cond) ? static_cast<void>(0) : qt_assert(#cond, __FILE__, __LINE__))\n                            ^\n/opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:49:13: note: Assuming the condition is false\n        if (!serverName.isEmpty())\n            ^\n/opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:49:9: note: Taking false branch\n        if (!serverName.isEmpty())\n        ^\n/opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:51:14: note: Potential leak of memory pointed to by 'serverIndicator'\n        if (!database.isEmpty())\n             ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/utils/ComboBoxUtils.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/shell/db/ptimeutil.cpp\n/opt/robo/src/robomongo/shell/db/ptimeutil.cpp:277:13: warning: Call to function 'strcat' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcat'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]\n            strcat(buf, utc_buff);\n            ^\n/opt/robo/src/robomongo/shell/db/ptimeutil.cpp:277:13: note: Call to function 'strcat' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcat'. CWE-119\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/utils/DialogUtils.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/ConnectionDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/CopyCollectionDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/PreferencesDialog.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/CreateCollectionDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/CreateUserDialog.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/editors/PlainJavaScriptEditor.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/editors/JSLexer.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/ConnectionsDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/ExportDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/editors/FindFrame.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/ChangeShellTimeoutDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/AddEditIndexDialog.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/ScriptWidget.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetFolderItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerUserTreeItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerFunctionTreeItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/FunctionTextEditor.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/DocumentTextEditor.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableModel.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableView.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerServerTreeItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeWidget.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerWidget.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeItem.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeWidget.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeModel.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/JsonPrepareThread.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeItem.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/PagingWidget.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/ProgressBarPopup.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemHeaderWidget.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/domain/Notifier.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabBar.cpp\n/opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabBar.cpp:143:16: warning: Value stored to 'selectedBorder' during its initialization is never read [clang-analyzer-deadcode.DeadStores]\n        QColor selectedBorder = background.darker(103);\n               ^\n/opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabBar.cpp:143:16: note: Value stored to 'selectedBorder' during its initialization is never read\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemContentWidget.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.cpp\n/opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.cpp:69:17: warning: Value stored to 'isSimple' is never read [clang-analyzer-deadcode.DeadStores]\n                isSimple = detail::isSimpleType(documentItem);\n                ^\n/opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.cpp:69:17: note: Value stored to 'isSimple' is never read\n/opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.cpp:168:13: warning: Value stored to 'count' during its initialization is never read [clang-analyzer-deadcode.DeadStores]\n        int count = indexes.count();\n            ^\n/opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.cpp:168:13: note: Value stored to 'count' during its initialization is never read\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/OutputWidget.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/LogWidget.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/settings/SshSettings.cpp\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/QueryWidget.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/settings/SslSettings.cpp\n\n\n....\n\n\n\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabWidget.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/widgets/workarea/WelcomeTab.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/SSHTunnelTab.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/MainWindow.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/gui/dialogs/SSLTab.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/settings/ReplicaSetSettings.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nclang-tidy -p=/opt/robo/build/debug /opt/robo/src/robomongo/core/mongodb/SshTunnelWorker.cpp\n/opt/robo-shell/src/mongo/idl/basic_types.h:72:23: error: no member named 'has_value' in 'boost::optional<bool>' [clang-diagnostic-error]\n        return _value.has_value();\n                      ^\nError reading configuration from /opt/robo/build/debug/src/robomongo/robomongo_autogen/YHP5W5E6RA: directory doesn't exist.\nError reading configuration from /opt/robo/build/debug/src/robomongo/robomongo_autogen: directory doesn't exist.\nError reading configuration from /opt/robo/build/debug/src/robomongo/robomongo_autogen/YHP5W5E6RA: directory doesn't exist.\nError reading configuration from /opt/robo/build/debug/src/robomongo/robomongo_autogen: directory doesn't exist.\nError while processing /opt/robo/build/debug/src/robomongo/robomongo_autogen/YHP5W5E6RA/qrc_gui.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabWidget.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/widgets/workarea/WelcomeTab.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/dialogs/SSHTunnelTab.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/MainWindow.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/gui/dialogs/SSLTab.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/settings/ReplicaSetSettings.cpp.\nFound compiler error(s).\n1 error generated.\nError while processing /opt/robo/src/robomongo/core/mongodb/SshTunnelWorker.cpp.\nFound compiler error(s).\n\n"
  },
  {
    "path": "static_analysis/cppcheck_output_Apr2019.txt",
    "content": "\\robomongo\\src\\robomongo> cppcheck --enable=all --std=c++11 . > xx.h 2>&1\n-------------------------------------------------------------------\n\nChecking app\\main.cpp ...\nChecking app\\main.cpp: Q_OS_MAC...\nChecking app\\main.cpp: Q_OS_WIN...\n1/125 files checked 0% done\nChecking app\\main_mongo.cpp ...\n2/125 files checked 0% done\nChecking app\\main_test.cpp ...\n3/125 files checked 0% done\nChecking core\\AppRegistry.cpp ...\n4/125 files checked 0% done\nChecking core\\Enums.cpp ...\n5/125 files checked 0% done\nChecking core\\Event.cpp ...\n6/125 files checked 0% done\nChecking core\\EventBus.cpp ...\n[core\\EventBus.cpp:18]: (style) Struct 'RemoveIfReciver' has a constructor with 1 argument that is not explicit.\n[core\\EventBus.cpp:33]: (style) Struct 'FindIfReciver' has a constructor with 1 argument that is not explicit.\n7/125 files checked 1% done\nChecking core\\EventBusDispatcher.cpp ...\n8/125 files checked 1% done\nChecking core\\EventBusSubscriber.cpp ...\n9/125 files checked 1% done\nChecking core\\EventError.cpp ...\n10/125 files checked 1% done\nChecking core\\EventWrapper.cpp ...\n11/125 files checked 1% done\nChecking core\\HexUtils.cpp ...\n12/125 files checked 2% done\nChecking core\\HexUtils_test.cpp ...\n13/125 files checked 2% done\nChecking core\\KeyboardManager.cpp ...\n14/125 files checked 2% done\nChecking core\\domain\\App.cpp ...\n15/125 files checked 3% done\nChecking core\\domain\\CursorPosition.cpp ...\n16/125 files checked 3% done\nChecking core\\domain\\MongoCollection.cpp ...\n17/125 files checked 4% done\nChecking core\\domain\\MongoCollectionInfo.cpp ...\n[core\\domain\\MongoCollectionInfo.cpp:7]: (warning) Member variable 'MongoCollectionInfo::_sizeBytes' is not initialized in the constructor.\n[core\\domain\\MongoCollectionInfo.cpp:7]: (warning) Member variable 'MongoCollectionInfo::_storageSizeBytes' is not initialized in the constructor.\n[core\\domain\\MongoCollectionInfo.cpp:7]: (warning) Member variable 'MongoCollectionInfo::_count' is not initialized in the constructor.\n[core\\domain\\MongoCollectionInfo.h:11]: (style) Class 'MongoCollectionInfo' has a constructor with 1 argument that is not explicit.\n18/125 files checked 4% done\nChecking core\\domain\\MongoDatabase.cpp ...\n19/125 files checked 5% done\nChecking core\\domain\\MongoDocument.cpp ...\n20/125 files checked 5% done\nChecking core\\domain\\MongoFunction.cpp ...\n21/125 files checked 5% done\nChecking core\\domain\\MongoNamespace.cpp ...\n22/125 files checked 5% done\nChecking core\\domain\\MongoQueryInfo.cpp ...\n23/125 files checked 5% done\nChecking core\\domain\\MongoServer.cpp ...\n[core\\domain\\MongoServer.cpp:121]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n[core\\domain\\MongoServer.cpp:131]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n24/125 files checked 7% done\nChecking core\\domain\\MongoShell.cpp ...\n25/125 files checked 8% done\nChecking core\\domain\\MongoUser.cpp ...\n26/125 files checked 8% done\nChecking core\\domain\\MongoUtils.cpp ...\n27/125 files checked 8% done\nChecking core\\domain\\Notifier.cpp ...\n[core\\domain\\Notifier.cpp:177] -> [core\\domain\\Notifier.cpp:178]: (style) The if condition is the same as the previous if condition\n[core\\domain\\Notifier.cpp:185] -> [core\\domain\\Notifier.cpp:186]: (style) The if condition is the same as the previous if condition\n[core\\domain\\Notifier.cpp:191]: (style) The scope of the variable 'isNeededRefresh' can be reduced.\n[core\\domain\\Notifier.cpp:191]: (style) Variable 'isNeededRefresh' is assigned a value that is never used.\n[core\\domain\\Notifier.cpp:222]: (style) Variable 'isNeededRefresh' is assigned a value that is never used.\n[core\\domain\\Notifier.cpp:347]: (style) Consider using std::transform algorithm instead of a raw loop.\n28/125 files checked 10% done\nChecking core\\domain\\ScriptInfo.cpp ...\nChecking core\\domain\\ScriptInfo.cpp: Q_OS_LINUX...\n29/125 files checked 10% done\nChecking core\\engine\\ScriptEngine.cpp ...\n[core\\engine\\ScriptEngine.cpp:395]: (style) Variable 'serverAddress' is assigned a value that is never used.\n[core\\engine\\ScriptEngine.cpp:396]: (style) Variable 'dbName' is assigned a value that is never used.\n[core\\engine\\ScriptEngine.cpp:460]: (style) Variable 'res2' is assigned a value that is never used.\n30/125 files checked 12% done\nChecking core\\events\\MongoEvents.cpp ...\n31/125 files checked 12% done\nChecking core\\events\\MongoEventsInfo.cpp ...\n32/125 files checked 12% done\nChecking core\\mongodb\\MongoClient.cpp ...\n[core\\mongodb\\MongoClient.cpp:217]: (style) Condition 'version>=0' is always false\n[core\\mongodb\\MongoClient.cpp:197]: (style) Variable 'cache' is assigned a value that is never used.\n[core\\mongodb\\MongoClient.cpp:204]: (style) Variable 'cacheKey' is assigned a value that is never used.\n[core\\mongodb\\MongoClient.cpp:209]: (style) Variable 'cacheKey' is assigned a value that is never used.\n[core\\mongodb\\MongoClient.cpp:214]: (style) Variable 'cacheKey' is assigned a value that is never used.\n[core\\mongodb\\MongoClient.cpp:49]: (style) Consider using std::transform algorithm instead of a raw loop.\n[core\\mongodb\\MongoClient.cpp:107]: (style) Consider using std::transform algorithm instead of a raw loop.\n33/125 files checked 15% done\nChecking core\\mongodb\\MongoWorker.cpp ...\n[core\\mongodb\\MongoWorker.cpp:191]: (style) Consider using std::transform algorithm instead of a raw loop.\n[core\\mongodb\\MongoWorker.cpp:492]: (style) Consider using std::transform algorithm instead of a raw loop.\n34/125 files checked 20% done\nChecking core\\mongodb\\ReplicaSet.cpp ...\n35/125 files checked 20% done\nChecking core\\mongodb\\SshTunnelWorker.cpp ...\n36/125 files checked 21% done\nChecking core\\settings\\ConnectionSettings.cpp ...\nChecking core\\settings\\ConnectionSettings.cpp: MONGO_SSL...\n37/125 files checked 22% done\nChecking core\\settings\\CredentialSettings.cpp ...\n38/125 files checked 22% done\nChecking core\\settings\\ReplicaSetSettings.cpp ...\n[core\\settings\\ReplicaSetSettings.cpp:47] -> [core\\settings\\ReplicaSetSettings.cpp:51]: (style) Variable 'itr' is reassigned a value before the old one has been used.\n[core\\settings\\ReplicaSetSettings.cpp:80]: (style) Consider using std::transform algorithm instead of a raw loop.\n39/125 files checked 22% done\nChecking core\\settings\\SettingsManager.cpp ...\n[core\\settings\\SettingsManager.cpp:348]: (style) Consider using std::copy algorithm instead of a raw loop.\n[core\\settings\\SettingsManager.cpp:355]: (style) Consider using std::copy algorithm instead of a raw loop.\n[core\\settings\\SettingsManager.cpp:524]: (style) Consider using std::find_if algorithm instead of a raw loop.\n40/125 files checked 25% done\nChecking core\\settings\\SshSettings.cpp ...\n41/125 files checked 25% done\nChecking core\\settings\\SslSettings.cpp ...\n42/125 files checked 25% done\nChecking core\\utils\\BsonUtils.cpp ...\n43/125 files checked 28% done\nChecking core\\utils\\Logger.cpp ...\n44/125 files checked 28% done\nChecking core\\utils\\QtUtils.cpp ...\nChecking core\\utils\\QtUtils.cpp: Q_OS_WIN...\n45/125 files checked 28% done\nChecking core\\utils\\StdUtils.cpp ...\n46/125 files checked 28% done\nChecking gui\\AppStyle.cpp ...\nChecking gui\\AppStyle.cpp: Q_OS_WIN...\n47/125 files checked 28% done\nChecking gui\\GuiRegistry.cpp ...\nChecking gui\\GuiRegistry.cpp: Q_OS_MAC...\nChecking gui\\GuiRegistry.cpp: Q_OS_UNIX...\nChecking gui\\GuiRegistry.cpp: Q_OS_WIN...\n48/125 files checked 30% done\nChecking gui\\MainWindow.cpp ...\n[gui\\MainWindow.cpp:525]: (style) Variable 'toolbarsSettings' is assigned a value that is never used.\n[gui\\MainWindow.cpp:106]: (style) Class 'ConnectionMenu' has a constructor with 1 argument that is not explicit.\nChecking gui\\MainWindow.cpp: Q_OS_LINUX...\nChecking gui\\MainWindow.cpp: Q_OS_MAC...\n[gui\\MainWindow.cpp:132]: (style) Variable 'background' is assigned a value that is never used.\nChecking gui\\MainWindow.cpp: Q_OS_WIN...\nChecking gui\\MainWindow.cpp: _WIN32...\nChecking gui\\MainWindow.cpp: __APPLE__...\nChecking gui\\MainWindow.cpp: __linux__...\n49/125 files checked 36% done\nChecking gui\\dialogs\\AboutDialog.cpp ...\n50/125 files checked 36% done\nChecking gui\\dialogs\\ChangeShellTimeoutDialog.cpp ...\n51/125 files checked 36% done\nChecking gui\\dialogs\\ConnectionAdvancedTab.cpp ...\nChecking gui\\dialogs\\ConnectionAdvancedTab.cpp: _WIN32...\nChecking gui\\dialogs\\ConnectionAdvancedTab.cpp: __APPLE__...\n52/125 files checked 37% done\nChecking gui\\dialogs\\ConnectionAuthTab.cpp ...\nChecking gui\\dialogs\\ConnectionAuthTab.cpp: Q_OS_MAC...\nChecking gui\\dialogs\\ConnectionAuthTab.cpp: Q_OS_WIN...\n53/125 files checked 37% done\nChecking gui\\dialogs\\ConnectionBasicTab.cpp ...\n[gui\\dialogs\\ConnectionBasicTab.cpp:88]: (style) Variable 'BUTTON_SIZE' is assigned a value that is never used.\n[gui\\dialogs\\ConnectionBasicTab.cpp:107]: (style) Variable '_optionalLabel' is assigned a value that is never used.\nChecking gui\\dialogs\\ConnectionBasicTab.cpp: _WIN32...\nChecking gui\\dialogs\\ConnectionBasicTab.cpp: __APPLE__...\n54/125 files checked 39% done\nChecking gui\\dialogs\\ConnectionDiagnosticDialog.cpp ...\n55/125 files checked 40% done\nChecking gui\\dialogs\\ConnectionDialog.cpp ...\nChecking gui\\dialogs\\ConnectionDialog.cpp: __APPLE__...\n56/125 files checked 40% done\nChecking gui\\dialogs\\ConnectionSslTab.cpp ...\nChecking gui\\dialogs\\ConnectionSslTab.cpp: MONGO_SSL...\n57/125 files checked 41% done\nChecking gui\\dialogs\\ConnectionsDialog.cpp ...\n[gui\\dialogs\\ConnectionsDialog.cpp:395]: (style) C-style pointer casting\n[gui\\dialogs\\ConnectionsDialog.cpp:397]: (style) C-style pointer casting\n[gui\\dialogs\\ConnectionsDialog.cpp:408]: (style) C-style pointer casting\n[gui\\dialogs\\ConnectionsDialog.cpp:43]: (style) Class 'ConnectionListWidgetItem' has a constructor with 1 argument that is not explicit.\nChecking gui\\dialogs\\ConnectionsDialog.cpp: Q_OS_MAC...\n58/125 files checked 43% done\nChecking gui\\dialogs\\CopyCollectionDialog.cpp ...\n59/125 files checked 43% done\nChecking gui\\dialogs\\CreateCollectionDialog.cpp ...\n60/125 files checked 45% done\nChecking gui\\dialogs\\CreateConnectionDialog.cpp ...\n61/125 files checked 46% done\nChecking gui\\dialogs\\CreateDatabaseDialog.cpp ...\n62/125 files checked 46% done\nChecking gui\\dialogs\\CreateUserDialog.cpp ...\n63/125 files checked 47% done\nChecking gui\\dialogs\\DocumentTextEditor.cpp ...\n64/125 files checked 48% done\nChecking gui\\dialogs\\EulaDialog.cpp ...\nChecking gui\\dialogs\\EulaDialog.cpp: _WIN32...\nChecking gui\\dialogs\\EulaDialog.cpp: __APPLE__...\nChecking gui\\dialogs\\EulaDialog.cpp: __linux__...\n65/125 files checked 49% done\nChecking gui\\dialogs\\ExportDialog.cpp ...\nChecking gui\\dialogs\\ExportDialog.cpp: Q_OS_WIN...\n66/125 files checked 51% done\nChecking gui\\dialogs\\FunctionTextEditor.cpp ...\n67/125 files checked 51% done\nChecking gui\\dialogs\\PreferencesDialog.cpp ...\n68/125 files checked 52% done\nChecking gui\\dialogs\\SSHTunnelTab.cpp ...\nChecking gui\\dialogs\\SSHTunnelTab.cpp: Q_OS_MAC...\nChecking gui\\dialogs\\SSHTunnelTab.cpp: Q_OS_WIN...\n69/125 files checked 53% done\nChecking gui\\dialogs\\SSLTab.cpp ...\nChecking gui\\dialogs\\SSLTab.cpp: Q_OS_WIN...\nChecking gui\\dialogs\\SSLTab.cpp: _WIN32...\n70/125 files checked 55% done\nChecking gui\\editors\\FindFrame.cpp ...\n71/125 files checked 56% done\nChecking gui\\editors\\JSLexer.cpp ...\n72/125 files checked 56% done\nChecking gui\\editors\\PlainJavaScriptEditor.cpp ...\nChecking gui\\editors\\PlainJavaScriptEditor.cpp: Q_OS_MAC...\nChecking gui\\editors\\PlainJavaScriptEditor.cpp: Q_OS_WIN...\n73/125 files checked 57% done\nChecking gui\\utils\\ComboBoxUtils.cpp ...\n74/125 files checked 57% done\nChecking gui\\utils\\DialogUtils.cpp ...\n75/125 files checked 57% done\nChecking gui\\widgets\\LogWidget.cpp ...\n76/125 files checked 57% done\nChecking gui\\widgets\\explorer\\EditIndexDialog.cpp ...\n77/125 files checked 58% done\nChecking gui\\widgets\\explorer\\ExplorerCollectionTreeItem.cpp ...\n78/125 files checked 61% done\nChecking gui\\widgets\\explorer\\ExplorerDatabaseCategoryTreeItem.cpp ...\n79/125 files checked 62% done\nChecking gui\\widgets\\explorer\\ExplorerDatabaseTreeItem.cpp ...\nChecking gui\\widgets\\explorer\\ExplorerDatabaseTreeItem.cpp: __APPLE__...\n80/125 files checked 63% done\nChecking gui\\widgets\\explorer\\ExplorerFunctionTreeItem.cpp ...\n81/125 files checked 63% done\nChecking gui\\widgets\\explorer\\ExplorerReplicaSetFolderItem.cpp ...\n[gui\\widgets\\explorer\\ExplorerReplicaSetFolderItem.cpp:70]: (style) Consider using std::find_if algorithm instead of a raw loop.\n[gui\\widgets\\explorer\\ExplorerReplicaSetFolderItem.cpp:100]: (style) Consider using std::find_if algorithm instead of a raw loop.\n82/125 files checked 64% done\nChecking gui\\widgets\\explorer\\ExplorerReplicaSetTreeItem.cpp ...\nChecking gui\\widgets\\explorer\\ExplorerReplicaSetTreeItem.cpp: __APPLE__...\n83/125 files checked 64% done\nChecking gui\\widgets\\explorer\\ExplorerServerTreeItem.cpp ...\n[gui\\widgets\\explorer\\ExplorerServerTreeItem.cpp:354]: (style) The scope of the variable 'isPrimary' can be reduced.\nChecking gui\\widgets\\explorer\\ExplorerServerTreeItem.cpp: __APPLE__...\n84/125 files checked 66% done\nChecking gui\\widgets\\explorer\\ExplorerTreeItem.cpp ...\n85/125 files checked 66% done\nChecking gui\\widgets\\explorer\\ExplorerTreeWidget.cpp ...\nChecking gui\\widgets\\explorer\\ExplorerTreeWidget.cpp: Q_OS_MAC...\n86/125 files checked 66% done\nChecking gui\\widgets\\explorer\\ExplorerUserTreeItem.cpp ...\n87/125 files checked 66% done\nChecking gui\\widgets\\explorer\\ExplorerWidget.cpp ...\n88/125 files checked 67% done\nChecking gui\\widgets\\workarea\\BsonTableModel.cpp ...\n[gui\\widgets\\workarea\\BsonTableModel.cpp:88] -> [gui\\widgets\\workarea\\BsonTableModel.cpp:94]: (style) Local variable child shadows outer variable\n89/125 files checked 67% done\nChecking gui\\widgets\\workarea\\BsonTableView.cpp ...\nChecking gui\\widgets\\workarea\\BsonTableView.cpp: Q_OS_MAC...\n90/125 files checked 67% done\nChecking gui\\widgets\\workarea\\BsonTreeItem.cpp ...\n[gui\\widgets\\workarea\\BsonTreeItem.cpp:9]: (style) Struct 'removeIfFound' has a constructor with 1 argument that is not explicit.\n91/125 files checked 68% done\nChecking gui\\widgets\\workarea\\BsonTreeModel.cpp ...\n92/125 files checked 69% done\nChecking gui\\widgets\\workarea\\BsonTreeView.cpp ...\n[gui\\widgets\\workarea\\BsonTreeView.cpp:67]: (style) The scope of the variable 'isSimple' can be reduced.\n[gui\\widgets\\workarea\\BsonTreeView.cpp:67]: (style) Variable 'isSimple' is assigned a value that is never used.\n[gui\\widgets\\workarea\\BsonTreeView.cpp:69]: (style) Variable 'isSimple' is assigned a value that is never used.\n[gui\\widgets\\workarea\\BsonTreeView.cpp:168]: (style) Variable 'count' is assigned a value that is never used.\nChecking gui\\widgets\\workarea\\BsonTreeView.cpp: Q_OS_MAC...\n93/125 files checked 69% done\nChecking gui\\widgets\\workarea\\CollectionStatsTreeItem.cpp ...\n94/125 files checked 70% done\nChecking gui\\widgets\\workarea\\CollectionStatsTreeWidget.cpp ...\n95/125 files checked 70% done\nChecking gui\\widgets\\workarea\\IndicatorLabel.cpp ...\n96/125 files checked 70% done\nChecking gui\\widgets\\workarea\\JsonPrepareThread.cpp ...\n97/125 files checked 70% done\nChecking gui\\widgets\\workarea\\OutputItemContentWidget.cpp ...\n98/125 files checked 72% done\nChecking gui\\widgets\\workarea\\OutputItemHeaderWidget.cpp ...\nChecking gui\\widgets\\workarea\\OutputItemHeaderWidget.cpp: __APPLE__...\n99/125 files checked 73% done\nChecking gui\\widgets\\workarea\\OutputWidget.cpp ...\n[gui\\widgets\\workarea\\OutputWidget.cpp:259]: (style) Variable 'selectedBorder' is assigned a value that is never used.\n[gui\\widgets\\workarea\\OutputWidget.cpp:261]: (style) Variable 'aga1' is assigned a value that is never used.\n[gui\\widgets\\workarea\\OutputWidget.cpp:262]: (style) Variable 'aga2' is assigned a value that is never used.\n[gui\\widgets\\workarea\\OutputWidget.cpp:263]: (style) Variable 'aga3' is assigned a value that is never used.\nChecking gui\\widgets\\workarea\\OutputWidget.cpp: __APPLE__...\n[gui\\widgets\\workarea\\OutputWidget.cpp:256]: (style) Variable 'gradientZero' is assigned a value that is never used.\n100/125 files checked 74% done\nChecking gui\\widgets\\workarea\\PagingWidget.cpp ...\n101/125 files checked 74% done\nChecking gui\\widgets\\workarea\\ProgressBarPopup.cpp ...\n[gui\\widgets\\workarea\\ProgressBarPopup.h:15]: (style) Class 'ProgressBarPopup' has a constructor with 1 argument that is not explicit.\n102/125 files checked 74% done\nChecking gui\\widgets\\workarea\\QueryWidget.cpp ...\n103/125 files checked 76% done\nChecking gui\\widgets\\workarea\\ScriptWidget.cpp ...\nChecking gui\\widgets\\workarea\\ScriptWidget.cpp: Q_OS_MAC...\n104/125 files checked 77% done\nChecking gui\\widgets\\workarea\\WelcomeTab.cpp ...\n[gui\\widgets\\workarea\\WelcomeTab.cpp:66]: (style) Struct 'BlogLinkLabel' has a constructor with 1 argument that is not explicit.\n105/125 files checked 80% done\nChecking gui\\widgets\\workarea\\WorkAreaTabBar.cpp ...\n[gui\\widgets\\workarea\\WorkAreaTabBar.cpp:143]: (style) Variable 'selectedBorder' is assigned a value that is never used.\n[gui\\widgets\\workarea\\WorkAreaTabBar.cpp:145]: (style) Variable 'aga1' is assigned a value that is never used.\n[gui\\widgets\\workarea\\WorkAreaTabBar.cpp:146]: (style) Variable 'aga2' is assigned a value that is never used.\n[gui\\widgets\\workarea\\WorkAreaTabBar.cpp:147]: (style) Variable 'aga3' is assigned a value that is never used.\n[gui\\widgets\\workarea\\WorkAreaTabBar.cpp:209]: (style) Variable 'aga' is assigned a value that is never used.\nChecking gui\\widgets\\workarea\\WorkAreaTabBar.cpp: __APPLE__...\n106/125 files checked 81% done\nChecking gui\\widgets\\workarea\\WorkAreaTabWidget.cpp ...\nChecking gui\\widgets\\workarea\\WorkAreaTabWidget.cpp: Q_OS_MAC...\nChecking gui\\widgets\\workarea\\WorkAreaTabWidget.cpp: __APPLE__...\n107/125 files checked 82% done\nChecking shell\\bson\\json.cpp ...\n[shell\\bson\\json.cpp:750]: (style) The scope of the variable 'index' can be reduced.\n[shell\\bson\\json.cpp:257] -> [shell\\bson\\json.cpp:266]: (style) Local variable ret shadows outer variable\n[shell\\bson\\json.cpp:257] -> [shell\\bson\\json.cpp:274]: (style) Local variable ret shadows outer variable\n[shell\\bson\\json.cpp:257] -> [shell\\bson\\json.cpp:282]: (style) Local variable ret shadows outer variable\n[shell\\bson\\json.cpp:257] -> [shell\\bson\\json.cpp:290]: (style) Local variable ret shadows outer variable\n[shell\\bson\\json.cpp:257] -> [shell\\bson\\json.cpp:298]: (style) Local variable ret shadows outer variable\n[shell\\bson\\json.cpp:257] -> [shell\\bson\\json.cpp:306]: (style) Local variable ret shadows outer variable\n[shell\\bson\\json.cpp:257] -> [shell\\bson\\json.cpp:314]: (style) Local variable ret shadows outer variable\n[shell\\bson\\json.cpp:257] -> [shell\\bson\\json.cpp:322]: (style) Local variable ret shadows outer variable\n[shell\\bson\\json.cpp:257] -> [shell\\bson\\json.cpp:330]: (style) Local variable ret shadows outer variable\n[shell\\bson\\json.cpp:257] -> [shell\\bson\\json.cpp:338]: (style) Local variable ret shadows outer variable\n[shell\\bson\\json.cpp:257] -> [shell\\bson\\json.cpp:346]: (style) Local variable ret shadows outer variable\n[shell\\bson\\json.cpp:364] -> [shell\\bson\\json.cpp:378]: (style) Local variable valueRet shadows outer variable\n108/125 files checked 87% done\nChecking shell\\db\\ptimeutil.cpp ...\n109/125 files checked 88% done\nChecking shell\\shell\\dbshell.cpp ...\n[shell\\shell\\dbshell.cpp:706]: (style) Condition '!rcGlobalLocation.empty()' is always true\n[shell\\shell\\dbshell.cpp:779]: (style) The scope of the variable 'promptType' can be reduced.\n[shell\\shell\\dbshell.cpp:736] -> [shell\\shell\\dbshell.cpp:832]: (style) Local variable s shadows outer variable\n[shell\\shell\\dbshell.cpp:258]: (performance) Inefficient usage of string::find() in condition; string::compare() would be faster.\nChecking shell\\shell\\dbshell.cpp: _WIN32...\n110/125 files checked 91% done\nChecking ssh\\array.c ...\n111/125 files checked 91% done\nChecking ssh\\log.c ...\n112/125 files checked 92% done\nChecking ssh\\server.c ...\nChecking ssh\\server.c: WIN32...\n113/125 files checked 92% done\nChecking ssh\\ssh.c ...\n[ssh\\ssh.c:140]: (style) The scope of the variable 'rc' can be reduced.\n[ssh\\ssh.c:519]: (style) The scope of the variable 'rc' can be reduced.\n[ssh\\ssh.c:583]: (style) The scope of the variable 'rc' can be reduced.\n[ssh\\ssh.c:140]: (style) Variable 'rc' is assigned a value that is never used.\n[ssh\\ssh.c:510]: (style) Variable 'result' is assigned a value that is never used.\n[ssh\\ssh.c:583]: (style) Variable 'rc' is assigned a value that is never used.\n[ssh\\ssh.c:730]: (style) Variable 'fingerprint' is assigned a value that is never used.\n[ssh\\ssh.c:106]: (error) Memory leak: session\n[ssh\\ssh.c:111]: (error) Memory leak: session\n[ssh\\ssh.c:196]: (error) Memory leak: channel\n[ssh\\ssh.c:200]: (error) Memory leak: channel\n[ssh\\ssh.c:200]: (error) Memory leak: inbuf\n[ssh\\ssh.c:631]: (error) Resource leak: sock\n[ssh\\ssh.c:637]: (error) Resource leak: sock\n[ssh\\ssh.c:662]: (error) Resource leak: listensock\n[ssh\\ssh.c:669]: (error) Resource leak: listensock\n[ssh\\ssh.c:677]: (error) Resource leak: listensock\n[ssh\\ssh.c:682]: (error) Resource leak: listensock\n[ssh\\ssh.c:687]: (error) Resource leak: listensock\nChecking ssh\\ssh.c: HAVE_UNISTD_H...\nChecking ssh\\ssh.c: WIN32...\n114/125 files checked 94% done\nChecking ssh\\temp\\direct_tcpip.c ...\n[ssh\\temp\\direct_tcpip.c:243]: (warning) %d in format string (no. 2) requires 'int' but the argument type is 'unsigned int'.\n[ssh\\temp\\direct_tcpip.c:243]: (warning) %d in format string (no. 4) requires 'int' but the argument type is 'unsigned int'.\n[ssh\\temp\\direct_tcpip.c:274]: (warning) %d in format string (no. 2) requires 'int' but the argument type is 'unsigned int'.\n[ssh\\temp\\direct_tcpip.c:309]: (warning) %d in format string (no. 2) requires 'int' but the argument type is 'unsigned int'.\n[ssh\\temp\\direct_tcpip.c:123]: (error) Resource leak: sock\n[ssh\\temp\\direct_tcpip.c:129]: (error) Resource leak: sock\n[ssh\\temp\\direct_tcpip.c:136]: (error) Resource leak: sock\nChecking ssh\\temp\\direct_tcpip.c: HAVE_STDLIB_H...\nChecking ssh\\temp\\direct_tcpip.c: HAVE_SYS_SELECT_H...\nChecking ssh\\temp\\direct_tcpip.c: HAVE_UNISTD_H...\nChecking ssh\\temp\\direct_tcpip.c: WIN32...\n115/125 files checked 95% done\nChecking ssh\\temp\\temp_ssh.c ...\n[ssh\\temp\\temp_ssh.c:442]: (style) The scope of the variable 'rc' can be reduced.\n[ssh\\temp\\temp_ssh.c:508]: (style) The scope of the variable 'rc' can be reduced.\n[ssh\\temp\\temp_ssh.c:619]: (style) The scope of the variable 'rc' can be reduced.\n[ssh\\temp\\temp_ssh.c:184]: (style) Variable 'fingerprint' is assigned a value that is never used.\n[ssh\\temp\\temp_ssh.c:153]: (style) Unused variable: i\n[ssh\\temp\\temp_ssh.c:508]: (style) Variable 'rc' is assigned a value that is never used.\n[ssh\\temp\\temp_ssh.c:619]: (style) Variable 'rc' is assigned a value that is never used.\n[ssh\\temp\\temp_ssh.c:85]: (error) Resource leak: sock\n[ssh\\temp\\temp_ssh.c:91]: (error) Resource leak: sock\n[ssh\\temp\\temp_ssh.c:97]: (error) Resource leak: sock\n[ssh\\temp\\temp_ssh.c:115]: (error) Resource leak: listensock\n[ssh\\temp\\temp_ssh.c:122]: (error) Resource leak: listensock\n[ssh\\temp\\temp_ssh.c:130]: (error) Resource leak: listensock\n[ssh\\temp\\temp_ssh.c:135]: (error) Resource leak: listensock\n[ssh\\temp\\temp_ssh.c:140]: (error) Resource leak: listensock\n[ssh\\temp\\temp_ssh.c:243]: (error) Memory leak: channel\n[ssh\\temp\\temp_ssh.c:707]: (error) Memory leak: session\nChecking ssh\\temp\\temp_ssh.c: HAVE_STDLIB_H...\nChecking ssh\\temp\\temp_ssh.c: HAVE_SYS_SELECT_H...\nChecking ssh\\temp\\temp_ssh.c: HAVE_UNISTD_H...\nChecking ssh\\temp\\temp_ssh.c: WIN32...\n116/125 files checked 98% done\nChecking ssh\\temp\\temp_ssh_log.c ...\n117/125 files checked 98% done\nChecking ssh\\test.c ...\n118/125 files checked 98% done\nChecking ssh\\win.c ...\n119/125 files checked 98% done\nChecking utils\\RoboCrypt.cpp ...\n120/125 files checked 98% done\nChecking utils\\RoboCrypt_test.cpp ...\n121/125 files checked 99% done\nChecking utils\\SimpleCrypt.cpp ...\n122/125 files checked 99% done\nChecking utils\\StringOperations.cpp ...\n123/125 files checked 99% done\nChecking utils\\StringOperations_test.cpp ...\n124/125 files checked 99% done\nChecking utils\\common.cpp ...\n125/125 files checked 100% done\n[core\\domain\\MongoUtils.cpp:21]: (style) The function 'buildPasswordHash' is never used.\n[core\\utils\\QtUtils.cpp:39]: (style) The function 'cleanUpThread' is never used.\n[gui\\dialogs\\CreateUserDialog.cpp:34]: (style) The function 'containsWord' is never used.\n[core\\utils\\BsonUtils.cpp:29]: (style) The function 'getField < bool >' is never used.\n[core\\utils\\BsonUtils.cpp:53]: (style) The function 'getField < double >' is never used.\n[core\\utils\\BsonUtils.cpp:47]: (style) The function 'getField < int >' is never used.\n[core\\utils\\BsonUtils.cpp:59]: (style) The function 'getField < long long >' is never used.\n[core\\utils\\BsonUtils.cpp:23]: (style) The function 'getField < mongo :: BSONObj >' is never used.\n[core\\utils\\BsonUtils.cpp:35]: (style) The function 'getField < std :: string >' is never used.\n[core\\utils\\BsonUtils.cpp:41]: (style) The function 'getField < std :: vector < BSONElement > >' is never used.\n[app\\main_test.cpp:12]: (style) The function 'logProcessDetailsForLogRotate' is never used.\n[ssh\\log.c:27]: (style) The function 'log_msg' is never used.\n[shell\\shell\\dbshell.cpp:367]: (style) The function 'run' is never used.\n[ssh\\log.c:74]: (style) The function 'ssh_log_msg' is never used.\n[ssh\\win.c:3]: (style) The function 'ssh_win_init' is never used.\n[core\\utils\\QtUtils.cpp:11]: (style) The function 'toQString < std :: string >' is never used.\n[core\\utils\\QtUtils.cpp:18]: (style) The function 'toQString < std :: wstring >' is never used.\n[shell\\shell\\dbshell.cpp:915]: (style) The function 'wmain' is never used.\n(information) Cppcheck cannot find all the include files (use --check-config for details)\n"
  },
  {
    "path": "static_analysis/scan-build_debug_Aug2020.txt",
    "content": "gman-mac:bin gsimsek$ ./build_scan-build \nscan-build: Using '/usr/local/opt/llvm/bin/clang++' for static analysis\n[  0%] Automatic MOC, UIC and RCC for target qjson\n[  2%] Building CXX object src/third-party/googletest-1.8.1/googlemock/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o\n[  2%] Automatic MOC, UIC and RCC for target qscintilla\n[  2%] Built target qjson_autogen\n[  2%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/openssl.c.o\n[  2%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/bcrypt_pbkdf.c.o\n[  3%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/agent.c.o\n[  4%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/blowfish.c.o\n[  4%] Built target qscintilla_autogen\n[  4%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/channel.c.o\nScanning dependencies of target qjson\nScanning dependencies of target qscintilla\n[  5%] Building CXX object src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/sources/src/parser.cpp.o\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/bcrypt_pbkdf.c:84:46: warning: expression does not compute the number of elements in this\n      array; element type is 'uint32_t' (aka 'unsigned int'), not 'uint64_t' (aka 'unsigned long long') [-Wsizeof-array-div]\n        blf_enc(&state, cdata, sizeof(cdata) / sizeof(uint64_t));\n                                      ~~~~~  ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/bcrypt_pbkdf.c:65:14: note: array 'cdata' declared here\n    uint32_t cdata[BCRYPT_BLOCKS];\n             ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/bcrypt_pbkdf.c:84:46: note: place parentheses around the 'sizeof(uint64_t)' expression to\n      silence this warning\n        blf_enc(&state, cdata, sizeof(cdata) / sizeof(uint64_t));\n                                             ^\n1 warning generated.\n[  5%] Building CXX object src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/sources/src/qobjecthelper.cpp.o\n[  6%] Building CXX object src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/sources/src/json_scanner.cpp.o\n[  6%] Building CXX object src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/sources/src/json_parser.cc.o\n^Cmake[2]: *** Deleting file `src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/channel.c.o'\nmake[2]: *** Deleting file `src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/openssl.c.o'\nmake[2]: *** [src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/depend] Interrupt: 2\nmake[1]: *** [src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/all] Interrupt: 2\nmake[2]: *** wait: Interrupted system call.  Stop.\nmake[2]: *** Waiting for unfinished jobs....\nmake[2]: *** wait: Interrupted system call.  Stop.\nmake[1]: *** [src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/all] Error 2\nmake[1]: *** [src/third-party/googletest-1.8.1/googlemock/gtest/CMakeFiles/gtest.dir/all] Interrupt: 2\nmake[2]: *** wait: Interrupted system call.  Stop.\nmake[2]: *** Waiting for unfinished jobs....\nmake[1]: *** [src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/all] Error 2\nmake: *** [all] Interrupt: 2\nscan-build: 0 bugs found.\nscan-build: The analyzer encountered problems on some source files.\nscan-build: Preprocessed versions of these sources were deposited in '/var/folders/38/3l23x7_52t991w22sk9639h00000gn/T/scan-build-2020-08-21-171451-87959-1/failures'.\nscan-build: Please consider submitting a bug report using these files:\nscan-build:   http://clang-analyzer.llvm.org/filing_bugs.html\ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ ./build_scan-build \nBuilding with scan-build in debug mode...\n------------------------------------------------\nscan-build: Using '/usr/local/opt/llvm/bin/clang++' for static analysis\n[  0%] Automatic MOC, UIC and RCC for target qjson\n[  1%] Automatic MOC, UIC and RCC for target qscintilla\n[  2%] Building CXX object src/third-party/googletest-1.8.1/googlemock/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o\n[  2%] Built target qjson_autogen\n[  2%] Built target qscintilla_autogen\n[  2%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/openssl.c.o\n[  3%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/crypt.c.o\n[  4%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/comp.c.o\n[  4%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/channel.c.o\n[  4%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/global.c.o\nScanning dependencies of target qscintilla\n[  5%] Building CXX object src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/sources/src/parser.cpp.o\n[  5%] Building CXX object src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/sources/src/qobjecthelper.cpp.o\n[  6%] Building CXX object src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/sources/src/json_scanner.cpp.o\n[  6%] Building CXX object src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/sources/src/json_parser.cc.o\n^Cmake[2]: *** Deleting file `src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/channel.c.o'\nmake[2]: *** Deleting file `src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/openssl.c.o'\nmake[2]: *** [src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/depend] Interrupt: 2\nmake[1]: *** [src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/all] Interrupt: 2\nmake[2]: *** wait: Interrupted system call.  Stop.\nmake[2]: *** Waiting for unfinished jobs....\nmake[2]: *** wait: Interrupted system call.  Stop.\nmake[1]: *** [src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/all] Error 2\nmake[1]: *** [src/third-party/googletest-1.8.1/googlemock/gtest/CMakeFiles/gtest.dir/all] Interrupt: 2\nmake[2]: *** wait: Interrupted system call.  Stop.\nmake[2]: *** Waiting for unfinished jobs....\nmake[1]: *** [src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/all] Error 2\nmake: *** [all] Interrupt: 2\nscan-build: 0 bugs found.\nscan-build: The analyzer encountered problems on some source files.\nscan-build: Preprocessed versions of these sources were deposited in '/var/folders/38/3l23x7_52t991w22sk9639h00000gn/T/scan-build-2020-08-21-171525-88118-1/failures'.\nscan-build: Please consider submitting a bug report using these files:\nscan-build:   http://clang-analyzer.llvm.org/filing_bugs.html\ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ git diff\ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ pw\n-bash: pw: command not found\ngman-mac:bin gsimsek$ pwd\n/opt/robo/bin\ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ git add -f build_scan-build \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ git add -f configure_scan-build \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ ./clean debug\ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ ./configure_scan-build \nConfiguring with scan-build in debug mode...\n------------------------------------------------\nscan-build: Using '/usr/local/opt/llvm/bin/clang++' for static analysis\nscan-build: Emitting reports for this run to '/var/folders/38/3l23x7_52t991w22sk9639h00000gn/T/scan-build-2020-08-22-120933-92552-1'.\n-- The C compiler identification is Clang 10.0.1\n-- The CXX compiler identification is Clang 10.0.1\n-- Check for working C compiler: /usr/local/Cellar/llvm/10.0.1/libexec/ccc-analyzer\n-- Check for working C compiler: /usr/local/Cellar/llvm/10.0.1/libexec/ccc-analyzer -- works\n-- Detecting C compiler ABI info\n-- Detecting C compiler ABI info - done\n-- Detecting C compile features\n-- Detecting C compile features - done\n-- Check for working CXX compiler: /usr/local/Cellar/llvm/10.0.1/libexec/c++-analyzer\n-- Check for working CXX compiler: /usr/local/Cellar/llvm/10.0.1/libexec/c++-analyzer -- works\n-- Detecting CXX compiler ABI info\n-- Detecting CXX compiler ABI info - done\n-- Detecting CXX compile features\n-- Detecting CXX compile features - done\n-- Looking for pthread.h\n-- Looking for pthread.h - found\n-- Looking for pthread_create\n-- Looking for pthread_create - found\n-- Found Threads: TRUE  \n-- Found MongoDB: /opt/robo-shell (found version \"r4.2.6\") \n-- Looking for include file unistd.h\n-- Looking for include file unistd.h - found\n-- Looking for include file inttypes.h\n-- Looking for include file inttypes.h - found\n-- Looking for include file stdlib.h\n-- Looking for include file stdlib.h - found\n-- Looking for include file sys/select.h\n-- Looking for include file sys/select.h - found\n-- Looking for include file sys/uio.h\n-- Looking for include file sys/uio.h - found\n-- Looking for include file sys/socket.h\n-- Looking for include file sys/socket.h - found\n-- Looking for include file sys/ioctl.h\n-- Looking for include file sys/ioctl.h - found\n-- Looking for include file sys/time.h\n-- Looking for include file sys/time.h - found\n-- Looking for include file sys/un.h\n-- Looking for include file sys/un.h - found\n-- Looking for include file windows.h\n-- Looking for include file windows.h - not found\n-- Looking for include file ws2tcpip.h\n-- Looking for include file ws2tcpip.h - not found\n-- Looking for include file winsock2.h\n-- Looking for include file winsock2.h - not found\n-- Looking for sys/types.h\n-- Looking for sys/types.h - found\n-- Looking for stdint.h\n-- Looking for stdint.h - found\n-- Looking for stddef.h\n-- Looking for stddef.h - found\n-- Check size of long long\n-- Check size of long long - done\n-- Looking for gettimeofday\n-- Looking for gettimeofday - found\n-- Looking for strtoll\n-- Looking for strtoll - found\n-- Looking for snprintf\n-- Looking for snprintf - found\npoll use is disabled on this platform\n-- Looking for socket\n-- Looking for socket - found\n-- Looking for select\n-- Looking for select - found\n-- Looking for inet_addr\n-- Looking for inet_addr - found\n-- Performing Test HAVE_O_NONBLOCK\n-- Performing Test HAVE_O_NONBLOCK - Success\n-- Looking for include file arpa/inet.h\n-- Looking for include file arpa/inet.h - found\n-- Looking for include file netinet/in.h\n-- Looking for include file netinet/in.h - found\n-- Looking for strcasecmp\n-- Looking for strcasecmp - found\n-- Looking for _stricmp\n-- Looking for _stricmp - not found\n-- Looking for _snprintf\n-- Looking for _snprintf - not found\n-- Looking for __func__\n-- Looking for __func__ - found\n-- Looking for __FUNCTION__\n-- Looking for __FUNCTION__ - found\n-- Found PythonInterp: /usr/local/bin/python (found version \"3.7.3\") \n\n _______________[ Robo 3T configuration summary ]________________\n| \n|-- Dependencies:\n| \n|   Qt5 Core:           5.12.8    /opt/Qt5.12.8/5.12.8/clang_64/lib/cmake/Qt5Core\n|   Qt5 Gui:            5.12.8    /opt/Qt5.12.8/5.12.8/clang_64/lib/cmake/Qt5Gui\n|   Qt5 Widgets:        5.12.8    /opt/Qt5.12.8/5.12.8/clang_64/lib/cmake/Qt5Widgets\n|   Qt5 PrintSupport:   5.12.8    /opt/Qt5.12.8/5.12.8/clang_64/lib/cmake/Qt5PrintSupport\n|   Qt5 Network:        5.12.8    /opt/Qt5.12.8/5.12.8/clang_64/lib/cmake/Qt5Network\n|   Qt5 Xml:            5.12.8    /opt/Qt5.12.8/5.12.8/clang_64/lib/cmake/Qt5Xml\n|   MongoDB:            r4.2.6    /opt/robo-shell/build/debug\n|   MongoDB Objects:    r4.2.6    /opt/robo-shell/build\n|   OpenSSL:            1.1.1f    /opt/openssl-1.1.1f\n|   libssh2:            1.9.0     src/third-party/libssh2-1.9.0\n|   QJson:              0.8.1     src/third-party/qjson-0.8.1\n|   QScintilla:         2.8.4     src/third-party/qscintilla-2.8.4\n|   Google Test:        1.8.1     src/third-party/googletest-1.8.1\n|   ESPRIMA:            2.7.3     src/third-party/esprima-2.7.3\n|\n|-- Summary:\n|\n|   System:           Darwin\n|   Target SDK:       10.13\n|   Build type:       Debug\n|   Install path:     /opt/robo/build/debug/install\n|\n|-- Build, Run and Install:\n| \n|     $ bin/build\n|     $ bin/run\n|     $ bin/install\n|\n|-- Run Unit Tests:\n| \n|     $ bin/build_and_run_tests\n|     $ bin/run_tests (without building)\n|__________________________________________________________________\n\n-- Configuring done\n-- Generating done\n-- Build files have been written to: /opt/robo/build/debug\nscan-build: 2 bugs found.\nscan-build: Run 'scan-view /var/folders/38/3l23x7_52t991w22sk9639h00000gn/T/scan-build-2020-08-22-120933-92552-1' to examine bug reports.\ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ ./build_scan-build \nBuilding with scan-build in debug mode...\n------------------------------------------------\nscan-build: Using '/usr/local/opt/llvm/bin/clang++' for static analysis\nScanning dependencies of target gtest\nScanning dependencies of target qscintilla_autogen\nScanning dependencies of target qjson_autogen\nScanning dependencies of target libssh2\n[  1%] Automatic MOC, UIC and RCC for target qjson\n[  1%] Automatic MOC, UIC and RCC for target qscintilla\n[  2%] Building CXX object src/third-party/googletest-1.8.1/googlemock/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o\n[  2%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/blowfish.c.o\n[  2%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/openssl.c.o\n[  3%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/bcrypt_pbkdf.c.o\n[  4%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/channel.c.o\n[  4%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/agent.c.o\n[  4%] Built target qscintilla_autogen\n[  4%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/comp.c.o\n[  4%] Built target qjson_autogen\n[  5%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/crypt.c.o\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/bcrypt_pbkdf.c:84:46: warning: expression does not compute the number of elements in this\n      array; element type is 'uint32_t' (aka 'unsigned int'), not 'uint64_t' (aka 'unsigned long long') [-Wsizeof-array-div]\n        blf_enc(&state, cdata, sizeof(cdata) / sizeof(uint64_t));\n                                      ~~~~~  ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/bcrypt_pbkdf.c:65:14: note: array 'cdata' declared here\n    uint32_t cdata[BCRYPT_BLOCKS];\n             ^\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/bcrypt_pbkdf.c:84:46: note: place parentheses around the 'sizeof(uint64_t)' expression to\n      silence this warning\n        blf_enc(&state, cdata, sizeof(cdata) / sizeof(uint64_t));\n                                             ^\n1 warning generated.\n[  6%] Generating sources/Qt4Qt5/Qsci/moc_qsciscintillabase.cpp\n[  7%] Generating sources/Qt4Qt5/Qsci/moc_qsciabstractapis.cpp\n[  7%] Generating sources/Qt4Qt5/Qsci/moc_qsciapis.cpp\n[  8%] Generating sources/Qt4Qt5/Qsci/moc_qscilexer.cpp\n[  8%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/global.c.o\n[  8%] Generating sources/Qt4Qt5/Qsci/moc_qscilexercpp.cpp\n[  8%] Generating sources/Qt4Qt5/Qsci/moc_qscilexerjavascript.cpp\n[  8%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/hostkey.c.o\n[  9%] Generating sources/Qt4Qt5/Qsci/moc_qscimacro.cpp\n[ 10%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/keepalive.c.o\n[ 10%] Generating sources/Qt4Qt5/Qsci/moc_qsciscintilla.cpp\nScanning dependencies of target qscintilla\n[ 10%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/kex.c.o\n[ 11%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/knownhost.c.o\n[ 11%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/mac.c.o\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/hostkey.c:411:5: warning: Value stored to 'sig_len' is never read\n    sig_len -= 15;\n    ^          ~~\n1 warning generated.\n[ 11%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/misc.c.o\n[ 12%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/packet.c.o\n[ 12%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/Qsci/moc_qsciabstractapis.cpp.o\n[ 12%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/Qsci/moc_qsciapis.cpp.o\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:328:9: warning: Value stored to 'ret' is never read\n        ret = EC_POINT_oct2point(ec_group, point, k, k_len, NULL);\n        ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:1605:9: warning: Value stored to 'ret' is never read\n        ret = -1;\n        ^     ~~\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:1613:9: warning: Value stored to 'ret' is never read\n        ret = -1;\n        ^     ~~\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:1633:9: warning: Value stored to 'ret' is never read\n        ret = -1;\n        ^     ~~\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:1656:13: warning: Value stored to 'ret' is never read\n            ret = -1;\n            ^     ~~\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:2384:9: warning: Although the value stored to 'rc' is used in the enclosing expression, the value is never actually read from 'rc'\n    if((rc = _libssh2_ecdsa_curve_name_with_octal_new(&ec_key, point_buf,\n        ^    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/openssl.c:2393:9: warning: Value stored to 'rc' is never read\n        rc = -1;\n        ^    ~~\n7 warnings generated.\n[ 13%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/Qsci/moc_qscilexer.cpp.o\n[ 13%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/pem.c.o\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciabstractapis.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/../../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciabstractapis.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciabstractapis.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/../../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciabstractapis.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciapis.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/../../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciapis.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciapis.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/../../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciapis.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n[ 14%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/publickey.c.o\n1 error generated.\n[ 14%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/scp.c.o\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscilexer.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/../../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexer.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/qcolor.h:43:10: fatal error: 'QtGui/qtguiglobal.h' file not found\n#include <QtGui/qtguiglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscilexer.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/../../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexer.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/qcolor.h:43:10: fatal error: 'QtGui/qtguiglobal.h' file not found\n#include <QtGui/qtguiglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 14%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/Qsci/moc_qscilexercpp.cpp.o\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscilexercpp.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/../../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexercpp.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscilexercpp.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/../../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexercpp.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 15%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/Qsci/moc_qscilexerjavascript.cpp.o\n[ 15%] Linking CXX static library libgtestd.a\n[ 15%] Built target gtest\n[ 15%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/session.c.o\n[ 15%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/Qsci/moc_qscimacro.cpp.o\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscilexerjavascript.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/../../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerjavascript.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscilexerjavascript.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/../../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerjavascript.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nScanning dependencies of target qjson\n[ 16%] Building CXX object src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/sources/src/parser.cpp.o\n[ 16%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/Qsci/moc_qsciscintilla.cpp.o\n[ 16%] Building CXX object src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/sources/src/qobjecthelper.cpp.o\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2191:9: warning: Value stored to 's' is never read\n        s += host_sig_len;\n        ^    ~~~~~~~~~~~~\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:2607:15: warning: 2nd function call argument is an uninitialized value\n        ret = ecdh_sha2_nistp(session, type, key_state->data,\n              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/kex.c:3526:13: warning: Value stored to 'p' is never read\n            p += lang_sc_len + 4;\n            ^    ~~~~~~~~~~~~~~~\n3 warnings generated.\n[ 17%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/Qsci/moc_qsciscintillabase.cpp.o\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscimacro.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/../../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscimacro.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qscimacro.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/../../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscimacro.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 18%] Building CXX object src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/sources/src/json_scanner.cpp.o\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/qobjecthelper.cpp:23:\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/qobjecthelper.h:24:\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/qjson_export.h:23:10: fatal error: 'QtCore/qglobal.h' file not found\n#include <QtCore/qglobal.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/qobjecthelper.cpp:23:\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/qobjecthelper.h:24:\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/qjson_export.h:23:10: fatal error: 'QtCore/qglobal.h' file not found\n#include <QtCore/qglobal.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nScanning dependencies of target gmock\n[ 18%] Building CXX object src/third-party/googletest-1.8.1/googlemock/CMakeFiles/gmock.dir/src/gmock-all.cc.o\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/parser.cpp:21:\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/parser.h:24:\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/qjson_export.h:23:10: fatal error: 'QtCore/qglobal.h' file not found\n#include <QtCore/qglobal.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/parser.cpp:21:\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/parser.h:24:\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/qjson_export.h:23:10: fatal error: 'QtCore/qglobal.h' file not found\n#include <QtCore/qglobal.h>\n         ^~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciscintilla.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/../../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciscintilla.h:36:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciscintilla.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/../../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciscintilla.h:36:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n1 error generated.\n[ 20%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/sftp.c.o\n[ 20%] Building CXX object src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/sources/src/json_parser.cc.o\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciscintillabase.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/../../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciscintillabase.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/moc_qsciscintillabase.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/../../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciscintillabase.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 20%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/lexlib/StyleContext.cpp.o\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/json_scanner.cpp:21:\nIn file included from json_scanner.yy:29:\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/json_scanner.h:24:10: fatal error: 'QtCore/QIODevice' file not found\n#include <QtCore/QIODevice>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/json_scanner.cpp:21:\nIn file included from json_scanner.yy:29:\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/json_scanner.h:24:10: fatal error: 'QtCore/QIODevice' file not found\n#include <QtCore/QIODevice>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nScanning dependencies of target gtest_main\n[ 20%] Building CXX object src/third-party/googletest-1.8.1/googlemock/gtest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/knownhost.c:181:42: warning: Null pointer passed as 1st argument to string length function\n                                   salt, strlen(salt));\n                                         ^~~~~~~~~~~~\n1 warning generated.\n[ 21%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/lexlib/WordList.cpp.o\n[ 21%] Building CXX object src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/sources/src/parserrunnable.cpp.o\n[ 21%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/transport.c.o\nIn file included from json_parser.cc:40:\nIn file included from json_parser.yy:27:\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/parser_p.h:25:\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/parser.h:24:\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/qjson_export.h:23:10: fatal error: 'QtCore/qglobal.h' file not found\n#include <QtCore/qglobal.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from json_parser.cc:40:\nIn file included from json_parser.yy:27:\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/parser_p.h:25:\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/parser.h:24:\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/qjson_export.h:23:10: fatal error: 'QtCore/qglobal.h' file not found\n#include <QtCore/qglobal.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 21%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/lexlib/Accessor.cpp.o\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/parserrunnable.cpp:21:\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/parserrunnable.h:24:\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/qjson_export.h:23:10: fatal error: 'QtCore/qglobal.h' file not found\n#include <QtCore/qglobal.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/parserrunnable.cpp:21:\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/parserrunnable.h:24:\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/qjson_export.h:23:10: fatal error: 'QtCore/qglobal.h' file not found\n#include <QtCore/qglobal.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 22%] Building CXX object src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/sources/src/serializer.cpp.o\n[ 23%] Linking CXX static library libgtest_maind.a\n[ 23%] Built target gtest_main\n[ 24%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/userauth.c.o\n[ 24%] Linking CXX static library libgmockd.a\n[ 24%] Built target gmock\n[ 25%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/lexlib/LexerBase.cpp.o\n[ 25%] Building CXX object src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/sources/src/serializerrunnable.cpp.o\n[ 25%] Building C object src/third-party/libssh2-1.9.0/CMakeFiles/libssh2.dir/sources/src/version.c.o\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/serializer.cpp:21:\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/serializer.h:24:\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/qjson_export.h:23:10: fatal error: 'QtCore/qglobal.h' file not found\n#include <QtCore/qglobal.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/serializer.cpp:21:\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/serializer.h:24:\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/qjson_export.h:23:10: fatal error: 'QtCore/qglobal.h' file not found\n#include <QtCore/qglobal.h>\n         ^~~~~~~~~~~~~~~~~~\n[ 26%] Building CXX object src/third-party/qjson-0.8.1/CMakeFiles/qjson.dir/qjson_autogen/mocs_compilation.cpp.o\n1 error generated.\n[ 26%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/lexlib/LexerModule.cpp.o\nScanning dependencies of target gmock_main\n[ 26%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/lexlib/CharacterSet.cpp.o\n[ 27%] Building CXX object src/third-party/googletest-1.8.1/googlemock/CMakeFiles/gmock_main.dir/src/gmock_main.cc.o\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/serializerrunnable.cpp:1:\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/serializerrunnable.h:24:\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/qjson_export.h:23:10: fatal error: 'QtCore/qglobal.h' file not found\n#include <QtCore/qglobal.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/serializerrunnable.cpp:1:\nIn file included from /opt/robo/src/third-party/qjson-0.8.1/sources/src/serializerrunnable.h:24:\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/qjson_export.h:23:10: fatal error: 'QtCore/qglobal.h' file not found\n#include <QtCore/qglobal.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 28%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/lexlib/CharacterCategory.cpp.o\n[ 28%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/lexlib/PropSetSimple.cpp.o\nIn file included from /opt/robo/build/debug/src/third-party/qjson-0.8.1/qjson_autogen/mocs_compilation.cpp:2:\nIn file included from /opt/robo/build/debug/src/third-party/qjson-0.8.1/qjson_autogen/5DVHYYFRXG/moc_parserrunnable.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qjson-0.8.1/qjson_autogen/5DVHYYFRXG/../../../../../../../src/third-party/qjson-0.8.1/sources/src/parserrunnable.h:24:\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/qjson_export.h:23:10: fatal error: 'QtCore/qglobal.h' file not found\n#include <QtCore/qglobal.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/build/debug/src/third-party/qjson-0.8.1/qjson_autogen/mocs_compilation.cpp:2:\nIn file included from /opt/robo/build/debug/src/third-party/qjson-0.8.1/qjson_autogen/5DVHYYFRXG/moc_parserrunnable.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qjson-0.8.1/qjson_autogen/5DVHYYFRXG/../../../../../../../src/third-party/qjson-0.8.1/sources/src/parserrunnable.h:24:\n/opt/robo/src/third-party/qjson-0.8.1/sources/src/qjson_export.h:23:10: fatal error: 'QtCore/qglobal.h' file not found\n#include <QtCore/qglobal.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 28%] Linking CXX static library libqjson.a\n[ 28%] Built target qjson\n[ 29%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/lexlib/LexerSimple.cpp.o\n[ 29%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/lexlib/LexerNoExceptions.cpp.o\n[ 29%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/qscilexer.cpp.o\n[ 30%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/qscilexerjavascript.cpp.o\n[ 30%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/qscilexercpp.cpp.o\n[ 31%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/qscistyle.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerjavascript.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerjavascript.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexerjavascript.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexerjavascript.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 31%] Linking CXX static library libgmock_maind.a\n[ 31%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/InputMethod.cpp.o\n[ 31%] Built target gmock_main\n[ 31%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/qsciabstractapis.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexercpp.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexercpp.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexercpp.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexercpp.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 32%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/ScintillaQt.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexer.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexer.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/qcolor.h:43:10: fatal error: 'QtGui/qtguiglobal.h' file not found\n#include <QtGui/qtguiglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscilexer.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscilexer.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/qcolor.h:43:10: fatal error: 'QtGui/qtguiglobal.h' file not found\n#include <QtGui/qtguiglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 32%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/qscidocument.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscistyle.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscistyle.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/qcolor.h:43:10: fatal error: 'QtGui/qtguiglobal.h' file not found\n#include <QtGui/qtguiglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscistyle.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscistyle.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/qcolor.h:43:10: fatal error: 'QtGui/qtguiglobal.h' file not found\n#include <QtGui/qtguiglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 33%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/qsciscintilla.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciabstractapis.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciabstractapis.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciabstractapis.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciabstractapis.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 33%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/qsciscintillabase.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/InputMethod.cpp:9:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/InputMethod.cpp:9:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 33%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/qscicommand.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscidocument.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscidocument.h:33:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscidocument.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscidocument.h:33:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 34%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/ListBoxQt.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ScintillaQt.cpp:28:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qapplication.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ScintillaQt.cpp:28:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qapplication.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 34%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/qscistyledtext.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:28:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciscintilla.h:36:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintilla.cpp:28:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciscintilla.h:36:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 35%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/SciClasses.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintillabase.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciscintillabase.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciscintillabase.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciscintillabase.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 35%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/qsciprinter.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscicommand.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscicommand.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscicommand.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscicommand.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\n[ 35%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/PlatQt.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscistyledtext.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscistyledtext.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscistyledtext.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscistyledtext.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\n[ 36%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/MacPasteboardMime.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ListBoxQt.cpp:27:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ListBoxQt.h:27:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qmap.h:43:10: fatal error: 'QtCore/qiterator.h' file not found\n#include <QtCore/qiterator.h>\n         ^~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ListBoxQt.cpp:27:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/ListBoxQt.h:27:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qmap.h:43:10: fatal error: 'QtCore/qiterator.h' file not found\n#include <QtCore/qiterator.h>\n         ^~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 36%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/qscimacro.cpp.o\n[ 37%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/qsciapis.cpp.o\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/userauth.c:765:8: warning: Access to field 'signv' results in a dereference of a null pointer (loaded from variable 'privkeyobj')\n    if(privkeyobj->signv(session, sig, sig_len, 1, &datavec,\n       ^~~~~~~~~~~~~~~~~\n1 warning generated.\n[ 37%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/Qt4Qt5/qscicommandset.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciprinter.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciprinter.h:38:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtPrintSupport.framework/Headers/qprinter.h:43:10: fatal error: 'QtPrintSupport/qtprintsupportglobal.h' file not found\n#include <QtPrintSupport/qtprintsupportglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciprinter.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciprinter.h:38:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtPrintSupport.framework/Headers/qprinter.h:43:10: fatal error: 'QtPrintSupport/qtprintsupportglobal.h' file not found\n#include <QtPrintSupport/qtprintsupportglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 37%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/lexers/LexCPP.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/SciClasses.cpp:28:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/SciClasses.h:30:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/SciClasses.cpp:28:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/SciClasses.h:30:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 38%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/AutoComplete.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/MacPasteboardMime.cpp:28:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/MacPasteboardMime.cpp:28:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 38%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/CallTip.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/PlatQt.cpp:30:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qapplication.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/PlatQt.cpp:30:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qapplication.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 40%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/CaseConvert.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscimacro.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscimacro.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscimacro.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscimacro.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 40%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/CaseFolder.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscicommandset.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscicommandset.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciapis.cpp:28:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciapis.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qscicommandset.cpp:26:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qscicommandset.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/qsciapis.cpp:28:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciapis.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/AutoComplete.cpp:17:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 40%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/Catalogue.cpp.o\n1 error generated.\n[ 41%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/CellBuffer.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/AutoComplete.cpp:17:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 41%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/CharClassify.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/CallTip.cpp:14:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/CallTip.cpp:14:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 42%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/ContractionState.cpp.o\n[ 42%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/Decoration.cpp.o\n[ 42%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/Document.cpp.o\n[ 43%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/Editor.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/CellBuffer.cpp:15:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/CellBuffer.cpp:15:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 43%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/ExternalLexer.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Decoration.cpp:14:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/ContractionState.cpp:12:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Decoration.cpp:14:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/ContractionState.cpp:12:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 44%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/Indicator.cpp.o\n[ 44%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/KeyMap.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Document.cpp:18:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Document.cpp:18:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 44%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/LineMarker.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/ExternalLexer.cpp:16:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/ExternalLexer.cpp:16:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 45%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/PerLine.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/KeyMap.cpp:12:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/KeyMap.cpp:12:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 45%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/PositionCache.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Indicator.cpp:11:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Indicator.cpp:11:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 46%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/RESearch.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/PerLine.cpp:12:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/PerLine.cpp:12:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 46%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/RunStyles.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/LineMarker.cpp:14:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/LineMarker.cpp:14:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 46%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/ScintillaBase.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp:21:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Editor.cpp:21:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 47%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/Selection.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/RunStyles.cpp:15:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/RunStyles.cpp:15:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 47%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/Style.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/PositionCache.cpp:18:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/PositionCache.cpp:18:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 48%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/UniConversion.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Style.cpp:10:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Style.cpp:10:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 48%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/ViewStyle.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Selection.cpp:13:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/Selection.cpp:13:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 48%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/sources/src/XPM.cpp.o\n[ 49%] Building CXX object src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla.dir/qscintilla_autogen/mocs_compilation.cpp.o\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/ScintillaBase.cpp:19:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/ScintillaBase.cpp:19:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n/opt/robo/src/third-party/qscintilla-2.8.4/sources/lexers/LexCPP.cpp:148:12: warning: The result of the left shift is undefined because the right operand is negative\n                return 1 << level;\n                         ^  ~~~~~\n1 warning generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/XPM.cpp:14:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/XPM.cpp:14:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/ViewStyle.cpp:14:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/src/ViewStyle.cpp:14:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/include/Platform.h:45:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciglobal.h:33:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/qscintilla_autogen/mocs_compilation.cpp:2:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/qscintilla_autogen/J2OMSJFIBT/moc_SciClasses.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/qscintilla_autogen/J2OMSJFIBT/../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/SciClasses.h:30:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:927:9: warning: Value stored to 'rc' is never read\n        rc = LIBSSH2_ERROR_BUFFER_TOO_SMALL;\n        ^    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n/opt/robo/src/third-party/libssh2-1.9.0/sources/src/sftp.c:3661:21: warning: The left operand of '>' is a garbage value\n        if(data_len > 0) {\n           ~~~~~~~~ ^\n2 warnings generated.\n[ 49%] Linking C static library libssh2.a\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/qscintilla_autogen/mocs_compilation.cpp:2:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/qscintilla_autogen/J2OMSJFIBT/moc_SciClasses.cpp:9:\nIn file included from /opt/robo/build/debug/src/third-party/qscintilla-2.8.4/qscintilla_autogen/J2OMSJFIBT/../../../../../../../src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/SciClasses.h:30:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qglobal.h:66:10: fatal error: 'QtCore/qconfig.h' file not found\n#include <QtCore/qconfig.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 49%] Built target libssh2\nScanning dependencies of target ssh\n[ 49%] Building C object src/robomongo/ssh/CMakeFiles/ssh.dir/array.c.o\n[ 50%] Building C object src/robomongo/ssh/CMakeFiles/ssh.dir/ssh.c.o\n[ 50%] Building C object src/robomongo/ssh/CMakeFiles/ssh.dir/log.c.o\n[ 50%] Linking CXX static library libqscintilla.a\n[ 50%] Built target qscintilla\n/opt/robo/src/robomongo/ssh/ssh.c:111:16: warning: Potential leak of memory pointed to by 'session'\n        return NULL;\n               ^~~~\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:200:16: warning: Potential leak of memory pointed to by 'channel'\n        return NULL;\n               ^~~~\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:200:16: warning: Potential leak of memory pointed to by 'inbuf'\n        return NULL;\n               ^~~~\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:291:9: warning: Use of memory after it is freed\n        rbm_channel_close(session->channels[0]);\n        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n/opt/robo/src/robomongo/ssh/ssh.c:429:13: warning: Value stored to 'errsave' during its initialization is never read\n        int errsave = errno;\n            ^~~~~~~   ~~~~~\n/opt/robo/src/robomongo/ssh/ssh.c:510:17: warning: Value stored to 'result' is never read\n                result = RBM_ERROR;\n                ^        ~~~~~~~~~\n/opt/robo/src/robomongo/ssh/ssh.c:730:5: warning: Value stored to 'fingerprint' is never read\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n7 warnings generated.\n[ 51%] Linking C static library libssh.a\n[ 51%] Built target ssh\nScanning dependencies of target robomongo_autogen\nScanning dependencies of target ssh_test\nScanning dependencies of target server\n[ 52%] Building C object src/robomongo/ssh/CMakeFiles/server.dir/server.c.o\n[ 52%] Automatic MOC, UIC and RCC for target robomongo\n[ 52%] Building C object src/robomongo/ssh/CMakeFiles/ssh_test.dir/test.c.o\n[ 52%] Linking C executable server\n[ 52%] Linking C executable ssh_test\n[ 52%] Built target server\n[ 52%] Built target ssh_test\n[ 52%] Built target robomongo_autogen\nScanning dependencies of target robomongo\n[ 52%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/app/main.cpp.o\n[ 52%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/utils/QtUtils.cpp.o\n[ 53%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/utils/StdUtils.cpp.o\n[ 54%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/HexUtils.cpp.o\n[ 54%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/utils/Logger.cpp.o\n[ 55%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/utils/BsonUtils.cpp.o\n[ 55%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/settings/CredentialSettings.cpp.o\n[ 55%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/settings/ConnectionSettings.cpp.o\n[ 55%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/Event.cpp.o\nIn file included from /opt/robo/src/robomongo/core/settings/CredentialSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/CredentialSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/settings/CredentialSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/CredentialSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\n[ 56%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/Enums.cpp.o\nIn file included from /opt/robo/src/robomongo/core/utils/QtUtils.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/utils/QtUtils.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/utils/QtUtils.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/utils/QtUtils.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\n[ 56%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/EventError.cpp.o\n[ 57%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/EventBusSubscriber.cpp.o\nIn file included from /opt/robo/src/robomongo/core/EventBusSubscriber.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/EventBusSubscriber.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/EventBusSubscriber.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/EventBusSubscriber.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 57%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/EventBusDispatcher.cpp.o\nIn file included from /opt/robo/src/robomongo/core/Event.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/Event.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/Event.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/Event.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 57%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/EventWrapper.cpp.o\n[ 58%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/EventBus.cpp.o\nIn file included from /opt/robo/src/robomongo/core/utils/Logger.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/utils/Logger.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/utils/Logger.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/utils/Logger.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 58%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/KeyboardManager.cpp.o\nIn file included from /opt/robo/src/robomongo/app/main.cpp:1:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QApplication:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qapplication.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/app/main.cpp:1:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QApplication:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qapplication.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/core/EventBusDispatcher.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/EventBusDispatcher.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/EventBusDispatcher.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/EventBusDispatcher.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 60%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoNamespace.cpp.o\n1 error generated.\n[ 60%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoFunction.cpp.o\nIn file included from /opt/robo/src/robomongo/core/EventWrapper.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/EventWrapper.h:3:\nIn file included from /opt/robo/src/robomongo/core/Event.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/settings/ConnectionSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/ConnectionSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/EventWrapper.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/EventWrapper.h:3:\nIn file included from /opt/robo/src/robomongo/core/Event.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/core/settings/ConnectionSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/ConnectionSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n[ 60%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoUtils.cpp.o\n1 error generated.\n[ 61%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoCollection.cpp.o\nIn file included from /opt/robo/src/robomongo/core/KeyboardManager.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/KeyboardManager.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/QKeyEvent:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/qevent.h:43:10: fatal error: 'QtGui/qtguiglobal.h' file not found\n#include <QtGui/qtguiglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/KeyboardManager.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/KeyboardManager.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/QKeyEvent:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/qevent.h:43:10: fatal error: 'QtGui/qtguiglobal.h' file not found\n#include <QtGui/qtguiglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 61%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoCollectionInfo.cpp.o\n[ 62%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoQueryInfo.cpp.o\n1 error generated.\n[ 62%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/CursorPosition.cpp.o\n[ 62%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/ScriptInfo.cpp.o\nIn file included from /opt/robo/src/robomongo/core/EventBus.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/EventBus.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/EventBus.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/EventBus.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/utils/BsonUtils.cpp:8:\nIn file included from /opt/robo/src/robomongo/core/utils/Logger.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 63%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/events/MongoEventsInfo.cpp.o\nIn file included from /opt/robo/src/robomongo/core/utils/BsonUtils.cpp:8:\nIn file included from /opt/robo/src/robomongo/core/utils/Logger.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 63%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/shell/db/ptimeutil.cpp.o\nIn file included from /opt/robo/src/robomongo/core/domain/ScriptInfo.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/ScriptInfo.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/ScriptInfo.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/ScriptInfo.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\n[ 64%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/shell/bson/json.cpp.o\nIn file included from /opt/robo/src/robomongo/core/domain/MongoUtils.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoUtils.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/MongoUtils.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoUtils.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\n[ 64%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/engine/ScriptEngine.cpp.o\nIn file included from /opt/robo/src/robomongo/core/domain/MongoCollection.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoCollection.h:3:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDatabase.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/MongoCollection.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoCollection.h:3:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDatabase.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n[ 64%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/events/MongoEvents.cpp.o\n[ 65%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoDocument.cpp.o\n1 error generated.\n[ 65%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/AppStyle.cpp.o\n[ 66%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoServer.cpp.o\n[ 66%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoShell.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/AppStyle.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/AppStyle.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QStyle:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qstyle.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/AppStyle.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/AppStyle.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QStyle:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qstyle.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 66%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoDatabase.cpp.o\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDocument.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDocument.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QStringList:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstringlist.h:41:10: fatal error: 'QtCore/qlist.h' file not found\n#include <QtCore/qlist.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDocument.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDocument.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QStringList:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstringlist.h:41:10: fatal error: 'QtCore/qlist.h' file not found\n#include <QtCore/qlist.h>\n         ^~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/core/engine/ScriptEngine.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/engine/ScriptEngine.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/engine/ScriptEngine.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/engine/ScriptEngine.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 67%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/App.cpp.o\n1 error generated.\n[ 67%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/mongodb/MongoClient.cpp.o\nIn file included from /opt/robo/src/robomongo/core/events/MongoEvents.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/events/MongoEvents.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMessageBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmessagebox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/events/MongoEvents.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/events/MongoEvents.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMessageBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmessagebox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 68%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/mongodb/MongoWorker.cpp.o\nIn file included from /opt/robo/src/robomongo/core/domain/MongoShell.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoShell.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/MongoShell.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoShell.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/core/domain/MongoServer.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoServer.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/MongoServer.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoServer.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 68%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/mongodb/ReplicaSet.cpp.o\n1 error generated.\n[ 68%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/settings/SettingsManager.cpp.o\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDatabase.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDatabase.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDatabase.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDatabase.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 69%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/AppRegistry.cpp.o\n[ 69%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/utils/StringOperations.cpp.o\n[ 70%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/utils/common.cpp.o\nIn file included from /opt/robo/src/robomongo/core/domain/App.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/App.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/App.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/App.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 70%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/utils/SimpleCrypt.cpp.o\nIn file included from /opt/robo/src/robomongo/core/mongodb/MongoClient.cpp:5:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDocument.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QStringList:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstringlist.h:41:10: fatal error: 'QtCore/qlist.h' file not found\n#include <QtCore/qlist.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/mongodb/MongoClient.cpp:5:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDocument.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QStringList:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstringlist.h:41:10: fatal error: 'QtCore/qlist.h' file not found\n#include <QtCore/qlist.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\n[ 70%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/utils/RoboCrypt.cpp.o\nIn file included from /opt/robo/src/robomongo/core/settings/SettingsManager.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/SettingsManager.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/settings/SettingsManager.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/SettingsManager.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/utils/SimpleCrypt.cpp:27:\nIn file included from /opt/robo/src/robomongo/utils/SimpleCrypt.h:30:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/utils/SimpleCrypt.cpp:27:\nIn file included from /opt/robo/src/robomongo/utils/SimpleCrypt.h:30:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\n[ 71%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/GuiRegistry.cpp.o\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/AppRegistry.cpp:3:\nIn file included from /opt/robo/src/robomongo/core/EventBus.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 71%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/AboutDialog.cpp.o\nIn file included from /opt/robo/src/robomongo/core/AppRegistry.cpp:3:\nIn file included from /opt/robo/src/robomongo/core/EventBus.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/core/mongodb/MongoWorker.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/mongodb/MongoWorker.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/mongodb/MongoWorker.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/mongodb/MongoWorker.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 72%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/EulaDialog.cpp.o\n1 error generated.\n[ 72%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/ConnectionAdvancedTab.cpp.o\n[ 72%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/ConnectionAuthTab.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/AboutDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/AboutDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/AboutDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/AboutDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 73%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/ConnectionBasicTab.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/GuiRegistry.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/GuiRegistry.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/QIcon:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/qicon.h:43:10: fatal error: 'QtGui/qtguiglobal.h' file not found\n#include <QtGui/qtguiglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/GuiRegistry.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/GuiRegistry.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/QIcon:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/qicon.h:43:10: fatal error: 'QtGui/qtguiglobal.h' file not found\n#include <QtGui/qtguiglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 73%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/ConnectionDiagnosticDialog.cpp.o\nIn file included from /opt/robo/src/robomongo/utils/common.cpp:1:\nIn file included from /opt/robo/src/robomongo/utils/common.h:6:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/utils/common.cpp:1:\nIn file included from /opt/robo/src/robomongo/utils/common.h:6:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n[ 74%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/ConnectionDialog.cpp.o\n1 error generated.\n[ 74%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/CopyCollectionDialog.cpp.o\nIn file included from /opt/robo/src/robomongo/utils/RoboCrypt.cpp:1:\nIn file included from /opt/robo/src/robomongo/utils/RoboCrypt.h:1:\nIn file included from /opt/robo/src/robomongo/utils/SimpleCrypt.h:30:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/utils/RoboCrypt.cpp:1:\nIn file included from /opt/robo/src/robomongo/utils/RoboCrypt.h:1:\nIn file included from /opt/robo/src/robomongo/utils/SimpleCrypt.h:30:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\n[ 74%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/IndicatorLabel.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/IndicatorLabel.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/IndicatorLabel.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionAdvancedTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionAdvancedTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/EulaDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/EulaDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWizard:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwizard.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/IndicatorLabel.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/IndicatorLabel.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionAdvancedTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionAdvancedTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/dialogs/EulaDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/EulaDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWizard:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwizard.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n[ 75%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/CreateCollectionDialog.cpp.o\n1 error generated.\n1 error generated.\n[ 75%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/CreateDatabaseDialog.cpp.o\n[ 76%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/CreateUserDialog.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionAuthTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionAuthTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionAuthTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionAuthTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 76%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/utils/ComboBoxUtils.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionBasicTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionBasicTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionBasicTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionBasicTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionDiagnosticDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionDiagnosticDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionDiagnosticDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionDiagnosticDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n[ 76%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/utils/DialogUtils.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/utils/ComboBoxUtils.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/utils/ComboBoxUtils.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QComboBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qcombobox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/utils/ComboBoxUtils.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/utils/ComboBoxUtils.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QComboBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qcombobox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n1 error generated.\n[ 77%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/PreferencesDialog.cpp.o\n[ 77%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/ConnectionsDialog.cpp.o\n1 error generated.\n[ 78%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/ExportDialog.cpp.o\n1 error generated.\n[ 78%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/ChangeShellTimeoutDialog.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CopyCollectionDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CopyCollectionDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CopyCollectionDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CopyCollectionDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 78%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/editors/PlainJavaScriptEditor.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/utils/DialogUtils.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/utils/DialogUtils.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMessageBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmessagebox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/utils/DialogUtils.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/utils/DialogUtils.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMessageBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmessagebox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 80%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/editors/JSLexer.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateUserDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateUserDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/PreferencesDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/PreferencesDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateUserDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateUserDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/dialogs/PreferencesDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/PreferencesDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 80%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/editors/FindFrame.cpp.o\n1 error generated.\n[ 81%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/AddEditIndexDialog.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/editors/JSLexer.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/editors/JSLexer.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/editors/JSLexer.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/editors/JSLexer.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 81%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/ScriptWidget.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/editors/PlainJavaScriptEditor.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/editors/PlainJavaScriptEditor.h:3:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciscintilla.h:36:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/editors/PlainJavaScriptEditor.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/editors/PlainJavaScriptEditor.h:3:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciscintilla.h:36:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 82%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerCollectionTreeItem.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateCollectionDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateCollectionDialog.h:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateCollectionDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateCollectionDialog.h:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 82%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerCollectionIndexesDir.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ChangeShellTimeoutDialog.cpp:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ChangeShellTimeoutDialog.cpp:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionsDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionsDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionsDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionsDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ExportDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ExportDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ExportDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ExportDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 82%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerCollectionIndexItem.cpp.o\n1 error generated.\n[ 83%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerTreeItem.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/editors/FindFrame.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/editors/FindFrame.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QFrame:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qframe.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/editors/FindFrame.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/editors/FindFrame.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QFrame:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qframe.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 83%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerReplicaSetFolderItem.cpp.o\n1 error generated.\n[ 84%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerReplicaSetTreeItem.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/AddEditIndexDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/AddEditIndexDialog.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/AddEditIndexDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/AddEditIndexDialog.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 84%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerDatabaseTreeItem.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/ScriptWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/ScriptWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QFrame:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qframe.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/ScriptWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/ScriptWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QFrame:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qframe.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 84%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/core/Event.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/core/Event.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n[ 85%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerUserTreeItem.cpp.o\n1 error generated.\n[ 85%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerFunctionTreeItem.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.h:3:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.h:3:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 86%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/DocumentTextEditor.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexItem.h:4:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetFolderItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetFolderItem.h:3:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetFolderItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetFolderItem.h:3:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexItem.h:4:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/core/events/MongoEvents.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMessageBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmessagebox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/core/events/MongoEvents.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMessageBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmessagebox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 86%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/FunctionTextEditor.cpp.o\n1 error generated.\n[ 86%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerServerTreeItem.cpp.o\n1 error generated.\n[ 87%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerTreeWidget.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n1 error generated.\n[ 87%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerWidget.cpp.o\n[ 88%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/BsonTableModel.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerUserTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerUserTreeItem.h:4:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerFunctionTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerFunctionTreeItem.h:4:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerUserTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerUserTreeItem.h:4:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 88%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/BsonTableView.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerFunctionTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerFunctionTreeItem.h:4:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 88%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/BsonTreeItem.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/DocumentTextEditor.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/DocumentTextEditor.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/DocumentTextEditor.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/DocumentTextEditor.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 89%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/BsonTreeModel.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/FunctionTextEditor.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/FunctionTextEditor.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/FunctionTextEditor.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/FunctionTextEditor.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 89%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/BsonTreeView.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerServerTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerServerTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/core/events/MongoEvents.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMessageBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmessagebox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerServerTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerServerTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/core/events/MongoEvents.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMessageBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmessagebox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableModel.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableModel.h:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QAbstractProxyModel:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qabstractproxymodel.h:43:10: fatal error: 'QtCore/qabstractitemmodel.h' file not found\n#include <QtCore/qabstractitemmodel.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableModel.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableModel.h:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QAbstractProxyModel:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qabstractproxymodel.h:43:10: fatal error: 'QtCore/qabstractitemmodel.h' file not found\n#include <QtCore/qabstractitemmodel.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 90%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/Notifier.cpp.o\n1 error generated.\n1 error generated.\n[ 90%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/CollectionStatsTreeItem.cpp.o\n[ 90%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/CollectionStatsTreeWidget.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableView.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableView.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTableView:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtableview.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableView.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableView.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTableView:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtableview.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 91%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/JsonPrepareThread.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeItem.h:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeItem.h:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n1 error generated.\n[ 91%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/OutputItemContentWidget.cpp.o\n[ 92%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/OutputItemHeaderWidget.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 92%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/OutputWidget.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeView:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreeview.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeView:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreeview.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 92%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/PagingWidget.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeModel.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeModel.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QAbstractItemModel:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qabstractitemmodel.h:43:10: fatal error: 'QtCore/qvariant.h' file not found\n#include <QtCore/qvariant.h>\n         ^~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeModel.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeModel.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QAbstractItemModel:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qabstractitemmodel.h:43:10: fatal error: 'QtCore/qvariant.h' file not found\n#include <QtCore/qvariant.h>\n         ^~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 93%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/ProgressBarPopup.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeItem.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeItem.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 93%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/QueryWidget.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/JsonPrepareThread.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/JsonPrepareThread.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QThread:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qthread.h:44:10: fatal error: 'QtCore/qobject.h' file not found\n#include <QtCore/qobject.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/JsonPrepareThread.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/JsonPrepareThread.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QThread:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qthread.h:44:10: fatal error: 'QtCore/qobject.h' file not found\n#include <QtCore/qobject.h>\n         ^~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/PagingWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/PagingWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/PagingWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/PagingWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/ProgressBarPopup.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/ProgressBarPopup.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QFrame:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qframe.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/ProgressBarPopup.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/ProgressBarPopup.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QFrame:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qframe.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 94%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/WorkAreaTabBar.cpp.o\n1 error generated.\n[ 94%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/WorkAreaTabWidget.cpp.o\n1 error generated.\n[ 94%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/WelcomeTab.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemHeaderWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemHeaderWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemHeaderWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemHeaderWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabBar.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabBar.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTabBar:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtabbar.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabBar.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabBar.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTabBar:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtabbar.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 95%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/LogWidget.cpp.o\n1 error generated.\n[ 95%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/MainWindow.cpp.o\nIn file included from /opt/robo/src/robomongo/core/domain/Notifier.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/Notifier.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QModelIndex:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qabstractitemmodel.h:43:10: fatal error: 'QtCore/qvariant.h' file not found\n#include <QtCore/qvariant.h>\n         ^~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTabWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtabwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/Notifier.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/Notifier.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QModelIndex:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qabstractitemmodel.h:43:10: fatal error: 'QtCore/qvariant.h' file not found\n#include <QtCore/qvariant.h>\n         ^~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTabWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtabwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemContentWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemContentWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QStackedWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qstackedwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemContentWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemContentWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QStackedWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qstackedwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 96%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/SSHTunnelTab.cpp.o\n1 error generated.\n[ 96%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/SSLTab.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/LogWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/LogWidget.h:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/LogWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/LogWidget.h:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 96%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/settings/SshSettings.cpp.o\n1 error generated.\n[ 97%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/settings/SslSettings.cpp.o\nIn file included from /opt/robo/src/robomongo/core/settings/SshSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/SshSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/settings/SshSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/SshSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/settings/SslSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/SslSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/settings/SslSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/SslSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n[ 97%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/settings/ReplicaSetSettings.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/QueryWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/QueryWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTabWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtabwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/QueryWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/QueryWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTabWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtabwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 98%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/mongodb/SshTunnelWorker.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WelcomeTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WelcomeTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WelcomeTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WelcomeTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n1 error generated.\n[ 98%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/robomongo_autogen/mocs_compilation.cpp.o\n[ 98%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/robomongo_autogen/3YJK5W5UP7/qrc_robo.cpp.o\n1 error generated.\n[100%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/robomongo_autogen/YHP5W5E6RA/qrc_gui.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/MainWindow.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/MainWindow.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMainWindow:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmainwindow.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/MainWindow.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/MainWindow.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMainWindow:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmainwindow.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/SSHTunnelTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/SSHTunnelTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/SSHTunnelTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/SSHTunnelTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/SSLTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/SSLTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/SSLTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/SSLTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/settings/ReplicaSetSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/ReplicaSetSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/settings/ReplicaSetSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/ReplicaSetSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/mongodb/SshTunnelWorker.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/mongodb/SshTunnelWorker.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/mongodb/SshTunnelWorker.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/mongodb/SshTunnelWorker.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~\n1 error generated.\n[100%] Linking CXX executable \"Robo 3T.app/Contents/MacOS/Robo 3T\"\nld: warning: option -noall_load is obsolete and being ignored\n[100%] Built target robomongo\nscan-build: 23 bugs found.\nscan-build: Run 'scan-view /var/folders/38/3l23x7_52t991w22sk9639h00000gn/T/scan-build-2020-08-22-121013-93295-1' to examine bug reports.\nscan-build: The analyzer encountered problems on some source files.\nscan-build: Preprocessed versions of these sources were deposited in '/var/folders/38/3l23x7_52t991w22sk9639h00000gn/T/scan-build-2020-08-22-121013-93295-1/failures'.\nscan-build: Please consider submitting a bug report using these files:\nscan-build:   http://clang-analyzer.llvm.org/filing_bugs.html\ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ scan-view /var/folders/38/3l23x7_52t991w22sk9639h00000gn/T/scan-build-2020-08-22-121013-93295-1\n/usr/local/opt/llvm/bin/scan-view:9: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses\n  import imp\nStarting scan-view at: http://127.0.0.1:8181\n  Use Ctrl-C to exit.\n\n"
  },
  {
    "path": "static_analysis/scan-build_debug_Aug2020_robo.txt",
    "content": "gman-mac:bin gsimsek$ ./build_scan-build \nscan-build: Using '/usr/local/opt/llvm/bin/clang++' for static analysis\n\n\n...\n\n\n/opt/robo/src/robomongo/ssh/ssh.c:111:16: warning: Potential leak of memory pointed to by 'session'\n        return NULL;\n               ^~~~\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:200:16: warning: Potential leak of memory pointed to by 'channel'\n        return NULL;\n               ^~~~\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:200:16: warning: Potential leak of memory pointed to by 'inbuf'\n        return NULL;\n               ^~~~\n/usr/local/Cellar/llvm/10.0.1/lib/clang/10.0.1/include/stddef.h:89:24: note: expanded from macro 'NULL'\n#  define NULL ((void*)0)\n                       ^\n/opt/robo/src/robomongo/ssh/ssh.c:291:9: warning: Use of memory after it is freed\n        rbm_channel_close(session->channels[0]);\n        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n/opt/robo/src/robomongo/ssh/ssh.c:429:13: warning: Value stored to 'errsave' during its initialization is never read\n        int errsave = errno;\n            ^~~~~~~   ~~~~~\n/opt/robo/src/robomongo/ssh/ssh.c:510:17: warning: Value stored to 'result' is never read\n                result = RBM_ERROR;\n                ^        ~~~~~~~~~\n/opt/robo/src/robomongo/ssh/ssh.c:730:5: warning: Value stored to 'fingerprint' is never read\n    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);\n    ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n7 warnings generated.\n[ 51%] Linking C static library libssh.a\n[ 51%] Built target ssh\nScanning dependencies of target robomongo_autogen\nScanning dependencies of target ssh_test\nScanning dependencies of target server\n[ 52%] Building C object src/robomongo/ssh/CMakeFiles/server.dir/server.c.o\n[ 52%] Automatic MOC, UIC and RCC for target robomongo\n[ 52%] Building C object src/robomongo/ssh/CMakeFiles/ssh_test.dir/test.c.o\n[ 52%] Linking C executable server\n[ 52%] Linking C executable ssh_test\n[ 52%] Built target server\n[ 52%] Built target ssh_test\n[ 52%] Built target robomongo_autogen\nScanning dependencies of target robomongo\n[ 52%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/app/main.cpp.o\n[ 52%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/utils/QtUtils.cpp.o\n[ 53%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/utils/StdUtils.cpp.o\n[ 54%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/HexUtils.cpp.o\n[ 54%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/utils/Logger.cpp.o\n[ 55%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/utils/BsonUtils.cpp.o\n[ 55%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/settings/CredentialSettings.cpp.o\n[ 55%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/settings/ConnectionSettings.cpp.o\n[ 55%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/Event.cpp.o\nIn file included from /opt/robo/src/robomongo/core/settings/CredentialSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/CredentialSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/settings/CredentialSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/CredentialSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\n[ 56%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/Enums.cpp.o\nIn file included from /opt/robo/src/robomongo/core/utils/QtUtils.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/utils/QtUtils.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/utils/QtUtils.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/utils/QtUtils.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\n[ 56%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/EventError.cpp.o\n[ 57%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/EventBusSubscriber.cpp.o\nIn file included from /opt/robo/src/robomongo/core/EventBusSubscriber.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/EventBusSubscriber.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/EventBusSubscriber.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/EventBusSubscriber.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 57%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/EventBusDispatcher.cpp.o\nIn file included from /opt/robo/src/robomongo/core/Event.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/Event.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/Event.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/Event.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 57%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/EventWrapper.cpp.o\n[ 58%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/EventBus.cpp.o\nIn file included from /opt/robo/src/robomongo/core/utils/Logger.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/utils/Logger.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/utils/Logger.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/utils/Logger.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 58%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/KeyboardManager.cpp.o\nIn file included from /opt/robo/src/robomongo/app/main.cpp:1:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QApplication:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qapplication.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/app/main.cpp:1:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QApplication:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qapplication.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/core/EventBusDispatcher.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/EventBusDispatcher.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/EventBusDispatcher.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/EventBusDispatcher.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 60%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoNamespace.cpp.o\n1 error generated.\n[ 60%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoFunction.cpp.o\nIn file included from /opt/robo/src/robomongo/core/EventWrapper.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/EventWrapper.h:3:\nIn file included from /opt/robo/src/robomongo/core/Event.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/settings/ConnectionSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/ConnectionSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/EventWrapper.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/EventWrapper.h:3:\nIn file included from /opt/robo/src/robomongo/core/Event.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/core/settings/ConnectionSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/ConnectionSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n[ 60%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoUtils.cpp.o\n1 error generated.\n[ 61%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoCollection.cpp.o\nIn file included from /opt/robo/src/robomongo/core/KeyboardManager.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/KeyboardManager.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/QKeyEvent:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/qevent.h:43:10: fatal error: 'QtGui/qtguiglobal.h' file not found\n#include <QtGui/qtguiglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/KeyboardManager.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/KeyboardManager.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/QKeyEvent:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/qevent.h:43:10: fatal error: 'QtGui/qtguiglobal.h' file not found\n#include <QtGui/qtguiglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 61%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoCollectionInfo.cpp.o\n[ 62%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoQueryInfo.cpp.o\n1 error generated.\n[ 62%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/CursorPosition.cpp.o\n[ 62%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/ScriptInfo.cpp.o\nIn file included from /opt/robo/src/robomongo/core/EventBus.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/EventBus.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/EventBus.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/EventBus.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/utils/BsonUtils.cpp:8:\nIn file included from /opt/robo/src/robomongo/core/utils/Logger.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 63%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/events/MongoEventsInfo.cpp.o\nIn file included from /opt/robo/src/robomongo/core/utils/BsonUtils.cpp:8:\nIn file included from /opt/robo/src/robomongo/core/utils/Logger.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 63%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/shell/db/ptimeutil.cpp.o\nIn file included from /opt/robo/src/robomongo/core/domain/ScriptInfo.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/ScriptInfo.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/ScriptInfo.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/ScriptInfo.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\n[ 64%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/shell/bson/json.cpp.o\nIn file included from /opt/robo/src/robomongo/core/domain/MongoUtils.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoUtils.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/MongoUtils.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoUtils.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\n[ 64%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/engine/ScriptEngine.cpp.o\nIn file included from /opt/robo/src/robomongo/core/domain/MongoCollection.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoCollection.h:3:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDatabase.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/MongoCollection.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoCollection.h:3:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDatabase.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n[ 64%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/events/MongoEvents.cpp.o\n[ 65%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoDocument.cpp.o\n1 error generated.\n[ 65%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/AppStyle.cpp.o\n[ 66%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoServer.cpp.o\n[ 66%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoShell.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/AppStyle.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/AppStyle.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QStyle:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qstyle.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/AppStyle.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/AppStyle.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QStyle:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qstyle.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 66%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/MongoDatabase.cpp.o\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDocument.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDocument.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QStringList:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstringlist.h:41:10: fatal error: 'QtCore/qlist.h' file not found\n#include <QtCore/qlist.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDocument.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDocument.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QStringList:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstringlist.h:41:10: fatal error: 'QtCore/qlist.h' file not found\n#include <QtCore/qlist.h>\n         ^~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/core/engine/ScriptEngine.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/engine/ScriptEngine.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/engine/ScriptEngine.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/engine/ScriptEngine.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 67%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/App.cpp.o\n1 error generated.\n[ 67%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/mongodb/MongoClient.cpp.o\nIn file included from /opt/robo/src/robomongo/core/events/MongoEvents.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/events/MongoEvents.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMessageBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmessagebox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/events/MongoEvents.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/events/MongoEvents.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMessageBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmessagebox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 68%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/mongodb/MongoWorker.cpp.o\nIn file included from /opt/robo/src/robomongo/core/domain/MongoShell.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoShell.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/MongoShell.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoShell.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/core/domain/MongoServer.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoServer.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/MongoServer.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoServer.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 68%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/mongodb/ReplicaSet.cpp.o\n1 error generated.\n[ 68%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/settings/SettingsManager.cpp.o\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDatabase.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDatabase.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDatabase.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDatabase.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 69%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/AppRegistry.cpp.o\n[ 69%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/utils/StringOperations.cpp.o\n[ 70%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/utils/common.cpp.o\nIn file included from /opt/robo/src/robomongo/core/domain/App.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/App.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/App.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/App.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 70%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/utils/SimpleCrypt.cpp.o\nIn file included from /opt/robo/src/robomongo/core/mongodb/MongoClient.cpp:5:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDocument.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QStringList:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstringlist.h:41:10: fatal error: 'QtCore/qlist.h' file not found\n#include <QtCore/qlist.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/mongodb/MongoClient.cpp:5:\nIn file included from /opt/robo/src/robomongo/core/domain/MongoDocument.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QStringList:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstringlist.h:41:10: fatal error: 'QtCore/qlist.h' file not found\n#include <QtCore/qlist.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\n[ 70%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/utils/RoboCrypt.cpp.o\nIn file included from /opt/robo/src/robomongo/core/settings/SettingsManager.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/SettingsManager.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/settings/SettingsManager.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/SettingsManager.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/utils/SimpleCrypt.cpp:27:\nIn file included from /opt/robo/src/robomongo/utils/SimpleCrypt.h:30:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/utils/SimpleCrypt.cpp:27:\nIn file included from /opt/robo/src/robomongo/utils/SimpleCrypt.h:30:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\n[ 71%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/GuiRegistry.cpp.o\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/AppRegistry.cpp:3:\nIn file included from /opt/robo/src/robomongo/core/EventBus.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 71%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/AboutDialog.cpp.o\nIn file included from /opt/robo/src/robomongo/core/AppRegistry.cpp:3:\nIn file included from /opt/robo/src/robomongo/core/EventBus.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/core/mongodb/MongoWorker.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/mongodb/MongoWorker.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/mongodb/MongoWorker.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/mongodb/MongoWorker.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 72%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/EulaDialog.cpp.o\n1 error generated.\n[ 72%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/ConnectionAdvancedTab.cpp.o\n[ 72%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/ConnectionAuthTab.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/AboutDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/AboutDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/AboutDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/AboutDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 73%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/ConnectionBasicTab.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/GuiRegistry.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/GuiRegistry.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/QIcon:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/qicon.h:43:10: fatal error: 'QtGui/qtguiglobal.h' file not found\n#include <QtGui/qtguiglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/GuiRegistry.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/GuiRegistry.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/QIcon:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtGui.framework/Headers/qicon.h:43:10: fatal error: 'QtGui/qtguiglobal.h' file not found\n#include <QtGui/qtguiglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 73%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/ConnectionDiagnosticDialog.cpp.o\nIn file included from /opt/robo/src/robomongo/utils/common.cpp:1:\nIn file included from /opt/robo/src/robomongo/utils/common.h:6:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/utils/common.cpp:1:\nIn file included from /opt/robo/src/robomongo/utils/common.h:6:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n[ 74%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/ConnectionDialog.cpp.o\n1 error generated.\n[ 74%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/CopyCollectionDialog.cpp.o\nIn file included from /opt/robo/src/robomongo/utils/RoboCrypt.cpp:1:\nIn file included from /opt/robo/src/robomongo/utils/RoboCrypt.h:1:\nIn file included from /opt/robo/src/robomongo/utils/SimpleCrypt.h:30:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/utils/RoboCrypt.cpp:1:\nIn file included from /opt/robo/src/robomongo/utils/RoboCrypt.h:1:\nIn file included from /opt/robo/src/robomongo/utils/SimpleCrypt.h:30:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\n[ 74%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/IndicatorLabel.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/IndicatorLabel.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/IndicatorLabel.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionAdvancedTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionAdvancedTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/EulaDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/EulaDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWizard:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwizard.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/IndicatorLabel.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/IndicatorLabel.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionAdvancedTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionAdvancedTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/dialogs/EulaDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/EulaDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWizard:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwizard.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n[ 75%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/CreateCollectionDialog.cpp.o\n1 error generated.\n1 error generated.\n[ 75%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/CreateDatabaseDialog.cpp.o\n[ 76%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/CreateUserDialog.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionAuthTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionAuthTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionAuthTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionAuthTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 76%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/utils/ComboBoxUtils.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionBasicTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionBasicTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionBasicTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionBasicTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionDiagnosticDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionDiagnosticDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionDiagnosticDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionDiagnosticDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateDatabaseDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n[ 76%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/utils/DialogUtils.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/utils/ComboBoxUtils.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/utils/ComboBoxUtils.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QComboBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qcombobox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/utils/ComboBoxUtils.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/utils/ComboBoxUtils.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QComboBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qcombobox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n1 error generated.\n[ 77%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/PreferencesDialog.cpp.o\n[ 77%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/ConnectionsDialog.cpp.o\n1 error generated.\n[ 78%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/ExportDialog.cpp.o\n1 error generated.\n[ 78%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/ChangeShellTimeoutDialog.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CopyCollectionDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CopyCollectionDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CopyCollectionDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CopyCollectionDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 78%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/editors/PlainJavaScriptEditor.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/utils/DialogUtils.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/utils/DialogUtils.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMessageBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmessagebox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/utils/DialogUtils.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/utils/DialogUtils.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMessageBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmessagebox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 80%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/editors/JSLexer.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateUserDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateUserDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/PreferencesDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/PreferencesDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateUserDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateUserDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/dialogs/PreferencesDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/PreferencesDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 80%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/editors/FindFrame.cpp.o\n1 error generated.\n[ 81%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/AddEditIndexDialog.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/editors/JSLexer.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/editors/JSLexer.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/editors/JSLexer.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/editors/JSLexer.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 81%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/ScriptWidget.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/editors/PlainJavaScriptEditor.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/editors/PlainJavaScriptEditor.h:3:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciscintilla.h:36:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/editors/PlainJavaScriptEditor.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/editors/PlainJavaScriptEditor.h:3:\nIn file included from /opt/robo/src/third-party/qscintilla-2.8.4/sources/Qt4Qt5/Qsci/qsciscintilla.h:36:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 82%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerCollectionTreeItem.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateCollectionDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateCollectionDialog.h:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateCollectionDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/CreateCollectionDialog.h:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 82%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerCollectionIndexesDir.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ChangeShellTimeoutDialog.cpp:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ChangeShellTimeoutDialog.cpp:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionsDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionsDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionsDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ConnectionsDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ExportDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ExportDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ExportDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/ExportDialog.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 82%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerCollectionIndexItem.cpp.o\n1 error generated.\n[ 83%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerTreeItem.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/editors/FindFrame.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/editors/FindFrame.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QFrame:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qframe.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/editors/FindFrame.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/editors/FindFrame.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QFrame:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qframe.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 83%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerReplicaSetFolderItem.cpp.o\n1 error generated.\n[ 84%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerReplicaSetTreeItem.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/AddEditIndexDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/AddEditIndexDialog.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/AddEditIndexDialog.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/AddEditIndexDialog.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 84%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerDatabaseTreeItem.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/ScriptWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/ScriptWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QFrame:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qframe.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/ScriptWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/ScriptWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QFrame:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qframe.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 84%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/core/Event.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/core/Event.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n[ 85%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerUserTreeItem.cpp.o\n1 error generated.\n[ 85%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerFunctionTreeItem.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.h:3:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexesDir.h:3:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 86%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/DocumentTextEditor.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexItem.h:4:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetFolderItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetFolderItem.h:3:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetFolderItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetFolderItem.h:3:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerCollectionIndexItem.h:4:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/core/events/MongoEvents.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMessageBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmessagebox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerReplicaSetTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/core/events/MongoEvents.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMessageBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmessagebox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 86%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/FunctionTextEditor.cpp.o\n1 error generated.\n[ 86%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerServerTreeItem.cpp.o\n1 error generated.\n[ 87%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerTreeWidget.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerDatabaseCategoryTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n1 error generated.\n[ 87%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/explorer/ExplorerWidget.cpp.o\n[ 88%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/BsonTableModel.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerUserTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerUserTreeItem.h:4:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerFunctionTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerFunctionTreeItem.h:4:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerUserTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerUserTreeItem.h:4:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 88%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/BsonTableView.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerFunctionTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerFunctionTreeItem.h:4:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeItem.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 88%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/BsonTreeItem.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/DocumentTextEditor.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/DocumentTextEditor.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/DocumentTextEditor.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/DocumentTextEditor.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 89%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/BsonTreeModel.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/dialogs/FunctionTextEditor.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/FunctionTextEditor.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/FunctionTextEditor.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/FunctionTextEditor.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QDialog:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qdialog.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 89%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/BsonTreeView.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerTreeWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerServerTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerServerTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/core/events/MongoEvents.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMessageBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmessagebox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerServerTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerServerTreeItem.h:3:\nIn file included from /opt/robo/src/robomongo/core/events/MongoEvents.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMessageBox:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmessagebox.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableModel.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableModel.h:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QAbstractProxyModel:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qabstractproxymodel.h:43:10: fatal error: 'QtCore/qabstractitemmodel.h' file not found\n#include <QtCore/qabstractitemmodel.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableModel.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableModel.h:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QAbstractProxyModel:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qabstractproxymodel.h:43:10: fatal error: 'QtCore/qabstractitemmodel.h' file not found\n#include <QtCore/qabstractitemmodel.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 90%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/domain/Notifier.cpp.o\n1 error generated.\n1 error generated.\n[ 90%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/CollectionStatsTreeItem.cpp.o\n[ 90%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/CollectionStatsTreeWidget.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableView.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableView.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTableView:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtableview.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableView.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTableView.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTableView:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtableview.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 91%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/JsonPrepareThread.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/explorer/ExplorerWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeItem.h:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeItem.h:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n1 error generated.\n[ 91%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/OutputItemContentWidget.cpp.o\n[ 92%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/OutputItemHeaderWidget.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 92%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/OutputWidget.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeView:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreeview.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeView.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeView:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreeview.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 92%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/PagingWidget.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeModel.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeModel.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QAbstractItemModel:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qabstractitemmodel.h:43:10: fatal error: 'QtCore/qvariant.h' file not found\n#include <QtCore/qvariant.h>\n         ^~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeModel.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/BsonTreeModel.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QAbstractItemModel:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qabstractitemmodel.h:43:10: fatal error: 'QtCore/qvariant.h' file not found\n#include <QtCore/qvariant.h>\n         ^~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 93%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/ProgressBarPopup.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeItem.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeItem.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/CollectionStatsTreeItem.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTreeWidgetItem:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtreewidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 93%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/QueryWidget.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/JsonPrepareThread.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/JsonPrepareThread.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QThread:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qthread.h:44:10: fatal error: 'QtCore/qobject.h' file not found\n#include <QtCore/qobject.h>\n         ^~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/JsonPrepareThread.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/JsonPrepareThread.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QThread:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qthread.h:44:10: fatal error: 'QtCore/qobject.h' file not found\n#include <QtCore/qobject.h>\n         ^~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/PagingWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/PagingWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/PagingWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/PagingWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/ProgressBarPopup.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/ProgressBarPopup.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QFrame:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qframe.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/ProgressBarPopup.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/ProgressBarPopup.h:2:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QFrame:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qframe.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 94%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/WorkAreaTabBar.cpp.o\n1 error generated.\n[ 94%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/WorkAreaTabWidget.cpp.o\n1 error generated.\n[ 94%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/workarea/WelcomeTab.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemHeaderWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemHeaderWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemHeaderWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemHeaderWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabBar.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabBar.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTabBar:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtabbar.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabBar.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabBar.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTabBar:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtabbar.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 95%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/widgets/LogWidget.cpp.o\n1 error generated.\n[ 95%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/MainWindow.cpp.o\nIn file included from /opt/robo/src/robomongo/core/domain/Notifier.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/Notifier.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QModelIndex:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qabstractitemmodel.h:43:10: fatal error: 'QtCore/qvariant.h' file not found\n#include <QtCore/qvariant.h>\n         ^~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTabWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtabwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/domain/Notifier.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/domain/Notifier.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QModelIndex:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qabstractitemmodel.h:43:10: fatal error: 'QtCore/qvariant.h' file not found\n#include <QtCore/qvariant.h>\n         ^~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTabWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtabwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemContentWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemContentWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QStackedWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qstackedwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemContentWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/OutputItemContentWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QStackedWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qstackedwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 96%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/SSHTunnelTab.cpp.o\n1 error generated.\n[ 96%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/gui/dialogs/SSLTab.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/LogWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/LogWidget.h:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/LogWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/LogWidget.h:4:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 96%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/settings/SshSettings.cpp.o\n1 error generated.\n[ 97%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/settings/SslSettings.cpp.o\nIn file included from /opt/robo/src/robomongo/core/settings/SshSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/SshSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/settings/SshSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/SshSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/settings/SslSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/SslSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/settings/SslSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/SslSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n[ 97%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/settings/ReplicaSetSettings.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/QueryWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/QueryWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTabWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtabwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/QueryWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/QueryWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabWidget.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WorkAreaTabWidget.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QTabWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qtabwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n[ 98%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/core/mongodb/SshTunnelWorker.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WelcomeTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WelcomeTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WelcomeTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/widgets/workarea/WelcomeTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\n1 error generated.\n[ 98%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/robomongo_autogen/mocs_compilation.cpp.o\n[ 98%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/robomongo_autogen/3YJK5W5UP7/qrc_robo.cpp.o\n1 error generated.\n[100%] Building CXX object src/robomongo/CMakeFiles/robomongo.dir/robomongo_autogen/YHP5W5E6RA/qrc_gui.cpp.o\nIn file included from /opt/robo/src/robomongo/gui/MainWindow.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/MainWindow.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMainWindow:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmainwindow.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/MainWindow.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/MainWindow.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QMainWindow:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qmainwindow.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/SSHTunnelTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/SSHTunnelTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/SSHTunnelTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/SSHTunnelTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/SSLTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/SSLTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/gui/dialogs/SSLTab.cpp:1:\nIn file included from /opt/robo/src/robomongo/gui/dialogs/SSLTab.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:43:10: fatal error: 'QtWidgets/qtwidgetsglobal.h' file not found\n#include <QtWidgets/qtwidgetsglobal.h>\n         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/settings/ReplicaSetSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/ReplicaSetSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/settings/ReplicaSetSettings.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/settings/ReplicaSetSettings.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QString:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qstring.h:48:10: fatal error: 'QtCore/qchar.h' file not found\n#include <QtCore/qchar.h>\n         ^~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/mongodb/SshTunnelWorker.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/mongodb/SshTunnelWorker.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~~~~~~~~\n1 error generated.\nIn file included from /opt/robo/src/robomongo/core/mongodb/SshTunnelWorker.cpp:1:\nIn file included from /opt/robo/src/robomongo/core/mongodb/SshTunnelWorker.h:3:\nIn file included from /opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/QObject:1:\n/opt/Qt5.12.8/5.12.8/clang_64/lib/QtCore.framework/Headers/qobject.h:46:10: fatal error: 'QtCore/qobjectdefs.h' file not found\n#include <QtCore/qobjectdefs.h>\n         ^~~~~~~~~~~~~~~\n1 error generated.\n[100%] Linking CXX executable \"Robo 3T.app/Contents/MacOS/Robo 3T\"\nld: warning: option -noall_load is obsolete and being ignored\n[100%] Built target robomongo\nscan-build: 23 bugs found.\nscan-build: Run 'scan-view /var/folders/38/3l23x7_52t991w22sk9639h00000gn/T/scan-build-2020-08-22-121013-93295-1' to examine bug reports.\nscan-build: The analyzer encountered problems on some source files.\nscan-build: Preprocessed versions of these sources were deposited in '/var/folders/38/3l23x7_52t991w22sk9639h00000gn/T/scan-build-2020-08-22-121013-93295-1/failures'.\nscan-build: Please consider submitting a bug report using these files:\nscan-build:   http://clang-analyzer.llvm.org/filing_bugs.html\ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ \ngman-mac:bin gsimsek$ scan-view /var/folders/38/3l23x7_52t991w22sk9639h00000gn/T/scan-build-2020-08-22-121013-93295-1\n/usr/local/opt/llvm/bin/scan-view:9: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses\n  import imp\nStarting scan-view at: http://127.0.0.1:8181\n  Use Ctrl-C to exit.\n\n"
  },
  {
    "path": "static_analysis/vs_run-code-analysis_nat-rec_dbg.txt",
    "content": "Microsoft (R) Build Engine version 15.9.21+g9802d43bc3 for .NET Framework\nCopyright (C) Microsoft Corporation. All rights reserved.\n\nBuild started 19-Aug-20 15:31:25.\nProject \"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" on node 1 (default targets).\nProject \"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Debug\\ZERO_CHECK.vcxproj\" (2) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"x64\\Debug\\ZERO_CHECK\\\".\n  Creating directory \"x64\\Debug\\ZERO_CHECK\\ZERO_CHECK.tlog\\\".\nInitializeBuildStatus:\n  Creating \"x64\\Debug\\ZERO_CHECK\\ZERO_CHECK.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Checking Build System\n  CMake does not need to re-run because E:/robo/build/Debug/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Debug/src/third-party/libssh2-1.9.0/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Debug/src/robomongo/ssh/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Debug/src/third-party/qjson-0.8.1/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Debug/src/third-party/qscintilla-2.8.4/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Debug/src/third-party/googletest-1.8.1/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Debug/src/third-party/googletest-1.8.1/googlemock/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Debug/src/third-party/googletest-1.8.1/googlemock/gtest/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Debug/src/robomongo/CMakeFiles/generate.stamp is up-to-date.\nFinalizeBuildStatus:\n  Deleting file \"x64\\Debug\\ZERO_CHECK\\ZERO_CHECK.tlog\\unsuccessfulbuild\".\n  Touching \"x64\\Debug\\ZERO_CHECK\\ZERO_CHECK.tlog\\ZERO_CHECK.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Debug\\ZERO_CHECK.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj\" (3) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"gmock.dir\\Debug\\\".\n  Creating directory \"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\Debug\\\".\n  Creating directory \"gmock.dir\\Debug\\gmock.tlog\\\".\nInitializeBuildStatus:\n  Creating \"gmock.dir\\Debug\\gmock.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/googletest-1.8.1/googlemock/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Debug/src/third-party/googletest-1.8.1/googlemock/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\" /Zi /nologo /W4 /WX /diagnostics:classic /MP /Od /Ob0 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D STRICT /D WIN32_LEAN_AND_MEAN /D GTEST_HAS_PTHREAD=0 /D _HAS_EXCEPTIONS=1 /D \"CMAKE_INTDIR=\\\"Debug\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"gmock.dir\\Debug\\\\\" /Fd\"gmock.dir\\Debug\\gmock.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4251 /wd4275 /wd4702 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  -J /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-all.cc\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\src\\gmock-all.cc\"\n  gtest-all.cc\n  gmock-all.cc\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\Debug\\gmockd.lib\" /NOLOGO /MACHINE:X64  /machine:x64 \"gmock.dir\\Debug\\gtest-all.obj\"\n  \"gmock.dir\\Debug\\gmock-all.obj\"\n  gmock.vcxproj -> E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\Debug\\gmockd.lib\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::link_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2258): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2254): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2252): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2250): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"gmock.dir\\Debug\\gmock.tlog\\unsuccessfulbuild\".\n  Touching \"gmock.dir\\Debug\\gmock.tlog\\gmock.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj\" (4) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"gmock_main.dir\\Debug\\\".\n  Creating directory \"gmock_main.dir\\Debug\\gmock_main.tlog\\\".\nInitializeBuildStatus:\n  Creating \"gmock_main.dir\\Debug\\gmock_main.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/googletest-1.8.1/googlemock/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Debug/src/third-party/googletest-1.8.1/googlemock/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\" /Zi /nologo /W4 /WX /diagnostics:classic /MP /Od /Ob0 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D STRICT /D WIN32_LEAN_AND_MEAN /D GTEST_HAS_PTHREAD=0 /D _HAS_EXCEPTIONS=1 /D \"CMAKE_INTDIR=\\\"Debug\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"gmock_main.dir\\Debug\\\\\" /Fd\"gmock_main.dir\\Debug\\gmock_main.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4251 /wd4275 /wd4702 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  -J /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-all.cc\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\src\\gmock-all.cc\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\src\\gmock_main.cc\"\n  gtest-all.cc\n  gmock-all.cc\n  gmock_main.cc\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\Debug\\gmock_maind.lib\" /NOLOGO /MACHINE:X64  /machine:x64 \"gmock_main.dir\\Debug\\gtest-all.obj\"\n  \"gmock_main.dir\\Debug\\gmock-all.obj\"\n  gmock_main.dir\\Debug\\gmock_main.obj\n  gmock_main.vcxproj -> E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\Debug\\gmock_maind.lib\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::link_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2258): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2254): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2252): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2250): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"gmock_main.dir\\Debug\\gmock_main.tlog\\unsuccessfulbuild\".\n  Touching \"gmock_main.dir\\Debug\\gmock_main.tlog\\gmock_main.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj\" (5) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"gtest.dir\\Debug\\\".\n  Creating directory \"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\Debug\\\".\n  Creating directory \"gtest.dir\\Debug\\gtest.tlog\\\".\nInitializeBuildStatus:\n  Creating \"gtest.dir\\Debug\\gtest.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/googletest-1.8.1/googletest/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Debug/src/third-party/googletest-1.8.1/googlemock/gtest/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\" /Zi /nologo /W4 /WX /diagnostics:classic /MP /Od /Ob0 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D STRICT /D WIN32_LEAN_AND_MEAN /D GTEST_HAS_PTHREAD=0 /D _HAS_EXCEPTIONS=1 /D \"CMAKE_INTDIR=\\\"Debug\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"gtest.dir\\Debug\\\\\" /Fd\"gtest.dir\\Debug\\gtest.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4251 /wd4275 /wd4702 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  -J /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-all.cc\"\n  gtest-all.cc\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\Debug\\gtestd.lib\" /NOLOGO /MACHINE:X64  /machine:x64 \"gtest.dir\\Debug\\gtest-all.obj\"\n  gtest.vcxproj -> E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\Debug\\gtestd.lib\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::link_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"gtest.dir\\Debug\\gtest.tlog\\unsuccessfulbuild\".\n  Touching \"gtest.dir\\Debug\\gtest.tlog\\gtest.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj\" (6) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"gtest_main.dir\\Debug\\\".\n  Creating directory \"gtest_main.dir\\Debug\\gtest_main.tlog\\\".\nInitializeBuildStatus:\n  Creating \"gtest_main.dir\\Debug\\gtest_main.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/googletest-1.8.1/googletest/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Debug/src/third-party/googletest-1.8.1/googlemock/gtest/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\" /Zi /nologo /W4 /WX /diagnostics:classic /MP /Od /Ob0 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D STRICT /D WIN32_LEAN_AND_MEAN /D GTEST_HAS_PTHREAD=0 /D _HAS_EXCEPTIONS=1 /D \"CMAKE_INTDIR=\\\"Debug\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"gtest_main.dir\\Debug\\\\\" /Fd\"gtest_main.dir\\Debug\\gtest_main.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4251 /wd4275 /wd4702 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  -J /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest_main.cc\"\n  gtest_main.cc\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\Debug\\gtest_maind.lib\" /NOLOGO /MACHINE:X64  /machine:x64 gtest_main.dir\\Debug\\gtest_main.obj\n  gtest_main.vcxproj -> E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\Debug\\gtest_maind.lib\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::link_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::link_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"gtest_main.dir\\Debug\\gtest_main.tlog\\unsuccessfulbuild\".\n  Touching \"gtest_main.dir\\Debug\\gtest_main.tlog\\gtest_main.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj\" (7) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"libssh2.dir\\Debug\\\".\n  Creating directory \"E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\Debug\\\".\n  Creating directory \"libssh2.dir\\Debug\\libssh2.tlog\\\".\nInitializeBuildStatus:\n  Creating \"libssh2.dir\\Debug\\libssh2.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/libssh2-1.9.0/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Debug/src/third-party/libssh2-1.9.0/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\" /I\"E:\\openssl-1.1.1f\\include\" /Zi /nologo /W3 /WX- /diagnostics:classic /MP /Od /Ob0 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D LIBSSH2_OPENSSL /D LIBSSH2DEBUG /D LIBSSH2_WIN32 /D \"CMAKE_INTDIR=\\\"Debug\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo\"libssh2.dir\\Debug\\\\\" /Fd\"libssh2.dir\\Debug\\libssh2.pdb\" /Gd /TC /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4133 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\bcrypt_pbkdf.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\blowfish.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\comp.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\crypt.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\global.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\hostkey.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\keepalive.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\knownhost.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\mac.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\misc.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\pem.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\publickey.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\scp.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\version.c\"\n  openssl.c\n  agent.c\n  bcrypt_pbkdf.c\n  blowfish.c\n  channel.c\n  comp.c\n  crypt.c\n  global.c\n  hostkey.c\n  keepalive.c\n  kex.c\n  knownhost.c\n  mac.c\n  misc.c\n  packet.c\n  pem.c\n  publickey.c\n  scp.c\n  session.c\n  sftp.c\n  transport.c\n  userauth.c\n  version.c\nResourceCompile:\n  C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.18362.0\\x86\\rc.exe /D WIN32 /D _DEBUG /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D LIBSSH2_OPENSSL /D LIBSSH2DEBUG /D LIBSSH2_WIN32 /D \"CMAKE_INTDIR=\\\\\\\"Debug\\\\\\\"\" /D _UNICODE /D UNICODE /l\"0x0409\" /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /fo\"libssh2.dir\\Debug\\libssh2.res\" E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\win32\\libssh2.rc \nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\Debug\\libssh2.lib\" /NOLOGO /MACHINE:X64  /machine:x64 libssh2.dir\\Debug\\libssh2.res\n  libssh2.dir\\Debug\\openssl.obj\n  libssh2.dir\\Debug\\agent.obj\n  libssh2.dir\\Debug\\bcrypt_pbkdf.obj\n  libssh2.dir\\Debug\\blowfish.obj\n  libssh2.dir\\Debug\\channel.obj\n  libssh2.dir\\Debug\\comp.obj\n  libssh2.dir\\Debug\\crypt.obj\n  libssh2.dir\\Debug\\global.obj\n  libssh2.dir\\Debug\\hostkey.obj\n  libssh2.dir\\Debug\\keepalive.obj\n  libssh2.dir\\Debug\\kex.obj\n  libssh2.dir\\Debug\\knownhost.obj\n  libssh2.dir\\Debug\\mac.obj\n  libssh2.dir\\Debug\\misc.obj\n  libssh2.dir\\Debug\\packet.obj\n  libssh2.dir\\Debug\\pem.obj\n  libssh2.dir\\Debug\\publickey.obj\n  libssh2.dir\\Debug\\scp.obj\n  libssh2.dir\\Debug\\session.obj\n  libssh2.dir\\Debug\\sftp.obj\n  libssh2.dir\\Debug\\transport.obj\n  libssh2.dir\\Debug\\userauth.obj\n  libssh2.dir\\Debug\\version.obj\n  libssh2.vcxproj -> E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\Debug\\libssh2.lib\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1913): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1914): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1950): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1950): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(277): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(277): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(300): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(300): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\bcrypt_pbkdf.c(119): warning C6260: sizeof * sizeof is usually wrong.  Did you intend to use a character count or a byte count? [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(150): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(555): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(814): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(814): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(947): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(947): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(1843): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(166): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(400): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(596): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(605): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(648): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(657): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(698): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(726): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(857): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1090): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1289): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1297): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1339): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1347): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1387): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1414): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2202): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2326): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2334): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2376): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2384): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2424): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2451): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2835): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2935): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2943): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2985): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2993): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(3033): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(3060): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(4269): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(4274): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\misc.c(282): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\misc.c(481): warning C6386: Buffer overrun while writing to 'buffer+msglen':  the writable size is '1536' bytes, but '1537' bytes might be written. [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(155): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(169): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(311): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(322): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(785): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(830): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(582): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\pem.c(150): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\pem.c(535): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\publickey.c(959): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(176): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(217): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(1142): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(1142): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(876): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3241): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3241): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3346): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3448): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3448): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3586): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3586): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(90): warning C6386: Buffer overrun while writing to 'buffer':  the writable size is '256' bytes, but 'used++' bytes might be written. [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(370): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(457): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(487): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(488): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(79): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(231): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(373): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(373): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1168): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1283): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1665): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1663): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1662): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1662): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1661): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1661): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1659): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1990): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\nCopyFilesToOutputDirectory:\n  Copying file from \"libssh2.dir\\Debug\\libssh2.pdb\" to \"E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\Debug\\libssh2.pdb\".\nFinalizeBuildStatus:\n  Deleting file \"libssh2.dir\\Debug\\libssh2.tlog\\unsuccessfulbuild\".\n  Touching \"libssh2.dir\\Debug\\libssh2.tlog\\libssh2.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj\" (8) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"qjson.dir\\Debug\\\".\n  Creating directory \"E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\Debug\\\".\n  Creating directory \"qjson.dir\\Debug\\qjson.tlog\\\".\nInitializeBuildStatus:\n  Creating \"qjson.dir\\Debug\\qjson.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nPreBuildEvent:\n  Automatic MOC, UIC and RCC for target qjson\n  setlocal\n  cd E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\n  if %errorlevel% neq 0 goto :cmEnd\n  E:\n  if %errorlevel% neq 0 goto :cmEnd\n  \"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E cmake_autogen E:/robo/build/Debug/src/third-party/qjson-0.8.1/CMakeFiles/qjson_autogen.dir Debug\n  if %errorlevel% neq 0 goto :cmEnd\n  :cmEnd\n  endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone\n  :cmErrorLevel\n  exit /b %1\n  :cmDone\n  if %errorlevel% neq 0 goto :VCEnd\n  :VCEnd\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/qjson-0.8.1/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Debug/src/third-party/qjson-0.8.1/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson_autogen\\include_Debug\" /I\"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtCore /I\"E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\.\\mkspecs\\win32-msvc\" /Zi /nologo /W3 /WX- /diagnostics:classic /MP /Od /Ob0 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D QJSON_STATIC /D QT_CORE_LIB /D \"CMAKE_INTDIR=\\\"Debug\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"qjson.dir\\Debug\\\\\" /Fd\"qjson.dir\\Debug\\qjson.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4065 /wd5033 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\parser.cpp\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\qobjecthelper.cpp\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\json_scanner.cpp\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\json_parser.cc\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\parserrunnable.cpp\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\serializer.cpp\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\serializerrunnable.cpp\" \"E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson_autogen\\mocs_compilation.cpp\"\n  parser.cpp\n  qobjecthelper.cpp\n  json_scanner.cpp\n  json_parser.cc\n  parserrunnable.cpp\n  serializer.cpp\n  serializerrunnable.cpp\n  mocs_compilation.cpp\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\Debug\\qjson.lib\" /NOLOGO /MACHINE:X64  /machine:x64 qjson.dir\\Debug\\parser.obj\n  qjson.dir\\Debug\\qobjecthelper.obj\n  qjson.dir\\Debug\\json_scanner.obj\n  qjson.dir\\Debug\\json_parser.obj\n  qjson.dir\\Debug\\parserrunnable.obj\n  qjson.dir\\Debug\\serializer.obj\n  qjson.dir\\Debug\\serializerrunnable.obj\n  qjson.dir\\Debug\\mocs_compilation.obj\n  qjson.vcxproj -> E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\Debug\\qjson.lib\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::strongref' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\parser.cpp(33): warning C26495: Variable 'QJson::ParserPrivate::m_errorLine' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_size' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\qobjecthelper.h(130): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(3799): warning C26495: Variable 'yyFlexLexer::yy_hold_char' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\flexlexer.h(99): warning C26495: Variable 'FlexLexer::yy_flex_debug' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4008): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4010): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4010): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4089): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4223): warning C6011: Dereferencing NULL pointer 'yy_buffer_stack'.  [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4256): warning C6011: Dereferencing NULL pointer 'b'.  [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4314): warning C6011: Dereferencing NULL pointer 'b'. See line 4302 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4370): warning C6011: Dereferencing NULL pointer 'yy_buffer_stack'.  [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\json_scanner.cpp(35): warning C26495: Variable 'JSonScanner::m_yylval' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(491): warning C6011: Dereferencing NULL pointer 'd'.  [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(535): warning C26498: The function 'qMetaTypeId<QMap<QString,QVariant> * __ptr64>' is constexpr, mark variable 'type' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\nCopyFilesToOutputDirectory:\n  Copying file from \"qjson.dir\\Debug\\qjson.pdb\" to \"E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\Debug\\qjson.pdb\".\nFinalizeBuildStatus:\n  Deleting file \"qjson.dir\\Debug\\qjson.tlog\\unsuccessfulbuild\".\n  Touching \"qjson.dir\\Debug\\qjson.tlog\\qjson.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj\" (9) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"qscintilla.dir\\Debug\\\".\n  Creating directory \"E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\Debug\\\".\n  Creating directory \"qscintilla.dir\\Debug\\qscintilla.tlog\\\".\nInitializeBuildStatus:\n  Creating \"qscintilla.dir\\Debug\\qscintilla.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nPreBuildEvent:\n  Automatic MOC, UIC and RCC for target qscintilla\n  setlocal\n  cd E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\n  if %errorlevel% neq 0 goto :cmEnd\n  E:\n  if %errorlevel% neq 0 goto :cmEnd\n  \"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E cmake_autogen E:/robo/build/Debug/src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla_autogen.dir Debug\n  if %errorlevel% neq 0 goto :cmEnd\n  :cmEnd\n  endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone\n  :cmErrorLevel\n  exit /b %1\n  :cmDone\n  if %errorlevel% neq 0 goto :VCEnd\n  :VCEnd\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/qscintilla-2.8.4/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Debug/src/third-party/qscintilla-2.8.4/CMakeFiles/generate.stamp is up-to-date.\n  Generating sources/Qt4Qt5/Qsci/moc_qsciabstractapis.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qsciapis.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qscilexer.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qscilexercpp.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qscilexerjavascript.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qscimacro.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qsciscintilla.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qsciscintillabase.cpp\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla_autogen\\include_Debug\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\include\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtWidgets /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtGui /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtANGLE /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtCore /I\"E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\.\\mkspecs\\win32-msvc\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtPrintSupport /Zi /nologo /W3 /WX- /diagnostics:classic /MP /Od /Ob0 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D SCINTILLA_QT /D SCI_LEXER /D QT_WIDGETS_LIB /D QT_GUI_LIB /D QT_CORE_LIB /D QT_PRINTSUPPORT_LIB /D \"CMAKE_INTDIR=\\\"Debug\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"qscintilla.dir\\Debug\\\\\" /Fd\"qscintilla.dir\\Debug\\qscintilla.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4554 /wd4099 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qsciabstractapis.cpp\" \"E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qsciapis.cpp\" \"E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qscilexer.cpp\" \"E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qscilexercpp.cpp\" \"E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qscilexerjavascript.cpp\" \"E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qscimacro.cpp\" \"E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qsciscintilla.cpp\" \"E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qsciscintillabase.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\StyleContext.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\WordList.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\Accessor.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\LexerBase.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\LexerModule.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\CharacterSet.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\CharacterCategory.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\PropSetSimple.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\LexerSimple.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\LexerNoExceptions.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscilexer.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscilexerjavascript.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscilexercpp.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscistyle.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\InputMethod.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qsciabstractapis.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\ScintillaQt.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscidocument.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qsciscintilla.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qsciscintillabase.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscicommand.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\ListBoxQt.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscistyledtext.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\SciClasses.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qsciprinter.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\PlatQt.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\MacPasteboardMime.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscimacro.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qsciapis.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscicommandset.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexers\\LexCPP.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\AutoComplete.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\CallTip.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\CaseConvert.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\CaseFolder.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Catalogue.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\CellBuffer.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\CharClassify.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\ContractionState.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Decoration.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Document.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Editor.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\ExternalLexer.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Indicator.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\KeyMap.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\LineMarker.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\PerLine.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\PositionCache.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\RESearch.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\RunStyles.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\ScintillaBase.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Selection.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Style.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\UniConversion.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\ViewStyle.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\XPM.cpp\" \"E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla_autogen\\mocs_compilation.cpp\"\n  moc_qsciabstractapis.cpp\n  moc_qsciapis.cpp\n  moc_qscilexer.cpp\n  moc_qscilexercpp.cpp\n  moc_qscilexerjavascript.cpp\n  moc_qscimacro.cpp\n  moc_qsciscintilla.cpp\n  moc_qsciscintillabase.cpp\n  StyleContext.cpp\n  WordList.cpp\n  Accessor.cpp\n  LexerBase.cpp\n  LexerModule.cpp\n  CharacterSet.cpp\n  CharacterCategory.cpp\n  PropSetSimple.cpp\n  LexerSimple.cpp\n  LexerNoExceptions.cpp\n  qscilexer.cpp\n  qscilexerjavascript.cpp\n  qscilexercpp.cpp\n  qscistyle.cpp\n  InputMethod.cpp\n  qsciabstractapis.cpp\n  ScintillaQt.cpp\n  qscidocument.cpp\n  qsciscintilla.cpp\n  qsciscintillabase.cpp\n  qscicommand.cpp\n  ListBoxQt.cpp\n  qscistyledtext.cpp\n  SciClasses.cpp\n  qsciprinter.cpp\n  PlatQt.cpp\n  MacPasteboardMime.cpp\n  qscimacro.cpp\n  qsciapis.cpp\n  qscicommandset.cpp\n  LexCPP.cpp\n  AutoComplete.cpp\n  CallTip.cpp\n  CaseConvert.cpp\n  CaseFolder.cpp\n  Catalogue.cpp\n  CellBuffer.cpp\n  CharClassify.cpp\n  ContractionState.cpp\n  Decoration.cpp\n  Document.cpp\n  Editor.cpp\n  ExternalLexer.cpp\n  Indicator.cpp\n  KeyMap.cpp\n  LineMarker.cpp\n  PerLine.cpp\n  PositionCache.cpp\n  RESearch.cpp\n  RunStyles.cpp\n  ScintillaBase.cpp\n  Selection.cpp\n  Style.cpp\n  UniConversion.cpp\n  ViewStyle.cpp\n  XPM.cpp\n  mocs_compilation.cpp\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\Debug\\qscintilla.lib\" /NOLOGO /MACHINE:X64  /machine:x64 /IGNORE:4221 qscintilla.dir\\Debug\\moc_qsciabstractapis.obj\n  qscintilla.dir\\Debug\\moc_qsciapis.obj\n  qscintilla.dir\\Debug\\moc_qscilexer.obj\n  qscintilla.dir\\Debug\\moc_qscilexercpp.obj\n  qscintilla.dir\\Debug\\moc_qscilexerjavascript.obj\n  qscintilla.dir\\Debug\\moc_qscimacro.obj\n  qscintilla.dir\\Debug\\moc_qsciscintilla.obj\n  qscintilla.dir\\Debug\\moc_qsciscintillabase.obj\n  qscintilla.dir\\Debug\\StyleContext.obj\n  qscintilla.dir\\Debug\\WordList.obj\n  qscintilla.dir\\Debug\\Accessor.obj\n  qscintilla.dir\\Debug\\LexerBase.obj\n  qscintilla.dir\\Debug\\LexerModule.obj\n  qscintilla.dir\\Debug\\CharacterSet.obj\n  qscintilla.dir\\Debug\\CharacterCategory.obj\n  qscintilla.dir\\Debug\\PropSetSimple.obj\n  qscintilla.dir\\Debug\\LexerSimple.obj\n  qscintilla.dir\\Debug\\LexerNoExceptions.obj\n  qscintilla.dir\\Debug\\qscilexer.obj\n  qscintilla.dir\\Debug\\qscilexerjavascript.obj\n  qscintilla.dir\\Debug\\qscilexercpp.obj\n  qscintilla.dir\\Debug\\qscistyle.obj\n  qscintilla.dir\\Debug\\InputMethod.obj\n  qscintilla.dir\\Debug\\qsciabstractapis.obj\n  qscintilla.dir\\Debug\\ScintillaQt.obj\n  qscintilla.dir\\Debug\\qscidocument.obj\n  qscintilla.dir\\Debug\\qsciscintilla.obj\n  qscintilla.dir\\Debug\\qsciscintillabase.obj\n  qscintilla.dir\\Debug\\qscicommand.obj\n  qscintilla.dir\\Debug\\ListBoxQt.obj\n  qscintilla.dir\\Debug\\qscistyledtext.obj\n  qscintilla.dir\\Debug\\SciClasses.obj\n  qscintilla.dir\\Debug\\qsciprinter.obj\n  qscintilla.dir\\Debug\\PlatQt.obj\n  qscintilla.dir\\Debug\\MacPasteboardMime.obj\n  qscintilla.dir\\Debug\\qscimacro.obj\n  qscintilla.dir\\Debug\\qsciapis.obj\n  qscintilla.dir\\Debug\\qscicommandset.obj\n  qscintilla.dir\\Debug\\LexCPP.obj\n  qscintilla.dir\\Debug\\AutoComplete.obj\n  qscintilla.dir\\Debug\\CallTip.obj\n  qscintilla.dir\\Debug\\CaseConvert.obj\n  qscintilla.dir\\Debug\\CaseFolder.obj\n  qscintilla.dir\\Debug\\Catalogue.obj\n  qscintilla.dir\\Debug\\CellBuffer.obj\n  qscintilla.dir\\Debug\\CharClassify.obj\n  qscintilla.dir\\Debug\\ContractionState.obj\n  qscintilla.dir\\Debug\\Decoration.obj\n  qscintilla.dir\\Debug\\Document.obj\n  qscintilla.dir\\Debug\\Editor.obj\n  qscintilla.dir\\Debug\\ExternalLexer.obj\n  qscintilla.dir\\Debug\\Indicator.obj\n  qscintilla.dir\\Debug\\KeyMap.obj\n  qscintilla.dir\\Debug\\LineMarker.obj\n  qscintilla.dir\\Debug\\PerLine.obj\n  qscintilla.dir\\Debug\\PositionCache.obj\n  qscintilla.dir\\Debug\\RESearch.obj\n  qscintilla.dir\\Debug\\RunStyles.obj\n  qscintilla.dir\\Debug\\ScintillaBase.obj\n  qscintilla.dir\\Debug\\Selection.obj\n  qscintilla.dir\\Debug\\Style.obj\n  qscintilla.dir\\Debug\\UniConversion.obj\n  qscintilla.dir\\Debug\\ViewStyle.obj\n  qscintilla.dir\\Debug\\XPM.obj\n  qscintilla.dir\\Debug\\mocs_compilation.obj\n  qscintilla.vcxproj -> E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\Debug\\qscintilla.lib\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qvector2d.h(60): warning C26495: Variable 'QVector2D::v' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::strongref' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(283): warning C26495: Variable 'QColor::cspec' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(286): warning C26495: Variable 'QColor::cspec' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(289): warning C26495: Variable 'QColor::cspec' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(292): warning C26495: Variable 'QColor::cspec' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(296): warning C26495: Variable 'QColor::cspec' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(60): warning C26495: Variable 'QMatrix::_m12' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(70): warning C26495: Variable 'QMatrix::_m12' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qpalette.h(71): warning C26495: Variable 'QPalette::<anonymous-tag>::for_faster_swapping_dont_use' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qfontmetrics.h(149): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qsciscintilla.h(2078): warning C26495: Variable 'QsciScintilla::FindState::wrap' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\lexaccessor.h(56): warning C26495: Variable 'LexAccessor::buf' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\stylecontext.h(140): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(64): warning C6386: Buffer overrun while writing to 'keywords':  the writable size is '(words+1)*8' bytes, but '24' bytes might be written. [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(47): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(69): warning C26495: Variable 'WordList::starts' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscilexer.h(341): warning C26495: Variable 'QsciLexer::StyleDataMap::style_data_set' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscilexer.h(336): warning C26495: Variable 'QsciLexer::StyleData::eol_fill' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscistyle.cpp(34): warning C26495: Variable 'QsciStyle::style_changeable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscistyle.cpp(48): warning C26495: Variable 'QsciStyle::style_changeable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\include\\platform.h(175): warning C26495: Variable 'ColourDesired::co' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\partitioning.h(91): warning C26495: Variable 'Partitioning::stepPartition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.h(122): warning C26495: Variable 'HighlightDelimiter::endFoldBlock' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(67): warning C26495: Variable 'SplitVector<int>::lengthBody' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(35): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(40): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvarlengtharray.h(263): warning C26495: Variable 'QVarLengthArray<char,1024>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(144): warning C26495: Variable 'QStyleOptionFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(172): warning C26495: Variable 'QStyleOptionTabWidgetFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(196): warning C26495: Variable 'QStyleOptionTabBarBase::documentMode' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(227): warning C26495: Variable 'QStyleOptionHeader::selectedPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(286): warning C26495: Variable 'QStyleOptionTab::selectedPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(316): warning C26495: Variable 'QStyleOptionToolBar::toolBarArea' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(343): warning C26495: Variable 'QStyleOptionProgressBar::orientation' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(373): warning C26495: Variable 'QStyleOptionMenuItem::maxIconWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(392): warning C26495: Variable 'QStyleOptionDockWidget::verticalTitleBar' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(443): warning C26495: Variable 'QStyleOptionViewItem::textElideMode' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(473): warning C26495: Variable 'QStyleOptionToolBox::position' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(492): warning C26495: Variable 'QStyleOptionRubberBand::shape' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(534): warning C26495: Variable 'QStyleOptionSlider::tickInterval' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(553): warning C26495: Variable 'QStyleOptionSpinBox::buttonSymbols' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(580): warning C26495: Variable 'QStyleOptionToolButton::arrowType' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(602): warning C26495: Variable 'QStyleOptionComboBox::editable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(620): warning C26495: Variable 'QStyleOptionTitleBar::titleBarState' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(640): warning C26495: Variable 'QStyleOptionGroupBox::midLineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(654): warning C26495: Variable 'QStyleOptionSizeGrip::corner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(670): warning C26495: Variable 'QStyleOptionGraphicsItem::levelOfDetail' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(114): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(363): warning C6281: Incorrect order of operations:  relational operators have higher precedence than bitwise operators. [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(365): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2304): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscidocument.cpp(59): warning C26495: Variable 'QsciDocument::pdoc' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(74): warning C26495: Variable 'QsciScintilla::ctPos' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(86): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(89): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(91): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(95): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(97): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(99): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(101): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(103): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(105): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(107): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(109): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(111): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(719): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(975): warning C6385: Reading invalid data from 'text':  the readable size is '((epos-spos+1))*2*1' bytes, but '3' bytes may be read. [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2258): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2258): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2292): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3233): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3237): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3231): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3239): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3235): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3951): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(4037): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(4123): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(99): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(102): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(140): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(96): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(93): warning C26495: Variable 'QsciSciPopup::sci' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(152): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(414): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(414): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(438): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(438): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(445): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(445): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(456): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(456): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(470): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(471): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(539): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(540): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(666): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(666): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(952): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(955): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(957): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscimacro.h(99): warning C26495: Variable 'QsciMacro::Macro::wParam' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscimacro.cpp(255): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(92): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::dummy' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(135): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::dummy' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(144): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::dummy' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(202): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(370): warning C6011: Dereferencing NULL pointer 'd'.  [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexers\\lexcpp.cpp(199): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(40): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::pi' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(34): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::pi' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(31): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::pi' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(141): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(141): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(143): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(143): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(174): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(247): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\casefolder.cpp(22): warning C26495: Variable 'CaseFolderTable::mapping' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\charclassify.cpp(22): warning C26495: Variable 'CharClassify::charClass' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.cpp(1575): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.cpp(1663): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(1763): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(2567): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(2568): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(3259): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(3260): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7204): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(8549): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(8549): warning C26451: Arithmetic overflow: Using operator '<<' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '<<' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7997): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7988): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7988): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7668): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7668): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7560): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7487): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7393): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\linemarker.cpp(116): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\linemarker.cpp(117): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(87): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(88): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(89): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(92): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(92): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(234): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(524): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(524): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(620): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\research.cpp(256): warning C26495: Variable 'RESearch::eopat' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\research.cpp(287): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\scintillabase.cpp(740): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\scintillabase.cpp(740): warning C26451: Arithmetic overflow: Using operator '<<' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '<<' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\style.cpp(60): warning C26495: Variable 'FontMeasurements::sizeZoomed' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\style.cpp(72): warning C26495: Variable 'Style::hotspot' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\viewstyle.cpp(87): warning C26495: Variable 'ViewStyle::nextExtendedStyle' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\viewstyle.cpp(91): warning C26495: Variable 'ViewStyle::largestMarkerHeight' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\xpm.cpp(59): warning C26495: Variable 'RGBAImage::scale' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\nCopyFilesToOutputDirectory:\n  Copying file from \"qscintilla.dir\\Debug\\qscintilla.pdb\" to \"E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\Debug\\qscintilla.pdb\".\nFinalizeBuildStatus:\n  Deleting file \"qscintilla.dir\\Debug\\qscintilla.tlog\\unsuccessfulbuild\".\n  Touching \"qscintilla.dir\\Debug\\qscintilla.tlog\\qscintilla.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj\" (10) on node 1 (default targets).\nProject \"E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj\" (10) is building \"E:\\robo\\build\\Debug\\src\\robomongo\\robomongo_autogen.vcxproj\" (11) on node 1 (default targets).\nProject \"E:\\robo\\build\\Debug\\src\\robomongo\\robomongo_autogen.vcxproj\" (11) is building \"E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh.vcxproj\" (12) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"ssh.dir\\Debug\\\".\n  Creating directory \"E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\Debug\\\".\n  Creating directory \"ssh.dir\\Debug\\ssh.tlog\\\".\nInitializeBuildStatus:\n  Creating \"ssh.dir\\Debug\\ssh.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/robomongo/ssh/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Debug/src/robomongo/ssh/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /IE:\\robo\\build\\Debug\\src /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\openssl-1.1.1f\\include\" /Zi /nologo /W3 /WX- /diagnostics:classic /MP /Od /Ob0 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D \"CMAKE_INTDIR=\\\"Debug\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo\"ssh.dir\\Debug\\\\\" /Fd\"ssh.dir\\Debug\\ssh.pdb\" /Gd /TC /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" E:\\robo\\src\\robomongo\\ssh\\ssh.c E:\\robo\\src\\robomongo\\ssh\\log.c E:\\robo\\src\\robomongo\\ssh\\array.c\n  ssh.c\n  log.c\n  array.c\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\Debug\\ssh.lib\" /NOLOGO /MACHINE:X64  /machine:x64 ssh.dir\\Debug\\ssh.obj\n  ssh.dir\\Debug\\log.obj\n  ssh.dir\\Debug\\array.obj\n  ssh.vcxproj -> E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\Debug\\ssh.lib\ne:\\robo\\src\\robomongo\\ssh\\ssh.c(585): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\array.c(44): warning C6386: Buffer overrun while writing to 'newarray':  the writable size is 'newsize*sizeof(void *)' bytes, but '8' bytes might be written. [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C6386: Buffer overrun while writing to 'newarray+i':  the writable size is 'newsize*sizeof(void *)' bytes, but '8' bytes might be written. [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh.vcxproj]\nCopyFilesToOutputDirectory:\n  Copying file from \"ssh.dir\\Debug\\ssh.pdb\" to \"E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\Debug\\ssh.pdb\".\nFinalizeBuildStatus:\n  Deleting file \"ssh.dir\\Debug\\ssh.tlog\\unsuccessfulbuild\".\n  Touching \"ssh.dir\\Debug\\ssh.tlog\\ssh.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh.vcxproj\" (default targets).\nPrepareForBuild:\n  Creating directory \"x64\\Debug\\robomongo_autogen\\\".\n  Creating directory \"x64\\Debug\\robomongo_autogen\\robomong.8F641F99.tlog\\\".\nInitializeBuildStatus:\n  Creating \"x64\\Debug\\robomongo_autogen\\robomong.8F641F99.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/robomongo/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Debug/src/robomongo/CMakeFiles/generate.stamp is up-to-date.\n  Automatic MOC, UIC and RCC for target robomongo\nFinalizeBuildStatus:\n  Deleting file \"x64\\Debug\\robomongo_autogen\\robomong.8F641F99.tlog\\unsuccessfulbuild\".\n  Touching \"x64\\Debug\\robomongo_autogen\\robomong.8F641F99.tlog\\robomongo_autogen.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Debug\\src\\robomongo\\robomongo_autogen.vcxproj\" (default targets).\nPrepareForBuild:\n  Creating directory \"robomongo.dir\\Debug\\\".\n  Creating directory \"E:\\robo\\build\\Debug\\src\\robomongo\\Debug\\\".\n  Creating directory \"robomongo.dir\\Debug\\robomongo.tlog\\\".\nInitializeBuildStatus:\n  Creating \"robomongo.dir\\Debug\\robomongo.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/robomongo/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Debug/src/robomongo/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /IE:\\robo\\build\\Debug\\src\\robomongo\\robomongo_autogen\\include_Debug /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\include\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\" /IE:\\robo\\build\\Debug\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtWidgets /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtGui /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtANGLE /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtCore /I\"E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\.\\mkspecs\\win32-msvc\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtNetwork /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtXml /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtPrintSupport /I\"E:\\robo-shell\\src\" /I\"E:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\" /I\"E:\\robo-shell\\src\\third_party\\boost-1.70.0\" /I\"E:\\robo-shell\\src\\third_party\\fmt\\dist\\include\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\include\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\mongo_sources\" /I\"E:\\robo-shell\\src\\third_party\\pcre-8.42\" /I\"E:\\robo-shell\\src\\third_party\\SafeInt\" /I\"E:\\robo-shell\\build\\debug\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\platform\\x86_64\\windows\\include\" /I\"E:\\openssl-1.1.1f\\include\" /Zi /nologo /W3 /WX- /diagnostics:classic /MP /Od /Ob0 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D BUILDING_ROBO /D \"PROJECT_NAME=\\\"Robo 3T\\\"\" /D \"PROJECT_NAME_TITLE=\\\"Robo 3T\\\"\" /D \"PROJECT_COPYRIGHT=\\\"Copyright (C) 2014-2017 3T Software Labs Ltd All Rights Reserved.\\\"\" /D \"PROJECT_DOMAIN=\\\"www.robomongo.org\\\"\" /D \"PROJECT_COMPANYNAME=\\\"3T Software Labs Ltd\\\"\" /D \"PROJECT_COMPANYNAME_DOMAIN=\\\"https://studio3t.com/\\\"\" /D \"PROJECT_GITHUB_FORK=\\\"www.github.com/Studio3T/robomongo\\\"\" /D \"PROJECT_GITHUB_ISSUES=\\\"www.github.com/Studio3T/robomongo/issues\\\"\" /D \"PROJECT_VERSION=\\\"1.4.0\\\"\" /D \"PROJECT_VERSION_SHORT=\\\"1.4\\\"\" /D \"PROJECT_NAME_LOWERCASE=\\\"robo 3t\\\"\" /D \"PROJECT_QT_VERSION=\\\"5.12.8\\\"\" /D \"MongoDB_VERSION=\\\"r4.2.6\\\"\" /D \"OPENSSL_VERSION=\\\"1.1.1f\\\"\" /D \"LIBSSH2_VERSION=\\\"1.9.0\\\"\" /D \"QJSON_VERSION=\\\"0.8.1\\\"\" /D \"GOOGLE_TEST_VERSION=\\\"1.8.1\\\"\" /D \"ESPRIMA_VERSION=\\\"2.7.3\\\"\" /D QT_WIDGETS_LIB /D QT_GUI_LIB /D QT_CORE_LIB /D QT_NETWORK_LIB /D QT_XML_LIB /D QJSON_STATIC /D SCINTILLA_QT /D SCI_LEXER /D QT_PRINTSUPPORT_LIB /D PCRE_STATIC /D BOOST_THREAD_VERSION=4 /D BOOST_THREAD_DONT_PROVIDE_VARIADIC_THREAD /D BOOST_THREAD_NO_DEPRECATED /D BOOST_THREAD_DONT_PROVIDE_INTERRUPTIONS /D BOOST_THREAD_HAS_BUG /D MONGO_CONFIG_HAVE_HEADER_UNISTD_H /D _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING /D _SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING /D \"CMAKE_INTDIR=\\\"Debug\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"robomongo.dir\\Debug\\\\\" /Fd\"robomongo.dir\\Debug\\vc141.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4477 /wd4291 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" E:\\robo\\src\\robomongo\\app\\main.cpp E:\\robo\\src\\robomongo\\core\\utils\\QtUtils.cpp E:\\robo\\src\\robomongo\\core\\utils\\StdUtils.cpp E:\\robo\\src\\robomongo\\core\\utils\\Logger.cpp E:\\robo\\src\\robomongo\\core\\HexUtils.cpp E:\\robo\\src\\robomongo\\core\\utils\\BsonUtils.cpp E:\\robo\\src\\robomongo\\core\\settings\\CredentialSettings.cpp E:\\robo\\src\\robomongo\\core\\settings\\ConnectionSettings.cpp E:\\robo\\src\\robomongo\\core\\Event.cpp E:\\robo\\src\\robomongo\\core\\Enums.cpp E:\\robo\\src\\robomongo\\core\\EventError.cpp E:\\robo\\src\\robomongo\\core\\EventBusSubscriber.cpp E:\\robo\\src\\robomongo\\core\\EventBusDispatcher.cpp E:\\robo\\src\\robomongo\\core\\EventWrapper.cpp E:\\robo\\src\\robomongo\\core\\EventBus.cpp E:\\robo\\src\\robomongo\\core\\KeyboardManager.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoNamespace.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoFunction.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoUtils.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoCollection.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoCollectionInfo.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoQueryInfo.cpp E:\\robo\\src\\robomongo\\core\\domain\\CursorPosition.cpp E:\\robo\\src\\robomongo\\core\\domain\\ScriptInfo.cpp E:\\robo\\src\\robomongo\\core\\events\\MongoEventsInfo.cpp E:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp E:\\robo\\src\\robomongo\\shell\\bson\\json.cpp E:\\robo\\src\\robomongo\\core\\engine\\ScriptEngine.cpp E:\\robo\\src\\robomongo\\core\\events\\MongoEvents.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoDocument.cpp E:\\robo\\src\\robomongo\\gui\\AppStyle.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoServer.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoShell.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoDatabase.cpp E:\\robo\\src\\robomongo\\core\\domain\\App.cpp E:\\robo\\src\\robomongo\\core\\mongodb\\MongoClient.cpp E:\\robo\\src\\robomongo\\core\\mongodb\\MongoWorker.cpp E:\\robo\\src\\robomongo\\core\\mongodb\\ReplicaSet.cpp E:\\robo\\src\\robomongo\\core\\settings\\SettingsManager.cpp E:\\robo\\src\\robomongo\\core\\AppRegistry.cpp E:\\robo\\src\\robomongo\\utils\\StringOperations.cpp E:\\robo\\src\\robomongo\\utils\\common.cpp E:\\robo\\src\\robomongo\\utils\\SimpleCrypt.cpp E:\\robo\\src\\robomongo\\utils\\RoboCrypt.cpp E:\\robo\\src\\robomongo\\gui\\GuiRegistry.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\AboutDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\EulaDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionAdvancedTab.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionAuthTab.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionBasicTab.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionDiagnosticDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\CopyCollectionDialog.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\IndicatorLabel.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\CreateCollectionDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\CreateDatabaseDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\CreateUserDialog.cpp E:\\robo\\src\\robomongo\\gui\\utils\\ComboBoxUtils.cpp E:\\robo\\src\\robomongo\\gui\\utils\\DialogUtils.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\PreferencesDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionsDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ExportDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ChangeShellTimeoutDialog.cpp E:\\robo\\src\\robomongo\\gui\\editors\\PlainJavaScriptEditor.cpp E:\\robo\\src\\robomongo\\gui\\editors\\JSLexer.cpp E:\\robo\\src\\robomongo\\gui\\editors\\FindFrame.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\AddEditIndexDialog.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\ScriptWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerCollectionTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerCollectionIndexesDir.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerCollectionIndexItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerReplicaSetFolderItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerReplicaSetTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerDatabaseTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerDatabaseCategoryTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerUserTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerFunctionTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\DocumentTextEditor.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\FunctionTextEditor.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerServerTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerTreeWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\BsonTableModel.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\BsonTableView.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\BsonTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\BsonTreeModel.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\BsonTreeView.cpp E:\\robo\\src\\robomongo\\core\\domain\\Notifier.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\CollectionStatsTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\CollectionStatsTreeWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\JsonPrepareThread.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\OutputItemContentWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\OutputItemHeaderWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\OutputWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\PagingWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\ProgressBarPopup.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\QueryWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\WorkAreaTabBar.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\WorkAreaTabWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\WelcomeTab.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\LogWidget.cpp E:\\robo\\src\\robomongo\\gui\\MainWindow.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\SSHTunnelTab.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\SSLTab.cpp E:\\robo\\src\\robomongo\\core\\settings\\SshSettings.cpp E:\\robo\\src\\robomongo\\core\\settings\\SslSettings.cpp E:\\robo\\src\\robomongo\\core\\settings\\ReplicaSetSettings.cpp E:\\robo\\src\\robomongo\\core\\mongodb\\SshTunnelWorker.cpp E:\\robo\\build\\Debug\\src\\robomongo\\robomongo_autogen\\mocs_compilation.cpp E:\\robo\\build\\Debug\\src\\robomongo\\robomongo_autogen\\3YJK5W5UP7\\qrc_robo.cpp E:\\robo\\build\\Debug\\src\\robomongo\\robomongo_autogen\\YHP5W5E6RA\\qrc_gui.cpp\n  main.cpp\n  QtUtils.cpp\n  StdUtils.cpp\n  Logger.cpp\n  HexUtils.cpp\n  BsonUtils.cpp\n  CredentialSettings.cpp\n  ConnectionSettings.cpp\n  Event.cpp\n  Enums.cpp\n  EventError.cpp\n  EventBusSubscriber.cpp\n  EventBusDispatcher.cpp\n  EventWrapper.cpp\n  EventBus.cpp\n  KeyboardManager.cpp\n  MongoNamespace.cpp\n  MongoFunction.cpp\n  MongoUtils.cpp\n  MongoCollection.cpp\n  MongoCollectionInfo.cpp\n  MongoQueryInfo.cpp\n  CursorPosition.cpp\n  ScriptInfo.cpp\n  MongoEventsInfo.cpp\n  ptimeutil.cpp\n  json.cpp\n  ScriptEngine.cpp\n  MongoEvents.cpp\n  MongoDocument.cpp\n  AppStyle.cpp\n  MongoServer.cpp\n  MongoShell.cpp\n  MongoDatabase.cpp\n  App.cpp\n  MongoClient.cpp\n  MongoWorker.cpp\n  ReplicaSet.cpp\n  SettingsManager.cpp\n  AppRegistry.cpp\n  StringOperations.cpp\n  common.cpp\n  SimpleCrypt.cpp\n  RoboCrypt.cpp\n  GuiRegistry.cpp\n  AboutDialog.cpp\n  EulaDialog.cpp\n  ConnectionAdvancedTab.cpp\n  ConnectionAuthTab.cpp\n  ConnectionBasicTab.cpp\n  ConnectionDiagnosticDialog.cpp\n  ConnectionDialog.cpp\n  CopyCollectionDialog.cpp\n  IndicatorLabel.cpp\n  CreateCollectionDialog.cpp\n  CreateDatabaseDialog.cpp\n  CreateUserDialog.cpp\n  ComboBoxUtils.cpp\n  DialogUtils.cpp\n  PreferencesDialog.cpp\n  ConnectionsDialog.cpp\n  ExportDialog.cpp\n  ChangeShellTimeoutDialog.cpp\n  PlainJavaScriptEditor.cpp\n  JSLexer.cpp\n  FindFrame.cpp\n  AddEditIndexDialog.cpp\n  ScriptWidget.cpp\n  ExplorerCollectionTreeItem.cpp\n  ExplorerCollectionIndexesDir.cpp\n  ExplorerCollectionIndexItem.cpp\n  ExplorerTreeItem.cpp\n  ExplorerReplicaSetFolderItem.cpp\n  ExplorerReplicaSetTreeItem.cpp\n  ExplorerDatabaseTreeItem.cpp\n  ExplorerDatabaseCategoryTreeItem.cpp\n  ExplorerUserTreeItem.cpp\n  ExplorerFunctionTreeItem.cpp\n  DocumentTextEditor.cpp\n  FunctionTextEditor.cpp\n  ExplorerServerTreeItem.cpp\n  ExplorerTreeWidget.cpp\n  ExplorerWidget.cpp\n  BsonTableModel.cpp\n  BsonTableView.cpp\n  BsonTreeItem.cpp\n  BsonTreeModel.cpp\n  BsonTreeView.cpp\n  Notifier.cpp\n  CollectionStatsTreeItem.cpp\n  CollectionStatsTreeWidget.cpp\n  JsonPrepareThread.cpp\n  OutputItemContentWidget.cpp\n  OutputItemHeaderWidget.cpp\n  OutputWidget.cpp\n  PagingWidget.cpp\n  ProgressBarPopup.cpp\n  QueryWidget.cpp\n  WorkAreaTabBar.cpp\n  WorkAreaTabWidget.cpp\n  WelcomeTab.cpp\n  LogWidget.cpp\n  MainWindow.cpp\n  SSHTunnelTab.cpp\n  SSLTab.cpp\n  SshSettings.cpp\n  SslSettings.cpp\n  ReplicaSetSettings.cpp\n  SshTunnelWorker.cpp\n  mocs_compilation.cpp\n  qrc_robo.cpp\n  qrc_gui.cpp\nResourceCompile:\n  C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.18362.0\\x86\\rc.exe /D WIN32 /D _DEBUG /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D BUILDING_ROBO /D \"PROJECT_NAME=\\\\\\\"Robo 3T\\\\\\\"\" /D \"PROJECT_NAME_TITLE=\\\\\\\"Robo 3T\\\\\\\"\" /D \"PROJECT_COPYRIGHT=\\\\\\\"Copyright (C) 2014-2017 3T Software Labs Ltd All Rights Reserved.\\\\\\\"\" /D \"PROJECT_DOMAIN=\\\\\\\"www.robomongo.org\\\\\\\"\" /D \"PROJECT_COMPANYNAME=\\\\\\\"3T Software Labs Ltd\\\\\\\"\" /D \"PROJECT_COMPANYNAME_DOMAIN=\\\\\\\"https://studio3t.com/\\\\\\\"\" /D \"PROJECT_GITHUB_FORK=\\\\\\\"www.github.com/Studio3T/robomongo\\\\\\\"\" /D \"PROJECT_GITHUB_ISSUES=\\\\\\\"www.github.com/Studio3T/robomongo/issues\\\\\\\"\" /D \"PROJECT_VERSION=\\\\\\\"1.4.0\\\\\\\"\" /D \"PROJECT_VERSION_SHORT=\\\\\\\"1.4\\\\\\\"\" /D \"PROJECT_NAME_LOWERCASE=\\\\\\\"robo 3t\\\\\\\"\" /D \"PROJECT_QT_VERSION=\\\\\\\"5.12.8\\\\\\\"\" /D \"MongoDB_VERSION=\\\\\\\"r4.2.6\\\\\\\"\" /D \"OPENSSL_VERSION=\\\\\\\"1.1.1f\\\\\\\"\" /D \"LIBSSH2_VERSION=\\\\\\\"1.9.0\\\\\\\"\" /D \"QJSON_VERSION=\\\\\\\"0.8.1\\\\\\\"\" /D \"GOOGLE_TEST_VERSION=\\\\\\\"1.8.1\\\\\\\"\" /D \"ESPRIMA_VERSION=\\\\\\\"2.7.3\\\\\\\"\" /D QT_WIDGETS_LIB /D QT_GUI_LIB /D QT_CORE_LIB /D QT_NETWORK_LIB /D QT_XML_LIB /D QJSON_STATIC /D SCINTILLA_QT /D SCI_LEXER /D QT_PRINTSUPPORT_LIB /D PCRE_STATIC /D BOOST_THREAD_VERSION=4 /D BOOST_THREAD_DONT_PROVIDE_VARIADIC_THREAD /D BOOST_THREAD_NO_DEPRECATED /D BOOST_THREAD_DONT_PROVIDE_INTERRUPTIONS /D BOOST_THREAD_HAS_BUG /D MONGO_CONFIG_HAVE_HEADER_UNISTD_H /D _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING /D _SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING /D \"CMAKE_INTDIR=\\\\\\\"Debug\\\\\\\"\" /D _UNICODE /D UNICODE /l\"0x0409\" /IE:\\robo\\build\\Debug\\src\\robomongo\\robomongo_autogen\\include_Debug /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\include\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\" /IE:\\robo\\build\\Debug\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtWidgets /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtGui /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtANGLE /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtCore /I\"E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\.\\mkspecs\\win32-msvc\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtNetwork /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtXml /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtPrintSupport /I\"E:\\robo-shell\\src\" /I\"E:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\" /I\"E:\\robo-shell\\src\\third_party\\boost-1.70.0\" /I\"E:\\robo-shell\\src\\third_party\\fmt\\dist\\include\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\include\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\mongo_sources\" /I\"E:\\robo-shell\\src\\third_party\\pcre-8.42\" /I\"E:\\robo-shell\\src\\third_party\\SafeInt\" /I\"E:\\robo-shell\\build\\debug\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\platform\\x86_64\\windows\\include\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /fo\"robomongo.dir\\Debug\\winres.res\" E:\\robo\\build\\Debug\\winres.rc \nLink:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe /ERRORREPORT:QUEUE /OUT:\"E:\\robo\\build\\Debug\\src\\robomongo\\Debug\\robo3t.exe\" /INCREMENTAL /NOLOGO E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5Networkd.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5Xmld.lib \"..\\third-party\\qjson-0.8.1\\Debug\\qjson.lib\" \"..\\third-party\\qscintilla-2.8.4\\Debug\\qscintilla.lib\" ssh\\Debug\\ssh.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\qtmaind.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5PrintSupportd.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5Widgetsd.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5Guid.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5Cored.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\qtmaind.lib \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\ssl_options_client.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\ssl_options_client_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\transport\\message_compressor_options_client_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\kms_shell.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\linenoise.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\mk_wcwidth.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\mongo-server.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\shell_options.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\shell_utils.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\shell_utils_extended.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\shell_utils_launcher.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\version_impl.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\signal_handlers.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\signal_win32.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\log_process_details.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\server_options_server_helpers.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\server_options_base.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\cluster_auth_mode_option_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\keyfile_option_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\server_options_base_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\server_options_general_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\server_options_nongeneral_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\is_master_response.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\member_config.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\repl_set_config.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\repl_set_heartbeat_args_v1.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\repl_set_heartbeat_response.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\repl_set_request_votes_args.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\repl_set_tag.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\update_position_args.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\last_vote.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\repl_set_config_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\split_horizon.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\concurrency\\d_concurrency.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\concurrency\\lock_manager.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\concurrency\\lock_state.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\concurrency\\lock_stats.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\concurrency\\replication_state_transition_lock_guard.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\concurrency\\ticketholder.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\concurrency\\flow_control_ticketholder.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\password.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\password_params_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\options_parser\\options_parser_init.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\bench.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\traffic_reader.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\logical_session_id_helpers.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\catalog\\index_key_validate.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\index\\btree_key_generator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\index\\expression_keys_private.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\index\\sort_key_generator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\index\\wildcard_key_generator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\exec\\projection_exec_agg.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\parsed_aggregation_projection.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\parsed_aggregation_projection_node.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\parsed_exclusion_projection.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\parsed_inclusion_projection.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\parsed_add_fields.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\index\\expression_params.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\index\\s2_common.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\hasher.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\fts_index_format.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\fts_matcher.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\fts_query_impl.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\fts_query_parser.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\fts_spec.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\fts_spec_legacy.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\fts_language.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\fts_basic_phrase_matcher.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\fts_basic_tokenizer.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\fts_unicode_phrase_matcher.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\fts_unicode_tokenizer.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\fts_util.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\fts_element_iterator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\stemmer.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\stop_words.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\stop_words_list.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\tokenizer.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\shim_stemmer.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\runtime\\api.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\libstemmer\\libstemmer_utf8.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_dutch.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_german.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_porter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_spanish.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_english.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_hungarian.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_portuguese.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_swedish.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_finnish.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_italian.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_romanian.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_turkish.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_danish.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_french.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_norwegian.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_russian.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\unicode\\codepoints_casefold.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\unicode\\codepoints_delimiter_list.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\unicode\\codepoints_diacritic_list.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\unicode\\codepoints_diacritic_map.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\unicode\\string.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\linenoise_utf8.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\index\\index_descriptor.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\catalog\\index_catalog.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\catalog\\index_catalog_entry.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\catalog\\disable_index_spec_namespace_generation_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\encrypted_dbclient_base.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\fle_shell_options_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\shell_options_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\shell_options_storage.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\kms.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\kms_aws.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\kms_local.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\kms_gen.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\shim_kms_message.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\kms-message\\src\\hexlify.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\kms-message\\src\\kms_b64.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\kms-message\\src\\kms_decrypt_request.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\kms-message\\src\\kms_encrypt_request.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\kms-message\\src\\kms_kv_list.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\kms-message\\src\\kms_message.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\kms-message\\src\\kms_request.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\kms-message\\src\\kms_request_opt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\kms-message\\src\\kms_request_str.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\kms-message\\src\\kms_response.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\kms-message\\src\\kms_response_parser.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\kms-message\\src\\sort.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\kms-message\\src\\kms_crypto_windows.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\base.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\bindata.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\bson.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\code.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\countdownlatch.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\cursor.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\cursor_handle.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\db.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\dbcollection.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\dbpointer.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\dbquery.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\dbref.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\engine.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\error.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\exception.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\global.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\idwrapper.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\implscope.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\internedstring.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\jscustomallocator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\jsstringwrapper.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\jsthread.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\maxkey.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\minkey.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\mongo.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\mongohelpers.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\mongohelpers_js.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\nativefunction.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\numberdecimal.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\numberint.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\numberlong.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\object.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\objectwrapper.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\oid.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\PosixNSPR.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\proxyscope.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\regexp.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\session.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\status.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\timestamp.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\uri.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\valuereader.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\valuewriter.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\engine_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\mozjs\\scripting_util_gen.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\shim_mozjs.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\mongo_sources\\mongoErrorReportToString.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\mongo_sources\\freeOpToJSContext.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\builtin\\RegExp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\frontend\\Parser.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\gc\\StoreBuffer.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\jsarray.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\jsmath.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\mfbt\\Unified_cpp_mfbt0.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\perf\\pm_stub.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\util\\DoubleToString.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\vm\\Interpreter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\vm\\JSAtom.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\mfbt\\Compression.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\mfbt\\double-conversion\\double-conversion\\strtod.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\mfbt\\lz4.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\mozglue\\misc\\Printf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\mozglue\\misc\\TimeStamp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\mozglue\\misc\\StackWalk.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\mozglue\\misc\\ConditionVariable_windows.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\mozglue\\misc\\Mutex_windows.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\mozglue\\misc\\TimeStamp_windows.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_acos.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_acosh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_asin.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_atan2.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_atanh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_cosh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_exp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_hypot.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_log.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_log10.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_log2.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_pow.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_sinh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_sqrt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\k_exp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_asinh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_atan.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_cbrt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_ceil.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_ceilf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_copysign.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_expm1.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_fabs.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_floor.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_floorf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_log1p.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_nearbyint.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_rint.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_rintf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_scalbn.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_tanh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_trunc.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_truncf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\extract\\js\\src\\jit\\x86-shared\\Disassembler-x86-shared.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src0.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src1.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src10.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src11.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src12.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src13.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src14.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src15.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src16.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src17.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src18.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src19.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src2.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src20.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src21.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src22.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src23.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src24.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src25.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src26.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src27.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src28.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src29.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src3.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src30.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src31.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src32.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src33.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src34.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src35.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src36.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src37.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src38.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src39.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src4.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src40.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src41.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src42.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src43.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src44.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src5.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src6.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src7.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src8.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src9.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\deadline_monitor.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\deadline_monitor_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\dbdirectclient_factory.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\engine.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\jsexception.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\utils.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\mongo.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\scripting\\bson_template_evaluator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\crypto\\aead_encryption.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\expression.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\expression_algo.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\expression_array.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\expression_expr.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\expression_geo.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\expression_internal_expr_eq.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\expression_leaf.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\expression_parser.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\expression_text_base.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\expression_text_noop.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\expression_tree.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\expression_where_base.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\expression_where_noop.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\expression_with_placeholder.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\extensions_callback.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\extensions_callback_noop.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\match_details.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\matchable.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\matcher.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\matcher_type_set.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\rewrite_expr.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\encrypt_schema_types.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_all_elem_match_from_index.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_allowed_properties.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_cond.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_eq.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_fmod.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_match_array_index.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_num_array_items.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_num_properties.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_object_match.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_root_doc_eq.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_str_length.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_unique_items.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\expression_internal_schema_xor.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\json_pointer.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\json_schema_parser.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\schema\\encrypt_schema_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\query_knobs_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\expression.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\expression_trigonometric.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\summation.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\regex_util.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\expression_context.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\variables.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\collation\\collator_factory_interface.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\collation\\collation_index_key.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\collation\\collation_spec.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\collation\\collator_interface.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\aggregation_request.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\explain_options.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\document_source_change_stream_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\document_source_list_sessions_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\document_source_merge_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\document_source_merge_modes_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\document_source_replace_root_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\exchange_spec_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\value_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\document_source_merge_spec.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\resume_token.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\storage\\key_string.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\dependencies.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\document.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\document_comparator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\document_path_support.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\value.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\value_comparator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\intrusive_counter.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\datetime\\date_time_support.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\shim_timelib.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\timelib-2018.01\\astro.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\timelib-2018.01\\dow.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\timelib-2018.01\\interval.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\timelib-2018.01\\parse_date.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\timelib-2018.01\\parse_iso_intervals.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\timelib-2018.01\\parse_tz.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\timelib-2018.01\\parse_zoneinfo.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\timelib-2018.01\\timelib.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\timelib-2018.01\\tm2unixtime.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\timelib-2018.01\\unixtime2tm.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\field_path.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\path.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\matcher\\path_internal.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\geo\\geoparser.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\geo\\geometry_container.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\geo\\hash.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\geo\\shapes.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\geo\\big_polygon.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\geo\\r2_region_coverer.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s1angle.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2cellid.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2latlng.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s1interval.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2cap.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2cell.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2cellunion.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2edgeindex.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2edgeutil.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2latlngrect.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2loop.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2pointregion.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2polygon.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2polygonbuilder.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2polyline.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2r2rect.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2region.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2regioncoverer.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2regionintersection.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\s2regionunion.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\util\\math\\mathutil.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\util\\coding\\coder.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\util\\coding\\varint.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\strings\\split.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\strings\\stringprintf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\strings\\strutil.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\base\\int128.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\base\\logging.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\base\\stringprintf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\s2\\base\\strtoint.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\fts\\fts_query_noop.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\crypto\\symmetric_crypto.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\crypto\\symmetric_crypto_windows.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\crypto\\symmetric_key.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\views\\resolved_view.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\storage\\duplicate_key_error_info.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\connection_string_connect.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\mongo_uri_connect.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\connpool.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\dbclient_connection.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\dbclient_rs.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\global_conn_pool.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\global_conn_pool_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\replica_set_change_notifier.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\replica_set_monitor.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\replica_set_monitor_manager.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\executor\\thread_pool_task_executor.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\executor\\network_interface_thread_pool.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\executor\\network_interface_factory.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\executor\\connection_pool_tl.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\executor\\network_interface_tl.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\transport\\transport_layer_manager.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\transport\\service_executor_adaptive.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\transport\\service_executor_reserved.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\transport\\service_executor_synchronous.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\transport\\service_executor_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\transport\\transport_layer_asio.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\system_error.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\async_client.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\transport\\message_compressor_manager.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\transport\\message_compressor_metrics.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\transport\\message_compressor_registry.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\transport\\message_compressor_snappy.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\transport\\message_compressor_zlib.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\transport\\message_compressor_zstd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\shim_zstd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\entropy_common.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\fse_decompress.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\threading.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\pool.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\zstd_common.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\error_private.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\xxhash.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\hist.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\fse_compress.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\huf_compress.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_compress.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstdmt_compress.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_fast.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_double_fast.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_lazy.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_opt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_ldm.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\decompress\\huf_decompress.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\decompress\\zstd_decompress.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\cover.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\fastcover.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\divsufsort.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\zdict.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\deprecated\\zbuff_common.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\deprecated\\zbuff_compress.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zstandard-1.3.7\\zstd\\lib\\deprecated\\zbuff_decompress.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\shim_zlib.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zlib-1.2.11\\adler32.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zlib-1.2.11\\crc32.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zlib-1.2.11\\compress.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zlib-1.2.11\\deflate.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zlib-1.2.11\\infback.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zlib-1.2.11\\inffast.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zlib-1.2.11\\inflate.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zlib-1.2.11\\inftrees.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zlib-1.2.11\\trees.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zlib-1.2.11\\uncompr.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\zlib-1.2.11\\zutil.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\shim_snappy.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\snappy-1.1.7\\snappy-c.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\snappy-1.1.7\\snappy.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\snappy-1.1.7\\snappy-sinksource.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\executor\\network_interface.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\executor\\task_executor.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\executor\\connection_pool.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\executor\\egress_tag_closer_manager.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\executor\\connection_pool_stats.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\dbclient_base.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\dbclient_cursor.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\index_spec.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\private\\ssl_expiration.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\ssl_manager.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\ssl_parameters.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\ssl_manager_windows.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\ssl_stream.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\ssl_parameters_gen.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\shim_asio.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\asio-master\\asio\\src\\asio.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\ssl_types.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\ssl_options.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\private\\socket_poll.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\sock.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\background.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\commands\\server_status.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\stats\\counters.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\commands.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\audit.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\count_command_as_aggregation_command.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\count_request.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\cursor_request.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\cursor_response.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\find_and_modify_request.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\getmore_request.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\killcursors_request.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\killcursors_response.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\view_response_formatter.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\count_command_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\factory.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\object_check.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\legacy_request.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\legacy_request_builder.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\legacy_reply.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\legacy_reply_builder.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\reply_builder_interface.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\object_check_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\catalog\\mongo_version_range.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\catalog\\type_changelog.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\catalog\\type_chunk.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\catalog\\type_collection.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\catalog\\type_config_version.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\catalog\\type_database.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\catalog\\type_lockpings.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\catalog\\type_locks.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\catalog\\type_mongos.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\catalog\\type_shard_collection.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\catalog\\type_shard_database.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\catalog\\type_shard.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\catalog\\type_tags.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\add_shard_request_type.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\add_shard_to_zone_request_type.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\balance_chunk_request_type.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\commit_chunk_migration_request_type.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\merge_chunk_request_type.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\migration_secondary_throttle_options.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\move_chunk_request.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\remove_shard_from_zone_request_type.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\set_shard_version_request.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\split_chunk_request_type.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\update_zone_key_range_request_type.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\cannot_implicitly_create_collection_info.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\chunk_version.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\database_version_helpers.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\shard_id.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\stale_exception.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\would_change_owning_shard_exception.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\catalog\\type_chunk_base_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\chunk_version_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\database_version_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\clone_catalog_data_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\clear_jumbo_flag_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\create_collection_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\create_database_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\flush_database_cache_updates_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\flush_routing_table_cache_updates_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\get_database_version_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\move_primary_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\shard_collection_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\clone_collection_options_from_primary_shard_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\request_types\\wait_for_fail_point_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\message.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\op_msg.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\protocol.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\wiredtiger\\src\\checksum\\software\\checksum.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\wiredtiger\\src\\checksum\\x86\\crc32-x86.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\wiredtiger\\src\\checksum\\x86\\crc32-x86-alt.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\wire_version.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\bson\\dotted_path_support.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\query_request.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\tailable_mode.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\tailable_mode_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\read_concern_args.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\catalog\\collection_catalog.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\catalog\\collection.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\ops\\write_ops_parsers.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\ops\\write_ops_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\hint_parser.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\query\\hint_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\pipeline\\runtime_constants_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\dbmessage.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\connection_string.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\mongo_uri.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\dns_query.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\query.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\authenticate.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\native_sasl_client_session.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\sasl_client_authenticate.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\sasl_client_authenticate_impl.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\sasl_client_conversation.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\sasl_client_session.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\sasl_plain_client_conversation.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\sasl_scram_client_conversation.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\md5.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\password_digest.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\icu.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\icu_init.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\shim_icu.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\affixpatternparser.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\alphaindex.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\anytrans.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\astro.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\basictz.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\bocsu.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\brktrans.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\buddhcal.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\calendar.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\casetrn.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\cecal.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\chnsecal.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\choicfmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\coleitr.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\coll.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collation.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationbuilder.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationcompare.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationdata.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationdatabuilder.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationdatareader.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationdatawriter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationfastlatin.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationfastlatinbuilder.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationfcd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationiterator.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationkeys.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationroot.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationrootelements.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationruleparser.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationsets.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationsettings.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationtailoring.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\collationweights.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\compactdecimalformat.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\coptccal.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\cpdtrans.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\csdetect.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\csmatch.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\csr2022.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\csrecog.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\csrmbcs.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\csrsbcs.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\csrucode.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\csrutf8.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\curramt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\currfmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\currpinf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\currunit.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\dangical.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\datefmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\dayperiodrules.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\dcfmtsym.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\decContext.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\decNumber.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\decfmtst.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\decimalformatpattern.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\decimfmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\decimfmtimpl.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\digitaffix.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\digitaffixesandpadding.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\digitformatter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\digitgrouping.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\digitinterval.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\digitlst.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\dtfmtsym.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\dtitvfmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\dtitvinf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\dtptngen.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\dtrule.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\esctrn.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ethpccal.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\fmtable.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\fmtable_cnv.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\format.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\fphdlimp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\fpositer.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\funcrepl.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\gender.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\gregocal.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\gregoimp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\hebrwcal.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\identifier_info.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\indiancal.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\inputext.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\islamcal.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\japancal.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\measfmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\measunit.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\measure.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\msgfmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\name2uni.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\nfrs.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\nfrule.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\nfsubs.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\nortrans.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\nultrans.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\numfmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\numsys.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\olsontz.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\persncal.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\pluralaffix.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\plurfmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\plurrule.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\precision.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\quant.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\quantityformatter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rbnf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rbt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rbt_data.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rbt_pars.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rbt_rule.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rbt_set.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rbtz.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\regexcmp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\regeximp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\regexst.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\regextxt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\region.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\reldatefmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\reldtfmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rematch.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\remtrans.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\repattrn.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\rulebasedcollator.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\scientificnumberformatter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\scriptset.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\search.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\selfmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\sharedbreakiterator.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\simpletz.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\smallintformatter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\smpdtfmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\smpdtfst.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\sortkey.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\standardplural.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\strmatch.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\strrepl.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\stsearch.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\taiwncal.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\timezone.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\titletrn.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tmunit.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tmutamt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tmutfmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tolowtrn.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\toupptrn.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\translit.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\transreg.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tridpars.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tzfmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tzgnames.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tznames.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tznames_impl.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tzrule.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\tztrans.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ucal.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ucln_in.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ucol.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ucol_res.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ucol_sit.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ucoleitr.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ucsdet.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\udat.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\udateintervalformat.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\udatpg.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ufieldpositer.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uitercollationiterator.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ulocdata.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\umsg.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\unesctrn.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uni2name.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\unum.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\unumsys.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\upluralrules.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uregex.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uregexc.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uregion.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\usearch.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uspoof.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_build.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_conf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_impl.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_wsconf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\utf16collationiterator.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\utf8collationiterator.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\utmscale.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\utrans.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\valueformatter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\visibledigits.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\vtzone.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\vzone.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\windtfmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\winnmfmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\wintzimpl.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\zonemeta.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\zrule.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\i18n\\ztrans.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\appendable.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\bmpset.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\brkeng.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\brkiter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\bytestream.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\bytestrie.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\bytestriebuilder.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\bytestrieiterator.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\caniter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\chariter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\charstr.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\cmemory.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\cstr.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\cstring.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\cwchar.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\dictbe.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\dictionarydata.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\dtintrv.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\errorcode.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\filteredbrk.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\filterednormalizer2.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\icudataver.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\icuplug.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\listformatter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\loadednormalizer2impl.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\locavailable.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\locbased.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\locdispnames.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\locdspnm.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\locid.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\loclikely.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\locmap.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\locresdata.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\locutil.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\messagepattern.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\normalizer2.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\normalizer2impl.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\normlzr.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\parsepos.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\patternprops.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\pluralmap.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\propname.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\propsvec.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\punycode.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\putil.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\rbbi.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\rbbidata.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\rbbinode.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\rbbirb.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\rbbiscan.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\rbbisetb.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\rbbistbl.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\rbbitblb.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\resbund.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\resbund_cnv.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\resource.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ruleiter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\schriter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\serv.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\servlk.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\servlkf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\servls.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\servnotf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\servrbf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\servslkf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\sharedobject.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\simpleformatter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\stringpiece.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\stringtriebuilder.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uarrsort.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ubidi.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ubidi_props.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ubidiln.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ubidiwrt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ubrk.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucase.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucasemap.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucasemap_titlecase_brkiter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucat.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uchar.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucharstrie.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucharstriebuilder.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucharstrieiterator.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uchriter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucln_cmn.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucmndata.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv2022.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_bld.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_cb.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_cnv.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_ct.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_err.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_ext.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_io.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_lmb.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_set.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_u16.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_u32.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_u7.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnv_u8.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnvbocu.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnvdisp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnvhz.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnvisci.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnvlat1.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnvmbcs.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnvscsu.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucnvsel.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucol_swp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ucurr.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\udata.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\udatamem.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\udataswp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uenum.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uhash.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uhash_us.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uidna.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uinit.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uinvchar.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uiter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ulist.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ulistformatter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uloc.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uloc_keytype.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uloc_tag.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\umapfile.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\umath.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\umutex.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\unames.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\unifiedcache.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\unifilt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\unifunct.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uniset.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uniset_closure.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uniset_props.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\unisetspan.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\unistr.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\unistr_case.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\unistr_case_locale.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\unistr_cnv.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\unistr_props.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\unistr_titlecase_brkiter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\unorm.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\unormcmp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uobject.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uprops.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ures_cnv.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uresbund.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uresdata.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\usc_impl.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uscript.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uscript_props.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uset.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uset_props.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\usetiter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ushape.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\usprep.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustack.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustr_cnv.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustr_titlecase_brkiter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustr_wcs.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustrcase.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustrcase_locale.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustrenum.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustrfmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustring.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\ustrtrns.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\utext.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\utf_impl.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\util.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\util_props.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\utrace.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\utrie.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\utrie2.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\utrie2_builder.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uts46.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\utypes.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uvector.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uvectr32.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\uvectr64.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\common\\wintz.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\icu4c-57.1\\source\\stubdata\\stubdata.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\get_status_from_command_result.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\write_concern_error_detail.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\executor\\remote_command_request.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\executor\\remote_command_response.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\metadata.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\metadata\\config_server_metadata.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\metadata\\egress_metadata_hook_list.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\metadata\\logical_time_metadata.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\metadata\\sharding_metadata.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\metadata\\repl_set_metadata.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\metadata\\oplog_query_metadata.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\metadata\\tracking_metadata.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\metadata\\client_metadata.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\metadata\\client_metadata_ismaster.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\transport\\service_entry_point_utils.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\transport\\session.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\transport\\transport_layer.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\is_mongos.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\logical_time_validator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\signed_logical_time.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\keys_collection_manager_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\keys_collection_manager.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\keys_collection_cache.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\key_generator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\repl_client_info.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\replication_coordinator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\replication_coordinator_noop.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\replication_consistency_markers.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\replication_process.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\storage_interface.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\rollback_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\namespace_string.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\bson_extract_optime.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\optime.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\keys_collection_client_sharded.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\s\\catalog\\sharding_catalog_client.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\logical_clock.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\logical_clock_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\global_settings.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\repl_settings.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl\\repl_settings_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\keys_collection_document.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\time_proof_service.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\logical_time.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\operation_time_tracker.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\auth\\action_set.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\auth\\action_type.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\auth\\impersonation_session.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\auth\\privilege.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\auth\\privilege_parser.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\auth\\resource_pattern.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\auth\\user_management_commands_parser.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\metadata\\impersonated_user_metadata.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\rpc\\metadata\\impersonated_user_metadata_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\server_options_helpers.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\server_options_helpers_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\cmdline_utils\\censor_cmdline.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\field_ref.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\field_ref_set.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\field_parser.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\keypattern.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\write_concern_options.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\index_names.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\commands\\test_commands_enabled.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\commands\\test_commands_enabled_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\commands\\server_status_internal.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\commands\\server_status_metric.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\auth\\address_restriction.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\auth\\address_restriction_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\auth\\restriction_environment.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\bson\\mutable\\document.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\bson\\mutable\\element.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\safe_num.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\auth\\authorization_manager.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\auth\\authorization_session.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\auth\\auth_decorations.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\auth\\user_name.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\auth\\role_name.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\client\\read_preference.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\baton.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\client.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\default_baton.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\operation_context.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\operation_context_group.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\service_context.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\server_recovery.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\unclean_shutdown.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\repl_set_member_in_standalone_mode.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\periodic_runner.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\background_thread_clock_source.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\clock_source.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\fast_clock_source_factory.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\storage\\write_unit_of_work.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\fail_point.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\fail_point_registry.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\fail_point_service.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\fail_point_server_parameter_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\storage\\storage_options.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\storage\\storage_parameters_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\multi_key_path_tracker.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\logical_session_id.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\logical_session_id_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\idl\\server_parameter.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\idl\\server_parameter_with_storage.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\options_parser\\constraints.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\options_parser\\environment.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\options_parser\\option_description.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\options_parser\\option_section.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\options_parser\\options_parser.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\options_parser\\startup_option_init.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\options_parser\\startup_options.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\options_parser\\value.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\shim_yaml.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\binary.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\contrib\\graphbuilder.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\contrib\\graphbuilderadapter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\convert.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\directives.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\emit.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\emitfromevents.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\emitter.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\emitterstate.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\emitterutils.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\exceptions.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\exp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\memory.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\node.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\node_data.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\nodebuilder.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\nodeevents.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\null.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\ostream_wrapper.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\parse.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\parser.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\regex_yaml.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\scanner.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\scanscalar.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\scantag.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\scantoken.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\simplekey.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\singledocparser.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\stream.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\yaml-cpp-0.6.2\\src\\tag.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\cidr.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\hostandport.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\hostname_canonicalization.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\sockaddr.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\socket_exception.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\socket_utils.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\hostandport_gen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\winutil.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\concurrency\\spin_lock.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\net\\http_client_winhttp.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\idl\\idl_parser.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\command_generic_argument.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\crypto\\sha_block_windows.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\crypto\\sha1_block.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\crypto\\sha256_block.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\secure_compare_memory.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\secure_allocator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\secure_zero_memory.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\processinfo.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\processinfo_windows.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\db\\server_options.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\bson\\util\\bson_extract.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\data_range.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\data_range_cursor.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\data_type.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\data_type_string_data.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\data_type_terminated.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\error_codes.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\error_extra_info.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\global_initializer.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\global_initializer_registerer.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\init.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\initializer.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\initializer_dependency_graph.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\make_string_vector.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\parse_number.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\shim.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\simple_string_data_comparator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\status.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\string_data.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\transaction_error.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\base\\validate_locale.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\bson\\bson_comparator_interface_base.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\bson\\bson_depth.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\bson\\bson_validate.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\bson\\bsonelement.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\bson\\bsonmisc.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\bson\\bsonobj.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\bson\\bsonobjbuilder.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\bson\\bsontypes.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\bson\\json.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\bson\\oid.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\bson\\simple_bsonelement_comparator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\bson\\simple_bsonobj_comparator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\bson\\timestamp.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\logger\\component_message_log_domain.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\logger\\console.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\logger\\log_component.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\logger\\log_component_settings.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\logger\\log_manager.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\logger\\log_severity.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\logger\\logger.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\logger\\logstream_builder.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\logger\\message_event_utf8_encoder.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\logger\\message_log_domain.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\logger\\ramlog.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\logger\\redaction.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\logger\\rotatable_file_manager.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\logger\\rotatable_file_writer.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\platform\\decimal128.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\platform\\mutex.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\platform\\posix_fadvise.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\platform\\process_id.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\platform\\random.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\platform\\shared_library.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\platform\\shared_library_windows.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\platform\\stack_locator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\platform\\stack_locator_windows.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\platform\\strcasestr.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\platform\\strnlen.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\allocator.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\assert_util.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\base64.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\boost_assert_impl.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\concurrency\\idle_thread_block.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\concurrency\\thread_name.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\duration.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\errno_util.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\exception_filter_win32.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\exit.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\file.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\hex.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\itoa.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\log.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\platform_init.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\shell_exec.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\signal_handlers_synchronous.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\stacktrace.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\stacktrace_windows.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\startup_test.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\str.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\system_clock_source.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\system_tick_source.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\text.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\time_support.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\timer.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\uuid.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\version.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\shim_pcrecpp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_byte_order.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_compile.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_config.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_dfa_exec.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_exec.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_fullinfo.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_get.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_globals.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_maketables.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_newline.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_ord2utf8.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_refcount.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_string_utils.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_study.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_tables.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_ucd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_valid_utf8.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_version.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_xclass.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_chartables.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcrecpp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_scanner.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\pcre-8.42\\pcre_stringpiece.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\shim_intel_decimal128.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_exception.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_four_over_pi.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_bessel.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_bid.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_cbrt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_erf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_exp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_int.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_inv_hyper.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_inv_trig.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_lgamma.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_log.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_mod.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_ops.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_ops_64.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_pow.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_powi.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_sqrt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_trig.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\sqrt_tab_t.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_2_str_tables.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_acos.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_acosh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_add.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_asin.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_asinh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_atan.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_atan2.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_atanh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_cbrt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_compare.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_cos.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_cosh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_div.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_erf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_erfc.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_exp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_exp10.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_exp2.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_expm1.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_fdimd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_fma.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_fmod.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_frexp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_hypot.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_ldexp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_lgamma.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_llrintd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log10.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log1p.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log2.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_logb.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_logbd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_lrintd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_lround.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_minmax.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_modf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_mul.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_nearbyintd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_next.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_nexttowardd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_noncomp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_pow.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_quantexpd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_quantize.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_rem.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_round_integral.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_scalb.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_scalbl.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_sin.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_sinh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_sqrt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_string.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_tan.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_tanh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_tgamma.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int16.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int32.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int64.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int8.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint16.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint32.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint64.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint8.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_acos.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_acosh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_add.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_asin.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_asinh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_atan.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_atan2.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_atanh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_cbrt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_compare.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_cos.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_cosh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_div.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_erf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_erfc.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_exp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_exp10.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_exp2.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_expm1.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_fdimd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_fma.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_fmod.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_frexp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_hypot.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_ldexp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_lgamma.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_llrintd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log10.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log1p.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log2.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_logb.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_logbd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_lrintd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_lround.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_minmax.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_modf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_mul.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_nearbyintd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_next.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_nexttowardd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_noncomp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_pow.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_quantexpd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_quantize.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_rem.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_round_integral.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_scalb.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_scalbl.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sin.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sinh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sqrt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_string.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sub.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_tan.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_tanh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_tgamma.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_bid128.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_bid64.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int16.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int32.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int64.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int8.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint16.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint32.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint64.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint8.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_acos.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_acosh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_add.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_asin.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_asinh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_atan.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_atan2.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_atanh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_cbrt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_compare.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_cos.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_cosh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_div.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_erf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_erfc.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_exp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_exp10.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_exp2.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_expm1.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_fdimd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_fma.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_fmod.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_frexp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_hypot.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_ldexp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_lgamma.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_llrintd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log10.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log1p.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log2.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_logb.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_logbd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_lrintd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_lround.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_minmax.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_modf.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_mul.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_nearbyintd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_next.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_nexttowardd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_noncomp.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_pow.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_quantexpd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_quantize.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_rem.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_round_integral.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_scalb.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_scalbl.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_sin.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_sinh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_sqrt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_string.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_tan.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_tanh.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_tgamma.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_bid128.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int16.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int32.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int64.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int8.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint16.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint32.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint64.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint8.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_binarydecimal.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_convert_data.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_decimal_data.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_decimal_globals.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_dpd.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_feclearexcept.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_fegetexceptflag.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_feraiseexcept.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_fesetexceptflag.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_fetestexcept.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_flag_operations.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_from_int.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_round.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\strtod128.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\strtod32.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\strtod64.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\wcstod128.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\wcstod32.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\wcstod64.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\shim_fmt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\fmt\\dist\\src\\format.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\fmt\\dist\\src\\posix.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\shim_boost.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\cmdline.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\config_file.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\convert.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\options_description.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\parsers.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\positional_options.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\split.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\utf8_codecvt_facet.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\value_semantic.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\variables_map.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\program_options\\src\\winmain.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\iostreams\\src\\file_descriptor.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\iostreams\\src\\mapped_file.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\codecvt_error_category.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\operations.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\path.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\path_traits.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\portability.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\unique_path.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\utf8_codecvt_facet.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\windows_file_codecvt.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\boost-1.70.0\\libs\\system\\src\\error_code.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\shim_abseil.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\hash\\internal\\city.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\hash\\internal\\hash.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\murmurhash3\\MurmurHash3.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\quick_exit.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\shim_allocator.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\base\\dynamic_annotations.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\base\\elf_mem_image.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\base\\logging.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\base\\spinlock.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\base\\spinlock_internal.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\base\\sysinfo.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\base\\vdso_support.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\central_freelist.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\common.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\internal_logging.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\malloc_extension.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\malloc_hook.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\memfs_malloc.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\page_heap.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\sampler.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\span.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\stack_trace_table.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\stacktrace.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\static_vars.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\symbolize.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\thread_cache.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\tcmalloc.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\windows\\port.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\windows\\system-alloc.obj\" \"E:\\robo-shell\\build\\debug\\third_party\\gperftools-2.7\\dist\\src\\fake_stacktrace_scope.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\debugger.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\util\\boost_assert_shim.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\dbshell.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\mongodbcr.obj\" \"E:\\robo-shell\\build\\debug\\mongo\\shell\\shell_options_init.obj\" Crypt32.lib Secur32.lib Dnsapi.lib winhttp.lib \"..\\third-party\\libssh2-1.9.0\\Debug\\libssh2.lib\" \"E:\\openssl-1.1.1f\\libssl.lib\" \"E:\\openssl-1.1.1f\\libcrypto.lib\" ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib psapi.lib bcrypt.lib Iphlpapi.lib dbghelp.lib ws2_32.lib winmm.lib version.lib /MANIFEST /MANIFESTUAC:\"level='asInvoker' uiAccess='false'\" /manifest:embed /DEBUG /PDB:\"E:/robo/build/Debug/src/robomongo/Debug/robo3t.pdb\" /SUBSYSTEM:WINDOWS /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:\"E:/robo/build/Debug/src/robomongo/Debug/robo3t.lib\" /MACHINE:X64  /machine:x64 robomongo.dir\\Debug\\winres.res\n  robomongo.dir\\Debug\\main.obj\n  robomongo.dir\\Debug\\QtUtils.obj\n  robomongo.dir\\Debug\\StdUtils.obj\n  robomongo.dir\\Debug\\Logger.obj\n  robomongo.dir\\Debug\\HexUtils.obj\n  robomongo.dir\\Debug\\BsonUtils.obj\n  robomongo.dir\\Debug\\CredentialSettings.obj\n  robomongo.dir\\Debug\\ConnectionSettings.obj\n  robomongo.dir\\Debug\\Event.obj\n  robomongo.dir\\Debug\\Enums.obj\n  robomongo.dir\\Debug\\EventError.obj\n  robomongo.dir\\Debug\\EventBusSubscriber.obj\n  robomongo.dir\\Debug\\EventBusDispatcher.obj\n  robomongo.dir\\Debug\\EventWrapper.obj\n  robomongo.dir\\Debug\\EventBus.obj\n  robomongo.dir\\Debug\\KeyboardManager.obj\n  robomongo.dir\\Debug\\MongoNamespace.obj\n  robomongo.dir\\Debug\\MongoFunction.obj\n  robomongo.dir\\Debug\\MongoUtils.obj\n  robomongo.dir\\Debug\\MongoCollection.obj\n  robomongo.dir\\Debug\\MongoCollectionInfo.obj\n  robomongo.dir\\Debug\\MongoQueryInfo.obj\n  robomongo.dir\\Debug\\CursorPosition.obj\n  robomongo.dir\\Debug\\ScriptInfo.obj\n  robomongo.dir\\Debug\\MongoEventsInfo.obj\n  robomongo.dir\\Debug\\ptimeutil.obj\n  robomongo.dir\\Debug\\json.obj\n  robomongo.dir\\Debug\\ScriptEngine.obj\n  robomongo.dir\\Debug\\MongoEvents.obj\n  robomongo.dir\\Debug\\MongoDocument.obj\n  robomongo.dir\\Debug\\AppStyle.obj\n  robomongo.dir\\Debug\\MongoServer.obj\n  robomongo.dir\\Debug\\MongoShell.obj\n  robomongo.dir\\Debug\\MongoDatabase.obj\n  robomongo.dir\\Debug\\App.obj\n  robomongo.dir\\Debug\\MongoClient.obj\n  robomongo.dir\\Debug\\MongoWorker.obj\n  robomongo.dir\\Debug\\ReplicaSet.obj\n  robomongo.dir\\Debug\\SettingsManager.obj\n  robomongo.dir\\Debug\\AppRegistry.obj\n  robomongo.dir\\Debug\\StringOperations.obj\n  robomongo.dir\\Debug\\common.obj\n  robomongo.dir\\Debug\\SimpleCrypt.obj\n  robomongo.dir\\Debug\\RoboCrypt.obj\n  robomongo.dir\\Debug\\GuiRegistry.obj\n  robomongo.dir\\Debug\\AboutDialog.obj\n  robomongo.dir\\Debug\\EulaDialog.obj\n  robomongo.dir\\Debug\\ConnectionAdvancedTab.obj\n  robomongo.dir\\Debug\\ConnectionAuthTab.obj\n  robomongo.dir\\Debug\\ConnectionBasicTab.obj\n  robomongo.dir\\Debug\\ConnectionDiagnosticDialog.obj\n  robomongo.dir\\Debug\\ConnectionDialog.obj\n  robomongo.dir\\Debug\\CopyCollectionDialog.obj\n  robomongo.dir\\Debug\\IndicatorLabel.obj\n  robomongo.dir\\Debug\\CreateCollectionDialog.obj\n  robomongo.dir\\Debug\\CreateDatabaseDialog.obj\n  robomongo.dir\\Debug\\CreateUserDialog.obj\n  robomongo.dir\\Debug\\ComboBoxUtils.obj\n  robomongo.dir\\Debug\\DialogUtils.obj\n  robomongo.dir\\Debug\\PreferencesDialog.obj\n  robomongo.dir\\Debug\\ConnectionsDialog.obj\n  robomongo.dir\\Debug\\ExportDialog.obj\n  robomongo.dir\\Debug\\ChangeShellTimeoutDialog.obj\n  robomongo.dir\\Debug\\PlainJavaScriptEditor.obj\n  robomongo.dir\\Debug\\JSLexer.obj\n  robomongo.dir\\Debug\\FindFrame.obj\n  robomongo.dir\\Debug\\AddEditIndexDialog.obj\n  robomongo.dir\\Debug\\ScriptWidget.obj\n  robomongo.dir\\Debug\\ExplorerCollectionTreeItem.obj\n  robomongo.dir\\Debug\\ExplorerCollectionIndexesDir.obj\n  robomongo.dir\\Debug\\ExplorerCollectionIndexItem.obj\n  robomongo.dir\\Debug\\ExplorerTreeItem.obj\n  robomongo.dir\\Debug\\ExplorerReplicaSetFolderItem.obj\n  robomongo.dir\\Debug\\ExplorerReplicaSetTreeItem.obj\n  robomongo.dir\\Debug\\ExplorerDatabaseTreeItem.obj\n  robomongo.dir\\Debug\\ExplorerDatabaseCategoryTreeItem.obj\n  robomongo.dir\\Debug\\ExplorerUserTreeItem.obj\n  robomongo.dir\\Debug\\ExplorerFunctionTreeItem.obj\n  robomongo.dir\\Debug\\DocumentTextEditor.obj\n  robomongo.dir\\Debug\\FunctionTextEditor.obj\n  robomongo.dir\\Debug\\ExplorerServerTreeItem.obj\n  robomongo.dir\\Debug\\ExplorerTreeWidget.obj\n  robomongo.dir\\Debug\\ExplorerWidget.obj\n  robomongo.dir\\Debug\\BsonTableModel.obj\n  robomongo.dir\\Debug\\BsonTableView.obj\n  robomongo.dir\\Debug\\BsonTreeItem.obj\n  robomongo.dir\\Debug\\BsonTreeModel.obj\n  robomongo.dir\\Debug\\BsonTreeView.obj\n  robomongo.dir\\Debug\\Notifier.obj\n  robomongo.dir\\Debug\\CollectionStatsTreeItem.obj\n  robomongo.dir\\Debug\\CollectionStatsTreeWidget.obj\n  robomongo.dir\\Debug\\JsonPrepareThread.obj\n  robomongo.dir\\Debug\\OutputItemContentWidget.obj\n  robomongo.dir\\Debug\\OutputItemHeaderWidget.obj\n  robomongo.dir\\Debug\\OutputWidget.obj\n  robomongo.dir\\Debug\\PagingWidget.obj\n  robomongo.dir\\Debug\\ProgressBarPopup.obj\n  robomongo.dir\\Debug\\QueryWidget.obj\n  robomongo.dir\\Debug\\WorkAreaTabBar.obj\n  robomongo.dir\\Debug\\WorkAreaTabWidget.obj\n  robomongo.dir\\Debug\\WelcomeTab.obj\n  robomongo.dir\\Debug\\LogWidget.obj\n  robomongo.dir\\Debug\\MainWindow.obj\n  robomongo.dir\\Debug\\SSHTunnelTab.obj\n  robomongo.dir\\Debug\\SSLTab.obj\n  robomongo.dir\\Debug\\SshSettings.obj\n  robomongo.dir\\Debug\\SslSettings.obj\n  robomongo.dir\\Debug\\ReplicaSetSettings.obj\n  robomongo.dir\\Debug\\SshTunnelWorker.obj\n  robomongo.dir\\Debug\\mocs_compilation.obj\n  robomongo.dir\\Debug\\qrc_robo.obj\n  robomongo.dir\\Debug\\qrc_gui.obj\n     Creating library E:/robo/build/Debug/src/robomongo/Debug/robo3t.lib and object E:/robo/build/Debug/src/robomongo/Debug/robo3t.exp\n  robomongo.vcxproj -> E:\\robo\\build\\Debug\\src\\robomongo\\Debug\\robo3t.exe\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(283): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(286): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(289): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(292): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(296): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(60): warning C26495: Variable 'QMatrix::_m22' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(70): warning C26495: Variable 'QMatrix::_m22' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::destroyer' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qpalette.h(71): warning C26495: Variable 'QPalette::<anonymous-tag>::for_faster_swapping_dont_use' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qfontmetrics.h(149): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(822): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2309): warning C26495: Variable 'fmt::v5::system_error::error_code_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2964): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2965): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2966): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2967): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2968): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2969): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(246): warning C26495: Variable 'absl::AlphaNum::digits_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(247): warning C26495: Variable 'absl::AlphaNum::digits_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(387): warning C6001: Using uninitialized memory 'result'. [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\oid.h(89): warning C26495: Variable 'mongo::OID::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\oid.h(241): warning C26495: Variable 'mongo::OID::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(442): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(454): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(700): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonmisc.h(251): warning C26495: Variable 'mongo::BSONSizeTracker::_sizes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonobjbuilder.h(158): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\rpc\\op_msg.h(325): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\interruptible.h(139): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\interruptible.h(180): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\intrusive_counter.h(123): warning C26495: Variable 'mongo::RCString::_size' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\future_impl.h(716): warning C26495: Variable 'mongo::future_details::SharedStateHolder<void>::_inner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\db\\baton.h(118): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\db\\baton.h(123): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\platform\\process_id.h(68): warning C26495: Variable 'mongo::ProcessId::_npid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\concurrency\\spin_lock.h(51): warning C6031: Return value ignored: 'InitializeCriticalSectionAndSpinCount'. [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\db\\write_concern_options.h(60): warning C26495: Variable 'mongo::WriteConcernOptions::wNumNodes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\client\\dbclient_cursor.h(105): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongoshellresult.h(55): warning C26495: Variable 'Robomongo::MongoShellExecResult::_isCurrentServerValid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongoshellresult.h(70): warning C26495: Variable 'Robomongo::MongoShellExecResult::_isCurrentServerValid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongocollectioninfo.h(10): warning C26495: Variable 'Robomongo::MongoCollectionInfo::_storageSizeBytes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(918): warning C26495: Variable 'Robomongo::ExecuteQueryResponse::resultIndex' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(989): warning C26495: Variable 'Robomongo::ExecuteScriptResponse::empty' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1087): warning C26495: Variable 'Robomongo::DocumentListLoadedEvent::_resultIndex' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1111): warning C26495: Variable 'Robomongo::ScriptExecutedEvent::_empty' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1195): warning C26495: Variable 'Robomongo::EstablishSshConnectionResponse::localport' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\base\\encoded_value_storage.h(47): warning C26495: Variable 'mongo::EncodedValueStorage<mongo::QueryResult::Layout,mongo::QueryResult::ConstView,mongo::QueryResult::View>::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(205): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::future_details::FakeVoid>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\decimal_counter.h(48): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(194): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::SourceLocationHolder>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(840): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\util\\builder.h(119): warning C26495: Variable 'mongo::StackAllocator::_ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(146): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::Timestamp>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(152): warning C26495: Variable 'boost::optional_detail::optional_base<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\detail\\optional_trivially_copyable_base.hpp(29): warning C26495: Variable 'boost::optional_detail::tc_optional_base<bool>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\detail\\optional_trivially_copyable_base.hpp(25): warning C26495: Variable 'boost::optional_detail::tc_optional_base<bool>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(162): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::UUID>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(140): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::UUID>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(904): warning C26495: Variable 'absl::container_internal::raw_hash_set<absl::container_internal::NodeHashSetPolicy<mongo::BSONObj>,mongo::HashImprover<mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::Hasher,mongo::BSONObj>,mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::EqualTo,std::allocator<mongo::BSONObj> >::ctrl_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(1563): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_size' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\base\\data_range.h(117): warning C26495: Variable 'mongo::ConstDataRange::_end' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonobj.h(136): warning C26495: Variable 'mongo::BSONObj::_objdata' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\base\\status_with.h(133): warning C26495: Variable 'mongo::StatusWith<char>::_status' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\base\\data_range.h(112): warning C26495: Variable 'mongo::ConstDataRange::_end' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(856): warning C26495: Variable 'absl::container_internal::raw_hash_set<absl::container_internal::NodeHashSetPolicy<mongo::BSONObj>,mongo::HashImprover<mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::Hasher,mongo::BSONObj>,mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::EqualTo,std::allocator<mongo::BSONObj> >::ctrl_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\core.h(1277): warning C26495: Variable 'fmt::v5::basic_format_args<fmt::v5::basic_format_context<std::back_insert_iterator<fmt::v5::internal::basic_buffer<char> >,char> >::<anonymous-tag>::args_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1410): warning C6387: 'value' could be '0':  this does not adhere to the specification for the function 'std::char_traits<char>::length'.  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\core.h(345): warning C26495: Variable 'std::back_insert_iterator<fmt::v5::internal::basic_buffer<char> >::container' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1516): warning C26498: The function 'std::numeric_limits<int>::max' is constexpr, mark variable 'max_int' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2479): warning C26495: Variable 'fmt::v5::basic_writer<fmt::v5::back_insert_range<fmt::v5::internal::basic_buffer<char> > >::int_writer<unsigned __int64,fmt::v5::basic_format_specs<char> >::prefix' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(603): warning C26495: Variable 'fmt::v5::internal::counting_iterator<char>::blackhole_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(1668): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2599): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2599): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1122): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1126): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(771): warning C26495: Variable 'absl::container_internal::raw_hash_set<absl::container_internal::NodeHashSetPolicy<mongo::BSONObj>,mongo::HashImprover<mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::Hasher,mongo::BSONObj>,mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::EqualTo,std::allocator<mongo::BSONObj> >::iterator::slot_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(144): warning C26495: Variable 'QStyleOptionFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(172): warning C26495: Variable 'QStyleOptionTabWidgetFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(196): warning C26495: Variable 'QStyleOptionTabBarBase::documentMode' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(227): warning C26495: Variable 'QStyleOptionHeader::selectedPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(286): warning C26495: Variable 'QStyleOptionTab::row' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(316): warning C26495: Variable 'QStyleOptionToolBar::positionWithinLine' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(343): warning C26495: Variable 'QStyleOptionProgressBar::progress' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(373): warning C26495: Variable 'QStyleOptionMenuItem::menuHasCheckableItems' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(392): warning C26495: Variable 'QStyleOptionDockWidget::verticalTitleBar' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(443): warning C26495: Variable 'QStyleOptionViewItem::textElideMode' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(473): warning C26495: Variable 'QStyleOptionToolBox::position' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(492): warning C26495: Variable 'QStyleOptionRubberBand::shape' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(534): warning C26495: Variable 'QStyleOptionSlider::tickPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(553): warning C26495: Variable 'QStyleOptionSpinBox::frame' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(580): warning C26495: Variable 'QStyleOptionToolButton::arrowType' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(602): warning C26495: Variable 'QStyleOptionComboBox::editable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(620): warning C26495: Variable 'QStyleOptionTitleBar::titleBarState' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(640): warning C26495: Variable 'QStyleOptionGroupBox::midLineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(654): warning C26495: Variable 'QStyleOptionSizeGrip::corner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(670): warning C26495: Variable 'QStyleOptionGraphicsItem::levelOfDetail' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2304): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(491): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(492): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(493): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(494): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(495): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(498): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(504): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(25): warning C28251: Inconsistent annotation for 'GetSystemTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(103).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(29): warning C28251: Inconsistent annotation for 'GetSystemTimeAsFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(111).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(33): warning C28251: Inconsistent annotation for 'SystemTimeToFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\timezoneapi.h(93).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(38): warning C28251: Inconsistent annotation for 'FileTimeToSystemTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\timezoneapi.h(83).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(45): warning C28251: Inconsistent annotation for 'FileTimeToLocalFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\fileapi.h(171).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(50): warning C28251: Inconsistent annotation for 'LocalFileTimeToFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\fileapi.h(963).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(58): warning C28251: Inconsistent annotation for 'GetTickCount': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(168).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(133): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(695): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(613): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\date_time\\date_formatting.hpp(89): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\date_time\\date_formatting.hpp(91): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\converter_lexical_streams.hpp(162): warning C26495: Variable 'boost::detail::lexical_istream_limited_src<char,std::char_traits<char>,0,39>::finish' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\lcast_unsigned_converters.hpp(191): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\lcast_unsigned_converters.hpp(262): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\quuid.h(68): warning C26495: Variable 'QUuid::data4' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\function\\function_base.hpp(611): warning C26495: Variable 'boost::function_base::functor' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qvector2d.h(60): warning C26495: Variable 'QVector2D::v' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongoutils.cpp(12): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongodatabase.h(131): warning C26495: Variable 'Robomongo::MongoDatabaseUsersLoadedEvent::_database' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongodatabase.h(151): warning C26495: Variable 'Robomongo::MongoDatabaseFunctionsLoadedEvent::_database' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongocollectioninfo.cpp(7): warning C26495: Variable 'Robomongo::MongoCollectionInfo::_sizeBytes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongoqueryinfo.cpp(31): warning C26495: Variable 'Robomongo::MongoQueryInfo::_options' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(110): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(171): warning C6054: String 'sday' might not be zero-terminated. [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(140): warning C6054: String 'gmt' might not be zero-terminated. [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(143): warning C6054: String 'smon' might not be zero-terminated. [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(223): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(269): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(390): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\platform\\strtoll.h(35): warning C28251: Inconsistent annotation for 'strtoll': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\ucrt\\stdlib.h(539).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\platform\\strtoll.h(39): warning C28251: Inconsistent annotation for 'strtoull': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\ucrt\\stdlib.h(569).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(249): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(669): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(771): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(792): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(1099): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\assertions.h(59): warning C28251: Inconsistent annotation for 'TerminateProcess': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\processthreadsapi.h(143).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(1348): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\callargs.h(306): warning C6001: Using uninitialized memory 'args'. [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(636): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6470): warning C26495: Variable 'JS::FirstSubsumedFrame::cx' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6470): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6478): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\get_last_error.hpp(20): warning C28251: Inconsistent annotation for 'GetLastError': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\errhandlingapi.h(89).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(25): warning C28251: Inconsistent annotation for 'FormatMessageA': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(2408).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(36): warning C28251: Inconsistent annotation for 'FormatMessageW': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(2423).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(47): warning C28251: Inconsistent annotation for 'SetErrorMode': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\errhandlingapi.h(131).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\character_code_conversion.hpp(21): warning C28251: Inconsistent annotation for 'MultiByteToWideChar': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\stringapiset.h(126).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\character_code_conversion.hpp(30): warning C28251: Inconsistent annotation for 'WideCharToMultiByte': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\stringapiset.h(141).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(27): warning C28251: Inconsistent annotation for 'LocalAlloc': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1112).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(32): warning C28251: Inconsistent annotation for 'LocalReAlloc': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1122).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(37): warning C28251: Inconsistent annotation for 'LocalFree': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1200).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(211): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(211): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(216): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\engine\\scriptengine.cpp(230): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\bufferlist.h(101): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(262): warning C26495: Variable 'JS::Heap<JSObject *>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(254): warning C26495: Variable 'JS::Heap<JSObject *>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(969): warning C26495: Variable 'JS::Rooted<JSObject *>::stack' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(962): warning C26495: Variable 'JS::Rooted<JSObject *>::stack' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\vector.h(877): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\variant.h(568): warning C26495: Variable 'mozilla::Variant<char const *,mozilla::UniquePtr<char [0],JS::FreePolicy> >::rawData' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\vector.h(408): warning C26495: Variable 'mozilla::Vector<mozilla::BufferList<js::SystemAllocPolicy>::Segment,1,js::SystemAllocPolicy>::CRAndStorage<1,0>::mBytes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\mongodb\\mongoworker.cpp(1020): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonvalue.h(149): warning C26495: Variable 'QJsonValue::<anonymous-tag>::base' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonarray.h(62): warning C26495: Variable 'QJsonArray::d' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\settings\\settingsmanager.cpp(99): warning C26495: Variable 'Robomongo::SettingsManager::_autoExpand' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonobject.h(64): warning C26495: Variable 'QJsonObject::o' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(30): warning C26495: Variable 'Robomongo::EulaDialog::_reply' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(29): warning C26495: Variable 'Robomongo::ConnectionBasicTab::_discoverButton' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(339): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(339): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qsciscintilla.h(2078): warning C26495: Variable 'QsciScintilla::FindState::wrap' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(44): warning C26495: Variable 'Robomongo::CreateCollectionDialog::_cappedCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(53): warning C26495: Variable 'Robomongo::CreateUserDialog::_readOnlyCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(128): warning C26495: Variable 'Robomongo::CreateUserDialog::_userSourceComboBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(43): warning C26495: Variable 'Robomongo::ConnectionListWidgetItem::_connection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(107): warning C26495: Variable 'Robomongo::ConnectionsDialog::_selectedConnection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\changeshelltimeoutdialog.cpp(29): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\changeshelltimeoutdialog.cpp(30): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(33): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(75): warning C26495: Variable 'Robomongo::AddEditIndexDialog::_jsonText' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexitem.cpp(25): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexitem.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerwidget.cpp(170): warning C28182: Dereferencing NULL pointer. 'item' contains the same NULL value as 'collectionItem' did.  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontablemodel.cpp(12): warning C26495: Variable 'Robomongo::BsonTableModelProxy::_root' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeitem.h(19): warning C26495: Variable 'Robomongo::BsonItemFields::_type' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(320): warning C6001: Using uninitialized memory 'mainWindow'. [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(27): warning C26495: Variable 'Robomongo::OutputItemContentWidget::_collectionStats' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(57): warning C26495: Variable 'Robomongo::OutputItemContentWidget::_collectionStats' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(19): warning C26495: Variable 'Robomongo::OutputWidget::_prevResultsCount' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(122): warning C26495: Variable 'Robomongo::WelcomeTab::_clearButton' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"robomongo.dir\\Debug\\robomongo.tlog\\unsuccessfulbuild\".\n  Touching \"robomongo.dir\\Debug\\robomongo.tlog\\robomongo.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\server.vcxproj\" (13) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"server.dir\\Debug\\\".\n  Creating directory \"server.dir\\Debug\\server.tlog\\\".\nInitializeBuildStatus:\n  Creating \"server.dir\\Debug\\server.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/robomongo/ssh/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Debug/src/robomongo/ssh/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /IE:\\robo\\build\\Debug\\src /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\openssl-1.1.1f\\include\" /Zi /nologo /W3 /WX- /diagnostics:classic /MP /Od /Ob0 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D \"CMAKE_INTDIR=\\\"Debug\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo\"server.dir\\Debug\\\\\" /Fd\"server.dir\\Debug\\vc141.pdb\" /Gd /TC /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" E:\\robo\\src\\robomongo\\ssh\\server.c\n  server.c\nLink:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe /ERRORREPORT:QUEUE /OUT:\"E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\Debug\\server.exe\" /INCREMENTAL /NOLOGO Debug\\ssh.lib \"..\\..\\third-party\\libssh2-1.9.0\\Debug\\libssh2.lib\" \"E:\\openssl-1.1.1f\\libssl.lib\" \"E:\\openssl-1.1.1f\\libcrypto.lib\" ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:\"level='asInvoker' uiAccess='false'\" /manifest:embed /DEBUG /PDB:\"E:/robo/build/Debug/src/robomongo/ssh/Debug/server.pdb\" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:\"E:/robo/build/Debug/src/robomongo/ssh/Debug/server.lib\" /MACHINE:X64  /machine:x64 server.dir\\Debug\\server.obj\n  server.vcxproj -> E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\Debug\\server.exe\nFinalizeBuildStatus:\n  Deleting file \"server.dir\\Debug\\server.tlog\\unsuccessfulbuild\".\n  Touching \"server.dir\\Debug\\server.tlog\\server.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\server.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh_test.vcxproj\" (14) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"ssh_test.dir\\Debug\\\".\n  Creating directory \"ssh_test.dir\\Debug\\ssh_test.tlog\\\".\nInitializeBuildStatus:\n  Creating \"ssh_test.dir\\Debug\\ssh_test.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/robomongo/ssh/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Debug/src/robomongo/ssh/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /IE:\\robo\\build\\Debug\\src /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\openssl-1.1.1f\\include\" /Zi /nologo /W3 /WX- /diagnostics:classic /MP /Od /Ob0 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D \"CMAKE_INTDIR=\\\"Debug\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo\"ssh_test.dir\\Debug\\\\\" /Fd\"ssh_test.dir\\Debug\\vc141.pdb\" /Gd /TC /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" E:\\robo\\src\\robomongo\\ssh\\test.c\n  test.c\nLink:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe /ERRORREPORT:QUEUE /OUT:\"E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\Debug\\ssh_test.exe\" /INCREMENTAL /NOLOGO Debug\\ssh.lib \"..\\..\\third-party\\libssh2-1.9.0\\Debug\\libssh2.lib\" \"E:\\openssl-1.1.1f\\libssl.lib\" \"E:\\openssl-1.1.1f\\libcrypto.lib\" ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:\"level='asInvoker' uiAccess='false'\" /manifest:embed /DEBUG /PDB:\"E:/robo/build/Debug/src/robomongo/ssh/Debug/ssh_test.pdb\" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:\"E:/robo/build/Debug/src/robomongo/ssh/Debug/ssh_test.lib\" /MACHINE:X64  /machine:x64 ssh_test.dir\\Debug\\test.obj\n  ssh_test.vcxproj -> E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\Debug\\ssh_test.exe\ne:\\robo\\src\\robomongo\\ssh\\test.c(135): warning C6011: Dereferencing NULL pointer 'elem3'.  [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh_test.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\test.c(136): warning C6011: Dereferencing NULL pointer 'elem4'.  [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh_test.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\test.c(134): warning C6011: Dereferencing NULL pointer 'elem2'.  [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh_test.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\test.c(137): warning C6011: Dereferencing NULL pointer 'elem5'.  [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh_test.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\test.c(133): warning C6011: Dereferencing NULL pointer 'elem1'.  [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh_test.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"ssh_test.dir\\Debug\\ssh_test.tlog\\unsuccessfulbuild\".\n  Touching \"ssh_test.dir\\Debug\\ssh_test.tlog\\ssh_test.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh_test.vcxproj\" (default targets).\nPrepareForBuild:\n  Creating directory \"x64\\Debug\\ALL_BUILD\\\".\n  Creating directory \"x64\\Debug\\ALL_BUILD\\ALL_BUILD.tlog\\\".\nInitializeBuildStatus:\n  Creating \"x64\\Debug\\ALL_BUILD\\ALL_BUILD.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Debug/CMakeFiles/generate.stamp is up-to-date.\nFinalizeBuildStatus:\n  Deleting file \"x64\\Debug\\ALL_BUILD\\ALL_BUILD.tlog\\unsuccessfulbuild\".\n  Touching \"x64\\Debug\\ALL_BUILD\\ALL_BUILD.tlog\\ALL_BUILD.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (default targets).\n\nBuild succeeded.\n\n\"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj\" (default target) (3) ->\n(RunNativeCodeAnalysis target) -> \n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::link_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2258): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2254): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2252): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2250): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n\n\n\"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj\" (default target) (4) ->\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::link_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2258): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2254): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2252): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2250): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n\n\n\"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj\" (default target) (5) ->\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::link_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n\n\n\"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj\" (default target) (6) ->\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::link_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::link_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n\n\n\"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj\" (default target) (7) ->\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1913): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1914): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1950): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1950): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(277): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(277): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(300): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(300): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\bcrypt_pbkdf.c(119): warning C6260: sizeof * sizeof is usually wrong.  Did you intend to use a character count or a byte count? [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(150): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(555): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(814): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(814): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(947): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(947): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(1843): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(166): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(400): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(596): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(605): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(648): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(657): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(698): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(726): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(857): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1090): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1289): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1297): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1339): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1347): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1387): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1414): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2202): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2326): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2334): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2376): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2384): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2424): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2451): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2835): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2935): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2943): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2985): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2993): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(3033): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(3060): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(4269): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(4274): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\misc.c(282): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\misc.c(481): warning C6386: Buffer overrun while writing to 'buffer+msglen':  the writable size is '1536' bytes, but '1537' bytes might be written. [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(155): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(169): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(311): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(322): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(785): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(830): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(582): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\pem.c(150): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\pem.c(535): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\publickey.c(959): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(176): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(217): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(1142): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(1142): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(876): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3241): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3241): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3346): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3448): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3448): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3586): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3586): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(90): warning C6386: Buffer overrun while writing to 'buffer':  the writable size is '256' bytes, but 'used++' bytes might be written. [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(370): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(457): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(487): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(488): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(79): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(231): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(373): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(373): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1168): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1283): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1665): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1663): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1662): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1662): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1661): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1661): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1659): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1990): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n\n\n\"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj\" (default target) (8) ->\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::strongref' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\parser.cpp(33): warning C26495: Variable 'QJson::ParserPrivate::m_errorLine' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_size' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\qobjecthelper.h(130): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(3799): warning C26495: Variable 'yyFlexLexer::yy_hold_char' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\flexlexer.h(99): warning C26495: Variable 'FlexLexer::yy_flex_debug' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4008): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4010): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4010): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4089): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4223): warning C6011: Dereferencing NULL pointer 'yy_buffer_stack'.  [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4256): warning C6011: Dereferencing NULL pointer 'b'.  [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4314): warning C6011: Dereferencing NULL pointer 'b'. See line 4302 for an earlier location where this can occur [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\debug\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4370): warning C6011: Dereferencing NULL pointer 'yy_buffer_stack'.  [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\json_scanner.cpp(35): warning C26495: Variable 'JSonScanner::m_yylval' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(491): warning C6011: Dereferencing NULL pointer 'd'.  [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(535): warning C26498: The function 'qMetaTypeId<QMap<QString,QVariant> * __ptr64>' is constexpr, mark variable 'type' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n\n\n\"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj\" (default target) (9) ->\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qvector2d.h(60): warning C26495: Variable 'QVector2D::v' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::strongref' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(283): warning C26495: Variable 'QColor::cspec' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(286): warning C26495: Variable 'QColor::cspec' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(289): warning C26495: Variable 'QColor::cspec' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(292): warning C26495: Variable 'QColor::cspec' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(296): warning C26495: Variable 'QColor::cspec' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(60): warning C26495: Variable 'QMatrix::_m12' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(70): warning C26495: Variable 'QMatrix::_m12' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qpalette.h(71): warning C26495: Variable 'QPalette::<anonymous-tag>::for_faster_swapping_dont_use' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qfontmetrics.h(149): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qsciscintilla.h(2078): warning C26495: Variable 'QsciScintilla::FindState::wrap' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\lexaccessor.h(56): warning C26495: Variable 'LexAccessor::buf' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\stylecontext.h(140): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(64): warning C6386: Buffer overrun while writing to 'keywords':  the writable size is '(words+1)*8' bytes, but '24' bytes might be written. [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(47): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(69): warning C26495: Variable 'WordList::starts' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscilexer.h(341): warning C26495: Variable 'QsciLexer::StyleDataMap::style_data_set' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscilexer.h(336): warning C26495: Variable 'QsciLexer::StyleData::eol_fill' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscistyle.cpp(34): warning C26495: Variable 'QsciStyle::style_changeable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscistyle.cpp(48): warning C26495: Variable 'QsciStyle::style_changeable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\include\\platform.h(175): warning C26495: Variable 'ColourDesired::co' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\partitioning.h(91): warning C26495: Variable 'Partitioning::stepPartition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.h(122): warning C26495: Variable 'HighlightDelimiter::endFoldBlock' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(67): warning C26495: Variable 'SplitVector<int>::lengthBody' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(35): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(40): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvarlengtharray.h(263): warning C26495: Variable 'QVarLengthArray<char,1024>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(144): warning C26495: Variable 'QStyleOptionFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(172): warning C26495: Variable 'QStyleOptionTabWidgetFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(196): warning C26495: Variable 'QStyleOptionTabBarBase::documentMode' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(227): warning C26495: Variable 'QStyleOptionHeader::selectedPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(286): warning C26495: Variable 'QStyleOptionTab::selectedPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(316): warning C26495: Variable 'QStyleOptionToolBar::toolBarArea' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(343): warning C26495: Variable 'QStyleOptionProgressBar::orientation' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(373): warning C26495: Variable 'QStyleOptionMenuItem::maxIconWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(392): warning C26495: Variable 'QStyleOptionDockWidget::verticalTitleBar' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(443): warning C26495: Variable 'QStyleOptionViewItem::textElideMode' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(473): warning C26495: Variable 'QStyleOptionToolBox::position' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(492): warning C26495: Variable 'QStyleOptionRubberBand::shape' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(534): warning C26495: Variable 'QStyleOptionSlider::tickInterval' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(553): warning C26495: Variable 'QStyleOptionSpinBox::buttonSymbols' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(580): warning C26495: Variable 'QStyleOptionToolButton::arrowType' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(602): warning C26495: Variable 'QStyleOptionComboBox::editable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(620): warning C26495: Variable 'QStyleOptionTitleBar::titleBarState' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(640): warning C26495: Variable 'QStyleOptionGroupBox::midLineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(654): warning C26495: Variable 'QStyleOptionSizeGrip::corner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(670): warning C26495: Variable 'QStyleOptionGraphicsItem::levelOfDetail' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(114): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(363): warning C6281: Incorrect order of operations:  relational operators have higher precedence than bitwise operators. [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(365): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2304): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscidocument.cpp(59): warning C26495: Variable 'QsciDocument::pdoc' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(74): warning C26495: Variable 'QsciScintilla::ctPos' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(86): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(89): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(91): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(95): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(97): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(99): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(101): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(103): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(105): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(107): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(109): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(111): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(719): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(975): warning C6385: Reading invalid data from 'text':  the readable size is '((epos-spos+1))*2*1' bytes, but '3' bytes may be read. [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2258): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2258): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2292): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3233): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3237): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3231): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3239): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3235): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3951): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(4037): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(4123): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(99): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(102): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(140): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(96): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(93): warning C26495: Variable 'QsciSciPopup::sci' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(152): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(414): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(414): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(438): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(438): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(445): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(445): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(456): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(456): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(470): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(471): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(539): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(540): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(666): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(666): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(952): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(955): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(957): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscimacro.h(99): warning C26495: Variable 'QsciMacro::Macro::wParam' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscimacro.cpp(255): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(92): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::dummy' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(135): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::dummy' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(144): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::dummy' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(202): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(370): warning C6011: Dereferencing NULL pointer 'd'.  [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexers\\lexcpp.cpp(199): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(40): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::pi' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(34): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::pi' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(31): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::pi' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(141): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(141): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(143): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(143): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(174): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(247): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\casefolder.cpp(22): warning C26495: Variable 'CaseFolderTable::mapping' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\charclassify.cpp(22): warning C26495: Variable 'CharClassify::charClass' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.cpp(1575): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.cpp(1663): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(1763): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(2567): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(2568): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(3259): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(3260): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7204): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(8549): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(8549): warning C26451: Arithmetic overflow: Using operator '<<' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '<<' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7997): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7988): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7988): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7668): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7668): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7560): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7487): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7393): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\linemarker.cpp(116): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\linemarker.cpp(117): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(87): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(88): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(89): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(92): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(92): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(234): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(524): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(524): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(620): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\research.cpp(256): warning C26495: Variable 'RESearch::eopat' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\research.cpp(287): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\scintillabase.cpp(740): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\scintillabase.cpp(740): warning C26451: Arithmetic overflow: Using operator '<<' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '<<' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\style.cpp(60): warning C26495: Variable 'FontMeasurements::sizeZoomed' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\style.cpp(72): warning C26495: Variable 'Style::hotspot' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\viewstyle.cpp(87): warning C26495: Variable 'ViewStyle::nextExtendedStyle' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\viewstyle.cpp(91): warning C26495: Variable 'ViewStyle::largestMarkerHeight' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\xpm.cpp(59): warning C26495: Variable 'RGBAImage::scale' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n\n\n\"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj\" (default target) (10) ->\n\"E:\\robo\\build\\Debug\\src\\robomongo\\robomongo_autogen.vcxproj\" (default target) (11) ->\n\"E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh.vcxproj\" (default target) (12) ->\n  e:\\robo\\src\\robomongo\\ssh\\ssh.c(585): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\array.c(44): warning C6386: Buffer overrun while writing to 'newarray':  the writable size is 'newsize*sizeof(void *)' bytes, but '8' bytes might be written. [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C6386: Buffer overrun while writing to 'newarray+i':  the writable size is 'newsize*sizeof(void *)' bytes, but '8' bytes might be written. [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh.vcxproj]\n\n\n\"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj\" (default target) (10) ->\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(283): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(286): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(289): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(292): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(296): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(60): warning C26495: Variable 'QMatrix::_m22' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(70): warning C26495: Variable 'QMatrix::_m22' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::destroyer' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qpalette.h(71): warning C26495: Variable 'QPalette::<anonymous-tag>::for_faster_swapping_dont_use' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qfontmetrics.h(149): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(822): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2309): warning C26495: Variable 'fmt::v5::system_error::error_code_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2964): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2965): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2966): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2967): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2968): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2969): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(246): warning C26495: Variable 'absl::AlphaNum::digits_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(247): warning C26495: Variable 'absl::AlphaNum::digits_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(387): warning C6001: Using uninitialized memory 'result'. [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\oid.h(89): warning C26495: Variable 'mongo::OID::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\oid.h(241): warning C26495: Variable 'mongo::OID::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(442): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(454): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(700): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonmisc.h(251): warning C26495: Variable 'mongo::BSONSizeTracker::_sizes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonobjbuilder.h(158): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\rpc\\op_msg.h(325): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\interruptible.h(139): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\interruptible.h(180): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\intrusive_counter.h(123): warning C26495: Variable 'mongo::RCString::_size' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\future_impl.h(716): warning C26495: Variable 'mongo::future_details::SharedStateHolder<void>::_inner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\db\\baton.h(118): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\db\\baton.h(123): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\platform\\process_id.h(68): warning C26495: Variable 'mongo::ProcessId::_npid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\concurrency\\spin_lock.h(51): warning C6031: Return value ignored: 'InitializeCriticalSectionAndSpinCount'. [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\db\\write_concern_options.h(60): warning C26495: Variable 'mongo::WriteConcernOptions::wNumNodes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\client\\dbclient_cursor.h(105): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongoshellresult.h(55): warning C26495: Variable 'Robomongo::MongoShellExecResult::_isCurrentServerValid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongoshellresult.h(70): warning C26495: Variable 'Robomongo::MongoShellExecResult::_isCurrentServerValid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongocollectioninfo.h(10): warning C26495: Variable 'Robomongo::MongoCollectionInfo::_storageSizeBytes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(918): warning C26495: Variable 'Robomongo::ExecuteQueryResponse::resultIndex' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(989): warning C26495: Variable 'Robomongo::ExecuteScriptResponse::empty' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1087): warning C26495: Variable 'Robomongo::DocumentListLoadedEvent::_resultIndex' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1111): warning C26495: Variable 'Robomongo::ScriptExecutedEvent::_empty' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1195): warning C26495: Variable 'Robomongo::EstablishSshConnectionResponse::localport' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\base\\encoded_value_storage.h(47): warning C26495: Variable 'mongo::EncodedValueStorage<mongo::QueryResult::Layout,mongo::QueryResult::ConstView,mongo::QueryResult::View>::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(205): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::future_details::FakeVoid>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\decimal_counter.h(48): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(194): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::SourceLocationHolder>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(840): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\util\\builder.h(119): warning C26495: Variable 'mongo::StackAllocator::_ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(146): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::Timestamp>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(152): warning C26495: Variable 'boost::optional_detail::optional_base<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\detail\\optional_trivially_copyable_base.hpp(29): warning C26495: Variable 'boost::optional_detail::tc_optional_base<bool>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\detail\\optional_trivially_copyable_base.hpp(25): warning C26495: Variable 'boost::optional_detail::tc_optional_base<bool>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(162): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::UUID>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(140): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::UUID>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(904): warning C26495: Variable 'absl::container_internal::raw_hash_set<absl::container_internal::NodeHashSetPolicy<mongo::BSONObj>,mongo::HashImprover<mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::Hasher,mongo::BSONObj>,mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::EqualTo,std::allocator<mongo::BSONObj> >::ctrl_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(1563): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_size' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\base\\data_range.h(117): warning C26495: Variable 'mongo::ConstDataRange::_end' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonobj.h(136): warning C26495: Variable 'mongo::BSONObj::_objdata' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\base\\status_with.h(133): warning C26495: Variable 'mongo::StatusWith<char>::_status' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\base\\data_range.h(112): warning C26495: Variable 'mongo::ConstDataRange::_end' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(856): warning C26495: Variable 'absl::container_internal::raw_hash_set<absl::container_internal::NodeHashSetPolicy<mongo::BSONObj>,mongo::HashImprover<mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::Hasher,mongo::BSONObj>,mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::EqualTo,std::allocator<mongo::BSONObj> >::ctrl_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\core.h(1277): warning C26495: Variable 'fmt::v5::basic_format_args<fmt::v5::basic_format_context<std::back_insert_iterator<fmt::v5::internal::basic_buffer<char> >,char> >::<anonymous-tag>::args_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1410): warning C6387: 'value' could be '0':  this does not adhere to the specification for the function 'std::char_traits<char>::length'.  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\core.h(345): warning C26495: Variable 'std::back_insert_iterator<fmt::v5::internal::basic_buffer<char> >::container' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1516): warning C26498: The function 'std::numeric_limits<int>::max' is constexpr, mark variable 'max_int' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2479): warning C26495: Variable 'fmt::v5::basic_writer<fmt::v5::back_insert_range<fmt::v5::internal::basic_buffer<char> > >::int_writer<unsigned __int64,fmt::v5::basic_format_specs<char> >::prefix' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(603): warning C26495: Variable 'fmt::v5::internal::counting_iterator<char>::blackhole_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(1668): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2599): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2599): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1122): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1126): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(771): warning C26495: Variable 'absl::container_internal::raw_hash_set<absl::container_internal::NodeHashSetPolicy<mongo::BSONObj>,mongo::HashImprover<mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::Hasher,mongo::BSONObj>,mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::EqualTo,std::allocator<mongo::BSONObj> >::iterator::slot_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(144): warning C26495: Variable 'QStyleOptionFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(172): warning C26495: Variable 'QStyleOptionTabWidgetFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(196): warning C26495: Variable 'QStyleOptionTabBarBase::documentMode' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(227): warning C26495: Variable 'QStyleOptionHeader::selectedPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(286): warning C26495: Variable 'QStyleOptionTab::row' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(316): warning C26495: Variable 'QStyleOptionToolBar::positionWithinLine' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(343): warning C26495: Variable 'QStyleOptionProgressBar::progress' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(373): warning C26495: Variable 'QStyleOptionMenuItem::menuHasCheckableItems' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(392): warning C26495: Variable 'QStyleOptionDockWidget::verticalTitleBar' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(443): warning C26495: Variable 'QStyleOptionViewItem::textElideMode' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(473): warning C26495: Variable 'QStyleOptionToolBox::position' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(492): warning C26495: Variable 'QStyleOptionRubberBand::shape' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(534): warning C26495: Variable 'QStyleOptionSlider::tickPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(553): warning C26495: Variable 'QStyleOptionSpinBox::frame' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(580): warning C26495: Variable 'QStyleOptionToolButton::arrowType' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(602): warning C26495: Variable 'QStyleOptionComboBox::editable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(620): warning C26495: Variable 'QStyleOptionTitleBar::titleBarState' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(640): warning C26495: Variable 'QStyleOptionGroupBox::midLineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(654): warning C26495: Variable 'QStyleOptionSizeGrip::corner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(670): warning C26495: Variable 'QStyleOptionGraphicsItem::levelOfDetail' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2304): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(491): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(492): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(493): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(494): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(495): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(498): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(504): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(25): warning C28251: Inconsistent annotation for 'GetSystemTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(103).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(29): warning C28251: Inconsistent annotation for 'GetSystemTimeAsFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(111).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(33): warning C28251: Inconsistent annotation for 'SystemTimeToFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\timezoneapi.h(93).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(38): warning C28251: Inconsistent annotation for 'FileTimeToSystemTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\timezoneapi.h(83).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(45): warning C28251: Inconsistent annotation for 'FileTimeToLocalFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\fileapi.h(171).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(50): warning C28251: Inconsistent annotation for 'LocalFileTimeToFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\fileapi.h(963).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(58): warning C28251: Inconsistent annotation for 'GetTickCount': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(168).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(133): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(695): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(613): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\date_time\\date_formatting.hpp(89): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\date_time\\date_formatting.hpp(91): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\converter_lexical_streams.hpp(162): warning C26495: Variable 'boost::detail::lexical_istream_limited_src<char,std::char_traits<char>,0,39>::finish' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\lcast_unsigned_converters.hpp(191): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\lcast_unsigned_converters.hpp(262): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\quuid.h(68): warning C26495: Variable 'QUuid::data4' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\function\\function_base.hpp(611): warning C26495: Variable 'boost::function_base::functor' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qvector2d.h(60): warning C26495: Variable 'QVector2D::v' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongoutils.cpp(12): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongodatabase.h(131): warning C26495: Variable 'Robomongo::MongoDatabaseUsersLoadedEvent::_database' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongodatabase.h(151): warning C26495: Variable 'Robomongo::MongoDatabaseFunctionsLoadedEvent::_database' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongocollectioninfo.cpp(7): warning C26495: Variable 'Robomongo::MongoCollectionInfo::_sizeBytes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongoqueryinfo.cpp(31): warning C26495: Variable 'Robomongo::MongoQueryInfo::_options' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(110): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(171): warning C6054: String 'sday' might not be zero-terminated. [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(140): warning C6054: String 'gmt' might not be zero-terminated. [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(143): warning C6054: String 'smon' might not be zero-terminated. [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(223): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(269): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(390): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\platform\\strtoll.h(35): warning C28251: Inconsistent annotation for 'strtoll': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\ucrt\\stdlib.h(539).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\platform\\strtoll.h(39): warning C28251: Inconsistent annotation for 'strtoull': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\ucrt\\stdlib.h(569).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(249): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(669): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(771): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(792): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(1099): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\assertions.h(59): warning C28251: Inconsistent annotation for 'TerminateProcess': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\processthreadsapi.h(143).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(1348): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\callargs.h(306): warning C6001: Using uninitialized memory 'args'. [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(636): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6470): warning C26495: Variable 'JS::FirstSubsumedFrame::cx' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6470): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6478): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\get_last_error.hpp(20): warning C28251: Inconsistent annotation for 'GetLastError': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\errhandlingapi.h(89).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(25): warning C28251: Inconsistent annotation for 'FormatMessageA': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(2408).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(36): warning C28251: Inconsistent annotation for 'FormatMessageW': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(2423).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(47): warning C28251: Inconsistent annotation for 'SetErrorMode': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\errhandlingapi.h(131).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\character_code_conversion.hpp(21): warning C28251: Inconsistent annotation for 'MultiByteToWideChar': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\stringapiset.h(126).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\character_code_conversion.hpp(30): warning C28251: Inconsistent annotation for 'WideCharToMultiByte': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\stringapiset.h(141).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(27): warning C28251: Inconsistent annotation for 'LocalAlloc': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1112).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(32): warning C28251: Inconsistent annotation for 'LocalReAlloc': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1122).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(37): warning C28251: Inconsistent annotation for 'LocalFree': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1200).  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(211): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(211): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(216): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\engine\\scriptengine.cpp(230): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\bufferlist.h(101): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(262): warning C26495: Variable 'JS::Heap<JSObject *>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(254): warning C26495: Variable 'JS::Heap<JSObject *>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(969): warning C26495: Variable 'JS::Rooted<JSObject *>::stack' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(962): warning C26495: Variable 'JS::Rooted<JSObject *>::stack' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\vector.h(877): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\variant.h(568): warning C26495: Variable 'mozilla::Variant<char const *,mozilla::UniquePtr<char [0],JS::FreePolicy> >::rawData' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\vector.h(408): warning C26495: Variable 'mozilla::Vector<mozilla::BufferList<js::SystemAllocPolicy>::Segment,1,js::SystemAllocPolicy>::CRAndStorage<1,0>::mBytes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\mongodb\\mongoworker.cpp(1020): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonvalue.h(149): warning C26495: Variable 'QJsonValue::<anonymous-tag>::base' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonarray.h(62): warning C26495: Variable 'QJsonArray::d' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\settings\\settingsmanager.cpp(99): warning C26495: Variable 'Robomongo::SettingsManager::_autoExpand' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonobject.h(64): warning C26495: Variable 'QJsonObject::o' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(30): warning C26495: Variable 'Robomongo::EulaDialog::_reply' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(29): warning C26495: Variable 'Robomongo::ConnectionBasicTab::_discoverButton' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(339): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(339): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qsciscintilla.h(2078): warning C26495: Variable 'QsciScintilla::FindState::wrap' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(44): warning C26495: Variable 'Robomongo::CreateCollectionDialog::_cappedCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(53): warning C26495: Variable 'Robomongo::CreateUserDialog::_readOnlyCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(128): warning C26495: Variable 'Robomongo::CreateUserDialog::_userSourceComboBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(43): warning C26495: Variable 'Robomongo::ConnectionListWidgetItem::_connection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(107): warning C26495: Variable 'Robomongo::ConnectionsDialog::_selectedConnection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\changeshelltimeoutdialog.cpp(29): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\changeshelltimeoutdialog.cpp(30): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(33): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(75): warning C26495: Variable 'Robomongo::AddEditIndexDialog::_jsonText' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexitem.cpp(25): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexitem.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerwidget.cpp(170): warning C28182: Dereferencing NULL pointer. 'item' contains the same NULL value as 'collectionItem' did.  [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontablemodel.cpp(12): warning C26495: Variable 'Robomongo::BsonTableModelProxy::_root' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeitem.h(19): warning C26495: Variable 'Robomongo::BsonItemFields::_type' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(320): warning C6001: Using uninitialized memory 'mainWindow'. [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(27): warning C26495: Variable 'Robomongo::OutputItemContentWidget::_collectionStats' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(57): warning C26495: Variable 'Robomongo::OutputItemContentWidget::_collectionStats' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(19): warning C26495: Variable 'Robomongo::OutputWidget::_prevResultsCount' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(122): warning C26495: Variable 'Robomongo::WelcomeTab::_clearButton' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Debug\\src\\robomongo\\robomongo.vcxproj]\n\n\n\"E:\\robo\\build\\Debug\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh_test.vcxproj\" (default target) (14) ->\n  e:\\robo\\src\\robomongo\\ssh\\test.c(135): warning C6011: Dereferencing NULL pointer 'elem3'.  [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\test.c(136): warning C6011: Dereferencing NULL pointer 'elem4'.  [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\test.c(134): warning C6011: Dereferencing NULL pointer 'elem2'.  [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\test.c(137): warning C6011: Dereferencing NULL pointer 'elem5'.  [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\test.c(133): warning C6011: Dereferencing NULL pointer 'elem1'.  [E:\\robo\\build\\Debug\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n\n    592 Warning(s)\n    0 Error(s)\n\nTime Elapsed 00:11:05.57\n----------------------------------------\nInstalling debug *.dll files ...  \nINSTALL_DIR: E:\\robo\\bin\\..\\build\\Debug\\src\\robomongo\\Debug\\\n----------------------------------------  \nE:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\Tools\\\\..\\..\\VC\\redist\\debug_nonredist\\x64\\Microsoft.VC140.DebugCRT\\msvcp140d.dll\n1 File(s) copied\nE:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\Tools\\\\..\\..\\VC\\redist\\debug_nonredist\\x64\\Microsoft.VC140.DebugCRT\\vcruntime140d.dll\n1 File(s) copied\nE:\\openssl-1.1.1f\\libssl-1_1-x64.dll\n1 File(s) copied\nE:\\openssl-1.1.1f\\libcrypto-1_1-x64.dll\n1 File(s) copied\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\bin\\Qt5Cored.dll\n1 File(s) copied\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\bin\\Qt5Guid.dll\n1 File(s) copied\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\bin\\Qt5Networkd.dll\n1 File(s) copied\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\bin\\Qt5Widgetsd.dll\n1 File(s) copied\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qgif.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qgifd.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qicns.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qicnsd.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qico.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qicod.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qjpeg.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qjpegd.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qsvg.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qsvgd.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qtga.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qtgad.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qtiff.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qtiffd.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qwbmp.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qwbmpd.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qwebp.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\imageformats\\qwebpd.dll\n18 File(s) copied\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\platforms\\qdirect2d.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\platforms\\qdirect2dd.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\platforms\\qminimal.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\platforms\\qminimald.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\platforms\\qoffscreen.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\platforms\\qoffscreend.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\platforms\\qwindows.dll\nE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\plugins\\platforms\\qwindowsd.dll\n8 File(s) copied\n"
  },
  {
    "path": "static_analysis/vs_run-code-analysis_nat-rec_rls-reduced.txt",
    "content": "\n\tLine 796: e:\\robo\\src\\robomongo\\ssh\\ssh.c(585): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n\tLine 797: e:\\robo\\src\\robomongo\\ssh\\array.c(44): warning C6386: Buffer overrun while writing to 'newarray':  the writable size is 'newsize*sizeof(void *)' bytes, but '8' bytes might be written. [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n\tLine 798: e:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C6386: Buffer overrun while writing to 'newarray+i':  the writable size is 'newsize*sizeof(void *)' bytes, but '8' bytes might be written. [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n\tLine 799: e:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n\tLine 800: e:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n\tLine 1102: e:\\robo\\src\\robomongo\\core\\domain\\mongoshellresult.h(55): warning C26495: Variable 'Robomongo::MongoShellExecResult::_isCurrentServerValid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1103: e:\\robo\\src\\robomongo\\core\\domain\\mongoshellresult.h(70): warning C26495: Variable 'Robomongo::MongoShellExecResult::_isCurrentServerValid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1104: e:\\robo\\src\\robomongo\\core\\domain\\mongocollectioninfo.h(10): warning C26495: Variable 'Robomongo::MongoCollectionInfo::_count' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1105: e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(918): warning C26495: Variable 'Robomongo::ExecuteQueryResponse::resultIndex' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1106: e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(989): warning C26495: Variable 'Robomongo::ExecuteScriptResponse::empty' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1107: e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1087): warning C26495: Variable 'Robomongo::DocumentListLoadedEvent::_resultIndex' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1108: e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1111): warning C26495: Variable 'Robomongo::ScriptExecutedEvent::_empty' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1109: e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1195): warning C26495: Variable 'Robomongo::EstablishSshConnectionResponse::localport' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1178: e:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(133): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1179: e:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(695): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1180: e:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(613): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1190: e:\\robo\\src\\robomongo\\core\\domain\\mongoutils.cpp(12): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1191: e:\\robo\\src\\robomongo\\core\\domain\\mongodatabase.h(131): warning C26495: Variable 'Robomongo::MongoDatabaseUsersLoadedEvent::_database' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1192: e:\\robo\\src\\robomongo\\core\\domain\\mongodatabase.h(151): warning C26495: Variable 'Robomongo::MongoDatabaseFunctionsLoadedEvent::_database' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1193: e:\\robo\\src\\robomongo\\core\\domain\\mongocollectioninfo.cpp(7): warning C26495: Variable 'Robomongo::MongoCollectionInfo::_sizeBytes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1194: e:\\robo\\src\\robomongo\\core\\domain\\mongoqueryinfo.cpp(31): warning C26495: Variable 'Robomongo::MongoQueryInfo::_batchSize' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1195: e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(110): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1196: e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(143): warning C6054: String 'smon' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1197: e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(171): warning C6054: String 'sday' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1198: e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(140): warning C6054: String 'gmt' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1199: e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(223): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1200: e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(269): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1201: e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(390): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1228: e:\\robo\\src\\robomongo\\core\\engine\\scriptengine.cpp(230): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1242: e:\\robo\\src\\robomongo\\core\\settings\\settingsmanager.cpp(99): warning C26495: Variable 'Robomongo::SettingsManager::_autoExpand' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1246: e:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(30): warning C26495: Variable 'Robomongo::EulaDialog::_reply' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1260: e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(29): warning C26495: Variable 'Robomongo::ConnectionBasicTab::_discoverButton' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1272: e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(44): warning C26495: Variable 'Robomongo::CreateCollectionDialog::_indexOptionDefaultsFrame' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1285: e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(53): warning C26495: Variable 'Robomongo::CreateUserDialog::_readOnlyCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1288: e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(128): warning C26495: Variable 'Robomongo::CreateUserDialog::_userSourceComboBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1293: e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(43): warning C26495: Variable 'Robomongo::ConnectionListWidgetItem::_connection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1303: e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(107): warning C26495: Variable 'Robomongo::ConnectionsDialog::_selectedConnection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1319: e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(75): warning C26495: Variable 'Robomongo::AddEditIndexDialog::_uniqueCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\nLine 1391: e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerwidget.cpp(170): warning C28182: Dereferencing NULL pointer. 'item' contains the same NULL value as 'collectionItem' did.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1392: e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontablemodel.cpp(12): warning C26495: Variable 'Robomongo::BsonTableModelProxy::_root' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1394: e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeitem.h(19): warning C26495: Variable 'Robomongo::BsonItemFields::_type' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1408: e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(320): warning C6001: Using uninitialized memory 'mainWindow'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1409: e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(27): warning C26495: Variable 'Robomongo::OutputItemContentWidget::_collectionStats' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1410: e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(57): warning C26495: Variable 'Robomongo::OutputItemContentWidget::_collectionStats' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1424: e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(19): warning C26495: Variable 'Robomongo::OutputWidget::_prevResultsCount' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1444: e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(122): warning C26495: Variable 'Robomongo::WelcomeTab::_blogsSection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 1539:   C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /IE:\\robo\\build\\Release\\src /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /W3 /WX- /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo\"server.dir\\Release\\\\\" /Fd\"server.dir\\Release\\vc141.pdb\" /Gd /TC /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:rules...\n\tLine 1558:   C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /IE:\\robo\\build\\Release\\src /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /W3 /WX- /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo\"ssh_test.dir\\Release\\\\\" /Fd\"ssh_test.dir\\Release\\vc141.pdb\" /Gd /TC /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:r...\n\tLine 1563: e:\\robo\\src\\robomongo\\ssh\\test.c(134): warning C6011: Dereferencing NULL pointer 'elem2'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n\tLine 1564: e:\\robo\\src\\robomongo\\ssh\\test.c(137): warning C6011: Dereferencing NULL pointer 'elem5'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n\tLine 1565: e:\\robo\\src\\robomongo\\ssh\\test.c(133): warning C6011: Dereferencing NULL pointer 'elem1'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n\tLine 1566: e:\\robo\\src\\robomongo\\ssh\\test.c(135): warning C6011: Dereferencing NULL pointer 'elem3'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n\tLine 1567: e:\\robo\\src\\robomongo\\ssh\\test.c(136): warning C6011: Dereferencing NULL pointer 'elem4'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n\tLine 1994:   e:\\robo\\src\\robomongo\\ssh\\ssh.c(585): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n\tLine 1995:   e:\\robo\\src\\robomongo\\ssh\\array.c(44): warning C6386: Buffer overrun while writing to 'newarray':  the writable size is 'newsize*sizeof(void *)' bytes, but '8' bytes might be written. [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n\tLine 1996:   e:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C6386: Buffer overrun while writing to 'newarray+i':  the writable size is 'newsize*sizeof(void *)' bytes, but '8' bytes might be written. [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n\tLine 1997:   e:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n\tLine 1998:   e:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n\tLine 2046:   e:\\robo\\src\\robomongo\\core\\domain\\mongoshellresult.h(55): warning C26495: Variable 'Robomongo::MongoShellExecResult::_isCurrentServerValid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2047:   e:\\robo\\src\\robomongo\\core\\domain\\mongoshellresult.h(70): warning C26495: Variable 'Robomongo::MongoShellExecResult::_isCurrentServerValid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2048:   e:\\robo\\src\\robomongo\\core\\domain\\mongocollectioninfo.h(10): warning C26495: Variable 'Robomongo::MongoCollectionInfo::_count' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2049:   e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(918): warning C26495: Variable 'Robomongo::ExecuteQueryResponse::resultIndex' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2050:   e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(989): warning C26495: Variable 'Robomongo::ExecuteScriptResponse::empty' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2051:   e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1087): warning C26495: Variable 'Robomongo::DocumentListLoadedEvent::_resultIndex' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2052:   e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1111): warning C26495: Variable 'Robomongo::ScriptExecutedEvent::_empty' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2053:   e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1195): warning C26495: Variable 'Robomongo::EstablishSshConnectionResponse::localport' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2122:   e:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(133): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2123:   e:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(695): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2124:   e:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(613): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2134:   e:\\robo\\src\\robomongo\\core\\domain\\mongoutils.cpp(12): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2135:   e:\\robo\\src\\robomongo\\core\\domain\\mongodatabase.h(131): warning C26495: Variable 'Robomongo::MongoDatabaseUsersLoadedEvent::_database' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2136:   e:\\robo\\src\\robomongo\\core\\domain\\mongodatabase.h(151): warning C26495: Variable 'Robomongo::MongoDatabaseFunctionsLoadedEvent::_database' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2137:   e:\\robo\\src\\robomongo\\core\\domain\\mongocollectioninfo.cpp(7): warning C26495: Variable 'Robomongo::MongoCollectionInfo::_sizeBytes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2138:   e:\\robo\\src\\robomongo\\core\\domain\\mongoqueryinfo.cpp(31): warning C26495: Variable 'Robomongo::MongoQueryInfo::_batchSize' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2139:   e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(110): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2140:   e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(143): warning C6054: String 'smon' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2141:   e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(171): warning C6054: String 'sday' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2142:   e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(140): warning C6054: String 'gmt' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2143:   e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(223): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2144:   e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(269): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2145:   e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(390): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2172:   e:\\robo\\src\\robomongo\\core\\engine\\scriptengine.cpp(230): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2186:   e:\\robo\\src\\robomongo\\core\\settings\\settingsmanager.cpp(99): warning C26495: Variable 'Robomongo::SettingsManager::_autoExpand' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2190:   e:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(30): warning C26495: Variable 'Robomongo::EulaDialog::_reply' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2204:   e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(29): warning C26495: Variable 'Robomongo::ConnectionBasicTab::_discoverButton' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2216:   e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(44): warning C26495: Variable 'Robomongo::CreateCollectionDialog::_indexOptionDefaultsFrame' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2229:   e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(53): warning C26495: Variable 'Robomongo::CreateUserDialog::_readOnlyCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2232:   e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(128): warning C26495: Variable 'Robomongo::CreateUserDialog::_userSourceComboBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2237:   e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(43): warning C26495: Variable 'Robomongo::ConnectionListWidgetItem::_connection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2247:   e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(107): warning C26495: Variable 'Robomongo::ConnectionsDialog::_selectedConnection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2263:   e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(75): warning C26495: Variable 'Robomongo::AddEditIndexDialog::_uniqueCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2335:   e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerwidget.cpp(170): warning C28182: Dereferencing NULL pointer. 'item' contains the same NULL value as 'collectionItem' did.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2336:   e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontablemodel.cpp(12): warning C26495: Variable 'Robomongo::BsonTableModelProxy::_root' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\n\tLine 2338:   e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeitem.h(19): warning C26495: Variable 'Robomongo::BsonItemFields::_type' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2352:   e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(320): warning C6001: Using uninitialized memory 'mainWindow'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2353:   e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(27): warning C26495: Variable 'Robomongo::OutputItemContentWidget::_collectionStats' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2354:   e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(57): warning C26495: Variable 'Robomongo::OutputItemContentWidget::_collectionStats' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2368:   e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(19): warning C26495: Variable 'Robomongo::OutputWidget::_prevResultsCount' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\tLine 2388:   e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(122): warning C26495: Variable 'Robomongo::WelcomeTab::_blogsSection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\n\tLine 2473:   e:\\robo\\src\\robomongo\\ssh\\test.c(134): warning C6011: Dereferencing NULL pointer 'elem2'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n\tLine 2474:   e:\\robo\\src\\robomongo\\ssh\\test.c(137): warning C6011: Dereferencing NULL pointer 'elem5'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n\tLine 2475:   e:\\robo\\src\\robomongo\\ssh\\test.c(133): warning C6011: Dereferencing NULL pointer 'elem1'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n\tLine 2476:   e:\\robo\\src\\robomongo\\ssh\\test.c(135): warning C6011: Dereferencing NULL pointer 'elem3'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n\tLine 2477:   e:\\robo\\src\\robomongo\\ssh\\test.c(136): warning C6011: Dereferencing NULL pointer 'elem4'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]"
  },
  {
    "path": "static_analysis/vs_run-code-analysis_nat-rec_rls.txt",
    "content": "Microsoft (R) Build Engine version 15.9.21+g9802d43bc3 for .NET Framework\nCopyright (C) Microsoft Corporation. All rights reserved.\n\nBuild started 18-Aug-20 17:40:51.\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" on node 1 (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\ZERO_CHECK.vcxproj\" (2) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"x64\\Release\\ZERO_CHECK\\\".\n  Creating directory \"x64\\Release\\ZERO_CHECK\\ZERO_CHECK.tlog\\\".\nInitializeBuildStatus:\n  Creating \"x64\\Release\\ZERO_CHECK\\ZERO_CHECK.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Checking Build System\n  CMake does not need to re-run because E:/robo/build/Release/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/libssh2-1.9.0/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Release/src/robomongo/ssh/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/qjson-0.8.1/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/qscintilla-2.8.4/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/googletest-1.8.1/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/googletest-1.8.1/googlemock/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/googletest-1.8.1/googlemock/gtest/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Release/src/robomongo/CMakeFiles/generate.stamp is up-to-date.\nFinalizeBuildStatus:\n  Deleting file \"x64\\Release\\ZERO_CHECK\\ZERO_CHECK.tlog\\unsuccessfulbuild\".\n  Touching \"x64\\Release\\ZERO_CHECK\\ZERO_CHECK.tlog\\ZERO_CHECK.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\ZERO_CHECK.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj\" (3) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"gmock.dir\\Release\\\".\n  Creating directory \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\Release\\\".\n  Creating directory \"gmock.dir\\Release\\gmock.tlog\\\".\nInitializeBuildStatus:\n  Creating \"gmock.dir\\Release\\gmock.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/googletest-1.8.1/googlemock/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/googletest-1.8.1/googlemock/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\" /Zi /nologo /W4 /WX /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D STRICT /D WIN32_LEAN_AND_MEAN /D GTEST_HAS_PTHREAD=0 /D _HAS_EXCEPTIONS=1 /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"gmock.dir\\Release\\\\\" /Fd\"gmock.dir\\Release\\gmock.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4251 /wd4275 /wd4702 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  -J /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-all.cc\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\src\\gmock-all.cc\"\n  gtest-all.cc\n  gmock-all.cc\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\Release\\gmock.lib\" /NOLOGO /MACHINE:X64  /machine:x64 \"gmock.dir\\Release\\gtest-all.obj\"\n  \"gmock.dir\\Release\\gmock-all.obj\"\n  gmock.vcxproj -> E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\Release\\gmock.lib\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2258): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2254): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2252): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2250): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"gmock.dir\\Release\\gmock.tlog\\unsuccessfulbuild\".\n  Touching \"gmock.dir\\Release\\gmock.tlog\\gmock.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj\" (4) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"gmock_main.dir\\Release\\\".\n  Creating directory \"gmock_main.dir\\Release\\gmock_main.tlog\\\".\nInitializeBuildStatus:\n  Creating \"gmock_main.dir\\Release\\gmock_main.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/googletest-1.8.1/googlemock/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/googletest-1.8.1/googlemock/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\" /Zi /nologo /W4 /WX /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D STRICT /D WIN32_LEAN_AND_MEAN /D GTEST_HAS_PTHREAD=0 /D _HAS_EXCEPTIONS=1 /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"gmock_main.dir\\Release\\\\\" /Fd\"gmock_main.dir\\Release\\gmock_main.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4251 /wd4275 /wd4702 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  -J /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-all.cc\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\src\\gmock-all.cc\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\src\\gmock_main.cc\"\n  gtest-all.cc\n  gmock-all.cc\n  gmock_main.cc\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\Release\\gmock_main.lib\" /NOLOGO /MACHINE:X64  /machine:x64 \"gmock_main.dir\\Release\\gtest-all.obj\"\n  \"gmock_main.dir\\Release\\gmock-all.obj\"\n  gmock_main.dir\\Release\\gmock_main.obj\n  gmock_main.vcxproj -> E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\Release\\gmock_main.lib\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2258): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2254): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2252): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2250): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"gmock_main.dir\\Release\\gmock_main.tlog\\unsuccessfulbuild\".\n  Touching \"gmock_main.dir\\Release\\gmock_main.tlog\\gmock_main.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj\" (5) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"gtest.dir\\Release\\\".\n  Creating directory \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\Release\\\".\n  Creating directory \"gtest.dir\\Release\\gtest.tlog\\\".\nInitializeBuildStatus:\n  Creating \"gtest.dir\\Release\\gtest.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/googletest-1.8.1/googletest/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/googletest-1.8.1/googlemock/gtest/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\" /Zi /nologo /W4 /WX /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D STRICT /D WIN32_LEAN_AND_MEAN /D GTEST_HAS_PTHREAD=0 /D _HAS_EXCEPTIONS=1 /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"gtest.dir\\Release\\\\\" /Fd\"gtest.dir\\Release\\gtest.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4251 /wd4275 /wd4702 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  -J /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-all.cc\"\n  gtest-all.cc\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\Release\\gtest.lib\" /NOLOGO /MACHINE:X64  /machine:x64 \"gtest.dir\\Release\\gtest-all.obj\"\n  gtest.vcxproj -> E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\Release\\gtest.lib\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"gtest.dir\\Release\\gtest.tlog\\unsuccessfulbuild\".\n  Touching \"gtest.dir\\Release\\gtest.tlog\\gtest.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj\" (6) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"gtest_main.dir\\Release\\\".\n  Creating directory \"gtest_main.dir\\Release\\gtest_main.tlog\\\".\nInitializeBuildStatus:\n  Creating \"gtest_main.dir\\Release\\gtest_main.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/googletest-1.8.1/googletest/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/googletest-1.8.1/googlemock/gtest/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\" /Zi /nologo /W4 /WX /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D STRICT /D WIN32_LEAN_AND_MEAN /D GTEST_HAS_PTHREAD=0 /D _HAS_EXCEPTIONS=1 /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"gtest_main.dir\\Release\\\\\" /Fd\"gtest_main.dir\\Release\\gtest_main.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4251 /wd4275 /wd4702 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  -J /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest_main.cc\"\n  gtest_main.cc\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\Release\\gtest_main.lib\" /NOLOGO /MACHINE:X64  /machine:x64 gtest_main.dir\\Release\\gtest_main.obj\n  gtest_main.vcxproj -> E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\Release\\gtest_main.lib\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"gtest_main.dir\\Release\\gtest_main.tlog\\unsuccessfulbuild\".\n  Touching \"gtest_main.dir\\Release\\gtest_main.tlog\\gtest_main.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj\" (7) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"libssh2.dir\\Release\\\".\n  Creating directory \"E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\Release\\\".\n  Creating directory \"libssh2.dir\\Release\\libssh2.tlog\\\".\nInitializeBuildStatus:\n  Creating \"libssh2.dir\\Release\\libssh2.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/libssh2-1.9.0/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/libssh2-1.9.0/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /W3 /WX- /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D LIBSSH2_OPENSSL /D LIBSSH2_WIN32 /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo\"libssh2.dir\\Release\\\\\" /Fd\"libssh2.dir\\Release\\libssh2.pdb\" /Gd /TC /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4133 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\bcrypt_pbkdf.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\blowfish.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\comp.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\crypt.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\global.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\hostkey.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\keepalive.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\knownhost.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\mac.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\misc.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\pem.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\publickey.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\scp.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\version.c\"\n  openssl.c\n  agent.c\n  bcrypt_pbkdf.c\n  blowfish.c\n  channel.c\n  comp.c\n  crypt.c\n  global.c\n  hostkey.c\n  keepalive.c\n  kex.c\n  knownhost.c\n  mac.c\n  misc.c\n  packet.c\n  pem.c\n  publickey.c\n  scp.c\n  session.c\n  sftp.c\n  transport.c\n  userauth.c\n  version.c\nResourceCompile:\n  C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.18362.0\\x86\\rc.exe /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D LIBSSH2_OPENSSL /D LIBSSH2_WIN32 /D \"CMAKE_INTDIR=\\\\\\\"Release\\\\\\\"\" /D _UNICODE /D UNICODE /l\"0x0409\" /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /fo\"libssh2.dir\\Release\\libssh2.res\" E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\win32\\libssh2.rc \nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\Release\\libssh2.lib\" /NOLOGO /MACHINE:X64  /machine:x64 libssh2.dir\\Release\\libssh2.res\n  libssh2.dir\\Release\\openssl.obj\n  libssh2.dir\\Release\\agent.obj\n  libssh2.dir\\Release\\bcrypt_pbkdf.obj\n  libssh2.dir\\Release\\blowfish.obj\n  libssh2.dir\\Release\\channel.obj\n  libssh2.dir\\Release\\comp.obj\n  libssh2.dir\\Release\\crypt.obj\n  libssh2.dir\\Release\\global.obj\n  libssh2.dir\\Release\\hostkey.obj\n  libssh2.dir\\Release\\keepalive.obj\n  libssh2.dir\\Release\\kex.obj\n  libssh2.dir\\Release\\knownhost.obj\n  libssh2.dir\\Release\\mac.obj\n  libssh2.dir\\Release\\misc.obj\n  libssh2.dir\\Release\\packet.obj\n  libssh2.dir\\Release\\pem.obj\n  libssh2.dir\\Release\\publickey.obj\n  libssh2.dir\\Release\\scp.obj\n  libssh2.dir\\Release\\session.obj\n  libssh2.dir\\Release\\sftp.obj\n  libssh2.dir\\Release\\transport.obj\n  libssh2.dir\\Release\\userauth.obj\n  libssh2.dir\\Release\\version.obj\n  libssh2.vcxproj -> E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\Release\\libssh2.lib\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1913): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1914): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1950): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1950): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(277): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(277): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(300): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(300): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\bcrypt_pbkdf.c(119): warning C6260: sizeof * sizeof is usually wrong.  Did you intend to use a character count or a byte count? [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(150): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(555): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(814): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(814): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(947): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(947): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(1843): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(166): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(400): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(596): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(605): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(648): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(657): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(698): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(726): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(857): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1090): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1289): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1297): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1339): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1347): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1387): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1414): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2202): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2326): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2334): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2376): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2384): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2424): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2451): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2835): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2935): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2943): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2985): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2993): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(3033): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(3060): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(4269): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(4274): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\misc.c(282): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(155): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(169): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(311): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(322): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(785): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(830): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(582): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\pem.c(150): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\pem.c(535): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\publickey.c(959): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(176): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(1142): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(1142): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(876): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3241): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3241): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3346): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3448): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3448): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3586): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3586): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(370): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(457): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(487): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(488): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(79): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(231): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(373): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(373): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1168): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1283): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1665): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1663): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1662): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1662): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1661): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1661): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1659): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1990): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"libssh2.dir\\Release\\libssh2.tlog\\unsuccessfulbuild\".\n  Touching \"libssh2.dir\\Release\\libssh2.tlog\\libssh2.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj\" (8) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"qjson.dir\\Release\\\".\n  Creating directory \"E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\Release\\\".\n  Creating directory \"qjson.dir\\Release\\qjson.tlog\\\".\nInitializeBuildStatus:\n  Creating \"qjson.dir\\Release\\qjson.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nPreBuildEvent:\n  Automatic MOC, UIC and RCC for target qjson\n  setlocal\n  cd E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\n  if %errorlevel% neq 0 goto :cmEnd\n  E:\n  if %errorlevel% neq 0 goto :cmEnd\n  \"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E cmake_autogen E:/robo/build/Release/src/third-party/qjson-0.8.1/CMakeFiles/qjson_autogen.dir Release\n  if %errorlevel% neq 0 goto :cmEnd\n  :cmEnd\n  endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone\n  :cmErrorLevel\n  exit /b %1\n  :cmDone\n  if %errorlevel% neq 0 goto :VCEnd\n  :VCEnd\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/qjson-0.8.1/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/qjson-0.8.1/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson_autogen\\include_Release\" /I\"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtCore /I\"E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\.\\mkspecs\\win32-msvc\" /nologo /W3 /WX- /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D QJSON_STATIC /D QT_CORE_LIB /D QT_NO_DEBUG /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"qjson.dir\\Release\\\\\" /Fd\"qjson.dir\\Release\\qjson.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4065 /wd5033 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\parser.cpp\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\qobjecthelper.cpp\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\json_scanner.cpp\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\json_parser.cc\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\parserrunnable.cpp\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\serializer.cpp\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\serializerrunnable.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson_autogen\\mocs_compilation.cpp\"\n  parser.cpp\n  qobjecthelper.cpp\n  json_scanner.cpp\n  json_parser.cc\n  parserrunnable.cpp\n  serializer.cpp\n  serializerrunnable.cpp\n  mocs_compilation.cpp\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\Release\\qjson.lib\" /NOLOGO /MACHINE:X64  /machine:x64 qjson.dir\\Release\\parser.obj\n  qjson.dir\\Release\\qobjecthelper.obj\n  qjson.dir\\Release\\json_scanner.obj\n  qjson.dir\\Release\\json_parser.obj\n  qjson.dir\\Release\\parserrunnable.obj\n  qjson.dir\\Release\\serializer.obj\n  qjson.dir\\Release\\serializerrunnable.obj\n  qjson.dir\\Release\\mocs_compilation.obj\n  qjson.vcxproj -> E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\Release\\qjson.lib\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::strongref' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\parser.cpp(33): warning C26495: Variable 'QJson::ParserPrivate::m_errorLine' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\qobjecthelper.h(130): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(3799): warning C26495: Variable 'yyFlexLexer::yy_full_state' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\flexlexer.h(99): warning C26495: Variable 'FlexLexer::yy_flex_debug' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4008): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4010): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4010): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4089): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4223): warning C6011: Dereferencing NULL pointer 'yy_buffer_stack'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4256): warning C6011: Dereferencing NULL pointer 'b'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4314): warning C6011: Dereferencing NULL pointer 'b'. See line 4302 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4370): warning C6011: Dereferencing NULL pointer 'yy_buffer_stack'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\json_scanner.cpp(35): warning C26495: Variable 'JSonScanner::m_yylval' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(491): warning C6011: Dereferencing NULL pointer 'd'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(570): warning C6011: Dereferencing NULL pointer 'x'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(535): warning C26498: The function 'qMetaTypeId<QMap<QString,QVariant> * __ptr64>' is constexpr, mark variable 'type' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"qjson.dir\\Release\\qjson.tlog\\unsuccessfulbuild\".\n  Touching \"qjson.dir\\Release\\qjson.tlog\\qjson.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj\" (9) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"qscintilla.dir\\Release\\\".\n  Creating directory \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\Release\\\".\n  Creating directory \"qscintilla.dir\\Release\\qscintilla.tlog\\\".\nInitializeBuildStatus:\n  Creating \"qscintilla.dir\\Release\\qscintilla.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nPreBuildEvent:\n  Automatic MOC, UIC and RCC for target qscintilla\n  setlocal\n  cd E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\n  if %errorlevel% neq 0 goto :cmEnd\n  E:\n  if %errorlevel% neq 0 goto :cmEnd\n  \"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E cmake_autogen E:/robo/build/Release/src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla_autogen.dir Release\n  if %errorlevel% neq 0 goto :cmEnd\n  :cmEnd\n  endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone\n  :cmErrorLevel\n  exit /b %1\n  :cmDone\n  if %errorlevel% neq 0 goto :VCEnd\n  :VCEnd\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/qscintilla-2.8.4/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/qscintilla-2.8.4/CMakeFiles/generate.stamp is up-to-date.\n  Generating sources/Qt4Qt5/Qsci/moc_qsciabstractapis.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qsciapis.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qscilexer.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qscilexercpp.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qscilexerjavascript.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qscimacro.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qsciscintilla.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qsciscintillabase.cpp\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla_autogen\\include_Release\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\include\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtWidgets /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtGui /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtANGLE /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtCore /I\"E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\.\\mkspecs\\win32-msvc\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtPrintSupport /nologo /W3 /WX- /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D SCINTILLA_QT /D SCI_LEXER /D QT_WIDGETS_LIB /D QT_GUI_LIB /D QT_CORE_LIB /D QT_NO_DEBUG /D QT_PRINTSUPPORT_LIB /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"qscintilla.dir\\Release\\\\\" /Fd\"qscintilla.dir\\Release\\qscintilla.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4554 /wd4099 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qsciabstractapis.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qsciapis.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qscilexer.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qscilexercpp.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qscilexerjavascript.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qscimacro.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qsciscintilla.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qsciscintillabase.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\StyleContext.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\WordList.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\Accessor.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\LexerBase.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\LexerModule.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\CharacterSet.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\CharacterCategory.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\PropSetSimple.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\LexerSimple.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\LexerNoExceptions.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscilexer.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscilexerjavascript.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscilexercpp.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscistyle.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\InputMethod.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qsciabstractapis.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\ScintillaQt.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscidocument.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qsciscintilla.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qsciscintillabase.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscicommand.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\ListBoxQt.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscistyledtext.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\SciClasses.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qsciprinter.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\PlatQt.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\MacPasteboardMime.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscimacro.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qsciapis.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscicommandset.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexers\\LexCPP.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\AutoComplete.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\CallTip.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\CaseConvert.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\CaseFolder.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Catalogue.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\CellBuffer.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\CharClassify.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\ContractionState.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Decoration.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Document.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Editor.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\ExternalLexer.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Indicator.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\KeyMap.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\LineMarker.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\PerLine.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\PositionCache.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\RESearch.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\RunStyles.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\ScintillaBase.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Selection.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Style.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\UniConversion.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\ViewStyle.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\XPM.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla_autogen\\mocs_compilation.cpp\"\n  moc_qsciabstractapis.cpp\n  moc_qsciapis.cpp\n  moc_qscilexer.cpp\n  moc_qscilexercpp.cpp\n  moc_qscilexerjavascript.cpp\n  moc_qscimacro.cpp\n  moc_qsciscintilla.cpp\n  moc_qsciscintillabase.cpp\n  StyleContext.cpp\n  WordList.cpp\n  Accessor.cpp\n  LexerBase.cpp\n  LexerModule.cpp\n  CharacterSet.cpp\n  CharacterCategory.cpp\n  PropSetSimple.cpp\n  LexerSimple.cpp\n  LexerNoExceptions.cpp\n  qscilexer.cpp\n  qscilexerjavascript.cpp\n  qscilexercpp.cpp\n  qscistyle.cpp\n  InputMethod.cpp\n  qsciabstractapis.cpp\n  ScintillaQt.cpp\n  qscidocument.cpp\n  qsciscintilla.cpp\n  qsciscintillabase.cpp\n  qscicommand.cpp\n  ListBoxQt.cpp\n  qscistyledtext.cpp\n  SciClasses.cpp\n  qsciprinter.cpp\n  PlatQt.cpp\n  MacPasteboardMime.cpp\n  qscimacro.cpp\n  qsciapis.cpp\n  qscicommandset.cpp\n  LexCPP.cpp\n  AutoComplete.cpp\n  CallTip.cpp\n  CaseConvert.cpp\n  CaseFolder.cpp\n  Catalogue.cpp\n  CellBuffer.cpp\n  CharClassify.cpp\n  ContractionState.cpp\n  Decoration.cpp\n  Document.cpp\n  Editor.cpp\n  ExternalLexer.cpp\n  Indicator.cpp\n  KeyMap.cpp\n  LineMarker.cpp\n  PerLine.cpp\n  PositionCache.cpp\n  RESearch.cpp\n  RunStyles.cpp\n  ScintillaBase.cpp\n  Selection.cpp\n  Style.cpp\n  UniConversion.cpp\n  ViewStyle.cpp\n  XPM.cpp\n  mocs_compilation.cpp\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\Release\\qscintilla.lib\" /NOLOGO /MACHINE:X64  /machine:x64 /IGNORE:4221 qscintilla.dir\\Release\\moc_qsciabstractapis.obj\n  qscintilla.dir\\Release\\moc_qsciapis.obj\n  qscintilla.dir\\Release\\moc_qscilexer.obj\n  qscintilla.dir\\Release\\moc_qscilexercpp.obj\n  qscintilla.dir\\Release\\moc_qscilexerjavascript.obj\n  qscintilla.dir\\Release\\moc_qscimacro.obj\n  qscintilla.dir\\Release\\moc_qsciscintilla.obj\n  qscintilla.dir\\Release\\moc_qsciscintillabase.obj\n  qscintilla.dir\\Release\\StyleContext.obj\n  qscintilla.dir\\Release\\WordList.obj\n  qscintilla.dir\\Release\\Accessor.obj\n  qscintilla.dir\\Release\\LexerBase.obj\n  qscintilla.dir\\Release\\LexerModule.obj\n  qscintilla.dir\\Release\\CharacterSet.obj\n  qscintilla.dir\\Release\\CharacterCategory.obj\n  qscintilla.dir\\Release\\PropSetSimple.obj\n  qscintilla.dir\\Release\\LexerSimple.obj\n  qscintilla.dir\\Release\\LexerNoExceptions.obj\n  qscintilla.dir\\Release\\qscilexer.obj\n  qscintilla.dir\\Release\\qscilexerjavascript.obj\n  qscintilla.dir\\Release\\qscilexercpp.obj\n  qscintilla.dir\\Release\\qscistyle.obj\n  qscintilla.dir\\Release\\InputMethod.obj\n  qscintilla.dir\\Release\\qsciabstractapis.obj\n  qscintilla.dir\\Release\\ScintillaQt.obj\n  qscintilla.dir\\Release\\qscidocument.obj\n  qscintilla.dir\\Release\\qsciscintilla.obj\n  qscintilla.dir\\Release\\qsciscintillabase.obj\n  qscintilla.dir\\Release\\qscicommand.obj\n  qscintilla.dir\\Release\\ListBoxQt.obj\n  qscintilla.dir\\Release\\qscistyledtext.obj\n  qscintilla.dir\\Release\\SciClasses.obj\n  qscintilla.dir\\Release\\qsciprinter.obj\n  qscintilla.dir\\Release\\PlatQt.obj\n  qscintilla.dir\\Release\\MacPasteboardMime.obj\n  qscintilla.dir\\Release\\qscimacro.obj\n  qscintilla.dir\\Release\\qsciapis.obj\n  qscintilla.dir\\Release\\qscicommandset.obj\n  qscintilla.dir\\Release\\LexCPP.obj\n  qscintilla.dir\\Release\\AutoComplete.obj\n  qscintilla.dir\\Release\\CallTip.obj\n  qscintilla.dir\\Release\\CaseConvert.obj\n  qscintilla.dir\\Release\\CaseFolder.obj\n  qscintilla.dir\\Release\\Catalogue.obj\n  qscintilla.dir\\Release\\CellBuffer.obj\n  qscintilla.dir\\Release\\CharClassify.obj\n  qscintilla.dir\\Release\\ContractionState.obj\n  qscintilla.dir\\Release\\Decoration.obj\n  qscintilla.dir\\Release\\Document.obj\n  qscintilla.dir\\Release\\Editor.obj\n  qscintilla.dir\\Release\\ExternalLexer.obj\n  qscintilla.dir\\Release\\Indicator.obj\n  qscintilla.dir\\Release\\KeyMap.obj\n  qscintilla.dir\\Release\\LineMarker.obj\n  qscintilla.dir\\Release\\PerLine.obj\n  qscintilla.dir\\Release\\PositionCache.obj\n  qscintilla.dir\\Release\\RESearch.obj\n  qscintilla.dir\\Release\\RunStyles.obj\n  qscintilla.dir\\Release\\ScintillaBase.obj\n  qscintilla.dir\\Release\\Selection.obj\n  qscintilla.dir\\Release\\Style.obj\n  qscintilla.dir\\Release\\UniConversion.obj\n  qscintilla.dir\\Release\\ViewStyle.obj\n  qscintilla.dir\\Release\\XPM.obj\n  qscintilla.dir\\Release\\mocs_compilation.obj\n  qscintilla.vcxproj -> E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\Release\\qscintilla.lib\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qvector2d.h(60): warning C26495: Variable 'QVector2D::v' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::strongref' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(283): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(286): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(289): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(292): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(296): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(60): warning C26495: Variable 'QMatrix::_m21' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(70): warning C26495: Variable 'QMatrix::_m21' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qpalette.h(71): warning C26495: Variable 'QPalette::<anonymous-tag>::for_faster_swapping_dont_use' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qfontmetrics.h(149): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qsciscintilla.h(2078): warning C26495: Variable 'QsciScintilla::FindState::wrap' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\lexaccessor.h(56): warning C26495: Variable 'LexAccessor::buf' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\stylecontext.h(140): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(64): warning C6386: Buffer overrun while writing to 'keywords':  the writable size is '(words+1)*8' bytes, but '24' bytes might be written. [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(47): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(69): warning C26495: Variable 'WordList::starts' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscilexer.h(341): warning C26495: Variable 'QsciLexer::StyleDataMap::style_data_set' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscilexer.h(336): warning C26495: Variable 'QsciLexer::StyleData::eol_fill' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscistyle.cpp(34): warning C26495: Variable 'QsciStyle::style_changeable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscistyle.cpp(48): warning C26495: Variable 'QsciStyle::style_changeable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\include\\platform.h(175): warning C26495: Variable 'ColourDesired::co' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\partitioning.h(91): warning C26495: Variable 'Partitioning::stepPartition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.h(122): warning C26495: Variable 'HighlightDelimiter::endFoldBlock' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(67): warning C26495: Variable 'SplitVector<int>::gapLength' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(35): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(40): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvarlengtharray.h(263): warning C26495: Variable 'QVarLengthArray<char,1024>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(144): warning C26495: Variable 'QStyleOptionFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(172): warning C26495: Variable 'QStyleOptionTabWidgetFrame::midLineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(196): warning C26495: Variable 'QStyleOptionTabBarBase::documentMode' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(227): warning C26495: Variable 'QStyleOptionHeader::section' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(286): warning C26495: Variable 'QStyleOptionTab::selectedPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(316): warning C26495: Variable 'QStyleOptionToolBar::positionOfLine' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(343): warning C26495: Variable 'QStyleOptionProgressBar::maximum' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(373): warning C26495: Variable 'QStyleOptionMenuItem::tabWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(392): warning C26495: Variable 'QStyleOptionDockWidget::floatable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(443): warning C26495: Variable 'QStyleOptionViewItem::showDecorationSelected' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(473): warning C26495: Variable 'QStyleOptionToolBox::position' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(492): warning C26495: Variable 'QStyleOptionRubberBand::opaque' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(534): warning C26495: Variable 'QStyleOptionSlider::dialWrapping' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(553): warning C26495: Variable 'QStyleOptionSpinBox::buttonSymbols' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(580): warning C26495: Variable 'QStyleOptionToolButton::arrowType' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(602): warning C26495: Variable 'QStyleOptionComboBox::editable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(620): warning C26495: Variable 'QStyleOptionTitleBar::titleBarState' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(640): warning C26495: Variable 'QStyleOptionGroupBox::midLineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(654): warning C26495: Variable 'QStyleOptionSizeGrip::corner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(670): warning C26495: Variable 'QStyleOptionGraphicsItem::levelOfDetail' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(114): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(363): warning C6281: Incorrect order of operations:  relational operators have higher precedence than bitwise operators. [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(365): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2304): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscidocument.cpp(59): warning C26495: Variable 'QsciDocument::pdoc' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(74): warning C26495: Variable 'QsciScintilla::ctPos' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(86): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(89): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(91): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(95): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(97): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(99): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(101): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(103): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(105): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(107): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(109): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(111): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(719): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(975): warning C6385: Reading invalid data from 'text':  the readable size is '((epos-spos+1))*2*1' bytes, but '3' bytes may be read. [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2258): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2258): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2292): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3233): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3237): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3231): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3239): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3235): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3951): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(4037): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(4123): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(102): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(99): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(140): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(93): warning C26495: Variable 'QsciSciPopup::sci' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(96): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(152): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(570): warning C6011: Dereferencing NULL pointer 'x'.  [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(414): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(414): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(438): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(438): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(445): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(445): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(456): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(456): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(470): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(471): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(539): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(540): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(666): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(666): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(952): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(955): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(957): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscimacro.h(99): warning C26495: Variable 'QsciMacro::Macro::wParam' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscimacro.cpp(255): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(92): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::pointer_segments' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(135): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::pointer_segments' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(144): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::pointer_segments' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(202): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(370): warning C6011: Dereferencing NULL pointer 'd'.  [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexers\\lexcpp.cpp(199): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(40): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::pb' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(34): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::ps' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(31): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::ps' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(141): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(141): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(143): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(143): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(174): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(247): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\casefolder.cpp(22): warning C26495: Variable 'CaseFolderTable::mapping' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\charclassify.cpp(22): warning C26495: Variable 'CharClassify::charClass' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.cpp(1575): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.cpp(1663): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(1763): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(2567): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(2568): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(3259): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(3260): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7204): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(8549): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(8549): warning C26451: Arithmetic overflow: Using operator '<<' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '<<' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7997): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7988): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7988): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7668): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7668): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7560): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7487): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7393): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\linemarker.cpp(116): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\linemarker.cpp(117): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(87): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(88): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(89): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(92): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(92): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(234): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(524): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(524): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(620): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\research.cpp(256): warning C26495: Variable 'RESearch::bopat' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\research.cpp(287): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\scintillabase.cpp(740): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\scintillabase.cpp(740): warning C26451: Arithmetic overflow: Using operator '<<' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '<<' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\style.cpp(60): warning C26495: Variable 'FontMeasurements::sizeZoomed' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\style.cpp(72): warning C26495: Variable 'Style::underline' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\viewstyle.cpp(87): warning C26495: Variable 'ViewStyle::nextExtendedStyle' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\viewstyle.cpp(91): warning C26495: Variable 'ViewStyle::largestMarkerHeight' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\xpm.cpp(59): warning C26495: Variable 'RGBAImage::scale' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"qscintilla.dir\\Release\\qscintilla.tlog\\unsuccessfulbuild\".\n  Touching \"qscintilla.dir\\Release\\qscintilla.tlog\\qscintilla.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj\" (10) on node 1 (default targets).\nProject \"E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj\" (10) is building \"E:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen.vcxproj\" (11) on node 1 (default targets).\nProject \"E:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen.vcxproj\" (11) is building \"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj\" (12) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"ssh.dir\\Release\\\".\n  Creating directory \"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\Release\\\".\n  Creating directory \"ssh.dir\\Release\\ssh.tlog\\\".\nInitializeBuildStatus:\n  Creating \"ssh.dir\\Release\\ssh.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/robomongo/ssh/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/robomongo/ssh/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /IE:\\robo\\build\\Release\\src /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /W3 /WX- /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo\"ssh.dir\\Release\\\\\" /Fd\"ssh.dir\\Release\\ssh.pdb\" /Gd /TC /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" E:\\robo\\src\\robomongo\\ssh\\ssh.c E:\\robo\\src\\robomongo\\ssh\\log.c E:\\robo\\src\\robomongo\\ssh\\array.c\n  ssh.c\n  log.c\n  array.c\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\Release\\ssh.lib\" /NOLOGO /MACHINE:X64  /machine:x64 ssh.dir\\Release\\ssh.obj\n  ssh.dir\\Release\\log.obj\n  ssh.dir\\Release\\array.obj\n  ssh.vcxproj -> E:\\robo\\build\\Release\\src\\robomongo\\ssh\\Release\\ssh.lib\ne:\\robo\\src\\robomongo\\ssh\\ssh.c(585): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\array.c(44): warning C6386: Buffer overrun while writing to 'newarray':  the writable size is 'newsize*sizeof(void *)' bytes, but '8' bytes might be written. [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C6386: Buffer overrun while writing to 'newarray+i':  the writable size is 'newsize*sizeof(void *)' bytes, but '8' bytes might be written. [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"ssh.dir\\Release\\ssh.tlog\\unsuccessfulbuild\".\n  Touching \"ssh.dir\\Release\\ssh.tlog\\ssh.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj\" (default targets).\nPrepareForBuild:\n  Creating directory \"x64\\Release\\robomongo_autogen\\\".\n  Creating directory \"x64\\Release\\robomongo_autogen\\robomong.8F06E81C.tlog\\\".\nInitializeBuildStatus:\n  Creating \"x64\\Release\\robomongo_autogen\\robomong.8F06E81C.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/robomongo/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/robomongo/CMakeFiles/generate.stamp is up-to-date.\n  Automatic MOC, UIC and RCC for target robomongo\nFinalizeBuildStatus:\n  Deleting file \"x64\\Release\\robomongo_autogen\\robomong.8F06E81C.tlog\\unsuccessfulbuild\".\n  Touching \"x64\\Release\\robomongo_autogen\\robomong.8F06E81C.tlog\\robomongo_autogen.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen.vcxproj\" (default targets).\nPrepareForBuild:\n  Creating directory \"robomongo.dir\\Release\\\".\n  Creating directory \"E:\\robo\\build\\Release\\src\\robomongo\\Release\\\".\n  Creating directory \"robomongo.dir\\Release\\robomongo.tlog\\\".\nInitializeBuildStatus:\n  Creating \"robomongo.dir\\Release\\robomongo.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/robomongo/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/robomongo/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /IE:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen\\include_Release /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\include\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\" /IE:\\robo\\build\\Release\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtWidgets /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtGui /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtANGLE /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtCore /I\"E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\.\\mkspecs\\win32-msvc\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtNetwork /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtXml /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtPrintSupport /I\"E:\\robo-shell\\src\" /I\"E:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\" /I\"E:\\robo-shell\\src\\third_party\\boost-1.70.0\" /I\"E:\\robo-shell\\src\\third_party\\fmt\\dist\\include\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\include\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\mongo_sources\" /I\"E:\\robo-shell\\src\\third_party\\pcre-8.42\" /I\"E:\\robo-shell\\src\\third_party\\SafeInt\" /I\"E:\\robo-shell\\build\\opt\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\platform\\x86_64\\windows\\include\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /W3 /WX- /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D BUILDING_ROBO /D \"PROJECT_NAME=\\\"Robo 3T\\\"\" /D \"PROJECT_NAME_TITLE=\\\"Robo 3T\\\"\" /D \"PROJECT_COPYRIGHT=\\\"Copyright (C) 2014-2017 3T Software Labs Ltd All Rights Reserved.\\\"\" /D \"PROJECT_DOMAIN=\\\"www.robomongo.org\\\"\" /D \"PROJECT_COMPANYNAME=\\\"3T Software Labs Ltd\\\"\" /D \"PROJECT_COMPANYNAME_DOMAIN=\\\"https://studio3t.com/\\\"\" /D \"PROJECT_GITHUB_FORK=\\\"www.github.com/Studio3T/robomongo\\\"\" /D \"PROJECT_GITHUB_ISSUES=\\\"www.github.com/Studio3T/robomongo/issues\\\"\" /D \"PROJECT_VERSION=\\\"1.4.0\\\"\" /D \"PROJECT_VERSION_SHORT=\\\"1.4\\\"\" /D \"PROJECT_NAME_LOWERCASE=\\\"robo 3t\\\"\" /D \"PROJECT_QT_VERSION=\\\"5.12.8\\\"\" /D \"MongoDB_VERSION=\\\"r4.2.6\\\"\" /D \"OPENSSL_VERSION=\\\"1.1.1f\\\"\" /D \"LIBSSH2_VERSION=\\\"1.9.0\\\"\" /D \"QJSON_VERSION=\\\"0.8.1\\\"\" /D \"GOOGLE_TEST_VERSION=\\\"1.8.1\\\"\" /D \"ESPRIMA_VERSION=\\\"2.7.3\\\"\" /D QT_WIDGETS_LIB /D QT_GUI_LIB /D QT_CORE_LIB /D QT_NO_DEBUG /D QT_NETWORK_LIB /D QT_XML_LIB /D QJSON_STATIC /D SCINTILLA_QT /D SCI_LEXER /D QT_PRINTSUPPORT_LIB /D PCRE_STATIC /D BOOST_THREAD_VERSION=4 /D BOOST_THREAD_DONT_PROVIDE_VARIADIC_THREAD /D BOOST_THREAD_NO_DEPRECATED /D BOOST_THREAD_DONT_PROVIDE_INTERRUPTIONS /D BOOST_THREAD_HAS_BUG /D MONGO_CONFIG_HAVE_HEADER_UNISTD_H /D _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING /D _SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"robomongo.dir\\Release\\\\\" /Fd\"robomongo.dir\\Release\\vc141.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4477 /wd4291 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" E:\\robo\\src\\robomongo\\app\\main.cpp E:\\robo\\src\\robomongo\\core\\utils\\QtUtils.cpp E:\\robo\\src\\robomongo\\core\\utils\\StdUtils.cpp E:\\robo\\src\\robomongo\\core\\utils\\Logger.cpp E:\\robo\\src\\robomongo\\core\\HexUtils.cpp E:\\robo\\src\\robomongo\\core\\utils\\BsonUtils.cpp E:\\robo\\src\\robomongo\\core\\settings\\CredentialSettings.cpp E:\\robo\\src\\robomongo\\core\\settings\\ConnectionSettings.cpp E:\\robo\\src\\robomongo\\core\\Event.cpp E:\\robo\\src\\robomongo\\core\\Enums.cpp E:\\robo\\src\\robomongo\\core\\EventError.cpp E:\\robo\\src\\robomongo\\core\\EventBusSubscriber.cpp E:\\robo\\src\\robomongo\\core\\EventBusDispatcher.cpp E:\\robo\\src\\robomongo\\core\\EventWrapper.cpp E:\\robo\\src\\robomongo\\core\\EventBus.cpp E:\\robo\\src\\robomongo\\core\\KeyboardManager.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoNamespace.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoFunction.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoUtils.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoCollection.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoCollectionInfo.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoQueryInfo.cpp E:\\robo\\src\\robomongo\\core\\domain\\CursorPosition.cpp E:\\robo\\src\\robomongo\\core\\domain\\ScriptInfo.cpp E:\\robo\\src\\robomongo\\core\\events\\MongoEventsInfo.cpp E:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp E:\\robo\\src\\robomongo\\shell\\bson\\json.cpp E:\\robo\\src\\robomongo\\core\\engine\\ScriptEngine.cpp E:\\robo\\src\\robomongo\\core\\events\\MongoEvents.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoDocument.cpp E:\\robo\\src\\robomongo\\gui\\AppStyle.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoServer.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoShell.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoDatabase.cpp E:\\robo\\src\\robomongo\\core\\domain\\App.cpp E:\\robo\\src\\robomongo\\core\\mongodb\\MongoClient.cpp E:\\robo\\src\\robomongo\\core\\mongodb\\MongoWorker.cpp E:\\robo\\src\\robomongo\\core\\mongodb\\ReplicaSet.cpp E:\\robo\\src\\robomongo\\core\\settings\\SettingsManager.cpp E:\\robo\\src\\robomongo\\core\\AppRegistry.cpp E:\\robo\\src\\robomongo\\utils\\StringOperations.cpp E:\\robo\\src\\robomongo\\utils\\common.cpp E:\\robo\\src\\robomongo\\utils\\SimpleCrypt.cpp E:\\robo\\src\\robomongo\\utils\\RoboCrypt.cpp E:\\robo\\src\\robomongo\\gui\\GuiRegistry.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\AboutDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\EulaDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionAdvancedTab.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionAuthTab.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionBasicTab.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionDiagnosticDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\CopyCollectionDialog.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\IndicatorLabel.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\CreateCollectionDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\CreateDatabaseDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\CreateUserDialog.cpp E:\\robo\\src\\robomongo\\gui\\utils\\ComboBoxUtils.cpp E:\\robo\\src\\robomongo\\gui\\utils\\DialogUtils.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\PreferencesDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionsDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ExportDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ChangeShellTimeoutDialog.cpp E:\\robo\\src\\robomongo\\gui\\editors\\PlainJavaScriptEditor.cpp E:\\robo\\src\\robomongo\\gui\\editors\\JSLexer.cpp E:\\robo\\src\\robomongo\\gui\\editors\\FindFrame.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\AddEditIndexDialog.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\ScriptWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerCollectionTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerCollectionIndexesDir.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerCollectionIndexItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerReplicaSetFolderItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerReplicaSetTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerDatabaseTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerDatabaseCategoryTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerUserTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerFunctionTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\DocumentTextEditor.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\FunctionTextEditor.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerServerTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerTreeWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\BsonTableModel.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\BsonTableView.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\BsonTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\BsonTreeModel.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\BsonTreeView.cpp E:\\robo\\src\\robomongo\\core\\domain\\Notifier.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\CollectionStatsTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\CollectionStatsTreeWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\JsonPrepareThread.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\OutputItemContentWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\OutputItemHeaderWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\OutputWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\PagingWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\ProgressBarPopup.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\QueryWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\WorkAreaTabBar.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\WorkAreaTabWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\WelcomeTab.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\LogWidget.cpp E:\\robo\\src\\robomongo\\gui\\MainWindow.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\SSHTunnelTab.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\SSLTab.cpp E:\\robo\\src\\robomongo\\core\\settings\\SshSettings.cpp E:\\robo\\src\\robomongo\\core\\settings\\SslSettings.cpp E:\\robo\\src\\robomongo\\core\\settings\\ReplicaSetSettings.cpp E:\\robo\\src\\robomongo\\core\\mongodb\\SshTunnelWorker.cpp E:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen\\mocs_compilation.cpp E:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen\\3YJK5W5UP7\\qrc_robo.cpp E:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen\\YHP5W5E6RA\\qrc_gui.cpp\n  main.cpp\n  QtUtils.cpp\n  StdUtils.cpp\n  Logger.cpp\n  HexUtils.cpp\n  BsonUtils.cpp\n  CredentialSettings.cpp\n  ConnectionSettings.cpp\n  Event.cpp\n  Enums.cpp\n  EventError.cpp\n  EventBusSubscriber.cpp\n  EventBusDispatcher.cpp\n  EventWrapper.cpp\n  EventBus.cpp\n  KeyboardManager.cpp\n  MongoNamespace.cpp\n  MongoFunction.cpp\n  MongoUtils.cpp\n  MongoCollection.cpp\n  MongoCollectionInfo.cpp\n  MongoQueryInfo.cpp\n  CursorPosition.cpp\n  ScriptInfo.cpp\n  MongoEventsInfo.cpp\n  ptimeutil.cpp\n  json.cpp\n  ScriptEngine.cpp\n  MongoEvents.cpp\n  MongoDocument.cpp\n  AppStyle.cpp\n  MongoServer.cpp\n  MongoShell.cpp\n  MongoDatabase.cpp\n  App.cpp\n  MongoClient.cpp\n  MongoWorker.cpp\n  ReplicaSet.cpp\n  SettingsManager.cpp\n  AppRegistry.cpp\n  StringOperations.cpp\n  common.cpp\n  SimpleCrypt.cpp\n  RoboCrypt.cpp\n  GuiRegistry.cpp\n  AboutDialog.cpp\n  EulaDialog.cpp\n  ConnectionAdvancedTab.cpp\n  ConnectionAuthTab.cpp\n  ConnectionBasicTab.cpp\n  ConnectionDiagnosticDialog.cpp\n  ConnectionDialog.cpp\n  CopyCollectionDialog.cpp\n  IndicatorLabel.cpp\n  CreateCollectionDialog.cpp\n  CreateDatabaseDialog.cpp\n  CreateUserDialog.cpp\n  ComboBoxUtils.cpp\n  DialogUtils.cpp\n  PreferencesDialog.cpp\n  ConnectionsDialog.cpp\n  ExportDialog.cpp\n  ChangeShellTimeoutDialog.cpp\n  PlainJavaScriptEditor.cpp\n  JSLexer.cpp\n  FindFrame.cpp\n  AddEditIndexDialog.cpp\n  ScriptWidget.cpp\n  ExplorerCollectionTreeItem.cpp\n  ExplorerCollectionIndexesDir.cpp\n  ExplorerCollectionIndexItem.cpp\n  ExplorerTreeItem.cpp\n  ExplorerReplicaSetFolderItem.cpp\n  ExplorerReplicaSetTreeItem.cpp\n  ExplorerDatabaseTreeItem.cpp\n  ExplorerDatabaseCategoryTreeItem.cpp\n  ExplorerUserTreeItem.cpp\n  ExplorerFunctionTreeItem.cpp\n  DocumentTextEditor.cpp\n  FunctionTextEditor.cpp\n  ExplorerServerTreeItem.cpp\n  ExplorerTreeWidget.cpp\n  ExplorerWidget.cpp\n  BsonTableModel.cpp\n  BsonTableView.cpp\n  BsonTreeItem.cpp\n  BsonTreeModel.cpp\n  BsonTreeView.cpp\n  Notifier.cpp\n  CollectionStatsTreeItem.cpp\n  CollectionStatsTreeWidget.cpp\n  JsonPrepareThread.cpp\n  OutputItemContentWidget.cpp\n  OutputItemHeaderWidget.cpp\n  OutputWidget.cpp\n  PagingWidget.cpp\n  ProgressBarPopup.cpp\n  QueryWidget.cpp\n  WorkAreaTabBar.cpp\n  WorkAreaTabWidget.cpp\n  WelcomeTab.cpp\n  LogWidget.cpp\n  MainWindow.cpp\n  SSHTunnelTab.cpp\n  SSLTab.cpp\n  SshSettings.cpp\n  SslSettings.cpp\n  ReplicaSetSettings.cpp\n  SshTunnelWorker.cpp\n  mocs_compilation.cpp\n  qrc_robo.cpp\n  qrc_gui.cpp\nResourceCompile:\n  C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.18362.0\\x86\\rc.exe /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D BUILDING_ROBO /D \"PROJECT_NAME=\\\\\\\"Robo 3T\\\\\\\"\" /D \"PROJECT_NAME_TITLE=\\\\\\\"Robo 3T\\\\\\\"\" /D \"PROJECT_COPYRIGHT=\\\\\\\"Copyright (C) 2014-2017 3T Software Labs Ltd All Rights Reserved.\\\\\\\"\" /D \"PROJECT_DOMAIN=\\\\\\\"www.robomongo.org\\\\\\\"\" /D \"PROJECT_COMPANYNAME=\\\\\\\"3T Software Labs Ltd\\\\\\\"\" /D \"PROJECT_COMPANYNAME_DOMAIN=\\\\\\\"https://studio3t.com/\\\\\\\"\" /D \"PROJECT_GITHUB_FORK=\\\\\\\"www.github.com/Studio3T/robomongo\\\\\\\"\" /D \"PROJECT_GITHUB_ISSUES=\\\\\\\"www.github.com/Studio3T/robomongo/issues\\\\\\\"\" /D \"PROJECT_VERSION=\\\\\\\"1.4.0\\\\\\\"\" /D \"PROJECT_VERSION_SHORT=\\\\\\\"1.4\\\\\\\"\" /D \"PROJECT_NAME_LOWERCASE=\\\\\\\"robo 3t\\\\\\\"\" /D \"PROJECT_QT_VERSION=\\\\\\\"5.12.8\\\\\\\"\" /D \"MongoDB_VERSION=\\\\\\\"r4.2.6\\\\\\\"\" /D \"OPENSSL_VERSION=\\\\\\\"1.1.1f\\\\\\\"\" /D \"LIBSSH2_VERSION=\\\\\\\"1.9.0\\\\\\\"\" /D \"QJSON_VERSION=\\\\\\\"0.8.1\\\\\\\"\" /D \"GOOGLE_TEST_VERSION=\\\\\\\"1.8.1\\\\\\\"\" /D \"ESPRIMA_VERSION=\\\\\\\"2.7.3\\\\\\\"\" /D QT_WIDGETS_LIB /D QT_GUI_LIB /D QT_CORE_LIB /D QT_NO_DEBUG /D QT_NETWORK_LIB /D QT_XML_LIB /D QJSON_STATIC /D SCINTILLA_QT /D SCI_LEXER /D QT_PRINTSUPPORT_LIB /D PCRE_STATIC /D BOOST_THREAD_VERSION=4 /D BOOST_THREAD_DONT_PROVIDE_VARIADIC_THREAD /D BOOST_THREAD_NO_DEPRECATED /D BOOST_THREAD_DONT_PROVIDE_INTERRUPTIONS /D BOOST_THREAD_HAS_BUG /D MONGO_CONFIG_HAVE_HEADER_UNISTD_H /D _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING /D _SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING /D \"CMAKE_INTDIR=\\\\\\\"Release\\\\\\\"\" /D _UNICODE /D UNICODE /l\"0x0409\" /IE:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen\\include_Release /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\include\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\" /IE:\\robo\\build\\Release\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtWidgets /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtGui /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtANGLE /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtCore /I\"E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\.\\mkspecs\\win32-msvc\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtNetwork /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtXml /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtPrintSupport /I\"E:\\robo-shell\\src\" /I\"E:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\" /I\"E:\\robo-shell\\src\\third_party\\boost-1.70.0\" /I\"E:\\robo-shell\\src\\third_party\\fmt\\dist\\include\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\include\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\mongo_sources\" /I\"E:\\robo-shell\\src\\third_party\\pcre-8.42\" /I\"E:\\robo-shell\\src\\third_party\\SafeInt\" /I\"E:\\robo-shell\\build\\opt\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\platform\\x86_64\\windows\\include\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /fo\"robomongo.dir\\Release\\winres.res\" E:\\robo\\build\\Release\\winres.rc \nLink:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe /ERRORREPORT:QUEUE /OUT:\"E:\\robo\\build\\Release\\src\\robomongo\\Release\\robo3t.exe\" /INCREMENTAL:NO /NOLOGO E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5Network.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5Xml.lib \"..\\third-party\\qjson-0.8.1\\Release\\qjson.lib\" \"..\\third-party\\qscintilla-2.8.4\\Release\\qscintilla.lib\" ssh\\Release\\ssh.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\qtmain.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5PrintSupport.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5Widgets.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5Gui.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5Core.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\qtmain.lib \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_options_client.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_options_client_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\message_compressor_options_client_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\kms_shell.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\linenoise.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\mk_wcwidth.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\mongo-server.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\shell_options.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\shell_utils.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\shell_utils_extended.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\shell_utils_launcher.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\version_impl.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\signal_handlers.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\signal_win32.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\log_process_details.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_options_server_helpers.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_options_base.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\cluster_auth_mode_option_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\keyfile_option_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_options_base_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_options_general_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_options_nongeneral_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\is_master_response.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\member_config.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_set_config.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_set_heartbeat_args_v1.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_set_heartbeat_response.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_set_request_votes_args.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_set_tag.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\update_position_args.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\last_vote.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_set_config_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\split_horizon.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\concurrency\\d_concurrency.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\concurrency\\lock_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\concurrency\\lock_state.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\concurrency\\lock_stats.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\concurrency\\replication_state_transition_lock_guard.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\concurrency\\ticketholder.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\concurrency\\flow_control_ticketholder.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\password.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\password_params_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\options_parser_init.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\bench.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\traffic_reader.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\logical_session_id_helpers.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\catalog\\index_key_validate.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\index\\btree_key_generator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\index\\expression_keys_private.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\index\\sort_key_generator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\index\\wildcard_key_generator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\exec\\projection_exec_agg.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\parsed_aggregation_projection.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\parsed_aggregation_projection_node.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\parsed_exclusion_projection.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\parsed_inclusion_projection.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\parsed_add_fields.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\index\\expression_params.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\index\\s2_common.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\hasher.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_index_format.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_matcher.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_query_impl.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_query_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_spec.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_spec_legacy.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_language.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_basic_phrase_matcher.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_basic_tokenizer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_unicode_phrase_matcher.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_unicode_tokenizer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_util.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_element_iterator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\stemmer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\stop_words.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\stop_words_list.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\tokenizer.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_stemmer.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\runtime\\api.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\libstemmer\\libstemmer_utf8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_dutch.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_german.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_porter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_spanish.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_english.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_hungarian.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_portuguese.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_swedish.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_finnish.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_italian.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_romanian.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_turkish.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_danish.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_french.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_norwegian.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_russian.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\unicode\\codepoints_casefold.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\unicode\\codepoints_delimiter_list.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\unicode\\codepoints_diacritic_list.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\unicode\\codepoints_diacritic_map.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\unicode\\string.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\linenoise_utf8.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\index\\index_descriptor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\catalog\\index_catalog.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\catalog\\index_catalog_entry.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\catalog\\disable_index_spec_namespace_generation_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\encrypted_dbclient_base.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\fle_shell_options_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\shell_options_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\shell_options_storage.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\kms.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\kms_aws.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\kms_local.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\kms_gen.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_kms_message.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\hexlify.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_b64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_decrypt_request.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_encrypt_request.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_kv_list.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_message.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_request.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_request_opt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_request_str.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_response.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_response_parser.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\sort.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_crypto_windows.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\base.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\bindata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\bson.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\code.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\countdownlatch.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\cursor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\cursor_handle.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\db.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\dbcollection.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\dbpointer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\dbquery.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\dbref.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\engine.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\error.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\exception.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\global.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\idwrapper.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\implscope.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\internedstring.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\jscustomallocator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\jsstringwrapper.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\jsthread.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\maxkey.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\minkey.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\mongo.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\mongohelpers.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\mongohelpers_js.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\nativefunction.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\numberdecimal.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\numberint.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\numberlong.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\object.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\objectwrapper.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\oid.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\PosixNSPR.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\proxyscope.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\regexp.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\session.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\status.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\timestamp.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\uri.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\valuereader.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\valuewriter.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\engine_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\scripting_util_gen.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_mozjs.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\mongo_sources\\mongoErrorReportToString.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\mongo_sources\\freeOpToJSContext.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\builtin\\RegExp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\frontend\\Parser.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\gc\\StoreBuffer.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\jsarray.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\jsmath.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\mfbt\\Unified_cpp_mfbt0.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\perf\\pm_stub.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\util\\DoubleToString.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\vm\\Interpreter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\vm\\JSAtom.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mfbt\\Compression.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mfbt\\double-conversion\\double-conversion\\strtod.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mfbt\\lz4.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\Printf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\TimeStamp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\StackWalk.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\ConditionVariable_windows.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\Mutex_windows.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\TimeStamp_windows.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_acos.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_acosh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_asin.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_atan2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_atanh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_cosh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_exp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_hypot.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_log.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_log10.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_log2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_pow.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_sinh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_sqrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\k_exp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_asinh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_atan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_cbrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_ceil.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_ceilf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_copysign.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_expm1.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_fabs.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_floor.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_floorf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_log1p.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_nearbyint.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_rint.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_rintf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_scalbn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_tanh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_trunc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_truncf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\jit\\x86-shared\\Disassembler-x86-shared.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src0.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src1.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src10.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src11.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src12.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src13.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src14.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src15.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src16.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src17.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src18.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src19.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src20.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src21.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src22.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src23.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src24.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src25.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src26.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src27.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src28.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src29.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src3.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src30.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src31.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src33.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src34.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src35.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src36.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src37.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src38.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src39.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src4.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src40.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src41.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src42.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src43.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src44.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src5.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src6.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src7.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src9.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\deadline_monitor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\deadline_monitor_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\dbdirectclient_factory.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\engine.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\jsexception.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\utils.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\mongo.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\bson_template_evaluator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\crypto\\aead_encryption.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_algo.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_array.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_expr.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_geo.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_internal_expr_eq.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_leaf.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_text_base.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_text_noop.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_tree.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_where_base.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_where_noop.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_with_placeholder.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\extensions_callback.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\extensions_callback_noop.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\match_details.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\matchable.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\matcher.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\matcher_type_set.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\rewrite_expr.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\encrypt_schema_types.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_all_elem_match_from_index.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_allowed_properties.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_cond.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_eq.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_fmod.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_match_array_index.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_num_array_items.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_num_properties.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_object_match.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_root_doc_eq.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_str_length.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_unique_items.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_xor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\json_pointer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\json_schema_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\encrypt_schema_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\query_knobs_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\expression.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\expression_trigonometric.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\summation.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\regex_util.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\expression_context.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\variables.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\collation\\collator_factory_interface.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\collation\\collation_index_key.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\collation\\collation_spec.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\collation\\collator_interface.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\aggregation_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\explain_options.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document_source_change_stream_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document_source_list_sessions_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document_source_merge_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document_source_merge_modes_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document_source_replace_root_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\exchange_spec_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\value_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document_source_merge_spec.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\resume_token.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\storage\\key_string.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\dependencies.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document_comparator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document_path_support.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\value.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\value_comparator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\intrusive_counter.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\datetime\\date_time_support.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_timelib.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\astro.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\dow.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\interval.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\parse_date.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\parse_iso_intervals.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\parse_tz.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\parse_zoneinfo.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\timelib.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\tm2unixtime.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\unixtime2tm.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\field_path.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\path.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\path_internal.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\geo\\geoparser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\geo\\geometry_container.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\geo\\hash.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\geo\\shapes.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\geo\\big_polygon.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\geo\\r2_region_coverer.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s1angle.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2cellid.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2latlng.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s1interval.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2cap.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2cell.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2cellunion.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2edgeindex.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2edgeutil.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2latlngrect.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2loop.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2pointregion.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2polygon.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2polygonbuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2polyline.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2r2rect.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2region.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2regioncoverer.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2regionintersection.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2regionunion.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\util\\math\\mathutil.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\util\\coding\\coder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\util\\coding\\varint.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\strings\\split.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\strings\\stringprintf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\strings\\strutil.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\base\\int128.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\base\\logging.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\base\\stringprintf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\base\\strtoint.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_query_noop.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\crypto\\symmetric_crypto.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\crypto\\symmetric_crypto_windows.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\crypto\\symmetric_key.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\views\\resolved_view.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\storage\\duplicate_key_error_info.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\connection_string_connect.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\mongo_uri_connect.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\connpool.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\dbclient_connection.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\dbclient_rs.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\global_conn_pool.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\global_conn_pool_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\replica_set_change_notifier.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\replica_set_monitor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\replica_set_monitor_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\thread_pool_task_executor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\network_interface_thread_pool.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\network_interface_factory.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\connection_pool_tl.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\network_interface_tl.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\transport_layer_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\service_executor_adaptive.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\service_executor_reserved.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\service_executor_synchronous.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\service_executor_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\transport_layer_asio.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\system_error.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\async_client.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\message_compressor_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\message_compressor_metrics.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\message_compressor_registry.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\message_compressor_snappy.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\message_compressor_zlib.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\message_compressor_zstd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_zstd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\entropy_common.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\fse_decompress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\threading.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\pool.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\zstd_common.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\error_private.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\xxhash.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\hist.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\fse_compress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\huf_compress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_compress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstdmt_compress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_fast.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_double_fast.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_lazy.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_opt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_ldm.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\decompress\\huf_decompress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\decompress\\zstd_decompress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\cover.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\fastcover.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\divsufsort.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\zdict.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\deprecated\\zbuff_common.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\deprecated\\zbuff_compress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\deprecated\\zbuff_decompress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_zlib.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\adler32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\crc32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\compress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\deflate.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\infback.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\inffast.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\inflate.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\inftrees.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\trees.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\uncompr.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\zutil.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_snappy.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\snappy-1.1.7\\snappy-c.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\snappy-1.1.7\\snappy.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\snappy-1.1.7\\snappy-sinksource.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\network_interface.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\task_executor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\connection_pool.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\egress_tag_closer_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\connection_pool_stats.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\dbclient_base.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\dbclient_cursor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\index_spec.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\private\\ssl_expiration.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_parameters.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_manager_windows.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_stream.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_parameters_gen.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_asio.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\asio-master\\asio\\src\\asio.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_types.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_options.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\private\\socket_poll.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\sock.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\background.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\commands\\server_status.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\stats\\counters.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\commands.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\audit.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\count_command_as_aggregation_command.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\count_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\cursor_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\cursor_response.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\find_and_modify_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\getmore_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\killcursors_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\killcursors_response.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\view_response_formatter.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\count_command_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\factory.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\object_check.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\legacy_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\legacy_request_builder.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\legacy_reply.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\legacy_reply_builder.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\reply_builder_interface.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\object_check_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\mongo_version_range.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_changelog.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_chunk.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_collection.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_config_version.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_database.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_lockpings.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_locks.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_mongos.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_shard_collection.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_shard_database.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_shard.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_tags.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\add_shard_request_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\add_shard_to_zone_request_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\balance_chunk_request_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\commit_chunk_migration_request_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\merge_chunk_request_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\migration_secondary_throttle_options.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\move_chunk_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\remove_shard_from_zone_request_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\set_shard_version_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\split_chunk_request_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\update_zone_key_range_request_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\cannot_implicitly_create_collection_info.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\chunk_version.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\database_version_helpers.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\shard_id.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\stale_exception.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\would_change_owning_shard_exception.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_chunk_base_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\chunk_version_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\database_version_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\clone_catalog_data_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\clear_jumbo_flag_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\create_collection_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\create_database_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\flush_database_cache_updates_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\flush_routing_table_cache_updates_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\get_database_version_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\move_primary_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\shard_collection_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\clone_collection_options_from_primary_shard_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\wait_for_fail_point_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\message.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\op_msg.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\protocol.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\wiredtiger\\src\\checksum\\software\\checksum.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\wiredtiger\\src\\checksum\\x86\\crc32-x86.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\wiredtiger\\src\\checksum\\x86\\crc32-x86-alt.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\wire_version.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\bson\\dotted_path_support.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\query_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\tailable_mode.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\tailable_mode_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\read_concern_args.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\catalog\\collection_catalog.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\catalog\\collection.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\ops\\write_ops_parsers.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\ops\\write_ops_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\hint_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\hint_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\runtime_constants_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\dbmessage.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\connection_string.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\mongo_uri.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\dns_query.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\query.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\authenticate.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\native_sasl_client_session.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\sasl_client_authenticate.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\sasl_client_authenticate_impl.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\sasl_client_conversation.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\sasl_client_session.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\sasl_plain_client_conversation.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\sasl_scram_client_conversation.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\md5.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\password_digest.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\icu.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\icu_init.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_icu.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\affixpatternparser.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\alphaindex.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\anytrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\astro.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\basictz.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\bocsu.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\brktrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\buddhcal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\calendar.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\casetrn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\cecal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\chnsecal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\choicfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\coleitr.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\coll.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collation.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationbuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationcompare.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationdata.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationdatabuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationdatareader.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationdatawriter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationfastlatin.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationfastlatinbuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationfcd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationiterator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationkeys.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationroot.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationrootelements.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationruleparser.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationsets.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationsettings.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationtailoring.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationweights.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\compactdecimalformat.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\coptccal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\cpdtrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csdetect.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csmatch.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csr2022.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csrecog.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csrmbcs.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csrsbcs.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csrucode.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csrutf8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\curramt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\currfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\currpinf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\currunit.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dangical.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\datefmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dayperiodrules.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dcfmtsym.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decContext.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decNumber.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decfmtst.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decimalformatpattern.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decimfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decimfmtimpl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitaffix.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitaffixesandpadding.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitformatter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitgrouping.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitinterval.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitlst.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dtfmtsym.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dtitvfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dtitvinf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dtptngen.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dtrule.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\esctrn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ethpccal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\fmtable.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\fmtable_cnv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\format.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\fphdlimp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\fpositer.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\funcrepl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\gender.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\gregocal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\gregoimp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\hebrwcal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\identifier_info.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\indiancal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\inputext.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\islamcal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\japancal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\measfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\measunit.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\measure.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\msgfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\name2uni.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\nfrs.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\nfrule.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\nfsubs.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\nortrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\nultrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\numfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\numsys.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\olsontz.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\persncal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\pluralaffix.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\plurfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\plurrule.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\precision.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\quant.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\quantityformatter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbnf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbt_data.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbt_pars.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbt_rule.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbt_set.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbtz.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\regexcmp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\regeximp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\regexst.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\regextxt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\region.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\reldatefmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\reldtfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rematch.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\remtrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\repattrn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rulebasedcollator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\scientificnumberformatter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\scriptset.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\search.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\selfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\sharedbreakiterator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\simpletz.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\smallintformatter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\smpdtfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\smpdtfst.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\sortkey.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\standardplural.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\strmatch.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\strrepl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\stsearch.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\taiwncal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\timezone.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\titletrn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tmunit.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tmutamt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tmutfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tolowtrn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\toupptrn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\translit.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\transreg.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tridpars.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tzfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tzgnames.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tznames.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tznames_impl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tzrule.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tztrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucln_in.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucol.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucol_res.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucol_sit.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucoleitr.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucsdet.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\udat.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\udateintervalformat.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\udatpg.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ufieldpositer.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uitercollationiterator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ulocdata.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\umsg.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\unesctrn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uni2name.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\unum.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\unumsys.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\upluralrules.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uregex.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uregexc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uregion.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\usearch.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uspoof.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_build.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_conf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_impl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_wsconf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\utf16collationiterator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\utf8collationiterator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\utmscale.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\utrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\valueformatter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\visibledigits.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\vtzone.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\vzone.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\windtfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\winnmfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\wintzimpl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\zonemeta.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\zrule.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ztrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\appendable.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\bmpset.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\brkeng.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\brkiter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\bytestream.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\bytestrie.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\bytestriebuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\bytestrieiterator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\caniter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\chariter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\charstr.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\cmemory.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\cstr.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\cstring.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\cwchar.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\dictbe.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\dictionarydata.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\dtintrv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\errorcode.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\filteredbrk.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\filterednormalizer2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\icudataver.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\icuplug.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\listformatter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\loadednormalizer2impl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\locavailable.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\locbased.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\locdispnames.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\locdspnm.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\locid.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\loclikely.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\locmap.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\locresdata.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\locutil.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\messagepattern.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\normalizer2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\normalizer2impl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\normlzr.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\parsepos.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\patternprops.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\pluralmap.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\propname.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\propsvec.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\punycode.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\putil.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbi.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbidata.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbinode.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbirb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbiscan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbisetb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbistbl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbitblb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\resbund.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\resbund_cnv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\resource.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ruleiter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\schriter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\serv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\servlk.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\servlkf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\servls.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\servnotf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\servrbf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\servslkf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\sharedobject.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\simpleformatter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\stringpiece.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\stringtriebuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uarrsort.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ubidi.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ubidi_props.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ubidiln.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ubidiwrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ubrk.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucase.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucasemap.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucasemap_titlecase_brkiter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucat.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uchar.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucharstrie.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucharstriebuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucharstrieiterator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uchriter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucln_cmn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucmndata.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv2022.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_bld.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_cb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_cnv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_ct.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_err.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_ext.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_io.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_lmb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_set.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_u16.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_u32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_u7.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_u8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvbocu.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvdisp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvhz.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvisci.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvlat1.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvmbcs.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvscsu.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvsel.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucol_swp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucurr.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\udata.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\udatamem.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\udataswp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uenum.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uhash.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uhash_us.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uidna.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uinit.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uinvchar.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uiter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ulist.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ulistformatter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uloc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uloc_keytype.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uloc_tag.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\umapfile.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\umath.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\umutex.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unames.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unifiedcache.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unifilt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unifunct.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uniset.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uniset_closure.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uniset_props.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unisetspan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr_case.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr_case_locale.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr_cnv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr_props.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr_titlecase_brkiter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unorm.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unormcmp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uobject.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uprops.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ures_cnv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uresbund.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uresdata.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\usc_impl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uscript.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uscript_props.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uset.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uset_props.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\usetiter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ushape.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\usprep.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustack.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustr_cnv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustr_titlecase_brkiter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustr_wcs.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustrcase.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustrcase_locale.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustrenum.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustrfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustring.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustrtrns.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\utext.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\utf_impl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\util.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\util_props.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\utrace.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\utrie.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\utrie2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\utrie2_builder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uts46.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\utypes.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uvector.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uvectr32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uvectr64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\wintz.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\stubdata\\stubdata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\get_status_from_command_result.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\write_concern_error_detail.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\remote_command_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\remote_command_response.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\config_server_metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\egress_metadata_hook_list.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\logical_time_metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\sharding_metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\repl_set_metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\oplog_query_metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\tracking_metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\client_metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\client_metadata_ismaster.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\service_entry_point_utils.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\session.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\transport_layer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\is_mongos.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\logical_time_validator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\signed_logical_time.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\keys_collection_manager_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\keys_collection_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\keys_collection_cache.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\key_generator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_client_info.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\replication_coordinator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\replication_coordinator_noop.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\replication_consistency_markers.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\replication_process.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\storage_interface.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\rollback_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\namespace_string.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\bson_extract_optime.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\optime.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\keys_collection_client_sharded.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\sharding_catalog_client.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\logical_clock.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\logical_clock_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\global_settings.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_settings.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_settings_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\keys_collection_document.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\time_proof_service.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\logical_time.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\operation_time_tracker.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\action_set.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\action_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\impersonation_session.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\privilege.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\privilege_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\resource_pattern.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\user_management_commands_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\impersonated_user_metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\impersonated_user_metadata_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_options_helpers.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_options_helpers_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\cmdline_utils\\censor_cmdline.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\field_ref.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\field_ref_set.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\field_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\keypattern.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\write_concern_options.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\index_names.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\commands\\test_commands_enabled.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\commands\\test_commands_enabled_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\commands\\server_status_internal.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\commands\\server_status_metric.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\address_restriction.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\address_restriction_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\restriction_environment.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\mutable\\document.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\mutable\\element.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\safe_num.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\authorization_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\authorization_session.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\auth_decorations.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\user_name.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\role_name.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\read_preference.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\baton.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\client.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\default_baton.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\operation_context.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\operation_context_group.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\service_context.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_recovery.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\unclean_shutdown.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl_set_member_in_standalone_mode.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\periodic_runner.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\background_thread_clock_source.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\clock_source.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\fast_clock_source_factory.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\storage\\write_unit_of_work.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\fail_point.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\fail_point_registry.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\fail_point_service.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\fail_point_server_parameter_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\storage\\storage_options.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\storage\\storage_parameters_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\multi_key_path_tracker.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\logical_session_id.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\logical_session_id_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\idl\\server_parameter.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\idl\\server_parameter_with_storage.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\constraints.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\environment.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\option_description.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\option_section.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\options_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\startup_option_init.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\startup_options.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\value.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_yaml.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\binary.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\contrib\\graphbuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\contrib\\graphbuilderadapter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\convert.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\directives.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\emit.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\emitfromevents.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\emitter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\emitterstate.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\emitterutils.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\exceptions.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\exp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\memory.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\node.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\node_data.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\nodebuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\nodeevents.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\null.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\ostream_wrapper.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\parse.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\parser.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\regex_yaml.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\scanner.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\scanscalar.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\scantag.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\scantoken.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\simplekey.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\singledocparser.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\stream.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\tag.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\cidr.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\hostandport.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\hostname_canonicalization.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\sockaddr.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\socket_exception.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\socket_utils.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\hostandport_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\winutil.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\concurrency\\spin_lock.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\http_client_winhttp.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\idl\\idl_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\command_generic_argument.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\crypto\\sha_block_windows.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\crypto\\sha1_block.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\crypto\\sha256_block.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\secure_compare_memory.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\secure_allocator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\secure_zero_memory.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\processinfo.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\processinfo_windows.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_options.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\util\\bson_extract.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\data_range.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\data_range_cursor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\data_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\data_type_string_data.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\data_type_terminated.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\error_codes.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\error_extra_info.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\global_initializer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\global_initializer_registerer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\init.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\initializer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\initializer_dependency_graph.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\make_string_vector.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\parse_number.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\shim.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\simple_string_data_comparator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\status.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\string_data.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\transaction_error.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\validate_locale.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\bson_comparator_interface_base.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\bson_depth.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\bson_validate.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\bsonelement.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\bsonmisc.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\bsonobj.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\bsonobjbuilder.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\bsontypes.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\json.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\oid.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\simple_bsonelement_comparator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\simple_bsonobj_comparator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\timestamp.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\component_message_log_domain.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\console.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\log_component.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\log_component_settings.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\log_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\log_severity.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\logger.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\logstream_builder.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\message_event_utf8_encoder.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\message_log_domain.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\ramlog.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\redaction.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\rotatable_file_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\rotatable_file_writer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\decimal128.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\mutex.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\posix_fadvise.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\process_id.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\random.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\shared_library.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\shared_library_windows.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\stack_locator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\stack_locator_windows.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\strcasestr.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\strnlen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\allocator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\assert_util.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\base64.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\boost_assert_impl.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\concurrency\\idle_thread_block.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\concurrency\\thread_name.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\duration.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\errno_util.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\exception_filter_win32.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\exit.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\file.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\hex.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\itoa.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\log.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\platform_init.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\shell_exec.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\signal_handlers_synchronous.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\stacktrace.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\stacktrace_windows.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\startup_test.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\str.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\system_clock_source.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\system_tick_source.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\text.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\time_support.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\timer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\uuid.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\version.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_pcrecpp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_byte_order.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_compile.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_config.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_dfa_exec.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_exec.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_fullinfo.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_get.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_globals.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_maketables.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_newline.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_ord2utf8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_refcount.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_string_utils.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_study.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_tables.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_ucd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_valid_utf8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_version.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_xclass.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_chartables.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcrecpp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_scanner.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_stringpiece.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_intel_decimal128.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_exception.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_four_over_pi.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_bessel.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_bid.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_cbrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_erf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_exp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_int.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_inv_hyper.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_inv_trig.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_lgamma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_log.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_mod.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_ops.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_ops_64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_pow.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_powi.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_sqrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_trig.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\sqrt_tab_t.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_2_str_tables.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_acos.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_acosh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_add.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_asin.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_asinh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_atan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_atan2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_atanh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_cbrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_compare.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_cos.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_cosh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_div.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_erf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_erfc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_exp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_exp10.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_exp2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_expm1.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_fdimd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_fma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_fmod.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_frexp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_hypot.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_ldexp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_lgamma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_llrintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log10.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log1p.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_logb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_logbd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_lrintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_lround.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_minmax.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_modf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_mul.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_nearbyintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_next.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_nexttowardd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_noncomp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_pow.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_quantexpd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_quantize.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_rem.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_round_integral.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_scalb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_scalbl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_sin.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_sinh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_sqrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_string.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_tan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_tanh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_tgamma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int16.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint16.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_acos.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_acosh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_add.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_asin.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_asinh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_atan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_atan2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_atanh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_cbrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_compare.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_cos.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_cosh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_div.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_erf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_erfc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_exp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_exp10.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_exp2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_expm1.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_fdimd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_fma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_fmod.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_frexp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_hypot.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_ldexp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_lgamma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_llrintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log10.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log1p.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_logb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_logbd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_lrintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_lround.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_minmax.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_modf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_mul.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_nearbyintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_next.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_nexttowardd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_noncomp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_pow.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_quantexpd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_quantize.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_rem.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_round_integral.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_scalb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_scalbl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sin.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sinh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sqrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_string.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sub.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_tan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_tanh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_tgamma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_bid128.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_bid64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int16.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint16.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_acos.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_acosh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_add.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_asin.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_asinh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_atan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_atan2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_atanh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_cbrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_compare.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_cos.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_cosh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_div.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_erf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_erfc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_exp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_exp10.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_exp2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_expm1.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_fdimd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_fma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_fmod.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_frexp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_hypot.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_ldexp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_lgamma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_llrintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log10.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log1p.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_logb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_logbd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_lrintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_lround.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_minmax.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_modf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_mul.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_nearbyintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_next.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_nexttowardd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_noncomp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_pow.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_quantexpd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_quantize.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_rem.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_round_integral.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_scalb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_scalbl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_sin.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_sinh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_sqrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_string.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_tan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_tanh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_tgamma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_bid128.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int16.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint16.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_binarydecimal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_convert_data.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_decimal_data.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_decimal_globals.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_dpd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_feclearexcept.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_fegetexceptflag.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_feraiseexcept.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_fesetexceptflag.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_fetestexcept.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_flag_operations.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_from_int.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_round.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\strtod128.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\strtod32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\strtod64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\wcstod128.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\wcstod32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\wcstod64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_fmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\fmt\\dist\\src\\format.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\fmt\\dist\\src\\posix.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_boost.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\cmdline.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\config_file.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\convert.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\options_description.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\parsers.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\positional_options.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\split.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\utf8_codecvt_facet.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\value_semantic.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\variables_map.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\winmain.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\iostreams\\src\\file_descriptor.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\iostreams\\src\\mapped_file.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\codecvt_error_category.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\operations.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\path.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\path_traits.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\portability.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\unique_path.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\utf8_codecvt_facet.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\windows_file_codecvt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\system\\src\\error_code.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_abseil.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\hash\\internal\\city.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\hash\\internal\\hash.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\murmurhash3\\MurmurHash3.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\quick_exit.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_allocator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\dynamic_annotations.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\elf_mem_image.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\logging.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\spinlock.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\spinlock_internal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\sysinfo.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\vdso_support.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\central_freelist.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\common.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\internal_logging.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\malloc_extension.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\malloc_hook.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\memfs_malloc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\page_heap.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\sampler.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\span.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\stack_trace_table.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\stacktrace.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\static_vars.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\symbolize.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\thread_cache.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\tcmalloc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\windows\\port.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\windows\\system-alloc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\fake_stacktrace_scope.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\debugger.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\boost_assert_shim.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\dbshell.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\mongodbcr.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\shell_options_init.obj\" Crypt32.lib Secur32.lib Dnsapi.lib winhttp.lib \"..\\third-party\\libssh2-1.9.0\\Release\\libssh2.lib\" \"E:\\openssl-1.1.1f\\libssl.lib\" \"E:\\openssl-1.1.1f\\libcrypto.lib\" ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib psapi.lib bcrypt.lib Iphlpapi.lib dbghelp.lib ws2_32.lib winmm.lib version.lib /MANIFEST /MANIFESTUAC:\"level='asInvoker' uiAccess='false'\" /manifest:embed /PDB:\"E:/robo/build/Release/src/robomongo/Release/robo3t.pdb\" /SUBSYSTEM:WINDOWS /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:\"E:/robo/build/Release/src/robomongo/Release/robo3t.lib\" /MACHINE:X64  /machine:x64 robomongo.dir\\Release\\winres.res\n  robomongo.dir\\Release\\main.obj\n  robomongo.dir\\Release\\QtUtils.obj\n  robomongo.dir\\Release\\StdUtils.obj\n  robomongo.dir\\Release\\Logger.obj\n  robomongo.dir\\Release\\HexUtils.obj\n  robomongo.dir\\Release\\BsonUtils.obj\n  robomongo.dir\\Release\\CredentialSettings.obj\n  robomongo.dir\\Release\\ConnectionSettings.obj\n  robomongo.dir\\Release\\Event.obj\n  robomongo.dir\\Release\\Enums.obj\n  robomongo.dir\\Release\\EventError.obj\n  robomongo.dir\\Release\\EventBusSubscriber.obj\n  robomongo.dir\\Release\\EventBusDispatcher.obj\n  robomongo.dir\\Release\\EventWrapper.obj\n  robomongo.dir\\Release\\EventBus.obj\n  robomongo.dir\\Release\\KeyboardManager.obj\n  robomongo.dir\\Release\\MongoNamespace.obj\n  robomongo.dir\\Release\\MongoFunction.obj\n  robomongo.dir\\Release\\MongoUtils.obj\n  robomongo.dir\\Release\\MongoCollection.obj\n  robomongo.dir\\Release\\MongoCollectionInfo.obj\n  robomongo.dir\\Release\\MongoQueryInfo.obj\n  robomongo.dir\\Release\\CursorPosition.obj\n  robomongo.dir\\Release\\ScriptInfo.obj\n  robomongo.dir\\Release\\MongoEventsInfo.obj\n  robomongo.dir\\Release\\ptimeutil.obj\n  robomongo.dir\\Release\\json.obj\n  robomongo.dir\\Release\\ScriptEngine.obj\n  robomongo.dir\\Release\\MongoEvents.obj\n  robomongo.dir\\Release\\MongoDocument.obj\n  robomongo.dir\\Release\\AppStyle.obj\n  robomongo.dir\\Release\\MongoServer.obj\n  robomongo.dir\\Release\\MongoShell.obj\n  robomongo.dir\\Release\\MongoDatabase.obj\n  robomongo.dir\\Release\\App.obj\n  robomongo.dir\\Release\\MongoClient.obj\n  robomongo.dir\\Release\\MongoWorker.obj\n  robomongo.dir\\Release\\ReplicaSet.obj\n  robomongo.dir\\Release\\SettingsManager.obj\n  robomongo.dir\\Release\\AppRegistry.obj\n  robomongo.dir\\Release\\StringOperations.obj\n  robomongo.dir\\Release\\common.obj\n  robomongo.dir\\Release\\SimpleCrypt.obj\n  robomongo.dir\\Release\\RoboCrypt.obj\n  robomongo.dir\\Release\\GuiRegistry.obj\n  robomongo.dir\\Release\\AboutDialog.obj\n  robomongo.dir\\Release\\EulaDialog.obj\n  robomongo.dir\\Release\\ConnectionAdvancedTab.obj\n  robomongo.dir\\Release\\ConnectionAuthTab.obj\n  robomongo.dir\\Release\\ConnectionBasicTab.obj\n  robomongo.dir\\Release\\ConnectionDiagnosticDialog.obj\n  robomongo.dir\\Release\\ConnectionDialog.obj\n  robomongo.dir\\Release\\CopyCollectionDialog.obj\n  robomongo.dir\\Release\\IndicatorLabel.obj\n  robomongo.dir\\Release\\CreateCollectionDialog.obj\n  robomongo.dir\\Release\\CreateDatabaseDialog.obj\n  robomongo.dir\\Release\\CreateUserDialog.obj\n  robomongo.dir\\Release\\ComboBoxUtils.obj\n  robomongo.dir\\Release\\DialogUtils.obj\n  robomongo.dir\\Release\\PreferencesDialog.obj\n  robomongo.dir\\Release\\ConnectionsDialog.obj\n  robomongo.dir\\Release\\ExportDialog.obj\n  robomongo.dir\\Release\\ChangeShellTimeoutDialog.obj\n  robomongo.dir\\Release\\PlainJavaScriptEditor.obj\n  robomongo.dir\\Release\\JSLexer.obj\n  robomongo.dir\\Release\\FindFrame.obj\n  robomongo.dir\\Release\\AddEditIndexDialog.obj\n  robomongo.dir\\Release\\ScriptWidget.obj\n  robomongo.dir\\Release\\ExplorerCollectionTreeItem.obj\n  robomongo.dir\\Release\\ExplorerCollectionIndexesDir.obj\n  robomongo.dir\\Release\\ExplorerCollectionIndexItem.obj\n  robomongo.dir\\Release\\ExplorerTreeItem.obj\n  robomongo.dir\\Release\\ExplorerReplicaSetFolderItem.obj\n  robomongo.dir\\Release\\ExplorerReplicaSetTreeItem.obj\n  robomongo.dir\\Release\\ExplorerDatabaseTreeItem.obj\n  robomongo.dir\\Release\\ExplorerDatabaseCategoryTreeItem.obj\n  robomongo.dir\\Release\\ExplorerUserTreeItem.obj\n  robomongo.dir\\Release\\ExplorerFunctionTreeItem.obj\n  robomongo.dir\\Release\\DocumentTextEditor.obj\n  robomongo.dir\\Release\\FunctionTextEditor.obj\n  robomongo.dir\\Release\\ExplorerServerTreeItem.obj\n  robomongo.dir\\Release\\ExplorerTreeWidget.obj\n  robomongo.dir\\Release\\ExplorerWidget.obj\n  robomongo.dir\\Release\\BsonTableModel.obj\n  robomongo.dir\\Release\\BsonTableView.obj\n  robomongo.dir\\Release\\BsonTreeItem.obj\n  robomongo.dir\\Release\\BsonTreeModel.obj\n  robomongo.dir\\Release\\BsonTreeView.obj\n  robomongo.dir\\Release\\Notifier.obj\n  robomongo.dir\\Release\\CollectionStatsTreeItem.obj\n  robomongo.dir\\Release\\CollectionStatsTreeWidget.obj\n  robomongo.dir\\Release\\JsonPrepareThread.obj\n  robomongo.dir\\Release\\OutputItemContentWidget.obj\n  robomongo.dir\\Release\\OutputItemHeaderWidget.obj\n  robomongo.dir\\Release\\OutputWidget.obj\n  robomongo.dir\\Release\\PagingWidget.obj\n  robomongo.dir\\Release\\ProgressBarPopup.obj\n  robomongo.dir\\Release\\QueryWidget.obj\n  robomongo.dir\\Release\\WorkAreaTabBar.obj\n  robomongo.dir\\Release\\WorkAreaTabWidget.obj\n  robomongo.dir\\Release\\WelcomeTab.obj\n  robomongo.dir\\Release\\LogWidget.obj\n  robomongo.dir\\Release\\MainWindow.obj\n  robomongo.dir\\Release\\SSHTunnelTab.obj\n  robomongo.dir\\Release\\SSLTab.obj\n  robomongo.dir\\Release\\SshSettings.obj\n  robomongo.dir\\Release\\SslSettings.obj\n  robomongo.dir\\Release\\ReplicaSetSettings.obj\n  robomongo.dir\\Release\\SshTunnelWorker.obj\n  robomongo.dir\\Release\\mocs_compilation.obj\n  robomongo.dir\\Release\\qrc_robo.obj\n  robomongo.dir\\Release\\qrc_gui.obj\n     Creating library E:/robo/build/Release/src/robomongo/Release/robo3t.lib and object E:/robo/build/Release/src/robomongo/Release/robo3t.exp\n  robomongo.vcxproj -> E:\\robo\\build\\Release\\src\\robomongo\\Release\\robo3t.exe\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(283): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(286): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(289): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(292): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(296): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(60): warning C26495: Variable 'QMatrix::_m22' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(70): warning C26495: Variable 'QMatrix::_m22' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::strongref' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qpalette.h(71): warning C26495: Variable 'QPalette::<anonymous-tag>::for_faster_swapping_dont_use' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qfontmetrics.h(149): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(822): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2309): warning C26495: Variable 'fmt::v5::system_error::error_code_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2964): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2965): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2966): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2967): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2968): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2969): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(246): warning C26495: Variable 'absl::AlphaNum::digits_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(247): warning C26495: Variable 'absl::AlphaNum::digits_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(387): warning C6001: Using uninitialized memory 'result'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\oid.h(89): warning C26495: Variable 'mongo::OID::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\oid.h(241): warning C26495: Variable 'mongo::OID::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(442): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(454): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(700): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonmisc.h(251): warning C26495: Variable 'mongo::BSONSizeTracker::_sizes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonobjbuilder.h(158): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\rpc\\op_msg.h(325): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\interruptible.h(139): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\interruptible.h(180): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\intrusive_counter.h(123): warning C26495: Variable 'mongo::RCString::_size' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\future_impl.h(716): warning C26495: Variable 'mongo::future_details::SharedStateHolder<void>::_inner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\db\\baton.h(118): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\db\\baton.h(123): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\platform\\process_id.h(68): warning C26495: Variable 'mongo::ProcessId::_npid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\concurrency\\spin_lock.h(51): warning C6031: Return value ignored: 'InitializeCriticalSectionAndSpinCount'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\db\\write_concern_options.h(60): warning C26495: Variable 'mongo::WriteConcernOptions::wTimeout' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\client\\dbclient_cursor.h(105): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongoshellresult.h(55): warning C26495: Variable 'Robomongo::MongoShellExecResult::_isCurrentServerValid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongoshellresult.h(70): warning C26495: Variable 'Robomongo::MongoShellExecResult::_isCurrentServerValid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongocollectioninfo.h(10): warning C26495: Variable 'Robomongo::MongoCollectionInfo::_count' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(918): warning C26495: Variable 'Robomongo::ExecuteQueryResponse::resultIndex' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(989): warning C26495: Variable 'Robomongo::ExecuteScriptResponse::empty' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1087): warning C26495: Variable 'Robomongo::DocumentListLoadedEvent::_resultIndex' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1111): warning C26495: Variable 'Robomongo::ScriptExecutedEvent::_empty' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1195): warning C26495: Variable 'Robomongo::EstablishSshConnectionResponse::localport' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\base\\encoded_value_storage.h(47): warning C26495: Variable 'mongo::EncodedValueStorage<mongo::QueryResult::Layout,mongo::QueryResult::ConstView,mongo::QueryResult::View>::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(205): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::future_details::FakeVoid>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\decimal_counter.h(48): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(194): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::SourceLocationHolder>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(840): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\util\\builder.h(119): warning C26495: Variable 'mongo::StackAllocator::_buf' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(146): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::Timestamp>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(152): warning C26495: Variable 'boost::optional_detail::optional_base<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\detail\\optional_trivially_copyable_base.hpp(29): warning C26495: Variable 'boost::optional_detail::tc_optional_base<bool>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\detail\\optional_trivially_copyable_base.hpp(25): warning C26495: Variable 'boost::optional_detail::tc_optional_base<bool>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(162): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::UUID>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(140): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::UUID>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(904): warning C26495: Variable 'absl::container_internal::raw_hash_set<absl::container_internal::NodeHashSetPolicy<mongo::BSONObj>,mongo::HashImprover<mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::Hasher,mongo::BSONObj>,mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::EqualTo,std::allocator<mongo::BSONObj> >::ctrl_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(1563): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\base\\data_range.h(117): warning C26495: Variable 'mongo::ConstDataRange::_debug_offset' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonobj.h(136): warning C26495: Variable 'mongo::BSONObj::_objdata' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\base\\status_with.h(133): warning C26495: Variable 'mongo::StatusWith<char>::_status' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\base\\data_range.h(112): warning C26495: Variable 'mongo::ConstDataRange::_debug_offset' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(856): warning C26495: Variable 'absl::container_internal::raw_hash_set<absl::container_internal::NodeHashSetPolicy<mongo::BSONObj>,mongo::HashImprover<mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::Hasher,mongo::BSONObj>,mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::EqualTo,std::allocator<mongo::BSONObj> >::ctrl_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\core.h(1277): warning C26495: Variable 'fmt::v5::basic_format_args<fmt::v5::basic_format_context<std::back_insert_iterator<fmt::v5::internal::basic_buffer<char> >,char> >::<anonymous-tag>::values_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1410): warning C6387: 'value' could be '0':  this does not adhere to the specification for the function 'std::char_traits<char>::length'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\core.h(345): warning C26495: Variable 'std::back_insert_iterator<fmt::v5::internal::basic_buffer<char> >::container' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1516): warning C26498: The function 'std::numeric_limits<int>::max' is constexpr, mark variable 'max_int' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2479): warning C26495: Variable 'fmt::v5::basic_writer<fmt::v5::back_insert_range<fmt::v5::internal::basic_buffer<char> > >::int_writer<unsigned __int64,fmt::v5::basic_format_specs<char> >::prefix' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(603): warning C26495: Variable 'fmt::v5::internal::counting_iterator<char>::blackhole_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(1668): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2599): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2599): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1122): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1126): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(144): warning C26495: Variable 'QStyleOptionFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(172): warning C26495: Variable 'QStyleOptionTabWidgetFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(196): warning C26495: Variable 'QStyleOptionTabBarBase::documentMode' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(227): warning C26495: Variable 'QStyleOptionHeader::selectedPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(286): warning C26495: Variable 'QStyleOptionTab::row' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(316): warning C26495: Variable 'QStyleOptionToolBar::positionOfLine' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(343): warning C26495: Variable 'QStyleOptionProgressBar::bottomToTop' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(373): warning C26495: Variable 'QStyleOptionMenuItem::menuItemType' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(392): warning C26495: Variable 'QStyleOptionDockWidget::movable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(443): warning C26495: Variable 'QStyleOptionViewItem::viewItemPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(473): warning C26495: Variable 'QStyleOptionToolBox::position' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(492): warning C26495: Variable 'QStyleOptionRubberBand::opaque' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(534): warning C26495: Variable 'QStyleOptionSlider::tickInterval' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(553): warning C26495: Variable 'QStyleOptionSpinBox::frame' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(580): warning C26495: Variable 'QStyleOptionToolButton::arrowType' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(602): warning C26495: Variable 'QStyleOptionComboBox::editable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(620): warning C26495: Variable 'QStyleOptionTitleBar::titleBarState' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(640): warning C26495: Variable 'QStyleOptionGroupBox::midLineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(654): warning C26495: Variable 'QStyleOptionSizeGrip::corner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(670): warning C26495: Variable 'QStyleOptionGraphicsItem::levelOfDetail' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2304): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(491): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(492): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(493): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(494): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(495): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(498): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(504): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(25): warning C28251: Inconsistent annotation for 'GetSystemTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(103).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(29): warning C28251: Inconsistent annotation for 'GetSystemTimeAsFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(111).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(33): warning C28251: Inconsistent annotation for 'SystemTimeToFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\timezoneapi.h(93).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(38): warning C28251: Inconsistent annotation for 'FileTimeToSystemTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\timezoneapi.h(83).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(45): warning C28251: Inconsistent annotation for 'FileTimeToLocalFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\fileapi.h(171).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(50): warning C28251: Inconsistent annotation for 'LocalFileTimeToFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\fileapi.h(963).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(58): warning C28251: Inconsistent annotation for 'GetTickCount': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(168).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(133): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(695): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(613): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\date_time\\date_formatting.hpp(89): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\date_time\\date_formatting.hpp(91): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\converter_lexical_streams.hpp(162): warning C26495: Variable 'boost::detail::lexical_istream_limited_src<char,std::char_traits<char>,0,39>::buffer' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\lcast_unsigned_converters.hpp(191): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\lcast_unsigned_converters.hpp(262): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\quuid.h(68): warning C26495: Variable 'QUuid::data4' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\function\\function_base.hpp(611): warning C26495: Variable 'boost::function_base::functor' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\eventbus.cpp(115): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qvector2d.h(60): warning C26495: Variable 'QVector2D::v' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongoutils.cpp(12): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongodatabase.h(131): warning C26495: Variable 'Robomongo::MongoDatabaseUsersLoadedEvent::_database' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongodatabase.h(151): warning C26495: Variable 'Robomongo::MongoDatabaseFunctionsLoadedEvent::_database' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongocollectioninfo.cpp(7): warning C26495: Variable 'Robomongo::MongoCollectionInfo::_sizeBytes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongoqueryinfo.cpp(31): warning C26495: Variable 'Robomongo::MongoQueryInfo::_batchSize' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(110): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(143): warning C6054: String 'smon' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(171): warning C6054: String 'sday' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(140): warning C6054: String 'gmt' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(223): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(269): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(390): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\platform\\strtoll.h(35): warning C28251: Inconsistent annotation for 'strtoll': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\ucrt\\stdlib.h(539).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\platform\\strtoll.h(39): warning C28251: Inconsistent annotation for 'strtoull': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\ucrt\\stdlib.h(569).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(249): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(669): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(771): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(792): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(1099): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\assertions.h(59): warning C28251: Inconsistent annotation for 'TerminateProcess': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\processthreadsapi.h(143).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(1348): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\callargs.h(306): warning C6001: Using uninitialized memory 'args'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(636): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6470): warning C26495: Variable 'JS::FirstSubsumedFrame::cx' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6470): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6478): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\get_last_error.hpp(20): warning C28251: Inconsistent annotation for 'GetLastError': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\errhandlingapi.h(89).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(25): warning C28251: Inconsistent annotation for 'FormatMessageA': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(2408).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(36): warning C28251: Inconsistent annotation for 'FormatMessageW': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(2423).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(47): warning C28251: Inconsistent annotation for 'SetErrorMode': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\errhandlingapi.h(131).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\character_code_conversion.hpp(21): warning C28251: Inconsistent annotation for 'MultiByteToWideChar': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\stringapiset.h(126).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\character_code_conversion.hpp(30): warning C28251: Inconsistent annotation for 'WideCharToMultiByte': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\stringapiset.h(141).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(27): warning C28251: Inconsistent annotation for 'LocalAlloc': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1112).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(32): warning C28251: Inconsistent annotation for 'LocalReAlloc': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1122).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(37): warning C28251: Inconsistent annotation for 'LocalFree': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1200).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(211): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(211): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(216): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\engine\\scriptengine.cpp(230): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\bufferlist.h(101): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(262): warning C26495: Variable 'JS::Heap<JSObject *>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(254): warning C26495: Variable 'JS::Heap<JSObject *>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(969): warning C26495: Variable 'JS::Rooted<JSObject *>::stack' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(962): warning C26495: Variable 'JS::Rooted<JSObject *>::stack' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\vector.h(877): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\variant.h(568): warning C26495: Variable 'mozilla::Variant<char const *,mozilla::UniquePtr<char [0],JS::FreePolicy> >::rawData' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\vector.h(408): warning C26495: Variable 'mozilla::Vector<mozilla::BufferList<js::SystemAllocPolicy>::Segment,1,js::SystemAllocPolicy>::CRAndStorage<1,0>::mBytes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\mongodb\\mongoworker.cpp(55): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\mongodb\\mongoworker.cpp(56): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\mongodb\\mongoworker.cpp(1020): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonvalue.h(149): warning C26495: Variable 'QJsonValue::t' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonarray.h(62): warning C26495: Variable 'QJsonArray::d' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\settings\\settingsmanager.cpp(99): warning C26495: Variable 'Robomongo::SettingsManager::_autoExpand' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(570): warning C6011: Dereferencing NULL pointer 'x'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\aboutdialog.cpp(97): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonobject.h(64): warning C26495: Variable 'QJsonObject::d' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(30): warning C26495: Variable 'Robomongo::EulaDialog::_reply' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(44): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(39): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(126): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(127): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(128): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionauthtab.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionauthtab.cpp(58): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionauthtab.cpp(72): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(37): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(63): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(94): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(122): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(29): warning C26495: Variable 'Robomongo::ConnectionBasicTab::_discoverButton' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(339): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(339): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondiagnosticdialog.cpp(46): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondiagnosticdialog.cpp(57): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondialog.cpp(35): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondialog.cpp(43): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondialog.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\copycollectiondialog.cpp(51): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\copycollectiondialog.cpp(52): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\copycollectiondialog.cpp(85): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qsciscintilla.h(2078): warning C26495: Variable 'QsciScintilla::FindState::flags' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(44): warning C26495: Variable 'Robomongo::CreateCollectionDialog::_indexOptionDefaultsFrame' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(66): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(68): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(74): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(83): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(87): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(300): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(328): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(363): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(394): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createdatabasedialog.cpp(41): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createdatabasedialog.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(53): warning C26495: Variable 'Robomongo::CreateUserDialog::_readOnlyCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(96): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(97): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(128): warning C26495: Variable 'Robomongo::CreateUserDialog::_userSourceComboBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(157): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(156): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\preferencesdialog.cpp(87): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\preferencesdialog.cpp(88): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(43): warning C26495: Variable 'Robomongo::ConnectionListWidgetItem::_connection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(117): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(120): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(123): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(126): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(155): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(156): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(163): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(164): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(196): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(107): warning C26495: Variable 'Robomongo::ConnectionsDialog::_selectedConnection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(78): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(76): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(128): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(141): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(184): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(191): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(192): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(222): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\changeshelltimeoutdialog.cpp(30): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\changeshelltimeoutdialog.cpp(29): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\editors\\plainjavascripteditor.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\editors\\findframe.cpp(62): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\editors\\findframe.cpp(61): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\editors\\findframe.cpp(60): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(33): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(75): warning C26495: Variable 'Robomongo::AddEditIndexDialog::_uniqueCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(104): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(103): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(188): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\scriptwidget.cpp(85): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\scriptwidget.cpp(310): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\scriptwidget.cpp(311): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\scriptwidget.cpp(312): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(62): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(53): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(65): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(59): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(56): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(45): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(48): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(50): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(70): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(73): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(76): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(78): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(85): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexesdir.cpp(20): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexesdir.cpp(29): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexesdir.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexesdir.cpp(26): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexitem.cpp(25): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexitem.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasetfolderitem.cpp(39): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasetfolderitem.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(73): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(58): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(64): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(61): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(70): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(68): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(71): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(74): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(77): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(65): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(62): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(59): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(55): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(74): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(71): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(68): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(58): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(36): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(52): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(39): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerusertreeitem.cpp(24): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerusertreeitem.cpp(27): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerfunctiontreeitem.cpp(25): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerfunctiontreeitem.cpp(28): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\documenttexteditor.cpp(79): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\documenttexteditor.cpp(57): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\documenttexteditor.cpp(65): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\documenttexteditor.cpp(78): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\functiontexteditor.cpp(54): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\functiontexteditor.cpp(53): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(63): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(60): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(57): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(54): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(51): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(48): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(45): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerwidget.cpp(35): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerwidget.cpp(34): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerwidget.cpp(170): warning C28182: Dereferencing NULL pointer. 'item' contains the same NULL value as 'collectionItem' did.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontablemodel.cpp(12): warning C26495: Variable 'Robomongo::BsonTableModelProxy::_root' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontableview.cpp(29): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeitem.h(19): warning C26495: Variable 'Robomongo::BsonItemFields::_type' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeview.cpp(26): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeview.cpp(30): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeview.cpp(34): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(140): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(137): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(134): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(131): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(128): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(125): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(122): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(119): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(116): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(113): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(320): warning C6001: Using uninitialized memory 'mainWindow'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(27): warning C26495: Variable 'Robomongo::OutputItemContentWidget::_collectionStats' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(57): warning C26495: Variable 'Robomongo::OutputItemContentWidget::_collectionStats' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(124): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(125): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(126): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(127): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(128): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(276): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(277): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(89): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(100): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(102): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(103): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(104): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(105): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(19): warning C26495: Variable 'Robomongo::OutputWidget::_prevResultsCount' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(85): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(84): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\pagingwidget.cpp(49): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\pagingwidget.cpp(50): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\pagingwidget.cpp(46): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\pagingwidget.cpp(47): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\querywidget.cpp(58): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\querywidget.cpp(69): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\querywidget.cpp(313): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(66): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(63): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(64): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(61): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(65): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(60): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(299): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(301): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(122): warning C26495: Variable 'Robomongo::WelcomeTab::_blogsSection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(212): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(217): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(222): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(231): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\logwidget.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\logwidget.cpp(18): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(185): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(182): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(174): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(165): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(169): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(160): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(200): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(208): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(212): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(215): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(230): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(242): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(251): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(260): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(269): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(277): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(286): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(291): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(337): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(342): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(356): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(361): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(366): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(371): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(386): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(391): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(396): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(411): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(420): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(426): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(432): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(438): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(445): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(452): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(456): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(460): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(479): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(485): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(491): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(497): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(503): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(509): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(530): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(539): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(553): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(563): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(590): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(610): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(653): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(656): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(665): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(676): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(848): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(1304): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(1311): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(1357): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(1358): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(74): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(143): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(146): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(44): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(62): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(56): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(117): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(56): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(102): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(111): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(106): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(94): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(76): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(75): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\mongodb\\sshtunnelworker.cpp(25): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\mongodb\\sshtunnelworker.cpp(26): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"robomongo.dir\\Release\\robomongo.tlog\\unsuccessfulbuild\".\n  Touching \"robomongo.dir\\Release\\robomongo.tlog\\robomongo.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\server.vcxproj\" (13) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"server.dir\\Release\\\".\n  Creating directory \"server.dir\\Release\\server.tlog\\\".\nInitializeBuildStatus:\n  Creating \"server.dir\\Release\\server.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/robomongo/ssh/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/robomongo/ssh/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /IE:\\robo\\build\\Release\\src /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /W3 /WX- /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo\"server.dir\\Release\\\\\" /Fd\"server.dir\\Release\\vc141.pdb\" /Gd /TC /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" E:\\robo\\src\\robomongo\\ssh\\server.c\n  server.c\nLink:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe /ERRORREPORT:QUEUE /OUT:\"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\Release\\server.exe\" /INCREMENTAL:NO /NOLOGO Release\\ssh.lib \"..\\..\\third-party\\libssh2-1.9.0\\Release\\libssh2.lib\" \"E:\\openssl-1.1.1f\\libssl.lib\" \"E:\\openssl-1.1.1f\\libcrypto.lib\" ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:\"level='asInvoker' uiAccess='false'\" /manifest:embed /PDB:\"E:/robo/build/Release/src/robomongo/ssh/Release/server.pdb\" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:\"E:/robo/build/Release/src/robomongo/ssh/Release/server.lib\" /MACHINE:X64  /machine:x64 server.dir\\Release\\server.obj\n  server.vcxproj -> E:\\robo\\build\\Release\\src\\robomongo\\ssh\\Release\\server.exe\nFinalizeBuildStatus:\n  Deleting file \"server.dir\\Release\\server.tlog\\unsuccessfulbuild\".\n  Touching \"server.dir\\Release\\server.tlog\\server.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\server.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj\" (14) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"ssh_test.dir\\Release\\\".\n  Creating directory \"ssh_test.dir\\Release\\ssh_test.tlog\\\".\nInitializeBuildStatus:\n  Creating \"ssh_test.dir\\Release\\ssh_test.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/robomongo/ssh/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/robomongo/ssh/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /IE:\\robo\\build\\Release\\src /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /W3 /WX- /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo\"ssh_test.dir\\Release\\\\\" /Fd\"ssh_test.dir\\Release\\vc141.pdb\" /Gd /TC /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" E:\\robo\\src\\robomongo\\ssh\\test.c\n  test.c\nLink:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe /ERRORREPORT:QUEUE /OUT:\"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\Release\\ssh_test.exe\" /INCREMENTAL:NO /NOLOGO Release\\ssh.lib \"..\\..\\third-party\\libssh2-1.9.0\\Release\\libssh2.lib\" \"E:\\openssl-1.1.1f\\libssl.lib\" \"E:\\openssl-1.1.1f\\libcrypto.lib\" ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:\"level='asInvoker' uiAccess='false'\" /manifest:embed /PDB:\"E:/robo/build/Release/src/robomongo/ssh/Release/ssh_test.pdb\" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:\"E:/robo/build/Release/src/robomongo/ssh/Release/ssh_test.lib\" /MACHINE:X64  /machine:x64 ssh_test.dir\\Release\\test.obj\n  ssh_test.vcxproj -> E:\\robo\\build\\Release\\src\\robomongo\\ssh\\Release\\ssh_test.exe\ne:\\robo\\src\\robomongo\\ssh\\test.c(134): warning C6011: Dereferencing NULL pointer 'elem2'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\test.c(137): warning C6011: Dereferencing NULL pointer 'elem5'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\test.c(133): warning C6011: Dereferencing NULL pointer 'elem1'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\test.c(135): warning C6011: Dereferencing NULL pointer 'elem3'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\test.c(136): warning C6011: Dereferencing NULL pointer 'elem4'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"ssh_test.dir\\Release\\ssh_test.tlog\\unsuccessfulbuild\".\n  Touching \"ssh_test.dir\\Release\\ssh_test.tlog\\ssh_test.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj\" (default targets).\nPrepareForBuild:\n  Creating directory \"x64\\Release\\ALL_BUILD\\\".\n  Creating directory \"x64\\Release\\ALL_BUILD\\ALL_BUILD.tlog\\\".\nInitializeBuildStatus:\n  Creating \"x64\\Release\\ALL_BUILD\\ALL_BUILD.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/CMakeFiles/generate.stamp is up-to-date.\nFinalizeBuildStatus:\n  Deleting file \"x64\\Release\\ALL_BUILD\\ALL_BUILD.tlog\\unsuccessfulbuild\".\n  Touching \"x64\\Release\\ALL_BUILD\\ALL_BUILD.tlog\\ALL_BUILD.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default targets).\n\nBuild succeeded.\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj\" (default target) (3) ->\n(RunNativeCodeAnalysis target) -> \n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2258): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2254): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2252): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2250): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj\" (default target) (4) ->\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2258): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2254): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2252): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2250): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj\" (default target) (5) ->\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj\" (default target) (6) ->\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj\" (default target) (7) ->\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1913): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1914): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1950): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1950): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(277): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(277): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(300): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(300): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\bcrypt_pbkdf.c(119): warning C6260: sizeof * sizeof is usually wrong.  Did you intend to use a character count or a byte count? [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(150): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(555): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(814): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(814): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(947): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(947): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(1843): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(166): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(400): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(596): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(605): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(648): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(657): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(698): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(726): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(857): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1090): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1289): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1297): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1339): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1347): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1387): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1414): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2202): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2326): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2334): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2376): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2384): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2424): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2451): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2835): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2935): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2943): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2985): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2993): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(3033): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(3060): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(4269): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(4274): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\misc.c(282): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(155): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(169): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(311): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(322): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(785): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(830): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(582): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\pem.c(150): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\pem.c(535): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\publickey.c(959): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(176): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(1142): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(1142): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(876): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3241): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3241): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3346): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3448): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3448): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3586): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3586): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(370): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(457): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(487): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(488): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(79): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(231): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(373): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(373): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1168): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1283): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1665): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1663): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1662): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1662): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1661): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1661): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1659): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1990): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj\" (default target) (8) ->\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::strongref' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\parser.cpp(33): warning C26495: Variable 'QJson::ParserPrivate::m_errorLine' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\qobjecthelper.h(130): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(3799): warning C26495: Variable 'yyFlexLexer::yy_full_state' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\flexlexer.h(99): warning C26495: Variable 'FlexLexer::yy_flex_debug' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4008): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4010): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4010): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4089): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4223): warning C6011: Dereferencing NULL pointer 'yy_buffer_stack'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4256): warning C6011: Dereferencing NULL pointer 'b'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4314): warning C6011: Dereferencing NULL pointer 'b'. See line 4302 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4370): warning C6011: Dereferencing NULL pointer 'yy_buffer_stack'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\json_scanner.cpp(35): warning C26495: Variable 'JSonScanner::m_yylval' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(491): warning C6011: Dereferencing NULL pointer 'd'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(570): warning C6011: Dereferencing NULL pointer 'x'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(535): warning C26498: The function 'qMetaTypeId<QMap<QString,QVariant> * __ptr64>' is constexpr, mark variable 'type' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj\" (default target) (9) ->\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qvector2d.h(60): warning C26495: Variable 'QVector2D::v' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::strongref' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(283): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(286): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(289): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(292): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(296): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(60): warning C26495: Variable 'QMatrix::_m21' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(70): warning C26495: Variable 'QMatrix::_m21' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qpalette.h(71): warning C26495: Variable 'QPalette::<anonymous-tag>::for_faster_swapping_dont_use' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qfontmetrics.h(149): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qsciscintilla.h(2078): warning C26495: Variable 'QsciScintilla::FindState::wrap' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\lexaccessor.h(56): warning C26495: Variable 'LexAccessor::buf' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\stylecontext.h(140): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(64): warning C6386: Buffer overrun while writing to 'keywords':  the writable size is '(words+1)*8' bytes, but '24' bytes might be written. [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(47): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(69): warning C26495: Variable 'WordList::starts' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscilexer.h(341): warning C26495: Variable 'QsciLexer::StyleDataMap::style_data_set' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscilexer.h(336): warning C26495: Variable 'QsciLexer::StyleData::eol_fill' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscistyle.cpp(34): warning C26495: Variable 'QsciStyle::style_changeable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscistyle.cpp(48): warning C26495: Variable 'QsciStyle::style_changeable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\include\\platform.h(175): warning C26495: Variable 'ColourDesired::co' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\partitioning.h(91): warning C26495: Variable 'Partitioning::stepPartition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.h(122): warning C26495: Variable 'HighlightDelimiter::endFoldBlock' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(67): warning C26495: Variable 'SplitVector<int>::gapLength' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(35): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(40): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvarlengtharray.h(263): warning C26495: Variable 'QVarLengthArray<char,1024>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(144): warning C26495: Variable 'QStyleOptionFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(172): warning C26495: Variable 'QStyleOptionTabWidgetFrame::midLineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(196): warning C26495: Variable 'QStyleOptionTabBarBase::documentMode' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(227): warning C26495: Variable 'QStyleOptionHeader::section' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(286): warning C26495: Variable 'QStyleOptionTab::selectedPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(316): warning C26495: Variable 'QStyleOptionToolBar::positionOfLine' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(343): warning C26495: Variable 'QStyleOptionProgressBar::maximum' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(373): warning C26495: Variable 'QStyleOptionMenuItem::tabWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(392): warning C26495: Variable 'QStyleOptionDockWidget::floatable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(443): warning C26495: Variable 'QStyleOptionViewItem::showDecorationSelected' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(473): warning C26495: Variable 'QStyleOptionToolBox::position' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(492): warning C26495: Variable 'QStyleOptionRubberBand::opaque' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(534): warning C26495: Variable 'QStyleOptionSlider::dialWrapping' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(553): warning C26495: Variable 'QStyleOptionSpinBox::buttonSymbols' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(580): warning C26495: Variable 'QStyleOptionToolButton::arrowType' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(602): warning C26495: Variable 'QStyleOptionComboBox::editable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(620): warning C26495: Variable 'QStyleOptionTitleBar::titleBarState' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(640): warning C26495: Variable 'QStyleOptionGroupBox::midLineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(654): warning C26495: Variable 'QStyleOptionSizeGrip::corner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(670): warning C26495: Variable 'QStyleOptionGraphicsItem::levelOfDetail' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(114): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(363): warning C6281: Incorrect order of operations:  relational operators have higher precedence than bitwise operators. [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(365): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2304): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscidocument.cpp(59): warning C26495: Variable 'QsciDocument::pdoc' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(74): warning C26495: Variable 'QsciScintilla::ctPos' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(86): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(89): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(91): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(95): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(97): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(99): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(101): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(103): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(105): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(107): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(109): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(111): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(719): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(975): warning C6385: Reading invalid data from 'text':  the readable size is '((epos-spos+1))*2*1' bytes, but '3' bytes may be read. [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2258): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2258): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2292): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3233): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3237): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3231): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3239): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3235): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3951): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(4037): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(4123): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(102): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(99): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(140): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(93): warning C26495: Variable 'QsciSciPopup::sci' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(96): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(152): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(570): warning C6011: Dereferencing NULL pointer 'x'.  [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(414): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(414): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(438): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(438): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(445): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(445): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(456): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(456): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(470): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(471): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(539): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(540): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(666): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(666): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(952): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(955): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(957): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscimacro.h(99): warning C26495: Variable 'QsciMacro::Macro::wParam' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscimacro.cpp(255): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(92): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::pointer_segments' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(135): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::pointer_segments' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(144): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::pointer_segments' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(202): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(370): warning C6011: Dereferencing NULL pointer 'd'.  [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexers\\lexcpp.cpp(199): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(40): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::pb' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(34): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::ps' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(31): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::ps' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(141): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(141): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(143): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(143): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(174): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(247): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\casefolder.cpp(22): warning C26495: Variable 'CaseFolderTable::mapping' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\charclassify.cpp(22): warning C26495: Variable 'CharClassify::charClass' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.cpp(1575): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.cpp(1663): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(1763): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(2567): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(2568): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(3259): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(3260): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7204): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(8549): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(8549): warning C26451: Arithmetic overflow: Using operator '<<' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '<<' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7997): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7988): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7988): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7668): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7668): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7560): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7487): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7393): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\linemarker.cpp(116): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\linemarker.cpp(117): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(87): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(88): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(89): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(92): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(92): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(234): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(524): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(524): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(620): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\research.cpp(256): warning C26495: Variable 'RESearch::bopat' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\research.cpp(287): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\scintillabase.cpp(740): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\scintillabase.cpp(740): warning C26451: Arithmetic overflow: Using operator '<<' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '<<' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\style.cpp(60): warning C26495: Variable 'FontMeasurements::sizeZoomed' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\style.cpp(72): warning C26495: Variable 'Style::underline' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\viewstyle.cpp(87): warning C26495: Variable 'ViewStyle::nextExtendedStyle' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\viewstyle.cpp(91): warning C26495: Variable 'ViewStyle::largestMarkerHeight' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\xpm.cpp(59): warning C26495: Variable 'RGBAImage::scale' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj\" (default target) (10) ->\n\"E:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen.vcxproj\" (default target) (11) ->\n\"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj\" (default target) (12) ->\n  e:\\robo\\src\\robomongo\\ssh\\ssh.c(585): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\array.c(44): warning C6386: Buffer overrun while writing to 'newarray':  the writable size is 'newsize*sizeof(void *)' bytes, but '8' bytes might be written. [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C6386: Buffer overrun while writing to 'newarray+i':  the writable size is 'newsize*sizeof(void *)' bytes, but '8' bytes might be written. [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj\" (default target) (10) ->\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(283): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(286): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(289): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(292): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(296): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(60): warning C26495: Variable 'QMatrix::_m22' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(70): warning C26495: Variable 'QMatrix::_m22' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::strongref' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qpalette.h(71): warning C26495: Variable 'QPalette::<anonymous-tag>::for_faster_swapping_dont_use' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qfontmetrics.h(149): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(822): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2309): warning C26495: Variable 'fmt::v5::system_error::error_code_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2964): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2965): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2966): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2967): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2968): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2969): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(246): warning C26495: Variable 'absl::AlphaNum::digits_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(247): warning C26495: Variable 'absl::AlphaNum::digits_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(387): warning C6001: Using uninitialized memory 'result'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\oid.h(89): warning C26495: Variable 'mongo::OID::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\oid.h(241): warning C26495: Variable 'mongo::OID::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(442): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(454): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(700): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonmisc.h(251): warning C26495: Variable 'mongo::BSONSizeTracker::_sizes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonobjbuilder.h(158): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\rpc\\op_msg.h(325): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\interruptible.h(139): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\interruptible.h(180): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\intrusive_counter.h(123): warning C26495: Variable 'mongo::RCString::_size' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\future_impl.h(716): warning C26495: Variable 'mongo::future_details::SharedStateHolder<void>::_inner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\db\\baton.h(118): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\db\\baton.h(123): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\platform\\process_id.h(68): warning C26495: Variable 'mongo::ProcessId::_npid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\concurrency\\spin_lock.h(51): warning C6031: Return value ignored: 'InitializeCriticalSectionAndSpinCount'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\db\\write_concern_options.h(60): warning C26495: Variable 'mongo::WriteConcernOptions::wTimeout' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\client\\dbclient_cursor.h(105): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongoshellresult.h(55): warning C26495: Variable 'Robomongo::MongoShellExecResult::_isCurrentServerValid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongoshellresult.h(70): warning C26495: Variable 'Robomongo::MongoShellExecResult::_isCurrentServerValid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongocollectioninfo.h(10): warning C26495: Variable 'Robomongo::MongoCollectionInfo::_count' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(918): warning C26495: Variable 'Robomongo::ExecuteQueryResponse::resultIndex' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(989): warning C26495: Variable 'Robomongo::ExecuteScriptResponse::empty' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1087): warning C26495: Variable 'Robomongo::DocumentListLoadedEvent::_resultIndex' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1111): warning C26495: Variable 'Robomongo::ScriptExecutedEvent::_empty' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1195): warning C26495: Variable 'Robomongo::EstablishSshConnectionResponse::localport' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\base\\encoded_value_storage.h(47): warning C26495: Variable 'mongo::EncodedValueStorage<mongo::QueryResult::Layout,mongo::QueryResult::ConstView,mongo::QueryResult::View>::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(205): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::future_details::FakeVoid>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\decimal_counter.h(48): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(194): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::SourceLocationHolder>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(840): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\util\\builder.h(119): warning C26495: Variable 'mongo::StackAllocator::_buf' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(146): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::Timestamp>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(152): warning C26495: Variable 'boost::optional_detail::optional_base<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\detail\\optional_trivially_copyable_base.hpp(29): warning C26495: Variable 'boost::optional_detail::tc_optional_base<bool>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\detail\\optional_trivially_copyable_base.hpp(25): warning C26495: Variable 'boost::optional_detail::tc_optional_base<bool>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(162): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::UUID>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(140): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::UUID>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(904): warning C26495: Variable 'absl::container_internal::raw_hash_set<absl::container_internal::NodeHashSetPolicy<mongo::BSONObj>,mongo::HashImprover<mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::Hasher,mongo::BSONObj>,mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::EqualTo,std::allocator<mongo::BSONObj> >::ctrl_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(1563): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\base\\data_range.h(117): warning C26495: Variable 'mongo::ConstDataRange::_debug_offset' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonobj.h(136): warning C26495: Variable 'mongo::BSONObj::_objdata' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\base\\status_with.h(133): warning C26495: Variable 'mongo::StatusWith<char>::_status' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\base\\data_range.h(112): warning C26495: Variable 'mongo::ConstDataRange::_debug_offset' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(856): warning C26495: Variable 'absl::container_internal::raw_hash_set<absl::container_internal::NodeHashSetPolicy<mongo::BSONObj>,mongo::HashImprover<mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::Hasher,mongo::BSONObj>,mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::EqualTo,std::allocator<mongo::BSONObj> >::ctrl_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\core.h(1277): warning C26495: Variable 'fmt::v5::basic_format_args<fmt::v5::basic_format_context<std::back_insert_iterator<fmt::v5::internal::basic_buffer<char> >,char> >::<anonymous-tag>::values_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1410): warning C6387: 'value' could be '0':  this does not adhere to the specification for the function 'std::char_traits<char>::length'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\core.h(345): warning C26495: Variable 'std::back_insert_iterator<fmt::v5::internal::basic_buffer<char> >::container' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1516): warning C26498: The function 'std::numeric_limits<int>::max' is constexpr, mark variable 'max_int' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2479): warning C26495: Variable 'fmt::v5::basic_writer<fmt::v5::back_insert_range<fmt::v5::internal::basic_buffer<char> > >::int_writer<unsigned __int64,fmt::v5::basic_format_specs<char> >::prefix' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(603): warning C26495: Variable 'fmt::v5::internal::counting_iterator<char>::blackhole_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(1668): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2599): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2599): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1122): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1126): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(144): warning C26495: Variable 'QStyleOptionFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(172): warning C26495: Variable 'QStyleOptionTabWidgetFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(196): warning C26495: Variable 'QStyleOptionTabBarBase::documentMode' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(227): warning C26495: Variable 'QStyleOptionHeader::selectedPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(286): warning C26495: Variable 'QStyleOptionTab::row' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(316): warning C26495: Variable 'QStyleOptionToolBar::positionOfLine' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(343): warning C26495: Variable 'QStyleOptionProgressBar::bottomToTop' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(373): warning C26495: Variable 'QStyleOptionMenuItem::menuItemType' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(392): warning C26495: Variable 'QStyleOptionDockWidget::movable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(443): warning C26495: Variable 'QStyleOptionViewItem::viewItemPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(473): warning C26495: Variable 'QStyleOptionToolBox::position' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(492): warning C26495: Variable 'QStyleOptionRubberBand::opaque' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(534): warning C26495: Variable 'QStyleOptionSlider::tickInterval' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(553): warning C26495: Variable 'QStyleOptionSpinBox::frame' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(580): warning C26495: Variable 'QStyleOptionToolButton::arrowType' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(602): warning C26495: Variable 'QStyleOptionComboBox::editable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(620): warning C26495: Variable 'QStyleOptionTitleBar::titleBarState' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(640): warning C26495: Variable 'QStyleOptionGroupBox::midLineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(654): warning C26495: Variable 'QStyleOptionSizeGrip::corner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(670): warning C26495: Variable 'QStyleOptionGraphicsItem::levelOfDetail' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2304): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(491): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(492): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(493): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(494): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(495): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(498): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(504): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(25): warning C28251: Inconsistent annotation for 'GetSystemTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(103).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(29): warning C28251: Inconsistent annotation for 'GetSystemTimeAsFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(111).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(33): warning C28251: Inconsistent annotation for 'SystemTimeToFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\timezoneapi.h(93).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(38): warning C28251: Inconsistent annotation for 'FileTimeToSystemTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\timezoneapi.h(83).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(45): warning C28251: Inconsistent annotation for 'FileTimeToLocalFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\fileapi.h(171).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(50): warning C28251: Inconsistent annotation for 'LocalFileTimeToFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\fileapi.h(963).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(58): warning C28251: Inconsistent annotation for 'GetTickCount': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(168).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(133): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(695): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(613): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\date_time\\date_formatting.hpp(89): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\date_time\\date_formatting.hpp(91): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\converter_lexical_streams.hpp(162): warning C26495: Variable 'boost::detail::lexical_istream_limited_src<char,std::char_traits<char>,0,39>::buffer' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\lcast_unsigned_converters.hpp(191): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\lcast_unsigned_converters.hpp(262): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\quuid.h(68): warning C26495: Variable 'QUuid::data4' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\function\\function_base.hpp(611): warning C26495: Variable 'boost::function_base::functor' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\eventbus.cpp(115): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qvector2d.h(60): warning C26495: Variable 'QVector2D::v' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongoutils.cpp(12): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongodatabase.h(131): warning C26495: Variable 'Robomongo::MongoDatabaseUsersLoadedEvent::_database' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongodatabase.h(151): warning C26495: Variable 'Robomongo::MongoDatabaseFunctionsLoadedEvent::_database' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongocollectioninfo.cpp(7): warning C26495: Variable 'Robomongo::MongoCollectionInfo::_sizeBytes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongoqueryinfo.cpp(31): warning C26495: Variable 'Robomongo::MongoQueryInfo::_batchSize' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(110): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(143): warning C6054: String 'smon' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(171): warning C6054: String 'sday' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(140): warning C6054: String 'gmt' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(223): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(269): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(390): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\platform\\strtoll.h(35): warning C28251: Inconsistent annotation for 'strtoll': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\ucrt\\stdlib.h(539).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\platform\\strtoll.h(39): warning C28251: Inconsistent annotation for 'strtoull': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\ucrt\\stdlib.h(569).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(249): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(669): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(771): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(792): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(1099): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\assertions.h(59): warning C28251: Inconsistent annotation for 'TerminateProcess': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\processthreadsapi.h(143).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(1348): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\callargs.h(306): warning C6001: Using uninitialized memory 'args'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(636): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6470): warning C26495: Variable 'JS::FirstSubsumedFrame::cx' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6470): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6478): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\get_last_error.hpp(20): warning C28251: Inconsistent annotation for 'GetLastError': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\errhandlingapi.h(89).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(25): warning C28251: Inconsistent annotation for 'FormatMessageA': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(2408).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(36): warning C28251: Inconsistent annotation for 'FormatMessageW': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(2423).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(47): warning C28251: Inconsistent annotation for 'SetErrorMode': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\errhandlingapi.h(131).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\character_code_conversion.hpp(21): warning C28251: Inconsistent annotation for 'MultiByteToWideChar': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\stringapiset.h(126).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\character_code_conversion.hpp(30): warning C28251: Inconsistent annotation for 'WideCharToMultiByte': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\stringapiset.h(141).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(27): warning C28251: Inconsistent annotation for 'LocalAlloc': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1112).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(32): warning C28251: Inconsistent annotation for 'LocalReAlloc': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1122).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(37): warning C28251: Inconsistent annotation for 'LocalFree': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1200).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(211): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(211): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(216): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\engine\\scriptengine.cpp(230): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\bufferlist.h(101): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(262): warning C26495: Variable 'JS::Heap<JSObject *>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(254): warning C26495: Variable 'JS::Heap<JSObject *>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(969): warning C26495: Variable 'JS::Rooted<JSObject *>::stack' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(962): warning C26495: Variable 'JS::Rooted<JSObject *>::stack' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\vector.h(877): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\variant.h(568): warning C26495: Variable 'mozilla::Variant<char const *,mozilla::UniquePtr<char [0],JS::FreePolicy> >::rawData' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\vector.h(408): warning C26495: Variable 'mozilla::Vector<mozilla::BufferList<js::SystemAllocPolicy>::Segment,1,js::SystemAllocPolicy>::CRAndStorage<1,0>::mBytes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\mongodb\\mongoworker.cpp(55): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\mongodb\\mongoworker.cpp(56): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\mongodb\\mongoworker.cpp(1020): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonvalue.h(149): warning C26495: Variable 'QJsonValue::t' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonarray.h(62): warning C26495: Variable 'QJsonArray::d' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\settings\\settingsmanager.cpp(99): warning C26495: Variable 'Robomongo::SettingsManager::_autoExpand' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(570): warning C6011: Dereferencing NULL pointer 'x'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\aboutdialog.cpp(97): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonobject.h(64): warning C26495: Variable 'QJsonObject::d' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(30): warning C26495: Variable 'Robomongo::EulaDialog::_reply' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(44): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(39): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(126): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(127): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(128): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionauthtab.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionauthtab.cpp(58): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionauthtab.cpp(72): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(37): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(63): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(94): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(122): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(29): warning C26495: Variable 'Robomongo::ConnectionBasicTab::_discoverButton' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(339): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(339): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondiagnosticdialog.cpp(46): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondiagnosticdialog.cpp(57): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondialog.cpp(35): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondialog.cpp(43): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondialog.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\copycollectiondialog.cpp(51): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\copycollectiondialog.cpp(52): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\copycollectiondialog.cpp(85): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qsciscintilla.h(2078): warning C26495: Variable 'QsciScintilla::FindState::flags' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(44): warning C26495: Variable 'Robomongo::CreateCollectionDialog::_indexOptionDefaultsFrame' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(66): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(68): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(74): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(83): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(87): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(300): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(328): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(363): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(394): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createdatabasedialog.cpp(41): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createdatabasedialog.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(53): warning C26495: Variable 'Robomongo::CreateUserDialog::_readOnlyCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(96): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(97): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(128): warning C26495: Variable 'Robomongo::CreateUserDialog::_userSourceComboBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(157): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(156): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\preferencesdialog.cpp(87): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\preferencesdialog.cpp(88): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(43): warning C26495: Variable 'Robomongo::ConnectionListWidgetItem::_connection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(117): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(120): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(123): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(126): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(155): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(156): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(163): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(164): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(196): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(107): warning C26495: Variable 'Robomongo::ConnectionsDialog::_selectedConnection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(78): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(76): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(128): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(141): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(184): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(191): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(192): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(222): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\changeshelltimeoutdialog.cpp(30): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\changeshelltimeoutdialog.cpp(29): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\editors\\plainjavascripteditor.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\editors\\findframe.cpp(62): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\editors\\findframe.cpp(61): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\editors\\findframe.cpp(60): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(33): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(75): warning C26495: Variable 'Robomongo::AddEditIndexDialog::_uniqueCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(104): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(103): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(188): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\scriptwidget.cpp(85): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\scriptwidget.cpp(310): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\scriptwidget.cpp(311): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\scriptwidget.cpp(312): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(62): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(53): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(65): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(59): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(56): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(45): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(48): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(50): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(70): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(73): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(76): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(78): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(85): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexesdir.cpp(20): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexesdir.cpp(29): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexesdir.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexesdir.cpp(26): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexitem.cpp(25): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexitem.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasetfolderitem.cpp(39): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasetfolderitem.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(73): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(58): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(64): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(61): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(70): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(68): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(71): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(74): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(77): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(65): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(62): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(59): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(55): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(74): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(71): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(68): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(58): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(36): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(52): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(39): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerusertreeitem.cpp(24): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerusertreeitem.cpp(27): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerfunctiontreeitem.cpp(25): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerfunctiontreeitem.cpp(28): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\documenttexteditor.cpp(79): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\documenttexteditor.cpp(57): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\documenttexteditor.cpp(65): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\documenttexteditor.cpp(78): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\functiontexteditor.cpp(54): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\functiontexteditor.cpp(53): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(63): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(60): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(57): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(54): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(51): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(48): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(45): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerwidget.cpp(35): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerwidget.cpp(34): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerwidget.cpp(170): warning C28182: Dereferencing NULL pointer. 'item' contains the same NULL value as 'collectionItem' did.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontablemodel.cpp(12): warning C26495: Variable 'Robomongo::BsonTableModelProxy::_root' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontableview.cpp(29): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeitem.h(19): warning C26495: Variable 'Robomongo::BsonItemFields::_type' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeview.cpp(26): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeview.cpp(30): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeview.cpp(34): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(140): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(137): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(134): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(131): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(128): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(125): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(122): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(119): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(116): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(113): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(320): warning C6001: Using uninitialized memory 'mainWindow'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(27): warning C26495: Variable 'Robomongo::OutputItemContentWidget::_collectionStats' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(57): warning C26495: Variable 'Robomongo::OutputItemContentWidget::_collectionStats' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(124): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(125): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(126): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(127): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(128): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(276): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(277): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(89): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(100): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(102): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(103): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(104): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(105): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(19): warning C26495: Variable 'Robomongo::OutputWidget::_prevResultsCount' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(85): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(84): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\pagingwidget.cpp(49): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\pagingwidget.cpp(50): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\pagingwidget.cpp(46): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\pagingwidget.cpp(47): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\querywidget.cpp(58): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\querywidget.cpp(69): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\querywidget.cpp(313): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(66): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(63): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(64): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(61): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(65): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(60): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(299): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(301): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(122): warning C26495: Variable 'Robomongo::WelcomeTab::_blogsSection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(212): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(217): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(222): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(231): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\logwidget.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\logwidget.cpp(18): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(185): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(182): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(174): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(165): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(169): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(160): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(200): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(208): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(212): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(215): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(230): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(242): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(251): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(260): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(269): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(277): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(286): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(291): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(337): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(342): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(356): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(361): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(366): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(371): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(386): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(391): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(396): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(411): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(420): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(426): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(432): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(438): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(445): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(452): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(456): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(460): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(479): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(485): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(491): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(497): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(503): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(509): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(530): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(539): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(553): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(563): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(590): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(610): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(653): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(656): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(665): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(676): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(848): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(1304): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(1311): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(1357): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(1358): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(74): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(143): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(146): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(44): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(62): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(56): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(117): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(56): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(102): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(111): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(106): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(94): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(76): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(75): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\mongodb\\sshtunnelworker.cpp(25): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\mongodb\\sshtunnelworker.cpp(26): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj\" (default target) (14) ->\n  e:\\robo\\src\\robomongo\\ssh\\test.c(134): warning C6011: Dereferencing NULL pointer 'elem2'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\test.c(137): warning C6011: Dereferencing NULL pointer 'elem5'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\test.c(133): warning C6011: Dereferencing NULL pointer 'elem1'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\test.c(135): warning C6011: Dereferencing NULL pointer 'elem3'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\test.c(136): warning C6011: Dereferencing NULL pointer 'elem4'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n\n    850 Warning(s)\n    0 Error(s)\n\nTime Elapsed 00:09:43.04\n"
  },
  {
    "path": "static_analysis/vs_run-code-analysis_no-rule_rls.txt",
    "content": "Microsoft (R) Build Engine version 15.9.21+g9802d43bc3 for .NET Framework\nCopyright (C) Microsoft Corporation. All rights reserved.\n\nBuild started 19-Aug-20 10:40:21.\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" on node 1 (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\ZERO_CHECK.vcxproj\" (2) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"x64\\Release\\ZERO_CHECK\\\".\n  Creating directory \"x64\\Release\\ZERO_CHECK\\ZERO_CHECK.tlog\\\".\nInitializeBuildStatus:\n  Creating \"x64\\Release\\ZERO_CHECK\\ZERO_CHECK.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Checking Build System\n  CMake does not need to re-run because E:/robo/build/Release/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/libssh2-1.9.0/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Release/src/robomongo/ssh/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/qjson-0.8.1/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/qscintilla-2.8.4/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/googletest-1.8.1/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/googletest-1.8.1/googlemock/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/googletest-1.8.1/googlemock/gtest/CMakeFiles/generate.stamp is up-to-date.\n  CMake does not need to re-run because E:/robo/build/Release/src/robomongo/CMakeFiles/generate.stamp is up-to-date.\nFinalizeBuildStatus:\n  Deleting file \"x64\\Release\\ZERO_CHECK\\ZERO_CHECK.tlog\\unsuccessfulbuild\".\n  Touching \"x64\\Release\\ZERO_CHECK\\ZERO_CHECK.tlog\\ZERO_CHECK.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\ZERO_CHECK.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj\" (3) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"gmock.dir\\Release\\\".\n  Creating directory \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\Release\\\".\n  Creating directory \"gmock.dir\\Release\\gmock.tlog\\\".\nInitializeBuildStatus:\n  Creating \"gmock.dir\\Release\\gmock.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/googletest-1.8.1/googlemock/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/googletest-1.8.1/googlemock/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\" /Zi /nologo /W4 /WX /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D STRICT /D WIN32_LEAN_AND_MEAN /D GTEST_HAS_PTHREAD=0 /D _HAS_EXCEPTIONS=1 /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"gmock.dir\\Release\\\\\" /Fd\"gmock.dir\\Release\\gmock.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4251 /wd4275 /wd4702 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  -J /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-all.cc\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\src\\gmock-all.cc\"\n  gtest-all.cc\n  gmock-all.cc\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\Release\\gmock.lib\" /NOLOGO /MACHINE:X64  /machine:x64 \"gmock.dir\\Release\\gtest-all.obj\"\n  \"gmock.dir\\Release\\gmock-all.obj\"\n  gmock.vcxproj -> E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\Release\\gmock.lib\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2258): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2254): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2252): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2250): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"gmock.dir\\Release\\gmock.tlog\\unsuccessfulbuild\".\n  Touching \"gmock.dir\\Release\\gmock.tlog\\gmock.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj\" (4) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"gmock_main.dir\\Release\\\".\n  Creating directory \"gmock_main.dir\\Release\\gmock_main.tlog\\\".\nInitializeBuildStatus:\n  Creating \"gmock_main.dir\\Release\\gmock_main.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/googletest-1.8.1/googlemock/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/googletest-1.8.1/googlemock/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\" /Zi /nologo /W4 /WX /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D STRICT /D WIN32_LEAN_AND_MEAN /D GTEST_HAS_PTHREAD=0 /D _HAS_EXCEPTIONS=1 /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"gmock_main.dir\\Release\\\\\" /Fd\"gmock_main.dir\\Release\\gmock_main.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4251 /wd4275 /wd4702 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  -J /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-all.cc\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\src\\gmock-all.cc\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\src\\gmock_main.cc\"\n  gtest-all.cc\n  gmock-all.cc\n  gmock_main.cc\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\Release\\gmock_main.lib\" /NOLOGO /MACHINE:X64  /machine:x64 \"gmock_main.dir\\Release\\gtest-all.obj\"\n  \"gmock_main.dir\\Release\\gmock-all.obj\"\n  gmock_main.dir\\Release\\gmock_main.obj\n  gmock_main.vcxproj -> E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\Release\\gmock_main.lib\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2258): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2254): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2252): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2250): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"gmock_main.dir\\Release\\gmock_main.tlog\\unsuccessfulbuild\".\n  Touching \"gmock_main.dir\\Release\\gmock_main.tlog\\gmock_main.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj\" (5) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"gtest.dir\\Release\\\".\n  Creating directory \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\Release\\\".\n  Creating directory \"gtest.dir\\Release\\gtest.tlog\\\".\nInitializeBuildStatus:\n  Creating \"gtest.dir\\Release\\gtest.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/googletest-1.8.1/googletest/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/googletest-1.8.1/googlemock/gtest/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\" /Zi /nologo /W4 /WX /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D STRICT /D WIN32_LEAN_AND_MEAN /D GTEST_HAS_PTHREAD=0 /D _HAS_EXCEPTIONS=1 /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"gtest.dir\\Release\\\\\" /Fd\"gtest.dir\\Release\\gtest.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4251 /wd4275 /wd4702 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  -J /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-all.cc\"\n  gtest-all.cc\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\Release\\gtest.lib\" /NOLOGO /MACHINE:X64  /machine:x64 \"gtest.dir\\Release\\gtest-all.obj\"\n  gtest.vcxproj -> E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\Release\\gtest.lib\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"gtest.dir\\Release\\gtest.tlog\\unsuccessfulbuild\".\n  Touching \"gtest.dir\\Release\\gtest.tlog\\gtest.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj\" (6) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"gtest_main.dir\\Release\\\".\n  Creating directory \"gtest_main.dir\\Release\\gtest_main.tlog\\\".\nInitializeBuildStatus:\n  Creating \"gtest_main.dir\\Release\\gtest_main.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/googletest-1.8.1/googletest/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/googletest-1.8.1/googlemock/gtest/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\" /I\"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\" /Zi /nologo /W4 /WX /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D STRICT /D WIN32_LEAN_AND_MEAN /D GTEST_HAS_PTHREAD=0 /D _HAS_EXCEPTIONS=1 /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"gtest_main.dir\\Release\\\\\" /Fd\"gtest_main.dir\\Release\\gtest_main.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4251 /wd4275 /wd4702 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  -J /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest_main.cc\"\n  gtest_main.cc\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\Release\\gtest_main.lib\" /NOLOGO /MACHINE:X64  /machine:x64 gtest_main.dir\\Release\\gtest_main.obj\n  gtest_main.vcxproj -> E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\Release\\gtest_main.lib\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\ne:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"gtest_main.dir\\Release\\gtest_main.tlog\\unsuccessfulbuild\".\n  Touching \"gtest_main.dir\\Release\\gtest_main.tlog\\gtest_main.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj\" (7) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"libssh2.dir\\Release\\\".\n  Creating directory \"E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\Release\\\".\n  Creating directory \"libssh2.dir\\Release\\libssh2.tlog\\\".\nInitializeBuildStatus:\n  Creating \"libssh2.dir\\Release\\libssh2.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/libssh2-1.9.0/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/libssh2-1.9.0/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /W3 /WX- /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D LIBSSH2_OPENSSL /D LIBSSH2_WIN32 /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo\"libssh2.dir\\Release\\\\\" /Fd\"libssh2.dir\\Release\\libssh2.pdb\" /Gd /TC /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4133 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\bcrypt_pbkdf.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\blowfish.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\comp.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\crypt.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\global.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\hostkey.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\keepalive.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\knownhost.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\mac.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\misc.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\pem.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\publickey.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\scp.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c\" \"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\version.c\"\n  openssl.c\n  agent.c\n  bcrypt_pbkdf.c\n  blowfish.c\n  channel.c\n  comp.c\n  crypt.c\n  global.c\n  hostkey.c\n  keepalive.c\n  kex.c\n  knownhost.c\n  mac.c\n  misc.c\n  packet.c\n  pem.c\n  publickey.c\n  scp.c\n  session.c\n  sftp.c\n  transport.c\n  userauth.c\n  version.c\nResourceCompile:\n  C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.18362.0\\x86\\rc.exe /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D LIBSSH2_OPENSSL /D LIBSSH2_WIN32 /D \"CMAKE_INTDIR=\\\\\\\"Release\\\\\\\"\" /D _UNICODE /D UNICODE /l\"0x0409\" /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /fo\"libssh2.dir\\Release\\libssh2.res\" E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\win32\\libssh2.rc \nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\Release\\libssh2.lib\" /NOLOGO /MACHINE:X64  /machine:x64 libssh2.dir\\Release\\libssh2.res\n  libssh2.dir\\Release\\openssl.obj\n  libssh2.dir\\Release\\agent.obj\n  libssh2.dir\\Release\\bcrypt_pbkdf.obj\n  libssh2.dir\\Release\\blowfish.obj\n  libssh2.dir\\Release\\channel.obj\n  libssh2.dir\\Release\\comp.obj\n  libssh2.dir\\Release\\crypt.obj\n  libssh2.dir\\Release\\global.obj\n  libssh2.dir\\Release\\hostkey.obj\n  libssh2.dir\\Release\\keepalive.obj\n  libssh2.dir\\Release\\kex.obj\n  libssh2.dir\\Release\\knownhost.obj\n  libssh2.dir\\Release\\mac.obj\n  libssh2.dir\\Release\\misc.obj\n  libssh2.dir\\Release\\packet.obj\n  libssh2.dir\\Release\\pem.obj\n  libssh2.dir\\Release\\publickey.obj\n  libssh2.dir\\Release\\scp.obj\n  libssh2.dir\\Release\\session.obj\n  libssh2.dir\\Release\\sftp.obj\n  libssh2.dir\\Release\\transport.obj\n  libssh2.dir\\Release\\userauth.obj\n  libssh2.dir\\Release\\version.obj\n  libssh2.vcxproj -> E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\Release\\libssh2.lib\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1913): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1914): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1950): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1950): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(277): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(277): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(300): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(300): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\bcrypt_pbkdf.c(119): warning C6260: sizeof * sizeof is usually wrong.  Did you intend to use a character count or a byte count? [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(150): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(555): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(814): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(814): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(947): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(947): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(1843): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(166): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(400): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(596): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(605): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(648): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(657): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(698): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(726): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(857): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1090): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1289): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1297): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1339): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1347): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1387): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1414): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2202): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2326): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2334): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2376): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2384): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2424): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2451): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2835): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2935): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2943): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2985): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2993): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(3033): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(3060): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(4269): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(4274): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\misc.c(282): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(155): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(169): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(311): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(322): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(785): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(830): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(582): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\pem.c(150): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\pem.c(535): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\publickey.c(959): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(176): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(1142): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(1142): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(876): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3241): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3241): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3346): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3448): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3448): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3586): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3586): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(370): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(457): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(487): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(488): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(79): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(231): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(373): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(373): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1168): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1283): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1665): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1663): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1662): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1662): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1661): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1661): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1659): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\ne:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1990): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"libssh2.dir\\Release\\libssh2.tlog\\unsuccessfulbuild\".\n  Touching \"libssh2.dir\\Release\\libssh2.tlog\\libssh2.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj\" (8) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"qjson.dir\\Release\\\".\n  Creating directory \"E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\Release\\\".\n  Creating directory \"qjson.dir\\Release\\qjson.tlog\\\".\nInitializeBuildStatus:\n  Creating \"qjson.dir\\Release\\qjson.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nPreBuildEvent:\n  Automatic MOC, UIC and RCC for target qjson\n  setlocal\n  cd E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\n  if %errorlevel% neq 0 goto :cmEnd\n  E:\n  if %errorlevel% neq 0 goto :cmEnd\n  \"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E cmake_autogen E:/robo/build/Release/src/third-party/qjson-0.8.1/CMakeFiles/qjson_autogen.dir Release\n  if %errorlevel% neq 0 goto :cmEnd\n  :cmEnd\n  endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone\n  :cmErrorLevel\n  exit /b %1\n  :cmDone\n  if %errorlevel% neq 0 goto :VCEnd\n  :VCEnd\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/qjson-0.8.1/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/qjson-0.8.1/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson_autogen\\include_Release\" /I\"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtCore /I\"E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\.\\mkspecs\\win32-msvc\" /nologo /W3 /WX- /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D QJSON_STATIC /D QT_CORE_LIB /D QT_NO_DEBUG /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"qjson.dir\\Release\\\\\" /Fd\"qjson.dir\\Release\\qjson.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4065 /wd5033 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\parser.cpp\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\qobjecthelper.cpp\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\json_scanner.cpp\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\json_parser.cc\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\parserrunnable.cpp\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\serializer.cpp\" \"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\serializerrunnable.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson_autogen\\mocs_compilation.cpp\"\n  parser.cpp\n  qobjecthelper.cpp\n  json_scanner.cpp\n  json_parser.cc\n  parserrunnable.cpp\n  serializer.cpp\n  serializerrunnable.cpp\n  mocs_compilation.cpp\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\Release\\qjson.lib\" /NOLOGO /MACHINE:X64  /machine:x64 qjson.dir\\Release\\parser.obj\n  qjson.dir\\Release\\qobjecthelper.obj\n  qjson.dir\\Release\\json_scanner.obj\n  qjson.dir\\Release\\json_parser.obj\n  qjson.dir\\Release\\parserrunnable.obj\n  qjson.dir\\Release\\serializer.obj\n  qjson.dir\\Release\\serializerrunnable.obj\n  qjson.dir\\Release\\mocs_compilation.obj\n  qjson.vcxproj -> E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\Release\\qjson.lib\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::strongref' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\parser.cpp(33): warning C26495: Variable 'QJson::ParserPrivate::m_errorLine' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\qobjecthelper.h(130): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(3799): warning C26495: Variable 'yyFlexLexer::yy_full_state' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\flexlexer.h(99): warning C26495: Variable 'FlexLexer::yy_flex_debug' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4008): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4010): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4010): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4089): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4223): warning C6011: Dereferencing NULL pointer 'yy_buffer_stack'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4256): warning C6011: Dereferencing NULL pointer 'b'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4314): warning C6011: Dereferencing NULL pointer 'b'. See line 4302 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4370): warning C6011: Dereferencing NULL pointer 'yy_buffer_stack'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\json_scanner.cpp(35): warning C26495: Variable 'JSonScanner::m_yylval' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(491): warning C6011: Dereferencing NULL pointer 'd'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(570): warning C6011: Dereferencing NULL pointer 'x'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(535): warning C26498: The function 'qMetaTypeId<QMap<QString,QVariant> * __ptr64>' is constexpr, mark variable 'type' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"qjson.dir\\Release\\qjson.tlog\\unsuccessfulbuild\".\n  Touching \"qjson.dir\\Release\\qjson.tlog\\qjson.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj\" (9) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"qscintilla.dir\\Release\\\".\n  Creating directory \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\Release\\\".\n  Creating directory \"qscintilla.dir\\Release\\qscintilla.tlog\\\".\nInitializeBuildStatus:\n  Creating \"qscintilla.dir\\Release\\qscintilla.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nPreBuildEvent:\n  Automatic MOC, UIC and RCC for target qscintilla\n  setlocal\n  cd E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\n  if %errorlevel% neq 0 goto :cmEnd\n  E:\n  if %errorlevel% neq 0 goto :cmEnd\n  \"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E cmake_autogen E:/robo/build/Release/src/third-party/qscintilla-2.8.4/CMakeFiles/qscintilla_autogen.dir Release\n  if %errorlevel% neq 0 goto :cmEnd\n  :cmEnd\n  endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone\n  :cmErrorLevel\n  exit /b %1\n  :cmDone\n  if %errorlevel% neq 0 goto :VCEnd\n  :VCEnd\nCustomBuild:\n  Building Custom Rule E:/robo/src/third-party/qscintilla-2.8.4/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/third-party/qscintilla-2.8.4/CMakeFiles/generate.stamp is up-to-date.\n  Generating sources/Qt4Qt5/Qsci/moc_qsciabstractapis.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qsciapis.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qscilexer.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qscilexercpp.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qscilexerjavascript.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qscimacro.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qsciscintilla.cpp\n  Generating sources/Qt4Qt5/Qsci/moc_qsciscintillabase.cpp\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /I\"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla_autogen\\include_Release\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\include\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtWidgets /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtGui /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtANGLE /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtCore /I\"E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\.\\mkspecs\\win32-msvc\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtPrintSupport /nologo /W3 /WX- /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D SCINTILLA_QT /D SCI_LEXER /D QT_WIDGETS_LIB /D QT_GUI_LIB /D QT_CORE_LIB /D QT_NO_DEBUG /D QT_PRINTSUPPORT_LIB /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"qscintilla.dir\\Release\\\\\" /Fd\"qscintilla.dir\\Release\\qscintilla.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4554 /wd4099 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qsciabstractapis.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qsciapis.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qscilexer.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qscilexercpp.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qscilexerjavascript.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qscimacro.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qsciscintilla.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\Qsci\\moc_qsciscintillabase.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\StyleContext.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\WordList.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\Accessor.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\LexerBase.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\LexerModule.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\CharacterSet.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\CharacterCategory.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\PropSetSimple.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\LexerSimple.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\LexerNoExceptions.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscilexer.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscilexerjavascript.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscilexercpp.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscistyle.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\InputMethod.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qsciabstractapis.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\ScintillaQt.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscidocument.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qsciscintilla.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qsciscintillabase.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscicommand.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\ListBoxQt.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscistyledtext.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\SciClasses.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qsciprinter.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\PlatQt.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\MacPasteboardMime.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscimacro.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qsciapis.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\\qscicommandset.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexers\\LexCPP.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\AutoComplete.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\CallTip.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\CaseConvert.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\CaseFolder.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Catalogue.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\CellBuffer.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\CharClassify.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\ContractionState.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Decoration.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Document.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Editor.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\ExternalLexer.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Indicator.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\KeyMap.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\LineMarker.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\PerLine.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\PositionCache.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\RESearch.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\RunStyles.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\ScintillaBase.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Selection.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\Style.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\UniConversion.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\ViewStyle.cpp\" \"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\XPM.cpp\" \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla_autogen\\mocs_compilation.cpp\"\n  moc_qsciabstractapis.cpp\n  moc_qsciapis.cpp\n  moc_qscilexer.cpp\n  moc_qscilexercpp.cpp\n  moc_qscilexerjavascript.cpp\n  moc_qscimacro.cpp\n  moc_qsciscintilla.cpp\n  moc_qsciscintillabase.cpp\n  StyleContext.cpp\n  WordList.cpp\n  Accessor.cpp\n  LexerBase.cpp\n  LexerModule.cpp\n  CharacterSet.cpp\n  CharacterCategory.cpp\n  PropSetSimple.cpp\n  LexerSimple.cpp\n  LexerNoExceptions.cpp\n  qscilexer.cpp\n  qscilexerjavascript.cpp\n  qscilexercpp.cpp\n  qscistyle.cpp\n  InputMethod.cpp\n  qsciabstractapis.cpp\n  ScintillaQt.cpp\n  qscidocument.cpp\n  qsciscintilla.cpp\n  qsciscintillabase.cpp\n  qscicommand.cpp\n  ListBoxQt.cpp\n  qscistyledtext.cpp\n  SciClasses.cpp\n  qsciprinter.cpp\n  PlatQt.cpp\n  MacPasteboardMime.cpp\n  qscimacro.cpp\n  qsciapis.cpp\n  qscicommandset.cpp\n  LexCPP.cpp\n  AutoComplete.cpp\n  CallTip.cpp\n  CaseConvert.cpp\n  CaseFolder.cpp\n  Catalogue.cpp\n  CellBuffer.cpp\n  CharClassify.cpp\n  ContractionState.cpp\n  Decoration.cpp\n  Document.cpp\n  Editor.cpp\n  ExternalLexer.cpp\n  Indicator.cpp\n  KeyMap.cpp\n  LineMarker.cpp\n  PerLine.cpp\n  PositionCache.cpp\n  RESearch.cpp\n  RunStyles.cpp\n  ScintillaBase.cpp\n  Selection.cpp\n  Style.cpp\n  UniConversion.cpp\n  ViewStyle.cpp\n  XPM.cpp\n  mocs_compilation.cpp\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\Release\\qscintilla.lib\" /NOLOGO /MACHINE:X64  /machine:x64 /IGNORE:4221 qscintilla.dir\\Release\\moc_qsciabstractapis.obj\n  qscintilla.dir\\Release\\moc_qsciapis.obj\n  qscintilla.dir\\Release\\moc_qscilexer.obj\n  qscintilla.dir\\Release\\moc_qscilexercpp.obj\n  qscintilla.dir\\Release\\moc_qscilexerjavascript.obj\n  qscintilla.dir\\Release\\moc_qscimacro.obj\n  qscintilla.dir\\Release\\moc_qsciscintilla.obj\n  qscintilla.dir\\Release\\moc_qsciscintillabase.obj\n  qscintilla.dir\\Release\\StyleContext.obj\n  qscintilla.dir\\Release\\WordList.obj\n  qscintilla.dir\\Release\\Accessor.obj\n  qscintilla.dir\\Release\\LexerBase.obj\n  qscintilla.dir\\Release\\LexerModule.obj\n  qscintilla.dir\\Release\\CharacterSet.obj\n  qscintilla.dir\\Release\\CharacterCategory.obj\n  qscintilla.dir\\Release\\PropSetSimple.obj\n  qscintilla.dir\\Release\\LexerSimple.obj\n  qscintilla.dir\\Release\\LexerNoExceptions.obj\n  qscintilla.dir\\Release\\qscilexer.obj\n  qscintilla.dir\\Release\\qscilexerjavascript.obj\n  qscintilla.dir\\Release\\qscilexercpp.obj\n  qscintilla.dir\\Release\\qscistyle.obj\n  qscintilla.dir\\Release\\InputMethod.obj\n  qscintilla.dir\\Release\\qsciabstractapis.obj\n  qscintilla.dir\\Release\\ScintillaQt.obj\n  qscintilla.dir\\Release\\qscidocument.obj\n  qscintilla.dir\\Release\\qsciscintilla.obj\n  qscintilla.dir\\Release\\qsciscintillabase.obj\n  qscintilla.dir\\Release\\qscicommand.obj\n  qscintilla.dir\\Release\\ListBoxQt.obj\n  qscintilla.dir\\Release\\qscistyledtext.obj\n  qscintilla.dir\\Release\\SciClasses.obj\n  qscintilla.dir\\Release\\qsciprinter.obj\n  qscintilla.dir\\Release\\PlatQt.obj\n  qscintilla.dir\\Release\\MacPasteboardMime.obj\n  qscintilla.dir\\Release\\qscimacro.obj\n  qscintilla.dir\\Release\\qsciapis.obj\n  qscintilla.dir\\Release\\qscicommandset.obj\n  qscintilla.dir\\Release\\LexCPP.obj\n  qscintilla.dir\\Release\\AutoComplete.obj\n  qscintilla.dir\\Release\\CallTip.obj\n  qscintilla.dir\\Release\\CaseConvert.obj\n  qscintilla.dir\\Release\\CaseFolder.obj\n  qscintilla.dir\\Release\\Catalogue.obj\n  qscintilla.dir\\Release\\CellBuffer.obj\n  qscintilla.dir\\Release\\CharClassify.obj\n  qscintilla.dir\\Release\\ContractionState.obj\n  qscintilla.dir\\Release\\Decoration.obj\n  qscintilla.dir\\Release\\Document.obj\n  qscintilla.dir\\Release\\Editor.obj\n  qscintilla.dir\\Release\\ExternalLexer.obj\n  qscintilla.dir\\Release\\Indicator.obj\n  qscintilla.dir\\Release\\KeyMap.obj\n  qscintilla.dir\\Release\\LineMarker.obj\n  qscintilla.dir\\Release\\PerLine.obj\n  qscintilla.dir\\Release\\PositionCache.obj\n  qscintilla.dir\\Release\\RESearch.obj\n  qscintilla.dir\\Release\\RunStyles.obj\n  qscintilla.dir\\Release\\ScintillaBase.obj\n  qscintilla.dir\\Release\\Selection.obj\n  qscintilla.dir\\Release\\Style.obj\n  qscintilla.dir\\Release\\UniConversion.obj\n  qscintilla.dir\\Release\\ViewStyle.obj\n  qscintilla.dir\\Release\\XPM.obj\n  qscintilla.dir\\Release\\mocs_compilation.obj\n  qscintilla.vcxproj -> E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\Release\\qscintilla.lib\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qvector2d.h(60): warning C26495: Variable 'QVector2D::v' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::strongref' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(283): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(286): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(289): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(292): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(296): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(60): warning C26495: Variable 'QMatrix::_m21' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(70): warning C26495: Variable 'QMatrix::_m21' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qpalette.h(71): warning C26495: Variable 'QPalette::<anonymous-tag>::for_faster_swapping_dont_use' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qfontmetrics.h(149): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qsciscintilla.h(2078): warning C26495: Variable 'QsciScintilla::FindState::wrap' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\lexaccessor.h(56): warning C26495: Variable 'LexAccessor::buf' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\stylecontext.h(140): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(64): warning C6386: Buffer overrun while writing to 'keywords':  the writable size is '(words+1)*8' bytes, but '24' bytes might be written. [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(47): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(69): warning C26495: Variable 'WordList::starts' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscilexer.h(341): warning C26495: Variable 'QsciLexer::StyleDataMap::style_data_set' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscilexer.h(336): warning C26495: Variable 'QsciLexer::StyleData::eol_fill' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscistyle.cpp(34): warning C26495: Variable 'QsciStyle::style_changeable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscistyle.cpp(48): warning C26495: Variable 'QsciStyle::style_changeable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\include\\platform.h(175): warning C26495: Variable 'ColourDesired::co' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\partitioning.h(91): warning C26495: Variable 'Partitioning::stepLength' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.h(122): warning C26495: Variable 'HighlightDelimiter::endFoldBlock' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(67): warning C26495: Variable 'SplitVector<int>::body' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(35): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(40): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvarlengtharray.h(263): warning C26495: Variable 'QVarLengthArray<char,1024>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(144): warning C26495: Variable 'QStyleOptionFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(172): warning C26495: Variable 'QStyleOptionTabWidgetFrame::midLineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(196): warning C26495: Variable 'QStyleOptionTabBarBase::documentMode' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(227): warning C26495: Variable 'QStyleOptionHeader::section' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(286): warning C26495: Variable 'QStyleOptionTab::row' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(316): warning C26495: Variable 'QStyleOptionToolBar::positionOfLine' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(343): warning C26495: Variable 'QStyleOptionProgressBar::textVisible' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(373): warning C26495: Variable 'QStyleOptionMenuItem::tabWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(392): warning C26495: Variable 'QStyleOptionDockWidget::closable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(443): warning C26495: Variable 'QStyleOptionViewItem::decorationPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(473): warning C26495: Variable 'QStyleOptionToolBox::position' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(492): warning C26495: Variable 'QStyleOptionRubberBand::opaque' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(534): warning C26495: Variable 'QStyleOptionSlider::sliderValue' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(553): warning C26495: Variable 'QStyleOptionSpinBox::buttonSymbols' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(580): warning C26495: Variable 'QStyleOptionToolButton::arrowType' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(602): warning C26495: Variable 'QStyleOptionComboBox::editable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(620): warning C26495: Variable 'QStyleOptionTitleBar::titleBarState' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(640): warning C26495: Variable 'QStyleOptionGroupBox::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(654): warning C26495: Variable 'QStyleOptionSizeGrip::corner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(670): warning C26495: Variable 'QStyleOptionGraphicsItem::levelOfDetail' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(114): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(363): warning C6281: Incorrect order of operations:  relational operators have higher precedence than bitwise operators. [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(365): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2304): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscidocument.cpp(59): warning C26495: Variable 'QsciDocument::pdoc' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(74): warning C26495: Variable 'QsciScintilla::ctPos' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(86): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(89): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(91): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(95): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(97): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(99): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(101): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(103): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(105): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(107): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(109): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(111): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(719): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(975): warning C6385: Reading invalid data from 'text':  the readable size is '((epos-spos+1))*2*1' bytes, but '3' bytes may be read. [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2258): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2258): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2292): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3239): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3233): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3231): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3235): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3237): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3951): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(4037): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(4123): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(102): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(99): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(140): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(93): warning C26495: Variable 'QsciSciPopup::sci' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(96): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(152): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(570): warning C6011: Dereferencing NULL pointer 'x'.  [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(414): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(414): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(438): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(438): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(445): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(445): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(456): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(456): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(470): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(471): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(539): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(540): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(666): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(666): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(952): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(955): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(957): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscimacro.h(99): warning C26495: Variable 'QsciMacro::Macro::msg' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscimacro.cpp(255): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(92): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::dummy' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(135): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::dummy' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(144): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::dummy' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(202): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(370): warning C6011: Dereferencing NULL pointer 'd'.  [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexers\\lexcpp.cpp(199): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(40): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::pi' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(34): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::pi' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(31): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::pi' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(141): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(141): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(143): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(143): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(174): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(247): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\casefolder.cpp(22): warning C26495: Variable 'CaseFolderTable::mapping' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\charclassify.cpp(22): warning C26495: Variable 'CharClassify::charClass' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.cpp(1575): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.cpp(1663): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(1763): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(2567): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(2568): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(3259): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(3260): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7204): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(8549): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(8549): warning C26451: Arithmetic overflow: Using operator '<<' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '<<' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7997): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7988): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7988): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7668): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7668): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7560): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7487): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7393): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\linemarker.cpp(116): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\linemarker.cpp(117): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(87): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(88): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(89): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(92): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(92): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(234): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(524): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(524): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(620): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\research.cpp(256): warning C26495: Variable 'RESearch::bol' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\research.cpp(287): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\scintillabase.cpp(740): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\scintillabase.cpp(740): warning C26451: Arithmetic overflow: Using operator '<<' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '<<' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\style.cpp(60): warning C26495: Variable 'FontMeasurements::sizeZoomed' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\style.cpp(72): warning C26495: Variable 'Style::hotspot' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\viewstyle.cpp(87): warning C26495: Variable 'ViewStyle::nextExtendedStyle' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\viewstyle.cpp(91): warning C26495: Variable 'ViewStyle::largestMarkerHeight' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\xpm.cpp(59): warning C26495: Variable 'RGBAImage::scale' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"qscintilla.dir\\Release\\qscintilla.tlog\\unsuccessfulbuild\".\n  Touching \"qscintilla.dir\\Release\\qscintilla.tlog\\qscintilla.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj\" (10) on node 1 (default targets).\nProject \"E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj\" (10) is building \"E:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen.vcxproj\" (11) on node 1 (default targets).\nProject \"E:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen.vcxproj\" (11) is building \"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj\" (12) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"ssh.dir\\Release\\\".\n  Creating directory \"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\Release\\\".\n  Creating directory \"ssh.dir\\Release\\ssh.tlog\\\".\nInitializeBuildStatus:\n  Creating \"ssh.dir\\Release\\ssh.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/robomongo/ssh/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/robomongo/ssh/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /IE:\\robo\\build\\Release\\src /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /W3 /WX- /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo\"ssh.dir\\Release\\\\\" /Fd\"ssh.dir\\Release\\ssh.pdb\" /Gd /TC /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" E:\\robo\\src\\robomongo\\ssh\\ssh.c E:\\robo\\src\\robomongo\\ssh\\log.c E:\\robo\\src\\robomongo\\ssh\\array.c\n  ssh.c\n  log.c\n  array.c\nLib:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\Lib.exe /OUT:\"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\Release\\ssh.lib\" /NOLOGO /MACHINE:X64  /machine:x64 ssh.dir\\Release\\ssh.obj\n  ssh.dir\\Release\\log.obj\n  ssh.dir\\Release\\array.obj\n  ssh.vcxproj -> E:\\robo\\build\\Release\\src\\robomongo\\ssh\\Release\\ssh.lib\ne:\\robo\\src\\robomongo\\ssh\\ssh.c(585): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\array.c(44): warning C6386: Buffer overrun while writing to 'newarray':  the writable size is 'newsize*sizeof(void *)' bytes, but '8' bytes might be written. [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C6386: Buffer overrun while writing to 'newarray+i':  the writable size is 'newsize*sizeof(void *)' bytes, but '8' bytes might be written. [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"ssh.dir\\Release\\ssh.tlog\\unsuccessfulbuild\".\n  Touching \"ssh.dir\\Release\\ssh.tlog\\ssh.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj\" (default targets).\nPrepareForBuild:\n  Creating directory \"x64\\Release\\robomongo_autogen\\\".\n  Creating directory \"x64\\Release\\robomongo_autogen\\robomong.8F06E81C.tlog\\\".\nInitializeBuildStatus:\n  Creating \"x64\\Release\\robomongo_autogen\\robomong.8F06E81C.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/robomongo/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/robomongo/CMakeFiles/generate.stamp is up-to-date.\n  Automatic MOC, UIC and RCC for target robomongo\nFinalizeBuildStatus:\n  Deleting file \"x64\\Release\\robomongo_autogen\\robomong.8F06E81C.tlog\\unsuccessfulbuild\".\n  Touching \"x64\\Release\\robomongo_autogen\\robomong.8F06E81C.tlog\\robomongo_autogen.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen.vcxproj\" (default targets).\nPrepareForBuild:\n  Creating directory \"robomongo.dir\\Release\\\".\n  Creating directory \"E:\\robo\\build\\Release\\src\\robomongo\\Release\\\".\n  Creating directory \"robomongo.dir\\Release\\robomongo.tlog\\\".\nInitializeBuildStatus:\n  Creating \"robomongo.dir\\Release\\robomongo.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/robomongo/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/robomongo/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /IE:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen\\include_Release /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\include\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\" /IE:\\robo\\build\\Release\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtWidgets /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtGui /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtANGLE /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtCore /I\"E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\.\\mkspecs\\win32-msvc\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtNetwork /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtXml /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtPrintSupport /I\"E:\\robo-shell\\src\" /I\"E:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\" /I\"E:\\robo-shell\\src\\third_party\\boost-1.70.0\" /I\"E:\\robo-shell\\src\\third_party\\fmt\\dist\\include\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\include\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\mongo_sources\" /I\"E:\\robo-shell\\src\\third_party\\pcre-8.42\" /I\"E:\\robo-shell\\src\\third_party\\SafeInt\" /I\"E:\\robo-shell\\build\\opt\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\platform\\x86_64\\windows\\include\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /W3 /WX- /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D BUILDING_ROBO /D \"PROJECT_NAME=\\\"Robo 3T\\\"\" /D \"PROJECT_NAME_TITLE=\\\"Robo 3T\\\"\" /D \"PROJECT_COPYRIGHT=\\\"Copyright (C) 2014-2017 3T Software Labs Ltd All Rights Reserved.\\\"\" /D \"PROJECT_DOMAIN=\\\"www.robomongo.org\\\"\" /D \"PROJECT_COMPANYNAME=\\\"3T Software Labs Ltd\\\"\" /D \"PROJECT_COMPANYNAME_DOMAIN=\\\"https://studio3t.com/\\\"\" /D \"PROJECT_GITHUB_FORK=\\\"www.github.com/Studio3T/robomongo\\\"\" /D \"PROJECT_GITHUB_ISSUES=\\\"www.github.com/Studio3T/robomongo/issues\\\"\" /D \"PROJECT_VERSION=\\\"1.4.0\\\"\" /D \"PROJECT_VERSION_SHORT=\\\"1.4\\\"\" /D \"PROJECT_NAME_LOWERCASE=\\\"robo 3t\\\"\" /D \"PROJECT_QT_VERSION=\\\"5.12.8\\\"\" /D \"MongoDB_VERSION=\\\"r4.2.6\\\"\" /D \"OPENSSL_VERSION=\\\"1.1.1f\\\"\" /D \"LIBSSH2_VERSION=\\\"1.9.0\\\"\" /D \"QJSON_VERSION=\\\"0.8.1\\\"\" /D \"GOOGLE_TEST_VERSION=\\\"1.8.1\\\"\" /D \"ESPRIMA_VERSION=\\\"2.7.3\\\"\" /D QT_WIDGETS_LIB /D QT_GUI_LIB /D QT_CORE_LIB /D QT_NO_DEBUG /D QT_NETWORK_LIB /D QT_XML_LIB /D QJSON_STATIC /D SCINTILLA_QT /D SCI_LEXER /D QT_PRINTSUPPORT_LIB /D PCRE_STATIC /D BOOST_THREAD_VERSION=4 /D BOOST_THREAD_DONT_PROVIDE_VARIADIC_THREAD /D BOOST_THREAD_NO_DEPRECATED /D BOOST_THREAD_DONT_PROVIDE_INTERRUPTIONS /D BOOST_THREAD_HAS_BUG /D MONGO_CONFIG_HAVE_HEADER_UNISTD_H /D _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING /D _SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo\"robomongo.dir\\Release\\\\\" /Fd\"robomongo.dir\\Release\\vc141.pdb\" /Gd /TP /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /wd4477 /wd4291 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" E:\\robo\\src\\robomongo\\app\\main.cpp E:\\robo\\src\\robomongo\\core\\utils\\QtUtils.cpp E:\\robo\\src\\robomongo\\core\\utils\\StdUtils.cpp E:\\robo\\src\\robomongo\\core\\utils\\Logger.cpp E:\\robo\\src\\robomongo\\core\\HexUtils.cpp E:\\robo\\src\\robomongo\\core\\utils\\BsonUtils.cpp E:\\robo\\src\\robomongo\\core\\settings\\CredentialSettings.cpp E:\\robo\\src\\robomongo\\core\\settings\\ConnectionSettings.cpp E:\\robo\\src\\robomongo\\core\\Event.cpp E:\\robo\\src\\robomongo\\core\\Enums.cpp E:\\robo\\src\\robomongo\\core\\EventError.cpp E:\\robo\\src\\robomongo\\core\\EventBusSubscriber.cpp E:\\robo\\src\\robomongo\\core\\EventBusDispatcher.cpp E:\\robo\\src\\robomongo\\core\\EventWrapper.cpp E:\\robo\\src\\robomongo\\core\\EventBus.cpp E:\\robo\\src\\robomongo\\core\\KeyboardManager.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoNamespace.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoFunction.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoUtils.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoCollection.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoCollectionInfo.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoQueryInfo.cpp E:\\robo\\src\\robomongo\\core\\domain\\CursorPosition.cpp E:\\robo\\src\\robomongo\\core\\domain\\ScriptInfo.cpp E:\\robo\\src\\robomongo\\core\\events\\MongoEventsInfo.cpp E:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp E:\\robo\\src\\robomongo\\shell\\bson\\json.cpp E:\\robo\\src\\robomongo\\core\\engine\\ScriptEngine.cpp E:\\robo\\src\\robomongo\\core\\events\\MongoEvents.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoDocument.cpp E:\\robo\\src\\robomongo\\gui\\AppStyle.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoServer.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoShell.cpp E:\\robo\\src\\robomongo\\core\\domain\\MongoDatabase.cpp E:\\robo\\src\\robomongo\\core\\domain\\App.cpp E:\\robo\\src\\robomongo\\core\\mongodb\\MongoClient.cpp E:\\robo\\src\\robomongo\\core\\mongodb\\MongoWorker.cpp E:\\robo\\src\\robomongo\\core\\mongodb\\ReplicaSet.cpp E:\\robo\\src\\robomongo\\core\\settings\\SettingsManager.cpp E:\\robo\\src\\robomongo\\core\\AppRegistry.cpp E:\\robo\\src\\robomongo\\utils\\StringOperations.cpp E:\\robo\\src\\robomongo\\utils\\common.cpp E:\\robo\\src\\robomongo\\utils\\SimpleCrypt.cpp E:\\robo\\src\\robomongo\\utils\\RoboCrypt.cpp E:\\robo\\src\\robomongo\\gui\\GuiRegistry.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\AboutDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\EulaDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionAdvancedTab.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionAuthTab.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionBasicTab.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionDiagnosticDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\CopyCollectionDialog.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\IndicatorLabel.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\CreateCollectionDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\CreateDatabaseDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\CreateUserDialog.cpp E:\\robo\\src\\robomongo\\gui\\utils\\ComboBoxUtils.cpp E:\\robo\\src\\robomongo\\gui\\utils\\DialogUtils.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\PreferencesDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ConnectionsDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ExportDialog.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\ChangeShellTimeoutDialog.cpp E:\\robo\\src\\robomongo\\gui\\editors\\PlainJavaScriptEditor.cpp E:\\robo\\src\\robomongo\\gui\\editors\\JSLexer.cpp E:\\robo\\src\\robomongo\\gui\\editors\\FindFrame.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\AddEditIndexDialog.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\ScriptWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerCollectionTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerCollectionIndexesDir.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerCollectionIndexItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerReplicaSetFolderItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerReplicaSetTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerDatabaseTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerDatabaseCategoryTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerUserTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerFunctionTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\DocumentTextEditor.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\FunctionTextEditor.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerServerTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerTreeWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\ExplorerWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\BsonTableModel.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\BsonTableView.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\BsonTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\BsonTreeModel.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\BsonTreeView.cpp E:\\robo\\src\\robomongo\\core\\domain\\Notifier.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\CollectionStatsTreeItem.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\CollectionStatsTreeWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\JsonPrepareThread.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\OutputItemContentWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\OutputItemHeaderWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\OutputWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\PagingWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\ProgressBarPopup.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\QueryWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\WorkAreaTabBar.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\WorkAreaTabWidget.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\WelcomeTab.cpp E:\\robo\\src\\robomongo\\gui\\widgets\\LogWidget.cpp E:\\robo\\src\\robomongo\\gui\\MainWindow.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\SSHTunnelTab.cpp E:\\robo\\src\\robomongo\\gui\\dialogs\\SSLTab.cpp E:\\robo\\src\\robomongo\\core\\settings\\SshSettings.cpp E:\\robo\\src\\robomongo\\core\\settings\\SslSettings.cpp E:\\robo\\src\\robomongo\\core\\settings\\ReplicaSetSettings.cpp E:\\robo\\src\\robomongo\\core\\mongodb\\SshTunnelWorker.cpp E:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen\\mocs_compilation.cpp E:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen\\3YJK5W5UP7\\qrc_robo.cpp E:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen\\YHP5W5E6RA\\qrc_gui.cpp\n  main.cpp\n  QtUtils.cpp\n  StdUtils.cpp\n  Logger.cpp\n  HexUtils.cpp\n  BsonUtils.cpp\n  CredentialSettings.cpp\n  ConnectionSettings.cpp\n  Event.cpp\n  Enums.cpp\n  EventError.cpp\n  EventBusSubscriber.cpp\n  EventBusDispatcher.cpp\n  EventWrapper.cpp\n  EventBus.cpp\n  KeyboardManager.cpp\n  MongoNamespace.cpp\n  MongoFunction.cpp\n  MongoUtils.cpp\n  MongoCollection.cpp\n  MongoCollectionInfo.cpp\n  MongoQueryInfo.cpp\n  CursorPosition.cpp\n  ScriptInfo.cpp\n  MongoEventsInfo.cpp\n  ptimeutil.cpp\n  json.cpp\n  ScriptEngine.cpp\n  MongoEvents.cpp\n  MongoDocument.cpp\n  AppStyle.cpp\n  MongoServer.cpp\n  MongoShell.cpp\n  MongoDatabase.cpp\n  App.cpp\n  MongoClient.cpp\n  MongoWorker.cpp\n  ReplicaSet.cpp\n  SettingsManager.cpp\n  AppRegistry.cpp\n  StringOperations.cpp\n  common.cpp\n  SimpleCrypt.cpp\n  RoboCrypt.cpp\n  GuiRegistry.cpp\n  AboutDialog.cpp\n  EulaDialog.cpp\n  ConnectionAdvancedTab.cpp\n  ConnectionAuthTab.cpp\n  ConnectionBasicTab.cpp\n  ConnectionDiagnosticDialog.cpp\n  ConnectionDialog.cpp\n  CopyCollectionDialog.cpp\n  IndicatorLabel.cpp\n  CreateCollectionDialog.cpp\n  CreateDatabaseDialog.cpp\n  CreateUserDialog.cpp\n  ComboBoxUtils.cpp\n  DialogUtils.cpp\n  PreferencesDialog.cpp\n  ConnectionsDialog.cpp\n  ExportDialog.cpp\n  ChangeShellTimeoutDialog.cpp\n  PlainJavaScriptEditor.cpp\n  JSLexer.cpp\n  FindFrame.cpp\n  AddEditIndexDialog.cpp\n  ScriptWidget.cpp\n  ExplorerCollectionTreeItem.cpp\n  ExplorerCollectionIndexesDir.cpp\n  ExplorerCollectionIndexItem.cpp\n  ExplorerTreeItem.cpp\n  ExplorerReplicaSetFolderItem.cpp\n  ExplorerReplicaSetTreeItem.cpp\n  ExplorerDatabaseTreeItem.cpp\n  ExplorerDatabaseCategoryTreeItem.cpp\n  ExplorerUserTreeItem.cpp\n  ExplorerFunctionTreeItem.cpp\n  DocumentTextEditor.cpp\n  FunctionTextEditor.cpp\n  ExplorerServerTreeItem.cpp\n  ExplorerTreeWidget.cpp\n  ExplorerWidget.cpp\n  BsonTableModel.cpp\n  BsonTableView.cpp\n  BsonTreeItem.cpp\n  BsonTreeModel.cpp\n  BsonTreeView.cpp\n  Notifier.cpp\n  CollectionStatsTreeItem.cpp\n  CollectionStatsTreeWidget.cpp\n  JsonPrepareThread.cpp\n  OutputItemContentWidget.cpp\n  OutputItemHeaderWidget.cpp\n  OutputWidget.cpp\n  PagingWidget.cpp\n  ProgressBarPopup.cpp\n  QueryWidget.cpp\n  WorkAreaTabBar.cpp\n  WorkAreaTabWidget.cpp\n  WelcomeTab.cpp\n  LogWidget.cpp\n  MainWindow.cpp\n  SSHTunnelTab.cpp\n  SSLTab.cpp\n  SshSettings.cpp\n  SslSettings.cpp\n  ReplicaSetSettings.cpp\n  SshTunnelWorker.cpp\n  mocs_compilation.cpp\n  qrc_robo.cpp\n  qrc_gui.cpp\nResourceCompile:\n  C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.18362.0\\x86\\rc.exe /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D BUILDING_ROBO /D \"PROJECT_NAME=\\\\\\\"Robo 3T\\\\\\\"\" /D \"PROJECT_NAME_TITLE=\\\\\\\"Robo 3T\\\\\\\"\" /D \"PROJECT_COPYRIGHT=\\\\\\\"Copyright (C) 2014-2017 3T Software Labs Ltd All Rights Reserved.\\\\\\\"\" /D \"PROJECT_DOMAIN=\\\\\\\"www.robomongo.org\\\\\\\"\" /D \"PROJECT_COMPANYNAME=\\\\\\\"3T Software Labs Ltd\\\\\\\"\" /D \"PROJECT_COMPANYNAME_DOMAIN=\\\\\\\"https://studio3t.com/\\\\\\\"\" /D \"PROJECT_GITHUB_FORK=\\\\\\\"www.github.com/Studio3T/robomongo\\\\\\\"\" /D \"PROJECT_GITHUB_ISSUES=\\\\\\\"www.github.com/Studio3T/robomongo/issues\\\\\\\"\" /D \"PROJECT_VERSION=\\\\\\\"1.4.0\\\\\\\"\" /D \"PROJECT_VERSION_SHORT=\\\\\\\"1.4\\\\\\\"\" /D \"PROJECT_NAME_LOWERCASE=\\\\\\\"robo 3t\\\\\\\"\" /D \"PROJECT_QT_VERSION=\\\\\\\"5.12.8\\\\\\\"\" /D \"MongoDB_VERSION=\\\\\\\"r4.2.6\\\\\\\"\" /D \"OPENSSL_VERSION=\\\\\\\"1.1.1f\\\\\\\"\" /D \"LIBSSH2_VERSION=\\\\\\\"1.9.0\\\\\\\"\" /D \"QJSON_VERSION=\\\\\\\"0.8.1\\\\\\\"\" /D \"GOOGLE_TEST_VERSION=\\\\\\\"1.8.1\\\\\\\"\" /D \"ESPRIMA_VERSION=\\\\\\\"2.7.3\\\\\\\"\" /D QT_WIDGETS_LIB /D QT_GUI_LIB /D QT_CORE_LIB /D QT_NO_DEBUG /D QT_NETWORK_LIB /D QT_XML_LIB /D QJSON_STATIC /D SCINTILLA_QT /D SCI_LEXER /D QT_PRINTSUPPORT_LIB /D PCRE_STATIC /D BOOST_THREAD_VERSION=4 /D BOOST_THREAD_DONT_PROVIDE_VARIADIC_THREAD /D BOOST_THREAD_NO_DEPRECATED /D BOOST_THREAD_DONT_PROVIDE_INTERRUPTIONS /D BOOST_THREAD_HAS_BUG /D MONGO_CONFIG_HAVE_HEADER_UNISTD_H /D _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING /D _SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING /D \"CMAKE_INTDIR=\\\\\\\"Release\\\\\\\"\" /D _UNICODE /D UNICODE /l\"0x0409\" /IE:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen\\include_Release /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\Qt4Qt5\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\include\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\" /I\"E:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\" /IE:\\robo\\build\\Release\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtWidgets /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtGui /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtANGLE /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtCore /I\"E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\.\\mkspecs\\win32-msvc\" /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtNetwork /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtXml /IE:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\include\\QtPrintSupport /I\"E:\\robo-shell\\src\" /I\"E:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\" /I\"E:\\robo-shell\\src\\third_party\\boost-1.70.0\" /I\"E:\\robo-shell\\src\\third_party\\fmt\\dist\\include\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\include\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\mongo_sources\" /I\"E:\\robo-shell\\src\\third_party\\pcre-8.42\" /I\"E:\\robo-shell\\src\\third_party\\SafeInt\" /I\"E:\\robo-shell\\build\\opt\" /I\"E:\\robo-shell\\src\\third_party\\mozjs-60\\platform\\x86_64\\windows\\include\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /fo\"robomongo.dir\\Release\\winres.res\" E:\\robo\\build\\Release\\winres.rc \nLink:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe /ERRORREPORT:QUEUE /OUT:\"E:\\robo\\build\\Release\\src\\robomongo\\Release\\robo3t.exe\" /INCREMENTAL:NO /NOLOGO E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5Network.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5Xml.lib \"..\\third-party\\qjson-0.8.1\\Release\\qjson.lib\" \"..\\third-party\\qscintilla-2.8.4\\Release\\qscintilla.lib\" ssh\\Release\\ssh.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\qtmain.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5PrintSupport.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5Widgets.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5Gui.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\Qt5Core.lib E:\\Qt\\Qt5.12.8\\5.12.8\\msvc2017_64\\lib\\qtmain.lib \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_options_client.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_options_client_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\message_compressor_options_client_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\kms_shell.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\linenoise.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\mk_wcwidth.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\mongo-server.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\shell_options.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\shell_utils.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\shell_utils_extended.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\shell_utils_launcher.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\version_impl.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\signal_handlers.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\signal_win32.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\log_process_details.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_options_server_helpers.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_options_base.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\cluster_auth_mode_option_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\keyfile_option_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_options_base_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_options_general_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_options_nongeneral_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\is_master_response.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\member_config.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_set_config.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_set_heartbeat_args_v1.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_set_heartbeat_response.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_set_request_votes_args.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_set_tag.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\update_position_args.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\last_vote.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_set_config_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\split_horizon.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\concurrency\\d_concurrency.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\concurrency\\lock_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\concurrency\\lock_state.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\concurrency\\lock_stats.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\concurrency\\replication_state_transition_lock_guard.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\concurrency\\ticketholder.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\concurrency\\flow_control_ticketholder.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\password.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\password_params_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\options_parser_init.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\bench.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\traffic_reader.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\logical_session_id_helpers.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\catalog\\index_key_validate.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\index\\btree_key_generator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\index\\expression_keys_private.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\index\\sort_key_generator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\index\\wildcard_key_generator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\exec\\projection_exec_agg.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\parsed_aggregation_projection.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\parsed_aggregation_projection_node.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\parsed_exclusion_projection.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\parsed_inclusion_projection.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\parsed_add_fields.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\index\\expression_params.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\index\\s2_common.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\hasher.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_index_format.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_matcher.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_query_impl.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_query_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_spec.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_spec_legacy.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_language.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_basic_phrase_matcher.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_basic_tokenizer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_unicode_phrase_matcher.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_unicode_tokenizer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_util.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_element_iterator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\stemmer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\stop_words.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\stop_words_list.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\tokenizer.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_stemmer.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\runtime\\api.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\libstemmer\\libstemmer_utf8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_dutch.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_german.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_porter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_spanish.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_english.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_hungarian.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_portuguese.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_swedish.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_finnish.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_italian.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_romanian.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_turkish.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_danish.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_french.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_norwegian.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\libstemmer_c\\src_c\\stem_UTF_8_russian.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\unicode\\codepoints_casefold.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\unicode\\codepoints_delimiter_list.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\unicode\\codepoints_diacritic_list.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\unicode\\codepoints_diacritic_map.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\unicode\\string.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\linenoise_utf8.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\index\\index_descriptor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\catalog\\index_catalog.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\catalog\\index_catalog_entry.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\catalog\\disable_index_spec_namespace_generation_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\encrypted_dbclient_base.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\fle_shell_options_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\shell_options_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\shell_options_storage.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\kms.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\kms_aws.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\kms_local.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\kms_gen.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_kms_message.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\hexlify.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_b64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_decrypt_request.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_encrypt_request.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_kv_list.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_message.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_request.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_request_opt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_request_str.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_response.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_response_parser.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\sort.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\kms-message\\src\\kms_crypto_windows.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\base.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\bindata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\bson.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\code.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\countdownlatch.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\cursor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\cursor_handle.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\db.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\dbcollection.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\dbpointer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\dbquery.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\dbref.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\engine.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\error.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\exception.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\global.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\idwrapper.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\implscope.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\internedstring.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\jscustomallocator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\jsstringwrapper.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\jsthread.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\maxkey.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\minkey.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\mongo.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\mongohelpers.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\mongohelpers_js.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\nativefunction.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\numberdecimal.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\numberint.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\numberlong.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\object.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\objectwrapper.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\oid.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\PosixNSPR.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\proxyscope.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\regexp.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\session.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\status.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\timestamp.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\uri.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\valuereader.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\valuewriter.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\engine_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\mozjs\\scripting_util_gen.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_mozjs.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\mongo_sources\\mongoErrorReportToString.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\mongo_sources\\freeOpToJSContext.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\builtin\\RegExp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\frontend\\Parser.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\gc\\StoreBuffer.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\jsarray.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\jsmath.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\mfbt\\Unified_cpp_mfbt0.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\perf\\pm_stub.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\util\\DoubleToString.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\vm\\Interpreter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\vm\\JSAtom.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mfbt\\Compression.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mfbt\\double-conversion\\double-conversion\\strtod.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mfbt\\lz4.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\Printf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\TimeStamp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\StackWalk.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\ConditionVariable_windows.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\Mutex_windows.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\mozglue\\misc\\TimeStamp_windows.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_acos.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_acosh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_asin.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_atan2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_atanh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_cosh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_exp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_hypot.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_log.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_log10.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_log2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_pow.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_sinh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\e_sqrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\k_exp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_asinh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_atan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_cbrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_ceil.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_ceilf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_copysign.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_expm1.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_fabs.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_floor.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_floorf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_log1p.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_nearbyint.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_rint.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_rintf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_scalbn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_tanh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_trunc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\modules\\fdlibm\\s_truncf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\extract\\js\\src\\jit\\x86-shared\\Disassembler-x86-shared.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src0.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src1.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src10.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src11.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src12.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src13.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src14.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src15.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src16.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src17.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src18.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src19.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src20.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src21.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src22.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src23.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src24.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src25.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src26.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src27.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src28.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src29.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src3.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src30.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src31.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src33.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src34.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src35.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src36.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src37.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src38.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src39.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src4.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src40.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src41.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src42.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src43.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src44.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src5.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src6.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src7.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\mozjs-60\\platform\\x86_64\\windows\\build\\Unified_cpp_js_src9.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\deadline_monitor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\deadline_monitor_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\dbdirectclient_factory.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\engine.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\jsexception.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\utils.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\mongo.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\scripting\\bson_template_evaluator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\crypto\\aead_encryption.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_algo.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_array.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_expr.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_geo.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_internal_expr_eq.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_leaf.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_text_base.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_text_noop.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_tree.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_where_base.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_where_noop.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\expression_with_placeholder.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\extensions_callback.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\extensions_callback_noop.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\match_details.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\matchable.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\matcher.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\matcher_type_set.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\rewrite_expr.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\encrypt_schema_types.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_all_elem_match_from_index.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_allowed_properties.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_cond.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_eq.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_fmod.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_match_array_index.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_num_array_items.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_num_properties.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_object_match.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_root_doc_eq.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_str_length.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_unique_items.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\expression_internal_schema_xor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\json_pointer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\json_schema_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\schema\\encrypt_schema_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\query_knobs_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\expression.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\expression_trigonometric.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\summation.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\regex_util.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\expression_context.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\variables.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\collation\\collator_factory_interface.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\collation\\collation_index_key.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\collation\\collation_spec.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\collation\\collator_interface.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\aggregation_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\explain_options.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document_source_change_stream_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document_source_list_sessions_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document_source_merge_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document_source_merge_modes_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document_source_replace_root_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\exchange_spec_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\value_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document_source_merge_spec.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\resume_token.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\storage\\key_string.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\dependencies.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document_comparator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\document_path_support.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\value.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\value_comparator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\intrusive_counter.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\datetime\\date_time_support.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_timelib.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\astro.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\dow.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\interval.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\parse_date.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\parse_iso_intervals.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\parse_tz.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\parse_zoneinfo.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\timelib.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\tm2unixtime.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\timelib-2018.01\\unixtime2tm.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\field_path.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\path.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\matcher\\path_internal.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\geo\\geoparser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\geo\\geometry_container.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\geo\\hash.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\geo\\shapes.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\geo\\big_polygon.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\geo\\r2_region_coverer.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s1angle.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2cellid.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2latlng.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s1interval.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2cap.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2cell.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2cellunion.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2edgeindex.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2edgeutil.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2latlngrect.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2loop.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2pointregion.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2polygon.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2polygonbuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2polyline.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2r2rect.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2region.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2regioncoverer.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2regionintersection.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\s2regionunion.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\util\\math\\mathutil.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\util\\coding\\coder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\util\\coding\\varint.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\strings\\split.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\strings\\stringprintf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\strings\\strutil.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\base\\int128.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\base\\logging.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\base\\stringprintf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\s2\\base\\strtoint.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\fts\\fts_query_noop.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\crypto\\symmetric_crypto.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\crypto\\symmetric_crypto_windows.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\crypto\\symmetric_key.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\views\\resolved_view.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\storage\\duplicate_key_error_info.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\connection_string_connect.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\mongo_uri_connect.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\connpool.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\dbclient_connection.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\dbclient_rs.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\global_conn_pool.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\global_conn_pool_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\replica_set_change_notifier.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\replica_set_monitor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\replica_set_monitor_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\thread_pool_task_executor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\network_interface_thread_pool.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\network_interface_factory.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\connection_pool_tl.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\network_interface_tl.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\transport_layer_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\service_executor_adaptive.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\service_executor_reserved.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\service_executor_synchronous.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\service_executor_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\transport_layer_asio.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\system_error.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\async_client.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\message_compressor_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\message_compressor_metrics.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\message_compressor_registry.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\message_compressor_snappy.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\message_compressor_zlib.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\message_compressor_zstd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_zstd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\entropy_common.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\fse_decompress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\threading.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\pool.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\zstd_common.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\error_private.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\common\\xxhash.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\hist.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\fse_compress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\huf_compress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_compress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstdmt_compress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_fast.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_double_fast.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_lazy.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_opt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\compress\\zstd_ldm.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\decompress\\huf_decompress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\decompress\\zstd_decompress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\cover.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\fastcover.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\divsufsort.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\dictBuilder\\zdict.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\deprecated\\zbuff_common.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\deprecated\\zbuff_compress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zstandard-1.3.7\\zstd\\lib\\deprecated\\zbuff_decompress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_zlib.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\adler32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\crc32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\compress.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\deflate.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\infback.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\inffast.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\inflate.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\inftrees.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\trees.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\uncompr.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\zlib-1.2.11\\zutil.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_snappy.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\snappy-1.1.7\\snappy-c.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\snappy-1.1.7\\snappy.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\snappy-1.1.7\\snappy-sinksource.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\network_interface.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\task_executor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\connection_pool.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\egress_tag_closer_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\connection_pool_stats.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\dbclient_base.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\dbclient_cursor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\index_spec.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\private\\ssl_expiration.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_parameters.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_manager_windows.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_stream.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_parameters_gen.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_asio.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\asio-master\\asio\\src\\asio.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_types.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\ssl_options.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\private\\socket_poll.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\sock.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\background.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\commands\\server_status.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\stats\\counters.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\commands.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\audit.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\count_command_as_aggregation_command.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\count_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\cursor_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\cursor_response.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\find_and_modify_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\getmore_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\killcursors_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\killcursors_response.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\view_response_formatter.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\count_command_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\factory.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\object_check.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\legacy_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\legacy_request_builder.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\legacy_reply.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\legacy_reply_builder.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\reply_builder_interface.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\object_check_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\mongo_version_range.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_changelog.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_chunk.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_collection.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_config_version.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_database.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_lockpings.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_locks.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_mongos.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_shard_collection.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_shard_database.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_shard.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_tags.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\add_shard_request_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\add_shard_to_zone_request_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\balance_chunk_request_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\commit_chunk_migration_request_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\merge_chunk_request_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\migration_secondary_throttle_options.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\move_chunk_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\remove_shard_from_zone_request_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\set_shard_version_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\split_chunk_request_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\update_zone_key_range_request_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\cannot_implicitly_create_collection_info.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\chunk_version.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\database_version_helpers.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\shard_id.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\stale_exception.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\would_change_owning_shard_exception.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\type_chunk_base_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\chunk_version_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\database_version_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\clone_catalog_data_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\clear_jumbo_flag_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\create_collection_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\create_database_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\flush_database_cache_updates_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\flush_routing_table_cache_updates_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\get_database_version_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\move_primary_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\shard_collection_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\clone_collection_options_from_primary_shard_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\request_types\\wait_for_fail_point_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\message.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\op_msg.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\protocol.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\wiredtiger\\src\\checksum\\software\\checksum.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\wiredtiger\\src\\checksum\\x86\\crc32-x86.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\wiredtiger\\src\\checksum\\x86\\crc32-x86-alt.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\wire_version.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\bson\\dotted_path_support.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\query_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\tailable_mode.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\tailable_mode_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\read_concern_args.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\catalog\\collection_catalog.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\catalog\\collection.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\ops\\write_ops_parsers.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\ops\\write_ops_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\hint_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\query\\hint_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\pipeline\\runtime_constants_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\dbmessage.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\connection_string.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\mongo_uri.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\dns_query.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\query.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\authenticate.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\native_sasl_client_session.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\sasl_client_authenticate.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\sasl_client_authenticate_impl.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\sasl_client_conversation.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\sasl_client_session.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\sasl_plain_client_conversation.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\sasl_scram_client_conversation.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\md5.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\password_digest.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\icu.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\icu_init.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_icu.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\affixpatternparser.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\alphaindex.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\anytrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\astro.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\basictz.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\bocsu.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\brktrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\buddhcal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\calendar.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\casetrn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\cecal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\chnsecal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\choicfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\coleitr.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\coll.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collation.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationbuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationcompare.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationdata.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationdatabuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationdatareader.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationdatawriter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationfastlatin.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationfastlatinbuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationfcd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationiterator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationkeys.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationroot.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationrootelements.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationruleparser.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationsets.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationsettings.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationtailoring.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\collationweights.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\compactdecimalformat.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\coptccal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\cpdtrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csdetect.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csmatch.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csr2022.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csrecog.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csrmbcs.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csrsbcs.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csrucode.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\csrutf8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\curramt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\currfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\currpinf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\currunit.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dangical.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\datefmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dayperiodrules.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dcfmtsym.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decContext.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decNumber.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decfmtst.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decimalformatpattern.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decimfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\decimfmtimpl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitaffix.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitaffixesandpadding.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitformatter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitgrouping.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitinterval.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\digitlst.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dtfmtsym.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dtitvfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dtitvinf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dtptngen.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\dtrule.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\esctrn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ethpccal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\fmtable.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\fmtable_cnv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\format.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\fphdlimp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\fpositer.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\funcrepl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\gender.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\gregocal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\gregoimp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\hebrwcal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\identifier_info.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\indiancal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\inputext.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\islamcal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\japancal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\measfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\measunit.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\measure.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\msgfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\name2uni.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\nfrs.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\nfrule.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\nfsubs.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\nortrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\nultrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\numfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\numsys.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\olsontz.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\persncal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\pluralaffix.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\plurfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\plurrule.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\precision.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\quant.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\quantityformatter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbnf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbt_data.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbt_pars.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbt_rule.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbt_set.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rbtz.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\regexcmp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\regeximp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\regexst.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\regextxt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\region.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\reldatefmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\reldtfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rematch.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\remtrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\repattrn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\rulebasedcollator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\scientificnumberformatter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\scriptset.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\search.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\selfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\sharedbreakiterator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\simpletz.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\smallintformatter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\smpdtfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\smpdtfst.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\sortkey.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\standardplural.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\strmatch.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\strrepl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\stsearch.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\taiwncal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\timezone.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\titletrn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tmunit.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tmutamt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tmutfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tolowtrn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\toupptrn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\translit.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\transreg.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tridpars.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tzfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tzgnames.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tznames.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tznames_impl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tzrule.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\tztrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucln_in.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucol.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucol_res.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucol_sit.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucoleitr.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ucsdet.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\udat.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\udateintervalformat.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\udatpg.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ufieldpositer.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uitercollationiterator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ulocdata.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\umsg.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\unesctrn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uni2name.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\unum.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\unumsys.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\upluralrules.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uregex.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uregexc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uregion.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\usearch.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uspoof.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_build.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_conf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_impl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\uspoof_wsconf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\utf16collationiterator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\utf8collationiterator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\utmscale.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\utrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\valueformatter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\visibledigits.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\vtzone.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\vzone.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\windtfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\winnmfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\wintzimpl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\zonemeta.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\zrule.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\i18n\\ztrans.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\appendable.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\bmpset.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\brkeng.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\brkiter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\bytestream.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\bytestrie.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\bytestriebuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\bytestrieiterator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\caniter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\chariter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\charstr.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\cmemory.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\cstr.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\cstring.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\cwchar.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\dictbe.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\dictionarydata.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\dtintrv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\errorcode.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\filteredbrk.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\filterednormalizer2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\icudataver.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\icuplug.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\listformatter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\loadednormalizer2impl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\locavailable.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\locbased.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\locdispnames.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\locdspnm.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\locid.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\loclikely.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\locmap.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\locresdata.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\locutil.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\messagepattern.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\normalizer2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\normalizer2impl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\normlzr.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\parsepos.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\patternprops.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\pluralmap.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\propname.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\propsvec.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\punycode.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\putil.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbi.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbidata.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbinode.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbirb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbiscan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbisetb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbistbl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\rbbitblb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\resbund.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\resbund_cnv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\resource.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ruleiter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\schriter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\serv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\servlk.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\servlkf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\servls.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\servnotf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\servrbf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\servslkf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\sharedobject.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\simpleformatter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\stringpiece.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\stringtriebuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uarrsort.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ubidi.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ubidi_props.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ubidiln.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ubidiwrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ubrk.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucase.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucasemap.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucasemap_titlecase_brkiter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucat.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uchar.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucharstrie.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucharstriebuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucharstrieiterator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uchriter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucln_cmn.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucmndata.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv2022.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_bld.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_cb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_cnv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_ct.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_err.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_ext.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_io.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_lmb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_set.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_u16.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_u32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_u7.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnv_u8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvbocu.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvdisp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvhz.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvisci.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvlat1.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvmbcs.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvscsu.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucnvsel.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucol_swp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ucurr.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\udata.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\udatamem.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\udataswp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uenum.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uhash.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uhash_us.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uidna.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uinit.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uinvchar.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uiter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ulist.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ulistformatter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uloc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uloc_keytype.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uloc_tag.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\umapfile.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\umath.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\umutex.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unames.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unifiedcache.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unifilt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unifunct.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uniset.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uniset_closure.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uniset_props.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unisetspan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr_case.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr_case_locale.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr_cnv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr_props.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unistr_titlecase_brkiter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unorm.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\unormcmp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uobject.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uprops.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ures_cnv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uresbund.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uresdata.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\usc_impl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uscript.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uscript_props.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uset.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uset_props.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\usetiter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ushape.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\usprep.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustack.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustr_cnv.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustr_titlecase_brkiter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustr_wcs.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustrcase.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustrcase_locale.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustrenum.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustrfmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustring.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\ustrtrns.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\utext.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\utf_impl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\util.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\util_props.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\utrace.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\utrie.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\utrie2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\utrie2_builder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uts46.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\utypes.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uvector.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uvectr32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\uvectr64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\common\\wintz.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\icu4c-57.1\\source\\stubdata\\stubdata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\get_status_from_command_result.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\write_concern_error_detail.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\remote_command_request.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\executor\\remote_command_response.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\config_server_metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\egress_metadata_hook_list.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\logical_time_metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\sharding_metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\repl_set_metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\oplog_query_metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\tracking_metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\client_metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\client_metadata_ismaster.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\service_entry_point_utils.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\session.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\transport\\transport_layer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\is_mongos.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\logical_time_validator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\signed_logical_time.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\keys_collection_manager_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\keys_collection_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\keys_collection_cache.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\key_generator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_client_info.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\replication_coordinator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\replication_coordinator_noop.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\replication_consistency_markers.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\replication_process.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\storage_interface.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\rollback_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\namespace_string.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\bson_extract_optime.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\optime.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\keys_collection_client_sharded.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\s\\catalog\\sharding_catalog_client.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\logical_clock.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\logical_clock_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\global_settings.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_settings.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl\\repl_settings_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\keys_collection_document.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\time_proof_service.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\logical_time.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\operation_time_tracker.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\action_set.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\action_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\impersonation_session.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\privilege.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\privilege_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\resource_pattern.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\user_management_commands_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\impersonated_user_metadata.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\rpc\\metadata\\impersonated_user_metadata_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_options_helpers.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_options_helpers_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\cmdline_utils\\censor_cmdline.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\field_ref.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\field_ref_set.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\field_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\keypattern.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\write_concern_options.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\index_names.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\commands\\test_commands_enabled.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\commands\\test_commands_enabled_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\commands\\server_status_internal.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\commands\\server_status_metric.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\address_restriction.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\address_restriction_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\restriction_environment.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\mutable\\document.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\mutable\\element.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\safe_num.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\authorization_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\authorization_session.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\auth_decorations.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\user_name.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\auth\\role_name.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\client\\read_preference.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\baton.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\client.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\default_baton.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\operation_context.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\operation_context_group.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\service_context.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_recovery.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\unclean_shutdown.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\repl_set_member_in_standalone_mode.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\periodic_runner.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\background_thread_clock_source.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\clock_source.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\fast_clock_source_factory.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\storage\\write_unit_of_work.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\fail_point.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\fail_point_registry.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\fail_point_service.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\fail_point_server_parameter_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\storage\\storage_options.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\storage\\storage_parameters_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\multi_key_path_tracker.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\logical_session_id.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\logical_session_id_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\idl\\server_parameter.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\idl\\server_parameter_with_storage.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\constraints.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\environment.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\option_description.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\option_section.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\options_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\startup_option_init.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\startup_options.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\options_parser\\value.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_yaml.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\binary.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\contrib\\graphbuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\contrib\\graphbuilderadapter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\convert.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\directives.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\emit.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\emitfromevents.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\emitter.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\emitterstate.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\emitterutils.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\exceptions.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\exp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\memory.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\node.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\node_data.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\nodebuilder.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\nodeevents.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\null.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\ostream_wrapper.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\parse.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\parser.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\regex_yaml.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\scanner.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\scanscalar.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\scantag.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\scantoken.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\simplekey.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\singledocparser.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\stream.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\yaml-cpp-0.6.2\\src\\tag.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\cidr.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\hostandport.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\hostname_canonicalization.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\sockaddr.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\socket_exception.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\socket_utils.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\hostandport_gen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\winutil.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\concurrency\\spin_lock.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\net\\http_client_winhttp.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\idl\\idl_parser.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\command_generic_argument.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\crypto\\sha_block_windows.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\crypto\\sha1_block.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\crypto\\sha256_block.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\secure_compare_memory.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\secure_allocator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\secure_zero_memory.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\processinfo.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\processinfo_windows.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\db\\server_options.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\util\\bson_extract.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\data_range.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\data_range_cursor.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\data_type.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\data_type_string_data.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\data_type_terminated.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\error_codes.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\error_extra_info.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\global_initializer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\global_initializer_registerer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\init.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\initializer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\initializer_dependency_graph.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\make_string_vector.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\parse_number.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\shim.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\simple_string_data_comparator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\status.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\string_data.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\transaction_error.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\base\\validate_locale.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\bson_comparator_interface_base.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\bson_depth.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\bson_validate.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\bsonelement.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\bsonmisc.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\bsonobj.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\bsonobjbuilder.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\bsontypes.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\json.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\oid.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\simple_bsonelement_comparator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\simple_bsonobj_comparator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\bson\\timestamp.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\component_message_log_domain.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\console.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\log_component.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\log_component_settings.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\log_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\log_severity.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\logger.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\logstream_builder.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\message_event_utf8_encoder.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\message_log_domain.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\ramlog.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\redaction.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\rotatable_file_manager.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\logger\\rotatable_file_writer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\decimal128.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\mutex.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\posix_fadvise.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\process_id.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\random.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\shared_library.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\shared_library_windows.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\stack_locator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\stack_locator_windows.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\strcasestr.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\platform\\strnlen.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\allocator.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\assert_util.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\base64.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\boost_assert_impl.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\concurrency\\idle_thread_block.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\concurrency\\thread_name.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\duration.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\errno_util.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\exception_filter_win32.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\exit.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\file.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\hex.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\itoa.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\log.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\platform_init.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\shell_exec.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\signal_handlers_synchronous.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\stacktrace.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\stacktrace_windows.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\startup_test.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\str.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\system_clock_source.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\system_tick_source.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\text.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\time_support.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\timer.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\uuid.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\version.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_pcrecpp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_byte_order.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_compile.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_config.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_dfa_exec.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_exec.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_fullinfo.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_get.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_globals.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_maketables.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_newline.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_ord2utf8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_refcount.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_string_utils.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_study.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_tables.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_ucd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_valid_utf8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_version.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_xclass.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_chartables.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcrecpp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_scanner.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\pcre-8.42\\pcre_stringpiece.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_intel_decimal128.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_exception.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_four_over_pi.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_bessel.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_bid.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_cbrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_erf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_exp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_int.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_inv_hyper.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_inv_trig.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_lgamma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_log.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_mod.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_ops.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_ops_64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_pow.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_powi.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_sqrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\dpml_ux_trig.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\float128\\sqrt_tab_t.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_2_str_tables.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_acos.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_acosh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_add.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_asin.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_asinh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_atan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_atan2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_atanh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_cbrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_compare.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_cos.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_cosh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_div.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_erf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_erfc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_exp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_exp10.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_exp2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_expm1.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_fdimd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_fma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_fmod.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_frexp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_hypot.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_ldexp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_lgamma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_llrintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log10.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log1p.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_log2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_logb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_logbd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_lrintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_lround.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_minmax.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_modf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_mul.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_nearbyintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_next.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_nexttowardd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_noncomp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_pow.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_quantexpd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_quantize.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_rem.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_round_integral.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_scalb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_scalbl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_sin.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_sinh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_sqrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_string.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_tan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_tanh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_tgamma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int16.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_int8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint16.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid128_to_uint8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_acos.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_acosh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_add.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_asin.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_asinh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_atan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_atan2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_atanh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_cbrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_compare.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_cos.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_cosh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_div.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_erf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_erfc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_exp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_exp10.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_exp2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_expm1.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_fdimd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_fma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_fmod.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_frexp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_hypot.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_ldexp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_lgamma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_llrintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log10.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log1p.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_log2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_logb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_logbd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_lrintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_lround.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_minmax.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_modf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_mul.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_nearbyintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_next.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_nexttowardd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_noncomp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_pow.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_quantexpd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_quantize.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_rem.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_round_integral.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_scalb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_scalbl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sin.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sinh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sqrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_string.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_sub.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_tan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_tanh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_tgamma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_bid128.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_bid64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int16.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_int8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint16.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid32_to_uint8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_acos.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_acosh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_add.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_asin.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_asinh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_atan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_atan2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_atanh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_cbrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_compare.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_cos.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_cosh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_div.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_erf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_erfc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_exp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_exp10.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_exp2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_expm1.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_fdimd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_fma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_fmod.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_frexp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_hypot.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_ldexp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_lgamma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_llrintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log10.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log1p.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_log2.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_logb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_logbd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_lrintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_lround.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_minmax.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_modf.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_mul.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_nearbyintd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_next.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_nexttowardd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_noncomp.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_pow.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_quantexpd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_quantize.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_rem.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_round_integral.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_scalb.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_scalbl.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_sin.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_sinh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_sqrt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_string.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_tan.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_tanh.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_tgamma.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_bid128.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int16.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_int8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint16.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid64_to_uint8.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_binarydecimal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_convert_data.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_decimal_data.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_decimal_globals.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_dpd.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_feclearexcept.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_fegetexceptflag.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_feraiseexcept.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_fesetexceptflag.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_fetestexcept.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_flag_operations.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_from_int.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\bid_round.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\strtod128.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\strtod32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\strtod64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\wcstod128.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\wcstod32.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\IntelRDFPMathLib20U1\\LIBRARY\\src\\wcstod64.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_fmt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\fmt\\dist\\src\\format.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\fmt\\dist\\src\\posix.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_boost.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\cmdline.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\config_file.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\convert.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\options_description.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\parsers.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\positional_options.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\split.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\utf8_codecvt_facet.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\value_semantic.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\variables_map.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\program_options\\src\\winmain.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\iostreams\\src\\file_descriptor.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\iostreams\\src\\mapped_file.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\codecvt_error_category.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\operations.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\path.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\path_traits.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\portability.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\unique_path.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\utf8_codecvt_facet.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\filesystem\\src\\windows_file_codecvt.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\boost-1.70.0\\libs\\system\\src\\error_code.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_abseil.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\hash\\internal\\city.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\hash\\internal\\hash.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\murmurhash3\\MurmurHash3.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\quick_exit.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\shim_allocator.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\dynamic_annotations.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\elf_mem_image.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\logging.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\spinlock.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\spinlock_internal.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\sysinfo.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\base\\vdso_support.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\central_freelist.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\common.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\internal_logging.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\malloc_extension.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\malloc_hook.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\memfs_malloc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\page_heap.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\sampler.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\span.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\stack_trace_table.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\stacktrace.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\static_vars.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\symbolize.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\thread_cache.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\tcmalloc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\windows\\port.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\windows\\system-alloc.obj\" \"E:\\robo-shell\\build\\opt\\third_party\\gperftools-2.7\\dist\\src\\fake_stacktrace_scope.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\debugger.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\util\\boost_assert_shim.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\dbshell.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\mongodbcr.obj\" \"E:\\robo-shell\\build\\opt\\mongo\\shell\\shell_options_init.obj\" Crypt32.lib Secur32.lib Dnsapi.lib winhttp.lib \"..\\third-party\\libssh2-1.9.0\\Release\\libssh2.lib\" \"E:\\openssl-1.1.1f\\libssl.lib\" \"E:\\openssl-1.1.1f\\libcrypto.lib\" ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib psapi.lib bcrypt.lib Iphlpapi.lib dbghelp.lib ws2_32.lib winmm.lib version.lib /MANIFEST /MANIFESTUAC:\"level='asInvoker' uiAccess='false'\" /manifest:embed /PDB:\"E:/robo/build/Release/src/robomongo/Release/robo3t.pdb\" /SUBSYSTEM:WINDOWS /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:\"E:/robo/build/Release/src/robomongo/Release/robo3t.lib\" /MACHINE:X64  /machine:x64 robomongo.dir\\Release\\winres.res\n  robomongo.dir\\Release\\main.obj\n  robomongo.dir\\Release\\QtUtils.obj\n  robomongo.dir\\Release\\StdUtils.obj\n  robomongo.dir\\Release\\Logger.obj\n  robomongo.dir\\Release\\HexUtils.obj\n  robomongo.dir\\Release\\BsonUtils.obj\n  robomongo.dir\\Release\\CredentialSettings.obj\n  robomongo.dir\\Release\\ConnectionSettings.obj\n  robomongo.dir\\Release\\Event.obj\n  robomongo.dir\\Release\\Enums.obj\n  robomongo.dir\\Release\\EventError.obj\n  robomongo.dir\\Release\\EventBusSubscriber.obj\n  robomongo.dir\\Release\\EventBusDispatcher.obj\n  robomongo.dir\\Release\\EventWrapper.obj\n  robomongo.dir\\Release\\EventBus.obj\n  robomongo.dir\\Release\\KeyboardManager.obj\n  robomongo.dir\\Release\\MongoNamespace.obj\n  robomongo.dir\\Release\\MongoFunction.obj\n  robomongo.dir\\Release\\MongoUtils.obj\n  robomongo.dir\\Release\\MongoCollection.obj\n  robomongo.dir\\Release\\MongoCollectionInfo.obj\n  robomongo.dir\\Release\\MongoQueryInfo.obj\n  robomongo.dir\\Release\\CursorPosition.obj\n  robomongo.dir\\Release\\ScriptInfo.obj\n  robomongo.dir\\Release\\MongoEventsInfo.obj\n  robomongo.dir\\Release\\ptimeutil.obj\n  robomongo.dir\\Release\\json.obj\n  robomongo.dir\\Release\\ScriptEngine.obj\n  robomongo.dir\\Release\\MongoEvents.obj\n  robomongo.dir\\Release\\MongoDocument.obj\n  robomongo.dir\\Release\\AppStyle.obj\n  robomongo.dir\\Release\\MongoServer.obj\n  robomongo.dir\\Release\\MongoShell.obj\n  robomongo.dir\\Release\\MongoDatabase.obj\n  robomongo.dir\\Release\\App.obj\n  robomongo.dir\\Release\\MongoClient.obj\n  robomongo.dir\\Release\\MongoWorker.obj\n  robomongo.dir\\Release\\ReplicaSet.obj\n  robomongo.dir\\Release\\SettingsManager.obj\n  robomongo.dir\\Release\\AppRegistry.obj\n  robomongo.dir\\Release\\StringOperations.obj\n  robomongo.dir\\Release\\common.obj\n  robomongo.dir\\Release\\SimpleCrypt.obj\n  robomongo.dir\\Release\\RoboCrypt.obj\n  robomongo.dir\\Release\\GuiRegistry.obj\n  robomongo.dir\\Release\\AboutDialog.obj\n  robomongo.dir\\Release\\EulaDialog.obj\n  robomongo.dir\\Release\\ConnectionAdvancedTab.obj\n  robomongo.dir\\Release\\ConnectionAuthTab.obj\n  robomongo.dir\\Release\\ConnectionBasicTab.obj\n  robomongo.dir\\Release\\ConnectionDiagnosticDialog.obj\n  robomongo.dir\\Release\\ConnectionDialog.obj\n  robomongo.dir\\Release\\CopyCollectionDialog.obj\n  robomongo.dir\\Release\\IndicatorLabel.obj\n  robomongo.dir\\Release\\CreateCollectionDialog.obj\n  robomongo.dir\\Release\\CreateDatabaseDialog.obj\n  robomongo.dir\\Release\\CreateUserDialog.obj\n  robomongo.dir\\Release\\ComboBoxUtils.obj\n  robomongo.dir\\Release\\DialogUtils.obj\n  robomongo.dir\\Release\\PreferencesDialog.obj\n  robomongo.dir\\Release\\ConnectionsDialog.obj\n  robomongo.dir\\Release\\ExportDialog.obj\n  robomongo.dir\\Release\\ChangeShellTimeoutDialog.obj\n  robomongo.dir\\Release\\PlainJavaScriptEditor.obj\n  robomongo.dir\\Release\\JSLexer.obj\n  robomongo.dir\\Release\\FindFrame.obj\n  robomongo.dir\\Release\\AddEditIndexDialog.obj\n  robomongo.dir\\Release\\ScriptWidget.obj\n  robomongo.dir\\Release\\ExplorerCollectionTreeItem.obj\n  robomongo.dir\\Release\\ExplorerCollectionIndexesDir.obj\n  robomongo.dir\\Release\\ExplorerCollectionIndexItem.obj\n  robomongo.dir\\Release\\ExplorerTreeItem.obj\n  robomongo.dir\\Release\\ExplorerReplicaSetFolderItem.obj\n  robomongo.dir\\Release\\ExplorerReplicaSetTreeItem.obj\n  robomongo.dir\\Release\\ExplorerDatabaseTreeItem.obj\n  robomongo.dir\\Release\\ExplorerDatabaseCategoryTreeItem.obj\n  robomongo.dir\\Release\\ExplorerUserTreeItem.obj\n  robomongo.dir\\Release\\ExplorerFunctionTreeItem.obj\n  robomongo.dir\\Release\\DocumentTextEditor.obj\n  robomongo.dir\\Release\\FunctionTextEditor.obj\n  robomongo.dir\\Release\\ExplorerServerTreeItem.obj\n  robomongo.dir\\Release\\ExplorerTreeWidget.obj\n  robomongo.dir\\Release\\ExplorerWidget.obj\n  robomongo.dir\\Release\\BsonTableModel.obj\n  robomongo.dir\\Release\\BsonTableView.obj\n  robomongo.dir\\Release\\BsonTreeItem.obj\n  robomongo.dir\\Release\\BsonTreeModel.obj\n  robomongo.dir\\Release\\BsonTreeView.obj\n  robomongo.dir\\Release\\Notifier.obj\n  robomongo.dir\\Release\\CollectionStatsTreeItem.obj\n  robomongo.dir\\Release\\CollectionStatsTreeWidget.obj\n  robomongo.dir\\Release\\JsonPrepareThread.obj\n  robomongo.dir\\Release\\OutputItemContentWidget.obj\n  robomongo.dir\\Release\\OutputItemHeaderWidget.obj\n  robomongo.dir\\Release\\OutputWidget.obj\n  robomongo.dir\\Release\\PagingWidget.obj\n  robomongo.dir\\Release\\ProgressBarPopup.obj\n  robomongo.dir\\Release\\QueryWidget.obj\n  robomongo.dir\\Release\\WorkAreaTabBar.obj\n  robomongo.dir\\Release\\WorkAreaTabWidget.obj\n  robomongo.dir\\Release\\WelcomeTab.obj\n  robomongo.dir\\Release\\LogWidget.obj\n  robomongo.dir\\Release\\MainWindow.obj\n  robomongo.dir\\Release\\SSHTunnelTab.obj\n  robomongo.dir\\Release\\SSLTab.obj\n  robomongo.dir\\Release\\SshSettings.obj\n  robomongo.dir\\Release\\SslSettings.obj\n  robomongo.dir\\Release\\ReplicaSetSettings.obj\n  robomongo.dir\\Release\\SshTunnelWorker.obj\n  robomongo.dir\\Release\\mocs_compilation.obj\n  robomongo.dir\\Release\\qrc_robo.obj\n  robomongo.dir\\Release\\qrc_gui.obj\n     Creating library E:/robo/build/Release/src/robomongo/Release/robo3t.lib and object E:/robo/build/Release/src/robomongo/Release/robo3t.exp\n  robomongo.vcxproj -> E:\\robo\\build\\Release\\src\\robomongo\\Release\\robo3t.exe\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(283): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(286): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(289): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(292): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(296): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(60): warning C26495: Variable 'QMatrix::_m22' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(70): warning C26495: Variable 'QMatrix::_m22' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::strongref' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qpalette.h(71): warning C26495: Variable 'QPalette::<anonymous-tag>::for_faster_swapping_dont_use' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qfontmetrics.h(149): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(822): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2309): warning C26495: Variable 'fmt::v5::system_error::error_code_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2964): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2965): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2966): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2967): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2968): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2969): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(246): warning C26495: Variable 'absl::AlphaNum::digits_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(247): warning C26495: Variable 'absl::AlphaNum::digits_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(387): warning C6001: Using uninitialized memory 'result'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\oid.h(89): warning C26495: Variable 'mongo::OID::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\oid.h(241): warning C26495: Variable 'mongo::OID::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(442): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(454): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(700): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonmisc.h(251): warning C26495: Variable 'mongo::BSONSizeTracker::_sizes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonobjbuilder.h(158): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\rpc\\op_msg.h(325): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\interruptible.h(139): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\interruptible.h(180): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\intrusive_counter.h(123): warning C26495: Variable 'mongo::RCString::_size' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\future_impl.h(716): warning C26495: Variable 'mongo::future_details::SharedStateHolder<void>::_inner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\db\\baton.h(118): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\db\\baton.h(123): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\platform\\process_id.h(68): warning C26495: Variable 'mongo::ProcessId::_npid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\concurrency\\spin_lock.h(51): warning C6031: Return value ignored: 'InitializeCriticalSectionAndSpinCount'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\db\\write_concern_options.h(60): warning C26495: Variable 'mongo::WriteConcernOptions::wTimeout' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\client\\dbclient_cursor.h(105): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongoshellresult.h(55): warning C26495: Variable 'Robomongo::MongoShellExecResult::_isCurrentServerValid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongoshellresult.h(70): warning C26495: Variable 'Robomongo::MongoShellExecResult::_isCurrentServerValid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongocollectioninfo.h(10): warning C26495: Variable 'Robomongo::MongoCollectionInfo::_count' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(918): warning C26495: Variable 'Robomongo::ExecuteQueryResponse::resultIndex' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(989): warning C26495: Variable 'Robomongo::ExecuteScriptResponse::empty' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1087): warning C26495: Variable 'Robomongo::DocumentListLoadedEvent::_resultIndex' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1111): warning C26495: Variable 'Robomongo::ScriptExecutedEvent::_empty' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1195): warning C26495: Variable 'Robomongo::EstablishSshConnectionResponse::localport' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\base\\encoded_value_storage.h(47): warning C26495: Variable 'mongo::EncodedValueStorage<mongo::QueryResult::Layout,mongo::QueryResult::ConstView,mongo::QueryResult::View>::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(205): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::future_details::FakeVoid>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\util\\decimal_counter.h(48): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(194): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::SourceLocationHolder>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(840): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\util\\builder.h(119): warning C26495: Variable 'mongo::StackAllocator::_buf' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(146): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::Timestamp>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(152): warning C26495: Variable 'boost::optional_detail::optional_base<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\detail\\optional_trivially_copyable_base.hpp(29): warning C26495: Variable 'boost::optional_detail::tc_optional_base<bool>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\detail\\optional_trivially_copyable_base.hpp(25): warning C26495: Variable 'boost::optional_detail::tc_optional_base<bool>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(162): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::UUID>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(140): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::UUID>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(904): warning C26495: Variable 'absl::container_internal::raw_hash_set<absl::container_internal::NodeHashSetPolicy<mongo::BSONObj>,mongo::HashImprover<mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::Hasher,mongo::BSONObj>,mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::EqualTo,std::allocator<mongo::BSONObj> >::ctrl_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(1563): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\base\\data_range.h(117): warning C26495: Variable 'mongo::ConstDataRange::_debug_offset' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\bson\\bsonobj.h(136): warning C26495: Variable 'mongo::BSONObj::_objdata' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\base\\status_with.h(133): warning C26495: Variable 'mongo::StatusWith<char>::_status' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\base\\data_range.h(112): warning C26495: Variable 'mongo::ConstDataRange::_debug_offset' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(856): warning C26495: Variable 'absl::container_internal::raw_hash_set<absl::container_internal::NodeHashSetPolicy<mongo::BSONObj>,mongo::HashImprover<mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::Hasher,mongo::BSONObj>,mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::EqualTo,std::allocator<mongo::BSONObj> >::ctrl_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\core.h(1277): warning C26495: Variable 'fmt::v5::basic_format_args<fmt::v5::basic_format_context<std::back_insert_iterator<fmt::v5::internal::basic_buffer<char> >,char> >::<anonymous-tag>::values_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1410): warning C6387: 'value' could be '0':  this does not adhere to the specification for the function 'std::char_traits<char>::length'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\core.h(345): warning C26495: Variable 'std::back_insert_iterator<fmt::v5::internal::basic_buffer<char> >::container' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1516): warning C26498: The function 'std::numeric_limits<int>::max' is constexpr, mark variable 'max_int' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2479): warning C26495: Variable 'fmt::v5::basic_writer<fmt::v5::back_insert_range<fmt::v5::internal::basic_buffer<char> > >::int_writer<unsigned __int64,fmt::v5::basic_format_specs<char> >::prefix' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(603): warning C26495: Variable 'fmt::v5::internal::counting_iterator<char>::blackhole_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(1668): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2599): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2599): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1122): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1126): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(144): warning C26495: Variable 'QStyleOptionFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(172): warning C26495: Variable 'QStyleOptionTabWidgetFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(196): warning C26495: Variable 'QStyleOptionTabBarBase::documentMode' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(227): warning C26495: Variable 'QStyleOptionHeader::selectedPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(286): warning C26495: Variable 'QStyleOptionTab::row' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(316): warning C26495: Variable 'QStyleOptionToolBar::positionOfLine' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(343): warning C26495: Variable 'QStyleOptionProgressBar::bottomToTop' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(373): warning C26495: Variable 'QStyleOptionMenuItem::menuItemType' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(392): warning C26495: Variable 'QStyleOptionDockWidget::movable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(443): warning C26495: Variable 'QStyleOptionViewItem::viewItemPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(473): warning C26495: Variable 'QStyleOptionToolBox::position' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(492): warning C26495: Variable 'QStyleOptionRubberBand::opaque' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(534): warning C26495: Variable 'QStyleOptionSlider::tickInterval' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(553): warning C26495: Variable 'QStyleOptionSpinBox::frame' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(580): warning C26495: Variable 'QStyleOptionToolButton::arrowType' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(602): warning C26495: Variable 'QStyleOptionComboBox::editable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(620): warning C26495: Variable 'QStyleOptionTitleBar::titleBarState' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(640): warning C26495: Variable 'QStyleOptionGroupBox::midLineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(654): warning C26495: Variable 'QStyleOptionSizeGrip::corner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(670): warning C26495: Variable 'QStyleOptionGraphicsItem::levelOfDetail' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2304): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(491): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(492): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(493): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(494): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(495): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(498): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(504): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(25): warning C28251: Inconsistent annotation for 'GetSystemTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(103).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(29): warning C28251: Inconsistent annotation for 'GetSystemTimeAsFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(111).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(33): warning C28251: Inconsistent annotation for 'SystemTimeToFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\timezoneapi.h(93).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(38): warning C28251: Inconsistent annotation for 'FileTimeToSystemTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\timezoneapi.h(83).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(45): warning C28251: Inconsistent annotation for 'FileTimeToLocalFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\fileapi.h(171).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(50): warning C28251: Inconsistent annotation for 'LocalFileTimeToFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\fileapi.h(963).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(58): warning C28251: Inconsistent annotation for 'GetTickCount': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(168).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(133): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(695): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(613): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\date_time\\date_formatting.hpp(89): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\date_time\\date_formatting.hpp(91): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\converter_lexical_streams.hpp(162): warning C26495: Variable 'boost::detail::lexical_istream_limited_src<char,std::char_traits<char>,0,39>::buffer' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\lcast_unsigned_converters.hpp(191): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\lcast_unsigned_converters.hpp(262): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\quuid.h(68): warning C26495: Variable 'QUuid::data4' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\function\\function_base.hpp(611): warning C26495: Variable 'boost::function_base::functor' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\eventbus.cpp(115): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qvector2d.h(60): warning C26495: Variable 'QVector2D::v' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongoutils.cpp(12): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongodatabase.h(131): warning C26495: Variable 'Robomongo::MongoDatabaseUsersLoadedEvent::_database' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongodatabase.h(151): warning C26495: Variable 'Robomongo::MongoDatabaseFunctionsLoadedEvent::_database' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongocollectioninfo.cpp(7): warning C26495: Variable 'Robomongo::MongoCollectionInfo::_count' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\mongoqueryinfo.cpp(31): warning C26495: Variable 'Robomongo::MongoQueryInfo::_batchSize' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(110): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(171): warning C6054: String 'sday' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(143): warning C6054: String 'smon' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(140): warning C6054: String 'gmt' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(223): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(269): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(390): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\platform\\strtoll.h(35): warning C28251: Inconsistent annotation for 'strtoll': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\ucrt\\stdlib.h(539).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\mongo\\platform\\strtoll.h(39): warning C28251: Inconsistent annotation for 'strtoull': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\ucrt\\stdlib.h(569).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(249): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(669): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(771): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(792): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(1099): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\assertions.h(59): warning C28251: Inconsistent annotation for 'TerminateProcess': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\processthreadsapi.h(143).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(1348): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\callargs.h(306): warning C6001: Using uninitialized memory 'args'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(636): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6470): warning C26495: Variable 'JS::FirstSubsumedFrame::cx' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6470): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6478): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\get_last_error.hpp(20): warning C28251: Inconsistent annotation for 'GetLastError': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\errhandlingapi.h(89).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(25): warning C28251: Inconsistent annotation for 'FormatMessageA': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(2408).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(36): warning C28251: Inconsistent annotation for 'FormatMessageW': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(2423).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(47): warning C28251: Inconsistent annotation for 'SetErrorMode': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\errhandlingapi.h(131).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\character_code_conversion.hpp(21): warning C28251: Inconsistent annotation for 'MultiByteToWideChar': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\stringapiset.h(126).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\character_code_conversion.hpp(30): warning C28251: Inconsistent annotation for 'WideCharToMultiByte': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\stringapiset.h(141).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(27): warning C28251: Inconsistent annotation for 'LocalAlloc': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1112).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(32): warning C28251: Inconsistent annotation for 'LocalReAlloc': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1122).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(37): warning C28251: Inconsistent annotation for 'LocalFree': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1200).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(211): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(211): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(216): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\engine\\scriptengine.cpp(230): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\bufferlist.h(101): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(262): warning C26495: Variable 'JS::Heap<JSObject *>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(254): warning C26495: Variable 'JS::Heap<JSObject *>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(969): warning C26495: Variable 'JS::Rooted<JSObject *>::stack' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(962): warning C26495: Variable 'JS::Rooted<JSObject *>::stack' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\vector.h(877): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\variant.h(568): warning C26495: Variable 'mozilla::Variant<char const *,mozilla::UniquePtr<char [0],JS::FreePolicy> >::rawData' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\vector.h(408): warning C26495: Variable 'mozilla::Vector<mozilla::BufferList<js::SystemAllocPolicy>::Segment,1,js::SystemAllocPolicy>::CRAndStorage<1,0>::mBytes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\mongodb\\mongoworker.cpp(55): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\mongodb\\mongoworker.cpp(56): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\mongodb\\mongoworker.cpp(1020): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonvalue.h(149): warning C26495: Variable 'QJsonValue::<anonymous-tag>::base' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonarray.h(62): warning C26495: Variable 'QJsonArray::d' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\settings\\settingsmanager.cpp(99): warning C26495: Variable 'Robomongo::SettingsManager::_autoExpand' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(570): warning C6011: Dereferencing NULL pointer 'x'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\aboutdialog.cpp(97): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonobject.h(64): warning C26495: Variable 'QJsonObject::d' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(39): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(44): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(126): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(127): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(128): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(30): warning C26495: Variable 'Robomongo::EulaDialog::_reply' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionauthtab.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionauthtab.cpp(58): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionauthtab.cpp(72): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(37): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(63): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(94): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(122): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(29): warning C26495: Variable 'Robomongo::ConnectionBasicTab::_discoverButton' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(339): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(339): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondiagnosticdialog.cpp(46): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondiagnosticdialog.cpp(57): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondialog.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondialog.cpp(35): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondialog.cpp(43): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\copycollectiondialog.cpp(51): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\copycollectiondialog.cpp(52): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\copycollectiondialog.cpp(85): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qsciscintilla.h(2078): warning C26495: Variable 'QsciScintilla::FindState::wrap' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(44): warning C26495: Variable 'Robomongo::CreateCollectionDialog::_cappedCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(66): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(68): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(74): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(83): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(87): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(300): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(328): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(363): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(394): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createdatabasedialog.cpp(41): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createdatabasedialog.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(53): warning C26495: Variable 'Robomongo::CreateUserDialog::_readOnlyCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(96): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(97): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(128): warning C26495: Variable 'Robomongo::CreateUserDialog::_userSourceComboBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(156): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(157): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\preferencesdialog.cpp(87): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\preferencesdialog.cpp(88): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(43): warning C26495: Variable 'Robomongo::ConnectionListWidgetItem::_connection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(107): warning C26495: Variable 'Robomongo::ConnectionsDialog::_selectedConnection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(196): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(164): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(163): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(156): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(155): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(126): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(123): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(120): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(117): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(78): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(76): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(128): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(141): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(184): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(191): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(192): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(222): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\changeshelltimeoutdialog.cpp(29): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\changeshelltimeoutdialog.cpp(30): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\editors\\plainjavascripteditor.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\editors\\findframe.cpp(61): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\editors\\findframe.cpp(62): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\editors\\findframe.cpp(60): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(33): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(75): warning C26495: Variable 'Robomongo::AddEditIndexDialog::_uniqueCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(104): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(103): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(188): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\scriptwidget.cpp(85): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\scriptwidget.cpp(312): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\scriptwidget.cpp(311): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\scriptwidget.cpp(310): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(53): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(62): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(65): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(59): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(56): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(45): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(48): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(50): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(70): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(73): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(76): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(78): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(85): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexesdir.cpp(20): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexesdir.cpp(29): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexesdir.cpp(26): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexesdir.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexitem.cpp(25): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexitem.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasetfolderitem.cpp(39): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasetfolderitem.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(61): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(73): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(64): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(70): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(58): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(59): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(62): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(65): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(68): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(71): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(74): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(77): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(36): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(39): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(52): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(55): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(58): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(68): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(71): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(74): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerusertreeitem.cpp(24): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerusertreeitem.cpp(27): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerfunctiontreeitem.cpp(25): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerfunctiontreeitem.cpp(28): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\documenttexteditor.cpp(79): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\documenttexteditor.cpp(65): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\documenttexteditor.cpp(78): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\documenttexteditor.cpp(57): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\functiontexteditor.cpp(54): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\functiontexteditor.cpp(53): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(60): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(63): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(57): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(54): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(51): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(48): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(45): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerwidget.cpp(35): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerwidget.cpp(34): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerwidget.cpp(170): warning C28182: Dereferencing NULL pointer. 'item' contains the same NULL value as 'collectionItem' did.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontablemodel.cpp(12): warning C26495: Variable 'Robomongo::BsonTableModelProxy::_root' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontableview.cpp(29): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeitem.h(19): warning C26495: Variable 'Robomongo::BsonItemFields::_type' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeview.cpp(26): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeview.cpp(30): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeview.cpp(34): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(140): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(137): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(134): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(131): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(128): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(125): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(122): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(119): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(116): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(113): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(320): warning C6001: Using uninitialized memory 'mainWindow'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(27): warning C26495: Variable 'Robomongo::OutputItemContentWidget::_collectionStats' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(57): warning C26495: Variable 'Robomongo::OutputItemContentWidget::_collectionStats' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(128): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(127): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(126): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(125): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(124): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(276): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(277): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(89): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(100): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(102): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(103): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(104): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(105): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(19): warning C26495: Variable 'Robomongo::OutputWidget::_prevResultsCount' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(84): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(85): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\pagingwidget.cpp(49): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\pagingwidget.cpp(50): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\pagingwidget.cpp(46): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\pagingwidget.cpp(47): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\querywidget.cpp(58): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\querywidget.cpp(69): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\querywidget.cpp(313): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(60): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(66): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(64): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(63): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(61): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(65): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(301): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(299): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(122): warning C26495: Variable 'Robomongo::WelcomeTab::_clearButton' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(212): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(217): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(222): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(231): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\logwidget.cpp(18): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\widgets\\logwidget.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(553): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(530): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(491): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(656): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(653): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(563): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(665): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(165): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(485): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(610): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(169): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(590): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(539): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(503): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(497): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(509): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(160): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(174): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(182): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(185): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(200): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(208): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(212): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(215): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(230): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(242): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(251): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(260): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(269): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(277): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(286): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(291): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(337): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(342): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(356): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(361): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(366): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(371): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(386): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(391): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(396): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(411): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(420): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(426): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(432): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(438): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(445): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(452): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(456): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(460): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(479): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(676): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(848): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(1304): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(1311): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(1357): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(1358): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(74): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(146): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(143): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(44): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(62): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(56): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(56): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(117): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(102): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(111): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(106): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(94): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(76): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(75): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\mongodb\\sshtunnelworker.cpp(25): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\ne:\\robo\\src\\robomongo\\core\\mongodb\\sshtunnelworker.cpp(26): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"robomongo.dir\\Release\\robomongo.tlog\\unsuccessfulbuild\".\n  Touching \"robomongo.dir\\Release\\robomongo.tlog\\robomongo.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\server.vcxproj\" (13) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"server.dir\\Release\\\".\n  Creating directory \"server.dir\\Release\\server.tlog\\\".\nInitializeBuildStatus:\n  Creating \"server.dir\\Release\\server.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/robomongo/ssh/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/robomongo/ssh/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /IE:\\robo\\build\\Release\\src /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /W3 /WX- /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo\"server.dir\\Release\\\\\" /Fd\"server.dir\\Release\\vc141.pdb\" /Gd /TC /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" E:\\robo\\src\\robomongo\\ssh\\server.c\n  server.c\nLink:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe /ERRORREPORT:QUEUE /OUT:\"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\Release\\server.exe\" /INCREMENTAL:NO /NOLOGO Release\\ssh.lib \"..\\..\\third-party\\libssh2-1.9.0\\Release\\libssh2.lib\" \"E:\\openssl-1.1.1f\\libssl.lib\" \"E:\\openssl-1.1.1f\\libcrypto.lib\" ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:\"level='asInvoker' uiAccess='false'\" /manifest:embed /PDB:\"E:/robo/build/Release/src/robomongo/ssh/Release/server.pdb\" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:\"E:/robo/build/Release/src/robomongo/ssh/Release/server.lib\" /MACHINE:X64  /machine:x64 server.dir\\Release\\server.obj\n  server.vcxproj -> E:\\robo\\build\\Release\\src\\robomongo\\ssh\\Release\\server.exe\nFinalizeBuildStatus:\n  Deleting file \"server.dir\\Release\\server.tlog\\unsuccessfulbuild\".\n  Touching \"server.dir\\Release\\server.tlog\\server.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\server.vcxproj\" (default targets).\nProject \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (1) is building \"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj\" (14) on node 1 (default targets).\nPrepareForBuild:\n  Creating directory \"ssh_test.dir\\Release\\\".\n  Creating directory \"ssh_test.dir\\Release\\ssh_test.tlog\\\".\nInitializeBuildStatus:\n  Creating \"ssh_test.dir\\Release\\ssh_test.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/src/robomongo/ssh/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/src/robomongo/ssh/CMakeFiles/generate.stamp is up-to-date.\nClCompile:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\CL.exe /c /IE:\\robo\\build\\Release\\src /IE:\\robo\\src /I\"E:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\include\" /I\"E:\\openssl-1.1.1f\\include\" /nologo /W3 /WX- /diagnostics:classic /MP /O2 /Ob2 /D CODE_ANALYSIS /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /D _WIN32 /D _CRT_SECURE_NO_WARNINGS /D BOOST_ALL_NO_LIB /D NDEBUG /D \"CMAKE_INTDIR=\\\"Release\\\"\" /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo\"ssh_test.dir\\Release\\\\\" /Fd\"ssh_test.dir\\Release\\vc141.pdb\" /Gd /TC /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /wd4068 /wd4351 /analyze /analyze:quiet /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\EspXEngine.dll\" /analyze:plugin\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\localespc.dll\" /FC /errorReport:queue  /analyze:ruleset\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Team Tools\\Static Analysis Tools\\Rule Sets\\NativeRecommendedRules.ruleset\" E:\\robo\\src\\robomongo\\ssh\\test.c\n  test.c\nLink:\n  C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe /ERRORREPORT:QUEUE /OUT:\"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\Release\\ssh_test.exe\" /INCREMENTAL:NO /NOLOGO Release\\ssh.lib \"..\\..\\third-party\\libssh2-1.9.0\\Release\\libssh2.lib\" \"E:\\openssl-1.1.1f\\libssl.lib\" \"E:\\openssl-1.1.1f\\libcrypto.lib\" ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:\"level='asInvoker' uiAccess='false'\" /manifest:embed /PDB:\"E:/robo/build/Release/src/robomongo/ssh/Release/ssh_test.pdb\" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:\"E:/robo/build/Release/src/robomongo/ssh/Release/ssh_test.lib\" /MACHINE:X64  /machine:x64 ssh_test.dir\\Release\\test.obj\n  ssh_test.vcxproj -> E:\\robo\\build\\Release\\src\\robomongo\\ssh\\Release\\ssh_test.exe\ne:\\robo\\src\\robomongo\\ssh\\test.c(134): warning C6011: Dereferencing NULL pointer 'elem2'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\test.c(137): warning C6011: Dereferencing NULL pointer 'elem5'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\test.c(133): warning C6011: Dereferencing NULL pointer 'elem1'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\test.c(135): warning C6011: Dereferencing NULL pointer 'elem3'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\ne:\\robo\\src\\robomongo\\ssh\\test.c(136): warning C6011: Dereferencing NULL pointer 'elem4'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\nFinalizeBuildStatus:\n  Deleting file \"ssh_test.dir\\Release\\ssh_test.tlog\\unsuccessfulbuild\".\n  Touching \"ssh_test.dir\\Release\\ssh_test.tlog\\ssh_test.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj\" (default targets).\nPrepareForBuild:\n  Creating directory \"x64\\Release\\ALL_BUILD\\\".\n  Creating directory \"x64\\Release\\ALL_BUILD\\ALL_BUILD.tlog\\\".\nInitializeBuildStatus:\n  Creating \"x64\\Release\\ALL_BUILD\\ALL_BUILD.tlog\\unsuccessfulbuild\" because \"AlwaysCreate\" was specified.\nCustomBuild:\n  Building Custom Rule E:/robo/CMakeLists.txt\n  CMake does not need to re-run because E:/robo/build/Release/CMakeFiles/generate.stamp is up-to-date.\nFinalizeBuildStatus:\n  Deleting file \"x64\\Release\\ALL_BUILD\\ALL_BUILD.tlog\\unsuccessfulbuild\".\n  Touching \"x64\\Release\\ALL_BUILD\\ALL_BUILD.tlog\\ALL_BUILD.lastbuildstate\".\nDone Building Project \"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default targets).\n\nBuild succeeded.\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj\" (default target) (3) ->\n(RunNativeCodeAnalysis target) -> \n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2258): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2254): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2252): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2250): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj\" (default target) (4) ->\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2258): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2254): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2252): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googlemock\\include\\gmock\\gmock-matchers.h(2250): warning C26495: Variable 'testing::internal::FloatingEq2Matcher<double>::nan_eq_nan_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gmock_main.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj\" (default target) (5) ->\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(610): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(620): warning C26495: Variable 'testing::ScopedFakeTestPartResultReporter::old_reporter_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(2544): warning C26495: Variable 'testing::TestInfo::is_in_another_shard_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(4647): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5449): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest.cc(5453): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-internal-inl.h(467): warning C26495: Variable 'testing::internal::TraceInfo::file' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(568): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'SetThreadPriority'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(570): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'ResumeThread'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(571): warning C6387: 'watcher_thread' could be '0':  this does not adhere to the specification for the function 'CloseHandle'. See line 568 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(922): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'memcpy'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(917): warning C6011: Dereferencing NULL pointer 'regex'. See line 910 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(918): warning C6011: Dereferencing NULL pointer 'buffer'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(910): warning C6387: 'regex' could be '0':  this does not adhere to the specification for the function 'strlen'.  [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1038): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\src\\gtest-port.cc(1050): warning C6031: Return value ignored: 'dup2'. [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ThreadLocalValueHolderBase>::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj\" (default target) (6) ->\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1245): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1248): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1256): warning C26495: Variable 'testing::internal::RE::pattern_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-port.h(1804): warning C26495: Variable 'testing::internal::Mutex::critical_section_init_phase_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(157): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n  e:\\robo\\src\\third-party\\googletest-1.8.1\\googletest\\include\\gtest\\internal\\gtest-linked_ptr.h(152): warning C26495: Variable 'testing::internal::linked_ptr<testing::internal::ParamGeneratorInterface<bool> const >::value_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\googletest-1.8.1\\googlemock\\gtest\\gtest_main.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj\" (default target) (7) ->\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1913): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1914): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1950): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\openssl.c(1950): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(277): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(277): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(300): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\agent.c(300): warning C6276: Cast between semantically different string types:  char * to wchar_t *.  Use of invalid string can lead to undefined behavior. [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\bcrypt_pbkdf.c(119): warning C6260: sizeof * sizeof is usually wrong.  Did you intend to use a character count or a byte count? [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(150): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(555): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(814): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(814): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(947): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(947): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\channel.c(1843): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(166): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(400): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(596): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(605): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(648): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(657): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(698): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(726): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(857): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1090): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1289): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1297): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1339): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1347): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1387): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(1414): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2202): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2326): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2334): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2376): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2384): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2424): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2451): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2835): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2935): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2943): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2985): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(2993): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(3033): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(3060): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(4269): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\kex.c(4274): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\misc.c(282): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(155): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(169): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(311): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(322): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(785): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(830): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\packet.c(582): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\pem.c(150): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\pem.c(535): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\publickey.c(959): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(176): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(1142): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\session.c(1142): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(876): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3241): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3241): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3346): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3448): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3448): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3586): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\sftp.c(3586): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(370): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(457): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(487): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\transport.c(488): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(79): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(231): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(373): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(373): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1168): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1283): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1665): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1663): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1662): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1662): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1661): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1661): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1659): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n  e:\\robo\\src\\third-party\\libssh2-1.9.0\\sources\\src\\userauth.c(1990): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\libssh2-1.9.0\\libssh2.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj\" (default target) (8) ->\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::strongref' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\parser.cpp(33): warning C26495: Variable 'QJson::ParserPrivate::m_errorLine' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\qobjecthelper.h(130): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(3799): warning C26495: Variable 'yyFlexLexer::yy_full_state' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\flexlexer.h(99): warning C26495: Variable 'FlexLexer::yy_flex_debug' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4008): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4010): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4010): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4089): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4223): warning C6011: Dereferencing NULL pointer 'yy_buffer_stack'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4256): warning C6011: Dereferencing NULL pointer 'b'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4314): warning C6011: Dereferencing NULL pointer 'b'. See line 4302 for an earlier location where this can occur [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\build\\release\\src\\third-party\\qjson-0.8.1\\json_scanner.cc(4370): warning C6011: Dereferencing NULL pointer 'yy_buffer_stack'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\robo\\src\\third-party\\qjson-0.8.1\\sources\\src\\json_scanner.cpp(35): warning C26495: Variable 'JSonScanner::m_yylval' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(491): warning C6011: Dereferencing NULL pointer 'd'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(570): warning C6011: Dereferencing NULL pointer 'x'.  [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(535): warning C26498: The function 'qMetaTypeId<QMap<QString,QVariant> * __ptr64>' is constexpr, mark variable 'type' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qjson-0.8.1\\qjson.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj\" (default target) (9) ->\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qvector2d.h(60): warning C26495: Variable 'QVector2D::v' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::strongref' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(283): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(286): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(289): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(292): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(296): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(60): warning C26495: Variable 'QMatrix::_m21' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(70): warning C26495: Variable 'QMatrix::_m21' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qpalette.h(71): warning C26495: Variable 'QPalette::<anonymous-tag>::for_faster_swapping_dont_use' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qfontmetrics.h(149): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qsciscintilla.h(2078): warning C26495: Variable 'QsciScintilla::FindState::wrap' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\lexaccessor.h(56): warning C26495: Variable 'LexAccessor::buf' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\stylecontext.h(140): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(64): warning C6386: Buffer overrun while writing to 'keywords':  the writable size is '(words+1)*8' bytes, but '24' bytes might be written. [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(47): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\wordlist.cpp(69): warning C26495: Variable 'WordList::starts' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscilexer.h(341): warning C26495: Variable 'QsciLexer::StyleDataMap::style_data_set' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscilexer.h(336): warning C26495: Variable 'QsciLexer::StyleData::eol_fill' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscistyle.cpp(34): warning C26495: Variable 'QsciStyle::style_changeable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscistyle.cpp(48): warning C26495: Variable 'QsciStyle::style_changeable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\include\\platform.h(175): warning C26495: Variable 'ColourDesired::co' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\partitioning.h(91): warning C26495: Variable 'Partitioning::stepLength' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.h(122): warning C26495: Variable 'HighlightDelimiter::endFoldBlock' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(67): warning C26495: Variable 'SplitVector<int>::body' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(35): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\splitvector.h(40): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvarlengtharray.h(263): warning C26495: Variable 'QVarLengthArray<char,1024>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(144): warning C26495: Variable 'QStyleOptionFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(172): warning C26495: Variable 'QStyleOptionTabWidgetFrame::midLineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(196): warning C26495: Variable 'QStyleOptionTabBarBase::documentMode' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(227): warning C26495: Variable 'QStyleOptionHeader::section' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(286): warning C26495: Variable 'QStyleOptionTab::row' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(316): warning C26495: Variable 'QStyleOptionToolBar::positionOfLine' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(343): warning C26495: Variable 'QStyleOptionProgressBar::textVisible' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(373): warning C26495: Variable 'QStyleOptionMenuItem::tabWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(392): warning C26495: Variable 'QStyleOptionDockWidget::closable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(443): warning C26495: Variable 'QStyleOptionViewItem::decorationPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(473): warning C26495: Variable 'QStyleOptionToolBox::position' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(492): warning C26495: Variable 'QStyleOptionRubberBand::opaque' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(534): warning C26495: Variable 'QStyleOptionSlider::sliderValue' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(553): warning C26495: Variable 'QStyleOptionSpinBox::buttonSymbols' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(580): warning C26495: Variable 'QStyleOptionToolButton::arrowType' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(602): warning C26495: Variable 'QStyleOptionComboBox::editable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(620): warning C26495: Variable 'QStyleOptionTitleBar::titleBarState' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(640): warning C26495: Variable 'QStyleOptionGroupBox::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(654): warning C26495: Variable 'QStyleOptionSizeGrip::corner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(670): warning C26495: Variable 'QStyleOptionGraphicsItem::levelOfDetail' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(114): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(363): warning C6281: Incorrect order of operations:  relational operators have higher precedence than bitwise operators. [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\scintillaqt.cpp(365): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2304): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscidocument.cpp(59): warning C26495: Variable 'QsciDocument::pdoc' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(74): warning C26495: Variable 'QsciScintilla::ctPos' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(86): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(89): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(91): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(95): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(97): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(99): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(101): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(103): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(105): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(107): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(109): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(111): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(719): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(975): warning C6385: Reading invalid data from 'text':  the readable size is '((epos-spos+1))*2*1' bytes, but '3' bytes may be read. [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2258): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2258): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(2292): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3239): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3233): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3231): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3235): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3237): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3951): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(3958): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(4037): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintilla.cpp(4123): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(102): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(99): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsciscintillabase.cpp(140): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(93): warning C26495: Variable 'QsciSciPopup::sci' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(96): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\sciclasses.cpp(152): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(570): warning C6011: Dereferencing NULL pointer 'x'.  [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(414): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(414): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(438): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(438): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(445): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(445): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(456): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(456): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(470): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(471): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(539): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(540): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(666): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(666): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(952): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(955): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\platqt.cpp(957): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qscimacro.h(99): warning C26495: Variable 'QsciMacro::Macro::msg' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qscimacro.cpp(255): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(92): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::dummy' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(135): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::dummy' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(144): warning C26495: Variable 'QVersionNumber::SegmentStorage::<anonymous-tag>::dummy' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qversionnumber.h(202): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(370): warning C6011: Dereferencing NULL pointer 'd'.  [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexers\\lexcpp.cpp(199): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(40): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::pi' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(34): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::pi' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\lexlib\\optionset.h(31): warning C26495: Variable 'OptionSet<OptionsCPP>::Option::<anonymous-tag>::pi' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(136): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(137): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(141): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(141): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(143): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(143): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(173): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(174): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\autocomplete.cpp(247): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\casefolder.cpp(22): warning C26495: Variable 'CaseFolderTable::mapping' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\charclassify.cpp(22): warning C26495: Variable 'CharClassify::charClass' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.cpp(1575): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\document.cpp(1663): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(1763): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(2567): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(2568): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(3259): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(3260): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7204): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(8549): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(8549): warning C26451: Arithmetic overflow: Using operator '<<' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '<<' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7997): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7988): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7988): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7668): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7668): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7560): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7487): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\editor.cpp(7393): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\linemarker.cpp(116): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\linemarker.cpp(117): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(87): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(88): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(89): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(92): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(92): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(234): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(524): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(524): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\positioncache.cpp(620): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\research.cpp(256): warning C26495: Variable 'RESearch::bol' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\research.cpp(287): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\scintillabase.cpp(740): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\scintillabase.cpp(740): warning C26451: Arithmetic overflow: Using operator '<<' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '<<' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\style.cpp(60): warning C26495: Variable 'FontMeasurements::sizeZoomed' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\style.cpp(72): warning C26495: Variable 'Style::hotspot' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\viewstyle.cpp(87): warning C26495: Variable 'ViewStyle::nextExtendedStyle' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\viewstyle.cpp(91): warning C26495: Variable 'ViewStyle::largestMarkerHeight' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\src\\xpm.cpp(59): warning C26495: Variable 'RGBAImage::scale' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\third-party\\qscintilla-2.8.4\\qscintilla.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj\" (default target) (10) ->\n\"E:\\robo\\build\\Release\\src\\robomongo\\robomongo_autogen.vcxproj\" (default target) (11) ->\n\"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj\" (default target) (12) ->\n  e:\\robo\\src\\robomongo\\ssh\\ssh.c(585): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\array.c(44): warning C6386: Buffer overrun while writing to 'newarray':  the writable size is 'newsize*sizeof(void *)' bytes, but '8' bytes might be written. [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C6386: Buffer overrun while writing to 'newarray+i':  the writable size is 'newsize*sizeof(void *)' bytes, but '8' bytes might be written. [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\array.c(47): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj\" (default target) (10) ->\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qglobal.h(591): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(283): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(286): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(289): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(292): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qcolor.h(296): warning C26495: Variable 'QColor::ct' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(60): warning C26495: Variable 'QMatrix::_m22' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qmatrix.h(70): warning C26495: Variable 'QMatrix::_m22' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qsharedpointer_impl.h(154): warning C26495: Variable 'QtSharedPointer::ExternalRefCountData::strongref' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qpalette.h(71): warning C26495: Variable 'QPalette::<anonymous-tag>::for_faster_swapping_dont_use' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qfontmetrics.h(149): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(822): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2309): warning C26495: Variable 'fmt::v5::system_error::error_code_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2964): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2965): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2966): warning C26495: Variable 'fmt::v5::format_int::str_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2967): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2968): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2969): warning C26495: Variable 'fmt::v5::format_int::buffer_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(246): warning C26495: Variable 'absl::AlphaNum::digits_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(247): warning C26495: Variable 'absl::AlphaNum::digits_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\strings\\str_cat.h(387): warning C6001: Using uninitialized memory 'result'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\oid.h(89): warning C26495: Variable 'mongo::OID::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\oid.h(241): warning C26495: Variable 'mongo::OID::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(442): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(454): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonelement.h(700): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonmisc.h(251): warning C26495: Variable 'mongo::BSONSizeTracker::_sizes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonobjbuilder.h(158): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\rpc\\op_msg.h(325): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\interruptible.h(139): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\interruptible.h(180): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\intrusive_counter.h(123): warning C26495: Variable 'mongo::RCString::_size' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\future_impl.h(716): warning C26495: Variable 'mongo::future_details::SharedStateHolder<void>::_inner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\db\\baton.h(118): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\db\\baton.h(123): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\platform\\process_id.h(68): warning C26495: Variable 'mongo::ProcessId::_npid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\concurrency\\spin_lock.h(51): warning C6031: Return value ignored: 'InitializeCriticalSectionAndSpinCount'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\db\\write_concern_options.h(60): warning C26495: Variable 'mongo::WriteConcernOptions::wTimeout' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\client\\dbclient_cursor.h(105): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongoshellresult.h(55): warning C26495: Variable 'Robomongo::MongoShellExecResult::_isCurrentServerValid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongoshellresult.h(70): warning C26495: Variable 'Robomongo::MongoShellExecResult::_isCurrentServerValid' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongocollectioninfo.h(10): warning C26495: Variable 'Robomongo::MongoCollectionInfo::_count' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(918): warning C26495: Variable 'Robomongo::ExecuteQueryResponse::resultIndex' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(989): warning C26495: Variable 'Robomongo::ExecuteScriptResponse::empty' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1087): warning C26495: Variable 'Robomongo::DocumentListLoadedEvent::_resultIndex' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1111): warning C26495: Variable 'Robomongo::ScriptExecutedEvent::_empty' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\events\\mongoevents.h(1195): warning C26495: Variable 'Robomongo::EstablishSshConnectionResponse::localport' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\base\\encoded_value_storage.h(47): warning C26495: Variable 'mongo::EncodedValueStorage<mongo::QueryResult::Layout,mongo::QueryResult::ConstView,mongo::QueryResult::View>::_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(205): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::future_details::FakeVoid>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\util\\decimal_counter.h(48): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(194): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::SourceLocationHolder>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(840): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\util\\builder.h(119): warning C26495: Variable 'mongo::StackAllocator::_buf' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(146): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::Timestamp>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(152): warning C26495: Variable 'boost::optional_detail::optional_base<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\detail\\optional_trivially_copyable_base.hpp(29): warning C26495: Variable 'boost::optional_detail::tc_optional_base<bool>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\detail\\optional_trivially_copyable_base.hpp(25): warning C26495: Variable 'boost::optional_detail::tc_optional_base<bool>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(162): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::UUID>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\optional\\optional.hpp(140): warning C26495: Variable 'boost::optional_detail::optional_base<mongo::UUID>::m_storage' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(904): warning C26495: Variable 'absl::container_internal::raw_hash_set<absl::container_internal::NodeHashSetPolicy<mongo::BSONObj>,mongo::HashImprover<mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::Hasher,mongo::BSONObj>,mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::EqualTo,std::allocator<mongo::BSONObj> >::ctrl_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(1563): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvariant.h(721): warning C26498: The function 'qMetaTypeId<QPair<QVariant,QVariant> >' is constexpr, mark variable 'vid' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qstringview.h(207): warning C26495: Variable 'QStringView::m_data' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\base\\data_range.h(117): warning C26495: Variable 'mongo::ConstDataRange::_debug_offset' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\bson\\bsonobj.h(136): warning C26495: Variable 'mongo::BSONObj::_objdata' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\base\\status_with.h(133): warning C26495: Variable 'mongo::StatusWith<char>::_status' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\base\\data_range.h(112): warning C26495: Variable 'mongo::ConstDataRange::_debug_offset' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(856): warning C26495: Variable 'absl::container_internal::raw_hash_set<absl::container_internal::NodeHashSetPolicy<mongo::BSONObj>,mongo::HashImprover<mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::Hasher,mongo::BSONObj>,mongo::BSONComparatorInterfaceBase<mongo::BSONObj>::EqualTo,std::allocator<mongo::BSONObj> >::ctrl_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2287): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\core.h(1277): warning C26495: Variable 'fmt::v5::basic_format_args<fmt::v5::basic_format_context<std::back_insert_iterator<fmt::v5::internal::basic_buffer<char> >,char> >::<anonymous-tag>::values_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1410): warning C6387: 'value' could be '0':  this does not adhere to the specification for the function 'std::char_traits<char>::length'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\core.h(345): warning C26495: Variable 'std::back_insert_iterator<fmt::v5::internal::basic_buffer<char> >::container' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1516): warning C26498: The function 'std::numeric_limits<int>::max' is constexpr, mark variable 'max_int' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2479): warning C26495: Variable 'fmt::v5::basic_writer<fmt::v5::back_insert_range<fmt::v5::internal::basic_buffer<char> > >::int_writer<unsigned __int64,fmt::v5::basic_format_specs<char> >::prefix' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(603): warning C26495: Variable 'fmt::v5::internal::counting_iterator<char>::blackhole_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\abseil-cpp-master\\abseil-cpp\\absl\\container\\internal\\raw_hash_set.h(1668): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2599): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(2599): warning C26451: Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '+' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1122): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\fmt\\dist\\include\\fmt\\format.h(1126): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(144): warning C26495: Variable 'QStyleOptionFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(172): warning C26495: Variable 'QStyleOptionTabWidgetFrame::lineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(196): warning C26495: Variable 'QStyleOptionTabBarBase::documentMode' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(227): warning C26495: Variable 'QStyleOptionHeader::selectedPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(286): warning C26495: Variable 'QStyleOptionTab::row' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(316): warning C26495: Variable 'QStyleOptionToolBar::positionOfLine' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(343): warning C26495: Variable 'QStyleOptionProgressBar::bottomToTop' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(373): warning C26495: Variable 'QStyleOptionMenuItem::menuItemType' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(392): warning C26495: Variable 'QStyleOptionDockWidget::movable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(443): warning C26495: Variable 'QStyleOptionViewItem::viewItemPosition' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(473): warning C26495: Variable 'QStyleOptionToolBox::position' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(492): warning C26495: Variable 'QStyleOptionRubberBand::opaque' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(534): warning C26495: Variable 'QStyleOptionSlider::tickInterval' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(553): warning C26495: Variable 'QStyleOptionSpinBox::frame' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(580): warning C26495: Variable 'QStyleOptionToolButton::arrowType' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(602): warning C26495: Variable 'QStyleOptionComboBox::editable' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(620): warning C26495: Variable 'QStyleOptionTitleBar::titleBarState' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(640): warning C26495: Variable 'QStyleOptionGroupBox::midLineWidth' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(654): warning C26495: Variable 'QStyleOptionSizeGrip::corner' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtwidgets\\qstyleoption.h(670): warning C26495: Variable 'QStyleOptionGraphicsItem::levelOfDetail' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qmetatype.h(2304): warning C26498: The function 'qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>' is constexpr, mark variable 'toId' constexpr if compile-time evaluation is desired (con.5). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(491): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(492): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(493): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(494): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(495): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(498): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\pcre-8.42\\pcrecpp.h(504): warning C26495: Variable 'pcrecpp::RE::re_partial_' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(25): warning C28251: Inconsistent annotation for 'GetSystemTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(103).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(29): warning C28251: Inconsistent annotation for 'GetSystemTimeAsFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(111).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(33): warning C28251: Inconsistent annotation for 'SystemTimeToFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\timezoneapi.h(93).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(38): warning C28251: Inconsistent annotation for 'FileTimeToSystemTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\timezoneapi.h(83).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(45): warning C28251: Inconsistent annotation for 'FileTimeToLocalFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\fileapi.h(171).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(50): warning C28251: Inconsistent annotation for 'LocalFileTimeToFileTime': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\fileapi.h(963).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\time.hpp(58): warning C28251: Inconsistent annotation for 'GetTickCount': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\sysinfoapi.h(168).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(133): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(695): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\utils\\bsonutils.cpp(613): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\date_time\\date_formatting.hpp(89): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\date_time\\date_formatting.hpp(91): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\converter_lexical_streams.hpp(162): warning C26495: Variable 'boost::detail::lexical_istream_limited_src<char,std::char_traits<char>,0,39>::buffer' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\lcast_unsigned_converters.hpp(191): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\lexical_cast\\detail\\lcast_unsigned_converters.hpp(262): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\quuid.h(68): warning C26495: Variable 'QUuid::data4' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\function\\function_base.hpp(611): warning C26495: Variable 'boost::function_base::functor' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\eventbus.cpp(115): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtgui\\qvector2d.h(60): warning C26495: Variable 'QVector2D::v' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongoutils.cpp(12): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongodatabase.h(131): warning C26495: Variable 'Robomongo::MongoDatabaseUsersLoadedEvent::_database' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongodatabase.h(151): warning C26495: Variable 'Robomongo::MongoDatabaseFunctionsLoadedEvent::_database' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongocollectioninfo.cpp(7): warning C26495: Variable 'Robomongo::MongoCollectionInfo::_count' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\mongoqueryinfo.cpp(31): warning C26495: Variable 'Robomongo::MongoQueryInfo::_batchSize' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(110): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(171): warning C6054: String 'sday' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(143): warning C6054: String 'smon' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(140): warning C6054: String 'gmt' might not be zero-terminated. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(223): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(269): warning C6328: Size mismatch: '__int64' passed as _Param_(7) when 'int' is required in call to 'sprintf'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\db\\ptimeutil.cpp(390): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\platform\\strtoll.h(35): warning C28251: Inconsistent annotation for 'strtoll': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\ucrt\\stdlib.h(539).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\mongo\\platform\\strtoll.h(39): warning C28251: Inconsistent annotation for 'strtoull': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\ucrt\\stdlib.h(569).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(249): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(669): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(771): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(792): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\shell\\bson\\json.cpp(1099): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\assertions.h(59): warning C28251: Inconsistent annotation for 'TerminateProcess': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\processthreadsapi.h(143).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(1348): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\callargs.h(306): warning C6001: Using uninitialized memory 'args'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(636): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6470): warning C26495: Variable 'JS::FirstSubsumedFrame::cx' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6470): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\jsapi.h(6478): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\get_last_error.hpp(20): warning C28251: Inconsistent annotation for 'GetLastError': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\errhandlingapi.h(89).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(25): warning C28251: Inconsistent annotation for 'FormatMessageA': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(2408).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(36): warning C28251: Inconsistent annotation for 'FormatMessageW': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(2423).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\error_handling.hpp(47): warning C28251: Inconsistent annotation for 'SetErrorMode': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\errhandlingapi.h(131).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\character_code_conversion.hpp(21): warning C28251: Inconsistent annotation for 'MultiByteToWideChar': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\stringapiset.h(126).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\character_code_conversion.hpp(30): warning C28251: Inconsistent annotation for 'WideCharToMultiByte': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\stringapiset.h(141).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(27): warning C28251: Inconsistent annotation for 'LocalAlloc': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1112).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(32): warning C28251: Inconsistent annotation for 'LocalReAlloc': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1122).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\winapi\\local_memory.hpp(37): warning C28251: Inconsistent annotation for 'LocalFree': this instance has no annotations. See c:\\program files (x86)\\windows kits\\10\\include\\10.0.18362.0\\um\\winbase.h(1200).  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(211): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(211): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\boost-1.70.0\\boost\\system\\detail\\system_category_win32.hpp(216): warning C26451: Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\engine\\scriptengine.cpp(230): warning C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\bufferlist.h(101): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(262): warning C26495: Variable 'JS::Heap<JSObject *>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(254): warning C26495: Variable 'JS::Heap<JSObject *>::ptr' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(969): warning C26495: Variable 'JS::Rooted<JSObject *>::stack' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\js\\rootingapi.h(962): warning C26495: Variable 'JS::Rooted<JSObject *>::stack' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\vector.h(877): warning C26439: This kind of function may not throw. Declare it 'noexcept' (f.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\variant.h(568): warning C26495: Variable 'mozilla::Variant<char const *,mozilla::UniquePtr<char [0],JS::FreePolicy> >::rawData' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo-shell\\src\\third_party\\mozjs-60\\include\\mozilla\\vector.h(408): warning C26495: Variable 'mozilla::Vector<mozilla::BufferList<js::SystemAllocPolicy>::Segment,1,js::SystemAllocPolicy>::CRAndStorage<1,0>::mBytes' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\mongodb\\mongoworker.cpp(55): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\mongodb\\mongoworker.cpp(56): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\mongodb\\mongoworker.cpp(1020): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonvalue.h(149): warning C26495: Variable 'QJsonValue::<anonymous-tag>::base' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonarray.h(62): warning C26495: Variable 'QJsonArray::d' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\settings\\settingsmanager.cpp(99): warning C26495: Variable 'Robomongo::SettingsManager::_autoExpand' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qvector.h(570): warning C6011: Dereferencing NULL pointer 'x'.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\aboutdialog.cpp(97): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\qt\\qt5.12.8\\5.12.8\\msvc2017_64\\include\\qtcore\\qjsonobject.h(64): warning C26495: Variable 'QJsonObject::d' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(39): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(44): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(126): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(127): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(128): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\euladialog.cpp(30): warning C26495: Variable 'Robomongo::EulaDialog::_reply' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionauthtab.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionauthtab.cpp(58): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionauthtab.cpp(72): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(37): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(63): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(94): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(122): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(29): warning C26495: Variable 'Robomongo::ConnectionBasicTab::_discoverButton' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(339): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionbasictab.cpp(339): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondiagnosticdialog.cpp(46): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondiagnosticdialog.cpp(57): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondialog.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondialog.cpp(35): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectiondialog.cpp(43): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\copycollectiondialog.cpp(51): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\copycollectiondialog.cpp(52): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\copycollectiondialog.cpp(85): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\third-party\\qscintilla-2.8.4\\sources\\qt4qt5\\qsci\\qsciscintilla.h(2078): warning C26495: Variable 'QsciScintilla::FindState::wrap' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(44): warning C26495: Variable 'Robomongo::CreateCollectionDialog::_cappedCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(66): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(68): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(74): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(83): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(87): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(300): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(328): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(363): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createcollectiondialog.cpp(394): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createdatabasedialog.cpp(41): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createdatabasedialog.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(53): warning C26495: Variable 'Robomongo::CreateUserDialog::_readOnlyCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(96): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(97): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(128): warning C26495: Variable 'Robomongo::CreateUserDialog::_userSourceComboBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(156): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\createuserdialog.cpp(157): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\preferencesdialog.cpp(87): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\preferencesdialog.cpp(88): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(43): warning C26495: Variable 'Robomongo::ConnectionListWidgetItem::_connection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(107): warning C26495: Variable 'Robomongo::ConnectionsDialog::_selectedConnection' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(196): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(164): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(163): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(156): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(155): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(126): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(123): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(120): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\connectionsdialog.cpp(117): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(78): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(76): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(128): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(141): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(184): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(191): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(192): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\exportdialog.cpp(222): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\changeshelltimeoutdialog.cpp(29): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\changeshelltimeoutdialog.cpp(30): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\editors\\plainjavascripteditor.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\editors\\findframe.cpp(61): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\editors\\findframe.cpp(62): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\editors\\findframe.cpp(60): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(33): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(75): warning C26495: Variable 'Robomongo::AddEditIndexDialog::_uniqueCheckBox' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(104): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(103): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\addeditindexdialog.cpp(188): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\scriptwidget.cpp(85): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\scriptwidget.cpp(312): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\scriptwidget.cpp(311): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\scriptwidget.cpp(310): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(53): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(62): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(65): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(59): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(56): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(45): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(48): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(50): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(70): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(73): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(76): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(78): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectiontreeitem.cpp(85): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexesdir.cpp(20): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexesdir.cpp(29): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexesdir.cpp(26): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexesdir.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexitem.cpp(25): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorercollectionindexitem.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasetfolderitem.cpp(39): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasetfolderitem.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(61): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(73): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(64): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(70): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(58): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerreplicasettreeitem.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(59): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(62): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(65): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(68): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(71): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(74): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasetreeitem.cpp(77): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(36): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(39): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(52): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(55): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(58): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(68): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(71): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerdatabasecategorytreeitem.cpp(74): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerusertreeitem.cpp(24): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerusertreeitem.cpp(27): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerfunctiontreeitem.cpp(25): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerfunctiontreeitem.cpp(28): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\documenttexteditor.cpp(79): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\documenttexteditor.cpp(65): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\documenttexteditor.cpp(78): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\documenttexteditor.cpp(57): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\functiontexteditor.cpp(54): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\functiontexteditor.cpp(53): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(60): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(63): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(57): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(54): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(51): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(48): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(45): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerservertreeitem.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerwidget.cpp(35): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerwidget.cpp(34): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\explorer\\explorerwidget.cpp(170): warning C28182: Dereferencing NULL pointer. 'item' contains the same NULL value as 'collectionItem' did.  [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontablemodel.cpp(12): warning C26495: Variable 'Robomongo::BsonTableModelProxy::_root' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontableview.cpp(29): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeitem.h(19): warning C26495: Variable 'Robomongo::BsonItemFields::_type' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeview.cpp(26): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeview.cpp(30): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\bsontreeview.cpp(34): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(140): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(137): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(134): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(131): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(128): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(125): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(122): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(119): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(116): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(113): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\domain\\notifier.cpp(320): warning C6001: Using uninitialized memory 'mainWindow'. [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(27): warning C26495: Variable 'Robomongo::OutputItemContentWidget::_collectionStats' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(57): warning C26495: Variable 'Robomongo::OutputItemContentWidget::_collectionStats' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(128): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(127): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(126): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(125): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(124): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(276): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemcontentwidget.cpp(277): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(89): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(100): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(102): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(103): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(104): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputitemheaderwidget.cpp(105): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(19): warning C26495: Variable 'Robomongo::OutputWidget::_prevResultsCount' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(42): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(84): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\outputwidget.cpp(85): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\pagingwidget.cpp(49): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\pagingwidget.cpp(50): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\pagingwidget.cpp(46): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\pagingwidget.cpp(47): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\querywidget.cpp(58): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\querywidget.cpp(69): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\querywidget.cpp(313): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(60): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(66): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(64): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(63): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(61): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(65): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(67): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(301): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\workareatabwidget.cpp(299): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(122): warning C26495: Variable 'Robomongo::WelcomeTab::_clearButton' is uninitialized. Always initialize a member variable (type.6). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(212): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(217): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(222): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\workarea\\welcometab.cpp(231): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\logwidget.cpp(18): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\widgets\\logwidget.cpp(23): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(553): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(530): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(491): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(656): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(653): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(563): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(665): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(165): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(485): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(610): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(169): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(590): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(539): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(503): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(497): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(509): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(160): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(174): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(182): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(185): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(200): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(208): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(212): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(215): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(230): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(242): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(251): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(260): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(269): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(277): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(286): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(291): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(337): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(342): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(356): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(361): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(366): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(371): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(386): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(391): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(396): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(411): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(420): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(426): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(432): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(438): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(445): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(452): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(456): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(460): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(479): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(676): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(848): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(1304): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(1311): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(1357): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\mainwindow.cpp(1358): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(74): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(146): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(143): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(44): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(62): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\sshtunneltab.cpp(56): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(56): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(117): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(102): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(111): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(106): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(94): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(93): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(76): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\gui\\dialogs\\ssltab.cpp(75): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\mongodb\\sshtunnelworker.cpp(25): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n  e:\\robo\\src\\robomongo\\core\\mongodb\\sshtunnelworker.cpp(26): warning C26444: Avoid unnamed objects with custom construction and destruction (es.84). [E:\\robo\\build\\Release\\src\\robomongo\\robomongo.vcxproj]\n\n\n\"E:\\robo\\build\\Release\\ALL_BUILD.vcxproj\" (default target) (1) ->\n\"E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj\" (default target) (14) ->\n  e:\\robo\\src\\robomongo\\ssh\\test.c(134): warning C6011: Dereferencing NULL pointer 'elem2'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\test.c(137): warning C6011: Dereferencing NULL pointer 'elem5'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\test.c(133): warning C6011: Dereferencing NULL pointer 'elem1'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\test.c(135): warning C6011: Dereferencing NULL pointer 'elem3'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n  e:\\robo\\src\\robomongo\\ssh\\test.c(136): warning C6011: Dereferencing NULL pointer 'elem4'.  [E:\\robo\\build\\Release\\src\\robomongo\\ssh\\ssh_test.vcxproj]\n\n    850 Warning(s)\n    0 Error(s)\n\nTime Elapsed 00:13:32.44\n"
  }
]